[
  {
    "path": ".github/ISSUE_TEMPLATE/bibliography-addition---.md",
    "content": "---\nname: \"Bibliography Addition \\U0001F5C3\"\nabout: Add a paper, abstract, or other reference that used ASP!\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**DOI**\nIf the work has a DOI, that's really all we need.  Please enter it.\n\n**Citation**\nOtherwise, please provide as complete a citation as possible.\n\nIf you have a citation in BibTeX format, please paste that in (but it isn't required).\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug-report---.md",
    "content": "---\nname: \"Bug Report \\U0001F41B\"\nabout: Create a report to help us improve\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Describe the bug**\nA clear and concise description of what the bug is.\n\n**To Reproduce**\nSteps to reproduce the behavior:\n1. Go to '...'\n2. Click on '....'\n3. Scroll down to '....'\n4. See error\n\n**Expected behavior**\nA clear and concise description of what you expected to happen.\n\n**Error Logs, Terminal Captures, Screenshots**\nIf applicable, please give us as much information as you can to help explain your problem.\n\n**Your Environment (please complete the following information):**\n - OS: [e.g. macOS, Linux, and their version number]\n - ASP Version: [e.g. 2.6.2, can find via `stereo --version`]\n- Any other environment information that might be helpful?\n\n\n**Additional context**\nAdd any other context about the problem here.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature-request---.md",
    "content": "---\nname: \"Feature Request \\U0001F680\"\nabout: Suggest an idea for this project\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Is your feature request related to a problem? Please describe.**\nA clear and concise description of what the problem is. Ex. I'm always frustrated when [...]\n\n**Describe the solution you'd like**\nA clear and concise description of what you want to happen.\n\n**Describe alternatives you've considered**\nA clear and concise description of any alternative solutions or features you've considered.\n\n**Additional context**\nAdd any other context or screenshots about the feature request here.\n"
  },
  {
    "path": ".github/pull_request_template.md",
    "content": "<!--- Provide a general summary of your changes in the Title above -->\n\n## Description\n<!--- Describe your changes in detail -->\n\n## Related Issue\n<!--- If suggesting a new feature or change, please discuss it in an issue first -->\n<!--- If fixing a bug, there should be an issue describing it with steps to reproduce -->\n<!--- Please link to the issue here: -->\n\n## Motivation and Context\n<!--- Why is this change required? What problem does it solve? -->\n<!--- If it fixes an open issue, please link to the issue here. -->\n\n## How Has This Been Tested?\n<!--- Please describe in detail how you tested your changes. -->\n<!--- Include details of your testing environment, and the tests you ran to -->\n<!--- see how your change affects other areas of the code, etc. -->\n<!--- If any of the tests below were *not* run, please delete the line -->\n\n## Types of changes\n<!--- What types of changes does your code introduce? Remove lines that do not apply: -->\n- Bug fix (non-breaking change which fixes an issue)\n- New feature (non-breaking change which adds functionality)\n- Breaking change (fix or feature that would cause existing functionality to change)\n\n## Checklist:\n<!--- Go over all the following points, and remove lines that do not apply. -->\n<!--- If you're unsure about any of these, don't hesitate to ask. We're here to help! -->\n- My change requires a change to the documentation.\n- I have updated the documentation accordingly.\n- I have added tests to cover my changes.\n- All new and existing tests passed.\n\n## Licensing:\n\nThis project is released under the [LICENSE](https://github.com/NeoGeographyToolkit/StereoPipeline/blob/master/LICENSE).\n\n<!-- Remove the statement that does not apply. -->\n- I claim copyrights on my contributions in this pull request, and I provide those contributions via this pull request under the same license terms that the pvl project uses.\n- I dedicate any and all copyright interest in my contributions in this pull request to the public domain.  I make this dedication for the benefit of the public at large and to the detriment of my heirs and successors. I intend this dedication to be an overt act of relinquishment in perpetuity of all present and future rights to this contribution under copyright law.\n\n<!-- No matter how you contributed, please make sure you add your name to the\n[AUTHORS](https://github.com/NeoGeographyToolkit/StereoPipeline/blob/master/AUTHORS.rst) file, if you haven't already. -->\n\n<!-- Thanks for contributing to the StereoPipeline! -->\n"
  },
  {
    "path": ".github/workflows/build_helper.sh",
    "content": "#!/bin/bash\n\n# This is a debugging script that builds ASP and its dependencies. It also shows\n# how the result of building can be uploaded as an artifact, and later moved to\n# a permanent location. Some parts are more focused towards the Mac build in the \n# cloud, while others apply to the local Linux build as well.\n\n# This script is not meant to be run directly. Each block of code must be\n# inspected, edited, and run separately. This is a scratchpad. The production\n# logic is in build_test.sh, save_mac_deps.sh, and the\n# https://github.com/NeoGeographyToolkit/stereopipeline-feedstock repo.\n \n# This helps do a dress rehearsal for the build process, before using\n# conda-build which is very slow and error-prone.\n\n# After the dependencies are updated with this script, they can be saved for the\n# future with the script save_mac_deps.sh. See that script for more info.\n\n# Move from the source dir to the home dir\ncd\n\n# Set up the compiler. Using a known compiler that is in the environment ensures\n# there are no surprises when later conda-build is employed with the same\n# compiler.\nif [ \"$(uname)\" = \"Darwin\" ]; then\n    cc_comp=clang\n    cxx_comp=clang++\nelse\n    cc_comp=x86_64-conda-linux-gnu-gcc\n    cxx_comp=x86_64-conda-linux-gnu-g++\nfi\n\n# Fetch the ASP dependencies. Must keep $tag in sync with build_test.sh. See\n# save_mac_deps.sh for how to save and update a tarball with the dependencies.\n# New dependencies can be created from scratch with the environment in\n# stereopipeline-feedstock.\ntag=asp_deps_mac_x64_v3 # Mac Intel. Sync up tag with build_test.sh.\n# tag=asp_deps_mac_arm64_v3 # Mac Arm. Sync up tag with build_test.sh.\n# tag=asp_deps_linux_v2 # Linux.\n\ncd $HOME\nwget https://github.com/NeoGeographyToolkit/BinaryBuilder/releases/download/${tag}/asp_deps.tar.gz > /dev/null 2>&1 # this is verbose\n/usr/bin/time tar xzf asp_deps.tar.gz > /dev/null 2>&1 # this is verbose\n\n# Set up conda\nconda init bash\nsource ~/.bash_profile\nconda activate asp_deps\n\n# Install anaconda client. Will save the anaconda_env client on exit.\nconda create -n anaconda -c conda-forge -c defaults -y anaconda-client\n# Activate anaconda env\nsource ~/.bash_profile \nconda activate anaconda \n\n# Install conda-build in a separate environment. Do not save it on exit as it\n# can have huge partial builds.\nconda create -n build -c conda-forge -c defaults -y conda-build\nsource  ~/.bash_profile\nconda activate build\n\n# Build ale. It is assumed the compiler is set up as above. May need to save the\n# current ~/.ssh/id_rsa.pub key to Github in the user settings for recursive\n# cloning of the submodules to work.\ncd\ngit clone https://github.com/DOI-USGS/ale.git --recursive\ncd ale\ngit submodule update --recursive # if refreshing the repo later\n#git rebase origin/main\n#git reset --hard 0ba7b24\nexport PREFIX=$HOME/miniconda3/envs/asp_deps\nexport PATH=$PREFIX/bin:$PATH\nmkdir -p build && cd build\ncmake ..                                         \\\n  -DCMAKE_C_COMPILER=${PREFIX}/bin/$cc_comp      \\\n  -DCMAKE_CXX_COMPILER=${PREFIX}/bin/$cxx_comp   \\\n  -DALE_USE_EXTERNAL_EIGEN=ON                    \\\n  -DCMAKE_OSX_DEPLOYMENT_TARGET=10.13            \\\n  -DALE_USE_EXTERNAL_JSON=ON                     \\\n  -DALE_BUILD_DOCS=OFF                           \\\n  -DALE_BUILD_TESTS=OFF                          \\\n  -DCMAKE_VERBOSE_MAKEFILE=TRUE                  \\\n  -DCMAKE_INSTALL_PREFIX=${PREFIX}\nmake -j${CPU_COUNT} install\n\n# Build usgscsm. It is assumed the compiler is set up as above.\ncd \ngit clone https://github.com/DOI-USGS/usgscsm.git --recursive\ncd usgscsm\ngit submodule update --recursive # if refreshing the repo later\n#git rebase origin/main\nmkdir -p build && cd build\nexport PREFIX=$HOME/miniconda3/envs/asp_deps\nexport PATH=$PREFIX/bin:$PATH\n  # -DCMAKE_C_COMPILER=${PREFIX}/bin/$cc_comp      \\\n  # -DCMAKE_CXX_COMPILER=${PREFIX}/bin/$cxx_comp   \\\ncmake ..                                         \\\n  -DCMAKE_OSX_DEPLOYMENT_TARGET=10.13            \\\n  -DUSGSCSM_EXTERNAL_DEPS=ON                     \\\n  -DUSGSCSM_BUILD_DOCS=OFF                       \\\n  -DUSGSCSM_BUILD_TESTS=OFF                      \\\n  -DCMAKE_VERBOSE_MAKEFILE=TRUE                  \\\n  -DCMAKE_INSTALL_PREFIX=${PREFIX}\nmake -j${CPU_COUNT} install\n\n# Build ISIS3\ncd\nconda install -c conda-forge cmake doxygen \\\n  c-compiler=1.7.0 cxx-compiler=1.7.0 \\\n  fortran-compiler=1.7.0\ngit clone https://github.com/DOI-USGS/ISIS3.git \ncd ISIS3\nmkdir -p build\ncd build\nexport ISISROOT=$PWD\n#export PREFIX=$HOME/miniconda3/envs/asp_deps\nexport PREFIX=$CONDA_PREFIX\nexport PATH=$PREFIX/bin:$PATH\nexport ISISTESTDATA=$HOME/isis_test_data\nconda env config vars set ISISTESTDATA=$ISISTESTDATA\next=.so\nif [ \"$(uname)\" = \"Darwin\" ]; then\n    ext=.dylib\nfi\ncmake                                             \\\n -GNinja                                          \\\n -DJP2KFLAG=OFF                                   \\\n -Dpybindings=OFF                                 \\\n -DbuildTests=ON                                  \\\n -DCMAKE_BUILD_TYPE=Release                       \\\n -DBULLET_DEFINITIONS=\"-DBT_USE_DOUBLE_PRECISION\" \\\n -DOPENCV_INCLUDE_DIR=$PREFIX/include/opencv4     \\\n -DPCL_INCLUDE_DIR=${PREFIX}/include/pcl-1.15     \\\n -DCMAKE_INSTALL_PREFIX=$PREFIX                   \\\n ../isis\n#export NINJAJOBS=4; /usr/bin/time ninja install -j $NINJAJOBS # osx\n/usr/bin/time ninja install\n\n# Create a tarball with the updated packages. It will be uploaded as an\n# artifact. The destination directory is set in the .yml file.\n#\n# See build_test.sh for how to use this artifact to save the updated packages to\n# a permanent location.\nmkdir -p ~/work/StereoPipeline/packages\n/usr/bin/time tar cfz ~/work/StereoPipeline/packages/asp_deps.tar.gz \\\n    /Users/runner/miniconda3/envs\n# See the top of the document for how to save / fetch a tarball with dependencies.\n\n# Done for now. Other packages have been built before.  \nexit 0\n\n# Must create an ssh key to be able to clone the repos\n# ssh-keygen -t rsa\n# Add the key /Users/runner/.ssh/id_rsa.pub to github in Settings -> SSH and GPG keys\n\n# Turn on the steps below only if starting from scratch\nif [ 1 -eq 0 ]; then \n  echo Wiping old env\n  /bin/rm -rf /Users/runner/miniconda3/envs/asp_deps\n\n  # Fetch the isis env from the \n  /bin/rm -f environment.yml\n  wget https://raw.githubusercontent.com/DOI-USGS/ISIS3/refs/heads/dev/environment.yml\n  # Create the asp_deps env\n  echo Creating a new asp_deps env\n  conda env create -n asp_deps -f environment.yml\n  conda activate asp_deps\nfi\n\n# Install some needed tools\ncd\nconda install -c conda-forge -y parallel pbzip2\n\n# Build the needed packages\n\n# geoid\ncd\nwget https://github.com/NeoGeographyToolkit/StereoPipeline/releases/download/geoid1.0/geoids.tgz\ntar xzf geoids.tgz\ncd geoids\nif [ \"$(uname)\" = \"Darwin\" ]; then\n    LIB_FLAG='-dynamiclib'\n    EXT='.dylib'\nelse\n    LIB_FLAG='-shared'\n    EXT='.so'\nfi\n# Build\n${FC} ${FFLAGS} -fPIC -O3 -c interp_2p5min.f\n${FC} ${LDFLAGS} ${LIB_FLAG} -o libegm2008${EXT} interp_2p5min.o\n# Install\nmkdir -p ${PREFIX}/lib\ncp -fv libegm2008.* ${PREFIX}/lib\nGEOID_DIR=${PREFIX}/share/geoids\nmkdir -p ${GEOID_DIR}\ncp -fv *tif *jp2 ${GEOID_DIR}\n\n# libnabo\ncd\nexport PREFIX=/Users/runner/miniconda3/envs/asp_deps\ngit clone https://github.com/NeoGeographyToolkit/libnabo.git\ncd libnabo\nmkdir -p build && cd build\ncmake                                          \\\n  -DCMAKE_BUILD_TYPE=Release                   \\\n  -DCMAKE_CXX_FLAGS='-O3 -std=c++11'           \\\n  -DCMAKE_C_FLAGS='-O3'                        \\\n  -DCMAKE_INSTALL_PREFIX=${PREFIX}             \\\n  -DEIGEN_INCLUDE_DIR=${PREFIX}/include/eigen3 \\\n  -DCMAKE_PREFIX_PATH=${PREFIX}                \\\n  -DBoost_DIR=${PREFIX}/lib                    \\\n  -DBoost_INCLUDE_DIR=${PREFIX}/include        \\\n  -DBUILD_SHARED_LIBS=ON                       \\\n  -DCMAKE_VERBOSE_MAKEFILE=ON                  \\\n  ..\nmake -j${CPU_COUNT} install\n\n# libpointmatcher\ncd \nexport PREFIX=$HOME/miniconda3/envs/asp_deps\ngit clone https://github.com/NeoGeographyToolkit/libpointmatcher.git\ncd libpointmatcher\nmkdir -p build && cd build\ncmake                                          \\\n  -DCMAKE_BUILD_TYPE=Release                   \\\n  -DCMAKE_CXX_FLAGS=\"-O3 -std=c++17\"           \\\n  -DCMAKE_C_FLAGS='-O3'                        \\\n  -DCMAKE_INSTALL_PREFIX=${PREFIX}             \\\n  -DCMAKE_VERBOSE_MAKEFILE=ON                  \\\n  -DCMAKE_PREFIX_PATH=${PREFIX}                \\\n  -DCMAKE_VERBOSE_MAKEFILE=ON                  \\\n  -DBUILD_SHARED_LIBS=ON                       \\\n  -DEIGEN_INCLUDE_DIR=${PREFIX}/include/eigen3 \\\n  -DBoost_DIR=${PREFIX}/lib                    \\\n  -DBoost_INCLUDE_DIR=${PREFIX}/include        \\\n  -DBoost_NO_BOOST_CMAKE=OFF                   \\\n  -DBoost_DEBUG=ON                             \\\n  -DBoost_DETAILED_FAILURE_MSG=ON              \\\n  -DBoost_NO_SYSTEM_PATHS=ON                   \\\n  ..\nmake -j${CPU_COUNT} install\n\n# fgr\ncd $SRC_DIR\ngit clone https://github.com/NeoGeographyToolkit/FastGlobalRegistration.git\ncd FastGlobalRegistration\nFGR_SOURCE_DIR=$(pwd)/source\nmkdir -p build && cd build\nINC_FLAGS=\"-I${PREFIX}/include/eigen3 -I${PREFIX}/include -O3 -L${PREFIX}/lib -lflann_cpp -llz4 -O3 -std=c++11\"\ncmake                                        \\\n  -DCMAKE_BUILD_TYPE=Release                 \\\n  -DCMAKE_CXX_FLAGS=\"${INC_FLAGS}\"           \\\n  -DCMAKE_INSTALL_PREFIX=${PREFIX}           \\\n  -DCMAKE_PREFIX_PATH=${PREFIX}              \\\n  -DCMAKE_VERBOSE_MAKEFILE=ON                \\\n  -DFastGlobalRegistration_LINK_MODE=SHARED  \\\n  ${FGR_SOURCE_DIR}\nmake -j${CPU_COUNT}\n# Install\nFGR_INC_DIR=${PREFIX}/include/FastGlobalRegistration\nmkdir -p ${FGR_INC_DIR}\n/bin/cp -fv ${FGR_SOURCE_DIR}/FastGlobalRegistration/app.h ${FGR_INC_DIR}\nFGR_LIB_DIR=${PREFIX}/lib\nmkdir -p ${FGR_LIB_DIR}\n/bin/cp -fv FastGlobalRegistration/libFastGlobalRegistrationLib* ${FGR_LIB_DIR}\n\n#s2p\ncd\nexport PREFIX=/Users/runner/miniconda3/envs/asp_deps\nconda activate asp_deps\nconda install -c conda-forge -y fftw=3.3.10   \ngit clone https://github.com/NeoGeographyToolkit/s2p.git --recursive\ncd s2p\n# update recursive submodules\ngit submodule update --init --recursive\nexport CFLAGS=\"-I$PREFIX/include -O3 -DNDEBUG -march=native\"\nexport LDFLAGS=\"-L$PREFIX/lib\"\n# Fix for missing liblzma\n#perl -pi -e \"s#(/[^\\s]*?lib)/lib([^\\s]+).la#-L\\$1 -l\\$2#g\" ${PREFIX}/lib/*.la\nbaseDir=$(pwd)\n# Extension\nif [ \"$(uname)\" = \"Darwin\" ]; then\n    EXT='.dylib'\nelse\n    EXT='.so'\nfi\n# Build the desired programs\ncd 3rdparty/mgm\nperl -pi -e \"s#CFLAGS=#CFLAGS=$CFLAGS #g\" Makefile\nperl -pi -e \"s#LDFLAGS=#LDFLAGS=$LDFLAGS #g\" Makefile \nmake -j${CPU_COUNT}\ncd $baseDir\n# msmw\ncd 3rdparty/msmw\nmkdir -p build\ncd build\ncmake .. \\\n  -DCMAKE_C_FLAGS=\"$CFLAGS\" -DCMAKE_CXX_FLAGS=\"$CFLAGS\"  \\\n  -DPNG_LIBRARY_RELEASE=\"${PREFIX}/lib/libpng${EXT}\"     \\\n  -DTIFF_LIBRARY_RELEASE=\"${PREFIX}/lib/libtiff${EXT}\"   \\\n  -DZLIB_LIBRARY_RELEASE=\"${PREFIX}/lib/libz${EXT}\"      \\\n  -DJPEG_LIBRARY=\"${PREFIX}/lib/libjpeg${EXT}\"\nmake -j${CPU_COUNT}\ncd $baseDir\n# msmw2\ncd 3rdparty/msmw2\nmkdir -p build\ncd build\ncmake ..                                                   \\\n    -DCMAKE_C_FLAGS=\"$CFLAGS\" -DCMAKE_CXX_FLAGS=\"$CFLAGS\"  \\\n    -DPNG_LIBRARY_RELEASE=\"${PREFIX}/lib/libpng${EXT}\"     \\\n    -DTIFF_LIBRARY_RELEASE=\"${PREFIX}/lib/libtiff${EXT}\"   \\\n    -DZLIB_LIBRARY_RELEASE=\"${PREFIX}/lib/libz${EXT}\"      \\\n    -DJPEG_LIBRARY=\"${PREFIX}/lib/libjpeg${EXT}\"\nmake -j${CPU_COUNT}\ncd $baseDir\n# Install the desired programs\nBIN_DIR=${PREFIX}/plugins/stereo/mgm/bin\nmkdir -p ${BIN_DIR}\n/bin/cp -fv 3rdparty/mgm/mgm ${BIN_DIR}\nBIN_DIR=${PREFIX}/plugins/stereo/msmw/bin\nmkdir -p ${BIN_DIR}\n/bin/cp -fv \\\n    3rdparty/msmw/build/libstereo/iip_stereo_correlation_multi_win2 \\\n    ${BIN_DIR}/msmw\nBIN_DIR=${PREFIX}/plugins/stereo/msmw2/bin\nmkdir -p ${BIN_DIR}\n/bin/cp -fv \\\n    3rdparty/msmw2/build/libstereo_newversion/iip_stereo_correlation_multi_win2_newversion \\\n    ${BIN_DIR}/msmw2\n\n# libelas (does not work on Mac Arm)\ncd \nenv=isis_dev # can also be asp_deps\nexport PREFIX=$(ls -d ~/*conda3/envs/$env)\nexport PATH=$PREFIX/bin:$PATH\nconda activate $env\ngit clone https://github.com/NeoGeographyToolkit/libelas.git\ncd libelas\n# Set the env\nexport CFLAGS=\"-I$PREFIX/include -O3 -DNDEBUG -ffast-math -march=native\"\nexport LDFLAGS=\"-L$PREFIX/lib\"\nif [ \"$(uname)\" = \"Darwin\" ]; then\n    EXT='.dylib'\nelse\n    EXT='.so'\nfi\n# build\nmkdir -p build\ncd build\ncmake ..                                               \\\n  -DTIFF_LIBRARY_RELEASE=\"${PREFIX}/lib/libtiff${EXT}\" \\\n  -DTIFF_INCLUDE_DIR=\"${PREFIX}/include\"               \\\n  -DCMAKE_CXX_FLAGS=\"-I${PREFIX}/include\"\nmake -j${CPU_COUNT}\n# Copy the 'elas' tool to the plugins subdir meant for it\nBIN_DIR=${PREFIX}/plugins/stereo/elas/bin\nmkdir -p ${BIN_DIR}\n/bin/cp -fv elas ${BIN_DIR}/elas\n\n# Multiview\ncd\nconda activate asp_deps\nexport PREFIX=$HOME/miniconda3/envs/asp_deps\nconda install -c conda-forge \\\n  rocksdb rapidjson\ngit clone https://github.com/NeoGeographyToolkit/MultiView.git --recursive\ncd MultiView\n# Must have ssh authentication set up for github\ngit submodule update --init --recursive\nmkdir -p build && cd build\ncmake ..                                          \\\n    -DCMAKE_BUILD_TYPE=Release                    \\\n    -DCMAKE_C_COMPILER=${PREFIX}/bin/$cc_comp     \\\n    -DCMAKE_CXX_COMPILER=${PREFIX}/bin/$cxx_comp  \\\n    -DMULTIVIEW_DEPS_DIR=${PREFIX}                \\\n    -DCMAKE_OSX_DEPLOYMENT_TARGET=10.13           \\\n    -DCMAKE_VERBOSE_MAKEFILE=ON                   \\\n    -DCMAKE_MODULE_PATH=$PREFIX/share/pcl-1.13/Modules \\\n    -DCMAKE_CXX_FLAGS=\"-O3 -std=c++11 -Wno-error -I${PREFIX}/include\" \\\n    -DCMAKE_C_FLAGS='-O3 -Wno-error'              \\\n    -DCMAKE_INSTALL_PREFIX=${PREFIX}\nmake -j${CPU_COUNT} install\n\n# PDAL\ngit clone https://github.com/PDAL/PDAL.git\ncd PDAL\ngit checkout 2.9.3\nmkdir -p build\ncd build\nexport PREFIX=$HOME/miniconda3/envs/asp_deps\nldflags=\"-Wl,-rpath,${PREFIX}/lib -L${PREFIX}/lib -lgeotiff -lcurl -lssl -lxml2 -lcrypto -lzstd -lz\"\nif [ \"$(uname)\" = \"Darwin\" ]; then\n    EXT='.dylib'\nelse\n    EXT='.so'\n    # add unwind to ldflags on Linux\n    ldflags=\"$ldflags -lunwind\"\nfi\n# Compilers should be auto-detected if the env is activated\n# and has both them and cmake installed.\ncmake ${CMAKE_ARGS}                                      \\\n  -DBUILD_SHARED_LIBS=ON                                 \\\n  -DCMAKE_BUILD_TYPE=Release                             \\\n  -DCMAKE_INSTALL_PREFIX=$PREFIX                         \\\n  -DCMAKE_PREFIX_PATH=$PREFIX                            \\\n  -DBUILD_PLUGIN_I3S=OFF                                 \\\n  -DBUILD_PLUGIN_TRAJECTORY=OFF                          \\\n  -DBUILD_PLUGIN_E57=OFF                                 \\\n  -DBUILD_PLUGIN_PGPOINTCLOUD=OFF                        \\\n  -DBUILD_PLUGIN_ICEBRIDGE=OFF                           \\\n  -DBUILD_PLUGIN_NITF=OFF                                \\\n  -DBUILD_PLUGIN_TILEDB=OFF                              \\\n  -DBUILD_PLUGIN_HDF=OFF                                 \\\n  -DBUILD_PLUGIN_DRACO=OFF                               \\\n  -DENABLE_CTEST=OFF                                     \\\n  -DWITH_TESTS=OFF                                       \\\n  -DWITH_ZLIB=ON                                         \\\n  -DWITH_ZSTD=ON                                         \\\n  -DWITH_LASZIP=ON                                       \\\n  -DWITH_LAZPERF=ON                                      \\\n  -DCMAKE_VERBOSE_MAKEFILE=ON                            \\\n  -DCMAKE_CXX17_STANDARD_COMPILE_OPTION=\"-std=c++17\"     \\\n  -DCMAKE_VERBOSE_MAKEFILE=ON                            \\\n  -DWITH_TESTS=OFF                                       \\\n  -DCMAKE_EXE_LINKER_FLAGS=\"$ldflags\"                    \\\n  -DDIMBUILDER_EXECUTABLE=dimbuilder                     \\\n  -DBUILD_PLUGIN_DRACO:BOOL=OFF                          \\\n  -DOPENSSL_ROOT_DIR=${PREFIX}                           \\\n  -DLIBXML2_INCLUDE_DIR=${PREFIX}/include/libxml2        \\\n  -DLIBXML2_LIBRARIES=${PREFIX}/lib/libxml2${EXT}        \\\n  -DLIBXML2_XMLLINT_EXECUTABLE=${PREFIX}/bin/xmllint     \\\n  -DGDAL_LIBRARY=${PREFIX}/lib/libgdal${EXT}             \\\n  -DGDAL_CONFIG=${PREFIX}/bin/gdal-config                \\\n  -DZLIB_INCLUDE_DIR=${PREFIX}/include                   \\\n  -DZLIB_LIBRARY:FILEPATH=${PREFIX}/lib/libz${EXT}       \\\n  -DCURL_INCLUDE_DIR=${PREFIX}/include                   \\\n  -DPostgreSQL_LIBRARY_RELEASE=${PREFIX}/lib/libpq${EXT} \\\n  -DCURL_LIBRARY_RELEASE=${PREFIX}/lib/libcurl${EXT}     \\\n  -DPROJ_INCLUDE_DIR=${PREFIX}/include                   \\\n  -DPROJ_LIBRARY:FILEPATH=${PREFIX}/lib/libproj${EXT}    \\\n  ..\nmake -j${CPU_COUNT} install\n\n# OpenEXR\n# This will be removed from ASP\n# Build from source, to ensure the proper version of ilmbase is used\nwget https://github.com/AcademySoftwareFoundation/openexr/archive/v2.5.5.tar.gz\ntar xzfv v2.5.5.tar.gz\ncd openexr-2.5.5\nmkdir -p build && cd build\nconda activate isis_dev\nexport PREFIX=$(ls -d ~/*conda3/envs/{asp_deps,isis_dev})\nif [ ! -d \"$PREFIX\" ]; then\n  echo \"Error: $PREFIX does not exist. Exiting.\"\n  #exit 1\nfi\n$PREFIX/bin/cmake ..                            \\\n  -DCMAKE_BUILD_TYPE=Release                    \\\n  -DCMAKE_C_COMPILER=${PREFIX}/bin/$cc_comp     \\\n  -DCMAKE_CXX_COMPILER=${PREFIX}/bin/$cxx_comp  \\\n  -DCMAKE_PREFIX_PATH=$PREFIX                   \\\n  -DCMAKE_VERBOSE_MAKEFILE=ON                   \\\n  -DCMAKE_CXX_FLAGS='-O3 -std=c++11 -w'         \\\n  -DCMAKE_C_FLAGS='-O3 -w'                      \\\n  -DCMAKE_INSTALL_PREFIX=${PREFIX}              \\\n  -DCMAKE_OSX_DEPLOYMENT_TARGET=10.13\nmake -j${CPU_COUNT} install\n\n# Build theia\ncd ~/work/StereoPipeline\nconda install -c conda-forge vlfeat\nconda install -c conda-forge rapidjson=1.1.0\nconda install -c conda-forge rocksdb=8.5.3 gflags glog ceres-solver mesalib\n# On linux, install mesa-libgl-cos6-x86_64\n\ngit clone\tgit@github.com:NeoGeographyToolkit/TheiaSfM.git\ncd TheiaSfM\nmkdir -p build && cd build\nexport PREFIX=$HOME/miniconda3/envs/asp_deps\nif [ ! -d \"$PREFIX\" ]; then\n  echo \"Error: $PREFIX does not exist. Exiting.\"\n  #exit 1\nfi\n$PREFIX/bin/cmake ..                                   \\\n    -DCMAKE_BUILD_TYPE=Release                         \\\n    -DMULTIVIEW_DEPS_DIR=${PREFIX}                     \\\n    -DCMAKE_VERBOSE_MAKEFILE=ON                        \\\n    -DCMAKE_CXX_FLAGS='-O3 -std=c++11 -Wno-error'      \\\n    -DCMAKE_C_FLAGS='-O3 -Wno-error'                   \\\n    -DCMAKE_MODULE_PATH=$PREFIX/share/pcl-1.13/Modules \\\n    -DCMAKE_INSTALL_PREFIX=${PREFIX}\n\n# Build Multiview\n# Dependencies. Use precisely same compiler that will be used in the conda recipe\ngit submodule update --init --recursive\nconda install -c conda-forge vlfeat \\\n  gflags=2.2.2 glog=0.7.1 \\\n  ceres-solver=2.2.0 \\\n  vlfeat \\\n 'clang >=16,<17' 'clangxx >=16,<17'\nconda install -c conda-forge \\\n   rapidjson=1.1.0 \\\n   rocksdb=8.5.3 \ngit clone\tgit@github.com:NeoGeographyToolkit/MultiView.git\nmkdir -p build && cd build\n# For OSX use a custom location for TBB. This is a fix for a conflict with embree.\n# When that package gets updated to version 3 or 4 this may become unnecessary.\nopt=\"\"\nif [[ $target_platform =~ osx.* ]]; then\n\topt=\"-DTBB_LIBRARY=${PREFIX}/lib/libtbb.12.dylib -DTBB_MALLOC_LIBRARY=${PREFIX}/lib/libtbbmalloc.2.dylib\"\nfi\n# Set up the cc_comp compiler as above\n# Enforce a compiler we know to work\ncmake ..                                               \\\n    -DCMAKE_BUILD_TYPE=Release                         \\\n    -DCMAKE_C_COMPILER=${PREFIX}/bin/$cc_comp          \\\n    -DCMAKE_CXX_COMPILER=${PREFIX}/bin/$cxx_comp       \\\n    -DMULTIVIEW_DEPS_DIR=${PREFIX}                     \\\n    -DCMAKE_VERBOSE_MAKEFILE=ON                        \\\n    -DCMAKE_CXX_FLAGS='-O3 -std=c++11'                 \\\n    -DCMAKE_C_FLAGS='-O3'                              \\\n    -DCMAKE_MODULE_PATH=$PREFIX/share/pcl-1.13/Modules \\\n    -DCMAKE_INSTALL_PREFIX=${PREFIX}                   \\\n\t$opt\n# Build\nmake -j${CPU_COUNT} install\n\n# Make the python env\necho Creating a new python_isis8 env\n/bin/rm -rf /usr/local/miniconda/envs/python_isis8\nconda create -n python_isis8 python=3.12.0 numpy=1.26.2 -y\n\n# Build visionworkbench\ncd \nconda activate asp_deps\n# Set up the cc_comp compiler as above\n# conda install -c conda-forge openblas\ncd ~/work/StereoPipeline\nexport PREFIX=/Users/runner/miniconda3/envs/asp_deps\ngit clone https://github.com/visionworkbench/visionworkbench.git\ncd visionworkbench\nmkdir -p build\ncd build\ncmake ..                                     \\\n  -DASP_DEPS_DIR=$PREFIX                     \\\n  -DCMAKE_VERBOSE_MAKEFILE=ON                \\\n  -DCMAKE_INSTALL_PREFIX=$PREFIX             \\\n  -DCMAKE_C_COMPILER=${PREFIX}/bin/$cc_comp  \\\n  -DCMAKE_CXX_COMPILER=${PREFIX}/bin/$cxx_comp\necho Building VisionWorkbench\nmake -j${CPU_COUNT} install\n\n# Build StereoPipeline\ncd\nconda activate asp_deps\n# Set up the cc_comp compiler as above\nexport PREFIX=$HOME/miniconda3/envs/asp_deps\ncd ~/work\nmkdir copy_for_build\ncd copy_for_build\ngit clone https://github.com/NeoGeographyToolkit/StereoPipeline.git\ncd StereoPipeline\nmkdir -p build\ncd build\ncmake ..                                     \\\n  -DASP_DEPS_DIR=$PREFIX                     \\\n  -DCMAKE_VERBOSE_MAKEFILE=ON                \\\n  -DCMAKE_INSTALL_PREFIX=$PREFIX             \\\n  -DVISIONWORKBENCH_INSTALL_DIR=$PREFIX      \\\n  -DCMAKE_C_COMPILER=${PREFIX}/bin/$cc_comp  \\\n  -DCMAKE_CXX_COMPILER=${PREFIX}/bin/$cxx_comp\necho Building StereoPipeline\nmake -j${CPU_COUNT} install > /dev/null 2>&1 # this is too verbose\n\n# Search for packages\nconda search -c nasa-ames-stereo-pipeline --override-channels --platform osx-64\n\n# Save current dependencies\ncd ~/work/StereoPipeline\nconda activate asp_deps; conda env export > asp_deps.yaml\n\n# conda env export > ~/miniconda3/envs/asp_deps/asp_deps.yaml.bk\n\n# To create an env, it appears important to use the flexible channel priority.\n# Below creating the final asp_deps env, after ensuring all dependencies are good.\nconda config --set channel_priority flexible\nconda env create -n asp_deps -f asp_deps.yaml\n\n# See the top of document for how to save / fetch a tarball with dependencies\n# See also for how to install conda-build and anaconda client.\n\n# geoid\ncd ~/work/StereoPipeline\ngit clone https://github.com/NeoGeographyToolkit/geoid-feedstock.git\npython StereoPipeline/conda/update_versions.py asp_deps.yaml geoid-feedstock\nconda activate build\nconda build -c nasa-ames-stereo-pipeline -c conda-forge geoid-feedstock\nanaconda upload /Users/runner/miniconda3/conda-bld/osx-64/geoid-1.0_asp3.5.0-2.conda         \n/Users/runner/miniconda3/bin/conda  install -c nasa-ames-stereo-pipeline -c conda-forge -n asp_deps geoid=1.0_asp3.5.0\n\n# ilmbase\ngit clone https://github.com/NeoGeographyToolkit/ilmbase-feedstock.git\npython StereoPipeline/conda/update_versions.py asp_deps.yaml ilmbase-feedstock\nconda build -c conda-forge -c nasa-ames-stereo-pipeline ilmbase-feedstock\n~/miniconda3/bin/anaconda upload /Users/runner/miniconda3/conda-bld/osx-64/ilmbase-2.5.5-h01edc0c_1.conda\n#conda install -c nasa-ames-stereo-pipeline -c conda-forge -n asp_deps ilmbase=2.5.5\n/Users/runner/miniconda3/bin/conda install -c nasa-ames-stereo-pipeline -c conda-forge -n asp_deps  nasa-ames-stereo-pipeline::ilmbase=2.5.5   \n/Users/runner/miniconda3/envs/anaconda/bin/anaconda upload /Users/runner/miniconda3/conda-bld/osx-64/ilmbase-2.5.5-h01edc0c_0.conda\n/Users/runner/miniconda3/bin/conda  install -c nasa-ames-stereo-pipeline -c conda-forge -n asp_deps ilmbase=2.5.5\n\n# openexr\ncd ~/work/StereoPipeline\nhttps://github.com/NeoGeographyToolkit/openexr-feedstock.git\npython StereoPipeline/conda/update_versions.py asp_deps.yaml openexr-feedstock\n~/miniconda3/bin/anaconda upload upload /Users/runner/miniconda3/conda-bld/osx-64/openexr-2.5.5-ha5a8b8e_0.conda\n/Users/runner/miniconda3/bin/conda  install -c nasa-ames-stereo-pipeline -c conda-forge -n asp_deps  nasa-ames-stereo-pipeline::openexr=2.5.5\n\n# libnabo\ncd ~/work/StereoPipeline\nconda activate asp_deps; conda env export > asp_deps.yaml\ngit clone https://github.com/NeoGeographyToolkit/libnabo-feedstock.git\npython StereoPipeline/conda/update_versions.py asp_deps.yaml libnabo-feedstock \nconda activate build\nconda build -c nasa-ames-stereo-pipeline -c conda-forge libnabo-feedstock\n~/miniconda3/bin/anaconda upload /Users/runner/miniconda3/conda-bld/osx-64/libnabo-asp3.5.0-h01edc0c_1.conda\n~/miniconda3/bin/conda install -c nasa-ames-stereo-pipeline -c conda-forge -n asp_deps libnabo\n\n# fgr\ncd ~/work/StereoPipeline\ngit clone https://github.com/NeoGeographyToolkit/fgr-feedstock.git\nconda activate asp_deps; conda env export > asp_deps.yaml\npython StereoPipeline/conda/update_versions.py asp_deps.yaml fgr-feedstock\nconda activate build\nconda build -c nasa-ames-stereo-pipeline -c conda-forge fgr-feedstock\nanaconda upload  /Users/runner/miniconda3/conda-bld/osx-64/fgr-asp3.5.0-h01edc0c_0.conda \n~/miniconda3/bin/conda install -c nasa-ames-stereo-pipeline -c conda-forge -n asp_deps fgr\n\n# libpointmatcher\ncd ~/work/StereoPipeline\nconda activate asp_deps; conda env export > asp_deps.yaml\ngit clone https://github.com/NeoGeographyToolkit/libpointmatcher-feedstock.git\npython StereoPipeline/conda/update_versions.py asp_deps.yaml libpointmatcher-feedstock\nconda activate build\nconda build -c nasa-ames-stereo-pipeline -c conda-forge libpointmatcher-feedstock\nanaconda upload /Users/runner/miniconda3/conda-bld/osx-64/libpointmatcher-asp3.5.0-ha5a8b8e_0.conda\n~/miniconda3/bin/conda install -c nasa-ames-stereo-pipeline -c conda-forge -n asp_deps libpointmatcher\n\n# pdal\ncd ~/work/StereoPipeline\nconda activate asp_deps; conda env export > asp_deps.yaml\ngit clone https://github.com/NeoGeographyToolkit/pdal-feedstock.git\npython StereoPipeline/conda/update_versions.py asp_deps.yaml pdal-feedstock\n# Do not use ASP GDAL so exclude the ASP channel\nconda activate build\nconda build -c conda-forge pdal-feedstock |tee output_debug_pdal.txt\n\n# s2p\ncd ~/work/StereoPipeline\nconda activate asp_deps; conda env export > asp_deps.yaml\ngit clone https://github.com/NeoGeographyToolkit/s2p-feedstock.git\npython StereoPipeline/conda/update_versions.py asp_deps.yaml s2p-feedstock\nconda build -c nasa-ames-stereo-pipeline -c conda-forge s2p-feedstock\nanaconda upload  /Users/runner/miniconda3/conda-bld/osx-64/s2p-subset-asp3.5.0-h01edc0c_0.conda \n\n# libelas\ncd ~/work/StereoPipeline\nconda activate asp_deps; conda env export > asp_deps.yaml\ngit clone https://github.com/NeoGeographyToolkit/libelas-feedstock.git\npython StereoPipeline/conda/update_versions.py asp_deps.yaml libelas-feedstock\nconda build -c nasa-ames-stereo-pipeline -c conda-forge libelas-feedstock\n~/miniconda3/bin/anaconda upload /Users/runner/miniconda3/conda-bld/osx-64/libelas-asp3.5.0-h01edc0c_0.conda \n~/miniconda3/bin/conda install -c nasa-ames-stereo-pipeline -c conda-forge -n asp_deps libelas\n\n# Build Multiview with conda. Ensure that the same compile tools\n# are used as above.\ncd ~/work/StereoPipeline\nconda activate asp_deps; conda env export > asp_deps.yaml\ngit clone https://github.com/NeoGeographyToolkit/multiview-feedstock.git\npython StereoPipeline/conda/update_versions.py asp_deps.yaml multiview-feedstock\nconda activate build\nconda build -c nasa-ames-stereo-pipeline -c conda-forge multiview-feedstock\n~/*conda3/bin/anaconda upload /Users/runner/miniconda3/conda-bld/osx-64/multiview-asp_3.5.0-py310_0.conda \n~/miniconda3/bin/conda install -c nasa-ames-stereo-pipeline -c conda-forge -n asp_deps multiview\n\n# visionworkbench\ncd ~/work/StereoPipeline\ngit clone https://github.com/NeoGeographyToolkit/visionworkbench-feedstock.git\nconda activate asp_deps; conda env export > asp_deps.yaml\npython StereoPipeline/conda/update_versions.py asp_deps.yaml visionworkbench-feedstock\nconda activate build\nconda build -c conda-forge -c nasa-ames-stereo-pipeline visionworkbench-feedstock 2>&1 |tee output_debug.txt\n~/miniconda3/bin/anaconda upload upload /Users/runner/miniconda3/conda-bld/osx-64/visionworkbench-asp3.5.0-0.conda\n~/miniconda3/bin/conda install -c nasa-ames-stereo-pipeline -c conda-forge -n asp_deps visionworkbench\n\n# StereoPipeline\nconda config --set channel_priority flexible\ncd ~/work/StereoPipeline\ngit clone https://github.com/NeoGeographyToolkit/stereopipeline-feedstock.git\nconda activate asp_deps; conda env export > asp_deps.yaml\npython StereoPipeline/conda/update_versions.py asp_deps.yaml stereopipeline-feedstock\nconda activate build\nconda build -c nasa-ames-stereo-pipeline -c usgs-astrogeology \\\n      -c conda-forge stereopipeline-feedstock 2>&1 |tee output_debug.txt\n~/miniconda3/bin/anaconda upload\n~/miniconda3/bin/conda install -c nasa-ames-stereo-pipeline -c conda-forge -n asp_deps \n\n# Prepare for packaging the tarball\nconda install -c conda-forge pbzip2 chrpath cmake parallel\nconda create -c conda-forge -n python_isis8 python=3.10.13 numpy=1.26.4\n\n# Package with BinaryBuilder. The Mac Arm and Mac x84 use\n# different paths to the python environment.\ncd ~/work/StereoPipeline\ngit clone https://github.com/NeoGeographyToolkit/BinaryBuilder\ncd BinaryBuilder\nexport PREFIX=$HOME/miniconda3/envs/asp_deps\nexport ISISROOT=$PREFIX\ninstallDir=$PREFIX\nenvPath=$PREFIX\npythonPath=$(ls -d $HOME/miniconda3/envs/*python* | head -n 1)\necho installDir=$installDir\necho envPath=$envPath\necho pythonPath=$pythonPath\n\n./make-dist.py $installDir \\\n  --asp-deps-dir $envPath  \\\n  --python-env $(ls -d $HOME/*conda3/envs/python*)\n"
  },
  {
    "path": ".github/workflows/build_helper_linux.yml",
    "content": "name: build_helper_linux\non:\n  workflow_dispatch:\n\njobs:\n  build:\n    runs-on: ubuntu-22.04\n    steps:\n\n    - uses: conda-incubator/setup-miniconda@v3\n      with:\n        auto-activate-base: true\n        activate-environment: \"\"\n\n    - uses: actions/checkout@v3\n\n    - name: Build deps on top of asp_deps\n      run: |\n        set -ex\n\n        # Fetch the asp_deps tarball (cross-compiled on Mac, has all deps\n        # except ISIS, Geoid, and Python env)\n        tag=asp_deps_linux_v2\n        cd $HOME\n        wget https://github.com/NeoGeographyToolkit/BinaryBuilder/releases/download/${tag}/asp_deps.tar.gz\n        /usr/bin/time tar xzf asp_deps.tar.gz -C $HOME\n\n        # Find the env\n        envPath=$(ls -d $HOME/*conda3/envs/asp_deps)\n        if [ ! -d \"$envPath\" ]; then\n            echo \"Error: $envPath does not exist\"\n            exit 1\n        fi\n        export PATH=$envPath/bin:$PATH\n        conda init bash\n        source ~/.bash_profile\n        conda activate asp_deps\n\n        # The tarball was stripped to fit GitHub releases (2GB limit).\n        # Removed: lib/python3.13/, static .a files, LLVM/clang, OpenVINO,\n        # openblas (MKL used), conda-meta, rclone, mysqld, locale-archive,\n        # opt/bullet, include/{bullet,qt6,vtk-9.5}.\n        # BLAS/LAPACK symlinks redirect to MKL (libmkl_rt.so).\n        # Reinstall stripped packages needed for ISIS build.\n        # Pin versions to match environment_asp_deps_linux.yml.\n        conda install -c conda-forge -y \\\n          \"bullet>=3.25\" \"qt6-main>=6,<7\" \"openblas\" 2>/dev/null || true\n\n        # Create the Python env (needed for ASP packaging later).\n        # Must match the Python version in asp_deps.\n        conda create -n python_isis9 -c conda-forge -y python=3.13 numpy\n\n        # Set up compiler\n        cc_comp=x86_64-conda-linux-gnu-gcc\n        cxx_comp=x86_64-conda-linux-gnu-g++\n        PREFIX=$envPath\n\n        # Build Geoid (Fortran, can't cross-compile on Mac)\n        cd $HOME\n        wget https://github.com/NeoGeographyToolkit/StereoPipeline/releases/download/geoid1.0/geoids.tgz\n        tar xzf geoids.tgz\n        cd geoids\n        ${PREFIX}/bin/x86_64-conda-linux-gnu-gfortran -fPIC -O3 -c interp_2p5min.f\n        ${PREFIX}/bin/x86_64-conda-linux-gnu-gfortran -shared -o libegm2008.so interp_2p5min.o\n        cp -fv libegm2008.so ${PREFIX}/lib/\n        mkdir -p ${PREFIX}/share/geoids\n        cp -fv *.tif *.jp2 ${PREFIX}/share/geoids/\n\n        # Build ALE (already cross-compiled in tarball, skip for now)\n        if [ 1 -eq 0 ]; then\n        cd $HOME\n        git clone https://github.com/DOI-USGS/ale.git --recursive\n        cd ale\n        mkdir -p build && cd build\n        cmake ..                                         \\\n          -DCMAKE_C_COMPILER=${PREFIX}/bin/$cc_comp      \\\n          -DCMAKE_CXX_COMPILER=${PREFIX}/bin/$cxx_comp   \\\n          -DALE_USE_EXTERNAL_EIGEN=ON                    \\\n          -DALE_USE_EXTERNAL_JSON=ON                     \\\n          -DALE_BUILD_LOAD=ON                            \\\n          -DALE_BUILD_DOCS=OFF                           \\\n          -DALE_BUILD_TESTS=OFF                          \\\n          -DCMAKE_INSTALL_PREFIX=${PREFIX}\n        make -j$(nproc) install\n        fi\n\n        # Build USGSCSM (already cross-compiled in tarball, skip for now)\n        if [ 1 -eq 0 ]; then\n        cd $HOME\n        git clone https://github.com/DOI-USGS/usgscsm.git --recursive\n        cd usgscsm\n        mkdir -p build && cd build\n        cmake ..                                         \\\n          -DCMAKE_C_COMPILER=${PREFIX}/bin/$cc_comp      \\\n          -DCMAKE_CXX_COMPILER=${PREFIX}/bin/$cxx_comp   \\\n          -DUSGSCSM_EXTERNAL_DEPS=ON                     \\\n          -DUSGSCSM_BUILD_DOCS=OFF                       \\\n          -DUSGSCSM_BUILD_TESTS=OFF                      \\\n          -DCMAKE_INSTALL_PREFIX=${PREFIX}\n        make -j$(nproc) install\n        fi\n\n        # Build ISIS (needs Qt6, Fortran deps - can't cross-compile on Mac)\n        cd $HOME\n        git clone https://github.com/DOI-USGS/ISIS3.git\n        cd ISIS3\n        git submodule update --init --recursive\n        mkdir -p build && cd build\n        export ISISROOT=$PWD\n        cmake ..                                         \\\n          -GNinja                                        \\\n          -DJP2KFLAG=OFF                                 \\\n          -Dpybindings=OFF                               \\\n          -DBUILD_TESTING=OFF                            \\\n          -DCMAKE_BUILD_TYPE=Release                     \\\n          -DCMAKE_INSTALL_PREFIX=${PREFIX}               \\\n          ../isis\n        /usr/bin/time ninja install\n\n        # Tar both envs (asp_deps + python_isis9)\n        mkdir -p ~/work/StereoPipeline/packages\n        cd $HOME\n        condaDir=$(basename $(dirname $envPath))\n        /usr/bin/time tar czf ~/work/StereoPipeline/packages/asp_deps.tar.gz \\\n            ${condaDir}/envs/asp_deps ${condaDir}/envs/python_isis9\n\n    - name: Upload artifacts\n      if: always()\n      uses: actions/upload-artifact@v4\n      with:\n         name: asp-deps-linux-with-isis\n         path: ~/work/StereoPipeline/packages\n         retention-days: 2\n      continue-on-error: true\n"
  },
  {
    "path": ".github/workflows/build_test.sh",
    "content": "#!/bin/bash\n\n# This is run by GitHub Actions to build and test the Mac version of ASP.\n# See build_helper.sh for detailed build commands for ASP and its dependencies.\n\n# Track infrastructure failures separately from test failures.\n# Infrastructure failures (build, packaging) are fatal.\n# Test validation failures are reported but not fatal.\nbuild_failed=0\n\n# Record the location where the script is running, which should\n# be the base of the StereoPipeline repo. This must happen first.\naspRepoDir=$(pwd) # same as $HOME/work/StereoPipeline/StereoPipeline\nif [ \"$(basename $aspRepoDir)\" != \"StereoPipeline\" ]; then\n    # Check that base dir is StereoPipeline\n    echo \"Error: Directory: $aspRepoDir is not StereoPipeline\"\n    exit 1\nfi\n# Other variables\nbaseDir=$(dirname $aspRepoDir) # one level up\ninstallDir=$baseDir/install\n\n# packageDir will later be uploaded, as set in the yml file\npackageDir=$baseDir/packages\ntestDir=$baseDir/StereoPipelineTest\n\n# Throw an error unless on a Mac\nisMac=$(uname -s | grep Darwin)\nif [ \"$isMac\" = \"\" ]; then\n    echo \"This script is for Mac only\"\n    exit 1\nfi\n\n# See if this is Arm64 or Intel x64\nisArm64=$(uname -m | grep arm64)\n\n# The ASP dependencies at the location below are updated using the script\n# save_mac_deps.sh. See that script for more info. Sometimes the names and\n# versions of these change during development.\nif [ \"$isArm64\" != \"\" ]; then\n    echo \"Platform: Arm64 Mac\"\n    tag=asp_deps_mac_arm64_v3\n    envName=asp_deps\nelse\n    echo \"Platform: Intel Mac\"\n    tag=asp_deps_mac_x64_v3\n    envName=asp_deps\nfi\n\n# Fetch and unzip the ASP dependencies\nbbUrl=https://github.com/NeoGeographyToolkit/BinaryBuilder/releases/download/${tag}\nif [ \"$isArm64\" != \"\" ]; then\n    # ARM64: single tarball\n    wget ${bbUrl}/asp_deps.tar.gz > /dev/null 2>&1\n    /usr/bin/time tar xzf asp_deps.tar.gz -C $HOME > /dev/null 2>&1\nelse\n    # Intel x64: split into two tarballs (env exceeds 2 GB GitHub limit)\n    wget ${bbUrl}/asp_deps_p1.tar.gz > /dev/null 2>&1\n    wget ${bbUrl}/asp_deps_p2.tar.gz > /dev/null 2>&1\n    /usr/bin/time tar xzf asp_deps_p1.tar.gz -C $HOME > /dev/null 2>&1\n    /usr/bin/time tar xzf asp_deps_p2.tar.gz -C $HOME > /dev/null 2>&1\nfi\n\n# The env can be in miniconda3 or anaconda3  \nenvPath=$(ls -d $HOME/*conda3/envs/${envName})\nif [ ! -d \"$envPath\" ]; then\n    echo \"Error: Directory: $envPath does not exist\"\n    exit 1\nfi\nexport PATH=$envPath/bin:$PATH\n\n# These are of help in interactive mode but are not strictly needed in batch mode\nconda init\nsource ~/.bash_profile\nconda activate $envName\n\n# Must use the linker from the conda environment to avoid issues with recent Intel Mac.\n# The linker can be installed with conda as package ld64_osx-64 on conda forge.\n# Put it in the asp_deps env.\ncmake_opts=\"\"\nif [ \"$isArm64\" = \"\" ]; then\n    CONDA_LINKER=\"$(ls $envPath/bin/x86_64-apple-darwin*ld | head -n 1)\"\n    if [ ! -f \"$CONDA_LINKER\" ]; then\n        echo \"Error: File: $CONDA_LINKER does not exist\"\n        exit 1\n    fi\n    ln -sf \"$CONDA_LINKER\" \"$envPath/bin/ld\" # Force the use of conda linker\n    cmake_opts=\"-DCMAKE_LINKER=$envPath/bin/ld\"\nfi\n\n# Set up the compiler\nif [ \"$(uname)\" = \"Darwin\" ]; then\n    cc_comp=clang\n    cxx_comp=clang++\nelse\n    cc_comp=x86_64-conda-linux-gnu-gcc\n    cxx_comp=x86_64-conda-linux-gnu-g++\nfi\necho cc_comp=$cc_comp\necho cxx_comp=$cxx_comp\n\n# Build visionworkbench\nmkdir -p $baseDir\ncd $baseDir\ngit clone https://github.com/visionworkbench/visionworkbench.git\ncd visionworkbench\nmkdir -p build\ncd build\n$envPath/bin/cmake ..                             \\\n  -DASP_DEPS_DIR=$envPath                         \\\n  -DCMAKE_OSX_DEPLOYMENT_TARGET=10.10             \\\n  -DCMAKE_INSTALL_PREFIX=$installDir              \\\n  -DCMAKE_C_COMPILER=${envPath}/bin/$cc_comp      \\\n  -DCMAKE_CXX_COMPILER=${envPath}/bin/$cxx_comp   \\\n  $cmake_opts\necho Building VisionWorkbench\nmake -j10 install > /dev/null 2>&1 # this is too verbose\n\n# Log of the build, for inspection, in case it fails.\n# This will resume from earlier.\nout_build_vw=$(pwd)/output_build_vw.txt\nmake install > $out_build_vw 2>&1\ntail -n 500 $out_build_vw\necho Log of VW build will be saved with the artifacts in $(basename $out_build_vw)\n\n# Build StereoPipeline\ncd $aspRepoDir\nmkdir -p build\ncd build\n$envPath/bin/cmake ..                             \\\n  -DASP_DEPS_DIR=$envPath                         \\\n  -DCMAKE_OSX_DEPLOYMENT_TARGET=10.13             \\\n  -DCMAKE_INSTALL_PREFIX=$installDir              \\\n  -DVISIONWORKBENCH_INSTALL_DIR=$installDir       \\\n  -DCMAKE_C_COMPILER=${envPath}/bin/$cc_comp      \\\n  -DCMAKE_CXX_COMPILER=${envPath}/bin/$cxx_comp   \\\n   $cmake_opts\necho Building StereoPipeline\nmake -j10 install > /dev/null 2>&1 # this is too verbose\nans=$?\nif [ \"$ans\" -ne 0 ]; then\n    echo \"Error: StereoPipeline build failed\"\n    # Do not exit so we can save the build log\nfi\n\n# Log of the build, for inspection in case it fails\nout_build_asp=$(pwd)/output_build_asp.txt\nmake install > $out_build_asp 2>&1\ntail -n 500 $out_build_asp\necho Log of ASP build will be saved with the artifacts in $(basename $out_build_asp)\n\n# Bugfix for duplicate LC_PATH failure. Wipe all values of LC_PATH.\nfor lib in $installDir/lib/*dylib; do\n    for f in $(otool -l $lib | grep -A 3 LC_RPATH | grep path | awk '{print $2}'); do\n        install_name_tool -delete_rpath  $f $lib\n    done\ndone\nexport DYLD_LIBRARY_PATH=$installDir/lib:$DYLD_LIBRARY_PATH\n\n# Package with BinaryBuilder. The Mac Arm and Mac x64 use\n# different paths to the python environment.\necho Packaging the build\ncd $baseDir\n# Clone BinaryBuilder BEFORE setting DYLD_LIBRARY_PATH to include conda\n# libs, as conda's libiconv conflicts with system git.\n/usr/bin/git clone https://github.com/NeoGeographyToolkit/BinaryBuilder\ncd BinaryBuilder\nnum=$(ls -d $HOME/*conda3/envs/python* | wc -l)\n# Must have exactly one python env\nif [ \"$num\" -ne 1 ]; then\n    echo \"Error: Expected exactly one python env, found $num\"\n    exit 1\nfi\nexport ISISROOT=$envPath # needed for Mac Arm\n# Do not add $envPath/lib to DYLD_LIBRARY_PATH. Conda's libiconv and ICU libs\n# shadow system frameworks and crash CoreFoundation (Qt6 static init dies with\n# \"unrecognized selector\" in CFStringGetFileSystemRepresentation on Sequoia).\n# Use DYLD_FALLBACK_LIBRARY_PATH instead - it only kicks in when rpath/install_name\n# lookup fails, so system libs are never shadowed.\nexport DYLD_FALLBACK_LIBRARY_PATH=$envPath/lib\n# Qt6 crashes on macOS 15 during os version check in its static initializer.\n# SYSTEM_VERSION_COMPAT=1 tells macOS to report version in a compatible way.\nexport SYSTEM_VERSION_COMPAT=1\n./make-dist.py $installDir \\\n  --asp-deps-dir $envPath  \\\n  --python-env $(ls -d $HOME/*conda3/envs/python*)\nif [ $? -ne 0 ]; then\n    echo \"Error: make-dist.py failed\"\n    build_failed=1\nfi\n# Prepare the package for upload\nmkdir -p $packageDir\nmv -fv Stereo* $packageDir\n\n# Extract the tarball so we can test it\ncd $packageDir\ntarBall=$(ls StereoPipeline-*.tar.bz2 | head -n 1)\nif [ \"$tarBall\" == \"\" ]; then\n  echo Cannot find the packaged ASP tarball\n  build_failed=1\nfi\n/usr/bin/time tar xjf $tarBall > /dev/null 2>&1 # this is verbose\n\n# Path to executables\nbinDir=$packageDir/$tarBall\nbinDir=${binDir/.tar.bz2/}\nbinDir=$binDir/bin\nexport PATH=$binDir:$PATH\necho \"Binaries are in $binDir\"\nif [ ! -d \"$binDir\" ]; then\n    echo \"Error: Directory: $binDir does not exist. Build failed.\"\n    build_failed=1\nfi\n\n# TODO(oalexan1): Run the tests as a different step in the .yml file.\n\n# Extract the tests. This tarball has both the scripts, test data,\n# and the expected results.\n# TODO(oalexan1): Must fetch the StereoPipelineTest repo and update\n# the scripts extracted from the tarball.\ncd $baseDir\necho Testing the build.\nwget https://github.com/NeoGeographyToolkit/StereoPipelineTest/releases/download/0.0.1/StereoPipelineTest.tar > /dev/null 2>&1 # this is verbose\n\n# Check if we got the tarball\nif [ ! -f \"StereoPipelineTest.tar\" ]; then\n    echo \"Error: File: StereoPipelineTest.tar does not exist. Test failed.\"\n    build_failed=1\nfi\ntar xfv StereoPipelineTest.tar > /dev/null 2>&1 # this is verbose\n\n# Note: If the test results change, a new tarball with latest scripts and test\n# results must be uploaded. That is done by running the script:\n# StereoPipeline/.github/workflows/update_mac_tests.sh in the local directory.\n# The nightly build script fetches the testa data with the latest and reference\n# results in tarball StereoPipelineTest.tar. That artifact will be uploaded\n# further down.\n\n# Go to the test dir\nif [ ! -d \"$testDir\" ]; then\n    echo \"Error: Directory: $testDir does not exist\"\n    build_failed=1\nfi\ncd $testDir\n\n# Run the tests. Failed to install pytest, despite trying hard.\n# Just run them manually.\nreportFile=$(pwd)/output_test.txt\nrm -f $reportFile\nans=0\nfor d in ss*; do \n    # Skip unless a directory\n    if [ ! -d \"$d\" ]; then continue; fi\n\n    cd $d\n    echo Running test in $(pwd)\n    ./run.sh > output.txt 2>&1\n    ./validate.sh >> output.txt 2>&1\n    ans0=$?\n    tail -n 20 output.txt # this can be verbose\n    echo \"Test $d returned $ans0\"\n    echo \"Test $d returned $ans0\" >> $reportFile\n    if [ \"$ans0\" -ne 0 ]; then ans=1; fi # keep record of failures\n    cd ..\ndone\necho ans is $ans\n\n# Set the test status. This is parsed after the build is downloaded.\necho test_status $ans >> $reportFile \n\nif [ \"$ans\" -eq 0 ]; then\n    echo \"All tests passed\"\nelse\n    # Do not quit, as we want to save the test results\n    echo \"Some tests failed\"\nfi\n\n# Create the artifacts dir that will be saved\nmkdir -p $packageDir\n    \n# Save the resulting test results as part of the artifacts. See above for how \n# to use this to update the test results in the cloud.\necho Copying the build\n(cd $testDir/..; tar cf $packageDir/$(basename $testDir).tar $(basename $testDir))\n\n# Save these logs as part of the artifacts\necho Copying the logs\ncp -rfv $out_build_vw $out_build_asp $reportFile $packageDir\n\n# Wipe the extracted tarball so we do not upload it\n# TODO(oalexan1): Consider extracting it to a different location to start with\nrm -rfv $(dirname $binDir) > /dev/null 2>&1\n\n# Exit with failure if build/packaging broke (infrastructure failure)\nif [ \"$build_failed\" -ne 0 ]; then\n    echo \"Build or packaging failed (see errors above)\"\n    exit 1\nfi\n\n# Exit with test status so CI reports failure when tests fail\nexit $ans\n"
  },
  {
    "path": ".github/workflows/build_test_mac_arm64.yml",
    "content": "name: build_test_mac_arm64\non:\n  workflow_dispatch:\n\njobs:\n  build:\n    runs-on: macos-latest\n    steps:\n    - uses: actions/checkout@v3\n    # No caching of dependencies, as the cache does not change when it is\n    # modified, and it can expire. See build_test.sh how to fetch an\n    # offline tarball with dependencies, and how to update that one if need\n    # be.\n    # - name: Cache conda\n    #   id: cache-conda\n    #   uses: actions/cache@v3\n    #   env:\n    #     cache-name: cache-conda\n    #   with:\n    #     path: |\n    #       /usr/local/miniconda/envs\n    #     key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/miniconda.json') }}\n    #     restore-keys: |\n    #       ${{ runner.os }}-build-${{ env.cache-name }}-\n    #       ${{ runner.os }}-build-\n    #       ${{ runner.os }}-\n    - name: build_test\n      # Build and test ASP\n      run: ./.github/workflows/build_test.sh\n    - name: Upload artifacts\n      if: always()\n      uses: actions/upload-artifact@v4\n      with:\n         # This must be in sync with BinaryBuilder/auto_build\n         name: StereoPipeline-Artifact-build_test_mac_arm64\n         path: ~/work/StereoPipeline/packages\n         retention-days: 2\n      continue-on-error: true\n"
  },
  {
    "path": ".github/workflows/build_test_mac_x64.yml",
    "content": "name: build_test_mac_x64\non:\n  workflow_dispatch:\n\njobs:\n  build:\n    runs-on: macos-15-intel\n    steps:\n    - uses: actions/checkout@v3\n    - name: build_test\n      # Build and test ASP\n      run: ./.github/workflows/build_test.sh\n    - name: Upload artifacts\n      if: always()\n      uses: actions/upload-artifact@v4\n      with:\n         # This must be in sync with BinaryBuilder/auto_build\n         name: StereoPipeline-Artifact-build_test_mac_x64\n         path: ~/work/StereoPipeline/packages\n         retention-days: 2\n      continue-on-error: true\n"
  },
  {
    "path": ".github/workflows/save_linux_deps.sh",
    "content": "#!/bin/bash\n\n# Run this on a local machine to save the current dependencies as a release.\n# This will wipe the old version with the same tag. See save_mac_deps.sh for\n# more info.\n\n# Check usage \nif [ \"$#\" -lt 1 ]; then\n    echo \"Usage: $0 tag\"\n    exit 1\nfi\n\ntag=$1; shift\n\n# Create the tarball of dependencies. This likely includes a pre-built ASP\n# itself, but that is not a problem.\n# Note: Must updated below the names of both envs if they change.\ntarball=asp_deps.tar.gz\ncd $HOME\necho Creating: $tarball\n/usr/bin/time tar cfz $tarball \\\n  miniconda3/envs/asp_deps     \\\n  miniconda3/envs/python_isis9\n\n# Set up GitHub CLI\ngh=$HOME/miniconda3/envs/gh/bin/gh\nrepo=git@github.com:NeoGeographyToolkit/BinaryBuilder.git\n\n# Run $gh auth to authenticate\n\n# Wipe old version\n$gh release -R $repo delete $tag \n\n# Save the tarball as a release\nnotes=\"Full tarball of latest ASP dev build dependencies\"\n/usr/bin/time $gh release -R $repo create $tag $tarball --title $tag --notes \"$notes\"\n"
  },
  {
    "path": ".github/workflows/save_mac_deps.sh",
    "content": "#!/bin/bash\n\n# To update the Mac dependencies or create new ones, in manual (interactive)\n# mode, run the ssh_mac_x64.yml / ssh_mac_arm.yml action to get ssh access to a\n# Mac cloud instance.\n\n# Then, fetch/build/update the dependencies. See \n# https://stereopipeline.readthedocs.io/en/latest/building_asp.html\n# for a high-level overview.\n\n# Ideally all dependencies are built and then installed as conda packages.\n# The script build_helper.sh has the commands for how build dependencies\n# manually, if needed to understand failures when using conda.\n\n# The updated dependencies should be installed in /Users/runner/miniconda3/envs. \n\n# When done, and before exiting, save the dependencies, such as:\n#   mkdir -p ~/work/StereoPipeline/packages\n#   cd $HOME\n#   /usr/bin/time tar cfz ~/work/StereoPipeline/packages/asp_deps.tar.gz *conda3/envs\n\n# After quitting the action (exiting the shell), the tarball will be saved as an\n# artifact. Upload progress can be monitored in GitHub Actions. \n\n# Then, from a local machine, which need not be a Mac, run this script. \n# It will fetch the tarball from the cloud and then push it as a release\n# to permanent location, with given tag.\n\n# This tarball will be used to build VisionWorkplace and ASP. See the script\n# build_test.sh.\n\n# The tag set here must match the tag in build_test.sh and build_helper.sh. If\n# changing here, must later change in the other places.\n\n# This script will overwrite the dependencies. If in doubt, use it with a new\n# tag, as the dependencies are very hard to recreate.\n\n# TODO(oalexan1): For Intel Mac, the env exceeds the 2 GB GitHub release limit\n# and must be split into two tarballs (asp_deps_p1.tar.gz and asp_deps_p2.tar.gz).\n# This script does not yet handle the split. The build_test.sh script already\n# expects two parts for Intel Mac.\n\n# If the tarball with dependencies already exists locally, rather than being\n# fetched as an artifact first, the commands from the latter part of \n# this script can be run manually to upload the tarball as a release.\n\n# How to run this script:\n\n# For Mac x64:\n# tag=asp_deps_mac_x64_xxx # sync up here with build_test.sh\n# workflow=\"ssh_mac_x64.yml\"\n# $HOME/projects/StereoPipeline/.github/workflows/save_mac_deps.sh $workflow $tag\n\n# For Mac Arm64:\n# tag=asp_deps_mac_arm64_xxx # sync up here with build_test.sh\n# workflow=\"ssh_mac_arm.yml\"\n# $HOME/projects/StereoPipeline/.github/workflows/save_mac_deps.sh $workflow $tag\n\n# For Linux, the dependencies from the local machine can be saved as follows.\n# tag=asp_deps_linux_xxx # change here\n# $HOME/projects/StereoPipeline/.github/workflows/save_linux_deps.sh $tag\n\n# Check usage\nif [ \"$#\" -lt 2 ]; then\n    echo \"Usage: $0 workflow tag\"\n    exit 1\nfi\n\n# The workflow that saved the dependencies as artifact. Options:\n# ssh_mac_x64.yml, ssh_mac_arm.yml\nworkflow=$1; shift\n\n# The tag to use to save the dependencies. Must then use this tag\n# to fetch the dependencies in build_test.sh and build_helper.sh.\ntag=$1; shift \n\n# The GitHub CLI tool. Can be installed in a new conda environment\n# named 'gh' as follows:\n# conda create -n gh -c conda-forge gh\n\ngh=$(ls -d $HOME/*conda3/envs/gh/bin/gh)\nrepo=git@github.com:NeoGeographyToolkit/StereoPipeline.git\n\n# Query the ${workflow}. Must check that that the top-most run is successful\n$gh run list -R $repo --workflow=${workflow}\n\n# Find the latest id, then fetch the artifacts for it\nans=$($gh run list -R $repo --workflow=${workflow} | grep -v STATUS | head -n 1)\ncompleted=$(echo $ans | awk '{print $1}')\nsuccess=$(echo $ans | awk '{print $2}')\nid=$(echo $ans | awk '{print $7}')\necho Stage: $completed\necho Status: $success\necho Id: $id\nif [ \"$success\" != \"success\" ]; then\n  echo \"Error: The ${workflow} workflow did not succeed\"\n  exit 1\nfi \n\necho Fetching the build with id $id from the cloud \necho $gh run download -R $repo $id\n/bin/rm -rf ASP-dependencies-macOS # Must wipe this first, or else the download can fail\n$gh run download -R $repo $id\n\n# Must be careful with the line below. This is set in the ${workflow} file.\nbinaries=ASP-dependencies-macOS/asp_deps.tar.gz\nif [ ! -f \"$binaries\" ]; then\n  echo \"Error: File: $binaries does not exist\"\n  exit 1\nfi \n\n# Add the tarball of dependencies as a release\n# Can use a new tag here, or overwrite the existing tarball\n# If making a new one, must make sure to update the tag in build_test.sh and build_helper.sh\nrepo=git@github.com:NeoGeographyToolkit/BinaryBuilder.git\n\n# Wipe any old version\necho If present, deleting the old release for tag: $tag\n$gh release -R $repo delete $tag -y 2>/dev/null # hide any error message for missing release\n\n# Upload the new version\nnotes=\"Full tarball of latest ASP dev build dependencies\"\necho Uploading a new version for tag: $tag\n/usr/bin/time $gh release -R $repo create $tag $binaries --title $tag --notes \"$notes\"\n"
  },
  {
    "path": ".github/workflows/ssh_linux_arm.yml",
    "content": "name: ssh_linux_arm\non:\n  workflow_dispatch:\n\njobs:\n  build:\n    runs-on: ubuntu-22.04-arm\n    steps:\n    \n    # Fetch miniconda\n    - uses: conda-incubator/setup-miniconda@v3\n      with:\n        auto-activate-base: true\n        activate-environment: \"\"\n    \n    # Fetch the code\n    - uses: actions/checkout@v3\n\n    # No caching of dependencies, as the cache does not change when it is\n    # modified, and it can expire. See build_test.sh how to fetch an offline\n    # tarball with dependencies, and how to update that one if need be.\n\n    # Set up ssh for interactive use\n    - name: Setup tmate session\n      uses: mxschmitt/action-tmate@v3 # disconnects after about 40 minutes\n      timeout-minutes: 600\n      with:\n        limit-access-to-actor: true\n\n    # Upload the artifacts that were saved in the directory below before exiting\n    # the ssh session. Useful for saving any results produced in this session.\n    # Can be later downloaded manually and saved to a permanent location.\n    - name: Upload artifacts\n      uses: actions/upload-artifact@v4\n      with: \n         name: ASP-dependencies-${{ runner.os }}\n         path: ~/work/StereoPipeline/packages\n         retention-days: 2\n      continue-on-error: true\n"
  },
  {
    "path": ".github/workflows/ssh_mac_arm.yml",
    "content": "name: ssh_mac_arm\non:\n  workflow_dispatch:\n\njobs:\n  build:\n    runs-on: macos-latest\n    steps:\n    \n    # Fetch miniconda\n    - uses: conda-incubator/setup-miniconda@v3\n      with:\n        auto-activate-base: true\n        activate-environment: \"\"\n    \n    # Fetch the code\n    - uses: actions/checkout@v3\n\n    # No caching of dependencies, as the cache does not change when it is\n    # modified, and it can expire. See build_test.sh how to fetch an offline\n    # tarball with dependencies, and how to update that one if need be.\n\n    # Set up ssh for interactive use\n    - name: Setup tmate session\n      uses: mxschmitt/action-tmate@v3 # disconnects after about 40 minutes\n      timeout-minutes: 600\n      with:\n        limit-access-to-actor: true\n\n    # Upload the artifacts that were saved in the directory below before exiting\n    # the ssh session. Useful for saving any results produced in this session.\n    # Can be later downloaded manually and saved to a permanent location.\n    - name: Upload artifacts\n      uses: actions/upload-artifact@v4\n      with: \n         name: ASP-dependencies-${{ runner.os }}\n         path: ~/work/StereoPipeline/packages\n         retention-days: 2\n      continue-on-error: true\n"
  },
  {
    "path": ".github/workflows/ssh_mac_x64.yml",
    "content": "name: ssh_mac_x64\non:\n  workflow_dispatch:\n\njobs:\n  build:\n    runs-on: macos-15-intel\n    steps:\n    \n    # Fetch miniconda\n    - uses: conda-incubator/setup-miniconda@v3\n      with:\n        auto-activate-base: true\n        activate-environment: \"\"\n    \n    # Fetch the code\n    - uses: actions/checkout@v3\n\n    # Set up ssh for interactive use\n    - name: Setup tmate session\n      uses: mxschmitt/action-tmate@v3 # disconnects after about 40 minutes\n      timeout-minutes: 600\n      with:\n        limit-access-to-actor: true\n\n    # Upload the artifacts that were saved in the directory below before exiting\n    # the ssh session. Useful for saving any results produced in this session.\n    # Can be later downloaded manually and saved to a permanent location.\n    # See save_mac_deps.sh for how to prepare the dependencies for upload.\n    - name: Upload artifacts\n      uses: actions/upload-artifact@v4\n      with: \n         name: ASP-dependencies-${{ runner.os }}\n         path: ~/work/StereoPipeline/packages\n         retention-days: 2\n      continue-on-error: true\n"
  },
  {
    "path": ".github/workflows/update_mac_tests.sh",
    "content": "#!/bin/bash\n\n# Given the latest test results for Mac, as fetched (automatically) from the\n# cloud as an artifact, update the reference results and push the updated tests\n# back to the cloud. See build_test.sh for how this gets prepared and downloaded\n# to the machine that launches the build and regressions.\n\n# The tarball having the tests.\ndata=StereoPipelineTest.tar\n\n# Check if it exists\nif [ ! -f \"$data\" ]; then\n  # Maybe it is in a subdir. That happens when fetching the artifact.\n  ans=$(ls */$data | head -n 1)\n  if [ \"$ans\" != \"\" ]; then\n    cd $(dirname $ans)\n  fi\nfi\n\n# Check again\nif [ ! -f \"$data\" ]; then  \n  echo \"Error: File: $data does not exist\"\n  exit 1\nfi\n\n# Extract\necho \"Extracting $data\"\ntar xfv $data > /dev/null 2>&1 # this is verbose\nif [ ! -d \"StereoPipelineTest\" ]; then\n  echo \"Error: Directory: StereoPipelineTest does not exist\"\n  exit 1\nfi\n\n# Here may need to do some manual inspections\n\n# Update the failed tests (each 'gold' is overwritten with 'run').\n# This assumes that the \"run\" directories are trusted to be correct.\necho \"Updating the tests\"\nfor f in StereoPipelineTest/ss*/run; do \n  g=${f/run/gold}\n  /bin/rm -rfv $g\n  /bin/mv -fv $f $g\ndone\n\n# If the scripts need to be updated, do it here, manually\n\n# Must make all scripts in bin and individual tests executable\nchmod a+x StereoPipelineTest/bin/* StereoPipelineTest/*/*sh\n\necho \"Creating a new tarball\"\ntar cfv $data StereoPipelineTest \n\n# Make sure the gh tool is executable\ngh=$(ls -d $HOME/*conda3/envs/gh/bin/gh)\nif [ ! -x \"$gh\" ]; then\n  echo \"Error: Cannot find gh\"\n  exit 1\nfi\n\necho \"Pushing the updated tarball to the cloud\"\nrepo=git@github.com:NeoGeographyToolkit/StereoPipelineTest.git  \ntag=0.0.1\necho Wipe the old tests and upload the new ones\n$gh release -R $repo delete $tag -y # wipe old tarball\nnotes=\"Update test results\"\n$gh release -R $repo create $tag $data --title $tag --notes \"$notes\" # upload new\n\n"
  },
  {
    "path": ".gitignore",
    "content": "# Generally ignorable files.\n*~\n/build\n/build_linux\n/install\n/install_linux\ndocs/_build\nGitHubReleases.txt\n\n.vscode\n*.code-workspace\n"
  },
  {
    "path": ".readthedocs.yml",
    "content": "# .readthedocs.yml\n# Read the Docs configuration file\n# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details\n\n# Required\nversion: 2\n\n# Set the OS, Python version and other tools you might need\nbuild:\n  os: ubuntu-22.04\n  tools:\n    python: \"3.11\"\n\n# Build documentation in the docs/ directory with Sphinx\nsphinx:\n  configuration: docs/conf.py\n\n# Build documentation with MkDocs\n#mkdocs:\n#  configuration: mkdocs.yml\n\n# Optionally build your docs in additional formats such as PDF and ePub\nformats:\n  - htmlzip\n\n# Optionally set the version of Python and requirements required to build your docs\npython:\n  install:\n    - requirements: docs/requirements.txt\n\n"
  },
  {
    "path": "AUTHORS.rst",
    "content": "The Ames Stereo Pipeline (ASP) was originally developed by the\nIntelligent Robotics Group (IRG), in the Intelligent Systems Division\nat the NASA Ames Research Center in Moffett Field, CA. \n\n**Project Lead**\n\n- Dr. `Ross Beyer <https://github.com/rbeyer>`_ (NASA/SETI Institute)\n\n**Core Development Team**\n\n- Oleg Alexandrov (KBR, Inc., at NASA Ames)\n- Scott McMichael (KBR, Inc., at NASA Ames)\n\n**Contributors and Developers**\n\n- Zachary Moratto (NASA/Stinger-Ghaffarian Technologies, former ASP Lead Architect)\n- Michael J. Broxton (NASA/Carnegie Mellon University, former ASP Lead Architect\n  and Project Lead, co-developer of the Vision Workbench)\n- Matthew Hancher (NASA, co-developer of the Vision Workbench)\n- Dr. Ara Nefian (NASA/Carnegie Mellon University, wrote the Bayes EM subpixel mode \n  and the early version of Shape-from-Shading)\n- Mike Lundy (NASA/Stinger-Ghaffarian Technologies)\n- Dr. Laurence Edwards (NASA, former IRG Terrain Reconstruction Lead)\n- Monica Palaseanu-Lovejoy (USGS, lead the research on the bathymetry module, :numref:`bathy_intro`)\n- Dr. Randolph Kirk (USGS, contributed many insights to the shape-from-shading functionality, :numref:`sfs_usage`)\n- Yu Tao and Jan-Peter Muller (University College London, contributed the CASP-GO stereo processing system, :numref:`casp_go`)\n- Vinh To (NASA/Stinger-Ghaffarian Technologies)\n- Kyle Husmann (California Polytechnic State University)\n- Sasha Aravkin (Washington State University)\n- Aleksandr Segal (Stanford)\n- Patrick Mihelich (Stanford University)\n- Melissa Bunte (Arizona State University)\n- Matthew Faulkner (Massachusetts Institute of Technology)\n- Todd Templeton (UC Berkeley)\n- Morgon Kanter (Bard College)\n- Kerri Cahoy (Stanford University) \n- Ian Saxton (UC San Diego)\n- Trey Smith (NASA, lead the Astrobee and ISAAC projects, that resulted in the rig calibrator,\n  :numref:`rig_calibrator`)\n- `mstyer <https://github.com/mstyer>`_\n- `harguess <https://github.com/harguess>`_\n- David Shean (University of Washington)\n- Ben Smith (University of Washington)\n- Andrew Annex (Johns Hopkins University)\n- Joachim Meyer (University of Washington)\n- Jay Laura (USGS)\n- Shashank Bhushan (University of Washington)\n\nAcknowledgments\n---------------\n\nThe open source Stereo Pipeline leverages stereo image processing\nwork, led by Michael J. Broxton (NASA/CMU), Dr. Laurence Edwards\n(NASA), Eric Zbinden (formerly NASA/QSS Inc.), Dr. Michael Sims\n(NASA), and others in the Intelligent Systems Division at NASA Ames\nResearch Center. It has benefited substantially from the contributions\nof Dr. Keith Nishihara (formerly NASA/Stanford), Randy Sargent\n(NASA/Carnegie Mellon University), Dr. Judd Bowman (formerly NASA/QSS\nInc.), Clay Kunz (formerly NASA/QSS Inc.), and Dr. Matthew Deans\n(NASA).\n\nThe initial adaptation of Ames's stereo surface reconstruction tools to\norbital imagers was a result of a NASA funded, industry led project to\ndevelop automated DEM generation techniques for the MGS mission. Our\nwork with that project's Principal Investigator, Dr. Michael Malin of\nMalin Space Science Systems (MSSS), and Co-Investigator, Dr. Laurence\nEdwards of NASA Ames, inspired the idea of making stereo surface\nreconstruction technology available and accessible to a broader\ncommunity. We thank Dr. Malin and Dr. Edwards for providing the initial\nimpetus that in no small way made this open source stereo pipeline\npossible, and we thank Dr. Michael Caplinger, Joe Fahle and others at\nMSSS for their help and technical assistance.\n\nThe tools for rig calibration (:numref:`rig_calibrator`), fusion of\npoints clouds into meshes (:numref:`multi_stereo`), and texturing of\nmeshes (:numref:`texrecon`), were originally developed as part of the\nNASA ISAAC project, with Trey Smith as project manager, and rely\nheavily on third-party packages, including Theia SfM, Ceres Solver,\nVoxBlox, and MVS Texturing.\n\nWe'd also like to thank our friends and collaborators Dr. Randolph\nKirk, Dr. Brent Archinal, Trent Hare, Mark Rosiek, and David Mayer\nof the United States Geological Survey's (USGS's) Astrogeology\nScience Center in Flagstaff, AZ, for their encouragement and\nwillingness to share their experience and expertise by answering\nmany of our technical questions. We also thank them for their ongoing\nsupport and efforts to help us evaluate our work. Thanks also to\nthe USGS ISIS team, especially Jeff Anderson, Kris Becker, Jay\nLaura, and Jesse Mapel, for their help in integrating stereo pipeline\nwith the USGS ISIS software package.\n\nThanks go also to Dr. Mark Robinson, Jacob Danton, Ernest\nBowman-Cisneros, Dr. Sam Laurence, and Melissa Bunte at Arizona\nState University for their help in adapting the Ames Stereo Pipeline\nto lunar data sets including the Apollo Metric Camera.\n\nWe'd also like to thank Dr. David Shean, Dr. Ben Smith, and Dr. Ian\nJoughin of the Applied Physics Laboratory at the University of\nWashington for providing design direction for adapting Ames Stereo\nPipeline to Earth sciences.\n\nFinally, we thank Dr. Ara Nefian, and Dr. Laurence Edwards for their\ncontributions to this software, and Dr. Terry Fong (IRG Group Lead\nduring the first decade or so of ASP's existence) for his management\nand support of the open source and public software release process.\n\nPortions of this software were developed with support from the\nfollowing sources from NASA Science Mission Directorate (SMD) and\nExploration Systems Mission Directorate (ESMD) funding sources:\n\n- Mars Technology Program\n- Mars Critical Data Products Initiative \n- Mars Reconnaissance Orbiter mission\n- Applied Information Systems Research program grant #06-AISRP06-0142\n- Lunar Advanced Science and Exploration Research (LASER) program grants \n  #07-LASER07-0148 and #11-LASER11-0112\n- ESMD Lunar Mapping and Modeling Program (LMMP)\n- SMD Cryosphere Program\n- The Resource Prospector site selection activity\n- The VIPER mission site selection activity\n- NASA-USGS Interagency Agreement #NNH16AC13I to support the Community \n  Sensor Model (CSM) work (2019-2021).\n- Planetary Data Archiving and Tools program (PDART) grant #19-PDART19_2-0094\n  under Dr. Ross Beyer (2020-2022).\n- NASA-USGS Interagency Agreement #30499, SAA2-403489 to support the satellite-derived\n  bathymetry work (2020-2021)\n- NASA-USGS Interagency Agreement #NNH22OB02A to support interoperability between ISIS\n  and ASP (2022-)\n- Decadal Survey Incubation for global Surface Topography and Vegetation (STV) grant #21-DSI-21-0008 under Dr. David Shean (2022-2025)\n- Support for Open Source Tools, Frameworks, and Libraries (OSTFL) grant #20-OSTFL20-0050\n  under Dr. Ross Beyer (2023-2024)\n\nAny opinions, findings, and conclusions or recommendations expressed in\nthis documentation are those of the authors and do not necessarily\nreflect the views of the National Aeronautics and Space Administration.\n"
  },
  {
    "path": "CMakeLists.txt",
    "content": "cmake_minimum_required (VERSION 3.15.5)\n\nproject(StereoPipeline)\n\nif(APPLE)\n    cmake_policy(SET CMP0025 NEW) \n    set(CMAKE_OSX_DEPLOYMENT_TARGET 10.15)\nendif(APPLE)\n\n# Make it possible to append to these from the command line\nset(CMAKE_CXX_FLAGS \"\" CACHE STRING \"\")\nset(CMAKE_C_FLAGS \"\" CACHE STRING \"\")\n\nset(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -O3 -std=c++17 -DNDEBUG\")\nset(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} -O3\")\nset(CMAKE_EXE_LINKER_FLAGS \"${CMAKE_EXE_LINKER_FLAGS} -pthread -lpthread\")\n\n# VisionWorkbench cannot be built with latest OpenEXR due to API changes.\n# The few places where this library was used were changed to use text files\n# instead of .exr files. So we disable OpenEXR support by default.\nset(USE_OPENEXR OFF CACHE BOOL \"Use EXR (default OFF)\")\n\nset(USE_ISIS ON CACHE BOOL \"Use ISIS (default ON)\")\nset(CORE_ASP_ONLY OFF CACHE BOOL \"Build only core ASP (default OFF)\")\n\nif (APPLE)\n    # A workaround for the clang included with conda build\n    set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -mlinker-version=305\")\n    set(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} -mlinker-version=305\")\n    set(CMAKE_EXE_LINKER_FLAGS \"${CMAKE_EXE_LINKER_FLAGS} -mlinker-version=305\")\n    # Prevent a pedantic error in recent clang\n    set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -Wno-enum-constexpr-conversion\")\n    # This a bugfix for spdlog issues\n    set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -DFMT_USE_CHAR8_T=0\")\nelse()\n    # On Linux need to link to additional libraries\n    set(CMAKE_EXE_LINKER_FLAGS \"${CMAKE_EXE_LINKER_FLAGS} -lm -lrt -lgcc_s\")\nendif()\n\n# Tell cmake to look in the /cmake folder.\nlist(APPEND CMAKE_MODULE_PATH \"${CMAKE_SOURCE_DIR}/cmake\")\n\n# Make sure we do a release type\nset(CMAKE_BUILD_TYPE \"Release\")\nmessage(\"Setting CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}\")\n\nadd_subdirectory(src)\n\ninstall(FILES \"AUTHORS.rst\" DESTINATION ${CMAKE_INSTALL_PREFIX})\ninstall(FILES \"INSTALLGUIDE.rst\" DESTINATION ${CMAKE_INSTALL_PREFIX})\ninstall(FILES \"LICENSE\" DESTINATION ${CMAKE_INSTALL_PREFIX})\ninstall(FILES \"NEWS.rst\" DESTINATION ${CMAKE_INSTALL_PREFIX})\ninstall(FILES \"README.rst\" DESTINATION ${CMAKE_INSTALL_PREFIX})\ninstall(FILES \"stereo.default.example\" DESTINATION ${CMAKE_INSTALL_PREFIX})\ninstall(FILES \"THIRDPARTYLICENSES.rst\" DESTINATION ${CMAKE_INSTALL_PREFIX})\ninstall(DIRECTORY \"examples\" DESTINATION ${CMAKE_INSTALL_PREFIX})\n\n# Install only the .rst files as images take too much space\ninstall(DIRECTORY \"docs\" DESTINATION ${CMAKE_INSTALL_PREFIX}\n    FILES_MATCHING PATTERN \"*.rst\")\n\n# Install the plugins directory and the files in it\ninstall(DIRECTORY DESTINATION ${CMAKE_INSTALL_PREFIX}/plugins/stereo)\ninstall(FILES \"plugins/stereo/plugin_list.txt\"\n        DESTINATION ${CMAKE_INSTALL_PREFIX}/plugins/stereo)\n\n# Make a directory for wv_correct data and copy that data to it\ninstall(DIRECTORY DESTINATION ${CMAKE_INSTALL_PREFIX}/share/wv_correct)\ninstall(FILES \"src/asp/WVCorrect/ms_correction_lookup.txt\"\n        DESTINATION ${CMAKE_INSTALL_PREFIX}/share/wv_correct)\ninstall(FILES \"src/asp/WVCorrect/WV02_BAND3_CCD_CORR.tif\"\n        DESTINATION ${CMAKE_INSTALL_PREFIX}/share/wv_correct)\ninstall(FILES \"src/asp/Camera/tests/ctx.json\"\n        DESTINATION ${CMAKE_INSTALL_PREFIX}/share/tests)\n\n# Install the default CASP-GO params\ninstall(FILES \"src/asp/Gotcha/CASP-GO_params.xml\"\n        DESTINATION ${CMAKE_INSTALL_PREFIX}/share)\n"
  },
  {
    "path": "CODE_OF_CONDUCT.rst",
    "content": "====================================\nContributor Covenant Code of Conduct\n====================================\n\nOur Pledge\n----------\n\nWe as members, contributors, and leaders pledge to make participation in our\ncommunity a harassment-free experience for everyone, regardless of age, body\nsize, visible or invisible disability, ethnicity, sex characteristics, gender\nidentity and expression, level of experience, education, socio-economic status,\nnationality, personal appearance, race, caste, color, religion, or sexual\nidentity and orientation.\n\nWe pledge to act and interact in ways that contribute to an open, welcoming,\ndiverse, inclusive, and healthy community.\n\n\nOur Standards\n-------------\n\nExamples of behavior that contributes to a positive environment for our\ncommunity include:\n\n- Demonstrating empathy and kindness toward other people\n- Being respectful of differing opinions, viewpoints, and experiences\n- Giving and gracefully accepting constructive feedback\n- Accepting responsibility and apologizing to those affected by our mistakes,\n  and learning from the experience\n- Focusing on what is best not just for us as individuals, but for the overall\n  community\n\nExamples of unacceptable behavior include:\n\n- The use of sexualized language or imagery, and sexual attention or advances of\n  any kind\n- Trolling, insulting or derogatory comments, and personal or political attacks\n- Public or private harassment\n- Publishing others' private information, such as a physical or email address,\n  without their explicit permission\n- Other conduct which could reasonably be considered inappropriate in a\n  professional setting\n\n\nEnforcement Responsibilities\n----------------------------\n\nCommunity leaders are responsible for clarifying and enforcing our standards of\nacceptable behavior and will take appropriate and fair corrective action in\nresponse to any behavior that they deem inappropriate, threatening, offensive,\nor harmful.\n\nCommunity leaders have the right and responsibility to remove, edit, or reject\ncomments, commits, code, wiki edits, issues, and other contributions that are\nnot aligned to this Code of Conduct, and will communicate reasons for moderation\ndecisions when appropriate.\n\n\nScope\n-----\n\nThis Code of Conduct applies within all community spaces, and also applies when\nan individual is officially representing the community in public spaces.\nExamples of representing our community include using an official email address,\nposting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event.\n\n\nEnforcement\n-----------\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported to the community leaders responsible for enforcement listed\nas the Project Lead or members of the Core Development Team in the AUTHORS.rst\nfile.\nAll complaints will be reviewed and investigated promptly and fairly.\n\nAll community leaders are obligated to respect the privacy and security of the\nreporter of any incident.\n\n\nEnforcement Guidelines\n----------------------\n\nCommunity leaders will follow these Community Impact Guidelines in determining\nthe consequences for any action they deem in violation of this Code of Conduct:\n\n1. Correction\n~~~~~~~~~~~~~\n\n**Community Impact**: Use of inappropriate language or other behavior deemed\nunprofessional or unwelcome in the community.\n\n**Consequence**: A private, written warning from community leaders, providing\nclarity around the nature of the violation and an explanation of why the\nbehavior was inappropriate. A public apology may be requested.\n\n2. Warning\n~~~~~~~~~~\n\n**Community Impact**: A violation through a single incident or series of\nactions.\n\n**Consequence**: A warning with consequences for continued behavior. No\ninteraction with the people involved, including unsolicited interaction with\nthose enforcing the Code of Conduct, for a specified period of time. This\nincludes avoiding interactions in community spaces as well as external channels\nlike social media. Violating these terms may lead to a temporary or permanent\nban.\n\n\n3. Temporary Ban\n~~~~~~~~~~~~~~~~\n\n**Community Impact**: A serious violation of community standards, including\nsustained inappropriate behavior.\n\n**Consequence**: A temporary ban from any sort of interaction or public\ncommunication with the community for a specified period of time. No public or\nprivate interaction with the people involved, including unsolicited interaction\nwith those enforcing the Code of Conduct, is allowed during this period.\nViolating these terms may lead to a permanent ban.\n\n\n4. Permanent Ban\n~~~~~~~~~~~~~~~~\n\n**Community Impact**: Demonstrating a pattern of violation of community\nstandards, including sustained inappropriate behavior, harassment of an\nindividual, or aggression toward or disparagement of classes of individuals.\n\n**Consequence**: A permanent ban from any sort of public interaction within the\ncommunity.\n\n\nAttribution\n-----------\n\nThis Code of Conduct is adapted from the `Contributor Covenant \n<https://www.contributor-covenant.org>`_ version 2.1, available at\nhttps://www.contributor-covenant.org/version/2/1/code_of_conduct.html.\n\nCommunity Impact Guidelines were inspired by `Mozilla's code of conduct\nenforcement ladder <https://github.com/mozilla/diversity>`_.\n\nFor answers to common questions about this code of conduct, see the FAQ at\nhttps://www.contributor-covenant.org/faq. Translations are available at\nhttps://www.contributor-covenant.org/translations.\n"
  },
  {
    "path": "CONTRIBUTING.rst",
    "content": "============\nContributing\n============\n\nContributions are welcome, and they are greatly appreciated! Every\nlittle bit helps, and credit will always be given.\n\nYou can contribute to ASP in many ways:\n\nTypes of Contributions\n----------------------\n\nReport Bugs or Ask for Features via Issues\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nWe want to hear from you!  You can report bugs, ask for new features,\nor just raise issues or concerns via logging an `Issue via our GitHub\nrepo <https://github.com/NeoGeographyToolkit/StereoPipeline/issues>`_.\n\n\nFix Bugs or Implement Features\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nLook through the GitHub Issues for bugs to fix or features to\nimplement.  If anything looks tractable to you, work on it.  Most (if\nnot all) pull requests should be based on an Issue, so if you're\nthinking about doing some coding on a topic that isn't covered in an\nIssue, please author one so you can get some feedback while you work\non your pull request.\n\nWrite Documentation\n~~~~~~~~~~~~~~~~~~~\n\nASP could always use more documentation, whether as part of the\nofficial docs, on the web in blog posts, articles, and such.\n\nSubmit Feedback\n~~~~~~~~~~~~~~~\n\nThe best way to send feedback is to file an `Issue\n<https://github.com/NeoGeographyToolkit/StereoPipeline/issues>`_.\n\nGet Started!\n------------\n\nReady to contribute? \n\nYou'll need to follow the instructions for building ASP from source,\nwhich can be found in the INSTALLGUIDE.rst file or the Installation\nchapter of the documentation.\n\n1. Fork the `StereoPipeline` repo on GitHub.\n\n2. Clone your fork locally::\n\n    $ git clone git@github.com:your_name_here/StereoPipeline.git\n\n3. Create a branch for local development::\n\n    $ git checkout -b name-of-your-bugfix-or-feature\n\n   Now you can make your changes locally.\n\n4. When you're done making changes, check that your changes pass a run\n   of `make gtest_all` (though note that the unit tests have been\n   broken recently so this won't work).\n\n5. Commit your changes and push your branch to GitHub::\n\n    $ git add .\n    $ git commit -m \"Your detailed description of your changes.\"\n    $ git push origin name-of-your-bugfix-or-feature\n\n6. Submit a `pull request <https://github.com/NeoGeographyToolkit/StereoPipeline/pulls>`_.\n\n\nPull Request Guidelines\n-----------------------\n\nBefore you submit a pull request, check that it meets these guidelines:\n\n1. The pull request should include tests.\n2. If the pull request adds functionality, the docs should be updated. \n   Add the feature to the list in NEWS.rst and potentially update the\n   README.rst or other documentation files.\n\nWhat to expect\n--------------\n\nOur development of ASP is neither continuous, nor as well-funded as we\nmight like, and it is entirely possible that when you submit a PR\n(pull request), none of us will have the time to evaluate or integrate\nyour PR.  If we don't, we'll try and communicate that with you via the\nPR.\n\nFor large contributions, it is likely that you, or your employer,\nwill be retaining your copyrights, but releasing the contributions\nvia an open-source license.  It must be compatible with the Apache-2\nlicense that ASP is distributed with, so that we can redistribute\nthat contribution with ASP, give you credit, and make ASP even\nbetter!  Please contact us if you have a contribution of that nature, \nso we can be sure to get all of the details right.\n\nFor smaller contributions, where you (or your employer) are not\nconcerned about retaining copyright (but we will give you credit!),\nyou will need to fill out a Contributor License Agreement (CLA)\nif we plan to accept your PR.  The CLA assigns your copyright in\nyour contribution to NASA, so that our NASA copyright statement\nremains true:\n\n    Copyright (c) YEAR, United States Government as represented by the \n    Administrator of the National Aeronautics and Space Administration.\n    All rights reserved.\n\nThere is an `Individual CLA <https://github.com/NeoGeographyToolkit/StereoPipeline/blob/master/docs/ASP_Individual_CLA.pdf>`_ and a `Corporate CLA\n<https://github.com/NeoGeographyToolkit/StereoPipeline/blob/master/docs/ASP_Corporate_CLA.pdf>`_.\n\nASP People\n----------\n\n- An ASP **Contributor** is any individual creating or commenting\n  on an issue or pull request.  Anyone who has authored a PR that was\n  merged should be listed in the AUTHORS.rst file.  \n\n- An ASP **Committer** is a subset of contributors, typically NASA\n  employees or contractors, who have been given write access to the\n  repository.\n"
  },
  {
    "path": "ChangeLog",
    "content": ""
  },
  {
    "path": "INSTALLGUIDE.rst",
    "content": "Installation\n============\n\nPrecompiled binaries are available for the stable releases and the current\ndevelopment build. Conda packages exist for the stable versions\n(:numref:`conda_intro`).\n\n.. _release:\n\nPrecompiled binaries\n--------------------\n\nLinux\n~~~~~\n \nChoose either the latest build (recommended) or a stable release\nfrom:\n\n- `<https://github.com/NeoGeographyToolkit/StereoPipeline/releases>`_\n\nNo installation steps or administrative rights are necessary.  Extract\nthe archive, and run the executables in the ``bin`` subdirectory as::\n\n    tar xvf StereoPipeline-3.6.0-2025-12-26-x86_64-Linux.tar.bz2\n    ./StereoPipeline-3.6.0-2025-12-26-x86_64-Linux/bin/stereo --help\n\nThe result of the last command should be a help message.\n\nTo permanently add the ASP executable subdirectory to your PATH, add to your\nshell configuration (e.g., ``~/.bashrc``), a line similar to::\n\n    export PATH=\"${PATH}\":\"/path/to/StereoPipeline/bin\"\n\nThen, run ``source ~/.bashrc`` (or open a new terminal) for the changes to take\neffect.\n\nThe latest additions are documented in :numref:`news`.\n\nMacOS\n~~~~~\n\nASP is available for the Mac Intel and Mac Arm architectures. The latter is\nsomewhat experimental but was shown to work well in testing. The Mac Arm package\nhas all ASP logic except the minor ``libelas`` stereo algorithm\n(:numref:`libelas`).\n\nThe installation steps are the same as for Linux. It is important to \nnote that:\n\n- An error may be shown about not being able to verify the developers. That can\n  be overridden in the Privacy & Security settings of the system. Consider using \n  instead the conda-based installation (:numref:`conda_intro`), which should \n  not have this issue.\n \n- Running the Intel build the first time will be slow, as Rosetta will\n  translate the instructions to the native architecture. Subsequent runs will be\n  faster.\n\nWindows\n~~~~~~~\n\nASP does not offer Windows binaries. However, the Linux build can be run on\nWindows using the `Windows Subsystem for Linux\n<https://learn.microsoft.com/en-us/windows/wsl/install>`_ (WSL). Once a recent\nLinux distribution is installed and verified to work, the installation steps are\nthe same as for Linux.\n\n.. _conda_intro:\n\nConda-based installation\n------------------------\n\nThe ASP 3.6.0 release (December 26, 2025) can be installed via conda, together with\nISIS 9.0.0 (:numref:`planetary_images`) for Linux, Mac Intel, and Mac Arm.\n\nThe Mac Arm release is experimental but was tested rather thoroughly. Since USGS\ndid not release an ISIS version for Mac Arm (as of 12/2025), this is shipped\nwith an unofficial ISIS Arm conda package, hosted on the\n``nasa-ames-stereo-pipeline`` channel. This one lacks the Kakadu JPEG2000\nlibrary support. Consider using the Intel release under Rosetta 2 for\nmission-critical work.\n\nTo install ``conda``, see:\n\n    https://docs.conda.io/en/latest/miniconda.html\n\nMake the fetched installation file executable and run it, such as::\n\n    chmod u+x ./Miniconda3-latest-Linux-x86_64.sh\n    ./Miniconda3-latest-Linux-x86_64.sh\n\non Linux, and analogously on OSX. Use the suggested::\n\n    $HOME/miniconda3\n\ndirectory for installation. \n\nConfigure the conda channels::\n\n    conda config --env --add channels conda-forge\n    conda config --env --add channels usgs-astrogeology\n    conda config --env --add channels nasa-ames-stereo-pipeline\n\nDo not skip doing each of these three, even if you think you already\nhave some of these channels.\n\nRun::\n\n    conda config --show channels\n\nto ensure that the order of channels is::\n\n    - nasa-ames-stereo-pipeline\n    - usgs-astrogeology\n    - conda-forge\n\n*Not having the channels in this order is likely to result in failure to install\nASP.* Do not use the ``defaults`` channel.\n\nInstall ASP with the commands::\n\n    conda config --set channel_priority flexible\n    conda create -n asp            \\\n      -c nasa-ames-stereo-pipeline \\\n      -c usgs-astrogeology         \\\n      -c conda-forge               \\\n      -c defaults                  \\\n      stereo-pipeline=3.6.0\n\nThis will create a new environment named ``asp`` and install ASP 3.6.0 together \nwith ISIS 9.0.0 and all other dependencies.   \n\nThe priority setting is set to ``flexible``, as otherwise conda can get confused \nif the same package (even with old versions) exists in more than one channel.\n  \nNote that the *latest build* (:numref:`release`) may have more features and\nfixes than this official release.\n\nEnvironment setup\n~~~~~~~~~~~~~~~~~\n\nRun::\n\n  conda activate asp\n  \nand set::\n\n    export ISISROOT=$CONDA_PREFIX\n\nin any new shell. These should put the ASP binaries in the path, and will also\ninitialize various environmental variables, including ``ISISROOT`` and  \n``PROJ_DATA``.\n\nCheck if the ``stereo`` command is found by running::\n\n    which stereo\n\nWhen working with planetary images with ISIS, the ``ISISDATA`` environmental\nvariable also needs to be set (:numref:`planetary_images`). For more information\nsee the `ISIS installation instructions\n<https://github.com/USGS-Astrogeology/ISIS3>`_.\n\nAlternative approaches\n~~~~~~~~~~~~~~~~~~~~~~\n  \nConsider using ``mamba`` instead of ``conda`` for the installation, as it is\nmuch faster. (Note that recent ``conda`` distributions default to using the\n``mamba`` solver.)\n\nASP can be installed with Docker (`instructions\n<https://github.com/uw-cryo/asp-binder>`_).\n\nASP can be built from source (:numref:`building_asp`).\n\nPost-installation\n-----------------\n \nThe next steps depend on whether it is desired to process planetary (non-Earth),\nEarth, or aerial images.\n \n.. _planetary_images:\n\nPlanetary images\n~~~~~~~~~~~~~~~~\n\nTo process images from NASA's spacecraft that are exploring other planets,\ninstall ISIS and its data. Summary of the steps:\n\n#. Fetch ISIS binaries and install, following\n   https://github.com/DOI-USGS/ISIS3#installation\n\n#. Fetch ISIS data, as detailed at\n   https://github.com/DOI-USGS/ISIS3#the-isis-data-area\n\n#. Add the ISIS executables to your path:\n\n   - bash: ``export PATH=\"/path/to/isis/bin:${PATH}\"``\n   - csh:  ``setenv PATH \"/path/to/isis/bin:${PATH}\"``\n\n#. Set the ``ISISDATA`` environmental variable to point to where your\n   ISIS data was downloaded, per the installation link above. For\n   example, in the ``bash`` shell, this is done as follows::\n  \n     export ISISDATA=\"/path/to/isisdata\"\n   \n   Check that you have the directory ``$ISISDATA/base``.\n\n#. Install Stereo Pipeline and set the ``PATH`` variable as above.\n\n#. Try it out. See :numref:`lronac_csm` for a quick Lunar example which does not\n   require installing ISIS or it supporting data as above,\n   :numref:`moc_tutorial` for an example using Mars images and ISIS data, and\n   many other examples in :numref:`examples`.\n\nEarth images\n~~~~~~~~~~~~\n\nProcessing Earth images is described in the data processing tutorial in\n:numref:`dg_tutorial`. See also examples for ASTER (:numref:`aster`), Pleiades\n(:numref:`pleiades`), SkySat (:numref:`skysat`), and many more in\n:numref:`examples`.\n\nAerial and historical images\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nFetch the software as above. Processing images without accurate camera\npose information is described in :numref:`sfm`. See also examples for \ndeclassified satellite images in :numref:`kh4`.\n\n.. _system_rec:\n\nSystem requirements\n-------------------\n\nTo run ASP, a computer cluster sharing storage and connected via ssh is needed\n(:numref:`pbs_slurm`).\n\nAs a rule of thumb, for images on the order of 20,000 x 20,000 pixels, a machine\nwith 40 GB of RAM 16 cores could likely produce a terrain model in 4 - 20 hours.\nThere is a lot of uncertainty here, and much depends on the choice of the stereo\nalgorithm (:numref:`stereo_alg_overview`), and if mapprojection is employed\n(:numref:`mapproj-example`).\n\n1 TB of storage or more is suggested.\n\nCommon errors\n-------------\n\nHere are some errors you might see, and what it could mean. Treat these\nas templates for problems. In practice, the error messages might be\nslightly different.\n\n::\n\n    Error: **ERROR** Unable to initialize camera model in Camera Factory.\n\n    **PROGRAMMER ERROR** Unable to create a shape model from \n      given target and pvl.\n\n    **I/O ERROR** Unable to open [$ISISDATA/<Some/Path/Here>].\n    Stereo step 0: Preprocessing failed\n\nYou need to set up your ISIS environment or manually set the correct\nlocation for ``ISISDATA`` (:numref:`planetary_images`).\n\n::\n\n    bash: stereo: command not found\n\nYou need to add the ``bin`` directory of your deployed Stereo Pipeline\ninstallation to the environmental variable ``PATH``\n(:numref:`planetary_images`).\n\n::\n\n    /bin/sh: camrange: command not found\n\nYou need to to add the ``bin`` directory of your ISIS installation to your path (:numref:`planetary_images`).\n\n::\n\n    Cache size (500 MB) is larger than the requested maximum cache size\n\nConsider increasing ``--cache-size-mb`` for your program.\nThis also may be a sign of large input TIF images being stored\nin blocks as tall or as wide as the image. The storage scheme of\nan image can be examined with the ``gdalinfo -stats`` command,\nand an image can be rewritten with square blocks using the command::\n\n    gdal_translate -co compress=lzw -co TILED=yes -co INTERLEAVE=BAND \\\n      -co BLOCKXSIZE=256 -co BLOCKYSIZE=256 input.tif output.tif\n\nIf the new images are used instead, that warning should go away and\nthe processing time should go down. Both ``gdalinfo`` and\n``gdal_translate`` are included with ASP.\n"
  },
  {
    "path": "LICENSE",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "NEWS.rst",
    "content": "Changes since last release\n--------------------------\n\nAdded a new program for distributed stereo processing across computing nodes\n(:numref:`stereo_dist`).\n\nAdded a new program to study parameter sensitivity by running stereo on small\npatches with different parameter combinations (:numref:`stereo_sweep`).\n\nAdded the ``asp_plot`` package for generating diagnostic plots and PDF reports\nfrom ASP outputs (:numref:`asp_plot`).\n\nAdded cloud-optimized GeoTIFF (COG) support via the ``--cog`` option to\n``point2dem``, ``mapproject``, etc. (:numref:`cog_output`).\n\nAdded support for plain-text match files (:numref:`txt_match`).\n\nAdded support for SPOT 6 and 7 exact linescan camera models (:numref:`spot67`).\n\nMigrated SPOT 5 to a CSM linescan camera model (:numref:`spot5`). This enables\nuse of ``jitter_solve`` (:numref:`jitter_pleiades`).\n\nMigrated PeruSat-1 to a CSM linescan camera model (:numref:`perusat1`). This\nenables use of ``jitter_solve`` (:numref:`jitter_pleiades`).\n\nFor the ASTER camera (:numref:`aster`), removed the ``--aster-use-csm`` option\nas that is the default. Removed the use of the helper RPC model for interest\npoint matching.\n\nsfm_view (:numref:`sfm_view`):\n  * Brought the source code into the ASP repository from the external\n    MultiView dependency.\n  * Input images are no longer required. Only camera files are needed.\n\naster2asp (:numref:`aster2asp`):\n  * Added support for ASTER Level 1A V004 HDF format.\n\nbathymetry (:numref:`bathy_intro`):\n  * Added a program for computing the effective refraction index of water \n    for a satellite band (:numref:`refr_index`).\n  * Added documentation on alternative spectral indices for water masking\n    (:numref:`bathy_water_masking`).\n    \nbathy_plane_calc (:numref:`bathy_plane_calc`):\n  * Refined the algorithm by taking into account that given a mask of land\n    pixels, the true water interface is somewhere half way between those and the\n    water pixels.\n  * Added the option ``--ortho-mask`` to use a georeferenced orthoimage\n    mask and a DEM to estimate the water plane (:numref:`bathy_plane_ortho_mask`).\n  * Added the option ``--lon-lat-measurements`` to use a CSV file with\n    longitude and latitude measurements and lookup heights in a DEM\n    (:numref:`bathy_plane_lonlat`).\n  * Removed the option ``--use-ecef-water-surface``. It is now always assumed\n    that the bathy plane is computed in local projected coordinates.\n    \ncam_test (:numref:`cam_test`):\n  * Added the options ``--bathy-plane`` and ``--refraction-index`` to model\n    bathymetry correction with ray bending according to Snell's law.\n\nbundle_adjust (:numref:`bundle_adjust`):\n  * Replaced ``--save-cnet-as-csv`` with ``--save-cnet-as-gcp``. The control\n    network is now saved after optimization and outlier filtering, with\n    optimized triangulated point positions, including any input GCP.\n  * Added bathymetry support (:numref:`ba_bathy`).\n\njitter_solve (:numref:`jitter_solve`):\n  * Added ``--save-cnet-as-gcp`` to save the optimized control network in\n    GCP format, after outlier filtering (:numref:`bagcp`).\n\nipfind (:numref:`ipfind`):\n  * Added the option ``--binary-to-txt`` to convert .vwip files to text.\n\nipmatch (:numref:`ipmatch`):\n  * Added options for converting match files between binary and text formats\n    (:numref:`ipmatch_convert`).\n  * Added an option for merging match files (:numref:`ipmatch_merge`).\n\nimage_calc (:numref:`image_calc`):\n  * Added the option ``--stretch`` to stretch an image and save it with 8-bit\n    pixels, for visualization purposes (:numref:`image_calc_stretch`).\n  * For a single input image, the option ``-c`` (calculation operation) defaults\n    to ``var_0`` (identity operation).\n  * The default output data type is now ``float32`` (previously ``float64``).\n\ndisparitydebug (:numref:`disparitydebug`):\n  * Added the option ``--raw`` to extract the horizontal and vertical\n    disparities without normalization (:numref:`raw_disp`).\n\npc_align (:numref:`pc_align`):\n  * Print to the terminal and the log file the following initial and final\n    error stats: Mean, StdDev, RMSE, Median, NMAD.\n  * Changed the default for ``--diff-rotation-error`` from 1e-8 to 1e-5 degrees,\n    to avoid slow convergence in some cases due to numerical precision issues.\n\nparallel_stereo (:numref:`parallel_stereo`):\n  * Added the option ``--proj-win`` to limit stereo to a projection window for\n    mapprojected images (:numref:`stereodefault`).\n  * The logic for consolidating the output directory has been given its own\n    stage (:numref:`entrypoints`).\n  * The DEM for mapprojected images can be set with ``--dem`` instead of as the\n    last positional argument (:numref:`mapproj-example`).\n\nsfs (:numref:`sfs`):\n  * Recommend the variance-based uncertainty estimation (:numref:`sfs_unc`).\n  * Added the option ``--save-covariances`` (:numref:`sfs_opt`).\n\nrig_calibrator (:numref:`rig_calibrator`):\n  * Replaced ``--camera-position-weight`` with ``--camera-position-uncertainty``. \n  * Added the option ``--heights-from-dem`` to constrain triangulated points\n    relative to a DEM.\n  * Added an example of an orbital rig with a DEM constraint (:numref:`orbital_rig`).\n  * All command-line options now use dashes instead of underscores. For example,\n    ``--out_dir`` is now ``--out-dir``.\n\ntheia_sfm (:numref:`theia_sfm`):\n  * Made the SfM reconstruction deterministic by passing a fixed random seed\n    to TheiaSfM. Previously, results could vary between runs due to time-based\n    random seeding in RANSAC.\n  * All command-line options now use dashes instead of underscores. For example,\n    ``--rig_config`` is now ``--rig-config``.\n\ncamera_solve (:numref:`camera_solve`):\n  * Made the SfM reconstruction deterministic by passing a fixed random seed\n    to TheiaSfM. Previously, results could vary between runs due to time-based\n    random seeding in RANSAC.\n\nparse_match_file.py (:numref:`parse_match_file`):\n  * When converting from binary to text, descriptors are no longer saved by\n    default. Use the ``--save-descriptors`` option to include them.\n    \nstereo_gui (:numref:`stereo_gui`):\n  * The ``--colorize`` and ``--colorbar`` options now work with overlaid and\n    georeferenced images. Added ``--no-colorize`` (:numref:`colorize`).\n\nmapproject (:numref:`mapproject`):\n  * Documented compatibility with the upcoming ISIS ``cam2map asp_map=true``\n    option, which uses the same per-pixel projection algorithm\n    (:numref:`mapproj_isis`).\n  * Consistently handle ISIS special pixels in ``.cub`` input images.\n\nMisc:\n  * Greatly improved the speed of parsing WorldView and SPOT5 XML camera files.\n  * Removed the unused and undocumented option ``--use-least-squares`` for ray\n    triangulation in stereo and bundle adjustment.\n  * Added the option ``--bathy-plane-list`` to supplement ``--bathy-plane``\n    to various programs.\n  * Removed the old qi2txt program for reading IceBridge QFIT binary data.\n  * Removed unused quad-tree tile generators and visualization formats (TOAST,\n    Celestia, Gigapan, GMap, TMS, Uniview) from VisionWorkbench. Only KML is\n    kept for ``image2qtree``.\n  * Do not use more than 128 threads in ``parallel_stereo``, as OpenBlas\n    fails then.\n  * Removed the undocumented ``dem_mosaic`` options ``--first-dem-as-reference``\n    and ``--this-dem-as-reference``.\n  * The ``--t_projwin`` option in ``mapproject`` no longer subtracts one\n    grid size from the maximum, so the requested extent is fully covered.\n  * Much removal of templates and breaking up of functions and files into smaller\n    and better-organized components.\n  * Removed the unused HDR module, Python SWIG bindings, and legacy tools\n    (contourgen, blend, bayer, learnpca, doc-generate) from VisionWorkbench.\n  * Removed the ``grassfirealpha`` tool from VisionWorkbench. Simplified\n    ``image2qtree`` to produce uint8 RGBA output, removing the\n    ``--channel-type`` and ``--terrain`` options.\n  * Removed the unused ``georef`` tool from VisionWorkbench.\n  * Removed the ``--preserve-pixel-type`` option from ``undistort_image``.\n  * Removed the ``slopemap`` tool from VisionWorkbench. Use ``gdaldem slope``\n    and ``gdaldem aspect`` instead.\n  * Removed the ``hsv_merge`` tool. Use ``gdaldem color-relief`` with\n    ``gdaldem hillshade`` for similar results.\n  * Removed the unused ``PixelHSV`` and ``PixelLuv`` pixel types from\n    VisionWorkbench.\n  * Updated from Qt5 to Qt6.\n\nRELEASE 3.6.0, December 26, 2025\n--------------------------------\n\nDOI: https://zenodo.org/records/18064111\n\nStable release doc: https://stereopipeline.readthedocs.io/en/stable/index.html\n\n - Available for Linux, Mac Intel, and Mac Arm (the latter is experimental).\n - Includes ISIS 9.0.0 (experimental for Mac Arm), GDAL 3.8.1 and PDAL 2.9.3.\n\ncamera_solve (:numref:`camera_solve`):\n  * Works on Mac Arm.\n  * Removed dependency on OpenImageIO.\n\nparallel_stereo (:numref:`parallel_stereo`):\n  * Added an example for JunoCam images (:numref:`junocam`).\n  * Added examples for the Chandrayaan-2 lunar orbiter (:numref:`chandrayaan2`).\n  * Rewrote the KH-9 example to take into account the improved modeling of\n    optical bar cameras and a new strategy for fixing local warping\n    (:numref:`kh9`).\n  * Added a status file that shows the progress in processing tiles\n    (:numref:`stereo_diag`).\n  * Added an output shapefile that shows the tiles being processed\n    (:numref:`stereo_diag`).\n  * Left and right alignment matrices are now saved in plain text format. Older\n    .exr files can no longer be read (:numref:`outputfiles`).\n  * Erode less at at image boundary during filtering when ``--subpixel-mode`` is\n    not between 1 and 6 (option ``--edge-buffer-size``,\n    :numref:`filter_options`).\n  * Determination of interest point matches is optional when either\n    ``--corr-search`` or ``--seed-mode 2`` are set\n    (:numref:`stereodefault`).\n    \nparallel_sfs (:numref:`parallel_sfs`):\n  * When albedo and / or haze is modeled, initial estimates for these are\n    produced for the full site (:numref:`parallel_sfs_usage`).\n\nsfs (:numref:`sfs`):\n  * Added the option ``--save-variances``, that saves the DEM variance\n    (and albedo variance, if albedo is floated).\n  * Added a method for removing seams in the SfS terrain (:numref:`sfs_seams`).\n  * Improved the documentation for how to measure and repair the misalignment\n    between the input DEM and output SfS DEM (:numref:`sfs_align_refine`). \n  * Added a documentation section for how to do registration based on an SfS\n    terrain to refine the alignment of this SfS DEM and the images\n    (:numref:`sfs_sim`).\n  * Options ``--albedo-constraint-weight`` and ``--albedo-robust-threshold`` are\n    respected when low-resolution initial albedo is estimated (with option\n    ``--estimate-exposure-haze-albedo``).\n  * Replaced ``--save-computed-intensity-only`` with ``--save-sim-intensity-only`` \n    and ``--save-meas-intensity-only``.\n  * Renamed ``comp-albedo-final.tif`` to ``albedo-final.tif``, for consistency with \n    other output files.\n  * Unused option ``--estimate-slope-errors`` got removed.\n\nparallel_bundle_adjust (:numref:`parallel_bundle_adjust`):\n  * Bugfix for a crash when there are no interest point matches.\n\nbundle_adjust (:numref:`bundle_adjust`):\n  * Added the option ``--max-gcp-reproj-err`` to remove GCPs with large\n    reprojection error.\n  * Changed the implementation of the camera position constraint\n    (:numref:`ba_cam_constraints`).\n  * Added the option ``--fixed-distortion-indices`` to control which lens \n    distortion parameters are kept fixed.\n  * The option ``--auto-overlap-params`` accepts an optional third argument (all\n    in quotes) that has the number of subsequent images that overlap to use in\n    matching. Also works with option ``--match-first-to-last``.\n  * For the option ``--mapprojected-data``, the DEM specified at the end is\n    optional, if it can be looked up from the geoheader of the mapprojected\n    images.\n    \npoint2dem (:numref:`point2dem`):\n  * Added support for LAS COPC files (:numref:`point2dem_las`).\n  * Added the option ``--gdal-tap``.\n  * Removed unused options: ``--phi-rotation``, ``--omega-rotation``, \n    ``--kappa-rotation``. A rotation matrix can be applied with ``pc_align``\n    instead.\n    \npc_align (:numref:`pc_align`):\n  * Added support for LAS COPC files (:numref:`pc_align_las`).\n  * The hillshade-based alignment uses by default ``gdaldem hillshade``\n    (:numref:`pc_hillshade`).\n  \ncam_gen (:numref:`cam_gen`):\n  * Can fit a CSM linescan camera to an OpticalBar camera\n    (:numref:`opticalbar2csm`).\n  * Can fit a CSM frame camera model with radial distortion.  \n  * Support pixel pitch that is not just 1 in CSM cameras. \n  * If the input is an ISIS cube and the output is a CSM camera, save the\n    ephemeris time, sun position, serial number, and target (planet) name.\n  * Added the option ``--camera-center-llh``.\n\nmapproject (:numref:`mapproject`):\n  * Added the option ``--gdal-tap``.\n  * Bugfix for erosion during mapprojection at DEM boundary when the DEM and\n    output image have the same grid size.\n  \ndem2gcp (:numref:`dem2gcp`):\n  * Added the options ``--max-num-gcp``, ``--max-disp``, ``--gcp-sigma-image``.\n  * Added the options ``--image-list``, ``--camera-list``,\n    ``--match-files-prefix``, and ``--clean-match-files-prefix`` to work\n    with multiple input images and matches.\n  * Added the option ``--max-pairwise-matches`` to control the maximum\n    number of matches loaded from any given match file.\n\njitter_solve (:numref:`jitter_solve`):\n  * Added documentation on limitations (:numref:`jitter_limitations`).\n  * Changed the implementation of the camera position constraint\n    (:numref:`jitter_camera`).\n  * Added the options ``--fix-gcp-xyz``, ``--use-lon-lat-height-gcp-error``.\n  * Changed the lens distortion model for ASTER cameras to be radial-tangential.\n    This produces better results after solving for jitter.\n\npoint2las (:numref:`point2las`):\n  * Added the option ``--dem`` to convert a DEM to LAS.\n\ndem_mosaic (:numref:`dem_mosaic`):\n  * Added the option ``--gdal-tap``.\n\ncamera_footprint (:numref:`camera_footprint`):\n  * Added the option ``--output-shp`` to save the convex hull of the camera \n    footprint as a shapefile.\n\nstereo_gui (:numref:`stereo_gui`):\n  * Added the option ``--zoom-all-to-same-region``.\n\nimage_align (:numref:`image_align`):\n  * Added the option ``--nodata-value``.\n  * Supports the same controls for interest point detection as\n    ``bundle_adjust`` (:numref:`image_align_opts`).\n  * The value of option ``--output-prefix`` is now required to be non-empty. It\n    is set by default to ``out_image_align/run``.\n\nimage_subset (:numref:`image_subset`):\n  * This program is now multi-threaded. Each image is read fully in memory for\n    speed.\n\nmisc:\n  * Added minimum system requirements for running ASP (:numref:`system_rec`).\n  * Made the OpticalBar model 3x faster by switching from minimization in 3D\n    to root-finding in 2D with the Newton-Raphson method.\n  * Turned off experimental ``--subpixel-mode 6`` as it is failing to run\n    (:numref:`subpixel_options`).\n  * Unused ``pca`` mode in ``ipfind`` got removed.\n  * Bugfix for modifying the creation time of ISIS cubes when it was meant to\n    only read them.\n  * Bugfix for when ``parallel_stereo`` has the same value for the output prefix\n    and bundle adjustment prefix.\n  * Bugfix for stereo triangulation when the point cloud is huge and has data\n    only in corners.\n\nRELEASE 3.5.0, April 28, 2025\n-----------------------------\n\nDOI: `10.5281/zenodo.15298734 <https://zenodo.org/records/15298734>`_\n\nStable release doc: https://stereopipeline.readthedocs.io/en/stable/index.html\n\n*New platform*: An experimental native Mac M1/M2 Arm64 build is available\n(:numref:`release`).\n  \nbundle_adjust (:numref:`bundle_adjust`):\n  * Replaced the algorithm for creating control networks when there are more\n    than two images. Notably more features in more than two images now can be\n    found.\n  * Added the option ``--save-adjusted-rpc`` to save RPC cameras with adjustments\n    applied to them (:numref:`rpc_and_ba`).\n  * Added the option ``--min-distortion`` to ensure small distortion parameters\n    get optimized.\n  * Added the option ``--max-triangulation-angle``.\n  * Compensate for the images in the input nvm being potentially in different\n    order than the images specified on the command line.  \n  * The report file measuring statistics of registration errors on the ground\n    got broken up into errors per image and per image pair\n    (:numref:`ba_mapproj_dem`).\n  \nparallel_bundle_adjust (:numref:`parallel_bundle_adjust`):\n   * The default number of processes per node is 1/4 of the number of cores on\n     the head node, and the default number of threads per process is the number\n     of cores on the head node over the number of processes.\n   * The number of launched jobs is number of nodes times number of processes\n     per node. This appears best for load balancing.  \n   * Create interest points (before matching) once per image, not each time per\n     image pair. This speeds up the processing.\n     \nmapproject (:numref:`mapproject`):\n  * If the input DEM is in the ``longlat`` projection, a projection \n    in meters is auto-determined (:numref:`mapproj_auto_proj`).\n  * Added the option ``--ref-map`` to borrow the grid size and projection from\n    an existing mapprojected image (:numref:`mapproj_refmap`).\n  * Add the option ``--query-pixel``.\n\njitter_solve (:numref:`jitter_solve`):\n  * Do two passes by default. This improves the results.\n  * Can model rig constraints between sensors (:numref:`jitter_rig`).\n  * Added an example for the Kaguya Terrain Camera (:numref:`jitter_kaguya`).\n  * Added the option ``--camera-position-uncertainty`` (:numref:`jitter_camera`).\n  * Can constrain against a sparse point cloud (:numref:`jitter_ref_terrain`).\n  * Added the option ``--smoothness-weight`` to control high-frequency changes\n    in the camera orientations in linescan cameras.\n  * Can use GCP files.\n  * Can read a control network from an nvm file.\n  * Write the stereo convergence angles. Can write registration errors on the\n    ground (:numref:`other_jitter_out`).\n\nstereo_gui (:numref:`stereo_gui`):\n  * Changing the image threshold updates the display correctly.\n  * When creating GCP, ask before quitting without saving them. Save the IP as\n    well when GCP are saved.\n  * Added the option ``--gcp-sigma`` for creating GCP.  \n  * Big speedup when rendering a stack of georeferenced images.\n\nimage_calc (:numref:`image_calc`):\n  * Added an example for how to extract the horizontal and vertical disparity\n    bands while setting invalid disparities to a no-data value\n    (:numref:`mask_disparity`).\n\nsat_sim (:numref:`sat_sim`):\n  * Added the option ``--rig-sensor-rotation-angles``, to be able to produce\n    a rig to desired specifications (:numref:`sat_sim_rig_adjust`).\n  * Can apply a periodic or random perturbation to given cameras\n    (:numref:`sat_sim_perturb`).\n\n  * Added the option ``--blur-sigma``, to blur the simulated images. This can\n    help simulate the effect of degraded images due to fog, motion, etc.\n  \nparallel_stereo (:numref:`parallel_stereo`):\n  * Added an example of processing Umbra SAR images (:numref:`umbra_sar`).\n  * Added an example of refining intrinsics and stereo with Chang'e 3 images\n    (:numref:`change3`).\n  * The initial low-resolution disparity from a DEM works with mapprojected\n    images (:numref:`d_sub_dem`).\n  * Added a discussion of various ways ASP can make use of existing terrain data\n    (:numref:`existing_terrain`).\n  * If the number of matches from disparity is much less than requested, try to\n    find more matches. This usually brings their number in the ballpark.\n  * The option ``--num-matches-from-disparity`` was made equivalent to   \n    ``--num-matches-from-disp-triplets``, and the triplet logic now works \n    with mapprojected images (:numref:`dense_ip`).\n  * It is possible to mapproject either with ``dg`` or ``rpc`` cameras\n    when using mapprojected images in stereo with DigitalGlobe / Maxar\n    cameras (:numref:`dg-mapproj`).\n  * Enable stereo with vendor-supplied images that have been mapprojected onto\n    surfaces of constant height above a datum (:numref:`mapproj_ortho`).\n  * Added the option ``--band`` to process a given band (channel) from\n    multispectral images (:numref:`stereodefault`).\n  * With alignment methods ``none`` and ``epipolar``, the option\n    ``--corr-search`` will work even when interest point matching fails\n    (:numref:`corr_section`).    \n  * Skip tiles for which there is no valid low-resolution disparity.\n  * Throw an error if the left and right mapprojected images have different\n    resolutions, as this can lead to incorrect results.\n  * Print a warning in ``stereo_pprc`` and ``stereo_tri`` if the stereo\n    convergence angle is too small.\n  * Added the options ``--enable-atmospheric-refraction-correction`` and\n    ``--enable-velocity-aberration-correction`` for Pleiades linescan cameras\n    (these are enabled by default for WorldView cameras only). It is not clear\n    if these corrections improve or not Pleiades accuracy.\n\nsfm (:numref:`sfm`):\n  * Added an example for processing data acquired with an UAS, with known\n    metadata (:numref:`sfm_uas`).\n    \nsfs (:numref:`sfs`):\n  * Added an SfS example for Earth (:numref:`sfs_earth`).\n  * Added a CTX Mars example (:numref:`sfs_ctx`).\n  * Added the program ``image_subset`` for selecting a subset of images that\n    have almost the same coverage as the full input set\n    (:numref:`image_subset`).\n  * Added the option ``--sun-angles`` to specify the Sun azimuth and elevation\n    angles.\n  * Bugfix in modeling atmospheric haze.\n  * Removed the ability to work on multiple clips at once, as it was not used.\n  * Can ingest a provided albedo map (of same size as the input DEM). Option:\n    ``--input-albedo``.\n  * Removed the RPC approximation logic. Use instead the option\n    ``--use-approx-camera-models`` with ISIS cameras.\n  * Removed the option ``--float-cameras``. It is more reliable to optimize\n    the cameras beforehand, in bundle adjustment. \n  * Removed obsolete options ``--float-dem-at-boundary``,\n    ``--float-sun-position``, ``--coarse-levels``.\n  * Have option ``--crop-input-images`` be always on. \n\npc_align (:numref:`pc_align`):\n  * Added the Nuth and Kaab algorithm (:numref:`nuth`).\n  * Added an example of how to use dense image correlation for alignment\n    (:numref:`pc_corr`).\n  * Speed up the computation of shared bounding box and loading of source\n    points.\n\ncam2rpc (:numref:`cam2rpc`):\n  * When a DEM is passed in, sample not just the DEM surface but its bounding\n    box, to create a more robust RPC model.\n  * The produced RPC file has been streamlined to a minimum of metadata.\n\npoint2las (:numref:`point2las`):\n  * Replaced the option ``--triangulation-error-factor`` for saving the triangulation\n    error as a scaled int with the option ``--save-triangulation-error``, that\n    saves it in double precision without scaling.\n  * Added the options ``--save-intensity-from-image`` and ``--save-stddev``.\n\npoint2dem (:numref:`point2dem`):\n  * The default projection for WGS84 is now UTM / polar stereographic. \n    For other datums it is local stereographic (:numref:`point2dem_proj`).\n  * Adjust the region passed in via the option ``--t_projwin`` so that, as\n    usual, the DEM grid coordinates are integer multiples of the grid size.\n  * Handle robustly invalid input points.\n  * Remove old options ``--use-surface-sampling`` and ``--fsaa``.\n  * Bugfix for slow performance with dynamic CRS.\n  * Changed the default output nodata-value to -1e+6, as the smallest float\n    may not be displayed accurately by some software.\n  \ngcp_gen (:numref:`gcp_gen`):\n  * Make the interest point matching work better by invoking the full \n    machinery and options from ``bundle_adjust``.\n\nimage_align (:numref:`image_align`):\n  * Let the default alignment method be ``rigid`` rather than ``translation``.\n\ncam_gen (:numref:`cam_gen`):\n  * Added the option ``--camera-center``.\n  * Can export an RPC camera model to .xml format (:numref:`cam_gen_rpc`).\n   \ndem_mosaic (:numref:`dem_mosaic`):\n  * Added the option ``--weight-list`` for blending DEMs given external weights\n    (:numref:`dem_mosaic_external_weights`).\n  * Renamed the option ``--dem-list-file`` to ``--dem-list``. The old option\n    is kept for backward compatibility.\n  * Can handle DEMs with NaN values.\n\ndem_geoid (:numref:`dem_geoid`):\n  * Accept a custom geoid correction via ``--geoid-path``. Added support for a\n    Moon geoid.\n\norbit_plot (:numref:`orbit_plot`):\n  * Added the options ``--use-rmse``, ``--output-file``.\n\nisis (:numref:`planetary_images`):\n  * Upgraded to ISIS 8.3.0.\n\nmisc:\n  * The logic for triangulation with RPC cameras changed (:numref:`rpc_tri`).\n  * In ``bundle_adjust`` and ``jitter_solve``, save the lists of images and\n    optimized camera file names (or adjustments). Can be passed in back to\n    any of these tools (:numref:`ba_out_cams`).\n  * The option ``--flann-method`` in ``bundle_adjust`` and ``stereo`` defaults to\n    using the slower but deterministic ``kmeans`` method for a smaller set of\n    interest points, and to ``kdtree`` otherwise (:numref:`stereodefault-pprc`).\n  * When creating dense interest point matches from disparity and mapprojected\n    images, the match file reflects the name of the original unprojected images\n    (:numref:`dense_ip`).\n  * Bugfix for a crash with the ``asp_sgm`` and ``asp_mgm`` algorithms when the \n    disparity search range is large.\n  * Print the stereo convergence angle in ``stereo_pprc`` with mapprojected\n    images and with epipolar alignment. These are the remaining cases that were\n    not handled before.\n  * The ``mapproject`` and ``parallel_sfs`` programs will not fail if the work\n    directory has spaces (this fix is a workaround, the bug is in GNU Parallel).\n  * Renamed ``--csv-proj4`` to ``--csv-srs``. This accepts any GDAL WKT,\n    GeoJSON, or PROJ string. The previous option is still accepted for backward\n    compatibility.\n  * Support images with up to 12 bands (channels), up from 6.\n  * Support files with the .nitf extension.\n  * Can handle no-data values larger than valid pixel values.\n  * Wiped extremely old and unused SPICE logic.\n  * Wiped the unused old option ``--mask-flatfield``. Can use with stereo\n    the option ``--nodata-value`` to mask values no more than this value.\n  * The ``geodiff`` program output image is with float pixels, rather than\n    in double precision.\n  * Have the OpenCV interest point detectors respect the ``--threads`` option.\n  * Have ``bundle_adjust`` and ``parallel_stereo`` use same\n    ``--ip-inlier-factor`` value by default.\n  * Bugfix for loading camera adjustments when mapprojected images are passed \n    in, rather than the raw ones.\n  * Can read Airbus Pleiades RPC XML files that have both a \"global\" and a\n    \"partial\" camera model. The global one will be used.\n  * Dependence on package ``htdp`` removed. This was needed for\n    ``datum_convert``.\n\nRELEASE 3.4.0, June 19, 2024\n----------------------------\n\n*This release is is available only as binaries, and not as a conda package*\n(:numref:`conda_intro`).\n\nDOI: `10.5281/zenodo.12176190 <https://zenodo.org/records/12176190>`_\n\nStable release doc: https://stereopipeline.readthedocs.io/en/stable/index.html\n\nNew tools:\n  * Added ``orbit_plot.py`` (:numref:`orbit_plot`), a tool for plotting\n    camera orientations along an orbit (contributed by Shashank Bhushan).\n  * Added ``gcp_gen`` (:numref:`gcp_gen`), a program for generating ground\n    control points (GCP) based on ortho images. Helps create camera models from\n    scratch.  \n  * Added ``dem2gcp`` (:numref:`dem2gcp`), a tool that can greatly help solve\n    for lens distortion that manifests itself as large horizontal warping in the\n    DEM. \n\nNew camera support:\n  * Added the ability to use the CSM camera model with ASTER images\n    (:numref:`aster_csm`).\n\nNew external library support:\n  * Migrated to PDAL 2.6.0 from libLAS for LAS input/output (in ``pointlas``,\n    ``point2dem``, and ``pc_align``), as libLAS is no longer developed.\n\nWorldView (DigitalGlobe) cameras (:numref:`dg_tutorial`):\n  * The WorldView linescan model got moved to a CSM implementation. The\n    transitional option ``--dg-use-csm`` was removed. The new implementation is\n    about 5x faster for ground-to-image projections.\n  * Re-enabled correcting velocity aberration and atmospheric refraction.  \n    These corrections are now implemented in the CSM camera model, and, unlike\n    before, play nicely with bundle adjustment (:numref:`dg_csm`).\n  * The options ``--enable-correct-velocity-aberration`` and\n    ``--enable-correct-atmospheric-refraction`` got removed.\n  * Non-DG cameras do not use these corrections, as a case for that has not been\n    made.\n\njitter_solve (:numref:`jitter_solve`):\n  * Added an example for ASTER cameras (:numref:`jitter_aster`).\n  * Added an example with 27 CTX images (:numref:`jitter_multiple_images`).  \n  * Added the option ``--weight-image``, to weigh observations based on\n    geographic location of triangulated points (:numref:`limit_ip`).\n  * Can handle several sensors with very similar positions and orientations\n    (:numref:`jitter_rig`).\n  * Support reading the ISIS ``jigsaw`` binary control network\n    format (:numref:`jitter_ip`).\n  * Can read and write CSM model state embedded in ISIS .cub files   \n    (:numref:`embedded_csm`).\n  * Replaced the option ``--translation-weight`` with\n    ``--camera-position-weight``, which is off by default, as it may affect the\n    convergence. The new option adapts appropriately to the number of interest\n    points and the ground sample distance (:numref:`jitter_camera`).\n  * The ``--tri-weight`` constraint is now the default, with a positive value of\n    0.1. This is adjusted for GSD (:numref:`jitter_tri_constraint`). \n  * Added report files having the change in camera positions\n    (:numref:`jitter_cam_offsets`), triangulated points\n    (:numref:`jitter_tri_offsets`), and stats of pixel reprojection errors per\n    camera (:numref:`jitter_errors_per_camera`).\n  * Replaced the option ``--heights-from-dem-weight`` with\n    ``--heights-from-dem-uncertainty`` (1 sigma, in meters). This is more\n    physically meaningful (as a rule of thumb, use the inverse of what was\n    previously the weight value).\n  * Integrated the logic behind ``--reference-dem`` into ``--heights-from-dem``,\n    with an approach that combines the strength of both. Removed\n    ``--reference-dem``.\n  * Can use anchor points with frame cameras.\n  * Added ``--num-anchor-points-per-tile``. This helps when different\n    images have different sizes but want to ensure the same point density.\n  * Added the option ``--anchor-weight-image`` that is used to limit\n    where anchor points are placed.\n  * The roll and yaw constraints no longer assume linescan camera positions and\n    orientations are one-to-one.\n  * Order of images in each interest point match file need not be the same\n    as for input images.  \n\nbundle_adjust (:numref:`bundle_adjust`):\n  * Added the ability to refine the camera intrinsics for several groups of\n    cameras, with each group sharing intrinsics (:numref:`kaguya_ba`).\n  * Can mix frame and linescan cameras, while controlling for each \n    group of cameras which intrinsics should be optimized\n    (:numref:`ba_frame_linescan`).\n  * Support reading and writing the ISIS ``jigsaw`` binary control network\n    format (:numref:`jigsaw_cnet`).\n  * Can read and write CSM model state embedded in ISIS .cub files   \n    (:numref:`embedded_csm`).\n  * Support reading and writing the NVM format for control networks\n    (:numref:`ba_nvm`).\n  * Added the option ``--camera-position-weight``, with a default value of 0.0.\n    This is an internally adjustable constraint to keep the cameras from moving\n    too much. It may prevent the reduction in reprojection error\n    (:numref:`ba_cam_constraints`).\n  * Remove the option ``--translation-weight``. The translation is now\n    automatically controlled by default by the camera position weight.\n  * Added the option ``--camera-position-uncertainty`` to set hard constraints\n    on the horizontal and vertical uncertainty for each camera\n    (:numref:`ba_cam_constraints`).\n  * Added report files having the change in camera positions\n    (:numref:`ba_camera_offsets`) and triangulated points\n    (:numref:`ba_tri_offsets`).\n  * The option ``--tri-weight`` is now set by default to 0.1, and adjusted for\n    GSD. The option ``--camera-weight`` is by default 0.0. This  work better\n    than before at preventing the cameras from moving when optimizing them.\n  * Replaced the option ``--heights-from-dem-weight`` with\n    ``--heights-from-dem-uncertainty`` (1 sigma, in meters). This is more physically\n    meaningful (as a rule of thumb, use the inverse of what was previously the\n    weight value).\n  * Integrated the logic behind ``--reference-dem`` into ``--heights-from-dem``,\n    with an approach that combines the strength of both. Removed \n    ``--reference-dem``.\n  * Added the option ``--propagate-errors`` to propagate the uncertainties from\n    input cameras to triangulated points (:numref:`ba_error_propagation`).  \n  * Added the option ``--weight-image``, to weigh observations based on\n    geographic location of triangulated points. (:numref:`limit_ip`). \n  * For ASTER cameras, use the RPC model to find interest points. This does\n    not affect the final results but is much faster.\n  * When optimizing intrinsics, cameras that do not share distortion can\n    have different distortion types and sizes. (:numref:`limit_ip`).\n  * Each image passed to ``--mapprojected-data`` reads from its geoheader\n    the camera and adjustment prefix for undoing the mapprojection.\n  * Fixed a bug when both ``--initial-transform`` and\n    ``--input-adjustments-prefix`` are used.\n  * Can use the image names in ``--camera-list`` when images contain the camera\n    models.\n  * The pixel reprojection errors are adjusted correctly for pixel sigma in\n    the report files (:numref:`ba_errors_per_camera`, :numref:`ba_err_per_point`).\n  * The default outlier removal parameters are more generous, to avoid removing\n    valid interest point matches when the input images have distortion (option\n    ``--remove-outliers-params``). \n  * The combination of options ``--mapprojected-data`` and\n    ``--auto-overlap-params`` will restrict the interest point matching to the\n    region of overlap (expanded by the percentage in the latter option). This\n    can result in great efficiency gains for large images.\n  * Made the Tsai lens distortion agree precisely with OpenCV's implementation\n    (:numref:`pinholemodels`). There was a small numerical problem and the K3\n    coefficient was not part of the distortion model.\n  * Replaced the Tsai lens undistortion implementation, for a 10x speedup.  \n  * Added the OpenCV fisheye lens distortion model and also the FOV model\n    (:numref:`pinholemodels`). These are for wide-angle lenses. \n  * Bugfix: points for which initial triangulation failed are flagged as\n    outliers right away. See ``--forced-triangulation-distance`` for\n    fine-grained control.\n  * Order of images in each previously created interest point match file need\n    not be the same as for input images.\n  * RPC lens distortion is now applied to pixels that are normalized by focal\n    length, in addition to being offset by the principal point. This is\n    consistent with the radial-tangential and fisheye models, and produces a\n    more accurate fit to other models. *Previously created models are now\n    invalid*.\n  * RPC undistortion is now done with a solver rather than using separate\n    undistortion coefficients. This much more accurate but slower\n    (:numref:`pinholemodels`).\n  * Added an example of using RPC distortion for KH-7 cameras, for which \n    an exact model is not available (:numref:`kh7_fig`).\n  * Ensure that outlier filtering with ``--min-triangulation-angle`` is done\n    after each pass with refined cameras and for all ways of reading a control\n    network.\n  * Load and save the camera models in parallel, for speed (except for ISIS).\n  * Bugfix: if some intrinsics are shared, sync them up before optimization.\n  \nparallel_stereo (:numref:`parallel_stereo`):\n  * Added Kaguya processing example (:numref:`kaguya_tc`).\n  * When a run finished successfully, combine the data from subdirectories and\n    delete these. See ``--keep-only`` for more options.\n  * Made the tiles for the ``asp_mgm`` / ``asp_sgm`` algorithms bigger, with\n    smaller padding, which should be about 2x faster (:numref:`ps_tiling`).\n  * Added an illustration of several stereo algorithms (:numref:`stereo_alg_fig`).  \n  * Fixed a failure when processing images that have very large blocks (on the\n    order of several tens of thousands of pixels along some dimension, as shown\n    by ``gdalinfo``). A warning, progress bar, and timing info is displayed.\n  * For the ``asp_sgm`` and ``asp_mgm`` algorithms allow ``cost-mode`` to\n    have the value 3 or 4 only, as other values produce bad results. \n  * Fix a failure when the working directory has a space in its name.\n  * Bugfix for memory usage with very large images.\n\npoint2dem (:numref:`point2dem`):\n  * Added the option ``--auto-proj-center``, to automatically compute the\n    projection center for stereographic and other projections\n    (:numref:`point2dem_proj`).\n  * When the lon-lat projection is used, the output DEM longitude range\n    is always in [-180, 180], unless using [0, 360] results in a smaller range\n    (such as when crossing the 180 degree meridian).\n  * Added the option ``--scalar-error`` to find the norm of the triangulated\n    error vector (if applicable).\n  * Can read a ground-level point cloud stored as a tif file with 3 bands,\n    representing the x, y, and z coordinates of the points, with z being\n    vertical (option ``--input-is-projected``).\n  * Bugfix for when all heights are equal. A valid DEM is produced.  \n  * Do not assume the datum is WGS84 by default, as this can result in\n    incorrect DEMs. The datum, projection, or semi-axes must be set    \n    (or read from the input PC/LAS file).\n    \ngdal (:numref:`gdal_tools`):\n   * Full support for WKT and GeoJSON for the projection string (option\n     ``--t_srs``) in ``point2dem``, ``point2las``, ``mapproject``,\n     ``dem_mosaic``, ``cam2rpc``. Can still use PROJ.4 strings. \n   * Georeferenced images with different datums cannot be used together. Use\n     ``gdalwarp`` to convert them to a common datum.\n   * Upgraded to GDAL 3.8.0 and PROJ 9.3.0.\n   \ncsm (:numref:`csm`):\n   * Upgraded to USGSCSM 2.0.1.\n   * Fixed several problems in generation of CSM cameras for MSL Curiosity Nav\n     and Mast images. Much large-scale testing was performed. Updated the\n     example showing how to create stereo from either Nav or Mast stereo pairs\n     (:numref:`csm_msl`).\n   * A multi-Martian-day example for MSL added (:numref:`csm_msl_multiday`).\n   * Added support for the radial and tangential distortion model\n     with 3 radial distortion parameters and 2 tangential ones. Tested\n     that it agrees with the OpenCV implementation.\n   * Fixed a small bug in radial distortion implementation.\n      \nstereo_gui (:numref:`stereo_gui`):\n  * Can show scattered data with a colorbar and axes \n    (:numref:`scattered_points_colorbar`).\n  * Renamed ``--colorize-image`` to ``--colorbar``.\n  * Right-click on a colorized image to set the range of intensities to\n    colorize.\n  * Can view ISIS control network files (:numref:`stereo_gui_isis_cnet`).\n  * Auto-guess and load ``pc_align`` error files (:numref:`pc_align_error`).\n  * When loading an .nvm file with features that are not shifted relative\n    to the optical center, must specify ``--no-shift``. This avoids confusion\n    as to whether a shift is present or not (:numref:`stereo_gui_nvm`).\n\ncolormap (:numref:`colormap`):\n  * Added the option ``--hillshade`` to create a hillshaded colormap.\n   \nimage_calc (:numref:`image_calc`):\n  * When adding new keywords to metadata geoheader, do not erase the existing\n    ones (if a keyword already exists, its value will be modified).\n  * Added the ability to create a random image.\n\npc_align (:numref:`pc_align`):\n  * Add the option ``--skip-shared-box-estimation``.\n   \nhistorical_helper.py (:numref:`historical_helper`):\n  * Added the ability to set a custom path to the needed ``convert``\n    executable and described how that tool can be installed.\n\nsfs (:numref:`sfs`):\n  * Added two examples for Kaguya TC, for single and multiple illumination\n    conditions (:numref:`sfs_kaguya`).\n  * Added the option ``--albedo-robust-threshold``.\n\nisis (:numref:`moc_tutorial`):\n  * The ISIS libraries are compiled from source, and reflect the code after\n    the ISIS 8.0.3 release (:numref:`conda_intro`). \n  * Made the operation of projecting into an ISIS linescan camera 2.2-2.6 times\n    faster by using the secant method to find the best sensor line.\n  * Expanded the ``jigsaw`` documentation (:numref:`jigsaw`). This is the \n    ISIS bundle adjustment tool. \n\ncam_gen (:numref:`cam_gen`):\n   * Can fit a CSM frame camera to a given input camera, including distortion\n     (:numref:`cam_gen_frame`).\n   * Can export linescan cameras to CSM format (:numref:`cam_gen_linescan`).\n   * Can create cameras given longitude, latitude, height above datum, and roll,\n     pitch, yaw angles (:numref:`cam_gen_extrinsics`).\n\nrig_calibrator (:numref:`rig_calibrator`):\n   * Can export the interest point matches, cameras, and the OpenCV lens\n     distortion model for use with ``bundle_adjust`` (:numref:`rc_ba`).\n   * Added documentation for how to register the produced cameras to the ground\n     for a planet (:numref:`msl_registration`).\n   * Can fix the translation and/or rotation component of a rig configuration.  \n   * Can constrain camera positions with ``--camera_position_weight``.\n   * Added two more naming conventions, to help process existing data\n     out-of-the-box. Also for ``theia_sfm`` and ``sfm_merge``.\n     :numref:`rig_data_conv`. \n   * Thoroughly validated with an orbital rig (in addition to indoor rigs).   \n     \nlronac2mosaic.py (:numref:`lronac2mosaic`):\n  * Run ``spiceinit`` before calling ``lronaccal``, and re-enable all\n    options for the latter command, which were disabled due to a bug\n    in ISIS that was fixed in version 7.2.\n  * Invoke ``spiceinit`` with ``spksmithed=true``. \n  * Add the option ``--spiceinit-options``.\n\ncamera_solve (:numref:`camera_solve`):\n  * Switched to cascade matching from brute force matching, which is much faster.\n  * Always reuse the Theia SfM matches.\n \ndem_mosaic (:numref:`dem_mosaic`):\n  * Bugfix for option ``--use-centerline-weights``. \n    \nmisc:\n  * Made all tools that spawn processes in parallel use the option\n    ``--parallel-options``, with default ``--sshdelay 0.2``, to avoid\n    failure on certain architectures.\n  * For ASTER (:numref:`aster`), the model loaded by default is now linescan\n    rather than RPC.\n  * Fixed a bug in outlier filtering when the interest points are very noisy.   \n  * Fixed a couple of runtime errors when using conda packages on OSX.\n  * Eliminated a procedure for cleaning the name of an input path that was\n    replacing two slashes with one slash, resulting in inconsistencies.\n  * Robustly handle 360 degree longitude offsets without classifying\n    georeferenced images into [-180, 180] or [0, 360] types.  \n  * Fix an error in conversion between projections for non-Earth images.\n  * The North-East-Down coordinate system assumes an ellipsoid, not a sphere,\n    and takes into account the point elevation. This fixes some small\n    inaccuracies in error propagation and reporting in ``pc_align``.\n  * The OSX build now gets created and tested via GitHub Actions.\n  * Very old jitter adjustment logic was removed. The ``jitter_solve``\n    tool must be used instead.\n  * For stereo, increased ``--ip-num-ransac-iterations`` from 100 to 1000,\n    as for ``bundle_adjust``.  This can make a difference for noisy data.\n  * Do not keep auxiliary files with temporary names in the work directory for\n    ``parallel_stereo`` and ``parallel_bundle_adjust``. Use run's output\n    directory and proper names.\n  * Ensure any sequence of quaternions in a CSM linescan model is normalized\n    and there is no sign flip along the sequence. Such a flip was resulting\n    in incorrectly interpolated camera orientations.  \n  * Auto-guess the planet for Pinhole cameras (For Earth, Moon, Mars).   \n  * Documented the program ``view_reconstruction``\n    (:numref:`view_reconstruction`), with a figure.  \n  * Switched by default to a slower but deterministic method for matching\n    interest points in ``bundle_adjust`` and ``parallel_stereo``. Normally this\n    is not a bottleneck. See ``--flann-method`` in :numref:`stereodefault-pprc`.\n  * Made RANSAC multi-threaded. This speeds up interest point matching.\n  * Added a sanity check: If the user sets ``--t_srs`` to any tool, it \n    must not be empty.\n  * Added sanity checks to ensure no mix-up of datums from different planets in\n    different inputs for the stereo tools, ``bundle_adjust``, ``jitter_solve``,\n    ``mapproject``, ``cam_test``, and ``cam_gen``.\n  * Upgraded to Boost 1.82.0.\n  \nRELEASE 3.3.0, August 16, 2023\n------------------------------\n\nDOI: `10.5281/zenodo.8270270 <https://zenodo.org/record/8270270>`_\n\nStable release doc: https://stereopipeline.readthedocs.io/en/stable/index.html\n\nNew tools:\n  * Added ``sfm_merge`` (:numref:`sfm_merge`), a tool to merge several\n    SfM reconstructions that may or may not have shared images.\n  * Added ``sfm_submap`` (:numref:`sfm_submap`), a tool to extract  \n    a submap from a Structure-from-Motion map in .nvm format, \n    as produced by ``theia_sfm`` (:numref:`theia_sfm`) or refined\n    with ``rig_calibrator`` (:numref:`rig_calibrator`).\n  * Added a couple of small Python scripts for handling ROS bags\n    (:numref:`ros_tools`). No ROS binaries are shipped.\n  * Added support for the Pleiades NEO exact linescan model\n    (:numref:`pleiades_neo`).\n  * Added ``sat_sim`` (:numref:`sat_sim`), a tool to create simulated\n    satellite images camera models for pinhole or linescan sensors.\n  * Added ``sfm_view`` (:numref:`sfm_view`), a tool for viewing orbital \n    Pinhole camera models. It is a modification of the ``umve`` program.\n   \ncsm (:numref:`csm`):\n  * Added initial support for using CSM camera models with MSL Curiosity\n    (:numref:`csm_msl`).\n\nparallel_stereo (:numref:`parallel_stereo`):\n  * Can propagate horizontal ground plane standard deviations (stddev)\n    specified for each camera through triangulation, obtaining the\n    horizontal and vertical stddev for each triangulated point. \n    For DigitalGlobe RPC and Pleiades linescan cameras the input\n    horizontal stddev can be read from camera files. A formula to go\n    from known CE90 to input horizontal stddev is provided\n    (:numref:`error_propagation`).\n  * Can propagate the covariances of satellite positions and\n    quaternions to the triangulated point cloud for Maxar\n    (DigitalGlobe) linescan cameras (:numref:`error_propagation`).\n  * Documented the pre-processing options ``--stddev-mask-kernel``\n    and ``--stddev-mask-thresh``\n    (:numref:`stereodefault-pprc`). Fixed a bug in writing\n    out debug images for this option.\n  * The cameras files used in mapprojection can be switched to other\n    ones for the purpose of doing stereo or reusing a stereo run\n    (:numref:`mapproj_reuse`).\n  * Added the option ``--matches-per-tile``, to attempt to guarantee\n    that each 1024 x 1024 tile has about this many number of matches.\n  * Bugfix for stereo with mapprojected Pleiades images. If the\n    mapprojection is done with the exact (non-RPC) cameras, stereo\n    must load the exact cameras when undoing the mapprojection.\n\nbundle_adjust (:numref:`bundle_adjust`):\n  * Validated that given about a thousand input images acquired with three views\n    and much overlap, one can have very tight control of the cameras in bundle\n    adjustment, while improving the self-consistency of the camera configuration\n    (:numref:`skysat_stereo`).\n  * Validated the option ``--reference-dem`` for bundle adjustment. This works\n    even when rays obtained during triangulation are parallel.\n  * Added the option ``--matches-per-tile``, to attempt to guarantee that each\n    1024 x 1024 tile has about this many number of matches (example in\n    :numref:`ba_examples`).\n  * Bugfix for slow performance and memory usage for a large number of images.\n\njitter_solve (:numref:`jitter_solve`):\n  * Added the options ``--roll-weight`` and ``--yaw-weight`` to control the\n    amount of change in these angles relative to the along-track direction. To\n    be used with synthetic cameras created with ``sat_sim`` (:numref:`sat_sim`). \n  * Added a section discussing solving for jitter with synthetic camera models\n    (:numref:`jitter_sat_sim`).\n  * The solver can mix and match linescan and pinhole (frame) camera images if\n    the inputs are all in the CSM format (:numref:`jitter_linescan_frame_cam`).\n  * Added a section on how to prepare interest point matches\n    (:numref:`jitter_ip`).\n  * Validated the option ``--reference-dem`` for bundle adjustment. This works\n    even when rays obtained during triangulation are parallel.\n  * Bugfix for reverse scan direction.\n  * Added an example for Pleiades cameras (:numref:`jitter_pleiades`),\n    comparing two ways of setting ground constraints.\n    \nsfs (:numref:`sfs`): \n  * Created an SfS DEM of size 14336 x 11008 pixels, at 1 m pixel with\n    420 LRO NAC images with various illuminations and orientations.\n    Reliably bundle-adjusted 814 LRO NAC images in which the shadows\n    were observed to make a full 360 degree loop, with a total of 614k\n    triangulated points. Updated the documentation reflecting\n    latest best practices (:numref:`sfs-lola`).\n  * Create more detail in the reconstructed DEM in borderline lit\n    regions. Option: ``--allow-borderline-data``\n    (:numref:`sfs_borderline`).\n  * Added the options ``--image-list`` and ``--camera-list`` for when\n    the number of images becomes too large to set on the command line.\n\nrig_calibrator (:numref:`rig_calibrator`):\n  * Added a detailed tutorial describing how this tool was used to\n    create a full 360-degree textured mesh of the JEM ISS module\n    (:numref:`sfm_iss`) using data acquired with two rigs (6 sensors).\n  * Added an example for the MSL Curiosity rover (:numref:`rig_msl`).\n  * Allow multiple rigs to be jointly optimized (the rig constraint\n    applies within individual rigs and not between them).\n  * Added the option ``--extra_list`` to insert additional images \n    close in time to some of the images already on the rig (for\n    the same or different rig sensor). Helps easily grow a map and\n    complete a rig.\n  * Added the option of keeping a subset of the camera poses fixed (for\n    when those have been validated in a smaller map).\n  * Images for any of the rig sensors (not just the reference one) can\n    be used in registration (but all must be for same sensor).\n  * Added the ``--save_pinhole_cameras`` option to save the optimized\n    cameras in ASP's Pinhole format (with no distortion for now).\n  * Absorb ``--rig_transforms_to_float`` into ``--camera_poses_to_float``. \n  * Save alongside an .nvm file a separate file having the values of\n    optical center point that are subtracted from each interest point\n    (for plotting in ``stereo_gui``).\n  * Merge the interest point tracks created as part of rig calibration\n    with the matches read from disk beforehand.\n  * Fix for too many valid interest point matches being filtered out.\n\nvoxblox_mesh (:numref:`voxblox_mesh`):\n  * Added median filtering of input point clouds (option\n    ``--median_filter``).\n  * Added weighing of depth points given their distance from the\n    sensor (option ``--distance_weight``).\n\nmulti_stereo (:numref:`multi_stereo`):\n  * Left and right images can be acquired with different sensors.\n  * Use ``--left`` and ``--right`` to specify which stereo pairs to\n    run.\n\ntexrecon (:numref:`texrecon`):\n  * Can create a texture with images from multiple sensors.\n \npoint2dem (:numref:`point2dem`): \n  * Added the option ``--propagate-errors`` to grid the stddev values\n    computed during stereo triangulation.\n  * Added the option ``--input-is-projected`` to specify that the input\n    coordinates are already in the projected coordinate system.\n\nstereo_gui (:numref:`stereo_gui`): \n  * Can read, write, edit, and overlay on top of images polygons in\n    plain text format in addition to the .shp format. Per-polygon\n    colors are supported.\n  * Can read nvm files whose features are shifted relative to the \n    optical center, if an ``.nvm`` file is accompanied by an\n    ``_offsets.txt`` file.\n  * Added the option ``--preview`` to load one image at a time, \n    and quickly cycle through them with the 'n' and 'p' keys.\n  * Added the option ``--view-several-side-by-side``\n    to view several images side-by-side with a dialog to choose which\n    images to show (also accessible from the View menu).\n  * Added the option ``--font-size``, with the default of 9. \n  * Added the option ``--lowest-resolution-subimage-num-pixels`` to\n    control the behavior of the pyramid of subimages.\n  * Noticeable speedup in loading images.\n  * Bug fix in loading .nvm files (an SfM format).\n\nimage_align (:numref:`image_align`):\n  * Can find the 3D alignment around planet center that transforms the\n    second georeferenced image to the first one. This transform can be\n    used to apply the alignment to cameras and point clouds\n    (:numref:`image_align_ecef_trans`).\n\ndem_mosaic (:numref:`dem_mosaic`):\n  * Added the option ``--fill-search-radius`` to fill nodata pixels in \n    a DEM with nearby valid values. This is different from\n    ``--hole-fill-length``. See an example in :numref:`dem_mosaic_examples`.\n\nwv_correct (:numref:`wv_correct`):\n  * Maxar (DigitalGlobe) WorldView-2 images with a processing (generation) date\n    (not acquisition date), of May 26, 2022 or newer have much-reduced CCD\n    artifacts, and for those this tool will in fact make the solution worse, not\n    better. This does not apply to WorldView-1, 3, or GeoEye-1.\n  * ASP builds after 2023-06-21 (so, version later than 3.2.0), will detect the\n    above-mentioned scenario, and will not apply any correction in that case (a\n    copy of the original image will be written instead and a warning will be\n    printed). This applies to both PAN and multi-spectral images.\n\ncorr_eval (:numref:`corr_eval`):\n  * Remove an excessive check. The refined/filtered disparity can be such \n    that left image pixel plus disparity may be outside the right image.\n    Don't fail in that case, but just skip the pixel, resulting in empty \n    correlation for that pixel.\n\ncam_test (:numref:`cam_test`):\n  * Added the option ``--datum``. Useful for Pinhole cameras as those don't \n    know their datum. \n  * Added a warning if the camera center is below the datum. \n\nmisc: \n  * Upgraded to ISIS 8.0.0 and USGSCSM 1.7.\n  * Throw an error for WorldView products that are not Stereo1B or Basic1B.\n    That because ASP does not support orthorectified Maxar products.\n  * Changed the \"pretend\" height of the RPC cameras from 10 km \n    above ground to around 100 km. RPC camera models do not store this\n    number and it does not make a difference normally, as only ray\n    directions to the ground matter. Yet, .adjust\n    files created with an earlier version of ASP for RPC cameras\n    should be re-created as those use the camera center.\n  * The latest version of the Xerces-C XML parser became 10 times\n    slower than before, which may affect the speed of\n    processing for XML-based camera models.\n  * Added back the tool ``view_reconstruction``, for examining\n    Theia's SfM solution (:numref:`sfm`).\n  * The ``theia_sfm`` tool can write the optical offsets for a given\n    nvm file which can be used in plotting such files in ``stereo_gui``. \n  * Added to ``hiedr2mosaic.py`` (:numref:`hiedr2mosaic`) the option\n    ``--web`` to invoke ``spiceinit`` with ``web=True``. Contributed\n    by Giacomo Nodjoumi.\n  * Bugfix for reading .jp2 files. Needed to ship the JPEG2000 driver\n    and set GDAL_DRIVER_PATH.\n  * Fixed a failure in ``mapproject`` with a small DEM.\n  * Bugfix for exporting the TheiaSfM matches in ``camera_solve``.\n  * The documentation of the examples chapter was broken up into\n    individual pages (:numref:`examples`). \n\nRELEASE 3.2.0, December 30, 2022\n--------------------------------\nDOI: `10.5281/zenodo.7497499 <https://doi.org/10.5281/zenodo.7497499>`_\n\nAdded functionality for creation of large-scale meshes and fused\ntextures for small planetary bodies and indoor environments. Added\nlogic for rig calibration. See individual tools below.\n\nNew tools:\n  * ``rig_calibrator``: Calibrates a rig of N image and/or\n    depth+image cameras. Can also co-register and refine\n    intrinsics of camera images acquired with N sensors with no rig\n    constraint (:numref:`rig_calibrator`).\n  * ``multi_stereo``: Runs multiple stereo pairs and produces\n    a fused mesh. Uses ``parallel_stereo``, ``pc_filter``, and \n    ``voxblox_mesh`` (:numref:`multi_stereo`).\n  * ``voxblox_mesh``: Fuses point clouds into a seamless oriented\n    mesh, with each input point given a weight according to its\n    reliability. Based on the third-party VoxBlox software\n    (:numref:`voxblox_mesh`).\n  * ``texrecon``: Creates seamless textured meshes. Based on\n    the third-party MVS-Texturing project (:numref:`texrecon`).\n  * ``pc_filter``: Filters outliers in point clouds created with\n    pinhole cameras and weighs inliers based on many criteria\n    (:numref:`pc_filter`).\n  * Added CGAL-based tools for mesh smoothing, hole-filling, remeshing,\n    and removal of small connected components (:numref:`cgal_tools`).\n  * ``jitter_solve``: A tool for solving for jitter in CSM camera \n    models (:numref:`jitter_solve`). It gives promising results \n    for CTX, Pleiades, and DigitalGlobe data. Examples are provided.\n\nRemoved tools:\n  * ``datum_convert``: This was an attempt at having a tool applying\n    a transform between datums. It is suggested to use GDAL/PROJ instead.\n    Note that a datum transform may require fetching transformation grids,\n    and without them PROJ will quietly return incorrect results. \n\nNew sensors:\n  * Support the Pleiades exact sensor (for 1A/1B). See :numref:`pleiades`.\n    Implemented as a wrapper around the CSM linescan camera model.\n\nparallel_stereo (:numref:`parallel_stereo`):\n  * Added the options ``--match-files-prefix`` and\n    ``--clean-match-files-prefix`` for reusing interest point matches\n    from a previous ``bundle_adjust`` or ``parallel_stereo`` run. The\n    \"clean\" interest point matches created by ``bundle_adjust`` may\n    have fewer outliers than what stereo can create.\n  * Added the option ``--keep-only`` to convert all VRT files to TIF\n    (e.g., D.tif), then wipe all files and subdirectories except those\n    specified by given suffixes.\n  * Added the triangulation option ``--max-valid-triangulation-error``.\n  * The option ``--prev-run-prefix`` can be used to start a run\n    with bathymetry modeling at the triangulation stage while\n    reusing the previous stages of a run without such modeling\n    (the needed aligned bathy masks are created, if needed,\n    at the triangulation stage, if not done, as usual, at the \n    preprocessing stage).\n  * For SGM and MGM use by default 8 threads and number of processes\n    equal to number of cores divided by number of threads. Less likely\n    to run out of memory that way.\n  * Added examples of using PBS and SLURM with ASP\n    (:numref:`pbs_slurm`).\n  * Added an example of processing SkySat Stereo data\n    (:numref:`skysat_stereo`).\n  * Documented better the option ``--num-matches-from-disp-triplets``\n    for creating dense and uniformly distributed interest point\n    matches. Useful for modeling lens distortion.\n\nparallel_bundle_adjust (:numref:`parallel_bundle_adjust`):\n  * Do not create subdirectories or symlinks, as that results in a\n    massive number of small files. (Unless ``--save-vwip`` is used,\n    see below.)\n  * Do not save by default .vwip files as those take space and are\n    only needed to find .match files. Use the new option\n    ``--save-vwip`` to save them. Note that these depend on individual\n    image pairs, so ``parallel_bundle_adjust`` saves them in\n    subdirectories.\n\nbundle_adjust (:numref:`bundle_adjust`):\n  * Save the convergence angle percentiles for each pair of\n    images having matches. Useful for understating the configuration\n    of cameras.\n  * Added the option ``--tri-weight`` (default is 0) to keep triangulated\n    points close to their initial values. This looks more promising\n    than other weighing used so far at preventing the cameras from\n    moving when optimizing them. This assumes input cameras are\n    not grossly inaccurate. This adds a robust cost function \n    with the threshold given by ``--tri-robust-threshold``.\n  * Added the options ``--image-list``, ``--camera-list``, \n    ``--mapprojected-data-list``, for when the inputs are too many to\n    specify on the command line.\n  * Added the option ``--fixed-image-list`` to specify a file having a \n    list of image names whose cameras should be fixed during\n    optimization.\n  * Pinhole cameras are no longer automatically reinitialized or\n    transformed based on GCP, but only refined given GCP. So, option\n    ``--disable-pinhole-gcp-init`` is the default. Use one of the\n    options ``--init-camera-using-gcp`` (:numref:`camera_solve_gcp`),\n    ``--transform-cameras-with-shared-gcp``, \n    ``--transform-cameras-using-gcp`` (:numref:`sfm_world_coords`) for\n    manipulating cameras using GCP.\n  * Bugfix in initializing pinhole cameras based on GCP for off-nadir\n    cameras. \n  * When doing multiple passes (which is the default) at each pass\n    resume not only with clean matches but also with the cameras\n    optimized so far, rather than going to the originals.\n  * Can do multiple passes with ``--heights-from-dem``. One should\n    be generous with outlier removal thresholds if not sure of \n    the input DEM accuracy (option ``--remove-outliers-params``).\n  * Remove outliers based on spatial distribution of triangulated\n    points.\n  * Bugfix when the number of interest points is 4 million or more.\n    The algorithm would just stall. It is now replaced by an OpenMVG\n    algorithm.\n  * Fold ``--remove-outliers-by-disparity-params`` into \n    ``--remove-outliers-params``.\n  * Bugfix in ``residuals_stats.txt``; the mean was correct but the\n    median was wrong.\n  * Let the default ``--heights-from-dem-weight`` be 1.0, and the\n    default ``--heights-from-dem-robust-threshold`` be 0.5. These\n    normally need tuning.\n  * Added the option ``--mapproj-dem``. If specified, evaluate \n    the disagreement of interest point matches after mapprojecting\n    onto this DEM, per interest point match pair, per matching image\n    pair, and per image. Useful at evaluating registration without\n    mapprojecting the images (:numref:`ba_out_files`).\n  * Added report files having the camera positions and orientations\n    before and after optimization (for Pinhole cameras only,\n    :numref:`ba_cam_pose`).\n  * Added options ``--proj-win`` and ``--proj-str`` for restricting\n    interest points to given area (useful when having many images\n    with footprints beyond area of interest).\n  * With ``--match-first-to-last``, write match files from earlier\n    to later images, rather than vice-versa. This was a bug, as\n    the matches were not being picked up correctly later.\n  * For pinhole cameras, can read .adjust files via\n    ``--input-adjustments-prefix``, then apply them to existing .tsai\n    files via ``--inline-adjustments``. Until now one could do either\n    one or the other. Also works with ``--initial-transform``.\n  * Added a section describing how bundle adjustment is implemented\n    (:numref:`how_ba_works`).\n\npoint2dem (:numref:`point2dem`):\n  * Added the Tukey outlier removal method option applied to\n    triangulation errors (error_thresh = 75th_pct + 1.5 * (75th_pct -\n    25th_pct)). Also print out these percentages even for the regular\n    outlier removal.\n\nbathymetry (:numref:`bathy_intro`):\n  * Added ``scale_bathy_mask.py``, for creating a PAN-sized image\n    or mask from an multispectral-sized image or mask, both for\n    WorldView data.\n\nmapproject (:numref:`mapproject`):\n  * Exposed and documented the ``--query-projection`` option.\n \nstereo_gui (:numref:`stereo_gui`):\n  * Can plot, overlay on top of images, and colorize scattered points\n    stored in a CSV file (:numref:`plot_csv`). Many colormap styles\n    are supported. See :numref:`colormap` for the list.\n  * Can show side-by-side colorized images with colorbars and coordinate\n    axes (:numref:`colorize`).\n  * Given a ``bundle_adjust`` output prefix, can select via checkboxes\n    any two images to show side-by-side, and automatically load their\n    match file or clean match file (options:\n    ``--pairwise-matches`` and ``--pairwise-clean-matches``, also\n    accessible from the top menu).\n  * Visualize pairwise matches read from an nvm file, as created by\n    ``rig_calibrator --save_nvm_no_shift``. \n  * Zoom to given proj win from the View menu. Useful for\n    reproducibility. Also accessible with the command-line option\n    ``--zoom-proj-win``.\n  * Bug fix for slow overlaying of images with different datums.\n  * When all images have a georeference, start in georeference mode.\n\ncorr_eval (:numref:`corr_eval`):\n  * Bugfix for excessive memory usage with positive ``--prefilter-mode``.\n  * Added a note saying that the user should ensure that this tool uses \n    the same ``--corr-kernel`` and ``--prefilter-mode`` as\n    ``parallel_stereo``.\n  * Added the option ``--sample-rate``.\n\ncam_gen (:numref:`cam_gen`):\n  * Can read Planet's pinhole.json files. Then no further changes\n    are made to the produced pinhole camera. \n  * Fix a bug in output camera center determination, when an input\n    camera is provided.\n  * Bugfix in initializing pinhole cameras based on GCP for off-nadir\n    cameras given image corners and no prior camera. \n  * Added the options ``--cam-height`` and ``--cam-weight`` to try\n    to keep the camera at a given height above ground.\n  * Added the option ``--cam-ctr-weight``, to help fix the camera\n    center during refinement.\n  * If ``--optical-center`` is not set for pinhole cameras, use the\n    image center (half of image dimensions) times the pixel pitch.\n    The optical bar camera always uses the image center.\n\npc_align (:numref:`pc_align`):\n  * Fix a bug with loading very large DEMs; it was failing because of\n    a 32-bit integer overflow.\n\ncolormap (:numref:`colormap`): \n  * Added six colormaps: ``black-body``, ``viridis``, ``plasma``,\n    ``kindlmann``, ``rainbow``, ``turbo``. Sources: \n    http://www.kennethmoreland.com/color-advice/ and matplotlib.\n \nmisc:\n  * Upgrade to C++-14, Python 3.9, latest libLAS, OpenCV 4, PCL 1.11,\n    Boost 1.72, ISIS 7.1.0, GDAL 3.5, and PROJ 9.1.0. The latter has a\n    whole new API, intended to handle properly transformations among\n    datums.\n  * The ``lronaccal`` tool in ISIS 7.1.0 appears buggy. Try using\n    an earlier ISIS version if this is needed.\n  * Replaced in some locations ASP's homegrown coordinate transformation\n    logic with what is in PROJ.\n  * Added the option of using the CSM camera with DigitalGlobe WorldView \n    images in bundle adjustment, stereo, and mapprojection (use with\n    ``--t dg``). Option name is ``--dg-use-csm`` and must be set\n    consistently for all tools. This speeds up ground-to-image\n    computation by a factor of about 20 (which helps with\n    mapprojection and bundle adjustment). The result of projecting\n    into the camera changes by less than 0.015 pixels from before if\n    using this option. That is due to the fact that different\n    methods are used for position and orientation interpolation.\n    The ``cam_test`` option ``--dg-vs-csm`` can be\n    used for evaluating this discrepancy. Each of these methods is\n    consistent with itself to within 2e-8 when it comes to projecting\n    from camera to ground and back. \n  * Increased the cache size to 1 GB per process for each ASP tool. \n    Added the option ``--cache-size-mb``, to set this. Made the\n    warning message refer to this option when the limit is\n    hit. Documented this for all tools.\n  * Using ``-t pinhole`` now invokes the same logic as ``-t\n    nadirpinhole --no-datum``, which is same code path used by other\n    sessions. This wipes an old alternative approach. Eliminated much\n    other duplicated and mutated code for various sessions at the\n    preprocessing stage.\n  * Bugfix for D.tif VRTs as created by ``parallel_stereo``.\n  * Allow whitespaces in stereo.default before option names. \n  * Fix a crash in ISIS for international users by setting for all ASP\n    programs the environmental variables LC_ALL and LANG to en_US.UTF-8.\n  * parallel_stereo will accept (but ignore) Unicode in stereo.default.\n  * Eliminate internal fudging of ``--ip-uniqueness-threshold``,\n    and make it equal to 0.8 for both ``stereo`` and\n    ``bundle_adjust``. This was shown to increase the number of\n    interest points in situations when not enough were found.\n  * The ``historical_helper.py`` program expects a local installation\n    of ImageMagick and the ``convert`` tool (available on most systems\n    normally).\n  \nRELEASE 3.1.0, May 18, 2022\n----------------------------\nDOI: `10.5281/zenodo.6562267 <https://doi.org/10.5281/zenodo.6562267>`_\n\nNew camera additions:\n  * Added support for the USGSCSM Frame, SAR, and PushFrame sensors\n    (until now just the Linescan sensor was supported), together \n    with documentation and examples (for Dawn, MiniRF, and WAC,\n    respectively).\n  * Added support for ISIS SAR cameras, together with an example in\n    the doc.\n  * Added support for the PeruSat-1 linescan camera model (so far just\n    the RPC model was supported for this satellite).\n\nNew tool additions:\n  * Added the program ``corr_eval``, for evaluating the quality of\n    produced correlation with several metrics. See also the new option\n    ``--save-left-right-disparity-difference`` in ``parallel_stereo``.\n  * Added the program ``otsu_threshold`` for computing an image\n    threshold. It can be used for separating land from water (in\n    WorldView multispectral NIR bands), and shadowed from lit areas\n    (in Lunar images).\n  * The program ``parallel_stereo`` can function as purely an image\n    correlation tool, without assuming any camera information, via\n    the option ``--correlator-mode``.\n  * Added the program ``image_align``. Used to align two images or\n    DEMs based on interest point matches or disparity, with given\n    alignment transform type (translation, rigid, similarity, affine,\n    and homography).\n\nisis:\n  * Using ISIS 6.0.0.\n\ncsm:\n  * Save the camera state on multiple lines. On reading both the\n    single-line and multiple-line formats are accepted.\n  * Bundle adjustment, mapproject, and SfS with the CSM model can be\n    7-15 times faster than done with the corresponding ISIS mode\n    for linescan cameras (the latter as reimplemented in ASP itself). \n    It is strongly suggested to use CSM for large-scale processing.\n  * Bugfix in CSM linescan implementation for some LRO NAC sensors.\n    Also replaced the fixed-point method with the secant method in the \n    ground-to-image logic for CSM linescan cameras, which is faster. \n\nparallel_stereo:\n  * Many fixes for reliability of stereo with local epipolar alignment.\n  * Added the option ``--resume-at-corr``. Start at the correlation stage\n    and skip recomputing the valid low-res and full-res disparities for\n    that stage.\n  * Bugfix: Eliminate edge artifacts in stereo refinement (for\n    subpixel modes 1, 2, and 3).\n  * Print in stereo_pprc the estimated convergence angle for the given\n    stereo pair (for alignment methods affineepipolar, local_epipolar, and\n    homography).\n  * Added the option ``--prev-run-prefix``, which makes parallel_stereo\n    start at the triangulation stage while using previous stages\n    from this other run. The new run can have different cameras, different\n    session (rpc vs dg, isis vs csm), different bundle\n    adjustment prefix, and different bathy planes (if applicable).\n  * Added option ``--save-left-right-disparity-difference`` to save the\n    discrepancy between left-to-right and right-to-left\n    disparities, which may help with filtering unreliable\n    disparities.\n  * Interest point matching with mapprojected images now happens\n    at full resolution, which results in a more reliable process\n    when there are clouds or if fine features are washed out at\n    low resolution.\n  * Expanded the doc to address a big gotcha: if left and right\n    mapprojected images have somewhat different resolutions, then an\n    immense disparity search range can result.\n  * Added the option ``--max-disp-spread`` to limit the spread of the\n    disparity to this value (useful with clouds in images).\n  * Added the option ``--ip-filter-using-dem`` to filter as outliers\n    interest point matches whose triangulated height differs by more\n    than given value from the height at the same location for the\n    given DEM.\n  * Added a doc section on handling of images with clouds.\n  * Disable by default velocity aberration and atmospheric refraction\n    corrections. These are not accurate enough and cause issues with\n    convergence of bundle adjustment. Can be enabled with\n    ``--enable-correct-velocity-aberration`` and\n    ``--enable-correct-atmospheric-refraction``. These improve results\n    however with Digital Globe cameras if not doing bundle\n    adjustment. (Note that these are still hard-coded as enabled for\n    optical bar camera models. This would require further study.)\n  * Added ready-made ASTER and LRO NAC examples with sample images,\n    cameras, commands, and outputs, all available for\n    download. Contributions of more examples are welcome. See\n    https://github.com/NeoGeographyToolkit/StereoPipelineSolvedExamples.\n  * Bugfix for ASTER cameras; this was fully broken.\n  * ASP's SGM and MGM algorithms will always use the cross-check for\n    disparity by default, to improve the quality, even if that takes\n    more time. It can be turned off with ``--xcorr-threshold -1``.\n  * Filter outliers in low-resolution disparity D_sub.tif. Can be\n    turned off by setting the percentage in ``--outlier-removal-params``\n    to 100.\n  * Filtering of interest points based on percentiles (using also\n    ``--outlier-removal-params``).\n  * Folded ``--remove-outliers-by-disparity-params`` into\n    ``--outlier-removal-params``. \n  * Bugfix in disparity search range handling when it is large. \n  * For Linux, in each tile's directory write the elapsed runtime and\n    memory usage to ``<tile prefix>-<prog name>-resource-usage.txt``.\n  * Removed the ``--local-homography`` option, as it is superseded by \n    ``--alignment-method local_epipolar``, which blends the local results.\n  * The stereo tool is deprecated, and can be used only with the\n    ASP_BM classical block-matching algorithm when invoked without\n    local epipolar alignment. Use parallel_stereo instead. \n  * Added the experimental ``--gotcha-disparity-refinement`` option, under\n    NASA proposal 19-PDART19_2-0094.\n \nbundle_adjust:\n  * Added the option ``--apply-initial-transform-only`` to apply an initial\n    transform to cameras while skipping image matching and other\n    steps, making the process much faster.\n  * Added the option ``--auto-overlap-params`` to automatically compute\n    which camera images overlap, if a DEM and camera footprint\n    expansion percentage are given. \n  * Added the option ``--max-pairwise-matches`` to put an upper limit on\n    the number of matches, as a large number can slow down bundle\n    adjustment. The default is 10000, likely a large overestimate (but\n    this includes potential outliers). If creating interest points\n    from disparity using ``--num-matches-from-disp-triplets``, similar\n    values should be used for both of these options.\n  * Stop printing warnings about failed triangulation if their number\n    goes over 100.\n  * Rename verbose ``final_residuals_no_loss_function_pointmap_point_log.csv``\n    to ``final_residuals_pointmap.csv`` and\n    ``final_residuals_no_loss_function_raw_pixels.txt`` to \n    ``final_residuals_raw_pixels.txt``, etc.\n  * Document the useful initial and final ``residuals_stats.txt`` files. \n  * Added new options for reusing a previous run:\n    ``--match-files-prefix`` and ``--clean-match-files-prefix``.\n\nsfs:\n  * SfS was made to work with any camera model supported by ASP,\n    including for Earth. For non-ISIS and non-CSM cameras, the option\n    ``--sun-positions`` should be used.\n  * Exhaustively tested with the CSM model. It is very recommended to\n    use that one instead of ISIS .cub cameras, to get a very large\n    speedup and multithreading. \n  * Added a new ``--gradient-weight`` parameter, constraining the \n    first-order derivatives. Can be used in combination with the\n    ``--smoothness-weight`` parameter which constrains the second-order\n    derivatives. The goal is to avoid a noisy solution without losing\n    detail.\n  * Much work on expanding the documentation.\n\nmapproject:\n  * If the input image file has an embedded RPC camera model, append\n    it to the output mapprojected file. (Which makes stereo with\n    mapprojected images work correctly in this case.)\n  * Always start a process for each tile. The default tile size \n    is set to 5120 for non-ISIS cameras and to 1024 for ISIS. Use\n    a large value of ``--tile-size`` to use fewer processes.\n\nbathymetry:\n  * Can have different water surfaces in left and right images, so the\n    triangulating rays bend at different heights.\n  * ``bathy_plane_calc`` can use a mask of pixels above water to find the\n    water-land interface, and also a set of actual ``lon, lat, height``\n    measurements.\n  * Added documentation for how to find water level heights at given \n    times and coordinates using National Ocean Service's tidal zoning\n    map.\n \npc_align:\n  * Add alignment method similarity-point-to-plane. It works better\n    than similarity-point-to-point at finding a scale between the\n    clouds when they have a large shift.\n  * Bugfix for alignment methods point-to-point and\n    similarity-point-to-point.\n  * Use RANSAC with ``--initial-transform-from-hillshading``, for increased\n    robustness to outliers. Replaced\n    ``--initial-transform-outlier-removal-params`` (based on percentiles)\n    with ``--initial-transform-ransac-params``.\n\ndem_mosaic:\n  * Add the option ``--tap``, to have the output grid be at integer\n    multiples of the grid size (like the default behavior of\n    ``point2dem`` and ``mapproject``, and ``gdalwarp`` when invoked\n    with ``-tap``). If not set, the input grids determine\n    the output grid. (The produced DEM will then extend for an\n    additional 0.5 x grid_size beyond grid centers on its perimeter.)\n  * Do not allow more than one of these operations in a given\n    dem_mosaic invocation: fill holes, blur, or erode. These won't\n    work when also having more than one input DEM, reprojection is\n    desired, or priority blending length is used. This is done to\n    avoid confusion about order of operations, and the fact that\n    different input DEMs can have different grid sizes and hence the\n    input parameters have different effects on each.\n  * Bugfix for hole-filling and blurring. Tile artifacts got removed.\n\nstereo_gui: \n  * Can cycle through given images from the View menu, or with the 'n'\n    and 'p' keys, when all images are in the same window.\n  * Can save a shapefile having points, segments, or polygons. (These\n    are distinct classes for a shapefile; the shapefile format\n    requires that these not be mixed in the same file.)\n  * Noticeable speedup when changing display mode (e.g., from\n    side-by-side to overlaid).\n  * Bugfix when overlaying shapefiles with different georeferences.\n  * Polygon layers can be set to desired colors from the left pane,\n    when overlaid.\n  * On startup, draw rectangular regions corresponding to values of\n    ``--left-image-crop-win`` and ``--right-image-crop-win``, if these\n    are passed in as command line arguments together with two images.\n  * Quietly accept parallel_stereo options and pass them on if this tool\n    is invoked from the GUI.\n\nimage_calc:\n  * Add the option ``--no-georef`` to remove any georeference\n    information in the output image (useful with subsequent GDAL-based\n    processing).\n  * Added the option ``--longitude-offset`` to help to deal with the\n    fact that ASP-produced DEMs and orthoimages may have the\n    longitudes in [0, 360] while users may prefer [-180, 180].\n  * Bugfix: The ``--input-nodata`` value, if set, now overrides the\n    value set in the metadata (the previous value then becomes valid).\n\nMisc:\n  * Added the tool ``parse_match_file.py`` to convert a binary match file\n    to text and vice-versa.\n  * Add the tool ``cam_test`` to compare two different camera models\n    for the same image. \n  * Stereo and bundle adjustment with RPC cameras now query the RPC\n    model for the datum.\n  * The ``cam2rpc`` program saves its datum which is read when needed by\n    the RPC model loader.\n  * Add the option ``--triangulation-error-factor`` to ``point2las`` to allow\n    point cloud triangulation errors multiplied by this factor and\n    rounded/clamped appropriately to be stored in the 2-byte intensity\n    field in the LAS file.\n  * Make symlinks relative in ``parallel_bundle_adjust`` for portability.\n  * The mapprojected image saves as metadata the adjustments it was\n    created with.\n  * Save the low-resolution triangulated point cloud (``PC_sub.tif``) in \n    stereo_corr (based on filtered ``D_sub.tif``).\n  * The ``ipmatch`` program can take as input just images, with the \n    .vwip files looked up by extension.\n  * Bugfix in handling projections specified via an EPSG code.\n  * Bugfix when some environmental variables or the path to ASP\n    itself have spaces. (It happens under Microsoft WSL.)\n  * Bugfix for the \"too many open files\" error for large images.\n  * Add the build date to the ``--version`` option in the ASP tools\n    and to the log files.\n  * Bugfix in the original author's MGM implementation, accepted by\n    the author.\n\nRELEASE 3.0.0, July 27, 2021\n----------------------------\nDOI: `10.5281/zenodo.5140581 <https://doi.org/10.5281/zenodo.5140581>`_\n\nNew functionality:\n  * Added new stereo algorithms: MGM (original author implementation),\n    OpenCV SGBM, LIBELAS, MSMW, MSMW2, and OpenCV BM to complement  \n    the existing ASP block matching, SGM, and MGM algorithms. See\n    https://stereopipeline.readthedocs.io/en/latest/next_steps.html\n    for usage. These will be further refined in subsequent releases.\n  * Added the ability to perform piecewise local epipolar alignment\n    for the input images, to be followed by a 1D disparity search (for\n    non-mapprojected images), as suggested by the Satellite Stereo\n    Pipeline (S2P) approach. This is still somewhat experimental.\n  * Added the ability for a user to plug into ASP any desired stereo\n    program working on image clips to which epipolar alignment has\n    been applied (as is customary in the computer vision community)\n    without rebuilding ASP.\n  * Added support for shallow-water bathymetry, so creation of terrain\n    models with correct depth determination for well-resolved areas under\n    shallow water. To be used with dg, rpc, and nadirpinhole cameras.\n  * Added two supporting tools for this: bathy_plane_calc and\n    bathy_threshold_calc.py.\n  * Added CCD artifact corrections for a few WV02 band 3 multispectral\n    images. Apart from the systematic artifacts corrected by this\n    logic, these images have a high-frequency unique pattern, and also\n    jitter, which are not corrected for. Also added tools and\n    documentation to easily tabulate more multispectral bands and TDI.\n\nisis:\n  * Upgraded to ISIS 5.0.1.\n  * Ship a full Python 3.6 runtime, as expected by ISIS.\n\ncsm:\n  * Upgraded to USGSCSM 1.5.2 (ASP's own build of it has an additional\n    bugfix for LRO NAC not present in the conda-forge package).\n  * Validated the CSM model for CTX, HiRISE, and LRO NAC cameras.\n  * Added documentation for how to create CSM models from .cub\n    cameras.\n  * Export the state of a CSM camera after bundle adjustment and\n    pc_align (only for linescan cameras supported by ISIS).\n \nparallel_stereo\n  * Will now throw an error if ``--threads`` is passed in, whose behavior\n    was not defined.\n  * Bugifx for Python 3.\n\nbundle_adjust:\n  * Added the option ``--heights-from-dem-robust-threshold``.\n  * Added the option ``--save-intermediate-cameras`` to save the cameras\n    at each iteration.\n  * Added the option ``--match-first-to-last`` to match the first several\n    images to several last images by extending the logic of\n    ``--overlap-limit`` past the last image to the earliest ones.\n\npoint2las\n  * Remove outliers by using a percentile times a factor, in a way\n    analogous to point2dem.\n   \nconvert_pinhole_model:\n  * Improve the accuracy of the RPC approximation distortion and\n    undistortion.\n\nsfs:\n  * Added the option ``--shadow-threshold`` to be able to specify\n    a single shadow threshold for all images. Also added\n    ``--custom-shadow-threshold-list``.\n  * Added the option ``--robust-threshold`` for situations when the\n    measured image intensity is unreliable.\n  * Added the option ``--estimate-height-errors`` to estimate the \n    uncertainty in height at each computed SfS DEM pixel.\n    It can be customized via ``--height-error-params``.\n  * Added an auxiliary tool named sfs_blend to replace SfS\n    pixels with ones from the original LOLA DEM in permanently\n    shadowed regions.\n\nstereo_gui:\n  * Added the ability to find the contour of a georeferenced image at\n    a given threshold. (It can be later edited, saved to disk, etc.) \n  * Bugifxes for polygon drawing logic.\n  * Much more responsive for overlaying many images.\n\nimage_calc:\n  * Support the sign function (can help in creating masks).\n\npc_align: \n  * Bugifx for ``--initial-transform-from-hillshading`` with outlier\n    removal.\n  * Add the ``--initial-transform-outlier-removal-params`` to control\n    outlier removal when finding matches between DEMs to align\n    using features detected in hillshaded images or selected\n    manually. \n  * Added ``--initial-rotation-angle``, to initialize the alignment\n    transform as the rotation with this angle (in degrees) around\n    the axis going from the planet center to the centroid of the point\n    cloud.\n\nMisc\n * Moved the daily build to the release area on GitHub, at \n   https://github.com/NeoGeographyToolkit/StereoPipeline/releases\n * Upgraded to GDAL 2.4 and PROJ4 5.2.0. (ISIS constrains updating to\n   newer versions of these.)\n * Added the option ``--ip-per-image`` to bundle adjustment and stereo, to\n   detect roughly how many interest points should be found per image\n   (only a small fraction of them may eventually match across images).\n * The ``--min-triangulation-angle`` in stereo must be always positive if \n   set by the user. Can be set to something very small if desired.\n   This is a bug fix for this rarely used option (before, when set to\n   0 it would just reset itself to some internal non-small value).  \n * Bugifx for the VisionWorkbench implementation of the\n   Levenberg-Marquardt algorithm, it was giving up prematurely in\n   challenging situations.\n * Bugifx for affine epipolar alignment. Use the OpenCV function \n   for finding the alignment matrix instead of the ASP one as OpenCV\n   can filter outliers which cause issues on rare occasions. \n * Bugfix: Do not allow a full run to take place in a directory\n   where a clip was run, as that will produce incorrect results.\n \nRELEASE 2.7.0, July 27, 2020\n----------------------------\n\nNew functionality\n   * Support for ISIS version 4.1.10. Please set ISISDATA instead of\n     ISIS3DATA with this version of ISIS and ASP.\n   * Support for the Community Sensor Model\n     (https://github.com/USGS-Astrogeology/usgscsm)\n   * Ability to install ASP with conda. See INSTALLGUIDE.rst for details.\n   * Moved the documentation to ReStructured Text, and Sphinx-Doc. See\n     the documentation at: https://stereopipeline.readthedocs.io\n   * As of this release, we have transitioned to the \n     `Semantic Versioning 2.0.0 standard <https://semver.org>`_ for ASP.\n\nbundle_adjust\n   * Can first create interest point matches among mapprojected images\n     (automatically or manually) and use those to create matches among\n     the unprojected images when the latter are so dissimilar in\n     perspective that the direct approach fails. See ``--mapprojected-data``.\n  \nstereo_gui\n   * Bug fix when zooming all images to same region when the region is\n     such that all images are seen fully.\n\nsfs\n   * Added a new very challenging example at the South Pole with drastic\n     illumination changes and using a non-stereo DEM as initial guess.\n   * Fixed a bug with craters missing under low light.\n   * Fixed a bug with computation of exposures in terrain with many shadows.\n   * Print the Sun azimuth angle for all images (useful for sorting them\n     by illumination conditions).\n\nhiedr2mosaic.py\n   * When hijitreg finds no match points between two CCDs, the program now\n     emits a warning message to STDOUT with a suggestion to perhaps\n     fiddle with hijitreg manually, and rather than fail with a\n     mysterious exception warning, now gracefully falls back to\n     assuming that there is no jitter correction between the two\n     CCDs that had no matches.\n\npoint2dem\n   * Use outlier filtering when computing the bounding box of a DEM.\n     The same option ``--remove-outliers-params`` controls this\n     just as for removing outliers by triangulation error.\n\nmapproject\n   * Fixed a bug when finding the extent of the mapprojected\n     image when the DEM to project onto spans the whole planet.\n\npoint2mesh\n   * Only meshes in .obj format are created. This format can be opened\n     in Meshlab, Blender, or some other mesh viewer.\n   * The osgviewer program is no longer shipped.\n   * Fixed a bug with invalid points not being filtered.\n   * Fixed a bug with insufficient precision (now it can be set \n     by the user and defaults to 17 digits).\n   * Added the option ``--texture-step-size`` to control the sampling\n     rate for the texture, in addition to the -s option that controls\n     the sampling rate for the point cloud.\n\nMisc\n   * Updated to C++ 11.\n   * Added phase subpixel correlation accuracy parameter.\n\nRELEASE 2.6.2, June 15, 2019\n----------------------------\n\nDOI: https://doi.org/10.5281/zenodo.3247734\n\nNew satellites\n   * Added support for SkySat, together with a detailed example,\n     including how to jointly align and optimize cameras in respect\n     to a reference DEM, while optionally refining the intrinsics. \n     This approach may be helpful for other images obtained with frame\n     cameras and uncertain positioning information.\n   * Added support for CORONA KH-4B, KH-7, and KH-9 declassified images\n     and their panoramic (optical bar) camera models, as well as using\n     and optimizing camera models with RPC distortion (only RPC is\n     supported for KH-7 because it is a linescan camera). An example\n     is in the documentation. \n   \nNew tools\n   * Added parallel_bundle_adjust which computes image statistics and\n     IP matching in a parallel manner similar to parallel_stereo.\n   * Added the cam_gen tool to create a correctly oriented pinhole\n     camera model given camera intrinsics, lon-lat coordinates of the\n     corners (or some other pixels), and optionally a ground truth\n     DEM. It can also parse SkySat's video/frame_index metafile to get\n     this data. It can also take as input any camera supported by ASP\n     via ``--input-camera`` and create a most-similar pinhole camera\n     model with given intrinsics.\n   * Added the coverage_fraction tool to provide a coverage estimate\n     of the results of a stereo call. \n   * Added the image_mosaic tool which merges together images based on\n     interest point matches.  Can be used to stitch together Corona\n     scanned images.\n   * Added a new tool, n_align, to jointly align n clouds\n     (re-implemented from Matlab, works well for small clouds that are\n     close to each other).\n\nstereo_rfne\n   * Added the option to run a non-SGM subpixel option after\n     running SGM/MGM.\n   * Added the phase correlation subpixel option. This is a Fourier\n     transform based method.\n\npc_align\n   * Added a new approach to finding an initial transform between\n     clouds, when they are DEMs, that may be more robust to large\n     scale or translation changes, or to noise. It is based on\n     hillshading the DEMs and finding interest point matches among\n     them, which are then used to find the transform. Can be invoked\n     with ``--initial-transform-from-hillshading`` <transform type>.\n     Supported transforms are: 'similarity' (rotation + translation +\n     scale), 'rigid' (rotation + translation) and 'translation'.\n   * Added the expression of the Euler angles in the North-East-Down\n     coordinate system around the center of gravity of the source\n     cloud.\n   * Bug fix: intersection of bounding boxes of the clouds takes\n     into account the initial transform applied to the source points.\n   * Added a new alignment algorithm, based on \n     https://github.com/IntelVCL/FastGlobalRegistration\n     It can be invoked with ``--alignment-method fgr``. It can perform\n     better than ICP when the clouds are close enough to each\n     other but there is a large number of outliers, when it can\n     function with very large ``--max-displacement``. It does worse if the\n     clouds need a big shift to align.\n\nbundle_adjust\n   * Two passes of bundle adjustment (with outlier filtering after\n   * first pass) is now the default. \n   * The flag ``--skip-rough-homography`` is on by default as it usually \n     gives more reliable results. Use ``--enable-rough-homography``\n     to turn this option back on (useful when the footprint on the \n     ground and difference in perspective are large).\n   * The flag ``--disable-tri-ip-filter`` is also the default as input\n     cameras may not be reliable enough for this filter. Can be \n     enabled back with ``--enable-tri-ip-filter``.\n   * Added the ``--intrinsics-limits`` option to manually specify \n     intrinsic parameter limits.\n   * Added the ``--num-random-passes`` option to allow repeat solving \n     attempts with randomly distorted initial parameters.\n   * Added option to automatically guess overlapping images from\n     Worldview style XML camera files.\n   * Removed the non-Ceres bundle adjustment options.\n   * Added the option to share or not share selected intrinsic parameters\n     between pinhole cameras when optimizing intrinsics.\n   * Improvements in solving simultaneously for both intrinsics and\n     extrinsics of n camera images if underlying ground truth\n     terrain in the form of a DEM or LIDAR point cloud is\n     present. After this bundle adjustment, pairwise stereo and DEM\n     creation, the DEMs are well-aligned to the ground truth.\n   * Added the flag ``--reference-terrain-weight`` which, when increased,\n     helps align better camera images to a given reference terrain. \n   * Added the option ``--heights-from-dem``. It is very helpful in \n     determining an unknown focal length and distortion parameters\n     for pinhole cameras.\n     It can be used together with ``---heights-from-dem-weight``.\n   * Bug fix in outlier filtering for n images.\n   * Updated Ceres version from 1.11 to 1.14. When optimizing with \n     multiple threads, results now vary slightly from run to run.\n     Results from single threaded runs are deterministic.\n   * Added a new ``--parameter-tolerance`` option. Stop when the relative\n     error in the variables being optimized is less than this.\n   * Documented the ability to create a roughly positioned \n     pinhole camera model from an image if its intrinsics and the \n     longitude and latitude (and optionally height) of its corners\n     (or some other pixels) are known.\n   * When multiple passes happen with outliers removed, match files\n     are not over-written, but a new clean copy of them gets saved.\n   * Renamed ``--create-pinhole-cameras`` to ``--inline-adjustments``, and \n     distortion_params to other_intrinsics. This is needed since\n     for the panoramic model there will be other intrinsic\n     parameters as well.\n   * Added the option ``--forced-triangulation-distance`` for when one\n     really needs to triangulate with poor cameras. Can be used with \n     a very small but positive value of ``--min-triangulation-angle``.\n   * Added the option ``--transform-cameras-using-gcp``. If there\n     are at least two images with each having at least 3 GCP\n     (each GCP need not show in more than one image), use this\n     to convert cameras from an abstract coordinate system to world\n     coordinates.\n   * Increased the default ``--num-ransac-iterations`` to 1000 from 100\n     so that the solver tries harder to find a fit.\n     Increased default ``--ip-inlier-factor`` from 1/15 to 0.2 to help\n     with getting more interest points for steep terrain.\n   * Increased the default ``--ip-uniqueness-threshold`` from 0.7 \n     to 0.8 to allow for more interest points.\n   * Option to filter interest points by elevation limit and lon-lat limit\n     after each pass of bundle adjustment except the last.\n\ndem_mosaic\n   * Added normalized median absolute deviation (NMAD) output option.\n   * Added the option ``--force-projwin`` to create a mosaic filling\n     precisely the desired box specified via ``--t_projwin``.\n\nstereo_gui\n   * Added the ability to manually reposition interest points.\n   * Can now show non-synchronous .match files (that is, each IP\n     need not be present in all images).\n   * Added basic functionality for drawing/editing/merging polygons on\n   * top of georeferenced images or DEMs. The polygons can be saved as \n     shape files, and then used to cut out portions of images with GDAL.\n   * Added the option ``--nodata-value``. Pixels with value less than \n     or equal to this are shown as transparent.\n   * Added the ability to view .vwip files (specify one per image).\n   * Can view (but not edit) GCP files, via ``--gcp-file`` (creating\n     GCP is supported in a separate mode, per the doc).\n   * The option ``--dem-file`` specifies a DEM to use when creating\n     manually picked GCP and ``--gcp-file`` specifies the name of \n     the GCP file to use upon saving such GCP.\n\nmapproject\n   * Added the ``--nearest-neighbor`` option to use that interpolation\n     method instead of bicubic.  This is better for labeled images\n     which should not be interpolated.\n\nconvert_pinhole_model\n   * Can create RPC distortion models of any degree, which can be\n     further optimized in bundle_adjust. Old RPC distortion files are\n     still supported throughout ASP, but not functionality which\n     optimizes them. They can be approximately converted to new type\n     RPC distortion files with this tool if optimization is desired.\n\nMisc\n   * Compiled against USGS ISIS version 3.6.0.\n   * Expanded the documentation explaining how to align cameras \n     to a DEM manually (or initialize such cameras) by selecting\n     matching points between the images and the DEM.\n   * The stereo tools and bundle_adjust will now cache image\n     statistics and interest points to files on disk.\n   * In stereo and bundle_adjust, when images or cameras are newer\n     than the match files, the latter get recomputed unless the tools\n     are invoked with ``--force-reuse-match-files``.\n   * Added a fix to make stereo work with the ZY3 satellite.\n   * For stereo and bundle_adjust, added the ``--no-datum`` option to\n     find interest points without assuming a reliable datum exists,\n     such as for irregularly shaped bodies. Added the related\n     option ``--skip-rough-homography`` to not use the datum in\n     rough homography computation. Added the option\n     ``--ip-num-ransac-iterations`` for finer control of interest\n     point matching. Added ``--ip-triangulation-max-error`` to control\n     the triangulation error.\n   * The cam2rpc tool accepts ``--t_srs`` and ``--semi-major-axis`` as\n     alternatives to ``--datum`` and ``--dem-file``.\n   * Add option ``--theia-overrides`` to camera_solve to make it easier\n     to customize its behavior via flags.\n   * Added an explanation for how the pinhole model works. \n   \nRELEASE 2.6.1, August 13, 2018\n------------------------------\n\nNew satellites\n   * Support Cartosat-1 and Perusat-1 RPC cameras.\n\nNew tools\n   * Added convert_pinhole_model, to convert between various\n     existing such models. \n   * Added camera_footprint as a helpful utility to show where\n     images will project on to the ground.\n   * Documented and improved the ipfind and ipmatch tools.\n     ipfind is used to detect interest points in input images,\n     either to generate .vwip files for other tools or to \n     experiment with different IP finding settings.\n     ipmatch matches the IPs contained in .vwip files to\n     create .match files.\n\nNew camera models\n    * Added simple atmospheric refraction correction to the\n      DG and SPOT5 camera models. This can be enabled\n      using the \"--enable-correct-atmospheric-refraction\" option.\n    * Added support for pinhole camera models where the lens\n      distortion is given by an RPC model (rational polynomial\n      coefficients), of degrees 4, 5, and 6. Such a model may be more\n      expressive than existing ones, and its coefficients can now be\n      optimized using bundle adjustment. An initial model can be\n      created with convert_pinhole_model.\n\nstereo_corr\n   * Added new options for post-SGM subpixel stereo. Previously only a\n     parabola method was used.\n   * Added option to perform cross-correlation checks on multiple\n     resolution levels while using SGM/MGM.\n   * Added option ``--corr-search-limit`` to constrain the automatically\n     computed correlation search range.\n   * Added ``--corr-memory-limit-mb`` option to limit the memory usage of\n     the SGM/MGM algorithms.\n   * Improved search range estimation in nadir epipolar alignment\n     cases. Added ``--elevation-limit`` option to help constrain this\n     search range.\n   * Added hybrid SGM/MGM stereo option.\n   * Improvements to SGM search range estimation.\n   * Added ``--min-num-ip`` option.\n\nbundle_adjust\n   * Added the ability to optimize pinhole camera intrinsic\n     parameters, with and without having a LIDAR or DEM ground truth\n     to be used as reference (the latter is recommended though).\n   * The tool is a lot more sensitive now to ``--camera-weight``,\n     existing results may change a lot. \n   * Added the parameters ``--rotation-weight`` and ``--translation-weight``\n     to penalize large rotation and translation changes.\n   * Added the option ``--fixed-camera-indices`` to keep some cameras\n     fixed while optimizing others. \n   * Can read the adjustments from a previous invocation of this\n     program via ``--input-adjustments-prefix``.\n   * Can read each of pc_align's output transforms and apply it\n     to the input cameras via ``--initial-transform``, to be able to \n     bring the cameras in the same coordinate system as the aligned\n     terrain (the initial transform can have a rotation, translation,\n     and scale). If ``--input-adjustments-prefix`` is specified as well,\n     the input adjustments are read first, and the pc_align \n     transform is applied on top.\n   * Renamed ``--local-pinhole`` to ``--create-pinhole-cameras``.\n   * Added the parameter ``--nodata-value`` to ignore pixels at and below\n     a threshold.\n   * Added the ability to transfer interest points manually picked in\n     mapprojected images to the the original unprojected images via\n     ``--mapprojected-data``.  \n   * Added the flag ``--use-lon-lat-height-gcp-error``. Then, if using\n     GCP, the three standard deviations are interpreted as applying\n     not to x, y, z but to latitude, longitude, and height above\n     datum (in this order). Hence, if the latitude and longitude are\n     known accurately, while the height less so, the third standard\n     deviation can be set to something much larger.\n   * Added the ability to do multiple passes of bundle adjustment,\n     removing outliers at each pass based on reprojection error and\n     disparity (difference of pixel value between images). This\n     works for any number of cameras. Match files are updated with\n     outliers removed. Controlled via ``--num-passes``,\n     ``--remove-outliers-params`` and ``--remove-outliers-by-disparity-params``.\n   * Added the option ``--save-cnet-as-csv``, to save the control\n     network containing all interest points in the format used by\n     ground control points, so it can be inspected.\n   * If ``--datum`` is specified, bundle_adjust will save to disk\n     the reprojection errors before and after optimization. \n\nstereo_gui\n   * Can view SPOT5 .BIL files.\n\npc_align\n   * Add the ability to help the tool with an initial translation\n     specified as a North-East-Down vector, to be used to correct known\n     gross offsets before proceeding with alignment. The option is\n     ``--initial-ned-translation``.\n   * When pc_align is initialized via ``--initial-transform`` or\n     ``--initial-ned-translation``, the translation vector is now computed\n     starting from the source points before any of these initial\n     transforms are applied, rather than after. The end point of this\n     vector is still the source points after alignment to the\n     reference. This is consistent with the alignment transform output\n     by the tool, which also is from the source points before any\n     initial alignment and to the reference points.\n   * The translation vector was expressed incorrectly in the\n     North-East-Down coordinate system, that is now fixed.\n\ndem_mosaic\n   * If the -o option value is specified as filename.tif, all mosaic will be\n     written to this exact file, rather than creating tiles. \n\npoint2dem \n   * Added the ability to apply a filter to the cloud points in each circular\n     neighborhood before gridding. In addition to the current weighted average\n     option, it supports min, max, mean, median, stddev, count, nmad,\n     and percentile filters. The ``--search-radius-factor`` parameter can\n     control the neighborhood size.\n   * Sped up hole-filling in ortho image generation. If this creates\n     more holes than before, it is suggested to relax all outlier filtering,\n     including via ``--remove-outliers-params``, median filtering, and erosion. \n   * Added the option ``--orthoimage-hole-fill-extra-len`` to make hole-filling\n     more aggressive by first extrapolating the cloud.\n\ndatum_convert\n   * Rewrote the tool to depend on the Proj.4 HTDPGrids grid shift system.\n     This fixed some situations where the tool was not working such as WGS84/NAD83\n     conversions and also added support for datum realizations (versions).\n   * Vertical datum conversion is only supported in simple cases like D_MARS to MOLA.\n   * Even with HTDPGrids, datum support with the Proj.4 library is poor and will\n     hopefully be improved with future releases.  Until then try to get external\n     verification of results obtained with the datum_convert tool.\n\nwv_correct\n   * Supports WV2 TDI = 32 in reverse scan direction.\n\nMisc\n   * We now compile against USGS ISIS version 3.5.2.\n   * The tools mapproject, dem_mosaic, dg_mosaic, and wv_correct support\n     the ``--ot`` option, to round the output pixels to several types of\n     integer, reducing storage, but perhaps decreasing accuracy.\n   * The tools mapproject and image_calc support the ``--mo`` option to\n     add metadata to the geoheader in the format 'VAR1=VAL1 VAR2=VAL2',\n     etc.\n   * Handle properly in bundle_adjust, orbitviz, and stereo \n     with mapprojected images the case when, for RPC cameras,\n     these coefficients are stored in _RPC.TXT files.\n   * Support for web-based PROJ.4 strings, e.g., \n     point2dem ``--t_srs`` http://spatialreference.org/ref/iau2000/49900/\n   * Added ``--max-output-size`` option to point2dem to prevent against\n     creation of too large DEMs.\n   * Added image download option in hiedr2mosaic.py.\n   * Bug fix in cam2map4stereo.py when the longitude crosses 180 degrees.\n   * Added support for running sparse_disp with your own Python installation.\n   * Bug fix for image cropping with epipolar aligned images.\n   * The sfs tool supports the integrability constraint weight from Horn 1990.\n   * The software works with both Python versions >= 2.6 and 3. \n\nRELEASE 2.6.0, May 15, 2017\n---------------------------\n\nNew stereo algorithms\n   * ASP now supports the Semi Global Matching (SGM) and \n     More Global Matching (MGM) stereo algorithms. \n     They do particularly well for Earth imagery, better \n     than the present approaches. They can be invoked with \n     ``--stereo-algorithm`` 1 and 2 respectively. \n\nNew tools\n    * Added cam2rpc, a tool to create an RPC model from any\n      ASP-supported camera. Such cameras can be used with ASP for\n      Earth and planetary data (stereo's ``--datum`` option must be set),\n      or passed to third-party stereo tools S2P and SETSM. \n    * Added correct_icebridge_l3_dem for IceBridge.\n    * Added fetch_icebridge_data for IceBridge.\n\nparallel_stereo\n   * By default, use as many processes as there are cores, and one\n     thread per processes.\n     \nstereo_pprc\n   * Large speedup in epipolar alignment.\n   * Improved epipolar alignment quality with standard pinhole cameras.\n   * Added the options ``--ip-inlier-threshold`` and ``--ip-uniqueness-threshold``\n     for finer-grained control over interest point generation.\n   * Fix a bug with interest point matching the camera model is RPC\n     and the RPC approximation domain does not intersect the datum.\n  \nstereo_corr\n   * Added new option ``--stereo-algorithm``.  Choices 1 and 2 replaces\n     the standard integer correlator with a new semi-global matching \n     (SGM) correlator or an MGM correlator respectively.  SGM/MGM is\n     slow and memory intensive but it can produce better results\n     for some challenging input images, especially for IceBridge.\n     See the manual for more details.\n\nstereo_tri\n  * Added the option ``--min-triangulation-angle`` to not triangulate\n    when rays have an angle less than this. \n \nstereo_gui\n  * Zooming in one image can trigger all other side-by-side images to\n    zoom to same region.\n  * Clicking on a pixel prints image pixel indices, value, and image \n    name. Selecting a region with Control+Mouse prints its bounds in \n    pixels, and, if georeferenced, in projected and degree units. \n  * Added a 1D profile tool for DEMs.\n  * Can visualize the pixel locations for a GCP file (by interpreting\n    them as interest points).\n  * Can save a screenshot of the current view.\n  * If all images are in the same window, can show a given image above\n    or below all others. Also can zoom to bring any image in full view\n    (from the list of images on the left).\n  * Options to set the azimuth and elevation when showing hillshaded \n    images.\n\ndem_mosaic\n   * Added the option ``--dem-blur-sigma`` to blur the output DEM.\n   * Use by default ``--weights-exponent 2`` to improve the blending,\n     and increase this to 3 if ``--priority-blending-length`` is specified.\n   * Added the options ``--tile-list``, ``--block-max``, and ``--nodata-threshold``. \n   * Display the number of valid pixels written. \n   * Do not write empty tiles. \n\ngeodiff\n   * One of the two input files can be in CSV format.\n\ndg_mosaic\n    * Save on output the mean values for MEANSUNEL, MEANSUNAZ,\n      and a few more.\n\npoint2dem\n     * Added the parameter ``--gaussian-sigma-factor`` to control the \n       Gaussian kernel width when creating a DEM (to be used together\n       with ``--search-radius-factor``).\n\nsfs\n    * Improvements, speedups, bug fixes, more documentation, usage\n      recipes, much decreased memory usage, together with a lot of\n      testing and validation for the Moon.\n    * Can run on multiple input DEM clips (which can be chosen as\n      representative for the desired large input DEM region and images)\n      to solve for adjusted camera positions throughout this region.\n    * Added parallel_sfs, to run sfs as multiple processes over\n      multiple machines.\n\nbundle_adjust\n    * Can optimize the intrinsic parameters for pinhole cameras. The\n      focal length, optical center, and distortion parameters can\n      be fixed or varied independently of each other. To be used with\n      ``--local-pinhole``, ``--solve-intrinsics``, ``--intrinsics-to-float``.\n    * Added the option ``--overlap-list``. It can be used to specify which\n      image pairs are expected to overlap and hence to be used to\n      compute matches.\n    * Added the option ``--initial-transform`` to initialize the adjustments\n      based on a 4x4 rotation + translation transform, such as coming\n      from pc_align. \n    * Added the options ``--ip-inlier-threshold`` and ``--ip-uniqueness-threshold``\n      for finer-grained control over interest point generation.\n\npc_align\n   * Can solve for a rotation + translation or for rotation +\n     translation + scale using least squares instead of ICP, if the\n     first cloud is a DEM. It is suggested that the input clouds be \n     very close or otherwise the ``--initial-transform`` option be used,\n     for the method to converge. The option is:\n     ``--alignment-method`` [ least-squares | similarity-least-squares ]\n\nMisc\n  * Built with ISIS 3.5.0.\n  * Minimum supported OS versions are OSX 10.11, RHEL 6, SUSE 12, and\n    Ubuntu 14.\n  * Ship with GDAL's gdalwarp and gdaldem.\n  * Added integration with Zenodo so that this and all future ASP \n\treleases will have a DOI.  More info in the asp_book.pdf\n\nRELEASE 2.5.3, August 24, 2016\n------------------------------\n\nHighlights:\n \n - Added the ability to process ASTER L1A VNIR images via the tool\n   aster2asp that creates image files and both RPC and rigorous\n   linescan camera models that can then be passed to stereo.\n   The RPC model seems to work just as well as the rigorous one\n   and is much faster.\n\n - Added the ability to process SPOT5 images with stereo,\n   bundle_adjust, and mapproject using a rigorous linescan camera model.\n - Added the add_spot_rpc tool to create RPC models for SPOT5\n   which allows them to be mapprojected with the RPC model.\n\npc_align \n   * Can solve for a scale change in addition to a rotation and\n     translation to best align two clouds, hence for a similarity\n     transform, using option: ``--alignment-method similarity-point-to-point``.\n\nmapproject\n   * Added ability to mapproject color images.\n   * Added option to mapproject on to a flat datum.\n\ncamera_solve\n   * Added option to accept multiple input camera models.\n\nOther:\n\ndem_mosaic\n   * Fix a bug with mosaicking of DEMs over very large extent.\n   * Fix a bug with 360 degree longitude offset.\n   * Added the option ``--use-centerline-weights``. It will compute\n     blending weights based on a DEM centerline algorithm. Produces \n     smoother weights if the input DEMs don't have holes or complicated\n     boundary.\n\ncolormap\n   * Added a new colormap scheme, 'cubehelix', that works better for\n     most color-blind people.\n\nstereo_gui\n   * Use transparent pixels for displaying no-data values instead of black.\n   * Can delete or hillshade individual images when overlaid.\n   * Add control to hide/show all images when in overlay mode.\n\nMisc\n   * Make ASP handle gracefully georeferenced images with some pixels\n     having projected coordinates outside of the range expected by PROJ.4.\n   * Removed the deprecated orthoproject tool. Now mapproject should be used. \n   * Fixed a bug in ``pc_align`` which caused the ``--max-displacement``\n     argument to be misread in some situations.\n   * Removed some extraneous code slowing down the datum_convert tool.\n   * Fixed a bug in point2dem handling the Albers Conic Equal Area projection.\n   * Added standard thread/bigtiff/LZW options to image_calc.\n \nRELEASE 2.5.2, Feb 29, 2016\n---------------------------\n\nHighlights:\n\nAdded a constellation of features and tools to support solving for\nthe positions of input images lacking position information.  Can be used\nfor aerial imagery with inaccurate or incomplete pose information,\nimages from low cost drones, historical images lacking metadata, \nand images taken with handheld cameras.\n\ncamera_solve\n   * New tool which adds support for aerial imagery etc as described above.\n   * Uses the THEIA library (http://www.theia-sfm.org/index.html)\n     to compute camera positions and orientations where no metadata is available. \n   * Ground control points and estimated camera positions\n     can be used to find absolute camera positions.\n   * Added section to documentation describing ways to use ASP to \n     process imagery from NASA's IceBridge program.\n\ncamera_calibrate\n    * A convenience camera calibration tool that is a wrapper around\n      the OpenCV checkerboard calibration program with outputs in\n      formats for camera_solve and ASP.\n\nbundle_adjust\n    * Added several options to support solving for pinhole camera\n      models in local coordinates using GCPs or estimated camera positions.\n    * Improved filtering options for which images are IP-matched.\n\norbitviz\n    * Significantly improved the accuracy of the plotted camera locations.\n    * Added option to load results from camera_solve.\n\nwv_correct\n    * Now corrects TDI 8 (Reverse) of WV01 and TDI 8 (Forward \n      and Reverse) and TDI 32 (Forward) of WV02.  Other correction\n      behavior is unchanged.\n\nstereo_corr\n   * Added the ability to filter large disparities from D_sub that \n     can greatly slow down a run. The options are ``--rm-quantile-percentile``\n     and ``--rm-quantile-multiple``. \n\nundistort_image\n    * A new tool to test out pinhole model lens distortion parameters.\n    \nLens distortion models:\n    * Switched from binary .pinhole file format to updated version of\n      the old plain text .tsai file format.\n    * Added support for Photometrix camera calibration parameters.\n    * New appendix to the documentation describing the .tsai file format\n      and supported lens distortion models.\n    \nOther:\n\nTools\n    * Suppressed pesky aux.xml warning sometimes printed by GDAL.\n    * Removed the long-deprecated orthoproject tool.\n    * Added icebridge_kmz_to_csv and lvis2kml utilities.\n\npoint2las\n    * Write correct bounding box in the header.\n    * Respect projections that are not lon-lat.\n\npoint2dem\n    * Increased speed of erode option.\n   \ndocs\n    * Mention DERT, a tool for exploring large DEMs.\n    * Added new section describing camera_solve tool in detail.\n\nRELEASE 2.5.1, November 13, 2015\n--------------------------------\n\nHighlights:\n\nstereo\n    * Added jitter correction for Digital Globe linescan imagery.\n    * Bug fix for stereo with map-projected images using the RPC\n      session (e.g, for map-projected Pleiades imagery).\n    * Added OpenCV-based SIFT and ORB interest point finding options.\n\nbundle_adjust\n    * Much improved convergence for Digital Globe cameras.\n    * Added OpenCV-based SIFT and ORB interest point finding options.\n\npoint2dem, point2las, and pc_align\n   * The datum (``-r <planet>`` or ``--semi-major-axis``) is optional now.\n     The planet will be inferred automatically (together with the\n     projection) from the input images if present. This can be useful\n     for bodies that are not Moon, Mars, or Earth. The datum and\n     projection can still be overridden with ``--reference-spheroid`` (or\n     ``--datum``) and ``--t_srs``. \n\ndem_mosaic\n   * Introduce ``--priority-blending-length``, measured in input pixels. \n     If positive, keep unmodified values from the earliest available\n     DEM at the current location except a band this wide near its\n     boundary where blending will happen. Meant to be used with \n     smaller high-resolution \"foreground\" DEMs and larger\n     lower-resolution \"background\" DEMs that should be specified later\n     in the list. Changing ``--weights-exponent`` can improve transition.\n\npc_align\n  * Added the ability to compute a manual rotation + translation +\n    scale transform based on user-selected point correspondences\n    from reference to source cloud in stereo_gui.\n\nstereo_gui\n   * Added the ability to generate ground control point (GCP) files\n     for bundle_adjust by picking features. In addition to the images\n     to be bundle-adjusted, one should provide a georeferenced image to find\n     the GCP lon-lat, and a reference DEM to find the GCP heights.\n\nOther:\n\nstereo\n    * If the input images are map-projected (georeferenced) and \n      alignment method is none, all image outputs of stereo are\n      georeferenced as well, such as GoodPixelMap, D_sub, disparity,\n      etc. As such, all these data can be overlaid in stereo_gui.\n    * The output point cloud saves datum info from input images\n      (even when the inputs are not georeferenced). \n    * Increased reliability of interest point detection.\n    * Decreased the default timeout to 900 seconds. This still needs\n      tuning and a permanent solution is necessary.\n\npoint2dem, point2las, and pc_align\n  * Accept ``--datum`` (``-r``) ``MOLA``, as a shortcut for the sphere with\n     radius 3,396,000 meters.\n\ndem_mosaic\n   * Fix an issue with minor jumps across tiles. \n   * Introduce ``--save-dem-weight`` <index>. Saves the weight image that\n     tracks how much the input DEM with given index contributed to the\n     output mosaic at each pixel (smallest index is 0).\n   * Introduce ``--save-index-map``. For each output pixel, save the\n     index of the input DEM it came from (applicable only for\n     ``--first``, ``--last``, ``--min``, and ``--max``). A text file with the index\n     assigned to each input DEM is saved as well.\n   * Rename ``--blending-length`` to ``--extra-crop-length``, for clarity. \n\ndg_mosaic \n   * Added the switch ``--fix-seams`` to use interest point matching\n     to fix seams in the output mosaic due to inconsistencies between\n     image and camera data. Such artifacts may show up in older\n     (2009 or earlier) Digital Globe images.\n\nstereo_gui\n   * Added the option ``--match-file`` to view interest point matches.\n   * Added the options ``--delete-temporary-files-on-exit`` and\n     ``--create-image-pyramids-only``.\n   * Can read the georeference of map-projected ISIS cubes.\n\npoint2dem\n   * Respect ``--t_projwin`` to the letter. \n   * Can create simultaneously DEMs at multiple resolutions (by\n     passing multiple values in quotes to ``--dem-spacing``).\n   * Fix minor discrepancies in the minor semi-axis for the WGS84,\n     NAD83 and WGS72 datums. Now using GDAL/OGR for that.\n\npoint2las\n   * Save the LAS file with a datum if the input PC had one.\n\nimage_calc\n   * Fix calculation bug when no-data is present.\n\npc_align\n  * Upgraded to the latest libpointmatcher. This may result in minor\n    alignment changes as the core algorithm got modified.\n  * Save all PC clouds with datum and projection info, if present. Add\n    comment lines with the datum and projection to CSV files.\n\ngeodiff\n   * Bug fix when the two DEMs have longitudes offset by 360 degrees.\n\ncolormap\n   * Default style is binary-red-blue. Works better than jet when \n     data goes out of range.\n\npc_merge\n   * Can merge clouds with 1 band. That is, can merge not only PC.tif\n     files but also L.tif files, with the goal of using these two\n     merged datasets to create a merged orthoimage with point2dem.\n\npoint2mesh\n   * Can create a mesh from a DEM and an orthoimage (DRG file).\n\nRELEASE 2.5.0, August 31, 2015\n------------------------------\n\nImproved speed, coverage, and accuracy for areas with steep slopes\nfor ISIS, RPC and Pinhole cameras by implementing stereo using\nimages map-projected onto an existing DEM. This mapprojection is\nmulti-process and hence much faster than cam2map. This\nfunctionality was previously available only for Digital Globe\nimages.\n\nNew tools:\n    * Added stereo_gui, an image viewer and GUI front-end.\n      Features:\n\n      - View extremely large images using a pyramid approach.\n      - If invoked with the same interface as stereo, can run stereo on \n        selected clips.\n      - Load images with int, float, and RGB pixels, including ISIS\n        cubes, DEMs, NTF, TIF, and other formats.\n      - Can overlay georeferenced images and can toggle individual\n        images on and off (like Google Earth).\n      - Show images side-by-side, as tiles on grid, or on top of each other.\n      - Create and view hillshaded DEMs.\n      - View/add/delete interest points.\n      - Create shadow thresholds by clicking on shadow pixels (needed\n        for sfs).\n      - Based on Michael Broxton's vwv tool. \n\n   * Added sfs, a tool to refine DEMs using shape-from-shading. Can\n     optimize the DEM, albedo per pixel, image exposures and camera\n     positions and orientations using a multi-resolution pyramid\n     approach. Can handle shadows. Tested with LRO NAC lunar images at\n     low latitudes and toward poles. It works only with ISIS images.\n   * Added image_calc, a tool for performing simple per-pixel arithmetic\n     operations on one or more images.\n   * Added pc_merge, a tool for concatenating ASP-produced point clouds.\n   * Added pansharp, a tool to apply a pansharp algorithm to a matched\n     grayscale image and a low resolution color image.\n   * Added datum_convert, a tool to transform a DEM to a different\n     datum (e.g., NAD27 to WGS84).\n   * Added geodiff, a tool for taking the (absolute) difference of two \n     DEMs.\n   * Documented the colormap tool. Added a new colormap option based \n     on the paper \"Diverging Color Maps for Scientific Visualization\" \n     (http://www.sandia.gov/~kmorel/documents/ColorMaps/).\n   * Added gdalinfo, gdal_translate, and gdalbuildvrt to the bin\n     directory. These executables are compiled with JPEG2000 and\n     BigTIFF support, and  can handle NTF images.\n\ndocs\n   * Added a documentation section on 'tips and tricks', summarizing \n     in one place practices for getting the most out of ASP.\n\nstereo\n   * Increase the default correlation timeout to 1800 seconds.\n   * Fix failure in interest point matching in certain circumstances.\n   * Use bundle-adjusted models (if provided) at all stages of stereo,\n     not just at triangulation.\n   * Added ``--right-image-crop-win`` in addition to ``--left-image-crop-win``.\n     If both are specified, stereo crops both images to desired regions\n     before running stereo (this is different from when only \n     ``--left-image-crop-win`` is specified, as then no actual cropping \n     happens, the domain of computation is just restricted to the desired\n     area). \n   * Bug fix, remove outliers during search range determination.\n   * Added the option ``--ip-per-tile``, to search for more interest points \n     if the default is insufficient.\n   * If the input images are georeferenced, the good pixel map will be\n     written with a georeference.\n \npoint2dem\n   * Fixed a slight discrepancy in the value of the semi-minor axis in\n     the WGS84 and NAD83 datum implementations.\n   * Added the option ``--median-filter-params`` <window size> <threshold> to\n     remove spikes using a median filter.\n   * Added the option ``--erode-length`` <num> to erode pixels from point cloud \n     boundary (after outliers are removed, but before filling in holes).\n   * Improved hole-filling, and removed the ``--hole-fill-mode`` and \n     ``--hole-fill-num-smooth-iter``, as there's only one algorithm now. \n   * Improved performance when large holes are to be filled.\n   * Can create a DEM from point clouds stored in CSV files containing\n     easting, northing, and height above datum (the PROJ.4 string\n     needed to interpret these numbers should be set with ``--csv-proj4``).\n   * Fixed a bug in creating DEMs from CSV files when different projections\n     are used on input and output.\n   * Expose to user gnomonic and oblique stereographic projections,\n     as well as false easting and false northing (where applicable). \n     This is a shortcut from using explicitly ``--t_srs`` for the PROJ.4 string.\n   * The default no-data value is set to the smallest float.\n \npc_align\n   * Can ingest CSV files containing easting, northing, and height\n     above datum (the PROJ.4 string needed to interpret these numbers\n     should be set with ``--csv-proj4``).\n   * If the reference point cloud is a DEM, the initial and final errors\n     in the statistics, as well as gross outlier removal, are done using\n     a new distance function. Instead of finding the distance from a 3D \n     point to the closest point in the cloud, the 3D point is projected \n     onto DEM's datum, its longitude and latitude are found, the\n     height in the DEM is interpolated, and and the obtained point on the \n     DEM is declared to be the closest point. This is more accurate\n     than the original implementation for coarse DEMs. The old \n     approach is available using the ``--no-dem-distances`` flag.\n   * Fix a bug with a 360 degree longitude offset.\n\npoint2las\n   * Added the ability to specify a custom projection (PROJ.4 string)\n     for output LAS files.\n\ndem_mosaic\n   * Write GeoTIFF files with blocks of size 256 x 256 as those\n     may be faster to process with GDAL tools.\n   * Bug fix when the tool is used to re-project.\n   * Added the option ``--weights-blur-sigma`` <num> to allow the blending\n     weights to be blurred by a Gaussian to increase their smoothness.\n   * Added the option ``--weight-exponent`` <num>, to allow weights\n     to increase faster than linearly.\n   * Added ``--stddev`` option to compute standard deviation.\n   * Added the ability to fill holes in the output mosaic.\n\nbundle_adjust\n    * Added new parameters, ``--ip-per-tile`` and ``--min-triangulation-angle``.\n    * Bug fix in handling situations when a point cannot get projected\n      into the camera.\n    * Bug fix in the camera adjustment logic. Any .adjust files may \n      need to be regenerated.\n\nimage2qtree\n   * Bug fixes.\n \ncam2map4stereo.py\n   * Create temporary files in current directory, to avoid access\n     issues to system directories.\n\nmapproject\n   * Can run on multiple machines.\n   * Use multiple processes for ISIS images, for a huge speedup.\n   * Bug fix, the mapprojected image should not go much beyond the DEM\n     it is mapprojected onto (where it would have no valid pixels).\n\ndg_mosaic\n   * Default penalty weight produces a more accurate fit when creating an \n     RPC model from a DG model.\n   * Handle the situation when two images to be mosaicked start at the \n     same output row number.\n   * Added ``--target-resolution`` option to specify the output resolution in meters.\n\nMisc.\n   * Upgraded to ISIS 3.4.10.\n   * Oldest supported OSX version is 10.8.\n   * Added documentation for image2qtree and hillshade.\n\nRELEASE 2.4.2, October 6, 2014\n------------------------------\n\nASP can perform multi-view triangulation (using both the\nstereo and parallel_stereo tools). The first image is set\nas reference, disparities are computed from it to the other \nones, and joint triangulation is performed.\n\nAdded a new tool, dem_mosaic, for mosaicking a large number of \nDEMs, with erosion at boundary, smooth blending, and tiled output.\nInstead of blending, the tool can do the first, last, min, max,\nmean, median, or count of encountered DEM values.   \n\ndg_mosaic\n   * Support for multi-band (multi-spectral) images. Use ``--band`` <num>\n     to pick a band to mosaic.\n      \nstereo\n   * Bug fix in interest point matching in certain circumstances.\n   * Set the correlation timeout to 600 seconds. This is generous\n     and ensures runs don't stall. \n \npoint2dem\n   * Take as input n clouds and optionally n texture files, create a\n     single DEM/orthoimage.\n   * Take as input LAS and CSV files in addition to ASP's PC format.\n   * Fix a bug in the interplay of hole-filling and outlier removal\n     for orthoimage creation.\n   * Ensure that the DEM grid is always at integer multiples of the\n     grid size. This way, two DEMs with overlapping grids of the same\n     size will be exactly on top of each other, minimizing interpolation\n     error in subsequent mosaicking.\n   * Outlier removal is on by default. Can be disabled by setting \n     the percentage in ``--remove-outliers-params`` to 100.\n \nbundle_adjust\n   * Use multiple-threads for non-ISIS sessions.\n   * Added the parameter ``--overlap-limit`` <num> to limit the number \n     of subsequent images to search for matches to the current image.\n   * Added the parameter ``--camera-weight`` <val>, to set the weight to\n     give to the constraint that the camera positions/orientations\n     stay close to the original values (only for the Ceres solver).\n\ndem_geoid\n   * Support the EGM2008 geoid. The geoid surface across all Earth\n     is computed with an error of less than 1.5 cm compared to the\n     values generated by harmonic synthesis. A 2.5 x 2.5 minute grid\n     is used.\n   * Converted the EGM geoids shipped with ASP to INT16 and JPEG2000,\n     resulting in size reduction of more than 10x. \n\nwv_correct\n    * Corrects TDI of 16, 48, 56, and 64 (forward and reverse scan\n      directions) for WV01, TDI of 8 (forward only) for WV01, and TDI\n      of 16, 48, 64 (forward and reverse scan directions) for\n      WV02. Returns uncorrected images in other cases.\n\npc_align\n    * Fix a crash for very large clouds.  \n    * Use a progress bar when loading data.\n    * Support LAS files on input and output.\n\npoint2las\n    * Bug fix when saving LAS files in respect to a datum.\n\nDocumentation\n    * Move the non-ISIS-specific tutorial sections onto its own\n      chapter, to be read by both ISIS and Earth users. Updates and\n      cleanup.\n\nRELEASE 2.4.1, 12 July, 2014\n----------------------------\n\nAdded a new tool, bundle_adjust, which uses Google's ceres-solver\nto solve for adjusted camera positions and orientations. Works\nfor n images and cameras, for all camera types supported by ASP. \n\nwv_correct\n    * Improved corrections for WV01 images of TDI 16.\n\nstereo_rfne\n    * Performance bugfix when the integer disparity is noisy.\n \nstereo_fltr\n    * Fix for large memory usage when removing small islands from\n      disparity with ``--erode-max-size``.\n\nstereo_tri\n    * Bug fixes for MER cameras.\n\nstereo_tri and mapproject\n    * Added the option ``--bundle-adjust-prefix`` to read adjusted\n      camera models obtained by previously running bundle_adjust with\n      this output prefix.\n\npoint2las\n    * LAS files can be saved in geo-referenced format in respect \n      to a specified datum (option ``--reference-spheroid``).\n \npoint2dem\n    * Bug fix, longitude could be off by 360 degrees.\n    * Robustness to large jumps in point cloud values.\n\npc_align\n    * Ability to read and write CSV files having UTM data (easting,\n      northing, height above datum).\n    * Read DEMs in the ISIS cube format.\n\nRELEASE 2.4.0, 28 April, 2014\n-----------------------------\n\nAdded wv_correct, a tool for correcting artifacts in Digital Globe\nWorldView-1 and WorldView-2 images with TDI of 16.\n\nAdded logging to a file for stereo, pc_align, point2dem, \npoint2mesh, point2las, and dem_geoid.\n\nAdded a tutorial for processing Digital Globe Earth imagery\nand expanded the MOC tutorial.\n\nBug fixes in mosaicking of Digital Globe images.\n\nparallel_stereo\n     * Use dynamic load balancing for improved performance.\n     * Automatically determine the optimal number of processes\n       and threads for each stage of stereo.\n\nstereo_pprc\n     * Added the ``--skip-image-normalization`` option (for non-ISIS \n       images and alignment-method none), it can help with reducing\n       the size of data on disk and performance.\n       \nstereo_rfne\n     * Added new affine subpixel refinement mode,\n       ``--subpixel-mode 3``. This mode sacrifices the error resistance\n       of Bayes EM mode in exchange for reduced computation time.\n       For some data sets this can perform as well as Bayes EM in\n       about one fifth the time.\n\nstereo_fltr:\n     * Hole-filling is disabled by default in stereo_fltr. It is \n       suggested to use instead point2dem's analogous functionality.\n       It can be re-enabled using ``--enable-fill-holes``.\n     * Added the option ``--erode-max-size`` to remove isolated blobs.\n     * Relaxed filtering of disparities, retaining more valid\n       disparities. Can be adjusted with ``--filter-mode`` and related\n       parameters.\n\nstereo_tri:\n    * Added ability to save triangulation error for a DEM as a 3D\n      North-East-Down vector rather than just its magnitude.\n    * When acting on map-projected images, handle the case when the \n      DEM used for map-projection does not completely encompass the \n      images.\n \npc_align:\n    * Read and write CSV files in a wide variety of formats, using \n      the ``--csv-format`` option.\n    * Display the translation component of the rigid alignment\n      transform in the local North-East-Down coordinate system, as\n      well as the centroid of source points used in alignment.\n    * Save to disk the convergence history (iteration information).\n    * Added the ability to explicitly specify the datum semi-axes.\n    * Bug fix for saving transformed clouds for Moon and Mars.\n    * More efficient processing of reference and source points\n      by loading only points in each cloud within a neighborhood\n      of the long/lat bounding box of the other cloud.\n    * Make it possible to generate ortho and error images using\n      point2dem with the transformed clouds output by pc_align.\n\npoint2dem:\n     * Replaced the core algorithm. Instead of sampling the point\n       cloud surface, which is prone to aliasing, the DEM height at a\n       given grid point is obtained as a weighted average of heights\n       of all points in the cloud within search radius of the grid\n       point, with the weights given by a Gaussian. The cutoff of the\n       Gaussian can be controlled using the ``--search-radius-factor``\n       option. The old algorithm is still available (but obsoleted)\n       using the ``--use-surface-sampling`` option. The new algorithm\n       makes the ``--fsaa`` option redundant. \n     * Added the ability to remove outliers by triangulation error,\n       either automatically (--remove-outliers) or manually, with \n       given error threshold (--max-valid-triangulation-error).\n     * Added two algorithms to fill holes in the output DEM and \n       orthoimage (--hole-fill-mode).\n     * The way the default DEM spacing is computed was modified, \n       to make dependent only on the local distribution of points\n       in the cloud and robust to outliers. \n     * Can handle highly noisy input point clouds without spikes in \n       memory usage and processing time.\n     * Improved memory usage and performance for large point clouds.\n     * Bug fix, the DEM was shifted by 1 pixel from true location.\n\nRELEASE 2.3.0, 19 November, 2013\n--------------------------------\n\nTOOLS:\n\n- Added pc_align, a tool for aligning point clouds, using the\n  libpointmatcher library\n  (https://github.com/ethz-asl/libpointmatcher). Sparse and dense\n  point clouds are supported, as well as DEMs. Two ICP methods are\n  supported, point-to-plane and point-to-point. Memory and processing\n  usage are proportional to the desired number of input points\n  to use rather than to the overall input data sizes.\n\n- Added lronac2mosaic.py, a tool for merging the LE and RE images\n  from the LRONAC camera into a single map-projected image.  The\n  output images can be fed into the stereo tool to generate DEMs.\n\n- rpc_maprpoject and orthoproject are combined into a single tool\n  for projecting a camera image onto a DEM for any camera model\n  supported by Stereo Pipeline. The old orthoproject is kept for \n  backward compatibility for a while.\n\nGENERAL: \n\n- Stereo Pipeline (almost) daily and fully verified builds for all\n  platforms are available for the adventurous user\n  (http://byss.arc.nasa.gov/stereopipeline/daily_build/, which was\n  later moved to https://github.com/NeoGeographyToolkit/StereoPipeline/releases).\n  When requesting support, please provide the output of ``stereo --version``.\n\n- The size of Stereo Pipeline output data has been reduced, by up to\n  40%, particularly point clouds and DEMs are between 30% to 70%\n  smaller.  Better encoding is used, output data is rounded (up to 1\n  mm), and point clouds are offset and saved as float instead of\n  double.\n  \n- Timeout option added for stereo correlation, preventing\n  unreasonably long correlation times for certain image tiles.\n\n- Subpixel mosaicking in dg_mosaic uses bilinear interpolation\n  instead of nearest neighbor avoiding artifacts in certain\n  situations.\n\n- dg_mosaic can generate a combined RPC model in addition to the\n  combined DG model. It accepts flags for specifying input and \n  output nodata values.\n\n- point2dem with the ``--fsaa`` option for reducing aliasing at\n  low-resolution DEM generation has been improved as to remove the\n  erosion of of valid data close to no-data values.\n\n- Bug fixes for parallel_stereo, point2dem, etc. \n\nRELEASE 2.2.2, 17 MAY 2013\n--------------------------\n(incremented from 2.2.1 after one more bugfix)\n\nTOOLS:\n\n- stereo_mpi renamed to parallel_stereo and made to work\n  on any machines with shared storage, rather than just on \n  supercomputers using Intel's MPI library. Bug fixes for\n  homography and affine epipolar alignment modes, etc.\n\n- Bug fix for dem_geoid path to geoids, more robust datum\n  identification.\n\nRELEASE 2.2.0, 6 MAY 2013\n-------------------------\n\nGENERAL:\n\n- ISIS headers removed from IsisIO's headers.\n- Removed unneeded mutex inside inpaint algorithm.\n- Interest point matching and description are parallel now.\n- Stereo pprc uses separable convolution for anti-aliasing.\n- IsisIO made compliant with ISIS 3.4.3's API.\n- Blob consolidation (for inpainting) is now parallel.\n- Yamaha RMAX code dropped.\n\nSESSIONS:\n\n- RPC mode can now read Astrium data.\n- DG added additional safety checks for XML values.\n- DG, ISIS, and RPC now have affineepipolar alignment option.\n- All sessions had their API changed. We now use Transform objects\n  instead of LUTs to reverse mapprojections and alignments.\n\nTOOLS:\n\n- Added dem_geoid, dg_mosaic, and stereo_mpi.\n- Added new interest point matching method to stereo.\n- Added new DEM seed mode for stereo.\n- Point2dem sped up by reducing over rasterization of triangles.\n- Added the ``--use-local-homography`` option to stereo_corr. Homography\n  transform is applied per tile.\n- Fix point2dem where for certain projections we were setting K=0.\n- Stereo can now operate using command-line arguments only, without \n  stereo.default.\n\nRELEASE 2.1.0, 8 JANUARY 2013\n-----------------------------\n\nGENERAL:\n\n- Added documentation for processing GeoEye, Digital Globe, and Dawn FC data.\n- Fixed implementation of internal RANSAC function.\n- DEMError has been renamed IntersectionErr. 3D IntersectionErr is\n  now recordable in local North East Down format.\n\nSESSIONS:\n\n- Added RPC processing session.\n- DG sessions now use bicubic interpolation for mapprojection arithmetic.\n- Fixed bug in case where DG XML file had single TLC entry.\n- DG sessions now applies velocity aberration corrections.\n\nTOOLS:\n\n- Have point2dem use correct nodata value when writing DRGs.\n- Fix segfault issue in point2dem due to triangle clipping.\n- Hiedr2mosaic python script now supports missing CCD files and\n  start/stop resume on noproj step for bundle adjustment.\n- Max pyramid level used for stereo correlation is configurable with\n  corr-max-levels option.\n- Stereo accepts left-image-crop-win option for processing of\n  specific image coordinates.\n- Stereo_pprc accepts nodata-threshold and nodata-percentage options\n  for masking (possibly shadows).\n- Stereo command should now correctly call secondary executables so\n  that their dependencies are loaded.\n\nRELEASE 2.0.0, 20 JUNE 2012\n---------------------------\n\nGENERAL:\n\n- Modified ASP according to API changes in ISIS 3.4.0.\n- Added new interest point matching code. Provides better initial\n  guess for search range.\n- Complete changed stereo.default format. See stereo.default.example\n  for an example.\n- Complete rewrote integer correlator for improved speed and less\n  memory use.\n- Relicense code to be Apache 2 licensed instead of NOSA.\n\nSESSIONS:\n\n- Add normalization options to PINHOLE session.\n- Added Digital Globe (DG) session. This supports the linearized\n  linescan camera model that is described in the supporting XML file.\n- Deleted KEYPOINT session. PINHOLE essentially does all of that.\n\nEXAMPLES:\n\n- Added DEMError output example for MOC.\n- Added jigsaw example for MOC.\n- Added HiRISE example dataset.\n\nTOOLS:\n\n- Dropped release of isis_adjust and bundlevis.\n- Fix int32 overflow in arithmetic for subsampling in preprocessing.\n- Remove Python 2.4 incompatible call in cam2map4stereo.py.\n- Speed up point2dem texture access by remove unnecessary mutex.\n- Add earth mode and fix non spherical support in point2dem.\n- Added lronac4staged.py.\n- Implemented D_sub or seeded integer correlation in stereo_corr.\n- Fourth channel of output PC file is now triangulation error.\n- Added ``--t_srs`` option to point2dem.\n- Added rpc_mapproject tool. This provides an optional mapprojection\n  step that can be used for DG session.\n- Allow IAU2000:* projection options to be used by point2dem.\n- No-Data is now colored black in GoodPixelMap.\n- Make noproj step in hiedr2mosaic parallel.\n\nRELEASE 1.0.5, 27 OCT 2011\n--------------------------\n\nFixed ASP to work with ISIS 3.3.0's new API changes and library\ndependencies.\n\nEnabled parallel writing in Pinhole Session.\n\nTOOLS:\n\n- Fix possible infinite loop in stereo_corr's search range.\n- Shutoff rotation invariance in automatic search range for better\n  quality results. This is possible because the input images are\n  already aligned.\n- Sub image produced by stereo_pprc are now limited to around 8MB.\n- Fix disparity_debug to work with integer disparities as well.\n- All ASP tools should now have a '--version' option.\n- Bug fix point2dem where rasterizer was accessing outside of\n  allocated memory.\n- Speed up mask generation in stereo_pprc by avoiding mutex.\n- Speed up hole filling in stereo_fltr by avoiding mutex.\n\nRELEASE 1.0.4, 23 MAY 2011\n--------------------------\n\nAdded support for CAHVORE in pinhole sessions.\n\nTOOLS:\n\n- Hide GDAL warnings caused by our file integrity checks.\n- Mostly added standardized options for settings threads and BigTIFF.\n- Have orthoproject return same type as input plus alpha channel.\n- Improved edge_masking, speeds up stereo_fltr and stereo_pprc.\n- Have cam2map4stereo.py explicitly use ISIS's getkey command.\n- Fix and optimized point2dem. Remove caching and improved rendering\n  times. This should fix BigTIFF problems that have been reported.\n- Improve triangulation times slightly when using mapprojected\n  linescan cameras.\n\nEXAMPLES:\n\n- Added orthoproject, image2qtree, colormap, hillshade examples to MOC.\n- Added K10 example dataset.\n- Added MER example dataset.\n- Added a non-mapprojected MOC example.\n- Added CTX example dataset.\n\nDOCS:\n\n- Append notes from Michael about run times.\n\nVISION WORKBENCH benefits:\n\n- Added threaded writing to colormap and hillshade.\n- Fix hillshade problems with int16 DEMs.\n\nRELEASE 1.0.3.1, 16 MARCH 2011\n------------------------------\n\nUpdated documentation and support text files to insure compatibility\nwith our third party software.\n\nRELEASE 1.0.3, 11 MARCH 2011\n----------------------------\n\nISISIO:\n  Make quaternion interaction compliant with VW changes.\n\nSESSIONS:\n  Correct reading of TSAI camera format.\n\nTOOLS:\n\n- Reduce memory footprint of ISIS_Adjust.\n- MOC Example rewritten.\n- Improve dash script that loads libraries on startup of application.\n\nVISION WORKBENCH benefits:\n\n- KD-Tree search replace with FLANN, a fast approximate nearest\n  neighbors. This improves speed of ipmatch, and ip alignment\n  option in stereo.\n- Removed exception catch in Bayesian affine sub-pixel.\n- Fixed type deduction problem on 32 bit systems.\n- Pyramid Correlator code cleaned up. Minimal speed improvement.\n- Fixed Camera Relation Network's memory leak.\n- Fix image2qtree normalization and manual geo-positioning.\n- Correct random seed call with faster solution.\n- Default raster tile size changed to 256.\n- Fix deadlocking in loading of \".vwrc\", Vision Workbench's settings file.\n\nKNOWN ISSUES\n  OSX seems to do excessive locking during multi-threaded rendering.\n  This problem is non-existent in RHEL5 and is still a mystery.\n\nRELEASE 1.0.2, 9 DECEMBER 2010\n------------------------------\n\nISISIO:\n\n- IsisCameraModel support operator<< style printing.\n- Correct camera pose return to be consistent with VW.\n- Change IsisCameraModel to use shared_ptr to block memory leak.\n\nTOOLS:\n\n- Executables should catch VW and Standard errors and print human readable\n  responses.\n- Stereo is now a python script that call multiple executables.\n- Change correlation progress bar to track total completion.\n- Bundle_Adjust and ISIS_Adjust switch from Euler's to quaternions.\n- Bundlevis dropped CAHVOR support. Added progress bar. Converted statistics\n  with CDFAccumulator.\n- Point2dem remove excessive rotation call\n- Enforce tile rasterization size to 1024 during integer correlation.\n- Select tools should now write their nodata value in the TIFF metadata.\n\nPHOTOMETRYTK\n    Still unreleased, and still under development.\n\nRELEASE 1.0.1, 24 MAY 2010\n--------------------------\n\nCORE:\n\n- Control Network Loader removed and sent to VW's Bundle Adjustment Module.\n- Build system can now use Google PerfTools.\n- Kakadu was made optional in build system (ISIS 3.2.x uses this).\n\nISISIO:\n\n- Optimized IsisCameraModel to use IsisInterface. Custom code can be loaded up\n  for individual camera types so we don't have to run through ISIS's entire\n  camera model. This allows us not to call GroundMap when the camera is not\n  mapprojected.\n- Added a series of tests for the IsisCameraModel that perform unit tests\n  with MOC and Galileo.\n- Added custom project code for Linescan cameras so not to rely on ISIS's\n  LineScanCameraGroundMap. This code is a bit more precise.\n\nMPI\n   Added new optional module called MPI that builds on top of\n   Boost MPI. This is experimental development code and is not used for\n   anything in binary release yet.\n\nPHOTOMETRYTK\n   Added new optional module call the Photometry Toolkit. This is\n   experimental development code and is not use for anything released\n   in the binary yet. This code focuses on future research of massive\n   mosaics (+100GB) and the ability to perform basic photometric corrections.\n\nSESSIONS\n   Pinhole session modified to read CMOD files as well.\n\nTOOLS:\n\n - Made orthoproject more robust against odd input georeferences.\n - orthoproject's auto scale and crop works again.\n - Point2mesh's texture is written to a different file.\n - Added aligndem and geodiff, experimental DEM alignment utilities.\n - Added a quick experimental DEM profile utility called dem_profile.\n - stereo now detects correlation settings automatically using OBALoG and\n   SGrad1 interest point functions.\n - Added cam2map4stereo.py\n - Remove excessive serial number calculations in isis_adjust.\n - Update isis_adjust to VW's new Bundle Adjustment module for a 2x improvement.\n - Stereo should now use LZW compression by default.\n - Point2dem and Stereo have added option to use directory other than /tmp for\n   intermediate files.\n - Point2dem now uses MOLA datum instead of its previous truncated value.\n - Added safety check to stereo to make sure user is not supplying the\n   same camera.\n - Added point2las, a utility for converting a point cloud to the LAS format.\n\nTESTS\n   Switched from CXXTests to GTest framework.\n\nRELEASE 1.0.0, 23 OCTOBER, 2009\n-------------------------------\n\nCORE:\n\n - OrthoRasterizer.h is subject to change for further VW integration\n - MedianFilter.h is untested/unused\n - BundleAdjustUtils.* is subject to deletion for integration with\n   ControlNetworkLoader.*\n\nSESSIONS:\n\n - ISIS Session is the only fully supported session at this time\n - Pinhole Session works but has not been tested for this release\n - Keypoint/RMAX Session status are unknown\n\nSPICEIO\n   Subject to deletion in 1.0.1\n\nTOOLS:\n\n - Point2dem can crash rarely. Still investigating.\n - rmax* utilities are not working\n"
  },
  {
    "path": "README.rst",
    "content": "==========================\nAmes Stereo Pipeline (ASP)\n==========================\n\n.. image:: https://zenodo.org/badge/DOI/latest.svg\n   :target: https://zenodo.org/badge/latestdoi/714891\n\n.. image:: https://zenodo.org/badge/DOI/Version%203.6.0.svg\n   :target: https://zenodo.org/records/18064111\n\n.. image:: https://readthedocs.org/projects/stereopipeline/badge/?version=latest\n   :target: https://stereopipeline.readthedocs.io/en/latest/?badge=latest\n   :alt: Documentation for latest version\n\nThe NASA Ames Stereo Pipeline (ASP) is a suite of free and open source\nautomated geodesy and stereogrammetry tools designed for processing\nstereo images captured from satellites (around Earth and other\nplanets), robotic rovers, aerial cameras, and historical images, with\nand without accurate camera pose information.\n\nASP produces cartographic products, including digital terrain models\n(DTMs, synonymous with digital elevation models, DEMs),\northo-projected images, 3D models, and bundle-adjusted networks of\ncameras. These data products are suitable for science analysis,\nmission planning, and public outreach.\n\n* ASP is free software released under the Apache Software License 2.0.\n* Documentation: https://stereopipeline.readthedocs.io\n\nInstallation\n============\n\nPrecompiled binaries (for Linux and macOS) are available for the stable releases\nand the current development build. Simply download the appropriate distribution\nfor your operating system, extract, and run the executables in the ``bin``\nsubdirectory.\n\n- `Stable releases, daily builds, and conda packages\n  <https://stereopipeline.readthedocs.io/en/latest/installation.html>`_\n  \nSee the `NEWS\n<https://stereopipeline.readthedocs.io/en/latest/news.html>`_\nfor the most recent additions.\n\nTo permanently add the ASP executable subdirectory to your PATH,\nyou can add the following line to your shell configuration (e.g.,\n``~/.bashrc``), replacing ``/path/to/StereoPipeline/bin`` with the location\non your filesystem: ``export PATH=${PATH}:/path/to/StereoPipeline/bin``\n\n*ISIS users*: Please install the latest `USGS ISIS\n<https://github.com/DOI-USGS/ISIS3>`_ if you would like to process NASA\nnon-terrestrial images. Users wishing to process Earth images, such as Digital\nGlobe, satellites with RPC cameras, or various frame/pinhole cameras do not need\nto download anything else. If ASP is installed with conda, it will install ISIS\nin the same environment as well, though it may not be the latest version.\n\nDocumentation\n=============\n\nThe documentation, in HTML format, is at https://stereopipeline.readthedocs.io.\n\nThe documentation includes a gentle introduction to using the Stereo Pipeline,\nan entry for each tool, and example processing workflows for many supported\nsensors.\n\nThe ReStructured Text source files for the documentation are in the `docs`\nsubdirectory of the ASP distribution.\n\nSupport and user community\n==========================\n\nAll bugs, feature requests, user questions, and general discussion\ncan be posted on the `ASP support forum\n<https://groups.google.com/forum/#!forum/ames-stereo-pipeline-support>`_.\n\nWe also encourage the posting of issues on the `GitHub repo\n<https://github.com/NeoGeographyToolkit/StereoPipeline>`_ (most\nsuch items posted on the forum will typically be converted to an\nissue there for the developers to work on), as well as pull requests.\n\nCredits\n=======\n\nASP was developed within the Autonomous Systems and Robotics area of\nthe Intelligent Systems Division at NASA's Ames Research Center. It\nleverages the Intelligent Robotics Group's (IRG) extensive experience\ndeveloping surface reconstruction and tools for planetary exploration\n(e.g., the Mars Pathfinder and Mars Exploration Rover missions, and\nrover autonomy). It has also been developed in collaboration with the\nAdaptive Control and Evolvable Systems (ACES) group, and draws on\ntheir experience developing computer vision techniques for autonomous\nvehicle control systems.\n\nSee the `list of contributors\n<https://stereopipeline.readthedocs.io/en/latest/acknowledgements.html>`_.\n\nCitation\n--------\n\nIn general, please use this reference for the Ames Stereo Pipeline:\n\n  Beyer, Ross A., Oleg Alexandrov, and Scott McMichael. 2018. The\n  Ames Stereo Pipeline: NASA's open source software for deriving and\n  processing terrain data, Earth and Space Science, 5.\n  https://doi.org/10.1029/2018EA000409.\n\nIf you are using ASP for application to Earth Images, or need a reference\nwhich details the quality of the output, then we suggest also referencing:\n\n  Shean, D. E., O. Alexandrov, Z. Moratto, B. E. Smith, I. R. Joughin,\n  C. C. Porter, Morin, P. J. 2016. An automated, open-source pipeline\n  for mass production of digital elevation models (DEMs) from very\n  high-resolution commercial stereo satellite imagery. ISPRS Journal\n  of Photogrammetry and Remote Sensing, 116.\n  https://doi.org/10.1016/j.isprsjprs.2016.03.012.\n\nIn addition to the recommended citation, we ask that you also cite\nthe DOI for the specific version of ASP that you used for processing.\nEvery new release (and daily build) of ASP will have its own unique\nDOI, which can be found `here <https://doi.org/10.5281/zenodo.598174>`_.\n\nAdditional details for how to cite ASP in your published work can be found\nin the ASP documentation.\n\nLicense\n=======\n\nSee LICENSE file for the full text of the license that applies to ASP.\n\nCopyright (c) 2009-2025, United States Government as represented by\nthe Administrator of the National Aeronautics and Space\nAdministration. All rights reserved.\n\nASP is licensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You\nmay obtain a copy of the License at\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\nimplied. See the License for the specific language governing\npermissions and limitations under the License.\n\nThird-party libraries\n=====================\n\nThis distribution may include some bundled third-party software as a\nconvenience to the user. This software, located in the ``thirdparty/``\ndirectory of the source code release, is not covered by the\nabove-mentioned distribution agreement or copyright. Binary releases\ndistribute third party software in both the ``bin`` and ``lib``\ndirectories. See the included documentation for detailed copyright and\nlicense information for any third-party software or check the\n`THIRDPARTYLICENSES\n<https://github.com/NeoGeographyToolkit/StereoPipeline/blob/master/THIRDPARTYLICENSES.rst>`_\nfile. In addition, various pieces of ASP depend on additional\nthird-party libraries that the user is expected to have installed.\n"
  },
  {
    "path": "RELEASEGUIDE",
    "content": "See https://stereopipeline.readthedocs.io/en/latest/building_asp.html. \n"
  },
  {
    "path": "THIRDPARTYLICENSES.rst",
    "content": "The NASA Ames Stereo Pipeline (ASP) would not be possible with out the\nuse of third party software that is also open source. Our binary release\nmay include the following software:\n\n======================== ============== =====\n Title                    License        URL\n======================== ============== =====\narmadillo                Apache-2.0     https://gitlab.com/conradsnicta/armadillo-code/-/blob/9.900.x/LICENSE.txt\nBoost                    MIT (modified) https://github.com/boostorg/boost/blob/master/LICENSE_1_0.txt\nBullet                   Zlib           https://github.com/bulletphysics/bullet3/blob/master/LICENSE.txt\nCERES Solver             BSD-3-clause   https://github.com/ceres-solver/ceres-solver/blob/master/LICENSE\nCURL                     MIT (modified) https://curl.se/docs/copyright.html\nEmbree                   Apache-2.0     https://github.com/embree/embree/blob/master/LICENSE.txt\nEigen                    MPL-2.0        http://eigen.tuxfamily.org/index.php?title=Main_Page#License\nFast Global Registration MIT            https://github.com/intel-isl/FastGlobalRegistration/blob/master/LICENSE\nFLANN                    BSD-3-clause   http://people.cs.ubc.ca/~mariusm/index.php/FLANN/FLANN\nGDAL                     MIT            https://gdal.org/license.html\nGEOS                     LGPL-2.1       https://trac.osgeo.org/geos/\nGFlags                   BSD-3-clause   https://github.com/gflags/gflags/blob/master/COPYING.txt\nGLog                     BSD-3-clause   https://github.com/google/glog/blob/master/COPYING\nGmm++                    LGPL-2.1       http://getfem.org/gmm.html\nGNU Parallel             GPL-3.0        https://www.gnu.org/software/parallel/\nHDF5                     BSD-3-clause   https://support.hdfgroup.org/ftp/HDF5/releases/COPYING\nHTDP                     custom         https://geodesy.noaa.gov/TOOLS/Htdp/Htdp.shtml\nIlmBase                  BSD-3-clause   https://github.com/AcademySoftwareFoundation/openexr/tree/v2.5.5/IlmBase\nImageMagick              custom         https://github.com/ImageMagick/ImageMagick/blob/master/LICENSE\nISIS                     public domain  https://github.com/USGS-Astrogeology/ISIS3/blob/dev/LICENSE.md\nJAMA                     public domain  https://math.nist.gov/tnt/download.html\nJHEAD                    public domain  http://www.sentex.net/~mwandel/jhead/\nLAPACK                   BSD-3-clause   https://github.com/Reference-LAPACK/lapack/blob/master/LICENSE\nPDAL                     BSD-3-clause   https://github.com/PDAL/PDAL/blob/master/LICENSE.txt\nLibGeoTIFF               combination    https://github.com/OSGeo/libgeotiff/blob/master/libgeotiff/LICENSE\nLibPNG                   custom         http://www.libpng.org/pub/png/src/libpng-LICENSE.txt\nlibnabo                  BSD-3-clause   https://github.com/ethz-asl/libnabo/blob/master/README.md\nlibpointmatcher          BSD-3-clause   https://github.com/ethz-asl/libpointmatcher/blob/master/README.md\nnanoflann                BSD-2-clause   https://github.com/jlblancoc/nanoflann/blob/master/COPYING\nOBALoG                   BSD-3-clause   http://krex.k-state.edu/dspace/handle/2097/3651\nOpenCV                   Apache-2.0     https://github.com/opencv/opencv/blob/master/LICENSE\nOpenEXR                  BSD-3-clause   https://github.com/AcademySoftwareFoundation/openexr/blob/master/LICENSE.md\nOpenJPEG                 BSD-2-clause   https://github.com/uclouvain/openjpeg/blob/master/LICENSE\nOpenSSL                  Apache-2.0     https://github.com/openssl/openssl/blob/master/LICENSE.txt\nPCL                      BSD-3-clause   https://github.com/PointCloudLibrary/pcl/blob/master/LICENSE.txt\nPROJ                     MIT            https://proj.org/about.html#license\nProtocol Buffers         BSD-3-clause   https://github.com/protocolbuffers/protobuf/blob/master/LICENSE\nQt                       LGPL-3.0       https://www.qt.io/licensing/\nQwt                      LGPL-2.1       https://qwt.sourceforge.io/qwtlicense.html\nSPICE                    custom         https://naif.jpl.nasa.gov/naif/rules.html\nSuiteSparse              GPL-2.0        https://github.com/DrTimothyAldenDavis/SuiteSparse/blob/master/LICENSE.txt\nSuperLU                  BSD-3-clause   https://github.com/xiaoyeli/superlu/blob/master/License.txt\nTheia                    BSD-3-clause   https://github.com/sweeneychris/TheiaSfM/blob/master/license.txt\nTNT                      public domain  https://math.nist.gov/tnt/download.html\nXerces C                 Apache-2.0     https://github.com/apache/xerces-c/blob/master/LICENSE\nyaml-cpp                 MIT            https://github.com/jbeder/yaml-cpp/blob/master/LICENSE\n======================== ============== =====\n"
  },
  {
    "path": "cmake/FindCairo.cmake",
    "content": "\n# TODO:  This was copied from here: https://github.com/alacarte-maps/alacarte/tree/master/cmake\n#        Which uses the Affero General Public License.\n#        If we end up using this make sure that is ok!\n\n\n# - Try to find the CAIRO library\n# Once done this will define\n#\n# CAIRO_ROOT_DIR - Set this variable to the root installation of CAIRO\n#\n# Read-Only variables:\n# CAIRO_FOUND - system has the CAIRO library\n# CAIRO_INCLUDE_DIR - the CAIRO include directory\n# CAIRO_LIBRARIES - The libraries needed to use CAIRO\n# CAIRO_VERSION - This is set to $major.$minor.$revision (eg. 0.9.8)\n#\n# Copyright (c) 2008 Joshua L. Blocher <verbalshadow at gmail dot com>\n# Copyright (c) 2012 Dmitry Baryshnikov <polimax at mail dot ru>\n# Copyright (c) 2013 Michael Pavlyshko <pavlushko at tut dot by>\n#\n# Distributed under the OSI-approved BSD License\n#\n\nif (NOT WIN32)\n    find_package(PkgConfig)\n    if (PKG_CONFIG_FOUND)\n        pkg_check_modules(_CAIRO cairo)\n\n        SET(CAIRO_VERSION ${_CAIRO_VERSION})\n        STRING (REGEX REPLACE \"([0-9]+).([0-9]+).([0-9]+)\" \"\\\\1\" num \"${CAIRO_VERSION}\")\n        MATH (EXPR CAIRO_VERSION_V \"${num}\")\n        STRING (REGEX REPLACE \"([0-9]+).([0-9]+).([0-9]+)\" \"\\\\2\" num \"${CAIRO_VERSION}\")\n        MATH (EXPR CAIRO_VERSION_MAJOR \"${num}\")\n        STRING (REGEX REPLACE \"([0-9]+).([0-9]+).([0-9]+)\" \"\\\\3\" num \"${CAIRO_VERSION}\")\n        MATH (EXPR CAIRO_VERSION_MINOR \"${num}\")\n    endif (PKG_CONFIG_FOUND)\nendif (NOT WIN32)\n\nSET(_CAIRO_ROOT_HINTS\n      $ENV{CAIRO}\n      ${CMAKE_FIND_ROOT_PATH}\n      ${CAIRO_ROOT_DIR}\n)\n\nSET(_CAIRO_ROOT_PATHS\n    ${CMAKE_FIND_ROOT_PATH}\n    $ENV{CAIRO}/src\n    /usr\n    /usr/local\n)\n\nSET(_CAIRO_ROOT_HINTS_AND_PATHS\n  HINTS ${_CAIRO_ROOT_HINTS}\n  PATHS ${_CAIRO_ROOT_PATHS}\n)\n\nFIND_PATH(CAIRO_INCLUDE_DIR\n    NAMES\n        cairo.h\n    HINTS\n        ${_CAIRO_INCLUDEDIR}\n        ${_CAIRO_ROOT_HINTS_AND_PATHS}\n    PATH_SUFFIXES\n        include\n        \"include/cairo\"\n)\n\nFIND_LIBRARY(CAIRO_LIBRARY\n    NAMES\n        cairo\n    HINTS\n        ${_CAIRO_LIBDIR}\n        ${_CAIRO_ROOT_HINTS_AND_PATHS}\n    PATH_SUFFIXES\n        \"lib\"\n        \"local/lib\"\n)\n\nMARK_AS_ADVANCED(CAIRO_LIBRARY)\nSET(CAIRO_LIBRARIES ${CAIRO_LIBRARY})\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(CAIRO \"Could NOT find CAIRO, try to set the path to CAIRO root folder in the system variable CAIRO\"\n    CAIRO_LIBRARIES\n    CAIRO_INCLUDE_DIR\n)\n\nMARK_AS_ADVANCED(CAIRO_INCLUDE_DIR CAIRO_LIBRARIES)\n"
  },
  {
    "path": "cmake/FindCairomm.cmake",
    "content": "\n# TODO:  This was copied from here: https://github.com/alacarte-maps/alacarte/tree/master/cmake\n#        Which uses the Affero General Public License.\n#        If we end up using this make sure that is ok!\n\n\n# - Try to find CAIROMM\n# Once done this will define\n#\n#  CAIROMM_ROOT_DIR - Set this variable to the root installation of CAIROMM\n#  CAIROMM_FOUND - system has CAIROMM\n#  CAIROMM_INCLUDE_DIR - the CAIROMM include directory\n#  CAIROMM_LIBRARIES - Link these to use CAIROMM\n#\n#  Copyright (c) 2008 Joshua L. Blocher <verbalshadow at gmail dot com>\n#  Copyright (c) 2012 Dmitry Baryshnikov <polimax at mail dot ru>\n#  Copyright (c) 2013 Michael Pavlyshko <pavlushko at tut dot by>\n#\n#  Distributed under the OSI-approved BSD License\n#\n\nif (NOT WIN32)\n    find_package(PkgConfig)\n    if (PKG_CONFIG_FOUND)\n        pkg_check_modules(_CAIROMM cairomm-1.0)\n    endif (PKG_CONFIG_FOUND)\nendif (NOT WIN32)\n\nSET(_CAIROMM_ROOT_HINTS\n    $ENV{CAIROMM}\n    ${CMAKE_FIND_ROOT_PATH}\n    ${CAIROMM_ROOT_DIR}\n) \n\nSET(_CAIROMM_ROOT_PATHS\n    ${CMAKE_FIND_ROOT_PATH}\n    $ENV{CAIROMM}/src\n    /usr\n    /usr/local\n)\n\nSET(_CAIROMM_ROOT_HINTS_AND_PATHS\n    HINTS ${_CAIROMM_ROOT_HINTS}\n    PATHS ${_CAIROMM_ROOT_PATHS}\n)\n\nFIND_PATH(CAIROMM_INCLUDE_DIR\n    NAMES\n        cairomm/cairomm.h\n    HINTS\n        ${_CAIROMM_INCLUDEDIR}\n        ${_CAIROMM_ROOT_HINTS_AND_PATHS}\n    PATH_SUFFIXES\n        include\n        \"include/cairomm-1.0\"\n)\n\nFIND_LIBRARY(CAIROMM_LIBRARY\n    NAMES\n        cairomm\n        cairomm-1.0\n    ${_CAIROMM_ROOT_HINTS_AND_PATHS}\n    PATH_SUFFIXES\n        \"lib\"\n        \"local/lib\"\n)\n\nSET(CAIROMM_LIBRARIES ${CAIROMM_LIBRARY})\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(CAIROMM \"Could NOT find CAIROMM, try to set the path to CAIROMM root folder in the system variable CAIROMM\"\n    CAIROMM_LIBRARIES\n    CAIROMM_INCLUDE_DIR\n)\n\nMARK_AS_ADVANCED(CAIROMM_INCLUDE_DIR CAIROMM_LIBRARY)\n"
  },
  {
    "path": "cmake/FindFreeType.cmake",
    "content": "# - Locate FreeType library\n# This module defines\n#  FREETYPE_LIBRARIES, the library to link against\n#  FREETYPE_FOUND, if false, do not try to link to FREETYPE\n#  FREETYPE_INCLUDE_DIRS, where to find headers.\n#  This is the concatenation of the paths:\n#  FREETYPE_INCLUDE_DIR_ft2build\n#  FREETYPE_INCLUDE_DIR_freetype2\n#\n# $FREETYPE_DIR is an environment variable that would\n# correspond to the ./configure --prefix=$FREETYPE_DIR\n# used in building FREETYPE.\n\n#=============================================================================\n# Copyright 2007-2009 Kitware, Inc.\n#\n# Distributed under the OSI-approved BSD License (the \"License\");\n# see accompanying file Copyright.txt for details.\n#\n# This software is distributed WITHOUT ANY WARRANTY; without even the\n# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See the License for more information.\n#=============================================================================\n# (To distributed this file outside of CMake, substitute the full\n#  License text for the above reference.)\n\n# Created by Eric Wing. \n# Modifications by Alexander Neundorf.\n\n# Ugh, FreeType seems to use some #include trickery which \n# makes this harder than it should be. It looks like they\n# put ft2build.h in a common/easier-to-find location which\n# then contains a #include to a more specific header in a \n# more specific location (#include <freetype/config/ftheader.h>).\n# Then from there, they need to set a bunch of #define's \n# so you can do something like:\n# #include FT_FREETYPE_H\n# Unfortunately, using CMake's mechanisms like INCLUDE_DIRECTORIES()\n# wants explicit full paths and this trickery doesn't work too well.\n# I'm going to attempt to cut out the middleman and hope \n# everything still works.\nFIND_PATH(FREETYPE_INCLUDE_DIR_ft2build ft2build.h \n  HINTS\n  $ENV{FREETYPE_DIR}\n  PATH_SUFFIXES include\n  PATHS\n  /usr/local/X11R6/include\n  /usr/local/X11/include\n  /usr/X11/include\n  /sw/include\n  /opt/local/include\n  /usr/freeware/include\n  \"C:/libs/freetype/include\"\n)\n\nFIND_PATH(FREETYPE_INCLUDE_DIR_freetype2 freetype/config/ftheader.h \n  HINTS\n  $ENV{FREETYPE_DIR}/include/freetype2\n  PATHS\n  /usr/local/X11R6/include\n  /usr/local/X11/include\n  /usr/X11/include\n  /sw/include\n  /opt/local/include\n  /usr/freeware/include\n  \"C:/libs/freetype/include\"\n  PATH_SUFFIXES freetype2\n)\n\nFIND_LIBRARY(FREETYPE_LIBRARY\n  NAMES freetype libfreetype freetype219\n  HINTS\n  $ENV{FREETYPE_DIR}\n  PATH_SUFFIXES lib64 lib\n  PATHS\n  /usr/local/X11R6\n  /usr/local/X11\n  /usr/X11\n  /sw\n  /usr/freeware\n  \"C:/libs/freetype/lib\"\n)\n\nGET_FILENAME_COMPONENT( FREETYPE_LIBRARY_DIR ${FREETYPE_LIBRARY} PATH  )\nif (WIN32)\n\tlist(APPEND FREETYPE_LIBRARY_DIR \"${FREETYPE_LIBRARY_DIR}/../bin\" )\nendif(WIN32)\n\n# set the user variables\nIF(FREETYPE_INCLUDE_DIR_ft2build AND FREETYPE_INCLUDE_DIR_freetype2)\n  SET(FREETYPE_INCLUDE_DIRS \"${FREETYPE_INCLUDE_DIR_ft2build};${FREETYPE_INCLUDE_DIR_freetype2}\")\nENDIF(FREETYPE_INCLUDE_DIR_ft2build AND FREETYPE_INCLUDE_DIR_freetype2)\nSET(FREETYPE_LIBRARIES \"${FREETYPE_LIBRARY}\")\n\n# handle the QUIETLY and REQUIRED arguments and set FREETYPE_FOUND to TRUE if \n# all listed variables are TRUE\nINCLUDE(FindPackageHandleStandardArgs)\nFIND_PACKAGE_HANDLE_STANDARD_ARGS(Freetype  DEFAULT_MSG  FREETYPE_LIBRARY  FREETYPE_INCLUDE_DIRS)\n\n\nMARK_AS_ADVANCED(FREETYPE_LIBRARY FREETYPE_INCLUDE_DIR_freetype2 FREETYPE_INCLUDE_DIR_ft2build)\n"
  },
  {
    "path": "cmake/FindSigC++.cmake",
    "content": "\n# Copied from list post here: https://mail.gnome.org/archives/libsigc-list/2012-February/msg00005.html\n# Had to add search path \"lib64/sigc++-2.0/include\"\n\n# - Try to find SigC++-2.0\n# Once done, this will define\n#\n#  SigC++_FOUND - system has SigC++\n#  SigC++_INCLUDE_DIRS - the SigC++ include directories\n#  SigC++_LIBRARIES - link these to use SigC++\n\ninclude(LibFindMacros)\n\n# Use pkg-config to get hints about paths\nlibfind_pkg_check_modules(SigC++_PKGCONF sigc++-2.0)\n\n# Main include dir\nfind_path(SigC++_INCLUDE_DIR\n  NAMES sigc++/sigc++.h\n  PATHS ${SigC++_PKGCONF_INCLUDE_DIRS}\n  PATH_SUFFIXES sigc++-2.0\n)\n\n# Glib-related libraries also use a separate config header, which is in lib dir\nfind_path(SigC++Config_INCLUDE_DIR\n  NAMES sigc++config.h\n  PATHS ${SigC++_PKGCONF_INCLUDE_DIRS} /usr\n  PATH_SUFFIXES lib/sigc++-2.0/include lib64/sigc++-2.0/include \n)\n\nmessage(\"inc dir = ${SigC++Config_INCLUDE_DIR}\")\n\nlibfind_library(SigC++ sigc 2.0)\n\n# Set the include dir variables and the libraries and let libfind_process do the rest.\n# NOTE: Singular variables for this library, plural for libraries this this lib depends on.\nset(SigC++_PROCESS_INCLUDES SigC++_INCLUDE_DIR SigC++Config_INCLUDE_DIR)\nset(SigC++_PROCESS_LIBS SigC++_LIBRARY)\nlibfind_process(SigC++)\n"
  },
  {
    "path": "cmake/LibFindMacros.cmake",
    "content": "# Version 1.0 (2013-04-12)\n# Public Domain, originally written by Lasse Kärkkäinen <tronic@zi.fi>\n# Published at http://www.cmake.org/Wiki/CMake:How_To_Find_Libraries\n\n# If you improve the script, please modify the forementioned wiki page because\n# I no longer maintain my scripts (hosted as static files at zi.fi). Feel free\n# to remove this entire header if you use real version control instead.\n\n# Changelog:\n# 2013-04-12  Added version number (1.0) and this header, no other changes\n# 2009-10-08  Originally published\n\n\n# Works the same as find_package, but forwards the \"REQUIRED\" and \"QUIET\" arguments\n# used for the current package. For this to work, the first parameter must be the\n# prefix of the current package, then the prefix of the new package etc, which are\n# passed to find_package.\nmacro (libfind_package PREFIX)\n  set (LIBFIND_PACKAGE_ARGS ${ARGN})\n  if (${PREFIX}_FIND_QUIETLY)\n    set (LIBFIND_PACKAGE_ARGS ${LIBFIND_PACKAGE_ARGS} QUIET)\n  endif (${PREFIX}_FIND_QUIETLY)\n  if (${PREFIX}_FIND_REQUIRED)\n    set (LIBFIND_PACKAGE_ARGS ${LIBFIND_PACKAGE_ARGS} REQUIRED)\n  endif (${PREFIX}_FIND_REQUIRED)\n  find_package(${LIBFIND_PACKAGE_ARGS})\nendmacro (libfind_package)\n\n# CMake developers made the UsePkgConfig system deprecated in the same release (2.6)\n# where they added pkg_check_modules. Consequently I need to support both in my scripts\n# to avoid those deprecated warnings. Here's a helper that does just that.\n# Works identically to pkg_check_modules, except that no checks are needed prior to use.\nmacro (libfind_pkg_check_modules PREFIX PKGNAME)\n  if (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4)\n    include(UsePkgConfig)\n    pkgconfig(${PKGNAME} ${PREFIX}_INCLUDE_DIRS ${PREFIX}_LIBRARY_DIRS ${PREFIX}_LDFLAGS ${PREFIX}_CFLAGS)\n  else (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4)\n    find_package(PkgConfig)\n    if (PKG_CONFIG_FOUND)\n      pkg_check_modules(${PREFIX} ${PKGNAME})\n    endif (PKG_CONFIG_FOUND)\n  endif (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4)\nendmacro (libfind_pkg_check_modules)\n\n# Do the final processing once the paths have been detected.\n# If include dirs are needed, ${PREFIX}_PROCESS_INCLUDES should be set to contain\n# all the variables, each of which contain one include directory.\n# Ditto for ${PREFIX}_PROCESS_LIBS and library files.\n# Will set ${PREFIX}_FOUND, ${PREFIX}_INCLUDE_DIRS and ${PREFIX}_LIBRARIES.\n# Also handles errors in case library detection was required, etc.\nmacro (libfind_process PREFIX)\n  # Skip processing if already processed during this run\n  if (NOT ${PREFIX}_FOUND)\n    # Start with the assumption that the library was found\n    set (${PREFIX}_FOUND TRUE)\n\n    # Process all includes and set _FOUND to false if any are missing\n    foreach (i ${${PREFIX}_PROCESS_INCLUDES})\n      if (${i})\n        set (${PREFIX}_INCLUDE_DIRS ${${PREFIX}_INCLUDE_DIRS} ${${i}})\n        mark_as_advanced(${i})\n      else (${i})\n        set (${PREFIX}_FOUND FALSE)\n      endif (${i})\n    endforeach (i)\n\n    # Process all libraries and set _FOUND to false if any are missing\n    foreach (i ${${PREFIX}_PROCESS_LIBS})\n      if (${i})\n        set (${PREFIX}_LIBRARIES ${${PREFIX}_LIBRARIES} ${${i}})\n        mark_as_advanced(${i})\n      else (${i})\n        set (${PREFIX}_FOUND FALSE)\n      endif (${i})\n    endforeach (i)\n\n    # Print message and/or exit on fatal error\n    if (${PREFIX}_FOUND)\n      if (NOT ${PREFIX}_FIND_QUIETLY)\n        message (STATUS \"Found ${PREFIX} ${${PREFIX}_VERSION}\")\n      endif (NOT ${PREFIX}_FIND_QUIETLY)\n    else (${PREFIX}_FOUND)\n      if (${PREFIX}_FIND_REQUIRED)\n        foreach (i ${${PREFIX}_PROCESS_INCLUDES} ${${PREFIX}_PROCESS_LIBS})\n          message(\"${i}=${${i}}\")\n        endforeach (i)\n        message (FATAL_ERROR \"Required library ${PREFIX} NOT FOUND.\\nInstall the library (dev version) and try again. If the library is already installed, use ccmake to set the missing variables manually.\")\n      endif (${PREFIX}_FIND_REQUIRED)\n    endif (${PREFIX}_FOUND)\n  endif (NOT ${PREFIX}_FOUND)\nendmacro (libfind_process)\n\nmacro(libfind_library PREFIX basename)\n  set(TMP \"\")\n  if(MSVC80)\n    set(TMP -vc80)\n  endif(MSVC80)\n  if(MSVC90)\n    set(TMP -vc90)\n  endif(MSVC90)\n  set(${PREFIX}_LIBNAMES ${basename}${TMP})\n  if(${ARGC} GREATER 2)\n    set(${PREFIX}_LIBNAMES ${basename}${TMP}-${ARGV2})\n    string(REGEX REPLACE \"\\\\.\" \"_\" TMP ${${PREFIX}_LIBNAMES})\n    set(${PREFIX}_LIBNAMES ${${PREFIX}_LIBNAMES} ${TMP})\n  endif(${ARGC} GREATER 2)\n  find_library(${PREFIX}_LIBRARY\n    NAMES ${${PREFIX}_LIBNAMES}\n    PATHS ${${PREFIX}_PKGCONF_LIBRARY_DIRS}\n  )\nendmacro(libfind_library)\n\n"
  },
  {
    "path": "cmake/Utilities.cmake",
    "content": "# This file contains functions used in other parts of the project.\n\n# Obtains a file list with all the files in a directory properly formatted\nfunction(get_all_source_files relativePath outputFileList)\n\n  # Load all matching files into TEMP\n  file(GLOB TEMP\n      \"${CMAKE_CURRENT_SOURCE_DIR}/${relativePath}/*.h\"\n      \"${CMAKE_CURRENT_SOURCE_DIR}/${relativePath}/*.hpp\"\n      \"${CMAKE_CURRENT_SOURCE_DIR}/${relativePath}/*.cc\"\n      \"${CMAKE_CURRENT_SOURCE_DIR}/${relativePath}/*.cpp\"\n      \"${CMAKE_CURRENT_SOURCE_DIR}/${relativePath}/*.cxx\"      \n      \"${CMAKE_CURRENT_SOURCE_DIR}/${relativePath}/*.tcc\"\n  )\n  set(fileList) # Empty list\n  foreach(f ${TEMP}) # Iterate through TEMP\n    get_filename_component(FILENAME ${f} NAME) # Extract just the file name\n    set(fileList ${fileList} ${FILENAME}) # Append to the list\n  endforeach(f)\n  set(${outputFileList} ${fileList} PARENT_SCOPE) \nendfunction(get_all_source_files)\n\n# Look for a library dependency, starting with the given search\n# folder. If the header files are in a subfolder of \"include\",\n# specify that one in \"inc_subfolder\". The value of \n# LIB_SUBDIR is used for CSM to find the library.\nfunction(find_external_library name search_folder inc_subfolder libNameList required)\n\n  # Define the variable names we will create\n  set(FOUND_NAME \"${name}_FOUND\")\n  set(LIB_NAME   \"${name}_LIBRARIES\")\n  set(INC_NAME   \"${name}_INCLUDE_DIR\")\n  set(ASP_NAME   \"ASP_HAVE_PKG_${name}\") # TODO: Remove VW/ASP name!\n\n  if(search_folder)\n    set(${FOUND_NAME} 1)\n\n    set(ext \".so\")\n    if (APPLE)\n      set(ext \".dylib\")\n    endif()\n\n    # Add each lib file that was provided.\n    set(${${LIB_NAME}} \"\")\n    foreach(lib ${libNameList})\n      set(FULL_NAME \"lib${lib}${ext}\")\n      set(FULL_PATH \"${search_folder}/lib/${LIB_SUBDIR}${FULL_NAME}\")\n      if (NOT EXISTS ${FULL_PATH})\n          # Try to see if maybe the lib is with an extension\n          file(GLOB LIB_FILES ${FULL_PATH}*)\n          list(GET LIB_FILES 0 FULL_PATH2) # get zero-th element\n          if (EXISTS ${FULL_PATH2})\n              set(FULL_PATH ${FULL_PATH2})\n          else()\n              message(STATUS \"Missing library file: ${FULL_PATH}\")\n              set(${FOUND_NAME} 0)\n              continue()\n          endif()\n      endif()\n      set(${LIB_NAME} ${${LIB_NAME}} ${FULL_PATH})\n    endforeach()\n    \n    set(${INC_NAME} ${search_folder}/include/${inc_subfolder})\n    string(REGEX REPLACE \"/$\" \"\" ${INC_NAME} ${${INC_NAME}}) # rm trailing /\n  else()\n    # TODO: Provide effective findX.cmake files to handle these.\n    find_package(${name} REQUIRED)\n  endif()\n  # Check and display our results\n  if(${FOUND_NAME})\n    set(${ASP_NAME} 1)\n    message(STATUS \"Found include files for ${name} at ${${INC_NAME}}\")\n    include_directories(\"${${INC_NAME}}\")\n  else()\n    if (${required})\n      message( FATAL_ERROR \"Failed to find REQUIRED library ${name}.\" )\n    else()\n      message(STATUS \"Failed to find ${name}\")\n    endif()\n  endif()\n\n  # Pass the results back up to the parent function\n  set(${FOUND_NAME} ${${FOUND_NAME}} PARENT_SCOPE)\n  set(${LIB_NAME}   ${${LIB_NAME}}   PARENT_SCOPE)\n  set(${INC_NAME}   ${${INC_NAME}}   PARENT_SCOPE)\n  set(${ASP_NAME}   ${${ASP_NAME}}   PARENT_SCOPE)\n \n  message(STATUS \"Found libraries for ${name} at ${${LIB_NAME}}\")\n\nendfunction(find_external_library)\n\n# Define a custom make target that will run all tests with normal gtest output.\n# - Normally you can run 'make test' to run all tests but the output is brief.\n# - With this you can run 'make gtest_all' to run all tests with more output.\nif (NOT TARGET gtest_all)\n  add_custom_target(gtest_all)\nendif()\n# Call this function once for each gtest target.\nmacro(add_to_custom_test_target test_target)\n  add_custom_target(${test_target}_runtest\n                    COMMAND ${test_target} #cmake 2.6 required\n                    DEPENDS ${test_target}\n                    WORKING_DIRECTORY \"${CMAKE_BINARY_DIR}\")\n  add_dependencies(gtest_all ${test_target}_runtest)\nendmacro()\n\n\n## Add the shared precompiled header to the current target.\n## - Build it for the first target, then reuse it for all later targets.\n#function(add_precompiled_header_to_target target)\n  \n#  #set(PCH_PATH \"${CMAKE_HOME_DIRECTORY}/src/vw/stdafx.h\")\n#  set(PCH_PATH \"../stdafx.h\")\n#  message(\"PCH_PATH = ${PCH_PATH}\")\n#  message(\"target = ${target}\")\n#  get_property(pchFirstLibrary GLOBAL PROPERTY storedPchFirstLibrary)\n  \n#  if(${pchFirstLibrary} STREQUAL \"NA\")\n#    # First time this is called, don't reuse the PCH compilation.\n#    set_property(GLOBAL PROPERTY storedPchFirstLibrary ${target})\n#    target_precompiled_header(${target} ${PCH_PATH})\n#  else()\n#     target_precompiled_header(${target} ${PCH_PATH} REUSE ${pchFirstLibrary})\n#  endif()\n  \n#endfunction(add_precompiled_header_to_target)\n\n\n# Function to add a library to the project.\n# - This is called in each library folder directory.\nfunction(add_library_wrapper libName fileList testFileList dependencyList)\n\n  # Set up the library\n  add_library(${libName} SHARED ${fileList})\n\n  set_target_properties(${libName} PROPERTIES LINKER_LANGUAGE CXX)\n  \n  #message(\"For ${libName}, linking DEPS: ${dependencyList}\")\n  target_link_libraries(${libName} ${dependencyList})\n\n  # All libraries share the same precompiled header.\n  #add_precompiled_header_to_target(${libName})\n\n  install(TARGETS ${libName} DESTINATION lib)\n\n  # Set all the header files to be installed to the include directory\n  foreach(f ${fileList})\n    get_filename_component(extension ${f} EXT) # Get file extension  \n    string( TOLOWER \"${extension}\" extensionLower )\n    if( extensionLower STREQUAL \".h\" OR extensionLower STREQUAL \".hpp\" OR extensionLower STREQUAL \".tcc\")\n      set(fullPath \"${CMAKE_CURRENT_SOURCE_DIR}/${f}\")\n      # TODO(oalexan1): This is very fragile code because \"asp\" can\n      # also match build_asp and what not.\n      # That is why here we do the regex twice.\n      # Need to replace with code which simply installs the \"asp\"\n      # subdir.\n      STRING(REGEX MATCH \"/asp/.*/\" dir1 ${fullPath})\n      STRING(REGEX MATCH \"asp/.*/\" dir ${dir1})\n      INSTALL(FILES ${f} DESTINATION include/${dir})\n    endif()\n  endforeach(f)\n\n\n  # Add unit test for each test file given\n  set(TEST_MAIN_PATH \"${CMAKE_SOURCE_DIR}/src/test/test_main.cc\")\n  foreach(f ${testFileList})\n\n    get_filename_component(filename ${f} NAME_WE) # Get file name without extension\n    set(executableName \"${libName}_${filename}\")   # Generate a name for the executable   \n\n    #message(\"Adding test target ${executableName}\")\n\n    # Add executable with shared main file and this file\n    # - This executeable should not be built unless running tests.\n    add_executable( ${executableName} EXCLUDE_FROM_ALL  ${TEST_MAIN_PATH} ./tests/${f} )      \n\n    # Link test executable against current library, gtest, and gtest_main\n    #target_link_libraries(${executableName} gtest \"${libName}\" ${GTEST_BOTH_LIBRARIES})\n    #message(\"For ${executableName}, linking DEPS: ${dependencyList};${libName}\")\n    target_link_libraries(${executableName} gtest gtest_main ${dependencyList} ${libName})\n\n    target_compile_definitions(${executableName} PRIVATE GTEST_USE_OWN_TR1_TUPLE=1)\n    target_compile_definitions(${executableName} PRIVATE \"TEST_OBJDIR=\\\"${CMAKE_CURRENT_SOURCE_DIR}/tests\\\"\")\n    target_compile_definitions(${executableName} PRIVATE \"TEST_SRCDIR=\\\"${CMAKE_CURRENT_SOURCE_DIR}/tests\\\"\")\n\n\n    # These variables need to be set for each test directory\n    #set_property (TARGET ${executableName} APPEND PROPERTY COMPILE_DEFINITIONS \"TEST_OBJDIR=\\\"${CMAKE_CURRENT_SOURCE_DIR}/tests\\\"\")\n    #set_property (TARGET ${executableName} APPEND PROPERTY COMPILE_DEFINITIONS \"TEST_SRCDIR=\\\"${CMAKE_CURRENT_SOURCE_DIR}/tests\\\"\")\n\n    add_test(${executableName} ${executableName}) \n    add_to_custom_test_target(${executableName})  # Add to the verbose test make target.\n  endforeach(f)\n\nendfunction( add_library_wrapper )\n\n\n"
  },
  {
    "path": "cmake/linux_cross_toolchain.cmake",
    "content": "# Cross-compile toolchain for building on Mac ARM64 targeting Linux x86_64.\n#\n# Both VisionWorkbench and StereoPipeline have a copy of this file. Keep them\n# in sync when making changes.\n#\n# Prerequisites:\n#   - conda-forge clang 16+ with -fopenmp support (in MAC_ASP_DEPS env)\n#   - lld (LLVM linker) in MAC_ASP_DEPS env\n#   - Linux deps prefix with sysroot and GCC 12.4.0 libraries\n#\n# Usage (VW, from build_linux/):\n#   cmake .. \\\n#     -DCMAKE_TOOLCHAIN_FILE=../cmake/linux_cross_toolchain.cmake \\\n#     -DLINUX_DEPS_PREFIX=$HOME/miniconda3/envs/asp_deps_linux \\\n#     -DMAC_ASP_DEPS=$HOME/anaconda3/envs/asp_deps \\\n#     -DASP_DEPS_DIR=$HOME/miniconda3/envs/asp_deps_linux \\\n#     -DCMAKE_INSTALL_PREFIX=$HOME/projects/StereoPipeline/install_linux\n#\n# Usage (ASP, from build_linux/):\n#   cmake .. \\\n#     -DCMAKE_TOOLCHAIN_FILE=../cmake/linux_cross_toolchain.cmake \\\n#     -DLINUX_DEPS_PREFIX=$HOME/miniconda3/envs/asp_deps_linux \\\n#     -DMAC_ASP_DEPS=$HOME/anaconda3/envs/asp_deps \\\n#     -DASP_DEPS_DIR=$HOME/miniconda3/envs/asp_deps_linux \\\n#     -DVISIONWORKBENCH_INSTALL_DIR=$HOME/projects/StereoPipeline/install_linux \\\n#     -DCMAKE_INSTALL_PREFIX=$HOME/projects/StereoPipeline/install_linux \\\n#     -DOpenMP_C_FLAGS=-fopenmp \\\n#     -DOpenMP_CXX_FLAGS=-fopenmp \\\n#     -DOpenMP_C_LIB_NAMES=omp \\\n#     -DOpenMP_CXX_LIB_NAMES=omp \\\n#     -DOpenMP_omp_LIBRARY=${LINUX_DEPS_PREFIX}/lib/libomp.so\n\n# Propagate these variables to try_compile() projects. Without this, CMake's\n# ABI detection re-invokes this toolchain file but loses the -D variables.\nlist(APPEND CMAKE_TRY_COMPILE_PLATFORM_VARIABLES LINUX_DEPS_PREFIX MAC_ASP_DEPS)\n\n# Validate required variables.\nif(NOT DEFINED LINUX_DEPS_PREFIX)\n  message(FATAL_ERROR \"Set -DLINUX_DEPS_PREFIX=/path/to/asp_deps_linux\")\nendif()\nif(NOT DEFINED MAC_ASP_DEPS)\n  message(FATAL_ERROR \"Set -DMAC_ASP_DEPS=/path/to/mac/asp_deps\")\nendif()\n\n# Derived paths.\nset(CROSS_SYSROOT \"${LINUX_DEPS_PREFIX}/x86_64-conda-linux-gnu/sysroot\")\n# Auto-detect GCC version in the linux prefix.\nfile(GLOB GCC_VERSION_DIRS \"${LINUX_DEPS_PREFIX}/lib/gcc/x86_64-conda-linux-gnu/*\")\nlist(GET GCC_VERSION_DIRS 0 GCC_LIB)\nmessage(STATUS \"Cross-compile: GCC lib dir = ${GCC_LIB}\")\nset(GCC_INC \"${GCC_LIB}/include/c++\")\n\n# Target platform.\nset(CMAKE_SYSTEM_NAME Linux)\nset(CMAKE_SYSTEM_PROCESSOR x86_64)\n\n# Compilers (conda-forge clang from the Mac env).\nset(CMAKE_C_COMPILER \"${MAC_ASP_DEPS}/bin/clang\")\nset(CMAKE_CXX_COMPILER \"${MAC_ASP_DEPS}/bin/clang++\")\n\n# Compiler flags. Pass --sysroot directly in flags instead of using\n# CMAKE_SYSROOT, which strips path prefixes and corrupts other paths.\nset(CROSS_COMMON_FLAGS\n  \"--target=x86_64-unknown-linux-gnu \\\n   --sysroot=${CROSS_SYSROOT} \\\n   --gcc-toolchain=${LINUX_DEPS_PREFIX} \\\n   -B${GCC_LIB} \\\n   -fuse-ld=${MAC_ASP_DEPS}/bin/ld.lld \\\n   -I${CROSS_SYSROOT}/usr/include \\\n   -L${GCC_LIB} \\\n   -L${LINUX_DEPS_PREFIX}/lib\")\n\nset(CMAKE_C_FLAGS_INIT \"${CROSS_COMMON_FLAGS}\")\nset(CMAKE_CXX_FLAGS_INIT\n  \"${CROSS_COMMON_FLAGS} \\\n   -isystem ${GCC_INC} \\\n   -isystem ${GCC_INC}/x86_64-conda-linux-gnu \\\n   -Wno-enum-constexpr-conversion\")\n\n# Linker flags.\nset(CMAKE_EXE_LINKER_FLAGS_INIT \"-L${GCC_LIB} -L${LINUX_DEPS_PREFIX}/lib\")\nset(CMAKE_SHARED_LINKER_FLAGS_INIT \"-L${GCC_LIB} -L${LINUX_DEPS_PREFIX}/lib\")\n\n# Search only the cross-prefix for libraries and headers.\nset(CMAKE_FIND_ROOT_PATH \"${LINUX_DEPS_PREFIX}\")\nset(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)\nset(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)\nset(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)\n\n# Qt moc/rcc/uic are host tools that must run on Mac, not target Linux binaries.\nset(QT_HOST_PATH \"${MAC_ASP_DEPS}\")\nset(QT_MOC_EXECUTABLE \"${MAC_ASP_DEPS}/bin/moc\")\nset(QT_RCC_EXECUTABLE \"${MAC_ASP_DEPS}/bin/rcc\")\nset(QT_UIC_EXECUTABLE \"${MAC_ASP_DEPS}/bin/uic\")\n"
  },
  {
    "path": "conda/asp_2.7.0_linux_env.yaml",
    "content": "name: asp\nchannels:\n  - nasa-ames-stereo-pipeline\n  - usgs-astrogeology\n  - conda-forge\n  - defaults\ndependencies:\n  - _libgcc_mutex=0.1=conda_forge\n  - _openmp_mutex=4.5=0_gnu\n  - ale=0.7.2=py36h9e03d57_1\n  - armadillo=9.200.7=hf4e8f56_0\n  - arpack=3.7.0=hc6cf775_1\n  - blas=1.1=openblas\n  - boost=1.68.0=py36h8619c78_1001\n  - boost-cpp=1.68.0=h11c811c_1000\n  - bullet=2.86.1=0\n  - bz2file=0.98=py_0\n  - bzip2=1.0.8=h516909a_2\n  - ca-certificates=2020.6.20=hecda079_0\n  - cairo=1.14.6=4\n  - ceres-solver=1.14.0=h0948850_10\n  - certifi=2020.6.20=py36h9f0ad1d_0\n  - csm=v3.0.3.1=h6bb024c_1001\n  - cspice=66=h516909a_1009\n  - curl=7.64.0=h646f8bb_0\n  - dbus=1.13.0=h4e0c4b3_1000\n  - decorator=4.4.2=py_0\n  - eigen=3.3.7=hc9558a2_1001\n  - embree=2.16.0=0\n  - expat=2.2.9=he1b5a44_2\n  - ffmpeg=3.4.1=0\n  - fgr=e78ce15=hf484d3e_0\n  - flann=1.9.1=0\n  - font-ttf-dejavu-sans-mono=2.37=hab24e00_0\n  - font-ttf-inconsolata=2.001=hab24e00_0\n  - font-ttf-source-code-pro=2.030=hab24e00_0\n  - font-ttf-ubuntu=0.83=hab24e00_0\n  - fontconfig=2.12.1=4\n  - fonts-conda-forge=1=0\n  - freetype=2.7=1\n  - gdal=2.0.2=hf484d3e_0\n  - geoid=1.0=1\n  - geos=3.7.3=he1b5a44_0\n  - geotiff=1.4.2=hb54a4aa_1\n  - gettext=0.19.8.1=hc5be6a0_1002\n  - gflags=2.2.2=he1b5a44_1002\n  - giflib=5.2.1=h516909a_2\n  - glib=2.51.4=0\n  - glog=0.4.0=h49b9bf7_3\n  - gmm=5.0=0\n  - gmp=6.2.0=he1b5a44_2\n  - gsl=2.6=h294904e_0\n  - gst-plugins-base=1.8.0=0\n  - gstreamer=1.8.0=2\n  - harfbuzz=1.3.4=2\n  - hdf5=1.8.18=3\n  - htdp=1.0=1\n  - icu=58.2=hf484d3e_1000\n  - ilmbase=2.5.2=h8b12597_0\n  - imagemagick=6.8.6_10=hf484d3e_0\n  - isis=4.1.0=0\n  - isis-headers=4.1.0=1000\n  - jama=125=0\n  - jasper=1.900.1=4\n  - jpeg=9b=h024ee3a_2\n  - kakadu=1=0\n  - krb5=1.16.3=hc83ff2d_1000\n  - laszip=2.1.0=hf484d3e_1\n  - ld_impl_linux-64=2.34=h53a641e_5\n  - libblas=3.8.0=11_openblas\n  - libcblas=3.8.0=11_openblas\n  - libcurl=7.64.0=h01ee5af_0\n  - libedit=3.1.20191231=h46ee950_0\n  - libffi=3.2.1=he1b5a44_1007\n  - libgcc=7.2.0=h69d50b8_2\n  - libgcc-ng=9.2.0=h24d8f2e_2\n  - libgfortran=3.0.0=1\n  - libgfortran-ng=7.5.0\n  - libgomp=9.2.0=h24d8f2e_2\n  - libiconv=1.15=h516909a_1006\n  - liblapack=3.8.0=11_openblas\n  - liblas=1.8.1=hf484d3e_1000\n  - libnabo=2df86e0=hf484d3e_0\n  - libopenblas=0.3.6=h5a2b251_2\n  - libpng=1.6.37=hed695b0_1\n  - libpointmatcher=bcf4b04=hf484d3e_0\n  - libpq=10.6=h13b8bad_1000\n  - libprotobuf=3.9.1=h8b12597_0\n  - libssh2=1.8.0=h1ad7b7a_1003\n  - libstdcxx-ng=9.2.0=hdf63c60_2\n  - libtiff=4.0.9=he6b73bb_1\n  - libuuid=2.32.1=h14c3975_1000\n  - libwebp=0.5.2=7\n  - libxcb=1.13=h14c3975_1002\n  - libxml2=2.9.9=h13577e0_2\n  - llvm-openmp=8.0.1=hc9558a2_0\n  - mesalib=18.3.1=h590aaf7_0\n  - metis=5.1.0=he1b5a44_1005\n  - mysql=5.7.20=hf484d3e_1001\n  - mysql-connector-c=6.1.11=hab6429c_1002\n  - nanoflann=1.3.1=0\n  - ncurses=6.1=hf484d3e_1002\n  - networkx=2.4=py_1\n  - nlohmann_json=3.7.3=he1b5a44_1\n  - nn=1.86.0=h14c3975_2003\n  - numpy=1.13.3=py36_blas_openblas_200\n  - openblas=0.2.19=2\n  - opencv=3.2.0=np113py36_blas_openblas_203\n  - openexr=2.5.2=he513fc3_0\n  - openjpeg=2.1.0=6\n  - openmp=8.0.1=0\n  - openssl=1.0.2u=h516909a_0\n  - parallel=20200522=0\n  - pbzip2=1.1.13=0\n  - pcl=1.9.1=h482114b_1002\n  - pcre=8.44=he1b5a44_0\n  - perl=5.26.2=h516909a_1006\n  - pip=20.1.1=py_1\n  - pixman=0.34.0=h14c3975_1003\n  - postgresql=10.6=h66cca7a_1000\n  - proj4=4.9.3=h516909a_9\n  - protobuf=3.9.1=py36he1b5a44_0\n  - pthread-stubs=0.4=h14c3975_1001\n  - pvl=0.3.0=py_1\n  - python=3.6.7=hd21baee_1002\n  - python-dateutil=2.8.1=py_0\n  - python_abi=3.6=1_cp36m\n  - pytz=2020.1=pyh9f0ad1d_0\n  - pyyaml=5.3.1=py36h8c4c3a4_0\n  - qhull=7.2.0=0\n  - qt=5.9.6=0\n  - qwt=6.1.3=0\n  - readline=7.0=hf8c457e_1001\n  - scipy=1.2.1=py36h09a28d5_1\n  - setuptools=47.3.1=py36h9f0ad1d_0\n  - six=1.15.0=pyh9f0ad1d_0\n  - spiceypy=2.3.2=py_0\n  - sqlite=3.28.0=h8b20d00_0\n  - stereo-pipeline=2.7.0=hf484d3e_20200727\n  - suitesparse=5.7.2=h717dc36_0\n  - superlu=5.2.1=hfe2efc7_1207\n  - tbb=2020.1=hc9558a2_0\n  - theia=f5d93f5=hf484d3e_1001\n  - tk=8.6.10=hed695b0_0\n  - tnt=126=0\n  - tzcode=2020a=h516909a_0\n  - usgscsm=a53f9cf=h6bb024c_0\n  - visionworkbench=2.7.0=hf484d3e_0\n  - wheel=0.34.2=py_1\n  - x264=20131218=0\n  - xerces-c=3.1.4=0\n  - xorg-fixesproto=5.0=h14c3975_1002\n  - xorg-inputproto=2.3.2=h14c3975_1002\n  - xorg-kbproto=1.0.7=h14c3975_1002\n  - xorg-libice=1.0.10=h516909a_0\n  - xorg-libsm=1.2.3=h84519dc_1000\n  - xorg-libx11=1.6.9=h516909a_0\n  - xorg-libxau=1.0.9=h14c3975_0\n  - xorg-libxdmcp=1.1.3=h516909a_0\n  - xorg-libxext=1.3.4=h516909a_0\n  - xorg-libxfixes=5.0.3=h516909a_1004\n  - xorg-libxi=1.7.10=h516909a_0\n  - xorg-libxrender=0.9.10=h516909a_1002\n  - xorg-renderproto=0.11.1=h14c3975_1002\n  - xorg-xextproto=7.3.0=h14c3975_1002\n  - xorg-xproto=7.0.31=h14c3975_1007\n  - xz=5.2.5=h516909a_0\n  - yaml=0.2.5=h516909a_0\n  - zlib=1.2.11=h516909a_1006\n\n"
  },
  {
    "path": "conda/asp_2.7.0_osx_env.yaml",
    "content": "name: asp\nchannels:\n  - nasa-ames-stereo-pipeline\n  - usgs-astrogeology\n  - conda-forge\n  - defaults\ndependencies:\n  - ale=0.7.2=py36h855b5bd_1\n  - armadillo=9.200.4=hcb88e47_1205\n  - arpack=3.6.3=h06d5271_1005\n  - blas=1.1=openblas\n  - boost=1.68.0=py36h9888f84_1001\n  - boost-cpp=1.68.0=h6f8c590_1000\n  - bullet=2.86.1=0\n  - bz2file=0.98=py_0\n  - bzip2=1.0.8=h0b31af3_2\n  - ca-certificates=2020.6.20=hecda079_0\n  - cairo=1.14.6=4\n  - ceres-solver=1.14.0=hb9d6bad_10\n  - certifi=2020.6.20=py36h9f0ad1d_0\n  - csm=v3.0.3.1=1001\n  - cspice=66=h0b31af3_1007\n  - curl=7.64.0=heae2a1f_0\n  - decorator=4.4.2=py_0\n  - eigen=3.3.7=ha1b3eb9_1001\n  - embree=2.16.0=h6834224_0\n  - expat=2.2.9=h4a8c4bd_2\n  - ffmpeg=3.4.1=0\n  - fgr=e78ce15=h0a44026_0\n  - flann=1.9.1=0\n  - font-ttf-dejavu-sans-mono=2.37=hab24e00_0\n  - font-ttf-inconsolata=2.001=hab24e00_0\n  - font-ttf-source-code-pro=2.030=hab24e00_0\n  - font-ttf-ubuntu=0.83=hab24e00_0\n  - fontconfig=2.12.1=4\n  - fonts-conda-forge=1=0\n  - freetype=2.7=1\n  - gdal=2.0.2=h0a44026_0\n  - geoid=1.0=1\n  - geos=3.7.3=h4a8c4bd_0\n  - geotiff=1.4.2=hb54a4aa_1\n  - gettext=0.19.8.1=h46ab8bc_1002\n  - gflags=2.2.2=h4a8c4bd_1002\n  - giflib=5.2.1=h0b31af3_2\n  - glib=2.51.4=0\n  - glog=0.4.0=h700f914_3\n  - gmm=5.0=h6aef312_0\n  - gmp=6.2.0=h4a8c4bd_2\n  - gsl=2.6=ha2d443c_0\n  - harfbuzz=1.3.4=2\n  - hdf5=1.8.18=3\n  - htdp=1.0=1\n  - icu=58.2=h0a44026_1000\n  - ilmbase=2.5.2=hd174df1_0\n  - imagemagick=6.8.6_10=h0a44026_0\n  - isis=4.1.0=0\n  - isis-headers=4.1.0=1000\n  - jama=125=0\n  - jasper=1.900.1=4\n  - jpeg=9b=he5867d9_2\n  - kakadu=1=0\n  - krb5=1.16.3=h24a3359_1000\n  - laszip=2.1.0=h0a44026_1\n  - libblas=3.8.0=11_openblas\n  - libcblas=3.8.0=11_openblas\n  - libcurl=7.64.0=h76de61e_0\n  - libcxx=10.0.0=1\n  - libedit=3.1.20191231=hed1e85f_0\n  - libffi=3.2.1=h4a8c4bd_1007\n  - libgcc=4.8.5=hdbeacc1_10\n  - libgfortran=3.0.1=0\n  - libiconv=1.15=h0b31af3_1006\n  - liblapack=3.8.0=11_openblas\n  - liblas=1.8.1=h0a44026_1000\n  - libnabo=2df86e0=h0a44026_0\n  - libopenblas=0.3.6=hdc02c5d_2\n  - libpng=1.6.37=hbbe82c9_1\n  - libpointmatcher=bcf4b04=h0a44026_0\n  - libpq=10.6=hbe1e24e_1000\n  - libprotobuf=3.9.1=hfbae3c0_0\n  - libssh2=1.8.0=hf30b1f0_1003\n  - libtiff=4.0.9=he6b73bb_1\n  - libwebp=0.5.2=7\n  - libxcb=1.13=h1de35cc_1002\n  - libxml2=2.9.9=hd80cff7_2\n  - llvm-openmp=10.0.1=h28b9765_0\n  - mesalib=18.0.0=hb6cfc13_1\n  - metis=5.1.0=h4a8c4bd_1005\n  - mysql=5.7.20=h0a44026_1001\n  - mysql-connector-c=6.1.11=had4e77e_1002\n  - nanoflann=1.3.1=0\n  - ncurses=6.1=h0a44026_1002\n  - networkx=2.4=py_1\n  - nlohmann_json=3.7.3=h4a8c4bd_1\n  - nn=1.86.0=h1de35cc_2003\n  - numpy=1.13.3=py36_blas_openblas_200\n  - openblas=0.2.19=2\n  - opencv=3.2.0=np113py36_blas_openblas_203\n  - openexr=2.5.2=h7475705_0\n  - openjpeg=2.1.0=6\n  - openssl=1.0.2u=h0b31af3_0\n  - parallel=20200522=0\n  - pbzip2=1.1.13=h9d27c22_1\n  - pcl=1.9.1=hdd77166_1002\n  - pcre=8.44=h4a8c4bd_0\n  - perl=5.26.2=haec8ef5_1006\n  - pip=20.1.1=py36_1\n  - pixman=0.34.0=h1de35cc_1003\n  - postgresql=10.6=ha1bbaa7_1000\n  - proj4=4.9.3=h01d97ff_9\n  - protobuf=3.9.1=py36h6de7cb9_0\n  - pthread-stubs=0.4=h1de35cc_1001\n  - pvl=0.3.0=py_1\n  - python=3.6.7=h4a56312_1002\n  - python-dateutil=2.8.1=py_0\n  - python_abi=3.6=1_cp36m\n  - pytz=2020.1=pyh9f0ad1d_0\n  - pyyaml=5.3.1=py36h37b9a7d_0\n  - qhull=7.2.0=0\n  - qt=5.9.6=0\n  - qwt=6.1.3=0\n  - readline=7.0=hcfe32e1_1001\n  - scipy=1.2.1=py36hbd7caa9_1\n  - setuptools=47.3.1=py36_0\n  - six=1.15.0=pyh9f0ad1d_0\n  - spiceypy=2.3.2=py_0\n  - sqlite=3.28.0=h9721f7c_0\n  - stereo-pipeline=2.7.0=20200727\n  - suitesparse=5.7.2=h0e59142_0\n  - superlu=5.2.1=hbced767_1205\n  - tbb=2019.9=ha1b3eb9_1\n  - theia=f5d93f5=h0a44026_1001\n  - tk=8.6.10=hb0a8c7a_0\n  - tnt=126=0\n  - tzcode=2020a=h0b31af3_0\n  - usgscsm=a53f9cf=h04f5b5a_0\n  - visionworkbench=2.7.0=0\n  - wheel=0.34.2=py36_0\n  - x264=20131218=0\n  - xerces-c=3.1.4=h10f7eb2_0\n  - xorg-fixesproto=5.0=h1de35cc_1002\n  - xorg-inputproto=2.3.2=h1de35cc_1002\n  - xorg-kbproto=1.0.7=h1de35cc_1002\n  - xorg-libice=1.0.10=h01d97ff_0\n  - xorg-libsm=1.2.3=h01d97ff_1000\n  - xorg-libx11=1.6.9=h0b31af3_0\n  - xorg-libxau=1.0.9=h1de35cc_0\n  - xorg-libxdmcp=1.1.3=h01d97ff_0\n  - xorg-libxext=1.3.4=h01d97ff_0\n  - xorg-libxfixes=5.0.3=h01d97ff_1004\n  - xorg-libxi=1.7.10=h01d97ff_0\n  - xorg-xextproto=7.3.0=h1de35cc_1002\n  - xorg-xproto=7.0.31=h1de35cc_1007\n  - xz=5.2.5=h1de35cc_0\n  - yaml=0.2.5=h0b31af3_0\n  - zlib=1.2.11=h1de35cc_3\n\n"
  },
  {
    "path": "conda/asp_3.0.0_linux_env.yaml",
    "content": "name: asp\nchannels:\n  - nasa-ames-stereo-pipeline\n  - usgs-astrogeology\n  - conda-forge\n  - defaults\ndependencies:\n  - _libgcc_mutex=0.1=conda_forge\n  - _openmp_mutex=4.5=1_gnu\n  - _sysroot_linux-64_curr_repodata_hack=3=h5bd9786_12\n  - ale=0.8.5=py36h605e78d_3\n  - armadillo=9.900.5=h7c03176_0\n  - arpack=3.7.0=hc6cf775_2\n  - blas=1.1=openblas\n  - boost=1.68.0=py36h8619c78_1001\n  - boost-cpp=1.68.0=h11c811c_1000\n  - bullet=2.86.1=0\n  - bz2file=0.98=py_0\n  - bzip2=1.0.8=h7f98852_4\n  - ca-certificates=2021.5.30=ha878542_0\n  - cairo=1.14.6=4\n  - ceres-solver=1.14.0=h0948850_10\n  - certifi=2021.5.30=py36h5fab9bb_0\n  - chrpath=0.16=h7f98852_1002\n  - csm=3.0.3.3=hc9558a2_0\n  - cspice=66=h7f98852_1014\n  - curl=7.64.0=h646f8bb_0\n  - dbus=1.13.0=h4e0c4b3_1000\n  - decorator=5.0.9=pyhd8ed1ab_0\n  - eigen=3.3.7=hc9558a2_1001\n  - embree=2.16.0=0\n  - expat=2.4.1=h9c3ff4c_0\n  - ffmpeg=3.4.1=0\n  - fftw=3.3.8=nompi_hfc0cae8_1114\n  - fgr=isis5.0.1\n  - flann=1.9.1=0\n  - fontconfig=2.12.1=4\n  - freetype=2.7=1\n  - geoid=1.0=1\n  - geos=3.7.3=he1b5a44_0\n  - geotiff=1.4.3=hb6868eb_1001\n  - gettext=0.19.8.1=hf34092f_1004\n  - gflags=2.2.2=he1b5a44_1004\n  - giflib=5.2.1=h36c2ea0_2\n  - git=2.14.2=2\n  - glib=2.51.4=0\n  - glog=0.4.0=h49b9bf7_3\n  - gmm=5.0=0\n  - gmp=6.2.1=h58526e2_0\n  - gsl=2.7=he838d99_0\n  - gst-plugins-base=1.8.0=0\n  - gstreamer=1.8.0=2\n  - harfbuzz=1.3.4=2\n  - hdf5=1.8.18=3\n  - htdp=1.0=1\n  - icu=58.2=hf484d3e_1000\n  - ilmbase=2.5.5=h780b84a_0\n  - imagemagick=isis5.0.1\n  - inja=3.3.0=h9c3ff4c_0\n  - isis=5.0.1=0\n  - jama=125=0\n  - jasper=1.900.1=h07fcdf6_1006\n  - jpeg=9d=h36c2ea0_0\n  - kakadu=1=0\n  - kernel-headers_linux-64=3.10.0=h4a8ded7_12\n  - krb5=1.16.3=hc83ff2d_1000\n  - laszip=2.1.0=hf484d3e_1\n  - ld_impl_linux-64=2.35.1=h7274673_9\n  - libblas=3.8.0=17_openblas\n  - libcblas=3.8.0=17_openblas\n  - libcurl=7.64.0=h01ee5af_0\n  - libedit=3.1.20191231=he28a2e2_2\n  - libelas=isis5.0.1\n  - libffi=3.2.1=he1b5a44_1007\n  - libgcc=7.2.0=h69d50b8_2\n  - libgcc-ng=11.1.0=hc902ee8_8\n  - libgdal=2.4.1_isis5.0.1=h3fd9d12_0\n  - libgfortran=3.0.0=1\n  - libgfortran-ng=7.5.0=h14aa051_19\n  - libgfortran4=7.5.0=h14aa051_19\n  - libglvnd-cos7-x86_64=1.0.1=h9b0a68f_1105\n  - libgomp=11.1.0=hc902ee8_8\n  - libiconv=1.15=h516909a_1006\n  - liblapack=3.8.0=17_openblas\n  - liblas=isis5.0.1\n  - libnabo=isis5.0.1\n  - libopenblas=0.3.10=h5a2b251_0\n  - libpng=1.6.37=h21135ba_2\n  - libpointmatcher=isis5.0.1\n  - libpq=10.6=h13b8bad_1000\n  - libprotobuf=3.9.2=h8b12597_0\n  - libssh2=1.8.0=h1ad7b7a_1003\n  - libstdcxx-ng=11.1.0=h56837e0_8\n  - libtiff=4.0.10=hc3755c2_1005\n  - libuuid=2.32.1=h7f98852_1000\n  - libwebp=0.5.2=7\n  - libxcb=1.13=h7f98852_1003\n  - libxml2=2.9.9=h13577e0_2\n  - llvm-openmp=8.0.1=hc9558a2_0\n  - lz4-c=1.9.3=h9c3ff4c_1\n  - mesalib=18.3.1=h590aaf7_0\n  - metis=5.1.0=h58526e2_1006\n  - mpfr=4.1.0=h9202a9a_1\n  - mysql=5.7.20=hf484d3e_1001\n  - mysql-connector-c=6.1.11=hab6429c_1002\n  - nanoflann=1.3.2=ha770c72_0\n  - ncurses=6.2=he6710b0_1\n  - networkx=2.5=py_0\n  - nlohmann_json=3.10.2=h9c3ff4c_0\n  - nn=1.86.0=h14c3975_2003\n  - numpy=1.13.3=py36_blas_openblas_200\n  - openblas=0.2.19=2\n  - opencv=3.2.0=np113py36_blas_openblas_203\n  - openexr=2.5.5=hf817b99_0\n  - openjpeg=2.1.0=6\n  - openmp=8.0.1=0\n  - openssl=1.0.2u=h516909a_0\n  - parallel=20210822=ha770c72_0\n  - pbzip2=1.1.13=0\n  - pcl=1.9.1=h482114b_1002\n  - pcre=8.45=h9c3ff4c_0\n  - perl=5.32.1=0_h7f98852_perl5\n  - pip=21.0.1=py36h06a4308_0\n  - pixman=0.34.0=h14c3975_1003\n  - postgresql=10.6=h66cca7a_1000\n  - proj4=5.2.0=he1b5a44_1006\n  - protobuf=3.9.2=py36he1b5a44_1\n  - pthread-stubs=0.4=h36c2ea0_1001\n  - pvl=1.2.1=pyhd8ed1ab_0\n  - python=3.6.7=hd21baee_1002\n  - python-dateutil=2.8.2=pyhd8ed1ab_0\n  - python_abi=3.6=2_cp36m\n  - pytz=2021.1=pyhd8ed1ab_0\n  - pyyaml=5.4.1=py36h8f6f2f9_1\n  - qhull=7.2.0=0\n  - qt=5.9.6=7\n  - qwt=6.1.3=0\n  - readline=7.0=hf8c457e_1001\n  - s2p-subset=isis5.0.1\n  - scipy=1.2.1=py36h09a28d5_1\n  - setuptools=52.0.0=py36h06a4308_0\n  - six=1.16.0=pyh6c4a22f_0\n  - spiceypy=2.3.2=py_0\n  - sqlite=3.28.0=h8b20d00_0\n  - stereo-pipeline=3.0.0=h3fd9d12_0\n  - suitesparse=5.10.1=hd8046ac_0\n  - superlu=5.2.2=hfe2efc7_0\n  - sysroot_linux-64=2.17=h4a8ded7_12\n  - tbb=2020.2=h4bd325d_4\n  - theia=isis5.0.1\n  - tk=8.6.10=hbc83047_0\n  - tnt=126=0\n  - tzcode=2021a=h7f98852_2\n  - usgscsm=1.5.2\n  - visionworkbench=3.0.0=h3fd9d12_0\n  - wheel=0.37.0=pyhd3eb1b0_0\n  - x264=20131218=0\n  - xerces-c=3.1.4=0\n  - xorg-fixesproto=5.0=h7f98852_1002\n  - xorg-inputproto=2.3.2=h7f98852_1002\n  - xorg-kbproto=1.0.7=h7f98852_1002\n  - xorg-libice=1.0.10=h7f98852_0\n  - xorg-libsm=1.2.3=hd9c2040_1000\n  - xorg-libx11=1.7.2=h7f98852_0\n  - xorg-libxau=1.0.9=h7f98852_0\n  - xorg-libxdmcp=1.1.3=h7f98852_0\n  - xorg-libxext=1.3.4=h7f98852_1\n  - xorg-libxfixes=5.0.3=h7f98852_1004\n  - xorg-libxi=1.7.10=h7f98852_0\n  - xorg-libxrender=0.9.10=h7f98852_1003\n  - xorg-renderproto=0.11.1=h7f98852_1002\n  - xorg-xextproto=7.3.0=h7f98852_1002\n  - xorg-xproto=7.0.31=h7f98852_1007\n  - xz=5.2.5=h7b6447c_0\n  - yaml=0.2.5=h516909a_0\n  - zlib=1.2.11=h7b6447c_3\n  - zstd=1.4.9=ha95c52a_0\n"
  },
  {
    "path": "conda/asp_3.0.0_osx_env.yaml",
    "content": "name: asp\nchannels:\n  - nasa-ames-stereo-pipeline\n  - usgs-astrogeology\n  - conda-forge\n  - defaults\ndependencies:\n  - ale=0.8.5=py36hc61eee1_3\n  - armadillo=9.200.4=hcb88e47_1205\n  - arpack=3.6.3=h06d5271_1005\n  - blas=1.1=openblas\n  - boost=1.68.0=py36h9888f84_1001\n  - boost-cpp=1.68.0=h6f8c590_1000\n  - bullet=2.86.1=0\n  - bz2file=0.98=py_0\n  - bzip2=1.0.8=h0d85af4_4\n  - ca-certificates=2021.5.30=h033912b_0\n  - cairo=1.14.6=4\n  - ceres-solver=1.14.0=hb9d6bad_10\n  - certifi=2021.5.30=py36h79c6626_0\n  - cmake=3.3.1=0\n  - csm=3.0.3.3=0\n  - cspice=66=h0d85af4_1014\n  - curl=7.64.0=heae2a1f_0\n  - decorator=5.0.9=pyhd8ed1ab_0\n  - eigen=3.3.7=h04f5b5a_0\n  - embree=2.16.0=h6834224_0\n  - expat=2.4.1=he49afe7_0\n  - ffmpeg=3.4.1=0\n  - fftw=3.3.8=nompi_h5c49c53_1109\n  - fgr=isis5.0.1\n  - flann=1.9.1=0\n  - fontconfig=2.12.1=4\n  - freetype=2.7=1\n  - geoid=1.0=1\n  - geos=3.7.3=h4a8c4bd_0\n  - geotiff=1.4.3=h113155d_1001\n  - gettext=0.19.8.1=h46ab8bc_1002\n  - gflags=2.2.2=hb1e8313_1004\n  - giflib=5.2.1=hbcb3906_2\n  - git=2.11.1=0\n  - glib=2.51.4=0\n  - glog=0.4.0=hb7f4fc5_3\n  - gmm=5.0=h6aef312_0\n  - gmp=6.2.1=h2e338ed_0\n  - gsl=2.7=h93259b0_0\n  - harfbuzz=1.3.4=2\n  - hdf5=1.8.18=3\n  - htdp=1.0=1\n  - icu=58.2=h0a44026_1000\n  - ilmbase=2.5.5=hfab91a5_0\n  - imagemagick=isis5.0.1\n  - inja=3.2.0=h1c7c35f_0\n  - isis=5.0.1=0\n  - jama=125=0\n  - jasper=1.900.1=h636a363_1006\n  - jpeg=9d=hbcb3906_0\n  - kakadu=1=0\n  - krb5=1.16.3=h24a3359_1000\n  - laszip=2.1.0=h0a44026_1\n  - libblas=3.8.0=17_openblas\n  - libcblas=3.8.0=17_openblas\n  - libcurl=7.64.0=h76de61e_0\n  - libcxx=12.0.1=habf9029_0\n  - libedit=3.1.20191231=h0678c8f_2\n  - libelas=isis5.0.1\n  - libffi=3.2.1=hb1e8313_1007\n  - libgcc=4.8.5=hdbeacc1_10\n  - libgdal=2.4.1_isis5.0.1\n  - libgfortran=3.0.1=0\n  - libiconv=1.15=h0b31af3_1006\n  - liblapack=3.8.0=17_openblas\n  - liblas=isis5.0.1\n  - libnabo=isis5.0.1\n  - libopenblas=0.3.10=h0794777_0\n  - libpng=1.6.37=h7cec526_2\n  - libpointmatcher=isis5.0.1\n  - libpq=10.6=hbe1e24e_1000\n  - libprotobuf=3.9.2=hfbae3c0_0\n  - libssh2=1.8.0=hf30b1f0_1003\n  - libtiff=4.0.10=ha78913b_1005\n  - libwebp=0.5.2=7\n  - libxcb=1.13=h35c211d_1003\n  - libxml2=2.9.9=hd80cff7_2\n  - llvm-openmp=12.0.1=hda6cdc1_0\n  - lz4-c=1.9.3=h046ec9c_0\n  - mesalib=18.0.0=hb6cfc13_1\n  - metis=5.1.0=h2e338ed_1006\n  - mpfr=4.0.2=h72d8aaf_1\n  - mysql=5.7.20=h0a44026_1001\n  - mysql-connector-c=6.1.11=had4e77e_1002\n  - nanoflann=1.3.2=h694c41f_0\n  - ncurses=6.2=h2e338ed_4\n  - networkx=2.5=py_0\n  - nlohmann_json=3.9.1=he49afe7_1\n  - nn=1.86.0=h1de35cc_2003\n  - numpy=1.13.3=py36_blas_openblas_200\n  - openblas=0.2.19=2\n  - opencv=3.2.0=np113py36_blas_openblas_203\n  - openexr=2.5.5=h7fa7ffa_0\n  - openjpeg=2.1.0=6\n  - openssl=1.0.2u=h0b31af3_0\n  - parallel=20210622=h694c41f_0\n  - pbzip2=1.1.13=h9d27c22_1\n  - pcl=1.9.1=hdd77166_1002\n  - pcre=8.45=he49afe7_0\n  - perl=5.32.1=0_h0d85af4_perl5\n  - pip=21.1.3=pyhd8ed1ab_0\n  - pixman=0.34.0=h1de35cc_1003\n  - postgresql=10.6=ha1bbaa7_1000\n  - proj4=5.2.0=h6de7cb9_1006\n  - protobuf=3.9.2=py36h6de7cb9_1\n  - pthread-stubs=0.4=hc929b4f_1001\n  - pvl=1.2.1=pyhd8ed1ab_0\n  - python=3.6.7=h4a56312_1002\n  - python-dateutil=2.8.2=pyhd8ed1ab_0\n  - python_abi=3.6=2_cp36m\n  - pytz=2021.1=pyhd8ed1ab_0\n  - pyyaml=5.4.1=py36h20b66c6_0\n  - qhull=7.2.0=0\n  - qt=5.9.6=7\n  - qwt=6.1.3=0\n  - readline=7.0=hcfe32e1_1001\n  - s2p-subset=isis5.0.1\n  - scipy=1.2.1=py36hbd7caa9_1\n  - setuptools=49.6.0=py36h79c6626_3\n  - six=1.16.0=pyh6c4a22f_0\n  - spiceypy=2.3.2=py_0\n  - sqlite=3.28.0=h9721f7c_0\n  - stereo-pipeline=3.0.0=0\n  - suitesparse=5.10.1=h68a9093_0\n  - superlu=5.2.1=hbced767_1205\n  - tbb=2020.2=h940c156_4\n  - theia=isis5.0.1\n  - tk=8.6.10=h0419947_1\n  - tnt=126=0\n  - tzcode=2021a=h0d85af4_2\n  - usgscsm=1.5.2\n  - visionworkbench=3.0.0=0\n  - wheel=0.36.2=pyhd3deb0d_0\n  - x264=20131218=0\n  - xerces-c=3.1.4=h10f7eb2_0\n  - xorg-fixesproto=5.0=h0d85af4_1002\n  - xorg-inputproto=2.3.2=h35c211d_1002\n  - xorg-kbproto=1.0.7=h35c211d_1002\n  - xorg-libice=1.0.10=h0d85af4_0\n  - xorg-libsm=1.2.3=h0d85af4_1000\n  - xorg-libx11=1.7.2=h0d85af4_0\n  - xorg-libxau=1.0.9=h35c211d_0\n  - xorg-libxdmcp=1.1.3=h35c211d_0\n  - xorg-libxext=1.3.4=h0d85af4_1\n  - xorg-libxfixes=5.0.3=h0d85af4_1004\n  - xorg-libxi=1.7.10=h0d85af4_0\n  - xorg-xextproto=7.3.0=h35c211d_1002\n  - xorg-xproto=7.0.31=h35c211d_1007\n  - xz=5.2.5=haf1e3a3_1\n  - yaml=0.2.5=haf1e3a3_0\n  - zlib=1.2.11=h7795811_1010\n  - zstd=1.4.9=h582d3a0_0\n\n"
  },
  {
    "path": "conda/asp_3.1.0_linux_env.yaml",
    "content": "name: asp\nchannels:\n  - nasa-ames-stereo-pipeline\n  - usgs-astrogeology\n  - conda-forge\n  - defaults\ndependencies:\n  - _libgcc_mutex=0.1=conda_forge\n  - _openmp_mutex=4.5=1_gnu\n  - _sysroot_linux-64_curr_repodata_hack=3=h5bd9786_13\n  - ale=0.8.5=py36h605e78d_3\n  - armadillo=10.8.2=h7c03176_0\n  - arpack=3.7.0=hc6cf775_2\n  - binutils_impl_linux-64=2.36.1=h193b22a_2\n  - binutils_linux-64=2.36=hf3e587d_9\n  - blas=1.1=openblas\n  - boost=1.68.0=py36h8619c78_1001\n  - boost-cpp=1.68.0=h11c811c_1000\n  - bullet=2.86.1=0\n  - bz2file=0.98=py_0\n  - bzip2=1.0.8=h7f98852_4\n  - ca-certificates=2021.10.8=ha878542_0\n  - cairo=1.14.6=4\n  - ceres-solver=1.14.0=hf302a74_15\n  - chrpath=0.16=h7f98852_1002\n  - cmake=3.15.5=hf94ab9c_0\n  - csm=3.0.3.3=hc9558a2_0\n  - cspice=66=h7f98852_1015\n  - curl=7.64.0=h646f8bb_0\n  - dbus=1.13.0=h4e0c4b3_1000\n  - decorator=5.1.1=pyhd8ed1ab_0\n  - eigen=3.4.0=h4bd325d_0\n  - embree=2.16.0=0\n  - expat=2.4.8=h27087fc_0\n  - ffmpeg=3.4.1=0\n  - fftw=3.3.8=nompi_hfc0cae8_1114\n  - fgr=isis6=h3fd9d12_0\n  - flann=1.9.1=0\n  - fontconfig=2.12.1=4\n  - freetype=2.7=1\n  - gcc_impl_linux-64=11.2.0=h82a94d6_16\n  - gcc_linux-64=11.2.0=h39a9532_9\n  - geoid=1.0=1\n  - geos=3.7.3=he1b5a44_0\n  - geotiff=1.4.3=hb6868eb_1001\n  - gettext=0.19.8.1=hf34092f_1004\n  - gflags=2.2.2=he1b5a44_1004\n  - giflib=5.2.1=h36c2ea0_2\n  - glib=2.51.4=0\n  - glog=0.6.0=h6f12383_0\n  - gmm=5.0=0\n  - gmp=6.2.1=h58526e2_0\n  - gsl=2.7=he838d99_0\n  - gst-plugins-base=1.8.0=0\n  - gstreamer=1.8.0=2\n  - gxx_impl_linux-64=11.2.0=h82a94d6_16\n  - gxx_linux-64=11.2.0=hacbe6df_9\n  - harfbuzz=1.3.4=2\n  - hdf5=1.8.18=3\n  - htdp=1.0=1\n  - icu=58.2=hf484d3e_1000\n  - ilmbase=2.5.5=h780b84a_0\n  - imagemagick=isis6=h3fd9d12_0\n  - imath=3.1.5=h6239696_0\n  - inja=3.3.0=h9c3ff4c_0\n  - isis=6.0.0=0\n  - jama=125=0\n  - jasper=1.900.1=h07fcdf6_1006\n  - jpeg=9e=h166bdaf_1\n  - kakadu=1=0\n  - kernel-headers_linux-64=3.10.0=h4a8ded7_13\n  - krb5=1.16.3=hc83ff2d_1000\n  - laszip=2.1.0=hf484d3e_1\n  - ld_impl_linux-64=2.36.1=hea4e1c9_2\n  - libblas=3.9.0=13_linux64_openblas\n  - libcblas=3.9.0=13_linux64_openblas\n  - libcurl=7.64.0=h01ee5af_0\n  - libedit=3.1.20191231=he28a2e2_2\n  - libelas=isis6=h3fd9d12_0\n  - libffi=3.2.1=he1b5a44_1007\n  - libgcc=7.2.0=h69d50b8_2\n  - libgcc-devel_linux-64=11.2.0=h0952999_16\n  - libgcc-ng=11.2.0=h1d223b6_15\n  - libgdal=2.4.1_isis6=h3fd9d12_0\n  - libgfortran=3.0.0=1\n  - libgfortran-ng=7.5.0=h14aa051_20\n  - libgfortran4=7.5.0=h14aa051_20\n  - libglvnd-cos7-x86_64=1.0.1=h9b0a68f_1105\n  - libgomp=11.2.0=h1d223b6_15\n  - libiconv=1.15=h516909a_1006\n  - liblapack=3.9.0=13_linux64_openblas\n  - liblas=isis6=h3fd9d12_1000\n  - libnabo=isis6=h3fd9d12_0\n  - libnsl=2.0.0=h7f98852_0\n  - libopenblas=0.3.18=hf726d26_0\n  - libpng=1.6.37=h21135ba_2\n  - libpointmatcher=isis6=h2bc3f7f_0\n  - libpq=10.6=h13b8bad_1000\n  - libprotobuf=3.9.2=h8b12597_0\n  - libsanitizer=11.2.0=he4da1e4_16\n  - libssh2=1.8.0=h1ad7b7a_1003\n  - libstdcxx-devel_linux-64=11.2.0=h0952999_16\n  - libstdcxx-ng=11.2.0=he4da1e4_15\n  - libtiff=4.0.10=hc3755c2_1005\n  - libuuid=2.32.1=h7f98852_1000\n  - libuv=1.43.0=h7f98852_0\n  - libwebp=0.5.2=7\n  - libxcb=1.13=h7f98852_1004\n  - libxml2=2.9.9=h13577e0_2\n  - libzlib=1.2.11=h166bdaf_1014\n  - llvm-openmp=8.0.1=hc9558a2_0\n  - lz4-c=1.9.3=h9c3ff4c_1\n  - mesalib=18.3.1=h590aaf7_0\n  - metis=5.1.0=h58526e2_1006\n  - mpfr=4.1.0=h9202a9a_1\n  - mysql=5.7.20=hf484d3e_1001\n  - mysql-connector-c=6.1.11=hab6429c_1002\n  - nanoflann=1.4.2=ha770c72_0\n  - ncurses=6.3=h27087fc_1\n  - networkx=2.5=py_0\n  - nlohmann_json=3.10.5=h9c3ff4c_0\n  - nn=1.86.0=h14c3975_2003\n  - numpy=1.13.3=py36_blas_openblas_200\n  - openblas=0.2.19=2\n  - opencv=3.2.0=np113py36_blas_openblas_203\n  - openexr=2.5.5=hf817b99_0\n  - openjpeg=2.3.0=hf38bd82_1003\n  - openmp=8.0.1=0\n  - openssl=1.0.2u=h516909a_0\n  - parallel=20220222=ha770c72_0\n  - pbzip2=1.1.13=0\n  - pcl=1.9.1=h482114b_1002\n  - pcre=8.45=h9c3ff4c_0\n  - perl=5.32.1=2_h7f98852_perl5\n  - pip=21.3.1=pyhd8ed1ab_0\n  - pixman=0.34.0=h14c3975_1003\n  - postgresql=10.6=h66cca7a_1000\n  - proj4=5.2.0=he1b5a44_1006\n  - protobuf=3.9.2=py36he1b5a44_1\n  - pthread-stubs=0.4=h36c2ea0_1001\n  - pvl=1.3.1=pyhd8ed1ab_0\n  - python=3.6.7=hd21baee_1002\n  - python-dateutil=2.8.2=pyhd8ed1ab_0\n  - python_abi=3.6=2_cp36m\n  - pytz=2022.1=pyhd8ed1ab_0\n  - pyyaml=5.4.1=py36h8f6f2f9_1\n  - qhull=7.2.0=0\n  - qt=5.9.6=7\n  - qwt=6.1.3=0\n  - readline=7.0=hf8c457e_1001\n  - rhash=1.4.1=h7f98852_0\n  - s2p-subset=isis6=h3fd9d12_0\n  - scipy=1.2.1=py36h09a28d5_1\n  - setuptools=58.0.4=py36h5fab9bb_2\n  - six=1.16.0=pyh6c4a22f_0\n  - spiceypy=2.3.2=py_0\n  - sqlite=3.28.0=h8b20d00_0\n  - stereo-pipeline=3.1.0=h3fd9d12_0\n  - suitesparse=5.10.1=h9e50725_1\n  - superlu=5.2.2=hfe2efc7_0\n  - sysroot_linux-64=2.17=h4a8ded7_13\n  - tbb=2021.5.0=h924138e_1\n  - theia=isis6=h3fd9d12_1001\n  - tk=8.6.12=h27826a3_0\n  - tnt=126=0\n  - tzcode=2022a=h166bdaf_0\n  - usgscsm=1.6.0_asp3.1.0=h2bc3f7f_0\n  - visionworkbench=3.1.0=h3fd9d12_0\n  - wheel=0.37.1=pyhd8ed1ab_0\n  - x264=20131218=0\n  - xerces-c=3.1.4=0\n  - xorg-fixesproto=5.0=h7f98852_1002\n  - xorg-inputproto=2.3.2=h7f98852_1002\n  - xorg-kbproto=1.0.7=h7f98852_1002\n  - xorg-libice=1.0.10=h7f98852_0\n  - xorg-libsm=1.2.3=hd9c2040_1000\n  - xorg-libx11=1.7.2=h7f98852_0\n  - xorg-libxau=1.0.9=h7f98852_0\n  - xorg-libxdmcp=1.1.3=h7f98852_0\n  - xorg-libxext=1.3.4=h7f98852_1\n  - xorg-libxfixes=5.0.3=h7f98852_1004\n  - xorg-libxi=1.7.10=h7f98852_0\n  - xorg-libxrender=0.9.10=h7f98852_1003\n  - xorg-renderproto=0.11.1=h7f98852_1002\n  - xorg-xextproto=7.3.0=h7f98852_1002\n  - xorg-xproto=7.0.31=h7f98852_1007\n  - xz=5.2.5=h516909a_1\n  - yaml=0.2.5=h7f98852_2\n  - zlib=1.2.11=h166bdaf_1014\n  - zstd=1.4.9=ha95c52a_0\n"
  },
  {
    "path": "conda/asp_3.1.0_osx_env.yaml",
    "content": "name: asp\nchannels:\n  - nasa-ames-stereo-pipeline\n  - usgs-astrogeology\n  - conda-forge\n  - defaults\ndependencies:\n  - ale=0.8.5=py36hc61eee1_3\n  - armadillo=9.200.4=hcb88e47_1205\n  - arpack=3.6.3=h06d5271_1005\n  - blas=1.1=openblas\n  - boost=1.68.0=py36h9888f84_1001\n  - boost-cpp=1.68.0=h6f8c590_1000\n  - bullet=2.86.1=0\n  - bz2file=0.98=py_0\n  - bzip2=1.0.8=h0d85af4_4\n  - ca-certificates=2021.10.8=h033912b_0\n  - cairo=1.14.6=4\n  - ceres-solver=1.14.0=h636452b_15\n  - certifi=2021.5.30=py36h79c6626_0\n  - cmake=3.15.5=h6c18c4b_0\n  - csm=3.0.3.3=0\n  - cspice=66=h0d85af4_1015\n  - curl=7.64.0=heae2a1f_0\n  - decorator=5.1.1=pyhd8ed1ab_0\n  - eigen=3.4.0=h940c156_0\n  - embree=2.16.0=h6834224_0\n  - expat=2.4.8=h96cf925_0\n  - ffmpeg=3.4.1=0\n  - fftw=3.3.8=nompi_h5c49c53_1109\n  - fgr=isis6=h01edc0c_0\n  - flann=1.9.1=0\n  - fontconfig=2.12.1=4\n  - freetype=2.7=1\n  - geoid=1.0=1\n  - geos=3.7.3=h4a8c4bd_0\n  - geotiff=1.4.3=h113155d_1001\n  - gettext=0.19.8.1=h46ab8bc_1002\n  - gflags=2.2.2=hb1e8313_1004\n  - giflib=5.2.1=hbcb3906_2\n  - glib=2.51.4=0\n  - glog=0.6.0=h8ac2a54_0\n  - gmm=5.0=h6aef312_0\n  - gmp=6.2.1=h2e338ed_0\n  - gsl=2.7=h93259b0_0\n  - harfbuzz=1.3.4=2\n  - hdf5=1.8.18=3\n  - htdp=1.0=1\n  - icu=58.2=h0a44026_1000\n  - ilmbase=2.5.5=hfab91a5_0\n  - imagemagick=isis6=h01edc0c_0\n  - inja=3.3.0=he49afe7_0\n  - isis=6.0.0=0\n  - jama=125=0\n  - jasper=1.900.1=h636a363_1006\n  - jpeg=9e=h5eb16cf_1\n  - kakadu=1=0\n  - krb5=1.16.3=h24a3359_1000\n  - laszip=2.1.0=h0a44026_1\n  - libblas=3.9.0=13_osx64_openblas\n  - libcblas=3.9.0=13_osx64_openblas\n  - libcurl=7.64.0=h76de61e_0\n  - libcxx=14.0.3=hc203e6f_0\n  - libedit=3.1.20191231=h0678c8f_2\n  - libelas=isis6=0\n  - libffi=3.2.1=hb1e8313_1007\n  - libgcc=4.8.5=hdbeacc1_10\n  - libgdal=2.4.1_isis6=h01edc0c_0\n  - libgfortran=3.0.1=0\n  - libiconv=1.15=h0b31af3_1006\n  - liblapack=3.9.0=13_osx64_openblas\n  - liblas=isis6=h01edc0c_1000\n  - libnabo=isis6=h01edc0c_0\n  - libopenblas=0.3.18=h9a5756b_0\n  - libpng=1.6.37=h7cec526_2\n  - libpointmatcher=isis6=ha5a8b8e_0\n  - libpq=10.6=hbe1e24e_1000\n  - libprotobuf=3.9.2=hfbae3c0_0\n  - libssh2=1.8.0=hf30b1f0_1003\n  - libtiff=4.0.10=ha78913b_1005\n  - libuv=1.43.0=h0d85af4_0\n  - libwebp=0.5.2=7\n  - libxcb=1.13=h0d85af4_1004\n  - libxml2=2.9.9=hd80cff7_2\n  - libzlib=1.2.11=h6c3fc93_1014\n  - llvm-openmp=14.0.3=ha654fa7_0\n  - lz4-c=1.9.3=he49afe7_1\n  - mesalib=21.2.5=h2df1e00_3\n  - metis=5.1.0=h2e338ed_1006\n  - mpfr=4.1.0=h0f52abe_1\n  - mysql=5.7.20=h0a44026_1001\n  - mysql-connector-c=6.1.11=had4e77e_1002\n  - nanoflann=1.4.2=h694c41f_0\n  - ncurses=6.3=h96cf925_1\n  - networkx=2.5=py_0\n  - nlohmann_json=3.10.5=he49afe7_0\n  - nn=1.86.0=h1de35cc_2003\n  - numpy=1.13.3=py36_blas_openblas_200\n  - openblas=0.2.19=2\n  - opencv=3.2.0=np113py36_blas_openblas_203\n  - openexr=2.5.5=h7fa7ffa_0\n  - openjpeg=2.3.0=h3bf0609_1003\n  - openssl=1.0.2u=h0b31af3_0\n  - parallel=20220222=h694c41f_0\n  - pbzip2=1.1.13=h9d27c22_1\n  - pcl=1.9.1=hdd77166_1002\n  - pcre=8.45=he49afe7_0\n  - perl=5.32.1=2_h0d85af4_perl5\n  - pip=21.3.1=pyhd8ed1ab_0\n  - pixman=0.34.0=h1de35cc_1003\n  - postgresql=10.6=ha1bbaa7_1000\n  - proj4=5.2.0=h6de7cb9_1006\n  - protobuf=3.9.2=py36h6de7cb9_1\n  - pthread-stubs=0.4=hc929b4f_1001\n  - pvl=1.3.1=pyhd8ed1ab_0\n  - python=3.6.7=h4a56312_1002\n  - python-dateutil=2.8.2=pyhd8ed1ab_0\n  - python_abi=3.6=2_cp36m\n  - pytz=2022.1=pyhd8ed1ab_0\n  - pyyaml=5.4.1=py36hfa26744_1\n  - qhull=7.2.0=0\n  - qt=5.9.6=7\n  - qwt=6.1.3=0\n  - readline=7.0=hcfe32e1_1001\n  - rhash=1.4.1=h0d85af4_0\n  - s2p-subset=isis6=h01edc0c_0\n  - scipy=1.2.1=py36hbd7caa9_1\n  - setuptools=58.0.4=py36h79c6626_2\n  - six=1.16.0=pyh6c4a22f_0\n  - spiceypy=2.3.2=py_0\n  - sqlite=3.28.0=h9721f7c_0\n  - stereo-pipeline=3.1.0=0\n  - suitesparse=5.10.1=h7aff33d_1\n  - superlu=5.2.1=hbced767_1205\n  - tbb=2021.5.0=hbb4e6a2_1\n  - theia=isis6=h01edc0c_1001\n  - tk=8.6.12=h5dbffcc_0\n  - tnt=126=0\n  - tzcode=2022a=h5eb16cf_0\n  - usgscsm=1.6.0_asp3.1.0=ha5a8b8e_0\n  - visionworkbench=3.1.0=0\n  - wheel=0.37.1=pyhd8ed1ab_0\n  - x264=20131218=0\n  - xerces-c=3.1.4=h10f7eb2_0\n  - xorg-damageproto=1.2.1=h0d85af4_1002\n  - xorg-fixesproto=5.0=h0d85af4_1002\n  - xorg-glproto=1.4.17=h0d85af4_1002\n  - xorg-inputproto=2.3.2=h35c211d_1002\n  - xorg-kbproto=1.0.7=h35c211d_1002\n  - xorg-libice=1.0.10=h0d85af4_0\n  - xorg-libsm=1.2.3=h0d85af4_1000\n  - xorg-libx11=1.7.2=h0d85af4_0\n  - xorg-libxau=1.0.9=h35c211d_0\n  - xorg-libxdamage=1.1.5=h0d85af4_1\n  - xorg-libxdmcp=1.1.3=h35c211d_0\n  - xorg-libxext=1.3.4=h0d85af4_1\n  - xorg-libxfixes=5.0.3=h0d85af4_1004\n  - xorg-libxi=1.7.10=h0d85af4_0\n  - xorg-libxrandr=1.5.2=h0d85af4_1\n  - xorg-libxrender=0.9.10=h0d85af4_1003\n  - xorg-randrproto=1.5.0=h0d85af4_1001\n  - xorg-renderproto=0.11.1=h0d85af4_1002\n  - xorg-util-macros=1.19.3=h35c211d_0\n  - xorg-xextproto=7.3.0=h35c211d_1002\n  - xorg-xf86vidmodeproto=2.3.1=h0d85af4_1002\n  - xorg-xproto=7.0.31=h35c211d_1007\n  - xz=5.2.5=haf1e3a3_1\n  - yaml=0.2.5=h0d85af4_2\n  - zlib=1.2.11=h6c3fc93_1014\n  - zstd=1.4.9=h582d3a0_0\n\n"
  },
  {
    "path": "conda/asp_3.2.0_linux_env.yaml",
    "content": "name: asp\nchannels:\n  - nasa-ames-stereo-pipeline\n  - usgs-astrogeology\n  - conda-forge\n  - defaults\ndependencies:\n  - _libgcc_mutex=0.1=conda_forge\n  - _openmp_mutex=4.5=2_kmp_llvm\n  - _sysroot_linux-64_curr_repodata_hack=3=h5bd9786_13\n  - ale=0.8.8=py39hf939315_1\n  - alsa-lib=1.2.6.1=h7f98852_0\n  - aom=3.4.0=h27087fc_1\n  - armadillo=11.4.2=h7209761_0\n  - arpack=3.7.0=hdefa2d7_2\n  - attr=2.5.1=h166bdaf_1\n  - binutils_impl_linux-64=2.39=he00db2b_1\n  - binutils_linux-64=2.39=h5fc0e48_11\n  - blas=2.116=openblas\n  - blas-devel=3.9.0=16_linux64_openblas\n  - boost=1.72.0=py39ha90915f_1\n  - boost-cpp=1.72.0=he72f1d9_7\n  - bullet=2.86.1=0\n  - bz2file=0.98=py_0\n  - bzip2=1.0.8=h7f98852_4\n  - c-ares=1.18.1=h7f98852_0\n  - ca-certificates=2022.12.7=ha878542_0\n  - cairo=1.16.0=ha61ee94_1014\n  - ceres-solver=1.14.0=hf302a74_15\n  - chrpath=0.16=h7f98852_1002\n  - cmake=3.15.5=hf94ab9c_0\n  - csm=3.0.3.3=hc9558a2_0\n  - cspice=67=h166bdaf_4\n  - curl=7.86.0=h7bff187_1\n  - cyrus-sasl=2.1.27=h230043b_5\n  - dbus=1.13.6=h5008d03_3\n  - eigen=3.4.0=h4bd325d_0\n  - elfutils=0.186=he364ef2_0\n  - embree=2.16.0=0\n  - expat=2.5.0=h27087fc_0\n  - ffmpeg=4.4.2=gpl_hfe78399_107\n  - fftw=3.3.10=nompi_hf0379b8_106\n  - fgr=isis7=h3fd9d12_0\n  - flann=1.9.1=he05ef13_1011\n  - font-ttf-dejavu-sans-mono=2.37=hab24e00_0\n  - font-ttf-inconsolata=3.000=h77eed37_0\n  - font-ttf-source-code-pro=2.038=h77eed37_0\n  - font-ttf-ubuntu=0.83=hab24e00_0\n  - fontconfig=2.14.1=hc2a2eb6_0\n  - fonts-conda-ecosystem=1=0\n  - fonts-conda-forge=1=0\n  - freeglut=3.2.2=h9c3ff4c_1\n  - freetype=2.12.1=hca18f0e_1\n  - gcc_impl_linux-64=12.2.0=hcc96c02_19\n  - gcc_linux-64=12.2.0=h4798a0e_11\n  - geoid=1.0_isis7=1\n  - geos=3.7.3=he1b5a44_0\n  - geotiff=1.7.1=ha76d385_4\n  - gettext=0.21.1=h27087fc_0\n  - gflags=2.2.2=he1b5a44_1004\n  - gfortran_impl_linux-64=12.2.0=h55be85b_19\n  - gfortran_linux-64=12.2.0=h307d370_11\n  - giflib=5.2.1=h36c2ea0_2\n  - glib=2.74.1=h6239696_1\n  - glib-tools=2.74.1=h6239696_1\n  - glog=0.6.0=h6f12383_0\n  - gmp=6.2.1=h58526e2_0\n  - gnutls=3.7.8=hf3e180e_0\n  - graphite2=1.3.13=h58526e2_1001\n  - gsl=2.7=he838d99_0\n  - gst-plugins-base=1.20.3=hf6a322e_0\n  - gstreamer=1.20.3=hd4edc92_2\n  - gxx_impl_linux-64=12.2.0=hcc96c02_19\n  - gxx_linux-64=12.2.0=hb41e900_11\n  - harfbuzz=5.3.0=h418a68e_0\n  - hdf5=1.12.2=nompi_h2386368_100\n  - htdp=1.0_isis7=1\n  - icu=70.1=h27087fc_0\n  - ilmbase=2.5.5=h780b84a_0\n  - inja=3.3.0=h9c3ff4c_0\n  - isis=7.1.0=0\n  - jack=1.9.18=h8c3723f_1002\n  - jama=125=0\n  - jasper=2.0.33=ha77e612_0\n  - jemalloc=5.2.1=h9c3ff4c_6\n  - jpeg=9e=h166bdaf_2\n  - kakadu=1=0\n  - kernel-headers_linux-64=3.10.0=h4a8ded7_13\n  - keyutils=1.6.1=h166bdaf_0\n  - krb5=1.19.3=h3790be6_0\n  - lame=3.100=h166bdaf_1003\n  - laszip=2.1.0_isis7=h3fd9d12_1\n  - ld_impl_linux-64=2.39=hcc3a1bd_1\n  - lerc=4.0.0=h27087fc_0\n  - libarchive=3.5.2=hb890918_3\n  - libblas=3.9.0=16_linux64_openblas\n  - libcap=2.64=ha37c62d_0\n  - libcblas=3.9.0=16_linux64_openblas\n  - libclang=14.0.6=default_h2e3cab8_0\n  - libclang13=14.0.6=default_h3a83d3e_0\n  - libcups=2.3.3=h3e49a29_2\n  - libcurl=7.86.0=h7bff187_1\n  - libcxx=14.0.6=hf52228f_0\n  - libcxxabi=14.0.6=ha770c72_0\n  - libdb=6.2.32=h9c3ff4c_0\n  - libdeflate=1.14=h166bdaf_0\n  - libdrm=2.4.114=h166bdaf_0\n  - libedit=3.1.20191231=he28a2e2_2\n  - libelas=isis7=h3fd9d12_0\n  - libev=4.33=h516909a_1\n  - libevent=2.1.10=h9b69904_4\n  - libffi=3.4.2=h7f98852_5\n  - libflac=1.3.4=h27087fc_0\n  - libgcc-devel_linux-64=12.2.0=h3b97bd3_19\n  - libgcc-ng=12.2.0=h65d4601_19\n  - libgdal=3.5_isis7=h3fd9d12_0\n  - libgfortran-ng=12.2.0=h69a702a_19\n  - libgfortran5=12.2.0=h337968e_19\n  - libglib=2.74.1=h606061b_1\n  - libglu=9.0.0=he1b5a44_1001\n  - libglvnd-cos7-x86_64=1.0.1=h9b0a68f_1105\n  - libgomp=12.2.0=h65d4601_19\n  - libhwloc=2.8.0=h32351e8_1\n  - libiconv=1.17=h166bdaf_0\n  - libidn2=2.3.4=h166bdaf_0\n  - libjemalloc=5.2.1=h9c3ff4c_6\n  - liblapack=3.9.0=16_linux64_openblas\n  - liblapacke=3.9.0=16_linux64_openblas\n  - liblas=1.8.2_isis7=h3fd9d12_0\n  - libllvm14=14.0.6=he0ac6c6_1\n  - libmicrohttpd=0.9.75=h2603550_1\n  - libnabo=isis7=h3fd9d12_0\n  - libnghttp2=1.47.0=hdcd2b5c_1\n  - libnsl=2.0.0=h7f98852_0\n  - libntlm=1.4=h7f98852_1002\n  - libogg=1.3.4=h7f98852_1\n  - libopenblas=0.3.21=pthreads_h78a6416_3\n  - libopencv=4.6.0=py39h04bf7ee_4\n  - libopus=1.3.1=h7f98852_1\n  - libpciaccess=0.17=h166bdaf_0\n  - libpng=1.6.39=h753d276_0\n  - libpointmatcher=isis7=h2bc3f7f_0\n  - libpq=14.5=h72a31a5_3\n  - libprotobuf=3.21.11=h3eb15da_0\n  - libsanitizer=12.2.0=h46fd767_19\n  - libsndfile=1.0.31=h9c3ff4c_1\n  - libsqlite=3.40.0=h753d276_0\n  - libssh2=1.10.0=haa6b8db_3\n  - libstdcxx-devel_linux-64=12.2.0=h3b97bd3_19\n  - libstdcxx-ng=12.2.0=h46fd767_19\n  - libtasn1=4.19.0=h166bdaf_0\n  - libtiff=4.4.0=h55922b4_4\n  - libtool=2.4.6=h9c3ff4c_1008\n  - libudev1=252=h166bdaf_0\n  - libunistring=0.9.10=h7f98852_0\n  - libuuid=2.32.1=h7f98852_1000\n  - libuv=1.44.2=h166bdaf_0\n  - libva=2.16.0=h166bdaf_0\n  - libvorbis=1.3.7=h9c3ff4c_0\n  - libvpx=1.11.0=h9c3ff4c_3\n  - libwebp=1.2.4=h522a892_0\n  - libwebp-base=1.2.4=h166bdaf_0\n  - libxcb=1.13=h7f98852_1004\n  - libxkbcommon=1.0.3=he3ba5ed_0\n  - libxml2=2.9.14=h22db469_4\n  - libzlib=1.2.13=h166bdaf_4\n  - llvm-openmp=15.0.6=he0ac6c6_0\n  - lz4-c=1.9.3=h9c3ff4c_1\n  - lzo=2.10=h516909a_1000\n  - mesalib=21.2.5=h0e4506f_3\n  - metis=5.1.0=h58526e2_1006\n  - mpfr=4.1.0=h9202a9a_1\n  - multiview=asp3.2.0=py39h3fd9d12_0\n  - mysql=8.0.31=h3e2b116_0\n  - mysql-client=8.0.31=hf89ab62_0\n  - mysql-common=8.0.31=haf5c9bc_0\n  - mysql-connector-c=6.1.11=h6eb9d5d_1007\n  - mysql-devel=8.0.31=haf5c9bc_0\n  - mysql-libs=8.0.31=h28c427c_0\n  - mysql-server=8.0.31=hb01f15f_0\n  - nanoflann=1.4.2=ha770c72_0\n  - ncurses=6.3=h27087fc_1\n  - nettle=3.8.1=hc379101_1\n  - networkx=2.8.8=pyhd8ed1ab_0\n  - nlohmann_json=3.11.2=h27087fc_0\n  - nn=1.86.0=h14c3975_2003\n  - nspr=4.35=h27087fc_0\n  - nss=3.82=he02c5a1_0\n  - numpy=1.23.5=py39h3d75532_0\n  - openblas=0.3.21=pthreads_h320a7e8_3\n  - opencv=4.6.0=py39hf3d152e_4\n  - openexr=2.5.5=hf817b99_0\n  - openh264=2.3.0=h27087fc_0\n  - openjpeg=2.3.0=hf38bd82_1003\n  - openssl=1.1.1s=h0b41bf4_1\n  - p11-kit=0.24.1=hc5aa10d_0\n  - parallel=20221122=ha770c72_0\n  - pbzip2=1.1.13=0\n  - pcl=1.11.1=h05311af_1\n  - pcre2=10.40=hc3806b6_0\n  - perl=5.32.1=2_h7f98852_perl5\n  - pip=22.3.1=pyhd8ed1ab_0\n  - pixman=0.40.0=h36c2ea0_0\n  - portaudio=19.6.0=h57a0ea0_5\n  - proj=9.1.0=h93bde94_0\n  - protobuf=4.21.11=py39h227be39_0\n  - pthread-stubs=0.4=h36c2ea0_1001\n  - pulseaudio=14.0=h7f54b18_8\n  - pvl=1.3.2=pyhd8ed1ab_0\n  - py-opencv=4.6.0=py39hef51801_4\n  - python=3.9.15=h47a2c10_0_cpython\n  - python-dateutil=2.8.2=pyhd8ed1ab_0\n  - python_abi=3.9=3_cp39\n  - pytz=2022.6=pyhd8ed1ab_0\n  - pyyaml=6.0=py39hb9d737c_5\n  - qhull=2020.2=h4bd325d_2\n  - qt=5.15.4=hf11cfaa_0\n  - qt-main=5.15.4=ha5833f6_2\n  - qt-webengine=5.15.4=hcbadb6c_3\n  - qwt=6.2.0=h1d9fb53_4\n  - rapidjson=1.1.0=he1b5a44_1002\n  - rclone=1.61.1=h519d9b9_0\n  - readline=8.1.2=h0f457ee_0\n  - rhash=1.4.3=h166bdaf_0\n  - rocksdb=6.13.3=hda8cf21_2\n  - s2p-subset=isis7=h3fd9d12_0\n  - scipy=1.9.3=py39hddc5342_2\n  - setuptools=65.5.1=pyhd8ed1ab_0\n  - six=1.16.0=pyh6c4a22f_0\n  - snappy=1.1.9=hbd366e4_2\n  - spiceypy=5.1.2=pyhd8ed1ab_0\n  - sqlite=3.40.0=h4ff8645_0\n  - stereo-pipeline=3.2.0=h3fd9d12_0\n  - suitesparse=5.10.1=h9e50725_1\n  - superlu=5.2.2=h00795ac_0\n  - svt-av1=1.2.1=h27087fc_0\n  - sysroot_linux-64=2.17=h4a8ded7_13\n  - tbb=2021.7.0=h924138e_1\n  - tbb-devel=2021.7.0=h924138e_1\n  - tk=8.6.12=h27826a3_0\n  - tnt=126=0\n  - tzdata=2022g=h191b570_0\n  - usgscsm=1.6.0=h924138e_1\n  - visionworkbench=3.2.0=h3fd9d12_0\n  - wheel=0.38.4=pyhd8ed1ab_0\n  - x264=1!164.3095=h166bdaf_2\n  - x265=3.5=h924138e_3\n  - xcb-util=0.4.0=h166bdaf_0\n  - xcb-util-image=0.4.0=h166bdaf_0\n  - xcb-util-keysyms=0.4.0=h166bdaf_0\n  - xcb-util-renderutil=0.3.9=h166bdaf_0\n  - xcb-util-wm=0.4.1=h166bdaf_0\n  - xerces-c=3.2.3=h55805fa_5\n  - xorg-damageproto=1.2.1=h7f98852_1002\n  - xorg-fixesproto=5.0=h7f98852_1002\n  - xorg-glproto=1.4.17=h7f98852_1002\n  - xorg-inputproto=2.3.2=h7f98852_1002\n  - xorg-kbproto=1.0.7=h7f98852_1002\n  - xorg-libice=1.0.10=h7f98852_0\n  - xorg-libsm=1.2.3=hd9c2040_1000\n  - xorg-libx11=1.7.2=h7f98852_0\n  - xorg-libxau=1.0.9=h7f98852_0\n  - xorg-libxdamage=1.1.5=h7f98852_1\n  - xorg-libxdmcp=1.1.3=h7f98852_0\n  - xorg-libxext=1.3.4=h7f98852_1\n  - xorg-libxfixes=5.0.3=h7f98852_1004\n  - xorg-libxi=1.7.10=h7f98852_0\n  - xorg-libxrandr=1.5.2=h7f98852_1\n  - xorg-libxrender=0.9.10=h7f98852_1003\n  - xorg-randrproto=1.5.0=h7f98852_1001\n  - xorg-renderproto=0.11.1=h7f98852_1002\n  - xorg-util-macros=1.19.3=h7f98852_0\n  - xorg-xextproto=7.3.0=h7f98852_1002\n  - xorg-xf86vidmodeproto=2.3.1=h7f98852_1002\n  - xorg-xproto=7.0.31=h7f98852_1007\n  - xz=5.2.6=h166bdaf_0\n  - yaml=0.2.5=h7f98852_2\n  - zlib=1.2.13=h166bdaf_4\n  - zstd=1.5.2=h6239696_4\n  - mesa-libgl-cos6-x86_64\n  - xorg-libxmu\n  - mesalib\n  \n"
  },
  {
    "path": "conda/asp_3.2.0_osx_env.yaml",
    "content": "name: asp\nchannels:\n  - nasa-ames-stereo-pipeline\n  - usgs-astrogeology\n  - conda-forge\n  - defaults\ndependencies:\n  - ale=0.8.8=py39h92daf61_1\n  - aom=3.4.0=hb486fe8_1\n  - armadillo=11.4.2=hffeb596_0\n  - arpack=3.7.0=hefb7bc6_2\n  - blas=2.116=openblas\n  - blas-devel=3.9.0=16_osx64_openblas\n  - boost=1.72.0=py39hb64e6f8_1\n  - boost-cpp=1.72.0=h179ae3a_7\n  - bullet=2.86.1=0\n  - bz2file=0.98=py_0\n  - bzip2=1.0.8=h0d85af4_4\n  - c-ares=1.18.1=h0d85af4_0\n  - ca-certificates=2022.12.7=h033912b_0\n  - cairo=1.16.0=h904041c_1014\n  - cctools_osx-64=973.0.1=hcc6d90d_11\n  - ceres-solver=1.14.0=h636452b_15\n  - clang=14.0.6=h694c41f_0\n  - clang-14=14.0.6=default_h55ffa42_0\n  - clang_osx-64=14.0.6=h3113cd8_4\n  - clangxx=14.0.6=default_h55ffa42_0\n  - cmake=3.15.5=h6c18c4b_0\n  - compiler-rt=14.0.6=h613da45_0\n  - compiler-rt_osx-64=14.0.6=h8d5cb93_0\n  - csm=3.0.3.3=0\n  - cspice=67=hb7f2c08_4\n  - curl=7.86.0=h57eb407_1\n  - cyrus-sasl=2.1.27=ha724b88_5\n  - eigen=3.4.0=h940c156_0\n  - embree=2.16.0=h6834224_0\n  - expat=2.5.0=hf0c8a7f_0\n  - ffmpeg=4.4.2=gpl_h5a1d76f_107\n  - fftw=3.3.10=nompi_h4fa670e_106\n  - fgr=isis7=h01edc0c_0\n  - flann=1.9.1=h56de9e4_1011\n  - font-ttf-dejavu-sans-mono=2.37=hab24e00_0\n  - font-ttf-inconsolata=3.000=h77eed37_0\n  - font-ttf-source-code-pro=2.038=h77eed37_0\n  - font-ttf-ubuntu=0.83=hab24e00_0\n  - fontconfig=2.14.1=h5bb23bf_0\n  - fonts-conda-ecosystem=1=0\n  - fonts-conda-forge=1=0\n  - freetype=2.12.1=h3f81eb7_1\n  - geoid=1.0_isis7=1\n  - geos=3.7.3=h4a8c4bd_0\n  - geotiff=1.7.1=he29fd1c_4\n  - gettext=0.21.1=h8a4c099_0\n  - gflags=2.2.2=hb1e8313_1004\n  - gfortran_impl_osx-64=11.3.0=h1f927f5_27\n  - gfortran_osx-64=11.3.0=h18f7dce_0\n  - giflib=5.2.1=hbcb3906_2\n  - glib=2.74.1=hbc0c0cd_1\n  - glib-tools=2.74.1=hbc0c0cd_1\n  - glog=0.6.0=h8ac2a54_0\n  - gmp=6.2.1=h2e338ed_0\n  - gnutls=3.7.8=h207c4f0_0\n  - graphite2=1.3.13=h2e338ed_1001\n  - gsl=2.7=h93259b0_0\n  - gst-plugins-base=1.20.3=h37e1711_2\n  - gstreamer=1.20.3=h1d18e73_2\n  - harfbuzz=5.3.0=h08f8713_0\n  - hdf5=1.12.2=nompi_hc782337_100\n  - htdp=1.0_isis7=1\n  - icu=70.1=h96cf925_0\n  - ilmbase=2.5.5=hfab91a5_0\n  - inja=3.3.0=he49afe7_0\n  - isis=7.1.0=0\n  - isl=0.25=hb486fe8_0\n  - jama=125=0\n  - jasper=2.0.33=h013e400_0\n  - jemalloc=5.2.1=he49afe7_6\n  - jpeg=9e=hac89ed1_2\n  - kakadu=1=0\n  - krb5=1.19.3=hb49756b_0\n  - lame=3.100=hb7f2c08_1003\n  - laszip=2.1.0_isis7=h01edc0c_1\n  - ld64_osx-64=609=hfd63004_11\n  - lerc=4.0.0=hb486fe8_0\n  - libblas=3.9.0=16_osx64_openblas\n  - libcblas=3.9.0=16_osx64_openblas\n  - libclang=14.0.6=default_h55ffa42_0\n  - libclang-cpp14=14.0.6=default_h55ffa42_0\n  - libclang13=14.0.6=default_hb5731bd_0\n  - libcurl=7.86.0=h57eb407_1\n  - libcxx=14.0.6=hccf4f1f_0\n  - libdeflate=1.14=hb7f2c08_0\n  - libedit=3.1.20191231=h0678c8f_2\n  - libelas=isis7=h01edc0c_0\n  - libev=4.33=haf1e3a3_1\n  - libevent=2.1.10=h815e4d9_4\n  - libffi=3.4.2=h0d85af4_5\n  - libgdal=3.5_isis7=h01edc0c_0\n  - libgfortran=5.0.0=9_5_0_h97931a8_26\n  - libgfortran-devel_osx-64=11.3.0=h824d247_27\n  - libgfortran5=11.3.0=h082f757_26\n  - libglib=2.74.1=h4c723e1_1\n  - libiconv=1.17=hac89ed1_0\n  - libidn2=2.3.4=hb7f2c08_0\n  - libjemalloc=5.2.1=he49afe7_6\n  - liblapack=3.9.0=16_osx64_openblas\n  - liblapacke=3.9.0=16_osx64_openblas\n  - liblas=1.8.2_isis7=h01edc0c_0\n  - libllvm14=14.0.6=h5b596cc_1\n  - libnabo=isis7=h01edc0c_0\n  - libnghttp2=1.47.0=h7cbc4dc_1\n  - libntlm=1.4=h0d85af4_1002\n  - libogg=1.3.4=h35c211d_1\n  - libopenblas=0.3.21=openmp_h429af6e_3\n  - libopencv=4.6.0=py39h743a0d3_4\n  - libopus=1.3.1=hc929b4f_1\n  - libpng=1.6.39=ha978bb4_0\n  - libpointmatcher=isis7=ha5a8b8e_0\n  - libpq=14.5=h4aa9af9_3\n  - libprotobuf=3.21.11=hbc0c0cd_0\n  - libsqlite=3.40.0=ha978bb4_0\n  - libssh2=1.10.0=h7535e13_3\n  - libtasn1=4.19.0=hb7f2c08_0\n  - libtiff=4.4.0=hdb44e8a_4\n  - libunistring=0.9.10=h0d85af4_0\n  - libuv=1.44.2=hac89ed1_0\n  - libvorbis=1.3.7=h046ec9c_0\n  - libvpx=1.11.0=he49afe7_3\n  - libwebp=1.2.4=hfa4350a_0\n  - libwebp-base=1.2.4=h775f41a_0\n  - libxcb=1.13=h0d85af4_1004\n  - libxml2=2.9.14=hea49891_4\n  - libzlib=1.2.13=hfd90126_4\n  - llvm-openmp=15.0.6=h61d9ccf_0\n  - llvm-tools=14.0.6=h5b596cc_1\n  - lz4-c=1.9.3=he49afe7_1\n  - macports-legacy-support=1.0.7=hb7f2c08_0\n  - mesalib=21.2.5=h2df1e00_3\n  - metis=5.1.0=h2e338ed_1006\n  - mpc=1.2.1=hbb51d92_0\n  - mpfr=4.1.0=h0f52abe_1\n  - multiview=asp3.2.0=py39h01edc0c_0\n  - mysql=8.0.31=h57ddcff_0\n  - mysql-client=8.0.31=hbbbc359_0\n  - mysql-common=8.0.31=h7ebae80_0\n  - mysql-connector-c=6.1.11=h0f02589_1007\n  - mysql-devel=8.0.31=h7ebae80_0\n  - mysql-libs=8.0.31=hc37e033_0\n  - mysql-server=8.0.31=ha134c4c_0\n  - nanoflann=1.4.2=h694c41f_0\n  - ncurses=6.3=h96cf925_1\n  - nettle=3.8.1=h96f3785_1\n  - networkx=2.8.8=pyhd8ed1ab_0\n  - nlohmann_json=3.11.2=hbbd2c75_0\n  - nn=1.86.0=h1de35cc_2003\n  - nspr=4.35=hea0b92c_0\n  - nss=3.78=ha8197d3_0\n  - numpy=1.23.5=py39hdfa1d0c_0\n  - openblas=0.3.21=openmp_hbefa662_3\n  - opencv=4.6.0=py39h6e9494a_4\n  - openexr=2.5.5=h7fa7ffa_0\n  - openh264=2.3.0=hb486fe8_0\n  - openjpeg=2.3.0=h3bf0609_1003\n  - openssl=1.1.1s=hfd90126_1\n  - p11-kit=0.24.1=h65f8906_0\n  - parallel=20221122=h694c41f_0\n  - pbzip2=1.1.13=h9d27c22_1\n  - pcl=1.11.1=h7984e4d_1\n  - pcre2=10.40=h1c4e4bc_0\n  - perl=5.32.1=2_h0d85af4_perl5\n  - pip=22.3.1=pyhd8ed1ab_0\n  - pixman=0.40.0=hbcb3906_0\n  - proj=9.1.0=hcbd9701_0\n  - protobuf=4.21.11=py39h7a8716b_0\n  - pthread-stubs=0.4=hc929b4f_1001\n  - pvl=1.3.2=pyhd8ed1ab_0\n  - py-opencv=4.6.0=py39h71a6800_4\n  - python=3.9.15=h531fd05_0_cpython\n  - python-dateutil=2.8.2=pyhd8ed1ab_0\n  - python_abi=3.9=3_cp39\n  - pytz=2022.6=pyhd8ed1ab_0\n  - pyyaml=6.0=py39ha30fb19_5\n  - qhull=2020.2=h940c156_2\n  - qt=5.15.4=hb3ad848_0\n  - qt-main=5.15.4=h938c29d_2\n  - qt-webengine=5.15.4=h72ca1e5_3\n  - qwt=6.2.0=h4cc5820_4\n  - rapidjson=1.1.0=hb1e8313_1002\n  - readline=8.1.2=h3899abd_0\n  - rhash=1.4.3=hac89ed1_0\n  - rocksdb=6.13.3=hbb73eaa_2\n  - s2p-subset=isis7=h01edc0c_0\n  - scipy=1.9.3=py39h8a15683_2\n  - setuptools=65.5.1=pyhd8ed1ab_0\n  - sigtool=0.1.3=h57ddcff_0\n  - six=1.16.0=pyh6c4a22f_0\n  - snappy=1.1.9=h225ccf5_2\n  - spiceypy=5.1.2=pyhd8ed1ab_0\n  - sqlite=3.40.0=h9ae0607_0\n  - stereo-pipeline=3.2.0=h01edc0c_0\n  - suitesparse=5.10.1=h7aff33d_1\n  - superlu=5.2.2=h1f0f902_0\n  - svt-av1=1.2.1=hbbd2c75_0\n  - tapi=1100.0.11=h9ce4665_0\n  - tbb=2021.7.0=hb8565cd_1\n  - tbb-devel=2021.7.0=hb8565cd_1\n  - tk=8.6.12=h5dbffcc_0\n  - tnt=126=0\n  - tzdata=2022g=h191b570_0\n  - usgscsm=1.6.0=hb8565cd_1\n  - visionworkbench=3.2.0=h01edc0c_0\n  - wheel=0.38.4=pyhd8ed1ab_0\n  - x264=1!164.3095=h775f41a_2\n  - x265=3.5=hbb4e6a2_3\n  - xerces-c=3.2.3=hf5b2a72_5\n  - xorg-damageproto=1.2.1=h0d85af4_1002\n  - xorg-fixesproto=5.0=h0d85af4_1002\n  - xorg-glproto=1.4.17=h0d85af4_1002\n  - xorg-inputproto=2.3.2=h35c211d_1002\n  - xorg-kbproto=1.0.7=h35c211d_1002\n  - xorg-libice=1.0.10=h0d85af4_0\n  - xorg-libsm=1.2.3=h0d85af4_1000\n  - xorg-libx11=1.7.2=h0d85af4_0\n  - xorg-libxau=1.0.9=h35c211d_0\n  - xorg-libxdamage=1.1.5=h0d85af4_1\n  - xorg-libxdmcp=1.1.3=h35c211d_0\n  - xorg-libxext=1.3.4=h0d85af4_1\n  - xorg-libxfixes=5.0.3=h0d85af4_1004\n  - xorg-libxi=1.7.10=h0d85af4_0\n  - xorg-libxrandr=1.5.2=h0d85af4_1\n  - xorg-libxrender=0.9.10=h0d85af4_1003\n  - xorg-randrproto=1.5.0=h0d85af4_1001\n  - xorg-renderproto=0.11.1=h0d85af4_1002\n  - xorg-util-macros=1.19.3=h35c211d_0\n  - xorg-xextproto=7.3.0=h35c211d_1002\n  - xorg-xf86vidmodeproto=2.3.1=h0d85af4_1002\n  - xorg-xproto=7.0.31=h35c211d_1007\n  - xz=5.2.6=h775f41a_0\n  - yaml=0.2.5=h0d85af4_2\n  - zlib=1.2.13=hfd90126_4\n  - zstd=1.5.2=hfa58983_4\n\n"
  },
  {
    "path": "conda/asp_3.3.0_linux_env.yaml",
    "content": "name: asp\nchannels:\n  - nasa-ames-stereo-pipeline\n  - usgs-astrogeology\n  - conda-forge\n  - defaults\ndependencies:\n  - _libgcc_mutex=0.1=conda_forge\n  - _openmp_mutex=4.5=2_kmp_llvm\n  - _sysroot_linux-64_curr_repodata_hack=3=h69a702a_13\n  - ale=0.9.1=py39h7633fee_0\n  - alsa-lib=1.2.7.2=h166bdaf_0\n  - aom=3.5.0=h27087fc_0\n  - armadillo=12.6.1=h0a193a4_0\n  - arpack=3.7.0=hdefa2d7_2\n  - blas=2.117=openblas\n  - blas-devel=3.9.0=17_linux64_openblas\n  - boost=1.72.0=py39ha90915f_1\n  - boost-cpp=1.72.0=h359cf19_6\n  - brotli-python=1.1.0=py39h3d6467e_0\n  - bullet=2.86.1=0\n  - bz2file=0.98=py_0\n  - bzip2=1.0.8=h7f98852_4\n  - c-ares=1.19.1=hd590300_0\n  - ca-certificates=2023.7.22=hbcca054_0\n  - cairo=1.16.0=ha12eb4b_1010\n  - ceres-solver=1.14.0=hf302a74_15\n  - certifi=2023.7.22=pyhd8ed1ab_0\n  - charset-normalizer=3.2.0=pyhd8ed1ab_0\n  - chrpath=0.16=h7f98852_1002\n  - csm=3.0.3.3=hc9558a2_0\n  - cspice=67=h166bdaf_4\n  - curl=7.87.0=h6312ad2_0\n  - cyrus-sasl=2.1.27=h957375c_6\n  - dbus=1.13.6=h5008d03_3\n  - eigen=3.4.0=h00ab1b0_0\n  - elfutils=0.188=hbb17bd0_0\n  - embree=2.17.7=ha770c72_3\n  - expat=2.5.0=hcb278e6_1\n  - ffmpeg=4.4.2=gpl_hbd009f3_109\n  - fftw=3.3.10=nompi_hc118613_108\n  - fgr=isis7=h3fd9d12_0\n  - flann=1.9.1=hfe772e8_1010\n  - font-ttf-dejavu-sans-mono=2.37=hab24e00_0\n  - font-ttf-inconsolata=3.000=h77eed37_0\n  - font-ttf-source-code-pro=2.038=h77eed37_0\n  - font-ttf-ubuntu=0.83=hab24e00_0\n  - fontconfig=2.14.2=h14ed4e7_0\n  - fonts-conda-ecosystem=1=0\n  - fonts-conda-forge=1=0\n  - freeglut=3.2.2=h9c3ff4c_1\n  - freetype=2.12.1=hca18f0e_1\n  - geoid=1.0_isis7=1\n  - geos=3.9.1=h9c3ff4c_2\n  - geotiff=1.7.1=ha76d385_4\n  - gettext=0.21.1=h27087fc_0\n  - gflags=2.2.2=he1b5a44_1004\n  - giflib=5.2.1=h0b41bf4_3\n  - glib=2.76.4=hfc55251_0\n  - glib-tools=2.76.4=hfc55251_0\n  - glog=0.6.0=h6f12383_0\n  - gmp=6.2.1=h58526e2_0\n  - gnutls=3.7.8=hf3e180e_0\n  - graphite2=1.3.13=h58526e2_1001\n  - gsl=2.6=he838d99_2\n  - gst-plugins-base=1.20.3=h57caac4_2\n  - gstreamer=1.20.3=hd4edc92_2\n  - harfbuzz=4.2.0=h40b6f09_0\n  - hdf5=1.12.1=nompi_h2386368_104\n  - htdp=1.0_isis7=1\n  - icu=69.1=h9c3ff4c_0\n  - idna=3.4=pyhd8ed1ab_0\n  - ilmbase=2.5.5=h780b84a_0\n  - inja=3.3.0=h9c3ff4c_0\n  - isis=8.0.0=np125_0\n  - jama=125=0\n  - jasper=2.0.33=h0ff4b12_1\n  - jemalloc=5.3.0=hcb278e6_0\n  - jpeg=9e=h0b41bf4_3\n  - kakadu=1=0\n  - kernel-headers_linux-64=3.10.0=h4a8ded7_13\n  - keyutils=1.6.1=h166bdaf_0\n  - krb5=1.20.1=hf9c8cef_0\n  - lame=3.100=h166bdaf_1003\n  - laszip=2.1.0_isis7=h3fd9d12_1\n  - ld_impl_linux-64=2.40=h41732ed_0\n  - lerc=4.0.0=h27087fc_0\n  - libarchive=3.5.2=hb890918_3\n  - libblas=3.9.0=17_linux64_openblas\n  - libcblas=3.9.0=17_linux64_openblas\n  - libclang=13.0.1=default_h7634d5b_3\n  - libcurl=7.87.0=h6312ad2_0\n  - libcxx=16.0.6=h00ab1b0_0\n  - libcxxabi=16.0.6=ha770c72_0\n  - libdeflate=1.14=h166bdaf_0\n  - libdrm=2.4.114=h166bdaf_0\n  - libdrm-cos6-x86_64=2.4.65=4\n  - libedit=3.1.20191231=he28a2e2_2\n  - libelas=isis7=h3fd9d12_0\n  - libev=4.33=h516909a_1\n  - libevent=2.1.10=h9b69904_4\n  - libexpat=2.5.0=hcb278e6_1\n  - libffi=3.4.2=h7f98852_5\n  - libgcc-ng=13.1.0=he5830b7_0\n  - libgdal=3.5_isis8=h3fd9d12_0\n  - libgfortran-ng=13.1.0=h69a702a_0\n  - libgfortran5=13.1.0=h15d22d2_0\n  - libglib=2.76.4=hebfc3b9_0\n  - libglu=9.0.0=he1b5a44_1001\n  - libglvnd-cos7-x86_64=1.0.1=h9b0a68f_1105\n  - libhwloc=2.8.0=h32351e8_1\n  - libiconv=1.17=h166bdaf_0\n  - libidn2=2.3.4=h166bdaf_0\n  - libjemalloc=5.3.0=hcb278e6_0\n  - liblapack=3.9.0=17_linux64_openblas\n  - liblapacke=3.9.0=17_linux64_openblas\n  - liblas=1.8.2_isis8=h3fd9d12_0\n  - libllvm13=13.0.1=hf817b99_2\n  - libmicrohttpd=0.9.77=h97afed2_0\n  - libnabo=isis7=h3fd9d12_0\n  - libnghttp2=1.51.0=hdcd2b5c_0\n  - libnsl=2.0.0=h7f98852_0\n  - libntlm=1.4=h7f98852_1002\n  - libogg=1.3.4=h7f98852_1\n  - libopenblas=0.3.23=pthreads_h80387f5_0\n  - libopencv=4.5.5=py39hb0e02d1_7\n  - libopus=1.3.1=h7f98852_1\n  - libpciaccess=0.17=h166bdaf_0\n  - libpng=1.6.39=h753d276_0\n  - libpointmatcher=isis7=h2bc3f7f_0\n  - libpq=14.5=h2baec63_5\n  - libprotobuf=3.19.6=h3eb15da_0\n  - libsqlite=3.43.0=h2797004_0\n  - libssh2=1.10.0=haa6b8db_3\n  - libstdcxx-ng=13.1.0=hfd8a6a1_0\n  - libtasn1=4.19.0=h166bdaf_0\n  - libtiff=4.4.0=h82bc61c_5\n  - libunistring=0.9.10=h7f98852_0\n  - libuuid=2.38.1=h0b41bf4_0\n  - libva=2.18.0=h0b41bf4_0\n  - libvorbis=1.3.7=h9c3ff4c_0\n  - libvpx=1.11.0=h9c3ff4c_3\n  - libwebp-base=1.3.1=hd590300_0\n  - libx11-common-cos6-x86_64=1.6.4=4\n  - libx11-cos6-x86_64=1.6.4=4\n  - libxcb=1.13=h7f98852_1004\n  - libxkbcommon=1.0.3=he3ba5ed_0\n  - libxml2=2.9.14=haae042b_4\n  - libzlib=1.2.13=hd590300_5\n  - llvm-openmp=16.0.6=h4dfa4b3_0\n  - lz4-c=1.9.3=h9c3ff4c_1\n  - lzo=2.10=h516909a_1000\n  - mesa-libgl-cos6-x86_64=11.0.7=4\n  - mesalib=23.0.0=h0fe20ba_0\n  - metis=5.1.0=h59595ed_1007\n  - mpfr=4.2.0=hb012696_0\n  - multiview=isis8=py39h3fd9d12_0\n  - mysql=8.0.28=h3e2b116_2\n  - mysql-client=8.0.28=hf89ab62_2\n  - mysql-common=8.0.28=haf5c9bc_2\n  - mysql-connector-c=6.1.11=h6eb9d5d_1007\n  - mysql-devel=8.0.28=haf5c9bc_2\n  - mysql-libs=8.0.28=h28c427c_2\n  - mysql-server=8.0.28=hb253900_2\n  - nanoflann=1.4.2=ha770c72_0\n  - ncurses=6.4=hcb278e6_0\n  - nettle=3.8.1=hc379101_1\n  - networkx=3.1=pyhd8ed1ab_0\n  - nlohmann_json=3.11.2=h27087fc_0\n  - nn=1.86.0=hd590300_2003\n  - nspr=4.35=h27087fc_0\n  - nss=3.92=h1d7d5a4_0\n  - numpy=1.25.2=py39h6183b62_0\n  - openblas=0.3.23=pthreads_h855a84d_0\n  - opencv=4.5.5=py39hf3d152e_7\n  - openexr=2.5.5=hf817b99_0\n  - openh264=2.3.1=hcb278e6_2\n  - openjpeg=2.3.0=hf38bd82_1003\n  - openssl=1.1.1v=hd590300_0\n  - p11-kit=0.24.1=hc5aa10d_0\n  - packaging=23.1=pyhd8ed1ab_0\n  - parallel=20230722=ha770c72_0\n  - pbzip2=1.1.13=0\n  - pcl=1.11.1=h05311af_1\n  - pcre2=10.40=hc3806b6_0\n  - perl=5.32.1=4_hd590300_perl5\n  - pip=23.2.1=pyhd8ed1ab_0\n  - pixman=0.40.0=h36c2ea0_0\n  - platformdirs=3.10.0=pyhd8ed1ab_0\n  - pooch=1.7.0=pyha770c72_3\n  - proj=9.1.0=h93bde94_0\n  - protobuf=3.19.6=py39h227be39_0\n  - pthread-stubs=0.4=h36c2ea0_1001\n  - pvl=1.3.2=pyhd8ed1ab_0\n  - py-opencv=4.5.5=py39hef51801_7\n  - pysocks=1.7.1=pyha2e5f31_6\n  - python=3.9.15=h47a2c10_0_cpython\n  - python-dateutil=2.8.2=pyhd8ed1ab_0\n  - python_abi=3.9=3_cp39\n  - pytz=2023.3.post1=pyhd8ed1ab_0\n  - pyyaml=6.0.1=py39hd1e30aa_0\n  - qhull=2020.2=h4bd325d_2\n  - qt=5.12.9=h1304e3e_6\n  - qwt=6.2.0=hb19a904_2\n  - rapidjson=1.1.0=he1b5a44_1002\n  - rclone=1.63.1=h519d9b9_0\n  - readline=8.2=h8228510_1\n  - requests=2.31.0=pyhd8ed1ab_0\n  - rocksdb=6.13.3=hda8cf21_2\n  - s2p-subset=isis7=h3fd9d12_0\n  - scipy=1.11.2=py39h6183b62_0\n  - setuptools=68.1.2=pyhd8ed1ab_0\n  - six=1.16.0=pyh6c4a22f_0\n  - spiceypy=6.0.0=pyhd8ed1ab_0\n  - sqlite=3.43.0=h2c6b66d_0\n  - stereo-pipeline=3.3.0=h3fd9d12_0\n  - suitesparse=5.10.1=h9e50725_1\n  - superlu=5.2.2=h00795ac_0\n  - svt-av1=1.3.0=h27087fc_0\n  - sysroot_linux-64=2.17=h4a8ded7_13\n  - tbb=2021.7.0=h924138e_1\n  - tbb-devel=2021.7.0=h924138e_1\n  - tk=8.6.12=h27826a3_0\n  - tnt=126=0\n  - typing-extensions=4.7.1=hd8ed1ab_0\n  - typing_extensions=4.7.1=pyha770c72_0\n  - tzdata=2023c=h71feb2d_0\n  - urllib3=2.0.4=pyhd8ed1ab_0\n  - usgscsm=1.7.0=h00ab1b0_1\n  - visionworkbench=3.3.0=h3fd9d12_0\n  - wheel=0.41.2=pyhd8ed1ab_0\n  - x264=1!164.3095=h166bdaf_2\n  - x265=3.5=h924138e_3\n  - xerces-c=3.2.3=h8ce2273_4\n  - xorg-damageproto=1.2.1=h7f98852_1002\n  - xorg-fixesproto=5.0=h7f98852_1002\n  - xorg-glproto=1.4.17=h7f98852_1002\n  - xorg-inputproto=2.3.2=h7f98852_1002\n  - xorg-kbproto=1.0.7=h7f98852_1002\n  - xorg-libice=1.1.1=hd590300_0\n  - xorg-libsm=1.2.4=h7391055_0\n  - xorg-libx11=1.8.4=h0b41bf4_0\n  - xorg-libxau=1.0.11=hd590300_0\n  - xorg-libxdamage=1.1.5=h7f98852_1\n  - xorg-libxdmcp=1.1.3=h7f98852_0\n  - xorg-libxext=1.3.4=h0b41bf4_2\n  - xorg-libxfixes=5.0.3=h7f98852_1004\n  - xorg-libxi=1.7.10=h7f98852_0\n  - xorg-libxrandr=1.5.2=h7f98852_1\n  - xorg-libxrender=0.9.10=h7f98852_1003\n  - xorg-randrproto=1.5.0=h7f98852_1001\n  - xorg-renderproto=0.11.1=h7f98852_1002\n  - xorg-util-macros=1.19.3=h7f98852_0\n  - xorg-xextproto=7.3.0=h0b41bf4_1003\n  - xorg-xf86vidmodeproto=2.3.1=h7f98852_1002\n  - xorg-xproto=7.0.31=h7f98852_1007\n  - xz=5.2.6=h166bdaf_0\n  - yaml=0.2.5=h7f98852_2\n  - zlib=1.2.13=hd590300_5\n  - zstd=1.5.5=hfc55251_0\n"
  },
  {
    "path": "conda/asp_3.3.0_osx_env.yaml",
    "content": "name: asp\nchannels:\n  - nasa-ames-stereo-pipeline\n  - usgs-astrogeology\n  - conda-forge\n  - defaults\ndependencies:\n  - ale=0.9.1=py39h8ee36c8_0\n  - aom=3.5.0=hf0c8a7f_0\n  - armadillo=12.6.1=hdc495e4_0\n  - arpack=3.7.0=hefb7bc6_2\n  - blas=2.117=openblas\n  - blas-devel=3.9.0=17_osx64_openblas\n  - boost=1.72.0=py39hb64e6f8_1\n  - boost-cpp=1.72.0=hf3dc895_6\n  - brotli-python=1.1.0=py39h840bb9f_0\n  - bullet=2.86.1=0\n  - bz2file=0.98=py_0\n  - bzip2=1.0.8=h0d85af4_4\n  - c-ares=1.19.1=h0dc2134_0\n  - ca-certificates=2023.7.22=h8857fd0_0\n  - cairo=1.16.0=h9e0e54b_1010\n  - ceres-solver=1.14.0=h636452b_15\n  - certifi=2023.7.22=pyhd8ed1ab_0\n  - charset-normalizer=3.2.0=pyhd8ed1ab_0\n  - csm=3.0.3.3=0\n  - cspice=67=hb7f2c08_4\n  - curl=8.2.1=h5f667d7_0\n  - cyrus-sasl=2.1.27=hf9bab2b_7\n  - eigen=3.4.0=h1c7c39f_0\n  - embree=2.17.7=h694c41f_3\n  - expat=2.5.0=hf0c8a7f_1\n  - ffmpeg=4.4.2=gpl_hff0bab5_109\n  - fftw=3.3.10=nompi_h4fa670e_108\n  - fgr=isis7=h01edc0c_0\n  - flann=1.9.1=h30321d8_1010\n  - font-ttf-dejavu-sans-mono=2.37=hab24e00_0\n  - font-ttf-inconsolata=3.000=h77eed37_0\n  - font-ttf-source-code-pro=2.038=h77eed37_0\n  - font-ttf-ubuntu=0.83=hab24e00_0\n  - fontconfig=2.14.2=h5bb23bf_0\n  - fonts-conda-ecosystem=1=0\n  - fonts-conda-forge=1=0\n  - freetype=2.12.1=h3f81eb7_1\n  - geoid=1.0_isis7=1\n  - geos=3.9.1=he49afe7_2\n  - geotiff=1.7.1=he29fd1c_4\n  - gettext=0.21.1=h8a4c099_0\n  - gflags=2.2.2=hb1e8313_1004\n  - giflib=5.2.1=hb7f2c08_3\n  - glog=0.6.0=h8ac2a54_0\n  - gmp=6.2.1=h2e338ed_0\n  - gnutls=3.7.8=h207c4f0_0\n  - graphite2=1.3.13=h2e338ed_1001\n  - gsl=2.6=h71c5fe9_2\n  - harfbuzz=4.2.0=h48644e2_0\n  - hdf5=1.12.1=nompi_h0aa1fa2_104\n  - htdp=1.0_isis7=1\n  - icu=69.1=he49afe7_0\n  - idna=3.4=pyhd8ed1ab_0\n  - ilmbase=2.5.5=hfab91a5_0\n  - inja=3.3.0=he49afe7_0\n  - isis=8.0.0=np125_0\n  - jama=125=0\n  - jasper=2.0.33=h7c6fec8_1\n  - jemalloc=5.3.0=hf0c8a7f_0\n  - jpeg=9e=hb7f2c08_3\n  - kakadu=1=0\n  - krb5=1.21.1=hb884880_0\n  - lame=3.100=hb7f2c08_1003\n  - laszip=2.1.0_isis7=h01edc0c_1\n  - lerc=4.0.0=hb486fe8_0\n  - libblas=3.9.0=17_osx64_openblas\n  - libcblas=3.9.0=17_osx64_openblas\n  - libclang=13.0.1=root_62804_h2961583_3\n  - libcurl=8.2.1=h5f667d7_0\n  - libcxx=16.0.6=hd57cbcb_0\n  - libdeflate=1.14=hb7f2c08_0\n  - libedit=3.1.20191231=h0678c8f_2\n  - libelas=isis7=h01edc0c_0\n  - libev=4.33=haf1e3a3_1\n  - libevent=2.1.10=h7d65743_4\n  - libexpat=2.5.0=hf0c8a7f_1\n  - libffi=3.4.2=h0d85af4_5\n  - libgdal=3.5_isis8=hf8dc8b4_0\n  - libgfortran=5.0.0=12_3_0_h97931a8_1\n  - libgfortran5=12.3.0=hbd3c1fe_1\n  - libglib=2.76.4=hc62aa5d_0\n  - libiconv=1.17=hac89ed1_0\n  - libidn2=2.3.4=hb7f2c08_0\n  - libjemalloc=5.3.0=hf0c8a7f_0\n  - liblapack=3.9.0=17_osx64_openblas\n  - liblapacke=3.9.0=17_osx64_openblas\n  - liblas=1.8.2_isis8=hf8dc8b4_0\n  - libllvm13=13.0.1=h64f94b2_2\n  - libnabo=isis7=h01edc0c_0\n  - libnghttp2=1.52.0=he2ab024_0\n  - libntlm=1.4=h0d85af4_1002\n  - libopenblas=0.3.23=openmp_h429af6e_0\n  - libopencv=4.5.5=py39hc2bf5a6_7\n  - libpng=1.6.39=ha978bb4_0\n  - libpointmatcher=isis7=ha5a8b8e_0\n  - libpq=14.5=h3df487d_7\n  - libprotobuf=3.19.6=hbc0c0cd_0\n  - libsqlite=3.42.0=h58db7d2_0\n  - libssh2=1.11.0=hd019ec5_0\n  - libtasn1=4.19.0=hb7f2c08_0\n  - libtiff=4.4.0=h6268bbc_5\n  - libunistring=0.9.10=h0d85af4_0\n  - libvpx=1.11.0=he49afe7_3\n  - libwebp-base=1.3.1=h0dc2134_0\n  - libxcb=1.15=hb7f2c08_0\n  - libxml2=2.9.14=h1faee8b_4\n  - libzlib=1.2.13=h8a1eda9_5\n  - llvm-openmp=16.0.6=hff08bdf_0\n  - lz4-c=1.9.3=he49afe7_1\n  - macports-legacy-support=1.0.13=h0dc2134_0\n  - mesalib=23.1.4=hb59017c_0\n  - metis=5.1.0=he965462_1007\n  - mpfr=4.2.0=h4f9bd69_0\n  - multiview=isis8=py39hf8dc8b4_0\n  - mysql=8.0.28=h88f4db0_2\n  - mysql-client=8.0.28=h7ddd48c_2\n  - mysql-common=8.0.28=hdd8d184_2\n  - mysql-devel=8.0.28=hdd8d184_2\n  - mysql-libs=8.0.28=h353f102_2\n  - mysql-server=8.0.28=h6edde1b_2\n  - nanoflann=1.4.2=h694c41f_0\n  - ncurses=6.4=hf0c8a7f_0\n  - nettle=3.8.1=h96f3785_1\n  - networkx=3.1=pyhd8ed1ab_0\n  - nlohmann_json=3.11.2=hbbd2c75_0\n  - nn=1.86.0=h0dc2134_2003\n  - nspr=4.35=hea0b92c_0\n  - nss=3.92=hd6ac835_0\n  - numpy=1.25.2=py39h892e69a_0\n  - openblas=0.3.23=openmp_hbefa662_0\n  - opencv=4.5.5=py39h6e9494a_7\n  - openexr=2.5.5=h7fa7ffa_0\n  - openh264=2.3.1=hf0c8a7f_2\n  - openjpeg=2.3.0=h3bf0609_1003\n  - openssl=3.1.2=h8a1eda9_0\n  - p11-kit=0.24.1=h65f8906_0\n  - packaging=23.1=pyhd8ed1ab_0\n  - parallel=20230722=h694c41f_0\n  - pbzip2=1.1.13=h9d27c22_1\n  - pcl=1.11.1=h7984e4d_1\n  - pcre2=10.40=h1c4e4bc_0\n  - perl=5.32.1=4_h0dc2134_perl5\n  - pip=23.2.1=pyhd8ed1ab_0\n  - pixman=0.40.0=hbcb3906_0\n  - platformdirs=3.10.0=pyhd8ed1ab_0\n  - pooch=1.7.0=pyha770c72_3\n  - proj=9.1.0=hcbd9701_0\n  - protobuf=3.19.6=py39h7a8716b_0\n  - pthread-stubs=0.4=hc929b4f_1001\n  - pvl=1.3.2=pyhd8ed1ab_0\n  - py-opencv=4.5.5=py39h71a6800_7\n  - pysocks=1.7.1=pyha2e5f31_6\n  - python=3.9.17=h07e1443_0_cpython\n  - python-dateutil=2.8.2=pyhd8ed1ab_0\n  - python_abi=3.9=3_cp39\n  - pytz=2023.3.post1=pyhd8ed1ab_0\n  - pyyaml=6.0.1=py39hdc70f33_0\n  - qhull=2020.2=h940c156_2\n  - qt=5.12.9=h2a607e2_5\n  - qwt=6.2.0=h0f3c874_2\n  - rapidjson=1.1.0=hb1e8313_1002\n  - rclone=1.63.1=h1762f63_0\n  - readline=8.2=h9e318b2_1\n  - requests=2.31.0=pyhd8ed1ab_0\n  - rocksdb=6.13.3=hbb73eaa_2\n  - s2p-subset=isis7=h01edc0c_0\n  - scipy=1.11.2=py39hded996c_0\n  - setuptools=68.1.2=pyhd8ed1ab_0\n  - six=1.16.0=pyh6c4a22f_0\n  - snappy=1.1.10=h225ccf5_0\n  - spiceypy=6.0.0=pyhd8ed1ab_0\n  - sqlite=3.42.0=h2b0dec6_0\n  - stereo-pipeline=3.3.0=hf8dc8b4_0\n  - suitesparse=5.10.1=h7aff33d_1\n  - superlu=5.2.2=h1f0f902_0\n  - svt-av1=1.3.0=hf0c8a7f_0\n  - tbb=2021.10.0.custom_asp=h6b95b14_0\n  - tbb-devel=2021.10.0.custom_asp=h6b95b14_0\n  - tk=8.6.12=h5dbffcc_0\n  - tnt=126=0\n  - typing-extensions=4.7.1=hd8ed1ab_0\n  - typing_extensions=4.7.1=pyha770c72_0\n  - tzdata=2023c=h71feb2d_0\n  - urllib3=2.0.4=pyhd8ed1ab_0\n  - usgscsm=1.7.0=h1c7c39f_1\n  - visionworkbench=3.3.0=hf8dc8b4_0\n  - wheel=0.41.2=pyhd8ed1ab_0\n  - x264=1!164.3095=h775f41a_2\n  - x265=3.5=hbb4e6a2_3\n  - xerces-c=3.2.3=h6564042_4\n  - xorg-damageproto=1.2.1=h0d85af4_1002\n  - xorg-fixesproto=5.0=h0d85af4_1002\n  - xorg-glproto=1.4.17=h0d85af4_1002\n  - xorg-inputproto=2.3.2=h35c211d_1002\n  - xorg-kbproto=1.0.7=h35c211d_1002\n  - xorg-libice=1.1.1=h0dc2134_0\n  - xorg-libsm=1.2.4=h0dc2134_0\n  - xorg-libx11=1.8.6=hbd0b022_0\n  - xorg-libxau=1.0.11=h0dc2134_0\n  - xorg-libxdamage=1.1.5=h0d85af4_1\n  - xorg-libxdmcp=1.1.3=h35c211d_0\n  - xorg-libxext=1.3.4=hb7f2c08_2\n  - xorg-libxfixes=5.0.3=h0d85af4_1004\n  - xorg-libxi=1.7.10=h0d85af4_0\n  - xorg-libxrandr=1.5.2=h0d85af4_1\n  - xorg-libxrender=0.9.11=h0dc2134_0\n  - xorg-randrproto=1.5.0=h0d85af4_1001\n  - xorg-renderproto=0.11.1=h0d85af4_1002\n  - xorg-util-macros=1.19.3=h35c211d_0\n  - xorg-xextproto=7.3.0=hb7f2c08_1003\n  - xorg-xf86vidmodeproto=2.3.1=h0d85af4_1002\n  - xorg-xproto=7.0.31=h35c211d_1007\n  - xz=5.2.6=h775f41a_0\n  - yaml=0.2.5=h0d85af4_2\n  - zlib=1.2.13=h8a1eda9_5\n  - zstd=1.5.5=h829000d_0\n"
  },
  {
    "path": "conda/asp_3.5.0_linux_env.yaml",
    "content": "name: asp_deps\nchannels:\n  - nasa-ames-stereo-pipeline\n  - usgs-astrogeology\n  - conda-forge\n  - nodefaults\n  - https://repo.anaconda.com/pkgs/main\n  - https://repo.anaconda.com/pkgs/r\ndependencies:\n  - _libgcc_mutex=0.1=conda_forge\n  - _openmp_mutex=4.5=3_kmp_llvm\n  - affine=2.4.0=pyhd8ed1ab_1\n  - aiohappyeyeballs=2.6.1=pyhd8ed1ab_0\n  - aiohttp=3.11.18=py311h2dc5d0c_0\n  - aiosignal=1.3.2=pyhd8ed1ab_0\n  - ale=0.10.0=py311hd18a35c_3\n  - alsa-lib=1.2.9=hd590300_0\n  - aom=3.7.1=h59595ed_0\n  - armadillo=14.0.2=h88fc5b9_0\n  - arpack=3.9.1=nompi_hf03ea27_102\n  - atk-1.0=2.38.0=hd4edc92_1\n  - attr=2.5.1=h166bdaf_1\n  - attrs=25.3.0=pyh71513ae_0\n  - aws-c-auth=0.7.4=h1083cbe_2\n  - aws-c-cal=0.6.2=h09139f6_2\n  - aws-c-common=0.9.3=hd590300_0\n  - aws-c-compression=0.2.17=h184a658_3\n  - aws-c-event-stream=0.3.2=h6fea174_2\n  - aws-c-http=0.7.13=hb59894b_2\n  - aws-c-io=0.13.33=h161b759_0\n  - aws-c-mqtt=0.9.7=h55cd26b_0\n  - aws-c-s3=0.3.17=hfb4bb88_4\n  - aws-c-sdkutils=0.1.12=h184a658_2\n  - aws-checksums=0.1.17=h184a658_2\n  - aws-crt-cpp=0.24.2=ha28989d_2\n  - aws-sdk-cpp=1.10.57=hec69fbc_24\n  - binutils=2.43=h4852527_4\n  - binutils_impl_linux-64=2.43=h4bf12b8_4\n  - binutils_linux-64=2.43=h4852527_4\n  - blas=2.131=openblas\n  - blas-devel=3.9.0=31_h1ea3ea9_openblas\n  - blosc=1.21.6=hef167b5_0\n  - boost=1.78.0=py311h92ebd52_5\n  - boost-cpp=1.78.0=h6582d0a_3\n  - bullet=2.86.1=0\n  - bz2file=0.98=py_0\n  - bzip2=1.0.8=h4bc722e_7\n  - c-ares=1.34.5=hb9d3cd8_0\n  - c-compiler=1.9.0=h2b85faf_0\n  - ca-certificates=2025.1.31=hbd8a1cb_1\n  - cached-property=1.5.2=hd8ed1ab_1\n  - cached_property=1.5.2=pyha770c72_1\n  - cairo=1.16.0=hbbf8b49_1016\n  - ceres-solver=2.2.0=h30ec75d_2\n  - certifi=2025.1.31=pyhd8ed1ab_0\n  - cfitsio=4.3.0=hbdc6101_0\n  - chrpath=0.16=h7f98852_1002\n  - cmake=3.27.9=hcfe8598_0\n  - compilers=1.9.0=ha770c72_0\n  - csm=3.0.3.3=h84d6215_1\n  - cspice=67=hb9d3cd8_8\n  - curl=8.4.0=hca28451_0\n  - cxx-compiler=1.9.0=h1a2810e_0\n  - cyrus-sasl=2.1.27=h54b06d7_7\n  - dav1d=1.2.1=hd590300_0\n  - dbus=1.13.6=h5008d03_3\n  - double-conversion=3.3.1=h5888daf_0\n  - eigen=3.4.0=h00ab1b0_0\n  - elfutils=0.189=hde5d1a3_0\n  - embree=3.13.0=habf647b_1\n  - expat=2.5.0=hcb278e6_1\n  - ffmpeg=6.1.0=gpl_h402741f_101\n  - fftw=3.3.10=nompi_hf1063bd_110\n  - fgr=asp3.5.0=h3fd9d12_0\n  - flann=1.9.1=h941a29b_1013\n  - font-ttf-dejavu-sans-mono=2.37=hab24e00_0\n  - font-ttf-inconsolata=3.000=h77eed37_0\n  - font-ttf-source-code-pro=2.038=h77eed37_0\n  - font-ttf-ubuntu=0.83=h77eed37_3\n  - fontconfig=2.14.2=h14ed4e7_0\n  - fonts-conda-ecosystem=1=0\n  - fonts-conda-forge=1=0\n  - fortran-compiler=1.9.0=h36df796_0\n  - freeglut=3.2.2=hac7e632_2\n  - freetype=2.13.3=ha770c72_1\n  - freexl=1.0.6=h166bdaf_1\n  - fribidi=1.0.10=h36c2ea0_0\n  - frozenlist=1.5.0=py311h2dc5d0c_1\n  - gcc=13.3.0=h9576a4e_2\n  - gcc_impl_linux-64=13.3.0=h1e990d8_2\n  - gcc_linux-64=13.3.0=hc28eda2_10\n  - gdk-pixbuf=2.42.10=h6b639ba_2\n  - geoid=1.0_isis7=1\n  - geos=3.12.0=h59595ed_0\n  - geotiff=1.7.1=h22adcc9_11\n  - gettext=0.23.1=h5888daf_0\n  - gettext-tools=0.23.1=h5888daf_0\n  - gflags=2.2.2=h5888daf_1005\n  - gfortran=13.3.0=h9576a4e_2\n  - gfortran_impl_linux-64=13.3.0=h84c1745_2\n  - gfortran_linux-64=13.3.0=hb919d3a_10\n  - giflib=5.2.2=hd590300_0\n  - gl2ps=1.4.2=hae5d5c5_1\n  - glew=2.1.0=h9c3ff4c_2\n  - glib=2.78.1=hfc55251_0\n  - glib-tools=2.78.1=hfc55251_0\n  - glog=0.7.1=hbabe93e_0\n  - gmp=6.3.0=hac33072_2\n  - gnutls=3.7.9=hb077bed_0\n  - graphite2=1.3.13=h59595ed_1003\n  - graphviz=8.1.0=h28d9a01_0\n  - greenlet=3.2.0=py311hfdbb021_0\n  - gsl=2.6=he838d99_2\n  - gst-plugins-base=1.22.5=hf7dbed1_0\n  - gstreamer=1.22.5=h98fc4e7_0\n  - gtk2=2.24.33=h90689f9_2\n  - gts=0.7.6=h977cf35_4\n  - gxx=13.3.0=h9576a4e_2\n  - gxx_impl_linux-64=13.3.0=hae580e1_2\n  - gxx_linux-64=13.3.0=h6834431_10\n  - h5py=3.9.0=nompi_py311he78b9b8_101\n  - harfbuzz=7.3.0=hdb3a94d_0\n  - hdf4=4.2.15=h501b40f_6\n  - hdf5=1.14.1=nompi_h4f84152_100\n  - icu=72.1=hcb278e6_0\n  - idna=3.10=pyhd8ed1ab_1\n  - ilmbase=2.5.5=h3fd9d12_1\n  - inja=3.3.0=h9c3ff4c_0\n  - isis=8.3.0=0\n  - jama=125=0\n  - jasper=4.0.0=h32699f2_1\n  - jinja2=3.1.6=pyhd8ed1ab_0\n  - json-c=0.17=h1220068_1\n  - jsoncpp=1.9.5=h4bd325d_1\n  - kakadu=1=0\n  - kalasiris=1.11.0=pyhd8ed1ab_1\n  - kealib=1.5.1=h3e6883b_4\n  - kernel-headers_linux-64=3.10.0=he073ed8_18\n  - keyutils=1.6.1=h166bdaf_0\n  - krb5=1.21.2=h659d440_0\n  - lame=3.100=h166bdaf_1003\n  - lcms2=2.15=haa2dc70_1\n  - ld_impl_linux-64=2.43=h712a8e2_4\n  - lerc=4.0.0=h0aef613_1\n  - libaec=1.1.3=h59595ed_0\n  - libarchive=3.6.2=h039dbb9_1\n  - libasprintf=0.23.1=h8e693c7_0\n  - libasprintf-devel=0.23.1=h8e693c7_0\n  - libass=0.17.1=hc9aadba_0\n  - libblas=3.9.0=31_h59b9bed_openblas\n  - libcap=2.71=h39aace5_0\n  - libcblas=3.9.0=31_he106b2a_openblas\n  - libclang=15.0.7=default_h127d8a8_5\n  - libclang13=15.0.7=default_h5d6823c_5\n  - libcups=2.3.3=h4637d8d_4\n  - libcurl=8.4.0=hca28451_0\n  - libcxx=19.1.7=h2713693_1\n  - libcxxabi=19.1.7=hd85fd95_1\n  - libdeflate=1.18=h0b41bf4_0\n  - libdrm=2.4.124=hb9d3cd8_0\n  - libdrm-cos7-x86_64=2.4.97=ha675448_1106\n  - libedit=3.1.20250104=pl5321h7949ede_0\n  - libelas=asp3.5.0=h3fd9d12_0\n  - libev=4.33=hd590300_2\n  - libevent=2.1.12=hf998b51_1\n  - libexpat=2.5.0=hcb278e6_1\n  - libffi=3.4.6=h2dba641_1\n  - libflac=1.4.3=h59595ed_0\n  - libfreetype=2.13.3=ha770c72_1\n  - libfreetype6=2.13.3=h48d6fc4_1\n  - libgcc=14.2.0=h767d61c_2\n  - libgcc-devel_linux-64=13.3.0=hc03c837_102\n  - libgcc-ng=14.2.0=h69a702a_2\n  - libgcrypt-lib=1.11.0=hb9d3cd8_2\n  - libgd=2.3.3=hfa28ad5_6\n  - libgdal=3.7.1=hd2ada2b_6\n  - libgettextpo=0.23.1=h5888daf_0\n  - libgettextpo-devel=0.23.1=h5888daf_0\n  - libgfortran=14.2.0=h69a702a_2\n  - libgfortran-ng=14.2.0=h69a702a_2\n  - libgfortran5=14.2.0=hf1ad2bd_2\n  - libglib=2.78.1=hebfc3b9_0\n  - libglu=9.0.0=hac7e632_1003\n  - libglvnd=1.7.0=ha4b6fd6_2\n  - libglvnd-cos7-x86_64=1.0.1=ha675448_1106\n  - libglvnd-glx-cos7-x86_64=1.0.1=ha675448_1106\n  - libgomp=14.2.0=h767d61c_2\n  - libgpg-error=1.54=hbd13f7d_0\n  - libhwloc=2.9.3=default_h554bfaf_1009\n  - libiconv=1.18=h4ce23a2_1\n  - libidn2=2.3.8=ha4ef2c3_0\n  - libjemalloc=5.3.0=h5888daf_1\n  - libjpeg-turbo=2.1.5.1=hd590300_1\n  - libkml=1.3.0=h01aab08_1016\n  - liblapack=3.9.0=31_h7ac8fdf_openblas\n  - liblapacke=3.9.0=31_he2f377e_openblas\n  - libllvm15=15.0.7=h5cf9203_3\n  - libllvm17=17.0.5=h5cf9203_0\n  - libltdl=2.4.3a=h5888daf_0\n  - liblzma=5.8.1=hb9d3cd8_0\n  - liblzma-devel=5.8.1=hb9d3cd8_0\n  - libmicrohttpd=0.9.77=h97afed2_0\n  - libnabo=asp3.5.0=h3fd9d12_1\n  - libnetcdf=4.9.2=nompi_h7e745eb_109\n  - libnghttp2=1.58.0=h47da74e_0\n  - libnsl=2.0.1=hd590300_0\n  - libntlm=1.8=hb9d3cd8_0\n  - libogg=1.3.5=h4ab18f5_0\n  - libopenblas=0.3.29=pthreads_h94d23a6_0\n  - libopencv=4.7.0=py311h8aafb54_6\n  - libopus=1.5.2=hd0c01bc_0\n  - libpciaccess=0.18=hd590300_0\n  - libpng=1.6.47=h943b412_0\n  - libpointmatcher=asp3.5.0=h2bc3f7f_1\n  - libpq=15.4=hfc447b1_2\n  - libprotobuf=3.21.12=hfc55251_2\n  - librsvg=2.56.3=h98fae49_0\n  - librttopo=1.1.0=hb58d41b_14\n  - libsanitizer=13.3.0=he8ea267_2\n  - libsndfile=1.2.2=hc60ed4a_1\n  - libspatialite=5.0.1=h15f6e67_28\n  - libsqlite=3.49.1=hee588c1_2\n  - libssh2=1.11.0=h0841786_0\n  - libstdcxx=14.2.0=h8f9b012_2\n  - libstdcxx-devel_linux-64=13.3.0=hc03c837_102\n  - libstdcxx-ng=14.2.0=h4852527_2\n  - libsystemd0=256.9=h2774228_0\n  - libtasn1=4.20.0=hb9d3cd8_0\n  - libtheora=1.1.1=h4ab18f5_1006\n  - libtiff=4.5.1=h8b53f26_1\n  - libtool=2.5.4=h5888daf_0\n  - libunistring=0.9.10=h7f98852_0\n  - libuuid=2.38.1=h0b41bf4_0\n  - libuv=1.50.0=hb9d3cd8_0\n  - libva=2.21.0=h4ab18f5_2\n  - libvorbis=1.3.7=h9c3ff4c_0\n  - libvpx=1.13.1=h59595ed_0\n  - libwebp=1.3.1=hbf2b3c1_0\n  - libwebp-base=1.3.1=hd590300_0\n  - libxcb=1.15=h0b41bf4_0\n  - libxcrypt=4.4.36=hd590300_1\n  - libxkbcommon=1.6.0=h5d7e998_0\n  - libxml2=2.11.5=h0d562d8_0\n  - libzip=1.10.1=h2629f0a_3\n  - libzlib=1.3.1=hb9d3cd8_2\n  - llvm-openmp=16.0.6=h4dfa4b3_0\n  - loguru=0.7.2=py311h38be061_2\n  - lz4-c=1.9.4=hcb278e6_0\n  - lzo=2.10=hd590300_1001\n  - markupsafe=3.0.2=py311h2dc5d0c_1\n  - mesa-libgl-cos7-x86_64=18.3.4=ha675448_1106\n  - mesa-libglapi-cos7-x86_64=18.3.4=ha675448_1106\n  - mesalib=23.2.1=h6b56f8e_0\n  - metis=5.1.0=hd0bcaf9_1007\n  - mpfr=4.2.1=h90cbb55_3\n  - mpg123=1.32.9=hc50e24c_0\n  - msgpack-python=1.1.0=py311hd18a35c_0\n  - multidict=6.4.3=py311h2dc5d0c_0\n  - multiview=asp_3.5.0=py311_2\n  - mysql=8.0.33=h27aab58_2\n  - mysql-client=8.0.33=h545f5f4_2\n  - mysql-common=8.0.33=hf1915f5_2\n  - mysql-connector-c=6.1.11=h659d440_1008\n  - mysql-devel=8.0.33=hf1915f5_2\n  - mysql-libs=8.0.33=hca2cd23_2\n  - mysql-server=8.0.33=ha473b58_2\n  - nanoflann=1.6.1=hff21bea_0\n  - ncurses=6.5=h2d0b736_3\n  - nettle=3.9.1=h7ab15ed_0\n  - networkx=3.4.2=pyh267e887_2\n  - nlohmann_json=3.11.3=he02047a_1\n  - nn=1.86.0=hd590300_2003\n  - nspr=4.36=h5888daf_0\n  - nss=3.110=h159eef7_0\n  - numpy=1.26.4=py311h64a7726_0\n  - openblas=0.3.29=pthreads_h6ec200e_0\n  - opencv=4.7.0=py311h38be061_6\n  - openexr=2.5.5=h2bc3f7f_0\n  - openh264=2.3.1=hcb278e6_2\n  - openjpeg=2.5.0=hfec8fc6_2\n  - openssl=3.1.8=h7b32b05_0\n  - p11-kit=0.24.1=hc5aa10d_0\n  - pandas=2.2.3=py311h7db5c69_3\n  - pango=1.50.14=heaa33ce_1\n  - parallel=20250422=ha770c72_0\n  - pbzip2=1.1.13=h1fcc475_2\n  - pcl=1.13.1=hd129add_1\n  - pcre2=10.40=hc3806b6_0\n  - pdal=2.6.0_asp3.5.0=py311h3fd9d12_1\n  - perl=5.32.1=7_hd590300_perl5\n  - pip=25.0.1=pyh8b19718_0\n  - pixman=0.44.2=h29eaf8c_0\n  - plio=1.6.0=pyh12aca89_0\n  - poppler=23.08.0=hd18248d_0\n  - poppler-data=0.4.12=hd8ed1ab_0\n  - postgresql=15.4=h8972f4a_2\n  - proj=9.2.1=ha643af7_0\n  - propcache=0.3.1=py311h2dc5d0c_0\n  - protobuf=4.21.12=py311hcafe171_0\n  - pthread-stubs=0.4=hb9d3cd8_1002\n  - pugixml=1.13=h59595ed_1\n  - pulseaudio-client=16.1=hb77b528_5\n  - pvl=1.3.2=pyhd8ed1ab_1\n  - py-opencv=4.7.0=py311h781c19f_6\n  - pyproj=3.6.1=py311ha169711_0\n  - python=3.11.6=hab00c5b_0_cpython\n  - python-dateutil=2.9.0.post0=pyhff2d567_1\n  - python-tzdata=2025.2=pyhd8ed1ab_0\n  - python_abi=3.11=7_cp311\n  - pytz=2025.2=pyhd8ed1ab_0\n  - pyyaml=6.0.2=py311h2dc5d0c_2\n  - qhull=2020.2=h434a139_5\n  - qt-main=5.15.8=h7fe3ca9_15\n  - qwt=6.2.0=h1a478b3_6\n  - rapidjson=1.1.0.post20240409=h3f2d84a_2\n  - rclone=1.69.1=hdac43c8_0\n  - readline=8.2=h8c095d6_2\n  - rhash=1.4.5=hb9d3cd8_0\n  - rocksdb=8.5.3=h699acb7_1\n  - s2n=1.3.54=h06160fa_0\n  - s2p-subset=asp3.5.0=h3fd9d12_0\n  - scipy=1.15.2=py311h8f841c2_0\n  - setuptools=79.0.0=pyhff2d567_0\n  - six=1.17.0=pyhd8ed1ab_0\n  - snappy=1.2.1=h8bd8927_1\n  - spiceypy=6.0.0=pyhd8ed1ab_2\n  - sqlalchemy=2.0.40=py311h9ecbd09_0\n  - sqlite=3.49.1=h9eae976_2\n  - stereo-pipeline=3.5.0=2\n  - suitesparse=5.10.1=h5a4f163_3\n  - superlu=5.2.2=h00795ac_0\n  - svt-av1=1.7.0=h59595ed_0\n  - sysroot_linux-64=2.17=h0157908_18\n  - tbb=2021.11.0=h00ab1b0_1\n  - tbb-devel=2021.11.0=h5ccd973_1\n  - tiledb=2.16.3=hf0b6e87_3\n  - tk=8.6.13=noxft_h4845f30_101\n  - tnt=126=0\n  - typing-extensions=4.13.2=h0e9735f_0\n  - typing_extensions=4.13.2=pyh29332c3_0\n  - tzcode=2025b=hb9d3cd8_0\n  - tzdata=2025b=h78e105d_0\n  - uriparser=0.9.8=hac33072_0\n  - usgscsm=2.0.2=h8e3e32c_3\n  - utfcpp=4.0.6=h005c6e1_0\n  - visionworkbench=asp3.5.0=0\n  - vlfeat=0.9.21=hd590300_1\n  - vtk=9.2.6=qt_py311h1234567_210\n  - vtk-base=9.2.6=qt_py311h1234567_210\n  - vtk-io-ffmpeg=9.2.6=qt_py311h1234567_210\n  - wheel=0.45.1=pyhd8ed1ab_1\n  - wslink=2.3.3=pyhd8ed1ab_0\n  - x264=1!164.3095=h166bdaf_2\n  - x265=3.5=h924138e_3\n  - xcb-util=0.4.0=hd590300_1\n  - xcb-util-image=0.4.0=h8ee46fc_1\n  - xcb-util-keysyms=0.4.0=h8ee46fc_1\n  - xcb-util-renderutil=0.3.9=hd590300_1\n  - xcb-util-wm=0.4.1=h8ee46fc_1\n  - xerces-c=3.2.4=h8d71039_2\n  - xkeyboard-config=2.42=h4ab18f5_0\n  - xorg-damageproto=1.2.1=hb9d3cd8_1003\n  - xorg-fixesproto=5.0=hb9d3cd8_1003\n  - xorg-glproto=1.4.17=hb9d3cd8_1003\n  - xorg-inputproto=2.3.2=hb9d3cd8_1003\n  - xorg-kbproto=1.0.7=hb9d3cd8_1003\n  - xorg-libice=1.1.2=hb9d3cd8_0\n  - xorg-libsm=1.2.6=he73a12e_0\n  - xorg-libx11=1.8.9=h8ee46fc_0\n  - xorg-libxau=1.0.12=hb9d3cd8_0\n  - xorg-libxdamage=1.1.5=h7f98852_1\n  - xorg-libxdmcp=1.1.5=hb9d3cd8_0\n  - xorg-libxext=1.3.4=h0b41bf4_2\n  - xorg-libxfixes=5.0.3=h7f98852_1004\n  - xorg-libxi=1.7.10=h4bc722e_1\n  - xorg-libxmu=1.1.3=h4ab18f5_1\n  - xorg-libxrandr=1.5.2=h7f98852_1\n  - xorg-libxrender=0.9.11=hd590300_0\n  - xorg-libxt=1.3.0=hd590300_1\n  - xorg-randrproto=1.5.0=hb9d3cd8_1002\n  - xorg-renderproto=0.11.1=hb9d3cd8_1003\n  - xorg-util-macros=1.20.2=hb9d3cd8_0\n  - xorg-xextproto=7.3.0=hb9d3cd8_1004\n  - xorg-xf86vidmodeproto=2.3.1=hb9d3cd8_1005\n  - xorg-xproto=7.0.31=hb9d3cd8_1008\n  - xz=5.8.1=hbcc6ac9_0\n  - xz-gpl-tools=5.8.1=hbcc6ac9_0\n  - xz-tools=5.8.1=hb9d3cd8_0\n  - yaml=0.2.5=h7f98852_2\n  - yarl=1.20.0=py311h2dc5d0c_0\n  - zlib=1.3.1=hb9d3cd8_2\n  - zstd=1.5.7=hb8e6e7a_2\n\n"
  },
  {
    "path": "conda/asp_3.5.0_osx_x64_env.yaml",
    "content": "name: asp_deps\nchannels:\n  - nasa-ames-stereo-pipeline\n  - usgs-astrogeology\n  - conda-forge\n  - https://repo.anaconda.com/pkgs/main\n  - https://repo.anaconda.com/pkgs/r\ndependencies:\n  - affine=2.4.0=pyhd8ed1ab_1\n  - aiohappyeyeballs=2.6.1=pyhd8ed1ab_0\n  - aiohttp=3.11.18=py310h8e2f543_0\n  - aiosignal=1.3.2=pyhd8ed1ab_0\n  - ale=0.10.0=py310hf166250_3\n  - aom=3.7.1=h93d8f39_0\n  - armadillo=14.0.2=hae35012_0\n  - arpack=3.9.1=nompi_hdfe9103_102\n  - async-timeout=5.0.1=pyhd8ed1ab_1\n  - atk-1.0=2.38.0=h1d18e73_1\n  - attrs=25.3.0=pyh71513ae_0\n  - aws-c-auth=0.7.4=hbe6ead2_2\n  - aws-c-cal=0.6.2=hfc10710_2\n  - aws-c-common=0.9.3=h0dc2134_0\n  - aws-c-compression=0.2.17=hd41bdd4_3\n  - aws-c-event-stream=0.3.2=he52df9d_2\n  - aws-c-http=0.7.13=hb43ddd7_2\n  - aws-c-io=0.13.33=h2566903_0\n  - aws-c-mqtt=0.9.7=h6b10715_0\n  - aws-c-s3=0.3.17=h5800b94_4\n  - aws-c-sdkutils=0.1.12=hd41bdd4_2\n  - aws-checksums=0.1.17=hd41bdd4_2\n  - aws-crt-cpp=0.24.2=hf47b73b_2\n  - aws-sdk-cpp=1.10.57=h98cd3c2_24\n  - blas=2.131=openblas\n  - blas-devel=3.9.0=31_hbf4f893_openblas\n  - blosc=1.21.6=h7d75f6d_0\n  - boost=1.78.0=py310h92ebccd_5\n  - boost-cpp=1.78.0=hf5ba120_3\n  - bullet=2.86.1=0\n  - bz2file=0.98=py_0\n  - bzip2=1.0.8=hfdf4475_7\n  - c-ares=1.34.5=hf13058a_0\n  - ca-certificates=2025.4.26=hbd8a1cb_0\n  - cached-property=1.5.2=hd8ed1ab_1\n  - cached_property=1.5.2=pyha770c72_1\n  - cairo=1.16.0=h09dd18c_1016\n  - ceres-solver=2.2.0=haa0d064_2\n  - certifi=2025.1.31=pyhd8ed1ab_0\n  - cfitsio=4.3.0=h66f91ea_0\n  - clang=16.0.6=default_h420b035_14\n  - clang-16=16.0.6=default_he1224e2_14\n  - clangxx=16.0.6=default_h2725d3a_14\n  - cmake=3.27.9=hc7ee4c4_0\n  - csm=3.0.3.3=h3718637_1\n  - cspice=67=h6e16a3a_8\n  - curl=8.4.0=h726d00d_0\n  - dav1d=1.2.1=h0dc2134_0\n  - double-conversion=3.3.1=h240833e_0\n  - eigen=3.4.0=h1c7c39f_0\n  - embree=3.13.0=hb7b477c_1\n  - expat=2.5.0=hf0c8a7f_1\n  - ffmpeg=6.1.0=gpl_h9a4e613_101\n  - fftw=3.3.10=nompi_h292e606_110\n  - fgr=asp3.5.0=1\n  - flann=1.9.1=hebd20f1_1013\n  - font-ttf-dejavu-sans-mono=2.37=hab24e00_0\n  - font-ttf-inconsolata=3.000=h77eed37_0\n  - font-ttf-source-code-pro=2.038=h77eed37_0\n  - font-ttf-ubuntu=0.83=h77eed37_3\n  - fontconfig=2.14.2=h5bb23bf_0\n  - fonts-conda-ecosystem=1=0\n  - fonts-conda-forge=1=0\n  - freetype=2.13.3=h694c41f_1\n  - freexl=1.0.6=hb7f2c08_1\n  - fribidi=1.0.10=hbcb3906_0\n  - frozenlist=1.5.0=py310h8e2f543_1\n  - gdk-pixbuf=2.42.10=hff535ac_2\n  - geoid=asp3.5.0=6\n  - geos=3.12.0=he965462_0\n  - geotiff=1.7.1=h5cf5d3c_11\n  - gettext=0.23.1=hd385c8e_0\n  - gettext-tools=0.23.1=h27064b9_0\n  - gflags=2.2.2=hac325c4_1005\n  - giflib=5.2.2=h10d778d_0\n  - gl2ps=1.4.2=hd82a5f3_1\n  - glew=2.1.0=h046ec9c_2\n  - glib=2.78.1=hf4d7fad_0\n  - glib-tools=2.78.1=hf4d7fad_0\n  - glog=0.7.1=h2790a97_0\n  - gmp=6.3.0=hf036a51_2\n  - gnutls=3.7.9=h1951705_0\n  - graphite2=1.3.13=h73e2aa4_1003\n  - graphviz=8.1.0=hc7f41f9_0\n  - greenlet=3.2.1=py310h6954a95_0\n  - gsl=2.6=h71c5fe9_2\n  - gst-plugins-base=1.22.7=hd283e88_0\n  - gstreamer=1.22.7=h8954545_0\n  - gtk2=2.24.33=h7c1209e_2\n  - gts=0.7.6=h53e17e3_4\n  - h5py=3.9.0=nompi_py310h164cd36_101\n  - harfbuzz=7.3.0=h413ba03_0\n  - hdf4=4.2.15=h9804679_6\n  - hdf5=1.14.1=nompi_hedada53_100\n  - icu=72.1=h7336db1_0\n  - idna=3.10=pyhd8ed1ab_1\n  - ilmbase=2.5.5=h01edc0c_1\n  - inja=3.3.0=he49afe7_0\n  - isis=8.3.0=0\n  - jama=125=0\n  - jasper=4.0.0=h794afb9_1\n  - jinja2=3.1.6=pyhd8ed1ab_0\n  - json-c=0.17=h6253ea5_1\n  - jsoncpp=1.9.5=h940c156_1\n  - kakadu=1=0\n  - kalasiris=1.11.0=pyhd8ed1ab_1\n  - kealib=1.5.1=h7014c1b_4\n  - krb5=1.21.2=hb884880_0\n  - lame=3.100=hb7f2c08_1003\n  - lcms2=2.15=h2dcdeff_1\n  - lerc=4.0.0=hcca01a6_1\n  - libabseil=20230125.3=cxx17_h000cb23_0\n  - libaec=1.1.3=h73e2aa4_0\n  - libarchive=3.6.2=h0b5dc4a_1\n  - libasprintf=0.23.1=h27064b9_0\n  - libasprintf-devel=0.23.1=h27064b9_0\n  - libass=0.17.1=h66d2fa1_0\n  - libblas=3.9.0=31_h7f60823_openblas\n  - libcblas=3.9.0=31_hff6cab4_openblas\n  - libclang=15.0.7=default_h7151d67_5\n  - libclang-cpp16=16.0.6=default_he1224e2_14\n  - libclang13=15.0.7=default_h0edc4dd_5\n  - libcurl=8.4.0=h726d00d_0\n  - libcxx=20.1.3=hf95d169_0\n  - libcxx-devel=16.0.6=h8f8a49f_2\n  - libdeflate=1.18=hac1461d_0\n  - libedit=3.1.20250104=pl5321ha958ccf_0\n  - libelas=asp3.5.0=h01edc0c_0\n  - libev=4.33=h10d778d_2\n  - libexpat=2.5.0=hf0c8a7f_1\n  - libffi=3.4.6=h281671d_1\n  - libfreetype=2.13.3=h694c41f_1\n  - libfreetype6=2.13.3=h40dfd5c_1\n  - libgd=2.3.3=h3d994df_6\n  - libgdal=3.7.1=h4103fcf_6\n  - libgettextpo=0.23.1=h27064b9_0\n  - libgettextpo-devel=0.23.1=h27064b9_0\n  - libgfortran=14.2.0=hef36b68_105\n  - libgfortran5=14.2.0=h58528f3_105\n  - libglib=2.78.1=h6d9ecee_0\n  - libhwloc=2.9.3=default_h24e0189_1009\n  - libiconv=1.18=h4b5e92a_1\n  - libidn2=2.3.8=he8ff88c_0\n  - libintl=0.23.1=h27064b9_0\n  - libintl-devel=0.23.1=h27064b9_0\n  - libjemalloc=5.3.0=hac325c4_1\n  - libjpeg-turbo=2.1.5.1=h0dc2134_1\n  - libkml=1.3.0=hab3ca0e_1016\n  - liblapack=3.9.0=31_h236ab99_openblas\n  - liblapacke=3.9.0=31_h85686d2_openblas\n  - libllvm15=15.0.7=he4b1e75_3\n  - libllvm16=16.0.6=he4b1e75_2\n  - libltdl=2.4.3a=h240833e_0\n  - liblzma=5.8.1=hd471939_0\n  - liblzma-devel=5.8.1=hd471939_0\n  - libnabo=asp3.5.0=h01edc0c_1\n  - libnetcdf=4.9.2=nompi_hb79a6a3_109\n  - libnghttp2=1.58.0=h64cf6d3_0\n  - libogg=1.3.5=hfdf4475_0\n  - libopenblas=0.3.29=openmp_hbf64a52_0\n  - libopencv=4.7.0=py310h12e1fec_6\n  - libopus=1.5.2=he3325bb_0\n  - libpng=1.6.47=h3c4a55f_0\n  - libpointmatcher=asp3.5.0=ha5a8b8e_1\n  - libpq=15.4=h3df487d_2\n  - libprotobuf=4.23.3=h5feb325_1\n  - librsvg=2.56.3=hec3db73_0\n  - librttopo=1.1.0=h23f359d_14\n  - libspatialite=5.0.1=h8e1b34b_28\n  - libsqlite=3.49.1=hdb6dae5_2\n  - libssh2=1.11.0=hd019ec5_0\n  - libtasn1=4.20.0=h6e16a3a_0\n  - libtheora=1.1.1=hfdf4475_1006\n  - libtiff=4.5.1=hf955e92_1\n  - libtool=2.5.4=h240833e_0\n  - libunistring=0.9.10=h0d85af4_0\n  - libuv=1.50.0=h4cb831e_0\n  - libvorbis=1.3.7=h046ec9c_0\n  - libvpx=1.13.1=he965462_0\n  - libwebp=1.3.1=hc961f54_0\n  - libwebp-base=1.3.1=h0dc2134_0\n  - libxcb=1.15=hb7f2c08_0\n  - libxml2=2.11.5=hd95e348_0\n  - libzip=1.10.1=hc158999_3\n  - libzlib=1.3.1=hd23fc13_2\n  - llvm-openmp=20.1.3=ha54dae1_0\n  - loguru=0.7.2=py310h2ec42d9_2\n  - lz4-c=1.9.4=hf0c8a7f_0\n  - lzo=2.10=h10d778d_1001\n  - markupsafe=3.0.2=py310h8e2f543_1\n  - mesalib=24.0.2=hbd9e708_1\n  - metis=5.1.0=h3023b02_1007\n  - mpfr=4.2.1=haed47dc_3\n  - msgpack-python=1.1.0=py310hfa8da69_0\n  - multidict=6.4.3=py310hf0d9222_0\n  - multiview=asp_3.5.0=py310_0\n  - mysql=5.7.20=h0a44026_1001\n  - mysql-common=8.0.33=h1d20c9b_6\n  - mysql-connector-c=6.1.11=h89ed7f3_1008\n  - mysql-libs=8.0.33=hed35180_6\n  - nanoflann=1.6.1=h429ed02_0\n  - ncurses=6.5=h0622a9a_3\n  - nettle=3.9.1=h8e11ae5_0\n  - networkx=3.4.2=pyh267e887_2\n  - nlohmann_json=3.11.3=hf036a51_1\n  - nn=1.86.0=h0dc2134_2003\n  - nspr=4.36=h97d8b74_0\n  - nss=3.110=h32a8879_0\n  - numpy=1.26.4=py310h4bfa8fc_0\n  - openblas=0.3.29=openmp_h30af337_0\n  - opencv=4.7.0=py310h2ec42d9_6\n  - openexr=2.5.5=ha5a8b8e_0\n  - openh264=2.3.1=hf0c8a7f_2\n  - openjpeg=2.5.0=h13ac156_2\n  - openssl=3.1.8=hc426f3f_0\n  - p11-kit=0.24.1=h65f8906_0\n  - pandas=2.2.3=py310h96a9d13_3\n  - pango=1.50.14=hbce5e75_1\n  - parallel=20250422=h694c41f_0\n  - pbzip2=1.1.13=h92b232e_2\n  - pcl=1.13.1=h3e6cc95_1\n  - pcre2=10.40=h1c4e4bc_0\n  - pdal=2.6.0_asp3.5.0=py310hfc30dc6_0\n  - perl=5.32.1=7_h10d778d_perl5\n  - pip=25.0.1=pyh8b19718_0\n  - pixman=0.44.2=h1fd1274_0\n  - plio=1.6.0=pyh12aca89_0\n  - poppler=23.08.0=he041c3a_0\n  - poppler-data=0.4.12=hd8ed1ab_0\n  - postgresql=15.4=hc940a54_2\n  - proj=9.2.1=hc8d59c9_0\n  - propcache=0.3.1=py310h8e2f543_0\n  - protobuf=4.23.3=py310h4e8a696_0\n  - pthread-stubs=0.4=h00291cd_1002\n  - pugixml=1.13=he965462_1\n  - pvl=1.3.2=pyhd8ed1ab_1\n  - py-opencv=4.7.0=py310ha188af9_6\n  - pyproj=3.6.1=py310hfcc5317_0\n  - python=3.10.13=h00d2728_0_cpython\n  - python-dateutil=2.9.0.post0=pyhff2d567_1\n  - python-tzdata=2025.2=pyhd8ed1ab_0\n  - python_abi=3.10=7_cp310\n  - pytz=2025.2=pyhd8ed1ab_0\n  - pyyaml=6.0.2=py310h8e2f543_2\n  - qhull=2020.2=h3c5361c_5\n  - qt-main=5.15.8=heb9da5c_15\n  - qwt=6.2.0=hed3eaa1_6\n  - rapidjson=1.1.0.post20240409=h92383a6_2\n  - rclone=1.69.1=hdbe1cec_0\n  - readline=8.2=h7cca4af_2\n  - rhash=1.4.5=ha44c9a9_0\n  - rocksdb=8.5.3=hcf0db61_1\n  - s2p-subset=asp3.5.0=h01edc0c_0\n  - scipy=1.15.2=py310hef62574_0\n  - setuptools=79.0.0=pyhff2d567_0\n  - six=1.17.0=pyhd8ed1ab_0\n  - snappy=1.2.1=haf3c120_1\n  - spiceypy=6.0.0=pyhd8ed1ab_2\n  - sqlalchemy=2.0.40=py310hbb8c376_0\n  - sqlite=3.49.1=h2e4c9dc_2\n  - stereo-pipeline=3.5.0=2\n  - suitesparse=5.10.1=h4bf45ed_3\n  - superlu=5.2.2=h1f0f902_0\n  - svt-av1=1.7.0=he965462_0\n  - tbb=2021.11.0=h7728843_1\n  - tbb-devel=2021.11.0=ha56d2d7_1\n  - tiledb=2.16.3=h9b026fb_3\n  - tk=8.6.13=h1abcd95_1\n  - tnt=126=0\n  - typing-extensions=4.13.2=h0e9735f_0\n  - typing_extensions=4.13.2=pyh29332c3_0\n  - tzcode=2025b=h6e16a3a_0\n  - tzdata=2025b=h78e105d_0\n  - uriparser=0.9.8=h6aefe2f_0\n  - usgscsm=2.0.2=h9275861_3\n  - utfcpp=4.0.6=h93fb1c9_0\n  - visionworkbench=asp3.5.0=2\n  - vlfeat=0.9.21=h0dc2134_1\n  - vtk=9.2.6=qt_py310h1234567_210\n  - vtk-base=9.2.6=qt_py310h1234567_210\n  - vtk-io-ffmpeg=9.2.6=qt_py310h1234567_210\n  - wheel=0.45.1=pyhd8ed1ab_1\n  - wslink=2.3.3=pyhd8ed1ab_0\n  - x264=1!164.3095=h775f41a_2\n  - x265=3.5=hbb4e6a2_3\n  - xerces-c=3.2.4=h90c7484_2\n  - xorg-damageproto=1.2.1=h00291cd_1003\n  - xorg-fixesproto=5.0=h00291cd_1003\n  - xorg-glproto=1.4.17=h00291cd_1003\n  - xorg-inputproto=2.3.2=h00291cd_1003\n  - xorg-kbproto=1.0.7=h00291cd_1003\n  - xorg-libice=1.1.2=h6e16a3a_0\n  - xorg-libsm=1.2.6=h6e16a3a_0\n  - xorg-libx11=1.8.9=hc955faf_0\n  - xorg-libxau=1.0.12=h6e16a3a_0\n  - xorg-libxdamage=1.1.5=h0d85af4_1\n  - xorg-libxdmcp=1.1.5=h00291cd_0\n  - xorg-libxext=1.3.4=hb7f2c08_2\n  - xorg-libxfixes=5.0.3=h0d85af4_1004\n  - xorg-libxi=1.7.10=hfdf4475_1\n  - xorg-libxrandr=1.5.2=h0d85af4_1\n  - xorg-libxrender=0.9.11=h0dc2134_0\n  - xorg-randrproto=1.5.0=h00291cd_1002\n  - xorg-renderproto=0.11.1=h00291cd_1003\n  - xorg-util-macros=1.20.2=h6e16a3a_0\n  - xorg-xextproto=7.3.0=h00291cd_1004\n  - xorg-xf86vidmodeproto=2.3.1=h00291cd_1005\n  - xorg-xproto=7.0.31=h00291cd_1008\n  - xz=5.8.1=h357f2ed_0\n  - xz-gpl-tools=5.8.1=h357f2ed_0\n  - xz-tools=5.8.1=hd471939_0\n  - yaml=0.2.5=h0d85af4_2\n  - yarl=1.20.0=py310h8e2f543_0\n  - zlib=1.3.1=hd23fc13_2\n  - zstd=1.5.7=h8210216_2\n\n"
  },
  {
    "path": "conda/asp_deps_2.7.0_linux_env.yaml",
    "content": "name: asp_deps\nchannels:\n  - nasa-ames-stereo-pipeline\n  - usgs-astrogeology\n  - conda-forge\n  - defaults\ndependencies:\n  - _libgcc_mutex=0.1=conda_forge\n  - _openmp_mutex=4.5=0_gnu\n  - _sysroot_linux-64_curr_repodata_hack=3=ha9d2b57_10\n  - alabaster=0.7.12=py_0\n  - ale=0.7.2=py36h9e03d57_1\n  - anaconda-client=1.7.2=py_0\n  - armadillo=9.200.7=hf4e8f56_0\n  - arpack=3.7.0=hc6cf775_1\n  - asn1crypto=1.4.0=pyh9f0ad1d_0\n  - attrs=20.2.0=pyh9f0ad1d_0\n  - babel=2.8.0=py_0\n  - beautifulsoup4=4.9.2=py_0\n  - binutils_impl_linux-64=2.35=h18a2f87_9\n  - binutils_linux-64=2.35=heab0d09_28\n  - blas=1.1=openblas\n  - boost=1.68.0=py36h8619c78_1001\n  - boost-cpp=1.68.0=h11c811c_1000\n  - brotlipy=0.7.0=py36h8c4c3a4_1000\n  - bullet=2.86.1=0\n  - bz2file=0.98=py_0\n  - bzip2=1.0.8=h516909a_2\n  - ca-certificates=2020.6.20=hecda079_0\n  - cairo=1.14.6=4\n  - ceres-solver=1.14.0=h0948850_10\n  - certifi=2020.6.20=py36h9f0ad1d_0\n  - cffi=1.14.3=py36h0ff685e_0\n  - chardet=3.0.4=py36h9f0ad1d_1007\n  - chrpath=0.16=h14c3975_1001\n  - click=7.1.2=pyh9f0ad1d_0\n  - clyent=1.2.2=py_1\n  - cmake=3.16.0=hf94ab9c_0\n  - conda=4.8.3=py36h9f0ad1d_1\n  - conda-build=3.19.2=py36h9f0ad1d_2\n  - conda-package-handling=1.7.0=py36h8c4c3a4_5\n  - conda-verify=3.1.1=py36h9f0ad1d_1001\n  - cryptography=2.5=py36hb7f436b_1\n  - csm=v3.0.3.1=h6bb024c_1001\n  - cspice=66=h516909a_1009\n  - curl=7.64.0=h646f8bb_0\n  - dbus=1.13.0=h4e0c4b3_1000\n  - decorator=4.4.2=py_0\n  - docutils=0.16=py36h9f0ad1d_1\n  - eigen=3.3.7=hc9558a2_1001\n  - embree=2.16.0=0\n  - expat=2.2.9=he1b5a44_2\n  - ffmpeg=3.4.1=0\n  - fgr=e78ce15=hf484d3e_0\n  - filelock=3.0.12=pyh9f0ad1d_0\n  - flann=1.9.1=0\n  - fontconfig=2.12.1=4\n  - freetype=2.7=1\n  - future=0.18.2=py36h9f0ad1d_1\n  - gcc_impl_linux-64=7.5.0=hdb87b24_16\n  - gcc_linux-64=7.5.0=hf34d7eb_28\n  - gdal=2.0.2=hf484d3e_0\n  - geoid=1.0=1\n  - geos=3.7.3=he1b5a44_0\n  - geotiff=1.4.2=hb54a4aa_1\n  - gettext=0.19.8.1=hc5be6a0_1002\n  - gflags=2.2.2=he1b5a44_1002\n  - gfortran_impl_linux-64=7.5.0=h1104b78_16\n  - gfortran_linux-64=7.5.0=ha781d05_28\n  - giflib=5.2.1=h516909a_2\n  - git=2.20.1=pl526hc122a05_1001\n  - glib=2.51.4=0\n  - glob2=0.7=py_0\n  - glog=0.4.0=h49b9bf7_3\n  - gmm=5.0=0\n  - gmp=6.2.0=he1b5a44_2\n  - gsl=2.6=h294904e_0\n  - gst-plugins-base=1.8.0=0\n  - gstreamer=1.8.0=2\n  - gxx_impl_linux-64=7.5.0=h1104b78_16\n  - gxx_linux-64=7.5.0=ha781d05_28\n  - harfbuzz=1.3.4=2\n  - hdf5=1.8.18=3\n  - htdp=1.0=1\n  - icu=58.2=hf484d3e_1000\n  - idna=2.10=pyh9f0ad1d_0\n  - ilmbase=2.5.2=h8b12597_0\n  - imagemagick=6.8.6_10=hf484d3e_0\n  - imagesize=1.2.0=py_0\n  - importlib-metadata=2.0.0=py36h9f0ad1d_0\n  - importlib_metadata=2.0.0=0\n  - ipython_genutils=0.2.0=py_1\n  - isis=4.1.0=0\n  - isis-headers=4.1.0=1000\n  - jama=125=0\n  - jasper=1.900.1=4\n  - jinja2=2.11.2=pyh9f0ad1d_0\n  - jpeg=9b=h024ee3a_2\n  - jsonschema=3.2.0=py36h9f0ad1d_1\n  - jupyter_core=4.6.3=py36h9f0ad1d_1\n  - kakadu=1=0\n  - kernel-headers_linux-64=3.10.0=h77966d4_10\n  - krb5=1.16.3=hc83ff2d_1000\n  - laszip=2.1.0=hf484d3e_1\n  - latexcodec=2.0.1=pyh9f0ad1d_0\n  - ld_impl_linux-64=2.35=h769bd43_9\n  - libarchive=3.3.3=ha149a29_1000\n  - libblas=3.8.0=11_openblas\n  - libcblas=3.8.0=11_openblas\n  - libcurl=7.64.0=h01ee5af_0\n  - libedit=3.1.20191231=h46ee950_0\n  - libffi=3.2.1=he1b5a44_1007\n  - libgcc=7.2.0=h69d50b8_2\n  - libgcc-devel_linux-64=7.5.0=h42c25f5_16\n  - libgcc-ng=9.2.0=h24d8f2e_2\n  - libgfortran=3.0.0=1\n  - libgfortran-ng=7.5.0\n  - libglvnd-cos7-x86_64=1.0.1=h9d98e8f_1104\n  - libglvnd-glx-cos7-x86_64=1.0.1=h9d98e8f_1104\n  - libgomp=9.2.0=h24d8f2e_2\n  - libiconv=1.15=h516909a_1006\n  - liblapack=3.8.0=11_openblas\n  - liblas=1.8.1=hf484d3e_1000\n  - liblief=0.10.1=he1b5a44_1\n  - libnabo=2df86e0=hf484d3e_0\n  - libopenblas=0.3.6=h5a2b251_2\n  - libpng=1.6.37=hed695b0_1\n  - libpointmatcher=bcf4b04=hf484d3e_0\n  - libpq=10.6=h13b8bad_1000\n  - libprotobuf=3.9.1=h8b12597_0\n  - libssh2=1.8.0=h1ad7b7a_1003\n  - libstdcxx-devel_linux-64=7.5.0=h4084dd6_16\n  - libstdcxx-ng=9.2.0=hdf63c60_2\n  - libtiff=4.0.9=he6b73bb_1\n  - libuuid=2.32.1=h14c3975_1000\n  - libuv=1.40.0=h516909a_0\n  - libwebp=0.5.2=7\n  - libxcb=1.13=h14c3975_1002\n  - libxml2=2.9.9=h13577e0_2\n  - llvm-openmp=8.0.1=hc9558a2_0\n  - markupsafe=1.1.1=py36h8c4c3a4_1\n  - mesalib=18.3.1=h590aaf7_0\n  - metis=5.1.0=he1b5a44_1005\n  - mysql=5.7.20=hf484d3e_1001\n  - mysql-connector-c=6.1.11=hab6429c_1002\n  - nanoflann=1.3.1=0\n  - nbformat=5.0.7=py_0\n  - ncurses=6.1=hf484d3e_1002\n  - networkx=2.4=py_1\n  - nlohmann_json=3.7.3=he1b5a44_1\n  - nn=1.86.0=h14c3975_2003\n  - numpy=1.13.3=py36_blas_openblas_200\n  - openblas=0.2.19=2\n  - opencv=3.2.0=np113py36_blas_openblas_203\n  - openexr=2.5.2=he513fc3_0\n  - openjpeg=2.1.0=6\n  - openmp=8.0.1=0\n  - openssl=1.0.2u=h516909a_0\n  - oset=0.1.3=py_1\n  - packaging=20.4=pyh9f0ad1d_0\n  - parallel=20200522=0\n  - patchelf=0.11=he1b5a44_0\n  - pbzip2=1.1.13=0\n  - pcl=1.9.1=h482114b_1002\n  - pcre=8.44=he1b5a44_0\n  - perl=5.26.2=h516909a_1006\n  - pip=20.1.1=py_1\n  - pixman=0.34.0=h14c3975_1003\n  - pkginfo=1.5.0.1=py_0\n  - postgresql=10.6=h66cca7a_1000\n  - proj4=4.9.3=h516909a_9\n  - protobuf=3.9.1=py36he1b5a44_0\n  - psutil=5.7.2=py36h8c4c3a4_0\n  - pthread-stubs=0.4=h14c3975_1001\n  - pvl=0.3.0=py_1\n  - py-lief=0.10.1=py36h831f99a_1\n  - pybtex=0.22.2=py36h9f0ad1d_1\n  - pybtex-docutils=0.2.2=py36h9f0ad1d_1\n  - pycosat=0.6.3=py36h8c4c3a4_1004\n  - pycparser=2.20=pyh9f0ad1d_2\n  - pygments=2.7.1=py_0\n  - pyopenssl=19.0.0=py36_0\n  - pyparsing=2.4.7=pyh9f0ad1d_0\n  - pyrsistent=0.17.3=py36h8c4c3a4_0\n  - pysocks=1.7.1=py36h9f0ad1d_1\n  - python=3.6.7=hd21baee_1002\n  - python-dateutil=2.8.1=py_0\n  - python-libarchive-c=2.9=py36h9f0ad1d_1\n  - python_abi=3.6=1_cp36m\n  - pytz=2020.1=pyh9f0ad1d_0\n  - pyyaml=5.3.1=py36h8c4c3a4_0\n  - qhull=7.2.0=0\n  - qt=5.9.6=0\n  - qwt=6.1.3=0\n  - readline=7.0=hf8c457e_1001\n  - requests=2.24.0=pyh9f0ad1d_0\n  - rhash=1.3.6=h14c3975_1001\n  - ripgrep=12.1.1=h516909a_0\n  - ruamel_yaml=0.15.80=py36h8c4c3a4_1002\n  - scipy=1.2.1=py36h09a28d5_1\n  - setuptools=47.3.1=py36h9f0ad1d_0\n  - six=1.15.0=pyh9f0ad1d_0\n  - snowballstemmer=2.0.0=py_0\n  - soupsieve=2.0.1=py_1\n  - sphinx=3.1.1=py_0\n  - sphinxcontrib-applehelp=1.0.2=py_0\n  - sphinxcontrib-bibtex=1.0.0=py_0\n  - sphinxcontrib-devhelp=1.0.2=py_0\n  - sphinxcontrib-htmlhelp=1.0.3=py_0\n  - sphinxcontrib-jsmath=1.0.1=py_0\n  - sphinxcontrib-qthelp=1.0.3=py_0\n  - sphinxcontrib-serializinghtml=1.1.4=py_0\n  - spiceypy=2.3.2=py_0\n  - sqlite=3.28.0=h8b20d00_0\n  - suitesparse=5.7.2=h717dc36_0\n  - superlu=5.2.1=hfe2efc7_1207\n  - sysroot_linux-64=2.17=h77966d4_10\n  - tbb=2020.1=hc9558a2_0\n  - theia=f5d93f5=hf484d3e_1001\n  - tk=8.6.10=hed695b0_0\n  - tnt=126=0\n  - tqdm=4.50.0=pyh9f0ad1d_0\n  - traitlets=4.3.3=py36h9f0ad1d_1\n  - tzcode=2020a=h516909a_0\n  - urllib3=1.25.10=py_0\n  - usgscsm=a53f9cf=h6bb024c_0\n  - wheel=0.34.2=py_1\n  - x264=20131218=0\n  - xerces-c=3.1.4=0\n  - xorg-fixesproto=5.0=h14c3975_1002\n  - xorg-inputproto=2.3.2=h14c3975_1002\n  - xorg-kbproto=1.0.7=h14c3975_1002\n  - xorg-libice=1.0.10=h516909a_0\n  - xorg-libsm=1.2.3=h84519dc_1000\n  - xorg-libx11=1.6.9=h516909a_0\n  - xorg-libxau=1.0.9=h14c3975_0\n  - xorg-libxdmcp=1.1.3=h516909a_0\n  - xorg-libxext=1.3.4=h516909a_0\n  - xorg-libxfixes=5.0.3=h516909a_1004\n  - xorg-libxi=1.7.10=h516909a_0\n  - xorg-libxrender=0.9.10=h516909a_1002\n  - xorg-renderproto=0.11.1=h14c3975_1002\n  - xorg-xextproto=7.3.0=h14c3975_1002\n  - xorg-xproto=7.0.31=h14c3975_1007\n  - xz=5.2.5=h516909a_0\n  - yaml=0.2.5=h516909a_0\n  - zipp=3.2.0=py_0\n  - zlib=1.2.11=h516909a_1006\n\n"
  },
  {
    "path": "conda/asp_deps_2.7.0_osx_env.yaml",
    "content": "name: asp_deps\nchannels:\n  - nasa-ames-stereo-pipeline\n  - usgs-astrogeology\n  - conda-forge\n  - defaults\ndependencies:\n  - alabaster=0.7.12=py_0\n  - ale=0.7.2=py36h855b5bd_1\n  - anaconda-client=1.7.2=py_0\n  - armadillo=9.200.4=hcb88e47_1205\n  - arpack=3.6.3=h06d5271_1005\n  - asn1crypto=1.3.0=py36h9f0ad1d_1\n  - attrs=19.3.0=py_0\n  - babel=2.8.0=py_0\n  - beautifulsoup4=4.9.1=py36h9f0ad1d_0\n  - blas=1.1=openblas\n  - boost=1.68.0=py36h9888f84_1001\n  - boost-cpp=1.68.0=h6f8c590_1000\n  - brotlipy=0.7.0=py36h37b9a7d_1000\n  - bullet=2.86.1=0\n  - bz2file=0.98=py_0\n  - bzip2=1.0.8=h0b31af3_2\n  - ca-certificates=2020.6.20=hecda079_0\n  - cairo=1.14.6=4\n  - ceres-solver=1.14.0=hb9d6bad_10\n  - certifi=2020.6.20=py36h9f0ad1d_0\n  - cffi=1.14.0=py36h356ff06_0\n  - chardet=3.0.4=py36h9f0ad1d_1006\n  - click=7.1.2=pyh9f0ad1d_0\n  - clyent=1.2.2=py_1\n  - cmake=3.14.5=hdd2e4aa_0\n  - conda=4.8.3=py36h9f0ad1d_1\n  - conda-build=3.19.2=py36h9f0ad1d_2\n  - conda-package-handling=1.6.0=py36h37b9a7d_2\n  - conda-verify=3.1.1=py36h9f0ad1d_1001\n  - cryptography=1.8.1=py36_0\n  - csm=v3.0.3.1=1001\n  - cspice=66=h0b31af3_1007\n  - curl=7.64.0=heae2a1f_0\n  - decorator=4.4.2=py_0\n  - docutils=0.16=py36h9f0ad1d_1\n  - eigen=3.3.7=ha1b3eb9_1001\n  - embree=2.16.0=h6834224_0\n  - expat=2.2.9=h4a8c4bd_2\n  - ffmpeg=3.4.1=0\n  - fgr=e78ce15=h0a44026_0\n  - filelock=3.0.12=pyh9f0ad1d_0\n  - flann=1.9.1=0\n  - fontconfig=2.12.1=4\n  - freetype=2.7=1\n  - future=0.18.2=py36h9f0ad1d_1\n  - gdal=2.0.2=h0a44026_0\n  - geoid=1.0=1\n  - geos=3.7.3=h4a8c4bd_0\n  - geotiff=1.4.2=hb54a4aa_1\n  - gettext=0.19.8.1=h46ab8bc_1002\n  - gflags=2.2.2=h4a8c4bd_1002\n  - giflib=5.2.1=h0b31af3_2\n  - git=2.11.1=0\n  - glib=2.51.4=0\n  - glob2=0.7=py_0\n  - glog=0.4.0=h700f914_3\n  - gmm=5.0=h6aef312_0\n  - gmp=6.2.0=h4a8c4bd_2\n  - gsl=2.6=ha2d443c_0\n  - harfbuzz=1.3.4=2\n  - hdf5=1.8.18=3\n  - htdp=1.0=1\n  - icu=58.2=h0a44026_1000\n  - idna=2.9=py_1\n  - ilmbase=2.5.2=hd174df1_0\n  - imagemagick=6.8.6_10=h0a44026_0\n  - imagesize=1.2.0=py_0\n  - importlib-metadata=1.6.1=py36h9f0ad1d_0\n  - importlib_metadata=1.6.1=0\n  - ipython_genutils=0.2.0=py_1\n  - isis=4.1.0=0\n  - isis-headers=4.1.0=1000\n  - jama=125=0\n  - jasper=1.900.1=4\n  - jinja2=2.11.2=pyh9f0ad1d_0\n  - jpeg=9b=he5867d9_2\n  - jsonschema=3.2.0=py36h9f0ad1d_1\n  - jupyter_core=4.6.3=py36h9f0ad1d_1\n  - kakadu=1=0\n  - krb5=1.16.3=h24a3359_1000\n  - laszip=2.1.0=h0a44026_1\n  - latexcodec=2.0.1=pyh9f0ad1d_0\n  - libarchive=3.3.3=hb60c381_1000\n  - libblas=3.8.0=11_openblas\n  - libcblas=3.8.0=11_openblas\n  - libcurl=7.64.0=h76de61e_0\n  - libcxx=10.0.0=1\n  - libedit=3.1.20191231=hed1e85f_0\n  - libffi=3.2.1=h4a8c4bd_1007\n  - libgcc=4.8.5=hdbeacc1_10\n  - libgfortran=3.0.1=0\n  - libiconv=1.15=h0b31af3_1006\n  - liblapack=3.8.0=11_openblas\n  - liblas=1.8.1=h0a44026_1000\n  - liblief=0.9.0=h3e78482_1\n  - libnabo=2df86e0=h0a44026_0\n  - libopenblas=0.3.6=hdc02c5d_2\n  - libpng=1.6.37=hbbe82c9_1\n  - libpointmatcher=bcf4b04=h0a44026_0\n  - libpq=10.6=hbe1e24e_1000\n  - libprotobuf=3.9.1=hfbae3c0_0\n  - libssh2=1.8.0=hf30b1f0_1003\n  - libtiff=4.0.9=he6b73bb_1\n  - libuv=1.38.0=h0b31af3_0\n  - libwebp=0.5.2=7\n  - libxcb=1.13=h1de35cc_1002\n  - libxml2=2.9.9=hd80cff7_2\n  - llvm-openmp=10.0.0=h28b9765_0\n  - markupsafe=1.1.1=py36h37b9a7d_1\n  - mesalib=18.0.0=hb6cfc13_1\n  - metis=5.1.0=h4a8c4bd_1005\n  - mysql=5.7.20=h0a44026_1001\n  - mysql-connector-c=6.1.11=had4e77e_1002\n  - nanoflann=1.3.1=0\n  - nbformat=5.0.6=py_0\n  - ncurses=6.1=h0a44026_1002\n  - networkx=2.4=py_1\n  - nlohmann_json=3.7.3=h4a8c4bd_1\n  - nn=1.86.0=h1de35cc_2003\n  - numpy=1.13.3=py36_blas_openblas_200\n  - openblas=0.2.19=2\n  - opencv=3.2.0=np113py36_blas_openblas_203\n  - openexr=2.5.2=h7475705_0\n  - openjpeg=2.1.0=6\n  - openssl=1.0.2u=h0b31af3_0\n  - oset=0.1.3=py_1\n  - packaging=20.4=pyh9f0ad1d_0\n  - parallel=20200522=0\n  - pbzip2=1.1.13=h9d27c22_1\n  - pcl=1.9.1=hdd77166_1002\n  - pcre=8.44=h4a8c4bd_0\n  - perl=5.26.2=haec8ef5_1006\n  - pip=20.1.1=py36_1\n  - pixman=0.34.0=h1de35cc_1003\n  - pkginfo=1.5.0.1=py_0\n  - postgresql=10.6=ha1bbaa7_1000\n  - proj4=4.9.3=h01d97ff_9\n  - protobuf=3.9.1=py36h6de7cb9_0\n  - psutil=5.7.0=py36h37b9a7d_1\n  - pthread-stubs=0.4=h1de35cc_1001\n  - pvl=0.3.0=py_1\n  - py-lief=0.9.0=py36h0ceac7d_1\n  - pybtex=0.22.2=py36h9f0ad1d_1\n  - pybtex-docutils=0.2.2=py36h9f0ad1d_1\n  - pycosat=0.6.3=py36h37b9a7d_1004\n  - pycparser=2.20=py_0\n  - pygments=2.6.1=py_0\n  - pyopenssl=17.0.0=py36_0\n  - pyparsing=2.4.7=pyh9f0ad1d_0\n  - pyrsistent=0.16.0=py36h37b9a7d_0\n  - pysocks=1.7.1=py36h9f0ad1d_1\n  - python=3.6.7=h4a56312_1002\n  - python-dateutil=2.8.1=py_0\n  - python-libarchive-c=2.9=py36_0\n  - python_abi=3.6=1_cp36m\n  - pytz=2020.1=pyh9f0ad1d_0\n  - pyyaml=5.3.1=py36h37b9a7d_0\n  - qhull=7.2.0=0\n  - qt=5.9.6=0\n  - qwt=6.1.3=0\n  - readline=7.0=hcfe32e1_1001\n  - requests=2.24.0=pyh9f0ad1d_0\n  - rhash=1.3.6=h1de35cc_1001\n  - ripgrep=12.1.1=h0b31af3_0\n  - ruamel_yaml=0.15.80=py36h37b9a7d_1001\n  - scipy=1.2.1=py36hbd7caa9_1\n  - setuptools=47.3.1=py36_0\n  - six=1.15.0=pyh9f0ad1d_0\n  - snowballstemmer=2.0.0=py_0\n  - soupsieve=2.0.1=py36h9f0ad1d_0\n  - sphinx=3.1.1=py_0\n  - sphinxcontrib-applehelp=1.0.2=py_0\n  - sphinxcontrib-bibtex=1.0.0=py_0\n  - sphinxcontrib-devhelp=1.0.2=py_0\n  - sphinxcontrib-htmlhelp=1.0.3=py_0\n  - sphinxcontrib-jsmath=1.0.1=py_0\n  - sphinxcontrib-qthelp=1.0.3=py_0\n  - sphinxcontrib-serializinghtml=1.1.4=py_0\n  - spiceypy=2.3.2=py_0\n  - sqlite=3.28.0=h9721f7c_0\n  - suitesparse=5.7.2=h0e59142_0\n  - superlu=5.2.1=hbced767_1205\n  - tbb=2019.9=ha1b3eb9_1\n  - theia=f5d93f5=h0a44026_1001\n  - tk=8.6.10=hb0a8c7a_0\n  - tnt=126=0\n  - tqdm=4.46.1=pyh9f0ad1d_0\n  - traitlets=4.3.3=py36h9f0ad1d_1\n  - tzcode=2020a=h0b31af3_0\n  - urllib3=1.25.9=py_0\n  - usgscsm=a53f9cf=h04f5b5a_0\n  - wget=1.18=0\n  - wheel=0.34.2=py36_0\n  - x264=20131218=0\n  - xerces-c=3.1.4=h10f7eb2_0\n  - xorg-fixesproto=5.0=h1de35cc_1002\n  - xorg-inputproto=2.3.2=h1de35cc_1002\n  - xorg-kbproto=1.0.7=h1de35cc_1002\n  - xorg-libice=1.0.10=h01d97ff_0\n  - xorg-libsm=1.2.3=h01d97ff_1000\n  - xorg-libx11=1.6.9=h0b31af3_0\n  - xorg-libxau=1.0.9=h1de35cc_0\n  - xorg-libxdmcp=1.1.3=h01d97ff_0\n  - xorg-libxext=1.3.4=h01d97ff_0\n  - xorg-libxfixes=5.0.3=h01d97ff_1004\n  - xorg-libxi=1.7.10=h01d97ff_0\n  - xorg-xextproto=7.3.0=h1de35cc_1002\n  - xorg-xproto=7.0.31=h1de35cc_1007\n  - xz=5.2.5=h1de35cc_0\n  - yaml=0.2.5=h0b31af3_0\n  - zipp=3.1.0=py_0\n  - zlib=1.2.11=h1de35cc_3\n\n"
  },
  {
    "path": "conda/asp_deps_3.0.0_linux_env.yaml",
    "content": "name: asp_deps\nchannels:\n  - nasa-ames-stereo-pipeline\n  - usgs-astrogeology\n  - conda-forge\n  - defaults\ndependencies:\n  - _libgcc_mutex=0.1=conda_forge\n  - _openmp_mutex=4.5=1_gnu\n  - _sysroot_linux-64_curr_repodata_hack=3=h5bd9786_12\n  - ale=0.8.5=py36h605e78d_3\n  - armadillo=9.900.5=h7c03176_0\n  - arpack=3.7.0=hc6cf775_2\n  - binutils_impl_linux-64=2.35.1=h27ae35d_9\n  - binutils_linux-64=2.35=h67ddf6f_30\n  - blas=1.1=openblas\n  - boost=1.68.0=py36h8619c78_1001\n  - boost-cpp=1.68.0=h11c811c_1000\n  - bullet=2.86.1=0\n  - bz2file=0.98=py_0\n  - bzip2=1.0.8=h7f98852_4\n  - ca-certificates=2021.5.30=ha878542_0\n  - cairo=1.14.6=4\n  - ceres-solver=1.14.0=h0948850_10\n  - certifi=2021.5.30=py36h5fab9bb_0\n  - chrpath=0.16=h7f98852_1002\n  - cmake=3.16.0=hf94ab9c_0\n  - csm=3.0.3.3=hc9558a2_0\n  - cspice=66=h7f98852_1014\n  - curl=7.64.0=h646f8bb_0\n  - dbus=1.13.0=h4e0c4b3_1000\n  - decorator=5.0.9=pyhd8ed1ab_0\n  - eigen=3.3.7=hc9558a2_1001\n  - embree=2.16.0=0\n  - expat=2.4.1=h9c3ff4c_0\n  - ffmpeg=3.4.1=0\n  - fftw=3.3.8=nompi_hfc0cae8_1114\n  - fgr=isis5.0.1\n  - flann=1.9.1=0\n  - fontconfig=2.12.1=4\n  - freetype=2.7=1\n  - gcc_impl_linux-64=7.5.0=habd7529_19\n  - gcc_linux-64=7.5.0=h47867f9_30\n  - geoid=1.0=1\n  - geos=3.7.3=he1b5a44_0\n  - geotiff=1.4.3=hb6868eb_1001\n  - gettext=0.19.8.1=hf34092f_1004\n  - gflags=2.2.2=he1b5a44_1004\n  - gfortran_impl_linux-64=7.5.0=h56cb351_19\n  - gfortran_linux-64=7.5.0=h78c8a43_30\n  - giflib=5.2.1=h36c2ea0_2\n  - git=2.14.2=2\n  - glib=2.51.4=0\n  - glog=0.4.0=h49b9bf7_3\n  - gmm=5.0=0\n  - gmp=6.2.1=h58526e2_0\n  - gsl=2.7=he838d99_0\n  - gst-plugins-base=1.8.0=0\n  - gstreamer=1.8.0=2\n  - gxx_impl_linux-64=7.5.0=hd0bb8aa_19\n  - gxx_linux-64=7.5.0=h555fc39_30\n  - harfbuzz=1.3.4=2\n  - hdf5=1.8.18=3\n  - htdp=1.0=1\n  - icu=58.2=hf484d3e_1000\n  - ilmbase=2.5.5=h780b84a_0\n  - imagemagick=isis5.0.1\n  - inja=3.3.0=h9c3ff4c_0\n  - isis=5.0.1=0\n  - jama=125=0\n  - jasper=1.900.1=h07fcdf6_1006\n  - jpeg=9d=h36c2ea0_0\n  - kakadu=1=0\n  - kernel-headers_linux-64=3.10.0=h4a8ded7_12\n  - krb5=1.16.3=hc83ff2d_1000\n  - laszip=2.1.0=hf484d3e_1\n  - ld_impl_linux-64=2.35.1=h7274673_9\n  - libblas=3.8.0=17_openblas\n  - libcblas=3.8.0=17_openblas\n  - libcurl=7.64.0=h01ee5af_0\n  - libedit=3.1.20191231=he28a2e2_2\n  - libelas=isis5.0.1\n  - libffi=3.2.1=he1b5a44_1007\n  - libgcc=7.2.0=h69d50b8_2\n  - libgcc-devel_linux-64=7.5.0=hda03d7c_19\n  - libgcc-ng=11.1.0=hc902ee8_8\n  - libgdal=2.4.1_isis5.0.1=h3fd9d12_0\n  - libgfortran=3.0.0=1\n  - libgfortran-ng=7.5.0=h14aa051_19\n  - libgfortran4=7.5.0=h14aa051_19\n  - libglvnd-cos7-x86_64=1.0.1=h9b0a68f_1105\n  - libgomp=11.1.0=hc902ee8_8\n  - libiconv=1.15=h516909a_1006\n  - liblapack=3.8.0=17_openblas\n  - liblas=isis5.0.1\n  - libnabo=isis5.0.1\n  - libopenblas=0.3.10=h5a2b251_0\n  - libpng=1.6.37=h21135ba_2\n  - libpointmatcher=isis5.0.1\n  - libpq=10.6=h13b8bad_1000\n  - libprotobuf=3.9.2=h8b12597_0\n  - libssh2=1.8.0=h1ad7b7a_1003\n  - libstdcxx-devel_linux-64=7.5.0=hb016644_19\n  - libstdcxx-ng=11.1.0=h56837e0_8\n  - libtiff=4.0.10=hc3755c2_1005\n  - libuuid=2.32.1=h7f98852_1000\n  - libuv=1.42.0=h7f98852_0\n  - libwebp=0.5.2=7\n  - libxcb=1.13=h7f98852_1003\n  - libxml2=2.9.9=h13577e0_2\n  - llvm-openmp=8.0.1=hc9558a2_0\n  - lz4-c=1.9.3=h9c3ff4c_1\n  - mesalib=18.3.1=h590aaf7_0\n  - metis=5.1.0=h58526e2_1006\n  - mpfr=4.1.0=h9202a9a_1\n  - mysql=5.7.20=hf484d3e_1001\n  - mysql-connector-c=6.1.11=hab6429c_1002\n  - nanoflann=1.3.2=ha770c72_0\n  - ncurses=6.2=he6710b0_1\n  - networkx=2.5=py_0\n  - nlohmann_json=3.10.2=h9c3ff4c_0\n  - nn=1.86.0=h14c3975_2003\n  - numpy=1.13.3=py36_blas_openblas_200\n  - openblas=0.2.19=2\n  - opencv=3.2.0=np113py36_blas_openblas_203\n  - openexr=2.5.5=hf817b99_0\n  - openjpeg=2.1.0=6\n  - openmp=8.0.1=0\n  - openssl=1.0.2u=h516909a_0\n  - parallel=20210822=ha770c72_0\n  - pbzip2=1.1.13=0\n  - pcl=1.9.1=h482114b_1002\n  - pcre=8.45=h9c3ff4c_0\n  - perl=5.32.1=0_h7f98852_perl5\n  - pip=21.0.1=py36h06a4308_0\n  - pixman=0.34.0=h14c3975_1003\n  - postgresql=10.6=h66cca7a_1000\n  - proj4=5.2.0=he1b5a44_1006\n  - protobuf=3.9.2=py36he1b5a44_1\n  - pthread-stubs=0.4=h36c2ea0_1001\n  - pvl=1.2.1=pyhd8ed1ab_0\n  - python=3.6.7=hd21baee_1002\n  - python-dateutil=2.8.2=pyhd8ed1ab_0\n  - python_abi=3.6=2_cp36m\n  - pytz=2021.1=pyhd8ed1ab_0\n  - pyyaml=5.4.1=py36h8f6f2f9_1\n  - qhull=7.2.0=0\n  - qt=5.9.6=7\n  - qwt=6.1.3=0\n  - readline=7.0=hf8c457e_1001\n  - rhash=1.4.1=h7f98852_0\n  - s2p-subset=isis5.0.1\n  - scipy=1.2.1=py36h09a28d5_1\n  - setuptools=52.0.0=py36h06a4308_0\n  - six=1.16.0=pyh6c4a22f_0\n  - spiceypy=2.3.2=py_0\n  - sqlite=3.28.0=h8b20d00_0\n  - suitesparse=5.10.1=hd8046ac_0\n  - superlu=5.2.2=hfe2efc7_0\n  - sysroot_linux-64=2.17=h4a8ded7_12\n  - tbb=2020.2=h4bd325d_4\n  - theia=isis5.0.1\n  - tk=8.6.10=hbc83047_0\n  - tnt=126=0\n  - tzcode=2021a=h7f98852_2\n  - usgscsm=1.5.2\n  - wheel=0.37.0=pyhd3eb1b0_0\n  - x264=20131218=0\n  - xerces-c=3.1.4=0\n  - xorg-fixesproto=5.0=h7f98852_1002\n  - xorg-inputproto=2.3.2=h7f98852_1002\n  - xorg-kbproto=1.0.7=h7f98852_1002\n  - xorg-libice=1.0.10=h7f98852_0\n  - xorg-libsm=1.2.3=hd9c2040_1000\n  - xorg-libx11=1.7.2=h7f98852_0\n  - xorg-libxau=1.0.9=h7f98852_0\n  - xorg-libxdmcp=1.1.3=h7f98852_0\n  - xorg-libxext=1.3.4=h7f98852_1\n  - xorg-libxfixes=5.0.3=h7f98852_1004\n  - xorg-libxi=1.7.10=h7f98852_0\n  - xorg-libxrender=0.9.10=h7f98852_1003\n  - xorg-renderproto=0.11.1=h7f98852_1002\n  - xorg-xextproto=7.3.0=h7f98852_1002\n  - xorg-xproto=7.0.31=h7f98852_1007\n  - xz=5.2.5=h7b6447c_0\n  - yaml=0.2.5=h516909a_0\n  - zlib=1.2.11=h7b6447c_3\n  - zstd=1.4.9=ha95c52a_0\n"
  },
  {
    "path": "conda/asp_deps_3.0.0_osx_env.yaml",
    "content": "name: asp_deps\nchannels:\n  - nasa-ames-stereo-pipeline\n  - usgs-astrogeology\n  - conda-forge\n  - defaults\ndependencies:\n  - ale=0.8.5=py36hc61eee1_3\n  - armadillo=9.200.4=hcb88e47_1205\n  - arpack=3.6.3=h06d5271_1005\n  - blas=1.1=openblas\n  - boost=1.68.0=py36h9888f84_1001\n  - boost-cpp=1.68.0=h6f8c590_1000\n  - bullet=2.86.1=0\n  - bz2file=0.98=py_0\n  - bzip2=1.0.8=h0d85af4_4\n  - ca-certificates=2021.5.30=h033912b_0\n  - cairo=1.14.6=4\n  - ceres-solver=1.14.0=hb9d6bad_10\n  - certifi=2021.5.30=py36h79c6626_0\n  - cmake=3.3.1=0\n  - csm=3.0.3.3=0\n  - cspice=66=h0d85af4_1014\n  - curl=7.64.0=heae2a1f_0\n  - decorator=5.0.9=pyhd8ed1ab_0\n  - eigen=3.3.7=h04f5b5a_0\n  - embree=2.16.0=h6834224_0\n  - expat=2.4.1=he49afe7_0\n  - ffmpeg=3.4.1=0\n  - fftw=3.3.8=nompi_h5c49c53_1109\n  - fgr=isis5.0.1\n  - flann=1.9.1=0\n  - fontconfig=2.12.1=4\n  - freetype=2.7=1\n  - geoid=1.0=1\n  - geos=3.7.3=h4a8c4bd_0\n  - geotiff=1.4.3=h113155d_1001\n  - gettext=0.19.8.1=h46ab8bc_1002\n  - gflags=2.2.2=hb1e8313_1004\n  - giflib=5.2.1=hbcb3906_2\n  - git=2.11.1=0\n  - glib=2.51.4=0\n  - glog=0.4.0=hb7f4fc5_3\n  - gmm=5.0=h6aef312_0\n  - gmp=6.2.1=h2e338ed_0\n  - gsl=2.7=h93259b0_0\n  - harfbuzz=1.3.4=2\n  - hdf5=1.8.18=3\n  - htdp=1.0=1\n  - icu=58.2=h0a44026_1000\n  - ilmbase=2.5.5=hfab91a5_0\n  - imagemagick=isis5.0.1\n  - inja=3.2.0=h1c7c35f_0\n  - isis=5.0.1=0\n  - jama=125=0\n  - jasper=1.900.1=h636a363_1006\n  - jpeg=9d=hbcb3906_0\n  - kakadu=1=0\n  - krb5=1.16.3=h24a3359_1000\n  - laszip=2.1.0=h0a44026_1\n  - libblas=3.8.0=17_openblas\n  - libcblas=3.8.0=17_openblas\n  - libcurl=7.64.0=h76de61e_0\n  - libcxx=12.0.1=habf9029_0\n  - libedit=3.1.20191231=h0678c8f_2\n  - libelas=isis5.0.1\n  - libffi=3.2.1=hb1e8313_1007\n  - libgcc=4.8.5=hdbeacc1_10\n  - libgdal=2.4.1_isis5.0.1\n  - libgfortran=3.0.1=0\n  - libiconv=1.15=h0b31af3_1006\n  - liblapack=3.8.0=17_openblas\n  - liblas=isis5.0.1\n  - libnabo=isis5.0.1\n  - libopenblas=0.3.10=h0794777_0\n  - libpng=1.6.37=h7cec526_2\n  - libpointmatcher=isis5.0.1\n  - libpq=10.6=hbe1e24e_1000\n  - libprotobuf=3.9.2=hfbae3c0_0\n  - libssh2=1.8.0=hf30b1f0_1003\n  - libtiff=4.0.10=ha78913b_1005\n  - libwebp=0.5.2=7\n  - libxcb=1.13=h35c211d_1003\n  - libxml2=2.9.9=hd80cff7_2\n  - llvm-openmp=12.0.1=hda6cdc1_0\n  - lz4-c=1.9.3=h046ec9c_0\n  - mesalib=18.0.0=hb6cfc13_1\n  - metis=5.1.0=h2e338ed_1006\n  - mpfr=4.0.2=h72d8aaf_1\n  - mysql=5.7.20=h0a44026_1001\n  - mysql-connector-c=6.1.11=had4e77e_1002\n  - nanoflann=1.3.2=h694c41f_0\n  - ncurses=6.2=h2e338ed_4\n  - networkx=2.5=py_0\n  - nlohmann_json=3.9.1=he49afe7_1\n  - nn=1.86.0=h1de35cc_2003\n  - numpy=1.13.3=py36_blas_openblas_200\n  - openblas=0.2.19=2\n  - opencv=3.2.0=np113py36_blas_openblas_203\n  - openexr=2.5.5=h7fa7ffa_0\n  - openjpeg=2.1.0=6\n  - openssl=1.0.2u=h0b31af3_0\n  - parallel=20210622=h694c41f_0\n  - pbzip2=1.1.13=h9d27c22_1\n  - pcl=1.9.1=hdd77166_1002\n  - pcre=8.45=he49afe7_0\n  - perl=5.32.1=0_h0d85af4_perl5\n  - pip=21.1.3=pyhd8ed1ab_0\n  - pixman=0.34.0=h1de35cc_1003\n  - postgresql=10.6=ha1bbaa7_1000\n  - proj4=5.2.0=h6de7cb9_1006\n  - protobuf=3.9.2=py36h6de7cb9_1\n  - pthread-stubs=0.4=hc929b4f_1001\n  - pvl=1.2.1=pyhd8ed1ab_0\n  - python=3.6.7=h4a56312_1002\n  - python-dateutil=2.8.2=pyhd8ed1ab_0\n  - python_abi=3.6=2_cp36m\n  - pytz=2021.1=pyhd8ed1ab_0\n  - pyyaml=5.4.1=py36h20b66c6_0\n  - qhull=7.2.0=0\n  - qt=5.9.6=7\n  - qwt=6.1.3=0\n  - readline=7.0=hcfe32e1_1001\n  - s2p-subset=isis5.0.1\n  - scipy=1.2.1=py36hbd7caa9_1\n  - setuptools=49.6.0=py36h79c6626_3\n  - six=1.16.0=pyh6c4a22f_0\n  - spiceypy=2.3.2=py_0\n  - sqlite=3.28.0=h9721f7c_0\n  - suitesparse=5.10.1=h68a9093_0\n  - superlu=5.2.1=hbced767_1205\n  - tbb=2020.2=h940c156_4\n  - theia=isis5.0.1\n  - tk=8.6.10=h0419947_1\n  - tnt=126=0\n  - tzcode=2021a=h0d85af4_2\n  - usgscsm=1.5.2\n  - wheel=0.36.2=pyhd3deb0d_0\n  - x264=20131218=0\n  - xerces-c=3.1.4=h10f7eb2_0\n  - xorg-fixesproto=5.0=h0d85af4_1002\n  - xorg-inputproto=2.3.2=h35c211d_1002\n  - xorg-kbproto=1.0.7=h35c211d_1002\n  - xorg-libice=1.0.10=h0d85af4_0\n  - xorg-libsm=1.2.3=h0d85af4_1000\n  - xorg-libx11=1.7.2=h0d85af4_0\n  - xorg-libxau=1.0.9=h35c211d_0\n  - xorg-libxdmcp=1.1.3=h35c211d_0\n  - xorg-libxext=1.3.4=h0d85af4_1\n  - xorg-libxfixes=5.0.3=h0d85af4_1004\n  - xorg-libxi=1.7.10=h0d85af4_0\n  - xorg-xextproto=7.3.0=h35c211d_1002\n  - xorg-xproto=7.0.31=h35c211d_1007\n  - xz=5.2.5=haf1e3a3_1\n  - yaml=0.2.5=haf1e3a3_0\n  - zlib=1.2.11=h7795811_1010\n  - zstd=1.4.9=h582d3a0_0\n\n"
  },
  {
    "path": "conda/asp_deps_3.1.0_linux_env.yaml",
    "content": "name: asp_deps\nchannels:\n  - nasa-ames-stereo-pipeline\n  - usgs-astrogeology\n  - conda-forge\n  - defaults\ndependencies:\n  - _libgcc_mutex=0.1=conda_forge\n  - _openmp_mutex=4.5=1_gnu\n  - _sysroot_linux-64_curr_repodata_hack=3=h5bd9786_13\n  - ale=0.8.5=py36h605e78d_3\n  - armadillo=10.8.2=h7c03176_0\n  - arpack=3.7.0=hc6cf775_2\n  - binutils_impl_linux-64=2.36.1=h193b22a_2\n  - binutils_linux-64=2.36=hf3e587d_9\n  - blas=1.1=openblas\n  - boost=1.68.0=py36h8619c78_1001\n  - boost-cpp=1.68.0=h11c811c_1000\n  - bullet=2.86.1=0\n  - bz2file=0.98=py_0\n  - bzip2=1.0.8=h7f98852_4\n  - ca-certificates=2021.10.8=ha878542_0\n  - cairo=1.14.6=4\n  - ceres-solver=1.14.0=hf302a74_15\n  - chrpath=0.16=h7f98852_1002\n  - cmake=3.15.5=hf94ab9c_0\n  - csm=3.0.3.3=hc9558a2_0\n  - cspice=66=h7f98852_1015\n  - curl=7.64.0=h646f8bb_0\n  - dbus=1.13.0=h4e0c4b3_1000\n  - decorator=5.1.1=pyhd8ed1ab_0\n  - eigen=3.4.0=h4bd325d_0\n  - embree=2.16.0=0\n  - expat=2.4.8=h27087fc_0\n  - ffmpeg=3.4.1=0\n  - fftw=3.3.8=nompi_hfc0cae8_1114\n  - fgr=isis6=h3fd9d12_0\n  - flann=1.9.1=0\n  - fontconfig=2.12.1=4\n  - freetype=2.7=1\n  - gcc_impl_linux-64=11.2.0=h82a94d6_16\n  - gcc_linux-64=11.2.0=h39a9532_9\n  - geoid=1.0=1\n  - geos=3.7.3=he1b5a44_0\n  - geotiff=1.4.3=hb6868eb_1001\n  - gettext=0.19.8.1=hf34092f_1004\n  - gflags=2.2.2=he1b5a44_1004\n  - giflib=5.2.1=h36c2ea0_2\n  - glib=2.51.4=0\n  - glog=0.6.0=h6f12383_0\n  - gmm=5.0=0\n  - gmp=6.2.1=h58526e2_0\n  - gsl=2.7=he838d99_0\n  - gst-plugins-base=1.8.0=0\n  - gstreamer=1.8.0=2\n  - gxx_impl_linux-64=11.2.0=h82a94d6_16\n  - gxx_linux-64=11.2.0=hacbe6df_9\n  - harfbuzz=1.3.4=2\n  - hdf5=1.8.18=3\n  - htdp=1.0=1\n  - icu=58.2=hf484d3e_1000\n  - ilmbase=2.5.5=h780b84a_0\n  - imagemagick=isis6=h3fd9d12_0\n  - imath=3.1.5=h6239696_0\n  - inja=3.3.0=h9c3ff4c_0\n  - isis=6.0.0=0\n  - jama=125=0\n  - jasper=1.900.1=h07fcdf6_1006\n  - jpeg=9e=h166bdaf_1\n  - kakadu=1=0\n  - kernel-headers_linux-64=3.10.0=h4a8ded7_13\n  - krb5=1.16.3=hc83ff2d_1000\n  - laszip=2.1.0=hf484d3e_1\n  - ld_impl_linux-64=2.36.1=hea4e1c9_2\n  - libblas=3.9.0=13_linux64_openblas\n  - libcblas=3.9.0=13_linux64_openblas\n  - libcurl=7.64.0=h01ee5af_0\n  - libedit=3.1.20191231=he28a2e2_2\n  - libelas=isis6=h3fd9d12_0\n  - libffi=3.2.1=he1b5a44_1007\n  - libgcc=7.2.0=h69d50b8_2\n  - libgcc-devel_linux-64=11.2.0=h0952999_16\n  - libgcc-ng=11.2.0=h1d223b6_15\n  - libgdal=2.4.1_isis6=h3fd9d12_0\n  - libgfortran=3.0.0=1\n  - libgfortran-ng=7.5.0=h14aa051_20\n  - libgfortran4=7.5.0=h14aa051_20\n  - libglvnd-cos7-x86_64=1.0.1=h9b0a68f_1105\n  - libgomp=11.2.0=h1d223b6_15\n  - libiconv=1.15=h516909a_1006\n  - liblapack=3.9.0=13_linux64_openblas\n  - liblas=isis6=h3fd9d12_1000\n  - libnabo=isis6=h3fd9d12_0\n  - libnsl=2.0.0=h7f98852_0\n  - libopenblas=0.3.18=hf726d26_0\n  - libpng=1.6.37=h21135ba_2\n  - libpointmatcher=isis6=h2bc3f7f_0\n  - libpq=10.6=h13b8bad_1000\n  - libprotobuf=3.9.2=h8b12597_0\n  - libsanitizer=11.2.0=he4da1e4_16\n  - libssh2=1.8.0=h1ad7b7a_1003\n  - libstdcxx-devel_linux-64=11.2.0=h0952999_16\n  - libstdcxx-ng=11.2.0=he4da1e4_15\n  - libtiff=4.0.10=hc3755c2_1005\n  - libuuid=2.32.1=h7f98852_1000\n  - libuv=1.43.0=h7f98852_0\n  - libwebp=0.5.2=7\n  - libxcb=1.13=h7f98852_1004\n  - libxml2=2.9.9=h13577e0_2\n  - libzlib=1.2.11=h166bdaf_1014\n  - llvm-openmp=8.0.1=hc9558a2_0\n  - lz4-c=1.9.3=h9c3ff4c_1\n  - mesalib=18.3.1=h590aaf7_0\n  - metis=5.1.0=h58526e2_1006\n  - mpfr=4.1.0=h9202a9a_1\n  - mysql=5.7.20=hf484d3e_1001\n  - mysql-connector-c=6.1.11=hab6429c_1002\n  - nanoflann=1.4.2=ha770c72_0\n  - ncurses=6.3=h27087fc_1\n  - networkx=2.5=py_0\n  - nlohmann_json=3.10.5=h9c3ff4c_0\n  - nn=1.86.0=h14c3975_2003\n  - numpy=1.13.3=py36_blas_openblas_200\n  - openblas=0.2.19=2\n  - opencv=3.2.0=np113py36_blas_openblas_203\n  - openexr=2.5.5=hf817b99_0\n  - openjpeg=2.3.0=hf38bd82_1003\n  - openmp=8.0.1=0\n  - openssl=1.0.2u=h516909a_0\n  - parallel=20220222=ha770c72_0\n  - pbzip2=1.1.13=0\n  - pcl=1.9.1=h482114b_1002\n  - pcre=8.45=h9c3ff4c_0\n  - perl=5.32.1=2_h7f98852_perl5\n  - pip=21.3.1=pyhd8ed1ab_0\n  - pixman=0.34.0=h14c3975_1003\n  - postgresql=10.6=h66cca7a_1000\n  - proj4=5.2.0=he1b5a44_1006\n  - protobuf=3.9.2=py36he1b5a44_1\n  - pthread-stubs=0.4=h36c2ea0_1001\n  - pvl=1.3.1=pyhd8ed1ab_0\n  - python=3.6.7=hd21baee_1002\n  - python-dateutil=2.8.2=pyhd8ed1ab_0\n  - python_abi=3.6=2_cp36m\n  - pytz=2022.1=pyhd8ed1ab_0\n  - pyyaml=5.4.1=py36h8f6f2f9_1\n  - qhull=7.2.0=0\n  - qt=5.9.6=7\n  - qwt=6.1.3=0\n  - readline=7.0=hf8c457e_1001\n  - rhash=1.4.1=h7f98852_0\n  - s2p-subset=isis6=h3fd9d12_0\n  - scipy=1.2.1=py36h09a28d5_1\n  - setuptools=58.0.4=py36h5fab9bb_2\n  - six=1.16.0=pyh6c4a22f_0\n  - spiceypy=2.3.2=py_0\n  - sqlite=3.28.0=h8b20d00_0\n  - suitesparse=5.10.1=h9e50725_1\n  - superlu=5.2.2=hfe2efc7_0\n  - sysroot_linux-64=2.17=h4a8ded7_13\n  - tbb=2021.5.0=h924138e_1\n  - theia=isis6=h3fd9d12_1001\n  - tk=8.6.12=h27826a3_0\n  - tnt=126=0\n  - tzcode=2022a=h166bdaf_0\n  - usgscsm=1.6.0_asp3.1.0=h2bc3f7f_0\n  - wheel=0.37.1=pyhd8ed1ab_0\n  - x264=20131218=0\n  - xerces-c=3.1.4=0\n  - xorg-fixesproto=5.0=h7f98852_1002\n  - xorg-inputproto=2.3.2=h7f98852_1002\n  - xorg-kbproto=1.0.7=h7f98852_1002\n  - xorg-libice=1.0.10=h7f98852_0\n  - xorg-libsm=1.2.3=hd9c2040_1000\n  - xorg-libx11=1.7.2=h7f98852_0\n  - xorg-libxau=1.0.9=h7f98852_0\n  - xorg-libxdmcp=1.1.3=h7f98852_0\n  - xorg-libxext=1.3.4=h7f98852_1\n  - xorg-libxfixes=5.0.3=h7f98852_1004\n  - xorg-libxi=1.7.10=h7f98852_0\n  - xorg-libxrender=0.9.10=h7f98852_1003\n  - xorg-renderproto=0.11.1=h7f98852_1002\n  - xorg-xextproto=7.3.0=h7f98852_1002\n  - xorg-xproto=7.0.31=h7f98852_1007\n  - xz=5.2.5=h516909a_1\n  - yaml=0.2.5=h7f98852_2\n  - zlib=1.2.11=h166bdaf_1014\n  - zstd=1.4.9=ha95c52a_0\n"
  },
  {
    "path": "conda/asp_deps_3.1.0_osx_env.yaml",
    "content": "name: asp_deps\nchannels:\n  - nasa-ames-stereo-pipeline\n  - usgs-astrogeology\n  - conda-forge\n  - defaults\ndependencies:\n  - ale=0.8.5=py36hc61eee1_3\n  - armadillo=9.200.4=hcb88e47_1205\n  - arpack=3.6.3=h06d5271_1005\n  - blas=1.1=openblas\n  - boost=1.68.0=py36h9888f84_1001\n  - boost-cpp=1.68.0=h6f8c590_1000\n  - bullet=2.86.1=0\n  - bz2file=0.98=py_0\n  - bzip2=1.0.8=h0d85af4_4\n  - ca-certificates=2021.10.8=h033912b_0\n  - cairo=1.14.6=4\n  - ceres-solver=1.14.0=h636452b_15\n  - certifi=2021.5.30=py36h79c6626_0\n  - cmake=3.15.5=h6c18c4b_0\n  - csm=3.0.3.3=0\n  - cspice=66=h0d85af4_1015\n  - curl=7.64.0=heae2a1f_0\n  - decorator=5.1.1=pyhd8ed1ab_0\n  - eigen=3.4.0=h940c156_0\n  - embree=2.16.0=h6834224_0\n  - expat=2.4.8=h96cf925_0\n  - ffmpeg=3.4.1=0\n  - fftw=3.3.8=nompi_h5c49c53_1109\n  - fgr=isis6=h01edc0c_0\n  - flann=1.9.1=0\n  - fontconfig=2.12.1=4\n  - freetype=2.7=1\n  - geoid=1.0=1\n  - geos=3.7.3=h4a8c4bd_0\n  - geotiff=1.4.3=h113155d_1001\n  - gettext=0.19.8.1=h46ab8bc_1002\n  - gflags=2.2.2=hb1e8313_1004\n  - giflib=5.2.1=hbcb3906_2\n  - glib=2.51.4=0\n  - glog=0.6.0=h8ac2a54_0\n  - gmm=5.0=h6aef312_0\n  - gmp=6.2.1=h2e338ed_0\n  - gsl=2.7=h93259b0_0\n  - harfbuzz=1.3.4=2\n  - hdf5=1.8.18=3\n  - htdp=1.0=1\n  - icu=58.2=h0a44026_1000\n  - ilmbase=2.5.5=hfab91a5_0\n  - imagemagick=isis6=h01edc0c_0\n  - inja=3.3.0=he49afe7_0\n  - isis=6.0.0=0\n  - jama=125=0\n  - jasper=1.900.1=h636a363_1006\n  - jpeg=9e=h5eb16cf_1\n  - kakadu=1=0\n  - krb5=1.16.3=h24a3359_1000\n  - laszip=2.1.0=h0a44026_1\n  - libblas=3.9.0=13_osx64_openblas\n  - libcblas=3.9.0=13_osx64_openblas\n  - libcurl=7.64.0=h76de61e_0\n  - libcxx=14.0.3=hc203e6f_0\n  - libedit=3.1.20191231=h0678c8f_2\n  - libelas=isis6=0\n  - libffi=3.2.1=hb1e8313_1007\n  - libgcc=4.8.5=hdbeacc1_10\n  - libgdal=2.4.1_isis6=h01edc0c_0\n  - libgfortran=3.0.1=0\n  - libiconv=1.15=h0b31af3_1006\n  - liblapack=3.9.0=13_osx64_openblas\n  - liblas=isis6=h01edc0c_1000\n  - libnabo=isis6=h01edc0c_0\n  - libopenblas=0.3.18=h9a5756b_0\n  - libpng=1.6.37=h7cec526_2\n  - libpointmatcher=isis6=ha5a8b8e_0\n  - libpq=10.6=hbe1e24e_1000\n  - libprotobuf=3.9.2=hfbae3c0_0\n  - libssh2=1.8.0=hf30b1f0_1003\n  - libtiff=4.0.10=ha78913b_1005\n  - libuv=1.43.0=h0d85af4_0\n  - libwebp=0.5.2=7\n  - libxcb=1.13=h0d85af4_1004\n  - libxml2=2.9.9=hd80cff7_2\n  - libzlib=1.2.11=h6c3fc93_1014\n  - llvm-openmp=14.0.3=ha654fa7_0\n  - lz4-c=1.9.3=he49afe7_1\n  - mesalib=21.2.5=h2df1e00_3\n  - metis=5.1.0=h2e338ed_1006\n  - mpfr=4.1.0=h0f52abe_1\n  - mysql=5.7.20=h0a44026_1001\n  - mysql-connector-c=6.1.11=had4e77e_1002\n  - nanoflann=1.4.2=h694c41f_0\n  - ncurses=6.3=h96cf925_1\n  - networkx=2.5=py_0\n  - nlohmann_json=3.10.5=he49afe7_0\n  - nn=1.86.0=h1de35cc_2003\n  - numpy=1.13.3=py36_blas_openblas_200\n  - openblas=0.2.19=2\n  - opencv=3.2.0=np113py36_blas_openblas_203\n  - openexr=2.5.5=h7fa7ffa_0\n  - openjpeg=2.3.0=h3bf0609_1003\n  - openssl=1.0.2u=h0b31af3_0\n  - parallel=20220222=h694c41f_0\n  - pbzip2=1.1.13=h9d27c22_1\n  - pcl=1.9.1=hdd77166_1002\n  - pcre=8.45=he49afe7_0\n  - perl=5.32.1=2_h0d85af4_perl5\n  - pip=21.3.1=pyhd8ed1ab_0\n  - pixman=0.34.0=h1de35cc_1003\n  - postgresql=10.6=ha1bbaa7_1000\n  - proj4=5.2.0=h6de7cb9_1006\n  - protobuf=3.9.2=py36h6de7cb9_1\n  - pthread-stubs=0.4=hc929b4f_1001\n  - pvl=1.3.1=pyhd8ed1ab_0\n  - python=3.6.7=h4a56312_1002\n  - python-dateutil=2.8.2=pyhd8ed1ab_0\n  - python_abi=3.6=2_cp36m\n  - pytz=2022.1=pyhd8ed1ab_0\n  - pyyaml=5.4.1=py36hfa26744_1\n  - qhull=7.2.0=0\n  - qt=5.9.6=7\n  - qwt=6.1.3=0\n  - readline=7.0=hcfe32e1_1001\n  - rhash=1.4.1=h0d85af4_0\n  - s2p-subset=isis6=h01edc0c_0\n  - scipy=1.2.1=py36hbd7caa9_1\n  - setuptools=58.0.4=py36h79c6626_2\n  - six=1.16.0=pyh6c4a22f_0\n  - spiceypy=2.3.2=py_0\n  - sqlite=3.28.0=h9721f7c_0\n  - suitesparse=5.10.1=h7aff33d_1\n  - superlu=5.2.1=hbced767_1205\n  - tbb=2021.5.0=hbb4e6a2_1\n  - theia=isis6=h01edc0c_1001\n  - tk=8.6.12=h5dbffcc_0\n  - tnt=126=0\n  - tzcode=2022a=h5eb16cf_0\n  - usgscsm=1.6.0_asp3.1.0=ha5a8b8e_0\n  - wheel=0.37.1=pyhd8ed1ab_0\n  - x264=20131218=0\n  - xerces-c=3.1.4=h10f7eb2_0\n  - xorg-damageproto=1.2.1=h0d85af4_1002\n  - xorg-fixesproto=5.0=h0d85af4_1002\n  - xorg-glproto=1.4.17=h0d85af4_1002\n  - xorg-inputproto=2.3.2=h35c211d_1002\n  - xorg-kbproto=1.0.7=h35c211d_1002\n  - xorg-libice=1.0.10=h0d85af4_0\n  - xorg-libsm=1.2.3=h0d85af4_1000\n  - xorg-libx11=1.7.2=h0d85af4_0\n  - xorg-libxau=1.0.9=h35c211d_0\n  - xorg-libxdamage=1.1.5=h0d85af4_1\n  - xorg-libxdmcp=1.1.3=h35c211d_0\n  - xorg-libxext=1.3.4=h0d85af4_1\n  - xorg-libxfixes=5.0.3=h0d85af4_1004\n  - xorg-libxi=1.7.10=h0d85af4_0\n  - xorg-libxrandr=1.5.2=h0d85af4_1\n  - xorg-libxrender=0.9.10=h0d85af4_1003\n  - xorg-randrproto=1.5.0=h0d85af4_1001\n  - xorg-renderproto=0.11.1=h0d85af4_1002\n  - xorg-util-macros=1.19.3=h35c211d_0\n  - xorg-xextproto=7.3.0=h35c211d_1002\n  - xorg-xf86vidmodeproto=2.3.1=h0d85af4_1002\n  - xorg-xproto=7.0.31=h35c211d_1007\n  - xz=5.2.5=haf1e3a3_1\n  - yaml=0.2.5=h0d85af4_2\n  - zlib=1.2.11=h6c3fc93_1014\n  - zstd=1.4.9=h582d3a0_0\n\n"
  },
  {
    "path": "conda/asp_deps_3.2.0_linux_env.yaml",
    "content": "name: asp_deps\nchannels:\n  - nasa-ames-stereo-pipeline\n  - usgs-astrogeology\n  - conda-forge\n  - defaults\ndependencies:\n  - _libgcc_mutex=0.1=conda_forge\n  - _openmp_mutex=4.5=2_kmp_llvm\n  - _sysroot_linux-64_curr_repodata_hack=3=h5bd9786_13\n  - ale=0.8.8=py39hf939315_1\n  - alsa-lib=1.2.6.1=h7f98852_0\n  - aom=3.4.0=h27087fc_1\n  - armadillo=11.4.2=h7209761_0\n  - arpack=3.7.0=hdefa2d7_2\n  - attr=2.5.1=h166bdaf_1\n  - binutils_impl_linux-64=2.39=he00db2b_1\n  - binutils_linux-64=2.39=h5fc0e48_11\n  - blas=2.116=openblas\n  - blas-devel=3.9.0=16_linux64_openblas\n  - boost=1.72.0=py39ha90915f_1\n  - boost-cpp=1.72.0=he72f1d9_7\n  - bullet=2.86.1=0\n  - bz2file=0.98=py_0\n  - bzip2=1.0.8=h7f98852_4\n  - c-ares=1.18.1=h7f98852_0\n  - ca-certificates=2022.12.7=ha878542_0\n  - cairo=1.16.0=ha61ee94_1014\n  - ceres-solver=1.14.0=hf302a74_15\n  - chrpath=0.16=h7f98852_1002\n  - cmake=3.15.5=hf94ab9c_0\n  - csm=3.0.3.3=hc9558a2_0\n  - cspice=67=h166bdaf_4\n  - curl=7.86.0=h7bff187_1\n  - cyrus-sasl=2.1.27=h230043b_5\n  - dbus=1.13.6=h5008d03_3\n  - eigen=3.4.0=h4bd325d_0\n  - elfutils=0.186=he364ef2_0\n  - embree=2.16.0=0\n  - expat=2.5.0=h27087fc_0\n  - ffmpeg=4.4.2=gpl_hfe78399_107\n  - fftw=3.3.10=nompi_hf0379b8_106\n  - fgr=isis7=h3fd9d12_0\n  - flann=1.9.1=he05ef13_1011\n  - font-ttf-dejavu-sans-mono=2.37=hab24e00_0\n  - font-ttf-inconsolata=3.000=h77eed37_0\n  - font-ttf-source-code-pro=2.038=h77eed37_0\n  - font-ttf-ubuntu=0.83=hab24e00_0\n  - fontconfig=2.14.1=hc2a2eb6_0\n  - fonts-conda-ecosystem=1=0\n  - fonts-conda-forge=1=0\n  - freeglut=3.2.2=h9c3ff4c_1\n  - freetype=2.12.1=hca18f0e_1\n  - gcc_impl_linux-64=12.2.0=hcc96c02_19\n  - gcc_linux-64=12.2.0=h4798a0e_11\n  - geoid=1.0_isis7=1\n  - geos=3.7.3=he1b5a44_0\n  - geotiff=1.7.1=ha76d385_4\n  - gettext=0.21.1=h27087fc_0\n  - gflags=2.2.2=he1b5a44_1004\n  - gfortran_impl_linux-64=12.2.0=h55be85b_19\n  - gfortran_linux-64=12.2.0=h307d370_11\n  - giflib=5.2.1=h36c2ea0_2\n  - glib=2.74.1=h6239696_1\n  - glib-tools=2.74.1=h6239696_1\n  - glog=0.6.0=h6f12383_0\n  - gmp=6.2.1=h58526e2_0\n  - gnutls=3.7.8=hf3e180e_0\n  - graphite2=1.3.13=h58526e2_1001\n  - gsl=2.7=he838d99_0\n  - gst-plugins-base=1.20.3=hf6a322e_0\n  - gstreamer=1.20.3=hd4edc92_2\n  - gxx_impl_linux-64=12.2.0=hcc96c02_19\n  - gxx_linux-64=12.2.0=hb41e900_11\n  - harfbuzz=5.3.0=h418a68e_0\n  - hdf5=1.12.2=nompi_h2386368_100\n  - htdp=1.0_isis7=1\n  - icu=70.1=h27087fc_0\n  - ilmbase=2.5.5=h780b84a_0\n  - inja=3.3.0=h9c3ff4c_0\n  - isis=7.1.0=0\n  - jack=1.9.18=h8c3723f_1002\n  - jama=125=0\n  - jasper=2.0.33=ha77e612_0\n  - jemalloc=5.2.1=h9c3ff4c_6\n  - jpeg=9e=h166bdaf_2\n  - kakadu=1=0\n  - kernel-headers_linux-64=3.10.0=h4a8ded7_13\n  - keyutils=1.6.1=h166bdaf_0\n  - krb5=1.19.3=h3790be6_0\n  - lame=3.100=h166bdaf_1003\n  - laszip=2.1.0_isis7=h3fd9d12_1\n  - ld_impl_linux-64=2.39=hcc3a1bd_1\n  - lerc=4.0.0=h27087fc_0\n  - libarchive=3.5.2=hb890918_3\n  - libblas=3.9.0=16_linux64_openblas\n  - libcap=2.64=ha37c62d_0\n  - libcblas=3.9.0=16_linux64_openblas\n  - libclang=14.0.6=default_h2e3cab8_0\n  - libclang13=14.0.6=default_h3a83d3e_0\n  - libcups=2.3.3=h3e49a29_2\n  - libcurl=7.86.0=h7bff187_1\n  - libcxx=14.0.6=hf52228f_0\n  - libcxxabi=14.0.6=ha770c72_0\n  - libdb=6.2.32=h9c3ff4c_0\n  - libdeflate=1.14=h166bdaf_0\n  - libdrm=2.4.114=h166bdaf_0\n  - libedit=3.1.20191231=he28a2e2_2\n  - libelas=isis7=h3fd9d12_0\n  - libev=4.33=h516909a_1\n  - libevent=2.1.10=h9b69904_4\n  - libffi=3.4.2=h7f98852_5\n  - libflac=1.3.4=h27087fc_0\n  - libgcc-devel_linux-64=12.2.0=h3b97bd3_19\n  - libgcc-ng=12.2.0=h65d4601_19\n  - libgdal=3.5_isis7=h3fd9d12_0\n  - libgfortran-ng=12.2.0=h69a702a_19\n  - libgfortran5=12.2.0=h337968e_19\n  - libglib=2.74.1=h606061b_1\n  - libglu=9.0.0=he1b5a44_1001\n  - libglvnd-cos7-x86_64=1.0.1=h9b0a68f_1105\n  - libgomp=12.2.0=h65d4601_19\n  - libhwloc=2.8.0=h32351e8_1\n  - libiconv=1.17=h166bdaf_0\n  - libidn2=2.3.4=h166bdaf_0\n  - libjemalloc=5.2.1=h9c3ff4c_6\n  - liblapack=3.9.0=16_linux64_openblas\n  - liblapacke=3.9.0=16_linux64_openblas\n  - liblas=1.8.2_isis7=h3fd9d12_0\n  - libllvm14=14.0.6=he0ac6c6_1\n  - libmicrohttpd=0.9.75=h2603550_1\n  - libnabo=isis7=h3fd9d12_0\n  - libnghttp2=1.47.0=hdcd2b5c_1\n  - libnsl=2.0.0=h7f98852_0\n  - libntlm=1.4=h7f98852_1002\n  - libogg=1.3.4=h7f98852_1\n  - libopenblas=0.3.21=pthreads_h78a6416_3\n  - libopencv=4.6.0=py39h04bf7ee_4\n  - libopus=1.3.1=h7f98852_1\n  - libpciaccess=0.17=h166bdaf_0\n  - libpng=1.6.39=h753d276_0\n  - libpointmatcher=isis7=h2bc3f7f_0\n  - libpq=14.5=h72a31a5_3\n  - libprotobuf=3.21.11=h3eb15da_0\n  - libsanitizer=12.2.0=h46fd767_19\n  - libsndfile=1.0.31=h9c3ff4c_1\n  - libsqlite=3.40.0=h753d276_0\n  - libssh2=1.10.0=haa6b8db_3\n  - libstdcxx-devel_linux-64=12.2.0=h3b97bd3_19\n  - libstdcxx-ng=12.2.0=h46fd767_19\n  - libtasn1=4.19.0=h166bdaf_0\n  - libtiff=4.4.0=h55922b4_4\n  - libtool=2.4.6=h9c3ff4c_1008\n  - libudev1=252=h166bdaf_0\n  - libunistring=0.9.10=h7f98852_0\n  - libuuid=2.32.1=h7f98852_1000\n  - libuv=1.44.2=h166bdaf_0\n  - libva=2.16.0=h166bdaf_0\n  - libvorbis=1.3.7=h9c3ff4c_0\n  - libvpx=1.11.0=h9c3ff4c_3\n  - libwebp=1.2.4=h522a892_0\n  - libwebp-base=1.2.4=h166bdaf_0\n  - libxcb=1.13=h7f98852_1004\n  - libxkbcommon=1.0.3=he3ba5ed_0\n  - libxml2=2.9.14=h22db469_4\n  - libzlib=1.2.13=h166bdaf_4\n  - llvm-openmp=15.0.6=he0ac6c6_0\n  - lz4-c=1.9.3=h9c3ff4c_1\n  - lzo=2.10=h516909a_1000\n  - mesalib=21.2.5=h0e4506f_3\n  - metis=5.1.0=h58526e2_1006\n  - mpfr=4.1.0=h9202a9a_1\n  - multiview=asp3.2.0=py39h3fd9d12_0\n  - mysql=8.0.31=h3e2b116_0\n  - mysql-client=8.0.31=hf89ab62_0\n  - mysql-common=8.0.31=haf5c9bc_0\n  - mysql-connector-c=6.1.11=h6eb9d5d_1007\n  - mysql-devel=8.0.31=haf5c9bc_0\n  - mysql-libs=8.0.31=h28c427c_0\n  - mysql-server=8.0.31=hb01f15f_0\n  - nanoflann=1.4.2=ha770c72_0\n  - ncurses=6.3=h27087fc_1\n  - nettle=3.8.1=hc379101_1\n  - networkx=2.8.8=pyhd8ed1ab_0\n  - nlohmann_json=3.11.2=h27087fc_0\n  - nn=1.86.0=h14c3975_2003\n  - nspr=4.35=h27087fc_0\n  - nss=3.82=he02c5a1_0\n  - numpy=1.23.5=py39h3d75532_0\n  - openblas=0.3.21=pthreads_h320a7e8_3\n  - opencv=4.6.0=py39hf3d152e_4\n  - openexr=2.5.5=hf817b99_0\n  - openh264=2.3.0=h27087fc_0\n  - openjpeg=2.3.0=hf38bd82_1003\n  - openssl=1.1.1s=h0b41bf4_1\n  - p11-kit=0.24.1=hc5aa10d_0\n  - parallel=20221122=ha770c72_0\n  - pbzip2=1.1.13=0\n  - pcl=1.11.1=h05311af_1\n  - pcre2=10.40=hc3806b6_0\n  - perl=5.32.1=2_h7f98852_perl5\n  - pip=22.3.1=pyhd8ed1ab_0\n  - pixman=0.40.0=h36c2ea0_0\n  - portaudio=19.6.0=h57a0ea0_5\n  - proj=9.1.0=h93bde94_0\n  - protobuf=4.21.11=py39h227be39_0\n  - pthread-stubs=0.4=h36c2ea0_1001\n  - pulseaudio=14.0=h7f54b18_8\n  - pvl=1.3.2=pyhd8ed1ab_0\n  - py-opencv=4.6.0=py39hef51801_4\n  - python=3.9.15=h47a2c10_0_cpython\n  - python-dateutil=2.8.2=pyhd8ed1ab_0\n  - python_abi=3.9=3_cp39\n  - pytz=2022.6=pyhd8ed1ab_0\n  - pyyaml=6.0=py39hb9d737c_5\n  - qhull=2020.2=h4bd325d_2\n  - qt=5.15.4=hf11cfaa_0\n  - qt-main=5.15.4=ha5833f6_2\n  - qt-webengine=5.15.4=hcbadb6c_3\n  - qwt=6.2.0=h1d9fb53_4\n  - rapidjson=1.1.0=he1b5a44_1002\n  - rclone=1.61.1=h519d9b9_0\n  - readline=8.1.2=h0f457ee_0\n  - rhash=1.4.3=h166bdaf_0\n  - rocksdb=6.13.3=hda8cf21_2\n  - s2p-subset=isis7=h3fd9d12_0\n  - scipy=1.9.3=py39hddc5342_2\n  - setuptools=65.5.1=pyhd8ed1ab_0\n  - six=1.16.0=pyh6c4a22f_0\n  - snappy=1.1.9=hbd366e4_2\n  - spiceypy=5.1.2=pyhd8ed1ab_0\n  - sqlite=3.40.0=h4ff8645_0\n  - suitesparse=5.10.1=h9e50725_1\n  - superlu=5.2.2=h00795ac_0\n  - svt-av1=1.2.1=h27087fc_0\n  - sysroot_linux-64=2.17=h4a8ded7_13\n  - tbb=2021.7.0=h924138e_1\n  - tbb-devel=2021.7.0=h924138e_1\n  - tk=8.6.12=h27826a3_0\n  - tnt=126=0\n  - tzdata=2022g=h191b570_0\n  - usgscsm=1.6.0=h924138e_1\n  - wheel=0.38.4=pyhd8ed1ab_0\n  - x264=1!164.3095=h166bdaf_2\n  - x265=3.5=h924138e_3\n  - xcb-util=0.4.0=h166bdaf_0\n  - xcb-util-image=0.4.0=h166bdaf_0\n  - xcb-util-keysyms=0.4.0=h166bdaf_0\n  - xcb-util-renderutil=0.3.9=h166bdaf_0\n  - xcb-util-wm=0.4.1=h166bdaf_0\n  - xerces-c=3.2.3=h55805fa_5\n  - xorg-damageproto=1.2.1=h7f98852_1002\n  - xorg-fixesproto=5.0=h7f98852_1002\n  - xorg-glproto=1.4.17=h7f98852_1002\n  - xorg-inputproto=2.3.2=h7f98852_1002\n  - xorg-kbproto=1.0.7=h7f98852_1002\n  - xorg-libice=1.0.10=h7f98852_0\n  - xorg-libsm=1.2.3=hd9c2040_1000\n  - xorg-libx11=1.7.2=h7f98852_0\n  - xorg-libxau=1.0.9=h7f98852_0\n  - xorg-libxdamage=1.1.5=h7f98852_1\n  - xorg-libxdmcp=1.1.3=h7f98852_0\n  - xorg-libxext=1.3.4=h7f98852_1\n  - xorg-libxfixes=5.0.3=h7f98852_1004\n  - xorg-libxi=1.7.10=h7f98852_0\n  - xorg-libxrandr=1.5.2=h7f98852_1\n  - xorg-libxrender=0.9.10=h7f98852_1003\n  - xorg-randrproto=1.5.0=h7f98852_1001\n  - xorg-renderproto=0.11.1=h7f98852_1002\n  - xorg-util-macros=1.19.3=h7f98852_0\n  - xorg-xextproto=7.3.0=h7f98852_1002\n  - xorg-xf86vidmodeproto=2.3.1=h7f98852_1002\n  - xorg-xproto=7.0.31=h7f98852_1007\n  - xz=5.2.6=h166bdaf_0\n  - yaml=0.2.5=h7f98852_2\n  - zlib=1.2.13=h166bdaf_4\n  - zstd=1.5.2=h6239696_4\n  - mesa-libgl-cos6-x86_64\n  - xorg-libxmu\n  - mesalib\n  "
  },
  {
    "path": "conda/asp_deps_3.2.0_osx_env.yaml",
    "content": "name: asp_deps\nchannels:\n  - nasa-ames-stereo-pipeline\n  - usgs-astrogeology\n  - conda-forge\n  - defaults\ndependencies:\n  - ale=0.8.8=py39h92daf61_1\n  - aom=3.4.0=hb486fe8_1\n  - armadillo=11.4.2=hffeb596_0\n  - arpack=3.7.0=hefb7bc6_2\n  - blas=2.116=openblas\n  - blas-devel=3.9.0=16_osx64_openblas\n  - boost=1.72.0=py39hb64e6f8_1\n  - boost-cpp=1.72.0=h179ae3a_7\n  - bullet=2.86.1=0\n  - bz2file=0.98=py_0\n  - bzip2=1.0.8=h0d85af4_4\n  - c-ares=1.18.1=h0d85af4_0\n  - ca-certificates=2022.12.7=h033912b_0\n  - cairo=1.16.0=h904041c_1014\n  - cctools_osx-64=973.0.1=hcc6d90d_11\n  - ceres-solver=1.14.0=h636452b_15\n  - clang=14.0.6=h694c41f_0\n  - clang-14=14.0.6=default_h55ffa42_0\n  - clang_osx-64=14.0.6=h3113cd8_4\n  - clangxx=14.0.6=default_h55ffa42_0\n  - cmake=3.15.5=h6c18c4b_0\n  - compiler-rt=14.0.6=h613da45_0\n  - compiler-rt_osx-64=14.0.6=h8d5cb93_0\n  - csm=3.0.3.3=0\n  - cspice=67=hb7f2c08_4\n  - curl=7.86.0=h57eb407_1\n  - cyrus-sasl=2.1.27=ha724b88_5\n  - eigen=3.4.0=h940c156_0\n  - embree=2.16.0=h6834224_0\n  - expat=2.5.0=hf0c8a7f_0\n  - ffmpeg=4.4.2=gpl_h5a1d76f_107\n  - fftw=3.3.10=nompi_h4fa670e_106\n  - fgr=isis7=h01edc0c_0\n  - flann=1.9.1=h56de9e4_1011\n  - font-ttf-dejavu-sans-mono=2.37=hab24e00_0\n  - font-ttf-inconsolata=3.000=h77eed37_0\n  - font-ttf-source-code-pro=2.038=h77eed37_0\n  - font-ttf-ubuntu=0.83=hab24e00_0\n  - fontconfig=2.14.1=h5bb23bf_0\n  - fonts-conda-ecosystem=1=0\n  - fonts-conda-forge=1=0\n  - freetype=2.12.1=h3f81eb7_1\n  - geoid=1.0_isis7=1\n  - geos=3.7.3=h4a8c4bd_0\n  - geotiff=1.7.1=he29fd1c_4\n  - gettext=0.21.1=h8a4c099_0\n  - gflags=2.2.2=hb1e8313_1004\n  - gfortran_impl_osx-64=11.3.0=h1f927f5_27\n  - gfortran_osx-64=11.3.0=h18f7dce_0\n  - giflib=5.2.1=hbcb3906_2\n  - glib=2.74.1=hbc0c0cd_1\n  - glib-tools=2.74.1=hbc0c0cd_1\n  - glog=0.6.0=h8ac2a54_0\n  - gmp=6.2.1=h2e338ed_0\n  - gnutls=3.7.8=h207c4f0_0\n  - graphite2=1.3.13=h2e338ed_1001\n  - gsl=2.7=h93259b0_0\n  - gst-plugins-base=1.20.3=h37e1711_2\n  - gstreamer=1.20.3=h1d18e73_2\n  - harfbuzz=5.3.0=h08f8713_0\n  - hdf5=1.12.2=nompi_hc782337_100\n  - htdp=1.0_isis7=1\n  - icu=70.1=h96cf925_0\n  - ilmbase=2.5.5=hfab91a5_0\n  - inja=3.3.0=he49afe7_0\n  - isis=7.1.0=0\n  - isl=0.25=hb486fe8_0\n  - jama=125=0\n  - jasper=2.0.33=h013e400_0\n  - jemalloc=5.2.1=he49afe7_6\n  - jpeg=9e=hac89ed1_2\n  - kakadu=1=0\n  - krb5=1.19.3=hb49756b_0\n  - lame=3.100=hb7f2c08_1003\n  - laszip=2.1.0_isis7=h01edc0c_1\n  - ld64_osx-64=609=hfd63004_11\n  - lerc=4.0.0=hb486fe8_0\n  - libblas=3.9.0=16_osx64_openblas\n  - libcblas=3.9.0=16_osx64_openblas\n  - libclang=14.0.6=default_h55ffa42_0\n  - libclang-cpp14=14.0.6=default_h55ffa42_0\n  - libclang13=14.0.6=default_hb5731bd_0\n  - libcurl=7.86.0=h57eb407_1\n  - libcxx=14.0.6=hccf4f1f_0\n  - libdeflate=1.14=hb7f2c08_0\n  - libedit=3.1.20191231=h0678c8f_2\n  - libelas=isis7=h01edc0c_0\n  - libev=4.33=haf1e3a3_1\n  - libevent=2.1.10=h815e4d9_4\n  - libffi=3.4.2=h0d85af4_5\n  - libgdal=3.5_isis7=h01edc0c_0\n  - libgfortran=5.0.0=9_5_0_h97931a8_26\n  - libgfortran-devel_osx-64=11.3.0=h824d247_27\n  - libgfortran5=11.3.0=h082f757_26\n  - libglib=2.74.1=h4c723e1_1\n  - libiconv=1.17=hac89ed1_0\n  - libidn2=2.3.4=hb7f2c08_0\n  - libjemalloc=5.2.1=he49afe7_6\n  - liblapack=3.9.0=16_osx64_openblas\n  - liblapacke=3.9.0=16_osx64_openblas\n  - liblas=1.8.2_isis7=h01edc0c_0\n  - libllvm14=14.0.6=h5b596cc_1\n  - libnabo=isis7=h01edc0c_0\n  - libnghttp2=1.47.0=h7cbc4dc_1\n  - libntlm=1.4=h0d85af4_1002\n  - libogg=1.3.4=h35c211d_1\n  - libopenblas=0.3.21=openmp_h429af6e_3\n  - libopencv=4.6.0=py39h743a0d3_4\n  - libopus=1.3.1=hc929b4f_1\n  - libpng=1.6.39=ha978bb4_0\n  - libpointmatcher=isis7=ha5a8b8e_0\n  - libpq=14.5=h4aa9af9_3\n  - libprotobuf=3.21.11=hbc0c0cd_0\n  - libsqlite=3.40.0=ha978bb4_0\n  - libssh2=1.10.0=h7535e13_3\n  - libtasn1=4.19.0=hb7f2c08_0\n  - libtiff=4.4.0=hdb44e8a_4\n  - libunistring=0.9.10=h0d85af4_0\n  - libuv=1.44.2=hac89ed1_0\n  - libvorbis=1.3.7=h046ec9c_0\n  - libvpx=1.11.0=he49afe7_3\n  - libwebp=1.2.4=hfa4350a_0\n  - libwebp-base=1.2.4=h775f41a_0\n  - libxcb=1.13=h0d85af4_1004\n  - libxml2=2.9.14=hea49891_4\n  - libzlib=1.2.13=hfd90126_4\n  - llvm-openmp=15.0.6=h61d9ccf_0\n  - llvm-tools=14.0.6=h5b596cc_1\n  - lz4-c=1.9.3=he49afe7_1\n  - macports-legacy-support=1.0.7=hb7f2c08_0\n  - mesalib=21.2.5=h2df1e00_3\n  - metis=5.1.0=h2e338ed_1006\n  - mpc=1.2.1=hbb51d92_0\n  - mpfr=4.1.0=h0f52abe_1\n  - multiview=asp3.2.0=py39h01edc0c_0\n  - mysql=8.0.31=h57ddcff_0\n  - mysql-client=8.0.31=hbbbc359_0\n  - mysql-common=8.0.31=h7ebae80_0\n  - mysql-connector-c=6.1.11=h0f02589_1007\n  - mysql-devel=8.0.31=h7ebae80_0\n  - mysql-libs=8.0.31=hc37e033_0\n  - mysql-server=8.0.31=ha134c4c_0\n  - nanoflann=1.4.2=h694c41f_0\n  - ncurses=6.3=h96cf925_1\n  - nettle=3.8.1=h96f3785_1\n  - networkx=2.8.8=pyhd8ed1ab_0\n  - nlohmann_json=3.11.2=hbbd2c75_0\n  - nn=1.86.0=h1de35cc_2003\n  - nspr=4.35=hea0b92c_0\n  - nss=3.78=ha8197d3_0\n  - numpy=1.23.5=py39hdfa1d0c_0\n  - openblas=0.3.21=openmp_hbefa662_3\n  - opencv=4.6.0=py39h6e9494a_4\n  - openexr=2.5.5=h7fa7ffa_0\n  - openh264=2.3.0=hb486fe8_0\n  - openjpeg=2.3.0=h3bf0609_1003\n  - openssl=1.1.1s=hfd90126_1\n  - p11-kit=0.24.1=h65f8906_0\n  - parallel=20221122=h694c41f_0\n  - pbzip2=1.1.13=h9d27c22_1\n  - pcl=1.11.1=h7984e4d_1\n  - pcre2=10.40=h1c4e4bc_0\n  - perl=5.32.1=2_h0d85af4_perl5\n  - pip=22.3.1=pyhd8ed1ab_0\n  - pixman=0.40.0=hbcb3906_0\n  - proj=9.1.0=hcbd9701_0\n  - protobuf=4.21.11=py39h7a8716b_0\n  - pthread-stubs=0.4=hc929b4f_1001\n  - pvl=1.3.2=pyhd8ed1ab_0\n  - py-opencv=4.6.0=py39h71a6800_4\n  - python=3.9.15=h531fd05_0_cpython\n  - python-dateutil=2.8.2=pyhd8ed1ab_0\n  - python_abi=3.9=3_cp39\n  - pytz=2022.6=pyhd8ed1ab_0\n  - pyyaml=6.0=py39ha30fb19_5\n  - qhull=2020.2=h940c156_2\n  - qt=5.15.4=hb3ad848_0\n  - qt-main=5.15.4=h938c29d_2\n  - qt-webengine=5.15.4=h72ca1e5_3\n  - qwt=6.2.0=h4cc5820_4\n  - rapidjson=1.1.0=hb1e8313_1002\n  - readline=8.1.2=h3899abd_0\n  - rhash=1.4.3=hac89ed1_0\n  - rocksdb=6.13.3=hbb73eaa_2\n  - s2p-subset=isis7=h01edc0c_0\n  - scipy=1.9.3=py39h8a15683_2\n  - setuptools=65.5.1=pyhd8ed1ab_0\n  - sigtool=0.1.3=h57ddcff_0\n  - six=1.16.0=pyh6c4a22f_0\n  - snappy=1.1.9=h225ccf5_2\n  - spiceypy=5.1.2=pyhd8ed1ab_0\n  - sqlite=3.40.0=h9ae0607_0\n  - suitesparse=5.10.1=h7aff33d_1\n  - superlu=5.2.2=h1f0f902_0\n  - svt-av1=1.2.1=hbbd2c75_0\n  - tapi=1100.0.11=h9ce4665_0\n  - tbb=2021.7.0=hb8565cd_1\n  - tbb-devel=2021.7.0=hb8565cd_1\n  - tk=8.6.12=h5dbffcc_0\n  - tnt=126=0\n  - tzdata=2022g=h191b570_0\n  - usgscsm=1.6.0=hb8565cd_1\n  - wheel=0.38.4=pyhd8ed1ab_0\n  - x264=1!164.3095=h775f41a_2\n  - x265=3.5=hbb4e6a2_3\n  - xerces-c=3.2.3=hf5b2a72_5\n  - xorg-damageproto=1.2.1=h0d85af4_1002\n  - xorg-fixesproto=5.0=h0d85af4_1002\n  - xorg-glproto=1.4.17=h0d85af4_1002\n  - xorg-inputproto=2.3.2=h35c211d_1002\n  - xorg-kbproto=1.0.7=h35c211d_1002\n  - xorg-libice=1.0.10=h0d85af4_0\n  - xorg-libsm=1.2.3=h0d85af4_1000\n  - xorg-libx11=1.7.2=h0d85af4_0\n  - xorg-libxau=1.0.9=h35c211d_0\n  - xorg-libxdamage=1.1.5=h0d85af4_1\n  - xorg-libxdmcp=1.1.3=h35c211d_0\n  - xorg-libxext=1.3.4=h0d85af4_1\n  - xorg-libxfixes=5.0.3=h0d85af4_1004\n  - xorg-libxi=1.7.10=h0d85af4_0\n  - xorg-libxrandr=1.5.2=h0d85af4_1\n  - xorg-libxrender=0.9.10=h0d85af4_1003\n  - xorg-randrproto=1.5.0=h0d85af4_1001\n  - xorg-renderproto=0.11.1=h0d85af4_1002\n  - xorg-util-macros=1.19.3=h35c211d_0\n  - xorg-xextproto=7.3.0=h35c211d_1002\n  - xorg-xf86vidmodeproto=2.3.1=h0d85af4_1002\n  - xorg-xproto=7.0.31=h35c211d_1007\n  - xz=5.2.6=h775f41a_0\n  - yaml=0.2.5=h0d85af4_2\n  - zlib=1.2.13=hfd90126_4\n  - zstd=1.5.2=hfa58983_4\n\n"
  },
  {
    "path": "conda/asp_deps_3.3.0_linux_env.yaml",
    "content": "name: asp_deps\nchannels:\n  - nasa-ames-stereo-pipeline\n  - usgs-astrogeology\n  - conda-forge\n  - defaults\ndependencies:\n  - _libgcc_mutex=0.1=conda_forge\n  - _openmp_mutex=4.5=2_kmp_llvm\n  - _sysroot_linux-64_curr_repodata_hack=3=h69a702a_13\n  - ale=0.9.1=py39h7633fee_0\n  - alsa-lib=1.2.7.2=h166bdaf_0\n  - aom=3.5.0=h27087fc_0\n  - armadillo=12.6.1=h0a193a4_0\n  - arpack=3.7.0=hdefa2d7_2\n  - blas=2.117=openblas\n  - blas-devel=3.9.0=17_linux64_openblas\n  - boost=1.72.0=py39ha90915f_1\n  - boost-cpp=1.72.0=h359cf19_6\n  - brotli-python=1.1.0=py39h3d6467e_0\n  - bullet=2.86.1=0\n  - bz2file=0.98=py_0\n  - bzip2=1.0.8=h7f98852_4\n  - c-ares=1.19.1=hd590300_0\n  - ca-certificates=2023.7.22=hbcca054_0\n  - cairo=1.16.0=ha12eb4b_1010\n  - ceres-solver=1.14.0=hf302a74_15\n  - certifi=2023.7.22=pyhd8ed1ab_0\n  - charset-normalizer=3.2.0=pyhd8ed1ab_0\n  - chrpath=0.16=h7f98852_1002\n  - csm=3.0.3.3=hc9558a2_0\n  - cspice=67=h166bdaf_4\n  - curl=7.87.0=h6312ad2_0\n  - cyrus-sasl=2.1.27=h957375c_6\n  - dbus=1.13.6=h5008d03_3\n  - eigen=3.4.0=h00ab1b0_0\n  - elfutils=0.188=hbb17bd0_0\n  - embree=2.17.7=ha770c72_3\n  - expat=2.5.0=hcb278e6_1\n  - ffmpeg=4.4.2=gpl_hbd009f3_109\n  - fftw=3.3.10=nompi_hc118613_108\n  - fgr=isis7=h3fd9d12_0\n  - flann=1.9.1=hfe772e8_1010\n  - font-ttf-dejavu-sans-mono=2.37=hab24e00_0\n  - font-ttf-inconsolata=3.000=h77eed37_0\n  - font-ttf-source-code-pro=2.038=h77eed37_0\n  - font-ttf-ubuntu=0.83=hab24e00_0\n  - fontconfig=2.14.2=h14ed4e7_0\n  - fonts-conda-ecosystem=1=0\n  - fonts-conda-forge=1=0\n  - freeglut=3.2.2=h9c3ff4c_1\n  - freetype=2.12.1=hca18f0e_1\n  - geoid=1.0_isis7=1\n  - geos=3.9.1=h9c3ff4c_2\n  - geotiff=1.7.1=ha76d385_4\n  - gettext=0.21.1=h27087fc_0\n  - gflags=2.2.2=he1b5a44_1004\n  - giflib=5.2.1=h0b41bf4_3\n  - glib=2.76.4=hfc55251_0\n  - glib-tools=2.76.4=hfc55251_0\n  - glog=0.6.0=h6f12383_0\n  - gmp=6.2.1=h58526e2_0\n  - gnutls=3.7.8=hf3e180e_0\n  - graphite2=1.3.13=h58526e2_1001\n  - gsl=2.6=he838d99_2\n  - gst-plugins-base=1.20.3=h57caac4_2\n  - gstreamer=1.20.3=hd4edc92_2\n  - harfbuzz=4.2.0=h40b6f09_0\n  - hdf5=1.12.1=nompi_h2386368_104\n  - htdp=1.0_isis7=1\n  - icu=69.1=h9c3ff4c_0\n  - idna=3.4=pyhd8ed1ab_0\n  - ilmbase=2.5.5=h780b84a_0\n  - inja=3.3.0=h9c3ff4c_0\n  - isis=8.0.0=np125_0\n  - jama=125=0\n  - jasper=2.0.33=h0ff4b12_1\n  - jemalloc=5.3.0=hcb278e6_0\n  - jpeg=9e=h0b41bf4_3\n  - kakadu=1=0\n  - kernel-headers_linux-64=3.10.0=h4a8ded7_13\n  - keyutils=1.6.1=h166bdaf_0\n  - krb5=1.20.1=hf9c8cef_0\n  - lame=3.100=h166bdaf_1003\n  - laszip=2.1.0_isis7=h3fd9d12_1\n  - ld_impl_linux-64=2.40=h41732ed_0\n  - lerc=4.0.0=h27087fc_0\n  - libarchive=3.5.2=hb890918_3\n  - libblas=3.9.0=17_linux64_openblas\n  - libcblas=3.9.0=17_linux64_openblas\n  - libclang=13.0.1=default_h7634d5b_3\n  - libcurl=7.87.0=h6312ad2_0\n  - libcxx=16.0.6=h00ab1b0_0\n  - libcxxabi=16.0.6=ha770c72_0\n  - libdeflate=1.14=h166bdaf_0\n  - libdrm=2.4.114=h166bdaf_0\n  - libdrm-cos6-x86_64=2.4.65=4\n  - libedit=3.1.20191231=he28a2e2_2\n  - libelas=isis7=h3fd9d12_0\n  - libev=4.33=h516909a_1\n  - libevent=2.1.10=h9b69904_4\n  - libexpat=2.5.0=hcb278e6_1\n  - libffi=3.4.2=h7f98852_5\n  - libgcc-ng=13.1.0=he5830b7_0\n  - libgdal=3.5_isis8=h3fd9d12_0\n  - libgfortran-ng=13.1.0=h69a702a_0\n  - libgfortran5=13.1.0=h15d22d2_0\n  - libglib=2.76.4=hebfc3b9_0\n  - libglu=9.0.0=he1b5a44_1001\n  - libglvnd-cos7-x86_64=1.0.1=h9b0a68f_1105\n  - libhwloc=2.8.0=h32351e8_1\n  - libiconv=1.17=h166bdaf_0\n  - libidn2=2.3.4=h166bdaf_0\n  - libjemalloc=5.3.0=hcb278e6_0\n  - liblapack=3.9.0=17_linux64_openblas\n  - liblapacke=3.9.0=17_linux64_openblas\n  - liblas=1.8.2_isis8=h3fd9d12_0\n  - libllvm13=13.0.1=hf817b99_2\n  - libmicrohttpd=0.9.77=h97afed2_0\n  - libnabo=isis7=h3fd9d12_0\n  - libnghttp2=1.51.0=hdcd2b5c_0\n  - libnsl=2.0.0=h7f98852_0\n  - libntlm=1.4=h7f98852_1002\n  - libogg=1.3.4=h7f98852_1\n  - libopenblas=0.3.23=pthreads_h80387f5_0\n  - libopencv=4.5.5=py39hb0e02d1_7\n  - libopus=1.3.1=h7f98852_1\n  - libpciaccess=0.17=h166bdaf_0\n  - libpng=1.6.39=h753d276_0\n  - libpointmatcher=isis7=h2bc3f7f_0\n  - libpq=14.5=h2baec63_5\n  - libprotobuf=3.19.6=h3eb15da_0\n  - libsqlite=3.43.0=h2797004_0\n  - libssh2=1.10.0=haa6b8db_3\n  - libstdcxx-ng=13.1.0=hfd8a6a1_0\n  - libtasn1=4.19.0=h166bdaf_0\n  - libtiff=4.4.0=h82bc61c_5\n  - libunistring=0.9.10=h7f98852_0\n  - libuuid=2.38.1=h0b41bf4_0\n  - libva=2.18.0=h0b41bf4_0\n  - libvorbis=1.3.7=h9c3ff4c_0\n  - libvpx=1.11.0=h9c3ff4c_3\n  - libwebp-base=1.3.1=hd590300_0\n  - libx11-common-cos6-x86_64=1.6.4=4\n  - libx11-cos6-x86_64=1.6.4=4\n  - libxcb=1.13=h7f98852_1004\n  - libxkbcommon=1.0.3=he3ba5ed_0\n  - libxml2=2.9.14=haae042b_4\n  - libzlib=1.2.13=hd590300_5\n  - llvm-openmp=16.0.6=h4dfa4b3_0\n  - lz4-c=1.9.3=h9c3ff4c_1\n  - lzo=2.10=h516909a_1000\n  - mesa-libgl-cos6-x86_64=11.0.7=4\n  - mesalib=23.0.0=h0fe20ba_0\n  - metis=5.1.0=h59595ed_1007\n  - mpfr=4.2.0=hb012696_0\n  - multiview=isis8=py39h3fd9d12_0\n  - mysql=8.0.28=h3e2b116_2\n  - mysql-client=8.0.28=hf89ab62_2\n  - mysql-common=8.0.28=haf5c9bc_2\n  - mysql-connector-c=6.1.11=h6eb9d5d_1007\n  - mysql-devel=8.0.28=haf5c9bc_2\n  - mysql-libs=8.0.28=h28c427c_2\n  - mysql-server=8.0.28=hb253900_2\n  - nanoflann=1.4.2=ha770c72_0\n  - ncurses=6.4=hcb278e6_0\n  - nettle=3.8.1=hc379101_1\n  - networkx=3.1=pyhd8ed1ab_0\n  - nlohmann_json=3.11.2=h27087fc_0\n  - nn=1.86.0=hd590300_2003\n  - nspr=4.35=h27087fc_0\n  - nss=3.92=h1d7d5a4_0\n  - numpy=1.25.2=py39h6183b62_0\n  - openblas=0.3.23=pthreads_h855a84d_0\n  - opencv=4.5.5=py39hf3d152e_7\n  - openexr=2.5.5=hf817b99_0\n  - openh264=2.3.1=hcb278e6_2\n  - openjpeg=2.3.0=hf38bd82_1003\n  - openssl=1.1.1v=hd590300_0\n  - p11-kit=0.24.1=hc5aa10d_0\n  - packaging=23.1=pyhd8ed1ab_0\n  - parallel=20230722=ha770c72_0\n  - pbzip2=1.1.13=0\n  - pcl=1.11.1=h05311af_1\n  - pcre2=10.40=hc3806b6_0\n  - perl=5.32.1=4_hd590300_perl5\n  - pip=23.2.1=pyhd8ed1ab_0\n  - pixman=0.40.0=h36c2ea0_0\n  - platformdirs=3.10.0=pyhd8ed1ab_0\n  - pooch=1.7.0=pyha770c72_3\n  - proj=9.1.0=h93bde94_0\n  - protobuf=3.19.6=py39h227be39_0\n  - pthread-stubs=0.4=h36c2ea0_1001\n  - pvl=1.3.2=pyhd8ed1ab_0\n  - py-opencv=4.5.5=py39hef51801_7\n  - pysocks=1.7.1=pyha2e5f31_6\n  - python=3.9.15=h47a2c10_0_cpython\n  - python-dateutil=2.8.2=pyhd8ed1ab_0\n  - python_abi=3.9=3_cp39\n  - pytz=2023.3.post1=pyhd8ed1ab_0\n  - pyyaml=6.0.1=py39hd1e30aa_0\n  - qhull=2020.2=h4bd325d_2\n  - qt=5.12.9=h1304e3e_6\n  - qwt=6.2.0=hb19a904_2\n  - rapidjson=1.1.0=he1b5a44_1002\n  - rclone=1.63.1=h519d9b9_0\n  - readline=8.2=h8228510_1\n  - requests=2.31.0=pyhd8ed1ab_0\n  - rocksdb=6.13.3=hda8cf21_2\n  - s2p-subset=isis7=h3fd9d12_0\n  - scipy=1.11.2=py39h6183b62_0\n  - setuptools=68.1.2=pyhd8ed1ab_0\n  - six=1.16.0=pyh6c4a22f_0\n  - spiceypy=6.0.0=pyhd8ed1ab_0\n  - sqlite=3.43.0=h2c6b66d_0\n  - suitesparse=5.10.1=h9e50725_1\n  - superlu=5.2.2=h00795ac_0\n  - svt-av1=1.3.0=h27087fc_0\n  - sysroot_linux-64=2.17=h4a8ded7_13\n  - tbb=2021.7.0=h924138e_1\n  - tbb-devel=2021.7.0=h924138e_1\n  - tk=8.6.12=h27826a3_0\n  - tnt=126=0\n  - typing-extensions=4.7.1=hd8ed1ab_0\n  - typing_extensions=4.7.1=pyha770c72_0\n  - tzdata=2023c=h71feb2d_0\n  - urllib3=2.0.4=pyhd8ed1ab_0\n  - usgscsm=1.7.0=h00ab1b0_1\n  - wheel=0.41.2=pyhd8ed1ab_0\n  - x264=1!164.3095=h166bdaf_2\n  - x265=3.5=h924138e_3\n  - xerces-c=3.2.3=h8ce2273_4\n  - xorg-damageproto=1.2.1=h7f98852_1002\n  - xorg-fixesproto=5.0=h7f98852_1002\n  - xorg-glproto=1.4.17=h7f98852_1002\n  - xorg-inputproto=2.3.2=h7f98852_1002\n  - xorg-kbproto=1.0.7=h7f98852_1002\n  - xorg-libice=1.1.1=hd590300_0\n  - xorg-libsm=1.2.4=h7391055_0\n  - xorg-libx11=1.8.4=h0b41bf4_0\n  - xorg-libxau=1.0.11=hd590300_0\n  - xorg-libxdamage=1.1.5=h7f98852_1\n  - xorg-libxdmcp=1.1.3=h7f98852_0\n  - xorg-libxext=1.3.4=h0b41bf4_2\n  - xorg-libxfixes=5.0.3=h7f98852_1004\n  - xorg-libxi=1.7.10=h7f98852_0\n  - xorg-libxrandr=1.5.2=h7f98852_1\n  - xorg-libxrender=0.9.10=h7f98852_1003\n  - xorg-randrproto=1.5.0=h7f98852_1001\n  - xorg-renderproto=0.11.1=h7f98852_1002\n  - xorg-util-macros=1.19.3=h7f98852_0\n  - xorg-xextproto=7.3.0=h0b41bf4_1003\n  - xorg-xf86vidmodeproto=2.3.1=h7f98852_1002\n  - xorg-xproto=7.0.31=h7f98852_1007\n  - xz=5.2.6=h166bdaf_0\n  - yaml=0.2.5=h7f98852_2\n  - zlib=1.2.13=hd590300_5\n  - zstd=1.5.5=hfc55251_0\n"
  },
  {
    "path": "conda/asp_deps_3.3.0_osx_env.yaml",
    "content": "name: asp_deps\nchannels:\n  - nasa-ames-stereo-pipeline\n  - usgs-astrogeology\n  - conda-forge\n  - defaults\ndependencies:\n  - ale=0.9.1=py39h8ee36c8_0\n  - aom=3.5.0=hf0c8a7f_0\n  - armadillo=12.6.1=hdc495e4_0\n  - arpack=3.7.0=hefb7bc6_2\n  - blas=2.117=openblas\n  - blas-devel=3.9.0=17_osx64_openblas\n  - boost=1.72.0=py39hb64e6f8_1\n  - boost-cpp=1.72.0=hf3dc895_6\n  - brotli-python=1.1.0=py39h840bb9f_0\n  - bullet=2.86.1=0\n  - bz2file=0.98=py_0\n  - bzip2=1.0.8=h0d85af4_4\n  - c-ares=1.19.1=h0dc2134_0\n  - c-compiler=1.5.2=hbf74d83_0\n  - ca-certificates=2023.7.22=h8857fd0_0\n  - cairo=1.16.0=h9e0e54b_1010\n  - cctools=973.0.1=h76f1dac_13\n  - cctools_osx-64=973.0.1=hcc6d90d_13\n  - ceres-solver=1.14.0=h636452b_15\n  - certifi=2023.7.22=pyhd8ed1ab_0\n  - charset-normalizer=3.2.0=pyhd8ed1ab_0\n  - clang=14.0.6=h694c41f_1\n  - clang-14=14.0.6=default_hdb78580_1\n  - clang_osx-64=14.0.6=h3113cd8_6\n  - clangxx=14.0.6=default_hdb78580_1\n  - clangxx_osx-64=14.0.6=h6f97653_6\n  - cmake=3.27.4=hf40c264_4\n  - compiler-rt=14.0.6=h613da45_0\n  - compiler-rt_osx-64=14.0.6=hab78ec2_0\n  - compilers=1.5.2=h694c41f_0\n  - csm=3.0.3.3=0\n  - cspice=67=hb7f2c08_4\n  - curl=8.2.1=h5f667d7_0\n  - cxx-compiler=1.5.2=hb8565cd_0\n  - cyrus-sasl=2.1.27=hf9bab2b_7\n  - eigen=3.4.0=h1c7c39f_0\n  - embree=2.17.7=h694c41f_3\n  - expat=2.5.0=hf0c8a7f_1\n  - ffmpeg=4.4.2=gpl_hff0bab5_109\n  - fftw=3.3.10=nompi_h4fa670e_108\n  - fgr=isis7=h01edc0c_0\n  - flann=1.9.1=h30321d8_1010\n  - font-ttf-dejavu-sans-mono=2.37=hab24e00_0\n  - font-ttf-inconsolata=3.000=h77eed37_0\n  - font-ttf-source-code-pro=2.038=h77eed37_0\n  - font-ttf-ubuntu=0.83=hab24e00_0\n  - fontconfig=2.14.2=h5bb23bf_0\n  - fonts-conda-ecosystem=1=0\n  - fonts-conda-forge=1=0\n  - fortran-compiler=1.5.2=haad3a49_0\n  - freetype=2.12.1=h3f81eb7_1\n  - geoid=1.0_isis7=1\n  - geos=3.9.1=he49afe7_2\n  - geotiff=1.7.1=he29fd1c_4\n  - gettext=0.21.1=h8a4c099_0\n  - gflags=2.2.2=hb1e8313_1004\n  - gfortran=11.4.0=h2c809b3_1\n  - gfortran_impl_osx-64=11.4.0=h2a33dde_1\n  - gfortran_osx-64=11.4.0=h18f7dce_1\n  - giflib=5.2.1=hb7f2c08_3\n  - glog=0.6.0=h8ac2a54_0\n  - gmp=6.2.1=h2e338ed_0\n  - gnutls=3.7.8=h207c4f0_0\n  - graphite2=1.3.13=h2e338ed_1001\n  - gsl=2.6=h71c5fe9_2\n  - harfbuzz=4.2.0=h48644e2_0\n  - hdf5=1.12.1=nompi_h0aa1fa2_104\n  - htdp=1.0_isis7=1\n  - icu=69.1=he49afe7_0\n  - idna=3.4=pyhd8ed1ab_0\n  - ilmbase=2.5.5=hfab91a5_0\n  - inja=3.3.0=he49afe7_0\n  - isis=8.0.0=np125_0\n  - isl=0.25=hb486fe8_0\n  - jama=125=0\n  - jasper=2.0.33=h7c6fec8_1\n  - jemalloc=5.3.0=hf0c8a7f_0\n  - jpeg=9e=hb7f2c08_3\n  - kakadu=1=0\n  - krb5=1.21.1=hb884880_0\n  - lame=3.100=hb7f2c08_1003\n  - laszip=2.1.0_isis7=h01edc0c_1\n  - ld64=609=hc6ad406_13\n  - ld64_osx-64=609=hfd63004_13\n  - lerc=4.0.0=hb486fe8_0\n  - libblas=3.9.0=17_osx64_openblas\n  - libcblas=3.9.0=17_osx64_openblas\n  - libclang=13.0.1=root_62804_h2961583_3\n  - libclang-cpp14=14.0.6=default_hdb78580_1\n  - libcurl=8.2.1=h5f667d7_0\n  - libcxx=16.0.6=hd57cbcb_0\n  - libdeflate=1.14=hb7f2c08_0\n  - libedit=3.1.20191231=h0678c8f_2\n  - libelas=isis7=h01edc0c_0\n  - libev=4.33=haf1e3a3_1\n  - libevent=2.1.10=h7d65743_4\n  - libexpat=2.5.0=hf0c8a7f_1\n  - libffi=3.4.2=h0d85af4_5\n  - libgdal=3.5_isis8=hf8dc8b4_0\n  - libgfortran=5.0.0=12_3_0_h97931a8_1\n  - libgfortran-devel_osx-64=11.4.0=h01aa347_1\n  - libgfortran5=12.3.0=hbd3c1fe_1\n  - libglib=2.76.4=hc62aa5d_0\n  - libiconv=1.17=hac89ed1_0\n  - libidn2=2.3.4=hb7f2c08_0\n  - libjemalloc=5.3.0=hf0c8a7f_0\n  - liblapack=3.9.0=17_osx64_openblas\n  - liblapacke=3.9.0=17_osx64_openblas\n  - liblas=1.8.2_isis8=hf8dc8b4_0\n  - libllvm13=13.0.1=h64f94b2_2\n  - libllvm14=14.0.6=hc8e404f_4\n  - libnabo=isis7=h01edc0c_0\n  - libnghttp2=1.52.0=he2ab024_0\n  - libntlm=1.4=h0d85af4_1002\n  - libopenblas=0.3.23=openmp_h429af6e_0\n  - libopencv=4.5.5=py39hc2bf5a6_7\n  - libpng=1.6.39=ha978bb4_0\n  - libpointmatcher=isis7=ha5a8b8e_0\n  - libpq=14.5=h3df487d_7\n  - libprotobuf=3.19.6=hbc0c0cd_0\n  - libsqlite=3.42.0=h58db7d2_0\n  - libssh2=1.11.0=hd019ec5_0\n  - libtasn1=4.19.0=hb7f2c08_0\n  - libtiff=4.4.0=h6268bbc_5\n  - libunistring=0.9.10=h0d85af4_0\n  - libuv=1.46.0=h0c2f820_0\n  - libvpx=1.11.0=he49afe7_3\n  - libwebp-base=1.3.1=h0dc2134_0\n  - libxcb=1.15=hb7f2c08_0\n  - libxml2=2.9.14=h1faee8b_4\n  - libzlib=1.2.13=h8a1eda9_5\n  - llvm-openmp=16.0.6=hff08bdf_0\n  - llvm-tools=14.0.6=hc8e404f_4\n  - lz4-c=1.9.3=he49afe7_1\n  - macports-legacy-support=1.0.13=h0dc2134_0\n  - mesalib=23.1.4=hb59017c_0\n  - metis=5.1.0=he965462_1007\n  - mpc=1.3.1=h81bd1dd_0\n  - mpfr=4.2.0=h4f9bd69_0\n  - multiview=isis8=py39hf8dc8b4_0\n  - mysql=8.0.28=h88f4db0_2\n  - mysql-client=8.0.28=h7ddd48c_2\n  - mysql-common=8.0.28=hdd8d184_2\n  - mysql-devel=8.0.28=hdd8d184_2\n  - mysql-libs=8.0.28=h353f102_2\n  - mysql-server=8.0.28=h6edde1b_2\n  - nanoflann=1.4.2=h694c41f_0\n  - ncurses=6.4=hf0c8a7f_0\n  - nettle=3.8.1=h96f3785_1\n  - networkx=3.1=pyhd8ed1ab_0\n  - nlohmann_json=3.11.2=hbbd2c75_0\n  - nn=1.86.0=h0dc2134_2003\n  - nspr=4.35=hea0b92c_0\n  - nss=3.92=hd6ac835_0\n  - numpy=1.25.2=py39h892e69a_0\n  - openblas=0.3.23=openmp_hbefa662_0\n  - opencv=4.5.5=py39h6e9494a_7\n  - openexr=2.5.5=h7fa7ffa_0\n  - openh264=2.3.1=hf0c8a7f_2\n  - openjpeg=2.3.0=h3bf0609_1003\n  - openssl=3.1.2=h8a1eda9_0\n  - p11-kit=0.24.1=h65f8906_0\n  - packaging=23.1=pyhd8ed1ab_0\n  - parallel=20230722=h694c41f_0\n  - pbzip2=1.1.13=h9d27c22_1\n  - pcl=1.11.1=h7984e4d_1\n  - pcre2=10.40=h1c4e4bc_0\n  - perl=5.32.1=4_h0dc2134_perl5\n  - pip=23.2.1=pyhd8ed1ab_0\n  - pixman=0.40.0=hbcb3906_0\n  - platformdirs=3.10.0=pyhd8ed1ab_0\n  - pooch=1.7.0=pyha770c72_3\n  - proj=9.1.0=hcbd9701_0\n  - protobuf=3.19.6=py39h7a8716b_0\n  - pthread-stubs=0.4=hc929b4f_1001\n  - pvl=1.3.2=pyhd8ed1ab_0\n  - py-opencv=4.5.5=py39h71a6800_7\n  - pysocks=1.7.1=pyha2e5f31_6\n  - python=3.9.17=h07e1443_0_cpython\n  - python-dateutil=2.8.2=pyhd8ed1ab_0\n  - python_abi=3.9=3_cp39\n  - pytz=2023.3.post1=pyhd8ed1ab_0\n  - pyyaml=6.0.1=py39hdc70f33_0\n  - qhull=2020.2=h940c156_2\n  - qt=5.12.9=h2a607e2_5\n  - qwt=6.2.0=h0f3c874_2\n  - rapidjson=1.1.0=hb1e8313_1002\n  - rclone=1.63.1=h1762f63_0\n  - readline=8.2=h9e318b2_1\n  - requests=2.31.0=pyhd8ed1ab_0\n  - rhash=1.4.4=h0dc2134_0\n  - rocksdb=6.13.3=hbb73eaa_2\n  - s2p-subset=isis7=h01edc0c_0\n  - scipy=1.11.2=py39hded996c_0\n  - setuptools=68.1.2=pyhd8ed1ab_0\n  - sigtool=0.1.3=h88f4db0_0\n  - six=1.16.0=pyh6c4a22f_0\n  - snappy=1.1.10=h225ccf5_0\n  - spiceypy=6.0.0=pyhd8ed1ab_0\n  - sqlite=3.42.0=h2b0dec6_0\n  - suitesparse=5.10.1=h7aff33d_1\n  - superlu=5.2.2=h1f0f902_0\n  - svt-av1=1.3.0=hf0c8a7f_0\n  - tapi=1100.0.11=h9ce4665_0\n  - tbb=2021.10.0.custom_asp=h6b95b14_0\n  - tbb-devel=2021.10.0.custom_asp=h6b95b14_0\n  - tk=8.6.12=h5dbffcc_0\n  - tnt=126=0\n  - typing-extensions=4.7.1=hd8ed1ab_0\n  - typing_extensions=4.7.1=pyha770c72_0\n  - tzdata=2023c=h71feb2d_0\n  - urllib3=2.0.4=pyhd8ed1ab_0\n  - usgscsm=1.7.0=h1c7c39f_1\n  - wheel=0.41.2=pyhd8ed1ab_0\n  - x264=1!164.3095=h775f41a_2\n  - x265=3.5=hbb4e6a2_3\n  - xerces-c=3.2.3=h6564042_4\n  - xorg-damageproto=1.2.1=h0d85af4_1002\n  - xorg-fixesproto=5.0=h0d85af4_1002\n  - xorg-glproto=1.4.17=h0d85af4_1002\n  - xorg-inputproto=2.3.2=h35c211d_1002\n  - xorg-kbproto=1.0.7=h35c211d_1002\n  - xorg-libice=1.1.1=h0dc2134_0\n  - xorg-libsm=1.2.4=h0dc2134_0\n  - xorg-libx11=1.8.6=hbd0b022_0\n  - xorg-libxau=1.0.11=h0dc2134_0\n  - xorg-libxdamage=1.1.5=h0d85af4_1\n  - xorg-libxdmcp=1.1.3=h35c211d_0\n  - xorg-libxext=1.3.4=hb7f2c08_2\n  - xorg-libxfixes=5.0.3=h0d85af4_1004\n  - xorg-libxi=1.7.10=h0d85af4_0\n  - xorg-libxrandr=1.5.2=h0d85af4_1\n  - xorg-libxrender=0.9.11=h0dc2134_0\n  - xorg-randrproto=1.5.0=h0d85af4_1001\n  - xorg-renderproto=0.11.1=h0d85af4_1002\n  - xorg-util-macros=1.19.3=h35c211d_0\n  - xorg-xextproto=7.3.0=hb7f2c08_1003\n  - xorg-xf86vidmodeproto=2.3.1=h0d85af4_1002\n  - xorg-xproto=7.0.31=h35c211d_1007\n  - xz=5.2.6=h775f41a_0\n  - yaml=0.2.5=h0d85af4_2\n  - zlib=1.2.13=h8a1eda9_5\n  - zstd=1.5.5=h829000d_0\n"
  },
  {
    "path": "conda/asp_deps_3.4.0_alpha_linux_env.yaml",
    "content": "name: asp_deps_3.4.0_alpha\nchannels:\n  - nasa-ames-stereo-pipeline\n  - usgs-astrogeology\n  - conda-forge\ndependencies:\n  - _libgcc_mutex=0.1=conda_forge\n  - _openmp_mutex=4.5=2_kmp_llvm\n  - _sysroot_linux-64_curr_repodata_hack=3=h69a702a_13\n  - ale=0.9.1=py39h7633fee_1\n  - alsa-lib=1.2.7.2=h166bdaf_0\n  - aom=3.5.0=h27087fc_0\n  - armadillo=12.6.1=h0a193a4_0\n  - arpack=3.7.0=hdefa2d7_2\n  - binutils=2.40=hdd6e379_0\n  - binutils_impl_linux-64=2.40=hf600244_0\n  - binutils_linux-64=2.40=hbdbef99_1\n  - blas=2.117=openblas\n  - blas-devel=3.9.0=17_linux64_openblas\n  - boost=1.72.0=py39ha90915f_1\n  - boost-cpp=1.72.0=h359cf19_6\n  - brotli-python=1.1.0=py39h3d6467e_0\n  - bullet=2.86.1=0\n  - bz2file=0.98=py_0\n  - bzip2=1.0.8=h7f98852_4\n  - c-ares=1.19.1=hd590300_0\n  - c-compiler=1.6.0=hd590300_0\n  - ca-certificates=2023.7.22=hbcca054_0\n  - cairo=1.16.0=ha12eb4b_1010\n  - ceres-solver=1.14.0=hf302a74_15\n  - certifi=2023.7.22=pyhd8ed1ab_0\n  - charset-normalizer=3.2.0=pyhd8ed1ab_0\n  - chrpath=0.16=h7f98852_1002\n  - cmake=3.25.2=h077f3f9_0\n  - compilers=1.6.0=ha770c72_0\n  - csm=3.0.3.3=hc9558a2_0\n  - cspice=67=h166bdaf_4\n  - curl=7.87.0=h6312ad2_0\n  - cxx-compiler=1.6.0=h00ab1b0_0\n  - cyrus-sasl=2.1.27=h957375c_6\n  - dbus=1.13.6=h5008d03_3\n  - eigen=3.4.0=h00ab1b0_0\n  - elfutils=0.188=hbb17bd0_0\n  - embree=2.17.7=ha770c72_3\n  - expat=2.5.0=hcb278e6_1\n  - ffmpeg=4.4.2=gpl_hbd009f3_109\n  - fftw=3.3.10=nompi_hc118613_108\n  - fgr=isis7=h3fd9d12_0\n  - flann=1.9.1=hfe772e8_1010\n  - font-ttf-dejavu-sans-mono=2.37=hab24e00_0\n  - font-ttf-inconsolata=3.000=h77eed37_0\n  - font-ttf-source-code-pro=2.038=h77eed37_0\n  - font-ttf-ubuntu=0.83=hab24e00_0\n  - fontconfig=2.14.2=h14ed4e7_0\n  - fonts-conda-ecosystem=1=0\n  - fonts-conda-forge=1=0\n  - fortran-compiler=1.6.0=heb67821_0\n  - freeglut=3.2.2=h9c3ff4c_1\n  - freetype=2.12.1=hca18f0e_1\n  - gcc=12.3.0=h8d2909c_1\n  - gcc_impl_linux-64=12.3.0=he2b93b0_0\n  - gcc_linux-64=12.3.0=h76fc315_1\n  - geoid=1.0_isis7=1\n  - geos=3.9.1=h9c3ff4c_2\n  - geotiff=1.7.1=ha76d385_4\n  - gettext=0.21.1=h27087fc_0\n  - gflags=2.2.2=he1b5a44_1004\n  - gfortran=12.3.0=h499e0f7_1\n  - gfortran_impl_linux-64=12.3.0=hfcedea8_0\n  - gfortran_linux-64=12.3.0=h7fe76b4_1\n  - giflib=5.2.1=h0b41bf4_3\n  - glib=2.76.4=hfc55251_0\n  - glib-tools=2.76.4=hfc55251_0\n  - glog=0.6.0=h6f12383_0\n  - gmp=6.2.1=h58526e2_0\n  - gnutls=3.7.8=hf3e180e_0\n  - graphite2=1.3.13=h58526e2_1001\n  - gsl=2.6=he838d99_2\n  - gst-plugins-base=1.20.3=h57caac4_2\n  - gstreamer=1.20.3=hd4edc92_2\n  - gxx=12.3.0=h8d2909c_1\n  - gxx_impl_linux-64=12.3.0=he2b93b0_0\n  - gxx_linux-64=12.3.0=h8a814eb_1\n  - harfbuzz=4.2.0=h40b6f09_0\n  - hdf5=1.12.1=nompi_h2386368_104\n  - htdp=1.0_isis7=1\n  - icu=69.1=h9c3ff4c_0\n  - idna=3.4=pyhd8ed1ab_0\n  - ilmbase=2.5.5=h780b84a_0\n  - inja=3.3.0=h9c3ff4c_0\n  - isis=8.0.0=np125_0\n  - jama=125=0\n  - jasper=2.0.33=h0ff4b12_1\n  - jemalloc=5.3.0=hcb278e6_0\n  - jpeg=9e=h0b41bf4_3\n  - kakadu=1=0\n  - kernel-headers_linux-64=3.10.0=h4a8ded7_13\n  - keyutils=1.6.1=h166bdaf_0\n  - krb5=1.20.1=hf9c8cef_0\n  - lame=3.100=h166bdaf_1003\n  - ld_impl_linux-64=2.40=h41732ed_0\n  - lerc=4.0.0=h27087fc_0\n  - libarchive=3.5.2=hb890918_3\n  - libblas=3.9.0=17_linux64_openblas\n  - libcblas=3.9.0=17_linux64_openblas\n  - libclang=13.0.1=default_h7634d5b_3\n  - libcurl=7.87.0=h6312ad2_0\n  - libcxx=16.0.6=h00ab1b0_0\n  - libcxxabi=16.0.6=ha770c72_0\n  - libdeflate=1.14=h166bdaf_0\n  - libdrm=2.4.114=h166bdaf_0\n  - libdrm-cos6-x86_64=2.4.65=4\n  - libedit=3.1.20191231=he28a2e2_2\n  - libelas=isis7=h3fd9d12_0\n  - libev=4.33=h516909a_1\n  - libevent=2.1.10=h9b69904_4\n  - libexpat=2.5.0=hcb278e6_1\n  - libffi=3.4.2=h7f98852_5\n  - libgcc-devel_linux-64=12.3.0=h8bca6fd_0\n  - libgcc-ng=13.2.0=h807b86a_2\n  - libgdal=3.5_isis8=h3fd9d12_0\n  - libgfortran-ng=13.1.0=h69a702a_0\n  - libgfortran5=13.1.0=h15d22d2_0\n  - libglib=2.76.4=hebfc3b9_0\n  - libglu=9.0.0=he1b5a44_1001\n  - libglvnd-cos7-x86_64=1.0.1=h9b0a68f_1105\n  - libgomp=13.2.0=h807b86a_2\n  - libhwloc=2.8.0=h32351e8_1\n  - libiconv=1.17=h166bdaf_0\n  - libidn2=2.3.4=h166bdaf_0\n  - libjemalloc=5.3.0=hcb278e6_0\n  - liblapack=3.9.0=17_linux64_openblas\n  - liblapacke=3.9.0=17_linux64_openblas\n  - libllvm13=13.0.1=hf817b99_2\n  - libmicrohttpd=0.9.77=h97afed2_0\n  - libnabo=isis7=h3fd9d12_0\n  - libnghttp2=1.51.0=hdcd2b5c_0\n  - libnsl=2.0.0=h7f98852_0\n  - libntlm=1.4=h7f98852_1002\n  - libogg=1.3.4=h7f98852_1\n  - libopenblas=0.3.23=pthreads_h80387f5_0\n  - libopencv=4.5.5=py39hb0e02d1_7\n  - libopus=1.3.1=h7f98852_1\n  - libpciaccess=0.17=h166bdaf_0\n  - libpng=1.6.39=h753d276_0\n  - libpointmatcher=isis7=h2bc3f7f_0\n  - libpq=14.5=h2baec63_5\n  - libprotobuf=3.19.6=h3eb15da_0\n  - libsanitizer=12.3.0=h0f45ef3_0\n  - libsqlite=3.43.0=h2797004_0\n  - libssh2=1.10.0=haa6b8db_3\n  - libstdcxx-devel_linux-64=12.3.0=h8bca6fd_0\n  - libstdcxx-ng=13.2.0=h7e041cc_2\n  - libtasn1=4.19.0=h166bdaf_0\n  - libtiff=4.4.0=h82bc61c_5\n  - libunistring=0.9.10=h7f98852_0\n  - libuuid=2.38.1=h0b41bf4_0\n  - libuv=1.46.0=hd590300_0\n  - libva=2.18.0=h0b41bf4_0\n  - libvorbis=1.3.7=h9c3ff4c_0\n  - libvpx=1.11.0=h9c3ff4c_3\n  - libwebp-base=1.3.1=hd590300_0\n  - libx11-common-cos6-x86_64=1.6.4=4\n  - libx11-cos6-x86_64=1.6.4=4\n  - libxcb=1.13=h7f98852_1004\n  - libxkbcommon=1.0.3=he3ba5ed_0\n  - libxml2=2.9.14=haae042b_4\n  - libzlib=1.2.13=hd590300_5\n  - llvm-openmp=16.0.6=h4dfa4b3_0\n  - lz4-c=1.9.3=h9c3ff4c_1\n  - lzo=2.10=h516909a_1000\n  - mesa-libgl-cos6-x86_64=11.0.7=4\n  - mesalib=23.0.0=h0fe20ba_0\n  - metis=5.1.0=h59595ed_1007\n  - mpfr=4.2.0=hb012696_0\n  - multiview=isis8=py39h3fd9d12_0\n  - mysql=8.0.28=h3e2b116_2\n  - mysql-client=8.0.28=hf89ab62_2\n  - mysql-common=8.0.28=haf5c9bc_2\n  - mysql-connector-c=6.1.11=h6eb9d5d_1007\n  - mysql-devel=8.0.28=haf5c9bc_2\n  - mysql-libs=8.0.28=h28c427c_2\n  - mysql-server=8.0.28=hb253900_2\n  - nanoflann=1.4.2=ha770c72_0\n  - ncurses=6.4=hcb278e6_0\n  - nettle=3.8.1=hc379101_1\n  - networkx=3.1=pyhd8ed1ab_0\n  - nlohmann_json=3.11.2=h27087fc_0\n  - nn=1.86.0=hd590300_2003\n  - nspr=4.35=h27087fc_0\n  - nss=3.92=h1d7d5a4_0\n  - numpy=1.25.2=py39h6183b62_0\n  - openblas=0.3.23=pthreads_h855a84d_0\n  - opencv=4.5.5=py39hf3d152e_7\n  - openexr=2.5.5=hf817b99_0\n  - openh264=2.3.1=hcb278e6_2\n  - openjpeg=2.3.0=hf38bd82_1003\n  - openssl=1.1.1v=hd590300_0\n  - p11-kit=0.24.1=hc5aa10d_0\n  - packaging=23.1=pyhd8ed1ab_0\n  - parallel=20230722=ha770c72_0\n  - pbzip2=1.1.13=0\n  - pcl=1.11.1=h05311af_1\n  - pcre2=10.40=hc3806b6_0\n  - pdal=2.4.2_asp3.3.0=py39h3fd9d12_0\n  - perl=5.32.1=4_hd590300_perl5\n  - pip=23.2.1=pyhd8ed1ab_0\n  - pixman=0.40.0=h36c2ea0_0\n  - platformdirs=3.10.0=pyhd8ed1ab_0\n  - pooch=1.7.0=pyha770c72_3\n  - proj=9.1.0=h93bde94_0\n  - protobuf=3.19.6=py39h227be39_0\n  - pthread-stubs=0.4=h36c2ea0_1001\n  - pvl=1.3.2=pyhd8ed1ab_0\n  - py-opencv=4.5.5=py39hef51801_7\n  - pysocks=1.7.1=pyha2e5f31_6\n  - python=3.9.15=h47a2c10_0_cpython\n  - python-dateutil=2.8.2=pyhd8ed1ab_0\n  - python_abi=3.9=3_cp39\n  - pytz=2023.3.post1=pyhd8ed1ab_0\n  - pyyaml=6.0.1=py39hd1e30aa_0\n  - qhull=2020.2=h4bd325d_2\n  - qt=5.12.9=h1304e3e_6\n  - qwt=6.2.0=hb19a904_2\n  - rapidjson=1.1.0=he1b5a44_1002\n  - rclone=1.63.1=h519d9b9_0\n  - readline=8.2=h8228510_1\n  - requests=2.31.0=pyhd8ed1ab_0\n  - rhash=1.4.3=hd590300_2\n  - rocksdb=6.13.3=hda8cf21_2\n  - s2p-subset=isis7=h3fd9d12_0\n  - scipy=1.11.2=py39h6183b62_0\n  - setuptools=68.1.2=pyhd8ed1ab_0\n  - six=1.16.0=pyh6c4a22f_0\n  - snappy=1.1.10=h9fff704_0\n  - spiceypy=6.0.0=pyhd8ed1ab_0\n  - sqlite=3.43.0=h2c6b66d_0\n  - suitesparse=5.10.1=h9e50725_1\n  - superlu=5.2.2=h00795ac_0\n  - svt-av1=1.3.0=h27087fc_0\n  - sysroot_linux-64=2.17=h4a8ded7_13\n  - tbb=2021.7.0=h924138e_1\n  - tbb-devel=2021.7.0=h924138e_1\n  - tiledb=2.9.5=h1e4a385_0\n  - tk=8.6.12=h27826a3_0\n  - tnt=126=0\n  - typing-extensions=4.7.1=hd8ed1ab_0\n  - typing_extensions=4.7.1=pyha770c72_0\n  - tzdata=2023c=h71feb2d_0\n  - urllib3=2.0.4=pyhd8ed1ab_0\n  - usgscsm=1.7.0=h00ab1b0_1\n  - wheel=0.41.2=pyhd8ed1ab_0\n  - x264=1!164.3095=h166bdaf_2\n  - x265=3.5=h924138e_3\n  - xerces-c=3.2.3=h8ce2273_4\n  - xorg-damageproto=1.2.1=h7f98852_1002\n  - xorg-fixesproto=5.0=h7f98852_1002\n  - xorg-glproto=1.4.17=h7f98852_1002\n  - xorg-inputproto=2.3.2=h7f98852_1002\n  - xorg-kbproto=1.0.7=h7f98852_1002\n  - xorg-libice=1.1.1=hd590300_0\n  - xorg-libsm=1.2.4=h7391055_0\n  - xorg-libx11=1.8.4=h0b41bf4_0\n  - xorg-libxau=1.0.11=hd590300_0\n  - xorg-libxdamage=1.1.5=h7f98852_1\n  - xorg-libxdmcp=1.1.3=h7f98852_0\n  - xorg-libxext=1.3.4=h0b41bf4_2\n  - xorg-libxfixes=5.0.3=h7f98852_1004\n  - xorg-libxi=1.7.10=h7f98852_0\n  - xorg-libxrandr=1.5.2=h7f98852_1\n  - xorg-libxrender=0.9.10=h7f98852_1003\n  - xorg-randrproto=1.5.0=h7f98852_1001\n  - xorg-renderproto=0.11.1=h7f98852_1002\n  - xorg-util-macros=1.19.3=h7f98852_0\n  - xorg-xextproto=7.3.0=h0b41bf4_1003\n  - xorg-xf86vidmodeproto=2.3.1=h7f98852_1002\n  - xorg-xproto=7.0.31=h7f98852_1007\n  - xz=5.2.6=h166bdaf_0\n  - yaml=0.2.5=h7f98852_2\n  - zlib=1.2.13=hd590300_5\n  - zstd=1.5.5=hfc55251_0\n"
  },
  {
    "path": "conda/asp_deps_3.4.0_alpha_osx_env.yaml",
    "content": "name: asp_deps_3.4.0_alpha\nchannels:\n  - nasa-ames-stereo-pipeline\n  - usgs-astrogeology\n  - conda-forge\ndependencies:\n  - ale=0.9.1=py39h8ee36c8_0\n  - aom=3.5.0=hf0c8a7f_0\n  - armadillo=12.6.1=hdc495e4_0\n  - arpack=3.7.0=hefb7bc6_2\n  - blas=2.117=openblas\n  - blas-devel=3.9.0=17_osx64_openblas\n  - boost=1.72.0=py39hb64e6f8_1\n  - boost-cpp=1.72.0=hf3dc895_6\n  - brotli-python=1.1.0=py39h840bb9f_0\n  - bullet=2.86.1=0\n  - bz2file=0.98=py_0\n  - bzip2=1.0.8=h0d85af4_4\n  - c-ares=1.19.1=h0dc2134_0\n  - c-compiler=1.5.2=hbf74d83_0\n  - ca-certificates=2023.7.22=h8857fd0_0\n  - cairo=1.16.0=h9e0e54b_1010\n  - cctools=973.0.1=h76f1dac_13\n  - cctools_osx-64=973.0.1=hcc6d90d_13\n  - ceres-solver=1.14.0=h636452b_15\n  - certifi=2023.7.22=pyhd8ed1ab_0\n  - charset-normalizer=3.2.0=pyhd8ed1ab_0\n  - clang=14.0.6=h694c41f_1\n  - clang-14=14.0.6=default_hdb78580_1\n  - clang_osx-64=14.0.6=h3113cd8_6\n  - clangxx=14.0.6=default_hdb78580_1\n  - clangxx_osx-64=14.0.6=h6f97653_6\n  - cmake=3.27.4=hf40c264_4\n  - compiler-rt=14.0.6=h613da45_0\n  - compiler-rt_osx-64=14.0.6=hab78ec2_0\n  - compilers=1.5.2=h694c41f_0\n  - csm=3.0.3.3=0\n  - cspice=67=hb7f2c08_4\n  - curl=8.2.1=h5f667d7_0\n  - cxx-compiler=1.5.2=hb8565cd_0\n  - cyrus-sasl=2.1.27=hf9bab2b_7\n  - eigen=3.4.0=h1c7c39f_0\n  - embree=2.17.7=h694c41f_3\n  - expat=2.5.0=hf0c8a7f_1\n  - ffmpeg=4.4.2=gpl_hff0bab5_109\n  - fftw=3.3.10=nompi_h4fa670e_108\n  - fgr=isis7=h01edc0c_0\n  - flann=1.9.1=h30321d8_1010\n  - font-ttf-dejavu-sans-mono=2.37=hab24e00_0\n  - font-ttf-inconsolata=3.000=h77eed37_0\n  - font-ttf-source-code-pro=2.038=h77eed37_0\n  - font-ttf-ubuntu=0.83=hab24e00_0\n  - fontconfig=2.14.2=h5bb23bf_0\n  - fonts-conda-ecosystem=1=0\n  - fonts-conda-forge=1=0\n  - fortran-compiler=1.5.2=haad3a49_0\n  - freetype=2.12.1=h3f81eb7_1\n  - geoid=1.0_isis7=1\n  - geos=3.9.1=he49afe7_2\n  - geotiff=1.7.1=he29fd1c_4\n  - gettext=0.21.1=h8a4c099_0\n  - gflags=2.2.2=hb1e8313_1004\n  - gfortran=11.4.0=h2c809b3_1\n  - gfortran_impl_osx-64=11.4.0=h2a33dde_1\n  - gfortran_osx-64=11.4.0=h18f7dce_1\n  - giflib=5.2.1=hb7f2c08_3\n  - glog=0.6.0=h8ac2a54_0\n  - gmp=6.2.1=h2e338ed_0\n  - gnutls=3.7.8=h207c4f0_0\n  - graphite2=1.3.13=h2e338ed_1001\n  - gsl=2.6=h71c5fe9_2\n  - harfbuzz=4.2.0=h48644e2_0\n  - hdf5=1.12.1=nompi_h0aa1fa2_104\n  - htdp=1.0_isis7=1\n  - icu=69.1=he49afe7_0\n  - idna=3.4=pyhd8ed1ab_0\n  - ilmbase=2.5.5=hfab91a5_0\n  - inja=3.3.0=he49afe7_0\n  - isis=8.0.0=np125_0\n  - isl=0.25=hb486fe8_0\n  - jama=125=0\n  - jasper=2.0.33=h7c6fec8_1\n  - jemalloc=5.3.0=hf0c8a7f_0\n  - jpeg=9e=hb7f2c08_3\n  - kakadu=1=0\n  - krb5=1.21.1=hb884880_0\n  - lame=3.100=hb7f2c08_1003\n  - ld64=609=hc6ad406_13\n  - ld64_osx-64=609=hfd63004_13\n  - lerc=4.0.0=hb486fe8_0\n  - libblas=3.9.0=17_osx64_openblas\n  - libcblas=3.9.0=17_osx64_openblas\n  - libclang=13.0.1=root_62804_h2961583_3\n  - libclang-cpp14=14.0.6=default_hdb78580_1\n  - libcurl=8.2.1=h5f667d7_0\n  - libcxx=16.0.6=hd57cbcb_0\n  - libdeflate=1.14=hb7f2c08_0\n  - libedit=3.1.20191231=h0678c8f_2\n  - libelas=isis7=h01edc0c_0\n  - libev=4.33=haf1e3a3_1\n  - libevent=2.1.10=h7d65743_4\n  - libexpat=2.5.0=hf0c8a7f_1\n  - libffi=3.4.2=h0d85af4_5\n  - libgdal=3.5_isis8=hf8dc8b4_0\n  - libgfortran=5.0.0=12_3_0_h97931a8_1\n  - libgfortran-devel_osx-64=11.4.0=h01aa347_1\n  - libgfortran5=12.3.0=hbd3c1fe_1\n  - libglib=2.76.4=hc62aa5d_0\n  - libiconv=1.17=hac89ed1_0\n  - libidn2=2.3.4=hb7f2c08_0\n  - libjemalloc=5.3.0=hf0c8a7f_0\n  - liblapack=3.9.0=17_osx64_openblas\n  - liblapacke=3.9.0=17_osx64_openblas\n  - libllvm13=13.0.1=h64f94b2_2\n  - libllvm14=14.0.6=hc8e404f_4\n  - libnabo=isis7=h01edc0c_0\n  - libnghttp2=1.52.0=he2ab024_0\n  - libntlm=1.4=h0d85af4_1002\n  - libopenblas=0.3.23=openmp_h429af6e_0\n  - libopencv=4.5.5=py39hc2bf5a6_7\n  - libpng=1.6.39=ha978bb4_0\n  - libpointmatcher=isis7=ha5a8b8e_0\n  - libpq=14.5=h3df487d_7\n  - libprotobuf=3.19.6=hbc0c0cd_0\n  - libsqlite=3.42.0=h58db7d2_0\n  - libssh2=1.11.0=hd019ec5_0\n  - libtasn1=4.19.0=hb7f2c08_0\n  - libtiff=4.4.0=h6268bbc_5\n  - libunistring=0.9.10=h0d85af4_0\n  - libuv=1.46.0=h0c2f820_0\n  - libvpx=1.11.0=he49afe7_3\n  - libwebp-base=1.3.1=h0dc2134_0\n  - libxcb=1.15=hb7f2c08_0\n  - libxml2=2.9.14=h1faee8b_4\n  - libzlib=1.2.13=h8a1eda9_5\n  - llvm-openmp=16.0.6=hff08bdf_0\n  - llvm-tools=14.0.6=hc8e404f_4\n  - lz4-c=1.9.3=he49afe7_1\n  - macports-legacy-support=1.0.13=h0dc2134_0\n  - mesalib=23.1.4=hb59017c_0\n  - metis=5.1.0=he965462_1007\n  - mpc=1.3.1=h81bd1dd_0\n  - mpfr=4.2.0=h4f9bd69_0\n  - multiview=isis8=py39hf8dc8b4_0\n  - mysql=8.0.28=h88f4db0_2\n  - mysql-client=8.0.28=h7ddd48c_2\n  - mysql-common=8.0.28=hdd8d184_2\n  - mysql-devel=8.0.28=hdd8d184_2\n  - mysql-libs=8.0.28=h353f102_2\n  - mysql-server=8.0.28=h6edde1b_2\n  - nanoflann=1.4.2=h694c41f_0\n  - ncurses=6.4=hf0c8a7f_0\n  - nettle=3.8.1=h96f3785_1\n  - networkx=3.1=pyhd8ed1ab_0\n  - nlohmann_json=3.11.2=hbbd2c75_0\n  - nn=1.86.0=h0dc2134_2003\n  - nspr=4.35=hea0b92c_0\n  - nss=3.92=hd6ac835_0\n  - numpy=1.25.2=py39h892e69a_0\n  - openblas=0.3.23=openmp_hbefa662_0\n  - opencv=4.5.5=py39h6e9494a_7\n  - openexr=2.5.5=h7fa7ffa_0\n  - openh264=2.3.1=hf0c8a7f_2\n  - openjpeg=2.3.0=h3bf0609_1003\n  - openssl=3.1.2=h8a1eda9_0\n  - p11-kit=0.24.1=h65f8906_0\n  - packaging=23.1=pyhd8ed1ab_0\n  - parallel=20230722=h694c41f_0\n  - pbzip2=1.1.13=h9d27c22_1\n  - pcl=1.11.1=h7984e4d_1\n  - pcre2=10.40=h1c4e4bc_0\n  - pdal=2.4.2_asp3.3.0=py39hf8dc8b4_0\n  - perl=5.32.1=4_h0dc2134_perl5\n  - pip=23.2.1=pyhd8ed1ab_0\n  - pixman=0.40.0=hbcb3906_0\n  - platformdirs=3.10.0=pyhd8ed1ab_0\n  - pooch=1.7.0=pyha770c72_3\n  - proj=9.1.0=hcbd9701_0\n  - protobuf=3.19.6=py39h7a8716b_0\n  - pthread-stubs=0.4=hc929b4f_1001\n  - pvl=1.3.2=pyhd8ed1ab_0\n  - py-opencv=4.5.5=py39h71a6800_7\n  - pysocks=1.7.1=pyha2e5f31_6\n  - python=3.9.17=h07e1443_0_cpython\n  - python-dateutil=2.8.2=pyhd8ed1ab_0\n  - python_abi=3.9=3_cp39\n  - pytz=2023.3.post1=pyhd8ed1ab_0\n  - pyyaml=6.0.1=py39hdc70f33_0\n  - qhull=2020.2=h940c156_2\n  - qt=5.12.9=h2a607e2_5\n  - qwt=6.2.0=h0f3c874_2\n  - rapidjson=1.1.0=hb1e8313_1002\n  - rclone=1.63.1=h1762f63_0\n  - readline=8.2=h9e318b2_1\n  - requests=2.31.0=pyhd8ed1ab_0\n  - rhash=1.4.4=h0dc2134_0\n  - rocksdb=6.13.3=hbb73eaa_2\n  - s2p-subset=isis7=h01edc0c_0\n  - scipy=1.11.2=py39hded996c_0\n  - setuptools=68.1.2=pyhd8ed1ab_0\n  - sigtool=0.1.3=h88f4db0_0\n  - six=1.16.0=pyh6c4a22f_0\n  - snappy=1.1.10=h225ccf5_0\n  - spiceypy=6.0.0=pyhd8ed1ab_0\n  - sqlite=3.42.0=h2b0dec6_0\n  - suitesparse=5.10.1=h7aff33d_1\n  - superlu=5.2.2=h1f0f902_0\n  - svt-av1=1.3.0=hf0c8a7f_0\n  - tapi=1100.0.11=h9ce4665_0\n  - tbb=2021.10.0.custom_asp=h6b95b14_0\n  - tbb-devel=2021.10.0.custom_asp=h6b95b14_0\n  - tiledb=2.9.5=h86bd37b_0\n  - tk=8.6.12=h5dbffcc_0\n  - tnt=126=0\n  - typing-extensions=4.7.1=hd8ed1ab_0\n  - typing_extensions=4.7.1=pyha770c72_0\n  - tzdata=2023c=h71feb2d_0\n  - urllib3=2.0.4=pyhd8ed1ab_0\n  - usgscsm=1.7.0=h1c7c39f_1\n  - wheel=0.41.2=pyhd8ed1ab_0\n  - x264=1!164.3095=h775f41a_2\n  - x265=3.5=hbb4e6a2_3\n  - xerces-c=3.2.3=h6564042_4\n  - xorg-damageproto=1.2.1=h0d85af4_1002\n  - xorg-fixesproto=5.0=h0d85af4_1002\n  - xorg-glproto=1.4.17=h0d85af4_1002\n  - xorg-inputproto=2.3.2=h35c211d_1002\n  - xorg-kbproto=1.0.7=h35c211d_1002\n  - xorg-libice=1.1.1=h0dc2134_0\n  - xorg-libsm=1.2.4=h0dc2134_0\n  - xorg-libx11=1.8.6=hbd0b022_0\n  - xorg-libxau=1.0.11=h0dc2134_0\n  - xorg-libxdamage=1.1.5=h0d85af4_1\n  - xorg-libxdmcp=1.1.3=h35c211d_0\n  - xorg-libxext=1.3.4=hb7f2c08_2\n  - xorg-libxfixes=5.0.3=h0d85af4_1004\n  - xorg-libxi=1.7.10=h0d85af4_0\n  - xorg-libxrandr=1.5.2=h0d85af4_1\n  - xorg-libxrender=0.9.11=h0dc2134_0\n  - xorg-randrproto=1.5.0=h0d85af4_1001\n  - xorg-renderproto=0.11.1=h0d85af4_1002\n  - xorg-util-macros=1.19.3=h35c211d_0\n  - xorg-xextproto=7.3.0=hb7f2c08_1003\n  - xorg-xf86vidmodeproto=2.3.1=h0d85af4_1002\n  - xorg-xproto=7.0.31=h35c211d_1007\n  - xz=5.2.6=h775f41a_0\n  - yaml=0.2.5=h0d85af4_2\n  - zlib=1.2.13=h8a1eda9_5\n  - zstd=1.5.5=h829000d_0\n"
  },
  {
    "path": "conda/environment.yml",
    "content": "# Placeholder minimal asp deps conda environement. Not yet fully fleshed out.\n# Use instead the ones at: conda/asp_deps_3.4.0*.yaml\n\nname: asp_deps\n\nchannels:\n  - nasa-ames-stereo-pipeline\n  - usgs-astrogeology\n  - conda-forge\n\ndependencies:\n  - pdal 2.6.0\n  - opencv 4.8.1\n  - cmake>=3.15\n  - csm\n  - eigen\n  - nlohmann_json\n  - proj\n  - sqlite>=3.11\n  \n"
  },
  {
    "path": "conda/update_versions.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n'''\nUse dependency versions from a conda environment .yaml file to update\na recipe/meta.yaml file of a given package. Such an input file can\nbe created from the given environment with:\nconda env export > myEnv.yaml\n'''\n\nimport sys, os, re\n\nif len(sys.argv) < 3:\n    print(\"Usage: \" + os.path.basename(sys.argv[0]) + \" input.yaml myPackage-feedstock\")\n    sys.exit(1)\n    \ninFile = sys.argv[1]\noutDir = sys.argv[2]\n\noutFile = outDir + \"/recipe/meta.yaml\"\nif not os.path.exists(outFile):\n    print(\"Cannot open file: \" + outFile)\n    # Recent versions of conda-build use recipe/recipe.yaml\n    outFile = outDir + \"/recipe/recipe.yaml\"\n    if not os.path.exists(outFile):\n        print(\"Cannot open file: \" + outFile)\n        sys.exit(1)\n    else:\n        print(\"Found file: \" + outFile)\n\n# parse the versions from the conda env\nconda_env = {}\nprint(\"Reading: \" + inFile)\ninHandle = open(inFile, 'r')\nlines = inHandle.readlines()\nfor line in lines:\n\n    # Wipe comments\n    m = re.match(r'^(.*?)\\#', line)\n    if m:\n        line = m.group(1)\n        \n    # Match the package\n    m = re.match(r'^\\s*-\\s*(.*?)\\s*=+\\s*(.*?)(=|\\s|$)', line)\n    if not m:\n        continue\n    package = m.group(1)\n    version = m.group(2)\n    if re.match(r'^\\s*$', package):\n        continue # ignore empty lines\n    \n    conda_env[package] = version\n    #print(\"got \", package, version)\n\n# Update the lines in the output ile\noutHandle = open(outFile, 'r')\nlines = outHandle.readlines()\ninDepSection = False\nfor it in range(len(lines)):\n\n    line = lines[it]\n    \n    if 'requirements:' in line:\n        # We are at the beginning of the dependencies\n        inDepSection = True\n        continue\n     \n    if not inDepSection:\n        # We are not in the dependencies section\n        continue\n           \n    if 'test:' in line or 'tests:' in line or 'about:' in line:\n        # We are at the end of the dependencies\n        break\n\n    # Ignore comments\n    m = re.match(r'^\\#', line)\n    if m:\n        continue\n\n    # Match the package\n    m = re.match(r'^(\\s+-\\s*)(.*?)([\\s=]+)(.*?)$', line)\n    if not m:\n        continue\n    \n    pre = m.group(1)\n    package = m.group(2)\n    separator = m.group(3).rstrip(\"\\n\")\n    old_version = m.group(4).rstrip(\"\\n\")\n\n    if separator == \"\":\n        # Ensure there's at least one space\n        separator = \" \"\n        \n    if old_version == \"\":\n        # If there was no version before, print a warning, as sometimes the\n        # version chosen later won't be the expected one.\n        print(\"Warning: For package \" + package + \", no version was specified, \"\n              \"this may lead to unexpected results.\")\n        continue\n    \n    if not package in conda_env:\n        continue\n    version = conda_env[package]\n    if old_version != version:\n        if ('[linux]' in old_version) or ('[osx]' in old_version):\n            # In this case the user better take a closer look\n            print(\"For package \" + package + \", not replacing \" +\n                  old_version + \" with \" + version + \", a closer look is suggested.\")\n        else:\n            print(\"For package \" + package + \", replacing version \"\n                  + old_version + \" with \" + version)\n            lines[it] = pre + package + separator + version + \"\\n\"\n\n# Save the updated lines to disk\nprint(\"Updating: \" + outFile)\noutHandle = open(outFile, \"w\")\noutHandle.writelines(lines)\noutHandle.close()\n"
  },
  {
    "path": "docs/Makefile",
    "content": "# Minimal makefile for Sphinx documentation\n#\n\n# You can set these variables from the command line.\nSPHINXOPTS    =\nSPHINXBUILD   = sphinx-build\nSPHINXPROJ    = AmesStereoPipeline\nSOURCEDIR     = .\nBUILDDIR      = _build\n\n# Put it first so that \"make\" without argument is like \"make help\".\nhelp:\n\t@$(SPHINXBUILD) -M help \"$(SOURCEDIR)\" \"$(BUILDDIR)\" $(SPHINXOPTS) $(O)\n\n.PHONY: help Makefile\n\n# Catch-all target: route all unknown targets to Sphinx using the new\n# \"make mode\" option.  $(O) is meant as a shortcut for $(SPHINXOPTS).\n%: Makefile\n\t@$(SPHINXBUILD) -M $@ \"$(SOURCEDIR)\" \"$(BUILDDIR)\" $(SPHINXOPTS) $(O)"
  },
  {
    "path": "docs/acknowledgements.rst",
    "content": "Credits\n=======\n\n.. include:: ../AUTHORS.rst\n"
  },
  {
    "path": "docs/bathy_water_masking.rst",
    "content": ".. _bathy_water_masking:\n\nBathy water masking\n===================\n\nFor shallow water bathymetry (:numref:`bathy_intro`) it is important to\ndistinguish land pixels from water pixels. This allows the algorithm to focus on\nunderwater terrain while avoiding false depth estimates from land features.\n\nA simple and commonly used approach is to threshold the near-infrared (NIR)\nband 7, where water typically appears darker than land. This method is\ndescribed in :numref:`bathy_thresh`.\n\nIn complex coastal environments with vegetation, shadows, turbid water, or\nshallow clear water, the NIR band alone may not provide sufficient separation.\nThis section describes alternative spectral indices that combine multiple bands\nthat may improve land-water discrimination.\n\nMultispectral image bands\n-------------------------\n\nWorldView satellites capture multispectral imagery with eight bands.\n\n.. list-table:: WorldView-3 multispectral bands\n   :widths: 10 30\n   :header-rows: 1\n\n   * - Band\n     - Name\n   * - 1\n     - Coastal\n   * - 2\n     - Blue\n   * - 3\n     - Green\n   * - 4\n     - Yellow\n   * - 5\n     - Red\n   * - 6\n     - Red Edge\n   * - 7\n     - NIR1 (Near-infrared 1)\n   * - 8\n     - NIR2 (Near-infrared 2)\n\nOther vendors provide similar products.\n\nIndividual bands can be extracted from a multispectral image with\n``gdal_translate`` (:numref:`gdal_tools`). For example, run this for the green\nband (band 3)::\n\n     b=3\n     gdal_translate -b ${b} -co compress=lzw -co TILED=yes \\\n       -co BLOCKXSIZE=256 -co BLOCKYSIZE=256               \\\n       input.TIF input_b${b}.tif\n\nThe compression and tiling options help with the performance of ASP processing\nlater.\n\nWater indices for land-water masking\n------------------------------------\n\nThe following indices provide alternatives to band 7 (NIR1), as described\nin :numref:`bathy_thresh`.\n\nNDWI (Normalized Difference Water Index)\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nNDWI is computed as:\n\n.. math::\n\n   \\text{NDWI} = \\frac{\\text{Green} - \\text{NIR}}{\\text{Green} + \\text{NIR}}\n\nThis index enhances the contrast between water and land. Water typically has\npositive values, while land and vegetation have negative values. It is effective\nfor general water delineation and separates water from soil and terrestrial\nvegetation well.\n\nTo compute NDWI using ``image_calc`` (:numref:`image_calc`), do::\n\n     image_calc -c \"(var_0 - var_1) / (var_0 + var_1)\" \\\n       input_b3.tif input_b7.tif -o ndwi.tif\n\nwhere ``input_b3.tif`` is the green band and ``input_b7.tif`` is the NIR band.\n\nRNDVI (Reversed Normalized Difference Vegetation Index)\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nRNDVI is computed as:\n\n.. math::\n\n   \\text{RNDVI} = \\frac{\\text{Red} - \\text{NIR}}{\\text{Red} + \\text{NIR}}\n\nThis is the inverse of the standard NDVI (which is high for vegetation). In\nRNDVI, water appears bright (high values) while vegetation appears very dark\n(low or negative values). This index is particularly effective in areas with\nheavy vegetation along the shoreline, such as mangroves or dense forests, where\nstandard NIR masking may be ambiguous.\n\nTo compute RNDVI using ``image_calc`` run::\n\n     image_calc -c \"(var_0 - var_1) / (var_0 + var_1)\" \\\n       input_b5.tif input_b7.tif -o rndvi.tif\n\nwhere ``input_b5.tif`` is the red band and ``input_b7.tif`` is the NIR band.\n\nOSI (Ocean/Sea Index)\n~~~~~~~~~~~~~~~~~~~~~\n\nOSI is computed as:\n\n.. math::\n\n   \\text{OSI} = \\frac{\\text{Green} + \\text{Red}}{\\text{Blue}}\n\nThis index uses the ratio of longer visible wavelengths to blue. It can be\nuseful for specific water conditions, though it is often less robust in clear\nshallow water than NDWI or RNDVI.\n\nThe ``image_calc`` command is::\n\n     image_calc -c \"(var_0 + var_1) / var_2\" \\\n       input_b3.tif input_b5.tif input_b2.tif -o osi.tif\n\nwhere ``input_b3.tif`` is the green band, ``input_b5.tif`` is the red band,\nand ``input_b2.tif`` is the blue band.\n\nThresholding\n------------\n\nThe resulting index images (``ndwi.tif``, ``rndvi.tif``, ``osi.tif``) can be\nconverted to binary water masks. This requires computing an appropriate\nthreshold. Here's an example that invokes ``otsu_threshold``\n(:numref:`otsu_threshold`) for that purpose, with ``ndwi.tif``:\n\n::\n\n     otsu_threshold ndwi.tif\n\nThis will print the computed threshold to standard output. This value should\nthen be used in the masking command below. \n\nMask creation\n-------------\n\nWhen creating binary masks from these indices it is important to note the\nfollowing.\n\n**Polarity reversal:** Unlike the raw NIR band (band 7) in\n:numref:`bathy_thresh`, where water is darker than land, the spectral indices\nNDWI and RNDVI make water appear brighter. This affects how binary masks are\ncreated from thresholds.\n\nThe mask convention is that **land pixels have value 1** (or positive values)\nand **water pixels have value 0** (or nodata).\n\nFor the NIR band, water pixels are *at or below* the threshold and land pixels are\n*strictly above*, so the masking command is::\n\n     threshold=225\n     image_calc -c \"gt(var_0, $threshold, 1, 0)\" \\\n      input_b7.tif -o land_mask.tif\n\nFor NDWI and RNDVI, water pixels are *at or above* the threshold and land pixels\nare *strictly below*::\n\n     threshold=0.38\n     image_calc -c \"lt(var_0, $threshold, 1, 0)\" \\\n      ndwi.tif -o land_mask.tif\n\nNote the reversed comparison operator (``gt`` vs ``lt``) to maintain the\nconvention that land=1 and water=0. \n\n**Site-specific performance:** The effectiveness of these indices varies\ndepending on local water conditions, bottom composition, turbidity, and\nshoreline vegetation. \n\nIn testing, NDWI and NIR band 7 showed the most consistent thresholds across\nimages. RNDVI might be effective for vegetated shorelines but could require\nsite-specific threshold adjustment. The results with OSI were not as promising\nin our experiments (for Key West, FL).\n\nIt is recommended to compute all indices and visually inspect the produced masks in\n``stereo_gui`` (:numref:`stereo_gui`) before selecting the most appropriate one\nfor your specific site.\n"
  },
  {
    "path": "docs/bibliography.bib",
    "content": "%% This BibTeX bibliography file was created using BibDesk.\n%% http://bibdesk.sourceforge.net/\n%% Created for Ross Beyer at 2009-03-18 17:10:33 -0700 \n%% Saved with string encoding Unicode (UTF-8) \n\n@article{2001JGR.10623429M,\n\tAdsnote = {Provided by the NASA Astrophysics Data System},\n\tAdsurl = {http://adsabs.harvard.edu/cgi-bin/nph-bib_query?bibcode=2001JGR...10623429M&db_key=AST},\n\tAuthor = {{Malin}, M.~C. and {Edgett}, K.~S.},\n\tDate-Added = {2009-03-18 17:07:55 -0700},\n\tDate-Modified = {2009-03-18 17:07:55 -0700},\n\tJournal = {Journal of Geophysical Research},\n\tKeywords = {spacecraft; MOC;},\n\tMonth = oct,\n\tNumber = {E10},\n\tPages = {23429-23570},\n\tTitle = {{{Mars Global Surveyor} {Mars Orbiter Camera}: Interplanetary cruise through primary mission}},\n\tVolume = 106,\n\tYear = 2001,\n\tBdsk-Url-1 = {http://adsabs.harvard.edu/cgi-bin/nph-bib_query?bibcode=2001JGR...10623429M&db_key=AST}}\n\n@article{1992JGR.97.7699M,\n\tAdsnote = {Provided by the NASA Astrophysics Data System},\n\tAdsurl = {http://adsabs.harvard.edu/cgi-bin/nph-bib_query?bibcode=1992JGR....97.7699M&amp;db_key=AST},\n\tAuthor = {{Malin}, M.~C. and {Danielson}, G.~E. and {Ingersoll}, A.~P. and {Masursky}, H. and {Veverka}, J. and {Ravine}, M.~A. and {Soulanille}, T.~A.},\n\tDate-Added = {2009-03-18 17:07:19 -0700},\n\tDate-Modified = {2009-03-18 17:07:19 -0700},\n\tHardcopy = {Yes},\n\tJournal = {Journal of Geophysical Research},\n\tKeywords = {spacecraft; MOC;},\n\tMonth = may,\n\tNumber = {E5},\n\tPages = {7699-7718},\n\tTitle = {{Mars Observer Camera}},\n\tVolume = 97,\n\tYear = 1992,\n\tBdsk-Url-1 = {http://adsabs.harvard.edu/cgi-bin/nph-bib_query?bibcode=1992JGR....97.7699M&amp;db_key=AST}}\n\n@article{2007SSRv..129..391C,\n\tAdsnote = {Provided by the SAO/NASA Astrophysics Data System},\n\tAdsurl = {http://adsabs.harvard.edu/abs/2007SSRv..129..391C},\n\tAuthor = {{Chin}, G. and {Brylow}, S. and {Foote}, M. and {Garvin}, J. and   {Kasper}, J. and {Keller}, J. and {Litvak}, M. and {Mitrofanov}, I. and   {Paige}, D. and {Raney}, K. and {Robinson}, M. and {Sanin}, A. and   {Smith}, D. and {Spence}, H. and {Spudis}, P. and {Stern}, S.~A. and   {Zuber}, M.},\n\tDate-Added = {2009-03-13 21:46:40 -0700},\n\tDate-Modified = {2009-03-13 21:46:40 -0700},\n\tJournal = {Space Science Reviews},\n\tKeywords = {Moon, Lunar, Vision for Space Exploration, NASA, Spacecraft, Space instrumentation, Remote observation},\n\tMonth = apr,\n\tPages = {391-419},\n\tTitle = {{Lunar Reconnaissance Orbiter Overview: The Instrument Suite and Mission}},\n\tVolume = 129,\n\tYear = 2007,\n\tBdsk-Url-1 = {http://dx.doi.org/10.1007/s11214-007-9153-y},\n\tBdsk-Url-2 = {http://adsabs.harvard.edu/abs/2007SSRv..129..391C}}\n\n@article{2008AGUFM.P31B1419N,\n\tAdsnote = {Provided by the SAO/NASA Astrophysics Data System},\n\tAdsurl = {http://adsabs.harvard.edu/abs/2008AGUFM.P31B1419N},\n\tAuthor = {{Neumann}, G.~A. and {Lemoine}, F.~G. and {Mazarico}, E. and   {McGarry}, J.~F. and {Rowlands}, D.~D. and {Smith}, D.~E. and   {Sun}, X. and {Torrence}, M. and {Zagwodski}, T. and {Zellar}, R. and   {Zuber}, M.~T.},\n\tDate-Added = {2009-03-13 21:46:07 -0700},\n\tDate-Modified = {2009-03-13 21:46:07 -0700},\n\tJournal = {AGU Fall Meeting Abstracts},\n\tKeywords = {1221 Lunar and planetary geodesy and gravity (5417, 5450, 5714, 5744, 6019, 6250)},\n\tMonth = dec,\n\tPages = {B1419+},\n\tTitle = {{Status of Lunar Reconnaissance Orbiter Laser Ranging and Laser Altimeter Experiments}},\n\tYear = 2008,\n\tBdsk-Url-1 = {http://adsabs.harvard.edu/abs/2008AGUFM.P31B1419N}}\n\n@article{1992JGR....97.7781Z,\n\tAdsnote = {Provided by the NASA Astrophysics Data System},\n\tAdsurl = {http://adsabs.harvard.edu/cgi-bin/nph-bib_query?bibcode=1992JGR....97.7781Z&amp;db_key=AST},\n\tAuthor = {{Zuber}, M.~T. and {Smith}, D.~E. and {Solomon}, S.~C. and {Muhleman}, D.~O. and {Head}, J.~W. and {Garvin}, J.~B. and {Abshire}, J.~B. and {Bufton}, J.~L.},\n\tDate-Added = {2009-03-13 21:38:33 -0700},\n\tDate-Modified = {2009-03-13 21:38:33 -0700},\n\tJournal = {Journal of Geophysical Research},\n\tKeywords = {spacecraft; MOLA;},\n\tMonth = may,\n\tNumber = {E5},\n\tPages = {7781-7797},\n\tTitle = {{The {Mars Observer} laser altimeter investigation}},\n\tVolume = 97,\n\tYear = 1992,\n\tBdsk-Url-1 = {http://adsabs.harvard.edu/cgi-bin/nph-bib_query?bibcode=1992JGR....97.7781Z&amp;db_key=AST}}\n\n@article{2001JGR...10623689S,\n\tAdsnote = {Provided by the NASA Astrophysics Data System},\n\tAdsurl = {http://adsabs.harvard.edu/cgi-bin/nph-bib_query?bibcode=2001JGR...10623689S&db_key=AST},\n\tAuthor = {{Smith}, D.~E. and {Zuber}, M.~T. and {Frey}, H.~V. and {Garvin}, J.~B. and {Head}, J.~W. and {Muhleman}, D.~O. and {Pettengill}, G.~H. and {Phillips}, R.~J. and {Solomon}, S.~C. and {Zwally}, H.~J. and {Banerdt}, W.~B. and {Duxbury}, T.~C. and {Golombek}, M.~P. and {Lemoine}, F.~G. and {Neumann}, G.~A. and {et al.}},\n\tDate-Added = {2009-03-13 21:37:55 -0700},\n\tDate-Modified = {2009-03-13 21:37:55 -0700},\n\tJournal = {Journal of Geophysical Research},\n\tKeywords = {spacecraft; MOLA;},\n\tMonth = oct,\n\tNumber = {E10},\n\tPages = {23689-23722},\n\tTitle = {{{Mars Orbiter Laser Altimeter}: Experiment summary after the first year of global mapping of Mars}},\n\tVolume = 106,\n\tYear = 2001,\n\tBdsk-Url-1 = {http://adsabs.harvard.edu/cgi-bin/nph-bib_query?bibcode=2001JGR...10623689S&db_key=AST}}\n\n@inproceedings{surf08,\n\tAuthor = {Herbert Bay and Andreas Ess and Tinne Tuytelaars and Luc Van Gool},\n\tBooktitle = {Computer Vision and Image Understanding (CVIU)},\n\tDate-Added = {2009-03-13 17:08:04 -0700},\n\tDate-Modified = {2009-03-13 17:10:41 -0700},\n\tNumber = {3},\n\tPages = {346-359},\n\tTitle = {{SURF}: Speeded Up Robust Features},\n\tUrl = {http://www.vision.ee.ethz.ch/~surf/},\n\tVolume = {110},\n\tYear = {2008},\n\tBdsk-Url-1 = {http://www.vision.ee.ethz.ch/~surf/}}\n\n@article{triggs00,\n\tAbstract = { This paper is a survey of the theory and methods of photogrammetric bundle adjustment, aimed at potential implementors in the computer vision community. Bundle adjustment is the problem of refining a visual reconstruction to produce jointly optimal structure and viewing parameter estimates. Topics covered include the choice of cost function and robustness numerical optimization including sparse Newton methods, linearly convergent approximations, updating and recursive methods gauge (datum) invariance and quality control. The theory is developed for general robust cost functions rather than restricting attention to traditional nonlinear least squares. </P> <P>Keywords: Bundle Adjustment, Scene Reconstruction, Gauge Freedom, Sparse Matrices, Optimization.},\n\tAuthor = {Triggs, Bill   and Mclauchlan, Philip  F.  and Hartley, Richard  I.  and Fitzgibbon, Andrew  W. },\n\tCiteulike-Article-Id = {239461},\n\tDate-Added = {2009-03-13 17:02:18 -0700},\n\tDate-Modified = {2009-03-13 17:03:02 -0700},\n\tJournal = {Lecture Notes in Computer Science},\n\tKeywords = {3d, from, motion, reconstruction, structure},\n\tMonth = {January},\n\tPages = {298+},\n\tPosted-At = {2008-06-11 14:50:00},\n\tPriority = {2},\n\tTitle = {Bundle Adjustment -- A Modern Synthesis},\n\tVolume = {1883},\n\tYear = {2000},\n\tBdsk-Url-1 = {http://www.metapress.com/link.asp?id=PLVCRQ5BX753A2TN}}\n\n@article{Pomerleau12comp,\n    author = {Pomerleau, Fran{\\c c}ois and Colas, Francis and Siegwart, Roland and Magnenat, St{\\'e}phane},\n    title = {{Comparing ICP Variants on Real-World Data Sets}},\n    journal = {Autonomous Robots},\n    year = {2013},\n    volume = {34},\n    number = {3},\n    pages = {133--148},\n    month = feb\n}\n\n@book{hartley04,\n\tAuthor = {Hartley, R.~I. and Zisserman, A.},\n\tDate-Added = {2009-03-13 16:53:28 -0700},\n\tDate-Modified = {2009-03-13 16:53:28 -0700},\n\tEdition = {Second},\n\tPublisher = {Cambridge University Press, ISBN: 0521540518},\n\tTitle = {Multiple View Geometry in Computer Vision},\n\tYear = {2004}}\n\n@inproceedings{moore09,\n\tAuthor = {Moore, Zach and Wright, Dan and Lewis, Chris and Schinstock, Dale},\n\tBooktitle = {ASPRS Annual Conf., Baltimore, Maryland},\n\tDate-Added = {2009-03-13 16:40:51 -0700},\n\tDate-Modified = {2009-03-13 17:00:03 -0700},\n\tTitle = {Comparison of Bundle Adjustment Formulations},\n\tYear = {2009}}\n\n\n#MRO \n@INPROCEEDINGS{ johnston03,\n    author = {Johnston, M. D. and Graf, J. E. and Zurek, R. W. and Eisen, H. J. and Jai, B.},\n    title = {{The Mars Reconnaissance Orbiter Mission}},\n    booktitle = {2003 IEEE Aerospace Conference}, \n    pages = {447-464},\n    year = 2003\n}\n\n# LRO stuff\n@INPROCEEDINGS{2005LPI....36.1576R,\n   author = {{Robinson}, M.~S. and {Eliason}, E.~M. and {Hiesinger}, H. and \n\t{Jolliff}, B.~L. and {McEwen}, A.~S. and {Malin}, M.~C. and \n\t{Ravine}, M.~A. and {Roberts}, D. and {Thomas}, P.~C. and {Turtle}, E.~P.\n\t},\n    title = \"{LROC -- Lunar Reconnaissance Orbiter Camera}\",\nbooktitle = {Lunar and Planetary Science XXXVI},\n     year = 2005,\n   editor = {{Mackwell}, S. and {Stansbery}, E.},\n    month = mar,\n    number = {\\#1576},\n\torganization = {Lunar and Planetary Institute, Houston (CD-ROM)},\n   adsurl = {http://adsabs.harvard.edu/cgi-bin/nph-bib_query?bibcode=2005LPI....36.1576R&db_key=AST},\n  adsnote = {Provided by the Smithsonian/NASA Astrophysics Data System}\n}\n\n@INPROCEEDINGS{2006LPI....37.1949C,\n   author = {{Chin}, G. and {Bartels}, A. and {Brylow}, S. and {Foote}, M. and \n\t{Garvin}, J. and {Kaspar}, J. and {Keller}, J. and {Mitrofanov}, I. and \n\t{Raney}, K. and {Robinson}, M. and {Smith}, D. and {Spence}, H. and \n\t{Spudis}, P. and {Stern}, S.~A. and {Zuber}, M.},\n    title = \"{Lunar Reconnaissance Orbiter Overview: The Instrument Suite and Mission}\",\nbooktitle = {Lunar and Planetary Science XXXVII},\n     year = 2006,\n   editor = {{Mackwell}, S. and {Stansbery}, E.},\n    month = mar,\n    pages = {\\#1949},\n   adsurl = {http://adsabs.harvard.edu/cgi-bin/nph-bib_query?bibcode=2006LPI....37.1949C&db_key=AST},\n  adsnote = {Provided by the Smithsonian/NASA Astrophysics Data System}\n}\n\n\n% SOCET SET ?\n@INPROCEEDINGS{2006LPI....37.2050K,\n   author = {{Kirk}, R.~L. and {Howington-Kraus}, E. and {Galuszka}, D. and \n\t{Redding}, B. and {Hare}, T.~M. and {Heipke}, C. and {Oberst}, J. and \n\t{Neukum}, G. and {HRSC Co-Investigator Team}},\n    title = \"{Mapping Mars with HRSC, ISIS, and SOCET SET}\",\nbooktitle = {Lunar and Planetary Science XXXVII},\n     year = 2006,\n   editor = {{Mackwell}, S. and {Stansbery}, E.},\n    month = mar,\n    pages = {\\#2050},\n   adsurl = {http://adsabs.harvard.edu/cgi-bin/nph-bib_query?bibcode=2006LPI....37.2050K&db_key=AST},\n  adsnote = {Provided by the Smithsonian/NASA Astrophysics Data System}\n}\n\n% ISIS references:\n@INPROCEEDINGS{2004LPI.35.2039A,\n   author = {{Anderson}, J.~A. and {Sides}, S.~C. and {Soltesz}, D.~L. and \n\t{Sucharski}, T.~L. and {Becker}, K.~J.},\n    title = \"{Modernization of the Integrated Software for Imagers and Spectrometers}\",\nbooktitle = {Lunar and Planetary Science XXXV},\n     year = 2004,\n   editor = {{Mackwell}, S. and {Stansbery}, E.},\n    month = mar,\n\tnumber = {\\#2039},\n   organization = {Lunar and Planetary Institute, Houston (CD-ROM)},\n   adsurl = {http://adsabs.harvard.edu/cgi-bin/nph-bib_query?bibcode=2004LPI....35.2039A&db_key=AST},\n  adsnote = {Provided by the Smithsonian/NASA Astrophysics Data System}\n}\n\n@INPROCEEDINGS{1997LPI.28.387G,\n    author = {{Gaddis}, L. and {Anderson}, J. and {Becker}, K. and\n\t\t\t{Becker}, T. and {Cook}, D. and {Edwards}, K. and \n\t\t\t{Eliason}, E. and {Hare}, T. and {Kieffer}, H. and \n\t\t\t{Lee}, E.~M. and {Mathews}, J. and {Soderblom}, L. and\n\t\t\t{Sucharski}, T. and {Torson}, J. and {McEwen}, A. and\n\t\t\t{Robinson}, M.},\n    title = \"{An Overview of the Integrated Software for Imaging \n\t\t\t\tSpectrometers (ISIS)}\",\n    booktitle = {Lunar and Planetary Science Conference},\n    year = 1997,\n    month = mar,\n    volume = 28,\n    pages = {387},\n    adsurl = {http://adsabs.harvard.edu/cgi-bin/nph-bib_query?bibcode=1997LPI....28..387G&db_key=AST},\n    adsnote = {Provided by the NASA Astrophysics Data System}\n}\n\n@unpublished{\n\tISIS_website,\n\tauthor = {U.S. Geological Survey, Flagstaff, AZ},\n\ttitle = {Integrated Software for Imagers and Spectrometers ({ISIS})},\n\turl = {http://isis.astrogeology.usgs.gov/},\n    year= {2009},\n\tnote = \"\"\n\t}\n\n@unpublished{\n\tHiRISE_website,\n\tauthor = {University of Arizona, Tuscon},\n\ttitle = {The High Resolution Imaging Science Experiment},\n\turl = {http://hirise.lpl.arizona.edu/},\n        year= {2009},\n\t\tnote =\"\"\n\t}\n\n% SPICE stuff\n@INPROCEEDINGS{1999LPI....30.1233A,\n    author = {{Acton}, C.~H.},\n    title = \"{SPICE Products Available to the Planetary Science Community}\",\n    booktitle = {Lunar and Planetary Science XXX},\n    year = 1999,\n    month = mar,\n    number = {\\#1233},\n    organization = {Lunar and Planetary Institute, Houston (CD-ROM)},\n    adsurl = {http://adsabs.harvard.edu/cgi-bin/nph-bib_query?bibcode=1999LPI...\n.30.1233A&db_key=AST},\n    adsnote = {Provided by the NASA Astrophysics Data System}\n}\n\n@INPROCEEDINGS{1999ficm.conf.6042A,\n    author = {{Acton}, C.~H. and {Bachman}, N.~J. and {Bytof}, J.~A. and\n            {Semenov}, B.~V. and {Taber}, W. and {Turner}, F.~S. and\n            {Wright}, E.~D.},\n    title = \"{Examining {Mars} with SPICE}\",\n    booktitle = {Fifth International Conference on Mars},\n    year = 1999,\n    month = jul,\n    number = {\\#6042},\n    organization = {Lunar and Planetary Institute, Houston (CD-ROM)},\n    adsurl = {http://adsabs.harvard.edu/cgi-bin/nph-bib_query?bibcode=1999ficm.conf.6042A&db_key=AST},\n    adsnote = {Provided by the NASA Astrophysics Data System}\n}\n\n@ARTICLE{1996P&SS...44...65A,\n    author = {{Acton}, C.~H.},\n    title = \"{Ancillary data services of NASA's Navigation and Ancillary\n                Information Facility}\",\n    journal = {Planetary and Space Science},\n    year = 1996,\n    month = jan,\n    volume = 44,\n    pages = {65-70},\n    adsurl = {http://adsabs.harvard.edu/cgi-bin/nph-bib_query?bibcode=1996P\\%26SS...44...65A&db_key=AST},\n    adsnote = {Provided by the NASA Astrophysics Data System}\n}\n\n% HRSC Stuff:\n@INCOLLECTION{2004mesp.book...17N,\n    author = {{Neukum}, G. and {Jaumann}, R.},\n    title = \"{HRSC: the High Resolution Stereo Camera of Mars Express}\",\n    booktitle = \"Mars Express: the scientific payload\",\n    editor = {{Wilson}, Andrew and {Chicarro}, Agustin},\n    publisher = \"ESA Publications Division, Noordwijk, Netherlands\",\n    number = {ESA SP-1240},\n    year = 2004,\n    month = aug,\n    pages = {17-35},\n   adsurl = {http://adsabs.harvard.edu/cgi-bin/nph-bib_query?bibcode=2004mesp.bo\nok...17N&db_key=AST},\n  adsnote = {Provided by the Smithsonian/NASA Astrophysics Data System}\n}\n\n@INPROCEEDINGS{ ebner04,\n    author = {Ebner H. and Spiegel M. and Albert B. and Bernd G. and Neukum G. et. al.},\n    title = {{Improving The Exterior Orientation of Mars Express Hrsc Imagery}},\n    booktitle = {XXth ISPRS Congress, Commission IV},\n    year = 2004\n}\n\n% SLOG Stereo matching\n@ARTICLE{nishihara05,\n    author = {{Nishihara}, H.K.},\n    title = {{Practical real-time imaging stereo matcher}},\n    journal = {Optical Engineering},\n    volume = 23,\n    number = 5, \n    year = 1984, \n    pages = {{536-545}}\n}\n\n% Current ASP\n@INPROCEEDINGS{edwards06,\n    author = {{Edwards}, L. and {Broxton}, M.}, \n    title = {{Automated 3D Surface Reconstruction from Orbital Imagery}},\n    booktitle = {Proceedings of AIAA Space 2006},\n    location = {San Jose, California}, \n    month = {September},\n    year = 2006\n}\n\n% Stereo pipeline work for MER\n@INPROCEEDINGS{edwards05,\n    author = {{Edwards}, L. and {Bowman}, J. and {Kunz}, C. and {Lees}, D. and {Sims}, M.},\n    title = {{Photo-realistic Terrain Modeling and Visualization for Mars Exploration Rover Science Operations}},\n    booktitle = {Proceedings of IEEE SMC 2005},\n    location = {Hawaii, USA},\n    month = {October},\n    year = 2005\n}\n\n% Viz\n@ARTICLE{nguyen01,\n    author = {Nguyen, L., et al.}, \n    title = {{Virtual reality interfaces for visualization and control of remote vehicles}},\n    journal = {Autonomous Robots}, \n    volume = 11,\n    number = 1, \n    year = 2001\n}\n\n% Original Stereo Pipeline\n@ARTICLE{stoker99,\n    author = {Stoker, C. et al.}, \n    title = {{Analyzing Pathfinder data using virtual reality and superresolved imaging}},\n    journal = {Journal of Geophysical Research}, \n    volume = 104,\n    number = {E4},\n    pages = {8889-8906}, \n    month = {April},\n    year = 1999\n}\n\n@ARTICLE{gupta97,\n    author = {Gupta, Rajiv and Hartley, Richard I.},\n    title = {{Linear Pushbroom Cameras}},\n    journal = {IEEE Transactions on Pattern Analysis and Machine Intelligence},\n    volume = 19,\n    number = 9,\n    month = {September},\n    year = 1997\n}\n\n% HRSC DTM Comparison\n@INPROCEEDINGS{heipke06,\n   author = {C. Heipke and J. Oberst et. al},\n   title = {{The HRSC DTM Test}},\n   booktitle = {Symposium of ISPRS Commission IV - Geo Spatial Databases for Sustainable Development},\n   year = 2006\n}\n\n% USGS analysis of MOC DTMs (some washboarding/DTM registration references)\n@ARTICLE{kirk02,\n   author = {Kirk, R.L. and Soderblom, Laurence A. and\n                  Howington-Kraus, Elipitha and Archinal, Brent},\n   title = {{USGS High-Resolution Topomapping of Mars with Mars Orbiter\n                  Camera Narrow-Angle Images}},\n   journal = {IAPRS: GeoSpatial Theory, Processing and Applications},\n   volume = 34, \n   part = 4,\n   year = 2002\n}\n\n@INPROCEEDINGS{2002LPI....33.1845I,\n   author = {{Ivanov}, A.~B. and {Lorre}, J.~J.},\n    title = \"{Analysis of Mars Orbiter Camera Stereo Pairs}\",\nbooktitle = {Lunar and Planetary Institute Conference Abstracts},\n     year = 2002,\n    month = mar,\n    pages = {1845-+},\n   adsurl = {http://adsabs.harvard.edu/cgi-bin/nph-bib_query?bibcode=2002LPI....33.1845I&db_key=AST},\n  adsnote = {Provided by the Smithsonian/NASA Astrophysics Data System}\n}\n\n% SIFT\n@ARTICLE{lowe04,\n   author = {Lowe, David G.},\n   title = {{Distinctive Image Features from Scale-Invariant Keypoints}},\n   journal = { International Journal of Computer Vision },\n   year = 2004\n}\n\n% RANSAC\n@ARTICLE{ fischler81,\n   author = {Fischler, Martin A. and Bolles, Robert C.},\n   title = {{Random Sample Consensus: A Paradigm for Model Fitting with\n                  Applications to Image Analysis and Automated\n                  Cartography}},\n   journal = {Graphics and Image Processing},\n   volume = 24,\n   number = 6,\n   month = {June},\n   year = 1981\n}\n\n% Vision Workbench\n@unpublished{\n\tvisionworkbench,\n\tauthor = {NASA ARC Intelligent Systems Division},\n\ttitle = {{NASA Vision Workbench}},\n\tnote = \"NASA Ames Research Center, Moffett Field, CA. {\\em http://ti.arc.nasa.gov/visionworkbench/}\",\n\turl = {http://ti.arc.nasa.gov/visionworkbench/}\n\t}\n\n@unpublished{ brady06,\n\tauthor = {Brady, Tye},\n\ttitle = {{ALHAT Requirements}},\n\tnote = \"presentation at the Lunar Coordinate Systems Review Data Product Recommendation Meeting, NASA Ames Research Center, October 11.\",\n}\n\n@string{ICCV = \"International Conference on Computer Vision\"}\n@string{CVPR = \"IEEE Computer Vision and Pattern Recognition or CVPR.\"}\n\n@inproceedings{Stein06:attenuating,\n   author = \"Andrew Stein and Andres Huertas and Larry Matthies\",\n   title = \"Attenuating Stereo Pixel-Locking via Affine Window Adaptation\",\n   booktitle = \"IEEE International Conference on Robotics and Automation\",\n   pages = \"914 - 921\",\n   month = \"May\",\n   year = \"2006\"\n}\n\n@ARTICLE{Sun02rectangular,\nauthor=\"Sun, Changming\",\ntitle=\"Fast Stereo Matching Using Rectangular Subregioning and 3D Maximum-Surface Techniques\",\njournal=\"International Journal of Computer Vision\",\nyear=\"2002\",\nmonth=\"Apr\",\nday=\"01\",\nvolume=\"47\",\nnumber=\"1\",\npages=\"99--117\",\nissn=\"1573-1405\",\nurl=\"https://doi.org/10.1023/A:1014585622703\"\n}\n\n\n\n@ARTICLE{Nishihara84practical,\n   author = {H.K. Nishihara},\n   title = {{PRISM: A Practical real-time imaging stereo matcher}}, \n   journal = {{Optical Engineering}},\n   volume = {23}, \n   number = {5}, \n   year = {1984},\n   pages = {536-545}\n}\n\n\n@ARTICLE{Szeliski03sampling,\n   author = \"Richard Szeliski and Daniel Scharstein\",\n   title = {{Sampling the Disparity Space Image}},\n   journal = {{IEEE Transactions on Pattern Analysis and Machine Intelligence (PAMI)}},\n   year = \"2003\",\n   volume = \"26\",\n   pages = \"419 - 425\"\n}\n\n@inproceedings{robinson05:lroc,\n   author = \"M.S. Robinson and E.M. Eliason and H. Hiesinger and\n                  B.L. Jolliff and A.S. McEwen and M.C. Malin and\n                  M.A. Ravine and D. Roberts and P.C. Thomas and\n                  E.P. Turtle\",\n   title = {{LROC - Lunar Reconaissance Orbiter Camera}},\n   booktitle = \"Proc of the Lunar and Planetary Science Conference (LPSC) XXXVI\",\n   pages = \"1576\",\n   month = \"March\",\n   year = \"2005\"\n}\n\n@inproceedings{anderson08:isis,\n   author = \"J.A. Anderson\",\n   title = {{ISIS Camera Model Design}},\n   booktitle = \"Proc of the Lunar and Planetary Science Conference (LPSC) XXXIX\",\n   pages = \"2159\",\n   month = \"March\",\n   year = \"2008\"\n}\n\n@inproceedings{lawrence08:apollo,\n   author = \"S. J. Lawrence and M. S. Robinson and M. Broxton and\n                  J. D. Stopar and W. Close and J. Grunsfeld and\n                  R. Ingram and L. Jefferson and S. Locke and\n                  R. Mitchell and T. Scarsella and M. White and\n                  M. A. Hager and T. R. Watters ad E. Bowman-Cisneros\n                  and J. Danton and J. Garvin\",\n   title = {{The Apollo Digital Image Archive: New Research and Data Products}},\n   booktitle = \"Proc of the NLSI Lunar Science Conference\",\n   pages = \"2066\",\n   year = \"2008\"\n}\n\n@ARTICLE{Baker04:lucas-kanade,\nauthor=\"Baker, Simon and Matthews, Iain\",\ntitle=\"Lucas-Kanade 20 Years On: A Unifying Framework\",\njournal=\"International Journal of Computer Vision\",\nyear=\"2004\",\nmonth=\"Feb\",\nday=\"01\",\nvolume=\"56\",\nnumber=\"3\",\npages=\"221--255\",\nissn=\"1573-1405\",\nurl=\"https://doi.org/10.1023/B:VISI.0000011205.11775.fd\"\n}\n\n\n@phdthesis{Menard97:robust,\n    author = {Christian Menard},\n    title = {{Robust Stereo and Adaptive Matching in Correlation Scale-Space}},\n    school = {Institute of Automation, Vienna Institute of Technology (PRIP-TR-45)},\n    year = \"1997\",\n    month = \"January\"\n}\n\n \t\n@article{Nehab05:improved,\nauthor = {Diego Nehab and Szymon Rusinkiewicz and James Davis},\ntitle = {Improved Sub-pixel Stereo Correspondences through Symmetric Refinement},\njournal ={Computer Vision, IEEE International Conference on},\nvolume = {1},\nyear = {2005},\nissn = {1550-5499},\npages = {557-563},\npublisher = {IEEE Computer Society},\naddress = {Los Alamitos, CA, USA},\n}\n\n@ARTICLE{cheng04:bayesian,\ntitle={Bayesian Stereo Matching},\nauthor={ Li Cheng and Caelli, T.},\njournal={Computer Vision and Pattern Recognition Workshop, 2004. CVPRW '04. Conference on},\nyear={2004},\nmonth={June},\nvolume={},\nnumber={},\npages={ 192-192},\nISSN={}, }\n\n@inproceedings{nefian:bayes_em,\n   title={{A Bayesian Formulation for Subpixel Refinement in Stereo Orbital Imagery}},\n   author={ Ara V. Nefian and Kyle Husmann and Michael Broxton and Mattew D. Hancher and Michael Lundy},\n   booktitle = \"to appear in the Proceedings of the 2009 IEEE International Conference on Image Processing\",\n   year = \"2009\"\n}\n\n@inproceedings{broxton:isvc09,\n   title={{ 3D Lunar Terrain Reconstruction from Apollo Images }},\n   author={ Michael Broxton and Ara V. Nefian and Zachary Moratto and Taemin Kim and Michael Lundy and Aleksandr V. Segal },\n   booktitle = {{to appear in the Proceedings of the 5th International Symposium on Visual Computing}},\n   year = \"2009\"\n}\n\n@inproceedings{konolige:sparsesparse,\n\ttitle = {Sparse Sparse Bundle Adjustment},\n\tbooktitle = {British Machine Vision Conference},\n\tyear = {2010},\n\tmonth = {08/2010},\n\taddress = {Aberystwyth, Wales},\n\tkeywords = {computer vision, perception},\n\tattachments = {http://www.willowgarage.com/sites/default/files/ssba.pdf},\n\tauthor = {Kurt Konolige}\n}\n\n@article{cholmod,\n author = {Chen, Yanqing and Davis, Timothy A. and Hager, William W. and Rajamanickam, Sivasankaran},\n title = {Algorithm 887: CHOLMOD, Supernodal Sparse Cholesky Factorization and Update/Downdate},\n journal = {ACM Trans. Math. Softw.},\n issue_date = {October 2008},\n volume = {35},\n number = {3},\n month = oct,\n year = {2008},\n issn = {0098-3500},\n pages = {22:1--22:14},\n articleno = {22},\n numpages = {14},\n url = {http://doi.acm.org/10.1145/1391989.1391995},\n acmid = {1391995},\n publisher = {ACM},\n address = {New York, NY, USA},\n keywords = {Cholesky factorization, linear equations, sparse matrices},\n}\n\n@misc{lunokhod:controlnetwork,\nauthor = {Moratto, Zachary},\ntitle = {Creating Control Networks and Bundle Adjusting with ISIS3},\njournal = {Lunokhod},\ntype = {Blog},\nnumber = {March 5},\nyear = {2012},\nhowpublished = {\\url{http://lunokhod.org/?p=468}}\n}\n\n@misc{lunokhod:gcp,\nauthor = {Moratto, Zachary},\ntitle = {Making well registered DEMs with ISIS and Ames Stereo Pipeline},\njournal = {Lunokhod},\ntype = {Blog},\nnumber = {April 14},\nyear = {2012},\nhowpublished = {\\url{http://lunokhod.org/?p=559}}\n}\n\n@unpublished{isis:documentation,\n\tauthor = {USGS Astrogeology Science Center},\n\ttitle = {{USGS ISIS Documentation}},\n\tnote = \"Isis 3 Application Documentation {\\em http://isis.astrogeology.usgs.gov/Application/index.html}\",\n\turl = {http://isis.astrogeology.usgs.gov/Application/index.html}\n}\n\n@misc{cgiar:srtm90m,\n        author = {The CGIAR Consortium for Spatial Information},\n        title = {{CGIAR-CSI SRTM 90m DEM Digital Elevation Database}},\n        url = {http://srtm.csi.cgiar.org}\n}\n\n@unpublished{digital-globe:samples,\n        author = {Digital Globe},\n        title  = {{Satellite Imagery and Geospatial Information Products}},\n        note   = \"Digital Globe sample imagery {\\em https://www.digitalglobe.com/samples}\",\n        url    = {https://www.digitalglobe.com/samples}\n}\n\n@unpublished{digital-globe:camera,\n        author = {Digital Globe},\n        title  = {{Radiometric Use of WorldView 2 Imagery}},\n        note   = \"Description of the WV02 camera\",\n        url    = {https://dg-cms-uploads-production.s3.amazonaws.com/uploads/document/file/104/Radiometric_Use_of_WorldView-2_Imagery.pdf}\n}\n\n@misc{planetaryblog:vesta,\n        author = {Machacek, Daniel},\n        title  = {{Images from the long-awaited Dawn Vesta data set}},\n        journal = {The Planetary Society},\n        type = {Guest Blog},\n        number = {November 29},\n        year = {2012},\n        howpublished = {\\url{http://www.planetary.org/blogs/guest-blogs/20121129-machacek-dawn-vesta.html}}\n}\n\n% Multi-view triangulation\n@unpublished{slabaugh2001optimal,\n  title={Optimal ray intersection for computing 3d points from n-view correspondences},\n  author={Slabaugh, Greg and Schafer, Ron and Livingston, Mark},\n  year={2001},\n  note={},\n  url={http://www.gregslabaugh.net/publications/opray.pdf}\n}\n\n% Lunar lambertian\n@article{mcewen1991photometric,\n  title={Photometric functions for photoclinometry and other applications},\n  author={McEwen, Alfred S},\n  journal={Icarus},\n  volume={92},\n  number={2},\n  pages={298--311},\n  year={1991},\n  publisher={Elsevier}\n}\n\n@article{lohse2006derivation,\n  title={Derivation of planetary topography using multi-image shape-from-shading},\n  author={Lohse, Volker and Heipke, Christian and Kirk, Randolph L},\n  journal={Planetary and space science},\n  volume={54},\n  number={7},\n  pages={661--674},\n  year={2006},\n  publisher={Elsevier}\n}\n\n@article{abrams2002aster,\n  title={ASTER User Handbook, version 2},\n  author={Abrams, Michael and Hook, Simon and Ramachandran, Bhaskar},\n  journal={Jet Propulsion Laboratory},\n  volume={4800},\n  pages={135},\n  year={2002}\n}\n\n@article{girod2015improvement,\n  title={Improvement of DEM generation from ASTER images using satellite jitter estimation and open source implementation},\n  author={Girod, L and Nuth, C and K{\\\"a}{\\\"a}b, A},\n  journal={The International Archives of Photogrammetry, Remote Sensing and Spatial Information Sciences},\n  volume={40},\n  number={1},\n  pages={249},\n  year={2015},\n  publisher={Copernicus GmbH}\n}\n\n%% This BibTeX bibliography file was created using BibDesk.\n%% http://bibdesk.sourceforge.net/\n\n\n%% Created for Ross Beyer at 2014-03-24 17:05:49 -0700 \n\n\n%% Saved with string encoding Unicode (UTF-8) \n\n\n\n@article{2012P&SS...71...64D,\n\tAdsnote = {Provided by the SAO/NASA Astrophysics Data System},\n\tAdsurl = {http://adsabs.harvard.edu/abs/2012P%26SS...71...64D},\n\tAuthor = {{Debei}, S. and {Aboudan}, A. and {Colombatti}, G. and {Pertile}, M.},\n\tDate-Added = {2014-03-25 00:05:00 +0000},\n\tDate-Modified = {2014-03-25 00:05:10 +0000},\n\tJournal = {Planetary and Space Science},\n\tMonth = oct,\n\tPages = {64-72},\n\tTitle = {{Lutetia surface reconstruction and uncertainty analysis}},\n\tVolume = 71,\n\tYear = 2012,\n\tBdsk-Url-1 = {http://dx.doi.org/10.1016/j.pss.2012.07.013}\n\t}\n\n@inproceedings{Kunz:2010zr,\n\tAnnote = {References Broxton et al., but doesn't really use ASP.},\n\tAuthor = {Kunz, C. and Singh, H.},\n\tBooktitle = {Autonomous Underwater Vehicles (AUV), 2010 IEEE/OES},\n\tDate-Added = {2013-04-26 19:59:28 +0000},\n\tDate-Modified = {2013-04-26 19:59:32 +0000},\n\tIssn = {1522-3167},\n\tKeywords = {SLAM (robots);calibration;distance measurement;image matching;mobile robots;pose estimation;remotely operated vehicles;robot vision;stereo image processing;underwater vehicles;AUV mapping system;SeaBED AUV;camera calibration;frame-to-frame visual feature matching;full 3D structure recovering;odometry-based pose estimation;on-board vehicle navigation sensor;robot;seafloor mapping;simultaneous localization and mapping;stereo calibration;stereo self-calibration;stereo vision;stereo visual odometry;structure from motion;subpixel stereo correspondence estimation;visual maps;Calibration;Cameras;Image reconstruction;Navigation;Sea measurements;Vehicles;Visualization},\n\tPages = {1-7},\n\tTitle = {Stereo self-calibration for seafloor mapping using AUVs},\n\tYear = {2010},\n\tBdsk-Url-1 = {http://dx.doi.org/10.1109/AUV.2010.5779655}}\n\n@article{Kim20092095,\n\tAnnote = {Mentions, but does not use ASP.},\n\tAuthor = {J.R. Kim and J.-P. Muller},\n\tDate-Added = {2013-04-26 19:03:21 +0000},\n\tDate-Modified = {2013-04-26 19:03:26 +0000},\n\tIssn = {0032-0633},\n\tJournal = {Planetary and Space Science},\n\tKeywords = {Slope},\n\tNumber = {14--15},\n\tPages = {2095 - 2112},\n\tTitle = {Multi-resolution topographic data extraction from Martian stereo imagery},\n\tUrl = {http://www.sciencedirect.com/science/article/pii/S0032063309002888},\n\tVolume = {57},\n\tYear = {2009},\n\tBdsk-Url-1 = {http://www.sciencedirect.com/science/article/pii/S0032063309002888},\n\tBdsk-Url-2 = {http://dx.doi.org/10.1016/j.pss.2009.09.024}}\n\n@inproceedings{Schwendner:vn,\n\tAnnote = {Doesn't actually use ASP, just mentions it as an example.},\n\tAuthor = {Schwendner, Jakob and Hidalgo, Javier},\n\tBooktitle = {International Symposium on Artificial Intelligence, Robotics and Automation in Space (i-SAIRAS)},\n\tDate-Added = {2013-04-26 18:58:34 +0000},\n\tDate-Modified = {2013-04-26 19:01:09 +0000},\n\tMonth = {September},\n\tTitle = {Terrain Aided navgiation for Plaentary Exploration Missions},\n\tYear = {2012}}\n\n@article{Debei201264,\n\tAnnote = {ASP is mentioned as an example, but I don't think this text is 'using' ASP for their results.},\n\tAuthor = {Stefano Debei and Alessio Aboudan and Giacomo Colombatti and Marco Pertile},\n\tDate-Added = {2013-04-26 18:54:17 +0000},\n\tDate-Modified = {2013-04-26 18:54:26 +0000},\n\tIssn = {0032-0633},\n\tJournal = {Planetary and Space Science},\n\tKeywords = {Uncertainty},\n\tNumber = {1},\n\tPages = {64 - 72},\n\tTitle = {Lutetia surface reconstruction and uncertainty analysis},\n\tUrl = {http://www.sciencedirect.com/science/article/pii/S0032063312002073},\n\tVolume = {71},\n\tYear = {2012},\n\tBdsk-Url-1 = {http://www.sciencedirect.com/science/article/pii/S0032063312002073},\n\tBdsk-Url-2 = {http://dx.doi.org/10.1016/j.pss.2012.07.013}}\n\n@article{Li:2011fk,\n\tAnnote = {Doesn't really \"use\" ASP, just obliquely talks about it.},\n\tAuthor = {Rongxing Li and Juwon Hwangbo and Yunhang Chen and Kaichang Di},\n\tDate-Added = {2013-04-26 18:23:29 +0000},\n\tDate-Modified = {2013-04-26 18:24:06 +0000},\n\tIssn = {0196-2892},\n\tJournal = {Geoscience and Remote Sensing, IEEE Transactions on},\n\tNumber = {7},\n\tPages = {2558-2572},\n\tTitle = {Rigorous Photogrammetric Processing of HiRISE Stereo Imagery for Mars Topographic Mapping},\n\tVolume = {49},\n\tYear = {2011},\n\tBdsk-Url-1 = {http://dx.doi.org/10.1109/TGRS.2011.2107522}\n}\n\n@article{hirschmuller_sgm_original,\n  title={Stereo Processing by Semiglobal Matching and Mutual Information},\n  author={Hirschm{\\\"u}ller, Heiko},\n  journal={IEEE Transactions on Pattern Analysis and Machine Intelligence},\n  volume={30},\n  pages={328--341},\n  year={2008},\n  publisher={IEEE Computer Society}\n}\n\n@article{hirschmuller_hrsc_with_sgm,\n  title={Stereo processing of HRSC Mars Express images by semi-global matching},\n  author={Hirschm{\\\"u}ller, Heiko and Mayer, Helmut and Neukum, G and others},\n  journal={Int. Arch. Photogramm. Remote Sensing Spatial Inf. Sci},\n  volume={36},\n  pages={305--310},\n  year={2006}\n}\n\n@inproceedings{xiang_2016_low_complexity_fsgm,\n  title={Low complexity optical flow using neighbor-guided semi-global matching},\n  author={Xiang, Jiang and Li, Ziyun and Blaauw, David and Kim, Hun Seok and Chakrabarti, Chaitali},\n  booktitle={2016 IEEE International Conference on Image Processing (ICIP)},\n  pages={4483--4487},\n  year={2016},\n  organization={IEEE}\n}\n\n@inproceedings{rothermel2012sure_isgm,\n  title={SURE: Photogrammetric surface reconstruction from imagery},\n  author={Rothermel, Mathias and Wenzel, Konrad and Fritsch, Dieter and Haala, Norbert},\n  booktitle={Proceedings LC3D Workshop, Berlin},\n  volume={8},\n  year={2012}\n}\n\n\n@article{hapke2008bidirectional,\n  title={Bidirectional reflectance spectroscopy: 6. Effects of porosity},\n  author={Hapke, Bruce},\n  journal={Icarus},\n  volume={195},\n  number={2},\n  pages={918--926},\n  year={2008},\n  publisher={Elsevier}\n}\n\n@article{hapke1993opposition,\n  title={The opposition effect of the moon: The contribution of coherent backscatter},\n  author={Hapke, Bruce W and Nelson, Robert M and Smythe, William D},\n  journal={Science},\n  volume={260},\n  number={5107},\n  pages={509--511},\n  year={1993}\n}\n\n@article{johnson2006spectrophotometric,\n  title={Spectrophotometric properties of materials observed by Pancam on the Mars Exploration Rovers: 1. Spirit},\n  author={Johnson, Jeffrey R and Grundy, William M and Lemmon, Mark T and Bell, James F and Johnson, Miles J and Deen, Robert G and Arvidson, Raymond E and Farrand, William H and Guinness, Edward A and Hayes, Alexander G and others},\n  journal={Journal of Geophysical Research: Planets},\n  volume={111},\n  number={E2},\n  year={2006},\n  publisher={Wiley Online Library}\n}\n\n@article{fernando2013surface,\n  title={Surface reflectance of Mars observed by CRISM/MRO: 2. Estimation of surface photometric properties in Gusev Crater and Meridiani Planum},\n  author={Fernando, J and Schmidt, F and Ceamanos, X and Pinet, P and Dout{\\'e}, S and Daydou, Y},\n  journal={Journal of Geophysical Research: Planets},\n  volume={118},\n  number={3},\n  pages={534--559},\n  year={2013},\n  publisher={Wiley Online Library}\n}\n\n@inproceedings{smith2011results,\n  title={Results from the Lunar Orbiter Laser Altimeter (LOLA): global, high resolution topographic mapping of the Moon},\n  author={Smith, DE and Zuber, MT and Neumann, GA and Mazarico, E and Head, J and Torrence, MH and others},\n  booktitle={Lunar and Planetary Science Conference},\n  volume={42},\n  pages={2350},\n  year={2011}\n}\n\n@inproceedings{zabih1994census,\n  title={Non-parametric local transforms for computing visual correspondence},\n  author={Zabih, Ramin and Woodfill, John},\n  booktitle={European conference on computer vision},\n  pages={151--158},\n  year={1994},\n  organization={Springer}\n}\n\n@article{hua2016texture,\n  title={Texture-Aware Dense Image Matching Using Ternary Census Transform},\n  author={Hua, Han and Chenb, Chongtai and Wua, Bo and Yangc, Xiaoxia and Zhub, Qing and Dingb, Yulin},\n  journal={ISPRS Annals of Photogrammetry, Remote Sensing and Spatial Information Sciences},\n  pages={59--66},\n  year={2016}\n}\n\n@inproceedings{facciolo2015mgm,\n  title={Mgm: A significantly more global matching for stereovision},\n  author={Facciolo, Gabriele and De Franchis, Carlo and Meinhardt, Enric},\n  booktitle={Proceedings of the British Machine Vision Conference (BMVC), BMVA Press},\n  pages={90--1},\n  year={2015}\n}\n\n@article{asp2018,\nauthor = {Beyer, Ross A. and Alexandrov, Oleg and McMichael, Scott},\ntitle = {The {Ames Stereo Pipeline}: {NASA}'s Open Source Software for Deriving and Processing Terrain Data},\njournal = {Earth and Space Science},\nvolume = {},\nnumber = {},\npages = {}\n}\n\n@article{guizar2008efficient,\n  title={Efficient subpixel image registration algorithms},\n  author={Guizar-Sicairos, Manuel and Thurman, Samuel T and Fienup, James R},\n  journal={Optics letters},\n  volume={33},\n  number={2},\n  pages={156--158},\n  year={2008},\n  publisher={Optical Society of America}\n}\n@inproceedings{toldo2010global,\n  title={Global registration of multiple point clouds embedding the generalized procrustes analysis into an ICP framework},\n  author={Toldo, Roberto and Beinat, Alberto and Crosilla, Fabio},\n  booktitle={Proc. 3DPVT},\n  pages={109--122},\n  year={2010}\n}\n\n@article{sohn2004mathematical,\n  title={Mathematical modelling of historical reconnaissance CORONA KH-4B imagery},\n  author={Sohn, Hong-Gyoo and Kim, Gi-Hong and Yom, Jae-Hong},\n  journal={The Photogrammetric Record},\n  volume={19},\n  number={105},\n  pages={51--66},\n  year={2004},\n  publisher={Wiley Online Library}\n}\n\n@inproceedings{schenk2003rigorous,\n  title={Rigorous panoramic camera model for DISP imagery},\n  author={Schenk, Toni and Csatho, Beata and Shin, Sung Woong},\n  booktitle={Proceedings of the ISPRS Workshop: High Resolution Mapping from Space},\n  year={2003}\n}\n\n@inproceedings{hare2017community,\n  title={Community Sensor Model standard for the planetary domain},\n  author={Hare, TM and Kirk, RL},\n  booktitle={Lunar and Planetary Science Conference},\n  volume={48},\n  year={2017}\n}\n\n@article{tsai1987,\n  author={R. {Tsai}},\n  journal={IEEE Journal on Robotics and Automation},\n  title={A versatile camera calibration technique for high-accuracy 3D machine vision metrology using off-the-shelf TV cameras and lenses},\n  year={1987},\n  volume={3},\n  number={4},\n  pages={323-344},\n  keywords={Calibration;Machine vision;Measurement;Cameras;Calibration;Machine vision;Metrology;TV;Lenses;Robot vision systems;Robotic assembly;Robot kinematics;Application software},\n  doi={10.1109/JRA.1987.1087109},\n  ISSN={2374-8710},\n  month={August}\n}\n\n@article{brown1971,\n  author={Brown, D. C.},\n  journal={Photogrammetric Engineering},\n  title={Close-Range Camera Calibration},\n  year=1971,\n  volume=37,\n  number=8,\n  pages={855-866}\n}\n\n@article{brown1966,\n  author={Brown, D. C.},\n  journal={Photogrammetric Engineering},\n  title={Decentering Distortion of Lenses},\n  year=1966,\n  volume=32,\n  number=3,\n  pages={444-462}\n}\n\n@article{2019EA000713,\n  author = {Laura, J.R. and Mapel, J. and Hare, T.},\n  title = {Planetary Sensor Models Interoperability using the Community Sensor Model Specification},\n  year = 2020,\n  journal = {Earth and Space Science},\n  pages = {e2019EA000713},\n  doi = {10.1029/2019EA000713},\n  url = {https://agupubs.onlinelibrary.wiley.com/doi/abs/10.1029/2019EA000713},\n  eprint = {https://agupubs.onlinelibrary.wiley.com/doi/pdf/10.1029/2019EA000713},\n  note = {e2019EA000713 2019EA000713}\n}\n\n@techreport{CSMTRD,\nauthor = {Community Sensor Model Working Group},\ntitle = {{Community Sensor Model (CSM) Technical Requirements Document (TRD)}},\ninstitution = {National Geospatial Intelligence Agency},\nyear = 2007,\nurl = {https://gwg.nga.mil/documents/csmwg/CSM_TRD__Version_2.A%20Revision_2007_Aug_01__for_DISR.pdf}\n}\n\n@INPROCEEDINGS{2015LPI462703B,\n       author = {{Becker}, K.~J. and {Archinal}, B.~A. and {Hare}, T.~H. and\n         {Kirk}, R.~L. and {Howington-Kraus}, E. and {Robinson}, M.~S. and\n         {Rosiek}, M.~R.},\n        title = \"{Criteria for Automated Identification of Stereo Image Pairs}\",\n    booktitle = {Lunar and Planetary Science Conference},\n         year = 2015,\n       series = {Lunar and Planetary Science Conference},\n        month = mar,\n        pages = {2703},\n          url = {https://ui.adsabs.harvard.edu/abs/2015LPI....46.2703B},\n      adsnote = {Provided by the SAO/NASA Astrophysics Data System}\n}\n\n@article{thormahlen1985refractive,\n  title={Refractive index of water and its dependence on wavelength, temperature, and density},\n  author={Thorm{\\\"a}hlen, I and Straub, Johannes and Grigull, Ulrich},\n  journal={Journal of physical and chemical reference data},\n  volume={14},\n  number={4},\n  pages={933--945},\n  year={1985},\n  publisher={American Institute of Physics for the National Institute of Standards and~…}\n}\n\n@article{harvey1998calibration,\n  title={Calibration stability of an underwater stereo-video system: implications for measurement accuracy and precision},\n  author={Harvey, Evan S and Shortis, Mark R},\n  journal={Marine Technology Society Journal},\n  volume={32},\n  number={2},\n  pages={3--17},\n  year={1998},\n  publisher={Washington, DC: Marine Technology Society}\n}\n\n@article{austin1976index,\n  title={The index of refraction of seawater, 121 pp},\n  author={Austin, RW and Halikas, G},\n  journal={Scripps Inst. of Oceanogr., Ia Jolla, Calif},\n  year={1976}\n}\n\n@book{mobley1995optical,\n  title={The optical properties of water. Handbook of Optics, ed Bass M},\n  author={Mobley, CD},\n  year={1995},\n  publisher={McGraw-Hill, New York),}\n}\n\n@book{jerlov1976marine,\n  title={Marine optics},\n  author={Jerlov, Nils Gunnar},\n  year={1976},\n  publisher={Elsevier}\n}\n\n@article{tukey1977exploratory,\n  title={Exploratory Data Analysis Addision-Wesley},\n  author={Tukey, John W},\n  journal={Reading, Ma},\n  volume={688},\n  year={1977}\n}\n\n@article{buades2015reliable,\n  title={Reliable multiscale and multiwindow stereo matching},\n  author={Buades, Antoni and Facciolo, Gabriele},\n  journal={SIAM Journal on Imaging Sciences},\n  volume={8},\n  number={2},\n  pages={888--915},\n  year={2015},\n  publisher={SIAM}\n}\n\n@INPROCEEDINGS{Geiger2010ACCV,\n  author = {Andreas Geiger and Martin Roser and Raquel Urtasun},\n  title = {Efficient Large-Scale Stereo Matching},\n  booktitle = {Asian Conference on Computer Vision (ACCV)},\n  year = {2010}\n}\n\n@inproceedings{de2014automatic,\n  title={An automatic and modular stereo pipeline for pushbroom images},\n  author={De Franchis, Carlo and Meinhardt-Llopis, Enric and Michel, Julien and Morel, Jean-Michel and Facciolo, Gabriele},\n  booktitle={ISPRS Annals of the Photogrammetry, Remote Sensing and Spatial Information Sciences},\n  year={2014}\n}\n\n@article{tao2018massive,\n  title={Massive stereo-based DTM production for Mars on cloud computers},\n  author={Tao, Y and Muller, J-P and Sidiropoulos, P and Xiong, Si-Ting and Putri, ARD and Walter, SHG and Veitch-Michaelis, J and Yershov, V},\n  journal={Planetary and Space Science},\n  volume={154},\n  pages={30--58},\n  year={2018},\n  publisher={Elsevier}\n}\n\n@article{nugent1966velocity,\n  title={Velocity aberration and atmospheric refraction in satellite laser communication experiments},\n  author={Nugent, LJ and Condon, RJ},\n  journal={Applied optics},\n  volume={5},\n  number={11},\n  pages={1832--1837},\n  year={1966},\n  publisher={Optical Society of America}\n}\n\n@article{bhushan2021automated,\n  title={Automated digital elevation model (DEM) generation from very-high-resolution Planet SkySat triplet stereo and video imagery},\n  author={Bhushan, Shashank and Shean, David and Alexandrov, Oleg and Henderson, Scott},\n  journal={ISPRS Journal of Photogrammetry and Remote Sensing},\n  volume={173},\n  pages={151--165},\n  year={2021},\n  publisher={Elsevier}\n}\n\n\n@article{palaseanu2021bathy, \n  title = {Open source satellite derived bathymetry module for NASA Ames Stereo Pipeline}, \n  author = {Palaseanu, Monica and Alexandrov, Oleg and Danielson, Jeff}, \n  journal = {Earth and Space Science Open Archive}, \n  pages = {4}, \n  year = {2021},\n  doi = {10.1002/essoar.10509185.1}, \n  url = {https://doi.org/10.1002/essoar.10509185.1}\n}\n\n\n@article{alexandrov2018multiview,\n  title={Multiview Shape-From-Shading for Planetary Images},\n  author={Alexandrov, Oleg and Beyer, Ross A},\n  journal={Earth and Space Science},\n  volume={5},\n  number={10},\n  pages={652--666},\n  year={2018},\n  publisher={Wiley Online Library}\n}\n\n@article{tao2016optimised,\n  title={An optimised system for generating multi-resolution DTMS using NASA DTMS datasets},\n  author={Tao, Y and Muller, JP and Sidiropoulos, P and Veitch-Michaelis, J and Yershov, V},\n  journal={ISPRS-International Archives of the Photogrammetry, Remote Sensing and Spatial Information Sciences},\n  volume={41},\n  pages={115--121},\n  year={2016},\n  publisher={Copernicus GmbH}\n}\n\n@article{sidiropoulos2018automatic,\n  title={Automatic coregistration and orthorectification (ACRO) and subsequent mosaicing of NASA high-resolution imagery over the Mars MC11 quadrangle, using HRSC as a baseline},\n  author={Sidiropoulos, Panagiotis and Muller, Jan-Peter and Watson, Gillian and Michael, Gregory and Walter, Sebastian},\n  journal={Planetary and Space Science},\n  volume={151},\n  pages={33--42},\n  year={2018},\n  publisher={Elsevier}\n}\n\n@article{remy2002gstl,\n  title={GsTL: The geostatistical template library in C++},\n  author={Remy, Nicolas and Shtuka, Arben and Levy, Bruno and Caers, Jef},\n  journal={Computers \\& Geosciences},\n  volume={28},\n  number={8},\n  pages={971--979},\n  year={2002},\n  publisher={Elsevier}\n}\n\n@article{ohman2015procedure,\n  title={Procedure for processing LRO WAC monochromatic images with ISIS 3 for photogeologic purposes},\n  author={{\\\"O}hman, Teemu},\n  url = {https://www.lpi.usra.edu/lunar/tools/dems/Ohman_mono-WAC_ISIS_procedure_v1-1.pdf},\n  journal={Lunar and Planetary Institute},\n  year={2015}\n}\n\n@article{kirk2016semi,\n  title={A semi-rigorous sensor model for precision geometric processing of mini-RF bistatic radar images of the moon},\n  author={Kirk, RL and Barrett, JM and Wahl, DE and Erteza, I and Jackowatz, CV and Yocky, DA and Turner, S and Bussey, DBJ and Paterson, GW},\n  journal={The International Archives of Photogrammetry, Remote Sensing and Spatial Information Sciences},\n  volume={41},\n  pages={425},\n  year={2016},\n  publisher={Copernicus GmbH}\n}\n\n@inproceedings{kirk2011radargrammetric,\n  title={Radargrammetric Analysis of Mini-RF Lunar Images},\n  author={Kirk, RL and Howington-Kraus, E and Becker, TL and Cook, D and Barrett, JM and Neish, CD and Thomson, BJ and Bussey, DBJ},\n  booktitle={EPSC-DPS Joint Meeting 2011},\n  volume={2011},\n  pages={1473},\n  year={2011}\n}\n\n@article{shin2012progressively,\n  title={Progressively weighted affine adaptive correlation matching for quasi-dense 3D reconstruction},\n  author={Shin, Dongjoe and Muller, Jan-Peter},\n  journal={Pattern Recognition},\n  volume={45},\n  number={10},\n  pages={3795--3809},\n  year={2012},\n  publisher={Elsevier}\n}\n\n@article{otto1989region,\n  title={‘Region-growing’algorithm for matching of terrain images},\n  author={Otto, G Paul and Chau, Tony KW},\n  journal={Image and vision computing},\n  volume={7},\n  number={2},\n  pages={83--94},\n  year={1989},\n  publisher={Elsevier}\n}\n\n@article{bertone2023highly,\n  title={Highly Resolved Topography and Illumination at Mercury’s South Pole from MESSENGER MDIS NAC},\n  author={Bertone, Stefano and Mazarico, Erwan and Barker, Michael K and Siegler, Matthew A and Martinez-Camacho, Jose M and Hamill, Colin D and Glantzberg, Allison K and Chabot, Nancy L},\n  journal={The Planetary Science Journal},\n  volume={4},\n  number={2},\n  pages={21},\n  year={2023},\n  publisher={IOP Publishing}\n}\n\n@article{caravaca20203d,\n  title={3D digital outcrop model reconstruction of the Kimberley outcrop (Gale crater, Mars) and its integration into Virtual Reality for simulated geological analysis},\n  author={Caravaca, Gw{\\'e}na{\\\"e}l and Le Mou{\\'e}lic, St{\\'e}phane and Mangold, Nicolas and L’Haridon, Jonas and Le Deit, Laetitia and Mass{\\'e}, Marion},\n  journal={Planetary and Space Science},\n  volume={182},\n  pages={104808},\n  year={2020},\n  publisher={Elsevier}\n}\n@Article{palaseanu2023,\nAUTHOR = {Palaseanu-Lovejoy, Monica and Alexandrov, Oleg and Danielson, Jeff and Storlazzi, Curt},\nTITLE = {SaTSeaD: Satellite Triangulated Sea Depth Open-Source Bathymetry Module for NASA Ames Stereo Pipeline},\nJOURNAL = {Remote Sensing},\nVOLUME = {15},\nYEAR = {2023},\nNUMBER = {16},\nARTICLE-NUMBER = {3950},\nURL = {https://www.mdpi.com/2072-4292/15/16/3950},\nISSN = {2072-4292},\nABSTRACT = {},\nDOI = {10.3390/rs15163950}\n}\n\n@article{jakkula2010efficient,\n  title={Efficient feature detection using OBAloG: optimized box approximation of Laplacian of Gaussian},\n  JOURNAL = {Master thesis, Kansas State University},\n  author={Jakkula, Vinayak Reddy},\n  year={2010}\n}\n\n@article{jindal2024measuring_v2,\n  title={Measuring erosional and depositional patterns across Comet 67P's Imhotep region},\n  author={Jindal, AS and Birch, SPD and Hayes, AG and {\\\"O}zyurt, FP and Issah, AB and Moruzzi, SA and Barrington, MN and Soderblom, JM and Kirk, RL and Marschall, R and others},\n  journal={Journal of Geophysical Research: Planets},\n  volume={129},\n  number={2},\n  pages={e2023JE008089},\n  year={2024},\n  publisher={Wiley Online Library},\n  doi = {https://doi.org/10.1029/2023JE008089}\n}\n\n@article{Miclea_subpixel, \n  author={Miclea, Vlad-Cristian and Vancea, Cristian-Cosmin and Nedevschi, Sergiu},\n  journal={2015 IEEE International Conference on Intelligent Computer Communication and Processing (ICCP)}, \n  title={New sub-pixel interpolation functions for accurate real-time stereo-matching algorithms}, \n  year={2015},\n  volume={},\n  number={},\n  pages={173-178},\n  keywords={Interpolation;Histograms;Accuracy;Real-time systems;Cameras;Approximation algorithms;Pipelines;SGM;Sub-pixel accuracy;Function fitting;Interpolation},\n  doi={10.1109/ICCP.2015.7312625}}\n\n@article{lesage2021constraints,\n  title={Constraints on effusive cryovolcanic eruptions on Europa using topography obtained from Galileo images},\n  author={Lesage, Elodie and Schmidt, Fr{\\'e}d{\\'e}ric and Andrieu, Fran{\\c{c}}ois and Massol, H{\\'e}l{\\`e}ne},\n  journal={Icarus},\n  volume={361},\n  pages={114373},\n  year={2021},\n  publisher={Elsevier}\n}\n\n@article{nuth2011co,\n  title={Co-registration and bias corrections of satellite elevation data sets for quantifying glacier thickness change},\n  author={Nuth, Christopher and K{\\\"a}{\\\"a}b, Andreas},\n  journal={The Cryosphere},\n  volume={5},\n  number={1},\n  pages={271--290},\n  year={2011},\n  publisher={Copernicus GmbH}\n}\n\n@article{goossens2020high,\n  title={High-resolution gravity field models from GRAIL data and implications for models of the density structure of the Moon's crust},\n  author={Goossens, S and Sabaka, TJ and Wieczorek, MA and Neumann, GA and Mazarico, E and Lemoine, FG and Nicholas, JB and Smith, DE and Zuber, MT},\n  journal={Journal of Geophysical Research: Planets},\n  volume={125},\n  number={2},\n  pages={e2019JE006086},\n  year={2020},\n  publisher={Wiley Online Library}\n}\n\n@article{ghuffar2022pipeline,\n  title={A pipeline for automated processing of declassified Corona KH-4 (1962--1972) stereo imagery},\n  author={Ghuffar, Sajid and Bolch, Tobias and Rupnik, Ewelina and Bhattacharya, Atanu},\n  journal={IEEE Transactions on Geoscience and Remote Sensing},\n  volume={60},\n  pages={1--14},\n  year={2022},\n  publisher={IEEE}\n}\n\n@article{boatwright2024sfs,\n  title={SfS-Refined Digital Elevation Models of Malapert Massif and Mons Agnes, Moon},\n  author={Boatwright, Benjamin},\n  journal={Harvard Dataverse dataset},\n  pages={289},\n  year={2024}\n}\n\n@article{hemmi2025lroc,\n  title={LROC NAC-derived Meter-scale Topography of the Moon's South Polar Landing Sites: Digital Terrain Models and Their Quality Assessments},\n  author={Hemmi, Ryodo and Inoue, Hiroka and Kikuchi, Hiroshi and Sato, Hiroyuki and Miyamoto, Hideaki and Otake, Hisashi and Yamamoto, Mitsuo},\n  journal={The Planetary Science Journal},\n  volume={6},\n  number={11},\n  year={2025},\n  publisher={The American Astronomical Society},\n  month={November},\n  note={Published 2025 November 14}\n}\n\n@article{quan1995empirical,\n  title={Empirical equation for the index of refraction of seawater},\n  author={Quan, Xiaohong and Fry, Edward S},\n  journal={Applied optics},\n  volume={34},\n  number={18},\n  pages={3477--3480},\n  year={1995},\n  publisher={Optical Society of America}\n}\n"
  },
  {
    "path": "docs/building_asp.rst",
    "content": ".. _building_asp:\n\nBuilding and releasing ASP\n==========================\n\nThis chapter will describe how ASP can be built from source and with conda, how\nto build the documentation, and how to prepare a new ASP release. This is\nfocused towards the developer. Users should read instead the installation guide\nin :numref:`installation`.\n\n.. _build_from_source:\n\nBuilding ASP from source\n------------------------\n\nAll dependencies for the *latest development version* of ASP are a available as\na `binary tarball\n<https://github.com/NeoGeographyToolkit/BinaryBuilder/releases/>`_.\n\nThe dependencies for the latest stable version of ASP are in the \n``stereopipeline-feedstock`` repository (:numref:`packages_to_build`).\n\nAssume that all dependencies, including the development tools, are installed\nin the ``asp_deps`` conda environment and the ``PATH`` variable is set up\nto use them. \n\nCreate a work directory::\n\n    workDir=$HOME/build_asp\n    mkdir -p $workDir\n\nBuild VisionWorkbench and Stereo Pipeline version 3.6.0::\n\n    cd $workDir\n    envPath=$HOME/miniconda3/envs/asp_deps\n    $envPath/bin/git clone                            \\\n        git@github.com:visionworkbench/visionworkbench.git\n    cd visionworkbench\n    # Build a specific version\n    git checkout 3.6.0\n    mkdir -p build\n    cd build\n    $envPath/bin/cmake ..                             \\\n      -DASP_DEPS_DIR=$envPath                         \\\n      -DCMAKE_INSTALL_PREFIX=$workDir/install         \\\n    make -j10 && make install\n\n    cd $workDir\n    envPath=$HOME/miniconda3/envs/asp_deps\n    $envPath/bin/git clone                            \\\n    git@github.com:NeoGeographyToolkit/StereoPipeline.git\n    cd StereoPipeline\n    # Build a specific version\n    git checkout 3.6.0\n    mkdir -p build\n    cd build\n    $envPath/bin/cmake ..                             \\\n      -DASP_DEPS_DIR=$envPath                         \\\n      -DCMAKE_INSTALL_PREFIX=$workDir/install         \\\n      -DVISIONWORKBENCH_INSTALL_DIR=$workDir/install  \\\n    make -j10 && make install\n\nCheck if the compilers are picked up correctly.\n\n.. _conda_build:\n\nBuilding ASP and its dependencies with conda\n--------------------------------------------\n\nThis page is meant for advanced users of ASP and maintainers who would\nlike to use conda to rebuild ASP and all its dependencies. It is\nsuggested to carefully read :numref:`conda_intro` before this page.\n\nTo simplify maintenance, ASP and its dependencies are built upon ISIS\nand its dependencies. The process for this is outlined below.\n\nSetting up the ISIS environment\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nSearch for the latest available ISIS conda package::\n  \n    conda search -c usgs-astrogeology --override-channels isis\n\nHere it was found that ISIS version 9.0.0 was the latest, which we\nwill assume throughout the rest of this document. \n\nCreate a conda environment for this version of ISIS::\n\n     conda create -n isis9.0.0\n     conda activate isis9.0.0\n\nAdd these channels to conda::\n\n    conda config --env --add channels conda-forge\n    conda config --env --add channels usgs-astrogeology\n\nRun::\n\n    conda config --show channels\n\nand verify that ``usgs-astrogeology`` and ``conda-forge`` are in this\norder and above all other channels, except perhaps the\n``nasa-ames-stereo-pipeline`` channel.\n\nInstall the desired version of ISIS::\n\n    conda install                 \\\n      -c usgs-astrogeology        \\\n      -c conda-forge              \\\n      -c defaults                 \\\n      --channel-priority flexible \\\n      isis==9.0.0\n\nFor ISIS 9.0.0, it appears that ensuring flexible channel priority is necessary\nfor successful installation.\n\nInstall the version of PDAL that is compatible with current ISIS\n(may already exist as part of latest ISIS)::\n\n  conda install -c conda-forge --channel-priority flexible libpdal-core \n\nSave the current environment for reference as follows::\n\n    conda env export > isis9.0.0.yaml\n\nNote: As of 12/2025 any recent PDAL is incompatible with ISIS 9.0.0 and needs to\nbe built from source. Also, ISIS 9.0.0 is not available for Mac Arm. An\nunofficial version of this (``9.0.0_asp``) is available in the\n``nasa-ames-stereo-pipeline`` channel. \n\nFetching the build tools\n~~~~~~~~~~~~~~~~~~~~~~~~\n\nWe will create a new ``tools`` environment to have all the tools we\nwill need. These could be appended to the earlier environment, but it\nis less likely to to have issues with dependency conflicts if these\nare kept separate.\n\n::\n\n    conda create -n tools\n    conda activate tools\n    conda install -c conda-forge anaconda-client conda-build\n\n.. _packages_to_build:\n\nBuild recipe\n~~~~~~~~~~~~\n\nASP has many dependencies that are source code, rather than pre-existing\npackages.\n\nThe approach of producing a conda package for each turned out to be laborious,\nbecause conda is slow and fragile. The latest approach is to build all these\npackages and ASP itself in one single script, available at\n\n  https://github.com/NeoGeographyToolkit/stereopipeline-feedstock\n\nTo ensure this does not result in failures, the process is first tested\nby building these manually, as done in the script, with the environment\nspecified there. \n\nThat environment is produced by adding dependencies to the installed ISIS\npackage. \n\nThe ASP version in this feedstock needs to be updated for each release.\n\nBuild command::\n\n  conda activate tools\n  conda config --set channel_priority flexible\n  conda build                    \\\n    -c nasa-ames-stereo-pipeline \\\n    -c usgs-astrogeology         \\\n    -c conda-forge               \\\n    stereopipeline-feedstock\n\nThe developers can upload the produced packages to the\n``nasa-ames-stereo-pipeline`` channel.\n\nAfter a package is uploaded, it can be installed in the desired environment as::\n\n    conda install                  \\\n      -c nasa-ames-stereo-pipeline \\\n      -c usgs-astrogeology         \\\n      -c conda-forge               \\\n      -n myEnv                     \\\n      myPackage=myVersion=myBuildNo\n\nIf this is slow, check if the solver is set to ``libmamba``. \n \nTo list all packages in the channel, do::\n\n    conda search -c nasa-ames-stereo-pipeline --override-channels\n\nTo delete a package from this channel, run::\n\n    anaconda remove nasa-ames-stereo-pipeline/myPackage/myVersion\n  \nIf adding an updated package with the same version, increment the build number.\nOtherwise the new package may be confused with a cached version of a prior\nbuild.\n\n.. _helper_scripts:\n\nHelper scripts\n~~~~~~~~~~~~~~\n\nThe ``.github/workflows`` directory in the ``StereoPipeline`` repository has a\nfew scripts that show in detail the commands that are run to build ASP and its\ndependencies.\n\n.. _build_asp_doc:\n\nBuilding the documentation\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe ASP documentation is written in ReStructured Text and is built\nwith `Sphinx <https://www.sphinx-doc.org>`_ and\n`sphinxcontrib-bibtex <https://sphinxcontrib-bibtex.readthedocs.io>`_.\n\nSee the `online ASP documentation\n<https://stereopipeline.readthedocs.io/en/latest/>`_.\n\nTo build the documentation locally, install these packages such as::\n\n    conda create -n sphinx -c conda-forge sphinx sphinxcontrib-bibtex\n    conda activate sphinx\n\nNote that we used a separate conda environment to minimize the chance\nof conflict with other dependencies.\n\nThe ``docs`` directory contains the root of the documentation. Running there\n``make html`` will create the HTML version of the documentation in the\n``_build`` subdirectory.\n\nBuilding the PDF documentation is no longer supported. \n\nIf the documentation builds well locally but fails to update on the web, see the\n`cloud build status page\n<https://readthedocs.org/projects/stereopipeline/builds/>`_.\n\n.. _asp_release_guide:\n\nReleasing a new version of ASP\n------------------------------\n\nThis is reading for ASP maintainers.\n\nUpdate the version number\n~~~~~~~~~~~~~~~~~~~~~~~~~\n\nInside *both* the VisionWorkbench and ASP repositories, edit\n``src/CMakeLists.txt`` and set the new version, which should be the same for\nboth packages, and in the format ``x.y.z``. If the value there is\n``x.y.z-alpha``, which is used to tag a pre-release, remove the ``-alpha`` part.\nIncrement one of these digits, depending on whether this is a major, minor, or\nbugfix release. See https://semver.org for guidance.\n\nUpdate the documentation\n~~~~~~~~~~~~~~~~~~~~~~~~\n\nSearch all documentation for the old version number for ASP (such as 3.5.0) and\nISIS (such as 8.3.0) and replace it with the new version numbers (such as 3.6.0\nand 9.0.0). This includes files in the base directory, not just in ``docs``.\n\nUpdate NEWS.rst. Add the release date on top, along the lines of prior releases\n(see further down in that file). This file must have a detailed log of all\nchanges, especially those that result in changed behavior or options, and it\nshould be incrementally updated as changes are made during development.\n\nUpdate the copyright year in the README.rst and docs/conf.py files.\n\nCommit and tag\n~~~~~~~~~~~~~~\n\nCommit all changes. Tag the release in *both* the VisionWorkbench and\nStereoPipeline repos. Example:: \n\n  git tag 3.6.0\n  git push origin 3.6.0 # commit to your branch\n  git push god    3.6.0 # commit to main branch\n\n(Here it is assumed that ``origin`` points to your own fork and ``god``\npoints to the parent repository.)\n\nIf more commits were made and it is desired to apply this tag to a\ndifferent commit, first remove the exiting tag with::\n\n  git tag -d 3.6.0\n  git push origin :refs/tags/3.6.0\n  git push god    :refs/tags/3.6.0\n\nBuild ASP with conda\n~~~~~~~~~~~~~~~~~~~~\n\nSee :numref:`conda_build`. \n    \n.. _build_binaries:\n\nBuilding self-contained binaries\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nIn addition to creating a conda package, it is also convenient to ship a\nzipped package having all ASP tools and needed libraries (this includes the ISIS\nlibraries but not the ISIS tools). \n\nSuch a build is created for each release and also daily. These are posted on the\nGitHub release page (:numref:`release`). \n\nASP uses a custom build system. It can be downloaded with ``git`` from:\n\n    https://github.com/NeoGeographyToolkit/BinaryBuilder\n\nCreate a conda environment that has the dependencies for building ASP, as\ndescribed in :numref:`build_from_source`. Assume it is called ``asp_deps``.\n\nInstall the C, C++, and Fortran compilers (same versions as for ISIS),\n``cmake>=3.15.5``, ``pbzip2``, ``parallel``, and for Linux also the ``chrpath``\ntool, as outlined on that page. The full list of dependencies is in the \n``stereopipeline-feedstock`` repository (:numref:`packages_to_build`).\n\nGo to the directory ``BinaryBuilder``, and run::\n\n    /path/to/python3                                \\\n      ./build.py                                    \\\n      --cc <path to C compiler>                     \\\n      --cxx <path to C++ compiler>                  \\\n      --gfortran <path to Fortran compiler>         \\\n      --asp-deps-dir $HOME/miniconda3/envs/asp_deps \\\n      --build-root build_asp                        \\\n      --skip-tests                                  \\\n      visionworkbench stereopipeline\n\nThis will fetch and build the latest VisionWorkbench and Stereo Pipeline in\n``build_asp/build``, and will install them in ``build_asp/install``.\n\nSee :numref:`helper_scripts` for scrips illustrating this process.\n\nCreate a conda environment having Python and numpy\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nISIS expects a full Python distribution to be shipped. To avoid shipping\nthe entire ``asp_deps`` environment, we create a separate environment\nhaving only Python, numpy, with versions as expected by current ISIS.\nRun, for example::\n\n    conda create -c conda-forge -n python_isis_v python=x.y.z numpy=a.b.c\n\nNote that different versions of these may be needed for Linux and OSX.\nThe ``conda list`` command within the ``asp_deps`` environment \ncan be used to look up the desired versions.\n\nPackage the build\n~~~~~~~~~~~~~~~~~\n\nRun in ``BinaryBuilder`` the command::\n\n    /path/to/python3                                  \\\n      ./make-dist.py build_asp/install                \\\n      --asp-deps-dir $HOME/miniconda3/envs/asp_deps   \\\n      --python-env $HOME/miniconda3/envs/python_isis_v\n\nBuilding and packaging should be done separately for Linux and OSX.\n\nTest ASP\n~~~~~~~~\n\nThe script ``auto_build/launch_master.sh`` in ``BinaryBuilder`` can be invoked\nto build and test ASP. This script and also ``auto_build/utils.sh`` need to be\nread carefully and some variables adjusted.\n\nThe `StereoPipeline test suite\n<https://github.com/NeoGeographyToolkit/StereoPipelineTest>`_ is run. It has\ncomprehensive tests for the ASP tools.\n\nThis functionality creates the daily builds, which are then\nuploaded to the GitHub release page (:numref:`release`). \n\nPrepare the documentation\n~~~~~~~~~~~~~~~~~~~~~~~~~\n\nFollow the instructions in :numref:`build_asp_doc`.\n\nPush the release to GitHub\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nCreate a release on `GitHub\n<https://github.com/NeoGeographyToolkit/StereoPipeline/releases>`_. Use the tag\nfor the current release. Add to the release notes a link to the appropriate\nNEWS section of the documentation (:numref:`news`). *Only after this save\nthe release.* \n\n*Do not delete and recreate the release* (:numref:`zenodo`). It is fine to\nupload the binaries after a release is created, and delete and re-upload them.\n\nThe GitHub ``gh`` program can be invoked to push the binaries to the release.\nExample::\n\n  cd BinaryBuilder/asp_tarballs\n  for file in StereoPipeline-3.6.0-2025-12-26-x86_64-Linux.tar.bz2 \\\n              StereoPipeline-3.6.0-2025-12-26-x86_64-OSX.tar.bz2 \\\n              StereoPipeline-3.6.0-2025-12-26-arm64-OSX.tar.bz2; do \n    gh release upload 3.6.0 $file \\\n      -R git@github.com:NeoGeographyToolkit/StereoPipeline.git   \n  done\n\nAlternatively, these can be uploaded from a web browser.\n\n.. _zenodo:\n\nZenodo link for the release\n~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nCreating a release will trigger producing the Zenodo permanent link (after a few\nminutes). That link cannot be changed, and the text it copies from the release\nnotes cannot be changed either.\n\nIt is very important to *create the release just once for the given tag*.\nOtherwise, the Zenodo permanent link will always point to the earliest attempt\nat making the release. It is fine to later overwrite the binaries for this\nrelease, or even to upload them later. Just do not delete and recreate the\nrelease page itself.\n\nDo not just rename the latest automatically uploaded daily build, as that will\ncreate an incorrect Zenodo link.\n\nWait for Zenodo to mint the link for this release, then visit the Zenodo page at\nhttps://zenodo.org/badge/latestdoi/714891 (which will always point to the\n'latest' DOI) and find there this release's URL. Put it at the top of\n`README.rst\n<https://github.com/NeoGeographyToolkit/StereoPipeline/blob/master/README.rst>`_,\nin the appropriate ``target`` field. \n\n*Increment the version in the image field right above that.*\n\nAdd this link also to the NEWS.rst page, under the section name for the current\nrelease.\n\nPush this update to GitHub. The new commit will be after the tag for the\nrelease, but that is not an issue. It is best to not change the tag after\nthe release and Zenodo link got created.\n\nAnnounce the release\n~~~~~~~~~~~~~~~~~~~~\n\nSend an announcement of the new release to the `mailing list\n<https://groups.google.com/forum/\\#!forum/ames-stereo-pipeline-support>`_, with\na link to the NEWS section for the current release from the documentation.\n\nPost-release work\n~~~~~~~~~~~~~~~~~\n\nUpdate the version number in ``src/CMakeLists.txt`` in boh the VisionWorkbench\nand ASP repositories.  \n\nIf version 3.6.0 just got released, we expect that the next feature release will\nlikely be be 3.7.0. The version tag should be updated to 3.7.0-alpha in\nanticipation in *both* the VisionWorkbench and ASP repositories.\nSee https://semver.org for guidance on versions.\n"
  },
  {
    "path": "docs/bundle_adjustment.rst",
    "content": ".. _bundle_adjustment:\n\nBundle adjustment\n=================\n\nOverview\n--------\n\nSatellite position and orientation errors have a direct effect on the\naccuracy of digital elevation models produced by the Stereo Pipeline. If\nthey are not corrected, these uncertainties will result in systematic\nerrors in the overall position and slope of the DEM. Severe distortions\ncan occur as well, resulting in twisted or \"taco-shaped\" DEMs, though in\nmost cases these effects are quite subtle and hard to detect. In the\nworst case, such as with old mission data like Voyager or Apollo, these\ngross camera misalignments can inhibit Stereo Pipeline's internal\ninterest point matcher and block auto search range detection.\n\n.. figure:: images/ba_orig_adjusted.png\n\n   Bundle adjustment is illustrated here using a color-mapped, hill-shaded\n   DEM mosaic from Apollo 15, Orbit 33, images. (a) Prior to bundle\n   adjustment, large discontinuities can exist between overlapping DEMs\n   made from different images. (b) After bundle adjustment, DEM alignment\n   errors are minimized and no longer visible.\n\nErrors in camera position and orientation can be corrected using a\nprocess called *bundle adjustment*. Bundle adjustment is the process of\nsimultaneously adjusting the properties of many cameras and the 3D\nlocations of the objects they see in order to minimize the error between\nthe estimated, back-projected pixel locations of the 3D objects and\ntheir actual measured locations in the captured images. This is called\nthe *reprojection error*.\n\nThis complex process can be boiled down to this simple idea: bundle\nadjustment ensures that the observations in multiple images of a single\nground feature are self-consistent. If they are not consistent, then the\nposition and orientation of the cameras as well as the 3D position of\nthe feature must be adjusted until they are. This optimization is\ncarried out along with thousands (or more) of similar constraints\ninvolving many different features observed in other images. Bundle\nadjustment is very powerful and versatile: it can operate on just two\noverlapping images, or on thousands. It is also a dangerous tool.\nCareful consideration is required to insure and verify that the solution\ndoes represent reality.\n\nBundle adjustment can also take advantage of GCPs (:numref:`bagcp`), which are\n3D locations of features that are known a priori (often by measuring them by\nhand in another existing DEM). GCPs can improve the internal consistency of your\nDEM or align your DEM to an existing data product. Finally, even though bundle\nadjustment calculates the locations of the 3D objects it views, only the final\nproperties of the cameras are recorded for use by the Ames Stereo Pipeline.\nThose properties can be loaded into the ``parallel_stereo`` program which uses\nits own method for triangulating 3D feature locations.\n\nWhen using the Stereo Pipeline, bundle adjustment is an optional step\nbetween the capture of images and the creation of DEMs. The bundle\nadjustment process described below should be completed prior to running\nthe ``parallel_stereo`` command.\n\nAlthough bundle adjustment is not a required step for generating DEMs,\nit is *highly recommended* for users who plan to create DEMs for\nscientific analysis and publication. Incorporating bundle adjustment\ninto the stereo work flow not only results in DEMs that are more\ninternally consistent, it is also the correct way to co-register your\nDEMs with other existing data sets and geodetic control networks.\n\nA DEM obtained after bundle adjustment and stereo may need to be aligned\nto a known reference coordinate system. For that, use the ``pc_align``\ntool (:numref:`pc_align`).\n\nSee the options ``--heights-from-dem`` (:numref:`heights_from_dem`)\nand ``--reference-terrain`` further down for how to incorporate an\nexternal DEM in bundle adjustment.  Note that these can only locally\nrefine camera parameters, an initial alignment with ``pc_align`` is\nstill necessary.\n\nOptimizing of camera intrinsics parameters, such as optical center,\nfocal length, and distortion is also possible, as seen below.\n\n.. _baasp:\n\nRunning bundle adjustment\n-------------------------\n\nStereo Pipeline provides the ``bundle_adjust`` program\n(:numref:`bundle_adjust`).\n\nStart by running ``parallel_stereo`` without using bundle-adjusted camera\nmodels::\n\n    parallel_stereo AS15-M-1134.cub AS15-M-1135.cub run_noadjust/run\n\nSee :numref:`nextsteps` for how how to improve the quality of stereo\ncorrelation results (at the expense of speed).\n\nCreate a DEM and triangulation error image as in :numref:`point2dem`.\n\nRun bundle adjustment::\n\n    bundle_adjust --camera-position-weight 0     \\\n     --tri-weight 0.1 --tri-robust-threshold 0.1 \\\n     AS15-M-1134.cub AS15-M-1135.cub -o run_ba/run\n\nHere only camera positions and orientations are refined. How to optimize the\ncamera intrinsics (if applicable) is discussed further down\n(:numref:`floatingintrinsics`).\n\nRun ``parallel_stereo`` while using the bundle-adjusted camera models::\n\n    parallel_stereo AS15-M-1134.cub AS15-M-1135.cub \\\n      --prev-run-prefix run_noadjust/run            \\\n      --bundle-adjust-prefix run_ba/run             \\\n      run_adjust/run \n\nThis should be followed, as before, by creation of a DEM and a triangulation\nerror image. Note the option ``--prev-run-prefix`` that allowed reusing\nthe previous run apart from the triangulation step. That speeds up the process,\nand works well-enough unless the cameras change a lot.\n\n.. figure:: images/MOC_tri_error.png\n   :name: moc_dem_intersection_errors\n\n   An unusually large intersection error (left), and the version after bundle\n   adjustment (right). Note that these do not use the same range of colors. The\n   images are produced with the MOC camera (:numref:`moc_example`). The\n   remaining wavy pattern is due to jitter, that ASP has a solver for\n   (:numref:`jitter_solve`). More illustrations are in\n   :numref:`ba_rpc_distortion` and :numref:`ba_frame_linescan_results`.\n\nBundle adjustment aims to make the cameras more self-consistent but offers no\nguarantees about their absolute positions (unless GCP are used,\n:numref:`bagcp`), in fact, the cameras can move away a lot sometimes. The\noptions ``--tri-weight``, ``--rotation-weight``, and\n``--camera-position-weight`` can be used to constrain how much the cameras can\nmove during bundle adjustment. Note that large values for these may impact the\nability to make the cameras self-consistent.\n\nThis program can constrain the triangulated points, and hence the cameras,\nrelative to a DEM. This option only works when the cameras are already\nrather well-aligned to this DEM and only fine-level adjustments are needed.\nThat is discussed in :numref:`heights_from_dem`.\n\nASP also offers the tool ``parallel_bundle_adjust`` which can create\nmatch files using multiple processes spread over multiple machines\n(:numref:`parallel_bundle_adjust`). These can also be used later\nduring stereo with the options ``--match-files-prefix`` and\n``--clean-match-files-prefix``.\n\n.. _floatingintrinsics:\n\nFloating intrinsics and using a lidar or DEM ground truth\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThis section documents some advanced functionality, and it suggested the\nreader study it carefully and invest a certain amount of time to fully\ntake advantage of these concepts.\n\nWhen the input cameras are of Pinhole type (:numref:`pinholemodels`), optical\nbar (:numref:`panoramic`), or CSM (:numref:`csm`), it is possible to optimize\n(float, refine) the intrinsic parameters (focal length, optical center,\ndistortion, with a somewhat different list for optical bar cameras), in addition\nto the extrinsics. \n\nIt is also possible to take advantage of an existing terrain ground truth, such\nas a lidar file or a DEM, to correct imperfectly calibrated intrinsic\nparameters, which can result in greatly improved results, such as creating less\ndistorted DEMs that agree much better with the ground truth.\n\nSee :numref:`intrinsics_no_constraints` for how to optimize intrinsics with no\nconstraints, :numref:`intrinsics_ground_truth` for when ground constraints can\nbe used (there exist options for sparse ground points and a DEM), and\n:numref:`kaguya_ba` for how to have several groups of intrinsics. \n\nMixing frame and linescan cameras is discussed in :numref:`ba_frame_linescan`.\n\n.. _intrinsics_no_constraints:\n\nA first attempt at floating the intrinsics\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThis section is *only an introduction* of how to float the intrinsics. Detailed\nexamples are further down. \n\nIt is very strongly suggested to ensure that a good number of images exists,\nthey have a lot of overlap, that the cameras have been already bundle-adjusted\nwith intrinsics fixed and aligned to a DEM (:numref:`ba_pc_align`). Such a DEM\nshould be used as a constraint. \n\nNote that when solving for intrinsics, ``bundle_adjust`` will by default\noptimize all intrinsic parameters and will share them across all cameras. This\nbehavior can be controlled with the ``--intrinsics-to-float`` and\n``--intrinsics-to-share`` parameters, or in a finer-grained way, as shown in\n:numref:`kaguya_ba`.\n\nThe first invocation of camera optimization should be with intrinsics fixed::\n\n     bundle_adjust -t nadirpinhole --inline-adjustments      \\\n       left.tif right.tif left.tsai right.tsai -o run_ba/run\n\nHere two images have been used for illustration purposes, but a larger number\nshould be used in practice.\n\nIt is suggested that one run ``parallel_stereo`` with the obtained cameras::\n\n     parallel_stereo -t nadirpinhole --alignment-method epipolar      \\\n        --stereo-algorithm asp_mgm --subpixel-mode 9                  \\\n        left.tif right.tif run_ba/run-left.tsai run_ba/run-right.tsai \\\n        run_stereo/run\n\nfollowed by DEM creation (:numref:`point2dem`)::\n\n     point2dem --tr RESOLUTION --errorimage run_stereo/run-PC.tif\n\nThen examine and plot the intersection error::\n\n     gdalinfo -stats run_stereo/run-IntersectionErr.tif\n     colormap run_stereo/run-IntersectionErr.tif\n     stereo_gui run_stereo/run-IntersectionErr_CMAP.tif\n\nSee :numref:`running-stereo` for other stereo algorithms. For ``colormap``\n(:numref:`colormap`), ``--min`` and ``--max`` bounds can be specified if the\nautomatic range is too large.\n\nWe also suggest inspecting the interest points\n(:numref:`stereo_gui_view_ip`)::\n\n     stereo_gui left.tif right.tif run_ba/run\n\nand then viewing the interest points from the menu.\n\nIf the interest points are not well-distributed, this may result in large ray\nintersection errors where they are missing. Then, one should delete the existing\nrun directory and create a better set, as discussed in :numref:`custom_ip`.\n\nIf the interest points are good and the mean intersection error is\nacceptable, but this error shows an odd nonlinear pattern, that means\nit may be necessary to optimize the intrinsics. We do so by using the\ncameras with the optimized extrinsics found earlier. This is just an\nearly such attempt, better approaches will be suggested below::\n\n     bundle_adjust -t nadirpinhole --inline-adjustments \\\n       --solve-intrinsics --camera-position-weight 0    \\\n       --max-pairwise-matches 20000                     \\\n       left.tif right.tif                               \\\n       run_ba/run-left.tsai run_ba/run-right.tsai       \\\n       -o run_ba_intr/run\n\nSee :numref:`heights_from_dem` for how to use a DEM as a constraint.\nSee :numref:`dense_ip` for how to create dense interest points.\nBoth of these are *very recommended*.\n\nIt is important to note that only the non-zero intrinsics will be\noptimized, and the step size used in optimizing a certain intrinsic\nparameter is proportional to it. Hence, if an intrinsic is 0 and it is\ndesired to optimize it, it should be set to small non-zero value\nsuggestive of its final estimated scale. If the algorithm fails to give\na good solution, perhaps different initial values for the intrinsics\nshould be tried. For example, one can try changing the sign of the\ninitial distortion coefficients, or make their values much smaller.\n\nIt is good to use a lens distortion model such as the one ASP calls\n*Tsai* (:numref:`pinholemodels`), as then the distortion operation\nis a simple formula, which is fast and convenient in bundle adjustment,\nwhen projecting into the camera is the key operation. Using models\nlike *Photometrix* and *Brown-Conrady* is not advised.\n\nHere we assumed all intrinsics are shared. See\n:numref:`kaguya_ba` for how to have several groups of\nintrinsics. See also the option ``--intrinsics-to-share``.\n\nSometimes the camera weight may need to be decreased, even all the way\nto 0, if it appears that the solver is not aggressive enough, or it may\nneed to be increased if perhaps it overfits. This will become less of a\nconcern if there is some ground truth, as discussed later.\n\nNext, one can run ``parallel_stereo`` as before, with the new cameras, and see\nif the obtained solution is more acceptable, that is, if the intersection error\nis smaller. It is good to note that a preliminary investigation can already be\nmade right after bundle adjustment, by looking at the residual error files\nbefore and after bundle adjustment. They are in the ``bundle_adjust`` output\ndirectory, with names::\n\n     initial_residuals_pointmap.csv\n     final_residuals_pointmap.csv\n\nIf desired, these csv files can be converted to a DEM with\n``point2dem``, which can be invoked with::\n\n     --csv-format 1:lon,2:lat,4:height_above_datum\n\nthen one can look at their statistics, also have them colorized, and\nviewed in ``stereo_gui`` (:numref:`plot_csv`).\n\nThis file also shows how often each feature is seen in the images, so,\nif three images are present, hopefully many features will be seen three\ntimes.\n\n.. _intrinsics_ground_truth:\n\nUsing ground truth when floating the intrinsics\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nIf a point cloud having ground truth, such as a DEM or lidar file\nexists, say named ``ref.tif``, it can be used as part of bundle\nadjustment. For that, the stereo DEM obtained earlier \nneeds to be first aligned to this ground truth, such as::\n\n    pc_align --max-displacement VAL           \\\n      run_stereo/run-DEM.tif ref.tif          \\\n      --save-inv-transformed-reference-points \\\n      -o run_align/run \n\n(see the manual page of this tool in :numref:`pc_align` for more details).\n\nThis alignment can then be applied to the cameras as well::\n\n     bundle_adjust -t nadirpinhole --inline-adjustments              \\\n       --initial-transform run_align/run-inverse-transform.txt       \\\n       left.tif right.tif run_ba/run-left.tsai run_ba/run-right.tsai \\\n       --apply-initial-transform-only -o run_align/run\n\nIf ``pc_align`` is called with the clouds in reverse order (the denser\ncloud should always be the first), when applying the transform to the\ncameras in ``bundle_adjust`` one should use ``transform.txt`` instead of\n``inverse-transform.txt`` above.\n\nNote that if your ground truth is in CSV format, any tools that use this cloud\nmust set ``--csv-format`` and perhaps also ``--datum`` and/or ``--csv-srs``.\n\nSee :numref:`ba_pc_align` for how to handle the case when input\nadjustments exist.\n\nThere are two ways of incorporating a ground constraint in bundle adjustment.\nThe first one assumes that the ground truth is a DEM, and is very easy to use\nwith a large number of images (:numref:`heights_from_dem`). A second approach\ncan be used when the ground truth is sparse (and with a DEM as well). This is a\nbit more involved (:numref:`reference_terrain`).\n\n.. _heights_from_dem:\n\nUsing the heights from a reference DEM\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nIn some situations the DEM obtained with ASP is, after alignment, quite similar\nto a reference DEM, but the heights may be off. This can happen, for example,\nif the focal length or lens distortion are not accurately known. \n\nIn this case it is possible to borrow more accurate information from the\nreference DEM. The option for this is ``--heights-from-dem``. An additional\ncontrol is given, in the form of the option ``--heights-from-dem-uncertainty``\n(1 sigma, in meters). The smaller its value is, the stronger the DEM constraint.\nThis value divides the difference between the triangulated points being\noptimized and their initial value on the DEM when added to the cost function\n(:numref:`how_ba_works`). \n\nThe option ``--heights-from-dem-robust-threshold`` ensures that these weighted\ndifferences plateau at a certain level and do not dominate the problem. The\ndefault value is 0.1, which is smaller than the ``--robust-threshold`` value of\n0.5, which is used to control the pixel reprojection error, as that is given a\nhigher priority. It is suggested to not modify this threshold, and adjust\ninstead ``--heights-from-dem-uncertainty``.\n\nIf a triangulated point is not close to the reference DEM, bundle adjustment\nfalls back to the ``--tri-weight`` constraint.\n\nHere is an example when we solve for intrinsics with a DEM constraint. As in the\nearlier section, *we assume that the cameras and the terrain are already\naligned*::\n\n     bundle_adjust -t nadirpinhole               \\\n       --inline-adjustments                      \\\n       --solve-intrinsics                        \\\n       --intrinsics-to-float all                 \\\n       --intrinsics-to-share all                 \\\n       --camera-position-weight 0                \\\n       --max-pairwise-matches 20000              \\\n       --heights-from-dem dem.tif                \\\n       --heights-from-dem-uncertainty 10.0       \\\n       --parameter-tolerance 1e-12               \\\n       --remove-outliers-params \"75.0 3.0 20 25\" \\\n       left.tif right.tif                        \\\n       run_align/run-run-left.tsai               \\\n       run_align/run-run-right.tsai              \\\n       -o run_ba_hts_from_dem/run\n\nOne should be careful with setting ``--heights-from-dem-uncertainty``. Having\nit larger will ensure it does not prevent convergence.\n\nIt is *strongly suggested* to use dense interest points (:numref:`dense_ip`), if\nsolving for intrinsics, and have ``--max-pairwise-matches`` large enough to not\nthrow some of them out. We set ``--camera-position-weight 0``, as hopefully the\nDEM constraint is enough to constrain the solution.\n\nHere we were rather generous with the parameters for removing\noutliers, as the input DEM may not be that accurate, and then if tying\ntoo much to it some valid matches be be flagged as outliers otherwise,\nperhaps.\n\nThe implementation of ``--heights-from-dem`` is as follows. Rays from matching\ninterest points are intersected with this DEM, and the average of the produced\npoints is projected vertically onto the DEM. This is declared to be the\nintersection point of the rays, and the triangulated points being optimized\nare constrained via ``--heights-from-dem-uncertainty`` to be close to this\npoint. \n\nIt is important to note that this heuristic may not be accurate if the rays have\na large intersection error. But, since bundle adjustment usually has two passes,\nat the second pass the improved cameras are used to recompute the point on the\nDEM with better accuracy. \n\nThis option can be more effective than using ``--reference-terrain`` when there\nis a large uncertainty in camera intrinsics.\n\nSee two other large-scale examples of using ``--heights-from-dem``, without\nfloating the intrinsics, in the SkySat processing example (:numref:`skysat`),\nusing Pinhole cameras, and with linescan Lunar images with variable illumination\n(:numref:`sfs-lola`).\n\nHere we assumed all intrinsics are shared. See :numref:`kaguya_ba` for how to\nhave several groups of intrinsics. See also the option\n``--intrinsics-to-share``.\n\nIt is suggested to look at the documentation of all the options\nabove and adjust them for your use case.\n\nSee :numref:`bundle_adjust` for the documentation of all options\nabove, and :numref:`ba_out_files` for the output reports being saved,\nwhich can help judge how well the optimization worked.\n\n.. _reference_terrain:\n\nSparse ground truth and using the disparity\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nHere we will discuss an approach that works when the ground truth can\nbe sparse, and we make use of the stereo disparity. It requires more\nwork to set up than the earlier one.\n\nWe will need to create a disparity from the left and right images\nthat we will use during bundle adjustment. For that we will take the\ndisparity obtained in stereo and remove any intermediate transforms\nstereo applied to the images and the disparity. This can be done as\nfollows::\n\n     stereo_tri -t nadirpinhole --alignment-method epipolar \\\n       --unalign-disparity                                  \\\n       left.tif right.tif                                   \\\n       run_ba/run-left.tsai run_ba/run-right.tsai           \\\n       run_stereo/run               \n\nand then bundle adjustment can be invoked with this disparity and the\nDEM/lidar file. Note that we use the cameras obtained after alignment::\n\n     bundle_adjust -t nadirpinhole --inline-adjustments         \\\n       --solve-intrinsics --camera-position-weight 0            \\\n       --max-disp-error 50                                      \\\n       --max-num-reference-points 1000000                       \\\n       --max-pairwise-matches 20000                             \\\n       --parameter-tolerance 1e-12                              \\\n       --robust-threshold 2                                     \\\n       --reference-terrain lidar.csv                            \\\n       --reference-terrain-weight 5                             \\\n       --disparity-list run_stereo/run-unaligned-D.tif          \\\n       left.tif right.tif                                       \\\n       run_align/run-run-left.tsai run_align/run-run-right.tsai \\\n       -o run_ba_intr_lidar/run\n\nHere we set the camera weight all the way to 0, since it is hoped that\nhaving a reference terrain is a sufficient constraint to prevent\nover-fitting.\n\nWe used ``--robust-threshold 2`` to make the solver work harder\nwhere the errors are larger. This may be increased somewhat if the\ndistortion is still not solved well in corners.\n\nSee the note earlier in the text about what a good lens distortion\nmodel is.\n\nThis tool will write some residual files of the form::\n\n     initial_residuals_reference_terrain.txt\n     final_residuals_reference_terrain.txt\n\nwhich may be studied to see if the error-to-lidar decreased. Each\nresidual is defined as the distance, in pixels, between a terrain point\nprojected into the left camera image and then transferred onto the right\nimage via the unaligned disparity and its direct projection into the\nright camera.\n\nIf the initial errors in that file are large to start with, say more\nthan 2-3 pixels, there is a chance something is wrong. Either the\ncameras are not well-aligned to each other or to the ground, or the\nintrinsics are off too much. In that case it is possible the errors are\ntoo large for this approach to reduce them effectively.\n\nWe strongly recommend that for this process one should not rely on\nbundle adjustment to create interest points, but to use the dense and\nuniformly distributed ones created with stereo (:numref:`dense_ip`).\n\nThe hope is that after these directions are followed, this will result\nin a smaller intersection error and a smaller error to the lidar/DEM\nground truth (the later can be evaluated by invoking\n``geodiff --absolute`` on the ASP-created aligned DEM and the reference\nlidar/DEM file).\n\nHere we assumed all intrinsics are shared. See \n:numref:`kaguya_ba` for how to have several groups of\nintrinsics. See also the option ``--intrinsics-to-share``.\n\nWhen the lidar file is large, in bundle adjustment one can use the flag\n``--lon-lat-limit`` to read only a relevant portion of it. This can\nspeed up setting up the problem but does not affect the optimization.\n\nSparse ground truth and multiple images\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nEverything mentioned earlier works with more than two images, in fact,\nhaving more images is highly desirable, and ideally the images overlap a\nlot. For example, one can create stereo pairs consisting of first and\nsecond images, second and third, third and fourth, etc., invoke the\nabove logic for each pair, that is, run stereo, alignment to the ground\ntruth, dense interest point generation, creation of unaligned\ndisparities, and transforming the cameras using the alignment transform\nmatrix. Then, a directory can be made in which one can copy the dense\ninterest point files, and run bundle adjustment with intrinsics\noptimization jointly for all cameras. Hence, one should use a command as\nfollows (the example here is for 4 images)::\n\n     disp1=run_stereo12/run-unaligned-D.tif\n     disp2=run_stereo23/run-unaligned-D.tif\n     disp3=run_stereo34/run-unaligned-D.tif\n     bundle_adjust -t nadirpinhole --inline-adjustments       \\\n       --solve-intrinsics  --camera-position-weight 0         \\\n       img1.tif img2.tif img3.tif img4.tif                    \\\n       run_align_12/run-img1.tsai run_align12/run-img2.tsai   \\\n       run_align_34/run-img3.tsai run_align34/run-img4.tsai   \\\n       --reference-terrain lidar.csv                          \\\n       --disparity-list \"$disp1 $disp2 $disp3\"                \\\n       --robust-threshold 2                                   \\\n       --max-disp-error 50 --max-num-reference-points 1000000 \\\n       --overlap-limit 1 --parameter-tolerance 1e-12          \\\n       --reference-terrain-weight 5                           \\\n       -o run_ba_intr_lidar/run\n\nIn case it is desired to omit the disparity between one pair of images,\nfor example, if they don't overlap, instead of the needed unaligned\ndisparity one can put the word ``none`` in this list.\n\nNotice that since this joint adjustment was initialized from several\nstereo pairs, the second camera picked above, for example, could have\nbeen either the second camera from the first pair, or the first camera\nfrom the second pair, so there was a choice to make. In :numref:`skysat`\nan example is shown where a preliminary\nbundle adjustment happens at the beginning, without using a reference\nterrain, then those cameras are jointly aligned to the reference\nterrain, and then one continues as done above, but this time one need\nnot have dealt with individual stereo pairs.\n\nThe option ``--overlap-limit`` can be used to control which images\nshould be tested for interest point matches, and a good value for it is\nsay 1 if one plans to use the interest points generated by stereo,\nthough a value of 2 may not hurt either. One may want to decrease\n``--parameter-tolerance``, for example, to 1e-12, and set a value for\n``--max-disp-error``, e.g, 50, to exclude unreasonable disparities (this\nlast number may be something one should experiment with, and the results\ncan be somewhat sensitive to it). A larger value of\n``--reference-terrain-weight`` can improve the alignment of the cameras\nto the reference terrain.\n\nAlso note the earlier comment about sharing and floating the intrinsics\nindividually.\n\n.. _kaguya_ba:\n\nRefining the intrinsics per sensor\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nGiven a set of sensors, with each acquiring several images, we will optimize the\nintrinsics per sensor. All images acquired with the same sensor will share the\nsame intrinsics, and none will be shared across sensors.\n\nWe will work with Kaguya TC linescan cameras and the CSM camera model\n(:numref:`csm`). Pinhole cameras in .tsai format (:numref:`pinholemodels`) and\nFrame cameras in CSM format (:numref:`csm_frame_def`) can be used as well.\n\nSee :numref:`floatingintrinsics` for an introduction on how optimizing intrinsics\nworks, and :numref:`kaguya_tc` for how to prepare and use Kaguya TC cameras.\n\nSee :numref:`ba_frame_linescan` for fine-level control per group and for how \nto mix frame and linescan cameras.\n\n.. _kaguya_watch:\n\nThings to watch for\n^^^^^^^^^^^^^^^^^^^\n\nOptimizing the intrinsics can be tricky. One has to be careful to select a\nnon-small set of images that have a lot of overlap, similar illumination, and \nan overall good baseline between enough images (:numref:`stereo_pairs`).\n\nIt is suggested to do a lot of inspections along the way. If things turn out to\nwork poorly, it is often hard to understand at what step the process failed.\nMost of the time the fault lies with the data not satisfying the assumptions\nbeing made.\n\nThe process will fail if, for example, the data is not well-aligned before\nthe refinement of intrinsics is started, if the illumination is so different that\ninterest point matches cannot be found, or if something changed about a sensor\nand the same intrinsics don't work for all images acquired with that sensor.\n\nThe ``cam_test`` tool (:numref:`cam_test`) can be used to check if the distortion\nmodel gets inverted correctly. The distortion model should also be expressive\nenough to model the distortion in the images.\n\nImage selection\n^^^^^^^^^^^^^^^\n\nWe chose a set of 10 Kaguya stereo pairs with a lot of overlap (20 images in\ntotal). The left image was acquired with the ``TC1`` sensor, and the right one\nwith ``TC2``. These sensors have different intrinsics.\n\nSome Kaguya images have different widths. These should not be mixed together.\nOf the images with narrower width, it was observed that images acquired with \n\"morning\" illumination need different calibration than the rest. Hence,\nthere will be two groups of intrinsics for the narrow TC images.\n\nSome images had very large difference in illumination (not for the same stereo\npair). Then, finding of matching interest points can fail. Kaguya images are\nrather well-registered to start with, so the resulting small misalignment that\ncould not be corrected by bundle adjustment was not a problem in solving for\nintrinsics, and ``pc_align`` (:numref:`pc_align`) was used later for individual\nalignment. This is not preferable, in general. It was tricky however to find\nmany images with a lot of overlap, so this had to make do.\n\nA modification of the work flow for the case of images with very different\nillumination is in :numref:`kaguya_ba_illumination`.\n\n.. _kaguya_ba_initial_ba:\n\nInitial bundle adjustment with fixed intrinsics\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nPut the image and camera names in plain text files named ``images.txt`` and\n``cameras.txt``. These must be in one-to-one correspondence, and with one image\nor camera per line. \n\nThe order should be with TC1 images being before TC2. Later we will use the same\norder when these are subdivided by sensor.\n\nInitial bundle adjustment is done with the intrinsics fixed.\n\n::\n\n     parallel_bundle_adjust                      \\\n       --nodes-list nodes.txt                    \\\n       --image-list images.txt                   \\\n       --camera-list cameras.txt                 \\\n       --num-iterations 50                       \\\n       --tri-weight 0.2                          \\\n       --tri-robust-threshold 0.2                \\\n       --camera-position-weight 0                \\\n       --auto-overlap-params 'dem.tif 15'        \\\n       --remove-outliers-params '75.0 3.0 20 20' \\\n       --ip-per-tile 2000                        \\\n       --matches-per-tile 2000                   \\\n       --max-pairwise-matches 20000              \\\n       -o ba/run \n\nThe option ``--auto-overlap-params`` is used with a prior DEM (such as gridded\nand filled with ``point2dem`` at low resolution based on LOLA RDR data). This is\nneeded to estimate which image pairs overlap.\n\nThe option ``--remove-outliers-params`` is set so that only the worst outliers\n(with reprojection error of 20 pixels or more) are removed. That because\nimperfect intrinsics may result in accurate interest points that have a\nsomewhat large reprojection error. We want to keep such features in the corners\nto help refine the distortion parameters.\n\nThe option ``--ip-per-tile`` is set to a large value so that many interest\npoints are generated, and then the best ones are kept. This can be way too large\nfor big images. (Consider using instead ``--ip-per-image``.) The option\n``--matches-per-tile`` tries to ensure matches are uniformly distributed\n(:numref:`custom_ip`).\n\nNormally 50 iterations should be enough. Two passes will happen. After each \npass outliers will be removed.\n\nIt is very strongly suggested to inspect the obtained clean match files (that\nis, without outliers) with ``stereo_gui``\n(:numref:`stereo_gui_pairwise_matches`), and reprojection errors in the final\n``pointmap.csv`` file (:numref:`ba_out_files`), using ``stereo_gui`` as well\n(:numref:`plot_csv`). Insufficient or poorly distributed clean interest point\nmatches will result in a poor solution.\n\nThe reprojection errors are plotted in :numref:`kaguya_intrinsics_opt_example`.\n\nRunning stereo\n^^^^^^^^^^^^^^\n\nWe will use the optimized CSM cameras saved in the ``ba`` directory\n(:numref:`csm_state`). For each stereo pair, run::\n\n    parallel_stereo                    \\\n      --job-size-h 2500                \\\n      --job-size-w 2500                \\\n      --stereo-algorithm asp_mgm       \\\n      --subpixel-mode 9                \\\n      --nodes-list nodes.txt           \\\n      left.cub right.cub               \\\n      ba/run-left.adjusted_state.json  \\\n      ba/run-right.adjusted_state.json \\\n      stereo_left_right/run\n\nThen we will create a DEM at the resolution of the input images,\nwhich in this case is 10 m/pixel. The local stereographic projection\nwill be used.\n\n::\n\n    point2dem --tr 10    \\\n      --errorimage       \\\n      --stereographic    \\\n      --proj-lon 93.7608 \\\n      --proj-lat 3.6282  \\\n      stereo_left_right/run-PC.tif\n\nNormally it is suggested to rerun stereo with mapprojected images\n(:numref:`mapproj-example`) to get higher quality results. For the current goal,\nof optimizing the intrinsics, the produced terrain is good enough. See also\n:numref:`nextsteps` for a discussion of various stereo algorithms.\n\nInspect the produced DEMs and intersection error files (:numref:`point2dem`).\nThe latter can be colorized (:numref:`colorize`). Use ``gdalinfo -stats``\n(:numref:`gdal_tools`) to see the statistics of the intersection error. In this\ncase it turns out to be around 4 m, which, given the ground resolution of 10\nm/pixel, is on the high side. The intersection errors are also higher at left\nand right image edges, due to distortion. (For a frame sensor this error will\ninstead be larger in the corners.)\n\nEvaluating agreement between the DEMs\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nOverlay the produced DEMs and check for any misalignment. This may happen \nif there are insufficient interest points or if the unmodeled distortion \nis large.\n\nCreate a blended average DEM from the produced DEMs using the\n``dem_mosaic`` (:numref:`dem_mosaic`)::\n\n     dem_mosaic stereo*/run-DEM.tif -o mosaic_ba.tif\n\nAlternatively, such a DEM can be created from LOLA RDR data, if dense enough, \nas::\n\n  point2dem                               \\\n    --csv-format 2:lon,3:lat,4:radius_km  \\\n    --search-radius-factor 10             \\\n    --tr <grid size> --t_srs <projection> \\\n    lola.csv\n\nIt is likely better, however, to ensure there is a lot of overlap between the\ninput images and use the stereo DEM mosaic rather than LOLA.\n\n*The process will fail if the DEM that is used as a constraint is misaligned\nwith the cameras.* Alignment is discussed in :numref:`intrinsics_ground_truth`.\n \nIt is useful to subtract each DEM from the mosaic using ``geodiff``\n(:numref:`geodiff`)::\n\n     geodiff mosaic_ba.tif stereo_left_right/run-DEM.tif \\\n       -o stereo_left_right/run\n\nThese differences can be colorized with ``stereo_gui`` using the ``--colorbar``\noption (:numref:`colorize`). The std dev of the obtained signed difference \ncan be used as a measure of discrepancy. These errors should go down after\nrefining the intrinsics.\n\nUniformly distributed interest points\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nFor the next step, refining the intrinsics, it is important to have\nwell-distributed interest points. \n\nNormally, the sparse interest points produced with bundle adjustment so far can\nbe used. *For most precise work, dense and uniformly distributed interest points\nproduced from disparity are necessary* (:numref:`dense_ip`).\n\nFor example, if the input dataset consists of 6 overlapping stereo pairs, stereo\ncan be run between each left image and every other right image, producing 36\nsets of dense interest points. See an example in :numref:`change3`.\n\nThe interest point file names must be changed to respect the *naming convention*\n(:numref:`ba_match_files`), reflecting the names of the raw images, then passed\nto ``bundle_adjust`` via the ``--match-files`` option.\n\nOne can also take the sparse interest points, and augment them with dense\ninterest points from stereo only for a select set of pairs. All these must\nthen use the same naming convention.\n\nRefining the intrinsics\n^^^^^^^^^^^^^^^^^^^^^^^\n\nWe will use the camera files produced by ``bundle_adjust`` before, with names as\n``ba/run-*.adjusted_state.json``. These have the refined position and\norientation. We will re-optimize those together with the intrinsics parameters,\nincluding distortion (which in ``bundle_adjust`` goes by the name\n``other_intrinsics``).\n\nThe images and (adjusted) cameras for individual sensors should be put in\nseparate files, but in the same overall order as before, to be able reuse the\nmatch files. Then, the image lists will be passed to the ``--image-list`` option\nwith comma as separator (no spaces), and the same for the camera lists. The\nbundle adjustment command becomes::\n\n  bundle_adjust --solve-intrinsics                 \\\n    --inline-adjustments                           \\\n    --intrinsics-to-float                          \\\n    \"optical_center focal_length other_intrinsics\" \\\n    --image-list tc1_images.txt,tc2_images.txt     \\\n    --camera-list tc1_cameras.txt,tc2_cameras.txt  \\\n    --num-iterations 10                            \\\n    --clean-match-files-prefix ba/run              \\\n    --heights-from-dem mosaic_ba.tif               \\\n    --heights-from-dem-uncertainty 10.0            \\\n    --heights-from-dem-robust-threshold 0.1        \\\n    --remove-outliers-params '75.0 3.0 20 20'      \\\n    --max-pairwise-matches 20000                   \\\n    -o ba_other_intrinsics/run\n\nSee :numref:`heights_from_dem` for the option ``--heights-from-dem``, and \n:numref:`bundle_adjust` for the documentation of all options above.\n\nIf only a single sensor exists, the option ``--intrinsics-to-share`` should be\nset.\n\nIf large errors are still left at the image periphery, adjust\n``--heights-from-dem-uncertainty``. If a small value of this is used with an\ninaccurate prior DEM, it will make the results worse. Also consider adding more\nimages overlapping with the current ones.\n\nSome lens distortion parameters can be kept fixed (option\n``--fixed-distortion-indices``).\n\n.. figure:: images/kaguya_intrinsics_opt_example.png\n   :name: kaguya_intrinsics_opt_example\n   :alt: kaguya_intrinsics_opt_example\n\n   The reprojection errors (``pointmap.csv``) before (top) and after (bottom)\n   refinement of distortion. Some outliers are still visible but are harmless.\n   Dense and uniformly distributed interest points (:numref:`dense_ip`) are\n   strongly suggested, but not used here. \n   \n   It can be seen that many red vertical patterns are now much attenuated (these\n   correspond to individual image edges). On the right some systematic errors\n   are seen (due to the search range in stereo chosen here being too small and\n   some ridges having been missed). Those do not affect the optimization. Using\n   mapprojected images would have helped with this. The ultimate check will be\n   the comparison with LOLA RDR (:numref:`kaguya_intrinsics_alignment_diff`).\n   Plotted with ``stereo_gui`` (:numref:`plot_csv`).\n\nRecreation of the stereo DEMs\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe new cameras can be used to redo stereo and the DEMs. It is suggested to \nuse the option ``--prev-run-prefix`` in ``parallel_stereo`` to \nredo only the triangulation operation, which greatly speeds up processing\n(see :numref:`bathy_reuse_run` and :numref:`mapproj_reuse`).\n\nAs before, it is suggested to examine the intersection error and the difference\nbetween each produced DEM and the corresponding combined averaged DEM. These\nerrors drop by a factor of about 2 and 1.5 respectively. \n\nComparing to an external ground truth\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nWe solved for intrinsics by constraining against the averaged mosaicked DEM of\nthe stereo pairs produced with initial intrinsics. This works reasonably well if\nthe error due to distortion is somewhat small and the stereo pairs overlap\nenough that this error gets averaged out in the mosaic.\n\nIdeally, a known accurate external DEM should be used. For example, one could\ncreate DEMs using LRO NAC data. Note that many such DEMs would be need to be\ncombined, because LRO NAC has a much smaller footprint.\n\nShould such a DEM exist, before using it instead of the averaged mosaic, the\nmosaic (or individual stereo DEMs) should be first aligned to the external DEM.\nThen, the same alignment transform should be applied to the cameras\n(:numref:`ba_pc_align`). Then the intrinsics optimization can happen as before. \n\nWe use the sparse `LOLA RDR\n<https://ode.rsl.wustl.edu/moon/lrololadatapointsearch.aspx>`_ dataset for\nfinal validation. This works well enough because the ground footprint of Kaguya TC is\nrather large. \n\nEach stereo DEM, before and after intrinsics refinement, is individually aligned to \nLOLA, and the signed difference to LOLA is found.\n\n::\n\n     pc_align --max-displacement 50                  \\\n       --save-inv-transformed-reference-points       \\\n       dem.tif lola.csv                              \\\n       -o run_align/run\n\n     point2dem --tr 10   \\\n      --errorimage       \\\n      --stereographic    \\\n      --proj-lon 93.7608 \\\n      --proj-lat 3.6282  \\\n      run_align/run-trans_reference.tif \n\n    geodiff --csv-format 2:lon,3:lat,4:radius_km     \\\n      run_align/run-trans_reference-DEM.tif lola.csv \\\n      -o run_align/run\n\nThe ``pc_align`` tool is quite sensitive to the value of ``--max-displacement``\n(:numref:`pc_align_max_displacement`). Here it was chosen to be somewhat larger\nthan the vertical difference between the two datasets to align. That because\nKaguyaTC is already reasonably well-aligned.\n\n.. figure:: images/kaguya_intrinsics_diff.png\n   :name: kaguya_intrinsics_alignment_diff\n   :alt: kaguya_intrinsics_alignment_diff\n\n   The signed difference between aligned stereo DEMs and LOLA RDR before (top)\n   and after (bottom) refinement of distortion. (Blue = -20 meters, red = 20\n   meters.) It can be seen that the warping of the DEMs due to distortion is much\n   reduced. Plotted with ``stereo_gui`` (:numref:`plot_csv`).\n\n.. _kaguya_ba_illumination:\n\nHandling images with very different illumination\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nIf each stereo pair has consistent illumination, but the illumination is very\ndifferent between pairs, then the above approach may not work well as tie points\ncould be hard to find. It is suggested to do the initial bundle adjustment per\neach stereo pair, followed by alignment of the individual produced DEMs to a\nreference dataset.\n\nApply the alignment transform to the pairwise bundle-adjusted cameras as well\n(:numref:`ba_pc_align`), and use these cameras for the refinement of intrinsics,\nwith the ground constraint being the mosaic of these aligned DEMs. \n\nIt is suggested to examine how each aligned DEM differs from the\nreference, and the same for their mosaic. The hope is that the mosaicking will\naverage out the errors in the individual DEMs.\n\nIf a lot of such stereo pairs are present, for the purpose of refinement of\nintrinsics it is suggested to pick just a handful of them, corresponding to the\narea where the mosaicked DEM differs least from the reference, so where the\ndistortion artifacts are most likely to have been averaged well.\n\n.. _ba_frame_linescan:\n\nMixing frame and linescan cameras\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nSo far we discussed refining the intrinsics for pinhole (frame) cameras, such as\nin :numref:`heights_from_dem`, and for linescan cameras, such as in\n:numref:`kaguya_ba`.\n\nHere we will consider the situation when we have both. It is assumed that the\nimages acquired with these sensors are close in time and have similar\nillumination. There should be a solid amount of image overlap, especially in the\ncorners of the images whose distortion should be optimized. \n\nIt will be illustrated how the presumably more accurate linescan sensor images\ncan be used to refine the intrinsics of the frame sensor.\n\nPreparing the inputs\n^^^^^^^^^^^^^^^^^^^^\n\nThe frame cameras can be in the black-box RPC format (:numref:`rpc`), or any\nother format supported by ASP. The cameras can be converted to the CSM format\nusing ``cam_gen`` (:numref:`cam_gen_frame`). This will find the best-fit\nintrinsics, including the lens distortion. \n\nIt is important to know at least the focal length of the frame cameras somewhat\naccurately. This can be inferred based on satellite elevation and ground\nfootprint.\n\nOnce the first frame camera is converted to CSM, the rest of them that are\nsupposed to be for the same sensor model can borrow the just-solved intrinsic\nparameters using the option ``--sample-file prev_file.json`` (the ``cam_gen``\nmanual has the full invocation).\n\nThe linescan cameras can be converted to CSM format using ``cam_gen`` as well\n(:numref:`cam_gen_linescan`). This does not find a best-fit model, but rather\nreads the linescan sensor poses and intrinsics from the input file.  \n\nWe will assume in this basic example that we have two frame camera images\nsharing intrinsics, named ``frame1.tif`` and ``frame2.tif``, and two linescan\ncamera images, for which will not enforce that the intrinsics are shared. They\ncan even be from different vendors. The linescan intrinsics will be kept fixed.\nAssume these files are named ``linescan1.tif`` and ``linescan2.tif``. The camera\nnames will have the same convention, but ending in ``.json``.\n\nInitial bundle adjustment\n^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe same approach as in :numref:`kaguya_ba_initial_ba` can be used.\nA DEM may be helpful to help figure out which image pairs overlap, but is not \nstrictly necessary. \n\nEnsure consistent order of the images and cameras, both here and in the next\nsteps. This will guarantee that all generated match files will be used. The\norder here will be ``frame1``, ``frame2``, ``linescan1``, ``linescan2``.\n\nIt is very strongly suggested to examine the stereo convergence angles\n(:numref:`ba_conv_angle`). At least some of them should be at least 10-15\ndegrees, to ensure a robust solution.\n\nAlso examine the pairwise matches in ``stereo_gui``\n(:numref:`stereo_gui_pairwise_matches`), the final residuals per camera\n(:numref:`ba_errors_per_camera`), and per triangulated point\n(:numref:`ba_err_per_point`). The latter can be visualized in ``stereo_gui``\n(:numref:`plot_csv`). The goal is to ensure well-distributed features,\nand that the errors are pushed down uniformly.\n\nDense interest points produced from stereo are strongly suggested\n(:numref:`dense_ip`). An example using these is in :numref:`change3`.\n\nEvaluation of terrain models\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nAs in :numref:`kaguya_ba`, it is suggested to create several stereo DEMs after\nthe initial bundle adjustment. For example, make one DEM for the frame camera\npair, and a second for the linescan one. Use mapprojected images, the\n``asp_mgm`` algorithm (:numref:`nextsteps`), and a local stereographic\nprojection for the produced DEMs.\n\nOne should examine the triangulation error for each DEM\n(:numref:`triangulation_error`), and the difference between them with\n``geodiff`` (:numref:`geodiff`). Strong systematic errors for the frame camera\ndata will then motivate the next steps.\n\nRefinement of the frame camera intrinsics\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nWe will follow closely the recipe in :numref:`kaguya_ba`. It is suggested to use\nfor the refinement step the linescan DEM as a constraint (option\n``--heights-from-dem``). If a different DEM is employed, the produced bundle-adjusted\ncameras and DEMs should be aligned to it first (:numref:`ba_pc_align`).\n\nAs for :numref:`kaguya_ba`, we need to create several text files, with each\nhaving the names of the images whose intrinsics are shared, and the same for the\ncameras.\n\nIf not sure that the linescan cameras have the same intrinsics, they can be kept\nin different files. We will keep those intrinsics fixed in either ase.\n\nAssume the previous bundle adjustment was done with the output prefix\n``ba/run``. The files for the next step are created as follows. For the\ncameras::\n\n    ls ba/run-frame1.adjusted_state.json \\\n       ba/run-frame2.adjusted_state.json > frame_cameras.txt\n    ls ba/run-linescan1.adjusted_state.json > linescan1_cameras.txt\n    ls ba/run-linescan2.adjusted_state.json > linescan2_cameras.txt\n \nand similarly the images. Hence, we have 3 groups of sensors. These\nfiles will be passed to ``bundle_adjust`` as follows::\n\n  --image-list frame_images.txt,linescan1_images.txt,linescan2_images.txt      \\\n  --camera-list frame_cameras.txt,linescan1_cameras.txt,linescan2_cameras.txt\n \nUse a comma as separator, and no spaces.\n\nWe will float the intrinsics for the frame cameras, and keep the linescan intrinsics\n(but not poses) fixed. This is accomplished with the option::\n\n  --intrinsics-to-float '1:focal_length,optical_center,other_intrinsics \n                         2:none 3:none'\n\nOptimizing the optical center may not be necessary, as this intrinsic parameter\nmay correlate with the position of the cameras, and these are not easy to\nseparate. Optimizing this may produce an implausible optical center.\n\nDense matches from disparity are strongly recommended (:numref:`dense_ip`).\n\nSome lens distortion parameters can be kept fixed (option\n``--fixed-distortion-indices``).\n\n.. _ba_frame_linescan_results:\n\nPost-refinement evaluation\n^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nNew DEMs and intersection error maps can be created. The previous stereo runs\ncan be reused with the option ``--prev-run-prefix`` in ``parallel_stereo`` (:numref:`mapproj_reuse`).\n\n.. figure:: images/frame_linescan_dem_diff.png\n   :name: frame_linescan_dem_diff\n   :alt: frame_linescan_dem_diff\n\n   The signed difference between the frame and linescan DEMs before intrinsics\n   refinement (left) and after (right).\n\n.. figure:: images/frame_linescan_intersection_error.png\n   :name: frame_linescan_intersection_error\n   :alt: frame_linescan_intersection_error\n\n   The triangulation error for the frame cameras before refinement of intrinsics\n   (left) and after (right). It can be seen in both figures that systematic\n   differences are greatly reduced.\n\n.. _custom_ip:\n\nCustom approaches to interest points\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. _sparse_ip:\n\nSparse and roughly uniformly distributed interest points\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nTo attempt to create roughly uniformly distributed *sparse* interest points\nduring bundle adjustment, use options along the lines ``--ip-per-tile 1000\n--matches-per-tile 500 --max-pairwise-matches 10000``.  \n\nIf the images have very different perspectives, it is suggested to create the\ninterest points based on mapprojected images (:numref:`mapip`).\n\nNote that if the images are big, this will result in a very large number of\npotential matches, because a tile has the size of 1024 pixels. (See\n:numref:`ba_options` for the reference documentation for these options.)\n\nTo produce sparse interest point matches that are accurate to *subpixel level*,\nuse ``--ip-detect-method 1``.\n\n.. _dense_ip:\n\nDense and uniformly distributed interest points\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nDense and uniformly distributed interest points can be created during stereo\n(:numref:`tutorial`). If having many images, that will mean many combinations of\nstereo pairs. A representative set of stereo pairs between all images is usually\nsufficient.\n\nThe resulting interest points will be between the *original, unprojected and\nunaligned images*. This is true even when stereo itself is done with\nmapprojected images.\n\nFor each stereo invocation, add options along the lines of::\n\n    --num-matches-from-disparity 10000\n\nor::\n\n    --num-matches-from-disp-triplets 10000\n\nin order to create such a match file. \n\nThe latter option will ensure that, when there are more than two images, a dense\nsubset of features within area of overlap will have corresponding matches in\nmore than two images, with a single triangulated point on the ground for each\nsuch matching feature set. If having many such stereo pairs, some triangulated\npoints will be represented with matches in all images.\n\nThis can be quite important for bundle adjustment. This number of features for\neach triangulated point is the last field in the ``pointmap.csv`` report files\n(:numref:`ba_err_per_point`). \n\nIn the latest ASP (:numref:`release`), these options are equivalent.\n\nThe produced match file name is named along the lines of::\n\n   run/run-disp-left__right.match\n\nwhere ``left.tif`` and ``right.tif`` are the input images. If these images are\nmapprojected, the latest ASP (post version 3.4.0) will instead adjust the match\nfile name to reflect the original, unprojected image names, as the matches are\nbetween those images. \n\nIn either case, the produced match files must be copied from individual stereo\nruns to the same directory, and *use the standard naming convention* for the\noriginal image names (:numref:`ba_match_files`). The match files must be passed\nto ``bundle_adjust`` via the ``--match-files-prefix`` option. In this example,\nthe prefix would be ``run/run-disp``.\n\nInvoke ``bundle_adjust`` a value of ``--max-pairwise-matches`` that is *at least\ntwice* the number of matches created here to ensure they are all kept.\n\nA detailed example of using dense matches for bundle adjustment is in\n:numref:`change3`.\n\nThese options are formally described in :numref:`triangulation_options`. \n\nInterest points from mapprojected images\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nInterest point matches can be found between mapprojected images first, and those\ncan be unprojected and used in bundle adjustment. This can produce many more\ninterest points when the difference of perspective or scale between images is\nlarge. See :numref:`mapip`.\n\n.. _limit_ip:\n\nLimit extent of interest point matches\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nTo limit the triangulated points produced from interest points to a certain area\nduring bundle adjustment, two approaches are supported. One is the option\n``--proj-win``, coupled with ``--proj-str``. \n\nThe other is using the ``--weight-image`` option (also supported by the jitter\nsolver, :numref:`jitter_solve`). In locations where a given georeferenced weight\nimage has non-positive or nodata values, triangulated points will be ignored.\nOtherwise each pixel reprojection error will be multiplied by the weight closest\ngeographically to the triangulated point. The effect is to work harder on the\nareas where the weight is higher. \n \nSuch a weight image can be created from a regular georeferenced image with\npositive pixel values as follows. Open it in ``stereo_gui``, and draw on top of\nit one or more polygons, each being traversed in a counterclockwise direction,\nand with any holes oriented clockwise (:numref:`plot_poly`). Save this shape as\n``poly.shp``, and then run::\n\n    cp georeferenced_image.tif aux_image.tif\n    gdal_rasterize -i -burn -32768 poly.shp aux_image.tif\n\nThis will keep the data inside the polygons and set the data outside to this value.\nThe value to burn should be negative and smaller than any valid pixel value in\nthe image. To keep the data outside the polygons, omit the ``-i`` option.\n\nThen, create a mask of valid values using ``image_calc`` (:numref:`image_calc`),\nas follows::\n\n    image_calc -c \"max(sign(var_0), 0)\" \\\n     --output-nodata-value var_0        \\\n     aux_image.tif -o weight.tif\n\nExamine the obtained image in ``stereo_gui`` and click on various pixels to\ninspect the values. \n\nIf the image does not have positive values to start with, those values\ncan be first shifted up with ``image_calc``. \n\nVarious such weight images can be merged with ``dem_mosaic``\n(:numref:`dem_mosaic`) or the values manipulated with ``image_calc``.\n\n.. _ba_rpc_distortion:\n\nRPC lens distortion\n~~~~~~~~~~~~~~~~~~~\n\nASP provides a lens distortion model for Pinhole cameras\n(:numref:`pinholemodels`) that uses Rational Polynomial Coefficients (RPC) of\narbitrary degree (:numref:`rpc_distortion`). This can help fit lens distortion\nwhere other simpler models cannot.\n\nThe tool ``convert_pinhole_model`` (:numref:`convert_pinhole_model`) can create\ncamera models with RPC distortion. \n\nIt is very important for the input distortion coefficients to be manually\nmodified so they are on the order of 1e-7 or more, as otherwise they will be\nhard to optimize and may stay small. In the latest builds this is done\nautomatically by ``bundle_adjust`` (option ``--min-distortion``).\n\nSee :numref:`intrinsics_ground_truth` and :numref:`kaguya_ba` for examples of\nhow to to optimize the lens distortion. An example specifically using RPC is\nillustrated in :numref:`kh7_fig`. It is suggested to use dense interest point\nmatches from disparity (:numref:`dense_ip`).\n\n.. figure:: images/biradial_err_rpc.png\n\n  Triangulation error (:numref:`triangulation_error`) examples without modeling\n  distortion (top), and after optimizing the lens distortion with RPC of degree\n  6 (bottom). The dataset for this example was acquired by a drone and had \"biradial\"\n  distortion.\n  \n.. _jigsaw:\n\nBundle adjustment using ISIS\n----------------------------\n\nIn what follows we describe how to do bundle adjustment using ISIS's\ntoolchain. It also serves to describe bundle adjustment in more detail,\nwhich is applicable to other bundle adjustment tools as well, including\nStereo Pipeline's own tool.\n\nASP's ``bundle_adjust`` program can read and write the ISIS control network\nformat, hence the ASP and ISIS tools can be compared or used together\n(:numref:`control_network`).\n\nIn bundle adjustment, the position and orientation of each camera\nstation are determined jointly with the 3D position of a set of image\ntie-points points chosen in the overlapping regions between images. Tie\npoints, as suggested by the name, tie multiple camera images together.\nTheir physical manifestation would be a rock or small crater than can be\nobserved across more than one image.\n\nTie-points are automatically extracted using ISIS's ``autoseed`` and\n``pointreg`` (alternatively one could use a number of outside methods\nsuch as the famous SURF :cite:`surf08`). Creating a\ncollection of tie points, called a *control network*, is a three step\nprocess. First, a general geographic layout of the points must be\ndecided upon. This is traditionally just a grid layout that has some\nspacing that allows for about 20-30 measurements to be made per image.\nThis shows up in slightly different projected locations in each image\ndue to their slight misalignments. The second step is to have an\nautomatic registration algorithm try to find the same feature in all\nimages using the prior grid as a starting location. The third step is to\nmanually verify all measurements visually, checking to insure that each\nmeasurement is looking at the same feature.\n\n.. figure:: images/ba_feature_observation.png\n   :name: ba_feature\n   :alt:  A feature observation\n\n   A feature observation in bundle adjustment, from\n   :cite:`moore09`\n\nBundle adjustment in ISIS is performed with the ``jigsaw`` executable.\nIt generally follows the method described\nin :cite:`triggs00` and determines the best camera\nparameters that minimize the projection error given by\n\n.. math::\n\n     {\\bf \\epsilon} = \\sum_k\\sum_j(I_k-I(C_j, X_k))^2\n\nwhere :math:`I_k` are the tie points on the image plane, :math:`C_j` are the\ncamera parameters, and :math:`X_k` are the 3D positions associated with features\n:math:`I_k`. :math:`I(C_j, X_k)` is an image formation model (i.e. forward\nprojection) for a given camera and 3D point. To recap, it projects the 3D point,\n:math:`X_k`, into the camera with parameters :math:`C_j`. \n\nThis produces a predicted image location for the 3D point that is compared\nagainst the observed location, :math:`I_k`. It then reduces this error with the\nLevenberg-Marquardt algorithm (LMA). Speed is improved by using sparse methods\nas described in :cite:`hartley04`, :cite:`konolige:sparsesparse`, and\n:cite:`cholmod`.\n\nEven though the arithmetic for bundle adjustment sounds clever, there\nare faults with the base implementation. Imagine a case where all\ncameras and 3D points were collapsed into a single point. If you\nevaluate the above cost function, you'll find that the error is indeed\nzero. This is not the correct solution if the images were taken from\norbit. Another example is if a translation was applied equally to all 3D\npoints and camera locations. This again would not affect the cost\nfunction. This fault comes from bundle adjustment's inability to control\nthe scale and translation of the solution. It will correct the geometric\nshape of the problem, yet it cannot guarantee that the solution will\nhave correct scale and translation.\n\nISIS attempts to fix this problem by adding two additional cost\nfunctions to bundle adjustment. First of which is\n\n.. math::\n\n     {\\bf \\epsilon} = \\sum_j(C_j^{initial}-C_j)^2. \n\nThis constrains camera parameters to stay relatively close to their initial\nvalues. Second, a small handful of 3D ground control points (:numref:`bagcp`)\ncan be chosen by hand and added to the error metric as\n\n.. math::\n\n     {\\bf \\epsilon} = \\sum_k(X_k^{gcp}-X_k)^2 \n     \nto constrain these points to known locations in the planetary coordinate frame.\nA physical example of a ground control point could be the location of a lander\nthat has a well known location. GCPs could also be hand-picked points against a\nhighly regarded and prior existing map such as the THEMIS Global Mosaic or the\nLRO-WAC Global Mosaic.\n\nLike other iterative optimization methods, there are several conditions that\nwill cause bundle adjustment to terminate. When updates to parameters become\ninsignificantly small or when the error, :math:`{\\bf \\epsilon}`, becomes\ninsignificantly small, then the algorithm has converged and the result is most\nlikely as good as it will get. However, the algorithm will also terminate when\nthe number of iterations becomes too large in which case bundle adjustment may\nor may not have finished refining the parameters of the cameras.\n\n.. _ba_example:\n\nTutorial: Processing Mars Orbital Camera images\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThis tutorial for ISIS's bundle adjustment tools is taken from\n:cite:`lunokhod:controlnetwork` and\n:cite:`lunokhod:gcp`. These tools are not a product of NASA\nnor the authors of Stereo Pipeline. They were created by USGS and their\ndocumentation is available at :cite:`isis:documentation`.\n\nWhat follows is an example of bundle adjustment using two MOC images of Hrad\nVallis. We use images E02/01461 and M01/00115, the same as used in\n:numref:`moc_tutorial`. These images are available from NASA's PDS (the ISIS\n``mocproc`` program will operate on either the IMQ or IMG format files, we use\nthe ``.imq`` below in the example). \n\nEnsure that ISIS and its supporting data is installed, per :numref:`planetary_images`,\nand that ``ISISROOT`` and ``ISIS3DATA`` are set. The string ``ISIS>`` is not \npart of the shell commands below, it is just suggestive of the fact that we operate\nin an ISIS environment.\n\nFetch the MOC images anc convert them to ISIS cubes.\n\n::\n\n     ISIS> mocproc from=E0201461.imq to=E0201461.cub mapping=no\n     ISIS> mocproc from=M0100115.imq to=M0100115.cub mapping=no\n\nNote that the resulting images are not map-projected. That because bundle\nadjustment requires the ability to project arbitrary 3D points into the camera\nframe. The process of map-projecting an image dissociates the camera model from\nthe image. Map-projecting can be perceived as the generation of a new infinitely\nlarge camera sensor that may be parallel to the surface, a conic shape, or\nsomething more complex. That makes it extremely hard to project a random point\ninto the camera's original model. The math would follow the transformation from\nprojection into the camera frame, then projected back down to surface that ISIS\nuses, then finally up into the infinitely large sensor. ``Jigsaw`` does not\nsupport this and thus does not operate on map-projected images. \n\nASP's ``bundle_adjust`` program, however, can create and match features\non mapprojected images, and then project those into the original images\n(:numref:`mapip`).\n\nBefore we can dive into creating our tie-point measurements we must\nfinish prepping these images. The following commands will add a vector\nlayer to the cube file that describes its outline on the globe. It will\nalso create a data file that describes the overlapping sections between\nfiles.\n\n::\n\n     ISIS> footprintinit from=E0201461.cub\n     ISIS> footprintinit from=M0100115.cub\n     ISIS> ls *.cub > cube.lis\n     ISIS> findimageoverlaps from=cube.lis overlaplist=overlap.lis\n\nAt this point, we are ready to start generating our measurements. This\nis a three step process that requires defining a geographic pattern for\nthe layout of the points on the groups, an automatic registration pass,\nand finally a manual clean up of all measurements. Creating the ground\npattern of measurements is performed with ``autoseed``. It requires a\nsettings file that defines the spacing in meters between measurements.\nFor this example, write the following text into a *autoseed.def* file.\n\n::\n\n     Group = PolygonSeederAlgorithm\n           Name = Grid\n           MinimumThickness = 0.01\n           MinimumArea = 1\n           XSpacing = 1000\n           YSpacing = 2000\n     End_Group\n\nThe minimum thickness defines the minimum ratio between the sides of the\nregion that can have points applied to it. A choice of 1 would define a\nsquare and anything less defines thinner and thinner rectangles. The\nminimum area argument defines the minimum square meters that must be in\nan overlap region. The last two are the spacing in meters between\ncontrol points. Those values were specifically chosen for this pair so\nthat about 30 measurements would be produced from ``autoseed``. Having\nmore control points just makes for more work later on in this process.\nRun ``autoseed`` as follows.\n\n::\n\n     ISIS> autoseed fromlist=cube.lis overlaplist=overlap.lis      \\\n               onet=control.net deffile=autoseed.def networkid=moc \\\n               pointid=vallis???? description=hrad_vallis\n\nNote the option ``pointid=vallis????``. It must be used verbatim. This command\nwill create ids that will look like ``vallis0001``, ``valis0002``, potentially\nup to ``vallis9999``. The number of question marks will control hom many\nmeasurements are created. See `autoseed\n<https://isis.astrogeology.usgs.gov/Application/presentation/PrinterFriendly/autoseed/autoseed.html>`_'s\nmanual page for more details.\n\nInspect this control network with \n`qnet <https://isis.astrogeology.usgs.gov/Application/presentation/Tabbed/qnet/qnet.html>`_. Type \"qnet\" in a terminal, with\nno options. A couple of windows will pop up. From the *File* menu of the\n``qnet`` window, click on *Open control network and cube list*. Open the\nfile ``cube.lis``. From the same dialog, open ``control.net``. \n\nClick on ``vallis0001`` in the Control Network Navigator window, then click on\n``view cubes``. This will show the illustration below. \n \n.. figure:: images/qnet/Qnet_AfterAutoseed_400px.png\n   :name: after_autoseed\n   :alt: Autoseed visualization\n\n   A visualization of the features laid out by ``autoseed`` in ``qnet``.\n   Note that the marks do not cover the same features between images.\n   This is due to the poor initial SPICE (camera pose) data for MOC images.\n\nThe next step is to perform auto registration of these features between the two\nimages using `pointreg\n<https://isis.astrogeology.usgs.gov/Application/presentation/Tabbed/pointreg/pointreg.html>`_.\nThis program also requires a settings file that describes how to do the\nautomatic search. Copy the text box below into a *autoRegTemplate.def* file.\n\n::\n\n      Object = AutoRegistration\n       Group = Algorithm\n         Name         = MaximumCorrelation\n         Tolerance    = 0.7\n       EndGroup\n\n       Group = PatternChip\n         Samples = 21\n         Lines   = 21\n         MinimumZScore = 1.5\n         ValidPercent = 80\n       EndGroup\n\n       Group = SearchChip\n         Samples = 75\n         Lines   = 1000\n       EndGroup\n     EndObject\n\nThe search chip defines the search range for which ``pointreg`` will\nlook for matching images. The pattern chip is simply the kernel size of\nthe matching template. The search range is specific for this image pair.\nThe control network result after ``autoseed`` had a large vertical\noffset on the order of 500 pixels. The large misalignment dictated the\nneed for the large search in the lines direction. Use ``qnet`` to get an\nidea for what the pixel shifts look like in your stereo pair to help you\ndecide on a search range. In this example, only one measurement failed\nto match automatically. Here are the arguments to use in this example of\n``pointreg``.\n\n::\n\n     ISIS> pointreg fromlist=cube.lis cnet=control.net             \\\n                onet=control_pointreg.net deffile=autoRegTemplate.def\n\nThe third step is to verify the measurements in ``qnet``, and, if necessary,\napply manual corrections. Type ``qnet`` in the terminal and then open\n*cube.lis*, followed by *control_pointreg.net*. From the Control Network\nNavigator window, click, as before, on the first point, *vallis0001*. That opens\na third window called the Qnet Tool. That window will allow you to play a flip\nanimation that shows alignment of the feature between the two images. Correcting\na measurement is performed by left clicking in the right image, then clicking\n*Save Measure*, and finally finishing by clicking *Save Point*.\n\nIn this tutorial, measurement *0025* ended up being incorrect. Your number may\nvary if you used different settings than the above or if MOC SPICE (camera pose)\ndata has improved since this writing. When finished, go back to the main Qnet\nwindow. Save the final control network as *control_qnet.net* by clicking on\n*File*, and then *Save As*.\n\n.. figure:: images/qnet/Qnet_AfterQnetManual_400px.png\n   :name: after_manual\n   :alt: After Qnet\n\n   A visualization of the features after manual editing in ``qnet``.\n   Note that the marks now appear in the same location between images.\n\nOnce the control network is finished, it is finally time to start bundle\nadjustment. Here's how ``jigsaw`` is called::\n\n     ISIS> jigsaw                                  \\\n             fromlist           = cube.lis         \\\n             update             = yes              \\\n             twist              = no               \\\n             radius             = yes              \\\n             point_radius_sigma = 1000             \\\n             cnet               = control_qnet.net \\\n             onet               = control_ba.net\n\nThe update option defines that we would like to update the camera pointing, if\nour bundle adjustment converges. The ``twist = no`` option says to not solve for\nthe camera rotation about the camera bore. That property is usually very well\nknown as it is critical for integrating an image with a line-scan camera. The\n``radius = yes`` setting means that the radius of the 3D features can be solved\nfor. Using ``radius = no`` will force the points to use height values from\nanother source, usually LOLA or MOLA. The ``point_radius_sigma`` option defines\nthe uncertainty of the radius of the 3D points, in units of meter.\n\nThe above command will print out diagnostic information from\nevery iteration of the optimization algorithm. The most important\nfeature to look at is the *sigma0* value. It represents the mean of\npixel errors in the control network. In our run, the initial error was\n1065 pixels and the final solution had an error of 1.1 pixels.\n\nProducing a DEM using the newly created camera corrections is the same\nas covered in the Tutorial. When using ``jigsaw``, it modifies\na copy of the SPICE data that is stored internally to the cube file.\n\nThus, when we want to create a DEM using the correct camera geometry, no extra\ninformation needs to be given to ``parallel_stereo`` since it is already\ncontained in the camera files. \n\nMore information is in the `jigsaw documentation\n<https://isis.astrogeology.usgs.gov/Application/presentation/Tabbed/jigsaw/jigsaw.html>`_.\nSee :numref:`control_network` for how to use the resulting control network in\n``bundle_adjust``.\n\nIn the event a mistake has been made, ``spiceinit`` will overwrite the SPICE\ndata inside a cube file and provide the original uncorrected camera pointing.\nIt can be invoked on each cub file as::\n\n     ISIS> spiceinit from=image.cub\n\nIn either case, then one can run stereo::\n\n     ISIS> parallel_stereo              \\\n             --stereo-algorithm asp_mgm \\\n             --subpixel-mode 9          \\\n             E0201461.cub M0100115.cub  \\\n             stereo/run\n     \nSee :numref:`nextsteps` for how how to improve the quality of stereo\ncorrelation results (at the expense of speed), how to create a DEM,\netc.\n\n.. _jigsaw_cnet_details:\n\nUsing the ISIS cnet format in ASP\n---------------------------------\n\nASP's ``bundle_adjust`` program can read and write control networks in the ISIS\nformat (and they are read by ``jitter_solve`` as well). A basic overview of how\nthis works is in :numref:`jigsaw_cnet`. This section provides more details.\n\nA priori surface points will be read and written back (they may change only in\nspecial cases, see below). Adjusted surface points will be read, optimized, then\nwritten back. \n\nFor constrained surface points, the constraint will be relative to the a priori\nsurface points. These will be used with sigmas from adjusted surface points, as\nthe a priori sigmas are on occasion negative, and likely the adjusted sigmas are\nmore up-to-date. \n\nConstrained surface points are treated as GCP in ``bundle_adjust``\n(:numref:`bagcp`), so smaller sigmas result in more weight given to the\ndiscrepancy betwen surface points being optimized and a priori surface points.\n\nFixed surface points will be set to the a priori values and kept fixed during\nthe optimization. \n\nAny input points that are flagged as ignored or rejected will be treated as\noutliers and will not be used in the optimization. They will be saved the same\nway. Additional points may be tagged as outliers during optimization. These will\nbe flagged as ignored and rejected on output.\n\nPartially constrained points will be treated as free points during the\noptimization, but the actual flags will be preserved on saving.\n\nControl measure sigmas are read and written back. They will be used in the\noptimization. If not set in the input file, they will be assigned the value 1.0\nby ``bundle_adjust``, and it is this value that will be saved. \n\nPixel measurements will have 0.5 subtracted on input, and then added back on\noutput. \n\nIf ``bundle_adjust`` is invoked with GCP files specified separately in ASP's GCP\nformat, the GCP will be appended to the ISIS control network and then saved\ntogether with it. These points will be treated as constrained (with provided\nsigmas and a priori surface values), unless the sigmas are set to the precise\nvalue of 1e-10, or when the flag ``--fix-gcp-xyz`` is used, in which case they\nwill be treated as fixed both during optimization and when saving to the ISIS\ncontrol network file. (For a small value of sigma, GCP are practically fixed in\neither case.)\n\nUsing the ``bundle_adjust`` options ``--initial-transform`` and\n``--input-adjustments-prefix`` will force the recomputation of a priori points\n(using triangulation), as these options can drastically change the cameras. \n\nA priori points will change if ``--heights-from-dem`` is used\n(:numref:`heights_from_dem`). The sigmas will be set to what is provided via the\n``--heights-from-dem-uncertainty`` option.\n\nIf exporting match files from an ISIS control network (option\n``--output-cnet-type match-files``), constrained and fixed points won't be\nsaved, as ASP uses GCP files for that. Saved match files will have the rest of\nthe matches, and clean match files will have only the inliers. Any sigma values\nand surface points from the control network will not be saved. \n"
  },
  {
    "path": "docs/conf.py",
    "content": "# -*- coding: utf-8 -*-\n#\n# Configuration file for the Sphinx documentation builder.\n#\n# This file does only contain a selection of the most common options. For a\n# full list see the documentation:\n# http://www.sphinx-doc.org/en/master/config\n\n# -- Path setup --------------------------------------------------------------\n\n# If extensions (or modules to document with autodoc) are in another directory,\n# add these directories to sys.path here. If the directory is relative to the\n# documentation root, use os.path.abspath to make it absolute, like shown here.\n#\n# import os\n# import sys\n# sys.path.insert(0, os.path.abspath('.'))\n\nimport re\nfrom pathlib import Path\n\n\n# -- Project information -----------------------------------------------------\n\nproject = 'Ames Stereo Pipeline'\ncopyright = (\n    '2009-2025, United States Government as represented by the '\n    'Administrator of the National Aeronautics and Space Administration'\n)\nauthor = 'ASP Authors'\n\n# Extract the ASP version from ../src/CMakeLists.txt\nversion_text = Path(\"../src/CMakeLists.txt\").read_text()\nversion_lines = version_text.splitlines()\n# Find the line that sets the version. Ignore comments.\nversion_string = \"\"\nfor line in version_lines:\n    # Match at starting of line PACKAGE_VERSION followed something in parentheses\n    m = re.match(r'^\\s*set\\s*\\(\\s*PACKAGE_VERSION\\s+(.*?)\\s*\\)$', line)\n    if m:\n        version_string = m.group(1)\n        break\nif version_string == \"\":\n    raise Exception(\"Could not find the version in CMakeLists.txt\")\n\n# The short X.Y version\nversion = version_string.replace('_', '-')\n# The full version, including alpha/beta/rc tags\nrelease = version\n\n\n# -- General configuration ---------------------------------------------------\n\n# If your documentation needs a minimal Sphinx version, state it here.\n#\n# needs_sphinx = '1.0'\n\n# Add any Sphinx extension module names here, as strings. They can be\n# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom\n# ones.\nextensions = [\n    'sphinx.ext.autodoc',\n    'sphinx.ext.coverage',\n    'sphinx.ext.mathjax',\n    'sphinx.ext.ifconfig',\n    'sphinx.ext.viewcode',\n    'sphinx.ext.githubpages',\n    'sphinxcontrib.bibtex',\n]\nbibtex_bibfiles = ['bibliography.bib', 'papersusingasp.bib']\n\nnumfig = True\n\n# Add any paths that contain templates here, relative to this directory.\ntemplates_path = ['_templates']\n\n# The suffix(es) of source filenames.\n# You can specify multiple suffix as a list of string:\n#\n# source_suffix = ['.rst', '.md']\nsource_suffix = '.rst'\n\n# The master toctree document.\nmaster_doc = 'index'\n\n# The language for content autogenerated by Sphinx. Refer to documentation\n# for a list of supported languages.\n#\n# This is also used if you do content translation via gettext catalogs.\n# Usually you set \"language\" from the command line for these cases.\nlanguage = 'en'\n\n# List of patterns, relative to source directory, that match files and\n# directories to ignore when looking for source files.\n# This pattern also affects html_static_path and html_extra_path .\nexclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']\n\n# The name of the Pygments (syntax highlighting) style to use.\npygments_style = 'sphinx'\n\n\n# -- Options for HTML output -------------------------------------------------\n\n# The theme to use for HTML and HTML Help pages.  See the documentation for\n# a list of builtin themes.\n#\nhtml_theme = 'alabaster'\n\n# Theme options are theme-specific and customize the look and feel of a theme\n# further.  For a list of options available for each theme, see the\n# documentation.\n#\n# html_theme_options = {}\n\n# Add any paths that contain custom static files (such as style sheets) here,\n# relative to this directory. They are copied after the builtin static files,\n# so a file named \"default.css\" will overwrite the builtin \"default.css\".\n# html_static_path = ['_static']\n\n# Custom sidebar templates, must be a dictionary that maps document names\n# to template names.\n#\n# The default sidebars (for documents that don't match any pattern) are\n# defined by theme itself.  Builtin themes are using these templates by\n# default: ``['localtoc.html', 'relations.html', 'sourcelink.html',\n# 'searchbox.html']``.\n#\n# html_sidebars = {}\n\n\n# -- Options for HTMLHelp output ---------------------------------------------\n\n# Output file base name for HTML help builder.\nhtmlhelp_basename = 'AmesStereoPipelinedoc'\n\n\n# -- Options for LaTeX output ------------------------------------------------\n\nlatex_elements = {\n    # The paper size ('letterpaper' or 'a4paper').\n    #\n    # 'papersize': 'letterpaper',\n\n    # The font size ('10pt', '11pt' or '12pt').\n    #\n    # 'pointsize': '10pt',\n\n    # Additional stuff for the LaTeX preamble.\n    #\n    # 'preamble': '',\n\n    # Latex figure (float) alignment\n    #\n    # 'figure_align': 'htbp',\n}\n\n# Grouping the document tree into LaTeX files. List of tuples\n# (source start file, target name, title,\n#  author, documentclass [howto, manual, or own class]).\nlatex_documents = [\n    (master_doc, 'asp_book.tex', 'Ames Stereo Pipeline Documentation',\n     r'Ross A. Beyer, Oleg Alexandrov, Scott McMichael, \\\\ and the ASP contributors',\n     'manual'),\n]\n\n\n# -- Options for manual page output ------------------------------------------\n\n# One entry per manual page. List of tuples\n# (source start file, name, description, authors, manual section).\nman_pages = [\n    (master_doc, 'amesstereopipeline', 'Ames Stereo Pipeline Documentation',\n     [author], 1)\n]\n\n\n# -- Options for Texinfo output ----------------------------------------------\n\n# Grouping the document tree into Texinfo files. List of tuples\n# (source start file, target name, title, author,\n#  dir menu entry, description, category)\ntexinfo_documents = [\n    (master_doc, 'AmesStereoPipeline', 'Ames Stereo Pipeline Documentation',\n     author, 'AmesStereoPipeline', 'One line description of project.',\n     'Miscellaneous'),\n]\n\n\n# -- Extension configuration -------------------------------------------------\n"
  },
  {
    "path": "docs/contributing.rst",
    "content": ".. include:: ../CONTRIBUTING.rst\n"
  },
  {
    "path": "docs/correlation.rst",
    "content": ".. _correlation:\n\nAdvanced stereo topics\n======================\n\nIn this chapter we will dive much deeper into understanding the core\nalgorithms in the Stereo Pipeline. We start with an overview of the five\nstages of stereo reconstruction. Then we move into an in-depth\ndiscussion and exposition of the various correlation algorithms.\n\nThe goal of this chapter is to build an intuition for the stereo\ncorrelation process. This will help users to identify unusual results in\ntheir DEMs and hopefully eliminate them by tuning various parameters in\nthe ``stereo.default`` file (:numref:`stereodefault`). For scientists and\nengineers who are using DEMs produced with the Stereo Pipeline, this\nchapter may help to answer the question, \"What is the Stereo Pipeline\ndoing to the raw data to produce this DEM?\"\n\nA related question that is commonly asked is, \"How accurate is a DEM\nproduced by the Stereo Pipeline?\" This chapter does not yet address\nmatters of accuracy and error, however we have several efforts underway\nto quantify the accuracy of Stereo Pipeline-derived DEMs, and will be\npublishing more information about that shortly. Stay tuned.\n\nThe entire stereo correlation process, from raw input images to a point\ncloud or DEM, can be viewed as a multistage pipeline as depicted in\n:numref:`asp`, and detailed in the following sections.\n\n.. figure:: images/asp.png\n   :alt: Flow of data through the Stereo Pipeline.\n   :name: asp\n\n   Flow of data through the Stereo Pipeline.\n\nPre-processing\n--------------\n\nThe first optional (but recommended) step in the process is least\nsquares Bundle Adjustment, which is described in detail in\n:numref:`bundle_adjustment`.\n\nNext, the left and right images are roughly aligned using one of\nthe four methods: (1) a homography transform of the right image\nbased on automated tie-point measurements (interest point matches), \n(2) an affine epipolar\ntransform of both the left and right images (also based on tie-point\nmeasurements as earlier), the effect of which is equivalent to\nrotating the original cameras which took the pictures, (3) a 3D\nrotation that achieves epipolar rectification (only implemented for\nPinhole sessions for missions like MER or K10, see\n:numref:`mer-example` and :numref:`k10example`) or (4)\nmap-projection of both the left and right images using the ISIS\n``cam2map`` command or through the more general ``mapproject`` tool\nthat works for any cameras supported by ASP (see :numref:`mapproj-example`\nfor the latter). The first three options can be applied automatically\nby the Stereo Pipeline when the ``alignment-method`` variable in\nthe ``stereo.default`` file is set to ``affineepipolar``, ``homography``,\nor ``epipolar``, respectively.\n\nThe latter option, running ``cam2map``, ``cam2map4stereo.py``, or\n``mapproject`` must be carried out by the user prior to invoking the\n``parallel_stereo`` command. Map-projecting the images using ISIS eliminates any\nunusual distortion in the image due to the unusual camera acquisition\nmodes (e.g. pitching \"ROTO\" maneuvers during image acquisition for MOC,\nor highly elliptical orbits and changing line exposure times for the ,\nHRSC). It also eliminates some of the perspective differences in the\nimage pair that are due to large terrain features by taking the existing\nlow-resolution terrain model into account (e.g. the :term:`MOLA`, :term:`LOLA`,\n:term:`NED`, or :term:`ULCN` 2005 models).\n\nIn essence, map-projecting the images results in a pair of very closely\nmatched images that are as close to ideal as possible given existing\ninformation. This leaves only small perspective differences in the\nimages, which are exactly the features that the stereo correlation\nprocess is designed to detect.\n\nFor this reason, we recommend map-projection for pre-alignment of most\nstereo pairs. Its only cost is longer triangulation times as more math\nmust be applied to work back through the transforms applied to the\nimages. In either case, the pre-alignment step is essential for\nperformance because it ensures that the disparity search space is\nbounded to a known area. In both cases, the effects of pre-alignment are\ntaken into account later in the process during triangulation, so you do\nnot need to worry that pre-alignment will compromise the geometric\nintegrity of your DEM.\n\nIn some cases the pre-processing step may also normalize the pixel\nvalues in the left and right images to bring them into the same\ndynamic range. Various options in the ``stereo.default`` file affect\nwhether or how normalization is carried out, including\n``individually-normalize`` and ``force-use-entire-range``. Although\nthe defaults work in most cases, the use of these normalization\nsteps can vary from data set to data set, so we recommend you refer\nto the examples in :numref:`examples` to see if these are necessary\nin your use case.\n\nFinally, pre-processing can perform some filtering of the input\nimages (as determined by ``prefilter-mode``) to reduce noise and\nextract edges in the images.  When active, these filters apply a\nkernel with a sigma of ``prefilter-kernel-width`` pixels that can\nimprove results for noisy images (``prefilter-mode`` must be chosen\ncarefully in conjunction with ``cost-mode``, see :numref:`stereodefault`).\nThe pre-processing modes that extract image edges are useful for\nstereo pairs that do not have the same lighting conditions, contrast,\nand absolute brightness :cite:`Nishihara84practical`. We recommend\nthat you use the defaults for these parameters to start with, and\nthen experiment only if your results are sub-optimal.\n\n.. _stereo_corr:\n\nDisparity map initialization\n----------------------------\n\nCorrelation is the process at the heart of the Stereo Pipeline. It is a\ncollection of algorithms that compute correspondences between pixels in the left\nimage and pixels in the right image. The map of these correspondences is called\na *disparity map*.  This is saved in the file named ``output_prefix-D.tif``\n(:numref:`out_corr_files`).\n\nA disparity map is an image whose pixel locations correspond to the pixel\n:math:`(u,v)` in the left image, and whose pixel values contain the horizontal\nand vertical offsets :math:`(d_u, d_v)` to the matching pixel in the right\nimage, which is :math:`(u+d_u, v+d_v)`.\n\nThe correlation process attempts to find a match for every pixel in the\nleft image. The only pixels skipped are those marked invalid in the mask\nimages. For large images (e.g. from HiRISE, , LROC, or WorldView), this\nis very expensive computationally, so the correlation process is split\ninto two stages. The disparity map initialization step computes\napproximate correspondences using a pyramid-based search that is highly\noptimized for speed, but trades resolution for speed. The results of\ndisparity map initialization are integer-valued disparity estimates. The\nsub-pixel refinement step takes these integer estimates as initial\nconditions for an iterative optimization and refines them using the\nalgorithm discussed in the next section.\n\nWe employ several optimizations to accelerate disparity map\ninitialization: (1) a box filter-like accumulator that reduces duplicate\noperations during correlation :cite:`Sun02rectangular`; (2)\na coarse-to-fine pyramid based approach where disparities are estimated\nusing low-resolution images, and then successively refined at higher\nresolutions; and (3) partitioning of the disparity search space into\nrectangular sub-regions with similar values of disparity determined in\nthe previous lower resolution level of the pyramid\n:cite:`Sun02rectangular`.\n\n.. figure:: images/correlation/correlation_400px.png\n   :name: correlation_window\n   :alt: Correlation example\n\n   The correlation algorithm in disparity map initialization uses a\n   sliding template window from the left image to find the best match in\n   the right image. The size of the template window can be adjusted\n   using the ``H_KERN`` and ``V_KERN`` parameters in the\n   ``stereo.default`` file, and the search range can be adjusted using\n   the ``{H,V}_CORR_{MIN/MAX}`` parameters.\n\nNaive correlation itself is carried out by moving a small, rectangular\ntemplate window from the from left image over the specified search\nregion of the right image, as in :numref:`correlation_window`. The\n\"best\" match is determined by applying a cost function that compares the\ntwo windows. The location at which the window evaluates to the lowest\ncost compared to all the other search locations is reported as the\ndisparity value. The ``cost-mode`` variable allows you to choose one of\nthree cost functions, though we recommend normalized cross correlation\n:cite:`Menard97:robust`, since it is most robust to slight\nlighting and contrast variations between a pair of images. Try the\nothers if you need more speed at the cost of quality.\n\n.. _d_sub:\n\nLow-resolution disparity\n------------------------\n\nProducing the disparity map at full resolution as in :numref:`stereo_corr` is\ncomputationally expensive. To speed up the process, ASP starts by first creating\na low-resolution initial guess version of the disparity map. This is saved\nin the file ``output_prefix-D_sub.tif`` (:numref:`out_corr_files`).\n\nFour methods are available for producing this low-resolution disparity,\ndescribed below.\n\n.. _d_sub_corr:\n\nDisparity from stereo correlation\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe default approach is to use for the low-resolution disparity the same\nalgorithm as for the full-resolution one, but called with the low-resolution\nimages ``output_prefix-L_sub.tif`` and ``output_prefix-R_sub.tif``. \n\nThose \"sub\" images have their size chosen so that their area is around 2.25\nmegapixels, a size that is easily viewed on the screen unlike the raw source\nimages. \n\nThis corresponds to the ``parallel_stereo`` option ``--corr-seed-mode 1``\n(:numref:`stereodefault`).\n\n.. _d_sub_dem:\n\nDisparity from a DEM\n~~~~~~~~~~~~~~~~~~~~\n\nThe low resolution disparity can be computed from a lower-resolution initial\nguess DEM of the area. This works with all alignment methods except ``epipolar``\n(:numref:`image_alignment`). Mapprojected images are supported\n(:numref:`mapproj-example`).\n\nThis option assumes rather good alignment between the cameras and the DEM.\nOtherwise see :numref:`ba_pc_align`. The option ``--disparity-estimation-dem-error``\nshould be used to specify the uncertainty in such a DEM.\n\nThis can be useful when there are a lot of clouds, or terrain features are not\nseen well at low resolution.\n\nAs an example, invoke ``parallel_stereo`` with options along the lines of::\n\n   --corr-seed-mode 2                 \\\n   --disparity-estimation-dem ref.tif \\\n   --disparity-estimation-dem-error 5 \n\nWhen features are washed out at low resolution, consider also adding the option\n``--corr-max-levels 2``, or see :numref:`sparse_disp`.\n\nSee :numref:`stereodefault` for more information on these options.\n\nIt is suggested to extract the produced low-resolution disparity bands with\n``gdal_translate`` (:numref:`mask_disparity`) or ``disparitydebug``\n(:numref:`disparitydebug`). Inspect them  in ``stereo_gui``\n(:numref:`stereo_gui`).\n\n.. _sparse_disp:\n\nSparse disparity from full-resolution images\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nFor snowy landscapes, whose only features may be small-scale grooves or ridges\nsculpted by wind (so-called *zastrugi*), the low-resolution images appear blank,\nso the default low-resolution disparity approach in :numref:`d_sub_corr` fails.\n\nOne can then use a disparity from a DEM (:numref:`d_sub_dem`), skip the\nlow-resolution disparity (:numref:`d_sub_skip`), or the approach outlined in\nthis section, based on the tool named ``sparse_disp``.\n\nThis program create the low-resolution initial disparity\n``output_prefix-D_sub.tif`` from the full-resolution images, yet only at a\nsparse set of pixels for reasons, of speed. This low-resolution disparity is\nthen refined as earlier using a pyramid approach, but with fewer levels,\nto prevent the features being washed out.\n\n.. figure:: images/examples/sparse_disp.png\n   :name: fig:sparse-disp-example\n   :figwidth: 100%\n\n   Example of a difficult terrain obtained without (left) and with (right)\n   ``sparse_disp``. (In these DEMs there is very little elevation change,\n   hence the flat appearance.)\n\nHere is an example:\n\n::\n\n    parallel_stereo -t dg --corr-seed-mode 3            \\\n      --corr-max-levels 2                               \\\n      left_mapped.tif right_mapped.tif                  \\\n      12FEB12053305-P1BS_R2C1-052783824050_01_P001.XML  \\\n      12FEB12053341-P1BS_R2C1-052783824050_01_P001.XML  \\\n      dg/dg srtm_53_07.tif\n\nThis tool can be customized with the ``parallel_stereo`` switch\n``--sparse-disp-options``. \n\nInstallation of sparse_disp\n^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe ``sparse_disp`` tool is written in Python, and makes use of the ``gdal``,\n``numpy``, and ``scipy`` packages. To use it, these packages must be installed\nwith ``conda``. \n\nIt is very important to use the same version of ``python``, ``numpy``, and\n``gdal`` as in ASP. Hence, make adjustments below and then run::\n\n    conda create -n sparse_disp c conda-forge      \\\n      python=3.12.2 numpy=1.26.4 gdal=3.8.1 scipy\n      \nASP can be told where to look for these packages with a line such as::\n      \n    export ASP_PYTHON_MODULES_PATH=$HOME/miniconda3/envs/sparse_disp/lib/python3.1/site-packages\n    \nHere, also need to adjust appropriately the ``conda`` installation location \nand ``python`` version.\n\nIf ASP is installed with ``conda`` (:numref:`conda_intro`), and ISIS version is\nat least 9.0.0, it will already have all the needed dependencies. Hence, can\nadjust ``ASP_PYTHON_MODULES_PATH`` to point to the ``site-packages`` directory\nof the ASP conda environment.\n\n.. _d_sub_skip:\n\nSkip the low-resolution disparity\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nAny large failure in the low-resolution disparity image will be detrimental to\nthe performance of the higher resolution disparity.  In the event that the\nlow-resolution disparity is completely unhelpful, it can be skipped by adding\n``corr-seed-mode 0`` in the ``stereo.default`` file and using a manual search\nrange (:numref:`search_range`). \n\nThis should only be considered in cases where the texture in an image is\ncompletely lost when subsampled.  An example would be satellite images of fresh\nsnow in the Arctic. Alternatively, ``output_prefix-D_sub.tif`` can be computed\nat a sparse set of pixels at full resolution, as described in\n:numref:`sparse_disp`.\n\nMore on the correlation process\n-------------------------------\n\nDebugging disparity map initialization\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nNever will all pixels be successfully matched during stereo matching.\nThough a good chunk of the image should be correctly processed. If you\nsee large areas where matching failed, this could be due to a variety of\nreasons:\n\n-  In regions where the images do not overlap, there should be no valid\n   matches in the disparity map.\n\n-  Match quality may be poor in regions of the images that have\n   different lighting conditions, contrast, or specular properties of\n   the surface.\n\n-  Areas that have image content with very little texture or extremely\n   low contrast may have an insufficient signal to noise ratio, and will\n   be rejected by the correlator.\n\n-  Areas that are highly distorted due to different image perspective,\n   such as crater and canyon walls, may exhibit poor matching\n   performance. This could also be due to failure of the preprocessing\n   step in aligning the images. The correlator can not match images that\n   are rotated differently from each other or have different\n   scale/resolution. Mapprojection is used to at least partially rectify\n   these issues (:numref:`mapproj-example`).\n\nBad matches, often called \"blunders\" or \"artifacts\" are also common, and\ncan happen for many of the same reasons listed above. The Stereo\nPipeline does its best to automatically detect and eliminate these\nblunders, but the effectiveness of these outlier rejection strategies\ndoes vary depending on the quality of the input images.\n\nWhen tuning up your ``stereo.default`` file, you will find that it is\nvery helpful to look at the raw output of the disparity map\ninitialization step. This can be done using the ``disparitydebug`` tool,\nwhich converts the ``output_prefix-D.tif`` file into a pair of normal\nimages that contain the horizontal and vertical components of disparity.\nYou can open these in a standard image viewing application and see\nimmediately which pixels were matched successfully, and which were not.\nStereo matching blunders are usually also obvious when inspecting these\nimages. With a good intuition for the effects of various\n``stereo.default`` parameters and a good intuition for reading the\noutput of ``disparitydebug``, it is possible to quickly identify and\naddress most problems.\n\nIf you are seeing too many holes in your disparity images, one option\nthat may give good results is to increase the size of the correlation\nkernel used by ``stereo_corr`` with the ``--corr-kernel`` option.\nIncreasing the kernel size will increase the processing time but should\nhelp fill in regions of the image where no match was found.\n\n.. figure:: images/correlation/stereo_corr_box_compare.png\n   :name: corr-kernel-size-effect\n   :alt: Correlation Kernel Size\n\n   The effect of increasing the correlation kernel size from 35 (left)\n   to 75 (right). This location is covered in snow and several regions\n   lack texture for the correlator to use but a large kernel increases\n   the chances of finding useful texture for a given pixel.\n\n.. figure:: images/correlation/quantile_filter_result.png\n   :name: quantile-filtering-effect\n   :alt: Quantile Filtering\n\n   The effect of using the ``rm-quantile`` filtering option in\n   ``stereo_corr``. In the left image there are a series of high\n   disparity \"islands\" at the bottom of the image. In the right image\n   quantile filtering has removed those islands while leaving the rest\n   of the image intact.\n\n.. _search_range:\n\nSearch range determination\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nIn some circumstances, the low-resolution disparity ``D_sub.tif`` computation\nmay fail, or it may be inaccurate. This can happen for example if only very\nsmall features are present in the original images, and they disappear during the\nresampling that is necessary to obtain ``D_sub.tif``. \n\nIn this case, it is possible to set ``corr-seed-mode`` from the default of 1 to\nthe values of 2 or 3, that will use a DEM or sample the full-resolution images\nto produce a low-resolution disparity (:numref:`d_sub`).\n\nOr, set ``corr-seed-mode`` to 0, and manually specify a search range to use for\nfull-resolution correlation via the parameter ``corr-search``. In\n``stereo.default`` (:numref:`stereodefault`) this parameter's entry will look\nlike::\n\n           corr-search -80 -2 20 2\n\nThe search range can also be set on the command line (:numref:`cmdline`).\n\nThe exact values to use with this option you'll have to discover\nyourself. These four numbers represent the horizontal\nminimum boundary, vertical minimum boundary, horizontal maximum\nboundary, and finally the horizontal maximum boundary within which we\nwill search for the disparity during correlation.\n\nIt can be tricky to select a good search range. That's why the best\nway is to let ``parallel_stereo`` perform an automated determination.\nIf you think that you can do a better estimate of the search range,\ntake look at what search ranges ``stereo_corr`` prints in the log files\nin the output directory, and examine the intermediate disparity images\nusing the ``disparitydebug`` program, to figure out which search\ndirections can be expanded or contracted. The output images will\nclearly show good data or bad data depending on whether the search\nrange is correct.\n\nThe worst case scenario is to determine the search range manually. The\naligned ``L.tif`` and ``R.tif`` images (:numref:`outputfiles`) can be\nopened in ``stereo_gui`` (:numref:`stereo_gui`), and the coordinates\nof points that can be matched visually can be compared. Click on a\npixel to have its coordinates printed in the terminal. Subtract row\nand column locations of a feature in the first image from the\nlocations of the same feature in the second image, and this will yield\noffsets that can be used in the search range. Make several of these\noffset measurements (for example, for features at higher and then\nlower elevations), and use them to define a row and column bounding\nbox, then expand this by 50% and use it for ``corr-search``. This will\nproduce good results in most cases.\n\nIf the search range produced automatically from the low-resolution\ndisparity is too big, perhaps due to outliers, it can be tightened\nwith either ``--max-disp-spread`` or ``--corr-search-limit``, before\ncontinuing with full-resolution correlation (:numref:`stereodefault`).\nBut note that for very steep terrains and no use of mapprojection a\nlarge search range is expected, and tightening it too much may result\nin an inaccurate disparity.\n\n.. _subpixel:\n\nSub-pixel refinement\n--------------------\n\nOnce disparity map initialization is complete, every pixel in the\ndisparity map will either have an estimated disparity value, or it will\nbe marked as invalid. All valid pixels are then adjusted in the\nsub-pixel refinement stage based on the ``subpixel-mode`` setting.\n\nThe first mode is parabola-fitting sub-pixel refinement\n(``subpixel-mode 1``). This technique fits a 2D parabola to points on\nthe correlation cost surface in an 8-connected neighborhood around the\ncost value that was the \"best\" as measured during disparity map\ninitialization. The parabola's minimum can then be computed analytically\nand taken as as the new sub-pixel disparity value.\n\nThis method is easy to implement and extremely fast to compute, but it\nexhibits a problem known as pixel-locking: the sub-pixel disparities\ntend toward their integer estimates and can create noticeable \"stair\nsteps\" on surfaces that should be smooth\n:cite:`Stein06:attenuating,Szeliski03sampling`. See for\nexample :numref:`parabola_subpixel`.\nFurthermore, the parabola subpixel mode is not capable of refining a\ndisparity estimate by more than one pixel, so although it produces\nsmooth disparity maps, these results are not much more accurate than the\nresults that come out of the disparity map initialization in the first\nplace. However, the speed of this method makes it very useful as a\n\"draft\" mode for quickly generating a DEM for visualization (i.e.\nnon-scientific) purposes. It is also beneficial in the event that a user\nwill simply downsample their DEM after generation in Stereo Pipeline.\n\n.. figure:: images/correlation/parabola_results.png\n  :name: parabola_subpixel\n\n  Left: Input images.  Center: results using the parabola draft\n  subpixel mode (subpixel-mode = 1). Right: results using the Bayes\n  EM high quality subpixel mode (subpixel-mode = 2).\n\n\nFor high quality results, we recommend ``subpixel-mode 2``: the Bayes EM\nweighted affine adaptive window correlator. This advanced method\nproduces extremely high quality stereo matches that exhibit a high\ndegree of immunity to image noise. For example Apollo Metric Camera\nimages are affected by two types of noise inherent to the scanning\nprocess: (1) the presence of film grain and (2) dust and lint particles\npresent on the film or scanner. The former gives rise to noise in the\nDEM values that wash out real features, and the latter causes incorrect\nmatches or hard to detect blemishes in the DEM. Attenuating the effect\nof these scanning artifacts while simultaneously refining the integer\ndisparity map to sub-pixel accuracy has become a critical goal of our\nsystem, and is necessary for processing real-world data sets such as the\nApollo Metric Camera data.\n\nThe Bayes EM subpixel correlator also features a deformable template\nwindow from the left image that can be rotated, scaled, and translated\nas it zeros in on the correct match in the right image. This adaptive\nwindow is essential for computing accurate matches on crater or canyon\nwalls, and on other areas with significant perspective distortion due to\nforeshortening.\n\nThis affine-adaptive behavior is based on the Lucas-Kanade template\ntracking algorithm, a classic algorithm in the field of computer vision\n:cite:`Baker04:lucas-kanade`. We have extended this\ntechnique; developing a Bayesian model that treats the Lucas-Kanade\nparameters as random variables in an Expectation Maximization (EM)\nframework. This statistical model also includes a Gaussian mixture\ncomponent to model image noise that is the basis for the robustness of\nour algorithm. We will not go into depth on our approach here, but we\nencourage interested readers to read our papers on the topic\n:cite:`nefian:bayes_em,broxton:isvc09`.\n\nHowever we do note that, like the computations in the disparity map\ninitialization stage, we adopt a multi-scale approach for sub-pixel\nrefinement. At each level of the pyramid, the algorithm is initialized\nwith the disparity determined in the previous lower resolution level of\nthe pyramid, thereby allowing the subpixel algorithm to shift the\nresults of the disparity initialization stage by many pixels if a better\nmatch can be found using the affine, noise-adapted window. Hence, this\nsub-pixel algorithm is able to significantly improve upon the results to\nyield a high quality, high resolution result.\n\nAnother option when run time is important is ``subpixel-mode 3``: the\nsimple affine correlator. This is essentially the Bayes EM mode with the\nnoise correction features removed in order to decrease the required run\ntime. In data sets with little noise this mode can yield results similar\nto Bayes EM mode in approximately one fifth the time.\n\nA different option is Phase Correlation, ``subpixel-mode 4``, which\nimplements the algorithm from :cite:`guizar2008efficient`.\nIt is slow and does not work well on slopes but since the algorithm is\nvery different it might perform in situations where the other algorithms\nare not working well.\n\nTriangulation\n-------------\n\nWhen running an ISIS session, the Stereo Pipeline uses geometric camera\nmodels available in ISIS :cite:`anderson08:isis`. These\nhighly accurate models are customized for each instrument that ISIS\nsupports. Each ISIS \"cube\" file contains all of the information that is\nrequired by the Stereo Pipeline to find and use the appropriate camera\nmodel for that observation.\n\nOther sessions such as DG (*DigitalGlobe*) or Pinhole, require that\ntheir camera model be provided as additional arguments to the ``parallel_stereo``\ncommand. Those camera models come in the form of an XML document for DG\nand as ``*.pinhole, *.tsai, *.cahv, *.cahvor`` for Pinhole sessions.\nThose files must be the third and forth arguments or immediately follow\nafter the two input images for ``parallel_stereo``.\n\n.. figure:: images/correlation/camera_models.png\n   :name: camera_models\n   :alt: Camera Models\n\n   Most remote sensing cameras fall into two generic categories\n   based on their basic geometry.  Framing cameras (left) capture an\n   instantaneous two-dimensional image.  Linescan cameras (right)\n   capture images one scan line at a time, building up an image over\n   the course of several seconds as the satellite moves through the\n   sky.\n\nISIS camera models account for all aspects of camera geometry, including\nboth intrinsic (i.e. focal length, pixel size, and lens distortion) and\nextrinsic (e.g. camera position and orientation) camera parameters.\nTaken together, these parameters are sufficient to \"forward project\" a\n3D point in the world onto the image plane of the sensor. It is also\npossible to \"back project\" from the camera's center of projection\nthrough a pixel corresponding to the original 3D point.\n\n.. figure:: images/correlation/triangulation_400px.png\n   :name: triangulation\n   :alt: Triangulation\n\n   Once a disparity map has been generated and refined, it can be used\n   in combination with the geometric camera models to compute the\n   locations of 3D points on the surface of Mars. This figure shows the\n   position (at the origins of the red, green, and blue vectors) and\n   orientation of the Mars Global Surveyor at two points in time where\n   it captured images in a stereo pair.\n\nNotice, however, that forward and back projection are not symmetric\noperations. One camera is sufficient to \"image\" a 3D point onto a pixel\nlocated on the image plane, but the reverse is not true. Given only a\nsingle camera and a pixel location :math:`x = (u,v),` that is the image\nof an unknown 3D point :math:`P = (x,y,z)`, it is only possible to\ndetermine that :math:`P` lies somewhere along a ray that emanates from\nthe camera center through the pixel location :math:`x`\non the image plane (see :numref:`camera_models`).\n\nAlas, once images are captured, the route from image pixel back to\n3D points in the real world is through back projection, so we must\nbring more information to bear on the problem of uniquely reconstructing\nour 3D point. In order to determine :math:`P` using back projection,\nwe need *two* cameras that both contain pixel locations :math:`x_1`\nand :math:`x_2` where :math:`P` was imaged. Now, we have two rays\nthat converge on a point in 3D space (see :numref:`triangulation`).\nThe location where they meet must be the original location of\n:math:`P`.\n\n.. _triangulation_error:\n\nTriangulation error\n~~~~~~~~~~~~~~~~~~~\n\nIn practice, the rays emanating from matching pixels in the cameras\nrarely intersect perfectly on the ground because any slight error in\nthe position or pointing information of the cameras will affect the\naccuracy of the rays. The matching (correlation) among the images is\nalso not perfect, contributing to the error budget. Then, we take the\n*closest point of intersection* of the two rays as the location of the\nintersection point :math:`P`.\n\nAdditionally, the actual shortest distance between the rays at this\npoint is an interesting and important error metric that measures how\nself-consistent our two camera models are for this point. It will be\nseen in the next chapter that this information, when computed and\naveraged over all reconstructed 3D points, can be a valuable statistic\nfor determining whether to carry out bundle adjustment\n(:numref:`bundle_adjust`). \n\nThe distance between the two rays emanating from matching points in\nthe cameras at their closest intersection is recorded in the fourth\nchannel of the point cloud file, ``output-prefix-PC.tif``.  This is\ncalled the *triangulation error*, or the *ray intersection error*. It\nis measured in meters. This error can be gridded when a DEM is created\nfrom the point cloud by using the ``--errorimage`` argument on the\n``point2dem`` command (:numref:`point2dem`).\n\nThis error *is not* the true accuracy of the DEM. It is only another\nindirect measure of quality. A DEM with high triangulation error, as\ncompared to the ground sample distance, is always bad and should have\nits images bundle-adjusted. A DEM with low triangulation error is at\nleast self-consistent, but could still be bad, or at least\nmisaligned.\n\nIf, after bundle adjustment, the triangulation error is still high at\nthe image corners and the inputs are Pinhole cameras, one may have to\nrefine the intrinsics, including the distortion model.\n:numref:`bundle_adjustment` discusses bundle adjustment, including\noptimizing the intrinsics.\n\nTo improve the location of a triangulated point cloud or created DEM\nrelative to a known ground truth, use alignment (:numref:`pc_align`).\n\nSee :numref:`error_propagation` for another metric qualifying\nthe accuracy of a point cloud or DEM, namely the horizontal and vertical\nuncertainty, as propagated from the input cameras.\n\n.. _mapproj_with_cam2map:\n\nStereo with images mapprojected using ISIS\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThis is a continuation of the discussion at :numref:`moc_tutorial`. It\ndescribes how to mapproject the input images using the ISIS tool\n``cam2map`` and how to run stereo with the obtained\nimages. Alternatively, the images can be mapprojected using ASP\nitself, per :numref:`mapproj-example`.\n\nMapprojection can result in improved results for steep slopes, when\nthe images are taken from very different perspectives, or if the\ncurvature of the planet/body being imaged is non-negligible.\n\nWe will now describe how this works, but we also provide the\n``cam2map4stereo.py`` program (:numref:`cam2map4stereo.py`) which does\nthis automatically.\n\nThe ISIS ``cam2map`` program will map-project these images::\n\n    ISIS> cam2map from=M0100115.cub to=M0100115.map.cub\n    ISIS> cam2map from=E0201461.cub to=E0201461.map.cub \\\n            map=M0100115.map.cub matchmap=true\n\nAt this stage we can run the stereo program with map-projected images:\n\n::\n\n     ISIS> parallel_stereo E0201461.map.cub M0100115.map.cub   \\\n             --alignment-method none -s stereo.default.example \\\n             results/output\n\nHere we have used ``alignment-method none`` since ``cam2map4stereo.py``\nbrought the two images into the same perspective and using the same\nresolution. If you invoke ``cam2map`` independently on the two images,\nwithout ``matchmap=true``, their resolutions may differ, and using an\nalignment method rather than ``none`` to correct for that is still\nnecessary.\n\nNow you may skip to chapter :numref:`nextsteps` which will discuss the\n``parallel_stereo`` program in more detail and the other tools in ASP.\nOr, you can continue reading below for more details on mapprojection.\n\nAdvanced discussion of mapprojection\n------------------------------------\n\nNotice the order in which the images were run through ``cam2map``. The\nfirst projection with ``M0100115.cub`` produced a map-projected image\ncentered on the center of that image. The projection of ``E0201461.cub``\nused the ``map=`` parameter to indicate that ``cam2map`` should use the\nsame map projection parameters as those of ``M0100115.map.cub``\n(including center of projection, map extents, map scale, etc.) in\ncreating the projected image. By map-projecting the image with the worse\nresolution first, and then matching to that, we ensure two things: (1)\nthat the second image is summed or scaled down instead of being\nmagnified up, and (2) that we are minimizing the file sizes to make\nprocessing in the Stereo Pipeline more efficient.\n\nTechnically, the same end result could be achieved by using the\n``mocproc`` program alone, and using its ``map= M0100115.map.cub``\noption for the run of ``mocproc`` on ``E0201461.cub`` (it behaves\nidentically to ``cam2map``). However, this would not allow for\ndetermining which of the two images had the worse resolution and\nextracting their minimum intersecting bounding box (see below).\nFurthermore, if you choose to conduct bundle adjustment (see\n:numref:`bundle_adjustment`) as a pre-processing step, you would\ndo so between ``mocproc`` (as run above) and ``cam2map``.\n\nThe above procedure is in the case of two images which cover similar\nreal estate on the ground. If you have a pair of images where one image\nhas a footprint on the ground that is much larger than the other, only\nthe area that is common to both (the intersection of their areas) should\nbe kept to perform correlation (since non-overlapping regions don't\ncontribute to the stereo solution). \n\nASP normally has no problem identifying the shared area and it still\nrun well. Below we describe, for the adventurous user, some\nfine-tuning of this procedure.\n\nIf the image with the larger footprint size also happens to be the\nimage with the better resolution (i.e. the image run through\n``cam2map`` second with the ``map=`` parameter), then the above\n``cam2map`` procedure with ``matchmap=true`` will take care of it just\nfine. Otherwise you'll need to figure out the latitude and longitude\nboundaries of the intersection boundary (with the ISIS ``camrange``\nprogram). Then use that smaller boundary as the arguments to the\n``MINLAT``, ``MAXLAT``, ``MINLON``, and ``MAXLON`` parameters of the\nfirst run of ``cam2map``. So in the above example, after ``mocproc``\nwith ``Mapping= NO`` you'd do this:\n\n::\n\n     ISIS> camrange from=M0100115.cub\n              ... lots of camrange output omitted ...\n     Group = UniversalGroundRange\n       LatitudeType       = Planetocentric\n       LongitudeDirection = PositiveEast\n       LongitudeDomain    = 360\n       MinimumLatitude    = 34.079818835324\n       MaximumLatitude    = 34.436797628116\n       MinimumLongitude   = 141.50666207418\n       MaximumLongitude   = 141.62534719278\n     End_Group\n              ... more output of camrange omitted ...\n\n::\n\n     ISIS> camrange from=E0201461.cub\n              ... lots of camrange output omitted ...\n     Group = UniversalGroundRange\n       LatitudeType       = Planetocentric\n       LongitudeDirection = PositiveEast\n       LongitudeDomain    = 360\n       MinimumLatitude    = 34.103893080982\n       MaximumLatitude    = 34.547719435156\n       MinimumLongitude   = 141.48853937384\n       MaximumLongitude   = 141.62919740048\n     End_Group\n              ... more output of camrange omitted ...\n\nNow compare the boundaries of the two above and determine the\nintersection to use as the boundaries for ``cam2map``:\n\n::\n\n     ISIS> cam2map from=M0100115.cub to=M0100115.map.cub   \\\n             DEFAULTRANGE=CAMERA MINLAT=34.10 MAXLAT=34.44 \\\n             MINLON=141.50 MAXLON=141.63\n     ISIS> cam2map from=E0201461.cub to=E0201461.map.cub \\\n             map=M0100115.map.cub matchmap=true\n\nYou only have to do the boundaries explicitly for the first run of\n``cam2map``, because the second one uses the ``map=`` parameter to mimic\nthe map-projection of the first. These two images are not radically\ndifferent in spatial coverage, so this is not really necessary for these\nimages, it is just an example.\n\nAgain, unless you are doing something complicated, using the\n``cam2map4stereo.py`` (:numref:`cam2map4stereo.py`) will take care of\nall these steps for you.\n\n.. _local_alignment_issues:\n\nIdentifying issues in local alignment\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nStereo with local epipolar alignment (:numref:`running-stereo`) can\nperform better than with global affine epipolar alignment. Yet, when stereo\nfails on a locally aligned tile pair, it is instructive to understand\nwhy. Usually it is because the images are difficult at \nthat location, such as due to very steep terrain, clouds, shadows, etc.\n\nFor a completed ``parallel_stereo`` run which failed in a portion, the\nfirst step is to identify the offending tile directory. For that, open the\nproduced DEM in ``stereo_gui``, and use the instructions at\n:numref:`image_bounds` to find the approximate longitude, latitude,\nand height at the problematic location. \n\nThen run ``stereo_parse`` with the same options as ``parallel_stereo``\nand the flag::\n\n    --tile-at-location '<lon> <lat> <height>'\n\nThis should print on the screen a text like::\n\n    Tile with location: run/run-2048_3072_1024_1024\n\nIf a run failed to complete, find the most recent output tile\ndirectories that were being worked on, based on modification time, and\ninvestigate one of them.\n\nIn either case, given a candidate for a problematic tile, from the log\nfile of ``stereo_corr`` in that tile's directory you can infer the full\ncorrelation command that failed. Re-run it, while appending the option::\n\n    --local-alignment-debug\n\nImages and interest point matches before and after alignment will be\nsaved. Those can be examined as::\n\n    stereo_gui <tile>-left-crop.tif <tile>-right-crop.tif \\\n      <tile>-left-crop__right-crop.match \n\nand::\n\n    stereo_gui <tile>-left-aligned-tile.tif               \\\n      <tile>-right-aligned-tile.tif                       \\\n      <tile>-left-aligned-tile__right-aligned-tile.match \n\n"
  },
  {
    "path": "docs/environment.yml",
    "content": "# conda environment needed to build the docs.\n\nchannels:\n  - conda-forge\n  - defaults\ndependencies:\n  - sphinx\n  - sphinxcontrib-bibtex\n"
  },
  {
    "path": "docs/error_propagation.rst",
    "content": ".. _error_propagation:\n\nError propagation\n=================\n\nAt the triangulation stage, ``parallel_stereo`` can propagate the\nerrors (uncertainties, standard deviations, covariances) from the\ninput cameras, computing the horizontal and vertical standard\ndeviation (stddev) of the uncertainty for each triangulated\npoint. This is enabled with the option ``--propagate-errors``\n(:numref:`stereo-default-error-propagation`).\n\nBundle adjustment can propagate uncertainties as well\n(:numref:`ba_error_propagation`).\n\nThe produced uncertainties can be exported from the point cloud to DEM and/or\nLAS files (:numref:`export_stddev`). \n\nThe input uncertainties\n-----------------------\n\nThe input uncertainties can be either numbers that are passed on the\ncommand line, or, otherwise, for a few camera models, they can be read\nfrom the camera files.\n\nIf the option ``--horizontal-stddev`` is set, with two positive\nnumbers as values, representing the left and right camera stddev of\nposition uncertainty in the local horizontal ground plane having the\ntriangulated point, then these values will be used. The input stddev\nvalues are measured in meters.  This functionality works with any\ncameras supported by ASP.\n\nIf this option is not set, the following strategies are used:\n\n - For Pleiades 1A/1B linescan camera models (:numref:`pleiades`) \n   (but not for NEO, :numref:`pleiades_neo`) the\n   ``ACCURACY_STDV`` field is read from the \"DIM\" XML file for each camera\n   (in the *Absolute Horizontal Accuracy* section of the camera\n   model), and it is used as the horizontal stddev.\n\n - For RPC cameras (:numref:`rpc`), the values ``ERRBIAS`` and ``ERRRAND`` are\n   read, whether set in XML files or as part of metadata that GDAL understands.\n   The square root of sum of squares of these quantities is the input horizontal\n   stddev for a camera.\n\n - For Maxar (DigitalGlobe) linescan cameras (:numref:`dg_tutorial`), \n   the inputs are the satellite position and orientation covariances,\n   read from the ``EPHEMLIST`` and ``ATTLIST`` fields. These are\n   propagated from the satellites to the ground and then through\n   triangulation. \n\nFor datasets with a known CE90 measure, or in general a\n:math:`CE_X` measure, where :math:`X` is between 0% and 100%,\nuse the  ``--horizontal-stddev`` option, with values computed\nusing the formula:\n\n.. math::\n\n     StdDev = CE_X/\\sqrt{-2 \\ln(1-X/100.0)}\n\n(`reference\n<https://en.wikipedia.org/wiki/Circular_error_probable#Conversion>`_).\n\nIn all cases, the error propagation takes into account whether the cameras are\nbundle-adjusted or not (:numref:`bundle_adjust`), and if the images are\nmapprojected (:numref:`mapproj-example`).\n\nProduced uncertainty for triangulated points\n--------------------------------------------\n\nThe triangulation covariance matrix is computed in the local North-East-Down\n(NED) coordinates at each nominal triangulated point, and further decomposed\ninto the horizontal and vertical components (:numref:`produced_covariances`). \n\nThe square root is taken, creating the horizontal and vertical standard\ndeviations, that are saved as the 5th and 6th band in the point cloud\n(\\*-PC.tif file, :numref:`outputfiles`). Running ``gdalinfo``\n(:numref:`gdal_tools`) on the point cloud will show some metadata describing\neach band in that file.\n\nThe computed stddev values are in units of meter.\n\nBundle adjustment\n-----------------\n\nError propagation is also implemented in ``bundle_adjust``\n(:numref:`ba_error_propagation`). In that case, the errors are computed at each\ninterest point, rather than densely.\n\nThe same underlying logic is employed as for stereo.\n\n.. _export_stddev:\n\nExport to DEM and LAS\n---------------------\n\nThe stddev values in the point cloud can then be gridded with ``point2dem``\n(:numref:`point2dem`) with the option ``--propagate-errors``, using the same\nalgorithm as for computing the DEM heights.\n\nExample::\n\n    point2dem                     \\\n      --t_srs <projection string> \\\n      --tr <grid size>            \\\n      --propagate-errors          \\\n      run/run-PC.tif\n\nThis will produce the files ``run/run-HorizontalStdDev.tif`` and\n``run/run-VerticalStdDev.tif`` alongside the output DEM, ``run/run-DEM.tif``.\n\nIn all these files the values are in units of meter.\n\nThe ``point2las`` program (:numref:`point2las`) can export the horizontal and\nvertical stddev values from the point cloud to a LAS file.\n\nImplementation details\n----------------------\n\nNote that propagating the errors subtly changes the behavior of stereo\ntriangulation, and hence also the output DEM. Triangulated points\nare saved with a float precision of 1e-8 meters (rather than the usual\n1e-3 meters or so, :numref:`triangulation_options`), to avoid creating\nstep artifacts later when gridding the rather slowly varying\npropagated errors.\n\nWhen error propagation is enabled, the triangulated point cloud stores\n6 bands instead of the usual 4 (:numref:`outputfiles`), and the LZW\ncompression is somewhat less efficient since more digits of precision\nare stored. The size of the point cloud roughly doubles. This does not\naffect the size of the DEM, but its values and extent may change\nslightly.\n\n.. _uncertainty_vs_triangulation_err:\n\nWhat the produced uncertainties are not\n---------------------------------------\n\nThe horizontal and vertical stddev values created by stereo\ntriangulation and later gridded by ``point2dem`` measure the\nuncertainty of each nominal triangulated point, given the\nuncertainties in the input cameras.\n\nThis is not the discrepancy between this point's location as compared\nto to a known ground truth. If the input cameras are translated by the\nsame amount in the ECEF coordinate system, the triangulated point\nposition can change a lot, but the produced uncertainties will change\nvery little. To estimate and correct a point cloud's geolocation \ninvoke an alignment algorithm (:numref:`pc_align`).\n\nThe produced uncertainties are not a measure of the pointing accuracy\n(:numref:`triangulation_error`). Whether the rays from the cameras\nmeet at the nominal triangulated point perfectly, or their closest\ndistance is, for example, 5 meters, the produced uncertainties around\nthe nominal point will be about the same. See a comparison between\nthese errors in :numref:`grand_mesa_dem_intersection_err` and \n:numref:`horizontal_vertical_error`.\n\nThe pointing accuracy can be improved by using bundle adjustment\n(:numref:`bundle_adjust`) and solving for jitter\n(:numref:`jitter_solve`).\n\nExample\n-------\n\nFor Maxar (DigitalGlobe) linescan cameras::\n\n    parallel_stereo                     \\\n      --alignment-method local_epipolar \\\n      --stereo-algorithm asp_mgm        \\\n      --subpixel-mode 9                 \\\n      -t dg                             \\\n      --propagate-errors                \\\n      left.tif right.tif left.xml right.xml \n      run/run\n      \n   proj=\"+proj=utm +zone=13 +datum=WGS84 +units=m +no_defs\"\n   \n   point2dem --tr 1.6                   \\\n     --t_srs \"$proj\"                    \\\n     --propagate-errors                 \\\n     run/run-PC.tif\n\nThe projection and grid size above are dependent on the dataset. For steep\nslopes, consider using mapprojection (:numref:`mapproj-example`).\n\nAlternatively, the input horizontal stddev values for the cameras\ncan be set as::\n\n   --horizontal-stddev 1.05 1.11\n\nThen these will be used instead. This last approach works for any\norbital camera model supported by ASP (:numref:`examples`).\n\n.. figure:: images/grand_mesa_dem_intersection_err.png\n   :name: grand_mesa_dem_intersection_err\n\n   A hillshaded DEM created with DigitalGlobe WorldView images for\n   Grand Mesa, Colorado (left), and the triangulation error\n   (:numref:`triangulation_error`) in meters (right). The input images were\n   mapprojected (:numref:`mapproj-example`). No bundle adjustment was\n   used. Jitter (:numref:`jitter_solve`) is noticeable.  \n\n.. figure:: images/horizontal_vertical_error.png\n   :name: horizontal_vertical_error\n\n   Produced horizontal and vertical stddev values (left and right) for the\n   same dataset. It can be seen from the scales (units are in meter)\n   and comparing with :numref:`grand_mesa_dem_intersection_err` that these\n   errors vary little overall, and depend more on the geometry\n   of the stereo pair than the underlying terrain. See\n   :numref:`uncertainty_vs_triangulation_err` for a discussion.\n\n.. _produced_covariances:\n\nDefinitions\n-----------\n\nThe vertical variance of a triangulated point is defined as the\nlower-right corner of the 3x3 NED covariance matrix (since x=North,\ny=East, z=Down).\n\nTo find the horizontal variance component, consider the upper-left\n:math:`2 \\times 2` block of that matrix. Geometrically, the\nhorizontal covariances represent an ellipse. The radius of the circle\nwith the same area is found, which is the square root of the product\nof ellipse semiaxes, which is the product of the eigenvalues of this\nsymmetric matrix, or its determinant. So, the horizontal component\nof the covariance is defined as the square root of the upper-left\n:math:`2 \\times 2` bock of the NED covariance matrix.\n\nThe square root is taken to go from variance to stddev.\n\nTheory\n------\n\nAccording to the theory of `propagation of uncertainty\n<https://en.wikipedia.org/wiki/Propagation_of_uncertainty>`_, given a\nfunction :math:`y = f(x)` between multi-dimensional spaces, the\ncovariances of the inputs and outputs are related via\n\n.. math::\n\n  Cov_Y = J Cov_X J^T\n\nHere, :math:`J` is the Jacobian of the function :math:`f` and\n:math:`J^T` is its transpose. It is assumed that the uncertainties are\nsmall enough that this function can be linearized around the nominal\nlocation.\n\nFor this particular application, the input variables are either the\ncoordinates in the local horizontal ground plane having the\ntriangulated point (two real values for each camera), or the satellite\npositions and orientations (quaternions), which are 7 real values for\neach camera. The output is the triangulated point in the local\nNorth-East-Down coordinates.\n\nIf the input uncertainties are stddev values, then these are squared,\ncreating variances, before being propagated (then converted back to\nstddev values at the last step).\n\nThe Jacobian was computed using centered finite\ndifferences, with a step size of 0.01 meters for the position and 1e-6\nfor the (normalized) quaternions. The computation was not particularly\nsensitive to these step sizes. A much smaller position step size is\nnot recommended, since the positions are on the order of 7e6 meters,\n(being measured from planet center) and because double precision\ncomputations have only 16 digits of precision.\n\nValidation for Maxar (DigitalGlobe) linescan cameras\n----------------------------------------------------\n\nThe horizontal stddev values propagated through triangulation for  Maxar\n(DigitalGlobe) linescan cameras are usually on the order of 3 meters.\n\nThe obtained vertical stddev varies very strongly with the convergence\nangle, and is usually, 5-10 meters, and perhaps more for stereo pairs\nwith a convergence angle under 30 degrees.\n\nThe dependence on the convergence angle is very expected. But these\nnumbers appear too large given the ground sample distance of\nDigitalGlobe WorldView cameras. We are very confident that they are\ncorrect. The results are so large is because of the input orientation\ncovariances (the relative contribution of input position and\norientation covariances can be determined with the options\n``--position-covariance-factor`` and\n``--orientation-covariance-factor``).\n\nThe curious user can try the following independent approach to\nvalidate these numbers. The linescan camera files in XML format have\nthe orientations on lines with the ``ATTLIST`` field. The numbers on\nthat line are measurement index, then the quaternions (4 values, in\norder x, y, z, w) and the upper-right half of the 4x4 covariance\nmatrix (10 numbers, stored row-wise).\n\nThe ``w`` variance (the last number), can be, for example, on the\norder of 6.3e-12. Its square root, the standard deviation, which is\n2.5e-6 or so, is the expected variability in the ``w`` component of\nthe quaternion.\n\nFetch and save the Python script `bias_dg_cam.py\n<https://raw.githubusercontent.com/NeoGeographyToolkit/StereoPipeline/master/src/asp/Tools/bias_dg_cam.py>`_. Invoke\nit as::\n\n   python bias_dg_cam.py --position-bias \"0 0 0\" \\\n     --orientation-bias \"0 0 0 2.5e-6\"           \\\n     -i left.xml -o left_bias.xml\n   python bias_dg_cam.py --position-bias \"0 0 0\" \\\n     --orientation-bias \"0 0 0 -2.5e-6\"          \\\n     -i right.xml -o right_bias.xml\n\nThis will bias the positions and quaternions in the camera files by\nthe given amounts, creating ``left_bias.xml`` and\n``right_bias.xml``. Note that values with different sign were used in\nthe two camera files. It is instructive to compare the original and\nproduced camera files side-by-side, and see the effect of using a\ndifferent sign and magnitude for the biases.\n\nThen, ``parallel_stereo`` can be run twice, with different output\nprefixes, first with the original cameras, and then the biased ones,\nin both cases without propagation of errors. Use\n``--left-image-crop-win`` and ``--right-image-crop-win``\n(:numref:`stereo_gui`) to run on small clips only.\n\nThe created DEMs (with nominal and then with biased cameras) can have\ntheir heights compared using the ``geodiff --absolute`` command\n(:numref:`geodiff`). We found a height difference that is very similar\nto the vertical standard deviation produced earlier.\n"
  },
  {
    "path": "docs/examples/apollo15.rst",
    "content": ".. _apollo15_example:\n\nApollo 15 Metric Camera images\n------------------------------\n\nApollo Metric images were all taken at regular intervals, which means\nthat the same ``stereo.default`` can be used for all sequential pairs of\nimages. Apollo Metric images are ideal for stereo processing. They\nproduce consistent, excellent results.\n\nThe scans performed by ASU are sufficiently detailed to exhibit film\ngrain at the highest resolution. The amount of noise at the full\nresolution is not helpful for the correlator, so we recommend\nsubsampling the images by a factor of 4.\n\nCurrently the tools to ingest Apollo TIFFs into ISIS are not available,\nbut these images should soon be released into the PDS for general public\nusage.\n\nAnsgarius C\n~~~~~~~~~~~\n\nAnsgarius C is a small crater on the west edge of the far side of the\nMoon near the equator. It is east of Kapteyn A and B.\n\n.. figure:: ../images/examples/metric/metric_ge_example_combined.png\n   :name: metric_example\n\n   Example output possible with Apollo Metric frames AS15-M-2380 and AS15-M-2381.\n\nCommands\n^^^^^^^^\n\nProcess Apollo TIFF files into ISIS.\n\n::\n\n     ISIS> reduce from=AS15-M-2380.cub to=sub4-AS15-M-2380.cub \\\n             sscale=4 lscale=4\n     ISIS> reduce from=AS15-M-2381.cub to=sub4-AS15-M-2381.cub \\\n             sscale=4 lscale=4\n     ISIS> spiceinit from=sub4-AS15-M-2380.cub\n     ISIS> spiceinit from=sub4-AS15-M-2381.cub\n     ISIS> parallel_stereo sub4-AS15-M-2380.cub sub4-AS15-M-2381.cub \\\n             result/output\n\nSee :numref:`nextsteps` for a discussion about various speed-vs-quality choices.\n"
  },
  {
    "path": "docs/examples/aster.rst",
    "content": ".. _aster:\n\nASTER\n-----\n\n`Advanced Spaceborne Thermal Emission and Reflection Radiometer\n<https://en.wikipedia.org/wiki/Advanced_Spaceborne_Thermal_Emission_and_Reflection_Radiometer>`_ (ASTER)\nis a Japanese instrument. ASP can process ASTER Level 1A VNIR images. These are\nacquired with a stereo rig consisting of two cameras, pointing nadir and back. The\norbit is sun-synchronous, at an elevation of 705 km. The ground sample distance is 15\nmeters/pixel. \n\nSee a `ready-made ASTER example\n<https://github.com/NeoGeographyToolkit/StereoPipelineSolvedExamples/releases/tag/ASTER>`_.\nIt has the input images and cameras, ASP outputs, and instructions for how to\nrun it. Also see a `workbook with illustrations\n<https://nbviewer.org/github/uw-cryo/asp_plot/blob/main/notebooks/ASTER/aster_with_mapprojection.ipynb>`_.\n    \nASP can correct for the jitter in these cameras (:numref:`jitter_aster`).\n\n.. _aster_fetch:\n\nFetching the data\n^^^^^^^^^^^^^^^^^\n \nASTER satellite images are freely available from: \n\n  https://search.earthdata.nasa.gov/search\n\nWhen visiting that page, select a region on the map, search for ``AST_L1A,`` and\nchoose ``ASTER L1A Reconstructed Unprocessed Instrument Data V004``. \n\nIf too many results are shown, narrow down the choices by using a range in time\nor deselecting unwanted items manually. Examining the data thumbnails is\nhelpful, to exclude those with clouds, etc. Then click to download.\n\nAs of end of 2025, the products can only be downloaded in the HDF-EOS format,\nwhich requires an ASP build from 2026-01 or later (:numref:`release`).\n\nNote that some datasets may not contain the bands 3B and 3N needed for stereo. \n\nThe EarthData web site also offers pre-existing ASTER Global DEM (GDEM)\nproducts. \n\nData preparation\n^^^^^^^^^^^^^^^^\n\nIn this example we will use the dataset::\n\n  AST_L1A_00404012022185436_20250920182851.hdf\n  \naround the San Luis Reservoir in Northern California. \n\nThis dataset contains all image data and metadata in single .hdf file. It can be\nextracted with ``aster2asp`` (:numref:`aster2asp`) as::\n\n aster2asp input.hdf -o out\n \nOlder V003 datasets were provided as zipped files containing data directories\nwith TIFF images and metadata as text files. In that case, after the data is\nextracted, the preparation command is::\n\n     aster2asp dataDir -o out\n\nIn either case, four files would be produced, named::\n\n     out-Band3N.tif out-Band3B.tif out-Band3N.xml out-Band3B.xml\n\nWe refer again to the tool's documentation page regarding details of how\nthese files were created.\n\nOpen the images in ``stereo_gui`` (:numref:`stereo_gui`) as::\n\n    stereo_gui out-Band3N.tif out-Band3B.tif \n\nand ensure that they are of good quality, or else get another dataset. \n\nStereo with raw images\n^^^^^^^^^^^^^^^^^^^^^^\n\nAs of build 2026/3 (:numref:`release`), ASTER data are always processed with the\nCSM model (:numref:`csm`).\n\nRun ``parallel_stereo`` (:numref:`parallel_stereo`)::\n\n     parallel_stereo -t aster         \\\n       --stereo-algorithm asp_mgm     \\\n       --subpixel-mode 9              \\\n        out-Band3N.tif out-Band3B.tif \\\n        out-Band3N.xml out-Band3B.xml \\\n        out_stereo/run\n\nThis uses the ``asp_mgm`` algorithm, which is the most accurate algorithm ASP\nhas. One can also try the option ``--subpixel-mode 2`` which will be much slower\nbut produce better results.\n\nSee :numref:`nextsteps` for a discussion about various stereo algorithms and\nspeed-vs-quality choices.\n\nThis is followed by DEM creation with ``point2dem`` (:numref:`point2dem`)::\n\n     point2dem -r earth --auto-proj-center \\\n       out_stereo/run-PC.tif\n\nThis will create a DEM named ``out_stereo/run-DEM.tif`` using an auto-guessed\nlocal UTM or polar stereographic projection (:numref:`point2dem_proj`), with an\nauto-guessed resolution (about 15 m / pixel, the image ground sample distance).\n\nVisualize the DEM with ``stereo_gui`` (:numref:`stereo_gui`)::\n\n    stereo_gui --hillshade out_stereo/run-DEM.tif\n\nStereo with mapprojected images\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nTo improve the results for steep terrain, one may consider doing stereo as\nbefore, followed by mapprojection onto a coarser and smoother version of the\nobtained DEM, and then redoing stereo with mapprojected images (per the\nsuggestions in :numref:`mapproj-example`).\n\nInitial stereo::\n\n    parallel_stereo -t aster         \\\n      --stereo-algorithm asp_mgm     \\\n      --subpixel-mode 9              \\\n       out-Band3N.tif out-Band3B.tif \\\n       out-Band3N.xml out-Band3B.xml \\\n       out_stereo/run\n\nCreate a low-resolution smooth DEM at 200 meters/pixel::\n\n    point2dem -r earth --auto-proj-center \\\n      --tr 200 out_stereo/run-PC.tif      \\\n      -o out_stereo/run-200m\n\nMapproject onto this DEM at 15 meters/pixel::\n\n    mapproject --tr 15               \\\n      out_stereo/run-200m-DEM.tif    \\\n      out-Band3N.tif out-Band3N.xml out-Band3N_proj.tif\n    mapproject --tr 15               \\\n      out_stereo/run-200m-DEM.tif    \\\n      out-Band3B.tif out-Band3B.xml out-Band3B_proj.tif\n     \nRun parallel_stereo with the mapprojected images::\n\n    parallel_stereo -t aster                  \\\n      --stereo-algorithm asp_mgm              \\\n      --subpixel-mode 9                       \\\n      out-Band3N_proj.tif out-Band3B_proj.tif \\\n      out-Band3N.xml out-Band3B.xml           \\\n      out_stereo_proj/run                     \\\n      out_stereo/run-200m-DEM.tif\n\nCreate the final DEM::\n\n    point2dem -r earth --auto-proj-center \\\n      out_stereo_proj/run-PC.tif\n\nIt is very important to use the same resolution (option ``--tr``) for both\nimages when mapprojecting. That helps making the resulting images more similar\nand reduces the processing time (:numref:`mapproj-res`). \n\nOne could consider mapprojecting at a higher resolution, for example, at 10\nmeters/pixel.\n\nIt is suggested to also create and inspect the triangulation error image\n(:numref:`point2dem`). If it is large (comparable to ground sample distance),\nthe cameras should be bundle-adjusted first (:numref:`bundle_adjust`).\n\nSee :numref:`aster_dem_ortho_error` for an illustration.\n\nStereo with ortho-ready L1B images\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nASTER L1B images are also available. These are produced by projecting L1A images\nonto the WGS84 ellipsoid at zero elevation. ASTER L1B images can be processed\nwith ASP using the workflow for ortho-ready images (:numref:`mapproj_ortho`).\n\nInvoke ``parallel_stereo`` with the L1B images (already mapprojected), L1A\ncameras, output prefix, and the option ``--ortho-heights 0 0``. The results are\nnearly the same as obtained with L1A images.\n\n.. _aster_csm:\n\nThe CSM model\n^^^^^^^^^^^^^\n\nAn ASTER camera model consists of a sequence of satellite position samples and a\nset of camera directions (sight vectors, in world coordinates), sampled at about\na dozen image rows and columns.\n\nASP fits a CSM linescan model (:numref:`csm`) on-the-fly to the ASTER sight\nvectors and satellite positions. Instead of a set of directions on a grid, there\nis one camera orientation at each satellite position sample. This enables\nsolving for jitter in ASTER cameras (:numref:`jitter_aster`).\n\nThe CSM model is produced by optimizing the optical center, focal length, and\ncamera orientations, to fit best the provided ASTER sight vectors. No ground\ninformation is used, or stereo pair knowledge. The satellite positions do not\nchange.\n\nThe bundle adjustment program (:numref:`bundle_adjust`) will optimize and save\nthe produced CSM models (:numref:`csm_state`). To save the best-fit CSM models\nwith no further refinement, invoke this tool with zero iterations.\n\nThe CSM model may be further refined by tying together multiple datasets and\nusing ground constraints (:numref:`kaguya_ba`).\n\n.. _aster_rpc:\n\nUsing the RPC model\n^^^^^^^^^^^^^^^^^^^\n\nASTER XML files also contain RPC coefficients. These can be used with\n``-t rpc`` (:numref:`rpc`) instead of ``-t aster``. The RPC model is an\napproximation and less accurate than the exact linescan model described above.\nUse the exact model (``-t aster``) for best results.\n"
  },
  {
    "path": "docs/examples/bathy.rst",
    "content": ".. include:: <isonum.txt>\n\n.. _bathy_intro:\n\nShallow-water bathymetry\n------------------------\n\nASP supports creation of terrain models where parts of the terrain are\nunder water. Assuming that the water is shallow, still, clear, with\nsufficient texture to match at the water bottom between the left and\nright images, the rays emanating from the cameras and converging at\nthose features will be bent according to Snell's law at the water\ninterface, hence determining correctly the position of underwater\nterrain.\n\nThe bathymetry module is evaluated in :cite:`palaseanu2021bathy` and\n:cite:`palaseanu2023`.\n\n\nSoftware considerations\n~~~~~~~~~~~~~~~~~~~~~~~\n\nASP supports the bathymetry mode only with the ``dg``, ``rpc``, and\n``nadirpinhole`` sessions, so with Digital Globe linescan cameras, RPC cameras,\nand pinhole cameras (:numref:`bathy_non_dg`), all for Earth, with the WGS84\ndatum. Both raw and mapprojected images can be used (:numref:`bathy_map`), with\nor without bundle adjustment or alignment (:numref:`bathy_ba_align`).\n\nPhysics considerations\n~~~~~~~~~~~~~~~~~~~~~~\n\nShallow water does not appear equally transparent at all wavelengths,\nwhich will affect the quality of the results. While the process we\noutline below will work, in principle, with any data, we will focus on\nstereo with the G band (green, stored at band 3) of Digital Globe\nmultispectral imagery, and we will use the N band (near-infrared 1,\nstored at band 7), to determine a mask of the ground vs water.\n\nThese or any other bands can be extracted from a multi-band image as follows:\n\n::\n     \n     b=3\n     gdal_translate -b ${b} -co compress=lzw -co TILED=yes \\\n       -co BLOCKXSIZE=256 -co BLOCKYSIZE=256               \\\n       input.TIF input_b${b}.tif\n\nThe extra options, in addition to ``-b ${b}`` to extract a given band,\nare needed to create a compressed and tiled output image, which helps\nwith the performance of ASP later.\n\n.. _bathy_thresh:\n\nComputation of the water-land threshold\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nIn order to distinguish points on land from those under water, a\nmask needs to be computed for each of the left and right input images,\nwith the masks having the same dimensions as those images.\n\nA simple way of creating such a mask is to first determine a threshold\nsuch that pixels at or below threshold are under water, and those\nabove threshold are on land.\n\nIt was experimentally found that it is best to use band 7 (near\ninfrared) for Digital Globe multispectral images to find this water\nthreshold, as in them the water appears universally darker than the\nland.\n\nOther methods are available for such thresholding and masking. See \n:numref:`bathy_water_masking`.\n\nASP provides two tools for finding the threshold in automated way\nbased on histogram analysis. One is ``bathy_threshold_calc.py``\n(:numref:`bathy_threshold_calc`), and the second one is\n``otsu_threshold`` (:numref:`otsu_threshold`). This last tool produces\na somewhat higher threshold compared to the other one, but in practice\nthe results with both approaches are very similar.\n\nThe ``bathy_threshold_calc.py`` program works based on the observation\nthat, since in such an image the water appears darker than the land,\nthen in a histogram of the pixels in the image, the water and land\nappear as two noticeable peaks, with a good value for the threshold\nthen being the image value at the bottom of the valley between those\npeaks.\n\nFor robustness to noise, this histogram is approximated by a\nkernel-density estimate (``KDE``) using Gaussian kernels. It is very\nimportant to note that even then this tool may return the wrong\nminimum, which it assumes to be the first one.\n\nTherefore, this tool plots the histogram, its kernel density estimate,\nthe positions of the minima, and prints their locations on screen. The\nuser is responsible for validating visually where the most appropriate\nposition of the minimum is (along the horizontal axis).\n \nThe kernel-density estimate calculation is very time-consuming for\nlarge images, hence it is suggested to pass to the tool the number of\nsamples to use (it will pick the samples uniformly in the image). For\nexample, if a million samples are used, the calculation should take\na few minutes to complete.\n\nThis program can be invoked for each of the left and right images as follows:\n\n::\n\n    ~/miniconda3/envs/bathy/bin/python $(which bathy_threshold_calc.py) \\\n      --image left.tif --num-samples 1000000\n\nHere it is assumed that ASP's ``bin`` directory is in the path. The ``bathy``\nconda environment should be installed as described in\n:numref:`bathy_threshold_calc`.\n\nIt is suggested to experiment a bit with the number of samples, using,\nfor example, double of this amount, and see the difference. Normally\nthe outcome should be rather similar.\n\nIt will produce the following output:\n\n::\n\n    Image file is left.tif\n    Number of samples is 1000000\n    Number of image rows and columns: 7276, 8820\n    Picking a uniform sample of dimensions 908, 1101\n    Please be patient. It may take several minutes to find the answer.\n    Positions of the minima:  [ 155.18918919  802.7027027 ... ]\n    Suggested threshold is the position of the first minimum:  155.1891891891892\n    Please verify with the graph. There is a chance the second minimum may work better.\n    Elapsed time in seconds: 275.2\n\n.. figure:: ../images/examples/bathy/bathy_threshold_calc.png\n   :name: bathy_water_threshold_example\n\n   Example of the graph plotted by bathy_threshold_calc.py\n\nOnce the threshold is found, ``stereo_gui`` can be used to visualize\nthe regions at or below threshold (:numref:`thresh`).\n\n.. _bathy_mask_creation:\n\nCreation of masks based on the threshold\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nHaving determined the water-land threshold, the left and right image\nmasks will be found from the corresponding images as follows:\n\n::\n    \n    left_thresh=155.1891891891892 \n    image_calc -c \"gt(var_0, $left_thresh, 1, 0)\" -d float32 \\\n      left_b7.tif -o left_mask.tif\n\nHere, ``left_b7.tif`` is suggestive of the fact that the band 7 of\nWorldView multispectral imagery was used.\n\nIt is important to remember to use the right image threshold when repeating\nthis process for the right image. \n\nThe ``image_calc`` tool (:numref:`image_calc`) produces a binary mask, with 1\nfor land (values strictly larger than the threshold) and 0 for water (values at\nor below the threshold).\n\nIf using a spectral index where water has higher values than land\n(like NDWI), the polarity is reversed (use the ``lt`` operator instead\nof ``gt``). See :numref:`bathy_water_masking` for details.\n\nLater, when doing stereo, if, based on the masks, a pixel in the left\nimage is under water, while the corresponding pixel in the right image\nis not, for noise or other reasons, that pixel pair will be declared\nto be on land and hence no bathymetry correction will take place for\nthis pair. Hence, some inspection and potentially cleanup of the\nmasks may be necessary.\n\n.. _water_surface:\n\nDetermination of the water surface\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nIn order to run stereo and properly triangulate the rays which \nmay intersect under water, it is necessary to determine\nthe water surface. Since for images of large extent the Earth\ncurvature will be important, this surface will be found as a plane\nin a local stereographic projection.\n\nThe procedure for this is described in :numref:`bathy_plane_calc`.\n\nStereo with bathymetry correction\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nHaving these in place, stereo can then happen as follows:\n\n::\n\n    parallel_stereo -t dg               \\\n      left.tif right.tif                \\\n      left.xml right.xml                \\\n      --left-bathy-mask left_mask.tif   \\\n      --right-bathy-mask right_mask.tif \\\n      --stereo-algorithm asp_mgm        \\\n      --refraction-index 1.34           \\\n      --bathy-plane bathy_plane.txt     \\\n      run_bathy/run \n \nHere we specified the two masks, the water index of refraction, and the water\nplane found before. Pixels classified as water must have non-positive value\nor be no-data in the mask, while land pixels must have positive value.\n\nSee :numref:`nextsteps` for a discussion about various\nspeed-vs-quality choices.\n\nThis is followed by creating a DEM (:numref:`point2dem`)::\n\n    point2dem run_bathy/run-PC.tif --orthoimage run_bathy/run-L.tif \n\nThe water refraction index was set 1.34 :cite:`jerlov1976marine`. Alternatively,\none could use 1.333 :cite:`thormahlen1985refractive,harvey1998calibration`, or a\nmore precise value that depends on wavelength, temperature, and if having\nsaltwater or freshwater (`Parrish (2020)\n<http://research.engr.oregonstate.edu/parrish/index-refraction-seawater-and-freshwater-function-wavelength-and-temperature>`_,\n:cite:`austin1976index,mobley1995optical`).  For example, using the equation and\ncoefficients found in Parrish (2020), and the green wavelength for saltwater,\nthe water refraction index is 1.340125 when the water temperature is 27 |deg| C\n(this was applied to a Florida Keys test site for the month of May). \n\nThe refraction index can be computed with the :ref:`refr_index` program.\n\nThe obtained point cloud will have both triangulated points above water,\nso with no correction, and below water, with the correction applied.\nIf desired to have only one of the two, call the ``parallel_stereo`` command\nwith the option ``--output-cloud-type`` with the value ``topo``\nor ``bathy`` respectively (the default for this option is ``all``).\n\nThe bathymetry correction happens at the triangulation stage\n(though the necessary transformations on the bathymetry masks are done\nin pre-processing). Hence, after a stereo run finished, it is only\nnecessary to re-run the ``stereo_tri`` step if desired to apply this\ncorrection or not, or if to change the value of\n``--output-cloud-type``.\n\nAs in usual invocations of stereo, the input images may be\nmapprojected, and then a DEM is expected, stereo may happen only in\ncertain regions as chosen in the GUI, bundle adjustment may be used,\nthe output point cloud may be converted to LAS, etc. \n\n.. _bathy_validation:\n\nPerforming sanity checks on a bathy run\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe results produced with the bathymetry mode for stereo need careful\nvalidation. Here we will show how to examine if the water-land\nboundary and corresponding water surface were found correctly.\n\nBefore that, it is important to note that such runs can take a long\ntime, and one should try to first perform a bathymetry experiment\nin a carefully chosen small area by running ``stereo_gui`` instead of\n``parallel_stereo``, while keeping the rest of the bathy options as\nabove, and then selecting clips in the left and right images with the\nmouse to run ``parallel_stereo`` on. See :numref:`stereo_gui` for more\ninfo.\n\nIf the ``bathy_plane_calc`` is run with the option::\n\n    --output-inlier-shapefile inliers.shp\n\nit will produce a shapefile for the inliers.\n\nCreate an orthoimage from the aligned bathy mask, for example,\nsuch as::\n\n    point2dem --no-dem run_bathy/run-PC.tif                \\\n      --orthoimage run_bathy/run-L_aligned_bathy_mask.tif  \\\n      -o run_bathy/run-bathy_mask\n\nThis should create ``run_bathy/run-bathy_mask-DRG.tif``.\n\nThis should be overlaid in ``stereo_gui`` on top of the inliers\nfrom the bathy plane calculation, as::\n\n    stereo_gui --single-window --use-georef inliers.shp    \\\n      run_bathy/run-bathy_mask-DRG.tif\n\nThe inliers should be well-distributed on the land-water interface\nas shown by the mask.\n\nTo verify that the water surface was found correctly, one can\ncreate a DEM with no bathymetry correction, subtract from that one the\nDEM with bathymetry correction, and colorize the result. This can be\ndone by redoing the triangulation in the previous run, this time with\nno bathy information::\n\n    mv run_bathy/run-DEM.tif run_bathy/run-yesbathy-DEM.tif\n    parallel_stereo -t dg left.tif right.tif left.xml right.xml \\\n      --stereo-algorithm asp_mgm                                \\\n      --entry-point 5 run_bathy/run \n    point2dem run_bathy/run-PC.tif -o run_bathy/run-nobathy\n    \nNote that we started by renaming the bathy DEM. The result of these\ncommands will be ``run_bathy/run-nobathy-DEM.tif``. The differencing\nand colorizing is done as::\n\n    geodiff run_bathy/run-nobathy-DEM.tif             \\\n      run_bathy/run-yesbathy-DEM.tif -o run_bathy/run\n    colormap --min 0 --max 1 run_bathy/run-diff.tif\n\nThe obtained file, ``run_bathy/run-diff_CMAP.tif``, can be added to\nthe ``stereo_gui`` command from above. Colors hotter than blue will be\nsuggestive of how much the depth elevation changed as result of\nbathymetry correction. It is hoped that no changes will be seen on\nland, and that the inliers bound well the region where change of depth\nhappened.\n\n.. _bathy_ba_align:\n\nBundle adjustment and alignment\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nIt is important to note that we did not use bundle adjustment\n(:numref:`bundle_adjust`) or ``pc_align`` (:numref:`pc_align`) for\nalignment. That is possible, but then one has to ensure that all the\ndata are kept consistent under such operations.\n\nIn particular, running bundle adjustment on a PAN image pair, and then\non a corresponding multispectral band pair, will result in DEMs which\nare no longer aligned either to each other, or to their versions\nbefore bundle adjustment. The cameras can be prevented by moving too\nfar if ``bundle_adjust`` is called with, for example, ``--tri-weight\n0.1``, or some other comparable value, to constrain the triangulated\npoints. Yet, by its very nature, this program changes the positions\nand orientations of the cameras, and therefore the coordinate\nsystem. And note that a very high camera weight may interfere with the\nconvergence of bundle adjustment.\n\nIt is suggested to use these tools only if a trusted reference dataset\nexists, and then the produced DEMs should be aligned to that dataset.\n\nASP build 2026-01 or newer (:numref:`release`) supports modeling bathymetry\nduring bundle adjustment (:numref:`ba_bathy`).\n\nOnly the \"topo\" component of a DEM obtained with ASP should be used\nfor alignment (see ``--output-cloud-type``), that is, the part above\nwater, as the part under water can be quite variable given the water\nlevel. Here's an example for creating the \"topo\" DEM, just the\ntriangulation stage processing needs modification::\n\n    parallel_stereo -t dg left.tif right.tif left.xml right.xml \\\n      --stereo-algorithm asp_mgm                                \\\n      <other options>                                           \\\n      --entry-point 5 --output-cloud-type topo                  \\\n        run_bathy/run\n   point2dem run_bathy/run-PC.tif -o run_bathy/run-topo\n\nwhich will create ``run_bathy/run-topo-DEM.tif``.\n\nThen, after the \"topo\" DEM is aligned, the alignment transform can be\napplied to the full DEM (obtained at triangulation stage with\n``--output-cloud-type all``), as detailed in :numref:`prevtrans`. The\ninput cameras can be aligned using the same transform\n(:numref:`ba_pc_align`).\n\nWhen the water surface is determined using a DEM, a mask of the image\nportion above water, and corresponding camera, and the cameras have\nbeen bundle-adjusted or aligned, the option ``--bundle-adjust-prefix``\nmust be used with ``bathy_plane_calc`` (see\n:numref:`bathy_plane_raw_img`).\n\nValidation of alignment\n~~~~~~~~~~~~~~~~~~~~~~~\n\nIt is very strongly suggested to use visual inspection in\n``stereo_gui`` and the ``geodiff`` and ``colormap`` tools for\ndifferencing DEMs to ensure DEMs that are meant to be aligned have\nsmall differences. Since bathymetry modeling can measure only very\nshallow water depths, any misalignment can result in big errors in\nfinal results.\n\nIf DEMs have parts under water and it is desired to remove those for\nthe purpose of alignment, one can take advantage of the fact that the\nwater height is roughly horizontal. Hence, a command like::\n\n    height=-21.2\n    image_calc -c \"max($height, var_0)\" -d float32 \\\n      --output-nodata-value $height                \\\n      dem.tif -o topo_dem.tif\n\nwill eliminate all heights under -21.2 meters (relative to the\ndatum ellipsoid).\n\nBathymetry with changing water level\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nIf the left and right images were acquired at different times,\nthe water level may be different among the two, for example because\nof the tide. Then, ``bathy_plane_calc`` (:numref:`bathy_plane_calc`) \ncan be used independently for the left and right images, obtaining\ntwo such surfaces. These can be passed to ASP as follows::\n\n    parallel_stereo --bathy-plane \"left_plane.txt right_plane.txt\" \\\n      --stereo-algorithm asp_mgm                                   \\\n      <other options>\n \nThe computation will go as before until the triangulation stage.\nThere, the rays emanating from the cameras will bend when meeting the\nwater at different elevations given by these planes, and their\nintersection may happen in three possible regimes (above both planes,\nin between them, or below both of them).\n\nCare must be taken when doing stereo with images acquired at a different\ntimes as the illumination may be too different. A good convergence\nangle is also expected (:numref:`stereo_pairs`).\n\n.. _bathy_reuse_run:\n\nHow to reuse most of a run\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nStereo can take a long time, and the results can have a large size on\ndisk. It is possible to reuse most of such a run, using the option\n``--prev-run-prefix``, if cameras or camera adjustments (option\n``--bundle-adjust-prefix``) get added, removed, or change, if the\nwater surface (``--bathy-plane``) or index of refraction change, or if\nthe previous run did not do bathy modeling but the new run does (hence\nthe options ``--left-bathy-mask`` and ``--right-bathy-mask`` got\nadded).\n\nOne must not change ``--left-image-crop-win`` and\n``--right-image-crop-win`` in the meantime, if used, as that may\ninvalidate the intermediate files we want to reuse, nor the input\nimages. If the previous run did employ bathy masks, and it is desired\nto change them (rather than add them while they were not there\nbefore), run the ``touch`` command on the new bathy masks, to give\nthe software a hint that the alignment of such masks should be redone.\n\nAs an example, consider a run with no bathymetry modeling::\n\n    parallel_stereo -t dg left.tif right.tif left.xml right.xml \\\n      --stereo-algorithm asp_mgm                                \\\n      run_nobathy/run \n \nA second run, with output prefix ``run_bathy/run``, can be started\ndirectly at the triangulation stage while reusing the earlier stages\nfrom the other run as::\n\n    parallel_stereo -t dg left.tif right.tif left.xml right.xml         \\\n      --stereo-algorithm asp_mgm                                        \\\n      --left-bathy-mask left_mask.tif --right-bathy-mask right_mask.tif \\\n      --refraction-index 1.34 --bathy-plane bathy_plane.txt             \\\n      --bundle-adjust-prefix ba/run run_yesbathy/run                    \\\n      --prev-run-prefix run_nobathy/run\n\nThe explanation behind the shortcut employed above is that the precise\ncameras and the bathy info are fully used only at the triangulation\nstage. That because the preprocessing step (step 0), mostly does\nalignment, for which some general knowledge of the cameras and bathy\ninformation is sufficient, and other steps, before triangulation, work\nprimarily on images. This option works by making symbolic links \nto files created at previous stages of stereo which are needed at \ntriangulation.\n\nNote that if the cameras changed, the user must recompute the bathy\nplanes first, using the updated cameras. The ``bathy_plane_calc`` tool\nwhich is used for that can take into account the updated cameras via\nthe ``--bundle-adjust-prefix`` option passed to it.\n\nIf the software notices that the current run invoked with ``--prev-run-prefix``\nemploys bathy masks, unlike that previous run, or that the modification time of\nthe bathy masks passed in is newer than of files in that run, it will ingest and\nalign the new masks before performing triangulation.\n\nIf the cameras change notably, it may be suggested to redo the run from scratch.\n\n.. _bathy_map:\n\nBathymetry correction with mapprojected images\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nMapprojecting the input images can improve the results on steep slopes\n(:numref:`mapproj-example`). While that may not be a big concern in\nbathymetry applications, this section nevertheless illustrates how\nstereo with shallow water can be done with mapprojection.\n\nGiven an external DEM, the left and right images can be mapprojected\nonto this DEM, for example as:\n\n::\n\n  mapproject external_dem.tif --tr gridSize \\\n    left.tif left.xml left_map.tif\n\nand the same for the right image. The same ground sample distance\n(resolution) must be used for left and right images, which should be\nappropriately chosen depending on the data (:numref:`mapproj-res`).\n\n\nOne should mapproject the same way the left and right band 7 Digital\nGlobe multispectral images (if applicable), obtaining two images,\n``left_map_b7.tif`` and ``right_map_b7.tif``. These two can be used to\nfind the masks, as earlier:\n\n::\n\n    left_thresh=155.1891891891892 \n    image_calc -c \"max($left_thresh, var_0)\" \\\n      --output-nodata-value $left_thresh     \\\n      left_map_b7.tif -o left_map_mask.tif\n\n(and the same for the right image.)\n\nThe threshold determined with the original non-mapprojected images\nshould still work, and the same water plane can be used.\n\nThen, stereo happens as above, with the only differences being the\naddition of the external DEM and the new names for the images and the\nmasks:\n\n:: \n\n    parallel_stereo -t dg left_map.tif right_map.tif   \\\n      left.xml right.xml                               \\\n      --stereo-algorithm asp_mgm                       \\\n      --left-bathy-mask left_map_mask.tif              \\\n      --right-bathy-mask right_map_mask.tif            \\\n      --refraction-index 1.34                          \\\n      --bathy-plane bathy_plane.txt                    \\\n      run_map/run external_dem.tif                       \n\n\nUsing Digital Globe PAN images\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe bathymetry mode can be used with Digital Globe PAN images as well,\nthough likely the water bottom may not be as transparent in this case\nas for the Green band.\n\nYet, if desired to do so, a modification is necessary if the mask\nfor pixels above water is obtained not from the PAN image itself,\nbut from a band of the corresponding multispectral image,\nbecause those are acquired with different sensors. \n\nStarting with a multispectral image mask, one has to first increase\nits resolution by a factor of 4 to make it comparable to the PAN\nimage, then crop about 50 columns on the left, and further crop or\nextend the scaled mask to match the PAN image dimensions.\n\nASP provides a tool for doing this, which can be called as::\n\n    scale_bathy_mask.py ms_mask.tif pan_image.tif output_pan_mask.tif\n\nAny warnings about ``srcwin ... falls partially outside raster\nextent`` should be ignored. GDAL will correctly pad the scaled mask\nwith no-data values if it has to grow it to match the PAN image.\n\nTo verify that the PAN image and obtained scaled PAN mask agree,\noverlay them in ``stereo_gui``, by choosing from the top menu the\noption ``View->Single window``.\n\nIt is not clear if the number of columns to remove on the left should\nbe 50 or 48 pixels. It appears that 50 pixels works better for WV03\nwhile 48 pixels may be appropriate for WV02. These were observed\nto result in a smaller shift among these images. The default is 50.\nIf desired to experiment with another amount, pass that one\nas an additional argument to the tool, after the output PAN mask.\n\n.. _bathy_non_dg:\n\nUsing non-Digital Globe images\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nStereo with bathymetry was tested with RPC cameras. In fact, the\nabove examples can be re-run by just replacing ``dg`` with ``rpc`` for\nthe ``-t`` option. (It is suggested that the shoreline shapefile and\nthe water plane be redone for the RPC case. It is expected that the\nresults will change to a certain extent.)\n\nExperiments were also done with pinhole cameras (using the\n``nadirpinhole`` session) with both raw and mapprojected images, and\nusing the alignment methods 'epipolar', 'affineepipolar',\n'homography', and 'none', giving plausible results.\n\nEffect of bathymetry correction on the output DEM\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nIt is instructive to compare the DEMs with and without the bathymetry\ncorrection.\n\nThe bathymetry correction results in the points in the output\ntriangulated cloud being pushed \"down\", as the rays emanating from the\ncameras become \"steeper\" after meeting the water.\n\nYet, a DEM is obtained by binning and doing weighted averaging of the\npoints in the cloud. It can happen that with the bathymetry\ncorrection on, a point may end up in a different bin than with it off,\nwith the result being that a handful of heights in the\nbathymetry-corrected DEM can be slightly above the same heights in the\nDEM without the correction, which is counter-intuitive.\n\nThis however will happen only close to the water-land interface and is\nan expected gridding artifact. (A different DEM grid size may result\nin the artifacts changing location and magnitude.)\n"
  },
  {
    "path": "docs/examples/cassini.rst",
    "content": ".. _cassini_example:\n\nCassini ISS NAC\n---------------\n\nThis is a proof of concept showing the strength of building the Stereo\nPipeline on top of ISIS. Support for processing ISS NAC stereo pairs was\nnot a goal during our design of the software, but the fact that a camera\nmodel exists in ISIS means that it too can be processed by the Stereo\nPipeline.\n\nIdentifying stereo pairs from spacecraft that do not orbit their target\nis a challenge. We have found that one usually has to settle with images\nthat are not ideal: different lighting, little perspective change, and\nlittle or no stereo parallax. So far we have had little success with\nCassini's data, but nonetheless we provide this example as a potential\nstarting point.\n\nRhea\n~~~~\n\nRhea is the second largest moon of Saturn and is roughly a third the\nsize of our own Moon. This example shows, at the top right of both\nimages, a giant impact basin named Tirawa that is 220 miles across. The\nbright white area south of Tirawa is ejecta from a new crater. The lack\nof texture in this area poses a challenge for our correlator. The\nresults are just barely useful: the Tirawa impact can barely be made out\nin the 3D data while the new crater and ejecta become only noise.\n\n.. figure:: ../images/examples/cassini/cassini_rhea_quad.png\n   :name: cassini-example\n\n   Example output of what is possible with Cassini's ISS NAC.  Upper left:\n   original left image.  Upper right: original right image.  Lower left: \n   mapprojected left image.  Lower right: 3D Rendering of the point cloud.\n\nCommands\n^^^^^^^^\n\nDownload the N1511700120_1.IMG and W1567133629_1.IMG images and their\nlabel (.LBL) files from the PDS.\n\n::\n\n     ISIS> ciss2isis f=N1511700120_1.LBL t=N1511700120_1.cub\n     ISIS> ciss2isis f=W1567133629_1.LBL t=W1567133629_1.cub\n     ISIS> cisscal from=N1511700120_1.cub to=N1511700120_1.lev1.cub\n     ISIS> cisscal from=W1567133629_1.cub to=W1567133629_1.lev1.cub\n     ISIS> fillgap from=W1567133629_1.lev1.cub to=W1567133629_1.fill.cub\n\n(Note the optional ``fillgap`` command above.)\n                                                                        \n::\n\n     ISIS> cubenorm from=N1511700120_1.lev1.cub to=N1511700120_1.norm.cub\n     ISIS> cubenorm from=W1567133629_1.fill.cub to=W1567133629_1.norm.cub\n     ISIS> spiceinit from=N1511700120_1.norm.cub\n     ISIS> spiceinit from=W1567133629_1.norm.cub\n     ISIS> cam2map from=N1511700120_1.norm.cub to=N1511700120_1.map.cub\n     ISIS> cam2map from=W1567133629_1.norm.cub map=N1511700120_1.map.cub \\\n     ISIS>   to=W1567133629_1.map.cub matchmap=true\n     ISIS> parallel_stereo N1511700120_1.map.equ.cub                     \\\n             W1567133629_1.map.equ.cub result/rhea\n\nSee :numref:`nextsteps` for a discussion about various speed-vs-quality choices.\nAlso consider the following modifications to ``stereo.default``::\n\n       ### PREPROCESSING\n       alignment-method none\n       force-use-entire-range\n       individually-normalize\n\n       ### CORRELATION\n       prefilter-mode 2\n       prefilter-kernel-width 1.5\n\n       cost-mode 2\n\n       corr-kernel 25 25\n       corr-search -55 -2 -5 10\n\n       subpixel-mode 3\n       subpixel-kernel 21 21\n\n       ### FILTERING\n       rm-half-kernel 5 5\n       rm-min-matches 60 # Units = percent\n       rm-threshold 3\n       rm-cleanup-passes 1\n"
  },
  {
    "path": "docs/examples/chandrayaan2.rst",
    "content": ".. _chandrayaan2:\n\nChandrayaan-2 lunar orbiter\n---------------------------\n\nThe example here shows how to create a 3D terrain model with `Chandrayaan-2 lunar\norbiter <https://en.wikipedia.org/wiki/Chandrayaan-2>`_ data. We will work with\nthe *Orbiter High Resolution Camera* (OHRC). A *Terrain Mapping Camera-2* (TMC-2)\nexample will be added at a later time.\n\nFor the moment this exercise works only much additional work. It needs ASP\n3.6.0 (:numref:`release`), `ISIS <https://github.com/DOI-USGS/ISIS3>`_ 9.0.0, \n`ALE <https://github.com/DOI-USGS/ale>`_ (compiled and installed\nfrom source to a separate location), SPICE kernels from the `ISRO Science Data\nArchive <https://pradan.issdc.gov.in/ch2/protected/browse.xhtml?id=spice>`_, and\ncustom addendum (``iak``) directories for ISIS data be set up.\n\nThis is *not ready for general use* until the kernels are released in the ISIS\ndata area, but is provided for reference.\n\nOrbiter High Resolution Camera\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe OHRC instrument is a high-resolution camera with a 0.25 m ground sample\ndistance (GSD). It can adjust its look angle and acquire stereo pairs\n(:numref:`stereo_pairs`).\n\nFetching the data\n^^^^^^^^^^^^^^^^^\n\nRaw and calibrated images for OHRC and TMC-2 cameras, as well as orthoimages and\nDigital Elevation Models (DEMs) produced from TMC-2 camera data, can be\ndownloaded from `ISRO <https://chmapbrowse.issdc.gov.in/>`_.\n\nThe first step when using that portal is selecting the appropriate projection\nfor displaying the image footprints. Then, choose the instrument (OHRC or\nTMC-2), data type (calibrated is suggested, but raw may do), and the area of\ninterest.\n\nWe selected the region of interest to be between 20 and 21 degrees in longitude,\nand -70 to -67 degrees in latitude. The OHRC stereo pair we downloaded consisted\nof images with the prefixes::\n\n    ch2_ohr_nrp_20200827T0030107497_d_img_d18\n    ch2_ohr_nrp_20200827T0226453039_d_img_d18\n\nWe also got a TMC-2 orthoimage and corresponding DEM with the prefixes::\n\n    ch2_tmc_ndn_20231101T0125121377_d_oth_d18\n    ch2_tmc_ndn_20231101T0125121377_d_dtm_d18\n\nThese are at lower resolution but useful for context.\n\n.. figure:: ../images/chandrayaan2_ohrc_tmc.png\n\n  From left to right: The first and second OHRC images, and their approximate\n  extent in the (many times larger) TMC-2 ortho image. Note that the illumination\n  in the TMC-2 ortho image is very different.\n\nPreprocessing\n^^^^^^^^^^^^^\n\nEach calibrated image dataset has ``.img`` and ``.xml`` files, with raw data and\na PDS-4 label. It will be convenient to rename these to ``ohrc/img1.img`` and\n``ohrc/img1.xml`` for the first OHRC dataset, and analogously for the second\none.\n\nThe `isisimport <https://isis.astrogeology.usgs.gov/Application/presentation/Tabbed/isisimport/isisimport.html>`_ command converts the raw image to a .cub file::\n\n    isisimport                 \\\n      from     = ohrc/img1.xml \\\n      to       = ohrc/img1.cub \\\n      template = ${template}\n\n(and same for the second image). Here, the ``template`` variable is set such\nas::\n\n    template=/path/to/ISIS3/isis/appdata/import/PDS4/Chandrayaan2OHRC.tpl\n\nIn ISIS 9.0.0 likely the template parameter is optional and the template should\nbe auto-detected.\n\nThe ``isisimport`` command only works with raw images and not with ortho images.\n\nIf this command fails with a message about not being able to find a field in the\ninput xml file, it is suggested to edit that file and add a made-up entry for\nthat field. This is a temporary workaround for the problem of Chandrayaan-2 xml\nfiles being rather diverse in what fields they record.\n\nThe SPICE kernels are attached with `spiceinit <https://isis.astrogeology.usgs.gov/Application/presentation/Tabbed/spiceinit/spiceinit.html>`_::\n\n    spiceinit from = ohrc/img1.cub\n\nThis expects the SPICE kernels for Chandrayaan-2 to exist locally (see the download link\nabove). For more information on ISIS data, see :numref:`planetary_images` and the\nlinks from there.\n\nNext, the CSM cameras are created (:numref:`csm`). This makes use of the `isd_generate <https://astrogeology.usgs.gov/docs/getting-started/using-ale/isd-generate/>`_ program installed with the latest ALE built from source (link above). The command is::\n\n    export ALESPICEROOT=$ISISDATA\n    isd_generate -k ohrc/img1.cub ohrc/img1.cub\n\nand same for ``img2.cub``. Here the .cub file is specified twice, with the\nfirst file needed to read the SPICE kernels.\n\nIt is suggested to do a quick check on the produced ``ohrc/img1.json`` camera\nwith ``cam_test`` (:numref:`cam_test`).\n\nThe images can be inspected with ``stereo_gui`` (:numref:`stereo_gui`), as::\n\n  stereo_gui ohrc/img1.cub ohrc/img2.cub\n\nThe resulting cub files are very large, on the order of 12,000 x 101,075 pixels.\nFor exploratory work, these can be cropped, with the ISIS `crop\n<https://isis.astrogeology.usgs.gov/Application/presentation/Tabbed/crop/crop.html>`_\ncommand, such as::\n\n    crop                            \\\n      from     = ohrc/img1.cub      \\\n      to       = ohrc/img1_crop.cub \\\n      sample   = 1                  \\\n      line     = 1                  \\\n      nsamples = 12000              \\\n      nlines   = 50000\n\nIt is very important to ensure that the upper-left pixel (1, 1) is part of the\ncrop region, as otherwise the resulting images will be inconsistent with the CSM\ncamera models.\n\nBundle adjustment\n^^^^^^^^^^^^^^^^^\n\nWe found that these images have notable pointing error, so bundle adjustment\n(:numref:`bundle_adjust`) is needed::\n\n    bundle_adjust                           \\\n      ohrc/img1_crop.cub ohrc/img2_crop.cub \\\n      ohrc/img1.json ohrc/img2.json         \\\n      --ip-per-image 30000                  \\\n      -o ba/run\n\nThis stereo pair was seen to have a decent convergence angle of 25 degrees\n(:numref:`ba_conv_angle`).\n\n.. figure:: ../images/chandrayaan2_ohrc_interest_points.png\n\n  The left and right cropped OHRC images, and the interest point matches between\n  them (as shown by ``stereo_gui``, :numref:`stereo_gui_view_ip`).\n\nStereo\n^^^^^^\n\nNext, we invoked ``parallel_stereo`` (:numref:`parallel_stereo`) to create a point cloud::\n\n    parallel_stereo                     \\\n      --stereo-algorithm asp_mgm        \\\n      --clean-match-files-prefix ba/run \\\n      ohrc/img1_crop.cub                \\\n      ohrc/img2_crop.cub                \\\n      ba/run-img1.adjusted_state.json   \\\n      ba/run-img2.adjusted_state.json   \\\n      stereo/run\n\nA DEM, orthoimage, and triangulation error image are made with ``point2dem``\n(:numref:`point2dem`), as::\n\n    point2dem           \\\n      --tr 1.0          \\\n      --errorimage      \\\n      stereo/run-PC.tif \\\n      --orthoimage      \\\n      stereo/run-L.tif\n\nIn a recent version of ASP these will, by default, have a local stereographic\nprojection.\n\n.. figure:: ../images/chandrayaan2_ohrc_dem_ortho_err.png\n\n  From left to right: Produced OHRC DEM (range of heights is 304 to 650 meters),\n  orthoimage, and triangulation error image (blue = 0 m, red = 0.5 m). There is\n  notable jitter, whose magnitude is on the order of image GSD (0.25 m), which\n  is rather high, but which could be corrected (:numref:`jitter_solve`). Some\n  unmodeled lens distortion also seems evident, which could be solved for\n  (:numref:`kaguya_ba`).\n\nAlignment\n^^^^^^^^^\n\nWe will align the produced OHRC DEM to `LOLA\n<https://ode.rsl.wustl.edu/moon/lrololadataPointSearch.aspx>`_, which is the\nusual global reference coordinate system for the Moon.\n\nThe OHRC DEM turned out to be shifted relative to LOLA by about 4 km along the\nsatellite track, which resulted in failure to align with ``pc_align``\n(:numref:`pc_align`).\n\nManual alignment was first performed (:numref:`manual-align`). The inputs were\nthe OHRC DEM and a LOLA point cloud, after gridding both with a 10 m grid size\nand the same projection with ``point2dem``, and manually picking a few\nvisually similar features. That brought the cloud notably closer, and the output\ntransform from that alignment was used for aligning the full clouds as::\n\n    pc_align                                  \\\n      --max-displacement 250                  \\\n      --initial-transform init-transform.txt  \\\n      --csv-format 2:lon,3:lat,4:radius_km    \\\n      --save-inv-transformed-reference-points \\\n      stereo/run-DEM.tif lola/lola.csv        \\\n      -o stereo/run-align\n\n.. figure:: ../images/chandrayaan2_ohrc_lola.png\n\n  The difference between the aligned OHRC DEM and LOLA point cloud. Blue: -5 m,\n  red = 5 m. Given that the DEM, in principle, should have a vertical\n  uncertainty of under 1 m, this could be better, but at least one is in the\n  ballpark.\n\nA terrain model created with the lower-resolution TMC-2 images would likely be\neasier to align to LOLA, as it would have a much bigger extent.\n"
  },
  {
    "path": "docs/examples/change3.rst",
    "content": ".. _change3:\n\nChang'e 3 landing camera\n------------------------\n\nThis example discusses processing `Chang'e 3\n<https://en.wikipedia.org/wiki/Chang%27e_3>`_ landing camera images. This camera\nwas mounted at the bottom of the lander and acquired images during the descent\nphase.\n\nThe images we inspected had a very small convergence angle\n(:numref:`stereo_pairs`), of under 1.5 degrees, which resulted in an unreliable\nterrain model. \n\nHere we show how these images can be precisely registered to an LRO NAC image\n(:numref:`lronac-example`), how to refine the landing camera intrinsics\nincluding lens distortion, and how to produce an aligned terrain model from a\nstereo pair between a Chang'e landing camera image and an LRO NAC image\nwith similar illumination.\n\nFetching the Chang'e 3 images\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe `Chang'e3 landing video <https://www.youtube.com/watch?v=sKYrAM3EJh8>`_ is\nvery helpful when it comes to deciding which images to process.\n\nThe images are available from China's `Lunar Planetary Data Release System\n<https://moon.bao.ac.cn/ce5web/searchOrder_dataSearchData.search>`_. Select the\n``CE3`` mission, the ``LCAM`` instrument, and the ``2A`` data level. The images\nhave names of the form::\n\n  CE3_BMYK_LCAM-1801_SCI_N_20131214130807_20131214130807_0001_A.2A\n\nThe data is in the PDS3 format, with a plain text metadata header followed by a binary image.\nThe images can be converted to TIF with ``gdal_translate`` (:numref:`gdal_tools`)\nas::\n\n  mkdir -p img\n  gdal_translate CE3_BMYK_LCAM-1801*.2A img/1801.tif\n\nHere, ``1801`` is the index in the sequence. We stored the result in the ``img``\ndirectory.\n\n.. figure:: ../images/change3_images.png\n\n  Landing camera images 1801, 1831, 1861, and 1891. A crater seen in all four images\n  is highlighted with a red box.\n\nSome parts of the lander body are seen in the foreground. Most of those\nartifacts can be masked with ``image_calc`` (:numref:`image_calc`) with a\ncommand as::\n\n  image_calc -c \"max(var_0,70)\" \\\n    --output-nodata-value 70    \\\n    -d float32                  \\\n    img/1801.tif                \\\n    -o img/1801_mask.tif \n\nThis sets to no-data any pixel values not exceeding 70. \n\nA more careful processing could be done by opening an image in an image editor,\nmanually setting to black (zero pixel value) all undesirable pixels, and then\nusing the ``image_calc`` ``sign()`` function to create a mask of invalid (value\n0) and valid (value 1) pixels. Those could be applied to each image by\nmultiplication, with ``image_calc`` with the option ``--output-nodata-value 0``.\nThe same mask would work for all of them.\n\nLRO NAC data\n~~~~~~~~~~~~\n\nThe Chang'e 3 images will be registered against LRO NAC images. These are larger,\nwith known camera information, and at higher resolution. \n\nIt was quite tricky to find an LRO NAC image with similar illumination. This\nrequired mapprojecting many such images and visual inspection. We settled on image\n``M1154358210RE``. \n\nHow to download and prepare LRO NAC images, including the application of ``lronaccal``\nand ``lronacecho``, is described in :numref:`lronac-example`. A CSM camera model\ncan be produced as in :numref:`create_csm_linescan`. The resulting datasets will\nbe called ``img/lro.cub`` and ``img/lro.json``.\n\nWe will also fetch an `LRO NAC DEM\n<https://pds.lroc.asu.edu/data/LRO-L-LROC-5-RDR-V1.0/LROLRC_2001/DATA/SDP/NAC_DTM/CHANGE3/NAC_DTM_CHANGE3.TIF>`_\nproduced specifically for this landing site. We call it ``ref/ref.tif``.\n\nThe LRO NAC images are very large, and sometimes also scanned in reverse\ndirection, appearing mirror-flipped. This can result in failure in finding\nmatching features for registration. To make the work easier, we will mapproject\nthe needed image portion onto this DEM. \n\nSince these two datasets are not explicitly co-registered, we will blur the DEM\nfor mapprojection quite a bit to lessen the effect of artifacts due to\nmisregistration. Later, for alignment to the ground, we will use the original\nDEM. \n\nThe blur is done with ``dem_mosaic`` (:numref:`dem_mosaic`) as::\n\n    dem_mosaic --dem-blur-sigma 10 \\\n      ref/ref.tif -o ref/ref_blur.tif\n\nDefine the extent on the ground and the projection::\n\n    win=\"3497495 1340957 3503625 1334379\"\n    proj=\"+proj=eqc +lat_ts=44 +lat_0=0 +lon_0=180 +x_0=0 +y_0=0 +R=1737400 +units=m +no_defs\"\n\nThen, the mapprojection (:numref:`mapproject`) step follows::\n\n    mapproject --tr 2.0 \\\n      --t_projwin $win  \\\n      --t_srs \"$proj\"   \\\n      ref/ref_blur.tif  \\\n      img/lro.cub       \\\n      img/lro.json      \\\n      img/lro.map.tif\n  \nThe grid size of 2 meters was chosen to be similar to the resolution of the\nChang'e 3 images.\n\nGCP creation\n~~~~~~~~~~~~\n\nWe will find interest point matches between the Chang'e 3 and LRO NAC images,\nbased on which we will compute GCP (:numref:`bagcp`), that will be later used to\ninfer an approximate position and orientation of the Chang'e 3 camera at the\ntime of image acquisition.\n\nGCP are found with the ``gcp_gen`` program (:numref:`gcp_gen`) as::\n\n    gcp_gen                            \\\n      --ip-detect-method 1             \\\n      --inlier-threshold 100           \\\n      --ip-per-tile 20000              \\\n      --gcp-sigma 100                  \\\n      --individually-normalize         \\\n      --camera-image img/1801_mask.tif \\\n      --ortho-image img/lro.map.tif    \\\n      --dem ref/ref.tif                \\\n      --output-prefix run/run          \\\n      -o gcp/gcp_1801.gcp\n\nThe interest point matches can be visualized with ``stereo_gui``\n(:numref:`stereo_gui_view_ip`) as::\n\n    stereo_gui img/1801_mask.tif img/lro.map.tif \\\n      run/run-1801__lro.map.match\n\n.. figure:: ../images/change3_lro.png\n\n  Interest point matches between masked Chang'e image 1801 and mapprojected LRO\n  NAC image M1154358210RE. Similar results are obtained for the other images.\n\nInitial camera models\n~~~~~~~~~~~~~~~~~~~~~\n\nThe Chang'e 3 landing camera is a frame camera. The input .2A datasets mention\nthat it has a focal length of 8.3 mm and a pixel size of 6.7 micrometers, which\nmakes the focal length in pixels be about 1238.805 pixels. \n\nThe image dimensions are 1024 x 1024 pixels. It can be assumed that the optical\ncenter is at the center of the image, so its coordinates are (511.5, 511.5).\n\nThe lens distortion model is not known. We will assume the standard radial-tangential\ndistortion model, and will initialize all distortion coefficients with small values,\nsuch as 1e-7, that will be optimized later.\n\nThis allows us to build a Pinhole model (:numref:`pinholemodels`) with nominal\ncamera position and orientation. We will save it to a file called ``sample.tsai``,\nwith the following content::\n\n    VERSION_4\n    PINHOLE\n    fu = 1238.805\n    fv = 1238.805\n    cu = 511.5\n    cv = 511.5\n    u_direction = 1 0 0\n    v_direction = 0 1 0\n    w_direction = 0 0 1\n    C = 0 0 0\n    R = 1 0 0 0 1 0 0 0 1\n    pitch = 1\n    Tsai\n    k1 = 1e-7\n    k2 = 1e-7\n    p1 = 1e-7\n    p2 = 1e-7\n    k3 = 1e-7\n\nWe will make use of the GCP found earlier to infer the camera position and orientation.\nThis is done with ``bundle_adjust`` (:numref:`bundle_adjust`) as::\n\n  bundle_adjust             \\\n    img/1801_mask.tif       \\\n    sample.tsai             \\\n    gcp/gcp_1801.gcp        \\\n    --datum D_MOON          \\\n    --inline-adjustments    \\\n    --init-camera-using-gcp \\\n    --camera-weight 0       \\\n    --num-iterations 100    \\\n    -o ba/run\n\n    cp ba/run-sample.tsai img/1801.tsai\n\nThe camera model was copied to ``img/1801.tsai``. \n\nWe will convert this Pinhole model right away to a CSM model (:numref:`csm`), to\nbe in the same format as the LRO data. This is done with ``cam_gen``\n(:numref:`cam_gen`)::\n\n  cam_gen                        \\\n    --datum D_MOON               \\\n    img/1801_mask.tif            \\\n    --input-camera img/1801.tsai \\\n    -o img/1801.json \n    \nThe camera model can be validated by mapprojection onto the prior DEM::\n\n    mapproject --tr 2.0 \\\n      --t_srs \"$proj\"   \\\n      ref/ref_blur.tif  \\\n      img/1801_mask.tif \\\n      img/1801.json     \\\n      img/1801.map.tif\n\nThe value of ``$proj`` is the same as before.\n\nThe resulting mapprojected image can be overlaid on top of the LRO NAC\nmapprojected image. Some misalignment is expected at this stage.\n\nMore validation strategies are discussed in :numref:`cam_gcp_validation`.\n\n.. figure:: ../images/change3_over_lro.png\n\n  Mapprojected and masked Chang'e 3 image 1801 overlaid on top of the LRO NAC\n  mapprojected image. The masked pixels are shown as transparent. A careful\n  inspection shows good initial agreement, but some local deformation is seen,\n  which is likely due to some tilt and lens distortion not being modeled yet.\n  This will be fixed later.\n\n.. _change_opt:\n\nOptimization of intrinsics\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nWe will optimize the intrinsics and extrinsics of the Chang'e 3 cameras,\nincluding the lens distortion, with the LRO data serving as a constraint.\nThe general approach from :numref:`ba_frame_linescan` is followed, while\ndense matches from disparity are employed, to ensure the best results.\n\nStereo will be run between any pair of images: ``1801``, ``1831``, ``lro``, and\ndense matches from stereo correlation (disparity) will be produced\n(:numref:`dense_ip`). \n\n::\n\n    i=1801; j=1831\n\n    parallel_stereo                      \\\n      img/${i}.map.tif img/${j}.map.tif  \\\n      img/${i}.json img/${j}.json        \\\n      --stereo-algorithm asp_mgm         \\\n      --num-matches-from-disparity 10000 \\\n      stereo_map_${i}_${j}/run           \\\n      ref/ref_blur.tif\n\nThis is repeated for ``i=1801; j=lro``, and ``i=1831; j=lro``.\n\nThe dense match files are copied to the same location::\n\n  mkdir -p dense_matches\n  cp stereo_map*/run-disp*match dense_matches\n\nSeparate lists are made of Chang'e 3 and LRO images and cameras::\n\n    ls img/{1801,1831}_mask.tif > change3_images.txt\n    ls img/lro.cub              > lro_images.txt\n    \n    ls img/{1801,1831}.json     > change3_cameras.txt\n    ls img/lro.json             > lro_cameras.txt\n    \nBundle adjustment is run::\n\n    bundle_adjust                                             \\\n      --image-list change3_images.txt,lro_images.txt          \\\n      --camera-list change3_cameras.txt,lro_cameras.txt       \\\n      --solve-intrinsics                                      \\\n      --intrinsics-to-float                                   \\\n      '1:focal_length,optical_center,other_intrinsics 2:none' \\\n      --heights-from-dem ref/ref_blur.tif                     \\\n      --heights-from-dem-uncertainty 100                      \\\n      --match-files-prefix dense_matches/run-disp             \\\n      --max-pairwise-matches 50000                            \\\n      --num-iterations 50                                     \\\n      -o ba_dense/run\n\nThe value of ``--heights-from-dem-uncertainty`` is set to 100 meters, as\nwe know that the input cameras are not yet aligned to the input DEM,\nso this accounts for the misregistration. This option would fail\nfor very large misregistration, when a preliminary alignment \nwould be needed. \n\nStereo is run between images ``1801`` and ``lro`` with the optimized\ncameras and reusing the previous run from above::\n\n    parallel_stereo                             \\\n      img/1801.map.tif img/lro.map.tif          \\\n      ba_dense/run-1801.adjusted_state.json     \\\n      ba_dense/run-lro.adjusted_state.json      \\\n      --stereo-algorithm asp_mgm                \\\n      --prev-run-prefix stereo_map_1801_lro/run \\\n      stereo_map_opt_1801_lro/run               \\\n      ref/ref_blur.tif\n\nThese two images have a convergence angle of 45 degrees, which is very good\nfor stereo (:numref:`stereo_pairs`).\n\nThe Chang'e 3 images are not going to produce a good DEM between themselves,\nbecause of the very small convergence angle, as mentioned earlier.\n\nA DEM is created, at 4 meters per pixel, with ``point2dem`` (:numref:`point2dem`)::\n\n    point2dem --tr 4.0   \\\n      --errorimage       \\\n      stereo_map_opt_1801_lro/run-PC.tif\n    \nIt is good to inspect the resulting triangulation error image to ensure lens\ndistortion was solved for and no systematic errors are present\n(:numref:`point2dem_ortho_err`).\n\nThe produced DEM can be aligned to the original DEM with ``pc_align``\n(:numref:`pc_align`), and the aligned cloud can be made back into a DEM::\n\n    pc_align --max-displacement 100           \\\n      --save-inv-transformed-reference-points \\\n      --alignment-method point-to-plane       \\\n      stereo_map_opt_1801_lro/run-DEM.tif     \\\n      ref/ref.tif                             \\\n      -o align/run\n    point2dem --tr 4.0                        \\\n      align/run-trans_reference.tif\n\nThe resulting alignment transform can be applied to the optimized cameras in the\n``ba_dense`` directory (:numref:`ba_pc_align`). After mapprojection with the\noptimized and aligned cameras onto ``ref/ref.tif``, no distortion or\nmisalignment is seen.\n\n.. figure:: ../images/change3_lro_dem.png\n  \n  Left: The produced aligned DEM with frame 1801. Right: the original LRO NAC DEM.\n  The Chang'e 3 images are are at a lower resolution, and somewhat differ in\n  illumination from the LRO NAC image, so the quality of the resulting DEM is\n  lower. However, the larger features are captured correctly, and the alignment is\n  also very good.\n\nMulti-image registration\n~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe approach for registering a longer sequence of Chang'e 3 images to each other and to \nLRO NAC is very similar.\n\nGCP are computed automatically for each image. Pairwise dense matches are found\nbetween each image and the next, and between each image and the LRO NAC image.\nBundle adjustment can be run as above, while optimizing the intrinsics.\n\nStereo is run between each Chang'e 3 image and the LRO NAC image, with the optimized\ncameras. The resulting DEMs can be merged with ``dem_mosaic``, and the produced mosaic\nis aligned to the original LRO NAC DEM with ``pc_align``. \n\nThe alignment transform is applied to the optimized cameras\n(:numref:`ba_pc_align`). The images with the resulting cameras are mapprojected\nonto the original LRO NAC DEM. If needed, the bundle adjustment from above can\nbe rerun with the now well-aligned cameras and a lower\n``--heights-from-dem-uncertainty``.\n\nFor a very long sequence of images this method can become impractical. In that\ncase, the intrinsics that are optimized as demonstrated earlier for a short\nstretch can be used with Structure-from-Motion (:numref:`sfm`) on the full\nsequence. Just a few well-distributed GCP may be needed to transform the cameras\nto ground coordinates. DEM creation and alignment refinement can be as earlier. \n\nIf the intrinsics are not optimized, then dense matches are not required, and\nthe sparse matches produced ``camera_solve`` in SfM or by ``bundle_adjust``\nshould be enough. \n\n.. figure:: ../images/change3_many_over_lro.png\n\n  From top to bottom, the mapprojected Chang'e images 1780, 1801, 1831, 1861,\n  1891, and 1910, with the LRO NAC image in the background. These have been\n  pixel-level registered to each other, to the LRO NAC image, and to the LRO NAC\n  DEM. The footprint of the images is decreasing along the sequence, and the\n  resolution is increasing, as the lander is descending. A portion of the data \n  was cropped on the right to remove the noise due to the lander body and to make\n  it easier to evaluate the registration visually.\n\n  \n"
  },
  {
    "path": "docs/examples/csm.rst",
    "content": ".. _csm:\n\nCommunity Sensor Model\n----------------------\n\nThe Community Sensor Model (CSM), established by the U.S. defense\nand intelligence community, has the goal of standardizing camera\nmodels for various remote sensor types :cite:`CSMTRD`. It provides\na well-defined application program interface (API) for multiple\ntypes of sensors and has been widely adopted by Earth remote sensing\nsoftware systems :cite:`hare2017community,2019EA000713`.\n\nASP supports and ships the `USGS implementation\n<https://github.com/USGS-Astrogeology/usgscsm>`_ of CSM for planetary images,\nwhich provides Linescan, Frame, Pushframe, and Synthetic Aperture Radar (SAR)\nimplementations.\n\nCSM is handled via dynamically loaded plugins. Hence, if a user has a\nnew sensor model, ASP should, in principle, be able to use it as soon\nas a supporting plugin is added to the existing software, without\nhaving to rebuild ASP or modify it otherwise. In practice, while this\nlogic is implemented, ASP defaults to using only the USGS\nimplementation, though only minor changes are needed to support\nadditional plugins.\n\nEach stereo pair to be processed by ASP should be made up of two\nimages (for example ``.cub`` or ``.tif`` files) and two plain\ntext camera files with ``.json`` extension. The CSM information is\ncontained in the ``.json`` files and it determines which plugin to\nload to use with those cameras. \n\nCSM model state data can also be embedded in ISIS .cub files\n(:numref:`embedded_csm`).\n\n.. _csm_frame:\n\nThe USGS CSM Frame sensor\n~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe USGS CSM *Frame* sensor models a frame camera. All the\npixels get acquired at the same time, unlike for pushbroom and\npushframe cameras, which keep on acquiring image lines as they fly\n(those are considered later in the text). Hence, a single camera\ncenter and orientation is present. This model serves the same function\nas ASP's own Pinhole camera model (:numref:`pinholemodels`).\n\n:numref:`csm_frame_def` discusses the CSM Frame sensor in some detail,\nincluding the distortion model.\n\nIn this example we will consider images acquired with the Dawn\nFraming Camera instrument, which took pictures of the Ceres and Vesta\nasteroids. This particular example will be for Vesta. Note that one\nmore example of this sensor is shown in this documentation, in\n:numref:`dawn_isis`, which uses ISIS ``.cub`` camera models rather\nthan CSM ones.\n\nThis example is available for `download <https://github.com/NeoGeographyToolkit/StereoPipelineSolvedExamples>`_.\n\n\nCreating the input images\n^^^^^^^^^^^^^^^^^^^^^^^^^\n\nFetch the data from PDS then extract it::\n\n    wget https://sbib.psi.edu/data/PDS-Vesta/Survey/img-1B/FC21B0004011_11224024300F1E.IMG.gz\n    wget https://sbib.psi.edu/data/PDS-Vesta/Survey/img-1B/FC21B0004012_11224030401F1E.IMG.gz\n      \n    gunzip FC21B0004011_11224024300F1E.IMG.gz \n    gunzip FC21B0004012_11224030401F1E.IMG.gz\n\nFor simplicity of notation, we will rename these to ``left.IMG`` and ``right.IMG``.\n\nSet up the ISIS environment (:numref:`planetary_images`). \n\nThese will need adjusting for your system::\n\n    export ISISROOT=$HOME/miniconda3/envs/isis\n    export PATH=$ISISROOT/bin:$PATH\n    export ISISDATA=$HOME/isisdata\n\nCreate cub files and initialize the kernels::\n\n    dawnfc2isis from = left.IMG  to = left.cub  target = VESTA\n    dawnfc2isis from = right.IMG to = right.cub target = VESTA\n\n    spiceinit from = left.cub\n    spiceinit from = right.cub\n\nThe ``target`` field is likely no longer needed in newer versions of\nISIS.\n\n.. _create_csm_dawn:\n\nCreation of CSM Frame camera files\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nSet::\n\n    export ALESPICEROOT=$ISISDATA\n\nRun the ``isd_generate`` command to create the CSM camera files. This script\nis part of the ALE package, and should be shipped with the latest ISIS \nor ASP, if installed with conda. It can also be installed separately.\n\n::\n\n    isd_generate -k left.cub left.cub\n    isd_generate -k right.cub right.cub\n\nThis will create ``left.json`` and ``right.json``.\n\nSee the `isd_generate manual\n<https://astrogeology.usgs.gov/docs/getting-started/using-ale/isd-generate/>`_.\n\nAs a sanity check, run ``cam_test`` (:numref:`cam_test`) to see how well the CSM\ncamera approximates the ISIS camera::\n\n    cam_test --image left.cub  --cam1 left.cub  --cam2 left.json\n    cam_test --image right.cub --cam1 right.cub --cam2 right.json\n\nNote that for a handful of pixels these errors may be big. That is a\nknown issue, and it seems to be due to the fact that a ray traced from\nthe camera center towards the ground may miss the body of the asteroid.\nThat should not result in inaccurate stereo results.\n\nRunning stereo\n^^^^^^^^^^^^^^\n\n::\n\n    parallel_stereo --stereo-algorithm asp_mgm \\\n      --left-image-crop-win 243 161 707 825    \\\n      --right-image-crop-win 314 109 663 869   \\\n      left.cub right.cub left.json right.json  \\\n      run/run\n\nSee :numref:`nextsteps` for a discussion about various\nspeed-vs-quality choices when running stereo.\n\nThis is followed by creation of a DEM (:numref:`point2dem`)\nand products that can be visualized (:numref:`genhillshade`)::\n\n    point2dem run/run-PC.tif --orthoimage run/run-L.tif \n    hillshade run/run-DEM.tif \n    colormap run/run-DEM.tif -s run/run-DEM_HILLSHADE.tif \n\n.. figure:: ../images/CSM_Frame.png\n   :name: CSM_Frame_example\n\n   The produced colorized DEM and orthoimage for the CSM Frame camera\n   example. Likely using mapprojection (:numref:`mapproj-example`)\n   may have reduced the number and size of the holes in the DEM.\n\n.. _csm_linescan:\n\nThe USGS CSM linescan sensor\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nIn this example we will use the Mars CTX linescan sensor. The images are regular\n``.cub`` files as in the tutorial in :numref:`moc_tutorial`, hence the only\ndistinction compared to that example is that the cameras are stored as ``.json``\nfiles.\n\nWe will work with the dataset pair::\n\n     J03_045994_1986_XN_18N282W.cub J03_046060_1986_XN_18N282W.cub\n\nwhich, for simplicity, we will rename to ``left.cub`` and ``right.cub``\nand the same for the associated camera files.\n\nSee :numref:`kaguya_tc` for another linescan example for the Kaguya linescan\nsensor for the Moon.\n\n.. _create_csm_linescan:\n\nCreation CSM linescan cameras\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nNote that this recipe looks a little different for Frame and SAR cameras,\nas can be seen in :numref:`create_csm_dawn` and :numref:`create_csm_sar`.\n\nRun the ISIS ``spiceinit`` command on the .cub files as::\n\n    spiceinit from = left.cub\n    spiceinit from = right.cub\n\nNext, CSM cameras are created, with ``isd_generate``. This program is discussed\nin :numref:`create_csm_dawn`.\n\n*Note:* Currently shipped version of ``isd_generate`` (in ALE 1.0.2) has a bug,\ncreating very large linescan camera models that are very slow to load. If this\nis noticed, consider putting `this fix\n<https://github.com/DOI-USGS/ale/pull/677>`_ in the ``type_sensor.py`` file in\nthe ALE package.\n\nRun::\n\n    isd_generate left.cub\n    isd_generate right.cub\n    \nThis will produce ``left.json`` and ``right.json``.\n\nSee the `isd_generate manual\n<https://astrogeology.usgs.gov/docs/getting-started/using-ale/isd-generate/>`_.\n\nRunning stereo\n^^^^^^^^^^^^^^\n\n::\n\n    parallel_stereo --stereo-algorithm asp_mgm \\\n      --subpixel-mode 9                        \\\n       left.cub right.cub left.json right.json \\\n       run/run \n\nCheck the stereo convergence angle as printed during preprocessing\n(:numref:`stereo_pairs`). If that angle is small, the results are not\ngoing to be great.\n\nSee :numref:`nextsteps` for a discussion about various stereo\nalgorithms and speed-vs-quality choices. \n\nThe fancier MGM algorithm could be used by running this example with\n``--stereo-algorithm asp_mgm``.\n\nThe actual stereo session used is ``csm``, and here it will be\nauto-detected based on the extension of the camera files.\n\nNext, a DEM is produced (:numref:`point2dem`)::\n       \n    point2dem -r mars --stereographic \\\n      --proj-lon 77.4 --proj-lat 18.4 \\\n      run/run-PC.tif\n\nFor ``point2dem`` we chose to use a stereographic projection centered at\nsome point in the area of interest. See :numref:`point2dem_proj`\nfor how how a projection for the DEM can be auto-determined.\n\nOne can also run ``parallel_stereo`` with mapprojected images\n(:numref:`mapproj-example`). The first step would be to create a\nlow-resolution smooth DEM from the previous cloud::\n\n     point2dem -r mars                 \\\n       --stereographic                 \\\n       --proj-lon 77.4 --proj-lat 18.4 \\\n        --tr 120                       \\\n       run/run-PC.tif                  \\\n       -o run/run-smooth\n\nfollowed by mapprojecting onto it and redoing stereo::\n\n    mapproject --tr 6 run/run-smooth-DEM.tif left.cub  \\\n      left.json left.map.tif\n    mapproject --tr 6 run/run-smooth-DEM.tif right.cub \\\n     right.json right.map.tif\n    parallel_stereo --stereo-algorithm asp_mgm         \\\n      --subpixel-mode 9                                \\\n      left.map.tif right.map.tif left.json right.json  \\\n      run_map/run run/run-smooth-DEM.tif\n\nNotice how we used the same resolution for both images when\nmapprojecting. That helps making the resulting images more similar and\nreduces the processing time (:numref:`mapproj-res`).\n\n.. _csm_wac:\n\nCSM Pushframe sensor\n~~~~~~~~~~~~~~~~~~~~\n\nThe USGS CSM *Pushframe* sensor models a pushframe camera.  The support for this sensor\nis not fully mature, and some artifacts can be seen in the DEMs (per below).\n \nWhat follows is an illustration of using this sensor with Lunar Reconnaissance\nOrbiter (LRO) WAC images. \n\nThis example, including the inputs, recipe, and produced terrain model\n`can be downloaded <https://github.com/NeoGeographyToolkit/StereoPipelineSolvedExamples/releases/tag/LROWAC>`_.\n\nFetching the data\n^^^^^^^^^^^^^^^^^\n\nWe will focus on the monochromatic images for this sensor. Visit:\n\n   https://ode.rsl.wustl.edu/moon/indexproductsearch.aspx\n\nFind the *Lunar Reconnaissance Orbiter -> Experiment Data Record Wide\nAngle Camera - Mono (EDRWAM)* option.\n\nSearch either based on a longitude-latitude window, or near a notable\nfeature, such as a named crater.  We choose a couple of images having\nthe Tycho crater, with download links::\n\n    http://pds.lroc.asu.edu/data/LRO-L-LROC-2-EDR-V1.0/LROLRC_0002/DATA/MAP/2010035/WAC/M119923055ME.IMG\n    http://pds.lroc.asu.edu/data/LRO-L-LROC-2-EDR-V1.0/LROLRC_0002/DATA/MAP/2010035/WAC/M119929852ME.IMG\n\nFetch these with ``wget``.\n\nCreation of .cub files\n^^^^^^^^^^^^^^^^^^^^^^\n\nWe broadly follow the tutorial at :cite:`ohman2015procedure`. For a\ndataset called ``image.IMG``, do::\n\n    lrowac2isis from = image.IMG to = image.cub\n\nThis will create so-called *even* and *odd* datasets, with names like\n``image.vis.even.cub`` and ``image.vis.odd.cub``.\n\nRun ``spiceinit`` on them to set up the SPICE kernels::\n\n    spiceinit from = image.vis.even.cub\n    spiceinit from = image.vis.odd.cub\n\nfollowed by ``lrowaccal`` to adjust the image intensity::\n\n    lrowaccal from = image.vis.even.cub to = image.vis.even.cal.cub\n    lrowaccal from = image.vis.odd.cub  to = image.vis.odd.cal.cub\n\nAll these .cub files can be visualized with ``stereo_gui``. It can be\nseen that instead of a single contiguous image we have a set of narrow\nhorizontal framelets, with some of these in the even and some in the odd\ncub file. The framelets may also be recorded in reverse.\n\nProduction of seamless mapprojected images\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThis is not needed for stereo, but may be useful for readers who would\nlike to produce image mosaics using ``cam2map``.\n\n::\n\n    cam2map from = image.vis.even.cal.cub to = image.vis.even.cal.map.cub\n    cam2map from = image.vis.odd.cal.cub  to = image.vis.odd.cal.map.cub  \\\n      map = image.vis.even.cal.map.cub matchmap = true\n\nNote how in the second ``cam2map`` call we used the ``map`` and\n``matchmap`` arguments. This is to ensure that both of these output\nimages have the same resolution and projection. In particular, if more\ndatasets are present, it is suggested for all of them to use the same\npreviously created .cub file as a map reference.  That because stereo\nworks a lot better on mapprojected images with the same ground\nresolution. For more details see :numref:`mapproj-example` and\n:numref:`mapproj_with_cam2map`.\n\nTo verify that the obtained images have the same ground resolution, do::\n\n    gdalinfo image.vis.even.cal.map.cub | grep -i \"pixel size\"\n    gdalinfo image.vis.odd.cal.map.cub  | grep -i \"pixel size\"\n\n(see :numref:`gdal_tools` regarding this tool).\n\nThe fusion happens as::\n\n    ls image.vis.even.cal.map.cub image.vis.odd.cal.map.cub  > image.txt\n    noseam fromlist = image.txt to = image.noseam.cub SAMPLES=73 LINES=73\n\nThe obtained file ``image.noseam.cub`` may still have some small artifacts\nbut should be overall reasonably good. \n\nStitching the raw even and odd images\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThis requires ISIS newer than version 6.0, or the latest development code.\n\nFor each image in the stereo pair, stitch the even and odd datasets::\n\n    framestitch even = image.vis.even.cal.cub odd = image.vis.odd.cal.cub \\\n      to = image.cub flip = true num_lines_overlap = 2\n\nThe ``flip`` flag is needed if the order of framelets is reversed\nrelative to what the image is expected to show.\n\nThe parameter ``num_lines_overlap`` is used to remove a total of this\nmany lines from each framelet (half at the top and half at the bottom)\nbefore stitching, in order to deal with the fact that the even and odd\nframelets have a little overlap, and that they also tend to have artifacts\ndue to some pixels flagged as invalid in each first and last framelet\nrow.\n\nThe CSM camera models will assume that this parameter is set at 2, so\nit should not be modified. Note however that WAC framelets may overlap\nby a little more than that, so resulting DEMs may have some artifacts\nat framelet borders, as can be seen further down.\n\nCreation of CSM WAC cameras\n^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nSet::\n\n    export ALESPICEROOT=$ISISDATA\n\nCSM cameras are created, with ``isd_generate``. This program is discussed\nin :numref:`create_csm_dawn`. Run::\n\n    isd_generate -k image.vis.even.cal.cub image.vis.even.cal.cub\n    isd_generate -k image.vis.odd.cal.cub  image.vis.odd.cal.cub\n\nThese will create ``image.vis.even.cal.json`` and ``image.vis.odd.cal.json``.\n\nDo not use the stitched .cub file as that one lacks camera information. The\nobtained .json files can be renamed to follow the same convention as the\nstitched .cub images.\n\nRunning stereo\n^^^^^^^^^^^^^^\n\n::\n\n    parallel_stereo --stereo-algorithm asp_mgm   \\\n      --left-image-crop-win 341 179 727 781      \\\n      --right-image-crop-win 320 383 824 850     \\\n      M119923055ME.cub M119929852ME.cub          \\\n      M119923055ME.json M119929852ME.json        \\\n      run/run\n\nAs printed by ``stereo_pprc``, the convergence angle is about 27\ndegrees, which is a good number.\n\nSee :numref:`nextsteps` for a discussion about various stereo\nspeed-vs-quality choices.\n\nA DEM is produced with ``point2dem`` (:numref:`point2dem`), and other products\nare made for visualization (:numref:`manipulating_results`)::\n\n    point2dem --stereographic --auto-proj-center \\\n      run/run-PC.tif --orthoimage run/run-L.tif \n    hillshade run/run-DEM.tif \n    colormap run/run-DEM.tif -s run/run-DEM_HILLSHADE.tif \n\n.. figure:: ../images/CSM_WAC.png\n   :name: CSM_WAC_example\n\n   The produced colorized DEM and orthoimage for the CSM WAC camera\n   example. The artifacts are due to issues stitching of even and odd\n   framelets.\n\nIt can be seen that the stereo DEM has some linear artifacts. That is\ndue to the fact that the stitching does not perfectly integrate the\nframelets.\n\nAn improved solution can be obtained by creating a low-resolution\nversion of the above DEM, mapprojecting the images on it, and then\nre-running stereo, per (:numref:`mapproj-example`).\n\n::\n\n    point2dem --stereographic --auto-proj-center       \\\n      --tr 800 run/run-PC.tif --search-radius-factor 5 \\\n      -o run/run-low-res\n    mapproject --tr 80 run/run-low-res-DEM.tif         \\\n      M119923055ME.cub M119923055ME.json M119923055ME.map.tif \n    mapproject --tr 80 run/run-low-res-DEM.tif         \\\n      M119929852ME.cub M119929852ME.json M119929852ME.map.tif \n    parallel_stereo --stereo-algorithm asp_mgm         \\\n      M119923055ME.map.tif M119929852ME.map.tif        \\\n      M119923055ME.json M119929852ME.json              \\\n      run_map/run run/run-low-res-DEM.tif \n    point2dem --stereographic --auto-proj-center       \\\n      run_map/run-PC.tif --orthoimage run_map/run-L.tif \n    hillshade run_map/run-DEM.tif \n    colormap run_map/run-DEM.tif -s run_map/run-DEM_HILLSHADE.tif \n\nTo create the low-resolution DEM we used a grid size of 800 m,\nwhich is coarser by a factor of about 8 compared to the nominal WAC\nresolution of 100 / pixel. \n\nNote that the same resolution is used when mapprojecting both images; that is\nvery important to avoid a large search range in stereo later. This is discussed\nin more detail in :numref:`mapproj-example`.\n\n.. figure:: ../images/CSM_WAC_mapproj.png\n   :name: CSM_WAC_example_mapproj\n\n   The produced colorized DEM and orthoimage for the CSM WAC camera\n   example, when mapprojected images are used.\n\nAs can be seen in the second figure, there are somewhat fewer artifacts.\nThe missing lines in the DEM could be filled in if ``point2dem`` was run\nwith ``--search-radius-factor 4``, for example. \n\nGiven that there exists a wealth of WAC images, one could also try to\nget several more stereo pairs with similar illumination, run bundle\nadjustment for all of them (:numref:`bundle_adjust`), run pairwise\nstereo, create DEMs (at the same resolution), and then merge them with\n``dem_mosaic`` (:numref:`dem_mosaic`). This may further attenuate the\nartifacts as each stereo pair will have them at different\nlocations. See :numref:`stereo_pairs` for guidelines about how to\nchoose good stereo pairs.\n\n.. _csm_minirf:\n\nThe USGS CSM SAR sensor for LRO Mini-RF \n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThis page describes processing data produced with the *Mini-RF* Synthetic\nAperture Radar (SAR) sensor on the LRO spacecraft while making use of CSM\ncameras. A SAR example for Earth is in :numref:`umbra_sar`. \n\nIt is challenging to process its data with ASP for several\nreasons:\n\n - The synthetic image formation model produces curved rays going from the\n   ground to the pixel in the camera (:cite:`kirk2016semi`). To simplify the\n   calculations, ASP finds where a ray emanating from the camera\n   intersects the standard Moon ellipsoid with radius 1737.4 km and\n   declares the ray to be a straight line from the camera center to this\n   point.\n\n - This sensor very rarely acquires stereo pairs. The convergence angle\n   (:numref:`stereo_pairs`) as printed by ``parallel_stereo`` in\n   pre-processing is usually less than 5 degrees, which is little and\n   results in noisy DEMs. In this example we will use a dataset\n   intentionally created with stereo in mind. The images will cover a\n   part of Jackson crater (:cite:`kirk2011radargrammetric`).\n\n - It is not clear if all modeling issues with this sensor were\n   resolved. The above publication states that \"Comparison of the stereo\n   DTM with ~250 m/post LOLA grid data revealed (in addition to\n   dramatically greater detail) a very smooth discrepancy that varied\n   almost quadratically with latitude and had a peak-to-peak amplitude\n   of nearly 4000 m.\"\n  \n - The images are dark and have unusual appearance, which requires\n   some pre-processing and a large amount of interest points. \n\nHence, ASP's support for this sensor is experimental. The results\nare plausible but likely not fully rigorous.\n\nThis example, including input images, produced outputs, and a recipe, is available\nfor download at:\n\n    https://github.com/NeoGeographyToolkit/StereoPipelineSolvedExamples\n\nNo ISIS data are needed to run it.\n\nCreating the input images\n^^^^^^^^^^^^^^^^^^^^^^^^^\n\nFetch the data from PDS::\n\n    wget https://pds-geosciences.wustl.edu/lro/lro-l-mrflro-4-cdr-v1/lromrf_0002/data/sar/03800_03899/level1/lsz_03821_1cd_xku_16n196_v1.img\n    wget https://pds-geosciences.wustl.edu/lro/lro-l-mrflro-4-cdr-v1/lromrf_0002/data/sar/03800_03899/level1/lsz_03821_1cd_xku_16n196_v1.lbl\n    wget https://pds-geosciences.wustl.edu/lro/lro-l-mrflro-4-cdr-v1/lromrf_0002/data/sar/03800_03899/level1/lsz_03822_1cd_xku_23n196_v1.img\n    wget https://pds-geosciences.wustl.edu/lro/lro-l-mrflro-4-cdr-v1/lromrf_0002/data/sar/03800_03899/level1/lsz_03822_1cd_xku_23n196_v1.lbl\n\nThese will be renamed to ``left.img``, ``right.img``, etc., to simply\nthe processing.\n\nSet, per :numref:`planetary_images`, values for ``ISISROOT`` and ``ISISDATA``. Run::\n\n    mrf2isis from = left.lbl  to = left.cub\n    mrf2isis from = right.lbl to = right.cub\n\nRun ``spiceinit``. Setting the shape to the ellipsoid makes it easier\nto do image-to-ground computations::\n\n    spiceinit from = left.cub  shape = ellipsoid\n    spiceinit from = right.cub shape = ellipsoid\n\n.. _create_csm_sar:\n\nCreation of CSM SAR cameras\n^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nSet::\n  \n    export ALESPICEROOT=$ISISDATA\n\nCSM cameras are created, with ``isd_generate``. This program is discussed\nin :numref:`create_csm_dawn`. Run::\n\n    isd_generate -k left.cub  left.cub\n    isd_generate -k right.cub right.cub\n          \nThis will create the CSM camera file ``left.json`` and ``right.json``.\n\nRun ``cam_test`` (:numref:`cam_test`) as a sanity check::\n\n    cam_test --image left.cub  --cam1 left.cub  --cam2 left.json\n    cam_test --image right.cub --cam1 right.cub --cam2 right.json\n\nPreparing the images\n^^^^^^^^^^^^^^^^^^^^\n\nASP accepts only single-band images, while these .cub files have four of them.\nWe will pull the first band and clamp it to make it easier for stereo to find\ninterest point matches::\n\n    gdal_translate -b 1 left.cub  left_b1.tif\n    gdal_translate -b 1 right.cub right_b1.tif\n\n    image_calc -c \"min(var_0, 0.5)\" left_b1.tif  -d float32 \\\n      -o left_b1_clamp.tif \n    image_calc -c \"min(var_0, 0.5)\" right_b1.tif -d float32 \\\n      -o right_b1_clamp.tif \n\nRunning stereo\n^^^^^^^^^^^^^^\n\nIt is simpler to first run a clip with ``stereo_gui``\n(:numref:`stereo_gui`).  This will result in the following command::\n\n    parallel_stereo --ip-per-tile 3500             \\\n      --left-image-crop-win 0 3531 3716 10699      \\\n      --right-image-crop-win -513 22764 3350 10783 \\\n      --stereo-algorithm asp_mgm --min-num-ip 10   \\\n      left_b1_clamp.tif right_b1_clamp.tif         \\\n      left.json right.json run/run  \n\nThe stereo convergence angle for this pair is 18.4 degrees which is\nrather decent.\n\nCreate a colorized DEM and orthoimage (:numref:`point2dem`)::\n\n    point2dem run/run-PC.tif --orthoimage run/run-L.tif \n    hillshade run/run-DEM.tif \n    colormap run/run-DEM.tif -s run/run-DEM_HILLSHADE.tif \n\nSee :numref:`nextsteps` for a discussion about various\nspeed-vs-quality choices when running stereo.\n\n.. figure:: ../images/CSM_MiniRF.png\n   :name: CSM_miniRF_example\n\n   The produced colorized DEM and orthoimage for the CSM SAR example. \n\n.. _csm_msl:\n\nCSM cameras for MSL\n~~~~~~~~~~~~~~~~~~~\n\nThis example shows how, given a set of Mars Science Laboratory (MSL) Curiosity\nrover ``Nav`` or ``Mast`` camera images, CSM camera models can be created. Stereo\npairs are then used (with either ``Nav`` or ``Mast`` data) to make DEMs and\northoimages.\n\nAfter recent fixes in ALE (details below), the camera models are accurate enough\nthat stereo pairs acquired at different rover locations and across different days \nresult in consistent DEMs and orthoimages.\n\nSee :numref:`rig_msl` for a Structure-from-Motion solution without using CSM\ncameras. That one results in self-consistent meshes that, unlike the DEMs\nproduced here, are not geolocated.\n\nIllustration\n^^^^^^^^^^^^\n\n.. figure:: ../images/MSL_Kimberly_images.png\n  :name: csm_msl_figure1\n  :alt:  MSL Kimberly images\n\n  Four out of the 10 images (5 stereo pairs) used in this example.\n\n.. figure:: ../images/MSL_Kimberly_DEM_DRG.png\n  :name: csm_msl_figure2\n  :alt:  MSL Kimberly DEM and ortho\n\n  Produced DEM and orthoimage. See :numref:`csm_msl_multiday` for a larger\n  example.\n\nFetch the images and metadata from PDS\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nSee :numref:`msl_image_prep`. Here we will work with .cub files rather than\nconverting them to .png. The same Mars day will be used as there (SOL 597). The\ndatasets for SOL 603 were verified to work as well.\n\nThe dataset used in this example (having .LBL, .cub, and .json files) is\navailable `for download\n<https://github.com/NeoGeographyToolkit/StereoPipelineSolvedExamples/releases/tag/MSL_CSM>`_.\nIt is suggested to recreate the .json files in that dataset as done below.\n\nDownload the SPICE data\n^^^^^^^^^^^^^^^^^^^^^^^\n\nFetch the SPICE kernels for MSL (see :numref:`planetary_images` and the links\nfrom there).\n\n.. _csm_msl_create:\n\nCreation of CSM MSL cameras\n^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nSet::\n\n    export ALESPICEROOT=$ISISDATA\n\nA full-resolution MSL left ``Nav`` image uses the naming convention::\n\n      NLB_<string>_F<string>.cub\n\nwith the right image starting instead with ``NRB``. The metadata files\ndownloaded from PDS end with ``.LBL``.\n\nA bug in the shipped metakernels requires editing the file::\n\n    $ISISDATA/msl/kernels/mk/msl_v01.tm\n    \nand replacing::\n\n    /usgs/cpkgs/isis3/data\n\nwith your value of $ISISDATA. Ensure that the resulting path still ends with\n``/msl/kernels``.\n    \nCSM cameras are created, with ``isd_generate``. This program is discussed\nin :numref:`create_csm_dawn`. Run::\n    \n    isd_generate image.LBL \n\nThis will produce the file ``image.json``. \n\nIf running into issues, invoke this command with the ``-v`` option to see where\nit fails.\n\nSimple stereo example\n^^^^^^^^^^^^^^^^^^^^^\n\nIn this example the camera orientations are not refined using bundle adjustment,\nas the camera poses are reasonably good. If desired to do that, one could run\n``bundle_adjust`` (:numref:`bundle_adjust`) as::\n  \n    bundle_adjust --no-datum --camera-weight 0 --tri-weight 0.1 \\\n      data/*.cub data/*.json -o ba/run\n\nHere and below we use the option ``--no-datum`` as these are ground-level cameras,\nwhen rays emanating from them may not reliably intersect the planet datum.\n  \nFor each stereo pair, run ``parallel_stereo`` (:numref:`parallel_stereo`) as::\n\n    parallel_stereo                 \\\n      --stereo-algorithm asp_mgm    \\\n      --subpixel-mode 3 --no-datum  \\\n      --min-triangulation-angle 1.5 \\\n      left.cub right.cub            \\\n      left.json right.json          \\\n      run/run\n\nIf bundle adjustment was used, the above command should be run with the option\n``--bundle-adjust-prefix ba/run``. \n\nThe option ``--min-triangulation-angle 1.5`` is highly essential. It filters out\nfar-away and noisy points. Increasing this will remove more points.  For\nterrains with a lot of shadows (such as for the Moon), also consider using the\noption ``--no-data-value`` to filter out pixels with low intensity\n(:numref:`stereodefault`).                      \n\nThis is followed by DEM and orthoimage creation (:numref:`point2dem`) with::\n\n    point2dem --stereographic                \\\n      --proj-lon 137.402 --proj-lat -4.638   \\\n      --search-radius-factor 5 --orthoimage  \\\n      run/run-PC.tif run/run-L.tif\n     \nHere, the option ``--search-radius-factor 5`` is used to fill the point cloud\nwhen moving further from the rover. A local stereographic projection was used. \n\nThe produced DEMs can be mosaicked together with ``dem_mosaic``\n(:numref:`dem_mosaic`) as::\n\n    dem_mosaic */*DEM.tif -o dem_mosaic.tif\n\nFor the orthoimages, one can use::\n\n    dem_mosaic --first */*DRG.tif -o ortho_mosaic.tif\n\nThe option ``--first`` picks the first encountered image pixel at each location,\nrather than  blending them together which may blur the output mosaic. \n\nSee an illustration in :numref:`csm_msl_figure2`, with the input images in :numref:`csm_msl_figure1`. \n\n.. _csm_msl_multiday:\n\nMulti-day stereo\n^^^^^^^^^^^^^^^^\n\n.. figure:: ../images/msl_multiday.png\n  :name: msl_multiday\n  :alt:  MSL multiday stereo\n\n  A combined DEM and orthoimage produced from 15 stereo pairs from SOL 597 and\n  13 stereo pairs from SOL 603. The misregistration half-way down is not due to\n  mismatch across days but because of insufficient overlap between two image\n  subsets on SOL 603. Here, blue and red correspond to elevations of -5038.921\n  and -5034.866 meters.\n\nIn this example we take advantage of the fact that there is decent overlap\nbetween images acquired on SOL 597 and SOL 603. They both image the same hill,\ncalled *Kimberly*, in Gale crater, from somewhat different perspectives. Hence\nwe combine these datasets to increase the coverage.\n\nGood overlap between different days, or even between consecutive rover\nstops in the same day, is not guaranteed. Sometimes the low-resolution nav cam\nimages (:numref:`low_res_msl`) can help with increasing the overlap and\ncoverage. Lack of good overlap can result in registration errors, as can be seen\nin :numref:`msl_multiday`.\n\nFor a larger and better-behaved dataset it is suggested to consider the images\nfrom SOL 3551 to 3560. Some effort may be needed to select a good subset.\n\nA workflow can be follows. First, individual DEMs were created and mosaicked,\nas in :numref:`csm_msl`. The quality of the produced DEM can be quite uneven,\nespecially far from the camera. \n\nLarge holes in the initial DEM were filled in with the ``dem_mosaic`` option\n``--fill-search-radius`` (:numref:`dem_mosaic_extrapolate`). \n\nThen, it can be made coarser, for example, as::\n\n    gdalwarp -r cubic -tr 0.1 0.1 input.tif output.tif\n\n(This assumes the projection is local stereographic.)\n    \nThis DEM was then blurred a few times with ``dem_mosaic`` option\n``--dem-blur-sigma 10``. This should be repeated until the DEM is smooth enough\nand shows no artifacts. The resulting DEM is called ``dem.tif``.\n\nAll images were mapprojected onto this DEM using the same local stereographic\nprojection, and a resolution of 0.01 m::\n\n    proj=\"+proj=stere +lat_0=-4.638 +lon_0=137.402 +k=1 +x_0=0 +y_0=0 +R=3396190 +units=m +no_defs\"\n    mapproject --tr 0.01 --t_srs \"$proj\" \\\n      dem.tif image.cub image.json image.map.tif\n\nBundle adjustment was run on the desired set of input images and cameras, while\nmaking use of the mapprojected images to find matches::\n\n  dem=dem.tif\n  parallel_bundle_adjust                    \\\n    --image-list images.txt                 \\\n    --camera-list cameras.txt               \\\n    --mapprojected-data-list map_images.txt \\\n    --camera-weight 0                       \\\n    --heights-from-dem $dem                 \\\n    --heights-from-dem-uncertainty 10.0     \\\n    --heights-from-dem-robust-threshold 0.1 \\\n    --auto-overlap-params \"$dem 15\"         \\\n    -o ba/run\n\nIn retrospect, this mapprojection step may be not necessary, and one could\nrun bundle adjustment with original images.\n\nThen ``parallel_stereo`` was run with mapprojected images, with the option\n``--bundle-adjust-prefix ba/run``, to use the bundle-adjusted cameras::\n\n    parallel_stereo                    \\\n      --stereo-algorithm asp_mgm       \\\n      --subpixel-mode 9                \\\n      --max-disp-spread 80             \\\n      --min-triangulation-angle 1.5    \\\n      --bundle-adjust-prefix ba/run    \\\n      left.map.tif right.map.tif       \\\n      left.json right.json run_map/run \\\n      $dem\n\n    point2dem --tr 0.01 --stereographic    \\\n      --proj-lon 137.402 --proj-lat -4.638 \\\n      --errorimage                         \\\n      run_map/run-PC.tif                   \\\n      --orthoimage run_map/run-L.tif\n\nEach run must use a separate output prefix, instead of ``run_map/run``.\n\nHere, the option ``--min-triangulation-angle 1.5`` was highly essential.\nIt filters out far-away and noisy points. \n\nEven with this option, the accuracy of a DEM goes down far from the cameras.\nArtifacts can arise where the same region is seen from two different locations,\nand it is far from either. In this particular example some problematic portions\nwere cut out with ``gdal_rasterize`` (:numref:`gdal_rasterize_example`).\n\nThe produced DEMs were inspected, and the best ones were mosaicked together with\n``dem_mosaic``, as follows::\n\n    dem_mosaic --weights-exponent 0.5 */*DEM.tif -o dem_mosaic.tif\n \nThe option ``--weights-exponent 0.5`` reduced the artifacts in blending.\n\nThe orthoimages were mosaicked with::\n\n    dem_mosaic --first */*DRG.tif -o ortho_mosaic.tif\n    \nIt is suggested to sort the input images for this call from best to worst in\nterms of quality. In particular, the images where the rover looks down rather\ntowards the horizon should be earlier in the list.\n\nSee the produced DEM and orthoimage in :numref:`msl_multiday`.\n\nMapprojection\n^^^^^^^^^^^^^\n\nThe input .cub image files and the camera .json files can be used to create\nmapprojected images with the ``mapproject`` program (:numref:`mapproject`). \nThe DEM for mapprojection can be the one created earlier with ``point2dem``.\nIf a third-party DEM is used, one has to make sure its elevations are consistent\nwith the DEMs produced earlier.\n\nUse the option ``--t_projwin`` to prevent the produced images from extending for\na very long distance towards the horizon.\n\nMSL Mast cameras\n^^^^^^^^^^^^^^^^\n\nThe same procedure works for creating MSL Mast cameras. To run stereo, first use\n``gdal_translate -b 1`` to pull the first band from the input images. This\nworkflow was tested with the stereo pair ``0706ML0029980010304577C00_DRCL`` and\n``0706MR0029980000402464C00_DRCL`` for SOL 706.\n\n.. _low_res_msl:\n\nLow-resolution MSL Nav cam images\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nIn addition to full-resolution Nav camera images (1024 pixels), MSL also\nacquires low-resolution Nav images (256 pixels) at separate times. These have\nthe string ``_D`` as part of their name, instead of ``_F``. Such images were\nvalidated to work, and can produce good DEMs that can plug some gaps in\ncoverage.\n\n.. _csm_state:\n\nCSM model state\n~~~~~~~~~~~~~~~\n\nCSM cameras are stored in JSON files, in one of the following two formats:\n\n* *ISD*: This has the transforms from sensor coordinates to J2000, and from\n  J2000 to ECEF. \n* *Model state*: In this file the above-mentioned transforms are combined, and\n  other information is condensed or removed. \n   \nThe model state files have all the data needed to project ground points into the\ncamera and vice-versa, so they are sufficient for any use in ASP. The model state can\nalso be embedded in ISIS cubes (:numref:`embedded_csm`).\n\nThe `usgscsm_cam_test\n<https://github.com/DOI-USGS/usgscsm/blob/main/docs/source/tools/usgscsm_cam_test.rst>`_\nprogram (shipped with ASP) can read any of these and write back a model state.\n\nASP's bundle adjustment program (:numref:`bundle_adjust`) normally writes plain\ntext ``.adjust`` files that encode how the position and orientation of the\ncameras were modified (:numref:`adjust_files`). If invoked for CSM cameras,\nadditional files with extension ``.adjusted_state.json`` are saved in the same\noutput directory, which contain the model state from the input CSM cameras with\nthe optimization adjustments applied to them. Use zero iterations in\n``bundle_adjust`` to save the states of the original cameras.\n\nThis functionality is implemented for all USGS CSM sensors, so, for ``frame``,\n``linescan``, ``pushframe``, and ``SAR`` models.\n\nThe ``cam_gen`` program can convert several linescan camera model types to CSM\nmodel state (:numref:`cam_gen_linescan`). It can also approximate some Pinhole,\nRPC, or other cameras with CSM frame cameras in model state format\n(:numref:`cam_gen_frame`). \n\nASP's ``parallel_stereo`` and bundle adjustment programs can, in addition to CSM\nISD camera model files, also load such model state files, either as previously\nwritten by ASP or from an external source (it will auto-detect the type from the\nformat of the JSON files). Hence, the model state is a convenient format for\ndata exchange, while being less complex than the ISD format.\n\nIf ``parallel_stereo`` is used to create a point cloud from\nimages and CSM cameras, and then that point cloud has a transform\napplied to it, such as with ``pc_align``, the same transform can be\napplied to the model states for the cameras using ``bundle_adjust``\n(:numref:`ba_pc_align`).\n \nTo evaluate how well the obtained CSM camera approximates the ISIS\ncamera model, run the program ``cam_test`` shipped with ASP\n(:numref:`cam_test`) as follows::\n\n    cam_test --sample-rate 100 --image camera.cub \\\n      --cam1 camera.cub --cam2 camera.json\n\nThe pixel errors are expected to be at most on the order of 0.2\npixels.\n\n.. _embedded_csm:\n\nCSM state embedded in ISIS cubes\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nASP usually expects CSM cameras to be specified in JSON files. It also accepts\nCSM camera model state data (:numref:`csm_state`) embedded in ISIS cubes, if all\nof the following (reasonable) assumptions are satisfied: \n\n * JSON files are not passed in.\n * The ISIS cubes contain CSM model state data (in the ``CSMState`` group).\n * The ``--session-type`` (or ``--t``) option value is not set to ``isis`` (or\n   ``isismapisis``). So, its value should be either ``csm`` (or ``csmmapcsm``),\n   or left blank.\n \nHence, if no CSM data is provided, either in the ISIS cubes or separately\nin JSON files, or ``--session-type`` is set to ``isis`` (or ``isismapisis``),\nASP will use the ISIS camera models.\n\nThe above applies to all ASP tools that read CSM cameras (``parallel_stereo``,\n``bundle_adjust``, ``jitter_solve``, ``mapproject``, ``cam_test``).\n\nIf ``bundle_adjust`` (:numref:`bundle_adjust`) or ``jitter_solve``\n(:numref:`jitter_solve`) is run with CSM cameras, either embedded in ISIS cubes\nor specified separately, and the flag ``--update-isis-cubes-with-csm-state`` is\nset, then the optimized model states will be saved back to the ISIS cubes, while\nthe SPICE and other obsolete information from the cubes will be deleted.\n(Note that `spiceinit\n<https://isis.astrogeology.usgs.gov/Application/presentation/Tabbed/spiceinit/spiceinit.html>`_\ncan restore the cubes.)\n\nSeparate model state files in the JSON format will be saved by ``bundle_adjust``\nas well, as done without this option.\n\nNote that if images are mapprojected with certain camera files, and then those\ncamera files are updated in-place, this will result in wrong results if stereo\nis run with the old mapprojected images and updated cameras.\n  \nThe `csminit\n<https://isis.astrogeology.usgs.gov/Application/presentation/Tabbed/csminit/csminit.html>`_\nprogram can also embed a .json model state file into a .cub file (in ISIS\n9.0.0 and later). Example::\n\n    csminit from = img.cub state = csm.json\n\n"
  },
  {
    "path": "docs/examples/ctx.rst",
    "content": ".. _ctx_example:\n\nMars Reconnaissance Orbiter CTX\n-------------------------------\n\nOverview\n~~~~~~~~\n\nCTX is a moderately difficult camera to work with. The processing time\ncan be pretty long when using the Bayes EM subpixel refinement\n(``subpixel-mode 2``). Otherwise the disparity between images is\nrelatively small, allowing efficient computation and a reasonable\nprocessing time.\n\nIn this example we use mapprojected images, which is the most reliable\nway to align the images for correlation.  Mapprojection is discussed\nin :numref:`mapproj_with_cam2map` and :numref:`mapproj-example`.  Note\nthat mapprojection can slow down the triangulation step, but given\nthat ``parallel_stereo`` performs the triangulation using multiple\nprocesses, that is not a concern.\n\nThis example's recipe is is in the ``examples/CTX`` directory shipped\nwith ASP (type 'make' there to run it).\n\n.. figure:: ../images/examples/ctx/n_terra_meridiani_ctx_combined.png\n   :name: ctx_example_fig\n\n   Example output possible with the CTX imager aboard MRO.\n\nThe images are for the North Terra Meridiani region.\n\nDownload\n~~~~~~~~\n\nDownload the CTX images P02_001981_1823_XI_02N356W.IMG and\nP03_002258_1817_XI_01N356W.IMG from PDS, at:\n\n    https://ode.rsl.wustl.edu/mars/indexproductsearch.aspx \n\nThe download commands are::\n\n    wget https://planetarydata.jpl.nasa.gov/img/data/mro/ctx/mrox_0031/data/P02_001981_1823_XI_02N356W.IMG\n    wget https://planetarydata.jpl.nasa.gov/img/data/mro/ctx/mrox_0042/data/P03_002258_1817_XI_01N356W.IMG\n\nCreation of cub files\n~~~~~~~~~~~~~~~~~~~~~\n\nInstall ISIS (:numref:`planetary_images`). \n\nConvert the .IMG files to ISIS .cub files, initialize the metadata (SPICE), and\ncalibrate::\n\n    ISIS> mroctx2isis from = P02_001981_1823_XI_02N356W.IMG \\\n            to = P02_001981_1823.cub\n    ISIS> mroctx2isis from = P03_002258_1817_XI_01N356W.IMG \\\n            to = P03_002258_1817.cub\n    ISIS> spiceinit from = P02_001981_1823.cub web = true\n    ISIS> spiceinit from = P03_002258_1817.cub web = true\n    ISIS> ctxcal from = P02_001981_1823.cub to = P02_001981_1823.cal.cub\n    ISIS> ctxcal from = P03_002258_1817.cub to = P03_002258_1817.cal.cub\n\nOptionally run ``ctxevenodd`` on the ``cal.cub`` files.\n\nThe `spiceinit\n<https://isis.astrogeology.usgs.gov/8.1.0/Application/presentation/Tabbed/spiceinit/spiceinit.html>`_\ncommand initializes the cub file metadata. The option ``web = true`` fetches the\nneeded data on-the-fly. If it does not work, it is necessary to download this\ndata manually, from the ``mro`` directory of the `ISIS data area\n<https://github.com/DOI-USGS/ISIS3#the-isis-data-area>`_.\n\nRunning stereo\n~~~~~~~~~~~~~~\n\nRun ``parallel_stereo`` (:numref:`parallel_stereo`) and ``point2dem``\n(:numref:`point2dem`)::\n\n    cam2map4stereo.py P02_001981_1823.cal.cub P03_002258_1817.cal.cub\n    parallel_stereo                                      \\\n      --stereo-algorithm asp_mgm --subpixel-mode 9       \\\n      P02_001981_1823.map.cub P03_002258_1817.map.cub    \\\n      results/out\n    point2dem -r mars --stereographic --auto-proj-center \\\n      results/out-PC.tif\n  \nHigher quality results can be obtained by using the ``aspm_mgm`` algorithm and\nmapprojection (:numref:`nextsteps`).\n\nIt is recommended to bundle-adjust the CTX cameras before stereo\n(:numref:`bundle_adjustment`). Then the ``cam2map4stereo.py`` script\ncannot be used, but mapprojection can be done with ``mapproject``\n(:numref:`mapproj-example`).\n\nFurther processing\n~~~~~~~~~~~~~~~~~~\n\nIt is strongly suggested to use CSM camera models for improved performance\n(:numref:`csm`). See :numref:`create_csm_linescan` for how to create CSM camera\nmodels for linescan cameras, including for CTX.\n\nCTX cameras can exhibit jitter. How to correct it is discussed in\n:numref:`jitter_ctx`.\n\nShape-from-Shading with CTX images is illustrated in :numref:`sfs_ctx`.\n\nAutomated Processing of HiRISE and CTX\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nWhile he was at the University of Chicago, David Mayer developed a set of\nscripts for automating Stereo Pipeline for CTX and HiRISE images.  Those\nscripts and more information can now be found at \nhttps://github.com/USGS-Astrogeology/asp_scripts.\n\n"
  },
  {
    "path": "docs/examples/dawn.rst",
    "content": ".. _dawn_isis:\n\nDawn (FC) Framing Camera\n------------------------\n\nThis is a NASA mission to visit two of the largest objects in the\nasteroid belt, Vesta and Ceres. The framing camera on board Dawn is\nquite small and packs only a resolution of 1024x1024 pixels. This means\nprocessing time is extremely short. To its benefit, it seems that the\nmission planners leave the framing camera on taking shots quite rapidly.\nOn a single pass, they seem to usually take a chain of FC images that\nhave a high overlap percentage. This opens the idea of using ASP to\nprocess not only the sequential pairs, but also the wider baseline\nshots. Then someone could potentially average all the DEMs together to\ncreate a more robust data product.\n\nFor this example, we used the images FC21A0010191_11286212239F1T and\nFC21A0010192_11286212639F1T which show the Cornelia crater on\nVesta. We learned about them from the anaglyph shown on the Planetary\nScience Blog :cite:`planetaryblog:vesta`.\n\nA different example (using CSM cameras) is in :numref:`csm_frame`.\n\n.. figure:: ../images/examples/dawn/Vesta_figure.png\n   :name: dawn-nomap-example\n\n   Example colorized height map and ortho image output.\n\nCommands\n~~~~~~~~\n\nFirst you must download and unzip the Dawn FC images from PDS from\nhttps://sbib.psi.edu/data/PDS-Vesta/pds-vesta.html::\n\n    wget https://sbib.psi.edu/data/PDS-Vesta/HAMO/img-1A/FC21A0010191_11286212239F1T.IMG.gz\n    wget https://sbib.psi.edu/data/PDS-Vesta/HAMO/img-1A/FC21A0010192_11286212639F1T.IMG.gz\n    gunzip FC21A0010191_11286212239F1T.IMG.gz\n    gunzip FC21A0010192_11286212639F1T.IMG.gz\n\nThen, these are converted to ISIS .cub files and ``parallel_stereo`` is run::\n\n    dawnfc2isis from=FC21A0010191_11286212239F1T.IMG \\\n      to=FC21A0010191_11286212239F1T.cub target=VESTA\n    dawnfc2isis from=FC21A0010192_11286212639F1T.IMG \\\n      to=FC21A0010192_11286212639F1T.cub  target=VESTA\n    spiceinit from=FC21A0010191_11286212239F1T.cub\n    spiceinit from=FC21A0010192_11286212639F1T.cub\n    \n    parallel_stereo FC21A0010191_11286212239F1T.cub \\\n      FC21A0010192_11286212639F1T.cub stereo/stereo\n      \nA DEM is then created with ``point2dem`` (:numref:`point2dem`)::\n    \n    point2dem stereo-PC.tif --orthoimage stereo-L.tif \\\n      --t_srs \"+proj=eqc +lat_ts=-11.5 +a=280000 +b=229000 +units=m\"\n\nThe option ``target=VESTA`` is necessary with ISIS version 5, and is\nlikely not needed in later versions.\n\nSee :numref:`nextsteps` for a discussion about various\nspeed-vs-quality choices when it comes to stereo algorithms.\n"
  },
  {
    "path": "docs/examples/dg.rst",
    "content": ".. _digital_globe_example:\n\nDigitalGlobe\n------------\n\nProcessing of DigitalGlobe/Maxar images is described extensively in the\ntutorial in :numref:`dg_tutorial`.\n\nSee :numref:`rpc` for how to process DigitalGlobe/Maxar data if using\nthe RPC model instead of the exact linescan one. See :numref:`examples`\nfor other examples.\n"
  },
  {
    "path": "docs/examples/hirise.rst",
    "content": ".. _hirise_example:\n\nMars Reconnaissance Orbiter HiRISE\n----------------------------------\n\nHiRISE is one of the most challenging cameras to use when making 3D\nmodels because HiRISE exposures can be several gigabytes each. Working\nwith this data requires patience as it will take time.\n\nOne important fact to know about HiRISE is that it is composed of\nmultiple linear CCDs that are arranged side by side with some vertical\noffsets. These offsets mean that the CCDs will view some of the same\nterrain but at a slightly different time and a slightly different angle.\nMosaicking the CCDs together to a single image is not a simple process\nand involves living with some imperfections.\n\nOne cannot simply use the HiRISE RDR products, as they do not have the\nrequired geometric stability. Instead, the HiRISE EDR products must be\nassembled using ISIS ``noproj``. The USGS distributes a script in use\nby the HiRISE team that works forward from the team-produced 'balance'\ncubes, which provides a de-jittered, noproj'ed mosaic of a single\nobservation, which is perfectly suitable for use by the Stereo\nPipeline (this script was originally engineered to provide input for\nSOCET SET).  However, the 'balance' cubes are not available to the\ngeneral public, and so we include a program (``hiedr2mosaic.py``\n(:numref:`hiedr2mosaic`), written in Python, that will take PDS\navailable HiRISE EDR products and walk through the processing steps\nrequired to provide good input images for ``parallel_stereo``.\n\nThe program takes all the red CCDs and projects them using the ISIS\n``noproj`` command into the perspective of the RED5 CCD. From there,\n``hijitreg`` is performed to work out the relative offsets between CCDs.\nFinally the CCDs are mosaicked together using the average offset listed\nfrom ``hijitreg`` using the ``handmos`` command, and the mosaic is\nnormalized with ``cubenorm``. Below is an outline of the processing.\n\n::\n\n       hi2isis           # Import HiRISE IMG to Isis\n       hical             # Calibrate\n       histitch          # Assemble whole-CCD images from the channels\n       spiceinit\n       spicefit          # For good measure\n       noproj            # Project all images into perspective of RED5\n       hijitreg          # Work out alignment between CCDs\n       handmos           # Mosaic to single file\n       cubenorm          # Normalize the mosaic\n\nTo use our script, first download a set of HiRISE data. Here is an\nexample, using wget to fetch all RED CCDs for a dataset and process\nthem.\n\n::\n\n     wget -r -l1 -np \\\n       \"http://hirise-pds.lpl.arizona.edu/PDS/EDR/ESP/ORB_029400_029499/ESP_029421_2300/\" \\\n       -A \"*RED*IMG\"\n\nAlternately, you can pass the ``--download-folder`` option to\n``hiedr2mosaic.py`` and pass in the URL of the web page containing the\nEDR files as the only positional argument. This will cause the tool to\nfirst download all of the RED CCD images to the specified folder and\nthen continue with processing.\n\n::\n\n     hiedr2mosaic.py --download-folder hirise_example/ \\\n       http://hirise-pds.lpl.arizona.edu/PDS/EDR/ESP/ORB_029400_029499/ESP_029421_2300/\n\nAssuming you downloaded the files manually, go to the directory\ncontaining the files. You can run the ``hiedr2mosaic.py`` program\nwithout any arguments to view a short help statement, with the ``-h``\noption to view a longer help statement, or just run the program on the\nEDR files like so::\n\n       hiedr2mosaic.py *.IMG\n\nIf you have more than one observation's worth of EDRs in that directory,\nthen limit the program to just one observation's EDRs at a time, e.g.\n``hiedr2mosaic.py PSP_001513_1655*IMG``. If you run into problems, try\nusing the ``-k`` option to retain all of the intermediary image files to\nhelp track down the issue. The ``hiedr2mosaic.py`` program will create a\nsingle mosaic file with the extension ``.mos_hijitreged.norm.cub``. Be\nwarned that the operations carried out by ``hiedr2mosaic.py`` can take\nmany hours to complete on the very large HiRISE images.\n\nIf you get any errors, make sure you have ISIS and its data installed, and the\nenvironmental variable ``ISISDATA`` is set (:numref:`planetary_images`).\n\nAn example of using ASP with HiRISE data is included in the\n``examples/HiRISE`` directory (just type 'make' there).\n\nThe dataset\n~~~~~~~~~~~\n\nHiRISE observations\n`PSP_001513_1655 <http://hirise.lpl.arizona.edu/PSP_001513_1655>`_ and\n`PSP_001777_1650 <http://hirise.lpl.arizona.edu/PSP_001777_1650>`_ are\non the floor of Gusev Crater and cover the area where the MER Spirit\nlanded and has roved, including the Columbia Hills.\n\n.. figure:: ../images/examples/hirise/chills_hirise_combined.png\n   :name: hirise_chills_example\n\n   Example output using HiRISE images PSP_001513_1655 and\n   PSP_001777_1650 of the Columbia Hills.\n\nCommands\n~~~~~~~~\n\nDownload all 20 of the RED EDR ``.IMG`` files for each observation::\n\n    wget -r -l1 -np \\\n      \"http://hirise-pds.lpl.arizona.edu/PDS/EDR/PSP/ORB_001500_001599/PSP_001513_1655/\" \\\n      -A \"*RED*IMG\"\n\n    wget -r -l1 -np \\\n      \"http://hirise-pds.lpl.arizona.edu/PDS/EDR/PSP/ORB_001700_001799/PSP_001777_1650/\" \\\n      -A \"*RED*IMG\"\n\nThen process::\n\n     ISIS> hiedr2mosaic.py PSP_001513_1655_RED*.IMG\n     ISIS> hiedr2mosaic.py PSP_001777_1650_RED*.IMG\n     ISIS> cam2map4stereo.py PSP_001777_1650_RED.mos_hijitreged.norm.cub \\\n                             PSP_001513_1655_RED.mos_hijitreged.norm.cub\n     ISIS> parallel_stereo PSP_001513_1655.map.cub                       \\\n                    PSP_001777_1650.map.cub result/output\n\nSee :numref:`nextsteps` for a discussion about various speed-vs-quality choices.\n\nThe ``corr-kernel`` value can usually be safely reduced to 21 pixels\nto resolve finer detail and faster processing for images with good\ncontrast.\n"
  },
  {
    "path": "docs/examples/historical.rst",
    "content": ".. _kh4:\n\nDeclassified satellite images: KH-4B\n------------------------------------\n\nASP has preliminary support for the declassified high-resolution CORONA KH-4B images. \n\n*This support is very experimental, and likely a lot of work is needed to make\nit work reliably.*\n\nFor the latest suggested processing workflow, in the context of KH-9 images, see\n:numref:`kh9`.\n \nThese images can be processed using either optical bar (panoramic) camera models\nor as pinhole camera models with RPC distortion. Most of the steps are similar\nto the example in :numref:`skysat-example`. The optical bar camera model is\nbased on :cite:`schenk2003rigorous` and :cite:`sohn2004mathematical`, whose\nformat is described in :numref:`panoramic`. For KH-9 images, the\nImprovements suggested in :cite:`ghuffar2022pipeline` are incorporated\n(:numref:`ghuffar_method`).\n\nFetching the data\n~~~~~~~~~~~~~~~~~\n\nKH-4B images are available via the USGS Earth Explorer, at\n\nhttps://earthexplorer.usgs.gov/\n\n(an account is required to download the data). We will work with the\nKH-4B image pair::\n\n    DS1105-2248DF076\n    DS1105-2248DA082\n\nTo get these from Earth Explorer, click on the ``Data Sets`` tab and\nselect the three types of declassified data available, then in the\n``Additional Criteria`` tab choose ``Declass 1``, and in the\n``Entity ID`` field in that tab paste the above frames (if no results\nare returned, one can attempt switching above to ``Declass 2``, etc).\nClicking on the ``Results`` tab presents the user with information about\nthese frames.\n\nClicking on ``Show Metadata and Browse`` for every image will pop-up a\ntable with meta-information. That one can be pasted into a text file,\nnamed for example, ``DS1105-2248DF076.txt`` for the first image, from\nwhich later the longitude and latitude of each image corner will be\nparsed. Then one can click on ``Download Options`` to download the data.\n\n.. _resizing_images:\n\nResizing the images\n~~~~~~~~~~~~~~~~~~~\n\nSometimes the input images can be so large, that either the ASP tools\nor the auxiliary ImageMagick ``convert`` program will fail, or the machine\nwill run out of memory. \n\nIt is suggested to resize the images to a more manageable size, at least for\ninitial processing. This is easiest to do by opening the images in\n``stereo_gui`` (:numref:`stereo_gui`), which will create a pyramid of subsampled\n(\"sub\") images at 1/2 the full resolution, then 1/4th, etc. This resampling is\ndone using local averaging, to avoid aliasing effects.\n\nAlternatively, one can call ``gdal_translate`` (:numref:`gdal_tools`), such as::\n\n    gdal_translate -outsize 25% 25% -r average input.tif output.tif\n\nThis will reduce the image size by a factor of 4. The ``-r average`` option will,\nas before, help avoid aliasing.\n\nA camera model (pinhole or optical bar) created at one resolution can be\nconverted to another resolution by adjusting the ``pitch`` parameter (a higher\nvalue of pitch means bigger pixels so lower resolution). For optical bar cameras\nthe image dimensions and image center need to be adjusted as well, as those are\nin units of pixels.\n\nStitching the images\n~~~~~~~~~~~~~~~~~~~~\n\nEach downloaded image will be made up of 2-4 portions, presumably due to\nthe limitations of the scanning equipment. They can be stitched together\nusing ASP's ``image_mosaic`` tool (:numref:`image_mosaic`).\n\nFor some reason, the KH-4B images are scanned in an unusual order. To\nmosaic them, the last image must be placed first, the next to last\nshould be second, etc. In addition, as seen from the tables of metadata\ndiscussed earlier, some images correspond to the ``Aft`` camera type.\nThose should be rotated 180 degrees after mosaicking, hence below we use\nthe ``--rotate`` flag for that one. The overlap width is manually\ndetermined by looking at two of the sub images in ``stereo_gui``.\n\nWith this in mind, image mosaicking for these two images will happen as\nfollows::\n\n     image_mosaic DS1105-2248DF076_d.tif DS1105-2248DF076_c.tif \\\n       DS1105-2248DF076_b.tif  DS1105-2248DF076_a.tif           \\\n       -o DS1105-2248DF076.tif                                  \\\n       --ot byte --overlap-width 7000 --blend-radius 2000\n     image_mosaic DS1105-2248DA082_d.tif DS1105-2248DA082_c.tif \\\n       DS1105-2248DA082_b.tif  DS1105-2248DA082_a.tif           \\\n       -o DS1105-2248DA082.tif                                  \\\n       --ot byte --overlap-width 7000 --blend-radius 2000       \\\n       --rotate\n\nIn order to process with the optical bar camera model these images need\nto be cropped to remove the most of empty area around the image. The\nfour corners of the valid image area can be manually found by clicking\non the corners in ``stereo_gui``. Note that for some input images it can\nbe unclear where the proper location for the corner is due to edge\nartifacts in the film. Do your best to select the image corners such\nthat obvious artifacts are kept out and all reasonable image sections\nare kept in. \n\nASP provides a simple Python tool called ``historical_helper.py`` to rotate the\nimage so that the top edge is horizontal while also cropping the boundaries.\nThis tool requires installing the ImageMagick software. See\n:numref:`historical_helper` for more details.\n\nPass in the corner coordinates as shown below in the order top-left, top-right,\nbot-right, bot-left (column then row). This is also a good opportunity to\nsimplify the file names going forwards.\n\n::\n\n     historical_helper.py rotate-crop                                     \\\n       --interest-points '4523 1506  114956 1450  114956 9355  4453 9408' \\\n       --input-path DS1105-2248DA082.tif                                  \\\n       --output-path aft.tif\n     historical_helper.py rotate-crop                                     \\\n       --interest-points '6335 1093  115555 1315  115536 9205  6265 8992' \\\n       --input-path DS1105-2248DF076.tif                                  \\\n       --output-path for.tif \n\nSee :numref:`resizing_images` if these steps failed, as perhaps the images\nwere too large.\n\nFetching a ground truth DEM\n~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nTo create initial cameras to use with these images, and to later refine and\nvalidate the terrain model made from them, we will need a ground truth source.\nSeveral good sets of DEMs exist, including SRTM, ASTER, and TanDEM-X\n(:numref:`initial_terrain`). Here we will work with SRTM, which provides DEMs\nwith a 30-meter grid size. The bounds of the region of interest are inferred\nfrom the tables with meta-information from above. \n\nThe SRTM DEM must be adjusted to be relative to the WGS84 datum, as discussed in\n:numref:`conv_to_ellipsoid`.\n\nThe visualization of all images and DEMs can be done in ``stereo_gui``.\n\nCreating camera files\n~~~~~~~~~~~~~~~~~~~~~\n\nASP provides the tool named ``cam_gen`` (:numref:`cam_gen`) that, based on a\ncamera's intrinsics and the positions of the image corners on Earth's surface\nwill create initial camera models that will be the starting point for aligning\nthe cameras.\n\nTo create optical bar camera models, an example camera model file is\nneeded. This needs to contain all of the expected values for the camera,\nthough image_size, image_center, iC, and IR can be any value since they\nwill be recalculated. The pitch is determined by the resolution of the\nscanner used, which is seven microns. The other values are determined by\nlooking at available information about the satellite. For the first\nimage (DS1105-2248DF076) the following values were used::\n\n     VERSION_4\n     OPTICAL_BAR\n     image_size = 13656 1033\n     image_center = 6828 517\n     pitch = 7.0e-06\n     f = 0.61000001430511475\n     scan_time = 0.5\n     forward_tilt = 0.2618\n     iC = -1030862.1946224371 5468503.8842079658 3407902.5154047827\n     iR = -0.95700845635275322 -0.27527006183758934 0.091439638698163225 -0.26345593052063937 0.69302501329766897 -0.67104940475144637 0.1213498543172795 -0.66629027007731101 -0.73575232847574434\n     speed = 7700\n     mean_earth_radius = 6371000\n     mean_surface_elevation = 4000\n     motion_compensation_factor = 1.0\n     scan_dir = right\n\nFor a description of each value, see :numref:`panoramic`. For\nthe other image (aft camera) the forward tilt was set to -0.2618 and\nscan_dir was set to 'left'. The correct values for scan_dir (left or\nright) and use_motion_compensation (1.0 or -1.0) are not known for\ncertain due to uncertainties about how the images were recorded and may\neven change between launches of the KH-4 satellite. You will need to\nexperiment to see which combination of settings produces the best\nresults for your particular data set.\n\nThe metadata table from Earth Explorer has the following entries for\nDS1105-2248DF076::\n\n     NW Corner Lat dec   31.266\n     NW Corner Long dec  99.55\n     NE Corner Lat dec   31.55\n     NE Corner Long dec  101.866\n     SE Corner Lat dec   31.416\n     SE Corner Long dec  101.916\n     SW Corner Lat dec   31.133\n     SW Corner Long dec  99.55\n\nThese correspond to the upper-left, upper-right, lower-right, and\nlower-left pixels in the image. We will invoke ``cam_gen`` as follows::\n\n     cam_gen --sample-file sample_kh4b_for_optical_bar.tsai     \\\n       --camera-type opticalbar                                 \\\n       --lon-lat-values                                         \\\n       '99.55 31.266 101.866 31.55 101.916 31.416 99.55 31.133' \\\n       for.tif --reference-dem dem.tif --refine-camera -o for.tsai\n\n     cam_gen --sample-file sample_kh4b_aft_optical_bar.tsai     \\\n       --camera-type opticalbar                                 \\\n       --lon-lat-values                                         \\\n       '99.566 31.266 101.95 31.55 101.933 31.416 99.616 31.15' \\\n       aft.tif --reference-dem dem.tif --refine-camera -o aft.tsai\n\nIt is very important to note that if, for example, the upper-left image\ncorner is in fact the NE corner from the metadata, then that corner\nshould be the first in the longitude-latitude list when invoking this\ntool.\n\nBundle adjustment and stereo\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nBefore processing the input images it is a good idea to experiment with\nreduced resolution copies in order to accelerate testing. You can easily\ngenerate reduced resolution copies of the images using ``stereo_gui`` as\nshown below. \n\n::\n\n     stereo_gui for.tif aft.tif --create-image-pyramids-only\n     ln -s for_sub8.tif  for_small.tif\n     ln -s aft_sub8.tif  aft_small.tif\n     cp for.tsai for_small.tsai\n     cp aft.tsai aft_small.tsai\n\nThe new .tsai files need to be adjusted by updating the image_size,\nimage_center (divide by resolution factor, which is 8 here), and the\npitch (multiply by the resolution factor) to account for the\ndownsample amount.\n\nYou can now run bundle adjustment on the downsampled images::\n\n     bundle_adjust for_small.tif aft_small.tif \\\n       for_small.tsai aft_small.tsai           \\\n       -t opticalbar                           \\\n       --max-iterations 100                    \\\n       --camera-weight 0                       \\\n       --tri-weight 0.1                        \\\n       --tri-robust-threshold 0.1              \\\n       --disable-tri-ip-filter                 \\\n       --skip-rough-homography                 \\\n       --inline-adjustments                    \\\n       --ip-detect-method 1                    \\\n       --datum WGS84                           \\\n       -o ba_small/run\n\nValidation of cameras\n~~~~~~~~~~~~~~~~~~~~~\n\nAn important sanity check is to mapproject the images with these\ncameras, for example as::\n\n     mapproject dem.tif for.tif for.tsai for.map.tif\n     mapproject dem.tif aft.tif aft.tsai aft.map.tif\n\nand then overlay the mapprojected images on top of the DEM in\n``stereo_gui``. If it appears that the images were not projected\ncorrectly, or there are gross alignment errors, likely the order of\nimage corners was incorrect. At this stage it is not unusual that the\nmapprojected images are somewhat shifted from where they should be,\nthat will be corrected later.\n\nThis exercise can be done with the small versions of the images and\ncameras, and also before and after bundle adjustment.\n\nRunning stereo\n~~~~~~~~~~~~~~\n\nStereo with raw images::\n\n     parallel_stereo --stereo-algorithm asp_mgm                \\\n       for_small.tif aft_small.tif                             \\\n       ba_small/run-for_small.tsai ba_small/run-aft_small.tsai \\\n       --subpixel-mode 9                                       \\\n       --alignment-method affineepipolar                       \\\n       -t opticalbar --skip-rough-homography                   \\\n       --disable-tri-ip-filter                                 \\\n       --ip-detect-method 1                                    \\\n       stereo_small_mgm/run\n\nIt is strongly suggested to run stereo with *mapprojected images*, per\n:numref:`mapproj-example`. Ensure the mapprojected images have the same\nresolution, and overlay them on top of the initial DEM first, to check for gross\nmisalignment.\n\nSee :numref:`nextsteps` for a discussion about various speed-vs-quality choices\nin stereo.\n\n.. _kh4_align:\n\nDEM generation and alignment\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nNext, a DEM is created, with an auto-determined UTM or polar\nstereographic projection (:numref:`point2dem`)::\n\n     point2dem --auto-proj-center \\\n       --tr 30 stereo_small_mgm/run-PC.tif\n\nThe grid size (``--tr``) is in meters. \n\nThe produced DEM could be rough. It is sufficient however to align to the SRTM\nDEM by hillshading the two and finding matching features\n(:numref:`pc_hillshade`)::\n\n     pc_align --max-displacement -1                    \\\n       --initial-transform-from-hillshading similarity \\\n       --save-transformed-source-points                \\\n       --num-iterations 0                              \\\n       dem.tif stereo_small_mgm/run-DEM.tif            \\\n       -o stereo_small_mgm/run\n\nHere one should choose carefully the transform type. The options are\n``translation``, ``rigid``, and ``similarity`` (:numref:`pc_align_options`).\n\nThe resulting aligned cloud can be regridded as::\n\n     point2dem --auto-proj-center \\\n       --tr 30                    \\\n       stereo_small_mgm/run-trans_source.tif\n\nConsider examining in ``stereo_gui`` the left and right hillshaded files produced\nby ``pc_align`` and the match file among them, to ensure tie points among\nthe two DEMs were found properly (:numref:`stereo_gui_view_ip`). \n\nThere is a chance that this may fail as the two DEMs to align could be too\ndifferent. In that case, the two DEMs can be regridded as in :numref:`regrid`,\nsay with a grid size of 120 meters. The newly obtained coarser SRTM DEM can be\naligned to the coarser DEM from stereo.\n\nThe alignment transform could later be refined or applied to the initial clouds\n(:numref:`prevtrans`).\n\nFloating the intrinsics\n~~~~~~~~~~~~~~~~~~~~~~~\n\nThe obtained alignment transform can be used to align the cameras as\nwell, and then one can experiment with floating the intrinsics.\nSee :numref:`intrinsics_ground_truth`.\n\nModeling the camera models as pinhole cameras with RPC distortion\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nOnce sufficiently good optical bar cameras are produced and the\nDEMs from them are reasonably similar to some reference terrain\nground truth, such as SRTM, one may attempt to improve the accuracy\nfurther by modeling these cameras as simple pinhole models with the\nnonlinear effects represented as a distortion model given by Rational\nPolynomial Coefficients (RPC) of any desired degree (see\n:numref:`pinholemodels`). The best fit RPC representation can be\nfound for both optical bar models, and the RPC can be further\noptimized using the reference DEM as a constraint.\n\nTo convert from optical bar models to pinhole models with RPC distortion\none does::\n\n    convert_pinhole_model for_small.tif for_small.tsai \\\n      -o for_small_rpc.tsai --output-type RPC          \\\n      --camera-to-ground-dist 300000                   \\\n      --sample-spacing 50 --rpc-degree 2\n\nand the same for the other camera. Here, one has to choose carefully\nthe camera-to-ground-distance. Above it was set to 300 km.  \n\nThe obtained cameras should be bundle-adjusted as before. One can\ncreate a DEM and compare it with the one obtained with the earlier\ncameras. Likely some shift in the position of the DEM will be present,\nbut hopefully not too large. The ``pc_align`` tool can be used to make\nthis DEM aligned to the reference DEM.\n\nNext, one follows the same process as outlined in :numref:`skysat` and\n:numref:`floatingintrinsics` to refine the RPC coefficients. It is suggested to\nuse the ``--heights-from-dem`` option as in that example. Here we use the more\ncomplicated ``--reference-terrain`` option. \n\nWe will float the RPC coefficients of the left and right images independently,\nas they are unrelated. The initial coefficients must be manually modified to be\nat least 1e-7, as otherwise they will not be optimized. In the latest builds\nthis is done automatically by ``bundle_adjust`` (option ``--min-distortion``).\n\nThe command we will use is::\n\n     bundle_adjust for_small.tif aft_small.tif                       \\\n       for_small_rpc.tsai aft_small_rpc.tsai                         \\\n       -o ba_rpc/run --max-iterations 200                            \\\n       --camera-weight 0 --disable-tri-ip-filter                     \\\n       --skip-rough-homography --inline-adjustments                  \\\n       --ip-detect-method 1 -t nadirpinhole --datum WGS84            \\\n       --force-reuse-match-files --reference-terrain-weight 1000     \\\n       --parameter-tolerance 1e-12 --max-disp-error 100              \\\n       --disparity-list stereo/run-unaligned-D.tif                   \\\n       --max-num-reference-points 40000 --reference-terrain srtm.tif \\\n       --solve-intrinsics                                            \\\n       --intrinsics-to-share 'focal_length optical_center'           \\\n       --intrinsics-to-float other_intrinsics --robust-threshold 10  \\\n       --initial-transform pc_align/run-transform.txt\n\nHere it is suggested to use a match file with dense interest points\n(:numref:`dense_ip`). The initial transform is the transform written by\n``pc_align`` applied to the reference terrain and the DEM obtained with the\ncamera models ``for_small_rpc.tsai`` and ``aft_small_rpc.tsai`` (with the\nreference terrain being the first of the two clouds passed to the alignment\nprogram). The unaligned disparity in the disparity list should be from the\nstereo run with these initial guess camera models (hence stereo should be used\nwith the ``--unalign-disparity`` option). It is suggested that the optical\ncenter and focal lengths of the two cameras be kept fixed, as RPC distortion\nshould be able model any changes in those quantities as well.\n\nOne can also experiment with the option ``--heights-from-dem`` instead\nof ``--reference-terrain``. The former seems to be able to handle better\nlarge height differences between the DEM with the initial cameras and\nthe reference terrain, while the latter is better at refining the\nsolution.\n\nThen one can create a new DEM from the optimized camera models and see\nif it is an improvement.\n\nAnother example of using RPC and an illustration is in :numref:`kh7_fig`.\n\n.. _kh7:\n\nDeclassified satellite images: KH-7\n-----------------------------------\n\nKH-7 was an effective observation satellite that followed the Corona program. It\ncontained an index (frame) camera and a single strip (pushbroom) camera. \n\nASP has *no exact camera model for this camera.* An RPC distortion model can be\nfit as in :numref:`dem2gcp`. See a figure in :numref:`kh7_fig`. \n\n*This produces an approximate solution, which goes the right way but is likely\nnot good enough.*\n\nFor the latest suggested processing workflow, see the section on KH-9 images\n(:numref:`kh9`).\n\nFor this example we find the following images in Earth Explorer\ndeclassified collection 2::\n\n     DZB00401800038H025001\n     DZB00401800038H026001\n\nMake note of the latitude/longitude corners of the images listed in Earth Explorer,\nand note which image corners correspond to which compass locations.\n\nIt is suggested to resize the images to a more manageable size. This can\navoid failures in the processing below (:numref:`resizing_images`).\n\nWe will merge the images with the ``image_mosaic`` tool. These images have a\nlarge amount of overlap and we need to manually lower the blend radius so that\nwe do not have memory problems when merging the images. Note that the image\norder is different for each image.\n\n::\n\n     image_mosaic DZB00401800038H025001_b.tif  DZB00401800038H025001_a.tif \\\n       -o DZB00401800038H025001.tif  --ot byte --blend-radius 2000         \\\n       --overlap-width 10000\n     image_mosaic DZB00401800038H026001_a.tif  DZB00401800038H026001_b.tif \\\n       -o DZB00401800038H026001.tif  --ot byte --blend-radius 2000         \\\n       --overlap-width 10000\n\nFor this image pair we will use the following SRTM images from Earth\nExplorer::\n\n     n22_e113_1arc_v3.tif\n     n23_e113_1arc_v3.tif\n     dem_mosaic n22_e113_1arc_v3.tif n23_e113_1arc_v3.tif -o srtm_dem.tif\n\nThe SRTM DEM must be first adjusted to be relative to WGS84\n(:numref:`conv_to_ellipsoid`).\n\nNext we crop the input images so they only contain valid image area. We\nuse, as above, the ``historical_helper.py`` tool. See :numref:`historical_helper`\nfor how to install the ImageMagick software that it needs.\n\n::\n\n     historical_helper.py rotate-crop                                    \\\n       --interest-points '1847 2656  61348 2599  61338 33523  1880 33567'\\\n       --input-path DZB00401800038H025001.tif                            \\\n       --output-path 5001.tif\n     historical_helper.py rotate-crop                                    \\\n       --interest-points '566 2678  62421 2683  62290 33596  465 33595'  \\\n       --input-path DZB00401800038H026001.tif                            \\\n       --output-path 6001.tif\n\nWe will try to approximate the KH-7 camera using a pinhole model. The\npitch of the image is determined by the scanner, which is 7.0e-06 meters\nper pixel. The focal length of the camera is reported to be 1.96 meters,\nand we will set the optical center at the center of the image. We need\nto convert the optical center to units of meters, which means\nmultiplying the pixel coordinates by the pitch to get units of meters.\n\nUsing the image corner coordinates which we recorded earlier, use the\n``cam_gen`` tool (:numref:`cam_gen`) to generate camera models for each image,\nbeing careful of the order of coordinates.\n\n::\n\n     cam_gen --pixel-pitch 7.0e-06 --focal-length 1.96                             \\\n       --optical-center 0.2082535 0.1082305                                        \\\n       --lon-lat-values '113.25 22.882 113.315 23.315 113.6 23.282 113.532 22.85'  \\\n       5001.tif --reference-dem srtm_dem.tif --refine-camera -o 5001.tsai\n     cam_gen --pixel-pitch 7.0e-06 --focal-length 1.96                             \\\n       --optical-center 0.216853 0.108227                                          \\\n       --lon-lat-values '113.2 22.95 113.265 23.382 113.565 23.35 113.482 22.915'  \\\n       6001.tif --reference-dem srtm_dem.tif --refine-camera -o 6001.tsai\n\nA quick way to evaluate the camera models is to use the\n``camera_footprint`` tool to create KML footprint files, then look at\nthem in Google Earth. For a more detailed view, you can mapproject them\nand overlay them on the reference DEM in ``stereo_gui``.\n\n::\n\n     camera_footprint 5001.tif  5001.tsai  --datum  WGS_1984 --quick \\\n       --output-kml  5001_footprint.kml -t nadirpinhole --dem-file srtm_dem.tif\n     camera_footprint 6001.tif  6001.tsai  --datum  WGS_1984 --quick \\\n       --output-kml  6001_footprint.kml -t nadirpinhole --dem-file srtm_dem.tif\n\nThe output files from ``cam_gen`` will be roughly accurate but they may\nstill be bad enough that ``bundle_adjust`` has trouble finding a\nsolution. One way to improve your initial models is to use ground\ncontrol points. \n\nFor this test case it was possible to match features along the rivers to the\nsame rivers in a hillshaded version of the reference DEM. Three sets of GCPs\n(:numref:`bagcp`) were created, one for each image individually and a joint set for\nboth images. Then ``bundle_adjust`` was run individually for each camera using\nthe GCPs.\n\n::\n\n    bundle_adjust 5001.tif 5001.tsai gcp_5001.gcp \\\n      -t nadirpinhole --inline-adjustments        \\\n      --num-passes 1 --camera-weight 0            \\\n      --ip-detect-method 1 -o bundle_5001/out     \\\n      --max-iterations 30 --fix-gcp-xyz\n\n    bundle_adjust 6001.tif 6001.tsai gcp_6001.gcp \\\n      -t nadirpinhole --inline-adjustments        \\\n      --num-passes 1 --camera-weight 0            \\\n      --ip-detect-method 1 -o bundle_6001/out     \\\n      --max-iterations 30 --fix-gcp-xyz\n\nCheck the GCP pixel residuals at the end of the produced residual file\n(:numref:`ba_err_per_point`).\n\nAt this point it is a good idea to experiment with lower-resolution copies of\nthe input images before running processing with the full size images. You can\ngenerate these using ``stereo_gui``\n::\n\n     stereo_gui 5001.tif 6001.tif --create-image-pyramids-only\n     ln -s 5001_sub16.tif  5001_small.tif\n     ln -s 6001_sub16.tif  6001_small.tif\n     \nMake copies of the camera files for the smaller images::\n     \n     cp 5001.tsai  5001_small.tsai\n     cp 6001.tsai  6001_small.tsai\n\nMultiply the pitch in the produced cameras by the resolution scale factor.\n\nNow we can run ``bundle_adjust`` and ``parallel_stereo``. If you are using the\nGCPs from earlier, the pixel values will need to be scaled to match the\nsubsampling applied to the input images.\n\n::\n\n    bundle_adjust 5001_small.tif 6001_small.tif              \\\n       bundle_5001/out-5001_small.tsai                       \\\n       bundle_6001/out-6001_small.tsai                       \\\n       gcp_small.gcp -t nadirpinhole -o bundle_small_new/out \\\n       --force-reuse-match-files --max-iterations 30         \\\n       --camera-weight 0 --disable-tri-ip-filter             \\\n       --skip-rough-homography                               \\\n       --inline-adjustments --ip-detect-method 1             \\\n       --datum WGS84 --num-passes 2\n\n    parallel_stereo --alignment-method homography                      \\\n      --skip-rough-homography --disable-tri-ip-filter                  \\\n      --ip-detect-method 1 --session-type nadirpinhole                 \\\n      --stereo-algorithm asp_mgm --subpixel-mode 9                     \\\n      5001_small.tif 6001_small.tif                                    \\\n      bundle_small_new/out-out-5001_small.tsai                         \\\n      bundle_small_new/out-out-6001_small.tsai                         \\\n      st_small_new/out\n\nA DEM is created with ``point2dem`` (:numref:`point2dem`)::\n\n    point2dem --auto-proj-center st_small_new/out-PC.tif\n\nThe above may produce a DEM with many holes. It is strongly suggested to run\nstereo with *mapprojected images* (:numref:`mapproj-example`). Use the ``asp_mgm``\nalgorithm. See also :numref:`nextsteps` for a discussion about various\nspeed-vs-quality choices in stereo.\n\n.. figure:: ../images/kh7_dem.png\n   :name: kh7_fig\n   \n   An example of a DEM created from KH-7 images after modeling distortion with RPC\n   of degree 3 (within the green polygon), on top of a reference terrain. GCP were used (:numref:`dem2gcp`), as well as mapprojected images and the ``asp_mgm``\n   algorithm. \n\nFitting an RPC model to the cameras with the help of GCP created by the\n``dem2gcp`` program (:numref:`dem2gcp`) can greatly help improve the produced\nDEM. See an illustration in :numref:`kh7_fig`, and difference maps in\n:numref:`kh7_orig_vs_opt`.\n\n.. _kh9:\n\nDeclassified satellite images: KH-9\n-----------------------------------\n\nThe KH-9 satellite contained one frame camera and two panoramic cameras,\none pitched forward and one aft.\n\nThe frame camera is a regular pinhole model (:numref:`pinholemodels`). \nThe images produced with it could be handled as for KH-7 (:numref:`kh7`), \nSkySat (:numref:`skysat`), or using Structure-from-Motion (:numref:`sfm`). \n\nThis example describes how to process the KH-9 panoramic camera images. \nThe workflow below is more recent than the one for KH-4B (:numref:`kh4`)\nor KH-7, and it requires the latest build (:numref:`release`).\n\n*The ASP support for panoramic images is highly experimental and is work in\nprogress.*\n\nImage mosaicking\n~~~~~~~~~~~~~~~~\n\nFor this example we use the following images from the Earth Explorer\ndeclassified collection 3::\n\n     D3C1216-200548A041\n     D3C1216-200548F040\n\nMake note of the latitude/longitude corners of the images listed in Earth\nExplorer and corresponding raw image corners. \n\nIt is suggested to resize the images to a more manageable size, such as 1/16th\nthe original image resolution, at least to start with\n(:numref:`resizing_images`). This can avoid failures with ImageMagick in the\nprocessing below when the images are very large.\n\nWe merge the images with ``image_mosaic`` (:numref:`image_mosaic`)::\n\n    image_mosaic                                        \\\n      D3C1216-200548F040_a.tif D3C1216-200548F040_b.tif \\\n      D3C1216-200548F040_c.tif D3C1216-200548F040_d.tif \\\n      D3C1216-200548F040_e.tif D3C1216-200548F040_f.tif \\\n      D3C1216-200548F040_g.tif D3C1216-200548F040_h.tif \\\n      D3C1216-200548F040_i.tif D3C1216-200548F040_j.tif \\\n      D3C1216-200548F040_k.tif D3C1216-200548F040_l.tif \\\n      --ot byte --overlap-width 3000                    \\\n      -o D3C1216-200548F040.tif\n      \n    image_mosaic                                        \\\n      D3C1216-200548A041_a.tif D3C1216-200548A041_b.tif \\\n      D3C1216-200548A041_c.tif D3C1216-200548A041_d.tif \\\n      D3C1216-200548A041_e.tif D3C1216-200548A041_f.tif \\\n      D3C1216-200548A041_g.tif D3C1216-200548A041_h.tif \\\n      D3C1216-200548A041_i.tif D3C1216-200548A041_j.tif \\\n      D3C1216-200548A041_k.tif --overlap-width 1000     \\\n      --ot byte -o D3C1216-200548A041.tif --rotate\n\nThese images also need to be cropped to remove most of the area around\nthe images::\n\n     historical_helper.py rotate-crop      \\\n       --input-path D3C1216-200548F040.tif \\\n       --output-path for.tif               \\\n       --interest-points '2414 1190 346001 1714 \n                          345952 23960 2356 23174'\n     historical_helper.py rotate-crop      \\\n       --input-path D3C1216-200548A041.tif \\\n       --output-path aft.tif               \\\n       --interest-points '1624 1333 346183 1812 \n                          346212 24085  1538 23504'\n\nWe used, as above, the ``historical_helper.py`` tool. See\n:numref:`historical_helper` for how to install the ImageMagick software that it\nneeds.\n\nReference terrain\n~~~~~~~~~~~~~~~~~\n\nFetch a reference DEM for the given site (:numref:`initial_terrain`). It\nshould be converted to be relative to the WGS84 datum\n(:numref:`conv_to_ellipsoid`) and to a local UTM projection with ``gdalwarp``\nwith bicubic interpolation (:numref:`gdal_tools`). We will call this terrain\n``ref.tif``. This terrain will help with registration later.\n\nFor the purpose of mapprojection, the terrain should be blurred to attenuate any\nmisalignment (:numref:`dem_prep`). The blurred version of this will be called\n``ref_blur.tif``.\n\n.. _ghuffar_method:\n\nModeling the cameras\n~~~~~~~~~~~~~~~~~~~~\n\nWe follow the approach in :cite:`ghuffar2022pipeline`. This work\nmakes the following additional improvements as compared to the prior \nefforts in :numref:`kh4`:\n\n - The satellite velocity is a 3D vector, which is solved for independently,\n   rather than being tied to satellite pose and camera tilt.\n - It is not assumed that the satellite pose is fixed during scanning. Rather,\n   there are two camera poses, for the starting and ending scan times, with\n   *slerp* interpolation in between.    \n - The scan time and scalar speed are absorbed into the motion compensation factor.\n - The forward tilt is not modeled, hence only the camera pose is taken into \n   account, rather than the satellite pose and its relation to the camera pose.  \n\nSample camera format\n~~~~~~~~~~~~~~~~~~~~\n\nIt is strongly advised to work at 1/16th resolution of the original images, as\nthe images are very large. Later, any optimized cameras can be adjusted to be at\na different resolution, as documented in :numref:`resizing_images`.\n\nAt 1/16th the resolution, a sample Panoramic (OpticalBar) camera file, before\nrefinements of intrinsics and extrinsics, has the form::\n\n  VERSION_4\n  OPTICAL_BAR\n  image_size = 21599 1363\n  image_center = 10799.5 681.5\n  pitch = 0.000112\n  f = 1.52\n  scan_time = 1\n  forward_tilt = 0\n  iC = 0 0 0 \n  iR = 1 0 0 0 1 0 0 0 1\n  speed = 0\n  mean_earth_radius = 6371000\n  mean_surface_elevation = 0\n  motion_compensation_factor = 0\n  scan_dir = right\n  velocity = 0 0 0\n\nWe call this file ``sample_sub16.tsai``. \n\nThere are several notable differences with the optical bar models before the\nworkflow and modeling was updated (:numref:`ghuffar_method`). Compared to the\nsample file in :numref:`panoramic`, the scan time, forward tilt, speed, mean\nsurface elevation, and motion compensation factor are set to nominal values.\n\nThe additional ``velocity`` field is present, which for now has zero values. If\nthis field is not set, the prior optical bar logic will be invoked. Hence\ninternally both implementations are still supported.\n\nThe ``iR`` matrix has the starting camera pose. If the ending camera pose is not\nprovided, it is assumed to be the same as the starting one. When an optical bar\nmodel is saved, the ending camera pose will be added as a line of the form::\n\n  final_pose = 0.66695010211673467 2.3625446924332656 1.5976801601116621\n\nThis represents a rotation in the axis-angle format, unlike ``iR`` which is\nshown in regular matrix notation. The discrepancy in notation is for backward\ncompatibility.\n\nThe focal length is 1.52 m, per existing documentation. The pixel pitch (at\nwhich the film is scanned) is known to be 7e-6 m. Here it is multiplied by 16 to\naccount for the fact that we work at 1/16th the resolution of the original\nimages.\n\nThe image size comes from the image file (at the current lower resolution). The\nimage center is set to half the image size.\n\nCreation of initial cameras\n~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nCamera files are generated using ``cam_gen`` (:numref:`cam_gen`), with the help\nof the sample file from above. Let the Fwd image at 1/16th resolution be\ncalled ``fwd_sub16.tif``. The command is::\n\n    cam_gen                               \\\n      --sample-file sample_sub16.tsai     \\\n      --camera-type opticalbar            \\\n      --lon-lat-values                    \\\n        '-151.954 61.999 -145.237 61.186 \n         -145.298 60.944 -152.149 61.771' \\\n      fwd_sub16.tif                       \\\n      --reference-dem ref.tif             \\\n      --refine-camera                     \\\n      --gcp-file fwd_sub16.gcp            \\\n      -o fwd_sub16.tsai\n\nThis creates the camera file ``fwd_sub16.tsai`` and the GCP file\n``fwd_sub16.gcp``.\n\nThe historical images are often cropped after being scanned, and the image size\nand optical center (image center) will be different for each image. The command\nabove will write the correct image size in the output file, and will set the\noptical center to half of that. Hence, the entries for these in the sample file\nwill be ignored.\n\nAn analogous command is run for the Aft camera.\n\nThe longitude-latitude corners must correspond to the expected traversal of\nthe raw (non-mapprojected) image corners (:numref:`cam_gen_pinhole`). This\nrequires some care, especially given that the Fwd and Aft images have 180\ndegrees of rotation between them.\n\nValidation of guessed cameras\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe produced cameras should be verified by mapprojection (:numref:`mapproject`)::\n\n    mapproject       \\\n      --tr 12        \\\n      ref_blur.tif   \\\n      fwd_sub16.tif  \\\n      fwd_sub16.tsai \\\n      fwd_sub16.map.tif\n\nThe grid size (``--tr``) is in meters. Here, it was known from existing information \nthat the ground sample distance at full resolution was about 0.75 m / pixel.\nThis was multiplied by 16 given the lower resolution used here. If not known,\nthe grid size can be auto-guessed by this program.\n\nThe Fwd and Aft mapprojected images should be overlaid with georeference\ninformation on top of the reference DEM. It is expected that the general\nposition and orientation would be good, but there would be a lot of warping due\nto unknown intrinsics.\n\n.. figure:: ../images/kh9_initial_cameras.png\n   :name: kh9_init_fig\n   \n   An example of Fwd and Aft mapprojected images. Notable warping is observed.\n\nOptimization of cameras\n~~~~~~~~~~~~~~~~~~~~~~~\n\nWe will follow the bundle adjustment approach outlined in\n:numref:`heights_from_dem`.\n\nThe quantities to be optimized are the extrinsics (camera position and starting\norientation), and the intrinsics, which include the image center (optical\noffset), focal length, motion compensation factor, velocity vector, and the ending\norientation. The last three fall under the ``other_intrinsics`` category in\nbundle adjustment. The command can be as follows::\n\n    bundle_adjust                               \\\n      fwd_sub16.tif aft_sub16.tif               \\\n      fwd_sub16.tsai aft_sub16.tsai             \\\n      --mapprojected-data                       \\\n        'fwd_sub16.map.tif aft_sub16.map.tif'   \\\n      fwd_sub16.gcp aft_sub16.gcp               \\\n      --inline-adjustments                      \\\n      --solve-intrinsics                        \\\n      --intrinsics-to-float other_intrinsics    \\\n      --intrinsics-to-share none                \\\n      --heights-from-dem ref.tif                \\\n      --heights-from-dem-uncertainty 10000      \\\n      --ip-per-image 100000                     \\\n      --ip-inlier-factor 1000                   \\\n      --remove-outliers-params '75 3 1000 1000' \\\n      --num-iterations 250                      \\\n      -o ba/run\n\nWe passed in the GCP files produced earlier, that have information about the\nground coordinates of image corners. We made use of mapprojected images for\ninterest point matching (:numref:`mapip`).\n\nThe values for ``--heights-from-dem-uncertainty``, ``--ip-per-image``,\n``--ip-inlier-factor``, and ``--remove-outliers-params`` are much larger than\nusual, because of the very large distortion seen above. Otherwise too many valid\ninterest points may be eliminated. Later these parameters can be tightened.\n\nCheck the produced clean match files with ``stereo_gui``\n(:numref:`stereo_gui_pairwise_matches`). It is very important to have many of\nthem in the corners and roughly uniformly distributed across the images. One\ncould also consider adding the ``--ip-per-tile`` and ``--matches-per-tile``\nparameters (:numref:`ba_ip`). These would need some tuning at each resolution to\nensure the number of matches is not overly large. \n\nThe updated cameras will be saved in the output directory. These should be\nvalidated by mapprojection as before.\n\nWe did not optimize for now the focal length and optical center, as they\nwere known more reliably than the other intrinsics. All these can be optimized\ntogether in a subsequent pass.\n\nSee :numref:`bundle_adjust` for more information about ``bundle_adjust`` and\nthe various report files that are produced.\n\n.. figure:: ../images/kh9_opt_cameras.png\n   :name: kh9_opt_fig\n   \n   Fwd and Aft mapprojected images, after optimization of intrinsics. The images \n   are much better aligned.\n\nCreation of a terrain model\n~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nInspect the mapprojected images created with the new cameras. They will likely\nbe more consistent than before. Look at the convergence angles report\n(:numref:`ba_conv_angle`). Hopefully this angle will have a reasonable value,\nsuch as between 10 and 40 degrees.\n\nRun stereo and DEM creation with the mapprojected images and the ``asp_mgm``\nalgorithm. It is suggested to follow very closely the steps in\n:numref:`mapproj-example`.\n\nFixing horizontal registration errors\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nIt is quite likely that the mapprojected images after the last bundle adjustment\nare much improved, but the stereo terrain model still shows systematic issues\nrelative to the reference terrain. \n\nThen, the ``dem2gcp`` program (:numref:`dem2gcp`) can be invoked to create GCP\nthat can fix this misregistration. Pass to this program the option\n``--max-disp`` if the disparity that is an input to that tool is not accurate in\nflat areas. \n\nBundle adjustment can happen with these dense GCP, while optimizing all\nintrinsics and extrinsics. We will share none of the intrinsics (the optical\ncenter, at least, must be unique for each individual image due to how they are\nscanned and cropped). Afterwards, a new stereo DEM can be created as before.\n\nIf happy enough with results at a given resolution, the cameras can be rescaled\nto a finer resolution and the process continued. See :numref:`resizing_images`\nfor how a camera model can be modified to work at a different resolution.\n\nFixing local warping\n~~~~~~~~~~~~~~~~~~~~\n\nThe panoramic (OpticalBar) camera model we worked with may not have enough\ndegrees of freedom to fix issues with local warping that arise during the\nstorage of the film having the historical images or its subsequent digitization.\n\nTo address that, the cameras can be converted to CSM linescan format (and the\nimages rotated by 90 degrees). See :numref:`opticalbar2csm`. \n\nThen, the jitter solver (:numref:`jitter_solve`) can be employed. It is\nsuggested to set ``--num-lines-per-position`` and\n``--num-lines-per-orientation`` for this program so that there exist about 10-40\nposition and orientation samples along the scan direction.\n\nThis program can also accept GCP files, just like ``bundle_adjust``.\nWe invoked it as follows::\n\n    jitter_solve                           \\\n      fwd_sub16.tif aft_sub16.tif          \\\n      fwd_sub16.json aft_sub16.json        \\\n      fwd_sub16.gcp aft_sub16.gcp          \\\n      --match-files-prefix ba/run          \\\n      --num-lines-per-position 1000        \\\n      --num-lines-per-orientation 1000     \\\n      --heights-from-dem ref.tif           \\\n      --heights-from-dem-uncertainty 500   \\\n      --max-initial-reprojection-error 100 \\\n      --num-iterations 100                 \\\n      -o jitter_sub16/run\n\nThe GCP had a sigma of 100 or so, so less uncertainty than in\n``--heights-from-dem-uncertainty``, by a notable factor. At higher resolution,\nand if confident in GCP, one can reduce the GCP uncertainty further.\n\nIn practice we found that after one pass of the jitter solver and stereo DEM\ncreation, it may be needed to run GCP creation with ``dem2gcp`` and bundle\nadjustment again to refine all the intrinsics, including focal length and lens\ndistortion, this time with the CSM linescan model. Then, one can invoke\n``jitter_solve`` one more time. Each step should offer a further improvement in\nresults.\n\nFor fine-level control over interest point matches, dense matches from disparity\nare suggested (:numref:`dense_ip`).\n\nIf the satellite acquired several overlapping pairs of images in quick\nsuccession, it is suggested to use them together, as that can improve the\nregistration.\n\nThe linescan cameras are not as easy to convert to a different resolution as the\nOpticalBar cameras. An `experimental program <https://github.com/NeoGeographyToolkit/StereoPipeline/blob/master/src/asp/Python/scale_linescan.py>`_\nfor this is available.\n"
  },
  {
    "path": "docs/examples/hrsc.rst",
    "content": ".. _hrsc_example:\n\nMars Express High Resolution Stereo Camera (HRSC)\n-------------------------------------------------\n\nThe HRSC camera on the Mars Express satellite is a complicated system,\nconsisting of multiple channels pointed in different directions plus\nanother super resolution channel. The best option to create DEMs is to\nuse the two dedicated stereo channels. These are pointed ahead of and\nbehind the nadir channel and collect a stereo observation in a single\npass of the satellite. \n\nSince each observation contains both stereo channels, one observation is\nsufficient to create a DEM.\n\nData can be downloaded from the `HRSC node <http://pds-geosciences.wustl.edu/missions/mars_express/hrsc.htm>`_ in the Planetary Data System (PDS).\n\nHRSC data is organized into categories. Level 2 is radiometrically\ncorrected, level 3 is corrected and mapprojected onto MOLA, and level 4\nis corrected and mapprojected on to a DEM created from the HRSC data.\nYou should use the level 2 data for creating DEMs with ASP. If you would\nlike to download one of the already created DEMs, it may be easiest to\nuse the areoid referenced version (.da4 extension) since that is\nconsistent with MOLA.\n\nPreparing the data\n~~~~~~~~~~~~~~~~~~\n\nFetch the two stereo channels using ``wget`` from::\n\n   https://pds-geosciences.wustl.edu/mex/mex-m-hrsc-3-rdr-v4/mexhrs_4000/data/1995/h1995_0000_s13.img\n   https://pds-geosciences.wustl.edu/mex/mex-m-hrsc-3-rdr-v4/mexhrs_4000/data/1995/h1995_0000_s23.img\n\n.. figure:: ../images/examples/hrsc/hrsc_example.png\n   :name: hrsc_figure\n\n   Sample outputs from a cropped region of HRSC frame 1995.  Left: Cropped input.\n   Center: Block matching with subpixel mode 3.  Right: MGM algorithm with cost\n   mode 3.\n\nSee :numref:`planetary_images` for how to set up ISIS and download the needed\nkernels. For HRSC, they are part of the ``mex`` dataset. \n\nIt appears that ``hrsc2isis`` is not able to read the level 3 images that were\ndownloaded above, and PDS no longer offers level 2 images. What seems to work is\nedit the .img files and change level 3 to level 2. That can be done with::\n\n    perl -pi -e 's#(PROCESSING_LEVEL_ID\\s+=) 3#$1 2#g' *.img\n\nThen run::\n\n    hrsc2isis from=h1995_0000_s13.img to=h1995_0000_s13.cub\n    hrsc2isis from=h1995_0000_s23.img to=h1995_0000_s23.cub\n    spiceinit from=h1995_0000_s13.cub ckpredicted=true\n    spiceinit from=h1995_0000_s23.cub ckpredicted=true\n     \nHere we added the ``ckpredicted=true`` flag to ``spiceinit``. Adding\n``web=true`` can help avoid downloading the kernels, if this works. See the\n(`spiceinit documentation <https://isis.astrogeology.usgs.gov/8.1.0/Application/presentation/Tabbed/spiceinit/spiceinit.html>`_).\n\nRunning stereo\n~~~~~~~~~~~~~~\n\nHRSC images are large and may have compression artifacts so you should\nexperiment running stereo on a small region with ``stereo_gui``\n(:numref:`stereo_gui`). \n\nThe suggested command to run on the full images is::\n\n    parallel_stereo h1995_0000_s13.cub h1995_0000_s23.cub \\\n      --stereo-algorithm asp_mgm                          \\\n      --cost-mode 3                                       \\\n      mgm/out\n\nSee :numref:`nextsteps` for other stereo algorithms, and information on\ntradeoffs between them.\n\nA DEM is created with ``point2dem`` (:numref:`point2dem`)::\n\n    point2dem                            \\\n      --stereographic --auto-proj-center \\\n      mgm/out-PC.tif \n\n"
  },
  {
    "path": "docs/examples/isis_minirf.rst",
    "content": ".. _isis_minirf:\n\nLRO Mini-RF using ISIS camera models\n------------------------------------\n\nSee :numref:`csm_minirf`. That example uses CSM cameras. Running it\nwith ISIS ``.cub`` cameras amounts to replacing ``.json`` with\n``.cub`` in all commands.\n\n"
  },
  {
    "path": "docs/examples/junocam.rst",
    "content": ".. _junocam:\n\nJunoCam\n-------\n\nJunoCam is an optical camera on the Juno spacecraft. It has been taking images\nof Jupiter and its satellites since 2016.\n\nThis example shows how to produce terrain models and ortho images from JunoCam\nimages for Ganymede, the largest moon of Jupiter. These will be registered \nto the Voyager-Galileo global mosaic of Ganymede.\n\nFetching the data\n~~~~~~~~~~~~~~~~~\n\nSet (in bash)::\n\n  url=https://planetarydata.jpl.nasa.gov/img/data/juno/JNOJNC_0018/DATA/RDR/JUPITER/ORBIT_34/\n  \nDownload the .IMG and .LBL files for two observations::\n\n    for f in JNCR_2021158_34C00001_V01 JNCR_2021158_34C00002_V01; do \n      for ext in .IMG .LBL; do \n        wget $url/$f$ext\n      done\n    done\n\nPreparing the data\n~~~~~~~~~~~~~~~~~~\n\nEnsure ISIS is installed (:numref:`planetary_images`).\n\nCreate ISIS .cub files::\n\n    for f in JNCR_2021158_34C00001_V01 JNCR_2021158_34C00002_V01; do \n        junocam2isis fr = $f.LBL to = $f.cub fullccd = yes\n    done\n\nThis will result in many files, because JunoCam acquires multiple overlapping images\nin quick succession.\n\nRun ``spiceinit`` to get the camera pointing and other information::\n\n    for f in *.cub; do\n      spiceinit from = $f web = true\n    done  \n\nIf the ``web = true`` option does not work, the ISIS data for the ``juno`` mission\nneeds to be downloaded, per the ISIS documentation.\n\nWe will put all these files into an ``img`` subdirectory.\n\n.. figure:: ../images/junocam_raw.png\n\n  JunoCam images JNCR_2021158_34C00001_V01_0012 and\n  JNCR_2021158_34C00002_V01_0010 as shown by ``stereo_gui``\n  (:numref:`stereo_gui`). The shared area and a couple of matching craters are\n  highlighted. \n  \nA JunoCam image is made of 3 framelets, each about 128 pixels tall. The image\nwidth is 1648 pixels. Consecutive images have overlapping areas, which helps\neliminate the effect of the gaps between the framelets.\n\nExternal reference\n~~~~~~~~~~~~~~~~~~\n\nWe will pixel-level register the JunoCam images to the 1 km / pixel Ganymede `Voyager -\nGalileo global mosaic\n<https://astrogeology.usgs.gov/search/map/ganymede_voyager_galileo_ssi_global_mosaic_1km>`_.\n\nCrop from it a portion that covers our area of interest as::\n\n    win=\"5745386 2069139 7893530 36002\"\n    gdal_translate -projwin $win                        \\\n      Ganymede_Voyager_GalileoSSI_global_mosaic_1km.tif \\\n      galileo_ortho.tif\n\nThis will be stored in a subdirectory named ``ref``. \n\nInitial DEM\n~~~~~~~~~~~\n\nBoth image registration and stereo DEM creation benefit from mapprojecting the\nJunoCam images onto a prior low-resolution DEM. A reasonably good such DEM can\nbe created by considering the surface zero height corresponding to the earlier\northoimage clip.\n\nGiven that the elevations on Ganymede are on the order of 1 km, which is about\nthe image resolution, this works well enough. Such a DEM is produced with\n``image_calc`` (:numref:`image_calc`) as::\n\n    image_calc -c \"var_0 * 0\"     \\\n      --output-nodata-value -1e+6 \\\n      -d float32                  \\\n      ref/galileo_ortho.tif       \\\n      -o ref/flat_dem.tif\n\nImage selection\n~~~~~~~~~~~~~~~\n\nWe chose to focus on the highest resolution JunoCam images of Ganymede, as that\nresulted in the best terrain model. The quality of the terrain model degraded\ntowards the limb, as expected. We worked with the images::\n\n    JNCR_2021158_34C00001_V01_0009\n    JNCR_2021158_34C00001_V01_0010\n    JNCR_2021158_34C00001_V01_0011\n    JNCR_2021158_34C00001_V01_0012\n    JNCR_2021158_34C00001_V01_0013\n\nand corresponding images that have ``34C00002`` in their name. \n\nMapprojection\n~~~~~~~~~~~~~\n\nEach image was mapprojected (:numref:`mapproject`) at 1 km / pixel resolution,\nwith a command such as::\n\n    mapproject --tr 1000                     \\\n      ref/flat_dem.tif                       \\\n      img/JNCR_2021158_34C00001_V01_0010.cub \\\n      map/JNCR_2021158_34C00001_V01_0010.map.tif\n\nGCP creation\n~~~~~~~~~~~~\n\nWe will create GCP that ties each JunoCam image to the reference\nVoyager-Galileo image mosaic with ``gcp_gen`` (:numref:`gcp_gen`), \ninvoked as follows::\n\n    f=JNCR_2021158_34C00001_V01_0010\n\n    gcp_gen                               \\\n      --ip-detect-method 0                \\\n      --inlier-threshold 50               \\\n      --ip-per-image 20000                \\\n      --individually-normalize            \\\n      --camera-image img/${f}.cub         \\\n      --mapproj-image map/${f}.map.tif    \\\n      --ortho-image ref/galileo_ortho.tif \\\n      --dem ref/flat_dem.tif              \\\n      --gcp-sigma 1000                    \\\n      --output-prefix gcp/run             \\\n      --output-gcp gcp/${f}.gcp\n  \nWe set ``--gcp-sigma 1000``, which is rather high, as we do not know the exact\nDEM that was employed to produce the reference image mosaic. The option ``--individually-normalize`` was essential, as these images come from different\nsources.\n\n.. figure:: ../images/junocam_galileo_matches.png\n\n  Interest point matches between mapprojected image \n  JNCR_2021158_34C00001_V01_0010 and the Voyager-Galileo mosaic. GCP are made\n  from these matches.\n\nBundle adjustment\n~~~~~~~~~~~~~~~~~\n\nBundle adjustment (:numref:`parallel_bundle_adjust`) was run with the 10 images\nselected earlier and the GCP files::\n\n    parallel_bundle_adjust                           \\\n      img/JNCR_2021158_34C0000[1-2]_V01_000[9-9].cub \\\n      img/JNCR_2021158_34C0000[1-2]_V01_001[0-3].cub \\\n      --ip-per-image 20000                           \\\n      --num-iterations 500                           \\\n      gcp/*.gcp                                      \\\n      -o ba/run\n\nStereo terrain creation\n~~~~~~~~~~~~~~~~~~~~~~~\n\nWe ran ``parallel_stereo`` on *every combination* of overlapping images between\nthe ``34C00001`` set and the ``34C00002`` one::\n\n    l=JNCR_2021158_34C00001_V01_xxxx\n    r=JNCR_2021158_34C00002_V01_yyyy\n    pref=stereo_map/${l}_${r}/run\n\n    parallel_stereo                      \\\n      map/$l.map.tif map/$r.map.tif      \\\n      img/$l.cub img/$r.cub              \\\n      --bundle-adjust-prefix ba/run      \\\n      --ip-per-image 20000               \\\n      --stereo-algorithm asp_mgm         \\\n      --subpixel-mode 9                  \\\n      --subpixel-kernel 7 7              \\\n      --nodata-value 0                   \\\n      --num-matches-from-disparity 10000 \\\n      ${pref}                            \\\n      ref/flat_dem.tif\n\nHere we used a small ``subpixel-kernel`` of 7 x 7 pixels, to ensure as little as\npossible is eroded from the already narrow images. Note that the ``asp_mgm``\nalgorithm default ``corr-kernel`` value is 5 x 5 pixels\n(:numref:`stereodefault`).\n\nThe stereo convergence angle (:numref:`stereo_pairs`) was about 35 degrees, which \nis very good.\n\nSet the output projection (the same as in the reference image mosaic)::\n\n    proj='+proj=eqc +lat_ts=0 +lat_0=0 +lon_0=180 +x_0=0 +y_0=0 +R=2632344.9707 +units=m +no_defs'\n    \nThen, ``point2dem`` (:numref:`point2dem`) was run::\n\n  point2dem         \\\n    --t_srs \"$proj\" \\\n    --tr 1000       \\\n    ${pref}-PC.tif  \\\n    --orthoimage    \\\n    ${pref}-L.tif\n\nThis was followed by mosaicking of DEMs and orthoimages with ``dem_mosaic``\n(:numref:`dem_mosaic`), and colorization with ``colormap`` (:numref:`colormap`).\n\n.. figure:: ../images/junocam_dem_drg.png\n\n  Left: Mosaicked DEM created from stereo of JunCam images. The color range\n  corresponds to elevations between -1500 and 1500 meters. Right: produced\n  JunoCam orthoimage overlaid on top of the Voyager-Galileo global mosaic.\n\nThe results of this processing are shown in the figure above. Three things are notable:\n\n  - The image registration is pixel-level.\n  - There are some seams at the top and bottom. Those can be eliminated\n    with more images.\n  - There are systematic artifacts in the elevations.\n  \nThe latter issue is likely due to not well-modeled distortion and TDI effects,\ngiven the JunoCam camera design. This will be fixed in the next section.\n\nHandling gaps between DEMs\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe JunoCam images have very little overlap and sometimes that results in gaps\nbetween the DEMs produced from stereo. These are most notable around the first\nand last DEMs in any given sequence. So adding more overlapping stereo pairs\npairs at the beginning and end of the sequence will help cover those areas.\n\nConsider decreasing the grid size for mapprojection as well, say from 1000 m to\n800 m, which should result in more pixels in overlapping areas.\n\nThese parameter changes in the workflow above may also help:\n\n - ``--edge-buffer-size 1`` or ``0`` (the default is larger)\n - ``--subpixel-kernel 5 5`` (instead of ``7 7``)\n - ``--corr-kernel 3 3`` (the default is ``5 5`` for ``asp_mgm``)\n\nThese parameters are described in :numref:`stereodefault`.\n\nIntrinsics refinement\n~~~~~~~~~~~~~~~~~~~~~\n\n.. _junocam_opt:\n.. figure:: ../images/junocam_dem_opt.png\n\n  Left: The earlier mosaicked DEM created from stereo of JunCam images. Right:\n  the produced DEM after optimizing the lens distortion with a DEM constraint.\n  These are plotted with the same range of of elevations (-1500 to 1500 meters).\n  The systematic artifacts are much less pronounced.\n\nTo address the systematic elevation artifacts, we will refine the intrinsics and\nextrinsics of the cameras, while using the zero elevation DEM as a ground\nconstraint (with an uncertainty).\n\nThe approach in :numref:`ba_frame_linescan` is followed.\n\nWe will make use of dense matches from disparity, as in :numref:`dense_ip`. The\noption for that, ``--num-matches-from-disparity``, was already set in the stereo\nruns above. We got good results with sparse matches too, as produced by\n``bundle_adjust``, if there are a lot of them, but dense matches offer more\ncontrol over the coverage. \n\nThese matches will augment existing sparse matches in the ``ba`` directory. For\nthat, first the sparse matches will be copied to a new directory, called\n``dense_matches``. Then, we will copy on top the small number of dense matches\nfrom each stereo directory above, while removing the string ``-disp`` from each\nsuch file name, and ensuring each corresponding sparse match file is overwritten.\n\nIt is necessary to create CSM cameras (:numref:`csm`) for the JunoCam images, to\nbe able to optimize the intrinsics. For the first camera, that is done with the\n``cam_gen`` program (:numref:`cam_gen`), with a command such as::\n\n    cam_gen img/JNCR_2021158_34C00001_V01_0010.cub          \\\n      --input-camera img/JNCR_2021158_34C00001_V01_0010.cub \\\n      --reference-dem ref/flat_dem.tif                      \\\n      --focal-length 1480.5905405405405405                  \\\n      --optical-center 814.21 600.0                         \\\n      --pixel-pitch 1                                       \\\n      --refine-camera                                       \\\n      --refine-intrinsics distortion                        \\\n      -o csm/JNCR_2021158_34C00001_V01_0010.json\n      \nThe values for the focal length (in pixels) and optical center (in pixels) were\nobtained by peeking in the .cub file metadata.\n\nThe resulting lens distortion model is not the one for JunoCam, which has two\ndistortion parameters, but rather the OpenCV radial-tangential model with five\nparameters (:numref:`csm_frame_def`). To use the JunoCam lens distortion model,\nadjust the value of ``--distortion-type`` in ``cam_gen`` above.\n\nThe ``cam_test`` program (:numref:`cam_test`) can help validate that the camera\nis converted well. \n\nThe intrinsics of this camera are transferred without further optimization \nto the other cameras as::\n\n    sample=csm/JNCR_2021158_34C00001_V01_0010.json\n    for f in                                         \\\n      img/JNCR_2021158_34C0000[1-2]_V01_0009.cub     \\\n      img/JNCR_2021158_34C0000[1-2]_V01_001[0-3].cub \\\n      ; do \n      g=${f/.cub/.json}\n      g=csm/$(basename $g)\n      cam_gen $f                                     \\\n        --input-camera $f                            \\\n        --sample-file $sample                        \\\n        --reference-dem ref/flat_dem.tif             \\\n        --pixel-pitch 1                              \\\n        --refine-camera                              \\\n        --refine-intrinsics none                     \\\n        -o $g\n    done\n\nNext, bundle adjustment is run, with the previously optimized adjustments that\nreflect the registration to the reference Voyager-Galileo mosaic::\n\n    bundle_adjust                                     \\\n      img/JNCR_2021158_34C0000[1-2]_V01_0009.cub      \\\n      img/JNCR_2021158_34C0000[1-2]_V01_001[0-3].cub  \\\n      csm/JNCR_2021158_34C0000[1-2]_V01_0009.json     \\\n      csm/JNCR_2021158_34C0000[1-2]_V01_001[0-3].json \\\n      --input-adjustments-prefix ba/run               \\\n      --match-files-prefix dense_matches/run          \\\n      --num-iterations 50                             \\\n      --solve-intrinsics                              \\\n      --intrinsics-to-float all                       \\\n      --intrinsics-to-share all                       \\\n      --heights-from-dem ref/flat_dem.tif             \\\n      --heights-from-dem-uncertainty 5000             \\\n      gcp/*.gcp                                       \\\n      -o ba_rfne/run\n\nLastly, stereo is run with the optimized model state camera files\n(:numref:`csm_state`) saved in ``ba_rfne``.\n\nThe result is in :numref:`junocam_opt`.\n\nIt was found that better DEMs are produced by re-mapprojecting with latest\ncameras and re-running stereo from scratch, rather than reusing stereo runs with\nthe option ``--prev-run-prefix`` (:numref:`parallel_stereo`). Likely that is\nbecause the cameras change in non-small ways.\n\nWith ISIS 9.0.0 and later, a CSM file produced as above can be embedded in \nthe .cub file to be used with ISIS (:numref:`embedded_csm`).\n"
  },
  {
    "path": "docs/examples/k10.rst",
    "content": ".. _k10example:\n\nK10\n---\n\nK10 is an Earth-based research rover within the Intelligent Robotics\nGroup at NASA Ames, the group ASP developers belong to. The cameras on\nthis rover use a simple Pinhole model. The use of ASP with these cameras\nis illustrated in the ``examples/K10`` directory (just type 'make'\nthere). Just as for the MER datatset (:numref:`mer-example`),\nonly the creation of a point cloud is supported.\n\nSee :numref:`examples` for other examples."
  },
  {
    "path": "docs/examples/kaguya.rst",
    "content": ".. _kaguya_tc:\n\nKaguya Terrain Camera\n---------------------\n\nThe Kaguya Terrain Camera (TC) is a push-broom imager, with a spatial resolution\nof 10 m. The images are acquired from a 100 km altitude above the Moon. It was\npart of the JAXA `Kaguya <https://en.wikipedia.org/wiki/SELENE>`_ orbiter.\n\nKaguya TC has two sensors, named TC1 and TC2, forming a stereo pair. They see\nroughly the same region on the ground, with a convergence angle of about 30 degrees\n(:numref:`stereo_pairs`). These sensors may have slightly different focal\nlengths and distortion coefficients.\n\nFetching the data\n~~~~~~~~~~~~~~~~~\n\nVisit the `product search\n<https://darts.isas.jaxa.jp/planet/pdap/selene/product_search.html>`_ page, and\nenter a small search region.\n\nFetch the raw data sets for a desired stereo pair, starting with the *TC1* and\n*TC2* prefixes (not the DEM or other products). Both the .img and .lbl files are needed. \n\n::\n\n    wget https://darts.isas.jaxa.jp/pub/pds3/sln-l-tc-3-w-level2b0-v1.0/20080605/data/TC1W2B0_01_02936N034E0938.img.gz\n    wget https://darts.isas.jaxa.jp/pub/pds3/sln-l-tc-3-w-level2b0-v1.0/20080605/data/TC1W2B0_01_02936N034E0938.lbl\n\n    wget https://darts.isas.jaxa.jp/pub/pds3/sln-l-tc-3-w-level2b0-v1.0/20080605/data/TC2W2B0_01_02936N036E0938.img.gz\n    wget https://darts.isas.jaxa.jp/pub/pds3/sln-l-tc-3-w-level2b0-v1.0/20080605/data/TC2W2B0_01_02936N036E0938.lbl\n\nPreparing the data\n~~~~~~~~~~~~~~~~~~\n\nUnzip the .img.gz files with ``gunzip``.\n\nEnsure that ISIS is installed, and that ISISROOT and ISISDATA are set, per\n:numref:`planetary_images`. The Kaguya kernels can then be downloaded with the\ncommand::\n\n    $ISISROOT/bin/downloadIsisData kaguya $ISISDATA\n\nFor each image, run commands along the lines of::\n\n    $ISISROOT/bin/kaguyatc2isis                     \\\n      from=TC1W2B0_01_02936N034E0938.lbl            \\\n      to=TC1W2B0_01_02936N034E0938.cub              \\\n      setnullrange=NO sethrsrange=NO sethisrange=NO \\\n      setlrsrange=NO setlisrange=NO\n\n    $ISISROOT/bin/spiceinit from=TC1W2B0_01_02936N034E0938.cub \\\n        web=false attach=TRUE cksmithed=FALSE ckrecon=TRUE     \\\n        ckpredicted=FALSE cknadir=FALSE spksmithed=true        \\\n        spkrecon=TRUE spkpredicted=FALSE shape=SYSTEM          \\\n        startpad=0.0 endpad=0.0\n\nCreate CSM cameras (:numref:`csm`)::\n\n    $ISISROOT/bin/isd_generate --only_naif_spice \\\n        TC1W2B0_01_02936N034E0938.cub            \\\n        -k TC1W2B0_01_02936N034E0938.cub\n\nBundle adjustment and stereo\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nRun bundle adjustment (:numref:`bundle_adjust`) and stereo\n(:numref:`parallel_stereo`)::\n\n    bundle_adjust                                                   \\\n      TC1W2B0_01_02936N034E0938.cub TC2W2B0_01_02936N036E0938.cub   \\\n      TC1W2B0_01_02936N034E0938.json TC2W2B0_01_02936N036E0938.json \\\n      --tri-weight 0.1 --camera-weight 0.0                          \\\n      -o ba/run\n\n    parallel_stereo --stereo-algorithm asp_mgm --subpixel-mode 9    \\\n      TC1W2B0_01_02936N034E0938.cub TC2W2B0_01_02936N036E0938.cub   \\\n      TC1W2B0_01_02936N034E0938.json TC2W2B0_01_02936N036E0938.json \\\n      --bundle-adjust-prefix ba/run                                 \\\n      stereo/run\n\nFor datasets with very oblique illumination, ``--subpixel-mode 2`` \n(:numref:`subpixel_options`) worked better, but is much slower.\n\nRun ``point2dem`` (:numref:`point2dem`) to get a DEM. Consider using the\nstereographic projection centered at the region of interest::\n\n    point2dem --stereographic --auto-proj-center \\\n      --tr 10 stereo/run-PC.tif\n\nSee :numref:`sfs_kaguya_example` for a clip of the produced DEM.\n\nIt is suggested to rerun stereo with mapprojected images\n(:numref:`mapproj-example`), to get a higher quality output. \n\nSee :numref:`nextsteps` for a discussion about various speed-vs-quality choices\nwhen running stereo. \n\nAlignment\n~~~~~~~~~\n\nThe produced DEM can be aligned with ``pc_align`` (:numref:`pc_align`) to the\nLOLA RDR product. \n\n.. _sfs_kaguya:\n\nShape-from-shading with Kaguya TC\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nHere it will be illustrated how to run Shape-from-Shading (:numref:`sfs`) on\nKaguya TC images. An overview of SfS and examples for other planets are given in\n:numref:`sfs_usage`.\n\nFirst, ensure that the data are fetched and a stereo terrain is created, per\n:numref:`kaguya_tc`. Shape-from-shading expects a DEM with no holes which is\nalso rather smooth. It should be at the same ground resolution as the input\nimages, which in this case is 10 meters per pixel. It is best to have it in a\nlocal projection, such as stereographic.\n\nWe will modify the DEM creation command from above to use a large search radius to fill \nany holes::\n\n    point2dem --stereographic --auto-proj-center \\\n      --tr 10 --search-radius-factor 10          \\\n      stereo/run-PC.tif\n\n(adjust the projection center for your location).\n\nInspect the produced DEM ``stereo/run-DEM.tif`` in ``stereo_gui`` in hillshading\nmode. Any additional holes can be filled with ``dem_mosaic``\n(:numref:`dem_mosaic_extrapolate`).\n\nIt is also suggested to blur it a little, to make it smoother::\n\n    dem_mosaic --dem-blur-sigma 2 stereo/run-filled-dem.tif \\\n      -o stereo/run-blurred-dem.tif  \n\nThen crop a region with ``gdal_translate`` that has no missing data. \n\nMapproject (:numref:`mapproject`) onto this DEM the left and right images with\nthe corresponding ``.json`` camera files, while using the adjustments in\n``ba/run``. Overlay the resulting georeferenced images in ``stereo_gui``. This\nis a very important sanity check to ensure that the cameras are registered\ncorrectly. \n\nRun SfS as::\n\n    parallel_sfs -i stereo/run-cropped-dem.tif \\\n      TC1W2B0_01_02936N034E0938.cub            \\\n      TC2W2B0_01_02936N036E0938.cub            \\\n      TC1W2B0_01_02936N034E0938.json           \\\n      TC2W2B0_01_02936N036E0938.json           \\\n      --bundle-adjust-prefix ba/run            \\\n      --reflectance-type 1                     \\\n      --blending-dist 10                       \\\n      --min-blend-size 50                      \\\n      --allow-borderline-data                  \\\n      --threads 4                              \\\n      --save-sparingly                         \\\n      --crop-input-images                      \\\n      --smoothness-weight 40000                \\\n      --initial-dem-constraint-weight 10       \\\n      --max-iterations 5                       \\\n      --shadow-thresholds \"120 120\"            \\\n      --tile-size 200                          \\\n      --padding 50                             \\\n      --processes 10                           \\\n      -o sfs/run\n\nIf there are artifacts in the produced DEM, increase the smoothness weight.\nBut if it is too large, it may blur the produced DEM too much.\n\nThe initial and final DEM can be inspected in ``stereo_gui``. The ``geodiff``\n(:numref:`geodiff`) tool can be used to compare how much the DEM changed.\n\nThe initial DEM constraint was set rather high to ensure the DEM does not change\nmuch as result of SfS. The shadow threshold depends on the pixel values and can\nbe very different for other images.\n\nSee, for comparison, the parameter choices made for LRO NAC\n(:numref:`sfs-lola`). That example, and that entire chapter, also has the most\ndetailed discussion for how to run SfS, including the essential role of\nalignment.\n\n.. figure:: ../images/sfs_kaguya_example.png\n   :name: sfs_kaguya_example\n   :alt: SfS with Kaguya TC images\n\n   From left to right: the stereo DEM, SfS DEM (hillshaded), and a mapprojected\n   image. Some numerical noise is still seen, which can be removed by increasing\n   the smoothing weight. See below for another example.\n\nUsing multiple images with diverse illumination results in more detail and fewer\nartifacts. For such data, bundle adjustment and pairwise stereo need to be run\nfirst, and the produced DEMs and cameras must be aligned to a common reference,\nsuch as LOLA (:numref:`ba_pc_align`). Then the aligned DEMs are inspected and\nmerged with ``dem_mosaic``, a clip is selected, holes are filled, noise is\nblurred, and SfS is run. The process is explained in detail in\n:numref:`sfs-lola`.\n\nHere is an example of running SfS with the datasets::\n\n    TC{1,2}W2B0_01_02921S050E1100\n    TC{1,2}W2B0_01_05936S048E1097\n\nAll four images were used, though likely the first of each pair would have \nbeen sufficient, given that images in each pair have the same illumination.\n\n.. figure:: ../images/sfs_kaguya_dems.png\n   :name: sfs_kaguya_dems\n   :alt: SfS with Kaguya TC images with different illumination\n\n   SfS with Kaguya images with different illumination. From left to right: first\n   pair stereo DEM, second pair stereo DEM, and the SfS DEM (all hillshaded). It\n   can be seen that SfS adds more detail and removes numerical noise.\n\n.. figure:: ../images/sfs_kaguya_ortho.png\n   :name: sfs_kaguya_ortho\n   :alt: SfS Kaguya TC ortho images\n   \n   The images used for SfS (one from each pair). The Sun is in the East and West, \n   respectively. \n\nRefining the camera intrinsics for Kaguya TC\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nSee :numref:`kaguya_ba`.\n\n.. _jitter_kaguya:\n\nSolving for jitter for Kaguya TC\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nKaguya TC cameras exhibit some jitter, but its effect is not as strong as the one of\nlens distortion, which needs to be solved for first, as in :numref:`kaguya_ba`.\n\nThen, jitter can be corrected as for CTX in :numref:`jitter_ctx`. The precise commands\nare below.\n\n.. figure:: ../images/kaguya_jitter.png\n   :name: jitter_kaguya_fig\n   :alt: Jitter for Kaguya TC\n\n   First row: the stereo DEM and orthoimage. Second row: The difference of\n   stereo DEM to LOLA. Third row: the triangulation error\n   (:numref:`triangulation_error`). These are before (left) and after (right)\n   solving for jitter. The ranges in the colorbar are in meters.\n   \nHere we worked with the stereo pair::\n\n   TC1W2B0_01_05324N054E2169\n   TC2W2B0_01_05324N056E2169\n\nStereo was run with mapprojected images (:numref:`mapproj-example`). \n\nDense matches were produced from stereo disparity (:numref:`dense_ip`).\nHaving on the order of 20,000 dense matches is suggested.\n\nThe DEM and cameras were aligned to LOLA, and lens distortion was solved\nfor as in :numref:`kaguya_ba` (using additional overlapping images).\nThe resulting optimized cameras were passed in to the jitter solver.\n\nThe DEM to constrain against was produced from LOLA, with a command as::\n\n  point2dem                              \\\n    -r moon                              \\\n    --stereographic                      \\\n    --auto-proj-center                   \\\n    --csv-format 2:lon,3:lat,4:radius_km \\\n    --search-radius-factor 5             \\\n    --tr 25                              \\\n    lola.csv\n    \nSolving for jitter::\n\n  jitter_solve                                           \\\n    TC1W2B0_01_05324N054E2169.cub                        \\\n    TC2W2B0_01_05324N056E2169.cub                        \\\n    ba/run-TC1W2B0_01_05324N054E2169.adjusted_state.json \\\n    ba/run-TC2W2B0_01_05324N056E2169.adjusted_state.json \\\n    --max-pairwise-matches 20000                         \\\n    --num-lines-per-position 300                         \\\n    --num-lines-per-orientation 300                      \\\n    --max-initial-reprojection-error 20                  \\\n    --match-files-prefix dense_matches/run               \\\n    --heights-from-dem lola-DEM.tif                      \\\n    --heights-from-dem-uncertainty 10                    \\\n    --anchor-dem lola-DEM.tif                            \\\n    --num-anchor-points 5000                             \\\n    --num-anchor-points-extra-lines 1000                 \\\n    --anchor-weight 0.01                                 \\\n    --num-iterations 20                                  \\\n    -o jitter/run\n\nThe value of ``--anchor-weight`` can be increased to 0.1 - 0.5, if oscillations\nare seen at the starting and ending image lines.\n\n"
  },
  {
    "path": "docs/examples/lronac.rst",
    "content": ".. _lronac-example:\n\nLunar Reconnaissance Orbiter (LRO) NAC\n--------------------------------------\n\nThis section will describe in detail how to process an LRO NAC dataset.\n(See also :numref:`lronac_csm` for a ready-made example using a different\ndataset for which all inputs have already been prepared.)\n\nThe site\n~~~~~~~~\n\nIn this example we will consider a stereo pair that covers the\nTaurus-Littrow valley on the Moon where, on December 11, 1972, the\nastronauts of Apollo 17 landed. However, this stereo pair does not\ncontain the landing site. It is slightly west; focusing on the\nLee-Lincoln scarp that is on North Massif. The scarp is an 80 m high\nfeature that is the only visible sign of a deep fault.\n\n.. figure:: ../images/examples/lrocna/lroc-na-example2_combined.png\n\n   Example output possible with a LROC NA stereo pair, using both\n   CCDs from each observation, courtesy of the lronac2mosaic.py tool.\n\nLRO NAC camera design\n~~~~~~~~~~~~~~~~~~~~~\n\nLRO has two Narrow Angle Cameras (NAC), with both acquiring image data\nat the same time, so each observation consists\nof two images, left and right, denoted with ``L`` and ``R``.\nThese are not meant to be used as a stereo pair, as the camera\ncenter is virtually in the same place for both, and they have very little\noverlap. For stereo one needs two such observations, with a\nreasonable perspective difference (baseline) among the two.\n \nThen stereo can happen by pairing an L or R image from the first\nobservation with an L or R image from the second. Alternatively, each\nobservation's L and R images can be stitched first, then stereo happens\nbetween the two stitched images. Both of these approaches will be\ndiscussed below.\n\nDownload\n~~~~~~~~\n\nDownload the experimental data records (EDR) for observations\nM104318871 and M104311715 from http://wms.lroc.asu.edu/lroc/search.\nAlternatively, search by original IDs of 2DB8 and 4C86 in the\nPDS. \n\nThe download will result in four files, named M104318871LE.img,\nM104318871RE.img, M104311715LE.img, and M104311715RE.img.\n\n.. _lro_nac_no_stitch:\n\nPreparing the inputs without stitching\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe individual ``L`` and ``R`` images in an LRO NAC observation can be\nused without stitching if desired to keep the original camera models.\nUnstitched cameras can also be converted to CSM (:numref:`csm`), which\nwill provide a great speed up for stereo, bundle adjustment, and\nShape-from-Shading (:numref:`sfs_usage`).\n\nWe convert each .img file to an ISIS .cub camera image, initialize the\nSPICE kernels, and perform radiometric calibration and echo\ncorrection. Here are the steps, illustrated on one image::\n\n    f=M104318871LE\n    lronac2isis from = ${f}.IMG     to = ${f}.cub\n    spiceinit   from = ${f}.cub\n    lronaccal   from = ${f}.cub     to = ${f}.cal.cub\n    lronacecho  from = ${f}.cal.cub to = ${f}.cal.echo.cub\n\nNote that for these commands to succeed, ISIS and its supporting data\nmust be downloaded, per :numref:`planetary_images`.\n\nStitching the LE and RE observations\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nIn this case all ISIS preprocessing of the EDRs is performed via the\n``lronac2mosaic.py`` command (:numref:`lronac2mosaic`)::\n\n    lronac2mosaic.py M104318871LE.img M104318871RE.img\n    lronac2mosaic.py M104311715LE.img M104311715RE.img\n\nThis runs ``lronac2isis``, ``lronaccal``, ``lronacecho``,\n``spiceinit``, ``noproj``, and ``handmos`` to create a stitched\nunprojected image for each observation. In this example we don't\nmapproject the images as ASP can usually get good results. More\naggressive terrain might require an additional ``cam2map4stereo.py``\nstep.\n\nIn case of failure, it is suggested to re-run this tool with the option\n``--keep`` to keep the intermediate files, and then inspect the ones before\nthe final step. \n\nRunning stereo\n~~~~~~~~~~~~~~\n\nStereo can then be run either with unstitched or stitched .cub files.\nHere's an example with the unstitched LE images::\n\n    parallel_stereo M104318871LE.cub M104311715LE.cub  \\\n      --alignment-method affineepipolar                \\\n      run/run\n\nCreate a DEM, orthoimage, and error image with ``point2dem``\n(:numref:`point2dem`)::\n \n    point2dem --stereographic --auto-proj-center \\\n      --errorimage --orthoimage                  \\\n        run/run-PC.tif run/run-L.tif\n        \nCheck the stereo convergence angle as printed during preprocessing\n(:numref:`stereo_pairs`). That angle is often too small for LRO NAC,\nand then the results are not going to be great.\n\nCheck the triangulation error (:numref:`triangulation_error`) in the produced\nerror image. This may suggest that bundle adjustment may be needed\n(:numref:`bundle_adjust`).\n\nSee :numref:`nextsteps` for a discussion about various stereo\nspeed-vs-quality choices. Consider using mapprojection\n(:numref:`mapproj-example`) for best results for steep slopes.\n\nIt is strongly suggested to convert the cameras to CSM \n(:numref:`csm_linescan`). This makes mapprojection faster, \nand also can help solve for jitter (:numref:`jitter_solve`).\n\n.. _lronac_align:\n\nValidation and alignment\n~~~~~~~~~~~~~~~~~~~~~~~~\n\nA `LOLA <https://ode.rsl.wustl.edu/moon/lrololadataPointSearch.aspx>`_ point\ncloud can be downloaded for the area of interest. Download the RDR\n``PointPerRow`` product.\n\nThe produced DEM can be aligned to LOLA with ``pc_align`` (:numref:`pc_align`),\nwith a command as::\n\n    pc_align --max-displacement 500          \\\n     --csv-format 2:lon,3:lat,4:radius_km    \\\n     --save-inv-transformed-reference-points \\\n     run/run-DEM.tif LOLA.csv                \\\n     -o run/run-align\n     \nSolving for jitter\n~~~~~~~~~~~~~~~~~~\n\nLRO NAC images can have jitter. A process as for CTX in :numref:`jitter_ctx`\nusually works well to remove it (see also a multi-image example in\n:numref:`jitter_multiple_images`).\n"
  },
  {
    "path": "docs/examples/mer.rst",
    "content": ".. _mer-example:\n\nMars Exploration Rovers\n-----------------------\n\nThe Mars Exploration Rovers (MER) have several cameras onboard that acquire\nstereo pairs. The images come with CAHVOR camera models, that have local\npositions and orientations. \n\nASP can create point clouds and textured meshes from these cameras. DEMs cannot\nbe created right away, unlike for MSL, which has geolocation information\n(:numref:`csm_msl`), but an SfM solution is likely to work as in\n:numref:`rig_msl`.\n\nPANCAM, NAVCAM, HAZCAM\n~~~~~~~~~~~~~~~~~~~~~~\n\nThese are cameras on the rover and are all processed the same way. It is\npreferred to use NAVCAM images, as those have less distortion than the HAZCAM.\n\n.. figure:: ../images/examples/mer/mer_mesh.png\n\n   Left input image and produced textured mesh.\n\nRecipe\n^^^^^^\n\nDownload the data from the `PDS Image Atlas <https://pds-imaging.jpl.nasa.gov/search/>`_. \n\n::\n\n   wget https://planetarydata.jpl.nasa.gov/img/data/mer/mer2no_0xxx/data/sol0766/edr/2n194370551effap00p0675l0m1.img\n   wget https://planetarydata.jpl.nasa.gov/img/data/mer/mer2no_0xxx/data/sol0766/edr/2n194370551effap00p0675r0m1.img\n\nCreate the CAHVOR cameras::\n\n   mer2camera 2n194370551effap00p0675l0m1.img\n   mer2camera 2n194370551effap00p0675r0m1.img\n\nRun stereo (:numref:`parallel_stereo`) and create a mesh with ``point2mesh`` (:numref:`point2mesh`)::\n\n   parallel_stereo                       \\\n      2n194370551effap00p0675l0m1.img    \\\n      2n194370551effap00p0675r0m1.img    \\\n      2n194370551effap00p0675l0m1.cahvor \\\n      2n194370551effap00p0675r0m1.cahvor \\\n      run/run\n\n    point2mesh -s 2 --texture-step-size 2 \\\n      run/run-PC.tif run/run-L.tif\n\nSee :numref:`nextsteps` for a discussion about various speed-vs-quality choices.\n\nIt is suggested to filter out points that are not triangulated well because they\nare too far using the ``parallel_stereo`` option ``--min-triangulation-angle``\n(:numref:`stereodefault`).\n\nFor finer-grained control, can use::\n\n    --universe-center camera --near-universe-radius 0.7 \\\n       --far-universe-radius 80.0\n\nThese may be suggested as well::\n\n    --alignment-method epipolar --force-use-entire-range\n\n"
  },
  {
    "path": "docs/examples/moc.rst",
    "content": ".. _moc_example:\n\nMars Global Surveyor MOC-NA\n---------------------------\n\nIn the Stereo Pipeline Tutorial in :numref:`moc_tutorial`, we showed\nyou how to process a narrow angle MOC stereo pair that covered a\nportion of Hrad Vallis. In this section we will show you more\nexamples, some of which exhibit a problem common to stereo pairs from\nlinescan imagers: ``spacecraft jitter`` is caused by oscillations of\nthe spacecraft due to the movement of other spacecraft hardware. All\nspacecraft wobble around to some degree but some are particularly\nsusceptible.\n\nJitter causes wave-like distortions along the track of the satellite\norbit in DEMs produced from linescan camera images. This effect can be\nvery subtle or quite pronounced, so it is important to check your data\nproducts carefully for any sign of this type of artifact. The following\nexamples will show the typical distortions created by this problem.\n\nNote that the science teams of HiRISE and LROC are actively working on\ndetecting and correctly modeling jitter in their respective SPICE data.\nIf they succeed in this, the distortions will still be present in the\nraw images, but the jitter will no longer produce ripple artifacts in\nthe DEMs produced using ours or other stereo reconstruction software.\n\nASP has its own jitter solver, which was shown to reduce the jitter\nfor CTX (Mars) and DigitalGlobe (Earth) data (:numref:`jitter_solve`).\n\nCeraunius Tholus\n~~~~~~~~~~~~~~~~\n\nCeraunius Tholus is a volcano in northern Tharsis on Mars. It can be\nfound at 23.96 N and 262.60 E. This DEM crosses the volcano's caldera.\n\n.. figure:: ../images/examples/mocna/ceraunius_tholus_mocna_ge_combined.png\n   :name: mocna_ceraunius_example\n\n   Example output for MOC-NA of Ceraunius Tholus. Notice the presence\n   of severe washboarding artifacts due to spacecraft jitter.\n\n.. _commands-2:\n\nCommands\n^^^^^^^^\n\nDownload the M08/06047 and R07/01361 images from the PDS:\n\n::\n     wget -O M0806047.imq \\\n          https://planetarydata.jpl.nasa.gov/img/data/mgs-m-moc-na_wa-2-sdp-l0-v1.0/mgsc_1068/m08060/m0806047.imq\n\n     wget -O R0701361.imq \\\n          https://planetarydata.jpl.nasa.gov/img/data/mgs-m-moc-na_wa-2-sdp-l0-v1.0/mgsc_1270/r07013/r0701361.imq\n\nThen process:\n\n::\n     ISIS> moc2isis f=M0806047.imq t=M0806047.cub\n     ISIS> moc2isis f=R0701361.imq t=R0701361.cub\n     ISIS> spiceinit from=M0806047.cub\n     ISIS> spiceinit from=R0701361.cub\n     ISIS> cam2map4stereo.py M0806047.cub R0701361.cub\n     ISIS> parallel_stereo M0806047.map.cub R0701361.map.cub result/output\n\nSee :numref:`nextsteps` for a discussion about various\nspeed-vs-quality choices. See :numref:`examples` for other examples.\n\n"
  },
  {
    "path": "docs/examples/msl.rst",
    "content": ".. _rig_msl:\n\nMSL navcam example\n------------------\n\nThis is an example of using the ASP tools to process images taken by the Mars\nScience Laboratory (MSL) rover `Curiosity\n<https://en.wikipedia.org/wiki/Curiosity_(rover)>`_. See :numref:`rig_examples` for\nother examples.\n\nThis approach uses the images to create a self-consistent solution, which can\nbe registered to the ground (:numref:`msl_registration`).\n\n:numref:`csm_msl` discusses using the known camera poses for MSL.\n\n.. _rig_msl_figure:\n\nIllustration\n~~~~~~~~~~~~\n\n.. figure:: ../images/msl_kimberly_mesh.png\n   :name: rig_msl_figure1\n   :alt:  MSL Kimberly mesh\n \n.. figure:: ../images/msl_kimberly_photo.png\n   :name: rig_msl_figure2\n   :alt:  MSL Kimberly photo\n\n   A mesh created with 22 MSL navcam images acquired on SOL 597 (top),\n   and several representative images from this set (bottom).\n\nSensor information\n~~~~~~~~~~~~~~~~~~\n\nCuriosity has two navcam sensors (left and right) mounted on a stereo\nrig. Each records images at a resolution of 1024 x 1024 pixels. The\nfield of view is 45 degrees.\n\n.. _msl_challenges:\n\nChallenges\n~~~~~~~~~~\n\nThe navcam images are used to plan the path of the rover. They are not acquired\nspecifically for mapping. While there is good overlap and perspective difference\nbetween images that are taken at the same time with the stereo rig, these\nassumptions may not hold for images produced at different times. Moreover, after\nthe rover changes position, there is usually a large perspective difference and\nlittle overlap with earlier images.\n\nPrior work\n~~~~~~~~~~\n\nA very useful reference on processing MSL images is :cite:`caravaca20203d`. It\nuses the commercial Agisoft Photoscan software. To help with matching the\nimages, that paper uses the global position and orientation of each image and\nprojects these onto the ground. Such data is not fully present in the .LBL files\nin PDS, as those contain only local coordinates, and would necessitate queering\nthe SPICE database.  It also incorporates lower-resolution \"TRAV\" images to tie\nthe data together.\n\n.. _msl_image_prep:\n\nData preparation\n~~~~~~~~~~~~~~~~\n\nThe images are fetched from PDS. For example, to get the data for day\n(SOL) 597 on Mars, use the command::\n\n    dir=data/msl/MSLNAV_0XXX/DATA/SOL00597\n    wget -r -nH --cut-dirs=4 --no-parent    \\\n      --reject=\"index.html*\"                \\\n      https://pds-imaging.jpl.nasa.gov/$dir \\\n      --include $dir\n\nThis will create the directory ``SOL00597`` containing .IMG data files\nand .LBL metadata. Using the ISIS ``pds2isis`` program (see\n:numref:`planetary_images` for installation), these can be converted to\n.cub files as::\n\n    pds2isis from = SOL00597/image.LBL to = SOL00597/image.cub\n    \nA .cub file obtained with the left navcam sensor will have a name like::\n\n    SOL00597/NLB_451023553EDR_F0310946NCAM00492M1.cub\n\nwhile for the right sensor the prefix will be instead ``NRB``. The\nfull-resolution images have ``_F`` as part of their name, as above.\n\nWe will convert the .cub files to the TIF format so that they can be understood\nby ``theia_sfm``. The ``rig_calibrator`` convention will be used, of storing\neach sensor's data in its own subdirectory (:numref:`rig_data_conv`). We will\nname the left and right navcam sensors ``lnav`` and ``rnav``. Then, the\nconversion commands are along the lines of::\n\n    mkdir -p SOL00597/lnav\n    isis2std from = SOL00597/left_image.cub \\\n      to = SOL00597/lnav/left_image.tif\n\nEach produced image will have a timestamp, with the same value for the\nleft and right navcam images taken at the same time. \n\nImage selection\n~~~~~~~~~~~~~~~\n\nA subset of 22 images was selected for SOL 597 (half for each of the\nleft and right navcam sensors). Images were chosen based on visual\ninspection. A fully automatic approach may be challenging\n(:numref:`msl_challenges`).\n\nThis dataset is available for\n`download <https://github.com/NeoGeographyToolkit/StereoPipelineSolvedExamples/releases/tag/MSL>`_.\n\n.. _msl_init_rig:\n\nSetting up the initial rig\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nGiven the earlier sensor information, the focal length can be found \nusing the formula:\n\n.. math::\n\n    f = \\frac{w}{2\\tan(\\frac{\\theta}{2})}       \n\nwhere :math:`w` is sensor width in pixels and :math:`\\theta` is the field of\nview. The focal length is then about 1236.0773 pixels. We will start\nby assuming that the optical center is at the image center, and \nno distortion. Hence, the initial rig configuration (:numref:`rig_config`)\nwill look like::\n\n    ref_sensor_name: lnav\n\n    sensor_name: lnav\n    focal_length:  1236.0773\n    optical_center: 512 512\n    distortion_coeffs: \n    distortion_type: no_distortion\n    image_size: 1024 1024\n    distorted_crop_size: 1024 1024\n    undistorted_image_size: 1024 1024\n    ref_to_sensor_transform: 1 0 0 0 1 0 0 0 1 0 0 0\n    depth_to_image_transform: 1 0 0 0 1 0 0 0 1 0 0 0\n    ref_to_sensor_timestamp_offset: 0\n\nwith an additional identical block for the ``rnav`` sensor (without\n``ref_sensor_name``).\n\nSfM map creation\n~~~~~~~~~~~~~~~~\n\nGiven the data and rig configuration, the image names in .tif format\nwere put in a list, with one entry per line.  The ``theia_sfm``\nprogram (:numref:`theia_sfm`) was run to find initial camera poses::\n\n    theia_sfm                     \\\n      --rig-config rig_config.txt \\\n      --image-list list.txt       \\\n      --out-dir theia_rig\n\nNext, ``rig_calibrator`` (:numref:`rig_calibrator`) is used, to\nenforce the rig constraint between the left and right navcam sensors\nand refine the intrinsics::\n\n    params=\"focal_length,optical_center\"\n    float=\"lnav:${params} rnav:${params}\"\n\n    rig_calibrator                        \\\n      --rig-config rig_config.txt         \\\n      --nvm theia_rig/cameras.nvm         \\\n      --camera-poses-to-float \"lnav rnav\" \\\n      --intrinsics-to-float \"$float\"      \\\n      --num-iterations 100                \\\n      --num-passes 2                      \\\n      --num-overlaps 5                    \\\n      --out-dir rig_out\n\nTo optimize the distortion, one can adjust the rig configuration by setting\ninitial distortion values and type::\n\n    distortion_coeffs: 1e-8 1e-8 1e-8 1e-8 1e-8\n    distortion_type: radtan\n\nand then defining the list of parameters to optimize as::\n\n    params=\"focal_length,optical_center,distortion\"\n\nFor this example, plausible solutions were obtained with and without\nusing distortion modeling, but likely for creation of pixel-level\nregistered textured meshes handling distortion is important.\n\nThe produced pairwise matches in ``rig_out/cameras.nvm`` can be\ninspected with ``stereo_gui`` (:numref:`stereo_gui_nvm`).\n\nMesh creation\n~~~~~~~~~~~~~\n\nHere, a point cloud is created from every stereo pair consisting of a left\nsensor image and corresponding right image, and those are fused into\na mesh. Some parameters are set up first.\n\nStereo options (:numref:`stereodefault`)::\n\n    stereo_opts=\"\n      --stereo-algorithm asp_mgm\n      --alignment-method affineepipolar\n      --ip-per-image 10000\n      --min-triangulation-angle 0.1\n      --global-alignment-threshold 5\n      --session nadirpinhole\n      --no-datum\n      --corr-seed-mode 1\n      --max-disp-spread 300\n      --ip-inlier-factor 0.4\n      --nodata-value 0\"\n\nPoint cloud filter options (:numref:`pc_filter`)::\n\n    maxDistanceFromCamera=100.0\n    pc_filter_opts=\"\n      --max-camera-ray-to-surface-normal-angle 85 \n      --max-valid-triangulation-error 10.0   \n      --max-distance-from-camera $maxDistanceFromCamera\n      --blending-dist 50 --blending-power 1\"\n\nMesh generation options (:numref:`voxblox_mesh`)::\n\n    mesh_gen_opts=\"\n      --min_ray_length 0.1\n      --max_ray_length $maxDistanceFromCamera\n      --voxel_size 0.05\"\n\nSet up the pairs to run stereo on::\n\n    outDir=stereo\n    mkdir -p ${outDir}\n    grep lnav list.txt > ${outDir}/left.txt\n    grep rnav list.txt > ${outDir}/right.txt\n\nThe optimized rig, in ``rig_out/rig_config.txt``, and optimized\ncameras, in ``rig_out/cameras.txt``, are passed to ``multi_stereo``\n(:numref:`multi_stereo`)::\n\n    multi_stereo                              \\\n      --rig_config rig_out/rig_config.txt     \\\n      --camera_poses rig_out/cameras.txt      \\\n      --undistorted_crop_win '1100 1100'      \\\n      --rig_sensor \"lnav rnav\"                \\\n      --first_step stereo                     \\\n      --last_step mesh_gen                    \\\n      --stereo_options \"$stereo_opts\"         \\\n      --pc_filter_options \"$pc_filter_opts\"   \\\n      --mesh_gen_options \"$mesh_gen_opts\"     \\\n      --left ${outDir}/left.txt               \\\n      --right ${outDir}/right.txt             \\\n      --out_dir ${outDir}\n\nThis created::\n\n    ${outDir}/lnav_rnav/fused_mesh.ply\n\nSee the produced mesh in :numref:`rig_msl_figure`.\n\n.. _msl_registration:\n\nGround registration\n~~~~~~~~~~~~~~~~~~~\n\nTo create DEMs, for example for rover cameras, the cameras should be registered\nto the ground. We will discuss how to do that both when a prior DEM is available\nand when not. For registration to a local Cartesian coordinate system, see\ninstead :numref:`rig_calibrator_registration`.\n\nInvocation of bundle adjustment\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe ``rig_calibrator`` option ``--save_pinhole_cameras`` can export the camera\nposes to Pinhole format (:numref:`pinholemodels`). It will also save the list of\ninput images (:numref:`rc_ba`).\n\nThese can be ingested by ASP's bundle adjustment program\n(:numref:`bundle_adjust`). It can transform the cameras to ground coordinates\nusing ground control points (GCP, :numref:`bagcp`), with the option\n``--transform-cameras-with-shared-gcp``.\n\nHere is an example invocation::\n\n    bundle_adjust                         \\\n    --image-list rig_out/image_list.txt   \\\n    --camera-list rig_out/camera_list.txt \\\n    --nvm rig_out/cameras.nvm             \\\n    --num-iterations 0                    \\\n    --inline-adjustments                  \\\n    --datum D_MARS                        \\\n    --remove-outliers-params \"75 3 50 50\" \\\n    --transform-cameras-with-shared-gcp   \\\n    gcp1.gcp gcp2.gcp gcp3.gcp            \\\n    -o ba/run\n\nThe ``--datum`` option is very important, and it should be set depending\non the planetary body. \n\nUsing zero iterations will only apply the registration transform, and \n*will preserve* the rig structure, up to a scale factor.\n\nWith a positive number of iterations, the cameras will be further refined\nin bundle adjustment, while using the GCP. For such refinement it is important\nto have many interest point matches between the images. This will *not preserve*\nthe rig structure.\n\nWe used high values in ``--remove-outliers-params`` to avoid removing valid\nfeatures in the images if there is unmodeled distortion.\n\nSee :numref:`ba_err_per_point` for a report file that measures reprojection errors,\nincluding for GCP. It is very important to examine those. They should be less\nthan a few dozen pixels, and ideally less.\n\nWith the cameras correctly registered and self-consistent, dense stereo point\nclouds and DEMs can be created (:numref:`nextsteps`), that can be mosaicked\n(:numref:`dem_mosaic`) and aligned to a prior dataset (:numref:`pc_align`).\n\nFor difficult areas with few interest points matches, the images (with cameras\nnow in planetary coordinates) can be mapprojected, and the resulting images can\nbe used to find many more interest points (:numref:`mapip`). \n                           \nUse of registered data with rig_calibrator\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe ``bundle_adjust`` program will produce the file ``ba/run.nvm`` having\nthe registered camera positions and the control network. This can be passed\nback to ``rig_calibrator``, if needed, together with the latest optimized rig,\nwhich is at ``rig_out/rig_config.txt``. The command is::\n\n    rig_calibrator                        \\\n      --rig-config rig_out/rig_config.txt \\\n      --nvm ba/run.nvm                    \\\n      --camera-poses-to-float \"lnav rnav\" \\\n      --intrinsics-to-float \"$float\"      \\\n      --num-iterations 100                \\\n      --num-passes 2                      \\\n      --num-overlaps 0                    \\\n      --out-dir rig_out_reg\n\nHere we set ``--num_overlaps 0`` as we do not want to try to create interest\npoint matches again.\n\nGCP and custom DEM creation\n^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nGCP files can be created manually by point-and-click in ``stereo_gui``\n(:numref:`creatinggcp`) or automatically (:numref:`gcp_gen`), if a prior DEM\nand/or orthoimage are available.\n\nIf no prior DEM is available, it is possible to tie several features in the\nimages to made-up ground points. For example, consider a ground box with given\nwidth and height, in meters, such as 10 x 4 meters. Create a CSV file named\n``ground.csv`` of the form::\n\n    # x (meters) y(meters) height (meters) \n    0 0 0 \n    10 0 0 \n    10 4 0\n    0 4 0 \n\nThis can be made into a DEM with ``point2dem`` (:numref:`point2dem`)::\n\n  proj=\"+proj=stere +lat_0=0 +lat_ts=0 +lon_0=0 +k=1 +x_0=0 +y_0=0 +a=3396190 +b=3396190 +units=m +no_defs\"\n  format=\"1:northing,2:easting,3:height_above_datum\"\n  point2dem                    \\\n    --datum D_MARS             \\\n    --csv-format \"$format\"     \\\n    --csv-srs \"$proj\"          \\\n    --t_srs \"$proj\"            \\\n    --tr 0.1                   \\\n    --search-radius-factor 0.5 \\\n    ground.csv\n\nEnsure the correct planet radii and datum are used. The projection can be\nauto-determined (:numref:`point2dem_proj`).\n\nThen, following the procedure :numref:`creatinggcp`, features can be picked in\nthe images and tied to some of the corners of this box, creating GCP files,\nwhich are then used as earlier.\n\nMultiple subsets of the images can be used, with each producing a GCP file.\nAll can then be passed together to ``bundle_adjust``.\n\n.. _msl_validation:\n\nValidation of registered DEMs\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nSolving for both intrinsics and camera poses is a complex nonlinear problem,\nthat may have more than one solution. It is strongly suggested to compare the\nproduced individual DEMs (after alignment, :numref:`pc_align`) to a trusted DEM,\neven if at a lower resolution. \n\nIn case of horizontal misalignment, it is suggested to individually align the\nproduced DEMs to the prior DEM, apply the alignment transform to the cameras\n(:numref:`ba_pc_align`), then redo the bundle-adjustment with the aligned\ncameras and the prior DEM as a constraint (:numref:`kaguya_ba`), while refining\nthe intrinsics. It is suggested to use a value of ``--heights-from-dem-uncertainty``\nmaybe as low as 0.1 or 0.01, if desired to fit tightly to the prior DEM. This may come,\nhowever, at the cost of internal consistency.\n\nThe triangulation error for each DEM (:numref:`point2dem`) can help evaluate the\naccuracy of the intrinsics. The ``geodiff`` program (:numref:`geodiff`), can be\nused to assess the vertical agreement between DEMs.\n\nFor cases when the ASP-produced DEMs have remaining strong differences with the\nprior DEM, use the ``dem2gcp`` program (:numref:`dem2gcp`) to create GCPs to help\ncorrect this. One GCP file can be produced for each stereo pair, and then all\ncan be passed to ``bundle_adjust``.\n\n.. figure:: ../images/viper_ground_truth_stereo_dem.png\n   :name: viper_ground_truth_stereo_dem\n   :alt:  VIPER ground truth stereo DEM\n  \n   A DEM measured with a point cloud scanner (top) and a mosaicked DEM produced\n   with ASP (bottom), that was carefully validated with the measured DEM. Data\n   acquired in the `Regolith Testbed\n   <https://www.nasa.gov/centers-and-facilities/ames/the-lunar-lab-and-regolith-testbeds/>`_\n   at NASA Ames. The noise in the upper-left corner is due to an occluding light\n   source. Other sources of noise are because of shadows. The ``asp_bm`` algorithm was\n   used (:numref:`stereo_alg_overview`), which is one of the older algorithms in ASP.\n\nNotes\n~~~~~\n\n - The voxel size for binning and meshing the point cloud was chosen\n   manually. An automated approach for choosing a representative voxel\n   size is to be implemented.\n - The ``multi_stereo`` program does not use the interest points found\n   during SfM map construction. That would likely result in a good\n   speedup. It also does not run the stereo pairs in parallel.\n"
  },
  {
    "path": "docs/examples/orbital_rig.rst",
    "content": ".. _orbital_rig:\n\nOrbital rig\n-----------\n\nThis example shows how to produce synthetic images and cameras that model an\norbital rig with two frame camera sensors, and how to use the\n:ref:`rig_calibrator` tool to refine the rig parameters, camera intrinsics, and\ncamera poses. This example demonstrates the new DEM height constraint feature\nthat constrains triangulated points to a reference DEM for improved accuracy.\n\nInput DEM and orthoimage\n~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe synthetic data for this example is created with :ref:`sat_sim`, which\nrequires a DEM and an orthoimage of a region of interest as input. \n\nTo prepare this data, we obtained the free ASTER dataset::\n\n  AST_L1A_00404012022185436_20250920182851.hdf\n\naround the San Luis Reservoir in Northern California. A DEM was created following\nthe workflow in :numref:`aster`. The orthoimage was produced by invoking\n:ref:`mapproject` at a nominal resolution of 15 m/pixel. This resolution\nreflects the ground sample distance (GSD) of the ASTER images.\n\nSynthetic images\n~~~~~~~~~~~~~~~~\n\nThe synthetic images and cameras were created with ``sat_sim``, which can\nsimulate an orbital rig (:numref:`sat_sim_rig`).\n\nThe rig was designed with left and right frame cameras, named ``left`` and\n``right``. The initial rig configuration was created as described in\n:numref:`msl_init_rig`. The sensor dimensions were set to 1000 x 1000\npixels, with the principal point at the image center. No lens distortion\nwas assumed.\n\nThe satellite height was set to 700 km, and the focal length to 35000 pixels.\nThis results in an estimated GSD of about 20 meters (GSD is approximately\nthe satellite height divided by the focal length). These parameters are\nconsistent with the ASTER instrument.\n\nThe ``sat_sim`` command for the nadir images was::\n\n    sat_sim                           \\\n        --dem aster_dem.tif           \\\n        --ortho aster_ortho.tif       \\\n        --rig-config aster_rig.txt    \\\n        --rig-sensor-ground-offsets   \\\n        -0.01,0,-4000,0,0.01,0,4000,0 \\\n        --first 1300 1200 700000      \\\n        --last  1300 1500 700000      \\\n        --first-ground-pos 1300 1200  \\\n        --last-ground-pos  1300 1500  \\\n        --roll 0 --pitch 0 --yaw 0    \\\n        --num 3                       \\\n        --velocity 7500               \\\n        -o sat_sim/run-nadir\n\nThe ``--rig-sensor-ground-offsets`` option places the left and right sensor\ncenters 0.01 m to each side of the rig center, and their footprints on the\nground are separated by 8000 m in the East-West direction. The satellite\nitself follows a North-South orbit.\n\nThe rig configuration incorporating these controls is saved to the file::\n\n    sat_sim/run-nadir-rig_config.txt\n    \nThis file contains the relationship between the rig sensors in the\n``ref_to_sensor_transform`` field, in addition to the intrinsics from the\ninput rig. More details are in :numref:`sat_sim_rig_adjust`.\n\nA similar command is run to create forward-looking images, but with the\n``--pitch`` value set to 30 degrees and the output prefix set to\n``sat_sim/run-fwd``.\n\nThe produced images will have names like::\n\n    sat_sim/run-nadir-0010000.418204756-left.tif\n    sat_sim/run-fwd-0009939.411652856-right.tif\n\nfollowing the naming convention in :numref:`rig_data_conv`. The components\nof these filenames are the output prefix, the timestamp, and the sensor\nname. Time modeling is described in :numref:`sat_sim_time`, and all options\nfor this program are documented in :ref:`sat_sim_options`.\n\n.. figure:: ../images/orbital_rig.png\n   :name: orbital_rig_fig\n   :alt:  Orbital rig example\n\n   A sample left and right image as produced by the rig (after mapprojection).\n   The images have notable overlap. These show some fields and mountain\n   foothills in California's Central Valley.\n\nInterest point matches\n~~~~~~~~~~~~~~~~~~~~~~\n\nThe ``rig_calibrator`` program expects the camera poses and the interest point\nmatches between images to be stored in an NVM file (a format commonly employed in\nStructure-from-Motion applications). See :numref:`ba_nvm`.\n\nSince there are 12 input images, and each must be matched against every other\none, the :numref:`parallel_bundle_adjust` program is called to ensure\nparallelization::\n\n    parallel_bundle_adjust       \\\n      --ip-per-image 10000       \\\n      --output-cnet-type nvm     \\\n      sat_sim/*{left,right}.tif  \\\n      sat_sim/*{left,right}.tsai \\\n      --camera-weight 1.0        \\\n      --tri-weight 1.0           \\\n      --num-iterations 100       \\\n      -o ba/run\n\nRig calibration\n~~~~~~~~~~~~~~~\n\nThe :ref:`rig_calibrator` program is then run::\n\n    rig_calibrator                                  \\\n      --rig-config sat_sim/run-nadir-rig_config.txt \\\n      --use-initial-rig-transforms                  \\\n      --fix-rig-translations                        \\\n      --nvm ba/run.nvm                              \\\n      --camera-poses-to-float \"left right\"          \\\n      --intrinsics-to-float                         \\\n      \"left:focal_length right:focal_length\"        \\\n      --camera-position-uncertainty 1.0             \\\n      --heights-from-dem aster_dem.tif              \\\n      --heights-from-dem-uncertainty 2.0            \\\n      --heights-from-dem-robust-threshold 0.1       \\\n      --tri-weight 1.0                              \\\n      --save-pinhole-cameras                        \\\n      --num-iterations 100                          \\\n      --out-dir rig\n\nSince the input data is perfect, very few changes are expected. The produced\npinhole cameras (:numref:`pinholemodels`), saved in the output ``rig`` directory\n(via the ``--save-pinhole-cameras`` option), should be very similar to the\ninitial inputs in the ``sat_sim`` directory.\n\nThe ``--heights-from-dem`` option demonstrates the new DEM constraint feature.\nThe implementation is as for bundle adjustment (:numref:`heights_from_dem`).\n\nHere we used ``--use-initial-rig-transforms`` because we start with a known rig,\nrather than having to determine it from camera poses. \n\nThe option ``--fix-rig-translations`` is quite important for orbital rigs. The\ndistance between rig sensors is very small compared to the distance from the\nsatellite to the ground. Without this constraint the rig sensors could move\nnotably in the sensor plane without affecting the reprojection error. \n\nConsider using here the option ``--camera-position-uncertainty``. It is\nsuggested to be generous with the uncertainty value, as this constraint can\nprevent convergence.\n\nSee :numref:`rig_opts` for the full list of options.\n"
  },
  {
    "path": "docs/examples/pbs_slurm.rst",
    "content": ".. _pbs_slurm:\n\nUsing PBS and SLURM\n-------------------\n\nRunning ``parallel_stereo`` (:numref:`parallel_stereo`) can be very\ncomputationally expensive, so often it is launched on high-performance\nmulti-machine systems. Here it will be shown how to run this program on a\n*Portable Batch System* (*PBS*) setup, such as NASA Pleiades, and on a *Simple\nLinux Utility for Resource Management* (*SLURM*) system.\n\nIn either of these, it is assumed that all compute nodes share disk storage\nspace and are able communicate with ssh without password. The list of nodes\nmust be passed as an argument to this program via ``--nodes-list``.\n\nPBS\n~~~\n\nOn a PBS system, one can have a script as follows::\n\n    #!/bin/bash\n\n    # Change to current directory\n    cd $PBS_O_WORKDIR\n\n    # Set the path to ASP tools \n    export PATH=/path/to/ASP/bin:$PATH\n\n    # Run parallel_stereo\n    parallel_stereo --stereo-algorithm asp_mgm \\\n      --processes 4 --subpixel-mode 3 -t rpc   \\\n      --nodes-list $PBS_NODEFILE               \\\n      left.tif right.tif left.xml right.xml    \\\n      run/run\n\n    # Run point2dem\n    point2dem --auto-proj-center run/run-PC.tif \n\nNote the two special environmental variables ``PBS_O_WORKDIR`` and ``PBS_NODEFILE``\nwhich refer to the current work directory in which the script is started, and the\nlist of nodes allocated for the job.\n\nEnsure the option ``--nodes-list`` is set, otherwise only the head node\nwill be used.\n  \nThis script, named for example, ``run.sh``, can be launched as::\n\n    qsub -m n -r n -N jobName -l walltime=12:00:00           \\\n       -W group_list=yourGroup -j oe -S /bin/bash            \\\n       -l select=8:ncpus=20:model=ivy -- $(pwd)/run.sh <args>\n\nAdditional arguments can be passed in on this line to ``run.sh``,\nwhich can be accessed from within that script as ``$1``, ``$2``, etc.,\nper bash shell conventions.\n\nIt is strongly suggested to learn what each of the above options does\nand adjust them for your needs.\n\nSLURM\n~~~~~\n\nWith SLURM, a script as follows can work::\n\n    #!/bin/bash\n    \n    #SBATCH --job-name=asp\n    #SBATCH --output=asp.log\n    #SBATCH --nodes=4\n    #SBATCH --ntasks-per-node=36\n    #SBATCH --time=50:00:00\n    #SBATCH --partition=queue1\n    \n    # Change to the directory in which the job was submitted\n    cd $SLURM_SUBMIT_DIR\n \n    # Create a temporary list of nodes in current directory\n    nodesList=$(mktemp -p $(pwd))\n\n    # Set up the nodes list\n    scontrol show hostname $SLURM_NODELIST | tr ' ' '\\n' > $nodesList\n    \n    # Run parallel_stereo. (Ensure that this program is in the path.)\n    parallel_stereo --nodes-list $nodesList  \\\n      --processes 4                          \\\n      --parallel-options '--sshdelay 0.1'    \\\n      <other ASP options> \n\n   # Delete the temporary list of nodes\n   /bin/rm -fv $nodesList\n \nAs before, the options and values above should be adjusted for your needs.\n\nEnsure the option ``--nodes-list`` is set, otherwise only the head node\nwill be used.\n\nIf your SLURM setup requires a custom ssh port, set in the list of nodes\nthe full ssh command to each node, rather than the node name. Example::\n\n  ssh -p port1 node1\n  ssh -p port2 node2\n\n"
  },
  {
    "path": "docs/examples/perusat1.rst",
    "content": ".. _perusat1:\n\nPeruSat-1\n---------\n\nPeruSat-1 (launched 2016) is a Peruvian Earth observation satellite with\n0.7-meter panchromatic resolution. It provides exact linescan camera models and\nRPC-approximated camera models in separate files. The names for these start with\n\"DIM\" and \"RPC\", respectively, and end with \".XML\".\n\nASP expects raw (non-orthorectified) images. The USGS CSM library (:numref:`csm`)\nis used for the linescan model.\n\nThe session type is ``-t perusat`` (:numref:`ps_options`). If the ``-t``\noption is not specified, it will be auto-detected from the camera files.\n\nFor the RPC model (:numref:`rpc`), the option ``-t rpc`` should be used\nand the RPC camera files should be passed in.\n\n.. _perusat1_stereo:\n\nBundle adjustment and stereo with raw images\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nBundle adjustment (:numref:`bundle_adjust`) is suggested before stereo::\n\n    bundle_adjust -t perusat         \\\n      --camera-weight 0              \\\n      --tri-weight 0.1               \\\n      left.tif right.tif             \\\n      left_exact.xml right_exact.xml \\\n      -o ba/run\n\nWith the exact models, the stereo command, with bundle-adjusted cameras, is::\n\n    parallel_stereo -t perusat        \\\n      --stereo-algorithm asp_mgm      \\\n      --subpixel-mode 9               \\\n      --bundle-adjust-prefix ba/run   \\\n      left.tif right.tif              \\\n      left_exact.xml right_exact.xml  \\\n      results/run\n\nThen, a DEM is created with ``point2dem`` (:numref:`point2dem`)::\n\n    point2dem results/run-PC.tif\n\nFor steep terrain, it is suggested to run stereo with mapprojected images\n(:numref:`perusat1_map`).\n\nSee :numref:`nextsteps` for a discussion about various speed-vs-quality choices\nfor stereo.\n\nSee :numref:`jitter_pleiades` for an example of solving for jitter with these\ncameras. Note the limitations of the jitter solver in\n:numref:`jitter_limitations`. This is available as of build 2026/03\n(:numref:`release`).\n\n.. _perusat1_map:\n\nStereo with mapprojected images\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nASP supports running stereo with mapprojected PeruSat-1 images\n(:numref:`mapproj-example`). As of build 2026/03 (:numref:`release`),\nmapprojection is significantly faster due to the switch to the CSM camera model.\n\nAll input images must be mapprojected at the same resolution (which is\ncomparable with the ground sample distance, GSD). The same camera models must be\nused for mapprojection as for stereo, so one should not mix the exact and RPC\ncameras.\n\nIt is strongly suggested to verify that the input DEM used for mapprojection is\nrelative to the ellipsoid (:numref:`conv_to_ellipsoid`).\n\nExample::\n\n    proj=\"+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs\"\n\n    mapproject -t perusat              \\\n      --tr 0.7                         \\\n      --t_srs \"$proj\"                  \\\n      --bundle-adjust-prefix ba/run    \\\n      ref_dem.tif                      \\\n      left.tif                         \\\n      left_exact.xml                   \\\n      left_map.tif\n\n    mapproject -t perusat              \\\n      --tr 0.7                         \\\n      --t_srs \"$proj\"                  \\\n      --bundle-adjust-prefix ba/run    \\\n      ref_dem.tif                      \\\n      right.tif                        \\\n      right_exact.xml                  \\\n      right_map.tif\n\n    parallel_stereo -t perusat        \\\n      --stereo-algorithm asp_mgm      \\\n      --subpixel-mode 9               \\\n      --bundle-adjust-prefix ba/run   \\\n      left_map.tif right_map.tif      \\\n      left_exact.xml right_exact.xml  \\\n      run_map/run                     \\\n      ref_dem.tif\n\n    point2dem run_map/run-PC.tif\n\nThe projection string above needs to be modified for your area of interest. It\nis strongly suggested to use an auto-determined UTM or polar stereographic\nprojection (:numref:`point2dem_proj`).\n\nThe value of the ``--tr`` option is the ground sample distance. It is normally\n0.7 meters for PeruSat-1 PAN images. The XML files should have the GSD value.\n\nTo not use bundle-adjusted cameras, remove the option ``--bundle-adjust-prefix``\nfrom all ``mapproject`` and ``parallel_stereo`` commands above.\n\nIt is strongly suggested to overlay the left and right mapprojected images on\neach other and on the input DEM in ``stereo_gui`` (:numref:`stereo_gui`). A\nsystematic shift likely indicates a vertical datum disagreement between the DEM\nand the camera models.\n\n.. _perusat1_notes:\n\nNotes\n~~~~~\n\nFor PeruSat-1 exact linescan camera models the atmospheric correction and\nvelocity aberration corrections (:cite:`nugent1966velocity`) are disabled, as\nthese decrease somewhat the agreement with the RPC models.\n\nDEMs created with the exact and RPC models differ by a systematic\nvertical shift of about 15 meters for unknown reasons, even though the\nintersection error maps are very similar. Nothing in the sensor manual\nor camera metadata suggests the cause of this. The ``pc_align`` tool\n(:numref:`pc_align`) can be used to reduce this discrepancy. The mean absolute\ndifference of the (full-image extent) aligned DEMs is about 0.17\nmeters.\n"
  },
  {
    "path": "docs/examples/pleiades.rst",
    "content": ".. _pleiades:\n\nPleiades\n--------\n\nASP supports the 1A/1B and NEO satellites from Airbus Pleiades. For NEO, see\n:numref:`pleiades_neo` for additional notes. SPOT 6 and 7 use a closely related\ncamera model (:numref:`spot67`).\n\nGenerally, ASP expects raw images, not orthorectified images. ASP supports the\nPleiades ortho products, if the projection was done on a surface of constant\nheight (:numref:`pleiades_projected`). It does not support images orthorectified\nwith a 3D terrain model.\n\nThe Airbus Pleiades data have both an exact linescan camera model and an\napproximate RPC model (:numref:`rpc`). These are stored in separate files. The\nnames for these start with \"DIM\" and \"RPC\", respectively, and end with \".XML\".\nASP supports both kinds. The USGS CSM library (:numref:`csm`) is used for\nlinescan models.\n\nSee :numref:`jitter_pleiades` for an example of solving for\njitter for these cameras.\n\nBundle adjustment and stereo with raw images\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nSee :numref:`airbus_tiled` if the input images arrive in multiple tiles. \n\nBundle adjustment (:numref:`bundle_adjust`) is suggested before stereo. It\nshould be run as::\n\n    bundle_adjust -t pleiades        \\\n      --camera-weight 0              \\\n      --tri-weight 0.1               \\\n      left.tif right.tif             \\\n      left_exact.xml right_exact.xml \\\n      -o ba/run\n\nWith the exact models, the stereo command, with bundle-adjusted cameras, is::\n\n    parallel_stereo -t pleiades        \\\n        --stereo-algorithm asp_mgm     \\\n        --subpixel-mode 9              \\\n        --bundle-adjust-prefix ba/run  \\\n        left.tif right.tif             \\\n        left_exact.xml right_exact.xml \\\n        results/run\n\nThen, a DEM is created with ``point2dem`` (:numref:`point2dem`)::\n\n    point2dem results/run-PC.tif\n\nFor steep terrain, it is suggested to run stereo with mapprojected\nimages (:numref:`pleiades_map`).\n    \nSee :numref:`nextsteps` for a discussion about various\nspeed-vs-quality choices for stereo.\n\nFor the RPC model the option ``-t rpc`` should be used and the correct\ncamera files should be passed in. If the ``-t`` option is not\nspecified, it will be auto-guessed based on the content of the camera\nfiles provided as inputs.\n\nThe ``--bundle-adjust-prefix`` option above enables the use of\nbundle-adjusted cameras.\n\nFor Pleiades exact linescan camera models the atmospheric correction\nand velocity aberration corrections (:cite:`nugent1966velocity`) are\ndisabled. This ensures that the exact and RPC camera models agree (see\nbelow).\n\n.. _pleiades_map:\n\nStereo with mapprojected images\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nASP supports running stereo with mapprojected Pleiades images\n(:numref:`mapproj-example`). \n\nAll input images must be mapprojected at the same resolution (which is\ncomparable with the ground sample distance, GSD). The same camera models must be\nused for mapprojection as for stereo, so one should not mix the exact and RPC\ncameras.\n\nEnsure the input DEM used for mapprojection is relative to the ellipsoid\n(:numref:`conv_to_ellipsoid`).\n\nExample::\n\n    proj=\"+proj=utm +zone=13 +datum=WGS84 +units=m +no_defs\"\n\n    mapproject -t pleiades          \\\n      --tr 0.5                      \\\n      --t_srs \"$proj\"               \\\n      --bundle-adjust-prefix ba/run \\\n      ref_dem.tif                   \\\n      left.tif                      \\\n      left_exact.xml                \\\n      left_map.tif\n      \n    mapproject -t pleiades          \\\n      --tr 0.5                      \\\n      --t_srs \"$proj\"               \\\n      --bundle-adjust-prefix ba/run \\\n      ref_dem.tif                   \\\n      right.tif                     \\\n      right_exact.xml               \\\n      right_map.tif\n      \n    parallel_stereo -t pleiades      \\\n      --stereo-algorithm asp_mgm     \\\n      --subpixel-mode 9              \\\n      --bundle-adjust-prefix ba/run  \\\n      left_map.tif right_map.tif     \\\n      left_exact.xml right_exact.xml \\\n      run_map/run                    \\\n      ref_dem.tif\n      \n    point2dem run_map/run-PC.tif\n\nThe projection string above needs to be modified for your area of\ninterest. It is strongly suggested to use an auto-determined UTM or polar\nstereographic projection (:numref:`point2dem_proj`).\n\nThe value of the ``--tr`` option is the ground sample distance. It is normally\n0.5 to 0.7 meters for Pleiades PAN images. The XML files should have the GSD\nvalue.\n\nTo not use bundle-adjusted cameras, remove the option ``--bundle-adjust-prefix``\nfrom all ``mapproject`` and ``parallel_stereo`` commands above.\n\nExact and RPC cameras\n~~~~~~~~~~~~~~~~~~~~~\n\nTo compare the linescan (exact) and RPC models, run ``cam_test``\n(:numref:`cam_test`) as::\n\n     cam_test --image img.tif            \\\n       --cam1 cam_exact.xml              \\\n       --cam2 cam_rpc.xml                \\\n       --session1 pleiades --session2 rpc\n\nThis should give great agreement when it comes to pixels projected\nfrom one camera to the ground, then projected back to the other\ncamera::\n\n    cam1 to cam2 pixel diff\n    Max:    0.00304066\n\n    cam2 to cam1 pixel diff\n    Max:    0.00296764\n\nThe camera centers computed by the two methods won't agree, because\nthe RPC camera model does not store the camera center. ASP then\nsubstitutes it with an estimated point on the ray from the camera\ncenter to the ground. This disagreement is not an issue in practice.\n\nCommands similar to the above can be used to compare the exact and RPC\ncameras not to each other but against themselves. This tool will also\nprint timing information for the operation of projecting a pixel to\nthe ground and back.\n\n.. _pleiades_neo:\n\nPleiades NEO\n~~~~~~~~~~~~\n\nSeveral peculiarities make the Pleiades NEO data different from 1A/1B (:numref:`pleiades`):\n\n- The tabulated positions and orientations may start slightly after the first\n  image line and end slightly before the last image line. If these scenarios are\n  encountered, linear extrapolation based on two nearest values is used to fill\n  in the missing values and a warning is printed for each such operation.\n- There is no field for standard deviation of the ground locations of pixels\n  projected from the cameras, so error propagation is not possible unless such a\n  value is specified manually (:numref:`error_propagation`).\n- The RPC camera models for a stereo triplet can be rather inconsistent with\n  each other, resulting in large triangulation error. It is suggested to use\n  instead the exact linescan camera model.\n\n.. _pleiades_projected:\n\nPleiades projected images\n~~~~~~~~~~~~~~~~~~~~~~~~~\n\nAirbus offers Pleiades ortho images, that are projected onto a surface of\nconstant height above a datum. A pair of such images can be used for stereo\nand terrain creation.\n\nEach ortho image comes with two XML files. The first, with the ``DIM`` prefix,\nstores the projection height, in the ``Bounding_Polygon`` XML field, in the\n``H`` subfield. This height is in meters, above the WGS84 ellipsoid. This file\nlacks the camera model, unlike the earlier products.\n\nThe second XML file starts with the ``RPC`` prefix and contains the RPC camera\nmodel. \n\nGiven two such images forming a stereo pair, the heights should be manually read\nfrom the ``DIM`` files. Then, ``parallel_stereo`` should be invoked with\nthe RPC camera files, as discussed in :numref:`mapproj_ortho`.\n\nASP does not support Airbus images that are orthorectified with a 3D terrain\nmodel, as that terrain model is not known.\n\n.. _airbus_tiled:\n\nPleiades tiled images\n~~~~~~~~~~~~~~~~~~~~~\n\nWith some Airbus Pleiades data, each of the left and right images\nmay arrive broken up into .TIF or .JP2 tiles, with names ending in\nR1C1.tif, R2C1.tif, etc.\n\nThese need to be mosaicked before being used. That can be done as\nfollows (individually for the left and right stereo image), using\n``gdalbuildvrt`` (:numref:`gdal_tools`)::\n\n      gdalbuildvrt vrt.tif *R*C*.tif\n\nThis expects any input .tif file to have an associated .tfw (.TFW) file\ncontaining information about how the tiles should be combined.\n\nIf both PAN and multispectral tiles are present, use only the PAN ones.\n\nThis will create a virtual mosaic, which is just a plain text file having\npointers to the subimages. ASP can use that one as if it were a real image. If\ndesired, an actual self-contained image can be produced with::\n\n    gdal_translate -co TILED=YES -co BLOCKXSIZE=256 -co BLOCKYSIZE=256 \\\n      -co BIGTIFF=IF_SAFER vrt.tif image.tif\n\nNote that the size of this image will be comparable to the sum of sizes\nof the original tiles.\n\nThe Orfeo Toolbox provides functionality for stitching such images as well.\n\n"
  },
  {
    "path": "docs/examples/rig.rst",
    "content": ".. _rig_calibrator_example:\n\nA 3-sensor rig example\n^^^^^^^^^^^^^^^^^^^^^^\n\nThis is an example using ``rig_calibrator`` (:numref:`rig_calibrator`)\non images acquired in a lab with cameras mounted on the `Astrobee\n<https://github.com/nasa/astrobee>`_ robot. See :numref:`rig_examples`\nfor more examples.\n\nAn illustration is in :numref:`rig_calibrator_textures`. The dataset\nfor this example is available `for download\n<https://github.com/NeoGeographyToolkit/StereoPipelineSolvedExamples/releases/tag/rig_calibrator>`_.\n\nThis robot has three cameras: ``nav_cam`` (wide field of view, using\nthe fisheye distortion model), ``sci_cam`` (narrow field of view,\nusing the radtan distortion model), and ``haz_cam`` (has depth\nmeasurements, with one depth xyz value per pixel, narrow field of\nview, using the radtan distortion model).\n\nWe assume the intrinsics of each sensor are reasonably well-known (but\ncan be optimized later). Those are set in the rig configuration\n(:numref:`rig_config`). The images are organized as as in\n:numref:`rig_data_conv`.\n\nThe first step is solving for the camera poses, for which we use \n``theia_sfm`` (:numref:`theia_sfm`)::\n\n    theia_sfm --rig-config rig_input/rig_config.txt \\\n      --images 'rig_input/nav_cam/*.tif\n                rig_input/haz_cam/*.tif \n                rig_input/sci_cam/*.tif'            \\\n      --out-dir rig_theia\n\nThis tool will use the Theia flags file from ``share/theia_flags.txt``\nin the software distribution, which can be copied to a new name,\nedited, and passed to this program via ``--theia_flags``.\n\nFor this example, it is suggested to edit that flags file and set \n``--feature_density=DENSE``, as the default number of features found\nby Theia may be too low for the images in this dataset.\n\nThe created cameras can be visualized as::\n\n    view_reconstruction --reconstruction rig_theia/reconstruction-0\n\nSee an illustration in :numref:`view_reconstruction`.\n\nThe solved camera poses are exported to ``rig_theia/cameras.nvm``. The images\nand interest point matches can be visualized in a pairwise manner using\n``stereo_gui`` (:numref:`stereo_gui_nvm`) as::\n\n    stereo_gui rig_theia/cameras.nvm\n\nThe images in the nvm file will be in random order. This will be\nrectified by ``rig_calibrator``.\n\nNext, we run ``rig_calibrator``::\n\n    float_intr=\"\" # not floating intrinsics\n    rig_calibrator                                        \\\n        --rig-config rig_input/rig_config.txt             \\\n        --nvm rig_theia/cameras.nvm                       \\\n        --camera-poses-to-float \"nav_cam sci_cam haz_cam\" \\\n        --intrinsics-to-float \"$float_intr\"               \\\n        --depth-to-image-transforms-to-float \"haz_cam\"    \\\n        --float-scale                                     \\\n        --bracket-len 1.0                                 \\\n        --bracket-single-image                            \\\n        --num-iterations 100                              \\\n        --num-passes 2                         \\\n        --registration                                    \\\n        --hugin-file control_points.pto                   \\\n        --xyz-file xyz.txt                                \\\n        --export-to-voxblox                               \\\n        --out-dir rig_out\n\nThe previously found camera poses are read in. They are registered to world\ncoordinates (this is optional). For that, the four corners of a square with\nknown dimensions visible in a couple of images were picked at control points in\n``Hugin`` (https://hugin.sourceforge.io/) and saved to ``control_points.pto``,\nand the corresponding measurements of their coordinates were saved in\n``xyz.txt``. See :numref:`rig_calibrator_registration` for more details.\n\nThe ``nav_cam`` camera is chosen to be the reference sensor in the rig\nconfiguration. Its poses are allowed to float, that is, to be\noptimized (``--camera-poses-to-float``), and the rig transforms from\nthis one to the other ones are floated as well, when passed in via the \nsame option. The scale of depth clouds is floated as well\n(``--float-scale``).\n\nHere we chose to optimize the rig while keeping the intrinsics\nfixed. Floating the intrinsics, especially the distortion parameters,\nrequires many interest point matches, especially towards image boundary,\nand can make the problem less stable. If desired to float them,\none can replace ``float_intr=\"\"`` with::\n\n    intr=\"focal_length,optical_center,distortion\"\n    float_intr=\"nav_cam:${intr} haz_cam:${intr} sci_cam:${intr}\"\n\nwhich will be passed above to the option ``--intrinsics-to-float``.\n\nIn this particular case, the real-world scale (but not orientation) would\nhave been solved for correctly even without registration, as it would\nbe inferred from the depth clouds. \n\nSince the ``nav_cam`` camera has a wide field of view, the values\nin ``distorted_crop_size`` in the rig configuration are smaller than\nactual image dimensions to reduce the worst effects of peripheral\ndistortion.\n\nOne could pass in ``--num-overlaps 10`` to get more interest point \nmatches than what Theia finds, but this is usually not necessary.\nThis number better be kept small, especially if the features\nare poor, as it may result in many outliers among images that\ndo not match well.\n\nThe value of ``--bracket-len`` should be a little larger than the differences\n(in seconds) between the image times for which it is desired to do pose\ninterpolation in time. The option ``--bracket-single-image`` is used to ensure\nthat just a single non-reference image is used for each time bracket\n(useful if there are too many images).\n\nThe options ``--save-pinhole-cameras`` and ``--save-matches`` \ncan be employed to save the pinhole cameras and the interest point matches\nin formats understood by ``bundle_adjust`` (:numref:`bundle_adjust`) and\n``stereo_gui`` (:numref:`stereo_gui_nvm`), respectively.\n\nSee :numref:`rig_opts` for the full list of options.\n\nThe obtained point clouds can be fused into a mesh using ``voxblox_mesh`` \n(:numref:`voxblox_mesh`), using the command::\n    \n    voxblox_mesh --index rig_out/voxblox/haz_cam/index.txt \\\n      --output_mesh rig_out/fused_mesh.ply                 \\\n      --min_ray_length 0.1 --max_ray_length 4.0            \\\n      --voxel_size 0.01\n\nThis assumes that depth sensors were present. Otherwise, can needs to\ncreate point clouds with stereo, see :numref:`multi_stereo`.\n\nThe output mesh is ``fused_mesh.ply``, points no further than 2\nmeters from each camera center are used, and the mesh is obtained\nafter binning the points into voxels of 1 cm in size.\n\nFull-resolution textured meshes can be obtained by projecting and\nfusing the images for each sensor with ``texrecon``\n(:numref:`texrecon`)::\n\n    for cam in nav_cam sci_cam; do \n      texrecon --rig_config rig_out/rig_config.txt \\\n        --camera_poses rig_out/cameras.txt         \\\n        --mesh rig_out/fused_mesh.ply              \\\n        --rig_sensor ${cam}                        \\\n        --undistorted_crop_win '1000 800'          \\\n        --out_dir rig_out/texture\n    done\n\nThe obtained textured meshes can be inspected for disagreements, by\nloading them in MeshLab, as::\n\n    meshlab rig_out/fused_mesh.ply        \\\n      rig_out/texture/nav_cam/texture.obj \\\n      rig_out/texture/sci_cam/texture.obj \n\nSee an illustration in :numref:`rig_calibrator_textures`. See a larger\nexample in  :numref:`sfm_iss`, using two rigs.\n"
  },
  {
    "path": "docs/examples/rpc.rst",
    "content": ".. _rpc:\n\nRPC camera models\n-----------------\n\nSome vendors, such as GeoEye with its Ikonos and two\nGeoEye satellites, Airbus, with its SPOT and Pleiades satellites, the\nIndian Cartosat-1 satellite, PeruSat-1, the Spanish Deimos 1 and 2,\netc., provide Rational Polynomial Coefficient (RPC) camera models.\n\n(Certain providers also offer exact linescan models. ASP supports the\nones from DigitalGlobe/Maxar (:numref:`dg_tutorial`),\nPeruSat-1 (:numref:`perusat1`), Pleiades 1A/1B (:numref:`pleiades`),\nSPOT 5 (:numref:`spot5`), and SPOT 6/7 (:numref:`spot67`).)\n\nAbout RPC\n~~~~~~~~~\n\nRPC represents four 20-element polynomials that map geodetic coordinates\n(longitude-latitude-height above datum) to image pixels. Since they are\neasy to implement and fast to evaluate, RPC represents a universal\ncamera model providing a simple approximation to complex exact camera\nmodels that are unique to each vendor. The only downside is that it has\nless precision in our opinion compared to the exact camera models.\n\nOur RPC read driver is GDAL. If the command ``gdalinfo``\n(:numref:`gdal_tools`) can identify the RPC information inside the\nheaders of your image files (whether that information is actually\nembedded in the images, or stored separately in some auxiliary files\nwith a convention GDAL understands), ASP will likely be able to see it\nas well. This means that sometimes we can get away with only providing\na left and right image, with no extra files containing camera\ninformation. This is specifically the case for GeoEye, and\nCartosat-1. \n\nOtherwise, the camera files must be specified separately in XML files, as done\nfor DigitalGlobe/Maxar images (:numref:`rawdg`) and PeruSat-1.\n\nSee :numref:`airbus_tiled` if the input Pleiades images arrive in multiple\ntiles.\n\nExamples\n~~~~~~~~\n\nHere we work with a GeoEye dataset for Hobart, Australia. As previously stated\nin :numref:`dg_tutorial`, these types of images are not ideal for ASP. This is\nboth a forest and a urban area which makes correlation difficult. ASP was\ndesigned more for modeling bare rock and ice. Any results we produce in other\nenvironments is a bonus but is not our objective.\n\n.. figure:: ../images/examples/geoeye/GeoEye_CloseUp_triple.png\n   :name: geoeye-nomap-example\n\n   Example colorized height map and ortho image output, produced\n   with ``point2dem`` (:numref:`point2dem`) and ``mapproject``\n   (:numref:`mapproject`), respectively.\n\nGoeEye's datasets have the RPC coefficients stored as part of the\nimages. The stereo command is then::\n\n    parallel_stereo -t rpc       \\\n      --stereo-algorithm asp_mgm \\\n      --subpixel-mode 9          \\\n      left.tif right.tif         \\\n      results/run\n\nSee :numref:`nextsteps` for a discussion about various speed-vs-quality choices.\n\nFor terrains having steep slopes, we recommend that images be mapprojected onto\nan existing DEM before running stereo. This is described in\n:numref:`mapproj-example`.\n\nNext, ``point2dem`` (:numref:`point2dem`) is run::\n\n    point2dem --auto-proj-center results/run-PC.tif\n    \nFor some cameras the RPC coefficients are stored in separate files ending in\n.RPB or \\_RPC.TXT (or in lower-case). These will be loaded automatically and\nshould not be specified in the stereo command. \n\nFor Cartosat data sometimes one should overwrite the \\_RPC.TXT files\nthat are present with the ones that end in RPC_ORG.TXT in order for\nstereo to work.\n\nIf the RPC cameras are stored separately in XML files, the stereo \ncommand is::\n\n    parallel_stereo -t rpc       \\\n      --stereo-algorithm asp_mgm \\\n      --subpixel-mode 9          \\\n      left.tif right.tif         \\\n      left.xml right.xml         \\\n      results/run\n\nThe RPC cameras can be bundle-adjusted (:numref:`bundle_adjust`).\n\nIf the RPC coefficients are stored in the input images, ``mapproject``\ncopies them to the output mapprojected images. If these coefficients\nare in the associated .RPB or \\_RPC.TXT files, ``mapproject`` creates\nsuch files for each mapprojected image.\n\nSee :numref:`other-mapproj` for how ``parallel_stereo`` is invoked\nwith mapprojected images when the cameras are stored either separately\nor part of the images.\n\n.. _rpc_and_ba:\n\nAdjusted RPC cameras\n~~~~~~~~~~~~~~~~~~~~\n\nIt is suggested to run bundle adjustment (:numref:`bundle_adjust`) before\nstereo, to ensure the cameras are self-consistent. An example is in\n:numref:`ba_rpc`.\n\nBundle adjustment produces ``.adjust`` files that have rotation and translation\nadjustments to the original cameras. These can be passed to other ASP tools via\nthe ``--bundle-adjust-prefix`` option. \n\nTo make new RPC cameras, with the adjustments already applied to them, use the\n``bundle_adjust`` option ``--save-adjusted-rpc``. These are saved in the\n``bundle_adjust`` output directory, with names ending in ``.adjusted_rpc.xml``.\nThese cameras can be used with ASP and third-party software.\n\nAny produced adjusted RPC model file can be loaded by GDAL when reading an image\n(including with ``gdalinfo``, :numref:`gdal_tools`) if it is renamed to have the same\nname as the image but with the ``.xml`` extension, and no analogously named\n``.RPB`` or ``_RPC.txt`` files are present that *may take precedence*. See the\n`GeoTiff documentation\n<https://gdal.org/en/stable/drivers/raster/gtiff.html#georeferencing>`_.\n\nApplying the adjustments refits the RPC models, and should create cameras that\nagree well with the ones with the adjustments applied externally.\n\nIt is strongly suggested to use the ``cam_test`` program to see how well an\ninput RPC camera agrees with itself, and the same for testing with the RPC\ncamera produced as documented here against itself (:numref:`cam_test`). With\nthis program, choose the value of the option ``--height-above-datum`` to be not\ntoo far from the height offset in the RPC model, or surely within the\nacceptable height range of the RPC model, as given by the height offset and\nheight scale.\n\nThis refitting will not work well for Umbra SAR cameras (:numref:`umbra_sar`),\nwhere the height scale parameter is very large and the RPC fit does not work \nin the full-height box, but only in a small range around the height offset.\n\nIf ``bundle_adjust`` is invoked with 0 iterations, the input RPC and refit\nRPC should also be tested for agreement, as then they in principle should be\nabout the same.\n\nTo export an existing RPC camera to XML format without refitting it, use\n``cam_gen`` (:numref:`cam_gen_rpc`).\n\nCreation of RPC cameras\n~~~~~~~~~~~~~~~~~~~~~~~\n\nIn addition to supporting the provided RPC models, ASP provides a\ntool named ``cam2rpc`` (:numref:`cam2rpc`), that can be\nused to create RPC camera models from ISIS and all other cameras that\nASP understands, including for non-Earth planets (currently only the\nEarth, Moon and Mars are supported). \n\nIn such situations, the planet datum must be passed to the tools reading the RPC\nmodels, via the ``--datum`` option. \n\n.. _rpc_tri:\n\nTriangulation with RPC cameras\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nAn RPC camera model is a black-box model, rather than one using rigorous camera\ngeometry. It is only able to compute a pixel value in the camera given a point\non the ground.\n\nFor triangulation, it is necessary to be able to calculate a ray emanating from\na given pixel going to the ground. With RPC cameras, a somewhat indirect method\nis used.\n\nA ray is found by determining with a solver two points on the ground that\nproject into the same pixel, with both points within the lon-lat-height box of\nthe RPC model.\n\nIn the latest ASP build (:numref:`release`), these points are picked at +/-\nmin(50.0, ``height_scale``) meters from the height offset specified in the RPC\nmodel. A larger range does not make a difference, except for situations when\n``height_scale`` does not represent correctly the actual height range the RPC\nmodel was fit on, such as for Umbra SAR (:numref:`umbra_sar`). In earlier ASP\nversions, the points were picked at +/- 0.9 times the height scale, which worked\nwell enough except for SAR.\n\nAnother ray is found the same way for the second image. Then, the two rays are\nintersected as usual.\n\nNote that the RPC model does not have the concept of camera center. This is set\nto a point in the lon-lat-height box that projects into the pixel (0, 0) in the\ncamera (at maximum height in the box). This is not a serious problem as long as \nthe camera centers are not used for modeling the orbit or controlling the camera\nlocation. Bundle adjustment and terrain reconstruction are not affected.\n\n"
  },
  {
    "path": "docs/examples/sfm_iss.rst",
    "content": ".. _sfm_iss:\n\nMapping the ISS using 2 rigs with 3 cameras each\n------------------------------------------------\n\nThis example will show how to use the tools shipped with ASP to create\na 360-degree textured mesh of the `Japanese Experiment Module\n<https://en.wikipedia.org/wiki/Kib%C5%8D_(ISS_module)>`_ (JEM, also\nknown as Kibo), on the International Space Station. See :numref:`rig_examples`\nfor more examples.\n\nThese tools were\ncreated as part of the `ISAAC\n<https://www.nasa.gov/directorates/spacetech/game_changing_development/projects/ISAAC>`_\nproject.\n\n.. _sfm_iss_figure:\n\nIllustration \n^^^^^^^^^^^^\n\n.. figure:: ../images/sci_cam_texture.png\n   :name: sfm_iss_texture\n   :alt:  Rig calibrator texture.\n \n.. figure:: ../images/sci_cam_large_texture.png\n   :name: sfm_large_iss_texture\n   :alt:  Rig calibrator texture.\n\n.. figure:: ../images/sci_cam_photo.png\n   :name: sfm_iss_photo\n   :alt:  Rig calibrator photo.\n\n   A mesh created with the ``haz_cam`` depth + image sensor \n   and textured with ``sci_cam`` (top). A zoomed-out version showing\n   more of the module (middle). A ``sci_cam`` image that\n   was used to texture the mesh (bottom). The JEM module has many cables\n   and cargo, and the bot acquired the data spinning in place. This\n   resulted in some noise and holes in the mesh. The ``sci_cam`` texture was,\n   however, quite seamless, with very good agreement with the ``nav_cam``\n   texture (not shown), which shows that the registration was done correctly.\n\nOverview\n^^^^^^^^\n\nTwo `Astrobee <https://github.com/nasa/astrobee>`_ robots, named\n*bumble* and *queen*, scanned the JEM, with each doing a portion. Both\nrobots have a wide-field of view navigation camera (``nav_cam``), a\ncolor camera (``sci_cam``), and a low-resolution depth+intensity camera\n(``haz_cam``).\n\nTo record the data, the robots took several stops along the center\nmodule axis, and at each stop acquired data from a multitude of\nperspectives, while rotating in place. \n\nThe data was combined into a sparse SfM map using ``theia_sfm``\n(:numref:`theia_sfm`). The camera poses were refined with\n``rig_calibrator`` (:numref:`rig_calibrator`). That tool models the\nfact that each set of sensors is on a rig (contained within a rigid\nrobot frame). Then, the depth clouds were fused into a mesh \nwith ``voxblox_mesh`` (:numref:`voxblox_mesh`), and textured with \n``texrecon`` (:numref:`texrecon`). \n\n.. _sfm_iss_acquisition:\n\nData acquisition strategy\n^^^^^^^^^^^^^^^^^^^^^^^^^\n\nIf designing a mapping approach, it is best to:\n\n - Have the cameras face the surface being imaged while moving parallel to it,\n   in a panning motion.\n - Ensure consecutively acquired images have about 75% - 90% overlap. This \n   and the earlier condition result in a solid perspective difference\n   but enough similarity so that the images are registered successfully.\n - If more than one robot (rig) is used, there should be a\n   decently-sized surface portion seen by more than rig, to be able to\n   tie them reliably together.\n\nChallenges\n^^^^^^^^^^\n\nThis example required care to address the in-place rotations, which\nresulted in very little perspective change between nearby images\n(hence in uncertain triangulated points), a wide range of resolutions\nand distances, and occlusions (which resulted in holes). Another\ndifficulty was the low resolution and unique imaging modality of\n``haz_cam``, which made it tricky to find interest point matches\n(tie points) to other sensor data.\n\n.. _sfm_iss_processing:\n\nData processing strategy\n^^^^^^^^^^^^^^^^^^^^^^^^\n\nAll sensors acquire the data at independent times. The color\n``sci_cam`` sensor takes one picture every few seconds, the\n``nav_cam`` takes about 2-3 pictures per second, and ``haz_cam`` takes\nabout 10 pictures per second.\n\nThe ``nav_cam`` sensor was chosen to be the *reference* sensor. A set\nof images made by this sensor with both robots was selected, ideally\nas in :numref:`sfm_iss_acquisition`, and a Structure-from-Motion\n*sparse map* was built. \n\nSince the ``haz_cam`` sensor acquires images and depth data frequently\n(0.1 seconds), for each ``nav_cam`` image the ``haz_cam`` frame\nclosest in time was selected and its acquisition timestamp was\ndeclared to be the same as for the ``nav_cam``. Even if this\napproximation may result in the geometry moving somewhat, it is likely\nto not be noticeable in the final textured mesh.\n\nThe same approximation is likely to be insufficient for ``sci_cam``\nwhen tying it to ``nav_cam``, as the time gap is now larger, and it\ncan result in at least a few pixels of movement whose outcome\nwill be a very noticeable registration error.\n\nThe approach that ``rig_calibrator`` uses is to bracket each\n``sci_cam`` image by ``nav_cam`` images, as seen in\n:numref:`rig_calibrator_example`, followed by pose interpolation in\ntime. This however doubles the number of ``nav_cam`` images and the\namount of time for the various iterations that may be needed to refine\nthe processing. To avoid that, we use the following approach.\n\nWe assume that a reasonably accurate rig configuration file for the\n2-rig 6-sensor setup already exists, but it may not be fully precise.\nIt is shown in :numref:`sfm_iss_sample_rig_config`. It can be found\nas described in the previous paragraph, on a small subset of the data.\n\nThen, given the SfM sparse map created with ``nav_cam`` only, the\n``haz_cam`` images (declared to be acquired at the same time as\n``nav_cam``) were inserted into this map via the rig constraint. The\njoint map was registered and optimized, while refining the rig\nconfiguration (the transforms between rig sensors). A mesh was created\nand textured, for each sensor. Any issues with mesh quality and\nregistration challenges can be dealt with at this time.\n\nThen, the ``sci_cam`` images were also inserted via the rig\nconstraint, but not using ``nav_cam`` for bracketing, so the\nplacement was approximate. Lastly, the combined map was optimized,\nwhile keeping the ``nav_cam`` and ``haz_cam`` poses fixed and refining\nthe ``sci_cam`` poses without the rig constraint or using the\ntimestamp information, which allows the ``sci_cam`` poses to move\nfreely to conform to the other already registered images.\n\nThis approach also helps with the fact that the ``sci_cam`` timestamp\ncan be somewhat unreliable, given that those images are acquired with\na different processor on the robot, so freeing these images from\nthe rig and time acquisition constraints helps with accuracy.\n\nHow all this is done will be shown in detail below.\n\nInstalling the software\n^^^^^^^^^^^^^^^^^^^^^^^\n\nSee :numref:`installation`. The ``bin`` directory of the ASP software\nshould be added to the ``PATH`` environmental variable. Note that ASP\nships its own version of Python. That can cause conflicts if ROS\nand ASP are run in the same terminal.\n\n.. _sfm_isis_data_prep:\n\nData preparation\n^^^^^^^^^^^^^^^^\n\nThe Astrobee data is stored in ROS bags (with an exception for\n``sci_cam``), with multiple bags for each robot.\n\nsci_cam\n~~~~~~~\n\nThe ``sci_cam`` data is not stored in bags, but as individual images,\nfor performance reasons, as the images are too big to publish over ROS.\nTheir size is  5344 x 4008 pixels. It is suggested to resample them\nusing the GDAL tool suite shipped with ASP (:numref:`gdal_tools`) as::\n\n    gdal_translate -r average -outsize 25% 25% -of jpeg \\\n      input.jpg output.jpg\n\nThe obtained images should be distributed in directories\ncorresponding to the robot, with names like ``my_data/bumble_sci``\nand ``my_data/queen_sci`` (:numref:`rig_data_conv`).\n\nnav_cam\n~~~~~~~\n\nFor each ``sci_cam`` image, the ``nav_cam`` image closest in time will\nbe extracted, using the ``extract_bag`` tool\n(:numref:`ros_tools_extract`). This is illustrated for one of the\nrobots::\n \n    ls my_data/bumble_sci/*.jpg > bumble_sci.txt\n    /usr/bin/python /path/to/ASP/libexec/extract_bag \\\n    --bag mybag.bag                                  \\\n    --timestamp_list bumble_sci.txt                  \\\n    --topics \"/my/nav_cam/topic\"                     \\\n    --dirs \"my_data/bumble_nav\"                      \\\n    --timestamp_tol 1.0\n\nHere we used the fact that the ``sci_cam`` images have the acquisition\ntimestamp as part of their name (:numref:`rig_data_conv`).\n\nThis will create the directory ``my_data/bumble_nav``. The produced\nfiles will contain, as for the other cameras, the timestamp as part of\ntheir name, which will be different but close in time to the\n``sci_cam`` timestamp.\n\nThe same command should be repeated for the other robot.\n\nExamine the created images with the ``eog`` program on the local\nsystem. Hopefully the images will have enough overlap. If not, images\nwith intermediate timestamps need to be extracted, with the help\nof the timestamp-listing tool (:numref:`ros_tools_list`). \n\nIf, on the other hand, the resulting images are very similar,\nsome may be deleted (also with ``eog``). It is suggested to follow\nthe principles outlined in :numref:`sfm_iss_acquisition`.\n\nhaz_cam\n~~~~~~~\n\nAs mentioned in :numref:`sfm_iss_processing`, while the ``nav_cam``\nand ``sci_cam`` timestamps are kept precise, it makes the problem\nmuch simpler to find the closest ``haz_cam`` images to the chosen\n``nav_cam`` images, and to change their timestamps to match ``nav_cam``.\n\nFor that, the data should be extracted as follows::\n\n    ls my_data/bumble_nav/*.jpg > bumble_nav.txt\n    /usr/bin/python /path/to/ASP/libexec/extract_bag       \\\n    --bag mybag.bag                                        \\\n    --timestamp_list bumble_nav.txt                        \\\n    --topics \"/my/haz_intensity/topic /my/haz_depth/topic\" \\\n    --dirs \"my_data/bumble_haz my_data/bumble_haz\"         \\\n    --timestamp_tol 0.2                                    \\\n    --approx_timestamp\n\nNotice several important differences with the earlier command.  We use\nthe ``nav_cam`` timestamps for querying. The tolerance for how close\nin time produced ``haz_cam`` timestamps are to input ``nav_cam``\nimages is much smaller, and we use the option ``--approx_timestamp``\nto change the timestamp values (and hence the names of the produced\nfiles) to conform to ``nav_cam`` timestamps.\n\nThis tool is called with two topics, to extract the intensity (image) and\ndepth (point cloud) datasets, with the outputs going to the same directory\n(specified twice, for each topic). The format of the depth clouds\nis described in :numref:`point_cloud_format`.\n\nAn analogous invocation should happen for the other rig, with the\noutputs going to subdirectories for those sensors.\n\nA first small run\n^^^^^^^^^^^^^^^^^\n\nThe strategy in :numref:`sfm_iss_processing` will be followed.\nConsider a region that is seen in all ``nav_cam`` and ``haz_cam``\nimages (4 sensors in total). We will take advantage of the fact that\neach rig configuration is reasonably well-known, so we will create a\nmap with only the ``nav_cam`` data for both robots, and the other\nsensors will be added later.  If no initial rig configuration exists,\nsee :numref:`rig_calibrator_example`.\n\nThe initial map\n~~~~~~~~~~~~~~~\n\nCreate a text file having a few dozen ``nav_cam`` images from both\nrigs in the desired region named ``small_nav_list.txt``, with one\nimage per line. Inspect the images in ``eog``. Ensure that each image\nhas a decent overlap (75%-90%) with some of the other ones, and they\ncover a connected surface portion.\n\nRun ``theia_sfm`` (:numref:`theia_sfm`) with the initial rig\nconfiguration (:numref:`sfm_iss_sample_rig_config`), which we will\nkeep in a file called ``initial_rig.txt``::\n\n    theia_sfm --rig-config initial_rig.txt \\\n      --image-list small_nav_list.txt      \\\n      --out-dir small_theia_nav_rig\n\nThe images and interest points can be examined in ``stereo_gui``\n(:numref:`stereo_gui_nvm`) as::\n\n    stereo_gui small_theia_nav_rig/cameras.nvm\n\nControl points\n~~~~~~~~~~~~~~\n\nThe obtained map should be registered to world coordinates. Looking\nahead, the full map will need registering as well, so it is good to\ncollect control points over the entire module, perhaps 6-12 of them\n(the more, the better), with at least four of them in the small\ndesired area of interest that is being done now. The process is\ndescribed in :numref:`rig_calibrator_registration`. More specific\ninstructions can be found in the `Astrobee documentation\n<https://nasa.github.io/astrobee/v/develop/map_building.html#autotoc_md357>`_.\n\nIf precise registration is not required, one could simply pick some\nvisible object in the scene, roughly estimate its dimensions, and\ncreate control points based on that.  The produced 3D model will then\nstill be geometrically self-consistent, but the orientation and scale\nmay be off.\n\nWe will call the produced registration files ``jem_map.pto`` and\n``jem_map.txt``. The control points for the images in the future map\nthat are currently not used will be ignored for the time being.\n\nAdding haz_cam\n~~~~~~~~~~~~~~\n\nCreate a list called ``small_haz_list.txt`` having the ``haz_cam`` images\nwith the same timestamps as the ``nav_cam`` images::\n\n    ls my_data/*_haz/*.jpg > small_haz_list.txt\n\nInsert these in the small map, and optimize all poses together as::\n\n    float=\"bumble_nav bumble_haz queen_nav queen_haz\"\n    rig_calibrator                                  \\\n      --registration                                \\\n      --hugin-file jem_map.pto                      \\\n      --xyz-file jem_map.txt                        \\\n      --use-initial-rig-transforms                  \\\n      --extra-list small_haz_list.txt               \\\n      --rig-config initial_rig.txt                  \\\n      --nvm small_theia_nav_rig/cameras.nvm         \\\n      --out-dir small_rig                           \\\n      --camera-poses-to-float \"$float\"              \\\n      --depth-to-image-transforms-to-float \"$float\" \\\n      --float-scale                                 \\\n      --intrinsics-to-float \"\"                      \\\n      --num-iterations 100                          \\\n      --export-to-voxblox                           \\\n      --num-overlaps 5                              \\\n      --min-triangulation-angle 0.5\n\nThe depth files will the same names but with the .pc extension will\nwill be picked up automatically.\n\nThe value of ``--min-triangulation-angle`` filters out rays with a\nvery small angle of convergence. That usually makes the geometry more\nstable, but if the surface is far from the sensor, and there is not\nenough perspective difference between images, it may eliminate too many\nfeatures. The ``--max-reprojection-error`` option may eliminate\nfeatures as well.\n\nConsider adding the option ``--bracket-len 1.0`` that decides the length of\ntime, in seconds, between reference images used to bracket the other sensor. The\noption ``--bracket-single-image`` will allow only one image of any non-reference\nsensor to be bracketed.\n\nIt is suggested to carefully examine the text printed on screen by this\ntool. See :numref:`rig_calibrator_registration` and\n:numref:`rig_calibration_stats` for the explanation of some statistics\nbeing produced and their expected values.\n\nThen, compare the optimized configuration file\n``small_rig/rig_config.txt`` with the initial guess rig\nconfiguration. The scales of the matrices in the\n``depth_to_image_transform`` fields for both sensors should remain\nquite similar to each other, while different perhaps from their\ninitial values in the earlier file, otherwise the results later will\nbe incorrect.  If encountering difficulties here, consider not\nfloating the scales at all, so omitting the ``--float-scale`` option\nabove. The scales will still be adjusted, but not as part of the\noptimization but when the registration with control points\nhappens. Then they will be multiplied by the same factor.\n\nOpen the produced ``small_rig/cameras.nvm`` file in ``stereo_gui`` and\nexamine the features between the ``nav_cam`` and ``haz_cam``\nimages. Usually they are very few, but hopefully at least some are\npresent.\n\nNotice that in this run we do not optimize the intrinsics, only the\ncamera poses and depth-to-image transforms. If desired to do so,\noptimizing the focal length may provide the most payoff, followed by\nthe optical center. It can be tricky to optimize the distortion model,\nas one needs to ensure there are many features at the periphery of\nimages where the distortion is strongest.\n\nIt is better to avoid optimizing the intrinsics unless the final\ntexture has subtle misregistration, which may due to intrinsics. Gross\nmisregistration is usually due to other factors, such as insufficient\nfeatures being matched between the images. Or, perhaps, not all images\nthat see the same view have been matched together.\n\nNormally some unmodeled distortion in the images is tolerable\nif there are many overlapping images, as then their central areas are\nused the most, and the effect of distortion on the final textured\nmesh is likely minimal. \n\nMesh creation\n~~~~~~~~~~~~~\n\nThe registered depth point clouds can be fused with ``voxblox_mesh``\n(:numref:`voxblox_mesh`)::\n\n    cat small_rig/voxblox/*haz*/index.txt >       \\\n      small_rig/all_haz_index.txt \n\n    voxblox_mesh                                  \\\n      --index small_rig/all_haz_index.txt         \\\n      --output_mesh small_rig/fused_mesh.ply      \\\n      --min_ray_length 0.1                        \\\n      --max_ray_length 2.0                        \\\n      --median_filter '5 0.01'                    \\\n      --voxel_size 0.01\n\nThe first line combines the index files for the ``bumble_haz`` and\n``queen_haz`` sensors.\n\nThe produced mesh can be examined in ``meshlab``. Normally it should\nbe quite seamless, otherwise the images failed to be tied properly\ntogether. There can be noise where the surface being imaged has black\nobjects (which the depth sensor handles poorly), cables, etc.\nSome rather big holes can be created in the occluded areas.\n\nTo not use all the input images and clouds, the index file passed in\ncan be edited and entries removed. The names in these files are in\none-to-one correspondence with the list of ``haz_cam`` images used\nearlier.\n\nThe options ``--min_ray_length`` and ``--max_ray_length`` are used to\nfilter out depth points that are too close or too far from the sensor.\n\nThe mesh should be post-processed with the CGAL tools\n(:numref:`cgal_tools`).  It is suggested to first remove most small\nconnected components, then do some smoothing and hole-filling, in\nthis order. Several iterations of may be needed, and some tuning of\nthe parameters.\n\nTexturing\n~~~~~~~~~\n\nCreate the ``nav_cam`` texture with ``texrecon``\n(:numref:`texrecon`)::\n\n    sensor=\"bumble_nav haz queen_nav\"\n    texrecon                              \\\n    --rig_config small_rig/rig_config.txt \\\n    --camera_poses small_rig/cameras.txt  \\\n    --mesh small_rig/fused_mesh.ply       \\\n    --rig_sensor \"${sensor}\"              \\\n    --undistorted_crop_win '1300 1200'    \\\n    --skip_local_seam_leveling            \\\n    --out_dir small_rig\n\nThe same can be done for ``haz_cam``. Then reduce the undistorted crop\nwindow to '250 200'. It is helpful to open these together in\n``meshlab`` and see if there are seams or differences between them.\n\nTo use just a subset of the images, see the ``--subset`` option. That\nis especially important if the robot spins in place, as then some of\nthe depth clouds have points that are far away and may be less\naccurate.\n\nWhen working with ``meshlab``, it is useful to save for the future\nseveral of the \"camera views\", that is, the perspectives from which\nthe meshes were visualized, and load them next time around.  That is\ndone from the \"Window\" menu, in reasonably recent ``meshlab``\nversions.\n\nAdding sci_cam\n~~~~~~~~~~~~~~\n\nIf the above steps are successful, the ``sci_cam`` images for the \nsame region can be added in, while keeping the cameras for the sensors\nalready solved for fixed. This goes as follows::\n\n    ls my_data/*_sci/*.jpg > small_sci_list.txt\n\n    float=\"bumble_sci queen_sci\"\n    rig_calibrator                                  \\\n      --use-initial-rig-transforms                  \\\n      --nearest-neighbor-interp                     \\\n      --no-rig                                      \\\n      --bracket-len 1.0                             \\\n      --extra-list small_sci_list.txt               \\\n      --rig-config small_rig/rig_config.txt         \\\n      --nvm small_rig/cameras.nvm                   \\\n      --out-dir small_sci_rig                       \\\n      --camera-poses-to-float \"$float\"              \\\n      --depth-to-image-transforms-to-float \"$float\" \\\n      --intrinsics-to-float \"\"                      \\\n      --num-iterations 100                          \\\n      --export-to-voxblox                           \\\n      --num-overlaps 5                              \\\n      --min-triangulation-angle 0.5\n\nThe notable differences with the earlier invocation is that this time\nonly the ``sci_cam`` images are optimized (floated), the option\n``--nearest-neighbor-interp`` is used, which is needed since the\n``sci_cam`` images will not have the same timestamps as for the\nearlier sensor, and the option ``--no-rig`` was added, which decouples\nthe ``sci_cam`` images from the rig, while still optimizing them with\nthe rest of the data, which is fixed and used as a constraint.  The\noption ``--bracket-len`` helps with checking how far in time newly\nadded images are from existing ones.\n\nThe texturing command is::\n\n    sensor=\"bumble_sci queen_sci\"\n    texrecon                                    \\\n      --rig_config small_sci_rig/rig_config.txt \\\n      --camera_poses small_sci_rig/cameras.txt  \\\n      --mesh small_rig/fused_mesh.ply           \\\n      --rig_sensor \"${sensor}\"                  \\\n      --undistorted_crop_win '1300 1200'        \\\n      --skip_local_seam_leveling                \\\n      --out_dir small_sci_rig\n\nNotice how we used the rig configuration and poses from\n``small_sci_rig`` but with the earlier mesh from ``small_rig``. The\nsensor names now refer to ``sci_cam`` as well.\n\nThe produced textured mesh can be overlaid on top of the earlier ones\nin ``meshlab``.\n\nResults\n^^^^^^^\n\nSee :numref:`sfm_iss`.\n\nScaling up the problem\n^^^^^^^^^^^^^^^^^^^^^^\n\nIf all goes well, one can map the whole module. Create several lists\nof ``nav_cam`` images corresponding to different module portions.  For\nexample, for the JEM, which is long in one dimension, one can\nsubdivide it along that axis.\n\nEnsure that the portions have generous overlap, so many images \nshow up in more than one list, and that each obtained group of images\nforms a connected component. That is to say, the union of surface\npatches as seen from all images in a group should be a contiguous\nsurface.\n\nFor example, each group can have about 150-200 images, with 50-75\nimages being shared with each neighboring group. More images being\nshared will result in a tighter coupling of the datasets and in less\nregistration error.\n\nRun ``theia_sfm`` on each group of ``nav_cam`` images. A run can take\nabout 2 hours.  While in principle this tool can be run on all images at\nonce, that may take longer than running it on smaller sets with\noverlaps, unless one has under 500 images or so.\n\nThe obtained .nvm files can be merged with ``sfm_merge``\n(:numref:`sfm_merge`) as::\n\n    sfm_merge --fast_merge --rig_config small_rig/rig_config.txt \\\n      theia*/cameras.nvm --output_map merged.nvm\n\nThen, given the large merged map, one can continue as earlier in the\ndocument, with registration, adding ``haz_cam`` and ``sci_cam``\nimages, mesh creation, and texturing.\n\nFine-tuning\n^^^^^^^^^^^\n\nIf the input images show many perspectives and correspond to many\ndistances from the surface being imaged, all this variety is good for\ntying it all together, but can make texturing problematic. \n\nIt is suggested to create the fused and textured meshes (using\n``voxblox_mesh`` and ``texrecon``) only with subsets of the depth\nclouds and images that are closest to the surface being imaged and\nface it head-on.  Both of these tools can work with a subset of the\ndata. Manual inspection can be used to delete the low-quality inputs.\n\nConsider experimenting with the ``--median_filter``,\n``--max_ray_length``, and ``--distance_weight`` options in\n``voxblox_mesh`` (:numref:`voxblox_mesh`).\n\nSome experimentation can be done with the two ways of creating\ntextures given by the ``texrecon`` option ``--texture_alg``\n(:numref:`texrecon`). The default method, named \"center\", uses the\nmost central area of each image, so, if there are any seams when the\nthe camera is panning, they will be when transitioning from a surface\nportion using one image to a different one. The other approach, called\n\"area\", tries for every small surface portion to find the camera whose\ndirection is more aligned with the surface normal. This may give\nbetter results when imaging a round object from many perspectives.\n\nIn either case, seams are a symptom of registration having failed.\nIt is likely because not all images seeing the same surface have been\ntied together. Or, perhaps the intrinsics of the sensors were\ninaccurate.\n\n.. _map_surgery:\n\nSurgery with maps\n^^^^^^^^^^^^^^^^^\n\nIf a produced textured mesh is mostly good, but some local portion has\nartifacts and may benefit from more images and/or depth clouds, \neither acquired in between existing ones or from a new\ndataset, this can be done without redoing all the work.\n\nA small portion of the existing map can be extracted with the\n``sfm_submap`` program (:numref:`sfm_submap`), having just ``nav_cam``\nimages.  A new small map can be made with images from this map and\nadditional ones using ``theia_sfm``. This map can be merged into the\nexisting small map with ``sfm_merge --fast_merge``\n(:numref:`sfm_merge`). If the first map passed to this tool is the\noriginal small map, its coordinate system will be kept, and the new\nTheia map will conform to it.\n\nDepth clouds for the additional images can be extracted. The combined\nsmall map can be refined with ``rig_calibrator``, and depth clouds\ncorresponding to the new data can be inserted, as earlier. The option\n``--fixed-image-list`` can be used to keep some images (from the\noriginal small map) fixed to not change the scale or position of the\noptimized combined small map.\n\nThese operations should be quite fast if the chosen subset of data is\nsmall.\n\nThen, a mesh can be created and textured just for this\ndata. If happy with the results, this data can then be merged into the\noriginal large map, and the combined map can be optimized as before.\n\n.. _sfm_iss_sample_rig_config:\n\nSample rig configuration\n^^^^^^^^^^^^^^^^^^^^^^^^\n\nThis is a rig configuration file having two rigs, with the \nreference sensor for each given by ``ref_sensor_name``.  \nThe reference documentation is in :numref:`rig_config`.\n\n::\n\n    ref_sensor_name: bumble_nav\n    \n    sensor_name: bumble_nav\n    focal_length: 608\n    optical_center: 632.53683999999998 549.08385999999996\n    distortion_coeffs: 0.99869300000000005\n    distortion_type: fov\n    image_size: 1280 960\n    distorted_crop_size: 1200 900\n    undistorted_image_size: 1200 1000\n    ref_to_sensor_transform: 1 0 0 0 1 0 0 0 1 0 0 0\n    depth_to_image_transform: 1 0 0 0 1 0 0 0 1 0 0 0\n    ref_to_sensor_timestamp_offset: 0\n    \n    sensor_name: bumble_haz\n    focal_length: 206.19094999999999\n    optical_center: 112.48999000000001 81.216598000000005\n    distortion_coeffs: -0.25949800000000001 -0.084849339999999995 0.0032980310999999999 -0.00024045673000000001\n    distortion_type: radtan\n    image_size: 224 171\n    distorted_crop_size: 224 171\n    undistorted_image_size: 250 200\n    ref_to_sensor_transform: -0.99936179050661522 -0.011924032028375218 0.033672379416940734 0.013367103760211168 -0.99898730194891616 0.042961506978788616 0.033126005078727511 0.043384190726704089 0.99850912854240503 0.03447221364702744 -0.0015773141724172662 -0.051355063495492494\n    depth_to_image_transform: 0.97524944805399405 3.0340999964032877e-05 0.017520679036474685 -0.0005022892199844 0.97505286059445628 0.026270283519653003 -0.017513503933106297 -0.02627506746113482 0.97489556315227599 -0.012739449966153971 -0.0033893213295227856 -0.062385053248766351\n    ref_to_sensor_timestamp_offset: 0\n    \n    sensor_name: bumble_sci\n    focal_length: 1023.6054\n    optical_center: 683.97547 511.2185\n    distortion_coeffs: -0.025598438 0.048258987 -0.00041380657 0.0056673533\n    distortion_type: radtan\n    image_size: 1336 1002\n    distorted_crop_size: 1300 1000\n    undistorted_image_size: 1300 1200\n    ref_to_sensor_transform: 0.99999136796886101 0.0041467228570910052 0.00026206356569790089 -0.0041456529387620027 0.99998356891519313 -0.0039592248413610866 -0.00027847706785526265 0.0039581042406176921 0.99999212789968661 -0.044775738667823875 0.022844481744319863 0.016947323592326858\n    depth_to_image_transform: 1 0 0 0 1 0 0 0 1 0 0 0\n    ref_to_sensor_timestamp_offset: 0.0\n    \n    ref_sensor_name: queen_nav\n    \n    sensor_name: queen_nav\n    focal_length: 604.39999999999998\n    optical_center: 588.79561999999999 509.73835000000003\n    distortion_coeffs: 1.0020100000000001\n    distortion_type: fov\n    image_size: 1280 960\n    distorted_crop_size: 1200 900\n    undistorted_image_size: 1200 1000\n    ref_to_sensor_transform: 1 0 0 0 1 0 0 0 1 0 0 0\n    depth_to_image_transform: 1 0 0 0 1 0 0 0 1 0 0 0\n    ref_to_sensor_timestamp_offset: 0\n    \n    sensor_name: queen_haz\n    focal_length: 210.7242\n    optical_center: 124.59857 87.888262999999995\n    distortion_coeffs: -0.37295935000000002 -0.011153150000000001 0.0029100743 -0.013234186\n    distortion_type: radtan\n    image_size: 224 171\n    distorted_crop_size: 224 171\n    undistorted_image_size: 250 200\n    ref_to_sensor_transform: -0.99983878639670731 -0.0053134634698496939 -0.017151335887125228 0.0053588429200665524 -0.99998225876857605 -0.0026009518744718949 -0.017137211538534192 -0.0026924438805366263 0.9998495220415089 0.02589135325068561 0.0007771584936297031 -0.025089928702394019\n    depth_to_image_transform: 0.96637484988953426 -0.0010183057117133798 -0.039142369279180113 0.00078683373128646066 0.96715045575148029 -0.005734923775739747 0.039147706343916511 0.0056983779719958138 0.96635836939244701 -0.0079348421014152053 -0.0012389803763148686 -0.053366194196969058\n    ref_to_sensor_timestamp_offset: 0\n    \n    sensor_name: queen_sci\n    focal_length: 1016.3726\n    optical_center: 689.17409 501.88817\n    distortion_coeffs: -0.019654579 0.024057067 -0.00060629998 0.0027509131\n    distortion_type: radtan\n    image_size: 1336 1002\n    distorted_crop_size: 1300 1000\n    undistorted_image_size: 1300 1200\n    ref_to_sensor_transform: 0.99999136796886101 0.0041467228570910052 0.00026206356569790089 -0.0041456529387620027 0.99998356891519313 -0.0039592248413610866 -0.00027847706785526265 0.0039581042406176921 0.99999212789968661 -0.044775738667823875 0.022844481744319863 0.016947323592326858\n    depth_to_image_transform: 1 0 0 0 1 0 0 0 1 0 0 0\n    ref_to_sensor_timestamp_offset: 0\n"
  },
  {
    "path": "docs/examples/sfs_ctx.rst",
    "content": ".. _sfs_ctx:\n\nShape-from-Shading with CTX images\n----------------------------------\n\nThis example shows how to refine a stereo terrain model produced with CTX images\n(:numref:`ctx_example`) with Shape-from-Shading (SfS, :numref:`sfs`). See\n:numref:`sfs_usage` for an overview and examples for other planets.\n\n.. _sfs_ctx_results:\n\nResults\n~~~~~~~\n\n.. figure:: ../images/ctx_sfs_zoom_in.png\n   :name: ctx_sfs_zoom_in\n   :alt: ctx_sfs_zoom_in\n   :align: left\n   \n   From left to right: (a) a terrain model produced with CTX images and stereo, (b)\n   the same terrain refined with SfS and CTX images, (c) corresponding terrain\n   produced with stereo with HiRISE images. SfS adds notably more detail to the CTX\n   DEM.\n\n.. figure:: ../images/ctx_sfs_dem_err.png\n   :name: ctx_sfs_dem_err\n   :alt: ctx_sfs_dem_err\n   :align: left\n   \n   A larger area (about 1100 x 1100 pixels, at 6 m/pixel). The site is inside the\n   Jezero Crater. The top row shows, as before, the CTX stereo terrain, CTX\n   SfS-refined terrain, and a HiRISE terrain for comparison. The bottom row has the\n   differences to the HiRISE stereo DEM of the CTX stereo DEM (left) and SfS-refined\n   DEM (right). The SfS-refined terrain shows somewhat improved agreement with\n   the HiRISE terrain. The range of colors is from -10 to 10 meters. There seems to\n   be some local vertical bias between the CTX and HiRISE terrains that is\n   unrelated to SfS refinement.\n\n.. figure:: ../images/ctx_ortho.png\n   :name: ctx_ortho\n   :alt: ctx_ortho\n   :align: left\n   \n   Two input CTX images with different illumination conditions. There are notable \n   lighting differences on the mound in the upper-right area.\n\nPreparation\n~~~~~~~~~~~\n\nHow to fetch and prepare the images is described in :numref:`ctx_example`.\nThe camera models are produced as in :numref:`create_csm_linescan`.\n\nIt is important to have images with very diverse illumination conditions (Sun\nazimuth). The azimuth angle can be found with ``sfs --query``. More details are\nin :numref:`sfs_azimuth`.\n\nSome of these images will be used to create terrain models with stereo. Any\nstereo pair should have similar illumination and a non-small convergence angle\n(about 30 degrees is feasible for CTX). See :numref:`stereo_pairs`.\n\nThe full dataset for this area had 115 images. It is recommended to fetch a\nlot of images first and then select a subset after inspection.\n\nThe Sun azimuth angle was between -141.5 and -72.8 degrees. This is diverse\nenough, but a larger range would have been preferable. No data with the Sun\non the right was found. \n\nThe images were bundle-adjusted (:numref:`bundle_adjust`). The resulting model\nstate files (:numref:`csm_state`) were used at all stages of subsequent\nprocessing.\n\nThree DEMs were produced with ``parallel_stereo`` (:numref:`parallel_stereo`)\nand ``point2dem`` (:numref:`point2dem`). It is strongly advised to use the\n``aspm_mgm`` algorithm (:numref:`nextsteps`) and mapprojection\n(:numref:`mapproj-example`).\n\nCTX images can have very notable jitter (:numref:`jitter_ctx`), and there may be\nsome unmodeled lens distortion. It is suggested to mosaic the produced DEMs\nwith ``dem_mosaic`` (:numref:`dem_mosaic`) and then run ``geodiff`` (:numref:`geodiff`)\nto compare the mosaic with each individual DEM. The least consistent DEMs\nshould be discarded, and the remaining ones mosaicked together. \n\nAny holes in the produced DEM should be filled, and a bit of blur is suggested\n(:numref:`dem_mosaic_extrapolate`).\n\nThe resulting mosaic will be the input for SfS refinement.\n\nA HiRISE (:numref:`hirise_example`) stereo DEM needs to be created as well. It\nwill help evaluate the results, as it is at a much higher resolution. \nThe HiRISE DEM can be brought into alignment with the CTX one with ``pc_align``\n(:numref:`pc_align`).\n\nRunning SfS\n~~~~~~~~~~~\n\nThe ids of the CTX images that were input to SfS were as follows. The Sun\nazimuth and elevation are measured in degrees from the North and the horizon,\nrespectively.\n\n.. list-table::\n   :header-rows: 1\n\n   * - image_id\n     - azimuth\n     - elevation\n   * - J10_048842_1986_XN_18N282W\n     - -141.468\n     - 36.741\n   * - D14_032794_1989_XN_18N282W\n     - -117.901\n     - 52.206\n   * - F05_037752_2008_XN_20N282W\n     - -102.218\n     - 33.286\n   * - F03_037119_2001_XN_20N283W\n     - -90.224\n     - 38.861\n   * - J22_053233_1984_XN_18N282W\n     - -72.785\n     - 45.893\n\nThe ``parallel_sfs`` (:numref:`parallel_sfs`) command was::\n\n    parallel_sfs                             \\\n      --processes 4                          \\\n      --threads 8                            \\\n      --save-sparingly                       \\\n      --tile-size 400                        \\\n      --padding 50                           \\\n      --nodes-list machines.txt              \\\n      -i ctx_dem.tif                         \\\n      --image-list image_list.txt            \\\n      --camera-list camera_list.txt          \\\n      --smoothness-weight 0.01               \\\n      --initial-dem-constraint-weight 0.0002 \\\n      --reflectance-type 0                   \\\n      --num-haze-coeffs 1                    \\\n      --max-iterations 5                     \\\n      --float-exposure                       \\\n      --float-haze                           \\\n      --float-albedo                         \\\n      --crop-input-images                    \\\n      -o sfs/run\n\nThis produced the DEM named ``sfs/run-DEM-final.tif``. See :numref:`sfs` for the\ndescription of these options and the output files.\n\nIt was very important to model and optimize the albedo, image exposure, and\natmospheric haze.\n\nThere was notable sensitivity on the value of\n``--initial-dem-constraint-weight``. That is likely because the input CTX DEM\nand the reference HiRISE DEM appear to be somewhat inconsistent. Making this\nvalue smaller resulted in the SfS DEM being in less agreement with HiRISE.\n\nSomewhat surprisingly, the plain Lambertian reflectance (``--reflectance-type 0``)\nworked about the same as the Lunar-Lambertian model (type 1),\nwith the Hapke model with default parameters (type 2) doing\njust a very tiny bit better.\n\nCo-optimizing the reflectance model coefficients (option\n``--float-reflectance-model``) did not make a difference.\n\nThe value of ``--smoothness-weight`` could have been increased a bit, as\nsome numerical noise is visible. \n\nThe results are in :numref:`sfs_ctx_results`.\n\nFurther thoughts\n~~~~~~~~~~~~~~~~\n\nThe shadows were not modeled here. Given that the Sun was rather high in the sky,\nwith various azimuth and elevation values, their effect is likely not very\nstrong. Pixels in shadows can be given less weight with the ``sfs`` parameter\n``--robust-threshold``. This will penalize pixels for which the disagreement\nbetween the simulated and measured images is roughly more than this\nquantity. See :numref:`sfs_earth` for an example and discussion.\n\nThe disagreement between the stereo CTX and HiRISE terrains (that is seen even\nbefore SfS) can be made smaller by individually aligning SfS-refined small tiles\n(with overlap) to HiRISE, followed by mosaicking. That can make it easier to see\nwhere SfS still needs improvement. \n"
  },
  {
    "path": "docs/examples/sfs_earth.rst",
    "content": ".. _sfs_earth:\n\nShape-from-Shading for Earth\n----------------------------\n\nThis example shows how to refine a terrain model for Earth using\nShape-from-Shading (SfS, :numref:`sfs`). An overview and examples for other\nplanets are given in :numref:`sfs_usage`.\n\n.. figure:: ../images/earth_closeup.png\n   :name: earth_input_images\n   :alt: earth_input_images\n   \n   Top: Four orthorectified input images showing the diversity of illumination. Bottom left: Hillshaded DEM produced with Agisoft Phtoscan. Bottom right: Hillshaded DEM refined with SfS. It can be seen that the SfS DEM has more detail. This is a small region of the test site.\n\n.. figure:: ../images/earth_stereo_sfs_dem.png\n   :name: earth_stereo_sfs_dem\n   :alt: earth_stereo_sfs_dem\n   \n   Left: Full-site hillshaded input stereo DEM (10k x 10k pixels at 0.01 m/pixel). Right: Refined full-site SfS DEM. More detail is seen. No shadow artifacts or strong dependence on albedo are observed.\n\n.. figure:: ../images/earth_ortho_sfs_diff.png\n   :name: earth_ortho_sfs_diff\n   :alt: earth_ortho_sfs_diff\n   \n   Left: Max-lit orthoimage (this eliminates shadows). Right: SfS DEM minus the input DEM. \n   The range of colors is between -0.1 to 0.1 meters. We do not have rigorous validation,\n   but these results look plausible.\n\nEarth-specific issues\n~~~~~~~~~~~~~~~~~~~~~\n\nWe will produce a terrain model for the *Lunar Surface Proving Ground* (LSPG)\nat the Mojave Air and Space Port in California (35.072321 N, 118.153957 W).\nThe site has dimensions of 100 x 100 meters.\n\nThis site is meant to mimic the topography and optical properties of Moon's\nsurface. It has very strong albedo variations that need modeling. Being on\nEarth, the site has an atmosphere that scatters sunlight, that needs to be taken\ninto account as well.\n\nIt is likely that other rocky Earth terrains will have similar properties.\nSurfaces with vegetation, fresh snow, or urban areas will be very different,\nand likely for those the SfS method will not work well.\n\nInput data\n~~~~~~~~~~\n\nThe site was imaged with an UAS flying at an elevation of about 100 meters. The\nimages are acquired with a color frame camera, looking nadir, with dimensions of\n9248 x 6944 pixels, JPEG-compressed. The ground resolution is 0.01 meters per\npixel.\n\nThe camera was carefully calibrated, with its intrinsic parameters (focal\nlength, optical center, lens distortion) known.\n\nFive sets of images were recorded, at different times of day. Diverse\nillumination is very important for separating the albedo from ground reflectance\nand atmospheric effects.\n\nSince SfS processes grayscale data, the red image band was used.\n\nRegistration and initial model\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nSfS expects a reasonably accurate DEM as input, that will be refined. The camera\nintrinsics, and their positions and orientations must be known very accurately\nrelative to the DEM. The ``mapproject`` program (:numref:`mapproject`) can be\ninvoked to verify the agreement between these data.\n\nThe usual process of producing such data with ASP is to run Structure-from-Motion\n(:numref:`sfm`), including bundle adjustment (:numref:`bundle_adjust`), followed\nby stereo (:numref:`tutorial`) for pairs of images with a good convergence angle\n(:numref:`stereo_pairs`), terrain model creation (:numref:`point2dem`), and \nmerge of the terrain models (:numref:`dem_mosaic`).\n\nIf desired to refine the intrinsics, the ``bundle_adjust`` program can be run\n(:numref:`heights_from_dem`), with the terrain produced so far as a constraint. \nIf needed, alignment to a prior terrain can be done (:numref:`pc_align`),\nfollowed by carrying over the cameras (:numref:`ba_pc_align`).\n\nThe ``stereo_gui`` program (:numref:`stereo_gui`) can help visualize the inputs,\nintermediate results, and final products.\n\nUse of prior data\n~~~~~~~~~~~~~~~~~\n\nIn this example, all this processing was done with Agisoft Photoscan, a commercial\npackage that automates the steps mentioned above. It produced a terrain model,\northoimages, the camera intrinsics, and the camera positions and orientations.\n\nCamera preparation\n~~~~~~~~~~~~~~~~~~\n\nA pinhole camera model file (:numref:`pinholemodels`) was created for each\nimage. \n\nTo ensure tight registration, a GCP file (:numref:`bagcp`) was made for each\nimage with the ``gcp_gen`` program (:numref:`gcp_gen`). The inputs were the raw\nimages, orthoimages, and the existing DEM. The invocation was as follows, for\neach image index ``i``::\n\n   gcp_gen                          \\\n      --ip-detect-method 2          \\\n      --inlier-threshold 50         \\\n      --ip-per-tile 1000            \\\n      --gcp-sigma 0.1               \\\n      --camera-image image${i}.tif  \\\n      --ortho-image ortho_image.tif \\\n      --dem dem.tif                 \\\n      --output-prefix gcp/run       \\\n      -o gcp/image${i}.gcp\n\nA single orthoimage was provided for all images with the same illumination.\n      \nThis program's page has more information for how to inspect and validate \nthe GCP file.\n\nIf the camera positions and orientations are not known, such a GCP\nfile can create the camera files from scratch (:numref:`cam_from_gcp`).\n\nThe images and cameras were then bundle-adjusted (:numref:`bundle_adjust`),\ntogether with these GCP. The provided DEM was used as a constraint, with the\noptions ``--heights-from-dem dem.tif --heights-from-dem-uncertainty 10.0``. The\nlatter parameter's value was to give less weight to the DEM than to the\nGCP (see ``--gcp-sigma`` above), as the GCP are known to be quite accurate.\n\nThe ``mapproject`` program (:numref:`mapproject`) was run to verify that the\nproduced cameras result in orthoimages that agree well with the input DEM and\neach other.\n\nIt is strongly suggested to first run this process with a small subset of the\nimages, for example, one for each illumination. One should also inspect the\nvarious ``bundle_adjust`` report files (:numref:`ba_out_files`).\n\nTerrain model preparation\n~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe input terrain was regridded to a resolution of 0.01 meters per pixel\nwith ``gdalwarp`` (:numref:`gdal_tools`)::\n\n    gdalwarp         \\\n      -overwrite     \\\n      -r cubicspline \\\n      -tr 0.01 0.01  \\\n      dem.tif dem_tr0.01.tif\n\nIt is important to use a local projection in meters, such as UTM. This program\ncan also resample an input DEM that has a geographic projection\n(longitude-latitude) to a local projection, with the option ``-t_srs``.\n\nThe produced DEM was smoothed a bit, to reduce the numerical noise::\n\n    dem_mosaic            \\\n      --dem-blur-sigma 1  \\\n      dem_tr0.01.tif      \\\n      -o dem_tr0.01_smooth.tif\n\nThe resulting DEM can be hillshaded and visualized in ``stereo_gui`` (:numref:`stereo_gui_hillshade`).\n\nIllumination angles\n~~~~~~~~~~~~~~~~~~~\n\nThe illumination information was specified in a file named ``sfs_sun_list.txt``,\nwith each line having the image name and the Sun azimuth and elevation\n(altitude) in degrees, in double precision, with a space as separator. The\nazimuth is measured clockwise from the North, and the elevation is measured from\nthe horizon.\n    \nThe `SunCalc <https://www.suncalc.org/>`_ site was very useful in determining\nthis information, given the coordinates of the site and the image acquisition\ntime as stored in the EXIF data. One has to be mindful of local vs UTC time.\n\nIt was sufficient to use the same Sun azimuth and elevation for all images\nacquired in quick succession.\n\nInput images\n~~~~~~~~~~~~\n\nThe number of input images can be very large, which can slow down the SfS\nprogram. It is suggested to divide them into groups, by illumination conditions,\nand ignore those outside the area of interest. ASP has logic that can help\nwith that (:numref:`sfs_azimuth`).\n\nOut of all images from a given group, a subset should be selected that covers\nthe site fully. That can be done by mapprojecting the images onto the DEM, and\nthen running the ``image_subset`` program (:numref:`image_subset`)::\n\n    image_subset                           \\\n      --t_projwin min_x min_y max_x max_y  \\\n      --threshold 0.01                     \\\n      --image-list image_list.txt          \\\n      -o subset.txt\n\nThe values passed in via ``--t_projwin`` have the desired region extent (it can\nbe found with ``gdalinfo``, :numref:`gdal_tools`), or with ``stereo_gui``. It is\noptional.\n\nFor an initial run, it is simpler to manually pick an image from each group.\n\nThe raw camera images corresponding to the union of all such subsets\nwere put in a file named ``sfs_image_list.txt``. The corresponding camera\nmodel files were listed in the file ``sfs_camera_list.txt``, one per line.\nThese must be in the same order.\n\nRunning SfS\n~~~~~~~~~~~\n\nThe best SfS results were produced by first estimating the image exposures, haze,\nand a low-resolution albedo for the full site, then refining all these further\nper tile. \n\nThis all done under the hood by ``parallel_sfs`` (:numref:`parallel_sfs`) in the\nlatest build (:numref:`release`). The command is::\n\n    parallel_sfs                            \\\n      -i dem.tif                            \\\n      --image-list sfs_image_list.txt       \\\n      --camera-list sfs_camera_list.txt     \\\n      --sun-angles sfs_sun_list.txt         \\\n      --processes 6                         \\\n      --threads 8                           \\\n      --tile-size 200                       \\\n      --padding 50                          \\\n      --blending-dist 10                    \\\n      --smoothness-weight 3                 \\\n      --robust-threshold 10                 \\\n      --reflectance-type 0                  \\\n      --num-haze-coeffs 1                   \\\n      --initial-dem-constraint-weight 0.001 \\\n      --albedo-robust-threshold 0.025       \\\n      --crop-input-images                   \\\n      --save-sparingly                      \\\n      --max-iterations 5                    \\\n      -o sfs/run\n\nThis program can be very sensitive to the smoothness weight. A higher value will\nproduce blurred results, while a lower value will result in a noisy output. One\ncould try various values for it that differ by a factor of 10 before refining it\nfurther.\n\nThe ``--robust-threshold`` parameter is very important for eliminating the\neffect of shadows. Its value should be a fraction of the difference in intensity\nbetween lit and shadowed pixels. Some experimentation may be needed to find the\nright value. A large value will result in visible shadow artifacts. A smaller\nvalue may require more iterations and may blur more the output.\n\nIt is strongly suggested to first run SfS on a small clip to get an intuition\nfor the parameters (then can use the ``sfs`` program directly).\n\nWe used the Lambertian reflectance model (``--reflectance-type 0``). For the Moon,\nusually the Lunar-Lambertian model is preferred (value 1).\n\nThe produced DEM will be named ``sfs/run-DEM-final.tif``. Other outputs are\nlisted in :numref:`sfs_outputs`.\n\nThe results are shown in :numref:`earth_input_images`.\n\n"
  },
  {
    "path": "docs/examples/skysat.rst",
    "content": ".. _skysat:\n\nSkySat Stereo and Video data\n----------------------------\n\nSkySat is a constellation of sub-meter resolution Earth observation\nsatellites owned by *Planet*. There are two type of SkySat\nproducts, *Stereo* and *Video*, with each made up of\nsequences of overlapping images. Their processing is described in\n:numref:`skysat_stereo` and :numref:`skysat_video`, respectively.\n\nSkySat images are challenging to process with ASP because they come in\na very long sequence, with small footprints, and high focal length. It\nrequires a lot of care to determine and refine the camera positions\nand orientations. \n\nA very informative paper on processing SkySat data with ASP is\n:cite:`bhushan2021automated`, and their workflow is `publicly\navailable <https://github.com/uw-cryo/skysat_stereo>`_.\n\n.. _skysat_stereo:\n\nStereo data\n~~~~~~~~~~~\n\nThe SkySat *Stereo* products may come with Pinhole cameras\n(stored in files with the ``_pinhole.json`` suffix) and/or with RPC\ncameras (embedded in the TIF images or in files with the ``_RPC.txt``\nsuffix).\n\nThis product may have images acquired with either two or three\nperspectives, and for each of those there are three sensors with\noverlapping fields of view. Each sensor creates on the order of 300\nimages with much overlap among them.\n\nIndividual pairs of stereo images are rather easy to process with ASP,\nfollowing the example in :numref:`rpc`. Here we focus on creating\nstereo from the full sequences of images.\n\nDue to non-trivial errors in each provided camera's position and orientation,\nit was found necessary to convert the given cameras to ASP's\nPinhole format (:numref:`pinholemodels`) and then run bundle\nadjustment (:numref:`bundle_adjust`), to refine the camera\nposes. (Note that for RPC cameras, this conversion decouples the\ncamera intrinsics from their poses.) Then, pairwise stereo is run, and\nthe obtained DEMs are mosaicked.\n\nA possible workflow is as follows. (Compare this with the processing\nof Video data in :numref:`skysat_video`. This section is newer, and if\nin doubt, use the approach here.)\n\nCreation of input cameras\n^^^^^^^^^^^^^^^^^^^^^^^^^\n\nPinhole cameras can be created with ``cam_gen`` (:numref:`cam_gen`).\nTwo approaches can be used. The first is to ingest SkySat's provided\nPinhole cameras, which have a ``_pinhole.json`` suffix.\n\n::\n\n    pref=img/1259344359.55622339_sc00104_c2_PAN_i0000000320\n    cam_gen ${pref}.tif                        \\\n        --input-camera ${pref}_pinhole.json    \\\n        -o ${pref}.tsai\n\nThis approach is preferred. Specify a .json extension if desired\nto mix and match various sensor types (:numref:`ba_frame_linescan`).\n\nWith SkySat, it is suggested not to refine the vendor-provided cameras at this\nstage, but do a straightforward conversion only. Note that this was tested only\nwith the L1A SkySat product.\n\nAlternatively, if the ``pinhole.json`` files are not available, \na Pinhole camera can be derived from each of their RPC\ncameras.\n\n::\n\n    pref=img/1259344359.55622339_sc00104_c2_PAN_i0000000320\n    cam_gen ${pref}.tif               \\\n        --input-camera ${pref}.tif    \\\n        --focal-length 553846.153846  \\\n        --optical-center 1280 540     \\\n        --pixel-pitch 1.0             \\\n        --reference-dem ref.tif       \\\n        --height-above-datum 4000     \\\n        --refine-camera               \\\n        --frame-index frame_index.csv \\\n        --parse-ecef                  \\\n        --cam-ctr-weight 1000         \\\n        --gcp-std 1                   \\\n        --gcp-file ${pref}.gcp        \\\n        -o ${pref}.tsai\n\nIt is very important to examine if the data is of type L1A or L1B. The\nvalue of ``--pixel-pitch`` should be 0.8 in the L1B products, but 1.0\nfor L1A.\n\nAbove, we read the ECEF camera positions from the ``frame_index.csv``\nfile provided by Planet. These positions are more accurate than what\n``cam_gen`` can get on its own based on the RPC camera.\n\nThe ``--cam-ctr-weight`` and ``--refine-camera`` options will keep\nthe camera position in place by penalizing any deviations with the given\nweight, while refining the camera orientation.\n\nThe reference DEM ``ref.tif`` is a Copernicus 30 m DEM\n(:numref:`initial_terrain`). Ensure the DEM is relative to WGS84 and\nnot EGM96, and convert it if necessary; see :numref:`conv_to_ellipsoid`.\n\nThe option ``--input-camera`` will make\nuse of existing RPC cameras to accurately find the pinhole camera\nposes. The option ``--height-above-datum`` should not be necessary if\nthe DEM footprint covers fully the area of interest.\n\nSee :numref:`cam_gen_validation` for how to validate the created cameras.\n\n.. _skysat_bundle_adjustment:\n\nBundle adjustment\n^^^^^^^^^^^^^^^^^\n\nFor the next steps, it may be convenient to make symbolic links from\nthe image names and cameras to something shorter (once relevant\nmetadata that needs the original names is parsed from\n``frame_index.csv``). For example, if all the images and cameras just\nproduced are in a directory called ``img``, one can do::\n\n    cd img\n    ln -s ${pref}.tif n1000.tif\n\nfor the first Nadir-looking image, and similarly for Forward and\nAft-looking images and cameras, if available, and their associated RPC\nmetadata files.\n\nFor bundle adjustment it may be preferable to have the lists of images\nand pinhole cameras stored in files, as otherwise they may be too many\nto individually pass on the command line. \n\n::\n\n    ls img/*.tif > images.txt\n    ls img/*.tsai > cameras.txt\n\nThe entries in these files must be in the same order.\n\nThen run ``parallel_bundle_adjust`` (:numref:`parallel_bundle_adjust`), rather\nthan ``bundle_adjust``, as there are very many pairs of images to match.\n\n::\n\n    nodesList=machine_names.txt\n    parallel_bundle_adjust                    \\\n    --inline-adjustments                      \\\n    --num-iterations 200                      \\\n    --image-list images.txt                   \\\n    --camera-list cameras.txt                 \\\n    --tri-weight 0.1                          \\\n    --tri-robust-threshold 0.1                \\\n    --rotation-weight 0                       \\\n    --camera-position-weight 0                \\\n    --auto-overlap-params \"ref.tif 15\"        \\\n    --min-matches 5                           \\\n    --remove-outliers-params '75.0 3.0 20 20' \\\n    --min-triangulation-angle 15.0            \\\n    --max-pairwise-matches 200                \\\n    --nodes-list $nodesList                   \\\n    -o ba/run\n\nSee :numref:`ba_validation` for important sanity checks and report files to\nexamine after bundle adjustment. See :numref:`cam_gen_validation` for how to\nvalidate the created cameras.\n\nSee :numref:`pbs_slurm` for more details on running ASP tools on multiple\nmachines. \n\nThe ``--camera-position-weight`` can be set to a large number to keep the\ncamera positions move little during bundle adjustment. This is important if \nit is assumed that the camera positions are already accurate and it is desired\nto only refine the camera orientations. Such a constraint can prevent bundle\nadjustment from converging to a solution, so should be used with great care.\nSee :numref:`ba_cam_constraints`.\n\nThe ``--tri-weight`` option (:numref:`ba_ground_constraints`) prevents the\ntriangulated points from moving too much (a lower weight value will constrain\nless). The value of ``--tri-robust-threshold`` (0.1) is intentionally set to be\nless than the one used for ``--robust-threshold`` (0.5) to ensure pixel\nreprojection errors are always given a higher priority than triangulation\nerrors. See :numref:`ba_ground_constraints`.\n\nThe ``--rotation-weight`` value was set to 0, so the camera orientations can\nchange with no restrictions. See :numref:`ba_cam_constraints` for a discussion\nof camera constraints.\n \nIf the input cameras are reasonably accurate to start with, for example,\nconsistent with a known DEM to within a small handful of meters, that DEM\ncan be used to constrain the cameras, instead of the triangulation\nconstraint. So, the above options can be replaced, for example, with::\n\n    --heights-from-dem dem.tif              \\\n    --heights-from-dem-uncertainty 10.0     \\\n    --heights-from-dem-robust-threshold 0.1 \\\n\nThe DEM must be relative to the WGS84 ellipsoid, rather than to a geoid,\nand the weight and threshold above should be lower if the DEM has higher\nuncertainty when it comes to its heights or alignment to the cameras. \nSee also :numref:`heights_from_dem`.\n\nThe option ``--auto-overlap-params`` automatically determines which\nimage pairs overlap. We used ``--max-pairwise-matches 200`` as\notherwise too many interest point matches were found.\n\nThe option ``--mapproj-dem`` (:numref:`ba_mapproj_dem`) can be used to\npreview the quality of registration of the images on the ground after\nbundle adjustment.\n\nThe option ``--min-triangulation-angle 15.0`` filtered out interest\npoint matches with a convergence angle less than this. This is very\nimportant for creating a reliable sparse set of triangulated points\nbased on interest point matches (:numref:`ba_out_files`). This one can\nbe used to compute the alignment transform to the reference terrain::\n\n    pc_align --max-displacement 200                 \\\n      --csv-format 1:lon,2:lat,3:height_above_datum \\\n      --save-transformed-source-points              \\\n      ref.tif ba/run-final_residuals_pointmap.csv   \\\n     -o $dir/run\n\nIf desired, the obtained alignment transform can be applied to the\ncameras as well (:numref:`ba_pc_align`).\n\nUse ``stereo_gui`` to inspect the reprojection errors in the final\n``pointmap.csv`` file (:numref:`plot_csv`). See the outcome in\n:numref:`skysat_stereo_grand_mesa_pointmap`.\n\n.. _skysat_stereo_grand_mesa_poses:\n.. figure:: ../images/skysat_stereo_grand_mesa_poses.png\n   :name: skysat-stereo-example-poses\n   :alt: SkySat stereo example camera poses\n\n   The roll, pitch, and yaw of the camera orientations before and after bundle\n   adjustment for the Aft, Forward, and Nadir cameras (for the center sensor of\n   the Skysat triplet). Plotted with ``orbit_plot.py`` (:numref:`orbit_plot`). The\n   best linear fit of this data before bundle adjustment was subtracted to\n   emphasize the differences, which are very small. The cameras centers were\n   *tightly constrained* here with a large camera position weight. Yet, see\n   :numref:`skysat_stereo_grand_mesa_pointmap` for the effect on the\n   reprojection errors.\n\n.. _skysat_stereo_grand_mesa_pointmap:\n.. figure:: ../images/skysat_stereo_grand_mesa.png\n   :name: skysat-stereo-example\n   :alt: SkySat stereo example\n\n   The colorized bundle adjustment camera reprojection errors (pointmap.csv)\n   overlaid on top of the Copernicus 30 m DEM for Grand Mesa, Colorado, before\n   optimization (left) and after (right). Plotted with ``stereo_gui``. Maximum\n   shade of red is reprojection error of at least 5 pixels. The same set of\n   clean interest points was used in both plots. It can be seen that while\n   bundle adjustment changes the cameras very little, it makes a very big\n   difference in how consistent the cameras become.\n\nThe camera positions and orientations (the latter in NED coordinates)\nare summarized in two report files, before and after optimization\n(:numref:`ba_cam_pose`). It is suggested to examine if these are\nplausible. It is expected that the spacecraft position and orientation\nwill change in a slow and smooth manner, and that these will not change\ndrastically during bundle adjustment.\n\nIf desired to do further experiments in bundle adjustment, the\nexisting interest matches can be reused via the options\n``--clean-match-files-prefix`` and ``--match-files-prefix``. The\nmatches can be inspected with ``stereo_gui``\n(:numref:`stereo_gui_pairwise_matches`).\n\nDEM creation\n^^^^^^^^^^^^\n\nHow to decide which pairs of images to choose for stereo and how to combine\nthe resulting DEMs taking into account the stereo convergence angle is\ndescribed in :numref:`sfm_multiview`.\n\n.. _skysat_video:\n\nVideo data\n~~~~~~~~~~\n\nThe rest of this section will be concerned with the ``Video`` product,\nwhich is a set of images recorded together in quick sequence. This is\na very capricious dataset, so some patience will be needed to work\nwith it. That is due to the following factors:\n\n-  The baseline can be small, so the perspective of the left and right\n   image can be too similar.\n\n-  The footprint on the ground is small, on the order of 2 km.\n\n-  The terrain can be very steep.\n\n-  The known longitude-latitude corners of each image have only a few\n   digits of precision, which can result in poor initial estimated\n   cameras.\n\nBelow a recipe for how to deal with this data is described, together\nwith things to watch for and advice when things don't work. \n\nSee also how the Stereo product was processed\n(:numref:`skysat_stereo`).  That section is newer, and that product\nwas explored in more detail. Stereo products are better-behaved than\nVideo products, so it is suggested to work with Stereo data, if possible, \nor at least cross-reference with that section the logic below.\n\nThe input data\n~~~~~~~~~~~~~~\n\nWe will use as an illustration a mountainous terrain close to\nBreckenridge, Colorado. The dataset we fetched is called\n``s4_20181107T175036Z_video.zip``. We chose to work with the following\nfour images from it::\n\n     1225648254.44006968_sc00004_c1_PAN.tiff\n     1225648269.40892076_sc00004_c1_PAN.tiff\n     1225648284.37777185_sc00004_c1_PAN.tiff\n     1225648299.37995577_sc00004_c1_PAN.tiff\n\nA sample picture from this image set is shown in :numref:`skysat-example`.\n\nIt is very important to pick images that have sufficient difference in\nperspective, but which are still reasonably similar, as otherwise the\nprocedure outlined in this section will fail.\n\n.. figure:: ../images/Breckenridge.jpg\n   :name: skysat-example\n   :alt: SkySat example\n\n   An image used in the SkySat example. Reproduced with permission.\n\n.. _refdem:\n\nInitial camera models and a reference DEM\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nBased on vendor's documentation, these images are\n:math:`2560 \\times 1080` pixels. We use the geometric center of the\nimage as the optical center, which turned out to be a reasonable enough\nassumption (verified by allowing it to float later). Since the focal\nlength is given as 3.6 m and the pixel pitch is\n:math:`6.5 \\times 10^{-6}` m, the focal length in pixels is\n\n.. math:: 3.6/6.5 \\times 10^{-6} = 553846.153846.\n\nNext, a reference DEM needs to be found. Recently we recommend getting\na Copernicus 30 m DEM (:numref:`initial_terrain`).\n\nIt is very important to note that SRTM DEMs can be relative to the WGS84\nellipsoidal vertical datum, or relative to the EGM96 geoid. In the latter case,\n``dem_geoid`` (:numref:`dem_geoid`) needs to be used to first convert it to be\nrelative to WGS84. This may apply up to 100 meters of vertical adjustment.\nSee :numref:`conv_to_ellipsoid`.\n\nIt is good to be a bit generous when selecting the extent of the reference DEM.\nWe will rename the downloaded DEM to ``ref_dem.tif``. \n\nUsing the ``cam_gen`` tool (:numref:`cam_gen`) bundled with ASP, we\ncreate an initial camera model and a GCP file (:numref:`bagcp`) for\nthe first image as as follows::\n\n     cam_gen 1225648254.44006968_sc00004_c1_PAN.tiff \\\n       --frame-index output/video/frame_index.csv    \\\n       --reference-dem ref_dem.tif                   \\\n       --focal-length 553846.153846                  \\\n       --optical-center 1280 540                     \\\n       --pixel-pitch 1 --height-above-datum 4000     \\\n       --refine-camera                               \\\n       --gcp-std 1                                   \\\n       --gcp-file v1.gcp                             \\\n       -o v1.tsai\n\nThis tool works by reading the longitude and latitude of each image\ncorner on the ground from the file ``frame_index.csv``, and finding the\nposition and orientation of the camera that best fits this data. The\ncamera is written to ``v1.tsai``. A GCP file is written to ``v1.gcp``.\nThis will help later with bundle adjustment.\n\nIf an input camera exists, such as embedded in the image file, it is\nstrongly suggested to pass it to this tool using the\n``--input-camera`` option, as it will improve the accuracy of produced\ncameras (:numref:`skysat-rpc`).\n\nIn the above command, the optical center and focal length are as mentioned\nearlier. The reference SRTM DEM is used to infer the height above datum\nfor each image corner based on its longitude and latitude. The height\nvalue specified via ``--height-above-datum`` is used as a fallback\noption, if for example, the DEM is incomplete, and is not strictly\nnecessary for this example. This tool also accepts the longitude and\nlatitude of the corners as an option, via ``--lon-lat-values``.\n\nThe flag ``--refine-camera`` makes ``cam_gen`` solve a least square\nproblem to refine the output camera. In some cases it can get the\nrefinement wrong, so it is suggested experimenting with and without\nusing this option.\n\nFor simplicity of notation, we will create a symbolic link from this\nimage to the shorter name ``v1.tif``, and the GCP file needs to be\nedited to reflect this. The same will apply to the other files. We will\nhave then four images, ``v1.tif, v2.tif, v3.tif, v4.tif``, and\ncorresponding camera and GCP files.\n\nA good sanity check is to visualize the computed cameras.\nASP's ``sfm_view`` tool can be used (:numref:`sfm_view`). Alternatively, \nASP's ``orbitviz`` program (:numref:`orbitviz`) can create KML files\nthat can then be opened in Google Earth. \n\nWe very strongly recommend inspecting the camera positions and orientations,\nsince this may catch inaccurate cameras which will cause problems later.\n\nAnother important check is to mapproject these images using the cameras\nand overlay them in ``stereo_gui`` on top of the reference DEM. Here is\nan example for the first image::\n\n     mapproject --t_srs \\\n     '+proj=stere +lat_0=39.4702 +lon_0=253.908 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m' \\\n     ref_dem.tif v1.tif v1.tsai v1_map.tif \n\nNotice that we used above a longitude and latitude around the area of\ninterest. This will need to be modified for your specific example.\n\nBundle adjustment\n~~~~~~~~~~~~~~~~~\n\nAt this stage, the cameras should be about right, but not quite exact.\nWe will take care of this using bundle adjustment. We will invoke this\ntool twice. In the first call we will make the cameras self-consistent.\nThis may move them somewhat, though the ``--tri-weight`` constraint \nthat is used below should help. In the second call we will try to \nbring the back to the original location.\n\n::\n\n     parallel_bundle_adjust                \\\n       v[1-4].tif v[1-4].tsai              \\\n       -t nadirpinhole                     \\\n       --disable-tri-ip-filter             \\\n       --skip-rough-homography             \\\n       --force-reuse-match-files           \\\n       --ip-inlier-factor 2.0              \\\n       --ip-uniqueness-threshold 0.8       \\\n       --ip-per-image 20000                \\\n       --datum WGS84                       \\\n       --inline-adjustments                \\\n       --camera-weight 0                   \\\n       --tri-weight 0.1                    \\\n       --robust-threshold 2                \\\n       --remove-outliers-params '75 3 4 5' \\\n       --ip-num-ransac-iterations 1000     \\\n       --num-passes 2                      \\\n       --auto-overlap-params \"ref.tif 15\"  \\\n       --num-iterations 1000               \\\n       -o ba/run\n\n     parallel_bundle_adjust                     \\\n       -t nadirpinhole                          \\\n       --datum WGS84                            \\\n       --force-reuse-match-files                \\\n       --inline-adjustments                     \\\n       --num-passes 1 --num-iterations 0        \\\n       --transform-cameras-using-gcp            \\\n       v[1-4].tif ba/run-v[1-4].tsai v[1-4].gcp \\\n       -o ba/run\n\nThe ``--auto-overlap-params`` option used earlier is useful a very large\nnumber of images is present and a preexisting DEM of the area is available,\nwhich need not be perfectly aligned with the cameras. It can be used\nto determine each camera's footprint, and hence, which cameras overlap.\nOtherwise, use the ``--overlap-limit`` option to control how many subsequent\nimages to match with a given image. \n\nThe output optimized cameras will be named ``ba/run-run-v[1-4].tsai``.\nThe reason one has the word \"run\" repeated is because we ran this tool\ntwice. The intermediate cameras from the first run were called\n``ba/run-v[1-4].tsai``.\n\nHere we use ``--ip-per-image 20000`` to create a lot of interest points.\nThis will help with alignment later. It is suggested that the user study\nall these options and understand what they do. We also used\n``--robust-threshold 10`` to force the solver to work the bigger errors.\nThat is necessary since the initial cameras could be pretty inaccurate.\n\nIt is very important to examine the residual file named::\n\n     ba/run-final_residuals_pointmap.csv\n\n(:numref:`ba_err_per_point`).\n\nHere, the third column are the heights of triangulated interest\npoints, while the fourth column are the reprojection errors. Normally\nthese errors should be a fraction of a pixel, as otherwise the\nsolution did not converge. The last entries in this file correspond to\nthe GCP, and those should be looked at carefully as well. The\nreprojection errors for GCP should be on the order of tens of pixels\nbecause the longitude and latitude of each GCP are not\nwell-known. This can be done with :numref:`stereo_gui`, which will\nalso colorize the residuals (:numref:`plot_csv`).\n\nIt is also very important to examine the obtained match files in the\noutput directory. For that, use ``stereo_gui`` with the option\n``--pairwise-matches`` (:numref:`stereo_gui_view_ip`). If there are\ntoo few matches, particularly among very similar images, one may need\nto increase the value of ``--epipolar-threshold`` (or of\n``--ip-inlier-factor`` for the not-recommended pinhole session). Note\nthat a large value here may allow more outliers, but those should normally\nby filtered out by ``bundle_adjust``.\n\nAnother thing one should keep an eye on is the height above datum of the camera\ncenters as printed by bundle adjustment towards the end. Any large difference in\ncamera heights (say more than a few km) could be a symptom of some failure.\n\nAlso look at how much the triangulated points and camera centers moved as a\nresult of bundle adjustment. Appropriate constraints may need to be applied\n(:numref:`ba_constraints`).\n \nNote that using the ``nadirpinhole`` session is equivalent to using ``pinhole``\nand setting ``--datum``.\n\n.. _skysat_video_stereo:\n\nCreating terrain models\n~~~~~~~~~~~~~~~~~~~~~~~\n\nThe next steps are to run ``parallel_stereo`` and create DEMs.\n\nWe will run the following command for each pair of images. Note that we\nreuse the filtered match points created by bundle adjustment, with the\n``--clean-match-files-prefix`` option.\n\n::\n\n     i=1\n     ((j=i+1))\n     st=stereo_v${i}${j}\n     rm -rfv $st\n     mkdir -p $st\n     parallel_stereo --skip-rough-homography       \\\n       -t nadirpinhole --stereo-algorithm asp_mgm  \\\n       v${i}.tif v${j}.tif                         \\\n       ba/run-run-v${i}.tsai ba/run-run-v${j}.tsai \\\n       --clean-match-files-prefix ba/run           \\\n       $st/run\n     point2dem --auto-proj-center \\\n       --tr 4 --errorimage $st/run-PC.tif\n\n(Repeat this for other values of :math:`i`.)\n\nSee :numref:`nextsteps` for a discussion about various speed-vs-quality choices.\nSee :numref:`point2dem_proj` about DEM projection determination.\n\nIt is important to examine the mean triangulation error\n(:numref:`triangulation_error`) for each DEM::\n\n     gdalinfo -stats stereo_v12/run-IntersectionErr.tif | grep Mean\n\nwhich should hopefully be no more than 0.5 meters, otherwise likely\nbundle adjustment failed. One should also compare the DEMs among\nthemselves::\n\n     geodiff --absolute stereo_v12/run-DEM.tif stereo_v23/run-DEM.tif -o tmp \n     gdalinfo -stats tmp-diff.tif | grep Mean\n\n(And so on for any other pair.) Here the mean error should be on the\norder of 2 meters, or hopefully less.\n\nMosaicking and alignment\n~~~~~~~~~~~~~~~~~~~~~~~~\n\nIf more than one image pair was used, the obtained DEMs can be\nmosaicked with ``dem_mosaic`` (:numref:`dem_mosaic`)::\n\n     dem_mosaic stereo_v12/run-DEM.tif stereo_v23/run-DEM.tif \\\n       stereo_v34/run-DEM.tif -o mosaic.tif\n\nThis DEM can be hillshaded and overlaid on top of the reference DEM.\n\nThe next step is aligning it to the reference.\n\n::\n\n     pc_align --max-displacement 1000 --save-transformed-source-points \\\n       --alignment-method similarity-point-to-point                    \\\n       ref_dem.tif mosaic.tif -o align/run\n\nIt is important to look at the errors printed by this tool before and\nafter alignment, as well as details about the alignment that was\napplied. The obtained aligned cloud can be made into a DEM again::\n\n     point2dem            \\\n       --auto-proj-center \\\n       --tr 4             \\\n       align/run-trans_source.tif\n\nThe absolute difference before and after alignment can be found as\nfollows::\n\n     geodiff --absolute mosaic.tif ref_dem.tif -o tmp \n     gdalinfo -stats tmp-diff.tif | grep Mean\n\n::\n\n     geodiff --absolute  align/run-trans_source-DEM.tif ref_dem.tif -o tmp \n     gdalinfo -stats tmp-diff.tif | grep Mean\n\nIn this case the mean error after alignment was about 6.5 m, which is\nnot too bad given that the reference DEM resolution is about 30 m/pixel.\n\nAlignment of cameras\n~~~~~~~~~~~~~~~~~~~~\n\nThe transform computed with ``pc_align`` can be used to bring the\ncameras in alignment to the reference DEM. That can be done as follows::\n\n     parallel_bundle_adjust -t nadirpinhole --datum wgs84     \\\n       --force-reuse-match-files                              \\\n       --inline-adjustments                                   \\\n       --initial-transform align/run-transform.txt            \\\n       --apply-initial-transform-only                         \\\n       v[1-4].tif ba/run-run-v[1-4].tsai -o ba/run\n\ncreating the aligned cameras ``ba/run-run-run-v[1-4].tsai``. If\n``pc_align`` was called with the reference DEM being the second cloud,\none should use above the file::\n\n     align/run-inverse-transform.txt\n\nas the initial transform.\n\nMapprojection\n~~~~~~~~~~~~~\n\nIf the steep topography prevents good DEMs from being created, one can\nmapproject the images first onto the reference DEM::\n\n     for i in 1 2 3 4; do \n       mapproject --tr gridSize ref_dem.tif v${i}.tif \\\n         ba/run-run-run-v${i}.tsai v${i}_map.tif  \n     done\n\nIt is very important to use the same resolution (option ``--tr``) for\nboth images when mapprojecting. That helps making the resulting images\nmore similar and reduces the processing time (:numref:`mapproj-res`). \n\nThen run ``parallel_stereo`` with the mapprojected images, such as::\n\n     i=1\n     ((j=i+1))\n     rm -rfv stereo_map_v${i}${j}\n     parallel_stereo v${i}_map.tif v${j}_map.tif                   \\\n       ba/run-run-run-v${i}.tsai ba/run-run-run-v${j}.tsai         \\\n       --session-type pinhole --alignment-method none              \\\n       --cost-mode 4 --stereo-algorithm asp_mgm --corr-seed-mode 1 \\\n       stereo_map_v${i}${j}/run ref_dem.tif\n\n     point2dem --auto-proj-center \\\n       --tr 4 --errorimage        \\\n       stereo_map_v${i}${j}/run-PC.tif\n\nIt is important to note that here we used the cameras that were aligned\nwith the reference DEM. We could have as well mapprojected onto a\nlower-resolution version of the mosaicked and aligned DEM with its holes\nfilled.\n\nWhen things fail\n~~~~~~~~~~~~~~~~\n\nProcessing SkySat images is difficult, for various reasons mentioned\nearlier. A few suggestions were also offered along the way when things\ngo wrong.\n\nProblems are usually due to cameras being initialized inaccurately by\n``cam_gen`` or bundle adjustment not optimizing them well. The simplest\nsolution is often to just try a different pair of images from the\nsequence, say from earlier or later in the flight, or a pair with less\noverlap, or with more time elapsed between the two acquisitions.\nModifying various parameters may help as well.\n\nWe have experimented sufficiently with various SkySat datasets to be\nsure that the intrinsics (focal length, optical center, and pixel pitch)\nare usually not the issue, rather the positions and orientations of the\ncameras.\n\nStructure from motion\n~~~~~~~~~~~~~~~~~~~~~\n\nIn case ``cam_gen`` does not create sufficiently good cameras, one\ncan attempt to use the ``camera_solve`` tool (:numref:`sfm`). This\nwill create hopefully good cameras but in an arbitrary coordinate\nsystem. Then we will transfer those to the world coordinates using\nGCP.\n\nHere is an example for two cameras::\n\n     out=out_v12 \n     ba_params=\"--num-passes 1 --num-iterations 0\n        --transform-cameras-using-gcp\"\n     theia_overdides=\"--sift_num_levels=6 --lowes_ratio=0.9 \n       --min_num_inliers_for_valid_match=10 \n       --min_num_absolute_pose_inliers=10 \n       --bundle_adjustment_robust_loss_function=CAUCHY \n       --post_rotation_filtering_degrees=180.0 --v=2  \n       --max_sampson_error_for_verified_match=100.0 \n       --max_reprojection_error_pixels=100.0 \n       --triangulation_reprojection_error_pixels=100.0 \n       --min_num_inliers_for_valid_match=10 \n       --min_num_absolute_pose_inliers=10\"                  \n     rm -rfv $out\n     camera_solve $out --datum WGS84 --calib-file v1.tsai  \\\n         --bundle-adjust-params \"$ba_params v1.gcp v2.gcp\" \\\n         v1.tif v2.tif \n\nThe obtained cameras should be bundle-adjusted as done for the outputs\nof ``cam_gen``. Note that this tool is capricious and its outputs can be\noften wrong. In the future it will be replaced by something more robust.\n\n.. _skysat-rpc:\n\nRPC models\n~~~~~~~~~~\n\nSome SkySat datasets come with RPC camera models, typically embedded in\nthe images. This can be verified by running::\n\n     gdalinfo -stats output/video/frames/1225648254.44006968_sc00004_c1_PAN.tiff\n\nWe found that these models are not sufficiently robust for stereo. But\nthey can be used to create initial guess pinhole cameras \n(:numref:`pinholemodels`) with ``cam_gen``. \n\nWe will use the RPC camera model instead of longitude and latitude of\nimage corners to infer the pinhole camera position and orientation.\nThis greatly improves the accuracy and reliability.\n\nHere is an example::\n\n    img=output/video/frames/1225648254.44006968_sc00004_c1_PAN.tiff\n    cam_gen $img --reference-dem ref_dem.tif --focal-length 553846.153846  \\\n       --optical-center 1280 540 --pixel-pitch 1 --height-above-datum 4000 \\\n       --refine-camera --gcp-std 1 --input-camera $img                     \\\n       -o v1_rpc.tsai --gcp-file v1_rpc.gcp\n\nNote that the Breckenridge dataset does not have RPC data, but other\ndatasets do. If the input camera is stored separately in a camera file,\nuse that one with ``--input-camera``.\n\nIf an RPC model is embedded in the image, one can validate how well the new Pinhole\ncamera approximates the existing RPC camera with ``cam_test``\n(:numref:`cam_test`), with a command like::\n\n  cam_test --image image.tif --cam1 image.tif --cam2 out_cam.tsai \\\n      --height-above-datum 4000\n\nThen one can proceed as earlier (particularly the GCP file can be edited\nto reflect the shorter image name).\n\nOne can also regenerate the provided SkySat RPC model as::\n\n     cam2rpc -t rpc --dem-file dem.tif input.tif output.xml\n\nHere, the reference DEM should go beyond the extent of the image. This\ntool makes it possible to decide how finely to sample the DEM, and one\ncan simply use longitude-latitude and height ranges instead of the DEM.\n\nWe assumed in the last command that the input image implicitly stores\nthe RPC camera model, as is the case for SkySat.\n\nAlso, any pinhole camera models obtained using our software can be\nconverted to RPC models as follows::\n\n     cam2rpc --dem-file dem.tif input.tif input.tsai output.xml \n\nBundle adjustment using reference terrain\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nAt this stage, if desired, but this is rather unnecessary, one can do\njoint optimization of the cameras using dense and uniformly distributed\ninterest points, and using the reference DEM as a constraint. This\nshould make the DEMs more consistent among themselves and closer to the\nreference DEM.\n\nIt is also possible to float the intrinsics, per\n:numref:`floatingintrinsics`, which sometimes can improve the results\nfurther.\n\nFor that, one should repeat the ``stereo_tri`` part of of the stereo\ncommands from :numref:`skysat_video_stereo` with the flags\n``--num-matches-from-disp-triplets 10000`` and ``--unalign-disparity``\nto obtain dense interest points and unaligned disparity.\n(To not generate the triangulated point cloud after\nthis, add the option ``--compute-point-cloud-center-only``.)\nUse ``--num-matches-from-disparity 10000`` if the images are large,\nas the earlier related option can be very slow then.\n\nThe match points can be examined as::\n\n     stereo_gui v1.tif v2.tif stereo_v12/run-disp-v1__v2.match\n\nand the same for the other image pairs. Hopefully they will fill as much\nof the images as possible. One should also study the unaligned\ndisparities, for example::\n\n     stereo_v12/run-v1__v2-unaligned-D.tif\n\nby invoking ``disparitydebug`` on it and then visualizing the two\nobtained images. Hopefully these disparities are dense and with few\nholes.\n\nThe dense interest points should be copied to the new bundle adjustment\ndirectory, such as::\n\n     mkdir -p ba_ref_terrain\n     cp stereo_v12/run-disp-v1__v2.match ba_ref_terrain/run-v1__v2.match\n\nand the same for the other ones (note the convention for match files in\nthe new directory). The unaligned disparities can be used from where\nthey are.\n\nThen bundle adjustment using the reference terrain constraint proceeds\nas follows::\n\n     disp_list=$(ls stereo_v[1-4][1-4]/*-unaligned-D.tif)\n     bundle_adjust v[1-4].tif  ba/run-run-run-v[1-4].tsai -o ba_ref_terrain/run    \\\n     --reference-terrain ref_dem.tif --disparity-list \"$disp_list\"                 \\\n     --max-num-reference-points 10000000 --reference-terrain-weight 50             \\\n     --parameter-tolerance 1e-12 -t nadirpinhole --max-iterations 500              \\\n     --overlap-limit 1 --inline-adjustments --robust-threshold 2                   \\\n     --force-reuse-match-files --max-disp-error 100 --camera-weight 0\n\nIf invoking this creates new match files, it means that the dense match\nfiles were not copied successfully to the new location. If this\noptimization is slow, perhaps too many reference terrain points were\npicked.\n\nThis will create, as before, the residual file named::\n\n     ba_ref_terrain/run-final_residuals_pointmap.csv\n\nshowing how consistent are the cameras among themselves, and in\naddition, a file named::\n\n     ba_ref_terrain/run-final_residuals_reference_terrain.txt\n\nwhich tells how well the cameras are aligned to the reference terrain.\nThe errors in the first file should be under 1 pixel, and in the second\none should be mostly under 2-3 pixels (both are the fourth column in\nthese files).\n\nThe value of ``--reference-terrain-weight`` can be increased to make the\nalignment to the reference terrain a little tighter.\n\nIt is hoped that after running ``parallel_stereo`` with these refined\ncameras, the obtained DEMs will differ by less than 2 m among\nthemselves, and by less than 4 m as compared to the reference DEM.\n\nFloating the camera intrinsics\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nIf desired to float the focal length as part of the optimization, one\nshould pass in addition, the options::\n\n    --solve-intrinsics --intrinsics-to-float 'focal_length'\n\nFloating the optical center can be done by adding it in as well.\n\nIt is important to note that for SkySat the intrinsics seem to be\nalready quite good, and floating them is not necessary and is only shown\nfor completeness. If one wants to float them, one should vary the focal\nlength while keeping the optical center fixed, and vice versa, and\ncompare the results. Then, with the result that shows most promise, one\nshould vary the other parameter. If optimizing the intrinsics too\naggressively, it is not clear if they will still deliver better results\nwith other images or if comparing with a different reference terrain.\n\nYet, if desired, one can float even the distortion parameters. For that,\nthe input camera files need to be converted to some camera model having\nthese (see :numref:`pinholemodels`), and their\nvalues can be set to something very small. One can use the Brown-Conrady\nmodel, for example, so each camera file must have instead of ``NULL`` at\nthe end the fields::\n\n   BrownConrady\n   xp  = -1e-12\n   yp  = -1e-12\n   k1  = -1e-10\n   k2  = -1e-14\n   k3  = -1e-22\n   p1  = -1e-12\n   p2  = -1e-12\n   phi = -1e-12\n\nThere is always a chance when solving these parameters that the obtained\nsolution is not optimal. Hence, one can also try using as initial\nguesses different values, for example, by negating the above numbers.\n\nOne can also try to experiment with the option ``--heights-from-dem``,\nand also with ``--robust-threshold`` if it appears that the large errors\nare not minimized enough.\n"
  },
  {
    "path": "docs/examples/spot5.rst",
    "content": ".. _spot5:\n\nSPOT5\n-----\n\nSPOT5 is a CNES (Space Agency of France) satellite launched on May 2002\nand decommissioned in March 2015. SPOT5 contained two High Resolution\nStereoscopic (HRS) instruments with a ground resolution of 5 meters.\nThese two cameras were pointed forwards and backwards, allowing capture\nof a stereo image pair in a single pass of the satellite.\n\nFor the newer SPOT 6 and SPOT 7 satellites, which use a different format and\ncamera model, see :numref:`spot67`.\n\nASP supports only images from the HRS sensors on SPOT5. These images\ncome in two parts, the data file (extension ``.bil`` or ``.tif``) and\nthe header file the data file (extension ``.dim``). The data file can be\neither a plain binary file with no header information or a GeoTIFF file.\nThe header file is a plain text XML file. When using SPOT5 images with\nASP tools, pass in the data file as the image file and the header file\nas the camera model file.\n\nAll ASP tools can handle ``.bil`` images (and also ``.bip`` and ``.bsq``)\nas long as a similarly named ``.dim`` file exists that can be looked\nup. The lookup succeeds if, for example, the ``.dim`` and ``.bil``\nfiles differ only by extension (lower or upper case), or, as below,\nwhen an IMAGERY.BIL file has a corresponding METADATA file.\n\nA sample SPOT5 image can be found at at\nhttp://www.geo-airbusds.com/en/23-sample-imagery.\n\nImage preparation\n~~~~~~~~~~~~~~~~~\n\nSPOT5 datasets come in a directory structure where the front and back images\nhave the same name, without the path, and the same for the camera files. This\nconflicts with the ``bundle_adjust`` assumptions. \n\nA simple workaround is to rename the images and cameras::\n\n    mv front/SEGMT01/METADATA.BIL front/SEGMT01/METADATA_FRONT.BIL\n    mv back/SEGMT01/METADATA.BIL  back/SEGMT01/METADATA_BACK.BIL\n\n    mv front/SEGMT01/METADATA.DIM front/SEGMT01/METADATA_FRONT.DIM\n    mv back/SEGMT01/METADATA.DIM  back/SEGMT01/METADATA_BACK.DIM\n\nStereo with raw images\n^^^^^^^^^^^^^^^^^^^^^^\n    \nRun bundle adjustment (:numref:`bundle_adjust`)::\n\n    bundle_adjust -t spot5             \\\n      front/SEGMT01/IMAGERY_FRONT.BIL  \\\n      back/SEGMT01/IMAGERY_BACK.BIL    \\\n      front/SEGMT01/METADATA_FRONT.DIM \\\n      back/SEGMT01/METADATA_BACK.DIM   \\\n      -o ba_run/out\n\nIt is not clear if SPOT5 images benefit from bundle adjustment.\n      \nRun ``parallel_stereo`` (:numref:`parallel_stereo`) with the adjusted cameras::\n\n    parallel_stereo -t spot5            \\\n      --bundle-adjust-prefix ba_run/out \\\n      --stereo-algorithm asp_mgm        \\\n      front/SEGMT01/IMAGERY_FRONT.BIL   \\\n      back/SEGMT01/IMAGERY_BACK.BIL     \\\n      front/SEGMT01/METADATA_FRONT.DIM  \\\n      back/SEGMT01/METADATA_BACK.DIM    \\\n      st_run/out \n\nHere uses the ``asp_mgm`` algorithm. See :numref:`nextsteps` for a discussion\nabout various speed-vs-quality choices of the stereo algorithms. \n\nThis is followed by DEM creation with ``point2dem`` (:numref:`point2dem`)::\n\n    point2dem st_run/out-PC.tif\n\nStereo with mapprojected images\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nFor terrains with steep slopes, it is strongly suggested to run stereo with\nmapprojected images (:numref:`mapproj-example`). For that, first use the\n``add_spot_rpc`` tool to generate an RPC model approximation of the SPOT5 sensor\nmodel.\n\n::\n\n    add_spot_rpc front/SEGMT01/METADATA_FRONT.DIM \\\n      -o front/SEGMT01/METADATA_FRONT.DIM\n    add_spot_rpc back/SEGMT01/METADATA.DIM        \\\n      -o back/SEGMT01/METADATA_BACK.DIM\n\nThis will append the RPC model to the existing file. If the output\nis a separate file, only the RPC model will be saved to the new file.\n\nThen use the ``spot5maprpc`` session type when running parallel_stereo on the\nmapprojected images. \n\nEnsure that any external DEM is adjusted, if needed, to be relative the\nellipsoid (:numref:`conv_to_ellipsoid`).\n\nSee the note in :numref:`dem_prep` about perhaps reducing the resolution of the\nDEM to mapproject onto (and perhaps blurring it) if ghosting artifacts are seen\nin the produced DEM.\n\nThe mapprojection step is next (:numref:`mapproject`)::\n\n    mapproject -t rpc                   \\\n      --bundle-adjust-prefix ba_run/out \\\n      --tr gridSize                     \\\n      sample_dem.tif                    \\\n      front/SEGMT01/IMAGERY_FRONT.BIL   \\\n      front/SEGMT01/METADATA_FRONT.DIM  \\\n      front_map_proj.tif\n    mapproject -t rpc                   \\\n      --bundle-adjust-prefix ba_run/out \\\n      --ref-map front_map_proj.tif      \\\n      sample_dem.tif                    \\\n      back/SEGMT01/IMAGERY_BACK.BIL     \\\n      back/SEGMT01/METADATA_BACK.DIM    \\\n      back_map_proj.tif\n\nThe grid size is the known ground sample distance (GSD) of the image, in meters.\nIf not set, it will be auto-guessed.\n      \nNotice how we used the option ``--ref-map`` to ensure the second mapprojected\nimage uses the same grid size and projection as the first one. In older versions\nof ASP, one must specify for both images the same projection in meters (such as\nUTM), via ``--t_srs``, and the same grid size, via ``--tr``. \n\nStereo::\n\n    parallel_stereo -t spot5maprpc      \\\n      --bundle-adjust-prefix ba_run/out \\\n      --stereo-algorithm asp_mgm        \\\n      front_map_proj.tif                \\\n      back_map_proj.tif                 \\\n      front/SEGMT01/METADATA_FRONT.DIM  \\\n      back/SEGMT01/METADATA_BACK.DIM    \\\n      st_run_map/out                    \\\n      sample_dem.tif\n\nDEM creation::\n      \n    point2dem st_run_map/out-PC.tif\n\nSee :numref:`nextsteps` for a discussion about various speed-vs-quality choices\nof the stereo algorithms.\n\nIf desired not to use bundle adjustment, then need not set the option ``--bundle-adjust-prefix``.\n\n.. figure:: ../images/examples/spot5_figure.png\n   :name: spot5_output\n         \n   Cropped region of SPOT5 image and a portion of the associated stereo\n   DEM overlaid on a low resolution Bedmap2 DEM.\n"
  },
  {
    "path": "docs/examples/spot67.rst",
    "content": ".. _spot67:\n\nSPOT 6/7\n--------\n\nSPOT 6 (launched 2012) and SPOT 7 (launched 2014) are Airbus Earth observation\nsatellites with 1.5-meter panchromatic resolution. They are part of the same\nSPOT family as SPOT 5 (:numref:`spot5`), but use the DIMAP V2 XML format and a\nlinescan camera model that closely follows the Pleiades sensor\n(:numref:`pleiades`).\n\nASP expects raw (non-orthorectified) images. The data have both an exact\nlinescan camera model and an approximate RPC model (:numref:`rpc`), stored in\nseparate XML files whose names start with \"DIM\" and \"RPC\", respectively. ASP\nsupports both. The USGS CSM library (:numref:`csm`) is used for linescan\nmodels.\n\nThe session type is ``-t spot`` (:numref:`ps_options`). If the ``-t``\noption is not specified, it will be auto-detected from the camera files.\n\n.. _spot67_stereo:\n\nBundle adjustment and stereo with raw images\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nBundle adjustment (:numref:`bundle_adjust`) is suggested before stereo::\n\n    bundle_adjust -t spot            \\\n      --camera-weight 0              \\\n      --tri-weight 0.1               \\\n      left.tif right.tif             \\\n      left_exact.xml right_exact.xml \\\n      -o ba/run\n\nWith the exact models, the stereo command, with bundle-adjusted cameras, is::\n\n    parallel_stereo -t spot           \\\n      --stereo-algorithm asp_mgm      \\\n      --subpixel-mode 9               \\\n      --bundle-adjust-prefix ba/run   \\\n      left.tif right.tif              \\\n      left_exact.xml right_exact.xml  \\\n      results/run\n\nThen, a DEM is created with ``point2dem`` (:numref:`point2dem`)::\n\n    point2dem results/run-PC.tif\n\nFor steep terrain, it is suggested to run stereo with mapprojected images\n(:numref:`spot67_map`).\n\nSee :numref:`nextsteps` for a discussion about various speed-vs-quality choices\nfor stereo.\n\nSee :numref:`jitter_pleiades` for an example of solving for jitter with these\ncameras. Note the limitations of the jitter solver in\n:numref:`jitter_limitations`. This is available as of build 2026/03\n(:numref:`release`).\n\nFor the RPC model (:numref:`rpc`), the option ``-t rpc`` should be used\nand the RPC camera files should be passed in. If the ``-t`` option is\nnot specified, it will be auto-guessed based on the content of the\ncamera files provided as inputs.\n\n.. _spot67_map:\n\nStereo with mapprojected images\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nASP supports running stereo with mapprojected SPOT 6/7 images\n(:numref:`mapproj-example`).\n\nAll input images must be mapprojected at the same resolution (which is\ncomparable with the ground sample distance, GSD). The same camera models must be\nused for mapprojection as for stereo, so one should not mix the exact and RPC\ncameras.\n\nEnsure the input DEM used for mapprojection is relative to the ellipsoid\n(:numref:`conv_to_ellipsoid`).\n\nExample::\n\n    proj=\"+proj=utm +zone=13 +datum=WGS84 +units=m +no_defs\"\n\n    mapproject -t spot               \\\n      --tr 1.5                       \\\n      --t_srs \"$proj\"                \\\n      --bundle-adjust-prefix ba/run  \\\n      ref_dem.tif                    \\\n      left.tif                       \\\n      left_exact.xml                 \\\n      left_map.tif\n\n    mapproject -t spot               \\\n      --tr 1.5                       \\\n      --t_srs \"$proj\"                \\\n      --bundle-adjust-prefix ba/run  \\\n      ref_dem.tif                    \\\n      right.tif                      \\\n      right_exact.xml                \\\n      right_map.tif\n\n    parallel_stereo -t spot           \\\n      --stereo-algorithm asp_mgm      \\\n      --subpixel-mode 9               \\\n      --bundle-adjust-prefix ba/run   \\\n      left_map.tif right_map.tif      \\\n      left_exact.xml right_exact.xml  \\\n      run_map/run                     \\\n      ref_dem.tif\n\n    point2dem run_map/run-PC.tif\n\nThe projection string above needs to be modified for your area of interest. It\nis strongly suggested to use an auto-determined UTM or polar stereographic\nprojection (:numref:`point2dem_proj`).\n\nThe value of the ``--tr`` option is the ground sample distance. It is normally\n1.5 meters for SPOT 6/7 PAN images. The XML files should have the GSD value.\n\nTo not use bundle-adjusted cameras, remove the option ``--bundle-adjust-prefix``\nfrom all ``mapproject`` and ``parallel_stereo`` commands above.\n\n.. _spot67_exact_vs_rpc:\n\nExact and RPC cameras\n~~~~~~~~~~~~~~~~~~~~~\n\nTo compare the linescan (exact) and RPC models, run ``cam_test``\n(:numref:`cam_test`) as::\n\n     cam_test --image img.tif        \\\n       --cam1 cam_exact.xml          \\\n       --cam2 cam_rpc.xml            \\\n       --session1 spot --session2 rpc\n\nWith the ESA La Crau sample (PAN band) and the additional option\n``--height-above-datum 200`` (given the validity range in the RPC model), the\npixel difference between exact and RPC models was max 0.002 pixels.\n\nThe camera centers computed by the two methods won't agree, because the RPC\ncamera model does not store the camera center. ASP then substitutes it with an\nestimated point on the ray from the camera center to the ground. This\ndisagreement is not an issue in practice.\n\nNote that SPOT 6/7 RPCs use 0-based pixel offsets, while Pleiades RPCs use\n1-based offsets. ASP handles both conventions automatically.\n"
  },
  {
    "path": "docs/examples/stereo_pairs.rst",
    "content": ".. _stereo_pairs:\n\nGuidelines for selecting stereo pairs\n-------------------------------------\n\nWhen choosing image pairs to process, images that are taken with\nsimilar lighting conditions and significant surface coverage overlap\nare best suited for creating terrain models\n:cite:`2015LPI462703B`. The images should have sufficient difference\nin perspective, hence a reasonably large baseline, or, equivalently, a\nnon-small convergence angle between the matching rays emanating from\nthe two cameras, for stereo triangulation to be accurate. Yet, if the\nperspectives are very different, it will be challenging to compute the\nstereo correlation between images. A convergence angle of 10 to 60\ndegrees is likely reasonable. \n\nDepending on the characteristics of the mission data set and the\nindividual images, the degree of acceptable variation will\ndiffer. Significant differences between image characteristics\nincreases the likelihood of stereo matching error and artifacts, and\nthese errors will propagate through to the resulting data products.\n\nThe ``parallel_stereo`` and ``bundle_adjust`` programs compute the convergence\nangle for input cameras. In stereo that happens at the preprocessing and\ntriangulation stages (:numref:`entrypoints`), with the result printed on the\nscreen and saved to the log files. In ``bundle_adjust`` this computation takes\nplace after the optimization of the cameras finishes, and the results are saved\nto a file on disk (:numref:`ba_out_files`). To find good stereo pairs, one can\nrun bundle adjustment on a large set of images and pick a pair with a decent\nconvergence angle.\n\nAlthough images do not need to be mapprojected before running the\n``parallel_stereo`` program, we recommend that you do run ``cam2map`` (or\n``cam2map4stereo.py``) beforehand, especially for image pairs that\ncontain large topographic variation (and therefore large disparity\ndifferences across the scene, e.g., Valles Marineris). mapprojection is\nespecially necessary when processing HiRISE images. This removes the\nlarge disparity differences between HiRISE images and leaves only the\nsmall detail for the Stereo Pipeline to compute. Remember that ISIS can\nwork backwards through a mapprojection when applying the camera model,\nso the geometric integrity of your images will not be sacrificed if you\nmapproject first.\n\nAn alternative way of mapprojection, that applies to non-ISIS images\nas well, is with the ``mapproject`` tool (:numref:`mapproj-example`).\n\nExcessively noisy images will not correlate well, so images should be\nphotometrically calibrated in whatever fashion suits your purposes. If\nthere are photometric problems with the images, those photometric\ndefects can be misinterpreted as topography.\n\nRemember, in order for ``parallel_stereo`` to process stereo pairs in\nISIS cube format, the images must have had SPICE data associated by\nrunning ISIS's ``spiceinit`` program run on them first.\n"
  },
  {
    "path": "docs/examples/umbra_sar.rst",
    "content": ".. _umbra_sar:\n\nUmbra SAR\n---------\n\nHere we describe processing Synthetic Aperture Radar (SAR) images for Earth\nproduced by `Umbra <https://help.umbra.space/product-guide>`_. A SAR example for\nthe Moon is in :numref:`csm_minirf`.\n\nOverview\n~~~~~~~~\n\nUmbra images are acquired in `Spotlight mode\n<https://help.umbra.space/product-guide/umbra-products>`_.\n\nSAR image appearance can vary drastically depending on the perspective. It is\nimportant to choose images that are acquired close in time and have similar\nviewing angles. The latter is measured by the provided incidence and azimuth\nangles. Another measure is the squint angle.\n\nIf the stereo convergence angle (:numref:`stereo_pairs`) is too small, the\nproduced terrain model may not be accurate. If it is too large, the images may\nbe too different, and processing may fail. For the example below, this angle is\n5.8 degrees (as printed by both ``parallel_stereo`` and ``bundle_adjust``). This\nangle correlates well with the larger of the discrepancy in azimuth and\nincidence angles between the images. We obtained acceptable results even with\nconvergence angles as low as 2.5 degrees.\n\nUmbra provides GEC images that are corrected to be relative to an ellipsoid. More\nraw products are available, including SICD, that have complex-valued pixels. \n\nGEC images come with RPC (:numref:`rpc`) camera models embedded in the images\nthat we employ. ASP does not support the more rigorous SAR sensor models.\n\n.. figure:: ../images/umbra_sar.png\n   :name: umbra_sar_fig\n\n   From left to right: hillshaded-terrain model, mapprojected\n   (:numref:`mapproject`) SAR image, and triangulation error image\n   (:numref:`triangulation_error`). The units in the colorbar on the right are\n   in meters.\n\nFetching the data\n~~~~~~~~~~~~~~~~~\n\nWe downloaded the image pair::\n\n  2024-02-01-03-28-13_UMBRA-06_GEC.tif\n  2024-04-03-14-53-17_UMBRA-04_GEC.tif\n\nshowing a portion of the Panama Canal. Many other `Umbra datasets\n<https://registry.opendata.aws/umbra-open-data/>`_ are available.\n\nTo make the notation shorter, we call these ``left.tif`` and ``right.tif``.\n\nMapprojection\n~~~~~~~~~~~~~\n\nIt is suggested to run bundle adjustment first (:numref:`bundle_adjust`), to\nmake the images more self-consistent and reduce the triangulation error\n(:numref:`triangulation_error`). For this data, bundle adjustment worked best\nafter mapprojecting the images.\n\nMapprojection should be done at the effective ground sample distance (GSD), not\nnominal GSD, which can be so fine that the images may be noisy at that level.\nHow to find the effective resolution may require some inspection and/or reading\nvendor's documentation.\n\nHow to find a DEM for mapprojection and how to adjust it to be relative to the\nellipsoid is described in :numref:`initial_terrain` and\n:numref:`conv_to_ellipsoid`. We call that DEM ``ref.tif``.\n\nSet the projection string. The UTM zone to use depends on the location of the\nimages.\n\n::\n\n    proj=\"+proj=utm +zone=17 +ellps=WGS84 +units=m +no_defs\"\n\nThe mapprojection (:numref:`mapproject`) step is as follows::\n\n    mapproject        \\\n      --tr 0.5        \\\n      --t_srs \"$proj\" \\\n      ref.tif         \\\n      left.tif        \\\n      left_proj.tif\n    \nand the same for the right image. \n\nIn the latest ASP, the projection string can be auto-determined\n(:numref:`mapproj_auto_proj`). See :numref:`mapproj_refmap` for how to transfer\nthe projection to the right image.\n\nIgnore any warnings about images already being mapprojected. The raw Umbra SAR\nimages do have some georeference information, but we will mapproject them in\neither case, as results are better that way.\n\nBundle adjustment\n~~~~~~~~~~~~~~~~~\n\nBundle adjustment (:numref:`bundle_adjust`) was run, while making use\nof the mapprojected images (:numref:`mapip`)::\n\n    bundle_adjust -t rpc                       \\\n      left.tif right.tif                       \\\n      --remove-outliers-params                 \\\n        \"75.0 3.0 50 50\"                       \\\n      --mapprojected-data                      \\\n        \"left_proj.tif right_proj.tif ref.tif\" \\\n      -o ba/run \n\nThe cameras are embedded in the images, so they are not specified separately.\n\nAlternatively, one can try the SIFT feature detection method\n(``--ip-detect-method 1``) rather than the default (method 0). One may also\nsearch for more interest point matches with an option such as ``--ip-per-tile``.\nSAR images can be noisy and features hard to find. More features may not always\nresult in more matches if they are inaccurate.\n\nHow to create new RPC cameras that incorporate the adjustments is discussed in\n:numref:`rpc_and_ba`. The default solution is to create external ``.adjust``\nfiles that are passed to ``parallel_stereo`` via ``--bundle-adjust-prefix``, as\nbelow.\n\nMore details on the ``bundle_adjust`` options are in :numref:`ba_options`.\n\nStereo processing\n~~~~~~~~~~~~~~~~~\n\nNext, ``parallel_stereo`` (:numref:`parallel_stereo`) was run. As before, it is\npreferred to work with mapprojected images (:numref:`mapproj-example`).\n\n::\n\n    parallel_stereo -t rpc          \\\n      --bundle-adjust-prefix ba/run \\\n      --stereo-algorithm asp_mgm    \\\n      --nodes-list machines.txt     \\\n      left_proj.tif right_proj.tif  \\\n      stereo/run                    \\\n      ref.tif \n\nThe ``asp_mgm`` algorithm worked much better than the default ``asp_bm``\n(:numref:`stereo_alg_overview`).\n\nIf this program fails to find interest points, the same suggestions as for \nbundle adjustment earlier apply.\n\nA terrain model was produced with ``point2dem`` (:numref:`point2dem`),\nin a local UTM projection (:numref:`point2dem_proj`)::\n\n    point2dem            \\\n      --auto-proj-center \\\n      --t_srs \"$proj\"    \\\n      --errorimage       \\\n      --tr 2.0           \\\n      stereo/run-PC.tif\n\nIt is suggested to compare the resulting terrain with the prior reference\nterrain in ``ref.tif``.\n\nCheck if the stereo convergence angle is reasonable, as mentioned earlier.\n\nAlignment\n~~~~~~~~~\n\nThe ASP-created DEM was aligned to the reference DEM with ``pc_align``\n(:numref:`pc_align`)::\n\n    pc_align                                  \\\n      --max-displacement 300                  \\\n      --save-inv-transformed-reference-points \\\n      stereo/run-DEM.tif ref.tif              \\\n      -o align/run\n\nA good value for the ``--max-displacement`` option is perhaps 1.5 times the mean\nelevation difference between the two input DEMs that can be found with\n``geodiff`` (:numref:`geodiff`)  and ``gdalinfo -stats``.\n\nThe transformed cloud can be gridded back to a DEM as::\n\n  point2dem --tr 2.0 \\\n    --t_srs \"$proj\"  \\\n    align/run-trans_reference.tif\n    \nHere, the projection string in ``$proj`` can be the same as for the DEM created earlier\n(the ``gdalinfo -proj4`` command invoked on that DEM can print it). \n\nThe ``geodiff`` program can take the difference of the now-aligned DEMs.\nOther inspections can be done as discussed in :numref:`visualizing_results`.\n\n.. _umbra_failure:\n\nHandling failure\n~~~~~~~~~~~~~~~~\n\nSAR images can be very hard to process, even when they look similar enough, due\nto noise and fine-level speckle.\n\nIf the suggestions from above about increasing the number of interest point matches\nin bundle adjustment and stereo do not work, consider trying a different stereo pair,\nwith a narrower stereo convergence angle, as this may result in more similar images.\n\nAlternatively, bundle adjustment can be skipped altogether. Then, ``parallel_stereo`` can be\ntried with the option ``--corr-seed-mode 2`` (:numref:`d_sub_dem`). In the latest\nbuild (:numref:`release`) this option can function without interest points.\n\nConsider increasing the correlation kernel size in ``parallel_stereo``\n(:numref:`corr_section`), with an option such as ``--corr-kernel 9 9``. The\ndefault is 5. The regular block matching algorithm (``asp_bm``,\n:numref:`stereo_alg_overview`) may also work better for very noisy images, as it\nhas a larger default kernel size.\n"
  },
  {
    "path": "docs/examples.rst",
    "content": ".. include:: <isonum.txt>\n\n.. _examples:\n\nStereo processing examples\n==========================\n\nThis chapter showcases examples of processing data sets acquired with specific\ninstruments. For a general introduction, see the tutorial (:numref:`tutorial`).\n\nStructure-from-Motion examples are in :numref:`sfm_toc` (for orbital images with no\nrig), and :numref:`rig_examples` (using a rig and robot images).\n\n.. toctree::\n\n   examples/stereo_pairs\n   examples/hirise\n   examples/ctx\n   examples/moc\n   examples/mer\n   examples/k10\n   examples/lronac\n   examples/change3\n   examples/apollo15\n   examples/hrsc\n   examples/cassini\n   examples/csm\n   examples/dawn\n   examples/kaguya\n   examples/chandrayaan2\n   examples/junocam\n   examples/isis_minirf\n   examples/pbs_slurm\n   examples/aster\n   examples/dg\n   examples/rpc\n   examples/perusat1\n   examples/pleiades\n   examples/spot5\n   examples/spot67\n   examples/skysat\n   examples/historical\n   examples/bathy\n   examples/umbra_sar\n\n.. _sfm_toc:\n\nSfM examples\n============\n\nThis chapter illustrates how to solve for cameras using Structure-from-Motion\n(SfM), how to register the cameras to the ground, followed by producing a\nterrain model.\n   \n.. toctree::\n   \n   sfm\n\n.. _rig_examples:\n\nSfM examples with a rig\n=======================\n\nThese examples shows how to solve for camera poses using\nStructure-from-Motion (SfM) and then create textured meshes. \n\nThe images are acquired using a rig mounted on a robot on the ISS\n(:numref:`rig_calibrator_example`, :numref:`sfm_iss`) and with the MSL\nCuriosity rover (:numref:`rig_msl`).\n\nSomewhat related examples, but without using a rig or the above\nworkflow, are in :numref:`sfm` (the images are acquired in orbit using\na satellite and a DEM is produced) and :numref:`mer-example` (a basic and\nrather old two-image example for the MER rovers). See also :numref:`csm_msl`\nfor an example using CSM cameras for the MSL rover, without employing SfM.\n\n.. toctree::\n\n   examples/rig\n   examples/sfm_iss\n   examples/msl\n   examples/orbital_rig\n   \nShape-from-Shading\n==================\n\n.. toctree::\n\n   sfs_usage\n   examples/sfs_earth\n   examples/sfs_ctx\n"
  },
  {
    "path": "docs/experimental.rst",
    "content": ".. _experimental:\n\nExperimental features\n=====================\n\n.. _casp_go:\n\nThe CASP-GO stereo processing system\n------------------------------------\n\nCASP-GO (Co-registered ASP using Gotcha Optimisation,\nhttps://github.com/mssl-imaging/CASP-GO) is a set of algorithms that\nare meant to augment certain parts of ASP :cite:`tao2016optimised,\ntao2018massive, shin2012progressively, otto1989region`. Thse algorithms were developed\nat the Imaging Group, Mullard Space Science Laboratory, University\nCollege London, by Yu Tao, under the direction of Jan-Peter Muller,\nwith funding from the EU-FP7 project titled \"iMars: Analysis of Mars\nMulti-Resolution Images using Auto-Coregistration, Data Mining and\nCrowd Sourcing Techniques\", under contract #607379.\n\nUnder NASA proposal 19-PDART19_2-0094 we researched incorporating\nthese algorithms into ASP.\n\nCASP-GO consists of three algorithms:\n\n- Gotcha disparity refinement. Its purpose is to fix artifacts in\n  ASP's older ``asp_bm`` block-matching algorithm\n  (:numref:`stereo_algos_full`) at the disparity\n  filtering stage. It takes as input and overwrites the ``F.tif``\n  disparity (which is described in :numref:`outputfiles`). \n  This algorithm definitely provides some in-filling functionality over\n  the older ``asp_bm`` performance, but users may want to experiment\n  with other ASP stereo algorithms (like MGM) which may also result in high\n  quality disparities.  This logic can be turned on with the \n  ``--gotcha-disparity-refinement`` option of\n  ``parallel_stereo``. See below for the parameters which control it.\n\n- Image alignment. This component uses feature detection to find\n  interest point matches among orthoimages associated with given DEMs,\n  which is then used to compute an alignment transform among the DEMs\n  :cite:`sidiropoulos2018automatic`. It was incorporated into ASP and\n  further extended as the ``image_align`` tool (:numref:`image_align`).\n\n- Kriging. This logic is meant to produce DEMs with\n  fewer holes than ASP's older method in ``point2dem`` (:numref:`point2dem`)\n  which used a Delaunay triangulation. It is based on a technique\n  called ``kriging``, which is a family of generalized linear least\n  square regression algorithms (:cite:`remy2002gstl`), implemented in\n  the ``Geostatistics Template Library`` (http://gstl.sourceforge.net/).\n\n  The CASP-GO DEM-creation algorithm functions along the same lines as ASP's\n  recent and default implementation in ``point2dem``. The input is a \n  point cloud, the output is a gridded DEM, and weighted averaging\n  is used to combine the 3D points to produce the DEM.\n\n  The only difference is that the recent ``point2dem`` implementation (circa 3.1.0)\n  computes the weights based on a Gaussian with given sigma and\n  neighborhood size, while CASP-GO uses weights produced by the kriging\n  procedure with a user-specified covariance.\n\n  CASP-GO's covariance function assigns the same covariance value to all \n  points, which results in the kriging procedure returning constant\n  weights. In effect, the resulting algorithm is a particular case of the\n  modern approach in ``point2dem``, when the sigma value is very large.\n\n  Thus, no separate implementation for kriging was implemented at this time.\n\n.. For that reason, while kriging seems to be a very interesting technique,\n   because CASP-GO did not implement a good covariance function, and since\n   it would be quite tricky to assign a nontrivial covariance to\n   points in a cloud, we chose to not incorporate this implementation,\n   as it does not add to the existing functionality.\n\nThe CASP-GO parameter file\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nCASP-GO's behavior is controlled by a parameter file, which ASP ships\nas ``share/CASP-GO_params.xml``, and which can be overridden\nwith the ``parallel_stereo`` option ``--casp-go-param-file``.\n\nOnly the parameters relevant for Gotcha disparity refinement are read\nfrom this file, as we did not implement the kriging algorithm,\nand the ``image_align`` tool we added has its own interface.\n\nHere are two sets of values for these parameters, optimized for CTX and\nHiRISE cameras, respectively.\n\nCTX::\n\n  ALSC iterations: 8\n  Max. eigenvalue: 150\n  ALSC kernel:     21\n  Grow neighbor:   8\n\nHiRISE::\n\n  ALSC iterations: 8\n  Max. eigenvalue: 80\n  ALSC kernel:     11\n  Grow neighbor:   8\n\n\n\n"
  },
  {
    "path": "docs/glossary.rst",
    "content": "Glossary\n========\n\n.. glossary::\n\n    ASP\n        Ames Stereo Pipeline\n\n    CTX\n        Context Camera\n\n    DEM\n        digital elevation model, synonym for DTM\n\n    DTM\n        digital terrain model, synonym for DEM\n\n    ET\n        ephemeris time\n\n    GCP\n        ground control point (:numref:`bagcp`)\n\n    HRSC\n        High Resolution Stereo Camera\n\n    HiRISE\n        High Resolution Imaging Science Experiment\n\n    IRG\n        Intelligent Robotics Group\n\n    ISIS\n        `Integrated Software for Imagers and Spectrometers <https://isis.astrogeology.usgs.gov>`_\n\n    KML\n        Keyhole Markup Language\n\n    LROC\n        Lunar Reconnaissance Orbiter Camera\n\n    LRO\n        Lunar Reconnaissance Orbiter\n\n    LOLA\n        Lunar Orbiter Laser Altimeter\n\n    MER\n        Mars Exploration Rover\n\n    MGS\n        Mars Global Surveyor\n\n    MOC\n        Mars Orbiter Camera\n\n    MOLA\n        Mars Orbiter Laser Altimeter\n\n    MRO\n        Mars Reconnaissance Orbiter\n\n    MPL\n        Mars Polar Lander\n\n    NED\n        National Elevation Dataset\n\n    NASA\n        National Aeronautics and Space Administration\n\n    PDS\n        Planetary Data System\n\n    PVL\n        Parameter Value Language\n\n    THEMIS\n        Thermal Emission Imaging System\n\n    ULCN\n        Unified Lunar Coordinate Network\n\n    USGS\n        United States Geological Survey\n\n    VW\n        Vision Workbench\n"
  },
  {
    "path": "docs/index.rst",
    "content": ".. Ames Stereo Pipeline documentation master file.\n\nAmes Stereo Pipeline documentation (version |version|)\n======================================================\n\n.. toctree::\n   :maxdepth: 2\n   :numbered:\n\n   introduction\n   installation\n   tutorial\n   next_steps\n   tips_tricks\n   examples\n   bundle_adjustment\n   error_propagation\n   correlation\n   experimental\n   tools\n   stereodefault\n   stereo_algorithms \n   outputfiles\n   pinholemodels\n   bathy_water_masking\n   papersusingasp\n   news\n   contributing\n   building_asp\n   thirdparty\n   acknowledgements\n   glossary\n   zzreferences\n   \n.. only:: html\n\n   Indices and tables\n   ==================\n   \n   * :ref:`genindex`\n   * :ref:`search`\n"
  },
  {
    "path": "docs/installation.rst",
    "content": ".. _installation:\n\n.. include:: ../INSTALLGUIDE.rst\n\n.. _vwrc:\n\nSettings optimization\n---------------------\n\nFinally, the last thing to be done for Stereo Pipeline is to setup up\nVision Workbench's render and logging settings. This step is optional,\nbut for best performance some thought should be applied here.\n\nVision Workbench is a multi-threaded image processing library used by\nStereo Pipeline. The settings by which Vision Workbench processes data\nare configurable by having a ``.vwrc`` file hidden in your home directory.\nBelow is an example::\n\n  # This is an example VW configuration file. Save this file to\n  # ~/.vwrc to adjust the VW log settings, even if the program is\n  #already running.\n\n  # General settings\n  [general]\n  default_num_threads = 16\n  write_pool_size = 40\n  system_cache_size = 1073741824 # ~ 1 GB\n  \n  # The following integers are associated with the log levels\n  # throughout the Vision Workbench.  Use these in the log rules\n  # below.\n  #\n  #    ErrorMessage = 0\n  #    WarningMessage = 10\n  #    InfoMessage = 20\n  #    DebugMessage = 30\n  #    VerboseDebugMessage = 40\n  #    EveryMessage = 100\n  #\n  # You can create a new log file or adjust the settings \n  # for the console log:\n  #   logfile <filename> \n  #       - or -\n  #   logfile console\n  \n  # Once you have created a logfile (or selected the console), you\n  # can add log rules using the following syntax. (Note that you\n  # can use wildcard characters '*' to catch all log_levels for a\n  # given log_namespace, or vice versa.)\n  \n  # <log_level> <log_namespace>\n  \n  # Below are examples of using the log settings.\n  \n  # Turn on various logging levels for several subsystems, with\n  # the output going to the console (standard output).\n  [logfile console]\n  # Turn on error and warning messages for the thread subsystem.\n  10 = thread\n  # Turn on error, warning, and info messages for the \n  # asp subsystem.\n  20 = asp\n  # Turn on error, warning, info, and debug messages for the \n  # stereo subsystem.\n  30 = stereo\n  # Turn on every single message for the cache subsystem (this will\n  # be extremely verbose and is not recommended).\n  # 100 = cache\n  # Turn off all progress bars to the console (not recommended).\n  # 0 = *.progress\n  \n  # Turn on logging of error and warning messages to a file for the\n  # stereo subsystem. Warning: This file will be always appended\n  # to, so it should be deleted periodically.\n  # [logfile /tmp/vw_log.txt]\n  # 10 = stereo\n\nThere are a lot of possible options that can be implemented in the above\nexample. Let's cover the most important options and the concerns the\nuser should have when selecting a value.\n\nPerformance settings\n~~~~~~~~~~~~~~~~~~~~\n\n``default_num_threads`` (default=2)\n   This sets the maximum number of threads that can be used for\n   rendering. When stereo's ``subpixel_rfne`` is running you'll\n   probably notice 10 threads are running when you have\n   ``default_num_threads`` set to 8. This is not an error, you are\n   seeing 8 threads being used for rendering, 1 thread for holding\n   ``main()``'s execution, and finally 1 optional thread acting as\n   the interface to the file driver.\n\n   It is usually best to set this parameter equal to the number of\n   processors on your system. Be sure to include the number of logical\n   processors in your arithmetic if your system supports\n   hyper-threading. Adding more threads for rasterization increases the\n   memory demands of Stereo Pipeline. If your system is memory limited,\n   it might be best to lower the ``default_num_threads`` option.\n\n``write_pool_size`` (default=21)\n   The ``write_pool_size`` option represents the max waiting pool size\n   of tiles waiting to be written to disk. Most file formats do not\n   allow tiles to be written arbitrarily out of order. Most however\n   will let rows of tiles to be written out of order, while tiles\n   inside a row must be written in order. Because of the previous\n   constraint, after a tile is rasterized it might spend some time\n   waiting in the write pool before it can be written to disk. If\n   the write pool fills up, only the next tile in order can be\n   rasterized. That makes Stereo Pipeline perform like it is only\n   using a single processor.\n\n   Increasing the ``write_pool_size`` makes Stereo Pipeline more able to\n   use all processing cores in the system. Having this value too large\n   can mean excessive use of memory as it must keep more portions of the\n   image around in memory while they wait to be written. This number\n   should be larger than the number of threads, perhaps by about 20.\n\n``system_cache_size`` (default=1073741824)\n   Accessing a file from the hard drive can be very slow. It is\n   especially bad if an application needs to make multiple passes over\n   an input file. To increase performance, Vision Workbench will\n   usually leave an input file stored in memory for quick access. This\n   file storage is known as the 'system cache' and its max size is\n   dictated by ``system_cache_size``. The default value is 1 GB.\n\n   Setting this value too high can cause your application to crash. It\n   is usually recommend to keep this value around 1/4 of the maximum\n   available memory on the system. The units of this property is in\n   bytes.\n\n   All tools shipped with ASP have the option ``--cache-size-mb`` to\n   override the value of ``system_cache_size``. Its default value is\n   1024 MB (1 GB).\n \n   The recommendations for these values are based on use of the block\n   matching algorithm in ASP. When using memory intensive algorithms\n   such as SGM you may wish to lower some of these values (such as the\n   cache size) to leave more memory available for the algorithm to use.\n\n.. _logging:\n\nLogging settings\n~~~~~~~~~~~~~~~~\n\nThe messages displayed in the console by Stereo Pipeline are grouped\ninto several namespaces, and by level of verbosity. An example of\ncustomizing Stereo Pipeline's output is given in the ``.vwrc`` file\nshown above.\n\nSeveral of the tools in Stereo Pipeline, including ``parallel_stereo``,\nautomatically append the information displayed in the console to a log\nfile in the current output directory. These logs contain in addition\nsome data about your system and settings, which may be helpful in\nresolving problems with the tools (:numref:`outputfiles`).\n\nIt is also possible to specify a global log file to which all tools will\nappend to, as illustrated in ``.vwrc``.\n"
  },
  {
    "path": "docs/introduction.rst",
    "content": "Introduction\n============\n\nThe NASA Ames Stereo Pipeline (ASP) is a suite of free and open source automated\ngeodesy and stereogrammetry tools designed for processing images captured from\nsatellites, around Earth and other planets (:numref:`examples`), robotic rovers\n(:numref:`rig_msl`, :numref:`csm_msl`), aerial cameras and low-cost satellites\n(:numref:`skysat`), historical images (:numref:`kh4`), with and without accurate\ncamera pose information.\n\nIt has functionality for 3D terrain creation from stereo (:numref:`tutorial`),\nalignment of point clouds (:numref:`pc_align`), structure-from-motion\n(:numref:`sfm`), shape-from-shading (:numref:`sfs_usage`), bundle adjustment\n(:numref:`bundle_adjust`), solving for jitter (:numref:`jitter_solve`), rig\ncalibration (:numref:`rig_calibrator`), refining camera intrinsics\n(:numref:`floatingintrinsics`), GCP generation (:numref:`gcp_gen`,\n:numref:`dem2gcp`), and a versatile GUI shell (:numref:`stereo_gui`).\n\nASP produces cartographic products, including digital terrain models (DTMs) and\northo-projected images (:numref:`builddem`), 3D models (:numref:`point2mesh`),\ntextured meshes (:numref:`sfm_iss`), and bundle-adjusted networks of cameras\n(:numref:`control_network`).\n\nASP's data products are suitable for science analysis, mission planning, and\npublic outreach.\n\n.. figure:: images/introduction/p19view2_400px.png\n   :alt: 3D model of Mars\n\n   This 3D model was generated from a image pair M01/00115 and E02/01461\n   (34.66N, 141.29E). The complete stereo reconstruction process takes\n   approximately thirty minutes on a 3.0 GHz workstation for input\n   images of this size (1024 |times| 8064 pixels). This model,\n   shown here without vertical exaggeration, is roughly 2 km wide in the\n   cross-track dimension. \n\nBackground\n----------\n\nThe Intelligent Robotics Group (IRG) at the NASA Ames Research\nCenter has been developing 3D surface reconstruction and visualization\ncapabilities for planetary exploration for more than a decade. First\ndemonstrated during the Mars Pathfinder Mission, the IRG has delivered\ntools providing these capabilities to the science operations teams\nof the :term:`MPL` mission, the :term:`MER` mission, the :term:`MRO`\nmission, and the :term:`LRO` mission. A critical component technology\nenabling this work is the ASP. The Stereo Pipeline generates high\nquality, dense, texture-mapped 3D surface models from stereo image\npairs. In addition, ASP provides tools to perform many other\ncartography tasks including map projection, point cloud and DEM\nregistration, automatic registration of cameras, data format\nconversion, and data visualization.\n\nAlthough initially developed for ground control and scientific\nvisualization applications, the Stereo Pipeline has evolved to address\norbital stereogrammetry and cartographic applications. In particular,\nlong-range mission planning requires detailed knowledge of planetary\ntopography, and high resolution topography is often derived from stereo\npairs captured from orbit. Orbital mapping satellites are sent as\nprecursors to planetary bodies in advance of landers and rovers. They\nreturn a wealth of images and other data that helps mission planners and\nscientists identify areas worthy of more detailed study. Topographic\ninformation often plays a central role in this planning and analysis\nprocess.\n\nOur recent development of the Stereo Pipeline coincides with a\nperiod of time when NASA orbital mapping missions are returning\norders of magnitude more data than ever before. Data volumes from\nthe Mars and Lunar Reconnaissance Orbiter missions now measure in\nthe tens of terabytes.  There is growing consensus that existing\nprocessing techniques, which are still extremely human intensive\nand expensive, are no longer adequate to address the data processing\nneeds of NASA and the Planetary Science community. To pick an example\nof particular relevance, the :term:`HiRISE` instrument has captured\na few thousand stereo pairs. Of these, only about two hundred stereo\npairs have been processed to date; mostly on human-operated, high-end\nphotogrammetric workstations. It is clear that much more value could\nbe extracted from this valuable raw data if a more streamlined,\nefficient process could be developed.\n\nThe Stereo Pipeline was designed to address this very need. By applying\nrecent advances in computer vision, we have created an *automated*\nprocess that is capable of generating high quality DTMs with minimal human\nintervention. Users of the Stereo Pipeline can expect to spend some time\npicking a handful of settings when they first start processing a new\ntype of image, but once this is done, the Stereo Pipeline can be used to\nprocess tens, hundreds, or even thousands of stereo pairs without\nfurther adjustment. With the release of this software, we hope to\nencourage the adoption of this tool chain at institutions that run and\nsupport these remote sensing missions. Over time, we hope to see this\ntool incorporated into ground data processing systems alongside other\nautomated image processing pipelines. As this tool continues to mature,\nwe believe that it will be capable of producing digital elevation models\nof exceptional quality without any human intervention.\n\nHuman vs. Computer: When to Choose Automation?\n----------------------------------------------\n\nWhen is it appropriate to choose automated stereo mapping over the use\nof a conventional, human-operated photogrammetric workstation? This is a\nphilosophical question with an answer that is likely to evolve over the\ncoming years as automated data processing technologies become more\nrobust and widely adopted. For now, our opinion is that you should\n*always* rely on human-guided, manual data processing techniques for\nproducing mission critical data products for missions where human lives\nor considerable capital resources are at risk. In particular, maps for\nlanding site analysis and precision landing absolutely require the\nbenefit of an expert human operator to eliminate obvious errors in the\nDEMs, and also to guarantee that the proper procedures have been\nfollowed to correct satellite telemetry errors so that the data have the\nbest possible geodetic control.\n\nWhen it comes to using DTMs for scientific analysis, both techniques have\ntheir merits. Human-guided stereo reconstruction produces DTMs of\nunparalleled quality that benefit from the intuition and experience of\nan expert. The process of building and validating these DTMs is\nwell-established and accepted in the scientific community.\n\nHowever, only a limited number of DTMs can be processed to this level of\nquality. For the rest, automated stereo processing can be used to\nproduce DTMs at a fraction of the cost. The results are not necessarily less\naccurate than those produced by the human operator, but they will not\nbenefit from the same level of scrutiny and quality control. As such,\nusers of these DTMs must be able to identify potential issues, and be on the\nlookout for errors that may result from the improper use of these tools.\n\nWe recommend that all users of the Stereo Pipeline take the time to\nthoroughly read this documentation and build an understanding of how\nstereo reconstruction and bundle adjustment can be best used together to\nproduce high quality results. You are welcome to contact us if you have\nany questions (:numref:`get-help`).\n\nSoftware foundations\n--------------------\n\nNASA Vision Workbench\n~~~~~~~~~~~~~~~~~~~~~\n\nThe Stereo Pipeline is built upon the Vision Workbench software which is\na general purpose image processing and computer vision library also\ndeveloped by the IRG. Some of the tools discussed in this document are\nactually Vision Workbench programs, and any distribution of the Stereo\nPipeline requires the Vision Workbench. This distinction is important\nonly if compiling this software.\n\nThe USGS Integrated Software for Imagers and Spectrometers\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nFor processing non-terrestrial NASA satellite images, Stereo Pipeline\nmust be installed alongside a copy of the Integrated Software for\nImagers and Spectrometers (:term:`ISIS`). ISIS is however not required for\nprocessing terrestrial images (DigitalGlobe/Maxar WorldView, etc.).\n\nISIS is widely used in the planetary science community for processing raw\nspacecraft images into high level data products of scientific interest\nsuch as map-projected and mosaicked images\n:cite:`2004LPI.35.2039A,1997LPI.28.387G,ISIS_website`.\nWe chose ISIS because (1) it is widely adopted by the planetary science\ncommunity, (2) it contains the authoritative collection of geometric\ncamera models for planetary remote sensing instruments, and (3) it is\nopen source software that is easy to leverage.\n\nBy installing the Stereo Pipeline, you will be adding an advanced stereo\nimage processing capability that can be used in your existing ISIS workflow.\nThe Stereo Pipeline supports the ISIS cube (``.cub``) file format, and can\nmake use of the camera models and ancillary information (i.e. SPICE\nkernels) for imagers on many NASA spacecraft. The use of this single\nstandardized set of camera models ensures consistency between products\ngenerated in the Stereo Pipeline and those generated by ISIS. Also by\nleveraging ISIS camera models, the Stereo Pipeline can process stereo pairs\ncaptured by just about any NASA mission.\n\n.. _get-help:\n\nGetting help and reporting bugs\n-------------------------------\n\nAll bugs, feature requests, and general discussion should be posted on\nthe ASP support forum:\n\n    https://groups.google.com/forum/#!forum/ames-stereo-pipeline-support\n\nTo contact the developers and project manager directly, send an email\nto:\n\n    stereo-pipeline-owner@lists.nasa.gov\n\nWhen you submit a bug report, it may be helpful to attach the logs\noutput by ``parallel_stereo`` and other tools (:numref:`logging`).\n\nTypographical conventions\n-------------------------\n\nNames of programs that are meant to be run on the command line are\nwritten in a constant-width font, like the ``parallel_stereo`` program, as are\noptions to those programs.\n\nAn indented line of constant-width text can be typed into your terminal,\nthese lines will either begin with a '``>``' to denote a regular shell,\nor with '``ISIS>``' which denotes an ISIS-enabled shell (which means you have\nto set the ``ISISROOT`` environment variable and have sourced the appropriate\nISIS startup script, as detailed in the ISIS instructions).\n\n::\n\n    > ls\n\n    ISIS> pds2isis\n\nConstant-width text enclosed in greater-than and less-than brackets denotes an \noption or argument that a user will need to supply. For example,\n'``stereo E0201461.map.cub M0100115.map.cub out``' is specific, but\n'``stereo <left-image> <right-image> out``' indicates that ``<left-image>``\nand ``<right-image>`` are not the names of specific files, but dummy\nparameters which need to be replaced with actual file names.\n\nSquare brackets denote optional options or values to a command, and\nitems separated by a vertical bar are either aliases for each other, or\ndifferent, specific options.  Default arguments or other notes are\nenclosed by parentheses, and line continuation with a backslash::\n\n    point2dem [-h|--help] [-r moon|mars] [-s <float(default: 0.0)>] \\\n              [-o <output prefix>] <output prefix>-PC.tif\n\nThe above indicates a run of the ``point2dem`` program. The only\nargument that it requires is a point cloud file, which is produced by\nthe ``parallel_stereo`` program and ends in ``-PC.tif``, although its prefix\ncould be anything (hence the greater-than and less-than enclosing brackets).\nEverything else is in square brackets indicating that they are optional.\n\nHere, ``--help`` and ``-h`` refer to the same thing. Similarly, the\nargument to the ``-r`` option must be either ``moon`` or ``mars``. The\n``-s`` option takes a floating point value as its argument, and has a\ndefault value of zero. The ``-o`` option takes a filename that will be\nused as the output DTM.\n\nAlthough there are two lines of constant-width text, the backslash at\nthe end of the first line indicates that the command continues on the\nsecond line. You can either type everything into one long line on your\nown terminal, or use the backslash character and a return to continue\ntyping on a second line in your terminal.\n\nCiting the Ames Stereo Pipeline in your work\n--------------------------------------------\n\nIn general, use this reference:\n\n  Beyer, Ross A., Oleg Alexandrov, and Scott McMichael. 2018. The Ames\n  Stereo Pipeline: NASA's open source software for deriving and processing\n  terrain data. *Earth and Space Science*, **5**.\n  https://doi.org/10.1029/2018EA000409.\n\nIf you are using ASP for application to Earth images, or need a\nreference which details the quality of output, then we suggest also\nreferencing:\n\n  Shean, D. E., O. Alexandrov, Z. Moratto, B. E. Smith, I. R. Joughin, C.\n  C. Porter, Morin, P. J. 2016. An automated, open-source pipeline for\n  mass production of digital elevation models (DEMs) from very\n  high-resolution commercial stereo satellite imagery. *ISPRS Journal of\n  Photogrammetry and Remote Sensing.* **116**.\n\nIn addition to using the references above, in order to help you better\ncite the specific version of ASP that you are using in a work, as of ASP\nversion 2.6.0, we have started using `Zenodo <https://zenodo.org>`__ to\ncreate digital object identifiers (DOIs) for each ASP release. For\nexample, the DOI for version 2.6.2 is 10.5281/zenodo.3247734, and you\ncan cite it like this:\n\n  Beyer, Ross A., Oleg Alexandrov, and Scott McMichael. 2019.\n  NeoGeographyToolkit/StereoPipeline: Ames Stereo Pipeline version 2.6.2.\n  *Zenodo*. `DOI:\n  10.5281/zenodo.3247734 <https://doi.org/10.5281/zenodo.3247734>`__.\n\nOf course, every new release of ASP will have its own unique DOI, and\nthis link should always point to the `latest\nDOI <https://doi.org/10.5281/zenodo.598174>`__ for ASP.\n\nIf you publish a paper using ASP, please let us know. We'll cite your\nwork in this document, in :numref:`papersusingasp`.\n\n\nWarnings to users of the Ames Stereo Pipeline\n---------------------------------------------\n\nAmes Stereo Pipeline is a **research** product. There may be bugs or\nincomplete features. We reserve the ability to change the API and\ncommand line options of the tools we provide. Although we hope you\nwill find this release helpful, you use it at your own risk.\n\nWhile we are confident that the algorithms used by this software are\nrobust, the Ames Stereo Pipeline has a lot of adjustable parameters, and\neven experienced operators can produce poor results. We *strongly\nrecommend* that if you have any concerns about the products that you (or\nothers) create with this software, please just get in contact with us.\nWe can help you figure out either how to make the product better, or\nhelp you accurately describe the limitations of the data or the data\nproducts, so that you can use it to confidently make new and wonderful\ndiscoveries.\n\nPlease check each release's NEWS file (:numref:`news`) to see a summary of\nour recent changes.\n\n.. |times| unicode:: U+00D7 .. MULTIPLICATION SIGN\n"
  },
  {
    "path": "docs/news.rst",
    "content": ".. _news:\n\nNews and development history\n============================\n\n.. include:: ../NEWS.rst\n"
  },
  {
    "path": "docs/next_steps.rst",
    "content": ".. _nextsteps:\n\nThe next steps\n==============\n\nThis chapter will discuss in more detail ASP's stereo process and\nother tools available to either pre-process the input images/cameras\nor to manipulate ``parallel_stereo``'s outputs, both in the context of\nplanetary ISIS data and for Earth images. This includes how to\ncustomize ``parallel_stereo``'s settings (:numref:`running-stereo`),\nuse ``point2dem`` to create 3D terrain models (:numref:`manipulating_results`),\nvisualize the results (:numref:`genhillshade`).\n\nOther topics include bundle adjustment (:numref:`next_steps_ba`), align the\nobtained point clouds to another data source (:numref:`pc-align-example`),\nperform 3D terrain adjustments in respect to a geoid (:numref:`geoid_adj`),\nconverted to LAS (:numref:`gen_las`), etc.\n\nIt is suggested to read the tutorial (:numref:`tutorial`) before\nthis chapter.\n\n.. _running-stereo:\n\nStereo Pipeline in more detail\n------------------------------\n\n.. _stereo_alg_overview:\n\nChoice of stereo algorithm\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. figure:: images/stereo_algos.png\n   :name: stereo_alg_fig\n\n   A DEM produced (from top-left) with the ``asp_bm``, ``asp_mgm``,\n   ``libelas``, and ``opencv_sgbm`` stereo algorithms. The ``libelas``\n   algorithm is rather fast and the results are of good quality.\n   No mapprojection (:numref:`mapproj-example`) was used here.\n\nThe most important choice a user has to make when running ASP is the \nstereo algorithm to use. By default, ASP runs as if invoked with::\n\n   parallel_stereo --alignment-method affineepipolar  \\\n     --stereo-algorithm asp_bm --subpixel-mode 1      \\\n     <other options>\n    \nThis invokes block-matching stereo with parabola subpixel mode, which\ncan be fast but not of high quality. Much better results are likely\nproduced with::\n\n   parallel_stereo                     \\\n     --alignment-method affineepipolar \\\n     --stereo-algorithm asp_mgm        \\\n     --subpixel-mode 9                 \\\n     <other options>\n\nwhich uses ASP's implementation of MGM (:numref:`asp_sgm`). Using\n``--subpixel-mode 3`` will likely further improve the results, but\nwill be slower. For best results one can use ``--subpixel-mode 2``,\nbut that is very slow. Do not use ``--subpixel-mode 1`` with\n``asp_mgm``/``asp_sgm`` as that produces artifacts. See\n:numref:`subpixel` for more background on some subpixel modes.\n\nFor steep terrains *it is strongly suggested to mapproject the images*\n(:numref:`mapproj-example`).\n\nASP also implements *local alignment*, when the input images are split\ninto tiles (with overlap) and locally aligned. This makes it possible\nto use third-party algorithms in addition to the ones ASP implements. \n\nWith ASP's own MGM algorithm, local alignment can be invoked as::\n\n   parallel_stereo                     \\\n     --alignment-method local_epipolar \\\n     --stereo-algorithm asp_mgm        \\\n     --subpixel-mode 9                 \\\n     <other options>\n\nASP also ships with the following third-party stereo algorithms:\nMGM (original author implementation), OpenCV SGBM, Libelas, MSMW,\nMSMW2, and OpenCV BM. For more details see :numref:`stereo_algos`.\n\nFor example, the rather solid and reasonably fast Libelas\nimplementation can be called as::\n\n   parallel_stereo                     \\\n     --alignment-method local_epipolar \\\n     --stereo-algorithm libelas        \\\n     --job-size-h 512 --job-size-w 512 \\\n     --sgm-collar-size 128             \\\n     <other options>\n\nAbove we used tiles of size 512 pixels with an extra padding of 128 pixels on\neach side, for a total size of 768 pixels. Smaller tiles are easier to align\naccurately, and also use less memory. The defaults in ``parallel_stereo`` are\ndouble these values, which work well with ASP's MGM which is more conservative\nwith its use of memory but can be too much for some other implementations.\n\nIt is suggested to not specify here ``--subpixel-mode``, in which case\nit will use each algorithm's own subpixel implementation. Using\n``--subpixel-mode 3`` will refine that result using ASP's subpixel\nimplementation. Using ``--subpixel-mode 2`` will be much slower but\nlikely produce even better results.\n\nNext we will discuss more advanced parameters which rarely need to be\nset in practice.\n\n.. _settingoptionsinstereodefault:\n\nSetting options in the ``stereo.default`` file\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe ``parallel_stereo`` program can use a ``stereo.default`` file that\ncontains settings that affect the stereo reconstruction process.  Its\ncontents can be altered for your needs; details are found in\n:numref:`stereodefault`. You may find it useful to save multiple\nversions of the ``stereo.default`` file for various processing\nneeds. If you do this, be sure to specify the desired settings file by\ninvoking ``parallel_stereo`` with the ``-s`` option. If this option is\nnot given, the ``parallel_stereo`` program will search for a file\nnamed ``stereo.default`` in the current working directory. If\n``parallel_stereo`` does not find ``stereo.default`` in the current\nworking directory and no file was given with the ``-s`` option,\n``parallel_stereo`` will assume default settings and continue.\n\nAn example ``stereo.default`` file is available in the top-level\ndirectory of ASP. The actual file has a lot of comments to show you\nwhat options and values are possible. Here is a trimmed version of the\nimportant values in that file.\n\n::\n\n    alignment-method affineepipolar\n    stereo-algorithm asp_bm \n    cost-mode 2\n    corr-kernel 21 21\n    subpixel-mode 1\n    subpixel-kernel 21 21\n\nFor the ``asp_sgm`` and ``asp_mgm`` algorithms, the default correlation\nkernel size is 5 x 5 rather than 21 x 21.\n\nNote that the ``corr-kernel`` option does not apply to the external\nalgorithms.  Instead, each algorithm has its own options that need to\nbe set (:numref:`stereo_algos`).\n\nAll these options can be overridden from the command line, as described\nin :numref:`cmdline`.\n\nAlignment method\n^^^^^^^^^^^^^^^^\n\nFor raw images, alignment is always necessary, as the left and right\nimages are from different perspectives.  Several alignment methods are\nsupported, including ``local_epipolar``, ``affineepipolar`` and\n``homography`` (see :numref:`image_alignment` for details).\n\nAlternatively, stereo can be performed with mapprojected images\n(:numref:`mapproj-example`). In effect we take a smooth\nlow-resolution terrain and map both the left and right raw images onto\nthat terrain. This automatically brings both images into the same\nperspective, and as such, for mapprojected images the alignment method\nis always set to ``none``.\n\n.. _stereo_algos:\n\nStereo algorithms\n^^^^^^^^^^^^^^^^^\n\nASP can invoke several algorithms for doing stereo, some internally\nimplemented, some collected from the community, and the user can add\ntheir own algorithms as well (:numref:`adding_algos`).\n\nThe list of algorithms is as follows. (See :numref:`stereo_algos_full`\nfor a full discussion.) \n\n**Algorithms implemented in ASP**\n\nasp_bm (or specify the value '0')\n   The ASP implementation of Block Matching. Search in the\n   right image for the best match for a small image block in the\n   left image. This is the fastest algorithm and works well for\n   similar images with good texture coverage. How to set the block\n   (kernel) size and subpixel mode is described further down.\n   See also :numref:`asp_sgm`.\n\nasp_sgm (or specify the value '1')\n   The ASP implementation of the Semi-Global Matching (SGM)\n   algorithm :cite:`hirschmuller_sgm_original`. This algorithm is\n   slow and has high memory requirements but it performs better in\n   images with less texture. See :numref:`asp_sgm` for important\n   details on using this algorithm.\n\nasp_mgm (or specify the value '2')\n   The ASP implementation of the More Global Matching (MGM)\n   variant of the SGM algorithm :cite:`facciolo2015mgm` to reduce\n   high frequency artifacts in the output image at the cost of\n   increased run time. See :numref:`asp_sgm` for important details on\n   using this algorithm.\n\nasp_final_mgm (or specify the value '3')\n   Use MGM on the final resolution level and SGM on preceding\n   resolution levels. This produces a result somewhere in between\n   the pure SGM and MGM options.\n\n**External implementations (shipped with ASP)**\n\nmgm\n   The MGM implementation by its authors. See :numref:`original_mgm`.\n\nopencv_sgbm\n   Semi-global block-matching algorithm from OpenCV 3. See\n   :numref:`opencv_sgbm_options`.\n\nlibelas\n   The LIBELAS algorithm :cite:`Geiger2010ACCV`. See\n   :numref:`libelas`.\n\nmsmw and msmw2\n   Multi-Scale Multi-Window algorithm (two versions provided). See\n   :numref:`msmw`.\n\nopencv_bm\n   Classical block-matching algorithm from OpenCV 3. See\n   :numref:`opencv_bm`.\n\nCorrelation parameters\n^^^^^^^^^^^^^^^^^^^^^^\n\nThe option ``corr-kernel`` in ``stereo.default`` define what\ncorrelation metric *(normalized cross correlation)* we'll be using and\nhow big the template or kernel size should be *(21 pixels square)*. A\npixel in the left image will be matched to a pixel in the right image\nby comparing the windows of this size centered at them.\n\nMaking the kernel sizes smaller, such as 15 |times| 15, or even\n11 |times| 11, may improve results on more complex features, such as steep\ncliffs, at the expense of perhaps introducing more false matches or\nnoise.\n\nThese options only to the algorithms implemented in ASP (those whose\nname is prefixed with ``asp_``). For externally implemented\nalgorithms, any options to them can be passed as part of the\n``stereo-algorithm`` field, as discussed in\n:numref:`stereo_algos_full`.\n\nSubpixel refinement parameters\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nA highly critical parameter in ASP is the value of\n``subpixel-mode``. When set to 1, ``parallel_stereo`` performs\nparabola subpixel refinement, which is very fast but not very\naccurate. When set to 2, it produces very accurate results, but it is\nabout an order of magnitude slower. When set to 3, the accuracy and\nspeed will be somewhere in between the other methods.\n\nFor the algorithms not implemented in ASP itself, not specifying this\nfield will result in each algorithm using its own subpixel mode.\n\nThe option ``subpixel-kernel`` sets the kernel size to use during\nsubpixel refinement *(also 21 pixels square)*.\n\n.. _search_range2:\n\nSearch range determination\n^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nASP will attempt to work out the minimum and maximum disparity it will search\nfor automatically. The search range can be explicitly set with a command-line\noption such as::\n\n    --corr-search -80 -2 20 2\n\nThese four integers define the minimum horizontal and vertical disparity and\nthen the maximum horizontal and vertical disparity (:numref:`corr_section`).\n\nThe search range can be tightened with the option ``--max-disp-spread``\nbefore full-image resolution happens.\n\nIt is suggested that these settings be used only if the run-time is\nhigh or the inputs are difficult. For more details see\n:numref:`search_range`. The inner working of stereo correlation can be\nfound in :numref:`correlation`.\n\n.. _perform-stereo:\n\nPerforming stereo correlation\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. figure:: images/p19-stereo-output_400px.png\n   :name: p19-stereo-output\n   :alt:  Outputs of the ``parallel_stereo`` program.\n\n   These are the four viewable ``.tif`` files\n   created by the ``parallel_stereo`` program. On the left are the two aligned,\n   pre-processed images: (``results/output-L.tif`` and\n   ``results/output-R.tif``). The next two are mask images\n   (``results/output-lMask.tif`` and ``results/output-rMask.tif``),\n   which indicate which pixels in the aligned images are good to use in\n   stereo correlation. The image on the right is the \"Good Pixel map\",\n   (``results/output-GoodPixelMap.tif``), which indicates (in gray)\n   which were successfully matched with the correlator, and (in red)\n   those that were not matched.\n\nAs already mentioned, the ``parallel_stereo`` program can be invoked for ISIS\nimages as::\n\n     ISIS> parallel_stereo left_image.cub right_image.cub \\\n               -s stereo.default results/output\n\nFor DigitalGlobe/Maxar images the cameras need to be specified separately::\n\n    parallel_stereo left.tif right.tif left.xml right.xml \\\n      -s stereo.default results/output\n\nThe string ``results/output`` is arbitrary, and in this case we will\nsimply make all outputs go to the ``results`` directory.\n\nWhen ``parallel_stereo`` finishes, it will have produced a point cloud image.\n:numref:`manipulating_results` describes how to convert it to a digital\nelevation model (DEM) or other formats.\n\nThe ``parallel_stereo`` program can be used purely for computing the\ncorrelation (disparity) of two images, without cameras\n(:numref:`correlator-mode`). \n\nThe quality of correlation can be evaluated with the ``corr_eval``\nprogram (:numref:`corr_eval`).\n\nThe ``parallel_stereo`` command can also take multiple input images,\nperforming multi-view stereo (:numref:`multiview`), though this\napproach is rather discouraged as better results can be obtained with\nbundle adjustment followed by pairwise stereo and merging of DEMs with\n``dem_mosaic`` (:numref:`dem_mosaic`).\n\nRunning the GUI frontend\n~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe ``stereo_gui`` program (:numref:`stereo_gui`) is a GUI frontend to\n``parallel_stereo``. It is invoked with the same options as ``parallel_stereo``\n(except for the more specialized ones such as ``--job-size-h``, etc.). It\ndisplays the input images, and makes it possible to zoom in and select smaller\nregions to run stereo on. \n\n.. _cmdline:\n\nSpecifying settings on the command line\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nAll the settings given via the ``stereo.default`` file (:numref:`stereodefault`)\ncan be overridden from the command line. For this add a double hyphen (``--``)\nin front of the option's name and set the value as in the configuration file.\n\nFor options in the ``stereo.default`` file that take multiple numbers, they must\nbe separated by spaces (like ``--corr-kernel 25 25``) on the command line.\n\nExample::\n\n   parallel_stereo E0201461.map.cub M0100115.map.cub \\\n      -s stereo.map --corr-search -70 -4 40 4        \\\n      --subpixel-mode 3 results/output\n\nStereo on multiple machines\n~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nIf the input images are really large it may desirable to distribute\nthe work over several computing nodes. For that, the ``--nodes-list``\noption of ``parallel_stereo`` must be used. See\n:numref:`pbs_slurm`.\n\n.. _mapproj-example:\n\nStereo with mapprojected images\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe way stereo correlation works is by matching a neighborhood of each\npixel in the left image to a similar neighborhood in the right image.\nThis matching process can fail or become unreliable if the two images\nare too different, which can happen for example if the perspectives of\nthe two cameras are very different, the underlying terrain has steep\nportions, or because of clouds and deep shadows. This can result in\nlarge disparity search ranges, long run times, and ASP producing\n3D terrains with noise or missing data.\n\nASP can mitigate this by *mapprojecting* the left and right images onto\nsome pre-existing low-resolution smooth terrain model without holes, and\nusing the output images to do stereo. In effect, this makes the images\nmuch more similar and more likely for stereo correlation to succeed.\n\nIn this mode, ASP does not create a terrain model from scratch, but\nrather uses an existing terrain model as an initial guess, and improves\non it.\n\n.. _initial_terrain:\n\nChoice of initial guess terrain model\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nFor Earth, an existing terrain model can be, for example, the\nCopernicus 30 m DEM from:\n\n    https://portal.opentopography.org/raster?opentopoID=OTSDEM.032021.4326.3\n\nor the NASA SRTM DEM (available on the same web site as above),\nGMTED2010, USGS's NED data, or NGA's DTED data.\n\nThe Copernicus 30 m DEM heights are relative to the EGM96 geoid. \n\n*Any such DEM must be converted using* ``dem_geoid`` *to WGS84 ellipsoid heights,\nfor any processing to be accurate.* See (:numref:`conv_to_ellipsoid`).\n\nThere exist pre-made terrain models for other planets as well, for example the\nMoon LRO LOLA global DEM and the Mars MGS MOLA DEM.\n\nCheck, as before, if your DEM is relative to the areoid rather than an\nellipsoid (:numref:`conv_to_ellipsoid`). Some Mars DEMs may have an\nadditional 190 meter vertical offset (such as the dataset\n``molaMarsPlanetaryRadius0001.cub`` shipped with ISIS data), which can\nbe taken care of with ``image_calc`` (:numref:`image_calc`).\n\nAlternatively, a low-resolution smooth DEM can be obtained by running ASP itself\n(:numref:`isis_map_proj`). In such a run, subpixel mode may be set to parabola\n(``subpixel-mode 1``) for speed. To make it sufficiently coarse and smooth, the\nresolution can be set to about 40 times coarser than either the default\n``point2dem`` (:numref:`point2dem`) resolution or the resolution of the input\nimages. If the resulting DEM turns out to be noisy or have holes, one could\nchange in ``point2dem`` the search radius factor, use hole-filling, invoke more\naggressive outlier removal, and erode pixels at the boundary (those tend to be\nless reliable). \n\n.. _conv_to_ellipsoid:\n\nConversion of initial guess terrain to ellipsoid heights\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nIt is very important that your DEM be relative to a datum/ellipsoid (such as\nWGS84), and *not* to a geoid/areoid, such as EGM96 for Earth. Otherwise there\nwill be a systematic offset of several tens of meters between the images and the\nDEM, which can result in artifacts in mapprojection and stereo.\n\nA DEM relative to a geoid/areoid must be converted so that its heights are\nrelative to an ellipsoid. This must be done for any Copernicus and SRTM DEMs.\nFor others, consult the documentation of the source of the DEM to see this\noperation is needed.\n\nThe ``gdalwarp`` program in recent versions of GDAL and our own ``dem_geoid``\ntool (:numref:`dem_geoid`) can be used to perform the necessary conversions, if\nneeded. For example, with ``dem_geoid``, one can convert EGM96 heights to WGS84\nwith the command::\n\n     dem_geoid --geoid egm96 --reverse-adjustment \\\n       dem.tif -o dem\n\nThis will create ``dem-adj.tif``.\n\n.. _dem_prep:\n\nHole-filling and smoothing the input DEM\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nIt is suggested to inspect and then hole-fill the input DEM\n(:numref:`dem_mosaic_fill` and :numref:`dem_mosaic_extrapolate`).\n\nIf the input DEM has too much detail, and those features do not agree with the\nimages mapprojected on it, this can result in artifacts in the final DEM. A blur\nis suggested, after the holes are filled. Example::\n\n   dem_mosaic --dem-blur-sigma 5 dem.tif -o dem_blur.tif\n\nThe amount of blur may depend on the input DEM resolution, image ground sample\ndistance, and how misregistered the initial DEM is relative to the images. One\ncan experiment on a clip with values of 5 and 10 for sigma, for example.\n\n.. _mapproj-res:\n\nGrid size and projection\n^^^^^^^^^^^^^^^^^^^^^^^^\n\nIt is very important to specify the *same* grid size (ground sample distance,\nground resolution) and projection string when mapprojecting the images (options\n``--tr`` and ``--t_srs`` for ``mapproject``, :numref:`mapproject`), to avoid big\nsearch range issues later in correlation.\n\nNormally, ``mapproject`` is rather good at auto-guessing the resolution,\nso this tool can be invoked with no specification of the resolution \nfor the left image, then then ``gdalinfo`` can be used to find\nthe obtained pixel size, and that value can be used with the right image.\n\nIn the latest build ASP, these quantities can be borrowed from the first \nmapprojected image with the option ``--ref-map`` (:numref:`mapproj_refmap`).\n\nInvoking ``mapproject`` with the ``--query-projection`` option will print the\nestimated ground sample distance (output pixel size) without doing the\nmapprojection.\n\nIf these two images have rather different auto-determined resolutions,\nit is suggested that the smaller ground sample distance be used for both,\nor otherwise something in the middle. \n\nUsing a ground sample distance which is too different than what is\nappropriate can result in aliasing in mapprojected images and\nartifacts in stereo.\n\n.. _isis_map_proj:\n\nExample for ISIS images\n^^^^^^^^^^^^^^^^^^^^^^^\n\n.. figure:: images/stereo_mapproj_400px.png\n   :name: mapproj-example-fig\n   :alt: DEMs from camera geometry images and from mapprojected images.\n\n   A DEM obtained using plain stereo (left) and stereo with mapprojected images\n   (right). Their quality will be comparable for relatively flat terrain and the\n   second will be much better for rugged terrain. The right image has some\n   artifacts at the boundary, which could have been avoided by running without\n   clipping the input images or by cropping the input DEM. We used the ``asp_mgm``\n   algorithm (:numref:`running-stereo`).\n\nThis example illustrates how to run stereo with mapprojected images for ISIS\ndata. For an alternative approach using ``cam2map``, see\n:numref:`mapproj_with_cam2map`.\n\nWe start with LRO NAC Lunar images M1121224102LE and M1121209902LE from ASU's\nLRO NAC web site (https://wms.lroc.asu.edu/lroc/search), fetching them as::\n\n    wget http://pds.lroc.asu.edu/data/LRO-L-LROC-2-EDR-V1.0/LROLRC_0015/DATA/ESM/2013111/NAC/M1121224102LE.IMG\n    wget http://pds.lroc.asu.edu/data/LRO-L-LROC-2-EDR-V1.0/LROLRC_0015/DATA/ESM/2013111/NAC/M1121209902LE.IMG\n\nWe convert them to ISIS cubes using the ISIS program ``lronac2isis``,\nthen we use the ISIS tools ``spiceinit``, ``lronaccal``, and\n``lrnonacecho`` to update the SPICE kernels and to do radiometric and\necho correction. This process is described in\n:numref:`lro_nac_no_stitch`.  We name the two obtained .cub files\n``left.cub`` and ``right.cub``.\n\nHere we decided to run ASP to create the low-resolution DEM needed for\nmapprojection, rather than get them from an external source. For speed,\nwe process just a small portion of the images::\n\n     parallel_stereo left.cub right.cub            \\\n       --left-image-crop-win 1984 11602 4000 5000  \\\n       --right-image-crop-win 3111 11027 4000 5000 \\\n       --job-size-w 1024 --job-size-h 1024         \\\n       --subpixel-mode 1                           \\\n       run_nomap/run\n\n(the crop windows can be determined using ``stereo_gui``,\n:numref:`image_bounds`). The input images have resolution of about 1 meter. \n\nWe create the low-resolution DEM using a resolution 40 times as coarse,\nwith a local stereographic projection::\n\n    point2dem --stereographic --auto-proj-center --tr 40.0 \\\n      --search-radius-factor 5 run_nomap/run-PC.tif \n\nOr, the projection center can be passed to ``point2dem`` such as::\n\n     point2dem --stereographic --proj-lon <lon_ctr> --proj-lat <lat_ctr> \n\nSome experimentation with the parameters used by ``point2dem`` may be necessary\nfor this low-resolution DEM to be smooth enough and with no holes.\nFor Earth, a projection such as UTM can be used.\n\nWe used ``--search-radius-factor 5`` to expand the DEM a\nbit, to counteract future erosion at image boundary in stereo due to\nthe correlation kernel size. This is optional. \nBy calling ``gdalinfo -proj4``, the PROJ string of the obtained DEM\ncan be found, which can be used in mapprojection later, and with the\nresolution switched to meters from degrees (see :numref:`dg-mapproj`\nfor more details).\n\nThis DEM can be hole-filled and blurred with ``dem_mosaic`` if needed\n(:numref:`dem_mosaic_extrapolate`), producing a DEM called\n``run_nomap/run-smooth.tif``. Inspect the result. It should be smooth and with\nno holes.\n\nNext, we mapproject the left image onto this DEM with the ``mapproject`` program\n(:numref:`mapproject`):: \n\n     mapproject run_nomap/run-smooth.tif \\\n       left.cub left_proj.tif\n\nThe resolution of mapprojection is automatically determined, and can be later\ninspected with ``gdalinfo`` (:numref:`gdal_tools`). The projection may be\nauto-determined as well (:numref:`mapproj_auto_proj`).\n\nIt is very important to use the *same resolution and projection* for\nmapprojecting the right image (:numref:`mapproj-res`), and to adjust these\nbelow (``--tr`` and ``--t_srs``).\n\nIn the latest builds of ASP, ``mapproject`` can borrow the resolution and\nprojection for the right image from the left one that was already mapprojected,\nwith the ``--ref-map`` option::\n\n     mapproject                 \\\n       --ref-map left_proj.tif  \\\n       run_nomap/run-smooth.tif \\\n       right.cub right_proj.tif \n\nNext, we do stereo with these mapprojected images, with the mapprojection\nDEM as the last argument::\n\n     parallel_stereo                \\\n       --stereo-algorithm asp_mgm   \\\n       --subpixel-mode 9            \\\n       --sgm-collar-size 256        \\\n       left_proj.tif right_proj.tif \\\n       left.cub right.cub           \\\n       run_map/run                  \\\n       run_nomap/run-smooth.tif\n\nEven though we use mapprojected images, we still specified the original images\nas the third and fourth arguments. That because we need the camera information\nfrom those files. The fifth argument is the output prefix, while the sixth is\nthe low-resolution DEM we used for mapprojection. We have used here\n``--subpixel-mode 9`` with the ``asp_mgm`` algorithm as this will be the final\npoint cloud and we want the increased accuracy.\n\nSee :numref:`running-stereo` for more details about the various \nspeed-vs-accuracy tradeoffs for stereo.\n\nThe mapprojection DEM can be set via ``--dem`` above, in any place in the\ncommand, rather than being the very last argument (as of build 2026/02,\n:numref:`release`).\n\nLastly, we create a DEM at 1 meter resolution with ``point2dem``\n(:numref:`point2dem`)::\n\n     point2dem --stereographic \\\n       --auto-proj-center      \\\n       --tr 1.0                \\\n       run_map/run-PC.tif\n\nWe could have used a coarser resolution for the final DEM, such as 4\nmeters/pixel, since we won't see detail at the level of 1 meter in this DEM, as\nthe stereo process is lossy. This is explained in more detail in\n:numref:`post-spacing`.\n\nIn :numref:`mapproj-example-fig` we show the effect of using\nmapprojected images on accuracy of the final DEM.\n\nSome experimentation on a small area may be necessary to obtain the best\nresults. Once images are mapprojected, they can be cropped to a small\nshared region using ``gdal_translate -projwin`` and then stereo with\nthese clips can be invoked.\n\nWe could have mapprojected the images using the ISIS tool ``cam2map``,\nas described in :numref:`mapproj_with_cam2map`.  The current approach\nmay be preferable since it allows us to choose the DEM to mapproject\nonto, and it is faster, since ASP's ``mapproject`` uses multiple\nprocesses, while ``cam2map`` is restricted to one process and one\nthread.\n\n.. _dg-mapproj:\n\nExample for DigitalGlobe/Maxar images\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nIn this section we will describe how to run stereo with mapprojected\nimages for DigitalGlobe/Maxar cameras for Earth. The same process can\nbe used for any satellite images from any vendor\n(:numref:`other-mapproj`).\n\nUnlike the previous section, here we will use an external DEM to\nmapproject onto, rather than creating our own. We will use a variant of\nNASA SRTM data with no holes. See :numref:`initial_terrain` for how\nto fetch such a terrain. We will name this DEM ``ref_dem.tif``. \n\nIt is important to note that ASP expects the input low-resolution DEM\nto be in reference to a datum ellipsoid, such as WGS84 or NAD83. If\nthe DEM is in respect to either the EGM96 or NAVD88 geoids, the ASP\ntool ``dem_geoid`` can be used to convert the DEM to WGS84 or NAD83\n(:numref:`dem_geoid`). See :numref:`conv_to_ellipsoid` for more\ndetails.\n\nNot applying this conversion might not properly negate the parallax seen\nbetween the two images, though it will not corrupt the triangulation\nresults. In other words, sometimes one may be able to ignore the\nvertical datums on the input but we do not recommend doing that. Also,\nyou should note that the geoheader attached to those types of files\nusually does not describe the vertical datum they used. That can only be\nunderstood by careful reading of your provider's documents.\n\n.. figure:: images/examples/dg/Mapped.png\n   :name: fig:dg-map-example\n   :figwidth: 100%\n\n   Example colorized height map and ortho image output.\n\nA DigitalGlobe/Maxar camera file contains both an exact (linescan) camera\nmodel and an approximate RPC camera model.\n\nIn this example, we use the exact linescan camera model for mapprojection (``-t\ndg``). In older ASP the RPC model was used instead as it was faster (``-t\nrpc``). Triangulation will happen either way with the exact model. Mapprojection\ndoes not need the precise model as it can be seen as a form of\northorectification that is undone when needed.\n\nIt is *strongly suggested* to use a local projection for the mapprojection,\nespecially around poles, as there the default longitude-latitude\nprojection is not accurate.\n\nThe *same* appropriately chosen resolution setting (option ``--tr``)\nmust be used for both images to avoid long run-times and artifacts\n(:numref:`mapproj-res`).\n\nThe ``ref_dem.tif`` dataset should be at a coarser resolution, such as 40 times\ncoarser than the input images, as discussed earlier, to ensure no\nmisregistration artifacts transfer over to the mapprojected images. Ensure the\ninput DEM is relative to an ellipsoid and not a geoid\n(:numref:`conv_to_ellipsoid`). \n\nFill and blur the input DEM if needed (:numref:`dem_mosaic_extrapolate`).\n\nMapprojection commands::\n\n    proj='+proj=utm +zone=11 +datum=WGS84 +units=m +no_defs'\n\n    mapproject -t dg                                   \\\n      --t_srs \"$proj\"                                  \\\n      --tr 0.5                                         \\\n      ref_dem.tif                                      \\\n      12FEB12053305-P1BS_R2C1-052783824050_01_P001.TIF \\\n      12FEB12053305-P1BS_R2C1-052783824050_01_P001.XML \\\n      left_mapproj.tif\n\n    mapproject -t dg                                   \\\n      --t_srs \"$proj\"                                  \\\n      --tr 0.5                                         \\\n      ref_dem.tif                                      \\\n      12FEB12053341-P1BS_R2C1-052783824050_01_P001.TIF \\\n      12FEB12053341-P1BS_R2C1-052783824050_01_P001.XML \\\n      right_mapproj.tif\n\nIf the ``--t_srs`` option is not specified, the projection string will be read\nfrom the low-resolution input DEM, unless the DEM is in a geographic projection,\nwhen a projection in meters will be found (:numref:`mapproj_auto_proj`). See\n:numref:`mapproj_refmap` for how to ensure both images share the same projection\nand grid size.\n\nThe zone of the UTM projection depends on the location of the images. Hence, if\nnot relying on projection auto-determination, the zone should be set\nappropriately.\n\nThe complete list of options for ``mapproject`` is described in\n:numref:`mapproject`.\n\nRunning ``parallel_stereo`` with these mapprojected images, and the \nDEM used for mapprojection as the last argument::\n      \n    parallel_stereo                                    \\\n      --stereo-algorithm asp_mgm                       \\\n      --subpixel-mode 9                                \\\n      --alignment-method none                          \\\n      --nodes-list nodes_list.txt                      \\\n      left_mapproj.tif right_mapproj.tif               \\\n      12FEB12053305-P1BS_R2C1-052783824050_01_P001.XML \\\n      12FEB12053341-P1BS_R2C1-052783824050_01_P001.XML \\\n      dg/dg                                            \\\n      ref_dem.tif\n\nSee :numref:`running-stereo` for more details about the various\nspeed-vs-accuracy tradeoffs. See :numref:`pbs_slurm` for running on multiple\nmachines.\n\nWe have used ``alignment-method none``, since the images are mapprojected onto\nthe same terrain with the same resolution, thus no additional alignment is\nnecessary. More details about how to set these and other ``parallel_stereo``\nparameters can be found in :numref:`settingoptionsinstereodefault`.\n\nThe mapprojection DEM can be set via ``--dem`` above, in any place in the\ncommand, rather than being the very last argument (as of build 2026/02,\n:numref:`release`).\n\nDEM creation (:numref:`point2dem`)::\n\n     point2dem --tr 0.5 dg/dg-PC.tif\n\nThis DEM will inherit the projection from the mapprojected images. To auto-guess\na local UTM projection, see :numref:`point2dem_proj`.\n\n.. _other-mapproj:\n\nMapprojection with other camera models\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nStereo with mapprojected images can be used with any camera model\nsupported by ASP, including RPC (:numref:`rpc`), Pinhole\n(:numref:`sfmgeneric`), CSM (:numref:`csm`), OpticalBar\n(:numref:`kh4`), etc.  The ``mapproject`` command needs to be invoked\nwith ``-t rpc``, ``-t pinhole``, etc., and normally it auto-detects\nthis option (except when a camera file has both ``DG`` and ``RPC``\ncameras). \n\nThe cameras can also be bundle-adjusted, as discussed later.\n\nAs earlier, when invoking ``parallel_stereo`` with mapprojected images, the\nfirst two arguments should be these images, followed by the camera\nmodels, output prefix, and the name of the DEM used for mapprojection.\n\nThe session name (``-t``) passed to ``parallel_stereo`` should be\n``rpcmaprpc``, ``pinholemappinhole``, or just ``rpc``, ``pinhole``,\netc. Normally this is detected and set automatically.\n\nThe stereo command with mapprojected images when the cameras are\nstored separately is along the lines of::\n\n    parallel_stereo               \\\n      -t rpc                      \\\n      --stereo-algorithm asp_mgm  \\\n      --nodes-list nodes_list.txt \\\n      left.map.tif right.map.tif  \\\n      left.xml right.xml          \\\n      run/run                     \\\n      ref_dem.tif\n\nor::\n\n    parallel_stereo               \\\n      -t pinhole                  \\\n      --stereo-algorithm asp_mgm  \\\n      --subpixel-mode 9           \\\n      --nodes-list nodes_list.txt \\\n      left.map.tif right.map.tif  \\\n      left.tsai right.tsai        \\\n      run/run                     \\\n      ref_dem.tif\n\nWhen the cameras are embedded in the images, the command is::\n\n    parallel_stereo               \\\n      -t rpc                      \\\n      --stereo-algorithm asp_mgm  \\\n      --subpixel-mode 9           \\\n      --nodes-list nodes_list.txt \\\n      left.map.tif right.map.tif  \\\n      run/run                     \\\n      ref_dem.tif\n\nIf your cameras have been corrected with bundle adjustment\n(:numref:`bundle_adjust`), one should pass ``--bundle-adjust-prefix``\nto all ``mapproject`` and ``parallel_stereo`` invocations. See also\n:numref:`ba_pc_align` for when alignment was used as well.\n\nThen, ``point2dem`` can be run, as above, to create a DEM.\n\n.. _mapproj_reuse:\n\nReusing a run with mapprojected images\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nMapprojection of input images is a preprocessing step, to help rectify them. The\ncamera model type, bundle adjust prefix, and even camera names used in\nmapprojection are completely independent of the camera model type, bundle adjust\nprefix, and camera names used later in stereo with these mapprojected images.\n\nMoreover, once stereo is done with one choices of these, the produced run can \nbe reused with a whole new set of choices, with only the triangulation step \nneeding to be redone. That because the correlation between the images is still\nvalid when the cameras change. \n\nThis works best when the cameras do not change a lot after the initial run is\nmade. Otherwise, it is better to redo the mapprojection and the full run from\nscratch.\n\nOnce such a run is done, using say the output prefix ``dg/dg``,\n``parallel_stereo`` can be done with the option ``--prev-run-prefix dg/dg``,\na new output prefix, and modifications to the variables above, which will\nredo only the triangulation step. \n\nEven the camera files can be changed for stereo (only with ASP 3.3.0 or later).\nFor example, ``jitter_solve`` (:numref:`jitter_solve`) can produce CSM cameras\ngiven input cameras in Maxar / DigitalGlobe .xml files or input CSM .json files\n(:numref:`csm`). So, if stereo was done with mapprojected images named\n``left_mapproj.tif`` and ``right_mapproj.tif``, with cameras with names like\n``left.xml`` and ``right.xml``, before solving for jitter, and this solver\nproduced cameras of the form ``adjusted_left.json``, ``adjusted_right.json``,\nthe reuse of the previous run can be done as::\n\n   parallel_stereo                          \\\n     left_mapproj.tif right_mapproj.tif     \\\n     adjusted_left.json adjusted_right.json \\\n     --prev-run-prefix dg/dg                \\\n     jitter/run                             \\\n     ref_dem.tif\n\nUnder the hood, this will read the metadata from the mapprojected images\n(:numref:`mapproj_metadata`), will look up the original ``left.xml`` and\n``right.xml`` cameras, figure out what camera model was used in mapprojection\nwill undo the mapprojection with this data, and then will do the triangulation\nwith the new cameras.\n\nIt is very important that ``--bundle-adjust-prefix`` needs to be used or not\ndepending on the circumstances. For example, jitter-solved cameras already\nincorporate any prior bundle adjustment that ``jitter_solve`` was passed on\ninput, so it was not specified in the above invocation, and in fact the results\nwould be wrong if it was specified.  \n\nAn example without mapprojected images is shown in :numref:`bathy_reuse_run`.\n\n.. _mapproj_ortho:\n\nStereo with ortho-ready images\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nSome vendors offer orthoimages that have been projected onto surfaces of constant\nheight above a datum. Examples are Maxar's OR2A product and the Airbus Pleiades\northo product. These can be processed with ASP after some preparation.\n\nThe orthoimages may have different pixel sizes (as read with ``gdalinfo``,\n:numref:`gdal_tools`). The coarser one must be regridded to the pixel size of\nthe finer one, with a command such as::\n\n  gdalwarp -r cubicspline -overwrite -tr 0.4 0.4 \\\n    ortho.tif ortho_regrid.tif\n\nThe orthoimages must have the same projection, in units of meters (such as UTM).\nIf these are different, the desired projection string can be added to the\n``gdalwarp`` command above via the option ``-t_srs``. If desired to also clip\nboth images to a region, add the option ``-te <xmin> <ymin> <xmax> <ymax>``.\n \nThe stereo command is::\n\n    parallel_stereo                    \\\n      -t rpc                           \\\n      --stereo-algorithm asp_mgm       \\\n      --ortho-heights 23.5 27.6        \\\n      left_regrid.tif right_regrid.tif \\\n      left.xml right.xml               \\\n      run/run\n\nThe values passed in via ``--ortho-heights`` are the heights above the\ndatum that were used to project the images. The datum is read from the\ngeoheader of the images.\n\nFor Maxar OR2A data (as evidenced by the ``ORStandard2A`` tag in the XML camera\nfiles), the option ``--ortho-heights`` need not be set, as the entries will be\nauto-populated from the ``<TERRAINHAE>`` field in the camera files.\n\nThe option ``--ortho-heights``, if set, takes priority over fields in those\ncamera files.\n\nFor Pleiades data, the needed values need to be looked up as described in\n:numref:`pleiades_projected`, and then set as above.\n\nAll products we encountered (both Maxar and Airbus Pleiades) employed the RPC\ncamera model. If that model is of a different type, adjust the ``-t`` option\nabove (:numref:`ps_options`).\n\nAfter stereo, ``point2dem`` (:numref:`point2dem`) is run as usual. It is\nsuggested to inspect the triangulation error created by that program, and to\ncompare with a prior terrain, such as in :numref:`initial_terrain`.\n\n.. _diagnosing_problems:\n\nDiagnosing problems\n~~~~~~~~~~~~~~~~~~~\n\nOnce invoked, ``parallel_stereo`` proceeds through several stages that are\ndetailed in :numref:`entrypoints`. Intermediate and final output\nfiles are generated as it goes. See :numref:`outputfiles`, page for\na comprehensive listing. Many of these files are useful for diagnosing\nand debugging problems.  For example, as :numref:`p19-stereo-output`\nshows, a quick look at some of the TIFF files in the ``results/``\ndirectory provides some insight into the process.\n\nPerhaps the most accessible file for assessing the quality of your\nresults is the good pixel image (``results/output-GoodPixelMap.tif``).\nIf this file shows mostly good, gray pixels in the overlap area\n(the area that is white in both the ``results/output-lMask.tif``\nand ``results/output-rMask.tif`` files), then your results are just\nfine. If the good pixel image shows lots of failed data, signified\nby red pixels in the overlap area, then you need to go back and\ntune your ``stereo.default`` file until your results improve. This\nmight be a good time to make a copy of ``stereo.default`` as you\ntune the parameters to improve the results.\n\n.. _p19-disparity:\n\n.. figure:: images/p19-disparity_400px.png\n   :alt: Disparity images produced using the ``disparitydebug`` tool.\n\n   Disparity images produced using the\n   ``disparitydebug`` tool. The two images on the left are the\n   ``results/output-D-H.tif`` and ``results/output-D-V.tif`` files,\n   which are normalized horizontal and vertical disparity components\n   produced by the disparity map initialization phase. The two images on\n   the right are ``results/output-F-H.tif`` and\n   ``results/output-F-V.tif``, which are the final filtered,\n   sub-pixel-refined disparity maps that are fed into the Triangulation\n   phase to build the point cloud image. Since these MOC images were\n   acquired by rolling the spacecraft across-track, most of the\n   disparity that represents topography is present in the horizontal\n   disparity map. The vertical disparity map shows disparity due to\n   \"wash-boarding\", which is not due to topography but because of spacecraft\n   movement. Note however that the horizontal and vertical disparity\n   images are normalized independently. Although both have the same\n   range of gray values from white to black, they represent\n   significantly different absolute ranges of disparity.\n\nWhenever ``parallel_stereo``, ``point2dem``, and other executables are run, they\ncreate log files in given tool's results directory, containing a copy of the\nconfiguration file, the command that was run, your system settings, and tool's\nconsole output. This will help track what was performed so that others in the\nfuture can recreate your work.\n\nAnother handy debugging tool is the ``disparitydebug`` program\n(:numref:`disparitydebug`), which allows you to generate viewable\nversions of the intermediate results from the stereo correlation\nalgorithm. ``disparitydebug`` converts information in the disparity\nimage files into two TIFF images that contain horizontal and vertical\ncomponents of the disparity (i.e.  matching offsets for each pixel in\nthe horizontal and vertical directions). There are actually three\nflavors of disparity map: the ``-D.tif``, the ``-RD.tif``, and\n``-F.tif``. You can run ``disparitydebug`` on any of them. Each shows\nthe disparity map at the different stages of processing.\n\n::\n\n    disparitydebug results/output-F.tif\n\nIf the output H and V files from ``disparitydebug`` look good, then the\npoint cloud image is most likely ready for post-processing. You can\nproceed to make a mesh or a DEM by processing ``results/output-PC.tif``\nusing the ``point2mesh`` or ``point2dem`` tools, respectively.\n\n:numref:`p19-disparity` shows the outputs of ``disparitydebug``.\n\nIf the input images are mapprojected (georeferenced) and the alignment\nmethod is ``none``, all images output by stereo are georeferenced as\nwell, such as GoodPixelMap, D_sub, disparity, etc. As such, all these\ndata can be overlaid in ``stereo_gui``. ``disparitydebug`` also\npreserves any georeference.\n\n.. _longrun:\n\nDealing with long run-times and failures\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nIf ``stereo_corr`` takes unreasonably long, it may have encountered a portion of\nthe image where, due to noise (such as clouds, shadows, etc.) the determined\nsearch range is much larger than what it should be. The search range is\ndisplayed in a terminal and saved to ``stereo_corr`` log files\n(:numref:`out_log_files`). A width and height over 100 pixels is generally too\nlarge. \n  \nIn this case it is suggested to mapproject the images\n(:numref:`mapproj-example`). This will make the images more similar and reduce\nthe search range. \n\nA few other strategies, with or without mapprojected images, are as follows.\n\nIf running on multiple machines, ensure the ``--nodes-list`` option is used\n(:numref:`pbs_slurm`).\n\nWith the default block-matching algorithm, ``--stereo-algorithm\nasp_bm``, the option ``--corr-timeout integer`` can be used to limit\nhow long each 1024 |times| 1024 pixel tile can take. A good value here\ncould be 300 (seconds) or more if your terrain is expected to have\nlarge height variations.\n\nWith the ``asp_sgm`` or ``asp_mgm`` algorithms, set a value \nfor ``--corr-memory-limit-mb`` (:numref:`asp_sgm`) for the number \nof megabytes of memory to use for each correlation process.\nThis needs to take into account how much memory is available \nand how many processes are running in parallel per node.\n\nTo remove outliers one can tighten ``--outlier-removal-params``\n(:numref:`stereodefault`), or mapproject the images (:numref:`mapproj-example`). \n\nA smaller manual search range can be specified (:numref:`search_range2`).\nIn particular, with mapprojected images, the option ``--max-disp-spread``\ncan be very useful (:numref:`corr_section`).\n\nIf a run failed partially during correlation, it can be resumed with the\n``parallel_stereo`` option ``--resume-at-corr`` (:numref:`parallel_stereo`). A\nran can be started at the triangulation stage after making changes to the\ncameras while reusing a previous run with the option ``--prev-run-prefix``.\n\nIf a run failed due to running out of memory with\n``asp_mgm``/``asp_sgm``, also consider lowering the value of\n``--processes``.\n\nSee also :numref:`handling_clouds` with considers the situation\nthat clouds are present in the input images. The suggestions there\nmay apply in other contexts as well.\n\nOn Linux, the ``parallel_stereo`` program writes in each output tile\nlocation a file of the form::\n\n    <tile prefix>-<program name>-resource-usage.txt\n\nhaving the elapsed time and memory usage, as output by ``/usr/bin/time``.\nThis can guide tuning of parameters to reduce resource usage.\n\n.. _next_steps_ba:\n\nCorrecting camera positions and orientations\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe ``bundle_adjust`` program (:numref:`bundle_adjust`) can be used to\nadjust the camera positions and orientations before running\nstereo. These adjustments makes the cameras self-consistent, but not\nconsistent with the ground.\n\nA stereo terrain created with bundle-adjusted cameras can be aligned\nto an existing reference using ``pc_align``\n(:numref:`pc-align-example`).  The same alignment transform can be\napplied to the bundle-adjusted cameras (:numref:`ba_pc_align`).\n\n.. _pc-align-example:\n\nAlignment to point clouds from a different source\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nOften the 3D terrain models output by ``parallel_stereo`` (point\nclouds and DEMs) can be intrinsically quite accurate yet their actual\nposition on the planet may be off by several meters or several\nkilometers, depending on the spacecraft. This can result from small\nerrors in the position and orientation of the satellite cameras taking\nthe pictures.\n\nSuch errors can be corrected in advance using bundle adjustment, as\ndescribed in the previous section. That requires using ground control\npoints, that may not be easy to collect. Alternatively, the images and\ncameras can be used as they are, and the absolute position of the output\npoint clouds can be corrected in post-processing. For that, ASP provides\na tool named ``pc_align`` (:numref:`pc_align`).\n\nThis program aligns a 3D terrain to a much more accurately positioned (if\npotentially sparser) dataset. Such datasets can be made up of GPS measurements\n(in the case of Earth), or from laser altimetry instruments on satellites, such\nas ICESat/GLASS for Earth, LRO/LOLA on the Moon, and MGS/MOLA on Mars. Under the\nhood, ``pc_align`` uses the Iterative Closest Point algorithm (ICP) (both the\npoint-to-plane and point-to-point flavors are supported, and with point-to-point\nICP it is also possible to solve for a scale change).\n\nThe ``pc_align`` tool requires another input, an a priori guess for the\nmaximum displacement we expect to see as result of alignment, i.e., by\nhow much the points are allowed to move when the alignment transform is\napplied. If not known, a large (but not unreasonably so) number can be\nspecified. It is used to remove most of the points in the source\n(movable) point cloud which have no chance of having a corresponding\npoint in the reference (fixed) point cloud.\n\n.. figure:: images/examples/align_compare_500px.png\n   :alt:  pc_align results\n   :name: pc-align-fig\n\n   Example of using ``pc_align`` to align a DEM obtained using stereo\n   from CTX images to a set of MOLA tracks. The MOLA points are colored\n   by the offset error initially (left) and after pc align was applied\n   (right) to the terrain model. The red dots indicate more than 100 m\n   of error and blue less than 5 m. The ``pc_align`` algorithm\n   determined that by moving the terrain model approximately 40 m south,\n   70 m west, and 175 m vertically, goodness of fit between MOLA and the\n   CTX model was increased substantially.\n\nHere is an example. Recall that the denser *reference* cloud is specified first,\nthe sparser *source* cloud to be aligned is specified second, and that this\nprogram is very sensitive to the value of ``--max-displacement``\n(:numref:`pc_align_max_displacement`)::\n\n    pc_align --max-displacement 200           \\\n      --datum MOLA                            \\\n      --save-transformed-source-points        \\\n      --save-inv-transformed-reference-points \\\n      --csv-format '1:lon 2:lat 3:radius_m'   \\\n      stereo-PC.tif mola.csv                  \\\n      -o align/run\n\nThe cloud ``mola.csv`` will be transformed to the coordinate system \nof ``stereo-PC.tif`` and saved as ``run/run-trans_source.csv``.\n\nThe cloud ``stereo-PC.tif`` will be transformed to to the coordinate system of\n``mola.csv`` and saved as ``align/run-trans_reference.tif``. It can \nthen be gridded with ``point2dem`` (:numref:`point2dem`) and compared to\n``mola.csv`` using ``geodiff`` (:numref:`geodiff`).\n\nValidation and error metrics are discussed in :numref:`pc_align_validation`\nand :numref:`pc_align_error`.\n\nIt is important to note here that there are two widely used Mars datums, and if\nyour CSV file has, unlike above, the heights relative to a datum, the correct\ndatum name must be specified via ``--datum``.  :numref:`molacmp` talks in more\ndetail about the Mars datums.\n\nSee an illustration in :numref:`pc-align-fig`.\n\nAn alignment transform can be applied to cameras models\n(:numref:`ba_pc_align`). The complete documentation for this program\nis in :numref:`pc_align`.\n\nValidation of alignment\n~~~~~~~~~~~~~~~~~~~~~~~\n\nThe ``pc_align`` program saves some error report files in the output directory\n(:numref:`pc_align_error`). The produced aligned cloud can be compared to the\ncloud it was aligned to.\n\n:numref:`pc_align_validation` has more details on this, including how to use\nthe ``geodiff`` program (:numref:`geodiff`) to take the difference between clouds,\nwhich can then be colorized.\n\nAlignment and orthoimages\n~~~~~~~~~~~~~~~~~~~~~~~~~\n\nAfter ASP has created a DEM, and the left and right images are mapprojected to\nit, they are often shifted in respect to each other. That is due to the errors\nin camera positions. To rectify this, one has to run ``bundle_adjust``\n(:numref:`bundle_adjust`) first, then rerun stereo, DEM creation, followed by \nmapprojection onto the new DEM. For each of these, the bundle-adjusted cameras must\nbe passed in via ``--bundle-adjust-prefix``.\n\nNote that this approach will create self-consistent outputs, but which are not\nnecessarily aligned with pre-existing ground truth. That can be accomplished as\nfollows.\n\nFirst, need to align the DEM to the ground truth with ``pc_align``\n(:numref:`pc_align`). Then, invoke ``bundle_adjust`` on the two input images and\ncameras, while passing to it the transform obtained from ``pc_align`` via the\n``--initial-transform`` option. This will move the cameras to be consistent\nwith the ground truth. Then one can mapproject with the updated cameras. \nThis approach is described in detail in :numref:`ba_pc_align`.\n\nIf the alignment is applied not to a DEM, but to the triangulated point cloud\nproduced by stereo, one can use ``point2dem`` with the ``--orthoimage`` option,\nwith the point cloud after alignment and the ``L`` image before alignment.\nSee :numref:`point2dem` for the description of this option and an example.\nIf the alignment was done with the DEM produced from a triangulated point \ncloud, it can be applied with ``pc_align`` to the point cloud and then\ncontinue as above.\n\n.. _manipulating_results:\n\nManipulating the results\n------------------------\n\nWhen ``parallel_stereo`` finishes, it will have produced a point cloud image,\nwith a name like ``results/output-PC.tif`` (:numref:`outputfiles`), which can be\nused to create many kinds of data products, such as DEMs and orthoimages\n(:numref:`point2dem`), textured meshes (:numref:`point2mesh`), LAS files\n(:numref:`point2las`), colormaps (:numref:`colormap`), hillshaded images\n(:numref:`genhillshade`), etc.\n\nProduced DEMs can also be mosaicked (:numref:`dem_mosaic`), subtracted from\nother DEMs or CSV files (:numref:`geodiff`), aligned to a reference\n(:numref:`pc-align-example`), etc.\n\n.. _p19-osg:\n\n.. figure:: images/p19-osg_400px.png\n   :alt:  A visualization of a mesh.\n\n   A visualization of a mesh.\n\nBuilding a 3D mesh model\n~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe ``point2mesh`` command (:numref:`point2mesh`) can create a 3D textured mesh\nin the plain text ``.obj`` format that can be opened in a mesh viewer such as\nMeshLab. The ``point2mesh`` program takes the point cloud file and the left\nnormalized image as inputs::\n\n     point2mesh --center results/output-PC.tif results/output-L.tif\n\nThe option ``--center`` shifts the points towards the origin, as otherwise the\nmesh may have rendering artifacts because of the large values of the vertices.\nEach mesh will have its own shift, however, so this option will result in meshes\nthat are not aligned with each other. \n\nAn example visualization is shown in :numref:`p19-osg`.\n\nIf you already have a DEM and an ortho image (:numref:`builddem`),\nthey can be used to build a mesh as well, in the same way as done\nabove::\n\n     point2mesh --center results/output-DEM.tif results/output-DRG.tif\n\n.. _builddem:\n\nBuilding a digital elevation model and ortho image\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nRunning the ``point2dem`` program (:numref:`point2dem`)::\n\n     point2dem --auto-proj-center results/output-PC.tif\n\nwill creates a Digital Elevation Model (DEM) named ``results/output-DEM.tif``.\n\nThe default projection will be in units of meters. See :numref:`point2dem_proj`\nfor how to set a projection or how auto-guessing it works. The planetary \nbody is usually auto-guessed as well, or can be set explicitly with the \nan option such as ``-r mars``.\n\nThe DEM can be transformed into a hill-shaded image for visualization\n(:numref:`genhillshade`). The DEM can be examined in ``stereo_gui``, as::\n\n    stereo_gui --hillshade results/output-DEM.tif\n\nThe ``point2dem`` program can also be used to orthoproject raw satellite\nimages onto the DEM. To do this, invoke ``point2dem`` just as before,\nbut add the ``--orthoimage`` option and specify the use of the left\nimage file as the texture file to use for the projection::\n\n     point2dem --auto-proj-center \\\n       results/output-PC.tif      \\\n       --orthoimage results/output-L.tif\n\nThe texture file ``L.tif`` must always be specified after the point\ncloud file ``PC.tif`` in this command.\n\nThis produces ``results/output-DRG.tif``, which can be visualized in\n``stereo_gui``.  See :numref:`p19-norm_ortho` on the right for the\noutput image.\n\nTo fill in any holes in the obtained orthoimage, one can invoke it with\na larger value of the grid size (the ``--tr`` option) and/or with a\nvariation of the options::\n\n    --no-dem --orthoimage-hole-fill-len 100 --search-radius-factor 2 \n\nThe ``point2dem`` program is also able to accept output projection\noptions the same way as the tools in GDAL. Well-known EPSG, IAU2000\nprojections, and custom PROJ or WKT strings can applied with the target\nspatial reference set flag, ``--t_srs``. If the target spatial reference\nflag is applied with any of the reference spheroid options, the\nreference spheroid option will overwrite the datum defined in the target\nspatial reference set. \n\nThe following two examples produce the same output. However, the last one will\nalso show correctly the name of the datum in the geoheader, not just the values\nof its axes.\n\n::\n\n    point2dem --t_srs \"+proj=longlat +a=3396190 +b=3376200\"          \\\n       results/output-PC.tif\n\n    point2dem --t_srs                                                \\\n      'GEOGCS[\"Geographic Coordinate System\",                     \n         DATUM[\"D_Mars_2000\",\n         SPHEROID[\"Mars_2000_IAU_IAG\",3396190,169.894447223611]],\n         PRIMEM[\"Greenwich\",0],\n         UNIT[\"degree\",0.0174532925199433]]'                         \\\n      results/output-PC.tif\n\nThe ``point2dem`` program can be used in many different ways. The\ncomplete documentation is in :numref:`point2dem`.\n\n.. _p19-norm_ortho:\n\n.. figure:: images/p19-norm_ortho_500px.png\n   :alt: Normalized DEM and orthoimage.\n\n   The image on the left is a normalized DEM (generated using \n   the ``point2dem`` option ``-n``), which shows low terrain\n   values as black and high terrain values as white. The image on the\n   right is the left input image projected onto the DEM (created using\n   the ``--orthoimage`` option to ``point2dem``).\n\nOrthorectification of an image from a different source\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nIf you have already obtained a DEM, using ASP or some other approach,\nand have an image and camera pair which you would like to overlay on top\nof this terrain, use the ``mapproject`` tool (:numref:`mapproject`).\n\n.. _geoid_adj:\n\nCreating DEMs relative to the geoid/areoid\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe DEMs generated using ``point2dem`` are in reference to a datum\nellipsoid. If desired, the ``dem_geoid`` (:numref:`dem_geoid`)\nprogram can be used to convert\nthis DEM to be relative to a geoid/areoid on Earth/Mars respectively.\nExample usage::\n\n    dem_geoid results/output-DEM.tif\n\n.. _gen_las:\n\nConverting to the LAS format\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nIf it is desired to use the ``parallel_stereo`` generated point cloud outside of\nASP, it can be converted to the LAS file format, which is a public file\nformat for the interchange of 3-dimensional point cloud data. The tool\n``point2las`` can be used for that purpose (:numref:`point2las`). Example usage::\n\n    point2las --compressed -r Earth results/output-PC.tif\n\n.. _genhillshade:\n\nGenerating color hillshade maps\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nOnce you have generated a DEM file, you can use the ``colormap``\n(:numref:`colormap`) and ``hillshade`` (:numref:`hillshade`) programs to create\ncolorized and/or shaded relief images.\n\nTo create a colorized version of the DEM, you need only specify the DEM\nfile to use. The colormap is applied to the full range of the DEM, which\nis computed automatically. Alternatively you can specify your own min\nand max range for the color map.\n\n::\n\n    colormap results/output-DEM.tif -o colorized.tif\n\nSee :numref:`colormap` for available colormap styles and illustrations\nfor how they appear.\n\nTo create a hillshade of the DEM, specify the DEM file to use. You can\ncontrol the azimuth and elevation of the light source using the ``-a``\nand ``-e`` options.\n\n::\n\n    hillshade results/output-DEM.tif -o shaded.tif -e 25 -a 300\n\nTo create a colorized version of the shaded relief file, specify the DEM\nand the shaded relief file that should be used::\n\n    colormap results/output-DEM.tif -s shaded.tif -o color-shaded.tif\n\nThis program can also create the hillshaded file first, and then apply it, if\ninvoked with the option ``--hillshade``.\n\nSee :numref:`hrad-color` showing the images obtained with these\ncommands.\n\n.. _hrad-color:\n\n.. figure:: images/p19-colorized-shaded_500px.png\n\n   The colorized DEM, the shaded relief image, and the\n   colorized hillshade.\n\n.. _cog_output:\n\nCloud-Optimized GeoTIFF\n~~~~~~~~~~~~~~~~~~~~~~~\n\nASP supports writing cloud-optimized GeoTIFFs (COG) with the ``--cog`` option\nfor :ref:`point2dem`, :ref:`mapproject`, :ref:`image_mosaic`, :ref:`dem_mosaic`,\n:ref:`geodiff`, :ref:`image_calc`, :ref:`hillshade`, and :ref:`colormap`.\n\nThis creates files with 512 x 512 tiles, internal overviews (pyramids), and\noptimized compression for efficient streaming from cloud storage.\n\nUse ``gdalinfo`` (:numref:`gdal_tools`) to check if an output file is a COG.\n\n.. _visualizing_results:\n\nVisualizing the results\n-----------------------\n\nThe ``stereo_gui`` program (:numref:`stereo_gui`) is a very versatile\nviewer that can overlay hillshaded DEMs, orthoimages, interest point matches,\nASP's report files in CSV format, polygons, etc.\n\n.. _asp_plot:\n\nDiagnostic plots and reports with asp_plot\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe `asp_plot <https://github.com/uw-cryo/asp_plot>`__ Python package can be\nused to generate diagnostic plots and comprehensive PDF reports from ASP\noutputs. It provides visualization of stereo DEMs (hillshades, colormaps,\ndifference maps), bundle adjustment residuals, interest point matches,\nmap-projected image overlays, CSM camera model comparisons, and stereo\ngeometry. For Earth-based datasets, it also supports comparison against ICESat-2\naltimetry data via `SlideRule <https://slideruleearth.io/>`_.\n\nThe ``asp_plot`` package supports processing outputs from many sensors,\nincluding WorldView, LRO NAC, etc. (:numref:`examples`).\n\n``asp_plot`` is available via ``conda`` and ``pip``::\n\n    conda install -c conda-forge asp_plot\n\nor::\n\n    pip install asp_plot\n\nFor full documentation, including installation, CLI usage, example notebooks,\nand example reports, see the\n`asp_plot documentation <https://asp-plot.readthedocs.io>`__.\n\n.. _google_earth_overlays:\n\nBuilding overlays for Moon and Mars mode in Google Earth\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nSometimes it may be convenient to see how the DEMs and orthoimages\ngenerated by ASP look on top of existing images in Google Earth. ASP\nprovides a tool named ``image2qtree`` for that purpose. It creates\nmulti-resolution image tiles and a metadata tree in KML format that can\nbe loaded into Google Earth from your local hard drive or streamed from\na remote server over the Internet.\n\nThe ``image2qtree`` program can only be used on 8-bit image files with\ngeoreferencing information (e.g. grayscale or RGB GeoTIFF images). In\nthis example, it can be used to process\n\n| ``results/output-DEM-normalized.tif``, ``results/output-DRG.tif``,\n  ``shaded.tif``,\n| ``colorized.tif``, and ``shaded-colorized.tif``.\n\nThese images were generated respectively by using ``point2dem`` with the\n``-n`` option creating a normalized DEM, the ``--orthoimage`` option to\n``point2dem`` which projects the left image onto the DEM, and the images\ncreated earlier with ``colormap``.\n\nHere's an example of how to invoke this program::\n\n    image2qtree shaded-colorized.tif -m kml --draw-order 100\n\n:numref:`hrad-kml` shows the obtained KML files in Google\nEarth.\n\nThe complete documentation is in :numref:`image2qtree`.\n\n.. _hrad-kml:\n\n.. figure:: images/p19-googlemars_500px.png\n\n   The colorized hillshade DEM as a KML overlay.\n\nUsing DERT to visualize terrain models\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe open source Desktop Exploration of Remote Terrain (DERT) software\ntool can be used to explore large digital terrain models, like those\ncreated by the Ames Stereo Pipeline. For more information, visit\nhttps://github.com/nasa/DERT.\n\n.. _blender:\n\nUsing Blender to visualize meshes\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe :ref:`point2mesh` program will create ``.obj`` and ``.mtl`` files\nthat you can import directly into Blender (https://www.blender.org/).\nRemember that ``.obj`` files don't particularly have a way to\nspecify 'units' but the 'units' of an ``.obj`` file written out by ASP\nare going to be 'meters.'  If you open a large .obj model created by\nASP (like HiRISE), you'll need to remember to move the default\nviewpoint away from the origin, and extend the clipping distance to a\nfew thousand (which will be a few kilometers), otherwise it may\n'appear' that the model hasn't loaded (because \nyour viewpoint is inside of it, and you can't see far enough).\n\nThe default step size for :ref:`point2mesh` is 10, which only samples\nevery 10th point, so you may want to read the documentation which\ntalks more about the ``-s`` argument to :ref:`point2mesh`.  Depending on how\nbig your model is, even that might be too small, and I'd be very\ncautious about using ``-s 1`` on a HiRISE model that isn't cropped\nsomehow first.\n\nYou can also use :ref:`point2mesh` to pull off this trick with\nterrain models you've already made (maybe with SOCET or something\nelse).  Our :ref:`point2mesh` program certainly knows how to read\nour ASP ``*-PC.tif`` files, but it can also read GeoTIFFs.  So if\nyou have a DEM as a GeoTIFF, or an ISIS cube which is a terrain\nmodel (you can use ``gdal_translate`` to convert them to GeoTIFFs),\nthen you can run :ref:`point2mesh` on them to get ``.obj`` and\n``.mtl`` files.\n\n.. _meshlab:\n\nUsing MeshLab to visualize meshes\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nMeshLab is another program that can view meshes in \n``.obj`` files. It can be downloaded from::\n\n  https://github.com/cnr-isti-vclab/meshlab/releases\n\nand can be installed and run in user's directory without needing\nadministrative privileges.\n\nUsing QGIS to visualize terrain models\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe free and open source geographic information system QGIS\n(https://qgis.org) as of version 3.0 has a 3D Map View feature that\ncan be used to easily visualize perspective views of terrain models.\n\nAfter you use :ref:`point2dem` to create a terrain model (the\n``*-DEM.tif`` file), or both the terrain model and an ortho image\nvia ``--orthoimage`` (the ``*-DRG.tif`` file), those files can be\nloaded as raster data files, and the 'New 3D Map View' under the\nView menu will create a new window, and by clicking on the wrench\nicon, you can set the DEM file as the terrain source, and are able\nto move around a perspective view of your terrain.\n\n.. _existing_terrain:\n\nUse of existing terrain data\n----------------------------\n\nASP's tools can incorporate prior ground data, such as DEMs,\nlidar point clouds, or GCP files (:numref:`bagcp`).\n\nASP assumes such data is well-aligned with the input images and cameras. To\nperform such alignment, one may first run bundle adjustment\n(:numref:`bundle_adjust`), followed by stereo (:numref:`parallel_stereo`), DEM\ncreation (:numref:`point2dem`), alignment of DEM to existing terrain\n(:numref:`pc-align-example`), and then the aligment can be applied to the\nbundle-adjusted cameras (:numref:`ba_pc_align`).\n\nAny input terrain is assumed to be relative to a datum ellipsoid,\notherwise it should be converted with ``dem_geoid`` (:numref:`conv_to_ellipsoid`).\nThis applies, in particular, to OpenTopography DEMs (:numref:`initial_terrain`).\n\nThese are the various approaches of integrating well-aligned prior terrain data.\n\n - Bundle adjustment can be performed with a terrain constraint. If the terrain\n   is a DEM, use the ``--heights-from-dem`` option (:numref:`heights_from_dem`).\n   This also works for a rather dense point cloud in various formats, after\n   gridding it with ``point2dem``. \n \n - The ``jitter_solve`` program (:numref:`jitter_solve`) can be called in the\n   same way with the option ``--heights-from-dem``.\n   \n - For sparse point clouds or DEM data, the ``bundle_adjust`` option named\n   ``--reference-terrain`` can be invoked (:numref:`reference_terrain`).\n   This one is harder to use as it takes as input stereo disparities.\n \n - The ``jitter_solve`` program also has the option ``--reference-terrain``.\n   This one is easier to use than the analogous ``bundle_adjust`` option, as the\n   unaligning of the disparity is done for the user on the fly\n   (:numref:`jitter_ref_terrain`).\n  \n - Low-resolution stereo disparity can be initialized from a DEM, with the\n   option ``--corr-seed-mode 2`` (:numref:`d_sub_dem`).\n    \n - Stereo can be run with mapprojected images. The DEM for mapprojection can be\n   external, or from a previous stereo run (:numref:`mapproj-example`).\n\n - GCP files (:numref:`bagcp`) can be incorporated into bundle adjustment and\n   jitter solving. These can also be used for aligment with ``pc_align`` (as the\n   *source* cloud).\n \n - Given a prior DEM and an ASP-produced DEM, ASP can create dense correspondences\n   between hillshaded versions of these, that can be passed to the\n   ``dem2gcp`` program (:numref:`dem2gcp`) to produce dense GCP. This can help\n   correct warping in the ASP-produced DEM, by either solving for lens distortion\n   or jitter.\n  \n.. _multiview:\n\nMulti-view stereo\n~~~~~~~~~~~~~~~~~\n\nASP supports multi-view stereo at the triangulation stage. This mode is\n*discouraged*. \n\nSee instead :numref:`sfm_multiview` for an approach based on pairwise stereo.\n\nIf using this multiview stereo mode (not suggested), the first image is set as\nreference, disparities are computed from it to all the other images, and then\njoint triangulation is performed :cite:`slabaugh2001optimal`. A single point\ncloud is generated with one 3D point for each pixel in the first image. The\ninputs to multi-view stereo and its output point cloud are handled in the same\nway as for two-view stereo (e.g., inputs can be mapprojected, the output can be\nconverted to a DEM, etc.).\n\nIt is suggested that images be bundle-adjusted (:numref:`baasp`)\nbefore running multi-view stereo.\n\nExample (for ISIS with three images)::\n\n     parallel_stereo file1.cub file2.cub file3.cub results/run\n\nExample (for DigitalGlobe/Maxar data with three mapprojected images)::\n\n     parallel_stereo file1.tif file2.tif file3.tif \\\n       file1.xml file2.xml file3.xml               \\\n       results/run input-DEM.tif\n\nFor a sequence of images, multi-view stereo can be run several times\nwith each image as a reference, and the obtained point clouds combined\ninto a single DEM using ``point2dem`` (:numref:`point2dem`).\n\nThe ray intersection error, the fourth band in the point cloud file, is\ncomputed as twice the mean of distances from the optimally computed\nintersection point to the individual rays. For two rays, this agrees\nwith the intersection error for two-view stereo which is defined as the\nminimal distance between rays. For multi-view stereo this error is much\nless amenable to interpretation than for two-view stereo, since the\nnumber of valid rays corresponding to a given feature can vary across\nthe image, which results in discontinuities in the intersection error.\n\n.. |times| unicode:: U+00D7 .. MULTIPLICATION SIGN\n"
  },
  {
    "path": "docs/outputfiles.rst",
    "content": ".. _outputfiles:\n\nGuide to output files\n=====================\n\nThe ``parallel_stereo`` program (:numref:`parallel_stereo`) generates a variety\nof intermediate files that are useful for debugging. These are listed below,\nalong with brief descriptions about the contents of each file. \n\nSome of these files are stored at the location given by the specified\noutput prefix, while others are in subdirectories of that location\ncorresponding to individual tiles created by ``parallel_stereo``.\n\nThe files are listed based on the stereo stage they are created at\n(:numref:`parallel_stereo`).\n\nFiles created in preprocessing\n------------------------------\n\n\\*-cropped\\*.tif \n    Cropped versions of the input images, before alignment, when options\n    ``--left-image-crop-win`` and/or ``--right-image-crop-win`` are used.\n\n\\*.vwip \n    Interest point matches per image, before matching.\n    \n    If the images are ``left.cub`` and ``right.cub``, these files end in\n    ``left.vwip`` and ``right.vwip``. Several interest point detection modes are\n    available (see ``--ip-detect-method`` in :numref:`stereodefault`).\n    \n    The ``.vwip`` files can be visualized in ``stereo_gui``\n    (:numref:`stereo_gui_vwip_gcp`).\n\n\\*.match - image-to-image interest point matches (tie-points)\n    The match file lists a select group of unique points out of the previous\n    ``.vwip`` files that have been identified and matched in a pair of images.\n    For example, if the input images are ``left.cub`` and ``right.cub``, the\n    match file will end in ``left__right.match``.\n\n    The ``.vwip`` and ``.match`` files are meant to serve as cached tie-point\n    information, and they help speed up the pre-processing phase of the Stereo\n    Pipeline. If these files exist, then the ``parallel_stereo`` program will\n    skip over the interest point alignment stage and instead use the cached\n    tie-points contained in the ``*.match`` files, unless the images or cameras\n    are newer, or if invoked with the options ``--left-image-crop-win`` or\n    ``--right-image-crop-win``. In the rare case that these files get \n    corrupted, they should be deleted and ``parallel_stereo`` should be rerun.\n    \n    The ``.match`` files can be visualized in ``stereo_gui``\n    (:numref:`stereo_gui_view_ip`), and can be converted to plain text for\n    inspection with ``parse_match_file.py`` (:numref:`parse_match_file`).\n\n    This program supports plain-text match files (:numref:`txt_match`).\n\n\\*-L.tif - rectified left input image\n    Left input image of the stereo pair, after the pre-processing\n    step, which may involve cropping, normalization of pixel values,\n    and alignment.\n\n\\*-R.tif - rectified right input image\n    Right input image of the stereo pair, after the pre-processing\n    step, which may involve cropping, normalization of pixel values,\n    and alignment.\n\n\\*-lMask.tif - mask for left rectified image\n    This file and \\*-rMask.tif contain binary masks for the input\n    images. They are used throughout the stereo process to mask\n    out pixels where there is no input data.\n\n\\*-rMask.tif - mask for right rectified image\n    See \\*-lMask.tif, above.\n\n\\*-align-L.txt and R.txt - left and right alignment matrices\n    These 3 |times| 3 affine transformation matrices that are used to warp the\n    left and right images to roughly align them. These are only generated if\n    ``alignment-method`` is not ``none`` or ``epipolar``\n    (:numref:`stereodefault`).\n    \n    The older .exr format for these is still supported on reading but will be\n    removed in the future. \n\n\\*bathy_mask\\*.tif - data related to water-land masks, for stereo with\n    shallow water (:numref:`bathy_intro`).\n\n\\*-L_sub.tif, \\*-R_sub.tif, \\*-lMask_sub.tif, \\*-rMask_sub.tif are\n    low-resolution versions of the aligned left and right input images\n    and corresponding masks.\n\n\\*-stereo.default - backup of the Stereo Pipeline settings file\n    This is a copy of the ``stereo.default`` file used by ``parallel_stereo``.\n    It is stored alongside the output products as a record of the\n    settings that were used for this particular stereo processing task.\n\n.. _out_corr_files:\n\nFiles created during correlation\n--------------------------------\n\n\\*-D_sub.tif - Low-resolution initial disparity (:numref:`d_sub`). \n    Computed at the correlation stage. Not recomputed when a run is\n    resumed. The options ``--corr-seed-mode 2`` and ``3`` also produce\n    \\*-D_sub_spread.tif, which has the spread of this disparity. It is \n    in the same format as ``D.tif`` (below).\n    \n\\*-D.tif - Full-resolution disparity map produced from the low-resolution disparity\n    \n    The disparity shows the amount of horizontal and vertical shift between left\n    and right images, in units of pixel (:numref:`stereo_corr`). The ``D.tif``\n    file contains a preliminary disparity that is used to seed the subsequent\n    sub-pixel correlation. It is largely unfiltered, and may contain some bad\n    matches.\n\n    Disparity map files are stored in TIF format as 3-channel, 32-bit\n    floating point images. Channel 0 = horizontal disparity, channel 1 =\n    vertical disparity, and channel 2 = good pixel mask.\n    \n    The ``disparitydebug`` program (:numref:`disparitydebug`) can help inspect\n    scaled versions of these. Or the raw bands can be extracted and visualized\n    as in :numref:`mask_disparity`.\n\n\\*-L-R-disp-diff.tif - the discrepancy between left-to-right and right-to-left\n    disparities. See option ``--save-left-right-disparity-difference``\n    in :numref:`stereodefault` for more details.\n\n\\*-PC_sub.tif - triangulated point cloud image.\n   Made from the low-resolution disparity ``D_sub.tif`` (created after\n   filtering this disparity; will be written unless disparity\n   filtering is disabled, see ``outlier-removal-params``).\n\nFiles created during blending\n-----------------------------\n\n\\*-B.tif - disparity map blending the D.tif results from all tiles. Will be \n    produced unless using the ``asp_bm`` stereo algorithm without local \n    epipolar alignment.  It is in the same format as ``D.tif`` (above).\n\nFiles created during refinement\n-------------------------------\n\n\\*-RD.tif - disparity map after sub-pixel correlation\n    This file contains the disparity map after sub-pixel refinement.\n    Pixel values now have sub-pixel precision, and some outliers have\n    been rejected by the sub-pixel matching process.  It is \n    in the same format as ``D.tif`` (above).\n\nFile created during filtering\n-----------------------------\n\n\\*-F-corrected.tif - intermediate data product\n    Only created when ``alignment-method`` is not ``none``. This is\n    ``*-F.tif`` with effects of interest point alignment removed.\n\n\\*-F.tif - filtered disparity map\n    The filtered, sub-pixel disparity map with outliers removed (and\n    holes filled with the inpainting algorithm if ``FILL_HOLES`` is\n    on). This is the final version of the disparity map. It is \n    in the same format as ``D.tif`` (above).\n\n\\*-GoodPixelMap.tif - map of good pixels. \n    An image showing which pixels were matched by the stereo\n    correlator (gray pixels), and which were filled in by the hole filling\n    algorithm (red pixels).\n\n.. _triangulation_files:\n\nFiles created at triangulation\n------------------------------\n\n\\*-PC.tif - point cloud image\n    The point cloud image is generated by the triangulation phase of\n    Stereo Pipeline. Each pixel in the point cloud image corresponds to\n    a pixel in the left input image (\\*-L.tif). The point cloud has four\n    channels, the first three are the Cartesian coordinates of each\n    point, and the last one has the intersection error of the two rays\n    which created that point (:numref:`triangulation_error`). By default,\n    the origin of the Cartesian coordinate system being used is a\n    point in the neighborhood of the point cloud. \n    This makes the values of the points in the cloud\n    relatively small, and we save them in single precision (32 bits).\n    This origin is saved in the point cloud as well using the tag\n    ``POINT_OFFSET`` in the GeoTiff header. To output point clouds using\n    double precision with the origin at the planet center (ECEF), call\n    ``stereo_tri`` with the option\n    ``--save-double-precision-point-cloud``. This can effectively\n    double the size of the point cloud.\n\n    If the option ``--compute-error-vector`` (:numref:`triangulation_options`)\n    or ``--propagate-errors`` (:numref:`error_propagation`) is set,\n    the point cloud will have 6 channels. The first 3 channels store,\n    as before, the triangulated points.\n\n\\*-PC-center.txt - the point cloud local origin (add this to cloud points \n    to convert them to ECEF). Stored in plain text. Has the same information as\n    the ``POINT_OFFSET`` header in ``PC.tif``.\n\n.. _stereo_diag:\n\nDiagnostics files\n-----------------\n\n\\*-stereo-status.txt - processing status file\n\n    As ``parallel_stereo`` runs, it updates this file. It records the current\n    processing step (:numref:`entrypoints`), the number of done tiles, and the\n    total number of tiles (both for the current step). See :numref:`ps_tiling`\n    for more details on tiling.\n\n    For the preprocessing and filtering stages tiling is not done. Then, the number \n    of tiles is set to 1, and the number of done tiles is 0 if this stage is\n    in progress, and 1 if it is done.\n\n    The status is also printed to standard output as each tile gets done (unless\n    there is only one tile).\n\n\\*-tiles.shp - shapefile having the tiles\n\n    This file saves the tiles used in processing (:numref:`ps_tiling`). Each is\n    shown as a rectangle (the units are described below). This file is produced\n    only by ``parallel_stereo``, and not by ``stereo``. The padding of each tile\n    (for ``asp_mgm`` for example) is not included.\n\n    A file named ``*-tiles.qml`` is also created. With this one present, when\n    the shapefile is opened in QGIS, the tile index (an integer starting with\n    zero) will be printed inside each tile. \n    \n    The ``stereo_gui`` program (:numref:`plot_poly`) can also read and display\n    this shapefile and the indices.\n    \n    Note that the actual tile list is saved in ``*-dirList.txt``.\n\n    When the images are mapprojected, the shapefile is saved in the projection\n    of the ``L.tif`` image and can be overlaid on top ``L.tif`` and ``R.tif`` in\n    QGIS and ``stereo_gui``. \n    \n    Otherwise the shapefile is in pixel units. The y coordinate is then written\n    with the negative sign, so that the shapefile appears correctly on top of \n    ``L.tif`` and ``R.tif`` in QGIS and ``stereo_gui``.\n\n.. _out_log_files:\n\nOther files created at all stages\n---------------------------------\n\n\\*-log* - log files\n    Each program invoked by ``parallel_stereo`` writes a log file containing the\n    command name, build information, and various messages output by that\n    program. Those are saved to the output prefix location, or to tile\n    subdirectories, depending on the stage of processing. \n    \n    The tiles are deleted after a successful run, which makes the log files in\n    subdirectories go away. See the ``--keep-only`` option\n    (:numref:`ps_options`) for how to keep all data, including the log files.\n    \n\\*-<program name>-resource-usage.txt - resource usage files\n    For Linux, write such a file for each ``parallel_stereo`` subprocess. It\n    contains the elapsed time and memory usage, as output by ``/usr/bin/time``.\n    These are written to tile subdirectories, and are deleted after a successful\n    run. See the ``--keep-only`` option for how to keep all files.\n\nInspection and properties of the output files\n---------------------------------------------\n\nAll the output images that are single-band can be visualized in\n``stereo_gui`` (:numref:`stereo_gui`). The disparities can be first\nsplit into the individual horizontal and vertical disparity files\nusing ``disparitydebug`` (:numref:`disparitydebug`), then they can be\nseen in this viewer as well.\n\nIf the input images are map-projected (georeferenced) and the\nalignment method is ``none``, all the output images listed above, will\nalso be georeferenced, and hence can be overlaid in ``stereo_gui`` on\ntop of the input images (the outputs of ``disparitydebug`` will then\nbe georeferenced as well).\n\nThe point cloud file saves the datum (and projection if available)\ninferred from the input images, regardless of whether these images\nare map-projected or not.\n\nThe ``point2mesh`` (:numref:`point2mesh`) and ``point2dem``\n(:numref:`point2dem`) programs can be used to convert the point cloud\nto formats that are easier to visualize.\n\n.. _txt_match:\n\nPlain text match files\n----------------------\n\nASP programs store interest point matches between two images as a match file, in\neither binary format with a ``.match`` extension, or in plain text format, with a\n``.txt`` extension. The latter is supported as of build 2026/02\n(:numref:`release`). \n\nPlain text matches are provided for use with external logic for interest point\nmatching. The next sections describe how to use such files and their format.\n\nWhen there are multiple images, one may use pairwise match files or a control\nnetwork format. See :numref:`control_network`.\n\nTurn on plain text matches\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nBy default, ASP programs work with binary match files. The switch\n``--matches-as-txt`` will enable reading and writing plain text match files\ninstead. In that case, all existing ``.match`` files will be ignored.\n\nThis applies to :ref:`bundle_adjust`, :ref:`parallel_stereo`,\n:ref:`jitter_solve`, :ref:`image_align`, :ref:`gcp_gen`, and :ref:`ipmatch`.\n\nConversions between these formats can be done with ``ipmatch``\n(:numref:`ipmatch_convert`). Do not use the ``parse_match_file.py``\n(:numref:`parse_match_file`) program as that one has a different purpose.\n\nNaming convention\n~~~~~~~~~~~~~~~~~\n\nGiven two images ``input/image1.tif`` and ``input/image2.tif``, and given an\noutput prefix such as ``out/run``, the plain-text match file name will be::\n\n    out/run-image1__image2.txt\n\nBinary match files will have the same format but will end in ``.match``.\n\nThe ``bundle_adjust`` program needs to be invoked with the input images and::\n\n  --match-files-prefix out/run\n  \nto read the above file. The same option is also available for\n``parallel_stereo`` and ``jitter_solve``.\n\nIndividual image names (without the path and extension) will be truncated to 60\ncharacters to avoid excessively long file names and problems with some\nlibraries. It is suggested to avoid using such long file names in the first\nplace.\n\n.. _txt_format:\n\nFile format\n~~~~~~~~~~~\n\nEach line in a plain-text match file will have six numbers, in float precision,\nseparated by spaces::\n\n    x1 y1 unc1 x2 y2 unc2\n\nHere, ``x1 y1`` are the coordinates of an interest point in the first image\n(column and row, starting from 0), ``unc1`` is its uncertainty (in pixels), and\n``x2 y2 unc2`` are the corresponding values for the second image. In bundle\nadjustment each pixel is weighted by the inverse of its uncertainty. The\nuncertainties must be positive.\n\nNote that this is not the same format as in ``parse_match_file.py``\n(:numref:`parse_match_file`). \n\nInspection\n~~~~~~~~~~\n\nTo view plain text match files use ``stereo_gui`` (:numref:`stereo_gui_view_ip`)\nas::\n\n    stereo_gui               \\\n      --matches-as-txt       \\\n      image1.tif image2.tif  \\\n      --match-file out/run-image1__image2.txt\n\n.. _poly_files:\n\nFormat of polygon files\n-----------------------\n\nThe ``stereo_gui`` program can read and write polygons in the shapefile format,\nand also in in plain text with a ``.txt`` or ``.csv`` extension\n(:numref:`plot_poly`). Here the plain text format is described.\n\nThe x and y coordinates are stored as columns side-by side. Individual polygons\nare separated by an empty line. A color for the polygons is specified as a line\nof the form: ``color = red``. The given color applies to all polygons on\nsubsequent lines until overridden by another such statement. How to create and\nsave such files is shown in :numref:`plot_poly`.\n\nWhen such polygons are saved, a header will be added to the file, consisting of\nlines starting with the pound sign, containing the WKT string for the\ngeoreference, the value of ``--csv-format`` to interpret the vertices, and the\nstyle (usually set to ``poly``). This allows for overlaying polygons with\ndifferent georeferences in ``stereo_gui``.\n\nThe plain text polygon file supports text labels. They should be on lines that\nstart with the text ``anno`` (annotation), followed by a space, then the x and y\ncoordinates, separated by spaces, then the text label.\n\n.. |times| unicode:: U+00D7 .. MULTIPLICATION SIGN\n"
  },
  {
    "path": "docs/papersusingasp.bib",
    "content": "@article{2014NatCo...5E3417L,\n\tAdsnote = {Provided by the SAO/NASA Astrophysics Data System},\n\tAdsurl = {http://adsabs.harvard.edu/abs/2014NatCo...5E3417L},\n\tAuthor = {{Lucas}, A. and {Mangeney}, A. and {Ampuero}, J.~P.},\n\tDate-Added = {2014-03-25 00:01:22 +0000},\n\tDate-Modified = {2014-03-25 00:01:22 +0000},\n\tEid = {3417},\n\tJournal = {Nature Communications},\n\tMonth = mar,\n\tTitle = {{Frictional velocity-weakening in landslides on Earth and on other planetary bodies}},\n\tVolume = 5,\n\tYear = 2014,\n\tBdsk-Url-1 = {http://dx.doi.org/10.1038/ncomms4417}\n\t}\n\n@inproceedings{2014LPI....45.1211H,\n\tAdsnote = {Provided by the SAO/NASA Astrophysics Data System},\n\tAdsurl = {http://adsabs.harvard.edu/abs/2014LPI....45.1211H},\n\tAuthor = {{Hughes}, A.~C.~G. and {Hauber}, E. and {Rossi}, A.~P.},\n\tBooktitle = {Lunar and Planetary Science Conference 45},\n\tDate-Added = {2014-03-24 23:57:03 +0000},\n\tDate-Modified = {2014-03-24 23:57:20 +0000},\n\tMonth = mar,\n\tNumber = {\\#1211},\n\tSeries = {Lunar and Planetary Institute Science Conference Abstracts},\n\tTitle = {{Geomorphology of Glacial and Periglacial Landforms Within a Small Crater in Terra Cimmeria, Mars: Stratigraphy and Inferred Chronology of Processes}},\n\tVolume = 45,\n\tYear = 2014}\n\n@inproceedings{2014LPI....45.1723L,\n\tAdsnote = {Provided by the SAO/NASA Astrophysics Data System},\n\tAdsurl = {http://adsabs.harvard.edu/abs/2014LPI....45.1723L},\n\tAuthor = {{Lucchetti}, A. and {Thomas}, R. and {Cremonese}, G. and {Massironi}, M. and {Rothery}, D.~A. and {Conway}, S.~J. and {Anand}, M.},\n\tBooktitle = {Lunar and Planetary Science Conference 45},\n\tDate-Added = {2014-03-24 23:52:55 +0000},\n\tDate-Modified = {2014-03-24 23:53:18 +0000},\n\tMonth = mar,\n\tNumber = {\\#1723},\n\tSeries = {Lunar and Planetary Institute Science Conference Abstracts},\n\tTitle = {{Analysis and Numerical Modeling of a Pit Crater on Mercury}},\n\tVolume = 45,\n\tYear = 2014}\n\n@inproceedings{2014LPI....45.2836W,\n\tAdsnote = {Provided by the SAO/NASA Astrophysics Data System},\n\tAdsurl = {http://adsabs.harvard.edu/abs/2014LPI....45.2836W},\n\tAuthor = {{Watters}, W.~A. and {Radford}, A.~C.},\n\tBooktitle = {Lunar and Planetary Science 45},\n\tDate-Added = {2014-03-24 23:46:59 +0000},\n\tDate-Modified = {2014-03-24 23:47:39 +0000},\n\tMonth = mar,\n\tNumber = {\\#2836},\n\tSeries = {Lunar and Planetary Institute Science Conference Abstracts},\n\tTitle = {{3-D Morphometry of Martian Secondary Impact Craters from Zunil and Gratteri}},\n\tVolume = 45,\n\tYear = 2014}\n\n@inproceedings{2013LPI....44.3081W,\n\tAdsnote = {Provided by the SAO/NASA Astrophysics Data System},\n\tAdsurl = {http://adsabs.harvard.edu/abs/2013LPI....44.3081W},\n\tAuthor = {{Watters}, W.~A. and {Geiger}, L. and {Fendrock}, M.},\n\tBooktitle = {Lunar and Planetary Science Conference 44},\n\tDate-Added = {2014-03-24 23:45:48 +0000},\n\tDate-Modified = {2014-03-24 23:46:59 +0000},\n\tMonth = mar,\n\tNumber = {\\#3081},\n\tSeries = {Lunar and Planetary Institute Science Conference Abstracts},\n\tTitle = {{Shape Distribution of Fresh Martian Impact Craters from High-Resolution DEMs}},\n\tVolume = 44,\n\tYear = 2013}\n\n@inproceedings{2010LPI....41.1863W,\n\tAdsnote = {Provided by the SAO/NASA Astrophysics Data System},\n\tAdsurl = {http://adsabs.harvard.edu/abs/2010LPI....41.1863W},\n\tAuthor = {{Watters}, T.~R. and {Robinson}, M.~S. and {Beyer}, R.~A. and {Bell}, J.~F. and {Pritchard}, M.~E. and {Banks}, M.~E. and {Turtle}, E.~P. and {Williams}, N.~R. and {LROC Team}},\n\tBooktitle = {Lunar and Planetary Science Conference 41},\n\tDate-Added = {2013-04-26 22:58:00 +0000},\n\tDate-Modified = {2013-04-26 22:58:00 +0000},\n\tEditor = {{Mackwell}, S. and {Stansbery}, E.},\n\tMonth = mar,\n\tNumber = {\\#1863},\n\tOrganization = {Lunar and Planetary Institute, Houston},\n\tTitle = {{Lunar Thrust Faults: Implications for the Thermal History of the Moon}},\n\tYear = 2010,\n\tBdsk-Url-1 = {http://adsabs.harvard.edu/abs/2010LPI....41.1863W}}\n\n@inproceedings{2010LPI....41.2678B,\n\tAdsnote = {Provided by the SAO/NASA Astrophysics Data System},\n\tAdsurl = {http://adsabs.harvard.edu/abs/2010LPI....41.2678B},\n\tAuthor = {{Beyer}, R.~A. and {Archinal}, B. and {Chen}, Y. and {Edmundson}, K. and {Harbour}, D. and {Howington-Kraus}, E. and {Li}, R. and {McEwen}, A. and {Mattson}, S. and {Moratto}, Z. and {Oberst}, J. and {Rosiek}, M. and {Scholten}, F. and {Tran}, T. and {Robinson}, M. and {LROC Team}},\n\tBooktitle = {Lunar and Planetary Science Conference 41},\n\tDate-Added = {2013-04-26 22:56:25 +0000},\n\tDate-Modified = {2013-04-26 22:56:25 +0000},\n\tEditor = {{Mackwell}, S. and {Stansbery}, E.},\n\tMonth = mar,\n\tNumber = {\\#2678},\n\tOrganization = {Lunar and Planetary Institute, Houston},\n\tTitle = {{LROC Stereo Data--Results of Initial Analysis}},\n\tYear = 2010,\n\tBdsk-Url-1 = {http://adsabs.harvard.edu/abs/2010LPI....41.2678B}}\n\n@article{2010AGUFM.P21B1596P,\n\tAdsnote = {Provided by the SAO/NASA Astrophysics Data System},\n\tAdsurl = {http://adsabs.harvard.edu/abs/2010AGUFM.P21B1596P},\n\tAuthor = {{Phillips}, C.~B. and {Beyer}, R.~A. and {Nimmo}, F. and {Roberts}, J.~H. and {Robuchon}, G.},\n\tDate-Added = {2013-04-26 22:54:02 +0000},\n\tDate-Modified = {2013-04-26 22:54:02 +0000},\n\tJournal = {AGU Fall Meeting Abstracts},\n\tKeywords = {[5420] PLANETARY SCIENCES: SOLID SURFACE PLANETS / Impact phenomena, cratering, [5455] PLANETARY SCIENCES: SOLID SURFACE PLANETS / Origin and evolution, [6218] PLANETARY SCIENCES: SOLAR SYSTEM OBJECTS / Jovian satellites, [6280] PLANETARY SCIENCES: SOLAR SYSTEM OBJECTS / Saturnian satellites},\n\tMonth = dec,\n\tNumber = {\\#P21B-1596},\n\tTitle = {{Crater Relaxation and Stereo Imaging of the Icy Satellites of Jupiter and Saturn}},\n\tYear = 2010,\n\tBdsk-Url-1 = {http://adsabs.harvard.edu/abs/2010AGUFM.P21B1596P}}\n\n@inproceedings{2011LPI....42.2267M,\n\tAuthor = {{Moratto}, Z. and Nefian, A. and {Kim}, T. and {Broxton}, M. and {Beyer}, R.~A. and Fong, T.},\n\tBooktitle = {Lunar and Planetary Science Conference 42},\n\tDate-Added = {2013-04-26 22:52:38 +0000},\n\tDate-Modified = {2013-04-26 22:52:38 +0000},\n\tEditor = {{Mackwell}, S. and {Stansbery}, E.},\n\tNumber = {\\#2267},\n\tOrganization = {Lunar and Planetary Institute, Houston},\n\tTitle = {{Stereo Reconstruction from Apollo 15 and 16 Metric Camera}},\n\tYear = {2011}}\n\n@inproceedings{2011LPI....42.2418L,\n\tAuthor = {{Lefort}, A. and {Burr}, D.~M. and {Beyer}, R.~A. and {Howard}, A.~D.},\n\tBooktitle = {Lunar and Planetary Science Conference 42},\n\tDate-Added = {2013-04-26 22:51:25 +0000},\n\tDate-Modified = {2013-04-26 22:51:25 +0000},\n\tEditor = {{Mackwell}, S. and {Stansbery}, E.},\n\tNumber = {\\#2418},\n\tOrganization = {Lunar and Planetary Institute, Houston},\n\tTitle = {Topographic Post-Formation Modifications of Inverted Fluvial Features in the Western {Medusa Fossae} Formation, {Mars}},\n\tYear = {2011}}\n\n@inproceedings{2011LPI....42.2633H,\n\tAuthor = {Hammond, N. P. and C. B. Phillips and G. Robuchon and {Beyer}, R.~A. and Nimmo, F. and J. Roberts},\n\tBooktitle = {Lunar and Planetary Science Conference 42},\n\tDate-Added = {2013-04-26 22:50:53 +0000},\n\tDate-Modified = {2013-04-26 22:50:53 +0000},\n\tEditor = {{Mackwell}, S. and {Stansbery}, E.},\n\tNumber = {\\#2633},\n\tOrganization = {Lunar and Planetary Institute, Houston},\n\tTitle = {Crater Relaxation and Stereo Imaging of {Rhea}},\n\tYear = {2011}}\n\n@inproceedings{2011LPI....42.2715B,\n\tAuthor = {{Beyer}, R.~A. and {Archinal}, B. and Y. Cheng and {Edmundson}, K. and {Howington-Kraus}, E. and {Kirk}, R.~L. and {Li}, R. and {McEwen}, A.~S. and {Mattson}, S. and X. Meng and {Moratto}, Z. and {Oberst}, J. and {Rosiek}, M. and {Scholten}, F. and {Tran}, T. and O. Thomas and W. Wang and {the LROC Team}},\n\tBooktitle = {Lunar and Planetary Science Conference 42},\n\tDate-Added = {2013-04-26 22:49:58 +0000},\n\tDate-Modified = {2013-04-26 22:49:58 +0000},\n\tEditor = {{Mackwell}, S. and {Stansbery}, E.},\n\tNumber = {\\#2715},\n\tOrganization = {Lunar and Planetary Institute, Houston},\n\tTitle = {{LROC DTM} Comparison Effort},\n\tYear = {2011}}\n\n@article{2011AGUFM.P41F..07P,\n\tAdsnote = {Provided by the SAO/NASA Astrophysics Data System},\n\tAdsurl = {http://adsabs.harvard.edu/abs/2011AGUFM.P41F..07P},\n\tAuthor = {{Phillips}, C.~B. and {Hammond}, N.~P. and {Nimmo}, F. and {robuchon}, G. and {Beyer}, R.~A. and {Roberts}, J.~H.},\n\tDate-Added = {2013-04-26 22:48:22 +0000},\n\tDate-Modified = {2013-04-26 22:48:22 +0000},\n\tJournal = {AGU Fall Meeting Abstracts},\n\tKeywords = {[5418] PLANETARY SCIENCES: SOLID SURFACE PLANETS / Heat flow, [5420] PLANETARY SCIENCES: SOLID SURFACE PLANETS / Impact phenomena, cratering, [6280] PLANETARY SCIENCES: SOLAR SYSTEM OBJECTS / Saturnian satellites},\n\tMonth = dec,\n\tNumber = {\\#P41F-07},\n\tTitle = {{Crater Relaxation and Stereo Imaging of Icy Satellites}},\n\tYear = 2011,\n\tBdsk-Url-1 = {http://adsabs.harvard.edu/abs/2011AGUFM.P41F..07P}}\n\n@article{2012JGRE..117.3007L,\n\tAdsnote = {Provided by the SAO/NASA Astrophysics Data System},\n\tAdsurl = {http://adsabs.harvard.edu/abs/2012JGRE..117.3007L},\n\tAuthor = {{Lefort}, A. and {Burr}, D.~M. and {Beyer}, R.~A. and {Howard}, A.~D.},\n\tDate-Added = {2013-04-26 22:47:19 +0000},\n\tDate-Modified = {2013-04-26 22:47:19 +0000},\n\tEid = {E03007},\n\tJournal = {Journal of Geophysical Research (Planets)},\n\tKeywords = {Hydrology: Geomorphology: general (1625), Hydrology: Geomorphology: fluvial (1625), Planetary Sciences: Comets and Small Bodies: Surfaces, Planetary Sciences: Solar System Objects: Mars},\n\tMonth = mar,\n\tPages = {3007},\n\tTitle = {{Inverted fluvial features in the Aeolis-Zephyria Plana, western Medusae Fossae Formation, Mars: Evidence for post-formation modification}},\n\tVolume = 117,\n\tYear = 2012,\n\tBdsk-Url-1 = {http://dx.doi.org/10.1029/2011JE004008}}\n\n@inproceedings{2012LPI....43.1953L,\n\tAdsnote = {Provided by the SAO/NASA Astrophysics Data System},\n\tAdsurl = {http://adsabs.harvard.edu/abs/2012LPI....43.1953L},\n\tAuthor = {{Lefort}, A. and {Burr}, D.~M. and {Beyer}, R.~A. and {Howard}, A.~D.},\n\tBooktitle = {Lunar and Planetary Science Conference 43},\n\tDate-Added = {2013-04-26 22:46:30 +0000},\n\tDate-Modified = {2013-04-26 22:46:30 +0000},\n\tEid = {1953},\n\tMonth = mar,\n\tNumber = {\\#1953},\n\tTitle = {{Sinuous Ridges as Tools to Investigate Post-Flow Modification in the Aeolis-Zephyria Plana, Western Medusae Fossae Formation, Mars}},\n\tYear = 2012,\n\tBdsk-Url-1 = {http://adsabs.harvard.edu/abs/2012LPI....43.1953L}}\n\n@inproceedings{2012LPI....43.2571P,\n\tAdsnote = {Provided by the SAO/NASA Astrophysics Data System},\n\tAdsurl = {http://adsabs.harvard.edu/abs/2012LPI....43.2571P},\n\tAuthor = {{Phillips}, C.~B. and {Hammond}, N.~P. and {Robuchon}, G. and {Nimmo}, F. and {Beyer}, R.~A. and {Roberts}, J.},\n\tBooktitle = {Lunar and Planetary Science Conference 43},\n\tDate-Added = {2013-04-26 22:45:46 +0000},\n\tDate-Modified = {2013-04-26 22:45:46 +0000},\n\tEid = {2571},\n\tMonth = mar,\n\tNumber = {\\#2571},\n\tTitle = {{Stereo Imaging, Crater Relaxation, and Thermal Histories of Rhea and Dione}},\n\tYear = 2012,\n\tBdsk-Url-1 = {http://adsabs.harvard.edu/abs/2012LPI....43.2571P}}\n\n@inproceedings{2012LPI....43.2815M,\n\tAdsnote = {Provided by the SAO/NASA Astrophysics Data System},\n\tAdsurl = {http://adsabs.harvard.edu/abs/2012LPI....43.2815M},\n\tAuthor = {{Morgan}, A.~M. and {Beyer}, R.~A. and {Howard}, A.~D. and {Moore}, J.~M.},\n\tBooktitle = {Lunar and Planetary Science Conference 43},\n\tDate-Added = {2013-04-26 22:44:21 +0000},\n\tDate-Modified = {2013-04-26 22:44:21 +0000},\n\tEid = {2815},\n\tMonth = mar,\n\tNumber = {\\#2815},\n\tTitle = {{The Alluvial Fans of Saheki Crater}},\n\tYear = 2012,\n\tBdsk-Url-1 = {http://adsabs.harvard.edu/abs/2012LPI....43.2815M}}\n\n@inproceedings{2013LPICo1719.2766P,\n\tAdsnote = {Provided by the SAO/NASA Astrophysics Data System},\n\tAdsurl = {http://adsabs.harvard.edu/abs/2013LPICo1719.2766P},\n\tAuthor = {{Phillips}, C.~B. and {Hammond}, N.~P. and {Roberts}, J.~H. and {Nimmo}, F. and {Beyer}, R.~A. and {Kattenhorn}, S.},\n\tBooktitle = {Lunar and Planetary Science Conference 44},\n\tDate-Added = {2013-04-26 22:42:21 +0000},\n\tDate-Modified = {2013-04-26 22:42:21 +0000},\n\tJournal = {LPI Contributions},\n\tMonth = mar,\n\tNumber = {\\#2766},\n\tTitle = {{Stereo Topography and Subsurface Thermal Profiles on Icy Satellites of Saturn}},\n\tYear = 2013}\n\n@article{2013LPICo1719.2966O,\n\tAdsnote = {Provided by the SAO/NASA Astrophysics Data System},\n\tAdsurl = {http://adsabs.harvard.edu/abs/2013LPICo1719.2966O},\n\tAuthor = {{{\\\"O}hman}, T. and {McGovern}, P.~J.},\n\tDate-Added = {2013-04-26 22:32:13 +0000},\n\tDate-Modified = {2013-04-26 22:32:13 +0000},\n\tJournal = {LPI Contributions},\n\tMonth = mar,\n\tPages = {2966},\n\tTitle = {{Strain Calculations for Circumferential Graben on Alba Mons, Mars}},\n\tVolume = 1719,\n\tYear = 2013}\n\n@article{Golombek:2012ys,\n\tAuthor = {Golombek, M. and Grant, J. and Kipp, D. and Vasavada, A. and Kirk, R. and Fergason, R. and Bellutta, P. and Calef, F. and Larsen, K. and Katayama, Y. and Huertas, A. and Beyer, R. and Chen, A. and Parker, T. and Pollard, B. and Lee, S. and Sun, Y. and Hoover, R. and Sladek, H. and Grotzinger, J. and Welch, R. and Noe Dobrea, E. and Michalski, J. and Watkins, M.},\n\tDate-Added = {2013-04-26 19:09:50 +0000},\n\tDate-Modified = {2013-04-26 19:09:50 +0000},\n\tIssn = {0038-6308},\n\tJournal = {Space Science Reviews},\n\tKeywords = {Landing sites; Mars; Surface materials; Surface characteristics; Mars Science Laboratory},\n\tLanguage = {English},\n\tNumber = {1-4},\n\tPages = {641-737},\n\tPublisher = {Springer Netherlands},\n\tTitle = {Selection of the {Mars Science Laboratory} Landing Site},\n\tUrl = {http://dx.doi.org/10.1007/s11214-012-9916-y},\n\tVolume = {170},\n\tYear = {2012},\n\tBdsk-Url-1 = {http://dx.doi.org/10.1007/s11214-012-9916-y}}\n\n@article{JGRE:JGRE2993,\n\tAuthor = {{\\\"O}hman, Teemu and Kring, David A.},\n\tDate-Added = {2013-04-26 18:50:46 +0000},\n\tDate-Modified = {2013-04-26 18:50:46 +0000},\n\tIssn = {2156-2202},\n\tJournal = {Journal of Geophysical Research: Planets},\n\tKeywords = {impact cratering, impact melts, lunar craters, lunar exploration, rheology},\n\tNumber = {E12},\n\tPages = {n/a--n/a},\n\tTitle = {Photogeologic analysis of impact melt-rich lithologies in {Kepler} crater that could be sampled by future missions},\n\tUrl = {http://dx.doi.org/10.1029/2011JE003918},\n\tVolume = {117},\n\tYear = {2012},\n\tBdsk-Url-1 = {http://dx.doi.org/10.1029/2011JE003918}}\n\n@article{Hammond2013418,\n\tAuthor = {N.P. Hammond and C.B. Phillips and F. Nimmo and S.A. Kattenhorn},\n\tDate-Added = {2013-04-26 18:48:50 +0000},\n\tDate-Modified = {2013-04-26 18:48:50 +0000},\n\tIssn = {0019-1035},\n\tJournal = {Icarus},\n\tKeywords = {Tectonics},\n\tNumber = {1},\n\tPages = {418 - 422},\n\tTitle = {Flexure on {Dione}: Investigating subsurface structure and thermal history},\n\tUrl = {http://www.sciencedirect.com/science/article/pii/S0019103513000043},\n\tVolume = {223},\n\tYear = {2013},\n\tBdsk-Url-1 = {http://www.sciencedirect.com/science/article/pii/S0019103513000043},\n\tBdsk-Url-2 = {http://dx.doi.org/10.1016/j.icarus.2012.12.021}}\n\n@article{Peel2013,\n\tAuthor = {Samantha E. Peel and Caleb I. Fassett},\n\tDate-Added = {2013-04-26 18:46:01 +0000},\n\tDate-Modified = {2013-04-26 18:46:01 +0000},\n\tIssn = {0019-1035},\n\tJournal = {Icarus},\n\tKeywords = {Pit Craters},\n\tNumber = {0},\n\tPages = {-},\n\tTitle = {Valleys in Pit Craters on {Mars}: Characteristics, Distribution, and Formation Mechanisms},\n\tUrl = {http://www.sciencedirect.com/science/article/pii/S0019103513001474},\n\tYear = {2013},\n\tBdsk-Url-1 = {http://www.sciencedirect.com/science/article/pii/S0019103513001474},\n\tBdsk-Url-2 = {http://dx.doi.org/10.1016/j.icarus.2013.03.031}}\n\n@article{doi:10.1117/12.974524,\n\tAuthor = {Re, Cristina and Cremonese, Gabriele and Dall'Asta, Elisa and Forlani, Gianfranco and Naletto, Giampiero and Roncella, Riccardo},\n\tDate-Added = {2013-04-26 18:40:24 +0000},\n\tDate-Modified = {2013-04-26 18:41:53 +0000},\n\tJournal = {Proc. SPIE 8537, Image and Signal Processing for Remote Sensing XVIII},\n\tPages = {85370V-85370V-12},\n\tTitle = {Performance evaluation of {DTM} area-based matching reconstruction of {Moon} and {Mars}},\n\tUrl = {http://dx.doi.org/10.1117/12.974524},\n\tYear = {2012},\n\tBdsk-Url-1 = {+%20http://dx.doi.org/10.1117/12.974524},\n\tBdsk-Url-2 = {http://dx.doi.org/10.1117/12.974524}}\n\n@article{ROB:ROB20410,\n\tAuthor = {SunSpiral, Vytas and Wheeler, D.W. and Chavez-Clemente, Daniel and Mittman, David},\n\tDate-Added = {2013-04-26 18:34:31 +0000},\n\tDate-Modified = {2013-04-26 18:34:31 +0000},\n\tIssn = {1556-4967},\n\tJournal = {Journal of Field Robotics},\n\tNumber = {3},\n\tPages = {483--505},\n\tPublisher = {Wiley Subscription Services, Inc., A Wiley Company},\n\tTitle = {Development and field testing of the {FootFall} planning system for the {ATHLETE} robots},\n\tUrl = {http://dx.doi.org/10.1002/rob.20410},\n\tVolume = {29},\n\tYear = {2012},\n\tBdsk-Url-1 = {http://dx.doi.org/10.1002/rob.20410}}\n\n@article{Huffman20111273,\n\tAuthor = {John Huffman and Andrew Forsberg and Andrew Loomis and James Head and James Dickson and Caleb Fassett},\n\tDate-Added = {2013-04-26 18:30:45 +0000},\n\tDate-Modified = {2013-04-26 18:30:45 +0000},\n\tIssn = {0032-0633},\n\tJournal = {Planetary and Space Science},\n\tKeywords = {Mars stereo visualization workflow analysis},\n\tNumber = {11--12},\n\tPages = {1273 - 1279},\n\tTitle = {Integrating advanced visualization technology into the planetary Geoscience workflow},\n\tUrl = {http://www.sciencedirect.com/science/article/pii/S0032063310002175},\n\tVolume = {59},\n\tYear = {2011},\n\tBdsk-Url-1 = {http://www.sciencedirect.com/science/article/pii/S0032063310002175},\n\tBdsk-Url-2 = {http://dx.doi.org/10.1016/j.pss.2010.07.015}\n}\n\n\n@article{stevens2015greenland,\n  title={{Greenland} supraglacial lake drainages triggered by hydrologically induced basal slip},\n  author={Stevens, Laura A and Behn, Mark D and McGuire, Jeffrey J and Das, Sarah B and Joughin, Ian and Herring, Thomas and Shean, David E and King, Matt A},\n  journal={Nature},\n  volume={522},\n  number={7554},\n  pages={73--76},\n  year={2015},\n  publisher={Nature Publishing Group}\n}\n\n@article{willis2015outlet,\n  title={Outlet glacier response to the 2012 collapse of the {Matusevich Ice Shelf, Severnaya Zemlya, Russian Arctic}},\n  author={Willis, Michael J and Melkonian, Andrew K and Pritchard, Matthew E},\n  journal={Journal of Geophysical Research: Earth Surface},\n  volume={120},\n  number={10},\n  pages={2040--2055},\n  year={2015},\n  publisher={Wiley Online Library}\n}\n\n@article{shean2016automated,\n  title={An automated, open-source pipeline for mass production of digital elevation models ({DEMs}) from very-high-resolution commercial stereo satellite imagery},\n  author={Shean, David E and Alexandrov, Oleg and Moratto, Zachary M and Smith, Benjamin E and Joughin, Ian R and Porter, Claire and Morin, Paul},\n  journal={ISPRS Journal of Photogrammetry and Remote Sensing},\n  volume={116},\n  pages={101--117},\n  year={2016},\n  publisher={Elsevier}\n}\n\n@article{lacroix2016landslides,\n  title={Landslides triggered by the {Gorkha} earthquake in the {Langtang} valley, volumes and initiation processes},\n  author={Lacroix, Pascal},\n  journal={Earth, Planets and Space},\n  volume={68},\n  number={1},\n  pages={1--10},\n  year={2016},\n  publisher={Springer}\n}\n\n\n@article{pope2016estimating,\n  title={Estimating supraglacial lake depth in {West Greenland} using {Landsat 8} and comparison with other multispectral methods},\n  author={Pope, Allen and Scambos, TA and Moussavi, M and Tedesco, M and Willis, M and Shean, D and Grigsby, S},\n  journal={The Cryosphere},\n  volume={10},\n  pages={15},\n  year={2016}\n}\n\n@article{melkonian2016recent,\n  title={Recent changes in glacier velocities and thinning at {Novaya Zemlya}},\n  author={Melkonian, Andrew K and Willis, Michael J and Pritchard, Matthew E and Stewart, Adam J},\n  journal={Remote Sensing of Environment},\n  volume={174},\n  pages={244--257},\n  year={2016},\n  publisher={Elsevier}\n}\n\n\n@article{Montesano201776,\ntitle = \"The use of sun elevation angle for stereogrammetric boreal forest height in open canopies\",\njournal = \"Remote Sensing of Environment\",\nvolume = \"196\",\nnumber = \"\",\npages = \"76 - 88\",\nyear = \"2017\",\nnote = \"\",\nissn = \"0034-4257\",\nurl = \"http://www.sciencedirect.com/science/article/pii/S0034425717301827\",\nauthor = \"Paul M. Montesano and Christopher Neigh and Guoqing Sun and Laura Duncanson and Jamon Van Den Hoek and K. Jon Ranson\",\nkeywords = {\"WorldView\", \"Sun elevation angle\", \"Forest structure\", \"Biome boundary\", \"Ecotone\", \"Taiga\", \"Tundra\", \"Stereogrammetry\", \"Photogrammetry\", \"Digital surface model\"}\n}\n\n@article{stereosfsfusion,\ntitle = \"Fusion of photogrammetric and photoclinometric information for high-resolution {DEMs} from {Mars} in-orbit imagery\",\njournal = \"ISPRS Journal of Photogrammetry and Remote Sensing\",\nvolume = \"130\",\nnumber = \"\",\npages = \"Pages 418-430\",\nyear = \"2017\",\nnote = \"\",\nissn = \"\",\nurl = \"http://www.sciencedirect.com/science/article/pii/S0924271616306554\",\nauthor = \"Cheng Jiang and Sylvain Dout\\'e and Bin Luob and Liangpei Zhang\"\n}\n\n@article{tc-11-1501-2017,\nAUTHOR = {Belart, J. M. C. and Berthier, E. and Magn\\'usson, E. and Anderson, L. S. and P\\'alsson, F. and Thorsteinsson, T. and Howat, I. M. and A\\dh{}algeirsd\\'ottir, G. and J\\'ohannesson, T. and Jarosch, A. H.},\nTITLE = {Winter mass balance of {Drangaj\\\"{o}kull} ice cap ({NW Iceland}) derived from\nsatellite sub-meter stereo images},\nJOURNAL = {The Cryosphere},\nVOLUME = {11},\nYEAR = {2017},\nNUMBER = {3},\nPAGES = {1501--1517},\nURL = {https://www.the-cryosphere.net/11/1501/2017/},\n}\n\n\n@INPROCEEDINGS{2012EGUGA..14.8723A,\n       author = {{Allemand}, P. and {Deschamps}, A. and {Lesaout}, M. and {Delacourt}, C.\n        and {Quantin}, C. and {Clenet}, H.},\n        title = \"{Magma rheology from {3D} geometry of martian lava flows}\",\n    booktitle = {EGU General Assembly Conference Abstracts},\n         year = 2012,\n       volume = {14},\n        month = Apr,\n        pages = {8723},\n       adsurl = {https://ui.adsabs.harvard.edu/\\#abs/2012EGUGA..14.8723A},\n      adsnote = {Provided by the SAO/NASA Astrophysics Data System}\n}\n\n@INPROCEEDINGS{2012LPI....43.2371L,\n       author = {{Laura}, J.~R. and {Miller}, D. and {Paul}, M.~V.},\n        title = \"{{Ames Stereo Pipeline} Derived {DEM} Accuracy Experiment Using {LROC-NAC}\n        Stereopairs and Weighted Spatial Dependence Simulation for {Lunar}\n        Site Selection}\",\n    booktitle = {Lunar and Planetary Science Conference},\n         year = 2012,\n        month = Mar,\n          eid = {2371},\n        pages = {2371},\n       adsurl = {https://ui.adsabs.harvard.edu/\\#abs/2012LPI....43.2371L},\n      adsnote = {Provided by the SAO/NASA Astrophysics Data System}\n}\n\n@INPROCEEDINGS{2014AGUFM.P34C..05M,\n       author = {{Mouginis-Mark}, P.~J. and {Boyce}, J.~M. and {Garbeil}, H.},\n        title = \"{Digital Elevation Models Aid the Analysis of Double Layered Ejecta ({DLE})\n        Impact Craters on {Mars}}\",\n     keywords = {5415 Erosion and weathering, PLANETARY SCIENCES: SOLID SURFACE PLANETS,\n        5455 Origin and evolution, PLANETARY SCIENCES: SOLID SURFACE\n        PLANETS, 5464 Remote sensing, PLANETARY SCIENCES: SOLID SURFACE\n        PLANETS, 5499 General or miscellaneous, PLANETARY SCIENCES:\n        SOLID SURFACE PLANETS},\n    booktitle = {AGU Fall Meeting Abstracts},\n         year = 2014,\n       volume = {2014},\n        month = Dec,\n          eid = {P34C-05},\n        pages = {P34C-05},\n       adsurl = {https://ui.adsabs.harvard.edu/\\#abs/2014AGUFM.P34C..05M},\n      adsnote = {Provided by the SAO/NASA Astrophysics Data System}\n}\n\n@INPROCEEDINGS{2014LPI....45.2892M,\n       author = {{Moratto}, Z.~M. and {McMichael}, S.~T. and {Beyer}, R.~A. and\n        {Alexandrov}, O. and {Fong}, T.},\n        title = \"{Automated and Accurate: Making {DTMs} from {LRO-NAC} Using the\n\t\t          {Ames Stereo Pipeline}}\",\n    booktitle = {Lunar and Planetary Science Conference},\n         year = 2014,\n        month = Mar,\n        pages = {2892},\n       adsurl = {https://ui.adsabs.harvard.edu/\\#abs/2014LPI....45.2892M},\n      adsnote = {Provided by the SAO/NASA Astrophysics Data System}\n}\n\n@INPROCEEDINGS{2014LPI....45.2902B,\n       author = {{Beyer}, R.~A. and {Alexandrov}, O. and {Moratto}, Z.~M.},\n        title = \"{Aligning Terrain Model and Laser Altimeter Point Clouds with the {Ames\n        Stereo Pipeline}}\",\n    booktitle = {Lunar and Planetary Science Conference},\n         year = 2014,\n        month = Mar,\n        pages = {2902},\n       adsurl = {https://ui.adsabs.harvard.edu/\\#abs/2014LPI....45.2902B},\n      adsnote = {Provided by the SAO/NASA Astrophysics Data System}\n}\n\n@INPROCEEDINGS{2013AGUFM.P53A1846P,\n       author = {{Phillips}, C.~B. and {El Henson}, E. and {Nimmo}, F.},\n        title = \"{Stereo Topography of Surface Features on Europa and Comparisons with\n        Formation Models}\",\n     keywords = {5464 PLANETARY SCIENCES: SOLID SURFACE PLANETS Remote sensing, 6221\n        PLANETARY SCIENCES: SOLAR SYSTEM OBJECTS Europa},\n    booktitle = {AGU Fall Meeting Abstracts},\n         year = 2013,\n       volume = {2013},\n        month = Dec,\n          eid = {P53A-1846},\n        pages = {P53A-1846},\n       adsurl = {https://ui.adsabs.harvard.edu/\\#abs/2013AGUFM.P53A1846P},\n      adsnote = {Provided by the SAO/NASA Astrophysics Data System}\n}\n\n@INPROCEEDINGS{2014cosp...40E3719Y,\n       author = {{Yershov}, Vladimir and {Ivanov}, Anton and {Muller}, Jan-Peter and\n        {Tao}, Yu and {Mr} and {Pool}, William and {Kim}, Jung-Rack and\n        {Sidiropoulos}, Panagiotis},\n        title = \"{Assessment of Digital Terrain Model algorithms for the development of a\n        massive processing system for all high-resolution stereo images\n        of Mars from CTX and HiRISE}\",\n    booktitle = {40th COSPAR Scientific Assembly},\n         year = 2014,\n       volume = {40},\n        month = Jan,\n          eid = {B0.8-11-14},\n        pages = {B0.8-11-14},\n       adsurl = {https://ui.adsabs.harvard.edu/\\#abs/2014cosp...40E3719Y},\n      adsnote = {Provided by the SAO/NASA Astrophysics Data System}\n}\n\n@INPROCEEDINGS{2015LPI....46.2491M,\n       author = {{McMichael}, S. and {Moratto}, Z.~M. and {Beyer}, R.~A.},\n        title = \"{LRO-NAC Mass DTM Pipeline}\",\n    booktitle = {Lunar and Planetary Science Conference},\n         year = 2015,\n        month = Mar,\n        pages = {2491},\n       adsurl = {https://ui.adsabs.harvard.edu/\\#abs/2015LPI....46.2491M},\n      adsnote = {Provided by the SAO/NASA Astrophysics Data System}\n}\n\n@INPROCEEDINGS{2015LPICo1841.9032W,\n       author = {{Watters}, W.~A. and {Geiger}, L. and {Fendrock}, M. and {Gibson}, R.\n        and {Radford}, A.},\n        title = \"{Statistical Morphometry of Small Martian Craters: New Methods and\n        Results}\",\n    booktitle = {Issues in Crater Studies and the Dating of Planetary Surfaces},\n         year = 2015,\n       volume = {1841},\n        month = May,\n        pages = {9032},\n       adsurl = {https://ui.adsabs.harvard.edu/\\#abs/2015LPICo1841.9032W},\n      adsnote = {Provided by the SAO/NASA Astrophysics Data System}\n}\n\n@INPROCEEDINGS{2015EPSC...10..343Y,\n       author = {{Yershov}, V.},\n        title = \"{A system for generating multi-resolution Digital Terrain Models of Mars\n        based on the ESA Mars Express and NASA Mars Reconnaissance\n        Orbiter data}\",\n    booktitle = {European Planetary Science Congress},\n         year = 2015,\n        month = Oct,\n          eid = {EPSC2015-343},\n        pages = {EPSC2015-343},\n       adsurl = {https://ui.adsabs.harvard.edu/\\#abs/2015EPSC...10..343Y},\n      adsnote = {Provided by the SAO/NASA Astrophysics Data System}\n}\n\n@INPROCEEDINGS{2015AGUFM.P41C2079B,\n       author = {{Bauer}, R.~S. and {Barker}, M.~K. and {Mazarico}, E. and {Neumann},\n        G.~A.},\n        title = \"{Calibration of Mercury Laser Altimeter Data Using Digital Elevation\n        Models Derived from Stereo Image Pairs}\",\n     keywords = {1221 Lunar and planetary geodesy and gravity, GEODESY AND GRAVITY, 1294\n        Instruments and techniques, GEODESY AND GRAVITY, 6019\n        Gravitational fields, PLANETARY SCIENCES: COMETS AND SMALL\n        BODIES, 5417 Gravitational fields, PLANETARY SCIENCES: SOLID\n        SURFACE PLANETS},\n    booktitle = {AGU Fall Meeting Abstracts},\n         year = 2015,\n       volume = {2015},\n        month = Dec,\n          eid = {P41C-2079},\n        pages = {P41C-2079},\n       adsurl = {https://ui.adsabs.harvard.edu/\\#abs/2015AGUFM.P41C2079B},\n      adsnote = {Provided by the SAO/NASA Astrophysics Data System}\n}\n\n@INPROCEEDINGS{2016LPI....47.1241M,\n       author = {{Mayer}, D.~P. and {Kite}, E.~S.},\n        title = \"{An Integrated Workflow for Producing Digital Terrain Models of Mars from\n        CTX and HiRISE Stereo Data Using the NASA Ames Stereo Pipeline}\",\n    booktitle = {Lunar and Planetary Science Conference},\n         year = 2016,\n        month = Mar,\n        pages = {1241},\n       adsurl = {https://ui.adsabs.harvard.edu/\\#abs/2016LPI....47.1241M},\n      adsnote = {Provided by the SAO/NASA Astrophysics Data System}\n}\n\n@INPROCEEDINGS{2016cosp...41E.877I,\n       author = {{Ivanov}, Anton and {Muller}, Jan-Peter and {Tao}, Yu and {Kim}, Jung-\n        Rack and {Gwinner}, Klaus and {Van Gasselt}, Stephan and\n        {Morley}, Jeremy and {Houghton}, Robert and {Bamford}, Steven\n        and {Sidiropoulos}, Panagiotis and {Fanara}, Lida and\n        {Waenlish}, Marita and {Walter}, Sebastian and {Steinkert}, Ralf\n        and {Schreiner}, Bjorn and {Cantini}, Federico and {Wardlaw},\n        Jessica and {Sprinks}, James and {Giordano}, Michele and\n        {Marsh}, Stuart},\n        title = \"{EU-FP7-iMARS: analysis of Mars multi-resolution images using \n\t\t\t\t  auto-coregistration, data mining and crowd source techniques}\",\n    booktitle = {41st COSPAR Scientific Assembly},\n         year = 2016,\n       volume = {41},\n        month = Jul,\n          eid = {B0.2-22-16},\n        pages = {B0.2-22-16},\n       adsurl = {https://ui.adsabs.harvard.edu/\\#abs/2016cosp...41E.877I},\n      adsnote = {Provided by the SAO/NASA Astrophysics Data System}\n}\n\n@INPROCEEDINGS{2016DPS....4811608N,\n       author = {{Nebouy}, David and {Capanna}, Claire and {Jorda}, Laurent and\n        {Gaskell}, Robert W. and {Faurschou Hviid}, Stubbe and\n        {Scholten}, Frank and {Preusker}, Frank and {OSIRIS Team}},\n        title = \"{Co-registration and comparison of high-resolution shape models of comet\n        67P/C-G}\",\n    booktitle = {AAS/Division for Planetary Sciences Meeting Abstracts \\#48},\n         year = 2016,\n       series = {AAS/Division for Planetary Sciences Meeting Abstracts},\n        month = Oct,\n          eid = {116.08},\n        pages = {116.08},\n       adsurl = {https://ui.adsabs.harvard.edu/\\#abs/2016DPS....4811608N},\n      adsnote = {Provided by the SAO/NASA Astrophysics Data System}\n}\n\n@INPROCEEDINGS{2016DPS....4851311F,\n       author = {{Fanara}, Lida and {Gwinner}, Klaus and {Hauber}, Ernst and {Oberst},\n        Juergen},\n        title = \"{Frequency of block displacements at the north pole of Mars based on\n        HiRISE images}\",\n    booktitle = {AAS/Division for Planetary Sciences Meeting Abstracts \\#48},\n         year = 2016,\n       series = {AAS/Division for Planetary Sciences Meeting Abstracts},\n        month = Oct,\n          eid = {513.11},\n        pages = {513.11},\n       adsurl = {https://ui.adsabs.harvard.edu/\\#abs/2016DPS....4851311F},\n      adsnote = {Provided by the SAO/NASA Astrophysics Data System}\n}\n\n@INPROCEEDINGS{2016AGUFM.P11E..01M,\n       author = {{Mouginis-Mark}, P.~J. and {Sharpton}, V.~L.},\n        title = \"{Topographic Analysis of the Asymmetric Ejecta of Zunil Crater, Mars}\",\n     keywords = {6299 General or miscellaneous, PLANETARY SCIENCES: SOLAR SYSTEM\n        OBJECTSDE: 5464 Remote sensing, PLANETARY SCIENCES: SOLID\n        SURFACE PLANETSDE: 5470 Surface materials and properties,\n        PLANETARY SCIENCES: SOLID SURFACE PLANETSDE: 5499 General or\n        miscellaneous, PLANETARY SCIENCES: SOLID SURFACE PLANETS},\n    booktitle = {AGU Fall Meeting Abstracts},\n         year = 2016,\n        month = Dec,\n          eid = {P11E-01},\n        pages = {P11E-01},\n       adsurl = {https://ui.adsabs.harvard.edu/\\#abs/2016AGUFM.P11E..01M},\n      adsnote = {Provided by the SAO/NASA Astrophysics Data System}\n}\n\n@ARTICLE{2016P&SS..134...19F,\n       author = {{Fassett}, Caleb I.},\n        title = \"{Ames Stereo Pipeline-derived digital terrain models of Mercury from\n        MESSENGER stereo imaging}\",\n      journal = {Planetary and Space Science},\n     keywords = {Mercury, surface, Topography, Stereo image processing, Hollows, Pits},\n         year = 2016,\n        month = Dec,\n       volume = {134},\n        pages = {19-28},\n       adsurl = {https://ui.adsabs.harvard.edu/\\#abs/2016P&SS..134...19F},\n      adsnote = {Provided by the SAO/NASA Astrophysics Data System}\n}\n\n@INPROCEEDINGS{2017EGUGA..1918917M,\n       author = {{Muller}, Jan-Peter and {Sidiropoulos}, Panagiotis and {Tao}, Yu and\n        {Putri}, Kiky and {Campbell}, Jacqueline and {Xiong}, Si-Ting\n        and {Gwinner}, Klaus and {Willner}, Konrad and {Fanara}, Lida\n        and {Waehlisch}, Marita and {Walter}, Sebastian and {Schreiner},\n        Bjoern and {Steikert}, Ralf and {Ivanov}, Anton and {Cantini},\n        Federico and {Wardlaw}, Jessica and {Sprinks}, James and\n        {Houghton}, Robert and {Kim}, Jung-Rack},\n        title = \"{EU-FP7-iMARS: analysis of Mars multi-resolution images using auto-\n        coregistration, data mining and crowd source techniques: A Final\n        Report on the very variable surface of Mars}\",\n    booktitle = {EGU General Assembly Conference Abstracts},\n         year = 2017,\n       volume = {19},\n        month = Apr,\n        pages = {18917},\n       adsurl = {https://ui.adsabs.harvard.edu/\\#abs/2017EGUGA..1918917M},\n      adsnote = {Provided by the SAO/NASA Astrophysics Data System}\n}\n\n@INPROCEEDINGS{2017LPICo1986.7090M,\n       author = {{McMichael}, S. and {Alexandrov}, O. and {Beyer}, R.},\n        title = \"{Enhanced 3D Surface Generation in the Ames Stereo Pipeline}\",\n    booktitle = {Third Planetary Data Workshop and The Planetary Geologic Mappers Annual Meeting},\n         year = 2017,\n       volume = {1986},\n        month = Jun,\n          eid = {7090},\n        pages = {7090},\n       adsurl = {https://ui.adsabs.harvard.edu/\\#abs/2017LPICo1986.7090M},\n      adsnote = {Provided by the SAO/NASA Astrophysics Data System}\n}\n\n@INPROCEEDINGS{2017LPICo1986.7096B,\n       author = {{Brown}, H.~M. and {Awumah}, A.~A. and {Henriksen}, M.~R. and {Manheim},\n        M.~R. and {Cisneros}, E. and {Wagner}, R.~V. and {Robinson},\n        M.~S.},\n        title = \"{Ames Stereo Pipeline and LROC ASU Digital Terrain Model (DTM) Comparison}\",\n    booktitle = {Third Planetary Data Workshop and The Planetary Geologic Mappers Annual Meeting},\n         year = 2017,\n       volume = {1986},\n        month = Jun,\n          eid = {7096},\n        pages = {7096},\n       adsurl = {https://ui.adsabs.harvard.edu/\\#abs/2017LPICo1986.7096B},\n      adsnote = {Provided by the SAO/NASA Astrophysics Data System}\n}\n\n@ARTICLE{2017SSRv..211..109F,\n       author = {{Fergason}, R.~L. and {Kirk}, R.~L. and {Cushing}, G. and {Galuszka},\n        D.~M. and {Golombek}, M.~P. and {Hare}, T.~M. and {Howington-\n        Kraus}, E. and {Kipp}, D.~M. and {Redding}, B.~L.},\n        title = \"{Analysis of Local Slopes at the InSight Landing Site on Mars}\",\n      journal = {Space Science Reviews},\n     keywords = {Mars, Topography, DTM, Slope, InSight},\n         year = 2017,\n        month = Oct,\n       volume = {211},\n        pages = {109-133},\n       adsurl = {https://ui.adsabs.harvard.edu/\\#abs/2017SSRv..211..109F},\n      adsnote = {Provided by the SAO/NASA Astrophysics Data System}\n}\n\n@INPROCEEDINGS{2017AGUFM.P24C..04A,\n       author = {{Annex}, A.~M. and {Lewis}, K.~W. and {Edwards}, C.~S.},\n        title = \"{Stratigraphic Mapping of Intra-Crater Layered Deposits in Arabia Terra\n        from High-Resolution Imaging and Stereo Topography}\",\n     keywords = {5464 Remote sensing, PLANETARY SCIENCES: SOLID SURFACE PLANETS, 5494\n        Instruments and techniques, PLANETARY SCIENCES: SOLID SURFACE\n        PLANETS, 5499 General or miscellaneous, PLANETARY SCIENCES:\n        SOLID SURFACE PLANETS},\n    booktitle = {AGU Fall Meeting Abstracts},\n         year = 2017,\n       volume = {2017},\n        month = Dec,\n          eid = {P24C-04},\n        pages = {P24C-04},\n       adsurl = {https://ui.adsabs.harvard.edu/#abs/2017AGUFM.P24C..04A},\n      adsnote = {Provided by the SAO/NASA Astrophysics Data System}\n}\n\n@INPROCEEDINGS{2017AGUFM.P43D2914R,\n       author = {{Rezza}, C. and {Phillips}, C.~B. and {Cable}, M.~L.},\n        title = \"{`Dem DEMs: Comparing Methods of Digital Elevation Model Creation}\",\n     keywords = {0770 Properties, CRYOSPHERE, 6218 Jovian satellites, PLANETARY SCIENCES:\n        SOLAR SYSTEM OBJECTS, 6280 Saturnian satellites, PLANETARY\n        SCIENCES: SOLAR SYSTEM OBJECTS, 5422 Ices, PLANETARY SCIENCES:\n        SOLID SURFACE PLANETS},\n    booktitle = {AGU Fall Meeting Abstracts},\n         year = 2017,\n       volume = {2017},\n        month = Dec,\n          eid = {P43D-2914},\n        pages = {P43D-2914},\n       adsurl = {https://ui.adsabs.harvard.edu/#abs/2017AGUFM.P43D2914R},\n      adsnote = {Provided by the SAO/NASA Astrophysics Data System}\n}\n\n@INPROCEEDINGS{2018LPI....49.1384M,\n       author = {{Moon}, S.~H. and {Choi}, H.~L.},\n        title = \"{Alignment and Ortho-Rectification of Lunar Surface Image Using the NASA\n        Ames Stereo Pipeline}\",\n    booktitle = {Lunar and Planetary Science Conference},\n         year = 2018,\n        month = Mar,\n          eid = {1384},\n        pages = {1384},\n       adsurl = {https://ui.adsabs.harvard.edu/#abs/2018LPI....49.1384M},\n      adsnote = {Provided by the SAO/NASA Astrophysics Data System}\n}\n\n@INPROCEEDINGS{2018LPI....49.1604M,\n       author = {{Mayer}, D.~P.},\n        title = \"{An Improved Workflow for Producing Digital Terrain Models of Mars from\n        CTX Stereo Data Using the NASA Ames Stereo Pipeline}\",\n    booktitle = {Lunar and Planetary Science Conference},\n         year = 2018,\n        month = Mar,\n          eid = {1604},\n        pages = {1604},\n       adsurl = {https://ui.adsabs.harvard.edu/#abs/2018LPI....49.1604M},\n      adsnote = {Provided by the SAO/NASA Astrophysics Data System}\n}\n\n@INPROCEEDINGS{2018EGUGA..20.1120P,\n       author = {{Putri}, Alfiah Rizky Diana and {Sidiropoulos}, Panagiotis and {Tao}, Yu\n        and {Muller}, Jan-Peter},\n        title = \"{Automatic Multiple-Expert Quality Assessment for Batch Processed Martian\n        DTMs}\",\n    booktitle = {EGU General Assembly Conference Abstracts},\n         year = 2018,\n       volume = {20},\n        month = Apr,\n        pages = {1120},\n       adsurl = {https://ui.adsabs.harvard.edu/#abs/2018EGUGA..20.1120P},\n      adsnote = {Provided by the SAO/NASA Astrophysics Data System}\n}\n\n@INPROCEEDINGS{2018EGUGA..2015971M,\n       author = {{Muller}, Jan-Peter and {Tao}, Yu and {Sidiropoulos}, Panagiotis and\n        {Putri}, Alfiah and {Campbell}, Jacqueline and {Walter},\n        Sebastian},\n        title = \"{Assessment of approximately 5,000 {Mars}-wide {CTX DTMs} created\n        using the EU-FP7 iMars CASP-GO system}\",\n    booktitle = {EGU General Assembly Conference Abstracts},\n         year = 2018,\n       volume = {20},\n        month = Apr,\n        pages = {15971},\n       adsurl = {https://ui.adsabs.harvard.edu/#abs/2018EGUGA..2015971M},\n      adsnote = {Provided by the SAO/NASA Astrophysics Data System}\n}\n\n@ARTICLE{2018P&SS..154...30T,\n       author = {{Tao}, Y. and {Muller}, J. -P. and {Sidiropoulos}, P. and {Xiong}, Si-\n        Ting and {Putri}, A.~R.~D. and {Walter}, S.~H.~G. and {Veitch-\n        Michaelis}, J. and {Yershov}, V.},\n        title = \"{Massive stereo-based DTM production for Mars on cloud computers}\",\n      journal = {Planetary and Space Science},\n     keywords = {Mars, Global DTM, CTX, HiRISE, CASP-GO, Clouds computing},\n         year = 2018,\n        month = May,\n       volume = {154},\n        pages = {30-58},\n       adsurl = {https://ui.adsabs.harvard.edu/#abs/2018P&SS..154...30T},\n      adsnote = {Provided by the SAO/NASA Astrophysics Data System}\n}\n\n\n@article{bickel2019analysis,\n  title={Analysis of Lunar Boulder Tracks: Implications for Trafficability of Pyroclastic Deposits},\n  author={Bickel, Valentin Tertius and Honniball, CI and Martinez, SN and Rogaski, A and Sargeant, HM and Bell, SK and Czaplinski, EC and Farrant, BE and Harrington, EM and Tolometti, GD and others},\n  journal={Journal of Geophysical Research: Planets},\n  year={2019},\n  publisher={Wiley Online Library}\n}\n\n@ARTICLE{2019GeoRL..46.2408S,\n   author = {{Shahrzad}, S. and {Kinch}, K.~M. and {Goudge}, T.~A. and {Fassett}, C.~I. and \n\t{Needham}, D.~H. and {Quantin-Nataf}, C. and {Knudsen}, C.~P.\n\t},\n    title = \"{Crater Statistics on the Dark-Toned, Mafic Floor Unit in Jezero Crater, Mars}\",\n  journal = {Geophysical Research Letters},\n keywords = {Jezero crater, crater counting, Mars 2020, Mars, age},\n     year = 2019,\n    month = mar,\n   volume = 46,\n    pages = {2408-2416},\n      doi = {10.1029/2018GL081402},\n   adsurl = {http://adsabs.harvard.edu/abs/2019GeoRL..46.2408S},\n  adsnote = {Provided by the SAO/NASA Astrophysics Data System}\n}\n\n@INPROCEEDINGS{2019LPI....50.1759H,\n       author = {{Hemmi}, R. and {Miyamoto}, H.},\n        title = \"{HiRISE Digital Elevation Model of Phobos: Implications for Morphological Analysis of Grooves}\",\n    booktitle = {Lunar and Planetary Science Conference},\n         year = \"2019\",\n        month = \"Mar\",\n          eid = {1759},\n        pages = {1759},\n       adsurl = {https://ui.adsabs.harvard.edu/abs/2019LPI....50.1759H},\n      adsnote = {Provided by the SAO/NASA Astrophysics Data System}\n}\n\n@INPROCEEDINGS{2019LPI....50.2479H,\n       author = {{Hemmi}, R. and {Miyamoto}, H.},\n        title = \"{High-resolution Topographic Analysis of Pitted Mounds in Southern Acidalia Planitia, Mars: Updates on Morphometric Parameters of Candidate Mud Volcanoes}\",\n    booktitle = {Lunar and Planetary Science Conference},\n         year = \"2019\",\n        month = \"Mar\",\n          eid = {2479},\n        pages = {2479},\n       adsurl = {https://ui.adsabs.harvard.edu/abs/2019LPI....50.2479H},\n      adsnote = {Provided by the SAO/NASA Astrophysics Data System}\n}\n\n@article{hemmi2018high,\n  title={High-Resolution Topographic Analyses of Mounds in Southern {Acidalia Planitia, Mars}: Implications for Possible Mud Volcanism in Submarine and Subaerial Environments},\n  author={Hemmi, Ryodo and Miyamoto, Hideaki},\n  journal={Geosciences},\n  volume={8},\n  number={5},\n  pages={152},\n  year={2018},\n  publisher={Multidisciplinary Digital Publishing Institute}\n}\n\n@article{hemmi2017distribution,\n  title={Distribution, morphology, and morphometry of circular mounds in the elongated basin of northern {Terra Sirenum, Mars}},\n  author={Hemmi, Ryodo and Miyamoto, Hideaki},\n  journal={Progress in Earth and Planetary Science},\n  volume={4},\n  number={1},\n  pages={26},\n  year={2017},\n  publisher={SpringerOpen}\n}\n\n@article{hemmi2020morphology,\n  title={Morphology and morphometry of sub-kilometer craters on the nearside of Phobos and implications for regolith properties},\n  author={Hemmi, Ryodo and Miyamoto, Hideaki},\n  journal={Transactions of the Japan Society for Aeronautical and Space Sciences},\n  volume={63},\n  number={4},\n  pages={124--131},\n  year={2020},\n  publisher={THE JAPAN SOCIETY FOR AERONAUTICAL AND SPACE SCIENCES}\n}\n\n@INPROCEEDINGS{2019LPI....50.1128M,\n       author = {{Mayer}, D.~P.},\n        title = \"{Filling the Gap: Building a CTX-Based Digital Terrain Model Mosaic of the South Pole of Mars}\",\n    booktitle = {Lunar and Planetary Science Conference},\n         year = \"2019\",\n        month = \"Mar\",\n          eid = {1128},\n        pages = {1128},\n       adsurl = {https://ui.adsabs.harvard.edu/abs/2019LPI....50.1128M},\n      adsnote = {Provided by the SAO/NASA Astrophysics Data System}\n}\n\n@INPROCEEDINGS{2019LPI....50.1069M,\n       author = {{Mouginis-Mark}, P.~J. and {Garbeil}, H.},\n        title = \"{CTX Digital Elevation Models Facilitate Geomorphic Analysis of Mars}\",\n    booktitle = {Lunar and Planetary Science Conference},\n         year = \"2019\",\n        month = \"Mar\",\n          eid = {1069},\n        pages = {1069},\n       adsurl = {https://ui.adsabs.harvard.edu/abs/2019LPI....50.1069M},\n      adsnote = {Provided by the SAO/NASA Astrophysics Data System}\n}\n\n@INPROCEEDINGS{2019LPI....50.1973A,\n       author = {{Annex}, A.~M. and {Koeppel}, A.~H.~D. and {Pan}, C. and\n         {Edwards}, C.~E. and {Lewis}, K.~W.},\n        title = \"{Scarp Associated with Martian Layered Deposits in Arabia Terra}\",\n    booktitle = {Lunar and Planetary Science Conference},\n         year = \"2019\",\n        month = \"Mar\",\n          eid = {1973},\n        pages = {1973},\n       adsurl = {https://ui.adsabs.harvard.edu/abs/2019LPI....50.1973A},\n      adsnote = {Provided by the SAO/NASA Astrophysics Data System}\n}\n\n@INPROCEEDINGS{2019LPI....50.1223G,\n       author = {{Goudge}, T.~A. and {Fassett}, C.~I. and {Osinski}, G.~R.},\n        title = \"{How Do Crater Lakes on Mars Develop Inlet Valleys?}\",\n    booktitle = {Lunar and Planetary Science Conference},\n         year = \"2019\",\n        month = \"Mar\",\n          eid = {1223},\n        pages = {1223},\n       adsurl = {https://ui.adsabs.harvard.edu/abs/2019LPI....50.1223G},\n      adsnote = {Provided by the SAO/NASA Astrophysics Data System}\n}\n\n@article{lacroix2019irrigation,\n  title={Irrigation-triggered landslides in a {Peruvian} desert caused by modern intensive farming},\n  author={Lacroix, Pascal and Dehecq, Amaury and Taipe, Edu},\n  journal={Nature Geoscience},\n  pages={1--5},\n  year={2019},\n  publisher={Nature Publishing Group}\n}\n\n@article{hepburn2019creating,\n  title={Creating {HiRISE} digital elevation models for {Mars} using the open-source {Ames Stereo Pipeline}},\n  author={Hepburn, Adam J and Holt, Tom and Hubbard, Bryn and Ng, Felix},\n  journal={Geoscientific Instrumentation, Methods and Data Systems},\n  volume={8},\n  number={2},\n  pages={293--313},\n  year={2019},\n  publisher={Copernicus Publications}\n}\n\n@INPROCEEDINGS{2019EPSC...13..849B,\n       author = {{Beyer}, Ross and {Porter}, Simon and {Schenk}, Paul and\n         {Spencer}, John and {Beddingfield}, Chloe and {Grundy}, William and\n         {Keane}, James and {Lauer}, Tod and {Moore}, Jeff and\n         {Olkin}, Catherine and {Parker}, Joel and {Stern}, Alan and\n         {Umurhan}, Orkan and {Verbiscer}, Anne and {Weaver}, Harold},\n        title = \"{Stereo Topography of {KBO (486958) 2014 MU69}}\",\n    booktitle = {EPSC-DPS Joint Meeting 2019},\n         year = 2019,\n       volume = {2019},\n        month = sep,\n          eid = {EPSC-DPS2019-849},\n        pages = {EPSC-DPS2019-849},\n       adsurl = {https://ui.adsabs.harvard.edu/abs/2019EPSC...13..849B},\n      adsnote = {Provided by the SAO/NASA Astrophysics Data System}\n}\n\n@ARTICLE{2020PEPS....7...13P,\n       author = {{Parsons}, Reid A. and {Kanzaki}, Tomohiro and {Hemmi}, Ryodo and\n         {Miyamoto}, Hideaki},\n        title = \"{Cold-based glaciation of Pavonis Mons, Mars: evidence for moraine deposition during glacial advance}\",\n      journal = {Progress in Earth and Planetary Science},\n     keywords = {Thermomechanical ice sheet model, Mars, Amazonian climate, Moraine deposition, Tharsis, Glaciation},\n         year = 2020,\n        month = mar,\n       volume = {7},\n       number = {1},\n          eid = {13},\n        pages = {13},\n          doi = {10.1186/s40645-020-0323-9},\n       adsurl = {https://ui.adsabs.harvard.edu/abs/2020PEPS....7...13P},\n      adsnote = {Provided by the SAO/NASA Astrophysics Data System}\n}\n\n\n@inproceedings{10.1117/12.2532975,\nauthor = {Tomonori Yamamoto and Koichiro Yawata},\ntitle = {{Improvement of land classification in airports using 3D information}},\nvolume = {11157},\nbooktitle = {Remote Sensing Technologies and Applications in Urban Environments IV},\neditor = {Thilo Erbertseder and Nektarios Chrysoulakis and Ying Zhang and Frank Baier},\norganization = {International Society for Optics and Photonics},\npublisher = {SPIE},\npages = {89 -- 97},\nkeywords = {land classification, VHR satellite images, deep learning, U-NET, MVS, CNN, semantic segmentation},\nyear = {2019},\ndoi = {10.1117/12.2532975},\nURL = {https://doi.org/10.1117/12.2532975}\n}\n\n\n@article{10.1785/0220180227,\n  title={Shallow fault rupture of the Milun fault in the 2018 M w 6.4 Hualien earthquake: A high-resolution approach from optical correlation of Pl{\\'e}iades satellite imagery},\n  author={Kuo, Yu-Ting and Wang, Yu and Hollingsworth, James and Huang, Shao-Yi and Chuang, Ray Y and Lu, Chih-Heng and Hsu, Yi-Chun and Tung, Hsin and Yen, Jiun-Yee and Chang, Chung-Pai},\n  journal={Seismological Research Letters},\n  volume={90},\n  number={1},\n  pages={97--107},\n  year={2019},\n  publisher={Seismological Society of America}\n}\n\n@article{SARKAR2019199,\ntitle = \"Tectonic evolution of Juventae Chasma, Mars, and the deformational and depositional structural attributes of the four major light-toned rock exposures therein\",\njournal = \"Icarus\",\nvolume = \"333\",\npages = \"199 - 233\",\nyear = \"2019\",\nissn = \"0019-1035\",\ndoi = \"https://doi.org/10.1016/j.icarus.2019.05.032\",\nurl = \"http://www.sciencedirect.com/science/article/pii/S0019103518306766\",\nauthor = \"Ranjan Sarkar and Kenneth S. Edgett and Dibyendu Ghosh and Alok Porwal and Pragya Singh\"\n}\n\n\n@article{BEDDINGFIELD2020113383,\ntitle = \"Landslides on Charon\",\njournal = \"Icarus\",\nvolume = \"335\",\npages = \"113383\",\nyear = \"2020\",\nissn = \"0019-1035\",\ndoi = \"https://doi.org/10.1016/j.icarus.2019.07.017\",\nurl = \"http://www.sciencedirect.com/science/article/pii/S0019103518306341\",\nauthor = \"Chloe B. Beddingfield and Ross A. Beyer and Kelsi N. Singer and William B. McKinnon and Kirby Runyon and Will Grundy and S. Alan Stern and Veronica Bray and Rajani Dhingra and Jeffrey M. Moore and K. Ennico and C.B. Olkin and Paul Schenk and John R. Spencer and H.A. Weaver and L.A. Young\"\n}\n\n@article{doi:10.1029/2019JE006167,\nauthor = {Stucky de Quay, Gaia and Kite, Edwin S and Mayer, David P.},\ntitle = {Prolonged Fluvial Activity From Channel-Fan Systems on Mars},\njournal = {Journal of Geophysical Research: Planets},\nvolume = {124},\nnumber = {11},\npages = {3119-3139},\nkeywords = {Mars, fluvial, timescale, erosion, sediment transport, alluvial fan},\ndoi = {10.1029/2019JE006167},\nurl = {https://agupubs.onlinelibrary.wiley.com/doi/abs/10.1029/2019JE006167},\neprint = {https://agupubs.onlinelibrary.wiley.com/doi/pdf/10.1029/2019JE006167},\nyear = {2019}\n}\n\n@article{doi:10.1029/2019JE006083,\nauthor = {Schorghofer, N. and Levy, J.S. and Goudge, T.A.},\ntitle = {High-Resolution Thermal Environment of Recurring Slope Lineae in Palikir Crater, Mars, and Its Implications for Volatiles},\njournal = {Journal of Geophysical Research: Planets},\nvolume = {124},\nnumber = {11},\npages = {2852-2862},\nkeywords = {Recurring Slope Lineae, Mars, volatiles, thermal models},\ndoi = {10.1029/2019JE006083},\nurl = {https://agupubs.onlinelibrary.wiley.com/doi/abs/10.1029/2019JE006083},\neprint = {https://agupubs.onlinelibrary.wiley.com/doi/pdf/10.1029/2019JE006083},\nyear = {2019}\n}\n\n@article{rivera2019deltas,\n  title={Do deltas along the crustal dichotomy boundary of Mars in the Gale crater region record a northern ocean?},\n  author={Rivera-Hern{\\'a}ndez, Frances and Palucis, Marisa C},\n  journal={Geophysical Research Letters},\n  volume={46},\n  number={15},\n  pages={8689--8699},\n  year={2019},\n  publisher={Wiley Online Library}\n}\n\n@article{FANARA2020104733,\ntitle = \"Automated detection of block falls in the north polar region of Mars\",\njournal = \"Planetary and Space Science\",\nvolume = \"180\",\npages = \"104733\",\nyear = \"2020\",\nissn = \"0032-0633\",\ndoi = \"https://doi.org/10.1016/j.pss.2019.104733\",\nurl = \"http://www.sciencedirect.com/science/article/pii/S0032063318304422\",\nauthor = \"L. Fanara and K. Gwinner and E. Hauber and J. Oberst\",\nkeywords = \"Change detection, Block falls, Machine learning, Blob detection, Mars\"\n}\n\n\n@article{TEBOLT2020113536,\ntitle = \"Slope, elevation, and thermal inertia trends of martian recurring slope lineae initiation and termination points: Multiple possible processes occurring on coarse, sandy slopes\",\njournal = \"Icarus\",\nvolume = \"338\",\npages = \"113536\",\nyear = \"2020\",\nissn = \"0019-1035\",\ndoi = \"https://doi.org/10.1016/j.icarus.2019.113536\",\nurl = \"http://www.sciencedirect.com/science/article/pii/S0019103519305779\",\nauthor = \"Michelle Tebolt and Joseph Levy and Timothy Goudge and Norbert Schorghofer\"\n}\n\n@article{doi:10.1029/2019GL085584,\nauthor = {Tarnas, J. D. and Mustard, J. F. and Lin, Honglei and Goudge, T. A. and Amador, E. S. and Bramble, M. S. and Kremer, C. H. and Zhang, X. and Itoh, Y. and Parente, M.},\ntitle = {Orbital Identification of Hydrated Silica in Jezero Crater, Mars},\njournal = {Geophysical Research Letters},\nvolume = {46},\nnumber = {22},\npages = {12771-12782},\nkeywords = {Mars, Jezero, silica, biosignature},\ndoi = {10.1029/2019GL085584},\nurl = {https://agupubs.onlinelibrary.wiley.com/doi/abs/10.1029/2019GL085584},\neprint = {https://agupubs.onlinelibrary.wiley.com/doi/pdf/10.1029/2019GL085584},\nyear = {2019}\n}\n\n\n@article {Sterneaaw9771,\n\tauthor = {Stern, S. A. and Weaver, H. A. and Spencer, J. R. and Olkin, C. B.\n\t\t\tand Gladstone, G. R. and Grundy, W. M. and Moore, J. M.\n\t\t\tand Cruikshank, D. P. and Elliott, H. A. and McKinnon, W. B.\n\t\t\tand Parker, J. Wm. and Verbiscer, A. J. and Young, L. A.\n\t\t\tand Aguilar, D. A. and Albers, J. M. and Andert, T.\n\t\t\tand Andrews, J. P. and Bagenal, F. and Banks, M. E. and Bauer, B. A.\n\t\t\tand Bauman, J. A. and Bechtold, K. E. and Beddingfield, C. B.\n\t\t\tand Behrooz, N. and Beisser, K. B. and Benecchi, S. D.\n\t\t\tand Bernardoni, E. and Beyer, R. A. and Bhaskaran, S.\n\t\t\tand Bierson, C. J. and Binzel, R. P. and Birath, E. M.\n\t\t\tand Bird, M. K. and Boone, D. R. and Bowman, A. F. and Bray, V. J.\n\t\t\tand Britt, D. T. and Brown, L. E. and Buckley, M. R. and Buie, M. W.\n\t\t\tand Buratti, B. J. and Burke, L. M. and Bushman, S. S.\n\t\t\tand Carcich, B. and Chaikin, A. L. and Chavez, C. L.\n\t\t\tand Cheng, A. F. and Colwell, E. J. and Conard, S. J.\n\t\t\tand Conner, M. P. and Conrad, C. A. and Cook, J. C.\n\t\t\tand Cooper, S. B. and Custodio, O. S. and Dalle Ore, C. M.\n\t\t\tand Deboy, C. C. and Dharmavaram, P. and Dhingra, R. D.\n\t\t\tand Dunn, G. F. and Earle, A. M. and Egan, A. F. and Eisig, J.\n\t\t\tand El-Maarry, M. R. and Engelbrecht, C. and Enke, B. L.\n\t\t\tand Ercol, C. J. and Fattig, E. D. and Ferrell, C. L.\n\t\t\tand Finley, T. J. and Firer, J. and Fischetti, J. and Folkner, W. M.\n\t\t\tand Fosbury, M. N. and Fountain, G. H. and Freeze, J. M.\n\t\t\tand Gabasova, L. and Glaze, L. S. and Green, J. L.\n\t\t\tand Griffith, G. A. and Guo, Y. and Hahn, M. and Hals, D. W.\n\t\t\tand Hamilton, D. P. and Hamilton, S. A. and Hanley, J. J.\n\t\t\tand Harch, A. and Harmon, K. A. and Hart, H. M. and Hayes, J.\n\t\t\tand Hersman, C. B. and Hill, M. E. and Hill, T. A.\n\t\t\tand Hofgartner, J. D. and Holdridge, M. E. and\n\t\t\tHor{\\'a}nyi, M. and Hosadurga, A. and Howard, A. D.\n\t\t\tand Howett, C. J. A. and Jaskulek, S. E. and Jennings, D. E.\n\t\t\tand Jensen, J. R. and Jones, M. R. and Kang, H. K. and Katz, D. J.\n\t\t\tand Kaufmann, D. E. and Kavelaars, J. J. and Keane, J. T.\n\t\t\tand Keleher, G. P. and Kinczyk, M. and Kochte, M. C.\n\t\t\tand Kollmann, P. and Krimigis, S. M. and Kruizinga, G. L.\n\t\t\tand Kusnierkiewicz, D. Y. and Lahr, M. S. and Lauer, T. R.\n\t\t\tand Lawrence, G. B. and Lee, J. E. and Lessac-Chenen, E. J.\n\t\t\tand Linscott, I. R. and Lisse, C. M. and Lunsford, A. W.\n\t\t\tand Mages, D. M. and Mallder, V. A. and Martin, N. P.\n\t\t\tand May, B. H. and McComas, D. J. and McNutt, R. L.\n\t\t\tand Mehoke, D. S. and Mehoke, T. S. and Nelson, D. S.\n\t\t\tand Nguyen, H. D. and N{\\'u}{\\~n}ez, J. I. and Ocampo, A. C.\n\t\t\tand Owen, W. M. and Oxton, G. K. and Parker, A. H.\n\t\t\tand P{\\\"a}tzold, M. and Pelgrift, J. Y. and Pelletier, F. J.\n\t\t\tand Pineau, J. P. and Piquette, M. R. and Porter, S. B.\n\t\t\tand Protopapa, S. and Quirico, E. and Redfern, J. A.\n\t\t\tand Regiec, A. L. and Reitsema, H. J. and Reuter, D. C.\n\t\t\tand Richardson, D. C. and Riedel, J. E. and Ritterbush, M. A.\n\t\t\tand Robbins, S. J. and Rodgers, D. J. and Rogers, G. D.\n\t\t\tand Rose, D. M. and Rosendall, P. E. and Runyon, K. D.\n\t\t\tand Ryschkewitsch, M. G. and Saina, M. M. and Salinas, M. J.\n\t\t\tand Schenk, P. M. and Scherrer, J. R. and Schlei, W. R.\n\t\t\tand Schmitt, B. and Schultz, D. J. and Schurr, D. C.\n\t\t\tand Scipioni, F. and Sepan, R. L. and Shelton, R. G.\n\t\t\tand Showalter, M. R. and Simon, M. and Singer, K. N.\n\t\t\tand Stahlheber, E. W. and Stanbridge, D. R. and Stansberry, J. A.\n\t\t\tand Steffl, A. J. and Strobel, D. F. and Stothoff, M. M.\n\t\t\tand Stryk, T. and Stuart, J. R. and Summers, M. E. and Tapley, M. B.\n\t\t\tand Taylor, A. and Taylor, H. W. and Tedford, R. M. and Throop, H. B.\n\t\t\tand Turner, L. S. and Umurhan, O. M. and Van Eck, J. and Velez, D.\n\t\t\tand Versteeg, M. H. and Vincent, M. A. and Webbert, R. W.\n\t\t\tand Weidner, S. E. and Weigle, G. E. and Wendel, J. R.\n\t\t\tand White, O. L. and Whittenburg, K. E. and Williams, B. G.\n\t\t\tand Williams, K. E. and Williams, S. P. and Winters, H. L.\n\t\t\tand Zangari, A. M. and Zurbuchen, T. H.},\n\ttitle = {Initial results from the New Horizons exploration of 2014 MU69, a small Kuiper Belt object},\n\tvolume = {364},\n\tnumber = {6441},\n\telocation-id = {eaaw9771},\n\tyear = {2019},\n\tdoi = {10.1126/science.aaw9771},\n\tpublisher = {American Association for the Advancement of Science},\n\tissn = {0036-8075},\n\tURL = {https://science.sciencemag.org/content/364/6441/eaaw9771},\n\teprint = {https://science.sciencemag.org/content/364/6441/eaaw9771.full.pdf},\n\tjournal = {Science}\n}\n\n@article{pan2020crust,\n  title={Crust stratigraphy and heterogeneities of the first kilometers at the dichotomy boundary in western Elysium Planitia and implications for InSight lander},\n  author={Pan, Lu and Quantin-Nataf, Cathy and Tauzin, Benoit and Michaut, Chloe and Golombek, Matt and Lognonn{\\'e}, Phillipe and Grindrod, Peter and Langlais, Benoit and Gudkova, Tamara and Stepanova, Inna and others},\n  journal={Icarus},\n  volume={338},\n  pages={113511},\n  year={2020},\n  publisher={Elsevier}\n}\n\n@article{tc-13-2633-2019,\nAUTHOR = {Shean, D. E. and Joughin, I. R. and Dutrieux, P. and Smith, B. E. and Berthier, E.},\nTITLE = {Ice shelf basal melt rates from a high-resolution digital elevation model (DEM) record for Pine Island Glacier, Antarctica},\nJOURNAL = {The Cryosphere},\nVOLUME = {13},\nYEAR = {2019},\nNUMBER = {10},\nPAGES = {2633--2656},\nURL = {https://www.the-cryosphere.net/13/2633/2019/},\nDOI = {10.5194/tc-13-2633-2019}\n}\n\n@article{Palaseanu_Lovejoy_2019,\n\t\ttitle={High-Resolution and Accurate Topography Reconstruction of Mount Etna from Pleiades Satellite Data},\n\t\tvolume={11},\n\t\tISSN={2072-4292},\n\t\turl={http://dx.doi.org/10.3390/rs11242983},\n\t\tDOI={10.3390/rs11242983},\n\t\tnumber={24},\n\t\tjournal={Remote Sensing},\n\t\tpublisher={MDPI AG},\n\t\tauthor={Palaseanu-Lovejoy, Monica and Bisson, Marina and Spinetti, Claudia and Buongiorno, Maria Fabrizia and Alexandrov, Oleg and Cecere, Thomas},\n\t\tyear={2019}, month={Dec}, pages={2983}}\n\n\n@Article{tc-14-211-2020,\nAUTHOR = {Joughin, I. and Shean, D. E. and Smith, B. E. and Floricioiu, D.},\nTITLE = {A decade of variability on Jakobshavn Isbr{\\ae}: ocean temperatures pace speed\nthrough influence on m\\'{e}lange rigidity},\nJOURNAL = {The Cryosphere},\nVOLUME = {14},\nYEAR = {2020},\nNUMBER = {1},\nPAGES = {211--227},\nURL = {https://www.the-cryosphere.net/14/211/2020/},\nDOI = {10.5194/tc-14-211-2020}\n}\n\n\n@ARTICLE{10.3389/feart.2019.00363,\nAUTHOR={Shean, David E. and Bhushan, Shashank and Montesano, Paul and Rounce, David R. and Arendt, Anthony and Osmanoglu, Batuhan},   \nTITLE={A Systematic, Regional Assessment of High Mountain Asia Glacier Mass Balance},      \nJOURNAL={Frontiers in Earth Science},      \nVOLUME={7},      \nPAGES={363},     \nYEAR={2020},      \nURL={https://www.frontiersin.org/article/10.3389/feart.2019.00363},       \nDOI={10.3389/feart.2019.00363},      \nISSN={2296-6463}\n}\n\n@article{Socquet2019,\n\t\tauthor={Socquet, Anne and Hollingsworth, James and Pathier, Erwan and Bouchon, Michel},\n\t\ttitle={Evidence of supershear during the 2018 magnitude 7.5 Palu earthquake from space geodesy},\n\t\tjournal={Nature Geoscience},\n\t\tvolume=12,\n\t\tpages={192-199},\n\t\tyear=2019,\n\t\tdoi={10.1038/s41561-018-0296-0}\n}\n\n@article{Ye_2020,\n\t\ttitle={Area-Based Dense Image Matching with Subpixel Accuracy for Remote Sensing Applications: Practical Analysis and Comparative Study},\n\t\tvolume={12}, ISSN={2072-4292},\n\t\turl={http://dx.doi.org/10.3390/rs12040696},\n\t\tDOI={10.3390/rs12040696},\n\t\tnumber={4},\n\t\tjournal={Remote Sensing},\n\t\tpublisher={MDPI AG},\n\t\tauthor={Ye, Zhen and Xu, Yusheng and Chen, Hao and Zhu, Jingwei and Tong, Xiaohua and Stilla, Uwe},\n\t\tyear={2020}, month={Feb}, pages={696}}\n\n\n@article {Spencereaay3999,\n\tauthor = {Spencer, J. R. and Stern, S. A. and Moore, J. M. and Weaver, H. A. and Singer, K. N. and Olkin, C. B and Verbiscer, A. J. and McKinnon, W. B. and Parker, J. Wm. and Beyer, R. A. and Keane, J. T. and Lauer, T. R. and Porter, S. B. and White, O. L. and Buratti, B. J. and El-Maarry, M. R. and Lisse, C. M. and Parker, A. H. and Throop, H. B. and Robbins, S. J. and Umurhan, O. M. and Binzel, R. P. and Britt, D. T. and Buie, M. W. and Cheng, A. F. and Cruikshank, D. P. and Elliott, H. A. and Gladstone, G. R. and Grundy, W. M. and Hill, M. E. and Horanyi, M. and Jennings, D. E. and Kavelaars, J. J. and Linscott, I. R. and McComas, D. J. and McNutt, R. L. and Protopapa, S. and Reuter, D. C. and Schenk, P. M. and Showalter, M. R. and Young, L. A. and Zangari, A. M. and Abedin, A. Y. and Beddingfield, C. B. and Benecchi, S. D. and Bernardoni, E. and Bierson, C. J. and Borncamp, D. and Bray, V. J. and Chaikin, A. L. and Dhingra, R. D. and Fuentes, C. and Fuse, T. and Gay, P. L and Gwyn, S. D. J. and Hamilton, D. P. and Hofgartner, J. D. and Holman, M. J. and Howard, A. D. and Howett, C. J. A. and Karoji, H. and Kaufmann, D. E. and Kinczyk, M. and May, B. H. and Mountain, M. and P{\\\"a}tzold, M. and Petit, J. M. and Piquette, M. R. and Reid, I. N. and Reitsema, H. J. and Runyon, K. D. and Sheppard, S. S. and Stansberry, J. A. and Stryk, T. and Tanga, P. and Tholen, D. J. and Trilling, D. E. and Wasserman, L. H.},\n\ttitle = {The geology and geophysics of Kuiper Belt object (486958) Arrokoth},\n\tvolume = {367},\n\tnumber = {6481},\n\tyear = {2020},\n\tdoi = {10.1126/science.aay3999},\n\tpublisher = {American Association for the Advancement of Science},\n\tissn = {0036-8075},\n\tURL = {https://science.sciencemag.org/content/367/6481/eaay3999},\n\teprint = {https://science.sciencemag.org/content/367/6481/eaay3999.full.pdf},\n\tjournal = {Science}\n}\n\n@article{doi:10.1029/2019JE006188,\nauthor = {Annex, Andrew M. and Lewis, Kevin W.},\ntitle = {Regional Correlations in the Layered Deposits of Arabia Terra, Mars},\njournal = {Journal of Geophysical Research: Planets},\nvolume = {125},\nnumber = {6},\npages = {e2019JE006188},\nkeywords = {Mars},\ndoi = {10.1029/2019JE006188},\nurl = {https://agupubs.onlinelibrary.wiley.com/doi/abs/10.1029/2019JE006188},\neprint = {https://agupubs.onlinelibrary.wiley.com/doi/pdf/10.1029/2019JE006188},\nnote = {e2019JE006188 10.1029/2019JE006188},\nyear = {2020}\n}\n\n@inproceedings{shean_mro_2011,\n\ttitle = {{MRO} {CTX} {Stereo} {Image} {Processing} and {Preliminary} {DEM} {Quality} {Assessment}},\n\tvolume = {42},\n\turl = {http://www.lpi.usra.edu/meetings/lpsc2011/pdf/2646.pdf},\n\tbooktitle = {42nd {Lunar} and {Planetary} {Science} {Conference} {Abstracts}},\n\tauthor = {Shean, D. E. and Fahle, J. and Malin, M. C. and Edwards, L. J. and Posiolova, L.},\n\tmonth = mar,\n\tyear = {2011},\n\tpages = {2646},\n}\n\n@article{joughin_grounding_2016,\n\ttitle = {Grounding line variability and subglacial lake drainage on {Pine} {Island} {Glacier}, {Antarctica}},\n\tvolume = {43},\n\tissn = {00948276},\n\tshorttitle = {Grounding line variability and subglacial lake drainage on {Pine} {Island} {Glacier}, {Antarctica}},\n\turl = {http://doi.wiley.com/10.1002/2016GL070259},\n\tdoi = {10.1002/2016GL070259},\n\tlanguage = {en},\n\tnumber = {17},\n\turldate = {2017-11-20},\n\tjournal = {Geophysical Research Letters},\n\tauthor = {Joughin, Ian and Shean, David E. and Smith, Ben E. and Dutrieux, P.},\n\tmonth = sep,\n\tyear = {2016},\n\tpages = {9093--9102},\n}\n\n@article{christianson_sensitivity_2016,\n\ttitle = {Sensitivity of {Pine} {Island} {Glacier} to observed ocean forcing: {PIG} response to ocean forcing},\n\tvolume = {43},\n\tissn = {00948276},\n\tshorttitle = {Sensitivity of {Pine} {Island} {Glacier} to observed ocean forcing},\n\turl = {http://doi.wiley.com/10.1002/2016GL070500},\n\tdoi = {10.1002/2016GL070500},\n\tlanguage = {en},\n\tnumber = {20},\n\turldate = {2016-11-21},\n\tjournal = {Geophysical Research Letters},\n\tauthor = {Christianson, Knut and Bushuk, Mitchell and Dutrieux, Pierre and Parizek, Byron R. and Joughin, Ian R. and Alley, Richard B. and Shean, David E. and Abrahamsen, E. Povl and Anandakrishnan, Sridhar and Heywood, Karen J. and Kim, Tae-Wan and Lee, Sang Hoon and Nicholls, Keith and Stanton, Tim and Truffer, Martin and Webber, Benjamin G. M. and Jenkins, Adrian and Jacobs, Stan and Bindschadler, Robert and Holland, David M.},\n\tmonth = oct,\n\tyear = {2016},\n\tpages = {10,817--10,825},\n}\n\n@article{shean_gps-derived_2017,\n\ttitle = {{GPS}-derived estimates of surface mass balance and ocean-induced basal melt for {Pine} {Island} {Glacier} ice shelf, {Antarctica}},\n\tvolume = {11},\n\tissn = {1994-0424},\n\turl = {https://www.the-cryosphere.net/11/2655/2017/},\n\tdoi = {10.5194/tc-11-2655-2017},\n\tnumber = {6},\n\turldate = {2017-11-21},\n\tjournal = {The Cryosphere},\n\tauthor = {Shean, D. E. and Christianson, K. and Larson, K. M. and Ligtenberg, S. R. M. and Joughin, I. R. and Smith, B. E. and Stevens, C. M. and Bushuk, M. and Holland, D. M.},\n\tmonth = nov,\n\tyear = {2017},\n\tpages = {2655--2674},\n}\n\n@article{kehrl_seasonal_2017,\n\ttitle = {Seasonal and interannual variabilities in terminus position, glacier velocity, and surface elevation at {Helheim} and {Kangerlussuaq} {Glaciers} from 2008 to 2016: {Helheim} and {Kangerlussuaq} {Glaciers}},\n\tvolume = {122},\n\tissn = {21699003},\n\tshorttitle = {Seasonal and interannual variabilities in terminus position, glacier velocity, and surface elevation at {Helheim} and {Kangerlussuaq} {Glaciers} from 2008 to 2016},\n\turl = {http://doi.wiley.com/10.1002/2016JF004133},\n\tdoi = {10.1002/2016JF004133},\n\tlanguage = {en},\n\tnumber = {9},\n\turldate = {2017-11-30},\n\tjournal = {Journal of Geophysical Research: Earth Surface},\n\tauthor = {Kehrl, L. M. and Joughin, I. and Shean, D. E. and Floricioiu, D. and Krieger, L.},\n\tmonth = aug,\n\tyear = {2017},\n\tpages = {1635--1652},\n}\n\n@article{haritashya_evolution_2018,\n\ttitle = {Evolution and {Controls} of {Large} {Glacial} {Lakes} in the {Nepal} {Himalaya}},\n\tvolume = {10},\n\turl = {http://www.mdpi.com/2072-4292/10/5/798},\n\tdoi = {10.3390/rs10050798},\n\tlanguage = {en},\n\tnumber = {5},\n\turldate = {2018-05-24},\n\tjournal = {Remote Sensing},\n\tauthor = {Haritashya, Umesh K. and Kargel, Jeffrey S. and Shugar, Dan H. and Leonard, Gregory J. and Strattman, Katherine and Watson, C. Scott and Shean, David and Harrison, Stephan and Mandli, Kyle T. and Regmi, Dhananjay},\n\tmonth = may,\n\tyear = {2018},\n\tkeywords = {remote sensing, glacier, Nepal, Himalaya, glacial lake, GLOF, High Mountain Asia (HMA), moraine-dammed, proglacial lake},\n\tpages = {798},\n}\n\n@article{lilien_changes_2018,\n\ttitle = {Changes in flow of {Crosson} and {Dotson} ice shelves, {West} {Antarctica}, in response to elevated melt},\n\tvolume = {12},\n\tissn = {1994-0416},\n\turl = {https://www.the-cryosphere.net/12/1415/2018/},\n\tdoi = {10.5194/tc-12-1415-2018},\n\tlanguage = {English},\n\tnumber = {4},\n\turldate = {2018-11-08},\n\tjournal = {The Cryosphere},\n\tauthor = {Lilien, David A. and Joughin, Ian and Smith, Benjamin and Shean, David E.},\n\tmonth = apr,\n\tyear = {2018},\n\tpages = {1415--1431},\n}\n\n@article{menounos_heterogeneous_2019,\n\ttitle = {Heterogeneous {Changes} in {Western} {North} {American} {Glaciers} {Linked} to {Decadal} {Variability} in {Zonal} {Wind} {Strength}},\n\tvolume = {46},\n\tissn = {1944-8007},\n\turl = {https://agupubs.onlinelibrary.wiley.com/doi/abs/10.1029/2018GL080942},\n\tdoi = {10.1029/2018GL080942},\n\tlanguage = {en},\n\tnumber = {1},\n\turldate = {2019-08-05},\n\tjournal = {Geophysical Research Letters},\n\tauthor = {Menounos, B. and Hugonnet, R. and Shean, D. and Gardner, A. and Howat, I. and Berthier, E. and Pelto, B. and Tennant, C. and Shea, J. and Noh, Myoung-Jong and Brun, F. and Dehecq, A.},\n\tyear = {2019},\n\tkeywords = {mass balance, glacier change, zonal wind},\n\tpages = {200--209},\n}\n\n@article{olson_terrain_2019,\n\ttitle = {Terrain {Induced} {Biases} in {Clear}-{Sky} {Shortwave} {Radiation} {Due} to {Digital} {Elevation} {Model} {Resolution} for {Glaciers} in {Complex} {Terrain}},\n\tvolume = {7},\n\tissn = {2296-6463},\n\turl = {https://www.frontiersin.org/articles/10.3389/feart.2019.00216/full},\n\tdoi = {10.3389/feart.2019.00216},\n\tlanguage = {English},\n\turldate = {2019-10-22},\n\tjournal = {Frontiers in Earth Science},\n\tauthor = {Olson, Matthew and Rupper, Summer and Shean, David E.},\n\tyear = {2019},\n\tkeywords = {glaciers, Digital elevation model, topography, modeling, energy balance, shortwave radiation, solar radiation},\n}\n\n@article{mcgrath_spatially_2019,\n\ttitle = {Spatially {Extensive} {Ground}-{Penetrating} {Radar} {Snow} {Depth} {Observations} {During} {NASA}'s 2017 {SnowEx} {Campaign}: {Comparison} {With} {In} {Situ}, {Airborne}, and {Satellite} {Observations}},\n\tvolume = {55},\n\tissn = {1944-7973},\n\tshorttitle = {Spatially {Extensive} {Ground}-{Penetrating} {Radar} {Snow} {Depth} {Observations} {During} {NASA}'s 2017 {SnowEx} {Campaign}},\n\turl = {http://agupubs.onlinelibrary.wiley.com/doi/abs/10.1029/2019WR024907},\n\tdoi = {10.1029/2019WR024907},\n\tlanguage = {en},\n\tnumber = {11},\n\turldate = {2020-02-06},\n\tjournal = {Water Resources Research},\n\tauthor = {McGrath, Daniel and Webb, Ryan and Shean, David and Bonnell, Randall and Marshall, Hans-Peter and Painter, Thomas H. and Molotch, Noah P. and Elder, Kelly and Hiemstra, Christopher and Brucker, Ludovic},\n\tyear = {2019},\n\tkeywords = {remote sensing, ground-penetrating radar, SnowEx, Seasonal snow},\n\tpages = {10026--10036},\n}\n\n@article{rs13173511,\nAUTHOR = {Kirk, Randolph L. and Mayer, David P. and Fergason, Robin L. and Redding, Bonnie L. and Galuszka, Donna M. and Hare, Trent M. and Gwinner, Klaus},\nTITLE = {Evaluating Stereo Digital Terrain Model Quality at Mars Rover Landing Sites with HRSC, CTX, and HiRISE Images},\nJOURNAL = {Remote Sensing},\nVOLUME = {13},\nYEAR = {2021},\nNUMBER = {17},\nARTICLE-NUMBER = {3511},\nURL = {https://www.mdpi.com/2072-4292/13/17/3511},\nISSN = {2072-4292},\nDOI = {10.3390/rs13173511}\n}\n\n@article{dehecqAutomatedProcessingDeclassified2020,\n  title = {Automated Processing of Declassified KH-9 Hexagon Satellite Images for Global Elevation Change Analysis Since the 1970s},\n  author = {Dehecq, Amaury and Gardner, Alex S. and Alexandrov, Oleg and McMichael, Scott and Hugonnet, Romain and Shean, David and Marty, Mauro},\n  year = {2020},\n  journal = {Frontiers in Earth Science},\n  volume = {8},\n  publisher = {{Frontiers}},\n  doi = {10.3389/feart.2020.566802},\n  langid = {english},\n}\n\n@article{purinton2023image,\n  title={Image Texture as Quality Indicator for Optical DEM Generation: Geomorphic Applications in the Arid Central Andes},\n  author={Purinton, Benjamin and Mueting, Ariane and Bookhagen, Bodo},\n  journal={Remote Sensing},\n  volume={15},\n  number={1},\n  pages={85},\n  year={2023},\n  publisher={Multidisciplinary Digital Publishing Institute}\n}\n\n\n@article{belart2017winter,\n  title={Winter mass balance of Drangaj{\\\"o}kull ice cap (NW Iceland) derived from satellite sub-meter stereo images},\n  author={Belart, Joaqu{\\'\\i}n and Berthier, Etienne and Magn{\\'u}sson, Eyj{\\'o}lfur and Anderson, Leif S and P{\\'a}lsson, Finnur and Thorsteinsson, Thorsteinn and Howat, Ian M and A{\\dh}algeirsd{\\'o}ttir, Gu{\\dh}finna and J{\\'o}hannesson, T{\\'o}mas and Jarosch, Alexander H},\n  journal={The Cryosphere},\n  volume={11},\n  number={3},\n  pages={1501--1517},\n  year={2017},\n  publisher={Copernicus GmbH}\n}\n\n@article{brun_spatially_2017,\n\ttitle = {A spatially resolved estimate of {High} {Mountain} {Asia} glacier mass balances from 2000 to 2016},\n\tvolume = {10},\n\tissn = {1752-0894},\n\turl = {http://dx.doi.org/10.1038/ngeo2999},\n\tdoi = {10.1038/ngeo2999},\n\tnumber = {9},\n\tjournal = {Nature Geoscience},\n\tauthor = {Brun, Fanny and Berthier, Etienne and Wagnon, Patrick and K\\\"{a}\\\"{a}b, Andreas and Treichler, Desiree},\n\tyear = {2017},\n\tpages = {668--673},\n}\n\n@article{dussaillant2018geodetic,\n  title={Geodetic mass balance of the Northern Patagonian Icefield from 2000 to 2012 using two independent methods},\n  author={Dussaillant, In{\\'e}s and Berthier, Etienne and Brun, Fanny},\n  journal={Frontiers in Earth Science},\n  volume={6},\n  pages={8},\n  year={2018},\n  publisher={Frontiers Media SA}\n}\n\n@article{kaab2018massive,\n  title={Massive collapse of two glaciers in western Tibet in 2016 after surge-like instability},\n  author={K{\\\"a}{\\\"a}b, Andreas and Leinss, Silvan and Gilbert, Adrien and B{\\\"u}hler, Yves and Gascoin, Simon and Evans, Stephen G and Bartelt, Perry and Berthier, Etienne and Brun, Fanny and Chao, Wei-An and others},\n  journal={Nature Geoscience},\n  volume={11},\n  number={2},\n  pages={114--120},\n  year={2018},\n  publisher={Nature Publishing Group}\n}\n\n@article{berthier_brief_2018,\n\ttitle = {Brief communication: {Unabated} wastage of the {Juneau} and {Stikine} icefields (southeast {Alaska}) in the early 21st century},\n\tvolume = {12},\n\tissn = {1994-0424},\n\turl = {https://www.the-cryosphere.net/12/1523/2018/},\n\tdoi = {10.5194/tc-12-1523-2018},\n\tnumber = {4},\n\tjournal = {The Cryosphere},\n\tauthor = {Berthier, E. and Larsen, C. and Durkin, W. J. and Willis, M. J. and Pritchard, M. E.},\n\tyear = {2018},\n\tpages = {1523--1530},\n}\n\n@article{barandun_multi-decadal_2018,\n\ttitle = {Multi-decadal mass balance series of three {Kyrgyz} glaciers inferred from modelling constrained with repeated snow line observations},\n\tvolume = {12},\n\tissn = {1994-0424},\n\turl = {https://www.the-cryosphere.net/12/1899/2018/},\n\tdoi = {10.5194/tc-12-1899-2018},\n\tnumber = {6},\n\tjournal = {The Cryosphere},\n\tauthor = {Barandun, M. and Huss, M. and Usubaliev, R. and Azisov, E. and Berthier, E. and K{\\\"a}{\\\"a}b, A. and Bolch, T. and Hoelzle, M.},\n\tyear = {2018},\n\tpages = {1899--1919},\n}\n\n@article{gilbert_mechanisms_2018,\n\ttitle = {Mechanisms leading to the 2016 giant twin glacier collapses, {Aru} {Range}, {Tibet}},\n\tvolume = {12},\n\tissn = {1994-0424},\n\turl = {https://www.the-cryosphere.net/12/2883/2018/},\n\tdoi = {10.5194/tc-12-2883-2018},\n\tnumber = {9},\n\tjournal = {The Cryosphere},\n\tauthor = {Gilbert, A. and Leinss, S. and Kargel, J. and K{\\\"a}{\\\"a}b, A. and Gascoin, S. and Leonard, G. and Berthier, E. and Karki, A. and Yao, T.},\n\tyear = {2018},\n\tpages = {2883--2900},\n}\n\n@article{brun_ice_2018,\n\ttitle = {Ice cliff contribution to the tongue-wide ablation of {Changri} {Nup} {Glacier}, {Nepal}, central {Himalaya}},\n\tvolume = {12},\n\tissn = {1994-0424},\n\turl = {https://www.the-cryosphere.net/12/3439/2018/},\n\tdoi = {10.5194/tc-12-3439-2018},\n\tnumber = {11},\n\tjournal = {The Cryosphere},\n\tauthor = {Brun, F. and Wagnon, P. and Berthier, E. and Shea, J. M. and Immerzeel, W. W. and Kraaijenbrink, P. D. A. and Vincent, C. and Reverchon, C. and Shrestha, D. and Arnaud, Y.},\n\tyear = {2018},\n\tpages = {3439--3457},\n}\n\n@article{miles_glacial_2018,\n\ttitle = {Glacial and geomorphic effects of a supraglacial lake drainage and outburst event, {Everest} region, {Nepal} {Himalaya}},\n\tvolume = {12},\n\tissn = {1994-0424},\n\turl = {https://www.the-cryosphere.net/12/3891/2018/},\n\tdoi = {10.5194/tc-12-3891-2018},\n\tnumber = {12},\n\tjournal = {The Cryosphere},\n\tauthor = {Miles, E. S. and Watson, C. S. and Brun, F. and Berthier, E. and Esteves, M. and Quincey, D. J. and Miles, K. E. and Hubbard, B. and Wagnon, P.},\n\tyear = {2018},\n\tpages = {3891--3905},\n}\n\n@article{deschamps-berger_closing_2019,\n\ttitle = {Closing the mass budget of a tidewater glacier: the example of {Kronebreen}, {Svalbard}},\n\tvolume = {65},\n\tissn = {0022-1430},\n\turl = {https://doi.org/10.1017/jog.2018.98},\n\tdoi = {10.1017/jog.2018.98},\n\tnumber = {249},\n\tjournal = {Journal of Glaciology},\n\tauthor = {Deschamps-Berger, C. and Nuth, C. and van Pelt, W. J. J. and Berthier, E. and Kohler, J. and Altema, B.},\n\tyear = {2019},\n\tkeywords = {remote sensing, glacier mass balance, glaciological instruments and methods},\n\tpages = {136--148},\n}\n\n@article{almeida2019deriving,\n  title={Deriving high spatial-resolution coastal topography from sub-meter satellite stereo imagery},\n  author={Almeida, Lu{\\'\\i}s Pedro and Almar, Rafael and Bergsma, Erwin WJ and Berthier, Etienne and Baptista, Paulo and Garel, Erwan and Dada, Olusegun A and Alves, Bruna},\n  journal={Remote Sensing},\n  volume={11},\n  number={5},\n  pages={590},\n  year={2019},\n  publisher={MDPI}\n}\n\n@article{belart2019geodetic,\n  title={The geodetic mass balance of Eyjafjallaj{\\\"o}kull ice cap for 1945--2014: processing guidelines and relation to climate},\n  author={BELART, JOAQU{\\'I}N MC and Magn{\\'u}sson, Eyj{\\'o}lfur and Berthier, Etienne and P{\\'a}lsson, Finnur and A{\\dh}algeirsd{\\'o}ttir, Gu{\\dh}finna and J{\\'o}hannesson, T{\\'o}mas},\n  journal={Journal of Glaciology},\n  volume={65},\n  number={251},\n  pages={395--409},\n  year={2019},\n  publisher={Cambridge University Press}\n}\n\n@article{berthier_karakoram_2019,\n\ttitle = {Karakoram geodetic glacier mass balances between 2008 and 2016: persistence of the anomaly and influence of a large rock avalanche on {Siachen} {Glacier}},\n\tvolume = {65},\n\tissn = {0022-1430},\n\turl = {https://www.cambridge.org/core/article/karakoram-geodetic-glacier-mass-balances-between-2008-and-2016-persistence-of-the-anomaly-and-influence-of-a-large-rock-avalanche-on-siachen-glacier/131C4EF02593AA45D0119A80668BEEC7},\n\tdoi = {10.1017/jog.2019.32},\n\tnumber = {251},\n\tjournal = {Journal of Glaciology},\n\tauthor = {Berthier, E and Brun, F.},\n\tyear = {2019},\n\tkeywords = {remote sensing, glacier mass balance, mountain glaciers, glacier surges},\n\tpages = {494--507},\n}\n\n@article{dussaillant_two_2019,\n\ttitle = {Two decades of glacier mass loss along the {Andes}},\n\tvolume = {12},\n\tissn = {1752-0908},\n\turl = {https://doi.org/10.1038/s41561-019-0432-5},\n\tdoi = {10.1038/s41561-019-0432-5},\n\tnumber = {10},\n\tjournal = {Nature Geoscience},\n\tauthor = {Dussaillant, I. and Berthier, E. and Brun, F. and Masiokas, M. and Hugonnet, R. and Favier, V. and Rabatel, A. and Pitte, P. and Ruiz, L.},\n\tyear = {2019},\n\tpages = {802--808},\n}\n\n@article{belart2020mass,\n  title={Mass balance of 14 Icelandic glaciers, 1945--2017: spatial variations and links with climate},\n  author={Belart, Joaqu{\\'\\i}n and Magn{\\'u}sson, Eyj{\\'o}lfur and Berthier, Etienne and Gunnlaugsson, {\\'A}g{\\'u}st {\\TH} and P{\\'a}lsson, Finnur and A{\\dh}algeirsd{\\'o}ttir, Gu{\\dh}finna and J{\\'o}hannesson, T{\\'o}mas and Thorsteinsson, Thorsteinn and Bj{\\\"o}rnsson, Helgi},\n  journal={Frontiers in Earth Science},\n  pages={163},\n  year={2020},\n  publisher={Frontiers}\n}\n\n@article{deschamps-berger_snow_2020,\n\ttitle = {Snow depth mapping from stereo satellite imagery in mountainous terrain: evaluation using airborne laser-scanning data},\n\tvolume = {14},\n\turl = {https://tc.copernicus.org/articles/14/2925/2020/},\n\tdoi = {10.5194/tc-14-2925-2020},\n\tnumber = {9},\n\tjournal = {The Cryosphere},\n\tauthor = {Deschamps-Berger, C. and Gascoin, S. and Berthier, E. and Deems, J. and Gutmann, E. and Dehecq, A. and Shean, D. and Dumont, M.},\n\tyear = {2020},\n\tpages = {2925--2940},\n}\n\n@article{ferri2020ice,\n  title={Ice mass loss in the Central Andes of Argentina between 2000 and 2018 derived from a new glacier inventory and satellite stereo-imagery},\n  author={Ferri, Lidia and Dussaillant, In{\\'e}s and Zalazar, Laura and Masiokas, Mariano H and Ruiz, Lucas and Pitte, Pierre and Gargantini, Hern{\\'a}n and Castro, Mariano and Berthier, Etienne and Villalba, Ricardo},\n  journal={Frontiers in Earth Science},\n  volume={8},\n  pages={530997},\n  year={2020},\n  publisher={Frontiers Media SA}\n}\n\n@article{young_imbalancing_2021,\n\ttitle = {An imbalancing act: the delayed dynamic response of the {Kaskawulsh} {Glacier} to sustained mass loss},\n\tvolume = {67},\n\tissn = {0022-1430},\n\turl = {https://www.cambridge.org/core/article/an-imbalancing-act-the-delayed-dynamic-response-of-the-kaskawulsh-glacier-to-sustained-mass-loss/350065B3C0CD9A900DCBA7D60445D583},\n\tdoi = {10.1017/jog.2020.107},\n\tnumber = {262},\n\tjournal = {Journal of Glaciology},\n\tauthor = {Young, Erik M. and Flowers, Gwenn E. and Berthier, Etienne and Latto, Rebecca},\n\tyear = {2021},\n\tnote = {Edition: 2020/12/29\nPublisher: Cambridge University Press},\n\tkeywords = {Glacier mass balance, mountain glaciers, ground-penetrating radar, ice and climate, melt-surface},\n\tpages = {313--330},\n}\n\n@article{lei_response_2021,\n\ttitle = {Response of downstream lakes to {Aru} glacier collapses  on the western {Tibetan} {Plateau}},\n\tvolume = {15},\n\tissn = {1994-0424},\n\turl = {https://tc.copernicus.org/articles/15/199/2021/},\n\tdoi = {10.5194/tc-15-199-2021},\n\tnumber = {1},\n\tjournal = {The Cryosphere},\n\tauthor = {Lei, Y. and Yao, T. and Tian, L. and Sheng, Y. and {Lazhu} and Liao, J. and Zhao, H. and Yang, W. and Yang, K. and Berthier, E. and Brun, F. and Gao, Y. and Zhu, M. and Wu, G.},\n\tyear = {2021},\n\tnote = {Publisher: Copernicus Publications},\n\tpages = {199--214},\n}\n\n@article{denzinger_geodetic_2021,\n\ttitle = {Geodetic mass balance of {Abramov} {Glacier} from 1975 to 2015},\n\tvolume = {67},\n\tissn = {0022-1430},\n\turl = {https://www.cambridge.org/core/article/geodetic-mass-balance-of-abramov-glacier-from-1975-to-2015/46235271A5791FB520EC0DDBABB51356},\n\tdoi = {10.1017/jog.2020.108},\n\tnumber = {262},\n\tjournal = {Journal of Glaciology},\n\tauthor = {Denzinger, Florian and Machguth, Horst and Barandun, Martina and Berthier, Etienne and Girod, Luc and Kronenberg, Marlene and Usubaliev, Ryskul and Hoelzle, Martin},\n\tyear = {2021},\n\tnote = {Edition: 2021/01/26\nPublisher: Cambridge University Press},\n\tkeywords = {Glacier mass balance, remote sensing, glacier volume},\n\tpages = {313--342},\n}\n\n@article{wagnon2021reanalysing,\n  title={Reanalysing the 2007--19 glaciological mass-balance series of Mera Glacier, Nepal, Central Himalaya, using geodetic mass balance},\n  author={Wagnon, Patrick and Brun, Fanny and Khadka, Arbindra and Berthier, Etienne and Shrestha, Dibas and Vincent, Christian and Arnaud, Yves and Six, Delphine and Dehecq, Amaury and M{\\'e}n{\\'e}goz, Martin and others},\n  journal={Journal of Glaciology},\n  volume={67},\n  number={261},\n  pages={117--125},\n  year={2021},\n  publisher={Cambridge University Press}\n}\n\n@article{shugar_massive_2021,\n\ttitle = {A massive rock and ice avalanche caused the 2021 disaster at {Chamoli}, {Indian} {Himalaya}},\n\tvolume = {373},\n\turl = {http://science.sciencemag.org/content/373/6552/300.abstract},\n\tdoi = {10.1126/science.abh4455},\n\tnumber = {6552},\n\tjournal = {Science},\n\tauthor = {Shugar, D. H. and Jacquemart, M. and Shean, D. and Bhushan, S. and Upadhyay, K. and Sattar, A. and Schwanghart, W. and McBride, S. and de Vries, M. Van Wyk and Mergili, M. and Emmer, A. and Deschamps-Berger, C. and McDonnell, M. and Bhambri, R. and Allen, S. and Berthier, E. and Carrivick, J. L. and Clague, J. J. and Dokukin, M. and Dunning, S. A. and Frey, H. and Gascoin, S. and Haritashya, U. K. and Huggel, C. and K{\\\"a}{\\\"a}b, A. and Kargel, J. S. and Kavanaugh, J. L. and Lacroix, P. and Petley, D. and Rupper, S. and Azam, M. F. and Cook, S. J. and Dimri, A. P. and Eriksson, M. and Farinotti, D. and Fiddes, J. and Gnyawali, K. R. and Harrison, S. and Jha, M. and Koppes, M. and Kumar, A. and Leinss, S. and Majeed, U. and Mal, S. and Muhuri, A. and Noetzli, J. and Paul, F. and Rashid, I. and Sain, K. and Steiner, J. and Ugalde, F. and Watson, C. S. and Westoby, M. J.},\n\tyear = {2021},\n\tpages = {300},\n}\n\n@article{muhammad_holistic_2021,\n\ttitle = {A holistic view of {Shisper} {Glacier} surge and outburst floods: from physical processes to downstream impacts},\n\tvolume = {12},\n\tissn = {1947-5705},\n\turl = {https://doi.org/10.1080/19475705.2021.1975833},\n\tdoi = {10.1080/19475705.2021.1975833},\n\tnumber = {1},\n\tjournal = {Geomatics, Natural Hazards and Risk},\n\tauthor = {Muhammad, Sher and Li, Jia and Steiner, Jakob F. and Shrestha, Finu and Shah, Ghulam M. and Berthier, Etienne and Guo, Lei and Wu, Li-xin and Tian, Lide},\n\tyear = {2021},\n\tnote = {Publisher: Taylor \\& Francis},\n\tpages = {2755--2775},\n\tannote = {doi: 10.1080/19475705.2021.1975833},\n}\n\n@article{pitte2022recent,\n  title={Recent mass-balance changes of Agua Negra glacier (30 S) in the Desert Andes of Argentina},\n  author={Pitte, Pierre and Masiokas, Mariano and Gargantini, Hern{\\'a}n and Ruiz, Lucas and Berthier, Etienne and Hidalgo, Lidia Ferri and Zalazar, Laura and Dussaillant, In{\\'e}s and Viale, Maximiliano and Zorzut, Valentina and others},\n  journal={Journal of Glaciology},\n  pages={1--13},\n  year={2022},\n  publisher={Cambridge University Press}\n}\n\n@article{van2022pre,\n  title={Pre-collapse motion of the February 2021 Chamoli rock--ice avalanche, Indian Himalaya},\n  author={Van Wyk de Vries, Maximillian and Bhushan, Shashank and Jacquemart, Myl{\\`e}ne and Deschamps-Berger, C{\\'e}sar and Berthier, Etienne and Gascoin, Simon and Shean, David E and Shugar, Dan H and K{\\\"a}{\\\"a}b, Andreas},\n  journal={Natural Hazards and Earth System Sciences},\n  volume={22},\n  number={10},\n  pages={3309--3327},\n  year={2022},\n  publisher={Copernicus GmbH}\n}\n\n@article{gouhier2022cnes,\n  title={CNES-ESA satellite contribution to the operational monitoring of volcanic activity: The 2021 Icelandic eruption of Mt. Fagradalsfjall},\n  author={Gouhier, Mathieu and Pinel, Virginie and Belart, Joaqu{\\'\\i}n and De Michele, Marcello and Proy, Catherine and Tinel, Claire and Berthier, Etienne and Gu{\\'e}henneux, Yannick and Gudmundsson, Magnus Tumi and {\\'O}skarsson, Birgir V and others},\n  journal={Journal of Applied Volcanology},\n  volume={11},\n  number={1},\n  pages={1--16},\n  year={2022},\n  publisher={BioMed Central}\n}\n\n@article{lacroix2022mechanisms,\n  title={Mechanisms of landslide destabilization induced by glacier-retreat on Tungnakv{\\'\\i}slarj{\\\"o}kull area, Iceland},\n  author={Lacroix, Pascal and Belart, Joaquin MC and Berthier, Etienne and S{\\ae}mundsson, {\\TH}orsteinn and J{\\'o}nsd{\\'o}ttir, Krist{\\'\\i}n},\n  journal={Geophysical Research Letters},\n  volume={49},\n  number={14},\n  pages={e2022GL098302},\n  year={2022},\n  publisher={Wiley Online Library}\n}\n\n@article{pedersen2022volume,\n  title={Volume, effusion rate, and lava transport during the 2021 Fagradalsfjall eruption: Results from near real-time photogrammetric monitoring},\n  author={Pedersen, Gro BM and Belart, Joaquin MC and {\\'O}skarsson, Birgir Vilhelm and Gudmundsson, Magn{\\'u}s Tumi and Gies, Nils and H{\\\"o}gnad{\\'o}ttir, Th{\\'o}rd{\\'\\i}s and Hjartard{\\'o}ttir, {\\'A}sta Rut and Pinel, Virginie and Berthier, Etienne and D{\\\"u}rig, Tobias and others},\n  journal={Geophysical Research Letters},\n  volume={49},\n  number={13},\n  pages={e2021GL097125},\n  year={2022},\n  publisher={Wiley Online Library}\n}\n\n@article{falaschi2022increased,\n  title={Increased mass loss of glaciers in Volc{\\'a}n Domuyo (Argentinian Andes) between 1962 and 2020, revealed by aerial photos and satellite stereo imagery},\n  author={Falaschi, Daniel and Berthier, Etienne and Belart, Joaqu{\\'\\i}n MC and Bravo, Claudio and Castro, Mariano and Durand, Marcelo and Villalba, Ricardo},\n  journal={Journal of Glaciology},\n  pages={1--17},\n  year={2022},\n  publisher={Cambridge University Press}\n}\n\n@article{deschamps-berger_improving_2022,\n\ttitle = {Improving the {Spatial} {Distribution} of {Snow} {Cover} {Simulations} by {Assimilation} of {Satellite} {Stereoscopic} {Imagery}},\n\tvolume = {58},\n\tissn = {0043-1397},\n\turl = {https://doi.org/10.1029/2021WR030271},\n\tdoi = {10.1029/2021WR030271},\n\tnumber = {3},\n\turldate = {2022-03-09},\n\tjournal = {Water Resources Research},\n\tauthor = {Deschamps-Berger, C. and Cluzet, B. and Dumont, M. and Lafaysse, M. and Berthier, E. and Fanise, P. and Gascoin, S.},\n\tmonth = mar,\n\tyear = {2022},\n\tnote = {Publisher: John Wiley \\& Sons, Ltd},\n\tkeywords = {remote sensing, photogrammetry, modeling, snow cover, assimilation, ungauged basins},\n\tpages = {e2021WR030271},\n\tannote = {https://doi.org/10.1029/2021WR030271},\n}\n\n@article{hugonnet2022uncertainty,\n  title={Uncertainty analysis of digital elevation models by spatial inference from stable terrain},\n  author={Hugonnet, Romain and Brun, Fanny and Berthier, Etienne and Dehecq, Amaury and Mannerfelt, Erik Schytt and Eckert, Nicolas and Farinotti, Daniel},\n  journal={IEEE Journal of Selected Topics in Applied Earth Observations and Remote Sensing},\n  volume={15},\n  pages={6456--6472},\n  year={2022},\n  publisher={IEEE}\n}\n\n@article{volat2022digital,\n  title={Digital elevation model workflow improvements for the MarsSI platform and resulting orthorectified mosaic of Oxia Planum, the landing site of the ExoMars 2022 rover},\n  author={Volat, Matthieu and Quantin-Nataf, Cathy and Dehecq, Amaury},\n  journal={Planetary and Space Science},\n  volume={222},\n  pages={105552},\n  year={2022},\n  publisher={Elsevier},\n  doi={10.1016/j.pss.2022.105552}\n}\n\n@Article{rs15163950,\nAUTHOR = {Palaseanu-Lovejoy, Monica and Alexandrov, Oleg and Danielson, Jeff and Storlazzi, Curt},\nTITLE = {SaTSeaD: Satellite Triangulated Sea Depth Open-Source Bathymetry Module for NASA Ames Stereo Pipeline},\nJOURNAL = {Remote Sensing},\nVOLUME = {15},\nYEAR = {2023},\nNUMBER = {16},\nARTICLE-NUMBER = {3950},\nURL = {https://www.mdpi.com/2072-4292/15/16/3950},\nISSN = {2072-4292},\nABSTRACT = {},\nDOI = {10.3390/rs15163950}\n}\n\n@article{jindal2024measuring,\n  title={Measuring erosional and depositional patterns across Comet 67P's Imhotep region},\n  author={Jindal, AS and Birch, SPD and Hayes, AG and {\\\"O}zyurt, FP and Issah, AB and Moruzzi, SA and Barrington, MN and Soderblom, JM and Kirk, RL and Marschall, R and others},\n  journal={Journal of Geophysical Research: Planets},\n  volume={129},\n  number={2},\n  pages={e2023JE008089},\n  year={2024},\n  publisher={Wiley Online Library},\n  doi = {https://doi.org/10.1029/2023JE008089}\n}\n\n@ARTICLE{Bhushan2024-rx,\n  title     = \"Deriving seasonal and annual surface mass balance for\n               debris-covered glaciers from flow-corrected satellite stereo\n               {DEM} time series\",\n  author    = \"Bhushan, Shashank and Shean, David and Hu, Jyun-Yi Michelle and\n               Guillet, Gr{\\'e}goire and Rounce, David Robert\",\n  journal   = \"Journal of Glaciology\",\n  publisher = \"Cambridge University Press (CUP)\",\n  volume    =  70,\n  number    = \"e6\",\n  year      =  2024,\n  language  = \"en\",\n  doi\t\t= {https://doi.org/10.1017/jog.2024.57},\n}\n\n@inproceedings{Leite2024,\n  title = {Spaceborne Lidar and Stereogrammetry Data Fusion to Predict Aboveground Biomass in Tropical Forests},\n  url = {http://dx.doi.org/10.1109/igarss53475.2024.10641914},\n  DOI = {10.1109/igarss53475.2024.10641914},\n  booktitle = {IGARSS 2024 - 2024 IEEE International Geoscience and Remote Sensing Symposium},\n  publisher = {IEEE},\n  author = {Leite,  Rodrigo V. and Wagner,  William and Wooten,  Margaret and Schlickmann,  Monique B. and Silva,  Carlos A. and Do Amaral,  Cibele H. and Cosenza,  Diogo N. and Torres,  Carlos M.M.E. and Mkaouar,  Ameni and Bhushan,  Shashank and Shean,  David and Montesano,  Paul and Morton,  Douglas C. and Neigh,  Christopher S.R.},\n  year = {2024},\n  month = jul,\n  pages = {3592–3595}\n}\n\n@article{Hu2023,\n  title = {Six Consecutive Seasons of High‐Resolution Mountain Snow Depth Maps From Satellite Stereo Imagery},\n  volume = {50},\n  ISSN = {1944-8007},\n  url = {http://dx.doi.org/10.1029/2023gl104871},\n  DOI = {10.1029/2023gl104871},\n  number = {24},\n  journal = {Geophysical Research Letters},\n  publisher = {American Geophysical Union (AGU)},\n  author = {Hu,  J. Michelle and Shean,  David and Bhushan,  Shashank},\n  year = {2023},\n  month = dec \n}\n\n@article{Zheng2023,\n  title = {GLAcier Feature Tracking testkit (GLAFT): A statistically- and physically-based framework for evaluating glacier velocity products derived from satellite image feature tracking},\n  url = {http://dx.doi.org/10.5194/tc-2023-38},\n  DOI = {10.5194/tc-2023-38},\n  journal = {The Cryosphere},\n  publisher = {Copernicus GmbH},\n  author = {Zheng,  Whyjay and Bhushan,  Shashank and Van Wyk De Vries,  Maximillian and Kochtitzky,  William and Shean,  David and Copland,  Luke and Dow,  Christine and Jones-Ivey,  Renette and Pérez,  Fernando},\n  year = {2023},\n  month = apr \n}\n\n@article{Knuth2023,\n  title = {Historical Structure from Motion (HSfM): Automated processing of historical aerial photographs for long-term topographic change analysis},\n  volume = {285},\n  ISSN = {0034-4257},\n  url = {http://dx.doi.org/10.1016/j.rse.2022.113379},\n  DOI = {10.1016/j.rse.2022.113379},\n  journal = {Remote Sensing of Environment},\n  publisher = {Elsevier BV},\n  author = {Knuth,  Friedrich and Shean,  David and Bhushan,  Shashank and Schwat,  Eli and Alexandrov,  Oleg and McNeil,  Christopher and Dehecq,  Amaury and Florentine,  Caitlyn and O’Neel,  Shad},\n  year = {2023},\n  month = feb,\n  pages = {113379}\n}\n\n@article{Bhushan2021,\n  title = {Automated digital elevation model (DEM) generation from very-high-resolution Planet SkySat triplet stereo and video imagery},\n  volume = {173},\n  ISSN = {0924-2716},\n  url = {http://dx.doi.org/10.1016/j.isprsjprs.2020.12.012},\n  DOI = {10.1016/j.isprsjprs.2020.12.012},\n  journal = {ISPRS Journal of Photogrammetry and Remote Sensing},\n  publisher = {Elsevier BV},\n  author = {Bhushan,  Shashank and Shean,  David and Alexandrov,  Oleg and Henderson,  Scott},\n  year = {2021},\n  month = mar,\n  pages = {151–165}\n}\n"
  },
  {
    "path": "docs/papersusingasp.rst",
    "content": ".. _papersusingasp:\n\nPapers that used ASP\n====================\n\nThese works (papers and conference abstracts) have made use of the\nAmes Stereo Pipeline to produce their results or enable their\nstudies. If something is missing, `let us know\n<https://github.com/NeoGeographyToolkit/StereoPipeline/issues/new?template=bibliography-addition---.md>`__,\nwe will add it!  You can also make a pull request directly to the\n`papersusingasp.bib\n<https://github.com/NeoGeographyToolkit/StereoPipeline/blob/master/docs/papersusingasp.bib>`_\nif you are familiar with GitHub and BibTeX.\n\n.. bibliography:: papersusingasp.bib\n   :list: bullet\n   :notcited:\n   :style: alpha\n"
  },
  {
    "path": "docs/pinholemodels.rst",
    "content": "Frame camera models\n===================\n\nAmes Stereo Pipeline supports a generic Pinhole camera model with several lens\ndistortion models which cover common calibration methods\n(:numref:`pinholemodels`), the somewhat more complicated panoramic (*optical\nbar*) camera model (:numref:`panoramic`), and the CSM Frame model, that has\nseveral lens distortion implementations (:numref:`csm_frame_def`).\n\nBundle adjustment can refine the intrinsic and extrinsic camera parameters,\nincluding the lens distortion model (:numref:`floatingintrinsics`).\n\n.. _pinholemodels:\n\nPinhole models\n--------------\n\nOverview\n~~~~~~~~\n\nThe generic Pinhole model uses the following parameters:\n\n-  *fu* = The horizontal focal length in pixels or physical units.\n\n-  *fv* = The vertical focal length in pixels or physical units. This \n   is usually equal to *fu*. Here, *vertical* means along an image column.\n\n-  *cu* = The horizontal offset of the principal point of the camera relative\n   to the upper-left image corner, in pixels or physical units.\n\n-  *cv* = The vertical offset of the principal point of the camera relative\n   to the upper-left image corner, in pixels or physical units.\n\n-  *pitch* = The size of each pixel. This is required to correctly interpret the\n   four parameters listed above. The pitch is usually 1.0 if the intrinsics are\n   in pixel units, or it is the size of a pixel in millimeters or meters\n   (physical units).\n   \n   Making an image resolution coarser by a factor must be accompanied by\n   *multiplying the pitch by the same factor* (all other parameters including\n   distortion do not change).\n\nThe focal length is sometimes known as the *principal distance*. The\nvalue :math:`cu` is usually approximately half the image width in pixels\ntimes the pitch, while :math:`cv` is often the image height in pixels\ntimes the pitch, though there are situations when these can be quite\ndifferent.\n\nThe camera position and orientation are recorded in the fields *C* and\n*R*. The underlying mathematical model is in :numref:`pinholemath`.\n\nAlong with the basic Pinhole camera parameters, a lens distortion model\ncan be added. Normally the distortion model is applied after the pixels\nare shifted to be relative to the principal point and divided by the\nfocal length, at least for the radial-tangential (Tsai), fisheye, FOV,\nand RPC models. See the Brown-Conrady model for an exception.  \n\nThe lens distortion models are enumerated in :numref:`pinhole_distortion`.\n\nA sample Pinhole model is in :numref:`file_format`.\n\n.. _pinhole_distortion:\n\nLens distortion models\n~~~~~~~~~~~~~~~~~~~~~~\n\nHere are the lens distortion models supported by ASP. Samples for each\nmodel are shown in :numref:`file_format`.\n\nNull\n^^^^\n\nA placeholder model that applies no distortion. They string ``NULL`` is written\nin the camera file, after the rotation matrix, in lieu of the distortion model.\n\nTsai\n^^^^\n\nA common distortion model :cite:`tsai1987`. In the most recent builds (after ASP\n3.3.0) this was made to agree precisely with the `OpenCV radial-tangential lens\ndistortion model <https://docs.opencv.org/4.x/d9/d0c/group__calib3d.html>`_.\nThis model uses the following parameters:\n  \n*K1, K2, K3* = Radial distortion parameters. The last one is optional.\n  \n*P1, P2* = Tangential distortion parameters.\n\nThe lens distortion operation is computed via an explicit formula, and for undistortion\na nonlinear solver is used based on Newton's method.\n\nThis is the preferred model, unless the lens has a wide field of view, when\nthe Fisheye model should be used (described further below).\n\nAn example of how these values are specified in a camera file is in\n:numref:`tsai_dist_example`.\n\nAdjustable Tsai\n^^^^^^^^^^^^^^^^\n  \nA variant of the Tsai model where any number of *K* terms and a skew term\n(alpha) can be used. Can apply the AgiSoft Lens calibration parameters.\nAn example of how these values are specified in a camera file is in :numref:`adjustable_tsai_dist_example`.\n\n.. _brown_conrady:\n\nBrown-Conrady\n^^^^^^^^^^^^^\n\nThis is an older model based on a centering angle :cite:`brown1966,brown1971`.\nExample usage is in :numref:`sfmgeneric`.\n\nThis model uses the following parameters:\n  \n*K1, K2, K3* = Radial distortion parameters.\n  \n*P1, P2* = Tangential distortion parameters.\n  \n*xp, yp* = Principal point offset.\n  \n*phi* = Tangential distortion angle in radians.\n\nThe following equations describe the distortion. Note that this model uses\n*non-normalized* pixel units, so they can be in millimeters or meters:\n\n.. math::\n\n    x = x_{dist} - xp\n\n    y = y_{dist} - yp\n\n    r^{2} = x^{2} + y^{2}\n\n    dr = K_{1}r^{3} + K_{2}r^{5} + K_{3}r^{7}\n\n    x_{undist} = x + x\\frac{dr}{r} - (P_{1}r^{2} +P_{2}r^{4})\\sin(phi)\n\n    y_{undist} = y + y\\frac{dr}{r} + (P_{1}r^{2} +P_{2}r^{4})\\cos(phi)\n\nThe formulas start with distorted pixels that are then undistorted. This is not\npreferable with ASP, as then the distortion operation requires a solver, which\nmakes bundle adjustment and mapprojection very slow. Use instead the Tsai model. \n\nA Brown-Conrady model can be converted to a Tsai model with\n``convert_pinhole_model`` (:numref:`convert_pinhole_model`). The produced model\ncan be refined with bundle adjustment (:numref:`floatingintrinsics`), if having\nseveral images and many interest point matches.\n\nAn example of how these values are specified in a camera file is in :numref:`brown_conrady_dist_example`.\n\nPhotometrix\n^^^^^^^^^^^\n\nA model matching the conventions used by the Australis\nsoftware from Photometrix.\n  \n*K1, K2, K3* = Radial distortion parameters.\n  \n*P1, P2* = Tangential distortion parameters.\n  \n*xp, yp* = Principal point offset.\n  \n*B1, B2* = Unused parameters.\n\nThe following equations describe the undistortion. Note that this\nmodel uses non-normalized pixel units, so they are in mm.\n\n.. math::\n\n    x = x_{dist} - xp\n\n    y = y_{dist} - yp\n\n    r^{2} = x^{2} + y^{2}\n\n    dr = K_{1}r^{3} + K_{2}r^{5} + K_{3}r^{7}\n\n    x_{undist} = x + x\\frac{dr}{r} + P_{1}(r^{2} +2x^{2}) + 2P_{2}xy\n\n    y_{undist} = y + y\\frac{dr}{r} + P_{2}(r^{2} +2y^{2}) + 2P_{1}xy\n\nThese formulas also start with distorted pixels and undistort them, just as\nthe Brown-Conrady model. This is not preferred. Use instead the Tsai model.\n\nAn example of how these values are specified in a camera file is in :numref:`photometrix_dist_example`.\n\nFisheye\n^^^^^^^\n\nA four-parameter model for wide field-of-view lenses, with the `same\nimplementation as OpenCV\n<https://docs.opencv.org/4.x/db/d58/group__calib3d__fisheye.html>`_ and\n``rig_calibrator`` (:numref:`rig_calibrator`).\n  \nThe parameters are named ``k1, k2, k3, k4``. \n  \nTo apply the lens distortion with this model, the undistorted pixels are first\nshifted relative to the optical center, divided by the focal length, producing\npixel (*x, y*), and then the following equations are applied:\n  \n  .. math::\n  \n    r = \\sqrt{x^2 + y^2}\n    \n    \\theta = \\arctan(r)\n    \n    \\theta_d = \\theta (1 + k_1 \\theta^2 + k_2 \\theta^4 + k_3 \\theta^6 + k_4 \\theta^8)\n    \n    s = \\frac{\\theta_d}{r}\n    \n    x_{dist} = s \\cdot x\n    \n    y_{dist} = s \\cdot y\n  \nThese values are then multiplied by the focal length, and the optical center is\nadded back in.\n\nThe undistortion operation goes in the opposite direction. It requires inverting\na nonlinear function, which is done with Newton's method.\n\nCare is needed around the origin to avoid division of small numbers.\n\nAn example of how these values are specified in a camera file is in :numref:`fisheye_dist_example`.\n\nFOV\n^^^\n\nA field-of-view model with a single parameter, for wide-angle lenses.\n\nThis is in agreement with ``rig_calibrator`` (:numref:`rig_calibrator`).\n\nThe implementation is as follows. Let *k1* by the distortion parameter. Given\nan undistorted pixel, shift it relative to the optical center, divide by the\nfocal length, producing pixel (*x, y*). Then, the following equations are\napplied:\n\n  .. math::\n  \n    p_1 = 1 / k_1\n    \n    p_2 = 2 \\tan(k_1 / 2)\n\n    r_u = \\sqrt{x^2 + y^2}\n    \n    r_d = p_1 \\arctan(r_u p_2)\n    \n    s = r_d / r_u\n\n    x_{dist} = s \\cdot x\n    \n    y_{dist} = s \\cdot y\n\nThese values are then multiplied by the focal length, and the optical center is\nadded back in.\n\nThe undistortion operation goes in the opposite direction, and an explicit formula\nexists for that. \n\nCare is needed around the origin to avoid division of small numbers.\n\nAn example of how *k1* is specified in a camera file is in\n:numref:`fov_dist_example`.\n\n.. _rpc_distortion:\n\nRPC\n^^^\n    \nA rational polynomial coefficient (RPC) model is employed for distortion. The\ndegree can be arbitrary. This is different than going from ground to image\ncoordinates via RPC (:numref:`rpc`).\n\nIn this model, the transform from undistorted *normalized* pixels :math:`(x, y)`\nto distorted normalized pixels is via the formulas\n\n.. math::\n\n    x_{dist} = \\frac{P_1(x, y)}{Q_1(x, y)}\n\n    y_{dist} = \\frac{P_2(x, y)}{Q_2(x, y)}\n\nThe functions in the numerator and denominator are polynomials in\n:math:`x` and :math:`y` with certain coefficients. The degree of\npolynomials can be any positive integer. A degree of 3 or 4 is usually \nmore than sufficient.\n\nThe inputs and output pixels are normalized, that is, shifted relative to the\noptical center, and (in the most latest builds) are also divided by the focal\nlength. Such normalizations are applied before distortion / undistortion\noperations, and then undone after them. This is consistent with the\nradial-tangential and fisheye models.\n\nRPC distortion models can be generated as approximations to other\npre-existing models with the tool ``convert_pinhole_model``\n(:numref:`convert_pinhole_model`).\n\nIn the latest builds, the RPC undistortion is computed via a solver based on \nNewton's method, as for the fisheye lens distortion model.\n\nAn illustration for how to use the RPC lens distortion is in\n:numref:`ba_rpc_distortion`. An example of how these values are specified in a\ncamera file is in :numref:`rpc_dist_example`.\n\n.. _file_format:\n\nFile formats\n~~~~~~~~~~~~\n\nASP Pinhole model files are written in an easy to work with plain text\nformat using the extension ``.tsai``. A sample file is shown below.\n\n::\n\n   VERSION_4\n   PINHOLE\n   fu = 28.429\n   fv = 28.429\n   cu = 17.9712\n   cv = 11.9808\n   u_direction = 1  0  0\n   v_direction = 0  1  0\n   w_direction = 0  0  1\n   C = 266.943 -105.583 -2.14189\n   R = 0.0825447 0.996303 -0.0238243 -0.996008 0.0832884 0.0321213 0.0339869 0.0210777 0.9992\n   pitch = 0.0064\n   TSAI\n   k1 = -0.094196634563\n   k2 = 0.115036424262\n   k3 = -0.032238313341\n   p1 = -0.000256622541\n   p2 = -0.000353613460\n\nThe first half of the file is the same for all Pinhole models:\n\n* ``VERSION_X`` A header line used to track the format of the file. Version 4\n  expects the ``PINHOLE`` or ``OPTICAL_BAR`` line next. For version 3 these\n  should not be present and the camera is assumed to be a Pinhole model.\n\n* ``PINHOLE`` The type of camera model, so that other types can be\n  stored with the .tsai extension (for version 4).\n\n* ``fu, fv, cu, cv`` The first four intrinsic parameters described in\n  the previous section.\n\n* ``u, v, w`` directions. These allow for additional permutations and\n  flips of the axes of the camera coordinates. By default, the positive column\n  direction aligns with x, the positive row direction aligns with y, and\n  downward into the image aligns with z. It is suggested to avoid adjusting\n  these and modify the rotation matrix instead.\n  \n* ``C`` The location of the camera center, usually in the geocentric\n  coordinate system (GCC/ECEF).\n\n* ``R`` The rotation matrix describing the camera's absolute pose in the world\n  coordinate system (camera-to-world rotation, :numref:`pinholemath`).\n\n* ``pitch`` The pitch intrinsic parameter described in the previous\n  section. \n\nThe second half of the file describes the lens distortion model. The name of\nthe model appears first, followed by a list of model parameters.\n\nPartial samples of each format are shown below. *The part up to and including\nthe line having the pitch is the same for all models and not shown in the examples.*\n\n.. _null_dist_example:\n\nNull\n^^^^\n  ::\n\n      NULL\n\nNo lens distortion.\n\n.. _tsai_dist_example:\n\nTsai\n^^^^\n\n  ::\n\n      TSAI\n      k1 = 1.31024e-04\n      k2 = -2.05354e-07\n      p1 = 0.5\n      p2 = 0.4\n      k3 = 1e-3\n\nThis is the same as the radial-tangential distortion model in OpenCV.\n\nThe ``k3`` parameter is optional in the Tsai model. If not set, its value is 0.\nInternally it is stored last in the distortion vector. The option\n``--fixed-distortion-indices`` can keep some of these parameters fixed during\nbundle adjustment (:numref:`ba_options`).\n\n.. _adjustable_tsai_dist_example:\n\nAdjustable Tsai\n^^^^^^^^^^^^^^^\n\n  ::\n\n      AdjustableTSAI\n      Radial Coeff: Vector3(1.31024e-04, 1.31024e-07, 1.31024e-08)\n      Tangential Coeff: Vector2(-2.05354e-07, 1.05354e-07)\n      Alpha: 0.4\n\n.. _brown_conrady_dist_example:\n\nBrown-Conrady\n^^^^^^^^^^^^^\n\n  ::\n\n      BrownConrady\n      xp = 0.5\n      yp = 0.4\n      k1 = 1.31024e-04\n      k2 = -2.05354e-07\n      k3 = 1.31024e-08\n      p1 = 0.5\n      p2 = 0.4\n      phi = 0.001\n\n.. _photometrix_dist_example:\n\nPhotometrix\n^^^^^^^^^^^\n  ::\n\n      Photometrix\n      xp = 0.004\n      yp = -0.191\n      k1 = 1.31024e-04\n      k2 = -2.05354e-07\n      k3 = -5.28558e-011\n      p1 = 7.2359e-006\n      p2 = 2.2656e-006\n      b1 = 0.0\n      b2 = 0.0\n\n.. _fisheye_dist_example:\n\nFisheye\n^^^^^^^\n\n  ::\n\n      FISHEYE\n      k1 = -0.036031089735101024\n      k2 = 0.038013929764216248\n      k3 = -0.058893197165394658\n      k4 = 0.02915171342570104\n\n.. _fov_dist_example:\n\nFOV\n^^^\n\n  ::\n\n      FOV\n      k1 = 1.0001\n      \n.. _rpc_dist_example:\n      \nRPC\n^^^\n  ::\n\n      RPC\n      rpc_degree = 1\n      distortion_num_x = 0 1 0\n      distortion_den_x = 1 0 0\n      distortion_num_y = 0 0 1\n      distortion_den_y = 1 0 0\n\nThis sample RPC lens distortion model represents the case of no distortion, when\nthe degree of the polynomials is 1, and both the distortion and undistortion\nformula leave the pixels unchanged, that is, the distortion transform is\n\n  .. math:: (x, y) \\to (x, y) = \\left(\\frac{ 0 + 1\\cdot x + 0\\cdot y}{1 + 0\\cdot x + 0\\cdot y}, \\frac{0 + 0\\cdot x + 1\\cdot y}{1 + 0\\cdot x + 0\\cdot y}\\right).\n\nIn general, if the degree of the polynomials is :math:`n`, there are\n:math:`2(n+1)(n+2)` coefficients. The zero-th degree coefficients in\nthe denominator are always set to 1.\n\nNotes\n~~~~~\n\nFor several years Ames Stereo Pipeline generated Pinhole files in the\nbinary ``.pinhole`` format. That format is no longer supported.\n\nAlso in the past Ames Stereo Pipeline has generated a shorter version of\nthe current file format, also with the extension ``.tsai``, which only\nsupported the TSAI lens distortion model. Existing files in that format\ncan still be used by ASP.\n\nNote that the ``orbitviz`` tool can be useful for checking the\nformatting of ``.tsai`` files you create and to estimate the position\nand orientation. To inspect the orientation use the optional ``.dae``\nmodel file input option and observe the rotation of the 3D model.\n\n.. _pinholemath:\n\nHow the pinhole model is applied\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nAs mentioned in :numref:`pinholemodels`, the ASP Pinhole models store the focal\nlength as :math:`fu` and :math:`fv`, the optical center :math:`(cu, cv)` (which\nis the pixel location at which the ray coming from the center of the camera is\nperpendicular to the image plane, in units of the pixel pitch), the vector\n:math:`C` which is the camera center in the world coordinate system (such as\nECEF, so body-fixed), and the matrix :math:`R` that is the transform from camera\nto world coordinates.\n\nTo go in more detail, a point :math:`Q` in the camera coordinate system\ngets transformed to a point :math:`P` in the world coordinate system\nvia:\n\n.. math:: P = RQ + C\n\nHence, to go from world to camera coordinates one does:\n\n.. math:: Q = R^{-1}  P - R^{-1}  C\n\nFrom here the ``undistorted`` pixel location is computed as:\n\n.. math:: \\frac{1}{p} \\left(fu \\frac{Q_1}{Q_3} + cu, fv \\frac{Q_2}{Q_3} + cv\\right)\n\nwhere :math:`p` is the pixel pitch. Next, a distortion model may be\napplied, as discussed earlier.\n\n.. _panoramic:\n\nPanoramic Camera Model\n----------------------\n\nASP also supports a simple Panoramic (OpticalBar) camera model for use with\nimages such as the declassified Corona KH4 (:numref:`kh4`) and KH9\n(:numref:`kh9`) images . It implements the model from :cite:`schenk2003rigorous`\nwith the motion compensation from :cite:`sohn2004mathematical`. The latest ASP\nbuild has further improvements (:numref:`ghuffar_method`).\n\nSuch a model looks as follows:\n\n::\n\n   VERSION_4\n   OPTICAL_BAR\n   image_size = 110507 7904\n   image_center = 55253.5 3952\n   pitch = 7.0e-06\n   f = 0.61000001430511475\n   scan_time = 0.5\n   forward_tilt = -0.261799\n   iC = -1047140.9611702315 5508464.4323527571 3340425.4078937685\n   iR = -0.96635634448923746 -0.16918164442572045 0.1937343197650008 -0.23427205529446918 0.26804084264169648 -0.93448954557235941 0.10616976770014927 -0.94843643849513648 -0.29865750042675621\n   speed = 7700\n   mean_earth_radius = 6371000\n   mean_surface_elevation = 4000\n   motion_compensation_factor = 1.0\n   scan_dir = left\n\nHere, the image size and center are given in pixels, with the width\nfollowed by the height. The pixel pitch and focal length ``f`` are in\nmeters. The scan time is seconds, the forward tilt is in radians, the\nspeed is in meters per second, and the Earth radius and mean surface\nelevation are in meters. \n\nThe initial camera center ``iC`` is in meters (in ECEF coordinates),\nand the rotation matrix ``iR`` stores the absolute pose, that is,\nthe camera-to-world rotation. This is analogous to the ``C`` and ``R``\nfields in the Tsai model (:numref:`pinholemodels`). \n\nThe ``scan_dir`` must be set to ``left`` or ``right``. The values ``scan_dir``\nand ``use_motion_compensation`` control how the sensor model accounts accounts\nfor the motion of the satellite during the image scan. Without the benefit of\ndetailed historical documents it may require experimentation to find the good\ninitial values for these cameras. \n\nWhen using ``bundle_adjust`` (:numref:`floatingintrinsics`), the intrinsic\nparameters that are solved for are ``speed``, ``motion_compensation_factor``,\nand ``scan_time``, as part of the ``other_intrinsics`` group, and also the focal\nlength and optical center (image center). The option in ``bundle_adjust`` that\ncontrols these is ``--intrinsics-to-float`` (:numref:`ba_options`). An example of\nsolving for intrinsics is in :numref:`kh9`.\n\nThe ``convert_pinhole_model`` program (:numref:`convert_pinhole_model`) can\nconvert a Panoramic (optical bar) model to a Pinhole model with lens distortion.\nThe resulting model is an approximation, but can help give some intuition about\nthe optical bar model. \n\nThe ``cam_gen`` program can fit a CSM linescan camera to an optical bar camera\n(:numref:`opticalbar2csm`).\n\n.. _csm_frame_def:\n\nCSM frame camera\n----------------\n\nASP supports the CSM (:numref:`csm`) frame camera model. This is analogous to the \nASP Pinhole model (:numref:`pinholemodels`). \n\nThe CSM frame camera model has its own collection of lens distortion models.\nThose include the `OpenCV radial-tangential distortion model\n<https://docs.opencv.org/3.4/dc/dbb/tutorial_py_calibration.html>`_ (it has 5\nparameters, in the order k1, k2, p1, p2, k3), *radial distortion*, with 3\ncoeffecients, k1, k2, k3, and *transverse* distortion, which is a pair of full\npolynomials of degree 3 in both x and y (20 coefficients), and various other\n`specialized models\n<https://github.com/DOI-USGS/usgscsm/blob/main/include/usgscsm/Distortion.h>`_.\n\nThe Pinhole model with no distortion or with radial-tangential (tsai) distortion\nis equivalent to the CSM frame camera model with the same distortion model and\nvalues. This can be verified with ``cam_test`` (:numref:`cam_test`).\n\nIn the CSM .json model state files (:numref:`csm_state`), the radial, transverse\nand radial-tangential distortion models have ``m_distortionType`` set to the\nvalues of 0, 1, and 7, respectively, with ``m_opticalDistCoeffs`` having the\ndistortion parameters.\n\nASP's ``cam_gen`` program (:numref:`cam_gen_frame`) can find the best-fit CSM\nframe camera model with these lens distortion models. Then bundle adjustment can\nbe employed to refine the intrinsic and extrinsic camera parameters\n(:numref:`ba_frame_linescan`).\n\nThe ``sat_sim`` program (:numref:`sat_sim`) can create CSM frame cameras\nsimulating a satellite in orbit.\n"
  },
  {
    "path": "docs/requirements.txt",
    "content": "sphinxcontrib-bibtex\n"
  },
  {
    "path": "docs/sfm.rst",
    "content": ".. _sfm:\n\nAbout SfM\n---------\n\nThis chapter discusses how to create a terrain model (DEM) with\nStructure-from-Motion (SfM) if there exist two or more images and the camera\nmodels may not be fully known. This can be useful with aerial, hand-held, and\nhistorical images. \n\nIf the images have known metadata, such as stored in the EXIF header \nor from other sources, SfM can be avoided. That is discussed in the UAS\nexample (:numref:`sfm_uas`).\n\nIf preexisting orthoimages and DEMs are available, it is possible to also avoid\nSfM by first creating a GCP file (:numref:`bagcp`) and then the camera models\nbased on that (:numref:`camera_solve_gcp`).\n\nIf the longitude and latitude of the corners of all images are known, see\n:numref:`cam_gen`.\n\nCamera solving overview\n-----------------------\n\nThe ``camera_solve`` program (:numref:`camera_solve`) offers several ways to\nfind the pose of frame camera images that do not come with any attached pose\nmetadata, or when information may be incomplete or inaccurate.\n\nThe ``camera_solve`` program is a Python script invoking two other\ntools that we ship. The first of these is `TheiaSfM\n<https://github.com/sweeneychris/TheiaSfM>`_. It generates initial camera position\nestimates in a local coordinate space. The second one is ``bundle_adjust``\n(:numref:`bundle_adjust`). This program improves the solution to account for\nlens distortion and transforms the solution from local to global coordinates by\nmaking use of additional input data.\n\nThe ``camera_solve`` program only solves for the extrinsic camera parameters\n(camera position and orientation) and the user must provide intrinsic camera\ninformation, such as focal length, optical center, and distortion parameters.\n\nThe ``camera_calibrate`` tool (see :numref:`camera_calibrate`) can solve for\nintrinsic parameters if you have access to the camera in question. \n\nThe ``rig_calibrator`` (:numref:`rig_calibrator`) program can calibrate a rig\nwith one more cameras based on data acquired in situ, without a calibration\ntarget. It can handle a mix of optical images and depth clouds. That program \nhas its own SfM script called ``theia_sfm`` (:numref:`theia_sfm`).\n\nThe ``bundle_adjust`` program can also solve for the intrinsics, without using a\nrig or a calibration target. It can optionally constrain the solution against\na well-aligned prior terrain (:numref:`floatingintrinsics`).\n\nThe camera calibration information must be contained in a .tsai pinhole camera\nmodel file and must passed in using the ``--calib-file`` option. \n\n:numref:`camera_solve_gcp` has an example of a pinhole camera model file and\ndiscusses some heuristics for how to guess the intrinsics. A description of our\nsupported pinhole camera models in :numref:`pinholemodels`.\n\nIn order to transform the camera models from local to world coordinates,\none of three pieces of information may be used. These sources are listed\nbelow and described in more detail in the examples that follow:\n\n-  A set of ground control points (:numref:`bagcp`). GCP can also be used \n   to bypass SfM altogether, if there are many (:numref:`camera_solve_gcp`).\n \n-  A set of estimated camera positions (perhaps from a GPS unit) stored in a csv\n   file (see :numref:`sfmicebridge`).\n\n-  A DEM or lidar datset that a local point cloud can be registered to using\n   ``pc_align`` (:numref:`pc_align`). This method can be more accurate if\n   estimated camera positions are also used.\n\nPower users can tweak the individual steps that ``camera_solve`` goes\nthrough to optimize their results. This primarily involves setting up a\ncustom flag file for Theia and/or passing in settings to\n``bundle_adjust``.\n\n.. _sfmgeneric:\n\nExample: Apollo 15 Metric Camera\n--------------------------------\n\nPreparing the inputs\n^^^^^^^^^^^^^^^^^^^^\n\nTo demonstrate the ability of the Ames Stereo Pipeline to process a\ngeneric frame camera we use images from the Apollo 15 Metric camera. The\ncalibration information for this camera is available online and we have\naccurate digital terrain models we can use to verify our results.\n\nFirst, download with ``wget`` the two images at::\n\n  http://apollo.sese.asu.edu/data/metric/AS15/png/AS15-M-0114_MED.png\n  http://apollo.sese.asu.edu/data/metric/AS15/png/AS15-M-0115_MED.png\n\nConvert these to TIF::\n\n    gdal_translate AS15-M-0114_MED.png AS15-M-0114_MED.tif\n    gdal_translate AS15-M-0115_MED.png AS15-M-0115_MED.tif\n\n.. figure:: images/examples/pinhole/AS15-M-combined.png\n   :name: pinhole-a15-input-images\n\n   The two Apollo 15 images\n\nIn order to make the example run faster we use downsampled versions of\nthe original images. The images at those links have already been\ndownsampled by a factor of :math:`4 \\sqrt{2}` from the original images.\nThis means that the effective pixel size has increased from five microns\n(0.005 millimeters) to 0.028284 millimeters.\n\nThe next step is to fill out the rest of the pinhole camera model information we\nneed, based on the `Apollo 15 photographic equipment and mission summary report\n<http://apollo.sese.asu.edu/SUPPORT_DATA/AS15_SIMBAY_SUMMARY.pdf>`_. \n\nLooking at the ASP lens distortion models in :numref:`pinholemodels`, we see\nthat the description matches ASP's Brown-Conrady model. This model is, not\nrecommended in general, as the distortion operation is slow (see a discussion in\n:numref:`brown_conrady`), but here we have to conform to what is expected.\n\nUsing the example in the appendix we can fill out the rest of the sensor model\nfile (metric_model.tsai) so it looks as follows::\n\n   VERSION_4\n   PINHOLE\n   fu = 76.080\n   fv = 76.080\n   cu = 57.246816\n   cv = 57.246816\n   u_direction = 1  0  0\n   v_direction = 0  1  0\n   w_direction = 0  0  1\n   C = 0 0 0\n   R = 1 0 0 0 1 0 0 0 1\n   pitch = 0.028284\n   BrownConrady\n   xp = -0.006\n   yp = -0.002\n   k1 = -0.13361854e-5\n   k2 = 0.52261757e-09\n   k3 = -0.50728336e-13\n   p1 = -0.54958195e-06\n   p2 = -0.46089420e-10\n   phi = 2.9659070\n\nThese parameters use units of millimeters so we have to convert the\nnominal center point of the images from 2024 pixels to units of\nmillimeters. Note that for some older images like these the nominal\nimage center can be checked by looking for some sort of marking around\nthe image borders that indicates where the center should lie. For these\npictures there are black triangles at the center positions and they line\nup nicely with the center of the image. Before we try to solve for the\ncamera positions we can run a simple tool to check the quality of our\ncamera model file::\n\n   undistort_image AS15-M-0114_MED.tif metric_model.tsai \\\n     -o corrected_414.tif\n\nIt is difficult to tell if the distortion model is correct by using this\ntool but it should be obvious if there are any gross errors in your\ncamera model file such as incorrect units or missing parameters. In this\ncase the tool will fail to run or will produce a significantly distorted\nimage. For certain distortion models the ``undistort_image`` tool may\ntake a long time to run.\n\nIf your input images are not all from the same camera or were scanned\nsuch that the center point is not at the same pixel, you can run\n``camera_solve`` with one camera model file per input image. To do so\npass a space-separated list of files surrounded by quotes to the\n``--calib-file`` option such as\n``--calib-file \"c1.tsai c2.tsai c3.tsai\"``.\n\nCreation of cameras in an arbitrary coordinate system\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nIf we do not see any obvious problems we can go ahead and run the\n``camera_solve`` tool::\n\n    camera_solve out/ AS15-M-0114_MED.tif AS15-M-0115_MED.tif \\\n      --theia-overrides '--matching_strategy=CASCADE_HASHING' \\\n      --datum D_MOON --calib-file metric_model.tsai\n\nThe reconstruction can be visualized as::\n\n    view_reconstruction --reconstruction out/theia_reconstruction.dat\n\nOne may need to zoom out to see all cameras. See an illustration in :numref:`view_reconstruction`.\n\n:numref:`camera_solve_gcp` discusses how to avoid SfM altogether.\n \n.. _sfm_world_coords:\n\nCreation of cameras in world coordinates\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nIn order to generate a useful DEM, we need to move our cameras from\nlocal coordinates to global coordinates. The easiest way to do this\nis to obtain known ground control points (GCPs, :numref:`bagcp`) which can be\nidentified in the frame images. This will allow an accurate positioning\nof the cameras provided that the GCPs and the camera model parameters\nare accurate. \n\nWe use ``stereo_gui`` to create GCP (:numref:`creatinggcp`). The input DEM is\ngenerated from LRO NAC images. An arbitrary DEM for the desired planet can make\ndo for the purpose of transforming the cameras to plausible orbital coordinates.\n(See :numref:`camera_solve_gcp` for more on GCP.) \n\nFor GCP to be usable, they can be one of two kinds. The preferred\noption is to have at least three GCP, with each seen in at least two\nimages.  Then their triangulated positions can be determined in local\ncoordinates and in global (world) coordinates, and ``bundle_adjust``\nwill be able to compute the transform between these coordinate\nsystems, and convert the cameras to world coordinates. \n\nThe ``camera_solve`` program will automatically attempt this\ntransformation. This amounts to invoking ``bundle_adjust`` with the\noption ``--transform-cameras-with-shared-gcp``.\n\nIf this is not possible, then at least two of the images should have\nat least three GCP each, and they need not be shared among the\nimages. For example, for each image the longitude, latitude, and\nheight of each of its four corners can be known. Then, one can pass\nsuch a GCP file to ``camera_solve`` together with the flag::\n\n     --bundle-adjust-params \"--transform-cameras-using-gcp\"\n\nThis may not be as robust as the earlier approach. Consider the option\n``--fix-gcp-xyz``, to not move the GCP during optimization.\n\nSolving for cameras when using GCP::\n\n    camera_solve out_gcp/                                     \\\n      AS15-M-0114_MED.tif AS15-M-0115_MED.tif                 \\\n      --datum D_MOON --calib-file metric_model.tsai           \\\n      --theia-overrides '--matching_strategy=CASCADE_HASHING' \\\n      --gcp-file ground_control_points.gcp\n\nExamine the lines ending in ``# GCP`` in the file::\n\n    out_gcp/asp_ba_out-final_residuals_pointmap.csv\n    \n(:numref:`ba_err_per_point`). If the residuals are no more than a handful pixels,\nand ideally less than a pixel, the GCP were used successfully. \n\nIncrease the value of ``--robust-threshold`` in ``bundle_adjust``\n(via ``--bundle-adjust-params`` in ``camera_solve``)\nif desired to bring down the big residuals in that file at the expense\nof increasing the smaller ones. Consider also deleting GCP corresponding\nto large residuals, as those may be inaccurate.\n\nIn recent ASP, one or more GCP files can be passed in without setting\n``--gcp-file``. They should end in ``.gcp``.\n\nRunning stereo\n^^^^^^^^^^^^^^\n\n::\n\n    parallel_stereo                          \\\n      AS15-M-0114_MED.tif                    \\\n      AS15-M-0115_MED.tif                    \\\n      out_gcp/AS15-M-0114_MED.tif.final.tsai \\\n      out_gcp/AS15-M-0115_MED.tif.final.tsai \\\n      -t pinhole                             \\\n      --skip-rough-homography                \\\n      --stereo-algorithm asp_mgm             \\\n      --subpixel-mode 9                      \\\n      --sgm-collar-size 256                  \\\n      s_global/out\n\nCreate a terrain model and orthoimage::\n\n     point2dem -r moon                    \\\n       --stereographic --auto-proj-center \\\n       s_global/out-PC.tif                \\\n       --orthoimage s_global/out-L.tif    \\\n       --errorimage\n\nSee :numref:`parallel_stereo` and :numref:`point2dem` for more information on\nthe options used here. \n\nThe error image can be useful to see if the intrinsics are good. Big errors in\nthe corners of the images may indicate that the intrinsics need refinement\n(:numref:`floatingintrinsics`).\n\n.. figure:: images/examples/pinhole/a15_fig.png\n   :name: pinhole-a15-result-image\n\n   Produced hillshaded DEM (left) and orthoimage (right). See\n   :numref:`stereo_alg_fig` for a comparison of stereo algorithms.\n\n:numref:`nextsteps` will discuss the ``parallel_stereo`` program\nin more detail and the other tools in ASP.\n\n.. _sfm_multiview:\n\nMultiview reconstruction\n^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe ``bundle_adjust`` program produces a report file having the convergence\nangle and number of matches between any two images in a given set\n(:numref:`ba_conv_angle`).\n\nThat data can be used to decide on promising stereo pairs to consider\n(:numref:`stereo_pairs`). Pairwise stereo and DEM creation can be run, as in\n:numref:`tutorial`.\n\nThe DEMs can be mosaicked together with ``dem_mosaic`` (:numref:`dem_mosaic`). \nTo give more weight in mosaicking to DEMs with a larger convergence angle, \nsee :numref:`dem_mosaic_external_weights`.\n\nThe input DEMs should agree quite well if the intrinsics are accurate, there is\nenough overlap between the images, many interest point matches were found, and\nthe cameras were bundle-adjusted. Refining intrinsics is discussed\nin :numref:`floatingintrinsics`.\n\nThe produced mosaicked DEM (and cameras) can be aligned to a reference terrain with\n``pc_align`` (:numref:`pc_align`).\n\nThe creation of a fused mesh is discussed in :numref:`multi_stereo`.\n\n.. _sfmicebridge:\n\nExample: IceBridge DMS Camera\n-----------------------------\n\nThe DMS (Digital Mapping System) Camera is a frame camera flown on as part of\nthe `NASA IceBridge program <http://nsidc.org/icebridge/portal/>`_, whose goal\nwas to collect images of polar terrain.\n\nThe approach is, with a few exceptions, very similar to the one for the Apollo\nMetric camera. \n\nThe DMS images are available for download at the `IceBridge ftp site\n<ftp://n5eil01u.ecs.nsidc.org/SAN2/ICEBRIDGE_FTP/IODMS0_DMSraw_v01/>`_. A list\nof the available data types can be found at the `mission data summary\n<https://nsidc.org/data/icebridge/instr_data_summary.html>`_ page.\n\nSeveral ways of creating cameras are discussed below, with or without SfM.\n \nSfM approach\n^^^^^^^^^^^^\n\nThis example uses data from the November 5, 2009 flight over Antarctica. The\nfollowing camera model (icebridge_model.tsai) was used (see\n:numref:`pinholemodels` on Pinhole camera models)::\n\n   VERSION_4\n   PINHOLE\n   fu = 28.429\n   fv = 28.429\n   cu = 17.9712\n   cv = 11.9808\n   u_direction = 1  0  0\n   v_direction = 0  1  0\n   w_direction = 0  0  1\n   C = 0 0 0\n   R = 1 0 0 0 1 0 0 0 1\n   pitch = 0.0064\n   Photometrix\n   xp = 0.004\n   yp = -0.191\n   k1 = 1.31024e-04\n   k2 = -2.05354e-07\n   k3 = -5.28558e-011\n   p1 = 7.2359e-006\n   p2 = 2.2656e-006\n   b1 = 0.0\n   b2 = 0.0\n\nNote that these images are RGB format which is not supported by all ASP\ntools. To use the files with ASP, first convert them to single channel\nimages using a tool such as ImageMagick's ``convert``,\n``gdal_translate``, or ``gdal_edit.py``. Different conversion methods\nmay produce slightly different results depending on the contents of your\ninput images. Some conversion command examples are shown below::\n\n   convert rgb.jpg -colorspace Gray gray.jpg\n   gdal_calc.py  --overwrite --type=Float32 --NoDataValue=-32768       \\\n     -A rgb.tif --A_band=1 -B rgb.tif --B_band=2 -C rgb.tif            \\\n     --C_band=3 --outfile=gray.tif --calc=\"A*0.2989+B*0.5870+C*0.1140\"\n   gdal_translate -b 1 rgb.jpg gray.jpg\n\nIn the third command we used ``gdal_translate`` to pick a single band rather\nthan combining the three. This tool is shipped with ASP (:numref:`gdal_tools`).\n\nObtaining ground control points for icy locations on Earth can be particularly\ndifficult because they are not well surveyed or because the terrain shifts over\ntime. This may force you to use estimated camera positions to convert the local\ncamera models into global coordinates. To make this easier for IceBridge data\nsets, ASP provides the ``icebridge_kmz_to_csv`` tool (see\n:numref:`icebridgekmztocsv`) which extracts a list of estimated camera positions\n(in ECEF coordinates) from the kmz files available for each IceBridge flight at\nhttp://asapdata.arc.nasa.gov/dms/missions.html.\n\nFor such logic based on camera positions to work well, the camera positions\nmust not be along a line, as then the 3D transform computed based on these\npositions will not be well-defined.\n\nAnother option which is useful when processing IceBridge data is the\n``--position-filter-dist`` option for ``bundle_adjust`` (measured in meters).\nIceBridge data sets contain a large number of images and when processing many at\nonce you can significantly decrease your processing time by using this option to\nlimit interest-point matching to image pairs which are actually close enough to\noverlap. A good way to determine what distance to use is to load the camera\nposition kmz file from their website into Google Earth and use the ruler tool to\nmeasure the distance between a pair of frames that are as far apart as you want\nto match. \n\nCommands using these options may look like this::\n\n    icebridge_kmz_to_csv 1000123_DMS_Frame_Events.kmz \\\n      camera_positions.csv\n      \n    camera_solve out                                          \\\n      2009_11_05_00667.JPG 2009_11_05_00668.JPG               \\\n      2009_11_05_00669.JPG 2009_11_05_00670.JPG               \\\n      2009_11_05_02947.JPG 2009_11_05_02948.JPG               \\\n      2009_11_05_02949.JPG 2009_11_05_02950.JPG               \\\n      2009_11_05_01381.JPG 2009_11_05_01382.JPG               \\\n      --theia-overrides '--matching_strategy=CASCADE_HASHING' \\\n      --datum WGS84 --calib-file icebridge_model.tsai         \\\n      --bundle-adjust-params                                  \\\n        '--no-datum \n         --camera-positions camera_positions.csv \n         --csv-format \"1:file 2:lon 3:lat 4:height_above_datum\" \n         --position-filter-dist 0'\n\nRun ``orbitviz`` (:numref:`orbitviz`) to visualize the camera positions::\n     \n    orbitviz out --load-camera-solve --hide-labels    \\\n     -r wgs84 -t nadirpinhole\n\nCameras from measurements\n^^^^^^^^^^^^^^^^^^^^^^^^^\n\nFor some Earth missions the positions and orientations of the cameras are known.\nThe cameras can then be found as in :numref:`cam_gen_extrinsics`.\n\nCameras from GCP\n^^^^^^^^^^^^^^^^\n\nSee :numref:`camera_solve_gcp`.\n\nCameras from orthoimages\n^^^^^^^^^^^^^^^^^^^^^^^^\n\nCameras can be created based on orthoimages, if available, such as for\nIceBridge. The ``ortho2pinhole`` (:numref:`ortho2pinhole`) tool is used. Later,\nthe obtained cameras can be bundle-adjusted. Example for grayscale images::\n\n    ortho2pinhole raw_image.tif ortho_image.tif \\\n      icebridge_model.tsai output_pinhole.tsai\n\nThis needs the camera height above the datum. If not specified, it will be read\nfrom the orthoimage metadata, if set there. See this tool's manual for more\ninformation.\n\n.. figure:: images/examples/pinhole/icebridge_camera_results.png\n   :name: pinhole-icebridge-camera-results\n\n   Left: Measuring the distance between estimated frame locations using Google\n   Earth and an IceBridge kmz file. The kmz file is from the IceBridge website\n   with no modifications. A well-chosen position filter distance will mostly\n   limit image IP matching in this case to each image's immediate \"neighbors\".\n   Right: Display of ``camera_solve`` results for ten IceBridge images using\n   ``orbitviz``.\n\n\nSome IceBridge flights contain data from the Land, Vegetation, and Ice\nSensor (LVIS) lidar which can be used to register DEMs created using DMS\nimages. LVIS data can be downloaded at\nftp://n5eil01u.ecs.nsidc.org/SAN2/ICEBRIDGE/ILVIS2.001/. The lidar data\ncomes in plain text files that ``pc_align`` and ``point2dem`` can parse\nusing the following option:: \n\n     --csv-format \"5:lat 4:lon 6:height_above_datum\"  \n\nASP provides the ``lvis2kml`` tool to help visualize the coverage and\nterrain contained in LVIS files, see :numref:`lvis2kml`\nfor details. The LVIS lidar coverage is sparse compared to the image\ncoverage and you will have difficulty getting a good registration unless\nthe region has terrain features such as hills or you are registering\nvery large point clouds that overlap with the lidar coverage across a\nwide area. Otherwise ``pc_align`` will simply slide the flat terrain to\nan incorrect location to produce a low-error fit with the narrow lidar\ntracks. This test case was specifically chosen to provide strong terrain\nfeatures to make alignment more accurate but ``pc_align`` still failed\nto produce a good fit until the lidar point cloud was converted into a\nsmoothed DEM.\n\nTerrain creation\n^^^^^^^^^^^^^^^^\n\nRun ``parallel_stereo`` (:numref:`parallel_stereo`) on the DMS images::\n\n   parallel_stereo -t nadirpinhole       \\\n     --sgm-collar-size 256               \\\n     --skip-rough-homography             \\\n     --stereo-algorithm asp_mgm          \\\n     --subpixel-mode 9                   \\\n     --sgm-collar-size 256               \\\n     2009_11_05_02948.JPG                \\\n     2009_11_05_02949.JPG                \\\n     out/2009_11_05_02948.JPG.final.tsai \\\n     out/2009_11_05_02949.JPG.final.tsai \\\n     st_run/out\n\nCreate a DEM and orthoimage from the stereo results with ``point2dem``\n(:numref:`point2dem`)::\n\n   point2dem --datum WGS_1984 \\\n     --auto-proj-center       \\\n     st_run/out-PC.tif        \\\n     --orthoimage st_run/out-L.tif\n\nThis will auto-guess an UTM or polar stereographic projection \n(:numref:`point2dem_proj`).\n\nColorize and hillshade the DEM::\n     \n   colormap --hillshade st_run/out-DEM.tif\n   \nCreate a DEM from the LVIS data::\n\n   point2dem ILVIS2_AQ2009_1105_R1408_055812.TXT     \\\n     --datum WGS_1984                                \\\n     --auto-proj-center                              \\\n     --csv-format \"5:lat 4:lon 6:height_above_datum\" \\\n     --tr 30                                         \\\n     --search-radius-factor 2.0                      \\\n     -o lvis\n\nHow to combine multiple DEMs is described in :numref:`sfm_multiview`.\n\nTerrain alignment\n^^^^^^^^^^^^^^^^^\n\nAlign the produced stereo point cloud to the LVIS data using ``pc_align``\n(:numref:`pc_align`)::\n        \n   pc_align --max-displacement 1000                         \\\n     st_run/out-DEM.tif ILVIS2_AQ2009_1105_R1408_055812.TXT \\\n     --csv-format \"5:lat 4:lon 6:height_above_datum\"        \\\n     --save-inv-transformed-reference-points                \\\n     --datum wgs84 --outlier-ratio 0.55                     \\\n     -o align_run/out\n  \nA DEM can be produced from the aligned point cloud, that\ncan then be overlaid on top of the LVIS DEM.\n\nFor processing multiple images, see :numref:`sfm_multiview`.\n\n.. figure:: images/examples/pinhole/icebridge_dem.png\n   :name: pinhole-icebridge\n   :alt: A DEM and orthoimage produced with IceBridge data\n\n   A DEM and orthoimage produced with IceBridge data. The wavy artifacts in the\n   bottom-right should go away if running a second-pass stereo with mapprojected\n   images (:numref:`mapproj-example`), with a blurred version of this DEM\n   as an initial guess.\n\nOther IceBridge flights contain data from the Airborne Topographic\nMapper (ATM) lidar sensor. Data from this sensor comes packed in one of\nseveral formats (variants of .qi or .h5) so ASP provides the\n``extract_icebridge_ATM_points`` tool to convert them into plain text\nfiles, which later can be read into other ASP tools using the\nformatting::\n\n     --csv-format \"1:lat 2:lon 3:height_above_datum\"\n\nTo run the tool, just pass in the name of the input file as an argument\nand a new file with a csv extension will be created in the same\ndirectory. Using the ATM sensor data is similar to using the LVIS sensor\ndata.\n\nFor some IceBridge flights, lidar-aligned DEM files generated from the\nDMS image files are available, see the web page here:\nhttp://nsidc.org/data/iodms3 These files are improperly formatted and\ncannot be used by ASP as is. To correct them, run the\n``correct_icebridge_l3_dem`` tool as follows::\n\n   correct_icebridge_l3_dem IODMS3_20120315_21152106_07371_DEM.tif \\\n     fixed_dem.tif 1  \n\nThe third argument should be 1 if the DEM is in the northern hemisphere\nand 0 otherwise. The corrected DEM files can be used with ASP like any\nother DEM file.\n\n:numref:`nextsteps` will discuss the ``parallel_stereo`` program\nin more detail and the other tools in ASP.\n\n.. _camera_solve_gcp:\n\nSolving for pinhole cameras using GCP\n-------------------------------------\n\nA quick alternative to SfM with ``camera_solve`` is to create correctly oriented\ncameras using ground control points (GCP, :numref:`bagcp`), an initial camera\nhaving intrinsics only, and bundle adjustment. Here we outline this process.\n\nGCP creation\n^^^^^^^^^^^^\n\nGiven the camera image, a similar-enough orthoimage, and a DEM, the ``gcp_gen``\nprogram (:numref:`gcp_gen`) can create a GCP file for it::\n\n    gcp_gen --camera-image img.tif \\\n      --ortho-image ortho.tif      \\\n      --dem dem.tif                \\\n      --output-prefix run/run      \\\n      --output-gcp gcp.gcp\n\nIf only a DEM is known, but in which one could visually discern roughly the same\nfeatures seen in the camera image, GCP can be created with point-and-click in\n``stereo_gui`` (:numref:`creatinggcp`). Such an input DEM can be found\nas shown in :numref:`initial_terrain`. If the geolocations of image corners are \nknown, use instead ``cam_gen`` (:numref:`cam_gen`).\n\n.. _cam_from_gcp:\n\nCamera creation from GCP\n^^^^^^^^^^^^^^^^^^^^^^^^\n\nWe use the GCP to find the camera pose. For that, first create a Pinhole camera\n(:numref:`pinholemodels`) file, say called ``init.tsai``, with only the\nintrinsics (focal length and optical center), and using trivial values for the\ncamera center and rotation matrix::\n\n   VERSION_4\n   PINHOLE\n   fu = 28.429\n   fv = 28.429\n   cu = 17.9712\n   cv = 11.9808\n   u_direction = 1  0  0\n   v_direction = 0  1  0\n   w_direction = 0  0  1\n   C = 0 0 0\n   R = 1 0 0 0 1 0 0 0 1\n   pitch = 0.0064\n   NULL\n\nThe entries ``fu``, ``fv``, ``cu``, ``cv``, amd ``pitch`` must be in the same\nunits (millimeters or pixels). When the units are pixels, the pixel pitch must\nbe set to 1. \n\nThe optical center can be half the image dimensions, and the focal length can be\ndetermined using the observation that the ratio of focal length to image width\nin pixels is the same as the ratio of camera elevation to ground footprint width\nin meters.\n\nHere we assumed no distortion. Distortion can be refined later, if needed\n(:numref:`floatingintrinsics`). \n  \nFor each camera image, run bundle adjustment with this data::\n\n    bundle_adjust -t nadirpinhole \\\n      img.tif init.tsai gcp.gcp   \\\n      --datum WGS84               \\\n      --inline-adjustments        \\\n      --init-camera-using-gcp     \\\n      --camera-weight 0           \\\n      --num-iterations 100        \\\n      --robust-threshold 2        \\\n      -o ba/run\n\nThis will write the desired correctly oriented camera file as\n``ba/run-init.tsai``. The process can be repeated for each camera with an\nindividual output prefix.\n\nThe datum field must be adjusted depending on the planet.\n\n.. _cam_gcp_validation:\n\nValidation\n^^^^^^^^^^\n\nIt is very important to inspect the file::\n\n  ba/run-final_residuals_pointmap.csv\n\nand look at the 4th column. Those will be the pixel residuals (reprojection\nerror into cameras). They should be under a few pixels each, otherwise there is\na mistake. \n  \nIf bundle adjustment is invoked with a positive number of iterations, and with a\nsmall value for the robust threshold, it tends to optimize only some of the\ncorners and ignore the others, resulting in a large reprojection error, which is\nnot desirable. If however, this threshold is too large, it may try to optimize\nGCP that may be outliers, resulting in a poorly placed camera.\n\nOne can use the bundle adjustment option ``--fix-gcp-xyz`` to not\nmove the GCP during optimization, hence forcing the cameras to move more\nto conform to them.\n\nValidate the produced camera with ``mapproject``::\n\n  mapproject dem.tif img.tif ba/run-init.tsai img.map.tif\n\nand overlay the result on top of the DEM.\n  \nASP provides a tool named ``cam_gen`` which can also create a pinhole\ncamera as above, and, in addition, is able to extract the heights of the\ncorners from a DEM (:numref:`cam_gen`).\n\nSee also the ``bundle_adjust`` option ``--transform-cameras-with-shared-gcp``.\nThis applies a wholesale transform to a self-consistent collection of cameras.\n\n.. _findintrinsics:\n\nRefining the camera poses and intrinsics\n----------------------------------------\n\nThe poses of the produced camera models can be jointly optimized with\n``bundle_adjust`` (:numref:`bundle_adjust`).\n\nOptionally, the intrinsics can be refined as well. Detailed recipes are in\n:numref:`floatingintrinsics`. \n\n.. _sfm_uas:\n\nUAS example\n-----------\n\nThe following example demonstrates how to produce camera models and a joint DEM\nfrom images taken by a UAS (Unmanned Aerial System). It is assumed\nthat:\n\n - The images store in the EXIF metadata the camera center longitude, latitude,\n   height above the datum, and yaw angle (the ``GPSImgDirection`` field),\n   relative to the North direction. Alternatively, this information (and\n   perhaps also camera roll and pitch) is available in a list.\n   \n - The camera looks generally downward. This is not a strong assumption but\n   makes it easier to determine which images overlap with which.\n\n - The camera is Frame (Pinhole) (:numref:`pinholemodels`), with known\n   intrinsics. If those are not known, it is shown below how to estimate them\n   and then refine them later.\n\nThe metadata is extracted from the EXIF header with the ``sfm_proc`` program\n(:numref:`sfm_proc`)::\n\n    ls images/*.JPG > images/image_list.txt\n    sfm_proc                             \\\n      --image-list images/image_list.txt \\\n      --out-dir cameras\n   \nThis writes the file ``cameras/extrinsics.txt``, having the above-mentioned\ninformation. This file can also be created manually if the needed data are \nstored in other ways. \n\nThe format of this file and how to use the ``cam_gen`` program to create the\ncamera models is shown in :numref:`cam_gen_extrinsics`. That program needs the\ncamera intrinsics, including the focal length and optical center in pixel units,\nand the lens distortion parameters. \n\nIf the focal length is not known, it is suggested to estimate it from the\n``FocalLengthIn35mmFilm`` field in the EXIF header, if available. \nFor example, if this has the value ``46``, and the image width is known \nto be 9248 pixels, the following gives an estimate for the focal length in\npixels::\n\n  focal_length = 46.0 * 9248.0 / 35.0 = 12154.51428571\n  \nThe optical center can be set to half the image dimensions. The lens distortion\ncoefficients can be set to 0 for an initial estimate.\n\nThe produced rough camera models can be validated as shown in\n:numref:`cam_gen_validation`. That will require an external DEM,\nthat can be found as described in :numref:`initial_terrain`, and\nwhich may need an adjustment as shown in :numref:`conv_to_ellipsoid`.\n\nThe camera models can be refined with ``bundle_adjust`` with fixed intrinsics,\nas shown in :numref:`kaguya_ba_initial_ba`. The intrinsics can be refined later\n(:numref:`floatingintrinsics`).\n\nThe images and produced cameras can be used to create and then merge DEMs, per\n:numref:`sfm_multiview`.\n\nThe general Structure-from-Motion (SfM) approach is described in\n:numref:`sfm`.\n"
  },
  {
    "path": "docs/sfs_usage.rst",
    "content": ".. _sfs_usage:\n\nOverview of SfS\n---------------\n\nASP provides a tool, named ``sfs`` (:numref:`sfs`), that can improve the level\nof detail of DEMs created by ASP or any other source using *shape-from-shading*\n(SfS). This program takes as input one or more images and cameras, a DEM at\nroughly the same resolution as the images, and returns a refined DEM.\n\nThe modeling approach is described in :cite:`alexandrov2018multiview`.\n\nThe ``sfs`` program works with any cameras supported by ASP, for Earth and other\nplanets. The option ``--sun-angles`` can be used to to specify the Sun\ninformation for each image. For ISIS and CSM cameras, if this option is not set,\nthe needed information is read from the camera files.\n\nThe ``sfs`` program can model position-dependent albedo (:numref:`sfs_albedo`),\nexposure values for each camera, atmospheric haze, shadows in the input images,\nand regions in the DEM occluded from the Sun.\n\nA program named ``parallel_sfs`` is provided (:numref:`parallel_sfs`)\nthat parallelizes ``sfs`` using multiple processes (optionally on\nmultiple machines) by splitting the input DEM into tiles with padding,\nrunning ``sfs`` on each tile, and then blending the results. It was used\nto create DEMs of dimensions 10,000 by 10,000 pixels.\n\n.. _sfs_examples:\n\nExamples\n--------\n\n - A single image example with LRO NAC Lunar images (:numref:`sfs_single_image`).\n - A small example with multiple LRO NAC images (:numref:`sfs_multiview`).\n - Large-scale SfS with LRO NAC images (:numref:`sfs-lola`).\n - Kaguya Lunar images (:numref:`sfs_kaguya`).\n - Earth example, with atmospheric haze (:numref:`sfs_earth`).\n - CTX Mars example (:numref:`sfs_ctx`).\n\nLimitations\n-----------\n\nThis program is experimental. It assumes a certain reflectance model\nof the surface, which may or may not be accurate for a given setting. \n\n``sfs`` is very sensitive to errors in the position and\norientation of the cameras, the accuracy of the initial DEM, and to\nthe value of the weights it uses.\n\n``sfs`` has been tested thoroughly with Lunar LRO NAC datasets.\nAs can be seen below, ``sfs`` returns reasonable results on the Moon\nas far as 85 degrees and even 89.6 degrees South.\n\nSfS was shown to give reasonable results with CTX Mars images\n(:numref:`sfs_ctx`). The improvement is real, but somewhat modest. \n\nAn example for Earth is :numref:`sfs_earth`, that shows that our program can\ngive plausible results.\n\nIt is suggested to invoke this tool with a terrain model that is\nalready reasonably accurate, and with images with diverse illumination\nconditions registered to it, when ``sfs`` can do fine-level\nrefinements.\n\nThe program was employed successfully for Mercury (:cite:`bertone2023highly`).\nApplications for the Moon are described in :cite:`hemmi2025lroc` and\n:cite:`boatwright2024sfs`.\n\n.. _sfs_formulation:\n\nMathematical model\n------------------\n\nThis program works by minimizing the cost function\n\n.. math::\n\n   \\label{cost}\n     \\int\\!\\! \\int \\! \\sum_k \\left[ I_k(\\phi(x, y)) - T_k A(x, y)\n       R_k(\\phi(x, y)) - H_k\\right]^2\\, \\\\ \n     + \\mu \\left\\|\\nabla^2 \\phi(x, y) \\right\\|^2  \n     + \\lambda  \\left[ \\phi(x, y) - \\phi_0(x, y) \\right]^2\n     \\, dx\\, dy.\n\nHere, :math:`I_k(\\phi(x, y))` is the :math:`k`-th camera image\ninterpolated at pixels obtained by projecting into the camera 3D points\nfrom the terrain :math:`\\phi(x, y)`, :math:`T_k` is the :math:`k`-th\nimage exposure, :math:`A(x, y)` is the per-pixel normalized albedo,\n:math:`R_k(\\phi(x, y))` is the reflectance computed from the terrain for\n:math:`k`-th image, :math:`\\left\\|\\nabla^2 \\phi(x, y) \\right\\|^2` is the\nsum of squares of all second-order partial derivatives of :math:`\\phi`.\n\nThe term :math:`H_k` is the atmospheric haze, which is assumed to be zero\nfor the Moon but is modeled for Earth and Mars.\n\nThe value :math:`\\mu > 0` is a smoothness weight, and :math:`\\lambda > 0`\ndetermines how close we should stay to the input terrain :math:`\\phi_0` (smaller\n:math:`\\mu` will show more detail but may introduce some artifacts, and smaller\n:math:`\\lambda` may allow for more flexibility in optimization but the terrain\nmay move too far from the input).\n\nWe use either the regular Lambertian reflectance model, or the\nLunar-Lambertian model :cite:`mcewen1991photometric`, more\nspecifically as given in :cite:`lohse2006derivation` (equations (3)\nand (4)). Also supported is the Hapke model,\n:cite:`johnson2006spectrophotometric`, :cite:`fernando2013surface`,\n:cite:`hapke2008bidirectional`, :cite:`hapke1993opposition`. Custom\nvalues for the coefficients of these models can be passed to the\nprogram.\n\nNote that the albedo in the above expression is normalized, its\nnominal value is 1.  The image intensity ideally equals the image\nexposure times albedo times reflectance, hence the image exposure\nabsorbs any existing constant multiplier.\n\nThe exposure value for a camera is computed as the average of the image\nintensity divided by the average reflectance, both computed over the DEM.\nIf the problem is parallelized using ``parallel_sfs``, the exposures\nare found just once, over the entire DEM, rather than for each tile.\nThe exposures can be optimized while solving for the DEM.\n\nIt is important to note that the default Lunar-Lambertian model may\nnot be the right choice for other planetary bodies, hence some\nresearch may be needed to decide the correct model for your\napplication.\n\n.. _fetch_lro_images:\n\nHow to get images\n-----------------\n\nWe obtain the images from http://wms.lroc.asu.edu/lroc/search (search\nfor EDR images of type NACL and NACR).\n\nA faster (but not as complete) interface is provided by\nhttp://ode.rsl.wustl.edu/moon/indexproductsearch.aspx.\nThis site allows for bulk downloads, but does not permit datasets\nbigger than several tens of GB, so several attempts may be necessary.\n\nThe related site http://ode.rsl.wustl.edu/moon/indextools.aspx?displaypage=lolardr \ncan provide LOLA datasets which can be used as (sparse) ground truth.\n\nIf desired to use a gridded LOLA DEM as an initial guess, see\n:numref:`sfs-lola`.\n\nWe advise the following strategy for picking images. First choose a\nsmall longitude-latitude window in which to perform a search for\nimages. Pick two images that are very close in time and with a big\namount of overlap (ideally they would have consecutive orbit numbers).\nA good convergence angle is expected (:numref:`stereo_pairs`).\nThose images can be passed to ASP's ``parallel_stereo`` tool to create an\ninitial DEM.  Then, search for other images close to the center of the\nmaximum overlap of the first two images. Pick one or more of those,\nideally with different illumination conditions than the first\ntwo. Those (together with one of the first two images) can be used for\nSfS.\n\nTo locate the area of spatial overlap, the images can be map-projected\n(either with ``cam2map`` with a coarse resolution) or with\n``mapproject``, using for example the LOLA DEM as the terrain to\nproject onto, or the DEM obtained from running ``parallel_stereo`` on\nthose images. Then the images can be overlaid as georeferenced images\nin ``stereo_gui`` (:numref:`stereo_gui`). A good sanity check is to\nexamine the shadows in various images. If they point in different\ndirections in the images and perhaps also have different lengths, that\nmeans that illumination conditions are different enough, which will\nhelp constrain the ``sfs`` problem better.\n\nAn example for how to download and prepare the datasets is shown\nin :numref:`sfs_single_image`.\n\n.. _sfs_isis_vs_csm:\n\nISIS vs CSM models\n------------------\n\nCSM (:numref:`csm`) is a modern sensor model which can be used with\nmultiple threads, and can be on the order of 7-15 times faster than the\nISIS .cub model it is meant to replace, as benchmarked with\n``mapproject``, ``bundle_adjust``, and ``sfs``.\n\nGiven a set of ISIS .cub camera files it is desired to run SfS on, it is\n*strongly suggested* to convert them to corresponding CSM models as described in\n:numref:`create_csm_linescan`.\n\nIf the CSM models have no more than 0.5 pixels of discrepancy when compared to\nthe .cub cameras, as validated with ``cam_test`` (:numref:`cam_test`), use the\nCSM models instead of the ISIS ones in all the tools outlined below\n(``parallel_bundle_adjust``, ``parallel_stereo``, ``mapproject``, and\n``parallel_sfs``). The SfS DEMs obtained with these two methods were observed to\ndiffer by several millimeters at most, on average, but an evaluation may be\nnecessary for your particular case.\n\nThis will work only for the datasets with original dimensions, so\nnot together with the ``reduce`` or ``crop`` commands.\n\nAny of the commands further down which only use .cub files can be\nadapted for use with CSM cameras by appending to those commands the\nCSM .json cameras in the same order as the .cub files, from which only\nthe image information will then be used, with the camera information\ncoming from the .json files.\n\nFor example, if ``sfs`` is run with an ISIS camera as::\n\n  sfs --use-approx-camera-models\\\n   --crop-input-images          \\\n    -i input_dem.tif image.cub  \\\n    -o sfs_isis/run\n\nthen, the corresponding command using the CSM model will be::\n\n  sfs --crop-input-images \\\n    -i input_dem.tif      \\\n    image.cub image.json  \\\n    -o sfs_csm/run\n\nThe option ``--use-approx-camera-models`` is no longer necessary\nas the CSM model is fast enough. It is however suggested to still\nkeep the ``--crop-input-images`` option. \n\nBundle adjustment saves CSM camera files with adjustments already applied to\nthem, so the resulting cameras can be used without the\n``--bundle-adjust-prefix`` option.\n\n.. _sfs_single_image:\n\nSfS at 1 meter/pixel using a single image\n-----------------------------------------\n\nIn both this and the next sections we will work with LRO NAC images\ntaken close to the Lunar South Pole, at a latitude of 85 degrees\nSouth (the tool was tested on equatorial regions as well). We will use\nfour images, M139939938LE, M139946735RE, M173004270LE, and M122270273LE.\n\nData preparation\n^^^^^^^^^^^^^^^^\n\nFetch the images::\n\n    wget http://lroc.sese.asu.edu/data/LRO-L-LROC-2-EDR-V1.0/LROLRC_0005/DATA/SCI/2010267/NAC/M139939938LE.IMG\n    wget http://lroc.sese.asu.edu/data/LRO-L-LROC-2-EDR-V1.0/LROLRC_0005/DATA/SCI/2010267/NAC/M139946735RE.IMG\n    wget http://lroc.sese.asu.edu/data/LRO-L-LROC-2-EDR-V1.0/LROLRC_0009/DATA/SCI/2011284/NAC/M173004270LE.IMG\n    wget http://lroc.sese.asu.edu/data/LRO-L-LROC-2-EDR-V1.0/LROLRC_0002/DATA/MAP/2010062/NAC/M122270273LE.IMG\n\nWe convert these to ISIS cubes, initialize the SPICE kernels, and\nperform radiometric calibration and echo correction. That is explained\nin :numref:`lro_nac_no_stitch`.\n\nIt can be convenient to create preview versions of these datasets, at\n10% of original resolution, for the purpose of inspection. That is\ndone as follows::\n\n    f=M139939938LE\n    reduce from = ${f}.cal.echo.cub to = ${f}.cal.echo.sub10.cub  \\\n      sscale = 10 lscale = 10\n\nFor simplicity, we create we create shorter aliases for these images::\n\n    ln -s M139939938LE.cal.echo.cub A.cub\n    ln -s M139946735RE.cal.echo.cub B.cub\n    ln -s M173004270LE.cal.echo.cub C.cub\n    ln -s M122270273LE.cal.echo.cub D.cub\n\n.. _initial_sfs_dem:\n\nInitial DEM creation\n^^^^^^^^^^^^^^^^^^^^\n\nThe first step is to run bundle adjustment (:numref:`bundle_adjust`) and stereo\n(:numref:`parallel_stereo`) to create an initial guess DEM. We picked for this\nthe first two of these images. These form a stereo pair\n(:numref:`stereo_pairs`), that is, they have a reasonable baseline and\nsufficiently close times of acquisition hence very similar illuminations). These\nconditions are necessary to obtain a good stereo result.\n\nBelow we assume CSM cameras are used (:numref:`sfs_isis_vs_csm`).\nOtherwise the ``.json`` files should be omitted. \n\n::\n\n    bundle_adjust A.cub B.cub A.json B.json   \\\n      --num-iterations 100 -o ba/run\n\n    parallel_stereo                           \\\n      --left-image-crop-win 0 7998 2728 2696  \\\n      --right-image-crop-win 0 9377 2733 2505 \\\n      --stereo-algorithm asp_mgm              \\\n      --subpixel-mode 9                       \\\n      --bundle-adjust-prefix ba/run           \\\n      A.cub B.cub A.json B.json               \\\n      run_full1/run\n\nSee :numref:`running-stereo` for a discussion about various speed-vs-quality\nchoices in stereo. See :numref:`mapproj-example` about handling artifacts in\nsteep terrain. \n\nThe crop windows above were chosen with ``stereo_gui`` (:numref:`stereo_gui`).\n\nNext we create a DEM. We use the stereographic projection since this dataset is\nvery close to the South Pole. Normally a projection centered close to area of\ninterest is suggested (:numref:`point2dem_proj`).\n\n::\n\n    point2dem -r moon --stereographic --proj-lon 0  \\\n      --proj-lat -90 run_full1/run-PC.tif\n\nIt is very important that the resolution of the DEM be comparable to the ground\nsample distance (GSD) of the images. This will ensure optimal sampling.\n\nSfS can only be run on a DEM with valid data at each grid point.  The\nDEM obtained above should be opened in ``stereo_gui``, and the bounds\nof a clip having only valid data should be determined\n(:numref:`image_bounds`). Such a clip is cropped using\n``gdal_translate`` (:numref:`gdal_tools`) as::\n\n    gdal_translate -projwin -15471.9 150986 -14986.7 150549  \\\n      run_full1/run-DEM.tif run_full1/run-crop-DEM.tif\n\nThis creates a DEM clip of size 456 |times| 410 pixels.  \n\nThe ``point2dem`` program auto-determines the DEM resolution (grid\nsize), as an estimate of the image *ground sample distance\n(GSD)*. This is the optimal resolution to run SfS at. If creating your\ninput DEM some other way, it is strongly suggested to use a DEM grid\nsize not too different from the GSD, in order to get the best\nquality. The ``mapproject`` program (:numref:`mapproject`), when\ninvoked with no input grid size, computes the grid size as the image\nGSD, and that value can then be used when creating the input SfS DEM.\n\nIf this DEM has holes, those can be filled in ``dem_mosaic``\n(:numref:`dem_mosaic_extrapolate`). \n\nThe ``dem_mosaic`` program can also apply some blur to attenuate big artifacts\n(:numref:`dem_mosaic_blur`). Use, for example, ``--dem-blur-sigma 2``. Note that\n``sfs`` has a smoothness term which should take care of very small\nimperfections in the input.\n\nSee :numref:`sfs_initial_terrain` for how to use a third-party DEM as input to\nSfS. Then, alignment of the cameras to that DEM is needed. This is a multi-step\nprocess, outlined in detail in :numref:`sfs-lola`.\n\nRunning SfS\n^^^^^^^^^^^\n\nThen we run ``sfs`` on this clip (for a larger clip ``parallel_sfs``\nshould be used instead, see :numref:`parallel_sfs`)::\n\n    sfs -i run_full1/run-crop-DEM.tif       \\\n      A.cub A.json                          \\\n      --use-approx-camera-models            \\\n      --crop-input-images                   \\\n      --reflectance-type 1                  \\\n      --smoothness-weight 0.08              \\\n      --initial-dem-constraint-weight 0.001 \\\n      --max-iterations 10                   \\\n      -o sfs_ref1/run\n\nThe smoothness weight is a parameter that needs tuning. If it is too small, SfS\nwill return noisy results, if it is too large, too much detail will be blurred.\nOne can experiment with values between 0.01 and 100,000 with a factor of 10 to\nfind this weight, and then refine it in smaller steps. A discussion of this\nterm is in :cite:`lesage2021constraints`.\n\nHere we used the Lunar-Lambertian model. The meaning of the other ``sfs``\noptions can be looked up in :numref:`sfs`.\n\nNormally 5-10 iterations is enough, even when convergence is not reached, as the\nsolution usually improves quickly at first and only very fine refinements\nhappen later.\n\nThe value of ``--initial-dem-constraint-weight`` is best set to something very\nsmall when the initial DEM is not very reliable, as otherwise defects from it\ncan be inherited by the SfS result. Otherwise a value between 0.001 and 0.002\nmay be good enough. Use a higher value when the input DEM is reliable but the\nreflectance model is not.\n\nSee :numref:`sfs_albedo` for modeling of albedo. Shadow thresholds may be needed\nto avoid artifacts in shadow. See :numref:`sfs_crater_bottoms` for a potential\nsolution to flat crater bottoms in areas in shadow.\n\nIn the next sections, where SfS will be done with multiple images, more\nparameters which can control the quality of the result will be explored.\n\nSee :numref:`sfs_outputs` for where ``sfs`` stores its outputs.\n\nSee :numref:`sfs_kaguya` for an example of running SfS on Kaguya TC images.\n\n.. _sfs_inspection:\n\nInspecting the results\n^^^^^^^^^^^^^^^^^^^^^^\n\nWe show the results of running this program in :numref:`sfs1`. The\nleft-most figure is the hill-shaded original DEM, which was obtained\nby running the ``hillshade`` program (:numref:`hillshade`)::\n\n    hillshade --azimuth 300 --elevation 20 run_full1/run-crop-DEM.tif \\\n      -o run_full1/run-crop-hill.tif \n\nThe second image is the hill-shaded DEM obtained after running ``sfs``\nfor 10 iterations.\n\nThe third image is, for comparison, the map-projection of A.cub onto the\noriginal DEM, obtained via the command::\n\n    mapproject --tr 1 run_full1/run-crop-DEM.tif A.cub A_map.tif \\\n      --tile-size 1024\n\n(For small DEMs one can use a smaller ``--tile-size`` to start more\nsubprocesses in parallel to do the mapprojection. That is not needed\nwith CSM cameras as then ``mapproject`` is multithreaded.)\n\nThe fourth image is the colored absolute difference between the\noriginal DEM and the SfS output, obtained by running ``geodiff``\n(:numref:`geodiff`)::\n\n    geodiff --absolute sfs_ref1/run-DEM-final.tif \\\n      run_full1/run-crop-DEM.tif -o out\n    colormap --min 0 --max 2 out-diff.tif\n\n.. figure:: images/sfs1.jpg\n   :name: sfs1\n   :alt: An sfs illustration \n\n   An illustration of ``sfs``. The images are, from left to right, the\n   original hill-shaded DEM, the hill-shaded DEM obtained from ``sfs``,\n   the image A.cub map-projected onto the original DEM, and the absolute\n   difference of the original and final DEM, where the brightest shade\n   of red corresponds to a 2 meter height difference.\n\nIt can be seen that the optimized DEM provides a wealth of detail and\nlooks quite similar to the input image. It also did not diverge\nsignificantly from the input DEM. We will see in the next section that\nSfS is in fact able to make the refined DEM more accurate than the\ninitial guess (as compared to some known ground truth), though that is\nnot guaranteed, and most likely did not happen here where just one image\nwas used.\n\n.. _sfs_albedo:\n\nAlbedo modeling with one or more images\n---------------------------------------\n\nWhen using a single input image, it may be preferable to avoid floating\n(solving for) the albedo (option ``--float-albedo``), hence to have it\nset to 1 and kept fixed. The reason for that is because for a single\nimage it is not possible to distinguish if a bright image area comes\nfrom lighter-colored terrain or from having an inclination which makes\nit face the Sun more.\n\nIf desired to float the albedo with one image, it is suggested to use\na higher value of ``--initial-dem-constraint-weight`` to constrain the\nterrain better in order to make albedo determination more reliable.\nThe albedo can be prevented from changing too much if the\n``--albedo-constraint-weight`` parameter is used.\n\nAlbedo should be floated with two or more images, if albedo variations\nare clearly visible, and if those images have sufficiently different\nillumination conditions, as then the albedo and slope effects can be\nseparated more easily. For images not having obvious albedo variations\nit may be prudent to keep the albedo fixed at the nominal value of 1.\n\nIt is important to use appropriate values for the\n``--shadow-thresholds`` parameter, as otherwise regions in shadow will\nbe interpreted as lit terrain with a pitch-black color, and the computed\nalbedo and terrain will have artifacts.\n\nSee :numref:`sfs_outputs` for the produced file having the albedo.\n\nAn example showing modeling of albedo (and atmospheric haze) is in\n:numref:`sfs_earth`.\n\n.. _sfs_multiview:\n\nSfS with multiple images in the presence of shadows\n---------------------------------------------------\n\nIn this section we will run ``sfs`` with multiple images. We would\nlike to be able to see if SfS improves the accuracy of the DEM rather\nthan just adding detail to it. We evaluate this using the following\n(admittedly imperfect) approach. We reduce the resolution of the\noriginal images by a factor of 10, run stereo with them, followed by\nSfS using the stereo result as an initial guess and with the resampled\nimages. As ground truth, we create a DEM from the original images at\nthe higher resolution of 1 meter/pixel, which we bring closer to the\ninitial guess for SfS using ``pc_align``. We would like to know if\nrunning SfS brings us even closer to this \"ground truth\" DEM.\n\nThe most significant challenge in running SfS with multiple images is\nthat shape-from-shading is highly sensitive to errors in camera\nposition and orientation. It is suggested to bundle-adjust the cameras\nfirst (:numref:`bundle_adjust`). \n\nIt is important to note that bundle adjustment may fail if the images\nhave very different illumination, as it will not be able to\nfind matches among images. A solution to this is discussed in\n:numref:`sfs-lola`, and it amounts to bridging the gap with more\nimages of intermediate illumination.\n\nIt is strongly suggested that, when doing bundle adjustment, the\nimages should be specified in the order given by Sun azimuth angle\n(see :numref:`sfs_azimuth`). The images should also be mapprojected\nand visualized (in the same order), to verify that the illumination is\nchanging gradually.\n\nTo make bundle adjustment and stereo faster, we first crop the images,\nsuch as shown below (the crop parameters can be determined via\n``stereo_gui``, :numref:`stereo_gui`).\n\n::\n\n    crop from = A.cub to = A_crop.cub sample = 1 line = 6644 \\\n      nsamples = 2192 nlines = 4982\n    crop from = B.cub to = B_crop.cub sample = 1 line = 7013 \\\n        nsamples = 2531 nlines = 7337\n    crop from = C.cub to = C_crop.cub sample = 1 line = 1    \\\n      nsamples = 2531 nlines = 8305\n    crop from = D.cub to = D_crop.cub sample = 1 line = 1    \\\n      nsamples = 2531 nlines = 2740\n\nNote that manual cropping is not practical for a very large number of\nimages. In that case, it is suggested to mapproject the input images\nonto some smooth DEM whose extent corresponds to the terrain to be\ncreated with ``sfs`` (with some extra padding), then run bundle\nadjustment with mapprojected images (option ``--mapprojected-data``,\nillustrated in :numref:`sfs-lola`) and stereo also with\nmapprojected images (:numref:`mapproj-example`). This will not only be\nautomated and faster, but also more accurate, as the inputs will be\nmore similar after mapprojection.\n\nBundle adjustment (:numref:`bundle_adjust`) and stereo happens as\nfollows::\n\n    bundle_adjust A_crop.cub B_crop.cub C_crop.cub D_crop.cub \\\n      --num-iterations 100 --save-intermediate-cameras        \\\n      --ip-per-image 20000 --max-pairwise-matches 2000        \\\n      --min-matches 1 --num-passes 1 -o run_ba/run\n    parallel_stereo A_crop.cub B_crop.cub run_full2/run       \\\n      --subpixel-mode 3 --bundle-adjust-prefix run_ba/run\n\nOne can try using the stereo option ``--nodata-value``\n(:numref:`stereodefault`) to mask away shadowed regions, which may\nresult in more holes but less noise in the terrain created from\nstereo.\n\nSee :numref:`running-stereo` for a discussion about various\nspeed-vs-quality choices, and :numref:`mapproj-example` about handling\nartifacts in steep terrain.  Consider using CSM cameras instead of\nISIS cameras (:numref:`sfs_isis_vs_csm`).\n\nThe resulting cloud, ``run_full2/run-PC.tif``, will be used to create\nthe \"ground truth\" DEM. As mentioned before, we'll in fact run SfS\nwith images subsampled by a factor of 10. Subsampling is done by\nrunning the ISIS ``reduce`` command::\n\n    for f in A B C D; do \n      reduce from = ${f}_crop.cub to = ${f}_crop_sub10.cub \\\n        sscale = 10 lscale = 10\n    done\n\nWe run bundle adjustment and parallel_stereo with the subsampled\nimages using commands analogous to the above. It was quite challenging\nto find match points, hence the ``--mapprojected-data`` option in\n``bundle_adjust`` was used, to find interest matches among\nmapprojected images. The process went as follows::\n\n    # Prepare mapprojected images (see note in the text below)\n    parallel_stereo A_crop_sub10.cub B_crop_sub10.cub \\\n      --subpixel-mode 3 run_sub10_noba/run\n    point2dem -r moon --tr 10 --stereographic         \\\n      --proj-lon 0 --proj-lat -90                     \\\n      run_sub10_noba/run-PC.tif\n    for f in A B C D; do \n      mapproject run_sub10_noba/run-DEM.tif --tr 10   \\\n        ${f}_crop_sub10.cub ${f}_sub10.map.noba.tif\n    done\n\n    # Run bundle adjustment\n    bundle_adjust A_crop_sub10.cub B_crop_sub10.cub     \\\n      C_crop_sub10.cub D_crop_sub10.cub --min-matches 1 \\\n      --num-iterations 100 --save-intermediate-cameras  \\\n      -o run_ba_sub10/run --ip-per-image 20000          \\\n      --max-pairwise-matches 2000 --overlap-limit 200   \\\n      --match-first-to-last --num-passes 1              \\\n      --mapprojected-data                               \\\n      \"$(ls [A-D]_sub10.map.noba.tif) run_sub10_noba/run-DEM.tif\"\n \nIt is suggested to use above a DEM not much bigger than the eventual\narea of interest, otherwise interest points which are far away may be\ncreated. While that may provide robustness, in some occasions, given\nthat LRO NAC images are very long and can have jitter, interest points far\naway could actually degrade the quality of eventual registration in \nthe desired smaller area.\n\nThe same resolution should be used for both mapprojected images\n(option ``--tr``), and it should be similar to the ground sample\ndistance of these images.\n\nThe option ``--mapprojected-data`` assumes that the images have\nbeen mapprojected without bundle adjustment.\n\nThe option ``--max-pairwise-matches`` in ``bundle_adjust`` should\nreduce the number of matches to the set value, if too many were\ncreated originally.  \n\nThe option ``--overlap-limit`` reduces the number of subsequent images to be\nmatched to the current one to this value. For a large number of images consider\nusing the option ``--auto-overlap-params`` which will find which images overlap.\n \nRun stereo and create a DEM::\n\n    parallel_stereo A_crop_sub10.cub B_crop_sub10.cub   \\\n      run_sub10/run --subpixel-mode 3                   \\\n     --bundle-adjust-prefix run_ba_sub10/run\n     point2dem -r moon --tr 10 --stereographic          \\\n        --proj-lon 0 --proj-lat -90 run_sub10/run-PC.tif \n\nThis will create a point cloud named ``run_sub10/run-PC.tif`` and\na DEM ``run_sub10/run-DEM.tif``.\n\nIt is *strongly suggested* to mapproject the bundle-adjusted images\nonto this DEM and verify that the obtained images agree::\n\n   for f in A B C D; do \n      mapproject run_sub10/run-DEM.tif               \\\n        ${f}_crop_sub10.cub ${f}_sub10.map.yesba.tif \\\n        --bundle-adjust-prefix run_ba_sub10/run\n    done\n    stereo_gui --use-georef --single-window *yesba.tif\n\nWe'll bring the \"ground truth\" point cloud closer to the initial\nguess for SfS using ``pc_align``::\n\n    pc_align --max-displacement 200 run_full2/run-PC.tif \\\n      run_sub10/run-PC.tif -o run_full2/run              \\\n      --save-inv-transformed-reference-points\n\nThis step is extremely important. Since we ran two bundle adjustment\nsteps, and both were without ground control points, the resulting\nclouds may differ by a large translation, which we correct here. Hence\nwe would like to make the \"ground truth\" terrain aligned with the\ndatasets on which we will perform SfS.\n\nNext we create the \"ground truth\" DEM from the aligned high-resolution\npoint cloud, and crop it to a desired region::\n\n    point2dem -r moon --tr 10 --stereographic  \\\n      --proj-lon 0 --proj-lat -90              \\\n      run_full2/run-trans_reference.tif\n    gdal_translate                             \\\n      -projwin -15540.7 151403 -14554.5 150473 \\\n      run_full2/run-trans_reference-DEM.tif    \\\n      run_full2/run-crop-DEM.tif\n\nWe repeat the same steps for the initial guess for SfS::\n\n    point2dem -r moon --tr 10 --stereographic  \\\n      --proj-lon 0 --proj-lat -90              \\\n      run_sub10/run-PC.tif\n    gdal_translate                             \\\n      -projwin -15540.7 151403 -14554.5 150473 \\\n      run_sub10/run-DEM.tif                    \\\n      run_sub10/run-crop-DEM.tif\n\nSince our dataset has many shadows, we found that specifying the\nshadow thresholds for the tool improves the results. The thresholds\ncan be determined using ``stereo_gui``. This can be done by turning on\nthreshold mode from the GUI menu, and then clicking on a few points in\nthe shadows. The largest of the determined pixel values will be the\nused as the shadow threshold. Then, the thresholded images can be\nvisualized/updated from the menu as well, and this process can be\niterated. See :numref:`thresh` for more details. We also found that\nfor LRO NAC a shadow threshold value of 0.003 works well enough\nusually.\n\nAlternatively, the ``otsu_threshold`` tool (:numref:`otsu_threshold`)\ncan be used to find the shadow thresholds automatically. It can\noverestimate them somewhat.\n\nThen, we run ``sfs``::\n\n    sfs -i run_sub10/run-crop-DEM.tif                    \\\n      A_crop_sub10.cub C_crop_sub10.cub D_crop_sub10.cub \\\n      -o sfs_sub10_ref1/run --threads 4                  \\\n      --smoothness-weight 0.12                           \\\n      --initial-dem-constraint-weight 0.001              \\\n      --reflectance-type 1 --use-approx-camera-models    \\\n      --max-iterations 5  --crop-input-images            \\\n      --bundle-adjust-prefix run_ba_sub10/run            \\\n      --blending-dist 10 --allow-borderline-data         \\\n      --min-blend-size 20                                \\\n      --shadow-thresholds '0.00162484 0.0012166 0.000781663'\n\nVarying the exposures and haze is not suggested in a first attempt.\n\nNote the two \"blending\" parameters, those help where there are seams\nor light-shadow boundaries. The precise numbers may need\nadjustment. In particular, decreasing ``--min-blend-size`` may result\nin more seamless terrain models at the expense of some erosion.\n\nOne should experiment with floating the albedo (option\n``--float-albedo``) if noticeable albedo variations are seen in the\nimages. See :numref:`sfs_albedo` for a longer discussion.\n\nAfter this command finishes, we compare the initial guess to ``sfs`` to\nthe \"ground truth\" DEM obtained earlier and the same for the final\nrefined DEM using ``geodiff`` as in the previous section. Before SfS::\n\n    geodiff --absolute run_full2/run-crop-DEM.tif \\\n      run_sub10/run-crop-DEM.tif -o out\n    gdalinfo -stats out-diff.tif | grep Mean=  \n\nand after SfS::\n\n    geodiff --absolute run_full2/run-crop-DEM.tif \\\n      sfs_sub10_ref1/run-DEM-final.tif -o out\n    gdalinfo -stats out-diff.tif | grep Mean=\n\nThe mean error goes from 2.64 m to 1.29 m, while the standard deviation\ndecreases from 2.50 m to 1.29 m. \n\nSee :numref:`sfs2_fig` for an illustration. Visually the\nrefined DEM looks more detailed. The same\nexperiment can be repeated with the Lambertian reflectance model\n(reflectance-type 0), and then it is seen that it performs a little\nworse.\n\nWe also show in this figure the first of the images used for SfS,\n``A_crop_sub10.cub``, map-projected upon the optimized DEM. Note that we\nuse the previously computed bundle-adjusted cameras when map-projecting,\notherwise the image will show as shifted from its true location::\n\n    mapproject sfs_sub10_ref1/run-DEM-final.tif A_crop_sub10.cub   \\\n      A_crop_sub10_map.tif --bundle-adjust-prefix run_ba_sub10/run\n\nSee :numref:`sfs-lola` for a large-scale example.\n\n.. _sfs_borderline:\n\nHandling borderline areas\n^^^^^^^^^^^^^^^^^^^^^^^^^\n\nWith the option ``--allow-borderline-data``, ``sfs`` is able to do a\nbetter job at resolving the terrain at the border of regions that have\nno lit pixels in any images. It works by not letting the image\nblending weights decay to 0 at at this boundary, which is normally the\ncase when ``--blending-dist`` is used. These weights still decrease\nto 0 at other image boundaries.\n\nIn the example in\n:numref:`sfs_borderline_fig`, in some input images the top terrain\nportion was lit, and in some the bottom portion. With this option, as\nit can be seen, the blur in the transition zone is removed. The\ncraters are still too shallow, but that is a known issue with weak\nillumination, and something to to be addressed at a future time.\n\nThe value of ``--blending-dist`` should be set to 10 or so. A smaller\nvalue may result in seams. Increasing this will allow the seams to be\nattenuated, but may result in more erosion.\n\nThe tool ``sfs_blend`` tool (:numref:`sfs_blend`) can be used to tune\nthe areas in complete shadow after doing SfS.\n\n.. figure:: images/sfs_borderline.png\n   :name: sfs_borderline_fig\n   :alt: SfS with borderline image data.\n\n   The SfS result without option ``--allow-borderline-data`` (left),\n   with it (center), and the max-lit mosaic (right). It can be seen\n   in the max-lit mosaic that the illumination direction (position of\n   lit crater rim) is quite different in the top and bottom halves\n   (which appear to be separated by a horizontal ridge), which was\n   causing issues for the algorithm.\n\n.. _sfs_crater_bottoms:\n\nHandling lack of data in shadowed crater bottoms\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nAs seen in :numref:`sfs2_fig`, ``sfs`` makes the crater bottoms\nflat in shadowed areas, where is no data. \n\nA *very experimental* way of fixing this is to add a new\ncurvature term in the areas in shadow, of the form\n\n.. math::\n\n   \\label{curvature}\n     w \\left(\\frac{\\partial^2 \\phi}{\\partial x^2} + \n      \\frac{\\partial^2 \\phi}{\\partial y^2} - c\\right)\n\nto the SfS formulation in :numref:`sfs_formulation`. As an example, running::\n\n    sfs -i run_sub10/run-crop-DEM.tif                      \\\n        A_crop_sub10.cub C_crop_sub10.cub D_crop_sub10.cub \\\n        -o sfs_sub10_v2/run                                \\\n        --threads 4 --smoothness-weight 0.12               \\\n        --max-iterations 5                                 \\\n        --initial-dem-constraint-weight 0.001              \\\n        --reflectance-type 1                               \\\n        --use-approx-camera-models                         \\\n        --crop-input-images                                \\\n        --bundle-adjust-prefix run_ba_sub10/run            \\\n        --shadow-thresholds '0.002 0.002 0.002'            \\\n        --curvature-in-shadow 0.15                         \\\n        --curvature-in-shadow-weight 0.1                   \\\n        --lit-curvature-dist 10                            \\\n        --shadow-curvature-dist 5\n\nwill produce the terrain in :numref:`sfs2_fix_fig`.\n \nThe curvature ``c`` is given by option ``--curvature-in-shadow``, its\nweight ``w`` by ``--curvature-in-shadow-weight``, and the parameters\n``--lit-curvature-dist`` and ``--shadow-curvature-dist`` help gradually\nphase in this term at the light-shadow interface, this many pixels\ninside each corresponding region.\n\nSome tuning of these parameters should be done depending on the\nresolution. They could be made larger if no effect is seen.\n\n.. _sfs2_fig:\n.. figure:: images/sfs2.jpg\n   :alt: Another sfs illustration \n\n   An illustration of ``sfs``. The images are, from left to right, the\n   hill-shaded initial guess DEM for SfS, the hill-shaded DEM obtained\n   from ``sfs``, the \"ground truth\" DEM, and the first of the images\n   used in SfS map-projected onto the optimized DEM.\n\n.. _sfs2_fix_fig:\n.. figure:: images/sfs2_fix_depth.jpg\n   :alt: SfS with curved crater bottom\n\n   An illustration of adding a curvature term to the SfS cost\n   function, per :numref:`sfs_crater_bottoms`. It can be seen that,\n   compared to the earlier figure, the crater bottom is now curved,\n   rather than flat, but more modeling is needed to ensure a seamless\n   transition.\n\n.. _sfs-lola:\n\nLarge-scale SfS\n---------------\n\nSfS has been run successfully on a site close to the Lunar South Pole,\nat around 85.5 degrees South. Its size was 14336 x 11008 pixels, at 1\nm/pixel. It used 814 LRO NAC images for bundle adjustment and 420 of\nthose for SfS. The shadows on the ground were observed to make a full\n360 degree loop. A seamless terrain was created (see the `LPSC\nposter <https://www.hou.usra.edu/meetings/lpsc2023/pdf/2377.pdf>`_).\n\n.. figure:: images/large_scale_sfs.png\n   :name: large_scale_sfs\n   :alt: A portion of a large scale SfS terrain.\n\n   A portion of a large-scale terrain produced with SfS showing a challenging\n   area with very diverse illumination around some permanently-shadowed\n   regions. Left: hillshaded SfS terrain. Right: max-lit mosaic. The\n   quality of the produced terrain gracefully degrades as illumination\n   gets worse.\n\nChallenges\n^^^^^^^^^^\n\nThe challenges encountered were that the shadows were extensive and\nvaried drastically from image to image, and some portions of the\nterrain showed up only in some images. All this made it difficult to\nregister the images to each other and to the ground.\n\nWe solved this by doing bundle adjustment with a large number of\nimages that were sorted by illumination conditions. We made sure that\nthere exist images close to each other in the image list that overlap\nand have similar enough illumination, which resulted in all\nimages being tied together.\n\nThe user is strongly cautioned that the difficulty of getting things\nright and figuring out what went wrong greatly increases with dataset\ncomplexity.\n\nIt is strongly suggested to first try SfS on a site of size perhaps\n2000 x 2000 pixels, with a dozen carefully inspected images with\nslowly varying illumination, and having at least one stereo pair among\nthem (:numref:`stereo_pairs`) that can be used for alignment to the\nground.\n\nIf happy with the results, more images can be added and the site size\nincreased.\n\n.. _sfs_initial_terrain:\n\nThe initial terrain\n^^^^^^^^^^^^^^^^^^^\n\nA LOLA DEM was used as an initial guess terrain for SfS and as reference ground\ntruth. A mosaic of several stereo DEMs with bundle-adjusted cameras can be used\nas well.\n\nA Lunar South Pole 87-90 degree latitude DEM at 5 m/pixel is at:\n\n  https://pgda.gsfc.nasa.gov/products/81\n\nSome lunar DEMs at 10 m/pixel and other resolutions, for latitude between 83 and\n90 degrees South, are available at:\n\n    https://pgda.gsfc.nasa.gov/products/90\n\nThe site:\n\n    https://core2.gsfc.nasa.gov/PGDA/LOLA_5mpp\n\nhas LOLA DEMs at 5 m/pixel for a few locations.\n\nA 20 meter/pixel LOLA product, which is rather low in resolution, but covers a\nsignificant portion of the South Pole, is available at:: \n\n    http://imbrium.mit.edu/DATA/LOLA_GDR/POLAR/IMG/LDEM_80S_20M.IMG\n    http://imbrium.mit.edu/DATA/LOLA_GDR/POLAR/IMG/LDEM_80S_20M.LBL\n\nPreprocessing the terrain\n^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe higher-resolution DEMs mentioned above only need regridding.\n\nThe ``LDEM_80S_20M`` IMG and LBL files can be fetched with ``wget``. Then, this\ndataset should be converted to a .cub file as::\n\n    pds2isis from = LDEM_80S_20M.LBL to = ldem_80s_20m.cub\n\nThe heights for this DEM need to be multiplied by 0.5, per the information in\nthe LBL file. We do that with ``image_calc`` (:numref:`image_calc`)::\n\n    image_calc -c \"0.5*var_0\" ldem_80s_20m.cub -o ldem_80s_20m_scale.tif\n\nResample the DEM to 1 m/pixel using ``gdalwarp`` (:numref:`gdal_tools`),\ncreating a DEM named ``ref_dem.tif``::\n\n    gdalwarp -overwrite -r cubicspline -tr 1 1              \\\n      -co COMPRESSION=LZW -co TILED=yes -co INTERLEAVE=BAND \\\n      -co BLOCKXSIZE=256 -co BLOCKYSIZE=256                 \\\n      -te -7050.5 -10890.5 -1919.5 -5759.5                  \\\n      ldem_80s_20m_scale.tif ref_dem.tif\n\nThe values passed to ``-te`` are the bounds of the area of interest. \nSee a discussion about them below.\n\nThe DEM grid size should be not too different from the *ground sample distance\n(GSD)* of the images, for optimal results. That one can be found with\n``mapproject`` (:numref:`mapproject`). For LRO NAC images, use 1 m / pixel.\n\nIt is suggested to use a `stereographic projection\n<https://proj.org/operations/projections/stere.html>`_. It should \nbe a polar one, if around the poles, or otherwise centered at \nthe area of interest. For example, set::\n\n    proj=\"+proj=stere +lat_0=-90 +lon_0=0 +R=1737400 +units=m +no_defs\"\n\nthen run ``gdalwarp`` with the additional option ``-t_srs \"$proj\"``.\n\nThe interpolated DEM was created with bicubic spline interpolation,\nwhich is preferable to the default nearest neighbor interpolation, and\nit was saved internally using blocks of size 256 x 256, which ASP\nhandles better than the GDAL default with each block as tall or wide\nas a row or column.\n\nInspect this DEM with ``stereo_gui`` (:numref:`stereo_gui`) in hillshade mode.\nAny spikes or other artifacts should be blurred, such as by running::\n\n    dem_mosaic --dem-blur-sigma 2 ref_dem.tif -o ref_blur.tif\n    \nAny holes can also be filled ``dem_mosaic`` (:numref:`dem_mosaic_extrapolate`,\n:numref:`dem_mosaic_fill`). A subsequent blur with a sigma of 2 pixels is\nsuggested (:numref:`dem_mosaic_blur`).\n\nSee :numref:`initial_sfs_dem` for how to create an initial DEM using stereo.\nA stereo DEM can also be blended with the LOLA DEM using ``dem_mosaic``\n(after alignment, :numref:`sfs_ground_align`).\n\n.. _terrain_bounds:\n\nTerrain bounds\n^^^^^^^^^^^^^^\n\nLater when we mapproject images onto this DEM, those will be computed at integer\nmultiples of the grid size, with each ground pixel centered at a grid point.\nGiven that the grid size is 1 m, the extent of those images as displayed by\n``gdalinfo`` will have a fractional value of 0.5.\n\nThe ``sfs_blend`` program will fail later unless the resampled initial\nDEM also has this property, as it expects a one-to-one\ncorrespondence between mapprojected images and the ground. Hence,\n``gdalwarp`` was used earlier with the ``-te`` option, with the bounds\nhaving a fractional part of 0.5. Note that the bounds passed to\n``-te`` are in the order::\n\n    xmin, ymin, xmax, ymax\n\nEnsure the min and max values are not swapped, as ``gdalwarp`` will not give a\nwarning if they are, but the resulting DEM will be incorrect.\n\nThe ``dem_mosaic`` program (:numref:`dem_mosaic`) can be used to\nautomatically compute the bounds of a DEM or orthoimage and change\nthem to integer multiples of pixel size. It can be invoked, for\nexample, as::\n\n    dem_mosaic --tr 1 --tap input.tif -o output.tif\n\nThis will use bilinear interpolation.    \n\n.. _sfs_azimuth:\n\nImage selection and sorting by illumination\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nBy far the hardest part of this exercise is choosing the images. We downloaded\nup to 1,400 of them, as described in :numref:`fetch_lro_images`, given the\ndesired longitude-latitude bounds. The PDS .IMG files were converted to ISIS\n.cub cameras as in :numref:`sfs_single_image`, and they were mapprojected onto\nthe reference DEM, initially at a lower resolution to get a preview of things\n(:numref:`sfs_inspection`).\n\nIt is very strongly recommended to use the CSM camera models instead\nof ISIS models (:numref:`sfs_isis_vs_csm`).\n\nInspection of a large number of images and choosing those that have\nvalid pixels in the area of interest can be very arduous. To make this\neasier, we make use of the reporting facility of ``dem_mosaic``\n(:numref:`dem_mosaic`) when invoked with the option\n``--block-max``, with a large value of ``--block-size`` (larger than\nthe image size), and using the ``--t_projwin`` option to specify the\nregion of interest (in ``stereo_gui`` one can find this region by\nselecting it with Control-Mouse).\n\nWhen the mosaicking tool runs, the sum of pixels in the current region\nfor each image will be printed to the screen. Images with a positive\nsum of pixels are likely to contribute to the desired\nregion. Example::\n\n   dem_mosaic --block-max --block-size 10000 --threads 1   \\\n     --t_projwin -7050.500 -10890.500 -1919.500 -5759.500  \\\n     M*.map.lowres.tif -o tmp.tif | tee pixel_sum_list.txt\n\nEliminate the images that are not relevant to the area. Having them in \nimpacts reliability and performance.\n\nThe obtained subset of images *must* be sorted by illumination conditions, that\nis, the Sun azimuth, measured from true North. This angle is printed when\nrunning ``sfs`` with the ``--query`` option on the .cub files. Here is an\nexample::\n\n    M114859732RE.cal.echo.cub       73.1771\n    M148012947LE.cal.echo.cub       75.9232\n    M147992619RE.cal.echo.cub       78.7806\n    M152979020RE.cal.echo.cub       96.895\n    M117241732LE.cal.echo.cub       97.9219\n    M152924707RE.cal.echo.cub       104.529\n    M150366876RE.cal.echo.cub       104.626\n    M152897611RE.cal.echo.cub       108.337\n    M152856903RE.cal.echo.cub       114.057\n    M140021445LE.cal.echo.cub       121.838\n    M157843789LE.cal.echo.cub       130.831\n    M157830228LE.cal.echo.cub       132.74\n    M157830228RE.cal.echo.cub       132.74\n    M157809893RE.cal.echo.cub       135.604\n    M139743255RE.cal.echo.cub       161.014\n    M139729686RE.cal.echo.cub       162.926\n    M139709342LE.cal.echo.cub       165.791\n    M139695762LE.cal.echo.cub       167.704\n    M142240314RE.cal.echo.cub       168.682\n    M142226765RE.cal.echo.cub       170.588\n    M142213197LE.cal.echo.cub       172.497\n    M132001536LE.cal.echo.cub       175.515\n    M103870068LE.cal.echo.cub       183.501\n    M103841430LE.cal.echo.cub       187.544\n    M142104686LE.cal.echo.cub       187.765\n    M162499044LE.cal.echo.cub       192.747\n    M162492261LE.cal.echo.cub       193.704\n    M162485477LE.cal.echo.cub       194.662\n    M162478694LE.cal.echo.cub       195.62\n    M103776992RE.cal.echo.cub       196.643\n    M103776992LE.cal.echo.cub       196.643\n\n(the Sun azimuth is shown on the right, in degrees).\n\nThe primary reason why registration can fail later is illumination\nvarying too drastically between nearby images, and not being able to\nfind matching interest points. Hence, there must be sufficient images\nso that the illumination conditions over the entire site change slowly\nas one goes down the list.\n\nA representative subset of the produced images can be found with the \nprogram ``image_subset`` (:numref:`image_subset`). That tool must\nbe invoked once the images have been registered to each other and\nto the ground, so later in the process (:numref:`parallel_sfs_usage`). \n\nThe paper :cite:`bertone2023highly` discusses how to automate\nthe process of selecting images. \n\nIncorporation of well-registered images\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe approach outlined in the next sections consists of doing bundle adjustment,\nalignment, then refinement of bundle adjustment with ground constraints.\n\nFor the Lunar South Pole, a large set of well-registered cameras exists. Using\nthem requires running ``spiceinit`` with the `provided kernels\n<https://www.sciencebase.gov/catalog/item/688a51d7d4be02367c9c1271>`_, followed\nby creation of CSM cameras as usual.\n\nIn that case, consider first understanding the workflow below, then modify it as\nfollows. In the first bundle adjustment, keep the subset of well-registered\ncameras for the given site fixed. Then, do not do alignment, but redo bundle\nadjustment with no fixed cameras, starting with the cameras from the first step.\nLastly, run bundle adjustment with ground constraints as in the regular\nworkflow.\n\nThe explanation is as follows. The well-registered cameras will help register\nthe other cameras. Then alignment is not needed. However, a subsequent bundle\nadjustment with no fixed cameras will eliminate some minor registration issues\nin the well-registered cameras (which are known not to be perfect). The final\nbundle adjustment with the ground constraint reduces any vertical discrepancies.\n\nBundle adjustment\n^^^^^^^^^^^^^^^^^\n\nThe ``parallel_bundle_adjust`` tool (:numref:`parallel_bundle_adjust`)\nis employed to co-register the images and correct camera errors. The\nimages must be, as mentioned earlier, ordered by Sun azimuth angle.\n\nIt is very important to have interest point matches that tie all images\ntogether. To make the determination of such matches more successful, the images\nwere first mapprojected at 1 m/pixel (LRO NAC nominal resolution) to have them\nin the same perspective. \n\nThe mapprojected images must all be at the same resolution. Once images are \nmapprojected, the cameras used for that should not change, as that will result\nin incorrect results. See :numref:`mapip` for more details.\n\nCreate three lists, each being a plain text file with one file name on\neach line, having the input images (sorted by illumination),\ncorresponding cameras (in .json or .cub format), and corresponding\nmapprojected images. The DEM used in mapprojection can be appended to the\nlast list, but is optional (since the 1/2026 build) if it can be looked up\nin the geoheaders of the mapprojected images.\n\nRun bundle adjustment::\n\n    parallel_bundle_adjust                           \\\n      --image-list image_list.txt                    \\\n      --camera-list camera_list.txt                  \\\n      --mapprojected-data-list mapprojected_list.txt \\\n      --processes 10                                 \\\n      --threads 8                                    \\\n      --ip-per-image 30000                           \\\n      --overlap-limit 100                            \\\n      --num-iterations 100                           \\\n      --num-passes 2                                 \\\n      --min-matches 1                                \\\n      --max-pairwise-matches 2000                    \\\n      --camera-weight 0                              \\\n      --robust-threshold 2                           \\\n      --tri-weight 0.05                              \\\n      --tri-robust-threshold 0.05                    \\\n      --remove-outliers-params \"75.0 3.0 100 100\"    \\\n      --save-intermediate-cameras                    \\\n      --match-first-to-last                          \\\n      --forced-triangulation-distance 100000         \\\n      --min-triangulation-angle 1e-10                \\\n      --datum D_MOON                                 \\\n      --nodes-list <list of computing nodes>         \\\n      -o ba/run \n\nThe option ``--overlap-limit`` needs a large value, but the process can take a\nvery long time. The ``--auto-overlap-params`` option can help determine which\nimages overlap.\n\nThe key reason for failure in this process is images not being matched to enough\nrelevant consecutive images, or simply not having enough such images to start\nwith.\n\nHere more bundle adjustment iterations are desirable,\nbut this step takes too long. A large ``--ip-per-image`` can make a\ndifference in images with rather different different illumination\nconditions but it can also slow down the process a lot. Note that the\nvalue of ``--max-pairwise-matches`` was set to 2000. That should\nhopefully create enough matches among any two images. A higher value\nhere will make bundle adjustment run slower and use more memory.\n\nTowards the poles the Sun may describe a full loop in the sky, and\nhence the earliest images (sorted by Sun azimuth angle) may become\nsimilar to the latest ones. That is the reason above we used the\noption ``--match-first-to-last``.\n\nIf having an estimate how how accurate initial camera positions are, the option\n``--camera-position-uncertainty`` is suggested. If this uncertainty is is too\nsmall, it can prevent convergence. For LRO NAC, perhaps 100 - 500 m is a good\nvalue. See also :numref:`ba_camera_offsets`.\n\nNote that this invocation may run for more than a day, or even\nmore. And it may be necessary to get good convergence. If the process\ngets interrupted, or the user gives up on waiting, the adjustments\nobtained so far can still be usable, if invoking bundle adjustment,\nas above, with ``--save-intermediate-cameras``. \n\nAs before, using the CSM model can result in much-improved performance. \n\nHere we used ``--camera-weight 0`` and ``--robust-threshold 2`` to\ngive cameras which start far from the solution more chances to\nconverge. We are very generous with outlier filtering in the option\n``--remove-outliers-params``. That will ensure that in case the\nsolution did not fully converge, valid matches with large\nreprojection error are not thrown out as outliers.\n\nA large value of ``--processes`` can result in running out of memory.\n\n.. _sfs_ba_validation:\n\nValidation of bundle adjustment\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe file::\n\n   ba/run-final_residuals_stats.txt\n\nshould be examined. The median reprojection error per camera must be at most 1-2\npixels (the mean error could be larger). If that is not the case, bundle\nadjustment failed to converge. To help it, consider doing a preliminary step of\nbundle adjustment with ``--robust-threshold 5`` to force the larger errors to go\ndown, and then do a second invocation to refine the cameras with\n``--robust-threshold 2`` as earlier. \n\nIn the second invocation, either use the original cameras and with the option\n``--input-adjustments-prefix``, pointing to the latest adjustments, or use the\nlatest optimized cameras, if in CSM format. \n\nReuse the match files with the option ``--match-files-prefix``.\n\nIt is best to avoid throwing out images at this stage. More images means a\nhigher chance that the images will be tied together. The images that have a zero\ncount in the stats file can be thrown out. \n\n.. _sfs_ground_align:\n\nAlignment to the ground\n^^^^^^^^^^^^^^^^^^^^^^^\n\nA very critical part of the process is to move from the coordinate\nsystem of the cameras to the coordinate system of the initial guess\nterrain in ``ref_dem.tif``. The only reliable approach for this is to\ncreate a terrain model using stereo with some of the images and\nbundle-adjusted cameras produced so far, align that one to ``ref_dem.tif``,\nand then apply this alignment to the cameras.\n\nWith LRO NAC images, stereo pairs may be hard to find. In addition, after the\nearlier step of bundle adjustment the images may already be within 10-30 meters\nhorizontally relative to the reference LOLA DEM, as validated by mapprojection.\n\nIf it looks that the alignment is already in the ballpark, and it is tricky to\nfind stereo pairs, or the attempt at alignment fails, consider skipping this\nstep. \n\nThe produced SfS DEM will likely need additional alignment in either case\n(:numref:`sfs_align_refine`).\n\nExamine the file having the stereo convergence angles for each pair of images as\nproduced by bundle adjustment (:numref:`ba_conv_angle`). Eliminate those with a\nconvergence angle of under 10 degrees or so, and sort the rest in decreasing\nnumber of matches (if not enough pairs left, can decrease this angle to 3 - 5\ndegrees).\n\nProduce 30 - 100 stereo DEMs from the stereo pairs with\nnon-small convergence angles. These must *cover well* the full site, even if\nthere are missing areas in between. This helps with consistent alignment. \n\nIt is very important that the camera adjustments created so far are used in\nstereo, by passing them via ``--bundle-adjust-prefix``. Or, with CSM cameras,\ncan use the latest optimized cameras instead, without the\n``--bundle-adjust-prefix`` option. Stereo with mapprojected images is preferable\n(:numref:`mapproj-example`).\n\nSo, the stereo command can look as follows::\n\n    parallel_stereo A.map.tif B.map.tif \\\n      ba/run-A.adjusted_state.json      \\\n      ba/run-B.adjusted_state.json      \\\n      --stereo-algorithm asp_mgm        \\\n      --subpixel-mode 9                 \\\n      run_stereo/run                    \\\n      ref_dem.tif\n\nHere, ``ref_dem.tif`` is the DEM used for mapprojection. Note that the\nmapprojected images won't fully agree with the DEM or each other yet, as they\nare not registered to the DEM, but stereo should still run fine.\n\nWhen invoking ``point2dem`` on the resulting point clouds, use the same\nprojection (``--t_srs``) as in the reference terrain and a grid size (``--tr``)\nof 1 meter. Inspect the triangulation error (:numref:`point2dem`). Ideally its\naverage should not be more than 1 meter.\n\nThe created DEMs can be mosaicked with ``dem_mosaic``\n(:numref:`dem_mosaic`) as::\n\n    dem_mosaic -o stereo_mosaic.tif --dem-list stereo_dem_list.txt\n\nIt is strongly suggested to use the ``geodiff`` program (:numref:`geodiff`) to\ninspect how well the individual DEMs agree with their mosaic. This can help\ncatch problems early. If most DEMs agree well with the mosaic, but some are way\noff, this may need investigation, or the bad ones can be thrown out, and the\nmosaic redone.\n\nOverlay and inspect the produced stereo DEM mosaic and the reference DEM in\n``stereo_gui``. \n\nAlign the mosaicked DEM to the initial LOLA terrain in ``ref_dem.tif``\nusing ``pc_align`` (:numref:`pc_align`)::\n \n    pc_align --max-displacement 500           \\\n      stereo_mosaic.tif ref_dem.tif           \\\n      --save-inv-transformed-reference-points \\\n      -o run_align/run \n\nThe output 50th *error percentile of smallest errors* as printed by\nthis tool should be under 1-5 meters, and ideally less. Otherwise\nlikely something is not right, and the registration of images may fail\nlater. \n\nThe ``pc_align`` tool can be quite sensitive to the\n``--max-displacement`` value. It should be somewhat larger than the\ntotal estimated translation (horizontal + vertical) among the two\ndatasets. The option ``--compute-translation-only`` may be necessary\nif ``pc_align`` introduces a bogus rotation.\n\nThe resulting transformed cloud ``run_align/run-trans_reference.tif``\nneeds to be regridded with ``point2dem`` with the same projection\nand grid size as before.\n\nThis DEM should be hillshaded (:numref:`hillshade`) and overladed on top of the\nLOLA DEM and see if there is any noticeable shift, which would be a sign of\nalignment not being successful. \n\nIf no luck, and visually the misalignment looks small horizontally, alignment\ncould be skipped, for now, and one could continue with the next step, of using a\nDEM constraint, to fix vertical alignment issues. After that, perhaps alignment\nwill work better.\n\nThe ``geodiff`` tool should be used to examine any discrepancy among the two\n(:numref:`geodiff`), followed by ``colormap`` (:numref:`colormap`) and\ninspection in ``stereo_gui``.\n\nIf happy with the results, the alignment transform can be applied\nto the cameras. With CSM cameras, that goes as follows::\n\n    bundle_adjust                                             \\\n      --image-list ba/run-image_list.txt                      \\\n      --camera-list ba/run-camera_list.txt                    \\\n      --initial-transform run_align/run-inverse-transform.txt \\\n      --apply-initial-transform-only                          \\\n      -o ba_align/run\n\nIt is very important to note that we used above\n``run-inverse-transform.txt``, which goes from the stereo DEM\ncoordinate system to the LOLA one. This is discussed in detail in\n:numref:`ba_pc_align`. We used the latest optimized cameras\nin the ``ba`` directory.\n\nIt is suggested to mapproject the images using the obtained\nbundle-adjusted cameras in ``ba_align/run`` onto ``ref_dem.tif``, and\ncheck for alignment errors in ``stereo_gui`` by overlaying the images\nusing georeference information. Small errors (under 5-10 pixels) are\nlikely fine and will be corrected at the next step.\n\nIf the images are too many, inspect at least a dozen of them. The\nreport file introduced at the next step will help with a large number\nof images. \n\nThe following command can be used to quickly overlay a few\ndozen mapprojected images::\n\n  stereo_gui --hide-all --single-window --use-georef $(cat list.txt)\n\nThen individual images can be toggled on and off.\n\n.. _sfs_ba_refine:\n\nRegistration refinement\n^^^^^^^^^^^^^^^^^^^^^^^\n\nIf the images mapproject reasonably well onto the reference DEM, with no\nshift across the board, but there are still some registration errors,\none can refine the cameras using the reference terrain as a constraint\nin bundle adjustment (:numref:`heights_from_dem`)::\n\n    bundle_adjust                                 \\\n      --image-list ba_align/run-image_list.txt    \\\n      --camera-list ba_align/run-camera_list.txt  \\\n      --match-files-prefix ba/run                 \\\n      --max-pairwise-matches 2000                 \\\n      --match-first-to-last                       \\\n      --min-matches 1                             \\\n      --skip-matching                             \\\n      --num-iterations 100                        \\\n      --num-passes 2                              \\\n      --camera-weight 0                           \\\n      --save-intermediate-cameras                 \\\n      --heights-from-dem ref_dem.tif              \\\n      --heights-from-dem-uncertainty 20.0         \\\n      --mapproj-dem ref_dem.tif                   \\\n      --forced-triangulation-distance 100000      \\\n      --min-triangulation-angle 1e-10             \\\n      --remove-outliers-params \"75.0 3.0 100 100\" \\\n      --parameter-tolerance 1e-20                 \\\n      --threads 20                                \\\n      -o ba_align_ref/run\n\nNote how we use the match files with the original ``ba/run`` prefix,\nand also use ``--skip-matching`` to save time by not recomputing\nthem. But the cameras come from ``ba_align/run``, as the\nones with the ``ba/run`` prefix are before alignment.\nWe used the CSM cameras (:numref:`sfs_isis_vs_csm`).\n\nThe option ``--mapproj-dem`` is very helpful for identifying\nmisregistered images (see below).\n\nThe value used for ``--heights-from-dem-uncertainty`` can be larger, such as\n100, if it is believed that the stereo DEM mosaic produced so far is too\ndifferent from LOLA.  See also :numref:`heights_from_dem`.\n\nThe switch ``--save-intermediate cameras`` is helpful, as before, if\ndesired to stop if things take too long.\n\n.. _sfs_reg_valid:\n\nValidation of registration\n^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nMapproject the input images with the latest aligned cameras::\n\n    mapproject --tr 1.0                          \\\n      ref_dem.tif                                \\\n      image.cub                                  \\\n      ba_align_ref/run*image.adjusted_state.json \\\n      image.align.map.tif \n\nAbove, the correct camera for the given image should be picked up\nfrom the latest bundle-adjusted and aligned camera directory.\n\nThese resulting mapprojected images can be overlaid in ``stereo_gui`` with\ngeoreference information and checked for misregistration. A maximally-lit mosaic\ncan be created with the command::\n\n  dem_mosaic --max -o max_lit.tif *.align.map.tif\n\nMisregistered images will create ghosting in this mosaic.\n\nGiven, for example, a few hundred input images, it is very\ntime-consuming to do pairwise inspections to find the misaligned\nimages. Bundle adjustment created a report file with the name::\n\n     ba_align_ref/run-mapproj_match_offset_stats.txt\n\nwhich greatly simplifies this job. This file shows how much each mapprojected\nimage disagrees with the rest, in meters. See :numref:`ba_mapproj_dem` for\ndetails.\n\nImages with low count in this report can be thrown out. If the 85th percentile\nof registration errors for an image is over 1.5 meters (assuming a 1 meter\nground resolution), it likely registered badly. Those can be deprioritized.\n\nThe more images are eliminated, the more one risks loss of coverage. It is\nsuggested to sort the images in increasing order of 85th percentile of\nmisregistration error, and create a few candidate sets, with each set having a\ndifferent threshold for what is considered an acceptable registration error. For\nexample, use cutoffs of 1.25 m, 1.5 m, 1.75 m.\n\nCreate the maximally lit mosaic for each of these and overlay them\nin ``stereo_gui``. Inspect them carefully. Choose the set which\ndoes not sacrifice coverage and has a small amount of misregistration.\nSome images with a larger registration error could be added after\ncareful inspection, to increase the coverage.\n\nThe images with a high 95th error percentile (say over 2 meters) should be\noverlaid on top of this maximally lit mosaic and removed if they show obvious\nmisregistration.\n\nSee also the earlier section of validation of bundle adjustment\n(:numref:`sfs_ba_validation`). That one discusses a report file\nthat measures the errors in the pixel space rather than on the ground.\n\nFurther refinement and re-validation can be done after solving for jitter,\nbut this is a more advanced topic (:numref:`sfs_jitter`). \n\n.. _sfs_fail:\n\nHandling failure\n^^^^^^^^^^^^^^^^\n\nIf the maximally lit mosaic has registration errors, most frequent causes are:\n\n - Images were not sorted by illumination in bundle adjustment.\n - There are not enough images of intermediate illumination to tie the\n   data together.\n - The interest point matches are inaccurate (locking onto moving shadows).\n - The value of ``--overlap-limit`` was too small.\n - Horizontal or vertical alignment failed.\n\nEnsure that the recipe in :numref:`sfs-lola` was followed carefully.\nFurther strategies:\n\n - See if many mapprojected images are misregistered with the DEM. If \n   yes, bundle adjustment and/or alignment failed and needs to be redone or refined.\n - Crop all mapprojected images produced with bundle-adjusted cameras to a small\n   site, and overlay them while sorted by illumination (solar azimuth angle).\n   See for which images the registration failure occurs.\n - Inspect the match files for unprojected images (``.match`` and\n   ``clean.match``) in ``stereo_gui`` (:numref:`stereo_gui_pairwise_matches`).\n   Perhaps there were not enough matches or too many of them were thrown out as\n   outliers.\n - Fallback to a smaller subset of images which is self-consistent,\n   even if losing coverage that way. Can be guided for this by the report\n   files (:numref:`sfs_reg_valid`, :numref:`sfs_ba_validation`).\n - See if more images can be added with intermediate illumination\n   conditions and to increase coverage.\n\nIf a well-aligned SfS terrain is produced with a subset of the images, consider\ndoing the same for a subset of the remaining ones. The second SfS terrain can be\naligned to the first one on a clip where they both produce good results, with\n``pc_align`` with correlation-based alignment (:numref:`pc_corr`) and the option\n``--initial-transform-from-hillshading translation``. This alignment can be\napplied to the full second terrain.\n\nAlternatively, max-lit mosaics for the subsets could be correlated\n(:numref:`correlator-mode`), and the produced disparity could be used for\nimage (:numref:`image_align`) and terrain alignment (:numref:`pc_corr`).\n\nIf the alignment is successful, apply it to the second set of cameras as well\n(:numref:`ba_pc_align`), and then tighten the vertical alignment for the second\nset with ``bundle_adjust`` with the option ``--heights-from-dem``, as above. Then,\njoint SfS for the union of the two sets should work.\n\nIf no luck, break up a large site into 4 quadrants with overlap, eliminate all\nimages not having good pixels in a given quadrant, and create a solution for\neach. Any match file should however have features in the full site, for reuse\nlater.\n\nIf the resulting subsets of bundle-adjusted cameras are individually\nself-consistent and consistent with the ground, do a combined bundle adjustment\nusing the union of all sets of match files, by copying them to a single\ndirectory, with ``--overlap-limit`` set to 0 to use all match files. Ensure that\neach match file extends over the full region in that case. \n\nThe ``image_align`` program (:numref:`image_align`) was reported to be of help\nin co-registering images. Note however that failure of registration is almost\nsurely because not all images are connected together using match points, or the\nimages are consistent with each other but not with the ground.\n\nNote that interest point matches produced from stereo (:numref:`dense_ip`) are\nless sensitive to illumination changes, but that process is quite slow and does\nnot scale for a large number of pairwise matches.\n\n.. _parallel_sfs_usage:\n\nRunning SfS in parallel\n^^^^^^^^^^^^^^^^^^^^^^^\n\nNext, SfS follows, using ``parallel_sfs`` (:numref:`parallel_sfs`)::\n\n    parallel_sfs -i ref_dem.tif                      \\\n      --nodes-list nodes_list.txt                    \\\n      --processes 6                                  \\\n      --threads 8                                    \\\n      --tile-size 200                                \\\n      --padding 50                                   \\\n      --image-list ba_align_ref/run-image_list.txt   \\\n      --camera-list ba_align_ref/run-camera_list.txt \\\n      --shadow-threshold 0.005                       \\\n      --use-approx-camera-models                     \\\n      --crop-input-images                            \\\n      --blending-dist 10                             \\\n      --min-blend-size 50                            \\\n      --allow-borderline-data                        \\\n      --low-light-threshold 0.03                     \\\n      --smoothness-weight 0.08                       \\\n      --initial-dem-constraint-weight 0.0025         \\\n      --reflectance-type 1                           \\\n      --max-iterations 5                             \\\n      --save-sparingly                               \\\n      -o sfs/run\n\nFor this step not all images need to be used, just a representative\nenough subset. Normally, having two or three sufficiently different\nillumination conditions at each location is good enough, ideally with \nthe shadows from one image being roughly perpendicular to shadows\nfrom other images. \n\nA representative subset of the produced images can be found with the \nprogram ``image_subset`` (:numref:`image_subset`). Invoke that program\nwith low-resolution versions of the mapprojected co-registered input \nimages. That program's page has more details. \n\nSfS should work fine with a few hundred input images, but it can be slow.\n\nIt is best to avoid images with very low illumination angles as those\ncan result in artifacts in the produced SfS terrain.\n\nThe first step that will happen, when this program is launched, is computing the\nimage exposures, and, if applicable, the initial haze values and albedo. See the\noption ``--estimate-exposure-haze-albedo`` in :numref:`sfs` for more details.\n\nThen the computed exposures (also haze and albedo, if applicable) are passed to\neach tile that is run in parallel, via ``--image-exposures-prefix`` (and, if\napplicable, ``--haze-prefix``, ``--input-albedo``). All these are further\noptimized per tile if ``--float-exposure``, ``--float-haze``, and/or\n``--float-albedo`` are used.\n\nThe option ``--allow-borderline-data`` improves the level of detail\nclose to permanently shadowed areas. See :numref:`sfs_borderline`.\n\nIt was found empirically that a shadow threshold of 0.005 was good\nenough.  It is also possible to specify individual shadow thresholds\nif desired, via ``--custom-shadow-threshold-list``. This may be useful\nfor images having diffuse shadows cast from elevated areas that are\nfar-off. For those, the threshold may need to be raised to as much as\n0.01.\n\nThe value of ``--initial-dem-constraint-weight`` may need to be increased\nsomewhat if the resulting SfS terrain differs too much from the initial LOLA\nterrain, or if a tiling pattern is seen. The ``geodiff`` program\n(:numref:`geodiff`) can help evaluate the difference.\n\nUse a larger ``--blending-dist`` if the produced terrain has visible artifacts\naround shadow regions which do not go away after increasing the shadow\nthresholds. To get more seamless results around small shadowed craters reduce\nthe value of ``--min-blend-size``. This can result in more erosion.\n\nSee :numref:`sfs_seams` for fixing seams in low-light areas.\n\nThe option ``--use-approx-camera-models`` is not necessary with CSM\ncameras.\n\nOne should experiment with floating the albedo (option\n``--float-albedo``) if noticeable albedo variations are seen in the\nimages. See :numref:`sfs_albedo` for a longer discussion. It is suggested\nto run SfS without this flag first and inspect the results.\n\nWhen it comes to selecting the number of nodes to use, it is good to notice how\nmany tiles the ``parallel_sfs`` program produces (the tool prints that), as a\nprocess will be launched for each tile. Since above it is chosen to run 5-10\nprocesses on each node, the number of nodes can be a fraction of the number of\ntiles over number of processes. One should examine how much memory and CPU these\nprocesses use and adjust these numbers accordingly.\n\nSee :numref:`sfs_crater_bottoms` for a potential solution for SfS\nproducing flat crater bottoms where there is no illumination to guide\nthe solver. See :numref:`sfs_borderline` for a very preliminary\nsolution for how one can try to improve very low-lit areas (it only\nworks on manually selected clips and 1-3 images for each clip).\n\nSee an illustration of the produced terrain in :numref:`large_scale_sfs`.\n\n.. _sfs_align_refine:\n\nInspection and refinement\n^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe obtained shape-from-shading terrain should be studied carefully to see if it\nshows any systematic shift or rotation compared to the initial LOLA gridded\nterrain. For that, the SfS terrain can be overlaid as a hillshaded\n(:numref:`hillshade`) image on top of the initial terrain in ``stereo_gui``, in\ngeoreference mode, and the SfS terrain can be toggled on and off.\n\nMeasurement of misalignment\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\nMisalignment can be measured quantitatively by hillshading the gridded LOLA and\nSfS terrain and doing stereo correlation. This goes as follows.\n\nHillshade both DEMs::\n\n  hillshade -e 10 ref_dem.tif -o ref_dem_hill.tif\n  hillshade -e 10 sfs_dem.tif -o sfs_dem_hill.tif\n\nIt is assumed as before that these two DEMs have precisely the same projection,\ngrid size and extent. Consider adjusting the elevation (``-e``) parameter and\nalso the azimuth (``-a``) parameter to produce well-lit images with good range\nof intensities that fill most of the 0 to 255 range. \n\nIf some areas appear saturated or too much in shadow, consider a hillshade command\nalong the lines of::\n \n    gdaldem hillshade -multidirectional -compute_edges -alt 20 \\\n      dem.tif dem_hill.tif\n \nRun stereo in correlator mode (:numref:`correlator-mode`)::\n\n    parallel_stereo               \\\n      --correlator-mode           \\\n      --stereo-algorithm asp_mgm  \\\n      --corr-kernel 9 9           \\\n      --ip-per-image 40000        \\\n      --subpixel-mode 9           \\\n      --corr-search -25 -25 25 25 \\\n      --nodes-list nodes_list.txt \\\n      sfs_dem_hill.tif            \\\n      ref_dem_hill.tif            \\\n      sfs_ref_corr/run\n\nThe search range in ``--corr-search`` is determined by the expected amount of \nmisalignment (:numref:`search_range`).\n\nHere, the SfS DEM is intentionally specified as the first input, as that is needed by\nsubsequent logic. \n\nThe produced ``F.tif`` disparity can be split into bands while masking no-data\nvalues (:numref:`mask_disparity`) and viewed with ``stereo_gui``\n(:numref:`colorize`) as::\n\n    stereo_gui --colorbar              \\\n      --min -10 --max 10               \\\n      sfs_ref_corr/run-F_b1_nodata.tif \\\n      sfs_ref_corr/run-F_b2_nodata.tif\n\nIt is very important to confirm that the visually-observed shifts agree with the \ndisparities shown by this plot.\n\n.. figure:: images/sfs_lola_disp.png\n   :name: sfs_disp\n   :alt: SfS to LOLA disparity\n\n   Colorized horizontal and vertical disparities from the SfS DEM to the LOLA\n   DEM. There exists a horizontal misalignment of 5 pixels in the upper-right\n   corner (left plot), and a vertical misalignment of 10 pixels in the\n   upper-left corner (right plot).\n   \nA sample plot of such disparities is shown in :numref:`sfs_disp`. It can be seen\nthat here the misregistration is large and non-uniform. In this case, the only\nreliable solution for repair is to make use of custom GCP produced with\n``dem2gcp`` as seen in the next section. A simpler recipe for correcting a shift\nor rotation only with ``pc_align`` is shown further down.\n\n.. _sfs_gcp:\n\nGCP-based refinement\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\nThe ``dem2gcp`` program (:numref:`dem2gcp`) will take as input this disparity\nand move each ground point produced by triangulation of interest point matches\nfrom the \"warped\" location on the SfS DEM to the correct location on the LOLA\nDEM, forming ground control points (:numref:`bagcp`).\n\nThis invocation requires a build of ASP as of 2025/11 or later\n(:numref:`release`).\n\n::\n\n  dem2gcp                                            \\\n    --warped-dem sfs_dem.tif                         \\\n    --ref-dem ref_dem.tif                            \\\n    --warped-to-ref-disparity sfs_ref_corr/run-F.tif \\\n    --image-list ba_align_ref/run-image_list.txt     \\\n    --camera-list ba_align_ref/run-camera_list.txt   \\\n    --clean-match-files-prefix ba/run                \\\n    --max-pairwise-matches 5000                      \\\n    --gcp-sigma 1.0                                  \\\n    --max-num-gcp 2000000                            \\\n    --output-gcp sfs_ref_corr/run.gcp\n\nThe value of ``--gcp-sigma`` should be on the order of the ground sample distance\n(in meters), to ensure that the GCP constraint is strong enough.\n\nThis program can be sensitive to outliers, so the clean matches above should be\nproduced with bundle adjustment with a value of ``--remove-outliers-params``\nthat removes outliers with reprojection error more than 5-10 pixels or so.\n\nThe resulting GCP file can be passed to ``bundle_adjust`` together with the\nimages and *latest* cameras, such as in :numref:`sfs_ba_refine`.\n\nCare must be taken that these GCP do not conflict with triangulated points in\nbundle adjustment, with or without the ``--heights-from-dem`` option. See\n:numref:`gcp_vs_tri`.\n\nThen, SfS must be rerun with the new cameras. Misalignment can be evaluated\nas before.\n\nThe created SfS terrain can be employed to improve the registration of \nany problematic images (:numref:`sfs_sim`).\n\nRefinement based on a rigid transform\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\nIf the misalignment looks as if produced by a rigid transform, one can try\nalignment based on dense correlation of hillshaded images (:numref:`pc_corr`).\nThis requires that the correlation be run with the inputs in *reverse* order\nfrom the above, so the first input would be the reference LOLA DEM.\n\nAlternatively, one can do sparse features-based alignment\n(:numref:`pc_hillshade`). This works better on lower-resolution versions of the\ninputs, when the high-frequency discrepancies do not confuse the alignment, so,\nfor example, at 1/4 or 1/8 resolution of the DEMs, as created with ``stereo_gui``::\n\n    pc_align --initial-transform-from-hillshading rigid    \\\n      ref_dem_sub4.tif sfs_dem_sub4.tif -o align_sub4/run  \\\n      --num-iterations 0 --max-displacement -1\n\nIn either case, the alignment transform can then be applied to the full SfS DEM\n(:numref:`prevtrans`)::\n\n    pc_align --initial-transform align_sub4/run-transform.txt      \\\n      ref_dem.tif sfs_dem.tif -o align/run --num-iterations 0      \\\n      --max-displacement -1 --save-transformed-source-points       \\\n      --max-num-reference-points 1000 --max-num-source-points 1000\n\nThe number of points being used is not important since we will just\napply the alignment and transform the full DEM.\n\nThe aligned SfS DEM can be created from the obtained transformed\ncloud as::\n\n    point2dem --tr 1 --search-radius-factor 2 --t_srs projection_str \\\n      align/run-trans_source.tif\n\nHere, the projection string should be the same one as in the reference \nLOLA DEM named ``ref_dem.tif``. It can be found by invoking::\n\n    gdalinfo -proj4 ref_dem.tif\n\nand looking for the value of the ``PROJ`` field.\n\nThe alignment transform should be applied to the cameras (:numref:`ba_pc_align`),\nthen bundle adjustment with a terrain constraint should be redone as in\n:numref:`sfs_ba_refine`.\n\nLastly, the SfS DEM must be regenerated with the new cameras.\n\nIdeally, after all this, there should be no systematic offset\nbetween the SfS terrain and the reference LOLA terrain.\n\nImage-based refinement\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\nAnother approach is to find the stereo disparity from the hillshaded SfS DEM to\nthe hillshaded reference DEM (at 1/4th the resolution) with ``parallel_stereo\n--correlator-mode``, then invoke ``image_align`` (:numref:`image_align`) on the\ndisparity. It appears that the stereo correlation works better if the first\ncloud is the SfS DEM, as it has more detail. This can produce an alignment\ntransform (:numref:`image_align_ecef_trans`) that can be passed in to\n``pc_align`` with zero iterations to align the SfS DEM to the reference DEM\n(:numref:`prevtrans`).\n\nManual alignment\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\nIf these approaches fail to remove the visually noticeable displacement\nbetween the SfS and LOLA terrain, one can try to nudge the SfS terrain\nmanually, by using ``pc_align`` as::\n\n    pc_align --initial-ned-translation                             \\\n      \"north_shift east_shift down_shift\"                          \\\n      ref_dem.tif sfs_dem.tif -o align/run --num-iterations 0      \\\n      --max-displacement -1 --save-transformed-source-points       \\\n      --max-num-reference-points 1000 --max-num-source-points 1000\n\nHere, the value of ``down_shift`` should be 0, as we attempt a horizontal shift. For\nthe others, one may try some values and observe their effect in moving the\nSfS terrain to the desired place. \n\nThe transform obtained by using these numbers will be saved in\n``align/run-transform.txt`` (while being converted from the local\nNorth-East-Down coordinates to ECEF) and can be used to transform the cameras\nto bring them in closer alignment with the reference terrain. \n\nIf a manual rotation nudge is necessary, use ``pc_align`` with\n``--initial-rotation-angle``.\n\nThe transformed cloud then needs to be regridded with ``point2dem``\nas before.\n\nIn all cases the SfS DEM must be regenerated with the aligned cameras.\n\nComparison with initial terrain\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe ``geodiff`` tool can be deployed to see how the SfS DEM compares\nto the initial guess or to the raw ungridded LOLA measurements.\nOne can use the ``--absolute`` option for this tool and then invoke\n``colormap`` to colorize the difference map. By and large, the SfS\nDEM should not differ from the reference DEM by more than 1-2 meters.\n\nIt is also suggested to produce produce a maximally-list mosaic, as in\n:numref:`sfs_reg_valid`. This should not look too\ndifferent if projecting on the initial guess DEM or on the refined one\ncreated with SfS.\n\n.. _sfs_issues:\n\nHandling issues in the SfS result\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nMisregistration errors between the images can result in craters or\nother features being duplicated in the SfS terrain. Then, registration\nmust be redone as discussed in the earlier sections.\n\nIf in some low-light locations the SfS DEM has seams, see :numref:`sfs_seams`.\n\nArtifacts around permanently shadowed areas can be fixed with ``sfs_blend``\n(:numref:`sfs_blend`).\n\nSee :numref:`sfs_borderline` for how to increase the coverage in areas \nwith very low illumination.\n\nIf the SfS DEM has localized defects, those can be fixed in a small region and\nthen blended in. For example, a clip around the defect, perhaps of dimensions\n400 pixels or larger, can be cut from the input DEM. If that clip has noise\nwhich affects the final SfS result, it can be blurred with ``dem_mosaic``, using\nfor example, ``--dem-blur-sigma 2`` (or a larger sigma value). Then one can try\nto run ``parallel_sfs`` on just this clip, and if needed, vary some of the SfS\nparameters or exclude some images. \n\nIf happy enough with the result, this small SfS clip can be blended back to the\nlarger SfS DEM with ``dem_mosaic`` as::\n\n    dem_mosaic --priority-blending-length 75         \\\n      small_sfs.tif large_sfs.tif -o merged_sfs.tif\n\nInspect the resulting hillshaded DEM to ensure this did not result in blending\nartifacts.\n\n.. _sfs_seams:\n\nFixing seams in the SfS terrain\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nImages with partially shadowed areas can result in seams in the SfS hillshaded\nDEM. The best available approach for fixing these problems starts by setting a\nthreshold for such semi-shadowed pixels. Pixels with values between this and the\nshadow threshold will be given less weight, in inverse proportion to the\ndiscrepancy between the observed and simulated pixel value. \n\nThis weight can be raised to a certain power to make this attenuation effect\nstronger, and the resulting weight image can be blurred somewhat to reduce any\ndiscontinuities.\n\nPixels for which no other images have higher values at the given ground location\nare excluded from this process, to avoid unnecessary erosion. (However, the blur\noperation on the weights, per above, may still result in some erosion.)\n\nThis approach is available with a build from 2025/11 or later\n(:numref:`release`).\n\nAfter extensive experimentation, it was validated that this option works well\nwhen enabled for a full run, not just for clips that show seams. If not desired,\nremove the ``--low-light-threshold`` option from the ``parallel_sfs`` invocation\n(:numref:`parallel_sfs_usage`).\n\nTo enable this approach, the option ``--allow-borderline-data`` is assumed\n(:numref:`sfs_borderline`). Then, the following additional options are needed::\n  \n    --low-light-threshold 0.03   \\\n    --low-light-weight-power 4.0 \\\n    --low-light-blur-sigma 3.0 \n\nThe value of ``--low-light-threshold`` should be chosen based on the specific\ndataset. For LRO NAC, where the shadow threshold is around 0.005, a value of\n0.03 was observed to work well.\n\nThe full documentation for these options is :numref:`sfs`.\n\nHow to blend in repaired clips is discussed in :numref:`sfs_issues`.\n\nBlending the SfS result with the initial terrain\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nAfter computing a satisfactory SfS DEM, it can be processed to replace the\nvalues in the permanently shadowed areas with values from the LOLA reference\nDEM, with a transition region. \n\nThis process will fail unless the SfS DEM and the LOLA DEM have the same grid.\nHow to prepare the initial terrain is described in\n:numref:`sfs_initial_terrain`, and more details about bounds are in\n:numref:`terrain_bounds`. A workaround is suggested later in this section.\n\nThe blending can be done as::\n\n    sfs_blend --lola-dem lola_dem.tif --sfs-dem sfs_dem.tif      \\\n      --max-lit-image-mosaic max_lit.tif --image-threshold 0.005 \\\n      --lit-blend-length 25 --shadow-blend-length 5              \\\n      --min-blend-size 50 --weight-blur-sigma 5                  \\\n      --output-dem sfs_blend.tif --output-weight sfs_weight.tif\n\nHere, the inputs are the LOLA and SfS DEMs, the maximally lit mosaic\nprovided as before, the shadow threshold (the same value as in\ninvoking SfS should be used). These are expected to have\nprecisely the same extent, projection, and resolution.\n\nThe outputs are the blended DEM as described earlier, and the weight\nwhich tells how much the SfS DEM contributed to the blended DEM. That\nweight equals to 1 where only the SfS DEM was used, is between 0 and 1\nin the transition region between the lit and shadowed areas, which is\ndetermined by the values of the ``--lit-blend-length`` and\n``--shadow-blend-length`` parameters (it grows somewhat depending on\nthe value of ``--weight-blur-sigma``), and is 0 where only the LOLA\nvalues contribute to the solution. The weight function is the\ntruncated signed Euclidean distance to the lit boundary, scaled to have\nvalues between 0 and 1, then blurred with a Gaussian kernel with the\nabove-mentioned sigma. No blending happens for shadowed regions of\ndimensions less than ``--min-blend-size``, where the SfS DEM is\nkept. See :numref:`sfs_blend` for more details.\n\nIf ``sfs_blend`` fails due to the grids not matching, it is suggested that the\ninput LOLA terrain be prepared with ``gdalwarp -te <corners>`` as described in\n:numref:`sfs_initial_terrain`, and then the SfS terrain be regenerated starting\nwith this terrain, with any desired transform applied to the cameras before\n``parallel_sfs`` is rerun, and then the extent of the LOLA and SfS terrains will\nagree. \n\nOr, the SfS terrain which exists so far (``sfs_dem.tif``), the LOLA terrain\n(``lola_dem.tif``), and the maximally lit mosaic (``max_lit.tif``) can all be\nresampled to the same grid with ``gdalwarp`` with the ``--te`` and ``-r\ncubicspline`` options, or with ``dem_mosaic --tap``, before invoking\n``sfs_blend``.\n\n.. _sfs_sim:\n\nPost-SfS registration\n^^^^^^^^^^^^^^^^^^^^^\n\nThis section discusses how to use a produced SfS terrain to measure and repair\nany misregistration of input images. It is assumed that this SfS terrain is\nwell-registered to the reference DEM (e.g., from LOLA), as validated in\n:numref:`sfs_align_refine`. \n\nImage misregistration can arise from the fact that interest point matching can\nbe inaccurate for images with diverse illumination conditions, as discussed in\n:numref:`sfs_fail`.\n\nWe make use of the observation that given a raw (measured) image and\ncorresponding camera, a simulated image with the same view and illumination,\nproduced with the SfS terrain, will look very similar to the raw mapprojected\nimage, apart from some shift or rotation. This discrepancy can be measured and\ncorrected, bringing the images in better registration with the SfS terrain.\n\nThis process is done for each image individually. The resulting improved cameras\ncould be used to create a refined SfS terrain.\n\nTo define some notation, let ``sfs_dem.tif`` be the final SfS DEM, ``image.cub``\nbe the input raw image, and ``camera.json`` be the best-registered camera\navailable for this image.\n\nMapproject the raw image onto the SfS DEM with this camera, producing \n``image_map.tif``::\n\n    mapproject    \\\n      --tr 1.0    \\\n      sfs_dem.tif \\\n      image.cub   \\\n      camera.json \\\n      image_map.tif\n\nCreate the simulated orthoimage (this requires a build from 2025/12 or later,\n:numref:`release`)::\n\n    sfs -i sfs_dem.tif              \\\n        --save-sim-intensity-only   \\\n        image.cub                   \\\n        camera.json                 \\\n        --ref-map image_map.tif     \\\n        -o run/image\n        \nThis will write ``run/image-camera-sim-intensity.tif``. Ensure the name of this\nfile is unique for each input image.\n\nInspect the measured and simulated orthoimages. They should be very similar,\napart from any misregistration. The ``image_align`` tool (:numref:`image_align`)\ncan find the transform that aligns the measured image to the simulated one. \nNote that the simulated image is the reference, and is specified first.\n\n::\n\n    image_align                            \\\n        --ip-detect-method 0               \\\n        --inlier-threshold 50              \\\n        --ip-per-tile 2500                 \\\n        --ip-per-image 0                   \\\n        --alignment-transform translation  \\\n        run/image-camera-sim-intensity.tif \\\n        image_map.tif                      \\\n        --output-prefix align/run          \\\n        -o aligned_image.tif\n\nThis transform will be saved to a file. It will also be printed to standard\noutput and recorded in the log file after the line ``Alignment transform (in\npixels)``. It is suggested to also check the number of interest point matches\ninliers in the log file, as that can be a proxy for how accurate the computed\ntransform is.\n\nFor a more complex misregistration, one can try a ``rigid`` transform. This is a\nbit harder to interpret.\n\nThe ``gcp_gen`` program (:numref:`gcp_gen`) can create ground control points\n(GCP, :numref:`bagcp`). These GCP will tie pixel locations in the original raw\nimage to 3D locations on the SfS DEM.\n\n::\n\n    gcp_gen                                              \\\n        --ip-detect-method 0                             \\\n        --inlier-threshold 50                            \\\n        --ip-per-image 0                                 \\\n        --ip-per-tile 2500                               \\\n        --gcp-sigma 1.0                                  \\\n        --camera-image image.cub                         \\\n        --mapproj-image image_map.tif                    \\\n        --ortho-image run/image-camera-sim-intensity.tif \\\n        --dem sfs_dem.tif                                \\\n        --output-prefix gcp_gen/run                      \\\n        -o image_gcp.gcp\n\nA GCP sigma of 1.0 meter is reasonable if the DEM resolution is 1 m/pixel.\n\nThe newly created GCP file is used with ``bundle_adjust``\n(:numref:`bundle_adjust`) to refine the camera model for the input image.\n\n::\n\n    bundle_adjust     \\\n        image.cub     \\\n        camera.json   \\\n        image_gcp.gcp \\\n        -o ba_gcp/run\n\nThis will produce an updated camera model named ``ba_gcp/run-image.json``.\n\nTo validate the correction, mapproject the input image with the newly aligned\ncamera::\n\n    mapproject --tr 1.0     \\\n      sfs_dem.tif           \\\n      image.cub             \\\n      ba_gcp/run-image.json \\\n      image_aligned.tif\n\nThe resulting orthoimage should show better agreement with the SfS DEM, with\nthe simulated image, and with other similarly aligned images. This process can\nbe repeated for all input images.\n\nCreation of mask of SfS pixels\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe SfS DEM used the information from images where the ground\nwas lit, so above the shadow threshold. In the shadowed areas just \nthe smoothness constraint and initial DEM constraint were used.\nTo create the mask of such lit pixels, with value of 1 where\nlit and 0 where unlit, use the maximally-lit mosaic found earlier,\nand run::\n\n    thresh=0.005\n    image_calc -c \"sign(max(var_0, $thresh) - $thresh)\" \\\n      max_lit.tif -o sfs_mask.tif\n\nHere, the shadow threshold used during SfS should be used, separating\nlit and unlit pixels.\n\n.. _sfs_unc:\n\nSfS height uncertainty map\n^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe recommended approach for assessing the quality of the SfS result is to\ncompute the variance for each DEM pixel (available in ASP 3.6.0 or later).\n\nThe square root of the variance is the standard deviation, a relative measure of\nDEM height uncertainty.\nThis feature is experimental: the values are uncalibrated and they do not\nrepresent real elevation uncertainties in meters.\n\nUse the ``--save-variances`` option (:numref:`sfs_opt`) with ``parallel_sfs``\n(:numref:`parallel_sfs_usage`). The resulting output file is described in\n:numref:`sfs_outputs`.\n\nThe variance is computed from the diagonal of the covariance matrix of the\noptimized parameters, using the `Ceres Covariance Estimation\n<http://ceres-solver.org/nnls_covariance.html>`_ method.\n\nThe ``--save-covariances`` option (:numref:`sfs_opt`), available in build 2026/2\nor later (:numref:`release`), saves the covariance between each DEM pixel and\nits four immediate neighbors (left, right, top, bottom). This can be\nuseful for understanding spatial correlation of errors. See\n:numref:`sfs_outputs` for the output files.\n\nPreviously, the option ``--estimate-height-errors`` was employed, with a\ndifferent implementation. This is now obsolete. See :numref:`sfs_opt` for\ndetails.\n\nA useful exercise is to run SfS with two independent sets of images, each with\ndiverse illumination, compare the produced DEMs, and see how that compares with\nthe estimated uncertainty.\n\n.. _sfs_jitter:\n\nSolving for jitter\n^^^^^^^^^^^^^^^^^^\n\nASP has a jitter solver (:numref:`jitter_solve`). This one can refine individual\nposition and orientation samples in a linescan camera.\n\nNormally, for SfS, bundle adjustment as in :numref:`sfs_ba_refine` is\nsufficient. However, we found the jitter solver helpful for a very large site\n(more than 50 km on the side, at 1 m/pixel). It was able to resolve very\nlong-wavelength error accumulation in linescan cameras and produce better\nregistration.\n\nIt is important to note that, as seen below, the solver should be called with\ncarefully set constraints, to avoid large oscillations in the solution, and\nthese constraints should be balanced well. The Google Ceres solver that is\nemployed also has an upper bound on problem size, beyond which it will refuse\nto run.\n\nThis particular site had a DEM of 57840 by 41790 pixels, at 1 m/pixel\nresolution. There were about 3650 images.\n\nAt this stage the images should already be well-aligned with the reference DEM.\nWe will take the last batch of optimized cameras stored in ``ba_align_ref``\nfrom :numref:`sfs_ba_refine`, and run the jitter command as::\n\n    jitter_solve                                     \\\n      --image-list ba_align_ref/run-image_list.txt   \\\n      --camera-list ba_align_ref/run-camera_list.txt \\\n      --num-lines-per-position 15000                 \\\n      --num-lines-per-orientation 4000               \\\n      --clean-match-files-prefix ba/run              \\\n      --max-pairwise-matches 75                      \\\n      --match-first-to-last                          \\\n      --min-matches 1                                \\\n      --forced-triangulation-distance 100000         \\\n      --min-triangulation-angle 1e-10                \\\n      --num-iterations 50                            \\\n      --num-passes 2                                 \\\n      --max-initial-reprojection-error 50            \\\n      --overlap-limit 10000                          \\\n      --parameter-tolerance 1e-20                    \\\n      --heights-from-dem ref_dem.tif                 \\\n      --heights-from-dem-uncertainty 10.0            \\\n      --anchor-dem ref_dem_extra.tif                 \\\n      --num-anchor-points-per-tile 1                 \\\n      --num-anchor-points-extra-lines 40000          \\\n      --anchor-weight 0.05                           \\\n      --mapproj-dem ref_dem.tif                      \\\n      --max-gcp-reproj-err 30                        \\\n      --camera-position-uncertainty 500,500          \\\n      --threads 60                                   \\\n      -o jitter_align_ref/run                        \\\n      input.gcp\n\nIt is important to compare this with the bundle adjustment command\nin :numref:`sfs_ba_refine`.\n\nThe camera position constraints prevented the cameras from moving far. The\nanchor points constrained the ground points. These together implicitly\nconstrained the orientations as well.\n\nThe number of triangulated points, GCP, and anchor points should be kept\nrelatively balanced. This program prints the number of triangulated non-GCP\npoints and the number of GCP. The uncertainties and weights for these should\nalso be chosen carefully.\n\nThe anchor DEM (``ref_dem_extra.tif``) went 40 km beyond the site of interest to\nensure we constrain oscillations in the cameras even outside the main DEM\nextent. The option ``--num-anchor-points-extra-lines`` placed anchor points well\nbeyond the first and last image lines, covering the full orbit strip within the\nanchor DEM. These values were likely excessive for this dataset.\n\nThe camera position uncertainty was set to 500 m horizontally and vertically,\nwhich is generous enough to allow the expected 30-100 m corrections but\nprevents wild oscillations. This is a soft constraint and in practice the\ncamera positions can move somewhat beyond that.\n\nGCP were produced as earlier (:numref:`sfs_gcp`), with ``dem2gcp``\n(:numref:`dem2gcp`). The GCP sigma was set to 10 meters. The option\n``--max-gcp-reproj-err`` was used to filter GCP outliers.\n\nClean matches from bundle adjustment were reused. The number of pairwise\nmatches can be adjusted to balance quality and problem size. Too many matches\ncan cause the Ceres Jacobian to overflow for large datasets.\n\nWe assume the cameras in ``ba_align_ref`` are in CSM format, with the\nadjustments and alignment already applied to them.\n\nThe option ``--mapproj-dem`` will result, as before, in a report file,\nnamed::\n\n  jitter_align_ref/run-mapproj_match_offset_stats.txt\n\nthat can be compared with the one from bundle adjustment. Hopefully\nthe median registration errors go down somewhat.\n\nThe validation can proceed as earlier, in :numref:`sfs_reg_valid`.\n\n.. _sfsinsights:\n\nInsights for getting the most of SfS\n------------------------------------\n\nHere are a few suggestions we have found helpful when running ``sfs``:\n\n- First determine the appropriate smoothing weight :math:`\\mu` by\n  running a small clip, and using just one image. A value between 0.06\n  and 0.12 seems to work all the time with LRO NAC, even when the\n  images are subsampled. The other weight, :math:`\\lambda`, \n  that is, the value of ``--initial-dem-constraint-weight``, can be\n  set to something small, like :math:`0.001.` This can be increased to\n  :math:`0.002` if noticing that the output DEM strays too far.\n\n- Having images with diverse illumination conditions results in a more accurate\n  terrain. \n\n- Floating the albedo (option ``--float-albedo``) can introduce instability and\n  divergence, unless the images have very diverse illumination. See\n  :numref:`sfs_albedo` for a longer discussion.\n\n-  Floating the exposures was useful for the Earth and Mars examples, but less\n   so for the Moon.\n\n .. |times| unicode:: U+00D7 .. MULTIPLICATION SIGN\n"
  },
  {
    "path": "docs/stereo_algorithms.rst",
    "content": ".. _stereo_algos_full:\n\nThe stereo algorithms in ASP in detail\n======================================\n\nHere we will discuss in a lot of detail ASP's stereo algorithms. For a brief\nsummary and an illustration see :numref:`stereo_alg_overview`. For how to add\nnew such algorithms, see :numref:`adding_algos`.\n\n.. _asp_bm:\n\nBlock-matching\n--------------\n\nBlock-matching is ASP's oldest and default algorithm. It can be\ninvoked with both ``stereo`` and ``parallel_stereo`` with the option::\n\n    --stereo-algorithm asp_bm\n\nand works with any alignment method (:numref:`image_alignment`).\n\nFor each pixel in the left image, the algorithm matches a small block\naround this pixel with another similar block in the right image. The\nblock size is given by the value of ``--corr-kernel``. The obtained\ncorrespondence is then refined based on the value of\n``--subpixel-mode``, using a block given by ``--subpixel-kernel``. The\noption ``--corr-timeout`` can be used to ensure long-running block\nmatching operations are stopped after a given time.\n\nThe related block-matching algorithm in OpenCV that ASP can invoke is\ndiscussed in :numref:`opencv_bm`.\n\n.. _asp_sgm:\n\nSemi-Global Matching and More Global Matching algorithms\n--------------------------------------------------------\n\nASP implements the popular Semi-Global Matching (SGM) algorithm\nintroduced in :cite:`hirschmuller_sgm_original`, and the More Global\nMatching (MGM) algorithm :cite:`facciolo2015mgm`, which is a\nmodification of SGM, and usually produces higher quality\nresults. These should be invoked with ``parallel_stereo``, with the\noption ``--stereo-algorithm`` being passed the value ``asp_sgm`` and\n``asp_mgm``, respectively.\n\nIt is suggested to use these algorithms with ``--alignment-method\nlocal_epipolar``, when piecewise alignment between left and right\nimages is computed which results in the disparity being 1D and faster\nto find (:numref:`image_alignment`).\n\nHowever, the versions of SGM and MGM implemented by ASP can\nperform a full 2D disparity search, similar to what is done in the\nNG-fSGM algorithm :cite:`xiang_2016_low_complexity_fsgm`. Since ASP\nprocesses a wide variety of cameras with varying degrees of metadata\nquality, the standard assumption with SGM that the disparity search\ncan be performed only along a one-dimensional epipolar line does not\nhold when the alignment method is not ``local_epipolar`` or for\nmap-projected images.\n\nThe other major change is that ASP's implementation uses a\nmulti-resolution hierarchical search combined with a compressed memory\nscheme similar to what is used in the SGM algorithm\n:cite:`rothermel2012sure_isgm`.\n\nThe MGM algorithm reduces the amount of high frequency artifacts in\ntextureless regions at the cost of a longer run time. ASP also offers\nthe option of a hybrid SGM/MGM mode (``--stereo-algorithm final_mgm``)\nwhere MGM is used only for the final resolution level which obtains\nresults somewhere between the pure SGM and MGM options.\n\nThe greatest advantage of the SGM algorithm over the ASP block-matching\nalgorithm is an improved ability to find disparity matches\nin areas of repetitive or low texture. SGM can also discern finer\nresolution features than the standard correlation algorithm since it\ntends to use much smaller matching kernels. Along with these advantages\ncome several disadvantages. First, SGM is computationally expensive and\nrequires a lot of memory. Second, in some situations it can produce\nnoticeable artifacts at tile boundaries. Third, it can sometimes produce\ninaccurate results in textureless regions. With careful parameter\nselection and usage these disadvantages can be mitigated.\n\nMGM is currently limited to using 8 simultaneous threads but SGM does\nnot have a limit.\n\nIt is suggested to use these algorithms with default options. If desired,\ncustomizations can be done as follows.\n\n-  Set the ``--processes`` option keeping in mind memory constraints as\n   discussed earlier. Each process will run one simultaneous SGM\n   instance and consume memory (:numref:`parallel_stereo`).\n\n-  The ``--corr-memory-limit-mb`` parameter limits the number of megabytes\n   of memory that can be used by SGM/MGM. This limit is per-process. To\n   be safe, make sure that you have more RAM available than the value of\n   this parameter multiplied by the number of processes.\n\n-  See :numref:`ps_tiling` regarding tiling and padding.\n\nEach process spawned by ``parallel_stereo`` can use multiple threads with\n``threads-singleprocess`` without affecting the stereo results.\n\nWhen SGM or MGM is specified, certain stereo parameters have their\ndefault values replaced with values that will work with SGM. You can\nstill manually specify these options.\n\n-  ``cost-mode`` (default 4). Mean absolute distance (MAD)\n   (``cost-mode <= 2``) usually does not work well. The census transform\n   mode (``cost-mode 3``) :cite:`zabih1994census` tends to\n   perform better overall but can produce artifacts on featureless\n   terrain. The ternary census transform mode (``cost-mode 4``)\n   :cite:`hua2016texture` is a modification of the census\n   transform that is more stable on low contrast terrain but may be less\n   accurate elsewhere.\n\n-  ``corr-kernel``. SGM kernels must always be odd. The SGM algorithm\n   works with much smaller kernel sizes than the regular integer\n   correlator so the default large kernel is not recommended. The MAD\n   cost mode can be used with any odd kernel size (including size 1)\n   but the census cost modes can only be used with kernel sizes 3, 5,\n   7, and 9. Size 5 or 7 is usually a good choice. The default is 5.\n\n-  ``xcorr-threshold``. By default this is enabled and set to 2, which \n   doubles the run time of the SGM algorithm. Set it to -1 to turn it\n   off, which may result in less accuracy. If setting\n   ``min-xcorr-level`` to 1, one can perform the cross check on the\n   smaller resolution levels without spending the time to run it on\n   the highest resolution level, which is level 0.\n\n-  The median and texture filters in the ``stereo_fltr`` tool (defaults\n   3, 11, 0.13). These filters were designed specifically to clean up\n   output from the SGM algorithm and are especially useful in\n   suppressing image artifacts in low-texture portions of the image. A\n   median filter size of 3 and a texture filter size of 11 are good\n   starts but the best values will depend on your input images. The\n   ``texture-smooth-scale`` parameter will have to be adjusted to taste,\n   but a range of 0.13 to 0.15 is typical for icy images. These values\n   are enabled by default and must be manually disabled. If your images\n   have good texture throughout it may be best to disable these filters.\n\n-  The ``prefilter-mode`` setting is ignored when using SGM.\n\n-  The ``subpixel-mode`` If not set, or set to values 7-12, SGM will\n   perform subpixel interpolation during the stereo correlation step and\n   will not do additional work in the stereo refinement step. This means\n   that after dealing with the long SGM processing time you do not need\n   to follow it up with a slow subpixel option. \n\n   If desired, you can specify a subpixel mode (with value between 1\n   and 4) to force those subpixel operations to be performed after the\n   default SGM subpixel method. This can remove some staircasing and\n   other artifacts. It is suggested that in this case subpixel mode 3\n   be used which is somewhat less accurate than subpixel mode 2 but\n   faster.\n\n.. figure:: images/correlation/icebridge_example_crop.png\n   :name: corr-sgm-example\n\n   A section of a NASA IceBridge image on the left with a pair of\n   hill-shaded DEMs to the right it showing the difference between default\n   ASP processing (upper right) and processing using the SGM algorithm\n   (lower right). See another illustration in :numref:`stereo_alg_fig`.\n\n:numref:`corr-sgm-example` shows a comparison between two stereo\nmodes. The DEM on the left was generated using the default stereo\nparameters and ``--subpixel-mode 3``. The DEM on the right was\ngenerated using the command::\n\n     parallel_stereo --stereo-algorithm asp_sgm         \\\n       --corr-kernel 7 7 --cost-mode 4                  \\\n       --median-filter-size 3  --texture-smooth-size 13 \\\n       --texture-smooth-scale 0.13\n\nSome grid pattern noise is visible in the image produced using SGM.\nUsing ``--stereo-algorithm asp_mgm`` should reduce it. \n\n.. _original_mgm:\n\nOriginal implementation of MGM\n------------------------------\n\nASP ships the MGM algorithm as implemented by its authors\n(:cite:`facciolo2015mgm`) at::\n\n    https://github.com/gfacciol/mgm\n\nThat program is released under the AGPL license. We do not link to it\ndirectly, rather it is called as a separate process from\n``stereo_corr``, avoiding license compatibility issues.\n\nTo use it, run::\n\n    parallel_stereo --alignment-method local_epipolar \\\n      --stereo-algorithm mgm                          \\\n      --job-size-w 512 --job-size-h 512               \\\n      --sgm-collar-size 128                           \\\n      left.tif right.tif left.xml right.xml\n\nIn this mode, locally aligned portions of the input left and right\nimages are saved to disk, the MGM program (named ``mgm``) is\ncalled for each such pair, it writes the computed disparity\nback to disk, which is then ingested by ASP.\n\nTo be more specific, a global affine epipolar alignment of the left\nand right images is computed first, then the aligned images are broken\nup into tiles, with each tile being by default 1024 x 1024 pixels with\na 512 pixel padding (hence the total tile size is 2048 x 2048), local\nepipolar alignment is computed for each tile, the combination of the\nglobal and subsequent local alignment is applied to each original\nimage to get the locally aligned image tiles, and those are written to\ndisk, to be passed to ``mgm``.\n\nThe ``mgm`` program has its own options. Some are environmental\nvariables, to be set before the tool is called, such as\n``CENSUS_NCC_WIN=5``, while others are passed to the ``mgm``\nexecutable on the command line, for example, ``-t census``. To\ncommunicate any such options to this program, invoke\n``parallel_stereo`` (for example) with::\n\n    --stereo-algorithm 'mgm CENSUS_NCC_WIN=5 -t census'\n\nASP will ensure these will be passed correctly to ``mgm``.\nBy default, ASP uses::\n\n    MEDIAN=1 CENSUS_NCC_WIN=5 USE_TRUNCATED_LINEAR_POTENTIALS=1 TSGM=3 \\\n      -s vfit -t census -O 8\n\nThese are adjusted depending on which ones the user chooses to override.\n\nThe ``CENSUS_NCC_WIN`` parameter is is one of the more notable parameters,\nas it determines the size of the window to use for correlation, so it\ncorresponds to the option ``--corr-kernel`` of ASP-implemented\nalgorithms.\n\nASP automatically finds the minimum and maximum estimated disparity,\nand it passes it to ``mgm`` via the ``-r`` and ``-R`` switches.\n\nOptions for mgm\n~~~~~~~~~~~~~~~\n\n-r (default = -30):\n    Minimum horizontal disparity value. (The images are assumed\n    to be rectified, which eliminates the vertical disparity.)\n\n-R (default = 30):\n    Maximum horizontal disparity value.\n\n-O (default = 4):\n    Number of search directions. Options: 2, 4, 8, 16.\n\n-P1 (default = 8)\n    SGM regularization parameter P1.\n\n-P2 (default = 32):\n    SGM regularization parameter P2.\n\n-p (default = none):\n    Prefilter algorithm. Options: none, census, sobelx, gblur. The\n    ``census`` mode uses the window of dimensions ``CENSUS_NCC_WIN``.\n\n-t (default = ad):\n    Distance function. Options: census, ad, sd, ncc, btad, btsd. For\n    ``ncc`` the window of dimensions ``CENSUS_NCC_WIN`` is used. The\n    ``bt`` option is the Birchfield-Tomasi distance.\n\n-truncDist (default = inf):\n    Truncate distances at nch * truncDist.\n\n-s (default = none):\n    Subpixel refinement algorithm. Options: none, vfit, parabola,\n    cubic.\n\n-aP1 (default = 1):\n    Multiplier factor of P1 when sum \\|I1 - I2\\|^2 < nch * aThresh^2.\n\n-aP2 (default = 1):\n    Multiplier factor of P2 as above.\n\n-aThresh (default = 5):\n   Threshold for the multiplier factors.\n\n-m FILE (default = none):\n    A file with minimum input disparity.\n\n-M FILE (default = none):\n    A file with maximum input disparity.\n\n-l FILE (default = none):\n    Write here the disparity without the left-to-right test.\n\nEnvironmental variables for mgm\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThese should be set on the command line before ``mgm`` is invoked.\n(ASP does that automatically.)\n\nCENSUS_NCC_WIN=3:\n    Size of the window for the census prefilter algorithm and NCC\n    (normalized cross-correlation).\n\nTESTLRRL=1:\n    If 1, do left-to-right and right-to-left consistency checks.\n\nMEDIAN=0:\n     Radius of the median filter post-processing.\n\nTSGM=4:\n    Regularity level.\n\nTSGM_ITER=1:\n    Number of iterations.\n\nTSGM_FIX_OVERCOUNT=1:\n    If 1, fix overcounting of the data term in the energy.\n\nTSGM_DEBUG=0:\n    If 1, print debug information.\n\nTSGM_2LMIN=0:\n    Use the improved TSGM cost only for TSGM=2. Overrides the TSGM\n    value.\n\nUSE_TRUNCATED_LINEAR_POTENTIALS=0:\n    If 1, use the Felzenszwalb-Huttenlocher truncated linear\n    potential. Then P1 and P2 change meaning. The potential they\n    describe becomes V(p,q) = min(P2, P1*\\|p-q\\|).\n\n\n.. _opencv_sgbm_options:\n\nOpenCV SGBM\n-----------\n\nThe ``parallel_stereo`` program can invoke the OpenCV\nsemi-global block-matching algorithm (SGBM) if called with::\n\n    --alignment-method local_epipolar \\\n    --stereo-algorithm \"opencv_sgbm\"\n\nAlternatively, the full string having this algorithm and its\noptions can be used, as::\n\n    --alignment-method local_epipolar                           \\\n    --stereo-algorithm                                          \\\n      \"opencv_sgbm -mode sgbm -block_size 3 -P1 8 -P2 32\n       -prefilter_cap 63 -uniqueness_ratio 10 -speckle_size 100\n       -speckle_range 32 -disp12_diff 1\"\n\nIf an invocation as follows is used::\n\n    --alignment-method local_epipolar                 \\\n    --stereo-algorithm \"opencv_sgbm -block_size 7\"\n\nASP will use the earlier values for all the options except\n``-block_size`` which will be set to 7. Hence, the user can explicitly\nspecify options whose values are desired to be different than the\ndefault choices.\n\nSee an illustration in :numref:`stereo_alg_fig`.\n\nSGBM options\n~~~~~~~~~~~~\n\n-mode (default = sgbm):\n    Choose among several flavors of SGBM. Use ``sgbm`` for the\n    less-memory intensive mode. Setting this mode to ``hh`` will run\n    the full-scale two-pass dynamic programming algorithm. It will\n    consume O(image_width * image_height * num_disparities) bytes of\n    memory, and may run out of memory for a large input\n    disparity range. Use ``3way`` for yet another flavor which OpenCV\n    does not document.\n\n-block_size (default = 3):\n    Block size to use to match blocks from left to right image. It\n    must be an odd number >=1. Normally, it should be somewhere in\n    the 3 - 11 range.\n\n-P1 (default = 8):\n    Multiplier for the first parameter controlling the disparity\n    smoothness. This parameter is used for the case of slanted\n    surfaces. This is multiplied by num_image_channels block_size *\n    block_size, and ASP uses num_image_channels = 1. It is used as the\n    penalty on the disparity change by plus or minus 1 between\n    neighbor pixels.\n\n-P2 (default = 32):\n    Multiplier for the second parameter controlling the disparity\n    smoothness. This is multiplied by num_image_channels block_size *\n    block_size, and ASP uses num_image_channels = 1. This parameter is\n    used for \"solving\" the depth discontinuities problem. The larger\n    the values are, the smoother the disparity is. This parameter is\n    the penalty on the disparity change by more than 1 between\n    neighbor pixels. The algorithm requires P2 > P1.\n\n-disp12_diff (default = 1):\n    Maximum allowed difference (in integer pixel units) in the\n    left-to-right vs right-to-left disparity check. Set it to a\n    non-positive value to disable the check.\n\n-prefilter_cap (default = 63):\n    Truncation value for the prefiltered image pixels. The algorithm\n    first computes the x-derivative at each pixel and clips its value by\n    [-prefilter_cap, prefilter_cap] interval. The result values are\n    passed to the Birchfield-Tomasi pixel cost function.\n\n-uniqueness_ratio (default = 10):\n    Margin in percentage by which the best (minimum) computed cost\n    function value should \"win\" the second best value to consider the\n    found match correct. Normally, a value within the 5 - 15 range is\n    good enough.\n\n-speckle_size (default = 100):\n    Maximum size of smooth disparity regions to consider their noise\n    speckles and invalidate. Set it to 0 to disable speckle\n    filtering. Otherwise, set it somewhere in the 50 - 200 range.\n\n-speckle_range (default = 32):\n    Maximum disparity variation within each connected component. If\n    you do speckle filtering, set the parameter to a positive value,\n    it will be implicitly multiplied by 16. Normally, 1 or 2 is good\n    enough.\n\n.. _libelas:\n\nLIBELAS stereo algorithm\n------------------------\n\nASP ships and can invoke the ``LIBELAS`` (Library for Efficient\nLarge-scale Stereo Matching) algorithm :cite:`Geiger2010ACCV`,\ndescribed at::\n\n    http://www.cvlibs.net/software/libelas/\n\nSee an illustration in :numref:`stereo_alg_fig`.\n\nWe implemented an interface around this library to overcome its\nassumption of the disparity being always positive, and added other\nminor changes. Our fork having these additions is at::\n\n    https://github.com/NeoGeographyToolkit/libelas\n\nThis software is released under GPL. ASP does not link to it directly,\nrather it gets invoked as via a system call, with its inputs and\noutputs being on disk.\n\nTo invoke it, run::\n\n    parallel_stereo --alignment-method local_epipolar \\\n    --stereo-algorithm libelas                        \\\n    <other options>\n\nIf desired to override the values of any of its parameters, those can\nbe passed as follows::\n\n    --stereo-algorithm \"libelas -ipol_gap_width 100\"\n\n(This particular parameter is used to fill holes in the disparity,\nwith a larger value resulting in bigger holes being filled.)\n\nThe algorithm options, and their defaults, as used by ASP, are as\nfollows.\n\n-disp_min (default = 0):\n    Minimum disparity (ASP estimates this unless the user overrides it).\n\n-disp_max (default = 255):\n    Maximum disparity (ASP estimates this unless the user overrides it).\n\n-support_threshold (default = 0.85):\n    Maximum uniqueness ratio (best vs. second-best support match).\n\n-support_texture (default = 10):\n    Minimum texture for support points.\n\n-candidate_stepsize (default = 5):\n    Step size of regular grid on which support points are matched.\n\n-incon_window_size (default = 5):\n    Window size of inconsistent support point check.\n\n-incon_threshold (default = 5):\n    Disparity similarity threshold for support point to be considered\n    consistent.\n\n-incon_min_support (default = 5):\n    Minimum number of consistent support points.\n\n-add_corners (default = 0):\n    Add support points at image corners with nearest neighbor\n    disparities.\n\n-grid_size (default = 20):\n    Size of neighborhood for additional support point extrapolation.\n\n-beta (default = 0.02):\n    Image likelihood parameter.\n\n-gamma (default = 3):\n    Prior constant.\n\n-sigma (default = 1):\n    Prior sigma.\n\n-sradius (default = 2):\n    Prior sigma radius.\n\n-match_texture (default = 1):\n    Minimum texture for dense matching.\n\n-lr_threshold (default = 2):\n    Disparity threshold for left-right consistency check.\n\n-speckle_sim_threshold (default = 1):\n    Similarity threshold for speckle segmentation.\n\n-speckle_size (default = 200):\n    Speckles larger than this get removed.\n\n-ipol_gap_width (default = 3):\n    Fill holes in disparity of height and width at most this value.\n\n-filter_median (default = 0):\n    If non-zero, use an approximate median filter.\n\n-filter_adaptive_mean (default = 1):\n    If non-zero, use an approximate adaptive mean filter.\n\n-postprocess_only_left (default = 0):\n    If non-zero, saves time by not postprocessing the right image.\n\n-verbose (default = 0):\n    If non-zero, print some information about the values of the\n    options being used, as well as what the input and output files\n    are.\n\n-debug_images (default = 0):\n    If non-zero, save the images to disk right before being passed\n    to libelas (the images are thus padded, aligned, and scaled\n    to have byte pixels).\n\n.. _msmw:\n\nMulti-Scale Multi-Window stereo matching\n----------------------------------------\n\nASP provides access to the ``Multi-Scale Multi-Window`` (MSMW) stereo\nmatching algorithm :cite:`buades2015reliable`, by invoking its two\nimplementations ``msmw`` and ``msmw2`` from::\n\n    https://github.com/centreborelli/s2p\n\n(see the ``3rdparty`` directory). While that repository is released\nunder the AGPL-3.0 license and ASP is under the more permissive Apache\nII license, ASP invokes that functionality as an external program via\na system call, so its license does not conflict with ours.\n\nOptions for msmw\n~~~~~~~~~~~~~~~~\n\nTo invoke the ``msmw`` algorithm, run ``parallel_stereo`` with the\noption::\n\n    --alignment-method local_epipolar \\\n    --stereo-algorithm msmw\n\nBy default, ASP invokes this program as if it is called with::\n\n    --stereo-algorithm \"msmw -i 1 -n 4 -p 4 -W 5 -x 9 -y 9 -r 1\n      -d 1 -t -1 -s 0 -b 0 -o 0.25 -f 0 -P 32\"\n\nIn addition ASP, automatically calculates and passes to ``msmw``\nvalues for the ``-m`` and ``-M`` options which correspond to\nestimated minimum and maximum disparity values.\n\nAny options explicitly specified by the user, such as::\n\n    --stereo-algorithm \"msmw -x 7 -y 7\"\n\nare substituted in the earlier string before ASP invokes this tool.\n\nThe meaning of these switches is as follows.\n\n-m:\n    Minimum disparity.\n-M:\n    Maximum disparity.\n\n-x (default = 0):\n  Width of the window (block) to match from the left to right\n  image. Must be set to a positive odd value.\n\n-y (default = 0):\n    Matching window height. Must be set to a positive odd value.\n\n-w (default = 0):\n    Flag for weighting window.\n\n-W (default = 5):\n    Flag for using windows as lists (5x5 windows only). A non-zero\n    value indicates how many of the orientations should be considered.\n    (Note: Not sure what all this means.)\n\n-i (default = 1):\n    Type of distance.\n\n-p (default = 1):\n    Number of precisions for single scale.\n\n-P (default = 1):\n    Factor of disparity refinement by cubic interpolation.\n\n-n (default = 3):\n    Number of scales.\n\n-f (default = 0):\n    Standard deviation noise.\n\n-r (default = 0):\n    Reciprocity value.\n\n-g (default = 0):\n    Subpixel reciprocity flag.\n\n-R (default = 0):\n    Dual reciprocity value.\n\n-l (default = 0):\n   Inverse reciprocity value.\n\n-d (default = 0):\n    Mindist value.\n\n-t (default = 0):\n    Mindist dilatation.\n\n-s (default = 0):\n    Self-similarity value.\n\n-b (default = 0):\n    Integral of derivatives.\n\n-v (default = 0):\n    Variance value.\n\n-o (default = 0):\n    Remove isolated flag.\n\n-O (default = 0):\n    Remove isolated grain (number pixels).\n\n-C (default = -1):\n    Filter using the cost, train removing a fraction of the accepted\n    points (e.g. 0.05).\n\n-a (default = 0):\n    Use Laplacian of the image instead of the image itself.\n\n\nOptions for msmw2\n~~~~~~~~~~~~~~~~~\n\nThis flavor of the MSMW algorithm is called analogously, with::\n\n    --stereo-algorithm msmw2\n\nASP fills in its options as if it is called as::\n\n    --stereo-algorithm \"msmw2 -i 1 -n 4 -p 4 -W 5 -x 9 -y 9\n      -r 1 -d 1 -t -1 -s 0 -b 0 -o -0.25 -f 0 -P 32 -D 0 -O 25 -c 0\"\n\nAs earlier, any of these can be overridden. Compared to ``msmw`` this\ntool has the additional options:\n\n-D (default = 0):\n    Regression mindist.\n\n-c (default = 0):\n    Combine last scale with the previous one to densify the result.\n\n.. _opencv_bm:\n\nOpenCV BM\n---------\n\nThe simpler and not as performing block-matching (BM) algorithm of\nOpenCV can be invoked in a very similar manner to OpenCV's SGBM\n(:numref:`opencv_sgbm_options`), with the algorithm name passed to\n``--stereo-algorithm`` being ``opencv_bm``. It accepts the same\nparameters except ``-P1`` and ``-P2``, and uses in addition the\noption:\n\n-texture_thresh (default = 10):\n    The disparity is only computed for pixels whose \"texture\" measure\n    is no less than this value. Hence lowering this will result in the\n    disparity being computed at more pixels but it may be more\n    erroneous.\n\nThe full default string of options that is used by\n``--stereo-algorithm`` is::\n\n    \"opencv_bm -block_size 21 -texture_thresh 10 -prefilter_cap 31\n     -uniqueness_ratio 15 -speckle_size 100 -speckle_range 32\n     -disp12_diff 1\"\n\nand any of these can be modified as for the SGBM algorithm. Notice\nhow the BM algorithm has to use a bigger block size than SGBM.\n\n.. _adding_algos:\n\nAdding new algorithms to ASP\n----------------------------\n\nASP makes it possible for anybody to add their own algorithm to be\nused for stereo correlation without having to recompile ASP itself.\n\nAny such algorithm must be a program to be invoked as::\n\n    myprog <options> left_image.tif right_image.tif \\\n      output_disparity.tif\n\nHere, as often assumed in the computer vision community, ``left_image.tif`` and\n``right_image.tif`` are small image clips with epipolar alignment applied to\nthem, so that the epipolar lines are horizontal and the resulting disparity only\nneed to be searched in the ``x`` direction (along each row). The images must\nhave the same size. (ASP will take care of preparing these images.)\n\nThe images must be in the TIF format, with pixel values being of the\n``float`` type, and no-data pixels being set to ``NaN``. The output\ndisparity is expected to satisfy the same assumptions and be of\ndimensions equal to those of the input images.\n\nThe options passed to this program are expected to have no other\ncharacters except letters, numbers, space, period, underscore, plus,\nminus, and equal signs. Each option must have exactly one value, \nsuch as::\n\n    -opt1 val1 -opt2 val2 -opt3 val3\n\n(More flexible options, including boolean ones, so with no value,\nmay be implemented going forward.)\n\nSuch a program, say named ``myprog``, should be copied to the\nlocation::\n\n    plugins/stereo/myprog/bin/myprog\n\nrelative to the ASP top-level directory. Any libraries this program \ndepends on *must be copied or sym-linked as absolute path to directory*::\n\n    plugins/stereo/myprog/lib\n\nThen, add a line to the file::\n\n    plugins/stereo/plugin_list.txt\n\nin the ASP top-level directory, in the format::\n\n    myprog plugins/stereo/myprog/bin/myprog plugins/stereo/myprog/lib\n\nThe entries here are the program name (in lowercase), path to the\nprogram, and path to libraries.\n\nAs of build 2025/11 (:numref:`release`), the path to the libraries can be a\ncombination of multiple relative and absolute paths, separated by a colon\n(``:``). The relative paths will be made to be relative to the ASP library\ndirectory.\n\nThen, ASP can invoke this program by calling it, for example, as::\n\n    parallel_stereo --alignment-method local_epipolar \\\n      --stereo-algorithm \"myprog <options>\"           \\\n      <images> <cameras> <output prefix>\n\nThe program will be called for each pair of locally aligned tiles\nobtained from these input images, with one subdirectory for each such\npair of inputs. That subdirectory will also have the output disparity\nproduced by the program. All such disparities will be read back by\nASP, blended together, then ASP will continue with the steps of\ndisparity filtering and triangulation.\n\nIt may be helpful to visit one of such subdirectories, examine the\n``stereo_corr`` log file which will show how precisely the program was called,\nand the path to the libraries for the plugins.\n\nAlso look at its input image tiles and output disparity stored there. \n\nNote such auxiliary data is removed by default, unless ``parallel_stereo`` is\ncalled with the option ``--keep-only unchanged`` (:numref:`parallel_stereo`).\n"
  },
  {
    "path": "docs/stereodefault.rst",
    "content": ".. _stereodefault:\n\nThe ``stereo.default`` file\n===========================\n\nThe ``stereo.default`` file contains configuration parameters that the\n``parallel_stereo`` (:numref:`parallel_stereo`) and ``stereo`` programs use to\nprocess images. The ``stereo.default`` file is loaded from the current working\ndirectory, unless a different file is specified with the ``-s`` option. The file\nextension is not important. \n\nAs mentioned in :numref:`cmdline`, all the ``parallel_stereo`` parameters can\nalso be specified on the command line, by prepending them with two dashes. The\ncommand-line options take precedence over what is specified in this file.\n\nThis file is optional, and it is often preferred to only use command-line\noptions.\n\nA sample ``stereo.default.example`` file is included in the top-level directory\nof the Stereo Pipeline software distribution. That configuration is optimized\nfor speed. See :numref:`nextsteps` for various speed-vs-accuracy tradeoffs of\nstereo algorithms.\n\nListed below are the parameters used by ``parallel_stereo``, grouped\nby processing stage.\n\n.. _stereodefault-pprc:\n\nPreprocessing\n-------------\n\nInterest point determination\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nip-per-tile <integer (default: unspecified)>\n    How many interest points to detect in each :math:`1024^2` image\n    tile (default: automatic determination). This is before matching. \n    Not all interest points will have a match. See also ``--matches-per-tile``.\n\nip-per-image <integer (default: unspecified)>\n    How many interest points to detect in each image (default: automatic \n    determination, usually 5000). Can set either this or ``--ip-per-tile``.\n\nip-detect-method <integer (default: 0)>\n    What type of interest point detection algorithm to use for image alignment.\n    0 = Custom OBAloG (:cite:`jakkula2010efficient`) implementation (default), 1\n    = SIFT implementation from OpenCV, 2 = ORB implementation from OpenCV. The \n    SIFT method, unlike OBALoG, produces interest points that are accurate\n    to subpixel level. Remove any existing ``.vwip`` files before recomputing\n    interest points with a different method. \n\nepipolar-threshold <double (default: unspecified)>\n    Maximum distance in pixels from the epipolar line to search for\n    matches for each interest point. Due to the way ASP finds matches,\n    reducing this value can actually increase the number of interest\n    points detected. If image alignment seems to be working well but\n    you are not getting enough interest points to get a good search\n    range estimate, try setting this value to a small number, perhaps\n    in the low double digits.\n\nip-inlier-factor <double (default: 0.2)>\n    A higher factor will result in more interest points, but perhaps also more\n    outliers and a bigger search range. It is important to note that this\n    parameter overlaps somewhat in scope and effect with\n    ``--epipolar-threshold`` and sometimes not both are active. It is suggested\n    to experiment with both, as well as with ``--ip-uniqueness-threshold``\n    below, which has a different justification but also somewhat similar\n    effects.\n\nip-uniqueness-threshold <double (default: 0.8)>\n    A higher threshold will result in more interest points, but perhaps\n    less unique ones.\n\nip-triangulation-max-error <double (default: unspecified)>\n    When matching IP, filter out any pairs with a triangulation error\n    higher than this.\n\nip-num-ransac-iterations <int (default: 1000)>\n    How many RANSAC iterations to do in interest point matching.\n\nip-nodata-radius <integer (default: 4)>\n    Remove IP near nodata with this radius, in pixels.\n\nforce-reuse-match-files\n    Force reusing the match files even if older than the images or\n    cameras.\n\nmatch-files-prefix <string (default: unspecified)>\n    Use the match file with this prefix. Normally match files are created with\n    ``bundle_adjust`` or ``parallel_stereo``. Works only with non-mapprojected\n    images. See the naming convention in :numref:`ba_match_files`. See also\n    ``clean-match-files-prefix``. Only one of these two options can be\n    specified.\n\nclean-match-files-prefix <string (default: unspecified)>\n    Use as input match file the ``*-clean.match`` file from this prefix\n    (this had the outliers filtered out by ``bundle_adjust``). See also\n    ``match-files-prefix``.\n\nmatches-per-tile <int (default: unspecified)>\n    How many interest point matches to compute in each image tile (of size\n    normally :math:`1024^2` pixels). Use a value of ``--ip-per-tile`` a few\n    times larger than this. See also ``--matches-per-tile-params``.\n\nmatches-per-tile-params <int int (default: 1024 1280)>\n    To be used with ``--matches-per-tile``. The first value is the image tile\n    size for both images. A larger second value allows each right tile to\n    further expand to this size, resulting in the tiles overlapping. This may be\n    needed if the homography alignment between these images is not great, as\n    this transform is used to pair up left and right image tiles.\n\nband <int (default: -1)>\n    Use this band (channel) from input images if more than one. The band count\n    starts from 1. If not set and more than one band is present, use the first\n    band and print a warning.\n\northo-heights <double double (default: NaN NaN)>\n    It is assumed that the left and right input images have been mapprojected\n    onto surfaces with these heights above a datum. The datum is read from the\n    image geoheaders. See :numref:`mapproj_ortho`.\n    \n.. _image_alignment:\n\nImage alignment\n~~~~~~~~~~~~~~~\n\nalignment-method (= affineepipolar, local_epipolar, homography, epipolar, none) \n    (default = affineepipolar)\n\n    When ``alignment-method`` is set to ``local_epipolar``,\n    the images are divided into small tiles with padding \n    (:numref:`ps_tiling`). Local epipolar alignment is\n    applied to each pair of tiles, making the stereo disparity\n    horizontal, then a desired 1D correlation algorithm (specified via\n    ``--stereo-algorithm``) finds this disparity :cite:`de2014automatic`. \n    Then the local alignment is undone for each disparity, the\n    resulting disparities are merged and blended across the tiles,\n    ASP's subpixel refinement is applied, if set via\n    ``--subpixel-mode``, the combined disparity is filtered, and\n    triangulation is performed. This mode works only with\n    ``parallel_stereo``.\n\n    When ``alignment-method`` is set to ``affineepipolar``, ``parallel_stereo``\n    will attempt to pre-align the images by detecting tie-points using\n    feature matching, and using those to transform the images such\n    that pairs of conjugate epipolar lines become collinear and\n    parallel to one of the image axes. The effect of this is\n    equivalent to rotating the original cameras which took the\n    pictures.\n\n    When ``alignment-method`` is set to ``homography``, ``parallel_stereo`` will\n    attempt to pre-align the images by automatically detecting\n    tie-points between images using a feature matching. Tie points are\n    stored in a ``*.match`` file that is used to compute a linear\n    homography transformation of the right image so that it closely\n    matches the left image. Note: the user may exercise more control\n    over this process by using the ``ipfind`` and\n    ``ipmatch`` tools.\n\n    When ``alignment-method`` is set to ``epipolar``, ``parallel_stereo`` will\n    apply a 3D transform to both images so that their epipolar lines will\n    be horizontal. This speeds of stereo correlation as it greatly\n    reduces the area required for searching.\n\n    Epipolar alignment is *only available* with ``--session-type pinhole`` or\n    ``nadirpinhole`` (:numref:`ps_options`).\n\nglobal-alignment-threshold (*float*) (default = 10)\n    Maximum distance from inlier interest point matches to the\n    epipolar line when calculating the global affine epipolar\n    alignment.\n\nlocal-alignment-threshold (*float*) (default = 2)\n    Maximum distance from inlier interest point matches to the\n    epipolar line when calculating the local affine epipolar\n    alignment.\n\nalignment-num-ransac-iterations (*integer*) (default = 1000)\n    How many RANSAC iterations to use for global or local epipolar\n    alignment.\n\noutlier-removal-params (*double, double*) (default = 95.0, 3.0)\n    Outlier removal params (percentage and factor) to be used in\n    filtering interest points and the disparity with the\n    box-and-whisker algorithm. Set the percentage to 100 to turn this\n    off. These values are rather relaxed by default to not remove good\n    data with a big spread.\n\ndisparity-range-expansion-percent (*integer*) (default = 20)\n    Expand the disparity range estimated from interest points by this\n    percentage before computing the stereo correlation with local\n    epipolar alignment.\n\nflann-method (*string*) (default = \"auto\")\n    Choose the FLANN method for matching interest points. Options: ``kmeans``:\n    slower but deterministic, ``kdtree``: faster (up to 6x) but not\n    deterministic (starting with FLANN 1.9.2). The default (``auto``) is to use\n    ``kmeans`` for 25,000 features or less and ``kdtree`` otherwise. This does\n    not apply to ORB feature matching.\n    \nOther pre-processing options\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nforce-use-entire-range\n    By default, the Stereo Pipeline will normalize ISIS images so that\n    their maximum and minimum channel values are :math:`\\pm`\\ 2\n    standard deviations from a mean value of 1.0. Use this option if\n    you want to *disable* normalization and force the raw values to\n    pass directly to the stereo correlations algorithms.\n\n    For example, if the ISIS ``histeq`` tool has already been used to\n    normalize the images, then use this option to disable\n    normalization as a (redundant) pre-processing step.\n\nindividually-normalize\n    By default, the maximum and minimum valid pixel value is\n    determined by looking at both images. Normalized with the same\n    \"global\" min and max guarantees that the two images will retain\n    their brightness and contrast relative to each other.\n\n    This option forces each image to be normalized to its own maximum\n    and minimum valid pixel value. This is useful in the event that\n    images have different and non-overlapping dynamic ranges. You can\n    sometimes tell when this option is needed: after a failed stereo\n    attempt one of the rectified images (``*-L.tif`` and ``*-R.tif``)\n    may be either mostly white or black. Activating this option may\n    correct this problem.\n\n    Note: Photometric calibration and image normalization are steps\n    that can and should be carried out beforehand using ISIS's own\n    utilities. This provides the best possible input to the stereo\n    pipeline and yields the best stereo matching results.\n\ndem\n    Input DEM for processing map-projected images. Can be used instead of\n    specifying the DEM as the last positional argument\n    (:numref:`mapproj-example`).\n\nmatches-as-txt\n    Read and write match files as plain text instead of binary. See\n    :numref:`txt_match` for more details.\n\nskip-image-normalization\n    Skip the step of normalizing the values of input images and removing\n    nodata-pixels. Create instead symbolic links to original images. This is a\n    speedup option for mapprojected input images.\n          \nnodata-value (default = NaN)\n    Pixels with values less than or equal to this number are treated as\n    no-data. This overrides the nodata values from input images.\n\nstddev-mask-kernel (*integer*) (default = -1)\n    Size of kernel to be used in standard deviation filtering of input\n    images. Must be > 1 and odd to be enabled. To be used with\n    ``--stddev-mask-thresh``.\n\nstddev-mask-thresh (*double*) (default = 0.5)\n    Mask out pixels from input images where the local standard\n    deviation score is less than this value. If set < 0, debug files\n    (\\*stddev_filter_output.tif) will be written containing the filter\n    output instead of masking out pixels.To be used with\n    ``--stddev-mask-kernel``.\n    \ndatum (default = \"\")\n    Set the planet datum. Options: WGS_1984, D_MOON (1,737,400 meters), D_MARS\n    (3,396,190 meters), MOLA (3,396,000 meters), NAD83, WGS72, and NAD27. Also\n    accepted: Earth (=WGS_1984), Mars (=D_MARS), Moon (=D_MOON). If not set\n    or inferred from the images or camera models, the datum will be auto-guessed\n    based on camera centers (for Earth, Mars, and Moon).\n\nno-datum\n    Do not assume a reliable datum exists, such as for irregularly shaped bodies\n    or when at the ground level. This is also helpful when the input cameras are\n    not very accurate, as the datum is used to do some camera-based filtering of\n    interest points.\n\nskip-rough-homography \n    Skip the step of performing datum-based rough homography if it\n    fails.\n\nleft-image-crop-win xoff yoff xsize ysize\n    Do stereo in a region of the left image. Default: use the entire image. This\n    option forces redoing all the pre-processing steps if a run is resumed. The\n    region be created by ``stereo_gui`` (:numref:`stereo_gui`). See also\n    ``right-image-crop-win`` and ``proj-win``.\n\nright-image-crop-win xoff yoff xsize ysize\n    When combined with ``left-image-crop-win``, do stereo in given subregions of\n    left and right images. The crop windows can be determined using\n    ``stereo_gui``. See also ``proj-win``.\n\nproj-win minx miny maxx maxy\n    Limit stereo to this projection window for input mapprojected images\n    (:numref:`mapproj-example`). Also works with\n    :ref:`stereo_dist`. This option forces redoing all the\n    pre-processing steps in a resumed run. Available in build 2026-01 or later\n    (:numref:`release`). See also ``left-image-crop-win`` and\n    ``right-image-crop-win``.\n\nleft-image-clip: (*string*) (default = \"\")\n    If ``--left-image-crop-win`` is used, replaced the left image\n    cropped to that window with this clip.\n\nright-image-clip: (*string*) (default = \"\")\n    If ``--right-image-crop-win`` is used, replaced the right image\n    cropped to that window with this clip.\n\naccept-provided-mapproj-dem\n    Accept the DEM provided on the command line as the one mapprojection was\n    done with, even if it disagrees with the DEM recorded in the geoheaders of\n    input images.\n    \nallow-different-mapproject-gsd\n    Allow the left and right mapprojected images to have different GSD. This is\n    for backward compatibility and is not recommended, as it can produce worse\n    results.\n\nthreads (*integer*) (default = 0)\n    Select the number of threads to use for each process. If 0, use\n    the value in ~/.vwrc.\n\ncache-size-mb (*integer*) (default = 1024)\n    Set the system cache size, in MB, for each process.\n\n.. _corr_section:\n\nCorrelation\n-----------\n\nstereo-algorithm (*string*) (default = \"asp_bm\")\n    Use this option to switch between the different stereo \n    correlation algorithms supported by ASP. Options: ``asp_bm``,\n    ``asp_sgm``, ``asp_mgm``, ``asp_final_mgm``, ``mgm`` (original\n    author implementation), ``opencv_sgbm``, ``libelas``, ``msmw``,\n    ``msmw2``, and ``opencv_bm``. See :numref:`stereo_algos` for their\n    description.\n\nprefilter-mode (= 0,1,2) (default = 2)\n    Filter used to prepare images before performing correlation. Used\n    only with the ``asp_bm`` algorithm. Options:\n\n    0 - None\n\n    1 - Subtracted mean\n       Takes a preferably large Gaussian kernel and subtracts its\n       value from the input image. This effectively reduces low frequency\n       content in the image. The result is correlation that is immune to\n       translations in image intensity.\n\n    2 - LoG filter\n       Takes the Laplacian of Gaussian of the image. This provides some\n       immunity to differences in lighting conditions between a pair of\n       images by isolating and matching on blob features in the image.\n\n   For all of the modes above, the size of the filter kernel is\n   determined by the ``prefilter-kernel-width`` parameter below.\n\n   The choice of pre-processing filter must be made with thought to the\n   cost function being used (see ``cost-mode``, below). LoG filter\n   preprocessing provides good immunity to variations in lighting\n   conditions and is usually the recommended choice.\n\nprefilter-kernel-width (*float*) (default = 1.5)\n    The diameter of the Gaussian convolution kernel used\n    for the prefilter modes 1 and 2 above. A value of 1.5 works\n    well for ``LoG`` and 25 - 30 works well for ``subtracted mean``.\n\ncorr-seed-mode (=0,1,2,3)\n    (default = 1)\n    This integer parameter selects a strategy for how to solve for the\n    low-resolution integer correlation disparity, which is used to seed\n    the full-resolution disparity later on.\n\n    0 - None\n       Don't calculate a low-resolution variant of the disparity image.\n       The search range provided by ``corr-search`` is used directly in\n       computing the full-resolution disparity. \n\n    1 - Low-resolution disparity from stereo\n       Calculate a low-resolution version of the disparity from the\n       integer correlation of subsampled left and right images. The\n       low-resolution disparity will be used to narrow down the search\n       range for the full-resolution disparity.\n\n       This is a useful option despite the fact that our integer\n       correlation implementation does indeed use a pyramid approach. Our\n       implementation cannot search infinitely into lower resolutions due\n       to its independent and tiled nature. This low-resolution disparity\n       seed is a good hybrid approach.\n\n    2 - Low-resolution disparity from an input DEM\n       Use a lower-resolution DEM together with an estimated value for its error\n       to compute the low-resolution disparity, which will then be used to find\n       the full-resolution disparity as above. These quantities can be specified\n       via the options ``disparity-estimation-dem`` and\n       ``disparity-estimation-dem-error`` respectively. See also\n       :numref:`d_sub_dem`.\n       \n    3 - Disparity from full-resolution images at a sparse number of points.\n       This is an advanced option for terrain having snow and no\n       large-scale features. This is described in :numref:`sparse_disp`.\n\ncorr-sub-seed-percent (*float*) (default=0.25)\n    When using ``corr-seed-mode 1``, the solved-for or user-provided\n    search range is grown by this factor for the purpose of computing\n    the low-resolution disparity.\n\nmin-num-ip (*integer*) (default = 20)\n    Automatic search range estimation will quit if at least this many\n    interest points are not detected.\n\ncost-mode (= 0, 1, 2, 3, 4)\n    The default is 2 for the ``asp_bm`` algorithm and 4 for ``asp_sgm`` and\n    ``asp_mgm``. This defines the cost function used during integer correlation.\n    Squared difference is the fastest cost function. However it comes at the\n    price of not being resilient against noise. Absolute difference is the next\n    fastest and is a better choice. Normalized cross correlation is the slowest\n    but is designed to be more robust against image intensity changes and slight\n    lighting differences. Normalized cross correlation is about 2x slower than\n    absolute difference and about 3x slower than squared difference. The census\n    transform :cite:`zabih1994census` and ternary census transform\n    :cite:`hua2016texture` can only be used with the ASP_SGM and ASP_MGM\n    correlators. See :numref:`asp_sgm` for details.\n\n    | 0 - absolute difference\n    | 1 - squared difference\n    | 2 - normalized cross correlation\n    | 3 - census transform\n    | 4 - ternary census transform\n\ncorr-kernel (*integer integer*)\n    The default is  21 x 21 for the ``asp_bm`` algorithm and 5 x 5 for the\n    ``asp_sgm`` and ``asp_mgm`` algorithms (:numref:`asp_sgm`). This option\n    determine the size (in pixels) of the correlation kernel used in the\n    initialization step. A different size can be set in the horizontal and\n    vertical directions, but square correlation kernels are almost always used\n    in practice. The kernel size is at most 9 x 9 with ``--stereo-algorithm\n    asp_mgm`` or ``asp_sgm``. \n\ncorr-search (*integer integer integer integer*)\n    These parameters determine the size of the initial correlation search range.\n    It will be used to find the low-resolution disparity (:numref:`d_sub`),\n    which will then be used to find the full-resolution disparity\n    (:numref:`stereo_corr`). This is an advanced parameter. Normally, the search\n    range is automatically determined based on interest point matches.\n     \n    The ideal search range depends on a variety of factors ranging from how the\n    images were pre-aligned to the resolution and range of disparities seen in a\n    given image pair. This search range is successively refined during\n    initialization, so it is often acceptable to set a large search range that\n    is guaranteed to contain all of the disparities in a given image. However,\n    setting tighter bounds on the search can sometimes reduce the number of\n    erroneous matches, so it can be advantageous to tune the search range for a\n    particular data set.\n\n    These four integers define the minimum horizontal and vertical\n    disparity and then the maximum horizontal and vertical disparity.\n\n    With this option and with ``alignment-method`` being ``none`` or\n    ``epipolar``, ``parallel_stereo`` will continue even if interest point\n    matching fails. In either case, interest point matches will not be used to\n    initialize the search range. \n    \n    See also the option ``corr-search-limit``. That is used to constrain\n    any produced search range, rather than initialize it as here.\n\nmax-disp-spread (*double*) (default = -1.0)\n    If positive, limit the spread of the disparity to this value\n    (horizontally and vertically, centered at the median\n    value). Do not specify together with ``corr-search-limit``.\n    Use this with care. With non-mapprojected images, the valid spread\n    of the disparity can be a few thousand pixels, if the terrain \n    is very steep. With mapprojected images this likely should\n    be under 100-200 pixels.\n    \n    In the latest build of ASP, if this is set, it will be applied in each\n    process that computes the disparity. In older ASP, the existing\n    low-resolution disparity needs to be deleted before restarting a run with\n    this option. That disparity also needs to be deleted if it is desired to\n    relax or no longer use this option.\n    \ncorr-search-limit (*integer integer integer integer*)\n    Set these parameters to constrain the disparity search range, whether it was\n    produced based on interest point matches, with ``corr-search``, or other\n    methods (:numref:`d_sub`). This limit is applied before both the\n    low-resolution and full-resolution disparity computation.\n    \n    The interpretation of the four values are as for ``corr-search``.\n    \n    See also ``--max-disp-spread``.\n\nip-filter-using-dem (*string*) (default = \"\")\n    Filter as outliers interest point matches whose triangulated\n    height differs by more than given value from the height at the\n    same location for the given DEM. All heights are in\n    meters. Specify as: '<dem file> <height diff>. Example: \n    'dem.tif 50.0'.\n\nelevation-limit (*float float*) (default = ``unspecified``)\n    Remove as outliers interest points whose height above datum (in\n    meters) does not fall within this range. This can reduce the \n    disparity search range.\n\ncorr-max-levels (*integer*) (default = 5)\n    The maximum number of additional (lower) resolution levels to use\n    when performing integer correlation. Setting this value to zero\n    just performs correlation at the native resolution.\n\nxcorr-threshold (*float*) (default = 2.0)\n    Integer correlation to a limited sense performs a correlation\n    forward and backwards to double check its result. This is one of\n    the first filtering steps to insure that we have indeed converged\n    to a global minimum for an individual pixel. The\n    ``xcorr-threshold`` parameter defines an agreement threshold in\n    pixels between the forward and backward result. See also \n    ``--save-left-right-disparity-difference``.\n\n    Optionally, this parameter can be set to a negative number. This will\n    signal the correlator to only use the forward correlation result.\n    This will drastically improve speed at the cost of additional noise.\n\nmin-xcorr-level (*integer*) (default = 0)\n    When using the cross-correlation check controlled by\n    xcorr-threshold, this parameter sets the minimum pyramid resolution\n    level that the check will be performed at. By default the check\n    will be performed at every resolution level but you may wish to\n    increase this value to save time by not doubling up on processing\n    the largest levels.\n\n    Currently this feature is not enabled when using the default\n    block-matching correlation method. In that case the cross\n    correlation check is only ever performed on the last resolution level,\n    which is level 0.\n\nsave-left-right-disparity-difference\n    Save the discrepancy between left-to-right and right-to-left\n    disparities, defined as ``max(abs(left_disp_x - right_disp_x),\n    abs(left_disp_y - right_disp_y))``. Assumes a non-negative value of\n    ``--xcorr-threshold`` and stereo algorithms ``asp_bm``, ``asp_sgm``, ``asp_mgm``, \n    or ``asp_final_mgm``. Missing values are set to no-data. This is saved\n    to ``<output prefix>-L-R-disp-diff.tif``.\n\nrm-quantile-percentile (*double*) (default = 0.85)\n    See rm-quantile-multiple for details.\n\nrm-quantile-multiple (*double*) (default = -1)\n    Used for filtering disparity values in the low-resolution\n    disparity ``D_sub.tif`` (:numref:`outputfiles`). Disparities greater\n    than ``quantile multiple`` times the ``quantile percentile`` (of\n    the histogram) will be discarded. If this value is set greater\n    than zero, this filtering method will be used instead of the\n    method using the values ``rm-min-matches`` and\n    ``rm_threshold``. This method will help filter out clusters of pixels\n    which are too large to be filtered out by the neighborhood method\n    but that have disparities significantly greater than the rest of\n    the image.\n\ncorr-timeout (*integer*) (default = 900)\n    Correlation timeout for an image tile, in seconds.\n\ncorr-blob-filter (*integer*) (default = 0)\n    Set to apply a blob filter in each level of pyramidal integer\n    correlation. When the correlator fails it often leaves \"islands\" of\n    erroneous disparity results. Using this blob filter to remove them\n    cleans up the final stereo output and can even reduce processing\n    times by preventing the correlator from searching at large,\n    incorrect disparity amounts. The value provided is the size of\n    blobs in pixels that will be removed at the full image resolution.\n\nsgm-collar-size (*integer*) (default = auto)\n    Specify the size of a region of additional processing around each\n    correlation tile for SGM, MGM, and external algorithms. This helps reduce\n    seam artifacts at tile borders when processing an image that needs to be\n    broken up into tiles at the cost of additional processing time. This has no\n    effect if the entire image can fit in one tile. See :numref:`ps_tiling`.\n\ncorr-tile-size (*integer*) (default = auto)\n    An internal parameter that sets the size of each tile to be processed. This\n    is set automatically. See :numref:`ps_tiling` for user-accessible controls.\n\nsgm-search-buffer (*integer integer*) (default = 4 4)\n    This option determines the size (in pixels) searches around the\n    expected disparity location in successive levels of the correlation\n    pyramid. A smaller value will decrease run time and memory usage\n    but will increase the chance of blunders. It is not recommended to\n    reduce either value below 2.\n\ncorr-memory-limit-mb (*integer*) (default = 5120)\n    Restrict the amount of memory used by the correlation step to be\n    slightly above this value. This only really affects SGM/MGM which\n    use a pair of large memory buffer in their computation. The total\n    memory usage of these buffers is compared to this limit, and if it\n    is greater then smaller search ranges will be used for uncertain\n    pixels in order to reduce memory usage. If the required memory is\n    still over this limit then the program will error out. The unit is\n    in megabytes.\n\ncorrelator-mode\n    Function as an image correlator only (including with subpixel\n    refinement). Assume no cameras, aligned input images, and stop\n    before triangulation, so at filtered disparity. See\n    :numref:`correlator-mode` for more details.\n\ndisparity-estimation-dem (*string*) (default = \"\")\n    The DEM to use in estimating the low-resolution disparity (when\n    ``corr-seed-mode`` is 2).\n\ndisparity-estimation-dem-error (*double*) (default = 0.0)\n    Error, or uncertainty, in meters, of the disparity estimation DEM.\n    \ndisparity-estimation-sample-rate (*int*) (default = 1)\n    Use one out of this many samples along each row and column, for\n    ``corr-seed-mode 2``.\n    \nstereo-debug\n    A developer option used to debug stereo correlation.\n\nlocal-alignment-debug\n    A developer option used to debug local epipolar alignment issues.\n    An example is in :numref:`local_alignment_issues`.\n\n.. _subpixel_options:\n\nSubpixel refinement\n-------------------\n\nsubpixel-mode (*integer*) (default = auto)\n    This parameter selects the subpixel correlation method. Parabola subpixel\n    (mode 1) is very fast but will produce results that are only slightly more\n    accurate than those produced by the integer disparity step. Bayes EM (mode 2)\n    is very slow but offers the best quality. \n    \n    When tuning ``stereo.default`` parameters, it is expedient to start out\n    using parabola subpixel as a \"draft mode.\" When the results are looking good\n    with parabola subpixel mode, then they will look even\n    better with subpixel mode 2. For inputs with little noise, the affine method\n    (subpixel mode 3) may produce results equivalent to Bayes EM in a shorter\n    time. Phase correlation (subpixel mode 4) is uses a frequency domain\n    technique. It is slow and is best may not produce better results than mode 2\n    but it may work well in some situations with flat terrain.\n\n    Subpixel modes 5 and 6 are experimental. Modes 7-12 are only used as part of\n    SGM/MGM correlation (see the stereo algorithms in\n    :numref:`stereo_alg_overview`). These are much faster than subpixel modes\n    2-4 and if selected (with SGM/MGM) will be the only subpixel mode performed.\n    They interpolate between the SGM/MGM integer results and should produce\n    reasonable values. The default blend method for SGM/MGM is a custom\n    algorithm that should work well but the you may find that one of the other\n    options is better for your data.\n\n    Subpixel modes 1-4 can be used in conjunction with SGM/MGM. In this\n    case subpixel mode 12 will be used first, followed by the selected\n    subpixel mode. Depending on your data this may produce better results\n    than using just the SGM/MGM only methods. You may get bad artifacts\n    combining mode 1 with SGM/MGM.\n\n    | 0 - no subpixel refinement\n    | 1 - parabola fitting \n    | 2 - affine adaptive window, Bayes EM weighting \n    | 3 - affine window \n    | 4 - phase correlation \n    | 5 - Lucas-Kanade method (experimental)\n    | 6 - affine adaptive window, Bayes EM with Gamma Noise Distribution (turned off) \n    | 7 - SGM None \n    | 8 - SGM linear \n    | 9 - SGM Poly4 \n    | 10 - SGM Cosine \n    | 11 - SGM Parabola \n    | 12 - SGM Blend \n    \n    The default subpixel mode value is 1 with ``--stereo-algorithm asp_bm`` and\n    12 with the ``asp_sgm`` and ``asp_mgm`` algorithms. \n    \n    See :cite:`Miclea_subpixel` for the SGM subpixel methods.\n\n    For a visual comparison of the quality of these subpixel modes, refer\n    back to :numref:`correlation`.\n\nsubpixel-kernel (*integer integer*) (default = 35 35)\n    Specify the size of the horizontal and vertical size (in pixels) of the\n    subpixel correlation kernel. It is advantageous to keep this small for\n    parabola fitting in order to resolve finer details. However for the Bayes EM\n    methods, keep the kernel slightly larger. Those methods weight the kernel\n    with a Gaussian distribution, thus the effective area is small than the\n    kernel size defined here. This affects ``edge-buffer-size``.\n\nphase-subpixel-accuracy (*integer*) (default = 20)\n    Set the maximum resolution of the phase subpixel correlator. The\n    maximum resolution is equal to 1.0 / this value. Larger values\n    increase accuracy but also computation time.\n\n.. _filter_options:\n\nFiltering\n---------\n\nfilter-mode (*integer*) (default = 1)\n    This parameter sets the filter mode. Three modes are supported as\n    described below. Here, by neighboring pixels for a current pixel we\n    mean those pixels within the window of half-size of\n    ``rm-half-kernel`` centered at the current pixel. \n    \n    The default is 1 for the full-resolution disparity, but mode 2 is\n    hard-coded for filtering the low-resolution disparity\n    ``D_sub.tif``. Options:\n\n    0\n       No filtering.\n\n    1\n       Filter by discarding pixels at which disparity differs from mean\n       disparity of neighbors by more than ``max-mean-diff``.\n\n    2\n       Filter by discarding pixels at which percentage of neighboring\n       disparities that are within ``rm-threshold`` of current disparity\n       is less than ``rm-min-matches``.\n\nrm-half-kernel (*integer integer*) (default = 5 5)\n    This setting adjusts the behavior of an outlier rejection scheme\n    that \"erodes\" isolated regions of pixels in the disparity map that\n    are in disagreement with their neighbors.\n\n    The two parameters determine the size of the half kernel that is used\n    to perform the automatic removal of low confidence pixels. A\n    5 |times| 5 half kernel would result in an\n    11 |times| 11 kernel with 121 pixels in it.\n\nmax-mean-diff (*integer*) (default = 3)\n    This parameter sets the *maximum difference* between the current\n    pixel disparity and the mean of disparities of neighbors in order\n    for a given disparity value to be retained (for ``filter-mode`` 1).\n\nrm-min-matches (*integer*) (default = 60)\n    This parameter sets the *percentage* of neighboring disparity\n    values that must fall within the inlier threshold in order for a\n    given disparity value to be retained (for ``filter-mode`` 2).\n\nrm-threshold (*double*) (default = 3)\n    This parameter sets the inlier threshold for the outlier rejection\n    scheme. This option works in conjunction with ``rm-min-matches`` above.\n    A disparity value is rejected if it differs by more than\n    ``rm_threshold`` disparity values from ``rm-min-matches`` percent of pixels\n    in the region being considered (for ``filter-mode`` 2).\n\nrm-cleanup-passes (*integer*) (default = 1)\n    Select the number of outlier removal passes that are carried out.\n    Each pass will erode pixels that do not match their neighbors. One\n    pass is usually sufficient.\n\nmedian-filter-size (*integer*) (default = 0)\n    Apply a median filter of the selected kernel size to the subpixel\n    disparity results. This option can only be used if\n    ``rm-cleanup-passes`` is set to zero.\n\ntexture-smooth-size (*integer*) (default = 0)\n    Apply an adaptive filter to smooth the disparity results inversely\n    proportional to the amount of texture present in the input image.\n    This value sets the maximum size of the smoothing kernel used (in\n    pixels). This option can only be used if ``rm-cleanup-passes`` is\n    set to zero.\n\ntexture-smooth-scale (*float*) (default = 0.15)\n    Used in conjunction with ``texture-smooth-size``, this value helps\n    control the regions of the image that will be smoothed. A larger\n    value will result in more smoothing being applied to more of the\n    image. A smaller value will leave high-texture regions of the image\n    unsmoothed.\n\nenable-fill-holes\n    Enable filling of holes in disparity using an inpainting method.\n    Obsolete. It is suggested to use instead point2dem's analogous\n    functionality.\n\nfill-holes-max-size (*integer*) (default = 100,000)\n    Holes with no more pixels than this number should be filled in.\n\nedge-buffer-size (*integer*) (default = -1)\n    Crop to be applied around image borders during filtering. If not set, and\n    ``subpixel-mode`` is between 1 and 6 (inclusive), use the max of two\n    ``subpixel-kernel`` values. Otherwise set to 5.\n\nerode-max-size (*integer*) (default = 0)\n    Isolated blobs with no more pixels than this number should be\n    removed.\n\ngotcha-disparity-refinement\n    Turn on the experimental Gotcha disparity refinement\n    (:numref:`casp_go`). It refines and overwrites ``F.tif``. See the\n    option ``casp-go-param-file`` for customizing its behavior.\n\ncasp-go-param-file (*string*) (default = \"\"):\n    The parameter file to use with Gotcha disparity refinement when\n    invoking the ``gotcha-disparity-refinement`` option. The default\n    is to use the file ``share/CASP-GO_params.xml`` shipped with ASP.\n\n.. _triangulation_options:\n\nPost-processing (triangulation)\n-------------------------------\n\nnear-universe-radius (*float*) (default = 0.0)\n\nfar-universe-radius (*float*) (default = 0.0)\n    These parameters can be used to remove outliers from the 3D\n    triangulated point cloud. The points that will be kept are those\n    whose distance from the universe center (see below) is between\n    ``near-universe-radius`` and ``far-universe-radius``, in meters.\n\nuniverse-center (default = none)\n    Defines the reference location to use when filtering the output\n    point cloud using the above near and far radius options. The\n    available options are:\n\n    None\n       Disable filtering.\n\n    Camera\n       Use the left camera center as the universe center.\n\n    Zero\n       Use the planet center as the universe center.\n\nbundle-adjust-prefix (*string*)\n    Use the camera adjustments obtained by previously running\n    bundle_adjust with this output prefix.\n\nmin-triangulation-angle (*double*)\n    The minimum angle, in degrees, at which rays must meet at a\n    triangulated point to accept this point as valid. It must be \n    positive. The internal default is somewhat less than 1 degree.\n\nmax-valid-triangulation-error (*double*) (default = 0.0)\n    If positive, points with triangulation error larger than this will\n    be removed from the cloud. Measured in meters.\n\npoint-cloud-rounding-error (*double*)\n    How much to round the output point cloud values, in meters (more\n    rounding means less precision but potentially smaller size on\n    disk). The inverse of a power of 2 is suggested. Default:\n    :math:`1/2^{10}` meters (about 1mm) for Earth and proportionally\n    less for smaller bodies, unless error propagation happens\n    (:numref:`error_propagation`), when it is set by default to \n    :math:`10^{-8}` meters, to avoid introducing step artifacts in\n    these errors. See also ``--save-double-precision-point-cloud`` below,\n    and ``--rounding-error`` in ``point2dem`` (:numref:`point2dem_options`).\n\nsave-double-precision-point-cloud\n    Save the final point cloud in double precision rather than bringing\n    the points closer to origin and saving as float (marginally more\n    precision at twice the storage).\n\nnum-matches-from-disp-triplets (*integer*) (default = 0)\n    Create a match file with roughly this many points uniformly sampled from the\n    stereo disparity, while making sure that if there are more than two images,\n    a set of ground features are represented by matches in at least three of\n    them. These are useful when refining camera intrinsics\n    (:numref:`floatingintrinsics`) or solving for jitter (:numref:`jitter_solve`).\n    See :numref:`dense_ip` for more details.\n    \n    To not continue with triangulation, use ``--compute-point-cloud-center-only``. \n    \nnum-matches-from-disparity (*integer*) (default = 0)\n    Create a match file with roughly this many points uniformly sampled from the\n    stereo disparity. The matches are between original images (that is, before\n    any alignment or map-projection). These can be used in bundle adjustment\n    See also ``num-matches-from-disp-triplets``.\n\ncompute-point-cloud-center-only\n    Only compute the center of triangulated point cloud and exit. Hence,\n    do not compute the triangulated point cloud.\n\ncompute-error-vector\n    When writing the output point cloud, save the 3D triangulation\n    error vector (the vector between the closest points on the rays\n    emanating from the two cameras), rather than just its length. In\n    this case, the point cloud will have 6 bands (storing the\n    triangulation point and triangulation error vector) rather than the\n    usual 4. When invoking ``point2dem`` on this 6-band point cloud and\n    specifying the ``--errorimage`` option, the error image will\n    contain the three components of the triangulation error vector in\n    the North-East-Down coordinate system.\n\nenable-atmospheric-refraction-correction\n    Enable atmospheric refraction correction for Pleiades linescan cameras. By default, \n    such a correction is enabled only for WorldView linescan cameras.\n    \nenable-velocity-aberration-correction\n    Enable velocity aberration correction for Pleiades linescan cameras. By default, \n    such a correction is enabled only for WorldView linescan cameras.\n    \n.. _stereo-default-error-propagation:\n\nError propagation (used in triangulation)\n-----------------------------------------\n\npropagate-errors\n    Propagate the errors from the input cameras to the triangulated\n    point cloud. See :numref:`error_propagation`.\n\nhorizontal-stddev <*double double* (default = 0.0 0.0)>\n    If positive, propagate these left and right camera horizontal\n    ground plane stddev values through triangulation. To be used with\n    ``--propagate-errors``.\n\nposition-covariance-factor <double (default: 1.0)>\n    Multiply the satellite position covariances by this number before\n    propagating them to the triangulated point cloud. Applicable\n    only to Maxar(DigitalGlobe) linescan cameras.\n\norientation-covariance-factor <double (default: 1.0)>\n    Multiply the satellite quaternion covariances by this number\n    before propagating them to the triangulated point cloud.\n    Applicable only to Maxar(DigitalGlobe) linescan cameras.\n\nBathymetry correction options\n-----------------------------\n\nThese are options are used to infer the depth of shallow-water bodies\n(see :numref:`bathy_intro`).\n\nPre-processing stage\n~~~~~~~~~~~~~~~~~~~~\n\nleft-bathy-mask (*string*)\n    Mask to use for the left image when doing bathymetry. Pixels \n    classified as water must be either no data or have zero value\n    in the mask, while land pixels must have positive value.\n\nright-bathy-mask (*string*)\n    Mask to use for the right image when doing bathymetry. See also\n    ``left-bathy-mask``.\n\nTriangulation stage\n~~~~~~~~~~~~~~~~~~~\n\nbathy-plane (*string*)\n    Path to a file containing a plane approximating the water surface, for\n    bathymetry correction with underwater terrain (:numref:`bathy_plane_def`).\n    This corrects camera rays passing through water using Snell's law. If there\n    is one plane per image, use ``bathy-plane-list``. Use together with\n    ``refraction-index``.\n\nbathy-plane-list (*string*)\n    Path to a file containing a list of bathy plane files for bathymetry\n    correction, if more than one. Set one plane file per line. Must specify one\n    plane per input image, in the same order. Use with ``refraction-index``.\n\nrefraction-index (*double*) (default = 0.0) \n    The index of refraction of water to be used in bathymetry correction.\n    Must be specified and bigger than 1. This index can be computed with\n    the :ref:`refr_index` program.\n\noutput-cloud-type arg (*string*) (default = all)\n    When bathymetry correction is used, return only the triangulated cloud of \n    points where the bathymetry correction was applied (option:\n    'bathy'), where it was not applied (option: 'topo'), or the full\n    cloud (option: 'all').\n\nGUI options\n-----------\n\nSee :numref:`gui_options`.\n\n.. |times| unicode:: U+00D7 .. MULTIPLICATION SIGN\n"
  },
  {
    "path": "docs/thirdparty.rst",
    "content": "Third party licenses\n====================\n\n.. include:: ../THIRDPARTYLICENSES.rst\n"
  },
  {
    "path": "docs/tips_tricks.rst",
    "content": ".. _tips:\n\nTips and tricks\n===============\n\nHere we summarize, in one place, some insights in how to get the most\nfrom ASP, particularly the highest quality results in the smallest\namount of time.\n\n-  Ask for help or if you have questions. We're always glad to share\n   what we know, implement suggestions, and fix issues (:numref:`get-help`).\n\n-  Use the GUI (:numref:`stereo_gui`) to get\n   comfortable with ASP on a small region and to tune parameters\n   (:numref:`stereo_gui`). A solution specific to ISIS\n   images is to crop your stereo pair (using the ISIS ``crop`` command being\n   careful to retain SPICE information, or ``cam2map4stereo.py`` for map-projected\n   images) to a small region of interest.\n\n-  The highest quality results with ASP can be obtained with\n   map-projected images (:numref:`mapproj-example`).\n\n-  Run stereo on multiple machines (:numref:`parallel_stereo`).\n\n-  Improve the quality of the inputs to get better outputs.\n   Bundle-adjustment can be used to find out the camera positions more\n   accurately (:numref:`baasp`). CCD artifact correction\n   can be used to remove artifacts from WorldView images\n   (:numref:`wvcorrect-example`). \n\n-  Align the output point cloud to some known absolute reference with\n   ``pc_align`` (:numref:`pc-align-example`).\n\n-  Remove noise from the output point cloud. During stereo\n   triangulation, points that are further or closer than given distances\n   from planet center or left camera center can be removed as outliers\n   (:numref:`triangulation_options`).\n   During DEM generation (:numref:`point2dem`), points\n   with large triangulation error can be removed using\n   ``--remove-outliers-params``. Spikes can be removed with\n   ``--median-filter-params``. Points close to the boundary, that tend\n   to be less accurate, can be eroded (``--erode-length``).\n\n-  During stereo filtering, islands can be removed with\n   ``--erode-max-size``.\n\n-  Remove noise from the low-resolution disparity (D_sub) that can\n   greatly slow down a run using ``--rm-quantile-percentile`` and\n   ``--rm-quantile-multiple``. Some care is needed with these to not\n   remove too much information.\n\n-  Fill holes in output orthoimages for nicer display (also in DEMs),\n   during DEM and orthoimage generation with ``point2dem`` (:numref:`point2dem`).\n   Holes in an existing DEM can also be\n   filled using ``dem_mosaic`` (:numref:`dem_mosaic`).\n\n-  To get good results if the images lack large-scale features (such as\n   for ice plains) use a different way to get the low-resolution\n   disparity (:numref:`sparse_disp`).\n\n-  If a run takes unreasonably long, decreasing the timeout parameter\n   may be in order (:numref:`longrun`).\n\n-  Manually set the search range if the automated approach fails\n   (:numref:`search_range`).\n\n-  To increase speed, the image pair can be subsampled. For ISIS\n   images, the ISIS ``reduce`` command can be used, while for DigitalGlobe/Maxar \n   data one can invoke the ``dg_mosaic`` tool (:numref:`dg_mosaic`,\n   though note that this tool may introduce\n   aliasing). With subsampling, you are trading resolution for speed, so\n   this probably only makes sense for debugging or \"previewing\" 3D\n   terrain. That said, subsampling will tend to increase the signal to\n   noise ratio, so it may also be helpful for obtaining 3D terrain out\n   of noisy, low quality images.\n\n-  Photometric calibration (using the ISIS tools) can be used to improve\n   the input images and hence get higher quality stereo results.\n\n-  If your images have missing or inaccurate camera pose information, and they\n   were acquired with frame (pinhole cameras), such data can be solved for using\n   structure-from-motion and bundle adjustment (:numref:`sfm`).\n\n-  Shape-from-shading (:numref:`sfs`) can be used to\n   further increase the level of detail of a DEM obtained from stereo,\n   though this is a computationally expensive process and its results\n   are not easy to validate.\n\nWe'll be happy to add here more suggestions from community's accumulated\nwisdom on using ASP.\n"
  },
  {
    "path": "docs/tools/add_spot_rpc.rst",
    "content": ".. _add_spot_rpc:\n\nadd_spot_rpc\n------------\n\nThe ``add_spot_rpc`` tool creates an RPC model to approximate a SPOT5\nsensor model. The RPC model can be appended to the end of a SPOT5\nmetadata file, allowing it to be used with the RPC session type in other\nASP tools. The most important application is to map project SPOT5\nimages, then to perform stereo on the map projected images with the\n``spot5maprpc`` session type.\n\nIf the output file does not exist, a new file is created containing the\nRPC model. Otherwise the RPC model is appended to an existing file. When\nan existing SPOT5 metadata file is the output file, the new RPC model is\nproperly inserted into the file so that it is ready to use.\n\nAn example for how to use this tool is given in :numref:`spot5`.\n\nUsage::\n\n     add_spot_rpc <input metadata file> -o <output file>\n\nIt is important to note that the tool expects the minimum and maximum\nsimulation box heights (in meters, above the datum) in which to compute\nthe RPC approximation. The defaults are 0 and 8000, corresponding to sea\nlevel and the highest location on Earth. Narrowing down these numbers\n(if it is known what range of terrain heights is expected) may result in\nslightly more accurate models.\n\nCommand-line options for add_spot_rpc:\n\n-o, --output-prefix <arg>\n    Specify the output prefix.\n\n--min-height <arg (default: 0)>\n    The minimum height (in meters) above the WGS84 datum of the\n    simulation box in which to compute the RPC approximation.\n\n--max-height <arg (default: 8000)>\n    The maximum height (in meters) above the WGS84 datum of the\n    simulation box in which to compute the RPC approximation.\n\n--num-samples <arg (default: 100)>\n    How many samples to use between the minimum and maximum heights.\n\n--penalty-weight <arg (default: 0.1)>\n    Penalty weight to use to keep the higher-order RPC coefficients\n    small. Higher penalty weight results in smaller such coefficients.\n\n-v, --version\n    Display the version of software.\n\n-h, --help\n    Display this help message.\n"
  },
  {
    "path": "docs/tools/aster2asp.rst",
    "content": ".. _aster2asp:\n\naster2asp\n---------\n\nThe ``aster2asp`` tool takes as input an HDF file or a directory containing\nASTER Level 1A data and creates TIF and XML files that can then be passed to\n:ref:`parallel_stereo` to create a point cloud.\n\nAn example for how to fetch the data and use this tool is given in\n:numref:`aster`.\n\nASTER acquires stereo imagery using two VNIR (visible and near-infrared)\ntelescopes that view the same ground area from different angles:\n\n- **Band3N**: Nadir-looking telescope (views ground from directly above)\n- **Band3B**: Backward-looking telescope (views ground from behind at 27.6 degrees)\n\nBoth bands have 15-meter resolution, enabling stereo reconstruction of terrain\nelevation.\n\nInput formats\n~~~~~~~~~~~~~\n\nThe tool supports two ASTER Level 1A data formats:\n\n- **V003 directory format**: Pre-extracted text files with all metadata,\n  including latitude and longitude grids. This was the original format\n  distributed by NASA.\n\n- **V004 HDF format**: All data stored in HDF4_EOS datasets. The program\n  automatically extracts the required datasets and computes latitude and\n  longitude grids from the orbital geometry. This functionality is available in\n  build 2026-01 or later (:numref:`release`).\n\nThe various plain text files containing satellite positions, sight vectors,\netc., are described in :cite:`abrams2002aster`.\n\nUsage\n~~~~~\n\n::\n\n     aster2asp <input directory> -o <output prefix>\n\nFor V004 HDF format::\n\n     aster2asp <input.hdf> -o <output prefix>\n\nOutput\n~~~~~~\n\nThe tool will apply the existing radiometric corrections to the images, and save\ntwo images with Float32 pixels with names like ``out-Band3N.tif`` and\n``out-Band3B.tif``. It will create approximate RPC camera models in XML format\n(:numref:`rpc`) for the left and right cameras, following\n:cite:`girod2015improvement`, with names of the form ``out-Band3N.xml`` and\n``out-Band3B.xml``.\n\nSee :numref:`aster` for how to run :ref:`parallel_stereo` with these files.\n\nRPC height range\n~~~~~~~~~~~~~~~~\n\nIt is important to note that the tool expects the minimum and maximum simulation\nbox heights (in meters, above the datum) in which to compute the RPC\napproximation. The defaults are 0 and 8000, corresponding to sea level and the\nhighest location on Earth. Narrowing down these numbers (if it is known what\nrange of terrain heights is expected) may result in slightly more accurate\nmodels.\n\nReferences\n~~~~~~~~~~\n\nFor more information about ASTER data formats, see:\n\n- `ASTER User Guide Version 4 <https://lpdaac.usgs.gov/documents/2265/ASTER_User_Guide_V4_pcP80n5.pdf>`_\n- `ASTER L1 Product Specifications <https://lpdaac.usgs.gov/documents/175/ASTER_L1_Product_Specifications.pdf>`_\n\nCommand-line options\n~~~~~~~~~~~~~~~~~~~~\n\n-o, --output-prefix <arg>\n    Specify the output prefix.\n\n--min-height <arg (default: 0)>\n    The minimum height (in meters) above the WGS84 datum of the\n    simulation box in which to compute the RPC approximation.\n\n--max-height <arg (default: 8000)>\n    The maximum height (in meters) above the WGS84 datum of the\n    simulation box in which to compute the RPC approximation.\n\n--num-samples <arg (default: 100)>\n    How many samples to use between the minimum and maximum heights.\n\n--penalty-weight <arg (default: 0.1)>\n    Penalty weight to use to keep the higher-order RPC coefficients\n    small. Higher penalty weight results in smaller such coefficients.\n\n--keep-tmp-dir\n    Keep the temporary directory where HDF data is extracted (for debugging).\n\n--threads <integer (default: 0)>\n    Select the number of threads to use for each process. If 0, use\n    the value in ~/.vwrc.\n\n--cache-size-mb <integer (default = 1024)>\n    Set the system cache size, in MB.\n\n--tile-size <integer (default: 256 256)>\n    Image tile size used for multi-threaded processing.\n\n--no-bigtiff\n    Tell GDAL to not create BigTiff files.\n\n--tif-compress <None|LZW|Deflate|Packbits (default: LZW)>\n    TIFF compression method.\n\n-v, --version\n    Display the version of software.\n\n-h, --help\n    Display this help message.\n"
  },
  {
    "path": "docs/tools/bathy_plane_calc.rst",
    "content": ".. _bathy_plane_calc:\n\nbathy_plane_calc\n----------------\n\nThe ``bathy_plane_calc`` program estimates the surface of a body of\nwater as a plane in a local stereographic projection. This plane can be\nslightly non-horizontal due to imperfections in the positions and\norientations of the cameras that were used to create the input DEM.\n\nFurther context is given in :numref:`bathy_intro`.\n\nThe examples below show the several ways in which the inputs can be specified.\n\n.. _bathy_plane_raw_img:\n\nUsing a camera, a mask, and a DEM\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nPreparation and running the program\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nGiven a multispectral stereo dataset, a DEM obtained from a pair of images for\none of the bands, a camera file from that pair, and a mask for the corresponding\nraw camera image delineating water from land, the water plane can be found as\nfollows::\n\n     bathy_plane_calc --session-type dg --mask mask.tif      \\\n       --camera camera.xml --dem dem.tif --num-samples 10000 \\\n       --outlier-threshold 0.5 --bathy-plane plane.txt       \\\n       --output-inlier-shapefile inliers.shp\n\nSuch a mask can be obtained by thresholding an image where the water\nshows up darker than the land. A good example for this is the band 7\nof Digital Globe multispectral images. The thresholding happens as\nfollows::\n\n    thresh=155\n    image_calc -c \"gt(var_0, $thresh, 1, 0)\" image.tif -o mask.tif\n\nThe mask has values of 1 for land and 0 for water.\n \nThe image must be raw, not projected, and if the image is part of a stereo pair,\nthe corresponding camera for that image must be used. In particular, if the image is\nmultispectral, the camera must be for this dataset, not for the PAN one.\n\nFor the DEM, it is suggested to use the one obtained from PAN images,\nas it is more accurate, or otherwise from the Green band images. \nThe NIR1 band is good for finding the masks, as the water is dark in them,\nbut the DEM with NIR1 images may not be that accurate to use in this context.\n\nIt is important to decide carefully what outlier threshold to use and\nto check the number of resulting inliers. If too few, that may mean\nthat the outlier threshold is too strict. Above, the inliers are saved\nas a shapefile and can be inspected. The inliers should be\nwell-distributed over the entire shoreline.\n\nFor some datasets an outlier threshold of 1.0 works better than 0.5.\n\nFor a stereo pair, this tool can be run with both the left image\nand left camera, then separately for the right image and right camera.\nIdeally the results should be very similar.\n\nThe ``--session-type`` option determines which camera model to\nuse (Digital Globe files have both an exact ``dg`` model and an\napproximate ``rpc`` model).\n\nSee the next section for when it is possible to use the PAN DEM and/or\ndata with alignments applied to them.\n\nRunning this command will produce an output as follows::\n\n    Found 5017 / 13490 inliers.\n    Max distance to the plane (meters): 6.00301\n    Max inlier distance to the plane (meters): 0.499632\n    Mean plane height above datum (meters): -22.2469\n    Writing: plane.txt\n\n.. _bathy_plane_def:\n\nBathy plane definition\n^^^^^^^^^^^^^^^^^^^^^^\n\nThe file ``plane.txt`` having the bathy plane will look like this::\n\n  -0.0090 0.0130 0.9998 22.2460\n  # Latitude and longitude of the local stereographic projection with the WGS_1984 datum:\n  24.5836 -81.7730\n\nThe last line has the center of the local stereographic projection in which\nthe plane is computed, and the first line has the equation of the plane\nin that local coordinate system as::\n\n    a * x + b * y + c * z + d = 0.\n\nThe value of ``c`` is almost 1, hence this plane is almost perfectly\nhorizontal in local coordinates and the value of ``-d/c`` gives its\nheight above the datum (The small deviation from the horizontal may be\ndue to the orientations of the satellites taking the pictures not\nbeing perfectly known.)\n\nHandling adjusted cameras and alignment\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe DEM and camera to be passed to ``bathy_plane_calc`` must be \nin the same coordinate system. \n\nThat is the case, for example, for Digital Globe images, when no\nbundle adjustment or alignment is performed by the user. Without\nthese, given a stereo pair having multispectral and PAN images, the\nDEM obtained with the multispectral images and cameras themselves are\nconsistent with the DEM obtained from the PAN images and corresponding\ncameras, with the only difference being that the multispectral images\nare coarser by a factor of 4, hence the resulting DEM is less\nprecise. Therefore, it is possible to use the PAN DEM instead of\nmultispectral DEM with this tool, while still using the multispectral\ncameras.\n\nGreat care must be used if bundle adjustment or alignment takes place,\nto keep all datasets consistent. If the multispectral images were\nbundle-adjusted, the same adjustments can be used with all\nmultispectral bands. If the DEM above is obtained with bundle-adjusted\nmultispectral images, then ``--bundle-adjust-prefix`` must be passed\nto ``bathy_plane_calc`` above.\n\nIf it is desired to use the PAN DEM with ``bathy_plane_calc``, but\nbundle adjustment or alignment happened, with one or both of the multispectral\nand PAN pairs, the produced multispectral and PAN DEMs will no longer be aligned\nto each other. Thus, these must be individually aligned to a chosen\nreference DEM, the alignments applied to the cameras, as discussed in\n:numref:`ba_pc_align`, and then the updated multispectral camera\nadjustments must be passed to ``bathy_plane_calc`` via\n``--bundle-adjust-prefix``.\n\n.. _bathy_plane_ortho_mask:\n\nUsing a DEM and an orthoimage mask\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nIn this example we assume that there exists a DEM and an orthoimage which is\nconsistent with the DEM and has zero or nodata values on water and positive\nvalues on land. The bathy plane is found as follows::\n\n        bathy_plane_calc                       \\\n          --ortho-mask ortho_mask.tif          \\\n          --dem dem.tif                        \\\n          --outlier-threshold 0.5              \\\n          --bathy-plane plane.txt              \\\n          --output-inlier-shapefile inliers.shp \n\nAn input mask can be created, for example, with ``image_calc``\n(:numref:`image_calc_create_mask`). The orthoimage itself, before masking, can\nbe produced with ``mapproject`` (:numref:`mapproject`).\n\n.. _bathy_plane_shapefile:\n\nUsing a DEM and shapefile\n~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThis example uses a DEM and a shapefile whose vertices sample the water edge as\ninputs::    \n\n     bathy_plane_calc                        \\\n       --shapefile shape.shp                 \\\n       --dem dem.tif                         \\\n       --outlier-threshold 0.5               \\\n       --output-inlier-shapefile inliers.shp \\\n       --bathy-plane plane.txt\n\nAs earlier, it is important to consider carefully what outlier\nthreshold to use, and to examine the number and distribution of\ninliers.\n\nHere it is suggested that the DEM be obtained as in the previous\nexample, from a stereo pair, and the shapefile delineating the\nwater-land interface be drawn on top of an orthoimage created with the\nsame stereo pair. The commands for that can be as follows::\n\n     parallel_stereo -t dg        \\\n        left.tif right.tif        \\\n        left.xml right.xml        \\\n       run/run\n     point2dem --auto-proj-center \\\n       --orthoimage run/run-L.tif \\\n       run/run-PC.tif \n\nSee :numref:`nextsteps` for a discussion about various speed-vs-quality choices\nin stereo, and the ``point2dem`` documentation in :numref:`point2dem`.\n\nHere is an example of a shapefile created on top of an orthoimage:\n\n.. figure:: ../images/examples/bathy/water_outline.png\n   :name: bathy_water_plane_example\n\n   Example of a shapefile whose vertices are at the water-land boundary.\n\n.. _bathy_plane_lonlat:\n\nUsing a DEM and lon-lat values\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThis example is similar to the one using a shapefile, but the\npoints at which the DEM is sampled are provided in a CSV file\nhaving longitude and latitude values::\n\n     bathy_plane_calc                        \\\n       --lon-lat-measurements meas.csv       \\\n       --csv-format \"2:lon 3:lat\"            \\\n       --dem dem.tif                         \\\n       --outlier-threshold 0.5               \\\n       --output-inlier-shapefile inliers.shp \\\n       --bathy-plane plane.txt\n\nThe heights will be looked up in the DEM with bilinear interpolation. The\nlongitude and latitude will be interpreted relative to the DEM georeference.\n\nThe ``--csv-format`` option must be set correctly to identify the columns\nhaving the longitude and latitude. The CSV file can have other columns\nas well (such as an ID), which will be ignored. See \n:numref:`bathy_plane_water_meas` for more details on the CSV format.\n\n\n.. _bathy_plane_water_meas:\n\nUsing water height measurements\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nIn this example, a set of actual measurements of the water surface is\nprovided, as the longitude and latitude (in degrees, in decimal\nformat), and water height above the WGS_1984 datum (ellipsoid\nheights), measured in meters.\n\nIf the water heights are given relative to a geoid (such as EGM2008),\nor some other datum (such as NAD83), those need to be converted to\nWGS_1984.\n\nIt is expected that the measurements are given in a CSV file, with\ncommas or spaces used as separators. A procedure for collecting such\ndata is outlined further down this document\n(:numref:`water_meas_collection`). Here is an sample file, named\n``meas.csv``, for Florida Keys::\n    \n   FID,Lon,Lat,WGS84_m\n   0,-81.59864018,24.58775288,-23.86539\n   1,-81.62377319,24.58180388,-23.84653\n   2,-81.62987019,24.57838388,-23.8864\n   3,-81.6745502,24.56443387,-23.86815\n   4,-81.71131321,24.55574886,-23.86031\n   5,-81.75447022,24.55158486,-23.85464\n   6,-81.75601722,24.55176286,-23.89892\n   7,-81.77999023,24.54843186,-23.89824\n\nAny lines starting with the pound sign (``#``) will be ignored as comments. If\nthe first line does not start this way but does not have valid data it will be\nignored as well. Empty lines will be ignored too.\n\nThe program is called as follows::\n\n    bathy_plane_calc --water-height-measurements meas.csv  \\\n      --csv-format \"2:lon 3:lat 4:height_above_datum\"      \\\n      --outlier-threshold 0.5 --bathy-plane meas_plane.txt \\\n      --output-inlier-shapefile meas_inliers.shp\n\nNote the ``--csv-format`` option, which should be set correctly. As\nspecified here, it will result in columns 2, 3, and 4, being read,\nhaving the longitude, latitude, and height above datum (WGS84\nellipsoid).  The order in which the columns show up is not important,\nas long as ``--csv-format`` correctly reflects that. Any extraneous\ncolumns will be ignored, such as the ID in column 1.\n\nCare must be taken to ensure all the measurements, resulting bathy\nplane, and any DEMs are in the same coordinate system. This is\ndiscussed further in :numref:`bathy_ba_align`.\n\n.. _bathy_plane_mask_samples:\n\nPick a sample set of points at the water-land boundary\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nIn this example, instead of computing the best-fitting plane,\n``bathy_plane_calc`` finds a set of samples (given by ``--num-samples``) at the\nwater-land interface and saves them as a shapefile of points, having\nlongitude-latitude pairs relative to the WGS_1984 datum (ellipsoid). \n\nExample::\n\n     bathy_plane_calc --session-type dg --mask mask.tif    \\\n       --camera camera.xml --dem dem.tif --num-samples 100 \\\n       --mask-boundary-shapefile samples.shp\n\nWhen the input is a mask, a random sample is picked (their number given by\n``--num-samples``). The heights are looked up in the DEM if not already present\nin the input. \n\nThis shapefile may then be passed to some external tool for looking up water\nlevel heights at these points.\n\n.. _water_meas_collection:\n\nAcquisition of water height data\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThis section describes how to acquire a set of water height measurements,\nwhich then could be used to create the best-fit water plane\nfor the purpose of shallow-water bathymetry. An example of using\nthis data is given in :numref:`bathy_plane_water_meas`.\n\nAbsent direct measurements of water surface level at the date and time of\nsatellite image acquisition, it is suggested to use the\ndiscrete tidal zoning information provided by the \n`National Ocean Service \n<https://noaa.maps.arcgis.com/home/webmap/viewer.html?webmap=21d7b399e6fa42e18a72ee30be9aa5c9>`_\n, while for the metadata use the  \n`CO-OPS Discrete Tidal Zoning Map <https://noaa.maps.arcgis.com/home/item.html?id=21d7b399e6fa42e18a72ee30be9aa5c9>`_. An organizational Esri GIS online login is needed to access the data.\n\nEach polygon on the map is a discrete tidal zone, within which NOAA\nconsiders the tide characteristics the same. If the user clicks a\npolygon on the map, a window will pop up and show the control tide\nstation (ControlStn) for that zone, average time corrector\n(AvgTimeCorr, in minutes), and range ratio (RangeRatio). Note that:\n\n - The control station is usually an active water level station of NOAA.\n - ``Average time corrector`` is the time difference (phase difference)\n   between the tide at the tide zone and at the control\n   station. Positive time means the tide level is this many minutes\n   later in the tidal zone polygon than at the control station\n   (and vice versa).\n - ``Range ratio`` is the ratio of tide range at the tidal zone\n   divided by that at the control station.\n\nThe user can access tidal gauge data for\nthe satellite day and time of acquisition at the \n`Center for Operational Oceanographic Products and Services \n<https://opendap.co-ops.nos.noaa.gov/axis/>`_. Choose Verified Data->\nSix Minutes Data->Try me. \n\nThe user can download tide data in any\nreference as long as the value is expressed in meters. This value\nneeds to be transformed into an ellipsoid heights value relative to the WGS_1984 datum. For\nthis the `NOAA VDATUM Java program <https://vdatum.noaa.gov/>`_ can be used,\nor the `NOAA online app <https://www.vdatum.noaa.gov/vdatumweb/>`_. \n\nPlease note that even if lots of points on the land/water limit belong to the\nsame tidal zone polygon, so they will have same elevation value, the\ntransformation in ellipsoid heights with VDATUM will result in\ndifferent ellipsoid heights since VDATUM uses the position of the\npoint in latitude/longitude besides the height of the point.\n\nExport your data to a CSV file with a header containing ID, longitude, latitude, and\nWGS_1984 height measurements.\n\nCommand-line options for bathy_plane_calc\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n--shapefile <filename>\n    The shapefile with vertices whose coordinates will be looked up in\n    the DEM with bilinear interpolation.\n\n--dem <filename>\n    The DEM to use.\n\n--mask <string (default: \"\")>\n    An input mask, created from a raw camera image and hence having the\n    same dimensions, with values of 1 on land and 0 on water, or\n    positive values on land and nodata values on water. The larger \n    of the nodata value and zero is used as the water value. The\n    heights will be looked up in the DEM with bilinear interpolation.\n\n--camera <string (default: \"\")>\n    The camera file to use with the mask.\n\n--bathy-plane arg                     \n    The output file storing the computed plane (:numref:`bathy_plane_def`).\n\n--output-inlier-shapefile <string (default: \"\")>\n    If specified, save at this location the shape file with the inlier\n    vertices.\n\n--output-outlier-shapefile <string (default: \"\")>\n    If specified, save at this location the shape file with the outlier\n    vertices.\n\n--bundle-adjust-prefix <string (default: \"\")>\n    Use the camera adjustment at this output prefix, if the cameras\n    changed based on bundle adjustment or alignment.\n\n-t, --session-type <string (default: \"\")>\n    Select the stereo session type to use for processing. Usually\n    the program can select this automatically by the file extension, \n    except for xml cameras. See :numref:`ps_options` for\n    options.\n\n--outlier-threshold <double>\n    A value, in meters, to determine the distance from a sampled point\n    on the DEM to the best-fit plane to determine if it will be marked as \n    outlier and not included in the calculation of that plane. The default\n    is 0.5. Its value should be roughly the expected vertical uncertainty\n    of the DEM.\n\n--num-ransac-iterations <integer>\n    Number of RANSAC iterations to use to find the best-fitting plane.\n    The default is 1000.\n\n--num-samples <integer>\n    Number of samples to pick at the water-land interface if using a\n    mask. The default is 10000.\n\n--ortho-mask <filename>\n    An input mask, that is georeferenced and aligned with the DEM, with\n    positive values on land and 0 or nodata values on water. The larger\n    of the nodata value and zero is used as the water value.\n\n--lon-lat-measurements <string (default: \"\")>\n    Use this CSV file having longitude and latitude measurements for\n    the water surface. The heights will be looked up in the DEM with\n    bilinear interpolation. The option --csv-format must be used.\n\n--water-height-measurements <string (default: \"\")>\n    Use this CSV file having longitude, latitude, and height\n    measurements for the water surface, in degrees and meters,\n    respectively, relative to the WGS84 datum. The option --csv-format\n    must be used.\n\n--csv-format <string (default: \"\")>\n    Specify the format of the CSV file having water height\n    measurements or longitude and latitude values. The format should\n    have a list of entries with syntax column_index:column_type\n    (indices start from 1). Example: '2:lon 3:lat 4:height_above_datum'.\n    Note that this option must be enclosed in quotes so it is\n    parsed correctly by the shell.\n\n--mask-boundary-shapefile <string (default: \"\")>\n    If specified, save the extracted points (before RANSAC) to this\n    shapefile and exit. When the input is a mask, a random sample is\n    picked (their number given by ``--num-samples``). The heights are\n    looked up in the DEM if not already present in the input.\n    See an example in :numref:`bathy_plane_mask_samples`.\n\n--save-shapefiles-as-polygons\n    Save the inlier and outlier shapefiles as polygons, rather than\n    made of discrete vertices. May be more convenient for processing\n    in a GIS tool.\n\n--dem-minus-plane <string (default: \"\")>\n    If specified, subtract from the input DEM the best-fit plane and save the \n    obtained DEM to this GeoTiff file.\n\n--threads <integer (default: 0)>\n    Select the number of threads to use for each process. If 0, use\n    the value in ~/.vwrc.\n \n--cache-size-mb <integer (default = 1024)>\n    Set the system cache size, in MB.\n\n--tile-size <integer (default: 256 256)>\n    Image tile size used for multi-threaded processing.\n\n--no-bigtiff\n    Tell GDAL to not create BigTiff files.\n\n--tif-compress <None|LZW|Deflate|Packbits (default: LZW)>\n    TIFF compression method.\n\n-v, --version\n    Display the version of software.\n\n-h, --help\n    Display this help message.\n\n.. |times| unicode:: U+00D7 .. MULTIPLICATION SIGN\n\n"
  },
  {
    "path": "docs/tools/bathy_threshold_calc.rst",
    "content": ".. _bathy_threshold_calc:\n\nbathy_threshold_calc.py\n-----------------------\n\nThe ``bathy_threshold_calc.py`` program takes as input a\nsingle-channel image, for example, band 7 of a WorldView multispectral\nimage, and computes the threshold separating the water and land\npixels.\n\nSee :numref:`bathy_thresh` for further context, and a sample\noutput and graph.\n\nExample usage\n~~~~~~~~~~~~~\n\nInstall the ``bathy`` conda environment as described in\n:numref:`bathy_threshold_dependencies` below.\n\nThis program can be invoked as:\n\n::\n\n    ~/miniconda3/envs/bathy/bin/python $(which bathy_threshold_calc.py) \\\n        --image image.tif --num-samples 1000000\n\nHere it is assumed that ASP's ``bin`` directory is in the path, otherwise\nthe full path to this Python script must be specified above.\n\n.. _bathy_threshold_dependencies:\n\nDependencies\n~~~~~~~~~~~~\n\nThis tool needs Python 3 and some additional Python packages to be installed with \n``conda``. \n\nConda can be obtained from \n\n    https://docs.conda.io/en/latest/miniconda.html\n\nRun::\n\n    ./Miniconda3-latest-Linux-x86_64.sh\n\non Linux, and the appropriate version on OSX (this script needs to be\nmade executable first). Use the suggested::\n\n    $HOME/miniconda3\n\ndirectory for installation. \n\nActivate conda. The needed packages can be installed\nas follows:\n\n::\n\n     conda create --name bathy -c conda-forge python=3.6 gdal\n     conda activate bathy\n     conda install -c conda-forge numpy scipy matplotlib\n\nCommand-line options for bathy_threshold_calc.py\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n-h, --help\n    Display the help message.\n\n--image <filename>\n    The single-channel image to use to find the water-land threshold.\n\n--num-samples <integer (default: 1000000)>\n    The number of samples to pick from the image (more samples will\n    result in more accuracy but will be slower).\n\n--no-plot\n    Do not show the plot.\n\n.. |times| unicode:: U+00D7 .. MULTIPLICATION SIGN\n"
  },
  {
    "path": "docs/tools/bundle_adjust.rst",
    "content": ".. _bundle_adjust:\n\nbundle_adjust\n-------------\n\nThe ``bundle_adjust`` program performs bundle adjustment on a given\nset of images and cameras. An introduction to bundle adjustment, and\nsome advanced usage, including solving for intrinsics, can be found in\n:numref:`bundle_adjustment`. \n\nIf it is desired to process a large number of images, consider using\n``parallel_bundle_adjust`` (:numref:`parallel_bundle_adjust`).\n\nThis tool solves a least squares problem (:numref:`how_ba_works`). It\nuses Google's `Ceres Solver <http://ceres-solver.org/>`_.\n\nUsage::\n\n     bundle_adjust <images> <cameras> <optional ground control points> \\\n       -o <output prefix> [options]\n\n.. _ba_examples:\n\nExamples\n~~~~~~~~\n\nISIS cameras \n^^^^^^^^^^^^\n\nSee :numref:`moc_tutorial` for an introduction to these cameras.\n\n::\n\n     bundle_adjust --camera-weight 0 \\\n       --tri-weight 0.1              \\\n       --tri-robust-threshold 0.1    \\\n       file1.cub file2.cub file3.cub \\\n       -o run_ba/run\n\nThe above choices for camera weight and triangulation weight have in the\nmeantime become the defaults. These are helpful in preventing the cameras from\ndrifting too far from initial locations.\n\nHow to use the adjusted cameras is shown in :numref:`ba_use`.\n\n.. _maxar_gcp:\n\nMaxar Earth cameras and GCP\n^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nHere we use Maxar (DigitalGlobe) Earth data (:numref:`dg_tutorial`) and ground\ncontrol points (:numref:`bagcp`)::\n\n    bundle_adjust                \\\n      --camera-weight 0          \\\n      --tri-weight 0.1           \\\n      --num-passes 2             \\\n      --datum WGS_1984           \\\n      file1.tif file2.tif        \\\n      file1.xml file2.xml        \\\n      gcp1.gcp gcp2.gcp gcp3.gcp \\\n      --fix-gcp-xyz              \\\n      -o run_ba/run \n\nHow to use the adjusted cameras is shown in :numref:`ba_use`.\n\nUsing the proper value for ``--datum`` is very important, otherwise the\nlongitude-latitude-height values in the GCP files will not be interpreted\ncorrectly.\n\nThere can be more than one GCP file. The option ``--fix-gcp-xyz`` fixes the GCP\ncoordinates during optimization. This is useful when the GCP are very accurate.\nOtherwise set per-GCP sigma.\n\nThe residuals for the GCP will be printed at the end of the\n``final_residuals_pointmap.csv`` file, and flagged with the string ``# GCP``\n(:numref:`ba_err_per_point`).\n\nWe invoked the tool with two passes, which also enables removal\nof outliers (see option ``--remove-outliers-params``, :numref:`ba_options`).\n\n.. _ba_rpc:\n\nRPC cameras and image lists\n^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nExamples for RPC cameras (:numref:`rpc`). With the cameras stored separately::\n\n    bundle_adjust -t rpc left.tif right.tif left.xml right.xml \\\n      -o run_ba/run\n\nWith the cameras embedded in the images::\n\n    bundle_adjust -t rpc left.tif right.tif -o run_ba/run\n\nHow to use the adjusted cameras is shown in :numref:`ba_use`. How to produce RPC\ncameras with the adjustments applied to them is discussed in\n:numref:`rpc_and_ba`.\n\nThe images can be also passed in via ``--image-list`` and cameras with \n``--camera-list``. When the cameras are embedded in the images, the\n``--camera-list`` option accepts the image files instead.\n\nPinhole cameras\n^^^^^^^^^^^^^^^\n\n::\n\n     bundle_adjust -t nadirpinhole \\\n       --inline-adjustments        \\\n        --camera-weight 0          \\\n        --tri-weight 0.1           \\\n        --tri-robust-threshold 0.1 \\\n        --datum WGS_1984           \\\n        file1.JPG file2.JPG        \\\n        file1.tsai file2.tsai      \\\n        -o run_ba/run\n\nSee :numref:`pinholemodels` for the pinhole camera model format.\n\nHere we assumed that the cameras point towards planet's surface and used the\n``nadirpinhole`` session. If this assumption is not true, one should use the\n``pinhole`` session or the ``--no-datum`` option.\n\nThe value of ``--datum`` should reflect the planetary body being imaged. If not\nset, some functionality will not be available. It will be auto-guessed, either\nbased on camera files, input DEM, or camera center (the latter only for Earth,\nMars, Moon).\n\nThe option ``--inline-adjustments`` will save to disk the optimized cameras\nwith adjustments already applied to them. These can be passed directly to\n``parallel_stereo``, without using the original cameras and the adjustments as in\n:numref:`ba_use`.\n\nCSM cameras\n^^^^^^^^^^^\n\n::\n\n     bundle_adjust                \\\n       file1.cub file2.cub        \\\n       file1.json file2.json      \\\n       -t csm                     \\\n       --camera-weight 0          \\\n       --tri-weight 0.1           \\\n       --tri-robust-threshold 0.1 \\\n       -o run_ba/run\n\nCSM cameras (:numref:`csm`) can be stored in .json files or in .cub files. After\nbundle adjustment, updated .json camera files will be written to disk, in\naddition to .adjust files. See :numref:`csm_state` and :numref:`embedded_csm`.\n\nLater, use either the original cameras with the computed adjustments\n(:numref:`ba_use`), or the updated cameras without the adjustments.\n\nThe datum will be read from the camera files.\n\n.. _ba_bathy:\n\nBathymetry correction\n^^^^^^^^^^^^^^^^^^^^^\n\nWhen working with underwater terrain, bundle adjustment can model light\nrefraction through water for triangulation of ground points and ground-to-image\noperations.\n\nExample::\n\n    echo left_bathy_mask.tif right_bathy_mask.tif > mask_list.txt\n    bundle_adjust                      \\\n      left_image.tif right_image.tif   \\\n      left_camera.xml right_camera.xml \\\n      --bathy-mask-list mask_list.txt  \\\n      --refraction-index 1.333         \\\n      --bathy-plane bathy_plane.txt    \\\n      -o run/run\n\nThe mask files must be in a list to distinguish them from the image files. Each\ninput image has a corresponding bathy mask, and these entities must be in the\nsame order (and also with the cameras). Lists can also be used for the input\nimages and cameras, via ``--image-list`` and ``--camera-list``.\n\nThe preparation of bathy masks, the bathy plane (or more than one), and the\nrefraction index are as for stereo processing (:numref:`bathy_intro`). The\noptions invoked above are described in :numref:`ba_options`.\n\nInspect carefully the produced report files (:numref:`ba_out_files`).\n\nConsider using the option ``--camera-position-uncertainty`` for finer control.\nAlso, the bathy plane needs to be recreated with the bundle-adjusted cameras, if\nusing those new cameras for stereo (:numref:`bathy_plane_calc`). Otherwise a tilt\nmay be present with the old plane.\n\nOther cameras\n^^^^^^^^^^^^^\n\nBundle adjustment supports many other camera models. See :numref:`examples`\nfor the various sensor types.\n\n.. _ba_use:\n\nUse of the results\n~~~~~~~~~~~~~~~~~~\n\nThis program will write the adjustments to the cameras as ``*.adjust`` files\nat a location given by the specified output prefix (:numref:`adjust_files`).\n\nFor ``parallel_stereo`` to use the adjusted cameras, it should not be passed in\nthe ``.adjust`` files. Rather, it should be invoked with the original cameras and\nthe ``bundle_adjust`` output prefix via the option ``--bundle-adjust-prefix``.\nFor example::\n\n     parallel_stereo file1.cub file2.cub run_stereo/run \\\n       --bundle-adjust-prefix run_ba/run\n\nThe same option can be used with mapprojection (:numref:`mapproject`) and some\nother tools. \n\nExample (for .cub files that contain both the image and the camera):: \n\n    mapproject --bundle-adjust-prefix run_ba/run \\\n      input-DEM.tif input.cub output.tif \n\nExample (for cameras in .xml format, so the image and camera are in separate\nfiles):: \n\n    mapproject --bundle-adjust-prefix run_ba/run \\\n      input-DEM.tif image.tif camera.xml mapped_image.tif\n\nFor Pinhole (:numref:`pinholemodels`) and OpticalBar (:numref:`panoramic`)\ncameras, if the ``--inline-adjustments`` option is used, the tool will save to\ndisk copies of the input cameras with adjustments already applied to them. These\noutput cameras can then be passed directly to ``parallel_stereo``::\n\n    parallel_stereo                               \\\n      file1.JPG file2.JPG                         \\\n      run_ba/run-file1.tsai run_ba/run-file2.tsai \\\n      run_stereo/run\n\nWhen cameras are of CSM type (:numref:`csm`), self-contained optimized cameras\nwill be written to disk (:numref:`csm_state`). These cameras can also be used\nas-is, so without the ``--bundle-adjust-prefix`` option. If the CSM cameras are\nappended to the .cub files (:numref:`embedded_csm`), the updated .cub files can\nalso be used as-is.\n\nTo pass adjustments to ``bundle_adjust`` itself, use the option\n``--input-adjustments-prefix``.\n\nCamera adjustments and applying a transform\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe ``bundle_adjust`` program can read camera adjustments from a previous run,\nvia ``--input-adjustments-prefix string``. Their format is described in\n:numref:`adjust_files`. \n\nIt can also apply to the input cameras a transform as output by ``pc_align``,\nvia ``--initial-transform string``. This is useful if a DEM produced by ASP was\naligned to a ground truth, and it is desired to apply the same alignment to the\ncameras that were used to create that DEM. \n\nThe initial transform can have a rotation, translation, and scale, and it is\napplied after the input adjustments are read, if those are present. An example\nis shown in (:numref:`ba_pc_align`). \n\n.. _ba_validation:\n\nValidation\n~~~~~~~~~~\n\nThe first report file to check after a run concludes is::\n\n    {output-prefix}-final_residuals_stats.txt\n\n(:numref:`ba_errors_per_camera`). It will have the mean and median pixel\nreprojection error for each camera, and their count.\n\nThe errors should be under 1 pixel, ideally under 0.5 pixels. The count must\nbe at least a dozen, and ideally more. Otherwise bundle adjustment did\nnot work well. \n\nA fine-grained metric is the *triangulation error*, computed densely across the\nimages with stereo (:numref:`triangulation_error`). A systematic pattern in this\nerror may suggest the need to refine the camera intrinsics\n(:numref:`floatingintrinsics`).\n\nOther report files are described in :numref:`ba_out_files`.\n\nHandling failures\n~~~~~~~~~~~~~~~~~\n\nThis program will fail if the illumination changes too much between images (see\nalso :numref:`sfs_azimuth`).\n\nVarious approaches of creation of interest point matches are presented in \n:numref:`ba_ip` (the existing ones should be deleted first). Use ``stereo_gui``\n(:numref:`stereo_gui_pairwise_matches`) to inspect the matches.\n\nTo make the program work harder at reducing big pixel reprojection errors, the\n``--robust-threshold`` can be increased, perhaps to 2.0. This may result in the \nsmallest reprojection errors increasing. \n\n.. _ba_constraints:\n\nConstraints\n~~~~~~~~~~~\n\nThe primary goal of bundle adjustment is to minimize the pixel reprojection\nerrors, so that the cameras are consistent with each other and with triangulated\npoints. \n\nTo ensure the cameras and triangulated points do not drift, ground constraints\nare set by default. They are meant to be rather soft, to not prevent the\nreduction in reprojection errors.\n\n.. _ba_ground_constraints:\n\nGround constraints\n^^^^^^^^^^^^^^^^^^\n\nThe option ``--tri-weight`` constrains how much the triangulated points move.\nThis is a soft constraint and given less priority than reducing the pixel\nreprojection errors in the cameras. Its default value is 0.1. An example is in\n:numref:`skysat_stereo`.\n\nThis constraint adapts appropriately to the number of interest points and the\nlocal average ground sample distance.\n\nThe measured distances between the initial and final triangulated points are\nsaved to a file (:numref:`ba_tri_offsets`) and should be inspected. Also check\nthe pixel reprojection errors per camera (:numref:`ba_errors_per_camera`).\n\nThe implementation is as follows. The distances between initially triangulated\npoints and those being optimized points are computed, then divided by the local\naveraged ground sample distance (GSD) (to make them into pixel units, like the\nreprojection errors). These are multiplied by ``--tri-weight``. Then, the robust\nthreshold given by ``--tri-robust-threshold`` is applied, with a value of 0.1,\nto attenuate the big residuals. This threshold is smaller than the pixel\nreprojection error threshold (``--robust-threshold``), whose default value is\n0.5, to ensure that this constraint does not prevent the optimization from\nminimizing the pixel reprojection errors.\n\nTriangulated points that are constrained via a DEM (option\n``--heights-from-dem``, :numref:`heights_from_dem`), that is, those that are\nclose to a valid portion of this DEM, are not affected by the triangulation\nconstraint.\n\nGCP can be used as well (:numref:`bagcp`).\n\n.. _ba_cam_constraints:\n\nCamera constraints\n^^^^^^^^^^^^^^^^^^\n\nThe option ``--camera-position-uncertainty`` constrains the camera position\nhorizontally and vertically, with given uncertainties, in the local\nNorth-East-Down coordinate system of each camera. \n\nThe input to this option is a file with one line per image. Each line has the\nimage name, horizontal uncertainty, and the vertical one, separated by spaces.\nExample::\n\n    image1.tif 5.0 10.0\n    image2.tif 3.0 2.0\n\nAll quantities are measured in meters. \n\nTo have the same uncertainties for all cameras, pass instead of a file name two\nvalues separated by a comma (no spaces). Example: ``5.0,10.0`` (post 10/2025 build).\n\nIt is suggested to overestimate these uncertainties. *A strict constraint can prevent\nthe problem from converging to a good solution.*\n\nIt is suggested to examine the camera change report\n(:numref:`ba_camera_offsets`) and pixel reprojection report\n(:numref:`ba_errors_per_camera`) to see the effect of this constraint. \n\nIn the latest build (:numref:`release`, post 10/2025), the implementation of\nthis was changed. A sum of squares of quantities such as::\n\n  (curr_position - init_position) / uncertainty\n  \nis added to the cost function (:numref:`how_ba_works`) for each camera. The\nhorizontal and vertical components result in separate terms.\n  \nThis performs better than prior alternatives, but the camera motion may be perhaps\n1-10 times more than expected. \n\nFor the jitter solver (:numref:`jitter_solve`) and a linescan camera, such a\nterm exists for each position sample in the camera, and then each is divided\n(after squaring) by the number of samples.\n\nThe advanced option ``--camera-position-uncertainty-power`` can be used to change\nthe power to which the normalized position difference is raised before being\nadded to the cost function. The default value is 2. A value such as 4 may result \nin stricter enforcement of this constraint, but may also make the problem harder to\nsolve. The default behavior is preferred.\n\nIt is suggested to avoid the older options ``--camera-position-weight``\nand ``--rotation-weight``, which will be removed in the future. \n\nUse cases\n~~~~~~~~~\n\nLarge-scale bundle adjustment\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nBundle adjustment has been tested extensively and used successfully with\nthousands of frame (pinhole) cameras and with close to 1000 linescan cameras. \n\nLarge-scale usage of bundle adjustment is illustrated in the SkySat\nprocessing example (:numref:`skysat`), with many Pinhole cameras, and\nwith a large number of linescan Lunar images with variable illumination\n(:numref:`sfs-lola`). \n\nAttention to choices of parameters and solid validation is needed in\nsuch cases. The tool creates report files with various metrics\nthat can help judge how good the solution is (:numref:`ba_out_files`).\n\nSee also the related jitter-solving program (:numref:`jitter_solve`),\nand the rig calibrator (:numref:`rig_calibrator`).\n\nSolving for intrinsics\n^^^^^^^^^^^^^^^^^^^^^^\n\nSee :numref:`bundle_adjustment` for how to solve for intrinsics. In particular,\nsee :numref:`kaguya_ba` for the case when there exist several\nsensors, each with its own intrinsics parameters.\n\n.. _ba_ip:\n\nWell-distributed interest points\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nWhen different parts of the image have different properties, such as rock vs snow,\nadditional work may be needed to ensure interest points are created somewhat\nuniformly. For that, use the option ``--matches-per-tile``::\n\n    bundle_adjust image1.tif image2.tif       \\\n        image1.tsai image2.tsai               \\\n        --ip-per-tile 300                     \\\n        --matches-per-tile 100                \\\n        --max-pairwise-matches 20000          \\\n        --camera-weight 0 --tri-weight 0.1    \\\n        --remove-outliers-params '75 3 10 10' \\\n        -o run_ba/run \n\nFor very large images, the number of interest points and matches per tile (whose\nsize is 1024 pixels on the side) should be decreased from the above. \n\nIf the images have very different perspectives, it is suggested to create the\ninterest points based on mapprojected images (:numref:`mapip`.)\n\nUniformly distributed interest points can be produced from stereo disparity. See\n:numref:`custom_ip` for more details.\n\nThis program supports plain-text match files (:numref:`txt_match`).\n\nControlling where interest points are placed\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nA custom image or mask can be used to define a region where interest points\nare created (:numref:`limit_ip`). \n\nUsing mapprojected images\n^^^^^^^^^^^^^^^^^^^^^^^^^\n\nFor images that have very large variation in elevation, it is suggested to use\nbundle adjustment with the option ``--mapprojected-data`` for creating interest\npoint matches. An example is given in :numref:`mapip`.\n\n.. _how_ba_works:\n\nHow bundle adjustment works\n~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nFeatures are matched across images. Rays are cast though matching\nfeatures using the cameras, and triangulation happens, creating\npoints on the ground. More than two rays can meet at one triangulated\npoint, if a feature was successfully identified in more than two\nimages. The triangulated point is projected back in the cameras. The\nsum of squares of differences (also called residuals) between the\npixel coordinates of the features and the locations where the\nprojections in the cameras occur is minimized. To not let outliers\ndominate, a robust \"loss\" function is applied to each error term to\nattenuate the residuals if they are too big. \nSee the `Google Ceres <http://ceres-solver.org/nnls_modeling.html>`_\ndocumentation on robust cost functions.\n\nThe option ``--cost-function`` controls the type of loss function, and\n``--robust-threshold`` option is used to decide at which value of the\nresiduals the attenuation starts to work. The option\n``--min-triangulation-angle`` is used to eliminate triangulated points\nfor which all the rays converging to it are too close to being\nparallel. Such rays make the problem less well-behaved. The option\n``--remove-outliers-params`` is used to filter outliers if more than\none optimization pass is used. See :numref:`ba_options` for more\noptions. See :numref:`bundle_adjustment` for a longer explanation.\n\nThe variables of optimization are the camera positions and orientations, and the\ntriangulated points on the ground. The intrinsics can be optimized as well,\neither as a single set for all cameras or individually\n(:numref:`floatingintrinsics`), or per group of cameras (:numref:`kaguya_ba`).\n\nTriangulated points can be constrained via ``--tri-weight``\n(:numref:`ba_ground_constraints`) or ``--heights-from-dem`` (with a\n*well-aligned* prior DEM, :numref:`heights_from_dem`). The camera positions can\nbe constrained as well (:numref:`ba_cam_constraints`).\n\nGround control points can be employed to incorporate measurements as part of the\nconstraints (:numref:`bagcp`).\n\n.. _bagcp:\n\nGround control points\n~~~~~~~~~~~~~~~~~~~~~\n\nGround control points consist of known points on the ground, together with their\npixel locations in one or more images. Their use is to refine, initialize, or\ntransform to desired coordinates the camera poses (:numref:`ba_use_gcp`).\n\nGCP can be created with ``stereo_gui`` (:numref:`creatinggcp`), ``gcp_gen``\n(:numref:`gcp_gen`),  and ``dem2gcp`` (:numref:`dem2gcp`). They can \nbe inspected with ``stereo_gui`` (:numref:`stereo_gui_vwip_gcp`).\n\nGCP file format\n^^^^^^^^^^^^^^^\n\nA GCP file must end with a ``.gcp`` extension, and contain one ground\ncontrol point per line. Each line must have the following fields:\n\n-  ground control point id (integer)\n\n-  latitude (in degrees)\n\n-  longitude (in degrees)\n\n-  height above datum (in meters), with the datum itself specified\n   separately, via ``--datum``\n\n-  :math:`x, y, z` standard deviations (*sigma* values, three positive floating\n   point numbers, smaller values suggest more reliable measurements, measured in\n   meters)\n\nOn the same line, for each image in which the ground control point is\nvisible there should be:\n\n-  image file name\n\n-  column index in image (float, starting from 0)\n\n-  row index in image (float, starting from 0)\n\n-  column and row standard deviations (also called *sigma* values, two positive\n   floating point numbers, smaller values suggest more reliable measurements, in\n   units of pixel)\n\nThe fields can be separated by spaces or commas. Here is a sample\nrepresentation of a ground control point measurement::\n\n   5 23.7 160.1 427.1 1.0 1.0 1.0 image1.tif 124.5 19.7 1.0 1.0 image2.tif 254.3 73.9 1.0 1.0\n\n.. _ba_use_gcp:\n\nUses of GCP\n^^^^^^^^^^^\n\nOne or more ``.gcp`` files can be passed to ``bundle_adjust`` as shown in\n:numref:`ba_examples`, together with one or more images and cameras, to refine the\ncamera poses.  The option ``--datum`` must be set correctly to interpret the GCP.\n\nGCP can also be employed to initialize the cameras (:numref:`camera_solve_gcp`), or\nto transform them as a group, with the ``bundle_adjust`` options\n``--transform-cameras-with-shared-gcp`` and ``--transform-cameras-using-gcp``. \nFor use with SfM, see :numref:`sfm_world_coords`.\n\nThe option ``--fix-gcp-xyz`` fixes the GCP coordinates during optimization. This\nis useful when the GCP are very accurate. Otherwise set per-GCP sigma.\n\nThe option ``--save-cnet-as-gcp`` can be invoked to save the optimized control\nnetwork in the GCP format, after outlier filtering. Any input GCP are included\nin the output. This can be useful for inspecting the final triangulated points.\nThe xyz sigma is 1 meter for regular non-GCP triangulated points and the value of\n``--heights-from-dem-uncertainty`` for DEM-constrained points. See also\n``--max-gcp-reproj-err`` for filtering GCP by reprojection error.\n\nWhen the ``--use-lon-lat-height-gcp-error`` flag is set, the three\nstandard deviations are interpreted as applying not to :math:`x, y, z`\nbut to latitude, longitude, and height above datum (in this order).\nHence, if the latitude and longitude are known accurately, while the\nheight less so, the third standard deviation can be set to something\nlarger.\n\nSee :numref:`ba_out_files` for the output files, including for\nmore details about reports for GCP files.\n\nEffect on optimization\n^^^^^^^^^^^^^^^^^^^^^^\n\nEach ground control point will result in the following terms being\nadded to the cost function:\n\n.. math::\n\n    \\frac{(x-x_0)^2}{\\sigma_x^2} + \\frac{(y-y_0)^2}{\\sigma_y^2} + \\frac{(z-z_0)^2}{\\sigma_z^2}\n\nHere, :math:`(x_0, y_0, z_0)` is the input GCP, :math:`(x, y, z)` is its version\nbeing optimized, and the sigma values are the standard deviations from\nabove. No robust cost function is applied to these error terms (see below). \n\nNote that the cost function normally contains sums of squares of\npixel differences (:numref:`how_ba_works`), \nwhile these terms are dimensionless, if the\nnumerators and denominators are assumed to be in meters. Care should\nbe taken that these terms not be allowed to dominate the cost function\nat the expense of other terms.\n\nThe sums of squares of differences between projections into the cameras of the\nGCP and the pixel values specified in the GCP file will be added to the bundle\nadjustment cost function, with each difference being divided by the\ncorresponding pixel standard deviation (sigma). To prevent these from dominating\nthe problem, each such error has a robust cost function applied to it, just as\ndone for the regular reprojection errors without GCP. See the `Google Ceres\n<http://ceres-solver.org/nnls_modeling.html>`_ documentation on robust cost\nfunctions. See also ``--cost-function`` and ``--robust-threshold`` option\ndescriptions (:numref:`ba_options`).\n\nThe GCP pixel reprojection errors will be saved as the last lines of the report\nfiles ending in ``pointmap.csv``. Differences between initial and optimized GCP\nwill be printed in a report file as well. See :numref:`ba_out_files` for more\ndetails.\n\nTo not optimize the GCP, use the option ``--fix-gcp-xyz``.\n\n.. _control_network:\n\nControl network\n~~~~~~~~~~~~~~~\n\n.. _ba_match_files:\n\nMatch files\n^^^^^^^^^^^\n\nBy default, ``bundle_adjust`` will create interest point matches between all\npairs of images (see also ``--auto-overlap-params``). These matches are\nassembled into a *control network*, in which a triangulated point is associated\nwith features in two or more images. The match files are saved with the\nspecified output prefix and a ``.match`` extension. \n\nThe naming convention for the match files is::\n\n    <output prefix>-<image1>__<image2>.match\n  \nwhere the image names are without the directory name and extension. Excessively\nlong image names will be truncated.  For example, for two images named\n``input/image1.tif`` and ``input/image2.tif``, and given the output prefix\n``out/run``, the match file will be::\n\n    out/run-image1__image2.match\n\nIf such files have been already produced by a different invocation of\n``bundle_adjust`` or by other means, they can be loaded by ``bundle_adjust``,\n``parallel_stereo`` and ``jitter_solve``, with the option\n``--match-files-prefix``. In this example, the value of this option would be\n``out/run``.\n\nPlain-text match files are supported as well (:numref:`txt_match`).\n\nBundle adjustment also produces outlier-filtered versions of these files, that\nend with ``-clean.match``. These can be used with the option\n``--clean-match-files-prefix``. The option ``--remove-outliers-params`` controls\nthe outlier filtering.\n\nAny such files can be inspected with ``stereo_gui``\n(:numref:`stereo_gui_pairwise_matches`) and converted to text with \n``parse_match_file.py`` (:numref:`parse_match_file`) or ``ipmatch`` \n(:numref:`ipmatch_convert`).\n\n.. _jigsaw_cnet:\n\nISIS control network\n^^^^^^^^^^^^^^^^^^^^\n\nThis program can read and write ISIS ``jigsaw`` binary control networks. Example::\n\n    bundle_adjust               \\\n    --image-list image_list.txt \\\n    --isis-cnet controlNet.net  \\\n    -o ba/run\n\nThis format makes it possible to handle a very large number of control points. \n\nIt is very important that the images in the list be in the order as expected in\nthe control network. A copy of this list will be saved, for the record, in the \noutput directory.\n\nIn this mode, ``bundle_adjust`` will also write the updated control network in\nthe ISIS format, with the name ``<output prefix>.net`` (instead of match files). \n\nIf GCP are provided via a .gcp file (:numref:`bagcp`), these will be added to\nthe optimization and to the output control network.\n\nThe option  ``--output-cnet-type`` explicitly sets the output format for\ninterest point matches. This allows for the input and output formats to be\ndifferent. \n\nThe ``stereo_gui`` program (:numref:`stereo_gui_isis_cnet`) can visualize\nsuch a control network file. \n\nSee :numref:`jigsaw_cnet_details` for more technical details. See also ASP's\n``jigsaw`` tutorial (:numref:`jigsaw`).\n\n.. _ba_nvm:\n\nNVM format\n^^^^^^^^^^\n\nThe ``bundle_adjust`` program can read and write the `VisualSfM NVM format\n<http://ccwu.me/vsfm/doc.html#nvm>`_ for a control network. This helps in\ninterfacing with ``rig_calibrator`` (:numref:`rc_ba`) and\n``theia_sfm`` (:numref:`theia_sfm`). Usage::\n\n    bundle_adjust --nvm input.nvm \\\n      --image-list images.txt     \\\n      --camera-list cameras.txt   \\\n      --inline-adjustments        \\\n      -o ba/run\n\nThis will write the file ``ba/run.nvm`` having the inlier interest point matches.\n\nThe NVM file assumes that the interest points are shifted relative to the optical\ncenter of each camera. The optical centers are kept in a separate file ending with\n``_offsets.txt``.\n\nThe NVM format can be used with any cameras supported by ASP. To export to this\nformat, use ``--output-cnet-type nvm``. Unless this option is explicitly set,\nthe output format is the same as the input format.\n\nIf the cameras are of Pinhole (:numref:`pinholemodels`) or CSM Frame\n(:numref:`csm_frame`) type, the camera poses will be read from the NVM file as\nwell, and the optimized poses will be saved to such a file, unless invoked with\n``--no-poses-from-nvm``. The optical centers will be read and written as well. The\ninput cameras must still be provided as above, however, so that the intrinsics\ncan be read. With the option ``--inline-adjustments``, the updated Pinhole\ncamera files will be written separately as well.\n\nFor all other types, no camera pose information will be read or written to the\nNVM file, and the optical centers will be set to half the image dimensions.\n\n.. _ba_out_files:\n\nOutput files\n~~~~~~~~~~~~\n\n.. _ba_errors_per_camera:\n\nReprojection errors per camera\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe initial and final mean and median pixel reprojection error (distance from\neach interest point and camera projection of the triangulated point) for each\ncamera, and their count, are written to::\n\n  {output-prefix}-initial_residuals_stats.txt\n  {output-prefix}-final_residuals_stats.txt\n \nIt is very important to ensure all cameras have a small final reprojection\nerror, ideally under 1 pixel, as otherwise this means that the cameras are not\nwell-registered to each other, or that systematic effects exist, such as\nuncorrected lens distortion.\n\nSee :numref:`ba_mapproj_dem` for an analogous report at the ground level\nand :numref:`ba_err_per_point` for finer-grained reporting.\n\n.. _ba_camera_offsets:\n\nCamera position changes\n^^^^^^^^^^^^^^^^^^^^^^^\n\nIf the ``--datum`` option is specified or auto-guessed based on images\nand cameras, the file::\n\n    {output-prefix}-camera_offsets.txt\n\nwill be written. It will have, for each camera, the horizontal and vertical\ncomponent of the difference in camera center before and after optimization, in\nmeters. This is after applying any initial adjustments or transform to the\ncameras (:numref:`ba_pc_align`). The local North-East-Down coordinate system of\neach camera determines the horizontal and vertical components.\n\nThis file is useful for understanding how far cameras may move and can help with\nadding camera constraints (:numref:`ba_cam_constraints`).\n\nFor linescan cameras, the camera centers will be for the upper-left image pixel.\n\n.. _ba_tri_offsets:\n\nChanges in triangulated points\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe distance between each initial triangulated point (after applying any\ninitial adjustments or alignment transform, but before any DEM constraint) and\nfinal triangulated point (after optimization) are computed (in ECEF, in meters).\nThe mean, median, and count of these distances, per camera, are saved to::\n\n    {output-prefix}-triangulation_offsets.txt\n\nThis is helpful in understanding how much the triangulated points move. An\nunreasonable amount of movement may suggest imposing stronger constraints on the\ntriangulated points (:numref:`ba_ground_constraints`).\n\n.. _ba_conv_angle:\n\nConvergence angles\n^^^^^^^^^^^^^^^^^^\n\nThe convergence angle percentiles for rays emanating from matching \ninterest points and intersecting on the ground (:numref:`stereo_pairs`)\nare saved to::\n\n    {output-prefix}-convergence_angles.txt\n\nThere is one entry for each pair of images having matches.\n\n.. _ba_err_per_point:\n\nReprojection errors per triangulated point\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nIf the ``--datum`` option is specified or auto-guessed based on images and\ncameras, ``bundle_adjust`` will write the triangulated ground position for every\nfeature being matched in two or more images, and the mean pixel reprojection\nerror (:numref:`bundle_adjustment`) for each position, before the first and after\nthe last optimization pass, in geodetic coordinates. The files are named\n\n::\n\n     {output-prefix}-initial_residuals_pointmap.csv\n     {output-prefix}-final_residuals_pointmap.csv\n\nHere is a sample file::\n\n   # lon, lat, height_above_datum, mean_residual, num_observations\n   -55.11690935, -69.34307716, 4.824523817, 0.1141333633, 2\n\nThe field ``num_observations`` counts in how many images each\ntriangulated point is seen.\n\nSuch files can be plotted and overlaid with ``stereo_gui``\n(:numref:`plot_csv`) to see at which triangulated points the\nreprojection errors are large and their geographic locations.\n\nPixel reprojection errors corresponding to GCP will be printed at the end of\nthese files and flagged with the string ``# GCP``. \n\nDuring the optimization the pixel differences are divided by pixel sigma.\nThis is undone when the pixel reprojection errors are later computed.\n\nThe command::\n\n    geodiff --absolute --csv-format '1:lon 2:lat 3:height_above_datum' \\\n      {output-prefix}-final_residuals_pointmap.csv dem.tif\n\n(:numref:`geodiff`) can be called to evaluate how well the residuals agree with\na given DEM. That can be especially useful if bundle adjustment was invoked with\nthe ``--heights-from-dem`` option (:numref:`heights_from_dem`).\n\nOne can also invoke ``point2dem`` (:numref:`point2dem`) with the above\n``--csv-format`` option to grid these files to create a coarse DEM (also for the\nerror residuals).\n\nThe final triangulated positions can be used for alignment with\n``pc_align`` (:numref:`pc_align`). Then, use\n``--min-triangulation-angle 10.0`` with bundle adjustment or some\nother higher value, to filter out unreliable triangulated points.\n(This still allows, for example, to have a triangulated point\nobtained by the intersection of three rays, with some\nof those rays having an angle of at least this while some a much\nsmaller angle.)\n\nGCP report\n^^^^^^^^^^\n\nIf GCP are present, the file ``{output-prefix}-gcp_report.txt`` will be saved to\ndisk, having the initial and optimized GCP coordinates, and their difference,\nboth in ECEF and longitude-latitude-height above datum. \n\nThe reprojection error file may be more helpful than this GCP report file\n(:numref:`ba_err_per_point`). The GCP are flagged with the string ``# GCP`` at\nthe end of that file.\n\n.. _ba_out_cams:\n\nImage and camera lists\n^^^^^^^^^^^^^^^^^^^^^^\n\nThe list of input images will be saved to::\n\n    {output-prefix}-image_list.txt\n\nThe list of optimized cameras (such as for CSM cameras or with the option\n``--inline-adjustments`` for Pinhole cameras) will be saved to::\n\n    {output-prefix}-camera_list.txt\n\nIf only ``.adjust`` files are saved, these will be in the list instead.\n\nThis is convenient because both ``bundle_adjust`` and ``jitter_solve`` can read\nsuch lists with the ``--image-list`` and ``--camera-list`` options (but not if\n``.adjust`` files are saved).\n\n.. _ba_error_propagation:\n\nError propagation\n^^^^^^^^^^^^^^^^^\n\nWhen the option ``--propagate-errors`` is specified, propagate the errors\n(uncertainties) from the input cameras to the triangulated point for each pair\nof inlier interest point matches. The produced uncertainties will be separated\ninto horizontal and vertical components relative to the datum. Statistical\nmeasures will be produced for each pair of images.\n\nThe same logic as in stereo triangulation is employed (:numref:`error_propagation`),\nbut for the sparse set of interest point matches rather than for the dense image\ndisparity. Since the produced uncertainties depend only weakly on the\ntriangulated surface, computing them for a sparse set of features, and\nsummarizing the statistics, as done here, is usually sufficient.\n\nSpecify ``--horizontal-stddev`` (a single value for all cameras, measured in\nmeters), to use this as the input camera ground horizontal uncertainty.\nOtherwise, as in the above-mentioned section, the input errors will be read from\ncamera files, if available.\n\nThe produced errors are saved to the file::\n\n    {output-prefix}-triangulation_uncertainty.txt\n\nThis file will have, for each image pair having matches, the median horizontal\nand vertical components of the triangulation uncertainties, the mean of each\ntype of uncertainty, the standard deviations, and number of samples used\n(usually the same as the number of inlier interest points). All errors are in\nmeters.\n\nThis operation will use the cameras after bundle adjustment. Invoke with\n``--num-iterations 0`` for the original cameras.\n\nIt is instructive to compare these uncertainties with their dense counterparts,\nas produced by ``point2dem`` (:numref:`export_stddev`).\n\n.. _ba_cam_pose:\n\nCamera positions and orientations\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nIf the cameras are Pinhole and a datum exists, the camera names,\ncamera centers (in meters, in ECEF coordinates), as well as\nthe rotations from each camera to world North-East-Down\n(NED) coordinates at the camera center are saved to::\n\n     {output-prefix}-initial-cameras.csv\n     {output-prefix}-final-cameras.csv\n\n(before and after optimization; in either case, after any initial\ntransform and/or adjustments are applied). These are useful for\nanalysis when the number of cameras is large and the images are\nacquired in quick succession (such as for SkySat data,\n:numref:`skysat`). Note that such a rotation determines a camera's\norientation in NED coordinates. A conversion to geodetic coordinates\nfor the position and to Euler angles for the orientation may help\nwith this data's interpretation.\n     \n.. _ba_mapproj_dem:\n\nRegistration errors on the ground\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nIf the option ``--mapproj-dem`` (with a DEM file as a value) is specified, for\neach pair of interest point matches (after bundle adjustment and outlier\nremoval) rays will be traced with the optimized cameras, that will be\nintersected with this DEM. Ideally, these rays should meet the DEM at the\nsame location, so distance between the intersection points measures the amount\nof misregistration.\n\nThe file::\n\n    {output-prefix}-mapproj_match_offset_stats.txt\n\nwill have the percentiles (25%, 50%, 75%, 85%, 95%) of these distances for all\nmatches in each image against all other images, in meters, and their count.\n\nDo *not* use this option for any initial evaluation of bundle adjustment. \nInspect instead the files mentioned earlier in :numref:`ba_out_files`. \n\nThis very advanced metric is only helpful if the images are expected to be \nwell-registered to each other and to the DEM, which is not the case without \nexplicit prior alignment. This also expects a rather accurate DEM, and\nfor bundle adjustment to be invoked with the option ``--heights-from-dem``\n(:numref:`heights_from_dem`).\n\nThe 50th percentiles should be on the order of 1 GSD or less.\n\nThe file::\n\n    {output-prefix}-mapproj_match_offset_pair_stats.txt\n\nsaves such measurements for every pair of images. \n\nThe full report will be saved to::\n\n\n    {output-prefix}-mapproj_match_offsets.txt\n\nhaving the longitude, latitude, and height above datum of the midpoint of each\npair of intersection points with the DEM, and the distance between them (in\nmeters).\n\nThis file is very analogous to the ``pointmap.csv`` file, except that\nthese errors are measured on the ground in meters, and not in the cameras\nin pixels. This file can be displayed and colorized in ``stereo_gui``\nas a scatterplot (:numref:`plot_csv`).\n\n.. _adjust_files:\n\nFormat of .adjust files\n~~~~~~~~~~~~~~~~~~~~~~~\n\nThe ``bundle_adjust`` program normally saves external adjustments to the input\ncameras, or in some cases it creates standalone cameras with adjustments applied\ninternally (:numref:`ba_use`). \n\nAn external adjustment is stored in a ``.adjust`` file. It has a translation *T*\nas *x, y, z* (measured in meters) and a rotation *R* as a quaternion in the\norder *w, x, y, z*. The rotation is around the camera center *C* for pixel (0,\n0) (for a linescan camera the camera center depends on the pixel). These are\napplied on top of initial cameras.\n\nHence, if *P* is a point in ECEF, that is, the world in which the camera\nexists, and an adjustment is applied to the camera, projecting *P* \nin the original camera gives the same result as projecting::\n\n    P' = R * (P - C) + C + T\n\nin the adjusted camera. \n\nNote that currently the camera center *C* is not exposed in the\n``.adjust`` file, so external tools cannot recreate this\ntransform. This will be rectified at a future time.\n\nAdjustments are relative to the initial cameras, so a nominal\nadjustment has the zero translation and identity rotation (quaternion\n1, 0, 0, 0).  \n\n.. _ba_options:\n\nCommand-line options\n~~~~~~~~~~~~~~~~~~~~\n\n-h, --help\n    Display the help message.\n\n-o, --output-prefix <filename>\n    Prefix for output filenames.\n\n--cost-function <string (default: Cauchy)>\n    Choose a cost function from: Cauchy, PseudoHuber, Huber, L1, L2\n\n--robust-threshold <double (default:0.5)>\n    Set the threshold for the robust reprojection error cost function.\n    Increasing this makes the solver focus harder on the larger errors while\n    becoming more sensitive to outliers. See the `Google Ceres\n    <http://ceres-solver.org/nnls_modeling.html>`_ documentation on robust cost\n    functions.\n\n--datum <string (default: \"\")>\n    Set the datum. This will override the datum from the input images and also\n    ``--t_srs``, ``--semi-major-axis``, and ``--semi-minor-axis``. If not set or\n    inferred from the images or camera models, the datum will be auto-guessed\n    based on camera centers for Earth, Mars, and Moon. Options:\n\n    - WGS_1984\n    - D_MOON (1,737,400 meters)\n    - D_MARS (3,396,190 meters)\n    - MOLA (3,396,000 meters)\n    - NAD83\n    - WGS72\n    - NAD27\n    - Earth (alias for WGS_1984)\n    - Mars (alias for D_MARS)\n    - Moon (alias for D_MOON)\n\n--semi-major-axis <float (default: 0)>\n    Explicitly set the datum semi-major axis in meters.\n\n--semi-minor-axis <float (default: 0)>\n    Explicitly set the datum semi-minor axis in meters.\n\n-t, --session-type <string>\n    Select the stereo session type to use for processing. Usually\n    the program can select this automatically by the file extension, \n    except for xml cameras. See :numref:`ps_options` for\n    options.\n\n--min-matches <integer (default: 5)>\n    Set the minimum number of matches between images that will be considered.\n\n--max-pairwise-matches <integer (default: 10000)>\n    Reduce the number of matches per pair of images to at most this\n    number, by selecting a random subset, if needed. This happens\n    when setting up the optimization, and before outlier filtering.\n\n--num-iterations <integer (default: 1000)>\n    Set the maximum number of iterations.\n\n--parameter-tolerance <double (default: 1e-8)>\n    Stop when the relative error in the variables being optimized is less than\n    this. When ``--solve-intrinsics`` is used, the default is 1e-12.\n\n--overlap-limit <integer (default: 0)>\n    Limit the number of subsequent images to search for matches to\n    the current image to this value.  By default try to match all\n    images. See also ``--auto-overlap-params``.\n\n--overlap-list <string>\n    A file containing a list of image pairs, one pair per line,\n    separated by a space, which are expected to overlap. Matches\n    are then computed only among the images in each pair. The order \n    in which pairs are specified is not important.\n\n--auto-overlap-params <string (default: \"\")>\n    Determine which camera images overlap by finding the bounding boxes of their\n    ground footprints given the specified DEM, expanding them by a given\n    percentage, and see if those intersect. A higher percentage should be used\n    when there is more uncertainty about the input camera poses. As of the\n    10/2025 build, a third parameter can be provided to limit the number of\n    subsequent images that overlap to this many. Example: 'dem.tif 15.0 6'.\n    Using this with ``--mapprojected-data`` will restrict the matching only to\n    the ground-level overlap regions (expanded by this percentage).\n    As of the 10/2025 build, this works also with ``--match-first-to-last``.\n\n--auto-overlap-buffer <double (default: not set)>\n    Try to automatically determine which images overlap. Used only if\n    this option is explicitly set. Only supports Worldview style XML\n    camera files. The lon-lat footprints of the cameras are expanded\n    outwards on all sides by this value (in degrees), before checking\n    if they intersect.\n\n--match-first-to-last\n    Match the first several images to last several images by extending\n    the logic of ``--overlap-limit`` past the last image to the earliest\n    ones. As of the 10/2025 build, this works also with\n    ``--auto-overlap-params``. \n\n--tri-weight <double (default: 0.1)>\n    The weight to give to the constraint that optimized triangulated points stay\n    close to original triangulated points. A positive value will help ensure the\n    cameras do not move too far, but a large value may prevent convergence. It\n    is suggested to use here 0.1 to 0.5. This will be divided by ground sample\n    distance (GSD) to convert this constraint to pixel units, since the\n    reprojection errors are in pixels. See also ``--tri-robust-threshold``. Does\n    not apply to GCP or points constrained by a DEM.\n    \n--tri-robust-threshold <double (default: 0.1)>\n    The robust threshold to attenuate large differences between initial and\n    optimized triangulation points, after multiplying them by ``--tri-weight``\n    and dividing by GSD. This is less than ``--robust-threshold``, as the\n    primary goal is to reduce pixel reprojection errors, even if that results in\n    big differences in the triangulated points. It is suggested to not modify\n    this value, and adjust instead ``--tri-weight``.\n\n--camera-position-uncertainty <string (default: \"\")>\n    A file having on each line the image name and the horizontal and vertical\n    camera position uncertainty (1 sigma, in meters). This strongly constrains\n    the movement of cameras, potentially at the expense of accuracy. To have the\n    same uncertainties for all cameras, pass instead of a file name two values\n    separated by a comma (no spaces). See :numref:`ba_cam_constraints` for an\n    example. See also ``--camera-position-uncertainty-power``.\n\n--camera-position-uncertainty-power <double (default: 2.0)>\n    A higher value makes the cost function rise more steeply when\n    ``--camera-position-uncertainty`` is close to being violated. This is an\n    advanced option. The default should be good enough.\n\n--camera-position-weight <double (default: 0.0)>\n    A soft constraint to keep the camera positions close to the original values.\n    It is meant to prevent a wholesale shift of the cameras. It can impede the\n    reduction in reprojection errors. It adjusts to the ground sample distance\n    and the number of interest points in the images. The computed discrepancy is\n    attenuated with ``--camera-position-robust-threshold``. It is suggested to\n    use instead ``--camera-position-uncertainty``. See\n    :numref:`ba_cam_constraints` for details.\n \n--camera-position-robust-threshold <double (default: 0.1)>\n    The robust threshold to attenuate large discrepancies between initial and\n    optimized camera positions with the option ``--camera-position-weight``.\n    This is less than ``--robust-threshold``, as the primary goal is to reduce\n    pixel reprojection errors, even if that results in big differences in the\n    camera positions. It is suggested to not modify this value, and adjust\n    instead ``--camera-position-weight``.\n       \n--rotation-weight <double (default: 0.0)>\n    A higher weight will penalize more camera rotation deviations from the\n    original configuration.  This adds to the cost function\n    the per-coordinate differences between initial and optimized\n    normalized camera quaternions, multiplied by this weight, and then\n    squared. No robust threshold is used to attenuate this term.\n\n--camera-weight <double (default: 0.0)>\n    The weight to give to the constraint that the camera positions/orientations\n    stay close to the original values. A higher weight means that the values will\n    change less. This option is deprecated. Use instead ``--camera-position-weight``\n    and ``--tri-weight``.\n        \n--ip-per-tile <integer (default: unspecified)>\n    How many interest points to detect in each :math:`1024^2` image\n    tile (default: automatic determination). This is before matching. \n    Not all interest points will have a match. See also ``--matches-per-tile``.\n\n--ip-per-image <integer>\n    How many interest points to detect in each image (default:\n    automatic determination). Can set either this or ``--ip-per-tile``.\n\n--ip-detect-method <integer (default: 0)>\n    Choose an interest point detection method from: 0 = OBAloG\n    (:cite:`jakkula2010efficient`), 1 = SIFT (from OpenCV), 2 = ORB (from\n    OpenCV). The SIFT method, unlike OBALoG, produces interest points that are\n    accurate to subpixel level. Remove any existing ``.vwip`` files before\n    recomputing interest points with a different method. See also\n    :numref:`custom_ip`.\n\n--matches-per-tile <int (default: unspecified)>\n    How many interest point matches to compute in each image tile (of size\n    normally :math:`1024^2` pixels). Use a value of ``--ip-per-tile`` a few\n    times larger than this. See an example in :numref:`ba_examples`. See also\n    ``--matches-per-tile-params``.\n\n--matches-per-tile-params <int int (default: 1024 1280)>\n    To be used with ``--matches-per-tile``. The first value is the image tile\n    size for both images. A larger second value allows each right tile to\n    further expand to this size, resulting in the tiles overlapping. This may be\n    needed if the homography alignment between these images is not great, as\n    this transform is used to pair up left and right image tiles.\n\n--inline-adjustments\n    If this is set, and the input cameras are of the pinhole or\n    panoramic type, apply the adjustments directly to the cameras,\n    rather than saving them separately as .adjust files.\n\n--input-adjustments-prefix <string (default: \"\")>\n    Prefix to read initial adjustments from, written by a previous\n    invocation of this program.\n\n--isis-cnet <string (default: \"\")>\n    Read a control network having interest point matches from this binary file\n    in the ISIS control network format. This can be used with any images and\n    cameras supported by ASP. See also ``--output-cnet-type``.\n\n--nvm <string (default: \"\")>\n    Read a control network having interest point matches from this file in the\n    NVM format. This can be used with any images and cameras supported by ASP.\n    For Pinhole or CSM frame cameras, the (optimized) camera poses will be\n    read from / written to NVM as well (:numref:`ba_nvm`). See also\n    ``--output-cnet-type``, ``--no-poses-from-nvm``.\n\n--output-cnet-type <string (default: \"\")>\n    The format in which to save the control network of interest point matches.\n    Options: ``match-files`` (match files in ASP's format), ``isis-cnet`` (ISIS\n    jigsaw format), ``nvm`` (plain text VisualSfM NVM format). If not set, the same\n    format as for the input is used.\n\n--no-poses-from-nvm\n    Do not read the camera poses from the NVM file or write them to such a file.\n    Applicable only with the option ``--nvm`` and Pinhole camera models.\n    \n--initial-transform <string>\n    Before optimizing the cameras, apply to them the 4 |times| 4 rotation\n    + translation transform from this file. The transform is in\n    respect to the planet center, such as written by pc_align's\n    source-to-reference or reference-to-source alignment transform.\n    Set the number of iterations to 0 to stop at this step. If\n    ``--input-adjustments-prefix`` is specified, the transform gets\n    applied after the adjustments are read.\n\n--fixed-camera-indices <string>\n    A list of indices, in quotes and starting from 0, with space\n    as separator, corresponding to cameras to keep fixed during the\n    optimization process.\n\n--fixed-image-list\n    A file having a list of images (separated by spaces or newlines)\n    whose cameras should be fixed during optimization. \n\n--fix-gcp-xyz\n    If the GCP are highly accurate, use this option to not float\n    them during the optimization.\n\n--use-lon-lat-height-gcp-error\n    When having GCP (or a DEM constraint), constrain the triangulated points in the\n    longitude, latitude, and height space, instead of ECEF. The standard deviations\n    in the GCP file (or DEM uncertainty) are applied accordingly.\n\n--solve-intrinsics\n    Optimize intrinsic camera parameters. Only used for pinhole, optical bar,\n    and CSM (frame and linescan) cameras. This implies ``--inline-adjustments``.\n    See :numref:`heights_from_dem` for an example.\n\n--intrinsics-to-float <string (default: \"\")>\n    If solving for intrinsics and is desired to float only a few of them,\n    specify here, in quotes, one or more of: ``focal_length``,\n    ``optical_center``, ``other_intrinsics`` (same as ``distortion``). Not\n    specifying anything will float all of them. Also can specify ``all`` or\n    ``none``. See :numref:`ba_frame_linescan` for controlling these per each\n    group of cameras sharing a sensor. See also ``--fixed-distortion-indices``.\n\n--intrinsics-to-share <string (default: \"\")>\n    If solving for intrinsics and desired to share only a few of them across all\n    cameras, specify here, in quotes, one or more of: ``focal_length``,\n    ``optical_center``, ``other_intrinsics`` (same as ``distortion``). By\n    default all of the intrinsics are shared, so to not share any of them pass\n    in an empty string. Also can specify as ``all`` or ``none``. If sharing\n    intrinsics per sensor, this option is ignored, as then the sharing is more\n    fine-grained (:numref:`kaguya_ba`).\n\n--intrinsics-limits <arg>\n    Set a string in quotes that contains min max ratio pairs for intrinsic\n    parameters. For example, \"0.8 1.2\" limits the parameter to changing by no\n    more than 20 percent. The first pair is for focal length, the next two are\n    for the center pixel, and the remaining pairs are for other intrinsic\n    parameters. If too many pairs are passed in the program will throw an\n    exception and print the number of intrinsic parameters the cameras use.\n    Cameras adjust all of the parameters in the order they are specified in the\n    camera model unless it is specified otherwise in :numref:`pinholemodels`.\n    Setting limits can greatly slow down the solver.\n\n--num-passes <integer (default: 2)>\n    How many passes of bundle adjustment to do, with given number\n    of iterations in each pass. For more than one pass, outliers will\n    be removed between passes using ``--remove-outliers-params``, \n    and re-optimization will take place. Residual files and a copy of\n    the match files with the outliers removed (``*-clean.match``) will\n    be written to disk.\n\n--num-random-passes <integer (default: 0)>\n    After performing the normal bundle adjustment passes, do this\n    many more passes using the same matches but adding random offsets\n    to the initial parameter values with the goal of avoiding local\n    minima that the optimizer may be getting stuck in. Only the\n    results for the optimization pass with the lowest error are\n    kept.\n\n--remove-outliers-params <'pct factor err1 err2' (default: '75.0 3.0 5.0 8.0')>\n    Outlier removal based on percentage, when more than one bundle adjustment\n    pass is used.  Triangulated points (that are not GCP) with reprojection\n    error in pixels larger than::\n    \n        min(max(pct-th percentile * factor, err1), err2)\n    \n    will be removed as outliers.  Hence, never remove pixel\n    reprojection errors smaller than ``err1`` but always remove those bigger\n    than ``err2``. Specify as a list in quotes. Also remove outliers based on\n    distribution of interest point matches and triangulated points.\n\n--elevation-limit <min max>\n    Remove as outliers interest points (that are not GCP) for which\n    the elevation of the triangulated position (after cameras are\n    optimized) is outside of this range. Specify as two values.\n\n--lon-lat-limit <min_lon min_lat max_lon max_lat>\n    Remove as outliers interest points (that are not GCP) for which\n    the longitude and latitude of the triangulated position (after\n    cameras are optimized) are outside of this range.  Specify as\n    four values.\n\n--max-gcp-reproj-err <double (default: -1.0)>\n    If positive, after each pass remove GCPs whose mean reprojection\n    error (averaged over all cameras seeing that point) is more than\n    this value (in pixels).\n\n--heights-from-dem <string (default: \"\")>\n    Assuming the cameras have already been bundle-adjusted and aligned to a\n    known DEM, constrain the triangulated points to be close to the DEM. See\n    also ``--heights-from-dem-uncertainty`` and :numref:`heights_from_dem`.\n\n--heights-from-dem-uncertainty <double (default: -1.0)>\n    The DEM uncertainty (1 sigma, in meters). Must be positive. A smaller value\n    constrains more the triangulated points to the DEM specified via\n    ``--heights-from-dem``. The discrepancy between a triangulated point and\n    corresponding point on the DEM is divided by this uncertainty to make it\n    dimensionless, before being added to the cost function\n    (:numref:`how_ba_works`). See also ``--heights-from-dem-robust-threshold``.\n\n--heights-from-dem-robust-threshold <double (default: 0.1)> \n    The robust threshold to use to keep the triangulated points close to the DEM if\n    specified via ``--heights-from-dem``. This is applied after the point\n    differences are divided by ``--heights-from-dem-uncertainty``. It will\n    attenuate large height difference outliers. It is suggested to not modify\n    this value, and adjust instead ``--heights-from-dem-uncertainty``.\n\n--mapproj-dem <string (default: \"\")>\n    If specified, mapproject every pair of matched interest points onto this DEM\n    and compute their distance, then percentiles of such distances for each\n    image vs the rest and each image pair. This is done after bundle adjustment\n    and outlier removal. Measured in meters. See :numref:`ba_mapproj_dem` for\n    more details. Not related to ``--mapprojected-data``.\n\n--csv-format <string>\n    Specify the format of input CSV files as a list of entries\n    column_index:column_type (indices start from 1).  Examples:\n    ``1:x 2:y 3:z`` (a Cartesian coordinate system with origin at\n    planet center is assumed, with the units being in meters),\n    ``5:lon 6:lat 7:radius_m`` (longitude and latitude are in degrees,\n    the radius is measured in meters from planet center), \n    ``3:lat 2:lon 1:height_above_datum``,\n    ``1:easting 2:northing 3:height_above_datum``\n    (need to set ``--csv-srs``; the height above datum is in\n    meters).  Can also use radius_km for column_type, when it is\n    again measured from planet center.\n\n--csv-srs <string>\n    The PROJ or WKT string for interpreting the entries in input CSV\n    files.\n\n--update-isis-cubes-with-csm-state\n    Save the model state of optimized CSM cameras as part of the .cub\n    files. Any prior version and any SPICE data will be deleted.\n    Mapprojected images obtained with prior version of the cameras\n    must no longer be used in stereo.\n\n--save-adjusted-rpc\n    In addition to external adjustments to the input cameras, save RPC cameras\n    with the adjustments applied to them, in XML format. This recomputes the RPC\n    models (:numref:`rpc_and_ba`).\n            \n--min-triangulation-angle <degrees (default: 0.1)>\n    Filter as outlier any triangulation point for which all rays converging to\n    it have an angle less than this (measured in degrees). This happens on\n    loading the match files and after each optimization pass. This should be\n    used cautiously with very uncertain input cameras. See also\n    ``--forced-triangulation-distance`` and ``--max-triangulation-angle``.\n\n--forced-triangulation-distance <meters>\n    When triangulation fails, for example, when input cameras are inaccurate or\n    the triangulation angle is too small, artificially create a triangulation\n    point this far ahead of the camera, in units of meters. Some of these may\n    later be filtered as outliers. Can also set a very small value for\n    ``--min-triangulation-angle`` in this case.\n\n--ip-num-ransac-iterations <iterations (default: 1000)>\n    How many RANSAC iterations to do in interest point matching.\n\n--save-cnet-as-gcp\n    Save the optimized control network, after outlier filtering, in the format\n    used by ground control points (:numref:`bagcp`), including any input GCP.\n    The xyz sigma is 1 meter for regular non-GCP triangulated points and the\n    value of ``--heights-from-dem-uncertainty`` for DEM-constrained points.\n    Can be inspected with ``stereo_gui`` (:numref:`stereo_gui_vwip_gcp`).\n\n--camera-positions <filename>\n    CSV file containing estimated position of each camera, in ECEF\n    coordinates. For this to work well the camera must travel not along linear\n    path, as this data will be used to find an alignment transform. Only used\n    with the inline-adjustments setting to initialize global camera coordinates.\n    If used, the csv-format setting must also be set. The \"file\" field is\n    searched for strings that are found in the input image files to match\n    locations to cameras. See :numref:`sfmicebridge` for an example.\n\n--init-camera-using-gcp\n    Given an image, a pinhole camera lacking correct position and\n    orientation, and a GCP file, find the pinhole camera with given\n    intrinsics most consistent with the GCP (:numref:`camera_solve_gcp`).\n\n--transform-cameras-with-shared-gcp\n    Given at least 3 GCP, with each seen in at least 2 images,\n    find the triangulated positions based on pixels values in the GCP,\n    and apply a rotation + translation + scale transform to the entire\n    camera system so that the triangulated points get\n    mapped to the ground coordinates in the GCP.\n\n--transform-cameras-using-gcp\n    Given a set of GCP, with at least two images having at least three\n    GCP each (but with each GCP not shared among the images),\n    transform the cameras to ground coordinates. This is not as robust\n    as ``--transform-cameras-with-shared-gcp``.\n\n--disable-pinhole-gcp-init\n    Do not try to initialize pinhole camera coordinates using provided\n    GCP coordinates. This is ignored as it is now the default. See also:\n    ``--init-camera-using-gcp``.\n\n--position-filter-dist <max_dist (default: -1.0)>\n    If estimated camera positions are used, this option can be used\n    to set a threshold distance in meters between the cameras.  If\n    any pair of cameras is farther apart than this distance, the\n    tool will not attempt to find matching interest points between\n    those two cameras.\n\n--force-reuse-match-files\n    Force reusing the match files even if older than the images or cameras. Then\n    the order of images in each interest point match file need not be the same\n    as for input images. Additional match files will be created if needed.\n\n--skip-matching\n    Only use the match files that be loaded from disk. This implies ``--force-reuse-match-files``.\n\n--matches-as-txt\n    Read and write match files as plain text instead of binary. See\n    :numref:`txt_match`.\n\n--match-files-prefix <string (default: \"\")>\n    Use the match files from this prefix instead of the current output prefix.\n    See the naming convention in :numref:`ba_match_files`. This implies\n    ``--skip-matching``. The order of images in each interest point match file\n    need not be the same as for input images. See also\n    ``--clean-match-files-prefix``.\n\n--clean-match-files-prefix <string (default: \"\")>\n    Use as input the ``*-clean.match`` files from this prefix.\n    This implies ``--skip-matching``. The order of images in each interest\n    point match file need not be the same as for input images.\n    Only one of ``--match-files-prefix`` and ``--clean-match-files-prefix``\n    can be set.\n\n--enable-rough-homography\n    Enable the step of performing datum-based rough homography for\n    interest point matching. This is best used with reasonably\n    reliable input cameras and a wide footprint on the ground.\n\n--skip-rough-homography\n    Skip the step of performing datum-based rough homography.  This\n    obsolete option is ignored as it is the default.\n\n--enable-tri-ip-filter\n    Enable triangulation-based interest points filtering. This is\n    best used with reasonably reliable input cameras.\n\n--disable-tri-ip-filter\n    Disable triangulation-based interest points filtering. This\n    obsolete option is ignored as is the default.\n\n--no-datum\n    Do not assume a reliable datum exists, such as for irregularly shaped bodies\n    or when at the ground level. This is also helpful when the input cameras are\n    not very accurate, as the datum is used to do some camera-based filtering of\n    interest points.\n\n--mapprojected-data <string (default: \"\")>\n    Given map-projected versions of the input images and the DEM they were\n    mapprojected onto, create interest point matches between the mapprojected\n    images. Unproject and save those matches, then continue with bundle adjustment.\n    Existing match files will be reused. Specify the mapprojected images and the\n    DEM as a string in quotes, separated by spaces. The order must be same as\n    for the input images. The DEM is optional (since the 1/2026 build) if it\n    can be looked up in the geoheaders of the mapprojected images. If provided,\n    the DEM must be the last file. See :numref:`mapip` for an example. It is\n    suggested to use this with ``--auto-overlap-params.`` See also\n    ``--mapprojected-data-list``.\n\n--save-intermediate-cameras\n    Save the values for the cameras at each iteration.\n\n--apply-initial-transform-only\n    Apply to the cameras the transform given by ``--initial-transform``.\n    No iterations, GCP loading, image matching, or report generation\n    take place. Using ``--num-iterations 0`` and without this option\n    will create those.\n\n--image-list\n    A file containing the list of images, when they are too many to specify on\n    the command line. Use in the file a space or newline as separator. When\n    solving for intrinsics for several sensors, pass to this option several\n    lists, with comma as separator between the file names (no space). An example\n    is in :numref:`kaguya_ba`. See also ``--camera-list`` and\n    ``--mapprojected-data-list``.\n\n--camera-list\n    A file containing the list of cameras, when they are too many to\n    specify on the command line. If the images have embedded camera\n    information, such as for ISIS, this file may be omitted, or\n    specify the image names instead of camera names.\n\n--mapprojected-data-list\n    A file containing the list of mapprojected images and the DEM (see\n    ``--mapprojected-data``), when they are too many to specify on the command\n    line. The order must be the same as for input images. The DEM is optional\n    (since the 1/2026 build) if it can be looked up in the geoheaders of the\n    mapprojected images. If provided, the DEM must be the last entry.\n\n--proj-win\n    Flag as outliers input triangulated points not in this proj\n    win (box in projected units as provided by ``--proj_str``). This\n    should be generous if the input cameras have significant errors.\n\n--proj-str\n    To be used in conjunction with  ``--proj-win``.\n\n--weight-image <string (default: \"\")>\n    Given a georeferenced image with float values, for each initial triangulated\n    point find its location in the image and closest pixel value. Multiply the\n    reprojection errors in the cameras for this point by this weight value. The\n    solver will focus more on optimizing points with a higher weight. Points\n    that fall outside the image and weights that are non-positive, NaN, or equal\n    to nodata will be ignored. See :numref:`limit_ip` for details.\n\n--propagate-errors\n    Propagate the errors from the input cameras to the triangulated\n    points for all pairs of match points, and produce a report having\n    the median, mean, standard deviation, and number of samples for\n    each camera pair (:numref:`ba_error_propagation`).\n\n--horizontal-stddev <double (default: 0.0)>\n    If positive, propagate this stddev of horizontal ground plane camera\n    uncertainty through triangulation for all cameras. To be used with\n    ``--propagate-errors``.\n   \n--epipolar-threshold <double (default: -1)>\n    Maximum distance from the epipolar line to search for IP matches.\n    If this option isn't given, it will default to an automatic determination.\n\n--ip-inlier-factor <double (default: 0.2)>\n    Inlier factor used to remove outliers with homography filtering and RANSAC.\n    A higher factor will result in more interest points, but perhaps also more\n    outliers.\n\n--ip-uniqueness-threshold <double (default: 0.8)>\n    A higher threshold will result in more interest points, but\n    perhaps less unique ones.\n\n--nodata-value <double(=NaN)>\n    Pixels with values less than or equal to this number are treated\n    as no-data. This overrides the no-data values from input images.\n\n--individually-normalize\n    Individually normalize the input images instead of using common\n    values.\n\n--min-distortion <double (default: 1e-7)>\n    Distortion parameters that are optimized and that are smaller in magnitude\n    than this value are set to this value. This is to ensure the parameters are\n    big enough to be optimized. Can be negative. This is affected by\n    ``--fixed-distortion-indices``. Applies to Pinhole cameras (all distortion\n    models) and CSM (radial-tangential distortion only). Does not apply to\n    optical bar models.\n\n--fixed-distortion-indices <string (default: \"\")>\n    A sequence of indices, separated by commas (with no spaces) starting from 0,\n    corresponding to lens distortion parameters to keep fixed, if\n    ``--solve-intrinsics`` is invoked. These will not be changed by the\n    ``--min-distortion`` setting. Sample input: ``0,3,4``. The order of\n    distortion parameters is as saved in output camera files. For example, for\n    radial-tangential distortion, the order is ``k1, k2, p1, p2, k3``\n    (:numref:`pinhole_distortion`). \n    \n--reference-terrain <filename>\n    An externally provided trustworthy reference terrain to use as a constraint.\n    It can be either a DEM or a point cloud in CSV format. It must be\n    well-aligned with the input cameras (:numref:`reference_terrain`).\n\n--reference-terrain-weight <double (default: 1)>\n    How much weight to give to the cost function terms involving\n    the reference terrain.\n\n--max-num-reference-points <integer (default: 100000000)>\n    Maximum number of (randomly picked) points from the reference\n    terrain to use.\n\n--disparity-list <'filename12 filename23 ...'>\n    The unaligned disparity files to use when optimizing the\n    intrinsics based on a reference terrain. Specify them as a list\n    in quotes separated by spaces.  First file is for the first two\n    images, second is for the second and third images, etc. If an\n    image pair has no disparity file, use 'none'.\n\n--max-disp-error <double (default: -1)>\n    When using a reference terrain as an external control, ignore\n    as outliers xyz points which projected in the left image and\n    transported by disparity to the right image differ by the\n    projection of xyz in the right image by more than this value\n    in pixels.\n\n--bathy-plane <string (default: \"\")>\n    Path to a file containing a plane approximating the water surface, for\n    bathymetry correction with underwater terrain (:numref:`bathy_intro`). This\n    corrects camera rays passing through water using Snell's law. If multiple\n    images are used and they have different water surfaces use\n    ``--bathy-plane-list``. Use together with ``--refraction-index``. See also\n    ``--bathy-mask-list``.\n\n--bathy-plane-list <string (default: \"\")>\n    Path to a file containing a list of bathy plane files for bathymetry\n    correction, if more than one. Set one plane file per line. Must specify one\n    plane per input image, in the same order. Use with ``--bathy-mask-list`` and\n    ``--refraction-index``.\n\n--bathy-mask-list <string (default: \"\")>\n    Path to a file containing a list of water mask images for bathymetry correction,\n    one mask per line. Must specify one mask per input image, in the same order.\n    Pixels classified as water must be either no-data or have zero value, while\n    land pixels must have positive values. Must be used with ``--bathy-plane`` and\n    ``--refraction-index``. An example is in :numref:`ba_bathy`.\n\n--refraction-index <double (default: 0.0)>\n    Index of refraction of water for bathymetry correction. Typical values:\n    1.333 to 1.341 depending on wavelength and temperature. Must be used with\n    ``--bathy-plane``. See :numref:`refr_index` to compute the effective\n    refraction index for a specific satellite band and water conditions.\n\n--max-triangulation-angle <double (default: -1.0)>\n    Filter as outlier any triangulation points for which the maximum angle of\n    rays converging to it are more than this (measured in degrees). Set to a\n    positive value. See also ``--min-triangulation-angle``.\n    \n--ip-triangulation-max-error <float>\n    When matching IP, filter out any pairs with a triangulation error higher\n    than this. The triangulation error is the shortest distance between rays.\n    This gets used only when the usual triangulation error filtering fails.\n\n--flann-method <string (default = \"auto\")>\n    Choose the FLANN method for matching interest points. Options: ``kmeans``:\n    slower but deterministic, ``kdtree``: faster (up to 6x) but not\n    deterministic (starting with FLANN 1.9.2). The default (``auto``) is to use\n    ``kmeans`` for 25,000 features or less and ``kdtree`` otherwise. This does\n    not apply to ORB feature matching.\n\n--ip-nodata-radius <integer (default: 4)>\n    Remove IP near nodata with this radius, in pixels.\n\n--accept-provided-mapproj-dem\n    Accept the DEM provided on the command line as the one mapprojection was\n    done with, even if it disagrees with the DEM recorded in the geoheaders of\n    input images.\n\n--save-vwip\n    Save ``.vwip`` files (interest point matches per image, before matching).\n    This option is currently ignored as ``.vwip`` are always saved.\n\n--threads <integer (default: 0)>\n    Set the number threads to use. 0 means use the default defined\n    in the program or in ``~/.vwrc``. Note that when using more\n    than one thread and the Ceres option the results will vary\n    slightly each time the tool is run.\n\n--cache-size-mb <integer (default = 1024)>\n    Set the system cache size, in MB, for each process.\n\n-v, --version\n    Display the version of software.\n\n.. |times| unicode:: U+00D7 .. MULTIPLICATION SIGN\n"
  },
  {
    "path": "docs/tools/cam2map4stereo.rst",
    "content": ".. _cam2map4stereo.py:\n\ncam2map4stereo.py\n-----------------\n\nThis program takes similar arguments as the ISIS ``cam2map`` program,\nbut takes two input images. With no arguments, the program determines\nthe minimum overlap of the two images, and the worst common resolution,\nand then map-projects the two images to this identical area and\nresolution.\n\nThe detailed reasons for doing this, and a manual step-by-step\nwalkthrough of what ``cam2map4stereo.py`` does is provided in the\ndiscussion on aligning images in the Tutorial.\n\nThe ``cam2map4stereo.py`` is also useful for selecting a subsection\nand/or reduced resolution portion of the full image. You can inspect a\nraw camera geometry image in qview after you have run ``spiceinit`` on\nit, select the latitude and longitude ranges, and then use\n``cam2map4stereo.py``\\ ’s ``--lat``, ``--lon``, and optionally\n``--resolution`` options to pick out just the part you want.\n\nUse the ``--dry-run`` option the first few times to get an idea of what\n``cam2map4stereo.py`` does for you.\n\nCommand-line options for cam2map4stereo.py:\n\n-h, --help\n    Display the help message.\n\n--manual\n    Read the manual.\n\n-m, --map <file.map>\n    The mapfile to use for ``cam2map``.\n\n-p, --pixres <PIXRES>\n    The pixel resolution mode to use for ``cam2map``.\n\n-r, --resolution <RESOLUTION>\n    Resolution of the final map for ``cam2map``.\n\n-i, --interp <INTERP>\n    Pixel interpolation scheme for ``cam2map``.\n\n-a, --lat <LAT>\n    Latitude range for ``cam2map``, where ``LAT`` is of the form\n    *min:max*. So to specify a latitude range between -5 and 10\n    degrees, it would look like ``--lat=-5:10``.\n\n-o, --lon <LON> \n    Longitude range for ``cam2map``, where ``LON`` is of the form\n    *min:max*. So to specify a longitude range between 45 and 47\n    degrees, it would look like ``--lon=40:47``.\n\n-n, --dry-run\n    Make calculations, and print the ``cam2map`` command that would\n    be executed, but don’t actually run it.\n\n--prefix <path>\n    Make all output files use this prefix. Default: no prefix.\n\n-s, --suffix <suffix (default: map)>\n    Suffix that gets inserted in the output file names.\n"
  },
  {
    "path": "docs/tools/cam2rpc.rst",
    "content": ".. _cam2rpc:\n\ncam2rpc\n-------\n\nThis tool is used to generate an approximate RPC model (:numref:`rpc`) for any\ncamera model supported by ASP, in a given longitude-latitude-height region for a\ngiven datum, or for a terrain covered by a given DEM. If ``--save-tif-image`` is\nspecified, the image portion corresponding to the RPC model will be saved in the\nTIF format.\n\nThe produced RPC camera can be restricted to a given ground or pixel box.\nIn either case it will be consistent with the image portion that is saved.\n\nThe accuracy of RPC models generally degrades if expected to cover very\nlarge regions. Hence, they can be used piecewise, and the obtained\nterrain models from ASP can be then mosaicked together using\n``dem_mosaic`` (:numref:`dem_mosaic`).\n\nExamples\n~~~~~~~~\n\nExample for ISIS cub cameras for Mars::\n\n    cam2rpc input.cub output.xml --session-type isis    \\\n      --datum D_MARS --save-tif-image                   \\\n      --height-range -10000 -9000                       \\\n      --lon-lat-range 141.50 34.43 141.61 34.15         \\\n      --penalty-weight 0.03 --gsd 1\n\nExample for pinhole cameras, with the lon-lat-height box produced from a DEM.\nHere the image is also cropped and the image portion on which the RPC model is\ndefined is saved::\n\n    cam2rpc input.tif input.tsai output.xml --session-type nadirpinhole   \\\n      --dem-file DEM.tif --save-tif-image --image-crop-box 90 70 5511 3675\n\nUses\n~~~~\n\nThe obtained RPC models and (potentially cropped) images can be used with the\nASP tools when invoked with ``--session-type rpc``. The datum is read from the\n``<RPC_DATUM>`` field, as written by ``cam2rpc``. It is suggested to also\npass it via the ``--datum`` option.\n\nThe RPC models should work with the third-party ``S2P`` and ``SETSM`` stereo\nsoftware. Note that both of these packages are for Earth only.\n\nThe produced RPC model file can be read by GDAL (including ``gdalinfo``,\n:numref:`gdal_tools`) if has the same name as the image but with the .xml\nextension, and no analogously named ``.rpb`` or ``_RPC.txt`` files are present.\n\nValidation\n~~~~~~~~~~\n\nIt is suggested to mapproject the produced image and camera onto a DEM using\n``mapproject`` (:numref:`mapproject`) and compare with the result from the\noriginal image and camera.\n\nIn addition, *if the produced image file contains the original upper-left image\ncorner*, the ``cam_test`` program (:numref:`cam_test`) can be invoked to compare\nthe original and resulting RPC camera, for example as follows::\n\n    cam_test --image output.tif --cam1 input.tsai --cam2 output.xml \\\n      --height-above-datum val\n\nHere, ``val`` is a value that is between the minimum and maximum heights used\nwhen the RPC model was computed.\n\nThis should result in similar values for the camera directions and pixel\ndifferences, but not for the camera centers, because the RPC model does not have\na well-defined camera center. \n\nLarge pixel differences are a sign that the image was not cropped to the region\ncontaining the original upper-left corner (option ``--no-crop`` may help then,\nin addition to specifying larger lon-lat bounds or a bigger DEM to fit to).\n\nUsage\n~~~~~\n\n::\n\n     cam2rpc [options] <camera-image> <camera-model> <output-rpc>\n\nSee also\n~~~~~~~~\n\nTo export an existing RPC camera to a file in XML format, use ``cam_gen``\n(:numref:`cam_gen_rpc`).\n\nCommand-line options\n~~~~~~~~~~~~~~~~~~~~\n\n--datum <string>\n    Set the datum. This will override the datum from the input images and also\n    ``--semi-major-axis``, and ``--semi-minor-axis``. The datum\n    from ``--t_srs`` or ``--dem-file`` takes priority, if set. Options:\n\n    - WGS_1984\n    - D_MOON (1,737,400 meters)\n    - D_MARS (3,396,190 meters)\n    - MOLA (3,396,000 meters)\n    - NAD83\n    - WGS72\n    - NAD27\n    - Earth (alias for WGS_1984)\n    - Mars (alias for D_MARS)\n    - Moon (alias for D_MOON)\n\n--semi-major-axis <double>\n    Explicitly set the datum semi-major axis in meters. The datum from\n    ``--t_srs`` or ``--dem-file`` takes priority, if set.\n\n--semi-minor-axis <double>\n    Explicitly set the datum semi-minor axis in meters. The datum from\n    ``--t_srs`` or ``--dem-file`` takes priority, if set.\n\n--t_srs <string>\n    Specify a GDAL projection string instead of the datum (in WKT, GeoJSON, or\n    PROJ format). The datum from ``--dem-file`` takes priority, if set.\n\n--lon-lat-range <lon_min lat_min lon_max lat_max>\n    The longitude-latitude range in which to compute the RPC model.\n    Specify in the format: lon_min lat_min lon_max lat_max.\n\n--height-range <min_height max_height>\n    Minimum and maximum heights above the datum in which to compute\n    the RPC model.\n\n--dem-file <filename>\n    Compute the longitude-latitude-height box in which to fit the RPC camera as\n    the bounding box of the portion of this DEM that is seen by the input\n    camera.\n\n--num-samples <integer (default: 40)>\n    How many samples to use in each direction in the\n    longitude-latitude-height range.\n\n--penalty-weight <float (default: 0.03)>\n    A higher penalty weight will result in smaller higher-order RPC\n    coefficients.\n\n--save-tif-image\n    Save a TIF version of the input image that approximately\n    corresponds to the input longitude-latitude-height range and\n    which can be used for stereo together with the RPC model.\n\n--input-nodata-value <arg>\n    Set the image input nodata value.\n\n--output-nodata-value <arg>\n    Set the image output nodata value.\n\n-t, --session-type <string>\n    Select the input camera model type. Normally this is auto-detected,\n    but may need to be specified if the input camera model is in\n    XML format. See :numref:`ps_options` for options.\n\n--bundle-adjust-prefix <string>\n    Use the camera adjustment obtained by previously running\n    bundle_adjust with this output prefix.\n\n--image-crop-box <minx miny widx widy>\n    The output image and RPC model should not exceed this box,\n    specified in input image pixels as minx miny widx widy.\n\n--no-crop\n    Try to create an RPC model over the entire input image, even\n    if the input longitude-latitude-height box covers just a small\n    portion of it. Not recommended.\n\n--skip-computing-rpc\n    Skip computing the RPC model.\n\n--gsd <arg (default: -1)>\n    Expected resolution on the ground, in meters. This is needed\n    for SETSM.\n\n--threads <integer (default: 0)>\n    Select the number of threads to use for each process. If 0, use\n    the value in ~/.vwrc.\n\n--cache-size-mb <integer (default = 1024)>\n    Set the system cache size, in MB.\n\n--no-bigtiff\n    Tell GDAL to not create BigTiff files.\n\n--tif-compress <None|LZW|Deflate|Packbits (default: LZW)>\n    TIFF compression method.\n\n--tile-size <arg arg (default: 256 256)>\n    Image tile size used for multi-threaded processing.\n\n-v, --version\n    Display the version of software.\n\n-h, --help\n    Display this help message.\n"
  },
  {
    "path": "docs/tools/cam_gen.rst",
    "content": ".. _cam_gen:\n\ncam_gen\n-------\n\nThis program can create Pinhole (:numref:`pinholemodels`), Optical Bar\n(:numref:`panoramic`), and CSM (:numref:`csm`) camera models, given camera's\noptical center, focal length, pixel pitch, the longitude-latitude coordinates of\nthe camera image corners (or some other pixels) as measured on a DEM.\n\nThis tool can also approximate any camera supported by ASP, and produce a camera\ngiven geodetic coordinates of the camera center and roll, pitch, and yaw angles.\n\nA datum (and a height above it) can be used instead of the DEM. Normally all\nthese inputs are known only approximately, so the output camera model will not\nbe quite precise either, yet it could be good enough to refine later with bundle\nadjustment, which can also make use of the GCP file that this tool creates.\n\nThis program can be used with historical images (:numref:`kh4`) for which camera\nposition and orientation is not known. If the corners of the image on the ground\nare not known, they could be guessed in Google Earth. :numref:`skysat` makes use\nof ``cam_gen`` for SkySat images. It can also help avoid full Structure-from-Motion (:numref:`sfm`).\n\nThe accuracy of this tool decreases as the field of view becomes very narrow. In\nthat case it is suggested to use it to approximate a good known camera rather\nthan creating a camera from scratch given corner ground coordinates\n(:numref:`cam_gen_prior`). The ``sat_sim`` program (:numref:`sat_sim`) can also\ncreate cameras, taking into account the orbit and look angle of the camera.\n\nSee :numref:`cam_gen_validation` for how to validate the created cameras, and \n:numref:`initial_terrain` for how to find a reference DEM.\n\nUsage::\n\n      cam_gen [options] <image-file> -o <camera-file>\n\nExamples\n~~~~~~~~\n\n.. _cam_gen_pinhole:\n\nPinhole cameras\n^^^^^^^^^^^^^^^\n\nTo create a Pinhole (:numref:`pinholemodels`) camera, given the longitude and\nand latitude of the image corners and camera intrinsics, run::\n\n     cam_gen --refine-camera --lon-lat-values                             \\\n       '-122.389 37.627,-122.354 37.626,-122.358 37.612,-122.393 37.613'  \\\n        --reference-dem dem.tif --focal-length 553846.153846              \\\n        --optical-center 1280 540 --pixel-pitch 1                         \\\n        img.tif -o img.tsai --gcp-file img.gcp --gcp-std 1e-2\n\nThe image corners corresponding to the lon-lat values are traversed\nin the order (0, 0) (w, 0) (w, h), (0, h) where w and h are the\nimage width and height.\n\nSome other pixels can be used instead of image corners, with the\n``--pixel-values`` option. \n\nHere we assume that the pixel pitch is 1, hence both the focal length and the\noptical center are in units of pixels. If the focal length and pixel pitch are\ngiven in meters, and one assumes the optical center to be the center of the\nimage, then the optical center passed to this tool should be about half of the\nimage width and height, with both multiplied by the pixel pitch, to make them in\nmeters as well.\n\nThis procedure is not as accurate as approximating an existing camera\n(:numref:`cam_gen_prior`).\n  \nThe camera center, if known, can be set with the option ``--camera-center`` or\n``--camera-center-llh``. Otherwise the program will solve for it.\n\nLens distortion parameters, if needed, can be added manually to the produced\nfiles (:numref:`pinholemodels`).\n\nTo create the camera in the CSM Frame format (:numref:`csm`), ensure the output\ncamera has the ``.json`` extension instead of ``.tsai``.\n\nSee :numref:`cam_gen_validation` for how to validate the created cameras.\n\nOptical bar cameras\n^^^^^^^^^^^^^^^^^^^\n\nFor creating optical bar cameras, the camera parameters must be passed in using\nthe ``--sample-file`` option instead of specifying them all manually. An example\nis in :numref:`kh9`.\n\nFor fitting a CSM linescan camera to an Optical Bar camera, see\n:numref:`opticalbar2csm`.\n\n.. _cam_gen_prior:\n\nFit a prior camera\n^^^^^^^^^^^^^^^^^^\n\nThis tool can also create a Pinhole camera approximating any camera supported by\nASP, such as from ISIS cubes, RPC cameras, etc., as long as the intrinsics are\napproximately known. For that, it will shoot rays from the image corners (and also\nsome inner points) using the provided camera that will intersect the provided\nDEM, determining the footprint on the ground. This will be used to find the\nbest-fit pinhole model. \n\nIn this case, the corner longitude-latitude coordinates need not be specified.\n\nHere is an example for ISIS cameras::\n\n     cam_gen image.cub --input-camera image.cub     \\\n       --focal-length 1000 --optical-center 500 300 \\\n       --pixel-pitch 1                              \\\n       --gcp-std 1 --refine-camera                  \\\n       --reference-dem dem.tif                      \\\n       --height-above-datum 4000                    \\\n       -o output.tsai --gcp-file output.gcp \n\nHere we passed the image as the input camera, since for ISIS cubes (and\nalso for some RPC cameras) the camera information is not stored in a\nseparate camera file.\n\nIf desired to refine the intrinsics, including the focal length and lens\ndistortion, one has to produce CSM cameras (:numref:`cam_gen_frame`).\n\nEnsure the correct datum is passed for your planet, if a DEM is not used on\ninput. For example: ``--datum D_MARS``. \n\nThe ``--height-above-datum`` option will not be used if the input DEM covers the\nimage ground footprint.\n\nSee :numref:`cam_gen_validation` for how to validate the created cameras.\n\n.. _cam_gen_frame:\n\nCSM Frame cameras\n^^^^^^^^^^^^^^^^^\n\nThis program can create a CSM Frame camera (:numref:`csm`) given the ground\ncoordinates of the image corners and the camera intrinsics. The approach is in\n:numref:`cam_gen_pinhole`, except that the output camera has the ``.json``\nextension.\n\nIn addition, ``cam_gen`` can create a CSM Frame camera that approximates any\ngiven camera supported by ASP. In this mode, lens distortion is modeled as well.\n\nIf the input camera is Pinhole with radial-tangential (Tsai) distortion, or no\ndistortion at all (:numref:`pinholemodels`), it can be converted exactly to a CSM\nFrame model (with latest ASP), as::\n\n  cam_gen input.tif           \\\n    --input-camera input.tsai \\\n    -o output.json\n\nSee :numref:`cam_gen_validation` for how to validate the created cameras.\n\nFor any other camera or distortion type, the best-fit model is found. An\nadditional solver pass can be invoked, which can refine the intrinsics, that is,\nthe focal length, optical center, and the distortion coefficients. See the\n``--distortion`` option in :numref:`cam_gen_options` for the distortion model.\n\nGood initial guesses, especially for the focal length and optical center, are\nstill expected.\n\nExample::\n\n  cam_gen input.tif                             \\\n    --input-camera input.xml                    \\\n    --reference-dem dem.tif                     \\\n    --focal-length 30000                        \\\n    --optical-center 3000 2000                  \\\n    --pixel-pitch 1                             \\\n    --refine-camera                             \\\n    --refine-intrinsics focal_length,distortion \\\n    -o output.json\n\nHere it was assumed that the pixel pitch was 1. The pixel pitch can also be in\nmillimeters, but then the focal length and optical center must be in the same\nunits. Upon conversion to CSM Frame cameras, the focal length is kept as-is, but\nthe optical center is divided by the pixel pitch, as CSM expects pixel units. \n\nIt is suggested to not optimize the optical center (at least in a first pass),\nas that correlates with the camera pose and can lead to an implausible solution.\nThe ``--distortion`` option need not be set, as the program will try to figure\nthat out.\n\nIf invoked with ``--refine-intrinsics none``, the provided intrinsics will be\npassed to the CSM model, but then only the camera pose will be refined. This\nis different than just using ``--refine-camera`` alone, which does not support\nlens distortion.\n\nIf the camera model is contained within the image, pass the image to\n``--input-camera``. Instead of specifying the focal length, optical center,\nand distortion, one can pass a camera model having those to ``--sample-file``.\n\nTo transfer the intrinsics produced by the invocation above to another camera\nacquired with the same sensor, run::\n\n  cam_gen input2.tif            \\\n    --input-camera input2.xml   \\\n    --reference-dem dem.tif     \\\n    --pixel-pitch 1             \\\n    --refine-camera             \\\n    --refine-intrinsics none    \\\n    --sample-file output.json   \\\n    -o output2.json\n\nThe produced camera intrinsics can be jointly refined with other frame or\nlinescan cameras using ``bundle_adjust`` (:numref:`ba_frame_linescan`).\n\nSeveral lens distortion models are supported (option ``--distortion-type``,\n:numref:`cam_gen_options`).\n \nSee :numref:`cam_gen_validation` for how to validate the created cameras.\n\n.. _cam_gen_linescan:\n\nCSM linescan cameras\n^^^^^^^^^^^^^^^^^^^^\n\nThis program can take as input a linescan camera, such as WorldView\n(:numref:`dg_tutorial`), Pleiades (:numref:`pleiades`), ASTER (:numref:`aster`),\nand CSM (:numref:`csm`), and convert it to the CSM linescan model state format\n(:numref:`csm_state`). This allows one to use ASP with a combination of linescan\ncameras from different vendors and also with Frame cameras\n(:numref:`ba_frame_linescan`).\n\nAn example is as follows::\n\n    cam_gen --camera-type linescan       \\\n      input.tif --input-camera input.xml \\\n      -o output.json\n\nThe option ``--bundle-adjust-prefix`` can be used to apply an adjustment to the\ncamera on loading.\n\nFor fitting a CSM linescan camera to an Optical Bar camera, see\n:numref:`opticalbar2csm`.\n\nThe ``cam_test`` program (:numref:`cam_test`) can verify the agreement between\nthe input and output cameras. Do not specify the ``--bundle-adjust-prefix``\noption for such experiments, as the original camera does not have the adjustment\napplied to it, the produced one does, and ``cam_test`` will apply such an\nadjustment to both.\n\nIf desired to create linescan cameras to given specifications, use instead\n``sat_sim`` (:numref:`sat_sim`).\n\nSee :numref:`cam_gen_validation` for how to validate the created cameras.\n\n.. _opticalbar2csm:\n\nFit CSM to Optical Bar\n^^^^^^^^^^^^^^^^^^^^^^\n\nOptical bar cameras (:numref:`panoramic`) can be approximated very well by CSM\n(:numref:`csm`) linescan cameras. Example usage::\n\n    cam_gen --camera-type linescan \\\n        input.tif                  \\\n        --input-camera input.tsai  \\\n        -o output.json\n\nIt is very important to note that the images acquired with this sensor, such as\nfor KH-9 (:numref:`kh9`), are usually stored on disk with the scan lines parallel\nto image columns. The CSM linescan model assumes that the scan lines are parallel\nto the image lines.\n\nBecause of this, the invocation above does an in-sensor 90-degree clockwise\nrotation. The image must be rotated as well, to be consistent with the new camera. \n\nThe preferred way to rotate an image is with the ``image_mosaic`` option\n``--rotate-90`` (:numref:`image_mosaic`). This will handle large images, unlike\nthe ImageMagick ``convert`` program. \n\nThe input and output cameras are not directly comparable via ``cam_test``\n(:numref:`cam_test`) because of the in-sensor rotation, yet a sanity check of\nthe output camera against itself can take place. \n\nThese images and camera models can be compared with the help of mapprojection\n(:numref:`cam_gen_validation`). The original image and cameras are passed to one\nmapprojection command, then the new image and new camera to another. The resulting\nimages should agree at the pixel level.\n\n.. _cam_gen_extrinsics:\n\nGeodetic coordinates and angles\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nGiven a file named ``extrinsics.txt`` with lines of the form::\n\n  # image, lon, lat, height_above_datum, roll, pitch, yaw\n  img.tif, -95.092, 29.508, 1280.175, 0.073, 11.122, 144.002\n\nthe command::\n\n  cam_gen                       \\\n    --extrinsics extrinsics.txt \\\n    --sample-file sample.tsai   \\\n    --datum WGS84\n\nwill write for each line a camera model based on these measurements of camera\nposition and orientation. The heights are in meters, measured above the\nspecified datum. The camera model file is obtained from the image name \nby replacing the extension with ``.tsai``.\n\nThe three angles are applied in the order roll, pitch, yaw, starting from the\ncamera pointing straight down, which is the camera z axis. The yas is measured\nfrom the North direction (x axis).\n\nThe intrinsics are taken from the sample file, an example of which is in \n:numref:`file_format`. Only the focal length, optical center, lens distortion,\nand pixel pitch values from such a file are used. \n\nThe text file passed in to ``--extrinsics`` can have the entries in any order,\nand additional entries as well, as long as there is one-to-one correspondence\nbetween the names in the starting header line and the values in subsequent\nlines. All the desired named columns must exist, with these precise names.\nComma and space can be used as separators. Empty lines and lines starting with\nthe pound sign are ignored.\n\nSuch functionality can be helpful for processing images acquired with an\naircraft that records metadata in a list (:numref:`sfmicebridge`), or in EXIF\n(:numref:`sfm_uas`).\n\nSee :numref:`cam_gen_validation` for how to validate the created cameras.\n\n.. _cam_gen_rpc:\n\nExport RPC\n^^^^^^^^^^\n\nIf the input image has an associated RPC camera model (:numref:`rpc`), whether\nembedded in the image, or in a separate file with an .RPB or _RPC.TXT suffix,\nthe ``cam_gen`` program can export it to a separate XML file, as follows::\n\n    cam_gen             \\\n      --camera-type rpc \\\n      input.tif         \\\n      -o output.xml\n\nAn input camera in XML format can be explicitly specified via\n``--input-camera``, if not embedded in the image. Example::\n\n    cam_gen                     \\\n      --camera-type rpc         \\\n      input.tif                 \\\n      --input-camera camera.xml \\\n      -o output.xml\n\nSee the `GeoTiff RPC documentation\n<https://gdal.org/en/stable/drivers/raster/gtiff.html#georeferencing>`_ for how\nthe RPC model associated with an image is specified, and regarding the *order of\nlookup* if several candidates exist.\n\nTo create an RPC camera model from another camera type, or to refit an existing\none, use ``cam2rpc`` (:numref:`cam2rpc`).\n\nFurther refinement\n~~~~~~~~~~~~~~~~~~\n\nThe camera obtained using this tool (whether with or without the\n``--refine-camera`` option) can be re-optimized in\n``bundle_adjust`` using the GCP file written above as follows::\n\n     bundle_adjust img.tif img.tsai img.gcp -o run/run --datum WGS84 \\\n       --inline-adjustments --robust-threshold 10000\n\nIt is suggested that this is avoided by default. One has to be a bit careful\nwhen doing this optimization to ensure some corners are not optimized at the\nexpense of others. This is discussed in :numref:`camera_solve_gcp`.\n\nSee :numref:`kaguya_ba` regarding optimizing camera intrinsics.\n\n.. _cam_gen_validation:\n\nValidation\n~~~~~~~~~~\n\nIt is strongly suggested to mapproject the image with the obtained\ncamera to verify if it projects where expected::\n\n     mapproject dem.tif img.tif img.tsai img_map.tif\n\nThe output ``img_map.tif`` can be overlaid onto the hillshaded DEM in\n``stereo_gui`` (:numref:`stereo_gui`).\n\nUse ``cam_test`` program (:numref:`cam_test`) for sanity checks. This is \nparticularly helpful when ``cam_gen`` is used to approximate a prior \ncamera. Then these can be compared.\n\nThe ``sfm_view`` program (:numref:`sfm_view`) can be used to visualize the\ncameras in orbit.\n\nOne can invoke ``orbitviz`` (:numref:`orbitviz`)::\n\n     orbitviz img.tif img.tsai -o orbit.kml\n\nto create a KML file that can then be opened in Google Earth. It will display\nthe cameras above the planet. \n\n.. _cam_gen_options:\n\nCommand-line options\n~~~~~~~~~~~~~~~~~~~~\n\n-o, --output-camera-file <string (default: \"\")>\n    Specify the output camera file.\n\n--camera-type <string (default: \"pinhole\")>\n    Specify the output camera type. Options: ``pinhole``,  ``opticalbar``,\n    ``linescan`` (:numref:`cam_gen_linescan`), ``rpc`` (:numref:`cam_gen_rpc`).\n\n--lon-lat-values <string (default: \"\")>\n    A (quoted) string listing numbers, separated by commas or spaces,\n    having the longitude and latitude (alternating and in this\n    order) of each image corner or some other list of pixels given\n    by ``--pixel-values``. If the corners are used, they are traversed\n    in the order (0, 0) (w, 0) (w, h), (0, h) where w and h are the\n    image width and height.\n\n--pixel-values <string (default: \"\")>\n    A (quoted) string listing numbers, separated by commas or spaces,\n    having the column and row (alternating and in this order) of\n    each pixel in the raw image at which the longitude and latitude\n    is known and given by ``--lon-lat-values``. By default this is\n    empty, and will be populated by the image corners traversed as \n    mentioned at the earlier option.\n\n--reference-dem <string (default: \"\")>\n    Use this DEM to infer the heights above datum of the image corners.\n\n--datum <string (default: \"\")>\n    Use this datum to interpret the longitude and latitude, unless a\n    DEM is given.\n    Options:\n\n    * WGS_1984\n    * D_MOON (1,737,400 meters)\n    * D_MARS (3,396,190 meters)\n    * MOLA (3,396,000 meters)\n    * NAD83\n    * WGS72\n    * NAD27\n    * Earth (alias for WGS_1984)\n    * Mars (alias for D_MARS)\n    * Moon (alias for D_MOON)\n\n--height-above-datum <float (default: 0.0)>\n    Assume this height above datum in meters for the image corners\n    unless read from the DEM.\n\n--sample-file <string (default: \"\")>\n    Read the camera intrinsics from this file. Required for optical bar cameras.\n    See :numref:`kh9`, :numref:`file_format`, and :numref:`panoramic`.\n\n--focal-length <float (default: 0.0)>\n    The camera focal length. If ``--pixel-pitch`` is in millimeters, this \n    must be in millimeters as well.\n\n--optical-center <float float (default: NaN NaN)>\n    The camera optical center (horizontal and vertical components). If\n    ``--pixel-pitch`` is in millimeters, this must be in millimeters as well. If\n    not specified for pinhole cameras, it will be set to image center (half of\n    image dimensions) times the pixel pitch. The optical bar camera always uses\n    the image center.\n\n--pixel-pitch <float (default: 0.0)>\n    The camera pixel pitch, that is, the width of a pixel. It can be in millimeters,\n    and then the focal length and optical center must be in millimeters as well.\n    If set to 1, the focal length and optical center are in units of pixel. \n\n--distortion <string (default: \"\")>\n    Distortion model parameters. It is best to leave this blank and have the\n    program determine them. By default, the OpenCV `radial-tangential lens\n    distortion\n    <https://docs.opencv.org/3.4/dc/dbb/tutorial_py_calibration.html>`_ model is\n    used. Then, can specify 5 numbers, in quotes, in the order k1, k2, p1, p2,\n    k3. Also supported are the radial distortion model with 3 parameters, k1,\n    k2, and k3, and the transverse model, which needs 20 values. The latter are the\n    coefficients of a pair of polynomials of degree 3 in x and y. Only\n    applicable when creating CSM Frame cameras. The default is zero distortion.\n    See also ``--distortion-type``.\n\n--distortion-type <string (default: \"radtan\")>\n    Set the distortion type. Options: ``radtan``, ``radial``, ``transverse``.\n    Only applicable when creating CSM Frame cameras (:numref:`cam_gen_frame`).\n\n--camera-center <double double double (default: NaN NaN NaN)>\n    The camera center in ECEF coordinates. If not set, the program will solve\n    for it. If setting ``--refine-camera``, consider using ``--cam-ctr-weight``.\n    See also ``--camera-center-llh``.\n\n--camera-center-llh <double double double (default: NaN NaN NaN)>\n    The camera center in longitude, latitude, and height above datum. See also: \n    ``--camera-center``. \n    \n--refine-camera\n    After a rough initial camera is obtained, refine it using least squares.\n    This does not support distortion. For CSM Frame cameras, a more powerful\n    solver is available, see option ``--refine-intrinsics``. Consider not \n    refining the camera here, but having ``bundle_adjust`` take in the camera\n    as-is, together with GCP.\n\n--refine-intrinsics <string (default: \"\")>\n    Refine the camera intrinsics together with the camera pose. Specify, in\n    quotes or with comma as separator, one or more of: ``focal_length``,\n    ``optical_center``, ``other_intrinsics`` (same as ``distortion``).\n    Also can set as ``all`` or ``none``. In the latter mode only the camera pose\n    is optimized. Applicable only with option ``--input-camera`` and when\n    creating a CSM Frame camera model (:numref:`cam_gen_frame`). \n        \n--frame-index <string (default: \"\")>\n    A file used to look up the longitude and latitude of image\n    corners based on the image name, in the format provided by the\n    SkySat video product.\n\n--gcp-file <string (default: \"\")>\n    If provided, save the image corner coordinates and heights in\n    the GCP format to this file.\n\n--gcp-std <double (default: 1.0)>\n    The standard deviation for each GCP pixel, if saving a GCP file.\n    A smaller value suggests a more reliable measurement, hence\n    will be given more weight.\n\n--input-camera <string (default: \"\")>\n    Create a camera approximating this camera. See the examples above\n    and in :numref:`skysat_stereo` for various applications.\n\n--extrinsics <string (default: \"\")>\n    Read a file having on each line an image name and extrinsic parameters as\n    longitude, latitude, height above datum, roll, pitch, and yaw. Write one\n    .tsai camera file per image. See :numref:`cam_gen_extrinsics`.\n    \n--cam-height <float (default: 0.0)>\n    If both this and ``--cam-weight`` are positive, enforce that the output\n    camera is at this height above datum.\n    \n--cam-weight <float (default: 0.0)>\n    If positive, try to enforce the option ``--cam-height`` with this weight (a\n    bigger weight means try harder to enforce).\n\n--cam-ctr-weight <float (default: 0.0)>\n    If positive, try to enforce that during camera refinement the camera center\n    stays close to the initial value (a bigger weight means try harder to\n    enforce this, a value like 1000 is good enough).\n\n-t, --session-type <string (default: \"\")>\n    Select the input camera model type. Normally this is auto-detected,\n    but may need to be specified if the input camera model is in\n    XML format. See :numref:`ps_options` for options.\n\n--bundle-adjust-prefix <string (default: \"\")>\n    Use the camera adjustment obtained by previously running\n    bundle_adjust when providing an input camera.\n\n--threads <integer (default: 0)>\n    Select the number of threads to use for each process. If 0, use\n    the value in ~/.vwrc.\n \n--cache-size-mb <integer (default = 1024)>\n    Set the system cache size, in MB.\n\n--tile-size <integer (default: 256 256)>\n    Image tile size used for multi-threaded processing.\n\n--no-bigtiff\n    Tell GDAL to not create BigTiff files.\n\n--tif-compress <None|LZW|Deflate|Packbits (default: LZW)>\n    TIFF compression method.\n\n-v, --version\n    Display the version of software.\n\n-h, --help\n    Display this help message.\n"
  },
  {
    "path": "docs/tools/cam_test.rst",
    "content": ".. _cam_test:\n\ncam_test\n--------\n\nThis tool compares two camera models for the same image, or a camera\nmodel against itself. It finds the camera center and ray direction at a\nset of sampled pixels for both cameras and checks how they\ndiffer. Then, it projects pixels to the datum using the first camera\nand back-projects the resulting ECEF points into the second camera, and\nestimates the pixel discrepancy.\n\nIt prints the average time (in milliseconds) for the operation of\nprojecting from the camera to the ground and back.\n\nExamples\n~~~~~~~~\n\nSee :numref:`examples` for information on the camera types used below.\n\nCompare a CSM camera model against itself::\n\n  cam_test --image input.cub --cam1 input.json --cam2 input.json \\\n    --session1 csm --session2 csm\n\nCompare a PeruSat-1 exact linescan model to its RPC\napproximation::\n\n    cam_test --image input.tif --cam1 exact_cam.xml --cam2 rpc_cam.xml\n\nHere the two individual camera types will be auto-guessed as ``perusat`` and\n``rpc``, or can be specified as above with ``--session1`` and ``--session2``.\n\nCompare ISIS to CSM cameras::\n\n    cam_test --image input.cub --cam1 input.cub --cam2 input.json \\\n      --sample-rate 5000\n\nCompare the exact and RPC model stored in the same DigitalGlobe / Maxar file::\n\n    cam_test --image input.tif --cam1 input.xml --cam2 input.xml \\\n      --session1 dg --session2 rpc --sample-rate 1000\n\nEvaluate a camera transformed with ``convert_pinhole_model`` \n(:numref:`convert_pinhole_model`). In this case the session names\nwould be the same but the cameras would differ::\n\n    cam_test --image input.tif --cam1 in.tsai --cam2 out.tsai \\\n      --session1 pinhole --session2 pinhole\n\nHere we evaluate a CSM camera against itself, with\nno .cub image file. The image dimensions are contained in the camera\nfile. This verifies that the ground-to-image and image-to-ground\nfunctions are inverse of each other, up to a certain tolerance.\n\n::\n\n    cam_test --image input.json --cam1 input.json --cam2 input.json \\\n      --session1 csm --session2 csm --sample-rate 100               \\\n      --subpixel-offset 0.3\n\nUsage\n~~~~~\n\n::\n\n    cam_test --image <image file> --cam1 <camera 1 file> \\\n      --cam2 <camera 2 file> [other options]\n\nCommand-line options\n~~~~~~~~~~~~~~~~~~~~\n\n--image <string>\n    Image file.\n\n--cam1 <string>\n    Camera 1 file.\n\n--cam2 <string>\n    Camera 2 file.\n\n--session1 <string>\n    Session to use for camera 1 (if not provided it will be guessed).\n\n--session2 <string>\n    Session to use for camera 2 (if not provided it will be guessed).\n\n--sample-rate <integer (default: 100)>\n    Use one out of these many pixels when sampling the image.\n\n--subpixel-offset <double (default: 0.0)>\n    Add to each integer pixel this offset (in x and y) when sampling\n    the image. Sampling at non-integer location may make testing\n    more thorough.\n\n--single-pixel <double double (default: nan nan)>\n    Instead of sampling pixels from the image use only this pixel.\n\n--print-per-pixel-results\n    Print the results at each pixel.\n\n--datum <string>\n    Set the datum. This will override the datum from the input cameras. Usually\n    needed only for Pinhole cameras, when the camera does not have the datum\n    information. Options: WGS_1984, D_MOON (1,737,400 meters), D_MARS (3,396,190\n    meters), MOLA (3,396,000 meters), NAD83, WGS72, and NAD27. Also accepted:\n    Earth (=WGS_1984), Mars (=D_MARS), Moon (=D_MOON).\n\n--height-above-datum <double (default: 0.0)>\n    Let the ground surface be at this height above the datum (measured in\n    meters).\n\n--bundle-adjust-prefix <string (default = \"\")>\n    Adjust the cameras using this prefix (:numref:`bundle_adjust`).\n\n--cam1-bundle-adjust-prefix <string (default = \"\")>\n    Adjust the first camera using this prefix.\n\n--cam2-bundle-adjust-prefix <string (default = \"\")>\n    Adjust the second camera using this prefix.\n    \n--cache-size-mb <integer (default = 1024)>\n    Set the system cache size, in MB.\n\n--bathy-plane <string>\n    Read from this file a bathy plane, so a water surface which is a plane in\n    local projected coordinates (:numref:`bathy_plane_def`). A ray from the\n    camera to the ellipsoid determined by ``--height-above-datum`` that\n    encounters this bathy plane along the way will get bent according to Snell's\n    law. Same for a ray going in reverse.\n\n--refraction-index <double (default: 1.0)>\n    The index of refraction of water to be used in bathymetry correction.\n    Must be bigger than 1. This index can be computed with :ref:`refr_index`.\n    \n-h, --help\n    Display the help message.\n"
  },
  {
    "path": "docs/tools/camera_calibrate.rst",
    "content": ".. _camera_calibrate:\n\ncamera_calibrate\n----------------\n\nOverview\n~~~~~~~~\n\nThe ``camera_calibrate`` tool can generate camera models suitable for use by\n``camera_solve`` (:numref:`camera_solve`), and other ASP tools. This program\nonly solves for intrinsic camera parameters. To obtain the camera pose you\nshould use ``camera_solve``. \n\nThis tool is a wrapper around the `OpenCV camera calibration\n<https://docs.opencv.org/4.x/dc/dbb/tutorial_py_calibration.html>`_ software,\nwhich takes care of converting the output into readily usable formats.\n\nOther tools\n~~~~~~~~~~~\n\nASP also ships the ``rig_calibrator`` program (:numref:`rig_calibrator`),\nwhich calibrates the intrinsic and extrinsics of a rig of cameras, without\nusing a calibration target.\n\nThe ``bundle_adjust`` program can refine the intrinsics and extrinsics of\ncameras, and can also constrain against a known well-aligned terrain (:numref:`floatingintrinsics`).\n\nExample\n~~~~~~~\n\n::\n\n    camera_calibrate --box-size-cm 4.28625 outputFolder \\\n      12 12 \"images/image*.jpg\"\n\nHere, the checkerboard pattern has 13 squares in each direction, so \n12 inner corners. \n\nHow to use\n~~~~~~~~~~\n\n::\n\n     camera_calibrate [options] <output folder> \\\n        <num inner vertical corners>            \\\n        <num inner horizontal corners>          \\\n        <image wildcard>\n\nWhen you run the tool, three camera model files will be created in the output\nfolder: ``solve_cam_params.txt``, ``vw_cam_params.tsai``, and\n``ocv_cam_params.yml``. The first file can be used as a camera calibration file\nfor ``camera_solve``. The second file is a pinhole camera format that\nis recognized by ASP but remember that the extrinsic parameters were not solved\nfor so ASP is limited in what it can do with the camera file. The last file\ncontains the camera information as formatted by the OpenCV calibration tool. \n\nIf you use the first file as an input to ``camera_solve`` you must remember to\nreplace the wildcard image path in the file with the one to the images you want\nto use solve for (as opposed to the checkerboard images).\n\nIn order to use this tool you must provide multiple images of the same\ncheckerboard pattern acquired with the camera you wish to calibrate. When\ncalling the tool you must specify the number of *inner* square corners contained\nin your checkerboard pattern (width and height can be swapped) so that OpenCV\nknows what to look for. \n\nYou must also specify an image wildcard path such as ``\"checkers/image*.jpg\"``.\nThis must be in quotes so that the wildcard is not expanded before it is passed\nto the tool. If you do not provide the ``--box-size`` parameter, the output\ncalibration numbers will be unitless.\n\nCommand-line options\n~~~~~~~~~~~~~~~~~~~~\n\n-h, --help\n    Display this help message.\n\n--overwrite\n    Recompute any intermediate steps already completed on disk.\n\n--suppress-output\n    Reduce the amount of program console output.\n\n--box-size-cm <float>\n    The size of the checkerboard squares in centimeters.\n\n--duplicate-files\n    Make a copy of the VisionWorkbench parameter file for each input camera.\n"
  },
  {
    "path": "docs/tools/camera_footprint.rst",
    "content": ".. _camera_footprint:\n\ncamera_footprint\n----------------\n\nThe ``camera_footprint`` program computes what the footprint of an image would be\nif mapprojected (:numref:`mapproject`) onto the provided DEM or datum.\n\nThe bounding box of the footprint is printed to the screen. It will be in units\nof the DEM projection, or in longitude-latitude if a datum is provided. These\ncan be overridden with ``--t_srs``. The estimated ground sample distance will be\nprinted as well, in the same units.\n\nThis tool can be useful for debugging camera orientations or getting a quick\noverview of where the input image is located on the ground.\n\nSave as shapefile\n~~~~~~~~~~~~~~~~~\n\nIf a shapefile output path is provided, this program will also create a shapefile\ncontaining the convex hull of the footprint. The coordinate system will be determined,\nas above, depending on whether ``--t_srs``, ``--dem-file``, or ``--datum`` is used.\n\nExample::\n    \n    camera_footprint     \\\n      --dem-file dem.tif \\\n      image.tif          \\\n      camera.tsai        \\\n      --output-shp footprint.shp\n\nSuch a shapefile can be displayed and overlaid on top of georeferenced images     \nwith ``stereo_gui`` (:numref:`plot_poly`).\n  \nSave as KML\n~~~~~~~~~~~\n\nIf a KML output path is provided, this program will also create a KML file\ncontaining the footprint.\n\nThe KML will show a box with an X pattern displaying the points ASP used to\ncompute the footprint. If the provided DEM is smaller than the image footprint,\nadditional point samples may be drawn within the image footprint, as the DEM is\nsampled.\n\nThe entries in the KML file will be in longitude-latitude coordinates.\n\nExample::\n\n    camera_footprint     \\\n      --dem-file dem.tif \\\n      image.tif          \\\n      camera.tsai        \\\n      --output-kml footprint.kml\n\nProject onto a datum\n~~~~~~~~~~~~~~~~~~~~\n\nIf a DEM is not provided, the program will project onto a datum instead. For\nthat, use an option such as ``--datum WGS_1984`` instead of ``--dem-file``.\n\nUsage\n~~~~~\n\n::\n\n     camera_footprint [options] <camera-image> <camera-model>\n\nCommand-line options\n~~~~~~~~~~~~~~~~~~~~\n\n--dem-file <filename>\n    Intersect with this DEM instead of a datum.\n\n--datum <string>\n    Use this datum to interpret the heights. Options are: WGS_1984,\n    D_MOON, D_MARS, and MOLA.\n\n--t_srs <proj string>\n    Specify the georeference projection (PROJ or WKT) string.\n\n-t, --session-type\n    Select the stereo session type to use for processing. Normally\n    this is autodetected.\n\n--bundle-adjust-prefix <string>\n    Use the camera adjustment obtained by previously running\n    bundle_adjust with this output prefix.\n\n--output-shp <string>\n    Save the convex hull of the points sampled on the camera footprint as a\n    shapefile with this name.\n    \n--output-kml <string>\n    Write an output KML file at this location.\n\n--quick\n    Use a faster but less accurate computation.\n\n-h, --help\n    Display the help message.\n\n"
  },
  {
    "path": "docs/tools/camera_solve.rst",
    "content": ".. _camera_solve:\n\ncamera_solve\n------------\n\nThe ``camera_solve`` tool takes as input a set of images acquired with\na camera, and finds each camera's pose (position and orientation). If\nground control points are provided, the resulting set of cameras is\ntransformed to be in a desired coordinate system. For more context and \nexamples see :numref:`sfm`.\n\nOverview\n~~~~~~~~\n\nThis tool is a wrapper around the `TheiaSfM <https://github.com/sweeneychris/TheiaSfM>`_\nstructure-from-motion software, and its goal is to create camera models which\ncan later be used with ASP's bundle adjustment (:numref:`bundle_adjust`)\nand stereo (:numref:`tutorial`). \n\nThe camera calibration passed with the ``--calib-file`` option\nshould be a .tsai pinhole camera model file in one of the formats\ncompatible with ASP. Our supported pinhole camera models are described\nin :numref:`pinholemodels`.\n\nOne can use a set of estimated camera positions to register camera\nmodels in world coordinates. This method is not as accurate as using\nground control points but it may be easier to use. To do this, use the\n``--camera-positions`` parameter to ``bundle_adjust`` via the\n``--bundle-adjust-params`` option similar to the example line below. If\nyou see the camera models shifting too far from their starting positions,\ntry using the ``--camera-weight`` option to restrain their movement.\n\nThis tool will generate two .tsai camera model files in the output\nfolder per input image. The first file, appended with .tsai, is in a\nlocal coordinate system and does not include optimizations for intrinsic\nparameters but it may be useful for debugging purposes. The second file,\nappended with .final.tsai, contains the final solver results. If ground\ncontrol points or estimated camera positions were provided, then the\nsecond file will be in a global coordinate system.\n\nThis program produces somewhat different results each time it is run.\n\nA related tool is ``theia_sfm`` (:numref:`theia_sfm`).\n\nFlags file\n~~~~~~~~~~\n\nTo customize the options passed to Theia, edit the flag file which is saved in\neach output folder and pass it back to ``camera_solve`` via\n``--theia-flagfile``, or use the option ``--theia-overrides``.\n\nIn particular, setting ``--feature_density=DENSE`` in the flags file can be of\ngreat help if there are not enough matches between images. The option \n``--matching_strategy=CASCADE_HASHING`` can greatly speed up finding matches.\n\nExample\n~~~~~~~\n\n::\n\n    camera_solve                                               \\\n      --theia-overrides '--matching_strategy=CASCADE_HASHING'  \\\n      --bundle-adjust-params '--camera-positions nav.csv\n      --csv-format 1:file,12:lat,13:lon,14:height_above_datum' \\\n      <other options>\n\nThe produced Theia reconstruction can be visualized with ``view_reconstruction``\n(:numref:`view_reconstruction`).\n\nUsage\n~~~~~\n\n::\n\n   camera_solve [options] <output folder> <input images>\n\nCommand-line options\n~~~~~~~~~~~~~~~~~~~~\n\n--datum <string>\n    The datum to use when calibrating. Default is WGS84.\n\n--calib-file <filename>\n    Path to an ASP compatible pinhole model file containing camera\n    model information. The position and pose information will be\n    ignored. To use a unique file for each input image, pass a\n    space-separated list of files surrounded by quotes.\n\n--gcp-file <filename>\n    Obsolete option for specifying GCP. One or more GCP files will be\n    recognized and loaded if ending with .gcp, without this option.\n\n--bundle-adjust-params <string>\n    Additional parameters (in single quotes) to pass to the\n    ``bundle_adjust`` tool.\n\n--theia-overrides <string>\n    Override any option in the auto-generated Theia flag file.  Set\n    as ``\"--option1=val1 --option2=val2 ...\"``. The option\n    ``--random_seed=1`` is passed to Theia by default, to ensure\n    reproducible results. This can be overridden with\n    ``--theia-overrides \"--random_seed=0\"``, which seeds with\n    current time, producing different results on each run.\n\n--theia-flagfile <filename>\n    Path to a custom Theia flagfile to use settings from. File paths\n    specified in this file are ignored.\n\n--overwrite\n    Recompute any intermediate steps already completed on disk.\n\n--reuse-theia-matches\n    Pass Theia's computed interest point matches to bundle adjustment\n    instead of recreating them. This is ignored as it is the default.\n\n--suppress-output\n    Reduce the amount of program console output.\n\n--threads <integer (default: 0)>\n    Number of threads to use. If set to 0, will use 16 threads.\n\n-h, --help\n    Display this help message.\n\n"
  },
  {
    "path": "docs/tools/cgal_tools.rst",
    "content": ".. _cgal_tools:\n\nCGAL tools\n----------\n\nASP distributes in the ``bin`` directory the following CGAL tools for\nmanipulating meshes in .ply format, which are produced with the\n``multi_stereo`` (:numref:`multi_stereo`) and ``voxblox_mesh``\n(:numref:`voxblox_mesh`) tools::\n\n- rm_connected_components\n- smoothe_mesh\n- fill_holes\n- simplify_mesh\n\nThese tools can be built and used independently of ASP. See the\n`source code and build instructions\n<https://github.com/NeoGeographyToolkit/cgal_tools>`_.\n\nExamples\n~~~~~~~~\nRemove small connected components from the mesh::\n\n    num_min_faces_in_component=100\n    num_components_to_keep=10\n    rm_connected_components                  \\\n      $num_min_faces_in_component            \\\n      $num_components_to_keep                \\\n      <input_mesh.ply> <output_mesh.ply>\n\nMesh smoothing::\n\n    num_iter=1; smoothing_time=5e-5; smoothe_boundary=1\n    smoothe_mesh                                  \\\n      $num_iter $smoothing_time $smoothe_boundary \\\n      <input_mesh.ply> <output_mesh.ply>\n\nHole-filling::\n\n    max_hole_diameter=0.8\n    max_num_hole_edges=100\n    fill_holes                               \\\n      $max_hole_diameter $max_num_hole_edges \\\n      <input_mesh.ply> <output_mesh.ply>\n\nMesh simplification::\n\n    edge_keep_ratio=0.2\n    simplify_mesh $edge_keep_ratio       \\\n      <input_mesh.ply> <output_mesh.ply>\n\nIt is very strongly recommended to first run these tools on small\nmeshes to get a feel for how they work. Meshlab can be used\nto inspect the results.\n\n\n"
  },
  {
    "path": "docs/tools/colormap.rst",
    "content": ".. _colormap:\n\ncolormap\n--------\n\nThe ``colormap`` tool reads a DEM or some other single-channel image,\nand writes a corresponding color-coded image that can be used\nfor visualization.\n\nUsage::\n\n    colormap [options] <input DEM>\n\nExample::\n\n    colormap --min -5 --max 10 image.tif\n\nThis will produce ``image_CMAP.tif``, with the \"hottest\" color\ncorresponding to pixel values at least 10, and the \"coolest\" color\nrepresenting pixel values less than or equal to -5.\n\nTo create a hillshaded (:numref:`hillshade`) colormap of a DEM, run::\n\n    colormap --hillshade -e 25 -a 300 dem.tif -o color-shaded.tif\n    \nAlternatively, run::\n\n    hillshade -e 25 -a 300 dem.tif -o shaded.tif\n    colormap dem.tif -s shaded.tif -o color-shaded.tif\n\nThe second approach can incorporate any type of grayscale image as\na multiplier to the colorized image.\n\nSee :numref:`visualizing_results` for a discussion of ASP's visualization\ntools, including this one.\n\nTo add a colorbar and axes, use ``stereo_gui`` (:numref:`colorize`).\n\n.. figure:: ../images/colormaps.png\n   :name: Colormaps\n\n   Example of images produced with the following colormaps (left to\n   right, and top-down): ``binary-red-blue`` (default), \n   ``jet``, ``black-body``, ``viridis``, ``kindlmann``,\n   ``cubehelix``, ``plasma``, ``inferno``, ``rainbow``, ``turbo``\n   (`source1\n   <http://www.kennethmoreland.com/color-advice/>`_, `source2\n   <https://matplotlib.org/stable/tutorials/colors/colormaps.html>`_).\n\n\nUsing your own colormap\n^^^^^^^^^^^^^^^^^^^^^^^\n\nBoth this tool and ``stereo_gui`` (:numref:`stereo_gui`) accept a\nuser-defined colormap. It should be in a file named, for example,\n``mycolormap``, and can be passed to these tools via ``--colormap-style\nmycolormap``.  Such a file must be in plain text, with four columns\nhaving on each row a floating point number (increasing from 0 to 1),\nthen 3 integers between 0 and 255, corresponding to the RGB components\nof a color.\n\nHere's an example Python code which creates a custom colormap, by \nexporting it from a `matplotlib colormap\n<https://matplotlib.org/stable/tutorials/colors/colormaps.html>`_::\n\n    #!/usr/bin/python\n    \n    from matplotlib import cm\n    \n    # colormap name goes here, e.g., 'turbo'\n    cmap = cm.turbo \n    num = cmap.N\n    for i in range(num):\n       rgba = cmap(i)\n       print(i / float(num - 1),\n             round(255 * rgba[0]),\n             round(255 * rgba[1]),\n             round(255 * rgba[2]))\n\nSave this script as ``export_colormap.py``, and run it as::\n\n    python ~/bin/export_colormap.py > mycolormap\n\nCommand-line options for ``colormap``\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n-o, --output-file <filename>\n    Specify the output file.\n\n--colormap-style <string (default=\"binary-red-blue\")>\n    Specify the colormap style.  Options: ``binary-red-blue``\n    (default), ``jet``, ``black-body``, ``viridis``, ``kindlmann``,\n    ``cubehelix``, ``plasma``, ``inferno``, ``rainbow``, ``turbo``.\n    Or specify the name of a file having the colormap, on each line of\n    which there must be a normalized or percentage intensity and the\n    three integer RGB values it maps to.\n\n--nodata-value <arg>\n    Remap the DEM default value to the min altitude value.\n\n--min <arg>\n    Minimum height of the color map.\n\n--max <arg>\n    Maximum height of the color map.\n\n--moon\n    Set the min and max height to good values for the Moon.\n\n--mars\n    Set the min and max height to good values for Mars.\n\n-s, --shaded-relief-file <filename>\n    Specify a shaded relief image (grayscale) to apply to the\n    colorized image. For example, this can be a hillshaded image.\n\n--hillshade\n    Create a hillshaded image first, then incorporate it in the\n    colormap. This is equivalent to using an external file with the\n    ``--shaded-relief-file`` option.\n\n-a, --azimuth <number-in-degrees (default: 300)> \n    Sets the direction that the light source is coming from (in\n    degrees). Zero degrees is to the right, with positive degrees\n    counter-clockwise. To be used with the ``--hillshade`` option.\n\n-e, --elevation <number-in-degrees (default: 20)>\n    Set the elevation of the light source (in degrees).\n    To be used with the ``--hillshade`` option.\n    \n--legend\n    Generate an unlabeled legend, will be saved as ``legend.png``.\n\n--threads <integer (default: 0)>\n    Select the number of threads to use for each process. If 0, use\n    the value in ~/.vwrc.\n\n--cache-size-mb <integer (default = 1024)>\n    Set the system cache size, in MB.\n\n--tile-size <integer (default: 256 256)>\n    Image tile size used for multi-threaded processing.\n\n--no-bigtiff\n    Tell GDAL to not create BigTiff files.\n\n--tif-compress <None|LZW|Deflate|Packbits (default: LZW)>\n    TIFF compression method.\n\n--cog\n    Write a cloud-optimized GeoTIFF (COG). See :ref:`cog_output`.\n\n-v, --version\n    Display the version of software.\n\n-h, --help\n    Display this help message.\n"
  },
  {
    "path": "docs/tools/convert_pinhole_model.rst",
    "content": ".. _convert_pinhole_model:\n\nconvert_pinhole_model\n---------------------\n\nThis tool can be used to approximately convert a pinhole model from one of the\ntypes listed in :numref:`pinholemodels` or an optical bar model\n(:numref:`panoramic`) to any other pinhole model type. \n\nThis can be convenient, for example, because for the Brown-Conrady and\nPhotometrix models the distortion operation is iterative and slow, and by\nconverting to a Tsai or Adjustable Tsai model this operation can be sped up.\n\nThis program can also be used to convert a pinhole or optical bar model to a\npinhole model with RPC lens distortion (:numref:`rpc_distortion`), which is a\nmodel where distortion is expressed as a ratio of polynomials. \n\nThe degree of the RPC lens distortion can be specified via\n``--rpc-degree``. A smaller value is suggested to start with, as\nlower-degree polynomials may be easier to interpret.\n\nUsage\n~~~~~\n\n::\n\n     convert_pinhole_model [options] <input image> <input camera> \\\n       -o <output camera>\n\nExamples\n~~~~~~~~\n\nConvert a camera model to have RPC lens distortion of degree 3::\n\n     convert_pinhole_model input.jpg input.tsai --output-type RPC \\\n       --rpc-degree 3 -o output_rpc.tsai\n\nRPC polynomials of degree up to 6 have been used successfully\n(:numref:`ba_rpc_distortion`, :numref:`dem2gcp`).\n\nSpecify the image dimensions instead of the image, and convert to radial-tangential\n(Tsai) lens distortion::\n\n     convert_pinhole_model input.tsai --output-type TsaiLensDistortion \\\n       --image-size \"5000 4000\" -o output.tsai\n\nValidation \n~~~~~~~~~~\n\nThe ``cam_test`` program (:numref:`cam_test`) can be used to project from the \ncamera to the ground using one of the models, and then back to the camera using\nthe converted model. Here is an example::\n\n  cam_test --image input.jpg --cam1 input.tsai --cam2 output.tsai \\\n    --session1 pinhole --session2 pinhole --datum D_MOON\n\nThe ``--datum`` defines the ground to use.\n\nThe produced statistics of pixel differences can be used to judge the quality of\nthe distortion model conversion.\n\nRefinement\n~~~~~~~~~~\n\nBundle adjustment can refine a produced camera model. For that, it is\nsuggested to have many overlapping images, a well-aligned terrain model to\nconstrain against, and to ensure that all images acquired with the same sensor\nshare the intrinsic parameters. A detailed recipe is in :numref:`kaguya_ba`.\n\nCommand-line options\n~~~~~~~~~~~~~~~~~~~~\n\n-o, --output-file <filename>\n    Specify the output file. It is expected to have the .tsai\n    extension.\n\n--output-type <string (default: TsaiLensDistortion)>\n    The output model type. Options: TsaiLensDistortion, BrownConradyDistortion,\n    RPC.\n\n--sample-spacing <number-of-pixels>\n    Pick one out of this many consecutive pixels to sample. If not\n    specified, it will be auto-computed.\n\n--rpc-degree <int (default: 3)>\n    The degree of the polynomials, if the output distortion model\n    is RPC.\n\n--camera-to-ground-dist <double (default: 0)>\n    The distance from the camera to the ground, in meters. This is\n    necessary to convert an optical bar model to pinhole.\n\n--image-size <\"int int\" (default: \"\")>\n    Image width and height, specified as two numbers in quotes and separated \n    by a space, unless the input image file is provided.\n\n--threads <integer (default: 0)>\n    Select the number of threads to use for each process. If 0, use\n    the value in ~/.vwrc.\n\n--cache-size-mb <integer (default = 1024)>\n    Set the system cache size, in MB.\n\n--tile-size <integer (default: 256 256)>\n    Image tile size used for multi-threaded processing.\n\n--no-bigtiff\n    Tell GDAL to not create BigTiff files.\n\n--tif-compress <None|LZW|Deflate|Packbits (default: LZW)>\n    TIFF compression method.\n\n-v, --version\n    Display the version of software.\n\n-h, --help\n    Display this help message.\n"
  },
  {
    "path": "docs/tools/corr_eval.rst",
    "content": ".. _corr_eval:\n\ncorr_eval\n---------\n\nThe ``corr_eval`` program takes as input left and right aligned images\nand a disparity, as produced by ``parallel_stereo``\n(:numref:`parallel_stereo`), and creates an image of same dimensions as\nthe left image, having a measure of the quality of the disparity at\neach pixel.  \n\nThe input disparity can be any of ``D.tif``, ``B.tif``, ``RD.tif``, or\n``F.tif``. (:numref:`outputfiles` describes these.)\n\nTwo quality metrics are supported, for the moment.\n\n- Normalized cross-correlation (NCC). For each left aligned image\n  pixel find the normalized cross-correlation between the patch of\n  dimensions given by the kernel size around that pixel and\n  corresponding patch in the right aligned image, as determined by the\n  disparity at that pixel. A higher value means a more reliable\n  disparity.\n\n  Since the disparity is floating-point, bilinear interpolation is\n  used in the right image (unless the flag ``--round-to-int`` is\n  set, when the disparity is rounded to int and no interpolation\n  happens). Pixels with no-data values and out-of-range pixels are\n  excluded from the calculation. Note that NCC is not\n  the zero-normalized cross-correlation, so there is no subtraction\n  from each pixel of the mean of all pixels in the patch.\n\n- Average of standard deviations of left and right matching patches.\n \nThe output image has no-data values at pixels where it could not\ncompute the desired metric.\n\nUsage::\n\n    corr_eval [options] <L.tif> <R.tif> <Disp.tif> <output prefix>\n\nExample for a disparity created with ``--stereo-algorithm asp_bm``::\n\n    corr_eval --prefilter-mode 2 --kernel-size 21 21 --metric ncc \\\n      run/run-L.tif run/run-R.tif run/run-RD.tif run/run\n\nExample for a disparity created with the ``asp_mgm`` algorithm::\n\n    corr_eval --prefilter-mode 0 --kernel-size 5 5 --metric ncc \\\n      run/run-L.tif run/run-R.tif run/run-RD.tif run/run\n\nThis will create ``run/run-ncc.tif``.\n\nIt appears that always using ``--prefilter-mode 2`` makes this tool\nproduce better results. This is to be investigated further. Consider\nalso experimenting with ``--kernel-size``.\n\nThe external stereo algorithms (:numref:`stereo_algos_full`) do not\nuse the prefilter mode, and each of them specifies the correlation\nkernel size in its own way.\n\nSee also the somewhat-related image correlator tool which can find the\ndisparity of two images without assuming camera information\n(:numref:`correlator-mode`).\n\nCommand-line options for ``corr_eval``:\n\n--kernel-size <integer integer (default: 21 21)>\n    The dimensions of image patches. These must be positive odd\n    numbers.\n\n--metric <string (default: ncc)>\n    The metric to use to evaluate the quality of correlation. Options:\n    ``ncc``, ``stddev``.\n\n--prefilter-mode <integer (default: 0)>\n    Prefilter mode. This is the same prefilter as in stereo\n    correlation (:numref:`stereodefault`) with the ``asp_bm``\n    method. Options: 0 (none), 1 (subtracted mean), 2 (LoG).\n\n--prefilter-kernel-width <float (default: 1.5)>\n    The diameter of the Gaussian convolution kernel for prefilter\n    modes 1 and 2. A value of 1.5 works well for ``LoG``, and 25 - 30 is \n    suggested for ``subtracted mean``.\n\n--sample-rate <integer (default: 1)>\n    Compute the quality image only at one out of this many rows and\n    columns, for speed. The output image size does not change. To shrink\n    it (say by 2x), run ``gdal_translate -r average -outsize 50% 50% in.tif out.tif``.\n\n--round-to-int\n    Round the disparity to integer and skip interpolation when finding\n    the right image patches. This make the program faster by a factor\n    of about 2, without changing significantly the output image.\n\n--threads <integer (default: 0)>  \n    Set the number of threads to use. By default use the number of\n    threads as given in .vwrc, which can be 8 or 16. (The actual\n    number will be printed when this program starts.) \n\n--cache-size-mb <integer (default = 1024)>\n    Set the system cache size, in MB.\n\n--tile-size <integer (default: 256 256)>\n    Image tile size used for multi-threaded processing.\n\n--no-bigtiff\n    Tell GDAL to not create BigTiff files.\n\n--tif-compress <None|LZW|Deflate|Packbits (default: LZW)>\n    TIFF compression method.\n\n-v, --version\n    Display the version of software.\n\n-h, --help\n    Display this help message.\n"
  },
  {
    "path": "docs/tools/correlator.rst",
    "content": ".. _correlator-mode:\n\nImage correlator\n----------------\n\nThe ``parallel_stereo`` program (:numref:`parallel_stereo`) can\nfunction purely as an image correlator, that is, it can find the\ndisparity between two given images without assuming any cameras are\npresent and without generating a point cloud.\n\nThis mode assumes that the images are already roughly aligned, up to a\ntranslation. Hence, the images can be either raw but with no large\nrotation/shear/scale differences, or mapprojected, or to be portions\nof aligned images ``L.tif`` and ``R.tif`` (:numref:`outputfiles`) as\ncreated by ASP itself.\n\nThe produced disparity map can be used for image alignment\n(:numref:`image_align`) and terrain alignment (:numref:`pc_corr`).\n\nSee also ``corr_eval`` (:numref:`corr_eval`) a program for estimating\nthe quality of the disparity at each pixel.\n\nExample::\n\n    parallel_stereo              \\\n      --correlator-mode          \\\n      --stereo-algorithm asp_mgm \\\n      --subpixel-mode 9          \\\n      left.tif right.tif         \\\n      run_corr/run\n\nThis will create the filtered subpixel disparity ``run_corr/run-F.tif``\n(:numref:`outputfiles`). This disparity can be preprocessed and inspected\n(:numref:`mask_disparity`).\n\nASP supports many stereo correlation algorithms (:numref:`stereo_alg_overview`).\nIt may be worth comparing the result of the ``asp_mgm`` algorithm with what is\nproduced from regular block matching (``asp_bm``), especially if the images are\nnoisy or differ in illumination.\n\nIf the expected search range is known, it can be specified with the option\n``--corr-search`` (:numref:`corr_section`). Low resolution disparity computation\ncan be skipped with ``--corr-seed-mode 0``. These can be helpful if interest\npoint matching or low-res disparity are problematic.\n\nIf the options ``--num-matches-from-disparity`` or\n``--num-matches-from-disp-triplets`` are specified, dense matches from disparity\nwill be produced (:numref:`stereodefault`). These can be used in bundle adjustment\n(:numref:`dense_ip`).\n\nAll the usual options of ``parallel_stereo`` apply. See :numref:`nextsteps` for\na discussion regarding various quality vs speed tradeoffs. Since the images are\nassumed to be aligned, the program will set the alignment method to ``none``.\n\nTo skip preprocessing (if invoked previously), or to avoid subpixel refinement\nor filtering, use the options ``--entry-point`` and ``--stop-point``.\n"
  },
  {
    "path": "docs/tools/dem2gcp.rst",
    "content": ".. _dem2gcp:\n\ndem2gcp\n-------\n\nThis program generates GCP (:numref:`bagcp`) based on densely measuring the\nmisregistration and/or warping between two DEMs, which helps correct these\neffects. The cause is usually inaccuracies in camera extrinsics or intrinsics,\nincluding lens distortion.\n\nThe approach is as follows. The dense disparity from an ASP-produced\nmisregistered or warped DEM to a correct reference DEM is found. This program\nwill take as input that disparity and interest point matches between the raw\nimages, and will produce GCP with correct ground positions based on the\nreference DEM.\n\nBundle adjustment with intrinsics optimization\n(:numref:`intrinsics_ground_truth`) or the jitter solver\n(:numref:`jitter_solve`) can then be invoked with the GCP to correct the issues.\n\nThis program was motivated by the processing of historical images\n(:numref:`kh4`), particularly the KH-7 and KH-9 panoramic images.\n\nASP DEM creation\n~~~~~~~~~~~~~~~~\n\nPrepare the images and camera models, such as in :numref:`kh9` or :numref:`kh7`.\nThis workflow expects the cameras to already incorporate any prior alignment or\nadjustments. Bundle adjustment (:numref:`bundle_adjust`) can apply such\ntransforms for Pinhole (:numref:`pinholemodels`), CSM (:numref:`csm`), and\nOpticalBar (:numref:`panoramic`) cameras.\n\nMapproject (:numref:`mapproject`) the images at the same appropriate resolution\n(close to native image GSD) onto the reference DEM.\n\nUse a local projection for mapprojection, such as UTM or stereographic. Run\nstereo with the mapprojected images (:numref:`mapproj-example`). Use the\n``asp_mgm`` algorithm with ``--subpixel-mode 9``\n(:numref:`stereo_alg_overview`). This will ensure the best quality. If more than\ntwo images, pairwise stereo can be run and the DEMs can be mosaicked with\n``dem_mosaic`` (:numref:`dem_mosaic`).\n\nOverlay the mapprojected images, produced DEM, and reference DEM in\n``stereo_gui`` (:numref:`stereo_gui`). These should be roughly in the same\nplace, but with some misregistration or warping.\n\nEnsure ``parallel_stereo`` was invoked to generate dense matches from disparity\n(:numref:`dense_ip`). It is suggested to use ``--num-matches-from-disparity\n100000`` or so. That is a very large number of interest points, but will help\nproduce sufficient GCP later on. \n\nThe number of matches can be reduced later for bundle adjustment with the option\n``--max-pairwise-matches``, and fewer GCP can be created with ``dem2gcp``\nas described below.\n\nThe dense match files should follow the *naming convention* for the original raw\nimages (:numref:`ba_match_files`). Sufficiently numerous sparse matches, as produced\nby bundle adjustment, will likely work as well.\n\nComparison with the reference DEM\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. figure:: ../images/kh7_dem_vs_ref.png\n   :name: kh7_dm_vs_ref\n   \n   A low-resolution KH-7 DEM produced by ASP (left) and a reference DEM (right).\n   These must be visually similar and with enough features for ``dem2gcp`` to work.\n   The DEMs can be overlaid to see if there is significant local warping.\n\nSome hole-filling and blur can be applied to the ASP DEM with ``dem_mosaic``\n(:numref:`dem_mosaic_blur` and :numref:`dem_mosaic_extrapolate`).\n\nFor example::\n\n    gdal_translate -r average -outsize 50% 50% dem.tif dem_small.tif\n    \ncan reduce the resolution. This likely will do a better job than ``gdalwarp``,\nwhich uses interpolation. \n\nThe two DEMs must be re-gridded to the same local projection and grid size.\nExample (adjust the projection center)::\n\n   proj='+proj=stere +lat_0=27.909 +lon_0=102.226 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs'\n   gdalwarp -tr 20 20 -t_srs \"$proj\" -r cubicspline dem_in.tif dem_out.tif\n\nIt is not required that the produced DEMs have precisely the same extent, but\nthis is strongly advised. This helps with visualizing the disparity between\nthe DEMs (see below) and allows for manual control of disparity via\n``--corr-search`` (:numref:`search_range`). The ``gdalwarp`` ``-te`` option can\nproduce datasets with a given extent.\n\nThe DEMs should be hillshaded. It is suggested to use the GDAL\n(:numref:`gdal_tools`) hillshading method, as it is more accurate than ASP's own\n``hillshade`` (:numref:`hillshade`). Here's an example invocation, to be applied\nto each DEM::\n\n    gdaldem hillshade   \\\n      -multidirectional \\\n      -compute_edges    \\\n      input_dem.tif     \\\n      output_dem_hill.tif\n\nInspect the hillshaded images in ``stereo_gui``. They should be similar enough\nin appearance and with a good range of values.\n\nConsider adjusting the lighting azimuth and elevation in the hillshade program\nto get good contrast. See the options ``-az`` and ``-alt`` in ``gdaldem\nhillshade``, and ``-a`` and ``-e`` in ASP's ``hillshade``.\n\nFind the dense disparity from the warped hillshaded DEM to the reference\nhillshaded DEM with ASP's correlator mode (:numref:`correlator-mode`)::\n\n  parallel_stereo              \\\n    --correlator-mode          \\\n    --stereo-algorithm asp_mgm \\\n    --subpixel-mode 9          \\\n    --ip-per-tile 500          \\\n    warped_hill.tif            \\\n    ref_hill.tif               \\\n    warp/run\n\nThe order of hillshaded images here is very important. Increase\n``--ip-per-tile`` if not enough matches are found. One could consider\nexperimenting with ASP's various stereo algorithms\n(:numref:`stereo_alg_overview`).\n\nInspect the bands of the produced disparity image ``warp/run-F.tif``. This\nrequires extracting the horizontal and vertical disparities, and masking the\ninvalid values, as in :numref:`mask_disparity`. These can be visualized, for\nexample, as follows::\n\n    stereo_gui --colorbar      \\\n      --min -100 --max 100     \\\n      warp/run-F_b1_nodata.tif \\\n      warp/run-F_b2_nodata.tif\n\nRunning ``dem2gcp``\n~~~~~~~~~~~~~~~~~~~\n\nThis command must be invoked with the warped ASP DEM and the reference DEM whose\nhillshaded versions were used to produce the disparity. Do not use here DEMs\nbefore cropping/regridding/blur applications, as those are not consistent with\nthe disparity.\n\n:: \n\n    dem2gcp                                            \\\n      --warped-dem asp_dem.tif                         \\\n      --ref-dem ref_dem.tif                            \\\n      --warped-to-ref-disparity warp/run-F.tif         \\\n      --left-image left.tif                            \\\n      --right-image right.tif                          \\\n      --left-camera left.tsai                          \\\n      --right-camera right.tsai                        \\\n      --match-file dense_matches/run-left__right.match \\\n      --max-pairwise-matches 50000                     \\\n      --max-num-gcp 20000                              \\\n      --gcp-sigma 1.0                                  \\\n      --output-gcp out.gcp\n\nHere we passed in the left and right raw images, the latest left and right\ncamera models that produced the warped DEM, and the dense matches between the\nraw images. \n\nIf there are more than two images, the \"warped\" DEM can be produced, for\nexample, by merging with ``dem_mosaic`` (:numref:`dem_mosaic`) individual\npairwise stereo DEMs (as long as these are consistent). Then, this program can\nbe called for the full image set as in :numref:`dem2gcp_multi_image`.\nAlternatively, this tool can be invoked pairwise for individual stereo DEMs,\ncreating many GCP files.\n\nThe match file need not have dense matches. It is only assumed that there are\nmany and well-distributed. Dense matches are produced from the disparity, so they\nare usually clean. Otherwise, one should consider clean match files loaded with\nthe option ``--clean-match-files-prefix``, as bundle adjustment is sensitive to\ninaccurate GCP.\n\nAll produced GCP files should be passed together with all images and cameras to\n``bundle_adjust``, as shown below.\n\nConsider using the option ``--max-disp`` if the disparity has portions that are\nnot accurate, such as when the ASP DEM and reference DEM were acquired at\ndifferent times and too much changed on the ground.\n\nNote the options ``--max-num-gcp`` and ``--max-pairwise-matches`` above. These\nare off by default.\n\n.. figure:: ../images/dem2gcp_ip_vs_gcp.png\n   :name: dem2gcp_ip_vs_gcp\n   \n   Interest point matches (left, in red) and produced GCP (right), on top of the raw images.\n   Flat areas do not have GCP. Plotted with ``stereo_gui`` (:numref:`stereo_gui`). \n\nPlotted in :numref:`dem2gcp_ip_vs_gcp` are the interest point matches and the\nresulting GCP. Their number is likely excessive here, though the bigger concern\nis if they are lacking over featureless terrain. \n\nSolving for extrinsics and intrinsics\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nWe employ the recipe from :numref:`heights_from_dem`, that mostly addresses\nthe vertical component of disagreement between the ASP-produced and reference\nDEMs. The added GCP mostly address the horizontal component.\n\nThe most recent bundle-adjusted and aligned cameras can be converted to use the\nRPC lens distortion model (:numref:`rpc_distortion`) as in\n:numref:`convert_pinhole_model`. Or, the cameras can be used as is.\n\nIf solving for intrinsics and using RPC lens distortion, the small RPC\ncoefficients *must be changed manually to be at least 1e-7* in older builds,\notherwise they will not get optimized. Here, RPC of degree 3 is used. A higher\ndegree can be employed, either initially, or for subsequent iterations. In the\nlatest builds this is done automatically by ``bundle_adjust`` (option\n``--min-distortion``).\n\nThe command when it is desired to refine the intrinsics as well::\n\n    bundle_adjust                                 \\\n      left_image.tif right_image.tif              \\\n      left_rpc_camera.tsai right_rpc_camera.tsai  \\\n      --inline-adjustments                        \\\n      --solve-intrinsics                          \\\n      --intrinsics-to-float all                   \\\n      --intrinsics-to-share none                  \\\n      --num-iterations 100                        \\\n      --match-files-prefix dense_matches/run      \\\n      --max-pairwise-matches 10000                \\\n      --remove-outliers-params '75.0 3.0 100 100' \\\n      --heights-from-dem ref_dem.tif              \\\n      --heights-from-dem-uncertainty 250          \\\n      out.gcp                                     \\\n      -o ba_rpc_gcp_ht/run\n\nClean matches are preferable when they do not come from the disparity.\nUse ``--clean-match-files-prefix`` instead of ``--match-files-prefix`` in that\ncase.\n\nCare must be taken to ensure that GCP are not overwhelmed by other constraints.\nSee :numref:`gcp_vs_tri` for a discussion.\n\nThis invocation can be sensitive to inaccurate GCP, as those do not use a robust\ncost function. That is why GCP should be produced with clean match files\n(:numref:`ba_match_files`), and the outlier filtering threshold used to create\nthose clean matches (``--remove-outliers-params``, :numref:`ba_options`) should\nbe no more than 5 to 10 pixels. Consider also using the ``bundle_adjust`` option\n``--max-gcp-reproj-err`` (:numref:`ba_options`) to remove worst GCP outliers.\nThe option ``--max-disp`` for ``dem2gcp`` can help with this as well.\n\nFor linescan cameras, the jitter solver can be invoked instead with a very\nsimilar command to the above (:numref:`jitter_solve`).\n\nExamine the pixel residuals before and after bundle adjustment\n(:numref:`ba_err_per_point`) in ``stereo_gui`` as::\n\n  stereo_gui --colorbar --min 0 --max 10             \\\n    ba_rpc_gcp_ht/run-initial_residuals_pointmap.csv \\\n    ba_rpc_gcp_ht/run-final_residuals_pointmap.csv\n\nIt should be rather obvious to see which residuals are from the GCP. These are\nalso flagged in those csv files.\n\n.. figure:: ../images/kh7_orig_vs_opt.png\n   :name: kh7_orig_vs_opt\n\n   Difference between the ASP DEM and reference DEM. The vertical range is -1000\n   m to 1000 m. From left-to-right: (a) no distortion modeling (b) modeling\n   distortion with RPC of degree 3 and optimizing with ``--heights-from-dem``\n   (c) additionally, use the GCP produced by ``dem2gcp``. The differences are\n   found with ``geodiff`` (:numref:`geodiff`) and plotted with ``stereo_gui``.\n\n.. figure:: ../images/kh7_dem.png\n   :name: kh7_fig2\n   \n   The unwarped ASP DEM that results in the right-most difference in the above\n   figure (within the green polygon), on top of the reference DEM. \n\nThen, one can rerun stereo with the optimized cameras and the original images\n(again with the option ``--prev-run-prefix``, or by doing a new run from\nscratch). The results are in :numref:`kh7_orig_vs_opt`. The warping is much\nreduced but not eliminated. \n\nWe further improved the results for KH-7 and KH-9 cameras by creating\nlinescan cameras (:numref:`opticalbar2csm`) and running ``jitter_solve``\nwith GCP (:numref:`jitter_solve`).\n\n.. _gcp_vs_tri:\n\nBalancing GCP against other constraints\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nWhen using GCP from ``dem2gcp`` in ``bundle_adjust`` or ``jitter_solve``,\ntriangulated points that lack GCP are still constrained by\n``--heights-from-dem`` or ``--tri-weight`` (:numref:`ba_options`). Both of\nthese anchor such points to their initial (potentially incorrect) positions. If\nthese points greatly outnumber the GCP, or have smaller uncertainties than GCP, \nthey can dominate the solution and prevent the GCP from correcting the cameras.\n\nTo avoid this:\n\n- Use a smaller value of ``--max-pairwise-matches`` and check how many triangulated\n  points without GCP have been loaded, vs GCP.\n- Increase ``--heights-from-dem-uncertainty`` so the DEM constraint is weaker.\n- Use a small value of ``--gcp-sigma``. It is however suggested not to have\n  this under one GSD.\n- Be aware that ``--tri-weight`` has the same anchoring effect as\n  ``--heights-from-dem`` and should be used with the same caution. Though this\n  constraint is usually weak and should not be an issue if triangulated points\n  without GCP are not more than ones with GCP.\n\n.. _dem2gcp_multi_image:\n\nMultiple images and cameras\n~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThis program can work with multiple images, cameras, and match files, as long as\nthe \"warped\" DEM is consistent with these datasets. In particular, this DEM can\neven be produced with Shape-from-Shading (:numref:`sfs`).\n\nThe match files can be specified via ``--match-files-prefix`` or\n``--clean-match-files-prefix``, in the manner of ``bundle_adjust``\n(:numref:`ba_match_files`).\n\n:: \n\n    dem2gcp                                    \\\n      --warped-dem asp_dem.tif                 \\\n      --ref-dem ref_dem.tif                    \\\n      --warped-to-ref-disparity warp/run-F.tif \\\n      --image-list image_list.txt              \\\n      --camera-list camera_list.txt            \\\n      --clean-match-files-prefix matches/run   \\\n      --max-pairwise-matches 50000             \\\n      --max-num-gcp 100000                     \\\n      --gcp-sigma 1.0                          \\\n      --output-gcp out.gcp\n\nHere, the entries in the camera list are usually after bundle adjustment, and\nthe ``matches/run`` prefix points to the interest point matches, such as\nproduced by ``bundle_adjust``, or with dense matching (:numref:`dense_ip`).\n\nAs before, care should be taken that the matches are clean. See\n:numref:`gcp_vs_tri` for how to ensure GCP are not overwhelmed by other\nconstraints.\n\nThe value of ``--gcp-sigma`` should be on the order of the ground sample distance\n(in meters), to ensure that GCP provide strong constraints in bundle adjustment.\n\nThe value in ``--max-pairwise-matches`` can be reduced if there is a large number of\npairs of images.\n\nThe produced GCP file can then be passed to ``bundle_adjust`` or ``jitter_solve``\nwith the same lists of images, cameras, and match files.\n\nCommand-line options\n~~~~~~~~~~~~~~~~~~~~\n  \n--warped-dem <string (default: \"\")>\n    The DEM file produced by stereo, that may have warping due to unmodeled distortion.\n    \n--ref-dem <string (default: \"\")>\n    The reference DEM file, which is assumed to be accurate.\n\n--warped-to-ref-disparity <string (default: \"\")>\n    The stereo disparity from the warped DEM to the reference DEM (use the first\n    band of the hillshaded DEMs as the inputs for the disparity).\n\n--left-image <string (default: \"\")>\n    The left raw image that produced the warped DEM.\n    \n--right-image <string (default: \"\")>\n    The right raw image that produced the warped DEM.\n    \n--left-camera <string (default: \"\")>\n    The left camera that was used for stereo.    \n    \n--right-camera <string (default: \"\")>\n    The right camera that was used for stereo.\n\n--match-file <string (default: \"\")>\n    The match file between the left and right raw images.\n    \n--image-list <string (default: \"\")>\n    A file containing the list of images, when they are too many to specify on\n    the command line. Use space or newline as separator. See also\n    ``--camera-list``.\n\n--camera-list <string (default: \"\")>\n    A file containing the list of cameras, when they are too many to specify on\n    the command line. If the images have embedded camera information, such as\n    for ISIS, this file may be omitted, or specify the image names instead of\n    camera names.\n\n--match-files-prefix <string (default: \"\")>\n    Use the match files with this prefix.\n\n--clean-match-files-prefix <string (default: \"\")>\n    Use as input ``*-clean.match`` files with this prefix.\n\n--max-pairwise-matches <int (default: -1)>\n    If positive, reduce the number of matches to load from any given match file to at \n    most this value.\n\n--gcp-sigma <double (default: 1.0)>\n    The sigma to use for the GCP points. A smaller value will give to GCP more\n    weight. This should be a fraction of the image ground sample distance.\n    Measured in meters. See also ``--gcp-sigma-image``.\n\n--output-gcp <string (default: \"\")>\n    The produced GCP file with ground coordinates from the reference DEM.\n    \n--max-num-gcp <int (default: -1)>\n    The maximum number of GCP to write. If negative, all GCP are written. If\n    more than this number, a random subset will be picked. The same subset will\n    be selected if this program is called again.\n\n--max-disp <double (default: -1.0)>\n    If positive, flag a disparity whose norm is larger than this as erroneous\n    and do not use it for creating GCP. Measured in pixels. See also option ``--max-gcp-reproj-err`` in ``bundle_adjust`` (:numref:`ba_options`).\n\n--gcp-sigma-image <string (default: \"\")>\n    Given a georeferenced image with float values, for each GCP find its\n    location in this image and closest pixel value. Let the GCP sigma be that\n    value. Skip GCP that result in values that are no-data or are not positive.\n    This overrides ``--gcp-sigma``.\n\n--search-len <int (default: 0)>\n    How many DEM pixels to search around to find a valid DEM disparity (pick the\n    closest). This may help with a spotty disparity but should not be overused.\n\n-v, --version\n    Display the version of software.\n\n-h, --help\n    Display this help message.\n\n"
  },
  {
    "path": "docs/tools/dem_geoid.rst",
    "content": ".. _dem_geoid:\n\ndem_geoid\n---------\n\nThis program takes as input a DEM whose height values are relative to the datum\nellipsoid, and adjusts those values to be relative to the equipotential surface\nof the planet (geoid on Earth, areoid on Mars, etc.).\n\nThis entails subtracting from a DEM height relative to an ellipsoid a correction\nvalue. The program corrects, if need be, for differences between the DEM and\ngeoid correction datum ellipsoids. Bicubic interpolation is used.\n\nThis program can also perform the reverse adjustment.\n\nSupported geoids\n~~~~~~~~~~~~~~~~~\n\nThree geoids and one areoid are supported (also custom geoids). The Earth\ngeoids are EGM96 and EGM2008, relative to the WGS84 datum ellipsoid (see the\n`NGA Office of Geomatics\n<https://earth-info.nga.mil/index.php?dir=wgs84&action=wgs84>`_), and `NAVD88\n<https://www.ngs.noaa.gov/GEOID/GEOID09/>`_, which is relative to the NAD83\nellipsoid.\n\nThe Mars areoid is `MOLA MEGDR\n<https://pds-geosciences.wustl.edu/mgs/mgs-m-mola-5-megdr-l3-v1/mgsl_300x/meg016/>`_.\nWhen importing it into ASP, we adjusted the areoid height values to be relative\nto the IAU reference spheroid for Mars of radius 3,396,190 m. The areoid at that\nsource was relative to the Mars radius of 3,396,000 m. Yet ``dem_geoid`` can\nadjust correctly Mars DEMs created in respect to either spheroid.\n\n.. _custom_geoid:\n\nCustom geoids\n~~~~~~~~~~~~~\n\nThe ``dem_geoid`` program can work with a provided geoid correction GeoTiff\nfile, with the option ``--geoid-path`` (:numref:`dem_geoid_cmd_opts`).\n\nAs an example, `this Moon geoid correction\n<https://github.com/NeoGeographyToolkit/StereoPipeline/releases/download/geoid1.0/gggrx_1200b_meDE430_L002_L900_16ppd.tif>`_ has been adapted \nfrom :cite:`goossens2020high` to work with this program.\n\nThe ``dem_geoid`` program employs bicubic interpolation into the geoid correction\nfile. The ``gdalwarp`` program (:numref:`gdal_tools`) can resample\nany such file to a fine-enough resolution and with the desired interpolation\nmethod before passing it to this program.\n\nExamples\n~~~~~~~~\n\nGo from a DEM in respect to the WGS84 datum to one in respect\nto the EGM2008 geoid::\n\n     dem_geoid input-DEM.tif --geoid egm2008\n\nThe corrected DEM will be saved with the suffix ``-adj.tif``.\n\n.. _dem_geoid_cmd_opts:\n\nCommand-line options for dem_geoid\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n--nodata-value <float(default: -32768)>\n    The value of no-data pixels, unless specified in the DEM.\n\n--geoid <string (default: EGM96)>\n    Specify the geoid to use for the given datum. For WGS84 use\n    ``EGM96`` or ``EGM2008``. For Mars use ``MOLA`` or leave\n    blank.  For NAD83 use ``NAVD88`` or leave blank. When not specified\n    it will be auto-detected. See also ``--geoid-path``.\n\n--geoid-path <string (default = \"\")>\n    Specify the path to a custom GeoTiff file having the geoid correction, in\n    units of meter. Values from this file will be subtracted from the DEM values\n    in order to convert from ellipsoid to geoid heights. See\n    :numref:`custom_geoid`.\n    \n-o, --output-prefix <name>\n    Specify the output file prefix.\n\n--double\n    Output using double precision (64 bit) instead of float (32 bit).\n\n--reverse-adjustment\n    Go from DEM relative to the geoid/areoid to DEM relative to the\n    datum ellipsoid.\n\n--threads <integer (default: 0)>\n    Select the number of threads to use for each process. If 0, use\n    the value in ~/.vwrc.\n\n--cache-size-mb <integer (default = 1024)>\n    Set the system cache size, in MB.\n\n--tile-size <integer (default: 256 256)>\n    Image tile size used for multi-threaded processing.\n\n--no-bigtiff\n    Tell GDAL to not create BigTiff files.\n\n--tif-compress <None|LZW|Deflate|Packbits (default: LZW)>\n    TIFF compression method.\n\n-v, --version\n    Display the version of software.\n\n-h, --help\n    Display this help message.\n"
  },
  {
    "path": "docs/tools/dem_mosaic.rst",
    "content": ".. _dem_mosaic:\n\ndem_mosaic\n----------\n\nThe program ``dem_mosaic`` takes as input a list of DEM files and\ncreates a mosaic. By default, it seamlessly blends the DEMs where they\noverlap. It can also combine the inputs in other ways.\n\nSee many examples in :numref:`dem_mosaic_examples`.\n\nOverview\n~~~~~~~~\n\nThe output mosaic is written as non-overlapping tiles with desired tile\nsize, with the size set either in pixels or in georeferenced (projected)\nunits. The default tile size is large enough that normally the entire\nmosaic is saved as one tile, named as::\n\n    output_prefix-tile-0.tif\n\nAlternatively, one can pass to the ``-o`` option an output file, such\nas ``output.tif``. Then the mosaic will be written with this exact\nname. (This will fail if the tool decides there is a need for more\nthan one tile.)\n\nIndividual tiles can be saved via the ``--tile-index`` option (the tool\ndisplays the total number of tiles when it is being run). As such,\nseparate processes can be invoked for individual tiles for increased\nrobustness and perhaps speed.\n\nBy the default, the output mosaicked DEM will use the same grid size and\nprojection as the first input DEM. These can be changed via the ``--tr`` and\n``--t_srs`` options. Also note the ``--gdal-tap`` and ``--tap`` options.\n\nThe default behavior is to blend the DEMs everywhere. If the option\n``--priority-blending-length integer`` is invoked, the blending behavior\nwill be different. At any location, the pixel value of the DEM earliest\nin the list present at this location will be kept, unless closer to the\nboundary of that DEM than this blending length (measured in input DEM\npixels), only in the latter case blending will happen. This mode is\nuseful when blending several high-resolution \"foreground\" DEMs covering\nsmall regions with larger \"background\" DEMs covering a larger extent.\nThen, the pixels from the high-resolution DEMs are more desirable, yet\nat their boundary these DEMs should blend into the background.\n\nTo obtain smoother blending when the input DEMs are quite different at the\nboundary, one can increase ``--weights-blur-sigma`` and ``--weights-exponent``.\nThe latter will result in weights growing slower at each DEM boundary faster\ninwards. Some experimentation may be necessary, helped for example by examining\nthe weights used in blending; they can be written out with ``--save-dem-weight\ninteger``.\n\nInstead of blending, ``dem_mosaic`` can compute the image of first,\nlast, minimum, maximum, mean, standard deviation, median, and count of\nall encountered valid DEM heights at output grid points. For the\n\"first\" and \"last\" operations, the order in which DEMs were passed in\nis used. With any of these options, the tile names will be adjusted\naccordingly. It is important to note that with these options blending\nwill not happen, since it is explicitly requested that particular\nvalues of the input DEMs be used.\n\nIf the number of input DEMs is very large, the tool can fail as the\noperating system may refuse to load all DEMs. In that case, it is\nsuggested to use the parameter ``--tile-size`` to break up the output\nDEM into several large tiles, and to invoke the tool for each of the\noutput tiles with the option ``--tile-index``. Later, ``dem_mosaic`` can\nbe invoked again to merge these tiles into a single DEM.\n\nIf the DEMs have reasonably regular boundaries and no holes, smoother\nblending may be obtained by using ``--use-centerline-weights``.\n\nThis tool can also apply hole-filling, smoothing, and pixel erosion at\nboundary.\n\n.. _dem_mosaic_examples:\n\nExamples\n~~~~~~~~\n\nBlend DEMs\n^^^^^^^^^^\n\nThis creates a seamless DEM::\n\n     dem_mosaic dem1.tif dem2.tif -o blended.tif\n\nPriority blending\n^^^^^^^^^^^^^^^^^\n\nRead the DEMs from a list, and apply priority blending. The first DEM\nin the list is given priority, with the others used as a background with this\ntransition length.\n\n::\n\n     echo dem1.tif dem2.tif > image_list.txt\n     dem_mosaic -l image_list.txt --priority-blending-length 14 \\\n       -o priority_blended\n\nSince an extension for the output was not specified, it will be saved\nas ``priority_blended/tile-0.tif`` (there may be more than one tile if\nthe ``--tile-size`` parameter is set).\n\nMean height DEM\n^^^^^^^^^^^^^^^\n\n::\n\n     dem_mosaic -l image_list.txt --mean -o mosaic\n\nThis uses no blending. Also supported are the options ``--first``,\n``--last``, ``--min``, ``--max``, ``--stddev``, ``--median``, ``--nmad``,\nand ``--count``.\n\n.. _dem_mosaic_external_weights:\n\nExternal weights\n^^^^^^^^^^^^^^^^\n\nThe default behavior of ``dem_mosaic`` is to blend the DEMs using a weighted\naverage with internal weights that decrease to zero towards the boundary of the DEM\nand plateau inwards, away from the boundary (see ``--extra-crop-length`` and\n``--weights-exponent``). \n\nIf, for example, the DEMs are known to have different vertical uncertainties\n(:numref:`error_propagation`), these gridded uncertainties\n(:numref:`export_stddev`) can be used as external weights. These weights can be\ninverted (to ensure that a larger weight is given to a smaller vertical\nuncertainty), then multiplied by the internal weights before blending.\n\nA larger stereo convergence angle (:numref:`stereo_pairs`) results in less\nvertical uncertainty.\n                                        \nExample::\n\n    ls stereo_runs/*/run-DEM.tif > stereo_runs/dem_list.txt\n    ls stereo_runs/*/run-VerticalStdDev.tif > stereo_runs/vert_list.txt\n\n    dem_mosaic                                \\\n      --dem-list stereo_runs/dem_list.txt     \\\n      --weight-list stereo_runs/vert_list.txt \\\n      --invert-weights                        \\\n      -o stereo_runs/weighted_mosaic.tif\n\nIn addition to the option ``--invert-weights``, the option ``--min-weight`` can\nhelp ensure that the weights are not too small (before being inverted).\n\nThe weights must be in one-to-one correspondence with the DEMs to be mosaicked.\nAny weight value that equals the no-data value will be ignored.\n\nAnother candidate for the weight could be the triangulation error\n(:numref:`point2dem_ortho_err`). The ``--min-weight`` option is strongly\nencouraged in this case, as an extremely small triangulation error many not\nsuggest high reliability alone. \n\nThe ``image_calc`` program (:numref:`image_calc`) can help devise schemas for\nhow various uncertainty measures could be combined into a single weight image.\n\nRegridding\n^^^^^^^^^^\n\nEnforce that the output pixel centers are at integer multiples of grid size::\n\n    dem_mosaic --tr 0.10 --tap input.tif -o output.tif\n\nIf the bounds of the output DEM from above are examined with\n``gdalinfo`` (:numref:`gdal_tools`), they will be multiples of 0.05,\nbecause each grid point is centered at an integer multiple of 0.10,\nand extends for half a grid vertically and horizontally.\n\n(Note that ``point2dem`` (:numref:`point2dem`) and ``mapproject``\n(:numref:`mapproject`) create their outputs by default that way, and\nif ``dem_mosaic`` is invoked on such datasets, it will respect the\ninput grid even without ``--tap`` being explicitly set.)\n\nSee :numref:`gdal_tap` for when it is desired to emulate the GDAL\n``-tap`` option.\n\n.. _dem_mosaic_blur:\n\nApply a blur\n^^^^^^^^^^^^\n\n::\n\n    dem_mosaic --dem-blur-sigma 1 input.tif -o output.tif\n\nThis option will also extend the DEM somewhat and fill some holes, especially\nwith a larger sigma.\n\nErosion\n^^^^^^^\n\nErode 3 pixels at the boundary::\n\n     dem_mosaic --erode-length 3 input.tif -o output.tif\n\n.. _dem_mosaic_fill:\n\nFill small holes\n^^^^^^^^^^^^^^^^\n\n::\n\n    dem_mosaic --hole-fill-length 50 input.tif -o output.tif\n\n.. _dem_mosaic_extrapolate:\n\nExtrapolating a DEM\n^^^^^^^^^^^^^^^^^^^\n\nTo extrapolate a DEM based on a weighted average of neighbors, run::\n\n    dem_mosaic                  \\\n        --fill-search-radius 25 \\\n        --fill-power 8          \\\n        --fill-percent 10       \\\n        --fill-num-passes 3     \\\n        input.tif -o filled.tif \n\nThis command will become very slow for large ``--fill-search-radius``. \nIt is suggested to increase ``--fill-num-passes`` instead.\n\nThis method will also grow the DEM outwards, not just within\na hole, unlike the hole-filling example in :numref:`dem_mosaic_fill`.\n\nIt is suggested to blur a little the obtained DEM, such as::\n\n    dem_mosaic --dem-blur-sigma 2 filled.tif -o blurred.tif\n\nTo preserve as much as possible the input DEM values in the resulting DEM,\nexcept a small transition area at the boundary, run::\n    \n    dem_mosaic --priority-blending-length 20 \\\n      input.tif blurred.tif -o output.tif\n\nThe extrapolation works as follows. For any pixel that is invalid (lacks data),\n``dem_mosaic`` will search for valid pixels within the specified search radius.\nIf the percentage of valid to total number of found pixels is no less than the\nspecified value, the invalid pixel will be filled with the weighted average of\nthe valid pixel values, with the weight given as:\n\n.. math::    \n  \n    \\frac{1}{d^p + 1}\n\nwhere :math:`d` is the distance from the invalid to the valid pixel to borrow\nthe value from, and :math:`p` is given by ``--fill-power``. \n\nThis process will be repeated the specified number of times, with the valid\nportion of the DEM growing each time.\n\n.. _gdal_tap:\n\nTarget aligned pixels\n^^^^^^^^^^^^^^^^^^^^^\n\nA command such as::\n\n  dem_mosaic --gdal-tap                       \\\n    --tr 1                                    \\\n    --t_projwin 641401 4120288 652701 4133728 \\\n    input.tif -o output.tif\n\nshould produce a DEM with the bounds and grid size specified above, with\nbilinear interpolation. This is analogous to ``gdalwarp`` (:numref:`gdal_tools`)\nwith the options ``-tap -tr 1 1 -r bilinear -te``. Here, a projection in units\nof meter is assumed.\n\nProcessing\n~~~~~~~~~~\n\nThe tool reads input DEMs as single precision (float32), performs all \nprocessing in double precision (float64) for numerical accuracy, and \nwrites output mosaics as single precision (float32) by default. The output\ntype can be changed via the ``--ot`` option to Byte, UInt16, Int16, UInt32, \nInt32, or Float32.\n\nUsage\n~~~~~\n\n::\n\n     dem_mosaic [options] <dem files> -o output_prefix\n\nor::\n\n     dem_mosaic [options] -l dem_files_list.txt -o output_prefix\n\nCommand-line options\n~~~~~~~~~~~~~~~~~~~~\n\n-l, --dem-list <string>\n    A text file listing the DEM files to mosaic, one per line.\n\n-o, --output-prefix <string>\n    Specify the output prefix. One or more tiles will be written\n    with this prefix. Alternatively, an exact output file can be\n    specified, with a .tif extension.\n\n--tile-size <integer (default: 1000000)>\n    The maximum size of output DEM tile files to write, in pixels.\n\n--tile-index <integer>\n    The index of the tile to save (starting from zero). When this\n    program is invoked, it will print out how many tiles are there.\n    Default: save all tiles.\n\n--tile-list <string>\n    List of tile indices (in quotes) to save. A tile index starts\n    from 0.\n\n--priority-blending-length <integer (default: 0)>\n    If positive, keep unmodified values from the earliest available\n    DEM except a band this wide measured in pixels inward of its\n    boundary where blending with subsequent DEMs will happen.\n\n--tr <double>\n    Output grid size, that is, the DEM resolution in target\n    georeferenced units per pixel. Default: use the same resolution as\n    the first DEM to be mosaicked.\n\n--t_srs <string>\n    Specify the output projection as a GDAL projection string (WKT, GeoJSON, or\n    PROJ). If not provided, use the one from the first DEM to be mosaicked.\n\n--t_projwin <double double double double>\n    Limit the mosaic to this region, with the corners given in georeferenced\n    coordinates (xmin ymin xmax ymax). Max is exclusive. See the ``--gdal-tap``\n    and ``--tap`` options if desired to apply addition adjustments to this\n    extent.\n\n--first\n    Keep the first encountered DEM value (in the input order).\n\n--last\n    Keep the last encountered DEM value (in the input order).\n\n--min\n    Keep the smallest encountered DEM value.\n\n--max\n    Keep the largest encountered DEM value.\n\n--mean\n    Find the mean DEM value.\n\n--stddev\n    Find the standard deviation of DEM values.\n\n--median\n    Find the median DEM value (this can be memory-intensive, fewer threads are suggested).\n\n--nmad\n    Find the normalized median absolute deviation DEM value (this\n    can be memory-intensive, fewer threads are suggested).\n\n--count\n    Each pixel is set to the number of valid DEM heights at that pixel.\n\n--hole-fill-length <integer (default: 0)>\n    Maximum dimensions of a hole in the DEM to fill, in\n    pixels. See also ``--fill-search-radius``.\n\n--fill-search-radius <double (default: 0.0)>\n    Fill an invalid pixel with a weighted average of pixel values within this\n    radius in pixels. The weight is :math:`1/(d^p + 1)`, where the distance is\n    measured in pixels. See an example in :numref:`dem_mosaic_examples`. See\n    also ``--fill-power``, ``--fill-percent`` and ``--fill-num-passes``.\n\n--fill-power <double (default: 8.0)>\n    Power exponent to use when filling nodata values with\n    ``--fill-search-radius``.\n\n--fill-percent <double (default: 10.0)>\n    Fill an invalid pixel using weighted values of neighbors only if\n    the percentage of valid pixels within the radius given by\n    ``--fill-search-radius`` is at least this.\n\n--fill-num-passes <integer (default: 0)>\n    Fill invalid values using ``--fill-search-radius`` this many times.\n\n--erode-length <integer (default: 0)>\n    Erode the DEM by this many pixels at boundary.\n\n--weight-list <string (default: \"\")>\n    A text file having a list of external weight files to use in blending, one\n    per line. These are multiplied by the internal weights to ensure seamless\n    blending. The weights must be in one-to-one correspondence with the DEMs to\n    be mosaicked. See :numref:`dem_mosaic_external_weights`.\n\n--invert-weights\n    Use 1/weight instead of weight in blending, with ``--weight-list``.\n\n--min-weight <double (default: 0.0)>\n    Limit from below with this value the weights provided with ``--weight-list``.\n    \n--georef-tile-size <double>\n    Set the tile size in georeferenced (projected) units (e.g.,\n    degrees or meters).\n\n--output-nodata-value <double>\n    No-data value to use on output.  Default: use the one from the\n    first DEM to be mosaicked.\n\n--ot <string (default: Float32)>\n    Output data type. Supported types: Byte, UInt16, Int16, UInt32,\n    Int32, Float32. If the output type is a kind of integer, values\n    are rounded and then clamped to the limits of that type.\n\n--weights-blur-sigma <double (default: 5.0)>\n    The standard deviation of the Gaussian used to blur the weights.\n    Higher value results in smoother weights and blending.  Set to\n    0 to not use blurring.\n\n--weights-exponent <float (default: 2.0)>\n    The weights used to blend the DEMs should increase away from\n    the boundary as a power with this exponent. Higher values will\n    result in smoother but faster-growing weights.\n\n--use-centerline-weights\n    Compute weights based on a DEM centerline algorithm. Produces\n    smoother weights if the input DEMs don't have holes or complicated\n    boundary.\n\n--dem-blur-sigma <double (default: 0.0)>\n    Blur the DEM using a Gaussian with this value of sigma.\n    A larger value will blur more. Default: No blur.\n\n--extra-crop-length <integer (default: 200)>\n    Crop the DEMs this far from the current tile (measured in pixels) before\n    blending them (a small value may result in artifacts). This value also helps\n    determine how to plateau the blending weights inwards, away from the DEM\n    boundary.\n     \n--nodata-threshold <float>\n    Values no larger than this number will be interpreted as no-data.\n\n--force-projwin\n    Make the output mosaic fill precisely the specified projwin,\n    by padding it if necessary and aligning the output grid to the\n    region. This is the default with ``--gdal-tap --projwin``.\n\n--gdal-tap\n    Ensure that the bounds of output products (as printed by ``gdalinfo``,\n    :numref:`gdal_tools`) are integer multiples of the grid size (as set with\n    ``--tr``). When ``--t_projwin`` is set and its entries are integer multiples\n    of the grid size, that precise extent will be produced on output. This\n    functions as the GDAL ``-tap`` option. An example is in :numref:`gdal_tap`.\n    \n--tap\n    Let the output grid be at integer multiples of the grid size (like\n    the default behavior of ``point2dem`` and ``mapproject``, and\n    ``gdalwarp`` when invoked with ``-tap``, though the latter does\n    not have the half-a-pixel extra extent this tool has). If this\n    option is not set, the input grids determine the output grid.\n    See also ``--gdal-tap``.\n    \n--save-dem-weight <integer>\n    Save the weight image that tracks how much the input DEM with\n    given index contributed to the output mosaic at each pixel\n    (smallest index is 0).\n\n--save-index-map\n    For each output pixel, save the index of the input DEM it came\n    from (applicable only for ``--first``, ``--last``, ``--min``,\n    ``--max``, ``--median``, and ``--nmad``). A text file with the\n    index assigned to each input DEM is saved as well.\n\n--threads <integer (default: 0)>\n    Select the number of threads to use for each process. If 0, use\n    the value in ~/.vwrc.\n\n--tif-tile-size <integer (default: 256 256)>\n    The dimensions of each block in the output image.\n\n--cache-size-mb <integer (default = 1024)>\n    Set the system cache size, in MB.\n\n--no-bigtiff\n    Tell GDAL to not create BigTiff files.\n\n--tif-compress <None|LZW|Deflate|Packbits (default: LZW)>\n    TIFF compression method.\n\n--cog\n    Write a cloud-optimized GeoTIFF (COG). See :numref:`cog_output`.\n\n-v, --version\n    Display the version of software.\n\n-h, --help\n    Display this help message.\n"
  },
  {
    "path": "docs/tools/dg_mosaic.rst",
    "content": ".. _dg_mosaic:\n\ndg_mosaic\n---------\n\nThis tool can be used when processing Digital Globe images\n(:numref:`dg_tutorial`). Such an image product may be packaged\nas several sub-images and corresponding camera XML\nfiles. ``dg_mosaic`` will mosaic these sub-images into a single file, and\ncreate the appropriate combined camera XML file.\n\nThe tool needs to be applied to the sub-images which form the left\nimage, and then in the same way to obtain the right image. These can \nthen be passed to ``parallel_stereo`` (:numref:`parallel_stereo`).\n\nDigital Globe camera files contain, in addition to the original camera\nmodels, their RPC approximations (:numref:`rpc`).\n``dg_mosaic`` outputs both types of combined models. The combined RPC\nmodel can be used to mapproject the mosaicked images with the goal of\ncomputing stereo from them (:numref:`mapproj-example`).\n\n``dg_mosaic`` can also reduce the image resolution while creating the mosaics\n(with the camera files modified accordingly). This may result in aliasing\nartifacts in produced terrain models, but can be useful for quick previews.\n\nSome older (2009 or earlier) Digital Globe images may exhibit seams upon\nmosaicking due to inconsistent image and camera information. The\n``--fix-seams`` switch can be used to rectify this problem. Its effect\nshould be minimal if such inconsistencies are not present.\n\nDigital Globe images can be used as they are as well, but in that case\neach left sub-image needs to be paired up with one more more right\nsub-images, create individual DEMs, and then mosaic those into a\nsingle output DEM. Hence this program simplifies the data processing.\n\nOnly level 1B images are supported (see the `product info \n<https://securewatchdocs.maxar.com/en-us/Orders/Orders_ProductInfo.htm>`_).\n\nExample::\n\n    dg_mosaic WV03_20160925183217*P1BS_R*C1-012844055010_01_P001.tif\n\nThis will create ``012844055010_01_P001.r100.tif`` and\n``012844055010_01_P001.r100.xml``, where ``r.100`` stands for the full\n100% resolution.\n\nCare should be taken to not mosaic together PAN and multispectral\nimages, which have ``P1BS`` and ``M1BS`` as part of their names.\n\nCommand-line options for dg_mosaic:\n\n-h, --help\n    Display the help message.\n\n--target-resolution\n    Choose the output resolution in meters per pixel on the ground\n    (note that a coarse resolution may result in aliasing).\n\n--reduce-percent <integer (default: 100)>\n    Render a reduced resolution image and XML based on this percentage.\n    This can result in aliasing artifacts.\n\n--skip-rpc-gen\n    Skip RPC model generation.\n\n--skip-tif-gen\n    Skip TIF file generation.\n\n--rpc-penalty-weight <float (default: 0.1)>\n    The weight to use to penalize higher order RPC coefficients\n    when generating the combined RPC model. Higher penalty weight\n    results in smaller such coefficients.\n\n--output-prefix <name>\n    The prefix for the output .tif and .xml files.\n\n--cache-size-mb <integer (default = 1024)>\n    Set the system cache size, in MB, for each process.\n\n--threads <integer (default: 4)>\n    How many threads to use.\n    \n--band integer\n    Which band to use (for multi-spectral images).\n\n--input-nodata-value <float>\n    Nodata value to use on input; input pixel values less than or\n    equal to this are considered invalid.\n\n--output-nodata-value <float>\n    Nodata value to use on output.\n\n--ot <Byte|UInt16|Int16|UInt32|Int32|Float32 (default: Float32)>\n    Output data type. If the output type is a kind of integer, values\n    are rounded and then clamped to the limits of that type.\n\n--fix-seams \n    Fix seams in the output mosaic due to inconsistencies between\n    image and camera data using interest point matching.\n\n--ignore-inconsistencies\n    Ignore the fact that some of the files to be mosaicked have\n    inconsistent EPH/ATT values. Do this at your own risk.\n\n--preview\n    Render a small 8 bit png of the input for preview.\n\n-n, --dry-run\n    Make calculations, but just print out the commands.\n"
  },
  {
    "path": "docs/tools/disp2ip.rst",
    "content": ".. _disp2ip:\n\ndisp2ip\n-------\n\nThis program has some rather specialized functionality. It is meant to solve the\nfollowing problem. Consider a rover on a planetary body, with a stereo pair of\ncameras. To save on bandwidth, only the left raw image and filtered versions of\nboth left and right images are transmitted to Earth. The filter is usually the\nsign of the Laplacian of Gaussian (sLoG), or the Laplacian of Gaussian (LoG).\n\nFiltered images are enough for stereo, but not for interest point matching\nbetween images acquired at different times (rather than simultaneously). This\nmakes it problematic to find the relative poses of the cameras, which is needed\nfor ``rig_calibrator`` (:numref:`rig_calibrator`) or bundle adjustment\n(:numref:`bundle_adjust`).\n\nThe solution to find interest point matches only between the left raw images,\nthen to use the disparities between the left and right filtered images to find\nversions of these interest points in the right images, producing a set of\nmatches between all filtered images. This is the purpose of this program.\n\nProcedure\n~~~~~~~~~\n\nStereo between filtered images\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nIt is assumed by this program that the stereo runs were created with\n``affineepipolar`` alignment and that cameras may not be available. This program\nuses the disparities ``F.tif`` (:numref:`outputfiles`) as input.\n\nHence, ``parallel_stereo`` (:numref:`parallel_stereo`) should be invoked, for \nstereo pair with index ``i``, along the lines of::\n\n  parallel_stereo                      \\\n    --correlator-mode                  \\\n    --prefilter-mode 0                 \\\n    --stereo-algorithm asp_bm          \\\n    --sgm-collar-size 0                \\\n    --alignment-method affineepipolar  \\\n    fltr/left/left_filtered_${i}.png   \\\n    fltr/right/right_filtered_${i}.png \\\n    stereo_${i}/run\n\nThe option ``--prefilter-mode 0`` is very important, if the images\nare already filtered, otherwise a second filter would be applied on top.\nSee :numref:`stereodefault` for more details.\n\nIt may be hard to find features in LoG-filtered images so consider using very\nlarge values of ``--ip-per-tile`` and ``--matches-per-tile``, such as 50000 or\nmore (this must be decreased for large images).\n\nSfM between the left raw images\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nStructure-from-Motion (SfM) finds the interest point matches between the left\nraw images and the relative poses of the cameras::\n\n  theia_sfm --rig-config rig_config.txt \\\n    --theia-flags theia_flags.txt       \\\n    --images 'raw/left/left_raw*.png'   \\\n    --out-dir theia_left\n\nThis will produce the NVM file named ``theia_left/cameras.nvm``.\n\nSee :numref:`rig_calibrator_example` for more details.\n\nRunning this program\n^^^^^^^^^^^^^^^^^^^^\n\nSeveral lists should be prepared, and these must be in one-to-one correspondence::\n\n  ls fltr/left/left_filtered*.png   > left_filtered.txt\n  ls fltr/right/right_filtered*.png > right_filtered.txt\n  ls raw/left/left_raw*.png         >  left_raw.txt\n\n  ls stereo_*/run-F.tif | perl -p -e 's/-F\\.tif//' > stereo.txt\n\nAlso ensure that the optical centers for all images are available in a file, as\nexpected by the option ``--optical-center-list``. For example, this may work,\nwith the right values::\n\n    # Left images\n    for f in $(cat left_filtered.txt); do \n      echo $f 1064 1025 \n    done > optical_centers.txt\n    # Append the right images\n    for f in $(cat right_filtered.txt); do \n      echo $f 1055 1032 \n    done >> optical_centers.txt\n\nThen, run::\n\n    disp2ip                                          \\\n      --left-raw-image-list left_raw.txt             \\\n      --left-filtered-image-list left_filtered.txt   \\\n      --right-filtered-image-list right_filtered.txt \\\n      --stereo-prefix-list stereo.txt                \\\n      --optical-center-list optical_centers.txt      \\\n      --input-nvm theia_left/cameras.nvm             \\\n      --output-nvm combined.nvm\n \nThe interest points in the input NVM file are assumed to be shifted relative to\nthe optical center of those images, with the file\n``theia_left/camera_offsets.txt`` (given the earlier notation) having those\noptical centers. The program will shift the produced interest points relative to\nthe optical centers as well, creating ``combined_offsets.txt``.\n\n.. _disp2ip_rig:\n\nUse of results\n~~~~~~~~~~~~~~\n \nThe ``rig_calibrator`` program (:numref:`rig_calibrator`), when called with the\nproduced interest point matches, must use the option\n``--use_initial_rig_transforms``, and the rig configuration in ``--rig_config``\nmust have valid transforms between the sensors (field\n``ref_to_sensor_transform``). That is because ``disp2ip`` is unable to produce\nthe correct poses for the camera images it adds, and those are populated with a\nnominal value.\n\nThe initial guess value of this transform is best determined with the\n``rig_calibrator`` program itself, by running it with the left and right raw\nimages, that here are not available. The following observed value worked well\nfor a stereo rig::\n\n    ref_to_sensor_transform: 1 0 0 0 1 0 0 0 1 -0.14 0 0\n\nThis transform will be refined when ``rig_calibrator`` is run with the result\nproduced by ``disp2ip``.\n \nThe input and produced interest point matches can be inspected with ``stereo_gui`` \n(:numref:`stereo_gui_nvm`).  \n\n.. _disp2ip_filter:\n\nThe input filter\n~~~~~~~~~~~~~~~~\n\nThis program will run equally well if the LoG filter is applied to them (:numref:`stereodefault`), the sign of LoG, or no filter at all. \n\nWhat is important is for the left and right filtered images to be consistent, so\na reliable disparity map can be produced, and that the left raw images are\navailable.\n\nCommand-line options\n~~~~~~~~~~~~~~~~~~~~\n\n--left-raw-image-list <string>\n    File containing the list of raw left images, one per line.\n\n--left-filtered-image-list <string>\n    File containing the list of left images after applying the LoG (Laplacian of\n    Gaussian) filter, or some other filter, one per line.\n    \n--right-filtered-image-list <string>\n    File containing the list of right images after applying the LoG filter, \n    or some other filter, one per line.\n    \n--stereo-prefix-list <string>\n    File containing the list of stereo prefixes, one per line. Each prefix is\n    for a stereo run with a left filtered and right filtered image, with affine epipolar\n    alignment. Stereo could have been run with ``--correlator-mode``, so without\n    cameras.\n\n--optical-center-list <string>\n    File containing the list of optical centers for all filtered images, in pixels.\n    On each line must have the image name, optical center column, then row.\n    The order of images is not important.\n    \n--input-nvm <string>\n    Input NVM file, having interest point matches between the left raw images.\n    \n--output-nvm <string>\n    Output NVM file, having interest point matches between all filtered\n    images, produced with the help of disparity maps.\n"
  },
  {
    "path": "docs/tools/disparitydebug.rst",
    "content": ".. _disparitydebug:\n\ndisparitydebug\n--------------\n\nThe ``disparitydebug`` program produces visualizable images from\ndisparity maps created with ``parallel_stereo`` and ``stereo``. These\nare named ``D_sub.tif``, ``D.tif``, ``RD.tif``, and ``F.tif`` (see\n:numref:`outputfiles` for what each is).\n\nThe disparity map files can be useful for debugging because they\ncontain raw disparity values as measured by the correlator; however\nthey cannot be directly visualized or opened in a conventional image\nbrowser.  The ``disparitydebug`` tool converts a single disparity map\nfile into two normalized TIFF image files (``*-H.tif`` and\n``*-V.tif``, containing the horizontal and vertical, or line and\nsample, components of disparity, respectively) that can be viewed\nusing any image display program, including with the ``stereo_gui``\ntool shipped with ASP (:numref:`stereo_gui`).\n\nThe ``disparitydebug`` program will also print out the range of\ndisparity values in a disparity map, that can serve as useful summary\nstatistics when tuning the search range settings in the\n``stereo.default`` file (:numref:`search_range`).\n\nIf the input images are map-projected (georeferenced), the outputs of\n``disparitydebug`` will also be georeferenced.\n\nExamples\n~~~~~~~~\n\n::\n\n    disparitydebug run/run-D_sub.tif\n\nView the obtained horizontal and vertical disparities with::\n\n    stereo_gui run/run-D_sub-H.tif run/run-D_sub-V.tif \n\nAnother example of using this tool (and a figure) is given in\n:numref:`diagnosing_problems`, when discussing how to examine a produced run.\n\n.. _raw_disp:\n\nRaw disparity extraction\n~~~~~~~~~~~~~~~~~~~~~~~~\n\nTo extract the horizontal and vertical bands from a disparity without\nnormalization, run a command such as::\n\n    disparitydebug --raw run/run-F.tif\n\nInvalid values are set to a no-data value (-1e+6) that is saved in the geoheader\nof the output files.\n\nThis option is available in build 1/2026 and later.\n\nCommand-line options\n~~~~~~~~~~~~~~~~~~~~\n\n-o, --output-prefix <string (default: \"\")>\n    Specify the output file prefix. This is set automatically if not provided.\n\n--raw \n    Save the raw disparity values without any normalization. Invalid pixels are\n    set to no-data.\n\n--save-norm \n    Save the norm of the disparity instead of its two bands.\n\n--save-norm-diff\n    Save the maximum of norms of differences between a disparity and its four\n    neighbors.\n        \n--normalization <(integer integer integer integer) (default = auto)>\n    Normalization range. Specify in the format: hmin vmin hmax vmax.\n\n--roi <(integer integer integer integer) (default = auto)>\n    Region of interest. Specify in the format: xmin ymin xmax ymax.\n\n-t, --output-filetype <string (default: tif)>\n    Specify the output file type.\n\n--threads <integer (default: 0)>\n    Select the number of threads to use for each process. If 0, use\n    the value in ~/.vwrc.\n \n--cache-size-mb <integer (default = 1024)>\n    Set the system cache size, in MB.\n\n--tile-size <integer (default: 256 256)>\n    Image tile size used for multi-threaded processing.\n\n--no-bigtiff\n    Tell GDAL to not create BigTiff files.\n\n--tif-compress <None|LZW|Deflate|Packbits (default: LZW)>\n    TIFF compression method.\n\n-v, --version\n    Display the version of software.\n\n-h, --help\n    Display this help message.\n"
  },
  {
    "path": "docs/tools/gcp_gen.rst",
    "content": ".. _gcp_gen:\n\ngcp_gen\n-------\n\nThis program creates ground control points (GCP, :numref:`bagcp`) given a raw\ncamera image, orthoimage, and DEM. The GCP can then be used to initialize or\nconstrain a camera model for the camera image. This is a very quick and\nconvenient way of creating cameras that avoids full Structure-from-Motion\n(:numref:`sfm`).\n\nThe approach is to find interest point matches between the camera image (which\ndoes not have a georeference) and orthoimage (which does), infer the geolocation\nof those points from the orthoimage, and their elevation from the DEM.\n\nThe context and next steps after using this program are discussed in\n:numref:`camera_solve_gcp`.\n\nSee the related program named ``dem2gcp`` (:numref:`dem2gcp`).\n\nExamples\n~~~~~~~~\n\n::\n\n    gcp_gen                           \\\n      --camera-image camera_image.tif \\\n      --ortho-image ortho_image.tif   \\\n      --dem dem.tif                   \\\n      --individual-normalize          \\\n      --gcp-sigma 1.0                 \\\n      --output-prefix run/run         \\\n      --output-gcp gcp.gcp\n\nIf given several images, the program should be invoked individually\nfor each image, thus creating several GCP files. \n\nFor certain datasets, the SIFT interest point detection (method 1) and a smaller\nRANSAC threshold turned out to work better. Here's an alternative invocation,\nalso with more interest points per tile, and individually normalizing the images::\n\n    gcp_gen                           \\\n      --ip-detect-method 1            \\\n      --inlier-threshold 50           \\\n      --gcp-sigma 1.0                 \\\n      --ip-per-tile 1000              \\\n      --ip-per-image 0                \\\n      --camera-image camera_image.tif \\\n      --ortho-image ortho_image.tif   \\\n      --dem dem.tif                   \\\n      --output-prefix run/run         \\\n      --output-gcp gcp.gcp\n\nIn some cases, ``--ip-detect-method 2`` (ORB) worked out better than SIFT.\n\nThis program produces a match file at the output prefix location, which will\nbe reused next time the program is run with the same inputs. \n\nA couple of detailed applications of this program for registration are shown in\n:numref:`change3` (Chang'e 3) and :numref:`junocam` (JunoCam).\n\nAdvanced usage\n~~~~~~~~~~~~~~\n\nIf the extent of the raw camera image is very different than the orthoimage,\nor if the camera image appears to be a mirror-flipped version of the orthoimage,\nthis program can fail. \n\nIn that case, it is recommended to mapproject (:numref:`mapproject`) the raw\ncamera image onto a DEM, and pass in the mapprojected image as a helper to this\ntool, with the option::\n\n    --mapproj-image mapproj_image.tif\n\nIf needed, both the mapprojected image and orthoimage can be cropped first to a\nshared area.\n\nIf the camera image and orthoimage have very different ranges of pixel values,\nuse the option ``--individual-normalize``. \n\nIt is preferred that these images have similar lighting conditions and\nsimilar-enough resolutions.\n\nThis invocation will look up the DEM and camera model from the mapprojected\nimage's metadata, so these must be available.\n\nA match file for this program, between the mapprojected image and orthoimage,\ncan be produced with dense stereo correlation (:numref:`correlator-mode`). If\nrenamed to follow the naming convention (:numref:`ba_match_files`), it will be\npicked up by this program. Dense correlation may be more robust to lighting\ndifferences.\n\nThis program supports plain-text match files (:numref:`txt_match`).\n\nIf no luck, manual selection of interest points can be invoked\n(:numref:`creatinggcp`).\n    \nValidation\n~~~~~~~~~~\n\nRun ``stereo_gui``::\n\n  stereo_gui camera_image.tif ortho_image.tif \\\n    run/run-camera_image__ortho_image.match\n\nto inspect the produced match file (see also :numref:`stereo_gui_view_ip`). It\nshould show correctly the correspondences. The GCP file can be inspected in\n``stereo_gui`` as well (:numref:`stereo_gui_vwip_gcp`).\n    \nThe images and GCP files can be passed together to ``bundle_adjust`` to refine,\ntransform, or initialize the camera models (:numref:`ba_use_gcp`).\n\nThen, ``mapproject`` (:numref:`mapproject`) can be invoked with the camera\nimage, updated camera (or the original camera with the option\n``--bundle-adjust-prefix``), and the DEM. The resulting orthoimage can be\noverlaid on top of the original orthoimage in ``stereo_gui``\n(:numref:`stereo_gui`) to visually inspect the agreement.\n\nAlternatively, the residuals for each GCP can be inspected in the\n``pointmap.csv`` files produced by ``bundle_adjust``\n(:numref:`ba_err_per_point`).\n \nCommand-line options\n~~~~~~~~~~~~~~~~~~~~\n\n--camera-image <string (default: \"\")>\n    The camera image.\n    \n--ortho-image <string (default: \"\")>\n    The ortho image to geolocate the interest points in.\n  \n--dem <string (default: \"\")>\n    The DEM to infer the elevations from.\n    \n--output-gcp, -o <string (default: \"\")>\n    The output GCP file.\n\n--output-prefix <string (default: \"\")>\n    Save the intermediate data, including match files, in this directory. This\n    will cache any matches found, and those will be used to create the GCP file.\n    The match file needs to be deleted if desired to recompute it.\n\n--gcp-sigma <double (default: 1.0)>\n    The sigma (uncertainty, in meters) to use for the GCPs (:numref:`bagcp`). A\n    smaller sigma suggests a more accurate GCP. See also option\n    ``--fix-gcp-xyz`` in ``bundle_adjust`` (:numref:`ba_options`).\n    \n--ip-per-image <integer (default: 20000)>\n    How many interest points to detect in each image (the resulting number of\n    matches will be much less).\n\n--ip-per-tile <integer (default: 0)>\n    How many interest points to detect in each 1024^2 image tile (default:\n    automatic determination). This is before matching. Not all interest points\n    will have a match. See also ``--matches-per-tile``.\n\n--matches-per-tile <integer (default: 0)>\n    How many interest point matches to compute in each image tile (of size\n    normally 1024^2 pixels). Use a value of ``--ip-per-tile`` a few times larger\n    than this. See also ``--matches-per-tile-params``.\n    \n--matches-per-tile-params <int int (default: 1024 1280)>\n    To be used with ``--matches-per-tile``. The first value is the image tile\n    size for both images. A larger second value allows each right tile to\n    further expand to this size, resulting in the tiles overlapping. This may be\n    needed if the homography alignment between these images is not great, as\n    this transform is used to pair up left and right image tiles.\n  \n--individually-normalize\n    Individually normalize the input images instead of using common\n    values.\n\n--matches-as-txt\n    Read and write match files as plain text instead of binary. See\n    :numref:`txt_match`.\n\n--num-ransac-iterations <integer (default: 1000)>\n    How many iterations to perform in RANSAC when finding interest point matches.\n\n--inlier-threshold <double (default: 0.0)>\n    The inlier threshold (in pixels) to separate inliers from outliers when\n    computing interest point matches. A smaller threshold will result in fewer\n    inliers. The default is auto-determined.\n\n--ip-detect-method <integer (default: 0)>\n    Choose an interest point detection method from: 0 = OBAloG\n    (:cite:`jakkula2010efficient`), 1 = SIFT (from OpenCV), 2 = ORB (from\n    OpenCV). The SIFT method, unlike OBALoG, produces interest points that are\n    accurate to subpixel level. Remove any existing ``.vwip`` files before\n    recomputing interest points with a different method. See also\n    :numref:`custom_ip`.\n\n--min-matches <integer (default: 10)>\n    Set the minimum number of inlier matches between images for successful\n    matching.\n    \n--nodata-value <float (default: NaN)>\n    Pixels with values less than or equal to this number are treated\n    as no-data. This overrides the no-data values from input images.\n\n--match-file <string (default: \"\")>\n    If set, use this match file instead of creating one.          \n\n-v, --version\n    Display the version of software.\n\n-h, --help\n    Display this help message.\n"
  },
  {
    "path": "docs/tools/gdal.rst",
    "content": ".. _gdal_tools:\n\nGDAL tools\n----------\n\nASP distributes in the ``bin`` directory the following `GDAL\n<https://gdal.org/>`_ programs:\n\n- gdal_rasterize (modify images based on shape files)\n- gdal_translate (crop, resample)\n- gdalbuildvrt (mosaic)\n- gdaldem (hillshade)\n- gdalinfo (show stats)\n- gdaltransform (transforms between coordinate systems)\n- gdalwarp (convert to another projection and interpolate)\n- gdaladdo (create multi-resolution pyramids)\n\nand a handful of other ones.\n\nThese executables are compiled with JPEG2000 and BigTiff support, and\ncan handle NTF images in addition to most image formats. They can be\nused to see image statistics, crop and scale images, build virtual\nmosaics, reproject DEMs, etc.\n\nIf ASP was installed via conda, rather than using the release tarball\n(:numref:`installation`), make sure to activate that conda environment\nbefore using these tools or set the ``PROJ_LIB`` and/or ``PROJ_DATA``\nenvironmental variable to points to the ``share/proj`` subdirectory of\nthe ASP conda environment. Otherwise there will be warnings about\nfailing to find such a directory. This is a known PROJ issue.\n\nCertain conversion between datums using the GDAL/PROJ tools may need\nadditional data, which can be stored either locally or fetched via a\nnetwork (see the `PROJ documentation\n<https://proj.org/usage/network.html>`_).\n"
  },
  {
    "path": "docs/tools/geodiff.rst",
    "content": ".. _geodiff:\n\ngeodiff\n-------\n\nThe ``geodiff`` program takes as input two DEMs, or a DEM and a CSV file, and\nsubtracts the second from the first. The grid is from the first DEM, so the\nsecond one is interpolated into it using bilinear interpolation. When one file\nis a CSV, the grid from the DEM is used, regardless of the order of inputs. \n\nIt is important to note that ``geodiff`` is very sensitive to the order of\nthe two DEMs, due to the fact that the grid comes from the first one.\nIdeally the grid of the first DEM would be denser than the one of the\nsecond.\n\nUsage::\n\n    geodiff [options] <dem1> <dem2> [ -o output_prefix ]\n\nExamples\n~~~~~~~~\n\nTake the absolute difference of two DEMs::\n\n    geodiff --absolute dem1.tif dem2.tif -o run\n \nThis will create ``run-diff.tif``.\n\nThe ``stereo_gui`` program (:numref:`colorize`) can colorize on-the-fly and\ndisplay the difference image. The ``colormap`` program (:numref:`colormap`) can\nwrite a colorized image.\n\nTake the difference of a DEM and a CSV file::\n\n    geodiff dem1.tif file.csv                         \\\n      --csv-format '1:lon 2:lat 3:height_above_datum' \\\n      -o run\n\nThe produced ``run-diff.csv`` file can be visualized and colorized with\n``stereo_gui`` (:numref:`plot_csv`), as::\n\n  stereo_gui --colorbar run-diff.csv\n\nThis program can also overlay the difference on top of the DEM.\n\nSee also\n~~~~~~~~\n\nThe ``image_calc`` program (:numref:`image_calc`) can perform many operations on\nimages, as long as they are the same size (use ``gdalwarp``,\n:numref:`gdal_tools`, to convert images to the same extent and georeference).\n\nCommand-line options\n~~~~~~~~~~~~~~~~~~~~\n\n-o, --output-prefix <filename>\n    Specify the output prefix.\n\n--absolute\n    Output the absolute difference as opposed to just the difference.\n\n--csv-format <string>\n    Specify the format of input CSV files as a list of entries\n    column_index:column_type (indices start from 1).  Examples:\n    ``1:x 2:y 3:z`` (a Cartesian coordinate system with origin at\n    planet center is assumed, with the units being in meters),\n    ``5:lon 6:lat 7:radius_m`` (longitude and latitude are in degrees,\n    the radius is measured in meters from planet center), \n    ``3:lat 2:lon 1:height_above_datum``,\n    ``1:easting 2:northing 3:height_above_datum``\n    (need to set ``--csv-srs``; the height above datum is in\n    meters).  Can also use radius_km for column_type, when it is\n    again measured from planet center.\n\n--csv-srs <proj string>\n    The PROJ or WKT string to use to interpret the entries in input CSV\n    files, if those files contain Easting and Northing fields. If\n    not specified, it will be borrowed from the DEM.\n\n--nodata-value <float (default: -32768)>\n    The no-data value to use, unless present in the DEM geoheaders.\n\n--threads <integer (default: 0)>\n    Select the number of threads to use for each process. If 0, use\n    the value in ~/.vwrc.\n \n--cache-size-mb <integer (default = 1024)>\n    Set the system cache size, in MB.\n\n--tile-size <integer (default: 256 256)>\n    Image tile size used for multi-threaded processing.\n\n--no-bigtiff\n    Tell GDAL to not create BigTiff files.\n\n--float\n    Output using float (32 bit) instead of using doubles (64 bit).\n    This is now the default, and this option is obsolete.\n\n--tif-compress <None|LZW|Deflate|Packbits (default: LZW)>\n    TIFF compression method.\n\n--cog\n    Write a cloud-optimized GeoTIFF (COG). See :numref:`cog_output`.\n\n-v, --version\n    Display the version of software.\n\n-h, --help\n    Display this help message.\n"
  },
  {
    "path": "docs/tools/hiedr2mosaic.rst",
    "content": ".. _hiedr2mosaic:\n\nhiedr2mosaic.py\n---------------\n\nAssemble a collection of HiRISE EDR files into a single image. This runs\nthe sequence of ISIS preprocessing commands, followed by hijitreg, to\nassemble the input images into a single output image. You can either\ndownload the input files yourself and pass them all in or specify a\ndownload folder and pass in only a URL such as\nhttp://hirise-pds.lpl.arizona.edu/PDS/EDR/ESP/ORB_029400_029499/ESP_029421_2300/.\nIf you use a URL, the program will attempt to download all of the HiRISE\nimages found at that location and then run the processing script. See\nthe \"Mars Reconnaissance Orbiter HiRISE\" section in the examples chapter\nfor a more detailed explanation.\n\nUsage::\n\n    hiedr2mosaic.py [options] <input files OR a URL>\n\nCommand-line options for hiedr2mosaic.py:\n\n--manual\n    Display the help message.\n\n-w, --web\n    Invokes spiceinit with web=true, to fetch the kernels from the web.\n\n-m, --match\n    The CCD number passed as the match argument to noproj (default 5).\n\n--stop-at-no-proj\n    Stops processing after the noproj steps are complete.\n\n--resume-at-no-proj\n    Restarts processing using the results from ``--stop-at-no-proj``.\n\n--download-folder\n    Download input files to this folder. Must pass in a URL instead\n    of files.\n\n-t, --threads\n    Specify the number of threads to use.\n\n-k, --keep\n    Keep all intermediate files.\n"
  },
  {
    "path": "docs/tools/hillshade.rst",
    "content": ".. _hillshade:\n\nhillshade\n---------\n\nThe ``hillshade`` tool reads in a DEM and outputs an image of that DEM\nas though it were a three-dimensional surface, with every pixel shaded\nas though it were illuminated by a light from a specified location.\n\nExample::\n\n    hillshade -a 300 -e 30 dem.tif -o hillshaded.tif\n\nSee an illustration in :numref:`genhillshade`.\n\nView these side-by-side with ``stereo_gui`` (:numref:`stereo_gui`)::\n\n    stereo_gui dem.tif hillshaded.tif\n\n.. _gdal_hill:\n\nGDAL hillshade\n~~~~~~~~~~~~~~\n\nThe ``gdaldem hillshade`` command in GDAL (:numref:`gdal_tools`) provides\nsimilar functionality to ``hillshade``, and its output is often more accurate.\n\nExample::\n\n    gdaldem hillshade -multidirectional -compute_edges \\\n      input_dem.tif output_hillshade.tif\n\nCommand-line options\n~~~~~~~~~~~~~~~~~~~~\n\n--input-file <filename>\n    Explicitly specify the input file.\n\n-o, --output-file <filename>\n    Specify the output file.\n\n--align-to-georef\n    Azimuth is relative to geographic East, not +x in the image.\n\n-a, --azimuth <number-in-degrees (default: 300)> \n    Sets the direction that the light source is coming from (in\n    degrees). Zero degrees is to the right, with positive degrees\n    counter-clockwise.\n\n-e, --elevation <number-in-degrees (default: 20)>\n    Set the elevation of the light source (in degrees).\n\n-s, --scale <arg (default: 0)>\n    Set the scale of a pixel (in the same units as the DTM height values).\n\n--nodata-value <arg> \n    Remap the DEM default value to the min altitude value.\n\n--blur <arg>\n    Pre-blur the DEM with the specified sigma.\n\n--threads <integer (default: 0)>\n    Select the number of threads to use for each process. If 0, use\n    the value in ~/.vwrc.\n \n--cache-size-mb <integer (default = 1024)>\n    Set the system cache size, in MB.\n\n--tile-size <integer (default: 256 256)>\n    Image tile size used for multi-threaded processing.\n\n--no-bigtiff\n    Tell GDAL to not create BigTiff files.\n\n--tif-compress <None|LZW|Deflate|Packbits (default: LZW)>\n    TIFF compression method.\n\n--cog\n    Write a cloud-optimized GeoTIFF (COG). See :ref:`cog_output`.\n\n-v, --version\n    Display the version of software.\n\n-h, --help\n    Display this help message.\n"
  },
  {
    "path": "docs/tools/historical_helper.rst",
    "content": ".. _historical_helper:\n\nhistorical_helper.py\n--------------------\n\nThe ``historical_helper.py`` program is a helper script for processing\nhistorical imagery. See examples for how to use it in :numref:`kh4`\nand :numref:`kh7`.\n\nThis tool needs the ``convert`` program from the ``ImageMagick`` package.\nIf ASP was installed with ``conda`` (:numref:`conda_intro`), this will\nhave a program named ``convert``, but that will be a utility that is part\nof the ``embree`` package, rather than the tool we need.\n\nTo install the correct ``convert`` tool with conda, run::\n\n    conda create -n imagemagick -c conda-forge imagemagick -y\n\nThen, either prepend the path to ``convert`` to your ``PATH``,\nor invoke ``historical_helper.py`` with the option::\n\n    --convert-path $HOME/miniconda3/envs/imagemagick/bin/convert\n\nUsage::\n\n     historical_helper.py [options] <rotate or rotate-crop>\n\nCommand-line options:\n\n--input-path <string (default: \"\")>\n    Path of the input file to process.\n\n--output-path <string (default: \"\")>\n    The output file to write.\n\n--interest-points <string (default: \"\")>\n    List of column and row pairs contained in quotes.\n\n--convert-path <string (default: \"\")>\n    Path to the ImageMagick ``convert`` executable to use in processing. If not\n    set, the directory having this tool must be prepended to the system path.\n\n-h, --help\n    Display this help message.\n"
  },
  {
    "path": "docs/tools/icebridge_kmz_to_csv.rst",
    "content": ".. _icebridgekmztocsv:\n\nicebridge_kmz_to_csv\n--------------------\n\nThis is a simple tool for use with data from the NASA IceBridge program. \n\nIt takes as input Google Earth compatible .kmz files from:\n\n  http://asapdata.arc.nasa.gov/dms/missions.html \n\nwhich display the aircraft position at the point when each DMS frame image was\ncaptured.\n\nThis tool exports those camera positions in ECEF to a csv file which can be\npassed to ``bundle_adjust`` (:numref:`bundle_adjust`) using the following\nparameters::\n\n   --camera-positions ../camera_positions.csv              \\\n   --csv-format \"1:file 2:lon 3:lat 4:height_above_datum\"\n\nThis list is used to transform the camera positions and orientations from a\nlocal coordinate system to the ECEF coordinate system for the current planet.\n\nThis may be useful in conjunction with ``camera_solve`` (:numref:`camera_solve`).\nSee :numref:`sfmicebridge` for an example.\n\nUsage::\n\n    icebridge_kmz_to_csv <input kmz file> <output csv file>\n\n"
  },
  {
    "path": "docs/tools/image2qtree.rst",
    "content": ".. _image2qtree:\n\nimage2qtree\n-----------\n\n``image2qtree`` turns a georeferenced image (or images) into a quadtree\nwith geographical metadata for viewing in Google Earth. See \n:numref:`google_earth_overlays` for usage examples.\n\nCommand-line options for image2qtree:\n\n--help\n    Display a help message.\n\n-o, --output-name <directory-name>\n    Specify the base output directory.\n\n-q, --quiet\n    Quiet output.\n\n-v, --verbose\n    Verbose output.\n\n--cache <number-of-MB (default: 1024)>\n    Cache size, in megabytes.\n\n--force-wgs84\n    Use WGS84 as the input images' geographic coordinate systems,\n    even if they’re not (old behavior).\n\n--pixel-scale <factor (default: 1)>\n    Scale factor to apply to pixels.\n\n--pixel-offset <offset (default: 0)>\n    Offset to apply to pixels.\n\n--normalize\n    Normalize input images so that their full dynamic range falls\n    in between [0,255].\n\n-m, --output-metadata <kmltms|uniview|gmap|celestia|none (default: none)>\n    Specify the output metadata type.\n\n--file-type <type (default: png)>\n    Output file type.\n\n--channel-type <uint8|uint16|int16|float (default: uint8)>\n    Output (and input) channel type.\n\n--module-name <name (default: marsds)>\n    The module where the output will be placed. Ex: marsds for\n    Uniview, or Sol/Mars for Celestia.\n\n--terrain\n    Outputs image files suitable for a Uniview terrain view. Implies\n    output format as PNG, channel type uint16. Uniview only.\n\n--jpeg-quality <factor (default: 0.75)>\n    JPEG quality factor (0.0 to 1.0).\n\n--png-compression <level (default: 3)>\n    PNG compression level (0 to 9).\n\n--palette-file <filename>\n    Apply a palette from the given file.\n\n--palette-scale <factor>\n    Apply a scale factor before applying the palette.\n\n--palette-offset <value>\n    Apply an offset before applying the palette.\n\n--tile-size <number-of-pixels (default: 256)>\n    Tile size, in pixels.\n\n--max-lod-pixels <number-of-pixels (default: 1024)>\n    Max LoD in pixels, or -1 for none (kml only).\n\n--draw-order-offset <value (default: 0)>\n    Offset for the ``<drawOrder>`` tag for this overlay (kml only).\n\n--composite-multiband\n    Composite images using multi-band blending.\n\n--aspect-ratio <ratio (default: 1)>\n    Pixel aspect ratio (for polar overlays; should be a power of two).\n\n--north <latitude-in-degrees>\n    The northernmost latitude in degrees.\n\n--south <latitude-in-degrees>\n    The southernmost latitude in degrees.\n\n--east <longitude-in-degrees>\n    The easternmost longitude in degrees.\n\n--west <longitude-in-degrees>\n    The westernmost longitude in degrees.\n\n--sinusoidal\n    Assume a sinusoidal projection.\n\n--mercator\n    Assume a Mercator projection.\n\n--transverse-mercator\n    Assume a transverse Mercator projection.\n\n--orthographic\n    Assume an orthographic projection.\n\n--stereographic\n    Assume a stereographic projection.\n\n--lambert-azimuthal\n    Assume a Lambert azimuthal projection.\n\n--lambert-conformal-conic\n    Assume a Lambert Conformal Conic projection.\n\n--utm <zone>\n    Assume UTM projection with the given zone.\n\n--proj-lat <latitude>\n    The center of projection latitude (if applicable).\n\n--proj-lon <longitude>\n    The center of projection longitude (if applicable).\n\n--proj-scale <scale>\n    The projection scale (if applicable).\n\n--std-parallel1 <latitude>\n    Standard parallels for Lambert Conformal Conic projection.\n\n--std-parallel2 <latitude>\n    Standard parallels for Lambert Conformal Conic projection.\n\n--nudge-x <arg>\n    Nudge the image, in projected coordinates.\n\n--nudge-y <arg>\n    Nudge the image, in projected coordinates.\n"
  },
  {
    "path": "docs/tools/image_align.rst",
    "content": ".. _image_align:\n\nimage_align\n------------\n\nThe program ``image_align`` aligns a second image to a first image. In\nthe produced aligned second image, each feature has the same row and\ncolumn coordinates as in the first image. It can return a transform\nin pixel space and one in planet's coordinate system.\n\nSeveral alignment transforms are supported, including ``rigid``,\n``translation``, ``similarity``,  etc. The alignment transform is determined\nwith subpixel precision and is applied using bilinear interpolation.\n\nFeatures are matched among the images using either interest points\nor a disparity produced with ASP's correlation algorithms.\n\nIf the first image is georeferenced, the second aligned image will use\nthe same georeference as the first one.  The first image and second\naligned image can then be blended with ``dem_mosaic``\n(:numref:`dem_mosaic`).\n\nThe images are expected to have a single band and have float or\ninteger values. If the images have more than one band, only the first\none will be read. The processing is done in double precision. The\ndefault output pixel value value is ``float32``, as casting to integer\nmay result in precision loss.\n\nSince the first image is kept fixed, if portions of the second aligned\nimage move higher or more to the left than the upper-left corner of\nthe first image, those extra portions will be cut. In that case it is\nsuggested to reverse the order of images when invoking this tool.\n\nThe alignment transform can be saved, and a custom alignment transform\ncan be applied instead of the one found automatically. The interest\npoint matches which determine the alignment transform can be saved as\nwell.\n\nThis tool extends the co-registration functionality of CASP-GO\n(:numref:`casp_go`).\n\nExamples\n~~~~~~~~\n\nInterest point based alignment\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n::\n   \n    image_align                           \\\n      --alignment-transform rigid         \\\n      --ip-per-image 20000                \\\n      image1.tif image2.tif               \\\n      --output-prefix out_image_align/run \\\n      -o image2_align.tif\n\nThe directory ``out_image_align`` will contain the interest point matches\n(that are cached for future runs), the computed transform, and other\nauxiliary data.\n\nThis program supports plain-text match files (:numref:`txt_match`).\n\nDisparity based alignment\n^^^^^^^^^^^^^^^^^^^^^^^^^\n\nAlternatively, instead of using interest points for alignment, use a (dense)\ndisparity produced from correlation (:numref:`correlator-mode`). This method can\nbe more robust to differences in illumination.\n\n::\n\n    parallel_stereo --correlator-mode --stereo-algorithm asp_mgm \\\n      --subpixel-mode 9 image1.tif image2.tif run/run-corr\n\n    image_align                                       \\\n      image1.tif image2.tif                           \\\n      --disparity-params \"run/run-corr-F.tif 1000000\" \\\n      --output-prefix run/run                         \\\n      --output-image image2_align.tif\n\nThe file ending in ``F.tif`` has the disparity.\n\nFor very precise subpixel alignment, use ``--subpixel-mode 2`` above, but this\nis very slow. See :numref:`running-stereo` for the choices when it comes to\nstereo algorithms and subpixel methods, and :numref:`correlator-mode` for the\nimage correlator functionality. \n\nFor noisy images the ``asp_bm`` algorithm should also be considered. It has a\nlarger correlation window size.\n\nThe disparity will be computed from the first to second image, but the\nalignment transform is from the second to first image, so the disparity\nand this transform will show opposite trends.\n\nApplication for alignment of DEMs\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nGiven a DEM, it can be treated as an image with float values, or an\nimage can be produced from it with the ``hillshade`` command\n(:numref:`hillshade`), or, if the DEM is obtained from a stereo point\ncloud with ``point2dem``, an orthoimage in one-to-one correspondence\nwith this DEM can be created with the ``--orthoimage`` option of this\ntool (:numref:`point2dem`).\n\nIn either case, given two DEMs, ``dem1.tif`` and ``dem2.tif``, their\ncorresponding images can be aligned to each other as::\n\n    image_align image1.tif image2.tif --output-prefix run \\\n      --alignment-transform rigid -o image2_align.tif\n\nThen, the alignment transform can be used to align the second DEM\nto the first, as::\n\n    image_align dem1.tif dem2.tif             \\\n      --input-transform run/run-transform.txt \\\n      --output-prefix run/run                 \\\n      -o dem2_align.tif \n\nIt appears that applying this tool on the DEMs themselves may result\nin more accurate results than if applied on their hillshaded images.\n(Consider also using for hillshading the tool ``gdaldem hillshade``,\n:numref:`gdal_tools`.)\n\nIf the DEMs have very different grids and projections, regridding them with\n``gdalwarp`` may make them more similar and easier to align (invoke this tool\nwith cubic spline interpolation).\n  \nNote that the alignment transform is a 3x3 matrix and can be examined\nand edited.  Its inputs and outputs are 2D pixels in *homogeneous\ncoordinates*, that is, of the form (*x*, *y*, *1*). It is able to model\naffine and homography transforms in the pixel plane.\n\nSee the related tool ``pc_align`` (:numref:`pc_align`) for alignment\nof point clouds. That one is likely to perform better than\n``image_align``, as it makes use of the 3D nature of of point clouds,\nthe inputs need not be gridded, and one of the clouds can be sparse.\n\n.. _image_align_ecef_trans:\n\nDetermination of ECEF transform\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nIf the images are georeferenced, this program can find the approximate\n3D transform around the planet that brings the second image in\nalignment with the first one. It is assumed that there exist DEMs\nassociated with these images, from which the 3D coordinates of the\nlocations of interest point matches are determined, and the best-fit\n3D transform is computed.\n\nExample::\n\n    image_align img1.tif img2.tif \\\n      -o img2_align.tif           \\\n      --alignment-transform rigid \\\n      --ecef-transform-type rigid \\\n      --dem1 dem1.tif             \\\n      --dem2 dem2.tif             \\\n      --output-prefix run/run\n \nThis will save ``run/run-ecef-transform.txt`` in the ``pc_align`` format\n(rotation + translation + scale, :numref:`alignmenttransform`). This transform\ncan be passed to ``pc_align`` in order to transform a point cloud\n(:numref:`prevtrans`), and to ``bundle_adjust`` if desired to transform cameras\n(:numref:`ba_pc_align`). Use zero iterations with these tools to apply the\ntransform without further refinement.\n\nIt is important to keep in mind that the ECEF transform is from the second cloud\nto the first, hence ``pc_align`` should have the clouds *in the same order* as for\n``image_align`` in order to use this transform.\n\nThe inverse of this transform is saved as well, if desired to transform the\nclouds or cameras from the coordinate system of the first image to the one of\nthe second image.\n\nIf no DEMs exist, the images themselves can be used in their\nplace. The grayscale values will be interpreted as heights above the\ndatum in meters. The ``image_calc`` program (:numref:`image_calc`)\ncan modify these values before the DEMs are passed to ``image_align``.\n\nIf only DEMs exist, their hillshaded versions (:numref:`hillshade`) can be\nused as images. As earlier, the more similar visually the images are, the \nbetter the results.\n\nIt is suggested to use ``--alignment-transform rigid`` and\n``--ecef-transform-type rigid`` if it is thought that a rotational component\nexists, and the value ``translation`` for these options if no rotation is\nexpected.\n\nNote that this will produce a rotation + translation around planet\ncenter, rather than a local \"in-plane\" transform, so it can be hard to\ninterpret. A similarity transform can be used when there is a difference in\nscale.\n\nNote that this transform is an approximation. It is not possible to\nprecisely convert a 2D transform between images to a 3D transform\nin ECEF unless the underlying terrain is perfectly flat.\n\nUsage\n~~~~~\n\n::\n\n    image_align [options] <reference image> <source image> \\\n      --output-prefix <prefix> -o <aligned source image>\n\n.. _image_align_opts:\n\nCommand-line options for image_align\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n--output-image, -o <string (default: \"\")>\n    Specify the output image.\n\n--output-prefix <string (default: \"out_image_align/run\")>\n    Save the interest point matches, computed transform, and other auxiliary\n    data at this prefix. These are cached for future runs.\n\n--alignment-transform <string (default: \"rigid\")>\n    Specify the transform to use to align the second image to the\n    first. Options: ``translation``, ``rigid`` (translation + rotation),\n    ``similarity`` (translation + rotation + scale), ``affine``,\n    ``homography``.\n\n--output-data-type, -d <string (default: \"float32\")>\n    The data type of the output file. Options: ``uint8``, ``uint16``,\n    ``uint32``, ``int16``, ``int32``, ``float32``, ``float64``. The\n    values are clamped (and also rounded for integer types) to avoid\n    overflow.\n\n--ip-detect-method <integer (default: 0)>\n    Interest point detection algorithm (0: Integral OBALoG (default), 1: OpenCV SIFT, 2: OpenCV ORB).\n\n--ip-per-image <integer (default: 20000)>\n    How many interest points to detect in each image (the resulting number of \n    matches will be much less).\n\n--ip-per-tile <integer (default: 0)>\n    How many interest points to detect in each 1024^2 image tile (default: automatic\n    determination). This is before matching. Not all interest points will have a match.\n    See also ``--matches-per-tile``.\n\n--matches-per-tile <integer (default: 0)>\n    How many interest point matches to compute in each image tile (of size\n    normally 1024^2 pixels). Use a value of ``--ip-per-tile`` a few times larger\n    than this. See also ``--matches-per-tile-params``.\n\n--matches-per-tile-params <string (default: \"1024 1280\")>\n    To be used with ``--matches-per-tile``. The first value is the image tile size for both\n    images. A larger second value allows each right tile to further expand to this size,\n    resulting in the tiles overlapping. This may be needed if the homography alignment\n    between these images is not great, as this transform is used to pair up left and\n    right image tiles.\n\n--individually-normalize\n    Individually normalize the input images instead of using common values.\n\n--matches-as-txt\n    Read and write match files as plain text instead of binary. See\n    :numref:`txt_match`.\n\n--num-ransac-iterations <integer (default: 1000)>\n    How many iterations to perform in RANSAC when finding interest point \n    matches.\n\n--inlier-threshold <double (default: 50.0)>\n    The inlier threshold (in pixels) to separate inliers from outliers when\n    computing interest point matches. A smaller threshold will result in fewer\n    inliers.\n\n--min-matches <integer (default: 10)>\n    Set the minimum number of inlier matches between images for successful\n    matching.\n\n--disparity-params <string (default: \"\")>\n    Find the alignment transform by using, instead of interest points,\n    a disparity, such as produced by ``parallel_stereo --correlator-mode``. \n    Specify as a string in quotes, in the format: \"disparity.tif num_samples\".\n\n--input-transform <string (default: \"\")>    \n    Instead of computing an alignment transform, read and apply the one from \n    this file. Must be stored as a 3x3 matrix.\n\n--ecef-transform-type <string (default: \"\")>\n    Save the ECEF transform corresponding to the image alignment\n    transform to ``<output prefix>-ecef-transform.txt``. The type can\n    be: 'translation', 'rigid' (rotation + translation), or 'similarity'\n    (rotation + translation + scale). See :numref:`image_align_ecef_trans`\n    for an example.\n\n--dem1 <string (default: \"\")>\n    The DEM associated with the first image. To be used with\n    ``--ecef-transform-type``.\n\n--dem2 <string (default: \"\")>\n    The DEM associated with the second image. To be used with\n    ``--ecef-transform-type``.\n\n--nodata-value <float (default: NaN)>\n    Pixels with values less than or equal to this number are treated\n    as no-data. This overrides the no-data values from input images.\n    \n--threads <integer (default: 0)>\n    Select the number of threads to use for each process. If 0, use\n    the value in ~/.vwrc.\n \n--cache-size-mb <integer (default = 1024)>\n    Set the system cache size, in MB.\n\n--tile-size <integer (default: 256 256)>\n    Image tile size used for multi-threaded processing.\n\n--no-bigtiff\n    Tell GDAL to not create BigTiff files.\n\n--tif-compress <None|LZW|Deflate|Packbits (default: LZW)>\n    TIFF compression method.\n\n-v, --version\n    Display the version of software.\n\n-h, --help\n    Display this help message.\n"
  },
  {
    "path": "docs/tools/image_calc.rst",
    "content": ".. _image_calc:\n\nimage_calc\n----------\n\nThis tool can be used to perform simple, per-pixel arithmetic on one or\nmore input images. An arithmetic operation specified on the command line\nis parsed and applied to each pixel, then the result is written to disk.\nThe tool supports multiple input images but each must be the same size\nand data type. Input images are restricted to one channel (band). For images with\nmore than one channel, only the first channel will be read.\n\nThe pixel in the first image is referred to as ``var_0``, the second as\n``var_1``, and so on. \n\nThe following symbols are allowed in the arithmetic string: ``+``, ``-``,\n``\\*``, ``/``, ``()``, ``min()``, ``max()``, ``pow()``, ``abs()``, ``sign()``.\n\nThe tool also supports certain conditional operations: ``lt``, ``gt``, ``lte``,\n``gte``, ``eq`` (``<``, ``>``, ``<=``, ``>=``, ``==`` respectively).  These must\nbe used in a format like ``lt(a, b, c, d)``, which translates to\n``if a < b then c else d``. Here, the values of ``a``, ``b``, ``c``, and ``d``\ncan be any variables or constants (:numref:`image_calc_above_thresh`).\n\nAn example arithmetic string to be passed via ``-c`` is::\n\n    \"-abs(var_0) + min(58, var_1, var_2) / 2\"\n\nThe tool respects the normal PEMDAS order of operations *except* that it parses\nequal priority operations with right-to-left associativity, so, ``a * b * c``\nbecomes ``a * (b * c)``. Parentheses can be used to enforce any preferred order\nof evaluation.\n\nExamples\n~~~~~~~~\n\nApply operation and save pixels as float32\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n::\n\n     image_calc -c \"pow(var_0/3.0, 1.1)\" input_image.tif \\\n      -o output_image.tif -d float32\n\n.. _image_calc_mask:\n\nApply a mask to an image\n^^^^^^^^^^^^^^^^^^^^^^^^\n\nMasking applies an existing binary mask to an image, where mask values of 1 keep\npixels and 0 discards them::\n\n    image_calc -c \"var_0 * var_1\" -d float32 \\\n        --output-nodata-value 0              \\\n        input.tif mask.tif -o output.tif\n\nHere it is assumed that the image and the mask have the same\ndimensions, and that the output pixels with value 0 are invalid.\n\n.. _image_calc_create_mask:\n\nCreate a binary mask via thresholding\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThresholding compares pixel values against a threshold to produce binary\ndecisions. This creates a mask with values of 1 and 0::\n\n    thresh=0.27\n    image_calc -c \"gte(var_0, $thresh, 1, 0)\" \\\n      -d float32                              \\\n      --output-nodata-value -1e+6             \\\n      input.tif -o output.tif\n\nHere, values greater or equal than the threshold become 1, and the rest become\n0. It is suggested to ensure that both the input and output nodata values are\ndifferent than either 0 or 1, and ideally less than these.\n\nThreshold and invalidate pixels below a value\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThis sets pixels below a threshold to nodata::\n\n    thresh=5.2\n    image_calc -c \"max($thresh, var_0)\" -d float32 \\\n        --output-nodata-value $thresh              \\\n        input.tif -o output.tif\n\nPixels with values at or below the threshold become nodata (set to the threshold\nvalue), while pixels strictly above the threshold retain their original values.\n\n.. _image_calc_above_thresh:\n\nThreshold and invalidate pixels above a value\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThis sets pixels at or above a threshold to nodata::\n\n    thresh=1000\n    nodata=-10000\n    image_calc -c \"gte(var_0, $thresh, $nodata, var_0)\" \\\n      -d float32                                        \\\n      --output-nodata-value $nodata                     \\\n      input.tif -o output.tif\n\nPixels at or above the threshold become nodata, while pixels below retain their\noriginal values.\n\nCreate an image with random values\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n::\n\n    image_calc -c \"rand(var_0)\" -d float32 \\\n        input.tif -o output.tif\n\nThe produced values will be between 0 and 1. Other operations\ncan be combined with this one. For example, one could\nadd a random value multiplied by a constant to the input image.\n\n.. _image_calc_metadata:\n\nAdd a value to the geoheader metadata\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n::\n\n     image_calc -c \"var_0\" --mo 'VAR1=VAL1' -d float32 \\\n       input.tif -o output.tif\n\nIf this variable already exists, its value will be overwritten. Other\nexisting variables will be preserved. Use ``gdalinfo`` to view the\nmetadata.\n\n.. _image_calc_stretch:\n\nStretch and convert to 8-bit\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nLinearly stretch the pixel values of a single-channel image to the 0 - 255 range\nand convert to ``uint8``. The input range is determined by the specified\npercentiles (default: 2% and 98%), mapping them to 0 and 255. Resulting values\nare rounded and clamped.\n\n::\n\n    image_calc --stretch input.tif -o output.tif\n\nThis is useful for visualizing floating-point data. Customize the bounds with\n``--percentile-range``.\n\nSee also: ``colormap`` (:numref:`colormap`) and ``hillshade``\n(:numref:`hillshade`).\n\nSubtract 360 degrees from the longitudes in a GeoTiff file\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n::\n\n    image_calc -c \"var_0\" input.tif -o output.tif \\\n      --longitude-offset -360 -d float32 \n\n\n.. _mask_disparity:\n\nExtract disparity bands respecting invalid disparities\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nASP produces disparity maps (:numref:`stereo_corr`) with three bands, having the\nhorizontal and vertical disparity, and mask of pixels showing the valid disparity.\n\nExtracting one disparity band with ``gdal_translate`` (:numref:`gdal_tools`)\nmakes it hard to see where the disparity is zero but valid, and where it is\ninvalid. This can be disambiguated with ``image_calc``, by using the mask from\nthe third band to set the invalid disparities in a band to nodata. \n\nFor that, first extract the three bands from a disparity produced by ASP\n(:numref:`out_corr_files`), such as ``F.tif``::\n\n    for b in 1 2 3; do \n      gdal_translate -b $b F.tif F_b${b}.tif\n    done\n      \nThen consider a value ``t`` that is larger than any disparity, such as\n``t=1e+6``. Add this value to all disparities, apply the mask from the third\nband, then subtract that value. Invalid values will become equal to ``-t``,\nwhich is set as the nodata value.\n\n::\n\n    t=1e+6\n    for b in 1 2; do \n      image_calc -c \"(var_0 + $t)*var_1 - $t\" \\\n      --output-nodata-value -$t               \\\n      F_b${b}.tif F_b3.tif                    \\\n      -o F_b${b}_nodata.tif\n    done\n    \nThe obtained disparity bands can be inspected (and colorized) with\n``stereo_gui`` (:numref:`stereo_gui`).\n\nAs of build 1/2026, this logic is implemented in ``disparitydebug`` (:numref:`disparitydebug`), with the option ``--raw``.\n\nUsage\n~~~~~\n\n::\n\n     image_calc [options] -c <arithmetic formula> <inputs> -o <output>\n\nCommand-line options\n~~~~~~~~~~~~~~~~~~~~\n\n-c, --calc <string>\n    The arithmetic string, in quotes. For a single input image, if\n    this is not set, it defaults to ``var_0`` so the identity operation.\n    It is required when there are multiple input images.\n\n-d, --output-data-type <type (default: float32)>\n    The data type of the output file. Options: uint8, uint16, uint32,\n    int16, int32, float32, float64.\n\n--input-nodata-value <double>\n    Set the nodata value for the input images, overriding the value in\n    the images, if present.\n\n--output-nodata-value <double>\n    Manually specify a nodata value for the output image. By default\n    it is read from the first input which has it, or, if missing, it\n    is set to data type min.\n\n-o, --output-file <string>\n    Output file name.\n\n--mo <string>\n    Write metadata to the output file.  Provide as a string in quotes\n    if more than one item, separated by a space, such as\n    ``'VAR1=VALUE1 VAR2=VALUE2'``.  Neither the variable names nor the\n    values should contain spaces.\n\n--longitude-offset <double (default: not specified)>\n    Add this value to the longitudes in the geoheader (can be used to\n    offset the longitudes by 360 degrees).\n\n--no-georef\n   Remove any georeference information (useful with subsequent\n   GDAL-based processing).\n\n--stretch\n   Linearly stretch, round, and clamp the input values to the 0 - 255 range\n   (uint8) based on the specified percentiles. See ``--percentile-range``.\n\n--percentile-range <min max (default: 2 98)>\n    The percentiles to use for stretching the image to 8-bit. These are double values.\n\n--threads <integer (default: 0)>\n    Select the number of threads to use for each process. If 0, use\n    the value in ~/.vwrc.\n \n--cache-size-mb <integer (default = 1024)>\n    Set the system cache size, in MB.\n\n--tile-size <integer (default: 256 256)>\n    Image tile size used for multi-threaded processing.\n\n--no-bigtiff\n    Tell GDAL to not create BigTiff files.\n\n--tif-compress <None|LZW|Deflate|Packbits (default: LZW)>\n    TIFF compression method.\n\n--cog\n    Write a cloud-optimized GeoTIFF (COG). See :numref:`cog_output`.\n\n-v, --version\n    Display the version of software.\n\n-h, --help\n    Display this help message.\n"
  },
  {
    "path": "docs/tools/image_mosaic.rst",
    "content": ".. _image_mosaic:\n\nimage_mosaic\n------------\n\nThe program ``image_mosaic`` aligns multiple input images into a single output\nimage. Currently it only supports a horizontal sequence of images such as\nscanned Corona images (:numref:`kh4`).\n\nIt is expected that the second input image is a continuation on the right of the\nfirst image, and so on. Otherwise, this program must be called with the images\nin reverse order, or by setting the ``--reverse`` option.\n\nExample\n~~~~~~~\n\n::\n\n     image_mosaic input1.tif input2.tif \\\n       --ot Float32 --blend-radius 2000 \\\n       --overlap-width 5000             \\\n       -o output.tif\n\nMore examples are in :numref:`kh4`, :numref:`kh7`, and :numref:`kh9`.\n       \nHandling failure\n~~~~~~~~~~~~~~~~\n\nIn case of failure, inspect the input images. This tool assumes the second\nimage can be appended to the right of the first image. It expects no rotation\nbetween the images.\n\nThis program can fail if not enough interest points are found to align the\nimages. It will try a couple of attempts with a larger value of\n``--ip-per-tile`` before giving up.\n\nTry using an even larger value of this parameter than what the program attempted\nand printed on the screen.\n\nAlso consider adjusting ``--inlier-threshold`` and ``--num-ransac-iterations``\nif the produced transform is not accurate. A lower inlier threshold will result\nin a more accurate transform but a higher chance of failure.\n\nUsage\n~~~~~\n\n::\n\n     image_mosaic [options] <images> -o output_file_path\n\nCommand-line options\n~~~~~~~~~~~~~~~~~~~~\n\n--t_orientation <horizontal>\n    Specify the image layout.  Currently only supports horizontal.\n\n--reverse\n    Mosaic the images in reverse order.\n\n--rotate\n    After mosaicking, rotate the image by 180 degrees around its\n    center.\n\n--rotate-90\n    After mosaicking, rotate the image by 90 degrees clockwise\n    around its center.\n\n--rotate-90-ccw\n    After mosaicking, rotate the image by 90 degrees counter-clockwise\n    around its center.\n\n--use-affine-transform\n    Solve for full affine transforms between segments instead of a\n    simpler rotate+translate transform.\n\n-o, --output-image <string>\n    Specify the output file path. Required.\n\n--overlap-width <number-of-pixels (default: 2000)>\n    The width of the expected overlap region in the images, in\n    pixels.\n\n--blend-radius <number-of-pixels>\n    The width in pixels over which blending is performed. Default\n    is calculated based on the overlap width.\n\n--band <integer (default: 1)>\n    Specify a band (channel) to use for multi-channel images. The band count\n    starts from 1.\n\n--ot <type (default: Float32)>\n    Output data type. Supported types: Byte, UInt16, Int16, UInt32,\n    Int32, Float32. If the output type is a kind of integer, values\n    are rounded and then clamped to the limits of that type.\n\n--input-nodata-value <double>\n    Override the input nodata value.\n\n--output-nodata-value double\n    Specify the output nodata value.\n\n--ip-per-tile integer\n    How many interest points to detect in each :math:`1024^2` image\n    tile (default: automatic determination).\n\n--output-prefix <string>\n    If specified, save here the interest point matches used in\n    mosaicking.\n\n--num-ransac-iterations <integer (default: 1000)>\n    How many iterations to perform in RANSAC when finding interest point \n    matches.\n\n--inlier-threshold <integer (default: 10)>\n    The inlier threshold (in pixels) to separate inliers from outliers when\n    computing interest point matches. A smaller threshold will result in fewer\n    inliers.\n\n--threads <integer (default: 0)>\n    Select the number of threads to use for each process. If 0, use\n    the value in ~/.vwrc.\n \n--cache-size-mb <integer (default = 1024)>\n    Set the system cache size, in MB.\n\n--tile-size <integer (default: 256 256)>\n    Image tile size used for multi-threaded processing.\n\n--no-bigtiff\n    Tell GDAL to not create BigTiff files.\n\n--tif-compress <None|LZW|Deflate|Packbits (default: LZW)>\n    TIFF compression method.\n\n--cog\n    Write a cloud-optimized GeoTIFF (COG). See :numref:`cog_output`.\n\n-v, --version\n    Display the version of software.\n\n-h, --help\n    Display this help message.\n"
  },
  {
    "path": "docs/tools/image_subset.rst",
    "content": ".. _image_subset:\n\nimage_subset\n------------\n\nGiven a set of overlapping georeferenced images, this program will extract a \nsubset that results in almost the same coverage as the original images.\n\nThis program is slow, as the algorithm complexity is proportional to the square\nof number of input images and the number of output pixels. It is best used with\nat most 100-200 images, each of dimensions of 1000 - 2000 pixels.\n\nAs of build 2025/11, this program is multi-threaded and reads each image in\nfully in memory, so it should not be used with large images.\n\nOverview\n~~~~~~~~\n\nA threshold determines if a pixel is considered to add to the coverage.\n\nThis program finds the image that contributes the most pixels no less than\nthe threshold, then the image that contributes the most additional pixels, etc.\n\nThe produced subset is saved to an output list, with the image name and number\nof contributing pixels on each line. The images are sorted in decreasing order\nof contribution to coverage.\n\nBackground and example\n~~~~~~~~~~~~~~~~~~~~~~\n\nThis program was developed as an auxiliary tool for Shape-from-Shading\nprocessing (:numref:`sfs_usage`). Early in this process it is desired to have a\nvery large number of images of diverse illumination to be able to coregister\nthem all. However, once that is done, just a representative subset of images is\nneeded for SfS, as using the full set can be prohibitive computationally. \n\nThe following way of invoking this tool is suggested. \n\nFirst, for a very large terrain, it is suggested to break it up into quadrants\nwith some overlap, collect all relevant images for each quadrant, and then\nprocess these quadrants separately. This will result in a faster runtime and\nproduce images that are more relevant to each smaller area.\n\nThen, break up the input image set into several groups, by Sun azimuth\n(:numref:`sfs_azimuth`), with 50 - 150 images in each group. This will help\nproduce subsets of images with diverse illumination.\n\nFor the images in each group, create a list of mapprojected images at a low\nresolution, for example, at 1/16 of original image resolution. This can be\naccomplished by using ``sub`` images produced by ``stereo_gui``\n(:numref:`stereo_gui`), whose resolution can be further reduced with a command\nsuch as::\n\n  gdalwarp -r cubicspline -tr <gridx> <gridy> input.tif output.tif\n\nThen, for each group, this program can be called as::\n\n  image_subset            \\\n    --threads 40          \\\n    --threshold 0.01      \\\n    --image-list list.txt \\\n    -o subset.txt \n\nNote, as before, that this program can be slow. A progress bar is\ndisplayed and helps track its advancement. If this is unreasonably slow,\nrun it on lower-resolution images or with fewer images.\n\nA good threshold can be found by clicking on pixels of representative images in\n``stereo_gui`` and observing the pixel values printed in the terminal.\n\nValidation\n~~~~~~~~~~\n\nWhen this program finishes, overlay the images in the produced list and inspect\nif they cover the desired area in decreasing order of contribution to coverage. \n\nThe program ``dem_mosaic`` (:numref:`dem_mosaic`) with the ``--max`` option\ncan be helpful in determining if the produced subset coverage is about\nthe same as for the original images.\n\nIt is likely acceptable to drop the last few images in the produced list, as\ntheir contribution may be marginal.\n\nCommand-line options\n~~~~~~~~~~~~~~~~~~~~\n\n--image-list <string (default: \"\")>\n    The list of input images.\n\n--output-list, -o <string (default: \"\")>\n    The file having the produced image subset, and for each image the number of\n    contributing pixels (sorted in decreasing order of contribution).\n    \n--threshold <double (default: NaN)>\n    The image threshold. Pixels no less than this will contribute to the coverage.\n\n--t_projwin <float float float float (default: 0 0 0 0)>\n    Specify a custom extent in projected coordinates in which to evaluate the\n    coverage. The format is ``min_x min_y max_x max_y`` or ``min_x max_y max_x\n    min_y``, with no quotes. In this mode all input images must use the same\n    projection.    \n    \n-v, --version\n    Display the version of software.\n\n-h, --help\n    Display this help message.\n\n"
  },
  {
    "path": "docs/tools/ipfind.rst",
    "content": ".. _ipfind:\n\nipfind\n------\n\nThe ``ipfind`` tool detects interest points (IPs) in images and writes\nthem out to .vwip files. ASP is able to read these files to recover\nthe IPs. These files can be visualized with ``stereo_gui``\n(:numref:`stereo_gui_vwip_gcp`).\n\nThis tool is useful in testing out different IP detection settings and\nvisualizing them (using the option ``--debug-image``).\n\nOne can pass multiple input images to ``ipfind`` and they will be\nprocessed one after another.\n\nThis program works in conjunction with ``ipmatch`` (:numref:`ipmatch`)\nto match interest points across images.\n\nUsage::\n\n     ipfind [options] <images>\n\nExaple::\n\n    ipfind image1.tif image2.tif image3.tif\n\nThis will write ``image1.vwip``, ``image2.vwip``, ``image3.vwip``.\n\nCommand-line options for ipfind:\n\n--interest-operator <sift|orb|OBALoG|LoG|Harris|IAGD (default: sift)>\n    Choose an interest point detector. SIFT and ORB are implemented\n    in OpenCV. OBALoG is from :cite:`jakkula2010efficient`. \n    IAGD (Integral Auto Gain Detector) is a variant of OBALoG.\n\n--descriptor-generator <sift|orb|sgrad|sgrad2|patch (default: sift)>\n    Choose a descriptor generator. Some descriptors work only with\n    certain interest point operators (for example, for 'OBALoG' use\n    'sgrad', 'sgrad2', 'patch').\n\n--ip-per-image <integer>\n    Set the maximum number of IP to find in the whole image. If not\n    specified, use instead the value of ``--ip-per-tile``.\n\n--ip-per-tile <integer (default: 250)>\n    Set the maximum number of IP to find in each tile. The tile size\n    is set with ``--tile-size``.\n\n-g, --gain <float (default: 1)>\n    Increasing this number will increase the gain at which interest\n    points are detected.\n\n--single-scale\n    Turn off scale-invariant interest point detection. This option\n    only searches for interest points in the first octave of the\n    scale space.  Harris and LoG only.\n\n--no-orientation\n    Turn off rotational invariance.\n\n--normalize\n    Normalize the input. Use for images that have non-standard\n    values such as ISIS cube files.\n\n--per-tile-normalize\n    Individually normalize each processing tile.\n\n--nodata-radius <integer (default: 1)>\n    Don't detect IP within this many pixels of image borders or\n    nodata.\n\n--output-folder <string>\n    Write output files to this location.\n\n-d, --debug-image <0|1|2 (default: 0)>\n    Write out a low-resolution or full-resolution debug image with\n    interest points on it if the value of this flag is respectively\n    1 or 2. The default (0) is to do nothing.\n\n--print-ip <integer (default: 0)>\n    Print information for this many detected IP.\n\n--lowe\n    Save the interest points in an ASCII data format that is\n    compatible with the Lowe-SIFT toolchain.\n\n--binary-to-txt\n    Convert a .vwip file to a text file. Each line has the fields:\n    x, y, scale, orientation, interest, polarity, octave, scale_lvl,\n    followed by the descriptor values. Usage::\n\n        ipfind --binary-to-txt input.vwip output.txt\n\n--threads <integer (default: 0)>\n    Select the number of threads to use for each process. If 0, use\n    the value in ~/.vwrc.\n \n--cache-size-mb <integer (default = 1024)>\n    Set the system cache size, in MB.\n\n--tile-size <integer (default: 256 256)>\n    Image tile size used for multi-threaded processing.\n\n--no-bigtiff\n    Tell GDAL to not create BigTiff files.\n\n--tif-compress <None|LZW|Deflate|Packbits (default: LZW)>\n    TIFF compression method.\n\n-v, --version\n    Display the version of software.\n\n-h, --help\n    Display this help message.\n"
  },
  {
    "path": "docs/tools/ipmatch.rst",
    "content": ".. _ipmatch:\n\nipmatch\n-------\n\nThe ``ipmatch`` program reads interest points (IPs) from ``.vwip`` files\nproduced with ``ipfind`` (:numref:`ipfind`) and finds matches among them,\nwriting out ``.match`` files containing the results. It can also produce debug\nimages with plotted match points. \n\nIf more than two image/``.vwip`` sets are passed in, each possible combination of\nimages will be matched.\n\nExample\n~~~~~~~\n\n::\n\n    ipmatch input/image1.tif input/image2.tif -o output/run\n\nThis will read the ``input/image1.vwip`` and ``input/image2.vwip`` files created\nby ``ipfind`` and write the binary match file::\n\n    output/run-image1__image2.match\n    \nThe ``.vwip`` files can be specified explicitly, after the image files.\n\nIf there are more images, then all combinations of matches will be written out.\n\nNote that this tool does not implement many of the IP matching steps that are\nused in :ref:`parallel_stereo` and :ref:`bundle_adjust`, since it does not use\nany camera information.\n\nPlain text match files and inspections\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nTo write plain text match files instead of binary, add the option\n``--matches-as-txt``. See also :numref:`txt_match`.\n\nThe binary and plain text match files can be inspected with ``stereo_gui``\n(:numref:`stereo_gui_view_ip`). \n\n.. _ipmatch_convert:\n\nMatch file format conversion\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nConvert a binary match file to plain text::\n\n    ipmatch --binary-to-txt input.match output.txt\n\nThe format of the plain text file is described in :numref:`txt_format`.\n\nConvert a plain text match file to binary::\n\n    ipmatch --txt-to-binary input.txt output.match\n\nThe program ``parse_match_file.py`` (:numref:`parse_match_file`) can do\nconversions as well.\n\n.. _ipmatch_merge:\n\nMerging match files\n~~~~~~~~~~~~~~~~~~~\n\nMerge multiple match files for the same image pair into one::\n\n    ipmatch --merge-match-files input1.match input2.match output.match\n\nDuplicates are identified by left interest point coordinates. The output can\nbe saved as plain text by adding ``--matches-as-txt``.\n\nNaming convention\n~~~~~~~~~~~~~~~~~\n\nThe naming convention for the output binary files is::\n\n    <output prefix>-<image1>__<image2>.match\n    \nwhere the image names are without the directory name and extension. See\n:numref:`ba_match_files` for more details.\n\nUsage\n~~~~~\n\nUsage::\n\n     ipmatch [options] <images> <vwip files>\n\nCommand-line options\n~~~~~~~~~~~~~~~~~~~~\n\nCommand-line options for ipmatch:\n\n--output-prefix <string (default: \"\")>\n    Write output files using this prefix.\n\n--matcher-threshold <float (default: 0.8)>\n    Threshold for the separation between closest and next closest\n    interest points.\n\n--distance-metric <L2|Hamming (default: L2)>\n    Distance metric to use.  Hamming should only be used for binary\n    types like ORB.\n\n--ransac-constraint <similarity|homography|fundamental|none>\n    RANSAC constraint type.\n\n--inlier-threshold <float (default: 10)>\n    RANSAC inlier threshold.\n\n--ransac-iterations <integer (default: 100)>\n    Number of RANSAC iterations.\n\n--flann-method <string (default = \"kmeans\")>\n    Choose the FLANN method for matching interest points. The default\n    ``kmeans`` is slower but deterministic, while ``kdtree`` is faster but\n    not deterministic (starting with FLANN 1.9.2).\n\n--non-flann\n    Use an implementation of the interest matcher that is not reliant on FLANN.\n\n--matches-as-txt\n    Read and write match files as plain text instead of binary. See\n    :numref:`txt_match`.\n\n--binary-to-txt\n    Read a binary match file and write it as plain text. The input and output\n    match files must be specified with appropriate extensions.\n\n--txt-to-binary\n    Read a plain text match file and write it as binary. The input and output\n    match files must be specified with appropriate extensions.\n\n--merge-match-files\n    Given several match files for the same image pair, merge them into one.\n    Duplicates are removed based on left interest point coordinates.\n\n-d, --debug-image\n    Set to write out debug images.\n\n--threads <integer (default: 0)>\n    Select the number of threads to use for each process. If 0, use\n    the value in ~/.vwrc.\n \n--cache-size-mb <integer (default = 1024)>\n    Set the system cache size, in MB.\n\n--tile-size <integer (default: 256 256)>\n    Image tile size used for multi-threaded processing.\n\n--no-bigtiff\n    Tell GDAL to not create BigTiff files.\n\n--tif-compress <None|LZW|Deflate|Packbits (default: LZW)>\n    TIFF compression method.\n\n-v, --version\n    Display the version of software.\n\n-h, --help\n    Display this help message.\n"
  },
  {
    "path": "docs/tools/jitter_solve.rst",
    "content": ".. _jitter_solve:\n\njitter_solve\n-------------\n\nThe ``jitter_solve`` program takes as input several overlapping images and\nlinescan and/or frame camera models in CSM format (such as for LRO NAC, CTX,\nHiRISE, Airbus Pleiades, DigitalGlobe, etc., :numref:`csm`) and adjusts each\nindividual camera position and orientation in the linescan model to make them\nmore consistent with each other and to the ground.\n\nThe goal is to reduce the effect of unmeasured perturbations in the\nlinescan sensor as it acquires the data. This is quite analogous to\nwhat ``bundle_adjust`` does (:numref:`bundle_adjust`), except that the\nlatter tool has just a single position and orientation per camera,\ninstead of a sequence of them.\n\nUsage::\n\n     jitter_solve <images> <cameras> <input adjustments> \\\n       -o <output prefix> [options]\n\n.. _jitter_limitations:\n\nLimitations\n~~~~~~~~~~~\n\nWhen the scan lines from the images are nearly parallel to each other the\njitter cannot be fully disambiguated, and some residual jitter is left unsolved.\n\nBest results are achieved if scan lines from one image cross blocks of scan\nlines from another image that correspond to at least one jitter period. In\npractice, for WorldView images, for example, the across-track angle can vary notably\nfrom one image to another, resulting in such a favorable regime.\n\nIf the prior DEM used as constraint (:numref:`jitter_dem_constraint`) has\nsystematic differences with what is expected from the images, this can bias the\nresults. Potential solutions are to mask the problematic areas in the DEM and /\nor use a value of ``--heights-from-dem-uncertainty`` that is quite a lot larger\nthan the actual uncertainty.\n\nGCP files produced from a prior DEM of good quality can help increase the accuracy\n(:numref:`dem2gcp`).\n\nA larger number of images (more than two, ideally with scan lines notably\ncrossing each other) can improve the results.\n\nIt is suggested to use this solver with carefully set camera position constraints\nand with anchor points, to prevent oscillations in the solution. An example\nis in :numref:`sfs_jitter`.\n\nMore research is needed about how to set up parameters for this solver in\nvarious situations.\n\nIf frame camera images exist for the same extent, they will help solve for jitter, \nas such images are rigid across scan lines.\n\n.. _jitter_ground:\n\nGround constraints\n~~~~~~~~~~~~~~~~~~\n\nOptimizing the cameras to reduce the jitter and make them self-consistent can\nresult in the camera system moving away from the initial location or warping of\nany eventually produced DEM.\n\nHence, ground and camera constraints are very important. This tool uses\nseveral kinds of constraints. They are described below, and an example of\ncomparing different ground constraints is given in :numref:`jitter_pleiades`.\n\n.. _jitter_tri_constraint:\n\nIntrinsic constraint\n^^^^^^^^^^^^^^^^^^^^\n\nTriangulated ground points obtained from interest point matches are kept, during\noptimization, close to their initial values. This works well when the images\nhave very good overlap. \n\nThis is controlled by the option ``--tri-weight`` whose default value is 0.1.\nThis is divided by the image GSD when computing the cost function, to make the\ndistances on the ground in units of pixels.\n\nA report file having the change in triangulated points is written to disk\n(:numref:`jitter_cam_offsets`). It can help evaluate the effect of this\nconstraint. Also check the pixel reprojection errors per camera\n(:numref:`jitter_errors_per_camera`) and per triangulated point\n(:numref:`jitter_tri_err`), before and after solving for jitter.\n\nTriangulated points that are constrained via a DEM (option\n``--heights-from-dem``, :numref:`jitter_dem_constraint`), that is, those that\nare near a valid portion of this DEM, are not affected by the triangulation\nconstraint.\n\nThe implementation is just as for bundle adjustment\n(:numref:`ba_ground_constraints`). \n\nAn example is given in :numref:`jitter_dg`. See :numref:`jitter_options` for the\nfull description of this option.\n\n.. _jitter_dem_constraint:\n\nExtrinsic constraint\n^^^^^^^^^^^^^^^^^^^^\n\nThis ties the triangulated ground points obtained from interest point matches to\nan external DEM, which may be at a lower resolution than the images. It is\nexpected that this external DEM is *well-aligned* with the input cameras (see\n:numref:`ba_pc_align` for how to do the alignment).\n\nThis option is named ``--heights-from-dem``, and it is controlled via\n``--heights-from-dem-uncertainty`` and ``--heights-from-dem-robust-threshold``.\nThe use of these options is shown in :numref:`jitter_ctx`.\n\nThe previously mentioned intrinsic constraint will be employed where the\ntriangulated points are not close to the DEM given by this option. \n\nThe DEM constraint is preferred, if a decent DEM that is well-aligned with the\ncameras is available.\n\nIf the difference between the stereo DEM before jitter correction and the\nreference DEM is large, the value of ``--heights-from-dem-uncertainty`` should\nbe increased. If the reference DEM has systematic differences, such as due to\nvegetation, this constraint may need to be omitted, or have the systematic \ndifferences masked. \n\nAn example with and without this constraint is shown in :numref:`jitter_pleiades`.\n\nSee also :numref:`jitter_limitations` for limitations of this constraint.\n\nThe implementation of this constraint is the same as for bundle adjustment\n(:numref:`heights_from_dem`). \n\nThis solver can also use a sparse point cloud as a constraint. This is \nan advanced option. See :numref:`jitter_ref_terrain`.\n\nGround control points\n^^^^^^^^^^^^^^^^^^^^^\n\nJust like ``bundle_adjust`` (:numref:`bagcp`), this program can make use of\nground control points. The pixel residuals at ground control points \nare flagged in the produced report file (:numref:`jitter_tri_err`).\n\nGround control points can be produced by tying a stereo DEM to a different\nhigh quality DEM (:numref:`dem2gcp`).\n\n.. _jitter_camera:\n\nCamera constraints\n~~~~~~~~~~~~~~~~~~\n\nJitter is believed to be caused by vibrations in the linescan camera as it\nacquires the image. If that is the case, the camera positions are likely\naccurate, and can be constrained to not move much, while the orientations can\nmove more. \n\nIf estimates for the horizontal and vertical camera position uncertainties\nexist, per camera, these can be incorporated into the optimization via the option\n``--camera-position-uncertainty``. It is good to use those uncertainties\ngenerously, so to set them to be larger than the actual uncertainty. \n\nSee the ``bundle_adjust`` documentation at :numref:`ba_cam_constraints`\nfor an example and implementation details.\n\nThis program writes report files that record the changes in camera position\n(:numref:`jitter_cam_offsets`) and the resulting pixel reprojection errors per\ncamera (:numref:`jitter_errors_per_camera`).\n\nIt is suggested to examine these and adjust the camera constraints, if needed. A\ntight constraint can prevent convergence and result in large reprojection\nerrors. \n\nAn alternative constraint, ``--camera-position-weight``, can be set to a large\nvalue, on the order of 1e+4, to effectively keep the camera positions in place.\nThis is an older option that will be removed.\n\nCamera position and ground constraints should be sufficient. It is suggested not\nto use the experimental ``--rotation-weight`` option.\n\nSmoothness constraint\n^^^^^^^^^^^^^^^^^^^^^\n\nThe option ``--smoothness-weight`` constraints how much each sequence of\nlinescan poses can change in curvature relative to the initial values. \nThis can prevent convergence. \n\nA range of values is suggested in :numref:`jitter_options`.\n\nRoll and yaw constraints\n^^^^^^^^^^^^^^^^^^^^^^^^\n\nOther related options that may improve the regularity of the camera poses \nare ``--roll-weight`` and ``--yaw-weight`` (they should be used with the \n``--initial-camera-constraint`` option).\n \nIt is strongly suggested not to use these (or the smoothness weight) in a first\npass. Only if happy enough with the results and it is desired to control various\naspects of the solution, one should try these options.\n\nValues for these are suggested in :numref:`jitter_options`.\n\nResampling the poses\n~~~~~~~~~~~~~~~~~~~~\n\nOftentimes, the number of tabulated camera positions and orientations\nin the CSM file is very small. For example, for Airbus Pleiades, the\nposition is sampled every 30 seconds, while acquiring the whole image\ncan take only 1.6 seconds. For CTX the opposite problem happens, the\norientations are sampled too finely, resulting in too many variables\nto optimize.\n\nHence, it is strongly suggested to resample the provided positions and\norientations before the solver optimizes them. Use the options:\n``--num-lines-per-position`` and ``--num-lines-per-orientation``. The\nestimated number of lines per position and orientation will be printed\non screen, before and after resampling.\n\nIn the two examples below drastically different sampling rates will be\nused. Inspection of residual files (:numref:`jitter_out_files`),\nand of triangulation errors (:numref:`triangulation_error`)\nand DEM differences after solving for jitter\n(:numref:`jitter_dg`) can help decide the sampling rate.\n\n.. _jitter_ip:\n\nInterest point matches\n~~~~~~~~~~~~~~~~~~~~~~\n\nSince solving for jitter is a fine-grained operation, modifying many positions\nand orientations along the satellite track. Hence, many dense and\nwell-distributed interest points are necessary. It is suggested to create these\nwith *pairwise stereo*, with the option ``--num-matches-from-disparity``\n(:numref:`dense_ip`). An example is shown in :numref:`jitter_ctx`. *An alternative*\nto pairwise stereo is discussed below.\n\nThe most accurate interest points are obtained when the images are mapprojected.\nThis is illustrated in :numref:`jitter_dg`. The produced interest point\nmatches will be, however, between the *original, unprojected images*, as expected\nby the solver. \n\nIt was found experimentally that the *best* dense interest point matches are\nobtained by invoking ``parallel_stereo`` with the options ``--stereo-algorithm\nasp_bm`` and ``--subpixel-mode 1``. The ``asp_mgm`` algorithm\n(:numref:`stereo_alg_overview`), while producing more pleasing results, smears\nsomewhat the interest points which makes solving for subpixel-level accurate\njitter less accurate.\n\nAll interest point matches from disparity must be copied to a single directory\nand *renamed according to the naming convention* (:numref:`ba_match_files`).\nThe jitter solver is passed the prefix of these files with the option\n``--match-files-prefix``.\n\nIf having more than two images, one can do pairwise stereo to get dense matches.\nFor a large number of images this is prohibitive.\n\n*Sparse* interest point matches can work *almost* as well if sufficiently\nwell-distributed and accurate. Then stereo is not necessary. Use\n``parallel_bundle_adjust`` with the options ``--ip-detect-method 1`` to create\nsubpixel-level accurate matches, and with ``--ip-per-tile 500 --matches-per-tile\n500`` to ensure there are plenty of them. The option ``--mapprojected-data``\n(:numref:`mapip`) is suggested as well.\n\nIt is suggested to call ``jitter_solve`` with a large value of\n``--max-pairwise-matches``, such as 40000, or 2-3 times more than that for \nimages with lots of lines and high-frequency jitter. *There must be at least\na handful of matches for each jitter period.*\n\nExamine the interest point matches in ``stereo_gui``\n(:numref:`stereo_gui_view_ip`). Also examine the produced ``pointmap.csv`` files\nto see the distribution and residuals of interest points\n(:numref:`jitter_tri_err`), and if the matches are dense enough given the\nobserved jitter.\n\nThis program can read interest point matches in the ISIS control network format,\nusing the option ``--isis-cnet``, and from an NVM file, with the option\n``--nvm``. \n\nSee :numref:`control_network` in the ``bundle_adjust``  manual for more details\nabout control networks. Unlike that program, ``jitter_solve`` does not save an\nupdated control network, as this tool changes the triangulated points only in\nvery minor ways. Camera poses from NVM files are not read either.\n\n.. _jitter_anchor_points:\n\nAnchor points\n~~~~~~~~~~~~~\n\nThe anchor points constraint uses a well-aligned external DEM, but with\nimportant differences, as compared to interest point matches. \n\nThe anchor points are created based on pixels that are uniformly distributed\nover each image, not just where the images overlap, and can even go beyond the\nfirst and last image line. This ensures that the optimized poses do not\noscillate where the images overlap very little or not at all.\n\nThis constraint works by projecting rays to the ground from the chosen\nuniformly distributed pixels, finding the *anchor points* where the\nrays intersect the DEM, then adding to the cost function to optimize\nreprojection errors (:numref:`bundle_adjustment`) for the anchor\npoints. This complements the reprojection errors from triangulated\ninterest point matches, and the external DEM constraint (if used).\n\nAnchor points are strongly encouraged either with an intrinsic constraint or an\nexternal DEM constraint. Their number and weights should be less than for the\ninterest points, to avoid these dominating the problem.\n\nResampling the camera poses very finely may require more anchor points.\n\nA report file that has the residuals at anchor points is written down\n(:numref:`anchor_point_files`).\n\nThe relevant options are ``--num-anchor-points``,\n``--num-anchor-points-per-tile``, ``--anchor-weight``, ``--anchor-dem``, and\n``--num-anchor-points-extra-lines``.  An example is given in\n:numref:`jitter_dg`.\n\nSolving for intrinsics \n~~~~~~~~~~~~~~~~~~~~~~\n\nFor some datasets there can be both jitter and lens distortion effects, such\nas for Kaguya TC (:numref:`kaguya_ba`, :numref:`jitter_kaguya`). In such cases,\nthe stronger phenomenon should be solved for first. \n\nThe ``bundle_adjust`` and ``jitter_solve`` programs can use each other's output\ncameras as inputs, as each saves image and optimized camera lists\n(:numref:`ba_out_cams`), which can then be passed in to the other program \nvia the ``--image-list`` and ``--camera-list`` options.\n\n.. _jitter_ctx:\n\nExample 1: CTX images on Mars\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nA CTX stereo pair will be used which has quite noticeable jitter.\nSee :numref:`jitter_multiple_images` for a discussion of multiple images,\nand a similar example for KaguyaTC in :numref:`jitter_kaguya`.\n\nSee also :numref:`jitter_limitations` for limitations of this constraint.\n\nInput images\n^^^^^^^^^^^^\n\nThe pair consists of images with ids::\n\n    J03_045820_1915_XN_11N210W\n    K05_055472_1916_XN_11N210W\n\nSee :numref:`ctx_example` for how to prepare the image files and\n:numref:`create_csm_linescan` for how to create CSM camera models.\n\nAll produced images and cameras were stored in a directory named\n``img``.\n\n.. _jitter_solve_ctx_dem:\n\nReference datasets\n^^^^^^^^^^^^^^^^^^\n\nThe MOLA dataset from:\n\n    https://ode.rsl.wustl.edu/mars/datapointsearch.aspx\n\nis used for alignment. The data for the following (very generous)\nlongitude-latitude extent was fetched: 146E to 152E, and 7N to 15N.\nThe obtained CSV file was saved as ``mola.csv``.\n\nA gridded DEM produced from this unorganized set of points\nis shipped with the ISIS data. It is gridded at 463 meters\nper pixel, which is quite coarse compared to CTX images,\nwhich are at 6 m/pixel, but it is good enough to constrain\nthe cameras when solving for jitter. A clip can be cut out of \nit with the command::\n\n    gdal_translate -co compress=lzw -co TILED=yes              \\\n     -co INTERLEAVE=BAND -co BLOCKXSIZE=256 -co BLOCKYSIZE=256 \\\n     -projwin -2057237.6 1077503.1 -1546698.4 275566.33        \\\n     $ISISDATA/base/dems/molaMarsPlanetaryRadius0005.cub       \\\n     ref_dem_shift.tif\n\nThis one has a 190 meter vertical shift relative to the preferred Mars\nradius of 3396190 meters, which can be removed as follows::\n\n    image_calc -c \"var_0-190\" -d float32 ref_dem_shift.tif \\\n      -o ref_dem.tif\n\nAs a sanity check, one can take the absolute difference of this DEM\nand the MOLA csv file as::\n\n    geodiff --absolute --csv-format 1:lon,2:lat,5:radius_m \\\n      mola.csv ref_dem.tif\n\nThis will give a median difference of 3 meters, which is about right, given the\nuncertainties in these datasets.\n\nA DEM can also be created from MOLA data with ``point2dem``\n(:numref:`point2dem`)::\n\n    point2dem -r mars --tr 500            \\\n      --stereographic --auto-proj-center  \\\n      --csv-format 1:lon,2:lat,5:radius_m \\\n      --search-radius-factor 10           \\\n      mola.csv\n\nThis DEM can be blurred with ``dem_mosaic``, with the option ``--dem-blur-sigma\n5``.\n \nUncorrected DEM creation\n^^^^^^^^^^^^^^^^^^^^^^^^\n\nBundle adjustment is run first::\n\n    bundle_adjust                               \\\n      --ip-per-image 20000                      \\\n      --max-pairwise-matches 100000             \\\n      --tri-weight 0.1                          \\\n      --tri-robust-threshold 0.1                \\\n      --camera-weight 0                         \\\n      --remove-outliers-params '75.0 3.0 10 10' \\\n      img/J03_045820_1915_XN_11N210W.cal.cub    \\\n      img/K05_055472_1916_XN_11N210W.cal.cub    \\\n      img/J03_045820_1915_XN_11N210W.cal.json   \\\n      img/K05_055472_1916_XN_11N210W.cal.json   \\\n      -o ba/run\n\nThe triangulation weight was used to help the cameras from drifting.\nOutlier removal was allowed to be more generous (hence the values of\n10 pixels above) as perhaps due to jitter some triangulated points\nobtained from interest point matches may not project perfectly in the\ncameras.\n\nHere we chose to use a large value for ``--max-pairwise-matches`` and\nwe will do the same when solving for jitter below. That is because\njitter-solving is a finer-grained operation than bundle adjustment,\nand a lot of interest point matches are needed. \n\nIt is very important to inspect the ``final_residuals_stats.txt`` report file to\nensure each image has had enough features and has small enough reprojection\nerrors (:numref:`ba_out_files`).\n\nStereo is run next. The ``local_epipolar`` alignment (:numref:`running-stereo`)\nhere did a flawless job, unlike ``affineepipolar`` alignment which resulted in\nsome blunders. \n\n::\n\n    parallel_stereo                              \\\n      --bundle-adjust-prefix ba/run              \\\n      --stereo-algorithm asp_mgm                 \\\n      --num-matches-from-disparity 40000         \\\n      --alignment-method local_epipolar          \\\n      img/J03_045820_1915_XN_11N210W.cal.cub     \\\n      img/K05_055472_1916_XN_11N210W.cal.cub     \\\n      img/J03_045820_1915_XN_11N210W.cal.json    \\\n      img/K05_055472_1916_XN_11N210W.cal.json    \\\n      stereo/run\n    point2dem --stereographic --auto-proj-center \\\n      --errorimage stereo/run-PC.tif\n\nNote how above we chose to create dense interest point matches from\ndisparity. They will be used to solve for jitter. We used the option\n``--num-matches-from-disparity``. See :numref:`jitter_ip` for\nmore details.\n\nSee :numref:`nextsteps` for a discussion about various speed-vs-quality choices\nfor stereo. Consider using mapprojected images (:numref:`mapproj-example`).\n\nWe chose to use here a local stereographic projection (:numref:`point2dem_proj`). \n\nThis DEM was aligned to MOLA and recreated, as::\n\n    pc_align --max-displacement 400              \\\n      --csv-format 1:lon,2:lat,5:radius_m        \\\n      stereo/run-DEM.tif mola.csv                \\\n      --save-inv-transformed-reference-points    \\\n      -o stereo/run-align\n    point2dem --stereographic --auto-proj-center \\\n      stereo/run-align-trans_reference.tif\n\nThe value in ``--max-displacement`` may need tuning\n(:numref:`pc_align`).\n\nThis transform was applied to the cameras (note that this approach is applicable *only*\nwhen the first cloud in ``pc_align`` was the ASP-produced DEM, otherwise see :numref:`ba_pc_align`)::\n\n    bundle_adjust                                                \\\n      --input-adjustments-prefix ba/run                          \\\n      --initial-transform stereo/run-align-inverse-transform.txt \\\n      img/J03_045820_1915_XN_11N210W.cal.cub                     \\\n      img/K05_055472_1916_XN_11N210W.cal.cub                     \\\n      img/J03_045820_1915_XN_11N210W.cal.json                    \\\n      img/K05_055472_1916_XN_11N210W.cal.json                    \\\n      --apply-initial-transform-only                             \\\n      -o ba_align/run\n\nSolving for jitter\n^^^^^^^^^^^^^^^^^^\n\nThen, jitter was solved for, using the *original cameras*, with the adjustments prefix\nhaving the latest refinements and alignment::\n\n    jitter_solve                               \\\n      img/J03_045820_1915_XN_11N210W.cal.cub   \\\n      img/K05_055472_1916_XN_11N210W.cal.cub   \\\n      img/J03_045820_1915_XN_11N210W.cal.json  \\\n      img/K05_055472_1916_XN_11N210W.cal.json  \\\n      --input-adjustments-prefix ba_align/run  \\\n      --max-pairwise-matches 100000            \\\n      --match-files-prefix stereo/run-disp     \\\n      --num-lines-per-position    1000         \\\n      --num-lines-per-orientation 1000         \\\n      --max-initial-reprojection-error 20      \\\n      --heights-from-dem ref_dem.tif           \\\n      --heights-from-dem-uncertainty 20.0      \\\n      --num-iterations 50                      \\\n      --num-anchor-points 0                    \\\n      --anchor-weight 0                        \\\n      --tri-weight 0.1                         \\\n      -o jitter/run\n\nIt was found that using about 1000 lines per pose (position and\norientation) sample gave good results, and if using too few lines, the\nposes become noisy. \n\nEither dense and *uniformly distributed* interest point matches or sufficiently\ndense *subpixel-level accurate sparse matches* are necessary to solve for jitter\n(:numref:`jitter_ip`).\n\nHere *anchor points* were not used. They can be necessary to stabilize the\nsolution (:numref:`jitter_anchor_points`).\n\nThe constraint relative to the reference DEM is needed, to make sure\nthe DEM produced later agrees with the reference one.  Otherwise, the\nfinal solution may not be unique, as a long-wavelength perturbation\nconsistently applied to all obtained camera trajectories may work just\nas well.\n\nIf using camera position constraints (:numref:`jitter_camera`), it is\nsuggested to be generous with the uncertainties. For CTX they are likely\nrather large.\n\nThe report files mentioned in :numref:`jitter_out_files` can be very helpful\nin evaluating how well the jitter solver worked, even before rerunning stereo.\n\nThe model states (:numref:`csm_state`) of optimized cameras are saved\nwith names like::\n\n    jitter/run-*.adjusted_state.json\n\nThen, stereo can be redone, just at the triangulation stage, which\nis much faster than doing it from scratch. The optimized cameras were\nused::\n\n    parallel_stereo                                                 \\\n      --prev-run-prefix stereo/run                                  \\\n      --stereo-algorithm asp_mgm                                    \\\n      --alignment-method local_epipolar                             \\\n      img/J03_045820_1915_XN_11N210W.cal.cub                        \\\n      img/K05_055472_1916_XN_11N210W.cal.cub                        \\\n      jitter/run-J03_045820_1915_XN_11N210W.cal.adjusted_state.json \\\n      jitter/run-K05_055472_1916_XN_11N210W.cal.adjusted_state.json \\\n      stereo_jitter/run\n    point2dem --stereographic --auto-proj-center                    \\\n      --errorimage stereo_jitter/run-PC.tif\n\nTo validate the results, first the triangulation (ray intersection) error\n(:numref:`point2dem`) was plotted, before and after solving for jitter. These\nwere colorized as::\n\n    colormap --min 0 --max 10 stereo/run-IntersectionErr.tif\n    colormap --min 0 --max 10 stereo_jitter/run-IntersectionErr.tif\n\nThe result is below.\n\n.. figure:: ../images/jitter_intersection_error.png\n   :name: ctx_jitter_intersection_error\n\n   The colorized triangulation error (max shade of red is 10 m)\n   before and after optimization for jitter.\n\nThen, the absolute difference was computed between the sparse MOLA\ndataset and the DEM after alignment and before solving for jitter, and\nthe same was done with the DEM produced after solving for it::\n\n    geodiff --absolute                                  \\\n      --csv-format 1:lon,2:lat,5:radius_m               \\\n      stereo/run-align-trans_reference-DEM.tif mola.csv \\\n      -o stereo/run\n\n    geodiff --absolute                                  \\\n      --csv-format 1:lon,2:lat,5:radius_m               \\\n      stereo_jitter/run-DEM.tif mola.csv                \\\n      -o stereo_jitter/run\n\nSimilar commands are used to find differences with the\nreference DEM::\n\n    geodiff --absolute ref_dem.tif                \\\n      stereo/run-align-trans_reference-DEM.tif -o \\\n      stereo/run\n    colormap --min 0 --max 20 stereo/run-diff.tif\n\n    geodiff --absolute ref_dem.tif                \\\n      stereo_jitter/run-DEM.tif                   \\\n      -o stereo_jitter/run\n    colormap --min 0 --max 20 stereo_jitter/run-diff.tif\n\nPlot with::\n\n    stereo_gui --colorize --min 0 --max 20 \\\n       stereo/run-diff.csv                 \\\n       stereo_jitter/run-diff.csv          \\\n       stereo/run-diff_CMAP.tif            \\\n       stereo_jitter/run-diff_CMAP.tif     \\\n       stereo_jitter/run-DEM.tif           \\\n       ref_dem.tif\n\nDEMs can later be hillshaded. \n\n.. figure:: ../images/jitter_dem_diff.png\n   :name: ctx_jitter_dem_diff_error\n\n   From left to right are shown colorized absolute differences of (a)\n   jitter-unoptimized but aligned DEM and ungridded MOLA (b) jitter-optimized\n   DEM and ungridded MOLA (c) unoptimized DEM and gridded MOLA (d)\n   jitter-optimized DEM and gridded MOLA. Then, (e) hillshaded optimized DEM (f)\n   hillshaded gridded MOLA (which is the reference DEM). The max shade of red is\n   20 m difference.\n\nIt can be seen that the banded systematic error due to jitter is gone,\nboth in the triangulation error maps and DEM differences. The produced\nDEM still disagrees somewhat with the reference, but we believe that\nthis is due to the reference DEM being very coarse, per plots (e) and\n(f) in the figure.\n\n.. _jitter_multiple_images:\n\nMultiple CTX images\n^^^^^^^^^^^^^^^^^^^\n\nJitter was solved jointly for a set of 27 CTX images with much overlap.\nThe extent was roughly between -157.8 and -155.5 degrees of longitude, and from\n-0.3 to 3.8 degrees of latitude. \n\nBundle adjustment for the entire set was run as before. The\n``convergence_angles.txt`` report file (:numref:`ba_conv_angle`) was used to\nfind stereo pairs. Only stereo pairs with a median convergence angle of at least\n5 degrees were processed, and which had at least several dozen shared interest\npoints. This resulted in 42 stereo pairs.\n\nThe resulting stereo DEMs can be mosaicked with ``dem_mosaic``\n(:numref:`dem_mosaic`). Alignment to MOLA can be done as before, and the \nalignment transform must be applied to the cameras (:numref:`ba_pc_align`).\n\nThen, jitter was solved for, as earlier, but for the entire set at once. Dense\npairwise matches were used (:numref:`dense_ip`). They were copied from\nindividual stereo directories to a single directory. It is important to use the\nproper naming convention (:numref:`ba_match_files`).\n\nOne could augment or substitute the dense matches with *subpixel-level accurate*\nsparse matches from bundle adjustment if renamed to the proper convention\n(:numref:`jitter_ip`). This can be helpful to ensure all images are tied\ntogether.\n\nThe DEM used as a constraint can be either the existing gridded MOLA product, or\nit can be created from MOLA with ``point2dem`` (:numref:`jitter_solve_ctx_dem`).\nHere the second option was used. Consider adjusting the value of\n``--heights-from-dem-uncertainty``. Tightening the DEM constraint is\nusually not problematic, if the alignment to the DEM is good.\n\n.. figure:: ../images/jitter_ctx_dem_drg.png\n   :name: jitter_ctx_dem_drg\n\n   DEM and orthoimage produced by mosaicking the results for the 27 stereo\n   pairs. Some seams in the DEMs are seen. Perhaps it is due to insufficiently\n   good distortion modeling. For the orthoimages, the first encountered pixel\n   was used at a given location.\n\n.. figure:: ../images/jitter_ctx_error_image.png\n   :name: jitter_ctx_error_image\n\n   Mosaicked triangulation error image (:numref:`triangulation_error`), before\n   (left) and after (right) solving for jitter. The range of values is between 0\n   and 15 meters. It can be seen that the triangulation error greatly decreases.\n   This was produced with ``dem_mosaic --max``.\n\n.. figure:: ../images/jitter_ctx_mola_diff.png\n   :name: jitter_ctx_mola_diff\n\n   Signed difference of the mosaicked DEM and MOLA before (left) and after\n   (right) solving for jitter. It can be seen that the jitter artifacts are\n   greatly attenuated. Some systematic error is seen in the vertical direction,\n   roughly in the middle of the image. It is in the area where the MOLA data is\n   sparsest, and maybe that results in the ground constraint not working as\n   well. Or could be related to the seams issue noted earlier.\n\n.. _jitter_dg:\n\nExample 2: WorldView-3 DigitalGlobe images on Earth\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nJitter was successfully solved for a pair of WorldView-3 images over a\nmountainous site in `Grand Mesa\n<https://en.wikipedia.org/wiki/Grand_Mesa>`_, Colorado, US.\n\nThis is a much more challenging example than the earlier one for CTX,\nbecause:\n\n - Images are much larger, at 42500 x 71396 pixels, compared to 5000 x\n   52224 pixels for CTX.\n - The jitter appears to be at much higher frequency, necessitating\n   using 50 image lines for each position and orientation to optimize\n   rather than 1000.\n - Many dense interest point matches and anchor points are needed\n   to capture the high-frequency jitter Many anchor points are needed\n   to prevent the solution from becoming unstable at earlier and later\n   image lines.\n - The terrain is very steep, which introduces some extraneous signal\n   in the problem to optimize.\n\nSee :numref:`jitter_limitations` regarding limitations of this program.\n   \nWe consider a dataset with two images named 1.tif and 2.tif, and corresponding\ncamera files 1.xml and 2.xml, having the exact DigitalGlobe linescan model.\n\nBundle adjustment\n^^^^^^^^^^^^^^^^^\n\nBundle adjustment was invoked first to reduce any errors between\nthe cameras. This is not strictly necessary for WorldView images,\nas they are usually quite well-registered.\n\nThis command expects raw (not mapprojected) images::\n\n    bundle_adjust                               \\\n      -t dg                                     \\\n      --ip-detect-method 1                      \\\n      --ip-per-image 10000                      \\\n      --tri-weight 0.1                          \\\n      --tri-robust-threshold 0.1                \\\n      --camera-weight 0                         \\\n      --remove-outliers-params '75.0 3.0 10 10' \\\n      1.tif 2.tif                               \\\n      1.xml 2.xml                               \\\n      -o ba/run\n\nA lot of interest points were used, and the outlier filter threshold\nwas generous, since because of trees and shadows in the images likely\nsome interest points may not be too precise but they could still be\ngood.\n\nMapprojection\n^^^^^^^^^^^^^\n\nBecause of the steep terrain, the images were mapprojected onto the\nCopernicus 30 m DEM (:numref:`initial_terrain`). We name that DEM\n``ref.tif``. (Ensure the DEM is relative to WGS84 and not EGM96,\nand convert if necessary; see :numref:`conv_to_ellipsoid`.)\n\n.. figure:: ../images/grand_mesa_copernicus_dem.png\n   :scale: 50%\n   :name: grand_mesa_copernicus_dem\n\n   The Copernicus 30 DEM for the area of interest. Some of the\n   topographic signal, including cliff edges and trees will be\n   noticeable in the error images produced below.\n\nMapprojection of the two images (:numref:`mapproj-example`)::\n\n    proj=\"+proj=utm +zone=13 +datum=WGS84 +units=m +no_defs\"\n    for i in 1 2; do\n      mapproject -t dg                          \\\n      --nodes-list nodes_list.txt               \\\n      --tr 0.4                                  \\\n      --t_srs \"$proj\"                           \\\n      ref.tif ${i}.tif ${i}.xml ${i}.map.tif\n    done\n\nHere the exact cameras were used for mapprojection (option ``-t dg``). In\nearlier versions of ASP this was slow, and the faster RPC model\nwas used (``-t rpc``). \n\nHere we did not use the adjustments from ``bundle_adjust``, \nas it appears that the original cameras are already quite accurate.\nWe will incorporate those into subsequent steps, however.\n\nStereo\n^^^^^^\n\nStereo was done with the ``asp_mgm`` algorithm. We found that the option\n``--subpixel-mode 1`` may result in somewhat more accurate interest point\nmatches from disparity (for use later) but ``--subpixel-mode 9`` could produce a\nterrain model with less artifacts. This likely needs more study. We will proceed\nwith ``--subpixel-mode 1`` here. Subpixel mode 3 (or 2) would likely be better\nthan any of these, but are a lot slower. \n\nIt also appears that it is preferable to use mapprojected images than some other\nalignment methods as those would result in more subpixel artifacts which would\nobscure the jitter signal which we will solve for.\n\nThe option ``--max-disp-spread 100`` was used because the images\nhad many clouds (:numref:`handling_clouds`).\n\nA large number of *dense interest point matches* from stereo disparity will be\ncreated (:numref:`jitter_ip`), to be used later to solve for jitter.\n\n::\n\n    parallel_stereo                      \\\n      --max-disp-spread 100              \\\n      --nodes-list nodes_list.txt        \\\n      --ip-per-image 10000               \\\n      --stereo-algorithm asp_mgm         \\\n      --subpixel-mode 1                  \\\n      --processes 6                      \\\n      --alignment-method none            \\\n      --num-matches-from-disparity 60000 \\\n      --bundle-adjust-prefix ba/run      \\\n      1.map.tif 2.map.tif 1.xml 2.xml    \\\n      run_1_2_map/run                    \\\n      ref.tif\n\n    proj=\"+proj=utm +zone=13 +datum=WGS84 +units=m +no_defs\"\n    point2dem --tr 0.4 --t_srs \"$proj\" --errorimage \\\n      run_1_2_map/run-PC.tif\n\nA discussion regarding the projection to use above is in :numref:`point2dem_proj`.\n\nAlignment\n^^^^^^^^^\n\nThe alignment step is not strictly necessary for WorldView images, as they are rather\nwell-aligned already. Here we show the step for completeness.\n\nAlign the stereo DEM to the reference DEM::\n\n    pc_align --max-displacement 100           \\\n      run_1_2_map/run-DEM.tif ref.tif         \\\n      --save-inv-transformed-reference-points \\\n      -o align/run\n    proj=\"+proj=utm +zone=13 +datum=WGS84 +units=m +no_defs\"\n    point2dem --tr 0.4 --t_srs \"$proj\" align/run-trans_reference.tif\n\nIt is suggested to hillshade and inspect the obtained DEM and overlay\nit onto the hillshaded reference DEM. The ``geodiff`` command\n(:numref:`geodiff`) can be used to take their difference.\n\nApply the alignment transform to the bundle-adjusted cameras,\nto align them with the reference terrain::\n\n    bundle_adjust                                         \\\n      --input-adjustments-prefix ba/run                   \\\n      --match-files-prefix ba/run                         \\\n      --skip-matching                                     \\\n      --initial-transform align/run-inverse-transform.txt \\\n      1.tif 2.tif 1.xml 2.xml                             \\\n      --apply-initial-transform-only                      \\\n      -o align/run\n\nIf the clouds in ``pc_align`` were in reverse order, the direct transform must\nbe used, *not the inverse* (:numref:`ba_pc_align`).\n\nSolving for jitter\n^^^^^^^^^^^^^^^^^^\n\nCopy the produced dense interest point matches for use in solving for jitter::\n\n    mkdir -p dense\n    cp run_1_2_map/run-disp-1.map__2.map.match \\\n      dense/run-1__2.match\n\nIn ASP 3.4.0 or later, that file to be copied is named instead\n``run_1_2_map/run-disp-1__2.match``, or so, reflecting the names of the raw\nimages, as these matches are between the *original images*, even if produced\nfrom mapprojected images. \n\nSee :numref:`jitter_ip` for a longer explanation regarding dense and sparse\ninterest point matches.\n\nSolve for jitter. This commands expects raw (not mapprojected) images::\n\n    jitter_solve                              \\\n      1.tif 2.tif                             \\\n      1.xml 2.xml                             \\\n      --input-adjustments-prefix align/run    \\\n      --match-files-prefix dense/run          \\\n      --num-iterations 50                     \\\n      --max-pairwise-matches 100000           \\\n      --max-initial-reprojection-error 20     \\\n      --tri-weight 0.1                        \\\n      --tri-robust-threshold 0.1              \\\n      --num-lines-per-position    400         \\\n      --num-lines-per-orientation 400         \\\n      --heights-from-dem ref.tif              \\\n      --heights-from-dem-uncertainty 20       \\\n      --num-anchor-points 10000               \\\n      --num-anchor-points-extra-lines 500     \\\n      --anchor-dem ref.tif                    \\\n      --anchor-weight 0.1                     \\\n    -o jitter/run\n\nThe value of ``--heights-from-dem-uncertainty`` is very important. See\n:numref:`jitter_dem_constraint` regarding the DEM constraint,\n:numref:`jitter_camera` regarding camera constraints, and\n:numref:`jitter_anchor_points` regarding anchor points. \n\nThe report files mentioned in :numref:`jitter_out_files` can be very helpful\nin evaluating how well the jitter solver worked, even before rerunning stereo.\n\n.. _fig_dg_jitter_pointmap_anchor_points:\n\n.. figure:: ../images/dg_jitter_pointmap_anchor_points.png\n   :name: dg_jitter_pointmap_anchor_points\n\n   The pixel reprojection errors per triangulated point (first column) and per\n   anchor point (second column) before and after (left and right) solving for\n   jitter. Blue shows an error of 0, and red is an error of at least 0.3 pixels.\n\nIt can be seen in :numref:`fig_dg_jitter_pointmap_anchor_points` that\nafter optimization the jitter (oscillatory pattern) goes away, but the\nerrors per anchor point do not increase much. The remaining red points\nare because of the steep terrain. See :numref:`jitter_out_files` for\ndescription of these output files and how they were plotted.\n\nRedoing mapprojection and stereo\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe jitter solver produces optimized CSM cameras (:numref:`csm`), for all types\nof input cameras. \n\nOne can reuse the previously created mapprojected images with the new cameras\n(:numref:`jitter_reuse_run`). Alternatively, here is how to recreate the\nmapprojected images:: \n\n    proj=\"+proj=utm +zone=13 +datum=WGS84 +units=m +no_defs\"\n    for i in 1 2; do \n      mapproject -t csm                     \\\n        --nodes-list nodes_list.txt         \\\n        --tr 0.4 --t_srs \"$proj\"            \\\n        ref.tif ${i}.tif                    \\\n        jitter/run-${i}.adjusted_state.json \\\n        ${i}.jitter.map.tif\n    done\n \nRun stereo::\n\n    parallel_stereo                                        \\\n      --max-disp-spread 100                                \\\n      --nodes-list nodes_list.txt                          \\\n      --ip-per-image 20000                                 \\\n      --stereo-algorithm asp_mgm                           \\\n      --subpixel-mode 9                                    \\\n      --processes 6                                        \\\n      --alignment-method none                              \\\n      1.jitter.map.tif 2.jitter.map.tif                    \\\n      jitter/run-1.adjusted_state.json                     \\\n      jitter/run-2.adjusted_state.json                     \\\n      stereo_jitter/run                                    \\\n      ref.tif\n\n    point2dem --tr 0.4 --t_srs \"$proj\"                     \\\n      --errorimage                                         \\\n      stereo_jitter/run-PC.tif\n\n.. _jitter_reuse_run:\n\nReusing a previous run\n^^^^^^^^^^^^^^^^^^^^^^\n\nIn ASP 3.3.0 or later, the mapprojection need not be redone, and stereo can\nresume at the triangulation stage (:numref:`mapproj_reuse`). This saves a lot of\ncomputing. The commands in the previous section can be replaced with::\n\n    parallel_stereo                                        \\\n      --max-disp-spread 100                                \\\n      --nodes-list nodes_list.txt                          \\\n      --ip-per-image 20000                                 \\\n      --stereo-algorithm asp_mgm                           \\\n      --subpixel-mode 9                                    \\\n      --processes 6                                        \\\n      --alignment-method none                              \\\n      --prev-run-prefix run_1_2_map/run                    \\\n      1.map.tif 2.map.tif                                  \\\n      jitter/run-1.adjusted_state.json                     \\\n      jitter/run-2.adjusted_state.json                     \\\n      stereo_jitter/run                                    \\\n      ref.tif\n\n    point2dem --tr 0.4 --t_srs \"$proj\"                     \\\n      --errorimage                                         \\\n      stereo_jitter/run-PC.tif\n\nNote how we used the old mapprojected images ``1.map.tif`` and ``2.map.tif``,\nthe option ``--prev-run-prefix`` pointing to the old run, while the\ntriangulation is done with the new jitter-corrected CSM cameras. \n\nValidation\n^^^^^^^^^^\n\nThe geodiff command (:numref:`geodiff`) can be used to take the absolute\ndifference of the aligned DEM before jitter correction and the one\nafter it::\n\n    geodiff --float --absolute align/run-trans_reference-DEM.tif \\\n      stereo_jitter/run-DEM.tif -o stereo_jitter/run\n\nSee :numref:`fig_dg_jitter_intersection_err_dem_diff` for results.\n \n.. _fig_dg_jitter_intersection_err_dem_diff:\n\n.. figure:: ../images/dg_jitter_intersection_err_dem_diff.png\n   :name: dg_jitter_intersection_err_dem_diff\n\n   The colorized triangulation error (:numref:`triangulation_error`)\n   before and after solving for jitter, and the absolute difference of\n   the DEMs before and after solving for jitter\n   (left-to-right). It can be seen that the oscillatory pattern in the\n   intersection error is gone, and the DEM changes as a result. The\n   remaining signal is due to the steep terrain, and is\n   rather small.\n\n.. _jitter_pleiades:\n\nExample 3: Airbus Pleiades\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nIn this section we will solve for jitter with Pleiades linescan cameras. The\nsame approach applies to SPOT 6/7 (:numref:`spot67`) and PeruSat-1\n(:numref:`perusat1`). SPOT 6/7 and PeruSat-1 support is available as of build\n2026/03 (:numref:`release`).\n\nWe will investigate the effects of two kinds of ground constraints:\n``--tri-weight`` and ``--heights-from-dem`` (:numref:`jitter_ground`). The first\nconstraint tries to keep the triangulated points close to where they are, and\nthe second tries to tie them to a reference DEM. Note that if these are used\ntogether, the first one will kick in only in regions where there is no coverage\nin the provided DEM.\n\nThe conclusion is that if the two kinds of ground constraints are\nweak, and the reference DEM is decent, the results are rather similar.\nThe DEM constraint is preferred if a good reference DEM is available,\nand the cameras are aligned to it.\n\nSee :numref:`jitter_limitations` regarding limitations of this program.\n\nCreation of terrain model\n^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe site used is Grand Mesa, as in :numref:`jitter_dg`, and the two\nrecipes also have similarities.\n\nFirst, a reference DEM (Copernicus) for the area is fetched, and\nadjusted to be relative to WGS84, creating the file ``ref-adj.tif``\n(:numref:`initial_terrain`).\n\nLet the images be called ``1.tif`` and ``2.tif``. The Pleiades exact camera\nmodel names usually start with the prefix ``DIM``. Here, for simplicity, we will\nname them  ``1.xml`` and ``2.xml``. \n\n*Do not use the Pleiades RPC camera models.* Their names start with the ``PRC``\nprefix.\n\nSince the GSD specified in these files is about 0.72 m, this value is used in\nmapprojection of both images (:numref:`mapproj-example`)::\n\n    proj=\"+proj=utm +zone=13 +datum=WGS84 +units=m +no_defs\"\n      mapproject --processes 4 --threads 4 \\\n      --tr 0.72 --t_srs \"$proj\"            \\\n      --nodes-list nodes_list.txt          \\\n      ref-adj.tif 1.tif 1.xml 1.map.tif\n\nand same for the other image.\n\nSince the two mapprojected images agree very well with the hillshaded\nreference DEM when overlaid in ``stereo_gui`` (:numref:`stereo_gui`), \nno bundle adjustment was used. \n\nStereo was run, and we create dense interest point matches from disparity,\nthat will be needed later::\n\n    outPrefix=stereo_map_12/run\n    parallel_stereo                      \\\n      --max-disp-spread 100              \\\n      --nodes-list nodes_list.txt        \\\n      --ip-per-image 10000               \\\n      --num-matches-from-disparity 90000 \\\n      --stereo-algorithm asp_mgm         \\\n      --subpixel-mode 9                  \\\n      --processes 6                      \\\n      --alignment-method none            \\\n      1.map.tif 2.map.tif                \\\n      1.xml 2.xml                        \\\n      $outPrefix                         \\\n      ref-adj.tif                        \\\n\nDEM creation::\n\n    proj=\"+proj=utm +zone=13 +datum=WGS84 +units=m +no_defs\"\n    point2dem --t_srs \"$proj\" \\\n      --errorimage            \\\n      ${outPrefix}-PC.tif\n\nSee :numref:`point2dem_proj` for a discussion of the projection to use.\n\nColorize the triangulation (ray intersection) error, and create some\nimage pyramids for inspection later::\n\n    colormap --min 0 --max 1.0 ${outPrefix}-IntersectionErr.tif\n    stereo_gui --create-image-pyramids-only \\\n      --hillshade ${outPrefix}-DEM.tif\n    stereo_gui --create-image-pyramids-only \\\n      ${outPrefix}-IntersectionErr_CMAP.tif\n\n.. _pleiades_img_dem:\n.. figure:: ../images/pleiades_imag_dem.png\n   :name: pleiades_image_and_dem\n\n   Left to right: One of the input images, the produced hillshaded DEM,\n   and the reference Copernicus DEM.\n\nIt can be seen in :numref:`pleiades_img_dem` (center) that a small\nportion having snow failed to correlate. That is not a\nshowstopper here. Perhaps adjusting the image normalization options in\n:numref:`stereodefault` may resolve this.\n\nCorrecting the jitter\n^^^^^^^^^^^^^^^^^^^^^\n\nThe jitter can clearly be seen in :numref:`pleiades_err` (left).\nThere seem to be about a dozen oscillations. Hence, ``jitter_solve``\nwill be invoked with one position and orientation sample for each 500\nimage lines, which results in about 100 samples for these, along the\nsatellite track. Note that earlier we used\n``--num-matches-from-disparity 90000`` which created about 300 x\n300 dense interest point matches for these roughly square input\nimages. These numbers usually need to be chosen with some care.\n\nCopy the dense interest point matches found in stereo, using the convention\n(:numref:`ba_match_files`) expected later by ``jitter_solve``:: \n\n    mkdir -p matches\n    /bin/cp -fv stereo_map_12/run-disp-1.map__2.map.match \\\n      matches/run-1__2.match\n\nIn ASP 3.4.0 or later, that file to be copied is named instead\n``run_1_2_map/run-disp-1__2.match``, or so, reflecting the names of the raw\nimages.\n\nSee :numref:`jitter_ip` for a longer explanation regarding dense interest point\nmatches.\n\nSolve for jitter with the intrinsic ``--tri-weight`` ground constraint\n(:numref:`jitter_ground`). Normally, the cameras should be bundle-adjusted and\naligned to the reference DEM, and then below the option\n``--input-adjustments-prefix`` should be used, but in this case the initial\ncameras were accurate enough, so these steps were skipped.\n\n:: \n\n    jitter_solve                               \\\n      1.tif 2.tif                              \\\n      1.xml 2.xml                              \\\n      --match-files-prefix matches/run         \\\n      --num-iterations 50                      \\\n      --max-pairwise-matches 100000            \\\n      --max-initial-reprojection-error 20      \\\n      --tri-weight 0.1                         \\\n      --tri-robust-threshold 0.1               \\\n      --num-lines-per-position    500          \\\n      --num-lines-per-orientation 500          \\\n      --num-anchor-points 10000                \\\n      --num-anchor-points-extra-lines 500      \\\n      --anchor-dem ref-adj.tif                 \\\n      --anchor-weight 0.1                      \\\n      -o jitter_tri/run\n\nSee :numref:`jitter_camera` for a discussion of camera constraints.\nSee :numref:`jitter_anchor_points` regarding anchor points.\n\nThe report files mentioned in :numref:`jitter_out_files` can be very helpful\nin evaluating how well the jitter solver worked, even before rerunning stereo.\n\nNext, we invoke the solver with the same initial data, but with a constraint\ntying to the reference DEM, with the option ``--heights-from-dem ref-adj.tif``.\nSince the difference between the created stereo DEM and the reference DEM is on\nthe order of 5-10 meters, we will use ``--heights-from-dem-uncertainty 20``. \n\n.. figure:: ../images/pleiades_err.png\n   :name: pleiades_err\n\n   Stereo intersection error (:numref:`triangulation_error`)\n   before solving for jitter (left),\n   after solving for it with the ``--tri-weight`` constraint (middle)\n   and with the ``--heights-from-dem`` constraint (right). Blue = 0\n   m, red = 1 m.\n\nIt can be seen in :numref:`pleiades_err` that any of these constraints\ncan work at eliminating the jitter.\n\n.. figure:: ../images/pleiades_dem_abs_diff.png\n   :name: pleiades_dem_diff\n\n   Absolute difference of the stereo DEMs before and after \n   solving for jitter. Left: with the ``--tri-weight``\n   constraint. Right: with the ``--heights-from-dem`` constraint. Blue\n   = 0 m, red = 1 m.\n\nIt is very instructive to examine how much the DEM changed as a\nresult. It can be seen in :numref:`pleiades_dem_diff` that the reference\nDEM constraint changes the result more. Likely, a smaller value\nof the weight for that constraint could have been used.\n\n.. _jitter_aster:\n\nASTER cameras\n~~~~~~~~~~~~~\n\nASTER (:numref:`aster`) is a very good testbed for studying jitter because\nthere are millions of free images over a span of 20 years, with many over the\nsame location, and the images are rather small, on the order of 4,000 - 5,000\npixels along each dimension.\n\nSee :numref:`jitter_limitations` regarding limitations of this program.\n\nSetup\n^^^^^\n\nIn this example we worked on a rocky site in Egypt with a latitude 24.03562\ndegrees and longitude of 25.85006 degrees. Dozens of cloud-free stereo pairs\nare available here. The jitter pattern, including its frequency, turned out to\nbe quite different in each stereo pair we tried, but the solver was able to\nminimize it in all cases.\n\nFetch and prepare the data as documented in :numref:`aster_fetch`. Here we will\nwork with dataset ``AST_L1A_00301062002090416_20231023221708_3693``.\n\nA reference Copernicus DEM can be downloaded per :numref:`initial_terrain`. Use\n``dem_geoid`` to convert the DEM to be relative to WGS84. \n\nInitial stereo and alignment\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nWe will call the two images in an ASTER stereo pair ``out-Band3N.tif`` and\n``out-Band3B.tif``. This is the convention used by ``aster2asp``\n(:numref:`aster2asp`), and instead of ``out`` any other string can be used. The\ncorresponding cameras are ``out-Band3N.xml`` and ``out-Band3B.xml``. The\nreference Copernicus DEM relative to WGS84 is ``ref.tif``.\n\nBundle adjustment::\n\n  bundle_adjust -t aster          \\\n    --camera-weight 0.0           \\\n    --tri-weight 0.1              \\\n    --tri-robust-threshold 0.1    \\\n    --num-iterations 50           \\\n    out-Band3N.tif out-Band3B.tif \\\n    out-Band3N.xml out-Band3B.xml \\\n    -o ba/run\n\nNot using ``-t aster`` will result in RPC cameras being used, which would lead\nto wrong results. The adjusted cameras are saved in CSM format\n(:numref:`csm_state`), which is needed for the jitter solver. The produced\n.adjust files should not be used as they save the adjustments only.\n\nStereo was done with mapprojected images. The reference DEM was blurred a little\nas it is at the resolution of the images, and then any small misalignment\nbetween the images and the DEM may result in artifacts::\n\n  dem_mosaic --dem-blur-sigma 2 ref.tif -o ref_blur.tif\n  \nMapprojection in local stereographic projection::\n\n  proj='+proj=stere +lat_0=24.0275 +lon_0=25.8402 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs'\n  mapproject -t csm                       \\\n   --tr 15 --t_srs \"$proj\"                \\\n    ref_blur.tif out-Band3N.tif           \\\n    ba/run-out-Band3N.adjusted_state.json \\\n    out-Band3N.map.tif\n  \nThe same command is used for the other image. Both must use the same resolution\nin mapprojection (option ``--tr``). \n\nIt is suggested to overlay and inspect in ``stereo_gui`` (:numref:`stereo_gui`)\nthe produced images and the reference DEM and check for any misalignment or\nartifacts. ASTER is quite well-aligned to the reference DEM.\n\nStereo with mapprojected images (:numref:`mapproj-example`) and DEM generation\nis run. Here the ``asp_mgm`` algorithm is not used as it smears the jitter\nsignal::\n\n    parallel_stereo                         \\\n      --stereo-algorithm asp_bm             \\\n      --subpixel-mode 1                     \\\n      --max-disp-spread 100                 \\\n      --num-matches-from-disparity 100000   \\\n      out-Band3N.map.tif out-Band3B.map.tif \\\n      ba/run-out-Band3N.adjusted_state.json \\\n      ba/run-out-Band3B.adjusted_state.json \\\n      stereo_bm/run                         \\\n      ref_blur.tif\n      \n    point2dem --errorimage --t_srs \"$proj\" \\\n      --tr 15 stereo_bm/run-PC.tif         \\\n      --orthoimage stereo_bm/run-L.tif\n\nWe chose to use option ``--num-matches-from-disparity`` to create a large and\nuniformly distributed set of interest point matches. That is necessary because\nthe jitter that we will solve for has rather high frequency.\n\nSee :numref:`point2dem_proj` for a discussion of the projection to use in DEM\ncreation.\n\n.. figure:: ../images/aster_dem_ortho_error.png\n   :name: aster_dem_ortho_error\n\n   Produced DEM, orthoimage and intersection error. The correlation algorithm\n   has some trouble over sand, resulting in holes. The jitter is clearly\n   visible, and will be solved for next. The color scale on the right is from 0\n   to 10 meters.\n\nThe created DEM is brought in the coordinate system of the reference DEM. This\nresults in a small shift in this case, but it is important to do this each time\nbefore solving for jitter.\n\n::\n\n    pc_align --max-displacement 50          \\\n    stereo_bm/run-DEM.tif ref.tif           \\\n    -o stereo_bm/run-align                  \\\n    --save-inv-transformed-reference-points\n  \n  point2dem --t_srs \"$proj\" --tr 15 \\\n    stereo_bm/run-align-trans_reference.tif\n\nOne has to be careful with the value of ``--max-displacement`` that is used\n(:numref:`pc_align`).\n\nTake the difference with the reference DEM after alignment::\n\n  geodiff stereo_bm/run-align-trans_reference-DEM.tif \\\n    ref.tif -o stereo_bm/run\n\nThe result of this is shown in :numref:`aster_jitter_dem_diff`. \nApply the alignment transform to the cameras (:numref:`ba_pc_align`)::\n\n    bundle_adjust -t csm                        \\\n      --initial-transform                       \\\n      stereo_bm/run-align-inverse-transform.txt \\\n      --apply-initial-transform-only            \\\n      out-Band3N.map.tif out-Band3B.map.tif     \\\n      ba/run-out-Band3N.adjusted_state.json     \\\n      ba/run-out-Band3B.adjusted_state.json     \\\n      -o ba_align/run\n\nThis will create new cameras in CSM format in the directory ``ba_align``.\n\nIt is important to use here the inverse alignment transform, as we want to map\nfrom the stereo DEM to the reference DEM, and the forward transform would do the\nopposite, given how ``pc_align`` was invoked.\n\nIf the produced difference of DEMs shows large residuals consistent with the\nterrain, one should consider applying more blur to the reference terrain and/or\nredoing mapprojection and stereo with the now-aligned cameras, and see if this\nimproves this difference.\n\n.. _jitter_naming_convention:\n\nSolving for jitter\n^^^^^^^^^^^^^^^^^^\n\nCopy the dense match file (:numref:`dense_ip`) to follow the naming convention\nfor unprojected (original) images::\n\n    mkdir -p jitter\n    cp stereo_bm/run-disp-out-Band3N.map__out-Band3B.map.match \\\n      jitter/run-out-Band3N__out-Band3B.match\n\nIn ASP 3.4.0 or later, that file to be copied is named instead\n``run_1_2_map/run-disp-Band3N__out-Band3B.match``, or so, reflecting the names\nof the raw images.\n\nThe *naming convention for the match files* is::\n\n  <prefix>-<image1>__<image2>.match\n  \nwhere the image names are without the directory name and extension. See\n:numref:`jitter_ip` for more information on interest point matches.\n\nHere it is important to use a lot of match points and a low \nvalue for ``--num-lines-per-orientation`` and same for position,\nbecause the jitter has rather high frequency.\n\nSolve for jitter with the aligned cameras::\n\n    jitter_solve out-Band3N.tif out-Band3B.tif        \\\n      ba_align/run-run-out-Band3N.adjusted_state.json \\\n      ba_align/run-run-out-Band3B.adjusted_state.json \\\n      --max-pairwise-matches 100000                   \\\n      --num-lines-per-position 100                    \\\n      --num-lines-per-orientation 100                 \\\n      --max-initial-reprojection-error 20             \\\n      --num-iterations 50                             \\\n      --match-files-prefix jitter/run                 \\\n      --heights-from-dem ref.tif                      \\\n      --heights-from-dem-uncertainty 20               \\\n      --num-anchor-points 0                           \\\n      --anchor-weight 0.0                             \\\n      -o jitter/run\n\nThe DEM uncertainty constraint was set to 20, as the image GSD is 15 meters. A\nhigher value for the uncertainty is recommended, such as 200 or more, if the\nreference DEM has large systematic differences with the stereo DEM. A tight uncertainty\nconstraint can result in unphysical oscillations in the terrain model.\n\nHere, ``--num-lines-per-position`` and ``--num-lines-per-orientation`` are quite\nlow. This may result in high-frequency oscillations in the produced DEM. If so,\nthese need to be increased by 2x or 4x.\n\nSee :numref:`jitter_camera` for a discussion of camera constraints,\nand :numref:`jitter_anchor_points` regarding anchor points.\n\nThe report files mentioned in :numref:`jitter_out_files` can be very helpful\nin evaluating how well the jitter solver worked, even before rerunning stereo.\n\n.. figure:: ../images/aster_jitter_pointmap.png\n   :name: aster_jitter_pointmap\n\n   Pixel reprojection errors (:numref:`jitter_out_files`) before (left) and\n   after (right) solving for jitter. Compare with the ray intersection error\n   in :numref:`aster_jitter_intersection_err`.\n\nThen, ``mapproject``, ``parallel_stereo`` and ``point2dem`` can be run again,\nwith the new cameras created in the ``jitter`` directory. \n\n*Do not* reuse the previous stereo run. So, do not use the option\n``--prev-run-prefix``. This introduces artifacts in the DEM. Likely it is\nbecause the cameras changed too much. It is suggested to re-mapproject with the\noptimized cameras, and re-run stereo from scratch. \n\n.. figure:: ../images/aster_jitter_intersection_err.png\n   :name: aster_jitter_intersection_err\n\n   The ray intersection error before (left) and after (right) solving for\n   jitter. The scale is in meters. Same pattern is seen as for the pixel\n   reprojection errors earlier.\n\n.. figure:: ../images/aster_jitter_dem_diff.png\n   :name: aster_jitter_dem_diff\n\n   The signed difference between the ASP DEM and the reference DEM, before\n   (left) and after (right) solving for jitter. The scale is in meters. It can\n   be seen that the jitter pattern is gone.\n   \n.. _jitter_sat_sim:\n\nJitter with synthetic cameras and orientation constraints\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe effectiveness of ``jitter_solve`` can be validated using synthetic data,\nwhen we know what the answer should be ahead of time. The synthetic data can \nbe created with ``sat_sim`` (:numref:`sat_sim`). See a recipe in\n:numref:`sat_sim_linescan`. \n\nFor example, one may create three linescan images and cameras, using various\nvalues for the pitch angle, such as -30, 0, and 30 degrees, modeling a camera\nthat looks forward, down, and aft. One can choose to *not* have any jitter in the\nimages or cameras, then create a second set of cameras with *pitch*\n(along-track) jitter.\n\nThen, ``jitter_solve`` can be used to solve for the jitter. It can be invoked\nwith the images not having jitter and the cameras having the jitter. \n\nIt is suggested to use the roll and yaw constraints (``--roll-weight`` and\n``--yaw-weight``, with values on the order of 1e+4), to keep these angles in\ncheck while correcting the pitch jitter. Note that with non-synthetic cameras,\nneed to add the ``--initial-camera-constraint`` option.\n\nThe ``--heights-from-dem`` option should be used as well, to tie the solution to\nthe reference DEM. \n\nWe found experimentally that, if the scan lines for all the input cameras are\nperfectly parallel, then the jitter solver will not converge to the known\nsolution. This is because the optimization problem is under-constrained. If the\nscan lines for different cameras meet at, for example, a 6-15 degree angle, and\nthe lines are long enough to offer good overlap, then the \"rigidity\" of a given\nscan line will be able to help correct the jitter in the scan lines for the\nother cameras intersecting it, resulting in a solution close to the expected\none.\n\nSee a worked-out example for how to set orientation constraints in\n:numref:`jitter_linescan_frame_cam`. There, frame cameras are used as well, \nto add \"rigidity\" to the setup.\n\n.. _jitter_real_cameras:\n\nConstraining direction of jitter with real cameras\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nFor synthetic cameras created with ``sat_sim`` (:numref:`sat_sim`), it is\nassumed that the orbit is a straight segment in projected coordinates (hence\nan ellipse if the orbit end points are at the same height above the datum). It\nis also assumed that such a camera has a fixed roll, pitch, and yaw relative to\nthe satellite along-track / across-track directions, with jitter added to these\nangles (:numref:`sat_sim_roll_pitch_yaw`, and :numref:`sat_sim_jitter_model`).\n\nFor a real linescan satellite camera, the camera orientation is variable and not\ncorrelated to the orbit trajectory. The ``jitter_solve`` program can then\nconstrain each camera sample being optimized not relative to the orbit\ntrajectory, but relative to initial camera orientation for that sample.\n\nThat is accomplished by invoking the jitter solver as in\n:numref:`jitter_sat_sim`, with the additional option\n``--initial-camera-constraint``. See the description of this option in\n:numref:`jitter_options`.\n\nThis option is very experimental and its effectiveness was only partially\nvalidated. If having a rig, it is suggested to employ instead the strategy in\n:numref:`jitter_rig`.\n\nThis option can be used with synthetic cameras as well. The results then will be\nsomewhat different than without this option, especially towards orbit end\npoints, where the overlap with other cameras is small.\n\n.. _jitter_linescan_frame_cam:\n\nMixing linescan and frame cameras\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThis solver allows solving for jitter using a combination of linescan and frame\n(pinhole) cameras, if both of these are stored in the CSM format (:numref:`csm`). \nHow to convert existing cameras to this format is described in :numref:`cam_gen_frame`\nand :numref:`cam_gen_linescan`.\n\nFor now, this functionality was validated only with synthetic cameras created\nwith ``sat_sim`` (:numref:`sat_sim`). In this case, roll and yaw constraints for\nthe orientations of cameras being optimized are supported, for both linescan and\nframe cameras.\n\nWhen using real data, it is important to ensure they are acquired at close-enough\ntimes, with similar illumination and ground conditions (such as snow thickness).\n\nHere is a detailed recipe.\n\nConsider a DEM named ``dem.tif``, and an orthoimage named ``ortho.tif``. Let ``x``\nbe a column index in the DEM and ``y1`` and ``y2`` be two row indices. These\nwill determine the path on the ground seen by the satellite. Let ``h`` be the\nsatellite height above the datum, in meters. Set, for example::\n\n    x=4115\n    y1=38498\n    y2=47006\n    h=501589\n    opt=\"--dem dem.tif\n      --ortho ortho.tif\n      --first $x $y1 $h\n      --last  $x $y2 $h\n      --first-ground-pos $x $y1\n      --last-ground-pos  $x $y2\n      --frame-rate 45\n      --jitter-frequency 5\n      --focal-length 551589\n      --optical-center 2560 2560\n      --image-size 5120 5120\n      --velocity 7500\n      --save-ref-cams\"\n\nCreate nadir-looking frame images and cameras with no jitter::\n\n    sat_sim $opt                  \\\n      --save-as-csm               \\\n      --sensor-type pinhole       \\\n      --roll 0 --pitch 0 --yaw 0  \\\n      --horizontal-uncertainty    \\\n      \"0.0 0.0 0.0\"               \\\n      --output-prefix jitter0.0/n\n\nCreate a forward-looking linescan image and camera, with no jitter::\n\n    sat_sim $opt                  \\\n      --sensor-type linescan      \\\n      --roll 0 --pitch 30 --yaw 0 \\\n      --horizontal-uncertainty    \\\n      \"0.0 0.0 0.0\"               \\\n      --output-prefix jitter0.0/f\n\nCreate a forward-looking linescan camera, with no images, with pitch jitter::\n\n    sat_sim $opt                  \\\n      --no-images                 \\\n      --sensor-type linescan      \\\n      --roll 0 --pitch 30 --yaw 0 \\\n      --horizontal-uncertainty    \\\n      \"0.0 2.0 0.0\"               \\\n      --output-prefix jitter2.0/f\n\nThe tool ``cam_test`` (:numref:`cam_test`) can be run to compare the camera\nwith and without jitter::\n\n    cam_test --session1 csm    \\\n      --session2 csm           \\\n      --image jitter0.0/f.tif  \\\n      --cam1  jitter0.0/f.json \\\n      --cam2  jitter2.0/f.json\n\nThis will show that projecting a pixel from the first camera to the ground and\nthen projecting it back to the second camera will result in around 2 pixels of\ndiscrepancy, which makes sense given the horizontal uncertainty set above and the\nfact that our images are at around 0.9 m/pixel ground resolution. \n\nTo reliably create reasonably dense interest point matches between the frame and\nlinescan images, first mapproject (:numref:`mapproject`) them::\n\n    for f in jitter0.0/f.tif                    \\\n             jitter0.0/n-1[0-9][0-9][0-9][0-9].tif; do \n        g=${f/.tif/} # remove .tif\n        mapproject --tr 0.9                     \\\n          dem.tif ${g}.tif ${g}.json ${g}.map.tif\n    done\n\nThis assumes that the DEM is in a local projection in units of meter. Otherwise\nthe ``--t_srs`` option should be set.\n\nCreate the lists of images, cameras, then a list for the mapprojected images and\nthe DEM. We use individual ``ls`` command to avoid the inputs being reordered::\n\n    dir=ba\n    mkdir -p $dir\n    ls jitter0.0/f.tif                        >  $dir/images.txt\n    ls jitter0.0/n-1[0-9][0-9][0-9][0-9].tif  >> $dir/images.txt\n\n    ls jitter0.0/f.json                       >  $dir/cameras.txt\n    ls jitter0.0/n-1[0-9][0-9][0-9][0-9].json >> $dir/cameras.txt\n    \n    ls jitter0.0/f.map.tif                       >  $dir/map_images.txt\n    ls jitter0.0/n-1[0-9][0-9][0-9][0-9].map.tif >> $dir/map_images.txt\n    ls dem.tif                                   >> $dir/map_images.txt\n\nRun bundle adjustment to get interest point matches::\n\n    parallel_bundle_adjust                           \\\n        --processes 10                               \\\n        --nodes-list nodes_list.txt                  \\\n        --num-iterations 50                          \\\n        --ip-detect-method 1                         \\\n        --tri-weight 0.1                             \\\n        --camera-weight 0                            \\\n        --auto-overlap-params \"dem.tif 15\"           \\\n        --min-matches 5                              \\\n        --remove-outliers-params '75.0 3.0 10 10'    \\\n        --min-triangulation-angle 5.0                \\\n        --ip-per-tile 500                            \\\n        --matches-per-tile 500                       \\\n        --max-pairwise-matches 6000                  \\\n        --image-list $dir/images.txt                 \\\n        --camera-list $dir/cameras.txt               \\\n        --mapprojected-data-list $dir/map_images.txt \\\n        -o ba/run\n\nHere we assumed a minimum triangulation convergence angle of 5 degrees between\nthe two sets of cameras (:numref:`stereo_pairs`). See :numref:`pbs_slurm` for\nhow to set up the computing nodes needed for ``--nodes-list``.\n\nWe use ``--ip-detect-method 1`` to detect interest points. This invokes the SIFT\nfeature detection method, which is more accurate than the default\n``--ip-detect-method 0``. See :numref:`jitter_ip` for more information on\ninterest point matches.\n\nWe could have used a ground constraint above, but since we only need the\ninterest points and not the camera poses, it is not necessary. The default\ncamera position constraint is also on (:numref:`jitter_camera`).\n\nSolve for jitter with a ground constraint. Use roll and yaw constraints, to\nensure movement only for the pitch angle:: \n\n    jitter_solve                                 \\\n        --num-iterations 50                      \\\n        --max-pairwise-matches 3000              \\\n        --clean-match-files-prefix               \\\n          ba/run                                 \\\n        --roll-weight 10000                      \\\n        --yaw-weight 10000                       \\\n        --max-initial-reprojection-error 100     \\\n        --tri-weight 0.1                         \\\n        --tri-robust-threshold 0.1               \\\n        --num-anchor-points 10000                \\\n        --num-anchor-points-extra-lines 500      \\\n        --anchor-dem dem.tif                     \\\n        --anchor-weight 0.05                     \\\n        --heights-from-dem dem.tif               \\\n        --heights-from-dem-uncertainty 10        \\\n        jitter0.0/f.tif                          \\\n        jitter0.0/n-images.txt                   \\\n        jitter2.0/f.json                         \\\n        jitter0.0/n-cameras.txt                  \\\n        -o jitter_solve/run\n\nThe value of ``--heights-from-dem-uncertainty`` should be chosen with care.\nFor non-synthetic cameras, need to add the option ``--initial-camera-constraint``.\n\nWe used ``--max-pairwise-matches 3000`` as the linescan camera has many\nmatches with each frame camera image, and there are many such frame camera\nimages. A much larger number would be used if we had only a couple of linescan\ncamera images and no frame camera images.\n\nThe initial cameras were not bundle-adjusted and aligned\nto the reference DEM, as they were good enough. Normally one would\nuse them as input to ``jitter_solve`` with the option\n``--input-adjustments-prefix``.\n\nSee :numref:`jitter_camera` for a discussion of camera constraints.\n\nNotice that the nadir-looking frame images are read from a list, in\n``jitter0.0/n-images.txt``. This file is created by ``sat_sim``. All the images\nin such a list must be acquired in quick succession and be along the same\nsatellite orbit portion, as the trajectory of all these cameras will be used to\nenforce the roll and yaw constraints. \n\nA separate list must be created for each such orbital stretch, then added to the\ninvocation above. The same logic is applied to the cameras for these images.\n\nThere is a single forward-looking image, but it is linescan, so there are many\ncamera samples for it. \n\nThe forward-looking camera has jitter, so we used its version from the\n``jitter2.0`` directory, not the one in ``jitter0.0``.\n\nThis solver does not create anchor points for the frame cameras. There\nare usually many such images and they overlap a lot, so anchor points\nare not needed as much as for linescan cameras.\n\n.. _jitter_rig:\n\nRig constraints\n~~~~~~~~~~~~~~~\n\nThis solver can model the fact that the input images have been acquired with \none or more rigs. A rig can have one or more sensors. A sensor can be frame or\nlinescan. Each rig can acquire several data collections. Each rig can have its\nown design.\n\nRig configuration\n^^^^^^^^^^^^^^^^^\n\nEach rig must have a designated *reference sensor*. The transforms from the\nreference sensor to other sensors on that rig will be optimized by this solver. \n\nThe intrinsics of all sensors for all rigs should be set in a single\nconfiguration file, in the format described in :numref:`rig_config`. \n\nThis solver assumes no lens distortion, no offsets between clocks of individual\nsensors, and no depth measurements, so the entries for these in the rig\nconfiguration file should be left at nominal values. The entries for\n``distorted_crop_size`` and ``undistorted_image_size`` should have the image\ndimensions.\n\nAssumptions\n^^^^^^^^^^^\n\n - When a rig has both linescan and frame sensors, the reference sensor must be\n   linescan. That is because the linescan sensor acquires image data more frequently.\n     \n - The *reference sensor* must acquire pose readings *frequently enough* that\n   pose interpolation in time is accurate. For a frame reference sensor, that\n   may mean that all frame sensors acquire data simultaneously, or the reference\n   sensor captures data at a finer rate than any observed jitter. For a linescan\n   reference sensor, the parameters ``--num-lines-per-position`` and\n   ``--num-lines-per-orientation`` need to be smaller than 1/2 of the jitter\n   period.\n   \n - The acquisition times of all sensors on a rig during a contiguous observation\n   stretch must be within the time range of the reference sensor, to avoid \n   extrapolation in time.\n \n - The acquisition times are known very accurately.  \n \nIt is not assumed that acquisition times are synchronized between sensors,\nor that a frame camera has a fixed frame rate. \n\nNaming convention\n^^^^^^^^^^^^^^^^^\n\nThe images and cameras passed in must be in one-to-one correspondence. \n\nThe following format is expected for frame image and camera names::\n\n  <path>/<group><sep><timestamp><sep><sensor name>.<extension>\n\nAny separator characters in ``<sep>`` *must not contain alphanumeric\ncharacters*, as that will confuse the program. The timestamp must be\nof the form ``<digits>.<digits>`` (no values such as 1e+7).\n\nExample::\n  \n    data/acq1_10000.23_sensor1.tif\n\nAll images acquired by a frame sensor in a given contiguous stretch of time must\nbe listed in a text file of the form::\n\n  <path>/<group><sep><sensor name>.txt\n\nwhich is passed in to the solver as an image file would be otherwise. The same\napplies to the cameras. An example is below.\n\nEach linescan sensor image or camera name must be of the form::\n\n  <path>/<group><sep><sensor name>.<extension>\n\nEach contiguous acquisition with a rig must have a unique group name, that will\nbe part of all filenames produced at that time. In other words, acquisitions\nwith different rigs or by the same rig at another time need to have different\ngroup names.\n\n.. _jitter_no_baseline_example:\n\nExample of sensors on a rig with a very small baseline\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nIn this example we consider a rig with one linescan and one frame sensor. \nThe rig looks straight down, so there is very little overall baseline\nbetween the sensors.\n\nThe linescan sensor acquires a single wide and tall image, while the frame\ncamera records many rectangular images of much smaller dimensions. They both\nexperience the same jitter. \n\nThe solver enforces the rig constraint between the sensors.\n\nThe frame camera images are shown to be able to help correct the jitter. That is\nbecause each frame camera image can serve as a template, relative to which\noscillations in the linescan sensor can be measured. \n\nThe rig constraint is not essential here. This constraint is useful however when\nthere are two sensors side-by-side, as then the rig helps constrain the yaw\nangle.\n\nSynthetic data for this example can be produced as in\n:numref:`jitter_linescan_frame_cam`, with the addition of modeling a rig, as in\n:numref:`sat_sim_rig`.\n\nA straightforward application of the jitter-solving recipe in\n:numref:`jitter_linescan_frame_cam` will fail, as it is not possible to\ntriangulate properly the points seen by the cameras, since the rays are\nalmost parallel or slightly diverging. The following adjustments are\nsuggested:\n\n- Use ``--forced-triangulation-distance 500000`` for both bundle adjustment and\n  jitter solving (the precise value here is not very important if the\n  ``--heights-from-dem`` constraint is used, as the triangulated point will be\n  adjusted based on the DEM). This will result in triangulated points even when\n  the rays are parallel or a little divergent. \n- Use ``--min-triangulation-angle 1e-10`` in both bundle adjustment and jitter\n  solving, to ensure we don't throw away features with small convergence angle,\n  as that will be almost all of them.\n- Be generous with outlier filtering when there is a lot of jitter. Use,\n  for example, ``--remove-outliers-params '75.0 3.0 10 10'`` in ``bundle_adjust``\n  and ``--max-initial-reprojection-error 20`` in ``jitter_solve``.\n- The option ``--heights-from-dem`` should be used (:numref:`heights_from_dem`). \n- Use ``--match-files-prefix`` instead of ``--clean-match-files-prefix`` in\n  ``jitter_solve``, as maybe bundle adjustment filtered out too many good matches\n  with a small convergence angle (if it was not invoked as suggested above).\n\nHere's the command for solving for jitter. This assumes interest points were\nproduced with bundle adjustment. It is preferred that they are dense, as in\nprevious sections. The same rig configuration can be used as when the input\nimages and cameras are created with ``sat_sim`` (:numref:`sat_sim_rig`).\n\n::\n\n    jitter_solve                                \\\n        --rig-config rig.txt                    \\\n        --forced-triangulation-distance 500000  \\\n        --min-matches 1                         \\\n        --min-triangulation-angle 1e-10         \\\n        --num-iterations 50                     \\\n        --max-pairwise-matches 50000            \\\n        --match-files-prefix ba/run             \\\n        --max-initial-reprojection-error 100    \\\n        --num-anchor-points-per-tile 100        \\\n        --num-anchor-points-extra-lines 500     \\\n        --anchor-dem dem.tif                    \\\n        --anchor-weight 0.01                    \\\n        --heights-from-dem dem.tif              \\\n        --heights-from-dem-uncertainty 10       \\\n        data/nadir_linescan.tif                 \\\n        data/nadir_frame_images.txt             \\\n        data/nadir_linescan.json                \\\n        data/nadir_frame_cameras.txt            \\\n        -o jitter/run\n\nThe options ``--use-initial-rig-transforms``, ``--fix-rig-rotations``,\n``--fix-rig-translations``, and ``--camera-position-uncertainty`` /\n``--camera-position-weight`` can constrain the solution in various ways. A rig\ncan be created by hand or generated by ``sat_sim`` to desired specifications\n(:numref:`sat_sim_rig`).\n\nThe optimized rig will be saved in the output directory and can be inspected.\n\nThe value of ``--heights-from-dem-uncertainty`` can be decreased if the input DEM\nis reliable and it is desired to tie the solution more to it. \n\nWhen the linescan sensor is much wider than the frame sensor, the anchor points\nshould be constrained to the shared area of the produced images, to have the\nsame effect on both sensors. That is accomplished with the option\n``--anchor-weight-image``.\n\nIt is important to examine the produced triangulated points and reprojection\nerrors (:numref:`ba_err_per_point`) to ensure the points are well-distributed\nand that the errors are small and uniform.\n\nThe ``orbit_plot`` program (:numref:`orbit_plot`) can inspect the camera\norientations before and after optimization.\n\n.. _jitter_ref_terrain:\n\nPoint cloud constraint\n~~~~~~~~~~~~~~~~~~~~~~\n\nIn this scenario it is assumed that a reference point cloud is available that\ncan constrain the jitter solution. The cloud can be in CSV format or a DEM. *The\ncloud must be well-aligned with the input cameras.*  The cloud can be sparse. \n\nThis workflow requires having filtered stereo disparity files (``F.tif``,\n:numref:`outputfiles`) as made by ``parallel_stereo``\n(:numref:`parallel_stereo`). For the moment, *only a single stereo run is\nsupported*.\n\nThe algorithm projects a reference terrain point into one camera, propagates it\nthrough the stereo disparity to the other camera, and takes the pixel difference\nwith the direct projection in the other camera (this difference is called the\n*residual* further down). The option ``--reference-terrain-uncertainty`` can set\nthe uncertainty, with a higher uncertainty resulting in less weight for this\nconstraint. The weight is also adjusted for the ground sample distance at each\nreference terrain point.\n\nThe stereo runs should be produced either with the same images as invoked by the\njitter solver, or with mapprojected versions of those (the same order of images\nneed not be kept). The stereo run produces a file named ``{output prefix}-info.txt``\nthat has some information which ``jitter_solve`` will use.\n\nIt is not important that the cameras or bundle-adjust prefixes passed to the\njitter solving be the same as the ones for the stereo runs, but all the relevant\nfiles must be available, and the inputs to stereo must not be changed after\nthe stereo runs are created.\n\nThe list of stereo prefixes (:numref:`tutorial`), should be set via\n``--stereo-prefix-list``. The jitter solver will peek in those runs and figure\nout how they relate to the images passed in to the solver. It will undo any\nalignment or mapprojection transforms as appropriate.\n\nThis workflow does not preclude using the ``--heights-from-dem`` option or\nanchor points. It assumes that no rig is present and that all cameras are\nlinescan.\n\nIf the images are mapprojected, *this option loads fully in memory the DEM that\nwas used for mapprojecting them*, for performance reasons, so it should not be\ntoo large. Both mapprojected images must use the same DEM. The solver will not\nfully load in memory the stereo disparity file (``F.tif``), but only portions as\nneeded.\n\nExample usage::\n\n  echo {output prefix} > stereo_list.txt\n  \n  jitter_solve                                    \\\n    --max-pairwise-matches 50000                  \\\n    --match-files-prefix ba/run                   \\\n    --num-iterations 50                           \\\n    --reference-terrain lidar.csv                 \\\n    --max-num-reference-points 50000              \\\n    --reference-terrain-uncertainty 10            \\\n    --csv-format 1:lon,2:lat,3:height_above_datum \\\n    --stereo-prefix-list stereo_list.txt          \\\n    --num-anchor-points-per-tile 50               \\\n    --num-anchor-points-extra-lines 1000          \\\n    --anchor-weight 0.1                           \\\n    --anchor-dem anchor_dem.tif                   \\\n    left.tif right.tif                            \\\n    left.json right.json                          \\\n    -o jitter/run\n\nIf the reference terrain is a CSV file rather than a DEM, and it has a custom\nprojection, rather than geographic coordinates, the option ``--csv-srs`` must be\nset to specify the projection. Then adjust ``--csv-format`` accordingly above.\n\nThe initial and final residuals for the reference terrain points are saved to\ndisk in CSV format and should be examined (:numref:`jitter_ref_err`). Also\nexamine the pixel reprojection errors (:numref:`jitter_tri_err`).\n\nThe solver may be slow for very large runs. Then decreasing the number of\niterations to 10 or so will help. The number of reference points can be decreased\nas well.\n\n.. _jitter_out_files:\n\nOutput files\n~~~~~~~~~~~~\n\nOptimized cameras\n^^^^^^^^^^^^^^^^^\n\nThe optimized CSM model state files (:numref:`csm_state`), which\nreduce the jitter and also incorporate the initial adjustments as\nwell, are saved in the directory for the specified output prefix.\n\nThe optimized state files can also be appended to the .cub files\n(:numref:`embedded_csm`).\n\n.. _jitter_errors_per_camera:\n\nReprojection errors per camera\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe initial and final mean and median pixel reprojection error (distance from\neach interest point and camera projection of the triangulated point) for each\ncamera, and their count, are written to::\n\n  {output-prefix}-initial_residuals_stats.txt\n  {output-prefix}-final_residuals_stats.txt\n \nIt is very important to ensure all cameras have a small reprojection error,\nideally under 1 pixel, as otherwise this means that the cameras are not\nwell-registered to each other, or that systematic effects exist, such as\nuncorrected lens distortion.\n\n.. _jitter_cam_offsets:\n\nChanges in camera positions\n^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThis program writes, just like ``bundle_adjust``, a report file that records the\nchanges in camera position (:numref:`ba_camera_offsets`). This can help with\nadjusting camera constraints (:numref:`jitter_camera`).\n\n.. _jitter_tri_offsets:\n\nChanges in triangulated points\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe distance between each initial triangulated point (after applying any initial\nadjustments, but before any DEM constraint) and final triangulated point (after\noptimization) are computed (in ECEF, in meters). The mean, median, and count of\nthese distances, per camera, are saved to::\n\n    {output-prefix}-triangulation_offsets.txt\n\nThis is helpful in understanding how much the triangulated points move. An\nunreasonable amount of movement may suggest imposing stronger constraints on the\ntriangulated points (option ``--tri-weight``).\n\n.. _jitter_tri_err:\n\nReprojection errors per triangulated point\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThis program saves, just like ``bundle_adjust``\n(:numref:`ba_err_per_point`), two .csv error files, before and after\noptimization. Each has the triangulated world position for every\nfeature being matched in two or more images, the mean absolute\nresidual error (pixel reprojection error in the cameras,\n:numref:`bundle_adjustment`) for each triangulated position, and the\nnumber of images in which the triangulated position is seen. The files\nare named::\n\n     {output-prefix}-initial_residuals_pointmap.csv\n\nand::\n\n     {output-prefix}-final_residuals_pointmap.csv\n\nSuch CSV files can be colorized and overlaid with ``stereo_gui``\n(:numref:`plot_csv`) to see at which triangulated points the residual error is\nlarge.\n\nThese files are very correlated to the dense results produced with stereo (the\nDEM and intersection error, respectively, before and after solving for jitter),\nbut the csv files can be examined without creating stereo runs, which can take\nmany hours.\n\nIf GCP are passed on input, they will be flagged in this file, just as \nfor ``bundle_adjust`` (:numref:`ba_err_per_point`).\n\n.. _anchor_point_files:\n\nAnchor points\n^^^^^^^^^^^^^\n\nIf anchor points are used, the coordinates of each anchor point and\nthe norm of the pixel residual at those points are saved as well, to::\n\n     {output-prefix}-initial_residuals_anchor_points.csv\n\nand::\n\n     {output-prefix}-final_residuals_anchor_points.csv\n\nThese have almost the same format as the earlier file. The key\ndistinction is that each anchor point corresponds to just one\npixel, so the last field from above (the count) is not present. \n\nWhen being optimized, the reprojection errors of anchor points are\nmultiplied by the anchor weight. In this file they are saved without\nthat weight multiplier, so they are in units of pixel.\n\nThese can be plotted and colorized in ``stereo_gui`` as well,\nfor example, with::\n\n    stereo_gui --colorize --min 0 --max 0.5   \\\n      --plot-point-radius 2                   \\\n      {output-prefix}-final_residuals_anchor_points.csv\n\nNote that the initial ``pointmap.csv`` file created with the\n``--heights-from-dem`` option reflects the fact that the triangulated\npoints have had their heights set to the DEM height, which can be\nconfusing. Yet in the final (optimized) file these points have moved,\nso then the result makes more sense. When using the ``--tri-weight``\noption the true initial triangulated points and errors are used.\n\n.. _jitter_ref_err:\n\nReference terrain residuals\n^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nIf ``jitter_solve`` is run with the option ``--reference-terrain``\n(:numref:`jitter_ref_terrain`), the pixel residuals for each reference terrain\npoint are saved to::\n\n    {output-prefix}-initial_residuals_ref_terrain.csv\n    {output-prefix}-final_residuals_ref_terrain.csv\n    \nThe format is the same as for pixel reprojection errors\n(:numref:`ba_err_per_point`). These files can be inspected in ``stereo_gui`` as\nwell.     \n\nImage and camera lists\n^^^^^^^^^^^^^^^^^^^^^^\n\nThe list of input images will be saved to::\n\n    {output-prefix}-image_list.txt\n\nThe list of optimized cameras will be saved to::\n\n    {output-prefix}-camera_list.txt\n\nThis is convenient because both ``bundle_adjust`` and ``jitter_solve`` can read\nsuch lists with the ``--image-list`` and ``--camera-list`` options.\n\n.. _other_jitter_out:\n\nOther output files\n^^^^^^^^^^^^^^^^^^\n\nThis program writes the stereo convergence angles (:numref:`ba_conv_angle`) and\ncan compute the registration errors on the ground (:numref:`ba_mapproj_dem`).\nThese are the same as for ``bundle_adjust``, hence the referral to the relevant\nsections for that program.\n\n.. _jitter_options:\n\nCommand-line options for jitter_solve\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n-o, --output-prefix <filename>\n    Prefix for output filenames.\n\n-t, --session-type <string>\n    Select the stereo session type to use for processing. Usually\n    the program can select this automatically by the file extension, \n    except for xml cameras. See :numref:`ps_options` for\n    options.\n\n--robust-threshold <double (default:0.5)>\n    Set the threshold for the robust reprojection error cost function, in\n    pixels. Increasing this makes the solver focus harder on the larger errors.\n\n--min-matches <integer (default: 30)>\n    Set the minimum number of matches between images that will be\n    considered.\n\n--max-pairwise-matches <integer (default: 10000)>\n    Reduce the number of matches per pair of images to at most this\n    number, by selecting a random subset, if needed. This happens\n    when setting up the optimization, and before outlier filtering.\n    It is suggested to set this to a large number, such as one million,\n    to avoid filtering out too many matches. It may be reduced\n    only if the number of images is large and the number of matches\n    becomes unsustainable.\n\n--num-iterations <integer (default: 100)>\n    Set the maximum number of iterations.\n\n--parameter-tolerance <double (default: 1e-8)>\n    Stop when the relative error in the variables being optimized\n    is less than this.\n\n--input-adjustments-prefix <string>\n    Prefix to read initial adjustments from, written by ``bundle_adjust``.\n    Not required. Cameras in .json files in ISD or model state format\n    can be passed in with no adjustments. \n\n--num-lines-per-position\n    Resample the input camera positions and velocities, using this\n    many lines per produced position and velocity. If not set, use the\n    positions and velocities from the CSM file as they are.\n\n--num-lines-per-orientation\n    Resample the input camera orientations, using this many lines per\n    produced orientation. If not set, use the orientations from the\n    CSM file as they are. Small values may result in high-frequency\n    oscillations.\n\n--tri-weight <double (default: 0.1)>\n    The weight to give to the constraint that optimized triangulated points stay\n    close to original triangulated points. A positive value will help ensure the\n    cameras do not move too far, but a large value may prevent convergence. It\n    is suggested to use here 0.1 to 0.5. This will be divided by ground sample\n    distance (GSD) to convert this constraint to pixel units, since the\n    reprojection errors are in pixels. See also ``--tri-robust-threshold``. Does\n    not apply to GCP or points constrained by a DEM.\n\n--tri-robust-threshold <double (default: 0.1)>\n    The robust threshold to attenuate large differences between initial and\n    optimized triangulation points, after multiplying them by ``--tri-weight``\n    and dividing by GSD. This is less than ``--robust-threshold``, as the\n    primary goal is to reduce pixel reprojection errors, even if that results in\n    big differences in the triangulated points. It is suggested to not modify\n    this value, and adjust instead ``--tri-weight``.\n\n--heights-from-dem <string (default: \"\")>\n    Assuming the cameras have already been bundle-adjusted and aligned to a\n    known DEM, constrain the triangulated points to be close to the DEM. See\n    also ``--heights-from-dem-uncertainty`` :numref:`jitter_dem_constraint`.\n\n--heights-from-dem-uncertainty <double (default: -1.0)>\n    The DEM uncertainty (1 sigma, in meters). Must be positive. A smaller value\n    constrains more the triangulated points to the DEM specified via\n    ``--heights-from-dem``.\n\n--heights-from-dem-robust-threshold <double (default: 0.1)> \n    The robust threshold to use to keep the triangulated points close to the DEM if\n    specified via ``--heights-from-dem``. This is applied after the point\n    differences are divided by ``--heights-from-dem-uncertainty``. It will\n    attenuate large height difference outliers. It is suggested to not modify\n    this value, and adjust instead ``--heights-from-dem-uncertainty``.\n\n--match-files-prefix <string (default: \"\")>\n    Use the match files from this prefix. Matches are typically dense ones\n    produced by stereo or sparse ones produced by bundle adjustment. The order\n    of images in each interest point match file need not be the same as for\n    input images. See also ``--isis-cnet``.\n\n--clean-match-files-prefix <string (default: \"\")>\n    Use as input match files the \\*-clean.match files from this prefix. The\n    order of images in each interest point match file need not be the same as\n    for input images.\n\n--matches-as-txt\n    Read and write match files as plain text instead of binary. See\n    :numref:`txt_match`.\n\n--isis-cnet <string (default: \"\")>\n    Read a control network having interest point matches from this binary file\n    in the ISIS control network format. This can be used with any images and\n    cameras supported by ASP.\n\n--nvm <string (default: \"\")>\n    Read a control network having interest point matches from this file in the\n    NVM format. This can be used with any images and cameras supported by ASP.\n    Camera poses will not be read from the NVM file.\n    \n--max-initial-reprojection-error <integer (default: 20)>\n    Filter as outliers any triangulated points that have a reprojection error\n    (in pixels) of more than this value, with the initial cameras. Since jitter\n    corrections are supposed to be small and cameras bundle-adjusted by now,\n    this value need not be too big. Does not apply to GCP.\n\n--max-gcp-reproj-err <double (default: -1.0)>\n    If positive, after each pass remove GCPs whose mean reprojection\n    error (averaged over all cameras seeing that point) is more than\n    this value (in pixels).\n\n--num-anchor-points <integer (default: 0)>\n    How many anchor points to create tying each pixel to a point on a DEM along\n    the ray from that pixel to the ground. These points will be uniformly\n    distributed across each input image. Only applies to linescan cameras. See\n    also ``--anchor-weight`` and ``--anchor-dem``.\n\n--num-anchor-points-per-tile <integer (default: 0)>\n    How many anchor points to create per 1024 x 1024 image tile. They will be\n    uniformly distributed. Useful when images of vastly different sizes (such as\n    frame and linescan) are used together. See also ``--anchor-weight`` and\n    ``--anchor-dem``.\n    \n--anchor-weight <double (default: 0.0)>\n    How much weight to give to each anchor point. Anchor points are\n    obtained by intersecting rays from initial cameras with the DEM\n    given by ``--heights-from-dem``. A larger weight will make it\n    harder for the cameras to move, hence preventing unreasonable\n    changes.\n\n--anchor-dem <string (default: \"\")>\n    Use this DEM to create anchor points.\n\n--num-anchor-points-extra-lines <integer (default: 0)>\n    Start placing anchor points this many lines before first image line \n    and after last image line.\n\n--quat-norm-weight <double (default: 1.0)>\n    How much weight to give to the constraint that the norm of each\n    quaternion must be 1. It is implicitly assumed in the solver \n    that the quaternion norm does not deviate much from 1, so,\n    this should be kept positive.\n\n--camera-position-uncertainty <string (default: \"\")>\n    A file having on each line the image name and the horizontal and vertical\n    camera position uncertainty (1 sigma, in meters). This strongly constrains\n    the movement of cameras, potentially at the expense of accuracy. It is\n    better to overestimate these. To have the same uncertainties for all\n    cameras, pass instead of a file name two values separated by a comma (no\n    spaces). See :numref:`ba_cam_constraints` for an example. See also\n    ``--camera-position-uncertainty-power``.\n    \n--camera-position-uncertainty-power <double (default: 2.0)>\n    A higher value makes the cost function rise more steeply when\n    ``--camera-position-uncertainty`` is close to being violated. This is an\n    advanced option. The default should be good enough.\n\n--camera-position-weight <double (default: 0.0)>\n    A soft constraint to keep the camera positions close to the original values.\n    It is meant to prevent a wholesale shift of the cameras. It can impede \n    the reduction in reprojection errors. It adjusts to the ground sample\n    distance and the number of interest points in the images. The computed\n    discrepancy is attenuated with ``--camera-position-robust-threshold``.\n    It is suggested to use instead ``--camera-position-uncertainty``.\n    See also :numref:`jitter_camera`.\n\n--camera-position-robust-threshold <double (default: 0.1)>\n    The robust threshold to attenuate large discrepancies between initial and\n    optimized camera positions with the option ``--camera-position-weight``.\n    This is less than ``--robust-threshold``, as the primary goal is to reduce\n    pixel reprojection errors, even if that results in big differences in the\n    camera positions. It is suggested to not modify this value, and adjust\n    instead ``--camera-position-weight``.\n\n--rotation-weight <double (default: 0.0)>\n    A higher weight will penalize more deviations from the\n    original camera orientations. This adds to the cost function\n    the per-coordinate differences between initial and optimized\n    normalized camera quaternions, multiplied by this weight, and then\n    squared. No robust threshold is used to attenuate this term.\n    See also :numref:`jitter_camera`.\n\n--smoothness-weight <double (default: 0.0)>\n    A weight to penalize high-frequency changes in the sequence of orientations\n    in the linescan cameras being optimized. This is internally adjusted based\n    on the initial curvature of the sequence of orientations. A value of 0.01 to\n    0.1 is recommended. This may impede convergence if high. Use with\n    ``--camera-position-weight 1e+6`` or so, to tightly constrain the cameras\n    positions.\n\n--roll-weight <double (default: 0.0)>\n    A weight to penalize the deviation of camera roll orientation as measured\n    from the along-track direction. Pass in a large value, such as 1e+5. This is\n    best used only with linescan cameras created with ``sat_sim``\n    (:numref:`sat_sim`). With non-synthetic cameras, add the\n    ``--initial-camera-constraint`` option. Use with ``--camera-position-weight\n    1e+6`` or so, to tightly constrain the cameras positions.\n\n--yaw-weight <double (default: 0.0)>\n    A weight to penalize the deviation of camera yaw orientation as measured\n    from the along-track direction. Pass in a large value, such as 1e+5. This is\n    best used only with linescan cameras created with ``sat_sim``\n    (:numref:`sat_sim`). With non-synthetic cameras, add the\n    ``--initial-camera-constraint`` option. Use with ``--camera-position-weight\n    1e+6`` or so, to tightly constrain the cameras positions.\n    \n--initial-camera-constraint\n    When constraining roll and yaw, measure these not in the satellite\n    along-track/across-track/down coordinate system, but relative to the initial\n    camera poses. This is experimental. Internally, the roll weight will then be\n    applied to the camera pitch angle (rotation around camera *y* axis), because\n    the camera coordinate system is rotated by 90 degrees in the sensor plane\n    relative to the satellite coordinate system. The goal is the same, to\n    penalize deviations that are not aligned with satellite pitch.\n\n--weight-image <string (default: \"\")>\n    Given a georeferenced image with float values, for each initial triangulated\n    point find its location in the image and closest pixel value. Multiply the\n    reprojection errors in the cameras for this point by this weight value. The\n    solver will focus more on optimizing points with a higher weight. Points\n    that fall outside the image and weights that are non-positive, NaN, or equal\n    to nodata will be ignored. See :numref:`limit_ip` for details. \n\n--anchor-weight-image <string (default: \"\")>\n    Weight image for anchor points. Limits where anchor points are placed and\n    their weight. Weights are additionally multiplied by ``--anchor-weight``.\n    See also ``--weight-image``.\n\n--image-list\n    A file containing the list of images, when they are too many to specify on\n    the command line. Use in the file a space or newline as separator. See also\n    ``--camera-list``.\n\n--camera-list\n    A file containing the list of cameras, when they are too many to\n    specify on the command line. If the images have embedded camera\n    information, such as for ISIS, this file may be omitted, or\n    specify the image names instead of camera names.\n\n--update-isis-cubes-with-csm-state\n    Save the model state of optimized CSM cameras as part of the .cub\n    files. Any prior version and any SPICE data will be deleted.\n    Mapprojected images obtained with prior version of the cameras\n    must no longer be used in stereo.\n\n--save-cnet-as-gcp\n    Save the optimized control network, after outlier filtering, in the format\n    used by ground control points (:numref:`bagcp`), including any input GCP.\n    The xyz sigma is 1 meter for regular non-GCP triangulated points and the\n    value of ``--heights-from-dem-uncertainty`` for DEM-constrained points.\n    Can be inspected with ``stereo_gui`` (:numref:`stereo_gui_vwip_gcp`).\n\n--min-triangulation-angle <degrees (default: 0.1)>\n    The minimum angle, in degrees, at which rays must meet at a\n    triangulated point to accept this point as valid. It must\n    be a positive value.\n\n--forced-triangulation-distance <meters>\n    When triangulation fails, for example, when input cameras are\n    inaccurate, artificially create a triangulation point this far\n    ahead of the camera, in units of meters. Some of these\n    may be later filtered as outliers. \n\n--num-passes <integer (default: 2)>\n    How many passes of jitter solving to do, with the given number of iterations\n    in each pass. Each pass uses the previously refined cameras, which improves\n    the accuracy of the DEM constraint and the final result.\n\n--mapproj-dem <string (default: \"\")>\n    If specified, mapproject every pair of matched interest points onto this DEM\n    and compute their distance, then percentiles of such distances for each\n    image vs the rest and each image pair. This is done after bundle adjustment\n    and outlier removal. Measured in meters. See :numref:`ba_mapproj_dem` for\n    more details.\n    \n--rig-config <string>\n    Assume that the cameras are acquired with a set of rigs with this\n    configuration file (:numref:`jitter_rig`). The intrinsics will be read, but\n    not the transforms between sensors, as those will be auto-computed (unless\n    ``--use-initial-rig-transforms`` is set). The optimized rig, including the\n    sensor transforms, will be saved.\n\n--fix-rig-translations\n    Fix the translation component of the transforms between the sensors on a rig.\n    \n--fix-rig-rotations\n    Fix the rotation component of the transforms between the sensors on a rig.\n\n--use-initial-rig-transforms\n    Use the transforms between the sensors (``ref_to_sensor_transform``) of the\n    rig given by ``--rig-config``, instead of computing them from the poses of\n    individual cameras.\n\n--reference-terrain <filename>\n    An externally provided trustworthy reference terrain to use as a constraint. It can\n    be either a DEM or a point cloud in CSV format. It must be well-aligned with the\n    input cameras (:numref:`jitter_ref_terrain`).\n\n--reference-terrain-uncertainty <double (default: 1.0)>\n    The uncertainty of the reference terrain, in meters. A smaller value will \n    result in a stronger constraint. It is suggested to not make this too small\n    as it may prevent convergence.\n        \n--max-num-reference-points <integer (default: 100000000)>\n    Maximum number of (randomly picked) points from the reference\n    terrain to use. A large value will greatly slow down the solver. \n\n--reference-terrain-robust-threshold <double (default: 0.1)>\n    The robust threshold, in pixels, for the option ``--reference-terrain``. It\n    is suggested to not modify this value, and adjust instead\n    ``--reference-terrain-uncertainty``.\n    \n--fix-gcp-xyz\n    If the GCP are highly accurate, use this option to not float\n    them during the optimization.\n\n--use-lon-lat-height-gcp-error\n    Constrain the triangulated points tied to GCP in the longitude, latitude,\n    and height space, instead of ECEF. The standard deviations in the GCP file\n    are applied accordingly.\n\n--overlap-limit <integer (default: 0)>\n    Limit the number of subsequent images to search for matches to\n    the current image to this value.  By default try to match all\n    images.\n\n--match-first-to-last\n    Match the first several images to last several images by extending\n    the logic of ``--overlap-limit`` past the last image to the earliest\n    ones.\n\n--accept-provided-mapproj-dem\n    Accept the DEM provided on the command line as the one mapprojection was\n    done with, even if it disagrees with the DEM recorded in the geoheaders of\n    input images.\n\n--threads <integer (default: 0)>\n    Set the number threads to use. 0 means use the default defined\n    in the program or in ``~/.vwrc``. Note that when using more\n    than one thread and the Ceres option the results will vary\n    slightly each time the tool is run.\n\n--cache-size-mb <integer (default = 1024)>\n    Set the system cache size, in MB, for each process.\n\n-h, --help\n    Display the help message.\n\n-v, --version\n    Display the version of software.\n\n.. |times| unicode:: U+00D7 .. MULTIPLICATION SIGN\n"
  },
  {
    "path": "docs/tools/lronac2mosaic.rst",
    "content": ".. _lronac2mosaic:\n\nlronac2mosaic.py\n----------------\n\nThis tool takes in two LRONAC files (M*LE.IMG and M*RE.IMG) and produces a\nsingle noproj mosaic composed of the two inputs. It performs the following\noperations in this process: ``lronac2isis``, ``spiceinit``, ``lronaccal``,\n``lronacecho``, an optional crop to the top-most lines, ``noproj``, and\n``handmos``.\n\nThe offsets used in ``handmos`` are calculated using an ASP internal tool called\n``lronacjitreg`` and is similar in functionality to the ISIS command\n``hijitreg``. Offsets need to be calculated via feature measurements in image to\ncorrect for imperfections in camera pointing. The angle between LE and RE optics\nchanges slightly with spacecraft temperature.\n\nOptionally, ``lronac2mosiac.py`` can be given many IMG files all at\nonce. The tool will then look at image names to determine which should\nbe paired and mosaicked. The tool will also spawn multiple processes of\nISIS commands were possible to finish the task faster. The max number of\nsimultaneous processes is limited by the ``--threads`` option.\n\nUsage::\n\n    lronac2mosaic.py [options] <IMG file 1> <IMG file 2>\n\nCommand-line options for lronac2mosaic.py:\n\n--manual\n    Display the help message.\n\n-o, --output-dir <name>\n    Set the output folder (default is input folder).\n\n--stop-at-no-proj\n    Stops processing after the noproj steps are complete.\n\n--resume-at-no-proj\n    Start after ``spiceinit``, ``lronaccal``, ``lronacecho``, and the\n    optional crop. This allows for custom preparation of the inputs.\n\n--spiceinit-options <string (default='web=false spksmithed=true')>\n    Options to pass to spiceinit. Specify in quotes.\n    \n-c, --crop <integer>\n    Process only this many first lines of the images.\n    \n-t, --threads\n    Specify the number of threads to use.\n\n-k, --keep\n    Keep all intermediate files.\n"
  },
  {
    "path": "docs/tools/lvis2kml.rst",
    "content": ".. _lvis2kml:\n\nlvis2kml\n--------\n\nA simple tool for use with LVIS (Land, Vegetation, and Ice Sensor) lidar\ndata from the NASA IceBridge program. Generates a Google Earth\ncompatible .kml files from either an LVIS data file (.TXT extension) or\nan LVIS boundary file (.xml extension). Using this tool makes it easy to\nvisualize what region a given LVIS file covers and what the shape of its\ndata looks like. If the output path is not passed to the tool it will\ngenerate an output path by appending \".kml\" to the input path. This tool\nrequires the simplekml Python package to run. One way to get this is to\ninstall the ASP Python tools, described at the end of :numref:`sparse_disp`.\n\nUsage:: \n\n     > lvis2kml [options] <input path> [output path]\n\nCommand-line options for lvis2kml:\n\n-h, --help\n    Display this help message.\n\n--name <string>\n    Assign a name to the KML file.\n\n--color <red|green|blue>\n    Draw plots in the named color.\n\n--skip <int (default: 1)>\n    When loading a data file, plot only every N-th point. Has no\n    effect on boundary files.\n\n.. figure:: ../images/lvis2kml_snap.png\n   :name: lvis2kml_example\n   :alt:  KML visualizations\n\n   Example of KML visualizations produced with ``lvis2kml``. The output\n   from both the boundary file (red) and the data file (green) with a\n   point skip of 500 are shown in this image. The color saturation of\n   data points is scaled with the elevation such that the points in the\n   file with the least elevation show up as white and the highest points\n   show up as the specified color.\n"
  },
  {
    "path": "docs/tools/mapproject.rst",
    "content": ".. _mapproject:\n\nmapproject\n----------\n\nThe tool ``mapproject`` is used to orthorectify (mapproject) a camera image\nonto a DEM or datum. ASP is able to use mapprojected images to run stereo, see\n:numref:`mapproj-example`.\n\nThe ``mapproject`` program can be run using multiple processes and can be\ndistributed over multiple machines (options ``--nodes-list`` and\n``--processes``). \n\nThis is particularly useful for ISIS cameras, as in that case any single process\nmust use only one thread due to the limitations of ISIS. The tool splits the\nimage up into tiles, distributes the tiles to sub-processes, and then merges the\ntiles into the requested output image. If the input image is small but takes a\nwhile to process, smaller tiles can be used to start more simultaneous processes\n(use the parameters ``--tile-size`` and ``--processes``).\n\nIt is important to note that processing more tiles at a time may\nactually slow things down, if all processes write to the same disk and\nif processing each tile is dominated by the speed of writing to disk.\nHence some benchmarking may be necessary for your camera type and\nstorage setup.\n\nThe grid size, that is the dimension of pixels on the ground, set via\nthe ``--tr`` option, should be in units as expected by the projection\nstring obtained either from the DEM to project onto, or, if specified,\nfrom the ``--t_srs`` option. If the grid size is not set, it will be\nestimated as the mean *ground sampling distance (GSD)*.  See the\n``--tr`` option for how this affects the extent of the output image.\n\nIf the resulting mapprojected images are used for stereo, all mapprojected\nimages should have the same grid size and projection (:numref:`mapproj-res`).\n\n.. _mapproj_auto_proj:\n\nDetermination of projection\n~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nUse the option ``--t_srs`` to set a desired output projection. The projection\nshould be local to the area of interest, in units of meter.\n\nIf this is not set, the projection from the DEM will be used, unless it is the\n``longlat`` projection. In that case a good output projection is\nauto-determined.\n\nFor Earth, with the WGS84 datum, the auto-determined projection is UTM\nwith an auto-computed zone, except for latitudes above 84 degrees North and below 80 degrees\nSouth, where the `NSDIC polar stereographic projections\n<https://nsidc.org/data/user-resources/help-center/guide-nsidcs-polar-stereographic-projection>`_\nare used.\n\nFor other Earth datums and other planetary bodies, the automatic determination\nproduces a local stereographic projection. The projection center is found\nby a median calculation based on a sample of image pixels.\nOr consider using the cylindrical equal area projection.\n\nTo ensure the automatic projection determination is always invoked, overriding\nall other cases from above, use ``--t_srs auto``.\n\nAll mapprojected images passed to stereo should use the same projection and grid\nsize (:numref:`mapproj-example`).\n\nExamples\n~~~~~~~~\n\nEarth image with auto projection\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nMapproject an image with a pinhole camera (:numref:`pinholemodels`), with a grid\nsize of 2 meters, for Earth (WGS84)::\n\n     mapproject --tr 2.0 DEM.tif image.tif camera.tsai output.tif\n\nIf the DEM has a ``longlat`` projection, a projection in meters is found first \n(:numref:`mapproj_auto_proj`).\n\nMoon image with a custom projection\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nMapproject a .cub file (:numref:`moc_tutorial`). Such a file has both image and\ncamera information. The planetary body is the Moon. Use a custom\nstereographic projection::\n\n    proj=\"+proj=stere +lat_0=-85.364 +lon_0=31.238 +R=1737400 +units=m +no_defs\"\n\nThe grid size is set to 1 meter/pixel::\n\n    mapproject --tr 1.0 --t_srs \"$proj\" DEM.tif image.cub output.tif\n\nRPC camera with bundle adjustment\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nMapproject an image file with an RPC camera model (:numref:`rpc`) in XML format.\nUse bundle-adjusted cameras (:numref:`bundle_adjust`)::\n\n     mapproject -t rpc --bundle-adjust-prefix ba/run \\\n       DEM.tif image.tif camera.xml output.tif\n\nHere, the grid size is auto-determined.\n\nSee :numref:`rpc` for other ways of specifying the RPC camera model.\n\nCSM camera\n^^^^^^^^^^\n\nMapproject with the CSM camera model (:numref:`csm`)::\n\n    mapproject -t csm DEM.tif image.cub camera.json output.tif\n\n.. _mapproj_refmap:\n\nPreexisting projection and grid size\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe projection and grid size of a given mapprojected image can be borrowed when\nmapprojecting another image::\n\n    mapproject -t rpc                \\\n      --ref-map image1_map.tif       \\\n      DEM.tif image2.tif camera2.xml \\\n      image2_map.tif\n      \nThis becomes important for stereo, when the two input mapprojected images\nmust share these attributes (:numref:`mapproj-example`).\n\nMultiple camera models\n^^^^^^^^^^^^^^^^^^^^^^\n\nA DigitalGlobe / Maxar camera file has both an exact linescan model and \nan approximate RPC model. The RPC model is somewhat faster to use. \n\nTo choose between these with ``mapproject``, invoke it either with ``-t dg``\nor ``-t rpc``. See :numref:`dg_tutorial` for more information.\n\nMapproject with no DEM\n^^^^^^^^^^^^^^^^^^^^^^\n\nMapproject onto the surface of zero height above a datum::\n\n     mapproject -t rpc WGS84 image.tif image.xml output.tif\n\nValid datum names include WGS84, NAD83, NAD27, D_MOON, D_MARS, and\nMOLA.\n\n.. _mapproj_metadata:\n\nSaved metadata\n~~~~~~~~~~~~~~\n\nThe output image will have the following metadata saved to its geoheader:\n   \n   * ``INPUT_IMAGE_FILE``, the input image name. \n   * ``BUNDLE_ADJUST_PREFIX``, the bundle adjustment prefix. Set to ``NONE`` if not present.\n   * ``CAMERA_MODEL_TYPE``, this is the session name, such as set with ``-t rpc``.\n   * ``CAMERA_FILE``, the camera file used on input. Can be empty if the camera is contained within the input image.\n   * ``DEM_FILE``, the DEM used in mapprojection.\n\nThese metadata values are used to undo the mapprojection in stereo triangulation\n(:numref:`mapproj_reuse`). The geoheader can be inspected with ``gdalinfo``\n(:numref:`gdal_tools`).\n\nIn addition, if the cameras have been bundle-adjusted, the translation and\nquaternion rotation from the .adjust file will be saved to the fields\n``ADJUSTMENT_TRANSLATION`` and ``ADJUSTMENT_QUATERNION``. This is useful for\nhaving mapprojection be reproducible if the separately stored ``.adjust`` files\nare not available.\n\nThese fields are editable with ``image_calc`` (:numref:`image_calc_metadata`),\nbut this is not recommended.\n\n.. _mapproj_isis:\n\nISIS compatibility\n~~~~~~~~~~~~~~~~~~\n\nISIS is in the process of merging in logic for the `cam2map\n<https://isis.astrogeology.usgs.gov/Application/presentation/Tabbed/cam2map/cam2map.html>`_\nprogram that, when called with ``asp_map=true``, uses the same per-pixel\nprojection algorithm as ``mapproject``.\n\nWhen the grid size is not specified, each program auto-computes it from the\ncamera and DEM, and the results may differ slightly (under 1e-6 relative\nerror) due to implementation details. The produced projection bounds may\ndisagree somewhat as well.\n\nHowever, given the same inputs and the same grid size, these programs will\ncreate results that agree to float numerical precision at every grid point.\n\nExample with camera in cube file\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nConsider an LRO NAC (:numref:`lronac-example`) image having the camera\ninformation in the .cub file and an equicylindrical DEM on the Moon. Set up the\nprojection string::\n\n    proj=\"+proj=eqc +lat_ts=0 +lon_0=15.3 +x_0=0 +y_0=0 +R=1737400 +units=m +no_defs\"\n\nRun both programs with the same inputs and grid size::\n\n    mapproject --tr 1.2 --t_srs \"$proj\" \\\n      dem.tif image.cub output_asp.tif\n\n    cam2map asp_map=true useproj=true   \\\n      projstring=\"$proj\"                \\\n      pixres=mpp resolution=1.2         \\\n      dem=dem.tif from=image.cub to=output_isis.cub\n\nThe ``--tr`` option in ``mapproject`` and ``pixres=mpp resolution=`` in\n``cam2map`` both set the grid size (ground sample distance) in meters per pixel.\nThe DEM must be a GeoTIFF file with pixel values representing height above\ndatum, in meters.\n\nExample with CSM camera model\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nUse a CSM (:numref:`csm`) camera model from an ISD file instead of the\nSPICE camera in the cube. Assume the projection string is defined as\nabove.\n\n::\n\n    mapproject --tr 1.2 --t_srs \"$proj\" \\\n      dem.tif image.cub image.json output_asp.tif\n\n    cam2map asp_map=true useproj=true   \\\n      projstring=\"$proj\"                \\\n      pixres=mpp resolution=1.2         \\\n      dem=dem.tif isd=image.json        \\\n      from=image.cub to=output_isis.cub\n\nThe CSM and SPICE camera models differ somewhat in implementation. When\ncomparing map-projected images obtained with the two, the pixel difference\nmay be on the order of 1e-4, and the extents may differ too.\n\nHowever, ``mapproject`` and ``cam2map asp_map=true`` will still agree to\nfloat numerical precision at every grid point, when the same CSM camera\nmodel is used as input to both.\n\nThe ``isd`` parameter requires CSM plugins to be installed, which is the\ndefault in recent versions of ISIS.\n\nExample with preexisting map\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nIf an existing georeferenced image or .cub file is available, say named\n``ref.cub``, its projection, extent, and grid size can be reused::\n\n    cam2map asp_map=true dem=dem.tif     \\\n      map=ref.cub matchmap=true          \\\n      from=image.cub to=output_isis.cub\n\nA PVL ``.map`` file with these projection parameters can also be passed to the\n``map`` argument. Using a georeferenced image supports a wider range of\nprojections, since GDAL reads the projection directly from the file.\n\nValidation\n^^^^^^^^^^\n\nThe two results can be compared with :ref:`geodiff`::\n\n    geodiff output_isis.cub output_asp.tif -o run\n    gdalinfo -stats run-diff.tif\n\nThe expected pixel difference should be on the order of 1e-7 or less.\n\nThe ``gdalinfo`` command can also be employed to verify that both outputs have\nthe same projection, extent, and grid size.\n\nRunning stereo\n^^^^^^^^^^^^^^\n\nImages mapprojected with ``cam2map asp_map=true`` do not retain the original\ncamera information in the cube header. The original cameras must be provided as\nadditional arguments to ``parallel_stereo`` (:numref:`parallel_stereo`). The\nfirst two arguments are the mapprojected images and the next two are the\ncameras::\n\n    parallel_stereo                          \\\n      left_cam2map.cub right_cam2map.cub     \\\n      left.cub right.cub                     \\\n      run/run                                \\\n      --dem dem.tif                          \\\n      --stereo-algorithm asp_mgm             \\\n      --subpixel-mode 9\n\n    point2dem --tr 1.2 run/run-PC.tif\n\nThis is the same workflow as stereo with ISIS mapprojected images\n(:numref:`mapproj_with_cam2map`), where the camera arguments are the\noriginal unprojected .cub files.\n\nThe DEMs produced with these two invocations should agree with nearly float\nprecision if invoked with the same choices of parameters.\n\nSaved metadata\n^^^^^^^^^^^^^^\n\nWhen ``cam2map`` is run with ``asp_map=true``, the output .cub file contains an\n``AspMapproject`` PVL group with the same fields as ``mapproject`` saves in the\nGeoTIFF geoheader (:numref:`mapproj_metadata`): ``INPUT_IMAGE_FILE``,\n``BUNDLE_ADJUST_PREFIX``, ``CAMERA_MODEL_TYPE``, ``CAMERA_FILE``, and\n``DEM_FILE``. This group can be inspected with ``gdalinfo -mdd all`` or\n``catlab``.\n\nOther cam2map options\n^^^^^^^^^^^^^^^^^^^^^\n\nThe ``cam2map`` options ``minlat``, ``maxlat``, ``minlon``, ``maxlon`` are\nsupported in ``asp_map`` mode. Since cam2map can only create mapprojected\ncube files with projection in meters, these input bounds will be converted\nto projected units for the input projection.\n\nWhen the option ``pixres`` is not set, the default value is used (``camera``),\nwhich amounts to auto-determining the grid size from the camera and DEM. This is\nthe same behavior as for ``mapproject`` when the ``--tr`` option is not set.\n\nThis implementation supports multi-band inputs with float values. ASP's\n``mapproject`` program can handle single-band float images and RGB images.\nFor other multi-band inputs (including RGBA), only the first band is used.\nWhen comparing with ``cam2map`` on multi-band inputs, ``mapproject`` results\ncorrespond to the first band of the ``cam2map`` output.\n\nThe ``defaultrange`` option is partially supported: ``defaultrange=camera``\nunlocks the ``minlat``/``maxlat``/``minlon``/``maxlon`` overrides, and\n``defaultrange=map`` uses the map file's extent. Other values are silently\nignored (bounds are auto-computed from the camera footprint and DEM).\n\nThe ``cam2map`` options ``interp``, ``warpalgorithm``, ``patchsize``,\n``trim``, ``occlusion``, and ``lonseam`` are ignored in ``asp_map`` mode,\nwhich always uses per-pixel bicubic interpolation.\n\nGrid snapping and output extent\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nWhen ``cam2map`` is run with ``asp_map=true``, the output grid is snapped\nto integer multiples of the grid size, consistent with ``mapproject``. The\nproduced extent goes half a grid pixel beyond the snapped grid on each\nside, because the grid is at pixel centers.\n\nUsage\n~~~~~\n\n::\n\n     mapproject [options] <dem> <camera-image> <camera-model> <output-image>\n\n.. _mapproj_options:\n\nCommand-line options\n~~~~~~~~~~~~~~~~~~~~\n\n--t_srs <string (default: \"\")>\n    Specify the output projection as a GDAL projection string (WKT, GeoJSON, or\n    PROJ). See :numref:`mapproj_auto_proj` for details.\n\n--tr <float>\n    Set the output file resolution (ground sample distance) in target\n    georeferenced units per pixel. This may be in meters or degrees, depending\n    on the projection. The center of each output pixel will be at integer\n    multiples of this grid size, unless ``--gdal-tap`` is set.\n\n-t, --session-type <string>\n    Select the stereo session type to use for processing. \n    See :numref:`ps_options` for the list of types.\n\n--t_projwin <xmin ymin xmax ymax>\n    Limit the mapprojected image to this region, with the corners given in\n    georeferenced coordinates (xmin ymin xmax ymax). See also ``--gdal-tap``.\n\n--t_pixelwin <xmin ymin xmax ymax>\n    Limit the mapprojected image to this region, with the corners\n    given in pixels (xmin ymin xmax ymax). Max is exclusive.\n\n--gdal-tap\n    Ensure that the output image bounds (as printed by ``gdalinfo``,\n    :numref:`gdal_tools`) are integer multiples of the grid size (as set with\n    ``--tr``). When ``--t_projwin`` is set and its entries are integer\n    multiples of the grid size, that precise extent will be produced on output.\n    This functions as the GDAL ``-tap`` option.\n    \n--bundle-adjust-prefix <name>\n    Use the camera adjustment obtained by previously running\n    bundle_adjust with this output prefix.\n\n--ref-map <filename>\n    Read the projection and grid size from this mapprojected image\n    (:numref:`mapproj_refmap`).\n\n--processes <integer>\n    Number of processes to use on each node (the default is for the\n    program to choose).\n\n--num-processes <integer>\n    Same as --processes. Used for backwards compatibility.\n\n--nodes-list\n    List of available computing nodes to use. If not set, use the local\n    machine. See also :numref:`pbs_slurm`.\n\n--tile-size\n    Size of square tiles to break up processing into. Each tile is run\n    by an individual process. The default is 1024 pixels for ISIS\n    cameras, as then each process is single-threaded, and 5120 pixels\n    for other cameras, as such a process is multi-threaded, and disk\n    I/O becomes a bigger consideration.\n    \n--mpp <float>\n    Set the output file resolution in meters per pixel.\n\n--ppd <float>\n    Set the output file resolution in pixels per degree.\n\n--datum-offset <float>\n    When projecting to a datum instead of a DEM, add this elevation\n    offset to the datum.\n    \n--ot <type (default: Float32)>\n    Output data type, when the input is single channel. Supported\n    types: Byte, UInt16, Int16, UInt32, Int32, Float32. If the\n    output type is a kind of integer, values are rounded and then\n    clamped to the limits of that type. This option will be ignored\n    for multi-channel images, when the output type is set to be the\n    same as the input type.\n\n--nearest-neighbor\n    Use nearest neighbor interpolation instead of bicubic interpolation. *This\n    is not recommended, as it can result in artifacts.*\n\n--mo <string>\n    Write metadata to the output file. Provide as a string in quotes\n    if more than one item, separated by a space, such as\n    ``VAR1=VALUE1 VAR2=VALUE2``.  Neither the variable names nor\n    the values should contain spaces.\n\n--query-projection\n    Display the computed projection information, estimated ground sample\n    distance, and projected bounding box. Save the projection as a WKT\n    file named ``<output image>.wkt``. Quit afterwards.\n\n--query-pixel <double double>\n    Trace a ray from this input image pixel (values start from 0) to the ground.\n    Print the intersection point with the DEM as lon, lat, height, then as DEM\n    column, row, height. Quit afterwards.\n    \n--parallel-options <string (default: \"--sshdelay 0.2\")>\n    Options to pass directly to GNU Parallel.\n\n--no-geoheader-info\n    Do not write information in the geoheader. Otherwise mapproject will\n    write the camera model type, the bundle adjustment prefix used,\n    the rotation and translation from the .adjust file, the DEM it\n    mapprojected onto, and the value of the ``--mo`` option.\n\n--nodata-value <float (default: -32768)>\n    No-data value to use unless specified in the input image.\n\n--suppress-output\n    Suppress output from sub-processes.\n\n--threads <integer (default: 0)>\n    Select the number of threads to use for each process. If 0, use\n    the value in ~/.vwrc.\n\n--cache-size-mb <integer (default = 1024)>\n    Set the system cache size, in MB, for each process.\n\n--no-bigtiff\n    Tell GDAL to not create BigTiff files.\n\n--tif-compress <None|LZW|Deflate|Packbits>\n    TIFF compression method.\n\n--cog\n    Write a cloud-optimized GeoTIFF (COG). See :numref:`cog_output`.\n\n-v, --version\n    Display the version of software.\n\n-h, --help\n    Display the help message.\n"
  },
  {
    "path": "docs/tools/multi_stereo.rst",
    "content": ".. _multi_stereo:\n\nmulti_stereo\n------------\n\nThe ``multi_stereo`` program takes as input a set of images and\ncameras, runs pairwise stereo between each image/camera and the next\none in the list, filters the produced points clouds, fuses them, and\ncreates a mesh. The input cameras are found using\nStructure-from-Motion.\n\nFor the moment, this program is very tied to ``rig_calibrator``\n(:numref:`rig_calibrator`).  It will become more generic and versatile\nwith time. In particular, logic is planned for automatically selecting\nstereo pairs and for distributing and load-balancing all resulting\nprocessing jobs over multiple machines.\n\nExamples\n^^^^^^^^\n\nHere we will create a mesh of a small portion of the International\nSpace Station (ISS), based on images acquired with the `Astrobee\n<https://github.com/nasa/astrobee>`_ robot (later this example will be\nexpanded to a full module). \n\nIn this example it is very important to choose for pairwise stereo\nimages with a convergence angle of about 5-10 degrees. A smaller\nconvergence angle results in unreliable depth determination, while for\na bigger one the scene changes enough sometimes that stereo\ncorrelation can be erroneous, resulting in artifacts. Note that\n``rig_calibrator`` (as well as ``bundle_adjust`` and\n``parallel_stereo``) compute the convergence angles.\n\nThen, ``pc_filter`` was used for filtering blunders according\nto many geometric criteria.\n\nThe 7-image dataset used below, the full recipe, and output mesh, are\navailable for `download \n<https://github.com/NeoGeographyToolkit/StereoPipelineSolvedExamples/releases/tag/multi_stereo>`_.\n\nSee another example in :numref:`rig_msl`. That one runs stereo on\npairs of images created with a stereo rig onboard the MSL Curiosity\nrover.\n\nCreation of camera models\n~~~~~~~~~~~~~~~~~~~~~~~~~\n\nWe follow the approach in :numref:`rig_calibrator`, but with a rig\nconsisting of just one camera.\n\nThe camera intrinsics and the images are used to find the camera\nposes::\n\n    theia_sfm --rig-config camera_config.txt \\\n      --images 'images/nav_cam/*jpg'         \\\n      --out-dir theia_out\n\nNote that the images are stored in the ``nav_cam`` subdirectory, and\neach image name consists of a number and an image extension, following\nthe conventions used by ``rig_calibrator``, even though here we have\njust a single sensor acquiring all images.\n\nNext is refinement of camera poses and registration to world\ncoordinates (this requires first manually picking some features with\nknown 3D positions in the images, per\n:numref:`rig_calibrator_registration`)::\n\n    rig_calibrator                      \\\n      --rig-config camera_config.txt    \\\n      --nvm theia_out/cameras.nvm       \\\n      --camera-poses-to-float \"nav_cam\" \\\n      --intrinsics-to-float \"\"          \\\n      --num-iterations 100              \\\n      --num-passes 2                    \\\n      --num-overlaps 10                 \\\n      --registration                    \\\n      --hugin-file control_points.pto   \\\n      --xyz-file xyz.txt                \\\n      --out-dir rig_out\n    \nRegistration to world coordinates is optional. It is still suggested\nto use at least some rough guesses for where the world positions of\nsome points are. The camera configuration will not be deformed in\norder to fit precisely the measurements; a single best-fit similarity\ntransform will be applied to the whole setup.\n\nRunning stereo and mesh creation\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nAs mentioned earlier, the geometry of the scene being imaged requires\nsome careful choices of parameters for stereo.  Then, this tool calls\nseveral other tools under the hood, so options for those should be set\nas well. Here's a recipe which works reasonably well::\n\n    maxDistanceFromCamera=3.0\n\n    stereo_opts=\"\n      --stereo-algorithm asp_mgm\n      --alignment-method affineepipolar\n      --ip-per-image 10000\n      --min-triangulation-angle 0.5\n      --global-alignment-threshold 5\n      --session nadirpinhole\n      --no-datum\n      --corr-seed-mode 1\n      --max-disp-spread 300\n      --ip-inlier-factor 0.4\n      --nodata-value 0\"\n      \n    pc_filter_opts=\"\n      --max-camera-ray-to-surface-normal-angle 75 \n      --max-valid-triangulation-error 0.0025   \n      --max-distance-from-camera $maxDistanceFromCamera\n      --blending-dist 50 --blending-power 1\"\n\n    mesh_gen_opts=\"\n      --min_ray_length 0.1\n      --max_ray_length $maxDistanceFromCamera\n      --voxel_size 0.01\"\n\n    multi_stereo                            \\\n      --rig_config rig_out/rig_config.txt   \\\n      --camera_poses rig_out/cameras.txt    \\\n      --undistorted_crop_win '1100 700'     \\\n      --rig_sensor nav_cam                  \\\n      --first_step stereo                   \\\n      --last_step  mesh_gen                 \\\n      --stereo_options \"$stereo_opts\"       \\\n      --pc_filter_options \"$pc_filter_opts\" \\\n      --mesh_gen_options \"$mesh_gen_opts\"   \\\n      --out_dir stereo_out\n\nThe surface resolution of the cameras is on the order of 1 mm (0.001\nmeters), the camera is about 1-3 meters from the surface, hence a good\nvalue for the triangulation error was about 0.0025 meters, and the\npoints in the cloud were binned (before meshing) into voxels of size\n0.005 meters. Later some of these choices will be automated, or\nscale-independent parameters will be provided. The value\n``--max-disp-spread 300`` is about right for this case, but should\nnormally be omitted as sometimes it may restrict the disparity\nunnecessarily. \n\nThere are three steps happening above, namely:\n\n* stereo: Runs ``parallel_stereo`` (:numref:`parallel_stereo`) and\n  writes a point cloud in .tif format for each image/camera\n  in the list and the next one. This is the most time-consuming step.\n\n* pc_filter: For each point cloud runs ``pc_filter`` (:numref:`pc_filter`)\n  and writes filtered point clouds in .tif and .pcd formats, and a\n  textured mesh for that run in .obj format. The .pcd file is in left\n  camera's coordinates. The .obj file is for individual stereo run\n  inspection purposes.\n\n* mesh_gen: Use ``voxblox_mesh`` (:numref:`voxblox_mesh`) to fuse the\n  filtered point clouds in .pcd format and create a mesh in .ply\n  format.\n\nThe images are undistorted internally before stereo is run. (The\nundistortion step may be optional in future versions.)\n\nSee ``--first_step`` and ``--last_step`` in\n:numref:`multi_stereo_command_line` for how to choose which processing\nsteps to run. This tool also has controls for the range of images to run.\n\nCreating a textured mesh\n~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe obtained mesh can be post-processed (smoothed, hole-filled, etc.)\nusing a handful of CGAL-based tools shipped with ASP\n(:numref:`cgal_tools`).  Then, it can be textured with the original\nimages using the ``texrecon`` tool (:numref:`texrecon`) as::\n\n    texrecon --rig_config rig_out/rig_config.txt \\\n      --camera_poses rig_out/cameras.txt         \\\n      --mesh stereo_out/nav_cam/fused_mesh.ply   \\\n      --rig_sensor nav_cam                       \\\n      --undistorted_crop_win '1100 700'          \\\n      --out_dir stereo_out\n\nThis produces ``stereo_out/nav_cam/texture.obj``.\n\n.. figure:: ../images/bumble_dock_texture.png\n   :name: bumble_dock_texture\n   :alt:  Bumble dock texture\n\n   Fused .ply mesh and textured .obj file produced by ``voxblox_mesh``\n   and ``texrecon`` (left and right). Here, no smoothing or hole-filling\n   of the meshes was used (:numref:`cgal_tools`). See :numref:`sfm_iss`\n   for an example of mesh and texture creation for depth data.\n\nHandling issues\n^^^^^^^^^^^^^^^\n\nIf the produced mesh is noisy, it is suggested to inspect individual\n.obj files produced by each stereo pair, the triangulation error of\neach filtered point cloud (fourth band, extractable with\n``gdal_translate -b 4``), and the blending weight files saved by\n``pc_filter``.\n\nOne may need to decrease the value of\n``--max-valid-triangulation-error``, use less of the boundary image\nregion (``--undistorted_crop_win``) or redo the bundle adjustment with\n``rig_calibrator``.\n\n.. _multi_stereo_command_line:\n\nCommand-line options for multi_stereo\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n--rig_config <string (default: \"\")>\n    Rig configuration file.\n--rig_sensor <string (default: \"\")>\n    Which rig sensor images to use. Must be among the\n    sensors specified via ``--rig_config``.  To use images from\n    several sensors, pass in a quoted list of them, separated by a\n    space.\n--camera_poses <string (default: \"\")>\n    Read images and camera poses for this sensor from this \n    list.\n--out_dir <string (default: \"\")>\n    The directory where to write the stereo output, textured mesh,\n    other data.\n--stereo_options <string (default: \"\")>\n    Options to pass to ``parallel_stereo``. Use double quotes\n    around the full list and simple quotes if needed by an\n    individual option, or vice-versa.\n--pc_filter_options <string (default: \"\")>\n    Options to pass to ``pc_filter``.\n--mesh_gen_options <string (default: \"\")>\n    Options to pass to ``voxblox_mesh`` for mesh generation.\n--undistorted_crop_win <string (default: \"\")>\n    The dimensions of the central image region to keep\n    after the internal undistortion step and before using it in\n    stereo. Normally 85% - 90% of distorted (actual)\n    image dimensions would do. Suggested the Astrobee images:\n    sci_cam: '1250 1000' nav_cam: '1100 776'. haz_cam: '250 200'.\n--first_step <string (default: \"stereo\")>\n    Let the first step run by this tool be one of:\n    'stereo', 'pc_filter', or 'mesh_gen'. This allows\n    resuming a run at a desired step. The stereo\n    subdirectories are deleted before that step takes\n    place.\n--last_step <string (default: \"mesh_gen\")>\n    The last step run by this tool. See ``--first_step``\n    for allowed values.\n--first-image-index <integer (default: None)>\n    The index of the first image to use for stereo, in the\n    list of images. Indices start from 1. By default, use\n    all the images.\n--last-image-index <integer (default: None)>\n    The index of the last image to use for stereo, in the\n    list of images. Indices start from 1. By default, use\n    all the images.\n--left <string (default: \"\")>\n    Instead of running pairwise stereo between every image and the\n    next one given in ``--camera_poses``, use every image from this\n    list and corresponding one from the list given by the ``--right``\n    option.  \n--right <string (default: \"\")>\n    To be used with ``--left``.\n\n-h, --help\n  Show this help message and exit.\n"
  },
  {
    "path": "docs/tools/n_align.rst",
    "content": ".. _n_align:\n\nn_align\n-------\n\nThis tool can be used to jointly align a set of two or more point\nclouds, hence it extends the functionality of ``pc_align``\n(:numref:`pc_align`). It implements the ICP flavor from\n:cite:`toldo2010global`, more exactly, \n`this MATLAB algorithm <https://searchcode.com/file/13619767/Code/matlab/GlobalProcrustesICP/globalProcrustes.m>`_.\n\nThis program does not scale well for large clouds. In practice, ``pc_align`` is\npreferred.\n\nUsage::\n\n     n_align <cloud files> -o <output prefix>\n\nThis tool supports the same types of data on input and output as\n``pc_align``, except for LAZ COPC files.\n\nEven for two clouds this algorithm is not the same as the ones that are\npart of ``pc_align``. This algorithm is expected to be more robust to\noutliers than the regular ICP in ``pc_align`` since it uses a\ncross-check. Yet, it may not handle a large translation difference\nbetween the clouds as well. In that case, given a set of clouds, one can\nfirst use ``pc_align`` to align all other clouds to the first one, then\ninvoke this algorithm for joint alignment while passing the obtained\nalignment transforms as an argument to this tool, to be used as initial\nguesses. The option to use for this, as shown below for simplicity for\nthree clouds, is::\n\n     --initial-transforms 'identity.txt run_12/run-transform.txt run_13/run-transform.txt'\n\nwhere the file ``identity.txt`` contains the 4 |times| 4 identity\nmatrix (the transform from the first cloud to itself), and ``run_12/run``\nis the output prefix for ``pc_align`` when invoked on the first and\nsecond clouds, etc. The final transforms output by this tool will\nincorporate the initial guesses.\n\nThis tool should be less sensitive than ``pc_align`` to the order of the\nclouds since any two of them are compared against each other. The number\nof iterations and number of input points used will dramatically affect\nits performance, and likely the accuracy. Cropping all clouds to the\nsame region is likely to to improve both run-time and the results.\n\nCommand-line options for n_align:\n\n--num-iterations <arg (default: 100)>\n    Maximum number of iterations.\n\n--max-num-points <arg (default: 1000000)>\n    Maximum number of (randomly picked) points from each cloud to\n    use.\n\n--csv-format <string>\n    Specify the format of input CSV files as a list of entries\n    column_index:column_type (indices start from 1).  Examples:\n    ``1:x 2:y 3:z`` (a Cartesian coordinate system with origin at\n    planet center is assumed, with the units being in meters),\n    ``5:lon 6:lat 7:radius_m`` (longitude and latitude are in degrees,\n    the radius is measured in meters from planet center), \n    ``3:lat 2:lon 1:height_above_datum``,\n    ``1:easting 2:northing 3:height_above_datum``\n    (need to set ``--csv-srs``; the height above datum is in\n    meters).  Can also use radius_km for column_type, when it is\n    again measured from planet center.\n\n--csv-srs <proj string>\n    The PROJ or WKT string to use to interpret the entries in input CSV\n    files.\n\n--datum <string>\n    Use this datum for CSV files instead of auto-detecting it.  Options:\n\n    - WGS_1984\n    - D_MOON (1,737,400 meters)\n    - D_MARS (3,396,190 meters)\n    - MOLA (3,396,000 meters)\n    - NAD83\n    - WGS72\n    - NAD27\n    - Earth (alias for WGS_1984)\n    - Mars (alias for D_MARS)\n    - Moon (alias for D_MOON)\n\n--semi-major-axis <arg (default: 0)>\n    Explicitly set the datum semi-major axis in meters.\n\n--semi-minor-axis <arg (default: 0)>\n    Explicitly set the datum semi-minor axis in meters.\n\n-o, --output-prefix <arg>\n    Specify the output prefix. The computed alignment transforms\n    and, if desired, the transformed clouds, will be saved to names\n    starting with this prefix.\n\n--save-transformed-clouds\n    Apply the obtained alignment transforms to the input clouds and\n    save them.\n\n--initial-transforms-prefix <arg>\n    The prefix of the transforms to be used as initial guesses. The\n    naming convention is the same as for the transforms written on\n    output.\n\n--initial-transforms <arg>\n    Specify the initial transforms as a list of files separated by\n    spaces and in quotes, that is, as ``'trans1.txt ... trans_n.txt'``.\n\n--relative-error-tolerance <tolerance (default: 1e-10)>\n    Stop when the change in the error divided by the error itself\n    is less than this.\n\n--align-to-first-cloud\n    Align the other clouds to the first one, rather than to their\n    common centroid.\n\n--verbose\n    Print the alignment error after each iteration.\n\n--threads <integer (default: 0)>\n    Select the number of threads to use for each process. If 0, use\n    the value in ~/.vwrc.\n \n--cache-size-mb <integer (default = 1024)>\n    Set the system cache size, in MB.\n\n--tile-size <integer (default: 256 256)>\n    Image tile size used for multi-threaded processing.\n\n--no-bigtiff\n    Tell GDAL to not create BigTiff files.\n\n--tif-compress <None|LZW|Deflate|Packbits (default: LZW)>\n    TIFF compression method.\n\n-v, --version\n    Display the version of software.\n\n-h, --help\n    Display this help message.\n\n.. |times| unicode:: U+00D7 .. MULTIPLICATION SIGN\n"
  },
  {
    "path": "docs/tools/orbit_plot.rst",
    "content": ".. _orbit_plot:\n\norbit_plot.py\n-------------\n\nThe ``orbit_plot.py`` program is a Python script that takes an input one or more\norbital sequences of cameras, and plots the camera orientation as it changes\nalong the orbit. Each orientation is decomposed into roll, pitch, and yaw\ncomponents (in degrees), that are plotted separately (:numref:`orbit_plot_fig`).\n\nIf a second set of orbital sequences exists, for example, if the camera\norientations are later optimized, with ``bundle_adjust``\n(:numref:`bundle_adjust`) or ``jitter_solve`` (:numref:`jitter_solve`), this\ntool can overlay the two sets.\n\nEach orbital sequence consists of several frame (pinhole) cameras, in .tsai\n(:numref:`pinholemodels`) or CSM (:numref:`csm_frame`) format, or it can be a\nsingle linescan camera in the CSM model state format (:numref:`csm_state`).  \n\nAt some point this program will also plot the camera positions.\n\nThe ``orbit_plot`` conda environment should be first installed \nas described in :numref:`orbit_plot_dependencies`.\n\nSatellite coordinate system\n~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThis program estimates the camera orientation relative to the local satellite\ncoordinate system at each sample, which is defined as follows: the origin is the\ncamera center (in ECEF), the *x* axis is tangent to the orbit, so it points\nalong the track, the z axis points roughly from the camera center to the planet\ncenter while being perpendicular to the *x* axis, and the *y* axis is\nperpendicular to the *x* and *z* axes, so it points across-track.\n\nGiven that we have only a set of samples for the camera center, all these axes\nare approximate, and it is implicitly assumed that the planet and orbit are\nsomewhat spherical (circular). Hence, the produced plots have some small\ninaccuracies.\n\nWhen synthetic cameras are created with ``sat_sim`` (:numref:`sat_sim`), that\ntool can save the precise satellite orientation if invoked with the option\n``--save-ref-cams``. This program can then read those orientations if called\nwith the ``--use-ref-cams`` option.\n\nRoll, pitch, and yaw angles\n~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe camera orientation relative to the local satellite coordinate system is\ndecomposed into roll, pitch, and yaw angles, measured in degrees. When all these\nangles are zero, the camera looks straight down. For a positive pitch, the\ncamera looks somewhat ahead.\n\nSee :numref:`roll_pitch_yaw_def` for a more technical discussion of these\nangles and for the relation between the camera and satellite coordinate systems.\n\nExamples\n~~~~~~~~\n\nPlot one dataset\n^^^^^^^^^^^^^^^^\n\nWe assume that ASP's ``bin`` directory is in the path, otherwise the full path\nto this script must be specified below. Then, the dependencies are should be\ninstalled (:numref:`orbit_plot_dependencies`).\n\nPlot a single set of cameras along a given orbit::\n\n    ~/miniconda3/envs/orbit_plot/bin/python \\\n      $(which orbit_plot.py)                \\\n      --dataset dataset1/                   \\\n      --dataset-label dataset1              \\\n      --orbit-id pinhole-fwd                \\\n      --orbit-label pinhole \n\nWe assume that the cameras are in the directory ``dataset1/``, and their names\nin that directory contain the string ``pinhole-fwd``. \n\nThe slash (``/``) at the end of the directory name is important, on reading\nthe tool will match the dataset name, followed by some characters, followed \nby the orbit id. \n\nThe rest of a camera name can be any string ending in ``.tsai`` or ``.json``.\nHence, only the cameras satisfying this convention will be read.\n\nSee an illustration in :numref:`orbit_plot_fig`.\n\nFor finer-grained control, the desired cameras can be put in a list. For\nexample::\n\n  ls dataset1/pinhole*.tsai > pinhole_list.txt\n    ~/miniconda3/envs/orbit_plot/bin/python \\\n      $(which orbit_plot.py)                \\\n      --list pinhole_list.txt               \\\n      --dataset-label dataset1              \\\n      --orbit-id pinhole-fwd                \\\n      --orbit-label pinhole \n\nThen, only the images in the list that match the value of ``--orbit-id`` will be\nread.\n\nIf these are synthetic cameras created with ``sat_sim`` (:numref:`sat_sim`),\nconsider adding the option ``--use-ref-cams`` (this option does not work with\n``--list``).\n\nPlot two datasets\n^^^^^^^^^^^^^^^^^\n\nWe consider two camera datasets, with the camera names starting with::\n\n    dataset1/pinhole-fwd\n    dataset2/run-pinhole-fwd \n\nThe naming convention used above is suggestive of the first dataset being a set\nof input cameras, while the second being created from the first using\n``bundle_adjust`` or ``jitter_solve``. The string ``pinhole-fwd`` is the orbit\nid.\n\n::\n\n    ~/miniconda3/envs/orbit_plot/bin/python \\\n      $(which orbit_plot.py)                \\\n      --dataset dataset1/,dataset2/run-     \\\n      --orbit-id pinhole-fwd                \\\n      --dataset-label data1,data2           \\\n      --orbit-label pinhole\n\nNotice how above the shared orbit id is specified separately from the dataset\nnames. Here we omitted the option ``--use-ref-cams``.\n\nIt may be convenient on occasion to read from lists instead, while respecting\nthe pattern in in ``--orbit-id``::\n\n    ~/miniconda3/envs/orbit_plot/bin/python \\\n      $(which orbit_plot.py)                \\\n      --list list1.txt,list2.txt            \\\n      --orbit-id pinhole-fwd                \\\n      --dataset-label data1,data2           \\\n      --orbit-label pinhole\n\nThese two datasets will be plotted on top of each other, in red and blue, respectively.\n\n.. figure:: ../images/orbit_plot.png\n   :name: orbit_plot_fig\n   :alt:  orbit_plot_fig\n   \n   Roll, pitch, and yaw angle (in degrees) for two orbital sequences, \n   shown in red and blue.  The option ``--subtract-line-fit`` can be used\n   to see finer-level differences between the two sequences.\n\nPlot two orbital groups, including linescan cameras\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nHere, in addition to a group of pinhole cameras looking forward, before and\nafter bundle adjustment, we also consider a group consisting of a single\nlinescan camera, which looks down, before and after solving for jitter.\n\nIt is assumed that the linescan camera will have many position and orientation\nsamples, and that these numbers of samples are equal (unless the option\n``--use-ref-cams`` is used).\n\nThe only change in the command above is that the orbit id now has the additional value ``linescan-nadir``, so the plot command becomes::\n\n    ~/miniconda3/envs/orbit_plot/bin/python \\\n      $(which orbit_plot.py)                \\\n      --dataset dataset1/,dataset2/run-     \\\n      --orbit-id pinhole-fwd,linescan-nadir \\\n      --dataset-label data1,data2\n\nThe cameras before optimization will be in directory ``dataset1/``, with the\npinhole camera names starting with ``pinhole-fwd``, and the linescan camera\nname starting with ``linescan-nadir``. \n\nThe cameras after optimization will start with ``dataset2/run-``, followed\nagain by the orbit id.\n\nThe resulting plot will have two rows, showing the two orbital groups. \n\n.. _orbit_plot_dependencies:\n\nDependencies\n~~~~~~~~~~~~\n\nThis tool needs Python 3 and some additional Python packages to be installed with \n``conda``. \n\nConda can be obtained from \n\n    https://docs.conda.io/en/latest/miniconda.html\n\nRun::\n\n    ./Miniconda3-latest-Linux-x86_64.sh\n\non Linux, and the appropriate version on OSX (this script needs to be\nmade executable first). Use the suggested::\n\n    $HOME/miniconda3\n\ndirectory for installation. \n\nActivate conda. The needed packages can be installed, for example,\nas follows:\n\n::\n    \n    conda create -n orbit_plot numpy scipy pyproj matplotlib\n\nSee also\n~~~~~~~~\n\nThe tool ``sfm_view`` (:numref:`sfm_view`) can be used to visualize cameras in\norbit.\n\nThe ``asp_plot`` package (:numref:`asp_plot`) can generate diagnostic plots and\nPDF reports from ASP stereo outputs.\n\nCommand-line options\n~~~~~~~~~~~~~~~~~~~~\n\n--dataset <string (default: \"\")>\n    The dataset to plot. Only one or two datasets are supported (for example,\n    before and after optimization). Each dataset can have several types of\n    images, given by ``--orbit-id``. The dataset is the prefix of the cameras,\n    such as \"cameras/\" or \"opt/run-\". It is to be followed by the orbit id, such\n    as, \"nadir\" or \"aft\". If more than one dataset, they will be plotted on top\n    of each other.\n\n--list <string (default: \"\")>\n    Instead of specifying ``--dataset``, load the cameras listed in this file\n    (one per line). Only the names matching ``--orbit-id`` will be read. If more\n    than one list, separate them by comma, with no spaces in between.\n\n--orbit-id <string (default: \"\")>\n    The id (a string) that determines an orbital group of cameras. If more than\n    one, separate them by comma, with no spaces in between.\n\n--dataset-label <string (default: \"\")>\n    The label to use for each dataset in the legend. If more than one, separate\n    them by comma, with no spaces in between. If not set, will use the dataset\n    name.\n\n--orbit-label <string (default: \"\")>\n    The label to use for each orbital group (will be shown as part of the\n    title). If more than one, separate them by comma, with no spaces in between.\n    If not set, will use the orbit id.\n\n--num-cameras <int (default: -1)>\n    Plot only the first this many cameras from each orbital sequence. By\n    default, plot all of them.\n\n--use-ref-cams\n    Read from disk reference cameras that determine the satellite orientation.\n    This assumes the first dataset was created with ``sat_sim`` with the option\n    ``--save-ref-cams``. The naming convention assumes the additional ``-ref``\n    string as part of the reference camera names, before the filename extension.\n    Without this option, the satellite orientations are estimated based on\n    camera positions.\n\n--ref-list <string (default: \"\")>\n    When ``--list`` is specified, read the reference cameras from this file.\n    \n--subtract-line-fit\n    If set, subtract the best line fit from the curves being plotted. If more\n    than one dataset is present, the same line fit (for the first one)\n    will be subtracted from all of them. This is useful for inspecting subtle\n    changes.\n\n--use-rmse\n  Compute and display the root mean square error (RMSE) rather than the standard\n  deviation. This is useful when a systematic shift is present. See also\n  ``--subtract-line-fit``.\n    \n--trim-ratio <float (default: 0.0)>\n    Trim ratio. Given a value between 0 and 1 (inclusive), remove this fraction\n    of camera poses from each sequence, with half of this amount for poses at\n    the beginning and half at the end of the sequence. This is used only for\n    linescan cameras, to not plot camera poses beyond image lines. For cameras\n    created with ``sat_sim``, a value of 0.5 should be used.\n\n--figure-size <string (default: \"15,15\")>\n    Specify the width and height of the figure having the plots, in inches. Use\n    two numbers with comma as separator (no spaces).\n\n--title <string (default: \"\")>\n    Set this as the figure title, to be shown on top of all plots.\n    \n--line-width <float (default: 1.5)>\n    Line width for the plots.\n\n--font-size <int (default: 14)>\n    Font size for the plots.\n\n--output-file <string (default: \"\")>\n    Save the figure to this image file, instead of showing it on the screen.\n    A png extension is recommended.\n        \n-h, --help\n    Display this help message.\n\n.. |times| unicode:: U+00D7 .. MULTIPLICATION SIGN\n"
  },
  {
    "path": "docs/tools/orbitviz.rst",
    "content": ".. _orbitviz:\n\norbitviz\n--------\n\nProduces a Google Earth KML file useful for visualizing camera\npositions. The input for this tool is one or more images and camera\nfiles.\n\n.. figure:: ../images/orbitviz_ge_result_600px.png\n   :name: orbitviz_example\n   :alt: KML visualization \n\n   Example of a KML visualization produced with ``orbitviz`` depicting\n   camera locations for the Apollo 15 Metric Camera during orbit 33 of\n   the Apollo command module.\n\nExample::\n\n      orbitviz image[1-4].tif camera[1-4].tsai -o orbit.kml\n\nUsage::\n\n     orbitviz [options] <input images and cameras> \n\nCommand-line options for orbitviz:\n\n-o, --output <filename (default: orbit.kml)>\n    The output kml file that will be written.\n\n--linescan-line <integer (default: 1)>\n    Get the camera position at this pixel line.\n\n--linescan-sample <integer (default: 1)>\n    Get the camera position at this pixel sample.\n\n-s, --model-scale <float (default: 1)>\n    Scale the size of the coordinate axes by this amount. Ex: To\n    scale axis sizes up to Earth size, use 3.66.\n\n-u, --use-path-to-dae-model <fullpath>\n    Use this dae model to represent camera location. *Google Sketch\n    up can create these.*\n\n-r, --reference-spheroid <string (default: WGS_1984)>\n    Use this reference spheroid (datum). \n\n    Options:\n\n    - WGS_1984\n    - D_MOON (1,737,400 meters)\n    - D_MARS (3,396,190 meters)\n    - MOLA (3,396,000 meters)\n    - NAD83\n    - WGS72\n    - NAD27\n    - Earth (alias for WGS_1984)\n    - Mars (alias for D_MARS)\n    - Moon (alias for D_MOON)\n\n-t, --session-type <string>\n    Select the input camera model type. Normally this is auto-detected,\n    but may need to be specified if the input camera model is in\n    XML format. See :numref:`ps_options` for options.\n\n--load-camera-solve\n    Use a specialized display for showing the results of the\n    ``camera_solve`` tool. When using this option, only pass in the\n    path to the ``camera_solve`` output folder as a positional\n    argument. Green lines drawn between the camera positions indicate\n    a successful interest point match between those two images.\n\n--hide-labels\n    Hide image names unless the camera is highlighted.\n\n--bundle-adjust-prefix <string>\n    Use the camera adjustment obtained by previously running\n    bundle_adjust with this output prefix.\n\n--write-csv\n    Write a csv file with the orbital data.\n\n--threads <integer (default: 0)>\n    Select the number of threads to use for each process. If 0, use\n    the value in ~/.vwrc.\n \n--cache-size-mb <integer (default = 1024)>\n    Set the system cache size, in MB.\n\n--tile-size <integer (default: 256 256)>\n    Image tile size used for multi-threaded processing.\n\n--no-bigtiff\n    Tell GDAL to not create BigTiff files.\n\n--tif-compress <None|LZW|Deflate|Packbits (default: LZW)>\n    TIFF compression method.\n\n-v, --version\n    Display the version of software.\n\n-h, --help\n    Display this help message.\n\n"
  },
  {
    "path": "docs/tools/ortho2pinhole.rst",
    "content": ".. _ortho2pinhole:\n\northo2pinhole\n-------------\n\nGiven an orthoimage, a raw image, and a sample pinhole camera model having\ncamera intrinsics, this program computes a new pinhole camera model that best\nreflects how the orthoimage was created from the raw image, so it adds\nthe extrinsic parameters (camera position and orientation) to the model.\n\nExample invocation::\n\n    ortho2pinhole raw_image.jpg ortho_image.tif \\\n      sample_model.tsai output_model.tsai       \\\n      --camera-height 1459.9561                 \\\n      --orthoimage-height 886.5911\n\nThe .tsai pinhole model format is described in :numref:`pinholemodels`.\n\nThe option ``--reference-dem`` can be used to specify a DEM from which\nto extract the ground height, instead of using the value in\n``--orthoimage-height``. \n\nAs a way of verifying the results, the ``mapproject`` program can be used to\nproject the raw image with the produced camera model onto the reference DEM.\nThe resulting image should have a similar position and orientation on the ground\nas the orthoimage.\n\nMore context is given in :numref:`sfmicebridge`.\n\nCommand-line options for ``ortho2pinhole``:\n\n--camera-estimate <string (default: \"\")>\n      An estimated camera model used for location and pose estimate only.\n          \n--max-translation <double (default: 10)>\n      The maximum distance the camera solution is allowed to move from\n      camera-estimate.\n      \n--camera-height <double (default: -1)>\n      The approximate height above the datum, in meters, at which the camera\n      should be. If not specified, it will be read from the orthoimage metadata.\n      \n--orthoimage-height <double (default: 0)>\n      The approximate height above the datum, in meters, at which the orthoimage\n      is positioned. We assume flat ground. See also ``--reference-dem``.\n      \n--reference-dem <string (default: \"\")>\n      If provided, extract from this DEM the heights above the ground rather\n      than assuming the value in ``--orthoimage-height``.\n      \n--ip-per-tile <integer (default: 0)>\n      How many interest points to detect in each 1024^2 image tile (default:\n      automatic determination).\n      \n--ip-detect-method <integer (default: 1)>\n      Interest point detection algorithm (0: Integral OBALoG, 1: OpenCV SIFT\n      (default), 2: OpenCV ORB.  Remove any existing ``.vwip`` files before\n      recomputing interest points with a different method.\n\n--minimum-ip <integer (default: 5)>\n      Don't create a camera model if fewer than this many interest point matches\n      were found.\n      \n--ip-inlier-factor <double (default: 0.2)>\n      Interest points inlier factor.\n      \n--individually-normalize\n      Individually normalize the input images instead of using common values.\n      \n--skip-image-normalization\n      Skip the step of normalizing the values of input images.\n      \n--short-circuit\n      No processing, just copy input intrinsic parameters to camera-estimate and\n      write out.\n      \n--show-error\n      Print point error.\n      \n--keep-match-file\n      Don't delete the .match file after running.\n      \n--write-gcp-file\n      Write a ``bundle_adjust``-compatible GCP file (:numref:`bagcp`).\n      \n--crop-reference-dem\n      Crop the reference DEM to a generous area to make it faster to load.\n\n-v, --version\n    Display the version of software.\n\n-h, --help\n    Display the help message.\n\n.. |times| unicode:: U+00D7 .. MULTIPLICATION SIGN\n"
  },
  {
    "path": "docs/tools/otsu_threshold.rst",
    "content": ".. _otsu_threshold:\n\notsu_threshold\n--------------\n\nThe ``otsu_threshold`` program takes as input a single-channel image\nand computes the optimal `Otsu threshold\n<https://en.wikipedia.org/wiki/Otsu%27s_method>`_. See also \n`this overview <http://www.labbookpages.co.uk/software/imgProc/otsuThreshold.html>`_ \nwith some example images and thresholds plotted vs histograms at the very bottom of that page.\n\nIf the input image is, for example, band 7 of a WorldView multispectral\nimage, this will return a value for the threshold separating land from water\n(since water shows up rather dark in the infrared).\nIf the input is an image of the Moon, with shadows present, the threshold\nwill separate shadowed and lit regions.\n\nNote that the threshold value returned by this tool is not necessarily\nthe position corresponding to the bottom of the \"saddle\" of the\nhistogram of this image, if it is bi-modal (see the figure). To get\nthat behavior, use instead ``bathy_threshold_calc.py``\n(:numref:`bathy_threshold_calc`).\n\n.. figure:: ../images/otsu_threshold.png\n   :name: otsu_threshold_example\n\n   Illustration of the Otsu threshold.\n\nExample::\n\n    otsu_threshold image.tif\n\nIt will produce output as follows::\n\n    Reading image: image.tif\n    No nodata value present in the file.\n    Number of image rows and columns: 7276, 8820\n    Picking a uniform sample of dimensions 7276, 8820\n    Number of bins in the histogram: 256\n    It may take several minutes to find the answer.\n    Otsu threshold for image image.tif: 224.7686274509804\n\nUsage::\n\n    otsu_threshold <options> <images>\n\nCommand-line options for otsu_threshold:\n\n--num-samples <integer (default: -1)>\n    The number of samples to pick from the image (more samples will\n    result in more accuracy but will be slower). If not specified,\n    hence set to -1, the full image will be used.\n\n--num-bins <integer (default: 256)>\n    Number of bins to use for the histogram. A larger value is\n    suggested if the image has some outlying pixel values.\n\n--nodata-value <double>\n    Use this nodata value instead of what is read from the file, if\n    present.\n\n--threads <integer (default: 0)>\n    Select the number of threads to use for each process. If 0, use\n    the value in ~/.vwrc.\n \n--cache-size-mb <integer (default = 1024)>\n    Set the system cache size, in MB.\n\n--tile-size <integer (default: 256 256)>\n    Image tile size used for multi-threaded processing.\n\n--no-bigtiff\n    Tell GDAL to not create BigTiff files.\n\n--tif-compress <None|LZW|Deflate|Packbits (default: LZW)>\n    TIFF compression method.\n\n-v, --version\n    Display the version of software.\n\n-h, --help\n    Display this help message.\n"
  },
  {
    "path": "docs/tools/pansharp.rst",
    "content": ".. _pansharp:\n\npansharp\n--------\n\nThis tool reads in a high resolution grayscale file and a low resolution\nRGB file and produces a high resolution RGB file. The output image will\nbe at the resolution of the grayscale image and will cover the region\nwhere the two images overlap. Both images must have georeferencing\ninformation. This can either be projection information in the image\nmetadata or it can be a separate Worldview format XML camera file\ncontaining four ground control points (if using the tool with Digital\nGlobe images).\n\nUsage::\n\n    pansharp [options] <grayscale image file> <color image file> <output image file>\n\nCommand-line options for pansharp:\n\n--min-value\n    Manually specify the bottom of the input data range.\n\n--max-value\n    Manually specify the top of the input data range.\n\n--gray-xml\n    Look for georeference data here if not present in the grayscale image.\n\n--color-xml\n    Look for georeference data here if not present in the RGB image.\n\n--nodata-value\n    The nodata value to use for the output RGB file.\n\n--threads <integer (default: 0)>\n    Select the number of threads to use for each process. If 0, use\n    the value in ~/.vwrc.\n \n--cache-size-mb <integer (default = 1024)>\n    Set the system cache size, in MB.\n\n--tile-size <integer (default: 256 256)>\n    Image tile size used for multi-threaded processing.\n\n--no-bigtiff\n    Tell GDAL to not create BigTiff files.\n\n--tif-compress <None|LZW|Deflate|Packbits (default: LZW)>\n    TIFF compression method.\n\n-v, --version\n    Display the version of software.\n\n-h, --help\n    Display this help message.\n"
  },
  {
    "path": "docs/tools/parallel_bundle_adjust.rst",
    "content": ".. _parallel_bundle_adjust:\n\nparallel_bundle_adjust\n----------------------\n\nThe ``parallel_bundle_adjust`` program is a modification of\n``bundle_adjust`` (:numref:`bundle_adjust`) designed to distribute\nsome of the preprocessing steps over multiple processes and multiple\ncomputing nodes. It uses GNU Parallel to manage the jobs in the same\nmanner as ``parallel_stereo`` (:numref:`parallel_stereo`).\n\nAn example is in :numref:`skysat_bundle_adjustment`.\n\nSetting up the nodes list is discussed in :numref:`pbs_slurm`.\n\nProcessing steps\n~~~~~~~~~~~~~~~~\n\nThe ``parallel_bundle_adjust`` tool has three processing steps: 0: statistics\ncomputation, 1: interest point matching, 2: optimization.\n\nSteps 0 and 1 produce the ``*-stats.tif`` and ``*.match`` files.\n\nOnly the first two steps can be done in parallel. In the last step,\n``bundle_adjust`` is invoked as a single process, with the data produced so far. \n\nUse of results\n~~~~~~~~~~~~~~\n\nThe files created by ``parallel_bundle_adjust`` can be used by later \ninvocations of ``bundle_adjust`` or with ``parallel_stereo`` with the \noptions ``--match-files-prefix`` and ``--clean-match-files-prefix``\n(:numref:`ba_options`).\n\nIf ``bundle_adjust`` is called with the same output prefix as\n``parallel_bundle_adjust``, and without the options above, it will try to see if\nsome match files are missing and need to be created. To avoid that, use the\noptions ``--force-reuse-match-files`` and ``--skip-matching``.\n\nParallelization\n~~~~~~~~~~~~~~~\n\nThe default number of processes per node is 1/4 of the number of cores on the\nhead node, and the default number of threads per process is the number of cores\non the head node over the number of processes.\n\nThe number of launched jobs over all nodes is number of nodes times number of\nprocesses per node.\n\nCommand-line options\n~~~~~~~~~~~~~~~~~~~~\n\nThese options are in addition to the ones for ``bundle_adjust``\n(:numref:`ba_options`).\n\n--nodes-list <filename>\n    The list of computing nodes, one per line. If not provided, run\n    on the local machine.\n\n-e, --entry-point <integer (default: 0)>\n    Bundle adjustment entry point (start at this stage).\n    Options: statistics and interest points per image = 0, \n    interest point matching = 1, optimization = 2.\n\n--stop-point <integer(default: 3)>\n    Bundle adjustment stop point (stop *before* this stage).\n    Options: statistics = 0, matching = 1, optimization = 2, \n    all = 3.\n\n--parallel-options <string (default: \"--sshdelay 0.2\")>\n    Options to pass directly to GNU Parallel.\n\n--verbose\n    Display the commands being executed.\n\n--processes <integer>\n    The number of processes per node. The default is a quarter of the number of\n    cores on the head node.\n\n--threads <integer>\n    The number of threads per process. The default is the number of cores on the\n    head node over the number of processes.\n\n--cache-size-mb <integer (default = 1024)>\n    Set the system cache size, in MB, for each process.\n\n-v, --version\n    Display the version of software.\n\n-h, --help\n    Display the help message.\n"
  },
  {
    "path": "docs/tools/parallel_sfs.rst",
    "content": ".. _parallel_sfs:\n\nparallel_sfs\n------------\n\nThe program ``parallel_sfs`` is a wrapper around ``sfs``\n(:numref:`sfs`) meant to divide the input DEM into tiles with overlap,\nrun ``sfs`` on each tile as multiple processes, potentially on\nmultiple machines, and then merge the results into a single output\nDEM. It has the same options as ``sfs``, and a few additional ones, as\noutlined below.\n\nAn example for how to invoke this program is in :numref:`parallel_sfs_usage`.\nSee :numref:`sfs_usage` for the larger context.\n\nIf having many computing nodes, the option ``--nodes-list`` must be set, to\nensure all nodes are used. \n\nUsage::\n\n    parallel_sfs -i <input DEM> -n <max iterations> -o <output prefix> \\\n      <images> [other options]\n\nCommand-line options for ``parallel_sfs``:\n\n--tile-size <integer (default: 300)>\n    Size of approximately square tiles to break up processing into\n    (not counting the padding).\n\n--padding <integer (default: 50)>\n    How much to expand a tile in each direction. This helps with\n    reducing artifacts in the final mosaicked SfS output.\n\n--processes <integer>\n    Number of processes to use on each node (the default is for the\n    program to choose).\n\n--num-processes <integer>\n    Same as ``--processes``. Used for backwards compatibility.\n\n--nodes-list <filename>\n    A file containing the list of computing nodes, one per line.\n    If not provided, run on the local machine. See also\n    :numref:`pbs_slurm`.\n\n--threads <integer (default: 8)>\n    How many threads each process should use. This will be changed to \n    1 for ISIS cameras when ``--use-approx-camera-models`` is not set \n    (:numref:`sfs`), as ISIS is single-threaded. Not all parts of the\n    computation benefit from parallelization.\n\n--parallel-options <string (default: \"--sshdelay 0.2\")>\n    Options to pass directly to GNU Parallel.\n\n--resume\n    Resume a partially done run. Only process the tiles for which the\n    desired per-tile output files are missing or invalid (as checked\n    by ``gdalinfo``).\n\n--suppress-output\n    Suppress output of sub-calls.\n\n-v, --version\n    Display the version of software.\n\n-h, --help\n    Display the help message.\n"
  },
  {
    "path": "docs/tools/parallel_stereo.rst",
    "content": ".. _parallel_stereo:\n\nparallel_stereo\n---------------\n\nThe ``parallel_stereo`` program is the primary tool of the Ames Stereo\nPipeline.  It takes a stereo pair of images that overlap with\ncorresponding cameras and creates an output point cloud image that can\nbe processed into a visualizable mesh or a DEM using :ref:`point2mesh`\nand :ref:`point2dem` respectively.\n\nThis program can distribute the stereo processing over multiple\ncomputing nodes if invoked with the ``--nodes-list`` option. It uses\nGNU Parallel to manage the jobs, a program that is shipped with the\nStereo Pipeline. It expects that all nodes can connect to each other\nusing ssh without password and that they share the same storage space.\n\nUsage::\n\n    parallel_stereo [options] <images> [<cameras>] <output_prefix>\n\nSee :numref:`tutorial` for more details. Many examples of this\nprogram are in :numref:`examples`.\n\nSee :numref:`pbs_slurm` for how to set up this tool for PBS and SLURM systems.\n\nThis program operates only on single channel (grayscale)\nimages. Multi-channel images need to first be converted to grayscale\nor a single channel should be extracted with ``gdal_translate`` \nwith the ``-b`` option.\n\nProcesses and threads\n~~~~~~~~~~~~~~~~~~~~~\n\nIt is suggested that after this program is started, one examine how\nwell it uses the CPUs and memory on all nodes, especially at the\ncorrelation stage (:numref:`entrypoints`). \n\nOne may want to set the ``--processes``, ``--threads-multiprocess``, and\n``--threads-singleprocess`` options (:numref:`ps_options`), and also\n``--corr-memory-limit-mb`` (:numref:`stereodefault`). \n\nMake sure that ``--nodes-list`` is set, otherwise only the head node\nwill be used.\n\nNote that the SGM and MGM algorithms can be quite memory-intensive. For these,\nby default, the number of threads is set to 8, and the number of processes is\nthe number of cores divided by the number of threads, on each node. Otherwise,\nthe default is to use as many processes as there are cores.\n\nMultiple machines\n~~~~~~~~~~~~~~~~~\n\nThis program has several stages, described in :numref:`entrypoints`.\n\nWhen the option ``--nodes-list`` is set, only the correlation, blending,\nsubpixel refinement, and triangulation stages of ``parallel_stereo`` are spread\nover multiple machines, with the preprocessing and filtering stages using just\none node, as they require global knowledge of the data. In addition, not all\nstages of stereo benefit equally from parallelization. Most likely to gain are\nstages 1 and 3 (correlation and refinement) which are the most computationally\nexpensive.\n\n\nOutput files\n~~~~~~~~~~~~\n\nThis tool will create a set of output files (:numref:`outputfiles`). Internally\nsome of them will be GDAL VRT files, that is, plain text virtual mosaics of\nfiles created by individual processes, with the actual files in subdirectories.\nASP and GDAL tools are able to use these virtual files in the same way as\nregular binary TIF files. \n\nThe files in subdirectories are combined into a single file at the end of the\nrun, and the subdirectories are deleted (option ``--keep-only``).\n\n.. _ps_tiling:\n\nTiling\n~~~~~~\n\nThe input images are divided into tiles, that are processed in parallel. For\nmany algorithms, each tile is padded. Then, the produced disparities overlap and\nare blended.\n\nThe size of the tiles can be set with the ``--job-size-w`` and ``--job-size-h``\noptions. The default is 2048 x 2048 pixels, unless local alignment\n(:numref:`stereo_alg_overview`) is used, in which case it is 512 x 512 pixels\n(local alignment works better with smaller tiles).\n\nThe size of the padding is set with ``--sgm-collar-size``. The default is 0\nfor the ``asp_bm`` algorithm, 256 for ``asp_sgm``/``asp_mgm``, and 128 \nwith local alignment.\n\nThe padding can be increased if artifacts at tile boundary are noticed.\n\nResuming a run\n~~~~~~~~~~~~~~\n\nAll the intermediate results produced by ``parallel_stereo``, up to but not\nincluding triangulation, can be reused if only the cameras or camera adjustments\nchange (for example, if the cameras got moved, per :numref:`ba_pc_align`). \n\nAn example is given in :numref:`mapproj_reuse`. Another one is in\n:numref:`bathy_reuse_run` (in the context of stereo with shallow water).\n\nIf the program failed during correlation, such as because of\ninsufficient memory, it can be told to resume without recomputing the\nexisting good partial results with the option ``--resume-at-corr``.\n\nOutput files\n~~~~~~~~~~~~\n\nThe output files created by this program are described in :numref:`outputfiles`.\n\n.. _entrypoints:\n\nProcessing stages\n~~~~~~~~~~~~~~~~~\n\nThe ``parallel_stereo`` tool is written in Python, and invokes separate C++\nexecutables for various steps in processing. \n\nThese C++ executables have their own command-line options\n(:numref:`stereodefault`). Those options can be passed to ``parallel_stereo``\nwhich will in turn pass them on as needed. By invoking each executable with no\noptions, it will display the list of options it accepts.\n\nThe steps run by ``parallel_stereo`` are as follows. The ``--entry-point`` and\n``--stop-point`` options can be used to run only a portion of these steps. The\nprogram will stop *before* the stage indicated by ``--stop-point``. \n\nStep 0 (Preprocessing)\n    Runs ``stereo_pprc``. Normalizes the two images and aligns them by\n    locating interest points and matching them in both images. The\n    program is designed to reject outlier interest points. This stage\n    writes out the pre-aligned images and the image masks. It also \n    computes the convergence angle for this stereo pair (for\n    non-mapprojected images and with alignment method ``homography``,\n    ``affineepipolar``, or ``local_epipolar``).\n\nStep 1 (Stereo correlation)\n    Runs ``stereo_corr``. Performs correlation using various\n    algorithms which can be specified via ``--stereo-algorithm``.\n    It writes a disparity map ending in ``D.tif``.\n\nStep 2 (Blend)\n    Runs ``stereo_blend``. Blend the borders of adjacent disparity map\n    tiles obtained during stereo correlation. Needed for all stereo\n    algorithms except the classical ``ASP_BM`` when run without local\n    epipolar alignment. The result is the file ending in ``B.tif``.\n\nStep 3 (Sub-pixel refinement)\n    Runs ``stereo_rfne``. Performs sub-pixel correlation that refines\n    the disparity map. Note that all stereo algorithms except\n    ``ASP_BM`` already do their own refinement at step 1, however\n    further refinement can happen at this step if the\n    ``--subpixel-mode`` option is set. This produces a file ending in\n    ``RD.tif``.\n\nStep 4 (Outlier rejection)\n    Runs ``stereo_fltr``. Performs filtering of the disparity map and\n    (optionally) fills in holes using an inpainting algorithm. It creates\n    ``F.tif``. Also computes ``GoodPixelMap.tif``.\n\nStep 5 (Triangulation)\n    Runs ``stereo_tri``. Generates a 3D triangulated point cloud from\n    the disparity map by intersecting rays traced from the cameras.\n    The output filename ends in ``PC.tif``.\n    \nStep 6 (Cleanup)\n    If the run was successful, the data from run subdirectories are combined\n    and the subdirectories are removed. See ``--keep-only``.\n\nThis is followed usually by DEM creation with :ref:`point2dem`, which is not\npart of this program.\n\n.. _ps_options:\n\nCommand-line options\n~~~~~~~~~~~~~~~~~~~~\n\n--nodes-list <filename>\n    The list of computing nodes, one per line. If not provided, run\n    on the local machine. Alternatively, specify the full ssh command\n    for each node, including the port, so one command per line.\n    See examples for PBS and SLURM in :numref:`pbs_slurm`.\n\n-t, --session-type <string>\n    Select the stereo session type to use for processing. Usually the\n    program can select this automatically by the file extension except\n    for xml cameras (if it has both DG and RPC models). Options and when to use:\n    \n    - nadirpinhole -- for satellites/aircraft with pinhole cameras\n      (:numref:`skysat`, :numref:`sfmicebridge`). This equivalent to using\n      ``pinhole`` and setting ``--datum``. The datum will be auto-guessed with\n      ``nadirpinhole`` based on the camera center coordinates, if not set (only\n      for Earth, Moon, and Mars).\n    - pinhole      -- ground-level cameras, not assuming a datum\n      (:numref:`mer-example`). A datum can be set, however, with ``--datum``.\n    - isis         -- with planetary images stored in .cub files (:numref:`moc_tutorial`)\n    - dg           -- with Maxar / DigitalGlobe exact linescan cameras (:numref:`dg_tutorial`), which are implemented as CSM (:numref:`dg_csm`)\n    - rpc          -- with any RPC cameras (:numref:`rpc`)\n    - spot5        -- SPOT 5 exact linescan camera (:numref:`spot5`)\n    - spot         -- SPOT 6/7 exact linescan camera (:numref:`spot67`)\n    - aster        -- exact ASTER camera model (:numref:`aster`)\n    - perusat      -- PeruSat-1 exact linescan camera model (:numref:`perusat1`)\n    - opticalbar   -- Optical Bar cameras (:numref:`kh4`)\n    - csm          -- Community Sensor Model (:numref:`csm`)\n    - pleiades     -- Pleiades satellites (:numref:`pleiades`)\n\n    The next sessions are for mapprojected images\n    (:numref:`mapproj-example`). If ``-t`` is specified\n    as earlier, the sessions will be converted to the entities below\n    automatically.\n\n    - pinholemappinhole\n    - isismapisis\n    - dgmaprpc / dgmapdg\n    - rpcmaprpc\n    - spot5maprpc\n    - spotmapspot\n    - astermapaster / astermaprpc\n    - opticalbarmapopticalbar\n    - csmmapcsm / csmmaprpc\n    - pleiadesmappleiades\n\n-e, --entry-point <integer (default: 0)>\n    Stereo Pipeline entry point. Start at this stage. See :numref:`entrypoints`.\n\n--stop-point <integer (default: 7)>\n    Stereo Pipeline stop point (stop at the stage *right before* this).\n\n--corr-seed-mode <integer (from 0 to 3)>\n    Correlation seed strategy (:numref:`corr_section`).\n\n--sparse-disp-options <string (default: \"\")>\n    Options to pass directly to sparse_disp\n    (:numref:`sparse_disp`). Use quotes around this string.\n\n--job-size-w <integer (default: auto)>\n    Pixel width of input image tile for a single process. See\n    :numref:`ps_tiling`.\n\n--job-size-h <integer (default: auto)>\n    Pixel height of input image tile for a single process. See\n    :numref:`ps_tiling`.\n\n--sgm-collar-size <integer (default: auto)>\n    The padding around each tile to process. See :numref:`ps_tiling`.\n    \n--processes <integer>\n    The number of processes to use per node.\n\n--threads-multiprocess <integer>\n    The number of threads to use per process when running multiple\n    processes, for the correlation, subpixel refinement, and triangulation steps\n    (:numref:`entrypoints`).\n\n--threads-singleprocess <integer>\n    The number of threads to use when running a single process (for\n    the pre-processing and filtering steps, :numref:`entrypoints`).\n\n--resume-at-corr\n   Start at the correlation stage and skip recomputing the valid low\n   and full-res disparities for that stage. Do not change\n   ``--left-image-crop-win``, etc, when running this.\n\n--prev-run-prefix\n    Start at the triangulation stage while reusing the data from this \n    prefix. The new run can use different cameras, bundle adjustment\n    prefix, or bathy planes (if applicable). Do not change crop\n    windows, as that would invalidate the run. See\n    :numref:`bathy_reuse_run` for an example.\n\n--keep-only <string (default: \"all_combined\")>\n    If set to ``all_combined``, which is the default, at the end of a successful\n    run combine the results from subdirectories into ``.tif`` files with the\n    given output prefix, and delete the subdirectories. If set to ``essential``,\n    keep only ``PC.tif`` and the files needed to recreate it (those ending with\n    ``L.txt``, ``R.txt``, ``.exr``, ``-L.tif``, ``-F.tif``). If set to\n    ``unchanged``, keep the run directory as it is. For fine-grained control,\n    specify a quoted list of suffixes of files to keep, such as \n    ``\"L.txt R.txt .exr .match -L.tif -PC.tif\"``.\n                                      \n--verbose\n    Display the commands being executed.\n\n--dry-run\n    Do not launch the jobs, only print the commands that should be\n    run.\n\n--ssh <filename>\n    Specify the path to an alternate version of the ssh tool to use.\n\n--parallel-options <string (default: \"--sshdelay 0.2\")>\n    Options to pass directly to GNU Parallel.\n\n--cache-size-mb <integer (default = 1024)>\n    Set the system cache size, in MB.\n\n--tile-size <integer (default: 256 256)>\n    Image tile size used for multi-threaded processing.\n\n--no-bigtiff\n    Tell GDAL to not create BigTiff files.\n\n--tif-compress <None|LZW|Deflate|Packbits (default: LZW)>\n    TIFF compression method.\n\n-v, --version\n    Display the version of software.\n\n-h, --help\n    Display this help message.\n"
  },
  {
    "path": "docs/tools/parse_match_file.rst",
    "content": ".. _parse_match_file:\n\nparse_match_file.py\n-------------------\n\nThis tool reads an ASP match file in binary format as written by ``ipmatch``\n(:numref:`ipmatch`), ``bundle_adjust`` (:numref:`bundle_adjust`), or ``stereo``\n(:numref:`outputfiles`), and writes it as a text file, with each line having an\ninterest point and other associated information. \n\nThe program can be invoked in reverse, to create a binary match file from a text\nfile. Such a match file can be viewed (:numref:`stereo_gui_view_ip`) and edited\n(:numref:`stereo_gui_edit_ip`) in ``stereo_gui``.\n\nIt is assumed that the version of Python in the path has the ``numpy`` and\n``argparse`` packages installed, and that ``parse_match_file.py`` is in the\npath.\n\nExamples\n~~~~~~~~\n\n::\n\n     python $(which parse_match_file.py) run/run-left__right.match \\\n       run/run-matches.txt\n\nThe reverse of this operation can be performed as::\n\n     python $(which parse_match_file.py) -rev run/run-matches.txt \\\n       run/run-left__right.match\n\nOther functionality which may be used to understand interest points is\nthe option ``--save-cnet-as-csv`` in ``bundle_adjust`` which saves the\ninterest point matches in the plain text format used by ground control\npoints (GCP). \n\n.. _parse_match_format:\n\nFile format\n~~~~~~~~~~~\n\nThe first line in the file has the number of matches in the left and right\nimages. These are always the same.\n\nAfter this, the first half of the text file saved by this program has interest\npoints for the left image, and the second half has corresponding points in the\nright image.\n\nEach such line has the following fields, separated by spaces::\n\n  x y ix iy orientation scale interest polarity octave scale_lv num_descr [descriptors]\n\nHere are is an example of the first two lines of such a file::\n\n  25 25\n  2995.8699 636.7928 2996 637 -2.0879858 2.9508026 0.09294365 0 0 0 0\n\nIn this case there will be a total of 25 + 25 = 50 lines having interest points,\nafter the first line, with each in the format of the second line.\n\nThe only important values are the first two, which are the x and y coordinates\nof each interest point pixel, and the scale, which is treated as the uncertainty\nof the pixel in bundle adjustment (higher scale means less weight given during\noptimization). A larger value of the ``interest`` field means it may be more\nprominent (salient), though this is not employed in any way.\n\nAs of of build 2026/02 (:numref:`release`), ASP supports operating on matches in\ntext format. That uses however a simpler format (:numref:`txt_match`).\n\nDescriptors\n~~~~~~~~~~~\n\nIf this program is invoked with the ``--save-descriptors`` option, the interest\npoint descriptors are also saved in the text file. Otherwise their number is set\nto zero, and no descriptors are saved.\n\nNote that in either case the descriptors are not saved for the reverse\noperation, when converting from the text file back to the binary file. In\npractice that is not important, as descriptors are needed only when the interest\npoints are matched during creation, and not for later use.\n\nCommand-line options\n~~~~~~~~~~~~~~~~~~~~\n\n-rev, --reverse\n    Convert a text file having matches into an ASP binary match file.\n\n--save-descriptors\n    When converting a binary match file to text, save the interest point\n    descriptors as well.\n\n-h, --help\n    Display the help message.\n\n"
  },
  {
    "path": "docs/tools/pc_align.rst",
    "content": ".. _pc_align:\n\npc_align\n--------\n\nThe ``pc_align`` programs aligns two point clouds. The supported algorithms are\nIterative Closest Point (:numref:`pc_icp`), Nuth and Kaab (:numref:`nuth`), Fast\nGlobal Registration (:numref:`fgr`), and feature-based alignment\n(:numref:`pc_hillshade`).\n\nSome of the provided ICP implementations can handle a scale change, in addition\nto rotations and translations. \n\nUsage::\n\n     pc_align --max-displacement <float> [other options]    \\\n       <reference cloud> <source cloud> -o <output prefix>}\n\nThe denser cloud must be the first one to be passed to this tool. This\nprogram is very sensitive to the value of ``--max-displacement``\n(:numref:`pc_align_max_displacement`).\n\nAn example is in :numref:`pc-align-example`. Validation and error metrics are\ndiscussed in :numref:`pc_align_validation` and :numref:`pc_align_error`.\n\nSee the related program ``image_align`` (:numref:`image_align`).\n\nSeveral important things need to be kept in mind if ``pc_align`` is to\nbe used successfully and give accurate results, as described below.\n\nThe input point clouds\n~~~~~~~~~~~~~~~~~~~~~~\n\nDue to the nature of ICP, the first input point cloud, that is, the\nreference (fixed) cloud, should be denser than the second, source\n(movable) point cloud, to get the most accurate results. This is not a\nserious restriction, as one can perform the alignment this way and then\nsimply invert the obtained transform if desired (``pc_align`` outputs\nboth the direct and inverse transform, and can output the reference\npoint cloud transformed to match the source and vice-versa).\n\nThe user can choose how many points to pick from the reference and\nsource point clouds to perform the alignment. The amount of memory and\nprocessing time used by ``pc_align`` is directly proportional to these\nnumbers, ideally the more points the better. Pre-cropping to judiciously\nchosen regions may improve the accuracy and/or run-time.\n\n.. _pc_align_max_displacement:\n\nThe max displacement option\n~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nIn many typical applications, the source and reference point clouds are\nalready roughly aligned, but the source point cloud may cover a larger\narea than the reference. The user should provide to ``pc_align`` the\nexpected maximum distance (displacement) source points may move by as\nresult of alignment, using the option ``--max-displacement``. \n\nThis number will help remove source points too far from the reference point\ncloud which may not match successfully and may degrade the accuracy. If\nin doubt, this value can be set to something large but still reasonable,\nas the tool is able to throw away a certain number of unmatched\noutliers. \n\nAt the end of alignment, ``pc_align`` will display the\n*observed* maximum displacement, a multiple of which can be used to seed\nthe tool in a subsequent run. If an initial transform is applied to the\nsource cloud (:numref:`prevtrans`), the outliers are thrown\nout *after* this operation. The observed maximum displacement is also\nbetween the source points with this transform applied and the source\npoints after alignment to the reference.\n\nThe :ref:`geodiff` program can find the vertical difference between two DEMs or\na DEM and a CSV file. Likely a multiple of the standard deviation of this\ndifference (for example, a factor of 5-10) can be a good value for\n``--max-displacement``, assuming that there is no large horizontal misalignment.\n\nIf a large horizontal misalignment exists, consider using feature-based\nalignment first (:numref:`pc_hillshade`).\n\n.. _align-method:\n\nAlignment method\n~~~~~~~~~~~~~~~~\n\nThe alignment method can be set with the option ``--alignment-method``\n(:numref:`pc_align_options`). The default is ``point-to-plane`` ICP.\n\n.. _pc_icp:\n\nICP algorithms\n^^^^^^^^^^^^^^\n\nASP provides several flavors of the Iterative Closest Point (ICP) algorithm,\nwith the implementation given by the `libpointmatcher\n<https://github.com/ethz-asl/libpointmatcher>`_ library\n(:cite:`Pomerleau12comp`).\n    \nThe default alignment method is Point-to-Plane ICP, which may be more\nrobust to large translations than Point-to-Point ICP, though the latter\ncan be good enough if the input point clouds have small alignment errors\nand it is faster and uses less memory as well. The tool also accepts an\noption named ``--highest-accuracy`` which will compute the normals for\nPoint-to-Plane ICP at all points rather than about a tenth of them. This\noption is not necessary most of the time, but may result in better\nalignment at the expense of using more memory and processing time.\n\nThe default alignment transform is rigid, that is, a combination of rotation and\ntranslation. It is also possible to solve for a scale change, by setting\n``--alignment-method`` to ``similarity-point-to-plane`` or\n``similarity-point-to-point``. The first of these works better than the second\none.\n\nIf the translation between the point clouds is very large, see\n:numref:`pc_hillshade`.\n\n.. _nuth:\n\nNuth and Kaab\n^^^^^^^^^^^^^\n\nThe Nuth and Kaab alignment method (:cite:`nuth2011co`) can be sub-grid-size\naccurate. It is accessible with ``--alignment-method nuth``. The implementation\nis based on `dem_align.py  <https://github.com/dshean/demcoreg>`_.\n\nIt is assumed that:\n\n  - The input clouds are dense and detailed DEMs with notable relief\n  - The DEMs have a lot of overlap\n  - The alignment transform is a pure translation in projected coordinates (both\n    horizontal and vertical).\n\nIf the last two assumptions do not hold, consider using a different alignment\nalgorithm first (for example, feature-based alignment in combination with ICP,\n:numref:`pc_hillshade`). The resulting aligned source point cloud needs to be\nregridded with ``point2dem``, and then the alignment further refined with this\nmethod.\n\nThe order of inputs should be so that the reference DEM (the first input)\nhas a grid size that is no bigger than of the second DEM. The second DEM\nwill be interpolated to the grid of the first one.\n\nBoth DEMs should be in projected coordinates, so with the grid size measured in\nmeters, and with the same datum. Otherwise, regridding can be done with\n``gdalwarp -r cubic`` (:numref:`gdal_tools`). LAS files can be regridded with\n``point2dem`` (:numref:`point2dem`).\n\nThe produced alignment transform will be converted to a rotation + translation\ntransform around the planet center (ECEF coordinates), for consistency with the\nother alignment methods. It will be an ECEF translation if the option\n``--compute-translation-only`` is set.\n\nThe DEMs should fit fully in memory, with a solid margin. \n\nLarge DEMs with good relief could be regridded (with cubic interpolation) to a\n2x coarser grid, which would still result in a good alignment. That goes as\nfollows, for any input DEM::\n\n  gdal_translate -r average -outsize 50% 50% input.tif output.tif\n\nAny produced transform with lower-resolution DEMs can be applied to the original\nDEMs (:numref:`prevtrans`).\n\nAdditional options can be passed in via ``--nuth-options``\n(:numref:`nuth_options`).\n\nThis alignment method does not support the ``--initial-transform`` option,\nbecause it computes the alignment transform in projected coordinates of the\nreference DEM, and in that space an external ECEF transform cannot be applied\nexactly.\n\n.. _fgr:\n\nFGR algorithm\n^^^^^^^^^^^^^\n\nThe `Fast Global Registration\n<https://github.com/IntelVCL/FastGlobalRegistration>`_ (FGR) algorithm can be\ncalled with ``--alignment-method fgr``, and is customizable via\n``--fgr-options`` (:numref:`pc_align_options`).\n\nThis approach can perform better than ICP when the clouds are close enough to\neach other but there is a large number of outliers, since it does a cross-check.\n\nWhen the clouds are far, another algorithm can be employed to bring them \ncloser first (:numref:`prevtrans`).\n\n.. _pc_hillshade:\n\nFeature-based alignment\n^^^^^^^^^^^^^^^^^^^^^^^\n\nIf the clouds differ by a large translation or scale factor, alignment can fail.\nIf the clouds are DEMs, one may specify the option\n``--initial-transform-from-hillshading`` which will hillshade the two\nDEMs, find interest point matches between them, and use that to compute an initial\ntransform between the clouds, which may or may not contain scale.\n\nThis transform can be passed as an initial guess to the other alignment\nalgorithms (:numref:`prevtrans`). See an example in :numref:`kh4_align`. \n\nThe related correlation-based alignment method is described in\n:numref:`pc_corr`.\n\nIn the latest ASP (10/2025 and later), hillshading is done with ``gdaldem\nhillshade`` (:numref:`gdal_hill`). ASP's own ``hillshade`` program\n(:numref:`hillshade`) is also supported. See the option ``--hillshade-command``\nin :numref:`pc_align_options`. \n\nInspect the produced hillshaded images and, if needed, change the hillshade\ncommand or its options to get visually good results. \n\nThe interest point finding and matching are performed with ASP's ``ipfind``\n(:numref:`ipfind`) and ``ipmatch`` (:numref:`ipmatch`) programs. These can be\ncustomized with ``--ipfind-options`` and ``--ipmatch-options``. For example,\none can increase the number of interest points being found or the detection method.\n\nThe option ``--initial-transform-ransac-params`` controls the outlier removal.\n\nSee :numref:`pc_align_options` for details about these options.\n\nThe match file having the correspondences between the two hillshaded DEMs is\nsaved in the output directory and can be inspected\n(:numref:`stereo_gui_view_ip`). It can also be created or edited manually\n(:numref:`manual-align`).\n\nIf the two clouds look too different for interest point matching to work, or\nthey are not DEMs to start with, they can be gridded to use the same\n(usually coarser) grid, as described in :numref:`regrid`. The clouds can be cropped to\na shared area as well. The produced transform will be applicable to the original\nclouds (a translation transform may be more reliable if cropping happens).\n\n.. _pc_corr:\n\nCorrelation-based alignment\n^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nGiven two DEMs with the same grid size that look visually similar when\nhillshaded, the dense image correlation can be found between the hillshaded\nimages, and that can be employed to align the clouds.\n\nFor that, first produce the hillshades, either with ``gdaldem hillshade``\n(:numref:`gdal_hill`) or with the ASP ``hillshade`` program\n(:numref:`hillshade`). Call these outputs ``ref_hill.tif`` and ``src_hill.tif``.\n\nConsider increasing the hillshaded image contrast and range of intensities with\n``hillshade`` by decreasing the ``--elevation`` option value. \n\nCarefully inspect the produced hillshaded images. Washed out and textureless\nregions are likely not going to work well.\n\nImage correlation is performed (:numref:`correlator-mode`) on hillshaded\nimages::\n\n    parallel_stereo --correlator-mode    \\\n      --ip-per-image 40000               \\\n      --stereo-algorithm asp_mgm         \\\n      --subpixel-mode 9                  \\\n      ref_hill.tif src_hill.tif          \\\n      --num-matches-from-disparity 40000 \\\n      run_corr/run\n\nStereo correlation can take a long time. It can be run over several nodes\n(:numref:`pbs_slurm`). The option ``--max-disp-spread`` can help with reducing\nthe search range (:numref:`corr_section`). A value like 50 is likely adequate. \n\nIncreasing the correlation kernel size, such as ``--corr-kernel 9 9`` (from the\ndefault of ``5 5`` for the ``aspm_mgm`` algorithm) may help with noisy DEMs.\nAlso running this for lower-resolution versions of the input DEMs.\n\nASP supports many stereo correlation algorithms (:numref:`stereo_alg_overview`).\n\nThis produces a dense match file (:numref:`dense_ip`) that should be inspected\n(:numref:`stereo_gui_view_ip`), and then passed to ``pc_align``::\n\n    matchFile=run_corr/run-disp-ref_hill__src_hill.match\n    pc_align                                           \\\n      --max-displacement -1                            \\\n      --num-iterations 0                               \\\n      --max-num-reference-points 1000000               \\\n      --match-file $matchFile                          \\\n      --initial-transform-from-hillshading rigid       \\\n      --initial-transform-ransac-params 1000 3         \\\n      --save-transformed-source-points                 \\\n      ref.tif src.tif                                  \\\n      -o run_align/run\n\nOne has to consider carefully if the transform to be solved for should be rigid\n(rotation + translation) or a translation only. Inspecting the bands of the\ndisparity map ``run_corr/run-F.tif`` can help with that\n(:numref:`mask_disparity`).\n\nThe resulting aligned cloud ``run_align/run-trans_source.tif`` can be regridded\nwith ``point2dem`` and same grid size and projection as the input DEMs, and\nevaluate if it moved as expected. \n\nThis method will fail if the input DEMs do not overlap a lot when overlaid with\ngeoreference information. If the usable overlap is small, consider running this\non cropped versions of the DEMs first, then applying the resulting transform to\nthe full datasets (:numref:`prevtrans`). In that case, a translation-only\ntransform will be more robust than one with rotation or scale.\n\nThe related method in :numref:`pc_hillshade` uses sparse features from\nhillshading, and can handle a large translation between the clouds.\n\n.. _pc_least_squares:\n\nLeast squares\n^^^^^^^^^^^^^\n\nAnother option is to use least squares (with outlier handling using a\nrobust cost function) to find the transform, if the reference cloud is a\nDEM. This is an *experimental mode* that is *not recommended*.\n\nFor this, one should specify the alignment method as ``least-squares`` or\n``similarity-least-squares`` (the latter also solves for scale). It is suggested\nthat the input clouds be very close or otherwise the ``--initial-transform``\noption be used, for the method to converge, and use perhaps on the order of\n10-20 iterations and a smaller value for ``--max-num-source-points`` (perhaps a\nfew thousand) for this approach to converge reasonably fast.\n\nFile formats\n~~~~~~~~~~~~\n\nThe input point clouds can be in one of several formats: ASP's point cloud\nformat (the output of ``parallel_stereo``, :numref:`outputfiles`), DEMs as\nGeoTIFF or ISIS cub files, LAS files (including LAZ and COPC), or plain-text CSV\nfiles (with .csv or .txt extension).\n\nCSV\n^^^\n\nBy default, CSV files are expected to have on each line the latitude and\nlongitude (in degrees), and the height above the datum (in meters), separated by\ncommas or spaces. Alternatively, the user can specify the format of the CSV file\nvia the ``--csv-format`` option. Entries in the CSV file can then be (in any\norder) (a) longitude, latitude (in degrees), height above datum (in meters), (b)\nlongitude, latitude, distance from planet center (in meters or km), (c) easting,\nnorthing and height above datum (in meters), in this case a PROJ or WKT string\nmust be set via ``--csv-srs``, (d) Cartesian coordinates :math:`(x, y, z)`\nmeasured from planet center (in meters). The precise syntax is in\n:numref:`pc_align_options`. The tool can also auto-detect the LOLA RDR\nPointPerRow format.\n\nAny line in a CSV file starting with the pound character (#) is ignored.\n\nIf none of the input files have a geoheader with datum information, and\nthe input files are not in Cartesian coordinates, the datum needs to be\nspecified via the ``--datum`` option, or by setting\n``--semi-major-axis`` and ``--semi-minor-axis``.\n\n.. _pc_align_las:\n\nLAS and COPC\n^^^^^^^^^^^^\n\nThe ``pc_align`` program supports clouds in the LAS format, including compressed\n(LAZ) and cloud-optimized (`COPC <https://copc.io/>`_) data. The processing is\ndone with `PDAL <https://pdal.io/en/latest/>`_, which is shipped with ASP. \n\nIf the reference / source cloud is in the COPC format, the option\n``--ref-copc-win`` / ``--src-copc-win`` is required, so that the program can\nknow the region of these spatially organized clouds that needs processing. Or\ncan set ``--ref-copc-read-all`` / ``--src-copc-read-all``. See the full\ndescription of these options in :numref:`pc_align_options`.\n\nFor COPC files, the corresponding output cloud with the transform applied to it\nwill be in the LAZ format, and will be restricted to the region used in\nprocessing. \n\n.. _alignmenttransform:\n\nThe alignment transform\n~~~~~~~~~~~~~~~~~~~~~~~\n\nThe transform obtained by ``pc_align`` is output to a text file as\na 4 |times| 4 matrix with the upper-left 3 |times| 3 submatrix being\nthe rotation (and potentially also a scale, per :numref:`align-method`)\nand the top three elements of the right-most column being the\ntranslation. It is named ``<output prefix>-transform.txt``.\n\nThis transform, if applied to the source point cloud,\nwill bring it in alignment with the reference point cloud.  The\ntransform assumes the 3D Cartesian coordinate system with the origin\nat the planet center (known as ECEF). This matrix can be supplied\nback to the tool as an initial guess (:numref:`prevtrans`). \n\nThe inverse transform, from the reference cloud to the source cloud is saved\nas well, as ``<output prefix>-inverse-transform.txt``. \n\nThese two transforms can be used to move cameras from one cloud's coordinate\nsystem to another one's, as shown in :numref:`ba_pc_align`.\n\n.. _prevtrans:\n\nApplying an initial transform\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe ``pc_align``-produced transform (:numref:`alignmenttransform`) can be\nsupplied back to the tool as an initial guess via the ``--initial-transform``\noption, with the same clouds as earlier, or some supersets or subsets of them.\nIf it is desired to apply this transform without further refinement, one can\nspecify ``--num-iterations 0``.\n\nAn initial transform can be found, for example, based on hillshading the two\nclouds (:numref:`pc_hillshade`) or with correlation-based alignment\n(:numref:`pc_corr`).\n\nTo illustrate applying a transform, consider a DEM, named ``dem.tif``, obtained\nwith ASP, from which just a portion, ``dem_crop.tif`` is known to have reliable\nmeasurements, which are stored, for example, in a file called ``meas.csv``.\nHence, ``pc_align`` is first used on the smaller DEM, as::\n\n    pc_align <other options> dem_crop.tif meas.csv -o run/run\n\nThen, the command::\n\n    pc_align                                    \\\n      --max-displacement -1                     \\\n      --num-iterations 0                        \\\n      --max-num-reference-points 1000           \\\n      --max-num-source-points 1000              \\\n      --save-transformed-source-points          \\\n      --save-inv-transformed-reference-points   \\\n      --initial-transform run/run-transform.txt \\\n      --csv-format <csv format string>          \\\n      dem.tif meas.csv                          \\\n      -o run_full/run\n\nwill transform the full ``dem.tif`` into the coordinate system of ``meas.csv``,\nand ``meas.csv`` into the coordinate system of ``ref.tif`` with no further\niterations. The number of input points here is small, for speed, as they will\nnot be used.\n\nSee also :numref:`ba_pc_align` for how to use such transforms with cameras.\n\nIf an initial transform is used, with zero or more iterations, the\noutput transform produced by such an invocation will be from the source\npoints *before* the initial transform, hence the output alignment\ntransform will incorporate the initial transform.\n\nUsing ``--max-displacement -1`` should be avoided, as that will do \nno outlier filtering in the source cloud. Here that is not necessary,\nas this invocation simply moves the DEM according to the specified\ntransform.\n\nIf a good initial alignment is found, it is suggested to use a smaller\nvalue for ``--max-displacement`` to refine the alignment, as the\nclouds will already be mostly on top of each other after the initial\ntransform is applied.\n\nApplying an initial specified translation or rotation \n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nOne can apply to the source cloud an initial shift, expressed in the\nNorth-East-Down coordinate system at the centroid of the source\npoints, before the alignment algorithm is invoked. Hence, if it is\ndesired to first move the source cloud North by 5 m, East by 10 m, and\ndown by 15 m relative to the point on planet surface which is the\ncentroid of the source points, the continue with alignment, one can\ninvoke ``pc_align`` with::\n\n\n    --initial-ned-translation \"5 10 15\"\n\n(Notice the quotes.)\n\nThe option ``--initial-rotation-angle`` can be used analogously.\n\nAs in :numref:`prevtrans`, one can simply stop after such an\noperation, if using zero iterations. In either case, such initial\ntransform will be incorporated into the transform file output by\n``pc_align``, hence that one will go from the source cloud before\nuser's initial transform to the reference cloud.\n\nInterpreting the transform\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe alignment transform, with its origin at the center of the planet,\ncan result in large movements on the planet surface even for small\nangles of rotation. Because of this it may be difficult to interpret\nboth its rotation and translation components.\n\nThe ``pc_align`` program outputs the translation component of this\ntransform, defined as the vector from the centroid of the original\nsource points (before any initial transform applied to them) to the\ncentroid of the source points with the computed alignment transform\napplied to them. This translation component is displayed in three ways\n(a) Cartesian coordinates with the origin at the planet center, (b)\nLocal North-East-Down coordinates at the centroid of the source points\n(before any initial transform), and (c) Latitude-Longitude-Height\ndifferences between the two centroids. If the effect of the transform is\nsmall (e.g., the points moved by at most several hundred meters) then\nthe representation in the form (b) above is most amenable to\ninterpretation as it is in respect to cardinal directions and height\nabove ground if standing at a point on the planet surface.\n\nThis program prints to screen the Euler angles of the rotation\ntransform, and also the axis of rotation and the angle measured against\nthat axis. It can be convenient to interpret the rotation as being\naround the center of gravity of the reference cloud, even though it was\ncomputed as a rotation around the planet center, since changing the\npoint around which a rigid transform is applied will only affect its\ntranslation component, which is relative to that point, but not the\nrotation matrix.\n\n.. _pc_align_error:\n\nError metrics and outliers\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe tool outputs to CSV files the lists of errors together with their\nlocations in the source point cloud, before the alignment of the source\npoints (but after applying any initial transform), and also after the\nalignment computed by the tool. They are named\n``<output prefix>-beg_errors.csv`` and\n``<output prefix>-end_errors.csv``. An error is defined as the distance\nfrom a source point used in alignment to the closest reference point\n(measured in meters). \n\nThe format of output CSV files is the same as of input CSV files, or as\ngiven by ``--csv-format``, although any columns of extraneous data in\nthe input files are not saved on output. The first line in these\nfiles shows the names of the columns.\n\nSee :numref:`plot_csv` for how to visualize these files. By default,\nthis tool shows the 4th column in these files, which is the absolute\nerror difference. Run, for example::\n\n    stereo_gui --colorbar run/run-end_errors.csv\n\nThe program prints to screen and saves to a log file the 16th, 50th, and\n84th error percentiles as well as the means of the smallest 25%, 50%,\n75%, and 100% of the errors.\n\nWhen the reference point cloud is a DEM, a more accurate computation of\nthe errors from source points to the reference cloud is used. A source\npoint is projected onto the datum of the reference DEM, its longitude\nand latitude are found, then the DEM height at that position is\ninterpolated. That way we determine the closest point on the reference\nDEM that interprets the DEM not just as a collection of points but\nrather as a polyhedral surface going through those points. These errors\nare what is printed in the statistics. To instead compute errors as done\nfor other type of point clouds, use the option ``--no-dem-distances``.\n\nBy default, when ``pc_align`` discards outliers during the computation\nof the alignment transform, it keeps the 75% of the points with the\nsmallest errors. As such, a way of judging the effectiveness of the tool\nis to look at the mean of the smallest 75% of the errors before and\nafter alignment.\n\n.. _pc_align_validation:\n\nEvaluation of aligned clouds\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe ``pc_align`` program can save the source cloud after being aligned to the\nreference cloud and vice-versa, via ``--save-transformed-source-points`` and\n``--save-inv-transformed-reference-points``. \n\nTo validate that the aligned source cloud is very close to the reference cloud,\nDEMs can be made out of them with ``point2dem`` (:numref:`point2dem`), and those\ncan be overlaid as georeferenced images in ``stereo_gui`` (:numref:`stereo_gui`)\nfor inspection. A GIS tool can be used as well.\n\nAlternatively, the ``geodiff`` program (:numref:`geodiff`) can \ncompute the (absolute) difference between aligned DEMs, which can\nbe colorized with ``colormap`` (:numref:`colormap`), or colorized on-the-fly\nand displayed with a colorbar in ``stereo_gui`` (:numref:`colorize`).\n\nThe ``geodiff`` tool can take the difference between a DEM and a CSV file as\nwell. The obtained error differences can be visualized in ``stereo_gui``\n(:numref:`plot_csv`).\n\nOutput point clouds and convergence history\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe transformed input point clouds (the source transformed to match\nthe reference, and the reference transformed to match the source) can\nalso be saved to disk if desired. If an input point cloud is in CSV,\nASP point cloud format, or LAS format, the output transformed cloud\nwill be in the same format. If the input is a DEM, the output will be\nan ASP point cloud, since a gridded point cloud may not stay so after\na 3D transform. \n\nAs an example, assume that ``pc_align`` is run as::\n\n    pc_align --max-displacement 100              \\\n      --csv-format '1:x 2:y 3:z'                 \\\n      --save-transformed-source-points           \\\n      --save-inv-transformed-reference-points    \\\n      ref_dem.tif source.csv                     \\\n      -o run/run \n\nThis will save ``run/run-trans_reference.tif`` which is a point cloud\nin the coordinate system of the source dataset, and\n``run/run-trans_source.csv`` which is in reference coordinate system\nof the reference dataset.\n\nThe ``point2dem`` program (:numref:`point2dem`) can re-grid the\nobtained point cloud back to a DEM.\n\nCare is needed, as before, with setting ``--max-displacement``.\n\nThe convergence history for ``pc_align`` (the translation and rotation\nchange at each iteration) is saved to disk with a name like::\n\n    <output prefix>-iterationInfo.csv\n \nand can be used to fine-tune the stopping criteria.\n\n.. _manual-align:\n\nManual alignment\n~~~~~~~~~~~~~~~~\n\nIf automatic alignment fails, for example, if the clouds are too\ndifferent, or they differ by a scale factor, a manual alignment can be\ncomputed as an initial guess transform (and one can stop there if\n``pc_align`` is invoked with 0 iterations). \n\nFor that, the input point clouds should be first converted to DEMs using\n``point2dem``, unless in that format already. Then, ``stereo_gui`` can be called\nto create manual point correspondences (interest point matches) from the\nreference to the source DEM (:numref:`stereo_gui_edit_ip`). The DEMs should be\ndisplayed in the GUI with the reference DEM on the left, and should be\nhillshaded. \n\nOnce the match file is saved to disk, it can be passed to ``pc_align`` via the\n``--match-file`` option, which will compute an initial transform (whose type is\nset with ``--initial-transform-from-hillshading``), before continuing with\nalignment. Example::\n\n    pc_align ref-DEM.tif src-DEM.tif             \\\n     --max-displacement 500                      \\\n     --initial-transform-ransac-params 1000 100  \\\n     --initial-transform-from-hillshading rigid  \\\n     --match-file run/run-ref-DEM__src-DEM.match \\\n     -o run/run\n\nThis transform can also be used for non-DEM clouds once it is found using DEMs\nobtained from those clouds (:numref:`prevtrans`). Note that both a rigid and\nsimilarity transform is supported, both for the initial transform and for the\nalignment. A rigid transform is usually enough.\n\nHere the second value of ``--initial-transform-ransac-params`` was set rather\nhigh, to not remove any matches as outliers.\n\n.. _regrid:\n\nRegrid a DEM\n~~~~~~~~~~~~\n\nGiven a DEM, if one invokes ``pc_align`` as follows::\n\n    pc_align dem.tif dem.tif --max-displacement -1 --num-iterations 0 \\\n       --save-transformed-source-points -o run/run\n\nthis will create a point cloud out of the DEM. This cloud can then be re-gridded\nusing ``point2dem`` (:numref:`point2dem`), with desired grid size and projection. \n\nAlternatively, the ``gdalwarp`` program (:numref:`gdal_tools`) can be employed\nfor regridding, with an option such as ``-r cubic``. \n\nThe ``point2dem`` approach is preferable if the output grid size is very coarse,\nas this tool does binning in a neighborhood, rather than interpolation.\n\n.. _ba_pc_align:\n\nApplying a transform to cameras\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nIf ``pc_align`` is used to align a DEM obtained with ASP to a preexisting\nreference DEM or other cloud, the obtained alignment transform can be applied to\nthe cameras used to create the ASP DEM, so the cameras then become aligned with\nthe reference. That is accomplished by running bundle adjustment with the\noptions ``--initial-transform`` and ``--apply-initial-transform-only``.\n\nPlease note that the way this transform is applied depends on the \norder of clouds in ``pc_align`` and on whether the cameras have\nbeen bundle-adjusted or not. Precise commands are given below.\n\nFirst, assume, for example, that the reference is ``ref.tif``, and\nthe ASP DEM is created *without* bundle adjustment, as::\n\n    parallel_stereo left.tif right.tif left.xml right.xml output/run\n    point2dem --auto-proj-center output/run-PC.tif\n\nIt is very important to distinguish the cases when the obtained DEM is\nthe first or second argument of ``pc_align``.\n\nIf the ASP DEM ``output/run-DEM.tif`` is aligned to the reference\nas::\n\n    pc_align --max-displacement 1000 ref.tif output/run-DEM.tif \\\n      -o align/run\n\nthen, the alignment is applied to cameras the following way::\n\n    bundle_adjust left.tif right.tif left.xml right.xml \\\n      --initial-transform align/run-transform.txt       \\\n      --apply-initial-transform-only -o ba_align/run\n\nThis should create the camera adjustments incorporating the alignment\ntransform::\n\n     ba_align/run-left.adjust, ba_align/run-right.adjust\n\n(see :numref:`adjust_files` for discussion of .adjust files). \n\nFor CSM cameras, this will also create stand-alone ``model state`` cameras with\nadjustments already applied to them (:numref:`csm_state`).\n\nIf ``pc_align`` was invoked with the two clouds in reverse order, the\ntransform to use is::\n\n    align/run-inverse-transform.txt\n\nThe idea here is that ``run-transform.txt`` goes from the second cloud\npassed to ``pc_align`` to the first, hence, ``bundle_adjust`` invoked\nwith this transform would move cameras from second cloud's coordinate\nsystem's to first. And vice-versa, if ``run-inverse-transform.txt`` is\nused, cameras from first clouds's coordinate system would be moved to\nsecond's.\n\nAfter applying a transform this way, the cameras that are now aligned\nwith the reference can be used to mapproject onto it, hopefully\nwith no registration error, as::\n\n    mapproject ref.tif left.tif left_map.tif \\\n      --bundle-adjust-prefix ba_align/run\n\nand in the same way for the right image. Overlaying the produced\nimages is a very useful sanity check.\n    \nIf, the initial stereo was done with cameras that already\nwere bundle-adjusted, with output prefix ``initial_ba/run``,\nso the stereo command had the option::\n\n  --bundle-adjust-prefix initial_ba/run\n\nwe need to integrate those initial adjustments with this alignment\ntransform. To do that, again need to consider two cases, as before.\n\nIf the just-created stereo DEM is the second argument to ``pc_align``,\nthen run the slightly modified command::\n\n    bundle_adjust left.tif right.tif left.xml right.xml \\\n      --initial-transform align/run-transform.txt       \\\n      --input-adjustments-prefix initial_ba/run         \\\n      --apply-initial-transform-only -o ba_align/run\n\nOtherwise, if the stereo DEM is the first argument to ``pc_align``, use instead\n``align/run-inverse-transform.txt`` as input to ``--initial-transform``.\n\nNote that this way bundle adjustment will not do any further camera refinements\nafter the initial transform is applied.\n\nA stereo run can be reused after the cameras have been modified as above, with\nthe option ``--prev-run-prefix``. Only triangulation will then be redone. Ensure\nthe option ``--bundle-adjust-prefix ba_align/run`` is used to point to the new\ncameras. See :numref:`bathy_reuse_run` and :numref:`mapproj_reuse`.\n\nTroubleshooting\n~~~~~~~~~~~~~~~\n\nRemember that filtering is applied only to the source point cloud. If\nyou have an input cloud with a lot of noise, make sure it is being used\nas the source cloud.\n\nIf you are not getting good results with ``pc_align``, something that\nyou can try is to convert an input point cloud into a smoothed DEM. Use\n``point2dem`` to do this and set ``--search-radius-factor`` if needed to\nfill in holes in the DEM. For some input data this can significantly\nimprove alignment accuracy.\n\n.. _pc_align_options:\n\nCommand-line options for pc_align\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n--num-iterations <integer (default: 1000)>\n    Maximum number of iterations.\n\n--max-displacement <float>\n    Maximum expected displacement (horizontal + vertical) of source\n    points as result of alignment, in meters (after the initial guess\n    transform is applied to the source points).  Used for removing\n    gross outliers in the source (movable) point cloud.\n\n-o, --output-prefix <string (default: \"\")>\n    Specify the output file prefix.\n\n--outlier-ratio <float (default: 0.75)>\n    Fraction of source (movable) points considered inliers (after\n    gross outliers further than max-displacement from reference\n    points are removed).\n\n--max-num-reference-points <integer (default: 10^8)>\n    Maximum number of (randomly picked) reference points to use.\n\n--max-num-source-points <integer (default: 10^5)>\n    Maximum number of (randomly picked) source points to use (after\n    discarding gross outliers).\n\n--alignment-method <string (default: \"point-to-plane\")>\n    Alignment method. Options: ``point-to-plane``, ``point-to-point``,\n    ``similarity-point-to-plane``, ``similarity-point-to-point``\n    (:numref:`pc_icp`), ``nuth`` (:numref:`nuth`), ``fgr`` (:numref:`fgr`),\n    ``least-squares``, ``similarity-least-squares``\n    (:numref:`pc_least_squares`).\n\n--highest-accuracy\n    Compute with highest accuracy for point-to-plane (can be much slower).\n\n--datum <string>\n    Sets the datum for CSV files.\n    Options:\n\n    * WGS_1984\n    * D_MOON (1,737,400 meters)\n    * D_MARS (3,396,190 meters)\n    * MOLA (3,396,000 meters)\n    * NAD83\n    * WGS72\n    * NAD27\n    * Earth (alias for WGS_1984)\n    * Mars (alias for D_MARS)\n    * Moon (alias for D_MOON)\n\n--semi-major-axis <float>\n    Explicitly set the datum semi-major axis in meters.\n\n--semi-minor-axis <float>\n    Explicitly set the datum semi-minor axis in meters.\n\n--csv-format <string>\n    Specify, in quotes, the format of input CSV files as a list of entries\n    ``column_index:column_type`` (indices start from 1). Examples: ``'1:x 2:y\n    3:z'`` (a Cartesian coordinate system with origin at planet center is\n    assumed, with the units being in meters), ``'5:lon 6:lat 7:radius_m'``\n    (longitude and latitude are in degrees, the radius is measured in meters\n    from planet center), ``'3:lat 2:lon 1:height_above_datum'``, ``'1:easting\n    2:northing 3:height_above_datum'`` (for the latter need to also set\n    ``--csv-srs``). The height above datum is in meters. Can also use\n    ``radius_km`` for ``column_type``, when it is again measured from planet\n    center.\n\n--csv-srs <string>\n    The PROJ or WKT string to use to interpret the entries in input CSV\n    files.\n\n--compute-translation-only\n    Compute the transform from source to reference point cloud as\n    a translation only (no rotation).\n\n--save-transformed-source-points\n    Apply the obtained transform to the source points so they match the\n    reference points and save them. The transformed point cloud can be\n    gridded with ``point2dem`` (:numref:`point2dem`).\n\n--save-inv-transformed-reference-points\n    Apply the inverse of the obtained transform to the reference\n    points so they match the source points and save them.\n\n--initial-transform <string>\n    The file containing the transform to be used as an initial\n    guess. It can come from a previous run of the tool.\n\n--initial-ned-translation <string>\n    Initialize the alignment transform based on a translation with\n    this vector in the North-East-Down coordinate system around the\n    centroid of the reference points. Specify it in quotes, separated\n    by spaces or commas.\n\n--initial-rotation-angle <double (default: 0.0)>\n    Initialize the alignment transform as the rotation with this angle\n    (in degrees) around the axis going from the planet center to the\n    centroid of the point cloud. If ``--initial-ned-translation`` is\n    also specified, the translation gets applied after the rotation.\n\n--initial-transform-from-hillshading <string>\n    If both input clouds are DEMs, find interest point matches among their\n    hillshaded versions, and use them to compute an initial transform to apply\n    to the source cloud before proceeding with alignment\n    (:numref:`pc_hillshade`).  Specify here the type of transform, as one of:\n    ``rigid`` (rotation + translation), ``translation``, or ``similarity``\n    (rotation + translation + scale). See the options further down for tuning\n    this. The alignment algorithm can refine the scale later if set to\n    ``similarity-point-to-plane``, etc.\n\n--hillshade-command <string (default: \"\")>\n    The hillshade command and options to use when computing the transform from\n    hillshading. The default is: ``gdaldem hillshade -multidirectional\n    -compute_edges -co TILED=yes -co BLOCKXSIZE=256 -co BLOCKYSIZE=256``. An\n    alternative is: ``hillshade --azimuth 300 --elevation 20\n    --align-to-georef``.\n\n--hillshade-options <string (default: \"\")>\n    Options to pass to the ``hillshade`` program when computing the\n    transform from hillshading. This is for backward compatibility.\n    Use instead the ``--hillshade-command`` option.\n    \n--ipfind-options\n    Options to pass to the ``ipfind`` program when computing the\n    transform from hillshading. Default: ``--ip-per-image 1000000\n    --interest-operator sift --descriptor-generator sift``.\n\n--ipmatch-options\n    Options to pass to the ``ipmatch`` program when computing the\n    transform from hillshading. Default: ``--inlier-threshold 100\n    --ransac-iterations 10000 --ransac-constraint similarity``.\n\n--initial-transform-ransac-params <num_iter factor (default: 10000 1.0)>\n    When computing an initial transform based on hillshading, use\n    this number of RANSAC iterations and outlier factor. A smaller\n    factor will reject more outliers. \n\n--match-file\n    Compute an initial transform from the source to the reference point cloud\n    given interest point matches from the reference to the source DEM in this\n    file. This file can be produced manually, in ``stereo_gui``\n    (:numref:`manual-align`), or automatically, as in :numref:`pc_hillshade` or\n    :numref:`pc_corr`. See also ``--initial-transform-from-hillshading``\n    and ``--initial-transform-ransac-params``.\n\n--nuth-options <string (default: \"\")>\n    Options to pass to the Nuth and Kaab algorithm. Set in quotes. \n    See :ref:`nuth_options` for more details.\n    \n--fgr-options <string>\n    Options to pass to the Fast Global Registration (FGR) algorithm. Set in\n    quotes. Default: \"div_factor: 1.4 use_absolute_scale: 0 max_corr_dist: 0.025\n    iteration_number: 100 tuple_scale: 0.95 tuple_max_cnt: 10000\".\n\n--ref-copc-win <float float float float>\n    Specify the region to read from the reference cloud, if it is a COPC LAZ\n    file. The units are based the projection in the file. This is required\n    unless ``--ref-copc-read- all`` is set. Specify as ``minx miny maxx maxy``,\n    or ``minx maxy maxx miny``, with no quotes. See also ``--src-copc-win``\n    and :numref:`pc_align_las`.\n\n--src-copc-win <float float float float>\n    Specify the region to read from the source cloud, if it is a COPC LAZ file.\n    The units are based the projection in the file. This is required unless\n    ``--src-copc-read-all all`` is set. Specify as ``minx miny maxx maxy``, or\n    ``minx maxy maxx miny``, with no quotes. If not set, the ``--ref-copc-win``\n    option will be used, or otherwise it will be estimated based on the extent\n    of reference points and the ``--max-displacement`` option.\n\n--ref-copc-read-all\n    Read the full reference COPC file, ignoring the ``--ref-copc-win`` option.\n    \n--src-copc-read-all\n    Read the full source COPC file, ignoring the ``--src-copc-win`` option.\n        \n--diff-rotation-error <float (default: 1e-5)>\n    Change in rotation amount below which the algorithm will stop\n    (if translation error is also below bound), in degrees. A small\n    value can result in numerical precision issues and many iterations.\n\n--diff-translation-error <float (default: 1e-3)>\n    Change in translation amount below which the algorithm will\n    stop (if rotation error is also below bound), in meters.\n\n--no-dem-distances\n    For reference point clouds that are DEMs, don't take advantage\n    of the fact that it is possible to interpolate into this DEM\n    when finding the closest distance to it from a point in the\n    source cloud (the text above has more detailed information).\n    \n--skip-shared-box-estimation\n    Do not estimate the shared bounding box of the two clouds. This estimation\n    can be costly for large clouds but helps with eliminating outliers.\n    \n--threads <integer (default: 0)>\n    Select the number of threads to use for each process. If 0, use\n    the value in ~/.vwrc.\n \n--cache-size-mb <integer (default = 1024)>\n    Set the system cache size, in MB.\n\n--tile-size <integer (default: 256 256)>\n    Image tile size used for multi-threaded processing.\n\n--no-bigtiff\n    Tell GDAL to not create BigTiff files.\n\n--tif-compress <None|LZW|Deflate|Packbits (default: LZW)>\n    TIFF compression method.\n\n-v, --version\n    Display the version of software.\n\n-h, --help\n    Display this help message.\n\n.. _nuth_options:\n\nOptions for Nuth and Kaab \n~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe Nuth and Kaab algorithm (:numref:`nuth`) accepts the regular ``pc_align``\noptions ``--max-displacement``, ``--num-iterations``,\n``--compute-translation-only``, ``--threads``.\n\nIn addition, it can be tuned via the ``--nuth-options`` argument. Its value is a\nstring in quotes, with spaces as separators. Example:: \n\n    --nuth-options \"--slope-lim 0.1 40.0 --tol 0.01\"\n\nDefault values will be used for any unspecified options. The options are:\n\n--slope-lim <float float (default: 0.1 40.0)>\n    Minimum and maximum surface slope limits to consider (degrees).\n    \n--tol <float (default: 0.01)>\n    Stop when the addition to the alignment translation at given iteration has\n    magnitude below this tolerance (meters).\n\n--max-horizontal-offset <float>\n    Maximum expected horizontal translation magnitude (meters). Used to filter\n    outliers. If not set, use the value in ``--max-displacement``.\n\n--max-vertical-offset <float>\n    Maximum expected vertical translation in meters (meters). Used to filter\n    outliers. If not set, use the value in ``--max-displacement``.\n\n--num-inner-iter <integer (default: 10)>\n    Maximum number of iterations for the inner loop, when finding the best fit\n    parameters for the current translation.\n    \n.. |times| unicode:: U+00D7 .. MULTIPLICATION SIGN\n"
  },
  {
    "path": "docs/tools/pc_filter.rst",
    "content": ".. _pc_filter:\n\npc_filter\n---------\n\nThis program takes as input a four-band ``PC.tif`` point cloud as\ncreated by stereo triangulation (:numref:`outputfiles`) and applies\nvarious outlier filters. It can be especially useful for indoor stereo\ndatasets, which can have poor texture and very oblique angles, and\nhence result in noisy point clouds.\n\nEach point that is kept can be assigned a reliability weight (for some\nof the options below), which will be used when the point clouds (if in\n``.pcd`` format) are fused into a mesh with ``voxblox_mesh``\n(:numref:`voxblox_mesh`).\n\nIt is assumed that the input cloud fits fully in memory, and some\nfiltering options expect that the cloud was created with pinhole\ncameras. This may change in future versions.\n\nThe output cloud has the same format and dimensions as the input, with\noutliers replaced by points with all coordinates equal to 0. The cloud\ncan also be saved in ``.ply`` or ``.pcd`` format (depending on the\nspecified extension). In those cases the coordinates are saved as\n``float32``, which may result in loss of precision for orbital\ndata. Invalid points and outliers are excluded from those clouds.\n\nA textured mesh in .obj format can be created from the output cloud\nusing ``point2mesh`` (:numref:`point2mesh`), just as for the original\ncloud.\n\nUsage::\n\n    pc_filter [options] --input-cloud input.tif --output-cloud output.tif\n\nExample 1 (save the output in .tif format)::\n\n    pc_filter --max-distance-from-camera 1.5      \\\n      --max-camera-ray-to-surface-normal-angle 75 \\\n      --input-cloud run/run-PC.tif                \\\n      --input-texture run/run-L.tif               \\\n      --camera left.tsai                          \\\n      --output-cloud run/run-PC-filter.tif\n\nExample 2 (save the output in .pcd format and transform to camera coordinates,\nfor use with VoxBlox)::\n\n    pc_filter --max-distance-from-camera 1.5      \\\n      --max-camera-ray-to-surface-normal-angle 75 \\\n      --input-cloud run/run-PC.tif                \\\n      --input-texture run/run-L.tif               \\\n      --transform-to-camera-coordinates           \\\n      --output-cloud run/run-PC-filter.pcd\n\nCreate a mesh from the filtered point cloud::\n\n    point2mesh -s 4 --texture-step-size 1          \\\n               run/run-PC-filter.tif run/run-L.tif\n\nCommand-line options for ``pc_filter``:\n\n--input-cloud <string (default=\"\")>\n    Input cloud name. A four-band .tif file as produced by stereo\n    triangulation.\n\n--output-cloud <string (default=\"\")>\n    Output cloud name. If having a .tif extension, the same format will\n    be used as the input. Can also save ``.pcd`` and ``.ply`` files\n    (only vertices are saved, not mesh faces). In those\n    case the points will be saved with ``float32`` values, so there may be\n    some precision loss. The ``.pcd`` file will store in the field for the\n    cloud normal the values image_texture, blending_weight,\n    intersection_error, assuming these are computed.\n\n--input-texture <string (default=\"\")>\n    If specified, read the texture from this file. Normally this is the\n    file ``L.tif`` from the same run which produced the input point\n    cloud.\n\n--camera <string (default=\"\")>\n    The left or right camera used to produce this cloud. Used for some\n    filtering operations.\n\n--max-distance-from-camera <double (default=0.0)>\n    If positive, remove points further from camera center than this\n    value. Measured in meters.\n\n--max-valid-triangulation-error <double (default=0.0)>\n    If positive, points with triangulation error larger than this will\n    be removed from the cloud. Measured in meters.\n\n--max-camera-ray-to-surface-normal-angle <double (default=0.0)>\n    If positive, points whose surface normal makes an angle with the\n    ray back to the camera center greater than this will be removed as\n    outliers. Measured in degrees.\n\n--max-camera-dir-to-surface-normal-angle <double (default=0.0)>\n    If positive, points whose surface normal makes an angle with the\n    camera direction greater than this will be removed as\n    outliers. This eliminates surfaces almost parallel to camera view\n    direction. Measured in degrees.\n\n--max-camera-dir-to-camera-ray-angle <double (default=0.0)>\n    If positive, and a ray emanating from the camera and ending at the\n    current point makes an angle with the camera direction bigger than\n    this, remove the point as an outlier. In effect, this narrows the\n    camera field of view.\n\n--distance-from-camera-weight-power <double (default=0.0)>\n    If positive, let the weight of a point be inversely proportional\n    to the distance from the camera center to the point, raised to\n    this power.\n\n--blending-dist <double (default=0.0)>\n    If positive and closer to any boundary of valid points than this\n    (measured in point cloud pixels), decrease the weight assigned to\n    the given point proportionally to remaining distance to boundary\n    raised to a power. In effect, points closer to boundary are given\n    less weight. Used in VoxBlox.\n\n--blending-power <double (default=1.0)>\n    Use this as the power when setting ``--blending-dist``.\n\n--reliable-surface-resolution <double (default=0.0)>\n    If positive, let each point's weight be proportional to\n    exp(-curr_surface_resolution / reliable_surface_resolution). This\n    should be set to about half the expected surface resolution, to\n    have the weight of points at lower resolution decrease rather\n    fast. A point's surface resolution is the maximum distance between\n    it and its immediate neighbors.\n\n--transform-to-camera-coordinates\n    Transform the point cloud to the coordinate system of the camera\n    provided with ``--camera``. For use with VoxBlox.\n\n--output-weight <string (default=\"\")>\n    If specified, save the weight assigned to each point to this\n    file. This has the same dimensions as the point cloud and ``L.tif``.\n    (Use the .tif extension.)\n\n--threads <integer (default: 0)>\n    Select the number of threads to use for each process. If 0, use\n    the value in ~/.vwrc.\n \n--cache-size-mb <integer (default = 1024)>\n    Set the system cache size, in MB.\n\n--tile-size <integer (default: 256 256)>\n    Image tile size used for multi-threaded processing.\n\n--no-bigtiff\n    Tell GDAL to not create BigTiff files.\n\n--tif-compress <None|LZW|Deflate|Packbits (default: LZW)>\n    TIFF compression method.\n\n-v, --version\n    Display the version of software.\n\n-h, --help\n    Display this help message.\n"
  },
  {
    "path": "docs/tools/pc_merge.rst",
    "content": ".. _pc_merge:\n\npc_merge\n--------\n\nThis is a simple tool for combining multiple ASP-generated point cloud\nfiles into a single concatenated file. The output file will be float32\nunless the input images are float64 or the user has specified the\nfloat64 option.\n\n``pc_merge`` can merge clouds with 1, 3, 4, and 6 bands. In particular, it can\nmerge *output-prefix*-L.tif images created by ``stereo``\n(:numref:`outputfiles`). This is useful if it is desired to create an\northoimage from a merged cloud with ``point2dem`` (:numref:`point2dem`).\n\nIn that case, one can invoke ``pc_merge`` on individual ``L.tif`` files to\ncreate a merged texture file to pass to ``point2dem`` together with the merged\npoint cloud tile.\n\nExample::\n\n  pc_merge cloud1.tif cloud2.tif -o merged_cloud.tif\n  \nUsage::\n\n    pc_merge [options] <input files> -o <output file>\n\nCommand-line options for pc_merge:\n\n-d, --write-double\n    Force output file to be float64 instead of float32.\n\n-o, --output-file <name>\n    Specify the output file (required).\n\n--threads <integer (default: 0)>\n    Select the number of threads to use for each process. If 0, use\n    the value in ~/.vwrc.\n \n--cache-size-mb <integer (default = 1024)>\n    Set the system cache size, in MB.\n\n--tile-size <integer (default: 256 256)>\n    Image tile size used for multi-threaded processing.\n\n--no-bigtiff\n    Tell GDAL to not create BigTiff files.\n\n--tif-compress <None|LZW|Deflate|Packbits (default: LZW)>\n    TIFF compression method.\n\n-v, --version\n    Display the version of software.\n\n-h, --help\n    Display this help message.\n"
  },
  {
    "path": "docs/tools/point2dem.rst",
    "content": ".. _point2dem:\n\npoint2dem\n---------\n\nThe ``point2dem`` program produces a digital elevation model (DEM) in the\nGeoTIFF format and/or an orthographic image from a set of point clouds. The\nclouds can be created by ``parallel_stereo`` (:numref:`parallel_stereo`), or be\nin CSV (:numref:`point2dem_csv`) or LAS (:numref:`point2dem_las`) format. \n\nThe heights in the produced DEM are relative to a datum (ellipsoid). \nThey are calculated by weighted averaging around each grid point\nof the heights of points in the cloud (see ``--search-radius-factor``).\n\nThe grid size is set with ``--tr`` for the given projection. The grid points are\nplaced at integer multiples of the grid size, and the created DEM has a ground\nfootprint that is outwardly larger by half a grid pixel than the bounding box of\nthe grid points. If not set, the grid size is estimated automatically.\nThe behavior is somewhat different with ``--gdal-tap``.\n\nA custom extent can be specified with the option ``--t_projwin``. This will be\nadjusted to ensure, as above, that the grid points are placed at integer\nmultiples of the grid size.\n\nThe obtained DEMs can be colorized or hillshaded (:numref:`genhillshade`),\nvisualized with ``stereo_gui`` (:numref:`stereo_gui`), mosaicked with\n``dem_mosaic`` (:numref:`dem_mosaic`), or analyzed with GDAL tools\n(:numref:`gdal_tools`).\n\n.. _point2dem_proj:\n\nDetermination of projection\n~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nUse the option ``--t_srs`` to set a desired output projection. The projection\nshould be local to the area of interest, in units of meter.\n\nIf this is not set:\n\n - The ``point2dem`` program inherits the projection from the input images, if\n   those are mapprojected (:numref:`mapproj-example`) and the projection is not\n   geographic. \n\n - If the input is a LAS file having a projection that is not geographic, that\n   will be used. \n   \n - If the input is a CSV file, the projection from ``--csv-srs`` will be used. \n\nIf none of these are applicable, in the latest ASP (:numref:`release`),\n``point2dem`` automatically finds a good local projection in meters. For ASP\n3.4.0 and earlier, the default projection was geographic. \n\nFor Earth, with the WGS84 datum, the auto-determined projection is UTM\nwith an auto-computed zone, except for latitudes above 84° North and below 80°\nSouth, where the `NSDIC polar stereographic projections\n<https://nsidc.org/data/user-resources/help-center/guide-nsidcs-polar-stereographic-projection>`_\nare used.\n\nFor other Earth datums and other planetary bodies, the automatic determination\nproduces a local stereographic projection. The projection center is found\nby computing the median of a sample of points in the cloud.\n\nTo ensure the automatic projection determination is always invoked, overriding\nall other cases from above, use ``--t_srs auto``.\n\nSee the options ``--stereographic``, ``--orthographic``, ``--proj-lon``,\n``--proj-lat`` for other ways to set the projection.\n\nExamples\n~~~~~~~~\n\nLocal stereographic projection\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nCreate a DEM for Mars in a local stereographic projection, auto-guessing\nthe projection center and grid size.\n\n::\n\n    point2dem -r mars    \\\n      --stereographic    \\\n      --auto-proj-center \\\n      run/run-PC.tif\n\nThis creates ``run/run-DEM.tif``, which is a GeoTIFF file, with each 32-bit\nfloating point pixel value being the height above the datum (ellipsoid). The\ndatum and projection are saved in the geoheader and can be seen with ``gdalinfo\n-proj4`` (:numref:`gdal_tools`).\n\nASP normally auto-guesses the planet (datum), otherwise the option ``-r`` can be\nused. \n\nIf desired to change the output no-data value (which can also be inspected with\n``gdalinfo``), use the options ``--nodata-value``.\n\n.. _point2dem_ortho_err:\n\nOrthoimage and error image\n^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n::\n\n    point2dem -r moon            \\\n      --auto-proj-center         \\\n      run/run-PC.tif             \\\n      --orthoimage run/run-L.tif \\\n      --errorimage\n\nThis produced a lunar DEM. The projection is found as in\n:numref:`point2dem_proj`.\n\nThe left aligned image was used to create an orthoimage, by orthographically\nprojecting it onto the DEM. The resulting ``run/run-DRG.tif`` file will be saved\nas a GeoTIFF image with the same geoheader as the DEM.\n\nIn addition, the file ``run/run-IntersectionErr.tif`` is created,\nbased on the 4th band of the ``PC.tif`` file, having the gridded\nversion of the closest distance between the pair of rays intersecting\nat each point in the cloud (:numref:`triangulation_error`). This is\nalso called the *triangulation error*, but it is only one way of\nevaluating the quality of the DEM.\n\nHere we have explicitly specified the spheroid (``-r moon``), rather\nthan have it inferred automatically. The Moon spheroid will have a\nradius of 1737.4 km.\n\nSpecify a projection string\n^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n::\n\n    point2dem --t_srs '+proj=sinu +R=3396190 +no_defs' \\\n      run/run-PC.tif\n\nThis is the sinusoidal projection for Mars. The option ``gdalinfo --proj4``\ncan find the projection string in a GeoTIFF file.\n\nCustom grid size with geographic projection\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n::\n\n    point2dem -r earth --geographic --tr 0.0001 run/run-PC.tif\n\nIt is important to note that here the grid size passed to ``--tr``, is in\ndegrees, rather than meters, because the projection is geographic. This\nprojection is *not recommended* except close to the equator.\n\nIt is best to let the grid size be computed automatically, so not specifying\n``--tr`` at all, or otherwise use a multiple of the automatically determined\ngrid size (:numref:`post-spacing`).\n\nIf desired to change the range of longitudes from [0, 360] to [-180,\n180], or vice-versa, post-process obtained DEM with ``image_calc``\n(:numref:`image_calc`).\n\nPolar stereographic projection\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n::\n\n     point2dem -r moon             \\\n       --stereographic             \\\n       --proj-lon 0 --proj-lat -90 \\\n       run/run-PC.tif\n\n.. _point2dem_utm:\n\nUTM projection\n^^^^^^^^^^^^^^\n\n::\n\n    point2dem --utm 13 run/run-PC.tif\n\nOr::\n\n    proj=\"+proj=utm +zone=13 +datum=WGS84 +units=m +no_defs\"\n    point2dem --t_srs \"$proj\" run/run-PC.tif\n\nThe zone for the UTM projection depends on the region of interest. It can be\nauto-guessed (:numref:`point2dem_proj`). The `Geoplanner\n<https://www.geoplaner.com/>`_ website is a reliable source for UTM zone\ninformation.\n\nSee the options ``--sinusoidal``, ``--mercator``, etc., in\n:numref:`point2dem_options` for how to set other projections.\n\n.. _point2dem_csv:\n\nCSV files\n^^^^^^^^^\n\nThe ``point2dem`` program can grid CSV files having longitude, latitude, and \nheight values as::\n\n     point2dem -r moon                               \\\n       --dem-spacing 10                              \\\n       --csv-format 1:lon,2:lat,3:height_above_datum \\\n       in.csv                                        \\\n       -o run/run\n\nThis will produce a DEM in projected coordinates (in meters, rather than\ndegrees), unless the option ``--geographic`` is passed in and the\n``--dem-spacing`` is set to a fraction of a degree (:numref:`point2dem_proj`).\n\nFor input data in projected coordinates, one can set a projection and the CSV\nformat::\n\n  proj=\"+proj=utm +zone=10 +datum=WGS84 +units=m +no_defs\"\n  format=\"1:easting,2:northing,3:height_above_datum\"\n  \nthen run::\n\n    point2dem -r Earth       \\\n      --dem-spacing 10       \\\n      --csv-srs \"$proj\"      \\\n      --csv-format \"$format\" \\\n      --t_srs \"$proj\"        \\\n      in.csv                 \\\n      -o run/run\n\n.. _point2dem_las:\n\nLAS and COPC\n^^^^^^^^^^^^\n\nThe ``point2dem`` program can grid LAS files, including compressed\n(LAZ) and cloud-optimized (`COPC <https://copc.io/>`_) data. The processing is\ndone with `PDAL <https://pdal.io/en/latest/>`_, which is shipped with ASP. \n \nFor example, to create a DEM from a LAS file, run::\n\n    point2dem -r Earth --tr 10 in.las -o run/run\n\nThis assumes that the LAS file is in projected coordinates with the file having\nthe projection. If the points are in ECEF coordinates, a projection needs to be\nset with ``--t_srs``.\n\nFor COPC files, which are potentially immense but spatially organized, the\noption ``--copc-win`` must be set. It determines the bounds of desired data to\nprocess, in projected coordinates. Example::\n\n    point2dem --tr 2.0                       \\\n      --copc-win 636400 852260 638180 849990 \\\n      cloud.laz                              \\\n      -o run/run \n\nTo process the full file, use the option ``--copc-read-all``. \n\nThe determination of whether an input file is COPC or plain LAZ is done\nby peeking at the relevant bits with PDAL.\n\nThis program can process LAS files created with ``point2las``\n(:numref:`point2las`).\n    \nMultiple clouds\n^^^^^^^^^^^^^^^\n\nSeveral point clouds of different types can be passed in on input::\n\n     point2dem -r earth                              \\\n       --dem-spacing 10                              \\\n       --csv-format 1:lon,2:lat,3:height_above_datum \\\n       in1.las in2.csv run/run-PC.tif -o combined \n\nHere LAS, CSV, and TIF point clouds (the latter obtained with\n``parallel_stereo``) are fused together into a single DEM. \n\nThe CSV file is in longitude, latitude, and height above datum format, but the\nproduced DEM will be in a projection in meters, unless borrowed from the LAS\nfile or explicitly set with ``--t_srs`` (:numref:`point2dem_proj`).\n\nIf it is desired to use the ``--orthoimage`` option with multiple\nclouds, the clouds need to be specified first, followed by the\n``L.tif`` images.\n\nGround-level or projected data\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nIf a dataset is in a tif file with three bands, representing projected data or\nCartesian values in a local coordinate system, it can be gridded as::\n\n    point2dem --input-is-projected \\\n      --t_srs <proj string>        \\\n      --tr 0.1                     \\\n      data.tif\n\nSee ``--input-is-projected`` for more details.\n\nMore examples are shown in :numref:`builddem`.\n\n.. _molacmp:\n\nComparing with MOLA\n~~~~~~~~~~~~~~~~~~~\n\nWhen comparing the output of ``point2dem`` to laser altimeter data, like\nMOLA, it is important to understand the different kinds of data that are\nbeing discussed. By default, ``point2dem`` returns planetary radius\nvalues in meters. These are often large numbers that are difficult to\ndeal with. If you use the ``-r mars`` option, the output terrain model\nwill be in meters of elevation with reference to the IAU reference\nspheroid for Mars: 3,396,190 m. So if a post would have a radius value\nof 3,396,195 m, in the model returned with the ``-r mars`` option, that\npixel would just be 5 m.\n\nYou may want to compare the output to MOLA data. MOLA data is released\nin three 'flavors', namely: Topography, Radius, and Areoid. The MOLA\nTopography data product that most people use is just the MOLA Radius\nproduct with the MOLA Areoid product subtracted. Additionally, it is\nimportant to note that all of these data products have a reference value\nsubtracted from them. The MOLA reference value is NOT the IAU reference\nvalue, but 3,396,000 m.\n\nIn order to compare with the MOLA data, you can do one of two different\nthings. You could operate purely in radius space, and have ``point2dem``\ncreate radius values that are directly comparable to the MOLA radius\ndata. You can do this by having ``point2dem`` subtract the MOLA\nreference value, by using either ``-r mola`` or setting\n``--semi-major-axis 3396000`` and ``--semi-minor-axis 3396000``.\n\nAlternatively, to get values that are directly comparable to MOLA\n*Topography* data, you will need to run ``point2dem`` with either\n``-r mars`` or ``-r mola``, then run the ASP tool ``dem_geoid``\n(:numref:`dem_geoid`). This program will convert the DEM height values\nfrom being relative to the IAU reference spheroid or the MOLA spheroid\nto being relative to the MOLA Areoid.\n\nThe newly obtained DEM will inherit the datum from the unadjusted DEM,\nso it could be either of the two earlier encountered radii, but of\ncourse the heights in it will be in respect to the areoid, not to this\ndatum. It is important to note that one cannot tell from inspecting a\nDEM if it was adjusted to be in respect to the areoid or not, so there\nis the potential of mixing up adjusted and unadjusted terrain models.\n\n.. _post-spacing:\n\nPost spacing\n~~~~~~~~~~~~\n\nRecall that ``parallel_stereo`` creates a point cloud file as its\noutput and that you need to use ``point2dem`` on to create a GeoTIFF\nthat you can use in other tools. The point cloud file is the result of\ntaking the image-to-image matches (which were created from the kernel\nsizes you specified, and the subpixel versions of the same, if used)\nand projecting them out into space from the cameras, and arriving at a\npoint in real world coordinates. Since ``stereo`` does this for every\npixel in the input images, the *default* value that ``point2dem`` uses\n(if you don't specify anything explicitly) is the input image scale,\nbecause there's an \"answer\" in the point cloud file for each pixel in\nthe original image.\n\nHowever, as you may suspect, this is probably not the best value to use\nbecause there really is not that much \"information\" in the data. The true\nresolution of the output model is dependent on a whole bunch of things\n(like the kernel sizes you choose to use) but also can vary from place\nto place in the image depending on the texture.\n\nThe general rule of thumb is to produce a terrain model that has a\npost spacing of about 3x the input image ground scale. This is based\non the fact that it is nearly impossible to uniquely identify a single\npixel correspondence between two images, but a 3x3 patch of pixels\nprovides improved matching reliability. This depends on the stereo\nalgorithm as well, however, with the ``asp_mgm`` algorithm producing a\nhigher effective DEM resolution than ``asp_bm``. As you go to numerically\nlarger post-spacings on output, you are averaging more point data\n(that is probably spatially correlated anyway) together.\n\nSo you can either use the ``--dem-spacing`` argument to ``point2dem`` to\ndo that directly, or you can use your favorite averaging algorithm to\nreduce the ``point2dem``-created model down to the scale you want.\n\nIf you attempt to derive science results from an ASP-produced terrain\nmodel with the default DEM spacing, expect serious questions from\nreviewers.\n\nLAS or CSV clouds\n~~~~~~~~~~~~~~~~~\n\nThe ``point2dem`` program can take as inputs point clouds in LAS and CSV\nformats. These differ from point clouds created by stereo by being, in\ngeneral, not uniformly distributed. It is suggested that the user pick\ncarefully the output resolution for such files (``--dem-spacing``). If\nthe output DEM turns out to be sparse, the spacing could be increased,\nor one could experiment with increasing the value of\n``--search-radius-factor``, which will fill in small gaps in the output\nDEM by searching further for points in the input clouds.\n\nIt is expected that the input LAS files have spatial reference\ninformation such as WKT data. Otherwise it is assumed that the points\nare raw :math:`x,y,z` values in meters in reference to the planet\ncenter (ECEF).\n\nUnless the output projection is explicitly set when invoking\n``point2dem``, the one from the first LAS file will be used.\n\nFor LAS or CSV clouds it is not possible to generate triangulation (ray\nintersection) error maps or ortho images.\n\nFor CSV point clouds, the option ``--csv-format`` must be set. The option\n``--csv-srs`` containing a PROJ or WKT string needs to be specified to interpret\nthis data. If not provided, the value set in ``--t_srs`` will be used.\n\nOutput statistics\n~~~~~~~~~~~~~~~~~\n\nWhen ``point2dem`` concludes, it prints the *percentage of valid\npixels*, which is the number of pixels in the produced floating-point\nimage that are valid heights (not equal to the no-data value\nsaved in the geoheader) divided by the total number of pixels, and\nthen multiplied by 100. Note that if the DEM footprint is rotated in\nthe image frame, there will be blank regions at image corners, so\nnormally this percentage can be between 50 and 100 (or so) even when\nstereo correlation was fully successful.\n\n.. _point2dem_options:\n\nCommand-line options for point2dem\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n--t_srs <string (default: \"\")>\n    Specify the output projection as a GDAL projection string (WKT, GeoJSON, or\n    PROJ). If not provided, will be read from the point cloud, if available.\n    See :numref:`point2dem_proj` for details.\n\n-s, --tr, --dem-spacing <float (default: 0)>\n    Set output DEM resolution (in target georeferenced units per\n    pixel). These units may be in meters or degrees, depending on the\n    projection. If not specified, it will be computed automatically\n    (except for LAS and CSV files). Multiple spacings can be set\n    (in quotes) to generate multiple output files.\n\n-o, --output-prefix <string (default: \"\")>\n    Specify the output prefix. The output DEM will be \n    ``<output prefix>-DEM.tif``.\n\n--t_projwin <xmin ymin xmax ymax>\n    Specify a custom extent in georeferenced coordinates. This will be adjusted\n    to ensure that the grid points are placed at integer multiples of the grid\n    size, unless ``--gdal-tap`` is on.\n\n--datum <string>\n    Set the datum. This will override the datum from the input\n    images and also ``--t_srs``, ``--semi-major-axis``, and\n    ``--semi-minor-axis``.\n    Options:\n\n    - WGS84 (WGS_1984)\n    - WGS72\n    - NAD83\n    - NAD27\n    - Earth (alias for WGS84)\n    - D_MOON (1,737,400 meters)\n    - D_MARS (3,396,190 meters)\n    - MOLA (3,396,000 meters)\n    - Mars (alias for D_MARS)\n    - Moon (alias for D_MOON)\n\n--orthoimage\n    Write an orthoimage based on the texture files passed in as inputs (after\n    the point clouds). Must pass ``<output prefix>-L.tif`` when using this\n    option. Produces ``<output prefix>-DRG.tif``.\n\n--errorimage\n    Write an additional image, whose values represent the triangulation ray\n    intersection error in meters (the closest distance between the rays\n    emanating from the two cameras corresponding to the same point on the\n    ground). Filename is ``<output prefix>-IntersectionErr.tif``. If stereo\n    triangulation was done with the option ``--compute-error-vector``, this\n    intersection error will instead have 3 bands, corresponding to the\n    North-East-Down coordinates of that vector (:numref:`triangulation_options`),\n    unless the option ``--scalar-error`` is set.\n\n--nodata-value <float (default: -1e+6)>\n    Set the nodata value.\n\n--reference-spheroid <string (default: \"\")> \n    This is identical to the datum option.\n\n--semi-major-axis <float (default: 0)>\n    Explicitly set the datum semi-major axis in meters.\n\n--semi-minor-axis <float (default: 0)>\n    Explicitly set the datum semi-minor axis in meters.\n\n--sinusoidal\n    Save using a sinusoidal projection.\n\n--mercator\n    Save using a Mercator projection.\n\n--transverse-mercator\n    Save using a transverse Mercator projection.\n\n--orthographic\n    Save using an orthographic projection.\n\n--stereographic\n    Save using a stereographic projection. See also ``--auto-proj-center``.\n\n--oblique-stereographic\n    Save using an oblique stereographic projection.\n\n--gnomonic\n    Save using a gnomonic projection.\n\n--lambert-azimuthal\n    Save using a Lambert azimuthal projection.\n\n--utm <zone>\n    Save using a UTM projection with the given zone (:numref:`point2dem_utm`).\n\n--geographic\n    Save using the geographic projection (longitude and latitude).\n    Recommended only close to the equator.\n\n--proj-lon <float (default: NaN)>\n    The center of projection longitude. If not specified, it will be computed\n    automatically based on the estimated point cloud median (option\n    ``--auto-proj-center``).\n\n--proj-lat <float (default: NaN)>\n    The center of projection latitude. See also ``--proj-lon``.\n\n--auto-proj-center\n    Automatically compute the projection center, based on the median of a sample\n    of points in the cloud, unless ``--proj-lon`` and ``--proj-lat`` are set.\n    This is the default in the latest build, but should be set for ASP 3.4.0 and\n    earlier.\n\n--search-radius-factor <float>\n    Multiply this factor by ``--dem-spacing`` to get the search\n    radius. The DEM height at a given grid point is obtained as the weighted\n    average of heights of all points in the cloud within search radius of the\n    grid point, with the weight given by the Gaussian of the distance from the\n    grid point to the cloud point (see ``--gaussian-sigma-factor``). If not\n    specified, the default search radius is the maximum of user-set\n    ``--dem-spacing`` and internally estimated median DEM spacing, so the\n    default factor is about 1.\n\n--gaussian-sigma-factor <float (default: 0)>\n    The value :math:`s` to be used in the Gaussian\n    :math:`\\exp(-s*(x/grid\\_size)^2)` when computing the weight to give to a\n    cloud point's contribution to a given DEM grid point, with *x* the\n    distance in meters between the two. The default is -log(0.25) = 1.3863. A\n    smaller value will result in a smoother terrain.\n\n--csv-format <string (default: \"\")>\n    Specify the format of input CSV files as a list of entries\n    column_index:column_type (indices start from 1).  Examples:\n    ``1:x 2:y 3:z`` (a Cartesian coordinate system with origin at\n    planet center is assumed, with the units being in meters),\n    ``5:lon 6:lat 7:radius_m`` (longitude and latitude are in degrees,\n    the radius is measured in meters from planet center),\n    ``3:lat 2:lon 1:height_above_datum``,\n    ``1:easting 2:northing 3:height_above_datum``\n    (need to set ``--csv-srs``; the height above datum is in\n    meters). Can also use radius_km for column_type, when it is\n    again measured from planet center.\n\n--csv-srs <string (default: \"\")>\n    The PROJ or WKT string to use to interpret the entries in input CSV files.\n    If not specified, ``--t_srs`` will be used. See also\n    :numref:`point2dem_proj`.\n\n--filter <string (default: \"weighted_average\")>\n    The filter to apply to the heights of the cloud points within\n    a given circular neighborhood when gridding (its radius is\n    controlled via ``--search-radius-factor``).\n    Options:\n\n    * weighted_average (default),\n    * min\n    * max\n    * mean\n    * median\n    * stddev\n    * count (number of points)\n    * nmad (= 1.4826 \\* median(abs(X - median(X)))),\n    * *n*-pct (where *n* is a real value between 0 and 100, for example,\n      ``80-pct``, meaning, 80th percentile). Except for the default, the name of\n      the filter will be added to the obtained DEM file name, e.g.,\n      ``output-min-DEM.tif`` if ``--filter min`` is used.\n\n--gdal-tap\n    Ensure that the bounds of output products (as printed by ``gdalinfo``,\n    :numref:`gdal_tools`) are integer multiples of the grid size (as set with\n    ``--tr``). This implies that the centers of output pixels are offset by 0.5\n    times the grid size. When ``--t_projwin`` is set and its entries are integer\n    multiples of the grid size, that precise extent will be produced on output.\n    This functions as the GDAL ``-tap`` option.\n    \n--propagate-errors\n    Write files with names ``<output prefix>-HorizontalStdDev.tif``\n    and ``<output prefix>-VerticalStdDev.tif`` having the gridded\n    stddev produced from bands 5 and 6 of the input point cloud,\n    if this cloud was created with the ``parallel_stereo`` option\n    ``--propagate-errors`` (:numref:`error_propagation`). The same\n    gridding algorithm is used as for creating the DEM.\n\n--remove-outliers-params <pct factor (default: 75.0 3.0)>\n    Outlier removal based on percentage. Points with triangulation\n    error larger than pct-th percentile times factor and points\n    too far from the cluster of most points will be removed\n    as outliers.\n\n--use-tukey-outlier-removal\n    Remove outliers above Q3 + 1.5*(Q3 - Q1). Takes precedence over\n    ``--remove-outliers-params``.\n\n--max-valid-triangulation-error <float (default: 0)>\n    Outlier removal based on threshold. If positive, points with\n    triangulation error larger than this will be removed from the\n    cloud. Measured in meters. This option takes precedence over\n    ``--remove-outliers-params`` and ``--use-tukey-outlier-removal``.\n\n--scalar-error\n    If the point cloud has a vector triangulation error, ensure that the\n    intersection error produced by this program is the rasterized norm of\n    that vector. See also ``--error-image``.\n     \n-t, --output-filetype <string (default: tif)>\n    Specify the output file type.\n\n--proj-scale <float (default: 1)>\n    The projection scale (if applicable).\n\n--false-northing <float (default: 0)>\n    The projection false northing (if applicable).\n\n--false-easting <float (default: 0)>\n    The projection false easting (if applicable).\n\n--input-is-projected\n   Input data is already in projected coordinates, or is a point cloud in\n   Cartesian coordinates in a box such as [-10, 10]^3. Need not be spatially\n   organized. If both a top and bottom surface exists (such as indoors), one of\n   them must be cropped out. Point (0, 0, 0) is considered invalid. Must specify\n   a projection to interpret the data and the output grid size.\n    \n--rounding-error <float (default: 1/2^{10}=0.0009765625)>\n    How much to round the output DEM and errors, in meters (more\n    rounding means less precision but potentially smaller size on\n    disk). The inverse of a power of 2 is suggested. See also \n    ``--point-cloud-rounding-error`` and ``--save-double-precision-point-cloud``\n    for when the input point cloud is created (:numref:`triangulation_options`).\n\n--dem-hole-fill-len <integer (default: 0)>\n    Maximum dimensions of a hole in the output DEM to fill in, in pixels.\n    For large holes, use instead ``dem_mosaic`` (:numref:`dem_mosaic_extrapolate`).\n\n--orthoimage-hole-fill-len <integer (default: 0)>\n    Maximum dimensions of a hole in the output orthoimage to fill\n    in, in pixels. See also ``--orthoimage-hole-fill-extra-len``.\n    For large holes, use instead ``mapproject`` (:numref:`mapproject`).\n\n--orthoimage-hole-fill-extra-len <integer (default: 0)>\n    This value, in pixels, will make orthoimage hole filling more\n    aggressive by first extrapolating the point cloud. A small value\n    is suggested to avoid artifacts. Hole-filling also works better\n    when less strict with outlier removal, such as in\n    ``--remove-outliers-params``, etc.\n\n--max-output-size <columns rows>\n    Creating of the DEM will be aborted if it is calculated to\n    exceed this size in pixels.\n\n--median-filter-params <window_size (integer) threshold (float)>\n    If the point cloud height at the current point differs by more\n    than the given threshold from the median of heights in the\n    window of given size centered at the point, remove it as an\n    outlier. Use for example 11 and 40.0.\n\n--erode-length <integer (default: 0)>\n    Erode input point clouds by this many pixels at boundary (after\n    outliers are removed, but before filling in holes).\n\n--copc-win <float float float float>\n    Specify the region to read from a COPC LAZ file. The units are based on the\n    projection in the file. This is required unless ``--copc-read-all`` is set.\n    Specify as ``minx miny maxx maxy``, or ``minx maxy maxx miny``, with no\n    quotes. See :numref:`point2dem_las`.\n\n--copc-read-all\n    Read the full COPC file, ignoring the ``--copc-win`` option.\n        \n--x-offset <float (default: 0)>\n    Add a longitude offset (in degrees) to the DEM.\n\n--y-offset <float (default: 0)>\n    Add a latitude offset (in degrees) to the DEM.\n\n--z-offset <float (default: 0)>\n    Add a vertical offset (in meters) to the DEM.\n\n--use-alpha\n    Create images that have an alpha channel.\n\n-n, --normalized\n    Also write a normalized version of the DEM (for debugging).\n\n--threads <integer (default: 0)>\n    Select the number of threads to use for each process. If 0, use\n    the value in ~/.vwrc.\n\n--cache-size-mb <integer (default = 1024)>\n    Set the system cache size, in MB.\n\n--no-bigtiff\n    Tell GDAL to not create BigTiff files.\n\n--tif-compress <None|LZW|Deflate|Packbits (default: LZW)>\n    TIFF compression method.\n\n--cog\n    Write a cloud-optimized GeoTIFF (COG). See :numref:`cog_output`.\n\n-h, --help\n    Display the help message.\n"
  },
  {
    "path": "docs/tools/point2las.rst",
    "content": ".. _point2las:\n\npoint2las\n---------\n\nThis tool can convert point clouds generated by ASP\n(:numref:`triangulation_files`) and DEMs to the `LAS format\n<https://en.wikipedia.org/wiki/LAS_file_format>`_ It relies on the `PDAL library\n<https://pdal.io/en/latest/>`_, which is shipped with ASP. \n\nIf the input cloud has a datum, or the ``--datum`` option is specified,\nthen the output LAS file will be created in respect to this datum.\nOtherwise ECEF :math:`x,y,z` values will be saved.\n\nThe ``point2dem`` program (:numref:`point2dem`) can create a DEM from the LAS\nfile, and ``pc_align`` (:numref:`pc_align`) can align point clouds, including in\nthe LAS format. \n\nExamples\n~~~~~~~~\n\nCreate a LAS file::\n\n    point2las output-prefix-PC.tif -o output-prefix\n\nThis will produce the file ``output-prefix.las``. If the ``--compressed`` option\nis passed in, it will write instead ``output-prefix.laz``\n\nThe datum can be set as ``--datum WGS_1984`` or ``--datum D_MOON``, for example.\nIt is usually auto-guessed. A projection can be set with ``--t_srs``.\n\nSave the intensity of each triangulated point, as borrowed from the aligned (and\nnormalized) left image ``L.tif`` (:numref:`outputfiles`), in the ``W`` field of\nthe LAS file, in double precision::\n\n    point2las output-prefix-PC.tif                    \\\n      --save-intensity-from-image output-prefix-L.tif \\\n      -o output-prefix \n\nSave the triangulation error (:numref:`triangulation_error`) as the ``TextureU``\nfield in the LAS file in double precision::\n\n    point2las --save-triangulation-error \\\n      output-prefix-PC.tif               \\\n      -o output-prefix \n\nSave the standard deviations of the horizontal and vertical components of\nuncertainty (:numref:`error_propagation`) to the ``TextureV`` and ``TextureW``\nfields in the LAS file in double precision::\n\n    point2las --save-stddev \\\n      output-prefix-PC.tif  \\\n      -o output-prefix\n\nConvert a DEM to a LAS file::\n\n    point2las --dem dem.tif -o output-prefix\n    \nSee the command-line options in :numref:`point2las_options` for more details.\n\nValidation\n~~~~~~~~~~\n\nA LAS or LAZ file can be inspected as::\n\n    pdal info --all file.las\n\nOutlier removal\n~~~~~~~~~~~~~~~\n\nThe ``point2las`` program filters out outliers in the input point cloud using\nthe ray triangulation error (:numref:`triangulation_error`). Points with\nan error above a certain threshold are not included in the output LAS file.\n\nThe triangulation error can be saved as well (:numref:`point2las_options`).\n\nThis program first picks a desired number of samples from the cloud, sorts the\npositive triangulation errors from the sample (the errors equal to 0 correspond\nto invalid points, so these are ignored), and computes some statistical measures\nwhich are printed to the screen.  Those include the minimum, mean, standard\ndeviation, maximum, and the error percentiles at 25% (Q1), 50% (median, Q2) and\n75% (Q3).\n\nThen, given the desired percentile and factor in ``--remove-outliers-params``,\nit computes the error for this percentile and multiplies it by the factor.\nWith the default settings, this amounts to 3*Q3. \nThis value is used as the cutoff threshold to remove outliers. \n\nIf the option ``--use-tukey-outlier-removal`` is set, the outlier\ncutoff is computed as Q3 + 1.5*(Q3 - Q1)\n:cite:`tukey1977exploratory`. This takes precedence over the earlier approach.\n\nAlternatively, the user can specify a custom outlier cutoff via\n``--max-valid-triangulation-error``, when it will be used instead of\nany of the above.\n\nIf it is desired to not remove any outliers, the percentage in \n``--remove-outliers-params`` can be set to 100.\n\nAfter the LAS file is saved, the number of outliers and their\npercentage from the total number of points are printed on the\nscreen. Generally, the outlier threshold should not be so restrictive\nthat more than approximately 30% of the points are eliminated.\n\n.. _point2las_options:\n\nCommand-line options for point2las\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n--datum <string>\n    Create a geo-referenced LAS file in respect to this datum.  Options:\n\n    - WGS_1984\n    - D_MOON (1,737,400 meters)\n    - D_MARS (3,396,190 meters)\n    - MOLA (3,396,000 meters)\n    - NAD83\n    - WGS72\n    - NAD27\n    - Earth (alias for WGS_1984)\n    - Mars (alias for D_MARS)\n    - Moon (alias for D_MOON)\n\n--reference-spheroid <string>\n    This is identical to the datum option.\n\n--t_srs <string (default: \"\")>\n    Specify the output projection as a GDAL projection string (WKT, GeoJSON, or\n    PROJ). If not provided, will be read from the point cloud, if available.\n\n--compressed\n    Compress using laszip.\n\n-o, --output-prefix <filename>\n    Specify the output file prefix.\n\n--remove-outliers-params <pct factor (default: 75.0 3.0)>\n    Outlier removal based on percentage. Points with triangulation\n    error larger than pct-th percentile times factor will be removed\n    as outliers.\n\n--use-tukey-outlier-removal\n    Remove outliers above Q3 + 1.5*(Q3 - Q1) (:cite:`tukey1977exploratory`).\n    This takes precedence over ``--remove-outliers-params``.\n\n--max-valid-triangulation-error <float (default: 0)>\n    Outlier removal based on threshold. Points with triangulation error larger \n    than this, if positive (measured in meters) will be removed from the cloud.\n    Takes precedence over the above options.\n\n--save-intensity-from-image <filename>\n    Save the intensity of each triangulated point, as borrowed from the aligned left\n    image specified via this option, in the ``W`` field of the LAS file, in double\n    precision. This bumps the LAS file version from 1.2 to 1.4.\n\n--save-triangulation-error\n    Save the triangulation error (:numref:`triangulation_error`) from the input\n    point cloud as the ``TextureU`` field in the LAS file, in double precision.\n    Take into account the outlier filtering. This bumps the LAS file version\n    from 1.2 to 1.4.\n    \n--save-stddev\n    Save the standard deviations of the horizontal and vertical components of\n    uncertainty (:numref:`error_propagation`) from the ASP point cloud file to\n    the ``TextureV`` and ``TextureW`` fields in the LAS file, in double\n    precision. This bumps the LAS file version from 1.2 to 1.4.\n           \n--num-samples-for-outlier-estimation <integer (default: 1000000)>\n    Approximate number of samples to pick from the input cloud to find the \n    outlier cutoff based on triangulation error.\n\n--dem\n    Assume the input file is a DEM.\n\n--ecef\n    Save the point cloud in ECEF, rather than with a projection relative to a\n    datum.\n    \n--no-input-georef\n    Do not attempt to read the georeference from the input point cloud.\n    \n--threads <integer (default: 0)>\n    Select the number of threads to use for each process. If 0, use\n    the value in ~/.vwrc.\n \n--cache-size-mb <integer (default = 1024)>\n    Set the system cache size, in MB.\n\n--tile-size <integer (default: 256 256)>\n    Image tile size used for multi-threaded processing.\n\n--no-bigtiff\n    Tell GDAL to not create BigTiff files.\n\n--tif-compress <None|LZW|Deflate|Packbits (default: LZW)>\n    TIFF compression method.\n\n-v, --version\n    Display the version of software.\n\n-h, --help\n    Display this help message.\n\n"
  },
  {
    "path": "docs/tools/point2mesh.rst",
    "content": ".. _point2mesh:\n\npoint2mesh\n----------\n\nThe ``point2mesh`` tool produces a mesh file in ``.obj`` format that\ncan be visualized in any mesh viewer, such as Blender or MeshLab (see\n:numref:`blender` and :numref:`meshlab` for details).\n\nUnlike DEMs, the 3D mesh is not meant to be used as a finished\nscientific product. Rather, it can be used for fast visualization to\ncreate a 3D view of the generated terrain.\n\nThe ``point2mesh`` program requires a point cloud file or a DEM, and an\noptional texture file. For example, it can be used with\n``output-prefix-PC.tif`` and ``output-prefix-L.tif``, as output by\n``stereo``, or otherwise with ``output-prefix-DEM.tif`` and\n``output-prefix-DRG.tif``, with the latter two output by ``point2dem``\n(:numref:`point2dem`).\n\nWhen a texture file is not provided, a constant texture is applied. (A\nmesh viewer will still show a color variation that depends on the\nlocal curvature of the mesh.) In either case, ``point2mesh`` will\nproduce a mesh file in plain text format.\n\nThe ``-s`` (``--point-cloud-step-size``) flag sets the point cloud\nsub-sampling rate, and dictates the degree to which the 3D model\nshould be simplified. For 3D reconstructions, this can be essential\nfor producing a model that can fit in memory. The default value is 10,\nmeaning every 10th point is used in the X and Y directions. In other\nwords that mean only :math:`1/10^2` of the points are being used to\ncreate the model. Adjust this sampling rate according to how much\ndetail is desired, but remember that large models will impact the\nframe rate of the 3D viewer and affect performance.\n\nThe ``--texture-step-size`` flag sets the texture sub-sampling rate.\nFor visualization it may be preferable for the produced cloud to be\nrather coarse but for the texture overlaid on it to have higher\nresolution. This program enforces that the cloud subsampling rate be a\nmultiple of the texture subsampling rate, hence the sampled texture\nindices are a superset of the point cloud indices.\n\nExamples\n~~~~~~~~\n\n::\n\n    point2mesh --center --point-cloud-step-size 4  \\\n      --texture-step-size 2 output-prefix-PC.tif   \\\n      output-prefix-L.tif\n\n    point2mesh --center -s 2 output-prefix-DEM.tif \\\n       output-prefix-DRG.tif\n\n     meshlab output-prefix.obj\n\nThese examples use the option ``--center`` to shift the points towards\nthe origin, as otherwise, given that mesh vertices are measured from\nplanet center, and hence are large, mesh viewers, which typically use\nfloat32 precision, may render the mesh with artifacts without this\noption.\n\n(Note that older versions of MeshLab may have a hard time opening a\nmesh if the output prefix is a directory. In that case either open\nthe mesh from the GUI or change to that directory having the ``.obj``\nfile first and invoke MeshLab there.)\n\nCommand-line options\n~~~~~~~~~~~~~~~~~~~~\n\n-s, --point-cloud-step-size <integer (default: 10)>\n    Sample by picking one out of these many samples from the point cloud.\n\n--texture-step-size <integer (default: 2)>\n    Sample by picking one out of these many samples from the texture.\n\n--input-file <point-cloud-file>\n    Explicitly specify the input file.\n\n-o, --output-prefix <output-prefix>\n    Specify the output prefix.\n\n--texture-file <texture-file>\n    Explicitly specify the texture file.\n\n--center\n    Let the origin be the midpoint of the bounding box of the\n    cloud. Use this option if you are experiencing numerical precision\n    issues.\n\n--precision <integer (default: 17)>\n    How many digits of precision to save.\n\n--threads <integer (default: 0)>\n    Select the number of threads to use for each process. If 0, use\n    the value in ~/.vwrc.\n \n--cache-size-mb <integer (default = 1024)>\n    Set the system cache size, in MB.\n\n--tile-size <integer (default: 256 256)>\n    Image tile size used for multi-threaded processing.\n\n--no-bigtiff\n    Tell GDAL to not create BigTiff files.\n\n--tif-compress <None|LZW|Deflate|Packbits (default: LZW)>\n    TIFF compression method.\n\n-v, --version\n    Display the version of software.\n\n-h, --help\n    Display this help message.\n"
  },
  {
    "path": "docs/tools/refr_index.rst",
    "content": ".. _refr_index:\n\nrefr_index\n----------\n\nThe ``refr_index`` program computes the effective refraction index of water for\na specific satellite sensor band and given temperature and salinity. This has\napplications for shallow water bathymetry (:numref:`bathy_intro`).\n\nExamples\n~~~~~~~~\n\nSingle wavelength refraction index::\n\n    refr_index --salinity 35 --temperature 20 \\\n        --wavelength 532\n\nProvide a spectral response file::\n\n    refr_index --salinity 35 --temperature 20 \\\n      --spectral-response WV03_Green.csv\n\nThe result is printed to standard output.\n\nMethodology\n~~~~~~~~~~~\n\n.. _spectral_response:\n\nSpectral response\n^^^^^^^^^^^^^^^^^\n\nIt is assumed that a satellite band, such as Green for WorldView-3, records\nlight in a narrow range of wavelengths. The spectral response of the band\ncontains the sensitivity of the sensor to each wavelength in that band. An\neffective wavelength is first computed as the weighted average of the\nwavelengths, with the weights given by the spectral response. The refraction\nindex is then computed with this effective wavelength (:numref:`refr_model`).\n\nThe spectral response CSV file must have two columns, with the wavelength (in\nnanometers) in the first column, the relative response for that wavelength in\nthe second column. Use commas, spaces, or tabs as separators. The first line must\nbe a header and will be ignored.\n\nWavelengths outside the range 300-1100 nm will be ignored (skipped). Wavelengths\nin the range 300-1100 nm but outside 400-700 nm will be used but a warning will be\nprinted, as they are outside the validated range for the models\n(:numref:`refr_model`).\n\nExample::\n\n    wavelength response\n    521 0.78240309\n    522 0.78540934\n    523 0.79221241\n    524 0.79904049\n    525 0.80684987\n\nSalinity and temperature\n^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe salinity is measured in parts per thousand (ppt). Typical seawater has a\nsalinity of 35 ppt and freshwater has a salinity of 0 ppt.\n\nThe temperature is measured in degrees Celsius. The model expects values\nbetween 0°C and 30°C.\n\n.. _refr_model:\n\nModeling\n^^^^^^^^\n\nTwo methods are available for computing the refraction index:\n\n* Quan and Fry (:cite:`quan1995empirical`, `source code\n  <https://github.com/geojames/global_refractive_index_532>`_) -\n  directly handles salinity without interpolation. This is the default.\n\n* `Parrish (2020)\n  <https://research.engr.oregonstate.edu/parrish/index-refraction-seawater-and-freshwater-function-wavelength-and-temperature>`_ -\n  uses linear interpolation between freshwater (S=0) and seawater (S=35)\n  coefficients.\n\nUse the ``--mode`` switch to choose between these two.\n\n.. _refr_options:\n\nCommand-line options\n~~~~~~~~~~~~~~~~~~~~\n\n--salinity <float>\n    Salinity in parts per thousand (ppt). A good value is 35 ppt. Required.\n\n--temperature <float>\n    Temperature in degrees Celsius. Must be between 0 and 30. Required.\n\n--mode <string (default: Quan-Fry)>\n    Refraction index equation to use: ``Quan-Fry`` (default) or ``Parrish``. See\n    :numref:`refr_model` for details.\n\n--spectral-response <string (default: \"\")>\n    CSV file containing the spectral response of the sensor band. See an example\n    in :numref:`spectral_response`. Mutually exclusive with ``--wavelength``.\n\n--wavelength <float>\n    Calculate refraction index for single wavelength (nm). Validated range is\n    400-700 nm. A warning will be printed for wavelengths between 300-1100 nm\n    and outside the narrower range. There will be an error outside the 300-1100\n    nm range. Mutually exclusive with ``--spectral-response``.\n\n-v, --version\n    Display the version of software.\n\n-h, --help\n    Display this help message.\n"
  },
  {
    "path": "docs/tools/rig_calibrator.rst",
    "content": ".. _rig_calibrator:\n\nrig_calibrator\n--------------\n\nThe ``rig_calibrator`` program takes as input image and/or depth+image\ndatasets acquired with one or more rigs, each having one or more\ncameras. It finds the relationship among the rig sensors, the pose of\neach camera image, and refines the intrinsics of each sensor.\n\nThis tool was created as part of the `ISAAC\n<https://www.nasa.gov/directorates/spacetech/game_changing_development/projects/ISAAC>`_\nproject.\n\nThe ``rig_calibrator`` program was extensively tested with actual\nhardware and can model many real-world issues encountered with a\nrig. Its output can be used to create a fused surface mesh with\nseamless texture from each of its sensors, and, for ground data,\nalso terrain models and orthoimages.\n\nThe intrinsics of the sensors and each camera pose can also be\noptimized without the rig assumption. Then the sensors can acquire data\nat unrelated times (e.g., years apart). In that case the transforms\namong the sensors on the rig are not modeled, but any group of images\nacquired with the same sensor still share intrinsics. \n\nThe `Theia <https://github.com/sweeneychris/TheiaSfM>`_ package is invoked (and\nshipped with ASP) to find the initial camera poses (:numref:`theia_sfm`).\n \nSee :numref:`rig_calibrator_example` for a solved example,\n:numref:`sfm_iss` for a larger example covering a full ISS module, and\n:numref:`rig_msl` for an example using MSL Curiosity rover images.\n\n.. figure:: ../images/rig_calibrator_textures.png\n   :name: rig_calibrator_textures\n   :alt:  Rig calibrator texture outputs.\n\n   Textures obtained with the ``nav_cam`` and ``sci_cam`` rig cameras,\n   (left and right) projected onto the mesh obtained with the\n   ``haz_cam`` depth+image camera. The textures are nearly seamless\n   and agree very well when overlaid, which shows that the rig\n   calibration was successful. Note that the ``sci_cam`` pictures (on\n   the right) have some lightning variation due to the fact that\n   auto-exposure was used. The images show a portion of the Granite\n   Lab at NASA Ames.\n\nCapabilities\n~~~~~~~~~~~~\n\n- The cameras on the rig may be purely image cameras, or may have a depth\n  component. In the latter case, the transform from a camera's depth to image\n  coordinate system is modeled.\n- No calibration target is assumed, so the image/depth data are acquired in situ.\n- The solved-for camera poses and relationships among sensors can be registered \n  to real-world coordinates via user-selected control points.\n- All images acquired with one sensor are assumed to share intrinsics.\n  The user may choose which intrinsics of which sensor are optimized\n  or kept fixed, while the rig transforms and camera poses are optimized.\n- There can be zero, one, or more rigs.\n- It is not assumed that the rig sensors have a shared field of view. \n  Yet, a surface seen in one sensor should at some point be seen \n  also in other sensors.\n- The sensors on the rig may acquire data simultaneously or not. In\n  the latter case one sensor is expected to acquire\n  data frequently enough to be used to bracket data from the other\n  sensors in time using bilinear interpolation of the camera poses (if\n  the rig assumption is used).\n- A known time offset among the clocks of the various sensors on the \n  rig is modeled and can be optimized. (By default no offset is\n  assumed.)  \n- A preexisting mesh of the surface being imaged can be used as a\n  constraint (rays corresponding to the same feature must intersect\n  close to the mesh). Otherwise one can constrain the triangulated\n  points to not move too far from their original values.\n- Several quality metrics are printed on output, error reports\n  are saved to disk, and for each image with its optimized camera a\n  textured mesh with that image is created, for visual examination of\n  any misalignments (if an input mesh is given).\n\n.. _rig_data_conv:\n\nInput data conventions\n~~~~~~~~~~~~~~~~~~~~~~\n\nEach rig sensor must have a name, such as ``ref_cam``, ``alt_cam``,\netc. Each image must have a timestamp and be associated with a sensor.\nThis information can be specified with a file / directory structure\nor in a list. \n\nFile name convention\n^^^^^^^^^^^^^^^^^^^^\n\nIf an image name (without directory) has a timestamp followed by a sensor string\nas part of its name, those will be parsed. Example::\n\n    my_images/<text>10004.6<text><sensor name><text>.jpg\n\nThe last encountered sequence of digits (optionally followed by decimal period\nand more digits) before the sensor name will be the timestamp. The earliest\nencountered string matching the sensor name will be used.\n\n*It is strongly suggested to not have any other digits in the image name, as\nthat may confuse the parser.*\n\nAn example of this naming convention is in :numref:`orbital_rig`.\n\nDirectory structure\n^^^^^^^^^^^^^^^^^^^\n\nThe images can be organized in directories according to the convention::\n\n    <image dir>/<sensor name>/<timestamp><separator><tag>.<extension>\n\nFor example, two images acquired at time 1004.6 can be named::\n\n    my_images/ref_cam/10004.6_ref_cam.jpg\n    my_images/alt_cam/10004.6_alt_cam.jpg\n\nList format\n^^^^^^^^^^^\n\nWith the ``--image-sensor-list`` option, can pass in a list, in which each line\ncan look as::\n\n    <image dir>/image.tif ref_cam 10004.6\n\nThe second entry is the sensor name and the third is the timestamp.\n\nAssumptions about images\n^^^^^^^^^^^^^^^^^^^^^^^^\n\nAll image names (without directory path) must unique.\n\nThe images are expected to be 8 or 16 bit, with .jpg, .png, or .tif extension.\n\nAssumptions about the timestamp\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nA timestamp that is part of a file name must consist only of digits and a\ndecimal period. Anything starting with another character (including another\nperiod) will not be part of the timestamp. Hence, a value like 123.4e+5 will be\nconverted to 123.4. \n\nIf the rig constraint is used (omitting ``--no-rig``), and the sensors acquire\nthe images at independent times, the timestamp must represent the precise image\nacquisition time, in seconds, in double precision.\n\nWithout the rig constraint, or if all the sensors on the rig take pictures\nsimultaneously, the only assumption is that images have the same timestamp only\nif taken at the same time, with the precise timestamp value not used \n(but one must set ``--bracket-len`` to a small value). See also \n``--num-overlaps``.\n\nThe following bash script can copy the images to new names of the form\n``dir/<sensor>/<timestamp><sensor>.<ext>``::\n\n    mkdir -p new_images/my_cam\n    ext=\".jpg\"\n    ((timestamp=100000))\n    for image in $(ls old_images/*${ext}); do \n        /bin/cp -fv $image new_images/my_cam/${timestamp}.my_cam${ext}\n        ((timestamp++))\n    done\n\nDepth data\n^^^^^^^^^^\n\nIf for some images there is depth data, a depth data file must have the same\nname as the corresponding image, but with a ``.pc`` extension. Example::\n\n    my_images/alt_cam/10004.6_alt_cam.pc\n\nAll such depth cloud files will be loaded automatically alongside\nimages if present. See :numref:`point_cloud_format` for the file\nformat.\n\nThe reference sensor\n~~~~~~~~~~~~~~~~~~~~\n\nWith the rig constraint, if each sensor acquires images independently,\none of the sensors, named the *reference* sensor, should acquire\nimages frequently enough to help bracket the other sensors in time\nusing bilinear pose interpolation.\n\n.. _rig_config:\n\nConfiguration file\n~~~~~~~~~~~~~~~~~~\n\nWhat is known about the rig, or set of rigs, should be specified in a\nplain text file, with the following syntax::\n\n  # Anything after the pound sign is a comment\n  ref_sensor_name: <string>\n\n  # For each sensor on the rig, specify the following:\n  sensor_name: <string>\n  focal_length: <double> # units of pixel\n  optical_center: <double double> # units of pixel\n  distortion_coeffs: <n doubles>\n  distortion_type: <string>\n  image_size: <int, int>\n  distorted_crop_size: <int int> \n  undistorted_image_size: <int int> \n  ref_to_sensor_transform: <12 doubles>\n  depth_to_image_transform: <12 doubles>\n  ref_to_sensor_timestamp_offset: <double>\n\nExample (only one of the *N* sensors is shown)::\n\n  ref_sensor_name: nav_cam\n\n  sensor_name: nav_cam\n  focal_length: 621.04422\n  optical_center: 580.56426999999996 495.51236\n  distortion_coeffs: 1.0092038999999999\n  distortion_type: fov\n  image_size: 1280 960\n  distorted_crop_size: 1280 960\n  undistorted_image_size: 1500 1200\n  ref_to_sensor_transform: 1 0 0 0 1 0 0 0 1 0 0 0\n  depth_to_image_transform: 1 0 0 0 1 0 0 0 1 0 0 0\n  ref_to_sensor_timestamp_offset: 0\n\nIf there is more than one sensor on the rig, need to create a new value for\n``sensor_name``, and add a block as above for each sensor (without a new\n``ref_sensor_name``). \n\nThe first specified sensor must be the reference one.\n\nIf there is more than one rig, there should be a new line having \n``ref_sensor_name``, and then continue as above.\n\nSee a full example with two rigs in :numref:`sfm_iss_sample_rig_config`.\n\nThe lens distortion model can be one of ``no_distortion`` (zero distortion\nparameters), ``fov`` (1 distortion parameter), ``fisheye`` (4 distortion\nparameters), or ``radtan`` (radial-tangential, 4 or 5 distortion parameters).\nThe ``fisheye`` and ``radtan`` distortion models are the same as in OpenCV. The\n``fisheye`` model with one distortion parameter will be cast to ``fov`` (this is\nfor backward compatibility). See :numref:`pinholemodels` for more details.\n\nThe ``ref_to_sensor_transform`` field has the rotation (9 doubles, stored\nrow after row) and translation (3 doubles) transform from the\nreference sensor to the sensor with given name, while\n``depth_to_image_transform`` is the transform from the depth to image\ncoordinate systems of a given depth+image sensor. These must be set to\nthe identity transform (example below) if not known or not applicable.\nThat is usually the case for the first invocation of this tool, when\nthe ``ref_to_sensor_transform`` values are initialized based on the\ncamera poses of each input camera (unless\n``--use-initial-rig-transforms`` is set).\n\nThe value ``ref_to_sensor_timestamp_offset``, measured in seconds, is\nwhat should be added to the reference camera clock to get the time in\ncurrent sensor's clock. Set to 0 if the clocks are synchronized.\n\nThe ``image_size`` field has the image dimensions (width and height).\nThe ``distorted_crop_size`` has the dimensions of the region whose\ncenter is also the image center in which the given distortion model is\nvalid.  Normally it should be the whole image. The\n``undistorted_image_size`` has a somewhat generous overestimate of the image\ndimensions after undistortion.\n\nEducated guess can be provided for the quantities that are not known. This tool\ncan be used to optimize the focal length, optical center, and distortion\ncoefficients (the latter requires many interest point matches, espcially around\nimage corners). \n\nThe undistorted image size also need not\nbe known accurately. A tighter ``distorted_crop_size`` can help for\nimages with strong distortion if the distortion model is not\nexpressive enough to fit it precisely. But this then also eliminates\ninterest point matches in the corners of the image, which is not\ngood when solving for lens distortion.\n\nA file in the same format will be written in the output directory,\nwith the name::\n\n  <output dir>/rig_config.txt\n\nThis time the transforms among the rig sensors will be known, having\nbeen computed and optimized. \n\nSuch a file can be read with the option ``--rig-config``.\n\n.. _rig_calibrator_outputs:\n\nOutput files\n~~~~~~~~~~~~\n\nThe optimized rig configuration in the format described in :numref:`rig_config`\nis saved to::\n\n  <output dir>/rig_config.txt\n\nThe image names, camera poses, and interest point matches are stored\nin the NVM format. These are determined using the Theia\nstructure-from-motion software, and are read by ``rig_calibrator`` via the\n``--nvm`` option. The optimized camera poses and inlier interest point\nmatches will be written in the same format when this program finishes. \nThen the output nvm file name is::\n\n  <output dir>/cameras.nvm\n\nIn this file, the interest point matches are offset relative to the\noptical center. This file can be passed in to a new invocation\n``rig_calibrator`` via ``--nvm``. \n\nThe optical centers per image are written separately, to::\n\n  <output dir>/cameras_offsets.txt\n\nThis is because these are not part of the .nvm file format.\n\nIf the option ``--save-nvm-no-shift`` is specified, the additional\nfile::\n\n  <output dir>/cameras_no_shift.nvm\n\nwill be saved, in the same format as above, but without interest\npoints being shifted relative to the optical center for the\ncorresponding image. This file is is easier to plot, as there is\nno shift to undo, with the latter needing to be stored separately.\nTo read this back, use ``--read-nvm-no-shift``.\n\nThe produced .nvm files can be visualized with ``stereo_gui`` \n(:numref:`stereo_gui_nvm`). A submap can be extracted with ``sfm_submap``\n(:numref:`sfm_submap`).\n\nIn addition, a plain text file having just the list of images and\nworld-to-camera poses will be written, with the name::\n\n  <output dir>/cameras.txt\n\nEach line in this file has the format::\n\n<image dir>/<sensor name>/<timestamp>.<extension> <12 doubles>\n\nHere, the 12 values are the rows of the world-to-camera rotation and\nthen the world-to-camera translation. See the ``--camera-poses``\noption (:numref:`rig_opts`) for how this file can\nbe read back in. Note that camera's position and orientation in world\ncoordinates are determined by taking the inverse of this rotation +\ntranslation transform.\n\nThe inlier residuals for each camera (that is, norm of reprojection\nerrors, with reprojection errors defined as the difference of interest\npoints and projection of triangulated interest points back in the\ncamera), before and after optimization, are saved to::\n\n  <output dir>/<sensor name>-initial-residuals.txt\n  <output dir>/<sensor name>-final-residuals.txt\n\nin the format::\n\n  distorted_pixel_x distorted_pixel_y norm(residual_x, residual_y)\n\nThe convergence angle percentiles for each pair of images having\ninlier matches, together with the number of such matches for each pair,\nare saved to::\n\n  <output dir>/convergence_angles.txt\n\nThe option ``--export-to-voxblox`` saves files that can be used with ``voxblox_mesh`` (:numref:`voxblox_mesh`).\n\nThe list of images is saved (one per line) to::\n\n  <output dir>/image_list.txt\n  \nHow to export the data for use in bundle adjustment is discussed in\n:numref:`rc_ba`.\n\nExamples\n~~~~~~~~\n\n - A step-by-step-example (:numref:`rig_calibrator_example`). \n - A larger example covering a full ISS module (:numref:`sfm_iss`).\n - An example using MSL Curiosity rover images (:numref:`rig_msl`).\n - An orbital rig with DEM constraints (:numref:`orbital_rig`).\n\nNotes\n~~~~~\n\nOptimizing the camera poses (without control points or a preexisting\nmesh constraint) can change the scale and orientation of the camera\nset.\n\nThe output directory will have the optimized rig configuration and\ncamera poses for all images. These can be used as inputs for a\nsubsequent invocation, if needed to fine-tune things.\n\n.. _rig_constraints:\n\nConstraints on rig transforms\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nIn this section we assume that ``--no-rig`` is not set, so we have a rig.\n\nIf ``--camera-poses-to-float`` lists all sensors, all cameras can change in\nany way, as long as they are tied together by an (evolving) rig at all times.\n\nIf only the reference sensor is mentioned in ``--camera-poses-to-float``, the\ncameras for this sensor will change freely, but the other cameras will only\nchange as necessary to respect the rig constraint, while the rig configuration\nstays fixed. \n\nIf the reference sensor is not specified in ``--camera-poses-to-float``, the\ncameras for this sensor will stay fixed, while the transform from the reference\nsensor to another sensor will change only if that sensor is mentioned in\n``--camera-poses-to-float``.\n\nAn analogous parameter is ``--depth-to-image-transforms-to-float``.\n\nIndependent of these, the options ``--fix-rig-translations`` and\n``--fix-rig-rotations``, used separately or together, can constrain either the\ntranslation or rotation component of all transforms from the reference sensor to\nthe other sensors.\n\nThese options are described in :numref:`rig_opts`.\n\nConstraints on cameras\n~~~~~~~~~~~~~~~~~~~~~~\n\nThe parameter ``--camera-position-uncertainty`` constrains how far cameras can move.\nThis specifies the expected uncertainty (1 sigma, in meters) for camera positions. \nSmaller values create tighter constraints that may impede convergence. This is added\nto the cost function as the sum of squares of differences between initial and current\ncamera positions, divided by the uncertainty. \n\nConstraints on triangulated points\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nTriangulated points are, by default, set to not move too far, after\nregistration. See ``--tri-weight`` and ``--tri-robust-threshold``.\n\nThe ``--heights-from-dem`` option can constrain triangulated points to be close\nto a DEM. This is applicable for orbital images. The logic is as for bundle\nadjustment (:numref:`heights_from_dem`). An example is in :numref:`orbital_rig`.\n\nAdditional constraints are ``--depth-mesh-weight`` and ``--depth-tri-weight``\n(:numref:`rig_opts`).\n\n.. _rig_calibrator_registration:\n\nDetermination of scale and registration\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe cameras produced so far are in an arbitrary coordinate system. This section\ndescribes how to register them to known Cartesian coordinates. For registering\nrover cameras to a DEM, see :numref:`msl_registration`.\n\nTo transform the system of cameras to world coordinates, it is necessary to know\nthe Cartesian coordinates of at least three control points in the scene, and\nthen to pick the pixel of coordinates of each of these points in at least two\nimages.\n\nAll images used in registration must be for the same sensor. To find\nthe pixel coordinates, open, for example, a subset of the \ncamera images for one of the sensors in Hugin, such as::\n\n    hugin <image dir>/<sensor name>/*.jpg\n\nIt will ask to enter a value for the FoV (field of view). That value\nis not important since we won't use it. One can input 10 degrees,\nfor example. \n\nGo to the \"Expert\" interface, choose a couple of distinct images, and\nclick on a desired control point in both images.  Make sure the left\nand right image are not the same or highly similar, as that may result\nin poor triangulation and registration. Add that point. Then repeat\nthis process for all control points.\n\nSave the Hugin project to disk. Create a separate text file which\ncontains the world coordinates of the control points picked earlier,\nwith each line in the \"x y z\" format, and in the same order as the\nHugin project file.  That is to say, if a control point was picked in\nseveral image pairs in Hugin, it must show up also the same number of\ntimes in the text file, in the same order. In the xyz text file all\nlines starting with the pound sign (#) are ignored, as well as all\nentries on any line beyond three numerical values.\n\nThe dataset from :numref:`rig_calibrator_example` has examples\nof files used for registration, and shows how to pass these to the tool.\n\nAfter registration is done, it will print each transformed coordinate\npoint from the map and its corresponding measured point, as well as the \nerror among the two. That will look as follows::\n\n    transformed computed xyz -- measured xyz -- error norm (meters)\n    -0.0149 -0.0539  0.0120 --  0.0000  0.0000  0.0000 --  0.0472 img1.jpg img2.jpg\n     1.8587  0.9533  0.1531 --  1.8710  0.9330  0.1620 --  0.0254 img3.jpg img4.jpg\n\nEach error norm (last value), is the distance between a measured 3D\npoint and its computed value based on the registered cameras. If\nsome of them are too large, may be the measurements have some error,\nor the camera poses or intrinsics are not accurate enough.\n\nNote that the registration happens before the optimization, and that\ncan move the cameras around somewhat. Hence the registration\nis redone after the last optimization pass, unless\nthe flag ``--skip-post-registration`` is specified. \n\nThe initial registration does not change the depth-to-image\ntransforms, as those are presumed to be reasonably known, unlike the\nimage camera poses, which are determined normally using Theia and are\nin an arbitrary coordinate system. After the cameras and all\ntransforms are optimized, including the depth-to-image transforms, if\npresent, and if registration happens at the end, these transforms will\nbe changed as well, for consistency with the transforms among the\nimage cameras.\n\nIf the images cover a large area, it is suggested to use registration\npoints distributed over that area. Registration may not always produce\nperfect results since a structure-from-motion solution may drift over\nlarge distances.\n\nThe software does not force the camera poses to move individually to\nfit better the control points. Therefore, the cameras are always kept\nself-consistent, then the camera configuration has a single\nregistration transform applied to it to fit the control points.\nThe only approach to make the cameras individually conform more\nfaithfully to what is considered accurate geometry is to use the mesh\nconstraint, if such a prior surface mesh is available.\n\n.. _rig_calibration_stats:\n\nQuality metrics\n~~~~~~~~~~~~~~~\n\nThe rig calibrator will print out some statistics showing the residual errors\nbefore and after each optimization pass (before outlier removal at the\nend of the pass), as follows::\n    \n    The 25, 50, 75, and 100th percentile residual stats after opt\n    depth_mesh_x_m: 0.0018037 0.0040546 0.011257 0.17554 (742 residuals)\n    depth_mesh_y_m: 0.0044289 0.010466 0.025742 0.29996 (742 residuals)\n    depth_mesh_z_m: 0.0016272 0.0040004 0.0080849 0.067716 (742 residuals)\n    depth_tri_x_m: 0.0012726 0.0054119 0.013084 1.6865 (742 residuals)\n    depth_tri_y_m: 0.0010357 0.0043689 0.022755 3.8577 (742 residuals)\n    depth_tri_z_m: 0.00063148 0.0023309 0.0072923 0.80546 (742 residuals)\n    haz_cam_pix_x: 0.44218 0.99311 2.1193 38.905 (819 residuals)\n    haz_cam_pix_y: 0.2147 0.49129 1.3759 95.075 (819 residuals)\n    mesh_tri_x_m: 0.0002686 0.00072069 0.014236 6.3835 (5656 residuals)\n    mesh_tri_y_m: 9.631e-05 0.00032232 0.057742 9.7644 (5656 residuals)\n    mesh_tri_z_m: 0.00011342 0.00031634 0.010118 1.0238 (5656 residuals)\n    nav_cam_pix_x: 0.098472 0.28129 0.6482 155.99 (47561 residuals)\n    nav_cam_pix_y: 0.11931 0.27414 0.55118 412.36 (47561 residuals)\n    sci_cam_pix_x: 0.33381 0.70169 1.4287 25.294 (2412 residuals)\n    sci_cam_pix_y: 0.24164 0.52997 0.90982 18.333 (2412 residuals)\n\nThese can be helpful in figuring out if the calibration result is\ngood.  The errors whose name ends in \"_m\" are in meters and measure\nthe absolute differences between the depth clouds and mesh\n(depth_mesh), between depth clouds and triangulated points\n(depth_tri), and between mesh points and triangulated points\n(mesh_tri), in x, y, and z, respectively. The ``mesh`` residuals will\nbe printed only if a mesh is passed on input and if the mesh-related\nweights are positive. \n\nSome outliers are unavoidable, hence some of these numbers can be big\neven if the calibration overall does well (the robust threshold set\nvia ``--robust-threshold`` does not allow outliers to dominate). See\nthe option ``--max-reprojection-error`` for filtering outliers. It is\nbest to not filter them too aggressively unless one has very high\nconfidence in the modeling of the cameras.\n \nSource of errors can be, as before, inaccurate intrinsics, camera\nposes, or insufficiently good modeling of lens distortion.\n\nWhen each rig sensor has its own clock, or acquires images at is own\nrate, the discrepancy among the clocks (if the timestamp offsets are\nnot set correctly) or insufficiently tight bracketing (cameras moving\ntoo much between acquisitions meant to serve as brackets) may be source\nof errors as well. In this case one can also try the tool with\nthe ``--no-rig`` option, when the cameras are decoupled and see if this\nmakes a difference.\n\nHandling failures\n~~~~~~~~~~~~~~~~~\n\nThis software was very carefully tested in many circumstances, and it\nis though to be, by and large, correct, and it should normally co-register\nall images to within 0-5 pixels, and likely even better if distortion\nis modeled accurately. (Quality can be verified as above, by projecting\nthe camera images onto a mesh obtained either from depth clouds or stereo.)\n\nIf it performs poorly, it may be because:\n\n- Image timestamps are not accurate. Then try using the\n  ``--no-rig`` option, adjust the timestamp offsets, or use tighter\n  bracketing with ``--bracket-len``.\n\n- Distortion is very strong and not modeled well. Then reduce the\n  domain of each image by making ``distorted_crop_size`` smaller in the\n  rig configuration, or switch to a different distortion model, or allow\n  distortion to be optimized by this tool.\n  \n- The best-fit distortion model can be inaccurate unless there are many interest\n  point matches, especially in the image periphery. See\n  :numref:`theia_sfm_config` for how to get more matches. The produced matches\n  should be visualized in ``stereo_gui`` (:numref:`stereo_gui_nvm`).  \n\n- Some image pairs have insufficient matches, which may result in poor initial\n  camera poses. This can be addressed as for distortion, in the paragraph above.\n  This tool has good robustness to that when the rig constraint is used (so\n  without ``--no-rig``) as then the transforms between rig sensors are found by\n  using the median of transforms derived from individual image pairs, and the \n  same rig transform applies for all acquisitions.\n\n- Some weights passed in (e.g., ``--tri-weight``,\n  ``--mesh-tri-weight``) may be too high and prevent convergence.\n\n- The options ``--camera-poses-to-float`` (:numref:`rig_constraints`),\n  ``--intrinsics-to-float``, ``--depth-to-image-transforms-to-float``, were not\n  all specified and hence some optimizations did not take place.\n\nFor understanding issues, it is strongly suggested to drastically\nreduce the problem to perhaps one or two images from each sensor, and\nturn on the debugging flags ``--save-matches``,\n``--export-to-voxblox``, ``--save-transformed-depth-clouds``,\n``--out-texture-dir``. Then, the images can be projected individually\nonto a mesh, and/or individual transformed clouds can be inspected. \nSee an example output in :numref:`rig_calibrator_textures`.\n\nSee note on validation in :numref:`msl_validation` for when working\nwith orbital or ground-level images.\n\nOne should also look at the statistics printed by the tool.\n\n.. _point_cloud_format:\n\nPoint cloud file format\n~~~~~~~~~~~~~~~~~~~~~~~\n\nThe depth point clouds (for the depth component of cameras, if\napplicable) are saved to disk in binary. The first three entries are\nof type ``int32``, having the number of rows, columns and channels (whose\nvalue is 3). Then, one iterates over rows, for each row iterates over\ncolumns, and three ``float32`` values corresponding to x, y, z\ncoordinates are read or written. If all three values are zero, this\npoint is considered to be invalid, but has to be read or written\nto ensure there exists one depth point for each corresponding image pixel.\n\nNote that the ``float32`` datatype has limited precision, but is adequate,\nunless the measurements are ground data taken from a planet's orbit.\n\n.. _rc_ba:\n\nInterfacing with bundle_adjust\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThis program's program's output control network in .nvm format (including camera\nposes and interest point matches between the images) can be read by\n``bundle_adjust`` (:numref:`bundle_adjust`), and vice-versa. The details are in\n:numref:`ba_nvm`.\n\nThe optimized cameras produced with ``rig_calibrator`` can be saved in the ASP\nPinhole format (:numref:`pinholemodels`) with the option\n``--save-pinhole-cameras``.\n\nThe list of saved cameras will be in the file::\n\n  rig_out/camera_list.txt\n\nwhile the list of input images will be in::\n\n  rig_out/image_list.txt\n\nHere and below we assume that the output directory is ``rig_out``.\n\nIf ``rig_calibrator`` is called with the option ``--save-matches``, it will save\nthe inlier interest point matches in the ASP ``bundle_adjust``\n(:numref:`bundle_adjust`) format with the proper naming convention\n(:numref:`ba_match_files`).\n\nThese can then be inspected in ``stereo_gui``\n(:numref:`stereo_gui_pairwise_matches`) as::\n\n  stereo_gui $(cat rig_out/image_list.txt) \\\n    rig_out/matches/run --pairwise-matches\n  \nIf both the matches and cameras are saved, ``bundle_adjust`` can be\ninvoked as::\n\n  bundle_adjust                              \\\n    --image-list rig_out/image_list.txt      \\\n    --camera-list rig_out/camera_list.txt    \\\n    --inline-adjustments                     \\\n    --match-files-prefix rig_out/matches/run \\\n    -o ba/run\n\nFor a large number of images it is preferable to use the NVM file instead of the\nmatch files as input to ``bundle_adjust``, as described earlier.\n\nIn order for exporting data this way to work, all input image names (without\ndirectory path) must be unique, as the ASP bundle adjustment counts on that. See\nthe input naming convention in :numref:`rig_data_conv`.\n\nHow to register the produced cameras to the ground is discussed in\n:numref:`msl_registration`.\n\nUsage\n~~~~~\n\n::\n\n    rig_calibrator --rig-config <rig_config.txt>  \\\n      --nvm <input.nvm>                           \\\n      --image-sensor-list <image_sensor_list.txt> \\\n      -o <output_dir> [options]\n\n.. _rig_opts:\n\nCommand-line options\n~~~~~~~~~~~~~~~~~~~~\n\n--rig-config <string (default: \"\")>\n    Read the rig configuration from file.\n\n--nvm <string (default: \"\")>\n    Read images and camera poses from this nvm file, as exported by Theia.\n\n--image-sensor-list <string (default: \"\")>\n    Read image name, sensor name, and timestamp, from each line in this list.\n    The order need not be as in the nvm file. Alternatively, a directory\n    structure can be used. See :numref:`rig_data_conv`.\n\n--robust-threshold <double (default: 0.5)>\n    Residual pixel errors and 3D point residuals (the latter multiplied by\n    corresponding weight) much larger than this will be logarithmically\n    attenuated to affect less the cost function. See also\n    ``--tri-robust-threshold``.\n\n--affine-depth-to-image\n    Assume that the depth-to-image transform for each depth + image camera is an\n    arbitrary affine transform rather than scale * rotation + translation. See\n    also ``--float-scale``.\n\n--bracket-len <double (default: 0.6)>\n    Lookup non-reference cam images only between consecutive ref cam images\n    whose distance in time is no more than this (in seconds), after adjusting\n    for the timestamp offset between these cameras. It is assumed the rig moves\n    slowly and uniformly during this time. A large value here will make the\n    calibrator compute a poor solution but a small value may prevent enough\n    images being bracketed. The timestamp (in seconds) is part of the image\n    name. See also ``--bracket-single-image``.\n\n--num-passes <integer (default: 2)>\n    How many passes of optimization to do. Outliers will be removed after every\n    pass. Each pass will start with the previously optimized solution as an\n    initial guess. Mesh intersections (if applicable) and ray triangulation will\n    be recomputed before each pass.\n\n--camera-poses-to-float <string (default: \"\")>\n    Specify the cameras for which sensors can have their poses floated. Example:\n    'cam1 cam3'.  See more details in :numref:`rig_constraints`.\n\n--fix-rig-translations\n    Fix the translation component of the transforms between the sensors on a\n    rig. Works only when ``--no-rig`` is not set.\n\n--fix-rig-rotations\n    Fix the rotation component of the transforms between the sensors on a rig.\n    Works only when ``--no-rig`` is not set.\n\n--camera-position-uncertainty <string (default: \"\")>\n    Camera position uncertainty (1 sigma, in meters). This strongly constrains\n    the movement of cameras, potentially at the expense of accuracy. Specify as\n    a single value.\n\n--heights-from-dem <string (default: \"\")>\n    Use this DEM to constrain the triangulated points. The uncertainty of the\n    DEM is specified via ``--heights-from-dem-uncertainty``.\n\n--heights-from-dem-uncertainty <double (default: -1)>\n    Uncertainty (1 sigma) for ``--heights-from-dem``. A smaller value constrains\n    more the triangulated points to the DEM specified via ``--heights-from-dem``.\n\n--heights-from-dem-robust-threshold <double (default: 0.1)>\n    Robust threshold for residual errors in triangulated points relative to DEM\n    specified via ``--heights-from-dem``. This is applied after the point\n    differences are divided by ``--heights-from-dem-uncertainty``. It will\n    attenuate large height differences. Set to 0 to turn off.\n\n--tri-weight <double (default: 0.1)>\n    The weight to give to the constraint that optimized triangulated points stay\n    close to original triangulated points. A positive value will help ensure the\n    cameras do not move too far, but a large value may prevent convergence. This\n    does not gets set for triangulated points at which ``--heights-from-dem`` or\n    ``--mesh`` constraints are applied.\n\n--tri-robust-threshold <double (default: 0.1)>\n    The robust threshold to use with the triangulation weight. Must be positive.\n    See also ``--robust-threshold``.\n\n--use-initial-triangulated-points\n    Use the triangulated points from the input nvm file. Together with\n    ``--tri-weight``, this ensures the cameras do not move too far from the\n    initial solution. This will fail if additional interest point matches are\n    created with ``--num-overlaps``. If registration is used, the initial\n    triangulated points are transformed appropriately.\n\n--depth-mesh-weight <double (default: 0)>\n    A larger value will give more weight to the constraint that the depth clouds\n    stay close to the mesh. Not suggested by default.\n\n--depth-to-image-transforms-to-float <string (default: \"\")>\n    Specify for which sensors to float the depth-to-image transform (if depth\n    data exists). Example: 'cam1 cam3'.\n\n--depth-tri-weight <double (default: 1000)>\n    The weight to give to the constraint that depth measurements agree with\n    triangulated points. Use a bigger number as depth errors are usually on the\n    order of 0.01 meters while reprojection errors are on the order of 1 pixel.\n\n--float-scale\n    If to optimize the scale of the clouds, part of depth-to-image transform. If\n    kept fixed, the configuration of cameras should adjust to respect the given\n    scale. This parameter should not be used with ``--affine-depth-to-image``\n    when the transform is affine, rather than rigid and a scale.\n\n--float-timestamp-offsets\n    If to optimize the timestamp offsets among the cameras. This is\n    experimental.\n\n--camera-poses <string (default: \"\")>\n    Read the images and world-to-camera poses from this list. The same format is\n    used as when this tool saves the updated poses in the output directory. It\n    is preferred to read the camera poses with the ``--nvm`` option, as then\n    interest point matches will be read as well.\n\n--initial-max-reprojection-error <double (default: 300)>\n    If filtering outliers, remove interest points for which the reprojection\n    error, in pixels, is larger than this. This filtering happens when matches\n    are created, before cameras are optimized, and a big value should be used if\n    the initial cameras are not trusted.\n\n--intrinsics-to-float <string (default: \"\")>\n    Specify which intrinsics to float for each sensor. Example:\n    'cam1:focal_length,optical_center,distortion cam2:focal_length'.\n\n--max-ray-dist <double (default: 100)>\n    The maximum search distance from a starting point along a ray when\n    intersecting the ray with a mesh, in meters (if applicable).\n\n--max-reprojection-error <double (default: 25)>\n    If filtering outliers, remove interest points for which the reprojection\n    error, in pixels, is larger than this. This filtering happens after each\n    optimization pass finishes, unless disabled. It is better to not filter too\n    aggressively unless confident of the solution.\n\n--mesh <string (default: \"\")>\n    Use this mesh to help constrain the calibration (in .ply format). Must use a\n    positive ``--mesh-tri-weight``.\n\n--mesh-tri-weight <double (default: 0)>\n    A larger value will give more weight to the constraint that triangulated\n    points stay close to a preexisting mesh. Not suggested by default.\n\n--min-ray-dist <double (default: 0)>\n    The minimum search distance from a starting point along a ray when\n    intersecting the ray with a mesh, in meters (if applicable).\n\n--no-rig\n    Do not assumes the cameras are on a rig. Hence, the pose of any camera of\n    any sensor type may vary on its own and not being tied to other sensor\n    types. See also ``--camera-poses-to-float``.\n\n--num-iterations <integer (default: 100)>\n    How many solver iterations to perform in calibration.\n\n--num-threads <integer>\n    How many threads to use. (default: Number of cores on a machine).\n\n--num-match-threads <integer (default: 8)>\n    How many threads to use in feature detection/matching. A large number can\n    use a lot of memory.\n\n-o, --out-dir <string (default: \"\")>\n    Save in this directory the camera intrinsics and extrinsics. See also\n    ``--save-matches``, ``--verbose``.\n\n--out-texture-dir <string (default: \"\")>\n    If non-empty and if an input mesh was provided, project the camera images\n    using the optimized poses onto the mesh and write the obtained .obj files in\n    the given directory.\n\n--num-overlaps <integer (default: 0)>\n    Match an image with this many images (of all camera types for the same rig)\n    following it in increasing order of timestamp value. Set to a positive value\n    only if desired to find more interest point matches than read from the input\n    nvm file. Not suggested by default.\n\n--no-nvm-matches\n    Do not read interest point matches from the nvm file. So read only camera\n    poses. This implies ``--num-overlaps`` is positive, to be able to find new\n    matches.\n\n--parameter-tolerance <double (default: 1e-12)>\n    Stop when the optimization variables change by less than this.\n\n--min-triangulation-angle <double (default: 0.01)>\n    If filtering outliers, remove triangulated points for which all rays\n    converging to it make an angle (in degrees) less than this. Note that some\n    cameras in the rig may be very close to each other relative to the\n    triangulated points, so care is needed here.\n\n--registration\n    If true, and registration control points for the sparse map exist and are\n    specified by ``--hugin-file`` and ``--xyz-file``, register all camera poses\n    and the rig transforms before starting the optimization. For now, the\n    depth-to-image transforms do not change as result of this, which may be a\n    problem. To apply the registration only, use zero iterations.\n\n--skip-post-registration\n    If true and registration to world coordinates takes place, do not apply the\n    registration again after the cameras are optimized. This is usually not\n    recommended, unless one is quite confident that other constraints (such as\n    using ``--tri-weight`` or ``--mesh-tri-weight``) are sufficient to keep the\n    cameras from drifting.\n\n--hugin-file <string (default: \"\")>\n    The path to the hugin .pto file used for registration.\n\n--xyz-file <string (default: \"\")>\n    The path to the xyz file used for registration.\n\n--read-nvm-no-shift\n    Read an nvm file assuming that interest point matches were not shifted to\n    the origin.\n\n--save-nvm-no-shift\n    Save the optimized camera poses and inlier interest point matches to <out\n    dir>/cameras_no_shift.nvm. Interest point matches are not offset relative to\n    the optical center, which is not standard, but which allows this file to be\n    self-contained and for the matches to be drawn with ``stereo_gui``.\n\n--save-matches\n    Save the interest point matches (all matches and inlier matches after filtering). ``stereo_gui`` can be used to visualize these (:numref:`rc_ba`).\n\n--export-to-voxblox\n    Save the depth clouds and optimized transforms needed to create a mesh with ``voxblox`` (if depth clouds exist).\n\n--save-transformed-depth-clouds\n    Save the depth clouds with the camera transform applied to them to make them\n    be in world coordinates.\n\n--save-pinhole-cameras\n    Save the optimized cameras in ASP's Pinhole format\n    (:numref:`rc_ba`). The distortion model gets saved if it is of\n    ``radtan`` type (OpenCV radial-tangential distortion model).\n\n--timestamp-offsets-max-change <double (default: 1)>\n    If floating the timestamp offsets, do not let them change by more than this\n    (measured in seconds). Existing image bracketing acts as an additional\n    constraint.\n\n--use-initial-rig-transforms\n    Use the transforms between the sensors (``ref_to_sensor_transform``) of the\n    rig specified via ``--rig-config`` to initialize all non-reference camera\n    poses based on the reference camera poses and the rig transforms. If this\n    option is not set, derive the rig transforms from the poses of individual\n    cameras.\n\n--fixed-image-list <string>\n    A file having a list of images (separated by spaces or newlines) whose\n    camera poses should be fixed during optimization. These can be only\n    reference sensor images when the rig constraint is on.\n\n--bracket-single-image\n    If more than one image from a given sensor is acquired between two\n    consecutive reference sensor images, as measured by timestamps, keep only\n    one, choosing the image that is closest to the midpoint of the interval\n    formed by reference sensor timestamps. Only applicable without ``--no-rig``.\n   \n--extra-list <string (default: \"\")>\n    Add to the SfM solution the camera poses for the additional images/depth\n    clouds in this list. Use bilinear interpolation of poses in time and nearest\n    neighbor extrapolation (within ``--bracket-len``) and/or the rig constraint\n    to find the new poses (will be followed by bundle adjustment refinement).\n    This can give incorrect results if the new images are not very similar or\n    not close in time to the existing ones. This list can contain entries for\n    the data already present.\n\n--nearest-neighbor-interp\n    Use nearest neighbor interpolation (in time) when inserting extra camera\n    poses.\n\n--verbose\n    Print a lot of verbose information about how matching goes.\n\n-v, --version\n    Display the version of software.\n\n-h, --help\n    Display the help message.\n\n"
  },
  {
    "path": "docs/tools/ros.rst",
    "content": ".. _ros_tools:\n\nROS bag handling tools\n----------------------\n\nASP provides a couple of Python scripts that can query and extract\nimages and depth clouds from a ROS bag. These are stored in the\n``libexec`` directory of the ASP distribution, as they use the local\nsystem's Python rather than the Python shipped with ASP. It is\nassumed that ROS is installed on the local system.\n\nThese tools are motivated by the fact that robot Structure-from-Motion\ndatasets often come in ROS bags. For context and examples, see\n:numref:`sfm_iss`.\n\n.. _ros_tools_list:\n\nlist_timestamps\n^^^^^^^^^^^^^^^\n\nWrite the list of timestamps for all data in the bag for given\ntopics. Example usage::\n\n    /usr/bin/python                        \\\n      /path/to/ASP/libexec/list_timestamps \\\n      --bag bag.bag --list bag_list.txt    \\\n      --topics \"/topic1 /topic2\"\n \nThe output list will have entries of the form::\n\n    1654694879.1690574 /topic1\n\nThe first value is a timestamp, in seconds since epoch. It is not\nthe message timestamp, which is the time the message arrived at,\nbut the timestamp saved in the message header, which is assumed\nto have the creation time of an image or depth cloud. \n\n.. _ros_tools_extract:\n\nextract_bag\n^^^^^^^^^^^\n\nExtract images and depth clouds from a bag. See\n:numref:`sfm_isis_data_prep` for usage.\n\nCommand line options:\n\n\n``--bag`` <string>\n  Input bag.\n``--topics`` <string>\n  A list of topics, in quotes, having image, compressed image, or\n  point cloud (depth) data.\n``--dirs``  <string>\n  A list of directories, in quotes, one for each topic, \n  in which to save the data for that topic.\n``--timestamp_list`` <string>\n  Extract data for the timestamps in this list. If not set,\n  extract all data. Each line in this file must contain\n  a number of the form <digits>.<digits> (the timestamp) and perhaps\n  other text as well, or it will be ignored. So, a filename containing\n  a timestamp as part of its name will be accepted.\n``--timestamp_tol`` <float>\n  If set, extract the data for each the given topics whose timestamps are closest\n  to the ones in the input list, within this tolerance, in\n  seconds. This should be kept small. It is assumed\n  the bag stores the data for each topic in increasing value of\n  timestamp.\n``--approx_timestamp`` \n  If using ``--timestamp_tol``, change the timestamp of the data being\n  saved (which becomes part of the output filename) to be the closest\n  timestamp in the input list. \n"
  },
  {
    "path": "docs/tools/sat_sim.rst",
    "content": ".. _sat_sim:\n\nsat_sim\n-------\n\nThe ``sat_sim`` program simulates a satellite traveling around a planet and\ntaking pictures. It can either create camera models (Pinhole or linescan), or\nread them from disk. In either case it creates synthetic images for the given\ncameras. This tool can model camera jitter, a rig, and recording acquisition\ntime.\n\nThe inputs are a DEM and georeferenced image (ortho image) of the area of\ninterest. See :numref:`sat_sim_dem` for how to create such inputs.\n\nIf the input cameras are not specified, the orbit is determined by given\nendpoints. It is represented as a straight edge in the projected coordinate\nsystem of the DEM, which results in an arc around the planet. \n\nThe images are created with bicubic interpolation in the ortho image and are\nsaved with float pixels. Missing pixels will have nodata values.\n\nIf the cameras are created from scratch, the camera view can follow a custom\npath on the surface with varying orientation (:numref:`sat_sim_custom_path`), or\nthe cameras can have a fixed orientation, without\n(:numref:`sat_sim_roll_pitch_yaw`) and with\n(:numref:`sat_sim_roll_pitch_yaw_ground`) ground constraints.\n\nThe cameras are assumed to be of Pinhole (Frame) type by default, and are saved\nas .tsai files (:numref:`pinholemodels`). The option ``--save-as-csm`` can be\nused to save the cameras in CSM format (:numref:`csm`). Linescan cameras are\nsupported as well (:numref:`sat_sim_linescan`). Lens distortion is not modeled.\n\nSeveral use cases are below. \n\n.. _sat_sim_prior:\n\nPrior frame or linescan cameras\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n::\n  \n    sat_sim --dem dem.tif           \\\n      --ortho ortho.tif             \\\n      --camera-list camera_list.txt \\\n      --image-size 800 600          \\\n      -o run/run\n\nThe camera names in the list should be one per line. The produced image names\nwill be created from camera names by keeping the filename (without directory\nname) and replacing the extension with ``.tif``. They will start with specified\noutput prefix. Hence, if the input camera is ``path/to/camera.tsai``, the output\nimage will be ``run/run-camera.tif``.\n\nThe value of ``--image-size`` should be chosen so that the ground sample\ndistance of the produced images is close to the one of the input ortho image. \n\nTo see how a created image projects onto the ground, run ``mapproject``\n(:numref:`mapproject`) as::\n\n    mapproject dem.tif run/run-camera.tif path/to/camera.tsai \\\n      camera.map.tif\n\nThe images can be overlaid in ``stereo_gui`` (:numref:`stereo_gui`).\n\nA perturbation can be apply to given cameras (:numref:`sat_sim_perturb`).\n\n.. _sat_sim_nadir:\n\nCreate nadir-pointing frame cameras\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n::\n  \n    sat_sim --dem dem.tif          \\\n        --ortho ortho.tif          \\\n        --first 397.1 400.7 450000 \\\n        --last 397.1 500.7 450000  \\\n        --num 5                    \\\n        --focal-length 450000      \\\n        --optical-center 500 500   \\\n        --image-size 1000 1000     \\\n        -o run/run\n\nSee :numref:`sat_sim_roll_pitch_yaw` for how to apply a custom rotation\nto the cameras.\n\nThe first and last cameras will be located as specified by ``--first`` and\n``--last`` (:numref:`sat_sim_options`). See also ``--frame-rate``.\n\nIn this example, the camera is 450,000 m above the ground and the\nfocal length is 450,000 pixels. If the magnitude of DEM heights is within\nseveral hundred meters, this will result in the ground sample distance being\naround 1 meter per pixel.\n\nThe resulting cameras will point in a direction perpendicular to the orbit\ntrajectory. They will point precisely to the planet center only if the orbit\nendpoints are at the same height and the datum is spherical.\n\nThe produced image and camera names will be along the lines of::\n    \n    run/run-10000.tif\n    run/run-10000.tsai\n\nThese names will be adjusted per sensor, if a rig is present\n(:numref:`sat_sim_rig`), or if time is modeled (:numref:`sat_sim_time`).\n\n.. figure:: ../images/sfm_view_nadir_clip.png\n   :name: sat_sim_illustration_nadir_clip\n   :alt:  sat_sim_illustration_nadir_clip\n   \n   Illustration of ``sat_sim`` creating nadir-looking cameras. \n   See :numref:`orbit_plot` for how to visualize the roll, pitch, \n   and yaw angles of the cameras with ``orbit_plot.py``.\n   Plotted with ``sfm_view`` (:numref:`sfm_view`).\n\n.. _sat_sim_custom_path:\n\nFollow custom ground path with varying orientation\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nGiven two locations on the DEM, each specified by the column and row of DEM\npixel, to ensure that the center of the camera footprint travels along the straight\nedge (in DEM pixel coordinates) between these, use options as::\n\n    --first-ground-pos 484.3 510.7 \\\n    --last-ground-pos  332.5 893.6    \n\nThis will result in the camera orientation changing gradually to keep the\ndesired view.\n\n.. figure:: ../images/sfm_view.png\n   :name: sat_sim_illustration\n   :alt:  Illustration of ``sat_sim`` looking at a ground point.\n\n   An example of several generated cameras looking along a short ground path. \n   Plotted with ``sfm_view`` (:numref:`sfm_view`).\n\n.. _sat_sim_roll_pitch_yaw:\n\nFixed camera orientation\n^^^^^^^^^^^^^^^^^^^^^^^^\n\nWhen custom cameras are created (not read from disk), and unless the\n``--first-ground-pos`` and ``--last-ground-pos`` options are specified, the\ncameras will look straight down (nadir, perpendicular to along and across track\ndirections). \n\nIf desired to have a custom orientation, use the ``--roll``, ``--pitch`` and\n``--yaw`` options (measured in degrees, all three must be specified). \nSee :numref:`roll_pitch_yaw_def` for how these angles are defined.\n\nExample invocation::\n\n    sat_sim --dem dem.tif         \\\n      --ortho ortho.tif           \\\n      --first 397.1 400.7 450000  \\\n      --last 397.1 500.7 450000   \\\n      --num 5                     \\\n      --roll 0 --pitch 25 --yaw 0 \\\n      --focal-length 450000       \\\n      --optical-center 500 500    \\\n      --image-size 1000 1000      \\\n      -o run/run\n\nSee :numref:`orbit_plot` for how to visualize the roll, pitch, and yaw angles of\nthe cameras with ``orbit_plot.py``.\n\n.. _sat_sim_roll_pitch_yaw_ground:\n\nPose and ground constraints\n^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nGiven an orbital trajectory, a path on the ground, and a desired fixed camera\norientation (roll, pitch, yaw), this tool can find the correct endpoints along\nthe satellite orbit, then use those to generate the cameras (positioned\nbetween those endpoints), with the center of the camera ground footprint following \nthe desired ground path. Example::\n\n    sat_sim --dem dem.tif            \\\n      --ortho ortho.tif              \\\n      --first 397.1 400.7 450000     \\\n      --last 397.1 500.7 450000      \\\n      --first-ground-pos 397.1 400.7 \\\n      --last-ground-pos  397.1 500.7 \\\n      --roll 0 --pitch 25 --yaw 0    \\\n      --num 5                        \\\n      --focal-length 450000          \\\n      --optical-center 500 500       \\\n      --image-size 1000 1000         \\\n      -o run/run\n\nHere, unlike in :numref:`sat_sim_nadir`, we will use ``--first`` and ``--last``\nonly to identify the orbit. The endpoints to use on it will be found\ngiven that we have to satisfy the orientation constraints in ``--roll``,\n``--pitch``, ``--yaw`` and the ground path constraints in ``--first-ground-pos``\nand ``--last-ground-pos``. \n\nUnlike in :numref:`sat_sim_custom_path`, the camera orientations will not change.\n\nCurrently, in this mode one must have the roll and yaw angles set to zero.\nThen, the satellite should follow an orbit whose vertical projection onto the\nground is quite similar to the provided ground path. These restrictions may be\nrelaxed in the future.\n\nIt is not important to know very accurately the values of ``--first-ground-pos``\nand ``--last-ground-pos``. The trajectory of the camera center ground footprint\nwill be computed, points on it closest to these two ground coordinates will be\nfound, which in turn will be used to find the orbital segment endpoints.\n\n.. figure:: ../images/sfm_view_nadir_off_nadir.png\n   :name: sat_sim_illustration_nadir_off_nadir\n   :alt:  sat_sim_illustration_nadir_off_nadir\n   \n   Illustration of ``sat_sim`` creating two sets of cameras, with different \n   fixed orientations for each, with both sets looking at the same ground path.\n   A separate invocation of ``sat_sim`` is needed for each set. \n\n.. _sat_sim_jitter_model:\n\nJitter modelling\n^^^^^^^^^^^^^^^^\n\nAs a satellite moves in orbit, it vibrates ever so slightly. The effect of this\non the acquired images is called *jitter*, and it occurs for both Linescan and\nPinhole cameras. See :numref:`jitter_solve` for how jitter is solved for when\nthe cameras are Linescan. Here we will discuss modeling jitter for synthetic\nPinhole cameras. See :numref:`sat_sim_linescan` for how to create synthetic\nLinescan cameras (with or without jitter).\n\nWe assume the jitter is a superposition of periodic perturbations of the roll,\npitch, and yaw angles. For each period, there will be an individual amplitude\nand phase shift for these three angles. For example, to model along-track\n(pitch) jitter only, the amplitudes for the other angles can be set to zero.\nAcross-track jitter is modeled by a roll perturbation.\n\nThe jitter frequency will be measured in Hz. For example, *f* = 45 Hz (45\noscillations per second). If the satellite velocity is *v* meters per second,\nthe jitter period in meters is :math:`v / f`. More than one jitter frequency\n(hence period) can be specified. Their contributions will be summed up.\n\nDenote by :math:`A_{ij}` the jitter amplitude, in degrees. The index :math:`i`\ncorresponds to jitter frequency :math:`f_i`, and :math:`j` = 1, 2, 3 is\nthe index for roll, pitch, and yaw. The jitter perturbation is modeled as:\n\n.. math::\n    \n    \\sum_i A_{ij} \\sin\\left(d \\frac{2 \\pi f_i}{v} + \\phi_{ij}\\right)\n\nSome care is needed to define the parameter *d*. We set it to be the distance\nfrom the starting orbit point as specified by ``--first`` to the current camera\ncenter (both in ECEF, along the curved orbit). This starting point is *before*\nadjusting the orbital segment for roll, pitch, yaw, and ground constraints\n(:numref:`sat_sim_roll_pitch_yaw_ground`). \n\nThis way the jitter amplitude at the adjusted starting point (first camera\nposition) is uncorrelated between several sets of cameras along the same orbit\nbut with different values of roll, pitch, yaw.\n\nThe phase shift :math:`\\phi_{ij}` is measured in radians. If not specified, it is set\nto zero. How to set it is discussed below.\n\n.. _sat_sim_jitter_amplitude_meters:\n\nSpecifying the jitter amplitude in meters\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe jitter amplitude is usually very small and not easy to measure or interpret.\nIt can be set in micro radians, as done in\n:numref:`sat_sim_jitter_amplitude_micro_radians`.\n\nHere we will discuss how jitter can be defined indirectly, via its effect\non the *horizontal uncertainty* of the intersection of a ray emanating\nfrom the camera center with the datum (see also :numref:`error_propagation`).\n\nConsider a nadir-facing camera with the camera center at height *D* meters above\nthe datum. If the ray pointing straight down from that camera intersects the\ndatum at a certain point, and then that ray is perturbed by :math:`A` degrees, the\nintersection point will move horizontally by\n\n.. math::\n    \n      H = D \\tan\\left( \\frac{\\pi}{180} A \\right)\n\nThis is the horizontal ground uncertainty of the intersection point. It is a\nrather intuitive concept and many vendors publish it for their cameras. For\nexample, if the camera ground sample distance (pixel size on the ground) is 1\nm/pixel, a horizontal uncertainty of 0.1 m or less is very good. If the camera\norientation is found using a star-tracker or some other estimations in orbit,\nand no bundle adjustment (:numref:`bundle_adjust`) is performed, the horizontal\nuncertainty will likely be much larger, for example on the order of 1-4 meters. \n\nIn either case, this number is easy to understand, and the jitter amplitude\ncan be defined as the value of :math:`A_{ij}` that produces the desired horizontal\nuncertainty:\n\n.. math::\n    \n      A_{ij} = \\frac{180}{\\pi} \\arctan\\left( \\frac{H_j}{D} \\right)\n\nNote that we will use the same jitter amplitude for all frequencies, since we\nare limited by just a single horizontal uncertainty value for each of roll,\npitch, and yaw. \n\nOne should also note that the effect of a yaw perturbation by a given amount\nis much less than the effect of the same amount of roll or pitch perturbation,\nbecause for the latter two the effect is magnified by the distance from the camera\ncenter to the datum, unlike for yaw.\n\nThe height above datum for the starting and ending points of the orbital segment\nis the third value in ``--first`` and ``--last``. These values can, in\nprinciple, be different, and then a linearly interpolated value will be used at\neach camera position (and note that the orbital segment endpoints are adjusted,\nper :numref:`sat_sim_roll_pitch_yaw_ground`).\n\nAs an example of using this functionality, consider the ``sat_sim``\ninvocation as in :numref:`sat_sim_roll_pitch_yaw_ground`, and add the options::\n\n    --velocity 7500 --jitter-frequency \"45.0 100.0\" \\\n    --horizontal-uncertainty \"0.0 2.0 0.0\"\n\nThis will produce a set of cameras with along-track (pitch) jitter only. \nTwo frequencies will be used, of 45 and 100 Hz. \n\nTo add a phase :math:`\\phi_{ij}`, in radians, to roll, pitch, and yaw jitter,\nspecify it as::\n\n    --jitter-phase \"1.5708 1.5708 1.5708 0.0 0.0 0.0\"\n\nHere we used an approximation of :math:`\\pi/2` radians, which is 90 degrees,\nfor the 45 Hz frequency, and 0 radians for the 100 Hz frequency. \n\nThe values can also be separated by commas, without spaces, then the quotes are\nnot necessary. See :numref:`sat_sim_options` for more information on these\noptions.\n\nJitter can be applied to existing cameras as well (:numref:`sat_sim_perturb`). \n\nA useful test is compare a camera without jitter with the corresponding one with\njitter.  For that, project a pixel from the first camera to the datum, and\nproject the obtained point back into the second camera. See how different the\nproduced pixel value is compared to the original pixel. That is done with\n``cam_test`` (:numref:`cam_test`)::\n\n    cam_test --session1 pinhole        \\\n      --session2 pinhole               \\\n      --image sim_jitter0/n-10020.tif  \\\n      --cam1  sim_jitter0/n-10020.tsai \\\n      --cam2  sim_jitter2/n-10020.tsai\n\nIt will produce an output as::\n\n    cam1 to cam2 pixel diff\n    Min:    1.89408\n    Median: 1.89408\n    Max:    1.89408\n\n    cam2 to cam1 pixel diff\n    Min:    1.89408\n    Median: 1.89408\n    Max:    1.89408\n\n.. _sat_sim_jitter_amplitude_micro_radians:\n\nSpecifying the jitter amplitude in micro radians\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nAlternatively, instead of three horizontal uncertainties, the full set of amplitudes\ncan be specified directly, in micro radians. The option for that is ``--jitter-amplitude``.\nUse a quoted list of values separated by commas of spaces. The first three values\nare for roll, pitch and yaw of the first frequency, the next three values are for\nthe second frequency, and so on. For example::\n\n    --jitter-amplitude \"0 1 0 0 1 0\"\n\nThese will be multiplied by 1e-6 to convert to radians, then converted to\ndegrees, and used as the jitter amplitudes :math:`A_{ij}`. In this example\nonly the pitch amplitudes are nonzero, and are equal to 1 micro radian.\n\n.. _sat_sim_linescan:\n\nLinescan cameras\n^^^^^^^^^^^^^^^^\n\nThe ``sat_sim`` tool can be used to simulate linescan cameras and images, with\nor without jitter. Then, instead of many Pinhole cameras and/or images along the\norbit, a single Linescan camera and/or image will be created. For use with existing\ncameras, see :numref:`sat_sim_prior`.\n\nThe option ``--num`` (or ``--frame-rate``) will control how many camera samples\nare created between the first and last image lines (including these lines). An\nadditional set of camera samples will be created, with the same total size,\nbefore the first and after the last image line, evenly divided between the two,\nto help with along-track pose interpolation and jitter modeling. \n\nLagrange interpolation (with 8th degree polynomials) will be used in between the\nsamples.\n\nAll above modes are supported. One has to add to ``sat_sim`` the option\n``--sensor-type linescan``.\n\nBy default, if the linescan cameras are not provided with ``--camera-list``, the\ninput image height is auto-computed so that the horizontal and vertical ground\nsample distances are very similar. The produced image height will be the same\nregardless of amount of jitter in the input cameras or whether jitter is modeled\nat all. This can be overridden with ``--non-square-pixels``.\n\nWhen creating synthetic linescan cameras, the row coordinate of the optical\ncenter (the second value in ``--optical-center``) will be ignored and will be\ntreated as set to 0. Hence, we assume that the ray from the camera center that\nis perpendicular to the sensor plane intersects the single-row sensor array. \n\nThe produced linescan cameras are in the CSM model state format\n(:numref:`csm_state`). This is a standard CSM format and can be read by all ASP\ntools including this one.\n\nHere is an example invocation. The use case here is as in\n:numref:`sat_sim_roll_pitch_yaw_ground`. The camera maintains fixed roll, pitch,\nand yaw, and the ground path determines the orbital segment endpoints. Here we\nalso model along-track jitter.\n\n::\n\n    sat_sim --dem dem.tif                \\\n      --ortho ortho.tif                  \\\n      --first 397.1 400.7 450000         \\\n      --last  397.1 500.7 450000         \\\n      --first-ground-pos 397.1 400.7     \\\n      --last-ground-pos  397.1 500.7     \\\n      --roll 0 --pitch 30 --yaw 0        \\\n      --num 5                            \\\n      --focal-length 450000              \\\n      --optical-center 500 500           \\\n      --image-size 1000 1000             \\\n      --sensor-type linescan             \\\n      --velocity 7500                    \\\n      --jitter-frequency 5               \\\n      --horizontal-uncertainty '0 2 0'   \\\n      --jitter-phase \"0.4 0.8 1.2\"       \\\n      -o jitter2/run\n\nSee :numref:`jitter_sat_sim` for how such cameras can be used with ASP's jitter solver.\n\nAs in :numref:`sat_sim_jitter_amplitude_meters`, one can compare cameras with\nand without jitter as::\n    \n    cam_test                   \\\n      --session1 csm           \\\n      --session2 csm           \\\n      --image jitter0/run.tif  \\\n      --cam1  jitter0/run.json \\\n      --cam2  jitter2/run.json\n\n.. _sat_sim_rig:\n\nModeling a rig\n^^^^^^^^^^^^^^\n\nThe ``sat_sim`` program can simulate a rig that has a mix of frame (pinhole) and\nlinescan cameras. The rig should be passed in via ``--rig-config``. Its format\nis defined in :numref:`rig_config`. The rig can be adjusted after loading (:numref:`sat_sim_rig_adjust`).\n\nAn example is in :numref:`orbital_rig`. \n\nThe produced image and camera file names will include the sensor name, before\nthe image/camera extension. Example::\n\n  out/out-10000_my_cam.tsai\n\nThe option ``--sensor-type`` controls the type of each rig sensor. A single\nvalue will apply to all sensors. To have per-sensor type, set a list of values\nseparated by commas, with no spaces. Example::\n\n  --sensor-type linescan,pinhole,linescan\n\nLens distortion is not supported. If desired to produce cameras and images only\nfor a subset of the rig sensors, use the ``--sensor-name`` option. Consider\nusing the option ``--save-as-csm``.\n\n.. figure:: ../images/sat_sim_rig.png\n   :name: sat_sim_rig_illustration\n   :alt:  sat_sim_rig_illustration\n   \n   Illustration of ``sat_sim`` creating a rig of 3 frame cameras. The resulting\n   images have been mapprojected onto the ground.\n\n.. _sat_sim_rig_adjust:\n\nAdjusting a rig\n^^^^^^^^^^^^^^^\n\nGiven a rig (:numref:`sat_sim_rig`), the positions and orientations of the\nsensors in the focal plane and of their footprints on the ground can be\noverridden by setting ``--rig-sensor-ground-offsets``.\n\nFor example, consider a rig with two cameras. If it is desired to have the rig\nsensor centers separated by 0.02 m in the *x* direction the sensor plane, and\nthe centers of their footprints separated by 2000 m in the *x* (across-track)\ndirection on the ground, with no separation vertically, use::\n\n  --rig-sensor-ground-offsets -0.01,0,-1000,0,0.01,0,1000,0\n\nAdditionally, an option such as::\n\n  --rig-sensor-rotation-angles 0.0,5.0\n\ncan be invoked to rotate each sensor in the sensor plane by the corresponding\nangle in degrees. The in-sensor rotations get applied before the sensor and\nground offsets.\n\nAfter the images and cameras are saved, the rig that created the data will be\nmodified to make each sensor transform relative to the first sensor. The rig\nconfiguration will be saved to disk as::\n\n  <out prefix>-rig_config.txt\n\nSuch a rig configuration can be passed in to ``jitter_solve``\n(:numref:`jitter_solve`) and ``rig_calibrator`` (:numref:`rig_calibrator`). \n\nIf this rig is passed back in to ``sat_sim``, one must again specify the offsets\nand angles, if any, as such adjustments are lost when the rig is saved as above.\n\n.. _sat_sim_time:\n\nModeling time\n^^^^^^^^^^^^^\n\nGiven two points on the orbit (specified by ``--first`` and ``--last``), the\nstarting ground position (``--first-ground-pos``), and satellite velocity\n(``--velocity``), the option ``--model-time`` ensures the precise time is\nrecorded for each acquisition.\n\nThe time is measured in seconds in double precision. Time is important for\nmodeling a rig, when this option is set to true even when not explicitly set.\n\nThe time will be saved with the linescan camera metadata. It will be part of the\nname of the pinhole cameras and images (but not part of the name for linescan\nsensors).\n\nAs an example, given an orbit, and three separate invocations of ``sat_sim``,\nwith the camera pitch being --40, 0, and 40 degrees, respectively (so considering\n*forward*, *nadir*, and *backward*-looking cameras), the created cameras will have\nnames that look like::\n\n  out/out-0009997.588028494_my_cam.tsai\n  out/out-0010000.000000000_my_cam.tsai\n  out/out-0010002.411951096_my_cam.tsai\n\nThis needs ``--reference-time`` to be defined, which is the time when the camera\nlooks straight down at the starting point of the ground path. The default\nvalue is 10,000 seconds. \n\nFor different orbits it is suggested to use a different value for\n``--reference-time``, and also a different output prefix. It is suggested to\nkeep the reference time in the 1000 - 100,000 second range to ensure the produced\nand nearby times are positive but not too large, which can result in loss of precision.\n\nHere we also assumed a rig was present (:numref:`sat_sim_rig`), with the sensor\nname being ``my_cam``.\n\n.. _sat_sim_perturb:\n\nPerturbing existing cameras\n^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThis program can apply a periodic jitter perturbation\n(:numref:`sat_sim_jitter_model`) or a random position or pose perturbation to a\nsequence of given Pinhole cameras (:numref:`pinholemodels`).\n\nIf more than one sequence is present, such as nadir-looking and forward-looking\ncameras, ``sat_sim`` should be called separately for each one.\n\nIn this mode, no images are generated and no rig can be used.\n\nExample::\n\n    ls nadir_cameras/*tsai > camera_list.txt\n    \n    sat_sim                            \\\n      --perturb-cameras                \\\n      --camera-list camera_list.txt    \\\n      --dem dem.tif                    \\\n      --velocity 7500                  \\\n      --jitter-frequency 5             \\\n      --horizontal-uncertainty '0 2 0' \\\n      -o run/run\n\nIf an input image is named ``camDir/camName.tsai`` and the output prefix is\n``run/run``, the output camera will be saved as ``run/run-camName.tsai``.\n\nThe list of written cameras is saved in a file named ``run/run-cameras.txt``.\nThat list can be passed to ``bundle_adjust`` (:numref:`bundle_adjust`) and\n``jitter_solve`` (:numref:`jitter_solve`).\n\nTo save the perturbed cameras in CSM model state format, add the option\n``--save-as-csm`` and specify the image dimensions (``--image-size``).\n\nTo apply a random pose perturbation with maximum roll-pitch-yaw amplitude given by \n``--horizontal-uncertainty``, run::\n\n    sat_sim                            \\\n      --random-pose-perturbation       \\\n      --dem dem.tif                    \\\n      --horizontal-uncertainty '0 2 0' \\\n      -o run/run\n\nTo apply a random position perturbation, use an option such as ``--random-position-perturbation 2.0``.\n\n.. _roll_pitch_yaw_def:\n\nRoll, pitch, and yaw\n^^^^^^^^^^^^^^^^^^^^\n\nThe roll, pitch and yaw angles (measured in degrees) are used to determine\nthe camera orientation relative to the local coordinate system in orbit.\n\nWhen all these are set to 0 (the default is ``NaN``) the camera looks straight down.\n\nIf the pitch is 90 degrees and the other angles are zero, the camera will look\nalong the track rather than down. If a non-zero yaw is set, the camera will\nrotate around its view axis.\n\nThe rotations are applied to the camera body in the roll, pitch, and yaw order.\nSo, the combined rotation matrix is::\n\n    R = yawRot * pitchRot * rollRot\n\n(the application is from right to left). The camera-to-ECEF rotation is produced\nby further multiplying this matrix on the left by the rotation from the local \nsatellite coordinate system to ECEF.\n\nIt is important to note that the satellite and the camera use different coordinate\nsystems. The satellite orientation is with the *x*, *y* and *z* axes pointing along\nsatellite track, across track, and towards the planet, respectively.\n\nFor the camera, it is preferable for the rows of pixels to be parallel to the\nacross track direction, and for the columns to be parallel to the along track\ndirection. So, the camera *y* direction is along the track, the camera *x*\ndirection is the negative of the across-track direction, and *z* points towards\nthe ground as before.\n\nCamera models with desired roll, pitch, and yaw angles can be also created when\nthe camera follows a variable path with variable orientation\n(:numref:`cam_gen_extrinsics`).\n\nEfficiency considerations\n^^^^^^^^^^^^^^^^^^^^^^^^^\n\nEach image (of size about 2000 x 1000 pixels) can take about 10 seconds to\ncreate using multiple threads. A job can be divided over several processes\nusing the ``--first-index`` and ``--last-index`` options (see\n:numref:`sat_sim_options`). The last index is the index before the last camera.\nThe option ``--no-images`` can be used to skip the image creation step.\n\n.. _sat_sim_dem:\n\nPreparing the input DEM and orthoimage\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe input DEM must not have holes, be reasonably smooth, and extend well-beyond\nthe area of interest. It is suggested to create it using stereo\n(:numref:`tutorial`). For steep terrain one should first mapproject the images\n(:numref:`mapproj-example`).\n\nThe stereo cloud should be converted to a DEM, preferably in the local\nstereographic projection, using a grid size that is perhaps 4 times the ground\nsample distance (GSD). For example, for images having a GSD of 0.4 meters, a\ncommand as follows may work::\n\n  point2dem --auto-proj-center --tr 1.6 run/run-PC.tif\n\nSee :numref:`point2dem_proj` for a discussion regarding the projection of the\nproduced DEM.\n\nThe ``dem_mosaic`` (:numref:`dem_mosaic`) tool can be used to fill holes in the\nDEM, using either the ``--hole-fill-length`` or ``--fill-search-radius`` option.\nIt is also suggested to blur it a little, which may reduce some of the noise in\nthe DEM. For that, use ``dem_mosaic`` with the option ``--dem-blur-sigma`` with a\nvalue of 1 or 2.\n\nVery large holes may be infilled from a third-party low-resolution DEM, like\nCopernicus (:numref:`initial_terrain`), but this is a measure of last resort. Do\nnot forget to first convert it to be relative to the WGS84 ellipsoid, using\n``dem_geoid`` (:numref:`conv_to_ellipsoid`). This DEM can be converted to the\nlocal projection and grid size using ``gdalwarp`` (:numref:`gdal_tools`, bicubic\nor bilinear interpolation is suggested), and cropped to desired area with\n``gdal_translate``. Then, it can be used as::\n\n    dem_mosaic --priority-blending-length 100 \\\n      stereo-DEM.tif copernicus-DEM.tif       \\\n      -o filled-DEM.tif\n\nThis assumes that the two DEMs being blended are reasonably well-aligned.\nOtherwise, alignment may be needed (:numref:`pc_align`).\n\nOne can also use such a third-party DEM if no stereo DEM can be produced. \n\nThe orthoimage can be obtained by mapprojecting (:numref:`mapproject`) a\nsatellite image onto the DEM at the native resolution of the image::\n\n    mapproject -t rpc filled-DEM.tif \\\n      image.tif image.xml ortho.tif\n\nHere we assumed a WorldView satellite, so option ``-t rpc`` was used. See\n:numref:`other-mapproj` for how to handle other satellites.\n\nThe resolution and projection can be set via ``--tr`` and ``--t_srs`` if need\nbe.\n\nOutput files\n^^^^^^^^^^^^\n\nIn addition to the images and/or cameras, when ``--sensor-type`` is ``pinhole``,\n``sat_sim`` will also save two files, having the lists of created images and\ncameras, one per line, with names as::\n\n    <output prefix>-images.txt\n    <output prefix>-cameras.txt\n\nThese will be adjusted per sensor name, if a rig is present\n(:numref:`sat_sim_rig`).\n\nThese files will not be saved if ``--first-index`` is non-zero, as\nthen ``sat_sim`` is presumably being invoked concurrently by several\nprocesses to write several ranges of images and/or cameras, and that may\nresult in these files being corrupted.\n\nThen, the list of images will not be saved if ``--no-images`` is used,\nand the list of cameras will not be saved if ``--camera-list`` is set,\nas then the cameras are not being generated by ``sat_sim``.\n\n.. _sat_sim_options:\n\nCommand-line options\n^^^^^^^^^^^^^^^^^^^^\n\n--dem <string (default=\"\")>\n    Input DEM file.\n\n--ortho <string (default=\"\")>\n    Input georeferenced image file. \n\n-o, --output-prefix <string (default=\"\")>\n    Specify the output prefix. All the files that are saved will start with this\n    prefix.\n\n--camera-list <string (default=\"\")>\n    A file containing the list of pinhole cameras to create synthetic images\n    for. Then these cameras will be used instead of generating them. Specify one\n    file per line. The options ``--first``, ``--last``, ``--num``, ``--focal-length``,\n    and ``--optical-center`` will be ignored.\n\n--first <float, float, float>\n    First camera position, specified as DEM pixel column and row, and height\n    above the DEM datum. This may be adjusted, per\n    :numref:`sat_sim_roll_pitch_yaw_ground`. Can use ``mapproject\n    --query-pixel`` to find the DEM pixel column and row for a given image pixel\n    (:numref:`mapproj_options`).\n\n--last <float, float, float>\n    Last camera position, specified as DEM pixel column and row, and height\n    above the DEM datum. See also ``--first``.\n\n--num <int (default=0)>\n    Number of cameras to generate, including the first and last ones. Must be\n    positive. The cameras are uniformly distributed along the straight edge from\n    first to last (in projected coordinates). See also ``--frame-rate``.\n\n--first-ground-pos <float, float>\n    Coordinates of first camera ground footprint center (DEM column and row). If\n    not set, the cameras will look straight down (perpendicular to along and\n    across track directions).\n\n--last-ground-pos <float, float>\n    Coordinates of last camera ground footprint center (DEM column and row). If\n    not set, the cameras will look straight down (perpendicular to along and\n    across track directions).\n\n--focal-length <double>\n    Output camera focal length in units of pixel.\n\n--optical-center <float, float>\n    Output camera optical center (image column and row). Units of pixel.\n\n--image-size <int, int>\n    Output camera image size (width and height).\n\n--roll <double>\n    Camera roll angle, in degrees. See :numref:`sat_sim_roll_pitch_yaw` for\n    details.\n\n--pitch <double>\n    Camera pitch angle, in degrees. See :numref:`sat_sim_roll_pitch_yaw` for\n    details.\n\n--yaw <double>\n    Camera yaw angle, in degrees. See :numref:`sat_sim_roll_pitch_yaw` for  details.\n\n--velocity <double>\n    Satellite velocity, in meters per second. Used for modeling jitter. A value of\n    around 8000 m/s is typical for a satellite like SkySat in Sun-synchronous orbit\n    (90 minute period) at an altitude of about 450 km. For WorldView, the velocity\n    is around 7500 m/s, with a higher altitude and longer period.\n\n--jitter-frequency <string>\n    Jitter frequency, in Hz. Used for modeling jitter (satellite vibration).\n    Several frequencies can be specified. Use a quoted list, with spaces as\n    separators (or separated by commas with no quotes). See also\n    ``--jitter-amplitude`` and ``--horizontal-uncertainty``.\n\n--jitter-phase <string>\n    Jitter phase, in radians. Measures the jitter phase offset from the start of\n    the orbit as set by ``--first``. Specify as a quoted list of numbers\n    separated by space (or separated by commas with no quotes). The Number of\n    values must be 3 times the number of frequencies. The order in this list\n    corresponds to phase for roll, pitch, and yaw for first frequency, then\n    second frequency, etc. If not specified, will be set to 0. \n    \n--jitter-amplitude <string>\n    Jitter amplitude, in micro radians. Specify as a quoted list having\n    amplitude in roll, pitch, yaw for first frequency, then second frequency,\n    etc. Separate the values by spaces (or commas with no quotes).\n\n--horizontal-uncertainty <string>\n    Camera horizontal uncertainty on the ground, in meters, at nadir\n    orientation. Specify as three numbers, in quotes, used for roll, pitch, and\n    yaw (or separated by commas with no quotes). The jitter amplitude for each of\n    these angles is found as ``amplitude = atan(horizontal_uncertainty /\n    satellite_elevation_above_datum)``, then converted to degrees. See\n    :numref:`sat_sim_jitter_model` for details.\n\n--frame-rate <double>\n    Camera frame rate, per second. Can be in double precision. If set, it will\n    override ``--num``. The cameras will start from ``--first`` (after any\n    position adjustment, if applicable, per\n    :numref:`sat_sim_roll_pitch_yaw_ground`). Set the ``--velocity`` value. The\n    last camera will be no further than the (adjusted) value of ``--last`` along\n    the orbit. \n\n--sensor-type <string (default=\"pinhole\")>\n    Sensor type for created cameras and images. Can be one of: ``pinhole``,\n    ``linescan``. Can use ``frame`` instead of ``pinhole``. With a rig\n    (:numref:`sat_sim_rig`), this can be a list of values, separated by commas,\n    with no spaces, one per sensor, if desired to have different types for\n    different sensors.\n\n--non-square-pixels\n    When creating linescan cameras and images, use the provided image height in\n    pixels, even if that results in non-square pixels. The default is to\n    auto-compute the image height.\n\n--first-index <int (default: -1)>\n    Index of first camera and/or image to generate, starting from 0. If not set,\n    will create all images/cameras. This is used for parallelization.\n\n--last-index <int (default: -1)>\n    Index of last image and/or camera to generate, starting from 0. Stop before\n    this index. If not set, will create all images/cameras. This is used for\n    parallelization.    \n\n--no-images\n    Create only cameras, and no images. Cannot be used with ``--camera-list``.\n\n--save-ref-cams\n    For each created camera, save also the 'reference' camera that has no roll, pitch,\n    yaw, jitter, or 90 degree in-sensor-plane rotation from camera to satellite\n    coordinates. Their names have ``-ref-`` after the output prefix.\n\n--save-as-csm\n    Save Pinhole (frame) cameras in the CSM format, as done for linescan\n    cameras. Can be used to combine these sensors in bundle adjustment and\n    solving for jitter. See an example in :numref:`jitter_linescan_frame_cam`.\n\n--rig-config <string (default=\"\")>\n    Simulate a frame camera rig with this configuration file. Then do not set\n    the image size, focal length, optical center on the command line, as those\n    are set by the rig. The transforms on this rig may be adjusted via\n    ``--rig-sensor-ground-offsets`` and ``--rig-sensor-rotation-angles``. See\n    :numref:`sat_sim_rig`.\n\n--rig-sensor-ground-offsets <string (default=\"\")>\n    Modify the input rig so that each sensor center has the given horizontal offsets\n    from the rig center in the rig plane, and the sensor ground footprint centers have\n    the given ground plane offsets from the nominal ground footprint center at nadir.\n    Specify as a quoted list of values, separated by spaces or commas. The order\n    is sensor1_x sensor1_y ground1_x ground1_y followed by sensor 2, etc. The\n    units are in meter. These will determine the sensor rotations. Separate the\n    values by spaces with quotes or commas with no quotes. If not set, use 0 for\n    all sensors.\n\n--rig-sensor-rotation-angles <string (default=\"\")>\n    Modify the input rig by rotating each sensor by the given angle in the sensor\n    plane. Specify as one number per sensor, in degrees, separated by commas, or \n    in quotes and separated by spaces.\n    \n--sensor-name <string (default=\"all\")>\n    Name of the sensor in the rig to simulate (:numref:`sat_sim_rig`). If more\n    than one, list them separated by commas (no spaces).\n\n--model-time\n    Model time at each camera position (:numref:`sat_sim_time`). See also\n    ``--reference-time``.\n\n--reference-time <double (default: 10000.0)>\n    The measured time, in seconds, when the satellite is along given orbit, in nadir\n    orientation, with the center view direction closest to the ground point at\n    ``--first-ground-pos``. A unique value for each orbit is suggested. A large value\n    (millions), may result in numerical issues. See :numref:`sat_sim_time`.\n\n--perturb-cameras\n    Apply a periodic jitter perturbation to poses of existing cameras\n    (:numref:`sat_sim_perturb`).\n\n--random-pose-perturbation\n    Apply a random pose perturbation to existing cameras, with the amplitude\n    specified by ``--horizontal-uncertainty``  (:numref:`sat_sim_perturb`).\n    Repeated invocation will produce the same random perturbation.\n\n--random-position-perturbation <double (default: NaN)>\n    Apply a random position perturbation to existing cameras, with the amplitude\n    specified by the given value, in meters (:numref:`sat_sim_perturb`).    \n    \n--blur-sigma <double (default: 0.0)>\n    When creating images, blur them with a Gaussian with this sigma. The sigma is\n    in input orthoimage pixel units.\n            \n--dem-height-error-tol <float (default: 0.001)>\n    When intersecting a ray with a DEM, use this as the height error tolerance\n    (measured in meters). It is expected that the default will be always good\n    enough.\n\n--threads <integer (default: 0)>\n    Select the number of threads to use for each process. If 0, use the value in\n    ~/.vwrc.\n \n--cache-size-mb <integer (default = 1024)>\n    Set the system cache size, in MB.\n\n--tile-size <integer (default: 256 256)>\n    Image tile size used for multi-threaded processing.\n\n--tif-compress <string (default = \"LZW\")>\n    TIFF compression method. Options: None, LZW, Deflate, Packbits.\n\n-v, --version\n    Display the version of software.\n\n-h, --help\n    Display this help message.\n"
  },
  {
    "path": "docs/tools/sfm_merge.rst",
    "content": ".. _sfm_merge:\n\nsfm_merge\n---------\n\nThe ``sfm_merge`` program takes two or more Structure-from-Motion\n(SfM) maps in .nvm format, as produced by ``theia_sfm``\n(:numref:`theia_sfm`) or ``rig_calibrator``\n(:numref:`rig_calibrator`), and merges them into a single map. It\nfinds correspondences (feature matches) between the images in the maps,\nand then transforms the maps to first map's coordinate system.\n\nThe input maps may or may not have shared images, but the surfaces\nthey see must overlap.\n\nIf there are more than two maps, the second is merged to the first,\nwhich is then merged with the third, etc.\n\nThe produced map must be bundle-adjusted to refine it, using ``rig_calibrator``\n(with or without the rig constraint).\n\nThe inputs must satisfy one of the naming conventions in\n:numref:`rig_data_conv`. This program supports the option\n``--image_sensor_list`` for when the directory structure or filenames do not\nhave enough information on sensor types and timestamps.\n\nThe output map can be visualized in ``stereo_gui``\n(:numref:`stereo_gui_nvm`).\n\nSee also ``sfm_submap`` (:numref:`sfm_submap`), a program to extract\na submap from a larger map. A discussion for how this tool can be used\nis in :numref:`map_surgery`.\n\nExample\n^^^^^^^\n\n::\n\n    sfm_merge --rig_config rig_config.txt   \\\n      --num_image_overlaps_at_endpoints 100 \\\n      map1.nvm map2.nvm -output_map merged.nvm\n\nIncreasing the number of overlaps can make the program quite slow as\nits complexity is the square of this number. However, if very few\nsimilar images are detected between the maps, they will not be merged\naccurately.\n\nThe option ``--fast_merge`` can be used when the input maps are known\nto have a good number of images in common. \n\nThe option ``--no_transform`` is useful when the maps are\nindividually registered or when they do not overlap, but in either\ncase it is desired to integrate them without changing the camera\nposes.\n\nUnless the ``--no_shift`` option is used, this invocation will write\na file of the form ``<merged>_offsets.txt`` having the optical center of each\ncamera. The .nvm file has these offsets subtracted from the features,\nand the offsets are needed for plotting the features with ``stereo_gui``.\n\nHandling tracks\n^^^^^^^^^^^^^^^\n\nA track is a feature (interest point) seen in multiple images,\ncorresponding to a triangulated position on the ground. This tool\npreserves the tracks from the input maps. Matching of features creates\nadditional tracks.  Duplicate tracks (showing in multiple input maps\nand/or created during matching) are removed.\n\nThis tool does not merge tracks that have a subsequence in common, or\neliminate a track if another track exists which is longer than a given\none. These features may be added in future versions.\n\nCommand-line options for sfm_merge\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n--rig_config <string (default: \"\")>\n  Read the configuration of sensors from this file in the format used for \n  ``rig_calibrator`` (this tool does not use the rig structure). The\n  output of this program can be passed back to ``rig_calibrator``\n  (with or without a rig constraint).\n\n--output_map <string (default: \"\")>\n  Output file containing the merged map.\n\n--num_image_overlaps_at_endpoints <integer (default: 10)>\n  Search this many images at the beginning and end of the first map \n  for matches to this many images at the beginning and end of the \n  second map. Default: 10,\n\n--image_sensor_list <string (default: \"\")>\n  Read image name, sensor name, and timestamp, from each line in this list.\n  Alternatively, a directory structure can be used (:numref:`rig_data_conv`).\n\n--fast_merge\n  When merging maps that have shared images, use their camera poses to \n  find the transform from other maps to first map, and skip finding \n  additional matches among the images.\n\n--fix_first_map\n  If true, after merging the maps and reconciling the camera poses for\n  the shared images, overwrite the shared poses with those from the\n  first map, so it does not change. This is helpful if the first map\n  is already registered and evaluated.\n\n--no_shift\n  Assume that in the input .nvm files the features are not shifted\n  relative to the optical center. The merged map will then be saved\n  the same way. \n\n--no_transform\n  Do not compute and apply a transform from the other \n  maps to the first one. This keeps the camera poses as \n  they are (shared poses and features will be reconciled). \n  This will succeed even when the two maps do not overlap.\n\n--close_dist <double (default: -1.0)>\n  Two triangulated points are considered to be close if no further\n  than this distance, in meters. Used as inlier threshold when\n  identifying triangulated points after the maps are\n  aligned. Auto-computed, taking into account the extent of\n  a tight subset of the triangulated points and printed on screen if\n  not set. This is an advanced option.\n  \n"
  },
  {
    "path": "docs/tools/sfm_proc.rst",
    "content": ".. _sfm_proc:\n\nsfm_proc\n--------\n\nThis helper program takes as input a list of images with EXIF data, such as\nproduced by an UAS flight, and writes a text file having on each line the image\nname, camera center longitude, latitude, and height above datum, then the roll,\npitch, and yaw of the camera.\n\nThe roll and pitch are set to 0 as they are not available in the EXIF data. The yaw,\nmeasured from the North direction, is read from the field ``EXIF_GPSImgDirection``.\n\nThe fields ``EXIF_GPSLongitude``, ``EXIF_GPSLatitude``, ``EXIF_GPSAltitude``, and\n``EXIF_GPSLongitudeRef`` are read for the other data mentioned earlier.\n\nAn example is in :numref:`sfm_uas`.\n\nCommand-line options\n~~~~~~~~~~~~~~~~~~~~\n  \n--image-list <string (default: \"\")>\n    A file listing the input images with EXIF data, one per line.\n    \n--out-dir <string (default: \"\")>\n    The output directory that will contain the processed data.\n    \n-h, --help\n    Display this help message.\n"
  },
  {
    "path": "docs/tools/sfm_submap.rst",
    "content": ".. _sfm_submap:\n\nsfm_submap\n----------\n\nThe ``sfm_submap`` program takes as input a Structure-from-Motion\n(SfM) map in .nvm format, as produced by ``theia_sfm``\n(:numref:`theia_sfm`) or ``rig_calibrator``\n(:numref:`rig_calibrator`), and extracts from it a submap\nfor a desired subset of the images. \n\nIt works with .nvm files in which the keypoints were shifted\nrelative to the optical center (which is the default for\nboth ``theia_sfm`` and ``rig_calibrator``) or not (as can be\nsaved by ``rig_calibrator``, see :numref:`rig_calibrator_outputs`).\nThis property is preserved by this tool.\n\nThe produced map can be visualized in ``stereo_gui``\n(:numref:`stereo_gui_nvm`). For now, if the features are shifted\nrelative to the optical center, the user must produce the list of\nshifts, as detailed at the above link, for the features to be plotted\ncorrectly. It is suggested to always use ``rig_calibrator`` with the\noption ``--save_nvm_no_shift`` to create an unshifted file to start\nwith.\n\nSee also ``sfm_merge`` (:numref:`sfm_merge`), a tool for merging maps.\n\nExamples\n^^^^^^^^\n\nExample 1 (specify the images to have in the submap on the command line)::\n\n    sfm_submap -input_map in_map.nvm -output_map out_map.nvm \\\n      image1.jpg image2.jpg ... \n\nExample 2 (let those images be in a file, one per line)::\n\n    sfm_submap -input_map in_map.nvm -output_map out_map.nvm \\\n      -image_list list.txt\n\nThe images in the list not present in the input map will be ignored.\n\nCommand-line options for sfm_submap\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n``--input_map`` The input map, in .nvm format. Type: string. Default: \"\".\n\n``--output_map`` The output map, in .nvm format. Type: string. Default: \"\".\n\n``--image_list`` A file having the names of the images to be included in\n  the submap, one per line.\n\n"
  },
  {
    "path": "docs/tools/sfm_view.rst",
    "content": ".. _sfm_view:\n\nsfm_view\n--------\n\nThe ``sfm_view`` program displays the positions and orientations of a set of\norbital Pinhole camera models (:numref:`pinholemodels`) relative to the ground. \n\nThis program is based on `umve\n<https://github.com/simonfuhrmann/mve>`_, by Simon Fuhrmann.\n\nThe cameras are represented as pyramids (the pyramid tip is the camera center\nand the base is the sensor plane), and the ground as shown as a plane. The\nground plane is meant to be only a suggestion, and is not at the correct\ndistance or scale from the cameras. It is determined as the plane perpendicular\nto the vector from the planet center to the mean of camera centers. The planet\ncurvature is not modeled. \n\nThe actual field of view (focal length) and optical center of the\ncameras are not reflected in the plots.\n\nZooming and scene rotation are done with the computer mouse. \n\n.. figure:: ../images/sfm_view_nadir.png\n   :name: nadir_sfm_view_illustration\n   :alt:  Illustration of ``sfm_view``\n\n   Illustration showing two cameras pointing generally downward. The left panel\n   lists the camera file names. Clicking on an entry highlights that camera's\n   view direction. Synthetic cameras can be created with ``sat_sim``\n   (:numref:`sat_sim`).\n\nExample\n^^^^^^^\n\n::\n\n    sfm_view cameras/*.tsai\n\nSee also\n^^^^^^^^\n\nThe ``orbit_plot.py`` tool (:numref:`orbit_plot`) can visualize the roll,\npitch, and yaw angles of a set of pinhole and linescan cameras.\n\nThe ``view_reconstruction`` program (:numref:`view_reconstruction`) can display\na 3D point cloud and the cameras that were used to create it, if the reconstruction\nwas created with ``theia_sfm`` (:numref:`theia_sfm`).\n\nCamera poses can be converted to KML with ``orbitviz`` (:numref:`orbitviz`),\nto be shown in Google Earth.\n\nCommand-line options\n^^^^^^^^^^^^^^^^^^^^\n\n--width <integer (default: 1400)>\n    Window width in pixels. Specify as ``--width=1400``.\n--height <integer (default: 1200)>\n    Window height in pixels. Specify as ``--height=1200``.\n"
  },
  {
    "path": "docs/tools/sfs.rst",
    "content": ".. _sfs:\n\nsfs\n---\n\nThe ``sfs`` tool can add more detail to a DEM using shape-from-shading\n(:cite:`alexandrov2018multiview`). The ``parallel_sfs`` program\n(:numref:`parallel_sfs`) extends ``sfs`` to run using multiple\nprocesses on multiple machines.\n\nAn overview and examples of using this program are in :numref:`sfs_usage`.\n\nIllustration\n~~~~~~~~~~~~\n\n.. figure:: ../images/SfS_Comet_67P.png\n   :name: SfS_Comet_67P\n   :alt: SfS_Comet_67P.png\n\n   Refining the surface of Comet 67P with shape-from-shading\n   (:cite:`jindal2024measuring_v2`). Left: produced terrain. Right: input image.\n   \n\nUsage\n~~~~~\n\n::\n\n     sfs -i <input DEM> -n <max iterations> -o <output prefix> \\\n       [other options] <images> <cameras>\n\nThe tool outputs at each iteration the current DEM and other auxiliary\nand appropriately-named datasets, which are documented further down.\n\nExample\n~~~~~~~\n\n::\n\n     sfs --max-iterations 5 --use-approx-camera-models    \\\n       --crop-input-images --bundle-adjust-prefix ba/run  \\\n        -i input_dem.tif image1.cub image2.cub -o run/run\n\nSee many detailed worked-out examples in :numref:`sfs_usage`, including for the\nMoon and Earth.\n\nInputs\n~~~~~~\n\nThe SfS program takes as input a DEM to refine, images, cameras\n(contained within the ``.cub`` image files for ISIS data), Sun positions\n(normally embedded in the cameras), and (optionally but strongly\nsuggested) camera adjustments, which makes sure the images are\nregistered to each other and to the ground (the detailed examples in\n:numref:`sfs_usage` discuss this).\n\n.. _sfs_outputs:\n\nOutputs\n~~~~~~~\n\nThe ``sfs`` outputs are saved at the location given by the output prefix (option\n``-o``).  If that is set to ``run/run`` as in the example above, the following\noutputs are produced.\n\n - ``run/run-DEM-final.tif``\n     The produced SfS DEM.\n\n - ``run/run-exposures.txt``\n     The computed exposures for the images. These can be passed back to ``sfs``\n     via ``--image-exposures-prefix``.\n\n - ``run/run-haze.txt``\n     The computed haze values for the images. These can be passed back to\n     ``sfs`` via ``--haze-prefix``. Only created if ``--num-haze-coeffs`` is\n     positive.\n\n - ``run-albedo-estim.tif``\n     The estimated initial albedo (if ``--float-albedo`` is on). It is produced\n     by sampling the DEM with option ``--num-samples-for-estim``, then\n     interpolated to all DEM pixels. Can be passed to ``sfs`` via\n     ``--input-albedo``. Normally ``parallel_sfs`` takes care of the initial\n     estimation and passing this along.\n\n - ``run/run-albedo-final.tif``\n     The computed albedo. All its values are 1 unless the option\n     ``--float-albedo`` is used.\n\n - ``run/run-<image>-final-meas-intensity.tif``\n     For each input image, this has the actual (measured) image values at each\n     refined DEM grid point. See also ``--save-meas-intensity-only``.\n\n - ``run/run-<image>-final-sim-intensity.tif``\n     For each input image, this has the simulated image values at each refined\n     DEM grid point using the reflectance model and the Sun position for the\n     current image. If the modeling is perfect, the measured input image will\n     precisely agree with the simulated (modeled) image. In reality these are\n     close but different. This was called the \"computed\" intensity prior to\n     build 2025/11. See also ``--save-sim-intensity-only``.\n\n - ``run/run-DEM-variance.tif``\n     If ``--save-variances`` was set, this file stores the uncalibrated variance for each\n     DEM pixel. If ``--float-albedo`` is also on, the albedo variance is stored\n     in ``<output prefix>-albedo-variance.tif``. Values within 3 pixels of the\n     boundary are set to nodata. See :numref:`sfs_unc`.\n\n - ``run/run-DEM-{left,right,top,bottom}-covariance.tif``\n     If ``--save-covariances`` was set, the \"-dr1_dcn1\" file stores the uncalibrated covariance\n     of each DEM pixel with its top-left neighbor (\"+1\" row and \"-1\" column away).\n     If ``--float-albedo`` is also on, the albedo covariances with analogous\n     names are saved as well. Values within 3 pixels of the boundary are set to\n     nodata. See :numref:`sfs_unc`.\n\nIn addition, SfS saves intermediate values of many of these quantities\nat each iteration, unless the flag ``--save-sparingly`` is used. SfS\nmay also save the \"haze\" values if this is solved for (see the\nappropriate options below and :numref:`sfs_formulation`).\n\n.. _sfs_opt:\n\nCommand-line options for sfs\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n-i, --input-dem <filename>\n    The input DEM to refine using SfS.\n\n--image-list\n    A file containing the list of images, when they are too many to\n    specify on the command line. Use space or newline as\n    separator. See also ``--camera-list``.\n\n--camera-list\n    A file containing the list of cameras, when they are too many to\n    specify on the command line. If the images have embedded camera\n    information, such as for ISIS, this file must be empty but must\n    be specified if ``--image-list`` is specified.\n\n-o, --output-prefix <string>\n    Prefix for output filenames. \n\n-n, --max-iterations <integer (default: 10)>\n    Set the maximum number of iterations. Normally 5-10 iterations is\n    enough, even when convergence is not reached, as the solution\n    usually improves quickly at first and only very fine refinements\n    happen later.\n\n--reflectance-type <integer (default: 1)>\n    Reflectance types:\n    0. Lambertian\n    1. Lunar-Lambert\n    2. Hapke\n    3. Experimental extension of Lunar-Lambert\n    4. Charon model (a variation of Lunar-Lambert).\n\n--smoothness-weight <float (default: 0.04)>\n    The weight given to the cost function term which consists of sums of squares\n    of second-order derivatives. A larger value will result in a smoother\n    solution with fewer artifacts. The range can be in 0.01 -- 10,000. A\n    discussion of this term is in :cite:`lesage2021constraints`. See also\n    ``--gradient-weight``.\n\n--initial-dem-constraint-weight <float (default: 0)>\n    A larger value will try harder to keep the SfS-optimized DEM\n    closer to the initial guess DEM. A value between 0.0001 and\n    0.001 may work, unless your initial DEM is very unreliable.\n\n--albedo-constraint-weight <float (default: 0)>\n    If floating the albedo, a larger value will try harder to keep the optimized\n    albedo close to the initial albedo. See also: ``--input-albedo`` and \n    ``--albedo-robust-threshold``. In build 2025/11 and later, this is also\n    used in estimating the initial low-resolution albedo (option ``--estimate-exposure-haze-albedo``).\n\n--albedo-robust-threshold <float (default: 0)>\n    If floating the albedo and this threshold is positive, apply a Cauchy loss\n    with this threshold to the product of the albedo difference and the albedo\n    constraint weight. In build 2025/11 and later, this is also used in\n    estimating the initial low-resolution albedo (option\n    ``--estimate-exposure-haze-albedo``).\n\n--bundle-adjust-prefix <path>\n    Use the camera adjustments obtained by previously running\n    bundle_adjust with this output prefix.\n\n--float-albedo\n    Float the albedo for each pixel.  Will give incorrect results\n    if only one image is present. The albedo is normalized, its\n    nominal value is 1.\n\n--float-exposure\n    Float the exposure for each image. Will give incorrect results\n    if only one image is present. It usually gives marginal results.\n\n--shadow-threshold <arg>\n    A shadow threshold to apply to all images. Must be positive. Areas that are\n    in shadow in all images will result in a blurred version of the input DEM,\n    influenced by the ``--smoothness-weight``.\n\n--shadow-thresholds <arg>\n    Optional shadow thresholds for the input images (a list of real\n    values in quotes, one per image). See also ``--shadow-threshold``.\n    \n--custom-shadow-threshold-list <arg> \n    A list having one image and one shadow threshold per line. For the\n    images specified there, override the shadow threshold supplied by\n    other means with this value.\n\n--robust-threshold <arg>\n    If positive, set the threshold for the robust\n    measured-to-simulated intensity difference (using the Cauchy\n    loss). Any difference much larger than this will be penalized.\n    A good value may be 5% to 25% of the average image value or the\n    same fraction of the computed image exposure values.\n\n--estimate-height-errors\n    Estimate the SfS DEM height uncertainty (in meters). This option is\n    obsolete. Use ``--save-variances`` instead (:numref:`sfs_unc`). This older\n    implementation works by finding the height perturbation at each grid point\n    which will make at least one of the simulated images at that point change by\n    more than twice the discrepancy between the unperturbed simulated image and\n    the measured image. The SfS DEM must be provided via the ``-i`` option. The\n    number of iterations, blending parameters (``--blending-dist``, etc.), and\n    smoothness weight are ignored. Results are not computed at image pixels in\n    shadow. This produces ``<output prefix>-height-error.tif``. No SfS DEM is\n    computed. See also ``--height-error-params``. This uncertainty may be overly\n    optimistic (:cite:`jindal2024measuring_v2`).\n\n--height-error-params <double integer (default: 5.0 100)>\n    Specify the largest height deviation to examine (in meters), and\n    how many samples to use from 0 to that height.\n\n--model-shadows\n    Model the fact that some points on the DEM are in the shadow\n    (occluded from the Sun).\n\n--sun-positions <string (default: \"\")>\n    A file having on each line an image name and three values in double\n    precision specifying the Sun position in meters in ECEF coordinates (origin\n    is planet center). Use a space as separator. If not provided, these will be\n    read from the camera file for ISIS and CSM models. See also\n    ``--sun-angles``.\n\n--sun-angles <string (default: \"\")>\n    A file having on each line an image name and two values in double precision\n    specifying the Sun azimuth and elevation in degrees, relative to the center\n    point of the input DEM. Use a space as separator. The azimuth is measured\n    clockwise from the North, and the elevation is measured from the horizon.\n    The site https://www.suncalc.org/ can help find these values. This is an\n    alternative to ``--sun-positions``. \n    \n--save-dem-with-nodata\n    Save a copy of the DEM while using a no-data value at a DEM\n    grid point where all images show shadows. To be used if shadow\n    thresholds are set.\n\n--save-variances\n    Save the uncalibrated variance of the DEM for each pixel. If ``--float-albedo`` is on,\n    also save the variance of the albedo. Note that computing the albedo\n    variance can be ill-posed if ``--float-haze`` and/or ``--float-exposure`` is\n    also on. See :numref:`sfs_outputs` for output filenames and\n    :numref:`sfs_unc` for usage.\n\n--save-covariances\n    In addition to saving the uncalibrated variance of the DEM (and albedo) at each pixel (as\n    for ``--save-variances``), also save the covariance between each DEM pixel\n    and its four immediate neighbors (left, right, top, bottom), and the same\n    for the albedo if ``--float-albedo`` is on. See :numref:`sfs_outputs` for\n    output filenames and :numref:`sfs_unc` for usage.\n\n--use-approx-camera-models\n    Use approximate camera models for speed. Only with ISIS .cub\n    cameras.\n\n--crop-input-images\n    Crop the images to a region that was computed to be large enough\n    and keep them fully in memory, for speed. This is the default\n    in the latest builds.\n\n--blending-dist <integer (default: 0)>\n    Give less weight to image pixels close to no-data or boundary\n    values. Enabled only when crop-input-images is true, for\n    performance reasons. Blend over this many pixels. See also\n    ``--blending-power``, ``--min-blend-size`` and\n    ``--allow-borderline-data``. See example in :numref:`sfs-lola`.\n\n--blending-power <double (default: 2.0)>\n    Raise the blending weights (they are no more to 1.0) to this\n    power. A higher value will result in smoother (but more abrupt)\n    blending as the weights decay faster close to 0.\n\n--min-blend-size <integer (default: 0)>\n    Do not apply blending in shadowed areas for which both the width and height\n    are less than this. This avoids losing data around small holes, but the\n    solution may become less smooth.\n\n--estimate-exposure-haze-albedo\n    Estimate the exposure for each image, the haze for each image (if\n    ``--num-haze-coeffs`` is positive), and the global low-resolution albedo (if\n    ``--float-albedo`` is on), then quit. This operation samples the input DEM\n    based on ``--num-samples-for-estim``. The produced files are described in\n    :numref:`sfs_outputs`. This is invoked automatically by ``parallel_sfs``\n    before running ``sfs`` proper, unless these quantities are provided as inputs.\n    \n--compute-exposures-only\n    This older option is equivalent to ``--estimate-exposure-haze-albedo``.\n\n--image-exposures-prefix <path>\n    Use this prefix to optionally read initial exposures (filename\n    is ``<path>-exposures.txt``).\n\n--input-albedo <string (default: \"\")>\n    The input albedo image, if known. Must have the same dimensions as the input\n    DEM. Otherwise it is initialized to 1. Can be refined with ``--float-albedo``.\n    \n--save-sim-intensity-only\n    Save the simulated image intensities at each DEM pixel for the given DEM,\n    images, cameras, and reflectance model, without refining the DEM. The output\n    files are of the form ``<output prefix>-*-sim-intensity.tif``. The image\n    exposures will be computed along the way unless specified via\n    ``--image-exposures-prefix``, and will be saved in either case to ``<output\n    prefix>-exposures.txt``. Same for haze, if applicable. See also\n    ``--save-meas-intensity-only``.\n\n--save-meas-intensity-only\n    Save the measured image intensities at each DEM pixel for the given DEM,\n    images, and cameras, without refining the DEM. The output files are of the form\n    ``<output prefix>-*-meas-intensity.tif`` for each input image. See\n    also ``--save-sim-intensity-only``.\n\n--ref-map <string (default: \"\")>\n    Save the simulated or measured intensity images to the extent given by this\n    mapprojected image. For use with ``--save-sim-intensity-only`` and\n    ``--save-meas-intensity-only``.\n    \n--allow-borderline-data\n    At the border of the region where there are no lit pixels in any\n    images, do not let the blending weights decay to 0. This\n    noticeably improves the level of detail. The\n    ``sfs_blend`` (:numref:`sfs_blend`) tool may need to be\n    used to further tune this region. See an\n    illustration in :numref:`sfs_borderline`.\n\n--low-light-threshold <float (default: -1.0)>\n    A threshold for low-light pixels. If positive, pixels with intensity between\n    this and the shadow threshold will be given less weight, if other images\n    have higher intensity values at the same ground point. This helps fix seams.\n    See usage in :numref:`sfs_seams`. See also ``--low-light-weight-power``,\n    ``--low-light-blur-sigma``, and ``--erode-seams``.\n\n--low-light-weight-power <float (default: 4.0)>\n    With the option ``--low-light-threshold``, the weight of a low-light pixel\n    is inversely proportional with the discrepancy between the simulated and\n    observed pixel value, raised to this power.\n\n--low-light-blur-sigma <float (default: 3.0)>\n    With the option ``--low-light-threshold``, apply a Gaussian blur with this\n    sigma to the low-light weight image, to make it continuous.\n\n--erode-seams\n    Be more aggressive in removing seam artifacts, even if this results in\n    erosion of valid terrain.\n                \n--model-coeffs-prefix <path>\n    Use this prefix to optionally read model coefficients from a\n    file (filename is ``<path>-model_coeffs.txt``).\n\n--model-coeffs <string of space-separated numbers>\n    Use the reflectance model coefficients specified as a list of numbers in\n    quotes. For example:\n\n    * Lunar-Lambertian: O, A, B, C, would be ``\"1 -0.019 0.000242 -0.00000146\"``\n    * Hapke: omega, b, c, B0, h, would be  ``\"0.68 0.17 0.62 0.52 0.52\"``\n    * Charon: A, f(alpha), would be ``\"0.7 0.63\"``\n\n--crop-win <xoff yoff xsize ysize>\n    Crop the input DEM to this region before continuing.\n\n--init-dem-height <float (default: NaN)>\n    Use this value for initial DEM heights (measured in meters, relative to the\n    datum). An input DEM still needs to be provided for georeference\n    information.\n\n--nodata-value <float (default: nan)>\n    Use this as the DEM no-data value, over-riding what is in the\n    initial guess DEM.\n\n--fix-dem\n    Do not float the DEM at all.  Useful when floating the model params.\n\n--float-reflectance-model\n    Allow the coefficients of the reflectance model to float (not\n    recommended).\n\n--query\n    Print some info, including DEM size and the solar azimuth and\n    elevation for the images, and exit. Invoked from parallel_sfs.\n\n-t, --session-type <string (default: \"\")>\n    Select the stereo session type to use for processing. Usually\n    the program can select this automatically by the file extension, \n    except for xml cameras. See :numref:`ps_options` for\n    options.\n \n--steepness-factor <double (default: 1)>\n    Try to make the terrain steeper by this factor. This is not\n    recommended in regular use.\n\n--curvature-in-shadow <double (default: 0)>\n     Attempt to make the curvature of the DEM (the Laplacian) at\n     points in shadow in all images equal to this value, which should\n     make the DEM curve down.\n\n--curvature-in-shadow-weight <double (default: 0)>\n     The weight to give to the curvature in shadow constraint.\n\n--lit-curvature-dist <double (default: 0)>\n    If using a curvature in shadow, start phasing it in this far from\n    the shadow boundary in the lit region (in units of pixels).\n\n--shadow-curvature-dist <double (default: 0)>\n    If using a curvature in shadow, have it fully phased in this far\n    from shadow boundary in the shadow region (in units of pixels).\n\n--integrability-constraint-weight <float (default: 0.0)>\n    Use the integrability constraint from Horn 1990 with this value\n    of its weight (experimental).\n\n--smoothness-weight-pq <float (default: 0.0)>\n    Smoothness weight for p and q, when the integrability constraint\n    is used. A larger value will result in a smoother solution\n    (experimental).\n\n--num-haze-coeffs <integer (default: 0)>\n    Set this to 1 to model the problem as ``image = exposure * albedo *\n    reflectance + haze``, where ``haze`` is a single value for each image\n    (:numref:`sfs_formulation`).\n\n--float-haze\n    If specified, float the haze coefficients as part of the optimization (if\n    ``--num-haze-coeffs`` is 1).\n\n--haze-prefix <string (default: \"\")>\n    Use this prefix to read initial haze values (filename is\n    ``<haze prefix>-haze.txt``). The file format is the same as what the\n    tool writes itself, when triggered by the earlier options. If haze is\n    modeled, it will be initially set to 0 unless read from such a\n    file, and will be floated or not depending on whether ``--float-haze``\n    is on. The final haze values will be saved to ``<output\n    prefix>-haze.txt``.\n\n--num-samples-for-estim <integer (default: 200)>\n    Number of samples to use for estimating the exposure, haze, and albedo. A large\n    value will result in a more accurate estimate, but will take a lot more memory.\n    \n--read-exposures\n    If set, read the image exposures with the current output prefix. Useful with\n    a repeat invocation from ``parallel_sfs``, when with this option the\n    exposures of the current tile are read, and not for the whole site. \n\n--read-haze\n    If set, read the haze values with the current output prefix. See also\n    ``--read-exposures``.\n\n--read-albedo\n    If set, read the computed albedo with the current output prefix. See also ``--read-exposures``.    \n     \n--gradient-weight <float (default: 0.0)>\n    The weight given to the cost function term which consists of sums\n    of squares of first-order derivatives. A larger value will result\n    in shallower slopes but less noise. This can be used in conjunction with \n    ``--smoothness-weight``. It is suggested to experiment with this\n    with a value of 0.0001 - 0.01, while reducing the\n    smoothness weight to a very small value.\n\n--save-sparingly\n    Avoid saving any results except the adjustments and the DEM, as\n    that's a lot of files.\n\n--camera-position-step-size <integer (default: 1)>\n    Larger step size will result in more aggressiveness in varying\n    the camera position if it is being floated (which may result\n    in a better solution or in divergence).\n\n--threads <integer (default: 8)>\n    How many threads each process should use. This will be changed to \n    1 for ISIS cameras when ``--use-approx-camera-models`` is not set,\n    as ISIS is single-threaded. Not all parts of the computation\n    benefit from parallelization.\n\n--cache-size-mb <integer (default = 1024)>\n    Set the system cache size, in MB.\n\n--tile-size <integer (default: 256 256)>\n    Image tile size used for multi-threaded processing.\n\n--no-bigtiff\n    Tell GDAL to not create BigTiff files.\n\n--tif-compress <None|LZW|Deflate|Packbits (default: LZW)>\n    TIFF compression method.\n\n-v, --version\n    Display the version of software.\n\n-h, --help\n    Display this help message.\n"
  },
  {
    "path": "docs/tools/sfs_blend.rst",
    "content": ".. _sfs_blend:\n\nsfs_blend\n---------\n\nThe ``sfs_blend`` tool is a very specialized DEM blending program\ndeveloped for use in conjunction with Shape-from-Shading\n(:numref:`sfs`). It replaces in an SfS-produced DEM height values that\nare in permanent shadow with values from the initial guess DEM used\nfor SfS (which is typically the LOLA gridded DEM), with a transition\nregion between the two DEMs.\n\nMotivation and an example of an invocation of this tool are given in\nthe :ref:`SfS usage <sfs_usage>` chapter.\n\nCommand-line options:\n\n--sfs-dem <arg>\n    The SfS DEM to process.\n\n--lola-dem <arg>\n    The LOLA DEM to use to fill in the regions in permanent shadow.\n\n--max-lit-image-mosaic <arg>   \n    The maximally lit image mosaic to use to determine the permanently\n    shadowed regions.\n\n--image-threshold <float>\n    The value separating permanently shadowed pixels from lit pixels\n    in the maximally lit image mosaic.\n\n--lit-blend-length <float>\n    The length, in pixels, over which to blend the SfS and LOLA DEMs\n    at the boundary of the permanently shadowed region towards the lit\n    region. Because of the weight blur below, the effective blending\n    length can be somewhat bigger than this.\n\n--shadow-blend-length <float>\n    The length, in pixels, over which to blend the SfS and LOLA DEMs\n    at the boundary of the permanently shadowed region towards the\n    shadowed region. Because of the weight blur below, the effective\n    blending length can be somewhat bigger than this.\n\n--weight-blur-sigma <float (default 0)> \n    The standard deviation of the Gaussian used to blur the weight\n    that performs the transition from the SfS to the LOLA DEM. A\n    higher value results in a smoother transition (this does not\n    smooth the DEMs). The extent of the blur is about 7 times this\n    deviation though it tapers fast to 0 before that. Set to 0 to not\n    use this operation.\n\n--min-blend-size <int (default 0)>\n    Do not apply blending in shadowed areas of dimensions less than\n    this, hence keeping there the SfS DEM.\n\n--output-dem <arg>\n    The blended output DEM to save.\n\n--output-weight <arg>\n    The weight showing the proportion of the SfS DEM in the blend with\n    the LOLA DEM (1 is for purely SfS and 0 is for purely LOLA).\n\n--threads <integer (default: 0)>\n    Select the number of threads to use for each process. If 0, use\n    the value in ~/.vwrc.\n \n--cache-size-mb <integer (default = 1024)>\n    Set the system cache size, in MB.\n\n--tile-size <integer (default: 256 256)>\n    Image tile size used for multi-threaded processing.\n\n--no-bigtiff\n    Tell GDAL to not create BigTiff files.\n\n--tif-compress <None|LZW|Deflate|Packbits (default: LZW)>\n    TIFF compression method.\n\n-v, --version\n    Display the version of software.\n\n-h, --help\n    Display this help message.\n"
  },
  {
    "path": "docs/tools/stereo.rst",
    "content": ".. _stereo:\n\nstereo\n------\n\nThe ``stereo`` program takes as input a stereo pair of images that\noverlap with corresponding camera models and creates an output point cloud\nimage that can be processed into a visualizable mesh or a DEM using\n:ref:`point2mesh` and :ref:`point2dem` respectively.\n\nThis program is deprecated and can be used only with ASP's original\nblock matching algorithm (``ASP_BM``). It is suggested to use instead\n``parallel_stereo`` (:numref:`parallel_stereo`).\n\nUsage::\n\n    stereo [options] <images> [<cameras>] <output_prefix>\n\nExample (for ISIS)::\n\n     stereo --stereo-algorithm asp_bm --subpixel-mode 1 \\\n       file1.cub file2.cub results/run\n\nExample (for DigitalGlobe Earth images)::\n\n     stereo -t dg --stereo-algorithm asp_bm --subpixel-mode 3 \\\n       file1.tif file2.tif file1.xml file2.xml                \\\n       results/run\n\nSee :numref:`tutorial` for introductory examples, :numref:`nextsteps` for the\nvarious stereo algorithms available, and :numref:`examples` for many usage\nexamples.\n\nHow to pass options to ``stereo`` via the command line or the ``stereo.default``\nconfiguration file is discussed in :numref:`stereodefault`. ``stereo`` creates a\nset of intermediate files, they are described in :numref:`outputfiles`.\n\nCommand-line options\n~~~~~~~~~~~~~~~~~~~~\n\n-t, --session-type <type_name>\n    Select the stereo session type to use for processing. Usually the program can select\n    this automatically by the file extension. See :numref:`parallel_stereo` for options.\n\n-s, --stereo-file <filename (default: ./stereo.default)>\n    Define the stereo.default file to use.\n\n-e, --entry-point <integer (from 0 to 5)>\n    Stereo Pipeline entry point. Start at this stage. See\n    :numref:`entrypoints`.\n\n--stop-point <integer (from 1 to 6)>  \n    Stereo Pipeline stop point (stop at the stage *right before* this).\n\n--corr-seed-mode <integer (from 0 to 3)>\n    Correlation seed strategy (:numref:`corr_section`).\n\n--threads <integer (default: 0)>\n    Select the number of threads to use for each process. If 0, use\n    the value in ~/.vwrc.\n\n--cache-size-mb <integer (default = 1024)>\n    Set the system cache size, in MB.\n\n--tile-size <integer (default: 256 256)>\n    Image tile size used for multi-threaded processing.\n\n--no-bigtiff\n    Tell GDAL to not create BigTiff files.\n\n--tif-compress <None|LZW|Deflate|Packbits (default: LZW)>\n    TIFF compression method.\n\n-v, --version\n    Display the version of software.\n\n-h, --help\n    Display the help message.\n\n"
  },
  {
    "path": "docs/tools/stereo_dist.rst",
    "content": ".. _stereo_dist:\n\nstereo_dist\n-----------\n\nThe ``stereo_dist`` program performs distributed stereo processing.  Nearly all\nsteps are run on small tiles in parallel across a set of computing nodes. This\nalso includes the preprocessing and filtering steps, which are serial in\n:ref:`parallel_stereo`. DEM creation per tile and mosaicking of produced DEMs are\nalso distributed.\n\nThis program requires that input images be mapprojected, or the ``--mapproject``\noption be passed in to mapproject them automatically. GNU Parallel manages the\njobs. It is expected that all nodes can connect to each other using ssh without\npassword and that they share the same storage space.\n\n.. _stereo_dist_example:\n\nExample with mapprojected images\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n::\n\n    stereo_dist                       \\\n      left_map.tif right_map.tif      \\\n      left.json right.json            \\\n      run/run                         \\\n      --dem input_dem.tif             \\\n      --tile-size 2048                \\\n      --tile-padding 256              \\\n      --nodes-list machines.txt       \\\n      --processes 5                   \\\n      --threads-multiprocess 4        \\\n      --threads-singleprocess 16      \\\n      --point2dem-options             \\\n        '--tr 2.0 \n        --orthoimage \n        --errorimage'\n\nThe input images must be mapprojected (:numref:`mapproj-example`). The\nmapprojection DEM should be set with ``--dem``. All output files\n(:numref:`outputfiles`) will start with the provided prefix (``run/run`` above).\n\nThe result of this program will be the stereo DEM (and optionally ortho and\nerror images). The workflow in :numref:`stereo_dist_workflow` has more details.\n\nThis program can be run on PBS and SLURM systems in a manner analogous to\n:ref:`parallel_stereo`. The ``--nodes-list`` option is then required. See\n:numref:`pbs_slurm` for details.\n\nThe option ``--point2dem-options`` must include ``--tr`` and the grid size\n(typically in meters) to ensure a consistent grid size across all tiles that are\nlater merged.\n\n.. _stereo_dist_mapproject:\n\nExample with raw images\n~~~~~~~~~~~~~~~~~~~~~~~\n\nWith the ``--mapproject`` option, raw (not mapprojected) images can be specified\nas inputs. The program will mapproject both images onto the DEM before running\nstereo.\n\n::\n\n    stereo_dist                 \\\n      --mapproject              \\\n      left.cub right.cub        \\\n      run/run                   \\\n      --nodes-list machines.txt \\\n      --dem input_dem.tif       \\\n      --tile-size 2048          \\\n      --tile-padding 256        \\\n      --point2dem-options       \\\n        '--tr 2.0'\n\nHere we omitted the cameras as those are contained in the cub files.\n\nThe projection is auto-determined based on the DEM and the left image\n(:numref:`mapproj_auto_proj`).\n\nThe mapprojection grid size (GSD) is set to the minimum of those estimated from\nthe input images.\n\nThe mapprojection region is the intersection of the regions for the two\nimages.\n\nAny of these can be explicitly set with ``--t_srs``, ``--tr``, and ``--t_projwin``\n(:numref:`stereo_dist_options`).\n\nThe mapprojected images are saved as ``<output prefix>-left_map.tif`` and\n``<output prefix>-right_map.tif``. Then, the same processing is done as with\npre-existing mapprojected images. These are reused with ``--entry-point 1`` or\nhigher.\n\n.. _stereo_dist_workflow:\n\nWorkflow\n~~~~~~~~\n\nThe processing is as follows:\n\n- The images are mapprojected (with the ``--mapproject`` option only).\n\n- Statistics is computed for the input mapprojected images. This is a serial\n  process but is quite fast.\n\n- The list of tiles is created and saved with a name based on the output prefix\n  and ending in ``-distTileList.txt``. A shapefile with the tile boundaries is\n  also created for visualization.\n\n- All tiles are run in parallel with the :ref:`stereo_tile` program. That\n  program creates a subdirectory for the given tile and provides the global\n  statistics via a symbolic link. It then does preprocessing, correlation,\n  refinement, filtering, triangulation, and DEM creation. These operations are\n  described in :numref:`entrypoints`.\n\n- The per-tile DEMs are mosaicked into a single output DEM with\n  :ref:`dem_mosaic`. This is done in parallel as well, for subsets of DEMs,\n  whose results are then mosaicked together.\n\n- If ``--orthoimage`` is in ``--point2dem-options``, the per-tile ortho images\n  (DRG files, :numref:`point2dem_ortho_err`) are mosaicked the same way. The\n  ``L.tif`` file needed by ``--orthoimage`` is autocompleted for each tile.\n  Similarly, if ``--errorimage`` is passed, the per-tile intersection error\n  images are mosaicked.\n\n- Unlike :ref:`parallel_stereo`, the blend step for disparities is skipped.\n  Each tile is processed fully independently, and blending only happens between\n  DEMs during the final mosaic.\n\nThe ``--entry-point`` and ``--stop-point`` options can be invoked to run only a\nportion of these steps. See :numref:`stereo_dist_options` for the step numbers.\n\nAny options that are not specific to this program are passed directly to\n:ref:`stereo_tile` and the stereo executables (:numref:`cmdline`).\n\n.. _stereo_dist_options:\n\nCommand-line options\n~~~~~~~~~~~~~~~~~~~~\n\n--dem <string>\n    Input DEM. Required. Used for mapprojection (with ``--mapproject``)\n    and for stereo triangulation.\n\n--mapproject\n    Mapproject the input images onto the DEM before running stereo. The\n    projection, grid size, and bounding box are auto-determined to be\n    consistent for both images. See :numref:`stereo_dist_mapproject`.\n\n--tile-size <integer (default: 2048)>\n    Size of each tile (in pixels) for distributed processing. This is before the\n    padding is added.\n\n--tile-padding <integer (default: 256)>\n    Padding around each tile (in pixels) to avoid boundary artifacts.\n\n--point2dem-options <string>\n    Options to pass to :ref:`point2dem`. Must include ``--tr`` to set\n    the grid size for consistent tiling. Can pass ``--orthoimage`` with\n    no argument, and the L.tif file for each tile will be autocompleted.\n    Can also pass ``--errorimage``. See :numref:`stereo_dist_workflow`.\n\n--nodes-list <filename>\n    A file containing the list of computing nodes, one per line. If not\n    provided, run on the local machine.\n\n--processes <integer>\n    The number of processes to use per node.\n\n--threads-multiprocess <integer>\n    The number of threads to use per process when running multiple processes.\n\n--threads-singleprocess <integer>\n    The number of threads to use when running a single process.\n\n-e, --entry-point <integer (default: 0)>\n    Stereo pipeline entry point. Values: 0=pprc, 1=corr, 2=blend (skipped,\n    kept for compatibility with :ref:`parallel_stereo` steps), 3=rfne,\n    4=fltr, 5=tri, 6=cleanup, 7=dem, 8=mosaic.\n\n--stop-point <integer (default: 9)>\n    Stereo pipeline stop point (stop before this step).\n\n--t_srs <string>\n    Output projection for mapprojection. A PROJ string, EPSG code, or path\n    to a WKT file. Auto-determined from the left image if not set. Only\n    used with ``--mapproject``.\n\n--tr <float>\n    Output grid size (ground sample distance) for mapprojection, in units of\n    the projection. Auto-determined as the finer of the two images if not\n    set. Only used with ``--mapproject``.\n\n--t_projwin <xmin ymin xmax ymax>\n    Bounding box for mapprojection in projected coordinates. Auto-determined as\n    the intersection of the two image footprints if not set. Only used with\n    ``--mapproject``. If the images are already mapprojected, use instead the\n    ``--proj-win`` option which will be passed to the stereo executables\n    (:numref:`stereodefault`).\n\n--parallel-options <string (default: \"--sshdelay 0.2\")>\n    Options to pass directly to GNU Parallel.\n\n--verbose\n    Display the commands being executed.\n\n--dry-run\n    Do not launch the jobs, only print the commands that should be run.\n\n-v, --version\n    Display the version of software.\n\n-h, --help\n    Display this help message.\n"
  },
  {
    "path": "docs/tools/stereo_gui.rst",
    "content": ".. _stereo_gui:\n\nstereo_gui\n----------\n\nThe ``stereo_gui`` program is a GUI frontend to ``stereo`` and\n``parallel_stereo`` (:numref:`parallel_stereo`). It can be used\nfor running stereo on small clips.\n\nIn addition, it can inspect the input images and produced datasets.\n\nUse as stereo front-end\n~~~~~~~~~~~~~~~~~~~~~~~\n\nThis program can be invoked just as ``parallel_stereo``::\n\n    stereo_gui [options] <images> [<cameras>] output_prefix [dem]\n\nHere is an example when using RPC cameras::\n \n    stereo_gui -t rpc left.tif right.tif left.xml right.xml run/run\n\nOne can zoom with the mouse wheel, or by dragging the mouse from\nupper-left to lower-right (zoom in), and vice-versa (zoom out). The\n``=`` and ``-`` keys zoom in and out (also in the ``View`` menu). Use\nthe arrow keys to pan (first click to bring the image in focus).\n\nBy pressing the ``Control`` key while dragging the mouse, clips can be\nselected in the input images, and then the stereo programs can be run\non these clips from the ``Run`` menu. The desired regions are passed\nto these programs via the ``--left-image-crop-win`` and\n``--right-image-crop-win`` options. The actual command being used will\nbe displayed on screen, and can be re-run on a more powerful\nmachine/cluster without GUI access.\n\nIf the images are map-projected (:numref:`mapproj-example`), the low-resolution\nDEM will show up as the third image. There is no need to select a clip in that\nDEM.\n\n.. figure:: ../images/stereo_gui.jpg\n   :name: asp_gui_fig\n   :alt: stereo_gui\n\n   An illustration of ``stereo_gui``. Stereo processing will happen on\n   the regions selected by red rectangles.\n\nIf this program is invoked with two images (with or without cameras\nand output prefix) and with values for ``--left-image-crop-win`` and\n``--right-image-crop-win``, it will draw the corresponding regions on\nstartup.\n\nSee also our tutorials in :numref:`tutorial`.\n\nUse as an image viewer\n~~~~~~~~~~~~~~~~~~~~~~\n\nThis program can be also used as a general-purpose image viewer, case in\nwhich no stereo options or cameras are necessary. It can\ndisplay arbitrarily large images with integer, floating-point, or RGB\npixels, including ISIS .cub files and DEMs. It handles large images by\nbuilding on disk pyramids of increasingly coarser subsampled images and\ndisplaying the subsampled versions that are appropriate for the current\nlevel of zoom.\n\nThe images can be shown either all side-by-side (default), several\nside-by-side (``--view-several-side-by-side``), as tiles on a grid\n(using ``--grid-cols integer``), or on top of each other (using\n``--single-window``).\n\nWhen the images are shown on top of each other, the option ``--use-georef`` will\noverlay the images correctly if georeference information is present. In recent\nbuilds this is the default, if all georeferences exist, and this mode can be\nturned off with ``--no-georef``.\n\nIt is possible to switch among the various display modes from the ``View`` menu.\n\nWhen the images are shown side-by-side, the GUI can zoom in all images to the\nsame region, for easier comparison among them. This is accessible from the\n``View`` menu and with the option ``--zoom-all-to-same-region``.\n\nWhen the images are in a single window, an individual image can be\nturned on or off via a checkbox. Clicking on an image's name will zoom\nto it and display it on top of other images. By right-clicking on an\nimage name, other operations can be performed, such as hillshading,\netc.\n\nIn this mode, the keys ``n`` and ``p`` can be used to cycle among\nthe images.\n\n.. _stereo_gui_other:\n\nOther features\n~~~~~~~~~~~~~~\n\nThe ``stereo_gui`` program can:\n\n  - Create and show hillshaded DEMs (:numref:`stereo_gui_hillshade`).\n   \n  - Colorize images on-the-fly (``--colorize``) and optionally show a\n    colorbar with axes (``--colorbar``). See :numref:`colorize`.\n\n  - Display the output of the ASP ``colormap`` and ``hillshade`` tools\n    (:numref:`colormap`, :numref:`hillshade`).\n\n  - Overlay scatter plots on top of images (:numref:`plot_csv`).\n\n  - Overlay and edit polygons (:numref:`plot_poly`).\n\n  - Find pixel values and region bounds (:numref:`image_bounds`).\n\n  - View (:numref:`stereo_gui_view_ip`) and edit (:numref:`stereo_gui_edit_ip`)\n    interest point matches displayed on top of images.\n\n  - Load .nvm files having an SfM solution (:numref:`stereo_gui_nvm`).\n   \n  - View ISIS ``jigsaw`` control network files (:numref:`stereo_gui_isis_cnet`).\n\n  - View GCP and .vwip files (:numref:`stereo_gui_vwip_gcp`).\n\n  - Create GCP with georeferenced images and a DEM (:numref:`creatinggcp`).\n\n  - Create interest point matches using mapprojected images (:numref:`mapip`).\n\n  - Threshold images (:numref:`thresh`).\n   \n  - Cycle through images, showing one at a time (:numref:`gui_cycle`).\n\n  - Save a screenshot to disk in the BMP or XPM format.\n\n.. _stereo_gui_hillshade:\n\nHillshading\n~~~~~~~~~~~\n\nThe ``stereo_gui`` program can create and display hillshaded DEMs. Example::\n\n    stereo_gui --hillshade dem.tif\n\nOr, after the DEM is open, select from the GUI View menu the ``Hillshaded\nimages`` option. \n\nRight-click to change the azimuth and elevation angles, hence the direction and\nheight of the light source. Then toggle hillshading off and then on again.\n\nHillshaded images can also be produced with the ``hillshade`` tool\n(:numref:`hillshade`) or with ``gdaldem hillshade`` (:numref:`gdal_tools`).\n\nImages that are both colorized and hillshaded can be created with ``colormap``\n(:numref:`colormap`), and then loaded in this program.\n\n.. _colorize:\n\nDisplaying colorized images, with a colorbar and axes\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n``stereo_gui`` can have images be colorized on-the-fly by mapping intensities to\ncolors of a given colormap. Optionally, a colorbar with axes (ticks) can be\nshown next to each image.\n\nCSV files can be colorized as well.\n\nThe ``--colorize`` and ``--colorbar`` flags are per-image with sticky semantics:\neach applies to all subsequent images until turned off by ``--no-colorize`` or\n``--no-colorbar``. The ``--colorbar`` flag implies ``--colorize``.\n\nAn example invocation is as follows::\n\n    stereo_gui --colorbar              \\\n      --colormap-style inferno         \\\n      img1.tif                         \\\n      --colormap-style binary-red-blue \\\n      img2.tif                         \\\n      --no-colorbar                    \\\n      img3.tif\n\nThis will colorize the first two images (with colorbar) using the ``inferno``\nand ``binary-red-blue`` colormaps respectively. The third image is still\ncolorized (because ``--no-colorbar`` does not turn off colorization) but has\nno colorbar. Use ``--no-colorize`` to fully turn off colorization. See\n:numref:`colormap` for the full list of colormaps.\n\nEach ``--colormap-style`` option also applies to all subsequent images until\noverridden by this option with another value.\n\nThe range of intensities of each colorized image is computed automatically.\nRight-click in each image to adjust this range. The ``--min`` and ``--max``\noptions will set values for these that will apply to all images.\n\nColorization works as well with overlaid and georeferenced images.\n\n.. figure:: ../images/colorbar_axes.png\n   :name: colorbar_axes_fig\n   :alt: colorbar_axes_fig.\n\n   An illustration of displaying images with specified colormap, with colorbar\n   and axes, and without them. See :numref:`scattered_points_colorbar` for\n   an example having scattered points.\n\n.. _plot_csv:\n\nView scattered points\n~~~~~~~~~~~~~~~~~~~~~\n\n``stereo_gui`` can plot and colorize scattered points stored in CSV files, and\noverlay them on top of images or each other. Each point will show up as a dot\nwith a radius given by ``--plot-point-radius``. Use ``--colorize`` or\n``--colorbar`` to enable colorization. A colorbar and axes can be shown as\nwell (:numref:`scattered_points_colorbar`).\n\nHere is an example of plotting the final ``*pointmap.csv``\nresiduals created by ``bundle_adjust`` for each interest point\n(:numref:`ba_out_files`)::\n\n    stereo_gui --colorize --colormap-style binary-red-blue \\\n      --min 0 --max 0.5 --plot-point-radius 2              \\\n      ba/run-final_residuals_pointmap.csv\n\nThis will use the longitude and latitude as the position, and will\ndetermine a color based on the 4th field in this file (the error) and\nthe min and max values specified above (which correspond to blue\nand red in the colorized plot, respectively). \n\nFiles whose name contain the strings ``match_offsets`` and ``anchor_points``\n(created by ``bundle_adjust`` and ``jitter_solve``, :numref:`jitter_solve`), and\nerror files created by ``pc_align`` (:numref:`pc_align_error`) can be plotted\nthe same way. Same with ``diff.csv`` files created by ``geodiff``\n(:numref:`geodiff`), only in the latter case the third (rather than fourth)\ncolumn will have the intensity (error) value.\n\nThe option ``--colormap-style`` accepts the same values as\n``colormap`` (:numref:`colormap`).\n\nTo plot an arbitrary CSV file with longitude, latitude and value, do::\n\n    stereo_gui --csv-format \"1:lon 2:lat 3:height_above_datum\" \\\n      --datum D_MOON --colorize                                \\\n      filename.csv\n\nIf the file has data in projected units (such as using Easting and\nNorthing values), specify the option ``--csv-srs`` having the\nprojection, and use for the CSV format a string such as::\n\n  \"1:easting 2:northing 3:height_above_datum\"\n\n.. figure:: ../images/scattered_points.png\n   :name: scattered_points\n   :alt:  scattered_points\n\n   A colorized CSV file overlaid on top of a georeferenced image.\n\n.. figure:: ../images/scattered_points_colorbar.png\n   :name: scattered_points_colorbar\n   :alt:  scattered_points_colorbar\n\n   A colorized CSV file with a colorbar and axes. This uses the ``--colorbar``\n   option. Datasets with colorbars are displayed side-by-side\n   (:numref:`colorize`).\n\n.. _plot_poly:\n\nPolygon editing and contouring\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n``stereo_gui`` can be used to draw and edit polygonal shapes on top of\ngeoreferenced images, save them as shape files (``*.shp``) or in plain text, and\nload such files from the command line (including ones produced with external\ntools). The editing functionality can be accessed by turning on polygon editing\nfrom the ``Vector layer`` menu, and then right-clicking with the mouse to access\nthe various functions.\n\nTo create polygons, click with the left mouse button on points to be\nadded. When clicking close to the starting point, the polygon becomes\nclosed and and a new one can be drawn. A single point can be drawn by\nclicking twice in the same location. To draw a segment, click on its\nstarting point, ending point, and then its starting point again.\n*One must return to the starting point for the polygon to be recorded.*\n\nThe resulting shapes can be saved from the right-click menu as shapefiles or in\nplain text. The shapefile specification prohibits having a mix of points,\nsegments, and polygons in the same file, so all drawn shapes must be of the same\nkind.\n\nWhen reading polygons and georeferenced images from disk, choose \"View\nas georeferenced images\" to plot the polygons on top of the images.\n\n.. figure:: ../images/stereo_gui_poly.png\n   :name: stereo_gui_poly\n   :alt: stereo_gui_poly\n\n   A polygon drawn on top of a georeferenced image, in the \"move vertices\"\n   editing mode.\n\nPlain-text polygon files\n^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe ``stereo_gui`` program can overlay plain-text polygon files on top of\nimages, such as::\n\n    stereo_gui --use-georef --single-window \\\n        poly1.txt poly2.txt image.tif\n\nif each of these has georeference (and csv format) information. That is the\ncase when the polygons were created in the GUI and saved to disk. \nThis polygon format is described in :numref:`poly_files`.\n\nTo display polygons from any text file, additional options should be specified,\nsuch as::\n\n    stereo_gui --style poly --csv-format 1:lon,2:lat \\\n        --csv-datum D_MOON poly.csv\n\nIf such a file has multiple columns, the indices above can be changed\nto the ones desired to plot. Files having Easting-Northing information\ncan be loaded as in :numref:`plot_csv`, while omitting the third\ncolumn in the csv format string.\n\nIf no georeference information exists, the CSV format can be \nset to ``1:x,2:y`` if it is desired to have the y axis point up, and \n``1:pix_x,2:pix_y`` if it should point down, so that such polygons\ncan be overlaid on top of images.\n\nAny polygon properties set in the files will override the ones specified on the\ncommand line, to ensure that files with different properties can be loaded\ntogether.\n\n.. _gdal_rasterize_example:\n\nApplications\n^^^^^^^^^^^^\n\nThe ``gdal_rasterize`` command can be used to keep or exclude the portion of a\ngiven georeferenced image or a DEM that is within or outside a polygonal shape.\nExample::\n\n  gdal_rasterize -i -burn <nodata_value> poly.shp dem.tif\n\nHere, if the DEM nodata value is specified, the DEM will be edited and\nvalues outside the polygon will be replaced with no data.\n\nThe ``stereo_gui`` program can find the polygonal contour at a given image\nthreshold (which can be either set or computed from the ``Threshold`` menu).\nThis option is accessible from the ``Vector layer`` menu as well, with or\nwithout the polygon editing mode on.\n\n.. _image_bounds:\n\nFinding pixel values and region bounds\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nWhen clicking on a pixel of an image opened in ``stereo_gui``, the\npixel indices and image value at that pixel will be printed on screen.\n\nWhen selecting a region by pressing the ``Control`` key while dragging\nthe mouse, the region pixel bounds (``src win``) will be displayed on\nscreen. If the image is geo-referenced, the extent of the region in\nprojected coordinates (``proj win``) and in the longitude-latitude\ndomain (``lonlat win``) will be shown as well.\n\nThe pixel bounds can be used to crop the image with ``gdal_translate\n-srcwin`` (:numref:`gdal_tools`) and with the ISIS ``crop``\ncommand. The extent in projected coordinates can be used to crop\nwith ``gdal_translate -projwin``, and is also accepted by\n``gdalwarp``, ``point2dem``, ``dem_mosaic``, and ``mapproject``,\nfor use with operations on regions.\n\nOne can zoom to a desired proj win from the ``View`` menu. This is helpful\nto reproduce a zoom level. If multiple images are present,\nthe proj win used is for the first one. This can be invoked at startup\nvia ``--zoom-proj-win``.\n\n.. _stereo_gui_view_ip:\n\nView interest point matches\n~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n``stereo_gui`` can be used to view interest point matches (``*.match``\nfiles), such as generated by ``ipmatch`` (:numref:`ipmatch`),\n``bundle_adjust`` (:numref:`bundle_adjust`), or\n``parallel_stereo``. Several modes are supported.\n\nView matches for an image pair\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe match file to load can be specified via ``--match-file``, or loaded\nbased on extension, so both of these will work::\n\n    stereo_gui left.tif right.tif            \\\n      --match-file run/run-left__right.match\n\n    stereo_gui left.tif right.tif run/run-left__right.match\n\nThe match file may also be auto-detected if ``stereo_gui`` was invoked like\n``parallel_stereo``, with an output prefix::\n\n   stereo_gui left.tif right.tif run/run\n\nand then the match file is loaded from the *IP matches -> View IP matches*\nmenu. (Auto-detection works only when the images are not\nmapprojected, stereo was not run on image clips, and alignment method\nis not ``epipolar`` or ``none``.)\n\nPlain-text match files (:numref:`txt_match`) can be loaded as::\n\n    stereo_gui           \\\n      --matches-as-txt   \\\n      left.tif right.tif \\\n      --match-file run/run-left__right.txt\n\nThese two options must be explicitly set, as otherwise the program may mistake\nthe text file for a CSV file.\n\nSee also editing of interest point matches in\n:numref:`stereo_gui_edit_ip`.\n\n.. _stereo_gui_pairwise_matches:\n\nView pairwise matches for *N* images\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nGiven *N* images and interest point matches among any of them, such as\ncreated by ``bundle_adjust``, the options ``--pairwise-matches`` and\n``--pairwise-clean-matches`` (:numref:`gui_options`), also accessible\nfrom the *IP matches* menu, can load the match file for a selected\nimage pair if the output prefix was specified. For that, run::\n\n   stereo_gui --pairwise-matches image1.tif ... imageN.tif run/run\n\nthen select a couple of images to view using the checkboxes on the\nleft, and their match file will be displayed automatically. \n\nThis mode is available also from the *View* menu.\n\nSee an illustration in :numref:`asp_gui_nvm`.\n\n.. _stereo_gui_N_image_matches:\n\nView all matches for *N* images\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThis mode allows viewing (and editing, see\n:numref:`stereo_gui_edit_ip`), interest points for *N* images at once,\nbut some rigid and a bit awkward conventions are used, to be able to\ndisplay all those points at the same time.\n\nFor image i, the match file must contain the matches from image i-1 to\ni, or from image 0 to i. You can provide these match files to\n``stereo_gui`` by conforming to its naming convention\n(``output-prefix-fname1__fname2.match``) or by selecting them from the\nGUI when prompted. All match files must describe the same set of\ninterest points. The tool will check the positions of loaded points\nand discard any that do not correspond to the already loaded points.\n\nRun::\n\n    stereo_gui image1.tif ... imageN.tif run/run\n\n(the last string is the output prefix). Select viewing of interest\npoint matches. \n\nIf one of the match files fails to load or does not contain\nenough match points, the missing points will be added to an\narbitrary position and flagged as invalid. You must either validate\nthese points by manually moving them to the correct position or else\ndelete them.\n\n.. _stereo_gui_nvm:\n\nView NVM files\n^^^^^^^^^^^^^^\n\nThis tool can also visualize pairwise interest point matches loaded\nfrom a plain-text .nvm file created by a Structure-from-Motion tool, such as\n``theia_sfm`` (:numref:`theia_sfm`) and ``rig_calibrator``\n(:numref:`rig_calibrator`).\n\nThis file normally has all features shifted relative to the camera optical\ncenter. Then an associated ``_offsets.txt`` file must exist having the optical\ncenter per image. The above-mentioned programs write such an offset file. This\nfile is auto-loaded along with the .nvm file.\n\nAn .nvm file having features that are not shifted can be loaded as\nwell. Such files are created by ``rig_calibrator`` with the\n``--save_nvm_no_shift`` option (:numref:`rig_calibrator`). \nIn this case, call ``stereo_gui`` with the additional option\n``--nvm-no-shift``.\n\nExample::\n\n    stereo_gui --nvm-no-shift --nvm nvm_no_shift.nvm\n\n(The ``--nvm`` option can also be omitted, and only the file itself\ncan be specified.)\n\nIn this mode, the lowest-resolution subimage size is larger than\nusual, to avoid creating small files.  See\n``--lowest-resolution-subimage-num-pixels``.\n\n.. figure:: ../images/stereo_gui_nvm.png\n   :name: asp_gui_nvm\n   :alt: stereo_gui_nvm.\n\n   An illustration of ``stereo_gui`` displaying an .nvm file. \n   Pairs of images can be chosen on the left, and matches will be shown.\n   The images were created with the MSL Curiosity rover (:numref:`rig_msl`).\n\n.. _stereo_gui_isis_cnet:\n\nView ISIS control network files\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe ISIS jigsaw (:numref:`jigsaw`) binary control network format can be\nvisualized as::\n\n  stereo_gui <image files> --isis-cnet <cnet file>\n\nThis file is expected to end with ``.net``. The images must be the same as in the\ncontrol network, and in the same order, or else the results will be incorrect.\nThis file format does not keep track of the image names.\n\nASP's ``bundle_adjust`` can also create and update such files\n(:numref:`control_network`). Then, non-ISIS images can be used as well, and this\ntool can load the resulting control network. \n\n.. _stereo_gui_vwip_gcp:\n\nView GCP and .vwip files\n~~~~~~~~~~~~~~~~~~~~~~~~\n\nThis tool can show the interest points from a GCP file (:numref:`bagcp`).\nExample::\n\n    stereo_gui image1.tif ... imageN.tif --gcp-file mygcp.gcp\n\nThis works even for a single image. If ``--gcp-file`` is not specified\nbut the GCP file is provided, this file will still be loaded.\n\nCreating GCP is described in :numref:`creatinggcp`. \n\nThe ``stereo_gui`` program can also display ``.vwip`` files. Those are\ninterest points created by ``ipfind``, ``bundle_adjust``, or\n``parallel_stereo``, before they are matched across images. One should\nspecify as many such files as images when launching this program.\n\n.. _stereo_gui_edit_ip:\n\nEdit interest point matches\n~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n``stereo_gui`` can be used to manually create and delete interest\npoint matches (useful in situations when automatic interest point\nmatching is unreliable due to large changes in illumination). This\nworks for *N* images.\n\nExample::\n\n    stereo_gui image1.tif ... imageN.tif run/run\n\n(the last string is the output prefix).\n\nSelect from the top menu::\n\n    IP matches -> View IP matches\n\nIf some matches exist already, they will be loaded, per\n:numref:`stereo_gui_N_image_matches`. Do not use\n``--pairwise-matches`` and ``--pairwise-clean-matches`` here.\n\nInterest point matches can be created or deleted with the right-mouse\nclick. This works whether a pre-existing match file was loaded, or\nstarting from scratch.\n\nTo move interest points, right-click on an image and check \"Move match\npoint\". While this is checked, one can move interest points by clicking\nand dragging them within the image extent.  Uncheck \"Move match point\" to\nstop moving interest points.\n\nThe edited interest point matches can be saved from the *IP matches* menu.\n:numref:`ba_match_files` describes the naming convention (both for\n``bundle_adjust`` and ``parallel_stereo``). Then these programs will be able to\npick up the produced matches.\n\nIf handling *N* images at once becomes too complicated, it is suggested\nto edit the matches one pair at a time.\n\n.. _creatinggcp:\n\nCreating GCP with with an orthoimage and a DEM\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThere exist situations when one has one or more images for which the camera\nfiles are either inaccurate or, for Pinhole camera models, just the intrinsics\nmay be known. \n\nGiven a DEM of the area of interest, and optionally an orthoimage (mapprojected\nimage, georeferenced image), these an be used to create GCP files\n(:numref:`bagcp`). GCP can be provided to ``bundle_adjust`` to refine the camera\nposes, transform the cameras to given coordinates, or to create new\ncameras (:numref:`ba_use_gcp`).\n\nA DEM can be obtained using the instructions in :numref:`initial_terrain`.\nUse, if applicable, ``dem_geoid`` to convert the DEM to be relative\nto an ellipsoid.\n\nOpen the desired images, the orthoimage, the DEM, and the GCP file to\nbe created in the GUI, as follows::\n\n    stereo_gui img1.tif img2.tif img3.tif \\\n      ortho.tif                           \\\n      --dem-file dem.tif                  \\\n      --gcp-file output.gcp               \\\n      --gcp-sigma 1.0                     \\\n      run/run\n\nThe orthoimage must be after the images for which GCP will be\ncreated. If no orthoimage exists, one can use the given DEM\ninstead (and it can be hillshaded after loading to easier identify\nfeatures).\n\nThe ground locations are found from the orthoimage and their elevations from the\nDEM. The interest points in the orthoimage are not saved to the GCP file.\n\nA feature is identified and manually added as a matching interest point (match\npoint) in all open images, from left to right. For that, use the right\nright-click menu, and select ``Add match point``. This process is repeated a few\ntimes. If the match point is not added in all images before starting with a new\none, that will result in an error.  The match points can be moved around by\nright-clicking to turn on this mode, and then dragging them with the mouse.\n\nWhen done creating interest points, use the ``IP matches -> Write GCP file``\nmenu item to save the GCP file. It is suggested to save the interest point\nmatches from the same menu, as later those can be edited and reused to create\nGCP, while GCP cannot be edited.\n\nIf above the reference DEM and GCP file were not set, the GUI\nwill prompt for their names.\n\nIf having many images, this process can be repeated for several small sets,\ncreating several GCP files that can then be passed together to ``bundle_adjust``.\n\nThe sigmas for the GCP should be set via the option ``--gcp-sigma``. Or use\n``bundle_adjust`` with the option ``--fix-gcp-xyz`` to ensure GCP are kept\nfixed during optimization.\n \nGCP can be visualized in ``stereo_gui`` (:numref:`stereo_gui_vwip_gcp`).\n\nIf the input images and the orthoimage are very similar visually, one can \ntry to automatically detect and load interest point matches as follows::\n\n    ipfind img.tif ortho.tif\n    ipmatch img.tif ortho.tif\n    stereo_gui img.tif ortho.tif    \\\n      --match-file img__ortho.match \\\n      --dem-file dem.tif            \\\n      --gcp-file output.gcp         \\\n      --gcp-sigma 1.0\n\nThen, the interest points can be inspected and edited as needed, and the GCP\nfile can be saved as above. See the documentation of ``ipfind``\n(:numref:`ipfind`) and ``ipmatch`` (:numref:`ipmatch`), for how to increase the\nnumber of matches, etc.\n\nLastly, non-GUI automatic approaches exists as well. Two methods are supported:\ntying a raw image to an orthoimage and a DEM (:numref:`gcp_gen`), and tying a\nproduced DEM to a prior DEM (:numref:`dem2gcp`).\n\nSee earlier in this section for how GCP can be used.\n\n.. _mapip:\n\nCreating interest point matches using mapprojected images\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nTo make it easier to create interest point matches in situations when the images\nare very different or taken from very diverse perspectives, the images can be\nfirst mapprojected onto a DEM, as then they look a lot more similar. The\ninterest points are created among the mapprojected images, and the matches are\ntransferred to the original images.\n\nThis section will describe how to do this with automatic and manual (GUI) means.\n\nGiven three images ``A.tif``, ``B.tif``, and ``C.tif``,\ncameras ``A.tsai``, ``B.tsai``, and ``C.tsai``, and a DEM named ``dem.tif``,\nmapproject the images onto this DEM (:numref:`mapproject`), obtaining the images\n``A.map.tif``, ``B.map.tif``, and ``C.map.tif``.\n\n::\n\n    for f in A B C; do\n        mapproject --tr 1.0 dem.tif $f.tif $f.tsai $f.map.tif\n    done\n\nThe same resolution (option ``--tr``) should be used for all images, which should\nbe a compromise between the ground sample distance values for these images.\n\nSee :numref:`mapproj-example` how how to find a DEM for mapprojection and other\ndetails.\n\nBundle adjustment will find interest point matches among the mapprojected images,\nand transfer them to the original images. Run::\n\n    bundle_adjust A.tif B.tif C.tif A.tsai B.tsai C.tsai          \\\n      --mapprojected-data 'A.map.tif B.map.tif C.map.tif dem.tif' \\\n      --min-matches 0 -o run/run \n\nThis will not recreate any existing match files either for\nmapprojected images or for unprojected ones. If that is\ndesired, existing match files need to be deleted first.\n\nAdd options such as ``--ip-per-tile 250 --matches-per-tile 250`` if needed to\nincrease the number of interest point matches.\n\nIf these images become too many to set on the command line, use the \noptions ``--image-list``, ``--camera-list``, ``--mapprojected-data-list``\n(:numref:`ba_options`).\n\nThe DEM at the end of this option is optional in the latest builds, \nif it can be looked up from the geoheader of the mapprojected images.\n\nEach mapprojected image stores in its metadata the name of the original\nimage, the camera model, the bundle-adjust prefix, if any, and the DEM it\nwas mapprojected onto. Hence, the above command will succeed even if invoked\nwith different cameras than the ones used for mapprojection, as long as the \noriginal cameras are still present and did not change. \n\nIf the mapprojected images are still too different for interest point\nmatching among them to succeed, one can try to bring in more images that\nare intermediate in appearance or illumination between the existing\nones, so bridging the gap. \n\nAlternatively, interest point matching can be done *manually* in the GUI as\nfollows::\n\n     stereo_gui --view-matches A.map.tif B.map.tif C.map.tif run/run\n\nInterest points can be picked by right-clicking on the same feature in each\nimage, from left to right, and selecting ``Add match point``. Repeat this\nprocess for a different feature. The matches can be saved to disk from the menu.\n\nThe bundle adjustment command from above can be invoked to unproject the\nmatches. Do not forget to first delete first the match files among unprojected\nimages so that ``bundle_adjust`` can recreate them based on the projected\nimages.\n\nRun::\n\n     stereo_gui --view-matches A.tif B.tif C.tif run/run\n     \nto check if the interest point matches, that were created using mapprojected\nimages, were correctly transferred to the original images. Consider using instead\nthe option ``--pairwise-matches`` if some features are not seen in all images.\n\nSee :numref:`sfs3` for an illustration of this process.\n\nIt is suggested to use ``--mapprojected-data`` with ``--auto-overlap-params.`` \nThen, the interest point matching will be restricted to the region of overlap\n(expanded by the percentage in the latter option).\n    \n.. figure:: ../images/sfs3.jpg\n   :name: sfs3\n   :alt: interest points picked manually\n\n   An illustration of how interest points are picked manually for the\n   purpose of bundle adjustment. This is normally not necessary\n   if there exist images with intermediate illumination.\n\n.. _thresh:\n\nImage threshold\n~~~~~~~~~~~~~~~\n\n``stereo_gui`` can be used to compute an image threshold for each of a\ngiven set of images based on sampling pixels (useful for\nshape-from-shading, see :numref:`sfs_usage`). This can be done by turning on\nfrom the menu the ``Threshold detection`` mode, and then\nclicking on pixels in the image. The largest of the chosen pixel\nvalues will be set to the threshold for each image and printed\nto the screen.  \n\nFrom the same menu it is possible to see or change the current threshold.\n\nTo highlight in the images the pixels at or below the image threshold,\nselect from the menu the ``View thresholded images`` option. Those\npixels will show up in red.\n\nRelated to this, if the viewer is invoked with ``--nodata-value\n<double>``, it will display pixels with values less than or equal to\nthis as transparent, and will set the image threshold to that no-data\nvalue.\n\n.. _gui_cycle:\n\nCycle through images\n~~~~~~~~~~~~~~~~~~~~\n\nTo load only one image at a time, for speed, specify all images on the command\nline, together with the ``--preview`` option. Then, can cycle through them with\nthe 'n' and 'p' keys.\n\nIn this mode, the lowest-resolution subimage size is larger than usual to avoid\ncreating small images when building an image pyramid. See\n``--lowest-resolution-subimage-num-pixels``.\n\nSee also\n~~~~~~~~\n\nThe ``sfm_view`` tool (:numref:`sfm_view`) can visualize cameras in orbit.\n\nThe ``asp_plot`` package (:numref:`asp_plot`) can generate diagnostic plots and\nPDF reports from ASP outputs.\n\nThe ``orbit_plot.py`` tool (:numref:`orbit_plot`) can visualize camera\norientations along an orbit.\n\n.. _gui_options:\n\nCommand line options for ``stereo_gui``\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nListed below are the options specific to ``stereo_gui``. It will\naccept all other ``parallel_stereo`` options as well.\n\n--grid-cols <integer (default: 1)>\n    Display images as tiles on a grid with this many columns.\n\n--window-size <integer integer (default: 1200 800)>\n    The width and height of the GUI window in pixels.\n\n-w, --single-window\n    Show all images in the same window (with a dialog to choose\n    among them) rather than next to each other.\n\n--preview\n    Load and display the images one at a time, for speed. The 'n' and\n    'p' keys can be used to cycle through them.\n\n--view-several-side-by-side\n    View several images side-by-side, with a dialog to choose which\n    images to show (also accessible from the View menu).\n\n--use-georef\n    Plot the images in the projected coordinate system given by\n    the image georeferences. This is currently the default, and \n    can be turned off with ``--no-georef`` or from the View menu.\n\n--nodata-value <double (default: NaN)>\n    Pixels with values less than or equal to this number are treated\n    as no-data and displayed as transparent. This overrides the\n    no-data values from input images.\n\n--hillshade\n    Interpret the input images as DEMs and hillshade them.\n\n--hillshade-azimuth\n    The azimuth value when showing hillshaded images.\n\n--hillshade-elevation\n    The elevation value when showing hillshaded images.\n\n--view-matches\n    Locate and display the interest point matches for a stereo pair.\n    See also ``--view-pairwise-matches``,\n    ``--view-pairwise-clean-matches``.\n\n--match-file\n    Display this match file instead of looking one up based on\n    existing conventions (implies ``--view-matches``).\n\n--pairwise-matches\n    Show images side-by-side. If just two of them are selected,\n    load their corresponding match file, determined by the\n    output prefix. Also accessible from the menu.\n\n--pairwise-clean-matches\n    Same as ``--pairwise-matches``, but use ``*-clean.match`` files.\n\n--nvm <string (default=\"\")>\n    Load this .nvm file having interest point matches. See also\n    ``--nvm-no-shift``. The ``rig_calibrator`` program\n    (:numref:`rig_calibrator`) can create such files. This option implies\n    ``--pairwise-matches``.\n\n--nvm-no-shift\n    Assume that the image features in the input nvm file were saved without\n    being shifted to be relative to the optical center of the camera.\n    \n--isis-cnet <string (default=\"\")>\n    Load a control network having interest point matches from this binary file\n    in the ISIS jigsaw format. See also ``--nvm``.\n        \n--gcp-file\n    Display the GCP pixel coordinates for this GCP file (implies\n    ``--view-matches``).  Also save here GCP if created from the\n    GUI. See also ``--gcp-sigma``.\n\n--gcp-sigma <double (default: 1.0)>\n    The sigma (uncertainty, in meters) to use for the GCPs (:numref:`bagcp`). A\n    smaller sigma suggests a more accurate GCP. See also option\n    ``--fix-gcp-xyz`` in ``bundle_adjust`` (:numref:`ba_options`).\n\n--dem-file\n    Use this DEM when creating GCP from images.\n\n--hide-all\n    Start with all images turned off (if all images are in the same\n    window, useful with a large number of images).\n\n--zoom-proj-win <double double double double>\n    Zoom to this proj win on startup (:numref:`image_bounds`). It is\n    assumed that the images are georeferenced. Also accessible from\n    the *View* menu.  This implies ``--zoom-all-to-same-region``.\n\n--zoom-all-to-same-region\n    Zoom all images to the same region. Also accessible from the *View* menu.\n\n--colorize\n    Colorize all images and/or CSV files after this option until\n    ``--no-colorize`` is encountered. Per-image flag with sticky\n    semantics (:numref:`colorize`).\n\n--no-colorize\n    Turn off colorization for subsequent images, until ``--colorize``\n    or ``--colorbar`` is encountered.\n\n--colorbar\n    Colorize all images and/or CSV files after this option until\n    ``--no-colorbar`` is encountered, and show a colorbar with axes\n    (:numref:`colorize`). Implies ``--colorize``. Right-click in each\n    image to adjust the range of intensities to colorize.\n\n--no-colorbar\n    Turn off the colorbar for subsequent images, until ``--colorbar``\n    is encountered. Does not turn off colorization.\n\n--colormap-style <string (default=\"binary-red-blue\")>\n    Specify the colormap style. See :numref:`colormap` for options.\n    Each style applies to all images after this option, until\n    overridden by another instance of this option with a different\n    value.\n\n--min <double (default = NaN)>\n    Value corresponding to 'coldest' color in the color map, when\n    using ``--colorize`` or ``--colorbar``, and plotting CSV data.\n    Also used to manually set the minimum value in grayscale\n    images. If not set, use the dataset minimum for\n    color images, and estimate the minimum for grayscale images.\n\n--max <double (default = NaN)>\n    Value corresponding to the 'hottest' color in the color map, when\n    using ``--colorize`` or ``--colorbar``, and plotting CSV data.\n    Also used to manually set the maximum value in grayscale\n    images. If not set, use the dataset maximum for color images, and\n    estimate the maximum for grayscale images.\n\n--plot-point-radius <integer (default = 2)>\n    When plotting points from CSV files, let each point be drawn as a\n    filled ball with this radius, in pixels.\n\n--csv-format <string>\n    Specify the format of input CSV files as a list of entries\n    column_index:column_type (indices start from 1).  Examples:\n    ``1:x 2:y 3:z`` (a Cartesian coordinate system with origin at\n    planet center is assumed, with the units being in meters),\n    ``5:lon 6:lat 7:radius_m`` (longitude and latitude are in degrees,\n    the radius is measured in meters from planet center),\n    ``3:lat 2:lon 1:height_above_datum``,\n    ``1:easting 2:northing 3:height_above_datum``\n    (need to set ``--csv-srs``; the height above datum is in\n    meters). Can also use radius_km for column_type, when it is\n    again measured from planet center.\n\n--csv-datum <string (default=\"\")>\n    The datum to use to to use when plotting a CSV file. Options:\n    D_MOON (1,737,400 meters), D_MARS (3,396,190 meters), MOLA\n    (3,396,000 meters), NAD83, WGS72, and NAD27. Also accepted: Earth\n    (=WGS_1984), Mars (=D_MARS), Moon (=D_MOON).\n\n--csv-srs <string (default=\"\")>\n    The PROJ or WKT string to use when plotting a CSV\n    file. If not specified, try to use the ``--datum`` option. \n\n--lowest-resolution-subimage-num-pixels <integer (default: -1)>\n    When building a pyramid of lower-resolution versions of an image,\n    the coarsest image will have no more than this many pixels. If not\n    set, it will internally default to 1000 x 1000. This is\n    increased to 10000 x 10000 when loading .nvm files or with the\n    ``--preview`` option to avoid creating many small files.\n\n--font-size <integer (default = 9)>\n    Set the font size.\n\n--no-georef\n    Do not use the georeference information when displaying the data,\n    even when it exists. Also controllable from the View menu.\n\n--delete-temporary-files-on-exit\n    Delete any subsampled and other files created by the GUI when\n    exiting.\n\n--create-image-pyramids-only\n    Without starting the GUI, build multi-resolution pyramids for\n    the inputs, to be able to load them fast later. If used with\n    ``--hillshade``, also build the hillshaded images and their\n    multi-resolution pyramids.\n\n--threads <integer (default: 0)>\n    Select the number of threads to use for each process. If 0, use\n    the value in ~/.vwrc.\n \n--cache-size-mb <integer (default = 1024)>\n    Set the system cache size, in MB.\n\n--tile-size <integer (default: 256 256)>\n    Image tile size used for multi-threaded processing.\n\n--no-bigtiff\n    Tell GDAL to not create BigTiff files.\n\n--tif-compress <string (default = \"LZW\")>\n    TIFF compression method. Options: None, LZW, Deflate, Packbits.\n\n-v, --version\n    Display the version of software.\n\n-h, --help\n    Display this help message.\n"
  },
  {
    "path": "docs/tools/stereo_sweep.rst",
    "content": ".. _stereo_sweep:\n\nstereo_sweep\n------------\n\nThis program runs :ref:`parallel_stereo` with different parameter combinations\nand portions of input images.\n\n.. _stereo_sweep_example:\n\nExample\n~~~~~~~\n\n::\n\n    stereo_sweep                             \\\n      --param-sweep                          \\\n        \"--corr-kernel 7,7 9,9\n        --stereo-algorithm asp_sgm asp_mgm\n        --subpixel-mode 1 9\n        --proj-win -180,3873,3287,180\n                   -947,1418,3022,-2752\"     \\\n      --param-sweep                          \\\n        \"--corr-kernel 19,19 21,21\n        --stereo-algorithm asp_bm\n        --subpixel-mode 1 3\"                 \\\n      left_map_image.tif right_map_image.tif \\\n      left_cam.xml right_cam.xml             \\\n      --dem dem.tif                          \\\n      --point2dem-params                     \\\n        \"--tr 4.0\n         --orthoimage\n         --errorimage\"                       \\\n      --output-dir stereo_out\n\nNote that the option ``--param-sweep`` is specified twice, with each resulting\nin a set of runs. For the first one, there are two possible values for the\ncorrelation kernel, two stereo algorithms, two subpixel modes, and two image\nregions (projection windows). This results in a total of 16 different runs of\n``parallel_stereo``. For the second ``--param-sweep``, there are two kernel\nsizes, one stereo algorithm, and two subpixel modes, resulting in 4 runs\non the full image extents.\n\nParameters with multiple values (like ``--corr-kernel 7,7`` or ``--proj-win``)\nhave commas as separator, with no spaces. This is necessary so ``--param-sweep``\ncan be parsed correctly. The commas are replaced with spaces when passing the\narguments to ``parallel_stereo`` (:numref:`stereodefault`).\n\nThe :ref:`point2dem` command will be run on each output of ``parallel_stereo``.\nArguments to it can be passed via the ``--point2dem-params`` option. See :numref:`stereo_sweep_opts` for more details.\n\nWorkflow\n~~~~~~~~\n\nThis program generates a file named ``run_index.csv`` in the output directory that\nenumerates the run directories and corresponding parameter values.\n\nWhen the images are mapprojected already (:numref:`mapproj-example`),\npass the mapprojection DEM to ``--dem``. This allows sweeping over different\nclips with ``--proj-win``. Otherwise, an individual clip can be passed in \nto ``parallel_stereo``, if desired, via ``--left-image-crop-win`` and\n``--right-image-crop-win``.\n\nAny other options will be passed directly to ``parallel_stereo``.\n\n.. _stereo_sweep_opts:\n\nCommand-line options\n~~~~~~~~~~~~~~~~~~~~\n\n--param-sweep <string>\n    Parameter sweep. Must be in quotes. Multiple such options can be specified.\n    Each defines a different set of parameter combinations to test. See\n    :numref:`stereo_sweep_example` for an example.\n    \n--output-dir <string>\n    Output directory.\n\n--dem <string>\n    Input DEM for mapprojection. Required if using ``--proj-win`` in parameter\n    sweeps.\n\n--point2dem-params <string>\n    Parameters to pass to point2dem. If ``--orthoimage`` (with no argument) is\n    passed in, the needed ``L.tif`` will be passed to each created point2dem\n    command.\n\n--dry-run\n    Print commands without executing them.\n\n--help\n    Display the help message and exit.\n"
  },
  {
    "path": "docs/tools/stereo_tile.rst",
    "content": ".. _stereo_tile:\n\nstereo_tile\n-----------\n\nThis is an auxiliary program invoked by :ref:`stereo_dist` to process a single\ntile or to mosaic a block of DEMs. It runs the stereo pipeline stages\n(preprocessing through DEM creation, :numref:`entrypoints`) on one tile, writing\nresults to a tile subdirectory. It can also run :ref:`dem_mosaic` on one block of\nDEMs, as part of the final mosaic step in ``stereo_dist``.\n\n.. _stereo_tile_options:\n\nCommand-line options\n~~~~~~~~~~~~~~~~~~~~\n\n--tile-index <integer>\n    Index of the tile to process (0-based). Required for tile processing.\n\n-e, --entry-point <integer (default: 0)>\n    Stereo pipeline entry point. Values: 0=pprc, 1=corr, 2=blend, 3=rfne,\n    4=fltr, 5=tri, 6=cleanup, 7=dem.\n\n--stop-point <integer (default: 9)>\n    Stereo pipeline stop point (stop before this step).\n\n--dem <string>\n    Input DEM for mapprojection. Required for tile processing.\n\n--point2dem-options <string>\n    Options to pass to :ref:`point2dem`. Can pass ``--orthoimage`` with\n    no argument, and the L.tif file for each tile will be autocompleted.\n    Can also pass ``--errorimage``.\n\n-s, --stereo-file <string (default: ./stereo.default)>\n    Explicitly specify the ``stereo.default`` file to use\n    (:numref:`stereodefault`). This file is optional and need not exist.\n\n--corr-seed-mode <integer (from 0 to 3)>\n    Correlation seed strategy (:numref:`corr_section`). Default is 0.\n\n--sparse-disp-options <string>\n    Options to pass directly to sparse_disp (:numref:`sparse_disp`).\n\n--dem-mosaic-index <integer>\n    Index of the mosaic block to process (0-based). Requires\n    ``--dem-mosaic-master``. Invoked by ``stereo_dist`` for parallel DEM\n    mosaicking.\n\n--dem-mosaic-master <string>\n    Master file enumerating for each block to mosaic the input DEM list file and\n    output DEM path, one block per line. Used with ``--dem-mosaic-index``.\n\n--run-dir <string>\n    Directory in which the script is running. Set by ``stereo_dist``.\n\n--verbose\n    Display the commands being executed.\n\n--dry-run\n    Do not launch the jobs, only print the commands that should be run.\n\n-v, --version\n    Display the version of the software.\n\n-h, --help\n    Display this help message.\n"
  },
  {
    "path": "docs/tools/texrecon.rst",
    "content": ".. _texrecon:\n\ntexrecon\n--------\n\nThe ``texrecon`` script takes as input several images, their camera\nposes, camera intrinsics for one or more sensors, a mesh, in .ply format,\nand creates a textured mesh as an .obj file. This tool is a wrapper around\nthe third-party `MVS-Texturing\n<https://github.com/nmoehrle/mvs-texturing>`_ software.\n\nSee also the ``voxblox_mesh`` program (:numref:`voxblox_mesh`) which\ncan produce a mesh that is usable with this tool.\n\nExample\n^^^^^^^\n\nThe dataset:\n\n    https://github.com/NeoGeographyToolkit/StereoPipelineSolvedExamples/releases/tag/rig_calibrator\n\nhas an example of how a set of camera images acquired with a rig were\nco-registered using the ``rig_calibrator`` program\n(:numref:`rig_calibrator`), and how a mesh was created.\n\nWith that data and this tool, a textured mesh can be obtained as follows::\n\n    texrecon --rig_config rig_out/rig_config.txt \\\n      --camera_poses rig_out/cameras.txt         \\\n      --mesh rig_out/fused_mesh.ply              \\\n      --rig_sensor sci_cam                       \\\n      --undistorted_crop_win '1000 800'          \\\n      --out_dir texrecon_out\n\nThe inputs to this program need not be created with\n``rig_calibrator``. What is important is that the camera poses and the\nmesh be co-registered.\n\nCommand-line options\n^^^^^^^^^^^^^^^^^^^^\n\n--rig_config <string>\n   Rig configuration file.\n--rig_sensor <string>\n   Which rig sensor images to texture. Can be more than one (bound by\n   quotes then). Must be among the sensors specified via\n   ``--rig_config``.\n--camera_poses <string>\n   Read images and camera poses from this list.\n--mesh <string>\n   The mesh to use for texturing, in .ply format.\n--subset <string> \n   Use only the subset of images from this list.\n--undistorted_crop_win <string>\n   The dimensions of the central image region to keep\n   after undistorting an image and before using it in texturing.\n   Normally 85% - 90% of distorted (actual) image\n   dimensions would do. Suggested for Astrobee images: sci_cam: '1250\n   1000' nav_cam: '1100 776'. haz_cam: '250 200'.\n--max_texture_size <int>\n   The maximum size (in pixels) of each texture file created for the\n   produced textured mesh.\n--out_dir <string>\n   The directory where to write the textured mesh and\n   other data.\n--texture_alg <string> \n   Use one of the two texture creation modes: 'center' (for a surface\n   patch choose the image in which the patch shows up closer to the\n   image center; this is the default), or 'area' (for a surface patch\n   choose the image whose camera view direction is most aligned with the\n   surface normal).\n--skip_local_seam_leveling\n   If set, skip a postprocessing algorithm which may remove some seams\n   but which on occasion can cause a crash.\n"
  },
  {
    "path": "docs/tools/theia_sfm.rst",
    "content": ".. _theia_sfm:\n\ntheia_sfm\n---------\n\nThe ``theia_sfm`` program is a wrapper around the `Theia\n<https://github.com/sweeneychris/TheiaSfM>`_ Structure-from-Motion (SfM)\nsoftware. It assumes that the there are are several sensors with each acquiring\nimages. \n\nThe produced SfM solution can be passed on to ``rig_calibrator``\n(:numref:`rig_calibrator`), but this program can be used without a rig.\n\nASP offers another wrapper around Theia, namely ``camera_solve`` \n(:numref:`camera_solve`), whose aim is to work with ASP's ``bundle_adjust``\nprogram (:numref:`bundle_adjust`). \n\n.. _theia_naming_conv:\n\nNaming convention\n~~~~~~~~~~~~~~~~~\n\nTo distinguish which images are made with which sensor, either:\n\n - The image file name (without directory) should contain the sensor name.\n - The name of the immediate directory having the image should be the sensor name.\n - A list should be provided, in which each line has the image name, sensor\n   name and image timestamp, separated by spaces.\n\nExamples::\n\n  my_images/image1_cam1.png  \n\n  my_images/cam1/image1.png\n\nwhere ``cam1`` is the name of the sensor that acquired this image. \n\nIf a list is provided, each line should be of the form::\n\n  my_images/image1.png cam1 <timestamp>\n\nThis list should be passed in via ``--image_sensor_list``. The timestamp is not\nused but is there for compatibility with ``rig_calibrator``\n(:numref:`rig_data_conv`).\n\nAll images names (without directory path) must be unique.\n\nConfiguration\n~~~~~~~~~~~~~\n\nThe configuration file contains the intrinsics for each sensor. Is the same as\nfor ``rig_calibrator`` (:numref:`rig_config`). This program does not use the\ntransforms between sensors, and there is no concept of reference sensor.\n\nSee `TheiaSfM's supported camera model types <https://github.com/sweeneychris/TheiaSfM/blob/master/docs/source/cameras.rst>`_.\nIn the rig configuration those are named ``no_distortion``, ``radtan``,\n``fisheye`` and ``fov``.\n\n .. _theia_sfm_config:\n\nFlags file\n~~~~~~~~~~\n\nThis program  will use the Theia flags file from ``share/theia_flags.txt`` in\nthe software distribution, which can be copied to a new name, edited, and passed\nto ``theia_sfm`` via ``--theia_flags``.\n\nAs an example, for tricky configurations, setting::\n\n  --feature_density=DENSE\n\nin the flags file can create a lot more interest points matches.\n\nExamples\n~~~~~~~~\n\nA step-by-step-example is in :numref:`rig_msl`.\n\nUsage\n~~~~~\n\n::\n\n    theia_sfm --rig-config <rig config> [images]  \\\n      [--theia-flags <flag file>] --out-dir <out dir>\n\nThe input images can be specified as wildcards::\n\n    theia_sfm --rig-config rig_input/rig_config.txt        \\\n      --images 'rig_input/cam1/*.tif rig_input/cam2/*.tif' \\\n      --out-dir rig_theia\n \nin a list::\n\n    ls rig_input/cam*/*.jpg > image_list.txt\n    theia_sfm --rig-config rig_input/rig_config.txt        \\\n      --image-list image_list.txt                          \\\n      --out-dir rig_theia\n \non the command line::\n\n    theia_sfm --rig-config rig_input/rig_config.txt        \\\n      rig_input/cam1/image1.png rig_input/cam2/image2.png  \\\n      --out-dir rig_theia\n\n\nUse ``--image_sensor_list`` instead of ``--list`` if the sensor names\nare not part of image names (:numref:`theia_naming_conv`).\n\nOutput files\n~~~~~~~~~~~~\n\nThis tool produces an SfM solution with a name like ``out_dir/cameras.nvm``. The\noptical offsets per image are in ``out_dir/cameras_offsets.txt``.  \nA reconstruction in binary format is saved to ``out_dir/reconstruction-0``.\n\nThe nvm file can be passed in to ``bundle_adjust`` (:numref:`ba_nvm`) and\n``rig_calibrator`` (:numref:`rig_calibrator`).\n\nVisualization\n~~~~~~~~~~~~~\n\nThe created camera poses can be visualized as::\n\n    view_reconstruction --reconstruction out_dir/reconstruction-0\n\nSee this program's manual in :numref:`view_reconstruction`.\n\nThe interest point matches in the .nvm file can be inspected with \n``stereo_gui`` (:numref:`stereo_gui_nvm`). This will show the images in the\nrandom order produced by Theia. The ``rig_calibrator`` program\n(:numref:`rig_calibrator`), which can be used as the next step, will order these\nlexicographically.\n\nManipulating SfM solutions\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nSeveral produced solutions can be merged into a larger reconstruction with the\n``sfm_merge`` (:numref:`sfm_merge`) program. Portions can be extracted with\n``sfm_submap`` (:numref:`sfm_submap`).\n \n.. _theia_sfm_command_line:\n\nCommand-line options for theia_sfm\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n--rig-config <string (default: \"\")>\n    Rig configuration file.\n--images <string (default: \"\")>\n    Images, as individual wildcards. Example: \n    ``'dir/cam1/*tif dir/cam2/*tif'``.\n--image-list <string (default: \"\")>\n    Use the images from this list, instead of setting ``--images``.\n    Images must be separated by a newline.\n--image-sensor-list <string (default: \"\")>\n    An alternative way of listing the input images, when the sensor name is\n    specified separately in the same file (:numref:`theia_naming_conv`).\n--theia-flags <string (default: \"\")>\n    The flags to pass to Theia. By default, the file\n    ``share/theia_flags.txt`` in the software distribution is used.\n    The option ``--random_seed=1`` is passed to Theia by default, to\n    ensure reproducible results.\n--out-dir <string (default: \"\")>\n    The output directory.\n-h, --help\n    Show this help message and exit.\n"
  },
  {
    "path": "docs/tools/undistort_image.rst",
    "content": ".. _undistort_image:\n\nundistort_image\n---------------\n\nThe ``undistort_image`` program takes as input an image and a pinhole\nmodel .tsai file describing the image. The tool will generate a copy of\nthe input image with the lens distortion specified in the pinhole model\nfile removed. It will also save the corresponding pinhole camera model\nfile without the distortion.\n\nUsage::\n\n    undistort_image [options] <input image> <camera model> -o <output image>\n\nSee an example in :numref:`sfmgeneric`.\n\nCommand-line options for undistort_image:\n\n-o, --output-file <filename>\n    Specify the output file.\n\n--output-nodata-value <double (default: smallest float value)>\n    Set the output nodata value.  Only applicable if the output is\n    a single-channel image with pixels that are float or double.\n\n--interpolation-method <bilinear|bicubic (default: bilinear)>\n    Interpolation method.\n\n--threads <integer (default: 0)>\n    Select the number of threads to use for each process. If 0, use\n    the value in ~/.vwrc.\n \n--cache-size-mb <integer (default = 1024)>\n    Set the system cache size, in MB.\n\n--tile-size <integer (default: 256 256)>\n    Image tile size used for multi-threaded processing.\n\n--no-bigtiff\n    Tell GDAL to not create BigTiff files.\n\n--tif-compress <None|LZW|Deflate|Packbits (default: LZW)>\n    TIFF compression method.\n\n-v, --version\n    Display the version of software.\n\n-h, --help\n    Display this help message.\n"
  },
  {
    "path": "docs/tools/view_reconstruction.rst",
    "content": ".. _view_reconstruction:\n\nview_reconstruction\n-------------------\n\nThis viewer is part of the Theia SfM suite of tools that ASP ships\n(:numref:`theia_sfm`). It can show a 3D point cloud and the camera poses. See\n``sfm_view`` (:numref:`sfm_view`) for a program that can show orbital cameras\n(with no 3D points).\n\nZoom in and out with the mouse wheel. Pan with the left mouse button. Rotate\nwith the right mouse button. \n\nExample::\n\n    view_reconstruction --reconstruction theia/reconstruction-0 \n\n.. figure:: ../images/view_reconstruction.png\n   :name: view_reconstruction_fig\n   :alt:  view_reconstruction_tag\n   \n   Illustration of ``view_reconstruction``. The camera poses are shown as\n   red pyramids. The triangulated points are in gray.\n\n"
  },
  {
    "path": "docs/tools/voxblox_mesh.rst",
    "content": ".. _voxblox_mesh:\n\nvoxblox_mesh\n------------\n\nThe ``voxblox_mesh`` program takes as input several camera poses, for\neach such pose a point cloud in that camera's coordinates, and fuses\nthem into a mesh. The input point clouds can be created either with\nstereo (such as with ``multi_stereo``, :numref:`multi_stereo`) or a\ndepth sensor (see the example below). \n\nThe produced mesh can be textured with ``texrecon`` (:numref:`texrecon`).\n\nA basic median filter can be applied to the input clouds before fusing them.\n\nThis tool is a wrapper around `VoxBlox <https://github.com/ethz-asl/voxblox>`_.\n \nExample\n^^^^^^^\n\nWith that data and this tool, a fused mesh can be obtained as follows::\n\n    voxblox_mesh --index rig_out/voxblox/haz_cam/index.txt \\\n      --output_mesh rig_out/fused_mesh.ply                 \\\n      --min_ray_length 0.1 --max_ray_length 2.0            \\\n      --voxel_size 0.005\n\nHere, the output mesh is ``fused_mesh.ply``, points no further than 2\nmeters from each camera center are used, and the mesh is obtained\nafter binning the points into voxels of 1 cm in size. \n\nThe obtained mesh can be post-processed, by smoothing it, filling in holes,\netc., using several CGAL tools shipped with ASP (:numref:`cgal_tools`).\n\nThis `dataset\n<https://github.com/NeoGeographyToolkit/StereoPipelineSolvedExamples/releases/tag/rig_calibrator>`_\nhas an example of how a set of camera images and depth clouds acquired\nwith a rig were co-registered using the ``rig_calibrator`` program\n(:numref:`rig_calibrator`).\n\nFormat of the inputs\n^^^^^^^^^^^^^^^^^^^^\n\nThe input index file to this program has two lines for each cloud. The\nfirst is a file having the camera-to-world transform for a point\ncloud, as a 4x4 matrix (rotation and translation), and the second one\nhas the cloud itself, in binary ``.pcd`` format, in camera's\ncoordinate system. Here is an example::\n\n    data_dir/1_cam2world.txt\n    data_dir/1.pcd\n    data_dir/2_cam2world.txt\n    data_dir/2.pcd\n\nEach .pcd file is in the ``pcl::PointNormal`` format, with each data\npoint having 6 entries, corresponding to cloud x, y, z, point\nintensity, reliability weight given to the point, and the value 0 (the\nlatter is unused).\n\nSuch clouds can be created with the ``pc_filter`` program from ASP's\nusual ``PC.tif`` point clouds (:numref:`pc_filter`). One has to make\nsure the cloud is transformed to camera coordinates. The command to\ncreate such a ``.pcd`` file is along the lines of::\n\n    pc_filter --transform-to-camera-coordinates   \\\n      --max-distance-from-camera 2.0              \\\n      --max-camera-ray-to-surface-normal-angle 75 \\\n      --input-cloud run/run-PC.tif                \\\n      --input-texture run/run-L.tif               \\\n      --camera left.tsai                          \\\n      --output-cloud run/run.pcd\n\nNote how the camera file ``left.tsai`` which was used to create the PC.tif\ncloud is passed in as an argument.\n\n.. _voxblox_mesh_command_line:\n\nCommand-line options for voxblox_mesh\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n``--index`` (*string*) (default = \"\")\n    A list having input camera transforms and point cloud files.\n``--output_mesh`` (*string*) (default = \"\")\n    The output mesh file name, in .ply format.\n``--voxel_size`` (*double*) (default = 0.01)\n    Voxel size, in meters. \n``--min_ray_length`` (*double*) (default = -1.0)\n    The minimum length of a ray from camera center to the\n    points. Points closer than that will be ignored.\n``--max_ray_length`` (*double*) (default = -1.0)\n    The maximum length of a ray from camera center to the\n    points. Points beyond that will be ignored.\n``--enable_anti_grazing``\n    If true, enable anti-grazing. This is an advanced\n    option.\n``--integrator`` (*string*) (default = \"\")\n    Specify how the points should be integrated. Options:\n    \"simple\", \"merged\", \"fast\". See the VoxBlox documentation for details.\n``--min_weight`` (*double*) (default = 1e-6) \n    The minimum weighht for a point to be included in the\n    mesh.\n``--voxel_carving_enabled``\n    If true, the entire length of a ray is integrated.\n    Otherwise only the region inside the truncation distance is used. This is\n    an advanced option.\n``--median_filter`` (*string*) (default = \"\") \n    Filter out depth points that differ in any of the coordinates by more\n    than a given threshold from the median of such\n    coordinates in a square window of given size. Specify in quotes,\n    as: 'window thresh'. The window is an odd integer and in units of pixel\n    (given the image storage format of the cloud) and the threshold is\n    measured in meters. This assumes that the input .pcd files have more\n    than one row and column, rather than the data being\n    stored in a single row. \n``--distance_weight``  (*string*) (default = \"\")\n    Give to an input depth point ``P`` the\n    weight ``1/(1 + (norm(P)/d)^a)``. This makes points further\n    from the sensor have less weight. Specify the input parameters as\n    'd a'. This multiplies any other per-point weight read from the\n    point cloud (normally the input weight is 1 unless ``pc_filter``\n    (:numref:`pc_filter`) is used). See also ``--min_weight`` and\n    ``--max_ray_length``. \n\nSee also the `VoxBlox documentation\n<https://voxblox.readthedocs.io/en/latest/pages/The-Voxblox-Node.html#parameters>`_.\n"
  },
  {
    "path": "docs/tools/wv_correct.rst",
    "content": ".. _wv_correct:\n\nwv_correct\n----------\n\nAn image taken by one of Maxar (DigitalGlobe) World View satellite cameras\nis formed of several blocks as tall as the image, mosaicked from left\nto right, with each block coming from an individual CCD sensor\n:cite:`digital-globe:camera`. Either due to imperfections in the\ncamera or in the subsequent processing, the image blocks are offset in\nrespect to each other in both row and column directions by a subpixel\namount. These so-called *CCD boundary artifacts* are not visible in\nthe images but manifest themselves as discontinuities in the DEMs\nobtained with ASP.\n\nThe tool named ``wv_correct`` is able to significantly attenuate these\nartifacts (see :numref:`ccd-artifact-example` in the\nDigital Globe tutorial for an example). This tool should be used on raw\nDigital Globe images before calling ``dg_mosaic`` and ``mapproject``.\n\nIt is important to note that both the positions of the CCD offsets and\nthe offset amounts were determined empirically without knowledge of\nDigital Globe's mosaicking process; this is why we are not able to\nremove these artifacts completely.\n\nFor PAN images, the WV01 and WV02 datasets are supported, for most TDI\nfor the forward and reverse scan directions. For WV03 PAN images, CCD\nartifacts are less noticeable than for WV01 and WV02, and they are not\ncorrected at this time.\n\nFor multispectral images, only a few select TDI are supported for band\n3 of WV02 data. If a certain combination of spacecraft/TDI is not\nsupported, the tool will print a warning and will write on output the\nuncorrected input image.\n\nThe ASP source code repository has additional documentation and tools for how to\ntabulate the corrections for the cases not yet covered by this tool.\n\nNote for WV-2 images\n^^^^^^^^^^^^^^^^^^^^\n\nMaxar (DigitalGlobe) WorldView-2 images with a processing (generation) date\n(rather than acquisition date) of May 26, 2022 or newer have much-reduced CCD\nartifacts, and for those this tool will in fact make the solution worse, not\nbetter. \n\nASP of version 3.3.0 or later (and any development build after 2023-06-21) will\nautomatically detect this and will not apply the correction (a copy of the input\nimage will be written on output). A warning will be printed in that case. This\nholds for both PAN and multi-spectral images.\n\nThis scenario does not apply to WorldView-1, 3, or GeoEye-1.\n\nUsage\n^^^^^\n\n::\n\n    wv_correct [options] <input image> <input camera model> <output image>\n\nExamples\n^^^^^^^^\n\nExample for PAN images::\n\n    wv_correct pan.tif pan.xml pan_corr.tif\n\nExample for multispectral images (first extract the third band)::\n\n   gdal_translate -co TILED=YES -co COMPRESS=LZW \\\n     -co BIGTIFF=IF_SAFER -b 3 ms.tif ms_b3.tif\n    wv_correct --band 3 ms_b3.tif ms.xml ms_b3_corr.tif\n\nExample if per-column corrections are available, for either PAN or\nmultispectral images::\n\n    wv_correct --dx dx.txt --dy dy.txt image.tif image.xml image_corr.tif\n\nCommand-line options for wv_correct\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n--ot <string (default: Float32)>\n    Output data type. Supported types: Byte, UInt16, Int16, UInt32,\n    Int32, Float32. If the output type is a kind of integer, values\n    are rounded and then clamped to the limits of that type.\n\n--band <integer (default: 0)>\n    For multi-spectral images, specify the band to correct. Required\n    unless --dx and --dy are set.\n\n--dx <string (default: \"\")> \n    For PAN or multi-spectral images, specify the plain text file\n    having per-column corrections in the x direction, one per line,\n    overriding the pre-computed table.\n\n--dy  <string (default: \"\")>\n    As above, but for the y direction.\n\n--print-per-column-corrections\n  Print on standard output the per-column corrections about to apply\n  (for multispectral images).\n\n--threads <integer (default: 0)>\n    Select the number of threads to use for each process. If 0, use\n    the value in ~/.vwrc.\n \n--cache-size-mb <integer (default = 1024)>\n    Set the system cache size, in MB.\n\n--tile-size <integer (default: 256 256)>\n    Image tile size used for multi-threaded processing.\n\n--no-bigtiff\n    Tell GDAL to not create BigTiff files.\n\n--tif-compress <None|LZW|Deflate|Packbits (default: LZW)>\n    TIFF compression method.\n\n-v, --version\n    Display the version of software.\n\n-h, --help\n    Display this help message.\n"
  },
  {
    "path": "docs/tools.rst",
    "content": "Tools\n=====\n\nThis chapter provides a overview of the various tools that are provided\nas part of the Ames Stereo Pipeline, and a summary of their command line\noptions.\n\n.. toctree::\n   :glob:\n\n   tools/*\n"
  },
  {
    "path": "docs/tutorial.rst",
    "content": ".. _tutorial:\n\nHow ASP works\n=============\n\nThe Stereo Pipeline package contains command-line and GUI programs\nthat convert a stereo pair consisting of images and cameras into a\n3D \"point cloud\" image. This is an intermediate format that can be\npassed along to one of several programs that convert a point cloud\ninto a mesh for 3D viewing, a gridded digital terrain model (DTM) for\nGIS purposes, or a LAS/LAZ point cloud.\n\nThere are a number of ways to fine-tune parameters and analyze the results, but\nultimately this software suite takes images and builds models in a mostly\nautomatic way. \n\nTo create a point cloud file, *not necessarily of best quality*, for now, \none simply passes two image files to\nthe ``parallel_stereo`` (:numref:`parallel_stereo`) command::\n\n    parallel_stereo --stereo-algorithm asp_bm \\\n      --nodes-list nodes_list.txt             \\\n      left_image.cub right_image.cub results/run\n\nHigher quality results, at the expense of more computation, can be\nachieved by running::\n\n    parallel_stereo --alignment-method affineepipolar \\\n      --stereo-algorithm asp_mgm --subpixel-mode 3    \\\n      --nodes-list nodes_list.txt                     \\\n      left_image.cub right_image.cub results/run\n\nThe option ``--subpixel-mode 9`` is faster and still creates decent\nresults (with ``asp_mgm``/``asp_sgm``). The best quality will likely\nbe obtained with ``--subpixel-mode 2``, but this is even more\ncomputationally expensive. \n\nIt is very recommended to read :numref:`nextsteps`, which describes\nother alignment methods and stereo algorithms. See :numref:`ps_options`\nfor the ``--nodes-list`` option.\n\nThen normally one would create a DEM (:numref:`point2dem`)::\n  \n      point2dem --auto-proj-center results/run-PC.tif\n\nHere it is assumed that the ``PATH`` and ``ISISDATA`` environmental\nvariables have been set, as shown in :numref:`installation`. \n\nThe ``.cub`` file format is used for non-Earth images\n(:numref:`moc_tutorial`). For Earth, the images are usually in the\n``.tif`` format (:numref:`dg_tutorial`).\n\nThe above commands will decompose the images in tiles to run in parallel,\npotentially on multiple machines (:numref:`pbs_slurm`).\n\nOr the ``stereo_gui`` frontend can be invoked, with the same options,\nas described in :numref:`stereo_gui`.  This tool makes it possible to\nmanually select smaller clips on which to run ``parallel_stereo``.\n\nThe string ``results/run`` is an arbitrary output prefix. All\n``parallel_stereo`` output files will be in the ``results`` directory\nand start with ``output``. See :numref:`outputfiles` for the list of\noutput files.\n\nA a visualizable mesh can be made with the following\ncommand (the ``results/run-PC.tif`` and ``results/run-L.tif`` files\nare created by the ``parallel_stereo`` program above)::\n\n     point2mesh results/run-PC.tif results/run-L.tif\n\nVisualization is further discussed in :numref:`visualizing_results`.\n\nA produced DEM may need to be aligned to some pre-existing reference\n(:numref:`pc_align`). \n\nIf the positions, orientations, or intrinsics of the cameras are not known well,\nthen bundle adjustment may be necessary (:numref:`bundle_adjustment`).\n\nWhat follows are two examples of processing non-Earth data. An example\nusing Earth data is in :numref:`dg_tutorial`. The various stereo\nalgorithms are discussed in :numref:`nextsteps`. More examples can be\nfound in :numref:`examples`.\n\n.. _nonearth_tutorial:\n\nTutorial: Processing planetary data (non-Earth)\n===============================================\n\n.. _lronac_csm:\n\nLightning-fast example using Lunar images\n-----------------------------------------\n\nThis example is designed to have the user create useful results with\nASP using Lunar data 10 minutes or less. It does not require a\ndownload of ISIS or ISIS data (which can be a couple of hundreds of\nGB) because it uses the CSM camera model (:numref:`csm`). The steps\nto process it are as follows:\n\n - Get ASP per the installation page (:numref:`installation`).\n \n - Fetch the `LRO NAC example <https://github.com/NeoGeographyToolkit/StereoPipelineSolvedExamples/releases/download/LRONAC/LRONAC_example.tar>`_ with ``wget``, and extract it as::\n  \n    tar xfv LRONAC_example.tar\n\n- Start ``stereo_gui`` (:numref:`stereo_gui`) with a selection of\n  clips::\n\n    cd LRONAC_example\n    stereo_gui M181058717LE_crop.cub M181073012LE_crop.cub \\\n      M181058717LE.json M181073012LE.json                  \\\n      --alignment-method local_epipolar                    \\\n      --left-image-crop-win 2259 1196 900 973              \\\n      --right-image-crop-win 2432 1423 1173 1218           \\\n      --stereo-algorithm asp_mgm --subpixel-mode 9         \\\n      run/run\n\nThe crop windows from above will show up as red rectangles.\n\nChoose from the menu ``Run -> Run parallel_stereo``. When finished, quit the GUI\nand run ``point2dem`` (:numref:`point2dem`) from the command line::\n\n    point2dem --auto-proj-center  \\\n      --errorimage run/run-PC.tif \\\n      --orthoimage run/run-L.tif\n\nOpen the computed DEM and orthoimage as::\n\n   stereo_gui run/run-DEM.tif run/run-DRG.tif\n\nRight-click on the DEM on the left and choose to toggle hillshading to\nshow the DEM hillshaded. See the figure below for the output.\n   \nHow to get higher quality results is described in  :numref:`nextsteps`. \n\nFor other examples, see :numref:`examples`. \n \n.. figure:: images/lronac_csm_example.png\n   :name: lronac_csm_example\n\n   Example of produced DEM and orthoimage using LRO NAC stereo pair\n   ``M181058717LE`` and ``M181073012LE`` and CSM cameras. How to obtain and\n   prepare the inputs is discussed in :numref:`lronac-example`. Mapprojection\n   can eliminate the staircasing artifacts (:numref:`mapproj-example`).\n\n.. _moc_tutorial:\n\nExample using Mars MOC images\n-----------------------------\n\nThe data set that is used in the tutorial and examples below is a pair\nof Mars Orbital Camera (MOC)\n:cite:`1992JGR.97.7699M,2001JGR.10623429M` images\nwhose PDS Product IDs are M01/00115 and E02/01461. This data can be\ndownloaded from the PDS directly, or they can be found in the\n``examples/MOC`` directory of your Stereo Pipeline distribution.\n\nThese raw PDS images (``M0100115.imq`` and ``E0201461.imq``) need to\nbe converted to .cub files and radiometrically calibrated. You will\nneed to be in an ISIS environment (:numref:`planetary_images`),\nusually via a ``conda activate`` command which sets the ``ISISROOT``\nand ``ISISDATA`` environment variables; we will denote this state with\nthe ``ISIS>`` prompt.\n\nThen you can use the ``mocproc`` program, as follows::\n\n     ISIS> mocproc from=M0100115.imq to=M0100115.cub Mapping=NO\n     ISIS> mocproc from=E0201461.imq to=E0201461.cub Mapping=NO\n\nThere are also ``Ingestion`` and ``Calibration`` parameters whose\ndefaults are ``YES`` which will bring the image into the ISIS format\nand perform radiometric calibration. By setting the ``Mapping``\nparameter to ``NO``, the resultant file will be an ISIS cube file\nthat is calibrated, but not map-projected. Note that while we have\nnot explicitly run ``spiceinit``, the Ingestion portion of ``mocproc``\nquietly ran ``spiceinit`` for you (you'll find the record of it in\nthe ISIS Session Log, usually written out to a file named ``print.prt``).\n:numref:`p19-images` shows the results at this stage of processing.\n\n.. _p19-images:\n\n.. figure:: images/p19-figure.png\n   :alt: MOC images after initial processing.\n\n   This figure shows ``E0201461.cub`` and ``M0100115.cub`` open in ISIS's qview\n   program. The view on the left shows their full extents at the same zoom\n   level, showing how they have different ground scales. The view on the right\n   shows both images zoomed in on the same feature.\n\nSee :numref:`examples` for many solved examples, including how to preprocess the\ndata with tools specific for each mission.\n\nOnce the ``.cub`` files are obtained, it is possible to run\n``parallel_stereo`` right away, and create a DEM::\n\n     ISIS> parallel_stereo                     \\\n             --alignment-method affineepipolar \\\n             --nodes-list nodes_list.txt       \\\n             -s stereo.default.example         \\\n             E0201461.cub M0100115.cub         \\\n             results/output\n     ISIS> point2dem --auto-proj-center        \\\n             results/output-PC.tif\n\nIn this case, the first thing ``parallel_stereo`` does is to\ninternally align (or rectify) the images, which helps with finding\nstereo matches. Here we have used ``affineepipolar`` alignment. Other\nalignment methods are described in :numref:`settingoptionsinstereodefault`.\n\nIf your data has steep slopes, mapprojection can improve the results.\nSee :numref:`mapproj-example` and :numref:`mapproj_with_cam2map`. \nSee :numref:`pbs_slurm` for running on multiple machines and \n:numref:`ps_options` for the ``--nodes-list`` option.\n\nWhen creating a DEM, it is suggested to use a local projection\n(:numref:`point2dem_proj`).\n\nSee :numref:`nextsteps` for a more in-depth discussion of stereo\nalgorithms.\n\n.. figure:: images/p19-colorized-shaded_500px.png\n\n   The produced colorized DEM, the shaded relief image, and the\n   colorized hillshade. See :numref:`builddem` for more details.\n\n.. _dg_tutorial:\n\nTutorial: Processing Earth images\n=================================\n\nIn this chapter we will focus on how to process Earth images, or more\nspecifically DigitalGlobe (Maxar) WorldView and QuickBird images. This example is\ndifferent from the one in the previous chapter in that at no point will we be\nusing ISIS utilities. This is because ISIS only supports NASA instruments, while\nmost Earth images comes from commercial providers.\n\nIn addition to DigitalGlobe/Maxar's satellites, ASP supports any Earth\nimages that uses the RPC camera model format. How to process such data\nis described in :numref:`rpc`, although following this tutorial may\nstill be insightful even if your data is not from DigitalGlobe/Maxar.\n\nIf this is your first time running ASP, it may be easier to start with\nASTER data (:numref:`aster`), as its images are free and much smaller\nthan DigitalGlobe's. A ready-made example having all inputs, outputs,\nand commands, is provided there.\n\nDigitalGlobe provides images from QuickBird and the three WorldView satellites.\nThese are the hardest images to process with Ames Stereo Pipeline because they\nare exceedingly large, much larger than HiRISE images. The GUI\n(:numref:`stereo_gui`) can be used to run stereo on just a portion of the\nimages.\n\nThe camera information for DigitalGlobe/Maxar images is contained in an XML\nfile for each image. In addition to the exact linear camera model, the\nXML file also has its RPC approximation. In this chapter we will focus\nonly on processing data using the linear camera model. For more detail\non RPC camera models we refer as before to :numref:`rpc`.\n\nOur implementation of the Digital Globe linear camera model accounts\nfor the sensor geometry, velocity aberration and atmospheric\nrefraction (:numref:`dg_csm`).\n\nIn the next two sections we will show how to process unmodified and\nmap-projected variants of WorldView images. These images represent a\nnon-ideal problem for us since this is an urban location, but at least\nyou should be able to download these images yourself and follow along.\n\nSupported products\n------------------\n\nASP can only process DigitalGlobe / Maxar Level 1B satellite images, and there\nis experimental support for View-Ready OR2A images (see\n:numref:`mapproj_ortho`). ASP cannot handle images that are orthorectified onto\na DEM. See the `list of products\n<https://securewatchdocs.maxar.com/en-us/Orders/Orders_ProductInfo.htm>`_.\n\n.. _rawdg:\n\nProcessing raw\n--------------\n\nAfter you have downloaded the example stereo images of Stockholm, you\nwill find a directory titled::\n\n    056082198020_01_P001_PAN\n\nIt has a lot of files and many of them contain redundant information\njust displayed in different formats. We are interested only in the TIF\nor NTF images and the similarly named XML files.\n\nSome WorldView folders will contain multiple image files. This is because\nDigitalGlobe/Maxar breaks down a single observation into multiple files for what\nwe assume are size reasons. These files have a pattern string of \"_R[N]C1-\",\nwhere N increments for every subframe of the full observation. The tool named\n``dg_mosaic`` (:numref:`dg_mosaic`) can be used to mosaic such a set of\nsub-observations into a single image file and create an appropriate camera\nfile::\n\n    dg_mosaic 12FEB16101327*TIF --output-prefix 12FEB16101327\n\nand analogously for the second set. See :numref:`dg_mosaic` for more\ndetails. The ``parallel_stereo`` program can use either the original or the\nmosaicked images. This sample data only contains two image files\nso we do not need to use ``dg_mosaic``.\n\nSince we are ingesting these images raw, it is strongly recommended that\nyou use affine epipolar alignment to reduce the search range. Commands::\n\n    parallel_stereo -t dg --stereo-algorithm asp_mgm      \\\n      --subpixel-mode 9 --alignment-method affineepipolar \\\n      --nodes-list nodes_list.txt                         \\\n      12FEB16101327.r50.tif 12FEB16101426.r50.tif         \\\n      12FEB16101327.r50.xml 12FEB16101426.r50.xml         \\\n      run/run\n    point2dem --auto-proj-center run-PC.tif\n\nAs discussed in :numref:`tutorial`, one can experiment with various\ntradeoffs of quality versus run time by using various stereo\nalgorithms, and use stereo in parallel or from a GUI. For more\ndetails, see :numref:`nextsteps`.\n\nHow to create a DEM and visualize the results of stereo is described in\n:numref:`manipulating_results`. Choosing a projection is discussed in\n:numref:`point2dem_proj`.\n\nSee :numref:`pbs_slurm` for running on multiple machines\nand :numref:`ps_options` for the ``--nodes-list`` option.\n\n.. figure:: images/examples/dg/wv_tutorial.png\n   :name: fig:dg-example\n\n   A colorized and hillshaded terrain model for Grand Mesa, Colorado, produced\n   with WorldView images, while employing mapprojection\n   (:numref:`mapproj-example`).\n\nIt is important to note that we could have performed stereo using the\napproximate RPC model instead of the exact linear camera model (both\nmodels are in the same XML file), by switching the session in the\n``parallel_stereo`` command above from ``-t dg`` to ``-t rpc``. The\nRPC model is somewhat less accurate, so the results will not be the\nsame, in our experiments we've seen differences in the 3D terrains\nusing the two approaches of 5 meters or more.\n\nMany more stereo processing examples can be found in :numref:`examples`.\n\n.. _mapproj:\n\nProcessing map-projected images\n--------------------------------\n\nASP computes the highest quality 3D terrain if used with images\nmap-projected onto a low-resolution DEM that is used as an initial\nguess. This process is described in :numref:`mapproj-example`.\n\n.. _handling_clouds:\n\nDealing with clouds\n-------------------\n\nClouds can result in unreasonably large disparity search ranges and a\nlong run-time. It is then suggested to mapproject the images\n(:numref:`mapproj-example`).\n\nWith our without mapprojection, one can reduce the computed search\nrange via ``--max-disp-spread`` (:numref:`stereodefault`). \nUse this with care. Without mapprojection and with steep terrain,\nthe true spread of the disparity can, in rare cases, reach a few\nthousand pixels. This is best used with mapprojected images,\nwhen it is likely to be under 150-200, or even under 100.\n\nIf a reasonable DEM of the area of interest exists, the option\n``--ip-filter-using-dem`` can be used to filter out interest points\nwhose heights differ by more than a given value than what is provided\nby that DEM. This should reduce the search range. Without a DEM,\nthe option ``--elevation-limit`` can be used and should have a similar\neffect.\n\nAnother option (which can be used in conjunction with the earlier\nsuggestions) is to tighten the outlier filtering in the low-resolution\ndisparity ``D_sub.tif`` (:numref:`outputfiles`), for example, by\nsetting ``--outlier-removal-params 70 2`` from the default ``95 3``\n(:numref:`stereodefault`). Note that decreasing these a lot may also\nfilter out valid steep terrain.\n\nIf a run failed because of a large disparity search range,\n``D_sub.tif`` should be deleted, parameters adjusted as above, and one\nshould run ``stereo_corr`` with the same arguments that\n``parallel_stereo`` was run before (except those used for tiling and\nnumber of processes, etc.), while adding the option\n``--compute-low-res-disparity-only``. Then examine the re-created\n``D_sub.tif`` with ``disparitydebug`` (:numref:`disparitydebug`) \nand the various search ranges printed on screen.\n\nThe ``D_sub.tif`` file can be created from a DEM (:numref:`d_sub_dem`).\n\nWhen ``D_sub.tif`` is found to be reasonable, ``parallel_stereo``\nshould be re-run with the option ``--resume-at-corr``.\n\nSee also :numref:`longrun` which offers further suggestions for\nhow to deal with long run-times.\n\n.. _wvcorrect-example:\n\nHandling CCD boundary artifacts\n-------------------------------\n\nDigitalGlobe/Maxar WorldView images :cite:`digital-globe:camera`\nmay exhibit slight subpixel artifacts which manifest themselves as\ndiscontinuities in the 3D terrain obtained using ASP. We provide a tool\nnamed ``wv_correct``, that can largely correct such artifacts for World\nView-1 and WorldView-2 images for most TDI. \n\nNote that Maxar (DigitalGlobe) WorldView-2 images with a processing\ndate (not acquisition date) of May 26, 2022 or newer have much-reduced\nCCD artifacts, and for those this tool will in fact make the solution\nworse, not better. This does not apply to WorldView-1, 3, or GeoEye-1.\n\nThis tool can be invoked as follows::\n\n    wv_correct image_in.ntf image.xml image_out.tif\n\nThe corrected images can be used just as the originals, and the camera\nmodels do not change. When working with such images, we recommend that\nCCD artifact correction happen first, on original un-projected images.\nAfterward images can be mosaicked with ``dg_mosaic``, map-projected, and\nthe resulting data used to run stereo and create terrain models.\n\nThis tool is described in :numref:`wv_correct`, and an\nexample of using it is in :numref:`ccd-artifact-example`.\n\n.. figure:: images/examples/ccd_before_after.png\n   :name: ccd-artifact-example\n\n   Example of a hill-shaded terrain obtained using stereo without (left)\n   and with (right) CCD boundary artifact corrections applied using\n   ``wv_correct``.\n\nImages lacking large-scale features\n-----------------------------------\n\nSee :numref:`d_sub_dem` and :numref:`sparse_disp` for suggestions on\nhow to deal with images that lack large-scale features, such as \nwhen the images have a lot of snow.\n\nJitter\n------\n\nAnother source of artifacts in linescan cameras, such as from\nDigitalGlobe, is jitter. ASP can solve for it using a jitter solver\n(:numref:`jitter_solve`).\n\nMulti-spectral images\n---------------------\n\nIn addition to panchromatic (grayscale) images, the DigitalGlobe/Maxar\nsatellites also produce lower-resolution multi-spectral (multi-band)\nimages. Stereo Pipeline is designed to process single-band images only.\nIf invoked on multi-spectral data, it will quietly process the first\nband and ignore the rest. To use one of the other bands it can be\nsingled out by invoking ``dg_mosaic`` (:numref:`rawdg`) with\nthe ``--band <num>`` option. We have evaluated ASP with DigitalGlobe/Maxar's\nmulti-spectral images, but support for it is still experimental. We\nrecommend using the panchromatic images whenever possible.\n\n.. _dg_csm:\n\nImplementation details\n----------------------\n\nWorldView linescan cameras use the CSM model (:numref:`csm`) internally. The\nsession name must still be ``-t dg``, ``-t dgmaprpc``, etc., rather than ``-t\ncsm``, ``-t csmmapcsm``, etc.\n\nBundle adjustment (:numref:`bundle_adjust`) and solving for jitter\n(:numref:`jitter_solve`) produce optimized camera models in CSM's model state\nformat (:numref:`csm_state`). These can be used just as the original\ncameras, but with the option ``-t csm``. Alternatively, the ``bundle_adjust``\n.adjust files can be used with the original cameras. \n\nAtmospheric refraction and velocity aberration (:cite:`nugent1966velocity`) are\ncorrected for. These make the linescan models be very close to the associated\nRPC models. These corrections are incorporated by slightly modifying the\nlinescan rotation samples as part of the CSM model upon loading. \n\nBundle adjustment (:numref:`bundle_adjust`) and alignment (:numref:`pc_align`)\nare still recommended even given these corrections.\n\nWorldView images and cameras can be combined with those from other linescan\ninstruments, such as Pleiades (:numref:`pleiades`), and also with frame camera\nmodels (:numref:`pinholemodels`), for the purposes of refining the cameras and\ncreating terrain models (:numref:`ba_frame_linescan`).\n"
  },
  {
    "path": "docs/zzreferences.rst",
    "content": ".. only:: html\n\n   References\n   ==========\n\n.. bibliography:: bibliography.bib\n   :style: alpha\n"
  },
  {
    "path": "examples/CTX/Makefile",
    "content": "# This is makefile to run the demo for MRO CTX of North Terra Meridiani\n\n\nall: nonmap/nonmap-DEM_CMAP.tif map/map-DEM_CMAP.tif\n\nP02_001981_1823_XI_02N356W.IMG:\n\twget -O $@ 'http://pds-imaging.jpl.nasa.gov/pds/prod?q=OFSN+%3D+data/mro/mars_reconnaissance_orbiter/ctx/mrox_0031/data/P02_001981_1823_XI_02N356W.IMG+AND+RT+%3D+RAW'\n\nP03_002258_1817_XI_01N356W.IMG:\n\twget -O $@ 'http://pds-imaging.jpl.nasa.gov/pds/prod?q=OFSN+%3D+data/mro/mars_reconnaissance_orbiter/ctx/mrox_0042/data/P03_002258_1817_XI_01N356W.IMG+AND+RT+%3D+RAW'\n\n%.cal.cub: %.IMG\n\tmroctx2isis from= $< to= $<.temp.cub\n\tspiceinit from= $<.temp.cub\n\tctxcal from= $<.temp.cub to= $<.temp2.cub\n\tcrop from=$<.temp2.cub to=$@ line=10000 nlines=3000\n\trm $<.temp.cub\n\trm $<.temp2.cub\n\n\nnonmapprojected: P02_001981_1823_XI_02N356W.cal.cub P03_002258_1817_XI_01N356W.cal.cub\n\nmapprojected: nonmapprojected\n\tif [ ! -e P02_001981_1823_XI_02N356W.map.cub ] && [ ! -e P03_002258_1817_XI_01N356W.map.cub ]; then cam2map4stereo.py P02_001981_1823_XI_02N356W.cal.cub P03_002258_1817_XI_01N356W.cal.cub; fi\n\nmap/map-PC.tif: mapprojected\n\tif [ ! -e map/map-PC.tif ]; then parallel_stereo P02_001981_1823_XI_02N356W.map.cub P03_002258_1817_XI_01N356W.map.cub map/map -s stereo.map; fi\n\nmap/map-DEM.tif: map/map-PC.tif\n\tcd map; \\\n\tpoint2dem -r mars --nodata -32767 map-PC.tif --error --orthoimage map-L.tif\n\nmap/map-DEM_CMAP.tif: map/map-DEM.tif\n\tcd map; \\\n\thillshade map-DEM.tif; \\\n\tcolormap -s map-DEM_HILLSHADE.tif map-DEM.tif; \\\n\tcolormap map-IntersectionErr.tif --colormap-style ../../TriangulationError.lut\n\nnonmap/nonmap-PC.tif: nonmapprojected\n\tif [ ! -e nonmap/nonmap-PC.tif ]; then parallel_stereo P02_001981_1823_XI_02N356W.cal.cub P03_002258_1817_XI_01N356W.cal.cub nonmap/nonmap -s stereo.nonmap; fi\n\nnonmap/nonmap-DEM.tif: nonmap/nonmap-PC.tif\n\tcd nonmap; \\\n\tpoint2dem -r mars --nodata -32767 nonmap-PC.tif --errorimage\n\nnonmap/nonmap-DEM_CMAP.tif: nonmap/nonmap-DEM.tif\n\tcd nonmap; \\\n\thillshade nonmap-DEM.tif; \\\n\tcolormap -s nonmap-DEM_HILLSHADE.tif nonmap-DEM.tif; \\\n\tcolormap nonmap-IntersectionErr.tif\n\nclean:\n\trm -rf nonmap map *.vwip\n\ndistclean: clean\n\trm -rf *.cub *~ *.match\n"
  },
  {
    "path": "examples/CTX/stereo.nonmap",
    "content": "# -*- mode: sh -*-\n\n# Pre-Processing / stereo_pprc\n################################################################\n\n# Pre-alignment options\n#\n# Available choices are (however not all are supported by all sessions):\n#    NONE           (Recommended for anything map projected)\n#    EPIPOLAR       (Recommended for Pinhole Sessions)\n#    HOMOGRAPHY     (Recommended for ISIS wide-angle shots)\n#    AFFINEEPIPOLAR (Recommended for ISIS narrow-angle and DG sessions)\nalignment-method affineepipolar\n\n# Intensity Normalization\nforce-use-entire-range       # Use entire input range\n\n# Select a preprocessing filter:\n#\n# 0 - None\n# 1 - Subtracted Mean\n# 2 - Laplacian of Gaussian (recommended)\nprefilter-mode 2\n\n# Kernel size (1-sigma) for pre-processing\n#\n# Recommend 1.4 px for Laplacian of Gaussian\n# Recommend 25 px for Subtracted Mean\nprefilter-kernel-width 1.4\n\n\n# Integer Correlation / stereo_corr\n################################################################\n\n# Select a cost function to use for initialization:\n#\n# 0 - absolute difference (fast)\n# 1 - squared difference  (faster .. but usually bad)\n# 2 - normalized cross correlation (recommended)\ncost-mode 0\n\n# Initialization step: correlation kernel size\ncorr-kernel 25 25\n\n# Initialization step: correlation search range\n#\n# Uncomment the following to use explicit search ranges. Otherwise, a\n# value will be choosen for you.\n# corr-search -100 -100 100 100\n\n# Subpixel Refinement / stereo_rfne\n################################################################\n\n# Subpixel step: subpixel modes\n#\n# 0 - disable subpixel correlation (fastest)\n# 1 - parabola fitting (draft mode - not as accurate)\n# 2 - affine adaptive window, bayes EM weighting (slower, but much more accurate)\nsubpixel-mode 1\n\n# Subpixel step: correlation kernel size\nsubpixel-kernel 25 25\n\n# Post Filtering / stereo_fltr\n################################################################\n\n# Automatic \"erode\" low confidence pixels\nrm-half-kernel 3 3\nrm-min-matches 60\nrm-threshold 3\nrm-cleanup-passes 1\n\n# Triangulation / stereo_tri\n################################################################\n\n# Size max of the universe in meters and altitude off the ground.\n# Setting both values to zero turns this post-processing step off.\nnear-universe-radius 0.0\nfar-universe-radius 0.0\n"
  },
  {
    "path": "examples/HiRISE/Makefile",
    "content": "# This Makefile is just a demo to verify hirise processing works.\n\nall: nonmap/nonmap-DEM_CMAP.tif\n\n\n%.IMG:\n\tchmod a+x ./downloader.sh && ./downloader.sh $@ \n\n# Commands to process the full image, these take a long time!\n#PSP_005201_1640_RED.mos_hijitreged.norm.cub: PSP_005201_1640_RED0_0.IMG PSP_005201_1640_RED0_1.IMG PSP_005201_1640_RED1_0.IMG PSP_005201_1640_RED1_1.IMG PSP_005201_1640_RED2_0.IMG PSP_005201_1640_RED2_1.IMG PSP_005201_1640_RED3_0.IMG PSP_005201_1640_RED3_1.IMG PSP_005201_1640_RED4_0.IMG PSP_005201_1640_RED4_1.IMG PSP_005201_1640_RED5_0.IMG PSP_005201_1640_RED5_1.IMG PSP_005201_1640_RED6_0.IMG PSP_005201_1640_RED6_1.IMG PSP_005201_1640_RED7_0.IMG PSP_005201_1640_RED7_1.IMG PSP_005201_1640_RED8_0.IMG PSP_005201_1640_RED8_1.IMG PSP_005201_1640_RED9_0.IMG PSP_005201_1640_RED9_1.IMG\n#\thiedr2mosaic.py $^\n\n#PSP_005913_1640_RED.mos_hijitreged.norm.cub: PSP_005913_1640_RED0_0.IMG PSP_005913_1640_RED0_1.IMG PSP_005913_1640_RED1_0.IMG PSP_005913_1640_RED1_1.IMG PSP_005913_1640_RED2_0.IMG PSP_005913_1640_RED2_1.IMG PSP_005913_1640_RED3_0.IMG PSP_005913_1640_RED3_1.IMG PSP_005913_1640_RED4_0.IMG PSP_005913_1640_RED4_1.IMG PSP_005913_1640_RED5_0.IMG PSP_005913_1640_RED5_1.IMG PSP_005913_1640_RED6_0.IMG PSP_005913_1640_RED6_1.IMG PSP_005913_1640_RED7_0.IMG PSP_005913_1640_RED7_1.IMG PSP_005913_1640_RED8_0.IMG PSP_005913_1640_RED8_1.IMG PSP_005913_1640_RED9_0.IMG PSP_005913_1640_RED9_1.IMG\n#\thiedr2mosaic.py $^\n\n\n# Abbreviated processing commands\nPSP_005201_1640_RED.mos_hijitreged.norm.cub: PSP_005201_1640_RED0_0.IMG PSP_005201_1640_RED0_1.IMG PSP_005201_1640_RED1_0.IMG PSP_005201_1640_RED1_1.IMG\n\thiedr2mosaic.py $^\n\nPSP_005913_1640_RED.mos_hijitreged.norm.cub: PSP_005913_1640_RED0_0.IMG PSP_005913_1640_RED0_1.IMG PSP_005913_1640_RED1_0.IMG PSP_005913_1640_RED1_1.IMG\n\thiedr2mosaic.py $^\n\n\n\nPSP_005201_1640_RED.mos_hijitreged.norm.crop.cub: PSP_005201_1640_RED.mos_hijitreged.norm.cub\n\tcrop from=$^ to=$@ line=27000 nlines=3000\n\nPSP_005913_1640_RED.mos_hijitreged.norm.crop.cub: PSP_005913_1640_RED.mos_hijitreged.norm.cub\n\tcrop from=$^ to=$@ line=33000 nlines=3000\n\nnonmap/nonmap-PC.tif: PSP_005913_1640_RED.mos_hijitreged.norm.crop.cub PSP_005201_1640_RED.mos_hijitreged.norm.crop.cub\n\tstereo $^ nonmap/nonmap -s stereo.nonmap\n\nnonmap/nonmap-DEM.tif: nonmap/nonmap-PC.tif\n\tcd nonmap; \\\n\tpoint2dem -r mars --nodata -32767 nonmap-PC.tif --errorimage\n\nnonmap/nonmap-DEM_CMAP.tif: nonmap/nonmap-DEM.tif\n\tcd nonmap; \\\n\thillshade nonmap-DEM.tif; \\\n\tcolormap -s nonmap-DEM_HILLSHADE.tif nonmap-DEM.tif; \\\n\tcolormap nonmap-IntersectionErr.tif\n\nclean:\n\trm -rf nonmap map *.vwip\n\ndistclean:\n\trm -rf *cub *~ *.match\n"
  },
  {
    "path": "examples/HiRISE/downloader.sh",
    "content": "#!/bin/bash\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n\nphase_prefix=${1:0:3}\norbit_prefix=${1:4:4}\nobsv_prefix=${1:0:15}\nwget -O $1 http://hirise-pds.lpl.arizona.edu/PDS/EDR/${phase_prefix}/ORB_${orbit_prefix}00_${orbit_prefix}99/$obsv_prefix/$1"
  },
  {
    "path": "examples/HiRISE/stereo.nonmap",
    "content": "# -*- mode: sh -*-\n\n# Pre-Processing / stereo_pprc\n################################################################\n\n# Pre-alignment options\n#\n# Available choices are (however not all are supported by all sessions):\n#    NONE           (Recommended for anything map projected)\n#    EPIPOLAR       (Recommended for Pinhole Sessions)\n#    HOMOGRAPHY     (Recommended for ISIS wide-angle shots)\n#    AFFINEEPIPOLAR (Recommended for ISIS narrow-angle and DG sessions)\nalignment-method affineepipolar\n\n# Intensity Normalization\nforce-use-entire-range       # Use entire input range\n\n# Select a preprocessing filter:\n#\n# 0 - None\n# 1 - Subtracted Mean\n# 2 - Laplacian of Gaussian (recommended)\nprefilter-mode 2\n\n# Kernel size (1-sigma) for pre-processing\n#\n# Recommend 1.4 px for Laplacian of Gaussian\n# Recommend 25 px for Subtracted Mean\nprefilter-kernel-width 1.4\n\n# Integer Correlation / stereo_corr\n################################################################\n\n# Select a cost function to use for initialization:\n#\n# 0 - absolute difference (fast)\n# 1 - squared difference  (faster .. but usually bad)\n# 2 - normalized cross correlation (recommended)\ncost-mode 0\n\n# Initialization step: correlation kernel size\ncorr-kernel 25 25\n\n# Initialization step: correlation window size\ncorr-search -80 -2 20 2\n\n# Subpixel Refinement / stereo_rfne\n################################################################\n\n# Subpixel step: subpixel modes\n#\n# 0 - disable subpixel correlation (fastest)\n# 1 - parabola fitting (draft mode - not as accurate)\n# 2 - affine adaptive window, bayes EM weighting (slower, but much more accurate)\nsubpixel-mode 1\n\n# Subpixel step: correlation kernel size\nsubpixel-kernel 25 25\n\n# Post Filtering / stereo_fltr\n################################################################\n\n# Fill in holes up to 100,000 pixels in size with an inpainting method\n# disable-fill-holes\n\n# Automatic \"erode\" low confidence pixels\nrm-half-kernel 5 5\nrm-min-matches 60\nrm-threshold 3\nrm-cleanup-passes 1\n\n# Triangulation / stereo_tri\n################################################################\n\n# Size max of the universe in meters and altitude off the ground.\n# Setting both values to zero turns this post-processing step off.\nnear-universe-radius 0.0\nfar-universe-radius 0.0\n\n\n"
  },
  {
    "path": "examples/K10/Makefile",
    "content": "# This Makefile performs an example of processing user provided\n# images. These images are from IRG's K10 Black robot from a testing\n# session behind the 80x120.\n\nRESULTSDIR = results\nOUT = k10black\nPREFIX = $(RESULTSDIR)/$(OUT)\n\nall: $(PREFIX)-F-H.tif $(PREFIX).ive\n\n$(PREFIX)-PC.tif:\n\tmkdir -p $(RESULTSDIR)\n\tstereo left4.png right4.png black_left.tsai black_right.tsai $(PREFIX)\n\n$(PREFIX)-F-H.tif: $(PREFIX)-PC.tif\n\tcd $(RESULTSDIR); disparitydebug $(OUT)-F.tif\n\n$(PREFIX).ive: $(PREFIX)-PC.tif\n\tcd $(RESULTSDIR); point2mesh -s 2 $(OUT)-PC.tif $(OUT)-L.tif\n\nclean:\n\trm -rf $(RESULTSDIR)\n\ndistclean: clean\n"
  },
  {
    "path": "examples/K10/black_left.tsai",
    "content": "fu = 620.857971191406\nfv = 622.298034667969\ncu = 526.128784179688\ncv = 374.273742675781\nu_direction = 1 0 0\nv_direction = 0 1 0\nw_direction = 0 0 1\nC = 0.0751 -0.065 -0.902\nR = 0.000794376506820371 -0.371711462117335 0.928347972420126 0.997550683961614 -0.0646367856775087 -0.0267342264708707 0.0699428473375328 0.92609539188351 0.370749677327501\nk1 = -0.331998556852341\nk2 = 0.125557452440262\np1 = -0.000432605884270742\np2 = 0.00110327918082476\n"
  },
  {
    "path": "examples/K10/black_right.tsai",
    "content": "fu = 623.726867675781\nfv = 624.9072265625\ncu = 517.064636230469\ncv = 355.597991943359\nu_direction = 1 0 0\nv_direction = 0 1 0\nw_direction = 0 0 1\nC = 0.0729035330367489 0.0398897116894373 -0.888699091018144\nR = -0.0372906265115714 -0.363782183647855 0.930737305599584 0.997432655705587 -0.0705296800729344 0.012396030046322 0.0611351495170682 0.928810038215139 0.365478325491838\nk1 = -0.33689147233963\nk2 = 0.138674452900887\np1 = 0.000823005684651434\np2 = 0.00124822638463229\n"
  },
  {
    "path": "examples/K10/stereo.default",
    "content": "# -*- mode: sh -*-\n\n# Pre-Processing / stereo_pprc\n################################################################\n\n# Pre-alignment options\n#\n# Available choices are (however not all are supported by all sessions):\n#    NONE           (Recommended for anything map projected)\n#    EPIPOLAR       (Recommended for Pinhole Sessions)\n#    HOMOGRAPHY     (Recommended for ISIS wide-angle shots)\n#    AFFINEEPIPOLAR (Recommended for ISIS narrow-angle and DG sessions)\nalignment-method epipolar\n\n# Intensity Normalization\nforce-use-entire-range       # Use entire input range\n\n# Select a preprocessing filter:\n#\n# 0 - None\n# 1 - Subtracted Mean\n# 2 - Laplacian of Gaussian (recommended)\nprefilter-mode 2\n\n# Kernel size (1-sigma) for pre-processing\n#\n# Recommend 1.4 px for Laplacian of Gaussian\n# Recommend 25 px for Subtracted Mean\nprefilter-kernel-width 1.4\n\n# Integer Correlation / stereo_corr\n################################################################\n\n# Select a cost function to use for initialization:\n#\n# 0 - absolute difference (fast)\n# 1 - squared difference  (faster .. but usually bad)\n# 2 - normalized cross correlation (recommended)\ncost-mode 1\n\n# Initialization step: correlation kernel size\ncorr-kernel 19 23\n\n# Initialization step: correlation window size\ncorr-search -80 -2 20 2\n\n# Subpixel Refinement / stereo_rfne\n################################################################\n\n# Subpixel step: subpixel modes\n#\n# 0 - disable subpixel correlation (fastest)\n# 1 - parabola fitting (draft mode - not as accurate)\n# 2 - affine adaptive window, bayes EM weighting (slower, but much more accurate)\nsubpixel-mode 1\n\n# Subpixel step: correlation kernel size\nsubpixel-kernel 25 25\n\n# Post Filtering / stereo_fltr\n################################################################\n\n# Fill in holes up to 100,000 pixels in size with an inpainting method\ndisable-fill-holes\n\n# Automatic \"erode\" low confidence pixels\nrm-half-kernel 5 5\nrm-min-matches 60\nrm-threshold 3\nrm-cleanup-passes 1\n\n# Triangulation / stereo_tri\n################################################################\n\n# Size max of the universe in meters and altitude off the ground.\n# Setting both values to zero turns this post-processing step off.\nnear-universe-radius 0.0\nfar-universe-radius 0.0\n"
  },
  {
    "path": "examples/MER/Makefile",
    "content": "# This Makefile is just a demo of what is possible with MER.\n\n# Stereo from the Microscopic imager doesn't work unforunately because\n# the CAHVOR is not modelling the variable focal length they're using.\n\n# User interfaces\n###############################################\n\nall: stereo mesh\n\n# These are the full commands that test more sensors\n#stereo: pan01/pan01-PC.tif nav01/nav01-PC.tif mi01/mi01-PC.tif fh01lin/fh01lin-PC.tif fh01/fh01-PC.tif fh02/fh02-PC.tif rh01/rh01-PC.tif pan02/pan02-PC.tif\n\n#mesh: pan01/pan01.ive nav01/nav01.ive mi01/mi01.ive fh01lin/fh01lin.ive fh01/fh01.ive fh02/fh02.ive rh01/rh01.ive pan02/pan02.ive\n\n# These commands skip a few instruments to speed up the test\nstereo: pan01/pan01-PC.tif nav01/nav01-PC.tif mi01/mi01-PC.tif fh01/fh01-PC.tif rh01/rh01-PC.tif\n\nmesh: pan01/pan01.ive nav01/nav01.ive mi01/mi01.ive fh01/fh01.ive rh01/rh01.ive\n\n\n# Actual processing\n###############################################\n\n%.cahvor: %.img\n\tmer2camera $<\n\n%.cahv: %.img\n\tmer2camera $<\n\n%.cahvore: %.img\n\tmer2camera $<\n\npan01/pan01-PC.tif: 1p270664103esf90csp2566l2m1.img 1p270664103esf90csp2566r2m1.img 1p270664103esf90csp2566l2m1.cahvor 1p270664103esf90csp2566r2m1.cahvor\n\tstereo $^ pan01/pan01\n\nnav01/nav01-PC.tif: 1n270487304eff90cip1952l0m1.img 1n270487304eff90cip1952r0m1.img 1n270487304eff90cip1952l0m1.cahvor 1n270487304eff90cip1952r0m1.cahvor\n\tstereo $^ nav01/nav01\n\nmi01/mi01-PC.tif: 2m147677487eff8800p2976m2m1.img 2m147677547eff8800p2976m2m1.img 2m147677487eff8800p2976m2m1.cahvor 2m147677547eff8800p2976m2m1.cahvor\n\tstereo $^ mi01/mi01\n\nfh01lin/fh01lin-PC.tif: 2f194370083fflap00p1214r0m1.img 2f194370083fflap00p1214l0m1.img 2f194370083fflap00p1214r0m1.cahv 2f194370083fflap00p1214l0m1.cahv\n\tstereo $^ fh01lin/fh01lin\n\nfh01/fh01-PC.tif: 2f194370083effap00p1214l0m1.img 2f194370083effap00p1214r0m1.img 2f194370083effap00p1214l0m1.cahvore 2f194370083effap00p1214r0m1.cahvore\n\tstereo $^ fh01/fh01\n\nfh02/fh02-PC.tif: 2f191703508effanhep1110l0m1.img 2f191703508effanhep1110r0m1.img 2f191703508effanhep1110l0m1.cahvore 2f191703508effanhep1110r0m1.cahvore\n\tstereo $^ fh02/fh02\n\nrh01/rh01-PC.tif: 2r195521583effaq00p1301l0m1.img 2r195521583effaq00p1301r0m1.img 2r195521583effaq00p1301l0m1.cahvore 2r195521583effaq00p1301r0m1.cahvore\n\tstereo $^ rh01/rh01\n\npan02/pan02-PC.tif: 1p227709787eff80k7p2389l2c1.img 1p227709787eff80k7p2389r2c1.img 1p227709787eff80k7p2389l2c1.cahvor 1p227709787eff80k7p2389r2c1.cahvor\n\tstereo $^ pan02/pan02\n\npan01/pan01.ive: pan01/pan01-PC.tif\n\tpoint2mesh -s 1 -l $^ pan01/pan01-L.tif\n\nnav01/nav01.ive: nav01/nav01-PC.tif\n\tpoint2mesh -s 1 -l $^ nav01/nav01-L.tif\n\nmi01/mi01.ive: mi01/mi01-PC.tif\n\tpoint2mesh -s 1 -l $^ mi01/mi01-L.tif\n\nfh01lin/fh01lin.ive: fh01lin/fh01lin-PC.tif\n\tpoint2mesh -s 1 -l $^ fh01lin/fh01lin-L.tif\n\nfh01/fh01.ive: fh01/fh01-PC.tif\n\tpoint2mesh -s 1 -l $^ fh01/fh01-L.tif\n\nfh02/fh02.ive: fh02/fh02-PC.tif\n\tpoint2mesh -s 1 -l $^ fh02/fh02-L.tif\n\nrh01/rh01.ive: rh01/rh01-PC.tif\n\tpoint2mesh -s 1 -l $^ rh01/rh01-L.tif\n\npan02/pan02.ive: pan02/pan02-PC.tif\n\tpoint2mesh -s 1 -l $^ pan02/pan02-L.tif\n\n# Downloading data\n##############################################\n\n# PAN01\n1p270664103esf90csp2566l2m1.img:\n\twget -O $@ 'http://pds-imaging.jpl.nasa.gov/pds/prod?q=OFSN+%3D+/data/mer/opportunity//mer1po_0xxx/data/sol1605/edr//1p270664103esf90csp2566l2m1.img+AND+RT+%3D+RAW'\n1p270664103esf90csp2566r2m1.img:\n\twget -O $@ 'http://pds-imaging.jpl.nasa.gov/pds/prod?q=OFSN+%3D+/data/mer/opportunity//mer1po_0xxx/data/sol1605/edr//1p270664103esf90csp2566r2m1.img+AND+RT+%3D+RAW'\n# NAV01\n1n270487304eff90cip1952l0m1.img:\n\twget -O $@ 'http://pds-imaging.jpl.nasa.gov/pds/prod?q=OFSN+%3D+/data/mer/opportunity//mer1no_0xxx/data/sol1603/edr//1n270487304eff90cip1952l0m1.img+AND+RT+%3D+RAW'\n1n270487304eff90cip1952r0m1.img:\n\twget -O $@ 'http://pds-imaging.jpl.nasa.gov/pds/prod?q=OFSN+%3D+/data/mer/opportunity//mer1no_0xxx/data/sol1603/edr//1n270487304eff90cip1952r0m1.img+AND+RT+%3D+RAW'\n# FH01\n2f194370083effap00p1214l0m1.img:\n\twget -O $@ 'http://pds-imaging.jpl.nasa.gov/pds/prod?q=OFSN+%3D+/data/mer/spirit//mer2ho_0xxx/data/sol0766/edr//2f194370083effap00p1214l0m1.img+AND+RT+%3D+RAW'\n2f194370083effap00p1214r0m1.img:\n\twget -O $@ 'http://pds-imaging.jpl.nasa.gov/pds/prod?q=OFSN+%3D+/data/mer/spirit//mer2ho_0xxx/data/sol0766/edr//2f194370083effap00p1214r0m1.img+AND+RT+%3D+RAW'\n# FH01 (linearized)\n2f194370083fflap00p1214r0m1.img:\n\twget -O $@ 'http://pds-imaging.jpl.nasa.gov/pds/prod?q=OFSN+%3D+/data/mer/spirit//mer2ho_0xxx/data/sol0766/rdr//2f194370083fflap00p1214r0m1.img+AND+RT+%3D+RAW'\n2f194370083fflap00p1214l0m1.img:\n\twget -O $@ 'http://pds-imaging.jpl.nasa.gov/pds/prod?q=OFSN+%3D+/data/mer/spirit//mer2ho_0xxx/data/sol0766/rdr//2f194370083fflap00p1214l0m1.img+AND+RT+%3D+RAW'\n# RH01\n2r195521583effaq00p1301l0m1.img:\n\twget -O $@ 'http://pds-imaging.jpl.nasa.gov/pds/prod?q=OFSN+%3D+/data/mer/spirit//mer2ho_0xxx/data/sol0779/edr//2r195521583effaq00p1301l0m1.img+AND+RT+%3D+RAW'\n2r195521583effaq00p1301r0m1.img:\n\twget -O $@ 'http://pds-imaging.jpl.nasa.gov/pds/prod?q=OFSN+%3D+/data/mer/spirit//mer2ho_0xxx/data/sol0779/edr//2r195521583effaq00p1301r0m1.img+AND+RT+%3D+RAW'\n# FH02\n2f191703508effanhep1110l0m1.img:\n\twget -O $@ 'http://pds-imaging.jpl.nasa.gov/pds/prod?q=OFSN+%3D+/data/mer/spirit//mer2ho_0xxx/data/sol0736/edr//2f191703508effanhep1110l0m1.img+AND+RT+%3D+RAW'\n2f191703508effanhep1110r0m1.img:\n\twget -O $@ 'http://pds-imaging.jpl.nasa.gov/pds/prod?q=OFSN+%3D+/data/mer/spirit//mer2ho_0xxx/data/sol0736/edr//2f191703508effanhep1110r0m1.img+AND+RT+%3D+RAW'\n# MI01\n2m147677487eff8800p2976m2m1.img:\n\twget -O $@ 'http://pds-imaging.jpl.nasa.gov/pds/prod?q=OFSN+%3D+/data/mer/spirit///mer2mo_0xxx/data/sol0240/edr//2m147677487eff8800p2976m2m1.img+AND+RT+%3D+RAW'\n2m147677547eff8800p2976m2m1.img:\n\twget -O $@ 'http://pds-imaging.jpl.nasa.gov/pds/prod?q=OFSN+%3D+/data/mer/spirit///mer2mo_0xxx/data/sol0240/edr//2m147677547eff8800p2976m2m1.img+AND+RT+%3D+RAW'\n# PAN02\n1p227709787eff80k7p2389l2c1.img:\n\twget -O $@ 'http://pds-geosciences.wustl.edu/mer/mer1-m-pancam-2-edr-sci-v1/mer1pc_0xxx/data/sol1121/1p227709787eff80k7p2389l2c1.img'\n1p227709787eff80k7p2389r2c1.img:\n\twget -O $@ 'http://pds-geosciences.wustl.edu/mer/mer1-m-pancam-2-edr-sci-v1/mer1pc_0xxx/data/sol1121/1p227709787eff80k7p2389r2c1.img'\n\n# Clean up functions\n##############################################\n\nclean:\n\trm -rf *.cahv *.cahvor *.cahvore nav01 pan01 mi01 fh01lin fh01 rh01 fh02 pan02\n\ndistclean: clean\n\trm *.img *.IMG *~\n"
  },
  {
    "path": "examples/MER/stereo.default",
    "content": "# -*- mode: sh -*-\n\n# Pre-Processing / stereo_pprc\n################################################################\n\n# Pre-alignment options\n#\n# Available choices are (however not all are supported by all sessions):\n#    NONE           (Recommended for anything map projected)\n#    EPIPOLAR       (Recommended for Pinhole Sessions)\n#    HOMOGRAPHY     (Recommended for ISIS wide-angle shots)\n#    AFFINEEPIPOLAR (Recommended for ISIS narrow-angle and DG sessions)\nalignment-method epipolar\n\n# Intensity Normalization\nforce-use-entire-range       # Use entire input range\n\n# Select a preprocessing filter:\n#\n# 0 - None\n# 1 - Subtracted Mean\n# 2 - Laplacian of Gaussian (recommended)\nprefilter-mode 2\n\n# Kernel size (1-sigma) for pre-processing\n#\n# Recommend 1.4 px for Laplacian of Gaussian\n# Recommend 25 px for Subtracted Mean\nprefilter-kernel-width 1.4\n\n# Integer Correlation / stereo_corr\n################################################################\n\n# Select a cost function to use for initialization:\n#\n# 0 - absolute difference (fast)\n# 1 - squared difference  (faster .. but usually bad)\n# 2 - normalized cross correlation (recommended)\ncost-mode 0\n\n# Initialization step: correlation kernel size\ncorr-kernel 23 23\n\n# Initialization step: correlation window size\n#corr-search -100 -100 100 100\n\n# Subpixel Refinement / stereo_rfne\n################################################################\n\n# Subpixel step: subpixel modes\n#\n# 0 - disable subpixel correlation (fastest)\n# 1 - parabola fitting (draft mode - not as accurate)\n# 2 - affine adaptive window, bayes EM weighting (slower, but much more accurate)\nsubpixel-mode 1\n\n# Subpixel step: correlation kernel size\nsubpixel-kernel 25 25\n\n# Post Filtering / stereo_fltr\n################################################################\n\n# Fill in holes up to 100,000 pixels in size with an inpainting method\ndisable-fill-holes\n\n# Automatic \"erode\" low confidence pixels\nrm-half-kernel 3 3\nrm-min-matches 60\nrm-threshold 3\nrm-cleanup-passes 1\n\n# Triangulation / stereo_tri\n################################################################\n\n# Size max of the universe in meters and altitude off the ground.\n# Setting both values to zero turns this post-processing step off.\nuniverse-center camera\nnear-universe-radius 0.7\nfar-universe-radius 80.0\n"
  },
  {
    "path": "examples/MER/stereo.default.navcam",
    "content": "# -*- mode: sh -*-\n\n# Pre-Processing / stereo_pprc\n################################################################\n\n# Pre-alignment options\n#\n# Available choices are (however not all are supported by all sessions):\n#    NONE           (Recommended for anything map projected)\n#    EPIPOLAR       (Recommended for Pinhole Sessions)\n#    HOMOGRAPHY     (Recommended for ISIS wide-angle shots)\n#    AFFINEEPIPOLAR (Recommended for ISIS narrow-angle and DG sessions)\nalignment-method epipolar\n\n# Intensity Normalization\nforce-use-entire-range       # Use entire input range\n\n# Select a preprocessing filter:\n#\n# 0 - None\n# 1 - Subtracted Mean\n# 2 - Laplacian of Gaussian (recommended)\nprefilter-mode 2\n\n# Kernel size (1-sigma) for pre-processing\n#\n# Recommend 1.4 px for Laplacian of Gaussian\n# Recommend 25 px for Subtracted Mean\nprefilter-kernel-width 1.4\n\n# Integer Correlation / stereo_corr\n################################################################\n\n# Select a cost function to use for initialization:\n#\n# 0 - absolute difference (fast)\n# 1 - squared difference  (faster .. but usually bad)\n# 2 - normalized cross correlation (recommended)\ncost-mode 1\n\n# Initialization step: correlation kernel size\ncorr-kernel 19 23\n\n# Initialization step: correlation window size\ncorr-search -137 -21 -1 1\n\n# Subpixel Refinement / stereo_rfne\n################################################################\n\n# Subpixel step: subpixel modes\n#\n# 0 - disable subpixel correlation (fastest)\n# 1 - parabola fitting (draft mode - not as accurate)\n# 2 - affine adaptive window, bayes EM weighting (slower, but much more accurate)\nsubpixel-mode 1\n\n# Subpixel step: correlation kernel size\nsubpixel-kernel 25 25\n\n# Post Filtering / stereo_fltr\n################################################################\n\n# Fill in holes up to 100,000 pixels in size with an inpainting method\ndisable-fill-holes\n\n# Automatic \"erode\" low confidence pixels\nrm-half-kernel 3 3\nrm-min-matches 60\nrm-threshold 3\nrm-cleanup-passes 1\n\n# Triangulation / stereo_tri\n################################################################\n\n# Size max of the universe in meters and altitude off the ground.\n# Setting both values to zero turns this post-processing step off.\nnear-universe-radius 0.0\nfar-universe-radius 0.0\n"
  },
  {
    "path": "examples/MOC/Makefile",
    "content": "# This Makefile executes the steps detailed in Chapter 3 of the\n# Stereo Pipeline Users' Guide\n\nall: products_map products_nonmap\n\n# Pattern rule to create .cub files from .imq files\n%.cub: %.imq\n\tmocproc from= $< to= $@ Mapping= NO\n\njigsaw: M0100115.cub E0201461.cub\n\techo M0100115.cub > cube.lis; \\\n\techo E0201461.cub >> cube.lis; \\\n\tjigsaw fromlist=cube.lis radius=yes update=yes twist=no cnet=control.net onet=control_jigsaw.net spsolve=position\n\nM0100115.map.cub: jigsaw\n\tcam2map from=M0100115.cub to=M0100115.map.cub\n\nE0201461.map.cub: jigsaw M0100115.map.cub\n\tcam2map from=E0201461.cub to=E0201461.map.cub map=M0100115.map.cub matchmap=true\n\nM0100115.map/M0100115.kml: M0100115.map.cub\n\timage2qtree -m kml --normalize $<\n\nE0201461.map/E0201461.kml: E0201461.map.cub\n\timage2qtree -m kml --normalize $<\n\nmap/map-PC.tif: M0100115.map.cub E0201461.map.cub\n\tmkdir -p map; \\\n\tif [ ! -e map/map-PC.tif ]; then stereo $^ map/map -s stereo.map; fi\n\nmap/map-F-H.tif: map/map-PC.tif\n\tcd map; disparitydebug map-F.tif\n\nmap/map.ive: map/map-PC.tif\n\tcd map; point2mesh map-PC.tif map-L.tif\n\nmap/map-DEM.tif: map/map-PC.tif\n\tcd map; point2dem -r mars --orthoimage map-L.tif -n --error --nodata -32767 map-PC.tif;\n\nmap/map-OrthoR.tif: map/map-DEM.tif\n\tcd map; mapproject map-DEM.tif ../M0100115.cub map-OrthoR.tif;\n\nmap/map-OrthoL.tif: map/map-DEM.tif\n\tcd map; mapproject map-DEM.tif ../E0201461.cub map-OrthoL.tif;\n\nmap/map-DEM_CMAP.tif: map/map-DEM.tif\n\tcd map; \\\n\thillshade map-DEM.tif; \\\n\tcolormap -s map-DEM_HILLSHADE.tif map-DEM.tif; \\\n\tcolormap map-IntersectionErr.tif --colormap-style ../../TriangulationError.lut\n\nproducts_map: map/map-F-H.tif map/map.ive map/map-OrthoL.tif map/map-OrthoR.tif E0201461.map/E0201461.kml M0100115.map/M0100115.kml map/map-DEM_CMAP.tif\n\nnonmap/nonmap-PC.tif: jigsaw\n\tmkdir -p nonmap\n\tif [ ! -e nomap/nomap-PC.tif ]; then stereo M0100115.cub E0201461.cub nonmap/nonmap -s stereo.nonmap; fi\n\nnonmap/nonmap.ive: nonmap/nonmap-PC.tif\n\tcd nonmap; point2mesh nonmap-PC.tif nonmap-L.tif\n\nnonmap_point2dem: nonmap/nonmap-PC.tif\n\tcd nonmap; \\\n\tpoint2dem -r mars --orthoimage nonmap-L.tif nonmap-PC.tif --errorimage --nodata -32767 -n; \\\n\thillshade nonmap-DEM.tif; \\\n\tcolormap -s nonmap-DEM_HILLSHADE.tif nonmap-DEM.tif; \\\n\tcolormap nonmap-IntersectionErr.tif\n\nproducts_nonmap: nonmap/nonmap.ive nonmap_point2dem\n\nclean:\n\trm -rf map nonmap\n\trm -rf M0100115.map E0201461.map cube.lis control_ba.net *.match bundleout* residuals.csv control_jigsaw.net\n\ndistclean: clean\n\trm -rf print.prt *.cub *.vwip *.match *~\n"
  },
  {
    "path": "examples/MOC/stereo.nonmap",
    "content": "# -*- mode: sh -*-\n\n# Pre-Processing / stereo_pprc\n################################################################\n\n# Pre-alignment options\n#\n# Available choices are (however not all are supported by all sessions):\n#    NONE       (Recommended for anything map projected)\n#    EPIPOLAR   (Recommended for Pinhole Sessions)\n#    HOMOGRAPHY (Recommended for ISIS and DG Sessions)\nalignment-method homography\n\n# Intensity Normalization\nforce-use-entire-range       # Use entire input range\n\n# Select a preprocessing filter:\n#\n# 0 - None\n# 1 - Subtracted Mean\n# 2 - Laplacian of Gaussian (recommended)\nprefilter-mode 2\n\n# Kernel size (1-sigma) for pre-processing\n#\n# Recommend 1.4 px for Laplacian of Gaussian\n# Recommend 25 px for Subtracted Mean\nprefilter-kernel-width 1.4\n\n# Integer Correlation / stereo_corr\n################################################################\n\n# Select a cost function to use for initialization:\n#\n# 0 - absolute difference (fast)\n# 1 - squared difference  (faster .. but usually bad)\n# 2 - normalized cross correlation (recommended)\ncost-mode 0\n\n# Initialization step: correlation kernel size\ncorr-kernel 25 25\n\n# Initialization step: correlation window size\n#corr-search -35 -280 -15 -265\n\n# Subpixel Refinement / stereo_rfne\n################################################################\n\n# Subpixel step: subpixel modes\n#\n# 0 - disable subpixel correlation (fastest)\n# 1 - parabola fitting (draft mode - not as accurate)\n# 2 - affine adaptive window, bayes EM weighting (slower, but much more accurate)\nsubpixel-mode 2\n\n# Subpixel step: correlation kernel size\nsubpixel-kernel 25 25\n\n# Post Filtering / stereo_fltr\n################################################################\n\n# Fill in holes up to 100,000 pixels in size with an inpainting method\n# disable-fill-holes\n\n# Automatic \"erode\" low confidence pixels\nrm-half-kernel 5 5\nrm-min-matches 60\nrm-threshold 3\nrm-cleanup-passes 1\n\n# Triangulation / stereo_tri\n################################################################\n\n# Size max of the universe in meters and altitude off the ground.\n# Setting both values to zero turns this post-processing step off.\nnear-universe-radius 0.0\nfar-universe-radius 0.0"
  },
  {
    "path": "examples/TriangulationError.lut",
    "content": "nv 0 0 0\n0 255 255 255\n0.1 0 0 255\n1 0 255 0\n10 255 255 127\n100 255 0 0\n1000 255 255 255"
  },
  {
    "path": "examples/surf_match.patch",
    "content": "--- orginal_code/SURF-V1.0.9/match.cpp\t2006-12-20 03:28:30.000000000 -0600\n+++ match.cpp\t2009-03-11 13:26:07.000000000 -0500\n@@ -31,7 +31,7 @@\n  */\n \n #include <vector>\n-#include <string>\n+#include <string.h>\n #include <iostream>\n #include <fstream>\n #include <cmath>\n@@ -39,12 +39,10 @@\n #include \"ipoint.h\"\n \n // Define to compile with PGM output\n-#define GRAPHICS\n+//#define GRAPHICS\n \n-#ifdef GRAPHICS\n #include \"image.h\"\n #include \"imload.h\"\n-#endif\n \n using namespace std;\n using namespace surf;\n@@ -69,6 +67,7 @@\n \tint match = -1;\n \n \tfor (unsigned i = 0; i < ipts.size(); i++) {\n+\n \t\t// Take advantage of Laplacian to speed up matching\n \t\tif (ipts[i].laplace != ip1.laplace)\n \t\t\tcontinue;\n@@ -90,6 +89,30 @@\n \treturn -1;\n }\n \n+// Writes the interestpoint match for later reading\n+inline void write_ip_record(std::ofstream &f, Ipoint const& p){\n+  float buffer_f = (float)p.x;\n+  f.write((char*)&(buffer_f), sizeof(float));       //x\n+  buffer_f = (float)p.y;\n+  f.write((char*)&(buffer_f), sizeof(float));       //y\n+  int buffer_i = (int)p.x;\n+  f.write((char*)&(buffer_i),   sizeof(int));         //ix\n+  buffer_i = (int)p.y;\n+  f.write((char*)&(buffer_i),   sizeof(int));         //iy\n+  buffer_f = (float)p.ori;\n+  f.write((char*)&(buffer_f), sizeof(float));     //ori\n+  buffer_f = (float)p.scale;\n+  f.write((char*)&(buffer_f), sizeof(float));     //scale\n+  buffer_f = (float)p.strength;\n+  f.write((char*)&(buffer_f),sizeof(float)); //interest\n+  bool buffer_b = false;\n+  f.write((char*)&(buffer_b),sizeof(bool));  //polarity\n+  f.write((char*)&(buffer_i),sizeof(unsigned)); // octave\n+  f.write((char*)&(buffer_i),sizeof(unsigned)); // scale_lvl\n+  buffer_i = 0;\n+  f.write((char*)&(buffer_i),     sizeof(int));         //size of descriptor... nothing...                                                                                                \n+}  \n+\n // Find all possible matches between two images\n vector< int > findMatches(const vector< Ipoint >& ipts1, const vector< Ipoint >& ipts2) {\n \tvector< int > matches(ipts1.size());\n@@ -98,9 +121,7 @@\n \t\tint match = findMatch(ipts1[i], ipts2);\n \t\tmatches[i] = match;\n \t\tif (match != -1) {\n-\t\t\tcout << \" Matched feature \" << i << \" in image 1 with feature \"\n-\t\t\t\t<< match << \" in image 2.\" << endl;\n-\t\t\tc++;\n+\t\t  c++;\n \t\t}\n \t}\n \tcout << \" --> Matched \" << c << \" features of \" << ipts1.size() << \" in image 1.\" << endl;\n@@ -127,10 +148,10 @@\n \t// Load the interest points in Mikolajczyk's format\n \tfor (unsigned n = 0; n < count; n++) {\n \t\t// circular regions with diameter 5 x scale\n-\t\tfloat x, y, a, b, c;\n+\t  float x, y, a, b, c, ori;\n \n \t\t// Read in region data, though not needed for actual matching\n-\t\tipfile >> x >> y >> a >> b >> c;\n+\t  ipfile >> x >> y >> a >> b >> c >> ori;\n \n \t\tfloat det = sqrt((a-c)*(a-c) + 4.0*b*b);\n \t\tfloat e1 = 0.5*(a+c + det);\n@@ -142,6 +163,7 @@\n \t\tipts[n].x = x;\n \t\tipts[n].y = y;\n \t\tipts[n].scale = sc/2.5;\n+\t\tipts[n].ori = ori;\n \n \t\t// Read in Laplacian\n \t\tipfile >> ipts[n].laplace;\n@@ -159,7 +181,7 @@\n             (y1 >= im->getHeight() && y2 >= im->getHeight()))\n \t\treturn;\n \n-\tbool steep = std::abs(y2 - y1) > std::abs(x2 - x1);\n+\tbool steep = abs(y2 - y1) > abs(x2 - x1);\n \tif (steep) {\n \t\tint t;\n \t\tt = x1;\n@@ -182,7 +204,7 @@\n \t}\n \n \tint deltax = x2 - x1;\n-\tint deltay = std::abs(y2 - y1);\n+\tint deltay = abs(y2 - y1);\n \n \tint error = 0;\n \tint y = y1;\n@@ -215,12 +237,14 @@\n \n int main(int argc, char **argv) {\n \tImage *im1, *im2;\n-#ifdef GRAPHICS\n+\n \tImLoad ImageLoader;\n \tvector< Ipoint > ipts1, ipts2;\n \tbool drawc = false;\n-#endif\n+\n \tchar ofname[100];\n+\tstring matchname;\n+\tmatchname.clear();\n \n \tim1 = im2 = NULL;\n \tofname[0] = 0;\n@@ -232,7 +256,6 @@\n \t\t\tloadIpoints(argv[++arg], ipts1);\n \t\tif (! strcmp(argv[arg], \"-k2\"))\n \t\t\tloadIpoints(argv[++arg], ipts2);\n-#ifdef GRAPHICS\n \t\tif (! strcmp(argv[arg], \"-im1\"))\n \t\t\tim1 = ImageLoader.readImage(argv[++arg]); \n \t\tif (! strcmp(argv[arg], \"-im2\"))\n@@ -241,12 +264,13 @@\n \t\t\tstrcpy(ofname, argv[++arg]);\n \t\tif (! strcmp(argv[arg], \"-c\"))\n \t\t\tdrawc = true;\n-#endif\n+\t\tif (! strcmp(argv[arg], \"-m\"))\n+\t\t  matchname = argv[++arg];\n \t}\n \n \tif (ipts1.size() == 0 || ipts2.size() == 0) {\n \t\tcout << \"Usage:\" << endl;\n-\t\tcout << \" match -k1 out1.surf -k2 out2.surf -im1 img1.pgm -im2 img2.pgm -o out.pgm\" << endl << endl;\n+\t\tcout << \" match -k1 out1.surf -k2 out2.surf -im1 img1.pgm -im2 img2.pgm -o out.pgm -m output.match\" << endl << endl;\n \t\tcout << \"For each feature in first descriptor file, find best in second according to \"\n \t\t\t<< \"nearest neighbor ratio strategy. Display matches in out.pgm, generated \"\n \t\t\t<< \"from img1.pgm and img2.pgm. Use -c to draw crosses at interest points.\" << endl;\n@@ -255,7 +279,33 @@\n \n \tvector< int > matches = findMatches(ipts1, ipts2);\n \n-#ifdef GRAPHICS\n+\t// Determining if to save a match file\n+        if (matchname.size()) {\n+          int count = 0;\n+          for (unsigned i = 0; i < matches.size(); ++i){\n+            if (matches[i] != -1)\n+              ++count;\n+          }\n+          if (count > 0 ) {\n+            std::ofstream outputFile(matchname.c_str(), std::ios::out);\n+            outputFile.write((char*)&count, sizeof(int));\n+            outputFile.write((char*)&count, sizeof(int));\n+            //Writing left side..\n+            for (unsigned i = 0; i < matches.size(); ++i){ \n+              if (matches[i] != -1) {\n+                write_ip_record(outputFile,ipts1[i]);\n+              } \n+            }\n+            //Writing right side..\n+            for (unsigned i = 0; i < matches.size(); ++i){\n+              if (matches[i] != -1) {\n+                write_ip_record(outputFile,ipts2[matches[i]]);\n+              }  \n+            } \n+          } \n+        } \n+\n+\n \tif (im1 != NULL && im2 != NULL && ofname[0] != 0) {\n \t\tImage res(max(im1->getWidth(), im2->getWidth()), im1->getHeight() + im2->getHeight());\n \t\tfor (int x = 0; x < im1->getWidth(); x++)\n@@ -283,7 +333,6 @@\n \n \t\tImageLoader.saveImage(ofname, &res);\n \t}\n-#endif\n \t\n \treturn 0;\n }\n"
  },
  {
    "path": "plugins/stereo/plugin_list.txt",
    "content": "# Specify here the external programs (plugins) that ASP can use for\n# stereo correlation. All paths are relative to the ASP top-level\n# directory.\n\n# If a plugin has library dependencies apart from the libraries\n# shipped with ASP, the path to them can be specified as well (this is\n# optional).\n\n# Name    Executable                       Path to external library dependencies\n\n  mgm      plugins/stereo/mgm/bin/mgm       plugins/stereo/mgm/lib\n  msmw     plugins/stereo/msmw/bin/msmw     plugins/stereo/msmw/lib\n  msmw2    plugins/stereo/msmw2/bin/msmw2   plugins/stereo/msmw2/lib\n  libelas  plugins/stereo/elas/bin/elas     plugins/stereo/elas/lib\n"
  },
  {
    "path": "src/CMakeLists.txt",
    "content": "include(Utilities) # Contains functions\n\n# Verify that we have a new enough compiler.\nif(CMAKE_CXX_COMPILER_ID STREQUAL \"GNU\")\n  if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS \"5.0.0\")\n    message(FATAL_ERROR \"GCC version >= 5.0.0 is required!\")\n  endif()\nelseif(CMAKE_CXX_COMPILER_ID MATCHES \"^(Apple)?Clang$\")\n  if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS \"8.1.0\")\n    message(FATAL_ERROR \"Clang version >= 8.1.0 is required!\")\n  endif()\nelse()\n  message(FATAL_ERROR \"Unknown compiler: ${CMAKE_CXX_COMPILER_ID}\")\nendif()\n\n\n#===============================================================================\n# Project information\n\nproject (StereoPipeline)\n\n# The line below is used by the docs/ so don't change it\n# without testing the result.  Versioning is based on https://semver.org\n#set(PACKAGE_VERSION \"3.6.0\")\nset(PACKAGE_VERSION \"3.7.0-alpha\")\nset(PACKAGE_NAME \"NASA Ames Stereo Pipeline\")\nset(PACKAGE_STRING \"${PACKAGE_NAME} ${PACKAGE_VERSION}\")\nset(PACKAGE_BUGREPORT \"oleg.alexandrov@nasa.gov, scott.t.mcmichael@nasa.gov\")\n\n# Fetch the Git hash and store in ASP_COMMIT_ID\nexecute_process(\n  COMMAND git log -1 --format=%h\n  WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}\n  OUTPUT_VARIABLE ASP_COMMIT_ID\n  OUTPUT_STRIP_TRAILING_WHITESPACE\n)\n\n# Find the build date in UTC. Will agree with the daily build date.\n# That because the build is started late at night in PST, which is\n# next morning in UTC, and by the time it is published it is next day\n# in PST, but midday or early evening in UTC.\nstring(TIMESTAMP ASP_BUILD_DATE \"%Y-%m-%d\" UTC)\n\n#===============================================================================\n\n# Set the install path if not specified by the user.\nif (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)\n  set (CMAKE_INSTALL_PREFIX \"${CMAKE_SOURCE_DIR}/install\" CACHE PATH \"default install path\" FORCE)\nendif()\nmessage(\"Cmake install directory set to: ${CMAKE_INSTALL_PREFIX}\")\n\nenable_testing() # Needed for unit tests to work\n\n# Add command to build the instructions pdf file\nadd_custom_target(workbook make\n                  WORKING_DIRECTORY \"${CMAKE_SOURCE_DIR}/docs/book\")\n\n# Add command to build doxygen files\nadd_custom_target(doxygen doxygen\n                  COMMAND ln -s ${CMAKE_SOURCE_DIR}/docs/doxygen/index.html ${CMAKE_SOURCE_DIR}/docs/doxygen-output.html\n                  WORKING_DIRECTORY \"${CMAKE_SOURCE_DIR}\")\n\n# Add external dependencies which still need to be built\n\n# Build GTest\ninclude_directories(../thirdparty/gtest/include)\n#include_directories(../thirdparty/gtest/)\nadd_library(gtest      ../thirdparty/gtest/src/gtest-all.cc)\nadd_library(gtest_main ../thirdparty/gtest/src/gtest_main.cc)\ntarget_link_libraries(gtest_main gtest) \n\ntarget_compile_definitions(gtest PRIVATE GTEST_USE_OWN_TR1_TUPLE=1)\ntarget_compile_definitions(gtest_main PRIVATE GTEST_USE_OWN_TR1_TUPLE=1)\n\n# Add all of our code\nadd_subdirectory(asp)\n\n\n\n\n\n\n"
  },
  {
    "path": "src/asp/CMakeLists.txt",
    "content": "# Add path for custom modules\nset(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} \"${CMAKE_CURRENT_SOURCE_DIR}\" )\n\ninclude(Utilities) # Contains functions\n\n# Configuration options\n\n# Directory paths\nset(VISIONWORKBENCH_INSTALL_DIR \"\" CACHE FILEPATH \"Path to the user-built and installed VisionWorkbench\")\nset(ASP_DEPS_DIR \"\" CACHE FILEPATH \"Path to the conda environment that has the ASP dependencies\")\n\n# If VW was not built and installed separately, it should have been\n# built and installed in ASP_DEPS_DIR.\nif (NOT VISIONWORKBENCH_INSTALL_DIR)\n  set(VISIONWORKBENCH_INSTALL_DIR ${ASP_DEPS_DIR})\nendif()\n\nif (\"${ASP_DEPS_DIR}\" STREQUAL \"\")\n  message(FATAL_ERROR \"You need to set ASP_DEPS_DIR\")\nendif()\n\n# Building core ASP only results in fewer third-party dependencies\nif (CORE_ASP_ONLY)\n  message(STATUS \"Building core ASP only.\")\n  set(USE_ISIS OFF)\n  set(USE_OPENEXR OFF)\nendif()\n\n# Where to search for dependencies\nset(CMAKE_PREFIX_PATH \"${ASP_DEPS_DIR}\")\n\n# This needed for some libs represented as -lmylib\nset(CMAKE_EXE_LINKER_FLAGS \"${CMAKE_EXE_LINKER_FLAGS} -L${ASP_DEPS_DIR}/lib\")\n\nfind_package(Threads REQUIRED)\n\n# Put the search for Boost early on, to ensure that the Conda version\n# is found before we point to the BB folder.\nmessage(\"Searching for Boost.\")\nset(REQUIRED_BOOST_LIBS program_options system filesystem regex date_time thread iostreams)\nset(Boost_ROOT       \"${ASP_DEPS_DIR}\")\nset(Boost_LIBRARYDIR \"${ASP_DEPS_DIR}/lib\")\nset(Boost_INCLUDEDIR \"${ASP_DEPS_DIR}/include\")\nset(Boost_NO_SYSTEM_PATHS ON) # Do not search anywhere else\nset(Boost_DEBUG ON)\nset(Boost_DETAILED_FAILURE_MSG ON)\nset(Boost_USE_STATIC_LIBS   OFF)\nset(Boost_USE_MULTITHREADED ON)\nfind_package(Boost CONFIG REQUIRED COMPONENTS ${REQUIRED_BOOST_LIBS})\nif (Boost_FOUND)\n    message(\"Successfully found Boost.\")\n    message(\"Boost libraries = ${Boost_LIBRARIES}\")\n    message(\"Boost dir: ${Boost_DIR}\")\n    include_directories(${Boost_INCLUDE_DIR})\nendif(Boost_FOUND)\n\n# Custom options\noption(BUILD_SHARED_LIBS \"Produce shared libraries.\" TRUE)\n\n# Don't set CMAKE_INSTALL_RPATH_USE_LINK_PATH. On macOS the Apple linker\n# auto-adds rpaths for @rpath dylibs, causing duplicates with USE_LINK_PATH.\n# On Linux, $ORIGIN/../lib + explicit paths cover all needed paths.\n\n# Make sure installed files can find installed libraries\nif (APPLE)\n  SET(CMAKE_INSTALL_RPATH \"@loader_path/../lib\" ${CMAKE_INSTALL_RPATH})\nelseif (UNIX)\n  SET(CMAKE_INSTALL_RPATH \"$ORIGIN/../lib\" ${CMAKE_INSTALL_RPATH})\nendif()\nset(CMAKE_INSTALL_RPATH ${VISIONWORKBENCH_INSTALL_DIR}/lib ${CMAKE_INSTALL_RPATH})\nSET(CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_PREFIX}/lib ${CMAKE_INSTALL_RPATH})\nSET(CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_RPATH} ${ASP_DEPS_DIR}/lib/csmplugins)\nlist(REMOVE_DUPLICATES CMAKE_INSTALL_RPATH)\n\n# Enable/disable SSE optimizations\nif (CMAKE_SYSTEM_NAME STREQUAL \"Darwin\" AND CMAKE_SYSTEM_PROCESSOR STREQUAL \"arm64\")\n  set(VW_ENABLE_SSE 0)\nelse()\n  set(VW_ENABLE_SSE 1)\nendif()\nif (VW_ENABLE_SSE)\n  set(CXXFLAGS \"${CXXFLAGS} -msse4.1\")\n  set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -msse4.1\")\n  message(STATUS \"Enabling SSE\")\nelse()\n  if (CMAKE_SYSTEM_NAME STREQUAL \"Darwin\" AND CMAKE_SYSTEM_PROCESSOR STREQUAL \"arm64\")\n    message(STATUS \"SSE optimizations are not available on Mac Arm.\")\n  else()\n    # Older Intel CPUs do not support SSE4.1\n    message(STATUS, \"Disabling SSE.\")\n    set(CXXFLAGS \"${CXXFLAGS} -mno-sse4.1\")\n    set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -mno-sse4.1\")\n  endif()\nendif()\n\ninclude_directories(${CMAKE_CURRENT_SOURCE_DIR})\ninclude_directories(${CMAKE_BINARY_DIR}/src)  # For generated config headers\n\nset(ASP_HAVE_PKG_ICEBRIDGE 1)\n\nif (APPLE)\n  set(ASP_OSX_BUILD 1)\nendif()\n\n# Use CCache if it is available.\nfind_program(CCACHE_FOUND ccache)\nif(CCACHE_FOUND)\n  #message(\"Using ccache tool...\")\n  #set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)\n  #set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)\nendif(CCACHE_FOUND)\n\nif (UNIX AND NOT APPLE)\n  execute_process(COMMAND ${CMAKE_C_COMPILER} -fuse-ld=gold -Wl,--version ERROR_QUIET OUTPUT_VARIABLE ld_version)\n  if (\"${ld_version}\" MATCHES \"GNU gold\")\n    message(\"Using gold linker...\")\n    set(CMAKE_EXE_LINKER_FLAGS \"${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=gold -Wl,--disable-new-dtags\")\n    set(CMAKE_SHARED_LINKER_FLAGS \"${CMAKE_SHARED_LINKER_FLAGS} -fuse-ld=gold -Wl,--disable-new-dtags\")\n  endif()\nendif()\n\n# Find dependencies\n\nset(REQUIRED     True )\nset(NOT_REQUIRED False)\nset(ext \".so\")\nif (APPLE)\n  set(ext \".dylib\")\nendif()\n\n# Set up VisionWorkbench\nmessage(\"Vision Workbench installation directory: ${VISIONWORKBENCH_INSTALL_DIR}\")\nset(VISIONWORKBENCH_INCLUDE_DIR ${VISIONWORKBENCH_INSTALL_DIR}/include)\nset(VISIONWORKBENCH_LIBRARY_DIR ${VISIONWORKBENCH_INSTALL_DIR}/lib)\nset(ASP_HAVE_PACKAGE_VW 1)\nset(VW_LIBNAMES VwBundleAdjustment  VwCore      VwImage          VwMosaic\n                VwCamera            VwFileIO    VwInterestPoint  VwStereo\n                VwCartography       VwGeometry  VwMath)\nfind_external_library(VISIONWORKBENCH ${VISIONWORKBENCH_INSTALL_DIR} \"\" \"${VW_LIBNAMES}\" REQUIRED)\n\nmessage(\"Searching for Qt.\")\n# QT is complicated to use and should go through find_package\nset(QT_QMAKE_EXECUTABLE  ${ASP_DEPS_DIR}/bin/qmake)\nset(QT_MOC_EXECUTABLE    ${ASP_DEPS_DIR}/bin/moc)\nset(QT_RCC_EXECUTABLE    ${ASP_DEPS_DIR}/bin/rcc)\nset(QT_UIC_EXECUTABLE    ${ASP_DEPS_DIR}/bin/uic)\n\n# Qt6: Script, ScriptTools, XmlPatterns were removed.\n# OpenGLWidgets is new in Qt6 (split from OpenGL).\nset(REQUIRED_QT_COMPONENTS  Core                Concurrent\n                            Gui                 Multimedia\n                            MultimediaWidgets   Network\n                            OpenGL              OpenGLWidgets\n                            PrintSupport\n                            Qml                 Quick\n                            Sql                 Svg\n                            Test                Widgets\n                            Xml                 Core5Compat)\nfind_package(Qt6 COMPONENTS ${REQUIRED_QT_COMPONENTS} REQUIRED)\n\nif(Qt6_FOUND)\n    # We need this to be able to include headers produced by uic in our\n    # code (CMAKE_BINARY_DIR holds a path to the build directory, while\n    # INCLUDE_DIRECTORIES() works just like INCLUDEPATH from qmake)\n    INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR})\n    set (ASP_HAVE_PKG_QT 1)\n    message(\"Qt found: ${Qt6Core_INCLUDE_DIRS}\")\nendif(Qt6_FOUND)\n\nfind_external_library(QWT ${ASP_DEPS_DIR} \"\" \"qwt\" REQUIRED)\n\n# TODO(oalexan1): Figure out why clang does not find OpenMP\n# Also try to to understand why OpenMP cannot be found\n# without all the \"set\" logic below.\nif (APPLE)\n    set(OpenMP_C_LIB_NAMES \"gomp\")\n    set(OPENMP_INCLUDES \"${ASP_DEPS_DIR}/include\")\n    set(OpenMP_C_FLAGS \"-fopenmp\")\n    set(OpenMP_gomp_LIBRARY \"${ASP_DEPS_DIR}/lib/libgomp${CMAKE_SHARED_LIBRARY_SUFFIX}\")\n    set(OpenMP_CXX_FLAGS \"-fopenmp\")\n    set(OpenMP_CXX_LIB_NAMES \"gomp\")\n    set (CMAKE_EXE_LINKER_FLAGS \"${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_gomp_LIBRARY}\")\nelse()\n    find_package(OpenMP REQUIRED)\n    set (CMAKE_EXE_LINKER_FLAGS \"${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}\")\nendif()\nset (CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}\")\nset (CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}\")\n      \nfind_external_library(LAPACK ${ASP_DEPS_DIR} \"\" \"lapack;blas\" REQUIRED)\nset(VW_HAVE_PKG_FLAPACK 1) # This specifies that it is a Fortran derived version\n\n# Required for GLog\nadd_definitions(-DGLOG_USE_GLOG_EXPORT)\n\nfind_external_library(FLANN   ${ASP_DEPS_DIR} \"\" \"flann_cpp\" REQUIRED)\nfind_external_library(LZ4     ${ASP_DEPS_DIR} \"\" \"lz4\"       REQUIRED)\nfind_external_library(Z       ${ASP_DEPS_DIR} \"\" \"z\"         REQUIRED)\nfind_external_library(PROJ    ${ASP_DEPS_DIR} \"\" \"proj\"      REQUIRED)\nfind_external_library(JPEG    ${ASP_DEPS_DIR} \"\" \"jpeg\"      REQUIRED)\nfind_external_library(PNG     ${ASP_DEPS_DIR} \"\" \"png;png16\" REQUIRED)\nfind_external_library(TIFF    ${ASP_DEPS_DIR} \"\" \"tiff\"      REQUIRED)\nfind_external_library(GEOTIFF ${ASP_DEPS_DIR} \"\" \"geotiff\"   REQUIRED)\nfind_external_library(GDAL    ${ASP_DEPS_DIR} \"\" \"gdal\"      REQUIRED)\n\nif (USE_OPENEXR)\n  set(ILMBASE_LIB_NAMES Half Iex Imath IlmThread)\n  find_external_library(ILMBASE ${ASP_DEPS_DIR} \"\" \"${ILMBASE_LIB_NAMES}\" REQUIRED)\n  find_external_library(OPENEXR ${ASP_DEPS_DIR} \"OpenEXR\" \"IlmImf;IlmThread\" REQUIRED)\nelse()\n  message(STATUS \"OpenEXR will not be used.\")\nendif()\n\nfind_external_library(XERCESC ${ASP_DEPS_DIR} \"\" \"xerces-c\" REQUIRED)\nfind_external_library(PROTOBUF ${ASP_DEPS_DIR} \"\" \"protobuf\" REQUIRED)\n\nfind_external_library(EIGEN ${ASP_DEPS_DIR} \"eigen3\" \"\" REQUIRED)\nfind_external_library(CERES ${ASP_DEPS_DIR} \"ceres\" \"ceres\" REQUIRED)\nfind_external_library(GFLAGS ${ASP_DEPS_DIR} \"gflags\" \"gflags\" REQUIRED)\nfind_external_library(GLOG ${ASP_DEPS_DIR} \"glog\" \"glog\" REQUIRED)\n\nif (NOT CORE_ASP_ONLY)\n  find_external_library(LIBNABO ${ASP_DEPS_DIR} \"nabo\" \"nabo\" REQUIRED)\n  find_external_library(GEOID ${ASP_DEPS_DIR} \"\" \"egm2008\" REQUIRED)\n  find_external_library(LIBPOINTMATCHER ${ASP_DEPS_DIR} \"\" \"pointmatcher\" REQUIRED)\n  find_external_library(FASTGLOBALREGISTRATION ${ASP_DEPS_DIR} \"FastGlobalRegistration\" \"FastGlobalRegistrationLib\" REQUIRED)\nendif()\n\nif (USE_ISIS)\n  find_external_library(SPICE ${ASP_DEPS_DIR} \"cspice\" \"cspice\" REQUIRED)\n  find_external_library(ARMADILLO ${ASP_DEPS_DIR} \"\" \"armadillo\" REQUIRED)\n  find_external_library(EMBREE ${ASP_DEPS_DIR} \"\" \"embree3\" REQUIRED)\n  find_external_library(ISIS ${ASP_DEPS_DIR} \"isis\" \"isis;core\" REQUIRED)\n  \n  # Pull the ISIS version. It is on the first line before the first space.\n  file(STRINGS \"${ASP_DEPS_DIR}/isis_version.txt\" ISIS_VERSION_LINE LIMIT_COUNT 1)\n  # Split by space, save to list\n  string(REPLACE \" \" \";\" ISIS_VERSION_LIST ${ISIS_VERSION_LINE}) \n  # Get the first element\n  list(GET ISIS_VERSION_LIST 0 ISIS_VERSION)\n  message(STATUS \"Found ISIS version: ${ISIS_VERSION}\")\n    \n  # For now, this is needed only for Linux. When upgrading ISIS on the Mac,\n  # it will be needed also.\n  if (LINUX)\n    #find_external_library(SPICEQL ${ASP_DEPS_DIR} \"\" \"SpiceQL\" REQUIRED)\n  endif()\n\n  # Some ISIS headers include Qt headers in a way that requires the include below\n  include_directories(\"${ASP_DEPS_DIR}/include/qt6\")\n  include_directories(\"${ASP_DEPS_DIR}/include/qt6/QtCore\")\n  include_directories(\"${ASP_DEPS_DIR}/include/qt6/QtXml\")\n  include_directories(\"${ASP_DEPS_DIR}/include/qt6/QtCore5Compat\")\n  set(ASP_HAVE_PKG_ISIS 1)\nelse()\n  message(STATUS \"ISIS not found. Some features will be disabled.\")\n  set(ASP_HAVE_PKG_ISIS 0)\nendif()\n\nfind_external_library(CSM ${ASP_DEPS_DIR} \"csm\" \"csmapi\" REQUIRED)\n\n# Link to libusgscsm. This makes it disappear from the list of CSM\n# plugins, presumably because it is found at link time now,\n# but things still work. This is is necessary since we need to peek into\n# usgscsm by bypassing the csm interface.\n# Have to use a global variable to peek in the subdir where this lib is stored.\nset(LIB_SUBDIR \"csmplugins/\")\nfind_external_library(USGSCSM ${ASP_DEPS_DIR} \"usgscsm\" \"usgscsm\" REQUIRED)\nset(LIB_SUBDIR \"\") # No longer needed\n\n# ALE\nfind_external_library(ALE ${ASP_DEPS_DIR} \"ale\" \"ale\" REQUIRED)\n\n# PCL\n# The PCL include directory is include/pcl-x.xx\nfile(GLOB PCL_DIRS \"${ASP_DEPS_DIR}/include/pcl-*\") # all matches\nlist(GET PCL_DIRS 0 PCL_DIR) # first entry\nif (NOT PCL_DIR) # must exist\n  message(FATAL_ERROR \"Could not find the PCL include directory.\")\nendif()\nget_filename_component(PCL_INC_DIR ${PCL_DIR} NAME) # extract pcl-x.xx\nset(PCL_LIB_NAMES pcl_common pcl_features pcl_filters pcl_io_ply pcl_io\n                  pcl_kdtree pcl_keypoints pcl_ml pcl_octree pcl_recognition\n                  pcl_registration pcl_sample_consensus pcl_search pcl_segmentation\n                  pcl_stereo pcl_surface pcl_tracking)\nfind_external_library(PCL ${ASP_DEPS_DIR} \"${PCL_INC_DIR}\" \"${PCL_LIB_NAMES}\" REQUIRED)\n\n# OpenCV \nset(OPENCV_LIB_NAMES opencv_calib3d     opencv_reg\n                     opencv_core        opencv_shape\n                     opencv_features2d  opencv_stitching\n                     opencv_flann       opencv_superres\n                     opencv_hdf         opencv_surface_matching\n                     opencv_highgui     opencv_videoio\n                     opencv_imgcodecs   opencv_video\n                     opencv_imgproc     opencv_xfeatures2d\n                     opencv_ml          opencv_ximgproc\n                     opencv_objdetect   opencv_xobjdetect\n                     opencv_photo       opencv_xphoto\n                     opencv_stereo)\nfind_external_library(OPENCV ${ASP_DEPS_DIR} \"opencv4\" \"${OPENCV_LIB_NAMES}\" REQUIRED)\n\n# PDAL\nset(PDAL_LIB_NAMES pdal_plugin_kernel_fauxplugin\n                   # pdal_plugin_reader_hdf\n                   # pdal_plugin_reader_pgpointcloud\n                   # pdal_plugin_writer_pgpointcloud\n                   #pdal_plugin_reader_tiledb \n                   #pdal_plugin_writer_tiledb \n                   pdalcpp)\nfind_external_library(PDAL ${ASP_DEPS_DIR} \"pdal\" \"${PDAL_LIB_NAMES}\" REQUIRED)\n\nset(TBB_LIB_NAMES tbb tbbmalloc tbbmalloc_proxy)\nfind_external_library(TBB ${ASP_DEPS_DIR} \"\" \"${TBB_LIB_NAMES}\" REQUIRED)\n\n# This is an experiment, to be continued\n# Use only a small portion of VTK, and only in one stand-alone\n# tool. That one is a giant library. Thse are installed using\n# a custom conda package which only has the minimum needed libs.\n#set(VTK_LIB_NAMES    vtkCommonDataModel-9.1 vtkCommonTransforms-9.1\n#                     vtkCommonMath-9.1      vtkkissfft-9.1\n#                     vtkCommonCore-9.1      vtksys-9.1\n#                     vtkCommonMisc-9.1      vtkCommonSystem-9.1\n#                     vtkloguru-9.1)\n#find_external_library(VTK ${ASP_DEPS_DIR} \"vtk-9.1\" \"${VTK_LIB_NAMES}\" REQUIRED)\n\n# For convenience, list some libraries that ASP deneds on\nset(ASP_3RD_PARTY_LIBS ${Z_LIBRARIES} ${OPENCV_LIBRARIES}\n    ${GDAL_LIBRARIES} ${LAPACK_LIBRARIES} ${Boost_LIBRARIES}  \n    ${PROJ_LIBRARIES} ${GEOTIFF_LIBRARIES}  ${JPEG_LIBRARIES} ${TIFF_LIBRARIES} \n    ${PNG_LIBRARIES} ${FLANN_LIBRARIES} ${LZ4_LIBRARIES}\n    Qt6::Core ${PROTOBUF_LIBRARIES} \n    ${QWT_LIBRARIES} ${PCL_LIBRARIES} ${TBB_LIBRARIES})\nif (USE_OPENEXR)\n  list(APPEND ASP_3RD_PARTY_LIBS ${OPENEXR_LIBRARIES} ${ILMBASE_LIBRARIES})\nendif()\n\nif (USE_ISIS)\n  list(APPEND ASP_3RD_PARTY_LIBS ${ARMADILLO_LIBRARIES} ${EMBREE_LIBRARIES}\n    ${SPICE_LIBRARIES})\n  if (LINUX)\n    list(APPEND ASP_3RD_PARTY_LIBS ${SPICEQL_LIBRARIES})\n  endif()\nendif()\n\n# These are needed for rig_calibrator\nif (NOT CORE_ASP_ONLY)\n  # MVE\n  set(MVE_LIB_NAMES mveUtil mveCore mveDmrecon)\n  find_external_library(MVE ${ASP_DEPS_DIR} \"mve\" \"${MVE_LIB_NAMES}\" REQUIRED)\n  # Rayint only has headers, no libraries\n  find_external_library(RAYINT ${ASP_DEPS_DIR} \"rayint\" \"\" REQUIRED)\n  # texture reconstruction\n  find_external_library(TEXRECON ${ASP_DEPS_DIR} \"\" \"texture_reconstruction\" REQUIRED)\nendif()\n\n# Prioratize including files from the local code base and VW\ninclude_directories(BEFORE ${VISIONWORKBENCH_INCLUDE_DIR})\ninclude_directories(BEFORE ../)\n\n# Now that we have found all our external dependencies, generate a config.h file\ninclude(\"GenerateConfig.cmake\")\n\n# Add all the header files at the top level to the install command\n# Note: This does not install the headers in subdirectories.\n# Separate code exists in add_library_wrapper() for taking\n# care of that.\nget_all_source_files(\".\" MAIN_HEADER_FILES)\nforeach(f ${MAIN_HEADER_FILES})\n  INSTALL(FILES ${f} DESTINATION include/asp)\nendforeach()\n\n# Install the generated config headers from build directory\ninstall(FILES ${CMAKE_BINARY_DIR}/src/asp/asp_config.h DESTINATION include/asp)\ninstall(FILES ${CMAKE_BINARY_DIR}/src/asp/asp_date_config.h DESTINATION include/asp)\n\n# CERES and its dependencies\nset(SOLVER_LIBRARIES ${CERES_LIBRARIES} ${GLOG_LIBRARIES} ${GFLAGS_LIBRARIES})\n    \n# Define each of the libaries\n\n# ASP Core\nget_all_source_files( \"Core\"       ASP_CORE_SRC_FILES)\nget_all_source_files( \"Core/tests\" ASP_CORE_TEST_FILES)\nset(ASP_CORE_LIB_DEPENDENCIES ${ASP_3RD_PARTY_LIBS} ${VISIONWORKBENCH_LIBRARIES}\n    ${PDAL_LIBRARIES} ${OpenMP_CXX_LIBRARIES} ${CMAKE_DL_LIBS})\n\n# Isis\nif (USE_ISIS)\n  get_all_source_files( \"IsisIO\"       ASP_ISISIO_SRC_FILES)\n  get_all_source_files( \"IsisIO/tests\" ASP_ISISIO_TEST_FILES)\n  set(ASP_ISISIO_LIB_DEPENDENCIES AspCore ${ASP_3RD_PARTY_LIBS} ${ISIS_LIBRARIES}\n                               ${ASP_3RD_PARTY_LIBS} ${VISIONWORKBENCH_LIBRARIES}\n                               Qt6::Core5Compat)\nendif()\n\n# ASP PclIO\nget_all_source_files(\"PclIO\" ASP_PCLIO_SRC_FILES)\nget_all_source_files( \"PclIO/tests\" ASP_PCLIO_TEST_FILES)\nset(ASP_PCLIO_LIB_DEPENDENCIES \n    pcl_common pcl_io_ply pcl_io ${VISIONWORKBENCH_LIBRARIES} AspCore)\n\n# ASP OpenMVG\nget_all_source_files( \"OpenMVG\" ASP_OPENMVG_SRC_FILES)\nget_all_source_files( \"OpenMVG/tests\" ASP_OPENMVG_TEST_FILES)\nset(ASP_OPENMVG_LIB_DEPENDENCIES \"\")\n\n# ASP Rig\nget_all_source_files(\"Rig\" ASP_RIG_SRC_FILES)\nget_all_source_files(\"Rig/tests\" ASP_RIG_TEST_FILES)\nif (CORE_ASP_ONLY)\n  # Exclude files that depend on MVE, Rayint, and Texrecon\n  list(FILTER ASP_RIG_SRC_FILES EXCLUDE REGEX \"texture\")\nendif()\nset(ASP_RIG_LIB_DEPENDENCIES AspCore AspOpenMvg AspPclIO tbb ${OPENCV_LIBRARIES}\n    ${SOLVER_LIBRARIES} ${MVE_LIBRARIES} ${RAYINT_LIBRARIES} ${TEXRECON_LIBRARIES})\n\n# ASP Camera\nget_all_source_files(\"Camera\"       ASP_CAMERA_SRC_FILES)\nget_all_source_files(\"Camera/tests\" ASP_CAMERA_TEST_FILES)\nset(ASP_CAMERA_LIB_DEPENDENCIES AspCore AspRig ${XERCESC_LIBRARIES}\n    ${CSM_LIBRARIES} ${USGSCSM_LIBRARIES} ${ALE_LIBRARIES})\nif (USE_ISIS)\n  set(ASP_CAMERA_LIB_DEPENDENCIES ${ASP_CAMERA_LIB_DEPENDENCIES} AspIsisIO)\nendif()\n\n# ASP SfS\nget_all_source_files(\"SfS\"       ASP_SfS_SRC_FILES)\nget_all_source_files(\"SfS/tests\" ASP_SfS_TEST_FILES)\nset(ASP_SfS_LIB_DEPENDENCIES AspCore AspCamera ${SOLVER_LIBRARIES})\n\n# ASP GUI\nget_all_source_files( \"GUI\"       ASP_GUI_SRC_FILES)\nget_all_source_files( \"GUI/tests\" ASP_GUI_TEST_FILES)\nset(ASP_GUI_LIB_DEPENDENCIES AspCore AspCamera Qt6::Core Qt6::Gui Qt6::Widgets\n    ${QWT_LIBRARIES})\n\n# ASP SfmView\nget_all_source_files( \"SfmView\"       ASP_SFMVIEW_SRC_FILES)\nget_all_source_files( \"SfmView/tests\" ASP_SFMVIEW_TEST_FILES)\nset(ASP_SFMVIEW_LIB_DEPENDENCIES Qt6::Core Qt6::Gui Qt6::Widgets Qt6::OpenGL Qt6::OpenGLWidgets)\n\n# ASP Gotcha\nget_all_source_files( \"Gotcha\"       ASP_GOTCHA_SRC_FILES)\nget_all_source_files( \"Gotcha/tests\" ASP_GOTCHA_TEST_FILES)\nset(ASP_GOTCHA_LIB_DEPENDENCIES ${VISIONWORKBENCH_LIBRARIES} ${OPENCV_LIBRARIES} \n    ${Boost_LIBRARIES})\n\nif (NOT CORE_ASP_ONLY)\n  # ASP PcAlign\n  get_all_source_files(\"PcAlign\" ASP_PC_ALIGN_SRC_FILES)\n  get_all_source_files(\"PcAlign/tests\" ASP_PC_ALIGN_TEST_FILES)\n  set(ASP_PC_ALIGN_LIB_DEPENDENCIES ${SOLVER_LIBRARIES} ${LIBPOINTMATCHER_LIBRARIES}\n      ${LIBNABO_LIBRARIES} ${FASTGLOBALREGISTRATION_LIBRARIES} AspCore)\nendif()    \n\n# ASP Sessions\nget_all_source_files( \"Sessions\"       ASP_SESSIONS_SRC_FILES)\nget_all_source_files( \"Sessions/tests\" ASP_SESSIONS_TEST_FILES)\nset(ASP_SESSIONS_LIB_DEPENDENCIES AspCore AspCamera)\n\n# Add all of the library subdirectories\n\nadd_subdirectory(Core)\nif (USE_ISIS)\n    add_subdirectory(IsisIO)\nendif()\n\nif (NOT CORE_ASP_ONLY)\n  add_subdirectory(PcAlign)\nendif()\n\nadd_subdirectory(Rig)\nadd_subdirectory(OpenMVG)\nadd_subdirectory(Camera)\n\nadd_subdirectory(Sessions)\nadd_subdirectory(GUI)\nadd_subdirectory(SfmView)\nadd_subdirectory(Gotcha)\nadd_subdirectory(SfS)\n\nadd_subdirectory(PclIO)\n\n# Add the non-library subdirectories\nadd_subdirectory(Python)\nadd_subdirectory(Tools)\nadd_subdirectory(WVCorrect)\nadd_subdirectory(IceBridge)\n\n# On macOS the Apple linker auto-adds rpaths that duplicate the ones CMake\n# sets via CMAKE_INSTALL_RPATH. Remove duplicates and re-sign after install.\nif (APPLE)\n  install(CODE \"\n    file(GLOB asp_libs \\\"\\${CMAKE_INSTALL_PREFIX}/lib/libAsp*.dylib\\\")\n    file(GLOB vw_libs \\\"\\${CMAKE_INSTALL_PREFIX}/lib/libVw*.dylib\\\")\n    list(APPEND libs \\${asp_libs} \\${vw_libs})\n    file(GLOB bins \\\"\\${CMAKE_INSTALL_PREFIX}/bin/*\\\")\n    foreach(f IN LISTS libs bins)\n      execute_process(\n        COMMAND otool -l \\${f}\n        OUTPUT_VARIABLE otool_out ERROR_QUIET)\n      string(REGEX MATCHALL \\\"path [^\\n]*[^ ]*conda[^ ]*/envs/[^\\n]*/lib \\\"\n             matches \\\"\\${otool_out}\\\")\n      list(LENGTH matches count)\n      if (count GREATER 1)\n        string(REGEX MATCH \\\"[^ ]*conda[^ ]*/envs/[^/]*/lib\\\" rpath \\\"\\${matches}\\\")\n        execute_process(\n          COMMAND install_name_tool -delete_rpath \\${rpath} \\${f}\n          ERROR_QUIET)\n        execute_process(\n          COMMAND codesign --force --sign - \\${f}\n          ERROR_QUIET)\n      endif()\n    endforeach()\n  \")\nendif()\n\n"
  },
  {
    "path": "src/asp/Camera/ASTER_XML.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2024, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <vw/Core/Exception.h>          // for ArgumentErr, vw_throw, etc\n#include <vw/Math/Quaternion.h>         // for Quat, Quaternion\n#include <vw/Math/Vector.h>             // for Vector, Vector3, Vector4, etc\n#include <vw/Cartography/Datum.h>       // for Datum\n#include <vw/FileIO/DiskImageResourceGDAL.h>\n\n#include <asp/Core/FileUtils.h>\n#include <asp/Camera/XMLBase.h>\n#include <asp/Camera/ASTER_XML.h>\n#include <asp/Camera/RPCModel.h>\n\n#include <xercesc/parsers/XercesDOMParser.hpp>\n#include <xercesc/sax/HandlerBase.hpp>\n#include <xercesc/sax/SAXException.hpp>\n#include <xercesc/sax/SAXParseException.hpp>\n#include <xercesc/dom/DOMException.hpp>\n#include <xercesc/util/PlatformUtils.hpp>\n#include <xercesc/sax/ErrorHandler.hpp>\n\n#include <boost/algorithm/string/predicate.hpp>\n#include <boost/filesystem.hpp>\n#include <boost/lexical_cast.hpp>\n#include <iomanip>\n\nusing namespace vw;\nusing namespace vw::cartography;\nusing namespace xercesc;\n\nusing asp::XmlUtils::get_node;\nusing asp::XmlUtils::cast_xmlch;\n\nnamespace asp {\n\nDOMElement* ASTERXML::open_xml_file(std::string const& xml_path) {\n\n  // Check if the file actually exists and throw a user helpful file.\n  if (!boost::filesystem::exists(xml_path))\n    vw_throw(ArgumentErr() << \"XML file \\\"\" << xml_path << \"\\\" does not exist.\");\n\n  std::string error_prefix = \"XML file \\\"\" + xml_path + \"\\\" is invalid.\\nException message is: \\n\";\n  std::string err_message  = \"\"; // Filled in later on error\n\n  try{\n    //std::cout << \"Set XML parser\\n\";\n\n    // Set up the XML parser if we have not already done so\n    if (!m_parser.get()) {\n      m_parser.reset(new XercesDOMParser());\n      m_errHandler.reset(new HandlerBase());\n      m_parser->setValidationScheme(XercesDOMParser::Val_Always);\n      m_parser->setDoNamespaces(true);\n      m_parser->setErrorHandler(m_errHandler.get());\n    }\n\n    //std::cout << \"Load XML\\n\";\n\n    // Load the XML file\n    m_parser->parse(xml_path.c_str());\n    DOMDocument* xmlDoc      = m_parser->getDocument();\n    DOMElement * elementRoot = xmlDoc->getDocumentElement();\n    return elementRoot;\n\n  } catch (const XMLException& toCatch) {\n    char* message = XMLString::transcode(toCatch.getMessage());\n    err_message = error_prefix + message;\n    XMLString::release(&message);\n  } catch (const DOMException& toCatch) {\n    char* message = XMLString::transcode(toCatch.msg);\n    err_message = error_prefix + message;\n    XMLString::release(&message);\n  } catch (const SAXException& toCatch) {\n    char* message = XMLString::transcode(toCatch.getMessage());\n    err_message = error_prefix + message;\n    XMLString::release(&message);\n  } catch (const std::exception& e) {\n    err_message = error_prefix + e.what();\n  } catch (...) {\n    err_message = \"Unrecognized error in XML file \\\"\" + xml_path + \"\\\"\\n\";\n  }\n  vw_throw(ArgumentErr() << err_message); // Only get here on error\n  return 0;\n}\n\nvoid ASTERXML::read_xml(std::string const& xml_path) {\n\n  DOMElement * elementRoot = open_xml_file(xml_path);\n  parse_xml(elementRoot);\n}\n\nvoid ASTERXML::parse_xml(xercesc::DOMElement* node) {\n\n  xercesc::DOMElement* lattice_point_node = get_node<DOMElement>(node, \"LATTICE_POINT\");\n  std::string lattice_point_txt(XMLString::transcode(lattice_point_node->getTextContent()));\n  asp::read_matrix_from_string(lattice_point_txt, m_lattice_mat);\n\n  xercesc::DOMElement* sight_vector_node = get_node<DOMElement>(node, \"SIGHT_VECTOR\");\n  std::string sight_vector_txt(XMLString::transcode(sight_vector_node->getTextContent()));\n  asp::read_matrix_from_string(sight_vector_txt, m_sight_mat);\n  if (m_lattice_mat.empty() || m_sight_mat.empty()  ||\n      m_lattice_mat.size()  != m_sight_mat.size()   ||\n      m_lattice_mat[0].size() != m_sight_mat[0].size()) {\n    vw_throw(ArgumentErr()\n             << \"Inconsistent lattice point and sight vector information.\\n\");\n  }\n\n  xercesc::DOMElement* world_sight_vector_node = get_node<DOMElement>(node, \"WORLD_SIGHT_VECTOR\");\n  std::string world_sight_vector_txt(XMLString::transcode(world_sight_vector_node->getTextContent()));\n  asp::read_matrix_from_string(world_sight_vector_txt, m_world_sight_mat);\n  if (m_lattice_mat.empty()   || m_world_sight_mat.empty()  ||\n      m_lattice_mat.size()    != m_world_sight_mat.size()   ||\n      m_lattice_mat[0].size() != m_world_sight_mat[0].size()) {\n    vw_throw(ArgumentErr()\n             << \"Inconsistent lattice point and world sight vector information.\\n\");\n  }\n\n  std::vector<std::vector<vw::Vector3>> sat_pos_mat;\n  xercesc::DOMElement* sat_pos_node = get_node<DOMElement>(node, \"SAT_POS\");\n  std::string sat_pos_txt(XMLString::transcode(sat_pos_node->getTextContent()));\n  asp::read_matrix_from_string(sat_pos_txt, sat_pos_mat);\n  m_sat_pos = sat_pos_mat[0]; // Go from matrix with one row to a vector\n\n  if (m_sat_pos.size() != m_sight_mat.size())\n    vw_throw(ArgumentErr() << \"Inconsistent satellite position and sight vector information.\\n\");\n  if (m_sat_pos.size() != m_world_sight_mat.size())\n    vw_throw(ArgumentErr() << \"Inconsistent satellite position and world \"\n\t      << \"sight vector information.\\n\");\n\n  xercesc::DOMElement* cols_node = get_node<DOMElement>(node, \"IMAGE_COLS\");\n  std::string cols_txt(XMLString::transcode(cols_node->getTextContent()));\n  int cols = atoi(cols_txt.c_str());\n\n  xercesc::DOMElement* rows_node = get_node<DOMElement>(node, \"IMAGE_ROWS\");\n  std::string rows_txt(XMLString::transcode(rows_node->getTextContent()));\n  int rows = atoi(rows_txt.c_str());\n\n  m_image_size = vw::Vector2i(cols, rows);\n}\n\n} // end namespace asp\n\n\n"
  },
  {
    "path": "src/asp/Camera/ASTER_XML.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n// These are objects that relate directly to block in XML that we need\n// to read. They only read and then store the raw values. Other\n// objects will interpret the results.\n\n#ifndef __STEREO_CAMERA_ASTER_XML_H__\n#define __STEREO_CAMERA_ASTER_XML_H__\n\n#include <vw/Core/FundamentalTypes.h>\n#include <vw/Core/Log.h>\n#include <vw/Math/Vector.h>\n#include <vw/Math/Matrix.h>\n#include <vw/Math/Quaternion.h>\n#include <vw/Math/BBox.h>\n\n#include <vector>\n#include <string>\n\n#include <boost/smart_ptr/shared_ptr.hpp>\n\n// Special forward declare so we can hide the Xerces headers.\n#include <xercesc/util/XercesDefs.hpp> // Needed for this XERCES macro\nXERCES_CPP_NAMESPACE_BEGIN\n  class DOMDocument;\n  class DOMElement;\n  class XercesDOMParser;\n  class ErrorHandler;\nXERCES_CPP_NAMESPACE_END\n\nnamespace asp {\n\n  class ASTERXML {\n  public:\n  \n    /// Constructor\n    /// - Sets the fixed reference time.\n    ASTERXML(){}\n\n    // The reader will populate these fields\n    std::vector< std::vector<vw::Vector2>> m_lattice_mat;\n    std::vector< std::vector<vw::Vector3>> m_sight_mat;\n    std::vector< std::vector<vw::Vector3>> m_world_sight_mat;\n    std::vector<vw::Vector3>               m_sat_pos;\n    vw::Vector2i                           m_image_size;\n    \n    /// Parse an XML file to populate the data\n    void read_xml(std::string const& xml_path);\n    \n    /// Parse an XML tree to populate the data\n    void parse_xml(xercesc::DOMElement* node);\n\n  private: // The various XML data reading sections\n  \n    /// Just opens the XML file for reading and returns the root node.\n    xercesc::DOMElement* open_xml_file(std::string const& xml_path);\n  \n    boost::shared_ptr<xercesc::XercesDOMParser> m_parser;\n    boost::shared_ptr<xercesc::ErrorHandler>    m_errHandler;\n\n  }; // End class ASTERXML\n\n\n} //end namespace asp\n\n#endif//__STEREO_CAMERA_ASTER_XML_H__\n"
  },
  {
    "path": "src/asp/Camera/BaParams.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file BaParams.cc\n///\n\n#include <asp/Camera/BaParams.h>\n\n#include <vw/Cartography/Datum.h>\n#include <vw/FileIO/KML.h>\n#include <vw/Core/Log.h>\n#include <vw/BundleAdjustment/ControlNetwork.h>\n\n#include <boost/random/mersenne_twister.hpp>\n#include <boost/random/uniform_int_distribution.hpp>\n\n#include <fstream>\n\nnamespace {\n   // A global random generator, to avoid having this as class member\n   boost::random::mt19937 g_rand_gen;\n}\n\nnamespace asp {\n\nIntrinsicOptions::IntrinsicOptions():\n  center_shared(true), focus_shared(true), distortion_shared(true),\n  share_intrinsics_per_sensor(false), num_sensors(0) {}\n\n// Control per each group of cameras or for all cameras which intrinsics\n// should be floated.\nbool IntrinsicOptions::float_optical_center(int cam_index) const {\n  // When sharing intrinsics per sensor, each sensor's float behavior is independent\n  int sensor_id = 0;\n  if (share_intrinsics_per_sensor)\n    sensor_id = cam2sensor.at(cam_index);\n\n  return float_center[sensor_id];\n}\n\nbool IntrinsicOptions::float_focal_length(int cam_index) const {\n  // When sharing intrinsics per sensor, each sensor's float behavior is independent\n  int sensor_id = 0;\n  if (share_intrinsics_per_sensor)\n    sensor_id = cam2sensor.at(cam_index);\n\n  return float_focus[sensor_id];\n}\n\nbool IntrinsicOptions::float_distortion_params(int cam_index) const {\n  // When sharing intrinsics per sensor, each sensor's float behavior is independent\n  int sensor_id = 0;\n  if (share_intrinsics_per_sensor)\n    sensor_id = cam2sensor.at(cam_index);\n\n  return float_distortion[sensor_id];\n}\n\n// BaParams constructor\nBaParams::BaParams(int num_points, int num_cameras,\n          // Parameters below here only apply to pinhole models.\n          bool using_intrinsics,\n          int max_num_dist_params,\n          IntrinsicOptions intrinsics_opts):\n    m_num_points        (num_points),\n    m_num_cameras       (num_cameras),\n    m_params_per_point  (PARAMS_PER_POINT),\n    m_num_pose_params   (NUM_CAMERA_PARAMS),\n    m_num_shared_intrinsics    (0),\n    m_num_intrinsics_per_camera(0),\n    m_max_num_dist_params(max_num_dist_params),\n    m_focus_offset(0),\n    m_distortion_offset(0),\n    m_intrinsics_opts    (intrinsics_opts),\n    m_points_vec        (num_points * PARAMS_PER_POINT,  0),\n    m_cameras_vec       (num_cameras * NUM_CAMERA_PARAMS, 0),\n    m_intrinsics_vec    (0),\n    m_outlier_points_vec(num_points, false) {\n\n    if (!using_intrinsics)\n      return; // If we are not using intrinsics, nothing else to do.\n\n    // Calculate how many values are stored per-camera, and\n    //  what the offset is to a particular intrinsic value.\n    // - The start of the array is always an entry for each intrinsic in case\n    //   it is shared.\n    // The logic is very different when intrinsics are shared per sensor,\n    // rather than not shared at all or all shared.\n    // TODO(oalexan1): Integrate this logic.\n    if (!intrinsics_opts.share_intrinsics_per_sensor) {\n      if (!intrinsics_opts.center_shared)\n        m_num_intrinsics_per_camera += NUM_CENTER_PARAMS;\n      if (intrinsics_opts.focus_shared)\n        m_focus_offset = NUM_CENTER_PARAMS;\n      else {\n        m_num_intrinsics_per_camera += NUM_FOCUS_PARAMS;\n        if (!intrinsics_opts.center_shared)\n          m_focus_offset = NUM_CENTER_PARAMS;\n      }\n      if (intrinsics_opts.distortion_shared)\n        m_distortion_offset = NUM_CENTER_PARAMS + NUM_FOCUS_PARAMS;\n      else {\n        m_num_intrinsics_per_camera += max_num_dist_params;\n        if (!intrinsics_opts.center_shared)\n          m_distortion_offset += NUM_CENTER_PARAMS;\n        if (!intrinsics_opts.focus_shared)\n          m_distortion_offset += NUM_FOCUS_PARAMS;\n      }\n\n      // For simplicity, we always set this to the same size and allocate\n      // the same storage even if none of the parameters are shared.\n      m_num_shared_intrinsics = NUM_CENTER_PARAMS + NUM_FOCUS_PARAMS\n                                + max_num_dist_params;\n      m_intrinsics_vec.resize(m_num_shared_intrinsics +\n                              num_cameras*m_num_intrinsics_per_camera,\n                              0); // Initialize to 0\n    } else {\n      m_num_intrinsics_per_camera = NUM_CENTER_PARAMS + NUM_FOCUS_PARAMS\n                                    + max_num_dist_params;\n      m_intrinsics_vec.resize(intrinsics_opts.num_sensors * m_num_intrinsics_per_camera,\n                              0); // Initialize to 0\n    }\n  }\n\n// Copy constructor\nBaParams::BaParams(BaParams const& other):\n      m_num_points        (other.m_num_points),\n      m_num_cameras       (other.m_num_cameras),\n      m_params_per_point  (other.m_params_per_point),\n      m_num_pose_params   (other.m_num_pose_params),\n      m_num_shared_intrinsics    (other.m_num_shared_intrinsics),\n      m_num_intrinsics_per_camera(other.m_num_intrinsics_per_camera),\n      m_max_num_dist_params(other.m_max_num_dist_params),\n      m_focus_offset      (other.m_focus_offset),\n      m_distortion_offset (other.m_distortion_offset),\n      m_intrinsics_opts    (other.m_intrinsics_opts),\n      m_points_vec        (other.m_points_vec.size()),\n      m_cameras_vec       (other.m_cameras_vec.size()),\n      m_intrinsics_vec    (other.m_intrinsics_vec.size()),\n      m_outlier_points_vec(other.m_outlier_points_vec.size()) {\n    copy_points    (other);\n    copy_cameras   (other);\n    copy_intrinsics(other);\n    copy_outliers  (other);\n  }\n\n// Set all camera position and pose values to zero.\nvoid BaParams::init_cams_as_zero() {\n  for (int i = 0; i < m_cameras_vec.size(); i++)\n    m_cameras_vec[i] = 0.0;\n}\n\n// When using the copy functions, the sizes must match!\n/// Copy one set of values from another instance.\nvoid BaParams::copy_points(BaParams const& other) {\n  for (size_t i = 0; i < m_points_vec.size(); i++)\n    m_points_vec[i] = other.m_points_vec[i];\n}\nvoid BaParams::copy_cameras(BaParams const& other) {\n  for (size_t i = 0; i < m_cameras_vec.size(); i++)\n    m_cameras_vec[i] = other.m_cameras_vec[i];\n}\nvoid BaParams::copy_intrinsics(BaParams const& other) {\n  for (size_t i = 0; i < m_intrinsics_vec.size(); i++)\n    m_intrinsics_vec[i] = other.m_intrinsics_vec[i];\n}\nvoid BaParams::copy_outliers(BaParams const& other) {\n  for (size_t i = 0; i < m_outlier_points_vec.size(); i++)\n    m_outlier_points_vec[i] = other.m_outlier_points_vec[i];\n}\n\n// Compute the offset in m_intrinsics_vec to the requested data\nsize_t BaParams::get_center_offset(int cam_index) const {\n  if (!m_intrinsics_opts.share_intrinsics_per_sensor) {\n    // Share all or none of the intrinsics\n    if (m_intrinsics_opts.center_shared)\n      return 0;\n    else\n      return m_num_shared_intrinsics + cam_index*m_num_intrinsics_per_camera;\n  }\n\n  // Share intrinsics per sensor\n  int sensor_id = m_intrinsics_opts.cam2sensor.at(cam_index);\n  return sensor_id * m_num_intrinsics_per_camera;\n}\n\nsize_t BaParams::get_focus_offset(int cam_index) const {\n  if (!m_intrinsics_opts.share_intrinsics_per_sensor) {\n    // Share all or none of the intrinsics\n    if (m_intrinsics_opts.focus_shared)\n      return m_focus_offset;\n    else\n      return m_num_shared_intrinsics + cam_index*m_num_intrinsics_per_camera + m_focus_offset;\n  }\n\n  // Share intrinsics per sensor\n  int sensor_id = m_intrinsics_opts.cam2sensor.at(cam_index);\n  return sensor_id * m_num_intrinsics_per_camera + NUM_CENTER_PARAMS;\n}\n\nsize_t BaParams::get_distortion_offset(int cam_index) const {\n  if (!m_intrinsics_opts.share_intrinsics_per_sensor) {\n    // Share all or none of the intrinsics\n    if (m_intrinsics_opts.distortion_shared)\n      return m_distortion_offset;\n    else\n      return m_num_shared_intrinsics + cam_index*m_num_intrinsics_per_camera +\n              m_distortion_offset;\n  }\n\n  // Share intrinsics per sensor\n  int sensor_id = m_intrinsics_opts.cam2sensor.at(cam_index);\n  return sensor_id * m_num_intrinsics_per_camera + NUM_CENTER_PARAMS + NUM_FOCUS_PARAMS;\n}\n\n/// Apply a random offset to each camera position.\nvoid BaParams::randomize_cameras() {\n  // These are stored as x,y,z, axis_angle.\n  // - We move the position +/- 5 meters.\n  // - Currently we don't adjust the angle.\n  boost::random::uniform_int_distribution<> xyz_dist(0, 10);\n  const size_t NUM_CAMERA_PARAMS = 6;\n  VW_ASSERT((m_cameras_vec.size() % NUM_CAMERA_PARAMS) == 0,\n            vw::LogicErr() << \"Camera parameter length is not a multiple of 6!\");\n  const size_t num_cameras = m_cameras_vec.size() / NUM_CAMERA_PARAMS;\n  for (size_t c = 0; c < num_cameras; c++) {\n    double* ptr = get_camera_ptr(c);\n    for (size_t i = 0; i < 3; i++) {\n      int diff = xyz_dist(g_rand_gen) - 5;\n      ptr[i] += diff;\n    }\n  }\n}\n\n/// Randomly scale each intrinsic value.\nvoid BaParams::randomize_intrinsics(std::vector<double> const& intrinsic_limits) {\n  // Intrinsic values are stored as multipliers, here we \n  //  multiply from 0.5 to 1.5, being careful about shared and constant values.\n  // - If intrinsic limits are specified, use that range instead.\n  boost::random::uniform_int_distribution<> dist(0, 100);\n  const double DENOM = 100.0;\n  const double DEFAULT_MIN   = 0.5;\n  const double DEFAULT_MAX   = 1.5;\n  const double DEFAULT_RANGE = DEFAULT_MAX - DEFAULT_MIN;\n\n  const size_t num_intrinsics = intrinsic_limits.size() / 2;\n  float percent, scale, range = 0;\n  // Iterate over cameras\n  for (size_t c = 0; c < num_cameras(); c++) {\n    size_t intrinsics_index = 0;\n    if (m_intrinsics_opts.float_focal_length(c) &&\n        !(m_intrinsics_opts.focus_shared && (c>0))) {\n      double* ptr = get_intrinsic_focus_ptr(c);\n      for (int i = 0; i < NUM_FOCUS_PARAMS; i++) {\n        percent = static_cast<double>(dist(g_rand_gen))/DENOM;\n        if (intrinsics_index < num_intrinsics) {\n          range = intrinsic_limits[2*intrinsics_index+1] - intrinsic_limits[2*intrinsics_index];\n          scale = percent*range + intrinsic_limits[2*intrinsics_index];\n        } else\n          scale = percent*DEFAULT_RANGE + DEFAULT_MIN;\n        ptr[i] *= scale;\n        ++intrinsics_index;\n      }\n    } // End focus case\n    intrinsics_index = NUM_FOCUS_PARAMS; // In case we did not go through the loop\n    if (m_intrinsics_opts.float_optical_center(c) &&\n        !(m_intrinsics_opts.center_shared && (c>0))) {\n      double* ptr = get_intrinsic_center_ptr(c);\n      for (int i = 0; i < NUM_CENTER_PARAMS; i++) {\n        percent = static_cast<double>(dist(g_rand_gen))/DENOM;\n        if (intrinsics_index < num_intrinsics) {\n          range = intrinsic_limits[2*intrinsics_index+1]\n            - intrinsic_limits[2*intrinsics_index];\n          scale = percent*range + intrinsic_limits[2*intrinsics_index];\n        } else\n          scale = percent*DEFAULT_RANGE + DEFAULT_MIN;\n        ptr[i] *= scale;\n        ++intrinsics_index;\n      }\n    } // End center case\n    intrinsics_index = NUM_FOCUS_PARAMS+NUM_CENTER_PARAMS; // In case we did not go through the loops\n    if (m_intrinsics_opts.float_distortion_params(c) &&\n        !(m_intrinsics_opts.distortion_shared && (c > 0))) {\n      double* ptr = get_intrinsic_distortion_ptr(c);\n      for (int i = 0; i < m_max_num_dist_params; i++) {\n        percent = static_cast<double>(dist(g_rand_gen))/DENOM;\n        if (intrinsics_index < num_intrinsics) {\n          range = intrinsic_limits[2*intrinsics_index+1] - intrinsic_limits[2*intrinsics_index];\n          scale = percent*range + intrinsic_limits[2*intrinsics_index];\n        } else\n          scale = percent*DEFAULT_RANGE + DEFAULT_MIN;\n        ptr[i] *= scale;\n        intrinsics_index++;\n      }\n    } // End distortion case\n  } // End camera loop\n}\n\n/// Print stats for optimized ground control points.\nvoid BaParams::print_gcp_stats(std::string const& out_prefix,\n                       vw::ba::ControlNetwork const& cnet,\n                       vw::cartography::Datum const& d) const {\n\n  std::string gcp_report = out_prefix + \"-gcp-report.txt\";\n  vw::vw_out() << \"Writing: \" << gcp_report << std::endl;\n\n  std::ofstream gfs(gcp_report.c_str());\n  gfs.precision(17);\n\n  gfs << \"# Ground control point report\\n\";\n  // TODO(oalexan1): Print this to report file! Compare with existing report!\n  gfs << \"# input_gcp optimized_gcp diff\\n\";\n\n  int gcp_count = 0;\n  for (int ipt = 0; ipt < num_points(); ipt++) {\n\n    if (cnet[ipt].type() != vw::ba::ControlPoint::GroundControlPoint)\n      continue;\n\n    if (get_point_outlier(ipt))\n      continue; // skip outliers\n\n    vw::Vector3 input_gcp = cnet[ipt].position();\n    vw::Vector3 opt_gcp   = get_point(ipt);\n\n    gfs << \"GCP count: \" << gcp_count << std::endl;\n    gfs << \"ECEF: \" << input_gcp << ' ' << opt_gcp << ' '\n        << input_gcp - opt_gcp << std::endl;\n\n    // Now convert to llh\n    input_gcp = d.cartesian_to_geodetic(input_gcp);\n    opt_gcp   = d.cartesian_to_geodetic(opt_gcp);\n\n    gfs << \"Lon-lat-height: \" << input_gcp << ' ' << opt_gcp << ' '\n       << input_gcp - opt_gcp << std::endl;\n    gfs << \"\\n\";\n    gcp_count++;\n  }\n  gfs.close();\n}\n\nvoid BaParams::record_points_to_kml(const std::string &kml_path,\n                            const vw::cartography::Datum& datum,\n                            size_t skip, const std::string name) {\n\n  if (datum.name() == asp::UNSPECIFIED_DATUM) {\n    vw::vw_out(vw::WarningMessage) << \"No datum specified. Cannot write file: \"\n                                   << kml_path << std::endl;\n    return;\n  }\n\n  // Open the file\n  vw::vw_out() << \"Writing: \" << kml_path << std::endl;\n  vw::KMLFile kml(kml_path, name);\n\n  // Set up a simple point icon with no labels\n  const std::string icon\n    = \"http://maps.google.com/mapfiles/kml/shapes/placemark_circle.png\";\n  const bool hide_labels = true;\n  kml.append_style(\"point\", \"\", 1.0, icon, hide_labels);\n  kml.append_style(\"point_highlight\", \"\", 1.1, icon, hide_labels);\n  kml.append_stylemap(\"point_placemark\", \"point\",\n                       \"point_highlight\");\n\n  // Loop through the points\n  const bool extrude = true;\n  for (size_t i = 0; i < num_points(); i += skip) {\n\n    if (get_point_outlier(i))\n      continue; // skip outliers\n\n    // Convert the point to GDC coords\n    vw::Vector3 xyz         = get_point(i);\n    vw::Vector3 lon_lat_alt = datum.cartesian_to_geodetic(xyz);\n\n    // Add this to the output file\n    kml.append_placemark(lon_lat_alt.x(), lon_lat_alt.y(), \"\", \"\", \"point_placemark\",\n                         lon_lat_alt[2], extrude);\n  }\n  kml.close_kml();\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Camera/BaParams.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file BaParams.h\n///\n\n#ifndef __ASP_CAMERA_BA_PARAMS_H__\n#define __ASP_CAMERA_BA_PARAMS_H__\n\n#include <asp/Core/BaBaseOptions.h>\n#include <vw/Math/Vector.h>\n\nnamespace vw {\n  namespace cartography {\n    class Datum;\n  }\n  namespace ba {\n    class ControlNetwork;\n  }\n}\n\n#include <string>\n#include <vector>\n\nnamespace asp {\n\n// Shared constants\nconst int PARAMS_PER_POINT  = 3;\nconst int NUM_CAMERA_PARAMS = 6; // Position and pose\nconst int NUM_CENTER_PARAMS = 2; // TODO(oalexan1): Use this more widely\nconst int NUM_FOCUS_PARAMS  = 1;\nconst int NUM_OPTICAL_BAR_EXTRA_PARAMS = 9; // Stored in the distortion vector\n\n/// Structure to fully describe how the intrinsics are being handled.\n/// - Currently only pinhole cameras support intrinsics in bundle_adjust.\nstruct IntrinsicOptions {\n  \n  // If to share these intrinsics. Can be per group of cameras or for all cameras.\n  bool center_shared;\n  bool focus_shared;\n  bool distortion_shared;\n  \n  // If to float these intrinsics. All, none, or per sensor\n  std::vector<bool> float_center, float_focus, float_distortion;\n  \n  bool share_intrinsics_per_sensor;\n  std::vector<int> cam2sensor; // cam index to sensor index, when sharing intrinsics per sensor\n  int num_sensors; // will be nonzero only if sharing intrinsics per sensor is true\n  IntrinsicOptions();\n\n  // Control per each group of cameras or for all cameras which intrinsics\n  // should be floated.\n  bool float_optical_center(int cam_index) const;\n  bool float_focal_length(int cam_index) const;\n  bool float_distortion_params(int cam_index) const;\n};\n\n/// Class to store parameters as they are being bundle adjusted.\n/// - Currently only supports either one camera or all unique cameras.\nclass BaParams {\n\npublic:\n\n  // Constructor\n  BaParams(int num_points, int num_cameras,\n          // Parameters below here only apply to pinhole models.\n          bool using_intrinsics = false,\n          int max_num_dist_params = 0,\n          IntrinsicOptions intrinsics_opts = IntrinsicOptions()); \n\n  // Copy constructor\n  BaParams(asp::BaParams const& other);\n\n  // Set all camera position and pose values to zero.\n  void init_cams_as_zero();\n\n  // When using the copy functions, the sizes must match!\n  /// Copy one set of values from another instance.\n  void copy_points(asp::BaParams const& other);\n  void copy_cameras(asp::BaParams const& other);\n  void copy_intrinsics(asp::BaParams const& other);\n  void copy_outliers(asp::BaParams const& other);\n\n  /// Apply a random offset to each camera position.\n  void randomize_cameras();\n\n  /// Randomly scale each intrinsic value.\n  void randomize_intrinsics(std::vector<double> const& intrinsic_limits);\n  \n  int num_points       () const {return m_num_points; }\n  int num_cameras      () const {return m_num_cameras;}\n  int num_intrinsics_per_camera() const {return m_num_intrinsics_per_camera;}\n  int params_per_point () const {return m_params_per_point;}\n  int params_per_camera() const {return m_num_pose_params;}\n\n  std::vector<double> & get_point_vector() {\n    return m_points_vec;\n  }\n  std::vector<double> & get_camera_vector() {\n    return m_cameras_vec;\n  }\n  std::vector<double> & get_intrinsics_vector() {\n    return m_intrinsics_vec;\n  }\n  \n  double* get_point_ptr(int point_index) {\n    return &(m_points_vec[point_index*m_params_per_point]);\n  }\n  double const* get_point_ptr(int point_index) const {\n    return &(m_points_vec[point_index*m_params_per_point]);\n  }\n  \n  double* get_camera_ptr(int cam_index) {\n    return &(m_cameras_vec[cam_index*m_num_pose_params]);\n  }\n  double const* get_camera_ptr(int cam_index) const {\n    return &(m_cameras_vec[cam_index*m_num_pose_params]);\n  }\n\n  // These functions are only needed when solving for intrinsics\n  double* get_intrinsic_center_ptr(int cam_index) {\n    if (m_intrinsics_vec.empty()) return 0;\n    return &(m_intrinsics_vec[get_center_offset(cam_index)]);\n  }\n  double const* get_intrinsic_center_ptr(int cam_index) const {\n    if (m_intrinsics_vec.empty()) return 0;\n    return &(m_intrinsics_vec[get_center_offset(cam_index)]);\n  }\n  \n  double* get_intrinsic_focus_ptr(int cam_index) {\n    if (m_intrinsics_vec.empty()) return 0;\n    return &(m_intrinsics_vec[get_focus_offset(cam_index)]);\n  }\n  double const* get_intrinsic_focus_ptr(int cam_index) const{\n    if (m_intrinsics_vec.empty()) return 0;\n    return &(m_intrinsics_vec[get_focus_offset(cam_index)]);\n  }\n\n  double* get_intrinsic_distortion_ptr(int cam_index) {\n    if (m_intrinsics_vec.empty()) return 0;\n    return &(m_intrinsics_vec[get_distortion_offset(cam_index)]);\n  }\n  double const* get_intrinsic_distortion_ptr(int cam_index) const{\n    if (m_intrinsics_vec.empty()) return 0;\n    return &(m_intrinsics_vec[get_distortion_offset(cam_index)]);\n  }\n  \n  // End functions needed when solving for intrinsics\n  \n  void set_point_outlier(int point_index, bool status) {\n    m_outlier_points_vec[point_index] = status;\n  }\n  bool get_point_outlier(int point_index) const {\n    return m_outlier_points_vec[point_index];\n  }\n\n  /// Return the number of points flagged as outliers.\n  int get_num_outliers() const {\n    int count = 0;\n    for (size_t i = 0; i < m_num_points; i++) {\n      if (m_outlier_points_vec[i])\n        ++count;\n    }\n    return count;\n  }\n  \n  /// Get the values for a point\n  vw::Vector3 get_point(int point_index)  const{\n    double const* ptr = get_point_ptr(point_index);\n    vw::Vector3 pt;\n    for (int i = 0; i < 3; i++)\n      pt[i] = ptr[i];\n    return pt;\n  }\n  \n  /// Update the values for a point\n  void set_point(int point_index, vw::Vector3 const& pt) {\n    double* ptr = get_point_ptr(point_index);\n    for (int i = 0; i < 3; i++)\n      ptr[i] = pt[i];\n  }\n\n  /// Print stats for optimized ground control points.\n  void print_gcp_stats(std::string const& out_prefix, \n                       vw::ba::ControlNetwork const& cnet,\n                       vw::cartography::Datum const& d) const;\n\n  /// Create a KML file containing the positions of the given points.\n  /// - Points are stored as x,y,z in the points vector up to num_points.\n  /// - Only every skip'th point is recorded to the file.\n  void record_points_to_kml(const std::string &kml_path,\n                            const vw::cartography::Datum& datum,\n                            size_t skip, const std::string name);\n\n  /// Compute the offset index in the intrinsics\n  size_t get_center_offset(int cam_index) const;\n  size_t get_focus_offset(int cam_index) const;\n  size_t get_distortion_offset(int cam_index) const;\n\n  // Not much of a point of having set/get functions for this one\n  int m_max_num_dist_params;\n  \nprivate: // Variables\n\n  int m_num_points, m_num_cameras, m_params_per_point, m_num_pose_params;\n  \n  // m_intrinsics_vec starts out with m_num_shared_intrinsics values which are\n  //  shared between all cameras, followed by the per-camera intrinsics for each camera.\n  int m_num_shared_intrinsics, m_num_intrinsics_per_camera;\n  \n  // These store the offset to the focus or distortion data from the start of\n  //  either the shared parameters at the start of m_intrinsics_vec or from\n  //  the block of intrinsics data for the specified camera.\n  int m_focus_offset, m_distortion_offset;\n  \n  IntrinsicOptions m_intrinsics_opts;\n  \n  // Raw data storage\n  std::vector<double> m_points_vec, m_cameras_vec, m_intrinsics_vec;\n  std::vector<bool> m_outlier_points_vec;\n}; // End class BaParams\n\n} // end namespace asp\n\n#endif // __ASP_CAMERA_BA_PARAMS_H__\n"
  },
  {
    "path": "src/asp/Camera/BaseCostFuns.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Cost functions used in bundle adjustment. These need access to the camera\n// models, so they are stored in the Camera folder.\n\n#include <asp/Camera/BaseCostFuns.h>\n\nnamespace asp {\n\n// Factory to hide the construction of the CostFunction object from\n// the client code.\nceres::CostFunction* LLHError::Create(vw::Vector3            const& observation_xyz,\n                                      vw::Vector3            const& sigma,\n                                      vw::cartography::Datum const& datum) {\n  return (new ceres::NumericDiffCostFunction<LLHError, ceres::CENTRAL, 3, 3>\n          (new LLHError(observation_xyz, sigma, datum)));\n}\n\nbool LLHError::operator()(const double* point, double* residuals) const {\n  vw::Vector3 observation_llh, point_xyz, point_llh;\n  for (size_t p = 0; p < m_observation_xyz.size(); p++) {\n    point_xyz[p] = double(point[p]);\n  }\n\n  point_llh       = m_datum.cartesian_to_geodetic(point_xyz);\n  observation_llh = m_datum.cartesian_to_geodetic(m_observation_xyz);\n\n  for (size_t p = 0; p < m_observation_xyz.size(); p++) \n    residuals[p] = (point_llh[p] - observation_llh[p])/m_sigma[p]; // Input units are meters\n\n  return true;\n}\n\nCamUncertaintyError::CamUncertaintyError(vw::Vector3 const& orig_ctr, double const* orig_adj,\n                                         vw::Vector2 const& uncertainty, double weight,\n                                         vw::cartography::Datum const& datum,\n                                         double camera_position_uncertainty_power):\n  m_orig_ctr(orig_ctr), m_uncertainty(uncertainty), m_weight(weight),\n  m_camera_position_uncertainty_power(camera_position_uncertainty_power) {\n    \n  // m_weight must be positive\n  if (m_weight <= 0)\n    vw::vw_throw(vw::ArgumentErr() << \"CamUncertaintyError: Invalid weight: \"\n              << m_weight << \". It must be positive.\\n\");\n  \n  // The first three parameters are the camera center adjustments.\n  m_orig_adj = vw::Vector3(orig_adj[0], orig_adj[1], orig_adj[2]);\n\n  // The uncertainty must be positive\n  if (m_uncertainty[0] <= 0 || m_uncertainty[1] <= 0)\n    vw::vw_throw(vw::ArgumentErr() << \"CamUncertaintyError: Invalid uncertainty: \"\n              << uncertainty << \". All values must be positive.\\n\");    \n  \n  // The NED coordinate system, for separating horizontal and vertical components\n  vw::Vector3 llh = datum.cartesian_to_geodetic(orig_ctr);\n  vw::Matrix3x3 NedToEcef = datum.lonlat_to_ned_matrix(llh);\n  m_EcefToNed = vw::math::inverse(NedToEcef);\n}\n\n// The signed power is a better-behaved version of pow that respects the sign of the input.\ndouble signed_power(double val, double power) {\n  if (val < 0)\n    return -pow(-val, power);\n  return pow(val, power);\n}\n\nbool CamUncertaintyError::operator()(const double* cam_adj, double* residuals) const {\n  \n  // The difference between the original and current camera center\n  vw::Vector3 diff;\n  for (size_t p = 0; p < 3; p++)\n    diff[p] = cam_adj[p] - m_orig_adj[p];\n  \n  // Convert the difference to NED\n  vw::Vector3 NedDir = m_EcefToNed * diff;\n  \n  // Split into horizontal and vertical components\n  vw::Vector2 horiz = subvector(NedDir, 0, 2);\n  double      vert  = NedDir[2];\n  \n  // Normalize by uncertainty\n  horiz /= m_uncertainty[0];\n  vert  /= m_uncertainty[1];\n  \n\n  double p = m_camera_position_uncertainty_power / 2.0;\n  \n  // Regular sum of squares, by default, which corresponds to p above being 1.\n  // Multiply by sqrt(m_weight), to give the squared residual the correct\n  // weight. This was shown to work to work better than a more abrupt function.\n  if (p == 1.0) {\n    residuals[0] = sqrt(m_weight) * horiz[0];\n    residuals[1] = sqrt(m_weight) * horiz[1];\n    residuals[2] = sqrt(m_weight) * vert;\n  } else { // More general power\n    residuals[0] = sqrt(m_weight) * signed_power(horiz[0], p);\n    residuals[1] = sqrt(m_weight) * signed_power(horiz[1], p);\n    residuals[2] = sqrt(m_weight) * signed_power(vert,     p);\n  }\n  \n  return true;\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Camera/BaseCostFuns.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as XYZError2represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file BaseCostFuns.h\n\n// Cost functions shared by bundle adjustment and camera jitter estimation.\n\n#ifndef __ASP_CAMERA_BASE_COST_FUNS_H__\n#define __ASP_CAMERA_BASE_COST_FUNS_H__\n\n#include <asp/Core/BundleAdjustUtils.h>\n\n#include <ceres/ceres.h>\n#include <ceres/loss_function.h>\n\n#include <string>\n#include <vector>\n\nnamespace asp {\n\n// A triangulated point with this sigma will be declared fixed. This should be\n// positive and somewhat reasonable, as it will show up in the cost function,\n// though, in theory, it should not matter as it shows up as a term like\n// (x-x0)^2/sigma^2, with x starting as x0 and kept fixed.\nconst double FIXED_GCP_SIGMA = 1e-10;\n\n/// A ceres cost function. The residual is the difference between the\n/// observed 3D point and the current (floating) 3D point, normalized by\n/// xyz_sigma. \nstruct XYZError {\n  XYZError(vw::Vector3 const& observation, vw::Vector3 const& xyz_sigma):\n    m_observation(observation), m_xyz_sigma(xyz_sigma) {\n      bool is_good = (xyz_sigma[0] > 0 && xyz_sigma[1] > 0 && xyz_sigma[2] > 0);\n      if (!is_good) {\n        // This will also cover NaNs\n        vw::vw_throw(vw::ArgumentErr() << \"XYZError: Invalid xyz_sigma: \"\n                 << xyz_sigma << \". All values must be positive.\\n\");\n      }\n    }\n\n  template <typename T>\n  bool operator()(const T* point, T* residuals) const {\n    for (size_t p = 0; p < m_observation.size(); p++)\n      residuals[p] = (point[p] - m_observation[p])/m_xyz_sigma[p]; // Units are meters\n\n    return true;\n  }\n\n  // Factory to hide the construction of the CostFunction object from\n  // the client code.\n  static ceres::CostFunction* Create(vw::Vector3 const& observation,\n                                     vw::Vector3 const& xyz_sigma) {\n    return (new ceres::AutoDiffCostFunction<XYZError, 3, 3>\n            (new XYZError(observation, xyz_sigma)));\n  }\n\n  vw::Vector3 m_observation;\n  vw::Vector3 m_xyz_sigma;\n};\n\n/// A ceres cost function. The residual is the difference between the\n/// observed 3D point lon-lat-height, and the current (floating) 3D\n/// point lon-lat-height, normalized by sigma. Used only for\n/// ground control points. This has the advantage, unlike\n/// XYZError, that when the height is not known reliably,\n/// but lon-lat is, we can, in the GCP file, assign a bigger\n/// sigma to the latter.\nstruct LLHError {\n  LLHError(vw::Vector3 const& observation_xyz, vw::Vector3 const& sigma, \n           vw::cartography::Datum const& datum):\n    m_observation_xyz(observation_xyz), m_sigma(sigma), m_datum(datum) {}\n\n  bool operator()(const double* point, double* residuals) const;\n  \n  // Factory to hide the construction of the CostFunction object from\n  // the client code.\n  static ceres::CostFunction* Create(vw::Vector3                const& observation_xyz,\n                                     vw::Vector3                const& sigma,\n                                     vw::cartography::Datum const& datum);\n\n  vw::Vector3 m_observation_xyz;\n  vw::Vector3 m_sigma;\n  vw::cartography::Datum m_datum;\n};\n\n/// This cost function imposes a rather hard constraint on camera center\n/// horizontal and vertical motion. It does so by knowing how many reprojection\n/// errors exist for this camera and making this cost function big enough to\n/// overcome then when the motion is going out of bounds. The residual here is\n/// raised to 4th power and will be squared when added to the cost function.\n/// Two residuals are computed, for horizontal and vertical motion.\nstruct CamUncertaintyError {\n  \n  CamUncertaintyError(vw::Vector3 const& orig_ctr, double const* orig_adj,\n                      vw::Vector2 const& uncertainty, double weight,\n                      vw::cartography::Datum const& datum,\n                      double camera_position_uncertainty_power);\n    \n  bool operator()(const double* cam_adj, double* residuals) const;\n  \n  // Factory to hide the construction of the CostFunction object from\n  // the client code.\n  static ceres::CostFunction* \n    Create(vw::Vector3 const& orig_ctr, double const* orig_adj, int param_len,\n           vw::Vector2 const& uncertainty, double weight,\n           vw::cartography::Datum const& datum, \n           double camera_position_uncertainty_power) {\n    // 2 residuals and 3 translation variables. For bundle_adjust must add the\n    // rotation variables, as otherwise CERES says some params have inconsistent\n    // sizes. ceres::RIDDER works better than ceres::CENTRAL for this cost\n    // function, especially when the uncertainty is 0.1 m or less.\n    if (param_len == 3)\n     return (new ceres::NumericDiffCostFunction<CamUncertaintyError, ceres::CENTRAL, 3, 3>\n            (new CamUncertaintyError(orig_ctr, orig_adj, uncertainty, weight, \n                                     datum, camera_position_uncertainty_power)));\n    else if (param_len == 6)\n     return (new ceres::NumericDiffCostFunction<CamUncertaintyError, ceres::CENTRAL, 3, 6>\n            (new CamUncertaintyError(orig_ctr, orig_adj, uncertainty, weight, \n                                     datum, camera_position_uncertainty_power)));\n    else\n      vw::vw_throw(vw::ArgumentErr() << \"CamUncertaintyError: Invalid param_len: \"\n               << param_len << \". Must be 3 or 6.\\n\");\n  }\n\n  // orig_ctr is the original camera center, orig_cam_ptr is the original\n  // adjustment (resulting in the original center). The uncertainty is\n  // in meters.\n  vw::Vector3 m_orig_ctr;\n  vw::Vector3 m_orig_adj;\n  int m_param_len;\n  vw::Vector2 m_uncertainty;\n  double m_weight;\n  vw::Matrix3x3 m_EcefToNed;\n  double m_camera_position_uncertainty_power;\n};\n\n} // end namespace asp\n\n#endif //__ASP_CAMERA_BASE_COST_FUNS_H__\n"
  },
  {
    "path": "src/asp/Camera/BundleAdjustCamera.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file BundleAdjustCamera.cc\n///\n\n#include <asp/Camera/BundleAdjustCamera.h>\n#include <asp/Camera/CameraResectioning.h>\n#include <asp/Camera/CsmModel.h>\n#include <asp/Camera/Covariance.h>\n#include <asp/Core/IpMatchingAlgs.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/BaseCameraUtils.h>\n#include <asp/Core/ImageUtils.h>\n\n#include <vw/Image/ImageChannels.h>\n#include <vw/Math/Statistics.h>\n#include <vw/BundleAdjustment/CameraRelation.h>\n#include <vw/BundleAdjustment/ControlNetwork.h>\n#include <vw/BundleAdjustment/ControlNetworkLoader.h>\n#include <vw/Cartography/CameraBBox.h>\n#include <vw/InterestPoint/MatcherIO.h>\n#include <vw/Stereo/StereoModel.h>\n#include <vw/Math/Statistics.h>\n#include <vw/Math/Geometry.h>\n#include <vw/Math/Functors.h>\n#include <vw/Camera/OpticalBarModel.h>\n#include <vw/Camera/CameraUtilities.h>\n#include <vw/Camera/LensDistortion.h>\n\n#include <string>\n\nusing namespace vw;\nusing namespace vw::camera;\nusing namespace vw::ba;\n\nnamespace asp {\n\n/// Simple class to manage position/rotation information.\n/// - This is the data type stored in pc_align output files,\n///   bundle adjustment files, and the position of pinhole cameras.\n\n// Constructors\nCameraAdjustment::CameraAdjustment() {}\nCameraAdjustment::CameraAdjustment(double const* array) {\n  this->read_from_array(array);\n}\n\n// Data access\nvw::Vector3 CameraAdjustment::position() const { return m_position_data; }\nvw::Quat    CameraAdjustment::pose    () const { return m_pose_data;     }\n\n/// Populate from a six element array.\nvoid CameraAdjustment::read_from_array(double const* array) {\n  m_position_data = vw::Vector3(array[0], array[1], array[2]);\n  m_pose_data     = vw::math::axis_angle_to_quaternion(vw::Vector3(array[3], array[4], array[5]));\n}\n\n/// Populate from an AdjustedCameraModel\nvoid CameraAdjustment::copy_from_adjusted_camera\n  (vw::camera::AdjustedCameraModel const& cam) {\n  m_position_data = cam.translation();\n  m_pose_data     = cam.rotation();\n}\n\n/// Populate from a PinholeModel\nvoid CameraAdjustment::copy_from_pinhole(vw::camera::PinholeModel const& cam) {\n  m_position_data = cam.camera_center();\n  m_pose_data     = cam.camera_pose();\n}\n\n/// Populate from OpticalBarModel\nvoid CameraAdjustment::copy_from_optical_bar(vw::camera::OpticalBarModel const& cam) {\n  m_position_data = cam.camera_center();\n  m_pose_data     = cam.camera_pose();\n}\n\n/// Populate from CSM. Since with CSM we apply adjustments to existing\n/// cameras, these start as 0.\nvoid CameraAdjustment::copy_from_csm(asp::CsmModel const& cam) {\n  // Zero position and identity rotation\n  m_position_data = vw::Vector3(0, 0, 0);\n  vw::Matrix3x3 I;\n  I.set_identity();\n  m_pose_data = vw::Quat(I);\n}\n\n/// Populate from an adjustment file on disk.\nvoid CameraAdjustment::read_from_adjust_file(std::string const& filename) {\n\n  // Not used, just for the api\n  vw::Vector2 pixel_offset = vw::Vector2();\n  double scale = 1.0;\n\n  vw::vw_out() << \"Reading camera adjustment: \" << filename << std::endl;\n  asp::read_adjustments(filename, m_position_data, m_pose_data,\n                        pixel_offset, scale);\n}\n\n/// Pack the data to a six element array.\nvoid CameraAdjustment::pack_to_array(double* array) const {\n  vw::Vector3 pose_vec = m_pose_data.axis_angle();\n  const int VEC_SIZE = 3;\n  for (size_t i = 0; i < VEC_SIZE; i++) {\n    array[i           ] = m_position_data[i];\n    array[i + VEC_SIZE] = pose_vec[i];\n  }\n}\n\nvoid pack_pinhole_to_arrays(vw::camera::PinholeModel const& camera,\n                            int camera_index,\n                            asp::BaParams & param_storage) {\n\n  double* pos_pose_ptr   = param_storage.get_camera_ptr              (camera_index);\n  double* center_ptr     = param_storage.get_intrinsic_center_ptr    (camera_index);\n  double* focus_ptr      = param_storage.get_intrinsic_focus_ptr     (camera_index);\n  double* distortion_ptr = param_storage.get_intrinsic_distortion_ptr(camera_index);\n\n  // Handle position and pose\n  CameraAdjustment pos_pose_info;\n  pos_pose_info.copy_from_pinhole(camera);\n  pos_pose_info.pack_to_array(pos_pose_ptr);\n\n  // We are solving for multipliers to the intrinsic values, so they all start at 1.0.\n  // Center point and focal length\n  center_ptr[0] = 1.0;\n  center_ptr[1] = 1.0;\n  focus_ptr [0] = 1.0;\n  // Lens distortion\n  vw::Vector<double> lens = camera.lens_distortion()->distortion_parameters();\n  for (size_t i = 0; i < lens.size(); i++)\n    distortion_ptr[i] = 1.0;\n}\n\nvoid pack_optical_bar_to_arrays(vw::camera::OpticalBarModel const& camera,\n                                int camera_index,\n                                asp::BaParams & param_storage) {\n\n  double* pos_pose_ptr   = param_storage.get_camera_ptr              (camera_index);\n  double* center_ptr     = param_storage.get_intrinsic_center_ptr    (camera_index);\n  double* focus_ptr      = param_storage.get_intrinsic_focus_ptr     (camera_index);\n  double* intrinsics_ptr = param_storage.get_intrinsic_distortion_ptr(camera_index);\n\n  // Handle position and pose\n  CameraAdjustment pos_pose_info;\n  pos_pose_info.copy_from_optical_bar(camera);\n  pos_pose_info.pack_to_array(pos_pose_ptr);\n\n  // We are solving for multipliers to the intrinsic values, so they all start at 1.0.\n  // Center point and focal length\n  center_ptr[0] = 1.0;\n  center_ptr[1] = 1.0;\n  focus_ptr [0] = 1.0;\n  // Pack the speed, MCF, and scan time into the distortion pointer.\n  for (size_t i = 0; i < asp::NUM_OPTICAL_BAR_EXTRA_PARAMS; i++)\n    intrinsics_ptr[i] = 1.0;\n}\n\n// This does not copy the camera position and orientation\nvoid pack_csm_to_arrays(asp::CsmModel const& camera,\n                        int camera_index,\n                        asp::BaParams & param_storage) {\n\n  double* pos_pose_ptr   = param_storage.get_camera_ptr              (camera_index);\n  double* center_ptr     = param_storage.get_intrinsic_center_ptr    (camera_index);\n  double* focus_ptr      = param_storage.get_intrinsic_focus_ptr     (camera_index);\n  double* distortion_ptr = param_storage.get_intrinsic_distortion_ptr(camera_index);\n\n  // Handle position and pose. We start with 0 pose and identity rotation. Nothing\n  // gets copied from camera position and orientation.\n  CameraAdjustment pos_pose_info;\n  pos_pose_info.copy_from_csm(camera);\n  pos_pose_info.pack_to_array(pos_pose_ptr);\n\n  // We are solving for multipliers to the intrinsic values, so they all start at 1.0.\n  // Center point and focal length\n  center_ptr[0] = 1.0;\n  center_ptr[1] = 1.0;\n  focus_ptr [0] = 1.0;\n  // Distortion\n  for (size_t i = 0; i < camera.distortion().size(); i++)\n    distortion_ptr[i] = 1.0;\n}\n\n/// Given a transform with origin at the planet center, like output by pc_align,\n/// read the adjustments from param storage, apply this transform on top of\n/// them, and write the adjustments back to the param storage. Cameras\n/// do not change.\nvoid apply_transform_to_params(vw::Matrix4x4 const& M, asp::BaParams &param_storage,\n                                std::vector<vw::CamPtr> const& cam_ptrs) {\n\n  for (unsigned i = 0; i < param_storage.num_cameras(); i++) {\n\n    // Load the current position/pose of this camera.\n    double* cam_ptr = param_storage.get_camera_ptr(i);\n    CameraAdjustment cam_adjust(cam_ptr);\n\n    // Create the adjusted camera model\n    vw::camera::AdjustedCameraModel cam(cam_ptrs[i], cam_adjust.position(),\n                                        cam_adjust.pose());\n    // Apply the transform\n    cam.apply_transform(M);\n\n    // Copy back the adjustments to the camera array.\n    cam_adjust.copy_from_adjusted_camera(cam);\n    cam_adjust.pack_to_array(cam_ptr);\n  }\n} // end function apply_transform_to_cameras\n\n// This function takes advantage of the fact that when it is called the cam_ptrs\n//  have the same information as is in param_storage!\nvoid apply_transform_to_cameras_pinhole(vw::Matrix4x4 const& M,\n                                        asp::BaParams & param_storage,\n                                        std::vector<vw::CamPtr>\n                                        const& cam_ptrs) {\n\n  for (unsigned i = 0; i < param_storage.num_cameras(); i++) {\n    // Apply the transform\n    boost::shared_ptr<camera::PinholeModel> pin_ptr =\n      boost::dynamic_pointer_cast<vw::camera::PinholeModel>(cam_ptrs[i]);\n    pin_ptr->apply_transform(M);\n\n    // Write out to param_storage\n    pack_pinhole_to_arrays(*pin_ptr, i, param_storage);\n  }\n\n} // end function apply_transform_to_cameras_pinhole\n\n// This function takes advantage of the fact that when it is called the cam_ptrs have the same\n// information as is in param_storage.\nvoid apply_transform_to_cameras_optical_bar(vw::Matrix4x4 const& M,\n                                            asp::BaParams & param_storage,\n                                            std::vector<vw::CamPtr>\n                                            const& cam_ptrs) {\n\n  // Convert the transform format\n  vw::Matrix3x3 R = submatrix(M, 0, 0, 3, 3);\n  vw::Vector3   T;\n  for (int r = 0; r < 3; r++)\n    T[r] = M(r, 3);\n\n  double scale = pow(det(R), 1.0/3.0);\n  for (size_t r = 0; r < R.rows(); r++)\n    for (size_t c = 0; c < R.cols(); c++)\n      R(r, c) /= scale;\n\n  for (unsigned i = 0; i < param_storage.num_cameras(); i++) {\n    // Apply the transform\n    boost::shared_ptr<vw::camera::OpticalBarModel> bar_ptr =\n      boost::dynamic_pointer_cast<vw::camera::OpticalBarModel>(cam_ptrs[i]);\n    bar_ptr->apply_transform(R, T, scale);\n\n    // Write out to param_storage\n    pack_optical_bar_to_arrays(*bar_ptr, i, param_storage);\n  }\n\n} // end function apply_transform_to_cameras_optical_bar\n\n// This function takes advantage of the fact that when it is called the cam_ptrs\n//  have the same information as is in param_storage.\n// This applies the transform to the camera inline, but does not copy\n// the camera position and orientation to the arrays.\nvoid apply_transform_to_cameras_csm(vw::Matrix4x4 const& M,\n                                    asp::BaParams & param_storage,\n                                    std::vector<vw::CamPtr>\n                                    const& cam_ptrs) {\n  for (unsigned i = 0; i < param_storage.num_cameras(); i++) {\n    // Apply the transform\n    boost::shared_ptr<asp::CsmModel> csm_ptr =\n      boost::dynamic_pointer_cast<asp::CsmModel>(cam_ptrs[i]);\n    if (csm_ptr == NULL)\n        vw_throw(ArgumentErr() << \"Expecting a CSM camera.\\n\");\n    csm_ptr->applyTransform(M);\n    // Write out to param_storage. This does not copy camera position \n    // and orientation. The adjustment stays as 0 pose and identity rotation.\n    // That is why the transform M does not get applied twice.\n    pack_csm_to_arrays(*csm_ptr, i, param_storage);\n  }\n\n} // end function apply_transform_to_cameras_csm\n\n/// Apply a scale-rotate-translate transform to pinhole cameras and control points\nvoid apply_rigid_transform(vw::Matrix3x3 const & rotation,\n                           vw::Vector3   const & translation,\n                           double                scale,\n                           std::vector<vw::CamPtr> &camera_models,\n                           boost::shared_ptr<vw::ba::ControlNetwork> const& cnet) {\n\n  // Apply the transform to the cameras\n  for (size_t icam = 0; icam < camera_models.size(); icam++) {\n    vw::camera::PinholeModel * pincam\n      = dynamic_cast<vw::camera::PinholeModel*>(camera_models[icam].get());\n    VW_ASSERT(pincam != NULL, vw::ArgumentErr() << \"A pinhole camera expected.\\n\");\n\n    pincam->apply_transform(rotation, translation, scale);\n  } // End loop through cameras\n\n  // Apply the transform to all of the world points in the ControlNetwork\n  ControlNetwork::iterator iter;\n  for (iter = cnet->begin(); iter != cnet->end(); iter++) {\n    if (iter->type() == ControlPoint::GroundControlPoint)\n      continue; // Don't convert the ground control points!\n\n    Vector3 position     = iter->position();\n    Vector3 new_position = scale*rotation*position + translation;\n    iter->set_position(new_position);\n  }\n} // End function ApplyRigidTransform\n\n/// Generate a warning if the GCP's are really far from the IP points\n/// - This is intended to help catch the common lat/lon swap in GCP files.\nvoid check_gcp_dists(std::vector<vw::CamPtr> const& camera_models,\n                     boost::shared_ptr<vw::ba::ControlNetwork> const& cnet_ptr,\n                     double forced_triangulation_distance) {\n\n  // Count the points and triangulate\n  const ControlNetwork & cnet = *cnet_ptr.get(); // Helper alias\n  const int num_cnet_points = static_cast<int>(cnet.size());\n  double gcp_count = 0, ip_count = 0;\n  Vector3 mean_gcp(0, 0, 0);\n  Vector3 mean_ip (0, 0, 0);\n  for (int ipt = 0; ipt < num_cnet_points; ipt++) {\n\n    if (cnet[ipt].position() == Vector3() || cnet[ipt].size() <= 1)\n      continue;\n\n    if (cnet[ipt].type() == ControlPoint::GroundControlPoint) {\n      gcp_count += 1.0;\n      mean_gcp += cnet[ipt].position();\n    } else {\n      // Use triangulation to estimate the position of this control point using\n      // the current set of camera models.\n      ControlPoint cp_new = cnet[ipt];\n      double minimum_angle = 0;\n      double ans = vw::ba::triangulate_control_point(cp_new, camera_models, minimum_angle,\n                             forced_triangulation_distance);\n      if (ans < 0 || cp_new.position() == Vector3())\n        continue; // Skip points that fail to triangulate\n\n      ip_count += 1.0;\n      mean_ip += cp_new.position();\n    }\n  } // End loop through control network points\n\n  if (ip_count == 0 || gcp_count == 0)\n    return; // Can't do this check if we don't have both point types.\n\n  // Average the points\n  mean_gcp = mean_gcp / gcp_count;\n  mean_ip = mean_ip / ip_count;\n\n  double dist = norm_2(mean_ip - mean_gcp);\n  if (dist > 100000)\n    vw_out() << \"WARNING: GCPs are over 100 km from the other points. Are your lat/lon GCP coordinates swapped?\\n\";\n}\n\n// Initialize the position and orientation of each pinhole camera model using\n// a least squares error transform to match the provided camera positions.\n// This function overwrites the camera parameters in-place\nbool init_pinhole_model_with_camera_positions(boost::shared_ptr<vw::ba::ControlNetwork> const& cnet,\n std::vector<vw::CamPtr> & camera_models,\n std::vector<std::string> const& image_files,\n std::vector<vw::Vector3> const & estimated_camera_gcc) {\n\n  vw_out() << \"Initializing camera positions from input file.\" << std::endl;\n\n  // Count the number of matches and check for problems\n  const int num_cameras = image_files.size();\n  if (int(estimated_camera_gcc.size()) != num_cameras)\n    vw_throw(ArgumentErr() << \"No camera matches provided to init function!\\n\");\n\n  vw_out() << \"Num cameras: \" << num_cameras << std::endl;\n\n  int num_matches_found = 0;\n  for (int i = 0; i < num_cameras; i++)\n    if (estimated_camera_gcc[i] != Vector3(0,0,0))\n      ++num_matches_found;\n\n  vw_out() << \"Number of matches found: \" << num_matches_found << std::endl;\n\n  const int MIN_NUM_MATCHES = 3;\n  if (num_matches_found < MIN_NUM_MATCHES)\n    vw_throw(ArgumentErr() << \"At least \" << MIN_NUM_MATCHES\n              << \" camera position matches are required to initialize cameras \"\n              << \"based on camera positions only.\\n\");\n\n  // Populate matrices containing the current and known camera positions.\n  vw::Matrix<double> points_in(3, num_matches_found), points_out(3, num_matches_found);\n  typedef vw::math::MatrixCol<vw::Matrix<double>> ColView;\n  int index = 0;\n  for (int i = 0; i < num_cameras; i++) {\n    // Skip cameras with no matching record\n    if (estimated_camera_gcc[i] == Vector3(0,0,0))\n      continue;\n\n    // Get the two GCC positions\n    Vector3 gcc_in  = camera_models[i]->camera_center(Vector2(0,0));\n    Vector3 gcc_out = estimated_camera_gcc[i];\n\n    // Store in matrices\n    ColView colIn (points_in,  index);\n    ColView colOut(points_out, index);\n    colIn  = gcc_in;\n    colOut = gcc_out;\n    ++index;\n\n  } // End matrix populating loop\n\n  // Call function to compute a 3D affine transform between the two point sets\n  vw::Matrix3x3 rotation;\n  vw::Vector3   translation;\n  double        scale;\n  vw::math::find_3D_transform(points_in, points_out, rotation, translation, scale);\n\n  // Update the camera and point information with the new transform\n  apply_rigid_transform(rotation, translation, scale, camera_models, cnet);\n  return true;\n}\n\n// Given at least two images, each having at least 3 GCP that are not seen in other\n// images, find and apply a transform to the camera system based on them.\nvoid transform_cameras_with_indiv_image_gcp\n(boost::shared_ptr<ControlNetwork> const& cnet_ptr,\n std::vector<vw::CamPtr> & camera_models) {\n\n  vw_out() << \"Applying transform to cameras given several GCP not shared \"\n           << \"among the images.\\n\";\n\n  int num_cams = camera_models.size();\n\n  // Create pinhole cameras\n  std::vector<PinholeModel> pinhole_cams;\n  for (int icam = 0; icam < num_cams; icam++) {\n    vw::camera::PinholeModel * pincam\n      = dynamic_cast<vw::camera::PinholeModel*>(camera_models[icam].get());\n    VW_ASSERT(pincam != NULL,\n          vw::ArgumentErr() << \"A pinhole camera expected.\\n\");\n    pinhole_cams.push_back(*pincam);\n  }\n\n  // Extract from the control network each pixel for each camera together\n  // with its xyz.\n  std::vector<std::vector<Vector3>> xyz;\n  std::vector<std::vector<Vector2>> pix;\n  xyz.resize(num_cams);\n  pix.resize(num_cams);\n  const ControlNetwork & cnet = *cnet_ptr.get(); // Helper alias\n\n  for (int ipt = 0; ipt < cnet.size(); ipt++) {\n\n    // Keep only gcp\n    if (cnet[ipt].type() != ControlPoint::GroundControlPoint)\n      continue;\n\n    for (auto measure = cnet[ipt].begin(); measure != cnet[ipt].end(); measure++) {\n      int cam_it = measure->image_id();\n      if (cam_it < 0 || cam_it >= num_cams)\n        vw_throw(ArgumentErr() << \"Error: cnet index out of range.\\n\");\n\n      Vector2 pixel(measure->position()[0],  measure->position()[1]);\n      pix[cam_it].push_back(pixel);\n      xyz[cam_it].push_back(cnet[ipt].position());\n    }\n  }\n\n  Matrix3x3 rotation;\n  Vector3   translation;\n  double    scale;\n  vw::camera::align_cameras_to_ground(xyz, pix, pinhole_cams, rotation, translation, scale);\n\n  // Update the camera and point information with the new transform\n  vw_out() << \"Applying transform based on GCP:\\n\";\n  vw_out() << \"Rotation:    \" << rotation    << \"\\n\";\n  vw_out() << \"Translation: \" << translation << \"\\n\";\n  vw_out() << \"Scale:       \" << scale       << \"\\n\";\n  apply_rigid_transform(rotation, translation, scale, camera_models, cnet_ptr);\n}\n\n/// Initialize the position and orientation of each pinhole camera model using\n/// a least squares error transform to match the provided control points file.\n/// This function overwrites the camera parameters in-place. It works\n/// if at least three GCP are seen in no less than two images.\nvoid transform_cameras_with_shared_gcp(\n            boost::shared_ptr<ControlNetwork> const& cnet_ptr,\n            std::vector<vw::CamPtr> & camera_models) {\n\n  vw_out() << \"Applying transform to cameras given several GCP shared among the images.\\n\";\n\n  const ControlNetwork & cnet = *cnet_ptr.get(); // Helper alias\n\n  // Verify that all cameras are pinhole\n  for (size_t icam = 0; icam < camera_models.size(); icam++) {\n    vw::camera::PinholeModel * pincam\n      = dynamic_cast<vw::camera::PinholeModel*>(camera_models[icam].get());\n    VW_ASSERT(pincam != NULL,\n          vw::ArgumentErr() << \"A pinhole camera expected.\\n\");\n  }\n\n  // Put the good ground control points in a vector.\n  int num_cnet_points = cnet.size();\n  std::vector<vw::Vector3> in_xyz, out_xyz;\n  int num_gcp      = 0;\n  int num_good_gcp = 0;\n  for (int ipt = 0; ipt < num_cnet_points; ipt++) {\n\n    if (cnet[ipt].type() != ControlPoint::GroundControlPoint)\n      continue;\n\n    num_gcp++;\n\n    // Use triangulation to estimate the position of this control point using\n    //   the current set of camera models.\n    ControlPoint untrans_cp = cnet[ipt];\n    double minimum_angle = 1.0e-3; // Likely this is too small for a good GCP, but better than 0.\n    double forced_triangulation_distance = -1.0;\n    double err = vw::ba::triangulate_control_point(untrans_cp, camera_models,\n                           minimum_angle, forced_triangulation_distance);\n\n    if (untrans_cp.position() != Vector3() && cnet[ipt].position()  != Vector3() &&\n        err >= 0) {\n      // Store the computed and correct position of this point\n      in_xyz.push_back(untrans_cp.position());\n      out_xyz.push_back(cnet[ipt].position());\n      num_good_gcp++; // Only count points that triangulate\n    } else {\n      vw_out() << \"Discarding GCP that could not be triangulated: \" << cnet[ipt] << \".\\n\";\n    }\n  } // End good GCP counting\n\n  // Sanity check\n  const int MIN_GCP_COUNT = 3;\n  if (num_good_gcp < MIN_GCP_COUNT) {\n    vw_out() << \"Num GCP       = \" << num_gcp      << std::endl;\n    vw_out() << \"Num valid GCP = \" << num_good_gcp << std::endl;\n    vw_throw(ArgumentErr()\n          << \"Not enough valid GCPs to apply a transform to the cameras. \"\n          << \"You may need to use --transform-cameras-using-gcp.\\n\");\n  }\n\n  // Copy these points to a matrix as required by the API about to be used. \n  vw::Matrix<double> points_in(3, num_good_gcp), points_out(3, num_good_gcp);\n  typedef vw::math::MatrixCol<vw::Matrix<double>> ColView;\n  for (size_t ipt = 0; ipt < in_xyz.size(); ipt++) {\n    ColView colIn (points_in,  ipt);\n    ColView colOut(points_out, ipt);\n    colIn  = in_xyz[ipt];\n    colOut = out_xyz[ipt];\n  } // End loop through control network points\n\n  // Call function to compute a 3D affine transform between the two point sets\n  vw::Matrix3x3 rotation;\n  vw::Vector3   translation;\n  double        scale;\n  vw::math::find_3D_transform(points_in, points_out, rotation, translation, scale);\n\n  // Update the camera and point information with the new transform\n  vw_out() << \"Applying transform based on GCP:\\n\";\n  vw_out() << \"Rotation:    \" << rotation    << \"\\n\";\n  vw_out() << \"Translation: \" << translation << \"\\n\";\n  vw_out() << \"Scale:       \" << scale       << \"\\n\";\n  vw_out() << \"This transform can be disabled with --disable-pinhole-gcp-init.\\n\";\n  apply_rigid_transform(rotation, translation, scale, camera_models, cnet_ptr);\n\n  return;\n} // End function transform_cameras_with_shared_gcp\n\n/// Initialize the position and orientation of a pinhole camera model using\n/// GCP. It invokes OpenCV's PnP functionality.\nvoid init_camera_using_gcp(boost::shared_ptr<vw::ba::ControlNetwork> const& cnet_ptr,\n                           std::vector<vw::CamPtr> & camera_models) {\n\n  // Sanity check\n  if (camera_models.size() != 1)\n    vw::vw_throw(vw::ArgumentErr()\n                 << \"Cannot initialize more than a camera at a time using GCP. \"\n                 << \"Consider using --transform-cameras-with-shared-gcp or \"\n                 << \"--transform-cameras-using-gcp.\\n\");\n\n  vw_out() << \"Initializing a Pinhole camera using GCP.\\n\";\n\n  int icam = 0;\n  vw::camera::PinholeModel * pincam\n    = dynamic_cast<vw::camera::PinholeModel*>(camera_models[icam].get());\n  VW_ASSERT(pincam != NULL, vw::ArgumentErr() << \"A pinhole camera expected.\\n\");\n\n  std::vector<vw::Vector2> pixel_observations;\n  std::vector<vw::Vector3> ground_points;\n  const ControlNetwork & cnet = *cnet_ptr.get(); // Helper alias\n  for (int ipt = 0; ipt < cnet.size(); ipt++) {\n\n    // Loop through all the ground control points only\n    if (cnet[ipt].type() != ControlPoint::GroundControlPoint)\n      continue;\n    ground_points.push_back(cnet[ipt].position());\n\n    int num_meas = 0;\n    for (ControlPoint::const_iterator measure = cnet[ipt].begin();\n         measure != cnet[ipt].end(); measure++) {\n\n      int cam_it = measure->image_id();\n      if (cam_it != 0)\n        vw_throw(ArgumentErr() << \"Error: Expecting GCP for a single camera.\\n\");\n\n      Vector2 pixel(measure->position()[0], measure->position()[1]);\n      num_meas++;\n      if (num_meas > 1)\n        vw::vw_throw(vw::ArgumentErr() << \"Expecting a single camera pixel per gcp.\\n\");\n\n      pixel_observations.push_back(pixel);\n    }\n  }\n\n  // Update the camera pose with given observations and intrinsics\n  asp::findCameraPose(ground_points, pixel_observations, *pincam);\n\n  return;\n\n} // End function init_camera_using_gcp\n\n// Given an input pinhole camera and param changes, apply those, returning\n// the new camera. Note that all intrinsic parameters are stored as multipliers\n// in asp::BaParams.\nvw::camera::PinholeModel transformedPinholeCamera(int camera_index,\n                                                  asp::BaParams const& param_storage,\n                                                  vw::camera::PinholeModel const& in_cam) {\n\n  // Start by making a copy of the camera. Note that this does not make a copy of the\n  // distortion params, as that's a pointer. So will have to make a copy of it further down.\n  vw::camera::PinholeModel out_cam = in_cam;\n\n  double const* pos_pose_ptr   = param_storage.get_camera_ptr(camera_index);\n  double const* center_ptr     = param_storage.get_intrinsic_center_ptr    (camera_index);\n  double const* focus_ptr      = param_storage.get_intrinsic_focus_ptr     (camera_index);\n  double const* distortion_ptr = param_storage.get_intrinsic_distortion_ptr(camera_index);\n\n  // Update position and pose\n  CameraAdjustment pos_pose_info(pos_pose_ptr);\n  out_cam.set_camera_center(pos_pose_info.position());\n  out_cam.set_camera_pose(pos_pose_info.pose());\n\n  // Update the lens distortion parameters. Note how we make a new copy of the\n  // distortion object.\n  boost::shared_ptr<LensDistortion> distortion = out_cam.lens_distortion()->copy();\n  vw::Vector<double> lens = distortion->distortion_parameters();\n  for (size_t i = 0; i < lens.size(); i++)\n    lens[i] *= distortion_ptr[i];\n  distortion->set_distortion_parameters(lens);\n  out_cam.set_lens_distortion(distortion.get());\n\n  // Update the center and focus\n  Vector2 old_center = out_cam.point_offset();\n  Vector2 old_focus  = out_cam.focal_length();\n  out_cam.set_point_offset(Vector2(center_ptr[0]*old_center[0],\n                                  center_ptr[1]*old_center[1]),\n                           false); // do not update the internals yet\n  double new_focus = old_focus[0]*focus_ptr[0];\n  // At the last step, recompute the internals given the new values\n  out_cam.set_focal_length(Vector2(new_focus,new_focus), true);\n\n  return out_cam;\n}\n\n// Given an input optical bar camera and param changes, apply those, returning\n// the new camera.\nvw::camera::OpticalBarModel\ntransformedOpticalBarCamera(int camera_index,\n                            asp::BaParams const& param_storage,\n                            vw::camera::OpticalBarModel const& in_cam) {\n\n  // Start by making a copy of the camera\n  vw::camera::OpticalBarModel out_cam = in_cam;\n\n  double const* pos_pose_ptr  = param_storage.get_camera_ptr(camera_index);\n  double const* center_ptr    = param_storage.get_intrinsic_center_ptr    (camera_index);\n  double const* focus_ptr     = param_storage.get_intrinsic_focus_ptr     (camera_index);\n  double const* intrinsic_ptr = param_storage.get_intrinsic_distortion_ptr(camera_index);\n\n  // Update position and pose\n  CameraAdjustment pos_pose_info(pos_pose_ptr);\n  out_cam.set_camera_center(pos_pose_info.position());\n  out_cam.set_camera_pose  (pos_pose_info.pose    ());\n\n  // All intrinsic parameters are stored as multipliers!\n\n  // Update the other intrinsic parameters.\n  out_cam.set_speed              (out_cam.get_speed()*intrinsic_ptr[0]);\n  out_cam.set_motion_compensation(out_cam.get_motion_compensation()*intrinsic_ptr[1]);\n  out_cam.set_scan_time          (out_cam.get_scan_time()*intrinsic_ptr[2]);\n\n  if (out_cam.get_have_velocity_vec()) {\n    vw::Vector3 vel = out_cam.get_velocity();\n    vw::Vector3 final_pose = out_cam.get_final_pose();\n    vel[0] *= intrinsic_ptr[3];\n    vel[1] *= intrinsic_ptr[4];\n    vel[2] *= intrinsic_ptr[5];\n    final_pose[0] *= intrinsic_ptr[6];\n    final_pose[1] *= intrinsic_ptr[7];\n    final_pose[2] *= intrinsic_ptr[8];\n    out_cam.set_velocity(vel);\n    out_cam.set_final_pose(final_pose);\n  }\n\n  // Update the center and focus\n  Vector2 old_center = out_cam.get_optical_center();\n  float   old_focus  = out_cam.get_focal_length();\n  out_cam.set_optical_center(Vector2(center_ptr[0]*old_center[0],\n                                    center_ptr[1]*old_center[1]));\n  double new_focus = old_focus*focus_ptr[0];\n  out_cam.set_focal_length(new_focus);\n\n  return out_cam;\n}\n\n// Given an input CSM camera, intrinsic and extrinsic param changes, apply\n// those, returning the new camera.\nboost::shared_ptr<asp::CsmModel> transformedCsmCamera(int camera_index,\n                                                      asp::BaParams const& param_storage,\n                                                      asp::CsmModel const& in_cam) {\n  // Get the latest version of the camera parameters\n  double const* pos_pose_ptr  = param_storage.get_camera_ptr(camera_index);\n  double const* center_ptr    = param_storage.get_intrinsic_center_ptr    (camera_index);\n  double const* focus_ptr     = param_storage.get_intrinsic_focus_ptr     (camera_index);\n  double const* dist_ptr      = param_storage.get_intrinsic_distortion_ptr(camera_index);\n\n  // Read the position and pose\n  CameraAdjustment correction(pos_pose_ptr);\n\n  // All intrinsic parameters are stored as multipliers\n  vw::Vector2 optical_center = in_cam.optical_center();\n  double focal_length        = in_cam.focal_length();\n  optical_center[0] = center_ptr[0] * optical_center[0];\n  optical_center[1] = center_ptr[1] * optical_center[1];\n  focal_length      = focus_ptr [0] * focal_length;\n\n  // Update the lens distortion parameters in the new camera.\n  // - These values are also optimized as scale factors.\n  std::vector<double> distortion = in_cam.distortion();\n  for (size_t i = 0; i < distortion.size(); i++) {\n\n    // Ensure this approach does not fail when the input distortion is 0.\n    // TODO(oalexan1): This is not enough, however. The user must choose\n    // to manually enter some small fake distortion, maybe on the order\n    // of 1e-8. It is hard to tell what numbers to put below. They should\n    // not be as small as 1e-16 but sometimes 1e-8 (for higher order polynomial\n    // coefficients) may be too much.\n    if (distortion[i] == 0.0)\n      distortion[i] = 1e-16;\n\n    distortion[i] = dist_ptr[i] * distortion[i];\n  }\n\n  // Duplicate the input camera model\n  boost::shared_ptr<asp::CsmModel> copy;\n  in_cam.deep_copy(copy);\n\n  // Update the intrinsics of the copied model\n  copy->set_optical_center(optical_center);\n  copy->set_focal_length(focal_length);\n  copy->set_distortion(distortion);\n\n  // Form the adjusted camera having the updated position and pose\n  AdjustedCameraModel adj_cam(copy, correction.position(), correction.pose());\n\n  // Apply the adjustment to the camera \n  vw::Matrix4x4 ecef_transform = adj_cam.ecef_transform();\n  copy->applyTransform(ecef_transform);\n\n  // TODO(oalexan1): Test if adj cam and cam with applied adjustment return same\n  // results\n\n  return copy;\n}\n\n// Mapproject interest points onto a DEM and find the norm of their\n// disagreement in meters. It is assumed that dem_georef\n// was created by bilinear interpolation. The cameras must be with\n// the latest adjustments applied to them.\nvoid calcPairMapprojOffsets(int left_cam_index, int right_cam_index,\n                            std::vector<vw::CamPtr>            const& optimized_cams,\n                            std::vector<vw::ip::InterestPoint> const& left_ip,\n                            std::vector<vw::ip::InterestPoint> const& right_ip,\n                            vw::cartography::GeoReference      const& dem_georef,\n                            vw::ImageViewRef<vw::PixelMask<double>> const& interp_dem,\n                            // Will append below\n                            std::vector<vw::Vector<float, 4>>       & mapprojPoints,\n                            std::vector<float>                      & mapprojOffsets) {\n\n  // Wipe mapprojOffsets\n  mapprojOffsets.clear();\n\n  // Will append to mapprojPoints, so don't wipe it\n\n  for (size_t ip_it = 0; ip_it < left_ip.size(); ip_it++) {\n\n    bool treat_nodata_as_zero = false;\n    bool has_intersection = false;\n    double height_error_tol = 0.001; // 1 mm should be enough\n    double max_abs_tol      = 1e-14; // abs cost fun change b/w iterations\n    double max_rel_tol      = 1e-14;\n    int num_max_iter        = 50;   // Using many iterations can be very slow\n    Vector3 xyz_guess;\n\n    Vector2 left_pix(left_ip[ip_it].x, left_ip[ip_it].y);\n    Vector3 left_dem_xyz = vw::cartography::camera_pixel_to_dem_xyz\n      (optimized_cams[left_cam_index]->camera_center(left_pix),\n       optimized_cams[left_cam_index]->pixel_to_vector(left_pix),\n       vw::pixel_cast<vw::PixelMask<float>>(interp_dem), dem_georef,\n       treat_nodata_as_zero, has_intersection,\n       height_error_tol, max_abs_tol, max_rel_tol, num_max_iter, xyz_guess);\n    if (!has_intersection)\n      continue;\n\n    // Do the same for right. Use left pixel as initial guess\n    xyz_guess = left_dem_xyz;\n    Vector2 right_pix(right_ip[ip_it].x, right_ip[ip_it].y);\n    Vector3 right_dem_xyz = vw::cartography::camera_pixel_to_dem_xyz\n      (optimized_cams[right_cam_index]->camera_center(right_pix),\n       optimized_cams[right_cam_index]->pixel_to_vector(right_pix),\n       vw::pixel_cast<vw::PixelMask<float>>(interp_dem), dem_georef,\n       treat_nodata_as_zero, has_intersection,\n       height_error_tol, max_abs_tol, max_rel_tol, num_max_iter, xyz_guess);\n    if (!has_intersection)\n      continue;\n\n    Vector3 mid_pt = (left_dem_xyz + right_dem_xyz)/2.0;\n    double dist = norm_2(left_dem_xyz - right_dem_xyz);\n\n    // Keep in the same structure both the midpoint between these two\n    // mapprojected ip, as lon-lat,height, and their distance, as\n    // later the bookkeeping of mapprojOffsets will be different.\n    // Float precision is enough, and will save on memory.\n    Vector<float, 4> point;\n    subvector(point, 0, 3) = dem_georef.datum().cartesian_to_geodetic(mid_pt);\n    point[3] = dist;\n\n    mapprojPoints.push_back(point);\n    mapprojOffsets.push_back(dist);\n  }\n\n  return;\n}\n\n// This is called either with original or inlier ip\nvoid processMatchPair(size_t left_index, size_t right_index,\n                      std::vector<vw::ip::InterestPoint> const& left_ip,\n                      std::vector<vw::ip::InterestPoint> const& right_ip,\n                      std::vector<vw::CamPtr> const& optimized_cams,\n                      vw::cartography::GeoReference const& mapproj_dem_georef,\n                      vw::ImageViewRef<vw::PixelMask<double>> const& interp_mapproj_dem,\n                      vw::cartography::Datum const& datum,\n                      bool save_mapproj_match_points_offsets,\n                      bool propagate_errors,\n                      vw::Vector<double> const& horizontal_stddev_vec,\n                      // Outputs\n                      // Will append to entities below\n                      std::vector<asp::MatchPairStats>  & convAngles,\n                      std::vector<vw::Vector<float, 4>> & mapprojPoints,\n                      std::vector<asp::MatchPairStats> & mapprojOffsets,\n                      std::vector<std::vector<float>>  & mapprojOffsetsPerCam,\n                      std::vector<asp::HorizVertErrorStats> & horizVertErrors) {\n\n  convAngles.push_back(asp::MatchPairStats()); // add an element, then populate it\n  std::vector<double> sorted_angles;\n  asp::convergence_angles(optimized_cams[left_index].get(), optimized_cams[right_index].get(),\n                          left_ip, right_ip, sorted_angles);\n  convAngles.back().populate(left_index, right_index, sorted_angles);\n\n  if (save_mapproj_match_points_offsets) {\n    std::vector<float> localMapprojOffsets;\n    asp::calcPairMapprojOffsets(left_index, right_index,\n                                optimized_cams,\n                                left_ip, right_ip,\n                                mapproj_dem_georef, interp_mapproj_dem,\n                                mapprojPoints, // will append here\n                                localMapprojOffsets);\n    mapprojOffsets.push_back(asp::MatchPairStats()); // add an elem, then populate it\n    mapprojOffsets.back().populate(left_index, right_index, localMapprojOffsets);\n    for (size_t map_it = 0; map_it < localMapprojOffsets.size(); map_it++) {\n      mapprojOffsetsPerCam[left_index].push_back(localMapprojOffsets[map_it]);\n      mapprojOffsetsPerCam[right_index].push_back(localMapprojOffsets[map_it]);\n    }\n  }\n\n  if (propagate_errors) {\n    // Ensure her that proper values are passed for the input std devs\n    horizVertErrors.push_back(asp::HorizVertErrorStats()); // add an elem, then populate it\n    asp::propagatedErrorStats(left_index, right_index,\n                              optimized_cams[left_index].get(),\n                              optimized_cams[right_index].get(),\n                              left_ip, right_ip,\n                              horizontal_stddev_vec[left_index],\n                              horizontal_stddev_vec[right_index],\n                              datum,\n                              horizVertErrors.back());\n  }\n\n  return;\n}\n\n// Calculate convergence angles. Remove the outliers flagged earlier,\n// if remove_outliers is true. Compute offsets of mapprojected matches,\n// if a DEM is given. These are done together as they rely on\n// reloading interest point matches, which is expensive so the matches\n// are used for both operations.\nvoid matchFilesProcessing(vw::ba::ControlNetwork       const& cnet,\n                          asp::BaBaseOptions           const& opt,\n                          std::vector<vw::CamPtr>      const& optimized_cams,\n                          bool                                remove_outliers,\n                          std::set<int>                const& outliers,\n                          std::string                  const& mapproj_dem,\n                          bool                                propagate_errors,\n                          vw::Vector<double>           const& horizontal_stddev_vec,\n                          bool                                save_clean_matches,\n                          std::map<std::pair<int, int>, std::string> const& match_files,\n                          bool                                matches_as_txt) {\n\n  vw_out() << \"Creating reports.\\n\";\n\n  std::vector<vw::Vector<float, 4>> mapprojPoints; // all points, not just stats\n  std::vector<asp::MatchPairStats> convAngles, mapprojOffsets;\n  std::vector<std::vector<float>> mapprojOffsetsPerCam;\n  std::vector<asp::HorizVertErrorStats> horizVertErrors;\n\n  // Wipe the outputs\n  mapprojPoints.clear();\n  convAngles.clear();\n  mapprojOffsets.clear();\n  mapprojOffsetsPerCam.clear();\n  horizVertErrors.clear();\n\n  bool save_mapproj_match_points_offsets = (!mapproj_dem.empty());\n  vw::cartography::GeoReference mapproj_dem_georef;\n  ImageViewRef<PixelMask<double>> interp_mapproj_dem;\n  if (save_mapproj_match_points_offsets)\n    asp::create_interp_dem(mapproj_dem, mapproj_dem_georef, interp_mapproj_dem);\n\n  int num_cameras = opt.image_files.size();\n  mapprojOffsetsPerCam.resize(num_cameras);\n\n  // Iterate over the control network, and, for each inlier pair of matches,\n  // remember what pair it is from. Needed only if there is outlier filtering\n  // or matches were read from an isis cnet.\n  // TODO(oalexan1): This uses a lot of memory. Need to keep just indices,\n  // somehow, not quadruplets of floats.\n  // TODO(oalexan1): Make this into a function.\n  typedef std::tuple<float, float, float, float> Quadruplet;\n  std::map<std::pair<int, int>, std::set<Quadruplet>> match_map;\n  if (remove_outliers || !opt.isis_cnet.empty() || !opt.nvm.empty()) {\n    for (int ipt = 0; ipt < cnet.size(); ipt++) {\n      // Skip outliers\n      if (outliers.find(ipt) != outliers.end())\n        continue;\n      // Skip gcp\n      if (cnet[ipt].type() == ControlPoint::GroundControlPoint)\n        continue;\n\n      for (auto m1 = cnet[ipt].begin(); m1 != cnet[ipt].end(); m1++) {\n        for (auto m2 = cnet[ipt].begin(); m2 != cnet[ipt].end(); m2++) {\n          int left_index = m1->image_id();\n          int right_index = m2->image_id();\n          // Can have left_index > right_index\n          if (left_index == right_index)\n            continue;\n          match_map[std::make_pair(left_index, right_index)].insert\n            (Quadruplet(m1->position()[0], m1->position()[1],\n                        m2->position()[0], m2->position()[1]));\n        }\n      }\n    }\n  }\n\n  // If we read the matches from an ISIS cnet or nvm, there are no match files.\n  // Then create them. \n  std::map<std::pair<int, int>, std::string> local_match_files = match_files;\n  if (opt.isis_cnet != \"\" || opt.nvm != \"\") {\n    // iterate over match pairs\n    local_match_files.clear();\n    for (auto const& match_pair: match_map) {\n      int left_index  = match_pair.first.first;\n      int right_index = match_pair.first.second;\n      // When creating match files from scratch, let the first index\n      // be less than the second.\n      if (left_index > right_index)\n        continue;\n      std::string match_file\n        = vw::ip::match_filename(opt.out_prefix,\n                                 opt.image_files[left_index],\n                                 opt.image_files[right_index],\n                                 matches_as_txt);\n      local_match_files[std::make_pair(left_index, right_index)] = match_file;\n    }\n  }\n\n  // Work on individual image pairs\n  for (const auto& match_it: local_match_files) {\n\n    std::pair<int, int> cam_pair   = match_it.first;\n    std::string         match_file = match_it.second;\n    size_t left_index  = cam_pair.first;\n    size_t right_index = cam_pair.second;\n    if (left_index == right_index)\n      vw::vw_throw(vw::ArgumentErr() << \"Bookkeeping failure. Cannot have interest point \"\n                   << \"matches between an image and itself.\\n\");\n\n    std::vector<ip::InterestPoint> orig_left_ip, orig_right_ip;\n    if (opt.isis_cnet != \"\" || opt.nvm != \"\") {\n      // Must create the matches from the cnet.\n      auto & match_pair = match_map[std::make_pair(left_index, right_index)]; // alias\n      // Iterate over this set of quadruplets, and build matches\n      for (auto const& q: match_pair) {\n        double s = 1.0; // scale\n        orig_left_ip.push_back(vw::ip::InterestPoint(std::get<0>(q), std::get<1>(q), s));\n        orig_right_ip.push_back(vw::ip::InterestPoint(std::get<2>(q), std::get<3>(q), s));\n      }\n\n      // Write the matches formed from the cnet to disk\n      if (opt.output_cnet_type == \"match-files\") {\n        vw::vw_out() << \"Writing: \" << match_file << \"\\n\";\n        vw::ip::write_match_file(match_file, orig_left_ip, orig_right_ip, matches_as_txt);\n      }\n\n    } else {\n      // Read existing matches. Skip over match files that don't exist.\n      if (!boost::filesystem::exists(match_file)) {\n        vw_out() << \"Skipping non-existent match file: \" << match_file << \"\\n\";\n        continue;\n      }\n      // Read the original IP, to ensure later we write to disk only\n      // the subset of the IP from the control network which\n      // are part of these original ones.\n      vw::ip::read_match_file(match_file, orig_left_ip, orig_right_ip, matches_as_txt);\n    }\n\n    // Create a new convergence angle storage struct\n    asp::MatchPairStats & convAngle = convAngles.back(); // alias\n    if (!remove_outliers) {\n      // Do some processing with orig ip. Otherwise this will be done below\n      // with the inlier ip.\n      processMatchPair(left_index, right_index,\n                       orig_left_ip, orig_right_ip,\n                       optimized_cams,\n                       mapproj_dem_georef, interp_mapproj_dem, opt.datum,\n                       save_mapproj_match_points_offsets,\n                       propagate_errors, horizontal_stddev_vec,\n                       // Will append to entities below\n                       convAngles, mapprojPoints, mapprojOffsets, mapprojOffsetsPerCam,\n                       horizVertErrors);\n      // Since no outliers are removed, nothing else to do\n      continue;\n    }\n    // Keep only inliers and non-gcp. GCP are used in optimization but are not\n    // part of the originally found interest point matches.\n    std::vector<vw::ip::InterestPoint> left_ip, right_ip;\n    for (size_t ip_iter = 0; ip_iter < orig_left_ip.size(); ip_iter++) {\n      Quadruplet q(orig_left_ip[ip_iter].x, orig_left_ip[ip_iter].y,\n                   orig_right_ip[ip_iter].x, orig_right_ip[ip_iter].y);\n      auto & match_pair = match_map[std::make_pair(left_index, right_index)]; // alias\n      if (match_pair.find(q) == match_pair.end())\n        continue;\n\n      // We do not copy descriptors, those take storage\n      left_ip.push_back(ip::InterestPoint(orig_left_ip[ip_iter].x,\n                                          orig_left_ip[ip_iter].y,\n                                          orig_left_ip[ip_iter].scale));\n      right_ip.push_back(ip::InterestPoint(orig_right_ip[ip_iter].x,\n                                           orig_right_ip[ip_iter].y,\n                                           orig_right_ip[ip_iter].scale));\n    }\n\n    // Filter by disparity\n    // TODO(oalexan1): Note that this does not update the outliers set. Likely this\n    // processing needs to move where other outlier filtering logic is.\n    bool quiet = true; // Otherwise too many messages are printed\n    if (opt.remove_outliers_params[0] > 0 && opt.remove_outliers_params[1] > 0.0) {\n      // The typical value of 75 for opt.remove_outliers_params[1] may be too low.\n      // Adjust it. pct = 75 becomes pct = 90. pct = 100 becomes pct = 100. So,\n      // if starting under 100, it gets closer to 100 but stays under it.\n      double pct = opt.remove_outliers_params[0];\n      pct = 100.0 * (pct + 150.0) / 250.0;\n      asp::filter_ip_by_disparity(pct, opt.remove_outliers_params[1],\n                                  quiet, left_ip, right_ip);\n    }\n\n    if (num_cameras == 2) {\n      // Compute the coverage fraction\n      Vector2i right_image_size = file_image_size(opt.image_files[1]);\n      int right_ip_width = right_image_size[0]*\n        static_cast<double>(100.0 - std::max(opt.ip_edge_buffer_percent, 0))/100.0;\n      Vector2i ip_size(right_ip_width, right_image_size[1]);\n      double ip_coverage = asp::calc_ip_coverage_fraction(right_ip, ip_size);\n      // Careful with the line below, it gets used in process_icebridge_batch.py.\n      vw_out() << \"IP coverage fraction after cleaning = \" << ip_coverage << \"\\n\";\n    }\n\n    // Process the inlier ip\n    processMatchPair(left_index, right_index, left_ip, right_ip,\n                     optimized_cams, mapproj_dem_georef, interp_mapproj_dem,\n                     opt.datum,\n                     save_mapproj_match_points_offsets,\n                     propagate_errors, horizontal_stddev_vec,\n                     // Will append to entities below\n                     convAngles, mapprojPoints, mapprojOffsets, mapprojOffsetsPerCam,\n                     horizVertErrors);\n\n    if (opt.output_cnet_type != \"match-files\" || !save_clean_matches)\n      continue; // Do not write match files\n\n    // Make a clean copy of the file\n    std::string clean_match_file = ip::clean_match_filename(match_file, matches_as_txt);\n    if (opt.clean_match_files_prefix != \"\") {\n      // Ensure \"clean\" does not show up twice\n      clean_match_file = match_file;\n      // Write the clean match file in the current dir, not where it was read from\n      clean_match_file.replace(0, opt.clean_match_files_prefix.size(), opt.out_prefix);\n    } else if (opt.match_files_prefix != \"\") {\n      // Write the clean match file in the current dir, not where it was read from\n      clean_match_file.replace(0, opt.match_files_prefix.size(), opt.out_prefix);\n    }\n\n    vw_out() << \"Saving \" << left_ip.size() << \" filtered interest points.\\n\";\n    vw_out() << \"Writing: \" << clean_match_file << \"\\n\";\n    vw::ip::write_match_file(clean_match_file, left_ip, right_ip, matches_as_txt);\n\n  } // End loop through the match files\n\n  // Save the produced files  \n\n  std::string conv_angles_file = opt.out_prefix + \"-convergence_angles.txt\";\n  asp::saveConvergenceAngles(conv_angles_file, convAngles, opt.image_files);\n\n  if (!opt.mapproj_dem.empty())\n    asp::saveMapprojOffsets(opt.out_prefix,\n                            mapproj_dem_georef,\n                            mapprojPoints,\n                            mapprojOffsets,\n                            mapprojOffsetsPerCam, // will change\n                            opt.image_files);\n\n  if (opt.propagate_errors) {\n    std::string horiz_vert_errors_file = opt.out_prefix + \"-triangulation_uncertainty.txt\";\n    asp::saveHorizVertErrors(horiz_vert_errors_file, horizVertErrors, opt.image_files);\n  }\n\n  return;\n}\n\n// Find stats of propagated errors\nvoid propagatedErrorStats(size_t left_cam_index, size_t right_cam_index,\n                          vw::camera::CameraModel const * left_cam,\n                          vw::camera::CameraModel const * right_cam,\n                          std::vector<vw::ip::InterestPoint> const& left_ip,\n                          std::vector<vw::ip::InterestPoint> const& right_ip,\n                          double stddev1, double stddev2,\n                          vw::cartography::Datum const& datum,\n                          // Output\n                          asp::HorizVertErrorStats & stats) {\n\n  // Create a stereo model, to be used for triangulation\n  double angle_tol = vw::stereo::StereoModel::robust_1_minus_cos\n                        (asp::stereo_settings().min_triangulation_angle*M_PI/180);\n  vw::stereo::StereoModel stereo_model(left_cam, right_cam,\n                                       angle_tol);\n\n  // Create space for horiz and vert vectors of size num_ip\n  int num_ip = left_ip.size();\n  std::vector<double> horiz_errors, vert_errors;\n\n  // Find the triangulated point and propagate the errors\n  for (int ip_it = 0; ip_it < num_ip; ip_it++) {\n    // Compute the error in the horizontal and vertical directions\n    vw::Vector2 left_pix(left_ip[ip_it].x, left_ip[ip_it].y);\n    vw::Vector2 right_pix(right_ip[ip_it].x, right_ip[ip_it].y);\n\n    Vector3 triVec(0, 0, 0), errorVec(0, 0, 0);\n    vw::Vector2 outStdev;\n    try {\n      triVec = stereo_model(left_pix, right_pix, errorVec);\n      outStdev = asp::propagateCovariance(triVec, datum,\n                                          stddev1, stddev2,\n                                          left_cam, right_cam,\n                                          left_pix, right_pix);\n    } catch (std::exception const& e) {\n      errorVec = Vector3(0, 0, 0);\n    }\n\n    if (errorVec == Vector3(0, 0, 0))\n      continue; // this can happen either because triangulation failed or an exception\n\n    horiz_errors.push_back(outStdev[0]);\n    vert_errors.push_back(outStdev[1]);\n  }\n\n  // Initialize the output\n  stats = asp::HorizVertErrorStats();\n  stats.left_cam_index  = left_cam_index;\n  stats.right_cam_index = right_cam_index;\n\n  if (!horiz_errors.empty()) {\n    stats.num_errors = horiz_errors.size();\n    stats.horiz_error_mean = vw::math::mean(horiz_errors);\n    stats.vert_error_mean = vw::math::mean(vert_errors);\n\n    if (horiz_errors.size() > 1) {\n      // This divides by num - 1\n      stats.horiz_error_stddev\n        = vw::math::standard_deviation(horiz_errors, stats.horiz_error_mean);\n      stats.vert_error_stddev\n        = vw::math::standard_deviation(vert_errors, stats.vert_error_mean);\n    }\n\n    // Leave this for the last\n    stats.horiz_error_median = vw::math::destructive_median(horiz_errors);\n    stats.vert_error_median = vw::math::destructive_median(vert_errors);\n  }\n\n  return;\n} // End function propagatedErrorStats\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Camera/BundleAdjustCamera.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file BundleAdjustCamera.h\n///\n\n/// Camera logic used in bundle_adjust. It is kept here as it may be\n/// expected to make use of all cameras supported by ASP.\n\n// Code which needs the stereo session should go to\n// asp/Sessions/CameraUtils.cc. Lower-level code which is not so tied\n// to data structures and options used in bundle_adjust can go to\n// BundleAdjustUtils.cc.\n\n#ifndef __BUNDLE_ADJUST_CAMERA_H__\n#define __BUNDLE_ADJUST_CAMERA_H__\n\n#include <asp/Core/BaBaseOptions.h>\n#include <asp/Core/BundleAdjustUtils.h>\n#include <asp/Camera/CsmModel.h>\n#include <asp/Camera/BaParams.h>\n#include <asp/Core/Bathymetry.h>\n\n#include <vw/Cartography/Datum.h>\n#include <vw/FileIO/GdalWriteOptions.h>\n#include <vw/FileIO/DiskImageView.h>\n\n#include <map>\n#include <set>\n#include <string>\n\nnamespace vw {\n  namespace ip {\n    class InterestPoint;\n  }\n  namespace camera {\n    class PinholeModel;\n    class OpticalBarModel;\n    class AdjustedCameraModel;\n  }\n}\n\nnamespace asp {\n\n// A structure to hold percentiles of given sorted values. This sorts the inputs.\n// The input can be float or double. We will keep the result as double.\nstruct MatchPairStats {\n  int left_cam_index, right_cam_index, num_vals;\n  double val25, val50, val75, val85, val95;\n  MatchPairStats(): left_cam_index(0), right_cam_index(0), num_vals(0), val25(0), val50(0),\n                    val75(0), val85(0), val95(0) {}\n  template<class T>\n  void populate(int left_index, int right_index, std::vector<T> & vals) {\n    std::sort(vals.begin(), vals.end());\n    left_cam_index  = left_index;\n    right_cam_index = right_index;\n    num_vals = vals.size();\n    if (num_vals > 0) {\n      val25 = vals[0.25*num_vals];\n      val50 = vals[0.50*num_vals];\n      val75 = vals[0.75*num_vals];\n      val85 = vals[0.85*num_vals];\n      val95 = vals[0.95*num_vals];\n    }\n  }\n};\n\nstruct HorizVertErrorStats {\n  int left_cam_index, right_cam_index;\n  float horiz_error_median, vert_error_median;\n  float horiz_error_mean, vert_error_mean;\n  float horiz_error_stddev, vert_error_stddev;\n  int num_errors;\n  HorizVertErrorStats(): left_cam_index(0), right_cam_index(0),\n                         horiz_error_median(0), vert_error_median(0),\n                         horiz_error_mean(0), vert_error_mean(0),\n                         horiz_error_stddev(0), vert_error_stddev(0),\n                         num_errors(0) {}\n};\n\n// When distortion params are shared, their number must agree\nvoid distortion_sanity_check(std::vector<int> const& num_dist_params,\n                             IntrinsicOptions const& intrinsics_opts,\n                             std::vector<double> const& intrinsics_limits);\n\n// Read image and camera lists. Can have several comma-separated lists\n// in image_list and camera_list, when sharing intrinsics per sensor.\nvoid read_image_cam_lists(std::string const& image_list,\n                std::string const& camera_list,\n                std::vector<std::string> & images,\n                std::vector<std::string> & cameras,\n                asp::IntrinsicOptions & intrinsics_opts);\n\n/// Load all of the reference disparities specified in the input text file\n/// and store them in the vectors.  Return the number loaded.\nint loadRefDisp(std::string const& disp_list_filename,\n                std::vector<vw::ImageView<vw::PixelMask<vw::Vector2f>>> & disp_vec,\n                std::vector<vw::ImageViewRef<vw::PixelMask<vw::Vector2f>>> & interp_disp);\n\n// Mapproject interest points onto a DEM and find the norm of their\n// disagreement in meters. It is assumed that dem_georef\n// was created by bilinear interpolation. The cameras must be with\n// the latest adjustments applied to them.\nvoid calcPairMapprojOffsets(int left_cam_index, int right_cam_index,\n                           std::vector<vw::CamPtr>            const& optimized_cams,\n                           std::vector<vw::ip::InterestPoint> const& left_ip,\n                           std::vector<vw::ip::InterestPoint> const& right_ip,\n                           vw::cartography::GeoReference      const& dem_georef,\n                           vw::ImageViewRef<vw::PixelMask<double>> const& interp_dem,\n                           // Will append below\n                           std::vector<vw::Vector<float, 4>>       & mapprojPoints,\n                           std::vector<float>                      & mapprojOffsets);\n\n/// Simple class to manage position/rotation information.\n/// - This is the data type stored in pc_align output files,\n///   bundle adjustment files, and the position of pinhole cameras.\nclass CameraAdjustment {\npublic:\n\n  // Constructors\n  CameraAdjustment();\n  CameraAdjustment(double const* array);\n\n  // Data access\n  vw::Vector3 position() const;\n  vw::Quat    pose    () const;\n\n  /// Populate from a six element array.\n  void read_from_array(double const* array);\n\n  /// Populate from an AdjustedCameraModel\n  void copy_from_adjusted_camera(vw::camera::AdjustedCameraModel const& cam);\n\n  /// Populate from a PinholeModel\n  void copy_from_pinhole(vw::camera::PinholeModel const& cam);\n\n  /// Populate from OpticalBarModel\n  void copy_from_optical_bar(vw::camera::OpticalBarModel const& cam);\n\n  /// Populate from CSM. Since with CSM we apply adjustments to existing\n  /// cameras, these start as 0.\n  void copy_from_csm(asp::CsmModel const& cam);\n\n  /// Populate from an adjustment file on disk.\n  void read_from_adjust_file(std::string const& filename);\n\n  /// Pack the data to a six element array.\n  void pack_to_array(double* array) const;\n\nprivate:\n  vw::Vector3 m_position_data;\n  vw::Quat    m_pose_data;\n\n}; // End class CameraAdjustment\n\n/// Packs info from various camera models into the provided arrays.\n/// - It is up to the caller to make sure the arrays are properly sized.\nvoid pack_pinhole_to_arrays(vw::camera::PinholeModel const& camera,\n                            int camera_index,\n                            asp::BaParams & param_storage);\nvoid pack_optical_bar_to_arrays(vw::camera::OpticalBarModel const& camera,\n                                int camera_index,\n                                asp::BaParams & param_storage);\n// This does not copy the camera position and orientation\nvoid pack_csm_to_arrays(asp::CsmModel const& camera,\n                        int camera_index,\n                        asp::BaParams & param_storage);\n\n// Given an input pinhole camera and param changes, apply those, returning\n// the new camera.\nvw::camera::PinholeModel transformedPinholeCamera(int camera_index,\n                                                  asp::BaParams const& param_storage,\n                                                  vw::camera::PinholeModel const& in_cam);\n\n// Given an input optical bar camera and param changes, apply those, returning\n// the new camera.\nvw::camera::OpticalBarModel transformedOpticalBarCamera(int camera_index,\n                                                        asp::BaParams const& param_storage,\n                                                        vw::camera::OpticalBarModel const& in_cam);\n\n// Given an input CSM camera and param changes, apply those, returning\n// the new camera.\nboost::shared_ptr<asp::CsmModel> transformedCsmCamera(int camera_index,\n                                                      asp::BaParams const& param_storage,\n                                                      asp::CsmModel const& in_cam);\n\n/// Given a transform with origin at the planet center, like output by pc_align,\n/// read the adjustments from param storage, apply this transform on top of\n/// them, and write the adjustments back to the param storage. Cameras\n/// do not change.\nvoid apply_transform_to_params(vw::Matrix4x4 const& M, asp::BaParams &param_storage,\n                                std::vector<vw::CamPtr>\n                                const& cam_ptrs);\n\n// This function takes advantage of the fact that when it is called the cam_ptrs have the same\n//  information as is in param_storage!\nvoid apply_transform_to_cameras_pinhole(vw::Matrix4x4 const& M,\n                                        asp::BaParams & param_storage,\n                                        std::vector<vw::CamPtr>\n                                        const& cam_ptrs);\n\n// This function takes advantage of the fact that when it is called the cam_ptrs have the same\n//  information as is in param_storage!\nvoid apply_transform_to_cameras_optical_bar(vw::Matrix4x4 const& M,\n                                            asp::BaParams & param_storage,\n                                            std::vector<vw::CamPtr>\n                                            const& cam_ptrs);\n\nvoid apply_transform_to_cameras_csm(vw::Matrix4x4 const& M,\n                                    asp::BaParams & param_storage,\n                                    std::vector<vw::CamPtr>\n                                    const& cam_ptrs);\n\n/// Apply a scale-rotate-translate transform to pinhole cameras and control points\nvoid apply_rigid_transform(vw::Matrix3x3 const & rotation,\n                           vw::Vector3   const & translation,\n                           double                scale,\n                           std::vector<vw::CamPtr> &camera_models,\n                           boost::shared_ptr<vw::ba::ControlNetwork> const& cnet);\n\n/// Generate a warning if the GCP's are really far from the IP points\n/// - This is intended to help catch the common lat/lon swap in GCP files.\nvoid check_gcp_dists(std::vector<vw::CamPtr> const& camera_models,\n                     boost::shared_ptr<vw::ba::ControlNetwork> const& cnet_ptr,\n                     double forced_triangulation_distance);\n\n/// Initialize the position and orientation of each pinhole camera model using\n///  a least squares error transform to match the provided camera positions.\n/// - This function overwrites the camera parameters in-place\nbool init_pinhole_model_with_camera_positions\n(boost::shared_ptr<vw::ba::ControlNetwork> const& cnet,\n std::vector<vw::CamPtr> & camera_models,\n std::vector<std::string> const& image_files,\n std::vector<vw::Vector3> const & estimated_camera_gcc);\n\n/// Initialize the position and orientation of a pinhole camera model using\n/// GCP. It invokes OpenCV's PnP functionality.\nvoid init_camera_using_gcp(boost::shared_ptr<vw::ba::ControlNetwork> const& cnet_ptr,\n                           std::vector<vw::CamPtr> & camera_models);\n\n/// Initialize the position and orientation of each pinhole camera model using\n///  a least squares error transform to match the provided control points file.\n/// This function overwrites the camera parameters in-place. It works\n/// if at least three GCP are seen in no less than two images.\nvoid transform_cameras_with_shared_gcp(boost::shared_ptr<vw::ba::ControlNetwork> const& cnet_ptr,\n                       std::vector<vw::CamPtr> & camera_models);\n\n// Given at least two images, each having at least 3 GCP that are not seen in other\n// images, find and apply a transform to the camera system based on them.\nvoid transform_cameras_with_indiv_image_gcp\n  (boost::shared_ptr<vw::ba::ControlNetwork> const& cnet_ptr,\n   std::vector<vw::CamPtr> & camera_models);\n\n// TODO(oalexan1): Move the asp namespace to encompass the whole header file\n// Save convergence angle percentiles for each image pair having matches\nvoid saveConvergenceAngles(std::string const& conv_angles_file,\n                           std::vector<asp::MatchPairStats> const& convAngles,\n                           std::vector<std::string> const& imageFiles);\n\n// Save propagated horizontal and vertical errors\nvoid saveHorizVertErrors(std::string const& horiz_vert_errors_file,\n                         std::vector<asp::HorizVertErrorStats> const& horizVertErrors,\n                         std::vector<std::string> const& imageFiles);\n\n// Save mapprojected matches offsets for each image pair having matches\nvoid saveMapprojOffsets(std::string                       const& out_prefix,\n                        vw::cartography::GeoReference     const& mapproj_dem_georef,\n                        std::vector<vw::Vector<float, 4>> const& mapprojPoints,\n                        std::vector<asp::MatchPairStats>  const& mapprojOffsets,\n                        std::vector<std::vector<float>>        & mapprojOffsetsPerCam,\n                        std::vector<std::string>          const& imageFiles);\n\n// Write a pinhole camera file to disk after updating the intrinsics and\n// extrinsics. Return the path to the saved file.\nstd::string savePinholeCam(asp::BaBaseOptions const& opt, int icam,\n                           vw::cartography::Datum const& datum,\n                           asp::BaParams const& param_storage);\n\n// Write an optical bar camera file to disk after updating the intrinsics and\n// extrinsics. Return the path to the saved file.\nstd::string saveOpticalBarCam(asp::BaBaseOptions const& opt, int icam,\n                              vw::cartography::Datum const& datum,\n                              asp::BaParams const& param_storage);\n\n// Write a CSM camera file to disk. Assumes that the intrinsics are optimized.\nstd::string saveCsmCamUpdateIntr(asp::BaBaseOptions const& opt, int icam,\n                                 vw::cartography::Datum const& datum,\n                                 asp::BaParams const& param_storage);\n\n// Write a camera adjustment file to disk, and potentially a camera file with\n// the adjustments applied to it. Return the path to the saved file.\nstd::string saveAdjustedCam(asp::BaBaseOptions const& opt, int icam,\n                            asp::BaParams const& param_storage);\n\n// Write updated camera models to disk\nvoid saveUpdatedCameras(asp::BaBaseOptions const& opt,\n                        asp::BaParams const& param_storage);\n\n// Save CSM cameras\nvoid saveCsmCameras(std::string const& out_prefix,\n                    std::string const& stereo_session,\n                    std::vector<std::string> const& image_files,\n                    std::vector<std::string> const& camera_files,\n                    std::vector<vw::CamPtr>  const& camera_models,\n                    bool update_isis_cubes_with_csm_state);\n\n// Calculate convergence angles. Remove the outliers flagged earlier,\n// if remove_outliers is true. Compute offsets of mapprojected matches,\n// if a DEM is given. These are done together as they rely on\n// reloading interest point matches, which is expensive so the matches\n// are used for both operations.\n\nvoid matchFilesProcessing(vw::ba::ControlNetwork       const& cnet,\n                          asp::BaBaseOptions           const& opt,\n                          std::vector<vw::CamPtr>      const& optimized_cams,\n                          bool                                remove_outliers,\n                          std::set<int>                const& outliers,\n                          std::string                  const& mapproj_dem,\n                          bool                                propagate_errors,\n                          vw::Vector<double>           const& horizontal_stddev_vec,\n                          bool                                save_clean_matches,\n                          std::map<std::pair<int, int>, std::string> const& match_files,\n                          bool                                matches_as_txt);\n\n/// This is for the BundleAdjustmentModel class where the camera parameters\n/// are a rotation/offset that is applied on top of the existing camera model.\n/// First read initial adjustments, if any, and apply perhaps a pc_align transform.\n/// We assume the initial transform was already read and validated.\nbool init_cams(asp::BaBaseOptions const& opt, asp::BaParams & param_storage,\n       std::string const& initial_transform_file, vw::Matrix<double> const& initial_transform,\n       std::vector<vw::CamPtr> & new_cam_models);\n\n/// Specialization for pinhole cameras.\nbool init_cams_pinhole(asp::BaBaseOptions const& opt, asp::BaParams & param_storage,\n     std::string const& initial_transform_file, vw::Matrix<double> const& initial_transform,\n     std::vector<vw::CamPtr> & new_cam_models);\n\n// TODO: Share more code with the similar pinhole case.\n/// Specialization for optical bar cameras.\nbool init_cams_optical_bar(asp::BaBaseOptions const& opt, asp::BaParams & param_storage,\n                    std::string const& initial_transform_file,\n                    vw::Matrix<double> const& initial_transform,\n                    std::vector<vw::CamPtr> &new_cam_models);\n\n// TODO: Share more code with the similar pinhole case.\n/// Specialization for CSM cameras.\nbool init_cams_csm(asp::BaBaseOptions const& opt, asp::BaParams & param_storage,\n                   std::string const& initial_transform_file,\n                   vw::Matrix<double> const& initial_transform,\n                   std::vector<vw::CamPtr> &new_cam_models);\n\n// Save pinhole camera positions and orientations in a single file.\n// Only works with Pinhole cameras.\nvoid saveCameraReport(asp::BaBaseOptions const& opt, asp::BaParams const& param_storage,\n                      vw::cartography::Datum const& datum,\n                      std::string const& prefix);\n\n/// For each option, the string must include a subset of the entries:\n///  \"focal_length, optical_center, distortion_params\"\n/// - Need the extra boolean to handle the case where --intrinsics-to-share\n///   is provided as \"\" in order to share none of them.\nvoid load_intrinsics_options(bool        solve_intrinsics,\n                             bool        shared_is_specified,\n                             std::string intrinsics_to_float_str, // make a copy\n                             std::string intrinsics_to_share_str, // make a copy\n                             asp::IntrinsicOptions & intrinsics_options);\n\n/// Attempt to automatically create the overlap list file estimated\n///  footprints for each of the input images.\n/// - Currently this only supports cameras with Worldview style XML files.\nvoid auto_build_overlap_list(asp::BaBaseOptions &opt, double lonlat_buffer);\n\n// Parse data needed for error propagation. Note that horizontal_stddevs\n// comes from the user, or is otherwise populated from cameras.\nvoid setup_error_propagation(std::string const& session_name,\n                             double horizontal_stddev,\n                             std::vector<vw::CamPtr> const& cameras,\n                             vw::Vector<double> & horizontal_stddev_vec);\n\n// Find stats of propagated errors\nvoid propagatedErrorStats(size_t left_cam_index, size_t right_cam_index,\n                          vw::camera::CameraModel const * left_cam,\n                          vw::camera::CameraModel const * right_cam,\n                          std::vector<vw::ip::InterestPoint> const& left_ip,\n                          std::vector<vw::ip::InterestPoint> const& right_ip,\n                          double stddev1, double stddev2,\n                          vw::cartography::Datum const& datum,\n                          // Output\n                          asp::HorizVertErrorStats & stats);\n\n// Find the cameras with the latest adjustments. Note that we do not modify\n// opt.camera_models, but make copies as needed.\nvoid calcOptimizedCameras(asp::BaBaseOptions const& opt,\n                          asp::BaParams const& param_storage,\n                          std::vector<vw::CamPtr> & optimized_cams);\n\n// Find the average for the gsd for all pixels whose rays intersect at the given\n// triangulated point. This is used in jitter solving.\nvoid estimateGsdPerTriPoint(std::vector<std::string> const& images,\n                            std::vector<vw::CamPtr>  const& cameras,\n                            asp::CRN                const& crn,\n                            asp::BaParams            const& param_storage,\n                            // Output\n                            std::vector<double>     & gsds);\n\n// This is a version of the above used in jitter solving.\nvoid estimateGsdPerTriPoint(std::vector<std::string> const& images,\n                            std::vector<vw::CamPtr>  const& cameras,\n                            asp::CRN                const& crn,\n                            std::set<int>            const& outliers,\n                            std::vector<double>      const& tri_points_vec,\n                            // Output\n                            std::vector<double>     & gsds);\n\n// Parse the string of limits and make sure they are all valid pairs.\nvoid parse_intrinsics_limits(std::string const& intrinsics_limits_str,\n                             std::vector<double> & intrinsics_limits);\n\n// This function returns only one camera center per camera\nvoid calcCameraCenters(std::vector<vw::CamPtr>  const& cams,\n                       std::vector<vw::Vector3>      & cam_positions);\n\n// This function returns all camera center samples for linescan cameras\nvoid calcCameraCenters(std::string const& stereo_session,\n                       std::vector<vw::CamPtr>  const& cams,\n                       std::vector<std::vector<vw::Vector3>> & cam_positions);\n\n// Interface for setting/getting intrinsics for all supported camera models\nvoid get_optical_center(vw::camera::CameraModel const* cam, vw::Vector2 & center);\nvoid set_optical_center(vw::camera::CameraModel* cam, vw::Vector2 const& center);\nvoid get_focal_length(vw::camera::CameraModel const* cam, double & focal);\nvoid set_focal_length(vw::camera::CameraModel* cam, double const& focal);\nvoid get_distortion(vw::camera::CameraModel const* cam, vw::Vector<double> &dist);\nvoid set_distortion(vw::camera::CameraModel* cam, vw::Vector<double> const& dist);\n\n// If some cameras share an intrinsic parameter, that parameter must start with\n// the same value for all cameras sharing it. This is a bugfix. Return\n// true if the cameras were modified.\nbool syncUpInitialSharedParams(BACameraType camera_type,\n                               asp::BaParams const& param_storage,\n                               std::vector<vw::CamPtr>& camera_models);\n\n// This is needed to allocate enough storage for the distortion parameters.\nint calcMaxNumDistParams(std::vector<vw::CamPtr> const& camera_models,\n                         BACameraType camera_type,\n                         IntrinsicOptions const& intrinsics_opts,\n                         std::vector<double> const& intrinsics_limits);\n\n// This is needed to ensure distortion coefficients are not so small\n// that they don't get optimized. This modifies the camera models in place.\nvoid ensureMinDistortion(std::vector<vw::CamPtr> & camera_models,\n                         BACameraType camera_type,\n                         IntrinsicOptions const& intrinsics_opts,\n                         std::vector<int> const& fixed_distortion_indices,\n                         int max_num_dist_params,\n                         double min_distortion);\n\n// Sanity check. This does not prevent the user from setting the wrong datum,\n// but it can catch unreasonable height values for GCP.\nvoid checkGcpRadius(vw::cartography::Datum const& datum,\n                    vw::ba::ControlNetwork const& cnet);\n\n// Some logic for camera position uncertainty, used in bundle_adjust and jitter_solve\nvoid handleCameraPositionUncertainty(asp::BaBaseOptions & opt, bool have_datum);\n\n} // end namespace asp\n\n#endif // __BUNDLE_ADJUST_CAMERA_H__\n"
  },
  {
    "path": "src/asp/Camera/BundleAdjustCamera2.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file BundleAdjustCamera2.cc\n///\n\n// Move some code here because BundleAdjustCamera.cc is getting too big.\n// These are all very related functions that are not easy to split into\n// separate files by functionality.\n// TODO(oalexan1): Move most of BundleAdjustCamera.h code to here, and put it\n// all in the asp namespace. \n\n#include <asp/Camera/LinescanUtils.h>\n#include <asp/Camera/RPC_XML.h>\n#include <asp/Camera/RPCModel.h>\n#include <asp/Camera/RPCModelGen.h>\n#include <asp/Camera/CameraErrorPropagation.h>\n#include <asp/Camera/LinescanUtils.h>\n#include <asp/Camera/CsmModel.h>\n#include <asp/Camera/BundleAdjustCamera.h>\n#include <asp/Core/BaseCameraUtils.h>\n#include <asp/Core/IpMatchingAlgs.h>\n#include <asp/Core/FileUtils.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/asp_config.h> // defines ASP_HAVE_PKG_ISIS\n\n#if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1\n#include <asp/IsisIO/IsisInterface.h>\n#endif // ASP_HAVE_PKG_ISIS\n\n#include <vw/Camera/PinholeModel.h>\n#include <vw/Camera/LensDistortion.h>\n#include <vw/Camera/OpticalBarModel.h>\n#include <vw/Camera/CameraImage.h>\n#include <vw/Core/Stopwatch.h>\n#include <vw/Core/StringUtils.h>\n\n#include <usgscsm/UsgsAstroLsSensorModel.h>\n\n#include <boost/algorithm/string.hpp>\n\n#include <set>\n#include <string>\n\nusing namespace vw;\nusing namespace vw::camera;\nusing namespace vw::ba;\n\nnamespace asp {\n\n// Read previous adjustments and store them in params. The params must be well-formed\n// by now, but any prior adjustment in them will be overwritten.\nvoid put_adjustments_in_params(std::string const& input_prefix,\n                               std::vector<std::string> const& image_files,\n                               std::vector<std::string> const& camera_files,\n                               // Output\n                               asp::BaParams & param_storage) {\n\n  const size_t num_cameras = param_storage.num_cameras();\n\n  for (size_t icam = 0; icam < num_cameras; icam++) {\n    std::string adjust_file\n      = asp::bundle_adjust_file_name(input_prefix, image_files[icam], camera_files[icam]);\n\n    double * cam_ptr = param_storage.get_camera_ptr(icam);\n    CameraAdjustment adjustment;\n    adjustment.read_from_adjust_file(adjust_file);\n    adjustment.pack_to_array(cam_ptr);\n  }\n}\n\n// Take input cameras and corrections in param_storage, and create new cameras\n// incorporating the corrections. \nvoid create_corrected_cameras(std::vector<vw::CamPtr> const& input_cameras,\n                              asp::BaParams const& param_storage,\n                              std::vector<vw::CamPtr> & out_cameras) {\n  const size_t num_cameras = param_storage.num_cameras();\n  out_cameras.resize(num_cameras);\n\n  for (size_t icam = 0; icam < num_cameras; icam++) {\n    CameraAdjustment correction(param_storage.get_camera_ptr(icam));\n    // The pointer is managed by vw::CamPtr\n    out_cameras[icam] = vw::CamPtr(new camera::AdjustedCameraModel(input_cameras[icam],\n                                   correction.position(), correction.pose()));\n  }\n}\n\n/// Create the param storage. Collect in it any input adjustments and initial transform.\n/// Return a copy of the cameras having these adjustments applied to them.\nbool init_cams(asp::BaBaseOptions const& opt, asp::BaParams & param_storage,\n       std::string const& initial_transform_file, vw::Matrix<double> const& initial_transform,\n       std::vector<vw::CamPtr> & new_cam_models) {\n\n  bool cameras_changed = false;\n\n  // Initialize all of the camera adjustments to zero.\n  param_storage.init_cams_as_zero();\n  const size_t num_cameras = param_storage.num_cameras();\n\n  // Sanity check, must have same number of cameras\n  if (num_cameras != opt.camera_models.size())\n      vw_throw(ArgumentErr() << \"Expecting \" << num_cameras << \" cameras, got \"\n                           << opt.camera_models.size() << \".\\n\");\n\n  // Read the adjustments from a previous run, if present. Put them in params.\n  if (opt.input_prefix != \"\") {\n    put_adjustments_in_params(opt.input_prefix, opt.image_files, opt.camera_files,\n                              param_storage); // output\n    cameras_changed = true;\n  }\n\n  // Apply any initial transform to params\n  if (initial_transform_file != \"\") {\n    if (opt.stereo_session == \"csm\") {\n      double scale = pow(vw::math::det(initial_transform), 1.0/3.0);\n      if (std::abs(scale - 1.0) > 1e-6) {\n        // TODO(oalexan1): This gives wrong results for now so needs to be sorted out.\n        // Likely the only way to apply a scale to a linescan camera is to multiply\n        // all camera centers by the scale. Using a rotation and translation center\n        // like for AdjustedCameraModel is not enough.\n        vw_throw(ArgumentErr()\n                 << \"CSM camera models do not support applying a transform with a scale.\\n\");\n      }\n    }\n\n    // Update param_storage with the alignment. This may be on top of any initial adjustment.\n    // from the previous code, already contained in param_storage. Cameras\n    // do not change.\n    apply_transform_to_params(initial_transform, param_storage, opt.camera_models);\n    cameras_changed = true;\n  }\n\n  // Make a copy of the cameras with given corrections in param_storage, incorporating\n  // any adjustments and initial transform.\n  create_corrected_cameras(opt.camera_models, param_storage, new_cam_models);\n\n  return cameras_changed;\n}\n\n/// Specialization for pinhole cameras\nbool init_cams_pinhole(asp::BaBaseOptions const& opt, asp::BaParams & param_storage,\n     std::string const& initial_transform_file, vw::Matrix<double> const& initial_transform,\n     std::vector<vw::CamPtr> & new_cam_models) {\n\n  bool cameras_changed = false;\n\n  // Copy the camera parameters from the models to param_storage\n  const size_t num_cameras = param_storage.num_cameras();\n\n  for (int icam = 0; icam < num_cameras; icam++) {\n    PinholeModel* pin_ptr = dynamic_cast<PinholeModel*>(opt.camera_models[icam].get());\n\n    // Make a deep copy of the camera, including of the lens distortion\n    PinholeModel pin_cam = *pin_ptr;\n\n    // Read the adjustments from a previous run, if present\n    if (opt.input_prefix != \"\") {\n      std::string adjust_file\n        = asp::bundle_adjust_file_name(opt.input_prefix, opt.image_files[icam],\n                                       opt.camera_files[icam]);\n      vw_out() << \"Reading input adjustment: \" << adjust_file << \"\\n\";\n      CameraAdjustment adjustment;\n      adjustment.read_from_adjust_file(adjust_file);\n\n      // Strictly speaking, it is not necessary to call unadjusted_model(), as\n      // in bundle_adjust the input cameras are loaded unadjusted, unlike in stereo.\n      AdjustedCameraModel adj_cam(vw::camera::unadjusted_model(opt.camera_models[icam]),\n                                  adjustment.position(), adjustment.pose());\n      vw::Matrix4x4 ecef_transform = adj_cam.ecef_transform();\n      pin_cam.apply_transform(ecef_transform);\n\n      cameras_changed = true;\n    }\n\n    // Apply any initial transform to the pinhole cameras. This may be on top\n    // of any initial adjustment. \n    if (initial_transform_file != \"\") {\n      pin_cam.apply_transform(initial_transform);\n      cameras_changed = true;\n    }\n\n    pack_pinhole_to_arrays(pin_cam, icam, param_storage);\n  } // End loop through cameras\n\n  // Fill out the new camera model vector\n  new_cam_models.resize(num_cameras);\n  for (size_t icam = 0; icam < num_cameras; icam++) {\n\n    PinholeModel* in_cam  = dynamic_cast<PinholeModel*>(opt.camera_models[icam].get());\n\n    // Start with a deep copy of the input camera. Then overwrite its parameters.\n    PinholeModel* out_cam = new PinholeModel(*in_cam); // deep copy, memory managed below\n    *out_cam = transformedPinholeCamera(icam, param_storage, *in_cam);\n    new_cam_models[icam] = vw::CamPtr(out_cam);\n  }\n\n  return cameras_changed;\n}\n\n// TODO: Share more code with the similar pinhole case.\n/// Specialization for optical bar cameras.\nbool init_cams_optical_bar(asp::BaBaseOptions const& opt, asp::BaParams & param_storage,\n                    std::string const& initial_transform_file,\n                    vw::Matrix<double> const& initial_transform,\n                    std::vector<vw::CamPtr> &new_cam_models) {\n\n  if (opt.input_prefix != \"\")\n    vw::vw_throw(vw::ArgumentErr()\n                 << \"Applying initial adjustments to optical bar cameras \"\n                 << \"and --inline-adjustments is not implemented. \"\n                 << \"Remove this option.\\n\");\n\n  bool cameras_changed = false;\n\n  // Copy the camera parameters from the models to param_storage\n  const size_t num_cameras = param_storage.num_cameras();\n  for (int icam = 0; icam < num_cameras; icam++) {\n    vw::camera::OpticalBarModel* bar_ptr\n      = dynamic_cast<vw::camera::OpticalBarModel*>(opt.camera_models[icam].get());\n    pack_optical_bar_to_arrays(*bar_ptr, icam, param_storage);\n  } // End loop through cameras\n\n  // Apply any initial transform to the pinhole cameras\n  if (initial_transform_file != \"\") {\n    apply_transform_to_cameras_optical_bar(initial_transform, param_storage, opt.camera_models);\n    cameras_changed = true;\n  }\n\n  // Fill out the new camera model vector\n  new_cam_models.resize(num_cameras);\n  for (size_t icam = 0; icam < num_cameras; icam++) {\n\n    vw::camera::OpticalBarModel* in_cam\n      = dynamic_cast<vw::camera::OpticalBarModel*>(opt.camera_models[icam].get());\n\n    // Start with a copy of the input camera, then overwrite its content.\n    // The pointer is managed below.\n    vw::camera::OpticalBarModel* out_cam = new vw::camera::OpticalBarModel(*in_cam);\n    *out_cam = transformedOpticalBarCamera(icam, param_storage, *in_cam);\n    new_cam_models[icam] = boost::shared_ptr<camera::CameraModel>(out_cam);\n  }\n\n  return cameras_changed;\n}\n\n// TODO: Share more code with the similar pinhole case.\n/// Specialization for CSM\nbool init_cams_csm(asp::BaBaseOptions const& opt, asp::BaParams & param_storage,\n                   std::string const& initial_transform_file,\n                   vw::Matrix<double> const& initial_transform,\n                   std::vector<vw::CamPtr> &new_cam_models) {\n\n  bool cameras_changed = false;\n\n  // Apply any adjustments inline. Copy the camera parameters from the models to\n  // param_storage. Do not copy the adjustments, as they are already applied\n  // to the camera proper.\n  const size_t num_cameras = param_storage.num_cameras();\n  for (int icam = 0; icam < num_cameras; icam++) {\n    asp::CsmModel* csm_ptr\n        = dynamic_cast<asp::CsmModel*>(opt.camera_models[icam].get());\n\n    // Read the adjustments from a previous run, if present. Apply them\n    // inline to the camera model.\n    if (opt.input_prefix != \"\") {\n      std::string adjust_file\n        = asp::bundle_adjust_file_name(opt.input_prefix, opt.image_files[icam],\n                                       opt.camera_files[icam]);\n      vw_out() << \"Reading input adjustment: \" << adjust_file << \"\\n\";\n      CameraAdjustment adjustment;\n      adjustment.read_from_adjust_file(adjust_file);\n\n      // Strictly speaking, it is not necessary to call unadjusted_model(), as\n      // in bundle_adjust the input cameras are loaded unadjusted, unlike in stereo.\n      AdjustedCameraModel adj_cam(vw::camera::unadjusted_model(opt.camera_models[icam]),\n                                  adjustment.position(), adjustment.pose());\n      vw::Matrix4x4 ecef_transform = adj_cam.ecef_transform();\n      csm_ptr->applyTransform(ecef_transform);\n\n      cameras_changed = true;\n    }\n\n    // This does not copy the camera position and orientation, only the intrinsics    \n    pack_csm_to_arrays(*csm_ptr, icam, param_storage);\n  } // End loop through cameras\n\n  // Apply any initial transform to the CSM cameras\n  if (initial_transform_file != \"\") {\n    // Apply the transform to the cameras inline. This modifies opt.camera_models.\n    // The transform does not get copied to param_storage. Only intrinsics get copied.\n    apply_transform_to_cameras_csm(initial_transform, param_storage, opt.camera_models);\n    cameras_changed = true;\n  }\n\n  // Fill out the new camera model vector\n  new_cam_models.resize(num_cameras);\n  for (size_t icam = 0; icam < num_cameras; icam++) {\n\n    asp::CsmModel* in_cam\n      = dynamic_cast<asp::CsmModel*>(opt.camera_models[icam].get());\n    if (in_cam == NULL)\n      vw_throw(ArgumentErr() << \"Expecting a CSM camera.\\n\");\n\n    auto out_cam = transformedCsmCamera(icam, param_storage, *in_cam);\n    new_cam_models[icam] = boost::shared_ptr<camera::CameraModel>(out_cam);\n  }\n\n  return cameras_changed;\n}\n\n// When distortion params are shared, their number must agree\nvoid distortion_sanity_check(std::vector<int> const& num_dist_params,\n                             IntrinsicOptions const& intrinsics_opts,\n                             std::vector<double> const& intrinsics_limits) {\n\n  // If nothing is shared, there is nothing to do\n\n  // If all distortion params are shared, all sizes must agree\n  if (!intrinsics_opts.share_intrinsics_per_sensor &&\n      intrinsics_opts.distortion_shared) {\n    for (size_t it = 1; it < num_dist_params.size(); it++) {\n      if (num_dist_params[it] != num_dist_params[0])\n           vw_throw(ArgumentErr() << \"When sharing distortion parameters, \"\n             << \"they must have the same size.\\n\");\n    }\n  }\n\n  // If distortion is shared per sensor\n  if (intrinsics_opts.share_intrinsics_per_sensor) {\n    std::vector<std::set<int>> dist_sizes(intrinsics_opts.num_sensors);\n    for (size_t cam_it = 0; cam_it < num_dist_params.size(); cam_it++) {\n      int sensor_it = intrinsics_opts.cam2sensor[cam_it];\n      dist_sizes[sensor_it].insert(num_dist_params[cam_it]); // all found sizes\n    }\n    // Now check that each dist_sizes[sensor_it] has size 1\n    for (size_t sensor_it = 0; sensor_it < intrinsics_opts.num_sensors; sensor_it++) {\n      if (dist_sizes[sensor_it].size() != 1)\n        vw_throw(ArgumentErr() << \"When sharing distortion parameters per sensor, \"\n         << \"they must have the same size for all cameras of the same sensor.\\n\");\n    }\n  }\n\n  // Intrinsics limits only can be used for now when all distortion vectors have\n  // the same size. This could be fixed but it is a rarely used option\n  // and would require a lot of bookkeeping.\n  if (!intrinsics_limits.empty()) {\n    bool have_same_size = true;\n    for (size_t it = 1; it < num_dist_params.size(); it++) {\n      if (num_dist_params[it] != num_dist_params[0]) {\n        have_same_size = false;\n        break;\n      }\n    }\n    if (!have_same_size)\n      vw_throw(ArgumentErr() << \"When using --intrinsics-limits, all cameras \"\n               << \"must have the same number of distortion coefficients.\\n\");\n  }\n\n  return;\n}\n\n// A little function to replace separators with space. Note that the backslash\n// is a separator, in case, it used as a continuation line.\nvoid replace_separators_with_space(std::string & str) {\n  std::string sep = \"\\\\:;, \\t\\r\\n\";\n  for (size_t it = 0; it < sep.size(); it++)\n    std::replace(str.begin(), str.end(), sep[it], ' ');\n}\n\n// Split a string into a vector of strings with space as separator\nstd::vector<std::string> split_str_with_space(std::string const& str) {\n  std::istringstream is(str);\n  std::vector<std::string> ret;\n  std::string val;\n  while (is >> val)\n    ret.push_back(val);\n  return ret;\n}\n\n// Function that tells if a string is a non-negative integer\nbool is_str_non_neg_integer(std::string const& str) {\n  if (str.empty()) return false;\n  for (size_t it = 0; it < str.size(); it++) {\n    if (!isdigit(str[it])) return false;\n  }\n  return true;\n}\n\n// Parse format:\n// \"1:focal_length,optical_center 2:focal_length,other_intrinsics 3:none\"  \n// Applies when optimizing intrinsics per sensor.\n// The numbers are sensor indices, starting with 1.\nvoid fine_grained_parse(bool share_intrinsics_per_sensor,\n                        int num_sensors,\n                        std::vector<std::string> const& options,\n                        // Outputs\n                        std::vector<bool> & float_center,\n                        std::vector<bool> & float_focus,\n                        std::vector<bool> & float_distortion) {\n\n  // Sanity checks\n  if (!share_intrinsics_per_sensor)\n    vw_throw(ArgumentErr() << \"Intrinsics are not being optimized per sensor. Remove any \"\n             << \"fields of the form 1:, etc., from the options for floating intrinsics.\\n\");\n\n  if (num_sensors <= 0)\n    vw_throw(ArgumentErr() << \"Expecting a positive number of sensors.\\n\");\n  if (options.empty())\n    vw_throw(ArgumentErr() << \"Expecting at least one option.\\n\");\n\n  // Wipe the outputs\n  float_center.clear();\n  float_focus.clear();\n  float_distortion.clear();\n\n  // It is convenient to initialize all to false. 0th element must always exist.\n  for (int i = 0; i < std::max(num_sensors, 1); i++) {\n    float_center.push_back(false);\n    float_focus.push_back(false);\n    float_distortion.push_back(false);\n  }\n\n  // First entity must be an integer. That is sensor id, starting from 1.\n  if (!is_str_non_neg_integer(options[0]))\n    vw_throw(ArgumentErr() << \"Expecting an integer as the first option.\\n\");\n\n  int sensor_id = atoi(options[0].c_str()) - 1; // subtract 1 to make it zero-based\n\n  // check for duplicate ids\n  std::set<int> seen_ids;\n  // Iterate over options\n  for (size_t it = 0; it < options.size(); it++) {\n\n    // If it is an integer, update the sensor id, and continue.\n    // Subtract 1 to make it zero-based.\n    if (is_str_non_neg_integer(options[it])) {\n      sensor_id = atoi(options[it].c_str()) - 1;\n\n      // Sensor id must be in bounds\n      if (sensor_id < 0 || sensor_id >= num_sensors)\n        vw_throw(ArgumentErr() << \"Sensor id \" << options[it] << \" is out of bounds.\\n\");\n\n      // If seen, that's a problem\n      if (seen_ids.find(sensor_id) != seen_ids.end())\n        vw_throw(ArgumentErr() << \"Sensor id \" << options[it] << \" is repeated.\\n\");\n      // Record as seen\n      seen_ids.insert(sensor_id);\n\n      continue;\n    }\n\n    // Handle the optical center\n    if (options[it] == \"optical_center\") {\n      float_center[sensor_id] = true;\n      continue;\n    }\n\n    // Handle the focal length\n    if (options[it] == \"focal_length\") {\n      float_focus[sensor_id] = true;\n      continue;\n    }\n\n    // Handle the distortion (other_intrinsics)\n    if (options[it] == \"other_intrinsics\" || options[it] == \"distortion\") {\n      float_distortion[sensor_id] = true;\n      continue;\n    }\n\n    // For all, populate all fields\n    if (options[it] == \"all\") {\n      float_center[sensor_id]     = true;\n      float_focus[sensor_id]      = true;\n      float_distortion[sensor_id] = true;\n      continue;\n    }\n\n    // For none, just skip\n    if (options[it] == \"none\") {\n      continue;\n    }\n\n    vw_throw(ArgumentErr() << \"Found unknown option when parsing which \"\n              << \"sensor intrinsics to float: \" << options[it] << \".\\n\");\n  }\n}\n\n// Parse format:\n// \"focal_length optical_center other_intrinsics\"\n// Applies to all sensors and when not optimizing intrinsics per sensor.\nvoid coarse_grained_parse(int num_sensors,\n                          std::vector<std::string> const& options,\n                          // Outputs\n                          std::vector<bool> & float_center,\n                          std::vector<bool> & float_focus,\n                          std::vector<bool> & float_distortion) {\n\n  // Wipe the outputs\n  float_center.clear();\n  float_focus.clear();\n  float_distortion.clear();\n\n  if (num_sensors < 0)\n    vw_throw(ArgumentErr() << \"Cameras were not parsed correctly.\\n\");\n\n   // It is convenient to initialize all to false. 0th element must always exist.\n  for (int i = 0; i < std::max(num_sensors, 1); i++) {\n    float_center.push_back(false);\n    float_focus.push_back(false);\n    float_distortion.push_back(false);\n  }\n\n  // For now, populate only for sensor with id 0\n  int sensor_id = 0;\n\n  // Iterate over options\n  for (size_t it = 0; it < options.size(); it++) {\n\n     // Must not have an integer here\n     if (is_str_non_neg_integer(options[0]))\n        vw_throw(ArgumentErr() << \"When parsing intrinsics to float, expecting a \"\n                 << \"string, not an integer. Check your inputs.\\n\");\n\n    // Handle the optical center\n    if (options[it] == \"optical_center\") {\n      float_center[sensor_id] = true;\n      continue;\n    }\n\n    // Handle the focal length\n    if (options[it] == \"focal_length\") {\n      float_focus[sensor_id] = true;\n      continue;\n    }\n\n    // Handle the distortion (other_intrinsics)\n    if (options[it] == \"other_intrinsics\" || options[it] == \"distortion\") {\n      float_distortion[sensor_id] = true;\n      continue;\n    }\n\n    // For all, populate all fields\n    if (options[it] == \"all\") {\n      float_center[sensor_id]     = true;\n      float_focus[sensor_id]      = true;\n      float_distortion[sensor_id] = true;\n      continue;\n    }\n\n    // For none, just skip\n    if (options[it] == \"none\") {\n      continue;\n    }\n\n    // We should not arrive here\n    vw_throw(ArgumentErr() << \"Found unknown option when parsing which \"\n              << \"sensor intrinsics to float: \" << options[it] << \".\\n\");\n  }\n\n  // Distribute for all sensors.\n  // This will happen only if we share intrinsics per sensor.\n  for (int sensor_id = 0; sensor_id < num_sensors; sensor_id++) {\n     float_center[sensor_id]     = float_center[0];\n     float_focus[sensor_id]      = float_focus[0];\n     float_distortion[sensor_id] = float_distortion[0];\n  }\n\n  return;\n}\n\nvoid print_float(bool do_float) {\n  if (do_float)\n    vw_out() << \"floated\\n\";\n  else\n    vw_out() << \"fixed\\n\";\n}\n\nvoid print_float_vec(std::vector<bool> const& intrinsics, std::string const& name) {\n  vw_out() << name << \": \";\n  for (size_t it = 0; it < intrinsics.size(); it++) {\n    if (intrinsics[it])\n      vw_out() << \"floated \";\n    else\n      vw_out() << \"fixed \";\n  }\n  vw_out() << \"\\n\";\n}\n\nvoid print_shared(bool shared) {\n  if (shared)\n    vw_out() << \"shared\\n\";\n  else\n    vw_out() << \"not shared\\n\";\n}\n\n/// For each option, the string must include a subset of the entries:\n///  \"focal_length, optical_center, distortion_params\"\n/// - Need the extra boolean to handle the case where --intrinsics-to-share\n///   is provided as \"\" in order to share none of them.\nvoid load_intrinsics_options(bool        solve_intrinsics,\n                             bool        shared_is_specified,\n                             std::string intrinsics_to_float_str, // make a copy\n                             std::string intrinsics_to_share_str, // make a copy\n                             asp::IntrinsicOptions & intrinsics_options) {\n\n  // Share everything unless told otherwise or not solving for intrinsics\n  intrinsics_options.focus_shared        = solve_intrinsics;\n  intrinsics_options.center_shared       = solve_intrinsics;\n  intrinsics_options.distortion_shared   = solve_intrinsics;\n\n  // We need these to be initialized even when not solving for intrinsics, as\n  // the intrinsics are always added to the cost function when\n  // --inline-adjustments is used. In that case they are just expected to be\n  // kept fixed.\n  intrinsics_options.float_center.resize(1, false);\n  intrinsics_options.float_focus.resize(1, false);\n  intrinsics_options.float_distortion.resize(1, false);\n\n  if (((intrinsics_to_float_str != \"\" && intrinsics_to_float_str != \"none\") ||\n      (intrinsics_to_share_str != \"\" && intrinsics_to_share_str != \"none\"))\n      && !solve_intrinsics) {\n    vw::vw_throw(vw::ArgumentErr() << \"To be able set intrinsics to float or share, \"\n             << \"the option --solve-intrinsics must be on.\\n\");\n  }\n\n  if (!solve_intrinsics)\n    return;\n\n  // If the user did not specify which intrinsics to float, float all of them.\n  boost::to_lower(intrinsics_to_float_str);\n  if (intrinsics_to_float_str == \"\" || intrinsics_to_float_str == \"all\")\n    intrinsics_to_float_str = \"focal_length optical_center other_intrinsics\";\n  // This is the right place in which to turn 'none' to empty string,\n  // which now will mean float nothing.\n  if (intrinsics_to_float_str == \"none\")\n    intrinsics_to_float_str = \"\";\n\n  // If the user did not specify which intrinsics to share, share all of them.\n  boost::to_lower(intrinsics_to_share_str);\n  if (!shared_is_specified) {\n    intrinsics_to_share_str = \"focal_length optical_center other_intrinsics\";\n  } else {\n    // Otherwise, 'all' also means share all of them, 'none' means share none\n    if (intrinsics_to_share_str == \"all\")\n      intrinsics_to_share_str = \"focal_length optical_center other_intrinsics\";\n    if (intrinsics_to_share_str == \"none\")\n      intrinsics_to_share_str = \"\";\n  }\n\n  if (intrinsics_options.share_intrinsics_per_sensor && shared_is_specified)\n    vw_out() << \"When sharing intrinsics per sensor, option \"\n              << \"--intrinsics-to-share is ignored. The intrinsics will \"\n              << \"always be shared for a sensor and never across sensors.\\n\";\n\n  // If sharing intrinsics per sensor, the only supported mode is that \n  // the intrinsics are always shared per sensor and never across sensors.\n  if (shared_is_specified && !intrinsics_options.share_intrinsics_per_sensor) {\n    intrinsics_options.focus_shared      = false;\n    intrinsics_options.center_shared     = false;\n    intrinsics_options.distortion_shared = false;\n  }\n\n  // Replace any separators (:;, \\t\\r\\n) with spaces. It can be convenient to\n  // use commas and colons as separators when passing in the options from the command line.\n  asp::replace_separators_with_space(intrinsics_to_float_str);\n  asp::replace_separators_with_space(intrinsics_to_share_str);\n\n  // Parse float options. Supported formats:\n  // \"1:focal_length,optical_center 2:focal_length,other_intrinsics 3:none\"  \n  // \"focal_length optical_center other_intrinsics\"\n  // In the first case, the numbers are sensor indices, starting with 1.\n  std::vector<std::string> float_options = asp::split_str_with_space(intrinsics_to_float_str);\n  if (!float_options.empty() && asp::is_str_non_neg_integer(float_options[0])) {\n    asp::fine_grained_parse(intrinsics_options.share_intrinsics_per_sensor,\n                            intrinsics_options.num_sensors,\n                            float_options,\n                            intrinsics_options.float_center,\n                            intrinsics_options.float_focus,\n                            intrinsics_options.float_distortion);\n  } else {\n    asp::coarse_grained_parse(intrinsics_options.num_sensors,\n                              float_options,\n                              intrinsics_options.float_center,\n                              intrinsics_options.float_focus,\n                              intrinsics_options.float_distortion);\n  }\n\n  // Useful reporting\n  std::string center_name = \"Optical center\";\n  std::string focus_name  = \"Focal length\";\n  std::string dist_name   = \"Other intrinsics (distortion)\";\n  if (intrinsics_options.share_intrinsics_per_sensor) {\n    vw_out() << \"Intrinsics are shared for all cameras with given sensor.\\n\";\n    vw_out() << \"Number of sensors: \" << intrinsics_options.num_sensors << \"\\n\";\n    vw_out() << \"For each sensor:\\n\";\n    print_float_vec(intrinsics_options.float_center, center_name);\n    print_float_vec(intrinsics_options.float_focus, focus_name);\n    print_float_vec(intrinsics_options.float_distortion, dist_name);\n  } else {\n    vw_out() << center_name << \": \"; print_float(intrinsics_options.float_center[0]);\n    vw_out() << focus_name  << \": \"; print_float(intrinsics_options.float_focus[0]);\n    vw_out() << dist_name   << \": \"; print_float(intrinsics_options.float_distortion[0]);\n  }\n\n  // No parsing is done when sharing intrinsics per sensor, per above \n  std::string val;\n  if (shared_is_specified && !intrinsics_options.share_intrinsics_per_sensor) {\n    std::istringstream is(intrinsics_to_share_str);\n    while (is >> val) {\n      if (val == \"focal_length\")\n        intrinsics_options.focus_shared = true;\n      else if (val == \"optical_center\")\n        intrinsics_options.center_shared = true;\n      else if (val == \"other_intrinsics\" || val == \"distortion\")\n        intrinsics_options.distortion_shared = true;\n      else\n        vw_throw(ArgumentErr() << \"Error: Found unknown intrinsic to share: \"\n          << val << \".\\n\");\n    }\n  }\n\n  // Useful info\n  std::string sensor_mode = \" (across sensors): \";\n  if (intrinsics_options.share_intrinsics_per_sensor)\n    sensor_mode = \" (per sensor): \"; // useful clarification\n  vw_out() << center_name << sensor_mode; print_shared(intrinsics_options.center_shared);\n  vw_out() << focus_name << sensor_mode;  print_shared(intrinsics_options.focus_shared);\n  vw_out() << dist_name << sensor_mode;   print_shared(intrinsics_options.distortion_shared);\n\n} // End function load_intrinsics_options\n\n/// Parse the string of limits and make sure they are all valid pairs.\nvoid parse_intrinsics_limits(std::string const& intrinsics_limits_str,\n                             std::vector<double> & intrinsics_limits) {\n\n  intrinsics_limits.clear();\n  std::istringstream is(intrinsics_limits_str);\n  double val;\n  int    count = 0;\n  while (is >> val) {\n    intrinsics_limits.push_back(val);\n    if (count % 2 == 1) {\n      if (intrinsics_limits[count] < intrinsics_limits[count-1])\n        vw_throw(vw::ArgumentErr()\n                  << \"Error: Intrinsic limit pairs must be min before max.\\n\");\n    }\n    count++;\n  }\n\n  if (count % 2 != 0)\n    vw::vw_throw(vw::ArgumentErr()\n              << \"Error: Intrinsic limits must always be provided in min max pairs.\\n\");\n}\n\n/// Attempt to automatically create the overlap list file estimated\n///  footprints for each of the input images.\n/// - Currently this only supports cameras with Worldview style XML files.\nvoid auto_build_overlap_list(asp::BaBaseOptions &opt, double lonlat_buffer) {\n\n  typedef std::pair<std::string, std::string> StringPair;\n\n  const size_t num_images = opt.camera_files.size();\n  opt.overlap_list.clear();\n\n  vw_out() << \"Attempting to automatically estimate image overlaps...\\n\";\n  int  num_overlaps = 0;\n  bool read_success = false;\n\n  // Loop through all image pairs\n  for (size_t i = 0; i < num_images - 1; i++) {\n\n    // Try to get the lonlat bounds for this image\n    std::vector<vw::Vector2> pixel_corners_i, lonlat_corners_i;\n    try {\n      read_success = asp::read_WV_XML_corners(opt.camera_files[i], pixel_corners_i,\n                                              lonlat_corners_i);\n    } catch(...) {\n      read_success = false;\n    }\n    if (!read_success) {\n      vw_throw(ArgumentErr() << \"Unable to get corner estimate from file: \"\n                              << opt.camera_files[i] << \".\\n\");\n    }\n\n    vw::BBox2 bbox_i; // Convert to BBox\n    for (size_t p = 0; p < lonlat_corners_i.size(); p++)\n      bbox_i.grow(lonlat_corners_i[p]);\n    bbox_i.expand(lonlat_buffer); // Only expand this bounding box by the buffer.\n\n    for (size_t j = i+1; j < num_images; j++) {\n\n      std::vector<vw::Vector2> pixel_corners_j, lonlat_corners_j;\n      try {\n        read_success = asp::read_WV_XML_corners(opt.camera_files[j], pixel_corners_j,\n                                                lonlat_corners_j);\n      } catch(...) {\n        read_success = false;\n      }\n      if (!read_success) {\n        vw_throw(ArgumentErr() << \"Unable to get corner estimate from file: \"\n                                << opt.camera_files[j] << \".\\n\");\n      }\n\n      vw::BBox2 bbox_j; // Convert to BBox\n      for (size_t p = 0;  p < lonlat_corners_j.size(); p++)\n        bbox_j.grow(lonlat_corners_j[p]);\n\n      // Record the files if the bboxes overlap\n      // - TODO: Use polygon intersection instead of bounding boxes!\n      if (bbox_i.intersects(bbox_j)) {\n        vw_out() << \"Predicted overlap between images \" << opt.image_files[i]\n                 << \" and \" << opt.image_files[j] << \"\\n\";\n        opt.overlap_list.insert(StringPair(opt.image_files[i], opt.image_files[j]));\n        opt.overlap_list.insert(StringPair(opt.image_files[j], opt.image_files[i]));\n        ++num_overlaps;\n      }\n    } // End inner loop through cameras\n  } // End outer loop through cameras\n\n  if (num_overlaps == 0)\n    vw_throw(ArgumentErr() << \"Failed to automatically detect any overlapping images!\");\n\n  vw_out() << \"Will try to match at \" << num_overlaps << \" detected overlaps\\n.\";\n} // End function auto_build_overlap_list\n\n// Parse data needed for error propagation. Note that horizontal_stddevs\n// comes from the user, or is otherwise populated from cameras.\nvoid setup_error_propagation(std::string const& session_name,\n                             double horizontal_stddev,\n                             std::vector<vw::CamPtr> const& cameras,\n                             vw::Vector<double> & horizontal_stddev_vec) {\n\n  // Initialize the output\n  horizontal_stddev_vec.set_size(cameras.size());\n  horizontal_stddev_vec.set_all(horizontal_stddev);\n\n  bool message_printed = false;\n  if (horizontal_stddev == 0.0) {\n    // Read from cameras\n    for (size_t icam = 0; icam < cameras.size(); icam++)\n      horizontal_stddev_vec[icam]\n        = asp::horizontalStDevFromCamera(cameras[icam], message_printed);\n  }\n\n  asp::horizontalStdDevCheck(horizontal_stddev_vec, session_name);\n}\n\n// Find the cameras with the latest adjustments. Note that we do not modify\n// opt.camera_models, but make copies as needed. The optimizations (adjustments)\n// may be inline, or external.\nvoid calcOptimizedCameras(asp::BaBaseOptions const& opt,\n                          asp::BaParams const& param_storage,\n                          std::vector<vw::CamPtr> & optimized_cams) {\n\n  optimized_cams.clear();\n\n  int num_cameras = opt.image_files.size();\n  for (int icam = 0; icam < num_cameras; icam++) {\n\n    // TODO(oalexan1): The logic below may need to be a function and should be called\n    // in a couple other places.\n    switch (opt.camera_type) {\n    case BaCameraType_Pinhole:\n      {\n        vw::camera::PinholeModel const* in_cam\n          = dynamic_cast<vw::camera::PinholeModel const*>(opt.camera_models[icam].get());\n        if (in_cam == NULL)\n          vw_throw(ArgumentErr() << \"Expecting a pinhole camera.\\n\");\n        vw::camera::PinholeModel * out_cam = new PinholeModel(); // pointer managed below\n        *out_cam = transformedPinholeCamera(icam, param_storage, *in_cam);\n        optimized_cams.push_back(vw::CamPtr(out_cam));\n      }\n      break;\n    case BaCameraType_OpticalBar:\n      {\n        vw::camera::OpticalBarModel const* in_cam\n          = dynamic_cast<vw::camera::OpticalBarModel const*>(opt.camera_models[icam].get());\n        if (in_cam == NULL)\n          vw_throw(ArgumentErr() << \"Expecting an optical bar camera.\\n\");\n        vw::camera::OpticalBarModel * out_cam = new OpticalBarModel(); // pointer managed below\n        *out_cam = transformedOpticalBarCamera(icam, param_storage, *in_cam);\n        optimized_cams.push_back(vw::CamPtr(out_cam)); // will manage the memory\n      }\n      break;\n    case  BaCameraType_CSM:\n      {\n        asp::CsmModel const* in_cam\n          = dynamic_cast<asp::CsmModel const*>(opt.camera_models[icam].get());\n        if (in_cam == NULL)\n          vw_throw(ArgumentErr() << \"Expecting a CSM camera.\\n\");\n        auto out_cam = transformedCsmCamera(icam, param_storage, *in_cam);\n        optimized_cams.push_back(out_cam);\n      }\n      break;\n    case BaCameraType_Other:\n      {\n        CameraAdjustment cam_adjust(param_storage.get_camera_ptr(icam));\n        // The pointer is managed by the smart pointer vw::CamPtr\n        vw::CamPtr out_cam\n          (new AdjustedCameraModel(vw::camera::unadjusted_model(opt.camera_models[icam]),\n                                          cam_adjust.position(), cam_adjust.pose()));\n        optimized_cams.push_back(out_cam);\n      }\n      break;\n    default:\n      vw_throw(ArgumentErr() << \"Unknown camera type.\\n\");\n    }\n  }\n}\n\n// Find the average for the gsd for all pixels whose rays intersect at the given\n// triangulated point.\n// TODO(oalexan1): Export points out of param_storage and crn, then use the \n// other function further down instead.\nvoid estimateGsdPerTriPoint(std::vector<std::string> const& images,\n                            std::vector<vw::CamPtr>  const& cameras,\n                            asp::CRN                const& crn,\n                            asp::BaParams            const& param_storage,\n                            // Output\n                            std::vector<double>     & gsds) {\n\n  // Sanity checks\n  if (crn.size() != images.size())\n    vw_throw(ArgumentErr() << \"Expecting the same number of images and crn points.\\n\");\n  if (crn.size() != cameras.size())\n    vw_throw(ArgumentErr() << \"Expecting the same number of images and cameras.\\n\");\n  if (crn.size() != param_storage.num_cameras())\n    vw_throw(ArgumentErr() << \"Expecting the same number of images and cameras.\\n\");\n\n  // Image bboxes\n  std::vector<vw::BBox2> bboxes;\n  for (size_t i = 0; i < images.size(); i++) {\n    vw::DiskImageView<float> img(images[i]);\n    bboxes.push_back(bounding_box(img));\n  }\n\n  int num_cameras = param_storage.num_cameras();\n  int num_points  = param_storage.num_points();\n\n  // Initialize all gsd to 0\n  gsds.resize(num_points, 0.0);\n  std::vector<int> count(num_points, 0);\n\n  for (int icam = 0; icam < num_cameras; icam++) { // Camera loop\n    for (auto fiter = crn[icam].begin(); fiter != crn[icam].end(); fiter++) { // IP loop\n\n      // The index of the 3D point this IP is for.\n      int ipt = (**fiter).m_point_id;\n\n      VW_ASSERT(int(icam) < num_cameras,\n                ArgumentErr() << \"Out of bounds in the number of cameras.\");\n      VW_ASSERT(int(ipt)  < num_points,\n                ArgumentErr() << \"Out of bounds in the number of points.\");\n\n      if (param_storage.get_point_outlier(ipt))\n        continue; // skip outliers\n\n      vw::Vector2 pix = (**fiter).m_location;\n\n      double const* point = param_storage.get_point_ptr(ipt);\n      Vector3 xyz(point[0], point[1], point[2]);\n\n      // Estimate the GSD at the given pixel given an estimate of the ground point\n      double gsd = 0.0;\n      try {\n        gsd = vw::camera::estimatedGSD(cameras[icam].get(), bboxes[icam], pix, xyz);\n      } catch (...) {\n        continue;\n      }\n      gsds[ipt] += gsd;\n      count[ipt]++;\n    }\n  }\n\n  // Find the average gsd\n  for (int ipt = 0; ipt < num_points; ipt++) {\n    if (count[ipt] > 0)\n      gsds[ipt] /= count[ipt];\n  }\n\n  return;\n}\n\n// Find the average for the gsd for all pixels whose rays intersect at the given\n// triangulated point. This is used in jitter solving. Note that tri_points_vec\n// may have anchor points at the end, but we don't get to those.\nvoid estimateGsdPerTriPoint(std::vector<std::string> const& images,\n                            std::vector<vw::CamPtr>  const& cameras,\n                            asp::CRN                const& crn,\n                            std::set<int>            const& outliers,\n                            std::vector<double>      const& tri_points_vec,\n                            // Output\n                            std::vector<double>     & gsds) {\n\n  // Sanity checks\n  if (crn.size() != images.size())\n    vw_throw(ArgumentErr() << \"Expecting the same number of images and crn points.\\n\");\n  if (crn.size() != cameras.size())\n    vw_throw(ArgumentErr() << \"Expecting the same number of images and cameras.\\n\");\n\n  // Image bboxes\n  std::vector<vw::BBox2> bboxes;\n  for (size_t i = 0; i < images.size(); i++) {\n    vw::DiskImageView<float> img(images[i]);\n    bboxes.push_back(bounding_box(img));\n  }\n\n  int num_cameras = cameras.size();\n  int num_points  = tri_points_vec.size()/3;\n\n  // Initialize all gsd to 0\n  gsds.resize(num_points, 0.0);\n  std::vector<int> count(num_points, 0);\n\n  for (int icam = 0; icam < num_cameras; icam++) { // Camera loop\n    for (auto fiter = crn[icam].begin(); fiter != crn[icam].end(); fiter++) { // IP loop\n\n      // The index of the 3D point this IP is for.\n      int ipt = (**fiter).m_point_id;\n\n      VW_ASSERT(int(icam) < num_cameras,\n                ArgumentErr() << \"Out of bounds in the number of cameras.\");\n      VW_ASSERT(int(ipt)  < num_points,\n                ArgumentErr() << \"Out of bounds in the number of points.\");\n\n      if (outliers.find(ipt) != outliers.end())\n        continue; // Skip outliers\n\n      vw::Vector2 pix = (**fiter).m_location;\n\n      double const* point = &tri_points_vec[3*ipt];\n      Vector3 xyz(point[0], point[1], point[2]);\n\n      // Estimate the GSD at the given pixel given an estimate of the ground point\n      double gsd = 0.0;\n      try {\n        gsd = vw::camera::estimatedGSD(cameras[icam].get(), bboxes[icam], pix, xyz);\n      } catch (...) {\n        continue;\n      }\n\n      gsds[ipt] += gsd;\n      count[ipt]++;\n    }\n  }\n\n  // Find the average gsd\n  for (int ipt = 0; ipt < num_points; ipt++) {\n    if (count[ipt] > 0)\n      gsds[ipt] /= count[ipt];\n  }\n\n  return;\n}\n\n// This function returns only one camera center per camera. See below\n// for linescan.\nvoid calcCameraCenters(std::vector<vw::CamPtr>  const& cams,\n                       std::vector<vw::Vector3>      & cam_positions) {\n\n  cam_positions.resize(cams.size());\n  for (size_t icam = 0; icam < cams.size(); icam++) {\n    vw::Vector3 ctr = cams[icam]->camera_center(vw::Vector2());\n    cam_positions[icam] = ctr;\n  }\n}\n\n// This function returns all camera center samples for linescan cameras. These\n// cameras may have an external adjustment. Otherwise it returns only the adjusted\n// camera center at pixel (0,0).\nvoid calcCameraCenters(std::string const& stereo_session,\n                       std::vector<vw::CamPtr> const& camera_models,\n                       std::vector<std::vector<vw::Vector3>> & cam_positions) {\n\n  cam_positions.resize(camera_models.size());\n  for (size_t icam = 0; icam < camera_models.size(); icam++) {\n\n    // Fetch the CSM model without any adjustment\n    asp::CsmModel * csm_cam = NULL;\n    try {\n      csm_cam\n        = asp::csm_model(vw::camera::unadjusted_model(camera_models[icam]));\n    } catch(...) {}\n    if (csm_cam == NULL) {\n      // Not a CSM camera, pull directly the camera center\n      vw::Vector3 ctr = camera_models[icam]->camera_center(vw::Vector2());\n      cam_positions[icam].push_back(ctr);\n      continue;\n    }\n    csm::RasterGM const* gm = csm_cam->m_gm_model.get();\n    UsgsAstroLsSensorModel const* ls_model\n      = dynamic_cast<UsgsAstroLsSensorModel const*>(gm);\n    if (ls_model == NULL) {\n      // Not a linescan camera. Return, as before the adjusted camera center\n      vw::Vector3 ctr = camera_models[icam]->camera_center(vw::Vector2());\n      cam_positions[icam].push_back(ctr);\n      continue;\n    }\n\n    // Handle the case when the CSM camera has an external adjustment. In that case\n    // need to apply it before can find the camera positions, and update ls_model.\n    vw::camera::AdjustedCameraModel *adj_cam\n      = dynamic_cast<vw::camera::AdjustedCameraModel*>(camera_models[icam].get());\n    asp::CsmModel local_csm; // Ensure it does not go out of scope\n    if (adj_cam != NULL) {\n      vw::Matrix4x4 ecef_transform = adj_cam->ecef_transform();\n      csm_cam->deep_copy(local_csm);\n      local_csm.applyTransform(ecef_transform);\n      csm::RasterGM const* gm = local_csm.m_gm_model.get();\n      ls_model = dynamic_cast<UsgsAstroLsSensorModel const*>(gm);\n      if (ls_model == NULL)\n        vw::vw_throw(vw::ArgumentErr() << \"Expecting a linescan camera.\\n\");\n    }\n\n    // Get the number of positions\n    int numPos = ls_model->m_positions.size() / NUM_XYZ_PARAMS;\n\n    // The positions are in a single vector, ls_model->m_positions\n    // Append them to cam_positions[icam]\n    for (int i = 0; i < numPos; i++) {\n      int j = i * NUM_XYZ_PARAMS;\n      double x = ls_model->m_positions[j+0];\n      double y = ls_model->m_positions[j+1];\n      double z = ls_model->m_positions[j+2];\n      cam_positions[icam].push_back(vw::Vector3(x, y, z));\n    }\n  }\n\n  return;\n}\n\nvoid get_optical_center(vw::camera::CameraModel const* cam, vw::Vector2 & center) {\n\n  // Cast to pinhole model\n  vw::camera::PinholeModel const* pin_ptr\n    = dynamic_cast<vw::camera::PinholeModel const*>(cam);\n  if (pin_ptr != NULL) {\n    center = pin_ptr->point_offset();\n    return;\n  }\n\n  // Cast to optical bar model\n  vw::camera::OpticalBarModel const* bar_ptr\n    = dynamic_cast<vw::camera::OpticalBarModel const*>(cam);\n  if (bar_ptr != NULL) {\n    center = bar_ptr->get_optical_center();\n    return;\n  }\n\n  // Cast to CSM model\n  asp::CsmModel const* csm_ptr = dynamic_cast<asp::CsmModel const*>(cam);\n  if (csm_ptr != NULL) {\n    center = csm_ptr->optical_center();\n    return;\n  }\n\n  // If we get here, the camera type is not recognized\n  vw::vw_throw(vw::ArgumentErr() << \"Unknown camera type in get_optical_center().\\n\");\n}\n\nvoid set_optical_center(vw::camera::CameraModel* cam, vw::Vector2 const& center) {\n\n  // Cast to pinhole model\n  vw::camera::PinholeModel* pin_ptr\n    = dynamic_cast<vw::camera::PinholeModel*>(cam);\n  if (pin_ptr != NULL) {\n    pin_ptr->set_point_offset(center);\n    return;\n  }\n\n  // Cast to optical bar model\n  vw::camera::OpticalBarModel* bar_ptr\n    = dynamic_cast<vw::camera::OpticalBarModel*>(cam);\n  if (bar_ptr != NULL) {\n    bar_ptr->set_optical_center(center);\n    return;\n  }\n\n  // Cast to CSM model\n  asp::CsmModel* csm_ptr = dynamic_cast<asp::CsmModel*>(cam);\n  if (csm_ptr != NULL) {\n    csm_ptr->set_optical_center(center);\n    return;\n  }\n\n  // If we get here, the camera type is not recognized\n  vw::vw_throw(vw::ArgumentErr() << \"Unknown camera type in set_optical_center().\\n\");\n}\n\n// Get the focal length\nvoid get_focal_length(vw::camera::CameraModel const* cam, double & focal) {\n\n  // Cast to pinhole model\n  vw::camera::PinholeModel const* pin_ptr\n    = dynamic_cast<vw::camera::PinholeModel const*>(cam);\n  if (pin_ptr != NULL) {\n    focal = pin_ptr->focal_length()[0];\n    return;\n  }\n\n  // Cast to optical bar model\n  vw::camera::OpticalBarModel const* bar_ptr\n    = dynamic_cast<vw::camera::OpticalBarModel const*>(cam);\n  if (bar_ptr != NULL) {\n    focal = bar_ptr->get_focal_length();\n    return;\n  }\n\n  // Cast to CSM model\n  asp::CsmModel const* csm_ptr = dynamic_cast<asp::CsmModel const*>(cam);\n  if (csm_ptr != NULL) {\n    focal = csm_ptr->focal_length();\n    return;\n  }\n\n  // If we get here, the camera type is not recognized\n  vw::vw_throw(vw::ArgumentErr() << \"Unknown camera type in get_focal_length().\\n\");\n}\n\n// Set the focal length\nvoid set_focal_length(vw::camera::CameraModel* cam, double const& focal) {\n\n  // Cast to pinhole model\n  vw::camera::PinholeModel* pin_ptr\n    = dynamic_cast<vw::camera::PinholeModel*>(cam);\n  if (pin_ptr != NULL) {\n    pin_ptr->set_focal_length(vw::Vector2(focal, focal));\n    return;\n  }\n\n  // Cast to optical bar model\n  vw::camera::OpticalBarModel* bar_ptr\n    = dynamic_cast<vw::camera::OpticalBarModel*>(cam);\n  if (bar_ptr != NULL) {\n    bar_ptr->set_focal_length(focal);\n    return;\n  }\n\n  // Cast to CSM model\n  asp::CsmModel* csm_ptr = dynamic_cast<asp::CsmModel*>(cam);\n  if (csm_ptr != NULL) {\n    csm_ptr->set_focal_length(focal);\n    return;\n  }\n\n  // If we get here, the camera type is not recognized\n  vw::vw_throw(vw::ArgumentErr() << \"Unknown camera type in set_focal_length().\\n\");\n}\n\nvoid get_distortion(vw::camera::CameraModel const* cam, vw::Vector<double> &dist) {\n\n  // Cast to pinhole model\n  vw::camera::PinholeModel const* pin_ptr\n    = dynamic_cast<vw::camera::PinholeModel const*>(cam);\n  if (pin_ptr != NULL) {\n    dist = pin_ptr->lens_distortion()->distortion_parameters();\n    return;\n  }\n\n  // Cast to optical bar model\n  // TODO(oalexan1): This must be member function and called in a couple of other places.\n  vw::camera::OpticalBarModel const* bar_ptr\n    = dynamic_cast<vw::camera::OpticalBarModel const*>(cam);\n  if (bar_ptr != NULL) {\n    dist.set_size(asp::NUM_OPTICAL_BAR_EXTRA_PARAMS);\n    dist[0] = bar_ptr->get_speed();\n    dist[1] = bar_ptr->get_motion_compensation();\n    dist[2] = bar_ptr->get_scan_time();\n\n    if (bar_ptr->get_have_velocity_vec()) {\n      vw::Vector3 vel = bar_ptr->get_velocity();\n      vw::Vector3 final_pose = bar_ptr->get_final_pose();\n      dist[3] = vel[0];\n      dist[4] = vel[1];\n      dist[5] = vel[2];\n      dist[6] = final_pose[0];\n      dist[7] = final_pose[1];\n      dist[8] = final_pose[2];\n    } else {\n      // Ensure initialization\n      dist[3] = 0.0;\n      dist[4] = 0.0;\n      dist[5] = 0.0;\n      dist[6] = 0.0;\n      dist[7] = 0.0;\n      dist[8] = 0.0;\n    }\n\n    return;\n  }\n\n  // Cast to CSM model\n  asp::CsmModel const* csm_ptr = dynamic_cast<asp::CsmModel const*>(cam);\n  if (csm_ptr != NULL) {\n    std::vector<double> csm_dist = csm_ptr->distortion();\n    dist.set_size(csm_dist.size());\n    for (size_t i = 0; i < csm_dist.size(); i++)\n      dist[i] = csm_dist[i];\n    return;\n  }\n\n  // If we get here, the camera type is not recognized\n  vw::vw_throw(vw::ArgumentErr() << \"Unknown camera type in get_distortion().\\n\");\n}\n\n// Set the distortion. The underlying model must already have distortion of this size.\nvoid set_distortion(vw::camera::CameraModel* cam, vw::Vector<double> const& dist) {\n\n  // Cast to pinhole model\n  vw::camera::PinholeModel* pin_ptr\n    = dynamic_cast<vw::camera::PinholeModel*>(cam);\n  if (pin_ptr != NULL) {\n    boost::shared_ptr<LensDistortion> distortion = pin_ptr->lens_distortion()->copy();\n    if (dist.size() != distortion->distortion_parameters().size())\n      vw::vw_throw(vw::ArgumentErr() << \"Expecting \"\n                   << distortion->distortion_parameters().size()\n                   << \" distortion parameters for a pinhole model.\\n\");\n    distortion->set_distortion_parameters(dist);\n    pin_ptr->set_lens_distortion(distortion.get());\n    return;\n  }\n\n  // Cast to optical bar model\n  // TODO(oalexan1): This must be a member function and called in a couple of other places.\n  vw::camera::OpticalBarModel* bar_ptr\n    = dynamic_cast<vw::camera::OpticalBarModel*>(cam);\n  if (bar_ptr != NULL) {\n    if (dist.size() != asp::NUM_OPTICAL_BAR_EXTRA_PARAMS)\n      vw::vw_throw(vw::ArgumentErr() << \"Expecting \" << asp::NUM_OPTICAL_BAR_EXTRA_PARAMS\n                   << \" distortion parameters for an optical bar model.\\n\");\n    bar_ptr->set_speed(dist[0]);\n    bar_ptr->set_motion_compensation(dist[1]);\n    bar_ptr->set_scan_time(dist[2]);\n\n    if (bar_ptr->get_have_velocity_vec()) {\n      vw::Vector3 vel(dist[3], dist[4], dist[5]);\n      vw::Vector3 final_pose(dist[6], dist[7], dist[8]);\n      bar_ptr->set_velocity(vel);\n      bar_ptr->set_final_pose(final_pose);\n    }\n\n    return;\n  }\n\n  // Cast to CSM model\n  asp::CsmModel* csm_ptr = dynamic_cast<asp::CsmModel*>(cam);\n  if (csm_ptr != NULL) {\n    std::vector<double> csm_dist = csm_ptr->distortion();\n    if (dist.size() != csm_dist.size())\n      vw::vw_throw(vw::ArgumentErr() << \"Expecting \" << csm_dist.size()\n                   << \" distortion parameters for a CSM model.\\n\");\n\n    csm_dist.clear();\n    for (size_t i = 0; i < dist.size(); i++)\n      csm_dist.push_back(dist[i]);\n    csm_ptr->set_distortion(csm_dist);\n    return;\n  }\n\n  // If we get here, the camera type is not recognized\n  vw::vw_throw(vw::ArgumentErr() << \"Unknown camera type in set_distortion().\\n\");\n}\n\n// If some cameras share an intrinsic parameter, that parameter must start with\n// the same value for all cameras sharing it. This is a bugfix.\n// Return true if the cameras were changed.\nbool syncUpInitialSharedParams(BACameraType camera_type,\n                               asp::BaParams const& param_storage,\n                               std::vector<vw::CamPtr>& camera_models) {\n\n  bool cameras_changed = false;\n\n  if (camera_type != BaCameraType_Pinhole && camera_type != BaCameraType_OpticalBar &&\n      camera_type != BaCameraType_CSM)\n    return cameras_changed; // Not applicable as not optimizing intrinsics\n\n  // Create groups of cameras that share focal length, optical center, and distortion.\n  std::map<int, std::set<int>> focal_groups, center_groups, distortion_groups;\n  for (size_t icam = 0; icam < param_storage.num_cameras(); icam++) {\n    int focal_group      = param_storage.get_focus_offset(icam);\n    int center_group     = param_storage.get_center_offset(icam);\n    int distortion_group = param_storage.get_distortion_offset(icam);\n    focal_groups     [focal_group].insert(icam);\n    center_groups    [center_group].insert(icam);\n    distortion_groups[distortion_group].insert(icam);\n  }\n\n  // Iterate over focus groups. Get the focus. Apply it to all cameras in the group.\n  // Print a warning if the focus is not the same for all cameras in the group.\n  bool printed_focal_warning = false;\n  for (auto const& group : focal_groups) {\n    int focus_group = group.first;\n    std::set<int> const& cams = group.second;\n    int first_index = *cams.begin();\n    double focal_length = -1.0;\n    get_focal_length(camera_models[first_index].get(), focal_length);\n    for (int icam: cams) {\n      double curr_focal_length = -1.0;\n      get_focal_length(camera_models[icam].get(), curr_focal_length);\n      if (curr_focal_length != focal_length) {\n        if (!printed_focal_warning) {\n          vw::vw_out(vw::WarningMessage)\n            << \"Found cameras sharing a focal length, but different focal \"\n            \"lengths. Copying the value from the first camera in each group.\\n\";\n          printed_focal_warning = true;\n          cameras_changed = true;\n        }\n        set_focal_length(camera_models[icam].get(), focal_length);\n      }\n    }\n  }\n  // Same for optical center\n  bool printed_center_warning = false;\n  for (auto const& group: center_groups) {\n    int center_group = group.first;\n    std::set<int> const& cams = group.second;\n    int first_index = *cams.begin();\n    vw::Vector2 optical_center = Vector2(-1, -1);\n    get_optical_center(camera_models[first_index].get(), optical_center);\n    for (int icam: cams) {\n      Vector2 curr_optical_center = Vector2(-1, -1);\n      get_optical_center(camera_models[icam].get(), curr_optical_center);\n      if (curr_optical_center != optical_center) {\n        if (!printed_center_warning) {\n          vw::vw_out(vw::WarningMessage)\n            << \"Found cameras sharing an optical center, but different centers. \"\n            \"Copying the value from the first camera in each group.\\n\";\n          printed_center_warning = true;\n          cameras_changed = true;\n        }\n        set_optical_center(camera_models[icam].get(), optical_center);\n      }\n    }\n  }\n\n  // Same for distortion\n  bool printed_distortion_warning = false;\n  for (auto const& group: distortion_groups) {\n    int distortion_group = group.first;\n    std::set<int> const& cams = group.second;\n    int first_index = *cams.begin();\n    vw::Vector<double> distortion_params;\n    get_distortion(camera_models[first_index].get(), distortion_params);\n    for (int icam: cams) {\n      vw::Vector<double> curr_distortion_params;\n      get_distortion(camera_models[icam].get(), curr_distortion_params);\n      if (curr_distortion_params != distortion_params) {\n        if (!printed_distortion_warning) {\n          vw::vw_out(vw::WarningMessage)\n            << \"Found cameras sharing a distortion model, but different distortion \"\n            \"parameters. Copying the value from the first camera in each group.\\n\";\n          printed_distortion_warning = true;\n          cameras_changed = true;\n        }\n        set_distortion(camera_models[icam].get(), distortion_params);\n      }\n    }\n  }\n\n  return cameras_changed;\n}\n\n// This is needed to allocate enough storage for the distortion parameters.\nint calcMaxNumDistParams(std::vector<vw::CamPtr> const& camera_models,\n                         BACameraType camera_type,\n                         IntrinsicOptions const& intrinsics_opts,\n                         std::vector<double> const& intrinsics_limits) {\n\n  int num_cameras = camera_models.size();\n  std::vector<int> num_dist_params(num_cameras, 0);\n  for (size_t cam_it  = 0; cam_it < camera_models.size(); cam_it++) {\n    if (camera_type == BaCameraType_Pinhole) {\n      auto pin_ptr = boost::dynamic_pointer_cast<vw::camera::PinholeModel>\n                      (camera_models[cam_it]);\n      if (!pin_ptr)\n        vw_throw(ArgumentErr() << \"Expecting a Pinhole camera.\\n\");\n      num_dist_params[cam_it]\n        = pin_ptr->lens_distortion()->distortion_parameters().size();\n    } else if (camera_type == BaCameraType_OpticalBar) {\n      num_dist_params[cam_it] = asp::NUM_OPTICAL_BAR_EXTRA_PARAMS;\n    } else if (camera_type == BaCameraType_CSM) {\n      auto csm_ptr = boost::dynamic_pointer_cast<asp::CsmModel>(camera_models[cam_it]);\n      if (!csm_ptr)\n        vw_throw(ArgumentErr() << \"Expecting a CSM camera.\\n\");\n      num_dist_params[cam_it] = csm_ptr->distortion().size();\n    } else if (camera_type == BaCameraType_Other) {\n      num_dist_params[cam_it] = 0; // distortion does not get handled\n    } else {\n      vw_throw(ArgumentErr() << \"Unknown camera type.\\n\");\n    }\n\n    // For the case where the camera has zero distortion parameters, use one\n    // dummy parameter just so we don't have to change the parameter block logic\n    // later on.\n    // TODO(oalexan1): Test with a mix of cameras with and without distortion.\n    if (camera_type != BaCameraType_Other && num_dist_params[cam_it] < 1)\n      num_dist_params[cam_it] = 1;\n  }\n\n  // It is simpler to allocate the same number of distortion params per camera\n  // even if some cameras have fewer. The extra ones won't be used. \n  int max_num_dist_params =\n    *std::max_element(num_dist_params.begin(), num_dist_params.end());\n\n  asp::distortion_sanity_check(num_dist_params, intrinsics_opts,\n                               intrinsics_limits);\n\n  return max_num_dist_params;\n}\n\n// This is needed to ensure distortion coefficients are not so small\n// that they don't get optimized. This modifies the camera models in place.\n// This does not change indices given by --fixed-distortion-indices.\nvoid ensureMinDistortion(std::vector<vw::CamPtr> & camera_models,\n                         BACameraType camera_type,\n                         IntrinsicOptions const& intrinsics_opts,\n                         std::vector<int> const& fixed_distortion_indices,\n                         int max_num_dist_params,\n                         double min_distortion) {\n\n  int num_cameras = camera_models.size();\n  bool message_printed = false;\n\n  // Check that all distortion indices are between 0 and max_num_dist_params-1.\n  for (size_t i = 0; i < fixed_distortion_indices.size(); i++) {\n    if (fixed_distortion_indices[i] < 0 ||\n        fixed_distortion_indices[i] >= max_num_dist_params)\n      vw_throw(ArgumentErr() << \"The values in --fixed-distortion-indices \"\n               << \"are out of range given the number of distortion coefficients.\\n\");\n  }\n\n  // Put fixed_distortion_indices in a set for faster searching\n  std::set<int> fixed_dist_set;\n  for (size_t i = 0; i < fixed_distortion_indices.size(); i++)\n    fixed_dist_set.insert(fixed_distortion_indices[i]);\n\n  for (size_t cam_it  = 0; cam_it < camera_models.size(); cam_it++) {\n\n    // See if this logic is needed\n    if (camera_type == BaCameraType_Pinhole) {\n\n      auto pin_ptr = boost::dynamic_pointer_cast<vw::camera::PinholeModel>\n                      (camera_models[cam_it]);\n      if (!pin_ptr)\n        vw_throw(ArgumentErr() << \"Expecting a Pinhole camera.\\n\");\n\n    } else if (camera_type == BaCameraType_CSM) {\n\n      auto csm_ptr = boost::dynamic_pointer_cast<asp::CsmModel>(camera_models[cam_it]);\n      if (!csm_ptr)\n        vw_throw(ArgumentErr() << \"Expecting a CSM camera.\\n\");\n\n      // Non radtan cameras have distortion that is not normalized by focal\n      // length. Better not mess with it.  \n      DistortionType dist_type = csm_ptr->distortion_type();\n      if (dist_type != DistortionType::RADTAN)\n        continue;\n\n    } else if (camera_type == BaCameraType_OpticalBar) {\n      continue; // likely not needed for optical bar\n    } else if (camera_type == BaCameraType_Other) {\n      continue; // distortion does not get handled\n    } else {\n      vw_throw(ArgumentErr() << \"Unknown camera type.\\n\");\n    }\n\n    if (!intrinsics_opts.float_distortion_params(cam_it))\n      continue; // distortion is not being optimized for this camera\n\n    // Adjust the distortion parameters, unless they are fixed, via\n    // --fixed-distortion-indices.\n    vw::Vector<double> dist_params;\n    asp::get_distortion(camera_models[cam_it].get(), dist_params);\n    for (size_t i = 0; i < dist_params.size(); i++) {\n      if (std::abs(dist_params[i]) < std::abs(min_distortion) &&\n          !fixed_dist_set.count(i)) {\n        dist_params[i] = min_distortion;\n        if (!message_printed) {\n          vw::vw_out(vw::WarningMessage)\n            << \"Setting distortion parameters to at least \" << min_distortion\n            << \" (option --min-distortion) to ensure they are optimized.\\n\";\n            message_printed = true;\n        }\n      }\n    }\n    asp::set_distortion(camera_models[cam_it].get(), dist_params);\n\n  } // end loop through cameras\n\n  return;\n}\n\n// Sanity check. This does not prevent the user from setting the wrong datum,\n// but it can catch unreasonable height values for GCP.\nvoid checkGcpRadius(vw::cartography::Datum const& datum,\n                    vw::ba::ControlNetwork const& cnet) {\n\n  int num_points = cnet.size();\n  for (int ipt = 0; ipt < num_points; ipt++) {\n    if (cnet[ipt].type() != ControlPoint::GroundControlPoint)\n      continue;\n\n    vw::Vector3 observation = cnet[ipt].position();\n    double thresh = 2e+5; // 200 km\n    if (std::abs(norm_2(observation) - datum.semi_major_axis()) > thresh ||\n        std::abs(norm_2(observation) - datum.semi_minor_axis()) > thresh)\n      vw_out(vw::WarningMessage) << \"GCP \" << ipt\n        << \" has ECEF radius differing from the datum by more than \"\n        << thresh << \" m. Check your GCPs and datum.\\n\";\n  }\n\n  return;\n}\n\n// Some logic for camera position uncertainty, used in bundle_adjust and jitter_solve\nvoid handleCameraPositionUncertainty(asp::BaBaseOptions & opt, bool have_datum) {\n\n  // Create map from image name to index\n  std::map<std::string, int> image_name_to_index;\n  for (int i = 0; i < (int)opt.image_files.size(); i++)\n    image_name_to_index[opt.image_files[i]] = i;\n\n  // Resize opt.camera_position_uncertainty to the number of images\n  opt.camera_position_uncertainty.resize(opt.image_files.size(), vw::Vector2(0, 0));\n\n  // Handle the case when uncertainty is two values separated by a comma\n  std::string sep = \",\";\n  std::vector<double> vals = vw::str_to_std_vec(opt.camera_position_uncertainty_str, sep);\n  if (vals.size() == 2) {\n    for (int i = 0; i < (int)opt.image_files.size(); i++)\n      opt.camera_position_uncertainty[i] = vw::Vector2(vals[0], vals[1]);\n  } else {\n    // Read the uncertainties per image from file\n    std::string image_name;\n    double horiz = 0, vert = 0;\n    std::ifstream ifs(opt.camera_position_uncertainty_str.c_str());\n    if (!ifs.good())\n      vw_throw(ArgumentErr() << \"Cannot read camera position uncertainty from: \"\n                << opt.camera_position_uncertainty_str << \".\\n\");\n    while (ifs >> image_name >> horiz >> vert) {\n      auto it = image_name_to_index.find(image_name);\n      if (it == image_name_to_index.end())\n        continue; // skip images having uncertainty that are not in the image list\n      int index = it->second;\n      opt.camera_position_uncertainty[index] = Vector2(horiz, vert);\n    }\n  }\n\n  // This constraint requires the solver to work harder to converge.\n  opt.parameter_tolerance = std::min(opt.parameter_tolerance, 1e-10);\n\n  // Ensure each horizontal and vertical uncertainty is positive\n  for (int i = 0; i < (int)opt.image_files.size(); i++) {\n    if (opt.camera_position_uncertainty[i][0] <= 0 ||\n        opt.camera_position_uncertainty[i][1] <= 0)\n      vw::vw_throw(vw::ArgumentErr()\n                  << \"The camera uncertainty for each image must be set and be positive.\\n\");\n  }\n\n  // The power must be positive\n  if (opt.camera_position_uncertainty_power <= 0.0)\n    vw::vw_throw(vw::ArgumentErr()\n                << \"The value of --camera-position-uncertainty-power must be positive.\\n\");\n\n  // When there is camera position uncertainty, the other camera weights must be 0.    \n  if (opt.camera_position_weight > 0) {\n    vw::vw_out() << \"Setting --camera-position-weight to 0 as \"\n                  << \"--camera-position-uncertainty is positive.\\n\";\n    opt.camera_position_weight = 0;\n  }\n\n  if (opt.camera_weight > 0) {\n    vw::vw_out() << \"Setting --camera-weight to 0 as --camera-position-uncertainty \"\n                  << \"is positive.\\n\";\n    opt.camera_weight = 0;\n  }\n\n  if (!have_datum)\n    vw::vw_throw(vw::ArgumentErr()\n            << \"Cannot use camera uncertainties without a datum. Set --datum.\\n\");\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Camera/BundleAdjustCostFuns.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Cost functions used in bundle adjustment. These need access to the camera\n// models, so they are stored in the Camera folder.\n\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/DataLoader.h>\n#include <asp/Camera/BundleAdjustOptions.h>\n#include <asp/Camera/BundleAdjustCostFuns.h>\n#include <asp/Camera/BaseCostFuns.h>\n#include <vw/Camera/OpticalBarModel.h>\n#include <vw/Camera/CameraImage.h>\n#include <vw/Camera/LensDistortion.h>\n#include <vw/Camera/CameraUtilities.h>\n#include <vw/Cartography/GeoReferenceBaseUtils.h>\n\nusing namespace vw;\nusing namespace vw::camera;\n\nnamespace asp {\n\ndouble g_big_pixel_value = 1000.0;  // don't make this too big\n\n/// Used to accumulate the number of reprojection errors in bundle adjustment.\nint g_ba_num_errors = 0;\nvw::Mutex g_ba_mutex;\n\n// Return the size of each parameter block.\n// These should sum up to equal num_params.\n// The first block is always the point block (3) and\n// the second block is always the pose block (6).\nstd::vector<int> BaCamBase::get_block_sizes() const {\n  std::vector<int> result(2);\n  result[0] = num_point_params();\n  result[1] = num_pose_params();\n  return result;\n}\n\n// Read in all of the parameters and compute the residuals.\nvw::Vector2 BaAdjCam::evaluate(std::vector<double const*> const param_blocks) const {\n\n  double const* raw_point = param_blocks[0];\n  double const* raw_pose  = param_blocks[1];\n\n  // Read the point location and camera information from the raw arrays.\n  Vector3          point(raw_point[0], raw_point[1], raw_point[2]);\n  CameraAdjustment correction(raw_pose);\n\n  // Create adjusted camera that applies corrections to the underlying camera\n  vw::camera::AdjustedCameraModel cam(m_underlying_camera,\n        correction.position(),\n        correction.pose());\n  try {\n    // Bathy or not\n    if (asp::hasBathy(m_bathy_data))\n      return vw::point_to_pixel(&cam, m_bathy_data.bathy_planes[m_camera_index],\n                                m_bathy_data.refraction_index, point);\n    else\n      return cam.point_to_pixel(point);\n\n  } catch(std::exception const& e) {\n  }\n\n  // We must not allow one bad point to ruin the optimization\n  return vw::Vector2(g_big_pixel_value, g_big_pixel_value);\n}\n\nBaPinholeCam::BaPinholeCam(boost::shared_ptr<vw::camera::PinholeModel> cam,\n                           vw::BathyData const& bathy_data,\n                           int camera_index):\n  m_underlying_camera(cam), m_bathy_data(bathy_data), m_camera_index(camera_index) {}\n\n// The number of lens distortion parameters.\nint BaPinholeCam::num_dist_params() const {\n  vw::Vector<double> lens_params\n    = m_underlying_camera->lens_distortion()->distortion_parameters();\n  return lens_params.size();\n}\n\nstd::vector<int> BaPinholeCam::get_block_sizes() const {\n  std::vector<int> result = BaCamBase::get_block_sizes();\n  result.push_back(asp::NUM_CENTER_PARAMS);\n  result.push_back(asp::NUM_FOCUS_PARAMS);\n  result.push_back(num_dist_params());\n  return result;\n}\n\n// Read in all of the parameters and compute the residuals.\nvw::Vector2 BaPinholeCam::evaluate(std::vector<double const*> const param_blocks) const {\n\n  double const* raw_point  = param_blocks[0];\n  double const* raw_pose   = param_blocks[1];\n  double const* raw_center = param_blocks[2];\n  double const* raw_focus  = param_blocks[3];\n  double const* raw_lens   = param_blocks[4];\n\n  // TODO: Should these values also be scaled?\n  // Read the point location and camera information from the raw arrays.\n  Vector3          point(raw_point[0], raw_point[1], raw_point[2]);\n  CameraAdjustment correction(raw_pose);\n\n  // We actually solve for scale factors for intrinsic values, so multiply them\n  //  by the original intrinsic values to get the updated values.\n  double center_x = raw_center[0] * m_underlying_camera->point_offset()[0];\n  double center_y = raw_center[1] * m_underlying_camera->point_offset()[1];\n  double focus    = raw_focus [0] * m_underlying_camera->focal_length()[0];\n\n  // Update the lens distortion parameters in the new camera.\n  // - These values are also optimized as scale factors.\n  // TODO: This approach FAILS when the input value is zero!!\n  boost::shared_ptr<LensDistortion> distortion\n    = m_underlying_camera->lens_distortion()->copy();\n  vw::Vector<double> lens = distortion->distortion_parameters();\n  for (size_t i = 0; i < lens.size(); i++)\n    lens[i] *= raw_lens[i];\n  distortion->set_distortion_parameters(lens);\n\n  // Duplicate the input camera model with the pose, focus, center, and lens updated.\n  // Respect m_u_direction, m_v_direction, m_w_direction in the original model.\n  vw::camera::PinholeModel cam = *m_underlying_camera;\n  cam.set_camera_center(correction.position());\n  cam.set_camera_pose(correction.pose().rotation_matrix());\n  cam.set_focal_length(vw::Vector2(focus, focus));\n  cam.set_point_offset(vw::Vector2(center_x, center_y));\n  cam.set_lens_distortion(distortion.get());\n  cam.set_pixel_pitch(m_underlying_camera->pixel_pitch());\n  try {\n    // Bathy or not\n    if (asp::hasBathy(m_bathy_data))\n      return vw::point_to_pixel(&cam, m_bathy_data.bathy_planes[m_camera_index],\n                                m_bathy_data.refraction_index, point);\n    else\n      return cam.point_to_pixel_no_check(point);\n  } catch(...) {\n  }\n\n  // Do not allow one bad pixel value to ruin the whole problem\n  return vw::Vector2(g_big_pixel_value, g_big_pixel_value);\n}\n\nBaOpticalBarCam::BaOpticalBarCam(\n    boost::shared_ptr<vw::camera::OpticalBarModel> cam,\n    vw::BathyData const& bathy_data,\n    int camera_index):\n    m_underlying_camera(cam), m_bathy_data(bathy_data), m_camera_index(camera_index) {}\n\nint BaOpticalBarCam::num_intrinsic_params() const {\n   return asp::NUM_CENTER_PARAMS + asp::NUM_FOCUS_PARAMS + asp::NUM_OPTICAL_BAR_EXTRA_PARAMS;\n}\n\nstd::vector<int> BaOpticalBarCam::get_block_sizes() const {\n  std::vector<int> result = BaCamBase::get_block_sizes();\n  result.push_back(asp::NUM_CENTER_PARAMS);\n  result.push_back(asp::NUM_FOCUS_PARAMS);\n  result.push_back(asp::NUM_OPTICAL_BAR_EXTRA_PARAMS);\n  return result;\n}\n\n// Read in all of the parameters and compute the residuals.\nvw::Vector2  BaOpticalBarCam::evaluate(std::vector<double const*> const param_blocks) const {\n\n  double const* raw_point  = param_blocks[0];\n  double const* raw_pose   = param_blocks[1];\n  double const* raw_center = param_blocks[2];\n  double const* raw_focus  = param_blocks[3];\n  double const* raw_intrin = param_blocks[4];\n\n  // TODO: Should these values also be scaled?\n  // Read the point location and camera information from the raw arrays.\n  Vector3          point(raw_point[0], raw_point[1], raw_point[2]);\n  CameraAdjustment correction(raw_pose);\n\n  // We actually solve for scale factors for intrinsic values, so multiply them\n  //  by the original intrinsic values to get the updated values.\n  double center_x  = raw_center[0] * m_underlying_camera->get_optical_center()[0];\n  double center_y  = raw_center[1] * m_underlying_camera->get_optical_center()[1];\n  double focus     = raw_focus [0] * m_underlying_camera->get_focal_length();\n  double speed     = raw_intrin[0] * m_underlying_camera->get_speed();\n  double mcf       = raw_intrin[1] * m_underlying_camera->get_motion_compensation();\n  double scan_time = raw_intrin[2] * m_underlying_camera->get_scan_time();\n\n  // The velocity is a 3-vector \n  bool have_velocity_vec = m_underlying_camera->get_have_velocity_vec();\n  vw::Vector3 vel(0, 0, 0);\n  vw::Vector3 final_pose(std::numeric_limits<double>::quiet_NaN(), 0, 0);\n\n  if (have_velocity_vec) {\n    vel = m_underlying_camera->get_velocity();\n    final_pose = m_underlying_camera->get_final_pose();\n    vel[0] *= raw_intrin[3];\n    vel[1] *= raw_intrin[4];\n    vel[2] *= raw_intrin[5];\n    final_pose[0] *= raw_intrin[6];\n    final_pose[1] *= raw_intrin[7];\n    final_pose[2] *= raw_intrin[8];\n  }\n\n  // Create an optical bar camera with updated pose, focus, center, speed, and MCF\n  vw::camera::OpticalBarModel cam(m_underlying_camera->get_image_size(),\n                                  vw::Vector2(center_x, center_y),\n                                  m_underlying_camera->get_pixel_size(),\n                                  focus,\n                                  scan_time,\n                                  m_underlying_camera->get_scan_dir(),\n                                  m_underlying_camera->get_forward_tilt(),\n                                  correction.position(),\n                                  correction.pose().axis_angle(),\n                                  speed, mcf, have_velocity_vec, vel, final_pose);\n\n  // Project the point into the camera.\n  try {\n    // Bathy or not\n    if (asp::hasBathy(m_bathy_data))\n      return vw::point_to_pixel(&cam, m_bathy_data.bathy_planes[m_camera_index],\n                                m_bathy_data.refraction_index, point);\n    else\n      return cam.point_to_pixel(point);\n  } catch(std::exception const& e) {\n  }\n\n  // We must not allow one bad point to ruin the optimization\n  return vw::Vector2(g_big_pixel_value, g_big_pixel_value);\n}\n\nstd::vector<int> BaCsmCam::get_block_sizes() const {\n  std::vector<int> result = BaCamBase::get_block_sizes();\n  result.push_back(asp::NUM_CENTER_PARAMS);\n  result.push_back(asp::NUM_FOCUS_PARAMS);\n  result.push_back(num_dist_params());\n  return result;\n}\n\n// Read in all of the parameters and compute the residuals.\nvw::Vector2 BaCsmCam::evaluate(std::vector<double const*> const param_blocks) const {\n\n  // TODO(oalexan1): Use here transformedCsmCamera() to avoid code repetition. \n  // But note that that one may set zero distortion to 1e-16 which likely here\n  // we don't need to do.\n  double const* raw_point  = param_blocks[0];\n  double const* raw_pose   = param_blocks[1];\n  double const* raw_center = param_blocks[2];\n  double const* raw_focus  = param_blocks[3];\n  double const* raw_dist   = param_blocks[4];\n\n  // TODO: Should these values also be scaled?\n  // Read the point location and camera information from the raw arrays.\n  Vector3          point(raw_point[0], raw_point[1], raw_point[2]);\n  CameraAdjustment correction(raw_pose);\n\n  // We actually solve for scale factors for intrinsic values, so multiply them\n  //  by the original intrinsic values to get the updated values.\n  vw::Vector2 optical_center = m_underlying_camera->optical_center();\n  double focal_length        = m_underlying_camera->focal_length();\n  optical_center[0] = raw_center[0] * optical_center[0];\n  optical_center[1] = raw_center[1] * optical_center[1];\n  focal_length      = raw_focus [0] * focal_length;\n\n  // Update the lens distortion parameters in the new camera.\n  // - These values are also optimized as scale factors.\n  std::vector<double> distortion = m_underlying_camera->distortion();\n  for (size_t i = 0; i < distortion.size(); i++)\n    distortion[i] = raw_dist[i] * distortion[i];\n\n  // Duplicate the input camera model\n  boost::shared_ptr<asp::CsmModel> copy;\n  m_underlying_camera->deep_copy(copy);\n\n  // Update the intrinsics of the copied model\n  copy->set_optical_center(optical_center);\n  copy->set_focal_length(focal_length);\n  copy->set_distortion(distortion);\n\n  // Form the adjusted camera. Note that unlike for Pinhole and Optical\n  // bar, the parameters being optimized adjust the initial CSM camera,\n  // rather than replacing it altogether. The CSM camera can in fact\n  // be even linescan, when there would be many pose samples, in fact,\n  // so it makes sense to work this way.\n  AdjustedCameraModel adj_cam(copy, correction.position(), correction.pose());\n\n  try {\n    // Bathy or not\n    if (asp::hasBathy(m_bathy_data))\n      return vw::point_to_pixel(&adj_cam, m_bathy_data.bathy_planes[m_camera_index],\n                                m_bathy_data.refraction_index, point);\n    else\n      return adj_cam.point_to_pixel(point);\n  } catch(...) {\n  }\n\n  // Do not allow one bad pixel value to ruin the whole problem\n  return vw::Vector2(g_big_pixel_value, g_big_pixel_value);\n}\n\n// Call to work with ceres::DynamicCostFunctions.\n// - Takes array of arrays.\nbool BaReprojErr::operator()(double const * const * parameters,\n                                     double * residuals) const {\n\n  try {\n    // Unpack the parameter blocks\n    std::vector<double const*> param_blocks(m_num_param_blocks);\n    for (size_t i = 0; i < m_num_param_blocks; i++) {\n      param_blocks[i] = parameters[i];\n    }\n\n    // Use the adapted camera model to handle all of the parameter blocks.\n    Vector2 prediction = m_ba_cam->evaluate(param_blocks);\n\n    // The error is the difference between the predicted and observed pixel\n    // position, normalized by sigma.\n    residuals[0] = (prediction[0] - m_observation[0])/m_pixel_sigma[0];\n    residuals[1] = (prediction[1] - m_observation[1])/m_pixel_sigma[1];\n\n  } catch (std::exception const& e) { // TODO: Catch only projection errors?\n    // Failed to compute residuals\n\n    Mutex::Lock lock(g_ba_mutex);\n    g_ba_num_errors++;\n    if (g_ba_num_errors < 100) {\n      vw_out(ErrorMessage) << e.what() << std::endl;\n    } else if (g_ba_num_errors == 100) {\n      vw_out() << \"Will print no more error messages about \"\n                << \"failing to compute residuals.\\n\";\n    }\n\n    residuals[0] = g_big_pixel_value;\n    residuals[1] = g_big_pixel_value;\n    return false;\n  }\n  return true;\n}\n\n// Factory to hide the construction of the CostFunction object from the client code.\nceres::CostFunction*\nBaReprojErr::Create(Vector2 const& observation,\n                            Vector2 const& pixel_sigma,\n                            boost::shared_ptr<BaCamBase> ba_cam) {\n  const int NUM_RESIDUALS = 2;\n\n  ceres::DynamicNumericDiffCostFunction<BaReprojErr>* cost_function =\n      new ceres::DynamicNumericDiffCostFunction<BaReprojErr>(\n          new BaReprojErr(observation, pixel_sigma, ba_cam));\n\n  // The residual size is always the same.\n  cost_function->SetNumResiduals(NUM_RESIDUALS);\n\n  // The adapted camera model knows all of the block sizes to add.\n  std::vector<int> block_sizes = ba_cam->get_block_sizes();\n  for (size_t i = 0; i < block_sizes.size(); i++) {\n    cost_function->AddParameterBlock(block_sizes[i]);\n  }\n  return cost_function;\n}\n\n// Adaptor to work with ceres::DynamicCostFunctions.\nbool BaDispXyzErr::operator()(double const* const* parameters, double* residuals) const {\n\n  try{\n    // Split apart the input parameter blocks and hand them to the camera wrappers.\n    std::vector<double const*> left_param_blocks, right_param_blocks;\n    unpack_residual_pointers(parameters, left_param_blocks, right_param_blocks);\n\n    // Get pixel projection in both cameras.\n    Vector2 left_prediction  = m_left_ba_cam->evaluate (left_param_blocks);\n    Vector2 right_prediction = m_right_ba_cam->evaluate(right_param_blocks);\n\n    // See how consistent that is with the observed disparity.\n    bool good_ans = true;\n    if (!m_interp_disp.pixel_in_bounds(left_prediction)) {\n      good_ans = false;\n    } else {\n      DispPixelT dispPix = m_interp_disp(left_prediction[0], left_prediction[1]);\n      if (!is_valid(dispPix)) {\n        good_ans = false;\n      } else {\n        Vector2 right_prediction_from_disp = left_prediction + dispPix.child();\n        residuals[0] = right_prediction_from_disp[0] - right_prediction[0];\n        residuals[1] = right_prediction_from_disp[1] - right_prediction[1];\n        for (size_t it = 0; it < 2; it++)\n          residuals[it] *= m_reference_terrain_weight;\n      }\n    }\n\n    // TODO: Think more of what to do below. The hope is that the robust cost\n    // function will take care of big residuals graciously.\n    if (!good_ans) {\n      // Failed to find the residuals\n      for (size_t it = 0; it < 2; it++)\n        residuals[it] = m_max_disp_error * m_reference_terrain_weight;\n      return true;\n    }\n\n  } catch (const camera::PointToPixelErr& e) {\n    // Failed to project into the camera\n    for (size_t it = 0; it < 2; it++)\n      residuals[it] = m_max_disp_error * m_reference_terrain_weight;\n    return true;\n  }\n  return true;\n}\n\n// TODO: Should this logic live somewhere else?\n/// Create the list of residual pointers when solving for intrinsics.\n/// - Extra logic is needed to avoid duplicate pointers.\nvoid BaDispXyzErr::get_residual_pointers(asp::BaParams &param_storage,\n                                  int left_cam_index, int right_cam_index,\n                                  bool solve_intrinsics,\n                                  asp::IntrinsicOptions const& intrinsics_opt,\n                                  std::vector<double*> &residual_ptrs) {\n\n  double* left_cam  = param_storage.get_camera_ptr(left_cam_index);\n  double* right_cam = param_storage.get_camera_ptr(right_cam_index);\n  residual_ptrs.clear();\n  if (solve_intrinsics) {\n    double* left_center      = param_storage.get_intrinsic_center_ptr    (left_cam_index);\n    double* left_focus       = param_storage.get_intrinsic_focus_ptr     (left_cam_index);\n    double* left_distortion  = param_storage.get_intrinsic_distortion_ptr(left_cam_index);\n    double* right_center     = param_storage.get_intrinsic_center_ptr    (right_cam_index);\n    double* right_focus      = param_storage.get_intrinsic_focus_ptr     (right_cam_index);\n    double* right_distortion = param_storage.get_intrinsic_distortion_ptr(right_cam_index);\n\n    residual_ptrs.push_back(left_cam);\n    residual_ptrs.push_back(left_center);\n    residual_ptrs.push_back(left_focus);\n    residual_ptrs.push_back(left_distortion);\n    residual_ptrs.push_back(right_cam);\n    if (!intrinsics_opt.center_shared) residual_ptrs.push_back(right_center);\n    if (!intrinsics_opt.focus_shared) residual_ptrs.push_back(right_focus);\n    if (!intrinsics_opt.distortion_shared) residual_ptrs.push_back(right_distortion);\n  } else { // This handles the generic camera case.\n    residual_ptrs.push_back(left_cam);\n    residual_ptrs.push_back(right_cam);\n  }\n  return;\n}\n\nvoid BaDispXyzErr::unpack_residual_pointers(double const* const* parameters,\n                              std::vector<double const*> & left_param_blocks,\n                              std::vector<double const*> & right_param_blocks) const {\n\n  left_param_blocks.resize (m_num_left_param_blocks);\n  right_param_blocks.resize(m_num_right_param_blocks);\n\n  double const* raw_point = &(m_reference_xyz[0]);\n  left_param_blocks [0] = raw_point; // The first input is always the point param block.\n  right_param_blocks[0] = raw_point;\n\n  int index = 0;\n  for (size_t i = 1; i < m_num_left_param_blocks; i++) {\n    left_param_blocks[i] = parameters[index];\n    index++;\n  }\n  if (!m_solve_intrinsics) {\n    // Unpack everything from the right block in order.\n    for (size_t i = 1; i < m_num_right_param_blocks; i++) {\n      right_param_blocks[i] = parameters[index];\n      index++;\n    }\n  } else { // Solve for intrinsics. Handle shared intrinsics.\n    right_param_blocks[1] = parameters[index]; // Pose and position\n    index++;\n    if (m_intrinsics_opt.center_shared)\n      right_param_blocks[2] = left_param_blocks[2];\n    else {\n      right_param_blocks[2] = parameters[index];\n      index++;\n    }\n    if (m_intrinsics_opt.focus_shared)\n      right_param_blocks[3] = left_param_blocks[3];\n    else {\n      right_param_blocks[3] = parameters[index];\n      index++;\n    }\n    if (m_intrinsics_opt.distortion_shared)\n      right_param_blocks[4] = left_param_blocks[4];\n    else {\n      right_param_blocks[4] = parameters[index];\n      index++;\n    }\n  } // End pinhole case\n}\n\n// Factory to hide the construction of the CostFunction object from\n// the client code.\nceres::CostFunction* BaDispXyzErr::Create(\n    double max_disp_error, double reference_terrain_weight,\n    Vector3 const& reference_xyz, ImageViewRef<DispPixelT> const& interp_disp,\n    boost::shared_ptr<BaCamBase> left_ba_cam,\n    boost::shared_ptr<BaCamBase> right_ba_cam,\n    bool solve_intrinsics, asp::IntrinsicOptions intrinsics_opt) {\n\n  const int NUM_RESIDUALS = 2;\n\n  ceres::DynamicNumericDiffCostFunction<BaDispXyzErr>* cost_function =\n      new ceres::DynamicNumericDiffCostFunction<BaDispXyzErr>(\n          new BaDispXyzErr(max_disp_error, reference_terrain_weight,\n                              reference_xyz, interp_disp,\n                              left_ba_cam, right_ba_cam,\n                              solve_intrinsics, intrinsics_opt));\n\n  // The residual size is always the same.\n  cost_function->SetNumResiduals(NUM_RESIDUALS);\n\n  // Add all of the blocks for each camera, except for the first (point)\n  // block which is provided at creation time.\n  std::vector<int> block_sizes = left_ba_cam->get_block_sizes();\n  for (size_t i = 1; i < block_sizes.size(); i++) {\n    cost_function->AddParameterBlock(block_sizes[i]);\n  }\n  block_sizes = right_ba_cam->get_block_sizes();\n  if (!solve_intrinsics) {\n    for (size_t i = 1; i < block_sizes.size(); i++) {\n      cost_function->AddParameterBlock(block_sizes[i]);\n    }\n  } else { // Pinhole handling\n    if (block_sizes.size() != 5)\n      vw_throw(LogicErr() << \"Error: Pinhole camera model parameter number error!\");\n    cost_function->AddParameterBlock(block_sizes[1]); // The camera position/pose\n    if (!intrinsics_opt.center_shared) cost_function->AddParameterBlock(block_sizes[2]);\n    if (!intrinsics_opt.focus_shared) cost_function->AddParameterBlock(block_sizes[3]);\n    if (!intrinsics_opt.distortion_shared) cost_function->AddParameterBlock(block_sizes[4]);\n  }\n  return cost_function;\n}  // End function Create\n\n/// From the input options select the correct Ceres loss function.\nceres::LossFunction* get_loss_function(std::string const& cost_function, double th) {\n\n  ceres::LossFunction* loss_function = NULL;\n  if (cost_function == \"l2\")\n    loss_function = NULL;\n  else if (cost_function == \"trivial\")\n    loss_function = new ceres::TrivialLoss();\n  else if (cost_function == \"huber\")\n    loss_function = new ceres::HuberLoss(th);\n  else if (cost_function == \"cauchy\")\n    loss_function = new ceres::CauchyLoss(th);\n  else if (cost_function == \"l1\")\n    loss_function = new ceres::SoftLOneLoss(th);\n  else {\n    vw::vw_throw(vw::ArgumentErr() << \"Unknown cost function: \" << cost_function << \".\\n\");\n  }\n  return loss_function;\n}\n\n/// Add error source for projecting a 3D point into the camera.\nvoid addReprojResidual(vw::Vector2 const& observation,\n                       vw::Vector2 const& pixel_sigma,\n                       int point_index, int camera_index,\n                       asp::BaParams & param_storage,\n                       asp::BaOptions const& opt,\n                       ceres::SubsetManifold * dist_opts,\n                       ceres::Problem & problem) {\n\n  ceres::LossFunction* loss_function;\n  loss_function = get_loss_function(opt.cost_function, opt.robust_threshold);\n\n  boost::shared_ptr<CameraModel> cam = opt.camera_models[camera_index];\n\n  double* camera = param_storage.get_camera_ptr(camera_index);\n  double* point  = param_storage.get_point_ptr(point_index);\n\n  if (opt.camera_type == asp::BaCameraType_Other) {\n    // The generic camera case. This includes pinhole and CSM too, when\n    // the adjustments are external and intrinsics are not solved for.\n    boost::shared_ptr<BaCamBase> ba_cam(new BaAdjCam(cam,\n                                                      opt.bathy_data,\n                                                      camera_index));\n      ceres::CostFunction* cost_function =\n        BaReprojErr::Create(observation, pixel_sigma, ba_cam);\n      problem.AddResidualBlock(cost_function, loss_function, point, camera);\n\n  } else { // Solve for intrinsics for Pinhole, optical bar, or CSM camera\n    double* center     = param_storage.get_intrinsic_center_ptr    (camera_index);\n    double* focus      = param_storage.get_intrinsic_focus_ptr     (camera_index);\n    double* distortion = param_storage.get_intrinsic_distortion_ptr(camera_index);\n\n    boost::shared_ptr<BaCamBase> ba_cam;\n    if (opt.camera_type == asp::BaCameraType_Pinhole) {\n\n      boost::shared_ptr<PinholeModel> pinhole_model =\n        boost::dynamic_pointer_cast<PinholeModel>(cam);\n      if (pinhole_model.get() == NULL)\n        vw::vw_throw(vw::ArgumentErr()\n                      << \"Tried to add pinhole block with non-pinhole camera.\");\n      ba_cam = boost::make_shared<BaPinholeCam>(pinhole_model, opt.bathy_data, camera_index);\n\n    } else if (opt.camera_type == asp::BaCameraType_OpticalBar) {\n\n      boost::shared_ptr<vw::camera::OpticalBarModel> bar_model =\n        boost::dynamic_pointer_cast<vw::camera::OpticalBarModel>(cam);\n      if (bar_model.get() == NULL)\n        vw::vw_throw(vw::ArgumentErr() << \"Tried to add optical bar block with \"\n                      << \"non-optical bar camera.\");\n      ba_cam = boost::make_shared<BaOpticalBarCam>(bar_model, opt.bathy_data, camera_index);\n\n    } else if (opt.camera_type == asp::BaCameraType_CSM) {\n      boost::shared_ptr<asp::CsmModel> csm_model =\n        boost::dynamic_pointer_cast<asp::CsmModel>(cam);\n      if (csm_model.get() == NULL)\n        vw::vw_throw(vw::ArgumentErr() << \"Tried to add CSM block with \"\n                      << \"non-CSM camera.\");\n      ba_cam = boost::make_shared<BaCsmCam>(csm_model, opt.bathy_data, camera_index);\n    } else {\n      vw::vw_throw(vw::ArgumentErr() << \"Unknown camera type.\");\n    }\n\n    ceres::CostFunction* cost_function =\n      BaReprojErr::Create(observation, pixel_sigma, ba_cam);\n    problem.AddResidualBlock(cost_function, loss_function, point, camera,\n                             center, focus, distortion);\n\n    // Apply the residual limits\n    size_t num_limits = opt.intrinsics_limits.size() / 2;\n    if ((num_limits > 0) && (num_limits > ba_cam->num_intrinsic_params()))\n      vw::vw_throw(vw::ArgumentErr()\n                   << \"Error: Too many intrinsic limits provided.\"\n                   << \" This model has \" << ba_cam->num_intrinsic_params()\n                   << \" intrinsic parameters.\");\n\n    size_t intrinsics_index = 0;\n    // Focal length\n    if (num_limits > 0) {\n      problem.SetParameterLowerBound(focus, 0, opt.intrinsics_limits[0]);\n      problem.SetParameterUpperBound(focus, 0, opt.intrinsics_limits[1]);\n      intrinsics_index++;\n    }\n    // Optical center\n    while ((intrinsics_index < 3) && (intrinsics_index < num_limits)) {\n      problem.SetParameterLowerBound(center, intrinsics_index-1,\n                                     opt.intrinsics_limits[2*intrinsics_index]);\n      problem.SetParameterUpperBound(center, intrinsics_index-1,\n                                     opt.intrinsics_limits[2*intrinsics_index + 1]);\n      intrinsics_index++;\n    }\n    // Distortion\n    while (intrinsics_index < num_limits) {\n      problem.SetParameterLowerBound(distortion, intrinsics_index-3,\n                                     opt.intrinsics_limits[2*intrinsics_index]);\n      problem.SetParameterUpperBound(distortion, intrinsics_index-3,\n                                     opt.intrinsics_limits[2*intrinsics_index + 1]);\n      intrinsics_index++;\n    }\n\n    // If we don't want to solve for something, just tell Ceres not to adjust the values.\n    if (!opt.intrinsics_options.float_optical_center(camera_index))\n      problem.SetParameterBlockConstant(center);\n    if (!opt.intrinsics_options.float_focal_length(camera_index))\n      problem.SetParameterBlockConstant(focus);\n    if (opt.intrinsics_options.float_distortion_params(camera_index)) {\n      if (!opt.fixed_distortion_indices.empty() && dist_opts != NULL)\n        problem.SetManifold(distortion, dist_opts);\n    } else {\n      problem.SetParameterBlockConstant(distortion);\n    }\n  } // End non-generic camera case.\n\n  // Fix this camera if requested\n  if (opt.fixed_cameras_indices.find(camera_index) != opt.fixed_cameras_indices.end())\n    problem.SetParameterBlockConstant(param_storage.get_camera_ptr(camera_index));\n}\n\n/// Add residual block for the error using reference xyz.\nvoid addDispResidual(vw::Vector3 const& reference_xyz,\n                     vw::ImageViewRef<DispPixelT> const& interp_disp,\n                     int left_cam_index, int right_cam_index,\n                     asp::BaParams & param_storage,\n                     asp::BaOptions const& opt,\n                     ceres::Problem & problem) {\n\n  ceres::LossFunction* loss_function\n   = get_loss_function(opt.cost_function, opt.robust_threshold);\n\n  boost::shared_ptr<CameraModel> left_cam  = opt.camera_models[left_cam_index ];\n  boost::shared_ptr<CameraModel> right_cam = opt.camera_models[right_cam_index];\n\n  const bool inline_adjustments = (opt.camera_type != asp::BaCameraType_Other);\n\n  // Get the list of residual pointers that will be passed to ceres.\n  std::vector<double*> residual_ptrs;\n  BaDispXyzErr::get_residual_pointers(param_storage,\n                                        left_cam_index, right_cam_index,\n                                        inline_adjustments, opt.intrinsics_options,\n                                        residual_ptrs);\n if (opt.camera_type == asp::BaCameraType_Other) {\n\n    boost::shared_ptr<BaCamBase>\n      left_ba_cam (new BaAdjCam(left_cam,\n                                 opt.bathy_data,\n                                 left_cam_index));\n    boost::shared_ptr<BaCamBase>\n      right_ba_cam(new BaAdjCam(right_cam,\n                                 opt.bathy_data,\n                                 right_cam_index));\n    ceres::CostFunction* cost_function =\n      BaDispXyzErr::Create(opt.max_disp_error, opt.reference_terrain_weight,\n        reference_xyz, interp_disp, left_ba_cam, right_ba_cam,\n        inline_adjustments, opt.intrinsics_options);\n\n    problem.AddResidualBlock(cost_function, loss_function, residual_ptrs);\n\n  } else { // Inline adjustments\n\n    boost::shared_ptr<BaCamBase> left_ba_cam, right_ba_cam;\n\n    if (opt.camera_type == asp::BaCameraType_Pinhole) {\n      boost::shared_ptr<PinholeModel> left_pinhole_model =\n        boost::dynamic_pointer_cast<vw::camera::PinholeModel>(left_cam);\n      boost::shared_ptr<PinholeModel> right_pinhole_model =\n        boost::dynamic_pointer_cast<vw::camera::PinholeModel>(right_cam);\n      left_ba_cam = boost::make_shared<BaPinholeCam>(left_pinhole_model, opt.bathy_data, \n                                                     left_cam_index);\n      right_ba_cam = boost::make_shared<BaPinholeCam>(right_pinhole_model, opt.bathy_data, \n                                                      right_cam_index);\n\n    } else if (opt.camera_type == asp::BaCameraType_OpticalBar) {\n      boost::shared_ptr<vw::camera::OpticalBarModel> left_bar_model =\n        boost::dynamic_pointer_cast<vw::camera::OpticalBarModel>(left_cam);\n      boost::shared_ptr<vw::camera::OpticalBarModel> right_bar_model =\n        boost::dynamic_pointer_cast<vw::camera::OpticalBarModel>(right_cam);\n      left_ba_cam = boost::make_shared<BaOpticalBarCam>(left_bar_model, opt.bathy_data,\n                                                        left_cam_index);\n      right_ba_cam = boost::make_shared<BaOpticalBarCam>(right_bar_model, opt.bathy_data, \n                                                         right_cam_index);\n\n    } else if (opt.camera_type == asp::BaCameraType_CSM) {\n      boost::shared_ptr<asp::CsmModel> left_csm_model =\n        boost::dynamic_pointer_cast<asp::CsmModel>(left_cam);\n      boost::shared_ptr<asp::CsmModel> right_csm_model =\n        boost::dynamic_pointer_cast<asp::CsmModel>(right_cam);\n      left_ba_cam = boost::make_shared<BaCsmCam>(left_csm_model, opt.bathy_data, \n                                                 left_cam_index);\n      right_ba_cam = boost::make_shared<BaCsmCam>(right_csm_model, opt.bathy_data, \n                                                  right_cam_index);\n\n    } else {\n      vw::vw_throw(vw::ArgumentErr() << \"Unknown camera type.\");\n    }\n\n    ceres::CostFunction* cost_function =\n      BaDispXyzErr::Create(opt.max_disp_error, opt.reference_terrain_weight,\n                             reference_xyz, interp_disp, left_ba_cam, right_ba_cam,\n                             inline_adjustments, opt.intrinsics_options);\n    problem.AddResidualBlock(cost_function, loss_function, residual_ptrs);\n\n  }\n\n} // End function addDispResidual\n\n// Pixel reprojection error. Note: cam_residual_counts and num_pixels_per_cam\n// serve different purposes. \nvoid addPixelReprojCostFun(asp::BaOptions                         const& opt,\n                           asp::CRN                              const& crn,\n                           std::vector<int>                       const& count_map,\n                           vw::ImageViewRef<vw::PixelMask<float>> const& weight_image,\n                           vw::cartography::GeoReference          const& weight_image_georef,\n                           std::vector<vw::Vector3>               const& dem_xyz_vec,\n                           bool have_weight_image,\n                           bool have_dem,\n                           // Outputs\n                           vw::ba::ControlNetwork                  & cnet,\n                           asp::BaParams                           & param_storage,\n                           ceres::SubsetManifold                   * dist_opts,\n                           ceres::Problem                          & problem,\n                           std::vector<size_t>                     & cam_residual_counts,\n                           std::vector<size_t>                     & num_pixels_per_cam,\n                           std::vector<std::vector<vw::Vector2>>   & pixels_per_cam,\n                           std::vector<std::vector<vw::Vector3>>   & tri_points_per_cam,\n                           std::vector<std::map<int, vw::Vector2>> & pixel_sigmas) {\n\n  int num_cameras = param_storage.num_cameras();\n  int num_points  = param_storage.num_points();\n  if ((int)crn.size() != num_cameras)\n    vw_throw(ArgumentErr() << \"Book-keeping error, the size of CameraRelationNetwork \"\n             << \"must equal the number of images.\\n\");\n\n  cam_residual_counts.resize(num_cameras);\n  num_pixels_per_cam.resize(num_cameras);\n  pixels_per_cam.resize(num_cameras);\n  tri_points_per_cam.resize(num_cameras);\n  pixel_sigmas.resize(num_cameras);\n\n  for (int icam = 0; icam < num_cameras; icam++) { // Camera loop\n    cam_residual_counts[icam] = 0;\n    num_pixels_per_cam[icam] = 0;\n    for (auto fiter = crn[icam].begin(); fiter != crn[icam].end(); fiter++) { // IP loop\n\n      // The index of the 3D point this IP is for.\n      int ipt = (**fiter).m_point_id;\n      if (param_storage.get_point_outlier(ipt))\n        continue; // skip outliers\n\n      VW_ASSERT(int(icam) < num_cameras,\n                ArgumentErr() << \"Out of bounds in the number of cameras.\");\n      VW_ASSERT(int(ipt)  < num_points,\n                ArgumentErr() << \"Out of bounds in the number of points.\");\n\n      double* point = param_storage.get_point_ptr(ipt);\n      if (point[0] == 0 && point[1] == 0 && point[2] == 0) {\n        // Flag points in the center of the planet as outliers\n        param_storage.set_point_outlier(ipt, true);\n        continue;\n      }\n\n      // Weight from image, if provided\n      vw::PixelMask<float> img_wt = 1.0;\n      if (have_weight_image) {\n        Vector3 ecef(point[0], point[1], point[2]);\n        img_wt = vw::cartography::closestPixelVal(weight_image, weight_image_georef, ecef);\n\n        // Flag bad weights as outliers\n        if (!is_valid(img_wt) || std::isnan(img_wt.child()) || img_wt.child() <= 0.0) {\n          param_storage.set_point_outlier(ipt, true);\n          continue;\n        }\n      }\n\n      // Adjust non-GCP triangulated points based on the DEM, if\n      // provided.\n      bool is_gcp = (cnet[ipt].type() == vw::ba::ControlPoint::GroundControlPoint);\n      if (have_dem && !is_gcp && dem_xyz_vec.at(ipt) != Vector3(0, 0, 0)) {\n        // Update the tri point in param_storage based on the DEM.\n        for (int p = 0; p < 3; p++)\n          point[p] = dem_xyz_vec.at(ipt)[p];\n        // Set the point type, so we can track it later\n        cnet[ipt].set_type(vw::ba::ControlPoint::PointFromDem);\n        // Update the cnet as well. This will be used later.\n        cnet[ipt].set_position(Vector3(point[0], point[1], point[2]));\n\n        // Set the uncertainty to the uncertainty of the DEM \n        double s = opt.heights_from_dem_uncertainty;\n        cnet[ipt].set_sigma(Vector3(s, s, s));\n      }\n\n      // The observed value for the projection of point with index ipt into\n      // the camera with index icam.\n      Vector2 observation = (**fiter).m_location;\n      Vector2 pixel_sigma = (**fiter).m_scale;\n\n      // This is a bugfix\n      if (pixel_sigma != pixel_sigma) // nan check\n        pixel_sigma = Vector2(1, 1);\n\n      if (pixel_sigma[0] <= 0.0 || pixel_sigma[1] <= 0.0) {\n        // Cannot add a cost function term with non-positive pixel sigma\n        param_storage.set_point_outlier(ipt, true);\n        continue;\n      }\n\n      double p = opt.overlap_exponent;\n      if (p > 0 && count_map[ipt] > 2) {\n        // Give more weight to points that are seen in more images.\n        // This should not be overused. \n        double delta = pow(count_map[ipt] - 1.0, p);\n        pixel_sigma /= delta;\n      }\n\n      // Apply the weight image\n      if (have_weight_image)\n        pixel_sigma /= img_wt.child();\n\n      // Need this for --camera-position-weight \n      if (opt.camera_position_weight > 0) {\n        pixels_per_cam[icam].push_back(observation);\n        tri_points_per_cam[icam].push_back(cnet[ipt].position());\n      }\n      // For computing pixel reprojection errors\n      pixel_sigmas[icam][ipt] = pixel_sigma;\n\n      // Call function to add the appropriate Ceres residual block.\n      addReprojResidual(observation, pixel_sigma, ipt, icam,\n                                      param_storage, opt, dist_opts, problem);\n      cam_residual_counts[icam]++; // Track the number of residual blocks for each camera\n      num_pixels_per_cam[icam]++;  // Track the number of pixels for each camera\n\n    } // end iterating over points\n  } // end iterating over cameras\n\n  return;\n}\n\n// Add a soft constraint that ties triangulated points close to their initial positions.\n// This is adjusted for GSD.\nvoid addTriConstraint(asp::BaOptions           const& opt,\n                      vw::ba::ControlNetwork   const& cnet,\n                      asp::CRN                 const& crn,\n                      std::vector<std::string> const& image_files,\n                      std::vector<vw::CamPtr>  const& orig_cams,\n                      double tri_weight,\n                      std::string cost_function_str,\n                      double tri_robust_threshold,\n                      // Outputs\n                      asp::BaParams  & param_storage,\n                      ceres::Problem & problem,\n                      int            & num_tri_residuals) {\n\n  // Initialize the output\n  num_tri_residuals = 0;\n\n  // Tri weight must be positive\n  if (tri_weight <= 0)\n    vw::vw_throw(vw::ArgumentErr() << \"The triangulation weight must be positive.\\n\");\n\n  int num_points = param_storage.num_points();\n  if ((int)cnet.size() != num_points)\n  vw_throw(ArgumentErr() << \"Book-keeping error, the size of the control network \"\n            \"must be the same as the number of triangulated points.\\n\");\n\n  // Add triangulation weight to make each triangulated point not move too far\n  std::vector<double> gsds;\n  asp::estimateGsdPerTriPoint(image_files, orig_cams, crn, param_storage, gsds);\n  for (int ipt = 0; ipt < num_points; ipt++) {\n    if (cnet[ipt].type() == vw::ba::ControlPoint::GroundControlPoint ||\n        cnet[ipt].type() == vw::ba::ControlPoint::PointFromDem)\n      continue; // Skip GCPs and height-from-dem points which have their own constraint\n\n    if (param_storage.get_point_outlier(ipt))\n      continue; // skip outliers\n\n    // Use as constraint the triangulated point optimized at the previous\n    // iteration. That is on purpose, to ensure that the triangulated point is\n    // more accurate than it was at the start of the optimization. For the\n    // first iteration, that will be what is read from the cnet. Note how the\n    // weight is normalized by the GSD, to make it in pixel coordinates, as\n    // the rest of the residuals.\n    double * point = param_storage.get_point_ptr(ipt);\n    Vector3 observation(point[0], point[1], point[2]);\n    double gsd = gsds[ipt];\n    if (gsd <= 0 || std::isnan(gsd))\n      continue; // GSD calculation failed. Do not use a constraint.\n\n    double s = gsd/tri_weight;\n    Vector3 xyz_sigma(s, s, s);\n\n    ceres::CostFunction* cost_function = XYZError::Create(observation, xyz_sigma);\n    ceres::LossFunction* loss_function\n      = get_loss_function(cost_function_str, tri_robust_threshold);\n    problem.AddResidualBlock(cost_function, loss_function, point);\n\n    num_tri_residuals++;\n  } // End loop through xyz\n\n} // end adding a triangulation constraint\n\n// Add a cost function meant to tie up to known disparity form left to right\n// image and known ground truth reference terrain (option --reference-terrain).\n// This was only tested for pinhole cameras. Disparity must be created with\n// stereo with the option --unalign-disparity. If there are n images, there must\n// be n-1 disparities, from each image to the next.\nvoid addRefTerrainCostFun(asp::BaOptions                            & opt,\n                          asp::BaParams                             & param_storage,\n                          ceres::Problem                            & problem,\n                          std::vector<vw::Vector3>                  & reference_vec,\n                          std::vector<vw::ImageViewRef<DispPixelT>> & interp_disp) {\n\n  size_t num_cameras = param_storage.num_cameras();\n\n  // Set up a GeoReference object using the datum, it may get modified later\n  vw::cartography::GeoReference geo;\n  geo.set_datum(opt.datum); // We checked for a datum earlier\n\n  // Load the reference data\n  std::vector<vw::Vector3> input_reference_vec;\n  std::vector<ImageView<DispPixelT>> disp_vec;\n  asp::load_csv_or_dem(opt.csv_format_str, opt.csv_srs, opt.reference_terrain,\n                        opt.max_num_reference_points,\n                        geo, input_reference_vec); // outputs\n\n  if (loadRefDisp(opt.disparity_list, disp_vec, interp_disp) != num_cameras-1)\n    vw_throw(ArgumentErr() << \"Expecting one less disparity than there are cameras.\\n\");\n\n  // Read the image boxes. They are needed to find the GSD per camera.\n  std::vector<vw::BBox2i> image_boxes;\n  for (int icam = 0; icam < num_cameras; icam++) {\n    vw::DiskImageView<float> img(opt.image_files[icam]);\n    vw::BBox2i bbox = vw::bounding_box(img);\n    image_boxes.push_back(bbox);\n  }\n\n  vw::vw_out() << \"Setting up the error to the reference terrain.\\n\";\n  vw::TerminalProgressCallback tpc(\"\", \"\\t--> \");\n  tpc.report_progress(0);\n  double inc_amount = 1.0/double(input_reference_vec.size());\n\n  reference_vec.clear();\n  for (size_t data_col = 0; data_col < input_reference_vec.size(); data_col++) {\n\n    vw::Vector3 reference_xyz = input_reference_vec[data_col];\n\n    // Filter by lonlat box if provided, this is very much recommended\n    // to quickly discard most points in the huge reference terrain.\n    // Let's hope there is no 360 degree offset when computing\n    // the longitude. \n    if (asp::stereo_settings().lon_lat_limit != BBox2(0,0,0,0)) {\n      vw::Vector3 llh = geo.datum().cartesian_to_geodetic(reference_xyz);\n      vw::Vector2 ll  = subvector(llh, 0, 2);\n      if (!asp::stereo_settings().lon_lat_limit.contains(ll)) {\n        continue;\n      }\n    }\n\n    Vector2 left_pred, right_pred;\n\n    // Iterate over the cameras, add a residual for each point and each camera pair.\n    for (int icam = 0; icam < num_cameras - 1; icam++) {\n\n      boost::shared_ptr<CameraModel> left_cam  = opt.camera_models[icam];\n      boost::shared_ptr<CameraModel> right_cam = opt.camera_models[icam+1];\n\n      try {\n        left_pred  = left_cam->point_to_pixel (reference_xyz);\n        right_pred = right_cam->point_to_pixel(reference_xyz);\n      } catch (const camera::PointToPixelErr& e) {\n        continue; // Skip point if there is a projection issue.\n      }\n\n      if ((left_pred != left_pred) || (right_pred != right_pred))\n        continue; // nan check\n\n      if (!interp_disp[icam].pixel_in_bounds(left_pred))\n        continue; // Interp check\n\n      DispPixelT dispPix = interp_disp[icam](left_pred[0], left_pred[1]);\n      if (!is_valid(dispPix))\n        continue;\n\n      // Check if the current point projects in the cameras\n      if (!image_boxes[icam  ].contains(left_pred) ||\n          !image_boxes[icam+1].contains(right_pred)) {\n        continue;\n      }\n\n      Vector2 right_pix = left_pred + dispPix.child();\n      if (!image_boxes[icam+1].contains(right_pix))\n        continue; // Check offset location too\n\n      if (right_pix != right_pix || norm_2(right_pix - right_pred) > opt.max_disp_error) {\n        // Ignore pixels which are too far from where they should be before optimization\n        continue;\n      }\n\n      // Only the used reference points are stored here\n      reference_vec.push_back(reference_xyz);\n\n      // Call function to select the appropriate Ceres residual block to add.\n      addDispResidual(reference_xyz, interp_disp[icam],\n                                    icam, icam + 1, // left icam and right icam\n                                    param_storage, opt, problem);\n    }\n    tpc.report_incremental_progress(inc_amount);\n  }\n\n  tpc.report_finished();\n  vw_out() << \"Found \" << reference_vec.size() << \" reference points in range.\\n\";\n}\n\n// Add a soft constraint to keep the cameras near the original position. \n// Add a combined constraint for all reprojection errors in given camera.\nvoid addCamPosCostFun(asp::BaOptions                          const& opt,\n                      asp::BaParams                           const& orig_parameters,\n                      std::vector<std::vector<vw::Vector2>>   const& pixels_per_cam,\n                      std::vector<std::vector<vw::Vector3>>   const& tri_points_per_cam,\n                      std::vector<std::map<int, vw::Vector2>> const& pixel_sigmas,\n                      std::vector<vw::CamPtr>                 const& orig_cams,\n                      // Outputs\n                      asp::BaParams                              & param_storage,\n                      ceres::Problem                             & problem,\n                      int                                        & num_cam_pos_residuals) {\n\n  num_cam_pos_residuals = 0;\n\n  // Image bboxes\n  std::vector<vw::BBox2> bboxes;\n  for (size_t i = 0; i < opt.image_files.size(); i++) {\n    vw::DiskImageView<float> img(opt.image_files[i]);\n    bboxes.push_back(bounding_box(img));\n  }\n\n  int num_cameras = param_storage.num_cameras();\n  for (int icam = 0; icam < num_cameras; icam++) {\n\n    // There must be as many pixels_per_cam as pixel_sigmas per cam\n    if (pixels_per_cam[icam].size() != pixel_sigmas[icam].size())\n      vw_throw(ArgumentErr() << \"Expecting as many pixels as pixel sigmas per camera.\\n\");\n\n    // Adjustments to initial and current cameras\n    double const* orig_cam_ptr = orig_parameters.get_camera_ptr(icam);\n    double * cam_ptr  = param_storage.get_camera_ptr(icam);\n\n    double sum = 0.0;\n    int count = 0;\n    std::vector<double> pos_wts;\n    auto pix_sigma_it = pixel_sigmas[icam].begin();\n    for (size_t ipix = 0; ipix < pixels_per_cam[icam].size(); ipix++) {\n\n      vw::Vector2 pixel_obs = pixels_per_cam[icam][ipix];\n      vw::Vector3 xyz_obs = tri_points_per_cam[icam][ipix];\n      double pixel_sigma = norm_2(pix_sigma_it->second);\n      if (pix_sigma_it == pixel_sigmas[icam].end())\n        vw::vw_throw(vw::ArgumentErr() << \"Out of bounds for pixel sigmas.\\n\");\n      pix_sigma_it++; // Update for the next iteration\n      if (pixel_sigma <= 0.0 || std::isnan(pixel_sigma))\n        continue;\n\n      double gsd = 0.0;\n      try {\n        gsd = vw::camera::estimatedGSD(orig_cams[icam].get(), bboxes[icam],\n                                       pixel_obs, xyz_obs);\n      } catch (...) {\n        continue;\n      }\n      if (gsd <= 0)\n        continue;\n\n      // Care with computing the weight\n      double position_wt = opt.camera_position_weight / (gsd * pixel_sigma);\n      sum += position_wt;\n      count++;\n      pos_wts.push_back(position_wt);\n    }\n\n    // Skip for zero count\n    if (count == 0)\n      continue;\n\n    // The median weight was shown to be more robust to outliers \n    // than the mean weight.\n    double median_wt = vw::math::destructive_median(pos_wts);\n\n    // Based on the CERES loss function formula, adding N loss functions each \n    // with weight w and robust threshold t is equivalent to adding one loss \n    // function with weight sqrt(N)*w and robust threshold sqrt(N)*t.\n    double combined_wt  = sqrt(count * 1.0) * median_wt;\n    double combined_th = sqrt(count * 1.0) * opt.camera_position_robust_threshold;\n    double rotation_wt = 0.0; // This will be handled separately\n    ceres::CostFunction* cost_function\n        = RotTransError::Create(orig_cam_ptr, rotation_wt, combined_wt);\n    ceres::LossFunction* loss_function\n       = get_loss_function(opt.cost_function, combined_th);\n    problem.AddResidualBlock(cost_function, loss_function, cam_ptr);\n    num_cam_pos_residuals++;\n  }\n}\n\n// Add a ground constraint (GCP or height from DEM)\nvoid addGcpOrDemConstraint(asp::BaBaseOptions const& opt,\n                           std::string        const& cost_function_str,\n                           bool                      use_llh_error,\n                           bool                      fix_gcp_xyz,\n                           // Outputs\n                           vw::ba::ControlNetwork & cnet,\n                           int                    & num_gcp,\n                           int                    & num_gcp_or_dem_residuals,\n                           asp::BaParams          & param_storage,\n                           ceres::Problem         & problem) {\n\n  int num_tri_points  = param_storage.num_points();\n  if (num_tri_points != (int)cnet.size())\n    vw::vw_throw(vw::ArgumentErr() << \"Book-keeping error, the size of the control network \"\n             << \"must equal the number of points.\\n\");\n\n  num_gcp = 0;\n  num_gcp_or_dem_residuals = 0;\n\n  for (int ipt = 0; ipt < num_tri_points; ipt++) {\n    if (cnet[ipt].type() != vw::ba::ControlPoint::GroundControlPoint &&\n        cnet[ipt].type() != vw::ba::ControlPoint::PointFromDem)\n      continue; // Skip non-GCP's and points which do not need special treatment\n\n    if (param_storage.get_point_outlier(ipt))\n      continue; // skip outliers\n\n    if (cnet[ipt].type() == vw::ba::ControlPoint::GroundControlPoint)\n      num_gcp++;\n\n    vw::Vector3 observation = cnet[ipt].position();\n    vw::Vector3 xyz_sigma   = cnet[ipt].sigma();\n\n    ceres::CostFunction* cost_function = NULL;\n    if (!use_llh_error) {\n      cost_function = asp::XYZError::Create(observation, xyz_sigma);\n    } else {\n      vw::Vector3 llh_sigma = xyz_sigma;\n      // make lat, lon into lon, lat\n      std::swap(llh_sigma[0], llh_sigma[1]);\n      cost_function = LLHError::Create(observation, llh_sigma, opt.datum);\n    }\n\n    // For GCP a robust cost function is not used, as those are assumed to be\n    // accurate. This may need to change for GCP produced with dem2gcp. With the\n    // --heights-from-dem option, a robust cost function is used, with its own\n    // robust threshold.\n    ceres::LossFunction* loss_function = NULL;\n    if (opt.heights_from_dem != \"\"           &&\n        opt.heights_from_dem_uncertainty > 0 &&\n        opt.heights_from_dem_robust_threshold > 0) {\n      loss_function\n      = get_loss_function(cost_function_str, opt.heights_from_dem_robust_threshold);\n    } else {\n      loss_function = new ceres::TrivialLoss();\n    }\n    double * tri_point  = param_storage.get_point_ptr(ipt);\n    problem.AddResidualBlock(cost_function, loss_function, tri_point);\n\n    num_gcp_or_dem_residuals++;\n\n    // Ground xyz whose sigma is asp::FIXED_GCP_SIGMA (a tiny positive value) are set to fixed\n    double s = asp::FIXED_GCP_SIGMA;\n    if (cnet[ipt].type() == vw::ba::ControlPoint::GroundControlPoint &&\n        (fix_gcp_xyz || xyz_sigma == vw::Vector3(s, s, s))) {\n      cnet[ipt].set_sigma(Vector3(s, s, s)); // will be saved in the ISIS cnet\n      problem.SetParameterBlockConstant(tri_point);\n    }\n\n  } // End loop through triangulated points\n\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Camera/BundleAdjustCostFuns.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#ifndef __ASP_CAMERA_BUNDLE_ADJUST_COST_FUNCTIONS_H__\n#define __ASP_CAMERA_BUNDLE_ADJUST_COST_FUNCTIONS_H__\n\n// Ceres cost functions used by bundle_adjust.\n\n#include <asp/Camera/CsmModel.h>\n#include <asp/Camera/BundleAdjustCamera.h>\n#include <asp/Core/BundleAdjustUtils.h>\n\n// Turn off warnings from eigen\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wunused-local-typedefs\"\n#include <ceres/ceres.h>\n#include <ceres/loss_function.h>\n#include <ceres/manifold.h>\n#pragma GCC diagnostic pop\n\ntypedef vw::PixelMask<vw::Vector<float, 2>> DispPixelT;\n\n// Forward declaration\nnamespace vw {\n  namespace camera {\n    class OpticalBarModel;\n  }\n}\nnamespace asp {\n  struct BaOptions;\n  struct BaParams;\n}\n\nnamespace asp {\n\n/// Simple base class for unpacking Ceres parameter blocks into\n///  a camera model which can do point projections.\nclass BaCamBase {\npublic:\n\n  // These are the same for every camera.\n  int num_point_params() const { return 3; }\n  int num_pose_params () const { return 6; }\n\n  /// This is for all camera parameters other than the pose parameters.\n  /// - These can be spread out across multiple parameter blocks.\n  virtual int num_intrinsic_params() const = 0;\n\n  int num_params() const {\n    return num_point_params() + num_pose_params() + num_intrinsic_params();\n  }\n\n  /// Return the number of Ceres input parameter blocks.\n  virtual int num_parameter_blocks() const = 0;\n\n  /// Return the size of each parameter block.\n  /// - These should sum up to equal num_params.\n  /// - The first block is always the point block (3) and\n  ///   the second block is always the pose block (6).\n  virtual std::vector<int> get_block_sizes() const;\n\n  /// Read in all of the parameters and generate an output pixel observation.\n  /// - Throws if the point does not project in to the camera.\n  virtual vw::Vector2 evaluate(std::vector<double const*> const param_blocks) const = 0;\n\n}; // End class BaCamBase\n\n/// Simple wrapper for the vw::camera::AdjustedCameraModel class with a \n/// preconfigured underlying camera.  Only uses translation and rotation.\n/// - Just vary the six camera adjustment parameters which are all in \n///   a single parameter block.\nclass BaAdjCam: public BaCamBase {\npublic:\n\n  BaAdjCam(boost::shared_ptr<vw::camera::CameraModel> cam,\n           vw::BathyData const& bathy_data,\n           int camera_index):\n    m_underlying_camera(cam), m_bathy_data(bathy_data), m_camera_index(camera_index) {}\n\n  virtual int num_intrinsic_params() const {return 0;}\n\n  /// Return the number of Ceres input parameter blocks.\n  /// - (camera), (point)\n  virtual int num_parameter_blocks() const {return 2;}\n\n  /// Read in all of the parameters and compute the residuals.\n  virtual vw::Vector2 evaluate(std::vector<double const*> const param_blocks) const;\n\nprivate:\n\n  /// This camera will be adjusted by the input parameters.\n  boost::shared_ptr<vw::camera::CameraModel> m_underlying_camera;\n  vw::BathyData const& m_bathy_data;\n  int m_camera_index;\n\n}; // End class BaAdjCam\n\n/// \"Full service\" pinhole model which solves for all desired camera parameters.\n/// - If the current run does not want to solve for everything, those parameter\n///   blocks should be set as constant so that Ceres does not change them.\nclass BaPinholeCam: public BaCamBase {\npublic:\n\n  BaPinholeCam(boost::shared_ptr<vw::camera::PinholeModel> cam,\n               vw::BathyData const& bathy_data,\n               int camera_index);\n\n  /// The number of lens distortion parameters.\n  int num_dist_params() const;\n\n // Center, focus, and lens distortion\n  virtual int num_intrinsic_params() const {\n    return asp::NUM_CENTER_PARAMS + asp::NUM_FOCUS_PARAMS + num_dist_params();\n  }\n\n  /// Return the number of Ceres input parameter blocks.\n  /// - (camera), (point), (center), (focus), (lens distortion)\n  virtual int num_parameter_blocks() const { return 5; }\n\n  virtual std::vector<int> get_block_sizes() const;\n\n  /// Read in all of the parameters and compute the residuals.\n  virtual vw::Vector2 evaluate(std::vector<double const*> const param_blocks) const;\n\nprivate:\n\n  // TODO: Cache the constructed camera to save time when just the point changes!\n\n  // TODO: Make const\n  /// This camera is used for all of the intrinsic values.\n  boost::shared_ptr<vw::camera::PinholeModel> m_underlying_camera;\n  vw::BathyData const& m_bathy_data;\n  int m_camera_index;\n\n}; // End class BaPinholeCam\n\n/// \"Full service\" optical bar model which solves for all desired camera parameters.\n/// - If the current run does not want to solve for everything, those parameter\n///   blocks should be set as constant so that Ceres does not change them.\nclass BaOpticalBarCam: public BaCamBase {\npublic:\n\n  BaOpticalBarCam(boost::shared_ptr<vw::camera::OpticalBarModel> cam,\n                  vw::BathyData const& bathy_data,\n                  int camera_index);\n\n  // Center, focus, and extra optical bar parameters\n  virtual int num_intrinsic_params() const;\n\n  /// Return the number of Ceres input parameter blocks.\n  /// - (camera), (point), (center), (focus), (other intrinsic parameters)\n  virtual int num_parameter_blocks() const {return 5;}\n\n  virtual std::vector<int> get_block_sizes() const;\n\n  /// Read in all of the parameters and compute the residuals.\n  virtual vw::Vector2 evaluate(std::vector<double const*> const param_blocks) const;\n\nprivate:\n\n  // TODO: Cache the constructed camera to save time when just the point changes!\n\n  // TODO: Make const\n  /// This camera is used for all of the intrinsic values.\n  boost::shared_ptr<vw::camera::OpticalBarModel> m_underlying_camera;\n  vw::BathyData const& m_bathy_data;\n  int m_camera_index;\n\n}; // End class BaOpticalBarCam\n\n/// \"Full service\" CSM model which solves for all desired camera parameters.\n/// - If the current run does not want to solve for everything, those parameter\n///   blocks should be set as constant so that Ceres does not change them.\nclass BaCsmCam: public BaCamBase {\npublic:\n\n  BaCsmCam(boost::shared_ptr<asp::CsmModel> cam,\n           vw::BathyData const& bathy_data,\n           int camera_index):\n   m_underlying_camera(cam), m_bathy_data(bathy_data), m_camera_index(camera_index) {}\n\n  /// The number of lens distortion parameters.\n  int num_dist_params() const {\n    return m_underlying_camera->distortion().size();\n  }\n\n  virtual int num_intrinsic_params() const {\n     // Center, focus, and lens distortion\n    return asp::NUM_CENTER_PARAMS + asp::NUM_FOCUS_PARAMS + num_dist_params();\n  }\n\n  /// Return the number of Ceres input parameter blocks.\n  /// - (camera), (point), (center), (focus), (lens distortion)\n  virtual int num_parameter_blocks() const {return 5;}\n\n  virtual std::vector<int> get_block_sizes() const;\n\n  /// Read in all of the parameters and compute the residuals.\n  virtual vw::Vector2 evaluate(std::vector<double const*> const param_blocks) const;\n\nprivate:\n\n  // TODO: Cache the constructed camera to save time when just the point changes!\n\n  // TODO: Make const\n  /// This camera is used for all of the intrinsic values.\n  boost::shared_ptr<asp::CsmModel> m_underlying_camera;\n  vw::BathyData const& m_bathy_data;\n  int m_camera_index;\n\n}; // End class BaCsmCam\n\n//=========================================================================\n// Cost functions for Ceres\n\n/// A Ceres cost function. We pass in the observation and the model.\n///  The result is the residual, the difference in the observation \n///  and the projection of the point into the camera, normalized by pixel_sigma.\nstruct BaReprojErr {\n  BaReprojErr(vw::Vector2 const& observation, vw::Vector2 const& pixel_sigma,\n                      boost::shared_ptr<BaCamBase> ba_cam):\n    m_observation(observation),\n    m_pixel_sigma(pixel_sigma),\n    m_num_param_blocks(ba_cam->num_parameter_blocks()),\n    m_ba_cam(ba_cam) {}\n\n  // Call to work with ceres::DynamicCostFunctions.\n  // - Takes array of arrays.\n  bool operator()(double const * const * parameters, double * residuals) const;\n\n  // Factory to hide the construction of the CostFunction object from the client code.\n  static ceres::CostFunction* Create(vw::Vector2 const& observation,\n                                     vw::Vector2 const& pixel_sigma,\n                                     boost::shared_ptr<BaCamBase> ba_cam);\n\nprivate:\n  vw::Vector2 m_observation; ///< The pixel observation for this camera/point pair.\n  vw::Vector2 m_pixel_sigma;\n  size_t  m_num_param_blocks;\n  boost::shared_ptr<BaCamBase> m_ba_cam; ///< Pointer to the camera model object.\n\n}; // End class BaReprojErr\n\n/// A ceres cost function. Here we float two pinhole camera's\n/// intrinsic and extrinsic parameters. We take as input a reference\n/// xyz point and a disparity from left to right image. The\n/// error metric is the following: The reference xyz point is projected in the\n/// left image. It is mapped via the disparity to the right\n/// image. There, the residual error is the difference between that\n/// pixel and the pixel obtained by projecting the xyz point\n/// straight into the right image.\nstruct BaDispXyzErr {\n  BaDispXyzErr(double max_disp_error,\n                 double reference_terrain_weight,\n                 vw::Vector3 const& reference_xyz,\n                 vw::ImageViewRef<DispPixelT> const& interp_disp,\n                 boost::shared_ptr<BaCamBase> left_ba_cam,\n                 boost::shared_ptr<BaCamBase> right_ba_cam,\n                 bool solve_intrinsics, // Would like to remove these!\n                 asp::IntrinsicOptions intrinsics_opt):\n  m_max_disp_error(max_disp_error),\n  m_reference_terrain_weight(reference_terrain_weight),\n  m_reference_xyz(reference_xyz),\n  m_interp_disp (interp_disp),\n  m_num_left_param_blocks (left_ba_cam->num_parameter_blocks ()),\n  m_num_right_param_blocks(right_ba_cam->num_parameter_blocks()),\n  m_left_ba_cam(left_ba_cam),\n  m_right_ba_cam(right_ba_cam),\n  m_solve_intrinsics(solve_intrinsics),\n  m_intrinsics_opt(intrinsics_opt) {}\n\n  // Adaptor to work with ceres::DynamicCostFunctions.\n  bool operator()(double const* const* parameters, double* residuals) const;\n\n  // TODO: Should this logic live somewhere else?\n  /// Create the list of residual pointers when solving for intrinsics.\n  /// - Extra logic is needed to avoid duplicate pointers.\n  static void get_residual_pointers(asp::BaParams &param_storage,\n                                    int left_cam_index, int right_cam_index,\n                                    bool solve_intrinsics,\n                                    asp::IntrinsicOptions const& intrinsics_opt,\n                                    std::vector<double*> &residual_ptrs);\n\n  void unpack_residual_pointers(double const* const* parameters,\n                                std::vector<double const*> & left_param_blocks,\n                                std::vector<double const*> & right_param_blocks) const;\n\n  // Factory to hide the construction of the CostFunction object from\n  // the client code.\n  static ceres::CostFunction* Create(\n      double max_disp_error, double reference_terrain_weight,\n      vw::Vector3 const& reference_xyz, vw::ImageViewRef<DispPixelT> const& interp_disp,\n      boost::shared_ptr<BaCamBase> left_ba_cam,\n      boost::shared_ptr<BaCamBase> right_ba_cam,\n      bool solve_intrinsics, asp::IntrinsicOptions intrinsics_opt);\n\n  double m_max_disp_error, m_reference_terrain_weight;\n  vw::Vector3 m_reference_xyz;\n  vw::ImageViewRef<DispPixelT> const& m_interp_disp;\n  size_t m_num_left_param_blocks, m_num_right_param_blocks;\n  // TODO: Make constant!\n  boost::shared_ptr<BaCamBase> m_left_ba_cam;\n  boost::shared_ptr<BaCamBase> m_right_ba_cam;\n\n  // Would like to not have these two!\n  bool m_solve_intrinsics;\n  asp::IntrinsicOptions m_intrinsics_opt;\n};\n\n/// A ceres cost function. The residual is the difference between the\n/// original camera center and the current (floating) camera center.\n/// This cost function prevents the cameras from straying too far from\n/// their starting point.\nstruct CamError {\n\n  CamError(double const* orig_cam, double weight):\n    m_orig_cam(DATA_SIZE), m_weight(weight) {\n      for (int i = 0; i < DATA_SIZE; i++)\n        m_orig_cam[i] = orig_cam[i];\n    }\n\n  template <typename T>\n  bool operator()(const T* cam_vec, T* residuals) const {\n\n    // Position units are meters. Don't lock the camera down too tightly.\n    const double POSITION_WEIGHT = 1e-2;\n    // Rotation units are in radians. \n    const double ROTATION_WEIGHT = 5e1;\n\n    for (size_t p = 0; p < DATA_SIZE/2; p++) {\n      residuals[p] = POSITION_WEIGHT*m_weight*(cam_vec[p] - m_orig_cam[p]);\n    }\n    for (size_t p = DATA_SIZE/2; p < DATA_SIZE; p++) {\n      residuals[p] = ROTATION_WEIGHT*m_weight*(cam_vec[p] - m_orig_cam[p]);\n    }\n\n    return true;\n  }\n\n  // Factory to hide the construction of the CostFunction object from the client code.\n  static ceres::CostFunction* Create(const double *const orig_cam, double weight) {\n    return (new ceres::AutoDiffCostFunction<CamError, DATA_SIZE, DATA_SIZE>\n            (new CamError(orig_cam, weight)));\n  }\n\nprivate:\n\n  // The camera must be represented by a six element array.\n  static const int DATA_SIZE = 6;\n\n  std::vector<double> m_orig_cam;\n  double m_weight;\n};\n\n/// A ceres cost function. The residual is the rotation + translation\n/// vector difference, each multiplied by a weight. Hence, a larger\n/// rotation weight will result in less rotation change in the final\n/// result, etc. This is somewhat different than CamError as there is no\n/// penalty here for this cost function going very large, the scaling is\n/// different, and there is finer-grained control. \nstruct RotTransError {\n\n  RotTransError(double const* orig_cam, double rotation_weight, double translation_weight):\n    m_orig_cam(DATA_SIZE), m_rotation_weight(rotation_weight),\n    m_translation_weight(translation_weight) {\n    for (int i = 0; i < DATA_SIZE; i++)\n        m_orig_cam[i] = orig_cam[i];\n    }\n\n  template <typename T>\n  bool operator()(const T* cam_vec, T* residuals) const {\n\n    for (size_t p = 0; p < DATA_SIZE/2; p++) {\n      residuals[p] = m_translation_weight*(cam_vec[p] - m_orig_cam[p]);\n    }\n\n    for (size_t p = DATA_SIZE/2; p < DATA_SIZE; p++) {\n      residuals[p] = m_rotation_weight*(cam_vec[p] - m_orig_cam[p]);\n    }\n\n    return true;\n  }\n\n  // Factory to hide the construction of the CostFunction object from\n  // the client code.\n  static ceres::CostFunction* Create(const double *const orig_cam,\n                                     double rotation_weight, double translation_weight) {\n    return (new ceres::AutoDiffCostFunction<RotTransError, DATA_SIZE, DATA_SIZE>\n            (new RotTransError(orig_cam, rotation_weight, translation_weight)));\n\n  }\n\nprivate:\n\n  // The camera must be represented by a six element array.\n  static const int DATA_SIZE = 6;\n\n  std::vector<double> m_orig_cam;\n  double m_rotation_weight, m_translation_weight;\n};\n\n/// From the input options select the correct Ceres loss function.\nceres::LossFunction* get_loss_function(std::string const& cost_function, double th);\n\n// Pixel reprojection error. Note: cam_residual_counts and num_pixels_per_cam\n// serve different purposes. \nvoid addPixelReprojCostFun(asp::BaOptions                         const& opt,\n                           asp::CRN                              const& crn,\n                           std::vector<int>                       const& count_map,\n                           vw::ImageViewRef<vw::PixelMask<float>> const& weight_image,\n                           vw::cartography::GeoReference          const& weight_image_georef,\n                           std::vector<vw::Vector3>               const& dem_xyz_vec,\n                           bool have_weight_image,\n                           bool have_dem,\n                           // Outputs\n                           vw::ba::ControlNetwork                  & cnet,\n                           asp::BaParams                           & param_storage,\n                           ceres::SubsetManifold                   * dist_opts,\n                           ceres::Problem                          & problem,\n                           std::vector<size_t>                     & cam_residual_counts,\n                           std::vector<size_t>                     & num_pixels_per_cam,\n                           std::vector<std::vector<vw::Vector2>>   & pixels_per_cam,\n                           std::vector<std::vector<vw::Vector3>>   & tri_points_per_cam,\n                           std::vector<std::map<int, vw::Vector2>> & pixel_sigmas);\n\n// Add a soft constraint that ties triangulated points close to their initial positions.\n// This is adjusted for GSD.\nvoid addTriConstraint(asp::BaOptions           const& opt,\n                      vw::ba::ControlNetwork   const& cnet,\n                      asp::CRN                const& crn,\n                      std::vector<std::string> const& image_files,\n                      std::vector<vw::CamPtr>  const& orig_cams,\n                      double tri_weight,\n                      std::string cost_function_str,\n                      double tri_robust_threshold,\n                      // Outputs\n                      asp::BaParams  & param_storage,\n                      ceres::Problem & problem,\n                      int            & num_tri_residuals);\n\n// Add a ground constraint (GCP or height from DEM)\nvoid addGcpOrDemConstraint(asp::BaBaseOptions const& opt,\n                           std::string       const& cost_function_str,\n                           bool                     use_llh_error,\n                           bool                     fix_gcp_xyz,\n                           // Outputs\n                           vw::ba::ControlNetwork & cnet,\n                           int                    & num_gcp,\n                           int                    & num_gcp_or_dem_residuals,\n                           asp::BaParams          & param_storage,\n                           ceres::Problem         & problem);\n\n// Add a cost function meant to tie up to known disparity form left to right\n// image and known ground truth reference terrain (option --reference-terrain).\n// This was only tested for pinhole cameras. Disparity must be created with\n// stereo with the option --unalign-disparity. If there are n images, there must\n// be n-1 disparities, from each image to the next.\nvoid addRefTerrainCostFun(asp::BaOptions                            & opt,\n                          asp::BaParams                             & param_storage,\n                          ceres::Problem                            & problem,\n                          std::vector<vw::Vector3>                  & reference_vec,\n                          std::vector<vw::ImageViewRef<DispPixelT>> & interp_disp);\n\n// Add a soft constraint to keep the cameras near the original position. \n// Add a combined constraint for all reprojection errors in given camera.\nvoid addCamPosCostFun(asp::BaOptions                          const& opt,\n                      asp::BaParams                           const& orig_parameters,\n                      std::vector<std::vector<vw::Vector2>>   const& pixels_per_cam,\n                      std::vector<std::vector<vw::Vector3>>   const& tri_points_per_cam,\n                      std::vector<std::map<int, vw::Vector2>> const& pixel_sigmas,\n                      std::vector<vw::CamPtr>                 const& orig_cams,\n                      // Outputs\n                      asp::BaParams                              & param_storage,\n                      ceres::Problem                             & problem,\n                      int                                        & num_cam_pos_residuals);\n\n} // end namespace asp\n\n#endif // __ASP_CAMERA_BUNDLE_ADJUST_COST_FUNCTIONS_H__\n\n"
  },
  {
    "path": "src/asp/Camera/BundleAdjustEigen.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file BundleAdjustEigen.cc\n///\n\n#include <asp/Core/EigenTransformUtils.h>\n#include <asp/Core/Nvm.h>\n#include <asp/Camera/BundleAdjustEigen.h>\n#include <asp/Camera/BundleAdjustOutliers.h>\n\n#include <vw/Camera/PinholeModel.h>\nnamespace asp {\n\n// Export the latest xyz values from param_storage to a vector of Vector3\nvoid exportTriPoints(asp::BaParams                const& param_storage, \n                     std::vector<Eigen::Vector3d>      & tri_vec) {\n  tri_vec.resize(param_storage.num_points());\n  for (int i = 0; i < param_storage.num_points(); i++) {\n    const double* point = param_storage.get_point_ptr(i);\n    tri_vec[i] = Eigen::Vector3d(point[0], point[1], point[2]);\n  }\n}\n\n// Calculate the optical offsets for each image. For pinhole and csm frame\n// cameras, read these from the camera model. For other cameras, use half of the\n// image size.\nvoid calcOpticalOffsets(std::vector<std::string>               const& image_files,\n                        std::vector<vw::CamPtr>                const& cams,\n                        std::map<std::string, Eigen::Vector2d>      & optical_offsets) {\n  optical_offsets.clear();\n  for (size_t i = 0; i < image_files.size(); i++) {\n    \n    vw::camera::PinholeModel * pinhole_model \n      = dynamic_cast<vw::camera::PinholeModel*>(vw::camera::unadjusted_model(cams[i].get()));\n    if (pinhole_model != NULL) {\n      vw::Vector2 offset = pinhole_model->point_offset(); \n      optical_offsets[image_files[i]] = Eigen::Vector2d(offset[0], offset[1]);\n      continue;\n    } \n    \n    asp::CsmModel const* csm_model \n      = dynamic_cast<asp::CsmModel const*>(vw::camera::unadjusted_model(cams[i].get()));    \n    if (csm_model != NULL) {\n      // For CSM, for frame can do, for others cannot\n      if (csm_model->isFrameCam()) {\n        vw::Vector2 offset = csm_model->optical_center();\n        optical_offsets[image_files[i]] = Eigen::Vector2d(offset[0], offset[1]);\n        continue;\n      }\n    }\n    \n    // Fallback to half of the image size\n    vw::DiskImageView<float> img(image_files[i]);\n    optical_offsets[image_files[i]] = Eigen::Vector2d(img.cols()/2.0, img.rows()/2.0);\n  }\n}\n\n// Given a pinhole camera model, find the world-to-camera transform\n// TODO(oalexan1): Move this out\nEigen::Affine3d calcWorldToCam(vw::camera::PinholeModel const& pin) {\n\n  // The rotation and translation matrices in the pinhole camera  \n  vw::Matrix3x3 R = pin.get_rotation_matrix();\n  vw::Vector3 T = pin.camera_center();\n  \n  // Eigen rotation\n  Eigen::Matrix3d ER;\n  for (int r = 0; r < 3; r++)\n    for (int c = 0; c < 3; c++)\n      ER(r, c) = R(r, c);\n      \n  // Eigen translation    \n  Eigen::Vector3d ET;\n  for (int r = 0; r < 3; r++)\n    ET(r) = T(r);\n  \n  // Populate the rotation + translation matrix\n  Eigen::Matrix4d E;\n  E.setIdentity();\n  E.block<3,3>(0,0) = ER;\n  E.block<3,1>(0,3) = ET;\n\n  // This is camera-to-world, so invert it\n  Eigen::Affine3d world_to_cam;\n  world_to_cam.matrix() = E.inverse();  \n  \n  return world_to_cam;\n}\n\n// Given a csm frame camera model, find the world-to-camera transform.\nEigen::Affine3d calcWorldToCam(asp::CsmModel const& csm) {\n\n  // Initialize world-to-camera as the identity matrix\n  Eigen::Matrix4d E;\n  E.setIdentity();\n  Eigen::Affine3d world_to_cam;\n  world_to_cam.matrix() = E.inverse(); // for consistency with what is below\n\n  // Find the camera center\n  double x = 0, y = 0, z = 0;\n  double qx = 0, qy = 0, qz = 0, qw = 0;\n  try {\n    csm.frame_position(x, y, z);\n    csm.frame_quaternion(qx, qy, qz, qw);\n  } catch (const std::exception & e) {\n    // Not a frame camera, return the identity matrix\n    return world_to_cam;\n  }\n\n  E = calcTransform(x, y, z, qx, qy, qz, qw).matrix();\n  \n  // This is camera-to-world, so invert it\n  world_to_cam.matrix() = E.inverse();  \n  \n  return world_to_cam;\n}\n\n// Based on the current camera models, calculate the world-to-camera transforms.\n// For pinhole cameras, fetch them directly from the camera models. For adjusted\n// pinhole cameras, must combine the adjustments with the pose. For others,\n// return the identity matrix.\nvoid calcCameraPoses(bool                                no_poses_from_nvm,\n                     std::vector<vw::CamPtr>      const& cams,\n                     std::vector<Eigen::Affine3d>      & world_to_cam) {\n  world_to_cam.resize(cams.size());\n  \n  for (size_t i = 0; i < cams.size(); i++) {\n    \n    if (no_poses_from_nvm) {\n      // Use the identity matrix for non-pinhole when told to do so\n      world_to_cam[i] = Eigen::Affine3d::Identity();\n      continue;\n    }\n    \n    // Try pinhole\n    vw::camera::PinholeModel * pinhole_model\n       = dynamic_cast<vw::camera::PinholeModel*>(cams[i].get());\n    if (pinhole_model != NULL) {\n      world_to_cam[i] = calcWorldToCam(*pinhole_model);\n      continue;\n    }\n    \n    // Try adjusted pinhole\n    vw::camera::AdjustedCameraModel * adj_cam = \n      dynamic_cast<vw::camera::AdjustedCameraModel*>(cams[i].get());\n    vw::camera::PinholeModel const* pin \n      = dynamic_cast<vw::camera::PinholeModel const*>(adj_cam->unadjusted_model().get());\n    if (pin != NULL && adj_cam != NULL) {\n      // Apply the adjustment to the pinhole camera    \n      vw::Matrix4x4 ecef_transform = adj_cam->ecef_transform();\n      // Make a copy of the pinhole camera\n      vw::camera::PinholeModel local_pin = *pin;\n      // Apply the transform\n      local_pin.apply_transform(ecef_transform);\n      world_to_cam[i] = calcWorldToCam(local_pin);\n      continue;\n    }\n    \n    // Try csm, with and without adjustment\n    asp::CsmModel const* csm_model \n      = dynamic_cast<asp::CsmModel const*>(adj_cam->unadjusted_model().get());\n    if (csm_model != NULL && csm_model->isFrameCam()) {\n      \n      vw::Matrix4x4 ecef_transform = vw::math::identity_matrix<4>();\n      if (adj_cam != NULL) \n        ecef_transform = adj_cam->ecef_transform();\n        \n      asp::CsmModel local_csm;\n      csm_model->deep_copy(local_csm);\n      local_csm.applyTransform(ecef_transform); \n      world_to_cam[i] = calcWorldToCam(local_csm);\n      continue;\n    }\n    \n    // Use the identity matrix if no luck\n    world_to_cam[i] = Eigen::Affine3d::Identity();\n    continue;  \n  }\n  \n}\n\n// Once bundle adjustment is done, export the outlier list, camera poses,\n// triangulated points, and optical offsets. This is needed for saving \n// an NVM file.\nvoid saveNvm(asp::BaBaseOptions                const& opt, \n             bool                                     no_poses_from_nvm,\n             vw::ba::ControlNetwork            const& cnet,\n             asp::BaParams                     const& param_storage,\n             std::vector<Eigen::Affine3d>           & world_to_cam,\n             std::map<std::string, Eigen::Vector2d> & optical_offsets) {\n\n  std::set<int> outliers;\n  asp::updateOutliers(cnet, param_storage, outliers);\n \n  std::vector<Eigen::Vector3d> tri_vec;\n  exportTriPoints(param_storage, tri_vec);\n\n  // Find latest poses (return the identity for non-pinhole cameras)\n  std::vector<vw::CamPtr> optimized_cams;\n  asp::calcOptimizedCameras(opt, param_storage, optimized_cams);\n  calcCameraPoses(no_poses_from_nvm, optimized_cams, world_to_cam);\n\n  // Find the optical centers if not loaded from nvm\n  if (optical_offsets.empty())\n    calcOpticalOffsets(opt.image_files, optimized_cams, optical_offsets);\n    \n  // Write the nvm\n  std::string nvm_file = opt.out_prefix + \".nvm\"; \n  asp::nvmData nvm;\n  asp::cnetToNvm(cnet, optical_offsets, world_to_cam, nvm, tri_vec, outliers);\n  asp::writeNvm(nvm, nvm_file);\n}\n\n// Given pinhole cameras and camera-to-world transforms, update the camera poses\n// in the pinhole cameras.\nvoid updateCameraPoses(std::vector<Eigen::Affine3d> const& world_to_cam,\n                       std::vector<vw::CamPtr>           & cams) {\n\n  // Must have as many cameras as transforms\n  if (cams.size() != world_to_cam.size())\n    vw::vw_throw(vw::ArgumentErr() << \"Expecting as many cameras as transforms.\\n\");\n    \n  // Iterate over the cameras\n  for (size_t i = 0; i < cams.size(); i++) {\n    \n    // Find the camera-to-world transform as a 4x4 matrix. Must invert the world-to-camera.\n    Eigen::Matrix4d E = world_to_cam[i].matrix().inverse();\n    \n    // Find the rotation as the upper-left 3x3 matrix as Matrix3x3\n    vw::Matrix3x3 R;\n    for (int r = 0; r < 3; r++)\n      for (int c = 0; c < 3; c++)\n        R(r, c) = E(r, c);\n    \n    // Find the translation as the right-most column as Vector3\n    vw::Vector3 T;\n    for (int r = 0; r < 3; r++)\n      T(r) = E(r, 3);\n      \n    vw::camera::PinholeModel * pin\n       = dynamic_cast<vw::camera::PinholeModel*>(cams[i].get());\n    if (pin != NULL) {\n      pin->set_camera_pose(R);\n      pin->set_camera_center(T);\n      continue;\n    }\n    \n    // Try adjusted pinhole camera\n    vw::camera::AdjustedCameraModel * adj_cam = \n      dynamic_cast<vw::camera::AdjustedCameraModel*>(cams[i].get());\n    \n    // If null, we are doing something wrong\n    if (adj_cam != NULL) {\n      // We expect the adjustment to be the identity, as this function is called\n      // before any adjustment is applied.\n      vw::Matrix4x4 ecef_transform = adj_cam->ecef_transform();\n      if (ecef_transform != vw::math::identity_matrix(4))\n        vw::vw_throw(vw::ArgumentErr() << \"Expecting the adjustment to be the identity.\\n\");\n      \n      // Get the unadjusted pinhole camera\n      pin = dynamic_cast<vw::camera::PinholeModel*>(adj_cam->unadjusted_model().get());\n      if (pin != NULL) {\n        pin->set_camera_pose(R);\n        pin->set_camera_center(T);\n        continue;\n      }\n    }\n\n    // Try CSM frame\n    asp::CsmModel* csm_model = dynamic_cast<asp::CsmModel*>(cams[i].get());\n    if (csm_model != NULL && csm_model->isFrameCam()) {\n      // For CSM, for frame can do, for others cannot\n      csm_model->set_frame_position(T[0], T[1], T[2]);\n      // Convert R to Eigen\n      Eigen::Matrix3d ER;\n      for (int r = 0; r < 3; r++)\n        for (int c = 0; c < 3; c++)\n          ER(r, c) = R(r, c);\n      Eigen::Quaterniond q(ER);\n      csm_model->set_frame_quaternion(q.x(), q.y(), q.z(), q.w());\n      continue;\n    }\n    \n    if (i == 0)\n     vw::vw_out() << \"Ignoring the camera poses in the NVM file.\\n\";\n  }\n    \n}  \n\n} // end namespace asp\n\n"
  },
  {
    "path": "src/asp/Camera/BundleAdjustEigen.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file BundleAdjustEigen.h\n/// Functions used in bundle adjustment that use Eigen matrices.\n/// Keep these separate to make compilation faster.\n#ifndef __BUNDLE_ADJUST_EIGEN_H__\n#define __BUNDLE_ADJUST_EIGEN_H__\n\n#include <asp/Camera/BundleAdjustCamera.h>\n\n#include <Eigen/Dense>\n\n#include <map>\n#include <set>\n#include <string>\n#include <vector>\n\nnamespace asp {\n  \n// Export the latest xyz values from param_storage to a vector of Vector3\nvoid exportTriPoints(asp::BaParams                const& param_storage, \n                     std::vector<Eigen::Vector3d>      & tri_vec);\n\n// Once bundle adjustment is done, export the outlier list, camera poses,\n// triangulated points, and optical offsets, and write the cnet to an nvm file.\nvoid saveNvm(asp::BaBaseOptions                const& opt,\n             bool                                     no_poses_from_nvm,   \n             vw::ba::ControlNetwork            const& cnet,\n             asp::BaParams                     const& param_storage,\n             std::vector<Eigen::Affine3d>           & world_to_cam,\n             std::map<std::string, Eigen::Vector2d> & optical_offsets);\n\n// Given pinhole cameras and camera-to-world transforms, update the camera poses\n// in the pinhole cameras.\nvoid updateCameraPoses(std::vector<Eigen::Affine3d> const& world_to_cam,\n                       std::vector<vw::CamPtr>           & cams);\n  \n} // end namespace asp\n\n#endif // __BUNDLE_ADJUST_EIGEN_H__"
  },
  {
    "path": "src/asp/Camera/BundleAdjustIO.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file BundleAdjustIO.cc\n///\n\n#include <asp/Camera/BundleAdjustCamera.h>\n#include <asp/Camera/BundleAdjustOptions.h>\n#include <asp/Camera/CameraResectioning.h>\n#include <asp/Camera/CsmModel.h>\n#include <asp/Camera/Covariance.h>\n#include <asp/Camera/LinescanUtils.h>\n#include <asp/Camera/RPC_XML.h>\n#include <asp/Camera/RPCModel.h>\n#include <asp/Camera/RPCModelGen.h>\n#include <asp/Camera/CameraErrorPropagation.h>\n#include <asp/Core/IpMatchingAlgs.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/BaseCameraUtils.h>\n#include <asp/Core/ImageUtils.h>\n#include <asp/Core/FileUtils.h>\n\n#include <asp/asp_config.h> // defines ASP_HAVE_PKG_ISIS\n#if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1\n#include <asp/IsisIO/IsisInterface.h>\n#endif // ASP_HAVE_PKG_ISIS\n\n#include <vw/BundleAdjustment/CameraRelation.h>\n#include <vw/BundleAdjustment/ControlNetwork.h>\n#include <vw/BundleAdjustment/ControlNetworkLoader.h>\n#include <vw/Cartography/CameraBBox.h>\n#include <vw/InterestPoint/MatcherIO.h>\n#include <vw/Math/Statistics.h>\n#include <vw/Math/Geometry.h>\n#include <vw/Math/Functors.h>\n#include <vw/Camera/PinholeModel.h>\n#include <vw/Camera/OpticalBarModel.h>\n#include <vw/Camera/CameraUtilities.h>\n#include <vw/Camera/LensDistortion.h>\n#include <vw/Core/Stopwatch.h>\n#include <vw/Core/StringUtils.h>\n\n#include <usgscsm/UsgsAstroLsSensorModel.h>\n\n#include <string>\n\nusing namespace vw;\nusing namespace vw::camera;\nusing namespace vw::ba;\n\nnamespace asp {\n\n// Save mapprojected matches offsets for each image pair having matches\nvoid saveMapprojOffsets(\n     std::string                       const& out_prefix,\n     vw::cartography::GeoReference     const& mapproj_dem_georef,\n     std::vector<vw::Vector<float, 4>> const& mapprojPoints,\n     std::vector<asp::MatchPairStats>  const& mapprojOffsets,\n     std::vector<std::vector<float>>        & mapprojOffsetsPerCam,\n     std::vector<std::string>          const& imageFiles) {\n\n  std::string mapproj_offsets_stats_file\n    = out_prefix + \"-mapproj_match_offset_stats.txt\";\n  vw_out() << \"Writing: \" << mapproj_offsets_stats_file << \"\\n\";\n  std::ofstream ofs (mapproj_offsets_stats_file.c_str());\n  ofs.precision(8); // 8 digits of precision for errors is enough\n\n  ofs << \"# Percentiles of distances between mapprojected matching pixels in an \"\n      << \"image and the others.\\n\";\n  ofs << \"# image_name 25% 50% 75% 85% 95% count\\n\";\n  for (size_t image_it = 0; image_it < imageFiles.size(); image_it++) {\n    auto & vals = mapprojOffsetsPerCam[image_it]; // alias\n    int len = vals.size();\n    float val25 = -1.0, val50 = -1.0, val75 = -1.0, val85 = -1.0, val95 = -1.0, count = 0;\n    if (!vals.empty()) {\n      std::sort(vals.begin(), vals.end());\n      val25 = vals[0.25 * len];\n      val50 = vals[0.50 * len];\n      val75 = vals[0.75 * len];\n      val85 = vals[0.85 * len];\n      val95 = vals[0.95 * len];\n      count = len;\n    }\n\n    ofs << imageFiles[image_it] << ' '\n        << val25 << ' ' << val50 << ' ' << val75 << ' '\n        << val85 << ' ' << val95 << ' ' << count << \"\\n\";\n  }\n  ofs.close();\n\n  std::string mapproj_offsets_pair_stats_file\n    = out_prefix + \"-mapproj_match_offset_pair_stats.txt\";\n  vw::vw_out() << \"Writing: \" << mapproj_offsets_pair_stats_file << \"\\n\";\n  ofs = std::ofstream(mapproj_offsets_pair_stats_file.c_str());\n\n  ofs << \"# Percentiles of distances between matching pixels after mapprojecting onto DEM.\\n\"\n      << \"# Per image pair and measured in DEM pixel units.\\n\";\n  ofs << \"# left_image right_image 25% 50% 75% 85% 95% num_matches_per_pair\\n\";\n  ofs.precision(8); // 8 digits of precision for errors is enough\n  for (size_t conv_it = 0; conv_it < mapprojOffsets.size(); conv_it++) {\n    auto const & c = mapprojOffsets[conv_it]; // alias\n    ofs << imageFiles[c.left_cam_index] << ' ' << imageFiles[c.right_cam_index] << ' '\n        << c.val25 << ' ' << c.val50 << ' ' << c.val75 << ' '\n        << c.val85 << ' ' << c.val95 << ' ' << c.num_vals << \"\\n\";\n  }\n  ofs.close();\n\n  std::string mapproj_offsets_file = out_prefix + \"-mapproj_match_offsets.txt\";\n  vw_out() << \"Writing: \" << mapproj_offsets_file << \"\\n\";\n  ofs = std::ofstream(mapproj_offsets_file.c_str());\n  // 12 digits of precision for errors is enough. \n  // That is 9 digits after decimal period for lon and lat.\n  ofs.precision(12);\n  ofs << \"# lon, lat, height_above_datum, mapproj_ip_dist_meters\\n\";\n  ofs << \"# \" << mapproj_dem_georef.datum() << std::endl;\n\n  // Write all the points to the file\n  for (size_t it = 0; it < mapprojPoints.size(); it++) {\n    Vector3 llh = subvector(mapprojPoints[it], 0, 3);\n    ofs << llh[0] << \", \" << llh[1] <<\", \" << llh[2] << \", \"\n         << mapprojPoints[it][3] << std::endl;\n  }\n\n  ofs.close();\n\n  return;\n}\n\n// Save pinhole camera positions and orientations in a single file.\n// Only works with Pinhole cameras.\nvoid saveCameraReport(asp::BaBaseOptions const& opt, asp::BaParams const& param_storage,\n                      vw::cartography::Datum const& datum,\n                      std::string const& prefix) {\n\n  std::string output_path = opt.out_prefix + \"-\" + prefix + \"-cameras.csv\";\n  vw_out() << \"Writing: \" << output_path << std::endl;\n  std::ofstream fh(output_path.c_str());\n  fh.precision(17);\n  fh << \"# input_cam_file, cam_ctr_x, cam_ctr_y, cam_ctr_z (ecef meters), \"\n     << \"cam2ned rotation rows\\n\";\n\n  int num_cameras = opt.image_files.size();\n\n  // TODO(oalexan1): Create here a report file. Write camera name,\n  // camera center, ecef position, ecef quaternion, and ned roll-pitch-yaw.\n  // Use same Euler angles as in numpy. Likely eigen can do it.\n  for (int icam = 0; icam < num_cameras; icam++) {\n\n    vw::Vector3 cam_ctr;\n    vw::Matrix3x3 cam2ecef;\n    switch(opt.camera_type) {\n      case BaCameraType_Pinhole: {\n        // Get the camera model from the original one with parameters in\n        // param_storage applied to it (which could be original ones or optimized). \n        // Note that we do not modify the original camera.\n        vw::camera::PinholeModel const* in_cam\n          = dynamic_cast<vw::camera::PinholeModel const*>(opt.camera_models[icam].get());\n        if (in_cam == NULL)\n          vw_throw(ArgumentErr() << \"Expecting a pinhole camera.\\n\");\n        // Apply current intrinsics and extrinsics to the camera\n        vw::camera::PinholeModel out_cam\n          = transformedPinholeCamera(icam, param_storage, *in_cam);\n        cam_ctr = out_cam.camera_center(vw::Vector2());\n        cam2ecef = out_cam.get_rotation_matrix();\n        break;\n      }\n      case BaCameraType_OpticalBar:\n        vw::vw_throw(vw::ArgumentErr() << \"Saving a camera report is not implemented \"\n                    << \"for optical bar cameras.\\n\");\n        break;\n      case BaCameraType_CSM:\n        vw::vw_throw(vw::ArgumentErr() << \"Saving a camera report is not implemented \"\n                      << \"for CSM cameras.\\n\");\n        break;\n      default: {\n        // Apply extrinsics adjustments to a pinhole camera\n        // TODO(oalexan1): Make this into a function called adjustedPinholeCamera().\n        // Use it where needed.\n        CameraAdjustment adjustment(param_storage.get_camera_ptr(icam));\n        PinholeModel* in_cam = dynamic_cast<PinholeModel*>(opt.camera_models[icam].get());\n        if (in_cam == NULL)\n          vw_throw(ArgumentErr() << \"Expecting a pinhole camera.\\n\");\n\n        // Make a copy of the camera, and apply the adjustments to the copy. Need to go back\n        // to the original camera to get the adjustments needed to apply.\n        // TODO(oalexan1): This is a little awkward.\n        PinholeModel out_cam = *in_cam;\n        AdjustedCameraModel adj_cam(vw::camera::unadjusted_model(opt.camera_models[icam]),\n                                    adjustment.position(), adjustment.pose());\n        vw::Matrix4x4 ecef_transform = adj_cam.ecef_transform();\n        out_cam.apply_transform(ecef_transform);\n        cam_ctr = out_cam.camera_center(vw::Vector2());\n        cam2ecef = out_cam.get_rotation_matrix();\n      }\n    }\n\n    fh << opt.camera_files[icam] << \", \"\n       << cam_ctr[0] << \", \" << cam_ctr[1] << \", \" << cam_ctr[2];\n\n    // Find the matrix for converting NED to ECEF\n    vw::Vector3 loc_llh = datum.cartesian_to_geodetic(cam_ctr);\n    vw::Matrix3x3 ned2ecef = datum.lonlat_to_ned_matrix(loc_llh);\n\n    // How a camera moves relative to the world is given by the camera-to-world\n    // matrix. That is a little counter-intuitive.\n    vw::Matrix3x3 cam2ned = inverse(ned2ecef) * cam2ecef;\n    for (int row = 0; row < cam2ned.rows(); row++) {\n      for (int col = 0; col < cam2ned.cols(); col++) {\n        fh << \", \" << cam2ned(row, col);\n      }\n    }\n    fh << \"\\n\";\n  }\n\n  fh.close();\n  return;\n}\n\n// Save stats of horizontal and vertical errors propagated from cameras\n// to triangulation\nvoid saveHorizVertErrors(std::string const& horiz_vert_errors_file,\n                         std::vector<asp::HorizVertErrorStats> const& horizVertErrors,\n                         std::vector<std::string> const& imageFiles) {\n\n  vw_out() << \"Writing: \" << horiz_vert_errors_file << \"\\n\";\n  std::ofstream ofs (horiz_vert_errors_file.c_str());\n  ofs.precision(8);\n  ofs << \"# Horizontal and vertical propagated triangulation uncertainties (in meters) for each image pair having matches.\\n\";\n  ofs << \"# left_image right_image horiz_error_median vert_error_median horiz_error_mean vert_error_mean horiz_error_stddev vert_error_stddev num_meas\\n\";\n  for (size_t conv_it = 0; conv_it < horizVertErrors.size(); conv_it++) {\n     auto const & c = horizVertErrors[conv_it]; // alias\n     ofs << imageFiles[c.left_cam_index] << ' ' << imageFiles[c.right_cam_index] << ' '\n         << c.horiz_error_median << ' ' << c.vert_error_median << ' '\n         << c.horiz_error_mean   << ' ' << c.vert_error_mean   << ' '\n         << c.horiz_error_stddev << ' ' << c.vert_error_stddev << ' '\n         << c.num_errors << \"\\n\";\n  }\n  ofs.close();\n\n  return;\n}\n\n/// Write a pinhole camera file to disk after updating the intrinsics and\n/// extrinsics. Return the path to the saved file.\nstd::string savePinholeCam(asp::BaBaseOptions const& opt, int icam,\n                           vw::cartography::Datum const& datum,\n                           asp::BaParams const& param_storage) {\n\n  // Get the output file path\n  std::string cam_file = asp::bundle_adjust_file_name(opt.out_prefix,\n                                                      opt.image_files [icam],\n                                                      opt.camera_files[icam]);\n  cam_file = boost::filesystem::path(cam_file).replace_extension(\"tsai\").string();\n\n  // Get the camera model from the original one with parameters in\n  // param_storage applied to it (which could be original ones or optimized). \n  // Note that we do not modify the original camera.\n  vw::camera::PinholeModel const* in_cam\n    = dynamic_cast<vw::camera::PinholeModel const*>(opt.camera_models[icam].get());\n  if (in_cam == NULL)\n    vw_throw(ArgumentErr() << \"Expecting a pinhole camera.\\n\");\n  vw::camera::PinholeModel out_cam = transformedPinholeCamera(icam, param_storage, *in_cam);\n\n  #pragma omp critical\n  {\n    // Ensure this text is not messed up when writing in parallel\n    vw::vw_out() << \"Writing: \" << cam_file << \"\\n\";\n    bool has_datum = (datum.name() != asp::UNSPECIFIED_DATUM);\n    if (has_datum)\n      vw::vw_out() << std::setprecision(8)\n                   << \"Camera center for \" << cam_file << \": \"\n                   << datum.cartesian_to_geodetic(out_cam.camera_center())\n                   << \" (longitude, latitude, height above datum(m))\\n\\n\";\n  }\n\n  out_cam.write(cam_file);\n\n  return cam_file;\n}\n\n/// Write an optical bar camera file to disk after updating the intrinsics and\n// extrinsics. Return the path to the saved file.\nstd::string saveOpticalBarCam(asp::BaBaseOptions const& opt, int icam,\n                              vw::cartography::Datum const& datum,\n                              asp::BaParams const& param_storage) {\n\n  // Get the output file path\n  std::string cam_file = asp::bundle_adjust_file_name(opt.out_prefix,\n                                                      opt.image_files [icam],\n                                                      opt.camera_files[icam]);\n  cam_file = boost::filesystem::path(cam_file).replace_extension(\"tsai\").string();\n\n  // Get the final camera model from the original one with optimized\n  // parameters applied to it. Note that we do not modify the original\n  // camera.\n  vw::camera::OpticalBarModel* in_cam\n    = dynamic_cast<vw::camera::OpticalBarModel*>(opt.camera_models[icam].get());\n  if (in_cam == NULL)\n    vw_throw(ArgumentErr() << \"Expecting an optical bar camera.\\n\");\n  vw::camera::OpticalBarModel out_cam\n    = transformedOpticalBarCamera(icam, param_storage, *in_cam);\n\n  #pragma omp critical\n  {\n    // Ensure this text is not messed up when writing in parallel\n    vw::vw_out() << \"Writing: \" << cam_file << \"\\n\";\n    bool has_datum = (datum.name() != asp::UNSPECIFIED_DATUM);\n    if (has_datum)\n      vw::vw_out() << std::setprecision(8)\n                   << \"Camera center for \" << cam_file << \": \"\n                   << datum.cartesian_to_geodetic(out_cam.camera_center())\n                   << \" (longitude, latitude, height above datum(m))\\n\\n\";\n  }\n\n  out_cam.write(cam_file);\n\n  return cam_file;\n}\n\n// Write a CSM camera file to disk. Assumes that the intrinsics are optimized.\n// Return the path to the saved file.\nstd::string saveCsmCamUpdateIntr(asp::BaBaseOptions const& opt, int icam,\n                                 vw::cartography::Datum const& datum,\n                                 asp::BaParams const& param_storage) {\n\n  // Get the output file path\n  std::string cam_file = asp::bundle_adjust_file_name(opt.out_prefix,\n                                                      opt.image_files [icam],\n                                                      opt.camera_files[icam]);\n  cam_file = asp::csmStateFile(cam_file);\n\n  // Get the final camera model from the original one with optimized\n  // parameters applied to it. Note that we do not modify the original\n  // camera.\n  asp::CsmModel const* in_cam\n    = dynamic_cast<asp::CsmModel const*>(opt.camera_models[icam].get());\n  if (in_cam == NULL)\n    vw_throw(ArgumentErr() << \"Expecting a CSM camera.\\n\");\n  boost::shared_ptr<asp::CsmModel> out_cam\n    = transformedCsmCamera(icam, param_storage, *in_cam);\n\n  #pragma omp critical\n  {\n    // Ensure this text is not messed up when writing in parallel\n    bool has_datum = (datum.name() != asp::UNSPECIFIED_DATUM);\n    if (has_datum)\n      vw::vw_out() << std::setprecision(8)\n                   << \"Camera center for \" << cam_file << \": \"\n                   << datum.cartesian_to_geodetic(out_cam->camera_center(vw::Vector2()))\n                   << \" (longitude, latitude, height above datum(m))\\n\";\n    vw::vw_out() << \"Writing: \" << cam_file << \"\\n\";\n  }\n\n  // Save the updated state\n  out_cam->saveState(cam_file);\n\n  if (opt.update_isis_cubes_with_csm_state) {\n    // Save the CSM state to the image file. Wipe any spice info.\n    std::string image_name = opt.image_files[icam];\n    std::string plugin_name = out_cam->plugin_name();\n    std::string model_name  = out_cam->model_name();\n    std::string model_state = out_cam->model_state();\n    #pragma omp critical\n    {\n      // Ensure this text is not messed up when writing in parallel\n      vw::vw_out() << \"Adding updated CSM state to image file: \" << image_name << \"\\n\";\n    }\n#if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1\n    asp:isis::saveCsmStateToIsisCube(image_name, plugin_name, model_name, model_state);\n#endif // ASP_HAVE_PKG_ISIS\n  }\n\n  return cam_file;\n}\n\n// Save convergence angle percentiles for each image pair having matches\nvoid saveConvergenceAngles(std::string const& conv_angles_file,\n                           std::vector<asp::MatchPairStats> const& convAngles,\n                           std::vector<std::string> const& imageFiles) {\n\n  vw_out() << \"Writing: \" << conv_angles_file << \"\\n\";\n  std::ofstream ofs (conv_angles_file.c_str());\n  ofs.precision(8);\n  ofs << \"# Convergence angle percentiles (in degrees) for each image pair having matches\\n\";\n  ofs << \"# left_image right_image 25% 50% 75% num_matches\\n\";\n  for (size_t conv_it = 0; conv_it < convAngles.size(); conv_it++) {\n    auto const & c = convAngles[conv_it]; // alias\n    ofs << imageFiles[c.left_cam_index] << ' ' << imageFiles[c.right_cam_index] << ' '\n        << c.val25 << ' ' << c.val50 << ' ' << c.val75  << ' ' << c.num_vals << \"\\n\";\n  }\n  ofs.close();\n\n  return;\n}\n\n// Read image and camera lists. Can have several comma-separated lists\n// in image_list and camera_list, when sharing intrinsics per sensor.\nvoid read_image_cam_lists(std::string const& image_list,\n                std::string const& camera_list,\n                std::vector<std::string> & images,\n                std::vector<std::string> & cameras,\n                asp::IntrinsicOptions & intrinsics_opts) {\n\n  // Wipe the output\n  images.clear();\n  cameras.clear();\n  intrinsics_opts.share_intrinsics_per_sensor = false;\n  intrinsics_opts.cam2sensor.clear();\n  intrinsics_opts.num_sensors = 0; // must be initialized to zero\n\n  // See if we have a single list or multiple lists\n  if (image_list.find(\",\") == std::string::npos &&\n      camera_list.find(\",\") == std::string::npos) {\n    // Single list, so just read the lists as usual, and return\n    asp::read_list(image_list, images);\n\n    // Use the images as cameras if no camera list is provided. Sometimes the\n    // images have camera information.\n    if (!camera_list.empty())\n      asp::read_list(camera_list, cameras);\n    if (cameras.empty())\n      cameras = images;\n\n    // There must be as many images as cameras\n    if (images.size() != cameras.size())\n      vw_throw(ArgumentErr() << \"Expecting the same number of images and cameras.\\n\");\n\n    return;\n  }\n\n  // This when we have multiple image lists and camera lists, for when\n  // we solve for intrinsics per sensor.\n  vw_out() << \"Multiple image lists and camera lists were passed in. \"\n           << \"Solving for intrinsics per sensor.\\n\";\n\n  // This is a very important bit\n  intrinsics_opts.share_intrinsics_per_sensor = true;\n\n  std::vector<std::string> image_lists, camera_lists;\n  boost::split(image_lists, image_list, boost::is_any_of(\",\"));\n  boost::split(camera_lists, camera_list, boost::is_any_of(\",\"));\n\n  if (image_lists.size() != camera_lists.size())\n    vw_throw(ArgumentErr() << \"Expecting the same number of image and camera lists. \"\n      << \"They must be separated by commas on input.\\n\");\n\n  // Read separately the images and cameras\n  for (size_t sensor_it = 0; sensor_it < image_lists.size(); sensor_it++) {\n    std::vector<std::string> local_images, local_cameras;\n    asp::read_list(image_lists[sensor_it], local_images);\n    asp::read_list(camera_lists[sensor_it], local_cameras);\n    if (local_images.size() != local_cameras.size() || local_images.empty())\n      vw_throw(ArgumentErr() << \"Expecting the same positive number of images and cameras \"\n      << \"in lists: '\" << image_lists[sensor_it] << \"' and '\"\n      << camera_lists[sensor_it] << \"'.\\n\");\n\n    // Append to the global lists\n    images.insert(images.end(), local_images.begin(), local_images.end());\n    cameras.insert(cameras.end(), local_cameras.begin(), local_cameras.end());\n\n    // Create the map from camera index to sensor index\n    for (size_t cam_it = 0; cam_it < local_cameras.size(); cam_it++)\n      intrinsics_opts.cam2sensor.push_back(sensor_it);\n  }\n\n  intrinsics_opts.num_sensors = image_lists.size();\n  vw_out() << \"Number of sensors: \" << intrinsics_opts.num_sensors << \"\\n\";\n\n  // Must have the same number of cameras as images\n  if (images.size() != cameras.size())\n    vw_throw(ArgumentErr() << \"Expecting the same number of images and cameras.\\n\");\n\n  return;\n}\n\n// Write an updated csm camera state file to disk. Assumes no intrinsics are optimized.\nstd::string saveUpdatedCsm(asp::BaBaseOptions const& opt, int icam,\n                           std::string const& adjustFile,\n                           asp::BaParams const& param_storage) {\n\n  // Get the unadjusted CSM model and the adjustment as a transform\n  CameraAdjustment cam_adjust(param_storage.get_camera_ptr(icam));\n  AdjustedCameraModel adj_cam(vw::camera::unadjusted_model(opt.camera_models[icam]),\n                              cam_adjust.position(), cam_adjust.pose());\n  vw::Matrix4x4 ecef_transform = adj_cam.ecef_transform();\n  std::string csmFile          = asp::csmStateFile(adjustFile);\n  asp::CsmModel * csm_model\n    = asp::csm_model(vw::camera::unadjusted_model(opt.camera_models[icam]));\n\n  // Apply the adjustment and save a transformed copy of the camera model\n  boost::shared_ptr<asp::CsmModel> out_cam;\n  csm_model->deep_copy(out_cam);\n  out_cam->applyTransform(ecef_transform);\n  #pragma omp critical\n  {\n    // Ensure this text is not messed up when writing in parallel\n    vw::vw_out() << \"Writing: \" << csmFile << \"\\n\";\n  }\n  out_cam->saveState(csmFile);\n\n  if (opt.update_isis_cubes_with_csm_state) {\n    // Save the CSM state to the image file. Wipe any spice info.\n    std::string image_name = opt.image_files[icam];\n    std::string plugin_name = out_cam->plugin_name();\n    std::string model_name  = out_cam->model_name();\n    std::string model_state = out_cam->model_state();\n    #pragma omp critical\n    {\n      // Ensure this text is not messed up when writing in parallel\n      vw::vw_out() << \"Adding updated CSM state to image file: \" << image_name << \"\\n\";\n    }\n\n#if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1\n    asp:isis::saveCsmStateToIsisCube(image_name, plugin_name, model_name, model_state);\n#endif // ASP_HAVE_PKG_ISIS\n  }\n\n  return csmFile;\n}\n\n// Write an updated RPC camera file to disk. Assumes no intrinsics are optimized.\nstd::string saveUpdatedRpc(asp::BaBaseOptions const& opt, int icam,\n                           std::string const& adjustFile,\n                           asp::BaParams const& param_storage) {\n\n  std::string imageFile = opt.image_files[icam];\n  vw::DiskImageView<float> image(imageFile);\n  BBox2 image_box = vw::bounding_box(image);\n\n  CameraAdjustment cam_adjust(param_storage.get_camera_ptr(icam));\n  AdjustedCameraModel adj_cam(vw::camera::unadjusted_model(opt.camera_models[icam]),\n                              cam_adjust.position(), cam_adjust.pose());\n\n  vw::Matrix4x4 ecef_transform = adj_cam.ecef_transform();\n  std::string rpcFile = asp::rpcAdjustedFile(adjustFile);\n\n  // Get the underlying RPC model\n  vw::CamPtr unadjCam = vw::camera::unadjusted_model(opt.camera_models[icam]);\n  asp::RPCModel * rpc = dynamic_cast<asp::RPCModel*>(unadjCam.get());\n  if (rpc == NULL)\n    vw_throw(ArgumentErr() << \"Expecting an RPC camera.\\n\");\n\n  #pragma omp critical\n  {\n    // Ensure this text is not messed up when writing in parallel\n    vw::vw_out() << \"Saving adjusted RPC model: \" << rpcFile << \"\\n\";\n  }\n\n  // Produced a transformed copy of the RPC model. This can be slow.\n  double pixel_err = 0.0;\n  asp::RPCModel trans_rpc = asp::transformRpc(*rpc, ecef_transform, image_box, pixel_err);\n\n  #pragma omp critical\n  {\n    vw::vw_out() << \"Discrepancy between the initial RPC model with the external adjustment \"\n      << \"and the refit model incorporating the adjustment for image: \"\n      << imageFile << \" is \" << pixel_err  << \" pixels.\\n\";\n    if (pixel_err > 1.0)\n       vw::vw_out(vw::WarningMessage) << \"The adjusted RPC model is not accurate enough. \"\n        << \"Use the original RPC model with external adjustments as applied via \"\n        << \"--bundle-adjust-prefix. Test the original model self-consistency with \"\n        << \"cam_test with --height-above-datum within valid RPC height range.\\n\";\n  }\n\n  trans_rpc.saveXML(rpcFile);\n\n  return rpcFile;\n}\n\n// Write a camera adjustment file to disk, and potentially a camera file with\n// the adjustments applied to it. Return the path to the saved file.\nstd::string saveAdjustedCam(asp::BaBaseOptions const& opt, int icam,\n                            asp::BaParams const& param_storage) {\n\n  std::string adjust_file = asp::bundle_adjust_file_name(opt.out_prefix,\n                                                         opt.image_files[icam],\n                                                         opt.camera_files[icam]);\n\n  #pragma omp critical\n  {\n    // Ensure this text is not messed up when writing in parallel\n    vw::vw_out() << \"Writing: \" << adjust_file << \"\\n\";\n  }\n\n  // The cam_file will be overwritten below for CSM cameras\n  CameraAdjustment cam_adjust(param_storage.get_camera_ptr(icam));\n  asp::write_adjustments(adjust_file, cam_adjust.position(),\n                                    cam_adjust.pose());\n\n  std::string cam_file = adjust_file;\n\n  // For CSM camera models export, in addition, the JSON state with the\n  // adjustment applied to it. This applies when not solving for intrinsics and\n  // using CSM. Do something analogous for RPC.\n  if (asp::isLinescanCsmSession(opt.stereo_session))\n    cam_file = saveUpdatedCsm(opt, icam, adjust_file, param_storage);\n  else if (opt.stereo_session == \"rpc\" && opt.save_adjusted_rpc)\n    cam_file = saveUpdatedRpc(opt, icam, adjust_file, param_storage);\n\n  return cam_file;\n}\n\n// Save the updated camera model to disk. Return the name of the file written.\nstd::string saveUpdatedCamera(asp::BaBaseOptions const& opt,\n                              asp::BaParams const& param_storage,\n                              int icam) {\n\n  // Must have a try block, as otherwise OpenMP crashes the program\n  // as the caller seems unable to catch the exception from threads.\n  std::string cam_file;\n  try {\n\n    switch (opt.camera_type) {\n    case BaCameraType_Pinhole:\n      cam_file = savePinholeCam(opt, icam, opt.datum, param_storage);\n      break;\n    case BaCameraType_OpticalBar:\n      cam_file = saveOpticalBarCam(opt, icam, opt.datum, param_storage);\n      break;\n    case BaCameraType_CSM:\n      // When solving for intrinsics and using CSM\n      cam_file = saveCsmCamUpdateIntr(opt, icam, opt.datum, param_storage);\n      break;\n    case BaCameraType_Other:\n      // This includes the CSM/pinhole/etc cases when not solving for intrinsics\n      cam_file = saveAdjustedCam(opt, icam, param_storage);\n      break;\n    default:\n      vw::vw_throw(vw::ArgumentErr() << \"Unknown camera type.\\n\");\n    }\n  } catch (const std::exception& e) {\n    vw::vw_out() << e.what() << \"\\n\";\n  }\n\n  return cam_file;\n}\n\n// Write updated camera models to disk\nvoid saveUpdatedCameras(asp::BaBaseOptions const& opt,\n                        asp::BaParams const& param_storage) {\n\n  int num_cameras = opt.image_files.size();\n  std::vector<std::string> cam_files(num_cameras);\n  vw::Stopwatch sw;\n  sw.start();\n\n  // For pinhole and nadirpinhole sessions, save the cameras sequentially, as\n  // some info is printed along the way and can get messed up if done in\n  // parallel.\n  if (!opt.single_threaded_cameras && !opt.update_isis_cubes_with_csm_state &&\n      opt.stereo_session.find(\"pinhole\") == std::string::npos) {\n    #pragma omp parallel for\n    for (int icam = 0; icam < num_cameras; icam++)\n      cam_files[icam] = saveUpdatedCamera(opt, param_storage, icam);\n  } else {\n    for (int icam = 0; icam < num_cameras; icam++)\n      cam_files[icam] = saveUpdatedCamera(opt, param_storage, icam);\n  }\n\n  sw.stop();\n  vw::vw_out() << \"Saving cameras elapsed time: \" << sw.elapsed_seconds() << \" seconds.\\n\";\n\n  // Write the image lists\n  std::string img_list_file = opt.out_prefix + \"-image_list.txt\";\n  vw::vw_out() << \"Writing: \" << img_list_file << \"\\n\";\n  asp::write_list(img_list_file, opt.image_files);\n\n  // Write the camera lists\n  std::string cam_list_file = opt.out_prefix + \"-camera_list.txt\";\n  vw::vw_out() << \"Writing: \" << cam_list_file << \"\\n\";\n  asp::write_list(cam_list_file, cam_files);\n\n  return;\n}\n\n// Save the CSM cameras. It is assumed there are no external adjustments\n// applied to them.\nvoid saveCsmCameras(std::string const& out_prefix,\n                    std::string const& stereo_session,\n                    std::vector<std::string> const& image_files,\n                    std::vector<std::string> const& camera_files,\n                    std::vector<vw::CamPtr>  const& camera_models,\n                    bool update_isis_cubes_with_csm_state) {\n\n  int num_cameras = camera_models.size();\n  std::vector<std::string> cam_files(num_cameras);\n  for (int icam = 0; icam < num_cameras; icam++) {\n    std::string adjustFile = asp::bundle_adjust_file_name(out_prefix,\n                                                          image_files[icam],\n                                                          camera_files[icam]);\n    std::string csmFile = asp::csmStateFile(adjustFile);\n    asp::CsmModel * csm_cam\n      = asp::csm_model(camera_models[icam]);\n    vw::vw_out() << \"Writing: \" << csmFile << \"\\n\";\n    csm_cam->saveState(csmFile);\n    cam_files[icam] = csmFile;\n\n    if (update_isis_cubes_with_csm_state) {\n      // Save the CSM state to the image file. Wipe any spice info.\n      std::string image_name = image_files[icam];\n      std::string plugin_name = csm_cam->plugin_name();\n      std::string model_name  = csm_cam->model_name();\n      std::string model_state = csm_cam->model_state();\n      vw::vw_out() << \"Adding updated CSM state to image file: \" << image_name << \"\\n\";\n#if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1\n      asp:isis::saveCsmStateToIsisCube(image_name, plugin_name, model_name, model_state);\n#endif // ASP_HAVE_PKG_ISIS\n    }\n  }\n\n  // Write the image lists\n  std::string img_list_file = out_prefix + \"-image_list.txt\";\n  vw::vw_out() << \"Writing: \" << img_list_file << std::endl;\n  asp::write_list(img_list_file, image_files);\n\n  // Write the camera lists\n  std::string cam_list_file = out_prefix + \"-camera_list.txt\";\n  vw::vw_out() << \"Writing: \" << cam_list_file << std::endl;\n  asp::write_list(cam_list_file, cam_files);\n\n}\n\n/// Load all of the reference disparities specified in the input text file\n/// and store them in the vectors.  Return the number loaded.\nint loadRefDisp(std::string const& disp_list_filename,\n                std::vector<vw::ImageView<vw::PixelMask<vw::Vector2f>>> & disp_vec,\n                std::vector<vw::ImageViewRef<vw::PixelMask<vw::Vector2f>>> & interp_disp) {\n  // TODO: Disparities can be large, but if small it is better to\n  // read them in memory.\n  std::istringstream is(disp_list_filename);\n  std::string disp_file;\n  while (is >> disp_file) {\n    if (disp_file != \"none\") {\n      vw::vw_out() << \"Reading: \" << disp_file << std::endl;\n      disp_vec.push_back(copy(vw::DiskImageView<vw::PixelMask<vw::Vector2f>>(disp_file)));\n    } else {\n      // Read in an empty disparity\n      disp_vec.push_back(vw::ImageView<vw::PixelMask<vw::Vector2f>>());\n    }\n    interp_disp.push_back(interpolate(disp_vec.back(),\n                                      vw::BilinearInterpolation(),\n                                      vw::ConstantEdgeExtension()));\n  }\n  return static_cast<int>(disp_vec.size());\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Camera/BundleAdjustIsis.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file BundleAdjustIsis.cc\n\n// Utilities for handling ISIS's jigsaw control network format.\n\n#include <asp/Camera/BundleAdjustIsis.h>\n#include <asp/Camera/BundleAdjustCamera.h>\n#include <asp/Camera/BaseCostFuns.h>\n#include <asp/asp_config.h> // defines ASP_HAVE_PKG_ISIS\n\n#include <vw/BundleAdjustment/ControlNetwork.h>\n#include <vw/Core/Exception.h>\n\n#if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1\n#include <isis/ControlNet.h>\n#include <isis/SurfacePoint.h>\n#include <isis/Progress.h>\n#include <isis/SerialNumberList.h>\n#include <isis/Latitude.h>\n#include <isis/Longitude.h>\n#include <isis/Distance.h>\n#include <isis/BundleImage.h>\n#include <isis/Pvl.h>\n#include <isis/Target.h>\n#include <isis/CameraFactory.h>\n#include <isis/Camera.h>\n#include <isis/Cube.h>\n#include <isis/FileName.h>\n#endif // ASP_HAVE_PKG_ISIS\n\n#include <boost/shared_ptr.hpp>\n\n#include <string>\n#include <iostream>\n\n// TODO(oalexan1): Must check that number of images agrees with number\n// of cid in cnet.\n\n// Note: The output cnet file must contain the updated control network with the\n// final coordinates of the control points and residuals for each measurement.\n// It also must have serial numbers, apriori sigma, apriori surface points, etc.\nnamespace asp {\n\n#if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1\n\n// ISIS cnet measures have an additional 0.5 added to them\nconst double ISIS_CNET_TO_ASP_OFFSET = -0.5;\n\n// Read the serial numbers of the images. For non-cub files,\n// these will be the image names. \nvoid readSerialNumbers(std::vector<std::string> const& image_files,\n                       std::vector<std::string> & serialNumbers) {\n\n  // Wipe the output\n  serialNumbers.clear();\n\n  try {\n    Isis::SerialNumberList serial_list;\n    for (size_t i = 0; i < image_files.size(); i++) {\n      QString fileName = QString::fromStdString(image_files[i]);\n      serial_list.add(fileName);\n    }\n    for (size_t i = 0; i < image_files.size(); i++) {\n      QString serialNumber = serial_list.serialNumber(i);\n      serialNumbers.push_back(serialNumber.toStdString());\n    }\n  } catch (...) {\n    // The above will fail for non-ISIS images. \n    serialNumbers.clear();\n    for (size_t i = 0; i < image_files.size(); i++)\n      serialNumbers.push_back(image_files[i]);\n  }\n}\n\n// Set the Isis cnet target based on the image name. If that fails,\n// as for Earth, set it to the datum name.\nvoid setIsisCnetTarget(std::string const& image_name, \n                       vw::cartography::Datum const& datum,\n                       Isis::ControlNet & icnet) {\n\n  try {\n    Isis::Pvl cubeLab(QString::fromStdString(image_name));\n    Isis::Pvl maplab;\n    maplab.addGroup(Isis::PvlGroup(\"Mapping\"));\n    Isis::PvlGroup &mapGroup = maplab.findGroup(\"Mapping\");\n    mapGroup = Isis::Target::radiiGroup(cubeLab, mapGroup);\n    icnet.SetTarget(maplab);\n  } catch (...) {\n    try {\n      // Set the target to the datum name\n      icnet.SetTarget(QString::fromStdString(datum.name()));\n    } catch (...) {\n      // If really no luck, just use WGS84, as it is more likely to fail for Earth\n      icnet.SetTarget(QString::fromStdString(\"WGS84\"));\n    }\n  }\n}\n\n// Read the cameras This may fail for non-ISIS images. Then use null cameras.\nvoid readIsisCameras(std::vector<std::string> const& image_files,\n                     std::vector<boost::shared_ptr<Isis::Camera>> & cameras) {\n\n  // Wipe the output\n  cameras.clear();\n  \n  for (size_t i = 0; i < image_files.size(); i++) {\n    Isis::Camera *cam = NULL;\n    try {\n      QString fileName = QString::fromStdString(image_files[i]);\n      Isis::Cube cube(Isis::FileName(fileName), \"r\");\n      Isis::Camera *cam = Isis::CameraFactory::Create(cube);\n    } catch (...) {}\n    cameras.push_back(boost::shared_ptr<Isis::Camera>(cam));\n  }\n}\n\n// Add a given control point to the ISIS cnet. Update the outlier counter.\nvoid addIsisControlPoint(Isis::ControlNet & icnet,\n                         vw::ba::ControlNetwork const& cnet,\n                         asp::BaParams const& param_storage,\n                         std::vector<boost::shared_ptr<Isis::Camera>> const& cameras,\n                         std::vector<std::string> const& serialNumbers,\n                         int ipt, int& numOutliers) {\n\n  // Sanity check for cnet and param_storage\n  if (cnet.size() != param_storage.num_points())\n    vw_throw(vw::ArgumentErr() \n             << \"addIsisControlPoint: cnet and param_storage have different sizes.\\n\");\n  if (ipt >= cnet.size() || ipt >= param_storage.num_points())\n    vw_throw(vw::ArgumentErr() \n             << \"addIsisControlPoint: ipt is too large.\\n\");\n    \n  Isis::ControlPoint *point = new Isis::ControlPoint();\n  if (param_storage.get_point_outlier(ipt)) {\n    point->SetIgnored(true); // better set it to ignored as well\n    point->SetRejected(true);\n    numOutliers++;\n  } else {    \n    point->SetRejected(false);\n  }\n  \n  // The bundle_adjust convention is that a point is fixed if its sigma is\n  // asp::FIXED_GCP_SIGMA (a very tiny number). Otherwise it is variable but\n  // constrained by sigma.\n  vw::Vector3 sigma = cnet[ipt].sigma(); // point sigma\n  double s = asp::FIXED_GCP_SIGMA;\n  if (cnet[ipt].type() == vw::ba::ControlPoint::GroundControlPoint) {\n    if (sigma == vw::Vector3(s, s, s)) {\n      point->SetType(Isis::ControlPoint::Fixed);\n    } else {\n      point->SetType(Isis::ControlPoint::Constrained);\n    }\n  } else {\n    point->SetType(Isis::ControlPoint::Free);\n  }\n  \n  // Set the point id\n  std::ostringstream os;\n  os << \"point_\" << ipt;\n  point->SetId(QString::fromStdString(os.str()));\n  \n  // Set apriori position from the input cnet\n  Isis::SurfacePoint A;\n  vw::Vector3 a = cnet[ipt].position();\n  A.SetRectangular(Isis::Displacement(a[0], Isis::Displacement::Meters),\n                   Isis::Displacement(a[1], Isis::Displacement::Meters),\n                   Isis::Displacement(a[2], Isis::Displacement::Meters),\n                   Isis::Distance(sigma[0], Isis::Distance::Meters),\n                   Isis::Distance(sigma[1], Isis::Distance::Meters),\n                   Isis::Distance(sigma[2], Isis::Distance::Meters));\n  point->SetAprioriSurfacePoint(A);\n  \n  // Set the optimized (adjusted) position  \n  Isis::SurfacePoint P;\n  const double * asp_point = param_storage.get_point_ptr(ipt); // ecef, meters\n  P.SetRectangular(Isis::Displacement(asp_point[0], Isis::Displacement::Meters),\n                    Isis::Displacement(asp_point[1], Isis::Displacement::Meters),\n                    Isis::Displacement(asp_point[2], Isis::Displacement::Meters),\n                    Isis::Distance(sigma[0], Isis::Distance::Meters),\n                    Isis::Distance(sigma[1], Isis::Distance::Meters),\n                    Isis::Distance(sigma[2], Isis::Distance::Meters));\n  point->SetAdjustedSurfacePoint(P);\n\n  // Add the measures, and their sigmas\n  for (auto m_iter = cnet[ipt].begin(); m_iter != cnet[ipt].end(); m_iter++) {\n    \n    int cid = m_iter->image_id();\n    vw::Vector2 sigma = m_iter->sigma();\n    \n    // Must add 0.5 to the ASP measure to get the ISIS measure\n    double col = m_iter->position()[0] - ISIS_CNET_TO_ASP_OFFSET;\n    double row = m_iter->position()[1] - ISIS_CNET_TO_ASP_OFFSET;\n\n    Isis::ControlMeasure *measurement = new Isis::ControlMeasure();\n    measurement->SetCoordinate(col, row, Isis::ControlMeasure::RegisteredSubPixel);\n    measurement->SetType(Isis::ControlMeasure::RegisteredSubPixel);\n    measurement->SetAprioriSample(col);\n    measurement->SetAprioriLine(row);\n    measurement->SetIgnored(false);\n    measurement->SetRejected(false);\n    measurement->SetSampleSigma(sigma[0]);\n    measurement->SetLineSigma(sigma[1]);\n    measurement->SetResidual(0.0, 0.0);\n    measurement->SetCubeSerialNumber(QString::fromStdString(serialNumbers[cid]));\n    measurement->SetCamera(cameras[cid].get());\n\n    point->Add(measurement);\n  }\n  \n  icnet.AddPoint(point);\n}\n\n#endif // ASP_HAVE_PKG_ISIS\n\n// Load an ISIS cnet file and copy it to an ASP control network. The ISIS cnet\n// will be used when saving the updated cnet. Keep these cnets one-to-one,\n// though later the ASP cnet may also have GCP.\nvoid loadIsisCnet(std::string const& isisCnetFile,\n                  std::vector<std::string> const& image_files,\n                  // Outputs\n                  vw::ba::ControlNetwork & cnet,\n                  IsisCnetData & isisCnetData) {\n\n#if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1\n\n  // Reset the outputs\n  cnet = vw::ba::ControlNetwork(\"ASP_control_network\");\n  isisCnetData = IsisCnetData();\n  \n  // Aliases\n  Isis::ControlNetQsp & icnet = isisCnetData.isisCnet;\n  std::set<int> & isisOutliers = isisCnetData.isisOutliers;\n\n  // Report any ISIS-related surface points as ECEF (rectangular). Not really used.\n  Isis::SurfacePoint::CoordinateType coord_type = Isis::SurfacePoint::Rectangular;\n\n  // Read the ISIS control network\n  QString qCnetFile = QString::fromStdString(isisCnetFile);\n  Isis::Progress progress;\n  icnet = Isis::ControlNetQsp(new Isis::ControlNet(qCnetFile, &progress, coord_type));\n  \n  // We will not reset the points rejected by jigsaw. Keep them rejected.\n  // We won't even bother to read them into ASP. Such a points are tiny\n  // minority, unlikely to have any effect. \n    \n  // Create the map from image serial number to image index\n  std::vector<std::string> serialNumbers;\n  readSerialNumbers(image_files, serialNumbers);\n  std::map<std::string, int> serialNumberToImageIndex;\n  for (size_t i = 0; i < image_files.size(); i++) {\n    serialNumberToImageIndex[serialNumbers[i]] = i;\n    cnet.add_image_name(image_files[i]);\n  }\n   \n  // Ensure we have as many serial numbers as images\n  if (serialNumberToImageIndex.size() != image_files.size())\n    vw_throw(vw::ArgumentErr() << \"Found images with the same serial number. \"\n             << \"Check your input data.\\n\");\n     \n  // Add the control points\n  int numControlPoints = icnet->GetNumPoints();\n  int numSemiFree = 0, numConstrained = 0, numFixed = 0, numRejected = 0, numIgnored = 0;\n  for (int i = 0; i < numControlPoints; i++) {\n\n    Isis::ControlPoint *point = icnet->GetPoint(i);\n    bool ignore = false;\n    \n    if (point->IsIgnored()) {\n      numIgnored++;\n      // We do not skip any points, to preserve the one-to-one correspondence.\n      // Add to isisOutliers\n      isisOutliers.insert(i);\n      ignore = true;\n    }\n    if (point->IsRejected()) {\n      numRejected++;\n      // We do not skip any points, to preserve the one-to-one correspondence.\n      // Add to isisOutliers\n      isisOutliers.insert(i);\n      ignore = true;\n    }\n      \n    // Triangulated point and apriori point\n    Isis::SurfacePoint P = point->GetAdjustedSurfacePoint();\n    Isis::SurfacePoint A = point->GetAprioriSurfacePoint();\n    \n    // Set the cnet tri point to the prior point. The surface point\n    // will be triangulated by bundle_adjust.\n    // By default, a point is free, and its sigma is nominal and will not be\n    // used. Will adjust below for constrained and fixed points.\n    vw::ba::ControlPoint cpoint(vw::ba::ControlPoint::TiePoint); // free\n    vw::Vector3 a(A.GetX().meters(), A.GetY().meters(), A.GetZ().meters());\n    cpoint.set_position(a);\n    cpoint.set_ignore(ignore);\n\n     // Set sigma. This will be used only for constrained points. \n     // Use the sigmas from the adjusted surface points, as they are \n     // more likely to be positive and perhaps up-to-date than the\n     // prior sigmas.\n     double xs = P.GetXSigma().meters();\n     double ys = P.GetYSigma().meters();\n     double zs = P.GetZSigma().meters();\n     cpoint.set_sigma(vw::Vector3(xs, ys, zs));\n\n    // The actual surface point will not be used. It will later be initialized\n    // as the a priori point, and then optimized.    \n    // vw::Vector3 p(P.GetX().meters(), P.GetY().meters(), P.GetZ().meters());\n\n    if (point->GetType() == Isis::ControlPoint::Constrained) {\n      \n      // Treat partially constrained points as unconstrained.\n      int numConstr = int(point->IsCoord1Constrained()) +\n                      int(point->IsCoord2Constrained()) +\n                      int(point->IsCoord3Constrained());\n      if (numConstr < 3) {\n        numSemiFree++;\n      } else {\n        // Fully constrained point\n        numConstrained++;\n        if (xs <= 0 || ys <= 0 || zs <= 0) \n          vw_throw(vw::ArgumentErr() \n                    << \"loadIsisCnet: ISIS constrained point with index \"\n                    << i << \" has a non-positive sigma.\\n\");\n        // Set as gcp, but with given sigma, rather than tiny sigma.\n        cpoint.set_type(vw::ba::ControlPoint::GroundControlPoint); // gcp\n      }\n    } else if (point->GetType() == Isis::ControlPoint::Free) {\n       // Nothing to do here. The point and sigma is already set. \n    } else if (point->GetType() == Isis::ControlPoint::Fixed) {\n      numFixed++;\n      cpoint.set_type(vw::ba::ControlPoint::GroundControlPoint); // gcp\n      double s = asp::FIXED_GCP_SIGMA; // Later will keep fixed\n      cpoint.set_sigma(vw::Vector3(s, s, s));\n    }\n    \n    int numMeasures = point->GetNumMeasures();\n    for (int j = 0; j < numMeasures; j++) {\n\n      Isis::ControlMeasure *controlMeasure = point->GetMeasure(j);\n\n      // Get serial number as std::string. This is unique to each image.\n      QString qCubeSerialNumber = controlMeasure->GetCubeSerialNumber();\n      std::string cubeSerialNumber = qCubeSerialNumber.toStdString();\n      \n      // These have 0.5 added to them, which we will remove\n      double sample = controlMeasure->GetSample();\n      double line = controlMeasure->GetLine();\n      double col = sample + ISIS_CNET_TO_ASP_OFFSET;\n      double row = line   + ISIS_CNET_TO_ASP_OFFSET;\n\n      // These sigmas can turn out to be negative\n      double sample_sigma = controlMeasure->GetSampleSigma();\n      double line_sigma   = controlMeasure->GetLineSigma();\n      if (sample_sigma <= 0 || std::isnan(sample_sigma) || std::isinf(sample_sigma))\n        sample_sigma = 1.0;\n      if (line_sigma <= 0 || std::isnan(line_sigma) || std::isinf(line_sigma))\n        line_sigma = 1.0;\n      \n      // Find the image index\n      auto it = serialNumberToImageIndex.find(cubeSerialNumber);\n      if (it == serialNumberToImageIndex.end())\n        vw_throw(vw::ArgumentErr() << \"Could not find image with serial number: \"\n                 << cubeSerialNumber << \".\\n\");\n      int image_id = it->second;\n      cpoint.add_measure(vw::ba::ControlMeasure(col, row, sample_sigma, line_sigma,\n                                                image_id));\n    }\n\n    // We do not skip any points, to preserve the one-to-one correspondence.\n    // But points with no measures are flagged as outliers.    \n    if (cpoint.size() == 0) {\n      isisOutliers.insert(i);\n      cpoint.set_ignore(true);\n    }\n    \n    cnet.add_control_point(cpoint);\n  }    \n\n  if (numSemiFree > 0)\n    vw::vw_out(vw::WarningMessage) \n      << \"loadIsisCnet: Treat \" << numSemiFree\n      << \" partially constrained points as unconstrained.\\n\"; \n  if (numConstrained > 0)\n    vw::vw_out() << \"loadIsisCnet: Found \" << numConstrained\n                 << \" constrained points. Use as GCP with given sigma.\\n\";\n  if (numFixed > 0)\n    vw::vw_out() << \"loadIsisCnet: Found \" << numFixed\n                 << \" fixed points. Use as fixed GCP.\\n\";\n  if (numRejected > 0)\n    vw::vw_out() << \"loadIsisCnet: Found \" << numRejected\n                 << \" rejected points. Flag as outliers.\\n\";\n  if (numIgnored > 0)\n    vw::vw_out() << \"loadIsisCnet: Found \" << numIgnored\n                 << \" ignored points. Flag as outliers.\\n\";\n                 \n  vw::vw_out() << \"Loaded \" << cnet.size() << \" control points.\\n\";\n\n#endif // ASP_HAVE_PKG_ISIS\n  \n  return;    \n}\n\n// Update an ISIS cnet with the latest info on triangulated points\n// and outliers, and write it to disk at <outputPrefix>.net.\n// We do not change here if a point is fixed, constrained, or free.\nvoid saveUpdatedIsisCnet(std::string const& outputPrefix, \n                         vw::ba::ControlNetwork const& cnet,\n                         asp::BaParams const& param_storage,\n                         IsisCnetData & isisCnetData) {\n\n#if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1\n\n  // Sanity check\n  if (param_storage.num_points() != cnet.size())\n    vw::vw_throw(vw::ArgumentErr() \n             << \"saveIsisCnet: number of points in param_storage and cnet do not match.\\n\");\n\n  // Find the serial numbers\n  std::vector<std::string> image_files = cnet.get_image_list();\n  std::vector<std::string> serialNumbers;\n  readSerialNumbers(image_files, serialNumbers);\n  // Read the cameras This may fail for non-ISIS images. Then use null cameras.\n  std::vector<boost::shared_ptr<Isis::Camera>> cameras;\n  readIsisCameras(image_files, cameras);\n\n  // Aliases\n  Isis::ControlNetQsp const& icnet = isisCnetData.isisCnet;\n\n  // The ASP cnet may have more points than the ISIS cnet, as it may have GCP.\n  int numControlPoints = icnet->GetNumPoints();\n  if (numControlPoints > param_storage.num_points())\n    vw_throw(vw::ArgumentErr() \n             << \"saveUpdatedIsisCnet: Book-keeping failure. ASP cnet is too small.\\n\");\n    \n  // Iterate over the ISIS control points\n  int numOutliers = 0;\n  for (int i = 0; i < numControlPoints; i++) {\n\n    Isis::ControlPoint *point = icnet->GetPoint(i);\n    if (point->IsIgnored() || point->IsRejected() || param_storage.get_point_outlier(i)) {\n      point->SetIgnored(true);\n      point->SetRejected(true);\n      numOutliers++;\n      // On occasion there is failure below if continuing with bad points\n      continue;\n    }\n    \n    // Update the apriori position from the cnet. Note that this may \n    // have changed if a transform was applied to the cameras.\n    // Get the apriori sigma too. Some bundle adjustment options change\n    // that too, though not by default.\n    vw::Vector3 a = cnet[i].position();\n    vw::Vector3 sigma = cnet[i].sigma(); // point sigma\n    Isis::SurfacePoint A = point->GetAprioriSurfacePoint();\n    A.SetRectangular(Isis::Displacement(a[0], Isis::Displacement::Meters),\n                     Isis::Displacement(a[1], Isis::Displacement::Meters),\n                     Isis::Displacement(a[2], Isis::Displacement::Meters),\n                     Isis::Distance(sigma[0], Isis::Distance::Meters),\n                     Isis::Distance(sigma[1], Isis::Distance::Meters),\n                     Isis::Distance(sigma[2], Isis::Distance::Meters));\n    point->SetAprioriSurfacePoint(A);\n\n    // Update the triangulated point. Use same sigmas as above. These\n    // may have been changed by bundle adjustment.\n    const double * asp_point = param_storage.get_point_ptr(i);\n    Isis::SurfacePoint P = point->GetAdjustedSurfacePoint();\n    P.SetRectangular(Isis::Displacement(asp_point[0], Isis::Displacement::Meters),\n                     Isis::Displacement(asp_point[1], Isis::Displacement::Meters),\n                     Isis::Displacement(asp_point[2], Isis::Displacement::Meters),\n                     Isis::Distance(sigma[0], Isis::Distance::Meters),\n                     Isis::Distance(sigma[1], Isis::Distance::Meters),\n                     Isis::Distance(sigma[2], Isis::Distance::Meters));\n    point->SetAdjustedSurfacePoint(P);\n    \n    // Update the sigmas for measures from the ASP cnet\n    int numMeasures = point->GetNumMeasures();\n    int aspNumMeasures = cnet[i].size();\n    if (numMeasures != aspNumMeasures)\n      vw_throw(vw::ArgumentErr() \n               << \"saveUpdatedIsisCnet: Book-keeping failure in number of measures.\\n\");\n      \n    int meas_id = 0;   \n    for (auto m_iter = cnet[i].begin(); m_iter != cnet[i].end(); m_iter++) {\n      vw::Vector2 sigma = m_iter->sigma();\n      Isis::ControlMeasure *measurement = point->GetMeasure(meas_id);\n      measurement->SetSampleSigma(sigma[0]);\n      measurement->SetLineSigma(sigma[1]);\n\n      meas_id++;\n    }\n  }\n  \n  // Save any GCP that were later added to the ASP cnet. This creates new\n  // points rather than updating existing ones.\n  for (int i = numControlPoints; i < param_storage.num_points(); i++) {\n    \n    vw::ba::ControlPoint const& cpoint = cnet[i];\n    if (cpoint.type() != vw::ba::ControlPoint::GroundControlPoint)\n      vw_throw(vw::ArgumentErr() \n               << \"saveUpdatedIsisCnet: Book-keeping failure. Expected GCP.\\n\");\n      \n    addIsisControlPoint(*icnet.get(), cnet, param_storage, cameras, serialNumbers, i, \n                        numOutliers);    \n  }\n  \n  vw::vw_out() << \"Number of points in control network: \" << icnet->GetNumPoints() << \"\\n\";\n  vw::vw_out() << \"Number of outliers: \" << numOutliers << std::endl;\n  vw::vw_out() << \"Target: \" << icnet->GetTarget().toStdString() << std::endl;\n  \n  std::string cnetFile = outputPrefix + \".net\";\n  vw::vw_out() << \"Writing ISIS control network: \" << cnetFile << \"\\n\"; \n  QString qCnetFile = QString::fromStdString(cnetFile);\n  icnet->Write(qCnetFile);\n  \n#endif // ASP_HAVE_PKG_ISIS\n\n  return;  \n}\n\n// Create from scratch and and save an ISIS cnet from a given control network\n// and latest param values.\nvoid saveIsisCnet(std::string const& outputPrefix, \n                  vw::cartography::Datum const& datum,\n                  vw::ba::ControlNetwork const& cnet,\n                  asp::BaParams const& param_storage) {\n  \n#if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1\n  \n  // Sanity check\n  if (param_storage.num_points() != cnet.size())\n    vw::vw_throw(vw::ArgumentErr() \n             << \"saveIsisCnet: number of points in param_storage and cnet do not match.\\n\");\n\n  // Find the serial numbers\n  std::vector<std::string> image_files = cnet.get_image_list();\n  std::vector<std::string> serialNumbers;\n  readSerialNumbers(image_files, serialNumbers);\n  // Read the cameras This may fail for non-ISIS images. Then use null cameras.\n  std::vector<boost::shared_ptr<Isis::Camera>> cameras;\n  readIsisCameras(image_files, cameras);\n  \n  // Initialize the isis cnet\n  Isis::ControlNet icnet;\n  setIsisCnetTarget(image_files[0], datum, icnet);\n  icnet.SetNetworkId(QString::fromStdString(\"bundle_adjust\"));\n  icnet.SetUserName(QString::fromStdString(\"bundle_adjust\"));\n  icnet.SetDescription(QString::fromStdString(\"bundle_adjust\"));\n\n  // Add a given control point to the ISIS cnet. Update the outlier counter.\n  int numOutliers = 0;\n  for (int i = 0; i < cnet.size(); i++)\n    addIsisControlPoint(icnet, cnet, param_storage, cameras, serialNumbers, i, \n                        numOutliers);    \n  \n  vw::vw_out() << \"Number of points in control network: \" << icnet.GetNumPoints() << \"\\n\";\n  vw::vw_out() << \"Number of outliers: \" << numOutliers << std::endl;\n  vw::vw_out() << \"Target: \" << icnet.GetTarget().toStdString() << std::endl;\n\n  std::string cnetFile = outputPrefix + \".net\";\n  vw::vw_out() << \"Writing ISIS control network: \" << cnetFile << \"\\n\"; \n  icnet.Write(QString::fromStdString(cnetFile));\n\n#endif // ASP_HAVE_PKG_ISIS\n\n  return;\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Camera/BundleAdjustIsis.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file BundleAdjustIsis.h\n\n/// Utilities for handling ISIS's jigsaw control network format.\n\n#ifndef __BUNDLE_ADJUST_ISIS_H__\n#define __BUNDLE_ADJUST_ISIS_H__\n\n#include <asp/asp_config.h> // defines ASP_HAVE_PKG_ISIS\n\n#if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1\n#include <isis/ControlNet.h>\n#endif // ASP_HAVE_PKG_ISIS\n\n#include <boost/shared_ptr.hpp>\n\n#include <string>\n#include <map>\n#include <set>\n\nnamespace vw {\n  namespace ba {\n    class ControlNetwork;\n  }\n  namespace cartography {\n    class Datum;\n  }\n}\n\nnamespace asp {\n\n\nstruct BaParams;\n\n// Use this struct to collect all the data needed to handle an ISIS cnet.\nstruct IsisCnetData {\n\n#if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1\n  Isis::ControlNetQsp isisCnet;\n#endif // ASP_HAVE_PKG_ISIS\n\n  std::set<int> isisOutliers; // rejected or ignored points are flagged as outliers\n  \n  IsisCnetData() {\n\n#if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1\n    isisCnet = Isis::ControlNetQsp(NULL);\n#endif // ASP_HAVE_PKG_ISIS\n\n    isisOutliers.clear();\n  }\n};\n\n// Load an ISIS cnet file and copy it to an ASP control network. The ISIS cnet\n// will be used when saving the updated cnet. Keep these cnets one-to-one,\n// though later the ASP cnet may also have GCP.\nvoid loadIsisCnet(std::string const& isisCnetFile, \n                  std::vector<std::string> const& image_files,\n                  // Outputs\n                  vw::ba::ControlNetwork& cnet,\n                  IsisCnetData & isisCnetData);\n\n// Update an ISIS cnet with the latest info on triangulated points and outliers,\n// and write it to disk at <outputPrefix>.net.\nvoid saveUpdatedIsisCnet(std::string const& outputPrefix,\n                         vw::ba::ControlNetwork const& cnet,\n                         asp::BaParams const& param_storage,\n                         IsisCnetData & isisCnetData);\n\n// Create and save an ISIS cnet from a given control network and latest param\n// values.\nvoid saveIsisCnet(std::string const& outputPrefix, \n                  vw::cartography::Datum const& datum,\n                  vw::ba::ControlNetwork const& cnet,\n                  asp::BaParams const& param_storage);\n\n} // end namespace asp\n\n#endif // __BUNDLE_ADJUST_ISIS_H__\n"
  },
  {
    "path": "src/asp/Camera/BundleAdjustOptions.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// \\file BundleAdjustOptions.cc\n\n// Options for bundle adjustment.\n#include <asp/Camera/BundleAdjustOptions.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/ImageUtils.h>\n#include <asp/Core/FileUtils.h>\n#include <asp/Core/PointUtils.h>\n#include <asp/Core/InterestPointMatching.h>\n#include <asp/Core/ImageNormalization.h>\n\n#include <vw/Image/Algorithms.h>\n#include <vw/InterestPoint/MatcherIO.h>\n#include <vw/Geometry/dPoly.h>\n\n#include <boost/filesystem.hpp>\n\n#include <string>\n\nnamespace fs = boost::filesystem;\n\nnamespace asp {\n\nvoid BaOptions::copy_to_asp_settings() const {\n  asp::stereo_settings().ip_detect_method        = ip_detect_method;\n  asp::stereo_settings().epipolar_threshold      = epipolar_threshold;\n  asp::stereo_settings().ip_inlier_factor        = ip_inlier_factor;\n  asp::stereo_settings().ip_uniqueness_thresh    = ip_uniqueness_thresh;\n  asp::stereo_settings().num_scales              = num_scales;\n  asp::stereo_settings().nodata_value            = nodata_value;\n  asp::stereo_settings().ip_per_tile             = ip_per_tile;\n  asp::stereo_settings().ip_per_image            = ip_per_image;\n  asp::stereo_settings().matches_per_tile        = matches_per_tile;\n  asp::stereo_settings().matches_per_tile_params = matches_per_tile_params;\n  asp::stereo_settings().no_datum                = no_datum;\n\n  // Note that by default rough homography and tri filtering are disabled\n  // as input cameras may be too inaccurate for that.\n  asp::stereo_settings().skip_rough_homography      = !enable_rough_homography;\n  asp::stereo_settings().disable_tri_filtering      = !enable_tri_filtering;\n\n  // Do not pass this as it will results in filtering by elevation and lonlat\n  // with unoptimized cameras. We will do that filtering with optimized\n  // cameras later.\n  //asp::stereo_settings().elevation_limit            = elevation_limit;\n  //asp::stereo_settings().lon_lat_limit              = lon_lat_limit;\n\n  asp::stereo_settings().individually_normalize     = individually_normalize;\n  asp::stereo_settings().force_reuse_match_files    = force_reuse_match_files;\n  asp::stereo_settings().min_triangulation_angle    = min_triangulation_angle;\n  asp::stereo_settings().ip_triangulation_max_error = ip_triangulation_max_error;\n  asp::stereo_settings().ip_num_ransac_iterations   = ip_num_ransac_iterations;\n  asp::stereo_settings().ip_edge_buffer_percent     = ip_edge_buffer_percent;\n  asp::stereo_settings().ip_debug_images            = ip_debug_images;\n  asp::stereo_settings().ip_normalize_tiles         = ip_normalize_tiles;\n  asp::stereo_settings().flann_method               = flann_method;\n  asp::stereo_settings().propagate_errors           = propagate_errors;\n  asp::stereo_settings().ip_nodata_radius           = ip_nodata_radius;\n\n  // The setting below is not used, but populate it for completeness\n  asp::stereo_settings().horizontal_stddev          = vw::Vector2(horizontal_stddev,\n                                                                  horizontal_stddev);\n  asp::stereo_settings().validate();\n}\n\n// Read the mapprojected data, if having the option --mapprojected-data.\nvoid setupMapprojectedData(asp::BaOptions & opt,\n                           bool need_no_matches,\n                           std::vector<std::string> & map_files,\n                           std::string & mapproj_dem) {\n\n  // Clear the outputs\n  map_files.clear();\n  mapproj_dem.clear();\n\n  if (!need_no_matches) {\n    if (!opt.mapprojected_data_list.empty()) {\n      asp::read_list(opt.mapprojected_data_list, map_files);\n      opt.mapprojected_data = \"non-empty\"; // put a token value, to make it non-empty\n    } else if (opt.mapprojected_data != \"\") {\n      std::istringstream is(opt.mapprojected_data);\n      std::string file;\n      while (is >> file)\n        map_files.push_back(file);\n    }\n\n    if (!opt.mapprojected_data.empty()) {\n      // Read the mapproj DEM from the first image geoheader or as the last element\n      // in the list.\n      if (opt.image_files.size() + 1 != map_files.size() &&\n          opt.image_files.size()     != map_files.size())\n        vw::vw_throw(vw::ArgumentErr() << \"Error: Expecting as many mapprojected images as \"\n          << \"cameras and, potentially, a DEM at the end of the mapprojected list.\\n\");\n\n      if (opt.image_files.size() == map_files.size()) {\n        // Read the DEM from first image header  \n        std::string adj_key, img_file_key, cam_type_key, cam_file_key, dem_file_key;\n        std::string adj_prefix_raw, image_file_raw, cam_type, cam_file_raw, dem_file;\n        asp::read_mapproj_header(map_files.at(0),\n                                  adj_key, img_file_key, cam_type_key,\n                                  cam_file_key, dem_file_key,\n                                  adj_prefix_raw, image_file_raw, cam_type,\n                                  cam_file_raw,\n                                  mapproj_dem); // read here\n      } else if (opt.image_files.size() + 1 == map_files.size()) {\n        // Pull out the dem from the list\n        mapproj_dem = map_files.back();\n        map_files.erase(map_files.end() - 1);\n      }\n    }\n\n    // The mapproj DEM must be non-empty\n    if (!map_files.empty() && mapproj_dem.empty())\n      vw::vw_throw(vw::ArgumentErr()\n                << \"Interest point matching with mapprojected images requires a DEM. \"\n                << \"None found either on the command line or in a geoheader of any \"\n                << \"mapprojected image.\\n\");\n  }\n\n  if (!map_files.empty()) {\n    if (!opt.initial_transform_file.empty() || need_no_matches)\n      vw::vw_throw(vw::ArgumentErr()\n                << \"Cannot use mapprojected data with initial adjustments, \"\n                << \"an initial transform, or ISIS cnet or NVM input.\\n\");\n  }\n}\n\n/// Looks in the input camera position file to generate a GCC position for\n/// each input camera.\n/// - If no match is found, the coordinate is (0,0,0)\nint loadEstimCameraPositions(asp::BaOptions &opt,\n                             std::vector<vw::Vector3> & estimated_camera_gcc) {\n  estimated_camera_gcc.clear();\n  if (opt.camera_position_file == \"\")\n    return 0;\n\n  // Read the input csv file\n  asp::CsvConv conv;\n  conv.parse_csv_format(opt.csv_format_str, opt.csv_srs);\n  std::list<asp::CsvConv::CsvRecord> pos_records;\n  typedef std::list<asp::CsvConv::CsvRecord>::const_iterator RecordIter;\n  conv.read_csv_file(opt.camera_position_file, pos_records);\n\n  // Set up a GeoReference object using the datum\n  vw::cartography::GeoReference geo;\n  geo.set_datum(opt.datum); // We checked for a datum earlier\n  conv.parse_georef(geo);\n\n  // For each input camera, find the matching position in the record list\n  const int num_cameras = opt.image_files.size();\n  estimated_camera_gcc.resize(num_cameras);\n\n  const RecordIter no_match = pos_records.end();\n  int num_matches_found = 0;\n  for (int i = 0; i < num_cameras; i++) {\n\n    // Search for this image file in the records\n    std::string file_name = opt.image_files[i];\n    RecordIter iter;\n    for (iter = pos_records.begin(); iter != pos_records.end(); iter++) {\n      // Match if the string in the file is contained in the input image string.\n      // - May need to play around with this in the future!\n      std::string field = iter->file;\n      if (file_name.find(field) != std::string::npos) {\n        estimated_camera_gcc[i] = conv.csv_to_cartesian(*iter, geo);\n        break; // Match found, stop the iterator here.\n      }\n    }\n    if (iter == no_match) {\n      vw::vw_out(vw::WarningMessage) << \"Camera file \" << file_name\n         << \" not found in camera position file.\\n\";\n      estimated_camera_gcc[i] = vw::Vector3(0,0,0);\n    } else {\n      num_matches_found++;\n    }\n  } // End loop to find position record for each camera\n\n  return num_matches_found;\n}\n\n// Compute statistics for the designated range of images (or mapprojected\n// images), and perhaps the footprints. Or, compute the ip per image (before\n// matching). These distinct operations use much shared logic, so are put in the\n// same function. In parallel_bundle_adjust this function is called separately\n// for different ranges.\nvoid computeStatsOrIp(asp::BaOptions const& opt,\n                      std::vector<std::string> const& files_for_stats,\n                      std::string const& dem_file_for_overlap,\n                      std::string const& normalization_bounds_file,\n                      bool calcIp) {\n\n  using namespace vw;\n\n  int num_images = files_for_stats.size();\n  if (num_images != opt.image_files.size())\n    vw_throw(ArgumentErr() << \"Book-keeping error in number of images.\\n\");\n\n  std::map<std::string, vw::Vector2> bounds_map;\n  if (calcIp)\n    asp::readNormalizationBounds(normalization_bounds_file, files_for_stats, bounds_map);\n\n  // Assign the images which this job should compute statistics for.\n  std::vector<size_t> image_stats_indices;\n  for (size_t i = opt.job_id; i < num_images; i += opt.num_parallel_jobs)\n    image_stats_indices.push_back(i);\n\n  for (size_t i = 0; i < image_stats_indices.size(); i++) {\n\n    size_t index = image_stats_indices[i];\n\n    // The stats need to be computed for the mapprojected image, if provided\n    std::string image_path = files_for_stats[index];\n\n    // Call a bunch of stuff to get the nodata value\n    boost::shared_ptr<DiskImageResource> rsrc(vw::DiskImageResourcePtr(image_path));\n    float nodata = -std::numeric_limits<float>::max();\n    float dummy_nodata = nodata;\n    asp::get_nodata_values(rsrc, rsrc, asp::stereo_settings().nodata_value,\n                         nodata, dummy_nodata);\n\n    // Set up the image view. If the user provided a custom no-data value,\n    // values no more than that are masked.\n    float user_nodata = asp::stereo_settings().nodata_value;\n    DiskImageView<float> image_view(rsrc);\n    ImageViewRef<PixelMask<float>> masked_image;\n    if (!std::isnan(user_nodata))\n      masked_image = create_mask_less_or_equal(image_view, user_nodata);\n    else\n      masked_image = create_mask(image_view, nodata);\n\n    // Use caching function call to compute the image statistics.\n    if (!calcIp)\n      asp::gather_stats(masked_image, opt.out_prefix, image_path,\n                        asp::stereo_settings().force_reuse_match_files);\n\n    // Compute and cache the camera footprint polygon and its bbox\n    if (opt.auto_overlap_params != \"\" && !calcIp) {\n      vw::geometry::dPoly footprint;\n      vw::BBox2 footprint_bbox;\n      asp::camera_footprint(dem_file_for_overlap,\n                            opt.image_files[index], // use the original image\n                            opt.camera_models[index],\n                            opt.out_prefix,\n                            footprint, footprint_bbox); // outputs\n    }\n\n    if (calcIp) {\n      // This closely resembles the logic in normalize_images() and\n      // ip_matching(), but done per image.\n      if (asp::openCvDetectMethod()) {\n        vw::Vector2 bounds = bounds_map[image_path];\n        masked_image = normalize(masked_image, bounds[0], bounds[1], 0.0, 1.0);\n      }\n\n      // Detect ip and write them to file. Skip if cached ip newer than image exist.\n      vw::ip::InterestPointList ip;\n      std::string vwip_file = vw::ip::ip_filename(opt.out_prefix, image_path);\n      bool use_cached_ip = false;\n      if (fs::exists(vwip_file) && first_is_newer(vwip_file, image_path))\n        use_cached_ip = true;\n      asp::detect_ip(ip, apply_mask(masked_image, nodata),\n                     asp::stereo_settings().ip_per_image,\n                     asp::stereo_settings().ip_per_tile,\n                     vwip_file, nodata, use_cached_ip);\n\n    }\n  }\n\n  return;\n} // end function computeStatsOrIp\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Camera/BundleAdjustOptions.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#ifndef __ASP_CAMERA_BUNDLE_ADJUST_OPTIONS_H__\n#define __ASP_CAMERA_BUNDLE_ADJUST_OPTIONS_H__\n\n#include <asp/Camera/BundleAdjustCamera.h>\n\n#include <vw/BundleAdjustment/ControlNetwork.h>\n#include <vw/Cartography/Datum.h>\n\n#include <set>\n\n// Functions that need the BaOptions class.\n\nnamespace asp {\n  \nstruct BaOptions: public asp::BaBaseOptions {\n  std::string cnet_file,\n    cost_function, mapprojected_data, gcp_from_mapprojected;\n  int ip_per_tile, ip_per_image, matches_per_tile;\n  double overlap_exponent, ip_triangulation_max_error;\n  int num_parallel_jobs, job_id, num_random_passes, ip_num_ransac_iterations;\n  bool save_intermediate_cameras, approximate_pinhole_intrinsics,\n    init_camera_using_gcp, disable_pinhole_gcp_init,\n    transform_cameras_with_shared_gcp, transform_cameras_using_gcp,\n    solve_intrinsics, ip_normalize_tiles, ip_debug_images, stop_after_stats, \n    calc_normalization_bounds, calc_ip, stop_after_matching,\n    skip_matching, apply_initial_transform_only, save_vwip;\n  std::string camera_position_file, initial_transform_file, dem_file_for_overlap;\n  double semi_major, semi_minor, position_filter_dist;\n  std::string remove_outliers_params_str;\n  std::vector<double> intrinsics_limits;\n  boost::shared_ptr<vw::ba::ControlNetwork> cnet;\n  int ip_detect_method, num_scales;\n  double epipolar_threshold; // Max distance from epipolar line to search for IP matches.\n  double ip_inlier_factor, ip_uniqueness_thresh, nodata_value, \n    auto_overlap_buffer, pct_for_overlap, min_distortion, ip_nodata_radius;\n  bool skip_rough_homography, enable_rough_homography, disable_tri_filtering,\n    enable_tri_filtering, no_datum, individually_normalize,\n    force_reuse_match_files, no_poses_from_nvm,\n    query_num_image_pairs;\n  vw::Vector2 elevation_limit;   // Expected range of elevation to limit results to.\n  vw::BBox2 lon_lat_limit;       // Limit the triangulated interest points to this lonlat range\n  vw::Matrix<double> initial_transform;\n  std::string fixed_cameras_indices_str, flann_method, fixed_distortion_indices_str;\n  std::set<int> fixed_cameras_indices;\n  std::vector<int> fixed_distortion_indices;\n  asp::IntrinsicOptions intrinsics_options;\n  vw::Vector2i matches_per_tile_params;\n  \n  // Make sure all values are initialized, even though they will be\n  // over-written later.\n  BaOptions(): ip_per_tile(0), ip_per_image(0), \n             overlap_exponent(0), \n             save_intermediate_cameras(false),\n             solve_intrinsics(false), \n             semi_major(0), semi_minor(0), position_filter_dist(-1),\n             ip_detect_method(0), num_scales(-1), \n             pct_for_overlap(-1), skip_rough_homography(false),\n             individually_normalize(false), \n             force_reuse_match_files(false), no_poses_from_nvm(false),\n             query_num_image_pairs(false) {}\n\n  /// Bundle adjustment settings that must be passed to the asp settings\n  void copy_to_asp_settings() const;\n  \n}; // End class BaOptions\n\n// Read the mapprojected data, if having the option --mapprojected-data.\nvoid setupMapprojectedData(asp::BaOptions & opt,\n                           bool need_no_matches,\n                           std::vector<std::string> & map_files,\n                           std::string & mapproj_dem);\n\n/// Looks in the input camera position file to generate a GCC position for\n/// each input camera.\n/// - If no match is found, the coordinate is (0,0,0)\nint loadEstimCameraPositions(asp::BaOptions &opt,\n                             std::vector<vw::Vector3> & estimated_camera_gcc);\n\n// Compute statistics for the designated range of images (or mapprojected\n// images), and perhaps the footprints. Or, compute the ip per image (before\n// matching). These distinct operations use much shared logic, so are put in the\n// same function. In parallel_bundle_adjust this function is called separately\n// for different ranges.\nvoid computeStatsOrIp(asp::BaOptions const& opt, \n                      std::vector<std::string> const& files_for_stats,\n                      std::string const& dem_file_for_overlap, \n                      std::string const& normalization_bounds_file, \n                      bool calcIp);\n\n} // end namespace asp\n\n#endif // __ASP_CAMERA_BUNDLE_ADJUST_OPTIONS_H__\n"
  },
  {
    "path": "src/asp/Camera/BundleAdjustOutliers.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// \\file BundleAdjustOutliers.cc\n//\n\n// Logic for handling outliers in bundle adjustment. \n\n#include <asp/Camera/BundleAdjustOutliers.h>\n#include <asp/Camera/BundleAdjustCamera.h>\n#include <asp/Camera/BundleAdjustOptions.h>\n#include <asp/Camera/BundleAdjustResiduals.h>\n#include <asp/Core/OutlierProcessing.h>\n\n#include <vw/Math/Statistics.h>\n#include <vw/Cartography/GeoReference.h>\n#include <vw/BundleAdjustment/ControlNetwork.h>\n\n// Turn off warnings from eigen\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wunused-local-typedefs\"\n#include <ceres/ceres.h>\n#include <ceres/loss_function.h>\n#pragma GCC diagnostic pop\n\nnamespace  asp {\n\nusing namespace vw;\nusing namespace vw::camera;\nusing namespace vw::ba;\n\n// Update the set of outliers based on param_storage\nvoid updateOutliers(vw::ba::ControlNetwork const& cnet, \n                    asp::BaParams const& param_storage,\n                    std::set<int> & outliers) {\n  outliers.clear(); \n  for (int i = 0; i < param_storage.num_points(); i++)\n    if (param_storage.get_point_outlier(i))\n      outliers.insert(i); \n}\n\n// Filter matches by projection window.\n// TODO(oalexan1): Use this in jitter_solve.\n// TODO(oalexan1): This needs to be done before subsampling the matches\nvoid filterOutliersProjWin(asp::BaBaseOptions          & opt,\n                           asp::BaParams               & param_storage, \n                           vw::ba::ControlNetwork const& cnet) {\n\n  // Swap y. Sometimes it is convenient to specify these on input in reverse.\n  if (opt.proj_win.min().y() > opt.proj_win.max().y())\n    std::swap(opt.proj_win.min().y(), opt.proj_win.max().y());\n\n  // Set the projection. The function set_proj4_projection_str() does not set the\n  // datum radii, which is confusing. Use vw::cartography::set_srs_string().\n  vw::cartography::GeoReference georef;\n  bool have_datum = (opt.datum.name() != asp::UNSPECIFIED_DATUM);\n  vw::cartography::set_srs_string(opt.proj_str, have_datum, opt.datum, georef);\n\n  int num_points = param_storage.num_points();\n  for (int i = 0; i < num_points; i++) {\n      \n    if (param_storage.get_point_outlier(i))\n      continue;\n      \n    double* point = param_storage.get_point_ptr(i);\n    Vector3 xyz(point[0], point[1], point[2]);\n    Vector3 llh = georef.datum().cartesian_to_geodetic(xyz);\n    Vector2 proj_pt = georef.lonlat_to_point(subvector(llh, 0, 2));\n\n    if (!opt.proj_win.contains(proj_pt))\n      param_storage.set_point_outlier(i, true);\n  }\n}\n\nvoid filterOutliersByConvergenceAngle(asp::BaBaseOptions const& opt,\n                                      vw::ba::ControlNetwork const& cnet,\n                                      asp::BaParams & param_storage) {\n\n  std::vector<vw::CamPtr> optimized_cams;\n  std::vector<vw::Vector3> opt_cam_positions;\n  asp::calcOptimizedCameras(opt, param_storage, optimized_cams);\n  asp::calcCameraCenters(optimized_cams, opt_cam_positions);\n  int num_outliers_by_conv_angle = 0;\n\n  for (size_t ipt = 0; ipt < param_storage.num_points(); ipt++) {\n\n    if (cnet[ipt].type() == ControlPoint::GroundControlPoint)\n      continue; // don't filter out GCP\n    if (param_storage.get_point_outlier(ipt))\n      continue; // skip outliers\n    \n    // The GCC coordinate of this point\n    const double * point = param_storage.get_point_ptr(ipt);\n    Vector3 xyz(point[0], point[1], point[2]);\n    \n    // Control point\n    auto const& cp = cnet[ipt];\n    double max_angle = 0;\n    for (size_t j = 0; j < cp.size(); j++) {\n      size_t j_cam_id = cp[j].image_id();\n      vw::Vector3 P1 = opt_cam_positions[j_cam_id];\n      vw::Vector3 dir1 = xyz - P1;\n      if (norm_2(dir1) > 1e-8) \n        dir1 = normalize(dir1);\n      \n      for (size_t k = j + 1; k < cp.size(); k++) {\n        size_t k_cam_id = cp[k].image_id();\n        vw::Vector3 P2 = opt_cam_positions[k_cam_id];\n        vw::Vector3 dir2 = xyz - P2;\n        if (norm_2(dir2) > 1e-8) \n          dir2 = normalize(dir2);\n        \n        double angle = (180.0 / M_PI) * acos(dot_prod(dir1, dir2));\n        if (std::isnan(angle) || std::isinf(angle)) \n          continue;\n        max_angle = std::max(max_angle, angle);\n      }\n    }\n    \n    if (max_angle < opt.min_triangulation_angle) {\n      param_storage.set_point_outlier(ipt, true);\n      num_outliers_by_conv_angle++;\n    }\n    \n    if (opt.max_triangulation_angle > 0 && max_angle > opt.max_triangulation_angle) {\n      param_storage.set_point_outlier(ipt, true);\n      num_outliers_by_conv_angle++;\n    }\n  }\n  \n  int num_pts = param_storage.num_points();\n  vw::vw_out() << std::setprecision(4) \n               << \"Removed \" << num_outliers_by_conv_angle \n               << \" triangulated points out of \" << num_pts\n               << \" (\" << (100.0 * num_outliers_by_conv_angle) / num_pts << \"%)\" \n               << \" by ray convergence angle.\\n\";\n}\n\n// Add to the outliers based on the large residuals\nint add_to_outliers(vw::ba::ControlNetwork & cnet,\n                    asp::CRN const& crn,\n                    asp::BaParams & param_storage,\n                    asp::BaOptions const& opt,\n                    std::vector<size_t> const& cam_residual_counts,\n                    std::vector<std::map<int, vw::Vector2>> const& pixel_sigmas,\n                    size_t num_gcp_or_dem_residuals,\n                    size_t num_uncertainty_residuals,\n                    size_t num_tri_residuals,\n                    size_t num_cam_pos_residuals,\n                    std::vector<vw::Vector3> const& reference_vec,\n                    ceres::Problem &problem) {\n\n  vw_out() << \"Removing outliers.\\n\";\n\n  size_t num_points  = param_storage.num_points();\n  size_t num_cameras = param_storage.num_cameras();\n\n  // Compute the reprojection error. Adjust for residuals being divided by pixel sigma.\n  // Do not use the attenuated residuals due to the loss function.\n  std::vector<double> residuals;\n  asp::compute_residuals(opt, crn, param_storage,  cam_residual_counts, pixel_sigmas,\n                         num_gcp_or_dem_residuals, num_uncertainty_residuals,\n                         num_tri_residuals, num_cam_pos_residuals,\n                         reference_vec, problem,\n                         residuals); // output\n\n  // Compute the mean residual at each xyz, and how many times that residual is seen\n  std::vector<double> mean_residuals;\n  std::vector<int> num_point_observations;\n  asp::compute_mean_residuals_at_xyz(crn, residuals, param_storage,\n                                     mean_residuals, num_point_observations); // outputs\n\n  // The number of mean residuals is the same as the number of points,\n  // of which some are outliers. Hence need to collect only the\n  // non-outliers so far to be able to remove new outliers.  Need to\n  // follow the same logic as when residuals were formed. And also ignore GCP.\n  std::vector<double> actual_residuals;\n  std::set<int> was_added;\n  for (size_t icam = 0; icam < num_cameras; icam++) {\n    for (auto fiter = crn[icam].begin(); fiter != crn[icam].end(); fiter++) {\n\n      // The index of the 3D point\n      int ipt = (**fiter).m_point_id;\n\n      // skip existing outliers\n      if (param_storage.get_point_outlier(ipt))\n        continue;\n\n      // Skip gcp, those are never outliers no matter what.\n      if (cnet[ipt].type() == ControlPoint::GroundControlPoint)\n        continue;\n\n      // We already encountered this residual in the previous camera\n      if (was_added.find(ipt) != was_added.end())\n        continue;\n\n      was_added.insert(ipt);\n      actual_residuals.push_back(mean_residuals[ipt]);\n      //vw_out() << \"XYZ residual \" << ipt << \" = \" << mean_residuals[ipt] << std::endl;\n    }\n  } // End double loop through all the observations\n\n  double pct      = 1.0 - opt.remove_outliers_params[0]/100.0;\n  double factor   = opt.remove_outliers_params[1];\n  double max_pix1 = opt.remove_outliers_params[2];\n  double max_pix2 = opt.remove_outliers_params[3];\n\n  double b, e;\n  vw::math::find_outlier_brackets(actual_residuals, pct, factor, b, e);\n  vw_out() << \"Percentile-based outlier bounds: b = \" << b << \", e = \" << e << \".\\n\";\n\n  // If this is too aggressive, the user can tame it. It is\n  // unreasonable to throw out pixel residuals as small as 1 or 2\n  // pixels. We will not use the b, because the residuals start at 0.\n  // \"max_pix2\" sets the minimum error that can be thrown out.\n  e = std::min(std::max(e, max_pix1), max_pix2);\n\n  vw_out() << \"Removing as outliers points with mean reprojection error > \" << e << \".\\n\";\n\n  // Add to the outliers by reprojection error. Must repeat the same logic as above.\n  // TODO(oalexan1): This removes a 3D point altogether if any reprojection\n  // errors for it are big. Need to only remove bad reprojection errors\n  // and keep a 3D point if it is left with at least two reprojection residuals.\n  int num_outliers_by_reprojection = 0, total = 0;\n  for (size_t icam = 0; icam < num_cameras; icam++) {\n    typedef CameraNode<JFeature>::const_iterator crn_iter;\n    for (crn_iter fiter = crn[icam].begin(); fiter != crn[icam].end(); fiter++) {\n\n      // The index of the 3D point\n      int ipt = (**fiter).m_point_id;\n\n      total++;\n\n      // skip existing outliers\n      if (param_storage.get_point_outlier(ipt))\n        continue;\n\n      // Skip gcp\n      if (cnet[ipt].type() == ControlPoint::GroundControlPoint)\n        continue;\n\n      if (mean_residuals[ipt] > e) {\n        param_storage.set_point_outlier(ipt, true);\n        num_outliers_by_reprojection++;\n      }\n    }\n  } // End double loop through all the observations\n  vw_out() << \"Removed \" << num_outliers_by_reprojection << \" outliers out of \"\n           << total << \" interest points by reprojection error. Ratio: \"\n           << double(num_outliers_by_reprojection) / double(total) <<\".\\n\";\n\n  // Remove outliers by elevation limit\n  int num_outliers_by_elev_or_lonlat = 0;\n  if (opt.elevation_limit[0] < opt.elevation_limit[1] || !opt.lon_lat_limit.empty()) {\n\n    for (size_t ipt = 0; ipt < param_storage.num_points(); ipt++) {\n\n      if (cnet[ipt].type() == ControlPoint::GroundControlPoint)\n        continue; // don't filter out GCP\n      if (param_storage.get_point_outlier(ipt))\n        continue; // skip outliers\n\n      // The GCC coordinate of this point\n      const double * point = param_storage.get_point_ptr(ipt);\n      Vector3 xyz(point[0], point[1], point[2]);\n      Vector3 llh = opt.datum.cartesian_to_geodetic(xyz);\n      if (opt.elevation_limit[0] < opt.elevation_limit[1] &&\n          (llh[2] < opt.elevation_limit[0] ||\n           llh[2] > opt.elevation_limit[1])) {\n        param_storage.set_point_outlier(ipt, true);\n        num_outliers_by_elev_or_lonlat++;\n        continue;\n      }\n\n      Vector2 lon_lat = subvector(llh, 0, 2);\n      if (!opt.lon_lat_limit.empty() && !opt.lon_lat_limit.contains(lon_lat)) {\n        param_storage.set_point_outlier(ipt, true);\n        num_outliers_by_elev_or_lonlat++;\n        continue;\n      }\n\n    }\n    vw_out() << \"Removed \" << num_outliers_by_elev_or_lonlat\n             << \" outliers by elevation range and/or lon-lat range.\\n\";\n  }\n\n  // Remove outliers by convergence angle\n  if (opt.min_triangulation_angle > 0)\n    asp::filterOutliersByConvergenceAngle(opt, cnet, param_storage);\n\n  // Remove outliers based on spatial extent. Be more generous with\n  // leaving data in than what the input parameters suggest, because\n  // sometimes inliers in space need not be uniformly distributed.\n  double pct_factor = (3.0 + opt.remove_outliers_params[0]/100.0)/4.0; // e.g., 0.9375\n  double outlier_factor = 2 * opt.remove_outliers_params[1];           // e.g., 6.0.\n  std::vector<double> x_vals, y_vals, z_vals;\n  for (size_t ipt = 0; ipt < param_storage.num_points(); ipt++) {\n\n    if (cnet[ipt].type() == ControlPoint::GroundControlPoint)\n      continue; // don't filter out GCP\n    if (param_storage.get_point_outlier(ipt))\n      continue; // skip outliers\n\n    // The GCC coordinate of this point\n    const double * point = param_storage.get_point_ptr(ipt);\n    x_vals.push_back(point[0]);\n    y_vals.push_back(point[1]);\n    z_vals.push_back(point[2]);\n  }\n  vw::BBox3 estim_box;\n  asp::estimate_inliers_bbox(pct_factor, pct_factor, pct_factor,\n                             outlier_factor,\n                             x_vals, y_vals, z_vals,\n                             estim_box); // output\n\n  int num_box_outliers = 0;\n  for (size_t ipt = 0; ipt < param_storage.num_points(); ipt++) {\n\n    if (cnet[ipt].type() == ControlPoint::GroundControlPoint)\n      continue; // don't filter out GCP\n    if (param_storage.get_point_outlier(ipt))\n      continue; // skip outliers\n\n    // The GCC coordinate of this point\n    const double * point = param_storage.get_point_ptr(ipt);\n    Vector3 xyz(point[0], point[1], point[2]);\n    if (!estim_box.contains(xyz)) {\n      param_storage.set_point_outlier(ipt, true);\n      num_box_outliers++;\n    }\n  }\n\n  vw_out() << \"Removed \" << num_box_outliers << \" \"\n           << \"outlier(s) based on spatial distribution of triangulated points.\\n\";\n\n  // Remove GCP outliers\n  if (opt.max_gcp_reproj_err > 0) {\n    int num_gcp_outliers = 0;\n    for (size_t ipt = 0; ipt < param_storage.num_points(); ipt++) {\n      if (cnet[ipt].type() != ControlPoint::GroundControlPoint)\n        continue;\n      if (param_storage.get_point_outlier(ipt))\n        continue;\n      if (mean_residuals[ipt] > opt.max_gcp_reproj_err) {\n        param_storage.set_point_outlier(ipt, true);\n        num_gcp_outliers++;\n      }\n    }\n    vw_out() << \"Removed \" << num_gcp_outliers << \" GCPs with reprojection error > \"\n             << opt.max_gcp_reproj_err << \" pixels.\\n\";\n  }\n\n  int num_remaining_points = num_points - param_storage.get_num_outliers();\n\n  return num_outliers_by_reprojection + num_outliers_by_elev_or_lonlat;\n}\n\n// Filter GCP outliers based on mean reprojection error per triangulated point.\n// Adds to the existing outlier set (does not clear it).\nvoid filterGcpOutliers(vw::ba::ControlNetwork const& cnet,\n                       std::vector<double>    const& mean_residuals,\n                       double                        max_gcp_reproj_err,\n                       std::set<int>               & outliers) {\n\n  if (max_gcp_reproj_err <= 0)\n    return;\n\n  if (mean_residuals.size() != cnet.size())\n    vw_throw(ArgumentErr() << \"filterGcpOutliers: mean residuals size (\"\n             << mean_residuals.size() << \") does not match control network size (\"\n             << cnet.size() << \").\\n\");\n\n  int num_gcp_outliers = 0;\n  for (int ipt = 0; ipt < (int)cnet.size(); ipt++) {\n    if (cnet[ipt].type() != ControlPoint::GroundControlPoint)\n      continue;\n    if (outliers.find(ipt) != outliers.end())\n      continue;\n    if (mean_residuals[ipt] > max_gcp_reproj_err) {\n      outliers.insert(ipt);\n      num_gcp_outliers++;\n    }\n  }\n\n  vw_out() << \"Removed \" << num_gcp_outliers\n           << \" GCP outliers with mean reprojection error > \"\n           << max_gcp_reproj_err << \" pixels. \"\n           << \"These will be excluded from the next pass of optimization.\\n\";\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Camera/BundleAdjustOutliers.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file BundleAdjustOutliers.h\n///\n// Logic for handling outliers in bundle adjustment. \n\n#ifndef __BUNDLE_ADJUST_OUTLIERS_H__\n#define __BUNDLE_ADJUST_OUTLIERS_H__\n\n#include <asp/Core/BundleAdjustUtils.h>\n\n#include <map>\n#include <set>\n#include <string>\n\nnamespace ceres {\n  class Problem;\n}\n\nnamespace asp {\n\nclass BaBaseOptions;\nclass BaOptions;\nclass BaParams;\n\n// Update the set of outliers based on param_storage\nvoid updateOutliers(vw::ba::ControlNetwork const& cnet, \n                      asp::BaParams const& param_storage,\n                      std::set<int> & outliers);\n\n// Filter matches by projection window.\n// TODO(oalexan1): Use this in jitter_solve.\n// TODO(oalexan1): This needs to be done before subsampling the matches\nvoid filterOutliersProjWin(asp::BaBaseOptions          & opt,\n                           asp::BaParams               & param_storage, \n                           vw::ba::ControlNetwork const& cnet);\n\nvoid filterOutliersByConvergenceAngle(asp::BaBaseOptions const& opt,\n                                      vw::ba::ControlNetwork const& cnet,\n                                      asp::BaParams & param_storage);\n\n/// Add to the outliers based on the large residuals\nint add_to_outliers(vw::ba::ControlNetwork & cnet,\n                    asp::CRN const& crn,\n                    asp::BaParams & param_storage,\n                    asp::BaOptions const& opt,\n                    std::vector<size_t> const& cam_residual_counts,\n                    std::vector<std::map<int, vw::Vector2>> const& pixel_sigmas,\n                    size_t num_gcp_or_dem_residuals,\n                    size_t num_uncertainty_residuals,\n                    size_t num_tri_residuals,\n                    size_t num_cam_pos_residuals,\n                    std::vector<vw::Vector3> const& reference_vec,\n                    ceres::Problem &problem);\n\n// Filter GCP outliers based on mean reprojection error per triangulated point.\n// Adds to the existing outlier set (does not clear it).\n// Used by jitter_solve where outliers are tracked as std::set<int>.\nvoid filterGcpOutliers(vw::ba::ControlNetwork const& cnet,\n                       std::vector<double>    const& mean_residuals,\n                       double                        max_gcp_reproj_err,\n                       std::set<int>               & outliers);\n\n} // end namespace asp\n\n#endif // __BUNDLE_ADJUST_OUTLIERS_H__\n"
  },
  {
    "path": "src/asp/Camera/BundleAdjustResiduals.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file BundleAdjustResiduals.cc\n///\n\n// Logic for computing residuals for bundle adjustment. \n\n#include <asp/Camera/BundleAdjustResiduals.h>\n\n#include <vw/BundleAdjustment/ControlNetwork.h>\n#include <vw/BundleAdjustment/ControlNetworkLoader.h>\n#include <vw/Math/Functors.h>\n#include <vw/Math/Statistics.h>\n\n#include <string>\n\nusing namespace vw;\nusing namespace vw::camera;\nusing namespace vw::ba;\n\nnamespace  asp {\n\n// Compute the bundle_adjust residuals. Multiply the pixel residuals\n// by their sigmas, to get back the pixel reprojection errors.\nvoid compute_residuals(asp::BaBaseOptions const& opt,\n                       asp::CRN const& crn,\n                       asp::BaParams const& param_storage,\n                       std::vector<size_t> const& cam_residual_counts,\n                       std::vector<std::map<int, vw::Vector2>> const& pixel_sigmas,\n                       size_t num_gcp_or_dem_residuals,\n                       size_t num_uncertainty_residuals,\n                       size_t num_tri_residuals,\n                       size_t num_cam_position_residuals,\n                       std::vector<vw::Vector3> const& reference_vec,\n                       ceres::Problem & problem,\n                       // Output\n                       std::vector<double> & residuals) {\n\n  double cost = 0.0;\n  ceres::Problem::EvaluateOptions eval_options;\n  bool apply_loss_function = false; // must compute the actual residuals\n  eval_options.apply_loss_function = apply_loss_function;\n  if (opt.single_threaded_cameras)\n    eval_options.num_threads = 1; // ISIS must be single threaded!\n  else\n    eval_options.num_threads = opt.num_threads;\n\n  problem.Evaluate(eval_options, &cost, &residuals, 0, 0);\n  const size_t num_residuals = residuals.size();\n  \n  // Verify our book-keeping is correct\n  size_t num_expected_residuals\n    = (num_gcp_or_dem_residuals + num_tri_residuals) * param_storage.params_per_point();\n\n  size_t total_num_cam_params = param_storage.num_cameras()*param_storage.params_per_camera();\n\n  for (size_t i = 0; i < param_storage.num_cameras(); i++)\n    num_expected_residuals += cam_residual_counts[i]*PIXEL_SIZE;\n  if (opt.camera_weight > 0)\n    num_expected_residuals += total_num_cam_params;\n  if (opt.rotation_weight > 0)\n    num_expected_residuals += total_num_cam_params;\n  num_expected_residuals += num_uncertainty_residuals * asp::NUM_XYZ_PARAMS;\n  num_expected_residuals += reference_vec.size() * PIXEL_SIZE;\n  num_expected_residuals += num_cam_position_residuals * param_storage.params_per_camera();\n  \n  if (num_expected_residuals != num_residuals)\n    vw_throw(LogicErr() << \"Expected \" << num_expected_residuals\n                        << \" residuals but instead got \" << num_residuals);\n    \n  // Undo the division by pixel_sigma when computing the residuals, to get\n  // the pixel reprojection errors.\n  size_t residual_index = 0;\n  for (size_t icam = 0; icam < param_storage.num_cameras(); icam++) {\n    for (auto fiter = crn[icam].begin(); fiter != crn[icam].end(); fiter++) {\n\n      // The index of the 3D point\n      int ipt = (**fiter).m_point_id;\n\n      if (param_storage.get_point_outlier(ipt))\n        continue; // skip outliers\n        \n      // Look up the sigma for this point\n      auto sigma_it = pixel_sigmas[icam].find(ipt);\n      // Must have a sigma for each residual added\n      if (sigma_it == pixel_sigmas[icam].end())\n        vw_throw(LogicErr() << \"Could not find sigma for point \" \n                 << ipt << \" in camera \" << icam);\n      vw::Vector2 sigma = sigma_it->second;\n      residuals[residual_index+0] *= sigma[0];\n      residuals[residual_index+1] *= sigma[1];\n      residual_index += PIXEL_SIZE;\n    }\n  }\n    \n}\n\n/// Compute residual map by averaging all the reprojection error at a given point\nvoid compute_mean_residuals_at_xyz(asp::CRN const& crn,\n                                  std::vector<double> const& residuals,\n                                  asp::BaParams const& param_storage,\n                                  // outputs\n                                  std::vector<double> & mean_residuals,\n                                  std::vector<int>  & num_point_observations) {\n\n  mean_residuals.resize(param_storage.num_points());\n  num_point_observations.resize(param_storage.num_points());\n  \n  // Observation residuals are stored at the beginning of the residual vector in the \n  // same order they were originally added to Ceres.\n  \n  size_t residual_index = 0;\n  // Double loop through cameras and crn entries will give us the correct order\n  for (size_t icam = 0; icam < param_storage.num_cameras(); icam++) {\n    for (auto fiter = crn[icam].begin(); fiter != crn[icam].end(); fiter++) {\n\n      // The index of the 3D point\n      int ipt = (**fiter).m_point_id;\n\n      if (param_storage.get_point_outlier(ipt))\n        continue; // skip outliers\n\n      // Get the residual norm for this observation\n      double errorX         = residuals[residual_index];\n      double errorY         = residuals[residual_index+1];\n      double residual_error = norm_2(vw::Vector2(errorX, errorY));\n      residual_index += PIXEL_SIZE;\n\n      // Update information for this point\n      num_point_observations[ipt] += 1;\n      mean_residuals        [ipt] += residual_error;\n    }\n  } // End double loop through all the observations\n\n  // Do the averaging\n  for (size_t i = 0; i < param_storage.num_points(); i++) {\n    if (param_storage.get_point_outlier(i)) {\n      // Skip outliers. But initialize to something.\n      mean_residuals        [i] = std::numeric_limits<double>::quiet_NaN();\n      num_point_observations[i] = std::numeric_limits<int>::quiet_NaN();\n      continue;\n    }\n    mean_residuals[i] /= static_cast<double>(num_point_observations[i]);\n  }\n  \n} // End function compute_mean_residuals_at_xyz\n  \n// Write out a .csv file recording the residual error at each location on the ground\n// TODO(oalexan1): Integrate with write_per_xyz_residuals().\nvoid write_residual_map(std::string const& output_prefix,\n                        // Mean residual of each point\n                        std::vector<double> const& mean_residuals,\n                        // Num non-outlier pixels per point\n                        std::vector<int> const& num_point_observations, \n                        asp::BaParams const& param_storage,\n                        vw::ba::ControlNetwork const& cnet,\n                        asp::BaBaseOptions const& opt) {\n\n  std::string output_path = output_prefix + \".csv\";\n\n  if (opt.datum.name() == asp::UNSPECIFIED_DATUM) {\n    vw_out(WarningMessage) \n      << \"No datum specified, cannot write file: \" << output_path << \". \"\n      << \"Specify: '--datum <planet name>'.\\n\";\n    return;\n  }\n  if (mean_residuals.size() != param_storage.num_points())\n    vw_throw(LogicErr() << \"Point count mismatch in write_residual_map().\\n\");\n\n  if (cnet.size() != param_storage.num_points()) \n    vw_throw(LogicErr()\n              << \"The number of stored points \"\n              << \"does not agree with number of points in cnet.\\n\");\n  \n  // Open the output file and write the header\n  vw_out() << \"Writing: \" << output_path << std::endl;\n  std::ofstream file;\n  file.open(output_path.c_str());\n  file.precision(17);\n  file << \"# lon, lat, height_above_datum, mean_residual, num_observations\\n\";\n\n  // stereo_gui counts on being able to parse the datum from this file, so\n  // do not modify the line below.\n  file << \"# \" << opt.datum << std::endl;\n  \n  // Now write all the points to the file\n  for (size_t i = 0; i < param_storage.num_points(); i++) {\n\n    if (param_storage.get_point_outlier(i))\n      continue; // skip outliers\n    \n      // The final GCC coordinate of this point\n      const double * point = param_storage.get_point_ptr(i);\n      Vector3 xyz(point[0], point[1], point[2]);\n\n      Vector3 llh = opt.datum.cartesian_to_geodetic(xyz);\n\n      std::string comment = \"\";\n      if (cnet[i].type() == ControlPoint::GroundControlPoint)\n        comment = \" # GCP\";\n      else if (cnet[i].type() == ControlPoint::PointFromDem)\n        comment = \" # from DEM\";\n      \n      file << llh[0] <<\", \"<< llh[1] <<\", \"<< llh[2] <<\", \"<< mean_residuals[i] <<\", \"\n           << num_point_observations[i] << comment << std::endl;\n  }\n  file.close();\n\n} // End function write_residual_map\n\n// This is used in jitter_solve. There can be more tri points than in cnet,\n// because we add anchor points. Those do not get processed here.\n// TODO(oalexan1): Integrate with write_residual_map().\nvoid write_per_xyz_pixel_residuals(vw::ba::ControlNetwork const& cnet,\n                                   std::string            const& residual_prefix,\n                                   vw::cartography::Datum const& datum,\n                                   std::set<int>          const& outliers,\n                                   std::vector<double>    const& tri_points_vec,\n                                   std::vector<double>    const& mean_pixel_residual_norm,\n                                   std::vector<int>       const& pixel_residual_count) {\n    \n  std::string map_prefix = residual_prefix + \"_pointmap\";\n  std::string output_path = map_prefix + \".csv\";\n\n  int num_tri_points = cnet.size();\n  \n  // Open the output file and write the header. TODO(oalexan1): See\n  // if it is possible to integrate this with the analogous\n  // bundle_adjust function.\n  vw_out() << \"Writing: \" << output_path << std::endl;\n\n  std::ofstream file;\n  file.open(output_path.c_str());\n  file.precision(17);\n  file << \"# lon, lat, height_above_datum, mean_residual, num_observations\\n\";\n  file << \"# \" << datum << std::endl;\n\n  // Write all the points to the file\n  for (int ipt = 0; ipt < num_tri_points; ipt++) {\n\n    if (outliers.find(ipt) != outliers.end() || pixel_residual_count[ipt] <= 0)\n      continue; // Skip outliers\n    \n    // The final GCC coordinate of this point\n    const double * tri_point = &tri_points_vec[0] + ipt * NUM_XYZ_PARAMS;\n    Vector3 xyz(tri_point[0], tri_point[1], tri_point[2]);\n    Vector3 llh = datum.cartesian_to_geodetic(xyz);\n    \n    std::string comment = \"\";\n    if (cnet[ipt].type() == vw::ba::ControlPoint::GroundControlPoint)\n      comment = \" # GCP\";\n    else if (cnet[ipt].type() == vw::ba::ControlPoint::PointFromDem)\n      comment = \" # from DEM\";\n      \n    file << llh[0] << \", \" << llh[1] <<\", \" << llh[2] << \", \"\n         << mean_pixel_residual_norm[ipt] << \", \"\n         << pixel_residual_count[ipt] << comment << std::endl;\n  }\n  file.close();\n}\n\n// This is used in jitter_solve\nvoid write_anchor_residuals(std::string              const& residual_prefix,\n                            vw::cartography::Datum   const& datum,\n                            std::vector<vw::Vector3> const& anchor_xyz,\n                            std::vector<double>      const& anchor_residual_norm) {\n  \n  std::string map_prefix = residual_prefix + \"_anchor_points\";\n  std::string output_path = map_prefix + \".csv\";\n  vw_out() << \"Writing: \" << output_path << std::endl;\n  std::ofstream file;\n  file.open(output_path.c_str());\n  file.precision(17);\n  file << \"# lon, lat, height_above_datum, anchor_residual_pixel_norm\\n\";\n  file << \"# \" << datum << std::endl;\n\n  for (size_t anchor_it = 0; anchor_it < anchor_xyz.size(); anchor_it++) {\n    Vector3 llh = datum.cartesian_to_geodetic(anchor_xyz[anchor_it]);\n    file << llh[0] <<\", \"<< llh[1] << \", \" << llh[2] << \", \"\n         << anchor_residual_norm[anchor_it] << std::endl;\n  }\n  \n  file.close();\n}\n\n/// Write log files describing all residual errors. The order of data stored\n/// in residuals must mirror perfectly the way residuals were created. \nvoid write_residual_logs(std::string const& residual_prefix, \n                         asp::BaBaseOptions const& opt,\n                         asp::BaParams const& param_storage,\n                         std::vector<size_t> const& cam_residual_counts,\n                         std::vector<std::map<int, vw::Vector2>> const& pixel_sigmas,\n                         size_t num_gcp_or_dem_residuals,\n                         size_t num_uncertainty_residuals,\n                         size_t num_tri_residuals,\n                         size_t num_cam_position_residuals,\n                         std::vector<vw::Vector3> const& reference_vec,\n                         vw::ba::ControlNetwork const& cnet, \n                         asp::CRN const& crn, \n                         ceres::Problem &problem) {\n\n  std::vector<double> residuals;\n  asp::compute_residuals(opt, crn, param_storage,\n                    cam_residual_counts, pixel_sigmas,\n                    num_gcp_or_dem_residuals, \n                    num_uncertainty_residuals,\n                    num_tri_residuals, num_cam_position_residuals,\n                    reference_vec, problem,\n                    // Output\n                    residuals);\n    \n  const size_t num_residuals = residuals.size();\n\n  const std::string residual_path               = residual_prefix + \"_stats.txt\";\n  const std::string residual_raw_pixels_path    = residual_prefix + \"_raw_pixels.txt\";\n  const std::string residual_reference_xyz_path = residual_prefix + \"_reference_terrain.txt\";\n\n  // Write a report on residual errors\n  std::ofstream residual_file, residual_file_raw_pixels, residual_file_reference_xyz;\n  vw_out() << \"Writing: \" << residual_path << std::endl;\n  vw_out() << \"Writing: \" << residual_raw_pixels_path << std::endl;\n  \n  residual_file.open(residual_path.c_str());\n  residual_file.precision(17);\n  residual_file_raw_pixels.open(residual_raw_pixels_path.c_str());\n  residual_file_raw_pixels.precision(17);\n\n  if (reference_vec.size() > 0) {\n    vw_out() << \"Writing: \" << residual_reference_xyz_path << std::endl;\n    residual_file_reference_xyz.open(residual_reference_xyz_path.c_str());\n    residual_file_reference_xyz.precision(17);\n  }\n  \n  size_t index = 0;\n  // For each camera, average together all the point observation residuals\n  residual_file << \"# Pixel reprojection error per camera\\n\";\n  residual_file << \"# Image, mean, median, count\\n\";\n  for (size_t c = 0; c < param_storage.num_cameras(); c++) {\n    size_t num_this_cam_residuals = cam_residual_counts[c];\n    \n    // Write header for the raw file\n    std::string name = opt.image_files[c];\n    residual_file_raw_pixels << name << \", \" << num_this_cam_residuals << std::endl;\n\n    // All residuals are for inliers, as we do not even add a residual\n    // for an outlier\n    \n    double mean_residual = 0; // Take average of all pixel coord errors\n    std::vector<double> residual_norms;\n    for (size_t i = 0; i < num_this_cam_residuals; i++) {\n      double ex = residuals[index]; index++;\n      double ey = residuals[index]; index++;\n      double residual_norm = std::sqrt(ex * ex + ey * ey);\n      mean_residual += residual_norm;\n      residual_norms.push_back(residual_norm);\n      residual_file_raw_pixels << ex << \", \" << ey << std::endl;\n    }\n    // Write line for the summary file\n    mean_residual /= static_cast<double>(num_this_cam_residuals);\n    double median_residual = std::numeric_limits<double>::quiet_NaN();\n    if (residual_norms.size() > 0) {\n      std::sort(residual_norms.begin(), residual_norms.end());\n      median_residual = residual_norms[residual_norms.size()/2];\n    }\n    \n    residual_file << name                   << \", \"\n                  << mean_residual          << \", \"\n                  << median_residual        << \", \"\n                  << num_this_cam_residuals << std::endl;\n  }\n  \n  residual_file_raw_pixels.close();\n  residual_file.close();\n  \n  // Go through the GCP residuals\n  if (num_gcp_or_dem_residuals > 0) {\n    for (size_t i = 0; i < num_gcp_or_dem_residuals; i++) {\n      double mean_residual = 0; // Take average of XYZ error for each point\n      for (size_t j = 0; j < param_storage.params_per_point(); j++) {\n        mean_residual += fabs(residuals[index]);\n        index++;\n      }\n      mean_residual /= static_cast<double>(param_storage.params_per_point());\n    }\n  }\n  \n  // List the camera weight residuals\n  int num_passes = int(opt.camera_weight > 0) +\n    int(opt.rotation_weight > 0);\n  for (int pass = 0; pass < num_passes; pass++) {\n    const size_t part_size = param_storage.params_per_camera()/2;\n    for (size_t c = 0; c < param_storage.num_cameras(); c++) {\n      // Separately compute the mean position and rotation error\n      double mean_residual_pos = 0, mean_residual_rot = 0;\n      for (size_t j = 0; j < part_size; j++) {\n        mean_residual_pos += fabs(residuals[index]);\n        index++;\n      }\n      for (size_t j = 0; j < part_size; j++) {\n        mean_residual_rot += fabs(residuals[index]);\n        index++;\n      }\n      mean_residual_pos /= static_cast<double>(part_size);\n      mean_residual_rot /= static_cast<double>(part_size);\n    }\n  }\n\n  // Keep track of number of camera uncertainty residuals but don't save those\n  index += num_uncertainty_residuals * asp::NUM_XYZ_PARAMS;\n\n  // List residuals for matching input terrain (lidar)\n  if (reference_vec.size() > 0) {\n    residual_file << \"reference terrain residual errors:\\n\";\n    residual_file_reference_xyz << \"# lon, lat, height_above_datum, pixel_error_norm\\n\";\n    for (size_t i = 0; i < reference_vec.size(); i++) {\n\n      Vector3 llh = opt.datum.cartesian_to_geodetic(reference_vec[i]);\n      double err = norm_2(Vector2(residuals[index], residuals[index + 1]));\n\n      // Divide back the residual by the multiplier weight\n      if (opt.reference_terrain_weight > 0) \n        err /= opt.reference_terrain_weight;\n      \n      index += PIXEL_SIZE;\n      residual_file_reference_xyz << llh[0] << \", \" << llh[1] << \", \" << llh[2] << \", \"\n                                  << err << \"\\n\";\n      residual_file << i << \", \" << err << \"\\n\";\n      \n    }\n    residual_file_reference_xyz.close();\n  }\n\n  // Keep track of number of triangulation constraint residuals but don't save those\n  index += asp::PARAMS_PER_POINT * num_tri_residuals;\n  index +=  param_storage.params_per_camera() * num_cam_position_residuals;\n  \n  if (index != num_residuals)\n    vw_throw( LogicErr() << \"Have \" << num_residuals << \" residuals, but iterated through \"\n              << index);\n\n  // Generate the location based file\n  std::string map_prefix = residual_prefix + \"_pointmap\";\n  std::vector<double> mean_residuals;\n  std::vector<int> num_point_observations;\n  compute_mean_residuals_at_xyz(crn, residuals, param_storage,\n                                mean_residuals, num_point_observations);\n\n  write_residual_map(map_prefix, mean_residuals, num_point_observations,\n                     param_storage, cnet, opt);\n\n} // End function write_residual_logs\n\n// Find the offsets between initial and final triangulated points\n// TODO(oalexan1): Copy the data from param storage, then\n// use the 2nd function called saveTriOffsetsPerCamera instead\n// to reduce code duplication.\nvoid saveTriOffsetsPerCamera(std::vector<std::string> const& image_files,\n                             asp::BaParams const& orig_params,\n                             asp::BaParams const& param_storage,\n                             asp::CRN const& crn,\n                             std::string const& tri_offsets_file) {\n\n  // Number of cameras and points\n  int num_cams = param_storage.num_cameras();\n  int num_points = param_storage.num_points();\n  \n  // Need to have a vector of vectors, one for each camera\n  std::vector<std::vector<double>> tri_offsets(num_cams);\n  \n  for (int icam = 0; icam < num_cams; icam++) {\n    \n    for (auto fiter = crn[icam].begin(); fiter != crn[icam].end(); fiter++) {\n\n      // The index of the 3D point\n      int ipt = (**fiter).m_point_id;\n  \n      // Sanity check\n      if (ipt < 0 || ipt >= num_points)\n        vw_throw(LogicErr() << \"Invalid point index \" << ipt \n                 << \" in saveTriOffsetsPerCamera().\\n\");\n        \n      if (param_storage.get_point_outlier(ipt))\n        continue; // skip outliers\n      \n      // Initial ECEF triangulated point\n      double const* orig_point = orig_params.get_point_ptr(ipt);\n      vw::Vector3 initial_xyz(orig_point[0], orig_point[1], orig_point[2]);\n      \n      // Optimized ECEF triangulated point\n      double const* point = param_storage.get_point_ptr(ipt);\n      vw::Vector3 final_xyz(point[0], point[1], point[2]);\n     \n      // Append the norm of offset\n      tri_offsets[icam].push_back(norm_2(final_xyz - initial_xyz));   \n    }\n  }\n  \n  asp::writeTriOffsetsPerCamera(num_cams, image_files, tri_offsets, tri_offsets_file);\n}\n\n// Analogous version to the above, but keep the original and current triangulated points\n// in std<vector>, for use in jitter_solve. Note that tri_points_vec may have\n// anchor points later on, but we don't get to them.\nvoid saveTriOffsetsPerCamera(std::vector<std::string> const& image_files,\n                             std::set<int>            const& outliers,\n                             std::vector<double>      const& orig_tri_points_vec,\n                             std::vector<double>      const& tri_points_vec, \n                             asp::CRN                const& crn,\n                             std::string const& tri_offsets_file) {\n\n  if (orig_tri_points_vec.size() != tri_points_vec.size())\n    vw_throw(ArgumentErr() << \"Expecting the same number of original and current 3D \"\n                           << \"points.\\n\");\n\n  // Number of cameras and points\n  int num_cams = image_files.size();\n  int num_points = orig_tri_points_vec.size()/3;\n  \n  // Need to have a vector of vectors, one for each camera\n  std::vector<std::vector<double>> tri_offsets(num_cams);\n\n  for (int icam = 0; icam < num_cams; icam++) {\n    \n    for (auto fiter = crn[icam].begin(); fiter != crn[icam].end(); fiter++) {\n\n      // The index of the 3D point\n      int ipt = (**fiter).m_point_id;\n  \n      // Sanity check\n      if (ipt < 0 || ipt >= num_points)\n        vw::vw_throw(vw::LogicErr() << \"Invalid point index \" << ipt \n                 << \" in saveTriOffsetsPerCamera().\\n\");\n        \n      if (outliers.find(ipt) != outliers.end())\n        continue; // Skip outliers\n      \n      // Initial and optimized ECEF triangulated points\n      double const* orig_point = &orig_tri_points_vec[3*ipt];\n      double const* point      = &tri_points_vec[3*ipt];\n\n      vw::Vector3 initial_xyz(orig_point[0], orig_point[1], orig_point[2]);      \n      vw::Vector3 final_xyz(point[0], point[1], point[2]);\n     \n      // Append the norm of offset\n      tri_offsets[icam].push_back(norm_2(final_xyz - initial_xyz));   \n    }\n  }\n  \n  asp::writeTriOffsetsPerCamera(num_cams, image_files, tri_offsets, tri_offsets_file);\n}\n\n// Write the offsets between initial and final triangulated points\nvoid writeTriOffsetsPerCamera(int num_cams,\n                              std::vector<std::string> const& image_files,\n                              std::vector<std::vector<double>> & tri_offsets,\n                              std::string const& tri_offsets_file) {\n  \n  // Write to disk with 8 digits of precision\n  vw::vw_out() << \"Writing: \" << tri_offsets_file << std::endl;\n  std::ofstream ofs(tri_offsets_file.c_str());\n  ofs.precision(8);\n  ofs << \"# Per-image offsets between initial and final triangulated points (meters)\\n\";\n  ofs << \"# Image mean median count\\n\";\n  \n  // Iterate through the cameras\n  double nan = std::numeric_limits<double>::quiet_NaN();\n  for (int icam = 0; icam < num_cams; icam++) {\n    auto & offsets = tri_offsets[icam];\n    double mean = nan, median = nan, count = 0;\n    if (!offsets.empty()) {\n      mean = vw::math::mean(offsets);\n      median = vw::math::destructive_median<double>(offsets);\n      count = offsets.size();\n    }\n    ofs << image_files[icam] << \" \" << mean << \" \" << median << \" \" << count << \"\\n\";  \n  }\n  ofs.close();\n}\n\n// Compute the horizontal and vertical change in camera positions\nvoid saveCameraOffsets(vw::cartography::Datum   const& datum,\n                       std::vector<std::string> const& image_files,\n                       std::vector<vw::Vector3> const& orig_cam_positions,\n                       std::vector<vw::Vector3> const& opt_cam_positions,\n                       std::string              const& camera_offset_file) {\n  \n  // Sanity check for the sizes\n  if (orig_cam_positions.size() != opt_cam_positions.size())\n    vw_throw(ArgumentErr() \n      << \"Expecting the same number of original and optimized camera positions.\\n\");\n\n  vw::vw_out() << \"Writing: \" << camera_offset_file << std::endl;\n  std::ofstream ofs(camera_offset_file.c_str());\n  ofs.precision(8);\n  ofs << \"# Per-image absolute horizontal and vertical change in camera center (meters)\\n\";\n  \n  // Loop through the cameras and find the change in their centers\n  for (size_t icam = 0; icam < orig_cam_positions.size(); icam++) {\n    vw::Vector3 orig_ctr = orig_cam_positions[icam];\n    vw::Vector3 opt_ctr  = opt_cam_positions [icam];\n    \n    vw::Vector3 llh = datum.cartesian_to_geodetic(orig_ctr);\n    vw::Matrix3x3 NedToEcef = datum.lonlat_to_ned_matrix(llh);\n    vw::Matrix3x3 EcefToNed = vw::math::inverse(NedToEcef);\n    vw::Vector3 NedDir = EcefToNed * (opt_ctr - orig_ctr);\n    \n    // Find horizontal and vertical change\n    double horiz_change = norm_2(subvector(NedDir, 0, 2));\n    double vert_change  = std::abs(NedDir[2]);\n    \n    ofs << image_files[icam] << \" \" << horiz_change << \" \" << vert_change << \"\\n\";\n  }\n  ofs.close();\n\n  return;\n}\n\n// Compute the horizontal and vertical change in camera positions. If more than \n// one camera position, such as for linescan, find the biggest.\nvoid saveCameraOffsets(vw::cartography::Datum                const& datum,\n                       std::vector<std::string>              const& image_files,\n                       std::vector<std::vector<vw::Vector3>> const& orig_cam_positions,\n                       std::vector<std::vector<vw::Vector3>> const& opt_cam_positions,\n                       std::string                           const& camera_offset_file) {\n\n  vw::vw_out() << \"Writing: \" << camera_offset_file << \"\\n\";\n  std::ofstream ofs(camera_offset_file.c_str());\n  ofs.precision(8);\n  ofs << \"# Per-image absolute horizontal and vertical change in camera center (meters)\\n\";\n  \n  // Sanity check that the sizes are the same\n  if (orig_cam_positions.size() != opt_cam_positions.size())\n    vw::vw_throw(vw::ArgumentErr() \n      << \"Expecting the same number of original and optimized camera positions.\\n\");\n\n  // Loop through the cameras and find the change in their centers\n  for (size_t icam = 0; icam < orig_cam_positions.size(); icam++) {\n\n    auto const& orig_ctrs = orig_cam_positions[icam];\n    auto const& opt_ctrs  = opt_cam_positions[icam];\n    \n    if (orig_ctrs.size() != opt_ctrs.size())\n      vw::vw_throw(vw::ArgumentErr() \n        << \"Expecting the same number of original and optimized camera centers.\\n\");\n\n    // Iterate over the camera centers\n    double horiz_change = 0.0, vert_change = 0.0;\n    for (size_t i = 0; i < orig_ctrs.size(); i++) {\n      vw::Vector3 orig_ctr = orig_ctrs[i];\n      vw::Vector3 opt_ctr  = opt_ctrs[i];\n      \n      // Convert to geodetic\n      vw::Vector3 llh = datum.cartesian_to_geodetic(orig_ctr);\n      vw::Matrix3x3 NedToEcef = datum.lonlat_to_ned_matrix(llh);\n      vw::Matrix3x3 EcefToNed = vw::math::inverse(NedToEcef);\n      vw::Vector3 NedDir = EcefToNed * (opt_ctr - orig_ctr);\n    \n      // Find horizontal and vertical change\n      horiz_change = std::max(horiz_change, norm_2(subvector(NedDir, 0, 2)));\n      vert_change  = std::max(vert_change,  std::abs(NedDir[2]));\n    }\n\n    ofs << image_files[icam] << \" \" << horiz_change << \" \" << vert_change << \"\\n\";\n  }\n  \n  ofs.close();\n\n  return;\n}\n\n// This is used in jitter_solve\nvoid compute_residuals(asp::BaBaseOptions const& opt,\n                       ceres::Problem & problem,\n                       // Output\n                       std::vector<double> & residuals) {\n\n  double cost = 0.0;\n  ceres::Problem::EvaluateOptions eval_options;\n  eval_options.apply_loss_function = false;\n  if (opt.single_threaded_cameras)\n    eval_options.num_threads = 1; // ISIS must be single threaded!\n  else\n    eval_options.num_threads = opt.num_threads;\n  \n  problem.Evaluate(eval_options, &cost, &residuals, 0, 0);\n}\n\n// Residuals for option --reference-terrain\nvoid writeRefTerrainResiduals(std::string                   const& residual_prefix,\n                              vw::cartography::Datum        const& datum,\n                              std::vector<double>           const&  residuals,\n                              std::vector<double>           const& weight_per_residual,\n                              std::vector<vw::Vector3>      const& reference_vec,\n                              std::vector<std::vector<int>> const& ref_indices) {\n\n  // Sanity checks\n  if (residuals.size() != weight_per_residual.size()) \n    vw_throw(ArgumentErr() << \"There must be as many residuals as weights for them.\\n\");\n  if (ref_indices.size() != reference_vec.size())\n    vw_throw(ArgumentErr() << \"Expecting as many indices as reference points.\\n\");\n    \n  std::string map_prefix = residual_prefix + \"_ref_terrain\";\n  std::string output_path = map_prefix + \".csv\";\n\n  // Open the output file and write the header. TODO(oalexan1): See\n  // if it is possible to integrate this with the analogous\n  // bundle_adjust function.\n  vw_out() << \"Writing: \" << output_path << std::endl;\n\n  std::ofstream file;\n  file.open(output_path.c_str());\n  file.precision(17);\n  file << \"# lon, lat, height_above_datum, mean_residual, num_observations\\n\";\n  file << \"# \" << datum << std::endl;\n\n  int num_ref_points = reference_vec.size();\n  \n  // Write all the points to the file\n  for (int ipt = 0; ipt < num_ref_points; ipt++) {\n\n    // Skip if no indices\n    if (ref_indices[ipt].empty())\n      continue;\n    \n    double res = 0.0, count = 0.0;      \n    \n    // Iterate over the indices\n    for (int i = 0; i < (int)ref_indices[ipt].size(); i++) {\n      int ires = ref_indices[ipt][i];\n      \n      // ires + 1 must be less than residuals.size()\n      if (ires + 1 >= (int)residuals.size())\n        vw_throw(ArgumentErr() << \"Invalid residual index.\\n\");\n      \n      // There are two residuals per point, as this is a pixel residual. Each\n      // residual must be divided by its weight which was added when the\n      // residual was created.   \n      double norm = norm_2(Vector2(residuals[ires + 0] / weight_per_residual[ires + 0],\n                                   residuals[ires + 1] / weight_per_residual[ires + 1]));\n      res += norm;\n      count += 1.0;\n    }\n    \n    // Skip if no residuals\n    if (count == 0.0)\n      continue;\n      \n    // Average the residuals\n    res /= count;\n    \n    // Save lon, lat, height, mean residual, count\n    Vector3 llh = datum.cartesian_to_geodetic(reference_vec[ipt]);\n    file << llh[0] << \", \" << llh[1] <<\", \" << llh[2] << \", \"\n         << res << \", \" << count << \"\\n\";\n\n  }\n  file.close();\n\n  return;\n} // End function writeRefTerrainResiduals()\n\n// Save the pixel reprojection error and anchor point residuals for the jitter solver.\n// Here we count on the fact that they are at the beginning of the residuals vector,\n// and we go through them in the same order as they were added.\nvoid saveJitterResiduals(ceres::Problem                             & problem,\n                         std::string                           const& residual_prefix,\n                         asp::BaBaseOptions                    const& opt,\n                         vw::ba::ControlNetwork                const& cnet,\n                         asp::CRN                             const& crn,\n                         vw::cartography::Datum                const& datum,\n                         std::vector<double>                   const& tri_points_vec,\n                         std::set<int>                         const& outliers,\n                         std::vector<double>                   const& weight_per_residual,\n                         std::vector<std::vector<vw::Vector2>> const& pixel_vec,\n                         std::vector<std::vector<double>>      const& weight_vec,\n                         std::vector<std::vector<int>>         const& isAnchor_vec,\n                         std::vector<std::vector<int>>         const& pix2xyz_index,\n                         std::vector<vw::Vector3>              const& reference_vec,\n                         std::vector<std::vector<int>>         const& ref_indices,\n                         // Output\n                         std::vector<double>                        & mean_pixel_residuals) {\n\n  // Compute the residuals at the current solution\n  std::vector<double> residuals;\n  compute_residuals(opt, problem, residuals);\n  if (residuals.size() != weight_per_residual.size()) \n    vw_throw(ArgumentErr() << \"There must be as many residuals as weights for them.\\n\");\n\n  //  Find the mean of all residuals corresponding to the same xyz point\n  int num_tri_points = cnet.size();\n  std::vector<double> mean_pixel_residual_norm(num_tri_points, 0.0);\n  std::vector<int>    pixel_residual_count(num_tri_points, 0);\n  std::vector<double> xyz_residual_norm; // This is unfinished logic\n  \n  int ires = 0;\n  int num_cams = crn.size();\n  std::vector<std::vector<double>> residuals_per_cam(num_cams);\n  for (int icam = 0; icam < crn.size(); icam++) {\n    for (auto fiter = crn[icam].begin(); fiter != crn[icam].end(); fiter++) {\n      \n      // The index of the 3D point\n      int ipt = (**fiter).m_point_id;\n      \n      if (outliers.find(ipt) != outliers.end())\n        continue; // Skip outliers\n\n      // Norm of pixel residual\n      double norm = norm_2(Vector2(residuals[ires + 0] / weight_per_residual[ires + 0],\n                                   residuals[ires + 1] / weight_per_residual[ires + 1]));\n\n      mean_pixel_residual_norm[ipt] += norm;\n      pixel_residual_count[ipt]++;\n      \n      // Record the residual for the camera\n      residuals_per_cam[icam].push_back(norm);\n      \n      ires += PIXEL_SIZE; // Update for the next iteration\n    }\n  }\n\n  // Average all pixel residuals for a given xyz\n  for (int ipt = 0; ipt < num_tri_points; ipt++) {\n    if (outliers.find(ipt) != outliers.end() || pixel_residual_count[ipt] <= 0)\n      continue; // Skip outliers\n    mean_pixel_residual_norm[ipt] /= pixel_residual_count[ipt];\n  }\n  \n  // Find the mean and median residual for each camera. This a very important\n  // metric.\n  std::string residual_path = residual_prefix + \"_stats.txt\";\n  vw::vw_out() << \"Writing: \" << residual_path << std::endl;\n  std::ofstream residual_file(residual_path.c_str());\n  residual_file.precision(17);\n  residual_file << \"# Pixel reprojection error per camera\\n\";\n  residual_file << \"# Image, mean, median, count\\n\";\n  for (int icam = 0; icam < num_cams; icam++) {\n    std::string name = opt.image_files[icam];\n    double nan = std::numeric_limits<double>::quiet_NaN();\n    double mean = nan, median = nan, count = nan;\n    if (!residuals_per_cam[icam].empty()) {\n      mean   = vw::math::mean(residuals_per_cam[icam]);\n      median = vw::math::destructive_median(residuals_per_cam[icam]);\n      count  = residuals_per_cam[icam].size();\n    }\n    residual_file << name   << \", \" << mean   << \", \" << median << \", \" << count  << \"\\n\";\n  }\n  residual_file.close();\n\n  // Save the residuals per xyz point\n  write_per_xyz_pixel_residuals(cnet, residual_prefix, datum, outliers,  \n                                tri_points_vec, mean_pixel_residual_norm,  \n                                pixel_residual_count);\n\n  // Add residuals for anchor points. That is pass 1 from\n  // addReprojCamErrs(). We imitate here the same logic for that\n  // pass. We continue to increment the ires counter from above.\n  std::vector<Vector3> anchor_xyz;\n  std::vector<double> anchor_residual_norm;\n  for (int pass = 1; pass < 2; pass++) {\n    for (int icam = 0; icam < (int)crn.size(); icam++) {\n      for (size_t ipix = 0; ipix < pixel_vec[icam].size(); ipix++) {\n\n        Vector2 observation =  pixel_vec[icam][ipix];\n        double weight = weight_vec[icam][ipix];\n        bool isAnchor = isAnchor_vec[icam][ipix];\n\n        // Pass 0 is without anchor points, while pass 1 uses them.\n        // Here we only do pass 1.\n        if ((int)isAnchor != pass) \n          continue;\n\n        // Norm of pixel residual\n        double norm = norm_2(Vector2(residuals[ires + 0] / weight_per_residual[ires + 0],\n                                     residuals[ires + 1] / weight_per_residual[ires + 1]));\n        norm /= weight; // Undo the weight, to recover the pixel norm\n        \n        ires += PIXEL_SIZE; // Update for the next iteration\n\n        double const* tri_point = &tri_points_vec[3 * pix2xyz_index[icam][ipix]];\n        Vector3 xyz(tri_point[0], tri_point[1], tri_point[2]);\n        anchor_xyz.push_back(xyz);\n        anchor_residual_norm.push_back(norm);\n      }\n    }\n  }\n  write_anchor_residuals(residual_prefix, datum, anchor_xyz, anchor_residual_norm);\n  \n  // Ensure we did not process more residuals than what we have.\n  // Likely there are more residuals than what we handled now.\n  if (ires > (int)residuals.size())\n    vw_throw(ArgumentErr() << \"More residuals found than expected.\\n\");\n\n  if (opt.reference_terrain != \"\")\n    writeRefTerrainResiduals(residual_prefix, datum,\n                             residuals, weight_per_residual,\n                             reference_vec, ref_indices);\n\n  // Return the mean pixel residual per tri point\n  mean_pixel_residuals = mean_pixel_residual_norm;\n}\n\n} // end namespace asp \n"
  },
  {
    "path": "src/asp/Camera/BundleAdjustResiduals.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file BundleAdjustResiduals.h\n///\n// Logic for computing residuals for bundle adjustment. \n\n#ifndef __BUNDLE_ADJUST_RESIDUALS_H__\n#define __BUNDLE_ADJUST_RESIDUALS_H__\n\n#include <asp/Camera/BundleAdjustCamera.h>\n\n#include <ceres/ceres.h>\n#include <ceres/loss_function.h>\n\n#include <map>\n#include <set>\n#include <string>\n\nnamespace asp {\n\n// Compute the bundle_adjust residuals\nvoid compute_residuals(asp::BaBaseOptions const& opt,\n                       asp::CRN const& crn,\n                       asp::BaParams const& param_storage,\n                       std::vector<size_t> const& cam_residual_counts,\n                       std::vector<std::map<int, vw::Vector2>> const& pixel_sigmas,\n                       size_t num_gcp_or_dem_residuals,\n                       size_t num_uncertainty_residuals,\n                       size_t num_tri_residuals,\n                       size_t num_cam_position_residuals,\n                       std::vector<vw::Vector3> const& reference_vec,\n                       ceres::Problem & problem,\n                       // Output\n                       std::vector<double> & residuals);\n\n/// Compute residual map by averaging all the reprojection error at a given point\nvoid compute_mean_residuals_at_xyz(asp::CRN const& crn,\n                                  std::vector<double> const& residuals,\n                                  asp::BaParams const& param_storage,\n                                  // outputs\n                                  std::vector<double> & mean_residuals,\n                                  std::vector<int>  & num_point_observations);\n\n/// Write out a .csv file recording the residual error at each location on the ground\nvoid write_residual_map(std::string const& output_prefix,\n                        // Mean residual of each point\n                        std::vector<double> const& mean_residuals,\n                        // Num non-outlier pixels per point\n                        std::vector<int> const& num_point_observations, \n                        asp::BaParams const& param_storage,\n                        vw::ba::ControlNetwork const& cnet,\n                        asp::BaBaseOptions const& opt);\n\n/// Write log files describing all residual errors. The order of data stored\n/// in residuals must mirror perfectly the way residuals were created. \nvoid write_residual_logs(std::string const& residual_prefix,\n                         asp::BaBaseOptions const& opt,\n                         asp::BaParams const& param_storage,\n                         std::vector<size_t> const& cam_residual_counts,\n                         std::vector<std::map<int, vw::Vector2>> const& pixel_sigmas,\n                         size_t num_gcp_or_dem_residuals,\n                         size_t num_uncertainty_residuals,\n                         size_t num_tri_residuals,\n                         size_t num_cam_position_residuals,\n                         std::vector<vw::Vector3> const& reference_vec,\n                         vw::ba::ControlNetwork const& cnet, \n                         asp::CRN const& crn, \n                         ceres::Problem &problem);\n\n// Find and save the offsets between initial and final triangulated points\nvoid saveTriOffsetsPerCamera(std::vector<std::string> const& image_files,\n                             asp::BaParams const& orig_params,\n                             asp::BaParams const& param_storage,\n                             asp::CRN const& crn,\n                             std::string const& tri_offsets_file);\n\n// Analogous version to the above, but keep the original and current triangulated points\n// in std<vector>, for use in jitter_solve.\nvoid saveTriOffsetsPerCamera(std::vector<std::string> const& image_files,\n                             std::set<int>            const& outliers,\n                             std::vector<double> const& orig_tri_points_vec,\n                             std::vector<double> const& tri_points_vec, \n                             asp::CRN const& crn,\n                             std::string const& tri_offsets_file);\n\n// Write the offsets between initial and final triangulated points\nvoid writeTriOffsetsPerCamera(int num_cams,\n                              std::vector<std::string> const& image_files,\n                              std::vector<std::vector<double>> & tri_offsets,\n                              std::string const& tri_offsets_file);\n\n// Compute the horizontal and vertical change in camera positions\nvoid saveCameraOffsets(vw::cartography::Datum   const& datum,\n                       std::vector<std::string> const& image_files,\n                       std::vector<vw::Vector3>  const& orig_cam_positions,\n                       std::vector<vw::Vector3>  const& opt_cam_positions,\n                       std::string              const& camera_offset_file);\n\n// Compute the horizontal and vertical change in camera positions. If more than \n// one camera position, such as for linescan, find the biggest.\nvoid saveCameraOffsets(vw::cartography::Datum                const& datum,\n                       std::vector<std::string>              const& image_files,\n                       std::vector<std::vector<vw::Vector3>> const& orig_cam_positions,\n                       std::vector<std::vector<vw::Vector3>> const& opt_cam_positions,\n                       std::string                           const& camera_offset_file);\n\n// This is used in jitter_solve\nvoid saveJitterResiduals(ceres::Problem                             & problem,\n                         std::string                           const& residual_prefix,\n                         asp::BaBaseOptions                    const& opt,\n                         vw::ba::ControlNetwork                const& cnet,\n                         asp::CRN                             const& crn,\n                         vw::cartography::Datum                const& datum,\n                         std::vector<double>                   const& tri_points_vec,\n                         std::set<int>                         const& outliers,\n                         std::vector<double>                   const& weight_per_residual,\n                         std::vector<std::vector<vw::Vector2>> const& pixel_vec,\n                         std::vector<std::vector<double>>      const& weight_vec,\n                         std::vector<std::vector<int>>         const& isAnchor_vec,\n                         std::vector<std::vector<int>>         const& pix2xyz_index,\n                         std::vector<vw::Vector3>              const& reference_vec,\n                         std::vector<std::vector<int>>         const& ref_indices,\n                         // Output\n                         std::vector<double>                        & mean_pixel_residuals);\n\n// This is used in jitter_solve\nvoid compute_residuals(asp::BaBaseOptions const& opt,\n                       ceres::Problem & problem,\n                       // Output\n                       std::vector<double> & residuals);\n\n} // end namespace asp\n\n#endif // __BUNDLE_ADJUST_RESIDUALS_H__\n"
  },
  {
    "path": "src/asp/Camera/CMakeLists.txt",
    "content": "# Use wrapper function at this level to avoid code duplication\n\nadd_library_wrapper(AspCamera \"${ASP_CAMERA_SRC_FILES}\" \"${ASP_CAMERA_TEST_FILES}\"\n    \"${ASP_CAMERA_LIB_DEPENDENCIES}\")\n\n# This is needed for CsmModelFit.cc. Not sure where a better place for it is.\ntarget_link_libraries(AspCamera ${SOLVER_LIBRARIES})\n"
  },
  {
    "path": "src/asp/Camera/CameraErrorPropagation.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file CameraErrorPropagation.cc\n///\n\n#include <asp/Camera/CameraErrorPropagation.h>\n#include <asp/Camera/LinescanPleiadesModel.h>\n#include <asp/Camera/RPCModel.h>\n\nnamespace asp {\n\n  // Read the horizontal error from some camera models\n  double horizontalStDevFromCamera(boost::shared_ptr<vw::camera::CameraModel> camera_model,\n                                   bool & message_printed) {\n    \n  // Try to create horizontal stddev based on the RPC camera file\n  const asp::RPCModel *rpc\n    = dynamic_cast<const asp::RPCModel*>(vw::camera::unadjusted_model(camera_model.get()));\n  if (rpc != NULL) {\n    if (!message_printed) {\n      vw::vw_out() << \"Input horizontal stddev values needed for error propagation \"\n                   << \"were not specified. Will create them based on the ERRBIAS \"\n                   << \"and ERRRAND fields from the RPC cameras.\\n\";\n      message_printed = true;\n    }\n    \n    double bias = rpc->m_err_bias, rand = rpc->m_err_rand;\n    if (bias > 0 && rand > 0) {\n      return sqrt(bias * bias + rand * rand);\n    } else {\n      vw::vw_throw(vw::ArgumentErr()\n                    << \"Cannot propagate errors, as no input horizontal \"\n                    << \"stddev values were specified, and some RPC camera models lack \"\n                    << \"the necessary ERRBIAS and ERRRAND fields that could be used \"\n                    << \"instead.\\n\");\n    }\n  }\n    \n  // Try to create horizontal stddev based on the Pleiades camera files\n  const asp::PleiadesCameraModel *pleiades\n    = dynamic_cast<const asp::PleiadesCameraModel*>\n    (vw::camera::unadjusted_model(camera_model.get()));\n  if (pleiades != NULL) {\n    double accuracy = pleiades->m_accuracy_stdv;\n    if (!message_printed) {\n      vw::vw_out() << \"Input horizontal stddev values needed for error propagation \"\n                   << \"were not specified. Will create them based on the ACCURACY_STDV \"\n                   << \"field from the Pleiades cameras.\\n\";\n      message_printed = true;\n    }\n    \n    if (accuracy > 0) {\n      return accuracy;\n    } else {\n      vw::vw_throw(vw::ArgumentErr()\n                    << \"Cannot propagate errors, as no input horizontal \"\n                    << \"stddev values were specified, and some Pleiades camera \"\n                    << \"models lack the necessary ACCURACY_STDV field that could \"\n                    << \"be used instead.\\n\");\n    }\n  }\n    \n  return 0;\n}\n\n// Some sanity checks and printing of horizontal stddevs\nvoid horizontalStdDevCheck(vw::Vector<double> const& stddevs, std::string const& session) {\n  \n  bool isDg = (session == \"dg\" || session == \"dgmaprpc\");\n  \n  // See how many stddevs are positive. Throw an error if some are negative.\n  int numTotal = stddevs.size();\n  int numPositive = 0;\n  for (int i = 0; i < (int)stddevs.size(); i++) {\n\n    if (stddevs[i] < 0)\n      vw::vw_throw(vw::ArgumentErr() << \"Cannot have negative horizontal stddev.\\n\");\n\n    if (stddevs[i] > 0) \n      numPositive++;\n  }\n\n  if (numPositive > 0 && numPositive < numTotal) \n    vw::vw_throw(vw::ArgumentErr() << \"Cannot have some positive and some zero \"\n                 \"horizontal sttdev.\\n\");\n  \n  bool allPositive = (numPositive == numTotal);\n  if (allPositive) {\n    vw::vw_out() << \"Horizontal stddev for the cameras: \" << stddevs << \" (meters).\\n\";\n    if (isDg) \n      vw::vw_out() << \"Will use these to find the point cloud stddev, rather than \"\n                   << \"satellite position and orientation covariances.\\n\";\n  } else {\n    // For DG we will use satellite position and orientation covariances if no luck\n    if (!isDg)\n      vw::vw_throw(vw::ArgumentErr()\n                    << \"Cannot propagate errors, as no input horizontal \"\n                    << \"stddev values were specified.\\n\");\n  }\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Camera/CameraErrorPropagation.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n/// \\file CameraErrorPropagation.h\n\n#ifndef __CAMERA_CAMERAERRORPROPAGATION_H__\n#define __CAMERA_CAMERAERRORPROPAGATION_H__\n\n#include <vw/Camera/CameraModel.h>\n\nnamespace asp {\n\n  // Read the horizontal error from some camera models\n  double horizontalStDevFromCamera(boost::shared_ptr<vw::camera::CameraModel> camera_model,\n                                   bool & message_printed);\n  \n  // Some sanity checks and printing of horizontal stddevs\n  void horizontalStdDevCheck(vw::Vector<double> const& stddevs, std::string const& session); \n  \n} // end namespace asp\n\n#endif // __CAMERA_CAMERAERRORPROPAGATION_H__\n\n"
  },
  {
    "path": "src/asp/Camera/CameraResectioning.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file CameraResectioning.cc\n\n#include <asp/Camera/CameraResectioning.h>\n#include <vw/Math/BBox.h>\n\n#include <opencv2/calib3d/calib3d.hpp>\n#include <Eigen/Dense>\n\n#include <string>\n\nusing namespace vw;\nusing namespace vw::camera;\n\nnamespace asp {\n\nvoid RodriguesToRotation(Eigen::Vector3d const& vector,\n                         Eigen::Matrix3d & rotation) {\n  double angle = vector.norm();\n  Eigen::AngleAxisd aa(angle, vector / angle);\n  rotation = aa.matrix();\n}\n  \n/// Use OpenCV to find a Pinhole camera's position and orientation\n/// based on image pixels and corresponding ground positions\nvoid findCameraPose(std::vector<vw::Vector3> const& ground_points, \n                    std::vector<vw::Vector2> const& pixel_observations,\n                    vw::camera::PinholeModel & cam) {\n\n  if (ground_points.size() != pixel_observations.size())\n    vw::vw_throw(vw::ArgumentErr()\n                 << \"There must be as many ground points as pixel observations.\\n\");\n\n  if (ground_points.size() < 4) \n    vw::vw_throw(vw::ArgumentErr()\n                 << \"Must have at least four points per camera to be able to \"\n                 << \"find a camera's orientation.\\n\");\n\n  Vector2 focal_length   = cam.focal_length();\n  double pixel_pitch     = cam.pixel_pitch();\n  Vector2 optical_offset = cam.point_offset();\n\n  // Intrinsics\n  cv::Mat intrinsics(3, 3, cv::DataType<double>::type, 0.0);\n  intrinsics.at<double>(0, 0) = focal_length[0]   / pixel_pitch;\n  intrinsics.at<double>(1, 1) = focal_length[1]   / pixel_pitch;\n  intrinsics.at<double>(0, 2) = optical_offset[0] / pixel_pitch;\n  intrinsics.at<double>(1, 2) = optical_offset[1] / pixel_pitch;\n  intrinsics.at<double>(2, 2) = 1.0;\n\n  // Assume no distortion, as that one is hard to communicate.\n  // This should give a good enough initial camera. Later it will be\n  // refined with bundle adjustment taking into account the distortion.\n  cv::Mat distortion(4, 1, cv::DataType<double>::type, cv::Scalar(0));\n\n  // Convert to OpenCV format\n  vw::BBox2 img_box;\n  std::vector<cv::Point2d> cv_pixel_observations;\n  std::vector<cv::Point3d> cv_ground_points;\n  for (size_t it = 0; it < ground_points.size(); it++) {\n    auto & V = ground_points[it];\n    auto & P = pixel_observations[it];\n    img_box.grow(P);\n    cv_ground_points.push_back(cv::Point3d(V[0], V[1], V[2]));\n    cv_pixel_observations.push_back(cv::Point2d(P[0], P[1]));\n  }\n  \n  // Call PnP. Because of un-modeled distortion and inaccuracy of picking GCP,\n  // relax the tolerance. But still want to throw out worst outliers, for example,\n  // if the inputs are produced with interest-point matching, which can have a\n  // lot of outliers.\n  bool useExtrinsicGuess = false;\n  int iterationsCount = 1000; // This algorithm is cheap, let it try hard\n  double len = std::max(img_box.width(), img_box.height());\n  float reprojectionError = std::max(20.0, 0.10 * len);\n  double confidence = 0.75;\n  cv::Mat rvec(3, 1, cv::DataType<double>::type, cv::Scalar(0)); // Rodrigues rotation \n  cv::Mat tvec(3, 1, cv::DataType<double>::type, cv::Scalar(0)); // translation\n  bool result = cv::solvePnPRansac(cv_ground_points, cv_pixel_observations,\n                                   intrinsics, distortion,\n                                   rvec, tvec, // outputs\n                                   useExtrinsicGuess, iterationsCount, reprojectionError,\n                                   confidence);\n  if (!result)\n    vw::vw_throw(vw::ArgumentErr()\n                 << \"Failed to find the camera pose using pixel and ground data. \"\n                 << \"The provided inputs may be inaccurate.\\n\");\n\n  // Convert obtained rotation\n  Eigen::Matrix3d rotation;\n  RodriguesToRotation(Eigen::Vector3d(rvec.at<double>(0), rvec.at<double>(1), \n                                      rvec.at<double>(2)), rotation);\n\n  // Make world2cam into cam2world\n  Eigen::Matrix3d cam2world = rotation.inverse(); \n  Eigen::Vector3d cam_ctr = -rotation.inverse() *\n    Eigen::Vector3d(tvec.at<double>(0), tvec.at<double>(1), tvec.at<double>(2));\n\n  // Convert Eigen matrix and vector to VW\n  vw::Matrix3x3 rot;\n  for (int row = 0; row < 3; row++) {\n    for (int col = 0; col < 3; col++) {\n      rot(row, col) = cam2world(row, col);\n    }\n  }\n  vw::Vector3 ctr;\n  for (int row = 0; row < 3; row++)\n    ctr[row] = cam_ctr[row];\n\n  // Apply the transform to the camera\n  cam.set_camera_pose(rot);\n  cam.set_camera_center(ctr);\n\n  return;\n}\n  \n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Camera/CameraResectioning.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n/// \\file CameraResectioning.h\n///\n\n#ifndef __ASP_CAMERA_CAMERA_RESECTIONING_H__\n#define __ASP_CAMERA_CAMERA_RESECTIONING_H__\n\n#include <vw/Camera/PinholeModel.h>\n#include <vector>\n\nnamespace asp {\n\n/// Use OpenCV to find a Pinhole camera's position and orientation\n/// based on image pixels and corresponding ground positions\n\nvoid findCameraPose(std::vector<vw::Vector3> const& ground_points, \n                    std::vector<vw::Vector2> const& pixel_observations,\n                    vw::camera::PinholeModel & cam);\n}\n\n#endif // __ASP_CAMERA_CAMERA_RESECTIONING_H__\n"
  },
  {
    "path": "src/asp/Camera/Covariance.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Logic for propagation of errors (covariance) through stereo triangulation \n\n#include <asp/Camera/Covariance.h>\n#include <asp/Camera/LinescanDGModel.h>\n#include <asp/Core/StereoSettings.h>\n\n#include <vw/Stereo/StereoModel.h>\n#include <vw/Math/LinearAlgebra.h>\n\n#include <iostream>\n\nusing namespace vw::camera;\n\nnamespace asp {\n\n// Change in satellite position (measured in meters) and satellite orientation\n// measured in normalized quaternions, to be used for numerical differencing.\n// One has to be mindful of the fact that the positions are on the order of\n// 7.0e6 meters given the distance from satellite to Earth center in ECEF,\n// so the position delta should not be too tiny.\nconst double deltaPosition = 0.01; // measured in meters\nconst double deltaQuat     = 1.0e-6; // given that quaternions are normalized\n\n// Given 0 <= num < 15, return a perturbation in satellite position. The\n// starting one is the zero perturbation, then perturb first\n// coordinate in the positive and then negative direction, then same\n// for second and third coordinate. The rest of the perturbations are\n// 0 as those indices are used to perturb the quaternions.\n// So, return (0, 0, 0), (deltaPosition, 0, 0), (-deltaPosition, 0, 0)\n// (0, deltaPosition, 0), (0, -deltaPosition, 0), and so on.\nvw::Vector<double, 3> positionDelta(int num) {\n\n  vw::Vector<double, 3> ans; // this is 0\n  if (num == 0)\n    return ans; // nominal position value, no perturbation\n  if (num > 6) \n    return ans; // nominal position value, will perturb the quaternion then\n\n  double sign = 1.0; // sign of the perturbation: 1, -1, 1, -1, etc.\n  if (num % 2 == 0) \n    sign = -1.0;\n\n  int index = (num - 1)/2; // get 0, 1, or 2\n  ans[index] = sign * deltaPosition;\n  \n  return ans;\n}\n\n// Similar logic as above for the quaternion, for indices 7, ..., 14 (8 of them)\nvw::Vector<double, 4> quatDelta(int num) {\n\n  vw::Vector<double, 4> ans; // this is 0\n  if (num <= 6) \n    return ans; // nominal quat value, will perturb the positions then\n\n  num = num - 6; // now num = 1, 2, ... 8\n  if (num > 8) \n    vw::vw_throw(vw::ArgumentErr() << \"Out of bounds in quatDelta().\\n\");\n  \n  double sign = 1.0; // sign of the perturbation: 1, -1, 1, -1, etc.\n  if (num % 2 == 0) \n    sign = -1.0;\n\n  int index = (num - 1)/2; // get 0, 1, 2, or 3\n  ans[index] = sign * deltaQuat;\n  \n  return ans;\n}\n\n// Number of nominal and perturbed cameras when the covariance is computed with DG cameras.\nint numCamsForCovariance() {\n  // One nominal camera. Then one positive and negative perturbation\n  // for each position (3) and quaternion (4).\n  return 15; \n}\n\n// Given two DG cameras and a pixel in each camera image, consider the\n// following transform. Go from the perturbed joint vector of\n// satellite positions and quaternions for this pixel pair to the\n// perturbed triangulated point. Then, the vector from nominal to\n// perturbed triangulation point is converted to North-East-Down\n// relative to the nominal point. Use numerical differentiation to\n// find the Jacobian of this transform with centered\n// differences. This will be used to find the covariances of the\n// triangulated point in NED coordinates given the input satellite\n// covariances. This works only for Maxar (DigitalGlobe)\n// cameras. This function may throw exceptions. Do not divide the\n// numerical derivatives by deltaPosition and deltaQuat, but only by\n// 2.0 (since these are centered differences). That because the\n// division makes the partial derivatives in quaternions huge and is\n// not good for numerical stability. We will compensate for this\n// when we multiply by the actual covariances, which are huge, so\n// those will be pre-multiplied by the squares of deltaPosition and\n// deltaQuat, with the same final result.\nvoid scaledDGTriangulationJacobian(vw::cartography::Datum const& datum,\n                                   vw::camera::CameraModel const* cam1,\n                                   vw::camera::CameraModel const* cam2,\n                                   vw::Vector2 const& pix1,\n                                   vw::Vector2 const& pix2,\n                                   vw::Matrix<double> & J) {\n  \n  // Handle adjusted cameras\n  bool adjusted_cameras = false;\n  const AdjustedCameraModel *adj_cam1 = dynamic_cast<const AdjustedCameraModel*>(cam1);\n  const AdjustedCameraModel *adj_cam2 = dynamic_cast<const AdjustedCameraModel*>(cam2);\n  if ((adj_cam1 == NULL) != (adj_cam2 == NULL))\n    vw::vw_throw(vw::ArgumentErr() << \"The cameras must be either both \"\n                 << \"adjusted or both unadjusted.\\n\");\n\n  vw::Matrix3x3 cam1_rot, cam2_rot;\n  vw::Vector3 cam1_shift, cam2_shift;\n  if (adj_cam1 != NULL && adj_cam2 != NULL) {\n    adjusted_cameras = true;\n    // transforms from unadjusted to adjusted coordinates\n    vw::Matrix4x4 cam1_adj = adj_cam1->ecef_transform();\n    vw::Matrix4x4 cam2_adj = adj_cam2->ecef_transform();\n    cam1_rot = submatrix(cam1_adj, 0, 0, 3, 3);\n    cam2_rot = submatrix(cam2_adj, 0, 0, 3, 3);\n    cam1_shift = vw::Vector3(cam1_adj(0, 3), cam1_adj(1, 3), cam1_adj(2, 3));\n    cam2_shift = vw::Vector3(cam2_adj(0, 3), cam2_adj(1, 3), cam2_adj(2, 3));\n  }\n  \n  DGCameraModel const* dg_cam1 = dynamic_cast<DGCameraModel const*>(unadjusted_model(cam1));\n  DGCameraModel const* dg_cam2 = dynamic_cast<DGCameraModel const*>(unadjusted_model(cam2));\n  if (dg_cam1 == NULL || dg_cam2 == NULL) \n    vw::vw_throw(vw::ArgumentErr() << \"Expecting DG cameras.\\n\");\n\n  // Numerical differences will be used. Camera models with deltaPosition and deltaQuat\n  // perturbations have already been created in LinescanDGModel.cc using the positionDelta()\n  // and quatDelta() functions from above.\n  if (dg_cam1->m_perturbed_cams.empty() || dg_cam2->m_perturbed_cams.empty()) \n    vw::vw_throw(vw::ArgumentErr() << \"The perturbed cameras were not set up.\\n\");\n  \n  if (dg_cam1->m_perturbed_cams.size() != dg_cam2->m_perturbed_cams.size())\n    vw::vw_throw(vw::ArgumentErr()\n                 << \"The number of perturbations in the two cameras do not agree.\\n\");\n\n  // Find the camera center and direction for first unperturbed\n  // camera, and for the perturbed versions. Same for the second\n  // camera.\n  std::vector<vw::Vector3> cam1_dirs, cam1_ctrs, cam2_dirs, cam2_ctrs;\n  cam1_dirs.push_back(dg_cam1->pixel_to_vector(pix1));\n  cam1_ctrs.push_back(dg_cam1->camera_center(pix1));\n  cam2_dirs.push_back(dg_cam2->pixel_to_vector(pix2));\n  cam2_ctrs.push_back(dg_cam2->camera_center(pix2));\n  for (size_t it = 0; it < dg_cam1->m_perturbed_cams.size(); it++) {\n    cam1_dirs.push_back(dg_cam1->m_perturbed_cams[it]->pixel_to_vector(pix1));\n    cam1_ctrs.push_back(dg_cam1->m_perturbed_cams[it]->camera_center(pix1));\n    cam2_dirs.push_back(dg_cam2->m_perturbed_cams[it]->pixel_to_vector(pix2));\n    cam2_ctrs.push_back(dg_cam2->m_perturbed_cams[it]->camera_center(pix2));\n  }\n\n  // Apply adjustments\n  if (adjusted_cameras) {\n    for (size_t it = 0; it < cam1_dirs.size(); it++) {\n      cam1_dirs[it] = cam1_rot * cam1_dirs[it];\n      cam2_dirs[it] = cam2_rot * cam2_dirs[it];\n      cam1_ctrs[it] = cam1_rot * cam1_ctrs[it] + cam1_shift;\n      cam2_ctrs[it] = cam2_rot * cam2_ctrs[it] + cam2_shift;\n    }\n  }\n  \n  // Nominal triangulation point\n  vw::Vector3 tri_nominal, err_nominal;\n  // If triangulation fails, it can return NaN\n  tri_nominal\n    = vw::stereo::triangulate_pair(cam1_dirs[0], cam1_ctrs[0], cam2_dirs[0], cam2_ctrs[0],\n                                   err_nominal);\n  if (tri_nominal != tri_nominal) // NaN\n    vw::vw_throw(vw::ArgumentErr() << \"Could not triangulate.\\n\");\n\n  // The matrix to go from the NED coordinate system to ECEF\n  vw::Vector3 llh = datum.cartesian_to_geodetic(tri_nominal);\n  vw::Matrix3x3 NedToEcef = datum.lonlat_to_ned_matrix(llh);\n  vw::Matrix3x3 EcefToNed = inverse(NedToEcef);\n\n  // There are 14 input variables: 3 positions and 4 quaternions for\n  // cam1, and same for cam2. For each of them must compute a centered\n  // difference. The output has 3 variables. As documented above,\n  // the vector from the nominal to perturbed\n  // triangulated point will be converted to North-East-Down\n  // coordinates at the nominal triangulated point.\n  J.set_size(3, 14);\n  J.set_zero();\n  for (int coord = 0; coord < 14; coord++) {\n\n    vw::Vector3 cam1_dir_plus, cam1_ctr_plus, cam2_dir_plus, cam2_ctr_plus;\n    vw::Vector3 cam1_dir_minus, cam1_ctr_minus, cam2_dir_minus, cam2_ctr_minus;\n    if (coord < 7) {\n      // The perturbed cameras store positive and negative\n      // perturbations, in alternating order. See positionDelta() and\n      // quatDelta() for the book-keeping. Note that a perturbation in\n      // the satellite quaternion also affects the camera center,\n      // given how one converts from satellite to camera coordinates\n      // when the DG model is created.\n\n      // Since at position 0 in cam_dirs we store the nominal (unperturbed)\n      // values, add 1 below.\n      cam1_dir_plus  = cam1_dirs[2*coord + 1]; cam1_ctr_plus  = cam1_ctrs[2*coord + 1];\n      cam1_dir_minus = cam1_dirs[2*coord + 2]; cam1_ctr_minus = cam1_ctrs[2*coord + 2];\n    } else {\n      // When variables affecting second camera change, the first one stays at nominal value.\n      cam1_dir_plus  = cam1_dirs[0]; cam1_ctr_plus  = cam1_ctrs[0];\n      cam1_dir_minus = cam1_dirs[0]; cam1_ctr_minus = cam1_ctrs[0];\n    }\n\n    // For the second camera, the book-keeping is reversed\n    if (coord < 7) {\n      // Second camera values do not change when first camera inputs change\n      cam2_dir_plus  = cam2_dirs[0]; cam2_ctr_plus  = cam2_ctrs[0];\n      cam2_dir_minus = cam2_dirs[0]; cam2_ctr_minus = cam2_ctrs[0];\n    } else {\n      int coord2 = coord - 7; // has values 0, 1, ..., 6\n      cam2_dir_plus  = cam2_dirs[2*coord2 + 1]; cam2_ctr_plus  = cam2_ctrs[2*coord2 + 1];\n      cam2_dir_minus = cam2_dirs[2*coord2 + 2]; cam2_ctr_minus = cam2_ctrs[2*coord2 + 2];\n    }\n\n    vw::Vector3 tri_plus, err_plus, tri_minus, err_minus;\n    tri_plus = vw::stereo::triangulate_pair(cam1_dir_plus, cam1_ctr_plus,\n                                            cam2_dir_plus, cam2_ctr_plus, err_plus);\n    tri_minus = vw::stereo::triangulate_pair(cam1_dir_minus, cam1_ctr_minus,\n                                             cam2_dir_minus, cam2_ctr_minus, err_minus);\n\n    // Find the triangulated points in the local NED (horizontal-vertical)\n    // coordinate system.\n    vw::Vector3 ned_plus = EcefToNed * (tri_plus - tri_nominal);\n    vw::Vector3 ned_minus = EcefToNed * (tri_minus - tri_nominal);\n\n    // Find the numerical partial derivative, but do not divide by the\n    // spacing (deltaPosition or deltaQuat) as that makes the numbers\n    // huge. We will compensate for when use use this Jacobian to\n    // propagate the satellite position and quaternion covariances\n    // (matrix SC), by the formula J * SC * J^T. Then, we will divide SC\n    // by these squared delta quantities, which is the right thing to\n    // do, because the values in SC are tiny, and, in fact, on the\n    // order of the squares of the delta values.\n    vw::Vector3 ned_diff = (ned_plus - ned_minus)/2.0;\n    \n    for (int row = 0; row < 3; row++) \n      J(row, coord) = ned_diff[row];\n  }\n\n  return;\n}\n\n// Given upper-right values in a symmetric matrix of given size, find\n// the lower-left values by reflection, and insert them as a block\n// starting at the desired row and column. Used to populate the joint\n// covariance matrix. Per DigitalGlobe's doc, the covariances are\n// stored as c11, c12, c13, ..., c22, c23, ...\nvoid insertBlock(int start, int size, double* inputVals, vw::Matrix<double> & C) {\n  int count = 0;\n  for (int row = 0; row < size; row++) {\n    for (int col = row; col < size; col++) {\n      C(start + row, start + col) = inputVals[count];\n      C(start + col, start + row) = inputVals[count];\n      count++;\n    }\n  }\n}\n  \n// Based on tabulated satellite position and quaternion covariance\n// for each DG camera, find the interpolated covariances for cam1 at\n// pix1 (6 for position, 10 for orientation, as just the upper-right\n// corner is used), same for cam2 at pix2, autocomplete these to the\n// full matrices (3x3 and 4x4 for each), create a combined matrix of\n// covariances (14 x 14), and divide the entries by squares of\n// deltaPosition and deltaQuat which normalizes them, and which are\n// compensated by not dividing by these numbers (without the square)\n// what is found in scaledDGTriangulationJacobian(). Later we will do\n// J * C * J^T. The same order of variables as in\n// scaledDGTriangulationJacobian must be used.\nvoid scaledDGSatelliteCovariance(vw::camera::CameraModel const* cam1,\n                                 vw::camera::CameraModel const* cam2,\n                                 vw::Vector2 const& pix1,\n                                 vw::Vector2 const& pix2,\n                                 vw::Matrix<double> & C) {\n  \n  // Initialize the output\n  // 3 positions for cam 1, 4 orientations for cam1, 3 positions for cam2, 4 orientations\n  // for cam2. So, four blocks in total. The resulting matrix must be symmetric.\n  C.set_size(14, 14);\n  C.set_zero();\n\n  // Here it is not important that the camera are adjusted or not, as all that is needed\n  // are the input covariances.\n  DGCameraModel const* dg_cam1 = dynamic_cast<DGCameraModel const*>(unadjusted_model(cam1));\n  DGCameraModel const* dg_cam2 = dynamic_cast<DGCameraModel const*>(unadjusted_model(cam2));\n  if (dg_cam1 == NULL || dg_cam2 == NULL) \n    vw::vw_throw(vw::ArgumentErr() << \"Expecting DG cameras.\\n\");\n\n  // Find the covariances at given pixel by interpolation in the input table.\n  // Use nearest neighbor interpolation as covariances are known with\n  // just a few digits of precision and are not meant to be smooth.\n  double p_cov1[SAT_POS_COV_SIZE], p_cov2[SAT_POS_COV_SIZE];\n  double q_cov1[SAT_QUAT_COV_SIZE], q_cov2[SAT_QUAT_COV_SIZE];  \n  dg_cam1->interpSatellitePosCov(pix1, p_cov1);\n  dg_cam1->interpSatelliteQuatCov(pix1, q_cov1);\n  dg_cam2->interpSatellitePosCov(pix2, p_cov2);\n  dg_cam2->interpSatelliteQuatCov(pix2, q_cov2);\n\n  // This is useful for seeing which input covariance has a bigger effect.\n  // The default value of these factors is 1.\n  double pf = asp::stereo_settings().position_covariance_factor;\n  double qf = asp::stereo_settings().orientation_covariance_factor;\n  \n  // Scale these per scaledDGTriangulationJacobian().\n  for (int ip = 0; ip < SAT_POS_COV_SIZE; ip++) {\n    p_cov1[ip] = pf * p_cov1[ip] / (deltaPosition * deltaPosition); \n    p_cov2[ip] = pf * p_cov2[ip] / (deltaPosition * deltaPosition); \n  }\n  for (int iq = 0; iq < SAT_QUAT_COV_SIZE; iq++) {\n    q_cov1[iq] = qf * q_cov1[iq] / (deltaQuat * deltaQuat); \n    q_cov2[iq] = qf * q_cov2[iq] / (deltaQuat * deltaQuat); \n  }\n\n  // Put these in the covariance matrix\n  insertBlock(0,  3, p_cov1, C);\n  insertBlock(3,  4, q_cov1, C);\n  insertBlock(7,  3, p_cov2, C);\n  insertBlock(10, 4, q_cov2, C);\n\n#if 0\n  std::cout << \"Produced matrix \" << std::endl;\n  for (int row = 0; row < 14; row++) {\n    for (int col = 0; col < 14; col++) {\n      std::cout << C(row, col) << \" \";\n    }\n    std::cout << std::endl;\n  }\n\n  // Debug code. This shows that some quaternion covariances have a\n  // negative determinant. That is because an eigenvalue is very close\n  // to 0 or even negative (but small). This singularity goes away\n  // after the covariances are propagated.\n  std::cout << \"determinant1 \" << det(submatrix(C, 0, 0, 3, 3)) << std::endl;\n  std::cout << \"determinant2 \" << det(submatrix(C, 3, 3, 4, 4)) << std::endl;\n  std::cout << \"determinant3 \" << det(submatrix(C, 7, 7, 3, 3)) << std::endl;\n  std::cout << \"determinant4 \" << det(submatrix(C, 10, 10, 4, 4)) << std::endl;\n#endif\n  \n  return;\n}\n\n// Given a North-East-Down coordinate system at a point on a planet surface,\n// left camera center, the x and y coordinates of where the ray from that\n// center intersects the plane z = 0, and the same for the right camera,\n// all in NED coordinates, find where the rays intersect, also in NED.\nvw::Vector3 nedTri(vw::Vector3 const& cam1_ctr, vw::Vector3 const& cam2_ctr,\n                   double x1, double y1, double x2, double y2) {\n\n  // Find the normalized direction from camera to ground\n  vw::Vector3 ground_pt1(x1, y1, 0.0);\n  vw::Vector3 cam1_dir = ground_pt1 - cam1_ctr; cam1_dir /= norm_2(cam1_dir);\n  vw::Vector3 ground_pt2(x2, y2, 0.0);\n  vw::Vector3 cam2_dir = ground_pt2 - cam2_ctr; cam2_dir /= norm_2(cam2_dir);\n\n  vw::Vector3 tri, err;\n  tri = vw::stereo::triangulate_pair(cam1_dir, cam1_ctr, cam2_dir, cam2_ctr, err);\n  \n  return tri;\n}\n\n// Given a triangulated point in ECEF, create the local\n// North-East-Down (NED) coordinate system centered at that\n// point. Find the Jacobian of the nedTri() function, which will\n// propagate uncertainties from the North-East horizontal plane\n// through triangulation, with the result also being in NED.\n// Bundle-adjusted cameras need no special treatment.\nvoid triangulationJacobian(vw::cartography::Datum const& datum,\n                           vw::Vector3 const& tri_nominal,\n                           vw::camera::CameraModel const* cam1,\n                           vw::camera::CameraModel const* cam2,\n                           vw::Vector2 const& pix1,\n                           vw::Vector2 const& pix2,\n                           vw::Matrix<double> & J) {\n  \n  // The matrix to go from the NED coordinate system to ECEF at the\n  // nominal triangulation point\n  vw::Vector3 llh = datum.cartesian_to_geodetic(tri_nominal);\n  vw::Matrix3x3 NedToEcef = datum.lonlat_to_ned_matrix(llh);\n  vw::Matrix3x3 EcefToNed = inverse(NedToEcef);\n\n  // Camera centers and directions in ECEF\n  vw::Vector3 cam1_ctr = cam1->camera_center(pix1), cam1_dir = cam1->pixel_to_vector(pix1);\n  vw::Vector3 cam2_ctr = cam2->camera_center(pix2), cam2_dir = cam2->pixel_to_vector(pix2);\n\n  // Convert to NED\n  vw::Vector3 cam1_ctr_ned = EcefToNed * (cam1_ctr - tri_nominal);\n  vw::Vector3 cam1_dir_ned = EcefToNed * cam1_dir;\n  vw::Vector3 cam2_ctr_ned = EcefToNed * (cam2_ctr - tri_nominal);\n  vw::Vector3 cam2_dir_ned = EcefToNed * cam2_dir;\n\n  // See where the rays intersect the local horizontal plane Find\n  // alpha1 so that cam1_ctr_ned + alpha1 * cam1_dir_ned has 3rd\n  // coordinate equal to zero\n  double alpha1 = -cam1_ctr_ned.z() / cam1_dir_ned.z();\n  double x1 = cam1_ctr_ned.x() + alpha1 * cam1_dir_ned.x();\n  double y1 = cam1_ctr_ned.y() + alpha1 * cam1_dir_ned.y();\n  double alpha2 = -cam2_ctr_ned.z() / cam2_dir_ned.z();\n  double x2 = cam2_ctr_ned.x() + alpha2 * cam2_dir_ned.x();\n  double y2 = cam2_ctr_ned.y() + alpha2 * cam2_dir_ned.y();\n  \n  // There are 4 input variables: x and y position in the horizontal\n  // plane for the first camera, then for the second one. For each of\n  // them must compute a centered difference. The output has 3\n  // variables, the NED triangulation point.\n  J.set_size(3, 4);\n  J.set_zero();\n\n  for (int coord = 0; coord < 4; coord++) {\n\n    // Perturb one variable at a time\n    double x1_plus = x1, x1_minus = x1, x2_plus = x2, x2_minus = x2;\n    double y1_plus = y1, y1_minus = y1, y2_plus = y2, y2_minus = y2;\n    if (coord == 0) {\n      x1_minus += -deltaPosition;\n      x1_plus  +=  deltaPosition;\n    } else if (coord == 1) {\n      y1_minus += -deltaPosition;\n      y1_plus  +=  deltaPosition;\n    } else if (coord == 2) {\n      x2_minus += -deltaPosition;\n      x2_plus  +=  deltaPosition;\n    } else if (coord == 3) {\n      y2_minus += -deltaPosition;\n      y2_plus  +=  deltaPosition;\n    }\n\n    vw::Vector3 xyz_plus = nedTri(cam1_ctr_ned, cam2_ctr_ned,\n                                  x1_plus, y1_plus, x2_plus, y2_plus);\n    vw::Vector3 xyz_minus = nedTri(cam1_ctr_ned, cam2_ctr_ned,\n                                   x1_minus, y1_minus, x2_minus, y2_minus);\n\n    // Centered difference\n    vw::Vector3 partial_deriv = (xyz_plus - xyz_minus) / (2.0 * deltaPosition);\n    \n    for (int row = 0; row < 3; row++) \n      J(row, coord) = partial_deriv[row];\n  }\n\n  return;\n}\n\n// Propagate the covariances. Return propagated stddev. See the .h file for more info.\nvw::Vector2 propagateCovariance(vw::Vector3 const& tri_nominal,\n                                vw::cartography::Datum const& datum,\n                                double stddev1, double stddev2,\n                                vw::camera::CameraModel const* cam1,\n                                vw::camera::CameraModel const* cam2,\n                                vw::Vector2 const& pix1,\n                                vw::Vector2 const& pix2) {\n\n  // Return right away if triangulation was not successful. The caller will set the result\n  // to (0, 0, 0).\n  if (tri_nominal == vw::Vector3(0, 0, 0) || tri_nominal != tri_nominal) \n    vw::vw_throw(vw::ArgumentErr() << \"Could not compute the covariance.\\n\");\n\n  vw::Matrix<double> J, C;\n\n  // variance is square of stddev\n  vw::Vector2 variance;\n  variance[0] = stddev1 * stddev1;\n  variance[1] = stddev2 * stddev2;\n  \n  if (variance[0] > 0 && variance[1] > 0) {\n    // The user set horizontal stddev\n    triangulationJacobian(datum, tri_nominal, cam1, cam2, pix1, pix2, J);\n    C = vw::math::identity_matrix(4);\n    // The first two covariances are the left camera horizontal square stddev,\n    // and last two are for the right camera.\n    C(0, 0) = variance[0]; C(1, 1) = variance[0];\n    C(2, 2) = variance[1]; C(3, 3) = variance[1];\n  } else {\n    // Will arrive here only for DG cameras and if the user did not\n    // set --horizontal-stddev.  The Jacobian of the transform from\n    // ephemeris and attitude to the triangulated point in NED\n    // coordinates, multiplied by a scale factor.\n    asp::scaledDGTriangulationJacobian(datum, cam1, cam2, pix1, pix2, J);\n    \n    // The input covariance, divided by the square of the above scale factor.\n    asp::scaledDGSatelliteCovariance(cam1, cam2, pix1, pix2, C);\n  }\n  \n  // Propagate the covariance\n  // Per: https://en.wikipedia.org/wiki/Propagation_of_uncertainty#Non-linear_combinations\n  vw::Matrix<double> JT = transpose(J);\n  vw::Matrix<double> P = J * C * JT;\n\n#if 0\n  // Useful debug code\n  std::cout << \"NED covariance \" << P << std::endl;\n  vw::Vector<std::complex<double>> e;\n  vw::math::eigen(P, e);\n  std::cout << \"Eigenvalues: \" << e << std::endl;\n#endif\n  \n  // Horizontal component is the square root of the determinant of the\n  // upper-left 2x2 block (horizontal plane component), which is the\n  // same as the square root of the product of eigenvalues of this\n  // matrix.  Intuitively, the area of an ellipse is the product of\n  // semi-axes, which is the product of eigenvalues. Then, a circle\n  // with radius which is the square root of the product of semi-axes\n  // has the same area.\n  vw::Matrix2x2 H = submatrix(P, 0, 0, 2, 2);\n  vw::Vector2 ans;\n  ans[0] = sqrt(det(H));\n\n  // Vertical component is the z variance\n  ans[1] = P(2, 2);\n\n  // Check for NaN. Then the caller will return the zero vector, which\n  // signifies that the there is no valid data\n  if (ans != ans) \n    vw::vw_throw(vw::ArgumentErr() << \"Could not compute the covariance.\\n\");\n\n  // Take the square root, so return the standard deviation\n  return vw::Vector2(sqrt(ans[0]), sqrt(ans[1]));\n}\n  \n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Camera/Covariance.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n/// \\file Covariance.h\n\n// Logic for propagation of errors (covariances) through stereo triangulation \n\n#ifndef __ASP_CAMERA_COVARIANCE_H__\n#define __ASP_CAMERA_COVARIANCE_H__\n\n#include <vw/Math/Vector.h>\n#include <vw/Math/Matrix.h>\n#include <vw/Camera/CameraModel.h>\n\nnamespace vw {\n  namespace cartography {\n    class Datum;\n  }\n}\n\nnamespace asp {\n\n  // Given 0 <= num < 15, return a perturbation in position. The\n  // starting one is the zero perturbation, then perturb first\n  // coordinate in the positive and then negative direction, then same\n  // for second and third coordinate. The rest of the perturbations\n  // are 0 as those indices are used to perturb the quaternions.  So,\n  // return (0, 0, 0), (deltaPosition, 0, 0), (-deltaPosition, 0, 0)\n  // (0, deltaPosition, 0), and so on.\n  vw::Vector<double, 3> positionDelta(int num);\n\n  // Similar logic as above for the quaternion, for indices 7, ..., 14 (8 of them)\n  vw::Vector<double, 4> quatDelta(int num);\n\n  // Number of nominal and perturbed cameras when the covariance is computed\n  int numCamsForCovariance();\n\n  // Propagate horizontal ground plane covariances or DG's satellite\n  // ephemeris and attitude covariances to triangulation in NED\n  // coordinates. Return the square root of horizontal and vertical\n  // components, so the standard deviations.\n  vw::Vector2 propagateCovariance(vw::Vector3 const& tri_nominal,\n                                  vw::cartography::Datum const& datum,\n                                  double stddev1, double stddev2,\n                                  vw::camera::CameraModel const* cam1,\n                                  vw::camera::CameraModel const* cam2,\n                                  vw::Vector2 const& pix1,\n                                  vw::Vector2 const& pix2);\n  \n} // end namespace asp\n\n#endif//__ASP_CAMERA_COVARIANCE_H__\n"
  },
  {
    "path": "src/asp/Camera/CsmModel.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Camera/CsmModel.h>\n#include <asp/Camera/CsmUtils.h>\n#include <asp/Core/ProjectiveCamApprox.h>\n\n#include <vw/FileIO/FileUtils.h>\n#include <vw/Core/Thread.h>\n#include <vw/Camera/PinholeModel.h>\n#include <vw/Camera/LensDistortion.h>\n#include <vw/Core/Log.h>\n\n#include <boost/dll.hpp>\n#include <boost/dll/runtime_symbol_info.hpp>\n#include <boost/filesystem.hpp>\n#include <boost/algorithm/string/case_conv.hpp>\n#include <boost/version.hpp>\n#include <boost/config.hpp>\n\n// From the CSM base interface library\n#include <csm/csm.h>\n#include <csm/Plugin.h>\n#include <csm/RasterGM.h>\n#include <nlohmann/json.hpp>\n\n// USGSCSM linescan\n#include <usgscsm/UsgsAstroFrameSensorModel.h>\n#include <usgscsm/UsgsAstroLsSensorModel.h>\n#include <usgscsm/UsgsAstroPushFrameSensorModel.h>\n#include <usgscsm/UsgsAstroSarSensorModel.h>\n#include <usgscsm/Utilities.h>\n\n#include <ale/Rotation.h>\n#include <Eigen/Dense>\n#include <Eigen/Geometry>\n\n#include <streambuf>\n\nnamespace dll = boost::dll;\nnamespace fs = boost::filesystem;\nusing json = nlohmann::json;\n\nusing namespace vw;\n\nnamespace asp {\n\n// This was discussed with the USGS folks. To convert from ISIS to ASP\n// pixels we subtract 1.0. To convert from CSM pixels we have to\n// subtract only 0.5.\nconst vw::Vector2 ASP_TO_CSM_SHIFT(0.5, 0.5);\n\nenum USGSCSM_MODEL_TYPE {\n  USGSCSM_FRAME_MODEL,\n  USGSCSM_LINESCAN_MODEL,\n  USGSCSM_PUSHFRAME_MODEL,\n  USGSCSM_SAR_MODEL\n};\n\nvw::Mutex csm_init_mutex;\n\n// -----------------------------------------------------------------\n// Helper functions\n\ncsm::EcefCoord vectorToEcefCoord(Vector3 v) {\n  csm::EcefCoord c;\n  c.x = v[0];\n  c.y = v[1];\n  c.z = v[2];\n  return c;\n}\n\ncsm::ImageCoord vectorToImageCoord(Vector2 v) {\n  csm::ImageCoord c;\n  c.samp = v[0];\n  c.line = v[1];\n  return c;\n}\n\n// Auxiliary functions to convert a pixel from ASP conventions to what CSM\n// expects and vice versa\nvoid toCsmPixel(vw::Vector2 const& pix, csm::ImageCoord & csm) {\n  csm.samp = pix[0] + ASP_TO_CSM_SHIFT[0];\n  csm.line = pix[1] + ASP_TO_CSM_SHIFT[1];\n}\nvoid fromCsmPixel(vw::Vector2 & pix, csm::ImageCoord const& csm) {\n  pix[0] = csm.samp - ASP_TO_CSM_SHIFT[0];\n  pix[1] = csm.line - ASP_TO_CSM_SHIFT[1];\n}\n\nVector3 ecefCoordToVector(csm::EcefCoord const& c) {\n  Vector3 v;\n  v[0] = c.x;\n  v[1] = c.y;\n  v[2] = c.z;\n  return v;\n}\n\nVector3 ecefVectorToVector(csm::EcefVector const& c) {\n  Vector3 v;\n  v[0] = c.x;\n  v[1] = c.y;\n  v[2] = c.z;\n  return v;\n}\n\nVector2 imageCoordToVector(csm::ImageCoord const& c) {\n  Vector2 v;\n  v[0] = c.samp;\n  v[1] = c.line;\n  return v;\n}\n\n// -----------------------------------------------------------------\n// Constructor\nCsmModel::CsmModel():m_semi_major_axis(0.0),\n                     m_semi_minor_axis(0.0),\n                     m_sun_position(vw::Vector3()),\n                     // Do not make the precision lower than 1e-8. CSM can give\n                     // junk results when it is too low.\n                     m_desired_precision(asp::DEFAULT_CSM_DESIRED_PRECISION),\n                     m_maxApproxCamPixErr(-1.0) {\n}\n\n// Call the default constructor to initalize the member variables, then load\n// from file.\nCsmModel::CsmModel(std::string const& isd_path): CsmModel() {\n  load_model(isd_path);\n}\n\n// Note: This class copy constructor is shallow. To make a deep copy\n// use the deep_copy() function.\n\nCsmModel::~CsmModel() {\n  // nothing to do.\n}\n\nstd::string CsmModel::get_csm_plugin_folder() {\n  // Look up the CSM_PLUGIN_PATH environmental variable.\n  // It is set in the \"libexec/libexec-funcs.sh\" deploy file.\n  // If the plugin is not found in CSM_PLUGIN_PATH, look at ISISROOT.\n  std::string plugin_path;\n  char * plugin_path_arr = getenv(\"CSM_PLUGIN_PATH\");\n\n  char * isis_root = getenv(\"ISISROOT\");\n  if (isis_root == NULL)\n    vw_throw(vw::ArgumentErr() << \"The variable ISISROOT was not set.\\n\");\n\n  if (plugin_path_arr != NULL && std::string(plugin_path_arr) != \"\") {\n    plugin_path = std::string(plugin_path_arr);\n\n  } else {\n    // This is for when ASP is installed without the deploy file.\n    // vw_out() << \"The environmental variable CSM_PLUGIN_PATH was not set.\\n\";\n    fs::path try_path(isis_root);\n    try_path /= \"lib\";\n    plugin_path = try_path.string();\n    //vw_out() << \"Looking in \" << plugin_path << \".\\n\";\n  }\n\n  if (!fs::exists(plugin_path)) {\n    vw_throw(ArgumentErr() << \"Could not find CSM plugin folder: \" << plugin_path << \".\\n\"\n              << \"Check the value of the environmental variable CSM_PLUGIN_PATH.\");\n  }\n\n  return plugin_path;\n}\n\n// The original idea here was to look at every library in the plugins\n// directory and load the valid plugins. For now however there is just\n// one plugin, usgscsm, and it is stored in 'lib', among thousands\n// of other inapplicable libraries. Hence just pick that one.  One day\n// we will have a dedicated plugins directory.\nsize_t CsmModel::find_csm_plugins(std::vector<std::string> &plugins) {\n\n  plugins.clear();\n  const std::string folder = get_csm_plugin_folder();\n  std::string ext;\n  std::vector<std::string> potential_plugins;\n  std::string platform = std::string(BOOST_PLATFORM);\n  boost::to_lower(platform);\n  if (std::string(platform).find(\"linux\") != std::string::npos)\n    ext = \".so\";\n  else if (std::string(platform).find(\"mac\") != std::string::npos)\n    ext = \".dylib\";\n  else\n    vw_throw(ArgumentErr() << \"Unknown operating system: \" << BOOST_PLATFORM << \"\\n\");\n\n#if 0\n  size_t potential_num_dlls = vw::get_files_in_folder(folder, potential_plugins, ext);\n  for (size_t i = 0; i < potential_num_dlls; i++) {\n    if (potential_plugins[i] != \"libusgscsm\" + ext) {\n      continue;\n    }\n\n    fs::path p(folder);\n    p /= potential_plugins[i];\n    plugins.push_back(p.string());\n  }\n#endif\n\n  fs::path p(folder);\n  p /= \"libusgscsm\" + ext;\n  std::string plugin = p.string();\n  if (!fs::exists(plugin))\n    vw_throw(ArgumentErr() << \"Cannot find plugin: \" <<plugin <<\n              \". Set CSM_PLUGIN_PATH to the directory where the plugins are stored.\\n\");\n  plugins.push_back(plugin);\n\n  return plugins.size();\n}\n\nvoid CsmModel::print_available_models() {\n  csm::PluginList available_plugins = csm::Plugin::getList();\n  // vw_out() << \"Detected \" << available_plugins.size() << \" available CSM plugin(s).\\n\";\n\n  csm::PluginList::iterator iter;\n  for (iter = available_plugins.begin(); iter != available_plugins.end(); iter++) {\n    vw_out() << \"  -->  \" << (*iter)->getPluginName() << std::endl;\n    size_t num_models = (*iter)->getNumModels();\n    vw_out() << \"    - Num models = \" << num_models << std::endl;\n    for (size_t i = 0; i < num_models; i++) {\n      vw_out() << \"      -> \" << (*iter)->getModelName(i)\n                << \", family =  \" << (*iter)->getModelFamily(i) << std::endl;\n    }\n  }\n}\n\n// This function is not kept out of the header file to hide CSM dependencies.\n/// Look through all of the loaded plugins and find one that is compatible with\n///  the provided ISD.\nconst csm::Plugin* find_plugin_for_isd(csm::Isd const& support_data,\n                                       std::string   & model_name,\n                                       std::string   & model_family,\n                                       bool            show_warnings) {\n\n  // Loop through the available plugins.\n  csm::PluginList::iterator iter;\n  csm::PluginList plugins = csm::Plugin::getList();\n  for (iter = plugins.begin(); iter != plugins.end(); iter++) {\n    const csm::Plugin* csm_plugin = (*iter);\n\n    // For each plugin, loop through the available models.\n    size_t num_models = csm_plugin->getNumModels();\n    for (size_t i = 0; i < num_models; i++) {\n\n      std::string this_model_name = (*iter)->getModelName(i);\n\n      // Check if we can construct a camera with the ISD and this plugin/model.\n      csm::WarningList warnings;\n      csm::WarningList::const_iterator w_iter;\n      if (csm_plugin->canModelBeConstructedFromISD(support_data, this_model_name, &warnings)) {\n        model_name   = this_model_name;\n        model_family = csm_plugin->getModelFamily(i);\n        return csm_plugin; // Found a plugin that will work!\n      }\n      // Optionally print the reasons why we could not load it.\n      if (show_warnings)\n        for (w_iter = warnings.begin(); w_iter != warnings.end(); w_iter++) {\n          vw_out() << \"CSM warning: \" << w_iter->getMessage() << std::endl;\n        }\n    } // End loop through models\n  } // End loop through plugins\n\n  // Did not find a match!\n  model_name   = \"\";\n  model_family = \"\";\n  return 0;\n} // End function find_plugin_for_isd\n\nvoid CsmModel::initialize_plugins() {\n\n  // Only let one thread at a time in here.\n  vw::Mutex::Lock lock(csm_init_mutex);\n\n  // If we already have plugins loaded, don't do initialization again.\n  csm::PluginList plugins = csm::Plugin::getList();\n  if (!plugins.empty())\n    return;\n\n  //vw_out() << \"Initializing CSM plugins...\\n\";\n\n  // Find all of the available CSM plugin DLL files.\n  std::vector<std::string> plugin_files;\n  size_t num_plugin_files = find_csm_plugins(plugin_files);\n  //vw_out() << \"Found \" << num_plugin_files << \" CSM plugin files.\\n\";\n\n  // Load all of the plugins.\n  for (size_t i = 0; i < num_plugin_files; i++) {\n    // Get the DLL in memory, causing it to automatically register itself\n    //  with the main Plugin interface.\n    vw_out() << \"Loading CSM plugin: \" << plugin_files[i] << std::endl;\n    boost::dll::shared_library lib_usgs(plugin_files[i]);\n  }\n\n  //csm::Plugin::setDataDirectory(plugin_folder); // Don't think we need this.\n\n  print_available_models();\n}\n\n// Read the semi-major and semi-minor axes\nvoid CsmModel::read_ellipsoid_from_isd(std::string const& isd_path) {\n\n  // Load and parse the json file\n  std::ifstream ifs(isd_path);\n  json json_isd;\n  try {\n    ifs >> json_isd;\n  } catch(...) {\n    vw::vw_throw(vw::ArgumentErr() << \"Cannot open file: \" << isd_path << \"\\n\");\n  }\n\n  // Read the semi-major axis\n  m_semi_major_axis = 0.0;\n  try {\n    m_semi_major_axis = json_isd.at(\"radii\").at(\"semimajor\");\n  } catch (...) {\n  }\n\n  // Read the semi-minor axis\n  m_semi_minor_axis = 0.0;\n  try {\n    m_semi_minor_axis = json_isd.at(\"radii\").at(\"semiminor\");\n  } catch (...) {\n  }\n\n  // Read the unit\n  std::string unit;\n  try {\n    unit = json_isd.at(\"radii\").at(\"unit\");\n  } catch (...) {\n  }\n  boost::to_lower(unit);\n\n  // Convert from km to m if need be\n  if (unit == \"km\") {\n    m_semi_major_axis *= 1000.0;\n    m_semi_minor_axis *= 1000.0;\n  } else if (unit != \"m\") {\n    vw::vw_throw(vw::ArgumentErr() << \"Unknown unit for the ellipsoid radii in \"\n                  << isd_path << \". The read value is: \" << unit);\n  }\n\n  // Sanity check\n  if (m_semi_major_axis <= 0.0 || m_semi_minor_axis <= 0.0)\n    vw::vw_throw(vw::ArgumentErr() << \"Could not read positive semi-major \"\n                 << \"and semi-minor axies from:  \" << isd_path\n                 << \". The read values are: \"\n                 << m_semi_major_axis << ' ' << m_semi_minor_axis);\n}\n\n/// Read and cache the sun position. This is an expensive operation.\n/// TODO(oalexan1): See if one can avoid creating and parsing a string file.\n/// Maybe by now the Sun position is a public member in each model type.\n/// This will work for USGSCSM models, but maybe not for others. It is assumed\n/// here that the sun does not move noticeably in the sky during the brief time\n/// the picture is taken. \n/// TODO(oalexan1): This returns a single Sun position per camera. It appears\n/// that linescan cameras can return a line-dependent Sun position. It is \n/// not clear if that has any value, given how quickly an image is taken.\nvoid readCsmSunPosition(boost::shared_ptr<csm::RasterGM> const& gm_model,\n                        vw::Vector3 & sun_position) {\n\n  if (gm_model.get() == NULL)\n    vw::vw_throw(vw::ArgumentErr()\n                 << \"CsmModel::readCsmSunPosition() failed because \"\n                 << \"the model is not initialized.\\n\");\n\n  std::string modelState = gm_model->getModelState();\n  nlohmann::json j = stateAsJson(modelState);\n  if (j.find(\"m_sunPosition\") == j.end())\n    vw::vw_throw(vw::ArgumentErr()\n                 << \"The Sun position was not found in the CSM model state.\\n\");\n\n  std::vector<double> sun_pos = j[\"m_sunPosition\"].get<std::vector<double>>();\n  if (sun_pos.size() < 3)\n    vw::vw_throw(vw::ArgumentErr()\n                  << \"The Sun position must be a vector of size >= 3.\\n\");\n\n  for (size_t it = 0; it < 3; it++)\n    sun_position[it] = sun_pos[it];\n}\n\n/// Load the camera model from an ISD file or model state.\nvoid CsmModel::load_model(std::string const& isd_path) {\n\n  std::string line;\n  {\n    // Peek inside the file to see if it is an isd or a model state.\n    // A model state file starts with an easily identifiable string.\n    std::ifstream ifs(isd_path);\n    ifs >> line;\n  }\n  bool is_model_state = (line == UsgsAstroFrameSensorModel::_SENSOR_MODEL_NAME     ||\n                         line == UsgsAstroLsSensorModel::_SENSOR_MODEL_NAME        ||\n                         line == UsgsAstroPushFrameSensorModel::_SENSOR_MODEL_NAME ||\n                         line == UsgsAstroSarSensorModel::_SENSOR_MODEL_NAME);\n\n  if (!is_model_state)\n    CsmModel::load_model_from_isd(isd_path);\n  else\n    CsmModel::loadModelFromStateFile(isd_path);\n\n  CsmModel::createApproxCam();\n}\n\n/// Load the model from ISD. Read the ellipsoid, sun position, and\n/// m_plugin_name. \n//\n// See setModelFromStateString() for a different construction method. These must\n// be kept in sync.\nvoid CsmModel::load_model_from_isd(std::string const& isd_path) {\n  // This only happens the first time it is called.\n  initialize_plugins();\n\n  // Load ISD data\n  csm::Isd support_data(isd_path);\n\n  CsmModel::read_ellipsoid_from_isd(isd_path);\n\n  // Check each available CSM plugin until we find one that can handle the ISD.\n  std::string model_name, model_family;\n  const csm::Plugin* csm_plugin = find_plugin_for_isd(support_data, model_name,\n                                                      model_family, false);\n\n  // If we did not find a plugin that would work, go through them again and print error\n  //  messages for each plugin that fails.\n  if (csm_plugin == 0) {\n    find_plugin_for_isd(support_data, model_name, model_family, true);\n    vw::vw_throw(vw::ArgumentErr()\n                 << \"Unable to construct a camera model for the ISD file \"\n                 << isd_path << \" using any of the loaded CSM plugins!\");\n  }\n\n  // Remember the plugin name. It will be needed to add a model state to a cub file.\n  m_plugin_name = csm_plugin->getPluginName();\n\n  // This is verbose\n  //vw::vw_out() << \"Using plugin: \" << this->plugin_name() \n  //             << \" with model name \" << model_name << std::endl;\n\n  // Now try to construct the camera model\n  csm::WarningList warnings;\n  csm::Model* csm_model\n    = csm_plugin->constructModelFromISD(support_data, model_name, &warnings);\n\n  // Error checking\n  csm::WarningList::const_iterator w_iter;\n  for (w_iter = warnings.begin(); w_iter != warnings.end(); w_iter++) {\n    vw_out() << \"CSM warning: \" << w_iter->getMessage() << std::endl;\n  }\n\n  // Handle load failure\n  if (!csm_model)\n    vw::vw_throw(vw::ArgumentErr() << \"Failed to load CSM sensor model from file: \"\n                 << isd_path);\n\n  // TODO: Are all sensor models going to be this type (RasterGM)?\n  //       Otherwise we can use the result of getModelFamily() to choose the class.\n  // Cast the model we got to the child class with the needed functionality.\n  csm::RasterGM* gm_model = dynamic_cast<csm::RasterGM*>(csm_model);\n\n   // Handle load failure\n  if (!gm_model)\n    vw::vw_throw(vw::ArgumentErr() << \"Failed to cast CSM sensor model to raster type!\");\n\n  m_gm_model.reset(gm_model); // The smart pointer will handle memory management\n\n  // This must happen after gm model is set\n  readCsmSunPosition(m_gm_model, m_sun_position);\n\n  // This is a bug fix.\n  normalizeLinescanQuaternions();\n}\n\n/// Load the camera model from a model state written to disk.\n/// A model state is obtained from an ISD model by pre-processing\n/// and combining its data in a form ready to be used.\nvoid CsmModel::loadModelFromStateFile(std::string const& state_file) {\n\n  // Read the state as one string\n  std::ifstream ifs(state_file.c_str());\n  std::string model_state;\n  ifs.seekg(0, std::ios::end);\n  model_state.reserve(ifs.tellg());\n  ifs.seekg(0, std::ios::beg);\n  model_state.assign((std::istreambuf_iterator<char>(ifs)),\n             std::istreambuf_iterator<char>());\n  ifs.close();\n\n  bool recreate_model = true;\n  CsmModel::setModelFromStateString(model_state, recreate_model);\n}\n\n// This should not be used directly. The function setModelFromStateString() \n// below also reads the semi-axes and the Sun position.\ntemplate<class ModelT>\nvoid setModelFromStateStringAux(bool recreate_model,\n                                std::string const& model_state,\n                                boost::shared_ptr<csm::RasterGM> & gm_model) {\n\n  if (recreate_model) {\n\n    csm::RasterGM* new_gm_model = NULL;\n    ModelT * specific_model = new ModelT;\n    specific_model->replaceModelState(model_state);\n    new_gm_model = dynamic_cast<csm::RasterGM*>(specific_model);\n\n    // Handle load failure\n    if (!new_gm_model)\n      vw::vw_throw(vw::ArgumentErr() << \"Failed to cast CSM model to raster type.\");\n\n    // This will wipe any preexisting model. Prior gm_model pointer will become invalid.\n    gm_model.reset(new_gm_model);\n\n  } else {\n\n    // Update existing model. This does not destroy gm_model.\n    ModelT * specific_model = static_cast<ModelT*>(gm_model.get());\n    if (specific_model == NULL)\n      vw::vw_throw(vw::ArgumentErr() << \"Incorrect model type passed in.\\n\");\n    specific_model->replaceModelState(model_state);\n\n  }\n\n  return;\n}\n\n// Ensure the linescan model quaternions are always normalized and do not\n// suddenly flip sign. This is a bug fix.\nvoid CsmModel::normalizeLinescanQuaternions() {\n  throw_if_not_init();\n  UsgsAstroLsSensorModel * ls_model\n    = dynamic_cast<UsgsAstroLsSensorModel*>(m_gm_model.get());\n  if (ls_model != NULL)\n    asp::normalizeQuaternions(ls_model);\n}\n\n/// Load the camera model from a model state written to disk. A model state is\n/// obtained from an ISD model by pre-processing and combining its data in a\n/// form ready to be used. Use recreate_model = false if desired to just update\n/// an existing model.\n///\n/// Read the ellipsoid, sun position, and m_plugin_name. \n///\n/// See also load_model_from_isd() for a different construction method. These\n/// must be kept in sync.\nvoid CsmModel::setModelFromStateString(std::string const& model_state,\n                                       bool recreate_model) {\n\n  // TODO(oalexan1): Use the usgscsm function\n  // constructModelFromState() after that package pushes a new version\n  // (currently there are compile-time issues with it).\n\n  // See which model to load, then cast it to RasterGM. This could\n  // have been simpler if the USGSCSM models shared a base class where\n  // all shared functionality would be shared.\n  if (model_state.rfind(UsgsAstroFrameSensorModel::_SENSOR_MODEL_NAME, 0) == 0) {\n\n    setModelFromStateStringAux<UsgsAstroFrameSensorModel>\n      (recreate_model, model_state, m_gm_model);\n\n  } else if (model_state.rfind(UsgsAstroLsSensorModel::_SENSOR_MODEL_NAME, 0) == 0) {\n\n    setModelFromStateStringAux<UsgsAstroLsSensorModel>\n      (recreate_model, model_state, m_gm_model);\n\n  } else if (model_state.rfind(UsgsAstroPushFrameSensorModel::_SENSOR_MODEL_NAME, 0) == 0) {\n\n    setModelFromStateStringAux<UsgsAstroPushFrameSensorModel>\n      (recreate_model, model_state, m_gm_model);\n\n  } else if (model_state.rfind(UsgsAstroSarSensorModel::_SENSOR_MODEL_NAME, 0) == 0) {\n\n    setModelFromStateStringAux<UsgsAstroSarSensorModel>\n      (recreate_model, model_state, m_gm_model);\n\n  } else {\n    vw::vw_throw(vw::ArgumentErr() << \"Could not create CSM model from state string.\\n\");\n  }\n\n  // Get the plugin name\n  csm::PluginList plugins = csm::Plugin::getList();\n  if (plugins.size() == 0)\n    vw::vw_throw(vw::ArgumentErr() << \"Could not find CSM plugins.\\n\");\n\n  if (plugins.size() > 1)\n    vw::vw_out(vw::WarningMessage)\n      << \"Expected to find one CSM plugin, found: \" << plugins.size() << \".\\n\";\n\n  for (auto iter = plugins.begin(); iter != plugins.end(); iter++) {\n    const csm::Plugin* csm_plugin = (*iter);\n    m_plugin_name = csm_plugin->getPluginName();\n  }\n\n  // Set the semi-axes from json (cannot pull it from the usgs models\n  // as these figure as private in some of them).\n  auto j = stateAsJson(model_state);\n  m_semi_major_axis = j[\"m_majorAxis\"];\n  m_semi_minor_axis = j[\"m_minorAxis\"];\n\n  // Sanity check\n  if (m_semi_major_axis <= 0.0 || m_semi_minor_axis <= 0.0)\n    vw::vw_throw(vw::ArgumentErr() << \"Could not read positive semi-major \"\n                 << \"and semi-minor axies from state string.\");\n\n  // This must happen after gm model is set\n  readCsmSunPosition(m_gm_model, m_sun_position);\n\n  // This is a bug fix.\n  normalizeLinescanQuaternions();\n}\n\nvoid CsmModel::throw_if_not_init() const {\n  if (!m_gm_model)\n    vw_throw(ArgumentErr() << \"CsmModel: Sensor model has not been initialized.\");\n}\n\n// TODO: Check all of the warnings\n\nvw::Vector2 CsmModel::get_image_size() const {\n  throw_if_not_init();\n\n  csm::ImageVector size = m_gm_model->getImageSize();\n  return Vector2(size.samp, size.line);\n}\n\nvw::Vector3 CsmModel::target_radii() const {\n  return vw::Vector3(m_semi_major_axis,  // x\n                     m_semi_major_axis,  // y\n                     m_semi_minor_axis); // z\n}\n\nVector2 CsmModel::point_to_pixel(Vector3 const& point) const {\n  throw_if_not_init();\n\n  csm::EcefCoord  ecef = vectorToEcefCoord(point);\n\n  double achievedPrecision = -1.0;\n  csm::WarningList warnings;\n  csm::WarningList * warnings_ptr = NULL;\n\n  // Do not show warnings, it becomes too verbose\n  bool show_warnings = false;\n  if (show_warnings)\n    warnings_ptr = &warnings;\n\n  csm::ImageCoord imagePt = m_gm_model->groundToImage(ecef, m_desired_precision,\n                               &achievedPrecision, warnings_ptr);\n\n  if (show_warnings) {\n    csm::WarningList::const_iterator w_iter;\n    for (w_iter = warnings.begin(); w_iter != warnings.end(); w_iter++) {\n      vw_out() << \"CSM warning: \" << w_iter->getMessage() << std::endl;\n    }\n  }\n\n  vw::Vector2 pix = imageCoordToVector(imagePt) - ASP_TO_CSM_SHIFT;\n\n  // This is a bugfix for when points far from the field of view project\n  // incorrectly into the camera.\n  if (m_maxApproxCamPixErr > 0)\n    return this->correctWithApproxCam(pix, point);\n\n  return pix;\n}\n\nvw::Vector3 CsmModel::pixel_to_vector(vw::Vector2 const& pix) const {\n  throw_if_not_init();\n\n  csm::ImageCoord imagePt;\n  toCsmPixel(pix, imagePt);\n\n  double achievedPrecision = -1.0; // will be modified in the function\n  csm::EcefLocus locus = m_gm_model->imageToRemoteImagingLocus(imagePt,\n                                                               m_desired_precision,\n                                                               &achievedPrecision);\n  Vector3 dir = ecefVectorToVector(locus.direction);\n  return dir;\n\n#if 0\n  // This alternative approach gives the same results as above, except\n  // for the SAR model, which has curved rays, and for MSL, whose \n  // location is below the zero datum. \n\n  // This code is kept in case it is necessary to revisit the SAR model.\n  // Camera center\n  csm::EcefCoord  ctr = m_gm_model->getSensorPosition(imagePt);\n\n  // Ground point. Note how we use the 0 height above datum.\n  // The precise height value matters only for the SAR model, when the rays\n  // are curved, which violates a fundamental assumption in ASP.\n  double groundHeight      = 0.0;\n  csm::EcefCoord groundPt\n    = m_gm_model->imageToGround(imagePt, groundHeight, m_desired_precision,\n                                 &achievedPrecision);\n\n  // Normalized direction\n  Vector3 dir0 = ecefCoordToVector(groundPt) - ecefCoordToVector(ctr);\n  dir0 = dir0 / norm_2(dir0);\n  return dir0;\n#endif\n\n}\n\nVector3 CsmModel::camera_center(Vector2 const& pix) const {\n  throw_if_not_init();\n\n  csm::ImageCoord imagePt = vectorToImageCoord(pix + ASP_TO_CSM_SHIFT);\n  csm::EcefCoord  ecef    = m_gm_model->getSensorPosition(imagePt);\n\n  return ecefCoordToVector(ecef);\n}\n\n// Apply a transform to the model state in json format\ntemplate<class ModelT>\nvoid applyTransformToState(ModelT const * model,\n                           vw::Matrix4x4 const& transform,\n                           // Output\n                           std::string & modelState) {\n\n  // Applying a scale is not supported in any usgscsm sensors for now.\n  double scale = pow(det(transform), 1.0/3.0);\n  if (std::abs(scale - 1.0) > 1e-6)\n    vw_throw(ArgumentErr()\n             << \"CSM camera models do not support applying a transform with a scale.\\n\");\n\n  // Extract the rotation and convert it to ale::Rotation\n  vw::Matrix3x3 rotation_matrix = submatrix(transform, 0, 0, 3, 3);\n  std::vector<double> rotation_vec;\n  for (int row = 0; row < 3; row++) {\n    for (int col = 0; col < 3; col++) {\n      rotation_vec.push_back(rotation_matrix(row, col));\n    }\n  }\n  ale::Rotation r(rotation_vec);\n\n  // Extract the translation\n  ale::Vec3d t(transform(0, 3), transform(1, 3), transform(2, 3));\n\n  model->applyTransformToState(r, t, modelState);\n\n  return;\n}\n\nvoid applyTransformToState(csm::RasterGM const* gm_model,\n                           vw::Matrix4x4 const& transform,\n                           // Output\n                           std::string & modelState) {\n\n  // Need to consider each model type separately\n  bool success = false;\n  UsgsAstroFrameSensorModel const* frame_model\n    = dynamic_cast<UsgsAstroFrameSensorModel const*>(gm_model);\n  if (!success && frame_model != NULL) {\n    applyTransformToState(frame_model, transform, modelState);\n    success = true;\n  }\n\n  UsgsAstroLsSensorModel const* ls_model\n    = dynamic_cast<UsgsAstroLsSensorModel const*>(gm_model);\n  if (!success && ls_model != NULL) {\n    applyTransformToState(ls_model, transform, modelState);\n    success = true;\n  }\n\n  UsgsAstroPushFrameSensorModel const* pf_model\n    = dynamic_cast<UsgsAstroPushFrameSensorModel const*>(gm_model);\n  if (!success && pf_model != NULL) {\n    applyTransformToState(pf_model, transform, modelState);\n    success = true;\n  }\n\n  UsgsAstroSarSensorModel const* sar_model\n    = dynamic_cast<UsgsAstroSarSensorModel const*>(gm_model);\n  if (!success && sar_model != NULL) {\n    applyTransformToState(sar_model, transform, modelState);\n    success = true;\n  }\n\n  if (!success)\n    vw_throw(vw::ArgumentErr()\n             << \"CsmModel::applyTransformedState(): Unknown CSM model type.\\n\");\n}\n\n// Save model state\nvoid CsmModel::saveState(std::string const& json_state_file) const {\n\n  throw_if_not_init();\n\n  csm::RasterGM const* gm_model\n    = dynamic_cast<csm::RasterGM const*>(this->m_gm_model.get());\n\n  std::string modelState = gm_model->getModelState();\n  std::ofstream ofs(json_state_file.c_str());\n  ofs << modelState << std::endl;\n  ofs.close();\n\n  return;\n}\n\n// Apply a transform to a CSM model\nvoid CsmModel::applyTransform(vw::Matrix4x4 const& transform) {\n\n  throw_if_not_init();\n\n  csm::RasterGM const* gm_model\n    = dynamic_cast<csm::RasterGM const*>(this->m_gm_model.get());\n\n  std::string modelState = gm_model->getModelState();\n\n  applyTransformToState(gm_model, transform,\n                        // Output\n                        modelState);\n\n  bool recreate_model = false; // don't want to destroy the model\n  setModelFromStateString(modelState, recreate_model);\n}\n\nstd::string CsmModel::plugin_name() const {\n  if (m_plugin_name.empty())\n    vw_throw(ArgumentErr() << \"CsmModel: Plugin name has not been set yet.\");\n  return m_plugin_name;\n}\n\nstd::string CsmModel::model_name() const {\n  throw_if_not_init();\n  return m_gm_model->getModelName();\n}\n\nstd::string CsmModel::model_state() const {\n  throw_if_not_init();\n  return m_gm_model->getModelState();\n}\n\n// Convert -0 to 0. The -0 seems to be a quick. Have to return a copy \n// due to these being json fields.\nstd::vector<double> stripSign(std::vector<double> const & vals) {\n  std::vector<double> out_vals = vals;\n  for (size_t i = 0; i < vals.size(); i++)\n    if (std::abs(vals[i]) < 1e-16)\n      out_vals[i] = 0.0;\n\n  return out_vals;\n}\n\n// Create a CSM frame camera model. This requires a lot of bookkeeping. Use\n// cam_test to compare such model with ASP's Pinhole model with same data. That\n// is created as: vw::camera::PinholeModel pin(C, R, focal_length,\n// focal_length, cx, cy);\nvoid CsmModel::createFrameModel(int cols, int rows,  // in pixels\n        double cx, double cy, // col and row of optical center, in units of pixel pitch\n        double focal_length,  // in units of pixel pitch\n        double semi_major_axis, double semi_minor_axis, // in meters\n        vw::Vector3 const& C, // camera center\n        vw::Matrix3x3 const& R, // camera to world rotation matrix\n        std::string const& distortionType,\n        std::vector<double> const& distortion,\n        double ephem_time,\n        vw::Vector3 const& sun_position,\n        std::string const& serial_number,\n        std::string const& target_name,\n        double pixel_pitch) {\n\n  // Make a copy of R as an Eigen matrix, and convert to quaternion\n  Eigen::Matrix3d R_copy;\n  for (int r = 0; r < 3; r++) {\n    for (int c = 0; c < 3; c++)\n      R_copy(r, c) = R(r, c);\n  }\n  Eigen::Quaterniond q(R_copy);\n\n  // Creating a frame model requires populating a json file\n  UsgsAstroFrameSensorModel cam;\n  cam.reset();\n  std::string state = cam.getModelState();\n  nlohmann::json j = stateAsJson(state);\n\n  j[\"m_sensorName\"] = \"csm\";\n  j[\"m_platformName\"] = \"csm\";\n  j[\"m_majorAxis\"] = semi_major_axis;\n  j[\"m_minorAxis\"] = semi_minor_axis;\n  j[\"m_minElevation\"] = -10000.0; // -10 km\n  j[\"m_maxElevation\"] = 10000.0;  // 10 km\n\n  // Here a particular choice is assumed for converting from sensor plane\n  // coordinates to pixels, which is compatible with the ASP Pinhole model.\n  j[\"m_iTransL\"] = std::vector<double>({0.0, 0.0, 1.0 / pixel_pitch});\n  j[\"m_iTransS\"] = std::vector<double>({0.0, 1.0 / pixel_pitch, 0.0});\n  j[\"m_focalLength\"] = focal_length;\n\n  // Note the order (row, col), and how we must divide by pixel pitch\n  j[\"m_ccdCenter\"] = std::vector<double>({cy / pixel_pitch, cx / pixel_pitch});\n  j[\"m_pixelPitch\"] = pixel_pitch;\n  j[\"m_nLines\"] = rows;\n  j[\"m_nSamples\"] = cols;\n\n  // Set the distortion.  \n  if (distortionType.empty()) {\n    // Let default distortion be radial, with zero distortion. Avoid transverse\n    // distortion, as that needs a lot of care in setting the coefficients.\n    j[\"m_distortionType\"] = DistortionType::RADIAL;\n    j[\"m_opticalDistCoeffs\"] = std::vector<double>(3, 0.0);\n  } else if (distortionType == \"radial\") {\n    if (distortion.size() != 3)\n      vw::vw_throw(ArgumentErr()\n                   << \"Distortion coefficients for the radial distortion \"\n                   << \"model must be of size 3, in the order k1, k2, k3. \"\n                   << \"Got the size: \" << distortion.size() << \"\\n\");\n    j[\"m_distortionType\"] = DistortionType::RADIAL;\n    j[\"m_opticalDistCoeffs\"] = distortion;\n  } else if (distortionType == \"radtan\") {\n    if (distortion.size() != 5)\n      vw::vw_throw(ArgumentErr()\n                   << \"Distortion coefficients for the radtan distortion \"\n                   << \"model must be of size 5, in the order k1, k2, p1, p2, k3. \"\n                   << \"Got the size: \" << distortion.size() << \"\\n\");\n    j[\"m_distortionType\"] = DistortionType::RADTAN;\n    j[\"m_opticalDistCoeffs\"] = distortion;\n  } else if (distortionType == \"transverse\") {\n    j[\"m_distortionType\"] = DistortionType::TRANSVERSE;\n    if (distortion.size() != 20)\n      vw::vw_throw(ArgumentErr()\n                   << \"Distortion coefficients for the transverse distortion \"\n                   << \"model must be of size 20. Thse are the coefficients of a \"\n                   << \"polynomial of degree 3 in x and y. \"\n                   << \"Got the size: \" << distortion.size() << \"\\n\");\n    j[\"m_opticalDistCoeffs\"] = distortion;\n  } else {\n    vw_throw(ArgumentErr() << \"Unknown distortion type: \" << distortionType << \".\\n\");\n  }\n\n  // Need to apply this offset to make CSM agree with ASP's Pinhole\n  j[\"m_startingDetectorLine\"] = -0.5;\n  j[\"m_startingDetectorSample\"] = -0.5;\n\n  // Part of the API    \n  j[\"m_focalLengthEpsilon\"] = 1.0;\n\n  // Copied from UsgsAstroFrameSensorModel.cpp  \n  double det = j[\"m_iTransL\"][1].get<double>() * j[\"m_iTransS\"][2].get<double>()\n                - j[\"m_iTransL\"][2].get<double>() * j[\"m_iTransS\"][1].get<double>();\n  j[\"m_transX\"][1] = j[\"m_iTransL\"][1].get<double>() / det;\n  j[\"m_transX\"][2] = -j[\"m_iTransS\"][1].get<double>() / det;\n  j[\"m_transX\"][0] = -(j[\"m_transX\"][1].get<double>() * j[\"m_iTransL\"][0].get<double>()\n                       + j[\"m_transX\"][2].get<double>() * j[\"m_iTransS\"][0].get<double>());\n  j[\"m_transY\"][1] = -j[\"m_iTransL\"][2].get<double>() / det;\n  j[\"m_transY\"][2] = j[\"m_iTransS\"][2].get<double>() / det;\n  j[\"m_transY\"][0] = -(j[\"m_transY\"][1].get<double>() * j[\"m_iTransL\"][0].get<double>()\n                       + j[\"m_transY\"][2].get<double>() * j[\"m_iTransS\"][0].get<double>());\n\n  // Fix a quirk with -0. Cannot modify in-place the json fields, hence the copy.\n  j[\"m_transX\"] = stripSign(j[\"m_transX\"]);\n  j[\"m_transY\"] = stripSign(j[\"m_transY\"]);\n\n  // Set the translation and quaternion. The quaternion is stored as x, y, z, w.\n  j[\"m_currentParameterValue\"] = std::vector<double>({C[0], C[1], C[2],\n                                                     q.x(), q.y(), q.z(), q.w()});\n\n  j[\"m_ephemerisTime\"] = ephem_time;\n  j[\"m_sunPosition\"]   = std::vector<double>({sun_position[0],\n                                              sun_position[1],\n                                              sun_position[2]});\n  j[\"m_imageIdentifier\"] = serial_number;\n\n  // Set the target name in the json\n  j[\"m_targetName\"] = target_name;\n\n  // Update the state string and create the CSM model\n  state = cam.getModelName() + \"\\n\" + j.dump(2);\n  bool recreate_model = true;\n  setModelFromStateString(state, recreate_model);\n\n  // This is a temporary fix for the function replaceModelState()\n  // in UsgsAstroFrameSensorModel forgetting the target name.\n  // Pull request submitted.\n  set_target_name(target_name);\n}\n\n// Create a CSM frame camera model from pinhole camera model.\nvoid CsmModel::createFrameModel(vw::camera::PinholeModel const& pin_model,\n                                int cols, int rows,  // in pixels\n                                double semi_major_axis, double semi_minor_axis, // in meters\n                                std::string const& distortionType,\n                                std::vector<double> const& distortion,\n                                double ephem_time,\n                                vw::Vector3 const& sun_position,\n                                std::string const& serial_number,\n                                std::string const& target_name) {\n\n  // These are all in units of pixel pitch\n  vw::Vector2 focal_length = pin_model.focal_length();\n  vw::Vector2 opt_ctr = pin_model.point_offset();\n  double pixel_pitch = pin_model.pixel_pitch();\n\n  // Find the average focal length\n  double f = (focal_length[0] + focal_length[1])/2.0;\n\n  this->createFrameModel(cols, rows, opt_ctr[0], opt_ctr[1], f,\n                         semi_major_axis, semi_minor_axis,\n                         pin_model.camera_center(),\n                         pin_model.get_rotation_matrix(),\n                         distortionType, distortion,\n                         ephem_time, sun_position,\n                         serial_number, target_name,\n                         pixel_pitch);\n}\n\n// Approximate conversion to a pinhole model. Will be exact only for the radtan\n// lens distortion and no unusual line or sample adjustments in CSM. Compare\n// these with cam_test.\n// TODO(oalexan1): This code is not used and not tested.\nvw::camera::PinholeModel CsmModel::pinhole() const {\n\n  // Camera center\n  double x = 0, y = 0, z = 0;\n  this->frame_position(x, y, z);\n  vw::Vector3 cam_ctr(x, y, z);\n\n  // Camera orientation\n  double qx = 0, qy = 0, qz = 0, qw = 0;\n  this->frame_quaternion(qx, qy, qz, qw);\n  Eigen::Quaterniond q(qw, qx, qy, qz);\n  Eigen::Matrix3d R = q.toRotationMatrix();\n  vw::Matrix3x3 cam_rot;\n  for (int r = 0; r < 3; r++)\n    for (int c = 0; c < 3; c++)\n      cam_rot(r, c) = R(r, c);\n\n  // Focal length, in units of pixel pitch\n  double f = this->focal_length();\n\n  // CSM optical center is always in pixels. Have to convert to pixel pitch units.\n  vw::Vector2 optical_center = this->optical_center() * this->frame_pixel_pitch();\n\n  // Create a pinhole model with zero distortion\n  vw::camera::PinholeModel pin(cam_ctr, cam_rot, f, f,\n                               optical_center[0], optical_center[1],\n                               NULL, this->frame_pixel_pitch());\n\n  // Distortion\n  DistortionType dist_type = this->distortion_type();\n  if (dist_type == DistortionType::RADTAN) {\n\n    // Must have 5 coefficients\n    std::vector<double> dist = this->distortion();\n    if (dist.size() != 5)\n      vw_throw(ArgumentErr() << \"Expected 5 distortion coefficients for radtan model.\\n\");\n\n    // Copy to VW vector\n    vw::Vector<double> coeffs;\n    coeffs.set_size(dist.size());\n    for (size_t i = 0; i < dist.size(); i++)\n      coeffs[i] = dist[i];\n\n    vw::camera::TsaiLensDistortion distModel(coeffs);\n    pin.set_lens_distortion(&distModel);\n  }\n\n  return pin;\n}\n\n// Must have some macros here to avoid a lot of boilerplate code\n#define CSM_FRAME_GET(PARAM, NAME, VAL)                           \\\n  /* Try frame */                                                 \\\n  success = false;                                                \\\n  csm::RasterGM const* gm_model                                   \\\n    = dynamic_cast<csm::RasterGM const*>(this->m_gm_model.get()); \\\n  {                                                               \\\n    UsgsAstroFrameSensorModel const* frame_model                  \\\n      = dynamic_cast<UsgsAstroFrameSensorModel const*>(gm_model); \\\n    if (!success && frame_model != NULL) {                        \\\n      VAL = frame_model->PARAM;                                   \\\n      success = true;                                             \\\n    }                                                             \\\n  }\n\n#define CSM_FRAME_SET(PARAM, NAME, VAL)                     \\\n  success = false;                                          \\\n  csm::RasterGM * gm_model                                  \\\n    = dynamic_cast<csm::RasterGM*>(this->m_gm_model.get()); \\\n  /* Try frame */                                           \\\n  {                                                         \\\n    UsgsAstroFrameSensorModel * frame_model                 \\\n      = dynamic_cast<UsgsAstroFrameSensorModel*>(gm_model); \\\n    if (!success && frame_model != NULL) {                  \\\n      frame_model->PARAM = VAL;                             \\\n      success = true;                                       \\\n   }                                                        \\\n  }\n\n#define CSM_LINESCAN_GET(PARAM, NAME, VAL)                        \\\n  /* Try linescan */                                              \\\n  success = false;                                                \\\n  {                                                               \\\n    UsgsAstroLsSensorModel const* ls_model                        \\\n      = dynamic_cast<UsgsAstroLsSensorModel const*>(gm_model);    \\\n    if (!success && ls_model != NULL) {                           \\\n      VAL = ls_model->PARAM;                                      \\\n      success = true;                                             \\\n    }                                                             \\\n  }                                                               \\\n  /* Fail otherwise. There's no chance we will need this */       \\\n  /* with SAR or pushbroom models */                              \\\n  if (!success)                                                   \\\n    vw_throw(vw::ArgumentErr()                                    \\\n         << \"CSM model \" << NAME << \" can be handled only \"       \\\n         << \"for linescan and frame cameras.\\n\");\n\n#define CSM_LINESCAN_SET(PARAM, NAME, VAL)                  \\\n  /* Try linescan */                                        \\\n  success = false;                                          \\\n  {                                                         \\\n    UsgsAstroLsSensorModel * ls_model                       \\\n      = dynamic_cast<UsgsAstroLsSensorModel*>(gm_model);    \\\n    if (!success && ls_model != NULL) {                     \\\n      ls_model->PARAM = VAL;                                \\\n      success = true;                                       \\\n    }                                                       \\\n  }                                                         \\\n  /* Fail otherwise. There's no chance we will need this */ \\\n  /* with SAR or pushbroom models. */                       \\\n  if (!success)                                             \\\n    vw_throw(vw::ArgumentErr()                              \\\n         << \"CSM model \" << NAME << \" can be handled only \" \\\n         << \"for linescan and frame cameras.\\n\");\n\n// Get distortion\nstd::vector<double> CsmModel::distortion() const {\n  std::vector<double> dist;\n  bool success = false;\n  CSM_FRAME_GET(m_opticalDistCoeffs, \"distortion\", dist)\n  if (success)\n    return dist;\n  CSM_LINESCAN_GET(m_opticalDistCoeffs, \"distortion\", dist)\n  return dist;\n}\n\n// Get distortion type\nDistortionType CsmModel::distortion_type() const {\n  DistortionType dist_type;\n  bool success = false;\n  CSM_FRAME_GET(m_distortionType, \"distortion type\", dist_type)\n  if (success)\n    return dist_type;\n  CSM_LINESCAN_GET(m_distortionType, \"distortion type\", dist_type)\n  return dist_type;\n}\n\n// Set distortion type\nvoid CsmModel::set_distortion_type(DistortionType dist_type) {\n  bool success = false;\n  CSM_FRAME_SET(m_distortionType, \"distortion type\", dist_type)\n  if (success)\n    return;\n  CSM_LINESCAN_SET(m_distortionType, \"distortion type\", dist_type)\n  return;\n}\n\n// Set camera position in ECEF (only for frame cameras)\nvoid CsmModel::set_frame_position(double x, double y, double z) {\n\n  throw_if_not_init();\n\n  UsgsAstroFrameSensorModel * frame_model\n      = dynamic_cast<UsgsAstroFrameSensorModel*>(m_gm_model.get());\n  if (frame_model == NULL)\n    vw_throw(ArgumentErr()\n             << \"CsmModel: Cannot set camera position for non-frame camera.\\n\");\n\n  frame_model->m_currentParameterValue[0] = x;\n  frame_model->m_currentParameterValue[1] = y;\n  frame_model->m_currentParameterValue[2] = z;\n\n  return;\n}\n\n// Get the camera position in ECEF (only for frame cameras)\nvoid CsmModel::frame_position(double & x, double & y, double & z) const {\n\n  throw_if_not_init();\n\n  UsgsAstroFrameSensorModel const* frame_model\n      = dynamic_cast<UsgsAstroFrameSensorModel const*>(m_gm_model.get());\n  if (frame_model == NULL)\n    vw_throw(ArgumentErr() << \"CsmModel: Cannot get camera position for non-frame camera.\\n\");\n\n  x = frame_model->m_currentParameterValue[0];\n  y = frame_model->m_currentParameterValue[1];\n  z = frame_model->m_currentParameterValue[2];\n\n  return;\n}\n\n// Set the camera quaternion (only for frame cameras)\nvoid CsmModel::set_frame_quaternion(double qx, double qy, double qz, double qw) {\n\n  throw_if_not_init();\n\n  UsgsAstroFrameSensorModel * frame_model\n      = dynamic_cast<UsgsAstroFrameSensorModel*>(m_gm_model.get());\n  if (frame_model == NULL)\n    vw_throw(ArgumentErr() << \"CsmModel: Cannot set camera quaternion for non-frame camera.\\n\");\n\n  frame_model->m_currentParameterValue[3] = qx;\n  frame_model->m_currentParameterValue[4] = qy;\n  frame_model->m_currentParameterValue[5] = qz;\n  frame_model->m_currentParameterValue[6] = qw;\n\n  return;\n}\n\n// Get the camera quaternion (only for frame cameras)\nvoid CsmModel::frame_quaternion(double & qx, double & qy, double & qz, double & qw) const {\n\n  throw_if_not_init();\n\n  UsgsAstroFrameSensorModel const* frame_model\n      = dynamic_cast<UsgsAstroFrameSensorModel const*>(m_gm_model.get());\n  if (frame_model == NULL)\n    vw_throw(ArgumentErr()\n             << \"CsmModel: Cannot get camera quaternion for non-frame camera.\\n\");\n\n  qx = frame_model->m_currentParameterValue[3];\n  qy = frame_model->m_currentParameterValue[4];\n  qz = frame_model->m_currentParameterValue[5];\n  qw = frame_model->m_currentParameterValue[6];\n\n  return;\n}\n\n// Get the camera position in ECEF (only for frame cameras)\ndouble CsmModel::frame_pixel_pitch() const {\n\n  throw_if_not_init();\n\n  UsgsAstroFrameSensorModel const* frame_model\n      = dynamic_cast<UsgsAstroFrameSensorModel const*>(m_gm_model.get());\n  if (frame_model == NULL)\n    vw_throw(ArgumentErr()\n             << \"CsmModel: Cannot get pixel pitch for non-frame camera.\\n\");\n\n  // Check that m_iTransL and m_iTransS are set as in createFrameModel()\n  if (frame_model->m_iTransL[0] != 0.0 || frame_model->m_iTransL[1] != 0.0)\n    vw_throw(ArgumentErr()\n             << \"CsmModel: m_iTransL must have first two elements equal to zero.\\n\");\n  if (frame_model->m_iTransS[0] != 0.0 || frame_model->m_iTransS[2] != 0.0)\n    vw_throw(ArgumentErr()\n             << \"CsmModel: m_iTransS must have first and third elements equal to zero.\\n\");\n  if (frame_model->m_iTransL[2] <= 0.0 ||\n      frame_model->m_iTransS[1] <= 0.0 ||\n      frame_model->m_iTransL[2] != frame_model->m_iTransS[1]) {\n    vw_throw(ArgumentErr()\n             << \"CsmModel: m_iTransL[2] and m_iTransS[1] must be positive and equal.\\n\");\n  }\n\n  return (1.0/frame_model->m_iTransL[2] + 1.0/frame_model->m_iTransS[1]) / 2.0;\n}\n\n// Set quaternions (only for linescan cameras)\nvoid CsmModel::set_linescan_quaternions(std::vector<double> const& quaternions) {\n\n  throw_if_not_init();\n\n  csm::RasterGM * gm_model = dynamic_cast<csm::RasterGM*>(this->m_gm_model.get());\n\n  int num_quaternions = quaternions.size(); // total number of coefficients\n  bool success = false;\n  CSM_LINESCAN_SET(m_numQuaternions, \"num quaternions\", num_quaternions)\n  CSM_LINESCAN_SET(m_quaternions, \"quaternions\", quaternions)\n}\n\n// Set the distortion. Need to consider each model type separately.\nvoid CsmModel::set_distortion(std::vector<double> const& dist) {\n  bool success = false;\n  CSM_FRAME_SET(m_opticalDistCoeffs, \"distortion\", dist)\n  if (success)\n    return;\n  CSM_LINESCAN_SET(m_opticalDistCoeffs, \"distortion\", dist)\n  return;\n}\n\n// Get the focal length\ndouble CsmModel::focal_length() const {\n  double focal_length = 0.0;\n  bool success = false;\n  CSM_FRAME_GET(m_focalLength, \"focal length\", focal_length)\n  if (success)\n    return focal_length;\n  CSM_LINESCAN_GET(m_focalLength, \"focal length\", focal_length)\n  return focal_length;\n}\n\n// Set the focal length\nvoid CsmModel::set_focal_length(double focal_length) {\n  bool success = false;\n  CSM_FRAME_SET(m_focalLength, \"focal length\", focal_length)\n  if (success)\n    return;\n  CSM_LINESCAN_SET(m_focalLength, \"focal length\", focal_length)\n  return;\n}\n\n// Get the optical center as sample, line. Different logic is needed for frame\n// and linescan cameras. Will return (m_ccdCenter[1], m_ccdCenter[0]) for frame,\n// and (m_detectorSampleOrigin, m_detectorLineOrigin) for linescan.\n// This is always in units of pixels, not mm.\nvw::Vector2 CsmModel::optical_center() const {\n  vw::Vector2 optical_center;\n\n  std::vector<double> ccd_center;\n  bool success = false;\n  CSM_FRAME_GET(m_ccdCenter, \"optical center\", ccd_center)\n  if (success)\n    return vw::Vector2(ccd_center[1], ccd_center[0]); // note the order (sample, line)\n\n  CSM_LINESCAN_GET(m_detectorSampleOrigin, \"detector sample\", optical_center[0])\n  CSM_LINESCAN_GET(m_detectorLineOrigin,   \"detector line\",   optical_center[1])\n\n  return optical_center;\n}\n\n// Set the optical center as sample, line. Different logic is needed for frame\n// and linescan cameras.\nvoid CsmModel::set_optical_center(vw::Vector2 const& optical_center) {\n  bool success = false;\n  auto ccd_center = std::vector<double>({optical_center[1], optical_center[0]});\n  CSM_FRAME_SET(m_ccdCenter, \"optical center\", ccd_center)\n  if (success)\n    return;\n\n  CSM_LINESCAN_SET(m_detectorSampleOrigin, \"detector sample\", optical_center[0])\n  CSM_LINESCAN_SET(m_detectorLineOrigin,   \"detector line\",   optical_center[1])\n\n  return;\n}\n\n// Get quaternions (only for linescan cameras)\nstd::vector<double> CsmModel::linescan_quaternions() const {\n\n  throw_if_not_init();\n  csm::RasterGM * gm_model = dynamic_cast<csm::RasterGM*>(this->m_gm_model.get());\n\n  std::vector<double> quaternions;\n  bool success = false;\n  CSM_LINESCAN_GET(m_quaternions, \"quaternions\", quaternions)\n  return quaternions;\n}\n\n// Set target name (only for frame cameras)\nvoid CsmModel::set_target_name(std::string const& target_name) {\n\n  throw_if_not_init();\n\n  UsgsAstroFrameSensorModel * frame_model\n      = dynamic_cast<UsgsAstroFrameSensorModel*>(m_gm_model.get());\n  if (frame_model != NULL)\n    frame_model->m_targetName = target_name;\n\n  return;\n}\n\n// Get target name (only for frame cameras)\nstd::string CsmModel::target_name() const {\n\n  throw_if_not_init();\n\n  UsgsAstroFrameSensorModel const* frame_model\n      = dynamic_cast<UsgsAstroFrameSensorModel const*>(m_gm_model.get());\n  if (frame_model != NULL)\n    return frame_model->m_targetName;\n\n  // Fallback measure\n  return \"\";\n}\n\n// Create a deep copy of the model, so don't just copy the shared pointer.\nvoid CsmModel::deep_copy(boost::shared_ptr<CsmModel> & copy) const {\n  // Initialize the output\n  copy = boost::make_shared<CsmModel>();\n  // Then make a deep copy\n  this->deep_copy(*copy.get());\n}\n\nvoid CsmModel::deep_copy(CsmModel & copy) const {\n\n  throw_if_not_init();\n\n  // Start with a shallow copy. Then make a deep copy of m_gm_model.\n  copy = *this;\n\n  // Frame case\n  UsgsAstroFrameSensorModel const* frame_model\n    = dynamic_cast<UsgsAstroFrameSensorModel const*>(m_gm_model.get());\n  if (frame_model != NULL) {\n    UsgsAstroFrameSensorModel * new_frame_model\n      = new UsgsAstroFrameSensorModel(*frame_model);\n    copy.m_gm_model.reset(new_frame_model);\n    return;\n  }\n\n  // Linescan case\n  UsgsAstroLsSensorModel const* ls_model\n    = dynamic_cast<UsgsAstroLsSensorModel const*>(m_gm_model.get());\n  if (ls_model != NULL) {\n    UsgsAstroLsSensorModel * new_ls_model = new UsgsAstroLsSensorModel(*ls_model);\n    copy.m_gm_model.reset(new_ls_model);\n    return;\n  }\n\n  // Pushframe case\n  UsgsAstroPushFrameSensorModel const* pf_model\n    = dynamic_cast<UsgsAstroPushFrameSensorModel const*>(m_gm_model.get());\n  if (pf_model != NULL) {\n    UsgsAstroPushFrameSensorModel * new_pf_model\n      = new UsgsAstroPushFrameSensorModel(*pf_model);\n    copy.m_gm_model.reset(new_pf_model);\n    return;\n  }\n\n  // SAR case\n  UsgsAstroSarSensorModel const* sar_model\n    = dynamic_cast<UsgsAstroSarSensorModel const*>(m_gm_model.get());\n  if (sar_model != NULL) {\n    UsgsAstroSarSensorModel * new_sar_model = new UsgsAstroSarSensorModel(*sar_model);\n    copy.m_gm_model.reset(new_sar_model);\n    return;\n  }\n\n  // Throw an error\n  vw_throw(ArgumentErr() << \"CsmModel::deep_copy(): Unknown CSM model type.\\n\");\n}\n\nvw::Vector3 CsmModel::sun_position() const {\n  if (m_sun_position == vw::Vector3())\n    vw::vw_throw(vw::ArgumentErr()\n                 << \"CsmModel::sun_position() returns the Sun position as being \"\n                 << \"at the planet center. This is a programmer error.\\n\");\n  return m_sun_position;\n}\n\nbool CsmModel::isFrameCam() const {\n  throw_if_not_init();\n  csm::RasterGM const* gm_model\n    = dynamic_cast<csm::RasterGM const*>(this->m_gm_model.get());\n  if (gm_model == NULL)\n    return false;\n  UsgsAstroFrameSensorModel const* frame_model\n    = dynamic_cast<UsgsAstroFrameSensorModel const*>(gm_model);\n  if (frame_model == NULL)\n    return false;\n\n  return true;\n}\n\n// Get the datum from the CSM model. It is suggested to use if possible\n// the function StereoSessionCsm::get_datum() which calls this one, as\n// that one also knows about the image and can find the datum name.\n// If the spheroid name is not known, use \"unknown\".\nvw::cartography::Datum CsmModel::get_datum_csm(std::string spheroid_name,\n                                               bool use_sphere_for_non_earth) const {\n\n  std::string datum_name = \"D_\" + spheroid_name; // may be refined later\n\n  // Read the ellipsoid radii\n  vw::Vector3 radii = this->target_radii();\n  double radius1 = (radii[0] + radii[1]) / 2; // average the x and y axes (semi-major) \n  double radius2 = radius1;\n\n  // Auto-guess the datum if not available\n  vw::cartography::Datum wgs84(\"WGS84\");\n  vw::cartography::Datum moon(\"D_MOON\");\n  vw::cartography::Datum mars(\"D_MARS\");\n  bool is_wgs84 = (std::abs(wgs84.semi_major_axis() - radius1)  < 1e-7 &&\n                   std::abs(wgs84.semi_minor_axis() - radii[2]) < 1e-7);\n  bool is_moon =  (std::abs(moon.semi_major_axis()  - radius1)  < 1e-7 &&\n                   std::abs(moon.semi_minor_axis()  - radii[2]) < 1e-7);\n  bool is_mars =  (std::abs(mars.semi_major_axis()  - radius1)  < 1e-7 &&\n                   std::abs(mars.semi_minor_axis()  - radii[2]) < 1e-7);\n\n  if (boost::to_lower_copy(spheroid_name).find(\"unknown\") != std::string::npos ||\n      spheroid_name.empty()) {\n    // Unknown datum. Try to fill in the name from above.\n    if (is_wgs84)\n      return wgs84;\n    if (is_moon)\n      return moon;\n    if (is_mars)\n      return mars;\n  }\n\n  // For Earth always use two radii. The logic below should distinguish Venus.\n  bool has_earth_radius = (std::abs(radius1/wgs84.semi_major_axis() - 1.0) < 0.05);\n  if (!use_sphere_for_non_earth || has_earth_radius)\n    radius2 = radii[2]; // let the semi-minor axis be distinct from the semi-major axis\n\n  vw::cartography::Datum datum(datum_name, spheroid_name,\n                               \"Reference Meridian\", radius1, radius2, 0);\n\n  return datum;\n\n}\n\n// Create a projective approximation of the camera, if linescan and having\n// radtan distortion. This helps project into the camera ground points very\n// far from the field of view. See the .h file for more info. Code adapted from\n// UsgsAstroLsSensorModel.cc.\n// It may work better to compare the linescan model with distortion with the one\n// without distortion. This may be slower though.\nvoid CsmModel::createApproxCam() {\n\n  throw_if_not_init();\n  UsgsAstroLsSensorModel * ls_model\n    = dynamic_cast<UsgsAstroLsSensorModel*>(m_gm_model.get());\n  if (ls_model == NULL)\n    return;\n  if (ls_model->m_distortionType != DistortionType::RADTAN)\n    return;\n\n  csm::EcefCoord refPt = m_gm_model->getReferencePoint();\n  double desired_precision = 1e-3;\n  double height = computeEllipsoidElevation(refPt.x, refPt.y, refPt.z,\n                                            m_semi_major_axis, m_semi_minor_axis,\n                                            desired_precision);\n  if (std::isnan(height))\n    return;\n\n  vw::Vector2 imageSize = CsmModel::get_image_size();\n  double numCols = imageSize[0];\n  double numRows = imageSize[1];\n\n  // Use 10 samples along each row and column\n  int numSamples = 10.0;\n\n  // Sample at two heights (these get added to the ellipsoid height from above).\n  std::vector<double> height_delta = {-100.0, 100.0};\n  std::vector<vw::Vector2> imagePixels;\n  std::vector<vw::Vector3> groundPts;\n\n  // Iterate over height_delta \n  for (size_t ht_iter = 0; ht_iter < height_delta.size(); ht_iter++) {\n\n    double curr_height = height + height_delta[ht_iter];\n\n    // Iterate over the samples for given height  \n    for (int col_samp = 0; col_samp < numSamples; col_samp++) {\n      for (int row_samp = 0; row_samp < numSamples; row_samp++) {\n\n        vw::Vector2 pix((numCols - 1.0) * (double(col_samp) / (numSamples - 1.0)),\n                        (numRows - 1.0) * (double(row_samp) / (numSamples - 1.0)));\n        vw::Vector3 xyz =\n          vw::cartography::datum_intersection(m_semi_major_axis + curr_height,\n                                              m_semi_minor_axis + curr_height,\n                                              this->camera_center(pix),\n                                              this->pixel_to_vector(pix));\n\n        // Print a warning and quit\n        if (xyz == vw::Vector3()) {\n          vw::vw_out(vw::WarningMessage)\n            << \"Failed to create an approximate camera model that may help \"\n            << \"with projecting into the camera pixels far from the field of view.\";\n            return;\n        }\n\n        imagePixels.push_back(pix);\n        groundPts.push_back(xyz);\n      } // end iterate over rows\n    } // end iterate over columns\n  } // end iterate over height deltas\n\n  asp::calcProjTrans(imagePixels, groundPts, m_approxCamCoeffs);\n\n  // Test. Iterate over xyz, find pixel, compare.\n  m_maxApproxCamPixErr = 0.0;\n  for (size_t i = 0; i < imagePixels.size(); i++) {\n    vw::Vector2 pix = imagePixels[i];\n    vw::Vector3 xyz = groundPts[i];\n    vw::Vector2 pix2 = asp::applyProjTrans(xyz, m_approxCamCoeffs);\n\n    double err = vw::math::norm_2(pix - pix2);\n    m_maxApproxCamPixErr = std::max(m_maxApproxCamPixErr, err);\n  }\n  m_maxApproxCamPixErr = std::max(m_maxApproxCamPixErr, 10.0); // ensure it is not small\n}\n\n// This is a bugfix for when points far from the field of view project\n// incorrectly into the camera.\nvw::Vector2 CsmModel::correctWithApproxCam(vw::Vector2 const& pix,\n                                           vw::Vector3 const& xyz) const {\n\n  // Find the approximate projection based on a projective transform\n  vw::Vector2 apix = asp::applyProjTrans(xyz, m_approxCamCoeffs);\n\n  // If the exact pixel is in the image box, and the approx one is out of the\n  // box, need a closer study.\n  vw::Vector2 imageSize = this->get_image_size();\n  bool pixIn = (0 <= pix[0] && pix[0] < imageSize[0] &&\n                0 <= pix[1] && pix[1] < imageSize[1]);\n  bool apixIn = (0 <= apix[0] && apix[0] < imageSize[0] &&\n                 0 <= apix[1] && apix[1] < imageSize[1]);\n\n  if (pixIn && !apixIn) {\n\n    // Likely the exact projection is not accurate\n    double dist = vw::math::norm_2(pix - apix);\n    if (m_maxApproxCamPixErr > 0 && dist > 1.5 * m_maxApproxCamPixErr) {\n\n      double gsd = 0.0;\n      UsgsAstroLsSensorModel * ls_model\n          = dynamic_cast<UsgsAstroLsSensorModel*>(m_gm_model.get());\n      if (ls_model != NULL)\n        gsd = ls_model->m_gsd;\n\n      if (gsd > 0) {\n        // Do a geometric check. Project from the camera to the ground and see\n        // if we get close enough to the input xyz.\n        double dist_to_ground = vw::math::norm_2(xyz - this->camera_center(pix));\n        vw::Vector3 xyz2 = this->camera_center(pix)\n          + this->pixel_to_vector(pix) * dist_to_ground;\n        if (vw::math::norm_2(xyz - xyz2) > 10 * gsd)\n          return apix; // Return the approximate pixel\n      }\n    }\n  }\n\n  // Return the exact pixel\n  return pix;\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Camera/CsmModel.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n/// \\file CsmModel.h\n///\n/// Wrapper for Community Sensor Model implementations.\n///\n///\n#ifndef __STEREO_CAMERA_CSM_MODEL_H__\n#define __STEREO_CAMERA_CSM_MODEL_H__\n\n#include <vw/Camera/CameraModel.h>\n#include <vw/Cartography/Datum.h>\n\n#include <usgscsm/Distortion.h>\n\n#include <boost/shared_ptr.hpp>\n\nnamespace vw {\n  namespace camera {\n    class PinholeModel;\n  }\n}\n\nnamespace csm {\n  // Forward declarations\n  class RasterGM; \n  class ImageCoord;\n  class EcefVector;\n  class EcefCoord;\n}\n\nnamespace asp {\n\n  // Do not set this lower than 1e-8, as then UsgsAstroLsSensorModel can return\n  // junk because of numerical precision issues for high focal length.\n  const double DEFAULT_CSM_DESIRED_PRECISION = 1.0e-8;\n  \n  /// Class to load any cameras described by the Community Sensor Model (CSM)\n  class CsmModel : public vw::camera::CameraModel {\n  public:\n    //------------------------------------------------------------------\n    // Constructors / Destructors\n    //------------------------------------------------------------------\n    CsmModel();\n    CsmModel(std::string const& isd_path); ///< Construct from ISD file\n    \n    // Note: This class copy constructor is shallow. Use deep_copy() to\n    // create a deep copy.\n\n    virtual ~CsmModel();\n    virtual std::string type() const { return \"CSM\"; }\n\n    /// Load the camera model from an ISD file or model state.\n    void load_model(std::string const& isd_path);\n\n    /// Return the size of the associated image.\n    vw::Vector2 get_image_size() const;\n\n    virtual vw::Vector2 point_to_pixel (vw::Vector3 const& point) const;\n\n    virtual vw::Vector3 pixel_to_vector(vw::Vector2 const& pix) const;\n\n    virtual vw::Vector3 camera_center(vw::Vector2 const& pix) const;\n\n    virtual vw::Quaternion<double> camera_pose(vw::Vector2 const& pix) const {\n      vw_throw(vw::NoImplErr() << \"CsmModel: Cannot retrieve camera_pose!\");\n      return vw::Quaternion<double>();\n    }\n\n    /// Return the path to the folder where we will look for CSM plugin DLLs.\n    static std::string get_csm_plugin_folder();\n\n    /// Get a list of all of the CSM plugin DLLs in the CSM plugin folder.\n    static size_t find_csm_plugins(std::vector<std::string> &plugins);\n\n    /// Print the CSM models that have been loaded into the main CSM plugin.\n    static void print_available_models();\n\n    /// Get the semi-axes of the datum. \n    vw::Vector3 target_radii() const;\n\n    // Save the model state\n    void saveState(std::string const& json_state_file) const;\n\n    // Apply a transform to a CSM model\n    void applyTransform(vw::Matrix4x4 const& transform);\n    \n    // Create a CSM frame camera model. Assumes that focal length and optical\n    // center are in pixels, the pixel pitch is 1.\n    void createFrameModel(int cols, int rows,  // in pixels\n        double cx, double cy, // col and row of optical center, in units of pixel pitch\n        double focal_length,  // in units of pixel pitch\n        double semi_major_axis, double semi_minor_axis, // in meters\n        vw::Vector3 const& C, // camera center\n        vw::Matrix3x3 const& R, // camera to world rotation matrix\n        std::string const& distortionType = \"\",\n        std::vector<double> const& distortion = std::vector<double>(),\n        double ephem_time = 0.0,\n        vw::Vector3 const& sun_position = vw::Vector3(0,0,0),\n        std::string const& serial_number = \"\",\n        std::string const& target_name = \"\",\n        double pixel_pitch = 1.0);\n        \n    // Create a CSM frame camera model from pinhole camera model.\n    // The distortion model must be set separately, as ASP pinhole\n    // and CSM use different distortion models.\n    void createFrameModel(vw::camera::PinholeModel const& pin_model,\n                          int cols, int rows,  // in pixels\n                          double semi_major_axis, double semi_minor_axis, // in meters\n                          std::string const& distortionType = \"\", \n                          std::vector<double> const& distortion = std::vector<double>(),\n                          double ephem_time = 0.0,\n                          vw::Vector3 const& sun_position = vw::Vector3(0,0,0),\n                          std::string const& serial_number = \"\",\n                          std::string const& target_name = \"\");\n\n    // Approximate conversion to a pinhole model. Will be exact only for the rad-tan\n    // lens distortion and no unusual line or sample adjustments in CSM. Compare\n    // these with cam_test.\n    vw::camera::PinholeModel pinhole() const;\n    \n    // Sun position in ECEF\n    vw::Vector3 sun_position() const;\n\n    // For bundle adjustment need a higher precision as CERES needs to do accurate\n    // numerical differences.\n    void setDesiredPrecision(double desired_precision) {\n      m_desired_precision = desired_precision;\n    }\n\n    /// Create the model from a state string. Use recreate_model = false,\n    /// if desired to adjust an existing model.\n    void setModelFromStateString(std::string const& model_state, bool recreate_model);\n\n    /// Get intrinsic parameters\n    std::vector<double> distortion() const;\n    DistortionType distortion_type() const;\n    double focal_length() const;\n    vw::Vector2 optical_center() const; // return sample and line\n    \n    // Set intrinsics\n    void set_distortion_type(DistortionType dist_type);\n    void set_distortion(std::vector<double> const& distortion);\n    void set_focal_length(double focal_length);\n    void set_optical_center(vw::Vector2 const& optical_center); // sample and line\n\n    // Set / get the position (camera center) in ECEF. Only for frame cameras.\n    void set_frame_position(double x, double y, double z);\n    void frame_position(double & x, double & y, double & z) const;\n\n    // Set / get the rotation matrix from camera to world. Only for frame cameras.\n    void set_frame_quaternion(double qx, double qy, double qz, double qw);\n    void frame_quaternion(double & qx, double & qy, double & qz, double & qw) const;\n        \n    // Set / get quaternions (only for linescan cameras)\n    void set_linescan_quaternions(std::vector<double> const& quaternions);\n    std::vector<double> linescan_quaternions() const;\n    \n    double frame_pixel_pitch() const; // pixel pitch for frame camera\n    \n    // Target name\n    std::string target_name() const;\n    void set_target_name(std::string const& target_name);\n    \n    boost::shared_ptr<csm::RasterGM> m_gm_model;\n\n    double m_desired_precision;\n    \n    // These are read from the json camera file\n    double m_semi_major_axis, m_semi_minor_axis;\n    \n    // Create a deep copy of the model, so don't just copy the shared pointer.\n    void deep_copy(boost::shared_ptr<CsmModel> & copy) const;\n    void deep_copy(CsmModel & copy) const;\n    \n    std::string plugin_name() const;\n    std::string model_name () const;\n    std::string model_state() const; \n    \n    bool isFrameCam() const;\n    \n    // Ensure the linescan model quaternions are always normalized and do not\n    // suddenly flip sign\n    void normalizeLinescanQuaternions();\n    \n    // Get the datum from the CSM model. It is suggested to use if possible\n    // the function StereoSessionCsm::get_datum() which calls this one, as\n    // that one also knows about the image and can find the datum name.\n    // If the spheroid name is not known, use \"unknown\".\n    vw::cartography::Datum get_datum_csm(std::string spheroid_name, \n                                         bool use_sphere_for_non_earth) const;\n    \n  protected:\n\n    // Read the ellipsoid (datum) axes from the isd json file\n    // (does not work for reading it from a json state file).\n    void read_ellipsoid_from_isd(std::string const& isd_path);\n    \n    /// Load the camera model from an ISD file.\n    void load_model_from_isd(std::string const& isd_path);\n    \n    /// Load the camera model from a model state written to disk.\n    /// A model state is obtained from an ISD model by pre-processing\n    /// and combining its data in a form ready to be used.\n    void loadModelFromStateFile(std::string const& state_file);\n\n    /// Find and load any available CSM plugin libraries from disk.\n    /// - This does nothing after the first time it finds any plugins.\n    void initialize_plugins();\n\n    /// Throw an exception if we have not loaded the model yet.\n    void throw_if_not_init() const;\n\n    vw::Vector3 m_sun_position;\n    \n    std::string m_plugin_name;\n\n    // Store here the projective approximation of the camera. This helps catch\n    // issues for projecting ground points very far rom the camera field of view\n    // when there is strong lens distortion.\n    std::vector<double> m_approxCamCoeffs;\n    // How far the pixels computed with the approximate camera are expected to\n    // be from the true pixel location.\n    double m_maxApproxCamPixErr;\n    // Create the approximate camera\n    void createApproxCam();\n    // Heuristics to correct point-to-pixel with the approximate camera\n    vw::Vector2 correctWithApproxCam(vw::Vector2 const& pix, vw::Vector3 const& xyz) const;\n  \n  }; // End class CsmModel\n\n  // Auxiliary non-member functions to convert a pixel from ASP\n  // conventions to what CSM expects and vice versa\n  void toCsmPixel(vw::Vector2 const& pix, csm::ImageCoord & csm);\n  void fromCsmPixel(vw::Vector2 & pix, csm::ImageCoord const& csm);\n  vw::Vector3 ecefVectorToVector(csm::EcefVector const& c);\n  vw::Vector3 ecefCoordToVector(csm::EcefCoord const& c);\n  vw::Vector2 imageCoordToVector(csm::ImageCoord const& c);\n  \n} // end namespace asp\n\n#endif //__STEREO_CAMERA_CSM_MODEL_H__\n"
  },
  {
    "path": "src/asp/Camera/CsmModelFit.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Camera/CsmModelFit.h>\n#include <asp/Camera/CsmUtils.h>\n\n#include <vw/Math/Quaternion.h>\n#include <vw/Math/Geometry.h>\n\n#include <asp/Camera/CsmModel.h>\n#include <vw/Camera/OpticalBarModel.h>\n\n#include <boost/algorithm/string/replace.hpp>\n#include <boost/algorithm/string/case_conv.hpp>\n\n#include <ceres/ceres.h>\n#include <ceres/loss_function.h>\n\n#include <iostream>\n\nnamespace asp {\n\n// Find the rotation matrices, focal length, and optical center,\n// that best fit a 2D matrix of sight vectors. Used for ASTER.\n\n// Write a function having the block above \nvoid linescanFitSaveResiduals(ceres::Problem & problem, std::string const& resFile) {\n  double total_cost = 0.0;\n  ceres::Problem::EvaluateOptions eval_options;\n  eval_options.num_threads = 1; // Use one thread to ensure a unique solution\n  eval_options.apply_loss_function = false;  // want raw residuals\n  std::vector<double> residuals;\n  problem.Evaluate(eval_options, &total_cost, &residuals, NULL, NULL);\n\n  // Save the residuals\n  vw::vw_out() << \"Writing residual norms to: \" << resFile << std::endl;\n  std::ofstream ofs(resFile.c_str());\n  for (int i = 0; i < residuals.size()/3; i++) {\n    int j = 3*i;\n    ofs << norm_2(vw::Vector3(residuals[j], residuals[j+1], residuals[j+2])) << std::endl;\n  }\n  ofs.close();\n}\n\n// Convert axis angle to quaternion, in the format CSM expects\nvoid axisAngleToCsmQuatVec(int num_poses, \n                           const double * axis_angle_vec,\n                           std::vector<double> & quat_vec) {\n\n  quat_vec.resize(4*num_poses);\n  \n  auto const & rot = axis_angle_vec;\n  for (int i = 0; i < num_poses; i++) {\n    vw::Vector3 axis_angle(rot[3*i+0], rot[3*i+1], rot[3*i+2]);\n    vw::Quat q = vw::math::axis_angle_to_quaternion(axis_angle);\n  \n    // CSM wants the quaternion order to be (x, y, z, w)\n    int j = 4*i;\n    quat_vec[j+0] = q.x();\n    quat_vec[j+1] = q.y();\n    quat_vec[j+2] = q.z();\n    quat_vec[j+3] = q.w();\n  }\n}\n\n// Convert CSM quaternions to axis angle format\nvoid csmQuatVecToAxisAngle(int num_poses, \n                           const double* quat_vec,\n                           std::vector<double> & axis_angle_vec) {\n\n  auto & rot = axis_angle_vec;\n  rot.resize(3*num_poses);\n  for (int i = 0; i < num_poses; i++) {\n    int j = 4*i;\n    // Note how we switch from (x,y,z,w) to (w,x,y,z) order\n    vw::Quat q(quat_vec[j+3], quat_vec[j+0], quat_vec[j+1], quat_vec[j+2]);\n    vw::Vector3 axis_angle = q.axis_angle();\n    rot[3*i+0] = axis_angle[0];\n    rot[3*i+1] = axis_angle[1];\n    rot[3*i+2] = axis_angle[2];\n  }\n}\n\n// The error between sight vectors and the camera directions \nstruct SightMatError {\n\n  SightMatError(SightMatT const& world_sight_mat, int row, int col, int min_col, int d_col):\n  m_world_sight_mat(world_sight_mat), m_row(row), m_col(col), \n  m_min_col(min_col), m_d_col(d_col) {}\n\n  // Error operator\n  bool operator()(double const* const* parameters, double* residuals) const {\n\n    const double* rotation       = parameters[0];\n    const double* optical_center = parameters[1];\n    const double* focal_length   = parameters[2];\n    \n    // Current sight vector\n    vw::Vector3 sight = m_world_sight_mat[m_row][m_col];\n    \n    // Find axis angle and then the rotation from the sensor to the world\n    vw::Vector3 axis_angle(rotation[0], rotation[1], rotation[2]);\n    vw::Matrix3x3 rot = vw::math::axis_angle_to_quaternion(axis_angle).rotation_matrix();\n    \n    // sight vec in sensor coordinates. Here likely the row index and min_row is \n    // not needed. Those are taken into account when the pixel is created later.\n    vw::Vector3 in(m_min_col + m_col * m_d_col - optical_center[0], -optical_center[1], \n                    focal_length[0]);\n\n    // Normalize\n    in = in/norm_2(in);\n    // rotate to world coordinates\n    in = rot*in;\n\n    // The sight vector we try to fit    \n    vw::Vector3 out = m_world_sight_mat[m_row][m_col];\n    out = out/norm_2(out);\n    \n    for (size_t p = 0; p < 3; p++)\n      residuals[p] = in[p] - out[p];\n\n    return true;\n  }\n\n  // Factory to hide the construction of the CostFunction object from\n  // the client code.\n  static ceres::CostFunction* Create(SightMatT const& world_sight_mat, \n                                     int row, int col, int min_col, int d_col) {\n    // The numbers below are for residual, rotation, optical center, focal length\n    \n    ceres::DynamicNumericDiffCostFunction<SightMatError>* cost_function\n     = new ceres::DynamicNumericDiffCostFunction<SightMatError>\n            (new SightMatError(world_sight_mat, row, col, min_col, d_col));\n    \n    cost_function->SetNumResiduals(3);\n    cost_function->AddParameterBlock(3); // rotation\n    cost_function->AddParameterBlock(2); // optical center\n    cost_function->AddParameterBlock(1); // focal length\n          \n    return cost_function;\n  }\n\n  // The sight matrix has samples of directions in the world coordinates \n  SightMatT const& m_world_sight_mat; // alias\n  int m_row, m_col;\n  int m_min_col, m_d_col; // to go from index in sight mat to image column\n};\n\n// See the .h file for the documentation\nvoid fitBestRotationsIntrinsics(SightMatT const& world_sight_mat,\n                                vw::Vector2i const& image_size, \n                                int min_col, int d_col,\n                                // Outputs\n                                double & focal_length, vw::Vector2 & optical_center,\n                                std::vector<vw::Matrix<double,3,3>> & rotation_vec) {\n\n  // Wipe the outputs\n  rotation_vec.clear();\n  \n  int num_rows = world_sight_mat.size();\n  int num_cols = world_sight_mat[0].size();\n\n  // First and last sight vectors for first row \n  vw::Vector3 beg_v = world_sight_mat[0][0];\n  vw::Vector3 end_v = world_sight_mat[0][num_cols-1];\n  // Find the angle, in radians, between the two vectors\n  double fov = acos(dot_prod(beg_v, end_v)/(norm_2(beg_v)*norm_2(end_v)));\n  \n  // Find initial focal length based on fov and image width\n  focal_length = image_size[0]/(2.0*tan(fov/2.0));\n  // Initial optical center (column and row)\n  optical_center = vw::Vector2(image_size[0]/2.0, 0);\n  \n  // Find the initial rotation matrix for each row of world_sight_mat\n  // make a vector of matrices, one for each row\n  for (int row = 0; row < world_sight_mat.size(); row++) {\n\n    // Find input-output pair correspondences\n    std::vector<vw::Vector3> in_vec, out_vec;\n    for (int col = 0; col < world_sight_mat[0].size(); col++) {\n      vw::Vector3 in(min_col + col * d_col - optical_center[0], -optical_center[1], \n                     focal_length);\n      vw::Vector3 out = world_sight_mat[0][col];\n      // Normalize and push back\n      in = in/norm_2(in);\n      out = out/norm_2(out);\n      in_vec.push_back(in);\n      out_vec.push_back(out);\n    }\n\n    // Find the rotation matrix that fits best the input-output pairs    \n    std::string transform_type = \"rigid\";\n    vw::Matrix<double,3,3> rotation;\n    vw::Vector3 translation;\n    double scale = 1.0;\n    vw::math::find_3D_transform_no_outliers(in_vec, out_vec, \n                                            rotation, translation, scale,\n                                            transform_type);\n    \n    // append the rotation to the vec\n    rotation_vec.push_back(rotation);\n  }\n  \n  // Convert rotations to axis angle format\n  std::vector<vw::Vector3> axis_angle_vec(num_rows);\n  for (int row = 0; row < num_rows; row++) {\n    vw::Quat q(rotation_vec[row]);\n    vw::Vector3 axis_angle = q.axis_angle();\n    axis_angle_vec[row] = axis_angle;\n  }\n  \n  // Set up an optimization problem. Inputs is world_sight_mat. \n  // Find best-fitting rotation matrices for each row of world_sight_mat,\n  // and the overall best focal length and optical center.\n  ceres::Problem problem;\n  for (int row = 0; row < num_rows; row++) {\n    for (int col = 0; col < num_cols; col++) {\n      \n      ceres::CostFunction* cost_function\n        = SightMatError::Create(world_sight_mat, row, col, min_col, d_col);\n      // ceres::LossFunction* loss_function = NULL;\n      // Prioritize for now the center of the image where the distortion\n      // is less.\n      ceres::LossFunction* loss_function = new ceres::CauchyLoss(1e-6);\n      problem.AddResidualBlock(cost_function, loss_function, \n                                &axis_angle_vec[row][0], &optical_center[0], &focal_length);\n    }\n  }\n\n  // linescanFitSaveResiduals(problem, \"residuals1_before.txt\"); // for debugging\n\n  // Solve the problem\n  ceres::Solver::Options options;\n  options.linear_solver_type = ceres::ITERATIVE_SCHUR;\n  options.num_threads = 1; \n  options.max_num_iterations = 50; // 50 iterations is enough\n  options.minimizer_progress_to_stdout = false;\n  ceres::Solver::Summary summary;\n  ceres::Solve(options, &problem, &summary);\n\n  // Copy back from axis_angle_vec to rotation_vec\n  for (int row = 0; row < num_rows; row++)\n    rotation_vec[row] \n      = vw::math::axis_angle_to_quaternion(axis_angle_vec[row]).rotation_matrix();\n  \n#if 0 // for debugging\n  vw::vw_out() << summary.FullReport() << \"\\n\"; \n  vw::vw_out() << \"Starting average reprojection error: \"\n            << summary.initial_cost << \"\\n\";\n  vw::vw_out() << \"Final average reprojection error:    \"\n            << summary.final_cost << \"\\n\";\n #endif\n \n  // linescanFitSaveResiduals(problem, \"residuals1_after.txt\"); // for debugging\n \n  return;\n}\n\n// The error between sight vectors and a linescan CSM model that incorporates\n// distortion. The satellite positions are assumed fixed.\nstruct SightMatLinescanError {\n\n  SightMatLinescanError(SightMatT     const& world_sight_mat, \n                        asp::CsmModel const& csm_model,\n                        int min_col,  int min_row, \n                        int d_col,    int d_row, int num_poses,\n                        DistortionType dist_type, int num_dist_params):\n  m_world_sight_mat(world_sight_mat), m_csm_model(csm_model),\n  m_min_col(min_col), m_min_row(min_row), m_d_col(d_col), m_d_row(d_row), \n  m_num_poses(num_poses), m_dist_type(dist_type), m_num_dist_params(num_dist_params) {}\n\n  // Members\n  // The sight matrix has samples of directions in the world coordinates \n  SightMatT     const& m_world_sight_mat; // alias\n  asp::CsmModel const& m_csm_model;       // alias\n  int m_min_col, m_min_row, m_d_col, m_d_row, m_num_poses;\n  DistortionType m_dist_type;\n  int m_num_dist_params;\n\n  // Error operator\n  bool operator()(double const* const* parameters, double* residuals) const {\n\n   const double* rotations      = parameters[0];\n   const double* optical_center = parameters[1];\n   const double* focal_length   = parameters[2];\n   const double* distortion     = parameters[3];\n   \n   // Make a local model copy\n   asp::CsmModel local_model;\n   m_csm_model.deep_copy(local_model);\n   \n   // Set distortion\n   local_model.set_distortion_type(m_dist_type);\n   std::vector<double> dist_vec(m_num_dist_params);\n   for (int i = 0; i < m_num_dist_params; i++)\n     dist_vec[i] = distortion[i];\n   local_model.set_distortion(dist_vec); \n   \n   // Set focal length and optical center\n   local_model.set_focal_length(focal_length[0]); \n   local_model.set_optical_center(vw::Vector2(optical_center[0], optical_center[1]));\n   \n   // Copy the rotations from axis angle format to quaternions, then set in model\n   std::vector<double> quaternions(4*m_num_poses);\n   axisAngleToCsmQuatVec(m_num_poses, rotations, quaternions); \n   local_model.set_linescan_quaternions(quaternions);\n   \n    // Find the residuals with the local model\n    int num_rows = m_world_sight_mat.size();\n    int num_cols = m_world_sight_mat[0].size();\n    int count = 0;\n    for (int row = 0; row < num_rows; row++) {\n      for (int col = 0; col < num_cols; col++) {\n        \n        vw::Vector3 dir1 = m_world_sight_mat[row][col];\n        dir1 = dir1/norm_2(dir1);\n\n        // Vector in sensor coordinates. Convert to double\n        // early on to avoid integer overflow.\n        vw::Vector2 pix(double(m_min_col) + double(col) * m_d_col, \n                        double(m_min_row) + double(row) * m_d_row);\n        vw::Vector3 dir2 = local_model.pixel_to_vector(pix);\n        \n        int j = 3 * count;\n        for (int k = 0; k < 3; k++)\n          residuals[j+k] = dir1[k] - dir2[k];\n          \n        count++;\n      }\n    }\n\n    return true;\n  }\n\n  // Factory to hide the construction of the CostFunction object from\n  // the client code.\n  static ceres::CostFunction* Create(SightMatT const& world_sight_mat,\n                                     asp::CsmModel const& csm_model,\n                                     int min_col, int min_row, \n                                     int d_col, int d_row, int num_poses,\n                                     DistortionType dist_type, int num_dist_params) {\n    \n    ceres::DynamicNumericDiffCostFunction<SightMatLinescanError>* cost_function\n     = new ceres::DynamicNumericDiffCostFunction<SightMatLinescanError>\n            (new SightMatLinescanError(world_sight_mat, csm_model, \n                                       min_col, min_row, d_col, d_row, \n                                       num_poses, dist_type, num_dist_params));\n    \n     int num_rows = world_sight_mat.size();\n     int num_cols = world_sight_mat[0].size();\n\n     cost_function->AddParameterBlock(3 * num_poses); // rotations\n     cost_function->AddParameterBlock(2); // optical center\n     cost_function->AddParameterBlock(1); // focal length\n     cost_function->AddParameterBlock(num_dist_params); // distortion\n     cost_function->SetNumResiduals(3 * num_rows * num_cols);\n\n     return cost_function;\n  }\n\n};\n\n// See the .h file for the documentation\nvoid refineCsmLinescanFit(SightMatT const& world_sight_mat,\n                          int min_col, int min_row,\n                          int d_col, int d_row,\n                          // This model will be modified\n                          asp::CsmModel & csm_model,\n                          bool fix_rotations,\n                          int distortion_type) {\n\n  // Read data from the model\n  double focal_length = csm_model.focal_length();\n  vw::Vector2 optical_center = csm_model.optical_center();\n  std::vector<double> quaternions = csm_model.linescan_quaternions();\n\n  // Sanity check\n  int num_poses = quaternions.size()/4;\n  if (num_poses == 0)\n    vw::vw_throw(vw::ArgumentErr()\n                 << \"refineCsmLinescanFit: No poses found.\\n\");\n\n  // Create rotations from quaternions\n  std::vector<double> rotations;\n  csmQuatVecToAxisAngle(num_poses, &quaternions[0], rotations);\n\n  // Choose distortion model. Default (-1) uses RADTAN.\n  DistortionType dist_type;\n  std::vector<double> distortion;\n  if (distortion_type == TRANSVERSE) {\n    dist_type = TRANSVERSE;\n    distortion.resize(20, 1e-6);\n    // Identity for linear terms, small nonzero for rest so Ceres sees gradient\n    distortion[0] = 0.0;  // x constant (no offset)\n    distortion[1] = 1.0;  // x coeff for ux (identity)\n    distortion[10] = 0.0; // y constant\n    distortion[12] = 1.0; // y coeff for uy (identity)\n  } else {\n    dist_type = RADTAN;\n    distortion.assign(5, 1e-8);\n  }\n  \n  // Set up an optimization problem to refine the CSM model.\n  ceres::Problem problem;\n  ceres::CostFunction* cost_function\n    = SightMatLinescanError::Create(world_sight_mat, csm_model, \n                                    min_col, min_row, d_col, d_row, \n                                    num_poses, dist_type, distortion.size());\n  \n  // Minimize all residuals equally\n  ceres::LossFunction* loss_function = NULL;\n  problem.AddResidualBlock(cost_function, loss_function,\n                           &rotations[0], &optical_center[0], &focal_length,\n                           &distortion[0]);\n\n  // Positions are not optimized by this solver. Fix rotations too when\n  // vendor extrinsics are known (SPOT5), so only intrinsics are fitted.\n  if (fix_rotations)\n    problem.SetParameterBlockConstant(&rotations[0]);\n\n  // linescanFitSaveResiduals(problem, \"residuals2_before.txt\"); // for debugging\n\n  // Set up the solver options\n  ceres::Solver::Options options;\n  options.linear_solver_type = ceres::ITERATIVE_SCHUR;\n  options.num_threads = 1; // Use one thread for unique solution\n  options.max_num_iterations = 50; // 50 iterations is enough\n  options.gradient_tolerance  = 1e-16;\n  options.function_tolerance  = 1e-16;\n  options.parameter_tolerance = 1e-12; // should be enough\n  options.minimizer_progress_to_stdout = false;\n\n  // Solve the problem\n  ceres::Solver::Summary summary;\n  ceres::Solve(options, &problem, &summary);\n\n  // linescanFitSaveResiduals(problem, \"residuals2_after.txt\"); // for debugging\n\n  // Copy back rotations vec to quaternions\n  axisAngleToCsmQuatVec(rotations.size()/3, &rotations[0], quaternions);\n\n  // Update the model quaternions, focal length, optical center, and distortion\n  csm_model.set_linescan_quaternions(quaternions);\n  csm_model.set_focal_length(focal_length);\n  csm_model.set_optical_center(optical_center);\n  csm_model.set_distortion_type(dist_type);\n  csm_model.set_distortion(distortion);\n\n  return;\n}\n\n// Fit a CSM sensor with distortion to given tabulated sight directions. This\n// assumes the scan lines are horizontal, so the satellite moves vertically.\n// There are as many rows in world_sight_mat as there are satellite positions.\n// At each position there several sight vectors, along the scanline.\n// We want: world_sight_mat[row][col] = csm_model.pixel_to_vector(col, row).\nvoid fitCsmLinescan(std::string const& sensor_id, \n                    vw::cartography::Datum const& datum,\n                    vw::Vector2i const& image_size,\n                    std::vector<vw::Vector3> const& sat_pos,\n                    SightMatT const& world_sight_mat,\n                    int min_col, int min_row,\n                    int d_col, int d_row, \n                    bool fit_distortion,\n                    // This model will be modified\n                    asp::CsmModel & csm_model) {\n\n  // Sanity check\n  if (sat_pos.size() != world_sight_mat.size())\n    vw::vw_throw(vw::ArgumentErr()\n                 << \"fitCsmLinescan: The number of satellite positions does not \"\n                 << \"agree with the number of rows in the sight matrix.\\n\");\n  \n  // Sanity check\n  int last_sampled_row = min_row + d_row * (world_sight_mat.size() - 1);\n  if (last_sampled_row < image_size[1] - 1)  \n    vw::vw_out(vw::WarningMessage) \n      << \"Warning: The last image row with a sight matrix sample is \" \n      << last_sampled_row << \", which is less than the last image pixel line of \" \n      << image_size[1] - 1 << \". This may lead to problems with the best-fit CSM model.\\n\";\n                 \n  // Find the rotation matrices, focal length, and optical center,\n  // that best fit a 2D matrix of sight vectors. For now, assume\n  // no distortion.\n  double focal_length = 0.0; \n  vw::Vector2 optical_center;\n  std::vector<vw::Matrix<double,3,3>> cam2world_vec;\n  fitBestRotationsIntrinsics(world_sight_mat, image_size, min_col, d_col,\n                             focal_length, optical_center, cam2world_vec);\n  \n  // Assume it takes one unit of time to scan one image line\n  double first_line_time = 0; // time of the first scanned line\n  double last_line_time = image_size[1] - 1;\n  double dt_line = (last_line_time - first_line_time) / (image_size[1] - 1.0);\n  \n  // The image line for the first pose determines its time. The spacing\n  // between poses determines dt_ephem. Note that min_row is negative,\n  // because the first pose is measured before data starts being recorded.\n  double t0_ephem = min_row * dt_line;\n  double dt_ephem = d_row * dt_line;\n  double t0_quat = t0_ephem;\n  double dt_quat = dt_ephem;\n  \n  // We have no velocities in this context, so set them to 0\n  std::vector<vw::Vector3> velocities(sat_pos.size(), vw::Vector3(0, 0, 0));\n\n  // Initialize the CSM model\n  asp::populateCsmLinescan(first_line_time, dt_line, \n                           t0_ephem, dt_ephem, t0_quat, dt_quat,\n                           focal_length, optical_center, \n                           image_size, datum, sensor_id,\n                           sat_pos, velocities, cam2world_vec, \n                           csm_model); // output\n\n  // Refine the CSM model by also floating the distortion \n  if (fit_distortion)\n    asp::refineCsmLinescanFit(world_sight_mat, min_col, min_row, d_col, d_row, csm_model);\n\n  return;\n}\n\n// Create pixel samples. Make sure to sample the pixel at (width - 1, height - 1).\nvoid createPixelSamples(int width, int height, int num_pixel_samples,\n                        std::vector<vw::Vector2> & pix_samples) {\n  \n  // Sanity checks\n  if (num_pixel_samples <= 0)\n    vw::vw_throw(vw::ArgumentErr() << \"The number of pixel samples must be positive.\\n\");\n  if (width <= 1 || height <= 1)\n    vw::vw_throw(vw::ArgumentErr() << \"The image dimensions must be at least 2 pixels.\\n\");\n  \n  // Wipe the output\n  pix_samples.clear();\n\n  // Find how many samples we need for width and height\n  double area = double(width) * double(height);  // avoid int32 overflow\n  double len = sqrt(area / double(num_pixel_samples));\n  int num_x = std::max(round((width - 1.0) / len) + 1, 2.0);\n  int num_y = std::max(round((height - 1.0) / len) + 1, 2.0);\n  \n  // Take creat care to include the last pixel, which is (width - 1, height -\n  // 1).\n  double x_step = (width - 1.0) / double(num_x - 1);\n  double y_step = (height - 1.0) / double(num_y - 1);\n  \n  // iterate with num_x samples with spacing x_step, and the same for y\n  for (int ix = 0; ix < num_x; ix++) {\n    for (int iy = 0; iy < num_y; iy++) {\n      double x = ix * x_step;\n      double y = iy * y_step;\n      x = std::min(x, double(width - 1));\n      y = std::min(y, double(height - 1));\n      vw::Vector2 pix(x, y);\n      pix_samples.push_back(pix);\n    }\n  }\n  \n  return;\n}\n\nvoid parseRefineIntrinsicsStr(std::string const& refine_intrinsics,\n                              bool & fix_focal_length, \n                              bool & fix_optical_center, \n                              bool & fix_other_intrinsics) {\n  \n  // Initialize all to true\n  fix_focal_length = true;\n  fix_optical_center = true;\n  fix_other_intrinsics = true;\n  \n  // Make a local copy of the string and convert it to lower case\n  std::string local_refine_intrinsics = refine_intrinsics;\n  boost::to_lower(local_refine_intrinsics);\n  \n  // Ensure that this was set to something, rather than \"\", which may be ambiguous.\n  if (local_refine_intrinsics == \"\") \n    vw::vw_throw(vw::ArgumentErr() << \"Error: refine intrinsics string is empty.\\n\");\n    \n  // Replace none with \"\".\n  if (local_refine_intrinsics == \"none\") \n    local_refine_intrinsics = \"\";\n   \n  // Replace \"all\" with all\n  if (local_refine_intrinsics == \"all\") \n   local_refine_intrinsics = \"focal_length, optical_center, other_intrinsics\";   \n     \n  // Replace commas with spaces\n  boost::replace_all(local_refine_intrinsics, \",\", \" \");\n  \n  std::istringstream is(local_refine_intrinsics);\n  std::string val;\n  while (is >> val) {\n    if (val == \"focal_length\")\n      fix_focal_length = false;\n    else if (val == \"optical_center\")\n      fix_optical_center = false;\n    else if (val == \"other_intrinsics\" || val == \"distortion\")\n      fix_other_intrinsics = false;\n    else\n      vw::vw_throw(vw::ArgumentErr() << \"Error: Found unknown intrinsic to float: \" \n        << val << \".\\n\");\n  }\n  \n  vw::vw_out() << \"Refine focal length: \" << !fix_focal_length << \"\\n\";\n  vw::vw_out() << \"Refine optical center: \" << !fix_optical_center << \"\\n\";\n  vw::vw_out() << \"Refine other intrinsics (distortion): \" << !fix_other_intrinsics << \"\\n\";\n}\n\n// The error between projections of ground points in camera and known pixels.\n// Optimize the intrinsics, including distortion. The satellite positions and\n// orientations are optimized as well.\nstruct FrameCamReprojErr {\n\n  FrameCamReprojErr(std::vector<vw::Vector2> const& pixels,\n                   std::vector<vw::Vector3> const& xyz,\n                   int num_distortion_params,\n                   asp::CsmModel const& csm_model):\n  m_pixels(pixels), m_xyz(xyz), \n  m_num_dist_params(num_distortion_params), m_csm_model(csm_model) {\n    \n    // There must be as many pixels as xyz\n    if (m_pixels.size() != m_xyz.size())\n      vw::vw_throw(vw::ArgumentErr() \n                   << \"Error: The number of pixels and ground points must be same.\\n\");\n  }\n\n  // Members\n  std::vector<vw::Vector2> const& m_pixels; // alias\n  std::vector<vw::Vector3> const& m_xyz; // alias\n  int m_num_dist_params;\n  asp::CsmModel const& m_csm_model;       // alias\n\n  // Error operator\n  bool operator()(double const* const* parameters, double* residuals) const {\n\n   const double* position      = parameters[0];\n   const double* rotation      = parameters[1];\n   const double* optical_center = parameters[2];\n   const double* focal_length   = parameters[3];\n   const double* distortion     = parameters[4];\n   \n   // Make a local model copy\n   asp::CsmModel local_model;\n   m_csm_model.deep_copy(local_model);\n   \n   // Set the position\n   local_model.set_frame_position(position[0], position[1], position[2]);\n       \n   // Copy the rotation from axis angle format to quaternions, then set in model\n   int num_poses = 1;\n   std::vector<double> q(4*num_poses);\n   axisAngleToCsmQuatVec(num_poses, rotation, q);\n   local_model.set_frame_quaternion(q[0], q[1], q[2], q[3]);\n  \n   // Set optical center and focal length\n   local_model.set_optical_center(vw::Vector2(optical_center[0], optical_center[1]));\n   local_model.set_focal_length(focal_length[0]); \n\n   // Set distortion\n   std::vector<double> dist_vec(m_num_dist_params);\n   for (int i = 0; i < m_num_dist_params; i++)\n     dist_vec[i] = distortion[i];\n   local_model.set_distortion(dist_vec); \n\n    // Find the residuals with the local model\n    int num_samples = m_pixels.size();\n    for (int count = 0; count < num_samples; count++) {\n        \n      vw::Vector2 pix1 = m_pixels[count];\n      vw::Vector2 pix2 = local_model.point_to_pixel(m_xyz[count]);\n      \n      int j = 2 * count;\n      for (int k = 0; k < 2; k++)\n        residuals[j+k] = pix1[k] - pix2[k];\n    }\n\n    return true;\n  }\n\n  // Factory to hide the construction of the CostFunction object from\n  // the client code.\n  static ceres::CostFunction* Create(std::vector<vw::Vector2> const& pixels,\n                                     std::vector<vw::Vector3> const& xyz,\n                                     int num_distortion_params,\n                                     asp::CsmModel const& csm_model) {\n\n    ceres::DynamicNumericDiffCostFunction<FrameCamReprojErr>* cost_function\n     = new ceres::DynamicNumericDiffCostFunction<FrameCamReprojErr>\n            (new FrameCamReprojErr(pixels, xyz, num_distortion_params, csm_model));\n\n     cost_function->AddParameterBlock(3); // position\n     cost_function->AddParameterBlock(3); // rotation (axis angle)\n     cost_function->AddParameterBlock(2); // optical center\n     cost_function->AddParameterBlock(1); // focal length\n     cost_function->AddParameterBlock(num_distortion_params); // distortion\n     cost_function->SetNumResiduals(2 * pixels.size()); // 2 residuals per pixel\n\n     return cost_function;\n  }\n\n};\n\n// See how well the optimized model fits the ground points\nvoid computeCamStats(std::vector<vw::Vector2> const& pixels,\n                     std::vector<vw::Vector3> const& xyz,\n                     asp::CsmModel const& csm_model) {\n\n  // Iterate over xyz and project into the camera\n  std::vector<double> errors;\n  for (size_t i = 0; i < xyz.size(); i++) {\n    vw::Vector2 pix = csm_model.point_to_pixel(xyz[i]);\n    errors.push_back(norm_2(pix - pixels[i]));\n  }\n\n  // Sort the errors\n  std::sort(errors.begin(), errors.end());\n  \n  double mean = vw::math::mean(errors);\n  double stdev = vw::math::standard_deviation(errors, mean);\n  \n  vw::vw_out() << \"Errors of pixel projection in the camera with refined intrinsics:\\n\";\n  vw::vw_out() << \"Min:    \" << errors[0] << \"\\n\";\n  vw::vw_out() << \"Median: \" << vw::math::destructive_median(errors) << \"\\n\";\n  vw::vw_out() << \"Mean:   \" << mean << \"\\n\";\n  vw::vw_out() << \"StDev:  \" << stdev << \"\\n\";\n  vw::vw_out() << \"Max:    \" << errors.back() << \"\\n\";\n  vw::vw_out() << \"Num samples: \" << errors.size() << \"\\n\";\n\n}\n                                                   \n// Refine a CSM frame camera model using a a set of ground points projecting at given pixels\nvoid refineCsmFrameFit(std::vector<vw::Vector2> const& pixels,\n                       std::vector<vw::Vector3> const& xyz,\n                       std::string const& refine_intrinsics,\n                       asp::CsmModel & csm_model) { // output\n\n  vw::vw_out() << \"Refining camera intrinsics and pose.\\n\";\n\n  // See which intrinsics to fix\n  bool fix_focal_length = true, fix_optical_center = true, fix_other_intrinsics = true;\n  parseRefineIntrinsicsStr(refine_intrinsics, \n                           fix_focal_length, fix_optical_center, fix_other_intrinsics);\n\n  // Read data from the model\n  double x, y, z;\n  csm_model.frame_position(x, y, z);\n  double qx, qy, qz, qw;\n  csm_model.frame_quaternion(qx, qy, qz, qw);\n  double focal_length = csm_model.focal_length();\n  vw::Vector2 optical_center = csm_model.optical_center();\n  std::vector<double> distortion = csm_model.distortion();\n  \n#if 0 // This does not work and may not be needed\n  // Find the longest distance from optical center to each pixel\n  if (!fix_other_intrinsics) {\n    double r = 0;\n    for (size_t i = 0; i < pixels.size(); i++) \n      r = std::max(r, norm_2(pixels[i] - optical_center));\n    if (r == 0)\n      vw::vw_throw(vw::ArgumentErr() << \"Error: Not enough samples.\\n\");\n  \n    // Give CERES a hint to not perturb the high order distortion terms too much\n    // TODO(oalexan1): This should depend on image dimensions.\n    // k2 gets multiplied by r^5, k3 gets multiplied by r^7. \n    if (distortion[1] == 0)\n      distortion[1] = 1e-7 / pow(r, 5); // k2\n    if (distortion[4] == 0)\n      distortion[4] = 1e-7 / pow(r, 7);  // k3\n  }\n#endif\n      \n  // The position vector\n  std::vector<double> position = {x, y, z};\n      \n  // Create rotation from quaternions\n  std::vector<double> rotation;\n  int num_poses = 1;\n  std::vector<double> q = {qx, qy, qz, qw};\n  csmQuatVecToAxisAngle(num_poses, &q[0], rotation);\n\n  // Set up an optimization problem to refine the CSM model.\n  ceres::Problem problem;\n  ceres::CostFunction* cost_function\n    = FrameCamReprojErr::Create(pixels, xyz, distortion.size(), csm_model);\n  \n  // Minimize all residuals equally\n  ceres::LossFunction* loss_function = NULL;\n  problem.AddResidualBlock(cost_function, loss_function, \n                           &position[0], &rotation[0], &optical_center[0], &focal_length,\n                           &distortion[0]);\n\n  // Set up the solver options \n  ceres::Solver::Options options;\n  options.linear_solver_type = ceres::ITERATIVE_SCHUR;\n  options.num_threads = 1; // Use one thread for unique solution\n  options.max_num_iterations = 50; // 50 iterations is enough\n  \n  options.gradient_tolerance  = 1e-16;\n  options.function_tolerance  = 1e-16;\n  options.parameter_tolerance = 1e-12; // should be enough\n  options.minimizer_progress_to_stdout = false; // true for debugging\n\n  if (fix_focal_length)\n    problem.SetParameterBlockConstant(&focal_length);\n  if (fix_optical_center)\n    problem.SetParameterBlockConstant(&optical_center[0]);\n  if (fix_other_intrinsics)\n    problem.SetParameterBlockConstant(&distortion[0]);\n   \n  // Solve the problem  \n  ceres::Solver::Summary summary;\n  ceres::Solve(options, &problem, &summary);\n  //vw::vw_out() << summary.FullReport() << \"\\n\";\n\n  // Copy back\n  csm_model.set_frame_position(position[0], position[1], position[2]);\n  axisAngleToCsmQuatVec(num_poses, &rotation[0], q);\n  csm_model.set_frame_quaternion(q[0], q[1], q[2], q[3]);\n  csm_model.set_focal_length(focal_length);\n  csm_model.set_optical_center(optical_center);\n  csm_model.set_distortion(distortion);\n\n  computeCamStats(pixels, xyz, csm_model);\n  return;\n}\n\n// Fit a CSM camera to an optical bar camera. Optical bar cameras assumes the\n// scan lines are vertical, as for KH-9, which differs with how a CSM model is\n// fit, so below we will do some conversions. Additionally, the image file\n// needs to be rotated 90 degrees counter-clockwise to match the CSM camera.\nvoid fitCsmLinescanToOpticalBar(std::string const& camFile, \n                                vw::Vector2i const& OpticalBarimageColsRows,\n                                vw::cartography::Datum const& datum,\n                                asp::CsmModel & csm) {\n  \n  // See above for why OpticalBar rows become CSM columns, and vise versa.\n  int num_csm_rows = OpticalBarimageColsRows[0];\n  int num_csm_cols = OpticalBarimageColsRows[1];\n  \n  // This should be fine enough\n  int num_lines_per_pose = 100;\n  \n  // Use at least 1000 samples, but no more than 10000.\n  int num_row_samples = round(double(num_csm_rows) / double(num_lines_per_pose)) + 1;\n  num_row_samples = std::max(1000, std::min(num_row_samples, 10000));\n  \n  // Spacing between row samples\n  int d_row = round(double(num_csm_rows) / double(num_row_samples - 1));\n  d_row = std::max(d_row, 1); // at least one pixel per sample\n  \n  // Add at least 10 row samples before first line and after last line, which\n  // help with pose interpolation when solving for jitter.\n  int min_row = -10 * d_row; // start at least 10 pixels before the first line\n  int max_row = num_csm_rows + 10 * d_row; // end at least 10 pixels after the last line\n  num_row_samples = ceil(double(max_row - min_row) / double(d_row)) + 1;\n  \n  // Along each row, likely 20 column samples should be enough, as those will result\n  // in a single rotation matrix.\n  int num_col_samples = 20;\n  int d_col = ceil(double(num_csm_cols) / double(num_col_samples - 1));\n  \n  // max_col should be at least num_csm_cols - 1 to sample fully the last column.\n  // Otherwise throw a warning.\n  int min_col = 0; // start at the first column\n  int max_col = min_col + (num_col_samples - 1) * d_col;\n  if (max_col < num_csm_cols - 1)\n    vw::vw_out(vw::WarningMessage)\n      << \"Warning: The last column with a sight matrix sample is \" \n      << max_col << \", which is less than the last image pixel column of \" \n      << num_csm_cols - 1 << \". This may lead to problems with the best-fit CSM model.\\n\";\n  \n  // Open the Optical bar file\n  vw::camera::OpticalBarModel optical_bar_cam(camFile);\n  vw::Vector2 optical_center = optical_bar_cam.get_optical_center();\n  vw::Vector2 image_size = optical_bar_cam.get_image_size();\n\n  // Image size must be what was set earlier\n  if (image_size != OpticalBarimageColsRows)\n    vw::vw_throw(vw::ArgumentErr() \n      << \"Error: The image size set in the optical bar camera model does not match \"\n      << \"the actual image size.\\n\");\n  \n  // Sample the camera poses along the track\n  std::vector<vw::Vector3> sat_pos(num_row_samples);\n  for (int i = 0; i < num_row_samples; i++) {\n    double csm_row = min_row + i * d_row;\n    // Convert to optical bar pixels. The optical bar column is csm row.\n    // The optical bar row is the row coordinate of the optical center.\n    vw::Vector2 optical_bar_pix(csm_row, optical_center[1]);\n    sat_pos[i] = optical_bar_cam.camera_center(optical_bar_pix);\n  }\n  \n  // Create the world sight matrix (camera directions in world coordinates)\n  SightMatT world_sight_mat(num_row_samples, std::vector<vw::Vector3>(num_col_samples));\n  for (int irow = 0; irow < num_row_samples; irow++) {\n    for (int icol = 0; icol < num_col_samples; icol++) {\n      double csm_col = min_col + icol * d_col;\n      double csm_row = min_row + irow * d_row;\n      // In-sensor rotation that interchanges rows and cols\n      vw::Vector2 optical_bar_pix(csm_row, num_csm_cols - 1 - csm_col);\n      world_sight_mat[irow][icol] = optical_bar_cam.pixel_to_vector(optical_bar_pix);\n    }\n  }\n\n  // Fit the CSM model\n  std::string sensor_id = \"OpticalBar\"; \n  bool fit_distortion = false;\n  fitCsmLinescan(sensor_id, datum, vw::Vector2(num_csm_cols, num_csm_rows),\n                 sat_pos, world_sight_mat, min_col, min_row, d_col, d_row, \n                 fit_distortion, csm);\n    \n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Camera/CsmModelFit.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file CsmModelFit.h\n\n#ifndef __ASP_CAMERA_CSM_MODEL_FIT_H__\n#define __ASP_CAMERA_CSM_MODEL_FIT_H__\n\n#include <vw/Math/Matrix.h>\n#include <vw/Math/Vector.h>\n\n// Forward declaration\nnamespace vw {\n  namespace cartography {\n    class Datum;\n  }\n}\n\nnamespace asp {\n\nclass CsmModel;\n\ntypedef std::vector<std::vector<vw::Vector3>> SightMatT;\n\n// Refine a CSM linescan model by floating optical center, focal length,\n// and distortion to match given world sight vectors. Rotations can\n// optionally be fixed (for SPOT5 where extrinsics come from vendor).\nvoid refineCsmLinescanFit(SightMatT const& world_sight_mat,\n                          int min_col, int min_row,\n                          int d_col, int d_row,\n                          asp::CsmModel & csm_model,\n                          bool fix_rotations = false,\n                          int distortion_type = -1);\n\n// Fit a CSM sensor with distortion to given tabulated sight directions.\n// This is specific to ASTER.\nvoid fitCsmLinescan(\n       std::string const& sensor_id, \n       vw::cartography::Datum const& datum,\n       vw::Vector2i const& image_size,\n       std::vector<vw::Vector3> const& sat_pos,\n       SightMatT const& world_sight_mat,\n       int min_col, int min_row,\n       int d_col, int d_row, \n       bool fit_distortion,\n       // This model will be modified\n       asp::CsmModel & csm_model);\n  \n// Create pixel samples. Make sure to sample the pixel at (width - 1, height - 1).\nvoid createPixelSamples(int width, int height, int num_pixel_samples,\n                        std::vector<vw::Vector2> & pix_samples);\n \n// Refine a CSM frame camera model using a a set of ground points projecting at given pixels\nvoid refineCsmFrameFit(std::vector<vw::Vector2> const& pixels,\n                       std::vector<vw::Vector3> const& directions,\n                       std::string const& refine_intrinsics,\n                       asp::CsmModel & csm_model); // output\n\n// Fit a CSM camera to an optical bar camera. The .cc file has more details.\nvoid fitCsmLinescanToOpticalBar(std::string const& camFile,\n                                vw::Vector2i const& imageFize,\n                                vw::cartography::Datum const& datum,\n                                asp::CsmModel & csm);\n  \n} // end namespace asp\n\n#endif // __ASP_CAMERA_CSM_MODEL_FIT_H__\n"
  },
  {
    "path": "src/asp/Camera/CsmUtils.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Functions used for handling CSM camera models.\n\n#include <asp/Camera/CsmModel.h>\n#include <asp/Camera/CsmUtils.h>\n#include <asp/Core/CameraTransforms.h>\n#include <asp/Core/BundleAdjustUtils.h>\n#include <asp/Core/BaseCameraUtils.h>\n\n#include <vw/Camera/OrbitalCorrections.h>\n#include <vw/Math/PositionInterp.h>\n#include <vw/Math/QuatInterp.h>\n#include <vw/Cartography/GeoReference.h>\n#include <vw/Cartography/GeoReferenceBaseUtils.h>\n#include <vw/Cartography/GeoReferenceUtils.h>\n\n#include <usgscsm/UsgsAstroLsSensorModel.h>\n#include <usgscsm/UsgsAstroFrameSensorModel.h>\n#include <usgscsm/Utilities.h>\n\nnamespace asp {\n\n// Ensure that quaternions don't suddenly change sign. This is a bugfix.\nvoid fixQuaternionSigns(UsgsAstroLsSensorModel * ls_model) {\n  \n  // Find the largest magnitude quaternion coefficient and its coordinate\n  int numQuats = ls_model->m_numQuaternions / NUM_QUAT_PARAMS;\n  double max_q = 0.0;\n  int max_j = 0;\n  for (int i = 0; i < numQuats; i++) {\n    double * quat = &ls_model->m_quaternions[NUM_QUAT_PARAMS * i];\n    for (int j = 0; j < 4; j++) {\n      if (std::abs(quat[j]) > std::abs(max_q)) {\n        max_q = quat[j];\n        max_j = j;\n      }\n    }\n  }\n    \n  // Ensure the signs are consistent\n  for (int i = 0; i < numQuats; i++) {\n    double * quat = &ls_model->m_quaternions[NUM_QUAT_PARAMS * i];\n    if (quat[max_j] * max_q < 0) {\n      for (int j = 0; j < 4; j++) {\n        quat[j] *= -1.0;\n      }  \n    }\n  }\n}\n\n// Normalize quaternions in UsgsAstroLsSensorModel.\nvoid normalizeQuaternions(UsgsAstroLsSensorModel * ls_model) {\n\n  for (int qit = 0; qit < ls_model->m_numQuaternions / 4; qit++) {\n\n    double norm = 0.0;\n    for (int coord = 0; coord < 4; coord++)\n      norm += ls_model->m_quaternions[4 * qit + coord] * ls_model->m_quaternions[4 * qit + coord];\n\n    norm = sqrt(norm);\n    if (norm == 0)\n      continue;\n   \n    for (int coord = 0; coord < 4; coord++)\n      ls_model->m_quaternions[4 * qit + coord] /= norm;\n  }\n\n  // Fix any sign issues. This is a bugfix.\n  asp::fixQuaternionSigns(ls_model);\n  \n  return;\n}\n\n// Normalize quaternions in UsgsAstroFrameSensorModel.\nvoid normalizeQuaternions(UsgsAstroFrameSensorModel * frame_model) {\n\n  // Fetch the quaternions. In the model, the positions are stored first, then\n  // the quaternions. \n  double q[4];\n  double norm = 0.0;\n  for (size_t i = 0; i < 4; i++) {\n    q[i] = frame_model->getParameterValue(i + 3); \n    norm += q[i]*q[i];\n  }\n  norm = sqrt(norm);\n\n  if (norm == 0)\n    return;\n    \n  // Normalize the quaternions. Put them back in the model.\n  for (size_t i = 0; i < 4; i++) {\n    q[i] /= norm;\n    frame_model->setParameterValue(i + 3, q[i]);\n  }\n\n  return;\n}\n\n// Get quaternions. This duplicates the UsgsAstroLsSensorModel function as that one is private\nvoid interpQuaternions(UsgsAstroLsSensorModel const* ls_model, double time,\n                      double q[4]) {\n  int nOrder = 8;\n  if (ls_model->m_platformFlag == 0)\n    nOrder = 4;\n  int nOrderQuat = nOrder;\n  if (ls_model->m_numQuaternions/4 < 6 && nOrder == 8)\n    nOrderQuat = 4;\n  \n  lagrangeInterp(ls_model->m_numQuaternions / 4, &ls_model->m_quaternions[0],\n                 ls_model->m_t0Quat, ls_model->m_dtQuat, time, 4, nOrderQuat, q);\n}\n\n// Get positions. Based on the UsgsAstroLsSensorModel code.\nvoid interpPositions(std::vector<double> const& positions,\n                     double t0Ephem, double dtEphem, int platformFlag,\n                     double time, double pos[3]) {\n  int nOrder = 8;\n  if (platformFlag == 0)\n    nOrder = 4;\n  \n  // This seems to handle gracefully when the number of positions is very small.\n  lagrangeInterp(positions.size() / 3, &positions[0],\n                 t0Ephem, dtEphem,\n                 time, 3, nOrder, pos);\n}\n\n// Get positions. Based on the UsgsAstroLsSensorModel code.\nvoid interpPositions(UsgsAstroLsSensorModel const* ls_model, double time,\n                     double pos[3]) {\n  // Call the above wrapper\n  interpPositions(ls_model->m_positions, ls_model->m_t0Ephem, ls_model->m_dtEphem,\n                  ls_model->m_platformFlag, time, pos);\n}\n\n// Get positions. Based on the UsgsAstroLsSensorModel code.\n// TODO(oalexan1): Move this to a new CsmModelUtils.cc file and\nvoid interpVelocities(UsgsAstroLsSensorModel const* ls_model, double time,\n                  double vel[3]) {\n  int nOrder = 8;\n  if (ls_model->m_platformFlag == 0)\n    nOrder = 4;\n  double sensPosNom[3];\n  lagrangeInterp(ls_model->m_numPositions / 3, &ls_model->m_velocities[0],\n                 ls_model->m_t0Ephem, ls_model->m_dtEphem,\n                 time, 3, nOrder, vel);\n}\n\n// Nearest neighbor interpolation into a sequence of vectors of length\n// vectorLength, stored one after another in valueArray. The result\n// goes in valueVector. Analogous to lagrangeInterp() in CSM.\nvoid nearestNeibInterp(const int &numTimes, const double *valueArray,\n                       const double &startTime, const double &delTime,\n                       const double &time, const int &vectorLength,\n                       double *valueVector) {\n  \n  if (numTimes < 1)\n    vw::vw_throw(vw::ArgumentErr() << \"Cannot interpolate into a vector of zero length.\\n\");\n  \n  // Compute index\n  int index = round((time - startTime) / delTime);\n  if (index < 0) \n    index = 0;\n  if (index >= numTimes)\n    index = numTimes - 1;\n\n  int start = index * vectorLength;\n  for (int i = 0; i < vectorLength; i++)\n    valueVector[i] = valueArray[start + i];\n\n  return;\n}\n\n// Given two values, double t1, t2, and to points, vw::Vector3 P1, P2, at those\n// values, find the value at t using linear interpolation.\nvw::Vector3 linearInterp(double t1, double t2, vw::Vector3 const& P1,\n                         vw::Vector3 const& P2, double t) {\n    if (t1 == t2)\n      vw::vw_throw(vw::ArgumentErr() << \"Expecting t1 != t2 in interpolation.\\n\");\n\n  double alpha = (t - t1)/(t2 - t1);\n  return P1 + alpha*(P2 - P1);\n}\n\n// - Given a vector of positions with starting time and spacing, and a new\n//   starting time, spacing, and number of points, interpolate the positions at\n//   the new locations. If outside the range, use linear extrapolation. For\n//   that, assume the points are in ECEF, giving an orbit, so first convert to\n//   projected coordinates to make the extrapolated trajectory still go around\n//   the planet rather than go on a tangent. \n// - Will return the original value at points at which the new time is the same as old\n//   time (within 1e-8 time tolerance).\nvoid orbitInterpExtrap(double t0_in, double dt_in, int platformFlag,\n  std::vector<double> const& positions_in, vw::cartography::GeoReference const& geo, \n  double t0_out, double dt_out, int num_out, std::vector<double> & positions_out) {\n\n  // Wipe the output\n  positions_out.clear();\n\n  // Sanity checks\n  if (positions_in.size() < 2 || num_out < 2)\n    vw::vw_throw(vw::ArgumentErr() << \"Expecting at least two positions in interpolation.\\n\");\n  if (dt_in <= 0.0 || dt_out <= 0.0)\n    vw::vw_throw(vw::ArgumentErr() << \"Expecting positive time step in interpolation.\\n\");\n\n  // May need to create new orbital points for interpolation/extrapolation. Start\n  // by putting the existing ones in a map.\n  std::map<double, vw::Vector3> time_to_pos;\n  for (size_t i = 0; i < positions_in.size()/NUM_XYZ_PARAMS; i++) {\n    double t = t0_in + i * dt_in;\n    int start = i * NUM_XYZ_PARAMS;\n    vw::Vector3 pos(positions_in[start + 0], positions_in[start + 1], \n                    positions_in[start + 2]);\n    time_to_pos[t] = pos;\n  }\n\n  // Add left extrapolated points. Use first two positions for linear extrapolation.\n  // Extrapolation is done in projected coordinates, to stay in orbit,\n  // and then converted back to ECEF. Add at least 8 points to help with Lagrange\n  // interpolation later.\n  auto it = time_to_pos.begin();\n  vw::Vector3 P0 = it->second;\n  it++; \n  vw::Vector3 P1 = it->second;\n  vw::Vector3 proj0 = vw::cartography::ecefToProj(geo, P0);\n  vw::Vector3 proj1 = vw::cartography::ecefToProj(geo, P1);\n  double t = t0_in;\n  while (t + 8 * dt_in >= t0_out) {\n    t -= dt_in;\n    vw::Vector3 proj = linearInterp(t0_in, t0_in + dt_in, proj0, proj1, t);\n    vw::Vector3 P = vw::cartography::projToEcef(geo, proj);\n    time_to_pos[t] = P;\n  }\n\n  // Now do the same at the end. Use (t1, P1) for the last point, and (t0, P0) for\n  // the second to last point. Extrapolate to the right of t1.\n  it = time_to_pos.end(); \n  it--;\n  P1 = it->second;\n  double t1 = it->first;\n  it--;\n  double t0 = it->first;\n  P0 = it->second;\n  proj0 = vw::cartography::ecefToProj(geo, P0);\n  proj1 = vw::cartography::ecefToProj(geo, P1);\n\n  // Add right extrapolated points. Need to have at least 8 to be able to\n  // interpolate using Lagrange.\n  double t_out_end = t0_out + (num_out - 1) * dt_out;\n  t = t1; \n  while (t - 8 * dt_in <= t_out_end) {\n    t += dt_in;\n    vw::Vector3 proj = linearInterp(t0, t1, proj0, proj1, t);\n    vw::Vector3 P = vw::cartography::projToEcef(geo, proj);\n    time_to_pos[t] = P;\n  }\n\n  // Put all the produced values in the same vector, in order of time\n  int num_extra = time_to_pos.size();\n  double t0_extra = time_to_pos.begin()->first;\n  double dt_extra = dt_in;\n  std::vector<double> extra_positions(num_extra * NUM_XYZ_PARAMS);\n  int count = 0;\n  for (auto it = time_to_pos.begin(); it != time_to_pos.end(); it++) {\n    vw::Vector3 P = it->second;\n    extra_positions[count*NUM_XYZ_PARAMS + 0] = P[0];\n    extra_positions[count*NUM_XYZ_PARAMS + 1] = P[1];\n    extra_positions[count*NUM_XYZ_PARAMS + 2] = P[2];\n    count++;\n  }\n\n  // Now we have enough positions to interpolate at\n  positions_out.resize(num_out * NUM_XYZ_PARAMS);\n  for (int i = 0; i < num_out; i++) {\n    double t = t0_out + i * dt_out;\n\n    // If this is in the input data, just copy the value\n    double i_in_float = (t - t0_in)/dt_in;\n    int i_in = round(i_in_float);\n    // TODO(oalexan1): The check below is sensitive to large t values\n    // and to dt being on the order of 1e-8, which does not happen in practice,\n    // but should be improved, somehow.\n    if (i_in >= 0 && i_in < positions_in.size()/NUM_XYZ_PARAMS &&\n        std::abs(t - (t0_in + i_in*dt_in)) < 1e-8) {\n      positions_out[i*NUM_XYZ_PARAMS + 0] = positions_in[i_in*NUM_XYZ_PARAMS + 0];\n      positions_out[i*NUM_XYZ_PARAMS + 1] = positions_in[i_in*NUM_XYZ_PARAMS + 1];\n      positions_out[i*NUM_XYZ_PARAMS + 2] = positions_in[i_in*NUM_XYZ_PARAMS + 2];\n      continue;\n    }\n\n    double P[3];\n    interpPositions(extra_positions, t0_extra, dt_extra, platformFlag, t, P);\n    positions_out[i*NUM_XYZ_PARAMS + 0] = P[0];\n    positions_out[i*NUM_XYZ_PARAMS + 1] = P[1];\n    positions_out[i*NUM_XYZ_PARAMS + 2] = P[2];\n  }\n\n  return;\n}\n\n// Find interpolated/extrapolated positions at all camera pose times.\n// See the function being called below for more details.\nvoid orbitInterpExtrap(UsgsAstroLsSensorModel const * ls_model,\n                       vw::cartography::GeoReference const& geo,\n                       std::vector<double> & positions_out) {\n\n  orbitInterpExtrap(ls_model->m_t0Ephem, ls_model->m_dtEphem, ls_model->m_platformFlag,  \n                    ls_model->m_positions,\n                    geo, ls_model->m_t0Quat, ls_model->m_dtQuat, \n                    ls_model->m_quaternions.size()/NUM_QUAT_PARAMS,\n                    positions_out); // output\n}\n\n// See documentation in CsmUtils.h\nvoid populateCsmLinescan(double first_line_time, double dt_line, \n                         double t0_ephem, double dt_ephem,\n                         double t0_quat, double dt_quat, \n                         double focal_length,\n                         vw::Vector2                const & optical_center,\n                         vw::Vector2i               const & image_size,\n                         vw::cartography::Datum     const & datum, \n                         std::string                const & sensor_id, \n                         std::vector<vw::Vector3>   const & positions,\n                         std::vector<vw::Vector3>   const & velocities,\n                         std::vector<vw::Matrix3x3> const & cam2world,\n                         // Outputs\n                         asp::CsmModel                    & model) {\n  \n  // Sanity checks\n  if (positions.size() != cam2world.size())\n    vw_throw(vw::ArgumentErr() << \"Expecting as many positions as orientations.\\n\");\n  if (velocities.size() != positions.size())\n    vw_throw(vw::ArgumentErr() << \"Expecting as many velocities as positions.\\n\");\n      \n  // Do not use a precision below 1.0e-8 as then the linescan model will return junk.\n  model.m_desired_precision = asp::DEFAULT_CSM_DESIRED_PRECISION;\n  model.m_semi_major_axis = datum.semi_major_axis();\n  model.m_semi_minor_axis = datum.semi_minor_axis();\n\n  // Create the linescan model. Memory is managed by m_gm_model.\n  model.m_gm_model = boost::make_shared<UsgsAstroLsSensorModel>();\n  UsgsAstroLsSensorModel* ls_model\n    = dynamic_cast<UsgsAstroLsSensorModel*>(model.m_gm_model.get());\n  if (ls_model == NULL)\n    vw::vw_throw(vw::ArgumentErr() << \"Invalid initialization of the linescan model.\\n\");\n\n  // This performs many initializations apart from the above\n  ls_model->reset();\n\n  // Override some initializations\n  ls_model->m_nSamples         = image_size[0]; \n  ls_model->m_nLines           = image_size[1];\n  ls_model->m_platformFlag     = 1; // Use 1, for order 8 Lagrange interpolation\n  ls_model->m_minElevation     = -10000.0; // -10 km\n  ls_model->m_maxElevation     =  10000.0; //  10 km\n  ls_model->m_focalLength      = focal_length;\n  ls_model->m_zDirection       = 1.0;\n  ls_model->m_halfSwath        = 1.0;\n  ls_model->m_sensorIdentifier = sensor_id;\n  ls_model->m_majorAxis        = model.m_semi_major_axis;\n  ls_model->m_minorAxis        = model.m_semi_minor_axis;\n  \n  // The choices below are copied from the DigitalGlobe CSM linescan model.\n  // Better to keep same convention than dig deep inside UsAstroLsSensorModel.\n  // Also keep in mind that a CSM pixel has extra 0.5 added to it.\n  ls_model->m_iTransL[0]             = 0.0;  \n  ls_model->m_iTransL[1]             = 0.0;\n  ls_model->m_iTransL[2]             = 1.0;\n  ls_model->m_iTransS[0]             = 0.0;\n  ls_model->m_iTransS[1]             = 1.0;\n  ls_model->m_iTransS[2]             = 0.0;\n  ls_model->m_detectorLineSumming    = 1.0;\n  ls_model->m_detectorSampleSumming  = 1.0;\n  \n  // Keep these as is. Modify instead m_detectorLineOrigin and\n  // m_detectorSampleOrigin. The effect is same as all USGSCSM code uses\n  // m_detectorLineOrigin - m_startingDetectorLine, and the same for the sample.\n  ls_model->m_startingDetectorLine   = 0.0;\n  ls_model->m_startingDetectorSample = 0.0;\n  \n  // Optical center. There is an inconsistency below, but this is what works.\n  ls_model->m_detectorLineOrigin     = optical_center[1];\n  ls_model->m_detectorSampleOrigin   = optical_center[0] + 0.5;\n  \n  // Set the time \n  ls_model->m_intTimeLines.push_back(1.0); // to offset CSM's quirky 0.5 additions in places\n  ls_model->m_intTimeStartTimes.push_back(first_line_time);\n  ls_model->m_intTimes.push_back(dt_line); // time between lines\n\n  // Copy positions and velocities\n  ls_model->m_t0Ephem = t0_ephem;\n  ls_model->m_dtEphem = dt_ephem;\n  ls_model->m_numPositions = 3 * positions.size(); // concatenate all coordinates\n  ls_model->m_positions.resize(ls_model->m_numPositions);\n  ls_model->m_velocities.resize(ls_model->m_numPositions);\n  for (size_t index = 0; index < positions.size(); index++) {\n    vw::Vector3 ctr = positions[index];\n    vw::Vector3 vel = velocities[index];\n    for (int coord = 0; coord < 3; coord++) {\n      ls_model->m_positions [3*index + coord] = ctr[coord];\n      ls_model->m_velocities[3*index + coord] = vel[coord];\n    }\n  }\n  \n  // Copy orientations\n  ls_model->m_numQuaternions = 4 * cam2world.size();\n  ls_model->m_t0Quat = t0_quat;\n  ls_model->m_dtQuat = dt_quat;\n  ls_model->m_quaternions.resize(ls_model->m_numQuaternions);\n  for (size_t index = 0; index < cam2world.size(); index++) {\n    auto c2w = cam2world[index];\n    double x, y, z, w;\n    asp::matrixToQuaternion(c2w, x, y, z, w);\n\n    // Note how we store the quaternions in the order x, y, z, w, not w, x, y, z.\n    int coord = 0;\n    ls_model->m_quaternions[4*index + coord] = x; coord++;\n    ls_model->m_quaternions[4*index + coord] = y; coord++;\n    ls_model->m_quaternions[4*index + coord] = z; coord++;\n    ls_model->m_quaternions[4*index + coord] = w; coord++;\n  }\n  \n  // Quaternions must always be normalized and not change suddenly in sign.\n  asp::normalizeQuaternions(ls_model);\n\n  // Use the radtan distortion model with zero distortion\n  ls_model->m_distortionType = RADTAN;\n  ls_model->m_opticalDistCoeffs.resize(5, 0.0);\n  \n  // Re-creating the model from the state forces some operations to\n  // take place which are inaccessible otherwise.\n  std::string modelState = ls_model->getModelState();\n  ls_model->replaceModelState(modelState);\n}\n\n// Apply the given adjustment to the given CSM camera.\n// The camera is passed twice, once as a CSM model, and once as a\n// CamPtr, as the latter may have the CSM model as a member or \n// as a base class, depending on the implementation.\n// TODO(oalexan1): This needs to be made uniform.\nvoid applyAdjustmentToCsmCamera(std::string const& image_file,\n                                std::string const& camera_file,\n                                std::string const& adjust_prefix,\n                                vw::CamPtr  const& cam,\n                                asp::CsmModel    * csm_cam) {\n\n  std::string adjust_file = asp::bundle_adjust_file_name(adjust_prefix, image_file, \n                                                         camera_file);\n  vw::vw_out() << \"Reading input adjustment: \" << adjust_file << std::endl;\n  vw::camera::AdjustedCameraModel adj_cam(vw::camera::unadjusted_model(cam));\n  adj_cam.read(adjust_file);\n  vw::Matrix4x4 ecef_transform = adj_cam.ecef_transform();\n  csm_cam->applyTransform(ecef_transform);\n}\n\n// Calc the time of first image line, last image line, elapsed time\n// between these lines, and elapsed time per line.  This assumes a\n// linear relationship between lines and time.\n// TODO(oalexan1): This is fragile. Maybe it can be avoided.\nvoid calcTimes(UsgsAstroLsSensorModel const* ls_model,\n               double & earlier_line_time, double & later_line_time,\n               double & elapsed_time, double & dt_per_line) {\n\n  int numLines = ls_model->m_nLines;\n  csm::ImageCoord imagePt;\n\n  asp::toCsmPixel(vw::Vector2(0, 0), imagePt);\n  earlier_line_time = ls_model->getImageTime(imagePt);\n\n  asp::toCsmPixel(vw::Vector2(0, numLines - 1), imagePt);\n  later_line_time = ls_model->getImageTime(imagePt);\n\n  // See note in resampleModel().\n  if (earlier_line_time > later_line_time)\n    std::swap(earlier_line_time, later_line_time);\n  \n  elapsed_time = later_line_time - earlier_line_time;\n  dt_per_line = elapsed_time / (numLines - 1.0);\n\n  if (later_line_time <= earlier_line_time)\n    vw::vw_throw(vw::ArgumentErr()\n                 << \"The time of the last line (in scanning order) must be larger than \"\n                 << \"first line time.\\n\");\n  \n  return;\n}\n\n// Calculate the line index for first and last tabulated position.\n// We always expect these to be less than first line index (0), and no less\n// than last valid image line index (numLines - 1), respectively.\n// TODO(oalexan1): This assumes a linear relationship between time and lines,\n// which is fragile. At least need to check that this assumption is satisfied.\nvoid calcFirstLastPositionLines(UsgsAstroLsSensorModel const* ls_model, \n                                double & beg_position_line, double & end_position_line) {\n\n  double earlier_line_time = -1.0, later_line_time = -1.0, \n         elapsed_time = -1.0, dt_per_line = -1.0;\n  calcTimes(ls_model, earlier_line_time, later_line_time, elapsed_time,  \n               dt_per_line);\n  \n  // Find time of first and last tabulated position.\n  double bt = ls_model->m_t0Ephem;\n  double et = bt + (ls_model->m_positions.size()/NUM_XYZ_PARAMS - 1) * ls_model->m_dtEphem;\n\n  // Use the equation: time = earlier_line_time + line * dt_per_line.\n  // See note in resampleModel() about scan direction.\n  beg_position_line = (bt - earlier_line_time) / dt_per_line;\n  end_position_line = (et - earlier_line_time) / dt_per_line;\n\n  // Sanity checks\n  if (beg_position_line > 1e-3) // allow for rounding errors \n    vw::vw_throw(vw::ArgumentErr() << \"Line of first tabulated position is \"\n                 << beg_position_line << \", which is after first image line, which is \"\n                 << 0 << \".\\n\");\n  int numLines = ls_model->m_nLines;\n  if (end_position_line < numLines - 1 - 1e-3)  // allow for rounding errors\n    vw::vw_throw(vw::ArgumentErr() << \"Line of last tabulated position is \"\n                 << end_position_line << \", which is before last image line, which is \"\n                 << numLines - 1 << \".\\n\");\n}\n  \n// Calculate the line index for first and last tabulated orientation.\n// We always expect these to be less than first line index (0), and no less\n// than last valid image line index (numLines - 1), respectively.\nvoid calcFirstLastOrientationLines(UsgsAstroLsSensorModel const* ls_model, \n                                   double & beg_orientation_line, double & end_orientation_line) {\n\n  double earlier_line_time = -1.0, later_line_time = -1.0, \n         elapsed_time = -1.0, dt_per_line = -1.0;\n  calcTimes(ls_model, earlier_line_time, later_line_time, elapsed_time,  \n               dt_per_line);\n  \n  // Find time of first and last tabulated orientation.\n  double bt = ls_model->m_t0Quat;\n  double et = bt + (ls_model->m_quaternions.size()/NUM_QUAT_PARAMS - 1) * ls_model->m_dtQuat;\n  \n  // Use the equation: time = earlier_line_time + line * dt_per_line.\n  beg_orientation_line = (bt - earlier_line_time) / dt_per_line;\n  end_orientation_line = (et - earlier_line_time) / dt_per_line;\n\n  // Sanity checks\n  if (beg_orientation_line > 1e-3) // allow for rounding errors \n    vw::vw_throw(vw::ArgumentErr() << \"Line of first tabulated orientation is \"\n                 << beg_orientation_line << \", which is after first image line, which is \"\n                   << 0 << \".\\n\");\n  int numLines = ls_model->m_nLines;\n  if (end_orientation_line < numLines - 1 - 1e-3)  // allow for rounding errors\n    vw::vw_throw(vw::ArgumentErr() << \"Line of last tabulated orientation is \"\n                 << end_orientation_line << \", which is before last image line, which is \"\n                   << numLines - 1 << \".\\n\");\n}\n\n// Resample Vector3 data to a denser uniform grid using Lagrange interpolation.\n// Order = number of interpolation points (4 for cubic, 8 for degree 7).\n// Factor = output density multiplier: output has (n_in - 1) * factor + 1 points.\nvoid resampleVec3Lagrange(std::vector<double> const& in_times,\n                          std::vector<vw::Vector3> const& in_vals,\n                          int order, int factor,\n                          std::vector<double>& out_times,\n                          std::vector<vw::Vector3>& out_vals) {\n  int n_in = in_times.size();\n  int n_out = (n_in - 1) * factor + 1;\n  double t_start = in_times.front();\n  double t_end = in_times.back();\n  int radius = order / 2;\n\n  vw::LagrangianInterpolationVarTime interp(in_vals, in_times, radius);\n\n  out_times.resize(n_out);\n  out_vals.resize(n_out);\n  for (int i = 0; i < n_out; i++) {\n    out_times[i] = t_start + i * (t_end - t_start) / (n_out - 1.0);\n    out_vals[i] = interp(out_times[i]);\n  }\n}\n\n// Resample quaternion data to a denser uniform grid using Lagrange\n// interpolation on the quaternion components. The result is normalized.\nvoid resampleQuatLagrange(std::vector<double> const& in_times,\n                          std::vector<vw::Quaternion<double>> const& in_vals,\n                          int order, int factor,\n                          std::vector<double>& out_times,\n                          std::vector<vw::Quaternion<double>>& out_vals) {\n  int n_in = in_times.size();\n  int n_out = (n_in - 1) * factor + 1;\n  double t_start = in_times.front();\n  double t_end = in_times.back();\n  int radius = order / 2;\n\n  vw::QuatLagrangianInterpolationVarTime interp(in_vals, in_times, radius);\n\n  out_times.resize(n_out);\n  out_vals.resize(n_out);\n  for (int i = 0; i < n_out; i++) {\n    out_times[i] = t_start + i * (t_end - t_start) / (n_out - 1.0);\n    out_vals[i] = interp(out_times[i]);\n  }\n}\n\n// Resample quaternion data to a denser uniform grid using SLERP\n// (spherical linear interpolation between adjacent samples).\nvoid resampleQuatSlerp(std::vector<double> const& in_times,\n                       std::vector<vw::Quaternion<double>> const& in_vals,\n                       int factor,\n                       std::vector<double>& out_times,\n                       std::vector<vw::Quaternion<double>>& out_vals) {\n  int n_in = in_times.size();\n  int n_out = (n_in - 1) * factor + 1;\n  double t_start = in_times.front();\n  double t_end = in_times.back();\n  double dt_in = (t_end - t_start) / (n_in - 1.0);\n\n  // Create the same SLERP interpolator used by the old VW linescan paths\n  vw::SLERPPoseInterpolation slerp(in_vals, t_start, dt_in);\n\n  out_times.resize(n_out);\n  out_vals.resize(n_out);\n  for (int i = 0; i < n_out; i++) {\n    out_times[i] = t_start + i * (t_end - t_start) / (n_out - 1.0);\n    out_vals[i] = slerp(out_times[i]);\n  }\n}\n\n// The provided tabulated positions, velocities and quaternions may be too few,\n// so resample them with --num-lines-per-position and --num-lines-per-orientation,\n// if those are set. Throughout this function the lines are indexed in the order\n// they are acquired, which can be the reverse of the order they are eventually\n// stored in the file if the scan direction is reverse.\n// This function assumes the quaternions have been normalized.\nvoid resampleModel(int num_lines_per_position, int num_lines_per_orientation,\n                   UsgsAstroLsSensorModel * ls_model) {\n  \n  // The positions and quaternions can go way beyond the valid range of image lines,\n  // so need to estimate how many of them are within the range.\n  int numLines = ls_model->m_nLines;\n  vw::vw_out() << \"Number of lines: \" << numLines << \".\\n\";\n\n  double earlier_line_time = -1.0, later_line_time = -1.0, \n         elapsed_time = -1.0, dt_per_line = -1.0;\n  calcTimes(ls_model, earlier_line_time, later_line_time, elapsed_time,  \n            dt_per_line);\n\n  // Line index of first and last tabulated position\n  double beg_position_line = -1.0, end_position_line = -1.0;\n  calcFirstLastPositionLines(ls_model, beg_position_line, end_position_line);\n  vw::vw_out() << std::setprecision (17) << \"Line of first and last tabulated position: \"\n           << beg_position_line << ' ' << end_position_line << \"\\n\";\n\n  // Line index of first and last tabulated orientation\n  double beg_orientation_line = -1.0, end_orientation_line = -1.0;\n  calcFirstLastOrientationLines(ls_model, beg_orientation_line, end_orientation_line);\n  vw::vw_out() << std::setprecision (17) << \"Line of first and last tabulated orientation: \"\n           << beg_orientation_line << ' ' << end_orientation_line << \"\\n\";\n\n  double numInputLinesPerPosition = (numLines - 1) * ls_model->m_dtEphem / elapsed_time;\n  double numInputLinesPerOrientation = (numLines - 1) * ls_model->m_dtQuat / elapsed_time;\n  vw::vw_out() << \"Number of image lines per input position: \"\n           << round(numInputLinesPerPosition) << \"\\n\";\n  vw::vw_out() << \"Number of image lines per input orientation: \"\n           << round(numInputLinesPerOrientation) << \"\\n\";\n\n  if (num_lines_per_position > 0) {\n    // Resample in such a way that first and last samples are preserved. This is tricky.\n    double posFactor = double(numInputLinesPerPosition) / double(num_lines_per_position);\n    if (posFactor <= 0.0)\n      vw::vw_throw(vw::ArgumentErr() << \"Invalid image.\\n\");\n\n    int numOldMeas = ls_model->m_numPositions / NUM_XYZ_PARAMS;\n    int numNewMeas = round(posFactor * (numOldMeas - 1.0)) + 1; // careful here\n    numNewMeas = std::max(numNewMeas, 2);\n\n    posFactor = double(numNewMeas - 1.0) / double(numOldMeas - 1.0);\n    double currDtEphem = ls_model->m_dtEphem / posFactor;\n    double numLinesPerPosition = (numLines - 1.0) * currDtEphem / elapsed_time;\n    vw::vw_out() << \"Resampled number of lines per position: \"\n             << numLinesPerPosition << \"\\n\";\n    std::vector<double> positions(NUM_XYZ_PARAMS * numNewMeas, 0);\n    std::vector<double> velocities(NUM_XYZ_PARAMS * numNewMeas, 0);\n    for (int ipos = 0; ipos < numNewMeas; ipos++) {\n      double time = ls_model->m_t0Ephem + ipos * currDtEphem;\n      asp::interpPositions(ls_model, time, &positions[NUM_XYZ_PARAMS * ipos]);\n      asp::interpVelocities(ls_model, time, &velocities[NUM_XYZ_PARAMS * ipos]);\n    }\n    \n    // Overwrite in the model. Time of first tabulated position does not change.\n    ls_model->m_dtEphem = currDtEphem;\n    ls_model->m_numPositions = positions.size();\n    ls_model->m_positions = positions;\n    ls_model->m_velocities = velocities;\n\n    // Sanity check\n    double new_beg_position_line = -1.0, new_end_position_line = -1.0;\n    calcFirstLastPositionLines(ls_model, new_beg_position_line, new_end_position_line);\n    if (std::abs(beg_position_line - new_beg_position_line) > 1.0e-3 ||\n        std::abs(end_position_line - new_end_position_line) > 1.0e-3)\n      vw::vw_throw(vw::ArgumentErr() << \"Bookkeeping failure. Resampling was done \"\n                   << \"without preserving first and last tabulated position time.\\n\");\n  }\n\n  if (num_lines_per_orientation > 0) {\n    // Resample in such a way that first and last samples are preserved. This is tricky.\n    double posFactor = double(numInputLinesPerOrientation) / double(num_lines_per_orientation);\n    if (posFactor <= 0.0)\n      vw::vw_throw(vw::ArgumentErr() << \"Invalid image.\\n\");\n\n    int numOldMeas = ls_model->m_numQuaternions / NUM_QUAT_PARAMS;\n    int numNewMeas = round(posFactor * (numOldMeas - 1.0)) + 1; // careful here\n    numNewMeas = std::max(numNewMeas, 2);\n\n    posFactor = double(numNewMeas - 1.0) / double(numOldMeas - 1.0);\n    double currDtQuat = ls_model->m_dtQuat / posFactor;\n    double numLinesPerOrientation = (numLines - 1.0) * currDtQuat / elapsed_time;\n    vw::vw_out() << \"Resampled number of lines per orientation: \"\n             << numLinesPerOrientation << \"\\n\";\n    std::vector<double> quaternions(NUM_QUAT_PARAMS * numNewMeas, 0);\n    for (int ipos = 0; ipos < numNewMeas; ipos++) {\n      double time = ls_model->m_t0Quat + ipos * currDtQuat;\n      asp::interpQuaternions(ls_model, time, &quaternions[NUM_QUAT_PARAMS * ipos]);\n    }\n    \n    // Overwrite in the model. Time of first tabulated orientation does not change.\n    ls_model->m_dtQuat = currDtQuat;\n    ls_model->m_numQuaternions = quaternions.size();\n    ls_model->m_quaternions = quaternions;\n\n    // Sanity check\n    double new_beg_orientation_line = -1.0, new_end_orientation_line = -1.0;\n    calcFirstLastOrientationLines(ls_model, new_beg_orientation_line, new_end_orientation_line);\n    if (std::abs(beg_orientation_line - new_beg_orientation_line) > 1.0e-3 ||\n        std::abs(end_orientation_line - new_end_orientation_line) > 1.0e-3)\n      vw::vw_throw(vw::ArgumentErr() << \"Bookkeeping failure. Resampling was done \"\n                   << \"without preserving first and last tabulated orientation time.\\n\");\n  }\n\n  return;\n}\n\n// Get the time at a given line. \ndouble get_time_at_line(double line, UsgsAstroLsSensorModel const* ls_model) {\n\n  csm::ImageCoord csm_pix;\n  vw::Vector2 pix(0, line);\n  asp::toCsmPixel(pix, csm_pix);\n  return ls_model->getImageTime(csm_pix);\n}\n\n// Get the line number at a given time. This assumes a linear relationship\n// between them (rather than piecewise linear).\ndouble get_line_at_time(double time, UsgsAstroLsSensorModel const* ls_model) {\n\n  // All dt values in m_ls_model->m_intTimes must be equal, or else\n  // the model is not linear in time.\n  for (size_t i = 1; i < ls_model->m_intTimeLines.size(); i++) {\n    if (std::abs(ls_model->m_intTimes[i] - ls_model->m_intTimes[0]) > 1e-10)\n      vw::vw_throw(vw::ArgumentErr() \n                    << \"Expecting a linear relation between time and image lines.\\n\");\n  }\n  \n  int line0 = 0;\n  int line1 = ls_model->m_nLines - 1;\n  double time0 = get_time_at_line(line0, ls_model);\n  double time1 = get_time_at_line(line1, ls_model);\n    \n  return line0 + (line1 - line0) * (time - time0) / (time1 - time0);\n}\n\n// Get camera center at a given time\nvw::Vector3 get_camera_center_at_time(double time, UsgsAstroLsSensorModel const* ls_model) {\n  csm::EcefCoord ecef = ls_model->getSensorPosition(time);\n  return vw::Vector3(ecef.x, ecef.y, ecef.z);\n}\n  \n// Get camera velocity at a given time\nvw::Vector3 get_camera_velocity_at_time(double time, UsgsAstroLsSensorModel const* ls_model) {\n  csm::EcefVector ecef = ls_model->getSensorVelocity(time);\n  return vw::Vector3(ecef.x, ecef.y, ecef.z);\n}\n\n// Re implementation of the CSM wrapper around the USGS function for going from\n// a pixel to a ray. Need it because cannot access the CSM model given the ls model.\nvw::Vector3 pixel_to_vector(vw::Vector2 const& pix, UsgsAstroLsSensorModel const* ls_model,\n                            double desired_precision) {\n\n  csm::ImageCoord csm_pix;\n  asp::toCsmPixel(pix, csm_pix);\n\n  double achievedPrecision = -1.0; // will be modified in the function\n  csm::EcefLocus locus = ls_model->imageToRemoteImagingLocus(csm_pix,\n                                                             desired_precision,\n                                                             &achievedPrecision);\n  vw::Vector3 dir = ecefVectorToVector(locus.direction);\n  return dir;\n}\n\n// Adjust the linescan model to correct for velocity aberration and/or\n// atmospheric refraction.\nvoid orbitalCorrections(asp::CsmModel * csm_model, \n                        bool correct_velocity_aberration,\n                        bool correct_atmospheric_refraction,\n                        double local_earth_radius, \n                        double mean_ground_elevation) {\n  \n  UsgsAstroLsSensorModel *ls_model \n    = dynamic_cast<UsgsAstroLsSensorModel*>(csm_model->m_gm_model.get());\n\n  if (ls_model == NULL)\n    vw::vw_throw(vw::ArgumentErr() << \"Invalid initialization of the linescan model.\\n\");\n\n  // Collect the updated quaternions in a separate vector, to not interfere\n  // with using the current ones during the correction process.\n  std::vector<double> updated_quats(ls_model->m_quaternions.size());\n  \n  auto & qv = ls_model->m_quaternions; // shorthand\n  for (int pos_it = 0; pos_it < ls_model->m_numQuaternions / 4; pos_it++) {\n\n    double t = ls_model->m_t0Quat + pos_it * ls_model->m_dtQuat;\n    vw::Vector3 cam_ctr = asp::get_camera_center_at_time(t, ls_model);\n    vw::Vector3 vel = asp::get_camera_velocity_at_time(t, ls_model);\n\n    // Get back to VW quaternion format\n    vw::Quat q(qv[4*pos_it + 3], qv[4*pos_it + 0], qv[4*pos_it + 1], qv[4*pos_it + 2]);\n\n    // Find the line at the given time based on a linear fit\n    double line = asp::get_line_at_time(t, ls_model);\n\n    // Find the cam_direction at the center of the line\n    vw::Vector2 pix(ls_model->m_nSamples/2.0, line);\n    vw::Vector3 cam_dir = csm_model->pixel_to_vector(pix);\n    vw::Quaternion<double> corr_rot;\n    \n    if (correct_atmospheric_refraction) {\n      // Find and apply the atmospheric refraction correction\n      cam_dir = vw::camera::apply_atmospheric_refraction_correction\n                      (cam_ctr, local_earth_radius, mean_ground_elevation, cam_dir, \n                       corr_rot); // output\n      q = corr_rot * q;\n    }\n\n    if (correct_velocity_aberration) {\n      // Find and apply the velocity aberration correction\n      cam_dir = vw::camera::apply_velocity_aberration_correction\n                      (cam_ctr, vel, local_earth_radius, cam_dir, \n                      corr_rot); // output\n      q = corr_rot * q;\n    }\n    \n    // Create the updated quaternions. ASP stores the quaternions as (w, x, y,\n    // z). CSM wants them as x, y, z, w.\n    updated_quats[4*pos_it + 0] = q.x();\n    updated_quats[4*pos_it + 1] = q.y();\n    updated_quats[4*pos_it + 2] = q.z();\n    updated_quats[4*pos_it + 3] = q.w();\n  }\n\n  // Replace with the updated quaternions\n  ls_model->m_quaternions = updated_quats;\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Camera/CsmUtils.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file CsmUtils.h\n\n// Functions used for handling CSM camera models.\n\n#ifndef __ASP_CAMERA_CSM_UTILS_H__\n#define __ASP_CAMERA_CSM_UTILS_H__\n\n#include <vw/Camera/CameraModel.h>\n#include <vw/Math/Matrix.h>\n#include <vw/Math/Quaternion.h>\n\n#include <string>\n#include <iostream>\n#include <map>\n#include <vector>\n\nclass UsgsAstroFrameSensorModel;\nclass UsgsAstroLsSensorModel;\n\nnamespace vw {\n  namespace cartography {\n    class Datum;\n    class GeoReference;\n  }\n}\n\nnamespace asp {\n\nclass CsmModel;\n\n// Normalize quaternions in UsgsAstroLsSensorModel.\nvoid normalizeQuaternions(UsgsAstroLsSensorModel * ls_model);\n\n// Normalize quaternions in UsgsAstroFrameSensorModel.\nvoid normalizeQuaternions(UsgsAstroFrameSensorModel * frame_model);\n\n// Get quaternions. This duplicates the UsgsAstroLsSensorModel function as that one is private\nvoid interpQuaternions(UsgsAstroLsSensorModel const* ls_model, double time,\n                       double q[4]);\n\n// Get positions. Based on the UsgsAstroLsSensorModel code.\nvoid interpPositions(UsgsAstroLsSensorModel const* ls_model, double time,\n                     double pos[3]);\n\n// Get velocities. Based on the UsgsAstroLsSensorModel code.\nvoid interpVelocities(UsgsAstroLsSensorModel const* ls_model, double time,\n                      double vel[3]);\n\n// Nearest neighbor interpolation into a sequence of vectors of length\n// vectorLength, stored one after another in valueArray. The result\n// goes in valueVector. Analogous to lagrangeInterp() in CSM.\nvoid nearestNeibInterp(const int &numTimes, const double *valueArray,\n                       const double &startTime, const double &delTime,\n                       const double &time, const int &vectorLength,\n                       double *valueVector);\n\n// Find interpolated/extrapolated positions at all camera pose times.\n// See the implementation for more details.\nvoid orbitInterpExtrap(UsgsAstroLsSensorModel const * ls_model,\n                       vw::cartography::GeoReference const& geo,\n                       std::vector<double> & positions_out);\n\n// Populate the CSM model with the given camera positions and orientations.\n// TODO(oalexan1): Use this in LinescanDGModel.cc.\nvoid populateCsmLinescan(double first_line_time, double dt_line, \n                         double t0_ephem, double dt_ephem,\n                         double t0_quat, double dt_quat, \n                         double focal_length,\n                         vw::Vector2                const & optical_center,\n                         vw::Vector2i               const & image_size,\n                         vw::cartography::Datum     const & datum, \n                         std::string                const & sensor_id, \n                         std::vector<vw::Vector3>   const & positions,\n                         std::vector<vw::Vector3>   const & velocities,\n                         std::vector<vw::Matrix3x3> const & cam2world,\n                         // Outputs\n                         asp::CsmModel                    & model);\n \n  // Apply the given adjustment to the given CSM camera.\n  // The camera is passed twice, once as a CSM model, and once as a\n  // CamPtr, as the latter may have the CSM model as a member or \n  // as a base class, depending on the implementation.\n  // TODO(oalexan1): This needs to be made uniform.\n void applyAdjustmentToCsmCamera(std::string const& image_file,\n                                 std::string const& camera_file,\n                                 std::string const& adjust_prefix,\n                                 vw::CamPtr  const& cam,\n                                 asp::CsmModel    * csm_cam); \n\n// Resample Vector3 data (positions or velocities) to a denser uniform grid\n// using Lagrange interpolation. Order = number of interpolation points\n// (e.g., 4 for cubic, 8 for degree 7). Factor = output density multiplier:\n// output has (n_in - 1) * factor + 1 points.\nvoid resampleVec3Lagrange(std::vector<double> const& in_times,\n                          std::vector<vw::Vector3> const& in_vals,\n                          int order, int factor,\n                          std::vector<double>& out_times,\n                          std::vector<vw::Vector3>& out_vals);\n\n// Resample quaternion data to a denser uniform grid using Lagrange\n// interpolation on the quaternion components. Order and factor are as above.\nvoid resampleQuatLagrange(std::vector<double> const& in_times,\n                          std::vector<vw::Quaternion<double>> const& in_vals,\n                          int order, int factor,\n                          std::vector<double>& out_times,\n                          std::vector<vw::Quaternion<double>>& out_vals);\n\n// Resample quaternion data to a denser uniform grid using SLERP\n// (spherical linear interpolation between adjacent samples).\n// Factor = output density multiplier.\nvoid resampleQuatSlerp(std::vector<double> const& in_times,\n                       std::vector<vw::Quaternion<double>> const& in_vals,\n                       int factor,\n                       std::vector<double>& out_times,\n                       std::vector<vw::Quaternion<double>>& out_vals);\n\n// Resample a model using Lagrange interpolation.\nvoid resampleModel(int num_lines_per_position, int num_lines_per_orientation,\n                   UsgsAstroLsSensorModel * ls_model); \n\n// Get the time at a given line. \ndouble get_time_at_line(double line, UsgsAstroLsSensorModel const* ls_model);\n\n// Get the line number at a given time. This assumes a linear relationship\n// between them (rather than piecewise linear).\ndouble get_line_at_time(double time, UsgsAstroLsSensorModel const* ls_model);\n\n// Get camera center at a given time\nvw::Vector3 get_camera_center_at_time(double time, UsgsAstroLsSensorModel const* ls_model);\n\n// Get camera velocity at a given time\nvw::Vector3 get_camera_velocity_at_time(double time, UsgsAstroLsSensorModel const* ls_model);\n\n// Adjust the linescan model to correct for velocity aberration and/or\n// atmospheric refraction.\nvoid orbitalCorrections(asp::CsmModel * csm_model, \n                        bool correct_velocity_aberration,\n                        bool correct_atmospheric_refraction,\n                        double local_earth_radius, \n                        double mean_ground_elevation);\n\n} // end namespace asp\n\n#endif//__ASP_CAMERA_CSM_UTILS_H__\n"
  },
  {
    "path": "src/asp/Camera/JitterSolveCostFuns.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Cost functions used in solving for jitter. These need access to the camera models,\n// so they are stored in the Camera folder.\n\n#include <asp/Camera/BundleAdjustCamera.h>\n#include <asp/Camera/BaseCostFuns.h>\n#include <asp/Camera/JitterSolveCostFuns.h>\n#include <asp/Camera/JitterSolveRigCostFuns.h>\n#include <asp/Rig/TransformUtils.h>\n#include <asp/Rig/RigConfig.h>\n#include <asp/Core/EigenTransformUtils.h>\n#include <asp/Core/CameraTransforms.h>\n#include <asp/Core/CamPoseUtils.h>\n#include <asp/Core/BundleAdjustUtils.h>\n#include <asp/Core/DataLoader.h>\n\n#include <vw/Camera/CameraImage.h>\n#include <vw/Cartography/GeoReferenceBaseUtils.h>\n#include <vw/Cartography/GeoReferenceUtils.h>\n#include <vw/Core/Exception.h>\n#include <vw/Cartography/DatumUtils.h>\n#include <vw/Math/Transform.h>\n#include <vw/Image/Interpolation.h>\n#include <vw/Cartography/Map2CamTrans.h>\n\n#include <algorithm>\n#include <iostream>\n#include <iterator>\n#include <random>\n#include <vector>\n\nnamespace asp {\n\n// An error function minimizing the error of projecting an xyz point\n// into a given CSM linescan camera pixel. The variables of optimization are a\n// portion of the position and quaternion variables affected by this, and the \n// triangulation point.\nstruct LsPixelReprojErr {\n  LsPixelReprojErr(vw::Vector2 const& observation, double weight,\n                   UsgsAstroLsSensorModel* ls_model,\n                   int begQuatIndex, int endQuatIndex,\n                   int begPosIndex, int endPosIndex):\n    m_observation(observation), m_weight(weight),\n    m_begQuatIndex(begQuatIndex), m_endQuatIndex(endQuatIndex),\n    m_begPosIndex(begPosIndex),   m_endPosIndex(endPosIndex),\n    m_ls_model(ls_model) {}\n\n  // The implementation is further down\n  bool operator()(double const * const * parameters, double * residuals) const;\n\n  // Factory to hide the construction of the CostFunction object from the client code.\n  static ceres::CostFunction* Create(vw::Vector2 const& observation, double weight,\n                                     UsgsAstroLsSensorModel* ls_model,\n                                     int begQuatIndex, int endQuatIndex,\n                                     int begPosIndex, int endPosIndex) {\n\n    // TODO(oalexan1): Try using here the analytical cost function\n    ceres::DynamicNumericDiffCostFunction<LsPixelReprojErr>* cost_function =\n      new ceres::DynamicNumericDiffCostFunction<LsPixelReprojErr>\n      (new LsPixelReprojErr(observation, weight, ls_model,\n                                  begQuatIndex, endQuatIndex,\n                                  begPosIndex, endPosIndex));\n\n    // The residual size is always the same.\n    cost_function->SetNumResiduals(PIXEL_SIZE);\n\n    // Add a parameter block for each quaternion and each position\n    for (int it = begQuatIndex; it < endQuatIndex; it++)\n      cost_function->AddParameterBlock(NUM_QUAT_PARAMS);\n    for (int it = begPosIndex; it < endPosIndex; it++)\n      cost_function->AddParameterBlock(NUM_XYZ_PARAMS);\n\n    // Add a parameter block for the xyz point\n    cost_function->AddParameterBlock(NUM_XYZ_PARAMS);\n\n    return cost_function;\n  }\n\nprivate:\n  vw::Vector2 m_observation; // The pixel observation for this camera/point pair\n  double m_weight;\n  UsgsAstroLsSensorModel* m_ls_model;\n  int m_begQuatIndex, m_endQuatIndex;\n  int m_begPosIndex, m_endPosIndex;\n}; // End class LsPixelReprojErr\n\n// An error function minimizing the error of projecting an xyz point\n// into a given CSM Frame camera pixel. The variables of optimization are \n// the camera position, quaternion, and triangulation point.\nstruct FramePixelReprojErr {\n  FramePixelReprojErr(vw::Vector2 const& observation, double weight,\n                   UsgsAstroFrameSensorModel* frame_model):\n    m_observation(observation), m_weight(weight),\n    m_frame_model(frame_model) {}\n\n  // The implementation is further down\n  bool operator()(double const * const * parameters, double * residuals) const;\n\n  // Factory to hide the construction of the CostFunction object from the client code.\n  static ceres::CostFunction* Create(vw::Vector2 const& observation, double weight,\n                                     UsgsAstroFrameSensorModel* frame_model) {\n\n    // TODO(oalexan1): Try using here the analytical cost function\n    ceres::DynamicNumericDiffCostFunction<FramePixelReprojErr>* cost_function =\n      new ceres::DynamicNumericDiffCostFunction<FramePixelReprojErr>\n      (new FramePixelReprojErr(observation, weight, frame_model));\n\n    // The residual size is always the same.\n    cost_function->SetNumResiduals(PIXEL_SIZE);\n\n    // Add a parameter block for each position and quaternion, in this order\n    cost_function->AddParameterBlock(NUM_XYZ_PARAMS);\n    cost_function->AddParameterBlock(NUM_QUAT_PARAMS);\n\n    // Add a parameter block for the xyz point\n    cost_function->AddParameterBlock(NUM_XYZ_PARAMS);\n\n    return cost_function;\n  }\n\nprivate:\n  vw::Vector2 m_observation; // The pixel observation for this camera/point pair\n  double m_weight;\n  UsgsAstroFrameSensorModel* m_frame_model;\n}; // End class FramePixelReprojErr\n\n// Update the linescan model with the latest optimized values of the position\n// and quaternion parameters. Also update the triangulated point.\nvoid updateLsModelTriPt(double const * const * parameters,\n                        int begQuatIndex, int endQuatIndex,\n                        int begPosIndex, int endPosIndex,\n                        int & param_shift,\n                        UsgsAstroLsSensorModel & cam,\n                        csm::EcefCoord & P) {\n\n  // Start at the first param\n  param_shift = 0;\n\n  // Update the relevant quaternions in the local copy\n  for (int qi = begQuatIndex; qi < endQuatIndex; qi++) {\n    for (int coord = 0; coord < NUM_QUAT_PARAMS; coord++) {\n      cam.m_quaternions[NUM_QUAT_PARAMS * qi + coord]\n        = parameters[qi + param_shift - begQuatIndex][coord];\n    }\n  }\n\n  // Same for the positions. Note how we move forward in the parameters array,\n  // as this is after the quaternions\n  param_shift += (endQuatIndex - begQuatIndex);\n  for (int pi = begPosIndex; pi < endPosIndex; pi++) {\n    for (int coord = 0; coord < NUM_XYZ_PARAMS; coord++) {\n      cam.m_positions[NUM_XYZ_PARAMS * pi + coord]\n        = parameters[pi + param_shift - begPosIndex][coord];\n    }\n  }\n\n  // Move forward in the array of parameters, then recover the triangulated point\n  param_shift += (endPosIndex - begPosIndex);\n  P.x = parameters[param_shift][0];\n  P.y = parameters[param_shift][1];\n  P.z = parameters[param_shift][2];\n}\n\n// See the documentation higher up in the file.\nbool LsPixelReprojErr::operator()(double const * const * parameters,\n                                  double * residuals) const {\n\n  try {\n    // Make a copy of the model, as we will update quaternion and position\n    // values that are being modified now. This may be expensive.\n    // Update the shift too.\n    UsgsAstroLsSensorModel cam = *m_ls_model;\n    int shift = 0;\n    csm::EcefCoord P;\n    updateLsModelTriPt(parameters, m_begQuatIndex, m_endQuatIndex,\n                       m_begPosIndex, m_endPosIndex, shift, cam, P);\n\n    // Project in the camera with high precision. Do not use here\n    // anything lower than 1e-8, as the linescan model will then\n    // return junk.\n    double desired_precision = asp::DEFAULT_CSM_DESIRED_PRECISION;\n    csm::ImageCoord imagePt = cam.groundToImage(P, desired_precision);\n\n    // Convert to what ASP expects\n    vw::Vector2 pix;\n    asp::fromCsmPixel(pix, imagePt);\n\n    residuals[0] = m_weight*(pix[0] - m_observation[0]);\n    residuals[1] = m_weight*(pix[1] - m_observation[1]);\n\n  } catch (std::exception const& e) {\n    residuals[0] = g_big_pixel_value;\n    residuals[1] = g_big_pixel_value;\n    return true; // accept the solution anyway\n  }\n\n  return true;\n}\n\n// See the .h file for the documentation.\nbool FramePixelReprojErr::operator()(double const * const * parameters,\n                                     double * residuals) const {\n\n  try {\n    // Make a copy of the model, as we will update position and quaternion\n    // values that are being modified now. Use the same order as in\n    // UsgsAstroFrameSensorModel::m_currentParameterValue.\n    UsgsAstroFrameSensorModel cam = *m_frame_model;\n\n    // The latest position is in parameters[0].\n    for (int coord = 0; coord < NUM_XYZ_PARAMS; coord++)\n      cam.setParameterValue(coord, parameters[0][coord]);\n\n    // The latest quaternion is in parameters[1]. Note how we below\n    // move forward when invoking cam.setParameterValue().\n    for (int coord = 0; coord < NUM_QUAT_PARAMS; coord++)\n      cam.setParameterValue(coord + NUM_XYZ_PARAMS, parameters[1][coord]);\n\n    // The triangulation parameter is after the position and orientation\n    csm::EcefCoord P;\n    P.x = parameters[2][0];\n    P.y = parameters[2][1];\n    P.z = parameters[2][2];\n\n    // Project in the camera with high precision. Do not use here\n    // anything lower than 1e-8, as the linescan model will then\n    // return junk.\n    double desired_precision = asp::DEFAULT_CSM_DESIRED_PRECISION;\n    csm::ImageCoord imagePt = cam.groundToImage(P, desired_precision);\n\n    // Convert to what ASP expects\n    vw::Vector2 pix;\n    asp::fromCsmPixel(pix, imagePt);\n\n    residuals[0] = m_weight*(pix[0] - m_observation[0]);\n    residuals[1] = m_weight*(pix[1] - m_observation[1]);\n\n  } catch (std::exception const& e) {\n    residuals[0] = g_big_pixel_value;\n    residuals[1] = g_big_pixel_value;\n    return true; // accept the solution anyway\n  }\n\n  return true;\n}\n\n// A Ceres cost function. The residual is the roll and/or yaw component of the camera\n// rotation, as measured relative to the initial along-track direction. We assume\n// that all positions are along the same segment in projected coordinates, or at\n// least that the current position and its nearest neighbors are roughly on\n// such a segment. That one is used to measure the roll/yaw from. This is consistent\n// with how sat_sim creates the cameras.\nstruct weightedRollYawError {\n  weightedRollYawError(std::vector<double>       const& positions,\n                   std::vector<double>           const& quaternions,\n                   vw::cartography::GeoReference const& georef,\n                   int cur_pos, double rollWeight, double yawWeight,\n                   bool initial_camera_constraint);\n\n  // Compute the weighted roll/yaw error between the current position and along-track\n  // direction. Recall that quaternion = cam2world = sat2World * rollPitchYaw * rotXY.\n  // rollPitchYaw is variable and can have jitter. Extract from it roll, pitch,\n  bool operator()(double const * const * parameters, double * residuals) const;\n\n  // Factory to hide the construction of the CostFunction object from\n  // the client code.\n  static ceres::CostFunction* Create(std::vector<double>           const& positions,\n                                     std::vector<double>           const& quaternions,\n                                     vw::cartography::GeoReference const& georef,\n                                     int cur_pos,\n                                     double rollWeight, double yawWeight,\n                                     bool initial_camera_constraint) {\n\n    ceres::DynamicNumericDiffCostFunction<weightedRollYawError>* cost_function =\n          new ceres::DynamicNumericDiffCostFunction<weightedRollYawError>\n          (new weightedRollYawError(positions, quaternions, georef, cur_pos,\n                                    rollWeight, yawWeight, initial_camera_constraint));\n\n    cost_function->SetNumResiduals(2); // for roll and yaw\n    cost_function->AddParameterBlock(NUM_QUAT_PARAMS);\n\n    return cost_function;\n  }\n\n  double m_rollWeight, m_yawWeight;\n  vw::Matrix3x3 m_rotXY, m_sat2World, m_initCam2World;\n  bool m_initial_camera_constraint;\n};\n\n// Constructor for weightedRollYawError. See the .h file for the documentation.\nweightedRollYawError::weightedRollYawError\n                  (std::vector<double>           const& positions,\n                   std::vector<double>           const& quaternions,\n                   vw::cartography::GeoReference const& georef,\n                   int cur_pos, double rollWeight, double yawWeight,\n                   bool initial_camera_constraint):\n                   m_rollWeight(rollWeight), m_yawWeight(yawWeight),\n                   m_initial_camera_constraint(initial_camera_constraint) {\n\n    int num_pos = positions.size()/NUM_XYZ_PARAMS;\n    int num_quat = quaternions.size()/NUM_QUAT_PARAMS;\n    if (num_pos != num_quat)\n      vw::vw_throw(vw::ArgumentErr()\n        << \"weightedRollYawError: Expecting the same number of positions and quaternions.\\n\");\n    if (cur_pos < 0 || cur_pos >= num_pos)\n      vw::vw_throw(vw::ArgumentErr()\n        << \"weightedRollYawError: Expecting position index in range.\\n\");\n\n    // Find the nearest neighbors of the current position\n    int beg_pos = std::max(0, cur_pos - 1);\n    int end_pos = std::min(num_pos - 1, cur_pos + 1);\n    if (beg_pos >= end_pos)\n      vw::vw_throw(vw::ArgumentErr()\n        << \"weightedRollYawError: Expecting at least 2 camera positions.\\n\");\n\n    // Find the segment along which the cameras are located, in projected coordinates\n    // Here we mirror the logic from SatSim.cc\n    int b = beg_pos * NUM_XYZ_PARAMS;\n    int c = cur_pos * NUM_XYZ_PARAMS;\n    int e = end_pos * NUM_XYZ_PARAMS;\n    vw::Vector3 beg_pt(positions[b], positions[b+1], positions[b+2]);\n    vw::Vector3 cur_pt(positions[c], positions[c+1], positions[c+2]);\n    vw::Vector3 end_pt(positions[e], positions[e+1], positions[e+2]);\n\n    // Orbital points before the current one, the current one, and after the\n    // current one, in projected coordinates\n    vw::Vector3 beg_proj = vw::cartography::ecefToProj(georef, beg_pt);\n    vw::Vector3 cur_proj = vw::cartography::ecefToProj(georef, cur_pt);\n    vw::Vector3 end_proj = vw::cartography::ecefToProj(georef, end_pt);\n\n    // Find satellite along and across track directions in projected coordinates\n    vw::Vector3 proj_along, proj_across;\n    asp::calcProjAlongAcross(beg_proj, end_proj, proj_along, proj_across);\n\n    // Find along and across in ECEF\n    vw::Vector3 along, across;\n    asp::calcEcefAlongAcross(georef, asp::satSimDelta(),\n                              proj_along, proj_across, cur_proj,\n                              along, across); // outputs\n\n    // Find the z vector as perpendicular to both along and across\n    vw::Vector3 down = vw::math::cross_prod(along, across);\n    down = down / norm_2(down);\n\n    // Find the rotation matrix from satellite to world coordinates, and 90\n    // degree in-camera rotation. It is assumed, as in sat_sim, that:\n    // cam2world = sat2World * rollPitchYaw * rotXY.\n    asp::assembleCam2WorldMatrix(along, across, down, m_sat2World);\n    m_rotXY = asp::rotationXY();\n\n    // Initial camera rotation matrix, before we optimize it\n    m_initCam2World = asp::quaternionToMatrix(&quaternions[cur_pos*NUM_QUAT_PARAMS]);\n}\n\n// See the .h file for the documentation.\nbool weightedRollYawError::operator()(double const * const * parameters,\n                                      double * residuals) const {\n\n  // Convert to rotation matrix. Order of quaternion is x, y, z, w.  \n  vw::Matrix3x3 cam2world = asp::quaternionToMatrix(parameters[0]);\n\n  if (m_initial_camera_constraint) {\n    // Find the new camera orientation relative to the initial camera, not\n    // relative to the satellite along-track direction. Then find the roll and\n    // yaw from it. This is experimental.\n    vw::Matrix3x3 cam2cam =  vw::math::inverse(cam2world) * m_initCam2World;\n\n    double roll = 0.0, pitch = 0.0, yaw = 0.0;\n    rollPitchYawFromRotationMatrix(cam2cam, roll, pitch, yaw);\n\n    // Fix for roll / yaw being determined with +/- 180 degree ambiguity.\n    roll  = roll  - 180.0 * round(roll  / 180.0);\n    pitch = pitch - 180.0 * round(pitch / 180.0);\n    yaw   = yaw   - 180.0 * round(yaw   / 180.0);\n\n    // Roll, pitch, yaw in camera coordinates are pitch, roll, yaw in satellite\n    // coordinates. So adjust below accordingly.\n    // CERES is very tolerant if one of the weights used below is 0. So there is\n    // no need to use a special cost function for such cases.\n    residuals[0] = pitch * m_rollWeight; // per above, swap roll and pitch\n    residuals[1] = yaw  * m_yawWeight;\n\n    return true;\n  }\n\n  vw::Matrix3x3 rollPitchYaw\n    = vw::math::inverse(m_sat2World) * cam2world * vw::math::inverse(m_rotXY);\n\n  double roll = 0.0, pitch = 0.0, yaw = 0.0;\n  rollPitchYawFromRotationMatrix(rollPitchYaw, roll, pitch, yaw);\n\n  // Fix for roll / yaw being determined with +/- 180 degree ambiguity.\n  roll = roll - 180.0 * round(roll / 180.0);\n  pitch = pitch - 180.0 * round(pitch / 180.0);\n  yaw  = yaw  - 180.0 * round(yaw  / 180.0);\n\n  // CERES is very tolerant if one of the weights used below is 0. So there is\n  // no need to use a special cost function for such cases.\n  residuals[0] = roll * m_rollWeight;\n  residuals[1] = yaw  * m_yawWeight;\n\n  return true;\n}\n\n// Calc the range of indices in the samples needed to interpolate between time1 and time2.\n// Based on lagrangeInterp() in usgscsm.\nvoid calcIndexBounds(double time1, double time2, double t0, double dt, int numVals,\n                     // Outputs\n                     int & begIndex, int & endIndex) {\n\n  // Order of Lagrange interpolation\n  int numInterpSamples = 8;\n\n  // Starting and ending  index (ending is exclusive).\n  int index1 = static_cast<int>((time1 - t0) / dt);\n  int index2 = static_cast<int>((time2 - t0) / dt);\n\n  // TODO(oalexan1): Maybe the indices should be more generous, so not adding 1\n  // to begIndex, even though what is here seems correct according to \n  // lagrangeInterp().\n  begIndex = std::min(index1, index2) - numInterpSamples / 2 + 1;\n  endIndex = std::max(index1, index2) + numInterpSamples / 2 + 1;\n\n  // Keep in bounds\n  begIndex = std::max(0, begIndex);\n  endIndex = std::min(endIndex, numVals);\n  // This can happen with wildly out-of-range anchor points.\n  if (begIndex >= endIndex)\n    vw::vw_throw(vw::ArgumentErr() << \"Out-of-range interpolation indices.\\n\");\n\n  return;\n}\n\n// Find the positions and orientations in the current linescan model\n// that can affect the given pixel.\nvoid calcPosQuatIndexBounds(double line_extra,\n                            UsgsAstroLsSensorModel * ls_model,\n                            vw::Vector2 const& observation,\n                            // Outputs\n                            int & begPosIndex,  int & endPosIndex,\n                            int & begQuatIndex, int & endQuatIndex) {\n\n  // Initialize the outputs\n  begPosIndex = -1; endPosIndex = -1;\n  begQuatIndex = -1; endQuatIndex = -1;\n\n  csm::ImageCoord imagePt1, imagePt2;\n  asp::toCsmPixel(observation - vw::Vector2(0.0, line_extra), imagePt1);\n  asp::toCsmPixel(observation + vw::Vector2(0.0, line_extra), imagePt2);\n  double time1 = ls_model->getImageTime(imagePt1);\n  double time2 = ls_model->getImageTime(imagePt2);\n\n  // Positions\n  int numPos       = ls_model->m_positions.size() / NUM_XYZ_PARAMS;\n  double posT0     = ls_model->m_t0Ephem;\n  double posDt     = ls_model->m_dtEphem;\n  calcIndexBounds(time1, time2, posT0, posDt, numPos,\n                  begPosIndex, endPosIndex); // outputs\n\n  // Quaternions\n  int numQuat       = ls_model->m_quaternions.size() / NUM_QUAT_PARAMS;\n  double quatT0     = ls_model->m_t0Quat;\n  double quatDt     = ls_model->m_dtQuat;\n  calcIndexBounds(time1, time2, quatT0, quatDt, numQuat,\n                  begQuatIndex, endQuatIndex); // outputs\n  return;\n}\n\n// Add the linescan model reprojection error to the cost function\nvoid addLsReprojectionErr(asp::BaBaseOptions  const& opt,\n                          UsgsAstroLsSensorModel   * ls_model,\n                          vw::Vector2         const& observation,\n                          double                   * tri_point,\n                          double                     weight,\n                          ceres::Problem           & problem) {\n\n  // Find all positions and quaternions that can affect the current pixel. Must\n  // grow the number of quaternions and positions a bit because during\n  // optimization the 3D point and corresponding pixel may move somewhat.\n  double line_extra = opt.max_init_reproj_error + 5.0; // add some more just in case\n  int begPosIndex = -1, endPosIndex = -1;\n  int begQuatIndex = -1, endQuatIndex = -1;\n  calcPosQuatIndexBounds(line_extra, ls_model, observation,\n                         begPosIndex, endPosIndex, begQuatIndex, endQuatIndex); // outputs\n\n  ceres::CostFunction* pixel_cost_function =\n    LsPixelReprojErr::Create(observation, weight, ls_model,\n                             begQuatIndex, endQuatIndex,\n                             begPosIndex, endPosIndex);\n  ceres::LossFunction* pixel_loss_function = new ceres::CauchyLoss(opt.robust_threshold);\n\n  // The variable of optimization are camera quaternions and positions stored in the\n  // camera models, and the triangulated point.\n  std::vector<double*> vars;\n  for (int it = begQuatIndex; it < endQuatIndex; it++)\n    vars.push_back(&ls_model->m_quaternions[it * NUM_QUAT_PARAMS]);\n  for (int it = begPosIndex; it < endPosIndex; it++)\n    vars.push_back(&ls_model->m_positions[it * NUM_XYZ_PARAMS]);\n  vars.push_back(tri_point);\n  problem.AddResidualBlock(pixel_cost_function, pixel_loss_function, vars);\n\n  return;\n}\n\n// Add the frame camera model reprojection error to the cost function\nvoid addFrameReprojectionErr(asp::BaBaseOptions  const & opt,\n                             UsgsAstroFrameSensorModel * frame_model,\n                             vw::Vector2         const & observation,\n                             double                    * frame_params,\n                             double                    * tri_point,\n                             double                      weight,\n                             ceres::Problem            & problem) {\n\n  ceres::CostFunction* pixel_cost_function =\n    FramePixelReprojErr::Create(observation, weight, frame_model);\n  ceres::LossFunction* pixel_loss_function = new ceres::CauchyLoss(opt.robust_threshold);\n\n  // The variable of optimization are camera positions and quaternion stored \n  // in frame_cam_params, in this order, and the triangulated point.\n  // This is different from the linescan model, where we can directly access\n  // these quantities inside the model, so they need not be stored separately.\n  std::vector<double*> vars;\n  vars.push_back(&frame_params[0]);              // positions start here\n  vars.push_back(&frame_params[NUM_XYZ_PARAMS]); // quaternions start here\n  vars.push_back(tri_point);\n  problem.AddResidualBlock(pixel_cost_function, pixel_loss_function, vars);\n\n  return;\n}\n\n// Add the ls or frame camera model reprojection error to the cost function\nvoid addLsOrFrameReprojectionErr(asp::BaBaseOptions  const & opt,\n                                 int                         icam,\n                                 UsgsAstroLsSensorModel    * ls_model,\n                                 UsgsAstroFrameSensorModel * frame_model,\n                                 std::vector<double>       & frame_params,\n                                 vw::Vector2         const & pix_obs,\n                                 double                      pix_wt,\n                                 double                    * tri_point,\n                                 ceres::Problem            & problem) {\n\n  // Note how for the frame model we pass the frame_params for the current camera.\n  // For the linescan cameras the params are changed inside the model.\n  if (ls_model != NULL)\n    addLsReprojectionErr(opt, ls_model, pix_obs, tri_point, pix_wt, problem);\n  else if (frame_model != NULL)\n    addFrameReprojectionErr(opt, frame_model, pix_obs,\n        &frame_params[icam * (NUM_XYZ_PARAMS + NUM_QUAT_PARAMS)],\n        tri_point, pix_wt, problem);\n  else\n    vw::vw_throw(vw::ArgumentErr() << \"Unknown camera model.\\n\");\n}\n\n/// A ceres cost function. The residual is the difference between the observed\n/// 3D point and the current (floating) 3D point, multiplied by given weight.\nstruct weightedXyzError {\n  weightedXyzError(vw::Vector3 const& observation, double weight):\n    m_observation(observation), m_weight(weight) {}\n\n  template <typename T>\n  bool operator()(const T* point, T* residuals) const {\n    for (size_t p = 0; p < m_observation.size(); p++)\n      residuals[p] = m_weight * (point[p] - m_observation[p]);\n\n    return true;\n  }\n\n  // Factory to hide the construction of the CostFunction object from\n  // the client code.\n  static ceres::CostFunction* Create(vw::Vector3 const& observation, double const& weight) {\n    return (new ceres::AutoDiffCostFunction<weightedXyzError, 3, 3>\n            (new weightedXyzError(observation, weight)));\n  }\n\n  vw::Vector3 m_observation;\n  double  m_weight;\n};\n\n/// A Ceres cost function. The residual is the difference between the\n/// initial quaternion and optimized quaternion, multiplied by given weight.\nstruct weightedRotationError {\n  weightedRotationError(const double * init_quat, double weight):\n    m_weight(weight) {\n\n    // Make a copy, as later the value at the pointer will change\n    m_init_quat.resize(NUM_QUAT_PARAMS);\n    for (int it = 0; it < NUM_QUAT_PARAMS; it++)\n      m_init_quat[it] = init_quat[it];\n  }\n\n  template <typename T>\n  bool operator()(const T* quat, T* residuals) const {\n    for (size_t p = 0; p < m_init_quat.size(); p++)\n      residuals[p] = m_weight * (quat[p] - m_init_quat[p]);\n\n    return true;\n  }\n\n  // Factory to hide the construction of the CostFunction object from\n  // the client code.\n  static ceres::CostFunction* Create(const double * init_quat, double weight) {\n    return (new ceres::AutoDiffCostFunction<weightedRotationError,\n            NUM_QUAT_PARAMS, NUM_QUAT_PARAMS>\n            (new weightedRotationError(init_quat, weight)));\n  }\n\n  std::vector<double> m_init_quat;\n  double  m_weight;\n};\n\n/// A Ceres cost function. The residual is the difference between the\n/// initial position and optimized position, multiplied by given weight.\nstruct weightedTranslationError {\n  weightedTranslationError(const double * init_position, double weight):\n    m_weight(weight) {\n\n    // Make a copy, as later the value at the pointer will change\n    m_init_position.resize(NUM_XYZ_PARAMS);\n    for (int it = 0; it < NUM_XYZ_PARAMS; it++)\n      m_init_position[it] = init_position[it];\n  }\n\n  template <typename T>\n  bool operator()(const T* position, T* residuals) const {\n    for (size_t p = 0; p < m_init_position.size(); p++)\n      residuals[p] = m_weight * (position[p] - m_init_position[p]);\n\n    return true;\n  }\n\n  // Factory to hide the construction of the CostFunction object from\n  // the client code.\n  static ceres::CostFunction* Create(const double * init_position, double weight) {\n    return (new ceres::AutoDiffCostFunction\n            <weightedTranslationError, NUM_XYZ_PARAMS, NUM_XYZ_PARAMS>\n            (new weightedTranslationError(init_position, weight)));\n  }\n\n  std::vector<double> m_init_position;\n  double  m_weight;\n};\n\n/// A Ceres cost function. The residual is the weighted difference between 1 and\n/// norm of quaternion.\nstruct weightedQuatNormError {\n  weightedQuatNormError(double weight):\n    m_weight(weight) {}\n\n  template <typename T>\n  bool operator()(const T* quat, T* residuals) const {\n    residuals[0] = T(0.0);\n    for (size_t p = 0; p < NUM_QUAT_PARAMS; p++)\n      residuals[0] += quat[p] * quat[p];\n\n    residuals[0] = m_weight * (residuals[0] - 1.0);\n\n    return true;\n  }\n\n  // Factory to hide the construction of the CostFunction object from\n  // the client code.\n  static ceres::CostFunction* Create(double weight) {\n    return (new ceres::AutoDiffCostFunction<weightedQuatNormError, 1, NUM_QUAT_PARAMS>\n            (new weightedQuatNormError(weight)));\n  }\n\n  double  m_weight;\n};\n\n// Add reprojection errors. Collect data that will be used to add camera\n// constraints that scale with the number of reprojection errors and GSD.\nvoid addReprojCamErrs(asp::BaBaseOptions                    const & opt,\n                      asp::CRN                             const & crn,\n                      std::vector<std::vector<vw::Vector2>> const & pixel_vec,\n                      std::vector<std::vector<double>>      const & weight_vec,\n                      std::vector<std::vector<int>>         const & isAnchor_vec,\n                      std::vector<std::vector<int>>         const & pix2xyz_index,\n                      std::vector<asp::CsmModel*>           const & csm_models,\n                      bool                                          have_rig,\n                      rig::RigSet                           const & rig,\n                      std::vector<RigCamInfo>               const & rig_cam_info,\n                      std::map<int, int>                    const & cam2group,\n                      TimestampMap                          const & timestamp_map,\n                      bool                                          fix_rig_translations,\n                      bool                                          fix_rig_rotations,\n                      // Outputs\n                      std::vector<double>                     & tri_points_vec,\n                      std::vector<double>                     & frame_params,\n                      std::vector<double>                     & weight_per_residual,\n                      std::vector<std::vector<double>>        & weight_per_cam,\n                      std::vector<std::vector<double>>        & count_per_cam,\n                      std::vector<double>                     & ref_to_curr_sensor_vec,\n                      ceres::Problem                          & problem) {\n\n  // Do here two passes, first for non-anchor points and then for anchor ones.\n  // This way it is easier to do the bookkeeping when saving the residuals.\n  // Note: The same motions as here are repeated in saveJitterResiduals().\n  weight_per_cam.resize(2);\n  count_per_cam.resize(2);\n  for (int pass = 0; pass < 2; pass++) {\n\n     weight_per_cam[pass].resize((int)crn.size(), 0.0);\n     count_per_cam[pass].resize((int)crn.size(), 0.0);\n\n    for (int icam = 0; icam < (int)crn.size(); icam++) {\n\n      vw::DiskImageView<float> img(opt.image_files[icam]);\n      vw::BBox2 image_box = bounding_box(img);\n      std::vector<double> this_cam_weights;\n\n      for (size_t ipix = 0; ipix < pixel_vec[icam].size(); ipix++) {\n\n        vw::Vector2 pix_obs = pixel_vec[icam][ipix];\n        double * tri_point  = &tri_points_vec[3 * pix2xyz_index[icam][ipix]];\n        double pix_wt       = weight_vec[icam][ipix];\n        bool isAnchor       = isAnchor_vec[icam][ipix];\n\n        // Pass 0 is without anchor points, while pass 1 uses them\n        if ((int)isAnchor != pass)\n          continue;\n\n        csm::RasterGM * csm = csm_models[icam]->m_gm_model.get();\n        UsgsAstroLsSensorModel * ls_model\n          = dynamic_cast<UsgsAstroLsSensorModel*>(csm);\n        UsgsAstroFrameSensorModel * frame_model\n          = dynamic_cast<UsgsAstroFrameSensorModel*>(csm);\n\n        // Skip points whose pixel falls outside the camera ephemeris range.\n        // This can happen with --num-anchor-points-extra-lines.\n        try {\n\n        if (!have_rig) {\n          // No rig\n          addLsOrFrameReprojectionErr(opt, icam, ls_model, frame_model, frame_params,\n                                      pix_obs, pix_wt, tri_point, problem);\n        } else {\n          // Have rig\n          asp::RigCamInfo rig_info = rig_cam_info[icam];\n          int ref_cam              = rig_info.ref_cam_index;\n          int sensor_id            = rig_info.sensor_id;\n          double* ref_to_curr_sensor_trans\n              = &ref_to_curr_sensor_vec[rig::NUM_RIGID_PARAMS * sensor_id];\n\n          // We can have linescan or frame cameras for ref and curr cameras\n          csm::RasterGM * ref_csm = csm_models[ref_cam]->m_gm_model.get();\n          UsgsAstroLsSensorModel * ref_ls_model\n            = dynamic_cast<UsgsAstroLsSensorModel*>(ref_csm);\n          UsgsAstroFrameSensorModel * ref_frame_model\n            = dynamic_cast<UsgsAstroFrameSensorModel*>(ref_csm);\n\n          if (rig.isRefSensor(sensor_id)) // Do not need the rig\n            addLsOrFrameReprojectionErr(opt, icam, ls_model, frame_model, frame_params,\n                                        pix_obs, pix_wt, tri_point, problem);\n          else // Use the rig\n             asp::addRigLsOrFrameReprojectionErr(opt, icam, ref_ls_model, ref_frame_model,\n                                    ls_model, frame_model, frame_params,\n                                    csm_models, cam2group, timestamp_map,\n                                    pix_obs, pix_wt, tri_point,\n                                    ref_to_curr_sensor_trans, rig_info,\n                                    fix_rig_translations, fix_rig_rotations,\n                                    problem);\n\n        } // end condition for having a rig\n\n        } catch (...) { continue; }\n\n        // Two residuals were added. Save the corresponding weights.\n        for (int c = 0; c < asp::PIXEL_SIZE; c++)\n          weight_per_residual.push_back(pix_wt);\n\n        // Anchor points are fixed by definition. They try to prevent\n        // the cameras from moving too much from original poses.\n        if (isAnchor)\n          problem.SetParameterBlockConstant(tri_point);\n\n        // Find the weight to use with the camera constraint\n        vw::Vector3 xyz_obs(tri_point[0], tri_point[1], tri_point[2]);\n        double gsd = 0.0;\n        try {\n          gsd = vw::camera::estimatedGSD(opt.camera_models[icam].get(), image_box,\n                                         pix_obs, xyz_obs);\n        } catch (...) {\n          continue;\n        }\n        if (gsd <= 0)\n          continue;\n\n        // The camera position weight depends on the input multiplier, pixel weight, and gsd\n        double position_wt = opt.camera_position_weight * pix_wt / gsd;\n        this_cam_weights.push_back(position_wt);\n      } // end iteration through pixels\n\n      // Find the median weight and count. The median is more robust to outliers.\n      count_per_cam[pass][icam] = this_cam_weights.size();\n      if (count_per_cam[pass][icam] > 0)\n        weight_per_cam[pass][icam] = vw::math::destructive_median(this_cam_weights);\n      else\n        weight_per_cam[pass][icam] = 0.0;\n    } // end iteration through cameras\n  } // end iteration through passes\n\n  return;\n}\n\n// Add the constraint based on DEM\nvoid addDemConstraint(asp::BaBaseOptions       const& opt,\n                      std::vector<vw::Vector3> const& dem_xyz_vec,\n                      std::set<int>            const& outliers,\n                      vw::ba::ControlNetwork   const& cnet,\n                      // Outputs\n                      std::vector<double>           & tri_points_vec,\n                      std::vector<double>           & weight_per_residual, // append\n                      ceres::Problem                & problem) {\n\n  double xyz_weight = -1.0, xyz_threshold = -1.0;\n\n  if (!opt.heights_from_dem.empty()) {\n    xyz_weight = 1.0/opt.heights_from_dem_uncertainty;\n    xyz_threshold = opt.heights_from_dem_robust_threshold;\n  } else {\n    vw::vw_throw(vw::ArgumentErr() << \"No input DEM was provided.\\n\");\n  }\n\n  if (dem_xyz_vec.size() != cnet.size())\n    vw::vw_throw(vw::ArgumentErr() << \"Must have as many xyz computed from DEM as xyz \"\n             << \"triangulated from match files.\\n\");\n  if (xyz_weight <= 0 || xyz_threshold <= 0)\n    vw::vw_throw(vw::ArgumentErr() << \"Detected invalid robust threshold or weights.\\n\");\n\n  int num_tri_points = cnet.size();\n\n  // The tri_points_vec must have at least as many points as cnet. It can have anchor points\n  // as well.\n  if ((int)tri_points_vec.size() < num_tri_points * NUM_XYZ_PARAMS)\n    vw::vw_throw(vw::ArgumentErr() << \"Too few triangulated points.\\n\");\n\n  for (int ipt = 0; ipt < num_tri_points; ipt++) {\n\n    if (cnet[ipt].type() == vw::ba::ControlPoint::GroundControlPoint)\n      continue; // Skip GCPs\n\n    // Note that we get tri points from dem_xyz_vec, based on the input DEM\n    vw::Vector3 observation = dem_xyz_vec.at(ipt);\n    if (outliers.find(ipt) != outliers.end() || observation == vw::Vector3(0, 0, 0))\n      continue; // outlier\n\n    ceres::CostFunction* xyz_cost_function\n      = weightedXyzError::Create(observation, xyz_weight);\n    ceres::LossFunction* xyz_loss_function = new ceres::CauchyLoss(xyz_threshold);\n    double * tri_point = &tri_points_vec[0] + ipt * NUM_XYZ_PARAMS;\n\n    // Add cost function\n    problem.AddResidualBlock(xyz_cost_function, xyz_loss_function, tri_point);\n\n    for (int c = 0; c < NUM_XYZ_PARAMS; c++)\n      weight_per_residual.push_back(xyz_weight);\n  }\n}\n\n// Add the constraint to keep triangulated points close to initial values\n// This does not need a DEM or alignment\nvoid addTriConstraint(asp::BaBaseOptions     const& opt,\n                      std::set<int>          const& outliers,\n                      vw::ba::ControlNetwork const& cnet,\n                      asp::CRN              const& crn,\n                      // Outputs\n                      std::vector<double>    & tri_points_vec,\n                      std::vector<double>    & weight_per_residual, // append\n                      ceres::Problem         & problem) {\n\n  // Estimate the GSD for each triangulated point\n  std::vector<double> gsds;\n  asp::estimateGsdPerTriPoint(opt.image_files, opt.camera_models, crn,\n                              outliers, tri_points_vec, gsds);\n\n  int num_tri_points = cnet.size();\n  for (int ipt = 0; ipt < num_tri_points; ipt++) {\n    if (cnet[ipt].type() == vw::ba::ControlPoint::GroundControlPoint ||\n        cnet[ipt].type() == vw::ba::ControlPoint::PointFromDem)\n      continue; // Skip GCPs and height-from-dem points which have their own constraint\n\n    if (outliers.find(ipt) != outliers.end())\n      continue; // skip outliers\n\n    double * tri_point = &tri_points_vec[0] + ipt * NUM_XYZ_PARAMS;\n\n    // The weight must be inversely proportional to the GSD, to ensure\n    // this is in pixel units\n    double gsd = gsds[ipt];\n    if (gsd <= 0)\n      continue; // GSD calculation failed. Do not use a constraint.\n    double weight = opt.tri_weight / gsd;\n\n    // Use as constraint the initially triangulated point\n    vw::Vector3 observation(tri_point[0], tri_point[1], tri_point[2]);\n\n    ceres::CostFunction* cost_function = weightedXyzError::Create(observation, weight);\n    ceres::LossFunction* loss_function = new ceres::CauchyLoss(opt.tri_robust_threshold);\n    problem.AddResidualBlock(cost_function, loss_function, tri_point);\n\n    for (int c = 0; c < NUM_XYZ_PARAMS; c++)\n      weight_per_residual.push_back(opt.tri_weight);\n\n  } // End loop through xyz\n}\n\n// Add the GCP constraint\nvoid addGcpConstraint(asp::BaBaseOptions     const& opt,\n                      std::set<int>          const& outliers,\n                      bool                          use_llh_error,\n                      bool                          fix_gcp_xyz,\n                      // Outputs\n                      vw::ba::ControlNetwork      & cnet,\n                      std::vector<double>         & tri_points_vec,\n                      std::vector<double>         & weight_per_residual, // append\n                      ceres::Problem              & problem) {\n\n  int num_tri_points = cnet.size();\n  for (int ipt = 0; ipt < num_tri_points; ipt++) {\n\n    if (cnet[ipt].type() != vw::ba::ControlPoint::GroundControlPoint)\n      continue; // Applies only to GCPs\n\n    if (outliers.find(ipt) != outliers.end())\n      continue; // skip outliers\n\n    vw::Vector3 observation = cnet[ipt].position();\n    vw::Vector3 xyz_sigma = cnet[ipt].sigma();\n\n    // Use same cost function as for bundle adjustment\n    ceres::CostFunction* cost_function = NULL;\n    if (!use_llh_error) {\n      cost_function = XYZError::Create(observation, xyz_sigma);\n    } else {\n      vw::Vector3 llh_sigma = xyz_sigma;\n      // make lat, lon into lon, lat\n      std::swap(llh_sigma[0], llh_sigma[1]);\n      cost_function = LLHError::Create(observation, llh_sigma, opt.datum);\n    }\n\n    // No soft cost function for GCP. These are assumed to be accurate.\n    ceres::LossFunction* loss_function  = new ceres::TrivialLoss();\n    double * tri_point = &tri_points_vec[0] + ipt * NUM_XYZ_PARAMS;\n    problem.AddResidualBlock(cost_function, loss_function, tri_point);\n\n    // Ground xyz whose sigma is asp::FIXED_GCP_SIGMA (a tiny positive value) are set to fixed\n    double s = asp::FIXED_GCP_SIGMA;\n    if (fix_gcp_xyz || xyz_sigma == vw::Vector3(s, s, s)) {\n      cnet[ipt].set_sigma(vw::Vector3(s, s, s)); // will be saved in the ISIS cnet\n      problem.SetParameterBlockConstant(tri_point);\n    }\n\n    for (int c = 0; c < NUM_XYZ_PARAMS; c++)\n      weight_per_residual.push_back(1.0 / xyz_sigma[c]);\n\n  } // End loop over triangulated points\n}\n\n// Add hard camera constraints. Be generous with the uncertainty. \nvoid addHardCamPositionConstraint(asp::BaBaseOptions               const& opt,\n                                  std::set<int>                    const& outliers,\n                                  asp::CRN                        const& crn,\n                                  std::vector<asp::CsmModel*>      const& csm_models,\n                                  std::vector<std::vector<double>> const& count_per_cam,\n                                  double                                  anchor_weight,\n                                  bool                                    have_rig,\n                                  rig::RigSet                      const& rig,\n                                  std::vector<asp::RigCamInfo>     const& rig_cam_info,\n                                  // Outputs\n                                  std::vector<double>                & frame_params,\n                                  std::vector<double>                & weight_per_residual,\n                                  ceres::Problem                     & problem) {\n\n  // Do not do a second pass for anchor points. A constraint for interest points\n  // only seems to be enough.\n  for (int pass = 0; pass < 1; pass++) {\n    for (int icam = 0; icam < (int)crn.size(); icam++) {\n\n      // With a rig, only the ref sensor has rotation constraints \n      if (have_rig && !rig.isRefSensor(rig_cam_info[icam].sensor_id))\n        continue;\n\n      double count = count_per_cam[pass][icam];\n      if (count <= 0)\n        continue; // no reprojection errors for this camera\n\n      int param_len = NUM_XYZ_PARAMS;\n\n      UsgsAstroLsSensorModel * ls_model\n        = dynamic_cast<UsgsAstroLsSensorModel*>((csm_models[icam]->m_gm_model).get());\n      UsgsAstroFrameSensorModel * frame_model\n        = dynamic_cast<UsgsAstroFrameSensorModel*>((csm_models[icam]->m_gm_model).get());\n\n      if (ls_model != NULL) {\n\n        // There are multiple position parameters per camera. Divide the\n        // constraint between them. This was very carefully tested.\n        int numPos = ls_model->m_positions.size() / NUM_XYZ_PARAMS;\n        double weight = 1.0 / std::max(double(numPos), 1.0);\n\n        for (int pos_it = 0; pos_it < numPos; pos_it++) {\n\n          // Must have both a pointer and the vector, as dictated by the API\n          double * cam_ptr = &ls_model->m_positions[pos_it * NUM_XYZ_PARAMS];\n          vw::Vector3 orig_cam(cam_ptr[0], cam_ptr[1], cam_ptr[2]);\n          ceres::CostFunction* cost_function\n                  = CamUncertaintyError::Create(orig_cam, cam_ptr, param_len,\n                                        opt.camera_position_uncertainty[icam],\n                                        weight, opt.datum,\n                                        opt.camera_position_uncertainty_power);\n          // This is a hard constraint, so we use a trivial loss function        \n          ceres::LossFunction* loss_function = new ceres::TrivialLoss();\n          problem.AddResidualBlock(cost_function, loss_function, cam_ptr);\n\n          for (int c = 0; c < NUM_XYZ_PARAMS; c++)\n            weight_per_residual.push_back(weight); // To ensure correct bookkeeping\n        }\n\n      } else if (frame_model != NULL) {\n\n        // Same logic as for bundle_adjust\n        // There is only one position per camera\n        // Must have both a pointer and the vector, as dictated by the API\n        double * curr_params = &frame_params[icam * (NUM_XYZ_PARAMS + NUM_QUAT_PARAMS)];\n        vw::Vector3 orig_cam(curr_params[0], curr_params[1], curr_params[2]);\n\n        double weight = 1.0;\n\n        ceres::CostFunction* cost_function\n          = CamUncertaintyError::Create(orig_cam, curr_params, param_len,\n                                        opt.camera_position_uncertainty[icam],\n                                        weight, opt.datum,\n                                        opt.camera_position_uncertainty_power);\n        // This is a hard constraint, so we use a trivial loss function        \n        ceres::LossFunction* loss_function = new ceres::TrivialLoss();\n        problem.AddResidualBlock(cost_function, loss_function,\n                                &curr_params[0]);\n\n        for (int c = 0; c < NUM_XYZ_PARAMS; c++)\n          weight_per_residual.push_back(weight); // To ensure correct bookkeeping\n\n      } else {\n        vw::vw_throw(vw::ArgumentErr() << \"Unknown camera model.\\n\");\n      }\n    } // end loop through cameras\n  } // end loop through passes\n\n  return;\n}\n\n// Add camera constraints that are proportional to the number of reprojection errors.\n// This requires going through some of the same motions as in addReprojCamErrs().\n// Use instead addHardCamPositionConstraint().\nvoid addSoftCamPositionConstraint(asp::BaBaseOptions           const& opt,\n                              std::set<int>                    const& outliers,\n                              asp::CRN                        const& crn,\n                              std::vector<asp::CsmModel*>      const& csm_models,\n                              std::vector<std::vector<double>> const& weight_per_cam,\n                              std::vector<std::vector<double>> const& count_per_cam,\n                              bool                                    have_rig,\n                              rig::RigSet                      const& rig,\n                              std::vector<asp::RigCamInfo>     const& rig_cam_info,\n                              // Outputs\n                              std::vector<double>                & frame_params,\n                              std::vector<double>                & weight_per_residual,\n                              ceres::Problem                     & problem) {\n\n  // First pass is for interest point matches, and second pass is for anchor points\n  for (int pass = 0; pass < 2; pass++) {\n    for (int icam = 0; icam < (int)crn.size(); icam++) {\n\n      // With a rig, only the ref sensor has rotation constraints \n      if (have_rig && !rig.isRefSensor(rig_cam_info[icam].sensor_id))\n        continue;\n\n      double median_wt = weight_per_cam[pass][icam];\n      double count = count_per_cam[pass][icam];\n      if (count <= 0)\n        continue; // no reprojection errors for this camera\n\n      // We know the median weight to use, and how many residuals were added.\n      // Based on the CERES loss function formula, adding N loss functions each \n      // with weight w and robust threshold t is equivalent to adding one loss \n      // function with weight sqrt(N)*w and robust threshold sqrt(N)*t.\n      // For linescan cameras, then need to subdivide this for individual\n      // positions for that camera.\n      double combined_wt  = sqrt(count * 1.0) * median_wt;\n      double combined_th = sqrt(count * 1.0) * opt.camera_position_robust_threshold;\n      UsgsAstroLsSensorModel * ls_model\n        = dynamic_cast<UsgsAstroLsSensorModel*>((csm_models[icam]->m_gm_model).get());\n      UsgsAstroFrameSensorModel * frame_model\n        = dynamic_cast<UsgsAstroFrameSensorModel*>((csm_models[icam]->m_gm_model).get());\n\n      if (ls_model != NULL) {\n        // There are multiple position parameters per camera. They divide among\n        // them the job of minimizing the reprojection error. So need to divide\n        // the weight among them.\n\n        // Divide the weight among the positions\n        int numPos = ls_model->m_positions.size() / NUM_XYZ_PARAMS;\n        double wt = combined_wt / sqrt(numPos * 1.0);\n        double th = combined_th / sqrt(numPos * 1.0);\n        for (int ip = 0; ip < numPos; ip++) {\n          ceres::CostFunction* cost_function\n            = weightedTranslationError::Create(&ls_model->m_positions[ip * NUM_XYZ_PARAMS],\n                                               wt);\n          ceres::LossFunction* loss_function = new ceres::CauchyLoss(th);\n          problem.AddResidualBlock(cost_function, loss_function,\n                                  &ls_model->m_positions[ip * NUM_XYZ_PARAMS]);\n\n          for (int c = 0; c < NUM_XYZ_PARAMS; c++)\n            weight_per_residual.push_back(wt);\n        }\n\n      } else if (frame_model != NULL) {\n\n        // Same logic as for bundle_adjust\n        // There is only one position per camera\n        double * curr_params = &frame_params[icam * (NUM_XYZ_PARAMS + NUM_QUAT_PARAMS)];\n        // we will copy from curr_params the initial position\n        ceres::CostFunction* cost_function\n          = weightedTranslationError::Create(&curr_params[0], combined_wt);\n        ceres::LossFunction* loss_function = new ceres::CauchyLoss(combined_th);\n        problem.AddResidualBlock(cost_function, loss_function,\n                                &curr_params[0]); // translation starts here\n\n        for (int c = 0; c < NUM_XYZ_PARAMS; c++)\n          weight_per_residual.push_back(combined_wt);\n\n      } else {\n         vw::vw_throw(vw::ArgumentErr() << \"Unknown camera model.\\n\");\n      }\n\n    }\n  }\n\n  return;\n}\n\nvoid addQuatNormRotationConstraints(\n                        asp::BaBaseOptions          const& opt,\n                        std::set<int>               const& outliers,\n                        asp::CRN                   const& crn,\n                        std::vector<asp::CsmModel*> const& csm_models,\n                        bool                               have_rig,\n                        rig::RigSet                 const& rig,\n                        std::vector<RigCamInfo>     const& rig_cam_info,\n                        double                             quat_norm_weight,\n                        // Outputs\n                        std::vector<double>              & frame_params,\n                        std::vector<double>              & weight_per_residual,\n                        ceres::Problem                   & problem) {\n\n  // Constrain the rotations\n  // TODO(oalexan1): Make this a standalone function\n  if (opt.rotation_weight > 0.0) {\n    for (int icam = 0; icam < (int)crn.size(); icam++) {\n\n      // With a rig, only the ref sensor has rotation constraints \n      if (have_rig && !rig.isRefSensor(rig_cam_info[icam].sensor_id))\n        continue;\n\n      UsgsAstroLsSensorModel * ls_model\n        = dynamic_cast<UsgsAstroLsSensorModel*>((csm_models[icam]->m_gm_model).get());\n      UsgsAstroFrameSensorModel * frame_model\n        = dynamic_cast<UsgsAstroFrameSensorModel*>((csm_models[icam]->m_gm_model).get());\n\n      if (ls_model != NULL) {\n        // There are multiple quaternion parameters per camera\n        int numQuat = ls_model->m_quaternions.size() / NUM_QUAT_PARAMS;\n        for (int iq = 0; iq < numQuat; iq++) {\n          ceres::CostFunction* rotation_cost_function\n            = weightedRotationError::Create(&ls_model->m_quaternions[iq * NUM_QUAT_PARAMS],\n                                            opt.rotation_weight);\n          // We use no loss function, as the quaternions have no outliers\n          ceres::LossFunction* rotation_loss_function = NULL;\n          problem.AddResidualBlock(rotation_cost_function, rotation_loss_function,\n                                  &ls_model->m_quaternions[iq * NUM_QUAT_PARAMS]);\n\n          for (int c = 0; c < NUM_QUAT_PARAMS; c++)\n            weight_per_residual.push_back(opt.rotation_weight);\n        }\n\n      } else if (frame_model != NULL) {\n        // There is one quaternion per camera, stored after the translation\n        double * curr_params = &frame_params[icam * (NUM_XYZ_PARAMS + NUM_QUAT_PARAMS)];\n\n        // Copy from curr_params the initial quaternion\n        ceres::CostFunction* rotation_cost_function\n          = weightedRotationError::Create(&curr_params[NUM_XYZ_PARAMS], // quat starts here\n                                          opt.rotation_weight);\n        // Pass the quaternion to optimize to the problem                                  \n        // We use no loss function, as the quaternions have no outliers\n        ceres::LossFunction* rotation_loss_function = NULL;\n        problem.AddResidualBlock(rotation_cost_function, rotation_loss_function,\n                                &curr_params[NUM_XYZ_PARAMS]); // quat starts here\n\n        for (int c = 0; c < NUM_QUAT_PARAMS; c++)\n          weight_per_residual.push_back(opt.rotation_weight);\n      } else {\n         vw::vw_throw(vw::ArgumentErr() << \"Unknown camera model.\\n\");\n      }\n\n    } // end loop through cameras\n  }\n\n  // Try to make the norm of quaternions be close to 1\n  // TODO(oalexan1): Make this a standalone function\n  if (quat_norm_weight > 0.0) {\n    for (int icam = 0; icam < (int)crn.size(); icam++) {\n\n      UsgsAstroLsSensorModel * ls_model\n        = dynamic_cast<UsgsAstroLsSensorModel*>((csm_models[icam]->m_gm_model).get());\n      UsgsAstroFrameSensorModel * frame_model\n        = dynamic_cast<UsgsAstroFrameSensorModel*>((csm_models[icam]->m_gm_model).get());\n\n      if (ls_model != NULL) {\n\n        int numQuat = ls_model->m_quaternions.size() / NUM_QUAT_PARAMS;\n        for (int iq = 0; iq < numQuat; iq++) {\n          ceres::CostFunction* quat_norm_cost_function\n            = weightedQuatNormError::Create(quat_norm_weight);\n          // We use no loss function, as the quaternions have no outliers\n          ceres::LossFunction* quat_norm_loss_function = NULL;\n          problem.AddResidualBlock(quat_norm_cost_function, quat_norm_loss_function,\n                                  &ls_model->m_quaternions[iq * NUM_QUAT_PARAMS]);\n\n          weight_per_residual.push_back(quat_norm_weight); // 1 single residual\n        }\n\n      } else if (frame_model != NULL) {\n\n        // There is one quaternion per camera, stored after the translation\n        double * curr_params = &frame_params[icam * (NUM_XYZ_PARAMS + NUM_QUAT_PARAMS)];\n\n        ceres::CostFunction* quat_norm_cost_function\n          = weightedQuatNormError::Create(quat_norm_weight);\n        // We use no loss function, as the quaternions have no outliers\n        ceres::LossFunction* quat_norm_loss_function = NULL;\n        problem.AddResidualBlock(quat_norm_cost_function, quat_norm_loss_function,\n                                &curr_params[NUM_XYZ_PARAMS]); // quat starts here\n\n        weight_per_residual.push_back(quat_norm_weight); // 1 single residual\n\n      } else {\n         vw::vw_throw(vw::ArgumentErr() << \"Unknown camera model.\\n\");\n      }\n    }\n  }\n}\n\n// Add roll / yaw constraints. For linescan, use the whole set of samples for given\n// camera model. For frame cameras, use the trajectory of all cameras in the same orbital\n// group as the current camera.\nvoid addRollYawConstraint(asp::BaBaseOptions              const& opt,\n                          asp::CRN                       const& crn,\n                          std::vector<asp::CsmModel*>     const& csm_models,\n                          vw::cartography::GeoReference   const& georef,\n                          std::map<int, int>              const& cam2group,\n                          bool initial_camera_constraint,\n                          double roll_weight, double yaw_weight,\n                          // Outputs (append to residual)\n                          std::vector<double>                  & frame_params,\n                          std::vector<double>                  & weight_per_residual,\n                          ceres::Problem                       & problem) {\n\n  if (roll_weight <= 0.0 && yaw_weight <= 0.0)\n     vw::vw_throw(vw::ArgumentErr()\n         << \"addRollYawConstraint: The roll or yaw weight must be positive.\\n\");\n\n  int num_cams = crn.size();\n\n  // Frame cameras can be grouped by orbital portion. Ensure that all cameras\n  // belong to a group.\n  if (num_cams != int(cam2group.size()))\n    vw::vw_throw(vw::ArgumentErr()\n         << \"addRollYawConstraint: Failed to add each input camera to an orbital group.\\n\");\n\n  // Create the orbital trajectory for each group of frame cameras\n  std::map<int, std::vector<double>> orbital_group_positions;\n  std::map<int, std::vector<double>> orbital_group_quaternions;\n  formPositionQuatVecPerGroup(cam2group, csm_models,\n    orbital_group_positions, orbital_group_quaternions); // outputs\n\n  for (int icam = 0; icam < num_cams; icam++) {\n\n    UsgsAstroLsSensorModel * ls_model\n      = dynamic_cast<UsgsAstroLsSensorModel*>((csm_models[icam]->m_gm_model).get());\n    UsgsAstroFrameSensorModel * frame_model\n      = dynamic_cast<UsgsAstroFrameSensorModel*>((csm_models[icam]->m_gm_model).get());\n\n    if (ls_model != NULL) {\n      // Linescan cameras. Use the full sequence of cameras in the model\n      // to enforce the roll/yaw constraint for each camera in the sequence.\n      int numQuat = ls_model->m_quaternions.size() / NUM_QUAT_PARAMS;\n\n      // Make positions one-to-one with quaternions\n      std::vector<double> interp_positions;\n      asp::orbitInterpExtrap(ls_model, georef, interp_positions);\n\n      for (int iq = 0; iq < numQuat; iq++) {\n        ceres::CostFunction* roll_yaw_cost_function\n          = weightedRollYawError::Create(interp_positions,\n                                         ls_model->m_quaternions,\n                                         georef, iq,\n                                         roll_weight, yaw_weight,\n                                         initial_camera_constraint);\n\n        // We use no loss function, as the quaternions have no outliers\n        ceres::LossFunction* roll_yaw_loss_function = NULL;\n        problem.AddResidualBlock(roll_yaw_cost_function, roll_yaw_loss_function,\n                                &ls_model->m_quaternions[iq * NUM_QUAT_PARAMS]);\n        // The recorded weight should not be 0 as we will divide by it\n        weight_per_residual.push_back(roll_weight || 1.0);\n        weight_per_residual.push_back(yaw_weight  || 1.0);\n      } // end loop through quaternions for given camera\n\n    } else if (frame_model != NULL) {\n      // Frame cameras. Use the positions and quaternions of the cameras\n      // in the same orbital group to enforce the roll/yaw constraint for\n      // each camera in the group.\n      auto it = cam2group.find(icam);\n      if (it == cam2group.end())\n        vw::vw_throw(vw::ArgumentErr()\n           << \"addRollYawConstraint: Failed to find orbital group for camera.\\n\");\n      int group_id = it->second;\n\n      int index_in_group = indexInGroup(icam, cam2group);\n      std::vector<double> positions = orbital_group_positions[group_id];\n      std::vector<double> quaternions = orbital_group_quaternions[group_id];\n      if (positions.size() / NUM_XYZ_PARAMS < 2) {\n        // It can happen that we have just one frame camera, but then we just\n        // can't add this constraint\n        vw::vw_out(vw::WarningMessage) << \"Cannot add roll and/or yaw constraint for \"\n          << \"for an orbital group consisting of only one frame camera.\\n\";\n        continue;\n      }\n\n      ceres::CostFunction* roll_yaw_cost_function\n        = weightedRollYawError::Create(positions, quaternions,\n                                   georef, index_in_group,\n                                   roll_weight, yaw_weight,\n                                   initial_camera_constraint);\n\n      // We use no loss function, as the quaternions have no outliers\n      ceres::LossFunction* roll_yaw_loss_function = NULL;\n\n      // Note how we set the quaternions to be optimized from frame_params.\n      // Above, we only cared for initial positions and quaternions.\n      double * curr_params = &frame_params[icam * (NUM_XYZ_PARAMS + NUM_QUAT_PARAMS)];\n      problem.AddResidualBlock(roll_yaw_cost_function, roll_yaw_loss_function,\n                                &curr_params[NUM_XYZ_PARAMS]); // quat starts here\n\n      // The recorded weight should not be 0 as we will divide by it\n      weight_per_residual.push_back(roll_weight || 1.0);\n      weight_per_residual.push_back(yaw_weight  || 1.0);\n    } else {\n      vw::vw_throw(vw::ArgumentErr()\n         << \"addRollYawConstraint: Expecting CSM linescan or frame cameras.\\n\");\n    }\n\n  } // end loop through cameras\n\n  return;\n}\n\n// TODO(oalexan1): This file is getting big. Move the code below to\n// jitterSolveRefCostFun.cc.\n\n// The disparity-based error measured by --reference-terrain. It is the\n// difference between left_pix + disp and right_pix, given the current ground\n// pixel and camera models.\nbool calcDispBasedError(UsgsAstroLsSensorModel *left_ls,\n                        UsgsAstroLsSensorModel *right_ls,\n                        vw::TransformPtr left_tx,\n                        vw::TransformPtr right_tx,\n                        DispPtr disp,\n                        csm::EcefCoord const& P,\n                        vw::Vector2 & error) {\n\n  // Project into the images\n  double desired_precision = asp::DEFAULT_CSM_DESIRED_PRECISION;\n  csm::ImageCoord left_csm_pix = left_ls->groundToImage(P, desired_precision);\n  csm::ImageCoord right_csm_pix = right_ls->groundToImage(P, desired_precision);\n\n  // Covert to ASP pixels    \n  vw::Vector2 left_raw_pix, right_raw_pix;\n  asp::fromCsmPixel(left_raw_pix, left_csm_pix);\n  asp::fromCsmPixel(right_raw_pix, right_csm_pix);\n\n  // Convert to aligned pixel\n  vw::Vector2 left_trans_pix;\n  try {\n    left_trans_pix = left_tx->forward(left_raw_pix);\n  } catch (...) {\n    return false;\n  }\n\n  // Typedefs to avoid long lines      \n  typedef vw::ValueEdgeExtension<vw::PixelMask<vw::Vector2f>> NoDataType;\n  typedef vw::DiskImageView<vw::PixelMask<vw::Vector2f>> DispDiskView;\n\n  // Compute the interpolated aligned disparity. Use no-data when out of bounds.\n  vw::PixelMask<vw::Vector2f> no_data;\n  no_data.invalidate();\n  NoDataType no_data_ext(no_data);\n  vw::InterpolationView<vw::EdgeExtensionView<DispDiskView, NoDataType>,\n                        vw::BicubicInterpolation>\n    interp_disp = interpolate(*disp.get(), vw::BicubicInterpolation(), no_data_ext);\n  vw::PixelMask<vw::Vector2f> disp_pix = interp_disp(left_trans_pix[0], left_trans_pix[1]);\n\n  // Flag invalid pixels\n  if (!is_valid(disp_pix))\n    return false;\n\n  // Discrepancy between right pixel and left pixel + disparity\n  vw::Vector2 right_trans_pix = left_trans_pix + disp_pix.child();\n  vw::Vector2 right_raw_derived_pix;\n  try {\n    right_raw_derived_pix = right_tx->reverse(right_trans_pix);\n  } catch (...) {\n    return false;\n  }\n  error = right_raw_derived_pix - right_raw_pix;\n\n  return true;\n}\n\n// Fallback error value for --reference-terrain. Do not make this big, as when\n// the calculation succeeds, the errors are small.\ndouble g_ref_terrain_pix_val = 5.0;\n\n// Reference terrain error. See calcDispBasedError() for the implementation.\nstruct RefTerrainReprojErr {\n  RefTerrainReprojErr(UsgsAstroLsSensorModel *left_ls,\n                      UsgsAstroLsSensorModel *right_ls,\n                      vw::TransformPtr left_tx,\n                      vw::TransformPtr right_tx,\n                      DispPtr disp,\n                      csm::EcefCoord const& P,\n                      double weight,\n                      int begLeftPosIndex, int endLeftPosIndex,\n                      int begLeftQuatIndex, int endLeftQuatIndex,\n                      int begRightPosIndex, int endRightPosIndex,\n                      int begRightQuatIndex, int endRightQuatIndex):\n    m_left_ls(left_ls), m_right_ls(right_ls),\n    m_left_tx(left_tx), m_right_tx(right_tx), m_disp(disp), m_P(P), m_weight(weight),\n    m_begLeftPosIndex(begLeftPosIndex), m_endLeftPosIndex(endLeftPosIndex),\n    m_begLeftQuatIndex(begLeftQuatIndex), m_endLeftQuatIndex(endLeftQuatIndex),\n    m_begRightPosIndex(begRightPosIndex), m_endRightPosIndex(endRightPosIndex),\n    m_begRightQuatIndex(begRightQuatIndex), m_endRightQuatIndex(endRightQuatIndex) {}\n\n  // The implementation is further down\n  bool operator()(double const * const * parameters, double * residuals) const;\n\n  // Factory to hide the construction of the CostFunction object from the client code.\n  static ceres::CostFunction* Create(\n                      UsgsAstroLsSensorModel *left_ls,\n                      UsgsAstroLsSensorModel *right_ls,\n                      vw::TransformPtr left_tx,\n                      vw::TransformPtr right_tx,\n                      DispPtr disp,\n                      csm::EcefCoord const& P,\n                      double weight,\n                      int begLeftPosIndex, int endLeftPosIndex,\n                      int begLeftQuatIndex, int endLeftQuatIndex,\n                      int begRightPosIndex, int endRightPosIndex,\n                      int begRightQuatIndex, int endRightQuatIndex) {\n\n    ceres::DynamicNumericDiffCostFunction<RefTerrainReprojErr>* cost_function =\n      new ceres::DynamicNumericDiffCostFunction<RefTerrainReprojErr>\n      (new RefTerrainReprojErr(left_ls, right_ls, left_tx, right_tx, disp, P, weight,\n                               begLeftPosIndex, endLeftPosIndex,\n                               begLeftQuatIndex, endLeftQuatIndex,\n                               begRightPosIndex, endRightPosIndex,\n                               begRightQuatIndex, endRightQuatIndex));\n\n    // The residual size is the pixel size\n    cost_function->SetNumResiduals(PIXEL_SIZE);\n\n    // Add a parameter block for each position and quaternion\n    for (int it = begLeftPosIndex; it < endLeftPosIndex; it++)\n      cost_function->AddParameterBlock(NUM_XYZ_PARAMS);\n    for (int it = begLeftQuatIndex; it < endLeftQuatIndex; it++)\n      cost_function->AddParameterBlock(NUM_QUAT_PARAMS);\n    for (int it = begRightPosIndex; it < endRightPosIndex; it++)\n      cost_function->AddParameterBlock(NUM_XYZ_PARAMS);\n    for (int it = begRightQuatIndex; it < endRightQuatIndex; it++)\n      cost_function->AddParameterBlock(NUM_QUAT_PARAMS);\n\n    return cost_function;\n  }\n\nprivate:\n  UsgsAstroLsSensorModel *m_left_ls, *m_right_ls;\n  vw::TransformPtr m_left_tx, m_right_tx;\n  DispPtr m_disp;\n  csm::EcefCoord m_P;\n  double m_weight;\n  int m_begLeftPosIndex, m_endLeftPosIndex;\n  int m_begLeftQuatIndex, m_endLeftQuatIndex;\n  int m_begRightPosIndex, m_endRightPosIndex;\n  int m_begRightQuatIndex, m_endRightQuatIndex;\n\n}; // End class RefTerrainReprojErr\n\n// See the documentation higher up in the file.\nbool RefTerrainReprojErr::operator()(double const * const * parameters,\n                                     double * residuals) const {\n\n  try {\n    // Make a copy of the models\n    UsgsAstroLsSensorModel local_left_ls = *m_left_ls;\n    UsgsAstroLsSensorModel local_right_ls = *m_right_ls;\n\n    // Update position and quaternion parameters with the current values\n    int param_count = 0;\n    for (int it = m_begLeftPosIndex; it < m_endLeftPosIndex; it++) {\n      for (int c = 0; c < NUM_XYZ_PARAMS; c++)\n        local_left_ls.m_positions[it * NUM_XYZ_PARAMS + c] = parameters[param_count][c];\n      param_count++;\n    }\n    for (int it = m_begLeftQuatIndex; it < m_endLeftQuatIndex; it++) {\n      for (int c = 0; c < NUM_QUAT_PARAMS; c++)\n        local_left_ls.m_quaternions[it * NUM_QUAT_PARAMS + c] = parameters[param_count][c];\n      param_count++;\n    }\n    // Same for the right camera\n    for (int it = m_begRightPosIndex; it < m_endRightPosIndex; it++) {\n      for (int c = 0; c < NUM_XYZ_PARAMS; c++)\n        local_right_ls.m_positions[it * NUM_XYZ_PARAMS + c] = parameters[param_count][c];\n      param_count++;\n    }\n    for (int it = m_begRightQuatIndex; it < m_endRightQuatIndex; it++) {\n      for (int c = 0; c < NUM_QUAT_PARAMS; c++)\n        local_right_ls.m_quaternions[it * NUM_QUAT_PARAMS + c] = parameters[param_count][c];\n      param_count++;\n    }\n\n    vw::TransformPtr local_left_tx = m_left_tx;\n    vw::TransformPtr local_right_tx = m_right_tx;\n\n    vw::Vector2 error;\n    bool success = calcDispBasedError(&local_left_ls, &local_right_ls,\n                                      local_left_tx, local_right_tx,\n                                      m_disp, m_P, error);\n\n    if (success) {\n      residuals[0] = m_weight * error[0];\n      residuals[1] = m_weight * error[1];\n    } else {\n      residuals[0] = m_weight * g_ref_terrain_pix_val;\n      residuals[1] = m_weight * g_ref_terrain_pix_val;\n    }\n\n    // Accept the solution in either case, as it is too late to back out,\n    // because that will mess up the bookkeeping.\n    return true;\n\n  } catch (...) {\n    residuals[0] = m_weight * g_ref_terrain_pix_val;\n    residuals[1] = m_weight * g_ref_terrain_pix_val;\n    return true; // accept the solution anyway\n  }\n\n  return true;\n}\n\nbool addRefTerrainReprojectionErr(asp::BaBaseOptions const& opt,\n                                  UsgsAstroLsSensorModel *left_ls,\n                                  UsgsAstroLsSensorModel *right_ls,\n                                  vw::TransformPtr left_tx,\n                                  vw::TransformPtr right_tx,\n                                  vw::BBox2i const& left_bbox,\n                                  vw::BBox2i const& right_bbox,\n                                  DispPtr disp,\n                                  csm::EcefCoord const& P,\n                                  double weight,\n                                  ceres::Problem & problem) {\n\n  double line_extra = opt.max_init_reproj_error + 5.0; // add some more just in case\n  double desired_precision = asp::DEFAULT_CSM_DESIRED_PRECISION;\n\n  // Find all positions and quaternions that can affect the current pixel.\n  csm::ImageCoord left_csm_pix = left_ls->groundToImage(P, desired_precision);\n  vw::Vector2 left_pix;\n  asp::fromCsmPixel(left_pix, left_csm_pix);\n  if (!left_bbox.contains(left_pix))\n    return false; // the pixel is outside the left image\n\n  int leftBegPosIndex = -1, leftEndPosIndex = -1;\n  int leftBegQuatIndex = -1, leftEndQuatIndex = -1;\n  calcPosQuatIndexBounds(line_extra, left_ls, left_pix,\n                         // Outputs\n                         leftBegPosIndex, leftEndPosIndex,\n                         leftBegQuatIndex, leftEndQuatIndex);\n\n  // Same for the right camera\n  csm::ImageCoord right_csm_pix = right_ls->groundToImage(P, desired_precision);\n  vw::Vector2 right_pix;\n  asp::fromCsmPixel(right_pix, right_csm_pix);\n  if (!right_bbox.contains(right_pix))\n    return false; // the pixel is outside the right image\n\n  int rightBegPosIndex = -1, rightEndPosIndex = -1;\n  int rightBegQuatIndex = -1, rightEndQuatIndex = -1;\n  calcPosQuatIndexBounds(line_extra, right_ls, right_pix,\n                         // Outputs\n                         rightBegPosIndex, rightEndPosIndex,\n                         rightBegQuatIndex, rightEndQuatIndex);\n\n  ceres::CostFunction* pixel_cost_function =\n    RefTerrainReprojErr::Create(left_ls, right_ls, left_tx, right_tx, disp, P, weight,\n                                leftBegPosIndex, leftEndPosIndex,\n                                leftBegQuatIndex, leftEndQuatIndex,\n                                rightBegPosIndex, rightEndPosIndex,\n                                rightBegQuatIndex, rightEndQuatIndex);\n\n  ceres::LossFunction* pixel_loss_function\n    = new ceres::CauchyLoss(opt.reference_terrain_robust_threshold);\n\n  // The variable of optimization are the relevant camera positions and quaternions.\n  std::vector<double*> vars;\n  for (int it = leftBegPosIndex; it < leftEndPosIndex; it++)\n    vars.push_back(&left_ls->m_positions[it * NUM_XYZ_PARAMS]);\n  for (int it = leftBegQuatIndex; it < leftEndQuatIndex; it++)\n    vars.push_back(&left_ls->m_quaternions[it * NUM_QUAT_PARAMS]);\n\n  // Same for the right camera\n  for (int it = rightBegPosIndex; it < rightEndPosIndex; it++)\n    vars.push_back(&right_ls->m_positions[it * NUM_XYZ_PARAMS]);\n  for (int it = rightBegQuatIndex; it < rightEndQuatIndex; it++)\n    vars.push_back(&right_ls->m_quaternions[it * NUM_QUAT_PARAMS]);\n\n  problem.AddResidualBlock(pixel_cost_function, pixel_loss_function, vars);\n\n  return true;\n}\n\n// Read the reference terrain. Ensure enough reference points are loaded that\n// project in the camera boxes. Do two attempts.\n// TODO(oalexan1): This will need adjustment if there is more than one stereo pair.\nvoid loadReferenceTerrain(asp::BaBaseOptions            const& opt,\n                          std::vector<asp::CsmModel*>   const& csm_models,\n                          std::vector<int>              const& left_indices,\n                          std::vector<int>              const& right_indices,\n                          std::vector<vw::TransformPtr> const& left_trans,\n                          std::vector<vw::TransformPtr> const& right_trans,\n                          std::vector<vw::BBox2i>       const& image_boxes,\n                          // Output\n                          std::vector<vw::Vector3> & reference_vec) {\n\n  vw::vw_out() << \"Loading reference terrain points and then filtering them.\\n\";\n\n  // Set up a GeoReference object using the datum, it may get modified later\n  vw::cartography::GeoReference geo;\n  geo.set_datum(opt.datum); // We checked for a datum earlier\n  // Ensure the read georef lives on the same planet\n  bool warn_only = false;\n  vw::checkDatumConsistency(opt.datum, geo.datum(), warn_only);\n\n  for (size_t i = 0; i < left_indices.size(); i++) {\n\n    auto * left_cam = csm_models[left_indices[i]];\n    auto * right_cam = csm_models[right_indices[i]];\n    auto left_bbox = image_boxes[left_indices[i]];\n    auto right_bbox = image_boxes[right_indices[i]];\n\n    int num_try_load = 5 * opt.max_num_reference_points;\n    for (int attempt = 0; attempt < 2; attempt++) {\n\n      reference_vec.clear();\n      std::vector<vw::Vector3> local_reference_vec;\n      asp::load_csv_or_dem(opt.csv_format_str, opt.csv_srs, opt.reference_terrain,\n                            num_try_load,\n                            // Outputs\n                            geo, local_reference_vec);\n\n      // TODO(oalexan1): For non-ISIS cameras this could be done in parallel.\n      for (size_t data_col = 0; data_col < local_reference_vec.size(); data_col++) {\n        vw::Vector3 reference_xyz = local_reference_vec[data_col];\n        vw::Vector2 left_pix, right_pix;\n        try {\n          left_pix = left_cam->point_to_pixel(reference_xyz);\n          right_pix = right_cam->point_to_pixel(reference_xyz);\n        } catch (...) {\n          continue;\n        }\n        if (!left_bbox.contains(left_pix) || !right_bbox.contains(right_pix))\n          continue;\n\n        reference_vec.push_back(reference_xyz);\n      }\n\n      int num_loaded = reference_vec.size();\n      double ratio = double(num_loaded) / opt.max_num_reference_points;\n      if (ratio >= 1.0)\n        break; // loaded enough points\n\n       // Try again\n       num_try_load = 1.5 * num_try_load / std::max(ratio, 1e-3); // avoid division by 0\n       vw::vw_out() << \"Loaded too few points after filtering. Try again.\\n\";\n\n    } // end attempt loop\n\n    // If there are too few points, print a warning\n    if (reference_vec.size() < opt.max_num_reference_points)\n      vw::vw_out(vw::WarningMessage) << \"Loaded only \" << reference_vec.size()\n        << \" reference terrain points after filtering by projection into camera.\\n\";\n\n    // If they are too many, pick a subset\n    if (reference_vec.size() > opt.max_num_reference_points) {\n      // Deterministic shuffle\n      unsigned seed = 0;\n      std::mt19937 gen(seed);\n      std::shuffle(reference_vec.begin(), reference_vec.end(), gen);\n      reference_vec.resize(opt.max_num_reference_points);\n    }\n\n    vw::vw_out() << \"Read \" << reference_vec.size()\n      << \" reference terrain points (after filtering by projection into camera).\\n\";\n\n  } // end loop through stereo pairs\n\n} // end function loadReferenceTerrain()\n\n// Option --reference-terrain\n// TODO(oalexan1): Must add the uncertainty logic.\n// TODO(oalexan1): Filter out points outside the box and load more if needed.\nvoid addRefTerrainCostFun(asp::BaBaseOptions            const& opt,\n                                     std::vector<asp::CsmModel*>   const& csm_models,\n                                     std::vector<int>              const& left_indices,\n                                     std::vector<int>              const& right_indices,\n                                     std::vector<vw::TransformPtr> const& left_trans,\n                                     std::vector<vw::TransformPtr> const& right_trans,\n                                     std::vector<std::string>      const& disp_files,\n                                     // Outputs\n                                     ceres::Problem                 & problem,\n                                     std::vector<DispPtr>           & disp_vec,\n                                     vw::ImageView<float>           & mapproj_dem,\n                                     std::vector<double>            & weight_per_residual,\n                                     std::vector<vw::Vector3>       & reference_vec,\n                                     std::vector<std::vector<int>>  & ref_indices) {\n\n  // For now, only one stereo pair is supported, so size of left_indices must be 1\n  if (left_indices.size() != 1)\n    vw::vw_throw(vw::ArgumentErr() << \"Expecting only one stereo pair.\\n\");\n\n  // Read the image boxes\n  std::vector<vw::BBox2i> image_boxes;\n  for (size_t icam = 0; icam < opt.image_files.size(); icam++) {\n    vw::DiskImageView<float> img(opt.image_files[icam]);\n    vw::BBox2i bbox = vw::bounding_box(img);\n    image_boxes.push_back(bbox);\n  }\n\n  // Read the reference terrain. Ensure enough reference points are loaded that\n  // project in the camera boxes. \n  loadReferenceTerrain(opt, csm_models, left_indices, right_indices,\n                      left_trans, right_trans, image_boxes,\n                      reference_vec); // output\n\n  // Load the disparity files. Keep a pointer to DiskImageView to avoid loading\n  // them fully in memory, as they can be huge.\n  disp_vec.resize(disp_files.size());\n  for (size_t i = 0; i < disp_files.size(); i++) {\n    vw::vw_out() << \"Reading disparity file: \" << disp_files[i] << \"\\n\";\n    disp_vec[i].reset(new vw::DiskImageView<vw::PixelMask<vw::Vector2f>>(disp_files[i]));\n  }\n\n  // Record the indices of the residuals of the reference points  \n  ref_indices.clear();\n  ref_indices.resize(reference_vec.size());\n\n  int num_kept_ref_points = 0;\n  vw::vw_out() << \"Setting up the error to the reference terrain.\\n\";\n\n  // For Map2CamTrans, must turn off caching to ensure thread safety, and read\n  // the DEM in memory.\n  for (size_t i = 0; i < left_indices.size(); i++) {\n\n    auto & left_tx = left_trans[i];\n    auto & right_tx = right_trans[i];\n\n    vw::cartography::Map2CamTrans* left_map2cam =\n      dynamic_cast<vw::cartography::Map2CamTrans*>(left_tx.get());\n    vw::cartography::Map2CamTrans* right_map2cam =\n      dynamic_cast<vw::cartography::Map2CamTrans*>(right_tx.get());\n\n    // Either both must be null or both must be non-null.\n    if ((left_map2cam == NULL) != (right_map2cam == NULL))\n      vw::vw_throw(vw::ArgumentErr() << \"Both images in a stereo pair must be \"\n                   << \"mapprojected, or neither of them.\\n\");\n\n    if (left_map2cam == NULL || right_map2cam == NULL)\n      continue; // nothing to do\n\n    // Both must be projected onto the same DEM\n    if (left_map2cam->m_dem_file != right_map2cam->m_dem_file)\n      vw::vw_throw(vw::ArgumentErr() << \"The two images in a stereo pair must be \"\n                   << \"projected onto the same DEM.\\n\");\n\n    // Print a warning if the left_map2cam->m_dem width and height are no less than \n    // 5000 pixels, as that would be slow to load.\n    int k = 5000;\n    if (left_map2cam->m_dem.cols() >= k || left_map2cam->m_dem.rows() >= k)\n      vw::vw_out(vw::WarningMessage)\n        << \"The mapprojection DEM \" << left_map2cam->m_dem_file\n        << \" is very large, it may take a long time to load. Dimensions: \"\n        << left_map2cam->m_dem.cols() << \" x \" << left_map2cam->m_dem.rows()\n        << \" pixels.\\n\";\n\n    // Load the DEM in memory and set it for each transform. This is a fix\n    // for very slow performance. Note that the disparity is still loaded\n    // on demand only, as that can be large.\n    mapproj_dem = copy(left_map2cam->m_dem);\n\n    // TODO(oalexan1): This must be a member function. It uses very detailed\n    // info from the class.\n    left_map2cam->set_use_cache(false);\n    left_map2cam->m_masked_dem = vw::create_mask(mapproj_dem,\n                                                 left_map2cam->m_nodata);\n    left_map2cam->m_interp_dem = vw::interpolate(left_map2cam->m_masked_dem,\n                                                  vw::BicubicInterpolation(),\n                                                  vw::ZeroEdgeExtension());\n\n    right_map2cam->set_use_cache(false);\n    right_map2cam->m_masked_dem = vw::create_mask(mapproj_dem,\n                                                  right_map2cam->m_nodata);\n    right_map2cam->m_interp_dem = vw::interpolate(right_map2cam->m_masked_dem,\n                                                  vw::BicubicInterpolation(),\n                                                  vw::ZeroEdgeExtension());\n  } // end loop through stereo pairs\n\n  // Need a progress bar as this can be slow\n  vw::TerminalProgressCallback tpc(\"asp\", \"Filter ref points with disparity: --> \");\n  // Find the spacing for progress. Avoid int32 overflow.\n  double total = double(reference_vec.size()) * double(left_indices.size());\n  double hundred = 100.0;\n  long long spacing = std::max(round(total / hundred), 1.0);\n  long long data_count = 0;\n\n  // Loop through the reference points\n  for (size_t data_col = 0; data_col < reference_vec.size(); data_col++) {\n\n    vw::Vector3 reference_xyz = reference_vec[data_col];\n\n    // Iterate over left indices\n    for (size_t i = 0; i < left_indices.size(); i++) {\n\n      data_count++;\n      if (data_count % spacing == 0)\n        tpc.report_incremental_progress(1.0/hundred);\n\n      auto & left_tx = left_trans[i];\n      auto & right_tx = right_trans[i];\n      int left_index = left_indices[i];\n      int right_index = right_indices[i];\n      vw::BBox2i left_bbox = image_boxes[left_index];\n      vw::BBox2i right_bbox = image_boxes[right_index];\n\n      // Get the underlying linescan models      \n      csm::RasterGM * left_csm = csm_models[left_index]->m_gm_model.get();\n      UsgsAstroLsSensorModel * left_ls\n        = dynamic_cast<UsgsAstroLsSensorModel*>(left_csm);\n      csm::RasterGM * right_csm = csm_models[right_index]->m_gm_model.get();\n      UsgsAstroLsSensorModel * right_ls\n        = dynamic_cast<UsgsAstroLsSensorModel*>(right_csm);\n      if (left_ls == NULL || right_ls == NULL)\n        vw::vw_throw(vw::ArgumentErr() << \"The option --reference-terrain works only \"\n                      << \"with linescan cameras.\\n\");\n\n      // Convert to CSM points\n      csm::EcefCoord P(reference_xyz[0], reference_xyz[1], reference_xyz[2]);\n\n      // If the error cannot be measured even with nominal values of the parameters,\n      // there is no point in adding the error.\n      vw::Vector2 error;\n      bool success = calcDispBasedError(left_ls, right_ls, left_tx, right_tx, disp_vec[i], P,\n                                        error); // output\n\n      if (!success)\n        continue; // skip this point\n\n      // Find the weight to use with the camera constraint\n      double gsd = 0.0;\n      try {\n        vw::Vector2 pix_obs = csm_models[left_index]->point_to_pixel(reference_xyz);\n        gsd = vw::camera::estimatedGSD(csm_models[left_index], image_boxes[left_index],\n                                        pix_obs, reference_xyz);\n      } catch (...) {\n        continue;\n      }\n      if (gsd <= 0.0)\n        continue;\n\n      // Bigger uncertainty means a smaller weight for the residual. Also \n      // convert from meters to pixels.\n      double weight = gsd / opt.reference_terrain_uncertainty;\n\n      // Add the error cost function for this point. Skip points whose pixel\n      // falls outside the camera ephemeris range.\n      try {\n        success = addRefTerrainReprojectionErr(opt, left_ls, right_ls,\n                                               left_tx, right_tx,\n                                               left_bbox, right_bbox,\n                                               disp_vec[i], P, weight, problem);\n      } catch (...) { success = false; }\n      if (!success)\n        continue; // skip this point\n\n      // Record where the residuals for this point are stored\n      ref_indices[data_col].push_back(weight_per_residual.size());\n\n      // Two residuals were added. Save the corresponding weights. The saved residuals\n      // will be divided back by the weight.\n      for (int c = 0; c < asp::PIXEL_SIZE; c++)\n        weight_per_residual.push_back(weight);\n\n    } // end loop through stereo pairs\n\n    // See if this point is kept\n    if (ref_indices[data_col].size() > 0)\n      num_kept_ref_points++;\n  }\n\n  tpc.report_finished();\n\n  vw::vw_out() << \"Read \" << num_kept_ref_points\n    << \" reference terrain points (after filtering by disparity).\\n\";\n\n}\n\n// Given the quaternions in a camera model, calculate the curvature for each\n// coordinate. This cannot be done at the starting and ending coordinate, as we\n// use a centered difference. Make each curvature be at least the median\n// curvature. This will ensure that even flat areas are allowed to have some\n// curvature when being optimized.\nvoid estimCurvature(UsgsAstroLsSensorModel * ls_model,\n                   std::vector<double> & curvature) {\n\n  // There will be as many curvature terms as overall quaternion coefficients.\n  int numQuats = ls_model->m_quaternions.size() / NUM_QUAT_PARAMS;\n  curvature.resize(numQuats * NUM_QUAT_PARAMS, 0.0);\n\n  // Throw an error if less than 3 quaternions\n  if (numQuats < 3)\n    vw::vw_throw(vw::ArgumentErr()\n        << \"Need at least 3 quaternions to calculate curvature. Set the smoothness \"\n        << \"weight to 0.\\n\");\n\n  // Start iterating from the second quaternion, as we need the previous one\n  // shorthand\n  double *q = &ls_model->m_quaternions[0];\n  for (int it = 1; it < numQuats - 1; it++) {\n    for (int c = 0; c < NUM_QUAT_PARAMS; c++) {\n        double val\n        = q[(it - 1) * NUM_QUAT_PARAMS + c] - 2.0 * q[it * NUM_QUAT_PARAMS + c] +\n          q[(it + 1) * NUM_QUAT_PARAMS + c];\n        // Take the absolute value\n        curvature[it * NUM_QUAT_PARAMS + c] = std::abs(val);\n    }\n  }\n\n  // Find the median curvature. Ignore the first and last curvatures as those are 0.\n  std::vector<double> median_curvature(4);\n  for (int c = 0; c < NUM_QUAT_PARAMS; c++) {\n\n    std::vector<double> vals;\n    for (int it = 1; it < numQuats - 1; it++)\n      vals.push_back(curvature[it * NUM_QUAT_PARAMS + c]);\n    median_curvature[c] = vw::math::destructive_median<double>(vals);\n  }\n\n  // For synthetic cameras, the median initial curvature is 0. That is not good.\n  // Ensure a decent lower bound for the median curvature by finding the average \n  // of median curvatures and using 10% of that at least for each component.\n  double avg = 0.0;\n  for (int c = 0; c < NUM_QUAT_PARAMS; c++)\n    avg += median_curvature[c];\n  avg /= NUM_QUAT_PARAMS;\n  for (int c = 0; c < NUM_QUAT_PARAMS; c++)\n    median_curvature[c] = std::max(median_curvature[c], 0.1 * avg);\n\n  // Make each curvature, even the ones at endpoints, be at least the median curvature\n  for (int it = 0; it < numQuats; it++) {\n    for (int c = 0; c < NUM_QUAT_PARAMS; c++) {\n      if (curvature[it * NUM_QUAT_PARAMS + c] < median_curvature[c])\n        curvature[it * NUM_QUAT_PARAMS + c] = median_curvature[c];\n    }\n  }\n\n  return;\n}\n\n// Add the quaternion smoothness constraint. This prevents high-frequency\n// oscillations in the camera orientation.\nstruct QuatSmoothnessErr {\n\nQuatSmoothnessErr(double const* smoothnessWeight) {\n\n  // Make a local copy of the smoothness weight, so it does not go out of scope.\n  m_smoothnessWeight.resize(NUM_QUAT_PARAMS);\n  for (int it = 0; it < NUM_QUAT_PARAMS; it++)\n    m_smoothnessWeight[it] = smoothnessWeight[it];\n}\n\n// The implementation is further down\nbool operator()(double const * const * parameters, double * residuals) const;\n\n// Factory to hide the construction of the CostFunction object from the client code.\nstatic ceres::CostFunction* Create(double const* smoothnessWeight,\n                                    int begQuatIndex,\n                                    int endQuatIndex) {\n\n  // TODO(oalexan1): Try using here the analytical cost function\n  ceres::DynamicNumericDiffCostFunction<QuatSmoothnessErr>* cost_function =\n    new ceres::DynamicNumericDiffCostFunction<QuatSmoothnessErr>\n    (new QuatSmoothnessErr(smoothnessWeight));\n\n  // The residual size is NUM_QUAT_PARAMS: the curvature per each component\n  cost_function->SetNumResiduals(NUM_QUAT_PARAMS);\n\n  // Add a parameter block for each quaternion and each position\n  for (int it = begQuatIndex; it <= endQuatIndex; it++)\n    cost_function->AddParameterBlock(NUM_QUAT_PARAMS);\n\n  return cost_function;\n}\n\nprivate:\n  std::vector<double> m_smoothnessWeight;\n}; // End class QuatSmoothnessErr\n\n// A function that first increases slowly, then very fast, but without being\n// numerically unstable for very small or very large values of the input.\ndouble signed_exp(double val) {\n  double ans = val * (exp(abs(val)) - 1.0);\n  return ans;\n}\n\n// See the documentation higher up in the file.\nbool QuatSmoothnessErr::operator()(double const * const * parameters,\n                                   double * residuals) const {\n\n  // parameters[0] has has q[index-1], with four components (x, y, z, w)\n  // parameters[1] has has q[index]\n  // parameters[2] has has q[index+1]\n  for (int it = 0; it < NUM_QUAT_PARAMS; it++) {\n    double curvature = parameters[0][it] - 2.0 * parameters[1][it] + parameters[2][it];\n\n    // Use a power of 8 so that this kicks in only when the curvature becomes\n    // big, but then it does so big time. Note that smoothnessWeight \n    // takes into account the initial curvature, so this residual is normalized.\n    //residuals[it] = m_smoothnessWeight[it] * curvature;\n    residuals[it] = asp::signed_exp(m_smoothnessWeight[it] * curvature);\n  }\n\n  return true;\n}\n\nvoid addQuatSmoothnessErr(UsgsAstroLsSensorModel   * ls_model,\n                          int                        quatIndex,\n                          double              const* smoothnessWeight,\n                          std::vector<double>      & weight_per_residual,\n                          ceres::Problem           & problem) {\n\n  // For a smoothness constraint need the current quaternion and its neighbors.\n  int begQuatIndex = quatIndex - 1, endQuatIndex = quatIndex + 1;\n\n  // Sanity check\n  int numQuats = ls_model->m_quaternions.size() / NUM_QUAT_PARAMS;\n  if (begQuatIndex < 0 || endQuatIndex >= numQuats)\n    vw::vw_throw(vw::ArgumentErr()\n                 << \"Quat index out of bounds in the smoothness constraint.\\n\");\n\n  ceres::CostFunction* pixel_cost_function =\n    QuatSmoothnessErr::Create(smoothnessWeight, begQuatIndex, endQuatIndex);\n  ceres::LossFunction* pixel_loss_function = NULL; // no attenuation\n\n  // The variable of optimization are camera quaternions. Notice how the\n  // quaternion indices are in the [begQuatIndex, endQuatIndex] range, so\n  // inclusive at both ends.\n  std::vector<double*> vars;\n  for (int it = begQuatIndex; it <= endQuatIndex; it++)\n    vars.push_back(&ls_model->m_quaternions[it * NUM_QUAT_PARAMS]);\n  problem.AddResidualBlock(pixel_cost_function, pixel_loss_function, vars);\n\n  // Need this for bookkeeping. Won't be used as do do not save the residuals \n  // for this cost function. If we ever do, need to take into account the internal\n  // raising to the power and the smoothness weight.\n  for (int it = 0; it < NUM_QUAT_PARAMS; it++)\n    weight_per_residual.push_back(1.0);\n\n  return;\n}\n\n// Add a constraint that the curvature of the sequence of poses does not become\n// a lot more than the initial one.\nvoid addSmoothnessConstraint(asp::BaBaseOptions               const& opt,\n                             std::vector<asp::CsmModel*>      const& csm_models,\n                             double                                  smoothness_weight,\n                             bool                                    have_rig,\n                             rig::RigSet                      const& rig,\n                             std::vector<asp::RigCamInfo>     const& rig_cam_info,\n                             // Outputs\n                             std::vector<double>                & weight_per_residual,\n                             std::vector<std::vector<double>>   & orig_curvatures,\n                             ceres::Problem                     & problem) {\n\n  if (smoothness_weight < 0.0 || !std::isfinite(smoothness_weight))\n    vw::vw_throw(vw::ArgumentErr()\n      << \"The smoothness weight must be non-negative.\\n\");\n\n  // orig_curvatures must be either empty or of size num_cams\n  int num_cams = csm_models.size();\n  if (orig_curvatures.size() != 0 && orig_curvatures.size() != num_cams)\n    vw::vw_throw(vw::ArgumentErr()\n      << \"The orig_curvatures vector must be empty or of size equal \"\n      << \"to the number of cameras.\\n\");\n   if (orig_curvatures.empty())\n    orig_curvatures.resize(num_cams);\n\n  for (int icam = 0; icam < num_cams; icam++) {\n\n    // With a rig, only the ref sensor has rotation constraints \n    if (have_rig && !rig.isRefSensor(rig_cam_info[icam].sensor_id))\n      continue;\n\n    // Get the underlying linescan models      \n    csm::RasterGM * csm = csm_models[icam]->m_gm_model.get();\n    UsgsAstroLsSensorModel * ls_model = dynamic_cast<UsgsAstroLsSensorModel*>(csm);\n    if (ls_model == NULL)\n      continue; // not a linescan camera\n\n    // Estimate the curvature of the quaternion sequence. Do this only once,\n    // with the original cameras, to keep the same constraint for all passes.\n    if (orig_curvatures[icam].empty())\n      estimCurvature(ls_model, orig_curvatures[icam]);\n\n    // Let the weight be inversely proportional to the curvature. This way the\n    // current curvature is normalized by the initial curvature. The multiplier\n    // below ensures the optimized curvature can be no more than a factor the\n    // initial curvature. This was carefully tested with real and synthetic data.\n    std::vector<double> weights(orig_curvatures[icam].size());\n    for (size_t it = 0; it < orig_curvatures[icam].size(); it++)\n      weights[it] = 0.001 * smoothness_weight / orig_curvatures[icam][it];\n\n    // Add the smoothness constraint for the quaternions. Cannot have such\n    // a constraint for the first and last quaternion, as need neighbors.\n    int numQuats = ls_model->m_quaternions.size() / NUM_QUAT_PARAMS;\n    for (int it = 1; it < numQuats - 1; it++)\n      addQuatSmoothnessErr(ls_model, it, &weights[it * NUM_QUAT_PARAMS],\n                           weight_per_residual, problem);\n\n  } // end loop through cameras\n\n  return;\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Camera/JitterSolveCostFuns.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file JitterSolveCostFuns.h\n\n// Cost functions used in solving for jitter. These need access to the camera\n// models, so they are stored in the Camera folder. The bigger functions defined\n// here are implemented in the .cc file.\n\n#ifndef __ASP_CAMERA_JITTER_SOLVE_COST_FUNS_H__\n#define __ASP_CAMERA_JITTER_SOLVE_COST_FUNS_H__\n\n#include <asp/Camera/CsmModel.h>\n#include <asp/Camera/JitterSolveUtils.h>\n#include <asp/Camera/JitterSolveRigUtils.h>\n#include <asp/Camera/CsmUtils.h>\n#include <asp/Core/BundleAdjustUtils.h>\n\n#include <vw/Cartography/GeoReference.h>\n#include <vw/Math/Transform.h>\n\n#include <usgscsm/UsgsAstroLsSensorModel.h>\n#include <usgscsm/UsgsAstroFrameSensorModel.h>\n#include <usgscsm/Utilities.h>\n\n#include <ceres/ceres.h>\n#include <ceres/loss_function.h>\n\n#include <map>\n#include <set>\n#include <string>\n#include <vector>\n\nnamespace asp {\n\nconst double g_big_pixel_value = 1000.0;  // don't make this too big\n\nstruct BaBaseOptions;\n\n// Calc the range of indices in the samples needed to interpolate between time1 and time2.\n// Based on lagrangeInterp() in usgscsm.\nvoid calcIndexBounds(double time1, double time2, double t0, double dt, int numVals,\n                     // Outputs\n                     int & begIndex, int & endIndex);\n\n// Update the linescan model with the latest optimized values of the position\n// and quaternion parameters. Also update the triangulated point.\nvoid updateLsModelTriPt(double const * const * parameters,\n                        int begQuatIndex, int endQuatIndex,\n                        int begPosIndex, int endPosIndex,\n                        int & param_shift,\n                        UsgsAstroLsSensorModel & cam,\n                        csm::EcefCoord & P);\n\n// Add reprojection errors. Collect data that will be used to add camera\n// constraints that scale with the number of reprojection errors and GSD.\nvoid addReprojCamErrs(asp::BaBaseOptions                    const & opt,\n                      asp::CRN                             const & crn,\n                      std::vector<std::vector<vw::Vector2>> const & pixel_vec,\n                      std::vector<std::vector<double>>      const & weight_vec,\n                      std::vector<std::vector<int>>         const & isAnchor_vec,\n                      std::vector<std::vector<int>>         const & pix2xyz_index,\n                      std::vector<asp::CsmModel*>           const & csm_models,\n                      bool                                          have_rig,\n                      rig::RigSet                           const & rig,\n                      std::vector<RigCamInfo>               const & rig_cam_info,\n                      std::map<int, int>                    const & cam2group,\n                      TimestampMap                          const & timestamp_map,\n                      bool                                          fix_rig_translations,\n                      bool                                          fix_rig_rotations,\n                      // Outputs\n                      std::vector<double>                     & tri_points_vec,\n                      std::vector<double>                     & frame_params,\n                      std::vector<double>                     & weight_per_residual,\n                      std::vector<std::vector<double>>        & weight_per_cam,\n                      std::vector<std::vector<double>>        & count_per_cam,\n                      std::vector<double>                     & ref_to_curr_sensor_vec,\n                      ceres::Problem                          & problem);\n\n// Add the constraint based on DEM\nvoid addDemConstraint(asp::BaBaseOptions       const& opt,\n                      std::vector<vw::Vector3> const& dem_xyz_vec,\n                      std::set<int>            const& outliers,\n                      vw::ba::ControlNetwork   const& cnet,\n                      // Outputs\n                      std::vector<double>           & tri_points_vec,\n                      std::vector<double>           & weight_per_residual, // append\n                      ceres::Problem                & problem);\n\n// Add the constraint to keep triangulated points close to initial values\n// This does not need a DEM or alignment\nvoid addTriConstraint(asp::BaBaseOptions     const& opt,\n                      std::set<int>          const& outliers,\n                      vw::ba::ControlNetwork const& cnet,\n                      asp::CRN              const& crn,\n                      // Outputs\n                      std::vector<double>    & tri_points_vec,\n                      std::vector<double>    & weight_per_residual, // append\n                      ceres::Problem         & problem);\n\n// Add the GCP constraint\nvoid addGcpConstraint(asp::BaBaseOptions     const& opt,\n                      std::set<int>          const& outliers,\n                      bool                          use_llh_error,\n                      bool                          fix_gcp_xyz,\n                      // Outputs\n                      vw::ba::ControlNetwork      & cnet,\n                      std::vector<double>         & tri_points_vec,\n                      std::vector<double>         & weight_per_residual, // append\n                      ceres::Problem              & problem);\n\n// Add hard camera constraints. Be generous with the uncertainty. \nvoid addHardCamPositionConstraint(asp::BaBaseOptions               const& opt,\n                                  std::set<int>                    const& outliers,\n                                  asp::CRN                        const& crn,\n                                  std::vector<asp::CsmModel*>      const& csm_models,\n                                  std::vector<std::vector<double>> const& count_per_cam,\n                                  double                                  anchor_weight,\n                                  bool                                    have_rig,\n                                  rig::RigSet                      const& rig,\n                                  std::vector<asp::RigCamInfo>     const& rig_cam_info,\n                                  // Outputs\n                                  std::vector<double>                & frame_params,\n                                  std::vector<double>                & weight_per_residual,\n                                  ceres::Problem                     & problem);\n\n// Add soft camera constraints that are proportional to the number of reprojection errors.\n// This requires going through some of the same motions as in addReprojCamErrs().\n// This was not fully understood. Use instead addHardCamPositionConstraint().\nvoid addSoftCamPositionConstraint(asp::BaBaseOptions           const& opt,\n                              std::set<int>                    const& outliers,\n                              asp::CRN                        const& crn,\n                              std::vector<asp::CsmModel*>      const& csm_models,\n                              std::vector<std::vector<double>> const& weight_per_cam,\n                              std::vector<std::vector<double>> const& count_per_cam,\n                              bool                                    have_rig,\n                              rig::RigSet                      const& rig,\n                              std::vector<asp::RigCamInfo>     const& rig_cam_info,\n                              // Outputs\n                              std::vector<double>                & frame_params,\n                              std::vector<double>                & weight_per_residual,\n                              ceres::Problem                     & problem);\n\nvoid addQuatNormRotationConstraints(\n                        asp::BaBaseOptions          const& opt,\n                        std::set<int>               const& outliers,\n                        asp::CRN                   const& crn,\n                        std::vector<asp::CsmModel*> const& csm_models,\n                        bool                               have_rig,\n                        rig::RigSet                 const& rig,\n                        std::vector<RigCamInfo>     const& rig_cam_info,\n                        double                             quat_norm_weight,\n                        // Outputs\n                        std::vector<double>              & frame_params,\n                        std::vector<double>              & weight_per_residual,\n                        ceres::Problem                   & problem);\n\n// Option --reference-terrain \ntypedef boost::shared_ptr<vw::DiskImageView<vw::PixelMask<vw::Vector2f>>> DispPtr;\nvoid addRefTerrainCostFun(asp::BaBaseOptions            const& opt,\n                                     std::vector<asp::CsmModel*>   const& csm_models,\n                                     std::vector<int>              const& left_indices,\n                                     std::vector<int>              const& right_indices,\n                                     std::vector<vw::TransformPtr> const& left_trans,\n                                     std::vector<vw::TransformPtr> const& right_trans,\n                                     std::vector<std::string>      const& disp_files,\n                                     // Outputs\n                                     ceres::Problem                 & problem,\n                                     std::vector<DispPtr>           & disp_vec,\n                                     vw::ImageView<float>           & mapproj_dem,\n                                     std::vector<double>            & weight_per_residual,\n                                     std::vector<vw::Vector3>       & reference_vec,\n                                     std::vector<std::vector<int>>  & ref_indices);\n\n// Add roll / yaw constraints. For linescan, use the whole set of samples for given\n// camera model. For frame cameras, use the trajectory of all cameras in the same orbital\n// group as the current camera.\nvoid addRollYawConstraint(asp::BaBaseOptions              const& opt,\n                          asp::CRN                       const& crn,\n                          std::vector<asp::CsmModel*>     const& csm_models,\n                          vw::cartography::GeoReference   const& georef,\n                          std::map<int, int>              const& cam2group,\n                          bool initial_camera_constraint,\n                          double roll_weight, double yaw_weight,\n                          // Outputs (append to residual)\n                          std::vector<double>                  & frame_params,\n                          std::vector<double>                  & weight_per_residual,\n                          ceres::Problem                       & problem);\n\n// Add a constraint that the curvature of the sequence of poses does not become\n// a lot more than the initial one.\nvoid addSmoothnessConstraint(asp::BaBaseOptions               const& opt,\n                             std::vector<asp::CsmModel*>      const& csm_models,\n                             double                                  smoothness_weight,\n                             bool                                    have_rig,\n                             rig::RigSet                      const& rig,\n                             std::vector<asp::RigCamInfo>     const& rig_cam_info,\n                             // Outputs\n                             std::vector<double>                & weight_per_residual,\n                             std::vector<std::vector<double>>   & orig_curvatures,\n                             ceres::Problem                     & problem);\n\n} // end namespace asp\n\n#endif //__ASP_CAMERA_JITTER_SOLVE_COST_FUNS_H__\n"
  },
  {
    "path": "src/asp/Camera/JitterSolveRigCostFuns.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Cost functions used in solving for jitter. These need access to the camera models,\n// so they are stored in the Camera folder.\n\n#include <asp/Camera/BundleAdjustCamera.h>\n#include <asp/Core/CameraTransforms.h>\n#include <asp/Core/CamPoseUtils.h>\n#include <asp/Core/BundleAdjustUtils.h>\n#include <asp/Rig/TransformUtils.h>\n#include <asp/Rig/RigConfig.h>\n#include <asp/Rig/RigCostFunction.h>\n#include <asp/Core/EigenTransformUtils.h>\n#include <asp/Camera/JitterSolveCostFuns.h>\n#include <asp/Camera/JitterSolveRigCostFuns.h>\n#include <asp/Rig/BasicAlgs.h>\n\n#include <vw/Cartography/GeoReferenceBaseUtils.h>\n#include <vw/Cartography/GeoReferenceUtils.h>\n#include <vw/Core/Exception.h>\n#include <vw/Camera/CameraImage.h>\n\nnamespace asp {\n\n// An error function minimizing the error of projecting an xyz point into a\n// given CSM frame camera pixel that is on a rig with a linescan camera ref\n// sensor. The variables of optimization are a portion of the position and\n// quaternion variables affected by this, the triangulation point, and the\n// transform from the ref linescan sensor to the current linescan/frame sensor.\nstruct RigLsPixelReprojErr {\n  RigLsPixelReprojErr(vw::Vector2 const& curr_pix, double weight,\n                      asp::RigCamInfo const& rig_cam_info,\n                      UsgsAstroLsSensorModel* ref_ls_model,\n                      UsgsAstroFrameSensorModel * curr_frame_model,\n                      UsgsAstroLsSensorModel * curr_ls_model,\n                      int begRefQuatIndex, int endRefQuatIndex, \n                      int begRefPosIndex, int endRefPosIndex,\n                      int begCurrQuatIndex, int endCurrQuatIndex,\n                      int begCurrPosIndex, int endCurrPosIndex):\n    m_curr_pix(curr_pix), m_weight(weight),\n    m_rig_cam_info(rig_cam_info),\n    m_begRefQuatIndex(begRefQuatIndex), m_endRefQuatIndex(endRefQuatIndex),\n    m_begRefPosIndex(begRefPosIndex),   m_endRefPosIndex(endRefPosIndex),\n    m_begCurrQuatIndex(begCurrQuatIndex), m_endCurrQuatIndex(endCurrQuatIndex),\n    m_begCurrPosIndex(begCurrPosIndex),   m_endCurrPosIndex(endCurrPosIndex),\n    m_ref_ls_model(ref_ls_model), m_curr_frame_model(curr_frame_model),\n    m_curr_ls_model(curr_ls_model) {}\n\n  // The implementation is further down\n  bool operator()(double const * const * parameters, double * residuals) const; \n\n  // Factory to hide the construction of the CostFunction object from the client code.\n  static ceres::CostFunction* Create(vw::Vector2 const& curr_pix, double weight,\n                                     asp::RigCamInfo const& rig_cam_info,\n                                     UsgsAstroLsSensorModel* ref_ls_model,\n                                     UsgsAstroFrameSensorModel* curr_frame_model,\n                                     UsgsAstroLsSensorModel* curr_ls_model,\n                                     int begRefQuatIndex, int endRefQuatIndex,\n                                     int begRefPosIndex, int endRefPosIndex,\n                                     int begCurrQuatIndex, int endCurrQuatIndex,\n                                     int begCurrPosIndex, int endCurrPosIndex) {\n\n    // TODO(oalexan1): Try using here the analytical cost function\n    ceres::DynamicNumericDiffCostFunction<RigLsPixelReprojErr>* cost_function =\n      new ceres::DynamicNumericDiffCostFunction<RigLsPixelReprojErr>\n      (new RigLsPixelReprojErr(curr_pix, weight, rig_cam_info, ref_ls_model,\n                               curr_frame_model, curr_ls_model,\n                               begRefQuatIndex, endRefQuatIndex,\n                               begRefPosIndex, endRefPosIndex,\n                               begCurrQuatIndex, endCurrQuatIndex,\n                               begCurrPosIndex, endCurrPosIndex));\n\n    // The residual size is always the same.\n    cost_function->SetNumResiduals(PIXEL_SIZE);\n\n    // Add a parameter block for each quaternion and each position\n    for (int it = begRefQuatIndex; it < endRefQuatIndex; it++)\n      cost_function->AddParameterBlock(NUM_QUAT_PARAMS);\n    for (int it = begRefPosIndex; it < endRefPosIndex; it++)\n      cost_function->AddParameterBlock(NUM_XYZ_PARAMS);\n\n    // Add a parameter block for the xyz point\n    cost_function->AddParameterBlock(NUM_XYZ_PARAMS);\n    \n    // Add a parameter block for the ref to curr sensor rig transform\n    cost_function->AddParameterBlock(rig::NUM_RIGID_PARAMS);\n    \n    return cost_function;\n  }\n\nprivate:\n  vw::Vector2 m_curr_pix; // The pixel on the current camera (rather than ref camera)\n  double m_weight;\n  asp::RigCamInfo m_rig_cam_info;\n  UsgsAstroLsSensorModel* m_ref_ls_model;\n  UsgsAstroFrameSensorModel* m_curr_frame_model;\n  UsgsAstroLsSensorModel* m_curr_ls_model;\n  int m_begRefQuatIndex, m_endRefQuatIndex;\n  int m_begRefPosIndex, m_endRefPosIndex;\n  int m_begCurrQuatIndex, m_endCurrQuatIndex;\n  int m_begCurrPosIndex, m_endCurrPosIndex;\n  \n}; // End class RigLsPixelReprojErr\n\n// The implementation of operator() for RigLsPixelReprojErr\nbool RigLsPixelReprojErr::operator()(double const * const * parameters, \n                                     double * residuals) const {\n\n  try {\n    \n    // Make a copy of the model, as we will update quaternion and position\n    // values that are being modified now. This may be expensive.\n    // Update the shift too.\n    UsgsAstroLsSensorModel ref_ls_cam = *m_ref_ls_model;\n    int shift = 0;\n    csm::EcefCoord P;\n    updateLsModelTriPt(parameters, m_begRefQuatIndex, m_endRefQuatIndex,\n                       m_begRefPosIndex, m_endRefPosIndex, shift, ref_ls_cam, P);\n    \n    // Move forward in the array of parameters, then recover the ref to curr transform\n    shift += 1;\n    double const* ref_to_curr_trans = parameters[shift];\n    \n    std::vector<double> cam2world_vec(rig::NUM_RIGID_PARAMS);\n    \n    // Project in the camera with high precision. Do not use here anything lower\n    // than 1e-8, as the CSM model can return junk. Convert to ASP pixel.\n    double desired_precision = asp::DEFAULT_CSM_DESIRED_PRECISION;\n    csm::ImageCoord imagePt;\n    if (m_curr_frame_model != NULL) {\n      // Current camera to world transform based on the ref cam and the rig\n      asp::linescanToCurrSensorTrans(ref_ls_cam, m_rig_cam_info.beg_pose_time, \n                                     ref_to_curr_trans,\n                                     &cam2world_vec[0]); // output\n    \n      // Make a copy of the frame camera and set the latest position and orientation\n      UsgsAstroFrameSensorModel curr_frame_cam = *m_curr_frame_model;\n      for (int coord = 0; coord < NUM_XYZ_PARAMS + NUM_QUAT_PARAMS; coord++)\n        curr_frame_cam.setParameterValue(coord, cam2world_vec[coord]);\n      \n      // Project the point into the frame camera\n      imagePt = curr_frame_cam.groundToImage(P, desired_precision);\n      \n    } else if (m_curr_ls_model != NULL) {\n      // Make a copy of the current linescan camera\n      UsgsAstroLsSensorModel curr_ls_cam = *m_curr_ls_model;\n\n      // Update the relevant quaternions in the local copy by interpolating\n      // in the ref camera model and applying the rig transform.\n      asp::updateLinescanWithRig(ref_ls_cam, ref_to_curr_trans, \n                                 curr_ls_cam, // update this\n                                 m_begCurrQuatIndex, m_endCurrQuatIndex,\n                                 m_begCurrPosIndex, m_endCurrPosIndex);\n\n      // Project the point into the frame camera\n      imagePt = curr_ls_cam.groundToImage(P, desired_precision);\n      \n    } else {\n      vw::vw_throw(vw::ArgumentErr() << \"Expecting either a frame or a linescan model.\\n\");\n    }\n    \n    vw::Vector2 pix;\n    asp::fromCsmPixel(pix, imagePt);\n    \n    // Compute the residuals  \n    residuals[0] = m_weight*(pix[0] - m_curr_pix[0]);\n    residuals[1] = m_weight*(pix[1] - m_curr_pix[1]);\n    \n  } catch (std::exception const& e) {\n    residuals[0] = g_big_pixel_value;\n    residuals[1] = g_big_pixel_value;\n    return true; // accept the solution anyway\n  }\n\n  return true;\n}\n\n// Reprojection error with ls ref sensor and frame curr sensor\nvoid addRigLsFrameReprojectionErr(asp::BaBaseOptions  const & opt,\n                                  asp::RigCamInfo     const & rig_cam_info,\n                                  vw::Vector2         const & curr_pix,\n                                  double                      weight,\n                                  UsgsAstroLsSensorModel    * ref_ls_model,\n                                  UsgsAstroFrameSensorModel * curr_frame_model,\n                                  double                    * ref_to_curr_trans,\n                                  double                    * tri_point,\n                                  bool                        fix_rig_translations,\n                                  bool                        fix_rig_rotations,\n                                  ceres::SubsetManifold     * constant_transform_manifold,\n                                  ceres::Problem            & problem) {\n\n  // The time when the frame camera pixel was observed\n  double frame_time = rig_cam_info.beg_pose_time;\n  if (frame_time != rig_cam_info.end_pose_time)\n   vw::vw_throw(vw::ArgumentErr() \n                << \"For a frame sensor beg and end pose time must be same.\\n\");\n  \n  // The solver needs to see beyond the current time as later the poses will\n  // change relative to the observations. Here using linescan pixels,\n  // not the frame pixel in the input.\n  double line_extra = opt.max_init_reproj_error + 5.0; // add some more just in case\n  csm::ImageCoord imagePt1, imagePt2;\n  asp::toCsmPixel(vw::Vector2(0.0, 0.0), imagePt1);\n  asp::toCsmPixel(vw::Vector2(0.0, line_extra), imagePt2);\n  double ans1 = ref_ls_model->getImageTime(imagePt1);\n  double ans2 = ref_ls_model->getImageTime(imagePt2);\n  double delta = std::abs(ans2 - ans1);\n  double time1 = frame_time - delta;\n  double time2 = frame_time + delta;\n\n  // Find the range of indices that can affect the current pixel\n  int numRefQuat   = ref_ls_model->m_quaternions.size() / NUM_QUAT_PARAMS;\n  double refQuatT0 = ref_ls_model->m_t0Quat;\n  double refQuatDt = ref_ls_model->m_dtQuat;\n  int begRefQuatIndex = -1, endRefQuatIndex = -1;\n  calcIndexBounds(time1, time2, refQuatT0, refQuatDt, numRefQuat, \n                  begRefQuatIndex, endRefQuatIndex); // outputs\n\n  // Same for positions\n  int numRefPos   = ref_ls_model->m_positions.size() / NUM_XYZ_PARAMS;\n  double refPosT0 = ref_ls_model->m_t0Ephem;\n  double refPosDt = ref_ls_model->m_dtEphem;\n  int begRefPosIndex = -1, endRefPosIndex = -1;\n  calcIndexBounds(time1, time2, refPosT0, refPosDt, numRefPos, \n                  begRefPosIndex, endRefPosIndex); // outputs\n  \n  // This should not be strictly necessary, but an investigation to validate\n  // this is not yet done. Expand, just in case.\n  begRefQuatIndex--; endRefQuatIndex++;\n  begRefPosIndex--; endRefPosIndex++;\n  // Keep in bounds\n  begRefQuatIndex = std::max(0, begRefQuatIndex);\n  begRefPosIndex = std::max(0, begRefPosIndex);\n  endRefQuatIndex = std::min(endRefQuatIndex, numRefQuat);\n  endRefPosIndex = std::min(endRefPosIndex, numRefPos);\n  \n  // Quantities not applicable here\n  UsgsAstroLsSensorModel * curr_ls_model = NULL; \n  int begCurrQuatIndex = -1, endCurrQuatIndex = -1;\n  int begCurrPosIndex = -1, endCurrPosIndex = -1;\n  \n  ceres::CostFunction* pixel_cost_function =\n    RigLsPixelReprojErr::Create(curr_pix, weight, rig_cam_info, ref_ls_model,\n                                curr_frame_model, curr_ls_model, \n                                begRefQuatIndex, endRefQuatIndex,\n                                begRefPosIndex, endRefPosIndex,\n                                begCurrQuatIndex, endCurrQuatIndex,\n                                begCurrPosIndex, endCurrPosIndex);\n  ceres::LossFunction* pixel_loss_function = new ceres::CauchyLoss(opt.robust_threshold);\n\n  // The variable of optimization are camera quaternions and positions stored in the\n  // camera models, the triangulated point, and the rig transform.\n  std::vector<double*> vars;\n  for (int it = begRefQuatIndex; it < endRefQuatIndex; it++)\n    vars.push_back(&ref_ls_model->m_quaternions[it * NUM_QUAT_PARAMS]);\n  for (int it = begRefPosIndex; it < endRefPosIndex; it++)\n    vars.push_back(&ref_ls_model->m_positions[it * NUM_XYZ_PARAMS]);\n  vars.push_back(tri_point);\n  vars.push_back(ref_to_curr_trans); // transform from ref to curr sensor on the rig\n  problem.AddResidualBlock(pixel_cost_function, pixel_loss_function, vars);\n  \n  if (fix_rig_translations || fix_rig_rotations) \n    problem.SetManifold(ref_to_curr_trans, constant_transform_manifold);\n}\n\n// Reprojection error with ref ls ref sensor and curr ls sensor\n// TODO(oalexan1): Find ways of integrating with the frame\nvoid addRigLsLsReprojectionErr(asp::BaBaseOptions  const & opt,\n                               asp::RigCamInfo     const & rig_cam_info,\n                               vw::Vector2         const & curr_pix,\n                               double                      weight,\n                               UsgsAstroLsSensorModel    * ref_ls_model,\n                               UsgsAstroLsSensorModel    * curr_ls_model,\n                               double                    * ref_to_curr_trans,\n                               double                    * tri_point,\n                               bool                        fix_rig_translations,\n                               bool                        fix_rig_rotations,\n                               ceres::SubsetManifold     * constant_transform_manifold,\n                               ceres::Problem            & problem) {\n\n  // Find the positions and orientations in the current linescan model\n  // that can affect the given pixel. Then, expand on this, as an even \n  // bigger range in the reference sensor will affect these.\n\n  double line_extra = opt.max_init_reproj_error + 5.0; // add some more just in case\n  csm::ImageCoord imagePt1, imagePt2;\n  asp::toCsmPixel(curr_pix - vw::Vector2(0.0, line_extra), imagePt1);\n  asp::toCsmPixel(curr_pix + vw::Vector2(0.0, line_extra), imagePt2);\n  double time1 = curr_ls_model->getImageTime(imagePt1);\n  double time2 = curr_ls_model->getImageTime(imagePt2);\n  \n  // Find the range of indices that can affect the current pixel\n  int numCurrQuat       = curr_ls_model->m_quaternions.size() / NUM_QUAT_PARAMS;\n  double currQuatT0     = curr_ls_model->m_t0Quat;\n  double currQuatDt     = curr_ls_model->m_dtQuat;\n  int begCurrQuatIndex = -1, endCurrQuatIndex = -1;\n  calcIndexBounds(time1, time2, currQuatT0, currQuatDt, numCurrQuat, \n                  begCurrQuatIndex, endCurrQuatIndex); // outputs\n\n  // Same for positions\n  int numCurrPos       = curr_ls_model->m_positions.size() / NUM_XYZ_PARAMS;\n  double currPosT0     = curr_ls_model->m_t0Ephem;\n  double currPosDt     = curr_ls_model->m_dtEphem;\n  int begCurrPosIndex = -1, endCurrPosIndex = -1;\n  calcIndexBounds(time1, time2, currPosT0, currPosDt, numCurrPos, \n                  begCurrPosIndex, endCurrPosIndex); // outputs\n\n  // This should not be strictly necessary, but an investigation to validate\n  // this is not yet done. Expand, just in case.\n  begCurrQuatIndex--; endCurrQuatIndex++;\n  begCurrPosIndex--; endCurrPosIndex++;\n  // Keep in bounds\n  begCurrQuatIndex = std::max(0, begCurrQuatIndex);\n  begCurrPosIndex = std::max(0, begCurrPosIndex);\n  endCurrQuatIndex = std::min(endCurrQuatIndex, numCurrQuat);\n  endCurrPosIndex = std::min(endCurrPosIndex, numCurrPos);\n \n  // Expand these to see the effect of the reference sensor\n  time1 = std::min(currQuatT0 + begCurrQuatIndex * currQuatDt, \n                   currPosT0 + begCurrPosIndex * currPosDt);\n  time2 = std::max(currQuatT0 + endCurrQuatIndex * currQuatDt, \n                   currPosT0 + endCurrPosIndex * currPosDt);\n  \n  // Ref quaternions\n  int numRefQuat   = ref_ls_model->m_quaternions.size() / NUM_QUAT_PARAMS;\n  double refQuatT0 = ref_ls_model->m_t0Quat;\n  double refQuatDt = ref_ls_model->m_dtQuat;\n  int begRefQuatIndex = -1, endRefQuatIndex = -1;\n  calcIndexBounds(time1, time2, refQuatT0, refQuatDt, numRefQuat, \n                  begRefQuatIndex, endRefQuatIndex); // outputs\n  \n  // Ref positions\n  int numRefPos   = ref_ls_model->m_positions.size() / NUM_XYZ_PARAMS;\n  double refPosT0 = ref_ls_model->m_t0Ephem;\n  double refPosDt = ref_ls_model->m_dtEphem;\n  int begRefPosIndex = -1, endRefPosIndex = -1;\n  calcIndexBounds(time1, time2, refPosT0, refPosDt, numRefPos, \n                  begRefPosIndex, endRefPosIndex); // outputs\n  \n  // Quantities not applicable here\n  UsgsAstroFrameSensorModel * curr_frame_model = NULL; \n  \n  ceres::CostFunction* pixel_cost_function =\n    RigLsPixelReprojErr::Create(curr_pix, weight, rig_cam_info, ref_ls_model,\n                                curr_frame_model, curr_ls_model, \n                                begRefQuatIndex, endRefQuatIndex,\n                                begRefPosIndex, endRefPosIndex,\n                                begCurrQuatIndex, endCurrQuatIndex,\n                                begCurrPosIndex, endCurrPosIndex);\n  ceres::LossFunction* pixel_loss_function = new ceres::CauchyLoss(opt.robust_threshold);\n\n  // The variable of optimization are camera quaternions and positions stored in the\n  // camera models, the triangulated point, and the rig transform.\n  std::vector<double*> vars;\n  for (int it = begRefQuatIndex; it < endRefQuatIndex; it++)\n    vars.push_back(&ref_ls_model->m_quaternions[it * NUM_QUAT_PARAMS]);\n  for (int it = begRefPosIndex; it < endRefPosIndex; it++)\n    vars.push_back(&ref_ls_model->m_positions[it * NUM_XYZ_PARAMS]);\n  vars.push_back(tri_point);\n  vars.push_back(ref_to_curr_trans); // transform from ref to curr sensor on the rig\n  problem.AddResidualBlock(pixel_cost_function, pixel_loss_function, vars);\n  \n  if (fix_rig_translations || fix_rig_rotations) \n    problem.SetManifold(ref_to_curr_trans, constant_transform_manifold);\n}\n\n// An error function minimizing the error of projecting an xyz point into a\n// given CSM frame camera pixel that is on a rig with a frame camera ref\n// sensor. The variables of optimization are the ref cam bracketing \n// positions and orientations, the triangulation point, and the\n// transform from the ref frame sensor to the current frame sensor.\nstruct RigFramePixelReprojErr {\n  RigFramePixelReprojErr(vw::Vector2 const& curr_pix, double weight,\n                           asp::RigCamInfo const& rig_cam_info,\n                           UsgsAstroFrameSensorModel * curr_frame_model,\n                           double beg_ref_time, double end_ref_time):\n    m_curr_pix(curr_pix), m_weight(weight),\n    m_rig_cam_info(rig_cam_info),\n    m_curr_frame_model(curr_frame_model),\n    m_beg_ref_time(beg_ref_time), m_end_ref_time(end_ref_time) {}\n\n  // The implementation is further down\n  bool operator()(double const * const * parameters, double * residuals) const; \n\n  // Factory to hide the construction of the CostFunction object from the client code.\n  static ceres::CostFunction* Create(vw::Vector2 const& curr_pix, double weight,\n                                     asp::RigCamInfo const& rig_cam_info,\n                                     UsgsAstroFrameSensorModel* curr_frame_model,\n                                     double beg_ref_time, double end_ref_time) {\n\n    // TODO(oalexan1): Try using here the analytical cost function\n    ceres::DynamicNumericDiffCostFunction<RigFramePixelReprojErr>* cost_function =\n      new ceres::DynamicNumericDiffCostFunction<RigFramePixelReprojErr>\n      (new RigFramePixelReprojErr(curr_pix, weight, rig_cam_info, \n                                  curr_frame_model, beg_ref_time, end_ref_time));\n\n    // Add a parameter block for beg and end positions\n    cost_function->AddParameterBlock(NUM_XYZ_PARAMS);\n    cost_function->AddParameterBlock(NUM_XYZ_PARAMS);\n    \n    // Add a parameter block for beg and end quaternions\n    cost_function->AddParameterBlock(NUM_QUAT_PARAMS);\n    cost_function->AddParameterBlock(NUM_QUAT_PARAMS);\n        \n    // Add a parameter block for the ref to curr sensor rig transform\n    cost_function->AddParameterBlock(rig::NUM_RIGID_PARAMS);\n    \n    // Add a parameter block for the xyz point\n    cost_function->AddParameterBlock(NUM_XYZ_PARAMS);\n\n    // The residual size the pixel size\n    cost_function->SetNumResiduals(PIXEL_SIZE);\n    \n    return cost_function;\n  }\n\nprivate:\n  vw::Vector2 m_curr_pix; // The pixel on the current camera (rather than ref camera)\n  double m_weight;\n  asp::RigCamInfo m_rig_cam_info;\n  UsgsAstroFrameSensorModel* m_curr_frame_model;\n  double m_beg_ref_time, m_end_ref_time;\n}; // End class RigFramePixelReprojErr\n\n// The implementation of operator() for RigFramePixelReprojErr\nbool RigFramePixelReprojErr::operator()(double const * const * parameters, \n                                        double * residuals) const {\n\n  try {\n\n    double const* beg_frame_xyz_arr  = parameters[0];\n    double const* end_frame_xyz_arr  = parameters[1];\n    double const* beg_frame_quat_arr = parameters[2];\n    double const* end_frame_quat_arr = parameters[3];\n    double const* ref_to_curr_trans  = parameters[4];\n    double const* tri_point          = parameters[5];\n\n    double frame_time = m_rig_cam_info.beg_pose_time;\n\n    // Must concatenate the position and orientation arrays\n    double beg_frame_arr[rig::NUM_RIGID_PARAMS];\n    double end_frame_arr[rig::NUM_RIGID_PARAMS];\n    for (int i = 0; i < NUM_XYZ_PARAMS; i++) {\n      beg_frame_arr[i] = beg_frame_xyz_arr[i];\n      end_frame_arr[i] = end_frame_xyz_arr[i];\n    }\n    for (int i = 0; i < NUM_QUAT_PARAMS; i++) {\n      beg_frame_arr[NUM_XYZ_PARAMS + i] = beg_frame_quat_arr[i];\n      end_frame_arr[NUM_XYZ_PARAMS + i] = end_frame_quat_arr[i];\n    }\n    \n    // Find the interpolated current cam2world transform\n    double cam2world_arr[rig::NUM_RIGID_PARAMS];\n    asp::interpCurrPose(m_beg_ref_time, m_end_ref_time, frame_time, \n                        beg_frame_arr, end_frame_arr, ref_to_curr_trans,\n                        cam2world_arr);\n    \n    // Make a copy of the model, and set the latest position and orientation. \n    UsgsAstroFrameSensorModel curr_frame_cam = *m_curr_frame_model;\n    for (int coord = 0; coord < rig::NUM_RIGID_PARAMS; coord++)\n      curr_frame_cam.setParameterValue(coord, cam2world_arr[coord]);\n\n    // Convert the 3D point to a CSM object\n    csm::EcefCoord P;\n    P.x = tri_point[0];\n    P.y = tri_point[1];\n    P.z = tri_point[2];\n      \n    // Project in the camera with high precision. Do not use here anything lower\n    // than 1e-8, as the CSM model can return junk.\n    double desired_precision = asp::DEFAULT_CSM_DESIRED_PRECISION;\n    csm::ImageCoord imagePt = curr_frame_cam.groundToImage(P, desired_precision);\n   \n    // Convert to ASP pixel\n    vw::Vector2 pix;\n    asp::fromCsmPixel(pix, imagePt);\n    \n    // Compute the residuals  \n    residuals[0] = m_weight*(pix[0] - m_curr_pix[0]);\n    residuals[1] = m_weight*(pix[1] - m_curr_pix[1]);\n    \n  } catch (std::exception const& e) {\n    residuals[0] = g_big_pixel_value;\n    residuals[1] = g_big_pixel_value;\n    return true; // accept the solution anyway\n  }\n\n  return true;\n}\n\n// Reprojection error with ls ref sensor and frame curr sensor\nvoid addRigFrameFrameReprojectionErr(asp::BaBaseOptions  const & opt,\n                                     asp::RigCamInfo     const & rig_cam_info,\n                                     std::vector<asp::CsmModel*> const& csm_models,\n                                     std::map<int, int>  const & cam2group,\n                                     TimestampMap        const & timestamp_map,\n                                     vw::Vector2         const & curr_pix,\n                                     double                      weight,\n                                     UsgsAstroFrameSensorModel * curr_frame_model,\n                                     std::vector<double>       & frame_params,\n                                     double                    * ref_to_curr_trans,\n                                     double                    * tri_point,\n                                     bool                        fix_rig_translations,\n                                     bool                        fix_rig_rotations,\n                                     ceres::SubsetManifold     * constant_transform_manifold,\n                                     ceres::Problem            & problem) {\n\n  double beg_ref_time = 0.0, end_ref_time = 0.0;\n  int beg_ref_index = 0, end_ref_index = 0;\n  bool success = timestampBrackets(rig_cam_info, cam2group, timestamp_map, \n                                   // Outputs\n                                   beg_ref_time, end_ref_time, \n                                   beg_ref_index, end_ref_index);\n  \n  if (!success) \n    return;\n\n  double * beg_frame_arr = &frame_params[beg_ref_index * (NUM_XYZ_PARAMS + NUM_QUAT_PARAMS)];\n  double * end_frame_arr = &frame_params[end_ref_index * (NUM_XYZ_PARAMS + NUM_QUAT_PARAMS)];\n\n  ceres::CostFunction* pixel_cost_function =\n    RigFramePixelReprojErr::Create(curr_pix, weight, rig_cam_info, curr_frame_model, \n                                   beg_ref_time, end_ref_time);\n  ceres::LossFunction* pixel_loss_function = new ceres::CauchyLoss(opt.robust_threshold);\n\n  // The variable of optimization are bracketing ref camera poses, stored\n  // separately as position and orientation, the rig transform, and the\n  // triangulated point.\n  std::vector<double*> vars;\n  vars.push_back(&beg_frame_arr[0]);\n  vars.push_back(&end_frame_arr[0]);\n  vars.push_back(&beg_frame_arr[NUM_XYZ_PARAMS]);\n  vars.push_back(&end_frame_arr[NUM_XYZ_PARAMS]);\n  vars.push_back(ref_to_curr_trans);\n  vars.push_back(tri_point);\n  problem.AddResidualBlock(pixel_cost_function, pixel_loss_function, vars);\n  \n  if (fix_rig_translations || fix_rig_rotations) \n    problem.SetManifold(ref_to_curr_trans, constant_transform_manifold);\n}\n\n// Add the ls or frame camera model reprojection error to the cost function\nvoid addRigLsOrFrameReprojectionErr(asp::BaBaseOptions  const & opt,\n                                    int                         icam,\n                                    UsgsAstroLsSensorModel    * ref_ls_model,\n                                    UsgsAstroFrameSensorModel * ref_frame_model,\n                                    UsgsAstroLsSensorModel    * ls_model,\n                                    UsgsAstroFrameSensorModel * frame_model,\n                                    std::vector<double>       & frame_params,\n                                    std::vector<asp::CsmModel*> const& csm_models,\n                                    std::map<int, int>          const& cam2group,\n                                    TimestampMap                const & timestamp_map,\n                                    vw::Vector2                 const & pix_obs,\n                                    double                      pix_wt,\n                                    double                    * tri_point,\n                                    double                    * ref_to_curr_sensor_trans, \n                                    asp::RigCamInfo     const & rig_info,\n                                    bool                        fix_rig_translations,\n                                    bool                        fix_rig_rotations,\n                                    ceres::Problem            & problem) {\n\n  // Prepare for the case of fixed rig translations and/or rotations    \n  ceres::SubsetManifold* constant_transform_manifold = nullptr;\n  bool no_rig = false;\n  rig::setUpFixRigOptions(no_rig, fix_rig_translations, \n                          fix_rig_rotations,\n                          constant_transform_manifold);\n\n  if (ref_ls_model != NULL) {\n    \n    // Sanity check: the current pixel time must be in bounds\n    double curr_time = -1.0;\n    if (frame_model != NULL) {\n      curr_time = rig_info.beg_pose_time;\n    } else if (ls_model != NULL) {\n      csm::ImageCoord imagePt;\n      asp::toCsmPixel(pix_obs, imagePt);\n      curr_time = ls_model->getImageTime(imagePt);\n    }\n    double beg_ref_time = -1.0, end_ref_time = -1.0;\n    asp::linescanTimeBounds(ref_ls_model, beg_ref_time, end_ref_time);\n    if (curr_time < beg_ref_time || curr_time > end_ref_time)\n      vw::vw_throw(vw::ArgumentErr() \n                  << std::setprecision(17)\n                  << \"Time \" << curr_time\n                  << \" is outside the time range of the reference sensor, which is: \"\n                  << beg_ref_time << ' ' << end_ref_time << \".\\n\"\n                  << \"This may also be due to mixup of image and camera order, or because of \"\n                  << \"anchor points far out of range. Offending pixel: \" \n                  << pix_obs << \".\\n\");\n  \n    // Ref sensor is linescan\n    if (frame_model != NULL)\n      addRigLsFrameReprojectionErr(opt, rig_info, pix_obs, pix_wt, ref_ls_model, \n                  frame_model, ref_to_curr_sensor_trans, tri_point, \n                  fix_rig_translations, fix_rig_rotations, \n                  constant_transform_manifold,\n                  problem);\n    else if (ls_model != NULL)\n      addRigLsLsReprojectionErr(opt, rig_info, pix_obs, pix_wt, ref_ls_model, \n                  ls_model, ref_to_curr_sensor_trans, tri_point, \n                  fix_rig_translations, fix_rig_rotations,\n                  constant_transform_manifold,\n                  problem);\n    else \n      vw::vw_throw(vw::ArgumentErr() << \"Unknown camera model.\\n\");\n  \n  } else if (ref_frame_model != NULL) {\n\n    // The check for time being in bounds will be done when attempting to interpolate\n    \n    if (frame_model != NULL)\n      addRigFrameFrameReprojectionErr(opt, rig_info, \n                                      csm_models, cam2group, timestamp_map, \n                                      pix_obs, pix_wt, \n                                      frame_model, frame_params,\n                                      ref_to_curr_sensor_trans, tri_point, \n                                      fix_rig_translations, fix_rig_rotations,\n                                      constant_transform_manifold,\n                                      problem);\n    else if (ls_model != NULL)\n      vw::vw_throw(vw::ArgumentErr() << \"When the reference sensor is frame, \"\n                   << \"the other sensors must also be frame.\\n\");\n    else \n      vw::vw_throw(vw::ArgumentErr() << \"Unknown camera model.\\n\");\n       \n  } else {\n    vw::vw_throw(vw::ArgumentErr() << \"Unknown camera model.\\n\");\n  }  \n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Camera/JitterSolveRigCostFuns.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file JitterSolveCostFuns.h\n\n// Cost functions used in solving for jitter. These need access to the camera\n// models, so they are stored in the Camera folder. The bigger functions defined\n// here are implemented in the .cc file.\n\n#ifndef __ASP_CAMERA_JITTER_SOLVE_RIG_COST_FUNS_H__\n#define __ASP_CAMERA_JITTER_SOLVE_RIG_COST_FUNS_H__\n\n#include <ceres/ceres.h>\n#include <ceres/loss_function.h>\n\n#include <string>\n#include <map>\n#include <vector>\n\nclass UsgsAstroLsSensorModel;\nclass UsgsAstroFrameSensorModel;\n\nnamespace asp {\n\nstruct BaBaseOptions;\n\n// Add the ls or frame camera model reprojection error to the cost function\nvoid addRigLsOrFrameReprojectionErr(asp::BaBaseOptions  const & opt,\n                                    int                         icam,\n                                    UsgsAstroLsSensorModel    * ref_ls_model,\n                                    UsgsAstroFrameSensorModel * ref_frame_model,\n                                    UsgsAstroLsSensorModel    * ls_model,\n                                    UsgsAstroFrameSensorModel * frame_model,\n                                    std::vector<double>       & frame_params,\n                                    std::vector<asp::CsmModel*> const& csm_models,\n                                    std::map<int, int>  const & cam2group,\n                                    TimestampMap        const & timestamp_map,\n                                    vw::Vector2         const & pix_obs,\n                                    double                      pix_wt,\n                                    double                    * tri_point,\n                                    double                    * ref_to_curr_sensor_trans, \n                                    asp::RigCamInfo     const & rig_info,\n                                    bool                       fix_rig_translations,\n                                    bool                       fix_rig_rotations,\n                                    ceres::Problem            & problem);\n\n} // end namespace asp\n\n#endif //__ASP_CAMERA_JITTER_SOLVE_RIG_COST_FUNS_H__\n"
  },
  {
    "path": "src/asp/Camera/JitterSolveRigUtils.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Functions invoked in jitter_solve.cc that use a rig.\n\n#include <asp/Rig/RigConfig.h>\n#include <asp/Rig/TransformUtils.h>\n#include <asp/Rig/BasicAlgs.h>\n#include <asp/Rig/ImageLookup.h>\n#include <asp/Rig/RigIo.h>\n#include <asp/Rig/RigParseUtils.h>\n#include <asp/Camera/CsmUtils.h>\n#include <asp/Camera/JitterSolveRigUtils.h>\n#include <asp/Core/BundleAdjustUtils.h>\n#include <asp/Core/EigenTransformUtils.h>\n\n#include <vw/Core/Log.h>\n#include <vw/Math/Functors.h>\n\n#include <usgscsm/UsgsAstroLsSensorModel.h>\n#include <usgscsm/UsgsAstroFrameSensorModel.h>\n\nnamespace asp {\n\n// Constructor for class RigCamInfo. Initialize all fields to NaN to ensure full\n// initialization later. That is important, because initialization happens over\n// many stages and we want to catch any errors.\nRigCamInfo::RigCamInfo() {\n  double nan     = std::numeric_limits<double>::quiet_NaN();\n  sensor_id      = nan;\n  sensor_type    = RIG_LINESCAN_SENSOR;\n  mid_group_time = nan;\n  beg_pose_time  = nan;\n  end_pose_time  = nan;\n  cam_index      = nan;\n  ref_cam_index  = nan;\n}\n\n// Find the time bounds for a linescan sensor\nvoid linescanTimeBounds(UsgsAstroLsSensorModel const* ls_model, \n                        // Outputs\n                        double & beg_time, double & end_time) {\n\n  int numPos           = ls_model->m_positions.size() / NUM_XYZ_PARAMS;\n  double beg_pos_time  = ls_model->m_t0Ephem;\n  double pos_dt        = ls_model->m_dtEphem;\n  double end_pos_time  = beg_pos_time + (numPos - 1) * pos_dt;\n  int numQuat          = ls_model->m_quaternions.size() / NUM_QUAT_PARAMS;\n  double beg_quat_time = ls_model->m_t0Quat;\n  double quat_dt       = ls_model->m_dtQuat;\n  double end_quat_time = beg_quat_time + (numQuat - 1) * quat_dt;\n  \n  beg_time      = std::max(beg_pos_time, beg_quat_time);\n  end_time      = std::min(end_pos_time, end_quat_time);\n}\n\n// First pass at collecting info about relationships between cameras and the rig\nvoid populateInitRigCamInfo(rig::RigSet const& rig,\n                        std::vector<std::string> const& image_files,\n                        std::vector<std::string> const& camera_files,\n                        std::vector<asp::CsmModel*> const& csm_models,\n                        // Outputs\n                        std::vector<RigCamInfo> & rig_cam_info) {\n\n  int num_images = csm_models.size();\n  rig_cam_info.resize(num_images);\n\n  // Sanity check\n  if (num_images != (int)image_files.size() || num_images != (int)camera_files.size())\n    vw::vw_throw(vw::ArgumentErr() \n             << \"Expecting the number of cameras to match the number of images.\\n\");\n    \n  for (int i = 0; i < num_images; i++)  {\n\n    auto & rig_info = rig_cam_info[i]; // alias\n    \n    // Each camera must know where it belongs, and other info\n    rig_info.cam_index = i;\n    rig_info.image_file = image_files[i];\n    rig_info.camera_file = camera_files[i];\n    \n    // Get the underlying linescan model or frame model\n    asp::CsmModel * csm_cam = csm_models[i];\n    UsgsAstroLsSensorModel * ls_model\n      = dynamic_cast<UsgsAstroLsSensorModel*>((csm_cam->m_gm_model).get());\n    UsgsAstroFrameSensorModel * frame_model\n      = dynamic_cast<UsgsAstroFrameSensorModel*>((csm_cam->m_gm_model).get());\n    \n    int sensor_id = -1;\n    std::string group; \n    if (frame_model != NULL) {\n      \n      double timestamp = -1.0; \n      rig::findCamTypeAndTimestamp(camera_files[i], rig.cam_names,\n                                   sensor_id, timestamp, group); // outputs\n      rig_info.sensor_type = RIG_FRAME_SENSOR;\n      rig_info.sensor_id = sensor_id;\n      rig_info.rig_group = group;\n      \n      // The mid_group_time will be the mid time for the frame group, to be filled later.\n      rig_info.beg_pose_time = timestamp;\n      rig_info.end_pose_time = timestamp;\n      \n      // Image files must have the same convention as camera files.\n      rig::findCamTypeAndTimestamp(image_files[i], rig.cam_names,\n                                   sensor_id, timestamp, group); // outputs\n      if (sensor_id != rig_info.sensor_id     || \n          timestamp != rig_info.beg_pose_time ||\n          group     != rig_info.rig_group)\n        vw::vw_throw(vw::ArgumentErr() \n                     << \"Mismatch between image and camera name. \"\n                     << \"Image: \" << image_files[i] << \", camera: \" << camera_files[i] \n                     << \"\\n\");\n      \n    } else if (ls_model != NULL) {\n\n      rig::findCamTypeAndGroup(camera_files[i], rig.cam_names,\n                               sensor_id, group); // outputs\n\n      // Each pose has a timestamp. The mid group time is a compromise between \n      // the timestamps of the poses in each group.\n      int numLines = ls_model->m_nLines;\n      csm::ImageCoord imagePt;\n      asp::toCsmPixel(vw::Vector2(0, numLines/2.0), imagePt);\n      rig_info.sensor_type = RIG_LINESCAN_SENSOR;\n      rig_info.sensor_id = sensor_id;\n      rig_info.rig_group = group;\n      rig_info.mid_group_time = ls_model->getImageTime(imagePt);\n\n      // Find the time bounds for the linescan sensor\n      linescanTimeBounds(ls_model, rig_info.beg_pose_time, rig_info.end_pose_time);\n      \n      // Image files must have the same convention as camera files.\n      rig::findCamTypeAndGroup(image_files[i], rig.cam_names, \n                               sensor_id, group); // outputs\n      if (sensor_id != rig_info.sensor_id ||\n          group     != rig_info.rig_group)\n        vw::vw_throw(vw::ArgumentErr() \n                     << \"Mismatch between image and camera name. \"\n                     << \"Image: \" << image_files[i] << \", camera: \" << camera_files[i] \n                     << \"\\n\");\n      \n    } else {\n      vw::vw_throw(vw::ArgumentErr() << \"Unknown camera model.\\n\");\n    }\n  }\n}    \n\n// For each group of frame cameras, find the map from each timestamp to the index\n// of the camera in the full array of cameras.\nvoid populateTimestampMap(std::map<int, int> const& cam2group,\n                          std::vector<RigCamInfo> const& rig_cam_info,\n                          TimestampMap & timestamp_map) {\n  \n  timestamp_map.clear();\n  for (int icam = 0; icam < (int)rig_cam_info.size(); icam++) {\n     auto const& info = rig_cam_info[icam]; // alias\n     \n     if (info.sensor_type != RIG_FRAME_SENSOR)\n        continue;\n     \n     int group = rig::mapVal(cam2group, icam);\n     timestamp_map[group][info.beg_pose_time] = icam;\n  }\n}\n\n// Each frame camera will have a timestamp. Find the median timestamp for each group\n// of such cameras.\nvoid populateFrameGroupMidTimestamp(std::vector<asp::CsmModel*>          const& csm_models,\n                                    std::map<int, int>                   const& cam2group,\n                                    TimestampMap const& timestamp_map,\n                                    // Outputs\n                                    std::vector<RigCamInfo> & rig_cam_info) {\n\n  int num_cams = csm_models.size();\n  for (int icam = 0; icam < num_cams; icam++) {\n    \n    UsgsAstroFrameSensorModel * frame_model\n      = dynamic_cast<UsgsAstroFrameSensorModel*>((csm_models[icam]->m_gm_model).get());\n    if (frame_model == NULL)\n      continue; // Skip non-frame cameras\n    \n    int group_id = rig::mapVal(cam2group, icam);\n\n    auto g_it = timestamp_map.find(group_id);\n    if (g_it == timestamp_map.end())\n      vw::vw_throw(vw::ArgumentErr() \n         << \"Failed to find group in timestamps.\\n\");\n    \n    // Put the keys in a vector\n    auto map = g_it->second;\n    std::vector<double> timestamps;\n    for (auto const& p: map) \n      timestamps.push_back(p.first);\n\n    // Find the median    \n    double median = vw::math::destructive_median(timestamps);\n    rig_cam_info[icam].mid_group_time = median;\n  }\n}\n\n// For each camera, find the camera closest in time that was acquired with the\n// reference sensor on the same rig as the current camera. The complexity of\n// this is total number of cameras times the number of cameras acquired with\n// a reference sensor. Something more clever did not work, and this may be\n// good enough.\n\n// TODO(oalexan1): Decrease the complexity of this function. Use binary search.\n// Also process each rig group separately.\nvoid findClosestRefCamera(rig::RigSet const& rig,\n                          std::vector<asp::CsmModel*> const& csm_models,\n                          std::vector<RigCamInfo> & rig_cam_info) {\n  \n  // Find the cameras acquired with the reference sensor on a rig\n  int num_cams = csm_models.size();\n  std::vector<int> ref_sensor_cams;\n  for (int icam = 0; icam < num_cams; icam++) {\n    auto const& info = rig_cam_info[icam]; // alias\n    if (!rig.isRefSensor(info.sensor_id))\n      continue;\n    ref_sensor_cams.push_back(icam);\n  }\n\n  for (int icam = 0; icam < num_cams; icam++) {\n   \n    auto const& info = rig_cam_info[icam]; // alias\n    int sensor_id = info.sensor_id;\n    int ref_sensor_id = rig.refSensorId(info.sensor_id);\n    \n    // Iterate over ref cameras\n    double max_time = std::numeric_limits<double>::max();\n    for (int ref_cam_index: ref_sensor_cams) {\n      \n      auto const& ref_info = rig_cam_info[ref_cam_index]; // alias\n      \n      // The rig group must be non-empty  \n      if (info.rig_group.empty() || ref_info.rig_group.empty())\n        vw::vw_throw(vw::ArgumentErr() << \"Empty rig group.\\n\");\n\n      // Both must be in the same rig group\n      if (ref_info.rig_group != info.rig_group)\n        continue;\n          \n      int ref_sensor_id2 = rig.refSensorId(ref_info.sensor_id);\n      \n      // This must be a ref sensor\n      if (ref_sensor_id2 != ref_info.sensor_id) \n        vw::vw_throw(vw::ArgumentErr() << \"Expecting a ref sensor.\\n\");\n        \n      if (ref_sensor_id2 != ref_sensor_id) \n        continue; // Not the same ref sensor\n        \n      // See if it is closer than the current best\n      double dt = std::abs(ref_info.mid_group_time - info.mid_group_time);\n      if (dt >= max_time) \n        continue;\n        \n      max_time = dt;\n      rig_cam_info[icam].ref_cam_index = ref_info.cam_index;\n      \n    } // end iterating over ref sensor cameras\n  } // end iterating over cameras\n  \n}\n\n// Find the times and indices bracketing a given time\nbool timestampBrackets(double time, \n                  std::map<double, int> const& timestamps,\n                  // Outputs\n                  double & time1, double & time2,\n                  int & index1, int & index2) {\n\n  // Initialize the outputs to something\n  time1 = 0.0; time2 = 0.0;\n  index1 = 0; index2 = 0;\n  \n  double first_time = timestamps.begin()->first;\n  double last_time  = timestamps.rbegin()->first;\n\n  // This is a very important check. We cannot extrapolate in time.\n  // TODO(oalexan1): Offending cameras better be filtered out before this point.\n  if (time < first_time || time > last_time)\n    LOG(FATAL) << \"Found a timestamp for a frame sensor that is not within the \"\n      << \"range of timestamps for the reference sensor. Such data must be manually \"\n      << \"excluded. Offending time: \" << std::setprecision(17) << time << \"\\n\";\n\n  // Find the time no earlier than time\n  auto it = timestamps.lower_bound(time);\n  if (it == timestamps.end()) {\n    return false; // out of bounds\n  }\n  time2 = it->first;\n  index2 = it->second;\n\n  // Must have index1 < index2, as later we need two independent poses\n  // at end points when we optimize them.\n  if (it == timestamps.begin()) {\n    if (timestamps.size() == 1)\n      LOG(FATAL) << \"Too few timestamps.\\n\";\n    \n    time1 = it->first;\n    index1 = it->second;\n    it++;\n    time2 = it->first;\n    index2 = it->second;  \n  } else {\n    it--;\n    time1 = it->first;\n    index1 = it->second;\n  }\n\n  // Very important checks\n  if (index1 == index2)\n    LOG(FATAL) << \"Bookkeeping failure in timestamps: equal indices.\\n\";\n  if (time1 == time2)\n    LOG(FATAL) << \"Bookkeeping failure in timestamps: equal times.\\n\";\n  if (time < time1 || time > time2)\n    LOG(FATAL) << \"Bookkeeping failure in timestamps: time out of bounds.\\n\";\n    \n  return true;\n}\n\n// Find the timestamps bracketing the camera with the given rig_cam_info.\n// This is a wrapper around the above function.\nbool timestampBrackets(asp::RigCamInfo     const & rig_cam_info,\n                        std::map<int, int> const & cam2group,\n                        TimestampMap       const & timestamp_map,\n                        // Outputs\n                        double & beg_ref_time, double & end_ref_time, \n                        int & beg_ref_index, int & end_ref_index) {\n\n  // Initialize the outputs\n  beg_ref_time = -1.0; end_ref_time = -1.0;\n  beg_ref_index = -1;  end_ref_index = -1;\n  \n  double frame_time = rig_cam_info.beg_pose_time;\n  if (frame_time != rig_cam_info.end_pose_time)\n   vw::vw_throw(vw::ArgumentErr() \n                << \"For a frame sensor beg and end pose time must be same.\\n\");\n   \n  int icam = rig_cam_info.cam_index;\n  int ref_icam = rig_cam_info.ref_cam_index;\n  int ref_group = rig::mapVal(cam2group, ref_icam);\n  auto const& ref_timestamps = rig::mapVal(timestamp_map, ref_group);\n  bool success = timestampBrackets(frame_time, ref_timestamps, \n                                   // Outputs\n                                   beg_ref_time, end_ref_time, \n                                   beg_ref_index, end_ref_index);\n  return success;\n}\n\n// Given two poses, each as x, y, z, qx, qy, qz, qw, linearly interpolate between them.\nvoid interpPose(double time1, double time2, \n                double const* pose1, double const* pose2, double time, \n                // Output\n                double* pose) {\n\n  double alpha = (time - time1)/(time2 - time1);\n  if (time1 == time2) \n    alpha = 0.0; // Corner case\n\n  for (int i = 0; i < NUM_XYZ_PARAMS + NUM_QUAT_PARAMS; i++) \n    pose[i] = pose1[i] + alpha*(pose2[i] - pose1[i]);\n    \n  // Normalize the quaternion\n  double * q = pose + NUM_XYZ_PARAMS;\n  double norm = sqrt(q[0]*q[0] + q[1]*q[1] + q[2]*q[2] + q[3]*q[3]);\n  for (int i = 0; i < NUM_QUAT_PARAMS; i++) \n    q[i] /= norm;\n}\n\n// Given reference poses at time1 and time2, a time in between, and the transform\n// from the rig from the reference to the current sensor, find the current sensor\n// pose (camera-to-world) at the given time.\nvoid interpCurrPose(double time1, double time2, double time, \n                    double const* pose1, double const* pose2, \n                    double const* ref_to_curr_trans,\n                    // Output\n                    double * cam2world_arr) {\n\n  // Interpolate the reference poses, and convert to a transform\n  double r[NUM_XYZ_PARAMS + NUM_QUAT_PARAMS];\n  interpPose(time1, time2, pose1, pose2, time, r);\n  Eigen::Affine3d ref_cam2world = asp::calcTransform(r[0], r[1], r[2], \n                                                     r[3], r[4], r[5], r[6]);\n  \n  // Convert the reference to current transform array to a transform\n  Eigen::Affine3d ref_to_curr_trans_aff;\n  rig::array_to_rigid_transform(ref_to_curr_trans_aff, ref_to_curr_trans);\n\n  // Apply the rig constraint\n  Eigen::Affine3d cam2world = ref_cam2world * ref_to_curr_trans_aff.inverse();\n\n  // Convert to an array\n  rig::rigid_transform_to_array(cam2world, cam2world_arr);\n}    \n\n// Given a map from timestamps to frame camera indices in csm_models, do linear\n// interpolation in time. Return false if out of bounds.\n// TODO(oalexan1): Must allow some slack at end points, so do a little extrapolation.\nbool interpFramePose(std::vector<asp::CsmModel*> const& csm_models,\n                     std::map<double, int> const& timestamps,\n                     double time, \n                     // Output\n                     Eigen::Affine3d & cam2world) {\n  \n  double time1 = 0.0, time2 = 0.0;\n  int index1 = 0, index2 = 0;\n  bool success = timestampBrackets(time, timestamps, time1, time2, index1, index2);\n  if (!success) \n    return false;\n\n  // Position and orientation at time1\n  double a[NUM_XYZ_PARAMS + NUM_QUAT_PARAMS];\n  csm_models[index1]->frame_position(a[0], a[1], a[2]);\n  csm_models[index1]->frame_quaternion(a[3], a[4], a[5], a[6]);\n  \n  // Position and orientation at time2\n  double b[NUM_XYZ_PARAMS + NUM_QUAT_PARAMS];\n  csm_models[index2]->frame_position(b[0], b[1], b[2]);\n  csm_models[index2]->frame_quaternion(b[3], b[4], b[5], b[6]);\n  \n  double c[NUM_XYZ_PARAMS + NUM_QUAT_PARAMS];\n  interpPose(time1, time2, a, b, time, c);\n\n  // Convert to a transform      \n  cam2world = asp::calcTransform(c[0], c[1], c[2], c[3], c[4], c[5], c[6]);\n  \n  return true;\n}\n\nbool calcInterpRefCamToWorld(std::vector<asp::CsmModel*> const& csm_models,\n                             std::vector<RigCamInfo> const& rig_cam_info, // all cam info\n                             RigCamInfo const& rig_info, // current cam info\n                             UsgsAstroFrameSensorModel * ref_frame_model,\n                             UsgsAstroLsSensorModel * ref_ls_model,\n                             std::map<int, int> const& cam2group,\n                             TimestampMap const& timestamp_map,\n                             int ref_icam, double time,\n                             // Output\n                             Eigen::Affine3d & ref_cam2world) {\n\n  if (ref_frame_model != NULL) {\n\n    // Find the interpolated ref cam at the current time.\n    int ref_group = rig::mapVal(cam2group, ref_icam);\n    std::map<double, int> const& ref_timestamps \n      = rig::mapVal(timestamp_map, ref_group);\n    bool success = interpFramePose(csm_models, ref_timestamps, time, ref_cam2world);\n    if (!success) \n      return false;\n      \n  } else if (ref_ls_model != NULL) {\n  \n    // Ensure we stay in bounds\n    if (time < rig_info.beg_pose_time || time < rig_cam_info[ref_icam].beg_pose_time ||\n        time > rig_info.end_pose_time || time > rig_cam_info[ref_icam].end_pose_time) \n      return false;\n  \n    double ref_pos[3], ref_q[4];  \n    asp::interpPositions(ref_ls_model, time, ref_pos);\n    asp::interpQuaternions(ref_ls_model, time, ref_q);  \n    ref_cam2world = asp::calcTransform(ref_pos[0], ref_pos[1], ref_pos[2],\n                                       ref_q[0], ref_q[1], ref_q[2], ref_q[3]);\n  } else {\n    vw::vw_throw(vw::ArgumentErr() << \"Unknown camera model.\\n\");\n  }\n\n  return true;\n}\n\n// Given all camera-to-world transforms, find the median rig transforms.\n// This is robust to outliers. Must handle both frame and linescan cameras\n// for both the ref and curr sensor, which is 4 cases.\nvoid calcRigTransforms(rig::RigSet const& rig,\n                       std::vector<asp::CsmModel*> const& csm_models,\n                       std::vector<RigCamInfo> const& rig_cam_info,\n                       std::map<int, int> const& cam2group,\n                       TimestampMap const& timestamp_map,\n                       bool use_initial_rig_transforms,\n                       // Outputs\n                       std::vector<double> & ref_to_curr_sensor_vec) {\n  \n  int num_rig_sensors = rig.cam_names.size();\n  ref_to_curr_sensor_vec.resize(rig::NUM_RIGID_PARAMS * num_rig_sensors, 0.0);\n\n  if (use_initial_rig_transforms) {\n     // Pack the initial rig transforms into the output vector \n     for (int sensor_id = 0; sensor_id < num_rig_sensors; sensor_id++) \n       rig::rigid_transform_to_array(rig.ref_to_cam_trans[sensor_id],\n         &ref_to_curr_sensor_vec[rig::NUM_RIGID_PARAMS * sensor_id]);\n    return;\n  }\n\n  std::map<int, std::vector<Eigen::MatrixXd>> transforms_map;\n  for (int icam = 0; icam < (int)csm_models.size(); icam++) {\n\n    auto const& rig_info = rig_cam_info[icam]; // alias\n    Eigen::Affine3d ref_to_curr;\n\n    // Get the underlying linescan model or frame model\n    asp::CsmModel * csm_cam = csm_models[icam];\n    UsgsAstroLsSensorModel * ls_model\n      = dynamic_cast<UsgsAstroLsSensorModel*>((csm_cam->m_gm_model).get());\n    UsgsAstroFrameSensorModel * frame_model\n      = dynamic_cast<UsgsAstroFrameSensorModel*>((csm_cam->m_gm_model).get());\n    // Find the ref camera\n    int ref_cam_index = rig_info.ref_cam_index;\n    UsgsAstroLsSensorModel * ref_ls_model\n      = dynamic_cast<UsgsAstroLsSensorModel*>(csm_models[ref_cam_index]->m_gm_model.get());\n    UsgsAstroFrameSensorModel * ref_frame_model\n      = dynamic_cast<UsgsAstroFrameSensorModel*>(csm_models[ref_cam_index]->m_gm_model.get());\n\n    int sensor_id = rig_info.sensor_id;\n    if (rig.isRefSensor(sensor_id)) {\n      // The transform from a reference sensor to itself is the identity\n      ref_to_curr.setIdentity();\n      transforms_map[sensor_id].push_back(ref_to_curr.matrix());\n      continue;\n    }\n\n    int ref_icam = rig_info.ref_cam_index;\n    \n    // Assume the ref sensor is a linescan sensor\n    if (ls_model != NULL) {\n\n      // Iterate over pose samples, and find the transform from the reference\n      // sensor to the current sensor at each sample time.\n      int numPos          = ls_model->m_positions.size() / NUM_XYZ_PARAMS;\n      double beg_pos_time = ls_model->m_t0Ephem;\n      double pos_dt       = ls_model->m_dtEphem;\n      for (int i = 0; i < numPos; i++) {\n        double time = beg_pos_time + i * pos_dt;\n\n        // Current camera position and orientation        \n        double pos[3], q[4];\n        asp::interpPositions(ls_model, time, pos);\n        asp::interpQuaternions(ls_model, time, q);\n        Eigen::Affine3d cam2world \n          = asp::calcTransform(pos[0], pos[1], pos[2], q[0], q[1], q[2], q[3]);\n        \n        // Ref camera position and orientation\n        Eigen::Affine3d ref_cam2world;\n        bool success = calcInterpRefCamToWorld(csm_models, rig_cam_info, rig_info,\n                                               ref_frame_model, ref_ls_model,\n                                               cam2group, timestamp_map, ref_icam, time,\n                                               // Output\n                                               ref_cam2world);\n        if (!success) \n          continue;\n        \n        ref_to_curr = cam2world.inverse() * ref_cam2world;\n        transforms_map[sensor_id].push_back(ref_to_curr.matrix());\n      }\n      \n    } else if (frame_model != NULL) {\n    \n      // This is the precise acquisition time\n      double time = rig_info.beg_pose_time;\n      \n      // Find current frame cam position and orientation\n      double x, y, z, qx, qy, qz, qw;\n      csm_models[icam]->frame_position(x, y, z);\n      csm_models[icam]->frame_quaternion(qx, qy, qz, qw);\n      Eigen::Affine3d cam2world = asp::calcTransform(x, y, z, qx, qy, qz, qw);\n      \n      // Find reference linescan cam position and orientation\n      Eigen::Affine3d ref_cam2world;\n      bool success = calcInterpRefCamToWorld(csm_models, rig_cam_info, rig_info,\n                                             ref_frame_model, ref_ls_model,\n                                             cam2group, timestamp_map, ref_icam, time,\n                                             // Output\n                                             ref_cam2world);\n      if (!success) \n        continue;\n        \n      ref_to_curr = cam2world.inverse() * ref_cam2world;\n      transforms_map[sensor_id].push_back(ref_to_curr.matrix());\n    }\n    \n  } // End loop through cameras\n  \n  // Find the median, for robustness. \n  for (auto it = transforms_map.begin(); it != transforms_map.end(); it++) {\n\n    int sensor_id = it->first;\n    auto & transforms = it->second;\n    if (transforms.empty()) \n        LOG(FATAL) << \"No poses were found for rig sensor with id: \" << sensor_id << \"\\n\";\n\n    Eigen::Affine3d median_trans;\n    median_trans.matrix() = rig::median_matrix(transforms);\n    \n    // Normalize the linear component of median_trans\n    median_trans.linear() /= pow(median_trans.linear().determinant(), 1.0 / 3.0);\n    \n    // Pack the median transform into the output vector    \n    rig::rigid_transform_to_array(median_trans,\n       &ref_to_curr_sensor_vec[rig::NUM_RIGID_PARAMS * sensor_id]);\n  }\n  \n  return;\n}\n\n// Update the rig with the optimized transforms\nvoid updateRig(std::vector<double> const& ref_to_curr_sensor_vec,\n               rig::RigSet & rig) {\n\n  int num_rig_sensors = rig.cam_names.size();\n  for (int sensor_id = 0; sensor_id < num_rig_sensors; sensor_id++) {\n      rig::array_to_rigid_transform\n        (rig.ref_to_cam_trans[sensor_id],\n         &ref_to_curr_sensor_vec[rig::NUM_RIGID_PARAMS * sensor_id]);\n  }\n}\n\n// Find the relationship between the cameras relative to the rig\nvoid populateRigCamInfo(rig::RigSet const& rig,\n                        std::vector<std::string> const& image_files,\n                        std::vector<std::string> const& camera_files,\n                        std::vector<asp::CsmModel*> const& csm_models,\n                        std::map<int, int> const& cam2group,\n                        bool use_initial_rig_transforms,\n                        // Outputs\n                        std::vector<RigCamInfo> & rig_cam_info,\n                        std::vector<double>     & ref_to_curr_sensor_vec,\n                        TimestampMap & timestamp_map) {\n\n  // Print a message, as this can take time\n  vw::vw_out() << \"Determining the rig relationships between the cameras.\\n\";\n   \n  // Initialize the rig cam info after a first pass through the cameras\n  populateInitRigCamInfo(rig, image_files, camera_files, csm_models, \n                         rig_cam_info);\n\n  // Find a map that from each group to timestamps and indices in that group\n  populateTimestampMap(cam2group, rig_cam_info, timestamp_map);\n  \n  // Find the mid time for each frame group as the median of the group timestamps  \n  populateFrameGroupMidTimestamp(csm_models, cam2group, timestamp_map,\n                                 rig_cam_info);\n\n  // For each camera find the closest camera within the rig and group\n  // that is acquired with the reference sensor\n  findClosestRefCamera(rig, csm_models, rig_cam_info);\n  \n  // Find the initial guess rig transforms based on all camera-to-world transforms\n  calcRigTransforms(rig, csm_models, rig_cam_info, cam2group, timestamp_map,\n                    use_initial_rig_transforms, ref_to_curr_sensor_vec);\n}\n\n// Given a reference linescan camera and the transform from it to the current\n// camera, find the current camera to world transform as an array.\nvoid linescanToCurrSensorTrans(UsgsAstroLsSensorModel const& ref_ls_cam,\n                               double curr_time,\n                               double const* ref_to_curr_trans,\n                               // Output\n                               double * cam2world_arr) {\n\n  Eigen::Affine3d ref_to_curr_trans_aff;\n  rig::array_to_rigid_transform(ref_to_curr_trans_aff, ref_to_curr_trans);\n  \n  // The transform from the reference camera to the world. We assume\n  // the linescan and frame cameras use the same clock.\n  double ref_pos[3], ref_q[4];  \n  asp::interpPositions(&ref_ls_cam, curr_time, ref_pos);\n  asp::interpQuaternions(&ref_ls_cam, curr_time, ref_q);  \n  Eigen::Affine3d ref_cam2world \n      = asp::calcTransform(ref_pos[0], ref_pos[1], ref_pos[2],\n                            ref_q[0], ref_q[1], ref_q[2], ref_q[3]);\n  // Apply the rig constraint\n  Eigen::Affine3d cam2world = ref_cam2world * ref_to_curr_trans_aff.inverse();\n\n  // Convert to an array\n  rig::rigid_transform_to_array(cam2world, cam2world_arr);\n}\n\n// Given a frame linescan camera and the transform from it to the current\n// camera, find the current camera to world transform as an array.\nvoid frameToCurrSensorTrans(std::vector<double>       const& frame_params,\n                            asp::RigCamInfo           const& rig_cam_info,\n                            std::map<int, int>        const& cam2group,\n                            TimestampMap              const& timestamp_map,\n                            double                    const* ref_to_curr_trans,\n                            // Output\n                            double                         * cam2world_arr) {\n\n  double beg_ref_time = 0.0, end_ref_time = 0.0;\n  int beg_ref_index = 0, end_ref_index = 0;\n  bool success = timestampBrackets(rig_cam_info, cam2group, timestamp_map, \n                                  // Outputs\n                                  beg_ref_time, end_ref_time, \n                                  beg_ref_index, end_ref_index);\n  if (!success) \n    vw::vw_throw(vw::ArgumentErr() << \"Failed to find the bracketing times.\\n\");\n\n  // The pointers to the bracketing frame camera parameters\n  double const* beg_frame_arr = &frame_params[beg_ref_index * rig::NUM_RIGID_PARAMS];\n  double const* end_frame_arr = &frame_params[end_ref_index * rig::NUM_RIGID_PARAMS];\n\n  // Find the interpolated current cam2world transform\n  double frame_time = rig_cam_info.beg_pose_time;\n  asp::interpCurrPose(beg_ref_time, end_ref_time, frame_time, \n                      beg_frame_arr, end_frame_arr, ref_to_curr_trans,\n                      cam2world_arr);\n}\n\n// Given a reference linescan camera and the transform from it to the current\n// linescan camera, update the the current camera poses within the given range.\nvoid updateLinescanWithRig(UsgsAstroLsSensorModel const& ref_ls_cam,\n                           double const* ref_to_curr_trans,\n                           UsgsAstroLsSensorModel & curr_ls_cam, // update this\n                           // Range of quat and position indices to update.\n                           // The default is to update all.\n                           int beg_quat_index, int end_quat_index,\n                           int beg_pos_index, int end_pos_index) {\n\n  // See if have to update the whole range of quats and positions\n  if (beg_quat_index < 0 || end_quat_index < 0) {\n    beg_quat_index = 0;\n    end_quat_index = curr_ls_cam.m_quaternions.size() / NUM_QUAT_PARAMS;\n  }\n  if (beg_pos_index < 0 || end_pos_index < 0) {\n    beg_pos_index = 0;\n    end_pos_index = curr_ls_cam.m_positions.size() / NUM_XYZ_PARAMS;\n  }\n  \n  std::vector<double> cam2world_vec(rig::NUM_RIGID_PARAMS);\n  double currQuatT0 = curr_ls_cam.m_t0Quat;\n  double currQuatDt = curr_ls_cam.m_dtQuat;\n  double currPosT0  = curr_ls_cam.m_t0Ephem;\n  double currPosDt  = curr_ls_cam.m_dtEphem;\n  \n  // Update the quaternions\n  for (int qi = beg_quat_index; qi < end_quat_index; qi++) {\n    double t = currQuatT0 + qi * currQuatDt;\n    asp::linescanToCurrSensorTrans(ref_ls_cam, t, ref_to_curr_trans,\n                                   &cam2world_vec[0]); // output\n    for (int coord = 0; coord < NUM_QUAT_PARAMS; coord++)\n      curr_ls_cam.m_quaternions[qi * NUM_QUAT_PARAMS + coord] \n        = cam2world_vec[coord + NUM_XYZ_PARAMS];\n  }\n\n  // Update the positions\n  for (int pi = beg_pos_index; pi < end_pos_index; pi++) {\n    double t = currPosT0 + pi * currPosDt;\n    asp::linescanToCurrSensorTrans(ref_ls_cam, t,\n                                  ref_to_curr_trans,\n                                  &cam2world_vec[0]); // output\n    for (int coord = 0; coord < NUM_XYZ_PARAMS; coord++)\n      curr_ls_cam.m_positions[pi * NUM_XYZ_PARAMS + coord] \n      = cam2world_vec[coord];\n  }  \n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Camera/JitterSolveRigUtils.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file JitterSolveRigUtils.h\n\n// Functions invoked in jitter_solve.cc that need a rig.\n\n#ifndef __ASP_CAMERA_JITTER_SOLVE_RIG_UTILS_H__\n#define __ASP_CAMERA_JITTER_SOLVE_RIG_UTILS_H__\n\n#include <asp/Camera/CsmModel.h>\n\n#include <string>\n#include <map>\n#include <vector>\n\nclass UsgsAstroLsSensorModel;\nclass UsgsAstroFrameSensorModel;\n\nnamespace rig {\n  class RigSet;\n}\n\nnamespace asp {\n\ntypedef std::map<int, std::map<double, int>> TimestampMap;\n\n// Create enum for senor type, which can be frame or linescan\nenum RigSensorType {RIG_LINESCAN_SENSOR, RIG_FRAME_SENSOR}; \n\n// For each camera this will info info that will tie it to the rig\nstruct RigCamInfo {\n  int sensor_id; // The sensor id in the rig set\n  RigSensorType sensor_type; // frame or linescan\n  \n  // The time at the image center for linescan and mid group for frame. Here the\n  // group is formed of all camera images acquired within a contigious time with\n  // the same frame sensor.\n  double mid_group_time;\n  \n  // For linescan: the starting and ending time for positions/orientations.\n  // For frame: both are the current pose time.\n  double beg_pose_time, end_pose_time;\n  \n  // The index of the camera in opt.camera_models\n  int cam_index;\n  // The index of the reference camera in opt.camera_models. The reference\n  // camera is assumed to be linescan.\n  int ref_cam_index; \n  \n  std::string image_file, camera_file;\n  \n  // The group name for the all cameras acquired with all sensors on a rig\n  // within a contigious time interval. Acquisitions at at a different time\n  // intervals and/or a different rig must have different group names.\n  std::string rig_group;\n   \n  // Declare the constructor\n  RigCamInfo();\n};\n\n// Find the time bounds for a linescan sensor\nvoid linescanTimeBounds(UsgsAstroLsSensorModel const* ls_model, \n                        // Outputs\n                        double & beg_time, double & end_time);\n\n// Book-keeping needed to tie each camera to the rig\nvoid populateRigCamInfo(rig::RigSet const& rig,\n                        std::vector<std::string> const& image_files,\n                        std::vector<std::string> const& camera_files,\n                        std::vector<asp::CsmModel*> const& csm_models,\n                        std::map<int, int> const& cam2group,\n                        bool use_initial_rig_transforms,\n                        // Outputs\n                        std::vector<RigCamInfo> & rig_cam_info,\n                        std::vector<double>     & ref_to_curr_sensor_vec,\n                        TimestampMap & timestamp_map);\n\n// Given a reference linescan camera and the transform from it to the current\n// camera, find the current camera to world transform as an array.\nvoid linescanToCurrSensorTrans( UsgsAstroLsSensorModel const & ref_ls_cam,\n                               double curr_time,\n                               double const* ref_to_curr_trans,\n                               // Output\n                               double * cam2world_arr);\n\n// Given a frame linescan camera and the transform from it to the current\n// camera, find the current camera to world transform as an array.\nvoid frameToCurrSensorTrans(std::vector<double>       const& frame_params,\n                            asp::RigCamInfo           const& rig_cam_info,\n                            std::map<int, int>        const& cam2group,\n                            TimestampMap              const& timestamp_map,\n                            double                    const* ref_to_curr_trans,\n                            // Output\n                            double * cam2world_arr);\n\n// Given a reference linescan camera and the transform from it to the current\n// linescan camera, update the the current camera poses within the given range.\nvoid updateLinescanWithRig( UsgsAstroLsSensorModel const & ref_ls_cam,\n                           double const* ref_to_curr_trans,\n                           UsgsAstroLsSensorModel & curr_ls_cam, // update this\n                           // Range of quat and position indices to update.\n                           // The default is to update all.\n                           int beg_quat_index = -1, int end_quat_index = -1,\n                           int beg_pos_index = -1, int end_pos_index = -1);\n\n// Update the rig with the optimized transforms\nvoid updateRig(std::vector<double> const& ref_to_curr_sensor_vec,\n               rig::RigSet & rig);\n\n// Find the times and indices bracketing a given time\nbool timestampBrackets(double time, \n                  std::map<double, int> const& timestamps,\n                  // Outputs\n                  double & time1, double & time2,\n                  int & index1, int & index2);\n\n// Find the timestamps bracketing the camera with the given rig_cam_info.\n// This is a wrapper around the above function.\nbool timestampBrackets(asp::RigCamInfo     const & rig_cam_info,\n                        std::map<int, int> const & cam2group,\n                        TimestampMap       const & timestamp_map,\n                        // Outputs\n                        double & beg_ref_time, double & end_ref_time, \n                        int & beg_ref_index, int & end_ref_index);\n\n// Given two poses, each as x, y, z, qx, qy, qz, qw, linearly interpolate between them.\nvoid interpPose(double time1, double time2, \n                double const* pose1, double const* pose2, double time, \n                // Output\n                double* pose);\n\n// Given reference poses at time1 and time2, a time in between, and the transform\n// from the rig from the reference to the current sensor, find the current sensor\n// pose (camera-to-world) at the given time.\nvoid interpCurrPose(double time1, double time2, double time, \n                    double const* pose1, double const* pose2, \n                    double const* ref_to_curr_trans,\n                    // Output\n                    double * cam2world_arr);\n\n} // end namespace asp\n\n#endif //__ASP_CAMERA_JITTER_SOLVE_RIG_UTILS_H__\n"
  },
  {
    "path": "src/asp/Camera/JitterSolveUtils.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Low-level functions used in jitter_solve.cc.\n\n#include <asp/Camera/CsmUtils.h>\n#include <asp/Camera/JitterSolveUtils.h>\n#include <asp/Core/BundleAdjustUtils.h>\n#include <asp/Core/FileUtils.h>\n#include <asp/Rig/RigConfig.h>\n#include <asp/Rig/TransformUtils.h>\n\n#include <usgscsm/UsgsAstroLsSensorModel.h>\n#include <usgscsm/UsgsAstroFrameSensorModel.h>\n\n#include <vw/FileIO/FileTypes.h>\n\n#include <boost/filesystem.hpp>\n\nnamespace fs = boost::filesystem;\n\nnamespace asp {\n\n// If several images are acquired in quick succession along the same orbit and\n// stored in the same list, record this structure by grouping them together.\n// Each element in the input vector below is either a standalone image, then it\n// is in a group of its own, or it is a list of images, all going to the same\n// group. Here we ignore the cameras. Matching cameras to images will be done\n// outside of this function.\nvoid readGroupStructure(std::vector<std::string> const & image_lists,\n                        std::map<int, int> & cam2group) {\n\n  // Wipe the output\n  cam2group.clear();\n\n  int group_count = 0, image_count = 0;\n  for (size_t i = 0; i < image_lists.size(); i++) {\n\n    // The case when we have a standalone image\n    if (vw::has_image_extension(image_lists[i])) {\n      cam2group[image_count] = group_count;\n      group_count++;\n      image_count++;\n      continue;\n    }\n\n    // Check if we have a list, ending in .txt. Here we skip over the cameras.\n    std::string ext = vw::get_extension(image_lists[i]);\n    if (ext != \".txt\")\n      continue;\n\n    // Read the list\n    std::vector<std::string> image_names;\n    asp::read_list(image_lists[i], image_names);\n    \n    // Add a new group, and let all images in the list be in that group\n    bool has_images = false;\n    for (size_t j = 0; j < image_names.size(); j++) {\n      if (!vw::has_image_extension(image_names[j]))\n        continue;\n      if (!fs::exists(image_names[j])) // additional robustness check\n        continue; \n\n      has_images = true;\n      cam2group[image_count] = group_count;\n      image_count++;\n    }\n\n    if (has_images)\n      group_count++;\n  }\n\n  return;\n} \n\n// Given a set of integers in increasing order, with each assigned to a group,\n// return the index of the current integer in its group.\nint indexInGroup(int icam, std::map<int, int> const& cam2group) {\n\n  auto it = cam2group.find(icam);\n  if (it == cam2group.end())\n    vw::vw_throw(vw::ArgumentErr() << \"indexInGroup: Camera not found.\\n\");\n\n  int group_id = it->second;\n\n  // Now iterate over all the integers in the group having icam,\n  // and the index of icam in its group.\n  int pos_in_group = -1;\n  for (auto it = cam2group.begin(); it != cam2group.end(); it++) {\n    \n    if (it->second != group_id)\n      continue; // not the same group\n\n    pos_in_group++;\n\n    if (it->first == icam)\n        return pos_in_group;\n  }\n\n  // Throw an error, as we could not find the integer in the group\n  vw::vw_throw(vw::ArgumentErr() << \"indexInGroup: Could not find camera in group.\\n\");\n\n  return -1;\n}\n\n// For frame cameras that belong to the same orbital group, collect together\n// the initial positions in a single vector, and same for quaternions. Linescan \n// cameras are skipped as their positions/quaternions are already in one vector.\nvoid formPositionQuatVecPerGroup(std::map<int, int> const& cam2group,\n               std::vector<asp::CsmModel*> const& csm_models,\n               // Outputs \n               std::map<int, std::vector<double>> & orbital_group_positions,\n               std::map<int, std::vector<double>> & orbital_group_quaternions) {\n\n  // Wipe the outputs\n  orbital_group_positions.clear();\n  orbital_group_quaternions.clear();\n\n  int num_cams = csm_models.size();\n  for (int icam = 0; icam < num_cams; icam++) {\n    \n    auto it = cam2group.find(icam);\n    if (it == cam2group.end())\n      vw::vw_throw(vw::ArgumentErr() \n         << \"addRollYawConstraint: Failed to find orbital group for camera.\\n\"); \n    int group_id = it->second;\n\n    UsgsAstroFrameSensorModel * frame_model\n      = dynamic_cast<UsgsAstroFrameSensorModel*>((csm_models[icam]->m_gm_model).get());\n    if (frame_model == NULL)\n      continue; // Skip non-frame cameras\n   \n    // Append the positions\n    for (int c = 0; c < NUM_XYZ_PARAMS; c++)\n        orbital_group_positions[group_id].push_back(frame_model->getParameterValue(c));\n    // Append the quaternions\n    for (int c = NUM_XYZ_PARAMS; c < NUM_XYZ_PARAMS + NUM_QUAT_PARAMS; c++)\n        orbital_group_quaternions[group_id].push_back(frame_model->getParameterValue(c));\n  }\n  \n  // TODO(oalexan1): Must normalize the quaternions per group here and ensure\n  // the same sign for the dominant coefficient.\n\n  return;\n}\n\n// For the cameras that are of frame type, copy the initial values of camera position\n// and orientation to the vector of variables that we will optimize. Have to keep this \n// vector separate since UsgsAstroFrameSensorModel does not have a way to access the\n// underlying array of variables directly.\nvoid initFrameCameraParams(std::vector<asp::CsmModel*> const& csm_models,\n  std::vector<double> & frame_params) { // output\n\n  // Note how we allocate storage for all cameras, for simplicity.\n  frame_params.resize((NUM_XYZ_PARAMS + NUM_QUAT_PARAMS) * csm_models.size(), 0.0);\n\n  for (size_t icam = 0; icam < csm_models.size(); icam++) {\n\n    UsgsAstroFrameSensorModel * frame_model\n     = dynamic_cast<UsgsAstroFrameSensorModel*>((csm_models[icam]->m_gm_model).get());\n    if (frame_model == NULL)\n      continue;\n\n    // The UsgsAstroFrameSensorModel stores first 3 position parameters, then 4\n    // quaternion parameters.\n    double * vals = &frame_params[icam * (NUM_XYZ_PARAMS + NUM_QUAT_PARAMS)];\n    for (size_t i = 0; i < NUM_XYZ_PARAMS + NUM_QUAT_PARAMS; i++)\n      vals[i] = frame_model->getParameterValue(i); \n  }\n}\n\n// Update the cameras given the optimized parameters. Without a rig,\n// the linescan cameras are optimized in-place but the frame cameras still\n// have external parameters. \nvoid updateCameras(bool                                have_rig,\n                   rig::RigSet                  const& rig,\n                   std::vector<asp::RigCamInfo> const& rig_cam_info,\n                   std::map<int, int>           const& cam2group,\n                   TimestampMap                 const& timestamp_map,\n                   std::vector<double>          const& ref_to_curr_sensor_vec,\n                   std::vector<asp::CsmModel*>       & csm_models,\n                   std::vector<double>               & frame_params) {\n   \n  // Sanity check. The allocated space is for all cameras, for simplicity.\n  if (frame_params.size() != (NUM_XYZ_PARAMS + NUM_QUAT_PARAMS) * csm_models.size())\n    vw::vw_throw(vw::ArgumentErr() << \"Invalid number of frame camera parameters.\");\n\n  for (size_t icam = 0; icam < csm_models.size(); icam++) {\n\n    UsgsAstroLsSensorModel * ls_model\n     = dynamic_cast<UsgsAstroLsSensorModel*>((csm_models[icam]->m_gm_model).get());\n    UsgsAstroFrameSensorModel * frame_model\n     = dynamic_cast<UsgsAstroFrameSensorModel*>((csm_models[icam]->m_gm_model).get());\n\n    // Current frame cam parameters. Will be updated for rig. \n    double * frame_arr = &frame_params[icam * (NUM_XYZ_PARAMS + NUM_QUAT_PARAMS)];\n\n    if (have_rig) {\n      auto rig_info = rig_cam_info[icam];\n      int ref_cam   = rig_info.ref_cam_index;\n      int sensor_id = rig_info.sensor_id;\n      double const* ref_to_curr_sensor_trans \n                    = &ref_to_curr_sensor_vec[rig::NUM_RIGID_PARAMS * sensor_id];\n      \n      // For now, the reference sensor must be linescan\n      UsgsAstroLsSensorModel * ref_ls_model \n        = dynamic_cast<UsgsAstroLsSensorModel*>((csm_models[ref_cam]->m_gm_model).get());\n      UsgsAstroFrameSensorModel * ref_frame_model\n        = dynamic_cast<UsgsAstroFrameSensorModel*>((csm_models[ref_cam]->m_gm_model).get());\n      if (ref_ls_model != NULL) {\n\n        if (ls_model != NULL) {\n          // Update the ls model in place\n          asp::updateLinescanWithRig(*ref_ls_model, ref_to_curr_sensor_trans,\n                                    *ls_model); // output\n        } else if (frame_model != NULL) {\n          // Update the frame camera params\n          asp::linescanToCurrSensorTrans(*ref_ls_model, rig_info.beg_pose_time, \n                                      ref_to_curr_sensor_trans,\n                                      frame_arr); // output\n        }\n      } else if (ref_frame_model != NULL) {\n        // Update the frame camera params\n        asp::frameToCurrSensorTrans(frame_params, rig_info,\n                                    cam2group, timestamp_map,\n                                    ref_to_curr_sensor_trans,\n                                    frame_arr); // output\n      }\n    } \n    \n    if (frame_model != NULL) {\n      // Update the frame camera model based on frame camera params\n      for (size_t i = 0; i < rig::NUM_RIGID_PARAMS; i++)\n        frame_model->setParameterValue(i, frame_arr[i]); \n    }\n    \n  } // End loop over cameras\n\n  return;\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Camera/JitterSolveUtils.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file JitterSolveUtils.h\n\n// Low-level functions used in jitter_solve.cc.\n\n#ifndef __ASP_CAMERA_JITTER_SOLVE_UTILS_H__\n#define __ASP_CAMERA_JITTER_SOLVE_UTILS_H__\n\n#include <asp/Camera/CsmModel.h>\n\n#include <vw/Cartography/GeoReference.h>\n#include <asp/Camera/JitterSolveRigUtils.h>\n\n#include <string>\n#include <map>\n#include <vector>\n\nnamespace rig {\n  class RigSet;\n}\n\nnamespace asp {\n\nclass RigCamInfo;\n\n// If several images are acquired in quick succession along the same orbit and\n// stored in the same list, record this structure by grouping them together.\n// Each element in the input vector below is either a standalone image, then it\n// is in a group of its own, or it is a list of images, all going to the same\n// group. Here we ignore the cameras. Matching cameras to images will be done\n// outside of this function.\nvoid readGroupStructure(std::vector<std::string> const & image_lists,\n                        std::map<int, int> & cam2group);\n\n\n// Given a set of integers in increasing order, with each assigned to a group,\n// return the index of the current integer in its group.\nint indexInGroup(int icam, std::map<int, int> const& cam2group);\n\n// For frame cameras that belong to the same orbital group, collect together\n// the initial positions in a single vector, and same for quaternions. Linescan \n// cameras are skipped as their positions/quaternions are already in one vector.\nvoid formPositionQuatVecPerGroup(std::map<int, int> const& cam2group,\n               std::vector<asp::CsmModel*> const& csm_models,\n               // Outputs \n               std::map<int, std::vector<double>> & orbital_group_positions,\n               std::map<int, std::vector<double>> & orbital_group_quaternions);\n\n// For the cameras that are of frame type, copy the initial values of camera position\n// and orientation to the vector of variables that we will optimize. Have to keep this \n// vector separate since UsgsAstroFrameSensorModel does not have a way to access the\n// underlying array of variables directly.\nvoid initFrameCameraParams(std::vector<asp::CsmModel*> const& csm_models,\n  std::vector<double> & frame_params); // output\n\n// Update the cameras given the optimized parameters\nvoid updateCameras(bool                                have_rig,\n                   rig::RigSet                  const& rig,\n                   std::vector<asp::RigCamInfo> const& rig_cam_info,\n                   std::map<int, int>           const& cam2group,\n                   TimestampMap                 const& timestamp_map,\n                   std::vector<double>          const& ref_to_curr_sensor_vec,\n                   std::vector<asp::CsmModel*>       & csm_models,\n                   std::vector<double>               & frame_params);\n\n} // end namespace asp\n\n#endif //__ASP_CAMERA_JITTER_SOLVE_UTILS_H__"
  },
  {
    "path": "src/asp/Camera/LinescanASTERModel.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Camera/ASTER_XML.h>\n#include <asp/Camera/CsmModelFit.h>\n#include <asp/Camera/LinescanASTERModel.h>\n\nnamespace asp {\n\nASTERCameraModel::ASTERCameraModel(\n    std::vector<std::vector<vw::Vector2>> const& lattice_mat,\n    std::vector<std::vector<vw::Vector3>> const& sight_mat,\n    std::vector<std::vector<vw::Vector3>> const& world_sight_mat,\n    std::vector<vw::Vector3>              const& sat_pos,\n    vw::Vector2i                          const& image_size) {\n\n  if (lattice_mat.empty() || lattice_mat[0].empty())\n    vw::vw_throw(vw::ArgumentErr() << \"Empty matrix of lattice points.\\n\");\n\n  int min_col = lattice_mat.front().front().x();\n  int min_row = lattice_mat.front().front().y();\n\n  int max_col = lattice_mat.back().back().x();\n  int max_row = lattice_mat.back().back().y();\n\n  int num_rows = lattice_mat.size();\n  int num_cols = lattice_mat.front().size();\n\n  // The spacing between rows must be integer\n  double tol = 1e-10;\n  double d_row = double(max_row - min_row)/(num_rows - 1.0);\n  if (std::abs(d_row - round(d_row)) > tol)\n    vw::vw_throw(vw::ArgumentErr()\n                   << \"The spacing between lattice points must be integer.\\n\");\n  d_row = round(d_row);\n\n  // The spacing between columns must be integer\n  double d_col = double(max_col - min_col)/(num_cols - 1.0);\n  if (std::abs(d_col - round(d_col)) > tol)\n    vw::vw_throw(vw::ArgumentErr()\n                   << \"The spacing between lattice points must be integer.\\n\");\n  d_col = round(d_col);\n\n  if ((int)sat_pos.size() != num_rows)\n    vw::vw_throw(vw::ArgumentErr()\n                   << \"The number of rows of lattice points does not \"\n                   << \"agree with the number of satellite positions.\\n\");\n\n  if (num_rows != (int)world_sight_mat.size() ||\n      num_cols != (int)world_sight_mat[0].size())\n    vw::vw_throw(vw::ArgumentErr()\n                   << \"The number of rows or columns of lattice points does not \"\n                   << \"agree with the number of sight vectors.\\n\");\n\n  // CSM fitting assumes the detector starts at column 0\n  if (min_col != 0)\n    vw::vw_throw(vw::ArgumentErr() << \"Cannot use the CSM model with ASTER cameras \"\n                 << \"if the first column index of the lattice matrix is not 0.\\n\");\n\n  vw::cartography::Datum datum(\"WGS84\"); // ASTER is for Earth\n  std::string sensor_id = \"ASTER\";\n  vw::vw_out() << \"Using the CSM model with \" << sensor_id << \" cameras.\\n\";\n\n  // Fit a CSM sensor with distortion to given tabulated sight directions\n  bool fit_distortion = true;\n  fitCsmLinescan(sensor_id, datum, image_size, sat_pos, world_sight_mat,\n                 min_col, min_row, d_col, d_row, fit_distortion, *this);\n}\n\nboost::shared_ptr<ASTERCameraModel>\nload_ASTER_camera_model_from_xml(std::string const& path) {\n\n  // XYZ coordinates are in the ITRF coordinate frame which means GCC coordinates.\n  // - The velocities are in the same coordinate frame, not in some local frame.\n\n  vw::vw_out(vw::DebugMessage, \"asp\") << \"Loading ASTER camera file: \"\n                                      << path << \"\\n\";\n\n  // Parse the ASTER XML file\n  ASTERXML xml_reader;\n  xml_reader.read_xml(path);\n\n  // Feed everything into a new camera model.\n  return boost::shared_ptr<ASTERCameraModel>\n    (new ASTERCameraModel(xml_reader.m_lattice_mat,\n                          xml_reader.m_sight_mat,\n                          xml_reader.m_world_sight_mat,\n                          xml_reader.m_sat_pos,\n                          xml_reader.m_image_size));\n}\n\n} // end namespace asp\n\n"
  },
  {
    "path": "src/asp/Camera/LinescanASTERModel.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n/// \\file LinescanASTERModel.h\n///\n/// Linescan model for ASTER. Fits a CSM linescan model to the ASTER\n/// lattice of sight vectors and satellite positions.\n///\n#ifndef __STEREO_CAMERA_LINESCAN_ASTER_MODEL_H__\n#define __STEREO_CAMERA_LINESCAN_ASTER_MODEL_H__\n\n#include <asp/Camera/CsmModel.h>\n\n#include <vw/Math/Matrix.h>\n\nnamespace asp {\n\n  // References:\n  // -----------\n  // ASTER User Handbook Version 2\n  // https://asterweb.jpl.nasa.gov/content/03_data/04_Documents/aster_user_guide_v2.pdf\n\n  // https://lpdaac.usgs.gov/documents/175/ASTER_L1_Product_Specifications.pdf\n\n  // The following paper has a blurb on the ASTER linescan camera.\n  // Quantifying ice loss in the eastern Himalayas since 1974 using\n  // declassified spy satellite imagery\n  // Joshua M. Maurer, Summer B. Rupper, Joerg M. Schaefer\n\n  /// CSM-based linescan camera model for ASTER satellites.\n  /// Inherits from CsmModel, following the same pattern as Pleiades,\n  /// DG, SPOT, and PeruSat.\n  class ASTERCameraModel : public asp::CsmModel {\n\n  public:\n    ASTERCameraModel(std::vector<std::vector<vw::Vector2>> const& lattice_mat,\n                     std::vector<std::vector<vw::Vector3>> const& sight_mat,\n                     std::vector<std::vector<vw::Vector3>> const& world_sight_mat,\n                     std::vector<vw::Vector3>               const& sat_pos,\n                     vw::Vector2i                            const& image_size);\n\n    virtual ~ASTERCameraModel() {}\n    virtual std::string type() const { return \"LinescanASTER\"; }\n\n  }; // End class ASTERCameraModel\n\n\n  /// Load a ASTER camera model from an XML file.\n  /// - This function does not take care of Xerces XML init/de-init, the caller must\n  ///   make sure this is done before/after this function is called!\n  boost::shared_ptr<ASTERCameraModel>\n  load_ASTER_camera_model_from_xml(std::string const& path);\n  \n} // end namespace asp\n\n#endif//__STEREO_CAMERA_LINESCAN_ASTER_MODEL_H__\n"
  },
  {
    "path": "src/asp/Camera/LinescanDGModel.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// TODO(oalexan1): Make this inherit from CsmModel.\n\n#include <asp/Camera/RPC_XML.h>\n#include <asp/Camera/LinescanDGModel.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Camera/CsmUtils.h>\n#include <asp/Camera/Covariance.h>\n\n#include <vw/Camera/OrbitalCorrections.h>\n\n#include <usgscsm/UsgsAstroLsSensorModel.h>\n#include <usgscsm/Utilities.h>\n\nusing namespace vw;\n\nnamespace asp {\n\n// -----------------------------------------------------------------\n// LinescanDGModel supporting functions\n\nboost::posix_time::ptime parse_dg_time(std::string str) {\n  try{\n    return boost::posix_time::time_from_string(str);\n  }catch(...){\n    // This is a useful error, it tells the user an XML camera file is\n    // trying to be interpreted as a DG camera file.\n    vw::vw_throw(vw::ArgumentErr() << \"Failed to parse time from string: \" << str << \". \"\n                 << \"If you are not using Digital Globe images, you may need to \"\n                 << \"specify the session type, such as -t rpc, -t rpcmaprpc, -t aster, etc.\\n\");\n  }\n  return boost::posix_time::time_from_string(str); // Never reached!\n}\n\nvw::CamPtr load_dg_camera_model_from_xml(std::string const& path) {\n  \n  // Parse the Digital Globe XML file\n  GeometricXML geo;\n  AttitudeXML  att;\n  EphemerisXML eph;\n  ImageXML     img;\n  RPCXML       rpc;\n\n  // Check that cameras end in .xml.\n  std::string ext = boost::filesystem::path(path).extension().string();\n  boost::algorithm::to_lower(ext);\n  if (ext != \".xml\")\n    vw::vw_throw(vw::ArgumentErr() \n      << \"Digital Globe camera files must end in .xml. Likely need to specify \"\n      << \"another session type than -t dg.\\n\");\n    \n  try {\n    read_xml(path, geo, att, eph, img, rpc);\n  } catch (...) {\n    // The XML parser may throw exceptions other than std::exception. Catch them\n    // all here.\n    vw::vw_throw(vw::ArgumentErr() \n                 << \"Invalid Digital Globe XML file: \" << path << \". \"\n                 << \"If you are not using Digital Globe cameras, you may \"\n                 << \"need to specify the appropriate session type, such as -t rpc, \"\n                 << \"-t rpcmaprpc, -t aster, etc.\\n\");\n  }\n\n  // For WV, only Stereo1B and Basic1B products are supported. Users\n  // often say wrong results are produced with other products.\n  std::string sat_id = img.sat_id; \n  boost::algorithm::to_lower(sat_id);\n  std::string image_descriptor = img.image_descriptor; \n  boost::algorithm::to_lower(image_descriptor); \n  if (sat_id.size() >= 2 && sat_id.substr(0, 2) == \"wv\" && \n      image_descriptor != \"stereo1b\" && image_descriptor != \"basic1b\") {\n    vw::vw_throw(vw::ArgumentErr() << \"For WorldView images, only Stereo1B and Basic1B products are supported.\\n\");\n  } \n\n  // Get an estimate of the surface elevation from the corners specified in the\n  // file. Not every file has this information, in which case we will just use\n  // zero. Also estimate the local Earth radius. We assume the WGS84 ellipsoid.\n  // These will be used to apply velocity aberration and atmospheric refraction\n  // corrections.\n  double local_earth_radius = vw::DEFAULT_EARTH_RADIUS;\n  double mean_ground_elevation = vw::DEFAULT_SURFACE_ELEVATION;\n  vw::BBox3 bbox = rpc.get_lon_lat_height_box();\n  if (!bbox.empty()) {\n    mean_ground_elevation = (bbox.min()[2] + bbox.max()[2]) / 2.0;\n    double lon = (bbox.min()[0] + bbox.max()[0])/2.0;\n    double lat = (bbox.min()[1] + bbox.max()[1])/2.0;\n    vw::cartography::Datum datum(\"WGS84\"); \n    vw::Vector3 xyz = datum.geodetic_to_cartesian(vw::Vector3(lon, lat, 0));\n    local_earth_radius = norm_2(xyz);\n  }\n\n  // Convert measurements in millimeters to pixels.\n  geo.principal_distance /= geo.detector_pixel_pitch;\n  geo.detector_origin    /= geo.detector_pixel_pitch;\n\n  // Convert all time measurements to something that boost::date_time can read.\n  boost::replace_all(eph.start_time,            \"T\", \" \");\n  boost::replace_all(img.tlc_start_time,        \"T\", \" \");\n  boost::replace_all(img.first_line_start_time, \"T\", \" \");\n  boost::replace_all(att.start_time,            \"T\", \" \");\n\n  // Convert UTC time measurements to line measurements. Ephemeris\n  // start time will be our reference frame to calculate seconds against.\n  SecondsFromRef convert(parse_dg_time(eph.start_time));\n\n  // It is assumed that EPH and ATT are sampled at the same rate and time.\n  VW_ASSERT(eph.satellite_position_vec.size() == att.satellite_quat_vec.size(),\n            vw::MathErr() \n              << \"Ephemeris and attitude don't have the same number of samples.\");\n  VW_ASSERT(eph.start_time == att.start_time && eph.time_interval == att.time_interval,\n            vw::MathErr() \n              << \"Ephemeris and attitude don't seem to use the same t0 or dt.\");\n\n  // Load up the time interpolation class. If the TLCList only has\n  // one entry, then we have to manually drop in the slope and offset.\n  if (img.tlc_vec.size() == 1) {\n    double direction = 1;\n    if (boost::to_lower_copy(img.scan_direction) != \"forward\") {\n      direction = -1;\n    }\n    img.tlc_vec.push_back(std::make_pair(img.tlc_vec.front().first +\n                                         img.avg_line_rate, direction));\n  }\n\n  // Sanity check: first line time should agree with TLC time at line 0.\n  double tlc_start_time = convert(parse_dg_time(img.tlc_start_time));\n  double tlc_time_at_0 = img.tlc_vec[0].second + tlc_start_time;\n  double first_line_time = convert(parse_dg_time(img.first_line_start_time));\n  double tol = std::abs(1.0 / (10.0 * img.avg_line_rate));\n  VW_ASSERT(std::abs(first_line_time - tlc_time_at_0) < tol,\n\t     vw::ArgumentErr()\n        << \"First line time does not agree with TLC time for file: \" << path << \".\\n\"\n        << \"This suggests that your camera file is incorrect. To make this error go away, \"\n        << \"edit the camera file and make the value of <TLCTIME> equal to the value of \"\n        << \"<FIRSTLINETIME>. Use the produced cameras with caution.\\n\"\n        << \"Or consider using the RPC camera model (option -t rpc).\\n\"\n        << \"First line time is: \" << first_line_time << \".\\n\"\n        << \"TLC time is: \" << tlc_time_at_0 << \".\\n\");\n\n  double et0 = convert(parse_dg_time(eph.start_time));\n  double at0 = convert(parse_dg_time(att.start_time));\n  double edt = eph.time_interval;\n  double adt = att.time_interval;\n\n  vw::Quat sensor_rotation = vw::math::euler_xyz_to_quaternion\n    (vw::Vector3(0,0,geo.detector_rotation - M_PI/2)); // explained earlier\n  vw::Quat sensor_to_body = geo.camera_attitude * sensor_rotation;\n  vw::Vector2 final_detector_origin\n    = subvector(inverse(sensor_rotation).rotate(vw::Vector3(geo.detector_origin[0],\n\t\t\t\t\t\t\t      geo.detector_origin[1], 0)), 0, 2);\n\n  // We will create one camera model in regular use, and 14 more of\n  // them with slight perturbations if needed for error propagation\n  // (covariance computation). This approach results in avoiding\n  // writing a lot of new code which would be in some places similar\n  // and in others different than existing one. See Covariance.h for\n  // more details.\n  vw::CamPtr nominal_cam;\n  std::vector<vw::CamPtr> perturbed_cams;\n  int num_cams = 1;\n  if (asp::stereo_settings().propagate_errors)\n    num_cams = numCamsForCovariance();\n\n  for (int cam_it = 0; cam_it < num_cams; cam_it++) {\n    vw::Vector<double, 3> dp = asp::positionDelta(cam_it);\n    vw::Vector<double, 4> dq = asp::quatDelta(cam_it);\n\n    // Convert ephemeris from satellite to camera position. Change\n    // attitude to be the rotation from camera frame to world\n    // frame. We also add an additional 90 degree rotation to the\n    // camera frame so X is the horizontal direction to the picture\n    // and +Y points down the image (in the direction of flight). Must\n    // apply any perturbations when still in satellite coordinates, to\n    // be consistent with input covariances.\n    std::vector<vw::Vector3> camera_position_vec(eph.satellite_position_vec.size());\n    std::vector<vw::Quat>    camera_quat_vec(att.satellite_quat_vec.size());\n    for (size_t i = 0; i < eph.satellite_position_vec.size(); i++) {\n      Vector<double, 3> p = eph.satellite_position_vec[i] + dp; // add the perturbation\n      Vector<double, 4> q = att.satellite_quat_vec[i];\n      // The dq perturbations are chosen under the assumption that q is normalized\n      double len_q = norm_2(q);\n      if (len_q > 0 && asp::stereo_settings().propagate_errors) \n        q = q / len_q; // Normalization is not needed without covariance logic\n      q = q + dq;\n      vw::Quat qt(q[3], q[0], q[1], q[2]); // Note the swap. The order is now w, x, y, z.\n      camera_position_vec[i] = p + qt.rotate(geo.perspective_center);\n      camera_quat_vec[i] = qt * sensor_to_body;\n    }\n\n    vw::CamPtr cam_ptr\n      (new DGCameraModel(camera_position_vec, eph.velocity_vec, et0, edt,\n                         camera_quat_vec, at0, adt,\n                         img.tlc_vec,\n                         convert(parse_dg_time(img.tlc_start_time)),\n                         img.image_size, final_detector_origin,\n                         geo.principal_distance, mean_ground_elevation,\n                         local_earth_radius));\n\n    if (cam_it == 0) \n      nominal_cam = cam_ptr;\n    else\n      perturbed_cams.push_back(cam_ptr);\n  }\n\n  DGCameraModel * cam = (DGCameraModel*)nominal_cam.get();\n  \n  // Store the starting time and spacing for the satellite, in case later some resampling\n  // happens to the cameras when those would use a different spacing.\n  // TODO(oalexan1): This code needs to be deleted, as there is no longer any \n  // resampling of the cameras.\n  cam->m_satellite_pos_t0 = et0;\n  cam->m_satellite_pos_dt = edt;\n  cam->m_satellite_quat_t0 = at0;\n  cam->m_satellite_quat_dt = adt;\n  if (asp::stereo_settings().propagate_errors) {\n    cam->m_perturbed_cams = perturbed_cams; \n    cam->m_satellite_pos_cov = eph.satellite_pos_cov;\n    cam->m_satellite_quat_cov = att.satellite_quat_cov;\n  }\n  \n  return nominal_cam;\n} // End function load_dg_camera_model()\n\n// Constructor\nDGCameraModel::DGCameraModel\n  (std::vector<vw::Vector3>             const& positions,\n   std::vector<vw::Vector3>             const& velocities,\n   double pos_t0, double pos_dt,\n   std::vector<vw::Quat>               const& quaternions,\n   double quat_t0, double quat_dt,\n   std::vector<std::pair<double,double>> const& tlc,\n   double time_offset,\n   vw::Vector2i                         const& image_size,\n   vw::Vector2                          const& detector_origin,\n   double focal_length,\n   double mean_ground_elevation,\n   double local_earth_radius):\n m_positions(positions), m_velocities(velocities),\n m_pos_t0(pos_t0), m_pos_dt(pos_dt),\n m_quaternions(quaternions), m_quat_t0(quat_t0), m_quat_dt(quat_dt),\n m_tlc(tlc), m_time_offset(time_offset),\n m_image_size(image_size), m_detector_origin(detector_origin),\n m_focal_length(focal_length), m_mean_ground_elevation(mean_ground_elevation),\n m_local_earth_radius(local_earth_radius) {\n   // Populate the underlying CSM model\n   populateCsmModel();\n}\n  \n// This is a lengthy function that does many initializations  \n// TODO(oalexan1): Replace this with a call to populateCsmLinescan()\n// from CsmUtils.cc, but that will need some refactoring first to handle\n// this case. \nvoid DGCameraModel::populateCsmModel() {\n\n  // Using a desired precision of 1e-8 will result in about this much\n  // agreement between image to ground and back. Pushing this to\n  // something lower will result in the CSM ground-to-image\n  // computation failing due to numerical precision issues, which can\n  // be traced to the DG camera using a focal length (in pixels) of\n  // 2,002,252.25.\n\n  // This sensor is used for Earth only\n  vw::cartography::Datum datum(\"WGS84\"); \n  this->m_desired_precision = asp::DEFAULT_CSM_DESIRED_PRECISION;\n  this->m_semi_major_axis = datum.semi_major_axis(); \n  this->m_semi_minor_axis = datum.semi_minor_axis();\n    \n  // Create a linescan model as a smart pointer, and do smart pointer\n  // casting. Follow the CSM API. The type of m_gm_model is\n  // csm::RasterGM, which is a base class. UsgsAstroLsSensorModel is\n  // derived from it. A smart pointer to m_gm_model is held by\n  // this model.\n  this->m_gm_model = boost::make_shared<UsgsAstroLsSensorModel>();\n  m_ls_model = boost::dynamic_pointer_cast<UsgsAstroLsSensorModel>\n    (this->m_gm_model);\n  if (m_ls_model == NULL)\n    vw::vw_throw(vw::ArgumentErr() << \"Invalid initialization of the linescan model.\\n\");\n    \n  // This performs many initializations apart from the above. Note that this is\n  // not a boost::shared_ptr reset, it is UsgsAstroLsSensorModel reset.\n  m_ls_model->reset();\n    \n  m_ls_model->m_nSamples         = m_image_size[0];\n  m_ls_model->m_nLines           = m_image_size[1];\n  m_ls_model->m_platformFlag     = 1; // For order 8 Lagrange interpolation\n  m_ls_model->m_maxElevation     = 10000.0; //  10 km\n  m_ls_model->m_minElevation     = -10000.0; // -10 km\n  m_ls_model->m_focalLength      = m_focal_length;\n  m_ls_model->m_zDirection       = 1.0;\n  m_ls_model->m_halfSwath        = 1.0;\n  m_ls_model->m_sensorIdentifier = \"DigitalGlobeLinescan\";\n  m_ls_model->m_majorAxis        = this->m_semi_major_axis;\n  m_ls_model->m_minorAxis        = this->m_semi_minor_axis;\n\n  // The choices below are because of how DigitalGlobe's\n  // get_local_pixel_vector() interacts with the\n  // UsgsAstroLsSensorModel function\n  // computeDistortedFocalPlaneCoordinates(). For Pleiades\n  // get_local_pixel_vector() is computed differently, and hence\n  // different choices here as well. Also keep in mind that a CSM\n  // pixel has extra 0.5 added to it.\n  m_ls_model->m_iTransL[0]             = 0.0;  \n  m_ls_model->m_iTransL[1]             = 0.0;\n  m_ls_model->m_iTransL[2]             = 1.0;\n  m_ls_model->m_iTransS[0]             = 0.0;\n  m_ls_model->m_iTransS[1]             = 1.0;\n  m_ls_model->m_iTransS[2]             = 0.0;\n  m_ls_model->m_detectorLineSumming    = 1.0;\n  m_ls_model->m_detectorSampleSumming  = 1.0;\n  \n  // Keep these as is. Modify instead m_detectorLineOrigin and\n  // m_detectorSampleOrigin. The effect is same as all USGSCSM code uses\n  // m_detectorLineOrigin - m_startingDetectorLine, and the same for the sample.\n  m_ls_model->m_startingDetectorLine   = 0.0;\n  m_ls_model->m_startingDetectorSample = 0.0;\n\n  // Optical center\n  m_ls_model->m_detectorLineOrigin     = -m_detector_origin[1];\n  m_ls_model->m_detectorSampleOrigin   = -m_detector_origin[0] + 0.5;\n\n  // Time\n  auto const& tlc = m_tlc;\n  double time_offset = m_time_offset;\n  if (tlc.size() < 2)\n    vw::vw_throw(vw::ArgumentErr()\n                 << \"Expecting at least two line and time sample pairs.\\n\");\n  m_ls_model->m_intTimeLines.clear(); // not needed, but best for clarity\n  m_ls_model->m_intTimeStartTimes.clear();\n  m_ls_model->m_intTimes.clear();\n  for (size_t i = 0; i < tlc.size(); i++) {\n    // The 1.0 below is what is needed to make CSM agree with the older ASP linescan\n    // implementation. Part of it is a 0.5 pixel offset in the line. \n    // TODO(oalexan1): This needs more thinking.\n    m_ls_model->m_intTimeLines.push_back(tlc[i].first + 1.0); // line\n    m_ls_model->m_intTimeStartTimes.push_back(tlc[i].second + time_offset); // time\n    // Slope\n    if (i + 1 < tlc.size()) {\n      // Compute the slope between this time instance and the next\n      double slope = (tlc[i+1].second - tlc[i].second) / (tlc[i+1].first - tlc[i].first);\n      m_ls_model->m_intTimes.push_back(slope);\n    } else{\n      // Cannot have a slope for the last value, as there's no next one to use,\n      // but for consistency, borrow the last slope. This is consistent\n      // with lines out of range using the slopes closest to them.\n      double slope = m_ls_model->m_intTimes.back();\n      m_ls_model->m_intTimes.push_back(slope);\n    }\n  }\n\n  // Pass to CSM the positions and velocities. CSM uses Lagrange interpolation.\n  m_ls_model->m_numPositions = 3 * m_positions.size();\n  m_ls_model->m_t0Ephem = m_pos_t0;\n  m_ls_model->m_dtEphem = m_pos_dt;\n  m_ls_model->m_positions.resize(m_ls_model->m_numPositions);\n  m_ls_model->m_velocities.resize(m_ls_model->m_numPositions);\n  for (size_t pos_it = 0; pos_it < m_positions.size(); pos_it++) {\n    vw::Vector3 P = m_positions[pos_it];\n    vw::Vector3 V = m_velocities[pos_it];\n    for (int coord = 0; coord < 3; coord++) {\n      m_ls_model->m_positions [3*pos_it + coord] = P[coord];\n      m_ls_model->m_velocities[3*pos_it + coord] = V[coord];\n    }\n  }\n\n  // Quaternions. CSM uses Lagrange interpolation.\n  int num_quat = m_quaternions.size();\n  m_ls_model->m_numQuaternions = 4 * num_quat; // concatenate all coordinates\n  m_ls_model->m_t0Quat = m_quat_t0;\n  m_ls_model->m_dtQuat = m_quat_dt;\n  m_ls_model->m_quaternions.resize(m_ls_model->m_numQuaternions);\n\n  for (int pos_it = 0; pos_it < m_ls_model->m_numQuaternions / 4; pos_it++) {\n    vw::Quat q = m_quaternions[pos_it];\n    // ASP stores the quaternions as (w, x, y, z). CSM wants them as\n    // x, y, z, w.\n    int coord = 0;\n    m_ls_model->m_quaternions[4*pos_it + coord] = q.x(); coord++;\n    m_ls_model->m_quaternions[4*pos_it + coord] = q.y(); coord++;\n    m_ls_model->m_quaternions[4*pos_it + coord] = q.z(); coord++;\n    m_ls_model->m_quaternions[4*pos_it + coord] = q.w(); coord++;\n  }\n\n  // Quaternions must always be normalized and not change suddenly in sign.\n  asp::normalizeQuaternions(m_ls_model.get());\n  \n  // Re-creating the model from the state forces some operations to\n  // take place which are inaccessible otherwise.\n  std::string modelState = m_ls_model->getModelState();\n  m_ls_model->replaceModelState(modelState);\n\n  // Adjust the CSM model to correct for velocity aberration and atmospheric\n  // refraction. This can only happen after the model is fully initialized, as\n  // need to create rays from the camera center to the ground.\n  bool correct_velocity_aberration = true;\n  bool correct_atmospheric_refraction = true;\n  asp::orbitalCorrections(this, \n                          correct_velocity_aberration, correct_atmospheric_refraction,\n                          m_local_earth_radius, m_mean_ground_elevation);\n  \n  return;\n}\n\n// Interpolate the satellite position covariance at given pixel\nvoid DGCameraModel::interpSatellitePosCov(vw::Vector2 const& pix,\n                                          double p_cov[SAT_POS_COV_SIZE]) const {\n  \n  double time = asp::get_time_at_line(pix.y(), m_ls_model.get());\n  int numCov = m_satellite_pos_cov.size() / SAT_POS_COV_SIZE;\n\n  int nOrder = 8;\n  if (m_ls_model->m_platformFlag == 0)\n    nOrder = 4;\n\n  lagrangeInterp(numCov, &m_satellite_pos_cov[0], m_satellite_pos_t0, m_satellite_pos_dt,\n                 time, SAT_POS_COV_SIZE, nOrder, p_cov);\n  //asp::nearestNeibInterp(numCov, &m_satellite_pos_cov[0], m_satellite_pos_t0, \n  //                       m_satellite_pos_dt, time, SAT_POS_COV_SIZE, p_cov);\n}\n\n// Interpolate the satellite quaternion covariance at given pixel\nvoid DGCameraModel::interpSatelliteQuatCov(vw::Vector2 const& pix,\n                                           double q_cov[SAT_QUAT_COV_SIZE]) const {\n\n  double time = asp::get_time_at_line(pix.y(), m_ls_model.get());\n  int numCov = m_satellite_quat_cov.size() / SAT_QUAT_COV_SIZE;\n  \n  int nOrder = 8;\n  if (m_ls_model->m_platformFlag == 0)\n    nOrder = 4;\n  int nOrderQuat = nOrder;\n  if (numCov < 6 && nOrder == 8)\n    nOrderQuat = 4;\n\n  // The covariances are not guaranteed to be smooth, so use nearest neighbor.\n  // Interpolation may even create matrices with negative eigenvalues.\n  //lagrangeInterp(numCov, &m_satellite_quat_cov[0], m_satellite_quat_t0, m_satellite_quat_dt,\n  //               time, SAT_QUAT_COV_SIZE, nOrderQuat, q_cov);\n  asp::nearestNeibInterp(numCov, &m_satellite_quat_cov[0], \n                    m_satellite_quat_t0, m_satellite_quat_dt,\n                    time, SAT_QUAT_COV_SIZE, q_cov);\n}\n\n} // end namespace asp\n\n"
  },
  {
    "path": "src/asp/Camera/LinescanDGModel.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// TODO(oalexan1): See if using proper earth radius and proper surface\n// elevation improves the results! There is already some logic\n// for extracting surface elevation from the RPC model.\n\n// \\file LinescanDGModel.h\n// This class inherits from the CSM model.\n\n#ifndef __STEREO_CAMERA_LINESCAN_DG_MODEL_H__\n#define __STEREO_CAMERA_LINESCAN_DG_MODEL_H__\n\n#include <asp/Camera/TimeProcessing.h>\n#include <asp/Camera/CsmModel.h>\n\n#include <vw/Cartography/Datum.h>\n#include <vw/Math/EulerAngles.h>\n#include <vw/Math/Quaternion.h>\n\n// Forward declaration\nclass UsgsAstroLsSensorModel;\n\nnamespace asp {\n\n  // Upper-right portion of the 3x3 satellite position covariance\n  // matrix and 4x4 satellite quaternion matrix.\n  const int SAT_POS_COV_SIZE = 6, SAT_QUAT_COV_SIZE = 10;\n  \n  // This is the standard DG implementation. In PositionInterp.cc and QuatInterp.cc there are other\n  // ways of performing position and pose interpolation as well. TODO(oalexan1):\n  // Eliminate all these VW functions use directly the inputs from the XML file.\n  class DGCameraModel: public asp::CsmModel {\n    \n  public:\n    \n    DGCameraModel\n      (std::vector<vw::Vector3>             const& positions,\n       std::vector<vw::Vector3>             const& velocities,\n       double pos_t0, double pos_dt,\n       std::vector<vw::Quat>               const& quaternions,\n       double quat_t0, double quat_dt,\n       std::vector<std::pair<double,double>> const& tlc,\n       double time_offset,\n       vw::Vector2i                         const& image_size,\n       vw::Vector2                          const& detector_origin,\n       double focal_length,\n       double mean_ground_elevation,\n       double local_earth_radius);\n\n    virtual ~DGCameraModel() {}\n    virtual std::string type() const { return \"LinescanDG\"; }\n\n    // This is a pointer to the underlying linescan model\n    boost::shared_ptr<UsgsAstroLsSensorModel> m_ls_model;\n\n    // For error propagation\n    std::vector<vw::CamPtr> m_perturbed_cams;\n    std::vector<double> m_satellite_pos_cov, m_satellite_quat_cov;\n    double m_satellite_pos_t0, m_satellite_pos_dt;\n    double m_satellite_quat_t0, m_satellite_quat_dt;\n\n    // Interpolate the satellite position covariance at given pixel\n    void interpSatellitePosCov(vw::Vector2 const& pix, double p_cov[SAT_POS_COV_SIZE]) const;\n\n    // Interpolate the satellite quaternion covariance at given pixel\n    void interpSatelliteQuatCov(vw::Vector2 const& pix, double q_cov[SAT_QUAT_COV_SIZE]) const;\n    \n  private:\n    // Function to interpolate quaternions with the CSM model. This is used\n    // for validation of the CSM model but not in production.  \n    void getQuaternions(const double& time, double q[4]) const;\n\n    void populateCsmModel();\n\n    // Extrinsics - uniformly sampled data copied into CSM model\n    std::vector<vw::Vector3> m_positions, m_velocities;\n    double m_pos_t0, m_pos_dt;\n    std::vector<vw::Quat> m_quaternions;\n    double m_quat_t0, m_quat_dt;\n    std::vector<std::pair<double,double>> m_tlc; // line->time pairs\n    double m_time_offset;\n\n    // Intrinsics\n    \n    /// Location of (0,0) coordinate of the detector relative to the center of\n    ///  the origin of the camera coordinate system.\n    /// - Stored internally in pixels.\n    vw::Vector2  m_detector_origin; \n    double       m_focal_length;  ///< The focal length, also stored in pixels.\n\n    /// Image size in pixels\n    vw::Vector2i m_image_size;\n    \n    // Mean ground elevation and local Earth radius. \n    double m_mean_ground_elevation, m_local_earth_radius;\n  };\n\n  /// Load a DG camera model from an XML file. This function does not\n  /// take care of Xerces XML init/de-init, the caller must make sure\n  /// this is done before/after this function is called.\n  vw::CamPtr load_dg_camera_model_from_xml(std::string const& path);\n\n} //end  namespace asp\n\n#endif//__STEREO_CAMERA_LINESCAN_DG_MODEL_H__\n"
  },
  {
    "path": "src/asp/Camera/LinescanPeruSatModel.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Core/StereoSettings.h>\n#include <asp/Camera/PeruSatXML.h>\n#include <asp/Camera/LinescanPeruSatModel.h>\n#include <asp/Camera/CsmUtils.h>\n\n#include <vw/Camera/OrbitalCorrections.h>\n\n#include <usgscsm/UsgsAstroLsSensorModel.h>\n\nnamespace asp {\n\nusing vw::Vector3;\n\n// CSM-based PeruSat camera model constructor\nPeruSatCsmCameraModel::\nPeruSatCsmCameraModel(double time_t0, double time_dt,\n                      std::vector<vw::Vector3> const& positions,\n                      std::vector<vw::Vector3> const& velocities,\n                      double pos_t0, double pos_dt,\n                      std::vector<vw::Quaternion<double>> const& quaternions,\n                      double quat_t0, double quat_dt,\n                      vw::Vector2                        const& tan_psi_x,\n                      vw::Vector2                        const& tan_psi_y,\n                      vw::Quaternion<double>             const& instrument_biases,\n                      vw::Vector2i                       const& image_size,\n                      double min_time, double max_time):\n  m_time_t0(time_t0), m_time_dt(time_dt),\n  m_positions(positions), m_velocities(velocities),\n  m_pos_t0(pos_t0), m_pos_dt(pos_dt),\n  m_quaternions(quaternions),\n  m_quat_t0(quat_t0), m_quat_dt(quat_dt),\n  m_tan_psi_x(tan_psi_x), m_tan_psi_y(tan_psi_y),\n  m_instrument_biases(instrument_biases),\n  m_image_size(image_size),\n  m_min_time(min_time), m_max_time(max_time) {\n\n  populateCsmModel();\n}\n\n// Populate the CSM linescan model from the raw PeruSat data.\n// This follows the same pattern as PleiadesCameraModel::populateCsmModel().\nvoid PeruSatCsmCameraModel::populateCsmModel() {\n\n  // Populate CsmModel class members\n  m_desired_precision = asp::DEFAULT_CSM_DESIRED_PRECISION;\n  vw::cartography::Datum datum(\"WGS84\");\n  m_semi_major_axis = datum.semi_major_axis();\n  m_semi_minor_axis = datum.semi_minor_axis();\n\n  // Create the linescan model\n  m_gm_model = boost::make_shared<UsgsAstroLsSensorModel>();\n  m_ls_model = dynamic_cast<UsgsAstroLsSensorModel*>(m_gm_model.get());\n  if (m_ls_model == NULL)\n    vw::vw_throw(vw::ArgumentErr() << \"Invalid initialization of the linescan model.\\n\");\n\n  // This performs many initializations apart from the above\n  m_ls_model->reset();\n\n  // Override some initializations\n  m_ls_model->m_nSamples = m_image_size[0];\n  m_ls_model->m_nLines   = m_image_size[1];\n  m_ls_model->m_platformFlag = 1; // order 8 Lagrange, consistent with all other CSM sensors\n  m_ls_model->m_maxElevation =  10000.0; //  10 km\n  m_ls_model->m_minElevation = -10000.0; // -10 km\n  m_ls_model->m_focalLength  = 1.0;\n  m_ls_model->m_zDirection   = 1.0;\n  m_ls_model->m_halfSwath    = 1.0;\n  m_ls_model->m_sensorIdentifier = \"PeruSat\";\n  m_ls_model->m_majorAxis = m_semi_major_axis;\n  m_ls_model->m_minorAxis = m_semi_minor_axis;\n\n  m_ls_model->m_iTransL[0] = 0.0;\n  m_ls_model->m_iTransL[1] = 1.0; // no scale\n  m_ls_model->m_iTransL[2] = 0.0; // no skew\n  m_ls_model->m_iTransS[0] = 0.0;\n  m_ls_model->m_iTransS[1] = 0.0; // no skew\n  m_ls_model->m_iTransS[2] = 1.0; // no scale\n\n  m_ls_model->m_startingDetectorLine   = 0.0;\n  m_ls_model->m_startingDetectorSample = 0.0;\n\n  // PeruSat look angle formula:\n  //   psi_x = tan_psi_x[0] * col + tan_psi_x[1]\n  //   psi_y = tan_psi_y[0] * col + tan_psi_y[1]\n  //   look = (tan(psi_y), -tan(psi_x), 1)\n  //\n  // In CSM, the linear detector model produces psi (the angle), and the\n  // tan() is replaced by a transverse distortion polynomial from usgscsm.\n  // The coefficients encode atan() as a 3rd-order Taylor polynomial: u - u^3/3.\n  // For PeruSat angles (~0.01 rad), the approximation error is ~1e-12.\n  //\n  // The instrument biases quaternion is folded into each attitude quaternion.\n\n  // Set detector params to give psi directly (the angle, not tangent).\n  //\n  // CSM image-to-ground computes (with identity iTransL/iTransS):\n  //   detSample = (col+0.5) * sampleSumming + startingSample\n  //   distortedY = detSample - sampleOrigin\n  //   distortedX = 0 - lineOrigin = -lineOrigin (constant, detLine=0 for linescan)\n  //   removeDistortion(distortedX, distortedY) -> (undistortedX, undistortedY)\n  //   Look direction is proportional to (undistortedX, undistortedY, 1).\n  //\n  // We need: look = (tan(psi_y), -tan(psi_x), 1).\n  // So: undistortedX = tan(psi_y), undistortedY = -tan(psi_x).\n  // With transverse atan() distortion (odd function):\n  //   distortedX = psi_y, distortedY = -psi_x\n  //\n  // For distortedY = -psi_x = -(tan_psi_x[0]*col + tan_psi_x[1]):\n  //   distortedY = (col+0.5)*sampleSumming - sampleOrigin\n  //              = -tan_psi_x[0]*col - tan_psi_x[1]\n  //   sampleSumming = -tan_psi_x[0]\n  //   sampleOrigin = 0.5*(-tan_psi_x[0]) + tan_psi_x[1]\n  //                = tan_psi_x[1] - 0.5*tan_psi_x[0]\n  m_ls_model->m_detectorSampleSumming = -m_tan_psi_x[0];\n  m_ls_model->m_detectorSampleOrigin  = m_tan_psi_x[1]\n    - 0.5 * m_tan_psi_x[0];\n\n  // For distortedX = psi_y = tan_psi_y[1] (constant, slope is zero):\n  //   -lineOrigin = tan_psi_y[1], so lineOrigin = -tan_psi_y[1]\n  m_ls_model->m_detectorLineSumming  = 1.0;\n  m_ls_model->m_detectorLineOrigin   = -m_tan_psi_y[1];\n\n  // Transverse distortion: 20 coefficients (first 10 for x, last 10 for y).\n  // Monomials: [1, ux, uy, ux^2, ux*uy, uy^2, ux^3, ux^2*uy, ux*uy^2, uy^3]\n  // For x: dx = ux - ux^3/3  (atan(ux) Taylor approximation)\n  // For y: dy = uy - uy^3/3\n  m_ls_model->m_distortionType = DistortionType::TRANSVERSE;\n  m_ls_model->m_opticalDistCoeffs.resize(20, 0.0);\n  // x coefficients: [0, 1, 0, 0, 0, 0, -1/3, 0, 0, 0]\n  m_ls_model->m_opticalDistCoeffs[1] = 1.0;\n  m_ls_model->m_opticalDistCoeffs[6] = -1.0 / 3.0;\n  // y coefficients: [0, 0, 1, 0, 0, 0, 0, 0, 0, -1/3]\n  m_ls_model->m_opticalDistCoeffs[12] = 1.0;\n  m_ls_model->m_opticalDistCoeffs[19] = -1.0 / 3.0;\n\n  // Time\n  m_ls_model->m_intTimeLines.push_back(1.0); // offset CSM's quirky 0.5 additions\n  m_ls_model->m_intTimeStartTimes.push_back(m_time_t0);\n  m_ls_model->m_intTimes.push_back(m_time_dt);\n\n  int num_pos = m_positions.size();\n  if ((size_t)num_pos != m_velocities.size())\n    vw::vw_throw(vw::ArgumentErr() << \"Expecting as many positions as velocities.\\n\");\n\n  // Positions and velocities\n  m_ls_model->m_numPositions = 3 * num_pos;\n  m_ls_model->m_t0Ephem = m_pos_t0;\n  m_ls_model->m_dtEphem = m_pos_dt;\n  m_ls_model->m_positions.resize(m_ls_model->m_numPositions);\n  m_ls_model->m_velocities.resize(m_ls_model->m_numPositions);\n  for (int pos_it = 0; pos_it < num_pos; pos_it++) {\n    for (int coord = 0; coord < 3; coord++) {\n      m_ls_model->m_positions [3*pos_it + coord] = m_positions[pos_it][coord];\n      m_ls_model->m_velocities[3*pos_it + coord] = m_velocities[pos_it][coord];\n    }\n  }\n\n  // Quaternions. PeruSat provides tabulated quaternions at uniform time steps.\n  // Fold the instrument biases into each quaternion so CSM sees the combined\n  // rotation (body-to-sensor including biases).\n  int num_quats = m_quaternions.size();\n  m_ls_model->m_numQuaternions = 4 * num_quats;\n  m_ls_model->m_t0Quat = m_quat_t0;\n  m_ls_model->m_dtQuat = m_quat_dt;\n  m_ls_model->m_quaternions.resize(m_ls_model->m_numQuaternions);\n\n  vw::Quaternion<double> inv_biases = inverse(m_instrument_biases);\n  for (int qi = 0; qi < num_quats; qi++) {\n    // Compose: apply instrument biases to convert from sensor to body,\n    // then the attitude quaternion from body to ECEF.\n    // The old code does: result = inv_biases.rotate(look), then\n    //   pose.rotate(result). This is equivalent to (pose * inv_biases)(look).\n    // CSM applies the quaternion to the look vector directly, so store\n    // the composed quaternion.\n    vw::Quat q = m_quaternions[qi] * inv_biases;\n    q = normalize(q);\n\n    // ASP stores (w, x, y, z). CSM wants (x, y, z, w).\n    m_ls_model->m_quaternions[4*qi + 0] = q.x();\n    m_ls_model->m_quaternions[4*qi + 1] = q.y();\n    m_ls_model->m_quaternions[4*qi + 2] = q.z();\n    m_ls_model->m_quaternions[4*qi + 3] = q.w();\n  }\n\n  // Normalize and fix sign flips\n  asp::normalizeQuaternions(m_ls_model);\n\n  // Re-creating the model from the state forces some operations to\n  // take place which are inaccessible otherwise.\n  std::string modelState = m_ls_model->getModelState();\n  m_ls_model->replaceModelState(modelState);\n\n  // Adjust the CSM model for velocity aberration and atmospheric\n  // refraction if desired.\n  double local_earth_radius = vw::DEFAULT_EARTH_RADIUS;\n  double mean_ground_elevation = vw::DEFAULT_SURFACE_ELEVATION;\n  asp::orbitalCorrections(this,\n                          asp::stereo_settings().enable_velocity_aberration_correction,\n                          asp::stereo_settings().enable_atmospheric_refraction_correction,\n                          local_earth_radius, mean_ground_elevation);\n}\n\n// CSM-delegating virtual functions (same pattern as Pleiades)\nvw::Vector3 PeruSatCsmCameraModel::camera_center(vw::Vector2 const& pix) const {\n  csm::ImageCoord csm_pix;\n  asp::toCsmPixel(pix, csm_pix);\n  double time = m_ls_model->getImageTime(csm_pix);\n  csm::EcefCoord ecef = m_ls_model->getSensorPosition(time);\n  return vw::Vector3(ecef.x, ecef.y, ecef.z);\n}\n\nvw::Vector3 PeruSatCsmCameraModel::pixel_to_vector(vw::Vector2 const& pix) const {\n  csm::ImageCoord csm_pix;\n  asp::toCsmPixel(pix, csm_pix);\n  csm::EcefLocus locus = m_ls_model->imageToRemoteImagingLocus(csm_pix);\n  return vw::Vector3(locus.direction.x, locus.direction.y, locus.direction.z);\n}\n\nvw::Vector2 PeruSatCsmCameraModel::point_to_pixel(vw::Vector3 const& point) const {\n  csm::EcefCoord ecef(point[0], point[1], point[2]);\n  double achievedPrecision = -1.0;\n  csm::WarningList * warnings_ptr = NULL;\n  csm::ImageCoord csm_pix = m_ls_model->groundToImage(ecef, m_desired_precision,\n                                                       &achievedPrecision, warnings_ptr);\n  vw::Vector2 asp_pix;\n  asp::fromCsmPixel(asp_pix, csm_pix);\n  return asp_pix;\n}\n\n// Load PeruSat camera as a CSM linescan model.\n// Resampling is done here (not in PeruSatXML) so the XML class returns raw data.\n// Positions/velocities: Lagrange order 4 (degree 3).\n// Quaternions: SLERP.\nboost::shared_ptr<PeruSatCsmCameraModel>\nload_perusat_camera_model_from_xml(std::string const& path) {\n\n  vw_out(vw::DebugMessage, \"asp\") << \"Loading PeruSat camera file: \" << path << \"\\n\";\n\n  PeruSatXML xml_reader;\n  xml_reader.read_xml(path);\n\n  // Extract raw (unresampled) data from the XML\n  double time_t0 = 0, time_dt = 0;\n  std::vector<Vector3> raw_positions, raw_velocities;\n  double raw_pos_t0 = 0, raw_pos_dt = 0;\n  std::vector<vw::Quaternion<double>> raw_quaternions;\n  double raw_quat_t0 = 0, raw_quat_dt = 0;\n  double min_time = 0, max_time = 0;\n  xml_reader.extractRawData(time_t0, time_dt,\n                            raw_positions, raw_velocities,\n                            raw_pos_t0, raw_pos_dt,\n                            raw_quaternions, raw_quat_t0, raw_quat_dt,\n                            min_time, max_time);\n\n  // Resample to a denser grid so CSM's Lagrange interpolation\n  // closely reproduces VW's interpolation on the sparse raw data.\n  int factor = 10; // resample to 10x denser grid\n  int order = 4;   // Lagrange interpolation order (4 points, degree 3)\n\n  // Resample positions and velocities with Lagrange (same as old VW path)\n  std::vector<double> pos_times_raw, vel_times_raw;\n  for (size_t i = 0; i < raw_positions.size(); i++)\n    pos_times_raw.push_back(raw_pos_t0 + i * raw_pos_dt);\n  for (size_t i = 0; i < raw_velocities.size(); i++)\n    vel_times_raw.push_back(raw_pos_t0 + i * raw_pos_dt);\n\n  std::vector<double> pos_out_times, vel_out_times;\n  std::vector<Vector3> positions, velocities;\n  asp::resampleVec3Lagrange(pos_times_raw, raw_positions, order, factor,\n                            pos_out_times, positions);\n  asp::resampleVec3Lagrange(vel_times_raw, raw_velocities, order, factor,\n                            vel_out_times, velocities);\n\n  double pos_t0 = pos_out_times.front();\n  double pos_dt = (pos_out_times.back() - pos_out_times.front()) /\n                  (pos_out_times.size() - 1.0);\n\n  // Resample quaternions with SLERP (same as old VW path)\n  std::vector<double> quat_times_raw;\n  for (size_t i = 0; i < raw_quaternions.size(); i++)\n    quat_times_raw.push_back(raw_quat_t0 + i * raw_quat_dt);\n\n  std::vector<double> quat_out_times;\n  std::vector<vw::Quaternion<double>> quaternions;\n  asp::resampleQuatSlerp(quat_times_raw, raw_quaternions, factor,\n                         quat_out_times, quaternions);\n\n  double quat_t0 = quat_out_times.front();\n  double quat_dt = (quat_out_times.back() - quat_out_times.front()) /\n                   (quat_out_times.size() - 1.0);\n\n  // Update min/max time based on resampled data\n  min_time = std::max(pos_out_times.front(),\n                      std::max(vel_out_times.front(), quat_out_times.front()));\n  max_time = std::min(pos_out_times.back(),\n                      std::min(vel_out_times.back(), quat_out_times.back()));\n\n  boost::shared_ptr<PeruSatCsmCameraModel> cam\n    (new PeruSatCsmCameraModel(time_t0, time_dt,\n                               positions, velocities,\n                               pos_t0, pos_dt,\n                               quaternions, quat_t0, quat_dt,\n                               xml_reader.m_tan_psi_x,\n                               xml_reader.m_tan_psi_y,\n                               xml_reader.m_instrument_biases,\n                               xml_reader.m_image_size,\n                               min_time, max_time));\n  return cam;\n}\n\n} // end namespace asp\n\n"
  },
  {
    "path": "src/asp/Camera/LinescanPeruSatModel.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file LinescanPeruSatModel.h\n///\n/// CSM linescan camera model for PeruSat-1. Populates a UsgsAstroLsSensorModel\n/// directly from the PeruSat XML metadata, using transverse distortion from\n/// usgscsm to handle the tan(psi) look angle computation.\n\n#ifndef __STEREO_CAMERA_LINESCAN_PERUSAT_MODEL_H__\n#define __STEREO_CAMERA_LINESCAN_PERUSAT_MODEL_H__\n\n#include <vw/Math/Matrix.h>\n#include <vw/Math/Quaternion.h>\n#include <asp/Camera/CsmModel.h>\n\n// Forward declaration\nclass UsgsAstroLsSensorModel;\n\nnamespace asp {\n\n  // CSM-based PeruSat camera model, following the Pleiades pattern.\n  // Populates a UsgsAstroLsSensorModel directly, bypassing VW interpolation.\n  class PeruSatCsmCameraModel: public asp::CsmModel {\n\n  public:\n    PeruSatCsmCameraModel(double time_t0, double time_dt,\n                          std::vector<vw::Vector3> const& positions,\n                          std::vector<vw::Vector3> const& velocities,\n                          double pos_t0, double pos_dt,\n                          std::vector<vw::Quaternion<double>> const& quaternions,\n                          double quat_t0, double quat_dt,\n                          vw::Vector2                        const& tan_psi_x,\n                          vw::Vector2                        const& tan_psi_y,\n                          vw::Quaternion<double>             const& instrument_biases,\n                          vw::Vector2i                       const& image_size,\n                          double min_time, double max_time);\n\n    virtual ~PeruSatCsmCameraModel() {}\n    virtual std::string type() const { return \"LinescanPeruSat\"; }\n\n    // These delegate to the CSM model\n    virtual vw::Vector3 pixel_to_vector(vw::Vector2 const& pix) const;\n    virtual vw::Vector3 camera_center(vw::Vector2 const& pix) const;\n    virtual vw::Vector2 point_to_pixel(vw::Vector3 const& point) const;\n\n    virtual vw::Quaternion<double> camera_pose(vw::Vector2 const& pix) const {\n      vw_throw(vw::NoImplErr() << \"PeruSatCsmCameraModel: Cannot retrieve camera_pose!\");\n      return vw::Quaternion<double>();\n    }\n\n  private:\n    void populateCsmModel();\n\n    double m_time_t0, m_time_dt;\n    std::vector<vw::Vector3> m_positions, m_velocities;\n    double m_pos_t0, m_pos_dt;\n    std::vector<vw::Quaternion<double>> m_quaternions;\n    double m_quat_t0, m_quat_dt;\n    vw::Vector2 m_tan_psi_x, m_tan_psi_y;\n    vw::Quaternion<double> m_instrument_biases;\n    vw::Vector2i m_image_size;\n    double m_min_time, m_max_time;\n\n    // Pointer to linescan sensor. Managed by CsmModel::m_gm_model.\n    UsgsAstroLsSensorModel * m_ls_model;\n  }; // End class PeruSatCsmCameraModel\n\n  /// Load a PeruSat camera model from an XML file.\n  boost::shared_ptr<PeruSatCsmCameraModel>\n  load_perusat_camera_model_from_xml(std::string const& path);\n\n} // end namespace asp\n\n#endif//__STEREO_CAMERA_LINESCAN_PERUSAT_MODEL_H__\n"
  },
  {
    "path": "src/asp/Camera/LinescanPleiadesModel.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Core/StereoSettings.h>\n#include <asp/Camera/PleiadesXML.h>\n#include <asp/Camera/LinescanPleiadesModel.h>\n#include <asp/Camera/CsmModel.h>\n#include <asp/Camera/CsmUtils.h>\n#include <vw/Camera/CameraSolve.h>\n#include <vw/Camera/OrbitalCorrections.h>\n#include <usgscsm/UsgsAstroLsSensorModel.h>\n\n// This class implements the Pleiades linescan model\n// based on the CSM model.\n// TODO(oalexan1): Need to think more about the desired precision of the CSM\n// model. Need high accuracy for bundle adjustment, but may get away\n// with less for mapprojection. For now, err towards more accuracy.\nnamespace asp {\n// Constructor\nPleiadesCameraModel::\nPleiadesCameraModel(double time_t0, double time_dt,\n                    std::vector<vw::Vector3> const& positions,\n                    std::vector<vw::Vector3> const& velocities,\n                    double pos_t0, double pos_dt,\n                    bool isNeoOrSpot67, double t0Quat, double dtQuat,\n                    double quat_offset_time, double quat_scale,\n                    std::vector<vw::Vector<double, 4>>  const& quaternion_coeffs,\n                    vw::Vector2                         const& coeff_psi_x,\n                    vw::Vector2                         const& coeff_psi_y,\n                    vw::Vector2i                        const& image_size,\n                    double min_time, double max_time,\n                    int ref_col, int ref_row, double accuracy_stdv):\n  m_positions(positions), m_velocities(velocities),\n  m_pos_t0(pos_t0), m_pos_dt(pos_dt),\n  m_isNeoOrSpot67(isNeoOrSpot67), m_t0Quat(t0Quat), m_dtQuat(dtQuat),\n  m_quat_offset_time(quat_offset_time), m_quat_scale(quat_scale),\n  m_quaternion_coeffs(quaternion_coeffs),\n  m_time_t0(time_t0), m_time_dt(time_dt),\n  m_coeff_psi_x(coeff_psi_x), m_coeff_psi_y(coeff_psi_y),\n  m_min_time(min_time), m_max_time(max_time), m_ref_col(ref_col), m_ref_row(ref_row),\n  m_image_size(image_size), m_accuracy_stdv(accuracy_stdv) {\n\n  populateCsmModel();\n}\n\nvoid PleiadesCameraModel::populateCsmModel() {\n\n  // Populate CsmModel class members\n  // Do not use a precision below 1.0-e8 as then the linescan model will return junk.\n  m_desired_precision = asp::DEFAULT_CSM_DESIRED_PRECISION;\n  vw::cartography::Datum datum(\"WGS84\"); // this sensor is used for Earth only\n  m_semi_major_axis = datum.semi_major_axis();\n  m_semi_minor_axis = datum.semi_minor_axis();\n  \n  // Create the linescan model\n  m_gm_model = boost::make_shared<UsgsAstroLsSensorModel>(); // m_gm_model will manage the deallocation\n  m_ls_model = dynamic_cast<UsgsAstroLsSensorModel*>(m_gm_model.get()); // pointer to ls model\n  if (m_ls_model == NULL)\n    vw::vw_throw(vw::ArgumentErr() << \"Invalid initialization of the linescan model.\\n\");\n\n  // This performs many initializations apart from the above\n  m_ls_model->reset();\n\n  // Override some initializations\n  m_ls_model->m_nSamples = m_image_size[0]; \n  m_ls_model->m_nLines   = m_image_size[1];\n  m_ls_model->m_platformFlag = 1; // explicitly set to 1, to have order 8 Lagrange interpolation\n  m_ls_model->m_maxElevation =  10000.0; //  10 km\n  m_ls_model->m_minElevation = -10000.0; // -10 km\n  m_ls_model->m_focalLength  = 1.0;\n  m_ls_model->m_zDirection   = 1.0;\n  m_ls_model->m_halfSwath    = 1.0;\n  m_ls_model->m_sensorIdentifier = \"Pleiades\";\n  m_ls_model->m_majorAxis = m_semi_major_axis;\n  m_ls_model->m_minorAxis = m_semi_minor_axis;\n  \n  m_ls_model->m_iTransL[0]   = 0.0;  \n  m_ls_model->m_iTransL[1]   = 1.0; // no scale\n  m_ls_model->m_iTransL[2]   = 0.0; // no skew\n  m_ls_model->m_iTransS[0]   = 0.0;\n  m_ls_model->m_iTransS[1]   = 0.0; // no skew\n  m_ls_model->m_iTransS[2]   = 1.0; // no scale\n\n  // Quantities needed to find the ray direction in the sensor plane.\n  // This needs to be consistent with usgscsm functions\n  // computeDistortedFocalPlaneCoordinates() and\n  // createCameraLookVector(), which requires a lot of care.\n  // Need to emulate this\n  // double x = m_coeff_psi_x[0] + m_coeff_psi_x[1] * (col  + m_ref_col);\n  // double y = m_coeff_psi_y[0] + m_coeff_psi_y[1] * (col  + m_ref_col);\n  // Using this:\n  // double detSample = (col + 0.5) * sampleSumming + startingSample;\n  // double detLine = line * lineSumming + startingLine; // but it will use line = 0\n  \n  m_ls_model->m_detectorLineSumming   = 1.0;\n  m_ls_model->m_detectorSampleSumming = -m_coeff_psi_x[1];\n  \n  // Keep entries below at 0. Modify instead the detector line and sample\n  // origin. The effect is same as all USGSCSM code uses m_detectorLineOrigin -\n  // m_startingDetectorLine, and the same for the sample.\n  m_ls_model->m_startingDetectorLine   = 0.0;\n  m_ls_model->m_startingDetectorSample = 0.0;\n  \n  // Optical center\n  m_ls_model->m_detectorLineOrigin   = -m_coeff_psi_y[0]; // note: m_coeff_psi_y[1] = 0\n  m_ls_model->m_detectorSampleOrigin = m_coeff_psi_x[0] + m_coeff_psi_x[1] * (m_ref_col - 0.5);\n\n  // Time\n  m_ls_model->m_intTimeLines.push_back(1.0); // to offset CSM's quirky 0.5 additions\n  m_ls_model->m_intTimeStartTimes.push_back(m_time_t0);\n  m_ls_model->m_intTimes.push_back(m_time_dt);\n  int num_pos = m_positions.size();\n  if ((size_t)num_pos != m_velocities.size())\n    vw::vw_throw(vw::ArgumentErr() << \"Expecting as many positions as velocities.\\n\");\n\n  // Positions and velocities\n  m_ls_model->m_numPositions = 3 * num_pos; // concatenate all coordinates\n  m_ls_model->m_t0Ephem = m_pos_t0;\n  m_ls_model->m_dtEphem = m_pos_dt;\n  m_ls_model->m_positions.resize(m_ls_model->m_numPositions);\n  m_ls_model->m_velocities.resize(m_ls_model->m_numPositions);\n  for (int pos_it = 0; pos_it < num_pos; pos_it++) {\n    for (int coord = 0; coord < 3; coord++) {\n      m_ls_model->m_positions [3*pos_it + coord] = m_positions[pos_it][coord];\n      m_ls_model->m_velocities[3*pos_it + coord] = m_velocities[pos_it][coord];\n    }\n  }\n\n  // Quaternions. For NEO these are tabulated, while for 1A/1B they come\n  // from sampling a polynomial. In the latter case, \n  // quaternions are sampled over the range of times for which the position\n  // and velocity are available, which a way longer range than the time spent\n  // acquiring image lines.\n  // TODO(oalexan1): What is the right factor (inverse of sampling rate)?\n  if (m_isNeoOrSpot67) {\n    m_ls_model->m_numQuaternions = 4 * m_quaternion_coeffs.size();\n    m_ls_model->m_t0Quat = m_t0Quat;\n    m_ls_model->m_dtQuat = m_dtQuat;\n  } else {\n    int factor = 100;\n    // quaternion t0, borrow from position t0\n    m_ls_model->m_t0Quat = m_ls_model->m_t0Ephem; \n    // quaternion dt, borrow from position dt\n    m_ls_model->m_dtQuat = m_ls_model->m_dtEphem / factor; \n    // Great care is needed here. Number of samples is obtained\n    // by dividing the range of times by the sampling rate, and\n    // then adding one. \n    double beg_time = m_ls_model->m_t0Ephem;\n    double end_time = beg_time + m_ls_model->m_dtEphem * (num_pos - 1);\n    int num_new_pos = (int)round((end_time - beg_time) / m_ls_model->m_dtQuat) + 1;\n    m_ls_model->m_numQuaternions = 4 * num_new_pos;\n  }\n\n  m_ls_model->m_quaternions.resize(m_ls_model->m_numQuaternions);\n  for (int pos_it = 0; pos_it < m_ls_model->m_numQuaternions / 4; pos_it++) {\n    vw::Quat q;\n    if (m_isNeoOrSpot67) {\n      vw::Vector<double, 4> const& v = m_quaternion_coeffs[pos_it]; // alias\n      q = vw::Quat(v[0], v[1], v[2], v[3]); // order is w, x, y, z\n    } else {\n      // Sample the polynomial\n      double t = m_ls_model->m_t0Quat + pos_it * m_ls_model->m_dtQuat;\n      q = get_camera_pose_at_time(t);\n    }\n\n    // ASP stores the quaternions as (w, x, y, z). CSM wants them as\n    // x, y, z, w.\n    int coord = 0;\n    m_ls_model->m_quaternions[4*pos_it + coord] = q.x(); coord++;\n    m_ls_model->m_quaternions[4*pos_it + coord] = q.y(); coord++;\n    m_ls_model->m_quaternions[4*pos_it + coord] = q.z(); coord++;\n    m_ls_model->m_quaternions[4*pos_it + coord] = q.w(); coord++;\n  }\n\n  // Quaternions must always be normalized and not change suddenly in sign.\n  asp::normalizeQuaternions(m_ls_model);\n\n  // Re-creating the model from the state forces some operations to\n  // take place which are inaccessible otherwise.\n  std::string modelState = m_ls_model->getModelState();\n  m_ls_model->replaceModelState(modelState);\n  \n  // Adjust the CSM model to correct for velocity aberration and atmospheric\n  // refraction, if desired. This can only happen after the model is fully initialized, as\n  // need to create rays from the camera center to the ground.\n  // TODO(oalexan1): Use more precise values below.\n  double local_earth_radius = vw::DEFAULT_EARTH_RADIUS;\n  double mean_ground_elevation = vw::DEFAULT_SURFACE_ELEVATION;\n  asp::orbitalCorrections(this, \n                          asp::stereo_settings().enable_velocity_aberration_correction,\n                          asp::stereo_settings().enable_atmospheric_refraction_correction,\n                          local_earth_radius, mean_ground_elevation);\n}\n  \nvw::Vector3 PleiadesCameraModel::camera_center(vw::Vector2 const& pix) const {\n  csm::ImageCoord csm_pix;\n  asp::toCsmPixel(pix, csm_pix);\n\n  double time = m_ls_model->getImageTime(csm_pix);\n  csm::EcefCoord ecef = m_ls_model->getSensorPosition(time);\n\n  return vw::Vector3(ecef.x, ecef.y, ecef.z);\n}\n\nvw::Vector3 PleiadesCameraModel::pixel_to_vector(vw::Vector2 const& pix) const {\n  csm::ImageCoord csm_pix;\n  asp::toCsmPixel(pix, csm_pix);\n  \n  csm::EcefLocus locus = m_ls_model->imageToRemoteImagingLocus(csm_pix);\n  return vw::Vector3(locus.direction.x, locus.direction.y, locus.direction.z);\n}\n  \nvw::Vector2 PleiadesCameraModel::point_to_pixel(vw::Vector3 const& point) const {\n\n  csm::EcefCoord ecef(point[0], point[1], point[2]);\n  \n  // Do not show warnings, it becomes too verbose\n  double achievedPrecision = -1.0;\n  csm::WarningList warnings;\n  csm::WarningList * warnings_ptr = NULL;\n  bool show_warnings = false;\n  csm::ImageCoord csm_pix = m_ls_model->groundToImage(ecef, m_desired_precision,\n                                                      &achievedPrecision, warnings_ptr);\n  \n  vw::Vector2 asp_pix;\n  asp::fromCsmPixel(asp_pix, csm_pix);\n  return asp_pix;\n}\n  \n// This function is tricky to implement \nvw::Quaternion<double> PleiadesCameraModel::camera_pose(vw::Vector2 const& pix) const {\n  // This is not implemented for now for the CSM model\n  vw_throw(vw::NoImplErr() << \"LinescanPleiadesModel: Cannot retrieve camera_pose!\");\n  return vw::Quaternion<double>();\n}\n  \n// Allow finding the time at any line, even negative ones. Here a\n// simple slope-intercept formula is used rather than a table so one\n// cannot run out of bounds. Page 76 in the doc.\ndouble PleiadesCameraModel::get_time_at_line(double line) const {\n  csm::ImageCoord csm_pix;\n  asp::toCsmPixel(vw::Vector2(0, line), csm_pix);\n  return m_ls_model->getImageTime(csm_pix);\n}\n \n// Throw an exception if the input time is outside the given\n// bounds. The valid range is much bigger than the range of times\n// at which image lines are recorded. It is rather the range at\n// which positions, velocities, and quaternions are tabulated.\nvoid PleiadesCameraModel::check_time(double time, std::string const& location) const {\n  if ((time < m_min_time) || (time > m_max_time))\n    vw::vw_throw(vw::ArgumentErr() << \"PleiadesCameraModel::\"<<location\n                 << \": Requested time \"<<time<<\" is out of bounds (\"\n                 << m_min_time << \" <-> \"<<m_max_time<<\")\\n\");\n}\n\nvw::Vector3 PleiadesCameraModel::get_camera_center_at_time(double time) const {\n  // TODO(oalexan1): This needs more testing. Normally it is not invoked.\n  csm::EcefCoord ecef = m_ls_model->getSensorPosition(time);\n  return vw::Vector3(ecef.x, ecef.y, ecef.z);\n}\n  \nvw::Vector3 PleiadesCameraModel::get_camera_velocity_at_time(double time) const { \n  // TODO(oalexan1): This needs testing.\n  csm::EcefVector ecef = m_ls_model->getSensorVelocity(time);\n  return vw::Vector3(ecef.x, ecef.y, ecef.z);\n}\n\n// Compute the quaternion at given time using the polynomial\n// expression (doc page 77). This should work whether or not the CSM\n// model is used. This applies only to L1A/B products, and not to the NEO\n// product, when the quaternions are tabulated instead.\nvw::Quat PleiadesCameraModel::get_camera_pose_at_time(double time) const {\n\n  if (m_isNeoOrSpot67)\n    vw::vw_throw(vw::NoImplErr() << \"PleiadesCameraModel: Cannot compute camera pose \"\n      << \"from polynomial for NEO products. This is a programmer error.\\n\");\n\n  double scaled_t = (time - m_quat_offset_time) / m_quat_scale;\n\n  if (m_quaternion_coeffs.size() != 4)\n    vw::vw_throw(vw::ArgumentErr() << \"Expecting four quaternions.\\n\");\n  \n  vw::Vector<double, 4> v(0, 0, 0, 0); // future quaternion\n  double tn = 1.0; // scaled_t to the power of n\n  for (size_t it = 0; it < 4; it++) {\n\n    for (size_t coord = 0; coord < 4; coord++)\n      v[coord] += m_quaternion_coeffs[coord][it] * tn;\n    \n    tn *= scaled_t;\n  }\n  \n  return vw::Quaternion<double>(v[0], v[1], v[2], v[3]); // order is w, x, y, z\n}\n\n// The pointing vector in sensor coordinates. This function is now not used,\n// because CSM does the work. \n// Page 76 in the doc.\nvw::Vector3 PleiadesCameraModel::get_local_pixel_vector(vw::Vector2 const& pix) const {\n\n  double col = pix[0];\n  double row = pix[1];\n  \n  // The doc says to subtract m_ref_col, while it was found\n  // experimentally that one needs to add it.\n  double x = m_coeff_psi_x[0] + m_coeff_psi_x[1] * (col  + m_ref_col);\n\n  // Note how below col (and not row) is used, per the Pleiades doc.\n  // Note that m_coeff_psi_y[1] is 0.\n  double y = m_coeff_psi_y[0] + m_coeff_psi_y[1] * (col  + m_ref_col);\n\n  vw::Vector3 result = vw::Vector3(y, -x, 1.0);\n\n  // Make the direction have unit length\n  result = normalize(result);\n\n  return result;\n}\n\n// Shared implementation for loading Pleiades/NEO/SPOT 6/7 camera models.\n// The sensor model and XML structure are the same for all these sensors.\nboost::shared_ptr<PleiadesCameraModel>\nload_pleiades_family_camera_model(PleiadesXML & xml_reader) {\n\n  // Time at line = time_t0 + time_dt * line\n  double time_t0 = 0, time_dt = 0;\n  xml_reader.setup_time_func(time_t0, time_dt);\n\n  // Position and velocity samples with uniform time grid\n  std::vector<vw::Vector3> positions, velocities;\n  double pos_t0 = 0, pos_dt = 0, pos_tend = 0;\n  double vel_t0 = 0, vel_dt = 0, vel_tend = 0;\n  xml_reader.setup_position_func(time_t0, time_dt, positions, pos_t0, pos_dt, pos_tend);\n  xml_reader.setup_velocity_func(time_t0, time_dt, velocities, vel_t0, vel_dt, vel_tend);\n\n  // Set up the quaternions for NEO. This will create xml_reader m_t0Quat,\n  // m_dtQuat, m_quaternion_coeffs.\n  if (xml_reader.m_isNeoOrSpot67)\n    xml_reader.setup_pose_func(time_t0, time_dt);\n\n  // Find the range of times for which we can solve for position and pose\n  double min_time = std::max(pos_t0, vel_t0);\n  double max_time = std::min(pos_tend, vel_tend);\n\n  // Create the model. This can throw an exception.\n  boost::shared_ptr<PleiadesCameraModel> cam\n    (new PleiadesCameraModel(time_t0, time_dt, positions, velocities,\n                             pos_t0, pos_dt,\n                             xml_reader.m_isNeoOrSpot67,\n                             xml_reader.m_t0Quat,\n                             xml_reader.m_dtQuat,\n                             xml_reader.m_quat_offset_time,\n                             xml_reader.m_quat_scale,\n                             xml_reader.m_quaternion_coeffs,\n                             xml_reader.m_coeff_psi_x,\n                             xml_reader.m_coeff_psi_y,\n                             xml_reader.m_image_size,\n                             min_time, max_time,\n                             xml_reader.m_ref_col, xml_reader.m_ref_row,\n                             xml_reader.m_accuracy_stdv));\n  \n  return cam;\n}\n\nboost::shared_ptr<PleiadesCameraModel>\nload_pleiades_camera_model_from_xml(std::string const& path) {\n\n  PleiadesXML xml_reader;\n  xml_reader.read_xml(path);\n\n  // Only accept Pleiades sensors, not SPOT 6/7\n  if (xml_reader.m_sensor_name != \"PHR_SENSOR\" &&\n      xml_reader.m_sensor_name != \"PNEO_SENSOR\")\n    vw::vw_throw(vw::ArgumentErr() << \"Expected a Pleiades sensor, got: \"\n                 << xml_reader.m_sensor_name << \".\\n\");\n\n  return load_pleiades_family_camera_model(xml_reader);\n}\n\nboost::shared_ptr<PleiadesCameraModel>\nload_spot_camera_model_from_xml(std::string const& path) {\n\n  PleiadesXML xml_reader;\n  xml_reader.read_xml(path);\n\n  // Only accept SPOT 6/7 sensors\n  if (xml_reader.m_sensor_name != \"S6_SENSOR\" &&\n      xml_reader.m_sensor_name != \"S7_SENSOR\")\n    vw::vw_throw(vw::ArgumentErr() << \"Expected a SPOT 6/7 sensor, got: \"\n                 << xml_reader.m_sensor_name << \".\\n\");\n\n  return load_pleiades_family_camera_model(xml_reader);\n} // End function load_spot_camera_model()\n\n} // end namespace asp\n\n"
  },
  {
    "path": "src/asp/Camera/LinescanPleiadesModel.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file LinescanPleiadesModel.h\n///\n/// Linescan camera model for Pleiades. Implemented based on\n///  Pleiades Imagery User Guide\n/// https://www.intelligence-airbusds.com/automne/api/docs/v1.0/document/download/ZG9jdXRoZXF1ZS1kb2N1bWVudC01NTY0Mw==/ZG9jdXRoZXF1ZS1maWxlLTU1NjQy/airbus-pleiades-imagery-user-guide-15042021.pdf\n///\n#ifndef __STEREO_CAMERA_LINESCAN_PLEIADES_MODEL_H__\n#define __STEREO_CAMERA_LINESCAN_PLEIADES_MODEL_H__\n\n#include <vw/Math/Matrix.h>\n#include <vw/Camera/LinescanModel.h>\n#include <vw/Camera/PinholeModel.h>\n#include <asp/Camera/CsmModel.h>\n\n// Forward declaration\nclass UsgsAstroLsSensorModel;\n\nnamespace asp {\n\n  // Adaptation of CsmModel for handling Pleiades metatdata\n  class PleiadesCameraModel: public asp::CsmModel {\n\n  public:\n    //------------------------------------------------------------------\n    // Constructors / Destructors\n    //------------------------------------------------------------------\n    PleiadesCameraModel(double time_t0, double time_dt,\n                        std::vector<vw::Vector3> const& positions,\n                        std::vector<vw::Vector3> const& velocities,\n                        double pos_t0, double pos_dt,\n                        bool isNeoOrSpot67, double m_t0Quat, double m_dtQuat,\n                        double quat_offset_time, double quat_scale,\n                        std::vector<vw::Vector<double, 4>>  const& quaternion_coeffs,\n                        vw::Vector2                         const& coeff_psi_x,\n                        vw::Vector2                         const& coeff_psi_y,\n                        vw::Vector2i                        const& image_size,\n                        double min_time, double max_time,\n                        int ref_col, int ref_row, double accuracy_stdv);\n    \n    virtual ~PleiadesCameraModel() {}\n    virtual std::string type() const { return \"LinescanPleiades\"; }\n\n    // This set of functions implements virtual functions from LinescanModel.h\n\n    // Implement the functions from the LinescanModel class using functors\n    virtual vw::Vector3 get_camera_center_at_time  (double time) const;\n    virtual vw::Vector3 get_camera_velocity_at_time(double time) const;\n    virtual vw::Quat    get_camera_pose_at_time    (double time) const;\n    virtual double      get_time_at_line           (double line) const;\n\n    // Camera pose\n    virtual vw::Quaternion<double> camera_pose(vw::Vector2 const& pix) const; \n\n    // Gives a pointing vector in the world coordinates.\n    virtual vw::Vector3 pixel_to_vector(vw::Vector2 const& pix) const;\n\n    /// Gives the camera position in world coordinates.\n    virtual vw::Vector3 camera_center(vw::Vector2 const& pix) const;\n\n    /// As pixel_to_vector, but in the local camera frame.\n    virtual vw::Vector3 get_local_pixel_vector(vw::Vector2 const& pix) const;\n\n    virtual vw::Vector2 point_to_pixel(vw::Vector3 const& point) const;\n\n    // Horizontal accuracy standard deviation\n    double m_accuracy_stdv;\n\n  private:\n\n    void populateCsmModel();\n    \n    double m_time_t0, m_time_dt; ///< Time at line = m_time_t0 + m_time_dt * line\n    std::vector<vw::Vector3> m_positions; ///< Position samples\n    std::vector<vw::Vector3> m_velocities; ///< Velocity samples\n    double m_pos_t0, m_pos_dt; ///< Position/velocity time grid\n\n    // These are used to find the look direction in camera coordinates at a given line\n    vw::Vector2 m_coeff_psi_x, m_coeff_psi_y;\n\n    /// These are the limits of when he have position data available.\n    double m_min_time, m_max_time;\n    \n    // These will be used to fit the quaternions\n    bool m_isNeoOrSpot67;\n    double m_t0Quat, m_dtQuat;\n    double m_quat_offset_time, m_quat_scale;\n    std::vector<vw::Vector<double, 4>> m_quaternion_coeffs;\n\n    // Relative column and row (here indices start from 0, not from 1 as in the doc)\n    int m_ref_row, m_ref_col;\n\n    // Throw an exception if the input time is outside the given\n    // bounds. The valid range is much bigger than the range of times\n    // at which image lines are recorded. It is rather the range at\n    // which positions, velocities, and quaternions are tabulated.\n    void check_time(double time, std::string const& location) const;\n\n    // Pointer to linescan sensor. It will be managed by CsmModel::m_gm_model\n    UsgsAstroLsSensorModel * m_ls_model;\n\n    vw::Vector2i m_image_size;\n    \n  }; // End class PleiadesCameraModel\n\n  // Non-class functions\n  \n  /// Load a Pleiades camera model from an XML file.\n  /// - This function does not take care of Xerces XML init/de-init, the caller must\n  ///   make sure this is done before/after this function is called!\n  boost::shared_ptr<PleiadesCameraModel>\n  load_pleiades_camera_model_from_xml(std::string const& path);\n\n  /// Load a SPOT 6/7 camera model from a DIMAP V2 XML file.\n  /// Uses the same camera model as Pleiades NEO.\n  boost::shared_ptr<PleiadesCameraModel>\n  load_spot_camera_model_from_xml(std::string const& path);\n\n} // end namespace asp\n\n\n#endif//__STEREO_CAMERA_LINESCAN_PLEIADES_MODEL_H__\n"
  },
  {
    "path": "src/asp/Camera/LinescanSpotModel.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Camera/CsmModel.h>\n#include <asp/Camera/CsmModelFit.h>\n#include <asp/Camera/CsmUtils.h>\n#include <asp/Camera/LinescanSpotModel.h>\n#include <asp/Camera/SPOT_XML.h>\n#include <asp/Core/CameraTransforms.h>\n\n#include <vw/Cartography/Datum.h>\n#include <vw/Math/QuatInterp.h>\n\n#include <usgscsm/UsgsAstroLsSensorModel.h>\n#include <usgscsm/Distortion.h>\n\nnamespace asp {\n\nusing vw::Vector3;\nusing vw::Matrix3x3;\n\n// Compute the local orbital frame from satellite position and velocity.\n// From the SPOT 123-4-5 Geometry Handbook (GAEL-P135-DOC-001), Eq. 7a-c.\n//   Z2 = normalize(pos), X2 = normalize(vel x Z2), Y2 = Z2 x X2\n// Returns the matrix [X2 | Y2 | Z2] that converts from orbital to GCC.\nMatrix3x3 get_local_orbital_frame(Vector3 const& position, Vector3 const& velocity) {\n  Vector3 Z2 = vw::math::normalize(position);\n  Vector3 X2 = vw::math::normalize(vw::math::cross_prod(velocity, Z2));\n  Vector3 Y2 = vw::math::cross_prod(Z2, X2);\n  Matrix3x3 out;\n  for (int r = 0; r < 3; r++) {\n    out(r,0) = X2[r];\n    out(r,1) = Y2[r];\n    out(r,2) = Z2[r];\n  }\n  return out;\n}\n\n// Compute the look rotation matrix Mp*Mr*My from yaw, pitch, roll.\n// From the SPOT 123-4-5 Geometry Handbook (GAEL-P135-DOC-001), Eq. 11a-e.\n// Converts a look vector from the navigation frame (O1) to the orbital frame (O2).\nMatrix3x3 get_look_rotation_matrix(double yaw, double pitch, double roll) {\n  double cp = cos(pitch);\n  double sp = sin(pitch);\n  double cr = cos(roll);\n  double sr = sin(roll);\n  double cy = cos(yaw);\n  double sy = sin(yaw);\n\n  Matrix3x3 M;\n  M(0,0) = (cr*cy);            M(0,1) = (-cr*sy);           M(0,2) = (-sr);\n  M(1,0) = (cp*sy+sp*sr*cy);   M(1,1) = (cp*cy-sp*sr*sy);   M(1,2) = (sp*cr);\n  M(2,0) = (-sp*sy+cp*sr*cy);  M(2,1) = (-sp*cy-cp*sr*sy);  M(2,2) = cp*cr;\n  return M;\n}\n\n// Load a SPOT5 CSM camera model. Populates CSM with vendor extrinsics\n// directly (positions, velocities, quaternions from XML), then fits\n// only intrinsics (focal length, optical center, distortion) to match\n// the vendor's per-column look angle table.\nboost::shared_ptr<CsmModel>\nload_spot5_csm_camera_model_from_xml(std::string const& path) {\n\n  // Parse the SPOT5 XML file\n  SpotXML xml_reader;\n  xml_reader.read_xml(path);\n\n  // Get the interpolation functors for position/velocity (for quaternion conversion)\n  vw::LagrangianInterpolation position_func = xml_reader.setup_position_func();\n  vw::LagrangianInterpolation velocity_func = xml_reader.setup_velocity_func();\n  vw::LinearTimeInterpolation time_func     = xml_reader.setup_time_func();\n\n  // Extract raw position/velocity data with times\n  std::vector<vw::Vector3> positions, velocities;\n  std::vector<double> pos_times;\n  for (auto iter = xml_reader.position_logs.begin();\n       iter != xml_reader.position_logs.end(); iter++) {\n    double t = xml_reader.convert_time(iter->first);\n    pos_times.push_back(t);\n    positions.push_back(iter->second);\n  }\n  for (auto iter = xml_reader.velocity_logs.begin();\n       iter != xml_reader.velocity_logs.end(); iter++)\n    velocities.push_back(iter->second);\n\n  // Compute uniform ephemeris time grid\n  double t0_ephem = pos_times.front();\n  double dt_ephem = (pos_times.back() - pos_times.front()) / (pos_times.size() - 1.0);\n\n  // Warn if ephemeris time grid is not uniform (1e-3 relative tolerance)\n  for (size_t i = 1; i < pos_times.size(); i++) {\n    double dt_i = pos_times[i] - pos_times[i-1];\n    if (std::abs(dt_i - dt_ephem) > 1e-3 * std::abs(dt_ephem))\n      vw::vw_out(vw::WarningMessage) << \"SPOT5: non-uniform ephemeris spacing at \"\n        << \"sample \" << i << \": dt = \" << dt_i << \" vs expected \" << dt_ephem << \"\\n\";\n  }\n\n  // Extract raw pose data and convert yaw/pitch/roll to GCC quaternions.\n  vw::LinearPiecewisePositionInterpolation spot_pose_func\n    = xml_reader.setup_pose_func(time_func);\n\n  // Get pose sample times\n  std::vector<double> pose_times;\n  for (auto iter = xml_reader.pose_logs.begin();\n       iter != xml_reader.pose_logs.end(); iter++) {\n    double t = xml_reader.convert_time(iter->first);\n    pose_times.push_back(t);\n  }\n\n  // Warn if attitude time grid is not uniform (1e-3 relative tolerance)\n  if (pose_times.size() > 1) {\n    double dt_pose = (pose_times.back() - pose_times.front()) /\n                     (pose_times.size() - 1.0);\n    for (size_t i = 1; i < pose_times.size(); i++) {\n      double dt_i = pose_times[i] - pose_times[i-1];\n      if (std::abs(dt_i - dt_pose) > 1e-3 * std::abs(dt_pose))\n        vw::vw_out(vw::WarningMessage) << \"SPOT5: non-uniform attitude spacing at \"\n          << \"sample \" << i << \": dt = \" << dt_i << \" vs expected \" << dt_pose << \"\\n\";\n    }\n  }\n\n  // Pad pose times to match what setup_pose_func does (it pads at boundaries)\n  double t0_quat = spot_pose_func.get_t0();\n  double dt_quat = spot_pose_func.get_dt();\n  double tend_quat = spot_pose_func.get_tend();\n  size_t num_quat = static_cast<size_t>(round((tend_quat - t0_quat) / dt_quat));\n\n  // Axis reorientation matrix: R = diag(-1, 1, -1)\n  // Converts from vendor's navigation frame to the frame used by CSM.\n  Matrix3x3 R;\n  R(0,0) = -1.0; R(0,1) = 0.0; R(0,2) =  0.0;\n  R(1,0) =  0.0; R(1,1) = 1.0; R(1,2) =  0.0;\n  R(2,0) =  0.0; R(2,1) = 0.0; R(2,2) = -1.0;\n\n  // Convert each pose sample to a GCC rotation matrix\n  std::vector<vw::Matrix<double,3,3>> cam2world_vec(num_quat);\n  for (size_t i = 0; i < num_quat; i++) {\n    double time = t0_quat + dt_quat * static_cast<double>(i);\n    Vector3 position       = position_func(time);\n    Vector3 velocity       = velocity_func(time);\n    Vector3 yaw_pitch_roll = spot_pose_func(time);\n\n    Matrix3x3 lo_frame      = get_local_orbital_frame(position, velocity);\n    Matrix3x3 look_rotation = get_look_rotation_matrix(\n                                yaw_pitch_roll[0], yaw_pitch_roll[1], yaw_pitch_roll[2]);\n    cam2world_vec[i] = lo_frame * look_rotation * R;\n  }\n\n  // Compute intrinsics from the look angle table using the PeruSat approach:\n  // focal_length = 1.0, detector params in angle units.\n  //\n  // The local look vector is: normalize(tan(PSI_Y), tan(PSI_X), 1.0)\n  // CSM's look vector is: normalize(undist_x, undist_y, focal_length)\n  // With f=1.0: look = normalize(undist_x, undist_y, 1.0)\n  // So we need: undist_x = tan(PSI_Y(col)), undist_y = tan(PSI_X(col))\n  //\n  // The detector model computes:\n  //   distortedY = col * sampleSumming - sampleOrigin  (across-track)\n  //   distortedX = 0 * lineSumming - lineOrigin         (along-track)\n  //\n  // Fit a linear model to tan(PSI_Y) vs column. The nonlinear residual\n  // (degree 3+ curvature) is captured later by TRANSVERSE distortion.\n  //   tan(PSI_Y(col)) ~ slope_y * col + intercept_y\n  // Then: sampleSumming = slope_y, sampleOrigin = -intercept_y\n  //\n  // For PSI_X (nearly constant): lineOrigin = -tan(PSI_X_center)\n  auto const& look_angles = xml_reader.look_angles;\n  int num_cols = xml_reader.image_size[0];\n\n  // Linear fit to tan(PSI_Y) vs column index (0-based)\n  double sum_c = 0, sum_ty = 0, sum_c2 = 0, sum_cty = 0;\n  for (int c = 0; c < num_cols; c++) {\n    double ty = tan(look_angles[c].second[1]);\n    sum_c   += c;\n    sum_ty  += ty;\n    sum_c2  += c * (double)c;\n    sum_cty += c * ty;\n  }\n  double n_cols = num_cols;\n  double slope_y     = (n_cols * sum_cty - sum_c * sum_ty) /\n                       (n_cols * sum_c2 - sum_c * sum_c);\n  double intercept_y = (sum_ty - slope_y * sum_c) / n_cols;\n\n  // PSI_X is nearly constant - use center value\n  int mid_col = num_cols / 2;\n  double psi_x_center = look_angles[mid_col].second[0];\n\n  double focal_length = 1.0;\n  // optical_center is not used directly - detector origin encodes it\n  vw::Vector2 optical_center(0.0, 0.0);\n\n  // Line dating\n  double first_line_time = time_func(0);\n  double dt_line = xml_reader.line_period;\n\n  vw::cartography::Datum datum(\"WGS84\");\n  std::string sensor_id = \"SPOT5\";\n\n  // Populate CSM model fields directly. We do this instead of calling\n  // populateCsmLinescan() because positions (12 pts at 30s) and quaternions\n  // (515 pts at 0.125s) have different counts and time grids.\n  boost::shared_ptr<CsmModel> csm_model(new CsmModel());\n  csm_model->m_desired_precision = asp::DEFAULT_CSM_DESIRED_PRECISION;\n  csm_model->m_semi_major_axis = datum.semi_major_axis();\n  csm_model->m_semi_minor_axis = datum.semi_minor_axis();\n\n  csm_model->m_gm_model = boost::make_shared<UsgsAstroLsSensorModel>();\n  UsgsAstroLsSensorModel* ls =\n    dynamic_cast<UsgsAstroLsSensorModel*>(csm_model->m_gm_model.get());\n  ls->reset();\n\n  ls->m_nSamples         = xml_reader.image_size[0];\n  ls->m_nLines           = xml_reader.image_size[1];\n  ls->m_platformFlag     = 1; // order 8 Lagrange (matches vendor prescription)\n  ls->m_minElevation     = -10000.0;\n  ls->m_maxElevation     =  10000.0;\n  ls->m_focalLength      = focal_length;\n  ls->m_zDirection       = 1.0;\n  ls->m_halfSwath        = 1.0;\n  ls->m_sensorIdentifier = sensor_id;\n  ls->m_majorAxis        = datum.semi_major_axis();\n  ls->m_minorAxis        = datum.semi_minor_axis();\n\n  // Detector model: PeruSat-style, mapping pixels to angle-like values.\n  // distortedY = col * sampleSumming - sampleOrigin = slope_y * col + intercept_y\n  // distortedX = 0 - lineOrigin = tan(PSI_X_center)\n  ls->m_iTransL[0] = 0.0; ls->m_iTransL[1] = 0.0; ls->m_iTransL[2] = 1.0;\n  ls->m_iTransS[0] = 0.0; ls->m_iTransS[1] = 1.0; ls->m_iTransS[2] = 0.0;\n  ls->m_detectorSampleSumming  = slope_y;\n  ls->m_detectorSampleOrigin   = -intercept_y + 0.5 * slope_y;\n  ls->m_detectorLineSumming    = 1.0;\n  ls->m_detectorLineOrigin     = -tan(psi_x_center);\n  ls->m_startingDetectorLine   = 0.0;\n  ls->m_startingDetectorSample = 0.0;\n\n  // Line timing\n  ls->m_intTimeLines.push_back(1.0);\n  ls->m_intTimeStartTimes.push_back(first_line_time);\n  ls->m_intTimes.push_back(dt_line);\n\n  // Positions and velocities (12 pts at 30s)\n  ls->m_t0Ephem = t0_ephem;\n  ls->m_dtEphem = dt_ephem;\n  ls->m_numPositions = 3 * positions.size();\n  ls->m_positions.resize(ls->m_numPositions);\n  ls->m_velocities.resize(ls->m_numPositions);\n  for (size_t i = 0; i < positions.size(); i++)\n    for (int c = 0; c < 3; c++) {\n      ls->m_positions [3*i + c] = positions[i][c];\n      ls->m_velocities[3*i + c] = velocities[i][c];\n    }\n\n  // Convert rotation matrices to VW quaternions (w, x, y, z order)\n  std::vector<vw::Quaternion<double>> in_quats(cam2world_vec.size());\n  std::vector<double> in_quat_times(cam2world_vec.size());\n  for (size_t i = 0; i < cam2world_vec.size(); i++) {\n    double x, y, z, w;\n    asp::matrixToQuaternion(cam2world_vec[i], x, y, z, w);\n    in_quats[i] = vw::Quaternion<double>(w, x, y, z);\n    in_quat_times[i] = t0_quat + dt_quat * static_cast<double>(i);\n  }\n\n  // SLERP resample 5x to honor vendor's linear interpolation prescription.\n  // CSM uses order-8 Lagrange on quaternion components, but the vendor\n  // prescribes linear interpolation of attitude. A 5x denser grid makes\n  // Lagrange converge to linear behavior between the original samples.\n  int quat_resample_factor = 5;\n  std::vector<double> out_quat_times;\n  std::vector<vw::Quaternion<double>> out_quats;\n  asp::resampleQuatSlerp(in_quat_times, in_quats, quat_resample_factor,\n                         out_quat_times, out_quats);\n\n  double quat_t0_out = out_quat_times.front();\n  double quat_dt_out = (out_quat_times.back() - out_quat_times.front()) /\n                       (out_quat_times.size() - 1.0);\n\n  // Populate CSM quaternions (USGSCSM stores as x, y, z, w)\n  ls->m_t0Quat = quat_t0_out;\n  ls->m_dtQuat = quat_dt_out;\n  ls->m_numQuaternions = 4 * out_quats.size();\n  ls->m_quaternions.resize(ls->m_numQuaternions);\n  for (size_t i = 0; i < out_quats.size(); i++) {\n    ls->m_quaternions[4*i + 0] = out_quats[i].x();\n    ls->m_quaternions[4*i + 1] = out_quats[i].y();\n    ls->m_quaternions[4*i + 2] = out_quats[i].z();\n    ls->m_quaternions[4*i + 3] = out_quats[i].w();\n  }\n  asp::normalizeQuaternions(ls);\n\n  // TRANSVERSE distortion starting at identity\n  ls->m_distortionType = TRANSVERSE;\n  ls->m_opticalDistCoeffs.resize(20, 0.0);\n  ls->m_opticalDistCoeffs[1]  = 1.0; // x: identity for ux\n  ls->m_opticalDistCoeffs[12] = 1.0; // y: identity for uy\n\n  // Re-create from state to finalize internal bookkeeping\n  std::string modelState = ls->getModelState();\n  ls->replaceModelState(modelState);\n\n  // Fit intrinsics (focal_length, optical_center, distortion) to match\n  // the vendor's per-column look angle table. Rotations are pinned constant\n  // since extrinsics come from the vendor. Generate world sight vectors\n  // directly from the look angle table and SLERP'd quaternions.\n  {\n    // SLERP interpolator on the resampled quaternions (same data as CSM has)\n    vw::SLERPPoseInterpolation slerp_interp(out_quats, quat_t0_out, quat_dt_out);\n\n    int num_rows = xml_reader.image_size[1];\n    int d_col_fit = std::max(1, num_cols / 500); // ~500 column samples\n    int d_row_fit = std::max(1, num_rows / 3);   // ~3 rows (intrinsics same per row)\n\n    std::vector<int> col_idx, row_idx;\n    for (int c = 0; c < num_cols; c += d_col_fit)\n      col_idx.push_back(c);\n    if (col_idx.back() != num_cols - 1)\n      col_idx.push_back(num_cols - 1);\n    for (int r = 0; r < num_rows; r += d_row_fit)\n      row_idx.push_back(r);\n    if (row_idx.back() != num_rows - 1)\n      row_idx.push_back(num_rows - 1);\n\n    // Vendor look direction (Eq. 5a) is u1 = normalize(-tan(PSI_Y), tan(PSI_X), -1).\n    // The rotation matrices already include the R=diag(-1,1,-1) axis flip,\n    // so the local look vector in the rotated frame is:\n    //   u_local = normalize(tan(PSI_Y), tan(PSI_X), 1.0)\n    SightMatT world_sight_mat(row_idx.size());\n    for (size_t ri = 0; ri < row_idx.size(); ri++) {\n      world_sight_mat[ri].resize(col_idx.size());\n      double time = first_line_time + dt_line * row_idx[ri];\n      vw::Quaternion<double> q = slerp_interp(time);\n      vw::Matrix3x3 rot = q.rotation_matrix();\n      for (size_t ci = 0; ci < col_idx.size(); ci++) {\n        int c = col_idx[ci];\n        double psi_x = look_angles[c].second[0];\n        double psi_y = look_angles[c].second[1];\n        vw::Vector3 local_look = normalize(vw::Vector3(tan(psi_y), tan(psi_x), 1.0));\n        world_sight_mat[ri][ci] = rot * local_look;\n      }\n    }\n\n    int min_col = col_idx.front();\n    int min_row = row_idx.front();\n    bool fix_rotations = true;\n    asp::refineCsmLinescanFit(world_sight_mat, min_col, min_row,\n                              d_col_fit, d_row_fit, *csm_model,\n                              fix_rotations, TRANSVERSE);\n  }\n\n  return csm_model;\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Camera/LinescanSpotModel.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file LinescanSpotModel.h\n///\n/// SPOT 5 CSM camera model loader.\n\n#ifndef __STEREO_CAMERA_LINESCAN_SPOT_MODEL_H__\n#define __STEREO_CAMERA_LINESCAN_SPOT_MODEL_H__\n\n#include <boost/shared_ptr.hpp>\n\n#include <string>\n\nnamespace asp {\n\nclass CsmModel;\n\n/// Load a SPOT5 CSM camera model from an XML file.\n/// Populates CSM with vendor extrinsics (positions, velocities, quaternions)\n/// and fits intrinsics (focal length, optical center, TRANSVERSE distortion)\n/// to the vendor's per-column look angle table.\nboost::shared_ptr<CsmModel> load_spot5_csm_camera_model_from_xml(std::string const& path);\n\n} // namespace asp\n\n#endif//__STEREO_CAMERA_LINESCAN_SPOT_MODEL_H__\n"
  },
  {
    "path": "src/asp/Camera/LinescanUtils.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Functions that know about the many kinds of linescan cameras\n\n#include <asp/Camera/LinescanUtils.h>\n#include <asp/Camera/CsmModel.h>\n\nnamespace asp {\n\n// Whether the session uses a CSM linescan model.\nbool isLinescanCsmSession(std::string const& session) {\n  return (session == \"csm\"      || session == \"dg\"      ||\n          session == \"pleiades\" || session == \"spot\"     ||\n          session == \"perusat\"  || session == \"aster\"    ||\n          session == \"spot5\");\n}\n\n// Find the underlying CSM camera. Applies to all linescan CSM sessions.\n// All linescan CSM models (Pleiades, DG, PeruSat, Spot, ASTER) inherit\n// directly from CsmModel, so a simple dynamic_cast suffices.\nasp::CsmModel * csm_model(boost::shared_ptr<vw::camera::CameraModel> cam) {\n\n  // In some places the camera models have an external adjustment.\n  // If that is the case, this function only works if the adjustment\n  // is the identity, as it does not know how to apply it.\n  vw::camera::AdjustedCameraModel *adj_cam\n    = dynamic_cast<vw::camera::AdjustedCameraModel*>(cam.get());\n  if (adj_cam != NULL) {\n    vw::Matrix4x4 ecef_transform = adj_cam->ecef_transform();\n    // must be the identity\n    if (ecef_transform != vw::math::identity_matrix<4>())\n      vw::vw_throw(vw::ArgumentErr()\n        << \"A CSM camera with an adjustment such as coming from \"\n        << \"--bundle-adjust-prefix detected. Not supported in this workflow.\\n\");\n  }\n\n  asp::CsmModel * csm_model\n    = dynamic_cast<asp::CsmModel*>(vw::camera::unadjusted_model(cam.get()));\n\n  if (csm_model == NULL)\n      vw::vw_throw(vw::ArgumentErr() << \"Expected a CSM camera model.\");\n\n  return csm_model;\n}\n\n} // end namespace asp"
  },
  {
    "path": "src/asp/Camera/LinescanUtils.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file LinescanUtils.h\n\n// Functions that know about the many kinds of linescan cameras\n\n#ifndef __ASP_CAMERA_LINESCAN_UTILS_H__\n#define __ASP_CAMERA_LINESCAN_UTILS_H__\n\n#include <vw/Camera/CameraModel.h>\n\nnamespace asp {\n\n  // Whether the session uses a CSM linescan model (directly or via a wrapper).\n  // This is true for csm, dg, pleiades, spot, perusat, and aster.\n  bool isLinescanCsmSession(std::string const& session);\n\n  // Find the underlying CSM camera. Applies to all linescan CSM sessions.\n  class CsmModel;\n  CsmModel * csm_model(boost::shared_ptr<vw::camera::CameraModel> cam);\n\n} // end namespace asp\n\n#endif //__ASP_CAMERA_LINESCAN_UTILS_H__"
  },
  {
    "path": "src/asp/Camera/MapprojectImage.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file MapprojectImage.cc\n/// Algorithms specific to mapprojecting images.\n// Much templated logic here that is very slow to compile.\n// It is best to avoid adding more code here.\n\n#include <asp/Camera/MapprojectImage.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/AspStringUtils.h>\n#include <asp/IsisIO/IsisSpecialPixels.h>\n\n#include <vw/Cartography/PointImageManipulation.h>\n#include <vw/Cartography/Map2CamTrans.h>\n#include <vw/Cartography/PointImageManipulation.h>\n#include <vw/Cartography/GeoReferenceUtils.h>\n#include <vw/Image/Filter.h>\n#include <vw/Image/ImageChannels.h>\n#include <vw/Image/RoundAndClamp.h>\n#include <vw/FileIO/FileUtils.h>\n\n#include <boost/filesystem.hpp>\n\nnamespace fs = boost::filesystem;\n\nnamespace asp {\n\nusing namespace vw;\nusing namespace vw::cartography;\n\ntemplate <class ImageT>\nvoid write_parallel_cond(std::string              const& filename,\n                         ImageViewBase<ImageT>    const& image,\n                         GeoReference             const& georef,\n                         bool has_nodata, double nodata_val,\n                         asp::MapprojOptions      const& opt,\n                         TerminalProgressCallback const& tpc) {\n\n  // Write names of the bundle adjust prefix, input image file, camera file,    \n  // dem, and session type. Those will be used in StereoSession to load the\n  // mapprojected image.\n  // There is no difference between pinhole and nadirpinhole when it comes\n  // to how mapprojection happens, that becomes important only in stereo.\n  std::string session_type = opt.stereo_session;\n  if (session_type == \"isismapisis\")\n    session_type = \"isis\";\n  if (session_type == \"rpcmaprpc\")\n    session_type = \"rpc\";\n  if (session_type == \"pinholemappinhole\" || session_type == \"nadirpinhole\")\n    session_type = \"pinhole\";\n  \n  // Save some keywords that we will check later when using the mapprojected file\n\n  std::map<std::string, std::string> keywords;\n  if (!opt.noGeoHeaderInfo) {\n    std::string prefix = asp::stereo_settings().bundle_adjust_prefix;;\n    if (prefix == \"\") prefix = \"NONE\"; // to save the field, need to make it non-empty\n    keywords[\"BUNDLE_ADJUST_PREFIX\" ] = prefix;\n    keywords[\"CAMERA_MODEL_TYPE\" ]    = session_type;\n    keywords[\"INPUT_IMAGE_FILE\" ]     = opt.image_file;\n    keywords[\"CAMERA_FILE\" ]          = opt.camera_file;\n\n    // Save the camera adjustment. That is an important record\n    // for how the image got mapprojected and is good to keep.\n    Vector3 t(0, 0, 0);\n    vw::Quaternion<double> q(1, 0, 0, 0);\n    vw::camera::AdjustedCameraModel * adj_cam\n      = dynamic_cast<vw::camera::AdjustedCameraModel*>(opt.camera_model.get());\n    if (adj_cam != NULL) {\n      q = adj_cam->rotation();\n      t = adj_cam->translation();\n    }\n    \n    std::ostringstream osq;\n    osq.precision(17);\n    osq << q.w() << \",\" << q.x() << \",\" << q.y() << \",\" << q.z();\n    keywords[\"ADJUSTMENT_QUATERNION\"] = osq.str();\n    \n    std::ostringstream ost;\n    ost.precision(17);\n    ost << t.x() << \",\" << t.y() << \",\" << t.z();\n    keywords[\"ADJUSTMENT_TRANSLATION\"] = ost.str();\n\n    keywords[\"DEM_FILE\"] = opt.dem_file;\n    \n    // Parse keywords from the --mo option.\n    asp::parse_append_metadata(opt.metadata, keywords);\n  }\n  \n  bool has_georef = true;\n\n  // ISIS is not thread safe so we must switch out based on what the session is.\n  vw_out() << \"Writing: \" << filename << \"\\n\";\n  if (opt.multithreaded_model) {\n    vw::cartography::block_write_gdal_image(filename, image.impl(), has_georef, georef,\n                                has_nodata, nodata_val, opt, tpc, keywords);\n  } else {\n    vw::cartography::write_gdal_image(filename, image.impl(), has_georef, georef,\n                          has_nodata, nodata_val, opt, tpc, keywords);\n  }\n\n}\n\n// If the output type is some type of int, round and clamp to this\n// type, both the pixels and the nodata-value. Else write as it is.\ntemplate <class ImageT>\nvoid write_parallel_type(std::string              const& filename,\n                         ImageT                   const& image,\n                         GeoReference             const& georef,\n                         bool has_nodata, double nodata_val,\n                         asp::MapprojOptions      const& opt,\n                         TerminalProgressCallback const& tpc) {\n\n  typedef typename ImageT::pixel_type InputType;\n\n  if (opt.output_type == \"Float32\") \n    write_parallel_cond(filename, image, georef, has_nodata, nodata_val, opt, tpc);\n  else if (opt.output_type == \"Byte\") \n    write_parallel_cond(filename,\n\t\t\tper_pixel_filter(image, RoundAndClamp<uint8, InputType>()),\n\t\t\tgeoref, has_nodata,\n\t\t\tvw::round_and_clamp<uint8>(nodata_val),\n\t\t\topt, tpc);\n  else if (opt.output_type == \"UInt16\") \n    write_parallel_cond(filename,\n\t\t\tper_pixel_filter(image, RoundAndClamp<uint16, InputType>()),\n                        georef, has_nodata,\n\t\t\tvw::round_and_clamp<uint16>(nodata_val),\n\t\t\topt, tpc);\n  else if (opt.output_type == \"Int16\") \n    write_parallel_cond(filename,\n\t\t\tper_pixel_filter(image, RoundAndClamp<int16, InputType>()),\n                        georef, has_nodata,\n\t\t\tvw::round_and_clamp<int16>(nodata_val),\n\t\t\topt, tpc);\n  else if (opt.output_type == \"UInt32\") \n    write_parallel_cond(filename,\n\t\t\tper_pixel_filter(image, RoundAndClamp<uint32, InputType>()),\n                        georef, has_nodata,\n\t\t\tvw::round_and_clamp<uint32>(nodata_val),\n\t\t\topt, tpc);\n  else if (opt.output_type == \"Int32\") \n    write_parallel_cond(filename,\n\t\t\tper_pixel_filter(image, RoundAndClamp<int32, InputType>()),\n                        georef, has_nodata,\n\t\t\tvw::round_and_clamp<int32>(nodata_val),\n\t\t\topt, tpc);\n  else\n    vw_throw( NoImplErr() << \"Unsupported output type: \" << opt.output_type << \".\\n\" );\n}\n\n// Like write_parallel_type, but for compound pixel types (e.g., PixelRGBA<float32>).\n// Uses channel_cast_round_and_clamp to convert each channel independently,\n// preserving the multi-channel pixel structure.\ntemplate <class ImageT>\nvoid write_parallel_type_multichannel(std::string              const& filename,\n                                      ImageT                   const& image,\n                                      GeoReference             const& georef,\n                                      bool has_nodata, double nodata_val,\n                                      asp::MapprojOptions      const& opt,\n                                      TerminalProgressCallback const& tpc) {\n\n  if (opt.output_type == \"Float32\")\n    write_parallel_cond(filename, image, georef, has_nodata, nodata_val, opt, tpc);\n  else if (opt.output_type == \"Byte\")\n    write_parallel_cond(filename, channel_cast_round_and_clamp<uint8>(image),\n                        georef, has_nodata,\n                        vw::round_and_clamp<uint8>(nodata_val), opt, tpc);\n  else if (opt.output_type == \"UInt16\")\n    write_parallel_cond(filename, channel_cast_round_and_clamp<uint16>(image),\n                        georef, has_nodata,\n                        vw::round_and_clamp<uint16>(nodata_val), opt, tpc);\n  else if (opt.output_type == \"Int16\")\n    write_parallel_cond(filename, channel_cast_round_and_clamp<int16>(image),\n                        georef, has_nodata,\n                        vw::round_and_clamp<int16>(nodata_val), opt, tpc);\n  else if (opt.output_type == \"UInt32\")\n    write_parallel_cond(filename, channel_cast_round_and_clamp<uint32>(image),\n                        georef, has_nodata,\n                        vw::round_and_clamp<uint32>(nodata_val), opt, tpc);\n  else if (opt.output_type == \"Int32\")\n    write_parallel_cond(filename, channel_cast_round_and_clamp<int32>(image),\n                        georef, has_nodata,\n                        vw::round_and_clamp<int32>(nodata_val), opt, tpc);\n  else\n    vw_throw(NoImplErr() << \"Unsupported output type: \" << opt.output_type << \".\\n\");\n}\n\n/// Mapproject the image with a nodata value. Used for single channel images.\n/// Input is always read as float (no template on pixel type needed since the\n/// only caller uses float).\ntemplate <class Map2CamTransT>\nvoid project_image_nodata(asp::MapprojOptions & opt,\n                          GeoReference  const& croppedGeoRef,\n                          Vector2i      const& virtual_image_size,\n                          BBox2i        const& croppedImageBB,\n                          Map2CamTransT const& transform) {\n\n    typedef PixelMask<float> ImageMaskPixelT;\n\n    // Create handle to input image to be projected on to the map\n    boost::shared_ptr<DiskImageResource> img_rsrc =\n          vw::DiskImageResourcePtr(opt.image_file);\n\n    // Disable rescaling so integer pixels (uint8, uint16, etc.) are not\n    // normalized to [0,1] when read as float. In practice, rescaling does\n    // not appear to happen in the GDAL read path even without this call,\n    // but set it explicitly as a safeguard.\n    img_rsrc->set_rescale(false);\n\n    // Update the nodata value from the input file if it is present.\n    if (img_rsrc->has_nodata_read())\n      opt.nodata_value = img_rsrc->nodata_read();\n\n    // Read as single-plane float. Multi-band images (e.g., THEMIS IR) are\n    // exposed as multiple planes by VW's GDAL reader; only the first band\n    // is used in this path (the RGB path handles multi-channel images).\n    ImageViewRef<float> disk_img = DiskImageView<float>(img_rsrc);\n    if (disk_img.planes() > 1)\n      disk_img = select_plane(disk_img, 0);\n\n    // Create masked image from input\n    ImageViewRef<ImageMaskPixelT> masked_input\n      = create_mask(disk_img, opt.nodata_value);\n\n    // For ISIS .cub files, also mask special pixels (LIS, LRS, HIS, HRS)\n    // that are not covered by the single nodata value\n    if (fs::path(opt.image_file).extension() == \".cub\")\n      asp::adjustIsisImage(opt.image_file, opt.nodata_value, masked_input);\n\n    bool            has_img_nodata = true;\n    ImageMaskPixelT nodata_mask = ImageMaskPixelT(); // invalid value for a PixelMask\n\n    if (opt.nearest_neighbor) {\n      write_parallel_type\n        (opt.output_file,\n        crop(apply_mask\n              (transform_nodata(masked_input,\n                                transform,\n                                virtual_image_size[0],\n                                virtual_image_size[1],\n                                ValueEdgeExtension<ImageMaskPixelT>(nodata_mask),\n                                NearestPixelInterpolation(), nodata_mask),\n              opt.nodata_value),\n              croppedImageBB),\n        croppedGeoRef, has_img_nodata, opt.nodata_value, opt,\n        TerminalProgressCallback(\"\",\"\"));\n    } else {\n      write_parallel_type\n        (opt.output_file,\n        crop(apply_mask\n              (transform_nodata(masked_input,\n                                transform,\n                                virtual_image_size[0],\n                                virtual_image_size[1],\n                                ValueEdgeExtension<ImageMaskPixelT>(nodata_mask),\n                                BicubicInterpolation(), nodata_mask),\n              opt.nodata_value),\n              croppedImageBB),\n        croppedGeoRef, has_img_nodata, opt.nodata_value, opt,\n        TerminalProgressCallback(\"\",\"\"));\n    }\n}\n\n/// Map project the image with an alpha channel. Used for multi-channel images.\n/// The input image is read as its native type, then channel_cast to float32\n/// (preserving values, e.g., uint8 255 becomes 255.0f). Processing happens\n/// entirely in float32. On write, channel_cast_round_and_clamp converts back\n/// to the original integer type when appropriate.\ntemplate <class Map2CamTransT>\nvoid project_image_alpha(asp::MapprojOptions & opt,\n                         ImageViewRef<PixelRGBA<float32>> const& input_image,\n                         GeoReference const& croppedGeoRef,\n                         Vector2i     const& virtual_image_size,\n                         BBox2i       const& croppedImageBB,\n                         Map2CamTransT const& transform) {\n\n    const bool has_img_nodata = false;\n    const PixelRGBA<float32> transparent_pixel = PixelRGBA<float32>();\n\n    if (opt.nearest_neighbor) {\n      write_parallel_type_multichannel\n        (opt.output_file,\n        crop(transform_nodata(input_image,\n                              transform,\n                              virtual_image_size[0],\n                              virtual_image_size[1],\n                              ConstantEdgeExtension(),\n                              NearestPixelInterpolation(), transparent_pixel),\n              croppedImageBB),\n        croppedGeoRef, has_img_nodata, opt.nodata_value, opt,\n        TerminalProgressCallback(\"\",\"\"));\n    } else {\n      write_parallel_type_multichannel\n        (opt.output_file,\n        crop(transform_nodata(input_image,\n                              transform,\n                              virtual_image_size[0],\n                              virtual_image_size[1],\n                              ConstantEdgeExtension(),\n                              BicubicInterpolation(), transparent_pixel),\n              croppedImageBB),\n        croppedGeoRef, has_img_nodata, opt.nodata_value, opt,\n        TerminalProgressCallback(\"\",\"\"));\n    }\n}\n\n// The two \"pick\" functions below select between the Map2CamTrans and Datum2CamTrans\n// transform classes which will be passed to the image projection function.\n// - TODO: Is there a good reason for the transform classes to be CRTP instead of virtual?\n\nvoid project_image_nodata_pick_transform(asp::MapprojOptions & opt,\n                          GeoReference const& dem_georef,\n                          GeoReference const& target_georef,\n                          GeoReference const& croppedGeoRef,\n                          Vector2i     const& image_size,\n                          Vector2i     const& virtual_image_size,\n                          BBox2i       const& croppedImageBB,\n                          boost::shared_ptr<camera::CameraModel> const& camera_model) {\n  const bool call_from_mapproject = true;\n  if (fs::path(opt.dem_file).extension() != \"\") {\n    // A DEM file was provided\n    return project_image_nodata(opt, croppedGeoRef,\n                                virtual_image_size, croppedImageBB,\n                                Map2CamTrans(camera_model.get(), target_georef,\n                                             dem_georef, opt.dem_file, image_size,\n                                             call_from_mapproject,\n                                             opt.nearest_neighbor));\n  } else {\n    // A constant datum elevation was provided\n    return project_image_nodata(opt, croppedGeoRef,\n                                virtual_image_size, croppedImageBB,\n                                Datum2CamTrans(camera_model.get(), target_georef,\n                                               dem_georef, opt.datum_offset,\n                                               image_size, call_from_mapproject,\n                                               opt.nearest_neighbor));\n  }\n}\n\nvoid project_image_alpha_pick_transform(asp::MapprojOptions & opt,\n                                        ImageViewRef<PixelRGBA<float32>> const& input_image,\n                                        GeoReference const& dem_georef,\n                                        GeoReference const& target_georef,\n                                        GeoReference const& croppedGeoRef,\n                                        Vector2i     const& image_size,\n                                        Vector2i     const& virtual_image_size,\n                                        BBox2i       const& croppedImageBB,\n                                        boost::shared_ptr<camera::CameraModel> const&\n                                        camera_model) {\n\n  const bool call_from_mapproject = true;\n  if (fs::path(opt.dem_file).extension() != \"\") {\n    // A DEM file was provided\n    return project_image_alpha(opt, input_image, croppedGeoRef,\n                               virtual_image_size, croppedImageBB,\n                               Map2CamTrans(camera_model.get(), target_georef,\n                                            dem_georef, opt.dem_file, image_size,\n                                            call_from_mapproject,\n                                            opt.nearest_neighbor));\n  } else {\n    // A constant datum elevation was provided\n    return project_image_alpha(opt, input_image, croppedGeoRef,\n                               virtual_image_size, croppedImageBB,\n                               Datum2CamTrans(camera_model.get(), target_georef,\n                                              dem_georef, opt.datum_offset,\n                                              image_size, call_from_mapproject,\n                                              opt.nearest_neighbor));\n  }\n}\n\n// Project the image depending on image format.\nvoid project_image(asp::MapprojOptions & opt, GeoReference const& dem_georef,\n                   GeoReference const& target_georef, GeoReference const& croppedGeoRef,\n                   Vector2i const& image_size, \n                   int virtual_image_width, int virtual_image_height,\n                   BBox2i const& croppedImageBB) {\n\n  // Prepare output directory\n  vw::create_out_dir(opt.output_file);\n  \n  // Determine the pixel type of the input image\n  boost::shared_ptr<DiskImageResource> image_rsrc = vw::DiskImageResourcePtr(opt.image_file);\n  ImageFormat image_fmt = image_rsrc->format();\n  const int num_input_channels = num_channels(image_fmt.pixel_format);\n\n  // Redirect to the correctly typed function to perform the actual map projection.\n  if (image_fmt.pixel_format == VW_PIXEL_RGB) {\n\n    // RGB processing strategy: read as native type, channel_cast to float32\n    // (preserving values: uint8 255 becomes 255.0f, not 1.0f), process entirely\n    // in float32, then write_parallel_type applies RoundAndClamp to convert back\n    // to the original integer type. This avoids heavy template instantiation for\n    // each input channel type - only the lightweight read+cast is type-specific.\n    ImageViewRef<PixelRGBA<float32>> float_image;\n    switch (image_fmt.channel_type) {\n    case VW_CHANNEL_UINT8:\n      float_image = channel_cast<float32>(DiskImageView<PixelRGBA<uint8>>(image_rsrc));\n      opt.output_type = \"Byte\";\n      break;\n    case VW_CHANNEL_INT16:\n      float_image = channel_cast<float32>(DiskImageView<PixelRGBA<int16>>(image_rsrc));\n      opt.output_type = \"Int16\";\n      break;\n    case VW_CHANNEL_UINT16:\n      float_image = channel_cast<float32>(DiskImageView<PixelRGBA<uint16>>(image_rsrc));\n      opt.output_type = \"UInt16\";\n      break;\n    default:\n      float_image = DiskImageView<PixelRGBA<float32>>(image_rsrc);\n      opt.output_type = \"Float32\";\n      break;\n    }\n\n    project_image_alpha_pick_transform(opt, float_image, dem_georef,\n      target_georef, croppedGeoRef, image_size,\n      Vector2i(virtual_image_width, virtual_image_height),\n      croppedImageBB, opt.camera_model);\n    \n  } else {\n    // If the input image is not RGB, only single channel images are supported.\n    if (num_input_channels != 1 || image_fmt.planes != 1)\n      //vw_throw( ArgumentErr() << \"Input images must be single channel or RGB!\\n\" );\n      vw_out() << \"Detected multi-band image. Only the first band will be used. The pixels will be interpreted as float.\\n\";\n    // Read as float with rescaling disabled, so integer values are preserved.\n    project_image_nodata_pick_transform(opt, dem_georef, target_georef, croppedGeoRef,\n                                                image_size, \n                          Vector2i(virtual_image_width, virtual_image_height),\n                          croppedImageBB, opt.camera_model);\n  } \n  // Done map projecting\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Camera/MapprojectImage.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file MapprojectImage.h\n/// Algorithms specific to mapprojecting images.\n\n#ifndef __MAPPROJECT_IMAGE_H__\n#define __MAPPROJECT_IMAGE_H__\n\n#include <vw/Cartography/GeoReference.h>\n#include <vw/FileIO/GdalWriteOptions.h>\n#include <vw/FileIO/DiskImageView.h>\n#include <vw/Camera/CameraModel.h>\n\n#include <string>\n\nnamespace asp {\n  \nstruct MapprojOptions: vw::GdalWriteOptions {\n  // Input\n  std::string dem_file, image_file, camera_file, output_file, stereo_session,\n    bundle_adjust_prefix, ref_map;\n  bool query_projection, write_wkt, noGeoHeaderInfo, nearest_neighbor, parseOptions, gdal_tap;\n  bool multithreaded_model; // This is set based on the session type\n  \n  // Keep a copy of the model here to not have to pass it around separately\n  boost::shared_ptr<vw::camera::CameraModel> camera_model;\n  \n  // Settings\n  std::string target_srs_string, output_type, metadata;\n  double nodata_value, tr, mpp, ppd, datum_offset;\n  vw::BBox2 target_projwin, target_pixelwin;\n  vw::Vector2 query_pixel;\n};\n\n// Project the image depending on image format.\nvoid project_image(asp::MapprojOptions & opt, \n                   vw::cartography::GeoReference const& dem_georef,\n                   vw::cartography::GeoReference const& target_georef, vw::cartography::GeoReference const& croppedGeoRef,\n                   vw::Vector2i const& image_size, \n                   int virtual_image_width, int virtual_image_height,\n                   vw::BBox2i const& croppedImageBB);\n\n} // end namespace asp\n\n#endif // __MAPPROJECT_IMAGE_H__\n"
  },
  {
    "path": "src/asp/Camera/PRISM_XML.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2024, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Utilties for parsing PRISM .DIMA files in XML format.\n\n#include <vw/Core/Exception.h>          // for ArgumentErr, vw_throw, etc\n#include <vw/Math/Quaternion.h>         // for Quat, Quaternion\n#include <vw/Math/Vector.h>             // for Vector, Vector3, Vector4, etc\n\n#include <asp/Camera/XMLBase.h>\n#include <asp/Camera/PRISM_XML.h>\n#include <asp/Camera/TimeProcessing.h>\n\n#include <xercesc/parsers/XercesDOMParser.hpp>\n#include <xercesc/sax/HandlerBase.hpp>\n#include <xercesc/sax/SAXException.hpp>\n#include <xercesc/sax/SAXParseException.hpp>\n#include <xercesc/dom/DOMException.hpp>\n#include <xercesc/util/PlatformUtils.hpp>\n#include <xercesc/sax/ErrorHandler.hpp>\n\n#include <boost/algorithm/string/predicate.hpp>\n#include <boost/filesystem.hpp>\n#include <boost/lexical_cast.hpp>\n#include <iomanip>\n\nusing namespace xercesc;\n\nusing asp::XmlUtils::get_node;\nusing asp::XmlUtils::cast_xmlch;\n\nnamespace asp {\n\nusing namespace xercesc;\nusing asp::XmlUtils::get_node;\nusing asp::XmlUtils::cast_xmlch;\n\n// Parse the prifle (satellite id)\nvoid parse_profile(DOMElement* root, std::string & profile) {\n  DOMElement* id_node = get_node<DOMElement>(root, \"Metadata_Id\");\n  DOMElement* profile_node = get_node<DOMElement>(id_node, \"METADATA_PROFILE\");\n  cast_xmlch(profile_node->getTextContent(), profile);\n}\n\n// Read the first and last image line times\nvoid read_first_last_line_times(xercesc::DOMElement * data_node, \n                                double              & first_line_time, \n                                double              & last_line_time) {\n\n  DOMElement* time_node = get_node<DOMElement>(data_node, \"Satellite_Time\");\n\n  // First line time\n  DOMElement* first_line_time_node = get_node<DOMElement>(time_node, \"TIME_FIRST_LINE\");\n  std::string first_line_time_str, last_line_time_str;\n  cast_xmlch(first_line_time_node->getTextContent(), first_line_time_str);\n\n  // Last line time\n  DOMElement* last_line_time_node = get_node<DOMElement>(time_node, \"TIME_LAST_LINE\");\n  cast_xmlch(last_line_time_node->getTextContent(), last_line_time_str);\n\n  first_line_time = asp::to_seconds(asp::parse_time(first_line_time_str));\n  last_line_time  = asp::to_seconds(asp::parse_time(last_line_time_str));\n}\n\n// This function simplifies the logic when we know the info we need is surely in\n// the first child.\nDOMElement* getFirstChildByTagName(DOMElement* node, const std::string & tag) {\n  \n  DOMNodeList* children = node->getChildNodes();\n  for (XMLSize_t i = 0; i < children->getLength(); i++) {\n    DOMNode* child = children->item(i);\n    std::string curr_tag(XMLString::transcode(child->getNodeName()));\n    \n    if (curr_tag == tag)\n      return dynamic_cast<DOMElement*>(child);\n  }\n  \n  return NULL;\n}\n\n// Read the dimensions of each of the raw image blocks.\nvoid read_sources_info(xercesc::DOMElement * root, \n                       int & ncols, int & nrows,\n                       std::string & view) {\n\n  // Iinitialize the output variables\n  ncols = -1;\n  nrows = -1;\n  view = \"\";\n  \n  DOMElement* dataset_sources = get_node<DOMElement>(root, \"Dataset_Sources\");\n  \n  // There  must be at least one child\n  DOMNodeList* children = dataset_sources->getChildNodes();\n  if (children->getLength() < 1) \n    vw::vw_throw(vw::ArgumentErr() \n                 << \"Expecting at least one child in the Dataset_Sources node.\\n\");\n\n  // Iterate over the children   \n  for (XMLSize_t i = 0; i < children->getLength(); i++) {\n \n    DOMNode* child = children->item(i);\n    \n    // Get the name if this child\n    std::string tag(XMLString::transcode(child->getNodeName()));\n    if (tag != \"Source_Information\")\n      continue;\n          \n    DOMElement* source_info = dynamic_cast<DOMElement*>(child);\n\n    DOMElement* scene_source = get_node<DOMElement>(source_info, \"Scene_Source\");\n    if (scene_source == NULL) \n      continue;\n    \n    // Get the view (PRISM forward, etc.)\n    DOMElement* instrument = get_node<DOMElement>(scene_source, \"INSTRUMENT\");\n    cast_xmlch(instrument->getTextContent(), view);\n      \n    // Get the Image_Interpretation subnode\n    DOMElement* image_interpretation = get_node<DOMElement>(scene_source, \n                                                            \"Image_Interpretation\");\n    if (image_interpretation == NULL) \n      continue;\n    \n    // Get the Spectral_Band_Info subnode\n    DOMElement* spectral_band_info = getFirstChildByTagName(image_interpretation, \n                                                          \"Spectral_Band_Info\");\n    if (spectral_band_info == NULL) \n      continue;\n    \n    std::string cols_str, rows_str;\n    cast_xmlch(get_node<DOMElement>(spectral_band_info, \"NCOLS\")->getTextContent(), cols_str);\n    cast_xmlch(get_node<DOMElement>(spectral_band_info, \"NROWS\")->getTextContent(), rows_str);\n    \n    ncols = atoi(cols_str.c_str());\n    nrows = atoi(rows_str.c_str());\n    \n    // Found the cols and rows\n    break;        \n  }\n  \n  // Check cols and rows are positive. Otherwise they were not read correctly.\n  if (ncols <= 0 || nrows <= 0) \n    vw::vw_throw(vw::ArgumentErr() \n                 << \"Failed to read the CCD blocl dimensions from the XML file.\\n\");\n}\n\n// Read the camera position and velocities (ephemeris)\nvoid read_ephemeris(xercesc::DOMElement      * data_node,\n                    std::vector<vw::Vector3> & positions,\n                    std::vector<vw::Vector3> & velocities,\n                    std::vector<double>      & position_times) {\n\n  // Wipe the output vectors\n  positions.clear(); \n  velocities.clear();\n  position_times.clear();\n\n  xercesc::DOMElement* ephemeris = get_node<DOMElement>(data_node, \"Ephemeris\");\n  xercesc::DOMElement* point_list = get_node<DOMElement>(ephemeris, \"Points\");\n  DOMNodeList* children = point_list->getChildNodes();\n\n  for (XMLSize_t i = 0; i < children->getLength(); i++) {\n    \n    // Check child node type\n    DOMNode* child = children->item(i);\n    if (child->getNodeType() != DOMNode::ELEMENT_NODE)\n      continue;\n\n    // Check the node name\n    DOMElement* curr_element = dynamic_cast<DOMElement*>(child);\n    std::string tag(XMLString::transcode(curr_element->getTagName()));\n    if (tag.find(\"Point\") == std::string::npos)\n      continue;\n    \n    // Get the three sub-nodes\n    std::string time_str, xs, ys, zs;\n    vw::Vector3 position, velocity;\n\n    cast_xmlch(get_node<DOMElement>(curr_element, \"TIME\")->getTextContent(), time_str);\n    double time = asp::to_seconds(asp::parse_time(time_str));\n    \n    xercesc::DOMElement* location_node = get_node<DOMElement>(curr_element, \"Location\");\n    cast_xmlch(get_node<DOMElement>(location_node, \"X\")->getTextContent(), xs);\n    cast_xmlch(get_node<DOMElement>(location_node, \"Y\")->getTextContent(), ys);\n    cast_xmlch(get_node<DOMElement>(location_node, \"Z\")->getTextContent(), zs);\n    position = vw::Vector3(atof(xs.c_str()), atof(ys.c_str()), atof(zs.c_str()));\n    \n    // same for velocity\n    xercesc::DOMElement* velocity_node = get_node<DOMElement>(curr_element, \"Velocity\");\n    cast_xmlch(get_node<DOMElement>(velocity_node, \"X\")->getTextContent(), xs);\n    cast_xmlch(get_node<DOMElement>(velocity_node, \"Y\")->getTextContent(), ys);\n    cast_xmlch(get_node<DOMElement>(velocity_node, \"Z\")->getTextContent(), zs);\n    velocity = vw::Vector3(atof(xs.c_str()), atof(ys.c_str()), atof(zs.c_str()));\n    \n    positions.push_back(position);\n    velocities.push_back(velocity);\n    position_times.push_back(time);\n  } // End loop through points\n  \n  // Expecting at least two ephemeris samples\n  if (positions.size() < 2) \n    vw::vw_throw(vw::ArgumentErr() << \"Expecting at least two ephemeris samples.\\n\");\n}\n\n// Read the angles (roll, pitch, yaw) of the camera\nvoid read_rpy(xercesc::DOMElement      * data_node,\n              std::vector<vw::Vector3> & rpy,\n              std::vector<double>      & rpy_times) {\n\n  // Wipe the output vectors\n  rpy.clear(); \n  rpy_times.clear();\n\n  xercesc::DOMElement* sat_att = get_node<DOMElement>(data_node, \"Satellite_Attitudes\");\n  xercesc::DOMElement* angles_list = get_node<DOMElement>(sat_att, \"Angles_List\");\n\n  DOMNodeList* children = angles_list->getChildNodes();\n  \n  for (XMLSize_t i = 0; i < children->getLength(); i++) {\n    \n    // Check child node type\n    DOMNode* child = children->item(i);\n    if (child->getNodeType() != DOMNode::ELEMENT_NODE)\n      continue;\n\n    // Check the node name\n    DOMElement* curr_element = dynamic_cast<DOMElement*>(child);\n    std::string tag(XMLString::transcode(curr_element->getTagName()));\n    if (tag.find(\"Angles\") == std::string::npos)\n      continue;\n    \n    // Get the three sub-nodes\n    std::string time_str, roll, pitch, yaw;\n    vw::Vector3 vals;\n\n    cast_xmlch(get_node<DOMElement>(curr_element, \"TIME\")->getTextContent(), time_str);\n    double time = asp::to_seconds(asp::parse_time(time_str));\n\n    // Find the angle subnode\n    xercesc::DOMElement* angle_node = get_node<DOMElement>(curr_element, \"Angle\");\n    cast_xmlch(get_node<DOMElement>(angle_node, \"ROLL\")->getTextContent(), roll);\n    cast_xmlch(get_node<DOMElement>(angle_node, \"PITCH\")->getTextContent(), pitch);\n    cast_xmlch(get_node<DOMElement>(angle_node, \"YAW\")->getTextContent(), yaw);\n    vals = vw::Vector3(atof(roll.c_str()), atof(pitch.c_str()), atof(yaw.c_str()));\n    \n    rpy.push_back(vals);\n    rpy_times.push_back(time);\n  } // End loop through points\n  \n  // Must have at least two samples\n  if (rpy.size() < 2) \n    vw::vw_throw(vw::ArgumentErr() << \"Expecting at least two roll-pitch-yaw samples.\\n\");\n}\n\nvoid parsePrismXml(std::string const& dim_file,\n                   int & ncols, int & nrows, std::string & view,\n                   double & first_line_time, double & last_line_time,\n                   std::vector<vw::Vector3> & positions,\n                   std::vector<vw::Vector3> & velocities,\n                   std::vector<double> & position_times,\n                   std::vector<vw::Vector3> & rpy,\n                   std::vector<double> & rpy_times) {\n\n  // Mandatory initialization for Xerces. Must be done once per process.\n  xercesc::XMLPlatformUtils::Initialize();\n  \n  // Put all xml logic in an extra scope, per\n  // https://xerces.apache.org/xerces-c/faq-parse-3.html to ensure all\n  // objects we create below go out of scope before we terminate Xerces.\n    \n  {    \n    // Initalize the output variables\n    ncols = -1; \n    nrows = -1;\n    first_line_time = -1.0;\n    last_line_time = -1.0;\n    positions.clear();\n    velocities.clear();\n    position_times.clear();\n    rpy.clear();\n    rpy_times.clear();\n\n    boost::shared_ptr<XercesDOMParser> parser(new XercesDOMParser());\n    parser->setValidationScheme(XercesDOMParser::Val_Always);\n    parser->setDoNamespaces(true);\n    boost::shared_ptr<ErrorHandler> errHandler(new HandlerBase());\n    parser->setErrorHandler(errHandler.get());\n\n    DOMDocument* xmlDoc = NULL;\n    DOMElement* root = NULL;\n\n    try {\n      parser->parse(dim_file.c_str());\n      xmlDoc = parser->getDocument();\n      root = xmlDoc->getDocumentElement();\n    } catch(...) {\n      vw::vw_throw(vw::ArgumentErr() << \"Faile to parse XML file: \" << dim_file << \"\\n\");\n    }\n\n    // Parse the satellite type\n    std::string profile; \n    parse_profile(root, profile);\n    if (profile != \"ALOS\")\n      vw::vw_throw(vw::ArgumentErr() \n                  << \"Expecting the value of METADATA_PROFILE to be ALOS.\\n\");\n\n    // Parse the number of cols and rows in each raw ccd block\n    read_sources_info(root, ncols, nrows, view);\n\n    // Parse the first and last line times\n    DOMElement* data_node = get_node<DOMElement>(root, \"Data_Strip\");\n    read_first_last_line_times(data_node, first_line_time, last_line_time);\n    \n    // Parse the camera position and velocities (ephemeris)\n    read_ephemeris(data_node, positions, velocities, position_times);\n\n    // Read roll-pitch-yaw angles\n    read_rpy(data_node, rpy, rpy_times);\n  }\n\n  // Mandatory termination for Xerces, once all other XML objects go out of scope \n  xercesc::XMLPlatformUtils::Terminate();\n    \n  return;\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Camera/PRISM_XML.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2024, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Utilities for parsing PRISM .DIMA files in XML format.\n\n#ifndef __STEREO_CAMERA_PRISM_XML_H__\n#define __STEREO_CAMERA_PRISM_XML_H__\n\n#include <vw/Math/Vector.h>\n\n#include <vector>\n#include <string>\n\nnamespace asp {\n\nvoid parsePrismXml(std::string const& dim_file,\n                   int & ncols, int & nrows, std::string & view, \n                   double & first_line_time, double & last_line_time,\n                   std::vector<vw::Vector3> & positions,\n                   std::vector<vw::Vector3> & velocities,\n                   std::vector<double> & position_times,\n                   std::vector<vw::Vector3> & rpy,\n                   std::vector<double> & rpy_times);\n\n} //end namespace asp\n\n#endif//__STEREO_CAMERA_PRISM_XML_H__\n"
  },
  {
    "path": "src/asp/Camera/PeruSatXML.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Camera/XMLBase.h>\n#include <asp/Camera/PeruSatXML.h>\n#include <asp/Camera/RPCModel.h>\n#include <asp/Camera/XMLBase.h>\n#include <asp/Camera/TimeProcessing.h>\n\n#include <vw/Core/Exception.h>          // for ArgumentErr, vw_throw, etc\n#include <vw/Math/Quaternion.h>         // for Quat, Quaternion\n#include <vw/Math/Vector.h>             // for Vector, Vector3, Vector4, etc\n#include <vw/Cartography/Datum.h>       // for Datum\n#include <vw/FileIO/DiskImageResourceGDAL.h>\n#include <vw/Core/StringUtils.h>\n\n#include <xercesc/parsers/XercesDOMParser.hpp>\n#include <xercesc/sax/HandlerBase.hpp>\n#include <xercesc/sax/SAXException.hpp>\n#include <xercesc/sax/SAXParseException.hpp>\n#include <xercesc/dom/DOMException.hpp>\n#include <xercesc/util/PlatformUtils.hpp>\n#include <xercesc/sax/ErrorHandler.hpp>\n\n#include <boost/algorithm/string/predicate.hpp>\n#include <boost/filesystem.hpp>\n#include <boost/lexical_cast.hpp>\n\n#include <iomanip>\n\nusing namespace vw;\nusing namespace vw::cartography;\nusing namespace xercesc;\n\nusing asp::XmlUtils::get_node;\nusing asp::XmlUtils::cast_xmlch;\n\nnamespace asp {\n\nDOMElement* PeruSatXML::open_xml_file(std::string const& xml_path) {\n\n  // Check if the file actually exists and throw a user helpful file.\n  if (!boost::filesystem::exists(xml_path))\n    vw_throw(ArgumentErr() << \"XML file \\\"\" << xml_path << \"\\\" does not exist.\");\n\n  std::string error_prefix = \"XML file \\\"\" + xml_path + \"\\\" is invalid.\\nException message is: \\n\";\n  std::string err_message  = \"\"; // Filled in later on error\n\n  try{\n    // Set up the XML parser if we have not already done so\n    if (!m_parser.get()) {\n      m_parser.reset(new XercesDOMParser());\n      m_err_handler.reset(new HandlerBase());\n      m_parser->setValidationScheme(XercesDOMParser::Val_Always);\n      m_parser->setDoNamespaces(true);   \n      m_parser->setErrorHandler(m_err_handler.get());\n    }\n\n    // Load the XML file\n    m_parser->parse(xml_path.c_str());\n    DOMDocument* doc  = m_parser->getDocument();\n    DOMElement * root = doc->getDocumentElement();\n    return root;\n\n  } catch (const XMLException& toCatch) {\n    char* message = XMLString::transcode(toCatch.getMessage());\n    err_message = error_prefix + message;\n    XMLString::release(&message);\n  } catch (const DOMException& toCatch) {\n    char* message = XMLString::transcode(toCatch.msg);\n    err_message = error_prefix + message;\n    XMLString::release(&message);\n  } catch (const SAXException& toCatch) {\n    char* message = XMLString::transcode(toCatch.getMessage());\n    err_message = error_prefix + message;\n    XMLString::release(&message);\n  } catch (const std::exception& e) {\n    err_message = error_prefix + e.what();\n  } catch (...) {\n    err_message = \"Unrecognized error in XML file \\\"\" + xml_path + \"\\\"\\n\";\n  }\n  vw_throw(ArgumentErr() << err_message); // Only get here on error\n\n  return 0;\n}\n\nvoid PeruSatXML::read_xml(std::string const& xml_path) {\n  DOMElement * root = open_xml_file(xml_path);\n  parse_xml(root);\n}\n\nvoid PeruSatXML::parse_xml(xercesc::DOMElement* root) {\n\n  xercesc::DOMElement* metadata_id = get_node<DOMElement>(root, \"Metadata_Identification\");\n\n  xercesc::DOMElement* metadata_profile = get_node<DOMElement>(metadata_id, \"METADATA_PROFILE\");\n\n  std::string sensor_name(XMLString::transcode(metadata_profile->getTextContent()));\n  std::string expected_name = \"PER1_SENSOR\";\n  if (sensor_name != expected_name) \n    vw_throw(ArgumentErr() << \"Incorrect sensor name. Expected: \"\n             << expected_name << \" but got: \" << sensor_name << \".\\n\");\n\n  xercesc::DOMElement* raster_data = get_node<DOMElement>(root, \"Raster_Data\");\n  read_image_size(raster_data);\n  \n  // Dig some levels down\n  xercesc::DOMElement* geometric_data = get_node<DOMElement>(root, \"Geometric_Data\");\n  xercesc::DOMElement* refined_model = get_node<DOMElement>(geometric_data, \"Refined_Model\");\n  \n  xercesc::DOMElement* time = get_node<DOMElement>(refined_model, \"Time\");\n  read_times(time);\n  \n  xercesc::DOMElement* ephemeris = get_node<DOMElement>(refined_model, \"Ephemeris\");\n  read_ephemeris(ephemeris);\n  \n  xercesc::DOMElement* attitudes = get_node<DOMElement>(refined_model, \"Attitudes\");\n  read_attitudes(attitudes);\n  \n  xercesc::DOMElement* geom_calib  = get_node<DOMElement>(refined_model, \"Geometric_Calibration\");\n  xercesc::DOMElement* instr_calib = get_node<DOMElement>(geom_calib,    \"Instrument_Calibration\");\n  xercesc::DOMElement* band_calib  = get_node<DOMElement>(instr_calib,   \"Band_Calibration\");\n  xercesc::DOMElement* look_angles = get_node<DOMElement>(band_calib,    \"Polynomial_Look_Angles\");\n  read_look_angles(look_angles);\n\n  xercesc::DOMElement* instr_biases = get_node<DOMElement>(instr_calib,   \"Instrument_Biases\");\n  read_instr_biases(instr_biases);\n\n  xercesc::DOMElement* use_area = get_node<DOMElement>(geometric_data, \"Use_Area\");\n  xercesc::DOMElement* geom_values = get_node<DOMElement>(use_area,\n                                                          \"Located_Geometric_Values\");\n  read_center_data(geom_values);\n}\n\nvoid PeruSatXML::read_image_size(xercesc::DOMElement* raster_data_node) {\n  xercesc::DOMElement* raster_dims_node = get_node<DOMElement>(raster_data_node,\n                                                                 \"Raster_Dimensions\");\n\n  cast_xmlch(get_node<DOMElement>(raster_dims_node, \"NROWS\")->getTextContent(), m_image_size[1]);\n  cast_xmlch(get_node<DOMElement>(raster_dims_node, \"NCOLS\")->getTextContent(), m_image_size[0]);\n}\n\nvoid PeruSatXML::read_times(xercesc::DOMElement* time) {\n  xercesc::DOMElement* time_range = get_node<DOMElement>(time, \"Time_Range\");\n\n  std::string start_time_str;\n  cast_xmlch(get_node<DOMElement>(time_range, \"START\")->getTextContent(), start_time_str);\n  bool is_start_time = true;\n  m_start_time = PeruSatXML::convert_time(start_time_str, is_start_time);\n\n  xercesc::DOMElement* time_stamp = get_node<DOMElement>(time, \"Time_Stamp\");\n  cast_xmlch(get_node<DOMElement>(time_stamp, \"LINE_PERIOD\")->getTextContent(), m_line_period);\n}\n  \nvoid PeruSatXML::read_ephemeris(xercesc::DOMElement* ephemeris) {\n\n  // Reset data storage\n  m_positions.clear(); \n  m_velocities.clear();\n\n  xercesc::DOMElement* point_list = get_node<DOMElement>(ephemeris, \"Point_List\");\n\n  // Pick out the \"Point\" nodes\n  DOMNodeList* children = point_list->getChildNodes();\n  for (XMLSize_t i = 0; i < children->getLength(); i++) {\n    \n    // Check child node type\n    DOMNode* child = children->item(i);\n    if (child->getNodeType() != DOMNode::ELEMENT_NODE)\n      continue;\n\n    // Check the node name\n    DOMElement* curr_element = dynamic_cast<DOMElement*>(child);\n    std::string tag(XMLString::transcode(curr_element->getTagName()));\n    if (tag.find(\"Point\") == std::string::npos)\n      continue;\n\n    // Get the three sub-nodes\n    std::string time_str, position_str, velocity_str;\n    Vector3 position_vec, velocity_vec;\n    \n    cast_xmlch(get_node<DOMElement>(curr_element, \"LOCATION_XYZ\")->getTextContent(),\n               position_str);\n    cast_xmlch(get_node<DOMElement>(curr_element, \"VELOCITY_XYZ\")->getTextContent(),\n               velocity_str);\n    cast_xmlch(get_node<DOMElement>(curr_element, \"TIME\")->getTextContent(), time_str);\n\n    bool is_start_time = false;\n    double time = PeruSatXML::convert_time(time_str, is_start_time);\n    \n    std::string delimiters(\",\\t \");\n    position_vec = str_to_vec<Vector3>(position_str, delimiters);\n    velocity_vec = str_to_vec<Vector3>(velocity_str, delimiters);\n\n    m_positions.push_back(std::pair<double, Vector3>(time, position_vec));\n    m_velocities.push_back(std::pair<double, Vector3>(time, velocity_vec));\n  } // End loop through points\n  \n}\n  \nvoid PeruSatXML::read_attitudes(xercesc::DOMElement* attitudes) {\n\n  // Reset data storage\n  m_poses.clear();\n\n  xercesc::DOMElement* quaternion_list = get_node<DOMElement>(attitudes, \"Quaternion_List\");\n\n  // Pick out the \"Quaternion\" nodes\n  DOMNodeList* children = quaternion_list->getChildNodes();\n  for (XMLSize_t i = 0; i < children->getLength(); i++) {\n    \n    // Check child node type\n    DOMNode* child = children->item(i);\n    if (child->getNodeType() != DOMNode::ELEMENT_NODE)\n      continue;\n\n    // Check the node time\n    DOMElement* curr_element = dynamic_cast<DOMElement*>(child);\n    std::string tag(XMLString::transcode(curr_element->getTagName()));\n    if (tag.find(\"Quaternion\") == std::string::npos)\n      continue;\n  \n    // Parse the time and \n\n    std::pair<double, vw::Quaternion<double>> data;\n    std::string time_str;\n    cast_xmlch(get_node<DOMElement>(curr_element, \"TIME\")->getTextContent(), time_str);\n\n    bool is_start_time = false;\n    data.first = PeruSatXML::convert_time(time_str, is_start_time);\n    \n    double w, x, y, z;\n    cast_xmlch(get_node<DOMElement>(curr_element, \"Q0\")->getTextContent(), w);\n    cast_xmlch(get_node<DOMElement>(curr_element, \"Q1\")->getTextContent(), x);\n    cast_xmlch(get_node<DOMElement>(curr_element, \"Q2\")->getTextContent(), y);\n    cast_xmlch(get_node<DOMElement>(curr_element, \"Q3\")->getTextContent(), z);\n    data.second = vw::Quaternion<double>(w, x, y, z);\n\n    // Normalize the quaternions to remove any inaccuracy due to the\n    // limited precision used to save them on disk.\n    data.second = normalize(data.second);\n    \n    m_poses.push_back(data);\n  } // End loop through attitudes\n}\n\nvoid PeruSatXML::read_look_angles(xercesc::DOMElement* look_angles) {\n  std::string delimiters(\",\\t \");\n  std::string tan_psi_x_str;\n  cast_xmlch(get_node<DOMElement>(look_angles, \"LINE_OF_SIGHT_TANPSIX\")->getTextContent(),\n             tan_psi_x_str);\n  m_tan_psi_x = str_to_vec<Vector2>(tan_psi_x_str, delimiters);\n  \n  std::string tan_psi_y_str;\n  cast_xmlch(get_node<DOMElement>(look_angles, \"LINE_OF_SIGHT_TANPSIY\")->getTextContent(),\n             tan_psi_y_str);\n  m_tan_psi_y = str_to_vec<Vector2>(tan_psi_y_str, delimiters);\n}\n\nvoid PeruSatXML::read_instr_biases(xercesc::DOMElement* instr_biases) {\n    \n  double w, x, y, z;\n  cast_xmlch(get_node<DOMElement>(instr_biases, \"Q0\")->getTextContent(), w);\n  cast_xmlch(get_node<DOMElement>(instr_biases, \"Q1\")->getTextContent(), x);\n  cast_xmlch(get_node<DOMElement>(instr_biases, \"Q2\")->getTextContent(), y);\n  cast_xmlch(get_node<DOMElement>(instr_biases, \"Q3\")->getTextContent(), z);\n\n  m_instrument_biases = vw::Quaternion<double>(w, x, y, z);\n}\n\nvoid PeruSatXML::read_center_data(xercesc::DOMElement* geom_values) {\n\n  std::string center_time_str;\n  cast_xmlch(get_node<DOMElement>(geom_values, \"TIME\")->getTextContent(), center_time_str);\n  cast_xmlch(get_node<DOMElement>(geom_values, \"COL\")->getTextContent(), m_center_col);\n  cast_xmlch(get_node<DOMElement>(geom_values, \"ROW\")->getTextContent(), m_center_row);\n\n  bool is_start_time = false;\n  center_time = PeruSatXML::convert_time(center_time_str, is_start_time);\n\n  // Convert from 1-based to 0-based indices.  \n  m_center_col -= 1.0;\n  m_center_row -= 1.0;\n}\n\n// Converts a time from string to double precision value measured in seconds\n// relative to the start time.\n// Input strings look like this: 2008-03-04T12:31:03.08191Z.\ndouble PeruSatXML::convert_time(std::string const& s, bool is_start_time) {\n\n  if (!is_start_time && !m_start_time_is_set) \n    vw::vw_throw(vw::ArgumentErr()\n                 << \"Must set the start time before doing time conversions.\\n\");\n\n  try{\n    boost::posix_time::ptime time = asp::parse_time(s);\n\n    if (is_start_time) {\n      m_start_time_is_set = true;\n      m_start_time_stamp = time;\n    }\n\n    boost::posix_time::time_duration delta(time - m_start_time_stamp);\n    return delta.total_microseconds() / 1.0e+6;\n    \n  }catch(...){\n    vw::vw_throw(vw::ArgumentErr() << \"Failed to parse time from string: \" << s << \"\\n\");\n  }\n  return -1.0; // Never reached\n}\n\n// Extract raw data from the parsed XML for direct CSM population.\n// No resampling is done here. The raw positions, velocities, and quaternions\n// are returned as-is from the XML file, with their uniform time grids.\nvoid PeruSatXML::extractRawData(\n  double & time_t0, double & time_dt,\n  std::vector<Vector3> & positions,\n  std::vector<Vector3> & velocities,\n  double & pos_t0, double & pos_dt,\n  std::vector<vw::Quaternion<double>> & quaternions,\n  double & quat_t0, double & quat_dt,\n  double & min_time, double & max_time) const {\n\n  // Time function: time at line = m_start_time + m_line_period * line\n  time_t0 = m_start_time;\n  time_dt = m_line_period;\n\n  // Extract raw positions and velocities with their times\n  std::vector<double> pos_times, vel_times;\n  positions.clear();\n  velocities.clear();\n  for (auto iter = m_positions.begin(); iter != m_positions.end(); iter++) {\n    pos_times.push_back(iter->first);\n    positions.push_back(iter->second);\n  }\n  for (auto iter = m_velocities.begin(); iter != m_velocities.end(); iter++) {\n    vel_times.push_back(iter->first);\n    velocities.push_back(iter->second);\n  }\n\n  // Position/velocity time grid (uniform from XML)\n  pos_t0 = pos_times.front();\n  pos_dt = (pos_times.back() - pos_times.front()) / (pos_times.size() - 1.0);\n\n  // Extract raw quaternions with their times\n  std::vector<double> quat_times;\n  quaternions.clear();\n  for (auto iter = m_poses.begin(); iter != m_poses.end(); iter++) {\n    quat_times.push_back(iter->first);\n    quaternions.push_back(iter->second);\n  }\n\n  // Quaternion time grid (uniform from XML)\n  quat_t0 = quat_times.front();\n  quat_dt = (quat_times.back() - quat_times.front()) / (quat_times.size() - 1.0);\n\n  // Time range for which we have data\n  min_time = std::max(pos_times.front(),\n                      std::max(vel_times.front(), quat_times.front()));\n  max_time = std::min(pos_times.back(),\n                      std::min(vel_times.back(), quat_times.back()));\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Camera/PeruSatXML.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// These are objects that relate directly to block in XML that we need\n// to read. They only read and then store the raw values. Other\n// objects will interpret the results.\n\n#ifndef __STEREO_CAMERA_PERUSAT_XML_H__\n#define __STEREO_CAMERA_PERUSAT_XML_H__\n\n#include <vw/Core/FundamentalTypes.h>\n#include <vw/Core/Log.h>\n#include <vw/Math/Vector.h>\n#include <vw/Math/Quaternion.h>\n#include <vw/Math/BBox.h>\n#include <vw/Camera/CameraModel.h>\n\n#include <vector>\n#include <string>\n\n#include <boost/smart_ptr/shared_ptr.hpp>\n#include <boost/date_time/posix_time/posix_time.hpp>\n\n// Special forward declare so we can hide the Xerces headers.\n#include <xercesc/util/XercesDefs.hpp> // Needed for this XERCES macro\nXERCES_CPP_NAMESPACE_BEGIN\n  class DOMDocument;\n  class DOMElement;\n  class XercesDOMParser;\n  class ErrorHandler;\nXERCES_CPP_NAMESPACE_END\n\nnamespace asp {\n\n  class PeruSatXML {\n  public:\n\n    /// Constructor\n    PeruSatXML(): m_start_time_is_set(false){}\n\n    vw::Vector2i m_image_size;\n    vw::Quaternion<double> m_instrument_biases;\n    vw::Vector2 m_tan_psi_x, m_tan_psi_y;\n\n    /// Parse an XML file to populate the data\n    void read_xml(std::string const& xml_path);\n\n    /// Parse an XML tree to populate the data\n    void parse_xml(xercesc::DOMElement* node);\n\n    // Extract raw data for direct CSM population (no interpolation).\n    // Outputs: positions, velocities with uniform time grid (pos_t0, pos_dt),\n    // quaternions with uniform time grid (quat_t0, quat_dt), and time function\n    // parameters (time_t0, time_dt).\n    void extractRawData(\n      // Outputs\n      double & time_t0, double & time_dt,\n      std::vector<vw::Vector3> & positions,\n      std::vector<vw::Vector3> & velocities,\n      double & pos_t0, double & pos_dt,\n      std::vector<vw::Quaternion<double>> & quaternions,\n      double & quat_t0, double & quat_dt,\n      double & min_time, double & max_time) const;\n\n  private: // The various XML data reading sections\n\n    /// Just opens the XML file for reading and returns the root node.\n    xercesc::DOMElement* open_xml_file(std::string const& xml_path);\n\n    void read_image_size  (xercesc::DOMElement* raster_data);\n    void read_times       (xercesc::DOMElement* time);\n    void read_ephemeris   (xercesc::DOMElement* ephemeris);\n    void read_attitudes   (xercesc::DOMElement* attitudes);\n    void read_look_angles (xercesc::DOMElement* look_angles);\n    void read_instr_biases(xercesc::DOMElement* instr_biases);\n    void read_center_data (xercesc::DOMElement* geom_values);\n\n    /// Converts a time from string to double precision in seconds.\n    /// All times are in seconds relative to the start time.\n    /// When the start time is passed in, use is_start_time = true.\n    double convert_time(std::string const& s, bool is_start_time);\n\n    // All times represented as doubles will be in seconds relative to m_start_time_stamp\n    boost::posix_time::ptime m_start_time_stamp;\n\n    bool   m_start_time_is_set;\n    double m_start_time;\n    double center_time;\n    double m_line_period;\n    double m_center_col;\n    double m_center_row;\n\n    std::list<std::pair<double, vw::Vector3>> m_positions;        // (time,   X/Y/Z)\n    std::list<std::pair<double, vw::Vector3>> m_velocities;       // (time,   dX/dY/dZ)\n    std::list<std::pair<double, vw::Quaternion<double>>> m_poses; // (time, quaternion)\n\n    boost::shared_ptr<xercesc::XercesDOMParser> m_parser;\n    boost::shared_ptr<xercesc::ErrorHandler>    m_err_handler;\n\n  }; // End class PeruSatXML\n\n} //end namespace asp\n\n#endif//__STEREO_CAMERA_PERUSAT_XML_H__\n"
  },
  {
    "path": "src/asp/Camera/PleiadesXML.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Pleiades camera model. The documentation used:\n// 1A/1B: airbus-pleiades-imagery-user-guide-15042021.pdf.\n// NEO:   2022.03_PleiadesNeo_UserGuide_20220322.pdf\n\n#include <asp/Camera/XMLBase.h>\n#include <asp/Camera/PleiadesXML.h>\n#include <asp/Camera/RPCModel.h>\n#include <asp/Camera/XMLBase.h>\n#include <asp/Camera/TimeProcessing.h>\n#include <asp/Camera/CsmUtils.h>\n\n#include <vw/Core/Exception.h>          // for ArgumentErr, vw_throw, etc\n#include <vw/Math/Vector.h>             // for Vector, Vector3, Vector4, etc\n#include <vw/Cartography/Datum.h>       // for Datum\n#include <vw/FileIO/DiskImageResourceGDAL.h>\n#include <vw/Core/StringUtils.h>\n\n#include <xercesc/parsers/XercesDOMParser.hpp>\n#include <xercesc/sax/HandlerBase.hpp>\n#include <xercesc/sax/SAXException.hpp>\n#include <xercesc/sax/SAXParseException.hpp>\n#include <xercesc/dom/DOMException.hpp>\n#include <xercesc/util/PlatformUtils.hpp>\n#include <xercesc/sax/ErrorHandler.hpp>\n\n#include <boost/algorithm/string/predicate.hpp>\n#include <boost/filesystem.hpp>\n#include <boost/lexical_cast.hpp>\n\nusing namespace vw;\nusing namespace vw::cartography;\nusing namespace xercesc;\n\nusing asp::XmlUtils::get_node;\nusing asp::XmlUtils::cast_xmlch;\n\nnamespace asp {\n\nDOMElement* PleiadesXML::open_xml_file(std::string const& xml_path) {\n\n  // Check if the file actually exists and throw a user helpful file.\n  if (!boost::filesystem::exists(xml_path))\n    vw_throw(ArgumentErr() << \"XML file: \" << xml_path << \" does not exist.\");\n\n  std::string error_prefix = \"XML file: \" + xml_path + \" is invalid.\\n\"\n   \"Exception message is: \\n\";\n  std::string err_message  = \"\"; // Filled in later on error\n\n  try {\n    // Set up the XML parser if we have not already done so\n    if (!m_parser.get()) {\n      m_parser.reset(new XercesDOMParser());\n      m_err_handler.reset(new HandlerBase());\n      m_parser->setValidationScheme(XercesDOMParser::Val_Always);\n      m_parser->setDoNamespaces(true);   \n      m_parser->setErrorHandler(m_err_handler.get());\n    }\n\n    // Load the XML file\n    m_parser->parse(xml_path.c_str());\n    DOMDocument* doc  = m_parser->getDocument();\n    DOMElement * root = doc->getDocumentElement();\n    return root;\n\n  } catch (const XMLException& toCatch) {\n    char* message = XMLString::transcode(toCatch.getMessage());\n    err_message = error_prefix + message;\n    XMLString::release(&message);\n  } catch (const DOMException& toCatch) {\n    char* message = XMLString::transcode(toCatch.msg);\n    err_message = error_prefix + message;\n    XMLString::release(&message);\n  } catch (const SAXException& toCatch) {\n    char* message = XMLString::transcode(toCatch.getMessage());\n    err_message = error_prefix + message;\n    XMLString::release(&message);\n  } catch (const std::exception& e) {\n    err_message = error_prefix + e.what();\n  } catch (...) {\n    err_message = \"Unrecognized error in XML file \\\"\" + xml_path + \"\\\"\\n\";\n  }\n  vw_throw(ArgumentErr() << err_message); // Only get here on error\n\n  return 0;\n}\n\nvoid PleiadesXML::read_xml(std::string const& xml_path) {\n  DOMElement * root = open_xml_file(xml_path);\n  parse_xml(root);\n}\n\nvoid PleiadesXML::parse_xml(xercesc::DOMElement* root) {\n\n  xercesc::DOMElement* metadata_id = get_node<DOMElement>(root, \"Metadata_Identification\");\n\n  xercesc::DOMElement* metadata_profile = get_node<DOMElement>(metadata_id, \"METADATA_PROFILE\");\n\n  m_sensor_name = XMLString::transcode(metadata_profile->getTextContent());\n  m_isNeoOrSpot67 = false;\n  if (m_sensor_name == \"PHR_SENSOR\")\n    m_isNeoOrSpot67 = false;\n  else if (m_sensor_name == \"PNEO_SENSOR\" ||\n           m_sensor_name == \"S6_SENSOR\"   ||\n           m_sensor_name == \"S7_SENSOR\")\n    m_isNeoOrSpot67 = true;\n  else\n    vw_throw(ArgumentErr() << \"Incorrect sensor name. Expected: PHR, PNEO, S6, or S7 sensor, \"\n      << \"but got: \" << m_sensor_name\n      << \". Only primary (non-ortho) images can be used.\\n\");\n\n  vw_out() << \"Sensor profile: \" << m_sensor_name << \"\\n\";\n\n  xercesc::DOMElement* raster_data = get_node<DOMElement>(root, \"Raster_Data\");\n  read_image_size(raster_data);\n\n  // Dig some levels down\n  xercesc::DOMElement* geometric_data = get_node<DOMElement>(root, \"Geometric_Data\");\n  xercesc::DOMElement* refined_model = get_node<DOMElement>(geometric_data, \"Refined_Model\");\n  xercesc::DOMElement* time = get_node<DOMElement>(refined_model, \"Time\");\n  read_times(time);\n  \n  xercesc::DOMElement* ephemeris = get_node<DOMElement>(refined_model, \"Ephemeris\");\n  read_ephemeris(ephemeris);\n  \n  // Quaternions are stored differently for Neo and 1A/1B\n  xercesc::DOMElement* attitudes = get_node<DOMElement>(refined_model, \"Attitudes\");\n  if (m_isNeoOrSpot67)\n    read_attitudes_Neo(attitudes);\n  else\n    read_attitudes_1A1B(attitudes);\n  \n  xercesc::DOMElement* geom_calib  = get_node<DOMElement>(refined_model, \"Geometric_Calibration\");\n  xercesc::DOMElement* instr_calib = get_node<DOMElement>(geom_calib, \"Instrument_Calibration\");\n\n  if (!m_isNeoOrSpot67) {\n    xercesc::DOMElement* swath_range = get_node<DOMElement>(instr_calib, \"Swath_Range\");\n    read_ref_col_row(swath_range);\n  } else {\n    // 2022.03_PleiadesNeo_UserGuide_20220322.pdf. Page 66. There the ref col and row are\n    // 1, but we subtract 1 since our lines and columns start from 0.\n    m_ref_col = 0;\n    m_ref_row = 0;\n  }\n\n  xercesc::DOMElement* look_angles = NULL;\n  if (!m_isNeoOrSpot67) {\n    look_angles = get_node<DOMElement>(instr_calib, \"Polynomial_Look_Angles\");\n  } else {\n    xercesc::DOMElement* band_list = get_node<DOMElement>(instr_calib,\n      \"Band_Calibration_List\");\n    xercesc::DOMElement* band = get_node<DOMElement>(band_list, \"Band_Calibration\");\n    look_angles = get_node<DOMElement>(band, \"Polynomial_Look_Angles\");\n\n  }\n  read_look_angles(look_angles);\n\n  PleiadesXML::parse_accuracy_stdv(root);\n\n  // SPOT 6/7 data can have non-uniform time spacing for positions,\n  // velocities, and quaternions. Resample to a uniform grid so the\n  // downstream code (which assumes uniform spacing) works correctly.\n  // After this, the data looks the same as Pleiades.\n  bool is_spot67 = (m_sensor_name == \"S6_SENSOR\" || m_sensor_name == \"S7_SENSOR\");\n  if (is_spot67) {\n    int order = 8;  // Lagrange interpolation order (8 points, degree 7)\n    int factor = 5; // resample to 5x denser grid\n\n    // Resample positions\n    std::vector<double> pos_times, pos_out_times;\n    std::vector<Vector3> pos_vals, pos_out_vals;\n    for (auto it = m_positions.begin(); it != m_positions.end(); it++) {\n      pos_times.push_back(it->first);\n      pos_vals.push_back(it->second);\n    }\n    asp::resampleVec3Lagrange(pos_times, pos_vals, order, factor,\n                              pos_out_times, pos_out_vals);\n    m_positions.clear();\n    for (size_t i = 0; i < pos_out_times.size(); i++)\n      m_positions.push_back(std::make_pair(pos_out_times[i], pos_out_vals[i]));\n\n    // Resample velocities\n    std::vector<double> vel_times, vel_out_times;\n    std::vector<Vector3> vel_vals, vel_out_vals;\n    for (auto it = m_velocities.begin(); it != m_velocities.end(); it++) {\n      vel_times.push_back(it->first);\n      vel_vals.push_back(it->second);\n    }\n    asp::resampleVec3Lagrange(vel_times, vel_vals, order, factor,\n                              vel_out_times, vel_out_vals);\n    m_velocities.clear();\n    for (size_t i = 0; i < vel_out_times.size(); i++)\n      m_velocities.push_back(std::make_pair(vel_out_times[i], vel_out_vals[i]));\n\n    // Resample quaternions\n    std::vector<double> quat_times, quat_out_times;\n    std::vector<vw::Quaternion<double>> quat_vals, quat_out_vals;\n    for (auto it = m_poses.begin(); it != m_poses.end(); it++) {\n      quat_times.push_back(it->first);\n      quat_vals.push_back(it->second);\n    }\n    asp::resampleQuatLagrange(quat_times, quat_vals, order, factor,\n                              quat_out_times, quat_out_vals);\n    m_poses.clear();\n    for (size_t i = 0; i < quat_out_times.size(); i++)\n      m_poses.push_back(std::make_pair(quat_out_times[i], quat_out_vals[i]));\n  }\n\n  return;\n}\n\nvoid PleiadesXML::read_image_size(xercesc::DOMElement* raster_data_node) {\n  xercesc::DOMElement* raster_dims_node \n    = get_node<DOMElement>(raster_data_node, \"Raster_Dimensions\");\n\n  cast_xmlch(get_node<DOMElement>(raster_dims_node, \"NROWS\")->getTextContent(), \n             m_image_size[1]);\n  cast_xmlch(get_node<DOMElement>(raster_dims_node, \"NCOLS\")->getTextContent(), \n             m_image_size[0]);\n}\n\nvoid PleiadesXML::read_times(xercesc::DOMElement* time) {\n  xercesc::DOMElement* time_range = get_node<DOMElement>(time, \"Time_Range\");\n\n  // In addition to the relative start time stored in m_start_time, we will store\n  // the start time string as well, in m_start_time_str, to be used later\n  cast_xmlch(get_node<DOMElement>(time_range, \"START\")->getTextContent(), m_start_time_str);\n  bool is_start_time = true;\n  m_start_time = PleiadesXML::convert_time(m_start_time_str, is_start_time);\n\n  std::string end_time_str;\n  cast_xmlch(get_node<DOMElement>(time_range, \"END\")->getTextContent(), end_time_str);\n  is_start_time = false;\n  m_end_time = PleiadesXML::convert_time(end_time_str, is_start_time);\n\n  xercesc::DOMElement* time_stamp = get_node<DOMElement>(time, \"Time_Stamp\");\n  cast_xmlch(get_node<DOMElement>(time_stamp, \"LINE_PERIOD\")->getTextContent(), m_line_period);\n  if (m_isNeoOrSpot67) {\n    // Convert from microseconds to seconds\n    m_line_period /= 1.0e+6;\n  } else {\n    // Convert from milliseconds to seconds\n    m_line_period /= 1.0e+3;\n  }\n\n}\n  \nvoid PleiadesXML::read_ephemeris(xercesc::DOMElement* ephemeris) {\n\n  // Reset data storage\n  m_positions.clear(); \n  m_velocities.clear();\n\n  xercesc::DOMElement* ephemeris_used = get_node<DOMElement>(ephemeris, \"EPHEMERIS_USED\");\n\n  xercesc::DOMElement* point_list = get_node<DOMElement>(ephemeris, \"Point_List\");\n\n  // Pick out the \"Point\" nodes\n  DOMNodeList* children = point_list->getChildNodes();\n\n  for (XMLSize_t i = 0; i < children->getLength(); i++) {\n    \n    // Check child node type\n    DOMNode* child = children->item(i);\n    if (child->getNodeType() != DOMNode::ELEMENT_NODE)\n      continue;\n\n    // Check the node name\n    DOMElement* curr_element = dynamic_cast<DOMElement*>(child);\n    std::string tag(XMLString::transcode(curr_element->getTagName()));\n    if (tag.find(\"Point\") == std::string::npos)\n      continue;\n\n    // Get the three sub-nodes\n    std::string time_str, position_str, velocity_str;\n    Vector3 position_vec, velocity_vec;\n    \n    // Parse the position and velocity\n    cast_xmlch(get_node<DOMElement>(curr_element, \"LOCATION_XYZ\")->getTextContent(), position_str);\n    cast_xmlch(get_node<DOMElement>(curr_element, \"VELOCITY_XYZ\")->getTextContent(), velocity_str);\n\n    // Parse the time\n    cast_xmlch(get_node<DOMElement>(curr_element, \"TIME\")->getTextContent(), time_str);\n    bool is_start_time = false;\n    double time = PleiadesXML::convert_time(time_str, is_start_time);\n\n    std::string delimiters(\",\\t \");\n    position_vec = str_to_vec<Vector3>(position_str, delimiters);\n    velocity_vec = str_to_vec<Vector3>(velocity_str, delimiters);\n\n    m_positions.push_back(std::pair<double, Vector3>(time, position_vec));\n    m_velocities.push_back(std::pair<double, Vector3>(time, velocity_vec));\n  } // End loop through points\n\n  // Sanity check\n  if (m_positions.size() < 2)\n  vw_throw(ArgumentErr() << \"Expecting to read at least two positions from the xml .\\n\");  \n}\n\n// Given a calendar time, find the midnight time. Just put zeros for hours, minutes, and seconds.\n// An input time looks like: 2022-04-13T22:46:31.4540000\nvoid calc_midnight_time(std::string const& start_time, std::string& midnight_time) {\n\n  size_t hour_pos = start_time.find(\"T\");\n  if (hour_pos == std::string::npos)\n    vw::vw_throw(vw::ArgumentErr()\n                 << \"Could not parse time string: \" << start_time << \".\\n\");\n  hour_pos += 1; // move past the \"T\"\n\n  midnight_time = start_time;\n  for (size_t it = hour_pos; it < midnight_time.size(); it++) {\n    if (midnight_time[it] >= '0' && midnight_time[it] <= '9') {\n      midnight_time.replace(it, 1, \"0\");\n    }\n  }\n\n  return;\n}\n\n// Read attitudes for NEO. Unlike for L1A/L1B, here we read the tabulated quaternions.\nvoid PleiadesXML::read_attitudes_Neo(xercesc::DOMElement* attitudes) {\n\n  xercesc::DOMElement* quaternion_list = get_node<DOMElement>(attitudes, \"Quaternion_List\");\n\n  // Reset data storage\n  m_poses.clear();\n\n  DOMNodeList* children = quaternion_list->getChildNodes();\n  for (XMLSize_t i = 0; i < children->getLength(); i++) {\n    \n    // Check child node type\n    DOMNode* child = children->item(i);\n    if (child->getNodeType() != DOMNode::ELEMENT_NODE)\n      continue;\n\n    // Check the node time\n    DOMElement* curr_element = dynamic_cast<DOMElement*>(child);\n    std::string tag(XMLString::transcode(curr_element->getTagName()));\n    if (tag.find(\"Quaternion\") == std::string::npos)\n      continue;\n\n    // Parse the quaternion\n    std::pair<double, vw::Quaternion<double>> data;\n    double w, x, y, z;\n    cast_xmlch(get_node<DOMElement>(curr_element, \"Q0\")->getTextContent(), w);\n    cast_xmlch(get_node<DOMElement>(curr_element, \"Q1\")->getTextContent(), x);\n    cast_xmlch(get_node<DOMElement>(curr_element, \"Q2\")->getTextContent(), y);\n    cast_xmlch(get_node<DOMElement>(curr_element, \"Q3\")->getTextContent(), z);\n    vw::Quaternion<double> q = vw::Quaternion<double>(w, x, y, z);\n\n    // Normalize the quaternions to remove any inaccuracy due to the\n    // limited precision used to save them on disk. Save as a vector, not a quaternion,\n    // given the existing API. Note that w gets saved first.\n    q = normalize(q);\n    data.second = q;\n\n    // Parse the quaternion time\n    std::string time_str; \n    cast_xmlch(get_node<DOMElement>(curr_element, \"TIME\")->getTextContent(), time_str);\n    bool is_start_time = false;\n    double time = PleiadesXML::convert_time(time_str, is_start_time);\n    data.first = time;\n\n    m_poses.push_back(data);\n  } // End loop through attitudes\n\n  return;\n}\n\n// Read quaternions for L1A and L1B. In this case, what is given is a quaternion\n// polynomial, which is evaluated at a given time.\nvoid PleiadesXML::read_attitudes_1A1B(xercesc::DOMElement* attitudes) {\n\n  xercesc::DOMElement* quaternion_root = get_node<DOMElement>(attitudes, \"Polynomial_Quaternions\");\n\n  // Read the quaternion offset field\n  std::string offset_str;\n  cast_xmlch(get_node<DOMElement>(quaternion_root, \"OFFSET\")->getTextContent(), offset_str);\n\n  // Per the documentation, this offset is from midnight. Need to transform it to be relative\n  // to the start time.\n  std::string midnight_time_str; \n  calc_midnight_time(m_start_time_str, midnight_time_str);\n\n  bool is_start_time = false;\n  double midnight_time = PleiadesXML::convert_time(midnight_time_str, is_start_time);\n  m_quat_offset_time = midnight_time + atof(offset_str.c_str());\n\n#if 0\n  // Turning this off as it is fails on a real test case.\n  // Untested adjustments for the case when the midnight is computed\n  // for the wrong day. Not sure if this will ever happen. Try to\n  // ensure that m_start_time <= m_quat_offset_time <= m_end_time.\n  double full_day = 3600.0 * 24.0;\n  if (m_quat_offset_time < m_start_time)\n    m_quat_offset_time += full_day;\n  if (m_quat_offset_time > m_end_time)\n    m_quat_offset_time -= full_day;\n  \n  if (m_quat_offset_time < m_start_time || m_quat_offset_time > m_end_time)\n    vw_throw(ArgumentErr() << \"Failed to compute the quaternion offset. \"\n             << \"Check the start time, end time, and the quaternion OFFSET field, \"\n             << \"which is meant to be in seconds since midnight.\\n\");\n#endif\n  \n  if (m_quat_offset_time < m_start_time)  // This never happened\n    vw_out(WarningMessage) << \"Quaternion offset time is less than start time (difference: \"\n                           << m_quat_offset_time - m_start_time << \" seconds). \"\n                           << \"Some caution may be advised.\\n\";\n  if (m_quat_offset_time > m_end_time) // This was observed to happen\n    vw_out(WarningMessage) << \"Quaternion offset time in seconds (\"\n                           << m_quat_offset_time - m_start_time << \") \"\n                           << \"is greater than end time (\"\n                           << m_end_time - m_start_time\n                           << \"). A discrepancy of a few seconds is likely acceptable.\\n\";\n  \n  // Read the quaternion scale field\n  std::string scale_str;\n  cast_xmlch(get_node<DOMElement>(quaternion_root, \"SCALE\")->getTextContent(), scale_str);\n  m_quat_scale = atof(scale_str.c_str());\n\n  // Read the quaternion coefficients that will be used with the quaternion\n  // polynomial to find the quaternions at any time (page 77)\n  m_quaternion_coeffs.clear();\n  std::vector<std::string> tags = {\"Q0\", \"Q1\", \"Q2\", \"Q3\"};\n  for (size_t it = 0; it < tags.size(); it++) {\n    xercesc::DOMElement* qi = get_node<DOMElement>(quaternion_root, tags[it]);\n\n    int deg = 0;\n    cast_xmlch(get_node<DOMElement>(qi, \"DEGREE\")->getTextContent(), deg);\n    if (deg != 3)\n      vw_throw(ArgumentErr() \n        << \"Expecting the degree of the quaternion polynomial to be 3.\\n\");\n\n    std::string quat_str;\n    cast_xmlch(get_node<DOMElement>(qi, \"COEFFICIENTS\")->getTextContent(), quat_str);\n\n    vw::Vector<double, 4> v = vw::str_to_vec<vw::Vector<double, 4>>(quat_str);\n    m_quaternion_coeffs.push_back(v);\n  }\n\n  return;\n}\n\nvoid PleiadesXML::read_ref_col_row(xercesc::DOMElement* swath_range) {\n  m_ref_row = 1; // page 76 in the doc\n  \n  std::string ref_col;\n  cast_xmlch(get_node<DOMElement>(swath_range, \"FIRST_COL\")->getTextContent(),\n             ref_col);\n  m_ref_col = atoi(ref_col.c_str());\n\n  // subtract 1, as we prefer to start rows and columns from 0\n  m_ref_row -= 1;\n  m_ref_col -= 1;\n}\n  \nvoid PleiadesXML::read_look_angles(xercesc::DOMElement* look_angles) {\n\n  // Pages 75 and 100 in the doc\n  m_coeff_psi_x = vw::Vector2(0, 0);\n  std::string xlos_0;\n  cast_xmlch(get_node<DOMElement>(look_angles, \"XLOS_0\")->getTextContent(),\n             xlos_0);\n  m_coeff_psi_x[0] = atof(xlos_0.c_str());\n\n  std::string xlos_1;\n  cast_xmlch(get_node<DOMElement>(look_angles, \"XLOS_1\")->getTextContent(),\n             xlos_1);\n  m_coeff_psi_x[1] = atof(xlos_1.c_str());\n\n  // For 1A/1B, there's only one coeff_psi_y value. Set the second to 0.\n  m_coeff_psi_y = vw::Vector2(0, 0);\n  std::string ylos_0;\n  cast_xmlch(get_node<DOMElement>(look_angles, \"YLOS_0\")->getTextContent(),\n             ylos_0);\n  m_coeff_psi_y[0] = atof(ylos_0.c_str());\n\n  // But for NEO, as for PeruSat, there are two values.\n  if (m_isNeoOrSpot67) {\n    std::string ylos_1;\n    cast_xmlch(get_node<DOMElement>(look_angles, \"YLOS_1\")->getTextContent(),\n               ylos_1);\n    m_coeff_psi_y[1] = atof(ylos_1.c_str());\n  }\n}\n\n// Converts a time from string to double precision value measured in seconds\n// relative to the start time. First time it is called for the start time.\n// Input strings look like this: 2022-04-13T22:46:31.4540000Z\ndouble PleiadesXML::convert_time(std::string const& s, bool is_start_time) {\n\n  if (!is_start_time && !m_start_time_is_set) \n    vw::vw_throw(vw::ArgumentErr()\n                 << \"Must set the start time before doing time conversions.\\n\");\n\n  try{\n    boost::posix_time::ptime time = asp::parse_time(s);\n    \n    // If this is the first invocation, find the start time first\n    if (is_start_time) {\n      m_start_time_is_set = true;\n      m_start_time_stamp = time;\n    }\n\n    // Now find the relative start time\n    boost::posix_time::time_duration delta(time - m_start_time_stamp);\n\n    // Go from microseconds to seconds\n    return delta.total_microseconds() / 1.0e+6;\n    \n  }catch(...){\n    vw::vw_throw(vw::ArgumentErr() << \"Failed to parse time from string: \" << s << \"\\n\");\n  }\n  return -1.0; // Never reached\n}\n\n// This is an optional field, used only for error propagation  \nvoid PleiadesXML::parse_accuracy_stdv(xercesc::DOMElement* root) {\n  m_accuracy_stdv = 0.0;\n  try {\n    xercesc::DOMElement* quality_assessment = get_node<DOMElement>(root, \"Quality_Assessment\");\n    xercesc::DOMElement* planimetric_accuracy_measurement\n      = get_node<DOMElement>(quality_assessment, \"Planimetric_Accuracy_Measurement\");\n    xercesc::DOMElement* quality_values = get_node<DOMElement>(planimetric_accuracy_measurement, \"Quality_Values\");\n    std::string accuracy_stdv;\n    cast_xmlch(get_node<DOMElement>(quality_values, \"ACCURACY_STDV\")->getTextContent(),\n               accuracy_stdv);\n    m_accuracy_stdv = atof(accuracy_stdv.c_str());\n  } catch (...) {\n    m_accuracy_stdv = 0.0; \n  }\n\n  return;\n}\n\n// Find the time at each line. According to the doc (page 76),\n// reference line is the first line. In ASP, line count starts from 0.\n// We will use the convention that all times are relative to time\n// at line 0, so time at line 0 is 0. There can be negative times,\n// as the positions and velocities are tabulated at times both\n// before the first line and after the last time.\nvoid PleiadesXML::setup_time_func(double & time_t0, double & time_dt) const {\n  time_t0 = m_start_time;\n  time_dt = m_line_period;\n}\n\n// Insert one more value at the start of the list, based on extrapolated first two\n// values, at time based on extrapolating from first time.\nvoid extrapolateAtStartTime(double delta_time, \n  std::list<std::pair<double, vw::Vector3>> & vals) {\n\n    auto it = vals.begin();\n    double time1 = it->first;\n    vw::Vector3 val1 = it->second;\n\n    it++;\n    double time2 = it->first;\n    vw::Vector3 val2 = it->second;\n\n    double time0 = time1 - delta_time;\n    vw::Vector3 val0 = 2 * val1 - val2;\n\n    // Insert this at the start of the list\n    vals.push_front(std::make_pair(time0, val0));\n}\n\n// Same for quaternion. Ensure inputs and outputs are normalized.\nvoid extrapolateAtStartTime(double delta_time, \n  std::list<std::pair<double, vw::Quaternion<double>>> & vals) {\n\n    std::list<std::pair<double, vw::Quaternion<double>>>::iterator it = vals.begin();\n    double time1 = it->first;\n    auto q1 = it->second;\n    q1 = normalize(q1);\n    vw::Vector<double, 4> val1(q1.w(), q1.x(), q1.y(), q1.z());\n\n    it++;\n    double time2 = it->first;\n    auto q2 = it->second;\n    q2 = normalize(q2);\n    vw::Vector<double, 4> val2(q2.w(), q2.x(), q2.y(), q2.z());\n\n    double time0 = time1 - delta_time;\n    vw::Vector<double, 4> val0 = 2.0 * val1 - val2;\n    vw::Quaternion<double> q0(val0[0], val0[1], val0[2], val0[3]);\n    q0 = normalize(q0);\n\n    // Insert this at the start of the list\n    vals.push_front(std::make_pair(time0, q0));\n}\n\n// Insert one more value at the end of the list, based on extrapolated last two\n// values, at time based on extrapolating from last time.\nvoid extrapolateAtEndTime(double delta_time, \n  std::list<std::pair<double, vw::Vector3>> & vals) {\n\n    auto it = vals.rbegin();\n    double time1 = it->first;\n    vw::Vector3 val1 = it->second;\n\n    it++; // this goes backward in time from the end\n    double time2 = it->first;\n    vw::Vector3 val2 = it->second;\n\n    double time0 = time1 + delta_time;\n    vw::Vector3 val0 = 2 * val1 - val2;\n\n    // Insert this at the end of the list\n    vals.push_back(std::make_pair(time0, val0));\n}\n\n// Same for quaternion. Ensure inputs and outputs are normalized.\nvoid extrapolateAtEndTime(double delta_time, \n  std::list<std::pair<double, vw::Quaternion<double>>> & vals) {\n\n    std::list<std::pair<double, vw::Quaternion<double>>>::reverse_iterator it = vals.rbegin();\n    double time1 = it->first;\n    auto q1 = it->second;\n    q1 = normalize(q1);\n    vw::Vector<double, 4> val1(q1.w(), q1.x(), q1.y(), q1.z());\n\n    it++; // this goes backward in time from the end\n    double time2 = it->first;\n    auto q2 = it->second;\n    q2 = normalize(q2);\n    vw::Vector<double, 4> val2(q2.w(), q2.x(), q2.y(), q2.z());\n\n    double time0 = time1 + delta_time;\n    vw::Vector<double, 4> val0 = 2.0 * val1 - val2;\n\n    vw::Quaternion<double> q0(val0[0], val0[1], val0[2], val0[3]);\n    q0 = normalize(q0);\n\n    // Insert this at the end of the list\n    vals.push_back(std::make_pair(time0, q0));\n}\n\n// The position is already in GCC, so just pack into a function.\n// Currently this is identical to the velocity function, but this may change later.\nvoid PleiadesXML::setup_position_func\n(double time_t0, double time_dt,\n std::vector<vw::Vector3> & positions,\n double & pos_t0, double & pos_dt, double & pos_tend) {\n\n  // Sanity check, we should be able to find the position for each image line\n  size_t num_lines           = m_image_size[1];\n  double first_line_time     = time_t0;\n  double last_line_time      = time_t0 + time_dt * (num_lines - 1.0);\n  double num_positions       = m_positions.size();\n  double position_start_time = m_positions.front().first;\n  double position_stop_time  = m_positions.back().first;\n  double position_delta_t =\n    (position_stop_time - position_start_time) / (num_positions - 1.0);\n\n  // This is a persistent problem with Pleiades NEO data. Try to fix it.\n  for (int attempt = 0; attempt < 4; attempt++) {\n    if (position_start_time > first_line_time) {\n      vw_out() << \"Warning: The first tabulated position time is \"\n                << \"after the first line time. Will do linear extrapolation.\\n\";\n      if (attempt > 0)\n        vw_out()  << \"This is a repeated attempt.\\n\";\n      \n      extrapolateAtStartTime(position_delta_t, m_positions);\n    }\n\n    if (position_stop_time < last_line_time) {\n      vw_out()  << \"Warning: The last tabulated position time is before \"\n                << \"the last line time. Will do linear extrapolation.\\n\";\n      if (attempt > 0)\n        vw_out()  << \"This is a repeated attempt.\\n\";\n      extrapolateAtEndTime(position_delta_t, m_positions);\n    }\n    // Update these values  \n    num_positions       = m_positions.size();\n    position_start_time = m_positions.front().first;\n    position_stop_time  = m_positions.back().first;\n  }\n\n  // Check again\n  if (position_start_time > first_line_time || position_stop_time < last_line_time)\n    vw::vw_throw(ArgumentErr() << \"Extrapolation was not enough. The position \"\n      << \"timestamps do not fully span the range of times for the image lines.\");\n\n  std::vector<double>  time_vec;\n  std::vector<Vector3> position_vec;\n\n  // Loop through the positions and extract values\n  int index = 0;\n  for (auto iter = m_positions.begin(); iter != m_positions.end(); iter++) {\n    time_vec.push_back(iter->first);\n    position_vec.push_back(iter->second);\n\n    // Sanity check. The times at which the positions are given must\n    // be uniformly distributed.\n    if (index > 0) {\n      double err = std::abs(time_vec[index] - time_vec[index - 1] - position_delta_t)\n        / position_delta_t;\n      if (err > 1e-2)\n        vw_throw(ArgumentErr() << \"The position timestamps are not uniformly distributed.\");\n    }\n\n    index++;\n  }\n\n  // Return the uniformly-sampled data\n  positions = position_vec;\n  pos_t0    = position_start_time;\n  pos_dt    = position_delta_t;\n  pos_tend  = position_stop_time;\n}\n\n// Velocities are the sum of inertial velocities and the instantaneous\n//  Earth rotation.\n\n// The velocity is already in GCC, so just pack into a function.\nvoid PleiadesXML::setup_velocity_func\n(double time_t0, double time_dt,\n std::vector<vw::Vector3> & velocities,\n double & vel_t0, double & vel_dt, double & vel_tend) {\n\n  // Sanity check, we should be able to find the velocity for each image line\n  size_t num_lines           = m_image_size[1];\n  double first_line_time     = time_t0;\n  double last_line_time      = time_t0 + time_dt * (num_lines - 1.0);\n  double num_velocities      = m_velocities.size();\n  double velocity_start_time = m_velocities.front().first;\n  double velocity_stop_time  = m_velocities.back().first;\n  double velocity_delta_t =\n    (velocity_stop_time - velocity_start_time) / (num_velocities - 1.0);\n\n  // This is a persistent problem with Pleiades NEOdata. Try to fix it.\n  for (int attempt = 0; attempt < 4; attempt++) {\n    if (velocity_start_time > first_line_time) {\n      vw_out()  << \"Warning: The first tabulated velocity time is \"\n                << \"after the first line time. Will do linear extrapolation.\\n\";\n      if (attempt > 0)\n        vw_out() << \"This is a repeated attempt.\\n\";\n      extrapolateAtStartTime(velocity_delta_t, m_velocities);\n    }\n\n    if (velocity_stop_time < last_line_time) {\n      vw_out() << \"Warning: The last tabulated velocity time is before \"\n                << \"the last line time. Will do linear extrapolation.\\n\";\n      if (attempt > 0)\n        vw_out()  << \"This is a repeated attempt.\\n\";\n      extrapolateAtEndTime(velocity_delta_t, m_velocities);\n    }\n\n    // Update these values\n    num_velocities      = m_velocities.size();\n    velocity_start_time = m_velocities.front().first;\n    velocity_stop_time  = m_velocities.back().first;\n  }\n\n  // Check again\n  if (velocity_start_time > first_line_time || velocity_stop_time < last_line_time)\n    vw::vw_throw(ArgumentErr() << \"Extrapolation was not enough. The velocity \"\n      << \"timestamps do not fully span the range of times for the image lines.\");\n\n  std::vector<double>  time_vec;\n  std::vector<Vector3> velocity_vec;\n\n  // Loop through the velocities and extract values\n  int index = 0;\n  for (auto iter = m_velocities.begin(); iter != m_velocities.end(); iter++) {\n    time_vec.push_back(iter->first);\n    velocity_vec.push_back(iter->second);\n\n    // Sanity check. The times at which the velocities are given must\n    // be uniformly distributed.\n    if (index > 0) {\n      double err = std::abs(time_vec[index] - time_vec[index - 1] - velocity_delta_t)\n        / velocity_delta_t;\n      if (err > 1e-2) \n        vw_throw(ArgumentErr() << \"The velocity timestamps are not uniformly distributed.\");\n    }\n  \n    index++;\n  }\n\n  // Return the uniformly-sampled data\n  velocities = velocity_vec;\n  vel_t0     = velocity_start_time;\n  vel_dt     = velocity_delta_t;\n  vel_tend   = velocity_stop_time;\n}\n  \n// Set up the quaternions for NEO. This will create m_t0Quat, \n// m_dtQuat, m_quaternion_coeffs.\nvoid PleiadesXML::setup_pose_func(double time_t0, double time_dt) {\n\n  size_t num_lines           = m_image_size[1];\n  double first_line_time     = time_t0;\n  double last_line_time      = time_t0 + time_dt * (num_lines - 1.0);\n\n  double num_poses           = m_poses.size();\n  double pose_start_time     = m_poses.front().first;\n  double pose_stop_time      = m_poses.back().first;\n  double pose_delta_t =\n    (pose_stop_time - pose_start_time) / (num_poses - 1.0);\n\n  // This is a persistent problem with the Pleiades NEO data. Try to fix it.\n  for (int attempt = 0; attempt < 4; attempt++) {\n    if (pose_start_time > first_line_time) {\n      vw_out()  << \"Warning: The first tabulated quaternion time is \"\n                << \"after the first line time. Will do linear extrapolation.\\n\";\n      extrapolateAtStartTime(pose_delta_t, m_poses);\n    }\n    if (pose_stop_time < last_line_time) {\n      vw_out()  << \"Warning: The last tabulated quaternion time is before \"\n                << \"the last line time. Will do linear extrapolation.\\n\";\n      extrapolateAtEndTime(pose_delta_t, m_poses);\n    }\n    // Update these values\n    num_poses       = m_poses.size();\n    pose_start_time = m_poses.front().first;\n    pose_stop_time  = m_poses.back().first;\n  }\n\n  // Check again\n  if (pose_start_time > first_line_time || pose_stop_time < last_line_time)\n    vw::vw_throw(ArgumentErr() << \"Extrapolation was not enough. The quaternion \"\n      << \"timestamps do not fully span the range of times for the image lines.\");\n\n  // Populate the fields that we will be passed to the linescan model\n  m_quaternion_coeffs.clear();\n  std::vector<double> time_vec(m_poses.size());\n  int index = 0;\n  for (auto iter = m_poses.begin(); iter != m_poses.end(); iter++) {\n    time_vec[index] = iter->first;\n\n    auto q = iter->second;\n    vw::Vector<double, 4> v(q.w(), q.x(), q.y(), q.z());\n    m_quaternion_coeffs.push_back(v);\n    \n    // Sanity check. The times at which the quaternions are given must\n    // be uniformly distributed. The quaternions are sampled more\n    // densely than the positions and velocities, so we tolerate\n    // a bit more divergence from uniform sampling.\n    if (index > 0) {\n      double err = std::abs(time_vec[index] - time_vec[index - 1] - pose_delta_t) / pose_delta_t;\n      if (err > 1e-2) \n        vw_throw(ArgumentErr() << \"The quaternion timestamps are not uniformly distributed.\");\n    }\n    \n    index++;\n  }\n\n  // Calc the values that will be passed to Pleiades linescan model\n  m_t0Quat = m_poses.front().first;\n  m_dtQuat = pose_delta_t;\n\n  return;\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Camera/PleiadesXML.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Pleiades camera model. The documentation used is airbus-pleiades-imagery-user-guide-15042021.pdf.\n\n// These are objects that relate directly to block in XML that we need\n// to read. They only read and then store the raw values. Other\n// objects will interpret the results.\n\n#ifndef __STEREO_CAMERA_PLEIADES_XML_H__\n#define __STEREO_CAMERA_PLEIADES_XML_H__\n\n#include <vw/Core/FundamentalTypes.h>\n#include <vw/Core/Log.h>\n#include <vw/Math/Vector.h>\n#include <vw/Math/BBox.h>\n#include <vw/Camera/CameraModel.h>\n\n#include <vector>\n#include <string>\n\n#include <boost/smart_ptr/shared_ptr.hpp>\n#include <boost/date_time/posix_time/posix_time.hpp>\n\n// Special forward declare so we can hide the Xerces headers.\n#include <xercesc/util/XercesDefs.hpp> // Needed for this XERCES macro\nXERCES_CPP_NAMESPACE_BEGIN\n  class DOMDocument;\n  class DOMElement;\n  class XercesDOMParser;\n  class ErrorHandler;\nXERCES_CPP_NAMESPACE_END\n\nnamespace asp {\n\n  class PleiadesXML {\n  public:\n\n    /// Constructor\n    PleiadesXML(): m_start_time_is_set(false), m_ref_row(0), m_ref_col(0), m_accuracy_stdv(0.0), m_isNeoOrSpot67(false), m_t0Quat(-1.0), m_dtQuat(-1.0) {}\n\n    vw::Vector2i m_image_size;\n    vw::Vector2 m_coeff_psi_x, m_coeff_psi_y;\n    int m_ref_row, m_ref_col;\n\n    // These will be used to fit the quaternions for L1A and L1B data\n    double m_quat_offset_time, m_quat_scale;\n    std::vector<vw::Vector<double, 4>> m_quaternion_coeffs;\n    // For NEO and SPOT 6/7 (tabulated quaternions)\n    bool m_isNeoOrSpot67;\n    std::string m_sensor_name; // PHR_SENSOR, PNEO_SENSOR, S6_SENSOR, S7_SENSOR\n    double m_t0Quat, m_dtQuat;\n\n    double m_accuracy_stdv;\n    \n    /// Parse an XML file to populate the data\n    void read_xml(std::string const& xml_path);\n    \n    /// Parse an XML tree to populate the data\n    void parse_xml(xercesc::DOMElement* node);\n\n    // Functions to extract the raw input data from the XML fields.\n    void setup_time_func(double & time_t0, double & time_dt) const;\n    void setup_position_func(double time_t0, double time_dt,\n                             std::vector<vw::Vector3> & positions,\n                             double & pos_t0, double & pos_dt, double & pos_tend);\n    void setup_velocity_func(double time_t0, double time_dt,\n                             std::vector<vw::Vector3> & velocities,\n                             double & vel_t0, double & vel_dt, double & vel_tend);\n    void setup_pose_func(double time_t0, double time_dt);\n    \n  private: // The various XML data reading sections\n  \n    /// Opens the XML file for reading and returns the root node.\n    xercesc::DOMElement* open_xml_file(std::string const& xml_path);\n\n    void read_image_size  (xercesc::DOMElement* raster_data);\n    void read_times       (xercesc::DOMElement* time);\n    void read_ephemeris   (xercesc::DOMElement* ephemeris);\n    void read_attitudes   (xercesc::DOMElement* attitudes);\n    void read_attitudes_1A1B(xercesc::DOMElement* attitudes);\n    void read_attitudes_Neo(xercesc::DOMElement* attitudes);\n    void read_ref_col_row (xercesc::DOMElement* swath_range);\n    void read_look_angles (xercesc::DOMElement* look_angles);\n    void parse_accuracy_stdv(xercesc::DOMElement* root);\n\n    /// Converts a time from string to double precision in seconds.\n    /// All times are in seconds relative to the start time.\n    /// When the start time is passed in, use is_start_time = true.\n    double convert_time(std::string const& s, bool is_start_time);\n\n    std::string m_start_time_str;\n    boost::posix_time::ptime m_start_time_stamp;\n\n    // All times represented as doubles will be in seconds relative to m_start_time_stamp\n    bool   m_start_time_is_set;\n    double m_start_time, m_end_time;\n\n    double m_line_period;\n    \n    std::list<std::pair<double, vw::Vector3>> m_positions;        // time,   X/Y/Z)\n    std::list<std::pair<double, vw::Vector3>> m_velocities;       // time,   dX/dY/dZ)\n    std::list<std::pair<double, vw::Quaternion<double>>> m_poses; // time, quat, for NEO and SPOT 6/7\n    \n    boost::shared_ptr<xercesc::XercesDOMParser> m_parser;\n    boost::shared_ptr<xercesc::ErrorHandler>    m_err_handler;\n    \n  }; // End class PleiadesXML\n\n\n} //end namespace asp\n\n#endif//__STEREO_CAMERA_PLEIADES_XML_H__\n"
  },
  {
    "path": "src/asp/Camera/RPCModel.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Camera/RPCModel.h>\n\n#include <vw/Core/StringUtils.h>\n#include <vw/Math/Vector.h>\n#include <vw/FileIO/DiskImageResourceGDAL.h>\n#include <vw/FileIO/FileUtils.h>\n#include <vw/Cartography/Datum.h>\n#include <vw/Cartography/GeoReference.h>\n#include <vw/FileIO/FileTypes.h>\n#include <vw/Math/NewtonRaphson.h>\n\n#include <gdal.h>\n#include <gdal_priv.h>\n\n#include <boost/smart_ptr/shared_ptr.hpp>\n#include <boost/smart_ptr/shared_ptr.hpp>\n\nusing namespace vw;\n\nnamespace asp {\n\nvoid RPCModel::initialize(DiskImageResourceGDAL* resource) {\n\n  // Extract the datum (by means of georeference)\n  cartography::GeoReference georef;\n  cartography::read_georeference(georef, *resource);\n  m_datum = georef.datum();\n\n  // Initialize to 0\n  m_err_bias = 0.0;\n  m_err_rand = 0.0;\n\n  m_terrain_height = std::numeric_limits<double>::quiet_NaN();\n\n  // Extract RPC Info\n  boost::shared_ptr<GDALDataset> dataset = resource->get_dataset_ptr();\n  if (!dataset)\n    vw_throw(NotFoundErr() << \"RPCModel: Could not read data. No file has been opened.\");\n\n  GDALRPCInfo gdal_rpc;\n  if (!GDALExtractRPCInfo(dataset->GetMetadata(\"RPC\"),\n                          &gdal_rpc))\n    vw_throw(NotFoundErr() << \"RPCModel: GDAL resource appears not to have RPC metadata.\");\n\n  // Copy information over to our data structures.\n  m_lonlatheight_offset = Vector3(gdal_rpc.dfLONG_OFF,\n                                  gdal_rpc.dfLAT_OFF,\n                                  gdal_rpc.dfHEIGHT_OFF);\n  m_lonlatheight_scale = Vector3(gdal_rpc.dfLONG_SCALE,\n                                  gdal_rpc.dfLAT_SCALE,\n                                  gdal_rpc.dfHEIGHT_SCALE);\n  m_xy_offset = Vector2(gdal_rpc.dfSAMP_OFF,   gdal_rpc.dfLINE_OFF);\n  m_xy_scale  = Vector2(gdal_rpc.dfSAMP_SCALE, gdal_rpc.dfLINE_SCALE);\n\n  m_line_num_coeff   = CoeffVec(gdal_rpc.adfLINE_NUM_COEFF);\n  m_line_den_coeff   = CoeffVec(gdal_rpc.adfLINE_DEN_COEFF);\n  m_sample_num_coeff = CoeffVec(gdal_rpc.adfSAMP_NUM_COEFF);\n  m_sample_den_coeff = CoeffVec(gdal_rpc.adfSAMP_DEN_COEFF);\n\n  m_err_bias = gdal_rpc.dfERR_BIAS;\n  m_err_rand = gdal_rpc.dfERR_RAND;\n\n  m_terrain_height = std::numeric_limits<double>::quiet_NaN();\n}\n\nRPCModel::RPCModel(std::string const& filename) {\n\n  // Initialize to 0\n  m_err_bias = 0.0;\n  m_err_rand = 0.0;\n\n  m_terrain_height = std::numeric_limits<double>::quiet_NaN();\n\n  std::string ext = vw::get_extension(filename);\n  if (ext == \".rpb\") {\n    load_rpb_file(filename);\n    return;\n  }\n\n  // Must have this check, otherwise GDAL prints an error.\n  if (vw::has_image_extension(filename)) {\n    boost::shared_ptr<DiskImageResourceGDAL> s_ptr(new DiskImageResourceGDAL(filename));\n    initialize(s_ptr.get());\n  } else {\n    // Throw an error. It will be caught, but it will get printed\n    // only if no other approaches turn out to work later on.\n    vw_throw(ArgumentErr() << \"Not an image file: \" << filename);\n  }\n\n}\n\nRPCModel::RPCModel(DiskImageResourceGDAL* resource) {\n  initialize(resource);\n}\n\n// The constructor just copies all of the input data\nRPCModel::RPCModel(cartography::Datum const& datum,\n                    Vector<double,20> const& line_num_coeff,\n                    Vector<double,20> const& line_den_coeff,\n                    Vector<double,20> const& samp_num_coeff,\n                    Vector<double,20> const& samp_den_coeff,\n                    Vector2           const& xy_offset,\n                    Vector2           const& xy_scale,\n                    Vector3           const& lonlatheight_offset,\n                    Vector3           const& lonlatheight_scale,\n                    double err_bias, double err_rand,\n                    double terrain_height):\n  m_datum(datum),\n  m_line_num_coeff(line_num_coeff),\n  m_line_den_coeff(line_den_coeff),\n  m_sample_num_coeff(samp_num_coeff),\n  m_sample_den_coeff(samp_den_coeff),\n  m_xy_offset(xy_offset),\n  m_xy_scale(xy_scale),\n  m_lonlatheight_offset(lonlatheight_offset),\n  m_lonlatheight_scale(lonlatheight_scale),\n  m_err_bias(err_bias), m_err_rand(err_rand),\n  m_terrain_height(terrain_height) {}\n\nvoid RPCModel::load_rpb_file(std::string const& filename) {\n  //vw_out() << \"Reading RPC model from RPB file, defaulting to WGS84 datum.\\n\";\n\n  m_datum.set_well_known_datum(\"WGS84\");\n  std::ifstream f(filename.c_str());\n\n  // Initialize to 0\n  m_err_bias = 0.0;\n  m_err_rand = 0.0;\n\n  // Initialize to NaN\n  m_terrain_height = std::numeric_limits<double>::quiet_NaN();\n\n  std::string line;\n  std::vector<std::string> tokens;\n  bool lineNumCoeffs = false,\n    lineDenCoeffs = false,\n    sampNumCoeffs = false,\n    sampDenCoeffs = false;\n  int coeff_index = 0, max_coeff_index = 0;\n\n  // Read through each line in the file    \n  while (std::getline(f, line)) {\n\n    try {\n      // Break up the line\n      boost::split(tokens, line, boost::is_any_of(\"=,;\"));\n\n      // Parse keywords\n      if (line.find(\"lineOffset\") != std::string::npos)\n        m_xy_offset[1] = atof(tokens[1].c_str());\n      if (line.find(\"sampOffset\") != std::string::npos)\n        m_xy_offset[0] = atof(tokens[1].c_str());\n      if (line.find(\"latOffset\") != std::string::npos)\n        m_lonlatheight_offset[1] = atof(tokens[1].c_str());\n      if (line.find(\"longOffset\") != std::string::npos)\n        m_lonlatheight_offset[0] = atof(tokens[1].c_str());\n      if (line.find(\"heightOffset\") != std::string::npos)\n        m_lonlatheight_offset[2] = atof(tokens[1].c_str());\n      if (line.find(\"lineScale\") != std::string::npos)\n        m_xy_scale[1] = atof(tokens[1].c_str());\n      if (line.find(\"sampScale\") != std::string::npos)\n        m_xy_scale[0] = atof(tokens[1].c_str());\n      if (line.find(\"latScale\") != std::string::npos)\n        m_lonlatheight_scale[1] = atof(tokens[1].c_str());\n      if (line.find(\"longScale\") != std::string::npos)\n        m_lonlatheight_scale[0] = atof(tokens[1].c_str());\n      if (line.find(\"heightScale\") != std::string::npos)\n        m_lonlatheight_scale[2] = atof(tokens[1].c_str());\n\n      if (line.find(\"errBias\") != std::string::npos)\n        m_err_bias = atof(tokens[1].c_str());\n      if (line.find(\"errRand\") != std::string::npos)\n        m_err_rand = atof(tokens[1].c_str());\n\n      // Start of a coefficient sequence\n      if (line.find(\"lineNumCoef\") != std::string::npos) {\n        lineNumCoeffs = true;\n        continue;\n      } else if (line.find(\"lineDenCoef\") != std::string::npos) {\n        lineDenCoeffs = true;\n        continue;\n      } else if (line.find(\"sampNumCoef\") != std::string::npos) {\n        sampNumCoeffs = true;\n        continue;\n      } else if (line.find(\"sampDenCoef\") != std::string::npos) {\n        sampDenCoeffs = true;\n        continue;\n      }\n\n      // Handle the RPC coefficients\n      if (lineNumCoeffs) {\n        m_line_num_coeff[coeff_index] = atof(tokens[0].c_str());\n        coeff_index++;\n      }\n      if (lineDenCoeffs) {\n        m_line_den_coeff[coeff_index] = atof(tokens[0].c_str());\n        coeff_index++;\n      }\n      if (sampNumCoeffs) {\n        m_sample_num_coeff[coeff_index] = atof(tokens[0].c_str());\n        coeff_index++;\n      }\n      if (sampDenCoeffs) {\n        m_sample_den_coeff[coeff_index] = atof(tokens[0].c_str());\n        coeff_index++;\n      }\n\n      // Done reading a coefficient sequence\n      if (line.find(\")\") != std::string::npos) {\n        lineNumCoeffs = false;\n        lineDenCoeffs = false;\n        sampNumCoeffs = false;\n        sampDenCoeffs = false;\n\n        if (coeff_index > max_coeff_index)\n          max_coeff_index = coeff_index;\n\n        coeff_index = 0;\n      }\n\n    } catch(...) {\n      vw_throw(ArgumentErr() << \"Error reading file \" << filename\n                << \", line = \"  << line);\n    }\n  } // End loop through lines.\n  f.close();\n\n  // Basic error check\n  if (max_coeff_index != 20)\n    vw_throw(ArgumentErr() << \"Error reading file \" << filename\n              << \", loaded wrong number of coefficients.\");\n}\n\n// All of these implementations are largely inspired by the GDAL\n// code. We don't use the GDAL code unfortunately because they don't\n// make that part of the API available. However I believe this is a\n// safe reinterpretation that is safe to distribute.\nVector2 RPCModel::point_to_pixel(Vector3 const& point) const {\n  return geodetic_to_pixel(m_datum.cartesian_to_geodetic(point));\n}\n\nVector2 RPCModel::geodetic_to_pixel(Vector3 const& geodetic) const {\n\n  // Should we verify that the  input geodetic is in the box?\n\n  Vector3 normalized_geodetic =\n    elem_quot(geodetic - m_lonlatheight_offset, m_lonlatheight_scale);\n\n  Vector2 normalized_pixel = normalizedLlhToPix(normalized_geodetic);\n\n  return elem_prod(normalized_pixel, m_xy_scale) + m_xy_offset;\n}\n\nVector2 RPCModel::normalizedLlhToPix(Vector3 const& normalized_geodetic,\n                                     RPCModel::CoeffVec const& line_num_coeff,\n                                     RPCModel::CoeffVec const& line_den_coeff,\n                                     RPCModel::CoeffVec const& sample_num_coeff,\n                                     RPCModel::CoeffVec const& sample_den_coeff) {\n\n  CoeffVec term = calculate_terms(normalized_geodetic);\n  Vector2 normalized_pixel(dot_prod(term,sample_num_coeff) /\n                            dot_prod(term,sample_den_coeff),\n                            dot_prod(term,line_num_coeff) /\n                            dot_prod(term,line_den_coeff));\n\n  return normalized_pixel;\n}\n\nVector2 RPCModel::normalizedLlhToPix(Vector3 const& normalized_geodetic) const {\n\n  return normalizedLlhToPix(normalized_geodetic,\n                            m_line_num_coeff, m_line_den_coeff,\n                            m_sample_num_coeff, m_sample_den_coeff);\n}\n\nRPCModel::CoeffVec RPCModel::calculate_terms(vw::Vector3 const& normalized_geodetic) {\n\n  double x = normalized_geodetic.x(); // normalized lon\n  double y = normalized_geodetic.y(); // normalized lat\n  double z = normalized_geodetic.z(); // normalized height\n  CoeffVec result;\n  result[ 0] = 1.0;\n  result[ 1] = x;\n  result[ 2] = y;\n  result[ 3] = z;\n  result[ 4] = x*y;\n  result[ 5] = x*z;\n  result[ 6] = y*z;\n  result[ 7] = x*x;\n  result[ 8] = y*y;\n  result[ 9] = z*z;\n  result[10] = x*y*z;\n  result[11] = x*x*x;\n  result[12] = x*y*y;\n  result[13] = x*z*z;\n  result[14] = x*x*y;\n  result[15] = y*y*y;\n  result[16] = y*z*z;\n  result[17] = x*x*z;\n  result[18] = y*y*z;\n  result[19] = z*z*z;\n  return result;\n}\n\nvw::Vector<int,20> RPCModel::get_coeff_order() {\n  vw::Vector<int,20> result;\n  for (int i = 0; i < 3; i++) result[i] = 1;\n  for (int i = 3; i < 10; i++) result[i] = 2;\n  for (int i = 10; i < 20; i++) result[i] = 3;\n  return result;\n}\n\nvw::Matrix<double, 20, 2> RPCModel::terms_Jacobian2(vw::Vector3 const& normalized_geodetic) {\n  // Partial derivatives of the terms returned by the\n  // calculate_terms() function in respect to the first two\n  // variables only (unlike the terms_Jacobian3() function).\n\n  vw::Matrix<double, 20, 2> M;\n  double x = normalized_geodetic.x(); // normalized lon\n  double y = normalized_geodetic.y(); // normalized lat\n  double z = normalized_geodetic.z(); // normalized height\n\n  // df/dx            df/dy               // f\n  M[ 0][0] = 0.0;     M[ 0][1] = 0.0;     // 1\n  M[ 1][0] = 1.0;     M[ 1][1] = 0.0;     // x\n  M[ 2][0] = 0.0;     M[ 2][1] = 1.0;     // y\n  M[ 3][0] = 0.0;     M[ 3][1] = 0.0;     // z\n  M[ 4][0] = y;       M[ 4][1] = x;       // xy\n  M[ 5][0] = z;       M[ 5][1] = 0.0;     // xz\n  M[ 6][0] = 0.0;     M[ 6][1] = z;       // yz\n  M[ 7][0] = 2.0*x;   M[ 7][1] = 0.0;     // xx\n  M[ 8][0] = 0.0;     M[ 8][1] = 2.0*y;   // yy\n  M[ 9][0] = 0.0;     M[ 9][1] = 0.0;     // zz\n  M[10][0] = y*z;     M[10][1] = x*z;     // xyz\n  M[11][0] = 3.0*x*x; M[11][1] = 0.0;     // xxx\n  M[12][0] = y*y;     M[12][1] = 2.0*x*y; // xyy\n  M[13][0] = z*z;     M[13][1] = 0.0;     // xzz\n  M[14][0] = 2.0*x*y; M[14][1] = x*x;     // xxy\n  M[15][0] = 0.0;     M[15][1] = 3.0*y*y; // yyy\n  M[16][0] = 0.0;     M[16][1] = z*z;     // yzz\n  M[17][0] = 2.0*x*z; M[17][1] = 0.0;     // xxz\n  M[18][0] = 0.0;     M[18][1] = 2.0*y*z; // yyz\n  M[19][0] = 0.0;     M[19][1] = 0.0;     // zzz\n\n  return M;\n}\n\nvw::Matrix<double, 20, 3> RPCModel::terms_Jacobian3(vw::Vector3 const& normalized_geodetic) {\n  // Partial derivatives of the terms returned by the\n  // calculate_terms() function in respect to all three\n  // variables only (unlike the terms_Jacobian2() function).\n\n  vw::Matrix<double, 20, 3> M;\n  double x = normalized_geodetic.x(); // normalized lon\n  double y = normalized_geodetic.y(); // normalized lat\n  double z = normalized_geodetic.z(); // normalized height\n\n  // df/dx            df/dy               df/dz               // f\n  M[ 0][0] = 0.0;     M[ 0][1] = 0.0;     M[ 0][2] = 0.0;     // 1\n  M[ 1][0] = 1.0;     M[ 1][1] = 0.0;     M[ 1][2] = 0.0;     // x\n  M[ 2][0] = 0.0;     M[ 2][1] = 1.0;     M[ 2][2] = 0.0;     // y\n  M[ 3][0] = 0.0;     M[ 3][1] = 0.0;     M[ 3][2] = 1.0;     // z\n  M[ 4][0] = y;       M[ 4][1] = x;       M[ 4][2] = 0.0;     // xy\n  M[ 5][0] = z;       M[ 5][1] = 0.0;     M[ 5][2] = x;       // xz\n  M[ 6][0] = 0.0;     M[ 6][1] = z;       M[ 6][2] = y;       // yz\n  M[ 7][0] = 2.0*x;   M[ 7][1] = 0.0;     M[ 7][2] = 0.0;     // xx\n  M[ 8][0] = 0.0;     M[ 8][1] = 2.0*y;   M[ 8][2] = 0.0;     // yy\n  M[ 9][0] = 0.0;     M[ 9][1] = 0.0;     M[ 9][2] = 2.0*z;   // zz\n  M[10][0] = y*z;     M[10][1] = x*z;     M[10][2] = x*y;     // xyz\n  M[11][0] = 3.0*x*x; M[11][1] = 0.0;     M[11][2] = 0.0;     // xxx\n  M[12][0] = y*y;     M[12][1] = 2.0*x*y; M[12][2] = 0.0;     // xyy\n  M[13][0] = z*z;     M[13][1] = 0.0;     M[13][2] = 2.0*x*z; // xzz\n  M[14][0] = 2.0*x*y; M[14][1] = x*x;     M[14][2] = 0.0;     // xxy\n  M[15][0] = 0.0;     M[15][1] = 3.0*y*y; M[15][2] = 0.0;     // yyy\n  M[16][0] = 0.0;     M[16][1] = z*z;     M[16][2] = 2.0*y*z; // yzz\n  M[17][0] = 2.0*x*z; M[17][1] = 0.0;     M[17][2] = x*x;     // xxz\n  M[18][0] = 0.0;     M[18][1] = 2.0*y*z; M[18][2] = y*y;     // yyz\n  M[19][0] = 0.0;     M[19][1] = 0.0;     M[19][2] = 3.0*z*z; // zzz\n\n  return M;\n}\n\nRPCModel::CoeffVec\nRPCModel::quotient_Jacobian(RPCModel::CoeffVec const& c,\n                            RPCModel::CoeffVec const& d,\n                            RPCModel::CoeffVec const& u) {\n\n  // Return the Jacobian of dot_prod(c, u) / dot_prod(d, u)\n  // as a vector with 20 elements.\n\n  double cu  = dot_prod(c, u);\n  double du  = dot_prod(d, u);\n  double den = du*du;\n\n  return elem_quot(du * c - cu * d, den);\n}\n\n// Return the Jacobian of the function\n// f(x1, x2, x3) = ((x1 - c1)/q1, (x2 - c2)/q2, (x3 - c3)/q3)\nvw::Matrix3x3 RPCModel::normalization_Jacobian(Vector3 const& q) {\n\n  vw::Matrix3x3 M;\n  M[0][0] = 1.0/q[0]; M[0][1] = 0.0;      M[0][2] = 0.0;\n  M[1][0] = 0.0;      M[1][1] = 1.0/q[1]; M[1][2] = 0.0;\n  M[2][0] = 0.0;      M[2][1] = 0.0;      M[2][2] = 1.0/q[2];\n  return M;\n}\n\nMatrix<double, 2, 3>\nRPCModel::geodetic_to_pixel_Jacobian(Vector3 const& geodetic) const {\n\n  Vector3 normalized_geodetic = elem_quot(geodetic - m_lonlatheight_offset,\n                                          m_lonlatheight_scale);\n\n  CoeffVec term = calculate_terms(normalized_geodetic);\n\n  CoeffVec Qs = quotient_Jacobian(sample_num_coeff(), sample_den_coeff(), term);\n  CoeffVec Ql = quotient_Jacobian(line_num_coeff(),   line_den_coeff(),   term);\n  Matrix<double, 20, 3> MN = terms_Jacobian3(normalized_geodetic) *\n    normalization_Jacobian(m_lonlatheight_scale);\n\n  Matrix<double, 2, 3> J;\n  select_row(J, 0) = m_xy_scale[0] * transpose(Qs) * MN;\n  select_row(J, 1) = m_xy_scale[1] * transpose(Ql) * MN;\n\n  return J;\n}\n\n// This function is different from geodetic_to_pixel_Jacobian() in several\n// respects:\n// 1. The input is the normalized geodetic, and the derivatives\n//    are in respect to the normalized geodetic as well.\n// 2. The derivatives are taken only in respect to the first two\n//    variables (normalized lon and lat, no height).\n// 3. The output is in normalized pixels (see m_xy_scale and m_xy_offset).\nvw::Vector<double>\nRPCModel::normalizedLlhToPixJac(Vector3 const& normalized_geodetic) const {\n\n    CoeffVec term = calculate_terms(normalized_geodetic);\n\n    CoeffVec Qs = quotient_Jacobian(sample_num_coeff(), sample_den_coeff(), term);\n    CoeffVec Ql = quotient_Jacobian(line_num_coeff(),   line_den_coeff(),   term);\n\n    Matrix<double, 20, 2> Jt = terms_Jacobian2(normalized_geodetic);\n\n    Vector<double> J(4);\n    for (int i = 0; i < 4; i++) J[i] = 0;\n\n    // Compute J = [Qs^T, Ql^T] * Jt\n    for (int i = 0; i < 20; i++) {\n      J[0] += Qs[i] * Jt[i][0];\n      J[1] += Qs[i] * Jt[i][1];\n      J[2] += Ql[i] * Jt[i][0];\n      J[3] += Ql[i] * Jt[i][1];\n    }\n\n    return J;\n  }\n\n// Find the Jacobian of geodetic_to_pixel using numerical\n// differentiation. This is used for testing purposes.\nMatrix<double, 2, 3>\nRPCModel::geodetic_to_pixel_numerical_Jacobian(Vector3 const& geodetic,\n                                               double tol) const {\n\n  Matrix<double, 2, 3> J;\n\n  Vector2 B  = geodetic_to_pixel(geodetic);\n\n  Vector2 B0 = (geodetic_to_pixel(geodetic + Vector3(tol, 0,   0)) - B)/tol;\n  Vector2 B1 = (geodetic_to_pixel(geodetic + Vector3(0,   tol, 0)) - B)/tol;\n  Vector2 B2 = (geodetic_to_pixel(geodetic + Vector3(0,   0,   tol)) - B)/tol;\n\n  select_col(J, 0) = B0;\n  select_col(J, 1) = B1;\n  select_col(J, 2) = B2;\n\n  return J;\n}\n\n// A class that computes the normalized pixel and Jacobian via two versions of\n// operator(), in a way suitable to pass to the NewtonRaphson solver.\nstruct RpcFunJac {\n\n  RpcFunJac(RPCModel const& rpc, double height): m_rpc(rpc) {\n\n     m_normalized_height\n      = (height - m_rpc.m_lonlatheight_offset[2]) / m_rpc.m_lonlatheight_scale[2];\n  }\n\n  // The input is the normalized lon-lat. The output is the normalized pixel.\n  vw::Vector2 operator()(vw::Vector2 const& normalized_lonlat) {\n    return m_rpc.normalizedLlhToPix(Vector3(normalized_lonlat[0],\n                                            normalized_lonlat[1],\n                                            m_normalized_height));\n  }\n\n  // The input is the normalized lon-lat. The output is the Jacobian\n  // of the normalized pixel in respect to the normalized lon-lat.\n  vw::Vector<double> operator()(vw::Vector2 const& normalized_lonlat, double step) {\n\n    return m_rpc.normalizedLlhToPixJac(Vector3(normalized_lonlat[0],\n                                               normalized_lonlat[1],\n                                               m_normalized_height));\n  }\n\n  RPCModel const& m_rpc;\n  double m_normalized_height;\n};\n\n// Intersect the ray from the given pixel with surface at this\n// height above the datum.  Use Newton's method. The obtained\n// intersection point must project back into the pixel.\n// TODO(oalexan1): Replace the solver here with the logic in\n// vw/Math/NewtonRaphson.h.\nVector2 RPCModel::image_to_ground(Vector2 const& pixel, double height,\n                                  Vector2 lonlat_guess) const {\n\n  // Ensure the tolerance is rather tight, as later will trace rays\n  // through pairs of such ground points for triangulation.\n  double tol = 1e-10;\n\n  Vector2 normalized_pixel = elem_quot(pixel - m_xy_offset, m_xy_scale);\n\n  // The initial guess for the normalized lon-lat. \n  vw::Vector2 ll_off   = subvector(m_lonlatheight_offset, 0, 2);\n  vw::Vector2 ll_scale = subvector(m_lonlatheight_scale, 0, 2);\n  if (lonlat_guess == Vector2(0.0, 0.0))\n    lonlat_guess = ll_off; // initial guess\n  vw::Vector2 normalized_lonlat = elem_quot(lonlat_guess - ll_off, ll_scale);\n\n  // Set up Newton-Raphson. The RpcFunJac class computes both the function\n  // and its Jacobian via two versions of operator().\n  RpcFunJac rpc_fun_jac(*this, height);\n  vw::math::NewtonRaphson nr(rpc_fun_jac, rpc_fun_jac);\n  vw::Vector2 guess = normalized_lonlat;\n  double step = 1e-6; // Not used with analytic Jacobian, but part of the API.\n\n  // Find with normalized_lonlat such that\n  // normalized_pixel = rpc_fun_jac(normalized_lonlat).\n  normalized_lonlat = nr.solve(guess, normalized_pixel, step, tol);\n\n  // Undo the normalization\n  Vector2 lonlat = elem_prod(normalized_lonlat, ll_scale) + ll_off;\n\n  return lonlat;\n}\n\nvoid RPCModel::point_and_dir(Vector2 const& pix, Vector3 & P, Vector3 & dir) const {\n\n  // For an RPC model there is no defined origin so it and the ray need to be computed.\n  // Try to have the ray end points not too far from the center of the valid region.\n  // This can make a difference if the region is tall and the rays are curved.\n  const double VERT_SCALE_FACTOR = 0.9; // - The virtual center should be above the terrain\n  double delta = m_lonlatheight_scale[2]*VERT_SCALE_FACTOR; // measured in meters\n  delta = std::min(delta, 50.0);\n  delta = std::max(delta, 0.1);\n\n  // Center of valid region to bottom of valid region (normalized)\n  double  height_up = m_lonlatheight_offset[2] + delta;\n  double  height_dn = m_lonlatheight_offset[2] - delta;\n\n  // Given the pixel and elevation, estimate lon-lat.\n  // Use m_lonlatheight_offset as initial guess for lonlat_up,\n  // and then use lonlat_up as initial guess for lonlat_dn.\n  vw::Vector2 ll_off = subvector(m_lonlatheight_offset, 0, 2);\n  Vector2 lonlat_up = image_to_ground(pix, height_up, ll_off);\n  Vector2 lonlat_dn = image_to_ground(pix, height_dn, lonlat_up);\n\n  Vector3 geo_up = Vector3(lonlat_up[0], lonlat_up[1], height_up);\n  Vector3 geo_dn = Vector3(lonlat_dn[0], lonlat_dn[1], height_dn);\n\n  Vector3 P_up = m_datum.geodetic_to_cartesian(geo_up);\n  Vector3 P_dn = m_datum.geodetic_to_cartesian(geo_dn);\n\n  dir = normalize(P_dn - P_up);\n\n  // Set the origin location very far in the opposite direction of the pointing vector,\n  //  to put it high above the terrain. Normally the precise position along the ray\n  // should not make any difference, except perhaps in error propagation\n  // (see Covariance.cc).\n  // TODO(oalexan1): Use the logic from cam_gen.cc to shoot rays from the ground\n  // up and estimate where they intersect. That will give a better idea of the true\n  // elevation of the camera above the ground.\n  const double LONG_SCALE_UP = 100000.0; // 100 km above ground\n  P = P_up - dir*LONG_SCALE_UP;\n}\n\nVector3 RPCModel::camera_center(Vector2 const& pix) const{\n  // Return an arbitrarily chosen point on the ray back-projected\n  // through the camera from the current pixel.\n  Vector3 P;\n  Vector3 dir;\n  point_and_dir(pix, P, dir);\n  return P;\n}\n\nVector3 RPCModel::pixel_to_vector(Vector2 const& pix) const {\n  // Find the normalized direction of the ray back-projected through\n  // the camera from the current pixel.\n  Vector3 P;\n  Vector3 dir;\n  point_and_dir(pix, P, dir);\n  return dir;\n}\n\nstd::ostream& operator<<(std::ostream& os, const RPCModel& rpc) {\n  os << \"RPC Model:\"         << std::endl\n      << \"Line Numerator: \"   << rpc.line_num_coeff()      << std::endl\n      << \"Line Denominator: \" << rpc.line_den_coeff()      << std::endl\n      << \"Samp Numerator: \"   << rpc.sample_num_coeff()    << std::endl\n      << \"Samp Denominator: \" << rpc.sample_den_coeff()    << std::endl\n      << \"XY Offset: \"        << rpc.xy_offset()           << std::endl\n      << \"XY Scale: \"         << rpc.xy_scale()            << std::endl\n      << \"Geodetic Offset: \"  << rpc.lonlatheight_offset() << std::endl\n      << \"Geodetic Scale: \"   << rpc.lonlatheight_scale();\n  return os;\n}\n\n// Save the RPC model to an XML file. This is similar to the WorldView format.\n// GDAL can read it.\nvoid RPCModel::saveXML(std::string const& filename) const {\n\n  std::string lineoffset   = vw::num_to_str(xy_offset().y());\n  std::string sampoffset   = vw::num_to_str(xy_offset().x());\n  std::string latoffset    = vw::num_to_str(lonlatheight_offset().y());\n  std::string longoffset   = vw::num_to_str(lonlatheight_offset().x());\n  std::string heightoffset = vw::num_to_str(lonlatheight_offset().z());\n\n  std::string linescale   = vw::num_to_str(xy_scale().y());\n  std::string sampscale   = vw::num_to_str(xy_scale().x());\n  std::string latscale    = vw::num_to_str(lonlatheight_scale().y());\n  std::string longscale   = vw::num_to_str(lonlatheight_scale().x());\n  std::string heightscale = vw::num_to_str(lonlatheight_scale().z());\n\n  std::string linenumcoef = vw::vec_to_str(line_num_coeff());\n  std::string linedencoef = vw::vec_to_str(line_den_coeff());\n  std::string sampnumcoef = vw::vec_to_str(sample_num_coeff());\n  std::string sampdencoef = vw::vec_to_str(sample_den_coeff());\n\n  std::string datum_wkt = m_datum.get_wkt();\n\n  std::ofstream ofs(filename.c_str());\n  ofs.precision(17);\n\n  ofs << \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"yes\\\"?>\\n\";\n  ofs << \"<isd>\\n\";\n  ofs << \"    <RPB>\\n\";\n  ofs << \"        <IMAGE>\\n\";\n  ofs << \"            <RPC_DATUM>\"       << datum_wkt << \"</RPC_DATUM>\\n\";\n  ofs << \"            <ERRBIAS>\"         << m_err_bias << \"</ERRBIAS>\\n\";\n  ofs << \"            <ERRRAND>\"         << m_err_rand << \"</ERRRAND>\\n\";\n  ofs << \"            <LINEOFFSET>\"      << lineoffset   << \"</LINEOFFSET>\\n\";\n  ofs << \"            <SAMPOFFSET>\"      << sampoffset   << \"</SAMPOFFSET>\\n\";\n  ofs << \"            <LATOFFSET>\"       << latoffset    << \"</LATOFFSET>\\n\";\n  ofs << \"            <LONGOFFSET>\"      << longoffset   << \"</LONGOFFSET>\\n\";\n  ofs << \"            <HEIGHTOFFSET>\"    << heightoffset << \"</HEIGHTOFFSET>\\n\";\n  ofs << \"            <LINESCALE>\"       << linescale    << \"</LINESCALE>\\n\";\n  ofs << \"            <SAMPSCALE>\"       << sampscale    << \"</SAMPSCALE>\\n\";\n  ofs << \"            <LATSCALE>\"        << latscale     << \"</LATSCALE>\\n\";\n  ofs << \"            <LONGSCALE>\"       << longscale    << \"</LONGSCALE>\\n\";\n  ofs << \"            <HEIGHTSCALE>\"     << heightscale  << \"</HEIGHTSCALE>\\n\";\n  ofs << \"            <LINENUMCOEFList>\\n\";\n  ofs << \"                <LINENUMCOEF>\" << linenumcoef  << \"</LINENUMCOEF>\\n\";\n  ofs << \"            </LINENUMCOEFList>\\n\";\n  ofs << \"            <LINEDENCOEFList>\\n\";\n  ofs << \"                <LINEDENCOEF>\" << linedencoef  << \"</LINEDENCOEF>\\n\";\n  ofs << \"            </LINEDENCOEFList>\\n\";\n  ofs << \"            <SAMPNUMCOEFList>\\n\";\n  ofs << \"                <SAMPNUMCOEF>\" << sampnumcoef  << \"</SAMPNUMCOEF>\\n\";\n  ofs << \"            </SAMPNUMCOEFList>\\n\";\n  ofs << \"            <SAMPDENCOEFList>\\n\";\n  ofs << \"                <SAMPDENCOEF>\" << sampdencoef  << \"</SAMPDENCOEF>\\n\";\n  ofs << \"            </SAMPDENCOEFList>\\n\";\n  ofs << \"        </IMAGE>\\n\";\n  ofs << \"    </RPB>\\n\";\n  ofs << \"</isd>\\n\";\n  ofs.close();\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Camera/RPCModel.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// RPC model and triangulation. Following the paper:\n\n/// Jacek Grodecki, Gene Dial and James Lutes, \"Mathematical Model for\n/// 3D Feature Extraction from Multiple Satellite Images Described by\n/// RPCs.\" Proceedings of ASPRS 2004 Conference, Denver, Colorado, May,\n/// 2004.\n\n/// Digital Globe images (and others) often include an RPC camera model\n/// definition.  The RPC model is less complicated than the full Digital\n/// Globe camera model.\n\n#ifndef __STEREO_CAMERA_RPC_MODEL_H__\n#define __STEREO_CAMERA_RPC_MODEL_H__\n\n#include <vw/Math/Matrix.h>\n#include <vw/Math/Vector.h>\n#include <vw/Camera/CameraModel.h>\n#include <vw/Cartography/Datum.h>\n\n#include <string>\n#include <ostream>\n\nnamespace vw {\n  class DiskImageResourceGDAL;\n}\n\nnamespace asp {\n\n  class RPCModel : public vw::camera::CameraModel {\n\n  public:\n\n    // These integers show up in a lot of RPC code\n    static const int GEODETIC_COORD_SIZE = 3;\n    static const int IMAGE_COORD_SIZE    = 2;\n    static const int NUM_RPC_COEFFS = 78; // Total number of RPC coefficients\n\n    typedef vw::Vector<double,20> CoeffVec;\n\n    /// Construct from a GDAL image or an .RPB file.\n    RPCModel(std::string const& filename);\n\n    RPCModel(vw::DiskImageResourceGDAL* resource);\n    RPCModel(vw::cartography::Datum const& datum,\n             CoeffVec    const& line_num_coeff,\n             CoeffVec    const& line_den_coeff,\n             CoeffVec    const& samp_num_coeff,\n             CoeffVec    const& samp_den_coeff,\n             vw::Vector2 const& xy_offset,\n             vw::Vector2 const& xy_scale,\n             vw::Vector3 const& lonlatheight_offset,\n             vw::Vector3 const& lonlatheight_scale,\n             double err_bias = 0.0,\n             double err_rand = 0.0,\n             double terrain_height = std::numeric_limits<double>::quiet_NaN());\n\n    virtual std::string type() const { return \"RPC\"; }\n    virtual ~RPCModel() {}\n\n    // Save the RPC model to an XML file. This is similar to the WorldView format.\n    // GDAL can read it.\n    void saveXML(std::string const& filename) const;\n    \n    /// Populate this object from a .RPB file.\n    void load_rpb_file(std::string const& filename);\n\n    // Standard Access Methods. The concept of camera_center does not\n    // apply well to RPC, we just return an arbitrary point on the ray.\n    virtual vw::Vector2 point_to_pixel (vw::Vector3 const& point) const;\n    virtual vw::Vector3 pixel_to_vector(vw::Vector2 const& pix) const;\n    virtual vw::Vector3 camera_center  (vw::Vector2 const& pix) const;\n\n   // Apply a transform to an RPC model\n   void applyTransform(vw::Matrix4x4 const& transform);\n\n    static vw::Vector2 normalizedLlhToPix\n      (vw::Vector3 const& normalized_geodetic,\n       CoeffVec    const& line_num_coeff,   CoeffVec const& line_den_coeff,\n       CoeffVec    const& sample_num_coeff, CoeffVec const& sample_den_coeff);\n\n    // Normalized lon-lat-height to normalized pixel\n    vw::Vector2 normalizedLlhToPix(vw::Vector3 const& normalized_geodetic) const;\n\n    vw::Vector2 geodetic_to_pixel(vw::Vector3 const& geodetic) const;\n\n    // Access to constants\n    vw::cartography::Datum const& datum   () const { return m_datum;               }\n    CoeffVec    const& line_num_coeff     () const { return m_line_num_coeff;      }\n    CoeffVec    const& line_den_coeff     () const { return m_line_den_coeff;      }\n    CoeffVec    const& sample_num_coeff   () const { return m_sample_num_coeff;    }\n    CoeffVec    const& sample_den_coeff   () const { return m_sample_den_coeff;    }\n    vw::Vector2 const& xy_offset          () const { return m_xy_offset;           }\n    vw::Vector2 const& xy_scale           () const { return m_xy_scale;            }\n    vw::Vector3 const& lonlatheight_offset() const { return m_lonlatheight_offset; }\n    vw::Vector3 const& lonlatheight_scale () const { return m_lonlatheight_scale;  }\n\n    /// Returns a vector containing the order of each of the terms a CoeffVec applies to.\n    static vw::Vector<int, 20> get_coeff_order();\n\n    // Helper methods used for triangulation and projection\n    static CoeffVec calculate_terms(vw::Vector3 const& normalized_geodetic);\n    static vw::Matrix<double, 20, 2> terms_Jacobian2(vw::Vector3 const& normalized_geodetic);\n    static vw::Matrix<double, 20, 3> terms_Jacobian3(vw::Vector3 const& normalized_geodetic);\n    static CoeffVec quotient_Jacobian(CoeffVec const& c, CoeffVec const& d,\n                                       CoeffVec const& u);\n    static vw::Matrix3x3 normalization_Jacobian(vw::Vector3 const& q);\n\n    vw::Matrix<double, 2, 3> geodetic_to_pixel_Jacobian (vw::Vector3 const& geodetic) const;\n    vw::Matrix<double, 2, 3> geodetic_to_pixel_numerical_Jacobian (vw::Vector3 const& geodetic, double tol) const;\n    vw::Vector<double> normalizedLlhToPixJac(vw::Vector3 const& normalized_geodetic) const;\n\n    /// Given a pixel (the projection of a point in 3D space onto the camera image)\n    /// and the value of the height of the point, find the lonlat of the point\n    /// using Newton's method. The user may provide a guess for the lonlat.\n    vw::Vector2 image_to_ground(vw::Vector2 const& pixel, double height,\n                                vw::Vector2 lonlat_guess = vw::Vector2(0.0, 0.0)) const;\n\n    /// Find a point which gets projected onto the current pixel,\n    /// and the direction of the ray going through that point.\n    void point_and_dir(vw::Vector2 const& pix, vw::Vector3 & P, vw::Vector3 & dir) const;\n\n    // Will be read only for DG RPC camera models and set to 0 for the rest\n    double m_err_bias, m_err_rand;\n    \n    // The height used for ortho images (for Maxar and Pleiades)\n    double m_terrain_height;\n\n    // Quantities used to normalize lon-lat-height before applying the RPC model\n    vw::Vector3 m_lonlatheight_offset;\n    vw::Vector3 m_lonlatheight_scale;\n\n  private:\n    vw::cartography::Datum m_datum;\n\n    // Scaling parameters\n    CoeffVec    m_line_num_coeff,   m_line_den_coeff,\n                m_sample_num_coeff, m_sample_den_coeff;\n    vw::Vector2 m_xy_offset;\n    vw::Vector2 m_xy_scale;\n\n    void initialize(vw::DiskImageResourceGDAL* resource);\n  };\n\n  std::ostream& operator<<(std::ostream& os, const RPCModel& rpc);\n}\n\n#endif //__STEREO_CAMERA_RPC_MODEL_H__\n"
  },
  {
    "path": "src/asp/Camera/RPCModelGen.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Camera/RPCModelGen.h>\n#include <asp/Camera/RpcUtils.h>\n#include <asp/Camera/RPCModel.h>\n\n#include <vw/Math/Geometry.h>\n#include <vw/Math/BBox.h>\n\nusing namespace vw;\n\nnamespace asp {\n\n// There are 20 polynomial coefficients for each of lineNum,\n// lineDen, sampNum, sampDen, as the RPC polynomials are of degree\n// 3 in x and y.  However, the 0 degree coeffs for both\n// denominators is 1, so only 78 coefficients vary. Extract the\n// variable coefficients from a vector.\nvoid unpackCoeffs(Vector<double> const& C,\n                  RPCModel::CoeffVec& lineNum, RPCModel::CoeffVec& lineDen,\n                  RPCModel::CoeffVec& sampNum, RPCModel::CoeffVec& sampDen) {\n\n  VW_ASSERT(C.size() == 78,\n            ArgumentErr() << \"Must have 78 coefficients.\\n\");\n\n  int start = 0;\n  // Line\n  subvector(lineNum, 0, 20) = subvector(C, start, 20); start += 20;\n  lineDen[0] = 1;\n  subvector(lineDen, 1, 19) = subvector(C, start, 19); start += 19;\n  // Sample\n  subvector(sampNum, 0, 20) = subvector(C, start, 20); start += 20;\n  sampDen[0] = 1;\n  subvector(sampDen, 1, 19) = subvector(C, start, 19); start += 19;\n\n  VW_ASSERT(start == 78, ArgumentErr() << \"Book-keeping error.\\n\");\n\n  return;\n}\n\n// This function does the reverse of unpackCoeffs().\nvoid packCoeffs(RPCModel::CoeffVec const& lineNum, RPCModel::CoeffVec const& lineDen,\n                RPCModel::CoeffVec const& sampNum, RPCModel::CoeffVec const& sampDen,\n                Vector<double> & C) {\n\n  C.set_size(78);\n  int start = 0;\n  subvector(C, start, 20) = subvector(lineNum, 0, 20); start += 20;\n  subvector(C, start, 19) = subvector(lineDen, 1, 19); start += 19;\n  subvector(C, start, 20) = subvector(sampNum, 0, 20); start += 20;\n  subvector(C, start, 19) = subvector(sampDen, 1, 19); start += 19;\n\n  return;\n}\n\n// Given a set of RPC coefficients, compute the projected pixels. The input is\n// the RPC coefficients, packed in a vector. For each normalized geodetic,\n// compute the normalized pixel value. This will be the output. Add the\n// penalization terms to the output. See the note later in the code.\nRpcSolveLMA::result_type RpcSolveLMA::operator()(RpcSolveLMA::domain_type const& C) const {\n\n  // Unpack all the RPC model coefficients from the input vector C\n  RPCModel::CoeffVec lineNum, lineDen, sampNum, sampDen;\n  unpackCoeffs(C, lineNum, lineDen, sampNum, sampDen);\n\n  // Initialize the output vector\n  int numPts = m_normalizedGeodetics.size()/RPCModel::GEODETIC_COORD_SIZE;\n  result_type result;\n  result.set_size(m_normalizedPixels.size());\n  \n  // Loop through each test point\n  for (int i = 0; i < numPts; i++){\n    // Unpack the normalized geodetic coordinates\n    vw::Vector3 G = subvector(m_normalizedGeodetics, RPCModel::GEODETIC_COORD_SIZE*i, \n                              RPCModel::GEODETIC_COORD_SIZE);\n    \n    // Project the normalized geodetic coordinate into the RPC camera to get a normalized pixel\n    vw::Vector2 pxn = RPCModel::normalizedLlhToPix(G, lineNum, lineDen,\n                                                                        sampNum, sampDen);\n          \n    // Pack the normalized pixel into the output result vector\n    subvector(result, RPCModel::IMAGE_COORD_SIZE*i, RPCModel::IMAGE_COORD_SIZE) = pxn;\n\n  }\n\n  // There are 4*20 - 2 = 78 coefficients we optimize. Of those, 2\n  // are 0-th degree, 4*3 = 12 are 1st degree, and the rest, 78 - 12\n  // - 2 = 64 are higher degree.  Per Hartley, we'll add for each\n  // such coefficient c, a term K*c in the cost function vector,\n  // where K is a large number. This will penalize large values in\n  // the higher degree coefficients.\n  // - These values are attached to the end of the output vector\n  int count = RPCModel::IMAGE_COORD_SIZE*numPts; \n  vw::Vector<int,20> coeff_order = RPCModel::get_coeff_order(); // This ranges from 1 to 3\n  for (int i = 4; i < (int)lineNum.size(); i++)\n    result[count++] = m_wt*lineNum[i] * (coeff_order[i]-1);\n  for (int i = 4; i < (int)lineDen.size(); i++)\n    result[count++] = m_wt*lineDen[i] * (coeff_order[i]-1);\n  for (int i = 4; i < (int)sampNum.size(); i++)\n    result[count++] = m_wt*sampNum[i] * (coeff_order[i]-1);\n  for (int i = 4; i < (int)sampDen.size(); i++)\n    result[count++] = m_wt*sampDen[i] * (coeff_order[i]-1);\n\n  VW_ASSERT((int)result.size() == count, vw::ArgumentErr() << \"Book-keeping error.\\n\");\n\n  return result;\n}\n  \n// Print out a name followed by the vector of values\nvoid print_vec(std::string const& name, Vector<double> const& vals) {\n  std::cout.precision(16);\n  std::cout << name << \",\";\n  int len = vals.size();\n  for (int i = 0; i < len - 1; i++)\n    std::cout << vals[i] << \",\";\n  if (len > 0)\n    std::cout << vals[len-1];\n  std::cout << \"\\n\";\n}\n\n// Dump a vector to a text file, one value per row.\nvoid print_vec_to_file(std::string const& path, Vector<double> const& vals) {\n  std::ofstream outFile(path.c_str());\n  outFile.precision(16);\n  int len = vals.size();\n  for (int i = 0; i < len - 1; i++)\n    outFile << vals[i] << \"\\n\";\n  if (len > 0)\n    outFile << vals[len-1];\n  outFile.close();\n\n}\n\n// Computes a system solution from a seed and returns the final error number.\nint find_solution_from_seed(RpcSolveLMA    const& lma_model,\n                            Vector<double> const& seed_params,\n                            Vector<double> const& actual_observations,\n                            Vector<double>      & final_params,\n                            double              & norm_error) {\n\n  // Initialize a zero vector of RPC model coefficients\n  int status;\n\n  // Use the L-M solver to optimize the RPC model coefficient values.\n  double abs_tolerance  = 1e-10;\n  double rel_tolerance  = 1e-10;\n  int    max_iterations = 1000;\n  final_params = math::levenberg_marquardt(lma_model, seed_params, actual_observations,\n                                           status, abs_tolerance, rel_tolerance,\n                                           max_iterations);\n\n  if (status < 1) { // This means the solver failed to converge\n    VW_OUT(DebugMessage, \"asp\") \n      << \"rpc_gen: WARNING --> Levenberg-Marquardt solver status = \" << status << \"\\n\";\n  }\n\n  // Otherwise the solver converged, return the final error number.\n  Vector<double> final_projected = lma_model(final_params);\n  Vector<double> final_error     = lma_model.difference(final_projected, actual_observations);\n  norm_error = norm_2(final_error);\n  return status;\n}\n\n// Find the best-fit affine transform, that will serve as initial guess for RPC\nvoid initRpcAsAffine(// Inputs\n                     Vector<double> const& normalized_geodetics,\n                     Vector<double> const& normalized_pixels,\n                     // Outputs\n                     RPCModel::CoeffVec & line_num,\n                     RPCModel::CoeffVec & line_den,\n                     RPCModel::CoeffVec & samp_num,\n                     RPCModel::CoeffVec & samp_den) {\n  \n  int numPts = normalized_geodetics.size()/RPCModel::GEODETIC_COORD_SIZE;\n  int numPts2 = (normalized_pixels.size() - asp::RpcSolveLMA::NUM_PENALTY_TERMS)\n    / RPCModel::IMAGE_COORD_SIZE;\n  \n  if (numPts != numPts2) \n    vw_throw( ArgumentErr() << \"Error in \" << __FILE__\n              << \". Number of inputs and outputs do not agree.\\n\");\n  std::vector<Vector<double, RPCModel::GEODETIC_COORD_SIZE+1>> in(numPts), out(numPts);\n  for (int p = 0; p < numPts; p++) {\n\n    Vector<double, RPCModel::GEODETIC_COORD_SIZE+1> P;\n    for (int q = 0; q < RPCModel::GEODETIC_COORD_SIZE; q++) \n      P[q] = normalized_geodetics[p*RPCModel::GEODETIC_COORD_SIZE + q]; // P[0], P[1], P[2]\n    P[RPCModel::GEODETIC_COORD_SIZE] = 1; // P[3]\n    in[p] = P;\n    \n    for (int q = 0; q < RPCModel::IMAGE_COORD_SIZE; q++) \n      P[q] = normalized_pixels[p*RPCModel::IMAGE_COORD_SIZE + q]; // P[0], P[1]\n    P[RPCModel::IMAGE_COORD_SIZE]   = 0; // P[2]\n    P[RPCModel::IMAGE_COORD_SIZE+1] = 1; // P[3]\n    out[p] = P;\n  }\n  Matrix4x4 T = math::AffineFittingFunctorN<RPCModel::GEODETIC_COORD_SIZE>()(in, out);\n\n  // Put this matrix in the format acceptable for the RPC solver\n  for (int p = 0; p < int(line_num.size()); p++) {\n    samp_num[p] = 0; samp_den[p] = 0; // first coordinate of output is sample\n    line_num[p] = 0; line_den[p] = 0; // second coordinate of output is line\n  }\n\n  // The first coordinate of the output\n  samp_num[0] = T(0, 3); // the d value, the translation, in a*x + b*y + c*z + d\n  samp_num[1] = T(0, 0); samp_num[2] = T(0, 1); samp_num[3] = T(0, 2); // linear part, a, b, c\n  \n  // The second coordinate of the output\n  line_num[0] = T(1, 3); // the d value, the translation, in a*x + b*y + c*z + d\n  line_num[1] = T(1, 0); line_num[2] = T(1, 1); line_num[3] = T(1, 2); // linear part, a, b, c\n\n  // The denominator is just 1 to start\n  samp_den[0] = 1.0;\n  line_den[0] = 1.0;\n}\n\n// Form the normalized llh and pixel arrays that will be as inputs to the RPC solver\n// Form the normalized llh and pixel arrays that will be as inputs to the RPC solver\nvoid normalizeLlhPix(std::vector<vw::Vector3> const& llh_vec,\n                     std::vector<vw::Vector2> const& pix_vec,\n                     vw::Vector3 const& llh_offset, vw::Vector3 const& llh_scale, \n                     vw::Vector2 const& pixel_offset, vw::Vector2 const& pixel_scale, \n                     // Outputs\n                     vw::Vector<double> & normalized_llh, \n                     vw::Vector<double> & normalized_pixels) {\n\n  // Allocate the inputs, including with space for the penalty terms in the\n  // normalized pixels, that are zero for now.\n  int num_total_pts = llh_vec.size();\n  normalized_llh.set_size(asp::RPCModel::GEODETIC_COORD_SIZE*num_total_pts);\n  normalized_pixels.set_size(asp::RPCModel::IMAGE_COORD_SIZE*num_total_pts\n                              + asp::RpcSolveLMA::NUM_PENALTY_TERMS);\n\n  for (size_t i = 0; i < normalized_pixels.size(); i++)\n    normalized_pixels[i] = 0.0; \n\n  // Form the arrays of normalized pixels and normalized llh\n  for (int pt = 0; pt < num_total_pts; pt++) {\n    // Normalize the pixel to the [-1, 1] range\n    vw::Vector3 llh_n   = elem_quot(llh_vec[pt] - llh_offset, llh_scale);\n    vw::Vector2 pixel_n = elem_quot(pix_vec[pt] - pixel_offset, pixel_scale);\n    vw::math::subvector(normalized_llh, asp::RPCModel::GEODETIC_COORD_SIZE*pt,\n              asp::RPCModel::GEODETIC_COORD_SIZE) = llh_n;\n    vw::math::subvector(normalized_pixels, asp::RPCModel::IMAGE_COORD_SIZE*pt,\n              asp::RPCModel::IMAGE_COORD_SIZE) = pixel_n;\n  }\n  \n}\n  \n// Find the best-fit RPC given the normalized geodetic and pixel values\nvoid gen_rpc(// Inputs\n             double penalty_weight,\n             Vector<double> const& normalized_geodetics,\n             Vector<double> const& normalized_pixels,\n             bool refine_only,\n             // Outputs\n             RPCModel::CoeffVec & line_num,\n             RPCModel::CoeffVec & line_den,\n             RPCModel::CoeffVec & samp_num,\n             RPCModel::CoeffVec & samp_den) {\n\n  VW_ASSERT(penalty_weight >= 0, \n            ArgumentErr() << \"The RPC penalty weight must be non-negative.\\n\" );\n\n  // The percentage of the error that the penalty weights should represent\n  double penalty_weight_fraction = penalty_weight;\n  // Fraction with no adjustment\n  double native_penalty_fraction\n    = (double)RpcSolveLMA::NUM_PENALTY_TERMS / (double)normalized_pixels.size();\n  double penalty_adjustment = penalty_weight_fraction / native_penalty_fraction;\n\n  // Initialize the RPC model with an affine transform, unless asked to refine only\n  if (!refine_only)\n    initRpcAsAffine(normalized_geodetics, normalized_pixels,\n                    line_num, line_den, samp_num, samp_den);      \n  \n  // Initialize the model\n  Vector<double> startGuess;\n  startGuess.set_size(RPCModel::NUM_RPC_COEFFS);\n  packCoeffs(line_num, line_den, samp_num, samp_den, startGuess);\n\n  Vector<double> solution;\n  double norm_error = -1.0;\n\n  // Initialize a specialized least squares solver object and load the input data\n  RpcSolveLMA lma_model(normalized_geodetics, normalized_pixels, penalty_adjustment);\n\n  // Use the L-M solver to optimize the RPC model coefficient values.\n  int status = find_solution_from_seed(lma_model, startGuess, normalized_pixels,\n                                       solution, norm_error);\n  VW_OUT(DebugMessage, \"asp\") << \"Solved RPC coeffs: \" << solution << \"\\n\";\n  VW_OUT(DebugMessage, \"asp\") << \"rpc_gen: norm_error = \" << norm_error << \"\\n\";\n\n  // If we ever want to improve our results further we should\n  // experiment with multiple starting seeds\n  unpackCoeffs(solution, line_num, line_den, samp_num, samp_den);\n}\n\n// Extract the 3x3 rotation matrix R and 3D translation vector T from a 4x4 ECEF\n// transformation matrix.\nvoid extractRotTrans(vw::Matrix4x4 const& ecef_transform,\n                     vw::Matrix3x3& R, vw::Vector3& T) {\n\n   // Extract the 3x3 rotation submatrix\n   R = submatrix(ecef_transform, 0, 0, 3, 3);\n   \n   // Extract the translation vector from the last column \n   T[0] = ecef_transform(0, 3);\n   T[1] = ecef_transform(1, 3); \n   T[2] = ecef_transform(2, 3);\n}\n\n// Transform a vector of lon-lat-height coordinates in place using a rotation matrix and translation vector\nvoid transformLlhVec(std::vector<vw::Vector3> const& llh,\n                     vw::Matrix3x3 const& R, vw::Vector3 const& T,\n                     vw::cartography::Datum const& datum,\n                     std::vector<vw::Vector3> & trans_llh) {\n\n  // Resize the output\n  trans_llh.resize(llh.size());                          \n\n  // Iterate in i over llh\n  for (size_t i = 0; i < llh.size(); i++) {\n    \n    // Convert from LLH to ECEF XYZ\n    Vector3 xyz = datum.geodetic_to_cartesian(llh[i]);\n    \n    // Apply rotation and translation\n    Vector3 transformed_xyz = R * xyz + T;\n    \n    // Convert back to LLH and store in trans_llh\n    trans_llh[i] = datum.cartesian_to_geodetic(transformed_xyz);\n  }\n}\n\n// Apply a transform to a box in lon-lat-height coordinates\nvoid transformLlhBox(vw::Vector3 const& llh_offset_in,\n                              Vector3 const& llh_scale_in, \n                              vw::Matrix3x3 const& R,\n                              vw::Vector3 const& T,\n                              vw::cartography::Datum const& datum,\n                              // Outputs\n                              vw::Vector3& llh_offset_out,\n                              vw::Vector3& llh_scale_out) {\n\n   // First reconstruct the min/max bounds from offset and scale\n   Vector3 llh_min = llh_offset_in - llh_scale_in;\n   Vector3 llh_max = llh_offset_in + llh_scale_in;\n\n   // Convert min/max to cartesian\n   Vector3 xyz_min = datum.geodetic_to_cartesian(llh_min);\n   Vector3 xyz_max = datum.geodetic_to_cartesian(llh_max);\n\n   // Apply transform to both points\n   Vector3 xyz_min_trans = R * xyz_min + T;\n   Vector3 xyz_max_trans = R * xyz_max + T;\n\n   // Convert transformed points back to llh\n   Vector3 llh_min_trans = datum.cartesian_to_geodetic(xyz_min_trans);\n   Vector3 llh_max_trans = datum.cartesian_to_geodetic(xyz_max_trans);\n\n   // Calculate new offset and scale from transformed min/max\n   llh_offset_out = (llh_max_trans + llh_min_trans) / 2.0;\n   llh_scale_out = (llh_max_trans - llh_min_trans) / 2.0;\n}\n\n// Produce a transformed RPC model\nasp::RPCModel transformRpc(asp::RPCModel const& rpc_model, \n                           vw::Matrix4x4 const& transform,\n                           vw::BBox2 const& image_box,\n                           double & pixel_err) {\n\n  // Initialize the output pixel error\n  pixel_err = 0.0;\n  \n  vw::Vector3 llh_offset       = rpc_model.lonlatheight_offset();\n  vw::Vector3 llh_scale        = rpc_model.lonlatheight_scale();\n  vw::Vector2 pixel_offset     = rpc_model.xy_offset();\n  vw::Vector2 pixel_scale      = rpc_model.xy_scale();\n  vw::cartography::Datum datum = rpc_model.datum();\n  \n  vw::BBox2 lon_lat_range;\n  lon_lat_range.min() = subvector(llh_offset - llh_scale, 0, 2);\n  lon_lat_range.max() = subvector(llh_offset + llh_scale, 0, 2);\n  vw::Vector2 height_range;\n  height_range[0] = llh_offset[2] - llh_scale[2];\n  height_range[1] = llh_offset[2] + llh_scale[2];\n\n  // Generate point pairs and add pixels along image perimeter and diagonals\n  std::vector<Vector3> llh_vec;\n  std::vector<Vector2> pix_vec;\n  vw::CamPtr cam(new asp::RPCModel(rpc_model)); // a copy as required by the api\n  int num_samples = 20; // TODO(oalexan1): Think about this\n  asp::sample_llh_pix_bbox(lon_lat_range, height_range, num_samples, datum, cam, image_box,\n                           llh_vec, pix_vec); // outputs\n  asp::add_perimeter_diag_points(image_box, datum, cam, lon_lat_range, height_range,\n                                 llh_vec, pix_vec); // outputs\n  \n  // Apply the transform to the llh vector and extent\n  vw::Matrix3x3 R;\n  vw::Vector3 T;\n  extractRotTrans(transform, R, T);\n  std::vector<Vector3> llh_vec_trans;\n  transformLlhVec(llh_vec, R, T, datum, llh_vec_trans);\n  vw::Vector3 llh_offset_trans, llh_scale_trans;\n  transformLlhBox(llh_offset, llh_scale, R, T, datum,\n                  llh_offset_trans, llh_scale_trans); // outputs\n\n  // This penalty weight is rather small. In practice it was not a problem. The\n  // input camera should be sampled well and then an overfit should not be a\n  // concern.\n  double penalty_weight = 1e-4;\n  \n  // Form the vectors of transformed normalized llh and pixel values\n  Vector<double> normalized_llh_trans;\n  Vector<double> normalized_pixels;\n  asp::normalizeLlhPix(llh_vec_trans, pix_vec, \n                       llh_offset_trans, llh_scale_trans, pixel_offset, pixel_scale, \n                       normalized_llh_trans, normalized_pixels); // outputs\n\n  // Form the transformed RPC model by fitting to the transformed normalized llh\n  asp::RPCModel::CoeffVec line_num, line_den, samp_num, samp_den;\n  line_num = rpc_model.line_num_coeff();\n  line_den = rpc_model.line_den_coeff();\n  samp_num = rpc_model.sample_num_coeff();\n  samp_den = rpc_model.sample_den_coeff();\n  bool refine_only = true;\n  asp::gen_rpc(penalty_weight, normalized_llh_trans, normalized_pixels, refine_only,\n               line_num, line_den, samp_num, samp_den); // outputs\n  asp::RPCModel rpc_trans(datum, line_num, line_den, samp_num, samp_den,\n                          pixel_offset, pixel_scale, llh_offset_trans, llh_scale_trans,\n                          rpc_model.m_err_bias, rpc_model.m_err_rand);\n\n  // Find the error of applying the adjustments inline as opposed to externally\n  for (size_t i = 0; i < llh_vec.size(); i++) {\n    Vector3 llh = llh_vec[i];\n    Vector3 xyz = datum.geodetic_to_cartesian(llh);\n    Vector3 llh_trans = llh_vec_trans[i];\n    Vector3 xyz_trans = datum.geodetic_to_cartesian(llh_trans);\n    Vector2 cam_pix1, cam_pix2;\n    try {\n      cam_pix1 = rpc_model.point_to_pixel(xyz);\n      cam_pix2 = rpc_trans.point_to_pixel(xyz_trans);\n    } catch (...) {\n      continue;\n    }\n    pixel_err = std::max(pixel_err, norm_2(cam_pix1 - cam_pix2));\n  }\n  \n  return rpc_trans;\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Camera/RPCModelGen.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// RPC model generation. See rpc_gen.cc for details.\n\n#ifndef __STEREO_CAMERA_RPC_MODEL_GEN_H__\n#define __STEREO_CAMERA_RPC_MODEL_GEN_H__\n\n#include <asp/Camera/RPCModel.h>\n#include <vw/Math/LevenbergMarquardt.h>\n#include <vw/Math/BBox.h>\n\nnamespace asp {\n\n/// Unpack the 78 RPC coefficients from one long vector into four separate vectors.\nvoid unpackCoeffs(vw::Vector<double> const& C,\n                  RPCModel::CoeffVec& lineNum, RPCModel::CoeffVec& lineDen,\n                  RPCModel::CoeffVec& sampNum, RPCModel::CoeffVec& sampDen);\n\n/// Pack the 78 RPC coefficients from four separate vectors into one long vector.\nvoid packCoeffs(RPCModel::CoeffVec const& lineNum, RPCModel::CoeffVec const& lineDen,\n                RPCModel::CoeffVec const& sampNum, RPCModel::CoeffVec const& sampDen,\n                vw::Vector<double> & C);\n\n/// Find the best-fitting RPC coefficients for the camera transform\n/// mapping a set of normalized geodetics to a set of normalized pixel values.\nclass RpcSolveLMA: public vw::math::LeastSquaresModelBase<RpcSolveLMA> {\n  \n  /// The normalized values are in the -1 to 1 range.\n  vw::Vector<double> m_normalizedGeodetics; \n  vw::Vector<double> m_normalizedPixels; // Contains the extra penalty terms\n  double             m_wt; // The penalty weight, k in the reference paper.\n  \npublic:\n  \n  // For applying penalty weighting per the Hartley paper.\n  static const int NUM_PENALTY_TERMS = 64;\n\n  typedef vw::Vector<double> result_type;   // normalized pixels\n  typedef result_type        domain_type;   // RPC coefficients\n  typedef vw::Matrix<double> jacobian_type;\n\n  /// Instantiate the solver with a set of GDC <--> Pixel pairs.\n  RpcSolveLMA(const vw::Vector<double>& normalizedGeodetics,\n              const vw::Vector<double>& normalizedPixels,\n              double penaltyWeight):\n    m_normalizedGeodetics(normalizedGeodetics),\n    m_normalizedPixels(normalizedPixels),\n    m_wt(penaltyWeight) {}\n\n  // Given a set of RPC coefficients, compute the projected pixels.\n  result_type operator()(domain_type const& C) const;\n};\n\n/// Print out a name followed by the vector of values\nvoid print_vec(std::string const& name, vw::Vector<double> const& vals);\n\n/// Dump a vector to a text file, one value per row.\nvoid print_vec_to_file(std::string const& path, vw::Vector<double> const& vals);\n\n// Form the normalized llh and pixel arrays that will be as inputs to the RPC solver\nvoid normalizeLlhPix(std::vector<vw::Vector3> const& all_llh,\n                     std::vector<vw::Vector2> const& all_pixels,\n                     vw::Vector3 const& llh_offset, vw::Vector3 const& llh_scale, \n                     vw::Vector2 const& pixel_offset, vw::Vector2 const& pixel_scale, \n                     // Outputs\n                     vw::Vector<double> & normalized_llh, \n                     vw::Vector<double> & normalized_pixels);\n\nint find_solution_from_seed(RpcSolveLMA        const& lma_model,\n                            vw::Vector<double> const& seed_params,\n                            vw::Vector<double> const& actual_observations,\n                            vw::Vector<double>      & final_params,\n                            double                  & norm_error);\n\n// Find the best-fit RPC given the normalized geodetic and pixel values\nvoid gen_rpc(// Inputs\n              double penalty_weight,\n              vw::Vector<double> const& normalized_geodetics,\n              vw::Vector<double> const& normalized_pixels,\n              bool refine_only,\n              // Outputs\n              RPCModel::CoeffVec & line_num,\n              RPCModel::CoeffVec & line_den,\n              RPCModel::CoeffVec & samp_num,\n              RPCModel::CoeffVec & samp_den);\n\n// Produce a transformed RPC model\nRPCModel transformRpc(RPCModel const& rpc_model, \n                      vw::Matrix4x4 const& transform,\n                      vw::BBox2 const& image_box,\n                      double & pixel_err);\n} // end namespace asp\n\n#endif //__STEREO_CAMERA_RPC_MODEL_GEN_H__\n"
  },
  {
    "path": "src/asp/Camera/RPCStereoModel.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <vw/Core/Log.h>\n#include <vw/Math/Functors.h>\n#include <vw/Math/Matrix.h>\n#include <vw/Math/LevenbergMarquardt.h>\n#include <vw/Math/Vector.h>\n#include <vw/Camera/CameraModel.h>\n#include <vw/Cartography/Datum.h>\n\n#include <asp/Camera/RPCModel.h>\n#include <asp/Camera/RPCStereoModel.h>\n\n// TODO(oalexan1): See if to wipe all this code as it is no longer in use.\n\nusing namespace vw;\nnamespace asp {\n\n  Vector3 RPCStereoModel::operator()(std::vector<Vector2> const& pixVec,\n                                     Vector3& errorVec) const {\n\n    // Note: This is a re-implementation of StereoModel::operator().\n\n    int num_cams = m_cameras.size();\n    VW_ASSERT((int)pixVec.size() == num_cams,\n              vw::ArgumentErr() << \"the number of rays must match \"\n                                << \"the number of cameras.\\n\");\n\n    errorVec = Vector3();\n\n    try {\n      std::vector<Vector3> camDirs(num_cams), \n                      camCtrs(num_cams);\n      std::vector<const RPCModel*> rpc_cams(num_cams);\n      camDirs.clear(); \n      camCtrs.clear(); \n      rpc_cams.clear();\n\n      // Pick the valid rays\n      for (int p = 0; p < num_cams; p++){\n\n        // Get the RPC pointer so we can call RPC specific functions on it\n        const RPCModel *rpc_cam = dynamic_cast<const RPCModel*>(vw::camera::unadjusted_model(m_cameras[p]));\n        VW_ASSERT(rpc_cam != NULL,\n                  vw::ArgumentErr() << \"Camera models are not RPC.\\n\");\n        rpc_cams.push_back(rpc_cam);\n\n        Vector2 pix = pixVec[p];\n        if (pix != pix || // i.e., NaN\n            pix == camera::CameraModel::invalid_pixel() ) continue;\n\n        // The base class function would call point_and_dir twice, but we only need to call it once!\n        Vector3 ctr, dir;\n        rpc_cam->point_and_dir(pix, ctr, dir);\n        camDirs.push_back(dir);\n        camCtrs.push_back(ctr);\n      }\n\n\n      // Not enough valid rays\n      if (camDirs.size() < 2) \n          return Vector3();\n\n      if (are_nearly_parallel(m_angle_tol, camDirs)) \n          return Vector3();\n\n      // Determine range by triangulation\n      Vector3 result = triangulate_point(camDirs, camCtrs, errorVec);\n\n      // Reflect points that fall behind one of the two cameras\n      bool reflect = false;\n      for (int p = 0; p < (int)camCtrs.size(); p++)\n        if (dot_prod(result - camCtrs[p], camDirs[p]) < 0 ) reflect = true;\n      if (reflect)\n        result = -result + 2*camCtrs[0];\n\n      return result;\n\n    } catch (const camera::PixelToRayErr& /*e*/) {}\n    return Vector3();\n  }\n\n  Vector3 RPCStereoModel::operator()(vw::Vector2 const& pix1,\n                                     vw::Vector2 const& pix2,\n                                     double& error ) const {\n    return StereoModel::operator()(pix1, pix2, error);\n  }\n\n} // namespace asp\n"
  },
  {
    "path": "src/asp/Camera/RPCStereoModel.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n#ifndef __ASP_CAMERA_RPCSTEREOMODEL_H__\n#define __ASP_CAMERA_RPCSTEREOMODEL_H__\n\n#include <vw/Stereo/DisparityMap.h>\n#include <vw/Stereo/StereoModel.h>\n\n// TODO: Why not just include the file in the .h file?\n// forward declaration\nnamespace vw {\n  namespace camera {\n    class CameraModel;\n  }\n}\n\nnamespace asp {\n\n  /// Derived StereoModel class implementing the RPC camera model.\n  /// - Using a separate class allows us to get a speed improvement in ray generation.\n  class RPCStereoModel: public vw::stereo::StereoModel {\n\n  public:\n\n    //------------------------------------------------------------------\n    // Constructors / Destructors\n    //------------------------------------------------------------------\n    RPCStereoModel(std::vector<const vw::camera::CameraModel *> const& cameras,\n                   double angle_tol = 0.0):\n      vw::stereo::StereoModel(cameras, angle_tol){}\n      \n    RPCStereoModel(vw::camera::CameraModel const* camera_model1,\n                   vw::camera::CameraModel const* camera_model2,\n                   double angle_tol = 0.0):\n      vw::stereo::StereoModel(camera_model1, camera_model2, angle_tol){}\n    \n    virtual ~RPCStereoModel() {}\n    \n    //------------------------------------------------------------------\n    // Public Methods\n    //------------------------------------------------------------------\n    \n    // Note: This is a re-implementation of StereoModel::operator().\n    virtual vw::Vector3 operator()(std::vector<vw::Vector2> const& pixVec,\n                                   vw::Vector3& errorVec ) const;\n\n    virtual vw::Vector3 operator()(vw::Vector2 const& pix1,\n                                   vw::Vector2 const& pix2,\n                                   double& error) const;\n  };\n  \n} // namespace asp\n\n#endif  // __ASP_CAMERA_RPCSTEREOMODEL_H__\n"
  },
  {
    "path": "src/asp/Camera/RPC_XML.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Camera/XMLBase.h>\n#include <asp/Camera/RPC_XML.h>\n#include <asp/Camera/RPCModel.h>\n#include <asp/Camera/XMLBase.h>\n\n#include <vw/Core/Exception.h>          // for ArgumentErr, vw_throw, etc\n#include <vw/Math/Quaternion.h>         // for Quat, Quaternion\n#include <vw/Math/Vector.h>             // for Vector, Vector3, Vector4, etc\n#include <vw/Cartography/Datum.h>       // for Datum\n#include <vw/FileIO/DiskImageResourceGDAL.h>\n#include <vw/Math/Geometry.h>\n\n#include <xercesc/parsers/XercesDOMParser.hpp>\n#include <xercesc/sax/HandlerBase.hpp>\n#include <xercesc/util/PlatformUtils.hpp>\n\n#include <boost/algorithm/string/predicate.hpp>\n#include <boost/filesystem.hpp>\n#include <boost/lexical_cast.hpp>\n\n#include <fstream>\n\nusing namespace vw;\nusing namespace vw::cartography;\nusing namespace xercesc;\n\nnamespace fs=boost::filesystem;\n\nusing asp::XmlUtils::get_node;\nusing asp::XmlUtils::cast_xmlch;\nusing asp::XmlUtils::parseDoublesFromXmlBlock;\n\n//========================================================================\n// ImageXML class\n\nvoid asp::ImageXML::parse_meta(xercesc::DOMElement* node) {\n  // Note: dg_mosaic wipes most image tags. If it is desired to parse\n  // more tags here, ensure they are not wiped by dg_mosaic and use\n  // sensible values when creating them for the combined mosaics.\n  cast_xmlch(get_node<DOMElement>(node, \"SATID\")->getTextContent(), sat_id);\n  cast_xmlch(get_node<DOMElement>(node, \"SCANDIRECTION\")->getTextContent(), scan_direction);\n  cast_xmlch(get_node<DOMElement>(node, \"TLCTIME\")->getTextContent(), tlc_start_time);\n  cast_xmlch(get_node<DOMElement>(node, \"FIRSTLINETIME\")->getTextContent(), first_line_start_time);\n  cast_xmlch(get_node<DOMElement>(node, \"AVGLINERATE\")->getTextContent(), avg_line_rate);\n  size_t num_tlc;\n  cast_xmlch(get_node<DOMElement>(node, \"NUMTLC\")->getTextContent(), num_tlc);\n  tlc_vec.resize(num_tlc);\n}\n\nvoid asp::ImageXML::parse_band_tdi(xercesc::DOMElement* node, int & out_tdi) {\n  cast_xmlch(get_node<DOMElement>(node, \"TDILEVEL\")->getTextContent(), out_tdi);\n}\n\nvoid asp::ImageXML::parse_tlc_list(xercesc::DOMElement* node) {\n  DOMNodeList* children = node->getChildNodes();\n  size_t count = 0;\n\n  for (XMLSize_t i = 0; i < children->getLength(); i++) {\n    if (children->item(i)->getNodeType() == DOMNode::ELEMENT_NODE) {\n      DOMElement* element = dynamic_cast<DOMElement*>(children->item(i));\n      std::string buffer;\n      cast_xmlch(element->getTextContent(), buffer);\n\n      std::istringstream istr(buffer);\n      istr >> tlc_vec[count].first >> tlc_vec[count].second;\n\n      count++;\n    }\n  }\n\n  VW_ASSERT(count == tlc_vec.size(),\n            IOErr() << \"Read incorrect number of TLC.\");\n}\n\n// A local auxiliary function to parse an XML tag with given prefix\n// and index. Note that the indices starts from 0, while the tags\n// start from 1, so an offset is necessary.\nnamespace {\n  void parse_index(DOMElement* model, std::string const& prefix, size_t index, Vector<double,20> &vals) {\n\n    if (index >= vals.size())\n      vw_throw(ArgumentErr() << \"Out of range when parsing XML file.\");\n\n    std::ostringstream os;\n    os << prefix << index + 1;\n    std::string field = os.str();\n\n    cast_xmlch(get_node<DOMElement>(model, field.c_str())->getTextContent(), vals[index]);\n  }\n\n}\n\nvoid asp::ImageXML::parse_image_size(xercesc::DOMElement* node) {\n  cast_xmlch(get_node<DOMElement>(node, \"NUMROWS\")->getTextContent(), image_size[1]);\n  cast_xmlch(get_node<DOMElement>(node, \"NUMCOLUMNS\")->getTextContent(), image_size[0]);\n}\n\nasp::ImageXML::ImageXML() : BitChecker(4) {}\n\nvoid asp::ImageXML::parse(xercesc::DOMElement* node) {\n  DOMElement* image = get_node<DOMElement>(node, \"IMAGE\");\n  parse_meta(image);\n  check_argument(0);\n\n  cast_xmlch(get_node<DOMElement>(node, \"BANDID\")->getTextContent(), band_id);\n\n  generation_time = \"\";\n  try {\n    cast_xmlch(get_node<DOMElement>(node, \"GENERATIONTIME\")->getTextContent(), generation_time);\n  } catch (...) {\n    // generation_time may not exist  \n  }\n\n  image_descriptor = \"\";\n  try {\n    cast_xmlch(get_node<DOMElement>(node, \"IMAGEDESCRIPTOR\")->getTextContent(),\n                image_descriptor);\n  } catch (...) {\n    // image_descriptor may not exist  \n  }\n\n  // Multispectral or panchromatic, or maybe MS1 or something else\n  //if (band_id != \"P\" && band_id != \"Multi\" && band_id != \"MS1\") \n  //  vw_throw(ArgumentErr() << \"Expecting BANDID in the XML file to be 'P', 'Multi', or 'MS1'.\\n\");\n\n  tdi = 0;\n  try {\n    if (band_id == \"P\") {\n      DOMElement* band = get_node<DOMElement>(node, \"BAND_P\");\n      parse_band_tdi(band, tdi);\n    } else if (band_id == \"Multi\") {\n      // Multispectral\n      const int num_bands = 8;\n      const char * bands[num_bands] = {\"BAND_C\", \"BAND_B\", \"BAND_G\", \"BAND_Y\", \"BAND_R\",\n                                       \"BAND_RE\", \"BAND_N\", \"BAND_N2\"};\n      tdi_multi.resize(num_bands);\n      for (int it = 0; it < num_bands; it++) {\n        DOMElement* band = get_node<DOMElement>(node, bands[it]);\n        parse_band_tdi(band, tdi_multi[it]);\n      }\n    }\n  } catch(...) {\n    // An XML file after being processed by dg_mosaic may not have the tdi field.\n  }\n  check_argument(1);\n\n  parse_tlc_list(get_node<DOMElement>(image, \"TLCLISTList\"));\n  check_argument(2);\n\n  parse_image_size(node);\n  check_argument(3);\n}\n\n//========================================================================\n// GeometricXML class\n\nvoid asp::GeometricXML::parse_principal_distance(xercesc::DOMElement* node) {\n  cast_xmlch(get_node<DOMElement>(node, \"PD\")->getTextContent(), principal_distance);\n}\n\nvoid asp::GeometricXML::parse_optical_distortion(xercesc::DOMElement* node) {\n  cast_xmlch(get_node<DOMElement>(node, \"POLYORDER\")->getTextContent(), optical_polyorder);\n\n  // If the optical polyorder is >= 1 and some of the polynomial\n  // coefficients are non-zero, then throw an error as we did not\n  // implement optical distortion.\n\n  if (optical_polyorder <= 0) return; // it actually can be negative\n\n  std::string list_list_types[] = {\"ALISTList\", \"BLISTList\"};\n  for (unsigned ls = 0; ls < sizeof(list_list_types)/sizeof(std::string); ls++) {\n    std::string list_list_type = list_list_types[ls];\n\n    DOMElement* list_list = get_node<DOMElement>(node, list_list_type);\n    if (list_list == NULL) return;\n\n    DOMNodeList* children = list_list->getChildNodes();\n    if (children == NULL) return;\n\n    for (XMLSize_t i = 0; i < children->getLength(); i++) {\n\n      DOMNode* current = children->item(i);\n      if (current->getNodeType() != DOMNode::ELEMENT_NODE) continue;\n\n      DOMElement* element = dynamic_cast< xercesc::DOMElement* >(current);\n      std::string buffer;\n      cast_xmlch(element->getTextContent(), buffer);\n\n      std::istringstream istr(buffer);\n      double val;\n      while (istr >> val) {\n        if (val != 0)\n          vw_throw(NoImplErr() << \"Optical distortion is not implemented.\\n\");\n      }\n    }\n  }\n\n}\n\nvoid asp::GeometricXML::parse_perspective_center(xercesc::DOMElement* node) {\n  cast_xmlch(get_node<DOMElement>(node, \"CX\")->getTextContent(), perspective_center[0]);\n  cast_xmlch(get_node<DOMElement>(node, \"CY\")->getTextContent(), perspective_center[1]);\n  cast_xmlch(get_node<DOMElement>(node, \"CZ\")->getTextContent(), perspective_center[2]);\n}\n\nvoid asp::GeometricXML::parse_camera_attitude(xercesc::DOMElement* node) {\n  Vector4 buffer; // We buffer since Q will want to constantly renormalize itself.\n  cast_xmlch(get_node<DOMElement>(node, \"QCS4\")->getTextContent(), buffer[0]);\n  cast_xmlch(get_node<DOMElement>(node, \"QCS1\")->getTextContent(), buffer[1]);\n  cast_xmlch(get_node<DOMElement>(node, \"QCS2\")->getTextContent(), buffer[2]);\n  cast_xmlch(get_node<DOMElement>(node, \"QCS3\")->getTextContent(), buffer[3]);\n  camera_attitude = Quat(buffer[0],buffer[1],buffer[2],buffer[3]);\n}\n\nvoid asp::GeometricXML::parse_detector_mounting(xercesc::DOMElement* node) {\n\n  DOMNodeList* children = node->getChildNodes();\n\n  // Read through all the bands, storing their data\n  std::vector<Vector4> bandVec;\n  for (XMLSize_t i = 0; i < children->getLength(); i++) {\n    DOMNode* current = children->item(i);\n    if (current->getNodeType() == DOMNode::ELEMENT_NODE) {\n      DOMElement* element = dynamic_cast< DOMElement* > (current);\n\n      std::string tag(XMLString::transcode(element->getTagName()));\n      if (boost::starts_with(tag, \"BAND_\")) {\n        Vector4 data;\n\n        DOMElement* detector = get_node<DOMElement>(element, \"DETECTOR_ARRAY\");\n        cast_xmlch(get_node<DOMElement>(detector,\"DETORIGINX\")->getTextContent(), data[0]);\n        cast_xmlch(get_node<DOMElement>(detector,\"DETORIGINY\")->getTextContent(), data[1]);\n        cast_xmlch(get_node<DOMElement>(detector,\"DETROTANGLE\")->getTextContent(), data[2]);\n        cast_xmlch(get_node<DOMElement>(detector,\"DETPITCH\")->getTextContent(), data[3]);\n        bandVec.push_back(data);\n      }\n    }\n  }\n\n  if (bandVec.empty()) {\n    vw_throw(ArgumentErr() << \"Could not find any bands in the \"\n             << \"DETECTOR_MOUNTING section of the XML file.\\n\");\n  }\n\n  // If there are multiple bands, they must have the same values\n  for (int i = 1; i < (int)bandVec.size(); i++) {\n    if (bandVec[0] != bandVec[i]) {\n      vw_throw(ArgumentErr() << \"XML files with multiple and \"\n               << \"distinct detector arrays in the DETECTOR_MOUNTING \"\n               << \"section of the XML file are not supported.\\n\");\n    }\n  }\n\n  Vector4 data = bandVec[0];\n  detector_origin[0]   = data[0];\n  detector_origin[1]   = data[1];\n  detector_rotation    = data[2];\n  detector_pixel_pitch = data[3];\n\n}\n\nasp::GeometricXML::GeometricXML() : BitChecker(5) {}\n\nvoid asp::GeometricXML::parse(xercesc::DOMElement* node) {\n  DOMNodeList* children = node->getChildNodes();\n  const XMLSize_t nodeCount = children->getLength();\n\n  for (XMLSize_t i = 0; i < nodeCount; i++) {\n    DOMNode* current = children->item(i);\n    if (current->getNodeType() == DOMNode::ELEMENT_NODE) {\n      DOMElement* element =\n        dynamic_cast< xercesc::DOMElement* >(current);\n\n      std::string tag(XMLString::transcode(element->getTagName()));\n      if (tag == \"PRINCIPAL_DISTANCE\") {\n        parse_principal_distance(element);\n        check_argument(0);\n      } else if (tag == \"OPTICAL_DISTORTION\") {\n        parse_optical_distortion(element);\n        check_argument(1);\n      } else if (tag == \"PERSPECTIVE_CENTER\") {\n        parse_perspective_center(element);\n        check_argument(2);\n      } else if (tag == \"CAMERA_ATTITUDE\") {\n        parse_camera_attitude(element);\n        check_argument(3);\n      } else if (tag == \"DETECTOR_MOUNTING\") {\n        parse_detector_mounting(element);\n        check_argument(4);\n      }\n    }\n  }\n}\n\nvoid asp::GeometricXML::printDebugInfo() const {\n\n  vw_out() << \"GeometricXML DEBUG INFO\" << std::endl;\n  vw_out() << \"principle distance = \" << principal_distance << std::endl;\n  vw_out() << \"optical polyorder  = \" << optical_polyorder << std::endl;\n  vw_out() << \"optical_a = \" << optical_a << std::endl;\n  vw_out() << \"optical_b = \" << optical_b << std::endl;\n  vw_out() << \"perspective_center   = \" << perspective_center << std::endl;\n  vw_out() << \"camera_attitude      = \" << camera_attitude << std::endl;\n  vw_out() << \"detector origin      = \" << detector_origin << std::endl;\n  vw_out() << \"detector rotation    = \" << detector_rotation << std::endl;\n  vw_out() << \"detector pixel pitch = \" << detector_pixel_pitch << std::endl;\n\n}\n\n//========================================================================\n// EphemerisXML class\n\nvoid asp::EphemerisXML::parse_meta(xercesc::DOMElement* node) {\n  cast_xmlch(get_node<DOMElement>(node, \"STARTTIME\")->getTextContent(), start_time);\n  cast_xmlch(get_node<DOMElement>(node, \"TIMEINTERVAL\")->getTextContent(), time_interval);\n  size_t num_points;\n  cast_xmlch(get_node<DOMElement>(node, \"NUMPOINTS\")->getTextContent(), num_points);\n  satellite_position_vec.resize(num_points);\n  velocity_vec.resize(num_points);\n  satellite_pos_cov.resize(6 * num_points); // see RPC_XML.h\n}\n\nvoid asp::EphemerisXML::parse_eph_list(std::string const& rawXml) {\n  // Each EPHEMLIST entry has 13 doubles: index, pos[3], vel[3], cov[6]\n  std::vector<double> values;\n  parseDoublesFromXmlBlock(rawXml, \"<EPHEMLISTList>\", \"</EPHEMLISTList>\",\n                           values);\n\n  size_t numExpected = satellite_position_vec.size();\n  size_t valsPerEntry = 13;\n  if (values.size() != numExpected * valsPerEntry)\n    vw_throw(IOErr() << \"Expected \" << numExpected * valsPerEntry\n             << \" ephemeris values, got \" << values.size() << \".\\n\");\n\n  for (size_t i = 0; i < numExpected; i++) {\n    const double* v = &values[i * valsPerEntry];\n    size_t index = size_t(v[0] + 0.5) - 1;\n    satellite_position_vec[index][0] = v[1];\n    satellite_position_vec[index][1] = v[2];\n    satellite_position_vec[index][2] = v[3];\n    velocity_vec[index][0] = v[4];\n    velocity_vec[index][1] = v[5];\n    velocity_vec[index][2] = v[6];\n    for (int j = 0; j < 6; j++)\n      satellite_pos_cov[6 * index + j] = v[7 + j];\n  }\n}\n\nasp::EphemerisXML::EphemerisXML() : BitChecker(2) {}\n\nvoid asp::EphemerisXML::parse(xercesc::DOMElement* node,\n                              std::string const& rawXml) {\n  parse_meta(node);\n  check_argument(0);\n  parse_eph_list(rawXml);\n  check_argument(1);\n}\n\n//========================================================================\n// AttitudeXML class\n\nvoid asp::AttitudeXML::parse_meta(xercesc::DOMElement* node) {\n  cast_xmlch(get_node<DOMElement>(node, \"STARTTIME\")->getTextContent(), start_time);\n  cast_xmlch(get_node<DOMElement>(node, \"TIMEINTERVAL\")->getTextContent(), time_interval);\n  size_t num_points;\n  cast_xmlch(get_node<DOMElement>(node, \"NUMPOINTS\")->getTextContent(), num_points);\n  satellite_quat_vec.resize(num_points);\n  satellite_quat_cov.resize(10 * num_points); // see RPC_XML.h\n}\n\nvoid asp::AttitudeXML::parse_att_list(std::string const& rawXml) {\n  // Each ATTLIST entry has 15 doubles: index, quat[4], cov[10]\n  std::vector<double> values;\n  parseDoublesFromXmlBlock(rawXml, \"<ATTLISTList>\", \"</ATTLISTList>\",\n                           values);\n\n  size_t numExpected = satellite_quat_vec.size();\n  size_t valsPerEntry = 15;\n  if (values.size() != numExpected * valsPerEntry)\n    vw_throw(IOErr() << \"Expected \" << numExpected * valsPerEntry\n             << \" attitude values, got \" << values.size() << \".\\n\");\n\n  for (size_t i = 0; i < numExpected; i++) {\n    const double* v = &values[i * valsPerEntry];\n    size_t index = size_t(v[0] + 0.5) - 1;\n    for (int j = 0; j < 4; j++)\n      satellite_quat_vec[index][j] = v[1 + j];\n    for (int j = 0; j < 10; j++)\n      satellite_quat_cov[10 * index + j] = v[5 + j];\n  }\n}\n\nasp::AttitudeXML::AttitudeXML() : BitChecker(2) {}\n\nvoid asp::AttitudeXML::parse(xercesc::DOMElement* node,\n                             std::string const& rawXml) {\n  parse_meta(node);\n  check_argument(0);\n  parse_att_list(rawXml);\n  check_argument(1);\n}\n\n//========================================================================\n// RPCXML class\n\nvoid asp::RPCXML::parse_vector(xercesc::DOMElement* node,\n                               Vector<double,20>& vec) {\n  std::string buffer;\n  cast_xmlch(node->getTextContent(), buffer);\n\n  std::istringstream istr(buffer);\n  istr >> vec[0] >> vec[1] >> vec[2] >> vec[3] >> vec[4] >> vec[5]\n       >> vec[6] >> vec[7] >> vec[8] >> vec[9] >> vec[10] >> vec[11]\n       >> vec[12] >> vec[13] >> vec[14] >> vec[15] >> vec[16] >> vec[17]\n       >> vec[18] >> vec[19];\n}\n\nasp::RPCXML::RPCXML() : BitChecker(2) {}\n\nvoid asp::RPCXML::read_from_file(std::string const& name) {\n\n  boost::shared_ptr<XercesDOMParser> parser(new XercesDOMParser());\n  parser->setValidationScheme(XercesDOMParser::Val_Always);\n  parser->setDoNamespaces(true);\n  boost::shared_ptr<ErrorHandler> errHandler(new HandlerBase());\n  parser->setErrorHandler(errHandler.get());\n\n  DOMDocument* xmlDoc;\n  DOMElement* elementRoot;\n\n  try {\n    parser->parse(name.c_str());\n    xmlDoc = parser->getDocument();\n    elementRoot = xmlDoc->getDocumentElement();\n  } catch (...) {\n    vw_throw(ArgumentErr() << \"XML file: \" << name << \" is invalid.\\n\");\n  }\n\n  // Try to parse the bounding box but keep going if we fail.\n  try {\n    parse_bbox(elementRoot);\n  } catch (...) {\n  }\n\n  try {\n    parse_rpb(elementRoot);\n    return;\n  } catch (vw::IOErr const& e) {\n    // Possibly RPB doesn't exist\n  }\n\n  try {\n    // Pleiades/Astrium/SPOT 6/7 RPC\n    DOMElement* model = get_node<DOMElement>(elementRoot, \"Rational_Function_Model\");\n    // Check the sensor name to determine pixel origin convention.\n    // SPOT 6/7 RPCs use 0-based offsets, Pleiades uses 1-based.\n    bool is_spot67 = false;\n    try {\n      DOMElement* metadata_id = get_node<DOMElement>(elementRoot, \"Metadata_Identification\");\n      DOMElement* profile = get_node<DOMElement>(metadata_id, \"METADATA_PROFILE\");\n      std::string sensor = XMLString::transcode(profile->getTextContent());\n      is_spot67 = (sensor == \"S6_SENSOR\" || sensor == \"S7_SENSOR\");\n    } catch (...) {}\n    parse_rational_function_model(model, is_spot67);\n    return;\n  } catch (vw::IOErr const& e) {\n    // Possibly Rational_Function_Model doesn't work\n  }\n\n  try {\n    // Perusat 1 RPC\n    parse_perusat_model(elementRoot);\n    return;\n  } catch (vw::IOErr const& e) {\n    // No luck\n  }\n\n  vw_throw(vw::NotFoundErr()\n           << \"Couldn't find RPB or Rational_Function_Model tag inside XML file.\");\n}\n\nvoid asp::RPCXML::parse_bbox(xercesc::DOMElement* root_node) {\n  // Now read the bounding box\n  DOMElement* imd_node  = get_node<DOMElement>(root_node, \"IMD\");\n  DOMElement* bbox_node;\n  try {\n    bbox_node = get_node<DOMElement>(imd_node, \"BAND_P\");\n  } catch (...) { // Try one more channel if we can't find BAND_P\n    bbox_node = get_node<DOMElement>(imd_node, \"BAND_R\");\n  }\n  // Start by initializing the box with the first point\n  Vector3 point;\n  cast_xmlch(get_node<DOMElement>(bbox_node, \"ULLON\")->getTextContent(), point.x());\n  cast_xmlch(get_node<DOMElement>(bbox_node, \"ULLAT\")->getTextContent(), point.y());\n  cast_xmlch(get_node<DOMElement>(bbox_node, \"ULHAE\")->getTextContent(), point.z());\n  m_lat_lon_height_box.min() = point;\n  m_lat_lon_height_box.max() = point;\n  //VW_OUT(vw::DebugMessage, \"asp\") << \"RPCXML: point = \" << point<< std::endl;\n  // Expand to contain the other points\n  cast_xmlch(get_node<DOMElement>(bbox_node, \"URLON\")->getTextContent(), point.x());\n  cast_xmlch(get_node<DOMElement>(bbox_node, \"URLAT\")->getTextContent(), point.y());\n  cast_xmlch(get_node<DOMElement>(bbox_node, \"URHAE\")->getTextContent(), point.z());\n  m_lat_lon_height_box.grow(point);\n  //VW_OUT(vw::DebugMessage, \"asp\") << \"RPCXML: point = \" << point<< std::endl;\n  cast_xmlch(get_node<DOMElement>(bbox_node, \"LLLON\")->getTextContent(), point.x());\n  cast_xmlch(get_node<DOMElement>(bbox_node, \"LLLAT\")->getTextContent(), point.y());\n  cast_xmlch(get_node<DOMElement>(bbox_node, \"LLHAE\")->getTextContent(), point.z());\n  m_lat_lon_height_box.grow(point);\n  //VW_OUT(vw::DebugMessage, \"asp\") << \"RPCXML: point = \" << point<< std::endl;\n  cast_xmlch(get_node<DOMElement>(bbox_node, \"LRLON\")->getTextContent(), point.x());\n  cast_xmlch(get_node<DOMElement>(bbox_node, \"LRLAT\")->getTextContent(), point.y());\n  cast_xmlch(get_node<DOMElement>(bbox_node, \"LRHAE\")->getTextContent(), point.z());\n  m_lat_lon_height_box.grow(point);\n  //VW_OUT(vw::DebugMessage, \"asp\") << \"RPCXML: point = \" << point<< std::endl;\n}\n\ndouble asp::RPCXML::parse_terrain_height(xercesc::DOMElement* root_node) {\n\n  double terrain_height = std::numeric_limits<double>::quiet_NaN();\n\n  DOMElement* imd_node  = get_node<DOMElement>(root_node, \"IMD\");\n  std::string image_descriptor;\n  try {\n    cast_xmlch(get_node<DOMElement>(imd_node, \"IMAGEDESCRIPTOR\")->getTextContent(), image_descriptor);\n  } catch (...) {\n    // image_descriptor may not exist\n    return terrain_height;\n  }\n\n  // Descriptor must equal \"ORStandard2A\" for the terrain height to be valid\n  if (boost::to_lower_copy(image_descriptor) !=\n      boost::to_lower_copy(std::string(\"ORStandard2A\")))\n    return terrain_height;\n\n  // Get the MAP_PROJECTED_PRODUCT node\n  DOMElement* map_projected_product_node = NULL;\n  try {\n    map_projected_product_node = get_node<DOMElement>(imd_node, \"MAP_PROJECTED_PRODUCT\");\n\n    // Get the TERRAINHAE field\n    cast_xmlch(get_node<DOMElement>(map_projected_product_node, \"TERRAINHAE\")->getTextContent(), terrain_height);\n  } catch (...) {\n    // MAP_PROJECTED_PRODUCT may not exist\n    return terrain_height;\n  }\n\n  return terrain_height;\n}\n\n// Parse the RPB node. Used for DG XML files.\nvoid asp::RPCXML::parse_rpb(xercesc::DOMElement* root) {\n\n  // Try to parse the terrain height, but keep going if we fail.\n  double terrain_height = std::numeric_limits<double>::quiet_NaN();\n  try {\n    terrain_height = parse_terrain_height(root);\n  } catch (...) {\n  }\n\n  // Parse rpb\n  DOMElement* rpb = get_node<DOMElement>(root, \"RPB\");\n  DOMElement* image = get_node<DOMElement>(rpb, \"IMAGE\");\n\n  // Pieces that will go into the RPC Model\n  Vector<double,20> line_num_coeff, line_den_coeff, samp_num_coeff, samp_den_coeff;\n  Vector2 xy_offset, xy_scale;\n  Vector3 geodetic_offset, geodetic_scale;\n  std::string rpc_datum_wkt;\n\n  // Painfully extract from the XML\n  cast_xmlch(get_node<DOMElement>(image, \"SAMPOFFSET\")->getTextContent(), xy_offset.x());\n  cast_xmlch(get_node<DOMElement>(image, \"LINEOFFSET\")->getTextContent(), xy_offset.y());\n  cast_xmlch(get_node<DOMElement>(image, \"SAMPSCALE\")->getTextContent(), xy_scale.x());\n  cast_xmlch(get_node<DOMElement>(image, \"LINESCALE\")->getTextContent(), xy_scale.y());\n  cast_xmlch(get_node<DOMElement>(image, \"LONGOFFSET\")->getTextContent(), geodetic_offset.x());\n  cast_xmlch(get_node<DOMElement>(image, \"LATOFFSET\")->getTextContent(), geodetic_offset.y());\n  cast_xmlch(get_node<DOMElement>(image, \"HEIGHTOFFSET\")->getTextContent(), geodetic_offset.z());\n  cast_xmlch(get_node<DOMElement>(image, \"LONGSCALE\")->getTextContent(), geodetic_scale.x());\n  cast_xmlch(get_node<DOMElement>(image, \"LATSCALE\")->getTextContent(), geodetic_scale.y());\n  cast_xmlch(get_node<DOMElement>(image, \"HEIGHTSCALE\")->getTextContent(), geodetic_scale.z());\n  check_argument(0);\n  parse_vector(get_node<DOMElement>(get_node<DOMElement>(image, \"LINENUMCOEFList\"), \"LINENUMCOEF\"), line_num_coeff);\n  parse_vector(get_node<DOMElement>(get_node<DOMElement>(image, \"LINEDENCOEFList\"), \"LINEDENCOEF\"), line_den_coeff);\n  parse_vector(get_node<DOMElement>(get_node<DOMElement>(image, \"SAMPNUMCOEFList\"), \"SAMPNUMCOEF\"), samp_num_coeff);\n  parse_vector(get_node<DOMElement>(get_node<DOMElement>(image, \"SAMPDENCOEFList\"), \"SAMPDENCOEF\"), samp_den_coeff);\n  check_argument(1);\n\n  // These are only used for covariance propagation\n  double err_bias = 0.0;\n  try {\n    cast_xmlch(get_node<DOMElement>(image, \"ERRBIAS\")->getTextContent(), err_bias);\n  } catch(...) {\n    err_bias = 0.0;\n  }\n  double err_rand = 0.0;\n  try {\n    cast_xmlch(get_node<DOMElement>(image, \"ERRRAND\")->getTextContent(), err_rand);\n  } catch(...) {\n    err_rand = 0.0;\n  }\n\n  // The RPC_DATUM field is only written by cam2rpc\n  try {\n    // For backward compatibility  \n    cast_xmlch(get_node<DOMElement>(image, \"CAM2RPC_DATUM\")->getTextContent(), rpc_datum_wkt);\n  } catch(...) {\n  }\n  try {\n    // Latest convention\n    cast_xmlch(get_node<DOMElement>(image, \"RPC_DATUM\")->getTextContent(), rpc_datum_wkt);\n  } catch(...) {\n  }\n\n  // Push into the RPC Model so that it is easier to work with.\n  //\n  // The choice of using the WGS_1984 datum comes from Digital Globe's\n  // QuickBird Imagery Products Guide. Section 11.1 makes a blanket\n  // statement that all heights are meters against this ellipsoid.\n\n  // If the RPC model was generated with cam2rpc, use the datum that\n  // tool set.\n\n  vw::cartography::Datum datum;\n  if (rpc_datum_wkt == \"\") {\n    datum = vw::cartography::Datum(\"WGS_1984\");\n  } else {\n    vw::cartography::GeoReference georef;\n    georef.set_wkt(rpc_datum_wkt);\n    datum = georef.datum();\n  }\n  m_rpc = boost::make_shared<RPCModel>(datum,\n                                       line_num_coeff, line_den_coeff,\n                                       samp_num_coeff, samp_den_coeff,\n                                       xy_offset, xy_scale,\n                                       geodetic_offset, geodetic_scale,\n                                       err_bias, err_rand, terrain_height);\n}\n\n// Pleiades/Astrium RPC\nvoid asp::RPCXML::parse_rational_function_model(xercesc::DOMElement* node,\n                                                 bool is_spot67) {\n\n  DOMElement* inverse_model;\n\n  try {\n    inverse_model = get_node<DOMElement>(node, \"Inverse_Model\");\n  } catch (...) {\n    // For some models, need to get Global_RFM first\n    DOMElement* global_model = get_node<DOMElement>(node, \"Global_RFM\");\n    inverse_model = get_node<DOMElement>(global_model, \"Inverse_Model\");\n  }\n\n  // Get the RFM validity node\n  DOMElement* rfm_validity;\n  try {\n    rfm_validity = get_node<DOMElement>(node, \"RFM_Validity\");\n  } catch (...) {\n    // For some models, need to get Global_RFM first\n    DOMElement* global_model = get_node<DOMElement>(node, \"Global_RFM\");\n    rfm_validity = get_node<DOMElement>(global_model, \"RFM_Validity\");\n  }\n\n  // Pieces that will go into the RPC Model\n  Vector<double,20> line_num_coeff, line_den_coeff, samp_num_coeff, samp_den_coeff;\n  Vector2 xy_offset, xy_scale;\n  Vector3 geodetic_offset, geodetic_scale;\n\n  // Parse 80 numbers that are the RPC coefficients\n  for (size_t i = 0; i < samp_num_coeff.size(); i++)\n    parse_index(inverse_model, \"SAMP_NUM_COEFF_\", i, samp_num_coeff);\n  for (size_t i = 0; i < samp_den_coeff.size(); i++)\n    parse_index(inverse_model, \"SAMP_DEN_COEFF_\", i, samp_den_coeff);\n  for (size_t i = 0; i < line_num_coeff.size(); i++)\n    parse_index(inverse_model, \"LINE_NUM_COEFF_\", i, line_num_coeff);\n  for (size_t i = 0; i < line_den_coeff.size(); i++)\n    parse_index(inverse_model, \"LINE_DEN_COEFF_\", i, line_den_coeff);\n\n  cast_xmlch(get_node<DOMElement>(rfm_validity, \"LONG_SCALE\")->getTextContent(), geodetic_scale.x());\n  cast_xmlch(get_node<DOMElement>(rfm_validity, \"LAT_SCALE\")->getTextContent(), geodetic_scale.y());\n  cast_xmlch(get_node<DOMElement>(rfm_validity, \"HEIGHT_SCALE\")->getTextContent(), geodetic_scale.z());\n  cast_xmlch(get_node<DOMElement>(rfm_validity, \"LONG_OFF\")->getTextContent(), geodetic_offset.x());\n  cast_xmlch(get_node<DOMElement>(rfm_validity, \"LAT_OFF\")->getTextContent(), geodetic_offset.y());\n  cast_xmlch(get_node<DOMElement>(rfm_validity, \"HEIGHT_OFF\")->getTextContent(), geodetic_offset.z());\n\n  cast_xmlch(get_node<DOMElement>(rfm_validity, \"SAMP_SCALE\")->getTextContent(), xy_scale.x());\n  cast_xmlch(get_node<DOMElement>(rfm_validity, \"LINE_SCALE\")->getTextContent(), xy_scale.y());\n  cast_xmlch(get_node<DOMElement>(rfm_validity, \"SAMP_OFF\")->getTextContent(), xy_offset.x());\n  cast_xmlch(get_node<DOMElement>(rfm_validity, \"LINE_OFF\")->getTextContent(), xy_offset.y());\n\n  // Pleiades RPCs use 1-based pixel offsets (SAMP_OFF = (N+1)/2), so\n  // subtract (1,1) to convert to 0-based. SPOT 6/7 RPCs already use\n  // 0-based offsets (SAMP_OFF = N/2), so no subtraction is needed.\n  // See the SPOT 6/7 user guide (Appendix C.2.1, \"first column index is 0\")\n  // and the Pleiades user guide (page 76, ref col/row = 1).\n  if (!is_spot67)\n    xy_offset -= Vector2i(1, 1);\n\n  // No Earth example is known where the datum is anything but WGS_1984.\n  m_rpc = boost::make_shared<RPCModel>(cartography::Datum(\"WGS_1984\"),\n                                       line_num_coeff, line_den_coeff,\n                                       samp_num_coeff, samp_den_coeff,\n                                       xy_offset, xy_scale,\n                                       geodetic_offset, geodetic_scale);\n}\n\nvoid asp::RPCXML::parse_perusat_model(xercesc::DOMElement* node) {\n\n  DOMElement* inverse_model =\n    get_node<DOMElement>(node, \"Inverse_Model\"); // Inverse model\n  // takes ground to image.\n\n  DOMElement* validity  = get_node<DOMElement>(node, \"Validity\");\n\n  // Pieces that will go into the RPC Model\n  Vector<double,20> line_num_coeff, line_den_coeff, samp_num_coeff, samp_den_coeff;\n  Vector2 xy_offset, xy_scale;\n  Vector3 geodetic_offset, geodetic_scale;\n\n  // Parse 80 numbers that are the RPC coefficients\n  for (size_t i = 0; i < samp_num_coeff.size(); i++)\n    parse_index(inverse_model, \"COL_NUM_COEFF_\", i, samp_num_coeff);\n  for (size_t i = 0; i < samp_den_coeff.size(); i++)\n    parse_index(inverse_model, \"COL_DEN_COEFF_\", i, samp_den_coeff);\n  for (size_t i = 0; i < line_num_coeff.size(); i++)\n    parse_index(inverse_model, \"ROW_NUM_COEFF_\", i, line_num_coeff);\n  for (size_t i = 0; i < line_den_coeff.size(); i++)\n    parse_index(inverse_model, \"ROW_DEN_COEFF_\", i, line_den_coeff);\n\n  cast_xmlch(get_node<DOMElement>(validity, \"LON_SCALE\")->getTextContent(), geodetic_scale.x());\n  cast_xmlch(get_node<DOMElement>(validity, \"LAT_SCALE\")->getTextContent(), geodetic_scale.y());\n  cast_xmlch(get_node<DOMElement>(validity, \"HEIGHT_SCALE\")->getTextContent(), geodetic_scale.z());\n  cast_xmlch(get_node<DOMElement>(validity, \"LON_OFF\")->getTextContent(), geodetic_offset.x());\n  cast_xmlch(get_node<DOMElement>(validity, \"LAT_OFF\")->getTextContent(), geodetic_offset.y());\n  cast_xmlch(get_node<DOMElement>(validity, \"HEIGHT_OFF\")->getTextContent(), geodetic_offset.z());\n\n  cast_xmlch(get_node<DOMElement>(validity, \"COL_SCALE\")->getTextContent(), xy_scale.x());\n  cast_xmlch(get_node<DOMElement>(validity, \"ROW_SCALE\")->getTextContent(), xy_scale.y());\n  cast_xmlch(get_node<DOMElement>(validity, \"COL_OFF\")->getTextContent(), xy_offset.x());\n  cast_xmlch(get_node<DOMElement>(validity, \"ROW_OFF\")->getTextContent(), xy_offset.y());\n\n  // The PeruSAT RPC docs do not say anywhere if the columns and rows\n  // start from 1 or from 0. Note however, that in the RPC XML file\n  // one has:\n  // <COL_SCALE>10280</COL_SCALE>\n  // <COL_OFF>10280</COL_OFF>\n  // and that there are 20560 = 2 * 10280 columns. Since per their\n  // doc, normalization is done as:\n  // (col - COL_OFF) / COL_SCALE\n  // it seems to make sense that their columns and rows start from 1,\n  // so the scaled last column is 1.0.\n  // Also, in their doc for the exact model it says:\n  // \"colref es la columna de referencia que para el satellite\n  // PeruSAT-1 adopta un valor de 1\", which seems to confirm that,\n  // though that is in a different context.\n  // Since in ASP columns and rows start from 0, here subtract 1.\n  // In practice subtracting 1 or not makes very little difference\n  // in the resulting DEM or intersection error.\n  // Their RPC file also has:\n  // <FIRST_COL>0</FIRST_COL>\n  // <LAST_COL>20560</LAST_COL>\n  // and one of these must be wrong given the total number of columns.\n  xy_offset -= Vector2i(1,1);\n\n  // Per \"PP137 AO1-P04: Modelamiento Geometrico Orbital para\n  // imagenes PeruSAT-1\", the datum is WGS_1984.\n  m_rpc = boost::make_shared<RPCModel>(cartography::Datum(\"WGS_1984\"),\n                                       line_num_coeff, line_den_coeff,\n                                       samp_num_coeff, samp_den_coeff,\n                                       xy_offset, xy_scale,\n                                       geodetic_offset, geodetic_scale);\n\n}\n\n// Helper functions to allow us to fill the objects\nvoid asp::read_xml(std::string const& filename,\n                   GeometricXML& geo,\n                   AttitudeXML& att,\n                   EphemerisXML& eph,\n                   ImageXML& img,\n                   RPCXML& rpc) {\n\n  // Check if the file actually exists and throw a user helpful file.\n  if (!fs::exists(filename))\n    vw_throw(ArgumentErr() << \"XML file \\\"\" << filename << \"\\\" does not exist.\");\n\n  // Read entire file into a string for fast ephemeris/attitude parsing\n  std::string rawXml;\n  {\n    std::ifstream ifs(filename.c_str(), std::ios::binary | std::ios::ate);\n    if (!ifs)\n      vw_throw(ArgumentErr() << \"Cannot open XML file: \" << filename << \"\\n\");\n    std::streamsize size = ifs.tellg();\n    ifs.seekg(0, std::ios::beg);\n    rawXml.resize(size);\n    ifs.read(&rawXml[0], size);\n  }\n\n  try {\n    boost::shared_ptr<XercesDOMParser> parser(new XercesDOMParser());\n    parser->setValidationScheme(XercesDOMParser::Val_Always);\n    parser->setDoNamespaces(true);\n    boost::shared_ptr<ErrorHandler> errHandler(new HandlerBase());\n    parser->setErrorHandler(errHandler.get());\n\n    parser->parse(filename.c_str());\n    DOMDocument* xmlDoc = parser->getDocument();\n    DOMElement* elementRoot = xmlDoc->getDocumentElement();\n\n    try { // This is optional information, not present in all XML files.\n      rpc.parse_bbox(elementRoot); // Load the bounding box information.\n    } catch(...) {}\n\n    DOMNodeList* children = elementRoot->getChildNodes();\n    for (XMLSize_t i = 0; i < children->getLength(); i++) {\n      DOMNode* curr_node = children->item(i);\n      if (curr_node->getNodeType() == DOMNode::ELEMENT_NODE) {\n        DOMElement* curr_element = dynamic_cast<DOMElement*>(curr_node);\n\n        std::string tag(XMLString::transcode(curr_element->getTagName()));\n        if (tag == \"GEO\")\n          geo.parse(curr_element);\n        else if (tag == \"EPH\")\n          eph.parse(curr_element, rawXml);\n        else if (tag == \"ATT\")\n          att.parse(curr_element, rawXml);\n        else if (tag == \"IMD\")\n          img.parse(curr_element);\n        else if (tag == \"RPB\")\n          rpc.parse(elementRoot); // must go to the parent\n      }\n    }\n  } catch (const std::exception& e) {\n    vw_throw(ArgumentErr() << e.what() << \" XML file:\" << filename << \" is invalid.\\n\");\n  }\n\n}\n\nvw::Vector2i asp::xml_image_size(std::string const& filename) {\n  GeometricXML geo;\n  AttitudeXML att;\n  EphemerisXML eph;\n  ImageXML img;\n  RPCXML rpc;\n\n  read_xml(filename, geo, att, eph, img, rpc);\n  return img.image_size;\n}\n\nasp::RPCModel* asp::RPCXML::rpc_ptr() const {\n  VW_ASSERT(m_rpc.get(), LogicErr() << \"read_from_file or parse needs to be called first before an RPCModel is ready\");\n  return m_rpc.get();\n}\n\nvw::BBox3 asp::RPCXML::get_lon_lat_height_box() const {\n  return m_lat_lon_height_box;\n}\n\nbool asp::read_WV_XML_corners(std::string const& xml_path,\n                              std::vector<vw::Vector2> &pixel_corners,\n                              std::vector<vw::Vector2> &lonlat_corners) {\n\n  // Open and initialize the document\n  boost::shared_ptr<XercesDOMParser> parser(new XercesDOMParser());\n  parser->setValidationScheme(XercesDOMParser::Val_Always);\n  parser->setDoNamespaces(true);\n  boost::shared_ptr<ErrorHandler> errHandler(new HandlerBase());\n  parser->setErrorHandler(errHandler.get());\n\n  parser->parse(xml_path.c_str());\n  DOMDocument* xmlDoc      = parser->getDocument();\n  DOMElement * elementRoot = xmlDoc->getDocumentElement();\n\n  const size_t NUM_CORNERS = 4;\n  const size_t TOP_LEFT  = 0;\n  const size_t TOP_RIGHT = 1;\n  const size_t BOT_RIGHT = 2;\n  const size_t BOT_LEFT  = 3;\n  pixel_corners.resize(NUM_CORNERS);\n  lonlat_corners.resize(NUM_CORNERS);\n\n  // Find the IMD node\n  DOMElement *imd_node = XmlUtils::get_node<DOMElement>(elementRoot, \"IMD\");\n  if (!imd_node)\n    return false;\n\n  // Get the image size\n  double num_rows, num_cols;\n  XmlUtils::cast_xmlch(XmlUtils::get_node<DOMElement>(imd_node, \"NUMROWS\")->getTextContent(), num_rows);\n  XmlUtils::cast_xmlch(XmlUtils::get_node<DOMElement>(imd_node, \"NUMCOLUMNS\")->getTextContent(), num_cols);\n\n  // Set the pixel corners\n  pixel_corners[TOP_LEFT ].x()  = 0.5;\n  pixel_corners[TOP_LEFT ].y()  = 0.5;\n  pixel_corners[TOP_RIGHT].x() = num_cols - 0.5;\n  pixel_corners[TOP_RIGHT].y() = 0.5;\n  pixel_corners[BOT_RIGHT].x() = num_cols - 0.5;\n  pixel_corners[BOT_RIGHT].y() = num_rows - 0.5;\n  pixel_corners[BOT_LEFT ].x() = 0.5;\n  pixel_corners[BOT_LEFT ].y() = num_rows - 0.5;\n\n  // Look through its children for a band name\n  DOMNodeList* children = imd_node->getChildNodes();\n  for (XMLSize_t i = 0; i < children->getLength(); i++) {\n    // Check child node type\n    DOMNode* curr_node = children->item(i);\n    if (curr_node->getNodeType() != DOMNode::ELEMENT_NODE)\n      continue;\n\n    // Look for the BAND_X node\n    DOMElement* curr_element = dynamic_cast<DOMElement*>(curr_node);\n    std::string tag(XMLString::transcode(curr_element->getTagName()));\n    if (tag.find(\"BAND_\") == std::string::npos)\n      continue;\n\n    // We found the band node, now parse the child nodes\n    XmlUtils::cast_xmlch(XmlUtils::get_node<DOMElement>(curr_element, \"ULLON\")->getTextContent(), lonlat_corners[TOP_LEFT ].x());\n    XmlUtils::cast_xmlch(XmlUtils::get_node<DOMElement>(curr_element, \"ULLAT\")->getTextContent(), lonlat_corners[TOP_LEFT ].y());\n    XmlUtils::cast_xmlch(XmlUtils::get_node<DOMElement>(curr_element, \"URLON\")->getTextContent(), lonlat_corners[TOP_RIGHT].x());\n    XmlUtils::cast_xmlch(XmlUtils::get_node<DOMElement>(curr_element, \"URLAT\")->getTextContent(), lonlat_corners[TOP_RIGHT].y());\n    XmlUtils::cast_xmlch(XmlUtils::get_node<DOMElement>(curr_element, \"LRLON\")->getTextContent(), lonlat_corners[BOT_RIGHT].x());\n    XmlUtils::cast_xmlch(XmlUtils::get_node<DOMElement>(curr_element, \"LRLAT\")->getTextContent(), lonlat_corners[BOT_RIGHT].y());\n    XmlUtils::cast_xmlch(XmlUtils::get_node<DOMElement>(curr_element, \"LLLON\")->getTextContent(), lonlat_corners[BOT_LEFT ].x());\n    XmlUtils::cast_xmlch(XmlUtils::get_node<DOMElement>(curr_element, \"LLLAT\")->getTextContent(), lonlat_corners[BOT_LEFT ].y());\n\n    return true; // Finished!\n\n  } // End loop through top level children\n\n  // Only make it here if we failed to find the corner information!  \n  return false;\n}\n\nbool asp::approximate_wv_georeference(std::string  const& wv_xml_path,\n                                      GeoReference      & approx_georef) {\n\n  // Find the four corners in the XML file\n  std::vector<Vector2> pixel_corners, lonlat_corners;\n  if (!asp::read_WV_XML_corners(wv_xml_path, pixel_corners, lonlat_corners))\n    return false;\n\n  // Convert the corners into homogenous coordinates so that the fitter will accept them.\n  const size_t NUM_CORNERS = 4;\n  std::vector<Vector3> pixel_corners3 (NUM_CORNERS),\n    lonlat_corners3(NUM_CORNERS);\n  for (size_t i = 0; i < NUM_CORNERS; i++) {\n    pixel_corners3[i].x() = pixel_corners[i].x();\n    pixel_corners3[i].y() = pixel_corners[i].y();\n    pixel_corners3[i].z() = 1.0;\n    lonlat_corners3[i].x() = lonlat_corners[i].x();\n    lonlat_corners3[i].y() = lonlat_corners[i].y();\n    lonlat_corners3[i].z() = 1.0;\n  }\n\n  // Compute the perspective transform\n  // - To bad this does not give an indication of fit quality  \n  vw::math::HomographyFittingFunctor fitter;\n  Matrix<double> transform = fitter(pixel_corners3, lonlat_corners3);\n\n  // Construct the approximated GeoReference\n  approx_georef.set_geographic(); // Set to 'lonlat' projection\n  approx_georef.set_transform(transform);\n\n  vw::vw_out() << \"Computed approximate transform: \\n\" << transform << \"\\n\";\n\n  return true;\n}\n\nbool asp::read_wv_georeference(GeoReference      &georef,\n                               std::string const &image_path,\n                               std::string const &xml_path) {\n\n  // Try to read the georeference from the image file\n  DiskImageResourceGDAL rsrc(image_path);\n  if (read_georeference(georef, rsrc))\n    return true;\n\n  vw::vw_out() << \"Read georeference from xml file: \" << xml_path << \"\\n\";\n\n  // TODO: Should this verify that the image size is correct?\n\n  // If that failed, try approximating from the XML file.\n  xercesc::XMLPlatformUtils::Initialize();\n  bool result = approximate_wv_georeference(xml_path, georef);\n  xercesc::XMLPlatformUtils::Terminate();\n  return result;\n}\n"
  },
  {
    "path": "src/asp/Camera/RPC_XML.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// These are objects that relate directly to block in XML that we need\n// to read. They only read and then store the raw values. Other\n// objects will interpret the results.\n\n#ifndef __STEREO_CAMERA_RPC_XML_H__\n#define __STEREO_CAMERA_RPC_XML_H__\n\n#include <asp/Core/BitChecker.h>\n\n#include <vw/Core/FundamentalTypes.h>\n#include <vw/Core/Log.h>\n#include <vw/Math/Vector.h>\n#include <vw/Math/Quaternion.h>\n#include <vw/Math/BBox.h>\n#include <vw/Cartography/GeoReference.h>\n#include <vw/Camera/CameraModel.h>\n\n#include <vector>\n#include <string>\n\n#include <boost/smart_ptr/shared_ptr.hpp>\n\n// Special forward declare so we can hide the Xerces headers.\n#include <xercesc/util/XercesDefs.hpp> // Needed for this XERCES macro\nXERCES_CPP_NAMESPACE_BEGIN\n  class DOMDocument;\n  class DOMElement;\nXERCES_CPP_NAMESPACE_END\n\nnamespace asp {\n\n  // Forward declaration so we don't need to include this class's header\n  class RPCModel;\n\n  /// Objects that represent read data from XML. These also provide a\n  /// storage structure for modification later on.\n  class ImageXML : public BitChecker {\n\n    void parse_meta      (xercesc::DOMElement* node);\n    void parse_band_tdi  (xercesc::DOMElement* node, int & out_tdi);\n    void parse_tlc_list  (xercesc::DOMElement* node);\n    void parse_image_size(xercesc::DOMElement* node);\n\n  public:\n    ImageXML();\n\n    void parse(xercesc::DOMElement* node);\n\n    std::string  tlc_start_time;\n    std::string  first_line_start_time;\n    std::vector<std::pair<double,double> > tlc_vec; // Line -> time offset pairings\n    std::string  sat_id, band_id;\n    std::string  scan_direction;\n    int          tdi;\n    std::vector<int> tdi_multi; // for multi-spectral images\n    double       avg_line_rate;\n    vw::Vector2i image_size;\n    std::string generation_time;      // e.g., 2013-10-12T10:48:48.000000Z\n    std::string image_descriptor;     // e.g., \"Stereo1B\"\n  };\n\n  ///\n  class GeometricXML : public BitChecker {\n\n    void parse_principal_distance(xercesc::DOMElement* node);\n    void parse_optical_distortion(xercesc::DOMElement* node);\n    void parse_perspective_center(xercesc::DOMElement* node);\n    void parse_camera_attitude   (xercesc::DOMElement* node);\n    void parse_detector_mounting (xercesc::DOMElement* node);\n\n  public:\n    GeometricXML();\n\n    void parse(xercesc::DOMElement* node);\n\n    double      principal_distance;   // mm\n    vw::int32   optical_polyorder;\n    vw::Vector<double> optical_a, optical_b; // Don't currently support these\n    vw::Vector3 perspective_center;  // meters in satellite frame\n    vw::Quat    camera_attitude;\n    vw::Vector2 detector_origin;     // mm\n    double      detector_rotation;    // degrees about Z+ in camera frame\n    double      detector_pixel_pitch; // mm\n\n    void printDebugInfo() const; ///< Debug string\n  };\n\n  ///\n  class EphemerisXML : public BitChecker {\n\n    void parse_meta    (xercesc::DOMElement* node);\n    void parse_eph_list(std::string const& rawXml);\n\n  public:\n    EphemerisXML();\n\n    void parse(xercesc::DOMElement* node, std::string const& rawXml);\n\n    std::string start_time;      // UTC\n    double time_interval;        // seconds\n\n    // Satellite position vector (ECEF). This will be used later to\n    // find the camera positions. We will need this even then, if\n    // propagating covariances, as those are for the satellite\n    // positions and not the camera positions.  See another note in\n    // AttitudeXML.\n    std::vector<vw::Vector3> satellite_position_vec;\n    // Satellite covariances. Only the region at and above the main\n    // diagonal is saved, as this matrix is symmetric.\n    // Concatenate all of them in the same vector, will be easier to\n    // interpolate later.\n    std::vector<double> satellite_pos_cov;\n\n    std::vector<vw::Vector3> velocity_vec; // ECEF\n  };\n\n  /// \n  class AttitudeXML : public BitChecker {\n\n    void parse_meta(xercesc::DOMElement* node);\n    void parse_att_list(std::string const& rawXml);\n\n  public:\n    AttitudeXML();\n\n    void parse(xercesc::DOMElement* node, std::string const& rawXml);\n\n    std::string start_time;\n    double time_interval;\n\n    // The satellite_quat_vec keeps the quaternions with original\n    // values and original order. Later, those will be used to\n    // manufacture the camera orientation vector, which will result in\n    // some swapping around of these values and some rotations. We\n    // need to keep even later satellite_quat_vec if we want to\n    // compute covariances, as they are one-to-one correspondence with\n    // satellite_quat_cov. See also note in the\n    // EphemerisXML class.\n    std::vector<vw::Vector<double, 4>> satellite_quat_vec;\n    // This has entries at and above main diagonal (4x4 matrix, 10 entries).\n    // Keep them concatenated into a single vector, for easy of interpolation later.\n    std::vector<double> satellite_quat_cov;\n  };\n\n  /// Reads from Digital Globe XML format\n  class RPCXML: public BitChecker {\n    boost::shared_ptr<RPCModel> m_rpc;\n    vw::BBox3 m_lat_lon_height_box;\n\n    void parse_vector(xercesc::DOMElement* node,\n                       vw::Vector<double,20> & vec);\n\n    void parse_rpb(xercesc::DOMElement* root); ///< Digital Globe XML\n    void parse_rational_function_model(xercesc::DOMElement* node,\n                                       bool is_spot67 = false);\n    void parse_perusat_model(xercesc::DOMElement* node); ///< PeruSat-1\n\n  public:\n    RPCXML();\n    void read_from_file(std::string const& name);\n    void parse(xercesc::DOMElement* node) { parse_rpb(node); }\n\n    // TODO: Why is this function in this class?\n    void parse_bbox(xercesc::DOMElement* node); ///< Read the valid sensor model bounds\n\n    // Parse the terrain height (only for ortho-ready images)\n    double parse_terrain_height(xercesc::DOMElement* node);\n\n    /// Return a pointer to the loaded RPC model.\n    RPCModel* rpc_ptr() const;\n    /// Get the GDC bounding box that the RPC model is valid for.\n    vw::BBox3 get_lon_lat_height_box() const;\n  };\n\n  // Helper functions to allow us to fill the objects. This doesn't\n  // really help with code reuse but I think it makes it easer to read.\n  void read_xml(std::string const& filename,\n                 GeometricXML& geo,\n                 AttitudeXML & att,\n                 EphemerisXML& eph,\n                 ImageXML    & img,\n                 RPCXML      & rpc);\n  vw::Vector2i xml_image_size(std::string const& filename);\n\n  /// Function to extract the four corners from the first band\n  ///  of a Worldview XML file.\n  /// - The order is [TOP_LEFT, TOP_RIGHT, BOT_RIGHT, BOT_LEFT]\n  bool read_WV_XML_corners(std::string const& xml_path,\n                           std::vector<vw::Vector2> &pixel_corners,\n                           std::vector<vw::Vector2> &lonlat_corners);\n\n  /// Attempts to approximate a georeference for a WorldView image using the\n  ///  four corner points in the XML file.\n  /// - This only works for unprojected WV images with four lonlat GCPs at the corner pixels.\n  /// - The approximation is limited to using a perspective transform.\n  bool approximate_wv_georeference(std::string const& wv_xml_path,\n                                   vw::cartography::GeoReference & approx_georef);\n\n  /// Reads a georeference from the WorldView file.\n  /// - If the image is not georegistered but there are\n  ///   corner coordinates in xml_path, an approximate\n  ///   georef file will be created.\n  bool read_wv_georeference(vw::cartography::GeoReference &georef,\n                            std::string const &image_path,\n                            std::string const &xml_path=\"\");\n\n} //end namespace asp\n\n#endif//__STEREO_CAMERA_RPC_XML_H__\n"
  },
  {
    "path": "src/asp/Camera/RpcUtils.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// RPC model utilities\n\n#include <asp/Camera/RpcUtils.h>\n#include <asp/Camera/RPCModel.h>\n\n#include <vw/Cartography/GeoReference.h>\n\nnamespace asp {\n\n// Sample the llh box and shoot the 3D points into the camera.\n// Filter by image box.\nvoid sample_llh_pix_bbox(vw::BBox2 const& ll_box,\n                         vw::Vector2 const& h_range,\n                         int num_samples,\n                         vw::cartography::Datum const& datum,\n                         vw::CamPtr cam,\n                         vw::BBox2 const& image_box,\n                         // Outputs\n                         std::vector<vw::Vector3> & all_llh,\n                         std::vector<vw::Vector2> & all_pixels) {\n\n  // Wipe the outputs\n  all_llh.clear();\n  all_pixels.clear();\n\n  double delta_lon = (ll_box.max()[0] - ll_box.min()[0])/double(num_samples);\n  double delta_lat = (ll_box.max()[1] - ll_box.min()[1])/double(num_samples);\n  double delta_ht  = (h_range[1] - h_range[0])/double(num_samples);\n\n  for (double lon = ll_box.min()[0]; lon <= ll_box.max()[0]; lon += delta_lon) {\n    for (double lat = ll_box.min()[1]; lat <= ll_box.max()[1]; lat += delta_lat) {\n      for (double ht = h_range[0]; ht <= h_range[1]; ht += delta_ht) {\n\n        vw::Vector3 llh(lon, lat, ht);\n        vw::Vector3 xyz = datum.geodetic_to_cartesian(llh);\n\n        // Go back to llh. This is a bugfix for the 360 deg offset problem.\n        llh = datum.cartesian_to_geodetic(xyz);\n\n        vw::Vector2 cam_pix;\n        try {\n          // The point_to_pixel function can be capricious\n          cam_pix = cam->point_to_pixel(xyz);\n        } catch(...) {\n          continue;\n        }\n        if (image_box.contains(cam_pix)) {\n          all_llh.push_back(llh);\n          all_pixels.push_back(cam_pix);\n        }\n\n      }\n    }\n  }\n  \n  return;\n}\n\n// Add pixel and llh samples along the perimeter and diagonals of image_box.\n// Constrain by the ll box.\nvoid add_perimeter_diag_points(vw::BBox2 const& image_box, \n                               vw::cartography::Datum const& datum,\n                               vw::CamPtr cam,\n                               vw::BBox2 const& ll, // lon-lat box\n                               vw::Vector2 const& H, // height range\n                               // Outputs (append to these)\n                               std::vector<vw::Vector3> & all_llh,\n                               std::vector<vw::Vector2> & all_pixels) {\n\n  // Reduce the max by 1, as sample_float_box() assumes the max is not exclusive\n  vw::BBox2 b = image_box;\n  b.max() -= vw::Vector2(1, 1);\n\n  // Calc samples on box perimeter and diagonals\n  // Add on the perimeter a non-small portion of points we added so far throughout\n  int num_steps = std::max(100, int(all_llh.size()/10));\n  std::vector<vw::Vector2> points;\n  vw::cartography::sample_float_box(b, points, num_steps);\n  \n  // Use only the min and max heights\n  for (size_t i = 0; i < H.size(); i++) {\n    double h = H[i];\n\n    for (size_t j = 0; j < points.size(); j++) {\n      vw::Vector2 pix = points[j];\n      \n      double semi_major = datum.semi_major_axis() + h;\n      double semi_minor = datum.semi_minor_axis() + h;\n      vw::Vector3 intersection;\n      try {\n        intersection \n          = vw::cartography::datum_intersection(semi_major, semi_minor, \n                                                cam->camera_center(pix), \n                                                cam->pixel_to_vector(pix));\n        if (intersection == vw::Vector3())\n          continue;\n      } catch (...) {\n        continue;\n      }\n\n      vw::Vector3 llh = datum.cartesian_to_geodetic(intersection);\n      \n      // Must be contained in the lon-lat box\n      if (!ll.contains(vw::Vector2(llh[0], llh[1])))\n        continue;\n        \n      all_llh.push_back(llh);\n      all_pixels.push_back(pix);\n    }\n  }\n\n  return;\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Camera/RpcUtils.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file RpcUtils.h\n\n// RPC model utilities\n\n#ifndef __ASP_CAMERA_RPC_UTILS_H__\n#define __ASP_CAMERA_RPC_UTILS_H__\n\n#include <vw/Camera/CameraModel.h>\n#include <vw/Math/Matrix.h>\n#include <vw/Math/BBox.h>\n\n#include <string>\n#include <vector>\n\nnamespace vw {\n  namespace cartography {\n    class Datum;\n    class GeoReference;\n  }\n}\n\nnamespace asp {\n\n// Sample the llh box and shoot the 3D points into the camera.\n// Filter by image box.\nvoid sample_llh_pix_bbox(vw::BBox2 const& ll_box,\n                         vw::Vector2 const& h_range,\n                         int num_samples,\n                         vw::cartography::Datum const& datum,\n                         vw::CamPtr cam,\n                         vw::BBox2 const& image_box,\n                         // Outputs\n                         std::vector<vw::Vector3> & all_llh,\n                         std::vector<vw::Vector2> & all_pixels);\n\n// Add pixel and llh samples along the perimeter and diagonals of image_box.\n// Constrain by the ll box.\nvoid add_perimeter_diag_points(vw::BBox2 const& image_box, \n                               vw::cartography::Datum const& datum,\n                               vw::CamPtr cam,\n                               vw::BBox2 const& ll, // lon-lat box\n                               vw::Vector2 const& H, // height range\n                               // Outputs (append to these)\n                               std::vector<vw::Vector3> & all_llh,\n                               std::vector<vw::Vector2> & all_pixels);\n\n} // end namespace asp\n\n#endif //__ASP_CAMERA_RPC_UTILS_H__\n"
  },
  {
    "path": "src/asp/Camera/SPOT_XML.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <vw/Core/Exception.h>          // for ArgumentErr, vw_throw, etc\n#include <vw/Math/Quaternion.h>         // for Quat, Quaternion\n#include <vw/Math/Vector.h>             // for Vector, Vector3, Vector4, etc\n#include <vw/Cartography/Datum.h>       // for Datum\n#include <vw/FileIO/DiskImageResourceGDAL.h>\n\n#include <asp/Camera/XMLBase.h>\n#include <asp/Camera/SPOT_XML.h>\n#include <asp/Camera/RPCModel.h>\n#include <asp/Camera/XMLBase.h>\n\n#include <xercesc/parsers/XercesDOMParser.hpp>\n#include <xercesc/sax/HandlerBase.hpp>\n#include <xercesc/sax/SAXException.hpp>\n#include <xercesc/sax/SAXParseException.hpp>\n#include <xercesc/dom/DOMException.hpp>\n#include <xercesc/util/PlatformUtils.hpp>\n#include <xercesc/sax/ErrorHandler.hpp>\n\n#include <boost/algorithm/string/predicate.hpp>\n#include <boost/filesystem.hpp>\n#include <boost/lexical_cast.hpp>\n\n#include <fstream>\n#include <iomanip>\n\nusing namespace vw;\nusing namespace vw::cartography;\nusing namespace xercesc;\n\nusing asp::XmlUtils::get_node;\nusing asp::XmlUtils::cast_xmlch;\nusing asp::XmlUtils::parseDoublesFromXmlBlock;\n\nnamespace asp {\n\nDOMElement* SpotXML::open_xml_file(std::string const& xml_path) {\n\n  // Check if the file actually exists and throw a user helpful file.\n  if (!boost::filesystem::exists(xml_path))\n    vw_throw(ArgumentErr() << \"XML file \\\"\" << xml_path << \"\\\" does not exist.\");\n\n  std::string error_prefix = \"XML file \\\"\" + xml_path + \"\\\" is invalid.\\nException message is: \\n\";\n  std::string err_message  = \"\"; // Filled in later on error\n\n  try{\n    //std::cout << \"Set XML parser\\n\";\n\n    // Set up the XML parser if we have not already done so\n    if (!m_parser.get()) {\n      m_parser.reset(new XercesDOMParser());\n      m_errHandler.reset(new HandlerBase());\n      m_parser->setValidationScheme(XercesDOMParser::Val_Always);\n      m_parser->setDoNamespaces(true);\n      m_parser->setErrorHandler(m_errHandler.get());\n    }\n\n    //std::cout << \"Load XML\\n\";\n\n    // Load the XML file\n    m_parser->parse(xml_path.c_str());\n    DOMDocument* xmlDoc      = m_parser->getDocument();\n    DOMElement * elementRoot = xmlDoc->getDocumentElement();\n    return elementRoot;\n\n  } catch (const XMLException& toCatch) {\n    char* message = XMLString::transcode(toCatch.getMessage());\n    err_message = error_prefix + message;\n    XMLString::release(&message);\n  } catch (const DOMException& toCatch) {\n    char* message = XMLString::transcode(toCatch.msg);\n    err_message = error_prefix + message;\n    XMLString::release(&message);\n  } catch (const SAXException& toCatch) {\n    char* message = XMLString::transcode(toCatch.getMessage());\n    err_message = error_prefix + message;\n    XMLString::release(&message);\n  } catch (const std::exception& e) {\n    err_message = error_prefix + e.what();\n  } catch (...) {\n    err_message = \"Unrecognized error in XML file \\\"\" + xml_path + \"\\\"\\n\";\n  }\n  vw_throw(ArgumentErr() << err_message); // Only get here on error\n  return 0;\n}\n\nvoid SpotXML::read_xml(std::string const& xml_path) {\n\n  DOMElement * elementRoot = open_xml_file(xml_path);\n\n  // Read the raw XML for fast parsing of large numeric blocks\n  std::ifstream ifs(xml_path);\n  std::string rawXml((std::istreambuf_iterator<char>(ifs)),\n                      std::istreambuf_iterator<char>());\n\n  parse_xml(elementRoot, rawXml);\n}\n\nstd::vector<vw::Vector2> SpotXML::get_lonlat_corners(std::string const& xml_path) {\n  SpotXML xml_reader;\n  DOMElement * root = xml_reader.open_xml_file(xml_path);\n  // Just get this one node we need to find the four corners\n  DOMElement* raster_dims_node = get_node<DOMElement>(root, \"Dataset_Frame\");\n  xml_reader.read_corners(raster_dims_node);\n  return xml_reader.lonlat_corners;\n}\n\nvoid SpotXML::parse_xml(xercesc::DOMElement* node,\n                        std::string const& rawXml) {\n\n  xercesc::DOMElement* dataset_frame_node       = get_node<DOMElement>(node, \"Dataset_Frame\");\n  xercesc::DOMElement* raster_dims_node         = get_node<DOMElement>(node, \"Raster_Dimensions\");\n  xercesc::DOMElement* ephemeris_node           = get_node<DOMElement>(node, \"Ephemeris\");\n  xercesc::DOMElement* corrected_attitudes_node = get_node<DOMElement>(node, \"Corrected_Attitudes\");\n  xercesc::DOMElement* sensor_config_node       = get_node<DOMElement>(node, \"Sensor_Configuration\");\n\n  read_corners(dataset_frame_node);\n  read_ephemeris(ephemeris_node);\n  read_image_size(raster_dims_node);\n  read_attitude(corrected_attitudes_node);\n  read_look_angles(rawXml);\n  read_line_times(sensor_config_node);\n\n  // Set up the base time\n  // - The position log starts before the image does, so the first\n  //   time there should be a good reference time.\n  boost::posix_time::ptime earliest_time = boost::posix_time::time_from_string(\"2016-05-04 00:00:00.00\");\n  std::list<std::pair<std::string, vw::Vector3> >::const_iterator iter;\n  for (iter = position_logs.begin(); iter != position_logs.end(); iter++) {\n    std::string s = iter->first;\n    boost::replace_all(s, \"T\", \" \");\n    boost::posix_time::ptime this_time = boost::posix_time::time_from_string(s);\n    if (this_time < earliest_time) {\n      earliest_time = this_time;\n      //std::cout << \"Using reference time \" << iter->first << std::endl;\n    }\n  }\n  m_time_ref_functor.set_base_time(earliest_time);\n  //std::cout << \"Done parsing XML.\\n\";\n}\n\nvoid SpotXML::read_look_angles(std::string const& rawXml) {\n\n  const size_t num_cols = image_size.x();\n  if (num_cols == 0)\n    vw_throw(ArgumentErr() << \"Did not load image size from SPOT XML file!\\n\");\n  look_angles.resize(num_cols);\n\n  // Fast path: extract all doubles from the Look_Angles_List block\n  // Each entry has 3 values: DETECTOR_ID, PSI_X, PSI_Y\n  std::vector<double> values;\n  parseDoublesFromXmlBlock(rawXml,\n                           \"<Look_Angles_List>\", \"</Look_Angles_List>\",\n                           values);\n\n  size_t valsPerEntry = 3;\n  if (values.size() != num_cols * valsPerEntry)\n    vw_throw(ArgumentErr() << \"Expected \" << num_cols * valsPerEntry\n             << \" look angle values, got \" << values.size() << \".\\n\");\n\n  for (size_t i = 0; i < num_cols; i++) {\n    const double* v = &values[i * valsPerEntry];\n    look_angles[i].first    = static_cast<int>(v[0]);\n    look_angles[i].second.x() = v[1];\n    look_angles[i].second.y() = v[2];\n  }\n}\n\nvoid SpotXML::read_ephemeris(xercesc::DOMElement* ephemeris_node) {\n\n  position_logs.clear(); // Reset data storage\n  velocity_logs.clear();\n\n  // Dig one level down\n  xercesc::DOMElement* points_node = get_node<DOMElement>(ephemeris_node, \"Points\");\n\n  // Pick out the \"Point\" nodes\n  DOMNodeList* children = points_node->getChildNodes();\n  for (XMLSize_t i = 0; i < children->getLength(); i++) {\n    // Check child node type\n    DOMNode* curr_node = children->item(i);\n    if (curr_node->getNodeType() != DOMNode::ELEMENT_NODE)\n      continue;\n\n    // Check the node name\n    DOMElement* curr_element = dynamic_cast<DOMElement*>(curr_node);\n    std::string tag(XMLString::transcode(curr_element->getTagName()));\n    if (tag.find(\"Point\") == std::string::npos)\n      continue;\n\n    // Get the three sub-nodes\n    xercesc::DOMElement* location_node = get_node<DOMElement>(curr_element, \"Location\");\n    xercesc::DOMElement* velocity_node = get_node<DOMElement>(curr_element, \"Velocity\");\n\n    // Read in both sets of values\n    std::string time;\n    Vector3 position, velocity;\n\n    cast_xmlch(get_node<DOMElement>(curr_element, \"TIME\")->getTextContent(), time);\n    cast_xmlch(get_node<DOMElement>(location_node, \"X\")->getTextContent(), position.x());\n    cast_xmlch(get_node<DOMElement>(location_node, \"Y\")->getTextContent(), position.y());\n    cast_xmlch(get_node<DOMElement>(location_node, \"Z\")->getTextContent(), position.z());\n    cast_xmlch(get_node<DOMElement>(velocity_node, \"X\")->getTextContent(), velocity.x());\n    cast_xmlch(get_node<DOMElement>(velocity_node, \"Y\")->getTextContent(), velocity.y());\n    cast_xmlch(get_node<DOMElement>(velocity_node, \"Z\")->getTextContent(), velocity.z());\n\n    position_logs.push_back(std::pair<std::string, Vector3>(time, position));\n    velocity_logs.push_back(std::pair<std::string, Vector3>(time, velocity));\n\n  } // End loop through corrected attitudes\n}\n\nvoid SpotXML::read_attitude(xercesc::DOMElement* corrected_attitudes_node) {\n\n  pose_logs.clear(); // Reset data storage\n\n  // Dig one level down\n  xercesc::DOMElement* corrected_attitude_node\n    = get_node<DOMElement>(corrected_attitudes_node, \"Corrected_Attitude\");\n\n  // Pick out the \"Angles\" nodes\n  DOMNodeList* children = corrected_attitude_node->getChildNodes();\n  for (XMLSize_t i = 0; i < children->getLength(); i++) {\n    // Check child node type\n    DOMNode* curr_node = children->item(i);\n    if (curr_node->getNodeType() != DOMNode::ELEMENT_NODE)\n      continue;\n\n    // Check the node time\n    DOMElement* curr_element = dynamic_cast<DOMElement*>(curr_node);\n    std::string tag(XMLString::transcode(curr_element->getTagName()));\n    if (tag.find(\"Angles\") == std::string::npos)\n      continue;\n\n    std::pair<std::string, Vector3> data;\n    cast_xmlch(get_node<DOMElement>(curr_element, \"YAW\")->getTextContent(), data.second.x());\n    cast_xmlch(get_node<DOMElement>(curr_element, \"PITCH\")->getTextContent(), data.second.y());\n    cast_xmlch(get_node<DOMElement>(curr_element, \"ROLL\")->getTextContent(), data.second.z());\n    cast_xmlch(get_node<DOMElement>(curr_element, \"TIME\")->getTextContent(), data.first);\n    pose_logs.push_back(data);\n\n  } // End loop through corrected attitudes\n}\n\nvoid SpotXML::read_corners(xercesc::DOMElement* dataset_frame_node) {\n\n  // Set up storage\n  const size_t NUM_CORNERS = 4;\n  lonlat_corners.resize(NUM_CORNERS);\n  pixel_corners.resize(NUM_CORNERS);\n\n  // Look through the four vertex nodes\n  // - Currently we assume they are always in the same order!\n  DOMNodeList* children = dataset_frame_node->getChildNodes();\n  size_t count = 0;\n  for (XMLSize_t i = 0; i < children->getLength(); i++) {\n    // Check child node type\n    DOMNode* curr_node = children->item(i);\n    if (curr_node->getNodeType() != DOMNode::ELEMENT_NODE)\n      continue;\n\n    // Check the node time\n    DOMElement* curr_element = dynamic_cast<DOMElement*>(curr_node);\n\n    // There should only be four vertex nodes here.\n    // Parse the values.\n    XmlUtils::cast_xmlch(XmlUtils::get_node<DOMElement>(curr_element, \"FRAME_LON\")->getTextContent(), lonlat_corners[count].x());\n    XmlUtils::cast_xmlch(XmlUtils::get_node<DOMElement>(curr_element, \"FRAME_LAT\")->getTextContent(), lonlat_corners[count].y());\n    XmlUtils::cast_xmlch(XmlUtils::get_node<DOMElement>(curr_element, \"FRAME_ROW\")->getTextContent(), pixel_corners[count].y());\n    XmlUtils::cast_xmlch(XmlUtils::get_node<DOMElement>(curr_element, \"FRAME_COL\")->getTextContent(), pixel_corners[count].x());\n    ++count;\n    if (count == NUM_CORNERS)\n      return;\n\n  } // End loop through the vertex nodes\n}\n\nvoid SpotXML::read_image_size(xercesc::DOMElement* raster_dims_node) {\n  cast_xmlch(get_node<DOMElement>(raster_dims_node, \"NROWS\")->getTextContent(), image_size[1]);\n  cast_xmlch(get_node<DOMElement>(raster_dims_node, \"NCOLS\")->getTextContent(), image_size[0]);\n}\n\nvoid SpotXML::read_line_times(xercesc::DOMElement* sensor_config_node) {\n  cast_xmlch(get_node<DOMElement>(sensor_config_node, \"LINE_PERIOD\")->getTextContent(), line_period);\n  cast_xmlch(get_node<DOMElement>(sensor_config_node, \"SCENE_CENTER_TIME\")->getTextContent(), center_time);\n  cast_xmlch(get_node<DOMElement>(sensor_config_node, \"SCENE_CENTER_LINE\")->getTextContent(), center_line);\n  cast_xmlch(get_node<DOMElement>(sensor_config_node, \"SCENE_CENTER_COL\")->getTextContent(), center_col);\n  center_line -= 1;\n  center_col  -= 1; // Convert from 1-based to 0-based indices.\n}\n\n// ----- These functions help convert the input data to a useable format ------\n\n// Input strings look like this: 2008-03-04T12:31:03.081912\ndouble SpotXML::convert_time(std::string const& s) const {\n  try{\n    // Replace the T with a space so the default Boost function can parse the time.\n    std::string s2 = s;\n    boost::replace_all(s2, \"T\", \" \");\n    boost::posix_time::ptime time = boost::posix_time::time_from_string(s2);\n    return this->m_time_ref_functor(time);\n  } catch(...) {\n    vw::vw_throw(vw::ArgumentErr() << \"Failed to parse time from string: \" << s << \"\\n\");\n  }\n  return -1; // Never reached!\n}\n\n// This is pretty simple, SPOT5 has a constant time for each line.\nvw::LinearTimeInterpolation SpotXML::setup_time_func() const {\n\n  // The metadata tells us the time of the middle line, so find the time for the first line.\n  double center_time_d = convert_time(this->center_time);\n  double min_line_diff = static_cast<double>(0 - this->center_line);\n  double min_line_time = center_time_d + this->line_period*min_line_diff;\n  //std::cout << \"Setup time functor: \" << std::setprecision(12)  << min_line_time << \", \" << this->line_period << std::endl;\n  //std::cout << std::setprecision(12)  << \"Center time: \" << center_time_d << std::endl;\n  return vw::LinearTimeInterpolation(min_line_time, this->line_period);\n}\n\n// Velocities are the sum of inertial velocities and the instantaneous\n//  Earth rotation.\n\n// The velocity is already in GCC, so just pack into a function.\nvw::LagrangianInterpolation SpotXML::setup_velocity_func() const {\n\n  const int INTERP_RADII = 4; // Reccomended in the docs\n  std::vector<double>  time;\n  std::vector<Vector3> velocity;\n\n  // Loop through the velocity logs and extract values\n  std::list<std::pair<std::string, vw::Vector3> >::const_iterator iter;\n  for (iter = velocity_logs.begin(); iter != velocity_logs.end(); iter++) {\n    time.push_back(convert_time(iter->first));\n    velocity.push_back(iter->second);\n    //std::cout << \"Adding velocity point: \" << iter->first \n    //          << \" --> \" << iter->second << std::endl;\n  }\n\n  // More generic method for variable time intervals\n  //return vw::LagrangianInterpolationVarTime(velocity, time, INTERP_RADII);\n\n  // A faster method for when we know the time delta is constant\n  double min_time   = time[0];\n  double max_time   = time[time.size()-1];\n  double time_delta = (max_time - min_time) / (time.size()-1);\n  return vw::LagrangianInterpolation(velocity, min_time, time_delta, max_time, INTERP_RADII);\n}\n\n// The position is already in GCC, so just pack into a function.\n// - Currently this is identical to the velocity function, but this may change later.\nvw::LagrangianInterpolation SpotXML::setup_position_func() const {\n\n const int INTERP_RADII = 4; // Reccomended in the docs\n  std::vector<double>  time;\n  std::vector<Vector3> position;\n\n  // Loop through the velocity logs and extract values\n  std::list<std::pair<std::string, vw::Vector3> >::const_iterator iter;\n  for (iter = position_logs.begin(); iter != position_logs.end(); iter++) {\n    time.push_back(convert_time(iter->first));\n    position.push_back(iter->second);\n    //std::cout << \"Adding position point: \" << convert_time(iter->first)\n    //          << \" --> \" << iter->second << std::endl;\n  }\n\n  // More generic method for variable time intervals\n  //return vw::LagrangianInterpolationVarTime(position, time, INTERP_RADII);\n\n  // A faster method for when we know the time delta is constant\n  double min_time   = time[0];\n  double max_time   = time[time.size()-1];\n  double time_delta = (max_time - min_time) / (time.size()-1);\n  return vw::LagrangianInterpolation(position, min_time, time_delta, max_time, INTERP_RADII);\n}\n\nvw::LinearPiecewisePositionInterpolation SpotXML::setup_pose_func(\n        vw::LinearTimeInterpolation const& time_func) const {\n\n  // This function returns a functor that returns just the yaw/pitch/roll angles.\n  // - The time interval between lines is not constant but it is extremely close.\n\n  // For some reason the corrected pose angles do not start early enough to cover\n  // the time span for all of the input lines!\n  // - In order to handle this, we repeat the earliest pose value so that it starts\n  //   before the first line.\n  // - The raw pose angles do start before the lines, but their values differ noticably\n  //   from the corrected values.\n\n  // Compute how many padded pose entries are needed to cover all of the lines.\n  size_t num_lines           = this->image_size[1];\n  double num_corrected_poses = static_cast<double>(pose_logs.size());\n  double first_line_time     = time_func(0);\n  double last_line_time      = time_func(num_lines - 1.0);\n  double pose_start_time     = convert_time(pose_logs.front().first);\n  double pose_stop_time      = convert_time(pose_logs.back().first);\n  double pose_delta_t        = (pose_stop_time - pose_start_time) / (num_corrected_poses - 1.0);\n  int    num_prefill_poses   = static_cast<int>(ceil((pose_start_time - first_line_time) / pose_delta_t));\n  int    num_postfill_poses  = static_cast<int>(ceil((last_line_time  - pose_stop_time) / pose_delta_t));\n  //std::cout << \"First line time: \" << first_line_time << std::endl;\n  //std::cout << \"Last line time:  \" << last_line_time  << std::endl;\n  //std::cout << \"Pose start: \" << pose_start_time << std::endl;\n  //std::cout << \"Pose stop:  \" << pose_stop_time  << std::endl;\n  num_postfill_poses += 1; // Stick another bit of padding on the back.\n                           // This is so our interpolation algorithms have enough room to interpolate.\n  if (num_prefill_poses < 1)\n    num_prefill_poses = 0;\n  if (num_postfill_poses < 1)\n    num_postfill_poses = 0;\n\n  size_t num_total_poses = pose_logs.size() + static_cast<size_t>(num_prefill_poses)\n                                            + static_cast<size_t>(num_postfill_poses);\n\n  std::vector<Vector3> pose(num_total_poses);\n  std::vector<double>  time(num_total_poses);\n\n  // Fill in the pre-padding poses\n  size_t index = 0;\n  for (int i = 0; i < num_prefill_poses; i++) {\n    double time_offset = pose_delta_t*static_cast<double>(num_prefill_poses-i);\n    time[index] = convert_time(pose_logs.front().first) - time_offset;\n    pose[index] = pose_logs.front().second;\n    //std::cout << \"PREFILL: \" << time[index] << std::endl;\n    ++index;\n  }\n\n  // Now fill in the real poses\n  std::list<std::pair<std::string, vw::Vector3> >::const_iterator iter;\n  for (iter = pose_logs.begin(); iter != pose_logs.end(); iter++) {\n    time[index] = convert_time(iter->first);\n    pose[index] = iter->second;\n    ++index;\n  }\n\n  // Fill in the post-padding poses\n  for (int i = 0; i < num_postfill_poses; i++) {\n    double time_offset = pose_delta_t*(i+1);\n    time[index] = convert_time(pose_logs.back().first) + time_offset;\n    pose[index] = pose_logs.back().second;\n    //std::cout << \"POSTFILL: \" << time[index] << std::endl;\n    ++index;\n  }\n\n  //double max_time = time.back();\n  double min_time = time.front();\n\n  //std::cout << std::setprecision(12) << \"Adding pose info: \" << min_time << \", \" \n  //          << max_time << \" -> \" << pose_delta_t << std::endl;\n\n  return vw::LinearPiecewisePositionInterpolation(pose, min_time, pose_delta_t);\n\n}\n\n} // end namespace asp\n\n"
  },
  {
    "path": "src/asp/Camera/SPOT_XML.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// These are objects that relate directly to block in XML that we need\n// to read. They only read and then store the raw values. Other\n// objects will interpret the results.\n\n#ifndef __STEREO_CAMERA_SPOT_XML_H__\n#define __STEREO_CAMERA_SPOT_XML_H__\n\n#include <vw/Core/FundamentalTypes.h>\n#include <vw/Core/Log.h>\n#include <vw/Math/Vector.h>\n#include <vw/Math/Quaternion.h>\n#include <vw/Math/BBox.h>\n#include <vw/Cartography/GeoReference.h>\n#include <vw/Camera/CameraModel.h>\n#include <vw/Math/PositionInterp.h>\n#include <vw/Camera/TimeInterp.h>\n#include <asp/Camera/TimeProcessing.h>\n\n#include <vector>\n#include <string>\n\n#include <boost/smart_ptr/shared_ptr.hpp>\n\n// Special forward declare so we can hide the Xerces headers.\n#include <xercesc/util/XercesDefs.hpp> // Needed for this XERCES macro\nXERCES_CPP_NAMESPACE_BEGIN\n  class DOMDocument;\n  class DOMElement;\n  class XercesDOMParser;\n  class ErrorHandler;\nXERCES_CPP_NAMESPACE_END\n\nnamespace asp {\n\n  class SpotXML {\n  public:\n\n    /// Constructor\n    /// - Sets the fixed reference time.\n    SpotXML():\n      m_time_ref_functor(boost::posix_time::time_from_string(\"2002-05-04 00:00:00.00\")) {}\n\n    // The reader will populate these fields\n    std::vector<vw::Vector2> lonlat_corners;\n    std::vector<vw::Vector2> pixel_corners;\n    std::vector<std::pair<int,         vw::Vector2> > look_angles;   // (column, psi_x/psi_y)\n    std::list  <std::pair<std::string, vw::Vector3> > pose_logs;     // (time,   yaw/pitch/roll)\n    std::list  <std::pair<std::string, vw::Vector3> > position_logs; // (time,   X/Y/Z)\n    std::list  <std::pair<std::string, vw::Vector3> > velocity_logs; // (time,   dX/dY/dZ)\n    vw::Vector2i image_size;\n    double       line_period;\n    std::string  center_time;\n    int          center_line;\n    int          center_col;\n\n    /// Parse an XML file to populate the data\n    void read_xml(std::string const& xml_path);\n\n    /// Parse an XML tree to populate the data\n    void parse_xml(xercesc::DOMElement* node, std::string const& rawXml);\n\n    /// Load the estimated image lonlat corners from the XML file\n    /// - Corners are returned in clockwise order.\n    static std::vector<vw::Vector2> get_lonlat_corners(std::string const& xml_path);\n\n    // Functions to setup functors which manage the raw input data.\n    vw::LagrangianInterpolation setup_position_func() const;\n    vw::LagrangianInterpolation setup_velocity_func() const;\n    vw::LinearTimeInterpolation setup_time_func    () const;\n    vw::LinearPiecewisePositionInterpolation setup_pose_func(\n        vw::LinearTimeInterpolation const& time_func) const; // (yaw/pitch/roll)        \n\n    /// Converts a time from string to numeric format.\n    /// - All times are in seconds relative to the earliest ephemeris time.\n    double convert_time(std::string const& s) const;\n\n  private: // The various XML data reading sections\n\n    /// Just opens the XML file for reading and returns the root node.\n    xercesc::DOMElement* open_xml_file(std::string const& xml_path);\n\n    void read_look_angles(std::string const& rawXml);\n    void read_ephemeris  (xercesc::DOMElement* ephemeris_node);\n    void read_attitude   (xercesc::DOMElement* corrected_attitudes_node);\n    void read_corners    (xercesc::DOMElement* dataset_frame_node);\n    void read_image_size (xercesc::DOMElement* raster_dims_node);\n    void read_line_times (xercesc::DOMElement* sensor_config_node);\n\n    boost::shared_ptr<xercesc::XercesDOMParser> m_parser;\n    boost::shared_ptr<xercesc::ErrorHandler>    m_errHandler;\n    SecondsFromRef m_time_ref_functor;\n\n  }; // End class SpotXML\n\n} //end namespace asp\n\n#endif//__STEREO_CAMERA_SPOT_XML_H__\n"
  },
  {
    "path": "src/asp/Camera/SatSim.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Functions used for the sat_sim.cc tool that are not general enough to put\n// somewhere else.\n\n#include <asp/Core/CamPoseUtils.h>\n#include <asp/Core/CameraTransforms.h>\n#include <asp/Core/DemUtils.h>\n#include <asp/Camera/SatSim.h>\n#include <asp/Camera/CsmModel.h>\n#include <asp/Camera/SyntheticLinescan.h>\n#include <asp/Rig/RigConfig.h>\n#include <asp/Core/FileUtils.h>\n\n#include <vw/Core/Stopwatch.h>\n#include <vw/Cartography/CameraBBox.h>\n#include <vw/Geometry/baseUtils.h>\n#include <vw/Cartography/CameraBBox.h>\n#include <vw/Cartography/GeoTransform.h>\n#include <vw/Cartography/GeoReferenceBaseUtils.h>\n#include <vw/Cartography/GeoReferenceUtils.h>\n#include <vw/Camera/PinholeModel.h>\n#include <vw/Core/StringUtils.h>\n#include <vw/Image/Filter.h>\n\n#include <iomanip>\n\nusing namespace vw::cartography;\nusing namespace vw::math;\nusing namespace vw::geometry;\n\nnamespace fs = boost::filesystem;\n\nnamespace asp {\n\n// Compute satellite position, and along / across track normalized vectors in\n// ECEF coordinates, given the first and last proj points and a value t giving\n// the position along this line. Produced along and across vectors are\n// normalized and perpendicular to each other.\nvoid calcEcefTrajPtAlongAcross(vw::Vector3 const& curr_proj,\n                               vw::cartography::GeoReference const& dem_georef,\n                               double delta,\n                               vw::Vector3 const& proj_along,\n                               vw::Vector3 const& proj_across,\n                               // Outputs\n                               vw::Vector3 & P,\n                               vw::Vector3 & along,\n                               vw::Vector3 & across) {\n\n  // Compute the point on the trajectory, in projected coordinates\n  asp::calcEcefAlongAcross(dem_georef, delta, proj_along, proj_across, curr_proj,\n                          // Outputs, as vectors in ECEF\n                          along, across);\n\n  // Convert the point along trajectory to ECEF\n  P  = vw::cartography::projToEcef(dem_georef, curr_proj);\n}\n\n// This is used to signify when the algorithm below fails to find a solution\nconst double g_big_val = 1e+100;\n\n// Calc the camera center, orientation, and ground point for the given projected\n// orbit position, roll, pitch, and yaw. The camera center is in ECEF.\n// The guess for the xyz ground point will be updated if the solver converges.\nbool calcCamPoseAndGroundPt(SatSimOptions const& opt,\n                            vw::Vector3 const& curr_proj,\n                            vw::cartography::GeoReference const& dem_georef,\n                            vw::ImageViewRef<vw::PixelMask<float>> dem,\n                            double delta,\n                            vw::Vector3 const& proj_along,\n                            vw::Vector3 const& proj_across,\n                            double roll, double pitch, double yaw,\n                            double height_guess,\n                            // Outputs\n                            vw::Matrix3x3 & cam2world,\n                            vw::Vector3 & cam_ctr, \n                            vw::Vector3 & xyz,\n                            vw::Vector3 & xyz_guess) {\n\n  vw::Vector3 along, across;\n  calcEcefTrajPtAlongAcross(curr_proj, dem_georef, delta,\n                            proj_along, proj_across, \n                            // Outputs, perpendicular and normal vectors\n                            cam_ctr, along, across);\n\n  // Find the z vector as perpendicular to both along and across\n  vw::Vector3 down = vw::math::cross_prod(along, across);\n  down = down / norm_2(down);\n\n  // The camera to world rotation\n  asp::assembleCam2WorldMatrix(along, across, down, cam2world);\n  // Apply the roll-pitch-yaw rotation\n  vw::Matrix3x3 R = asp::rollPitchYaw(roll, pitch, yaw);\n  cam2world = cam2world * R * asp::rotationXY();\n\n  // Ray from camera to ground going through image center\n  // TODO(oalexan1): This must go through the optical center, not the image center.\n  vw::Vector3 cam_dir = cam2world * vw::Vector3(0, 0, 1);\n\n  // Find the intersection of this ray with the ground\n  bool treat_nodata_as_zero = false;\n  bool has_intersection = false;\n  double max_abs_tol = std::min(opt.dem_height_error_tol, 1e-14);\n  double max_rel_tol = max_abs_tol;\n  int num_max_iter = 100;\n  xyz = vw::cartography::camera_pixel_to_dem_xyz\n    (cam_ctr, cam_dir, dem,\n      dem_georef, treat_nodata_as_zero,\n      has_intersection, \n      // Below we use a prudent approach. Try to make the solver work\n      // hard. It is not clear if this is needed.\n      std::min(opt.dem_height_error_tol, 1e-8),\n      max_abs_tol, max_rel_tol, \n      num_max_iter, xyz_guess, height_guess);\n\n  // Update the guess if we found a solution\n  if (has_intersection) \n    xyz_guess = xyz;\n\n  return has_intersection;\n}\n  \n// Given an orbit given by the first and last camera center positions in\n// projected coordinates, a real number t describing the position along this\n// line, roll, pitch, and yaw for the camera (relative to nadir), find the z\n// direction for the camera (camera look), intersect it with the ground, find\n// the DEM pixel location, and return the distance from this location to a given\n// pixel location.\ndouble demPixelErr(SatSimOptions const& opt,\n                   vw::cartography::GeoReference const& dem_georef,\n                   vw::ImageViewRef<vw::PixelMask<float>> dem,\n                   vw::Vector3 const& first_proj,\n                   vw::Vector3 const& last_proj,\n                   vw::Vector3 const& proj_along,\n                   vw::Vector3 const& proj_across,\n                   double t,\n                   double delta, // a small number to move along track\n                   double roll, double pitch, double yaw,\n                   vw::Vector2 const& pixel_loc,\n                   double height_guess,\n                   vw::Vector3 & xyz_guess) {\n\n  // Calc position along the trajectory and normalized along and across vectors\n  // in ECEF\n  vw::Vector3 curr_proj = first_proj * (1.0 - t) + last_proj * t;\n\n  vw::Matrix3x3 cam2world;\n  vw::Vector3 cam_ctr, xyz;\n  bool success = calcCamPoseAndGroundPt(opt, curr_proj, dem_georef, dem, delta,\n                                        proj_along, proj_across, roll, pitch, yaw,\n                                        height_guess, cam2world, cam_ctr, xyz, xyz_guess);\n  \n  if (!success)\n    return g_big_val;\n\n  // Convert to llh\n  vw::Vector3 llh = dem_georef.datum().cartesian_to_geodetic(xyz);\n\n  // Find pixel location \n  vw::Vector2 pixel_loc2 = dem_georef.lonlat_to_pixel(subvector(llh, 0, 2));\n\n  // If the pixel is outside the DEM, return a big value\n  if (!vw::bounding_box(dem).contains(pixel_loc2))\n    return g_big_val;\n\n  return norm_2(pixel_loc - pixel_loc2);\n}\n\n// A model with the error given by demPixelErr(). The variable will be t,\n// which will give the position along the trajectory. \nclass RayDemPixelLMA : public vw::math::LeastSquaresModelBase<RayDemPixelLMA> {\n\n  SatSimOptions const& m_opt;\n  vw::cartography::GeoReference const& m_dem_georef;\n  vw::ImageViewRef<vw::PixelMask<float>> m_dem;\n  double m_height_guess;\n  vw::Vector3 m_first_proj;\n  vw::Vector3 m_last_proj;\n  vw::Vector3 m_proj_along;\n  vw::Vector3 m_proj_across;\n  double m_delta, m_param_scale_factor;\n  double m_roll, m_pitch, m_yaw;\n  vw::Vector2 m_pixel_loc;\n  mutable vw::Vector3 m_xyz_guess; // used to speed up the solver, not thread-safe\n\npublic:\n  typedef vw::Vector<double, 1> result_type;\n  typedef vw::Vector<double, 1> domain_type;\n  typedef vw::Matrix<double>    jacobian_type; ///< Jacobian form. Auto.\n\n  /// Constructor\n  RayDemPixelLMA(SatSimOptions const& opt,\n                 vw::cartography::GeoReference const& dem_georef,\n                 vw::ImageViewRef<vw::PixelMask<float>> dem,\n                 double height_guess,\n                 vw::Vector3 const& first_proj,\n                 vw::Vector3 const& last_proj,\n                 vw::Vector3 const& proj_along,\n                 vw::Vector3 const& proj_across,\n                 double delta, // a small number to move along track\n                 double param_scale_factor, // to go from optimizer units to t in [0, 1]\n                 double roll, double pitch, double yaw,\n                 vw::Vector2 const& pixel_loc):\n    m_opt(opt), m_dem_georef(dem_georef), m_dem(dem), m_height_guess(height_guess),\n    m_first_proj(first_proj), m_last_proj(last_proj),\n    m_proj_along(proj_along), m_proj_across(proj_across),\n    m_delta(delta), m_param_scale_factor(param_scale_factor),\n    m_roll(roll), m_pitch(pitch), m_yaw(yaw),\n    m_pixel_loc(pixel_loc), m_xyz_guess(vw::Vector3(0, 0, 0)) {}\n\n  // Evaluator operator. The goal is described earlier.\n  inline result_type operator()(domain_type const& len) const {\n\n    // See note where param_scale_factor is defined.\n    double t = len[0] * m_param_scale_factor;\n    double err = demPixelErr(m_opt, m_dem_georef, m_dem, \n                             m_first_proj, m_last_proj,\n                             m_proj_along, m_proj_across,\n                             t, m_delta, m_roll, m_pitch, m_yaw, m_pixel_loc,\n                             m_height_guess,\n                             m_xyz_guess); // will change\n\n    result_type result;\n    result[0] = err;\n    // vw::vw_out() << \"t = \" << t << \", err = \" << err << \"\\n\";\n    return result;\n  }\n};\n\n// Find the location of camera center along the trajectory, in projected\n// coordinates, so that the ray from the camera center to the ground goes\n// closest to given ground point. This assumes roll and yaw of 0, as \n// we move only along the orbit.\nvoid findBestProjCamLocation(SatSimOptions const& opt,\n                             vw::cartography::GeoReference const& dem_georef,\n                             vw::ImageViewRef<vw::PixelMask<float>> dem,\n                             double height_guess, \n                             vw::Vector3 const& first_proj, \n                             vw::Vector3 const& last_proj,\n                             vw::Vector3 const& proj_along, \n                             vw::Vector3 const& proj_across,\n                             double delta, double roll, double pitch, double yaw,\n                             vw::Vector2 const& pixel_loc,\n                             // Outputs\n                             vw::Vector3 & best_proj) {\n\n  // For now this is a limitation of the code.\n  if (!std::isnan(opt.roll) && opt.roll != 0)\n    vw::vw_throw(vw::ArgumentErr() << \"When having both ground and orbital constraints, \"\n                                  << \"the roll must be zero.\\n\");\n  if (!std::isnan(opt.yaw) && opt.yaw != 0)\n    vw::vw_throw(vw::ArgumentErr() << \"When having both ground and orbital constraints, \"\n                                  << \"the yaw must be zero.\\n\");\n    \n  // Note(oalexan1): This algorithm had issues with convergence. Let eps = 1e-7.\n  // This is used in LevenbergMarquardt.h for numerical differentiation. Need to\n  // ensure model(len) and model(len + eps) are sufficiently different. For\n  // that, ensure that len and len + eps correspond to points in orbit separated\n  // by about 1 meter. That is why, we start with t in [0, 1], which\n  // parametrizes the orbital segment between first_proj and last_proj, and\n  // parametrize using value len, with t = len * param_scale_factor. \n  double eps = 1e-7;\n  vw::Vector3 P1 = vw::cartography::projToEcef(dem_georef, first_proj); // t = 0\n  vw::Vector3 P2 = vw::cartography::projToEcef(dem_georef, last_proj);  // t = 1\n  double d = norm_2(P2 - P1);\n  if (d < 1.0)\n    vw::vw_throw(vw::ArgumentErr() \n      << \"Ensure that the input orbit end points are at least 1 m apart.\\n\");\n  double param_scale_factor = 1.0 / (eps * d);\n#if 0\n  // Verification that param_scale_factor is correct\n  {\n    double l1 = 0, l2 = eps;\n    double t1 = param_scale_factor * l1; \n    double t2 = param_scale_factor * l2;\n    P1 = vw::cartography::projToEcef(dem_georef, first_proj * (1.0 - t1) + last_proj * t1);\n    P2 = vw::cartography::projToEcef(dem_georef, first_proj * (1.0 - t2) + last_proj * t2);\n    vw::vw_out() << \"Param scale factor is \" << param_scale_factor << \"\\n\";\n    vw::vw_out() << \"Distance must be 1 meter: \" << norm_2(P1 - P2) << \"\\n\";\n  }\n#endif\n\n  // Find a spacing in t that corresponds to 1 km movement in orbit.\n  // We will use this to find a good initial guess.\n  // This is very fragile code.\n  // TODO(oalexan1): Find a robust way of finding an initial guess. Sometimes this fails.\n  double dt = 1e-3;\n  double t1 = -dt, t2 = dt;\n  P1 = vw::cartography::projToEcef(dem_georef, first_proj * (1.0 - t1) + last_proj * t1);\n  P2 = vw::cartography::projToEcef(dem_georef, first_proj * (1.0 - t2) + last_proj * t2);\n  double slope = norm_2(P2 - P1) / (2*dt);\n  double spacing = 1000.0 / slope;\n#if 0\n  // Verification that spacing is correct\n  vw::vw_out() << \"Spacing is \" << spacing << \"\\n\";\n  {\n    double t1 = 0, t2 = spacing;\n    P1 = vw::cartography::projToEcef(dem_georef, first_proj * (1.0 - t1) + last_proj * t1);\n    P2 = vw::cartography::projToEcef(dem_georef, first_proj * (1.0 - t2) + last_proj * t2);\n    vw::vw_out() << \"Distance must be 100 meters: \" << norm_2(P2 - P1) << \"\\n\";\n  }\n#endif\n\n  // Set up the LMA problem\n  RayDemPixelLMA model(opt, dem_georef, dem, height_guess, first_proj, last_proj,\n                       proj_along, proj_across, delta, param_scale_factor,\n                       roll, pitch, yaw, pixel_loc);\n  vw::Vector<double, 1> best_len; best_len[0] = 0; // initial guess \n\n  // First need to search around for a good initial guess. This is a bug fix.\n  // Number of attempts times spacing in m is 1e+8 m, which is 100,000 km. \n  // Enough for any orbit length.\n  // vw::vw_out() << \"Searching for a good initial guess.\\n\";\n  int attempts = int(1e+8);\n  double best_val = g_big_val;\n  double best_i = 0;\n  for (int i = 0; i < attempts; i++) {\n    \n    // Move towards the positive direction then the negative one\n    double curr_best_val = best_val;\n    for (int j = -1; j <= 1; j += 2) {\n      double t = spacing * i * j;\n      vw::Vector<double, 1> curr_len; \n      curr_len[0] = t / param_scale_factor;\n      double val = model(curr_len)[0];\n      //vw::vw_out() << \"len, val = \" << curr_len[0] << ' ' << val << \"\\n\";\n      if (val < best_val) {\n        best_val = val;\n        best_len = curr_len;\n        best_i = i * j; // take into account the sign\n      }\n    }\n    \n    if (curr_best_val == best_val && curr_best_val < g_big_val) {\n      // We are not improving anymore, so so stop here, as otherwise\n      // we may be going too far.\n      break;\n    }\n\n  } // end doing attempts\n  \n  // Do local refinement. This is necessary as the initial guess may be far from\n  // the minimum and the function may be noisy. Will do i with increments of 1,\n  // then 0.1, etc., around current best_i. Start with increment of 1 to peek\n  // ahead beyond the values where we stopped before, while revisiting some of\n  // the values of i as well. This was tested on a bug, so do not modify here\n  // lightly.\n  attempts = 8;\n  for (int attempt = 0; attempt < attempts; attempt++) {\n    double delta = 1.0 / pow(10.0, attempt);\n    double best_i_init = best_i; // So that loop end points do not change mid-loop\n    for (double i = best_i_init - 50*delta; i <= best_i_init + 50*delta; i += delta) {\n      double t = spacing * i;\n      vw::Vector<double, 1> curr_len; \n      curr_len[0] = t / param_scale_factor;\n      double val = model(curr_len)[0];\n      //vw::vw_out() << \"len, val = \" << curr_len[0] << ' ' << val << \"\\n\";\n      if (val < best_val) {\n        best_val = val;\n        best_len = curr_len;\n        best_i = i;\n      }\n    }\n  }\n  \n  // Run the optimization with the just-found initial guess\n  // vw::vw_out() << \"Running the solver.\\n\";\n  int status = -1;\n  double max_abs_tol = 1e-14;\n  double max_rel_tol = max_abs_tol;\n  int num_max_iter = 100;\n  vw::Vector<double, 1> observation; \n  observation[0] = 0; // because we want to minimize the error\n  best_len = vw::math::levenberg_marquardt(model, best_len, observation, status, \n                                      max_abs_tol, max_rel_tol, num_max_iter);\n  // Note: The status is ignored here. We will just take whatever the solver\n  // outputs, as it may not converge within tolerance. \n  double val = model(best_len)[0];\n \n#if 0\n// Turning this off, as the minimum cost function may be far from zero.\n// May need to add some other check here.\n  if (std::abs(model(best_len)[0]) > 1.0) {\n    vw::vw_out() << \"Abs of model value is \" << std::abs(model(best_len)[0]) << \"\\n\";\n    // vw::vw_throw(vw::ArgumentErr() << \"Error: The solver for finding correct ends of \"\n    //   << \"orbital segment did not converge to a good solution. Check your DEM, \" \n    //   << \"roll, pitch, yaw, and ground path endpoints.\\n\");\n  }\n#endif\n\n  // Compute the best location given the just-found position on the segment\n  double t = best_len[0] * param_scale_factor;\n  best_proj = first_proj * (1.0 - t) + last_proj * t;\n}\n\n// A function to compute orbit length in ECEF given its endpoints in projected\n// coordinates. 1e+5 points are used to approximate the orbit length. Should be\n// enough. This gets slow when using 1e+6 points.\n// TODO(oalexan1): This may not be accurate enough for very long orbit segments.\n// TODO(oalexan1): The number of samples better depend on orbit length.\ndouble calcOrbitLength(vw::Vector3 const& first_proj, vw::Vector3 const& last_proj,\n                       vw::cartography::GeoReference const& dem_georef) {\n\n  int num = 1.0e+5;\n\n  // Start of each segment\n  vw::Vector3 beg = vw::cartography::projToEcef(dem_georef, first_proj);\n  // End of each segment\n  vw::Vector3 end = beg;\n  double orbitLength = 0.0;\n\n  for (int i = 1; i < num; i++) { // note we start at 1\n\n    double t = double(i) / double(num - 1); \n    // Find the projected position of the current point\n    vw::Vector3 curr_proj = first_proj + t * (last_proj - first_proj);\n    // Find the ECEF position of the current point\n    end = vw::cartography::projToEcef(dem_georef, curr_proj);\n\n    // Add the length of the segment\n    orbitLength += norm_2(end - beg);\n    // Move to the next segment\n    beg = end;\n  }\n\n  return orbitLength;\n}\n\n// The camera will be constrained by the ground, but not by the roll/pitch/yaw,\n// then the orientation will change along the trajectory. Then adjust the along\n// and across directions to reflect this. This will adjust the camera direction\n// as well.\nvoid cameraAdjustment(vw::Vector2 const& first_ground_pos,\n                      vw::Vector2 const& last_ground_pos,\n                      double t,\n                      vw::cartography::GeoReference const& dem_georef,\n                      vw::ImageViewRef<vw::PixelMask<float>> dem,\n                      vw::Vector3 const& P, // camera center\n                      // Outputs\n                      vw::Vector3 & along, vw::Vector3 & across) {\n\n  // Create interpolated DEM with bilinear interpolation with invalid pixel \n  // edge extension\n  vw::PixelMask<float> nodata_mask = vw::PixelMask<float>(); // invalid value\n  nodata_mask.invalidate();\n  auto interp_dem = vw::interpolate(dem, vw::BilinearInterpolation(),\n  vw::ValueEdgeExtension<vw::PixelMask<float>>(nodata_mask));\n\n  // The camera will be constrained by the ground, but not by the roll/pitch/yaw,\n  // then the orientation will change along the trajectory.\n  vw::Vector2 ground_pix = first_ground_pos * (1.0 - t) + last_ground_pos * t;\n\n  // Find the projected position along the ground path\n  vw::Vector3 ground_proj_pos;\n  subvector(ground_proj_pos, 0, 2) = dem_georef.pixel_to_point(ground_pix); // x and y\n\n  auto val = interp_dem(ground_pix[0], ground_pix[1]);\n  if (!is_valid(val))\n    vw::vw_throw(vw::ArgumentErr() \n      << \"Could not interpolate into the DEM along the ground path.\\n\");\n  ground_proj_pos[2] = val.child(); // z\n\n  // Convert the ground point to ECEF\n  vw::Vector3 G = vw::cartography::projToEcef(dem_georef, ground_proj_pos);\n\n  // Find the ground direction\n  vw::Vector3 ground_dir = G - P;\n  if (norm_2(ground_dir) < 1e-6)\n    vw::vw_throw(vw::ArgumentErr()\n      << \"The ground position is too close to the camera.\\n\");\n\n  // Normalize      \n  along = along / norm_2(along);\n  ground_dir = ground_dir / norm_2(ground_dir);\n\n  // Adjust the along-track direction to make it perpendicular to ground dir\n  along = along - dot_prod(ground_dir, along) * ground_dir;\n\n  // Find 'across' as y direction, given that 'along' is x, and 'ground_dir' is z\n  across = -vw::math::cross_prod(along, ground_dir);\n\n  // Make these vectors have norm 1, and make across perpendicular to along\n  // Should already be that way by now, but do it just in case\n  asp::normalizeOrthogonalizeAlongAcross(along, across);\n}\n\n// Adjust the orbit end point and set the number of cameras given the frame rate\n// This is a bit tricky because need to sample finely the orbit\nvoid adjustForFrameRate(SatSimOptions                  const& opt,\n                        vw::cartography::GeoReference const& dem_georef,\n                        vw::Vector3                   const& first_proj,\n                        // Outputs\n                        vw::Vector3                        & last_proj, // in/out\n                        int                                & num_cameras) {\n\n  // Initialize the outputs, this value will change\n  num_cameras = 0;\n  \n  // Orbit length in meters. Throw an error if getting an orbit of length 0,\n  // as that suggests there was a failure in finding in orbit end points.\n  double orbit_len = calcOrbitLength(first_proj, last_proj, dem_georef);\n  if (orbit_len <= 0.0)\n    vw::vw_throw(vw::ArgumentErr() << \"Failure in computing orbit end points.\\n\");\n  double period = opt.velocity / opt.frame_rate;\n\n  // It is important to let the user know this\n  vw::vw_out() << std::setprecision(17) \n      << \"Distance between successive cameras = velocity / frame_rate = \"\n      << period << \" meters.\\n\";\n\n  // Number of cameras. Add 1 because we need to include the last camera.\n  num_cameras = int(orbit_len / period) + 1;\n\n  // Cannot have one camera sample for linescan regardless of what the user wants\n  bool is_linescan = (opt.sensor_type.find(\"linescan\") != std::string::npos);\n  \n  // Sanity checks. It is fine to have one single camera, but that is not usual.\n  if (num_cameras < 1)\n    vw::vw_throw(vw::ArgumentErr() << \"The number of cameras must be at least 1.\\n\");\n  if (num_cameras == 1) {\n    if (is_linescan) {\n      vw::vw_out(vw::WarningMessage) << \"For linescan cameras, must have at least \"\n      \"two camera samples. Adding a second one.\\n\";\n      num_cameras = 2;\n    } else {\n      vw::vw_out(vw::WarningMessage) << \"Creating only one frame camera sample.\\n\";\n    }\n  }\n\n  // Update the orbit length. Handle gracefully the case of one camera.\n  orbit_len = period * std::max(num_cameras - 1.0, 1.0);\n  \n  // Sanity check, important for the work below. It is fine for first and last \n  // proj to be in the same location, but that is not usual.\n  if (norm_2(last_proj - first_proj) < 1e-6)\n    vw::vw_out(vw::WarningMessage) << \"Warning: The first and last camera positions are \"\n      <<\"too close. Check your inputs.\\n\";\n\n  // Travel along the orbit in very small increments. Return the last point\n  // before exceeding the orbit length. \n  int num = 1000000; // one million samples along the orbit should be enough\n  // TODO(oalexan1): Something more clever and faster should be done.\n  vw::Vector3 beg = vw::cartography::projToEcef(dem_georef, first_proj);\n  vw::Vector3 end = beg;\n  vw::Vector3 out_proj = first_proj; // will keep the result here\n  double curr_len = 0.0;\n  int i = 1;\n  while (1) {\n\n    // Find the projected position of the current point\n    double t = double(i) / double(num - 1); \n    vw::Vector3 curr_proj = first_proj + t * (last_proj - first_proj);\n\n    // Find the ECEF position of the current point and distance from previous\n    end = vw::cartography::projToEcef(dem_georef, curr_proj);\n    double curr_dist = norm_2(end - beg);\n\n    if (curr_len + curr_dist > orbit_len)\n      break; // done, exceeded orbit length, will keep the previous point in out_proj\n    \n    curr_len += curr_dist;\n    beg = end;\n    i++;\n    out_proj = curr_proj;\n\n    // Sanity check\n    if (i >= 100 * num) {\n      vw::vw_out() << \"Warning: Could not find the last camera along the orbit. Perhaps the frame rate is too low.\\n\";\n      break;\n    }\n\n  }\n\n  // Update the last orbit point, in projected coords. Handle gracefully\n  // the case of one camera.\n  if (norm_2(last_proj - first_proj) > 1e-6)\n    last_proj = out_proj;\n}\n\n// Given the direction going from first_proj to last_proj, and knowing\n// that we are at curr_proj, find if we are before or after ref_proj.\n// Return 1 if after, -1 if before, 0 if at that point. \ndouble findDirectionAlongOrbit(vw::Vector3 const& ref_proj,\n                                vw::Vector3 const& first_proj,\n                                vw::Vector3 const& last_proj,\n                                vw::Vector3 const& curr_proj) {\n  double sign = 0.0;\n  vw::Vector3 dir1 = last_proj - first_proj;\n  double len1 = norm_2(dir1);\n  if (len1 != 0)\n    dir1 = dir1 / len1;\n\n  // Handle the case when we are at ref_proj\n  vw::Vector3 dir2 = curr_proj - ref_proj;\n  double len2 = norm_2(dir2);\n  if (len2 == 0)\n    return 0;\n\n   dir2 = dir2 / len2;\n   if (norm_2(dir1 - dir2) <= norm_2(dir1 + dir2))\n     sign = 1.0; // curr_proj is after ref_proj\n   else  \n    sign = -1.0; // curr_proj is before ref_proj\n\n  return sign;\n}\n\n// Given the direction in orbit from first_proj to last_proj (these determine\n// the orbit geometry), find the signed distance along the orbit (in ECEF) from\n// ref_proj to curr_proj.\ndouble signedOrbitDistance(vw::Vector3 const& curr_proj,\n                           vw::Vector3 const& ref_proj,\n                           vw::Vector3 const& first_proj,\n                           vw::Vector3 const& last_proj,\n                           vw::cartography::GeoReference const& dem_georef) {\n  double dist = calcOrbitLength(ref_proj, curr_proj, dem_georef);\n  double sign = findDirectionAlongOrbit(ref_proj, first_proj, last_proj, curr_proj);\n  return sign * dist;\n}\n\n// Calc the jitter amplitude at a given location along the orbit. We will\n// accumulate over all frequencies. The signed distance is from the reference\n// orbit point. Use a different amplitude and phase shift for roll, pitch, and\n// yaw. But all these share the same set of frequencies.\nvw::Vector3 calcJitterAmplitude(SatSimOptions const& opt,\n                                vw::Vector3   const& curr_proj, // curr proj camera pos\n                                double signed_dist) { // distance from ref_proj\n\n  // Seed the random number generator. This will be reproducible each time the\n  // program is run, but will be different for each set of input cameras.\n  if (opt.random_pose_perturbation)\n    srand(vw::math::norm_2(curr_proj));\n  \n  double height_above_datum = curr_proj[2]; // curr satellite height\n  vw::Vector3 amp(0, 0, 0);\n\n  for (size_t freq_iter = 0; freq_iter < opt.jitter_frequency.size(); freq_iter++) {\n    double f = opt.jitter_frequency[freq_iter];\n    double v = opt.velocity;\n    double T = v / f; // period in meters\n    \n    // Iterate over roll, pitch, and yaw\n    for (int c = 0; c < 3; c++) {\n      int index = 3 * freq_iter + c;\n      double a = 0.0;\n      // We have either horizontal uncertainty or jitter amplitude.\n      if (!opt.horizontal_uncertainty.empty()) {\n        // jitter amplitude as angular uncertainty given ground uncertainty\n        a = atan(opt.horizontal_uncertainty[c] / height_above_datum);\n        // Covert to degrees\n        a = a * 180.0 / M_PI;\n      } else {\n        // Amplitude in micro radians\n        a = opt.jitter_amplitude[index];\n        // Convert to radians\n        a = a * 1e-6;\n        // Convert to degrees\n        a = a * 180.0 / M_PI;\n      }\n      \n      // Compute the jitter, in degrees. Add the phase. For a random perturbation\n      // make it between -a and a.\n      if (!opt.random_pose_perturbation)\n        amp[c] += a * sin(signed_dist * 2.0 * M_PI / T + opt.jitter_phase[index]);\n      else \n        amp[c] += a * (2 * double(rand())/double(RAND_MAX) - 1.0);\n    }\n\n  } // End loop through frequencies\n\n  return amp;\n}\n\n// Parse --rig-sensor-ground-offsets. \nvoid parseSensorGroundOffsets(std::string const& offsets_str,\n                              int num_sensors,\n                              std::vector<double> & offsets) {\n \n std::string sep = \", \\t\\n\"; // separators: comma, space, tab, newline\n offsets = vw::str_to_std_vec(offsets_str, sep);\n \n // If empty, set to 0.\n if (offsets.empty())\n   offsets.resize(4 * num_sensors, 0.0);\n\n // Must have 4 offsets (2 sensor and 2 ground) per sensor\n if (offsets.size() != 4 * num_sensors)\n   vw::vw_throw(vw::ArgumentErr() << \"Expecting \" << 4 * num_sensors \n     << \" offsets, got \" << offsets.size() << \".\\n\"); \n}\n\n// Parse --rig-sensor-rotation-angles.\nvoid parseSensorRotationAngles(std::string const& angles_str,\n                               int num_sensors,\n                               std::vector<double> & angles) {\n \n  std::string sep = \", \\t\\n\"; // separators: comma, space, tab, newline\n  angles = vw::str_to_std_vec(angles_str, sep);\n\n  // If empty, set to 0.\n  if (angles.empty())\n    angles.resize(num_sensors, 0.0);\n       \n  // Must have 1 angle per sensor\n  if (angles.size() != num_sensors)\n    vw::vw_throw(vw::ArgumentErr() << \"Expecting \" << num_sensors \n      << \" angles, got \" << angles.size() << \".\\n\");\n}\n\n// Change the rig to have desired offsets in the sensor plane and ground plane.\n// These will determine the orientations. The offsets are in meters.\nvoid adjustRigForOffsets(SatSimOptions const& opt,\n                         vw::cartography::GeoReference const& dem_georef,\n                         vw::ImageViewRef<vw::PixelMask<float>> dem,\n                         double height_guess,\n                         vw::Vector3 const& ref_proj,\n                         vw::Vector3 const& proj_along,\n                         vw::Vector3 const& proj_across,\n                         double delta,\n                         rig::RigSet & rig) {\n\n  int num_rig_sensors = rig.cam_names.size();\n  std::vector<double> offsets, angles;\n  parseSensorGroundOffsets(opt.rig_sensor_ground_offsets, num_rig_sensors,\n                           offsets); // output\n  parseSensorRotationAngles(opt.rig_sensor_rotation_angles, num_rig_sensors,\n                            angles); // output\n\n  // Find the transform from the sensor to the ground at nadir, and the ground point\n  vw::Matrix3x3 cam2world;\n  vw::Vector3 cam_ctr;\n  double roll = 0, pitch = 0, yaw = 0;\n  vw::Vector3 xyz = vw::Vector3(0, 0, 0), xyz_guess = vw::Vector3(0, 0, 0);\n  bool success = calcCamPoseAndGroundPt(opt, ref_proj, dem_georef, dem, delta,\n                                        proj_along, proj_across, roll, pitch, yaw,\n                                        height_guess, cam2world, cam_ctr, xyz, xyz_guess);\n  if (!success)\n   vw::vw_throw(vw::ArgumentErr() << \"Could not compute the ground point at nadir.\\n\");     \n  \n  // Convert the ground point to camera coordinates\n  xyz = inverse(cam2world) * (xyz - cam_ctr);\n  \n  // Iterate over sensors. For each sensor compute desired sensor center\n  // and orientation\n  for (int s = 0; s < num_rig_sensors; s++) {\n    int offset_index = 4 * s;\n    double sensor_offset_x = offsets[offset_index + 0];\n    double sensor_offset_y = offsets[offset_index + 1];\n    double ground_offset_x = offsets[offset_index + 2];\n    double ground_offset_y = offsets[offset_index + 3];\n    \n    vw::Vector3 sensor_ctr = vw::Vector3(sensor_offset_x, sensor_offset_y, 0);\n    vw::Vector3 ground_pt =  xyz + vw::Vector3(ground_offset_x, ground_offset_y, 0);\n\n    // Must offset the ground point relative to the sensor center\n    // to have it in sensor coordinates.\n    ground_pt = ground_pt - sensor_ctr;\n    \n    // Need a rotation for the sensor to reflect the direction from sensor to ground\n    vw::Vector3 z = normalize(ground_pt);\n    \n    // This is a minor bugfix. For the sensor that has the trivial orientation,\n    // eliminate the numerical noise in the z axis. This way, the results with\n    // no rig and with a trivial rig are the same.\n    if (sensor_offset_x == 0 && sensor_offset_y == 0 && \n        ground_offset_x == 0 && ground_offset_y == 0 ||\n        norm_2(z - vw::Vector3(0, 0, 1.0)) < 1e-10) \n      z = vw::Vector3(0, 0, 1.0);\n    \n    // Adjust x to be perpendicular to z\n    vw::Vector3 x(1, 0, 0);\n    x = x - dot_prod(x, z) * z;\n    x = normalize(x);\n    // y must be perpendicular to x and z\n    vw::Vector3 y = cross_prod(z, x);\n    \n    // Compute the rotation due to offsets\n    Eigen::Matrix<double, 4, 4> offset_mat = Eigen::Matrix<double, 4, 4>::Identity();\n    for (int r = 0; r < 3; r++) {\n      offset_mat(r, 0) = x[r];\n      offset_mat(r, 1) = y[r];\n      offset_mat(r, 2) = z[r];  \n      offset_mat(r, 3) = sensor_ctr[r];\n    }\n\n    // Compute the rotation due to angles\n    Eigen::Matrix<double, 4, 4> rot_mat = Eigen::Matrix<double, 4, 4>::Identity();\n    if (!angles.empty()) {\n      double th = angles[s];\n      // Convert to radians\n      th = th * M_PI / 180.0;\n      // Create a rotation by th around the z axis\n      Eigen::Matrix3d R;\n      R(0, 0) = cos(th); R(0, 1) = -sin(th); R(0, 2) = 0;\n      R(1, 0) = sin(th); R(1, 1) = cos(th);  R(1, 2) = 0;\n      R(2, 0) = 0;       R(2, 1) = 0;        R(2, 2) = 1;\n      rot_mat.block<3, 3>(0, 0) = R;\n    }\n    \n    // Update the rig. Rotations get applied first.\n    rig.ref_to_cam_trans[s].matrix() = offset_mat * rot_mat;\n  }\n  \n}\n\n// A function that will take as input the endpoints and will compute the\n// positions and orientations in ECEF. The key observation is that the positions\n// will form a straight edge in projected coordinates. In some usage modes we\n// will adjust the end points of the produced path. The rig may get adjusted\n// if --rig-sensor-ground-offsets is set.\nvoid genCamPoses(SatSimOptions & opt,\n                 vw::cartography::GeoReference const& dem_georef,\n                 vw::ImageViewRef<vw::PixelMask<float>> dem,\n                 double height_guess,\n                 bool have_rig,\n                 // Outputs\n                 int                        & first_pos,\n                 double                     & first_line_time,\n                 double                     & orbit_len,\n                 std::vector<vw::Vector3>   & positions,\n                 std::vector<vw::Matrix3x3> & cam2world,\n                 std::vector<vw::Matrix3x3> & cam2world_no_jitter,\n                 std::vector<vw::Matrix3x3> & ref_cam2world,\n                 std::vector<double>        & cam_times,\n                 rig::RigSet                & rig) {\n\n\n  // Initialize the outputs. They may change later.\n  first_pos = 0;\n  orbit_len = 0.0;\n  first_line_time = 0.0;\n  positions.clear();\n  cam2world.clear();\n  cam2world_no_jitter.clear();\n  ref_cam2world.clear();\n  cam_times.clear();\n\n  // Convert the first and last camera center positions to projected coordinates\n  vw::Vector3 first_proj, last_proj;\n  subvector(first_proj, 0, 2) = dem_georef.pixel_to_point\n      (vw::math::subvector(opt.first, 0, 2)); // x and y\n  first_proj[2] = opt.first[2]; // z\n  subvector(last_proj, 0, 2) = dem_georef.pixel_to_point\n      (vw::math::subvector(opt.last,  0, 2)); // x and y\n  last_proj[2] = opt.last[2]; // z\n\n  // Direction along the edge in proj coords (along track direction),\n  // and then the across track direction\n  vw::Vector3 proj_along, proj_across;\n  asp::calcProjAlongAcross(first_proj, last_proj, proj_along, proj_across);\n  \n  // A small number to help convert directions from being in projected space to\n  // ECEF (the transform between these is nonlinear). Do not use a small value,\n  // as in ECEF these will be large numbers and we may have precision issues.\n  // The value 0.01 was tested well.\n  double delta = asp::satSimDelta(); // in meters\n\n  bool have_ground_pos = !std::isnan(norm_2(opt.first_ground_pos)) &&  \n      !std::isnan(norm_2(opt.last_ground_pos));\n  bool have_roll_pitch_yaw = !std::isnan(opt.roll) && !std::isnan(opt.pitch) &&\n      !std::isnan(opt.yaw);\n\n  // Projected orbital location when looking straight down at the first ground point.\n  // This is the reference location for measuring time and jitter from.\n  vw::Vector3 ref_proj = first_proj; // will change\n  if (have_ground_pos)\n    findBestProjCamLocation(opt, dem_georef, dem, height_guess, first_proj, last_proj,\n                            proj_along, proj_across, delta, \n                            0, 0, 0, // roll, pitch, yaw\n                            opt.first_ground_pos, \n                            ref_proj); // output\n\n  // Adjust the rig given --rig-sensor-ground-offsets\n  if (have_rig && \n      (!opt.rig_sensor_ground_offsets.empty() || !opt.rig_sensor_rotation_angles.empty()))\n    adjustRigForOffsets(opt, dem_georef, dem, height_guess, ref_proj,\n                        proj_along, proj_across, delta, \n                        rig);\n\n  if (have_ground_pos && have_roll_pitch_yaw) {\n    // Find best starting and ending points for the orbit given desired\n    // ground locations and roll/pitch/yaw angles.\n    // Print a message as this step can take a while\n    vw::vw_out() << \"Estimating orbital segment endpoints given ground constraints.\\n\";\n    vw::Vector3 first_best_cam_loc_proj;\n    vw::Stopwatch sw1;\n    sw1.start();\n    findBestProjCamLocation(opt, dem_georef, dem, height_guess, first_proj, last_proj,\n                            proj_along, proj_across, delta, \n                            opt.roll, opt.pitch, opt.yaw,\n                            opt.first_ground_pos, first_best_cam_loc_proj);\n    sw1.stop();\n    vw::vw_out() << \"Elapsed time for starting endpoint: \" \n                 << sw1.elapsed_seconds() << \" s.\\n\";\n                           \n    // Same thing for the last camera\n    vw::Stopwatch sw2;\n    sw2.start();\n    vw::Vector3 last_best_cam_loc_proj;\n    findBestProjCamLocation(opt, dem_georef, dem, height_guess, first_proj, last_proj,\n                            proj_along, proj_across, delta, \n                            opt.roll, opt.pitch, opt.yaw,\n                            opt.last_ground_pos, last_best_cam_loc_proj);\n    sw2.stop();\n    vw::vw_out() << \"Elapsed time for ending endpoint: \" \n                 << sw2.elapsed_seconds() << \" s.\\n\";\n                           \n    // Overwrite the first and last camera locations in projected coordinates\n    // with the best ones\n    first_proj = first_best_cam_loc_proj;\n    last_proj  = last_best_cam_loc_proj;\n  }                  \n\n  if (!std::isnan(opt.frame_rate)) {\n    // Adjust the orbit end point and set the number of cameras given the frame rate\n    adjustForFrameRate(opt, dem_georef, first_proj, \n                      // outputs\n                      last_proj, opt.num_cameras);                      \n  }\n\n  orbit_len = calcOrbitLength(first_proj, last_proj, dem_georef);\n\n  // Good to print these\n  vw::vw_out() << \"Orbit length between the first and last inclination-adjusted cameras: \" \n     << orbit_len << \" meters.\\n\"; \n  vw::vw_out() << \"Number of camera samples: \" << opt.num_cameras << \".\" << \"\\n\";\n\n  // We did a sanity check to ensure that when opt.jitter_frequency is set,\n  // opt.velocity and and opt.horizontal_uncertainty are also set and not NaN.\n  bool model_jitter = (!std::isnan(opt.jitter_frequency[0]));\n\n  // Find the trajectory, as well as points in the along track and across track \n  // directions in the projected space\n  vw::vw_out() << \"Computing the camera poses.\\n\"; \n\n  // For linescan cameras we want to go beyond the positions and orientations\n  // needed for the first and last image line, to have room for interpolation\n  // and jitter. For Pinhole cameras we do not need this.\n  first_pos = 0;\n  int last_pos = opt.num_cameras; // stop before last\n  if (opt.sensor_type == \"linescan\") {\n    // Double the number of cameras, half of extra ones going beyond image lines\n    if (opt.num_cameras < 2)\n      vw::vw_throw(vw::ArgumentErr() << \"For linescan cameras, must have at least \"\n        \"two camera samples.\\n\");\n    first_pos = -opt.num_cameras/2;\n    last_pos  = 2 * opt.num_cameras + first_pos;\n  }\n\n  int total = last_pos - first_pos;\n  positions.resize(total);\n  cam2world.resize(total);\n  cam2world_no_jitter.resize(total);\n  ref_cam2world.resize(total);\n  cam_times.resize(total, 0.0);\n\n  // Print progress\n  vw::TerminalProgressCallback tpc(\"asp\", \"\\t--> \");\n  double inc_amount = 1.0 / double(total);\n  tpc.report_progress(0);\n\n  // The signed distance from ref_proj to first_proj. Later will add to it the\n  // distance from first_proj to the current point. This allows measuring\n  // distance and time from ref_proj. Based on this, set the first line time.\n  double ref_to_first_signed_dist \n    = signedOrbitDistance(first_proj, ref_proj, first_proj, last_proj, dem_georef);\n  if (opt.model_time)\n    first_line_time = opt.ref_time + ref_to_first_signed_dist / opt.velocity;\n  \n  for (int i = 0; i < total; i++) {\n\n    // Parametrize the orbital segment    \n    double t = double(i + first_pos) / std::max(double(opt.num_cameras - 1.0), 1.0);\n\n    // Current satellite postion in projected coordinates\n    vw::Vector3 curr_proj = first_proj * (1.0 - t) + last_proj * t;\n\n    // Signed distance from ref_proj to curr_proj. \n    double signed_dist = ref_to_first_signed_dist + t * orbit_len;\n    \n    // Record the time at which the camera is at this position. Must\n    // be kept consistent with logic in genLinearCameras().\n    cam_times[i] = first_line_time + t * orbit_len / opt.velocity;\n    \n    // Time better be positive, otherwise it may be tricky to interpret the timestamp\n    // with a dash in front.\n    if (opt.model_time) {\n      if (cam_times[i] <= 0)\n       vw::vw_throw(vw::ArgumentErr() << \"Time must be positive. Check --reference-time.\\n\");\n      if (cam_times[i] >= 1e+6)\n       vw::vw_throw(vw::ArgumentErr() << \"Time must be less than 1e+6. Check \"\n                    << \"--reference-time.\\n\");\n    }\n      \n    // Calc position along the trajectory and normalized along and across vectors\n    // in ECEF. Produced along and across vectors are normalized and perpendicular\n    // to each other.\n    vw::Vector3 P, along, across;\n    calcEcefTrajPtAlongAcross(curr_proj, dem_georef, delta,\n                              proj_along, proj_across, \n                              // Outputs, in ECEF\n                              P, along, across);\n\n    // Adjust the camera if constrained by the ground but not by roll/pitch/yaw\n    if (have_ground_pos && !have_roll_pitch_yaw)\n      cameraAdjustment(opt.first_ground_pos, opt.last_ground_pos, t, dem_georef, dem, P, \n                       // outputs, will be normalized and perpendicular to each other\n                       along, across);\n    \n    // Find the z vector as perpendicular to both along and across\n    vw::Vector3 down = vw::math::cross_prod(along, across);\n    down = down / norm_2(down);\n\n    // Camera position in ECEF\n    positions[i] = P;\n    \n    // The camera to world rotation has these vectors as the columns.\n    // For now the camera is pointing down.\n    asp::assembleCam2WorldMatrix(along, across, down, cam2world[i]);\n\n    // Save this before applying adjustments as below. These two \n    // have some important differences, as can be seen below.\n    ref_cam2world[i] = cam2world[i];\n    cam2world_no_jitter[i] = cam2world[i];\n\n    vw::Vector3 jitter_amp(0, 0, 0);\n    if (model_jitter)\n      jitter_amp = calcJitterAmplitude(opt, curr_proj, signed_dist);\n    \n    // If to apply a roll, pitch, yaw rotation\n    if (have_roll_pitch_yaw) {\n      vw::Matrix3x3 R = asp::rollPitchYaw(opt.roll  + jitter_amp[0], \n                                          opt.pitch + jitter_amp[1], \n                                          opt.yaw   + jitter_amp[2]);\n      cam2world[i] = cam2world[i] * R;\n    }\n    \n    // The rotation without jitter\n    vw::Matrix3x3 R0 = vw::math::identity_matrix<3>();\n    if (have_roll_pitch_yaw)\n      R0 = asp::rollPitchYaw(opt.roll, opt.pitch, opt.yaw);\n    cam2world_no_jitter[i] = cam2world_no_jitter[i] * R0;\n\n    // In either case apply the in-plane rotation from camera to satellite frame\n    cam2world[i] = cam2world[i] * asp::rotationXY();\n    cam2world_no_jitter[i] = cam2world_no_jitter[i] * asp::rotationXY();\n\n    tpc.report_incremental_progress(inc_amount);\n  }\n  tpc.report_finished();\n\n  return;\n}\n\n// Generate a prefix for produced image and camera names.\nstd::string camPrefix(SatSimOptions const& opt, int iFrame, double timestamp, bool isRef,\n                      bool isFrame, std::string const& suffix) {\n\n  std::string ref = \"\"; \n  if (isRef) \n    ref = \"-ref\";\n  \n  // Prepare the timestamp string. If modeling time, will do sprintf with 7\n  // digits before dot and 9 after (with the dot, there will be 17 characters in\n  // total). This is to ensure that the time is unique. Use fixed precision. Use\n  // leading zeros to ensure that the string is always the same length and will\n  // be sorted correctly.\n  char time[256];\n  if (!isFrame) {\n    time[0] = '\\0'; // empty string\n  } else {\n    if (!opt.model_time) \n      snprintf(time, sizeof(time), \"-%d\", 10000 + iFrame); // 5 characters, starts with 1\n    else\n      snprintf(time, sizeof(time), \"-%017.9f\", timestamp); // 17 characters, 9 after dot\n  }\n  \n  return opt.out_prefix + time + suffix + ref;\n}\n\n// A function to read Pinhole cameras from disk\nvoid readPinholeCameras(SatSimOptions const& opt, \n                        std::vector<std::string> & cam_names,\n                        std::vector<vw::CamPtr> & cams) {\n\n  // Read the camera names\n  vw::vw_out() << \"Reading: \" << opt.camera_list << \"\\n\";\n  asp::read_list(opt.camera_list, cam_names);\n\n  // Sanity check\n  if (cam_names.empty())\n    vw::vw_throw(vw::ArgumentErr() << \"No cameras were found.\\n\");\n\n  cams.resize(cam_names.size());\n  for (int i = 0; i < int(cam_names.size()); i++)\n    cams[i] = vw::CamPtr(new vw::camera::PinholeModel(cam_names[i])); // managed pointer\n\n  return;\n}\n\n// A function to perturb the cameras. A lot of logic is in asp::genCamPoses().\nvoid perturbCameras(SatSimOptions const& opt, \n                    std::string const& suffix,\n                    vw::cartography::GeoReference const& georef,\n                    std::vector<std::string> const& cam_names,\n                    std::vector<vw::CamPtr> & cams) {\n\n  // Must have as many cam names as cameras\n  if (cam_names.size() != cams.size())\n    vw::vw_throw(vw::ArgumentErr() << \"Expecting as many camera names as cameras.\\n\");\n  \n  std::vector<std::string> out_cam_names(cam_names.size());\n  \n  // Previous and current projected camera centers\n  vw::Vector3 prev_proj_ctr(0, 0, 0), curr_proj_ctr(0, 0, 0);\n  \n  // Length along orbit from first to current camera\n  double orbitLen = 0.0;\n  \n  for (int i = 0; i < int(cam_names.size()); i++) {\n    \n    // Camera must be pinhole\n    vw::camera::PinholeModel * pin \n      = dynamic_cast<vw::camera::PinholeModel*>(cams[i].get());\n    if (pin == NULL)\n      vw::vw_throw(vw::ArgumentErr() << \"Expecting a Pinhole camera for: \" \n                   << cam_names[i] << \"\\n\");\n\n    vw::Vector3 cam_ctr = pin->camera_center(vw::Vector2());\n    vw::Matrix<double,3,3> cam2world = pin->get_rotation_matrix();\n    \n    vw::Vector3 llh = georef.datum().cartesian_to_geodetic(cam_ctr);\n\n    // It is assume that the satellite points nadir. The camera is attached\n    // to the satellite body at potentially an angle.\n    vw::Matrix3x3 sat2world = georef.datum().lonlat_to_ned_matrix(llh);\n    vw::Matrix3x3 cam2sat = inverse(sat2world) * cam2world;\n    \n    // The camera center in projected coordinates\n    subvector(curr_proj_ctr, 0, 2) = georef.lonlat_to_point(subvector(llh, 0, 2)); \n    curr_proj_ctr[2] = llh[2];\n    \n    // The orbit length from the first to the current camera\n    if (i > 0)\n      orbitLen += calcOrbitLength(prev_proj_ctr, curr_proj_ctr, georef);\n    \n    // Jitter amplitude at the current location\n    vw::Vector3 jitter_amp(0, 0, 0);\n    if (std::isnan(opt.random_position_perturbation))\n      jitter_amp = calcJitterAmplitude(opt, curr_proj_ctr, orbitLen);\n\n    // The jitter vibration is applied to the camera in the satellite frame\n    vw::Matrix3x3 R_rpy = asp::rollPitchYaw(jitter_amp[0], jitter_amp[1], jitter_amp[2]);\n    cam2world = sat2world * R_rpy * cam2sat;\n    \n    // Replace the camera rotation\n    pin->set_camera_pose(cam2world);\n    \n    if (!std::isnan(opt.random_position_perturbation)) {\n      // Seed the random number generator to ensure being in a different location\n      // in orbit results in a different perturbation for same camera index.\n      srand(vw::math::norm_2(curr_proj_ctr));\n      vw::Vector3 perturbation;\n      for (int c = 0; c < 3; c++)\n        perturbation[c] = (2 * double(rand())/double(RAND_MAX) - 1.0) \n                          * opt.random_position_perturbation;\n      \n      pin->set_camera_center(cam_ctr + perturbation);\n    }\n    \n    // Will save the camera with the output prefix\n    std::string camName = opt.out_prefix + \"-\" + fs::path(cam_names[i]).filename().string();\n    \n    if (!opt.save_as_csm) {\n      // Save the camera as pinhole\n      vw::vw_out() << \"Writing: \" << camName << \"\\n\";\n      pin->write(camName);\n    } else {\n      // Save as CSM\n      cams[i] = boost::make_shared<asp::CsmModel>();\n      auto const& d = georef.datum(); // alias\n      auto csmPtr = boost::dynamic_pointer_cast<asp::CsmModel>(cams[i]);\n      csmPtr->createFrameModel(*pin,\n                               opt.image_size[0], opt.image_size[1],\n                               d.semi_major_axis(), d.semi_minor_axis());\n      \n      // Replace extension with .json\n      camName = fs::path(camName).replace_extension(\".json\").string();\n      vw::vw_out() << \"Writing: \" << camName << \"\\n\";\n      csmPtr->saveState(camName);\n    }\n \n    out_cam_names[i] = camName;\n    \n    // The current camera becomes the previous one for next time\n    prev_proj_ctr = curr_proj_ctr;\n  }\n\n  // Write the list\n  std::string cam_list = opt.out_prefix + \"-cameras\" + suffix + \".txt\"; \n  vw::vw_out() << \"Writing: \" << cam_list << \"\\n\";\n  asp::write_list(cam_list, out_cam_names);\n\n  return;\n}\n\n// Check if we do a range\nbool skipCamera(int i, SatSimOptions const& opt) {\n\n  if (opt.first_index >= 0 && opt.last_index >= 0 &&\n     (i < opt.first_index || i >= opt.last_index))\n       return true;\n  return false;\n}\n\n// Given a transform from ref sensor to world, the ref sensor to current sensor,\n// create the transform from current sensor to world. Do it in-place. \nvoid applyRigTransform(Eigen::Affine3d const & ref_to_sensor,\n                       vw::Vector3 & ctr, vw::Matrix3x3 & cam2world) {\n\n  // Create 4x4 transform matrix\n  Eigen::Matrix<double, 4, 4> cam2world4x4 = Eigen::Matrix<double, 4, 4>::Identity();\n  for (int r = 0; r < 3; r++) {\n    for (int c = 0; c < 3; c++) {\n      cam2world4x4(r, c) = cam2world(r, c);\n    }\n  }\n  for (int r = 0; r < 3; r++) \n    cam2world4x4(r, 3) = ctr[r];\n\n  // Apply the rig transform \n  cam2world4x4 = cam2world4x4 * ref_to_sensor.matrix().inverse(); \n  \n  // Extract the rotation and translation\n  for (int r = 0; r < 3; r++) {\n    for (int c = 0; c < 3; c++) {\n      cam2world(r, c) = cam2world4x4(r, c);\n    }\n    ctr[r] = cam2world4x4(r, 3);\n  }\n  \n}\n\n// A function to create and save Pinhole cameras. Assume no distortion, and pixel\n// pitch = 1.\nvoid genPinholeCameras(SatSimOptions          const& opt,\n                vw::cartography::GeoReference const& dem_georef,\n                std::vector<vw::Vector3>      const& positions,\n                std::vector<vw::Matrix3x3>    const& cam2world,\n                std::vector<vw::Matrix3x3>    const& ref_cam2world,\n                std::vector<double>           const& cam_times,\n                bool                                 have_rig,\n                Eigen::Affine3d               const& ref2sensor,\n                std::string                   const& suffix, \n                // Outputs\n                std::vector<std::string> & cam_names,\n                std::vector<vw::CamPtr>  & cams) {\n\n  // Ensure we have as many camera positions as we have camera orientations\n  if (positions.size() != cam2world.size() || positions.size() != ref_cam2world.size()\n      || positions.size() != cam_times.size())\n    vw::vw_throw(vw::ArgumentErr() \n                 << \"Expecting as many camera positions as camera orientations.\\n\");\n  \n  cams.resize(positions.size());\n  cam_names.resize(positions.size());\n  for (int i = 0; i < int(positions.size()); i++) {\n\n    vw::Vector3 P    = positions[i];\n    vw::Matrix3x3 R  = cam2world[i];\n    vw::Vector3 P0   = positions[i];\n    vw::Matrix3x3 R0 = ref_cam2world[i];\n\n    if (have_rig) {\n      // Must adjust for the rig\n      applyRigTransform(ref2sensor, P, R);\n      applyRigTransform(ref2sensor, P0, R0);\n    }\n    \n    // Always create the cameras, but only save them if we are not skipping\n    vw::cartography::Datum d = dem_georef.datum();\n    if (opt.save_as_csm) {\n      cams[i] = boost::make_shared<asp::CsmModel>();\n      auto csmPtr = boost::dynamic_pointer_cast<asp::CsmModel>(cams[i]);\n      csmPtr->createFrameModel(opt.image_size[0], opt.image_size[1],\n                              opt.optical_center[0], opt.optical_center[1],\n                              opt.focal_length, \n                              d.semi_major_axis(), d.semi_minor_axis(),\n                              P, R);\n    } else {\n      cams[i] = boost::make_shared<vw::camera::PinholeModel>\n                  (P, R, opt.focal_length, opt.focal_length,\n                   opt.optical_center[0], opt.optical_center[1]);\n    }\n\n    // This is useful for understanding things in the satellite frame\n    vw::camera::PinholeModel pinRefCam;\n    asp::CsmModel csmRefCam;\n    if (opt.save_ref_cams) {\n      if (opt.save_as_csm) \n        csmRefCam.createFrameModel(opt.image_size[0], opt.image_size[1],\n                                   opt.optical_center[0], opt.optical_center[1],\n                                   opt.focal_length, \n                                   d.semi_major_axis(), d.semi_minor_axis(),\n                                   P0, R0);\n      else\n        pinRefCam = vw::camera::PinholeModel(P0, R0,\n                                             opt.focal_length, opt.focal_length,\n                                             opt.optical_center[0], opt.optical_center[1]);\n    }\n\n    std::string ext;\n    if (opt.save_as_csm)\n      ext = \".json\";\n    else\n      ext = \".tsai\"; \n\n    // The suffix is used with the rig\n    bool isRef = false, isFrame = true;\n    std::string camName = camPrefix(opt, i, cam_times[i], isRef, isFrame, suffix) + ext;\n    cam_names[i] = camName;\n\n    // Check if we do a range\n    if (skipCamera(i, opt)) continue;\n\n    vw::vw_out() << \"Writing: \" << camName << \"\\n\";\n    if (opt.save_as_csm) {\n      auto csmPtr = boost::dynamic_pointer_cast<asp::CsmModel>(cams[i]);\n      csmPtr->saveState(camName);\n    } else {\n      auto pinPtr = boost::dynamic_pointer_cast<vw::camera::PinholeModel>(cams[i]);\n      pinPtr->write(camName);\n    }\n\n    if (opt.save_ref_cams) {\n      bool isRef = true;\n      std::string refCamName = camPrefix(opt, i, cam_times[i], isRef, isFrame, suffix) + ext;\n      vw::vw_out() << \"Writing: \" << refCamName << \"\\n\";\n      if (opt.save_as_csm)\n        csmRefCam.saveState(refCamName);\n      else\n        pinRefCam.write(refCamName);\n    }\n  }\n\n  // Write the list of cameras only if we are not skipping the first camera\n  // Otherwise the same file may be written by multiple processes. \n  if (!skipCamera(0, opt)) {\n    std::string cam_list = opt.out_prefix + \"-cameras\" + suffix + \".txt\"; \n    vw::vw_out() << \"Writing: \" << cam_list << \"\\n\";\n    asp::write_list(cam_list, cam_names);\n  } else {\n     // Print a warning message that the list won't be saved\n     vw::vw_out(vw::WarningMessage) << \"The camera list is saved only when \" \n        << \"--first-index is 0, to avoid a race condition.\\n\";\n  }\n\n  return;\n}\n\n// Bring crops in memory. It greatly helps with multi-threading speed.  \n// This function is used only for small tiles, to avoid running out of memory\n// (which did happen).\nvoid setupCroppedDemAndOrtho(vw::Vector2 const& image_size,\n    vw::CamPtr const& cam,\n    vw::ImageViewRef<vw::PixelMask<float>> const& dem,\n    vw::cartography::GeoReference const& dem_georef,\n    vw::ImageViewRef<vw::PixelMask<float>> const& ortho,\n    vw::cartography::GeoReference const& ortho_georef,\n    double blur_sigma,\n    // Outputs\n    vw::ImageView<vw::PixelMask<float>> & crop_dem,\n    vw::cartography::GeoReference & crop_dem_georef,\n    vw::ImageView<vw::PixelMask<float>> & crop_ortho,\n    vw::cartography::GeoReference & crop_ortho_georef) {\n\n    // Find the bounding box of the dem and ortho portions seen in the camera,\n    // in projected coordinates\n    float mean_gsd = 0.0;    \n    bool quick = true; // Assumes a big DEM fully containing the image    \n    vw::BBox2 dem_box;\n    try {\n      // This is a bugfix. The camera_bbox function can fail if we want an\n      // extent that does not fit fully with the input DEM/orthoimage.\n      // We could use above quick = false, but then we'd get only partial\n      // synthetic images, which isn't good.\n      dem_box = vw::cartography::camera_bbox(dem, dem_georef, dem_georef,\n        cam, image_size[0], image_size[1], mean_gsd, quick);\n    } catch (const vw::Exception& e) {\n       vw::vw_throw(vw::ArgumentErr() << \"sat_sim: Failed to compute a synthetic image. \"\n       << \"The most likely cause is that the desired image is out of bounds given \"\n       << \"the input DEM and orthoimage.\\n\");\n    }\n\n    vw::cartography::GeoTransform d2o(dem_georef, ortho_georef);\n    vw::BBox2 ortho_box = d2o.point_to_point_bbox(dem_box);\n\n    // Find the DEM pixel box and expand it in case there was some inaccuracies\n    // in finding the box\n    vw::BBox2i dem_pixel_box = dem_georef.point_to_pixel_bbox(dem_box);\n    int expand = 50;\n    dem_pixel_box.expand(expand);\n    dem_pixel_box.crop(vw::bounding_box(dem));\n\n    // Same for the ortho\n    vw::BBox2i ortho_pixel_box = ortho_georef.point_to_pixel_bbox(ortho_box);\n    ortho_pixel_box.expand(expand);\n    \n    // Adjust for any blur\n    int kernel_size = 0;\n    if (blur_sigma > 0) {\n      kernel_size = vw::compute_kernel_size(blur_sigma);\n      ortho_pixel_box.expand(kernel_size); // to avoid edge effects\n    }\n\n    ortho_pixel_box.crop(vw::bounding_box(ortho));\n\n    // Crop\n    crop_dem = vw::crop(dem, dem_pixel_box);\n    crop_dem_georef = crop(dem_georef, dem_pixel_box);\n\n    if (blur_sigma > 0) \n      crop_ortho = vw::crop(vw::gaussian_filter(ortho, blur_sigma), ortho_pixel_box);\n    else\n      crop_ortho = vw::crop(ortho, ortho_pixel_box);\n      \n    crop_ortho_georef = crop(ortho_georef, ortho_pixel_box);\n}\n\n// Create a synthetic image with multiple threads\ntypedef vw::ImageView<vw::PixelMask<float>> ImageT;\nclass SynImageView: public vw::ImageViewBase<SynImageView> {\n  \n  typedef typename ImageT::pixel_type PixelT;\n  SatSimOptions const& m_opt;\n  vw::CamPtr m_cam;\n  vw::cartography::GeoReference m_dem_georef; // make a copy to be thread-safe\n  vw::ImageViewRef<vw::PixelMask<float>> m_dem;\n  double m_height_guess;\n  vw::cartography::GeoReference m_ortho_georef; // make a copy to be thread-safe\n  vw::ImageViewRef<vw::PixelMask<float>> m_ortho;\n  float m_ortho_nodata_val;\n\npublic:\n  SynImageView(SatSimOptions const& opt,\n               vw::CamPtr    const& cam,\n               vw::cartography::GeoReference   const& dem_georef,\n               vw::ImageViewRef<vw::PixelMask<float>> dem,\n               double height_guess,\n               vw::cartography::GeoReference   const& ortho_georef,\n               vw::ImageViewRef<vw::PixelMask<float>> ortho,\n               float ortho_nodata_val):\n                m_opt(opt), m_cam(cam), \n                m_dem_georef(dem_georef), m_dem(dem),\n                m_height_guess(height_guess),\n                m_ortho_georef(ortho_georef), m_ortho(ortho),\n                m_ortho_nodata_val(ortho_nodata_val) {}\n\n  typedef PixelT pixel_type;\n  typedef PixelT result_type;\n  typedef vw::ProceduralPixelAccessor<SynImageView> pixel_accessor;\n\n  inline vw::int32 cols() const { return m_opt.image_size[0]; }\n  inline vw::int32 rows() const { return m_opt.image_size[1]; }\n  inline vw::int32 planes() const { return 1; }\n\n  inline pixel_accessor origin() const { return pixel_accessor(*this, 0, 0); }\n\n  inline pixel_type operator()( double/*i*/, double/*j*/, vw::int32/*p*/ = 0 ) const {\n    vw::vw_throw(vw::NoImplErr() \n      << \"SynImageView::operator()(...) is not implemented\");\n    return pixel_type();\n  }\n\n  typedef vw::CropView<vw::ImageView<pixel_type>> prerasterize_type;\n  inline prerasterize_type prerasterize(vw::BBox2i const& bbox) const {\n\n    // Expand the box a bit, to help with interpolation in the ortho image later\n    vw::BBox2i extra_bbox = bbox;\n    extra_bbox.expand(10);\n    extra_bbox.crop(vw::BBox2i(0, 0, cols(), rows()));\n    vw::Vector2 crop_start = extra_bbox.min();\n    vw::Vector2 crop_image_size = extra_bbox.max() - extra_bbox.min();\n\n    // Must adjust the camera to be able work with the current box, which \n    // does not necessarily start at (0,0). We only adjust the starting\n    // position, and not any other params\n    vw::Vector3 translation(0, 0, 0);\n    vw::Quat    rotation(vw::math::identity_matrix<3>());\n    vw::Vector2 pixel_offset = crop_start;\n    double      scale = 1.0;\n    vw::CamPtr crop_cam(new vw::camera::AdjustedCameraModel(m_cam, translation, rotation, \n                        pixel_offset, scale));\n\n    // Bring crops in memory. It greatly helps with multi-threading speed.  \n    vw::cartography::GeoReference crop_dem_georef; // make a copy to be thread-safe\n    vw::ImageView<vw::PixelMask<float>> crop_dem;\n    vw::cartography::GeoReference crop_ortho_georef; // make a copy to be thread-safe\n    vw::ImageView<vw::PixelMask<float>> crop_ortho;\n    setupCroppedDemAndOrtho(crop_image_size,\n      crop_cam, m_dem, m_dem_georef, m_ortho, m_ortho_georef, m_opt.blur_sigma,\n      // Outputs\n      crop_dem, crop_dem_georef, crop_ortho, crop_ortho_georef);\n\n    // Create interpolated image with bicubic interpolation with invalid pixel \n    // edge extension\n    vw::PixelMask<float> nodata_mask = vw::PixelMask<float>(); // invalid value\n    nodata_mask.invalidate();\n    auto interp_ortho = vw::interpolate(crop_ortho, vw::BicubicInterpolation(),\n                                        vw::ValueEdgeExtension<vw::PixelMask<float>>(nodata_mask));\n\n    // The location where the ray intersects the ground. We will use each obtained\n    // location as initial guess for the next ray. This may not be always a great\n    // guess, but it is better than starting nowhere. It should work decently\n    // if the camera is high, and with a small footprint on the ground.\n    vw::Vector3 xyz_guess(0, 0, 0);\n\n    vw::ImageView<result_type> tile(bbox.width(), bbox.height());\n\n    for (int col = bbox.min().x(); col < bbox.max().x(); col++) {\n      for (int row = bbox.min().y(); row < bbox.max().y(); row++) {\n\n        // These will use to index into the tile \n        int c = col - bbox.min().x();\n        int r = row - bbox.min().y();\n\n        // Start with an invalid pixel\n        tile(c, r) = vw::PixelMask<float>();\n        tile(c, r).invalidate();\n\n        // Here use the full image pixel indices\n        vw::Vector2 pix(col, row);\n        // Also use original camera\n        vw::Vector3 cam_ctr = m_cam->camera_center(pix);\n        vw::Vector3 cam_dir = m_cam->pixel_to_vector(pix);\n\n        // Intersect the ray going from the given camera pixel with a DEM\n        // Use xyz_guess as initial guess and overwrite it with the new value\n        bool treat_nodata_as_zero = false;\n        bool has_intersection = false;\n        double max_abs_tol = std::min(m_opt.dem_height_error_tol, 1e-14);\n        double max_rel_tol = max_abs_tol;\n        int num_max_iter = 100;\n        vw::Vector3 xyz = vw::cartography::camera_pixel_to_dem_xyz\n          (cam_ctr, cam_dir, crop_dem,\n            crop_dem_georef, treat_nodata_as_zero,\n            has_intersection, m_opt.dem_height_error_tol, \n            max_abs_tol, max_rel_tol, \n            num_max_iter, xyz_guess, m_height_guess);\n\n        if (!has_intersection)\n          continue; // will result in nodata pixels\n\n        // Update the guess for nex time, now that we have a valid intersection point\n        xyz_guess = xyz;\n\n        // Find the texture value at the intersection point by interpolation.\n        // This will result in an invalid value if if out of range or if the\n        // image itself has invalid pixels.\n        vw::Vector3 llh = crop_dem_georef.datum().cartesian_to_geodetic(xyz);\n        vw::Vector2 ortho_pix = crop_ortho_georef.lonlat_to_pixel\n                                 (vw::Vector2(llh[0], llh[1]));\n        tile(c, r) = interp_ortho(ortho_pix[0], ortho_pix[1]);\n      }\n    }\n\n    return prerasterize_type(tile, -bbox.min().x(), -bbox.min().y(),\n                             cols(), rows());\n  }\n\n  template <class DestT>\n  inline void rasterize(DestT const& dest, vw::BBox2i bbox) const {\n    vw::rasterize(prerasterize(bbox), dest, bbox);\n  }\n};\n\n// Generate images by projecting rays from the sensor to the ground\nvoid genImages(SatSimOptions      const& opt,\n    bool external_cameras,\n    std::vector<std::string>      const& cam_names,\n    std::vector<vw::CamPtr>       const& cams,\n    std::string                   const& suffix, \n    vw::cartography::GeoReference const& dem_georef,\n    vw::ImageViewRef<vw::PixelMask<float>> dem,\n    double height_guess,\n    vw::cartography::GeoReference const& ortho_georef,\n    vw::ImageViewRef<vw::PixelMask<float>> ortho,\n    float ortho_nodata_val) {\n\n  vw::vw_out() << \"Generating images.\\n\";\n\n  // Generate image names from camera names by replacing the extension\n  std::vector<std::string> image_names;\n  image_names.resize(cam_names.size());\n  for (int i = 0; i < int(cam_names.size()); i++) {\n    if (external_cameras)\n      image_names[i] = opt.out_prefix + \"-\" \n      + fs::path(cam_names[i]).filename().replace_extension(\".tif\").string();\n    else // just replace the extension\n     image_names[i] = fs::path(cam_names[i]).replace_extension(\".tif\").string();\n  }\n\n  for (size_t i = 0; i < cams.size(); i++) {\n\n    // Check if we do a range\n    if (skipCamera(i, opt)) continue;\n\n    // Save the image using the block write function with multiple threads\n    // Increase the tile size, as otherwise this code becomes very slow\n    // since a time-consuming camera box calculation happens in each tile.\n    // TODO(oalexan1): Figure out why the slowdown.\n    vw::vw_out() << \"Writing: \" << image_names[i] << \"\\n\";\n    bool has_georef = false; // the produced image is raw, it has no georef\n    bool has_nodata = true;\n    SatSimOptions local_opt = opt;\n    local_opt.raster_tile_size = vw::Vector2i(512, 512);\n    block_write_gdal_image(image_names[i], \n                           vw::apply_mask(SynImageView(opt, cams[i], dem_georef, dem, \n                                                       height_guess, ortho_georef, \n                                                       ortho, ortho_nodata_val), \n                                          ortho_nodata_val),\n                           has_georef, ortho_georef, has_nodata, ortho_nodata_val, \n                           local_opt, vw::TerminalProgressCallback(\"\", \"\\t--> \"));\n  }  \n\n  // Write the list of images only if we are not skipping the first camera\n  // Otherwise the same file may be written by multiple processes. Also\n  // do this only for pinhole cameras, as for linescan there is only one \n  // image/camera rather than a set.\n  if (opt.sensor_type == \"pinhole\") {\n    if (!skipCamera(0, opt)) {\n      std::string image_list = opt.out_prefix + \"-images\" + suffix + \".txt\"; \n      vw::vw_out() << \"Writing: \" << image_list << \"\\n\";\n      asp::write_list(image_list, image_names);\n    } else {\n      // Print a warning message that the list won't be saved\n      vw::vw_out(vw::WarningMessage) << \"The image list is saved only when \" \n        << \"--first-index is 0, to avoid a race condition.\\n\";\n    }\n  }\n\n  return;\n}\n\n// If sensor type is one value, make a vector of that value with\n// as many entries as sensor names. Otherwise split by comma,\n// and there must be as many entries as sensors.\nvoid handleSensorType(int num_sensors, \n                      std::string const& sensor_type, \n                      std::vector<std::string> & sensor_types) { \n  boost::split(sensor_types, sensor_type, boost::is_any_of(\",\"));\n  \n  // If only one, fill to make num_sensors\n  if (sensor_types.size() == 1) {\n    std::string val = sensor_types[0];\n    sensor_types.clear();\n    for (int i = 0; i < num_sensors; i++)\n      sensor_types.push_back(val);\n  }\n  \n  // There must be as many as sensors\n  if (int(sensor_types.size()) != num_sensors)\n    vw::vw_throw(vw::ArgumentErr() << \"Expecting as many sensor types as sensors.\\n\");\n  \n  // Each must be linescan or pinhole\n  for (int i = 0; i < int(sensor_types.size()); i++) {\n    if (sensor_types[i] == \"frame\")\n      sensor_types[i] = \"pinhole\"; // frame is synonymous with pinhole\n    if (sensor_types[i] != \"linescan\" && sensor_types[i] != \"pinhole\")\n      vw::vw_throw(vw::ArgumentErr() << \"Expecting sensor type to be linescan \"\n                   << \"or pinhole/frame.\\n\");\n  }\n}\n\n// Generate cameras and images for a sensor\nvoid genCamerasImages(float ortho_nodata_val,\n            bool have_rig,\n            int rig_sensor_index,\n            vw::ImageViewRef<vw::PixelMask<float>> dem,\n            double height_guess,\n            vw::cartography::GeoReference const& ortho_georef,\n            vw::ImageViewRef<vw::PixelMask<float>> ortho,\n            SatSimOptions                      & opt,\n            rig::RigSet                        & rig,\n            vw::cartography::GeoReference const& dem_georef,\n            std::string                   const& suffix) {\n\n  std::vector<vw::Vector3> positions;\n  std::vector<vw::Matrix3x3> cam2world, cam2world_no_jitter, ref_cam2world;\n  std::vector<double> cam_times;\n  int first_pos = 0; // used with linescan poses, which start before first image line\n  double orbit_len = 0.0, first_line_time = 0.0; // will change\n  \n  // Compute the camera poses. Some logic here is different for linescan and frame\n  // cameras, that's why this logic is called individually for each rig sensor,\n  // even though if all sensors are of the same time it would be enough to call\n  // it once.\n  asp::genCamPoses(opt, dem_georef, dem, height_guess, have_rig,\n                   // Outputs\n                   first_pos, first_line_time, orbit_len, positions, cam2world, \n                   cam2world_no_jitter, ref_cam2world, cam_times, rig);\n\n  // In genCamPoses() the rig may have been updated. Fetch the latest.\n  Eigen::Affine3d ref2sensor = Eigen::Affine3d::Identity();\n  if (have_rig)\n    ref2sensor = rig.ref_to_cam_trans[rig_sensor_index];\n\n  // Sequence of camera names and cameras for one sensor\n  std::vector<std::string> cam_names; \n  std::vector<vw::CamPtr> cams;\n  // The suffix is needed to distinguish the cameras and images for each rig sensor\n  if (opt.sensor_type == \"pinhole\")\n    asp::genPinholeCameras(opt, dem_georef, positions, cam2world, ref_cam2world,\n                           cam_times, have_rig, ref2sensor, suffix, cam_names, cams);\n  else\n    asp::genLinescanCameras(first_line_time, orbit_len, dem_georef, dem, first_pos, \n                            positions, cam2world, cam2world_no_jitter, ref_cam2world, \n                            cam_times, height_guess, have_rig, ref2sensor, suffix, \n                            opt, cam_names, cams);\n\n  bool external_cameras = false;\n  if (!opt.no_images)\n    asp::genImages(opt, external_cameras, cam_names, cams, suffix, dem_georef, dem, \n        height_guess, ortho_georef, ortho, ortho_nodata_val);\n\n}\n\n// Generate the cameras and images for a rig\nvoid genRigCamerasImages(SatSimOptions          & opt,\n            rig::RigSet                         & rig,\n            vw::cartography::GeoReference  const& dem_georef,\n            vw::ImageViewRef<vw::PixelMask<float>> dem,\n            double height_guess,\n            vw::cartography::GeoReference  const& ortho_georef,\n            vw::ImageViewRef<vw::PixelMask<float>> ortho,\n            float ortho_nodata_val) {\n\n  // Sanity checks\n  if (opt.rig_config == \"\")            \n    vw::vw_throw(vw::ArgumentErr() << \"The rig configuration file must be set.\\n\");\n  \n  // Handle sensor types\n  std::vector<std::string> sensor_types;\n  handleSensorType(rig.cam_names.size(), opt.sensor_type, sensor_types);\n  \n  std::vector<std::string> sensor_names;\n  if (opt.sensor_name == \"all\")\n    sensor_names = rig.cam_names; \n  else\n    boost::split(sensor_names, opt.sensor_name, boost::is_any_of(\",\"));\n  \n  // Map from each sensor in rig.cam_names to index\n  std::map<std::string, int> sensor_name2index;\n  for (int i = 0; i < int(rig.cam_names.size()); i++)\n    sensor_name2index[rig.cam_names[i]] = i;\n  \n  // Iterate over sensor_names. Check if it is sensor_name2index\n  for (size_t sensor_it = 0; sensor_it < sensor_names.size(); sensor_it++) {\n    auto it = sensor_name2index.find(sensor_names[sensor_it]);\n    if (it == sensor_name2index.end())\n      vw::vw_throw(vw::ArgumentErr() << \"Sensor: \" << sensor_names[sensor_it] \n        << \" not found in the rig.\\n\");\n    \n    // Pass the intrinsics to a local copy of the options\n    SatSimOptions local_opt     = opt;\n    int sensor_index            = it->second;\n    auto params                 = rig.cam_params[sensor_index];\n    local_opt.focal_length      = params.GetFocalLength();\n    local_opt.optical_center[0] = params.GetOpticalOffset()[0];\n    local_opt.optical_center[1] = params.GetOpticalOffset()[1];\n    local_opt.image_size[0]     = params.GetDistortedSize()[0];\n    local_opt.image_size[1]     = params.GetDistortedSize()[1];\n    local_opt.sensor_type       = sensor_types[sensor_index];\n    \n    // The transform from the reference sensor to the current sensor\n    Eigen::Affine3d ref2sensor = rig.ref_to_cam_trans[sensor_index];\n    std::string suffix = \"-\" + rig.cam_names[sensor_index];\n    bool have_rig = true;\n    genCamerasImages(ortho_nodata_val, have_rig, sensor_index, dem, height_guess, \n                     ortho_georef, ortho, local_opt, rig, dem_georef, suffix); \n    \n  }              \n}\n\n// Modify the rig that was used to produce the images to make the sensor transforms\n// relative to the first sensor.or. \nvoid writeRelRig(std::string const& out_prefix, rig::RigSet const& rig) {\n  \n  rig::RigSet ref_rig = rig;\n  for (size_t i = 0; i < rig.ref_to_cam_trans.size(); i++)\n    ref_rig.ref_to_cam_trans[i] \n        = rig.ref_to_cam_trans[i] * rig.ref_to_cam_trans[0].inverse();\n  \n  // Ensure the first transform is identity. Now it may not be precisely it\n  // because of numerical errors.\n  ref_rig.ref_to_cam_trans[0] = Eigen::Affine3d::Identity();\n  \n  std::string ref_rig_config = out_prefix + \"-rig_config.txt\";\n  bool have_rig = true;\n  rig::writeRigConfig(ref_rig_config, have_rig, ref_rig);\n  \n}\n \n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Camera/SatSim.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file SatSim.h\n\n// Functions used for the sat_sim.cc tool that are not general enough to put\n// somewhere else.\n\n#ifndef __ASP_CAMERA_SATSIM_H__\n#define __ASP_CAMERA_SATSIM_H__\n\n#include <vw/Cartography/GeoReference.h>\n#include <vw/Image/ImageViewRef.h>\n#include <vw/FileIO/DiskImageView.h>\n#include <vw/Image/PixelMask.h>\n#include <vw/FileIO/GdalWriteOptions.h>\n#include <vw/Camera/CameraModel.h>\n#include <vw/Core/Exception.h>\n\n#include <Eigen/Dense>\n\n#include <string>\n#include <map>\n\nnamespace rig {\n  class RigSet;\n}\n\nnamespace asp {\n\nstruct SatSimOptions: vw::GdalWriteOptions {\n  std::string dem_file, ortho_file, out_prefix, camera_list, sensor_type, \n  rig_sensor_ground_offsets, rig_sensor_rotation_angles;\n  vw::Vector3 first, last; // dem pixel and height above dem datum\n  int num_cameras, first_index, last_index;\n  vw::Vector2 optical_center, image_size, first_ground_pos, last_ground_pos;\n  double focal_length, dem_height_error_tol, blur_sigma;\n  double roll, pitch, yaw, velocity, frame_rate, ref_time, random_position_perturbation;\n  std::vector<double> jitter_frequency, jitter_amplitude, jitter_phase, horizontal_uncertainty;\n  std::string jitter_frequency_str, jitter_amplitude_str, jitter_phase_str, \n    horizontal_uncertainty_str, rig_config, sensor_name;\n  bool no_images, save_ref_cams, non_square_pixels, save_as_csm, model_time,\n    perturb_cameras, random_pose_perturbation;\n  SatSimOptions() {}\n};\n\n// A function to read the cameras from a file\nvoid readPinholeCameras(SatSimOptions const& opt, \n                        std::vector<std::string> & cam_names,\n                        std::vector<vw::CamPtr> & cams);\n\n// A function to perturb the cameras\nvoid perturbCameras(SatSimOptions const& opt, \n                    std::string const& suffix,\n                    vw::cartography::GeoReference const& georef,\n                    std::vector<std::string> const& cam_names,\n                    std::vector<vw::CamPtr> & cams);\n\n// Generate a prefix for produced image and camera names.\nstd::string camPrefix(SatSimOptions const& opt, int iFrame, double timestamp, bool isRef,\n                      bool isFrame, std::string const& suffix);\n\n// A function to create and save the cameras. Assume no distortion, and pixel\n// pitch = 1.\nvoid genPinholeCameras(SatSimOptions          const& opt,\n                vw::cartography::GeoReference const& dem_georef,\n                std::vector<vw::Vector3>      const& positions,\n                std::vector<vw::Matrix3x3>    const& cam2world,\n                std::vector<vw::Matrix3x3>    const& ref_cam2world,\n                std::vector<double>           const& cam_times,\n                bool                                 have_rig,\n                Eigen::Affine3d               const& ref2sensor,\n                std::string                   const& suffix, \n                // Outputs\n                std::vector<std::string> & cam_names,\n                std::vector<vw::CamPtr>  & cams);\n\n// Generate images by projecting rays from the sensor to the ground\nvoid genImages(SatSimOptions      const& opt,\n    bool external_cameras,\n    std::vector<std::string>      const& cam_names,\n    std::vector<vw::CamPtr>       const& cams,\n    std::string                   const& suffix, \n    vw::cartography::GeoReference const& dem_georef,\n    vw::ImageViewRef<vw::PixelMask<float>> dem,\n    double height_guess,\n    vw::cartography::GeoReference const& ortho_georef,\n    vw::ImageViewRef<vw::PixelMask<float>> ortho,\n    float ortho_nodata_val);\n\n// Generate cameras and images for a sensor\nvoid genCamerasImages(float ortho_nodata_val,\n            bool have_rig,\n            int rig_sensor_index,\n            vw::ImageViewRef<vw::PixelMask<float>> dem,\n            double height_guess,\n            vw::cartography::GeoReference const& ortho_georef,\n            vw::ImageViewRef<vw::PixelMask<float>> ortho,\n            SatSimOptions                      & opt,\n            rig::RigSet                        & rig,\n            vw::cartography::GeoReference const& dem_georef,\n            std::string                   const& suffix);\n\n// Generate the cameras and images for a rig\nvoid genRigCamerasImages(SatSimOptions          & opt,\n            rig::RigSet                         & rig,\n            vw::cartography::GeoReference  const& dem_georef,\n            vw::ImageViewRef<vw::PixelMask<float>> dem,\n            double height_guess,\n            vw::cartography::GeoReference  const& ortho_georef,\n            vw::ImageViewRef<vw::PixelMask<float>> ortho,\n            float ortho_nodata_val);\n\n// Given a transform from ref sensor to world, the ref sensor to current sensor,\n// create the transform from current sensor to world. Do it in-place. \nvoid applyRigTransform(Eigen::Affine3d const & ref_to_sensor,\n                       vw::Vector3 & ctr, vw::Matrix3x3 & cam2world);\n\n// Write the rig used by this program and the rig in which each sensor\n// is relative to the first sensor. \nvoid writeRelRig(std::string const& out_prefix, rig::RigSet const& rig);\n\n// A little function to avoid repetitive code in many places.\n// Get the value of a map key if known to exist.\ntemplate<class A, class B>\nA mapVal(std::map<B, A> const& m, B const& key) {\n  auto it = m.find(key);\n  if (it == m.end()) \n    vw::vw_throw(vw::ArgumentErr() << \"Could not find key \" << key << \" in map.\\n\");\n  return it->second;\n}\n\n} // end namespace asp\n\n#endif//__ASP_CAMERA_SATSIM_H__\n"
  },
  {
    "path": "src/asp/Camera/SyntheticLinescan.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Core/CameraTransforms.h>\n#include <asp/Camera/CsmModel.h>\n#include <asp/Camera/SyntheticLinescan.h>\n#include <asp/Camera/SatSim.h>\n#include <asp/Camera/CsmUtils.h>\n#include <asp/Core/FileUtils.h>\n\n#include <usgscsm/UsgsAstroLsSensorModel.h>\n\n#include <vw/Camera/PinholeModel.h>\n#include <vw/Image/ImageViewRef.h>\n#include <vw/Cartography/CameraBBox.h>\n#include <vw/Math/Functors.h>\n#include <vw/Core/Stopwatch.h>\n\nnamespace asp {\n\n// Allow finding the time at any line, even negative ones. Here a\n// simple slope-intercept formula is used rather than a table. \n// This was a temporary function used for debugging\n// double get_time_at_line(double line) const {\n//     csm::ImageCoord csm_pix;\n//     asp::toCsmPixel(vw::Vector2(0, line), csm_pix);\n//     return ls_model->getImageTime(csm_pix);\n// }\n\n// The pointing vector in sensor coordinates, before applying cam2world. This\n// is for testing purposes. Normally CSM takes care of this internally.\n// This was a temporary function used for debugging\n// vw::Vector3 get_local_pixel_to_vector(vw::Vector2 const& pix) const {\n\n//   vw::Vector3 result(pix[0] + detector_origin[0], \n//                       detector_origin[1], \n//                       ls_model->m_focalLength);\n//   // Make the direction have unit length\n//   result = normalize(result);\n//   return result;\n// }\n\n// Compare the camera center and direction with pinhole. A very useful\n// test.\nvoid PinLinescanTest(SatSimOptions                const & opt, \n                     asp::CsmModel                const & ls_cam,\n                     std::map<int, vw::Vector3>   const & positions,\n                     std::map<int, vw::Matrix3x3> const & cam2world) {\n                        \n  for (int i = 0; i < int(positions.size()); i++) {\n\n    auto pin_cam \n      = vw::camera::PinholeModel(asp::mapVal(positions, i),\n                                 asp::mapVal(cam2world, i),\n                                 opt.focal_length, opt.focal_length,\n                                 opt.optical_center[0], opt.optical_center[1]);\n  \n    double line = (opt.image_size[1] - 1.0) * i / std::max((positions.size() - 1.0), 1.0);\n  \n    // Need care here. ls_pix is on the line.\n    vw::Vector2 pin_pix(opt.optical_center[0], opt.optical_center[1]);\n    vw::Vector2 ls_pix (opt.optical_center[0], line);\n\n    // The differences below must be 0\n    vw::Vector3 ls_ctr  = ls_cam.camera_center(ls_pix);\n    vw::Vector3 pin_ctr = pin_cam.camera_center(pin_pix);\n    std::cout << \"ls ctr and and pin - ls ctr diff: \" << ls_ctr << \" \"\n              << norm_2(pin_ctr - ls_ctr) << std::endl;\n\n    vw::Vector3 ls_dir = ls_cam.pixel_to_vector(ls_pix);\n    vw::Vector3 pin_dir = pin_cam.pixel_to_vector(pin_pix);\n    std::cout << \"ls dir and pin - ls dir diff: \" << ls_dir << \" \"\n              << norm_2(pin_dir - ls_dir) << std::endl;\n  }\n}\n\n// Wrapper for logic to intersect DEM with ground. The xyz provided on input serves\n// as initial guess and gets updated on output if the intersection succeeds. Return\n// true on success.\nbool intersectDemWithRay(SatSimOptions const& opt,\n                         vw::cartography::GeoReference const& dem_georef,vw::ImageViewRef<vw::PixelMask<float>> dem,\n                         vw::Vector3 const& cam_ctr, \n                         vw::Vector3 const& cam_dir,\n                         double height_guess,\n                         // Output\n                         vw::Vector3 & xyz) {\n\n    // Find the intersection of this ray with the ground\n    bool treat_nodata_as_zero = false;\n    bool has_intersection = false;\n    double max_abs_tol = std::min(opt.dem_height_error_tol, 1e-14);\n    double max_rel_tol = max_abs_tol;\n    int num_max_iter = 100;\n\n    vw::Vector3 local_xyz \n      = vw::cartography::camera_pixel_to_dem_xyz\n        (cam_ctr, cam_dir, dem, dem_georef, treat_nodata_as_zero, has_intersection, \n        // Below we use a prudent approach. Try to make the solver work\n        // hard. It is not clear if this is needed.\n        std::min(opt.dem_height_error_tol, 1e-8),\n        max_abs_tol, max_rel_tol, \n        num_max_iter, xyz, height_guess);\n\n    if (!has_intersection)\n      return false;\n\n    // Update xyz with produced value if we succeeded\n    xyz = local_xyz;\n    return true;\n}\n\n// Estimate pixel aspect ratio (width / height) of a pixel on the ground\ndouble pixelAspectRatio(SatSimOptions                 const & opt,     \n                        vw::cartography::GeoReference const & dem_georef,\n                        asp::CsmModel                 const & ls_cam,\n                        vw::ImageViewRef<vw::PixelMask<float>>  dem,  \n                        double height_guess) {\n\n  // Put here a stop watch\n  //vw::Stopwatch sw;\n  //sw.start();\n\n  // We checked that the image width and height is at least 2 pixels. That is\n  // needed to properly create the CSM model. Now do some samples to see how the\n  // pixel width and height are on the ground. Use a small set of samples. Should be good\n  // enough. Note how we go a little beyond each sample, while still not exceeding\n  // the designed image size. \n  double samp_x = (opt.image_size[0] - 1.0) / 10.0;\n  double samp_y = (opt.image_size[1] - 1.0) / 10.0;\n\n  std::vector<double> ratios; \n  vw::Vector3 xyz(0, 0, 0); // intersection with DEM, will be updated below\n  \n  for (double x = 0; x < opt.image_size[0] - 1.0; x += samp_x) {\n    for (double y = 0; y < opt.image_size[1] - 1.0; y += samp_y) {\n\n      // Find the intersection of the ray from this pixel with the ground\n      vw::Vector2 pix(x, y);\n      vw::Vector3 ctr = ls_cam.camera_center(pix);\n      vw::Vector3 dir = ls_cam.pixel_to_vector(pix);\n      bool ans = intersectDemWithRay(opt, dem_georef, dem, ctr, dir, \n         height_guess, xyz);\n      if (!ans) \n        continue;\n      vw::Vector3 P0 = xyz;\n\n      // Add a little to the pixel, but stay within the image bounds\n      double dx = std::min(samp_x, 0.5);\n      double dy = std::min(samp_y, 0.5);\n\n      // See pixel width on the ground\n      pix = vw::Vector2(x + dx, y);\n      ctr = ls_cam.camera_center(pix);\n      dir = ls_cam.pixel_to_vector(pix);\n      ans = intersectDemWithRay(opt, dem_georef, dem, ctr, dir, \n         height_guess, xyz);\n      if (!ans) \n        continue;\n      vw::Vector3 Px = xyz;\n\n      // See pixel height on the ground\n      pix = vw::Vector2(x, y + dy);\n      ctr = ls_cam.camera_center(pix);\n      dir = ls_cam.pixel_to_vector(pix);\n      ans = intersectDemWithRay(opt, dem_georef, dem, ctr, dir, \n         height_guess, xyz);\n      if (!ans)\n        continue;\n      vw::Vector3 Py = xyz;\n\n      double ratio = norm_2(Px - P0) / norm_2(Py - P0);\n      if (std::isnan(ratio) || std::isinf(ratio) || ratio <= 0.0)\n        continue;\n      ratios.push_back(ratio);\n    }\n  }\n\n  if (ratios.empty())\n    vw::vw_throw(vw::ArgumentErr() << \"No valid samples found to compute \"\n             << \"the pixel width and height on the ground.\\n\");\n\n  double ratio = vw::math::destructive_median(ratios);\n\n  //sw.stop();\n  //std::cout << \"Time to compute pixel aspect ratio: \" << sw.elapsed_seconds() << std::endl;\n\n  return ratio;\n}\n\n// Form a linescan camera taking into account the reference sensor to current\n// rig sensor transform.\nvoid populateCsmLinescanRig(double first_line_time, double dt_line, \n                            double t0_ephem, double dt_ephem,\n                            double t0_quat, double dt_quat, \n                            double focal_length,\n                            vw::Vector2                const & optical_center,\n                            vw::Vector2i               const & image_size,\n                            vw::cartography::Datum     const & datum, \n                            std::string                const & sensor_id, \n                            std::vector<vw::Vector3>   const & positions,\n                            std::vector<vw::Vector3>   const & velocities,\n                            std::vector<vw::Matrix3x3> const & cam2world,\n                            bool                               have_rig,\n                            Eigen::Affine3d            const & ref2sensor,\n                            // Outputs\n                            asp::CsmModel                    & model) {\n\n  // If there is a rig, must apply the proper transforms to positions and orientations\n  if (!have_rig) {\n      populateCsmLinescan(first_line_time, dt_line, t0_ephem, dt_ephem, t0_quat, dt_quat,\n                      focal_length, optical_center, image_size, datum, sensor_id,\n                      positions, velocities, cam2world, model);\n  } else {\n    std::vector<vw::Vector3> trans_positions(positions.size());\n    std::vector<vw::Matrix3x3> trans_cam2world(cam2world.size());\n    for (size_t i = 0; i < positions.size(); i++) {\n      vw::Vector3   P = positions[i];\n      vw::Matrix3x3 R = cam2world[i]; \n      \n      applyRigTransform(ref2sensor, P, R);\n      trans_positions[i] = P;\n      trans_cam2world[i] = R;\n    }\n    \n    populateCsmLinescan(first_line_time, dt_line, t0_ephem, dt_ephem, t0_quat, dt_quat,\n                      focal_length, optical_center, image_size, datum, sensor_id,\n                      trans_positions, velocities, trans_cam2world, model);\n  }\n  \n}\n\n// Create and save a linescan camera with given camera positions and orientations.\n// There will be just one of them, as all poses are part of the same linescan camera.\nvoid genLinescanCameras(double                                 first_line_time,\n                        double                                 orbit_len,     \n                        vw::cartography::GeoReference  const & dem_georef,\n                        vw::ImageViewRef<vw::PixelMask<float>> dem,\n                        int                                    first_pos,\n                        std::vector<vw::Vector3>       const & positions,\n                        std::vector<vw::Matrix3x3>     const & cam2world,\n                        std::vector<vw::Matrix3x3>     const & cam2world_no_jitter,\n                        std::vector<vw::Matrix3x3>     const & ref_cam2world,\n                        std::vector<double>            const & cam_times,\n                        double                                 height_guess,\n                        bool                                   have_rig,\n                        Eigen::Affine3d                const & ref2sensor,\n                        std::string                    const & suffix, \n                        // Outputs\n                        SatSimOptions                        & opt, \n                        std::vector<std::string>             & cam_names,\n                        std::vector<vw::CamPtr>              & cams) {\n  \n  // Sanity checks\n  if (cam2world.size() != positions.size() || \n      cam2world_no_jitter.size() != positions.size() ||\n      ref_cam2world.size() != positions.size() ||\n      cam_times.size() != positions.size())\n    vw::vw_throw(vw::ArgumentErr() \n                 << \"Expecting as many camera orientations as positions.\\n\");\n    \n  // Initialize the outputs\n  cam_names.clear();\n  cams.clear();\n  \n  // Measure time based on the length of the segment between 1st and last line.\n  // Must be consistent with genCamPoses().\n  double orbit_segment_time = orbit_len / opt.velocity;\n  double dt_line = orbit_segment_time / (opt.image_size[1] - 1.0);\n\n  // Positions and orientations use the same starting time and spacing. Note\n  // that opt.num_cameras is the number of cameras within the desired orbital\n  // segment of length orbit_len, and also the number of cameras for which we\n  // have image lines. We will have extra cameras beyond that segment to make it\n  // easy to interpolate the camera position and orientation at any time and\n  // also to solve for jitter. Here we adjust things so that the camera at first\n  // image line has time 0. \n  if (first_pos > 0)\n    vw::vw_throw(vw::ArgumentErr() << \"First position index must be non-positive.\\n\");\n  double dt_ephem = orbit_segment_time / (opt.num_cameras - 1.0);\n  double dt_quat = dt_ephem;\n  double t0_ephem = first_line_time + first_pos * dt_ephem;\n  double t0_quat = t0_ephem;\n\n  // Sanity check. The linescan time logic here must agree with the logic in\n  // genCamPoses(), including for frame cameras.\n  for (size_t i = 0; i < positions.size(); i++) {\n    if (opt.model_time && std::abs(t0_ephem + dt_ephem * i - cam_times[i]) > 1e-8)\n      vw::vw_throw(vw::ArgumentErr() << \"Time mismatch. Use a smaller --reference-time.\\n\");\n  }\n  \n  // We have no velocities in this context, so set them to 0\n  std::vector<vw::Vector3> velocities(positions.size(), vw::Vector3(0, 0, 0));\n  \n  // Create the camera. Will be later owned by a smart pointer.\n  asp::CsmModel * ls_cam = new asp::CsmModel;\n  std::string sensor_id = \"SyntheticLinescan\";\n\n  // We assume no optical offset in y for this synthetic camera\n  vw::Vector2 local_optical_center(opt.optical_center[0], 0.0);\n\n  // If creating square pixels, must use the camera without jitter to estimate\n  // the image height. Otherwise the image height produced from the camera with\n  // jitter will be inconsistent with the one without jitter. This is a bugfix. \n  if (!opt.non_square_pixels) \n    populateCsmLinescanRig(first_line_time, dt_line, t0_ephem, dt_ephem, t0_quat, dt_quat,\n                           opt.focal_length, local_optical_center,\n                           opt.image_size, dem_georef.datum(), sensor_id,\n                           positions, velocities, cam2world_no_jitter, have_rig, ref2sensor, \n                           *ls_cam); // output\n  else\n    populateCsmLinescanRig(first_line_time, dt_line, t0_ephem, dt_ephem, t0_quat, dt_quat,\n                           opt.focal_length, local_optical_center,\n                           opt.image_size, dem_georef.datum(), sensor_id,\n                           positions, velocities, cam2world, have_rig, ref2sensor, \n                           *ls_cam); // output \n\n  // Sanity check (very useful)\n  // PinLinescanTest(opt, *ls_cam, positions, cam2world);\n\n  if (!opt.non_square_pixels) {\n    // Find the pixel aspect ratio on the ground (x/y)\n    vw::vw_out() << \"Adjusting the linescan image height from \" << opt.image_size[1] << \" to \";\n    double ratio = pixelAspectRatio(opt, dem_georef, *ls_cam, dem, height_guess);\n    // Adjust the image height to make the pixels square\n    opt.image_size[1] = std::max(round(opt.image_size[1] / ratio), 2.0);\n    // Must adjust the time spacing to match the new image height\n    dt_line = orbit_segment_time / (opt.image_size[1] - 1.0);\n    vw::vw_out() << opt.image_size[1] << \" pixels, to make the ground \"\n                 << \"projection of an image pixel be roughly square.\\n\";\n\n    // Recreate the camera with this aspect ratio. This time potentially use the \n    // camera with jitter. \n    populateCsmLinescanRig(first_line_time, dt_line, t0_ephem, dt_ephem, t0_quat, dt_quat,\n                           opt.focal_length, local_optical_center,\n                           opt.image_size, dem_georef.datum(), sensor_id,\n                           positions, velocities, cam2world, have_rig, ref2sensor,\n                           *ls_cam); // output\n    // Sanity check (very useful for testing, the new ratio must be close to 1.0)\n    // ratio = pixelAspectRatio(opt, dem_georef, *ls_cam, dem, height_guess);\n  }\n  \n  double timestamp = std::numeric_limits<double>::quiet_NaN();\n  int iFrame = -1; // No frame index for linescan cameras\n  bool isRef = false;\n  bool isFrame = false;\n  std::string ref= \"\"; \n  std::string filename = camPrefix(opt, iFrame, timestamp, isRef, isFrame, suffix) + \".json\";\n  vw::vw_out() << \"Writing: \" << filename << \"\\n\";\n  ls_cam->saveState(filename);\n\n  if (opt.save_ref_cams) {\n    asp::CsmModel ref_cam;\n    populateCsmLinescanRig(first_line_time, dt_line, t0_ephem, dt_ephem, t0_quat, dt_quat,\n                           opt.focal_length, local_optical_center, \n                           opt.image_size, dem_georef.datum(), sensor_id,\n                           positions,  velocities, ref_cam2world, have_rig, ref2sensor,\n                           ref_cam); // output\n    isRef = true;\n    std::string ref_filename = \n      camPrefix(opt, iFrame, timestamp, isRef, isFrame, suffix) + \".json\";\n    vw::vw_out() << \"Writing: \" << ref_filename << \"\\n\";\n    ref_cam.saveState(ref_filename);\n  }\n\n  // Save the camera name and smart pointer to camera\n  cam_names.push_back(filename);\n  cams.push_back(vw::CamPtr(ls_cam));\n\n  return;\n}\n\n// A function to read Linescan cameras from disk. There will\n// be just one of them, but same convention is kept as for Pinhole\n// where there is many of them. Note that the camera is created as of CSM type,\n// rather than asp::CsmModel type. This is not important as we will\n// abstract it right away to the base class.\nvoid readLinescanCameras(SatSimOptions const& opt, \n                         std::vector<std::string> & cam_names,\n                         std::vector<vw::CamPtr> & cams) {\n\n  // Read the camera names\n  vw::vw_out() << \"Reading: \" << opt.camera_list << std::endl;\n  asp::read_list(opt.camera_list, cam_names);\n\n  // Sanity checks\n  if (cam_names.empty())\n    vw::vw_throw(vw::ArgumentErr() << \"No cameras were found.\\n\");\n  if (cam_names.size() != 1)\n    vw::vw_throw(vw::ArgumentErr() << \"Only one linescan camera is expected.\\n\");\n\n  cams.resize(cam_names.size());\n  for (int i = 0; i < int(cam_names.size()); i++)\n    cams[i] = vw::CamPtr(new asp::CsmModel(cam_names[i]));\n\n  return;\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Camera/SyntheticLinescan.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file SyntheticLinescan.h\n///\n/// A synthetic linescan model as a wrapper around CSM.\n\n#ifndef __STEREO_CAMERA_SYNTHETIC_LINESCAN_H__\n#define __STEREO_CAMERA_SYNTHETIC_LINESCAN_H__\n\n#include <vw/Camera/CameraModel.h>\n#include <vw/Image/ImageViewRef.h>\n#include <Eigen/Geometry>\n\nnamespace vw {\n  namespace cartography {\n    class GeoReference;\n  }\n}\n\nnamespace asp {\n\nstruct SatSimOptions;\nclass RigSet;\n\n// Create and save a linescan camera with given camera positions and orientations.\n// There will be just one of them, as all poses are part of the same linescan camera.\n// See the .cc file for more details.\nvoid genLinescanCameras(double                                 first_line_time,\n                        double                                 orbit_len,     \n                        vw::cartography::GeoReference  const & dem_georef,\n                        vw::ImageViewRef<vw::PixelMask<float>> dem,\n                        int                                    first_pos,\n                        std::vector<vw::Vector3>       const & positions,\n                        std::vector<vw::Matrix3x3>     const & cam2world,\n                        std::vector<vw::Matrix3x3>     const & cam2world_no_jitter,\n                        std::vector<vw::Matrix3x3>     const & ref_cam2world,\n                        std::vector<double>            const & cam_times,\n                        double                                 height_guess,\n                        bool                                   have_rig,\n                        Eigen::Affine3d                const & ref2sensor,\n                        std::string                    const & suffix, \n                        // Outputs\n                        SatSimOptions                        & opt, \n                        std::vector<std::string>             & cam_names,\n                        std::vector<vw::CamPtr>              & cams);\n\n// A function to read Linescan cameras from disk in CSM format. There will\n// be just one of them.\nvoid readLinescanCameras(SatSimOptions const& opt, \n    std::vector<std::string> & cam_names,\n    std::vector<vw::CamPtr> & cams);\n\n} // end namespace asp\n\n\n#endif//__STEREO_CAMERA_SYNTHETIC_LINESCAN_H__\n"
  },
  {
    "path": "src/asp/Camera/TimeProcessing.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2024, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Camera/TimeProcessing.h>\n\nnamespace asp {\n\n// Boost does not like a time string such as \"2017-12-07 15:36:40.90795Z\"\n// because it expects precisely 6 digits after the dot. Fix that.\nstd::string fix_millisecond(std::string const& in_str) {\n\n  std::string out_str = \"\";\n  bool found_dot = false;\n  int num_digits_after_dot = 0;\n  for (size_t it = 0; it < in_str.size(); it++) {\n\n    if (it + 1 < in_str.size()) {\n      // Not yet at the last character\n\n      if (in_str[it] == '.') {\n        // Found the dot\n        found_dot = true;\n        out_str += in_str[it];\n        continue;\n      }\n\n      if (!found_dot) {\n        // Not at the dot yet\n        out_str += in_str[it];\n        continue;\n      }\n\n      // After the dot\n      if (num_digits_after_dot < 6) {\n        out_str += in_str[it];\n        num_digits_after_dot++;\n      }\n      continue;\n    }\n\n    // At the last character\n    if (in_str[it] >= '0' && in_str[it] <= '9') {\n      // The last character is a digit, just append it\n      if (num_digits_after_dot < 6) {\n        out_str += in_str[it];\n        num_digits_after_dot++;\n      }\n\n      // See if to append more\n      while (found_dot && num_digits_after_dot < 6) {\n        out_str += \"0\";\n        num_digits_after_dot++;\n      }\n\n    } else {\n\n      // The last character is not a digit, it is likely a \"Z\"\n      while (found_dot && num_digits_after_dot < 6) {\n        // Append zeros\n        out_str += \"0\";\n        num_digits_after_dot++;\n      }\n\n      // Append the last character, whatever it is\n      out_str += in_str[it];\n    }\n\n  } // End iterating over characters\n\n  return out_str;\n}\n\nboost::posix_time::ptime parse_time(std::string const& s) {\n\n  // Replace the T with a space so the default Boost function can\n  // parse the time.\n  std::string s2 = s;\n  boost::replace_all(s2, \"T\", \" \");\n\n  // Ensure there are exactly 6 digits for the millisecond or else\n  // Boost will complain.\n  s2 = asp::fix_millisecond(s2);\n  boost::posix_time::ptime time = boost::posix_time::time_from_string(s2);\n\n  return time;\n}\n\n// Return the time in seconds since January 1, 2000, down to the microsecond.\n// Avoid starting at the epoch (1970) as that may create some loss in precision.\ndouble to_seconds(const boost::posix_time::ptime& pt) {\n  boost::posix_time::ptime epoch(boost::gregorian::date(2000, 1, 1));\n  boost::posix_time::time_duration diff = pt - epoch;\n  return diff.total_microseconds() / 1.0e+6;\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Camera/TimeProcessing.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <boost/date_time/posix_time/posix_time.hpp>\n#include <string>\n\nnamespace asp {\n\n  /// A functor that returns the difference in seconds from a reference time.\n  /// Uses boost::posix_time.\n  class SecondsFromRef {\n    boost::posix_time::ptime m_reference;\n  public:\n    inline SecondsFromRef() {}\n    inline SecondsFromRef(boost::posix_time::ptime const& ref_time) : m_reference(ref_time) {}\n    \n    inline void set_base_time(boost::posix_time::ptime const& ref_time) {m_reference = ref_time;}\n    \n    inline double operator()(boost::posix_time::ptime const& time) const {\n      return double((time - m_reference).total_microseconds()) / 1.0e6;\n    }\n  };\n\n  // Boost does not like a time string such as \"2017-12-07 15:36:40.90795Z\"\n  // because it expects precisely 6 digits after the dot (hence for the millisecond).\n  // Fix that. PeruSat has this problem.\n  std::string fix_millisecond(std::string const& in_str);\n\n  // Parse a time string such as \"2017-12-07 15:36:40.90795Z\"\n  boost::posix_time::ptime parse_time(std::string const& s);  \n  \n  // Return the time in seconds since the January 1, 2000, down to the microsecond\n  double to_seconds(const boost::posix_time::ptime& pt);\n  \n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Camera/XMLBase.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n#include <asp/Camera/XMLBase.h>\n\n#include <cstdlib> // strtod\n#include <vector>\n\nusing namespace vw;\n\nvoid asp::XmlUtils::parseDoublesFromXmlBlock(\n    std::string const& rawXml,\n    std::string const& openTag,\n    std::string const& closeTag,\n    std::vector<double>& values) {\n\n  values.clear();\n\n  // Find the block boundaries\n  size_t blockStart = rawXml.find(openTag);\n  if (blockStart == std::string::npos)\n    vw_throw(ArgumentErr() << \"Tag not found: \" << openTag << \"\\n\");\n  blockStart += openTag.size();\n\n  size_t blockEnd = rawXml.find(closeTag, blockStart);\n  if (blockEnd == std::string::npos)\n    vw_throw(ArgumentErr() << \"Closing tag not found: \" << closeTag << \"\\n\");\n\n  const char* p = rawXml.c_str() + blockStart;\n  const char* end = rawXml.c_str() + blockEnd;\n\n  while (p < end) {\n    // Skip XML tags\n    if (*p == '<') {\n      while (p < end && *p != '>')\n        p++;\n      if (p < end)\n        p++;\n      continue;\n    }\n    // Skip whitespace\n    if (*p == ' ' || *p == '\\t' || *p == '\\n' || *p == '\\r') {\n      p++;\n      continue;\n    }\n    // Parse a number\n    char* next = nullptr;\n    double val = strtod(p, &next);\n    if (next > p) {\n      values.push_back(val);\n      p = next;\n    } else {\n      p++; // skip unexpected char\n    }\n  }\n}\n"
  },
  {
    "path": "src/asp/Camera/XMLBase.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// This header should not be included by other headers since it\n// brings in xercesc headers. This limits the spread of those\n// headers and objects.\n\n#ifndef __STEREO_SESSION_XMLBASE_H__\n#define __STEREO_SESSION_XMLBASE_H__\n\n#include <vw/Core/Exception.h>\n#include <vw/Core/FundamentalTypes.h>\n\n#include <string>\n#include <vector>\n\n// Can't do much about warnings in boost except to hide them\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wdeprecated-declarations\"\n#include <boost/lexical_cast.hpp>\n#pragma GCC diagnostic pop\n\n#include <bitset>\n\n#include <xercesc/dom/DOMElement.hpp>\n#include <xercesc/dom/DOMNodeList.hpp>\n#include <xercesc/util/XMLString.hpp>\n#include <xercesc/util/Xerces_autoconf_config.hpp>\n\nnamespace asp {\n\nnamespace XmlUtils {\n\n/// Helper function to convert XML text to a binary value.\ntemplate <class T>\nvoid cast_xmlch(const XMLCh* ch, T& dst) {\n  char* text = xercesc::XMLString::transcode(ch);\n  try {\n    dst = boost::lexical_cast<T>(text);\n  } catch (boost::bad_lexical_cast const& e) {\n    vw_throw(vw::ArgumentErr() << \"Failed to parse string: \" << text << \"\\n\");\n  }\n  xercesc::XMLString::release(&text);\n}\n\n/// Helper function to retrieve a node via string and verify that only one exists.\ntemplate <class T>\nT* get_node(xercesc::DOMElement* element, std::string const& tag) {\n  XMLCh* tag_c = xercesc::XMLString::transcode(tag.c_str());\n  xercesc::DOMNodeList* list = element->getElementsByTagName(tag_c);\n  VW_ASSERT(list->getLength() != 0,\n            vw::IOErr() << \"Could not find \\\"\" << tag << \"\\\" tag.\");\n  VW_ASSERT(list->getLength() == 1,\n            vw::IOErr() << \"Found multiple \\\"\" << tag << \"\\\" tags.\");\n  xercesc::XMLString::release(&tag_c);\n  return dynamic_cast<T*>(list->item(0));\n}\n\n/// Parse all doubles from a named XML block in raw text using strtod.\n/// Finds the text between openTag and closeTag, skips any XML tags\n/// inside, and extracts all floating-point numbers. Much faster than\n/// xercesc DOM traversal for large blocks of numeric data.\nvoid parseDoublesFromXmlBlock(std::string const& rawXml,\n                              std::string const& openTag,\n                              std::string const& closeTag,\n                              std::vector<double>& values);\n\n} // End namespace XmlUtils\n\n} // end namespace asp\n\n#endif//__STEREO_SESSION_XMLBASE_H__\n"
  },
  {
    "path": "src/asp/Camera/tests/TestCsmCameraModel.cxx",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Camera/CsmModel.h>\n#include <boost/shared_ptr.hpp>\n#include <test/Helpers.h>\n#include <iomanip>\n\nusing namespace vw;\nusing namespace asp;\n\nTEST(CSM_camera, basic_check) {\n\n  // TODO: Add a sample file to the repo for ASP to load!\n  // Load up the sample ISD file.\n  std::string sample_isd = \"/home/smcmich1/data/csm/ctx_pair/J03_045994_1986_XN_18N282W.json\";\n\n  CsmModel csm;\n  csm.load_model(sample_isd);\n\n  std::cout << \"Size = \" << csm.get_image_size() << std::endl;\n\n  // Do some simple model tests\n  const double eps = 0.005;\n  for (int i = 0; i < 4; i++) {\n    std::cout << \"i = \" << i << std::endl;\n    Vector2 pix(i*100,i*100);\n    std::cout << \"pix = \" << pix << std::endl;\n    Vector3 center = csm.camera_center(pix);\n    std::cout << \"center = \" << center << std::endl;\n    Vector3 vec    = csm.pixel_to_vector(pix);\n    std::cout << \"vec = \" << vec << std::endl;\n    Vector3 pt     = center + vec * 10000;\n    std::cout << \" pt = \" << pt << std::endl;\n    Vector2 pixel;\n    try {\n      pixel = csm.point_to_pixel(pt);\n    } catch(...) {continue;}\n    std::cout << \" pixel = \" << pixel << std::endl;\n    EXPECT_VECTOR_NEAR(pix, pixel, eps);\n    std::cout << std::endl;\n  }\n\n  EXPECT_TRUE(false);\n}\n\n"
  },
  {
    "path": "src/asp/Camera/tests/TestDGCameraModel.cxx",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n#include <asp/Camera/LinescanDGModel.h>\n#include <asp/Camera/RPC_XML.h>\n#include <asp/Camera/XMLBase.h>\n#include <asp/Camera/RPCModel.h>\n#include <boost/shared_ptr.hpp>\n#include <test/Helpers.h>\n\n#include <vw/Stereo/StereoModel.h>\n\n#include <vw/Cartography/GeoTransform.h>\n\nusing namespace vw;\nusing namespace asp;\nusing namespace xercesc;\nusing namespace vw::test;\n\nTEST(StereoSessionDG, XMLReading) {\n  XMLPlatformUtils::Initialize();\n\n  GeometricXML geo;\n  AttitudeXML  att;\n  EphemerisXML eph;\n  ImageXML     img;\n  RPCXML       rpc;\n\n  EXPECT_FALSE( geo.is_good() );\n  EXPECT_FALSE( att.is_good() );\n  EXPECT_FALSE( eph.is_good() );\n  EXPECT_FALSE( img.is_good() );\n  EXPECT_FALSE( rpc.is_good() );\n\n  read_xml( \"dg_example1.xml\", geo, att, eph, img, rpc );\n\n  EXPECT_TRUE( geo.is_good() );\n  EXPECT_TRUE( att.is_good() );\n  EXPECT_TRUE( eph.is_good() );\n  EXPECT_TRUE( img.is_good() );\n  EXPECT_TRUE( rpc.is_good() );\n\n  // Checking GEO\n  EXPECT_NEAR( 7949.165, geo.principal_distance, 1e-6 );\n  EXPECT_EQ( 0, geo.optical_polyorder );\n  EXPECT_VECTOR_NEAR( Vector3(), geo.perspective_center, 1e-6 );\n  EXPECT_NEAR( 0, geo.camera_attitude.x(), 1e-6 );\n  EXPECT_NEAR( 1, geo.camera_attitude.w(), 1e-6 );\n  EXPECT_VECTOR_NEAR( Vector2(.05372,140.71193), geo.detector_origin, 1e-6 );\n  EXPECT_NEAR( 0, geo.detector_rotation, 1e-6 );\n  EXPECT_NEAR( .008, geo.detector_pixel_pitch, 1e-6 );\n\n  // Checking ATT\n  EXPECT_FALSE( att.start_time.empty() );\n  EXPECT_NEAR( .02, att.time_interval, 1e-6 );\n  // TODO(oalexan1): If the test below fails, just tweak it so it passes.\n  // Some logic changed which was not reflected in these tests but\n  // was validated in a different way.\n  EXPECT_EQ( 840, att.satellite_quat_vec.size() );\n  // There are 10 covariances for each position (4x4 matrix, upper-right corner)\n  EXPECT_EQ( 840 * 10, att.satellite_quat_covariance_vec.size() );\n  for ( size_t i = 0; i < 840; i++ ) {\n    EXPECT_NE( 0, att.satellite_quat_vec[i][3] );\n    EXPECT_NE( 0, att.satellite_quat_covariance_vec[i]);\n  }\n  //EXPECT_VECTOR_NEAR( Vector3(3.72e-12, 3.51e-12, 1.12e-13),\n  //                    subvector(att.satellite_quat_covariance_vec[0],0,3), 1e-20 );\n\n  // Checking EPH\n  EXPECT_FALSE( eph.start_time.empty() );\n  EXPECT_NEAR( .02, eph.time_interval, 1e-6 );\n  EXPECT_EQ( 840, eph.position_vec.size() );\n  EXPECT_EQ( 840, eph.velocity_vec.size() );\n  EXPECT_EQ( 840 * 10, eph.satellite_quat_covariance_vec.size() );\n  for ( size_t i = 0; i < 840; i++ ) {\n    EXPECT_NE( 0, eph.position_vec[i].x() ) << i;\n    EXPECT_NE( 0, eph.velocity_vec[i].x() );\n    EXPECT_NE( 0, eph.satellite_quat_covariance_vec[i] );\n  }\n  EXPECT_VECTOR_NEAR( Vector3(-1.150529111070304e+06,\n                              -4.900037170821411e+06,\n                              4.673402253879593e+06),\n                      eph.position_vec[0], 1e-6 );\n\n  // Checking IMG\n  EXPECT_FALSE( img.tlc_start_time.empty() );\n  EXPECT_FALSE( img.first_line_start_time.empty() );\n  EXPECT_EQ( 2, img.tlc_vec.size() );\n  EXPECT_NEAR( 0, img.tlc_vec[0].first, 1e-8 );\n  EXPECT_NEAR( 0, img.tlc_vec[0].second, 1e-8 );\n  EXPECT_NEAR( 23708, img.tlc_vec[1].first, 1e-8 );\n  EXPECT_NEAR( 1.975667, img.tlc_vec[1].second, 1e-8 );\n  EXPECT_EQ( 23708, img.image_size.y() );\n  EXPECT_EQ( 35170, img.image_size.x() );\n\n  XMLPlatformUtils::Terminate();\n}\n\nTEST(DGCameraModel, CreateCamera) {\n\n  xercesc::XMLPlatformUtils::Initialize();\n  \n  vw::CamPtr cam1, cam2, cam3;\n  cam1 = vw::CamPtr(load_dg_camera_model_from_xml(\"dg_example1.xml\"));\n  cam2 = vw::CamPtr(load_dg_camera_model_from_xml(\"dg_example2.xml\"));\n  \n  ASSERT_TRUE( cam1.get() != 0 );\n  ASSERT_TRUE( cam2.get() != 0 );\n\n  Vector2 m1(13864, 5351), m2(15045, 5183);\n  m1 *= 2; m2 *= 2;\n\n  stereo::StereoModel sm(cam1.get(), cam2.get());\n  double error;\n  Vector3 pos = sm(m1,m2,error);\n  EXPECT_LT( error, 5.0 ); // Triangulation should be better than 5 meters.\n  EXPECT_LT( norm_2(pos), norm_2(cam1->camera_center(m1)) ); // Point should be below camera.\n\n  // Verify that projection back into the camera hits the right\n  // spot. It will slightly be wrong due to the above triangulation error.\n#if __GNUC__\n#if __x86_64__ || __ppc64__\n  EXPECT_VECTOR_NEAR( m1, cam1->point_to_pixel( pos ), 4 );\n  EXPECT_VECTOR_NEAR( m2, cam2->point_to_pixel( pos ), 4 );\n#else\n  EXPECT_VECTOR_NEAR( m1, cam1->point_to_pixel( pos ), 9 );\n  EXPECT_VECTOR_NEAR( m2, cam2->point_to_pixel( pos ), 25 );\n#endif\n#endif\n\n  // A more accurate test is just to project out and back into the same camera\n  for ( size_t i = 0; i < 30000; i += 500 ) {\n    for ( size_t j = 0; j < 24000; j += 500 ) {\n      EXPECT_VECTOR_NEAR( Vector2(i,j),\n                          cam1->point_to_pixel( cam1->camera_center(Vector2(i,j)) +\n                                                2e4 * cam1->pixel_to_vector( Vector2(i,j) ) ),\n                          1e-1 /*pixels*/);\n    }\n  }\n\n  // Create a camera that only has a single TLC entry. It will throw\n  // an error in the event that first line time and TLC entry lookup\n  // don't agree. That should be good enough for a test.\n  EXPECT_NO_THROW( cam3=load_dg_camera_model_from_xml(\"dg_example3.xml\"); );\n\n  XMLPlatformUtils::Terminate();\n}\n\n"
  },
  {
    "path": "src/asp/Camera/tests/TestRPCStereoModel.cxx",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NASA Vision Workbench is licensed under the Apache License,\n//  Version 2.0 (the \"License\"); you may not use this file except in\n//  compliance with the License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// TestRPCStereoModel.h\n\n// This also contains the RPCModel tests so they should be separated out some time.\n\n#include <vw/Camera/CameraModel.h>\n#include <vw/Stereo/StereoModel.h>\n#include <test/Helpers.h>\n#include <asp/Camera/XMLBase.h>\n#include <asp/Camera/RPC_XML.h>\n#include <asp/Camera/LinescanDGModel.h>\n#include <asp/Camera/RPCModel.h>\n#include <asp/Camera/RPCStereoModel.h>\n#include <asp/Core/StereoSettings.h>\n#include <xercesc/util/PlatformUtils.hpp>\n\nusing namespace vw;\nusing namespace vw::stereo;\nusing namespace vw::camera;\nusing namespace vw::math;\nusing namespace asp;\n\n/// Load an RPC camera file\n/// - TODO: Remove this once we have a nice RPC load function outside the Loader class.\nboost::shared_ptr<vw::camera::CameraModel> load_rpc_camera_model(std::string const& path) {\n  // Try the default loading method\n  RPCModel* rpc_model = NULL;\n  try {\n    RPCXML rpc_xml; // This is for reading XML files\n    rpc_xml.read_from_file(path);\n    rpc_model = new RPCModel(*rpc_xml.rpc_ptr()); // Copy the value\n  } catch (...) {}\n\n  // We don't catch an error here because the user will need to\n  // know of a failure at this point.\n  return boost::shared_ptr<asp::RPCModel>(rpc_model);\n}\n\nvoid test_stereo_models(const std::string &path1, const std::string &path2) {\n\n  // Load the camera models\n  boost::shared_ptr<vw::camera::CameraModel> camPtr1, camPtr2;\n\n  // Object to handle camera model loading\n  camPtr1 = load_rpc_camera_model(path1);\n  camPtr2 = load_rpc_camera_model(path2);\n\n  // Set up the stereo models\n  vw::stereo::StereoModel plainStereoModel(camPtr1.get(), camPtr2.get());\n  asp::RPCStereoModel     rpcStereoModel  (camPtr1.get(), camPtr2.get());\n\n  // Generate a bunch of pixel pairs\n  const int NUM_PIXELS = 10;\n  Vector2 pixelBase(10000, 10000);\n  std::vector<Vector2> pixels1(NUM_PIXELS), pixels2(NUM_PIXELS);\n  for (int i = 0; i < NUM_PIXELS; i++) {\n    pixels1[i] = pixelBase + Vector2(i, 0);\n    pixels2[i] = pixelBase;\n  }\n\n  // Try out a bunch of pixel pairs\n  double errorPlain, errorRpc;\n  for (int i = 0; i < NUM_PIXELS; i++) {\n    // Use both stereo models to find the ray intersection\n    Vector3 xyzPlain = plainStereoModel(pixels1[i], pixels2[i], errorPlain);\n    Vector3 xyzRpc   = rpcStereoModel  (pixels1[i], pixels2[i], errorRpc);\n\n    // The results should be identical\n    EXPECT_VECTOR_NEAR(xyzPlain, xyzRpc, 1e-4);\n    //EXPECT_LT(abs(errorPlain - errorRpc), 1e-4);\n  }\n}\n\nTEST(RPCModel, rpb) {\n#if 0\n  // This one is failing. Need to study. \n  RPCModel m(\"sample.RPB\"); // Read and check the values from this file.\n\n  EXPECT_NEAR(m.line_num_coeff()[3],      -3.071606965e-01, 1e-8);\n  EXPECT_NEAR(m.lonlatheight_offset()[0], -122.373300,      1e-4);\n  EXPECT_NEAR(m.xy_scale()[1],             531.0,           1e-1);\n#endif\n}\n\nTEST(RPCXML, ReadRPC) {\n  xercesc::XMLPlatformUtils::Initialize();\n\n  RPCXML xml;\n\n  EXPECT_FALSE(xml.is_good());\n\n  xml.read_from_file(\"dg_example1.xml\");\n\n  EXPECT_TRUE(xml.is_good());\n\n  EXPECT_VECTOR_NEAR(Vector2(17564,11856), xml.rpc_ptr()->xy_offset(), 1e-6);\n  EXPECT_VECTOR_NEAR(Vector2(17927,12384), xml.rpc_ptr()->xy_scale(), 1e-6);\n  EXPECT_VECTOR_NEAR(Vector3(-105.2903,39.7454,2281), xml.rpc_ptr()->lonlatheight_offset(), 1e-6);\n  EXPECT_VECTOR_NEAR(Vector3(.1345,.1003,637), xml.rpc_ptr()->lonlatheight_scale(), 1e-6);\n  EXPECT_NEAR(4.683662e-3, xml.rpc_ptr()->line_num_coeff()[0], 1e-6);\n  EXPECT_NEAR(4.395393e-6, xml.rpc_ptr()->line_num_coeff()[19], 1e-6);\n  EXPECT_NEAR(1, xml.rpc_ptr()->line_den_coeff()[0], 1e-6);\n  EXPECT_NEAR(-3.71156e-8, xml.rpc_ptr()->line_den_coeff()[19], 1e-6);\n  EXPECT_NEAR(-7.306375e-3, xml.rpc_ptr()->sample_num_coeff()[0], 1e-6);\n  EXPECT_NEAR(-1.585929e-6, xml.rpc_ptr()->sample_num_coeff()[19], 1e-6);\n  EXPECT_NEAR(1, xml.rpc_ptr()->sample_den_coeff()[0], 1e-6);\n  EXPECT_NEAR(-1.211995e-7, xml.rpc_ptr()->sample_den_coeff()[19], 1e-6);\n\n  xercesc::XMLPlatformUtils::Terminate();\n}\n\nTEST(RPCStereoModel, mvpMatchTest) {\n  xercesc::XMLPlatformUtils::Initialize();\n  test_stereo_models(\"wv_mvp_1.xml\", \"wv_mvp_2.xml\");\n  xercesc::XMLPlatformUtils::Terminate();\n}\n\nTEST(RPCStereoModel, greenlandMatchTest) {\n  xercesc::XMLPlatformUtils::Initialize();\n  test_stereo_models(\"wv_test1.xml\", \"wv_test2.xml\");\n  xercesc::XMLPlatformUtils::Terminate();\n}\n\nTEST(StereoSessionRPC, InstantiateTest) {\n  xercesc::XMLPlatformUtils::Initialize();\n\n  // Create an RPC Model\n  RPCXML xml;\n  xml.read_from_file(\"dg_example1.xml\");\n  RPCModel model(*xml.rpc_ptr());\n\n  // Verify some of the values\n  EXPECT_NEAR(4.683662e-3, model.line_num_coeff()[0], 1e-6);\n  EXPECT_NEAR(1, model.line_den_coeff()[0], 1e-6);\n  EXPECT_NEAR(-7.306375e-3, model.sample_num_coeff()[0], 1e-6);\n  EXPECT_NEAR(1, model.sample_den_coeff()[0], 1e-6);\n  EXPECT_VECTOR_NEAR(Vector2(17564,11856), model.xy_offset(), 1e-3);\n  EXPECT_VECTOR_NEAR(Vector2(17927,12384), model.xy_scale(), 1e-3);\n\n  // Verify the Jacobian numerically\n  Vector3 location(-105.29,39.745,2281);\n  double tol = 1e-4;\n  Matrix<double, 2, 3> Je = model.geodetic_to_pixel_Jacobian(location);\n  Matrix<double, 2, 3> Jn = model.geodetic_to_pixel_numerical_Jacobian(location, tol);\n  double relErr = max(abs(Je-Jn))/max(abs(Je));\n  EXPECT_LT(relErr, 1e-5);\n\n  // Verify that if we go from pixel to lonlat and back, then we\n  // arrive at the starting point.\n  Vector2 pix(0, 0);\n  double h = 10.0;\n  Vector2 lonlat  = model.image_to_ground(pix, h);\n  Vector2 pix_out = model.geodetic_to_pixel(Vector3(lonlat[0], lonlat[1], h));\n  EXPECT_LT(norm_2(pix - pix_out), 1.0e-9);\n\n  // Verify that nothing segfaults or has a run time error.\n  EXPECT_NO_THROW(model.calculate_terms(location));\n  EXPECT_NO_THROW(model.terms_Jacobian3(location));\n  EXPECT_NO_THROW(model.normalization_Jacobian(location));\n  EXPECT_NO_THROW(model.geodetic_to_pixel_Jacobian(location));\n  EXPECT_NO_THROW(model.geodetic_to_pixel(location));\n  EXPECT_NO_THROW(model.pixel_to_vector(Vector2()));\n  EXPECT_NO_THROW(model.camera_center(Vector2()));\n\n  xercesc::XMLPlatformUtils::Terminate();\n}\n\nTEST(StereoSessionRPC, CheckStereo) {\n\n  xercesc::XMLPlatformUtils::Initialize();\n\n  RPCXML xml1, xml2;\n  xml1.read_from_file(\"dg_example1.xml\");\n  xml2.read_from_file(\"dg_example4.xml\");\n  RPCModel model1(*xml1.rpc_ptr());\n  RPCModel model2(*xml2.rpc_ptr());\n  std::cout << std::endl;\n\n  RPCStereoModel RPC_stereo(&model1, &model2);\n  double error;\n  RPC_stereo(Vector2(), Vector2(), error);\n\n  //EXPECT_NEAR( error, 54682.96251543280232, 1e-3 );\n  EXPECT_NEAR(error, 54705.95473285091, 1e-3);\n\n  xercesc::XMLPlatformUtils::Terminate();\n}\n\n/// Make sure that the AdjustedCameraModel class handles cropping with RPC models\nTEST(StereoSessionRPC, CheckRpcCrop) {\n\n  xercesc::XMLPlatformUtils::Initialize();\n\n  // Load the camera model as DG and RPC\n  boost::shared_ptr<vw::camera::CameraModel> rpcModel = load_rpc_camera_model(\"dg_example1.xml\");\n\n  boost::shared_ptr<vw::camera::CameraModel> dgModel  = load_dg_camera_model_from_xml(\"dg_example1.xml\");\n\n  // Verify that the RPC and DG models are similar\n  Vector2 testPix(100, 200);\n  Vector3 rpcVector = rpcModel->pixel_to_vector(testPix);\n  Vector3 dgVector  = dgModel->pixel_to_vector(testPix);\n  EXPECT_LT(norm_2(rpcVector - dgVector), 1.0e-4);\n\n  // Now try the same thing with a cropped image\n  Vector2 pixel_offset(40, 80);\n  Vector3 position_correction;\n  Quaternion<double> pose_correction = Quat(math::identity_matrix<3>());\n\n  boost::shared_ptr<camera::CameraModel> croppedRpc(\n    new vw::camera::AdjustedCameraModel(rpcModel, position_correction, pose_correction, pixel_offset));\n  boost::shared_ptr<camera::CameraModel> croppedDg(\n    new vw::camera::AdjustedCameraModel(dgModel, position_correction, pose_correction, pixel_offset));\n\n  rpcVector = croppedRpc->pixel_to_vector(testPix);\n  dgVector  = croppedDg->pixel_to_vector(testPix);\n  EXPECT_LT(norm_2(rpcVector - dgVector), 1.0e-4);\n\n  xercesc::XMLPlatformUtils::Terminate();\n}\n"
  },
  {
    "path": "src/asp/Camera/tests/TestSpotCameraModel.cxx",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Camera/SPOT_XML.h>\n#include <test/Helpers.h>\n#include <xercesc/util/PlatformUtils.hpp>\n\nusing namespace vw;\nusing namespace asp;\nusing namespace xercesc;\nusing namespace vw::test;\n\n// This test is split to a separate function so that the SpotXML destructor is called\n//  before the Xerces platform terminate function is called.\nvoid xml_reading_test() {\n  SpotXML xml_reader;\n  xml_reader.read_xml(\"spot_example1.xml\");\n\n  EXPECT_EQ(300,   xml_reader.image_size[0]); // Cols, a real file is much larger.\n  EXPECT_EQ(96168, xml_reader.image_size[1]); // Rows\n\n  const double EPS = 1e-8;\n  EXPECT_EQ(4, xml_reader.lonlat_corners.size());\n  EXPECT_EQ(4, xml_reader.pixel_corners.size());\n  EXPECT_NEAR(-75.519946, xml_reader.lonlat_corners[0].x(), EPS);\n  EXPECT_NEAR(-76.636309, xml_reader.lonlat_corners[0].y(), EPS);\n  EXPECT_EQ(1, xml_reader.pixel_corners[0].x());\n  EXPECT_EQ(1, xml_reader.pixel_corners[0].y());\n  EXPECT_NEAR(-71.924271, xml_reader.lonlat_corners[1].x(), EPS);\n  EXPECT_NEAR(-77.389028, xml_reader.lonlat_corners[1].y(), EPS);\n  EXPECT_EQ(300, xml_reader.pixel_corners[1].x());\n  EXPECT_EQ(1,   xml_reader.pixel_corners[1].y());\n  EXPECT_NEAR(-88.569672, xml_reader.lonlat_corners[2].x(), EPS);\n  EXPECT_NEAR(-80.241112, xml_reader.lonlat_corners[2].y(), EPS);\n  EXPECT_EQ(300,   xml_reader.pixel_corners[2].x());\n  EXPECT_EQ(96168, xml_reader.pixel_corners[2].y());\n  EXPECT_NEAR(-91.818476, xml_reader.lonlat_corners[3].x(), EPS);\n  EXPECT_NEAR(-79.298919, xml_reader.lonlat_corners[3].y(), EPS);\n  EXPECT_EQ(1,     xml_reader.pixel_corners[3].x());\n  EXPECT_EQ(96168, xml_reader.pixel_corners[3].y());\n\n  EXPECT_NEAR(7.5199705115e-04, xml_reader.line_period, EPS);\n  EXPECT_EQ(\"2008-03-04T12:31:39.349737\", xml_reader.center_time);\n  EXPECT_EQ(48084, xml_reader.center_line);\n  EXPECT_EQ(6000,  xml_reader.center_col);\n\n  EXPECT_EQ(10,                  xml_reader.look_angles[9].first);\n  EXPECT_NEAR(3.4977741700e-01,  xml_reader.look_angles[9].second.x(), EPS);\n  EXPECT_NEAR(-7.1264930800e-02, xml_reader.look_angles[9].second.y(), EPS);\n\n  EXPECT_EQ(\"2008-03-04T12:31:03.206912\",  xml_reader.pose_logs.front().first);\n  EXPECT_NEAR(1.1621635280e-03,  xml_reader.pose_logs.front().second.x(), EPS);\n  EXPECT_NEAR(-9.5496029568e-04, xml_reader.pose_logs.front().second.y(), EPS);\n  EXPECT_NEAR(-1.7549389832e-05, xml_reader.pose_logs.front().second.z(), EPS);\n\n  EXPECT_EQ(\"2008-03-04T12:32:15.331747\",  xml_reader.pose_logs.back().first);\n  EXPECT_NEAR(1.2001004714e-03,  xml_reader.pose_logs.back().second.x(), EPS);\n  EXPECT_NEAR(-9.5696493468e-04, xml_reader.pose_logs.back().second.y(), EPS);\n  EXPECT_NEAR(-2.4331461036e-05, xml_reader.pose_logs.back().second.z(), EPS);\n\n  EXPECT_EQ(\"2008-03-04T12:28:27.000000\",  xml_reader.position_logs.front().first);\n  EXPECT_NEAR(1.7495691231e+06,  xml_reader.position_logs.front().second.x(), EPS);\n  EXPECT_NEAR(-2.2672541162e+06, xml_reader.position_logs.front().second.y(), EPS);\n  EXPECT_NEAR(-6.6183333707e+06, xml_reader.position_logs.front().second.z(), EPS);\n\n  EXPECT_EQ(\"2008-03-04T12:28:27.000000\",  xml_reader.velocity_logs.front().first);\n  EXPECT_NEAR(-6.2538959540e+03,  xml_reader.velocity_logs.front().second.x(), EPS);\n  EXPECT_NEAR(3.1331303950e+03, xml_reader.velocity_logs.front().second.y(), EPS);\n  EXPECT_NEAR(-2.7272519760e+03, xml_reader.velocity_logs.front().second.z(), EPS);\n}\n\nTEST(SPOT_camera, XMLReading) {\n  XMLPlatformUtils::Initialize();\n  xml_reading_test();\n  XMLPlatformUtils::Terminate();\n}\n"
  },
  {
    "path": "src/asp/Camera/tests/ctx.json",
    "content": "{\"isis_camera_version\": 1, \"image_lines\": 11264, \"image_samples\": 5000, \"name_platform\": \"Mars_Reconnaissance_Orbiter\", \"name_sensor\": \"CONTEXT CAMERA\", \"reference_height\": {\"maxheight\": 1000, \"minheight\": -1000, \"unit\": \"m\"}, \"name_model\": \"USGS_ASTRO_LINE_SCANNER_SENSOR_MODEL\", \"interpolation_method\": \"lagrange\", \"line_scan_rate\": [[0.5, -10.57126396894455, 0.001877]], \"starting_ephemeris_time\": 316465854.27447015, \"center_ephemeris_time\": 316465864.8457341, \"radii\": {\"semimajor\": 3396.19, \"semiminor\": 3376.2, \"unit\": \"km\"}, \"body_rotation\": {\"time_dependent_frames\": [10014, 1], \"ck_table_start_time\": 316465854.27447015, \"ck_table_end_time\": 316465875.41699815, \"ck_table_original_size\": 2, \"ephemeris_times\": [316465854.27447015, 316465875.41699815], \"quaternions\": [[0.6772361094215444, 0.011538839651282455, -0.3180850922831696, 0.6633550944571689], [0.6777329806654347, 0.011300490742532646, -0.31809364920478556, 0.6628474456184518]], \"angular_velocities\": [[3.162380988414122e-05, -2.880493695452411e-05, 5.651985248276685e-05], [3.162380988408139e-05, -2.8804936955187485e-05, 5.6519852482462224e-05]], \"reference_frame\": 1}, \"instrument_pointing\": {\"time_dependent_frames\": [-74000, 1], \"ck_table_start_time\": 316465854.2444882, \"ck_table_end_time\": 316465875.4458036, \"ck_table_original_size\": 192, \"ephemeris_times\": [316465854.2444882, 316465854.3432971, 316465854.4446621, 316465854.54331803, 316465854.64454913, 316465854.7432841, 316465854.8446131, 316465854.9433261, 316465855.0446701, 316465855.14562905, 316465855.24475014, 316465855.34335506, 316465855.4446901, 316465855.54332507, 316465855.64465106, 316465855.7432821, 316465855.84469104, 316465855.9433081, 316465856.04504204, 316465856.14572513, 316465856.2447711, 316465856.3434151, 316465856.4447201, 316465856.543379, 316465856.644664, 316465856.74340206, 316465856.8447891, 316465857.044831, 316465857.145716, 316465857.24464005, 316465857.343316, 316465857.4446561, 316465857.543443, 316465857.64478, 316465857.74349004, 316465857.84474, 316465857.943518, 316465858.044766, 316465858.1457711, 316465858.24479496, 316465858.343567, 316465858.4449049, 316465858.54361296, 316465858.64480996, 316465858.743474, 316465858.844874, 316465859.045269, 316465859.1456909, 316465859.24491096, 316465859.34358895, 316465859.44486094, 316465859.5435109, 316465859.64482, 316465859.74358094, 316465859.84488, 316465860.0449389, 316465860.1459199, 316465860.2449439, 316465860.34347695, 316465860.445238, 316465860.543602, 316465860.64489794, 316465860.743562, 316465860.84500694, 316465860.943707, 316465861.044922, 316465861.14645493, 316465861.24517596, 316465861.34403694, 316465861.44514596, 316465861.543718, 316465861.64502394, 316465861.74379194, 316465861.845014, 316465861.943756, 316465862.044909, 316465862.14607894, 316465862.2449929, 316465862.34371394, 316465862.64503795, 316465862.7437269, 316465862.84504193, 316465862.9437879, 316465863.04505295, 316465863.1460629, 316465863.24503595, 316465863.3438079, 316465863.4450399, 316465863.5436339, 316465863.64540094, 316465863.7437429, 316465863.84511787, 316465864.04515797, 316465864.1465499, 316465864.24557483, 316465864.3440958, 316465864.44517887, 316465864.54379284, 316465864.64541185, 316465864.74386084, 316465864.8452649, 316465864.9440218, 316465865.0450969, 316465865.1464509, 316465865.2454618, 316465865.34387183, 316465865.5438739, 316465865.6456518, 316465865.7439438, 316465865.84527886, 316465866.04524684, 316465866.1464918, 316465866.2454538, 316465866.34395176, 316465866.4453618, 316465866.5443198, 316465866.6455888, 316465866.7439278, 316465866.8452818, 316465867.14664775, 316465867.2453268, 316465867.3439228, 316465867.5439778, 316465867.6457488, 316465867.7439888, 316465867.84530574, 316465867.9441168, 316465868.0453568, 316465868.1466408, 316465868.24544275, 316465868.3440558, 316465868.4453807, 316465868.5439898, 316465868.6457077, 316465868.7440617, 316465868.8454647, 316465868.94416976, 316465869.0453657, 316465869.1467477, 316465869.2453257, 316465869.34417176, 316465869.5441067, 316465869.6458248, 316465869.74407077, 316465869.84544075, 316465870.14691764, 316465870.24544567, 316465870.34416467, 316465870.5443247, 316465870.6460627, 316465870.74416465, 316465870.84547466, 316465871.0454766, 316465871.1468647, 316465871.2455856, 316465871.3442916, 316465871.4455547, 316465871.5442067, 316465871.6462347, 316465871.7441917, 316465871.8455277, 316465872.04570365, 316465872.1468446, 316465872.2454436, 316465872.3442316, 316465872.5442467, 316465872.6459166, 316465872.7442986, 316465872.84565663, 316465873.0456157, 316465873.1469526, 316465873.2456826, 316465873.34424067, 316465873.4456376, 316465873.5442866, 316465873.6460726, 316465873.7443986, 316465873.8456656, 316465873.9444096, 316465874.0455386, 316465874.14689654, 316465874.24568254, 316465874.34439653, 316465874.54448456, 316465874.6460945, 316465874.7444076, 316465874.8456115, 316465875.0457186, 316465875.14666456, 316465875.24602455, 316465875.3444945, 316465875.4458036], \"quaternions\": [[0.7441728039387935, 0.12997379028219033, 0.5191756834538913, 0.3997127236250305], [0.7441430972329165, 0.12997707251018778, 0.5192107015723053, 0.39972147657472473], [0.7441119100530367, 0.12997948851750182, 0.5192469356017217, 0.39973168219465877], [0.74408198050436, 0.1299832721631074, 0.5192822833806862, 0.3997402474275284], [0.7440524555513248, 0.1299860887498447, 0.5193172291195355, 0.39974889075414494], [0.7440227407520473, 0.12998967286981136, 0.5193525425667389, 0.39975715468328377], [0.7439938456219192, 0.12999279875193684, 0.5193872146450307, 0.39976486990807913], [0.7439642617312916, 0.12999598999014386, 0.5194221551271898, 0.3997734916376052], [0.743933686317591, 0.1300010691821586, 0.5194567070036754, 0.39978384399862066], [0.743903971873106, 0.13000430757825968, 0.5194918449745122, 0.39979242570050255], [0.7438745311285364, 0.1300072043667252, 0.5195262389421219, 0.39980157053431137], [0.7438449736823133, 0.13001079299314797, 0.5195615958412889, 0.3998094508133904], [0.7438158369520821, 0.13001424165318326, 0.5195962020320206, 0.39981756402204355], [0.7437861135417498, 0.13001742750024964, 0.5196312384417967, 0.39982628963603845], [0.7437565994350048, 0.13001904019861624, 0.5196662937376242, 0.3998351074326888], [0.743726588533455, 0.1300223621650313, 0.5197016301833773, 0.3998439225874948], [0.743696286933469, 0.13002570373019012, 0.5197373349038885, 0.399852787757999], [0.7436670400863543, 0.13002883038938273, 0.519772423175932, 0.39986055677272025], [0.74363887963025, 0.13003535813880923, 0.5198064800992501, 0.3998665347122788], [0.7436090019500929, 0.13003866248210383, 0.5198419547923614, 0.39987490608477655], [0.7435789552309993, 0.13004225893415686, 0.5198780955962474, 0.39988262521407025], [0.7435492330611094, 0.13004522720264286, 0.5199133327495923, 0.39989111433646657], [0.7435194927639512, 0.13005002021295983, 0.5199487922663432, 0.39989874911459355], [0.7434900448070964, 0.13005318519838444, 0.5199839163878502, 0.39990680038035104], [0.74345940968569, 0.1300548225495146, 0.520018977544035, 0.39991763186370766], [0.7434295503956839, 0.1300580870960698, 0.5200545114327736, 0.39992587152846415], [0.7433992604893733, 0.13005929308364678, 0.5200922791242741, 0.3999326705606245], [0.743340034573516, 0.13006650832741165, 0.5201637107247141, 0.39994750962702014], [0.7433103309155712, 0.1300694880376013, 0.520199054916849, 0.39995577692969714], [0.7432800190650294, 0.1300739255325015, 0.5202340922163088, 0.39996509404087766], [0.7432507106853742, 0.13007693157275554, 0.520269210906822, 0.39997290048288975], [0.7432218142301005, 0.13007880093418275, 0.5203036381025158, 0.39998120528011005], [0.7431922569067093, 0.13008192632518728, 0.5203389955490919, 0.39998911413737553], [0.7431632306465773, 0.13008739516925014, 0.5203745010128602, 0.3999950761304923], [0.743133477620936, 0.1300903308456758, 0.5204097542783461, 0.40000353487366586], [0.7431031083108528, 0.13009464055251413, 0.5204455447558601, 0.4000119871479317], [0.7430734655445536, 0.1300976137294367, 0.520480952998129, 0.40002001608878646], [0.7430439463923684, 0.13010238564089746, 0.5205164557562082, 0.400027101915855], [0.7430144419776519, 0.130105276817853, 0.5205520076574541, 0.4000347025953903], [0.742983774731866, 0.13010913393802281, 0.5205885757092943, 0.40004282094802546], [0.7429542032161373, 0.1301124703223462, 0.5206239823261396, 0.40005057932336857], [0.742925509543225, 0.1301143305357901, 0.520658059175389, 0.40005891275520894], [0.7428956379953269, 0.13011732141088647, 0.5206937416356484, 0.4000669708159386], [0.7428679882079562, 0.1301171392925459, 0.5207287195452758, 0.40007284686532496], [0.7428385669043015, 0.13011990061694761, 0.5207637482800914, 0.40008098362740113], [0.742809263271275, 0.13012252873046248, 0.5207981575392487, 0.40008974620564774], [0.7427510512418263, 0.13012832783328593, 0.5208679368937693, 0.40010509430711244], [0.7427215056745282, 0.13013139383180372, 0.5209032260912605, 0.40011300203276456], [0.7426912556859933, 0.130133169458373, 0.5209391355689261, 0.4001218239073958], [0.7426616086182427, 0.13013581262576424, 0.5209747071460289, 0.40012967881788736], [0.7426317227255103, 0.13013701217039056, 0.5210100237469554, 0.40013877295296113], [0.7426021883451389, 0.130139867619124, 0.5210455016959231, 0.4001464605410521], [0.7425727970007153, 0.13014378977206653, 0.521080228744684, 0.4001545080961683], [0.7425433963015009, 0.13014647672734286, 0.5211154497179032, 0.4001623261500251], [0.7425138227169454, 0.13014877070001385, 0.5211518555646009, 0.40016904428143496], [0.7424541173577901, 0.13015411171534308, 0.5212226649652997, 0.400185862254685], [0.7424244358777948, 0.13015664412878877, 0.5212582031388371, 0.4001938163704445], [0.7423942787677102, 0.1301584049052293, 0.5212955415201186, 0.40020055331888815], [0.7423647791416936, 0.1301608191000181, 0.5213310315434578, 0.4002082600483793], [0.7423343028962651, 0.13016287442433225, 0.5213665975644022, 0.40021779047067657], [0.7423047297462443, 0.13016572475127425, 0.5214022370253363, 0.4002252859594282], [0.7422752909056779, 0.13016917457383423, 0.52143802960787, 0.4002321323686047], [0.7422455864785986, 0.13017161408357045, 0.5214736517463566, 0.4002400164579234], [0.7422155275066394, 0.13017461419483953, 0.5215109227102399, 0.4002462217700247], [0.7421860353452775, 0.13017715224727378, 0.5215463733008914, 0.40025389250816285], [0.7421559456890734, 0.13018037369619068, 0.5215832726139913, 0.40026055552846584], [0.7421263815875234, 0.13018303677070717, 0.5216191858313601, 0.40026770499453895], [0.7420956074289573, 0.1301855565039731, 0.5216558086863695, 0.4002762141024218], [0.7420660067827599, 0.1301878886673591, 0.5216913894998546, 0.4002839608871873], [0.7420365792912238, 0.13019131666521183, 0.5217259392187965, 0.4002923686569889], [0.7420069917286723, 0.13019383351897676, 0.5217616213758772, 0.4002998880821911], [0.7419784563228433, 0.13019545807076008, 0.5217956542784185, 0.4003078917866506], [0.7419488037955936, 0.1301981488417498, 0.5218314319938777, 0.40031533966073335], [0.7419194381864427, 0.13020302597999023, 0.5218653836707324, 0.40032391958633534], [0.7418896326209755, 0.1302055004943224, 0.5219013018906207, 0.4003315272813425], [0.7418603379258092, 0.13020734463147945, 0.5219361343623483, 0.4003398032465819], [0.74183088706402, 0.13020948250808081, 0.5219718673878515, 0.4003470935556121], [0.7418015750994915, 0.13021118536114407, 0.5220072928005624, 0.4003546635794159], [0.7417718858248272, 0.13021346719113236, 0.5220430177231568, 0.40036234839010937], [0.7416837102997664, 0.13021741172236417, 0.5221499214252268, 0.40038501360057166], [0.7416542598723874, 0.13022020085286928, 0.5221855351004753, 0.40039221400373176], [0.7416238959666098, 0.13022342091347214, 0.5222217659064925, 0.4004001558321428], [0.7415942600547393, 0.13022533965974903, 0.5222575107793637, 0.40040780062195325], [0.741564413269167, 0.13022701355701818, 0.5222945651610298, 0.40041420194097416], [0.741534910571505, 0.1302294227547888, 0.5223302868351081, 0.4004214595990311], [0.7415055584572784, 0.1302322595383007, 0.5223662246597471, 0.4004280118663417], [0.7414761176352813, 0.13023424478538453, 0.522402022850668, 0.4004351819998103], [0.741446780373979, 0.13023455348727975, 0.5224376104246892, 0.4004429749224853], [0.7414171831690806, 0.1302364206670482, 0.5224734990076906, 0.40045034407292307], [0.7413874559239804, 0.1302393308621741, 0.5225092934761025, 0.4004577320095659], [0.7413575515325903, 0.13024161084611552, 0.5225453840298203, 0.4004652609389977], [0.7413289680329969, 0.1302442563550572, 0.522580204150319, 0.4004718780037634], [0.7412701136139139, 0.13024770476756486, 0.5226521177425834, 0.40048585229042644], [0.7412406051860015, 0.13024985049948531, 0.5226879585560454, 0.40049299575506375], [0.7412108985439069, 0.13025264950722826, 0.5227242490644952, 0.4004997011435103], [0.7411812154416527, 0.1302547125963478, 0.5227601417944007, 0.40050711588431914], [0.741151119089033, 0.13025741151678227, 0.522796279032059, 0.40051476383306434], [0.7411216237754258, 0.13025939662700126, 0.5228321327650477, 0.40052189616948203], [0.7410927201781876, 0.1302612568036166, 0.5228682354782255, 0.40052764374350464], [0.7410633120819938, 0.13026325505574043, 0.5229040297218662, 0.4005346771117107], [0.7410330775754345, 0.13026356800036598, 0.5229392066925942, 0.4005445878982943], [0.7410034921353199, 0.13026537951605652, 0.5229749946614227, 0.4005520072371173], [0.7409740658793856, 0.13026795994421603, 0.5230108379754621, 0.40055880425519186], [0.7409445013819, 0.13026935276362578, 0.5230468777236003, 0.4005659812141651], [0.7409153714300882, 0.13027037082948498, 0.5230827921442449, 0.4005726343937435], [0.74088580419981, 0.13027249997670576, 0.5231184832879383, 0.40058002112879654], [0.7408266387828721, 0.13027596486077517, 0.5231906760744323, 0.40059403480087485], [0.7407981444706025, 0.1302771708041646, 0.5232255303100822, 0.4006008142127374], [0.7407686126321118, 0.1302788782751748, 0.5232614211038243, 0.4006079899338813], [0.7407389572499421, 0.13028193298269106, 0.5232981672782043, 0.40061383310344456], [0.7406787008864756, 0.13028432200429546, 0.5233710263357407, 0.40062928785259494], [0.7406490910981258, 0.13028593882400383, 0.5234073729572736, 0.4006360192671569], [0.7406196652499275, 0.13028910908252941, 0.5234437360364735, 0.4006418783698788], [0.7405904147871313, 0.13029110873853728, 0.523479401066339, 0.4006487004450837], [0.7405600629359724, 0.13029433896753864, 0.5235168750987702, 0.40065478894442214], [0.7405304060081174, 0.13029571476980153, 0.5235527489890336, 0.40066228112477154], [0.7404994549284286, 0.13029665201105142, 0.5235898493604872, 0.40067069941795525], [0.7404699033358313, 0.13029830699602546, 0.5236258537849824, 0.4006777242320098], [0.7404414953938927, 0.13029958613516218, 0.5236610303930164, 0.4006838342129439], [0.7403538760805899, 0.13030408681992903, 0.5237670618163873, 0.4007056876146128], [0.7403251961319282, 0.13030369683716553, 0.5238014881888594, 0.40071380252485256], [0.7402958525371258, 0.13030547179048155, 0.5238372529788985, 0.400720684678632], [0.7402370641315625, 0.1303072211050495, 0.5239096445843375, 0.4007340780683344], [0.7402064528190236, 0.1303069693709167, 0.5239472977198035, 0.4007414754558866], [0.7401768758673952, 0.1303083474461588, 0.5239833850220472, 0.4007484737810875], [0.7401464243519466, 0.13030819291842954, 0.5240208994591975, 0.4007557140045982], [0.7401168617424544, 0.13030975234095601, 0.524056835482923, 0.40076281338587794], [0.740088572161698, 0.13031017833644556, 0.5240922273557029, 0.4007686365010628], [0.7400591848352814, 0.13031126983800076, 0.5241283253328388, 0.4007753416540748], [0.7400295638587787, 0.1303153257430805, 0.5241640304010389, 0.40078202270710656], [0.739999847896822, 0.13031714351948936, 0.5242000633292634, 0.4007891725373795], [0.7399694346355626, 0.13031969593971807, 0.5242370583984629, 0.4007961068386668], [0.7399399467531385, 0.13032068869968677, 0.5242733122441601, 0.4008028035884225], [0.7399105264870544, 0.13032116293993296, 0.5243091701579279, 0.40081005647555623], [0.7398809467452259, 0.13032245565415532, 0.5243453840212293, 0.40081686647556214], [0.7398502204518141, 0.1303219608351562, 0.5243828093190518, 0.4008247835552851], [0.7398206972017124, 0.1303236092748417, 0.5244188523036647, 0.4008315858388133], [0.7397911309849641, 0.13032549575779293, 0.5244546810378803, 0.40083866481282526], [0.7397614591076157, 0.13032670687983758, 0.5244908822789411, 0.4008456654363202], [0.7397330442314807, 0.13032908175903252, 0.5245260992839936, 0.40085125032833807], [0.7397034902140063, 0.1303299621977168, 0.5245623635839693, 0.4008580474805999], [0.7396437907219149, 0.13033160147169423, 0.524634489913046, 0.4008732823449548], [0.739615852229952, 0.1303353123519744, 0.5246685125466665, 0.4008790957712109], [0.7395863870733407, 0.13033636739235804, 0.5247048412673239, 0.4008855658930605], [0.7395565547796366, 0.13033800547930924, 0.5247406116516136, 0.4008932489998311], [0.7394683510320945, 0.1303410369766713, 0.5248496876743635, 0.40091218146851604], [0.7394378142691583, 0.1303417468477079, 0.5248855605597426, 0.4009213092034681], [0.739408405842961, 0.13034325214357043, 0.5249215705325213, 0.4009279121975423], [0.7393490475218871, 0.13034710764814614, 0.5249934188724095, 0.40094205017296414], [0.7393194021005983, 0.13035089385230073, 0.5250306795003291, 0.40094669437837094], [0.7392896386193016, 0.13035208590787142, 0.5250670937599736, 0.4009535022668644], [0.7392602297690078, 0.13035266799609196, 0.5251029337721541, 0.40096060102215914], [0.7392015243325826, 0.13035468179460546, 0.5251761176268362, 0.4009723292610314], [0.7391721065107879, 0.13035549203556523, 0.5252123452374957, 0.4009788461536342], [0.7391425657921156, 0.1303563599960837, 0.5252498148110678, 0.4009839384361404], [0.7391129714232793, 0.1303574436762275, 0.5252860657885936, 0.4009906500660475], [0.7390836507396041, 0.13036020731564693, 0.5253233895118543, 0.4009949002042507], [0.739053914063917, 0.13036104996977782, 0.5253598289441987, 0.4010016943721111], [0.7390243172561389, 0.13036315932810053, 0.5253968621132494, 0.4010070354440746], [0.7389949480650096, 0.13036402162855898, 0.5254332193852888, 0.4010132423818862], [0.7389657345220848, 0.13036487714698466, 0.5254695869190061, 0.4010191457173294], [0.7389073362912516, 0.13036543829066397, 0.5255432287229234, 0.4010300682214931], [0.7388774457161268, 0.1303668797155909, 0.5255798038573026, 0.4010367397914462], [0.7388490105089259, 0.13036939308510198, 0.5256157573664134, 0.4010411906833698], [0.738819548925962, 0.13036977779627423, 0.5256523192763144, 0.4010474216369179], [0.7387606357575871, 0.13036946834153376, 0.5257245651642253, 0.40106134987340525], [0.7387315582635181, 0.13037028191236008, 0.5257612627988647, 0.401066539317093], [0.7387018684400661, 0.13037132661738535, 0.5257976450174587, 0.4010731893972383], [0.7386723014790151, 0.1303710492284695, 0.5258338580356553, 0.4010802591677898], [0.7386130146337441, 0.13037274291705142, 0.5259069512783151, 0.40109305792432404], [0.738583484016377, 0.13037303985316012, 0.5259434773176922, 0.4010994468765206], [0.738554510897978, 0.13037245620078985, 0.5259801189601752, 0.4011049383329277], [0.7385249650379627, 0.13037333729261807, 0.5260166374027094, 0.4011111642854235], [0.7384963733511798, 0.13037371672576648, 0.5260530274680443, 0.4011159593259407], [0.7384671543778681, 0.13037437362044538, 0.5260892418091739, 0.4011220440972786], [0.7384366411872507, 0.1303739918867188, 0.5261274009402027, 0.4011282926589953], [0.7384068731221748, 0.13037454556497305, 0.5261641175090325, 0.40113475172390695], [0.7383768860561601, 0.13037092683260976, 0.5262011155158062, 0.40114259510146233], [0.7383476720748776, 0.13037120795514112, 0.5262372986344187, 0.4011488112956042], [0.7383184686296618, 0.1303712142282359, 0.5262724053166679, 0.4011565041018473], [0.7382889356256043, 0.1303714421647503, 0.5263088514530306, 0.40116296873326573], [0.7382610458229079, 0.13037293569838124, 0.5263449392082377, 0.40116646274050466], [0.7382314546056995, 0.13037374080921293, 0.5263813891044297, 0.40117283101259027], [0.73817160442661, 0.13037771912388313, 0.5264538496076544, 0.40118658627573706], [0.7381420228297728, 0.13037742679695422, 0.5264890335066533, 0.4011949380435974], [0.7381125281153785, 0.13037779683014541, 0.5265255145770724, 0.4012012069176649], [0.7380829827520946, 0.13037702835290682, 0.5265608811131565, 0.40120939611501255], [0.7380227073379737, 0.13037807118477504, 0.5266355180441041, 0.4012219748992864], [0.7379932168313061, 0.13037837557887383, 0.5266721151948196, 0.4012280824775475], [0.7379642386544485, 0.13037818130762946, 0.5267093397015916, 0.401232580652654], [0.7379346726329372, 0.13037838992961576, 0.5267460842474521, 0.4012386535410779], [0.737905244799136, 0.13037964330588508, 0.5267829571253084, 0.401243958698038]], \"angular_velocities\": [[-0.00031397367193835917, -0.0008289185131689828, -0.00031002768304663796], [-0.00031641058130567475, -0.0008233533757347776, -0.00031151744173312684], [-0.0003340412971066691, -0.0008354507283867634, -0.00030650676805793454], [-0.00032158129721352873, -0.0008222716313972317, -0.00032205142940499177], [-0.0003250693975834002, -0.0008163218443964685, -0.0003025729565177834], [-0.00032911519485940107, -0.0008375745048962251, -0.0003090887564446531], [-0.00030469916561464924, -0.0008269588520756164, -0.0002995509518387735], [-0.00032367170260794094, -0.0008216726336267665, -0.0003148772643106041], [-0.00032023175787264987, -0.0008259400565240195, -0.0003090803002115993], [-0.0003143043314593417, -0.0008296976770800882, -0.00030600239798701345], [-0.00032217273678149916, -0.0008248397713065006, -0.00029608353541823085], [-0.000340108290800849, -0.0008246798132778452, -0.00030167973167009914], [-0.0003214468589131219, -0.0008291686634354563, -0.0003159494330926173], [-0.0003071673427695539, -0.000825278939128559, -0.00030310404874684847], [-0.0003189690568195054, -0.000825801015643742, -0.0003034545922431226], [-0.00031796888463241026, -0.0008421534327021148, -0.0003239745972968645], [-0.00032157182811158255, -0.000830100988630304, -0.0002927056831357512], [-0.00032347249394194333, -0.0008122752795638512, -0.00028854618325745667], [-0.0003266311778645392, -0.0008321283472969422, -0.0003053807876597397], [-0.0003203894429148495, -0.0008351120606562843, -0.0003058179957345974], [-0.00032573803307957565, -0.0008317876833720064, -0.00030291521932065296], [-0.0003044101042465906, -0.0008310839503547555, -0.00030328459587541565], [-0.0003144901814753201, -0.0008294086284171835, -0.0002980065490266042], [-0.0003274780415823707, -0.0008188701567283122, -0.0002954959202783097], [-0.000327888074554254, -0.0008348150378062242, -0.00030329793160800906], [-0.00032162283152200883, -0.0008336229631624498, -0.0003024598982212732], [-0.0003214708702834838, -0.0008243688755677718, -0.0003067228609906783], [-0.0003152999658930333, -0.0008358153722998953, -0.000295702237115378], [-0.00032107740493469343, -0.0008288107604780739, -0.00030369258380171156], [-0.0003346102109335658, -0.0008240428367002333, -0.00029105608294970856], [-0.0003068595220606778, -0.0008224535022293435, -0.00028963133720538524], [-0.00032590758465540456, -0.0008352510622317079, -0.00029603337160679255], [-0.0003217847837211666, -0.0008221160884834941, -0.00029301329410475927], [-0.0003264059180575481, -0.0008364728958583398, -0.0003024335751059596], [-0.0003038410664306958, -0.0008278140119753336, -0.000302726619456499], [-0.00033036189074306437, -0.0008278278728321072, -0.00028673598781271984], [-0.00031182243496703826, -0.0008356434441933707, -0.00030382874078643113], [-0.00032553266719783063, -0.0008345484773698154, -0.00028903832342232503], [-0.00032467687506070714, -0.0008299112184257472, -0.00028388758907691916], [-0.0003279256249713665, -0.0008303808108363035, -0.00030165841772107415], [-0.00033018975156745865, -0.0008246496803695961, -0.00028727683447529013], [-0.0003240532488197048, -0.0008344986731598494, -0.0003053558982954893], [-0.0003233277383149569, -0.0008421870407585895, -0.0002885722095324222], [-0.00031464557152799334, -0.0008307738484372835, -0.0002759354012636426], [-0.0003114819777530311, -0.0008210855925430311, -0.00031187712813433334], [-0.0003269946540042756, -0.0008367169739216071, -0.0002875235932999103], [-0.0003231480894495386, -0.0008150331444016709, -0.0002925127968343218], [-0.0003218273099966735, -0.000841233382961986, -0.0002954647236653443], [-0.00032016395139132276, -0.000839317184052161, -0.0002781185353122762], [-0.0003180548111456137, -0.0008335970916622635, -0.0002995150067681815], [-0.0003204808003110823, -0.0008411274553719752, -0.00028536375392020953], [-0.0003256746512903969, -0.0008226520429642269, -0.00029038058322426063], [-0.0003207063220525993, -0.0008201336794739207, -0.00028749228457136515], [-0.000312711951988666, -0.0008365340929708497, -0.00028786182515379787], [-0.0003219090551562357, -0.0008353332288986153, -0.0002857681583141004], [-0.00031143662747791463, -0.0008341334822404391, -0.0002863035785152222], [-0.00032168738195232217, -0.0008408383742365935, -0.00029276854561892726], [-0.0003200123781098072, -0.0008201054144498106, -0.0002798223757075358], [-0.00031255890872427194, -0.0008505162770440681, -0.00028697109812695634], [-0.0003296464824873057, -0.0008367384250711055, -0.0002820882298027906], [-0.0003233969354679111, -0.0008316209858499099, -0.00028769434096621936], [-0.00031594352546042437, -0.0008350985245656997, -0.00028405618016130187], [-0.0003170875623035976, -0.0008437721507614595, -0.0002908996344647808], [-0.00032016511667309845, -0.0008314007800930319, -0.00029063576092146687], [-0.00031634673001581636, -0.0008355128468464596, -0.00027748927918538554], [-0.0003322662812773483, -0.0008451777017353249, -0.00028372786947269784], [-0.0003265821575169646, -0.0008324282240899611, -0.00027035927712952394], [-0.0003096440112621585, -0.000838065364743949, -0.00028976521272587493], [-0.0003217384693605732, -0.0008383907138929604, -0.00027752021888786417], [-0.0003292005822420592, -0.0008383834322733346, -0.000283665726941188], [-0.000313954492036024, -0.0008372740827406217, -0.0002798995451965803], [-0.0003224207103396453, -0.0008455771487031515, -0.000272641190826197], [-0.0003293281612291132, -0.000830887366268847, -0.0002929102367556827], [-0.000322820392608406, -0.000841322324753147, -0.00029511533353608296], [-0.0003222999718288358, -0.0008471262542704865, -0.00027224884221018744], [-0.00031702831818435887, -0.0008359324128720217, -0.00027200332972071557], [-0.0003197865195728967, -0.0008427427538064606, -0.000274630415661042], [-0.0003157849212776753, -0.0008423527262538554, -0.00029563882942933866], [-0.00031776323832178796, -0.0008412053490740764, -0.000269246720983585], [-0.0003166323117379423, -0.0008376917700126852, -0.00027286160542755146], [-0.0003394707687137446, -0.0008270232131010864, -0.0002852905967270111], [-0.0003149400212712724, -0.0008449431054287008, -0.00027328878076158494], [-0.00030930046199084996, -0.0008435991065145898, -0.00028196992233221215], [-0.00031860992082553754, -0.000844032561473515, -0.00026919408356054623], [-0.0003270240032232711, -0.0008312847987124831, -0.0002828569828471124], [-0.0003178275768046053, -0.0008374161762504821, -0.0002826113081186504], [-0.0003180293370371469, -0.0008448828199257499, -0.0002563435863797364], [-0.0003059380955202648, -0.0008441317387216664, -0.000277961301429118], [-0.00032430908109110275, -0.0008475166829744976, -0.00026702806650565764], [-0.0003102081503203243, -0.000846970167610123, -0.00028373691573942736], [-0.0003340119828540251, -0.0008509216916445156, -0.00027817210445829925], [-0.0003109465742649443, -0.0008394115003870026, -0.0002698015490521435], [-0.0003195070370380948, -0.0008399993694678595, -0.00026444457486727956], [-0.000322562125249292, -0.0008425708661039459, -0.00027801477127574654], [-0.0003161513375815483, -0.0008388955431920668, -0.0002764652780330387], [-0.0003196253322876707, -0.0008515592179613847, -0.0002747058513482947], [-0.00030948310190655496, -0.000848467058874664, -0.0002774458461373574], [-0.00032854858595010486, -0.0008367607272512899, -0.0002614426340520596], [-0.00031746180506281004, -0.0008352728531876579, -0.00025170367369987305], [-0.00032149390605924614, -0.0008453583092321872, -0.0002831472114976], [-0.00029702798252271293, -0.0008439571686817446, -0.00027345805972613227], [-0.0003291113368470481, -0.0008453590144099988, -0.00027154907625418943], [-0.00031910884234859216, -0.000857050260186913, -0.00027459314949300197], [-0.00030344246726066897, -0.0008448917923065115, -0.00025316742850502893], [-0.00031850835331914576, -0.0008388734497529111, -0.00027854681503398297], [-0.0003161398580940073, -0.0008419440818863892, -0.0002726529411189001], [-0.000312445151697529, -0.0008516289163104725, -0.00027538592045447496], [-0.0003082122226497621, -0.0008407296204765914, -0.0002649074063943489], [-0.0003211322382193297, -0.0008510092217977759, -0.00026945626971994544], [-0.0003150752671761826, -0.0008418370399854116, -0.0002674543800771591], [-0.0003210357709003566, -0.0008456681661457826, -0.00025507759872251236], [-0.00032254677371320554, -0.0008601800452941625, -0.0002636317147934501], [-0.00031344205866089996, -0.0008339580145703403, -0.00026905881512470913], [-0.00032723237139026446, -0.0008387258105811746, -0.0002577981169040137], [-0.0003004129273534655, -0.0008615543712863405, -0.0002688332207825513], [-0.0003128987569067233, -0.0008390992327460674, -0.00027024900523626023], [-0.00031209872204709433, -0.0008486000983155275, -0.0002670987821676614], [-0.0003207109767317807, -0.0008468898303787053, -0.0002617045586245587], [-0.0003125810378362063, -0.0008515249055180133, -0.00026564609100790046], [-0.0003117544917632762, -0.0008491056861688209, -0.0002565813233288748], [-0.00032087286886172317, -0.000844764058661535, -0.00027362041594540705], [-0.00031391555267110214, -0.000836609252961924, -0.00025130233912498223], [-0.00032083346003547783, -0.0008599752131434109, -0.00025726239814751037], [-0.00030623889150231074, -0.000839563133338412, -0.00026190296174427585], [-0.0003207613319554113, -0.0008629256408943523, -0.00026008020764614533], [-0.00030809175883473965, -0.00085138236743224, -0.0002757510922255632], [-0.0003195684383989926, -0.0008442362110254996, -0.0002538799272737753], [-0.00030374976627313443, -0.0008458087753999677, -0.0002448544472649471], [-0.00031993107382265613, -0.0008563307108323153, -0.00025967005138849414], [-0.00031521009017600996, -0.0008424082244988607, -0.0002598183976317095], [-0.0003212898373761559, -0.0008555001886176948, -0.0002786555667376715], [-0.0003111704511472086, -0.0008610772734908156, -0.00025102941124590565], [-0.0003126000377664975, -0.0008491640274129903, -0.0002518553414881928], [-0.00031853884289291296, -0.0008498705234611428, -0.00027168681421873864], [-0.0003116079569258583, -0.0008568686521624461, -0.0002424346759888235], [-0.0003053864260658808, -0.0008466191417009185, -0.00026088779404239836], [-0.0003321292475994762, -0.0008481463526450084, -0.0002605762657725642], [-0.0003134738787655975, -0.0008520980462144982, -0.0002584102541871872], [-0.0003104352517096874, -0.0008587628381750076, -0.00026144505037492874], [-0.0003149938891896931, -0.0008537465590483809, -0.00024443459265456103], [-0.0003039947493882623, -0.0008609614995384137, -0.00025987311068468146], [-0.0003047891830210988, -0.0008486996141846359, -0.0002545411870330258], [-0.00031932227469798867, -0.0008588828217854079, -0.00024265234436048058], [-0.000312045091465401, -0.0008511585941616707, -0.00025401656614693], [-0.0003034019558499184, -0.0008544170434125044, -0.0002690990368111322], [-0.0003138858490964461, -0.0008517519746675441, -0.000256576860583613], [-0.00032192259760586517, -0.0008355153893270508, -0.0002576374160489089], [-0.0003146998229418042, -0.0008573055929816863, -0.0002534122086299627], [-0.00030561376813230845, -0.0008575987185287508, -0.0002482117354312965], [-0.00032390868725445444, -0.000860836881514962, -0.00025308531811365776], [-0.0003074771166099438, -0.0008576902223996428, -0.0002608322994977541], [-0.00030263171598586975, -0.0008487984618462975, -0.00025630495049219624], [-0.00031336961366868415, -0.0008590612459060638, -0.0002499512536705131], [-0.0003080718292095013, -0.0008508781923516975, -0.00024255176113114512], [-0.0003098137833848436, -0.0008582044154752605, -0.00025793911100012586], [-0.0003169181811637284, -0.0008531699841145635, -0.000248751794473588], [-0.0003182139440711128, -0.00086361933391174, -0.00026091132074432786], [-0.0003034002720167348, -0.0008602547494349017, -0.00024480542460261296], [-0.00031521128889171754, -0.0008591285320724694, -0.00024264999512512944], [-0.00031618835762958254, -0.0008512862715487551, -0.0002405536299292223], [-0.0003138386951842363, -0.0008500947110314578, -0.00025131565785163146], [-0.00032551793391633505, -0.0008657318897673463, -0.0002657751738569655], [-0.00031946993334709315, -0.0008552705941082002, -0.00025032546243043365], [-0.00030601831085982293, -0.000856060616400625, -0.00023855563348259624], [-0.00031446233232511187, -0.0008701019957693559, -0.00023567897977298612], [-0.0003227050716966117, -0.0008663717169939284, -0.00025056571232767754], [-0.0003114447725885459, -0.0008512941725035163, -0.0002535311631512418], [-0.00031800647790532796, -0.0008659004012384703, -0.0002514432445807689], [-0.00032438474197305086, -0.0008655453356806518, -0.00023497166330548288], [-0.00031421460428072685, -0.0008640489442637289, -0.00023804910202191712], [-0.0003001359428116847, -0.0008648585495913408, -0.00024010154795690847], [-0.0003133945404504865, -0.0008632609816873748, -0.0002479237288199309], [-0.0003215907022404136, -0.0008554559520398457, -0.00023793283117745314], [-0.0003161719968147657, -0.0008412515775367885, -0.0002284021889606756], [-0.00030856828502684626, -0.00086459740586424, -0.0002453454058025501], [-0.000314625932438035, -0.0008699295987602163, -0.0002528576394700905], [-0.0003101440072179676, -0.0008657977658230241, -0.00023591996117887335], [-0.00031198638269001156, -0.0008581391243328251, -0.00023138497726795857], [-0.0002984585428240502, -0.0008533425583858197, -0.0002381322707297113], [-0.0002991230873701856, -0.0008648847710866672, -0.0002352207772380923], [-0.0003101731772620389, -0.0008634186274383888, -0.0002443285312843749], [-0.0003157760223210286, -0.0008586106581548528, -0.00023948764963980897], [-0.00031306426401701414, -0.0008607960948537755, -0.00024993343229743324], [-0.0003054068617003866, -0.0008735905885189101, -0.00023095926432491228], [-0.0003116806355212211, -0.0008591954812643257, -0.00023537945793133947], [-0.0003063346607079012, -0.0008655763699292185, -0.00024055510547301204], [-0.0003057350224394181, -0.0008705501152520719, -0.00024574945328234663], [-0.0003130015543362897, -0.0008727618680101623, -0.0002275600528003086], [-0.00030839627817041656, -0.000855688574135399, -0.00024179119463860408], [-0.0003197588718898237, -0.000868997957841256, -0.00023860757828592552], [-0.0003024668240729033, -0.0008669264456783237, -0.00022783355485705005], [-0.00031707795203616385, -0.0008603925217827754, -0.00024050635457889462]], \"reference_frame\": 1, \"constant_frames\": [-74021, -74000], \"constant_rotation\": [0.9999995608798441, -1.5196024192803595e-05, 0.0009370214510594063, 1.527655207535679e-05, 0.9999999961910578, -8.593317911879546e-05, -0.0009370201416476769, 8.594745584079727e-05, 0.9999995573030465]}, \"naif_keywords\": {\"BODY499_RADII\": [3396.19, 3396.19, 3376.2], \"BODY_FRAME_CODE\": 10014, \"INS-74021_FOCAL_LENGTH\": 352.9271664, \"INS-74021_PIXEL_PITCH\": 0.007, \"CLOCK_ET_-74_0947661018:204_COMPUTED\": \"ad4346bee2dcb241\", \"INS-74021_TRANSX\": [0.0, 0.0, 0.007], \"INS-74021_TRANSY\": [0.0, 0.007, 0.0], \"INS-74021_ITRANSS\": [0.0, 0.0, 142.85714285714], \"INS-74021_ITRANSL\": [0.0, 142.85714285714, 0.0], \"INS-74021_BORESIGHT_SAMPLE\": 2543.46099, \"INS-74021_BORESIGHT_LINE\": 0.430442527, \"INS-74021_OD_K\": [-0.0073433925920055, 2.83758786362417e-05, 1.28419891240271e-08]}, \"detector_sample_summing\": 1, \"detector_line_summing\": 1, \"focal_length_model\": {\"focal_length\": 352.9271664}, \"detector_center\": {\"line\": 0.430442527, \"sample\": 2542.96099}, \"starting_detector_line\": 0, \"starting_detector_sample\": 0, \"focal2pixel_lines\": [0.0, 142.85714285714, 0.0], \"focal2pixel_samples\": [0.0, 0.0, 142.85714285714], \"optical_distortion\": {\"radial\": {\"coefficients\": [-0.0073433925920055, 2.83758786362417e-05, 1.28419891240271e-08]}}, \"instrument_position\": {\"spk_table_start_time\": 316465854.27447015, \"spk_table_end_time\": 316465875.41699815, \"spk_table_original_size\": 4, \"ephemeris_times\": [316465854.27447015, 316465864.8457341, 316465870.13136613, 316465875.41699815], \"positions\": [[3419.0225469743214, -862.0205927762719, -1018.2289848181613], [3425.1942225687953, -876.3993567449721, -985.7084859975412], [3428.1554515441703, -883.5568838408227, -969.4123466923884], [3431.033526588667, -890.6929457885556, -953.0928140648241]], \"velocities\": [[0.5995209639868916, -1.3641598359957334, 3.0717090236986904], [0.5681034478837016, -1.356167557691635, 3.0808632134140286], [0.5523770358965939, -1.3521227111285625, 3.085326903217431], [0.5366393674756762, -1.3480455321558822, 3.0897148741442417]], \"reference_frame\": 1}, \"sun_position\": {\"spk_table_start_time\": 316465854.27447015, \"spk_table_end_time\": 316465875.41699815, \"spk_table_original_size\": 2, \"ephemeris_times\": [316465854.27447015, 316465875.41699815], \"positions\": [[127178489.44098486, -188725984.04887146, -89998602.33361094], [127178907.62976173, -188725777.3970061, -89998518.84293787]], \"velocities\": [[19.779518998362125, 9.774208811586723, 3.948936048608273], [19.779494651781395, 9.774244940767066, 3.948953275468666]], \"reference_frame\": 1}}"
  },
  {
    "path": "src/asp/Camera/tests/dg_example1.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<isd>\n\t<IMD>\n\t\t<VERSION>AA</VERSION>\n\t\t<BANDID>P</BANDID>\n\t\t<NUMROWS>23708</NUMROWS>\n\t\t<NUMCOLUMNS>35170</NUMCOLUMNS>\n\t\t<RADIOMETRICLEVEL>Corrected</RADIOMETRICLEVEL>\n\t\t<BITSPERPIXEL>16</BITSPERPIXEL>\n\t\t<COMPRESSIONTYPE>None</COMPRESSIONTYPE>\n\t\t<OUTPUTFORMAT>GeoTIFF</OUTPUTFORMAT>\n\t\t<IMAGE>\n\t\t\t<SATID>Imaginary1</SATID>\n\t\t\t<MODE>FullSwath</MODE>\n\t\t\t<SCANDIRECTION>Forward</SCANDIRECTION>\n\t\t\t<TLCTIME>1959-11-25T17:39:48.740958Z</TLCTIME>\n\t\t\t<NUMTLC>2</NUMTLC>\n\t\t\t<TLCLISTList>\n\t\t\t\t<TLCLIST>0.000000000000000e+00 0.000000000000000e+00</TLCLIST>\n\t\t\t\t<TLCLIST>2.370800000000000e+04 1.975667000000000e+00</TLCLIST>\n\t\t\t</TLCLISTList>\n\t\t\t<FIRSTLINETIME>1959-11-25T17:39:48.740958Z</FIRSTLINETIME>\n\t\t\t<AVGLINERATE>1.200000000000000e+04</AVGLINERATE>\n\t\t\t<EXPOSUREDURATION>2.666670000000000e-03</EXPOSUREDURATION>\n\t\t\t<MINCOLLECTEDROWGSD>7.290000000000000e-01</MINCOLLECTEDROWGSD>\n\t\t\t<MAXCOLLECTEDROWGSD>7.320000000000000e-01</MAXCOLLECTEDROWGSD>\n\t\t\t<MEANCOLLECTEDROWGSD>7.310000000000000e-01</MEANCOLLECTEDROWGSD>\n\t\t\t<MINCOLLECTEDCOLGSD>6.720000000000000e-01</MINCOLLECTEDCOLGSD>\n\t\t\t<MAXCOLLECTEDCOLGSD>6.720000000000000e-01</MAXCOLLECTEDCOLGSD>\n\t\t\t<MEANCOLLECTEDCOLGSD>6.720000000000000e-01</MEANCOLLECTEDCOLGSD>\n\t\t\t<MEANCOLLECTEDGSD>7.010000000000000e-01</MEANCOLLECTEDGSD>\n\t\t\t<ROWUNCERTAINTY>5.732000000000000e+01</ROWUNCERTAINTY>\n\t\t\t<COLUNCERTAINTY>3.417000000000000e+01</COLUNCERTAINTY>\n\t\t\t<MINSUNAZ>1.619000000000000e+02</MINSUNAZ>\n\t\t\t<MAXSUNAZ>1.620000000000000e+02</MAXSUNAZ>\n\t\t\t<MEANSUNAZ>1.619000000000000e+02</MEANSUNAZ>\n\t\t\t<MINSUNEL>2.750000000000000e+01</MINSUNEL>\n\t\t\t<MAXSUNEL>2.770000000000000e+01</MAXSUNEL>\n\t\t\t<MEANSUNEL>2.760000000000000e+01</MEANSUNEL>\n\t\t\t<MINSATAZ>2.660000000000000e+01</MINSATAZ>\n\t\t\t<MAXSATAZ>2.720000000000000e+01</MAXSATAZ>\n\t\t\t<MEANSATAZ>2.690000000000000e+01</MEANSATAZ>\n\t\t\t<MINSATEL>5.200000000000000e+01</MINSATEL>\n\t\t\t<MAXSATEL>5.320000000000000e+01</MAXSATEL>\n\t\t\t<MEANSATEL>5.260000000000000e+01</MEANSATEL>\n\t\t\t<MININTRACKVIEWANGLE>3.240000000000000e+01</MININTRACKVIEWANGLE>\n\t\t\t<MAXINTRACKVIEWANGLE>3.270000000000000e+01</MAXINTRACKVIEWANGLE>\n\t\t\t<MEANINTRACKVIEWANGLE>3.260000000000000e+01</MEANINTRACKVIEWANGLE>\n\t\t\t<MINCROSSTRACKVIEWANGLE>1.170000000000000e+01</MINCROSSTRACKVIEWANGLE>\n\t\t\t<MAXCROSSTRACKVIEWANGLE>1.210000000000000e+01</MAXCROSSTRACKVIEWANGLE>\n\t\t\t<MEANCROSSTRACKVIEWANGLE>1.190000000000000e+01</MEANCROSSTRACKVIEWANGLE>\n\t\t\t<MINOFFNADIRVIEWANGLE>3.440000000000000e+01</MINOFFNADIRVIEWANGLE>\n\t\t\t<MAXOFFNADIRVIEWANGLE>3.440000000000000e+01</MAXOFFNADIRVIEWANGLE>\n\t\t\t<MEANOFFNADIRVIEWANGLE>3.440000000000000e+01</MEANOFFNADIRVIEWANGLE>\n\t\t\t<PNIIRS>4.200000000000000e+00</PNIIRS>\n\t\t\t<CLOUDCOVER>0.000000000000000e+00</CLOUDCOVER>\n\t\t\t<RESAMPLINGKERNEL>CC</RESAMPLINGKERNEL>\n\t\t\t<TDILEVEL>32</TDILEVEL>\n\t\t\t<POSITIONKNOWLEDGESRC>R</POSITIONKNOWLEDGESRC>\n\t\t\t<ATTITUDEKNOWLEDGESRC>R</ATTITUDEKNOWLEDGESRC>\n\t\t</IMAGE>\n\t</IMD>\n\t<EPH>\n\t\t<SATID>Imaginary1</SATID>\n\t\t<GENERATIONTIME>1959-11-25T19:05:33.862633Z</GENERATIONTIME>\n\t\t<STARTTIME>1959-11-25T17:39:40.987511Z</STARTTIME>\n\t\t<NUMPOINTS>840</NUMPOINTS>\n\t\t<TIMEINTERVAL>2.000000000000000e-02</TIMEINTERVAL>\n\t\t<EPHEMLISTList>\n\t\t\t<EPHEMLIST>1.000000000000000e+00 -1.150529111070304e+06 -4.900037170821411e+06 4.673402253879593e+06 -2.844266339347013e+03 -4.580208925894603e+03 -5.486888667664808e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.000000000000000e+00 -1.150585995837413e+06 -4.900128772944907e+06 4.673292515863864e+06 -2.844251584254513e+03 -4.580080713915985e+03 -5.487003834508436e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.000000000000000e+00 -1.150642880303100e+06 -4.900220372492305e+06 4.673182775558697e+06 -2.844236826943937e+03 -4.579952496310532e+03 -5.487119001767498e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.000000000000000e+00 -1.150699764494275e+06 -4.900311969514028e+06 4.673073032904602e+06 -2.844222067857655e+03 -4.579824274595800e+03 -5.487234167951268e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.000000000000000e+00 -1.150756648380619e+06 -4.900403563953296e+06 4.672963287968581e+06 -2.844207307142466e+03 -4.579696052627004e+03 -5.487349329716501e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.000000000000000e+00 -1.150813531973219e+06 -4.900495155830931e+06 4.672853540726059e+06 -2.844192543983192e+03 -4.579567828490194e+03 -5.487464489059428e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.000000000000000e+00 -1.150870415294624e+06 -4.900586745189165e+06 4.672743791127197e+06 -2.844177779207410e+03 -4.579439598388071e+03 -5.487579648831945e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.000000000000000e+00 -1.150927298277373e+06 -4.900678331901664e+06 4.672634039321106e+06 -2.844163013479430e+03 -4.579311373453886e+03 -5.487694799271948e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.000000000000000e+00 -1.150984180988860e+06 -4.900769916094676e+06 4.672524285158779e+06 -2.844148245986792e+03 -4.579183142428841e+03 -5.487809950315375e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.000000000000000e+01 -1.151041063417754e+06 -4.900861497747016e+06 4.672414528665220e+06 -2.844133475840487e+03 -4.579054907747178e+03 -5.487925100296267e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.100000000000000e+01 -1.151097945507887e+06 -4.900953076753495e+06 4.672304769964599e+06 -2.844118705172034e+03 -4.578926677823406e+03 -5.488040241099258e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.200000000000000e+01 -1.151154827371495e+06 -4.901044653324357e+06 4.672195008808733e+06 -2.844103931308538e+03 -4.578798434954264e+03 -5.488155388977065e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.300000000000000e+01 -1.151211708907560e+06 -4.901136227270410e+06 4.672085245420964e+06 -2.844089156197057e+03 -4.578670195508489e+03 -5.488270529139892e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.400000000000000e+01 -1.151268590149601e+06 -4.901227798654475e+06 4.671975479727124e+06 -2.844074379018060e+03 -4.578541953612254e+03 -5.488385666949694e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.500000000000000e+01 -1.151325471075321e+06 -4.901319367434779e+06 4.671865711776550e+06 -2.844059601800196e+03 -4.578413712984060e+03 -5.488500798328534e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.600000000000000e+01 -1.151382351740661e+06 -4.901410933716147e+06 4.671755941445468e+06 -2.844044821060139e+03 -4.578285464949879e+03 -5.488615932223071e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.700000000000000e+01 -1.151439232123080e+06 -4.901502497456396e+06 4.671646168783685e+06 -2.844030037785475e+03 -4.578157213251616e+03 -5.488731065006846e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.800000000000000e+01 -1.151496112155442e+06 -4.901594058529757e+06 4.671536393939713e+06 -2.844015255598032e+03 -4.578028967718285e+03 -5.488846186690504e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.900000000000000e+01 -1.151552991938527e+06 -4.901685617125041e+06 4.671426616690597e+06 -2.844000469617523e+03 -4.577900713024012e+03 -5.488961312502534e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.000000000000000e+01 -1.151609871416160e+06 -4.901777173137079e+06 4.671316837160538e+06 -2.843985681735768e+03 -4.577772458286071e+03 -5.489076433841945e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.100000000000000e+01 -1.151666750610898e+06 -4.901868726608082e+06 4.671207055299672e+06 -2.843970892771224e+03 -4.577644199024388e+03 -5.489191554142876e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.200000000000000e+01 -1.151723629500114e+06 -4.901960277495755e+06 4.671097271157968e+06 -2.843956101303744e+03 -4.577515939868817e+03 -5.489306670116709e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.300000000000000e+01 -1.151780508061520e+06 -4.902051825758324e+06 4.670987484784760e+06 -2.843941310398315e+03 -4.577387683219245e+03 -5.489421778337507e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.400000000000000e+01 -1.151837386373473e+06 -4.902143371542585e+06 4.670877696006669e+06 -2.843926515631169e+03 -4.577259417541747e+03 -5.489536890603293e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.500000000000000e+01 -1.151894264402217e+06 -4.902234914785371e+06 4.670767904898304e+06 -2.843911718023092e+03 -4.577131148313282e+03 -5.489652001800463e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.600000000000000e+01 -1.151951142103047e+06 -4.902326455402927e+06 4.670658111558600e+06 -2.843896921042729e+03 -4.577002881675212e+03 -5.489767105143569e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.700000000000000e+01 -1.152008019509473e+06 -4.902417993458058e+06 4.670548315913371e+06 -2.843882121649303e+03 -4.576874612858939e+03 -5.489882206058975e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.800000000000000e+01 -1.152064896632588e+06 -4.902509528971580e+06 4.670438517938030e+06 -2.843867319682478e+03 -4.576746340501584e+03 -5.489997305776314e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.900000000000000e+01 -1.152121773472520e+06 -4.902601061943715e+06 4.670328717632309e+06 -2.843852516488502e+03 -4.576618063637789e+03 -5.490112404505194e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.000000000000000e+01 -1.152178649973106e+06 -4.902692592269323e+06 4.670218915120433e+06 -2.843837712704800e+03 -4.576489791849443e+03 -5.490227493822896e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.100000000000000e+01 -1.152235526246320e+06 -4.902784120158154e+06 4.670109110154591e+06 -2.843822904164006e+03 -4.576361507616246e+03 -5.490342590489337e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.200000000000000e+01 -1.152292402191408e+06 -4.902875645421492e+06 4.669999302957743e+06 -2.843808096122985e+03 -4.576233225949493e+03 -5.490457679381193e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.300000000000000e+01 -1.152349277796962e+06 -4.902967168038044e+06 4.669889493555067e+06 -2.843793286913500e+03 -4.576104949464185e+03 -5.490572759035058e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.400000000000000e+01 -1.152406153186410e+06 -4.903058688238930e+06 4.669779681673459e+06 -2.843778474140327e+03 -4.575976658274283e+03 -5.490687847413945e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.500000000000000e+01 -1.152463028269964e+06 -4.903150205856049e+06 4.669669867511555e+06 -2.843763659399241e+03 -4.575848366705903e+03 -5.490802931635549e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.600000000000000e+01 -1.152519903036292e+06 -4.903241720868234e+06 4.669560051094379e+06 -2.843748843207369e+03 -4.575720076748883e+03 -5.490918009777291e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.700000000000000e+01 -1.152576777496739e+06 -4.903333233296691e+06 4.669450232396863e+06 -2.843734026809636e+03 -4.575591785692230e+03 -5.491033083576515e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.800000000000000e+01 -1.152633651662393e+06 -4.903424743162243e+06 4.669340411394418e+06 -2.843719207983936e+03 -4.575463492932561e+03 -5.491148154551486e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.900000000000000e+01 -1.152690525544347e+06 -4.903516250485696e+06 4.669230588062446e+06 -2.843704386635668e+03 -4.575335196288773e+03 -5.491263224595757e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.000000000000000e+01 -1.152747399142728e+06 -4.903607755267271e+06 4.669120762400682e+06 -2.843689563948833e+03 -4.575206895288075e+03 -5.491378293574211e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.100000000000000e+01 -1.152804272434999e+06 -4.903699257464811e+06 4.669010934458954e+06 -2.843674739451556e+03 -4.575078594068126e+03 -5.491493358189720e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.200000000000000e+01 -1.152861145409841e+06 -4.903790757057165e+06 4.668901104262288e+06 -2.843659913643468e+03 -4.574950294300805e+03 -5.491608416797939e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.300000000000000e+01 -1.152918018134627e+06 -4.903882254170460e+06 4.668791271661562e+06 -2.843645085271854e+03 -4.574821984989120e+03 -5.491723479295699e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.400000000000000e+01 -1.152974890530784e+06 -4.903973748657627e+06 4.668681436830656e+06 -2.843630255873566e+03 -4.574693678917060e+03 -5.491838534141622e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.500000000000000e+01 -1.153031762631818e+06 -4.904065240581444e+06 4.668571599695355e+06 -2.843615424267048e+03 -4.574565370809171e+03 -5.491953586346244e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.600000000000000e+01 -1.153088634482690e+06 -4.904156730026064e+06 4.668461760156151e+06 -2.843600590214636e+03 -4.574437053293622e+03 -5.492068642270134e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.700000000000000e+01 -1.153145505993540e+06 -4.904248216823312e+06 4.668351918411899e+06 -2.843585755024012e+03 -4.574308740734860e+03 -5.492183689136757e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.800000000000000e+01 -1.153202377242944e+06 -4.904339701120278e+06 4.668242074288663e+06 -2.843570917922168e+03 -4.574180420390991e+03 -5.492298738103873e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.900000000000000e+01 -1.153259248152341e+06 -4.904431182769935e+06 4.668132227960333e+06 -2.843556080060214e+03 -4.574052105153576e+03 -5.492413777716386e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.000000000000000e+01 -1.153316118788852e+06 -4.904522661897971e+06 4.668022379278250e+06 -2.843541239267616e+03 -4.573923784110380e+03 -5.492528818211897e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.100000000000000e+01 -1.153372989130191e+06 -4.904614138462659e+06 4.667912528291783e+06 -2.843526397590566e+03 -4.573795460904361e+03 -5.492643855574530e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.200000000000000e+01 -1.153429859187451e+06 -4.904705612484806e+06 4.667802674976319e+06 -2.843511553215319e+03 -4.573667133734673e+03 -5.492758892152260e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.300000000000000e+01 -1.153486728926893e+06 -4.904797083901284e+06 4.667692819406519e+06 -2.843496707544644e+03 -4.573538808049596e+03 -5.492873922690167e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.400000000000000e+01 -1.153543598382262e+06 -4.904888552775256e+06 4.667582961507676e+06 -2.843481860526524e+03 -4.573410477939130e+03 -5.492988952223373e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.500000000000000e+01 -1.153600467531033e+06 -4.904980019064590e+06 4.667473101329635e+06 -2.843467011793300e+03 -4.573282147756354e+03 -5.493103977227182e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.600000000000000e+01 -1.153657336395500e+06 -4.905071482811065e+06 4.667363238822975e+06 -2.843452160288984e+03 -4.573153813781507e+03 -5.493219001333411e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.700000000000000e+01 -1.153714204964581e+06 -4.905162943993925e+06 4.667253374012247e+06 -2.843437307982118e+03 -4.573025477108835e+03 -5.493334022723365e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.800000000000000e+01 -1.153771073238083e+06 -4.905254402612862e+06 4.667143506897822e+06 -2.843422453017709e+03 -4.572897138747175e+03 -5.493449041381165e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.900000000000000e+01 -1.153827941216130e+06 -4.905345858668094e+06 4.667033637479442e+06 -2.843407597158233e+03 -4.572768797866286e+03 -5.493564057213151e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.000000000000000e+01 -1.153884808909815e+06 -4.905437312180419e+06 4.666923765732494e+06 -2.843392738801496e+03 -4.572640452983973e+03 -5.493679072200657e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.100000000000000e+01 -1.153941676296602e+06 -4.905528763107707e+06 4.666813891706831e+06 -2.843377878402196e+03 -4.572512107970349e+03 -5.493794082857313e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.200000000000000e+01 -1.153998543387832e+06 -4.905620211471166e+06 4.666704015377372e+06 -2.843363017441559e+03 -4.572383760459086e+03 -5.493909090518860e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.300000000000000e+01 -1.154055410183384e+06 -4.905711657270607e+06 4.666594136744323e+06 -2.843348153923399e+03 -4.572255410789019e+03 -5.494024095801255e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.400000000000000e+01 -1.154112276694348e+06 -4.905803100526833e+06 4.666484255783088e+06 -2.843333288033959e+03 -4.572127057540642e+03 -5.494139099823244e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.500000000000000e+01 -1.154169142876027e+06 -4.905894541156168e+06 4.666374372592675e+06 -2.843318422338207e+03 -4.571998706797271e+03 -5.494254096268891e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.600000000000000e+01 -1.154226008784337e+06 -4.905985979263305e+06 4.666264487049202e+06 -2.843303553799633e+03 -4.571870350720647e+03 -5.494369093154796e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.700000000000000e+01 -1.154282874396747e+06 -4.906077414806122e+06 4.666154599202517e+06 -2.843288682830397e+03 -4.571741992438925e+03 -5.494484087643367e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.800000000000000e+01 -1.154339739713385e+06 -4.906168847784837e+06 4.666044709052360e+06 -2.843273811176478e+03 -4.571613631705432e+03 -5.494599079153784e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.900000000000000e+01 -1.154396604745338e+06 -4.906260278220244e+06 4.665934816574119e+06 -2.843258936751139e+03 -4.571485267252272e+03 -5.494714069704265e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.000000000000000e+01 -1.154453469458874e+06 -4.906351706049254e+06 4.665824921842472e+06 -2.843244060987852e+03 -4.571356904121445e+03 -5.494829054374317e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.100000000000000e+01 -1.154510333887738e+06 -4.906443131335001e+06 4.665715024782693e+06 -2.843229183998753e+03 -4.571228536773508e+03 -5.494944037806771e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.200000000000000e+01 -1.154567198031729e+06 -4.906534554077177e+06 4.665605125395147e+06 -2.843214303794174e+03 -4.571100165869832e+03 -5.495059020341043e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.300000000000000e+01 -1.154624061868566e+06 -4.906625974234062e+06 4.665495223729224e+06 -2.843199423239261e+03 -4.570971794176063e+03 -5.495173998338155e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.400000000000000e+01 -1.154680925409340e+06 -4.906717391826447e+06 4.665385319760310e+06 -2.843184540549422e+03 -4.570843420385077e+03 -5.495288973712725e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.500000000000000e+01 -1.154737788665132e+06 -4.906808806875126e+06 4.665275413463791e+06 -2.843169655036500e+03 -4.570715042893835e+03 -5.495403948133842e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.600000000000000e+01 -1.154794651613666e+06 -4.906900219338380e+06 4.665165504889054e+06 -2.843154769233221e+03 -4.570586664482401e+03 -5.495518918101102e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.700000000000000e+01 -1.154851514266028e+06 -4.906991629237007e+06 4.665055594011488e+06 -2.843139881116995e+03 -4.570458284256192e+03 -5.495633885287098e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.800000000000000e+01 -1.154908376622101e+06 -4.907083036570825e+06 4.664945680831304e+06 -2.843124990803692e+03 -4.570329901775607e+03 -5.495748850011772e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.900000000000000e+01 -1.154965238659604e+06 -4.907174441298127e+06 4.664835765397899e+06 -2.843110100459730e+03 -4.570201520461547e+03 -5.495863808398282e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.000000000000000e+01 -1.155022100434441e+06 -4.907265843523558e+06 4.664725847587340e+06 -2.843095206624067e+03 -4.570073131690681e+03 -5.495978769314877e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.100000000000000e+01 -1.155078961890472e+06 -4.907357243142126e+06 4.664615927523985e+06 -2.843080311355226e+03 -4.569944744603838e+03 -5.496093724089453e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.200000000000000e+01 -1.155135823072649e+06 -4.907448640237903e+06 4.664506005108253e+06 -2.843065414629913e+03 -4.569816351275252e+03 -5.496208679444347e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.300000000000000e+01 -1.155192683935948e+06 -4.907540034726722e+06 4.664396080439836e+06 -2.843050515736385e+03 -4.569687959721338e+03 -5.496323628913139e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.400000000000000e+01 -1.155249544525319e+06 -4.907631426692662e+06 4.664286153419144e+06 -2.843035615414764e+03 -4.569559561987407e+03 -5.496438578896835e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.500000000000000e+01 -1.155306404807031e+06 -4.907722816072658e+06 4.664176224120885e+06 -2.843020713163069e+03 -4.569431164083182e+03 -5.496553524533780e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.600000000000000e+01 -1.155363264769761e+06 -4.907814202845571e+06 4.664066292570105e+06 -2.843005809429155e+03 -4.569302767773566e+03 -5.496668464127544e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.700000000000000e+01 -1.155420124469661e+06 -4.907905587116427e+06 4.663956358642382e+06 -2.842990903844056e+03 -4.569174363438064e+03 -5.496783405989848e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.800000000000000e+01 -1.155476983861794e+06 -4.907996968801212e+06 4.663846422437257e+06 -2.842975996279350e+03 -4.569045959131432e+03 -5.496898343359439e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.900000000000000e+01 -1.155533842979658e+06 -4.908088347962614e+06 4.663736483880439e+06 -2.842961085763979e+03 -4.568917548917253e+03 -5.497013281700698e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.000000000000000e+01 -1.155590701756154e+06 -4.908179724475113e+06 4.663626543120671e+06 -2.842946175802107e+03 -4.568789143443045e+03 -5.497128210416423e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.100000000000000e+01 -1.155647560258395e+06 -4.908271098464282e+06 4.663516600009158e+06 -2.842931263162876e+03 -4.568660732213298e+03 -5.497243139851564e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.200000000000000e+01 -1.155704418475052e+06 -4.908362469908987e+06 4.663406654570953e+06 -2.842916347579419e+03 -4.568532317509039e+03 -5.497358068195705e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.300000000000000e+01 -1.155761276372644e+06 -4.908453838746571e+06 4.663296706880289e+06 -2.842901432037963e+03 -4.568403903549264e+03 -5.497472990528127e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.400000000000000e+01 -1.155818133995873e+06 -4.908545205060690e+06 4.663186756838045e+06 -2.842886513584070e+03 -4.568275484064951e+03 -5.497587913490115e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.500000000000000e+01 -1.155874991322208e+06 -4.908636568809252e+06 4.663076804494101e+06 -2.842871592728384e+03 -4.568147062727805e+03 -5.497702833743227e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.600000000000000e+01 -1.155931848329377e+06 -4.908727929950567e+06 4.662966849897867e+06 -2.842856672016299e+03 -4.568018642278726e+03 -5.497817747817630e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.700000000000000e+01 -1.155988705050784e+06 -4.908819288547194e+06 4.662856892975205e+06 -2.842841748015673e+03 -4.567890218193316e+03 -5.497932661093408e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.800000000000000e+01 -1.156045561464160e+06 -4.908910644557439e+06 4.662746933775521e+06 -2.842826823819952e+03 -4.567761793118867e+03 -5.498047569932273e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.900000000000000e+01 -1.156102417614191e+06 -4.909001998064948e+06 4.662636972199687e+06 -2.842811895910526e+03 -4.567633361174029e+03 -5.498162480900789e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.000000000000000e+02 -1.156159273444750e+06 -4.909093348964773e+06 4.662527008372096e+06 -2.842796966748417e+03 -4.567504930416047e+03 -5.498277386069291e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.010000000000000e+02 -1.156216128955963e+06 -4.909184697257137e+06 4.662417042292492e+06 -2.842782037507791e+03 -4.567376500664933e+03 -5.498392285059853e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.020000000000000e+02 -1.156272984192528e+06 -4.909276043025675e+06 4.662307073861729e+06 -2.842767105266476e+03 -4.567248065530181e+03 -5.498507184599629e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.030000000000000e+02 -1.156329839165524e+06 -4.909367386291160e+06 4.662197103055177e+06 -2.842752169526072e+03 -4.567119623048505e+03 -5.498622086574209e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.040000000000000e+02 -1.156386693751856e+06 -4.909458726823345e+06 4.662087130145821e+06 -2.842737236159083e+03 -4.566991191890783e+03 -5.498736972535802e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.050000000000000e+02 -1.156443548108242e+06 -4.909550064915373e+06 4.661977154786103e+06 -2.842722298301765e+03 -4.566862748430161e+03 -5.498851865572372e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.060000000000000e+02 -1.156500402178548e+06 -4.909641400462311e+06 4.661867177100432e+06 -2.842707357553832e+03 -4.566734301078247e+03 -5.498966757845177e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.070000000000000e+02 -1.156557255906893e+06 -4.909732733359624e+06 4.661757197212764e+06 -2.842692417785086e+03 -4.566605858096571e+03 -5.499081640618123e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.080000000000000e+02 -1.156614109360295e+06 -4.909824063732712e+06 4.661647214974411e+06 -2.842677474416332e+03 -4.566477409952301e+03 -5.499196524023264e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.090000000000000e+02 -1.156670962550078e+06 -4.909915391602735e+06 4.661537230360270e+06 -2.842662529114237e+03 -4.566348953955546e+03 -5.499311409581958e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.100000000000000e+02 -1.156727815408916e+06 -4.910006716843826e+06 4.661427243519608e+06 -2.842647582587687e+03 -4.566220501066961e+03 -5.499426287704412e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.110000000000000e+02 -1.156784667947893e+06 -4.910098039476763e+06 4.661317254427799e+06 -2.842632634722024e+03 -4.566092049832412e+03 -5.499541159672718e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.120000000000000e+02 -1.156841520211948e+06 -4.910189359585556e+06 4.661207262985204e+06 -2.842617685353838e+03 -4.565963592481087e+03 -5.499656032131907e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.130000000000000e+02 -1.156898372178557e+06 -4.910280677128133e+06 4.661097269241722e+06 -2.842602733558466e+03 -4.565835133179066e+03 -5.499770901976718e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.140000000000000e+02 -1.156955223858803e+06 -4.910371992125261e+06 4.660987273172718e+06 -2.842587779243282e+03 -4.565706669957761e+03 -5.499885770913411e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.150000000000000e+02 -1.157012075252817e+06 -4.910463304577160e+06 4.660877274777933e+06 -2.842572823660461e+03 -4.565578202608126e+03 -5.500000638552833e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.160000000000000e+02 -1.157068926315674e+06 -4.910554614399873e+06 4.660767274156960e+06 -2.842557867008848e+03 -4.565449738346610e+03 -5.500115498704139e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.170000000000000e+02 -1.157125777080865e+06 -4.910645921656067e+06 4.660657271235478e+06 -2.842542908243628e+03 -4.565321272091635e+03 -5.500230356135726e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.180000000000000e+02 -1.157182627559714e+06 -4.910737226366895e+06 4.660547265988373e+06 -2.842527948095325e+03 -4.565192801678863e+03 -5.500345212347203e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.190000000000000e+02 -1.157239477740908e+06 -4.910828528511248e+06 4.660437258440705e+06 -2.842512985838483e+03 -4.565064329017664e+03 -5.500460066052059e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.200000000000000e+02 -1.157296327613124e+06 -4.910919828067995e+06 4.660327248617536e+06 -2.842498021559147e+03 -4.564935856224390e+03 -5.500574915422580e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.210000000000000e+02 -1.157353177221297e+06 -4.911011125121132e+06 4.660217236419208e+06 -2.842483055570052e+03 -4.564807375712488e+03 -5.500689766729941e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.220000000000000e+02 -1.157410026486819e+06 -4.911102419523763e+06 4.660107222020037e+06 -2.842468088076580e+03 -4.564678900309353e+03 -5.500804609039477e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.230000000000000e+02 -1.157466875488228e+06 -4.911193711422692e+06 4.659997205245812e+06 -2.842453118884190e+03 -4.564550417147433e+03 -5.500919453314606e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.240000000000000e+02 -1.157523724180601e+06 -4.911285000733973e+06 4.659887186196138e+06 -2.842438147717739e+03 -4.564421933365905e+03 -5.501034293645719e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.250000000000000e+02 -1.157580572563824e+06 -4.911376287457443e+06 4.659777164871238e+06 -2.842423174714715e+03 -4.564293449781891e+03 -5.501149129280417e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.260000000000000e+02 -1.157637420671623e+06 -4.911467571656134e+06 4.659667141196298e+06 -2.842408200157342e+03 -4.564164959991508e+03 -5.501263965502825e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.270000000000000e+02 -1.157694268447879e+06 -4.911558853225172e+06 4.659557115295780e+06 -2.842393224428646e+03 -4.564036473365310e+03 -5.501378794221748e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.280000000000000e+02 -1.157751115970878e+06 -4.911650132310958e+06 4.659447086995930e+06 -2.842378244950554e+03 -4.563907977732702e+03 -5.501493626885192e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.290000000000000e+02 -1.157807963173548e+06 -4.911741408788074e+06 4.659337056445612e+06 -2.842363265453650e+03 -4.563779483125079e+03 -5.501608453332415e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.300000000000000e+02 -1.157864810078170e+06 -4.911832682698227e+06 4.659227023595320e+06 -2.842348283688554e+03 -4.563650986509332e+03 -5.501723277142027e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.310000000000000e+02 -1.157921656673430e+06 -4.911923954020308e+06 4.659116988470130e+06 -2.842333300081384e+03 -4.563522489660076e+03 -5.501838096622433e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.320000000000000e+02 -1.157978503004253e+06 -4.912015222838267e+06 4.659006950970355e+06 -2.842318314476045e+03 -4.563393984836485e+03 -5.501952918383498e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.330000000000000e+02 -1.158035349014441e+06 -4.912106489047130e+06 4.658896911220641e+06 -2.842303326923101e+03 -4.563265481785996e+03 -5.502067734167819e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.340000000000000e+02 -1.158092194715323e+06 -4.912197752668047e+06 4.658786869195876e+06 -2.842288338997628e+03 -4.563136977960232e+03 -5.502182545417339e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.350000000000000e+02 -1.158149040117984e+06 -4.912289013721783e+06 4.658676824871410e+06 -2.842273348822791e+03 -4.563008472083676e+03 -5.502297354056945e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.360000000000000e+02 -1.158205885244700e+06 -4.912380272250024e+06 4.658566778197742e+06 -2.842258355489071e+03 -4.562879960628598e+03 -5.502412163476751e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.370000000000000e+02 -1.158262730062005e+06 -4.912471528190184e+06 4.658456729249188e+06 -2.842243361971740e+03 -4.562751448545757e+03 -5.502526968151961e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.380000000000000e+02 -1.158319574580980e+06 -4.912562781563034e+06 4.658346678001096e+06 -2.842228365996533e+03 -4.562622934344506e+03 -5.502641770368349e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.390000000000000e+02 -1.158376418801509e+06 -4.912654032368389e+06 4.658236624453678e+06 -2.842213367906349e+03 -4.562494418115616e+03 -5.502756569894454e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.400000000000000e+02 -1.158433262701320e+06 -4.912745280564608e+06 4.658126568656394e+06 -2.842198369709035e+03 -4.562365902873752e+03 -5.502871363278264e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.410000000000000e+02 -1.158490106336292e+06 -4.912836526256173e+06 4.658016510485158e+06 -2.842183368138239e+03 -4.562237380381233e+03 -5.502986158950476e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.420000000000000e+02 -1.158546949683911e+06 -4.912927769401041e+06 4.657906449989897e+06 -2.842168363896095e+03 -4.562108854062119e+03 -5.503100953702363e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.430000000000000e+02 -1.158603792688309e+06 -4.913019009894783e+06 4.657796387294654e+06 -2.842153360457620e+03 -4.561980332222231e+03 -5.503215738952478e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.440000000000000e+02 -1.158660635450158e+06 -4.913110247925587e+06 4.657686322175892e+06 -2.842138352708486e+03 -4.561851799613107e+03 -5.503330529883975e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.450000000000000e+02 -1.158717477857356e+06 -4.913201483283999e+06 4.657576254882442e+06 -2.842123344794960e+03 -4.561723273881315e+03 -5.503445309726495e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.460000000000000e+02 -1.158774319988419e+06 -4.913292716116721e+06 4.657466185240003e+06 -2.842108335234259e+03 -4.561594741796339e+03 -5.503560090319568e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.470000000000000e+02 -1.158831161809555e+06 -4.913383946360675e+06 4.657356113323534e+06 -2.842093323381529e+03 -4.561466209790116e+03 -5.503674866524151e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.480000000000000e+02 -1.158888003376882e+06 -4.913475174120710e+06 4.657246039008463e+06 -2.842078309124447e+03 -4.561337668387877e+03 -5.503789646389006e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.490000000000000e+02 -1.158944844589497e+06 -4.913566399208312e+06 4.657135962518764e+06 -2.842063294502320e+03 -4.561209133503902e+03 -5.503904415560080e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.500000000000000e+02 -1.159001685503280e+06 -4.913657621727939e+06 4.657025883730334e+06 -2.842048277761278e+03 -4.561080596594672e+03 -5.504019182040975e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.510000000000000e+02 -1.159058526140752e+06 -4.913748841721660e+06 4.656915802593191e+06 -2.842033259542652e+03 -4.560952053848240e+03 -5.504133948759569e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.520000000000000e+02 -1.159115366490593e+06 -4.913840059168374e+06 4.656805719132397e+06 -2.842018238280638e+03 -4.560823507267878e+03 -5.504248714731303e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.530000000000000e+02 -1.159172206552689e+06 -4.913931274067899e+06 4.656695633348170e+06 -2.842003214660535e+03 -4.560694956781908e+03 -5.504363479707200e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.540000000000000e+02 -1.159229046304774e+06 -4.914022486378607e+06 4.656585545289976e+06 -2.841988190576093e+03 -4.560566405556490e+03 -5.504478240160712e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.550000000000000e+02 -1.159285885713142e+06 -4.914113696037565e+06 4.656475455032634e+06 -2.841973165872654e+03 -4.560437859482440e+03 -5.504592991190972e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.560000000000000e+02 -1.159342724867248e+06 -4.914204903211967e+06 4.656365362377415e+06 -2.841958137253684e+03 -4.560309304135315e+03 -5.504707746457514e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.570000000000000e+02 -1.159399563711236e+06 -4.914296107797430e+06 4.656255267448400e+06 -2.841943108250072e+03 -4.560180748200602e+03 -5.504822497037966e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.580000000000000e+02 -1.159456402256106e+06 -4.914387309814564e+06 4.656145170221085e+06 -2.841928076547665e+03 -4.560052190310143e+03 -5.504937245130940e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.590000000000000e+02 -1.159513240501984e+06 -4.914478509263587e+06 4.656035070695212e+06 -2.841913044054540e+03 -4.559923629941019e+03 -5.505051990316801e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.600000000000000e+02 -1.159570078448758e+06 -4.914569706144325e+06 4.655924968870988e+06 -2.841898009308997e+03 -4.559795067451519e+03 -5.505166732952694e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.610000000000000e+02 -1.159626916096302e+06 -4.914660900456604e+06 4.655814864748633e+06 -2.841882972135561e+03 -4.559666503195977e+03 -5.505281472818868e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.620000000000000e+02 -1.159683753444752e+06 -4.914752092200642e+06 4.655704758327880e+06 -2.841867934470212e+03 -4.559537936207125e+03 -5.505396209857956e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.630000000000000e+02 -1.159740590505184e+06 -4.914843281397182e+06 4.655594649584064e+06 -2.841852893898874e+03 -4.559409365406308e+03 -5.505510946068770e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.640000000000000e+02 -1.159797427232697e+06 -4.914934467962373e+06 4.655484538616895e+06 -2.841837852513516e+03 -4.559280797862085e+03 -5.505625674545290e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.650000000000000e+02 -1.159854263683395e+06 -4.915025652001026e+06 4.655374425301747e+06 -2.841822809226096e+03 -4.559152224456187e+03 -5.505740403469651e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.660000000000000e+02 -1.159911099834778e+06 -4.915116833471132e+06 4.655264309688574e+06 -2.841807763930031e+03 -4.559023648840441e+03 -5.505855129809542e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.670000000000000e+02 -1.159967935686723e+06 -4.915208012372514e+06 4.655154191777592e+06 -2.841792716331181e+03 -4.558895071195907e+03 -5.505969853544923e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.680000000000000e+02 -1.160024771239355e+06 -4.915299188705390e+06 4.655044071568538e+06 -2.841777667871725e+03 -4.558766491207622e+03 -5.506084574290964e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.690000000000000e+02 -1.160081606526152e+06 -4.915390362532332e+06 4.654933948986996e+06 -2.841762616025784e+03 -4.558637903791051e+03 -5.506199297474513e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.700000000000000e+02 -1.160138441457423e+06 -4.915481533685839e+06 4.654823824232176e+06 -2.841747563762891e+03 -4.558509323062311e+03 -5.506314009852463e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.710000000000000e+02 -1.160195276089283e+06 -4.915572702270715e+06 4.654713697179453e+06 -2.841732511029155e+03 -4.558380739991208e+03 -5.506428719064448e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.720000000000000e+02 -1.160252110466310e+06 -4.915663868370302e+06 4.654603567729681e+06 -2.841717453670260e+03 -4.558252148015572e+03 -5.506543432516855e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.730000000000000e+02 -1.160308944532654e+06 -4.915755031880246e+06 4.654493436006983e+06 -2.841702396043576e+03 -4.558123555121537e+03 -5.506658141510594e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.740000000000000e+02 -1.160365778254614e+06 -4.915846192737643e+06 4.654383302086201e+06 -2.841687337659920e+03 -4.557994967361794e+03 -5.506772841163612e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.750000000000000e+02 -1.160422611721639e+06 -4.915937351109614e+06 4.654273165768533e+06 -2.841672275667749e+03 -4.557866370503402e+03 -5.506887544761498e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.760000000000000e+02 -1.160479444877868e+06 -4.916028506891811e+06 4.654163027178105e+06 -2.841657212883795e+03 -4.557737772920202e+03 -5.507002243974164e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.770000000000000e+02 -1.160536277734397e+06 -4.916119660104981e+06 4.654052886290241e+06 -2.841642148264060e+03 -4.557609173136513e+03 -5.507116940516494e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.780000000000000e+02 -1.160593110291093e+06 -4.916210810748943e+06 4.653942743105166e+06 -2.841627081059322e+03 -4.557480571645950e+03 -5.507231634310219e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.790000000000000e+02 -1.160649942548095e+06 -4.916301958823916e+06 4.653832597622608e+06 -2.841612013298626e+03 -4.557351967338244e+03 -5.507346325376352e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.800000000000000e+02 -1.160706774505279e+06 -4.916393104329723e+06 4.653722449842788e+06 -2.841596943104002e+03 -4.557223361231730e+03 -5.507461013703274e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.810000000000000e+02 -1.160763606151337e+06 -4.916484247245287e+06 4.653612299790794e+06 -2.841581871148091e+03 -4.557094754722674e+03 -5.507575697810995e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.820000000000000e+02 -1.160820437542369e+06 -4.916575387675351e+06 4.653502147341957e+06 -2.841566796843717e+03 -4.556966138613009e+03 -5.507690385716120e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.830000000000000e+02 -1.160877268588619e+06 -4.916666525452365e+06 4.653391992695702e+06 -2.841551721291274e+03 -4.556837527893202e+03 -5.507805064289034e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.840000000000000e+02 -1.160934099346189e+06 -4.916757660681075e+06 4.653281835727354e+06 -2.841536644613062e+03 -4.556708912633122e+03 -5.507919741843364e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.850000000000000e+02 -1.160990929792571e+06 -4.916848793319498e+06 4.653171676486894e+06 -2.841521565994612e+03 -4.556580297362415e+03 -5.508034414929202e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.860000000000000e+02 -1.161047759972429e+06 -4.916939923451077e+06 4.653061514874998e+06 -2.841506484020091e+03 -4.556451674615382e+03 -5.508149090475548e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.870000000000000e+02 -1.161104589829916e+06 -4.917031050971502e+06 4.652951351015825e+06 -2.841491402120867e+03 -4.556323052831034e+03 -5.508263759824675e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.880000000000000e+02 -1.161161419364916e+06 -4.917122175880610e+06 4.652841184909587e+06 -2.841476318559175e+03 -4.556194432795372e+03 -5.508378423098125e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.890000000000000e+02 -1.161218248599702e+06 -4.917213298220025e+06 4.652731016506728e+06 -2.841461232902410e+03 -4.556065810511246e+03 -5.508493083858846e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.900000000000000e+02 -1.161275077590370e+06 -4.917304418094483e+06 4.652620845682560e+06 -2.841446144423438e+03 -4.555937176866660e+03 -5.508607750110782e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.910000000000000e+02 -1.161331906269638e+06 -4.917395535378386e+06 4.652510672586603e+06 -2.841431054039296e+03 -4.555808543126577e+03 -5.508722411949972e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.920000000000000e+02 -1.161388734615005e+06 -4.917486650029767e+06 4.652400497268844e+06 -2.841415962565876e+03 -4.555679912641251e+03 -5.508837066186855e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.930000000000000e+02 -1.161445562660177e+06 -4.917577762111539e+06 4.652290319654368e+06 -2.841400870417292e+03 -4.555551279600870e+03 -5.508951717529146e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.940000000000000e+02 -1.161502390416234e+06 -4.917668871644435e+06 4.652180139718493e+06 -2.841385775612106e+03 -4.555422642657485e+03 -5.509066368005160e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.950000000000000e+02 -1.161559217849475e+06 -4.917759978565578e+06 4.652069957536095e+06 -2.841370679225754e+03 -4.555294007253090e+03 -5.509181012546589e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.960000000000000e+02 -1.161616045038385e+06 -4.917851083021482e+06 4.651959772932701e+06 -2.841355580199527e+03 -4.555165360637401e+03 -5.509295662369158e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.970000000000000e+02 -1.161672871870827e+06 -4.917942184802851e+06 4.651849586157556e+06 -2.841340480232637e+03 -4.555036720946046e+03 -5.509410301433109e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.980000000000000e+02 -1.161729698425290e+06 -4.918033284056189e+06 4.651739397036187e+06 -2.841325379007723e+03 -4.554908075046583e+03 -5.509524940941537e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.990000000000000e+02 -1.161786524690456e+06 -4.918124380760428e+06 4.651629205593686e+06 -2.841310274798608e+03 -4.554779425509763e+03 -5.509639579507056e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.000000000000000e+02 -1.161843350643823e+06 -4.918215474873597e+06 4.651519011880050e+06 -2.841295168751823e+03 -4.554650775890122e+03 -5.509754213619808e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.010000000000000e+02 -1.161900176296716e+06 -4.918306566416807e+06 4.651408815870123e+06 -2.841280062142756e+03 -4.554522123348437e+03 -5.509868845095965e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.020000000000000e+02 -1.161957001649014e+06 -4.918397655389889e+06 4.651298617564120e+06 -2.841264953102658e+03 -4.554393469117082e+03 -5.509983473739898e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.030000000000000e+02 -1.162013826700602e+06 -4.918488741792665e+06 4.651188416962255e+06 -2.841249841903648e+03 -4.554264812697756e+03 -5.510098099848559e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.040000000000000e+02 -1.162070651451606e+06 -4.918579825625350e+06 4.651078214064261e+06 -2.841234729801721e+03 -4.554136153771807e+03 -5.510212723124317e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.050000000000000e+02 -1.162127475901913e+06 -4.918670906887776e+06 4.650968008870349e+06 -2.841219615513253e+03 -4.554007492740412e+03 -5.510327343807761e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.060000000000000e+02 -1.162184300051402e+06 -4.918761985579765e+06 4.650857801380741e+06 -2.841204499003339e+03 -4.553878830014973e+03 -5.510441961568291e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.070000000000000e+02 -1.162241123911393e+06 -4.918853061722425e+06 4.650747591570271e+06 -2.841189381236472e+03 -4.553750162617042e+03 -5.510556578478550e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.080000000000000e+02 -1.162297947436923e+06 -4.918944135231888e+06 4.650637379538893e+06 -2.841174261944863e+03 -4.553621498963415e+03 -5.510671187574417e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.090000000000000e+02 -1.162354770706460e+06 -4.919035206254608e+06 4.650527165112078e+06 -2.841159140300288e+03 -4.553492825527375e+03 -5.510785800614703e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.100000000000000e+02 -1.162411593641547e+06 -4.919126274644172e+06 4.650416948464304e+06 -2.841144017641710e+03 -4.553364155466382e+03 -5.510900405921655e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.110000000000000e+02 -1.162468416275639e+06 -4.919217340463081e+06 4.650306729521099e+06 -2.841128892558820e+03 -4.553235483315887e+03 -5.511015008730119e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.120000000000000e+02 -1.162525238631247e+06 -4.919308403753331e+06 4.650196508232411e+06 -2.841113765950585e+03 -4.553106805200430e+03 -5.511129611896557e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.130000000000000e+02 -1.162582060697067e+06 -4.919399464493859e+06 4.650086284623339e+06 -2.841098636758805e+03 -4.552978123264001e+03 -5.511244214092967e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.140000000000000e+02 -1.162638882417021e+06 -4.919490522580034e+06 4.649976058818587e+06 -2.841083506902005e+03 -4.552849446256258e+03 -5.511358807092464e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.150000000000000e+02 -1.162695703836001e+06 -4.919581578095647e+06 4.649865830718308e+06 -2.841068376159833e+03 -4.552720766917384e+03 -5.511473397103791e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.160000000000000e+02 -1.162752524998660e+06 -4.919672631124066e+06 4.649755600223115e+06 -2.841053241721418e+03 -4.552592078399603e+03 -5.511587991154567e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.170000000000000e+02 -1.162809345826539e+06 -4.919763681518903e+06 4.649645367507511e+06 -2.841038106044193e+03 -4.552463393124023e+03 -5.511702577686662e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.180000000000000e+02 -1.162866166386912e+06 -4.919854729405695e+06 4.649535132421841e+06 -2.841022968508459e+03 -4.552334700107473e+03 -5.511817166220058e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.190000000000000e+02 -1.162922986601331e+06 -4.919945774638067e+06 4.649424895140611e+06 -2.841007830360738e+03 -4.552206012037203e+03 -5.511931745519352e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.200000000000000e+02 -1.162979806525626e+06 -4.920036817320275e+06 4.649314655539539e+06 -2.840992689391856e+03 -4.552077320270445e+03 -5.512046323850840e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.210000000000000e+02 -1.163036626182310e+06 -4.920127857494300e+06 4.649204413568556e+06 -2.840977546573228e+03 -4.551948620578250e+03 -5.512160904334190e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.220000000000000e+02 -1.163093445515226e+06 -4.920218895055420e+06 4.649094169352540e+06 -2.840962401575019e+03 -4.551819922866901e+03 -5.512275478784592e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.230000000000000e+02 -1.163150264535701e+06 -4.920309930024729e+06 4.648983922866325e+06 -2.840947256531522e+03 -4.551691223979411e+03 -5.512390048896862e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.240000000000000e+02 -1.163207083277185e+06 -4.920400962464715e+06 4.648873674035423e+06 -2.840932108200295e+03 -4.551562519849387e+03 -5.512504619551278e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.250000000000000e+02 -1.163263901705989e+06 -4.920491992312543e+06 4.648763422934745e+06 -2.840916958136983e+03 -4.551433815238222e+03 -5.512619186042509e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.260000000000000e+02 -1.163320719811052e+06 -4.920583019547557e+06 4.648653169588941e+06 -2.840901807919180e+03 -4.551305111861482e+03 -5.512733746217690e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.270000000000000e+02 -1.163377537659400e+06 -4.920674044294869e+06 4.648542913848794e+06 -2.840886654061033e+03 -4.551176399175538e+03 -5.512848310513376e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.280000000000000e+02 -1.163434355172580e+06 -4.920765066408133e+06 4.648432655888853e+06 -2.840871498950579e+03 -4.551047690101062e+03 -5.512962866988415e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.290000000000000e+02 -1.163491172417864e+06 -4.920856086012857e+06 4.648322395559419e+06 -2.840856341942467e+03 -4.550918972901047e+03 -5.513077425803320e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.300000000000000e+02 -1.163547989316804e+06 -4.920947102962696e+06 4.648212133035045e+06 -2.840841184272019e+03 -4.550790260777059e+03 -5.513191975301028e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.310000000000000e+02 -1.163604805936425e+06 -4.921038117382763e+06 4.648101868166510e+06 -2.840826023595991e+03 -4.550661543125591e+03 -5.513306525452610e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.320000000000000e+02 -1.163661622265660e+06 -4.921129129252391e+06 4.647991600978463e+06 -2.840810861595468e+03 -4.550532821370392e+03 -5.513421074303834e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.330000000000000e+02 -1.163718438281937e+06 -4.921220138529520e+06 4.647881331521076e+06 -2.840795697418383e+03 -4.550404099407493e+03 -5.513535618962638e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.340000000000000e+02 -1.163775253985376e+06 -4.921311145214363e+06 4.647771059794094e+06 -2.840780532663925e+03 -4.550275376538245e+03 -5.513650159296721e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.350000000000000e+02 -1.163832069409439e+06 -4.921402149369385e+06 4.647660785723004e+06 -2.840765365081456e+03 -4.550146648256850e+03 -5.513764700107045e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.360000000000000e+02 -1.163888884520431e+06 -4.921493150931775e+06 4.647550509382746e+06 -2.840750195457035e+03 -4.550017919827124e+03 -5.513879236614668e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.370000000000000e+02 -1.163945699329676e+06 -4.921584149922628e+06 4.647440230748145e+06 -2.840735025126626e+03 -4.549889188602994e+03 -5.513993770442671e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.380000000000000e+02 -1.164002513848240e+06 -4.921675146362652e+06 4.647329949794509e+06 -2.840719852034787e+03 -4.549760454059056e+03 -5.514108302957738e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.390000000000000e+02 -1.164059328031255e+06 -4.921766140168156e+06 4.647219666621682e+06 -2.840704678088866e+03 -4.549631722184866e+03 -5.514222828267240e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.400000000000000e+02 -1.164116141934793e+06 -4.921857131443746e+06 4.647109381104860e+06 -2.840689502391848e+03 -4.549502984646141e+03 -5.514337353779854e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.410000000000000e+02 -1.164172955525167e+06 -4.921948120126623e+06 4.646999093318983e+06 -2.840674324861493e+03 -4.549374246882589e+03 -5.514451874960729e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.420000000000000e+02 -1.164229768835831e+06 -4.922039106279232e+06 4.646888803189528e+06 -2.840659144343034e+03 -4.549245503439986e+03 -5.514566396913211e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.430000000000000e+02 -1.164286581833341e+06 -4.922130089839163e+06 4.646778510790969e+06 -2.840643963342353e+03 -4.549116759165489e+03 -5.514680914436035e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.440000000000000e+02 -1.164343394528777e+06 -4.922221070827122e+06 4.646668216098604e+06 -2.840628780193780e+03 -4.548988012991344e+03 -5.514795429176187e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.450000000000000e+02 -1.164400206933201e+06 -4.922312049263806e+06 4.646557919087737e+06 -2.840613594276181e+03 -4.548859263102077e+03 -5.514909942938601e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.460000000000000e+02 -1.164457018990804e+06 -4.922403025045071e+06 4.646447619882673e+06 -2.840598409233281e+03 -4.548730517616822e+03 -5.515024447261867e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.470000000000000e+02 -1.164513830813271e+06 -4.922493998379327e+06 4.646337318234636e+06 -2.840583219019079e+03 -4.548601759766613e+03 -5.515138958955755e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.480000000000000e+02 -1.164570642300033e+06 -4.922584969078952e+06 4.646227014367600e+06 -2.840568029234033e+03 -4.548473004729972e+03 -5.515253462747403e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.490000000000000e+02 -1.164627453462164e+06 -4.922675937164646e+06 4.646116708256858e+06 -2.840552837932941e+03 -4.548344251034975e+03 -5.515367960749245e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.500000000000000e+02 -1.164684264377865e+06 -4.922766902782318e+06 4.646006399728222e+06 -2.840537642578651e+03 -4.548215486715839e+03 -5.515482464154799e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.510000000000000e+02 -1.164741074968940e+06 -4.922857865786097e+06 4.645896088955829e+06 -2.840522446919258e+03 -4.548086723255349e+03 -5.515596961631279e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.520000000000000e+02 -1.164797885235281e+06 -4.922948826175817e+06 4.645785775939899e+06 -2.840507250040388e+03 -4.547957961389874e+03 -5.515711452971970e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.530000000000000e+02 -1.164854695221517e+06 -4.923039784034774e+06 4.645675460580978e+06 -2.840492050075385e+03 -4.547829193953856e+03 -5.515825945035536e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.540000000000000e+02 -1.164911504871838e+06 -4.923130739258849e+06 4.645565143003391e+06 -2.840476850375020e+03 -4.547700429320879e+03 -5.515940429281403e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.550000000000000e+02 -1.164968314242070e+06 -4.923221691952203e+06 4.645454823082759e+06 -2.840461647867241e+03 -4.547571659014412e+03 -5.516054914211055e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.560000000000000e+02 -1.165025123309712e+06 -4.923312642072924e+06 4.645344500869130e+06 -2.840446442853996e+03 -4.547442886760027e+03 -5.516169396559521e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.570000000000000e+02 -1.165081932052525e+06 -4.923403589579501e+06 4.645234176412083e+06 -2.840431238033108e+03 -4.547314115435612e+03 -5.516283872696538e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.580000000000000e+02 -1.165138740503868e+06 -4.923494534534230e+06 4.645123849637235e+06 -2.840416029933083e+03 -4.547185340838482e+03 -5.516398347713130e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.590000000000000e+02 -1.165195548697434e+06 -4.923585476999911e+06 4.645013520469550e+06 -2.840400819589738e+03 -4.547056556268590e+03 -5.516512826768972e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.600000000000000e+02 -1.165252356554792e+06 -4.923676416830327e+06 4.644903189083688e+06 -2.840385608044455e+03 -4.546927775188814e+03 -5.516627298090944e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.610000000000000e+02 -1.165309164120576e+06 -4.923767354108753e+06 4.644792855380180e+06 -2.840370393975649e+03 -4.546798990231342e+03 -5.516741768460078e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.620000000000000e+02 -1.165365971373467e+06 -4.923858288793362e+06 4.644682519408756e+06 -2.840355225785978e+03 -4.546670188576375e+03 -5.516856226868937e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.630000000000000e+02 -1.165422778307146e+06 -4.923949220876525e+06 4.644572181179011e+06 -2.840339963335913e+03 -4.546541420424878e+03 -5.516970694202174e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.640000000000000e+02 -1.165479584964677e+06 -4.924040150436529e+06 4.644461840597177e+06 -2.840324743968192e+03 -4.546412628915295e+03 -5.517085156424979e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.650000000000000e+02 -1.165536391297093e+06 -4.924131077382049e+06 4.644351497772365e+06 -2.840309524524399e+03 -4.546283838399535e+03 -5.517199612504527e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.660000000000000e+02 -1.165593197349026e+06 -4.924222001796350e+06 4.644241152605093e+06 -2.840294302059045e+03 -4.546155042542819e+03 -5.517314069083206e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.670000000000000e+02 -1.165650003109170e+06 -4.924312923658396e+06 4.644130805120492e+06 -2.840279076866794e+03 -4.546026242593492e+03 -5.517428524980293e+03 1.916870120600000e-03 7.337122999400000e-04 1.159096367800000e-03 2.444819232100000e-03 1.868036280500000e-03 3.272469259000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.680000000000000e+02 -1.165706808521722e+06 -4.924403842864110e+06 4.644020455442934e+06 -2.840263852539814e+03 -4.545897447455306e+03 -5.517542971107204e+03 1.916870120600000e-03 7.337122999400000e-04 1.159096367800000e-03 2.444819232100000e-03 1.868036280500000e-03 3.272469259000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.690000000000000e+02 -1.165763613653685e+06 -4.924494759538471e+06 4.643910103423076e+06 -2.840248625185939e+03 -4.545768646651914e+03 -5.517657418007521e+03 1.916870120600000e-03 7.337122999400000e-04 1.159096367800000e-03 2.444819232100000e-03 1.868036280500000e-03 3.272469259000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.700000000000000e+02 -1.165820418482567e+06 -4.924585673639591e+06 4.643799749110977e+06 -2.840233395524254e+03 -4.545639843864918e+03 -5.517771862267744e+03 1.916870120600000e-03 7.337122999400000e-04 1.159096367800000e-03 2.444819232100000e-03 1.868036280500000e-03 3.272469259000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.710000000000000e+02 -1.165877222986126e+06 -4.924676585125968e+06 4.643689392556232e+06 -2.840218165950092e+03 -4.545511041939851e+03 -5.517886300422885e+03 1.916870120600000e-03 7.337122999400000e-04 1.159096367800000e-03 2.444819232100000e-03 1.868036280500000e-03 3.272469259000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.720000000000000e+02 -1.165934027205992e+06 -4.924767494089013e+06 4.643579033665133e+06 -2.840202786895663e+03 -4.545382648720954e+03 -5.518000457471592e+03 1.916870120600000e-03 7.337122999400000e-04 1.159096367800000e-03 2.444819232100000e-03 1.868036280500000e-03 3.272469259000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.730000000000000e+02 -1.165990831087042e+06 -4.924858400435004e+06 4.643468672559977e+06 -2.840187311450798e+03 -4.545254530555154e+03 -5.518114421727834e+03 1.916870120600000e-03 7.337122999400000e-04 1.159096367800000e-03 2.444819232100000e-03 1.868036280500000e-03 3.272469259000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.740000000000000e+02 -1.166047634708204e+06 -4.924949304288351e+06 4.643358309066248e+06 -2.840172073952302e+03 -4.545125713568120e+03 -5.518228860065032e+03 1.916870120600000e-03 7.337122999400000e-04 1.159096367800000e-03 2.444819232100000e-03 1.868036280500000e-03 3.272469259000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.750000000000000e+02 -1.166104437992551e+06 -4.925040205505672e+06 4.643247943355346e+06 -2.840156835485618e+03 -4.544996900133768e+03 -5.518343290514320e+03 1.916870120600000e-03 7.337122999400000e-04 1.159096367800000e-03 2.444819232100000e-03 1.868036280500000e-03 3.272469259000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.760000000000000e+02 -1.166161240973770e+06 -4.925131104149744e+06 4.643137575352211e+06 -2.840141596251096e+03 -4.544868083785215e+03 -5.518457718411961e+03 1.916870120600000e-03 7.337122999400000e-04 1.159096367800000e-03 2.444819232100000e-03 1.868036280500000e-03 3.272469259000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.770000000000000e+02 -1.166218043629377e+06 -4.925222000178695e+06 4.643027205106924e+06 -2.840126355667363e+03 -4.544739269083874e+03 -5.518572140192507e+03 1.916823711500000e-03 7.334078665900000e-04 1.159269326400000e-03 2.443984690900000e-03 1.867915683200000e-03 3.273454095500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.780000000000000e+02 -1.166274846026357e+06 -4.925312893717471e+06 4.642916832470113e+06 -2.840111110926993e+03 -4.544610445512106e+03 -5.518686565941822e+03 1.916823711500000e-03 7.334078665900000e-04 1.159269326400000e-03 2.443984690900000e-03 1.867915683200000e-03 3.273454095500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.790000000000000e+02 -1.166331648086550e+06 -4.925403784620310e+06 4.642806457616026e+06 -2.840095866796953e+03 -4.544481624367292e+03 -5.518800984039082e+03 1.916823711500000e-03 7.334078665900000e-04 1.159269326400000e-03 2.443984690900000e-03 1.867915683200000e-03 3.273454095500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.800000000000000e+02 -1.166388449854576e+06 -4.925494672970454e+06 4.642696080445157e+06 -2.840080620070802e+03 -4.544352799734383e+03 -5.518915400888013e+03 1.916823711500000e-03 7.334078665900000e-04 1.159269326400000e-03 2.443984690900000e-03 1.867915683200000e-03 3.273454095500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.810000000000000e+02 -1.166445251307949e+06 -4.925585558726020e+06 4.642585701007579e+06 -2.840065371344765e+03 -4.544223974616518e+03 -5.519029813701432e+03 1.916823711500000e-03 7.334078665900000e-04 1.159269326400000e-03 2.443984690900000e-03 1.867915683200000e-03 3.273454095500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.820000000000000e+02 -1.166502052478665e+06 -4.925676441956272e+06 4.642475319232903e+06 -2.840050036618713e+03 -4.544095467661826e+03 -5.519143992948872e+03 1.916823711500000e-03 7.334078665900000e-04 1.159269326400000e-03 2.443984690900000e-03 1.867915683200000e-03 3.273454095500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.830000000000000e+02 -1.166558853326205e+06 -4.925767322592112e+06 4.642364935211979e+06 -2.840034643639323e+03 -4.543967175035474e+03 -5.519258013264394e+03 1.916823711500000e-03 7.334078665900000e-04 1.159269326400000e-03 2.443984690900000e-03 1.867915683200000e-03 3.273454095500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.840000000000000e+02 -1.166615653864806e+06 -4.925858200644052e+06 4.642254548911585e+06 -2.840019390244958e+03 -4.543838341321183e+03 -5.519372419330269e+03 1.916823711500000e-03 7.334078665900000e-04 1.159269326400000e-03 2.443984690900000e-03 1.867915683200000e-03 3.273454095500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.850000000000000e+02 -1.166672454077510e+06 -4.925949076080530e+06 4.642144160369478e+06 -2.840004135341224e+03 -4.543709509387291e+03 -5.519486819240626e+03 1.916823711500000e-03 7.334078665900000e-04 1.159269326400000e-03 2.443984690900000e-03 1.867915683200000e-03 3.273454095500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.860000000000000e+02 -1.166729254020125e+06 -4.926039949005619e+06 4.642033769461199e+06 -2.839988877160108e+03 -4.543580669905296e+03 -5.519601221613322e+03 1.916823711500000e-03 7.334078665900000e-04 1.159269326400000e-03 2.443984690900000e-03 1.867915683200000e-03 3.273454095500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.870000000000000e+02 -1.166786053636852e+06 -4.926130819315278e+06 4.641923376311160e+06 -2.839973618800369e+03 -4.543451831386440e+03 -5.519715617917904e+03 1.916777237000000e-03 7.331033551700000e-04 1.159442133400000e-03 2.443150217600000e-03 1.867794695500000e-03 3.274438960700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.880000000000000e+02 -1.166842852961130e+06 -4.926221687071898e+06 4.641812980844765e+06 -2.839958357800975e+03 -4.543322989359393e+03 -5.519830013010094e+03 1.916777237000000e-03 7.331033551700000e-04 1.159442133400000e-03 2.443150217600000e-03 1.867794695500000e-03 3.274438960700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.890000000000000e+02 -1.166899651992842e+06 -4.926312552275287e+06 4.641702583062227e+06 -2.839943094260792e+03 -4.543194143280063e+03 -5.519944407301464e+03 1.916777237000000e-03 7.331033551700000e-04 1.159442133400000e-03 2.443150217600000e-03 1.867794695500000e-03 3.274438960700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.900000000000000e+02 -1.166956450709745e+06 -4.926403414883974e+06 4.641592183013158e+06 -2.839927830234144e+03 -4.543065296629653e+03 -5.520058796949835e+03 1.916777237000000e-03 7.331033551700000e-04 1.159442133400000e-03 2.443150217600000e-03 1.867794695500000e-03 3.274438960700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.910000000000000e+02 -1.167013249134093e+06 -4.926494274939477e+06 4.641481780647893e+06 -2.839912563588357e+03 -4.542936446028258e+03 -5.520173185747494e+03 1.916777237000000e-03 7.331033551700000e-04 1.159442133400000e-03 2.443150217600000e-03 1.867794695500000e-03 3.274438960700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.920000000000000e+02 -1.167070047232581e+06 -4.926585132388047e+06 4.641371376049115e+06 -2.839897313451336e+03 -4.542808044682814e+03 -5.520287185139953e+03 1.916777237000000e-03 7.331033551700000e-04 1.159442133400000e-03 2.443150217600000e-03 1.867794695500000e-03 3.274438960700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.930000000000000e+02 -1.167126845007805e+06 -4.926675987239993e+06 4.641260969216676e+06 -2.839882074955960e+03 -4.542679939136136e+03 -5.520400926003512e+03 1.916777237000000e-03 7.331033551700000e-04 1.159442133400000e-03 2.443150217600000e-03 1.867794695500000e-03 3.274438960700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.940000000000000e+02 -1.167183642487466e+06 -4.926766839533217e+06 4.641150560074680e+06 -2.839866803445793e+03 -4.542551083979373e+03 -5.520515304795755e+03 1.916777237000000e-03 7.331033551700000e-04 1.159442133400000e-03 2.443150217600000e-03 1.867794695500000e-03 3.274438960700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.950000000000000e+02 -1.167240439663165e+06 -4.926857689252108e+06 4.641040148641804e+06 -2.839851529672712e+03 -4.542422226824200e+03 -5.520629680940214e+03 1.916777237000000e-03 7.331033551700000e-04 1.159442133400000e-03 2.443150217600000e-03 1.867794695500000e-03 3.274438960700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.960000000000000e+02 -1.167297236535031e+06 -4.926948536396886e+06 4.640929734917783e+06 -2.839836255090182e+03 -4.542293366952744e+03 -5.520744054385536e+03 1.916777237000000e-03 7.331033551700000e-04 1.159442133400000e-03 2.443150217600000e-03 1.867794695500000e-03 3.274438960700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.970000000000000e+02 -1.167354033080494e+06 -4.927039380925559e+06 4.640819318952872e+06 -2.839820978494224e+03 -4.542164508905134e+03 -5.520858421867362e+03 1.916730697200000e-03 7.327987657500000e-04 1.159614788800000e-03 2.442315812500000e-03 1.867673317500000e-03 3.275423854800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.980000000000000e+02 -1.167410829355605e+06 -4.927130222942557e+06 4.640708900622107e+06 -2.839805700065937e+03 -4.542035643028407e+03 -5.520972791395001e+03 1.916730697200000e-03 7.327987657500000e-04 1.159614788800000e-03 2.442315812500000e-03 1.867673317500000e-03 3.275423854800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.990000000000000e+02 -1.167467625337872e+06 -4.927221062406025e+06 4.640598479975575e+06 -2.839790418715379e+03 -4.541906773493767e+03 -5.521087159961718e+03 1.916730697200000e-03 7.327987657500000e-04 1.159614788800000e-03 2.442315812500000e-03 1.867673317500000e-03 3.275423854800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.000000000000000e+02 -1.167524420960092e+06 -4.927311899190725e+06 4.640488057163144e+06 -2.839775137564015e+03 -4.541777910421434e+03 -5.521201517683911e+03 1.916730697200000e-03 7.327987657500000e-04 1.159614788800000e-03 2.442315812500000e-03 1.867673317500000e-03 3.275423854800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.010000000000000e+02 -1.167581216323027e+06 -4.927402733484466e+06 4.640377631960077e+06 -2.839759853587550e+03 -4.541649038200998e+03 -5.521315879002683e+03 1.916730697200000e-03 7.327987657500000e-04 1.159614788800000e-03 2.442315812500000e-03 1.867673317500000e-03 3.275423854800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.020000000000000e+02 -1.167638011367999e+06 -4.927493565189105e+06 4.640267204495324e+06 -2.839744435115327e+03 -4.541520477759975e+03 -5.521430034130097e+03 1.916730697200000e-03 7.327987657500000e-04 1.159614788800000e-03 2.442315812500000e-03 1.867673317500000e-03 3.275423854800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.030000000000000e+02 -1.167694806077752e+06 -4.927584394279960e+06 4.640156774806090e+06 -2.839728927258385e+03 -4.541392126038913e+03 -5.521544049175813e+03 1.916730697200000e-03 7.327987657500000e-04 1.159614788800000e-03 2.442315812500000e-03 1.867673317500000e-03 3.275423854800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.040000000000000e+02 -1.167751600509837e+06 -4.927675220845649e+06 4.640046342767142e+06 -2.839713637947765e+03 -4.541263247272046e+03 -5.521658402340074e+03 1.916730697200000e-03 7.327987657500000e-04 1.159614788800000e-03 2.442315812500000e-03 1.867673317500000e-03 3.275423854800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.050000000000000e+02 -1.167808394626511e+06 -4.927766044815863e+06 4.639935908462640e+06 -2.839698347157437e+03 -4.541134367939999e+03 -5.521772751303821e+03 1.916730697200000e-03 7.327987657500000e-04 1.159614788800000e-03 2.442315812500000e-03 1.867673317500000e-03 3.275423854800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.060000000000000e+02 -1.167865188438829e+06 -4.927856866211262e+06 4.639825471867855e+06 -2.839683053735073e+03 -4.541005486782760e+03 -5.521887097640480e+03 1.916730697200000e-03 7.327987657500000e-04 1.159614788800000e-03 2.442315812500000e-03 1.867673317500000e-03 3.275423854800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.070000000000000e+02 -1.167921981969292e+06 -4.927947685073739e+06 4.639715032932631e+06 -2.839667759080832e+03 -4.540876599440735e+03 -5.522001444373384e+03 1.916684092000000e-03 7.324940982599999e-04 1.159787292700000e-03 2.441481475500000e-03 1.867551549200000e-03 3.276408778400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.080000000000000e+02 -1.167978775150603e+06 -4.928038501277970e+06 4.639604591807020e+06 -2.839652463048036e+03 -4.540747717460427e+03 -5.522115781895379e+03 1.916684092000000e-03 7.324940982599999e-04 1.159787292700000e-03 2.441481475500000e-03 1.867551549200000e-03 3.276408778400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.090000000000000e+02 -1.168035568061169e+06 -4.928129314970030e+06 4.639494148316131e+06 -2.839637165177146e+03 -4.540618827615805e+03 -5.522230121492788e+03 1.916684092000000e-03 7.324940982599999e-04 1.159787292700000e-03 2.441481475500000e-03 1.867551549200000e-03 3.276408778400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.100000000000000e+02 -1.168092360644957e+06 -4.928220126045564e+06 4.639383702584909e+06 -2.839621865624315e+03 -4.540489939329622e+03 -5.522344455202048e+03 1.916684092000000e-03 7.324940982599999e-04 1.159787292700000e-03 2.441481475500000e-03 1.867551549200000e-03 3.276408778400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.110000000000000e+02 -1.168149152935402e+06 -4.928310934566902e+06 4.639273254538730e+06 -2.839606563730941e+03 -4.540361047171467e+03 -5.522458787867845e+03 1.916684092000000e-03 7.324940982599999e-04 1.159787292700000e-03 2.441481475500000e-03 1.867551549200000e-03 3.276408778400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.120000000000000e+02 -1.168205944931243e+06 -4.928401740542039e+06 4.639162804183202e+06 -2.839591190951622e+03 -4.540232539404275e+03 -5.522572825065521e+03 1.916684092000000e-03 7.324940982599999e-04 1.159787292700000e-03 2.441481475500000e-03 1.867551549200000e-03 3.276408778400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.130000000000000e+02 -1.168262736603401e+06 -4.928492543923707e+06 4.639052351585020e+06 -2.839575770428658e+03 -4.540104289182313e+03 -5.522686662666879e+03 1.916684092000000e-03 7.324940982599999e-04 1.159787292700000e-03 2.441481475500000e-03 1.867551549200000e-03 3.276408778400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.140000000000000e+02 -1.168319527965100e+06 -4.928583344719361e+06 4.638941896709986e+06 -2.839560463088232e+03 -4.539975390561541e+03 -5.522800987164927e+03 1.916684092000000e-03 7.324940982599999e-04 1.159787292700000e-03 2.441481475500000e-03 1.867551549200000e-03 3.276408778400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.150000000000000e+02 -1.168376318999931e+06 -4.928674142898409e+06 4.638831439594741e+06 -2.839545155739224e+03 -4.539846492955506e+03 -5.522915305479598e+03 1.916684092000000e-03 7.324940982599999e-04 1.159787292700000e-03 2.441481475500000e-03 1.867551549200000e-03 3.276408778400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.160000000000000e+02 -1.168433109763684e+06 -4.928764938564839e+06 4.638720980114744e+06 -2.839529844892784e+03 -4.539717588096503e+03 -5.523029626101293e+03 1.916684092000000e-03 7.324940982599999e-04 1.159787292700000e-03 2.441481475500000e-03 1.867551549200000e-03 3.276408778400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.170000000000000e+02 -1.168489900233880e+06 -4.928855731676806e+06 4.638610518320111e+06 -2.839514531459401e+03 -4.539588679383663e+03 -5.523143945774246e+03 1.916637421700000e-03 7.321893526300000e-04 1.159959645300000e-03 2.440647206400000e-03 1.867429390700000e-03 3.277393732300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.180000000000000e+02 -1.168546690354740e+06 -4.928946522130374e+06 4.638500054335333e+06 -2.839499218891026e+03 -4.539459775280196e+03 -5.523258255861896e+03 1.916637421700000e-03 7.321893526300000e-04 1.159959645300000e-03 2.440647206400000e-03 1.867429390700000e-03 3.277393732300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.190000000000000e+02 -1.168603480204414e+06 -4.929037310071184e+06 4.638389587985964e+06 -2.839483902687131e+03 -4.539330863720520e+03 -5.523372568488076e+03 1.916637421700000e-03 7.321893526300000e-04 1.159959645300000e-03 2.440647206400000e-03 1.867429390700000e-03 3.277393732300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.200000000000000e+02 -1.168660269726883e+06 -4.929128095394914e+06 4.638279119396971e+06 -2.839468585194058e+03 -4.539201953757956e+03 -5.523486875018888e+03 1.916637421700000e-03 7.321893526300000e-04 1.159959645300000e-03 2.440647206400000e-03 1.867429390700000e-03 3.277393732300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.210000000000000e+02 -1.168717058933451e+06 -4.929218878122605e+06 4.638168648543150e+06 -2.839453267288825e+03 -4.539073042983393e+03 -5.523601177077907e+03 1.916637421700000e-03 7.321893526300000e-04 1.159959645300000e-03 2.440647206400000e-03 1.867429390700000e-03 3.277393732300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.220000000000000e+02 -1.168773847870052e+06 -4.929309658345157e+06 4.638058175332256e+06 -2.839438015362064e+03 -4.538944518597977e+03 -5.523715120694993e+03 1.916637421700000e-03 7.321893526300000e-04 1.159959645300000e-03 2.440647206400000e-03 1.867429390700000e-03 3.277393732300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.230000000000000e+02 -1.168830636484562e+06 -4.929400435968916e+06 4.637947699887505e+06 -2.839422809760101e+03 -4.538816253992560e+03 -5.523828820716756e+03 1.916637421700000e-03 7.321893526300000e-04 1.159959645300000e-03 2.440647206400000e-03 1.867429390700000e-03 3.277393732300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.240000000000000e+02 -1.168887424743925e+06 -4.929491210923617e+06 4.637837222265426e+06 -2.839407486316265e+03 -4.538687338701432e+03 -5.523943113030855e+03 1.916637421700000e-03 7.321893526300000e-04 1.159959645300000e-03 2.440647206400000e-03 1.867429390700000e-03 3.277393732300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.250000000000000e+02 -1.168944212754170e+06 -4.929581983406818e+06 4.637726742229323e+06 -2.839392158839987e+03 -4.538558412726428e+03 -5.524057410762072e+03 1.916637421700000e-03 7.321893526300000e-04 1.159959645300000e-03 2.440647206400000e-03 1.867429390700000e-03 3.277393732300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.260000000000000e+02 -1.169001000425978e+06 -4.929672753252119e+06 4.637616259978573e+06 -2.839376831626690e+03 -4.538429489427224e+03 -5.524171700799097e+03 1.916637421700000e-03 7.321893526300000e-04 1.159959645300000e-03 2.440647206400000e-03 1.867429390700000e-03 3.277393732300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.270000000000000e+02 -1.169057787803962e+06 -4.929763520542650e+06 4.637505775413565e+06 -2.839361501883073e+03 -4.538300562325876e+03 -5.524285989818241e+03 1.916590686300000e-03 7.318845289300000e-04 1.160131846800000e-03 2.439813005600000e-03 1.867306842000000e-03 3.278378716600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.280000000000000e+02 -1.169114574876813e+06 -4.929854285257414e+06 4.637395288559468e+06 -2.839346169662939e+03 -4.538171633234626e+03 -5.524400276278435e+03 1.916590686300000e-03 7.318845289300000e-04 1.160131846800000e-03 2.439813005600000e-03 1.867306842000000e-03 3.278378716600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.290000000000000e+02 -1.169171361644669e+06 -4.929945047396624e+06 4.637284799416019e+06 -2.839330836911925e+03 -4.538042701580508e+03 -5.524514559785822e+03 1.916590686300000e-03 7.318845289300000e-04 1.160131846800000e-03 2.439813005600000e-03 1.867306842000000e-03 3.278378716600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.300000000000000e+02 -1.169228148107405e+06 -4.930035806960110e+06 4.637174307983432e+06 -2.839315501715297e+03 -4.537913768106537e+03 -5.524628840578085e+03 1.916590686300000e-03 7.318845289300000e-04 1.160131846800000e-03 2.439813005600000e-03 1.867306842000000e-03 3.278378716600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.310000000000000e+02 -1.169284934264909e+06 -4.930126563947693e+06 4.637063814261919e+06 -2.839300164358477e+03 -4.537784832380954e+03 -5.524743118888424e+03 1.916590686300000e-03 7.318845289300000e-04 1.160131846800000e-03 2.439813005600000e-03 1.867306842000000e-03 3.278378716600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.320000000000000e+02 -1.169341720123623e+06 -4.930217318387037e+06 4.636953318229603e+06 -2.839284582443540e+03 -4.537656223267795e+03 -5.524857228321160e+03 1.916590686300000e-03 7.318845289300000e-04 1.160131846800000e-03 2.439813005600000e-03 1.867306842000000e-03 3.278378716600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.330000000000000e+02 -1.169398505656603e+06 -4.930308070238420e+06 4.636842819941572e+06 -2.839268836683422e+03 -4.537527833272874e+03 -5.524971222610785e+03 1.916590686300000e-03 7.318845289300000e-04 1.160131846800000e-03 2.439813005600000e-03 1.867306842000000e-03 3.278378716600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.340000000000000e+02 -1.169455290858296e+06 -4.930398819465403e+06 4.636732319422763e+06 -2.839253495830934e+03 -4.537398894377855e+03 -5.525085489119494e+03 1.916590686300000e-03 7.318845289300000e-04 1.160131846800000e-03 2.439813005600000e-03 1.867306842000000e-03 3.278378716600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.350000000000000e+02 -1.169512075777055e+06 -4.930489566158090e+06 4.636621816565169e+06 -2.839238151890624e+03 -4.537269949981590e+03 -5.525199756281616e+03 1.916590686300000e-03 7.318845289300000e-04 1.160131846800000e-03 2.439813005600000e-03 1.867306842000000e-03 3.278378716600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.360000000000000e+02 -1.169568860412762e+06 -4.930580310316293e+06 4.636511311368992e+06 -2.839222804780890e+03 -4.537140999787455e+03 -5.525314024381477e+03 1.916590686300000e-03 7.318845289300000e-04 1.160131846800000e-03 2.439813005600000e-03 1.867306842000000e-03 3.278378716600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.370000000000000e+02 -1.169625644698471e+06 -4.930671051815315e+06 4.636400803983746e+06 -2.839207458709298e+03 -4.537012054289997e+03 -5.525428282751129e+03 1.916543885900000e-03 7.315796270600000e-04 1.160303897300000e-03 2.438978872800000e-03 1.867183903200000e-03 3.279363732100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.380000000000000e+02 -1.169682428712318e+06 -4.930761790800725e+06 4.636290294234910e+06 -2.839192108921598e+03 -4.536883101654281e+03 -5.525542543425067e+03 1.916543885900000e-03 7.315796270600000e-04 1.160303897300000e-03 2.438978872800000e-03 1.867183903200000e-03 3.279363732100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.390000000000000e+02 -1.169739212409470e+06 -4.930852527189062e+06 4.636179782222545e+06 -2.839176757521561e+03 -4.536754148506706e+03 -5.525656799915781e+03 1.916543885900000e-03 7.315796270600000e-04 1.160303897300000e-03 2.438978872800000e-03 1.867183903200000e-03 3.279363732100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.400000000000000e+02 -1.169795995801233e+06 -4.930943261001368e+06 4.636069267921425e+06 -2.839161405078297e+03 -4.536625193022366e+03 -5.525771053494503e+03 1.916543885900000e-03 7.315796270600000e-04 1.160303897300000e-03 2.438978872800000e-03 1.867183903200000e-03 3.279363732100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.410000000000000e+02 -1.169852778887492e+06 -4.931033992237468e+06 4.635958751331761e+06 -2.839146050626973e+03 -4.536496235303352e+03 -5.525885304508794e+03 1.916543885900000e-03 7.315796270600000e-04 1.160303897300000e-03 2.438978872800000e-03 1.867183903200000e-03 3.279363732100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.420000000000000e+02 -1.169909561646211e+06 -4.931124720863192e+06 4.635848232510258e+06 -2.839130716289931e+03 -4.536367660639112e+03 -5.525999220776214e+03 1.916543885900000e-03 7.315796270600000e-04 1.160303897300000e-03 2.438978872800000e-03 1.867183903200000e-03 3.279363732100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.430000000000000e+02 -1.169966344113333e+06 -4.931215446949970e+06 4.635737711381677e+06 -2.839115394832157e+03 -4.536239332781837e+03 -5.526112919523269e+03 1.916543885900000e-03 7.315796270600000e-04 1.160303897300000e-03 2.438978872800000e-03 1.867183903200000e-03 3.279363732100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.440000000000000e+02 -1.170023126236293e+06 -4.931306170388632e+06 4.635627188050807e+06 -2.839100035731153e+03 -4.536110372308300e+03 -5.526227158916675e+03 1.916543885900000e-03 7.315796270600000e-04 1.160303897300000e-03 2.438978872800000e-03 1.867183903200000e-03 3.279363732100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.450000000000000e+02 -1.170079908098244e+06 -4.931396891334045e+06 4.635516662331912e+06 -2.839084672892321e+03 -4.535981402652804e+03 -5.526341402331580e+03 1.916543885900000e-03 7.315796270600000e-04 1.160303897300000e-03 2.438978872800000e-03 1.867183903200000e-03 3.279363732100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.460000000000000e+02 -1.170136689632235e+06 -4.931487609661536e+06 4.635406134374523e+06 -2.839069309969312e+03 -4.535852434081943e+03 -5.526455639542997e+03 1.916543885900000e-03 7.315796270600000e-04 1.160303897300000e-03 2.438978872800000e-03 1.867183903200000e-03 3.279363732100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.470000000000000e+02 -1.170193470838072e+06 -4.931578325370803e+06 4.635295604179007e+06 -2.839053945078582e+03 -4.535723467291401e+03 -5.526569870814719e+03 1.916497020500000e-03 7.312746470800000e-04 1.160475796800000e-03 2.438144808300000e-03 1.867060574400000e-03 3.280348779100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.480000000000000e+02 -1.170250251760596e+06 -4.931669038545320e+06 4.635185071645238e+06 -2.839038578720682e+03 -4.535594494182935e+03 -5.526684102693697e+03 1.916497020500000e-03 7.312746470800000e-04 1.160475796800000e-03 2.438144808300000e-03 1.867060574400000e-03 3.280348779100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.490000000000000e+02 -1.170307032410866e+06 -4.931759749205721e+06 4.635074536748463e+06 -2.839023208754726e+03 -4.535465514149155e+03 -5.526798336647696e+03 1.916497020500000e-03 7.312746470800000e-04 1.160475796800000e-03 2.438144808300000e-03 1.867060574400000e-03 3.280348779100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.500000000000000e+02 -1.170363812699344e+06 -4.931850457185335e+06 4.634963999688632e+06 -2.839007838709218e+03 -4.535336540698760e+03 -5.526912559799483e+03 1.916497020500000e-03 7.312746470800000e-04 1.160475796800000e-03 2.438144808300000e-03 1.867060574400000e-03 3.280348779100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.510000000000000e+02 -1.170420592704399e+06 -4.931941162630064e+06 4.634853460290707e+06 -2.838992466877366e+03 -4.535207561157114e+03 -5.527026783511716e+03 1.916497020500000e-03 7.312746470800000e-04 1.160475796800000e-03 2.438144808300000e-03 1.867060574400000e-03 3.280348779100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.520000000000000e+02 -1.170477372401133e+06 -4.932031865507069e+06 4.634742918611214e+06 -2.838976971124473e+03 -4.535079027235198e+03 -5.527140684938235e+03 1.916497020500000e-03 7.312746470800000e-04 1.160475796800000e-03 2.438144808300000e-03 1.867060574400000e-03 3.280348779100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.530000000000000e+02 -1.170534151780964e+06 -4.932122565809376e+06 4.634632374669896e+06 -2.838961392216275e+03 -4.534950788275323e+03 -5.527254371763398e+03 1.916497020500000e-03 7.312746470800000e-04 1.160475796800000e-03 2.438144808300000e-03 1.867060574400000e-03 3.280348779100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.540000000000000e+02 -1.170590930858405e+06 -4.932213263541541e+06 4.634521828432781e+06 -2.838946014756458e+03 -4.534821800409837e+03 -5.527368588940945e+03 1.916497020500000e-03 7.312746470800000e-04 1.160475796800000e-03 2.438144808300000e-03 1.867060574400000e-03 3.280348779100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.550000000000000e+02 -1.170647709596315e+06 -4.932303958634463e+06 4.634411279982796e+06 -2.838930636351082e+03 -4.534692816000457e+03 -5.527482798320735e+03 1.916497020500000e-03 7.312746470800000e-04 1.160475796800000e-03 2.438144808300000e-03 1.867060574400000e-03 3.280348779100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.560000000000000e+02 -1.170704488050465e+06 -4.932394651192022e+06 4.634300729195303e+06 -2.838915254730054e+03 -4.534563826172359e+03 -5.527597008339188e+03 1.916497020500000e-03 7.312746470800000e-04 1.160475796800000e-03 2.438144808300000e-03 1.867060574400000e-03 3.280348779100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.570000000000000e+02 -1.170761266198627e+06 -4.932485341172813e+06 4.634190176119980e+06 -2.838899872479760e+03 -4.534434833601692e+03 -5.527711215599239e+03 1.916450090400000e-03 7.309695889300000e-04 1.160647545600000e-03 2.437310812100000e-03 1.866936855500000e-03 3.281333858200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.580000000000000e+02 -1.170818044062957e+06 -4.932576028618138e+06 4.634079620707254e+06 -2.838884486504292e+03 -4.534305835691168e+03 -5.527825423659955e+03 1.916450090400000e-03 7.309695889300000e-04 1.160647545600000e-03 2.437310812100000e-03 1.866936855500000e-03 3.281333858200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.590000000000000e+02 -1.170874821587698e+06 -4.932666713424184e+06 4.633969063081723e+06 -2.838869101176789e+03 -4.534176840540276e+03 -5.527939623791080e+03 1.916450090400000e-03 7.309695889300000e-04 1.160647545600000e-03 2.437310812100000e-03 1.866936855500000e-03 3.281333858200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.600000000000000e+02 -1.170931598806262e+06 -4.932757395653203e+06 4.633858503168681e+06 -2.838853713361925e+03 -4.534047843550857e+03 -5.528053821241768e+03 1.916450090400000e-03 7.309695889300000e-04 1.160647545600000e-03 2.437310812100000e-03 1.866936855500000e-03 3.281333858200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.610000000000000e+02 -1.170988375729713e+06 -4.932848075325825e+06 4.633747940943372e+06 -2.838838323045793e+03 -4.533918842785497e+03 -5.528168017637177e+03 1.916450090400000e-03 7.309695889300000e-04 1.160647545600000e-03 2.437310812100000e-03 1.866936855500000e-03 3.281333858200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.620000000000000e+02 -1.171045152347420e+06 -4.932938752427900e+06 4.633637376436062e+06 -2.838822952783026e+03 -4.533790161190530e+03 -5.528281933011269e+03 1.916450090400000e-03 7.309695889300000e-04 1.160647545600000e-03 2.437310812100000e-03 1.866936855500000e-03 3.281333858200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.630000000000000e+02 -1.171101928645328e+06 -4.933029426937067e+06 4.633526809682422e+06 -2.838807594472756e+03 -4.533661692998925e+03 -5.528395659397963e+03 1.916450090400000e-03 7.309695889300000e-04 1.160647545600000e-03 2.437310812100000e-03 1.866936855500000e-03 3.281333858200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.640000000000000e+02 -1.171158704664810e+06 -4.933120098920972e+06 4.633416240579143e+06 -2.838792198020894e+03 -4.533532682185984e+03 -5.528509850946482e+03 1.916450090400000e-03 7.309695889300000e-04 1.160647545600000e-03 2.437310812100000e-03 1.866936855500000e-03 3.281333858200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.650000000000000e+02 -1.171215480355670e+06 -4.933210768286148e+06 4.633305669238415e+06 -2.838776801570437e+03 -4.533403672320815e+03 -5.528624036370416e+03 1.916450090400000e-03 7.309695889300000e-04 1.160647545600000e-03 2.437310812100000e-03 1.866936855500000e-03 3.281333858200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.660000000000000e+02 -1.171272255728966e+06 -4.933301435053229e+06 4.633195095635482e+06 -2.838761403273365e+03 -4.533274662215284e+03 -5.528738217491405e+03 1.916450090400000e-03 7.309695889300000e-04 1.160647545600000e-03 2.437310812100000e-03 1.866936855500000e-03 3.281333858200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.670000000000000e+02 -1.171329030795759e+06 -4.933392099242846e+06 4.633084519745574e+06 -2.838746002632724e+03 -4.533145650037216e+03 -5.528852396063012e+03 1.916403095400000e-03 7.306644525399999e-04 1.160819143800000e-03 2.436476883900000e-03 1.866812746700000e-03 3.282318970100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.680000000000000e+02 -1.171385805567351e+06 -4.933482760876016e+06 4.632973941543460e+06 -2.838730600964762e+03 -4.533016633575247e+03 -5.528966573342265e+03 1.916403095400000e-03 7.306644525399999e-04 1.160819143800000e-03 2.436476883900000e-03 1.866812746700000e-03 3.282318970100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.690000000000000e+02 -1.171442580043626e+06 -4.933573419952565e+06 4.632863361029346e+06 -2.838715196480159e+03 -4.532887613417141e+03 -5.529080749640234e+03 1.916403095400000e-03 7.306644525399999e-04 1.160819143800000e-03 2.436476883900000e-03 1.866812746700000e-03 3.282318970100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.700000000000000e+02 -1.171499354179764e+06 -4.933664076389114e+06 4.632752778303358e+06 -2.838699791080532e+03 -4.532758596525911e+03 -5.529194918288372e+03 1.916403095400000e-03 7.306644525399999e-04 1.160819143800000e-03 2.436476883900000e-03 1.866812746700000e-03 3.282318970100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.710000000000000e+02 -1.171556128031773e+06 -4.933754730289883e+06 4.632642193240344e+06 -2.838684384085841e+03 -4.532629573471685e+03 -5.529309087468044e+03 1.916403095400000e-03 7.306644525399999e-04 1.160819143800000e-03 2.436476883900000e-03 1.866812746700000e-03 3.282318970100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.720000000000000e+02 -1.171612901573593e+06 -4.933845381620971e+06 4.632531605895728e+06 -2.838668798704362e+03 -4.532500948585298e+03 -5.529422998731588e+03 1.916403095400000e-03 7.306644525399999e-04 1.160819143800000e-03 2.436476883900000e-03 1.866812746700000e-03 3.282318970100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.730000000000000e+02 -1.171669674795743e+06 -4.933936030374351e+06 4.632421016288907e+06 -2.838653096208484e+03 -4.532372586324184e+03 -5.529536737829148e+03 1.916403095400000e-03 7.306644525399999e-04 1.160819143800000e-03 2.436476883900000e-03 1.866812746700000e-03 3.282318970100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.740000000000000e+02 -1.171726447694254e+06 -4.934026676518496e+06 4.632310424433276e+06 -2.838637683481681e+03 -4.532243556987539e+03 -5.529650898802573e+03 1.916403095400000e-03 7.306644525399999e-04 1.160819143800000e-03 2.436476883900000e-03 1.866812746700000e-03 3.282318970100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.750000000000000e+02 -1.171783220297155e+06 -4.934117320105628e+06 4.632199830266129e+06 -2.838622267962735e+03 -4.532114523909561e+03 -5.529765058821041e+03 1.916403095400000e-03 7.306644525399999e-04 1.160819143800000e-03 2.436476883900000e-03 1.866812746700000e-03 3.282318970100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.760000000000000e+02 -1.171839992571041e+06 -4.934207961073571e+06 4.632089233862150e+06 -2.838606852344837e+03 -4.531985492000168e+03 -5.529879212577314e+03 1.916403095400000e-03 7.306644525399999e-04 1.160819143800000e-03 2.436476883900000e-03 1.866812746700000e-03 3.282318970100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.770000000000000e+02 -1.171896764560510e+06 -4.934298599505340e+06 4.631978635121617e+06 -2.838591433981583e+03 -4.531856454351886e+03 -5.529993367025540e+03 1.916356035800000e-03 7.303592379900000e-04 1.160990591400000e-03 2.435643024100000e-03 1.866688248000000e-03 3.283304115100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.780000000000000e+02 -1.171953536209556e+06 -4.934389235296768e+06 4.631868034169662e+06 -2.838576014284956e+03 -4.531727420126997e+03 -5.530107513882613e+03 1.916356035800000e-03 7.303592379900000e-04 1.160990591400000e-03 2.435643024100000e-03 1.866688248000000e-03 3.283304115100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.790000000000000e+02 -1.172010307596540e+06 -4.934479868593663e+06 4.631757430831142e+06 -2.838560592371788e+03 -4.531598376298026e+03 -5.530221664421426e+03 1.916356035800000e-03 7.303592379900000e-04 1.160990591400000e-03 2.435643024100000e-03 1.866688248000000e-03 3.283304115100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.800000000000000e+02 -1.172067078654292e+06 -4.934570499271062e+06 4.631646825256165e+06 -2.838545168846176e+03 -4.531469334051521e+03 -5.530335809031350e+03 1.916356035800000e-03 7.303592379900000e-04 1.160990591400000e-03 2.435643024100000e-03 1.866688248000000e-03 3.283304115100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.810000000000000e+02 -1.172123849393871e+06 -4.934661127349591e+06 4.631536217419959e+06 -2.838529743609350e+03 -4.531340291335026e+03 -5.530449949470507e+03 1.916356035800000e-03 7.303592379900000e-04 1.160990591400000e-03 2.435643024100000e-03 1.866688248000000e-03 3.283304115100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.820000000000000e+02 -1.172180619839827e+06 -4.934751752878908e+06 4.631425607279762e+06 -2.838514420495992e+03 -4.531211636655004e+03 -5.530563714882419e+03 1.916356035800000e-03 7.303592379900000e-04 1.160990591400000e-03 2.435643024100000e-03 1.866688248000000e-03 3.283304115100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.830000000000000e+02 -1.172237389946290e+06 -4.934842375776360e+06 4.631314994946084e+06 -2.838499164614165e+03 -4.531083245071190e+03 -5.530677225237603e+03 1.916356035800000e-03 7.303592379900000e-04 1.160990591400000e-03 2.435643024100000e-03 1.866688248000000e-03 3.283304115100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.840000000000000e+02 -1.172294159787169e+06 -4.934932996172830e+06 4.631204380233576e+06 -2.838483734207314e+03 -4.530954192350823e+03 -5.530791360370473e+03 1.916356035800000e-03 7.303592379900000e-04 1.160990591400000e-03 2.435643024100000e-03 1.866688248000000e-03 3.283304115100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.850000000000000e+02 -1.172350929332166e+06 -4.935023614011976e+06 4.631093763209921e+06 -2.838468301057922e+03 -4.530825135543493e+03 -5.530905494813764e+03 1.916356035800000e-03 7.303592379900000e-04 1.160990591400000e-03 2.435643024100000e-03 1.866688248000000e-03 3.283304115100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.860000000000000e+02 -1.172407698547638e+06 -4.935114229231242e+06 4.630983143950303e+06 -2.838452866506072e+03 -4.530696080315432e+03 -5.531019623237642e+03 1.916356035800000e-03 7.303592379900000e-04 1.160990591400000e-03 2.435643024100000e-03 1.866688248000000e-03 3.283304115100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.870000000000000e+02 -1.172464467433714e+06 -4.935204841830851e+06 4.630872522454459e+06 -2.838437432004209e+03 -4.530567026239581e+03 -5.531133745348128e+03 1.916308911700000e-03 7.300539451700000e-04 1.161161888700000e-03 2.434809232500000e-03 1.866563359400000e-03 3.284289293800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.880000000000000e+02 -1.172521236046152e+06 -4.935295451914587e+06 4.630761898597664e+06 -2.838421994136050e+03 -4.530437964708826e+03 -5.531247869859329e+03 1.916308911700000e-03 7.300539451700000e-04 1.161161888700000e-03 2.434809232500000e-03 1.866563359400000e-03 3.284289293800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.890000000000000e+02 -1.172578004362481e+06 -4.935386059440690e+06 4.630651272430108e+06 -2.838406553386064e+03 -4.530308899615299e+03 -5.531361993305560e+03 1.916308911700000e-03 7.300539451700000e-04 1.161161888700000e-03 2.434809232500000e-03 1.866563359400000e-03 3.284289293800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.900000000000000e+02 -1.172634772326963e+06 -4.935476664305428e+06 4.630540644076464e+06 -2.838391113701064e+03 -4.530179838825577e+03 -5.531476107353968e+03 1.916308911700000e-03 7.300539451700000e-04 1.161161888700000e-03 2.434809232500000e-03 1.866563359400000e-03 3.284289293800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.910000000000000e+02 -1.172691540006521e+06 -4.935567266633363e+06 4.630430013387017e+06 -2.838375670749730e+03 -4.530050772561325e+03 -5.531590222105180e+03 1.916308911700000e-03 7.300539451700000e-04 1.161161888700000e-03 2.434809232500000e-03 1.866563359400000e-03 3.284289293800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.920000000000000e+02 -1.172748307350982e+06 -4.935657866347280e+06 4.630319380464622e+06 -2.838359958130226e+03 -4.529922013117632e+03 -5.531704196330925e+03 1.916308911700000e-03 7.300539451700000e-04 1.161161888700000e-03 2.434809232500000e-03 1.866563359400000e-03 3.284289293800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.930000000000000e+02 -1.172805074392089e+06 -4.935748463516862e+06 4.630208745232150e+06 -2.838344066361132e+03 -4.529793449767618e+03 -5.531818081870466e+03 1.916308911700000e-03 7.300539451700000e-04 1.161161888700000e-03 2.434809232500000e-03 1.866563359400000e-03 3.284289293800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.940000000000000e+02 -1.172861841135118e+06 -4.935839058125239e+06 4.630098107693218e+06 -2.838328617324733e+03 -4.529664373641889e+03 -5.531932191557493e+03 1.916308911700000e-03 7.300539451700000e-04 1.161161888700000e-03 2.434809232500000e-03 1.866563359400000e-03 3.284289293800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.950000000000000e+02 -1.172918607525960e+06 -4.935929650071779e+06 4.629987467968798e+06 -2.838313167700806e+03 -4.529535302286453e+03 -5.532046292199363e+03 1.916308911700000e-03 7.300539451700000e-04 1.161161888700000e-03 2.434809232500000e-03 1.866563359400000e-03 3.284289293800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.960000000000000e+02 -1.172975373631787e+06 -4.936020239481434e+06 4.629876825908691e+06 -2.838297716587480e+03 -4.529406225200061e+03 -5.532160392961131e+03 1.916308911700000e-03 7.300539451700000e-04 1.161161888700000e-03 2.434809232500000e-03 1.866563359400000e-03 3.284289293800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.970000000000000e+02 -1.173032139430047e+06 -4.936110826312316e+06 4.629766181563242e+06 -2.838282262485241e+03 -4.529277146135861e+03 -5.532274491383416e+03 1.916261723000000e-03 7.297485741300000e-04 1.161333035700000e-03 2.433975509300000e-03 1.866438081100000e-03 3.285274506600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.980000000000000e+02 -1.173088904920877e+06 -4.936201410564650e+06 4.629655534932193e+06 -2.838266807859823e+03 -4.529148064547033e+03 -5.532388586817739e+03 1.916261723000000e-03 7.297485741300000e-04 1.161333035700000e-03 2.433975509300000e-03 1.866438081100000e-03 3.285274506600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.990000000000000e+02 -1.173145670126497e+06 -4.936291992279826e+06 4.629544885965766e+06 -2.838251349979527e+03 -4.529018977515313e+03 -5.532502682921848e+03 1.916261723000000e-03 7.297485741300000e-04 1.161333035700000e-03 2.433975509300000e-03 1.866438081100000e-03 3.285274506600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.000000000000000e+02 -1.173202434990930e+06 -4.936382571353746e+06 4.629434234789144e+06 -2.838235891166943e+03 -4.528889893618796e+03 -5.532616771500427e+03 1.916261723000000e-03 7.297485741300000e-04 1.161333035700000e-03 2.433975509300000e-03 1.866438081100000e-03 3.285274506600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.010000000000000e+02 -1.173259199558994e+06 -4.936473147869769e+06 4.629323581302088e+06 -2.838220431066320e+03 -4.528760805534964e+03 -5.532730858820491e+03 1.916261723000000e-03 7.297485741300000e-04 1.161333035700000e-03 2.433975509300000e-03 1.866438081100000e-03 3.285274506600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.020000000000000e+02 -1.173315963810116e+06 -4.936563721794691e+06 4.629212925562739e+06 -2.838205063292064e+03 -4.528632143417418e+03 -5.532844544198377e+03 1.916261723000000e-03 7.297485741300000e-04 1.161333035700000e-03 2.433975509300000e-03 1.866438081100000e-03 3.285274506600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.030000000000000e+02 -1.173372727749885e+06 -4.936654293142287e+06 4.629102267566605e+06 -2.838189755543937e+03 -4.528503762107792e+03 -5.532957963193769e+03 1.916261723000000e-03 7.297485741300000e-04 1.161333035700000e-03 2.433975509300000e-03 1.866438081100000e-03 3.285274506600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.040000000000000e+02 -1.173429491359338e+06 -4.936744861868904e+06 4.628991607335920e+06 -2.838174291087234e+03 -4.528374671054363e+03 -5.533072038954011e+03 1.916261723000000e-03 7.297485741300000e-04 1.161333035700000e-03 2.433975509300000e-03 1.866438081100000e-03 3.285274506600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.050000000000000e+02 -1.173486254683374e+06 -4.936835428058102e+06 4.628880944770175e+06 -2.838158823483017e+03 -4.528245574408880e+03 -5.533186115459751e+03 1.916261723000000e-03 7.297485741300000e-04 1.161333035700000e-03 2.433975509300000e-03 1.866438081100000e-03 3.285274506600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.060000000000000e+02 -1.173543017699528e+06 -4.936925991668137e+06 4.628770279919581e+06 -2.838143353618029e+03 -4.528116475808305e+03 -5.533300189280877e+03 1.916261723000000e-03 7.297485741300000e-04 1.161333035700000e-03 2.433975509300000e-03 1.866438081100000e-03 3.285274506600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.070000000000000e+02 -1.173599780407931e+06 -4.937016552699233e+06 4.628659612783877e+06 -2.838127883035237e+03 -4.527987374828289e+03 -5.533414260080197e+03 1.916214469900000e-03 7.294431248400000e-04 1.161504032700000e-03 2.433141854400000e-03 1.866312412900000e-03 3.286259754100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.080000000000000e+02 -1.173656542819552e+06 -4.937107111171862e+06 4.628548943338433e+06 -2.838112409122952e+03 -4.527858270014689e+03 -5.533528330239678e+03 1.916214469900000e-03 7.294431248400000e-04 1.161504032700000e-03 2.433141854400000e-03 1.866312412900000e-03 3.286259754100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.090000000000000e+02 -1.173713304912180e+06 -4.937197667044679e+06 4.628438271632981e+06 -2.838096935040533e+03 -4.527729164601804e+03 -5.533642395647862e+03 1.916214469900000e-03 7.294431248400000e-04 1.161504032700000e-03 2.433141854400000e-03 1.866312412900000e-03 3.286259754100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.100000000000000e+02 -1.173770066696867e+06 -4.937288220338293e+06 4.628327597642740e+06 -2.838081458589359e+03 -4.527600057128318e+03 -5.533756458507765e+03 1.916214469900000e-03 7.294431248400000e-04 1.161504032700000e-03 2.433141854400000e-03 1.866312412900000e-03 3.286259754100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.110000000000000e+02 -1.173826828173498e+06 -4.937378771052533e+06 4.628216921367922e+06 -2.838065979941718e+03 -4.527470947749088e+03 -5.533870518613145e+03 1.916214469900000e-03 7.294431248400000e-04 1.161504032700000e-03 2.433141854400000e-03 1.866312412900000e-03 3.286259754100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.120000000000000e+02 -1.173883589337707e+06 -4.937469319194195e+06 4.628106242811725e+06 -2.838050275725150e+03 -4.527342164688628e+03 -5.533984402373073e+03 1.916214469900000e-03 7.294431248400000e-04 1.161504032700000e-03 2.433141854400000e-03 1.866312412900000e-03 3.286259754100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.130000000000000e+02 -1.173940350172330e+06 -4.937559864741279e+06 4.627995562008154e+06 -2.838034421005966e+03 -4.527213598711318e+03 -5.534098167246038e+03 1.916214469900000e-03 7.294431248400000e-04 1.161504032700000e-03 2.433141854400000e-03 1.866312412900000e-03 3.286259754100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.140000000000000e+02 -1.173997110705166e+06 -4.937650407720714e+06 4.627884878905904e+06 -2.838018937076555e+03 -4.527084482855391e+03 -5.534212219120732e+03 1.916214469900000e-03 7.294431248400000e-04 1.161504032700000e-03 2.433141854400000e-03 1.866312412900000e-03 3.286259754100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.150000000000000e+02 -1.174053870918791e+06 -4.937740948100082e+06 4.627774193543977e+06 -2.838003452511045e+03 -4.526955366209408e+03 -5.534326266612436e+03 1.916214469900000e-03 7.294431248400000e-04 1.161504032700000e-03 2.433141854400000e-03 1.866312412900000e-03 3.286259754100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.160000000000000e+02 -1.174110630846614e+06 -4.937831485941540e+06 4.627663505847583e+06 -2.837987965255639e+03 -4.526826243983796e+03 -5.534440314632566e+03 1.916214469900000e-03 7.294431248400000e-04 1.161504032700000e-03 2.433141854400000e-03 1.866312412900000e-03 3.286259754100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.170000000000000e+02 -1.174167390454993e+06 -4.937922021182586e+06 4.627552815891935e+06 -2.837972475897496e+03 -4.526697121400866e+03 -5.534554358565700e+03 1.916167152500000e-03 7.291375972000000e-04 1.161674879600000e-03 2.432308267800000e-03 1.866186355100000e-03 3.287245037000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.180000000000000e+02 -1.174224149766401e+06 -4.938012553864981e+06 4.627442123626774e+06 -2.837956985450230e+03 -4.526567994666313e+03 -5.534668401120146e+03 1.916167152500000e-03 7.291375972000000e-04 1.161674879600000e-03 2.432308267800000e-03 1.866186355100000e-03 3.287245037000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.190000000000000e+02 -1.174280908758380e+06 -4.938103083947008e+06 4.627331429102315e+06 -2.837941493097833e+03 -4.526438867828841e+03 -5.534782439287274e+03 1.916167152500000e-03 7.291375972000000e-04 1.161674879600000e-03 2.432308267800000e-03 1.866186355100000e-03 3.287245037000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.200000000000000e+02 -1.174337667430813e+06 -4.938193611428494e+06 4.627220732318763e+06 -2.837925998936802e+03 -4.526309740271295e+03 -5.534896473538370e+03 1.916167152500000e-03 7.291375972000000e-04 1.161674879600000e-03 2.432308267800000e-03 1.866186355100000e-03 3.287245037000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.210000000000000e+02 -1.174394425795000e+06 -4.938284136330433e+06 4.627110033250868e+06 -2.837910503947951e+03 -4.526180610848811e+03 -5.535010504388450e+03 1.916167152500000e-03 7.291375972000000e-04 1.161674879600000e-03 2.432308267800000e-03 1.866186355100000e-03 3.287245037000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.220000000000000e+02 -1.174451183886796e+06 -4.938374658722389e+06 4.626999331831391e+06 -2.837895131995696e+03 -4.526051851254866e+03 -5.535124166682923e+03 1.916167152500000e-03 7.291375972000000e-04 1.161674879600000e-03 2.432308267800000e-03 1.866186355100000e-03 3.287245037000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.230000000000000e+02 -1.174507941621227e+06 -4.938465178448201e+06 4.626888628259265e+06 -2.837879845022010e+03 -4.525923346694341e+03 -5.535237573130557e+03 1.916167152500000e-03 7.291375972000000e-04 1.161674879600000e-03 2.432308267800000e-03 1.866186355100000e-03 3.287245037000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.240000000000000e+02 -1.174564699055478e+06 -4.938555695609552e+06 4.626777922384628e+06 -2.837864343831934e+03 -4.525794208717712e+03 -5.535351597888840e+03 1.916167152500000e-03 7.291375972000000e-04 1.161674879600000e-03 2.432308267800000e-03 1.866186355100000e-03 3.287245037000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.250000000000000e+02 -1.174621456147667e+06 -4.938646210128611e+06 4.626667214301202e+06 -2.837848841775130e+03 -4.525665074295453e+03 -5.535465614748939e+03 1.916167152500000e-03 7.291375972000000e-04 1.161674879600000e-03 2.432308267800000e-03 1.866186355100000e-03 3.287245037000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.260000000000000e+02 -1.174678212976112e+06 -4.938736722150980e+06 4.626556503833670e+06 -2.837833337025443e+03 -4.525535930218221e+03 -5.535579635532459e+03 1.916167152500000e-03 7.291375972000000e-04 1.161674879600000e-03 2.432308267800000e-03 1.866186355100000e-03 3.287245037000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.270000000000000e+02 -1.174734969507190e+06 -4.938827231614182e+06 4.626445791057263e+06 -2.837817829842948e+03 -4.525406782303596e+03 -5.535693655276204e+03 1.916119770900000e-03 7.288319913100000e-04 1.161845576800000e-03 2.431474749700000e-03 1.866059907600000e-03 3.288230355500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.280000000000000e+02 -1.174791725696099e+06 -4.938917738434958e+06 4.626335076072223e+06 -2.837802321524310e+03 -4.525277637752196e+03 -5.535807667401987e+03 1.916119770900000e-03 7.288319913100000e-04 1.161845576800000e-03 2.431474749700000e-03 1.866059907600000e-03 3.288230355500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.290000000000000e+02 -1.174848481609988e+06 -4.939008242738143e+06 4.626224358728247e+06 -2.837786811216121e+03 -4.525148485451136e+03 -5.535921681548255e+03 1.916119770900000e-03 7.288319913100000e-04 1.161845576800000e-03 2.431474749700000e-03 1.866059907600000e-03 3.288230355500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.300000000000000e+02 -1.174905237192892e+06 -4.939098744419720e+06 4.626113639150579e+06 -2.837771299441619e+03 -4.525019334506330e+03 -5.536035689896309e+03 1.916119770900000e-03 7.288319913100000e-04 1.161845576800000e-03 2.431474749700000e-03 1.866059907600000e-03 3.288230355500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.310000000000000e+02 -1.174961992444691e+06 -4.939189243479520e+06 4.626002917339445e+06 -2.837755786199863e+03 -4.524890185355167e+03 -5.536149692082727e+03 1.916119770900000e-03 7.288319913100000e-04 1.161845576800000e-03 2.431474749700000e-03 1.866059907600000e-03 3.288230355500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.320000000000000e+02 -1.175018747371381e+06 -4.939279739948890e+06 4.625892193275807e+06 -2.837740007177711e+03 -4.524761553069987e+03 -5.536263377442824e+03 1.916119770900000e-03 7.288319913100000e-04 1.161845576800000e-03 2.431474749700000e-03 1.866059907600000e-03 3.288230355500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.330000000000000e+02 -1.175075502041684e+06 -4.939370233969095e+06 4.625781466801972e+06 -2.837724046670771e+03 -4.524633252222796e+03 -5.536376862709598e+03 1.916119770900000e-03 7.288319913100000e-04 1.161845576800000e-03 2.431474749700000e-03 1.866059907600000e-03 3.288230355500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.340000000000000e+02 -1.175132256344472e+06 -4.939460725299857e+06 4.625670738176171e+06 -2.837708529150790e+03 -4.524504096065987e+03 -5.536490856686933e+03 1.916119770900000e-03 7.288319913100000e-04 1.161845576800000e-03 2.431474749700000e-03 1.866059907600000e-03 3.288230355500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.350000000000000e+02 -1.175189010371948e+06 -4.939551214112623e+06 4.625560007191903e+06 -2.837693008167270e+03 -4.524374932630046e+03 -5.536604852951354e+03 1.916119770900000e-03 7.288319913100000e-04 1.161845576800000e-03 2.431474749700000e-03 1.866059907600000e-03 3.288230355500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.360000000000000e+02 -1.175245764079316e+06 -4.939641700324162e+06 4.625449273949430e+06 -2.837677485394799e+03 -4.524245768905388e+03 -5.536718844932573e+03 1.916119770900000e-03 7.288319913100000e-04 1.161845576800000e-03 2.431474749700000e-03 1.866059907600000e-03 3.288230355500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.370000000000000e+02 -1.175302517500209e+06 -4.939732183996984e+06 4.625338538373453e+06 -2.837661960942601e+03 -4.524116599190371e+03 -5.536832837328963e+03 1.916072325100000e-03 7.285263070500000e-04 1.162016124200000e-03 2.430641299900000e-03 1.865933070500000e-03 3.289215710400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.380000000000000e+02 -1.175359270589836e+06 -4.939822665047858e+06 4.625227800564227e+06 -2.837646434994882e+03 -4.523987430989592e+03 -5.536946823809834e+03 1.916072325100000e-03 7.285263070500000e-04 1.162016124200000e-03 2.430641299900000e-03 1.865933070500000e-03 3.289215710400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.390000000000000e+02 -1.175416023359248e+06 -4.939913143497380e+06 4.625117060496962e+06 -2.837630907363830e+03 -4.523858262570667e+03 -5.537060805901870e+03 1.916072325100000e-03 7.285263070500000e-04 1.162016124200000e-03 2.430641299900000e-03 1.865933070500000e-03 3.289215710400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.400000000000000e+02 -1.175472775819741e+06 -4.940003619366527e+06 4.625006318146381e+06 -2.837615378746794e+03 -4.523729091691795e+03 -5.537174785159496e+03 1.916072325100000e-03 7.285263070500000e-04 1.162016124200000e-03 2.430641299900000e-03 1.865933070500000e-03 3.289215710400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.410000000000000e+02 -1.175529527982371e+06 -4.940094092675887e+06 4.624895573487679e+06 -2.837599847672433e+03 -4.523599916912130e+03 -5.537288763440370e+03 1.916072325100000e-03 7.285263070500000e-04 1.162016124200000e-03 2.430641299900000e-03 1.865933070500000e-03 3.289215710400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.420000000000000e+02 -1.175586279826104e+06 -4.940184563387034e+06 4.624784826574453e+06 -2.837584385726535e+03 -4.523470905342116e+03 -5.537402569595098e+03 1.916072325100000e-03 7.285263070500000e-04 1.162016124200000e-03 2.430641299900000e-03 1.865933070500000e-03 3.289215710400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.430000000000000e+02 -1.175643031354351e+06 -4.940275031506700e+06 4.624674077403424e+06 -2.837568970195571e+03 -4.523341999474260e+03 -5.537516261656926e+03 1.916072325100000e-03 7.285263070500000e-04 1.162016124200000e-03 2.430641299900000e-03 1.865933070500000e-03 3.289215710400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.440000000000000e+02 -1.175699782570332e+06 -4.940365497039879e+06 4.624563325956458e+06 -2.837553433676062e+03 -4.523212818345023e+03 -5.537630231644457e+03 1.916072325100000e-03 7.285263070500000e-04 1.162016124200000e-03 2.430641299900000e-03 1.865933070500000e-03 3.289215710400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.450000000000000e+02 -1.175756533488222e+06 -4.940455960012961e+06 4.624452572201746e+06 -2.837537894435288e+03 -4.523083633303375e+03 -5.537744200782526e+03 1.916072325100000e-03 7.285263070500000e-04 1.162016124200000e-03 2.430641299900000e-03 1.865933070500000e-03 3.289215710400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.460000000000000e+02 -1.175813284085815e+06 -4.940546420384654e+06 4.624341816189062e+06 -2.837522354975728e+03 -4.522954447721712e+03 -5.537858165144890e+03 1.916072325100000e-03 7.285263070500000e-04 1.162016124200000e-03 2.430641299900000e-03 1.865933070500000e-03 3.289215710400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.470000000000000e+02 -1.175870034385253e+06 -4.940636878196166e+06 4.624231057868741e+06 -2.837506812428144e+03 -4.522825258399477e+03 -5.537972128678703e+03 1.916024815300000e-03 7.282205444900000e-04 1.162186522100000e-03 2.429807918700000e-03 1.865805843800000e-03 3.290201102000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.480000000000000e+02 -1.175926784353150e+06 -4.940727333385437e+06 4.624120297315572e+06 -2.837491269670093e+03 -4.522696069936750e+03 -5.538086086268673e+03 1.916024815300000e-03 7.282205444900000e-04 1.162186522100000e-03 2.429807918700000e-03 1.865805843800000e-03 3.290201102000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.490000000000000e+02 -1.175983534022897e+06 -4.940817786014574e+06 4.624009534454722e+06 -2.837475724315399e+03 -4.522566878207052e+03 -5.538200042416177e+03 1.916024815300000e-03 7.282205444900000e-04 1.162186522100000e-03 2.429807918700000e-03 1.865805843800000e-03 3.290201102000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.500000000000000e+02 -1.176040283372046e+06 -4.940908236041889e+06 4.623898769336433e+06 -2.837460177259643e+03 -4.522437685830378e+03 -5.538313994540504e+03 1.916024815300000e-03 7.282205444900000e-04 1.162186522100000e-03 2.429807918700000e-03 1.865805843800000e-03 3.290201102000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.510000000000000e+02 -1.176097032423054e+06 -4.940998683509102e+06 4.623788001910406e+06 -2.837444628799514e+03 -4.522308489127788e+03 -5.538427945570066e+03 1.916024815300000e-03 7.282205444900000e-04 1.162186522100000e-03 2.429807918700000e-03 1.865805843800000e-03 3.290201102000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.520000000000000e+02 -1.176153781149712e+06 -4.941089128385573e+06 4.623677232234369e+06 -2.837428890370758e+03 -4.522179843691722e+03 -5.538541517585916e+03 1.916024815300000e-03 7.282205444900000e-04 1.162186522100000e-03 2.429807918700000e-03 1.865805843800000e-03 3.290201102000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.530000000000000e+02 -1.176210529557112e+06 -4.941179570692773e+06 4.623566460296229e+06 -2.837413024479209e+03 -4.522051561990952e+03 -5.538654838696844e+03 1.916024815300000e-03 7.282205444900000e-04 1.162186522100000e-03 2.429807918700000e-03 1.865805843800000e-03 3.290201102000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.540000000000000e+02 -1.176267277654430e+06 -4.941270010417743e+06 4.623455686077037e+06 -2.837397470922285e+03 -4.521922358788325e+03 -5.538768781463265e+03 1.916024815300000e-03 7.282205444900000e-04 1.162186522100000e-03 2.429807918700000e-03 1.865805843800000e-03 3.290201102000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.550000000000000e+02 -1.176324025442219e+06 -4.941360447561554e+06 4.623344909575502e+06 -2.837381915053363e+03 -4.521793153725582e+03 -5.538882721489161e+03 1.916024815300000e-03 7.282205444900000e-04 1.162186522100000e-03 2.429807918700000e-03 1.865805843800000e-03 3.290201102000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.560000000000000e+02 -1.176380772953865e+06 -4.941450882186297e+06 4.623234130716769e+06 -2.837366355553218e+03 -4.521663941443398e+03 -5.538996663822491e+03 1.916024815300000e-03 7.282205444900000e-04 1.162186522100000e-03 2.429807918700000e-03 1.865805843800000e-03 3.290201102000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.570000000000000e+02 -1.176437520100156e+06 -4.941541314126167e+06 4.623123349700763e+06 -2.837350797517883e+03 -4.521534735541898e+03 -5.539110594871401e+03 1.915977241500000e-03 7.279147035700000e-04 1.162356770500000e-03 2.428974605900000e-03 1.865678227700000e-03 3.291186530900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.580000000000000e+02 -1.176494266981400e+06 -4.941631743567626e+06 4.623012566302639e+06 -2.837335234974877e+03 -4.521405520468032e+03 -5.539224530243863e+03 1.915977241500000e-03 7.279147035700000e-04 1.162356770500000e-03 2.428974605900000e-03 1.865678227700000e-03 3.291186530900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.590000000000000e+02 -1.176551013530722e+06 -4.941722170386386e+06 4.622901780672283e+06 -2.837319672518042e+03 -4.521276306801448e+03 -5.539338459085668e+03 1.915977241500000e-03 7.279147035700000e-04 1.162356770500000e-03 2.428974605900000e-03 1.865678227700000e-03 3.291186530900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.600000000000000e+02 -1.176607759748004e+06 -4.941812594582275e+06 4.622790992809899e+06 -2.837304108499238e+03 -4.521147094350264e+03 -5.539452382293842e+03 1.915977241500000e-03 7.279147035700000e-04 1.162356770500000e-03 2.428974605900000e-03 1.865678227700000e-03 3.291186530900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.610000000000000e+02 -1.176664505677799e+06 -4.941903016238119e+06 4.622680202615617e+06 -2.837288541632617e+03 -4.521017876557835e+03 -5.539566305896398e+03 1.915977241500000e-03 7.279147035700000e-04 1.162356770500000e-03 2.428974605900000e-03 1.865678227700000e-03 3.291186530900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.620000000000000e+02 -1.176721251301090e+06 -4.941993435318035e+06 4.622569410145113e+06 -2.837273133080033e+03 -4.520888925877040e+03 -5.539679931244406e+03 1.915977241500000e-03 7.279147035700000e-04 1.162356770500000e-03 2.428974605900000e-03 1.865678227700000e-03 3.291186530900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.630000000000000e+02 -1.176777996615867e+06 -4.942083851817995e+06 4.622458615411481e+06 -2.837257827662698e+03 -4.520760151997376e+03 -5.539793358128603e+03 1.915977241500000e-03 7.279147035700000e-04 1.162356770500000e-03 2.428974605900000e-03 1.865678227700000e-03 3.291186530900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.640000000000000e+02 -1.176834741603062e+06 -4.942174265703481e+06 4.622347818435727e+06 -2.837242255897207e+03 -4.520630929545761e+03 -5.539907271805603e+03 1.915977241500000e-03 7.279147035700000e-04 1.162356770500000e-03 2.428974605900000e-03 1.865678227700000e-03 3.291186530900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.650000000000000e+02 -1.176891486313956e+06 -4.942264677069750e+06 4.622237019102933e+06 -2.837226681849956e+03 -4.520501699083946e+03 -5.540021187842368e+03 1.915977241500000e-03 7.279147035700000e-04 1.162356770500000e-03 2.428974605900000e-03 1.865678227700000e-03 3.291186530900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.660000000000000e+02 -1.176948230670268e+06 -4.942355085771396e+06 4.622126217588506e+06 -2.837211107448246e+03 -4.520372473692245e+03 -5.540135094501279e+03 1.915977241500000e-03 7.279147035700000e-04 1.162356770500000e-03 2.428974605900000e-03 1.865678227700000e-03 3.291186530900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.670000000000000e+02 -1.177004974761213e+06 -4.942445491974228e+06 4.622015413692438e+06 -2.837195528999207e+03 -4.520243239320646e+03 -5.540249005115114e+03 1.915929603700000e-03 7.276087842200000e-04 1.162526869600000e-03 2.428141361500000e-03 1.865550222000000e-03 3.292171997700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.680000000000000e+02 -1.177061718508750e+06 -4.942535895533228e+06 4.621904607589664e+06 -2.837179951039190e+03 -4.520114007722080e+03 -5.540362907884318e+03 1.915929603700000e-03 7.276087842200000e-04 1.162526869600000e-03 2.428141361500000e-03 1.865550222000000e-03 3.292171997700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.690000000000000e+02 -1.177118461957433e+06 -4.942626296531216e+06 4.621793799180274e+06 -2.837164370424090e+03 -4.519984772368730e+03 -5.540476809641661e+03 1.915929603700000e-03 7.276087842200000e-04 1.162526869600000e-03 2.428141361500000e-03 1.865550222000000e-03 3.292171997700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.700000000000000e+02 -1.177175205084810e+06 -4.942716694926518e+06 4.621682988514555e+06 -2.837148787912166e+03 -4.519855536734469e+03 -5.540590707160273e+03 1.915929603700000e-03 7.276087842200000e-04 1.162526869600000e-03 2.428141361500000e-03 1.865550222000000e-03 3.292171997700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.710000000000000e+02 -1.177231947924504e+06 -4.942807090781593e+06 4.621572175517143e+06 -2.837133203792161e+03 -4.519726295081897e+03 -5.540704605080367e+03 1.915929603700000e-03 7.276087842200000e-04 1.162526869600000e-03 2.428141361500000e-03 1.865550222000000e-03 3.292171997700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.720000000000000e+02 -1.177288690405333e+06 -4.942897483980070e+06 4.621461360343771e+06 -2.837117418739598e+03 -4.519597478193144e+03 -5.540818234425570e+03 1.915929603700000e-03 7.276087842200000e-04 1.162526869600000e-03 2.428141361500000e-03 1.865550222000000e-03 3.292171997700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.730000000000000e+02 -1.177345432607189e+06 -4.942987874680838e+06 4.621350542812869e+06 -2.837101498768670e+03 -4.519468929983126e+03 -5.540931695453717e+03 1.915929603700000e-03 7.276087842200000e-04 1.162526869600000e-03 2.428141361500000e-03 1.865550222000000e-03 3.292171997700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.740000000000000e+02 -1.177402174499048e+06 -4.943078262800012e+06 4.621239723000194e+06 -2.837085908313816e+03 -4.519339680416045e+03 -5.541045586829892e+03 1.915929603700000e-03 7.276087842200000e-04 1.162526869600000e-03 2.428141361500000e-03 1.865550222000000e-03 3.292171997700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.750000000000000e+02 -1.177458916035933e+06 -4.943168648254064e+06 4.621128901006553e+06 -2.837070317594600e+03 -4.519210435670449e+03 -5.541159468997357e+03 1.915929603700000e-03 7.276087842200000e-04 1.162526869600000e-03 2.428141361500000e-03 1.865550222000000e-03 3.292171997700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.760000000000000e+02 -1.177515657284958e+06 -4.943259031167667e+06 4.621018076681493e+06 -2.837054724987367e+03 -4.519081185082334e+03 -5.541273351544738e+03 1.915929603700000e-03 7.276087842200000e-04 1.162526869600000e-03 2.428141361500000e-03 1.865550222000000e-03 3.292171997700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.770000000000000e+02 -1.177572398234844e+06 -4.943349411519905e+06 4.620907250050247e+06 -2.837039129831022e+03 -4.518951930445373e+03 -5.541387233276538e+03 1.915881902200000e-03 7.273027865200000e-04 1.162696819600000e-03 2.427308185800000e-03 1.865421826900000e-03 3.293157502900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.780000000000000e+02 -1.177629138885474e+06 -4.943439789310598e+06 4.620796421113043e+06 -2.837023531995026e+03 -4.518822672354131e+03 -5.541501113756790e+03 1.915881902200000e-03 7.273027865200000e-04 1.162696819600000e-03 2.427308185800000e-03 1.865421826900000e-03 3.293157502900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.790000000000000e+02 -1.177685879181149e+06 -4.943530164436262e+06 4.620685589994780e+06 -2.837007935082991e+03 -4.518693418609746e+03 -5.541614984892848e+03 1.915881902200000e-03 7.273027865200000e-04 1.162696819600000e-03 2.427308185800000e-03 1.865421826900000e-03 3.293157502900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.800000000000000e+02 -1.177742619199909e+06 -4.943620537041910e+06 4.620574756520431e+06 -2.836992334586223e+03 -4.518564157735580e+03 -5.541728858236012e+03 1.915881902200000e-03 7.273027865200000e-04 1.162696819600000e-03 2.427308185800000e-03 1.865421826900000e-03 3.293157502900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.810000000000000e+02 -1.177799358885810e+06 -4.943710907023667e+06 4.620463920815385e+06 -2.836976732674644e+03 -4.518434898317739e+03 -5.541842725682380e+03 1.915881902200000e-03 7.273027865200000e-04 1.162696819600000e-03 2.427308185800000e-03 1.865421826900000e-03 3.293157502900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.820000000000000e+02 -1.177856098249895e+06 -4.943801274410027e+06 4.620353082860474e+06 -2.836961117609916e+03 -4.518306014487479e+03 -5.541956281632905e+03 1.915881902200000e-03 7.273027865200000e-04 1.162696819600000e-03 2.427308185800000e-03 1.865421826900000e-03 3.293157502900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.830000000000000e+02 -1.177912837297382e+06 -4.943891639216062e+06 4.620242242647623e+06 -2.836945491336409e+03 -4.518177378691284e+03 -5.542069631214431e+03 1.915881902200000e-03 7.273027865200000e-04 1.162696819600000e-03 2.427308185800000e-03 1.865421826900000e-03 3.293157502900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.840000000000000e+02 -1.177969576047804e+06 -4.943982001464706e+06 4.620131400123787e+06 -2.836929884783249e+03 -4.518048110459461e+03 -5.542183492085639e+03 1.915881902200000e-03 7.273027865200000e-04 1.162696819600000e-03 2.427308185800000e-03 1.865421826900000e-03 3.293157502900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.850000000000000e+02 -1.178026314487637e+06 -4.944072361130900e+06 4.620020555319245e+06 -2.836914275769487e+03 -4.517918840570239e+03 -5.542297350114528e+03 1.915881902200000e-03 7.273027865200000e-04 1.162696819600000e-03 2.427308185800000e-03 1.865421826900000e-03 3.293157502900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.860000000000000e+02 -1.178083052650261e+06 -4.944162718276668e+06 4.619909708159095e+06 -2.836898663530790e+03 -4.517789563162539e+03 -5.542411210511034e+03 1.915881902200000e-03 7.273027865200000e-04 1.162696819600000e-03 2.427308185800000e-03 1.865421826900000e-03 3.293157502900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.870000000000000e+02 -1.178139790468811e+06 -4.944253072777820e+06 4.619798858793299e+06 -2.836883051424940e+03 -4.517660288773413e+03 -5.542525063022260e+03 1.915834136900000e-03 7.269967103700000e-04 1.162866620500000e-03 2.426475078500000e-03 1.865293042500000e-03 3.294143047000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.880000000000000e+02 -1.178196527943181e+06 -4.944343424634185e+06 4.619688007222073e+06 -2.836867438675885e+03 -4.517531017471477e+03 -5.542638907938633e+03 1.915834136900000e-03 7.269967103700000e-04 1.162866620500000e-03 2.426475078500000e-03 1.865293042500000e-03 3.294143047000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.890000000000000e+02 -1.178253265151395e+06 -4.944433773990729e+06 4.619577153270361e+06 -2.836851821716134e+03 -4.517401737209934e+03 -5.542752756859652e+03 1.915834136900000e-03 7.269967103700000e-04 1.162866620500000e-03 2.426475078500000e-03 1.865293042500000e-03 3.294143047000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.900000000000000e+02 -1.178310002048925e+06 -4.944524120764730e+06 4.619466297038053e+06 -2.836836204064289e+03 -4.517272454456023e+03 -5.542866602841618e+03 1.915834136900000e-03 7.269967103700000e-04 1.162866620500000e-03 2.426475078500000e-03 1.865293042500000e-03 3.294143047000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.910000000000000e+02 -1.178366738624491e+06 -4.944614464935280e+06 4.619355438550401e+06 -2.836820584542579e+03 -4.517143171340818e+03 -5.542980444640980e+03 1.915834136900000e-03 7.269967103700000e-04 1.162866620500000e-03 2.426475078500000e-03 1.865293042500000e-03 3.294143047000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.920000000000000e+02 -1.178423474873752e+06 -4.944704806507966e+06 4.619244577810504e+06 -2.836804751757510e+03 -4.517014175719457e+03 -5.543094137639641e+03 1.915834136900000e-03 7.269967103700000e-04 1.162866620500000e-03 2.426475078500000e-03 1.865293042500000e-03 3.294143047000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.930000000000000e+02 -1.178480210788637e+06 -4.944795145476801e+06 4.619133714832102e+06 -2.836788778408086e+03 -4.516885369739545e+03 -5.543207730627068e+03 1.915834136900000e-03 7.269967103700000e-04 1.162866620500000e-03 2.426475078500000e-03 1.865293042500000e-03 3.294143047000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.940000000000000e+02 -1.178536946411622e+06 -4.944885481898083e+06 4.619022849530850e+06 -2.836773153142477e+03 -4.516756078372077e+03 -5.543321565861787e+03 1.915834136900000e-03 7.269967103700000e-04 1.162866620500000e-03 2.426475078500000e-03 1.865293042500000e-03 3.294143047000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.950000000000000e+02 -1.178593681712423e+06 -4.944975815715623e+06 4.618911981974638e+06 -2.836757526168096e+03 -4.516626787094574e+03 -5.543435396467550e+03 1.915834136900000e-03 7.269967103700000e-04 1.162866620500000e-03 2.426475078500000e-03 1.865293042500000e-03 3.294143047000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.960000000000000e+02 -1.178650416691165e+06 -4.945066146929625e+06 4.618801112163201e+06 -2.836741898713377e+03 -4.516497494688285e+03 -5.543549222907779e+03 1.915834136900000e-03 7.269967103700000e-04 1.162866620500000e-03 2.426475078500000e-03 1.865293042500000e-03 3.294143047000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.970000000000000e+02 -1.178707151381142e+06 -4.945156475601991e+06 4.618690240021783e+06 -2.836726267713366e+03 -4.516368197305806e+03 -5.543663049745724e+03 1.915786308000000e-03 7.266905558200000e-04 1.163036272500000e-03 2.425642039900000e-03 1.865163868700000e-03 3.295128630400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.980000000000000e+02 -1.178763885748991e+06 -4.945246801670735e+06 4.618579365625247e+06 -2.836710636373125e+03 -4.516238898888639e+03 -5.543776872277394e+03 1.915786308000000e-03 7.266905558200000e-04 1.163036272500000e-03 2.425642039900000e-03 1.865163868700000e-03 3.295128630400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.990000000000000e+02 -1.178820619805758e+06 -4.945337125156416e+06 4.618468488948768e+06 -2.836695002782878e+03 -4.516109598518797e+03 -5.543890692118001e+03 1.915786308000000e-03 7.266905558200000e-04 1.163036272500000e-03 2.425642039900000e-03 1.865163868700000e-03 3.295128630400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.000000000000000e+02 -1.178877353562489e+06 -4.945427446079592e+06 4.618357609967509e+06 -2.836679366456229e+03 -4.515980294424697e+03 -5.544004510955315e+03 1.915786308000000e-03 7.266905558200000e-04 1.163036272500000e-03 2.425642039900000e-03 1.865163868700000e-03 3.295128630400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.010000000000000e+02 -1.178934086974659e+06 -4.945517764357566e+06 4.618246728781398e+06 -2.836663730619545e+03 -4.515850993220522e+03 -5.544118321858204e+03 1.915786308000000e-03 7.266905558200000e-04 1.163036272500000e-03 2.425642039900000e-03 1.865163868700000e-03 3.295128630400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.020000000000000e+02 -1.178990820100996e+06 -4.945608080101999e+06 4.618135845273538e+06 -2.836648242746400e+03 -4.515722095507655e+03 -5.544231726450035e+03 1.915786308000000e-03 7.266905558200000e-04 1.163036272500000e-03 2.425642039900000e-03 1.865163868700000e-03 3.295128630400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.030000000000000e+02 -1.179047552902790e+06 -4.945698393242766e+06 4.618024959540632e+06 -2.836632853309185e+03 -4.515593469056472e+03 -5.544344856635176e+03 1.915786308000000e-03 7.266905558200000e-04 1.163036272500000e-03 2.425642039900000e-03 1.865163868700000e-03 3.295128630400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.040000000000000e+02 -1.179104285384221e+06 -4.945788703783333e+06 4.617914071548514e+06 -2.836617211860006e+03 -4.515464159593885e+03 -5.544458660947841e+03 1.915786308000000e-03 7.266905558200000e-04 1.163036272500000e-03 2.425642039900000e-03 1.865163868700000e-03 3.295128630400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.050000000000000e+02 -1.179161017565519e+06 -4.945879011761302e+06 4.617803181251728e+06 -2.836601567515332e+03 -4.515334846283374e+03 -5.544572464430699e+03 1.915786308000000e-03 7.266905558200000e-04 1.163036272500000e-03 2.425642039900000e-03 1.865163868700000e-03 3.295128630400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.060000000000000e+02 -1.179217749435410e+06 -4.945969317155782e+06 4.617692288675538e+06 -2.836585921146353e+03 -4.515205531046840e+03 -5.544686265099603e+03 1.915786308000000e-03 7.266905558200000e-04 1.163036272500000e-03 2.425642039900000e-03 1.865163868700000e-03 3.295128630400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.070000000000000e+02 -1.179274481016344e+06 -4.946059620008434e+06 4.617581393769584e+06 -2.836570273122324e+03 -4.515076209697882e+03 -5.544800066263574e+03 1.915738415600000e-03 7.263843228300000e-04 1.163205775800000e-03 2.424809070000000e-03 1.865034305600000e-03 3.296114253800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.080000000000000e+02 -1.179331212252306e+06 -4.946149920215328e+06 4.617470496659478e+06 -2.836554623420290e+03 -4.514946891823211e+03 -5.544913859977736e+03 1.915738415600000e-03 7.263843228300000e-04 1.163205775800000e-03 2.424809070000000e-03 1.865034305600000e-03 3.296114253800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.090000000000000e+02 -1.179387943210405e+06 -4.946240217901031e+06 4.617359597194665e+06 -2.836538971862989e+03 -4.514817566249520e+03 -5.545027655592620e+03 1.915738415600000e-03 7.263843228300000e-04 1.163205775800000e-03 2.424809070000000e-03 1.865034305600000e-03 3.296114253800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.100000000000000e+02 -1.179444673812386e+06 -4.946330512920301e+06 4.617248695550702e+06 -2.836523319658999e+03 -4.514688245502964e+03 -5.545141442175250e+03 1.915738415600000e-03 7.263843228300000e-04 1.163205775800000e-03 2.424809070000000e-03 1.865034305600000e-03 3.296114253800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.110000000000000e+02 -1.179501404136263e+06 -4.946420805418034e+06 4.617137791552464e+06 -2.836507663861179e+03 -4.514558917809058e+03 -5.545255230810923e+03 1.915738415600000e-03 7.263843228300000e-04 1.163205775800000e-03 2.424809070000000e-03 1.865034305600000e-03 3.296114253800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.120000000000000e+02 -1.179558134131700e+06 -4.946511095320180e+06 4.617026885304419e+06 -2.836491716620339e+03 -4.514430020347598e+03 -5.545368787313014e+03 1.915738415600000e-03 7.263843228300000e-04 1.163205775800000e-03 2.424809070000000e-03 1.865034305600000e-03 3.296114253800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.130000000000000e+02 -1.179614863804942e+06 -4.946601382651261e+06 4.616915976786871e+06 -2.836475574133062e+03 -4.514301406848834e+03 -5.545482190104914e+03 1.915738415600000e-03 7.263843228300000e-04 1.163205775800000e-03 2.424809070000000e-03 1.865034305600000e-03 3.296114253800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.140000000000000e+02 -1.179671593147573e+06 -4.946691667363383e+06 4.616805066032812e+06 -2.836459913873271e+03 -4.514172075945923e+03 -5.545595967445537e+03 1.915738415600000e-03 7.263843228300000e-04 1.163205775800000e-03 2.424809070000000e-03 1.865034305600000e-03 3.296114253800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.150000000000000e+02 -1.179728322178642e+06 -4.946781949491885e+06 4.616694152999526e+06 -2.836444253051437e+03 -4.514042742686719e+03 -5.545709741676553e+03 1.915738415600000e-03 7.263843228300000e-04 1.163205775800000e-03 2.424809070000000e-03 1.865034305600000e-03 3.296114253800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.160000000000000e+02 -1.179785050898026e+06 -4.946872229036590e+06 4.616583237687218e+06 -2.836428589705368e+03 -4.513913407285834e+03 -5.545823513495914e+03 1.915738415600000e-03 7.263843228300000e-04 1.163205775800000e-03 2.424809070000000e-03 1.865034305600000e-03 3.296114253800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.170000000000000e+02 -1.179841779327937e+06 -4.946962506038766e+06 4.616472320046000e+06 -2.836412923419011e+03 -4.513784066538607e+03 -5.545937285747275e+03 1.915690459700000e-03 7.260780113200000e-04 1.163375130400000e-03 2.423976168500000e-03 1.864904353300000e-03 3.297099917900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.180000000000000e+02 -1.179898507457337e+06 -4.947052780477899e+06 4.616361400100656e+06 -2.836397255949466e+03 -4.513654721274525e+03 -5.546051056957935e+03 1.915690459700000e-03 7.260780113200000e-04 1.163375130400000e-03 2.423976168500000e-03 1.864904353300000e-03 3.297099917900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.190000000000000e+02 -1.179955235241466e+06 -4.947143052270955e+06 4.616250477951618e+06 -2.836381587418128e+03 -4.513525379478318e+03 -5.546164820451521e+03 1.915690459700000e-03 7.260780113200000e-04 1.163375130400000e-03 2.423976168500000e-03 1.864904353300000e-03 3.297099917900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.200000000000000e+02 -1.180011962747172e+06 -4.947233321542062e+06 4.616139553448774e+06 -2.836365915326659e+03 -4.513396030429691e+03 -5.546278586234052e+03 1.915690459700000e-03 7.260780113200000e-04 1.163375130400000e-03 2.423976168500000e-03 1.864904353300000e-03 3.297099917900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.210000000000000e+02 -1.180068689885298e+06 -4.947323588125701e+06 4.616028626792297e+06 -2.836350244603025e+03 -4.513266687493000e+03 -5.546392341022969e+03 1.915690459700000e-03 7.260780113200000e-04 1.163375130400000e-03 2.423976168500000e-03 1.864904353300000e-03 3.297099917900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.220000000000000e+02 -1.180125416756416e+06 -4.947413852215947e+06 4.615917697763773e+06 -2.836334585451822e+03 -4.513137732076208e+03 -5.546505763977629e+03 1.915690459700000e-03 7.260780113200000e-04 1.163375130400000e-03 2.423976168500000e-03 1.864904353300000e-03 3.297099917900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.230000000000000e+02 -1.180182143297591e+06 -4.947504113700830e+06 4.615806766509421e+06 -2.836318936423188e+03 -4.513009038376073e+03 -5.546618960089306e+03 1.915690459700000e-03 7.260780113200000e-04 1.163375130400000e-03 2.423976168500000e-03 1.864904353300000e-03 3.297099917900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.240000000000000e+02 -1.180238869512725e+06 -4.947594372575447e+06 4.615695833008092e+06 -2.836303258577156e+03 -4.512879684098427e+03 -5.546732711503298e+03 1.915690459700000e-03 7.260780113200000e-04 1.163375130400000e-03 2.423976168500000e-03 1.864904353300000e-03 3.297099917900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.250000000000000e+02 -1.180295595393459e+06 -4.947684628824324e+06 4.615584897278509e+06 -2.836287579399519e+03 -4.512750331218651e+03 -5.546846457038570e+03 1.915690459700000e-03 7.260780113200000e-04 1.163375130400000e-03 2.423976168500000e-03 1.864904353300000e-03 3.297099917900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.260000000000000e+02 -1.180352320984560e+06 -4.947774882530528e+06 4.615473959220178e+06 -2.836271898574284e+03 -4.512620972368536e+03 -5.546960202945169e+03 1.915690459700000e-03 7.260780113200000e-04 1.163375130400000e-03 2.423976168500000e-03 1.864904353300000e-03 3.297099917900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.270000000000000e+02 -1.180409046274753e+06 -4.947865133673173e+06 4.615363018858367e+06 -2.836256215163332e+03 -4.512491609629081e+03 -5.547073947916141e+03 1.915642440400000e-03 7.257716213700000e-04 1.163544336500000e-03 2.423143335900000e-03 1.864774011800000e-03 3.298085622700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.280000000000000e+02 -1.180465771230436e+06 -4.947955382189950e+06 4.615252076268471e+06 -2.836240530165366e+03 -4.512362248637341e+03 -5.547187686832634e+03 1.915642440400000e-03 7.257716213700000e-04 1.163544336500000e-03 2.423143335900000e-03 1.864774011800000e-03 3.298085622700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.290000000000000e+02 -1.180522495874062e+06 -4.948045628122496e+06 4.615141131400106e+06 -2.836224844566760e+03 -4.512232885012952e+03 -5.547301422885980e+03 1.915642440400000e-03 7.257716213700000e-04 1.163544336500000e-03 2.423143335900000e-03 1.864774011800000e-03 3.298085622700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.300000000000000e+02 -1.180579220216674e+06 -4.948135871491353e+06 4.615030184228424e+06 -2.836209156205276e+03 -4.512103517564804e+03 -5.547415158028307e+03 1.915642440400000e-03 7.257716213700000e-04 1.163544336500000e-03 2.423143335900000e-03 1.864774011800000e-03 3.298085622700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.310000000000000e+02 -1.180635944246992e+06 -4.948226112275633e+06 4.614919234778703e+06 -2.836193465565452e+03 -4.511974148286271e+03 -5.547528890390966e+03 1.915642440400000e-03 7.257716213700000e-04 1.163544336500000e-03 2.423143335900000e-03 1.864774011800000e-03 3.298085622700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.320000000000000e+02 -1.180692667954652e+06 -4.948316350459358e+06 4.614808283079760e+06 -2.836177807691172e+03 -4.511845003549788e+03 -5.547642416700411e+03 1.915642440400000e-03 7.257716213700000e-04 1.163544336500000e-03 2.423143335900000e-03 1.864774011800000e-03 3.298085622700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.330000000000000e+02 -1.180749391368812e+06 -4.948406586098884e+06 4.614697329069703e+06 -2.836162168214490e+03 -4.511716003053260e+03 -5.547755809936136e+03 1.915642440400000e-03 7.257716213700000e-04 1.163544336500000e-03 2.423143335900000e-03 1.864774011800000e-03 3.298085622700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.340000000000000e+02 -1.180806114465930e+06 -4.948496819145043e+06 4.614586372792236e+06 -2.836146472849588e+03 -4.511586624981178e+03 -5.547869535734055e+03 1.915642440400000e-03 7.257716213700000e-04 1.163544336500000e-03 2.423143335900000e-03 1.864774011800000e-03 3.298085622700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.350000000000000e+02 -1.180862837228375e+06 -4.948587049565166e+06 4.614475414286915e+06 -2.836130776058893e+03 -4.511457248634894e+03 -5.547983255424837e+03 1.915642440400000e-03 7.257716213700000e-04 1.163544336500000e-03 2.423143335900000e-03 1.864774011800000e-03 3.298085622700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.360000000000000e+02 -1.180919559700674e+06 -4.948677277441917e+06 4.614364453453697e+06 -2.836115076217179e+03 -4.511327866617715e+03 -5.548096975863334e+03 1.915642440400000e-03 7.257716213700000e-04 1.163544336500000e-03 2.423143335900000e-03 1.864774011800000e-03 3.298085622700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.370000000000000e+02 -1.180976281815991e+06 -4.948767502651258e+06 4.614253490442704e+06 -2.836099377167701e+03 -4.511198489305595e+03 -5.548210686736835e+03 1.915594357800000e-03 7.254651528800000e-04 1.163713394300000e-03 2.422310571900000e-03 1.864643281100000e-03 3.299071369300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.380000000000000e+02 -1.181033003652330e+06 -4.948857725337978e+06 4.614142525078696e+06 -2.836083674768109e+03 -4.511069104515569e+03 -5.548324399988710e+03 1.915594357800000e-03 7.254651528800000e-04 1.163713394300000e-03 2.422310571900000e-03 1.864643281100000e-03 3.299071369300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.390000000000000e+02 -1.181089725187249e+06 -4.948947945460476e+06 4.614031557412020e+06 -2.836067969484307e+03 -4.510939716129131e+03 -5.548438112194475e+03 1.915594357800000e-03 7.254651528800000e-04 1.163713394300000e-03 2.422310571900000e-03 1.864643281100000e-03 3.299071369300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.400000000000000e+02 -1.181146446376247e+06 -4.949038162936158e+06 4.613920587542672e+06 -2.836052264863758e+03 -4.510810330578602e+03 -5.548551816442293e+03 1.915594357800000e-03 7.254651528800000e-04 1.163713394300000e-03 2.422310571900000e-03 1.864643281100000e-03 3.299071369300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.410000000000000e+02 -1.181203167297318e+06 -4.949128377909779e+06 4.613809615295399e+06 -2.836036556208428e+03 -4.510680935812330e+03 -5.548665524812778e+03 1.915594357800000e-03 7.254651528800000e-04 1.163713394300000e-03 2.422310571900000e-03 1.864643281100000e-03 3.299071369300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.420000000000000e+02 -1.181259887880271e+06 -4.949218590266990e+06 4.613698640827733e+06 -2.836020690059407e+03 -4.510552044827615e+03 -5.548778880764256e+03 1.915594357800000e-03 7.254651528800000e-04 1.163713394300000e-03 2.422310571900000e-03 1.864643281100000e-03 3.299071369300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.430000000000000e+02 -1.181316608115535e+06 -4.949308800000509e+06 4.613587664161148e+06 -2.836004720519096e+03 -4.510423487706306e+03 -5.548892000961408e+03 1.915594357800000e-03 7.254651528800000e-04 1.163713394300000e-03 2.422310571900000e-03 1.864643281100000e-03 3.299071369300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.440000000000000e+02 -1.181373328054015e+06 -4.949399007178499e+06 4.613476685181388e+06 -2.835989006956538e+03 -4.510294088541461e+03 -5.549005699224931e+03 1.915594357800000e-03 7.254651528800000e-04 1.163713394300000e-03 2.422310571900000e-03 1.864643281100000e-03 3.299071369300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.450000000000000e+02 -1.181430047668550e+06 -4.949489211750600e+06 4.613365703949413e+06 -2.835973291664693e+03 -4.510164688715359e+03 -5.549119393495495e+03 1.915594357800000e-03 7.254651528800000e-04 1.163713394300000e-03 2.422310571900000e-03 1.864643281100000e-03 3.299071369300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.460000000000000e+02 -1.181486766959265e+06 -4.949579413717040e+06 4.613254720464971e+06 -2.835957575821585e+03 -4.510035288595015e+03 -5.549233082943897e+03 1.915594357800000e-03 7.254651528800000e-04 1.163713394300000e-03 2.422310571900000e-03 1.864643281100000e-03 3.299071369300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.470000000000000e+02 -1.181543485948285e+06 -4.949669613118911e+06 4.613143734678287e+06 -2.835941857122855e+03 -4.509905884466622e+03 -5.549346771673976e+03 1.915546211900000e-03 7.251586059200000e-04 1.163882303800000e-03 2.421477876700000e-03 1.864512161300000e-03 3.300057157800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.480000000000000e+02 -1.181600204613416e+06 -4.949759809915034e+06 4.613032746639243e+06 -2.835926137832332e+03 -4.509776479913313e+03 -5.549460455708379e+03 1.915546211900000e-03 7.251586059200000e-04 1.163882303800000e-03 2.421477876700000e-03 1.864512161300000e-03 3.300057157800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.490000000000000e+02 -1.181656922976858e+06 -4.949850004146636e+06 4.612921756297910e+06 -2.835910415818971e+03 -4.509647071448647e+03 -5.549574138884992e+03 1.915546211900000e-03 7.251586059200000e-04 1.163882303800000e-03 2.421477876700000e-03 1.864512161300000e-03 3.300057157800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.500000000000000e+02 -1.181713641049655e+06 -4.949940195834244e+06 4.612810763629426e+06 -2.835894690884847e+03 -4.509517657482999e+03 -5.549687822608204e+03 1.915546211900000e-03 7.251586059200000e-04 1.163882303800000e-03 2.421477876700000e-03 1.864512161300000e-03 3.300057157800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.510000000000000e+02 -1.181770358776142e+06 -4.950030384874567e+06 4.612699768758890e+06 -2.835878966420944e+03 -4.509388246354422e+03 -5.549801498460985e+03 1.915546211900000e-03 7.251586059200000e-04 1.163882303800000e-03 2.421477876700000e-03 1.864512161300000e-03 3.300057157800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.520000000000000e+02 -1.181827076190261e+06 -4.950120571335440e+06 4.612588771616427e+06 -2.835863268599706e+03 -4.509259127905632e+03 -5.549914914761768e+03 1.915546211900000e-03 7.251586059200000e-04 1.163882303800000e-03 2.421477876700000e-03 1.864512161300000e-03 3.300057157800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.530000000000000e+02 -1.181883793309267e+06 -4.950210755252114e+06 4.612477772167491e+06 -2.835847586928969e+03 -4.509130199422803e+03 -5.550028161259942e+03 1.915546211900000e-03 7.251586059200000e-04 1.163882303800000e-03 2.421477876700000e-03 1.864512161300000e-03 3.300057157800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.540000000000000e+02 -1.181940510097566e+06 -4.950300936550512e+06 4.612366770481372e+06 -2.835831856792655e+03 -4.509000779976563e+03 -5.550141830586941e+03 1.915546211900000e-03 7.251586059200000e-04 1.163882303800000e-03 2.421477876700000e-03 1.864512161300000e-03 3.300057157800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.550000000000000e+02 -1.181997226550494e+06 -4.950391115222046e+06 4.612255766568510e+06 -2.835816125096045e+03 -4.508871362273376e+03 -5.550255493855854e+03 1.915546211900000e-03 7.251586059200000e-04 1.163882303800000e-03 2.421477876700000e-03 1.864512161300000e-03 3.300057157800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.560000000000000e+02 -1.182053942712561e+06 -4.950481291349311e+06 4.612144760328823e+06 -2.835800390328036e+03 -4.508741938796325e+03 -5.550369157963890e+03 1.915546211900000e-03 7.251586059200000e-04 1.163882303800000e-03 2.421477876700000e-03 1.864512161300000e-03 3.300057157800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.570000000000000e+02 -1.182110658561580e+06 -4.950571464891138e+06 4.612033751812193e+06 -2.835784654749568e+03 -4.508612512875321e+03 -5.550482819145923e+03 1.915498003000000e-03 7.248519804199999e-04 1.164051065200000e-03 2.420645250300000e-03 1.864380652400000e-03 3.301042988900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.580000000000000e+02 -1.182167374108511e+06 -4.950661635867918e+06 4.611922740993922e+06 -2.835768916039362e+03 -4.508483083485960e+03 -5.550596479284886e+03 1.915498003000000e-03 7.248519804199999e-04 1.164051065200000e-03 2.420645250300000e-03 1.864380652400000e-03 3.301042988900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.590000000000000e+02 -1.182224089331165e+06 -4.950751804238480e+06 4.611811727923891e+06 -2.835753176898750e+03 -4.508353653321613e+03 -5.550710134946797e+03 1.915498003000000e-03 7.248519804199999e-04 1.164051065200000e-03 2.420645250300000e-03 1.864380652400000e-03 3.301042988900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.600000000000000e+02 -1.182280804240589e+06 -4.950841970023338e+06 4.611700712577236e+06 -2.835737435671434e+03 -4.508224220929723e+03 -5.550823788072574e+03 1.915498003000000e-03 7.248519804199999e-04 1.164051065200000e-03 2.420645250300000e-03 1.864380652400000e-03 3.301042988900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.610000000000000e+02 -1.182337518836660e+06 -4.950932133222325e+06 4.611589694954180e+06 -2.835721692024967e+03 -4.508094786834610e+03 -5.550937438376462e+03 1.915498003000000e-03 7.248519804199999e-04 1.164051065200000e-03 2.420645250300000e-03 1.864380652400000e-03 3.301042988900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.620000000000000e+02 -1.182394233117115e+06 -4.951022293842166e+06 4.611478675058762e+06 -2.835705827900856e+03 -4.507965675340050e+03 -5.551050870067017e+03 1.915498003000000e-03 7.248519804199999e-04 1.164051065200000e-03 2.420645250300000e-03 1.864380652400000e-03 3.301042988900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.630000000000000e+02 -1.182450947076843e+06 -4.951112451880679e+06 4.611367652901721e+06 -2.835689882248852e+03 -4.507836777596686e+03 -5.551164155883229e+03 1.915498003000000e-03 7.248519804199999e-04 1.164051065200000e-03 2.420645250300000e-03 1.864380652400000e-03 3.301042988900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.640000000000000e+02 -1.182507660694067e+06 -4.951202607279319e+06 4.611256628533734e+06 -2.835674134160605e+03 -4.507707340439318e+03 -5.551277794747827e+03 1.915498003000000e-03 7.248519804199999e-04 1.164051065200000e-03 2.420645250300000e-03 1.864380652400000e-03 3.301042988900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.650000000000000e+02 -1.182564374042586e+06 -4.951292760174941e+06 4.611145601788930e+06 -2.835658383640359e+03 -4.507577893870630e+03 -5.551391437175108e+03 1.915498003000000e-03 7.248519804199999e-04 1.164051065200000e-03 2.420645250300000e-03 1.864380652400000e-03 3.301042988900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.660000000000000e+02 -1.182621087066503e+06 -4.951382910463909e+06 4.611034572792907e+06 -2.835642631294573e+03 -4.507448446787894e+03 -5.551505075531671e+03 1.915498003000000e-03 7.248519804199999e-04 1.164051065200000e-03 2.420645250300000e-03 1.864380652400000e-03 3.301042988900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.670000000000000e+02 -1.182677799765700e+06 -4.951473058146060e+06 4.610923541545887e+06 -2.835626877008485e+03 -4.507318999817590e+03 -5.551618709350490e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.680000000000000e+02 -1.182734512129150e+06 -4.951563203200911e+06 4.610812508072685e+06 -2.835611122997490e+03 -4.507189553513253e+03 -5.551732337186389e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.690000000000000e+02 -1.182791224212513e+06 -4.951653345731745e+06 4.610701472248116e+06 -2.835595365223696e+03 -4.507060100244728e+03 -5.551845967152312e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.700000000000000e+02 -1.182847935959898e+06 -4.951743485634938e+06 4.610590434197788e+06 -2.835579606181724e+03 -4.506930648212766e+03 -5.551959591351218e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.710000000000000e+02 -1.182904647404897e+06 -4.951833622972775e+06 4.610479393846205e+06 -2.835563845915562e+03 -4.506801192080821e+03 -5.552073214178678e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.720000000000000e+02 -1.182961358536154e+06 -4.951923757724263e+06 4.610368351218816e+06 -2.835548082852867e+03 -4.506671734203429e+03 -5.552186834387498e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.730000000000000e+02 -1.183018069342644e+06 -4.952013889868930e+06 4.610257306340437e+06 -2.835532319459702e+03 -4.506542275369926e+03 -5.552300450225736e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.740000000000000e+02 -1.183074779880028e+06 -4.952104019510039e+06 4.610146259085874e+06 -2.835516552185143e+03 -4.506412807659775e+03 -5.552414069827518e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.750000000000000e+02 -1.183131490070100e+06 -4.952194146502611e+06 4.610035209630915e+06 -2.835500783881256e+03 -4.506283343200482e+03 -5.552527681890203e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.760000000000000e+02 -1.183188199946451e+06 -4.952284270908915e+06 4.609924157900051e+06 -2.835485014683748e+03 -4.506153876219801e+03 -5.552641291128044e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.770000000000000e+02 -1.183244909486655e+06 -4.952374392687417e+06 4.609813103943663e+06 -2.835469244157086e+03 -4.506024410791017e+03 -5.552754894366382e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.780000000000000e+02 -1.183301618757531e+06 -4.952464511962051e+06 4.609702047611455e+06 -2.835453469673595e+03 -4.505894936330933e+03 -5.552868501528769e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.790000000000000e+02 -1.183358327669960e+06 -4.952554628567550e+06 4.609590989103852e+06 -2.835437696147023e+03 -4.505765466417645e+03 -5.552982099196392e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.800000000000000e+02 -1.183415036290757e+06 -4.952644742627856e+06 4.609479928270545e+06 -2.835421919372389e+03 -4.505635991123298e+03 -5.553095697453233e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.810000000000000e+02 -1.183471744597499e+06 -4.952734854101421e+06 4.609368865161923e+06 -2.835406140558807e+03 -4.505506513548865e+03 -5.553209293196016e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.820000000000000e+02 -1.183528452601463e+06 -4.952824963009141e+06 4.609257799752633e+06 -2.835390360423624e+03 -4.505377031764720e+03 -5.553322887700587e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.830000000000000e+02 -1.183585160280144e+06 -4.952915069309358e+06 4.609146732093226e+06 -2.835374577883274e+03 -4.505247550084093e+03 -5.553436477883326e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.840000000000000e+02 -1.183641867622513e+06 -4.953005172981602e+06 4.609035662208526e+06 -2.835358795527759e+03 -4.505118069360503e+03 -5.553550061884945e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.850000000000000e+02 -1.183698574706538e+06 -4.953095274170467e+06 4.608924589923126e+06 -2.835343008740520e+03 -4.504988577860300e+03 -5.553663651462966e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.860000000000000e+02 -1.183755281442864e+06 -4.953185372710330e+06 4.608813515437949e+06 -2.835327220978447e+03 -4.504859089446896e+03 -5.553777233615714e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.870000000000000e+02 -1.183811987842773e+06 -4.953275468622098e+06 4.608702438727647e+06 -2.835311433273252e+03 -4.504729602403207e+03 -5.553890809303637e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.880000000000000e+02 -1.183868693950768e+06 -4.953365561988314e+06 4.608591359692071e+06 -2.835295642433844e+03 -4.504600109680853e+03 -5.554004385774911e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.890000000000000e+02 -1.183925399744419e+06 -4.953455652767438e+06 4.608480278381614e+06 -2.835279849338261e+03 -4.504470614868670e+03 -5.554117959671570e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.900000000000000e+02 -1.183982105223860e+06 -4.953545740959696e+06 4.608369194796020e+06 -2.835264055620423e+03 -4.504341117764305e+03 -5.554231530433046e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.910000000000000e+02 -1.184038810388969e+06 -4.953635826564905e+06 4.608258108935491e+06 -2.835248259441471e+03 -4.504211618317237e+03 -5.554345098920187e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.920000000000000e+02 -1.184095515273092e+06 -4.953725909644932e+06 4.608147020724975e+06 -2.835232459841948e+03 -4.504082112070611e+03 -5.554458669243618e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.930000000000000e+02 -1.184152219775972e+06 -4.953815990013903e+06 4.608035930390032e+06 -2.835216661871476e+03 -4.503952613528027e+03 -5.554572227167880e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.940000000000000e+02 -1.184208924009032e+06 -4.953906067878400e+06 4.607924837679950e+06 -2.835200860123191e+03 -4.503823106069001e+03 -5.554685788836906e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.950000000000000e+02 -1.184265627927538e+06 -4.953996143155552e+06 4.607813742695317e+06 -2.835185056023103e+03 -4.503693596628809e+03 -5.554799347883946e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.960000000000000e+02 -1.184322331509309e+06 -4.954086215804216e+06 4.607702645486057e+06 -2.835169251957958e+03 -4.503564088166191e+03 -5.554912900801305e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.970000000000000e+02 -1.184379034787613e+06 -4.954176285886129e+06 4.607591545977260e+06 -2.835153444861574e+03 -4.503434576199308e+03 -5.555026452658010e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.980000000000000e+02 -1.184435737740265e+06 -4.954266353360152e+06 4.607480444218851e+06 -2.835137637149818e+03 -4.503305063420639e+03 -5.555140000153462e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.990000000000000e+02 -1.184492440411764e+06 -4.954356418308799e+06 4.607369340110661e+06 -2.835121826212222e+03 -4.503175543368515e+03 -5.555253549788747e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.000000000000000e+02 -1.184549142712768e+06 -4.954446480566522e+06 4.607258233853676e+06 -2.835106014925196e+03 -4.503046030198390e+03 -5.555367088588171e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.010000000000000e+02 -1.184605844743781e+06 -4.954536540319587e+06 4.607147125221761e+06 -2.835090201145738e+03 -4.502916507453676e+03 -5.555480631101649e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.020000000000000e+02 -1.184662546460076e+06 -4.954626597485130e+06 4.607036014315515e+06 -2.835074385345786e+03 -4.502786982605692e+03 -5.555594170946484e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.030000000000000e+02 -1.184719247839227e+06 -4.954716652021641e+06 4.606924901185349e+06 -2.835058567806065e+03 -4.502657459465302e+03 -5.555707704849893e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.040000000000000e+02 -1.184775948925975e+06 -4.954806704012010e+06 4.606813785730608e+06 -2.835042748901541e+03 -4.502527930174691e+03 -5.555821239135660e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.050000000000000e+02 -1.184832649664441e+06 -4.954896753352725e+06 4.606702668076999e+06 -2.835026928865947e+03 -4.502398404324148e+03 -5.555934765778393e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.060000000000000e+02 -1.184889350132575e+06 -4.954986800188289e+06 4.606591548049038e+06 -2.835011104926083e+03 -4.502268869274367e+03 -5.556048296452121e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.070000000000000e+02 -1.184946050263587e+06 -4.955076844394906e+06 4.606480425797061e+06 -2.834995281038226e+03 -4.502139335270410e+03 -5.556161820933687e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.080000000000000e+02 -1.185002750090740e+06 -4.955166886034283e+06 4.606369301246142e+06 -2.834979454030092e+03 -4.502009797795366e+03 -5.556275344365936e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.090000000000000e+02 -1.185059449569552e+06 -4.955256925023964e+06 4.606258174496419e+06 -2.834963627497009e+03 -4.501880263021574e+03 -5.556388860051152e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.100000000000000e+02 -1.185116148755666e+06 -4.955346961467110e+06 4.606147045422599e+06 -2.834947797749811e+03 -4.501750722744409e+03 -5.556502376407114e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.110000000000000e+02 -1.185172847615507e+06 -4.955436995301551e+06 4.606035914100206e+06 -2.834931966240316e+03 -4.501621182336520e+03 -5.556615888350943e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.120000000000000e+02 -1.185229546182661e+06 -4.955527026589499e+06 4.605924780453663e+06 -2.834916133115528e+03 -4.501491635761296e+03 -5.556729400801565e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.130000000000000e+02 -1.185286244434706e+06 -4.955617055289445e+06 4.605813644533390e+06 -2.834900297734315e+03 -4.501362087207242e+03 -5.556842910585834e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.140000000000000e+02 -1.185342942360378e+06 -4.955707081380563e+06 4.605702506364703e+06 -2.834884460526418e+03 -4.501232538546498e+03 -5.556956415966879e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.150000000000000e+02 -1.185399639993248e+06 -4.955797104925045e+06 4.605591365872030e+06 -2.834868621567091e+03 -4.501102983768602e+03 -5.557069921873272e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.160000000000000e+02 -1.185456337244002e+06 -4.955887125757426e+06 4.605480223256416e+06 -2.834852783158236e+03 -4.500973437465482e+03 -5.557183415234455e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.170000000000000e+02 -1.185513034246329e+06 -4.955977144125482e+06 4.605369078216823e+06 -2.834836939581801e+03 -4.500843878878758e+03 -5.557296915731852e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.180000000000000e+02 -1.185569730888848e+06 -4.956067159822805e+06 4.605257931004039e+06 -2.834821097221281e+03 -4.500714324678936e+03 -5.557410406762974e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.190000000000000e+02 -1.185626427260653e+06 -4.956157173014519e+06 4.605146781417423e+06 -2.834805250805939e+03 -4.500584761370629e+03 -5.557523901813231e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.200000000000000e+02 -1.185683123283568e+06 -4.956247183555814e+06 4.605035629632946e+06 -2.834789403460582e+03 -4.500455201504136e+03 -5.557637389132836e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.210000000000000e+02 -1.185739819024623e+06 -4.956337191570878e+06 4.604924475499691e+06 -2.834773553921240e+03 -4.500325633762617e+03 -5.557750878624736e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.220000000000000e+02 -1.185796514405569e+06 -4.956427196914784e+06 4.604813319193787e+06 -2.834757703448626e+03 -4.500196071276311e+03 -5.557864358891381e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.230000000000000e+02 -1.185853209504584e+06 -4.956517199732367e+06 4.604702160539214e+06 -2.834741850783837e+03 -4.500066500914286e+03 -5.557977841329775e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.240000000000000e+02 -1.185909904276953e+06 -4.956607199940817e+06 4.604590999636625e+06 -2.834725996518061e+03 -4.499936930545743e+03 -5.558091319182658e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.250000000000000e+02 -1.185966598733708e+06 -4.956697197560618e+06 4.604479836461118e+06 -2.834710139795038e+03 -4.499807357908405e+03 -5.558204794697997e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.260000000000000e+02 -1.186023292874977e+06 -4.956787192591992e+06 4.604368671012432e+06 -2.834694282332877e+03 -4.499677783061226e+03 -5.558318267062622e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.270000000000000e+02 -1.186079986678340e+06 -4.956877184993447e+06 4.604257503341003e+06 -2.834678423479754e+03 -4.499548209613634e+03 -5.558431733588609e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.280000000000000e+02 -1.186136680210585e+06 -4.956967174888750e+06 4.604146333296379e+06 -2.834662560661855e+03 -4.499418627096731e+03 -5.558545204058617e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.290000000000000e+02 -1.186193373404937e+06 -4.957057162154176e+06 4.604035161028961e+06 -2.834646697928679e+03 -4.499289045543746e+03 -5.558658668392814e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.300000000000000e+02 -1.186250066261279e+06 -4.957147146789561e+06 4.603923986538963e+06 -2.834630833715718e+03 -4.499159465715838e+03 -5.558772126659802e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.310000000000000e+02 -1.186306758857543e+06 -4.957237128939312e+06 4.603812809650821e+06 -2.834614965206970e+03 -4.499029875055428e+03 -5.558885590471648e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.320000000000000e+02 -1.186363451082363e+06 -4.957327108397099e+06 4.603701630615385e+06 -2.834599098086605e+03 -4.498900290423857e+03 -5.558999043390144e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.330000000000000e+02 -1.186420143035881e+06 -4.957417085348509e+06 4.603590449207023e+06 -2.834583226383228e+03 -4.498770697316288e+03 -5.559112500036813e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.340000000000000e+02 -1.186476834640185e+06 -4.957507059649178e+06 4.603479265601254e+06 -2.834567355329365e+03 -4.498641106740446e+03 -5.559225949004075e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.350000000000000e+02 -1.186533525928599e+06 -4.957597031360902e+06 4.603368079722960e+06 -2.834551481760559e+03 -4.498511514319513e+03 -5.559339395310025e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.360000000000000e+02 -1.186590216912161e+06 -4.957687000504148e+06 4.603256891547236e+06 -2.834535605773746e+03 -4.498381918022916e+03 -5.559452840586182e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.370000000000000e+02 -1.186646907590996e+06 -4.957776967079140e+06 4.603145701073818e+06 -2.834519728413668e+03 -4.498252317610361e+03 -5.559566284565750e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.380000000000000e+02 -1.186703597942691e+06 -4.957866931044402e+06 4.603034508353149e+06 -2.834503849314627e+03 -4.498122716841976e+03 -5.559679724310488e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.390000000000000e+02 -1.186760287978275e+06 -4.957956892420404e+06 4.602923313360326e+06 -2.834487967861758e+03 -4.497993114023221e+03 -5.559793161491390e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.400000000000000e+02 -1.186816977675579e+06 -4.958046851166074e+06 4.602812116145327e+06 -2.834472086541658e+03 -4.497863512517785e+03 -5.559906592228946e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.410000000000000e+02 -1.186873667090236e+06 -4.958136807384483e+06 4.602700916582776e+06 -2.834456201842854e+03 -4.497733903537714e+03 -5.560020025331159e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.420000000000000e+02 -1.186930356177525e+06 -4.958226760992859e+06 4.602589714773351e+06 -2.834440314914816e+03 -4.497604294347030e+03 -5.560133454297150e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.430000000000000e+02 -1.186987044948727e+06 -4.958316712012060e+06 4.602478510691675e+06 -2.834424427656299e+03 -4.497474682540998e+03 -5.560246880265211e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.440000000000000e+02 -1.187043733403723e+06 -4.958406660441926e+06 4.602367304337963e+06 -2.834408537690877e+03 -4.497345068997906e+03 -5.560360303568162e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.450000000000000e+02 -1.187100421553548e+06 -4.958496606302924e+06 4.602256095687309e+06 -2.834392645415006e+03 -4.497215451649224e+03 -5.560473725734900e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.460000000000000e+02 -1.187157109364882e+06 -4.958586549533334e+06 4.602144884814803e+06 -2.834376753014521e+03 -4.497085835125098e+03 -5.560587141976484e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.470000000000000e+02 -1.187213796882122e+06 -4.958676490215432e+06 4.602033671620348e+06 -2.834360857121454e+03 -4.496956213492605e+03 -5.560700558681368e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.480000000000000e+02 -1.187270484094241e+06 -4.958766428328787e+06 4.601922456128786e+06 -2.834344959887534e+03 -4.496826587440089e+03 -5.560813974324961e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.490000000000000e+02 -1.187327170945393e+06 -4.958856363770004e+06 4.601811238465945e+06 -2.834329062308998e+03 -4.496696966358184e+03 -5.560927380724334e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.500000000000000e+02 -1.187383857513486e+06 -4.958946296683430e+06 4.601700018456195e+06 -2.834313160969988e+03 -4.496567338417543e+03 -5.561040789148439e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.510000000000000e+02 -1.187440543742914e+06 -4.959036226966055e+06 4.601588796224872e+06 -2.834297259775101e+03 -4.496437711202875e+03 -5.561154191609859e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.520000000000000e+02 -1.187497229655855e+06 -4.959126154658990e+06 4.601477571721946e+06 -2.834281356359813e+03 -4.496308081925850e+03 -5.561267591458117e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.530000000000000e+02 -1.187553915263340e+06 -4.959216079782711e+06 4.601366344922513e+06 -2.834265450172898e+03 -4.496178449160160e+03 -5.561380990113622e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.540000000000000e+02 -1.187610600554348e+06 -4.959306002316784e+06 4.601255115851426e+06 -2.834249543320177e+03 -4.496048813611380e+03 -5.561494386058546e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.550000000000000e+02 -1.187667285517614e+06 -4.959395922240401e+06 4.601143884534028e+06 -2.834233634465480e+03 -4.495919178061697e+03 -5.561607777594497e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.560000000000000e+02 -1.187723970186466e+06 -4.959485839615311e+06 4.601032650895161e+06 -2.834217722769267e+03 -4.495789536943752e+03 -5.561721169681998e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.570000000000000e+02 -1.187780654538736e+06 -4.959575754400442e+06 4.600921414984804e+06 -2.834201810076647e+03 -4.495659893311195e+03 -5.561834558984518e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.580000000000000e+02 -1.187837338563076e+06 -4.959665666574857e+06 4.600810176828453e+06 -2.834185895109717e+03 -4.495530249522943e+03 -5.561947944126759e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.590000000000000e+02 -1.187894022248469e+06 -4.959755576118133e+06 4.600698936450983e+06 -2.834169980232286e+03 -4.495400606774479e+03 -5.562061323073318e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.600000000000000e+02 -1.187950705661680e+06 -4.959845483153935e+06 4.600587693701841e+06 -2.834154061334624e+03 -4.495270955266605e+03 -5.562174705723680e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.610000000000000e+02 -1.188007388713416e+06 -4.959935387516976e+06 4.600476448782258e+06 -2.834138141977394e+03 -4.495141308591981e+03 -5.562288079297694e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.620000000000000e+02 -1.188064071492980e+06 -4.960025289372575e+06 4.600365201490952e+06 -2.834122220086052e+03 -4.495011652425687e+03 -5.562401456517518e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.630000000000000e+02 -1.188120753922227e+06 -4.960115188576098e+06 4.600253952004028e+06 -2.834106297208342e+03 -4.494881999437611e+03 -5.562514826258879e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.640000000000000e+02 -1.188177436045627e+06 -4.960205085209923e+06 4.600142700221191e+06 -2.834090371632749e+03 -4.494752342934001e+03 -5.562628194796129e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.650000000000000e+02 -1.188234117874455e+06 -4.960294979294896e+06 4.600031446117040e+06 -2.834074444469512e+03 -4.494622680105803e+03 -5.562741563949056e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.660000000000000e+02 -1.188290799330571e+06 -4.960384870686407e+06 4.599920189867704e+06 -2.834058517146123e+03 -4.494493024436124e+03 -5.562854921979098e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.670000000000000e+02 -1.188347480525316e+06 -4.960474759590620e+06 4.599808931222097e+06 -2.834042585441969e+03 -4.494363357814595e+03 -5.562968285676762e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.680000000000000e+02 -1.188404161380799e+06 -4.960564645863314e+06 4.599697670355863e+06 -2.834026653814038e+03 -4.494233692129250e+03 -5.563081643271028e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.690000000000000e+02 -1.188460841941484e+06 -4.960654529586851e+06 4.599586407168690e+06 -2.834010718993634e+03 -4.494104021041500e+03 -5.563195001434173e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.700000000000000e+02 -1.188517522140382e+06 -4.960744410637263e+06 4.599475141811591e+06 -2.833994783775228e+03 -4.493974355131869e+03 -5.563308350212285e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.710000000000000e+02 -1.188574202044491e+06 -4.960834289138556e+06 4.599363874133503e+06 -2.833978846780316e+03 -4.493844682930939e+03 -5.563421699661939e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.720000000000000e+02 -1.188630881609035e+06 -4.960924165007902e+06 4.599252604235332e+06 -2.833962907963492e+03 -4.493715012514966e+03 -5.563535043153743e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.730000000000000e+02 -1.188687560901013e+06 -4.961014038369314e+06 4.599141331966016e+06 -2.833946966621455e+03 -4.493585332785875e+03 -5.563648390137139e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.740000000000000e+02 -1.188744239831144e+06 -4.961103909057557e+06 4.599030057526832e+06 -2.833931024796927e+03 -4.493455657754952e+03 -5.563761728169390e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.750000000000000e+02 -1.188800918477329e+06 -4.961193777216885e+06 4.598918780742065e+06 -2.833915079360252e+03 -4.493325975882571e+03 -5.563875068140996e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.760000000000000e+02 -1.188857596795113e+06 -4.961283642764981e+06 4.598807501711980e+06 -2.833899133531012e+03 -4.493196292904746e+03 -5.563988403899361e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.770000000000000e+02 -1.188914274806671e+06 -4.961373505742935e+06 4.598696220386524e+06 -2.833883185127600e+03 -4.493066606292719e+03 -5.564101738495337e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.780000000000000e+02 -1.188970952511885e+06 -4.961463366150577e+06 4.598584936765910e+06 -2.833867233925175e+03 -4.492936916093168e+03 -5.564215071990196e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.790000000000000e+02 -1.189027629844016e+06 -4.961553223864353e+06 4.598473651000692e+06 -2.833851284241157e+03 -4.492807231850115e+03 -5.564328394610790e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.800000000000000e+02 -1.189084306903247e+06 -4.961643079069744e+06 4.598362362864855e+06 -2.833835330361532e+03 -4.492677538947462e+03 -5.564441720925342e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.810000000000000e+02 -1.189140983633740e+06 -4.961732931663429e+06 4.598251072484299e+06 -2.833819374890296e+03 -4.492547845602759e+03 -5.564555043013685e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.820000000000000e+02 -1.189197660046765e+06 -4.961822781666261e+06 4.598139779833621e+06 -2.833803418404165e+03 -4.492418149934865e+03 -5.564668362167813e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.830000000000000e+02 -1.189254336142127e+06 -4.961912629077934e+06 4.598028484913194e+06 -2.833787459386873e+03 -4.492288452248554e+03 -5.564781678810505e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.840000000000000e+02 -1.189311011897662e+06 -4.962002473857419e+06 4.597917187773036e+06 -2.833771500282563e+03 -4.492158755744090e+03 -5.564894989222830e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.850000000000000e+02 -1.189367687357831e+06 -4.962092316087035e+06 4.597805888312797e+06 -2.833755538092219e+03 -4.492029053615060e+03 -5.565008300337527e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.860000000000000e+02 -1.189424362511374e+06 -4.962182155745985e+06 4.597694586557837e+06 -2.833739573258033e+03 -4.491899347914650e+03 -5.565121610268497e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.870000000000000e+02 -1.189481037358417e+06 -4.962271992834485e+06 4.597583282507882e+06 -2.833723607239174e+03 -4.491769637774035e+03 -5.565234919082214e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.880000000000000e+02 -1.189537711843126e+06 -4.962361827249249e+06 4.597471976288860e+06 -2.833707640633540e+03 -4.491639932702376e+03 -5.565348218690084e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.890000000000000e+02 -1.189594386043385e+06 -4.962451659134465e+06 4.597360667724992e+06 -2.833691670413173e+03 -4.491510220497054e+03 -5.565461520475940e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.900000000000000e+02 -1.189651059914754e+06 -4.962541488407850e+06 4.597249356916580e+06 -2.833675700015682e+03 -4.491380507364098e+03 -5.565574817807449e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.910000000000000e+02 -1.189707733468255e+06 -4.962631315089870e+06 4.597138043838700e+06 -2.833659727153275e+03 -4.491250792590944e+03 -5.565688112286964e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.920000000000000e+02 -1.189764406681489e+06 -4.962721139139096e+06 4.597026728541849e+06 -2.833643753104388e+03 -4.491121078968587e+03 -5.565801401051168e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.930000000000000e+02 -1.189821079588009e+06 -4.962810960617613e+06 4.596915410950335e+06 -2.833627777682704e+03 -4.490991361305139e+03 -5.565914688453347e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.940000000000000e+02 -1.189877752221129e+06 -4.962900779587097e+06 4.596804090988936e+06 -2.833611798284886e+03 -4.490861634570463e+03 -5.566027979786266e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.950000000000000e+02 -1.189934424480444e+06 -4.962990595861815e+06 4.596692768884172e+06 -2.833595818864827e+03 -4.490731914768494e+03 -5.566141260131896e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.960000000000000e+02 -1.189991096455228e+06 -4.963080409606922e+06 4.596581444434610e+06 -2.833579837324563e+03 -4.490602186950593e+03 -5.566254542715884e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.970000000000000e+02 -1.190047768122994e+06 -4.963170220780884e+06 4.596470117690919e+06 -2.833563852669016e+03 -4.490472455589514e+03 -5.566367824301419e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.980000000000000e+02 -1.190104439450440e+06 -4.963260029322062e+06 4.596358788728277e+06 -2.833547867958630e+03 -4.490342725619816e+03 -5.566481099471865e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.990000000000000e+02 -1.190161110437454e+06 -4.963349835230291e+06 4.596247457546890e+06 -2.833531881958196e+03 -4.490212996730227e+03 -5.566594369032082e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.000000000000000e+02 -1.190217781139629e+06 -4.963439638608471e+06 4.596136124021243e+06 -2.833515892408691e+03 -4.490083260718791e+03 -5.566707640729014e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.010000000000000e+02 -1.190274451512521e+06 -4.963529439374355e+06 4.596024788251661e+06 -2.833499902426734e+03 -4.489953524021570e+03 -5.566820907886882e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.020000000000000e+02 -1.190331121567161e+06 -4.963619237548389e+06 4.595913450213211e+06 -2.833483910322122e+03 -4.489823785448742e+03 -5.566934172234485e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.030000000000000e+02 -1.190387791303428e+06 -4.963709033130402e+06 4.595802109906103e+06 -2.833467915796457e+03 -4.489694044744981e+03 -5.567047434114201e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.040000000000000e+02 -1.190444460721449e+06 -4.963798826120608e+06 4.595690767330077e+06 -2.833451920585022e+03 -4.489564301597943e+03 -5.567160693012411e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.050000000000000e+02 -1.190501129821110e+06 -4.963888616518831e+06 4.595579422485341e+06 -2.833435923066557e+03 -4.489434556387528e+03 -5.567273949336566e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.060000000000000e+02 -1.190557798613435e+06 -4.963978404345516e+06 4.595468075346968e+06 -2.833419922903903e+03 -4.489304807496786e+03 -5.567387204565384e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.070000000000000e+02 -1.190614467053981e+06 -4.964068189518428e+06 4.595356726015292e+06 -2.833403923195379e+03 -4.489175061479471e+03 -5.567500451936699e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.080000000000000e+02 -1.190671135220549e+06 -4.964157972181544e+06 4.595245374314628e+06 -2.833387919101121e+03 -4.489045306431574e+03 -5.567613703383120e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.090000000000000e+02 -1.190727803024126e+06 -4.964247752170195e+06 4.595134020445924e+06 -2.833371915905623e+03 -4.488915556054557e+03 -5.567726945297774e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.100000000000000e+02 -1.190784470531449e+06 -4.964337529607871e+06 4.595022664258483e+06 -2.833355909528671e+03 -4.488785800124559e+03 -5.567840187894520e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.110000000000000e+02 -1.190841137720118e+06 -4.964427304453177e+06 4.594911305802825e+06 -2.833339900956510e+03 -4.488656042273434e+03 -5.567953427750675e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.120000000000000e+02 -1.190897804601400e+06 -4.964517076726940e+06 4.594799945053532e+06 -2.833323891211543e+03 -4.488526280161385e+03 -5.568066666335110e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.130000000000000e+02 -1.190954471130614e+06 -4.964606846346547e+06 4.594688582111430e+06 -2.833307880359090e+03 -4.488396521135288e+03 -5.568179897581862e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.140000000000000e+02 -1.191011137363350e+06 -4.964696613414879e+06 4.594577216850968e+06 -2.833291866519207e+03 -4.488266756887202e+03 -5.568293129152032e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.150000000000000e+02 -1.191067803299736e+06 -4.964786377932140e+06 4.594465849271879e+06 -2.833275851069927e+03 -4.488136986651105e+03 -5.568406361062994e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.160000000000000e+02 -1.191124468895087e+06 -4.964876139815724e+06 4.594354479474988e+06 -2.833259834052346e+03 -4.488007217526985e+03 -5.568519587463019e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.170000000000000e+02 -1.191181134160431e+06 -4.964965899086078e+06 4.594243107435373e+06 -2.833243815349977e+03 -4.487877448657900e+03 -5.568632809108190e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.180000000000000e+02 -1.191237799140458e+06 -4.965055655825836e+06 4.594131733052131e+06 -2.833227794544246e+03 -4.487747671801980e+03 -5.568746032955068e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.190000000000000e+02 -1.191294463745925e+06 -4.965145409869988e+06 4.594020356526729e+06 -2.833211773562288e+03 -4.487617901759012e+03 -5.568859245990649e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.200000000000000e+02 -1.191351128076981e+06 -4.965235161403794e+06 4.593908977632976e+06 -2.833195748702369e+03 -4.487488122826196e+03 -5.568972462756934e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.210000000000000e+02 -1.191407792078051e+06 -4.965324910324456e+06 4.593797596496388e+06 -2.833179723371267e+03 -4.487358343004473e+03 -5.569085675169728e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.220000000000000e+02 -1.191464455737798e+06 -4.965414656611074e+06 4.593686213142504e+06 -2.833163696318671e+03 -4.487228564938155e+03 -5.569198881612172e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.230000000000000e+02 -1.191521119134328e+06 -4.965504400408068e+06 4.593574827394942e+06 -2.833147666123492e+03 -4.487098775637595e+03 -5.569312093383428e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.240000000000000e+02 -1.191577782156124e+06 -4.965594141509252e+06 4.593463439505511e+06 -2.833131635971351e+03 -4.486968993106814e+03 -5.569425294283289e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.250000000000000e+02 -1.191634444903332e+06 -4.965683880099872e+06 4.593352049247987e+06 -2.833115601821959e+03 -4.486839201583357e+03 -5.569538499049623e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.260000000000000e+02 -1.191691107309236e+06 -4.965773616056526e+06 4.593240656773067e+06 -2.833099567718309e+03 -4.486709410979157e+03 -5.569651697748512e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.270000000000000e+02 -1.191747769396002e+06 -4.965863349420247e+06 4.593129262030641e+06 -2.833083531398782e+03 -4.486579618425807e+03 -5.569764893739063e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.280000000000000e+02 -1.191804431152372e+06 -4.965953080170270e+06 4.593017865046090e+06 -2.833067493182864e+03 -4.486449825804359e+03 -5.569878085335040e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.290000000000000e+02 -1.191861092589612e+06 -4.966042808327402e+06 4.592906465793988e+06 -2.833051454195161e+03 -4.486320030553612e+03 -5.569991274140659e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.300000000000000e+02 -1.191917753729887e+06 -4.966132533932676e+06 4.592795064224220e+06 -2.833035412100495e+03 -4.486190229905104e+03 -5.570104463464729e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.310000000000000e+02 -1.191974414539662e+06 -4.966222256924116e+06 4.592683660412489e+06 -2.833019368262399e+03 -4.486060428875964e+03 -5.570217648583060e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.320000000000000e+02 -1.192031075041339e+06 -4.966311977343136e+06 4.592572254308210e+06 -2.833003323102899e+03 -4.485930623787845e+03 -5.570330832328324e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.330000000000000e+02 -1.192087735201305e+06 -4.966401695127642e+06 4.592460845987242e+06 -2.832987276115752e+03 -4.485800820166460e+03 -5.570444010388862e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.340000000000000e+02 -1.192144395053107e+06 -4.966491410339639e+06 4.592349435373831e+06 -2.832971227895309e+03 -4.485671012490280e+03 -5.570557187033830e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.350000000000000e+02 -1.192201054574346e+06 -4.966581122937768e+06 4.592238022518519e+06 -2.832955177802863e+03 -4.485541204627742e+03 -5.570670359371053e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.360000000000000e+02 -1.192257713787185e+06 -4.966670832963039e+06 4.592126607371187e+06 -2.832939125045031e+03 -4.485411392727632e+03 -5.570783530913622e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.370000000000000e+02 -1.192314372702892e+06 -4.966760540436264e+06 4.592015189906411e+06 -2.832923070667751e+03 -4.485281575135911e+03 -5.570896702554915e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.380000000000000e+02 -1.192371031310210e+06 -4.966850245336680e+06 4.591903770149563e+06 -2.832907013679409e+03 -4.485151753632621e+03 -5.571009873273438e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.390000000000000e+02 -1.192427689542185e+06 -4.966939947540548e+06 4.591792348251864e+06 -2.832890956389175e+03 -4.485021939030776e+03 -5.571123033171106e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.400000000000000e+02 -1.192484347476925e+06 -4.967029647192238e+06 4.591680924036879e+06 -2.832874897630216e+03 -4.484892118388840e+03 -5.571236193386537e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.410000000000000e+02 -1.192541005069750e+06 -4.967119344209211e+06 4.591569497605494e+06 -2.832858837325472e+03 -4.484762299256955e+03 -5.571349347757988e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.420000000000000e+02 -1.192597662365103e+06 -4.967209038673662e+06 4.591458068857251e+06 -2.832842774094901e+03 -4.484632474733791e+03 -5.571462502560673e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.430000000000000e+02 -1.192654319351970e+06 -4.967298730565204e+06 4.591346637817048e+06 -2.832826709491727e+03 -4.484502645731523e+03 -5.571575656356981e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.440000000000000e+02 -1.192710976007959e+06 -4.967388419842497e+06 4.591235204535441e+06 -2.832810643103478e+03 -4.484372816767994e+03 -5.571688805622844e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.450000000000000e+02 -1.192767632332953e+06 -4.967478106505360e+06 4.591123769012650e+06 -2.832794574923185e+03 -4.484242987553228e+03 -5.571801950599508e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.460000000000000e+02 -1.192824288338218e+06 -4.967567790574599e+06 4.591012331223235e+06 -2.832778505919911e+03 -4.484113155692581e+03 -5.571915092822054e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.470000000000000e+02 -1.192880944034694e+06 -4.967657472070507e+06 4.590900891142400e+06 -2.832762433750108e+03 -4.483983320272836e+03 -5.572028234078685e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.480000000000000e+02 -1.192937599433642e+06 -4.967747151013881e+06 4.590789448744708e+06 -2.832746359878689e+03 -4.483853478972089e+03 -5.572141375624351e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.490000000000000e+02 -1.192994254468124e+06 -4.967836827281024e+06 4.590678004181401e+06 -2.832730285537595e+03 -4.483723642601006e+03 -5.572254508044847e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.500000000000000e+02 -1.193050909238261e+06 -4.967926501057046e+06 4.590566557226146e+06 -2.832714206856594e+03 -4.483593795471827e+03 -5.572367645924354e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.510000000000000e+02 -1.193107563632802e+06 -4.968016172136299e+06 4.590455108130411e+06 -2.832698129453857e+03 -4.483463954882560e+03 -5.572480772583524e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.520000000000000e+02 -1.193164217729597e+06 -4.968105840662717e+06 4.590343656718188e+06 -2.832682048885656e+03 -4.483334108440981e+03 -5.572593900156881e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.530000000000000e+02 -1.193220871517386e+06 -4.968195506615532e+06 4.590232203014874e+06 -2.832665965609068e+03 -4.483204258490821e+03 -5.572707026519211e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.540000000000000e+02 -1.193277524962892e+06 -4.968285169933210e+06 4.590120747095722e+06 -2.832649882715756e+03 -4.483074409485763e+03 -5.572820146647507e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.550000000000000e+02 -1.193334178077130e+06 -4.968374830636170e+06 4.590009288935777e+06 -2.832633797552604e+03 -4.482944560407060e+03 -5.572933262553670e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.560000000000000e+02 -1.193390830915671e+06 -4.968464488827149e+06 4.589897828409368e+06 -2.832617708695573e+03 -4.482814702001085e+03 -5.573046382457025e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.570000000000000e+02 -1.193447483422954e+06 -4.968554144403446e+06 4.589786365642115e+06 -2.832601619373866e+03 -4.482684843037093e+03 -5.573159497734963e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.580000000000000e+02 -1.193504135598786e+06 -4.968643797364764e+06 4.589674900634391e+06 -2.832585527873580e+03 -4.482554984039341e+03 -5.573272608717546e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.590000000000000e+02 -1.193560787454426e+06 -4.968733447731895e+06 4.589563433360755e+06 -2.832569435357809e+03 -4.482425122577517e+03 -5.573385716882040e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.600000000000000e+02 -1.193617438967489e+06 -4.968823095463511e+06 4.589451963871776e+06 -2.832553341625110e+03 -4.482295262690120e+03 -5.573498819006828e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.610000000000000e+02 -1.193674090193541e+06 -4.968912740662343e+06 4.589340492041781e+06 -2.832537244407338e+03 -4.482165395434683e+03 -5.573611923428578e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.620000000000000e+02 -1.193730741088157e+06 -4.969002383246279e+06 4.589229017971217e+06 -2.832521146546066e+03 -4.482035527504810e+03 -5.573725023400162e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.630000000000000e+02 -1.193787391662363e+06 -4.969092023235733e+06 4.589117541635117e+06 -2.832505046692121e+03 -4.481905657509191e+03 -5.573838120660193e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.640000000000000e+02 -1.193844041927175e+06 -4.969181660651103e+06 4.589006063008519e+06 -2.832488943999188e+03 -4.481775783870496e+03 -5.573951216876624e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.650000000000000e+02 -1.193900691849315e+06 -4.969271295430876e+06 4.588894582166699e+06 -2.832472841545429e+03 -4.481645911268421e+03 -5.574064306849519e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.660000000000000e+02 -1.193957341473209e+06 -4.969360927657190e+06 4.588783099009144e+06 -2.832456735865773e+03 -4.481516033092517e+03 -5.574177397532713e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.670000000000000e+02 -1.194013990765331e+06 -4.969450557268139e+06 4.588671613611620e+06 -2.832440628311527e+03 -4.481386154771479e+03 -5.574290483877836e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.680000000000000e+02 -1.194070639736946e+06 -4.969540184284517e+06 4.588560125948674e+06 -2.832424520070049e+03 -4.481256273902262e+03 -5.574403567328338e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.690000000000000e+02 -1.194127288387937e+06 -4.969629808706149e+06 4.588448636020519e+06 -2.832408409526511e+03 -4.481126390935542e+03 -5.574516648230404e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.700000000000000e+02 -1.194183936718187e+06 -4.969719430532866e+06 4.588337143827378e+06 -2.832392296743628e+03 -4.480996506324699e+03 -5.574629726184723e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.710000000000000e+02 -1.194240584716687e+06 -4.969809049744310e+06 4.588225649394165e+06 -2.832376183447659e+03 -4.480866620809060e+03 -5.574742799820687e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.720000000000000e+02 -1.194297232405511e+06 -4.969898666381324e+06 4.588114152670885e+06 -2.832360067220346e+03 -4.480736731648170e+03 -5.574855872455326e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.730000000000000e+02 -1.194353879762519e+06 -4.969988280402975e+06 4.588002653707646e+06 -2.832343950621813e+03 -4.480606841786715e+03 -5.574968940541538e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.740000000000000e+02 -1.194410526843264e+06 -4.970077891911963e+06 4.587891152378735e+06 -2.832327829886046e+03 -4.480476943016462e+03 -5.575082012472863e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.750000000000000e+02 -1.194467173547414e+06 -4.970167500722952e+06 4.587779648911035e+06 -2.832311709040235e+03 -4.480347051049705e+03 -5.575195073592115e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.760000000000000e+02 -1.194523819964181e+06 -4.970257107000739e+06 4.587668143102792e+06 -2.832295586313148e+03 -4.480217151084222e+03 -5.575308136811115e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.770000000000000e+02 -1.194580466037771e+06 -4.970346710642298e+06 4.587556635080157e+06 -2.832279462027178e+03 -4.480087252931987e+03 -5.575421193948729e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.780000000000000e+02 -1.194637111812606e+06 -4.970436311729737e+06 4.587445124742592e+06 -2.832263334620004e+03 -4.479957349167289e+03 -5.575534251780093e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.790000000000000e+02 -1.194693757255411e+06 -4.970525910201557e+06 4.587333612165399e+06 -2.832247206989733e+03 -4.479827444647837e+03 -5.575647305042115e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.800000000000000e+02 -1.194750402388337e+06 -4.970615506098728e+06 4.587222097298411e+06 -2.832231076558416e+03 -4.479697536434939e+03 -5.575760357283840e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.810000000000000e+02 -1.194807047177863e+06 -4.970705099359369e+06 4.587110580217417e+06 -2.832214944755815e+03 -4.479567629856808e+03 -5.575873403507914e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.820000000000000e+02 -1.194863691646386e+06 -4.970794690024840e+06 4.586999060871769e+06 -2.832198812120036e+03 -4.479437720748836e+03 -5.575986446887141e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.830000000000000e+02 -1.194920335804847e+06 -4.970884278115398e+06 4.586887539236651e+06 -2.832182676465116e+03 -4.479307807808530e+03 -5.576099489456348e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.840000000000000e+02 -1.194976979664498e+06 -4.970973863651830e+06 4.586776015286610e+06 -2.832166538956822e+03 -4.479177889226293e+03 -5.576212532180844e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.850000000000000e+02 -1.195033623169561e+06 -4.971063446531123e+06 4.586664489147810e+06 -2.832150400746743e+03 -4.479047973703023e+03 -5.576325567425440e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.860000000000000e+02 -1.195090266364448e+06 -4.971153026835380e+06 4.586552960719702e+06 -2.832134259548620e+03 -4.478918054555903e+03 -5.576438601675291e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.870000000000000e+02 -1.195146909238158e+06 -4.971242604544245e+06 4.586441430027218e+06 -2.832118117678859e+03 -4.478788132892778e+03 -5.576551632997259e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.880000000000000e+02 -1.195203551779439e+06 -4.971332179636982e+06 4.586329897095759e+06 -2.832101974138831e+03 -4.478658211047827e+03 -5.576664659922516e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.890000000000000e+02 -1.195260194021573e+06 -4.971421752175113e+06 4.586218361849966e+06 -2.832085827243856e+03 -4.478528283640059e+03 -5.576777687602713e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.900000000000000e+02 -1.195316835931289e+06 -4.971511322097157e+06 4.586106824365148e+06 -2.832069680171095e+03 -4.478398355461970e+03 -5.576890710707085e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.910000000000000e+02 -1.195373477497334e+06 -4.971600889382386e+06 4.585995284666719e+06 -2.832053531517447e+03 -4.478268429070834e+03 -5.577003727763722e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.920000000000000e+02 -1.195430118764130e+06 -4.971690454112876e+06 4.585883742654115e+06 -2.832037379943932e+03 -4.478138496919414e+03 -5.577116745543990e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.930000000000000e+02 -1.195486759709533e+06 -4.971780016247715e+06 4.585772198377462e+06 -2.832021227479374e+03 -4.478008562443484e+03 -5.577229760336784e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.940000000000000e+02 -1.195543400344562e+06 -4.971869575807290e+06 4.585660651811775e+06 -2.832005072425618e+03 -4.477878624086255e+03 -5.577342774168238e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.950000000000000e+02 -1.195600040669100e+06 -4.971959132791433e+06 4.585549102957269e+06 -2.831988914559586e+03 -4.477748682150289e+03 -5.577455786889248e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.960000000000000e+02 -1.195656680638738e+06 -4.972048687118113e+06 4.585437551914465e+06 -2.831972757177445e+03 -4.477618742763433e+03 -5.577568792025101e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.970000000000000e+02 -1.195713320286685e+06 -4.972138238848713e+06 4.585325998608147e+06 -2.831956597253673e+03 -4.477488801773055e+03 -5.577681794314361e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.980000000000000e+02 -1.195769959624193e+06 -4.972227788004011e+06 4.585214443012858e+06 -2.831940435901017e+03 -4.477358856582357e+03 -5.577794795389504e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.990000000000000e+02 -1.195826598651151e+06 -4.972317334583830e+06 4.585102885128805e+06 -2.831924271947571e+03 -4.477228907514786e+03 -5.577907795504430e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.000000000000000e+02 -1.195883237345172e+06 -4.972406878546878e+06 4.584991325006602e+06 -2.831908106098477e+03 -4.477098958240183e+03 -5.578020791343844e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.010000000000000e+02 -1.195939875717522e+06 -4.972496419913931e+06 4.584879762620789e+06 -2.831891939653796e+03 -4.476969006532398e+03 -5.578133784153961e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.020000000000000e+02 -1.195996513745816e+06 -4.972585958643706e+06 4.584768198021976e+06 -2.831875771636827e+03 -4.476839056500075e+03 -5.578246771005504e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.030000000000000e+02 -1.196053151496731e+06 -4.972675494859369e+06 4.584656631059177e+06 -2.831859599638956e+03 -4.476709097168979e+03 -5.578359761943640e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.040000000000000e+02 -1.196109788881336e+06 -4.972765028396678e+06 4.584545061933731e+06 -2.831843428662674e+03 -4.476579142558302e+03 -5.578472743283953e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.050000000000000e+02 -1.196166425999706e+06 -4.972854559440474e+06 4.584433490419045e+06 -2.831827253258851e+03 -4.476449177104859e+03 -5.578585730171028e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.060000000000000e+02 -1.196223062740403e+06 -4.972944087785022e+06 4.584321916767349e+06 -2.831811077752956e+03 -4.476319218460188e+03 -5.578698706249754e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.070000000000000e+02 -1.196279699192605e+06 -4.973033613594980e+06 4.584210340776762e+06 -2.831794900048782e+03 -4.476189252115694e+03 -5.578811684316922e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.080000000000000e+02 -1.196336335311595e+06 -4.973123136787830e+06 4.584098762548467e+06 -2.831778720288800e+03 -4.476059285697593e+03 -5.578924658070936e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.090000000000000e+02 -1.196392971097491e+06 -4.973212657363789e+06 4.583987182082202e+06 -2.831762539827600e+03 -4.475929318668168e+03 -5.579037627352336e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.100000000000000e+02 -1.196449606583582e+06 -4.973302175384344e+06 4.583875599302566e+06 -2.831746356572789e+03 -4.475799345904607e+03 -5.579150597277155e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.110000000000000e+02 -1.196506241736351e+06 -4.973391690787660e+06 4.583764014285388e+06 -2.831730171328343e+03 -4.475669373189983e+03 -5.579263562759545e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.120000000000000e+02 -1.196562876567054e+06 -4.973481203594508e+06 4.583652427005203e+06 -2.831713985344990e+03 -4.475539397765919e+03 -5.579376525502060e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.130000000000000e+02 -1.196619511075579e+06 -4.973570713804713e+06 4.583540837462217e+06 -2.831697797070093e+03 -4.475409420500119e+03 -5.579489485482170e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.140000000000000e+02 -1.196676145272937e+06 -4.973660221438658e+06 4.583429245631448e+06 -2.831681606092501e+03 -4.475279439469099e+03 -5.579602444454697e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.150000000000000e+02 -1.196732779103602e+06 -4.973749726393803e+06 4.583317651638656e+06 -2.831665416097846e+03 -4.475149462992021e+03 -5.579715393986156e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.160000000000000e+02 -1.196789412656508e+06 -4.973839228834378e+06 4.583206055282407e+06 -2.831649222187447e+03 -4.475019477374125e+03 -5.579828347442379e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.170000000000000e+02 -1.196846045898138e+06 -4.973928728698560e+06 4.583094456638533e+06 -2.831633025439332e+03 -4.474889488260987e+03 -5.579941299729648e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.180000000000000e+02 -1.196902678772971e+06 -4.974018225883820e+06 4.582982855832808e+06 -2.831616829664339e+03 -4.474759503632669e+03 -5.580054242637455e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.190000000000000e+02 -1.196959311325414e+06 -4.974107720472183e+06 4.582871252764613e+06 -2.831600631751227e+03 -4.474629516776406e+03 -5.580167183031062e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.200000000000000e+02 -1.197015943610998e+06 -4.974197212566207e+06 4.582759647308125e+06 -2.831584429278199e+03 -4.474499519418016e+03 -5.580280128745911e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.210000000000000e+02 -1.197072575540810e+06 -4.974286702001737e+06 4.582648039664746e+06 -2.831568227395378e+03 -4.474369524757249e+03 -5.580393066712381e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.220000000000000e+02 -1.197129207159176e+06 -4.974376188860655e+06 4.582536429734015e+06 -2.831552022406670e+03 -4.474239526627294e+03 -5.580506003607064e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.230000000000000e+02 -1.197185838443957e+06 -4.974465673102083e+06 4.582424817566082e+06 -2.831535816906799e+03 -4.474109527523739e+03 -5.580618936242077e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.240000000000000e+02 -1.197242469395038e+06 -4.974555154725849e+06 4.582313203161168e+06 -2.831519609599047e+03 -4.473979528549980e+03 -5.580731864289402e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.250000000000000e+02 -1.197299100023436e+06 -4.974644633752334e+06 4.582201586494276e+06 -2.831503400165733e+03 -4.473849527380830e+03 -5.580844789790187e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.260000000000000e+02 -1.197355730340405e+06 -4.974734110202286e+06 4.582089967539930e+06 -2.831487189379915e+03 -4.473719521947240e+03 -5.580957714093379e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.270000000000000e+02 -1.197412360356960e+06 -4.974823584096084e+06 4.581978346273127e+06 -2.831470975600319e+03 -4.473589511036673e+03 -5.581070638915631e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.280000000000000e+02 -1.197468990006203e+06 -4.974913055310296e+06 4.581866722845365e+06 -2.831454761187219e+03 -4.473459505464424e+03 -5.581183554374575e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.290000000000000e+02 -1.197525619355042e+06 -4.975002523968391e+06 4.581755097105094e+06 -2.831438545147369e+03 -4.473329493469458e+03 -5.581296470520757e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.300000000000000e+02 -1.197582248392230e+06 -4.975091990049653e+06 4.581643469077744e+06 -2.831422326419899e+03 -4.473199477960758e+03 -5.581409385445994e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.310000000000000e+02 -1.197638877084261e+06 -4.975181453492290e+06 4.581531838839177e+06 -2.831406106345656e+03 -4.473069464048606e+03 -5.581522294381699e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.320000000000000e+02 -1.197695505453520e+06 -4.975270914337598e+06 4.581420206338692e+06 -2.831389885369461e+03 -4.472939447562026e+03 -5.581635200539326e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.330000000000000e+02 -1.197752133510945e+06 -4.975360372605816e+06 4.581308571551454e+06 -2.831373661402753e+03 -4.472809427527359e+03 -5.581748105638005e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.340000000000000e+02 -1.197808761267783e+06 -4.975449828317692e+06 4.581196934451975e+06 -2.831357435611624e+03 -4.472679401399629e+03 -5.581861011240906e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.350000000000000e+02 -1.197865388679408e+06 -4.975539281390899e+06 4.581085295141338e+06 -2.831341208597335e+03 -4.472549376786358e+03 -5.581973910867112e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.360000000000000e+02 -1.197922015745697e+06 -4.975628731825273e+06 4.580973653619763e+06 -2.831324979957078e+03 -4.472419354093826e+03 -5.582086804363325e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.370000000000000e+02 -1.197978642522428e+06 -4.975718179723715e+06 4.580862009760893e+06 -2.831308749406481e+03 -4.472289323226652e+03 -5.582199700101884e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.380000000000000e+02 -1.198035268964968e+06 -4.975807625003905e+06 4.580750363665812e+06 -2.831292517029972e+03 -4.472159292314049e+03 -5.582312591404961e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.390000000000000e+02 -1.198091895106584e+06 -4.975897067727273e+06 4.580638715259084e+06 -2.831276281525874e+03 -4.472029255827311e+03 -5.582425483363900e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.400000000000000e+02 -1.198148520891759e+06 -4.975986507791362e+06 4.580527064666537e+06 -2.831260046398957e+03 -4.471899222303998e+03 -5.582538367455914e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t</EPHEMLISTList>\n\t</EPH>\n\t<ATT>\n\t\t<SATID>Imaginary1</SATID>\n\t\t<GENERATIONTIME>1959-11-30T00:18:13.000000Z</GENERATIONTIME>\n\t\t<STARTTIME>1959-11-25T17:39:40.987511Z</STARTTIME>\n\t\t<NUMPOINTS>840</NUMPOINTS>\n\t\t<TIMEINTERVAL>2.000000000000000e-02</TIMEINTERVAL>\n\t\t<ATTLISTList>\n\t\t\t<ATTLIST>1.000000000000000e+00 6.795012901179663e-01 -7.039793799103053e-01 -2.023917199358860e-01 -4.157668926833060e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.000000000000000e+00 6.795031921696149e-01 -7.039852730262131e-01 -2.023634939866958e-01 -4.158321169664750e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.000000000000000e+00 6.795050940076900e-01 -7.039911671585269e-01 -2.023352617254185e-01 -4.158973001693780e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.000000000000000e+00 6.795069956282339e-01 -7.039970623085654e-01 -2.023070231575671e-01 -4.159624423340190e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.000000000000000e+00 6.795088970622606e-01 -7.040029584543205e-01 -2.022787782519255e-01 -4.160275435235960e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.000000000000000e+00 6.795107983244882e-01 -7.040088555841620e-01 -2.022505269954615e-01 -4.160926038219470e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.000000000000000e+00 6.795126993442279e-01 -7.040147537480659e-01 -2.022222694541582e-01 -4.161576229965050e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.000000000000000e+00 6.795146002014344e-01 -7.040206528897818e-01 -2.021940055491108e-01 -4.162226012287550e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>9.000000000000000e+00 6.795165008206093e-01 -7.040265530611999e-01 -2.021657353543056e-01 -4.162875383594130e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.000000000000000e+01 6.795184012613739e-01 -7.040324542188404e-01 -2.021374588139688e-01 -4.163524346048480e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.100000000000000e+01 6.795203015174702e-01 -7.040383563686955e-01 -2.021091759287698e-01 -4.164172898266690e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.200000000000000e+01 6.795222015273501e-01 -7.040442595509356e-01 -2.020808867636002e-01 -4.164821040134950e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.300000000000000e+01 6.795241013689588e-01 -7.040501637119229e-01 -2.020525912387455e-01 -4.165468772698050e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.400000000000000e+01 6.795260010190228e-01 -7.040560688668507e-01 -2.020242893776136e-01 -4.166116095744060e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.500000000000000e+01 6.795279004301762e-01 -7.040619750503345e-01 -2.019959812213390e-01 -4.166763006948090e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.600000000000000e+01 6.795297996610842e-01 -7.040678822172045e-01 -2.019676667204161e-01 -4.167409509825730e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.700000000000000e+01 6.795316987072143e-01 -7.040737903710086e-01 -2.019393458766498e-01 -4.168055603755300e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.800000000000000e+01 6.795335975150002e-01 -7.040796995524565e-01 -2.019110187332267e-01 -4.168701285238810e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.900000000000000e+01 6.795354961360811e-01 -7.040856097198989e-01 -2.018826852506496e-01 -4.169346558437880e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.000000000000000e+01 6.795373945807668e-01 -7.040915208672780e-01 -2.018543454144770e-01 -4.169991422628810e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.100000000000000e+01 6.795392927722119e-01 -7.040974330490690e-01 -2.018259992963614e-01 -4.170635875234390e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.200000000000000e+01 6.795411908128990e-01 -7.041033461910222e-01 -2.017976468003938e-01 -4.171279919900170e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.300000000000000e+01 6.795430886004499e-01 -7.041092603677667e-01 -2.017692880179178e-01 -4.171923552104290e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.400000000000000e+01 6.795449862043442e-01 -7.041151755254639e-01 -2.017409228913374e-01 -4.172566776259380e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.500000000000000e+01 6.795468836354301e-01 -7.041210916568698e-01 -2.017125514075215e-01 -4.173209592126210e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.600000000000000e+01 6.795487808108983e-01 -7.041270088231787e-01 -2.016841736381700e-01 -4.173851995499380e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.700000000000000e+01 6.795506778088990e-01 -7.041329269658226e-01 -2.016557895141527e-01 -4.174493990213870e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.800000000000000e+01 6.795525746226287e-01 -7.041388460888128e-01 -2.016273990420547e-01 -4.175135576251040e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.900000000000000e+01 6.795544711875586e-01 -7.041447662384701e-01 -2.015990022805154e-01 -4.175776751059130e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.000000000000000e+01 6.795563675697758e-01 -7.041506873681586e-01 -2.015705991641825e-01 -4.176417516142380e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.100000000000000e+01 6.795582637705441e-01 -7.041566094724618e-01 -2.015421897003983e-01 -4.177057873886140e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.200000000000000e+01 6.795601597194840e-01 -7.041625326055196e-01 -2.015137739450329e-01 -4.177697819421850e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.300000000000000e+01 6.795620555097833e-01 -7.041684566994181e-01 -2.014853518115018e-01 -4.178337356262010e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.400000000000000e+01 6.795639510474406e-01 -7.041743818175766e-01 -2.014569233952892e-01 -4.178976483219710e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.500000000000000e+01 6.795658464051249e-01 -7.041803079097471e-01 -2.014284886223090e-01 -4.179615201370400e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.600000000000000e+01 6.795677415806715e-01 -7.041862349773556e-01 -2.014000474931086e-01 -4.180253510417940e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.700000000000000e+01 6.795696364968842e-01 -7.041921630755553e-01 -2.013716000788236e-01 -4.180891407532190e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.800000000000000e+01 6.795715312385208e-01 -7.041980921417377e-01 -2.013431463024344e-01 -4.181528896355330e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.900000000000000e+01 6.795734257882386e-01 -7.042040221875822e-01 -2.013146861801534e-01 -4.182165976446780e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.000000000000000e+01 6.795753200928879e-01 -7.042099532511444e-01 -2.012862197602649e-01 -4.182802645705700e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.100000000000000e+01 6.795772142114155e-01 -7.042158852897767e-01 -2.012577469866033e-01 -4.183438906049140e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.200000000000000e+01 6.795791081393254e-01 -7.042218183066008e-01 -2.012292678618453e-01 -4.184074757087550e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.300000000000000e+01 6.795810018215931e-01 -7.042277523386692e-01 -2.012007824414075e-01 -4.184710198032180e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.400000000000000e+01 6.795828953184365e-01 -7.042336873443790e-01 -2.011722906634436e-01 -4.185345229695360e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.500000000000000e+01 6.795847886270806e-01 -7.042396233240191e-01 -2.011437925326658e-01 -4.185979852681810e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.600000000000000e+01 6.795866816859607e-01 -7.042455603201958e-01 -2.011152881086695e-01 -4.186614065477190e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.700000000000000e+01 6.795885745799152e-01 -7.042514982738010e-01 -2.010867773061127e-01 -4.187247869648390e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.800000000000000e+01 6.795904672174917e-01 -7.042574372480126e-01 -2.010582602146097e-01 -4.187881263177330e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.900000000000000e+01 6.795923596757100e-01 -7.042633771889883e-01 -2.010297367569464e-01 -4.188514247551360e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.000000000000000e+01 6.795942519378680e-01 -7.042693181059694e-01 -2.010012069532644e-01 -4.189146823511180e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.100000000000000e+01 6.795961439552599e-01 -7.042752600345781e-01 -2.009726708460155e-01 -4.189778988667740e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.200000000000000e+01 6.795980357844214e-01 -7.042812029327177e-01 -2.009441283839045e-01 -4.190410745539760e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.300000000000000e+01 6.795999274203595e-01 -7.042871468046601e-01 -2.009155795682612e-01 -4.191042093254690e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.400000000000000e+01 6.796018188080356e-01 -7.042930916886662e-01 -2.008870244518403e-01 -4.191673030325510e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.500000000000000e+01 6.796037100041895e-01 -7.042990375436710e-01 -2.008584629804457e-01 -4.192303558586010e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.600000000000000e+01 6.796056010159021e-01 -7.043049843631807e-01 -2.008298951488766e-01 -4.192933678804790e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.700000000000000e+01 6.796074917731262e-01 -7.043109321979667e-01 -2.008013210200126e-01 -4.193563387966340e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.800000000000000e+01 6.796093823611057e-01 -7.043168809854401e-01 -2.007727405152986e-01 -4.194192689510570e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.900000000000000e+01 6.796112726996719e-01 -7.043228307833497e-01 -2.007441537077760e-01 -4.194821580246480e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.000000000000000e+01 6.796131628397541e-01 -7.043287815536684e-01 -2.007155605512496e-01 -4.195450062470620e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.100000000000000e+01 6.796150527998679e-01 -7.043347332831532e-01 -2.006869610264543e-01 -4.196078136485220e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.200000000000000e+01 6.796169424965223e-01 -7.043406860315834e-01 -2.006583552103851e-01 -4.196705799195700e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.300000000000000e+01 6.796188320142774e-01 -7.043466397368305e-01 -2.006297430251785e-01 -4.197333054018500e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.400000000000000e+01 6.796207213316237e-01 -7.043525944136150e-01 -2.006011244908768e-01 -4.197959900343160e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.500000000000000e+01 6.796226104022928e-01 -7.043585500965851e-01 -2.005724996459374e-01 -4.198586335411420e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.600000000000000e+01 6.796244992744610e-01 -7.043645067481321e-01 -2.005438684502678e-01 -4.199212362336900e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.700000000000000e+01 6.796263879612657e-01 -7.043704643589256e-01 -2.005152308895167e-01 -4.199837981206470e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.800000000000000e+01 6.796282763888346e-01 -7.043764229821449e-01 -2.004865870310055e-01 -4.200463189077510e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.900000000000000e+01 6.796301646299087e-01 -7.043823825638621e-01 -2.004579368085549e-01 -4.201087989126120e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.000000000000000e+01 6.796320526743754e-01 -7.043883431120742e-01 -2.004292802281825e-01 -4.201712380273550e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.100000000000000e+01 6.796339404640521e-01 -7.043943046673543e-01 -2.004006173455687e-01 -4.202336360900710e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.200000000000000e+01 6.796358280863000e-01 -7.044002671655367e-01 -2.003719480801510e-01 -4.202959934540350e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.300000000000000e+01 6.796377154506369e-01 -7.044062306726971e-01 -2.003432725126685e-01 -4.203583097116940e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.400000000000000e+01 6.796396026170802e-01 -7.044121951441673e-01 -2.003145905885660e-01 -4.204205851297100e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.500000000000000e+01 6.796414895980506e-01 -7.044181605699508e-01 -2.002859022968422e-01 -4.204828197833920e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.600000000000000e+01 6.796433763167853e-01 -7.044241270061340e-01 -2.002572077056954e-01 -4.205450133201960e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.700000000000000e+01 6.796452628469613e-01 -7.044300943980907e-01 -2.002285067480556e-01 -4.206071660618740e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.800000000000000e+01 6.796471491794277e-01 -7.044360627519347e-01 -2.001997994317655e-01 -4.206692779737960e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.900000000000000e+01 6.796490352585286e-01 -7.044420321083782e-01 -2.001710858057136e-01 -4.207313487882250e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.000000000000000e+01 6.796509211421690e-01 -7.044480024227050e-01 -2.001423658208579e-01 -4.207933788561480e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.100000000000000e+01 6.796528068342278e-01 -7.044539736935043e-01 -2.001136394686103e-01 -4.208553680796570e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.200000000000000e+01 6.796546922590817e-01 -7.044599459736781e-01 -2.000849068215534e-01 -4.209173162493760e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.300000000000000e+01 6.796565775227883e-01 -7.044659191869860e-01 -2.000561677783481e-01 -4.209792237019010e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.400000000000000e+01 6.796584625182990e-01 -7.044718934092341e-01 -2.000274224403609e-01 -4.210410901012060e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.500000000000000e+01 6.796603473237741e-01 -7.044778685840885e-01 -1.999986707327806e-01 -4.211029156948910e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.600000000000000e+01 6.796622319377462e-01 -7.044838447124563e-01 -1.999699126555146e-01 -4.211647004561090e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.700000000000000e+01 6.796641162823588e-01 -7.044898218484826e-01 -1.999411482841119e-01 -4.212264441894000e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.800000000000000e+01 6.796660004402233e-01 -7.044957999329756e-01 -1.999123775387696e-01 -4.212881471373130e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.900000000000000e+01 6.796678843935604e-01 -7.045017789771568e-01 -1.998836004379378e-01 -4.213498092998230e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>9.000000000000000e+01 6.796697681018203e-01 -7.045077590123142e-01 -1.998548170131007e-01 -4.214114303771320e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>9.100000000000000e+01 6.796716515954266e-01 -7.045137400133533e-01 -1.998260272412535e-01 -4.214730106329730e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>9.200000000000000e+01 6.796735349070104e-01 -7.045197219563238e-01 -1.997972310910624e-01 -4.215345501780120e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>9.300000000000000e+01 6.796754179552619e-01 -7.045257049010482e-01 -1.997684286340649e-01 -4.215960486174000e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>9.400000000000000e+01 6.796773008000128e-01 -7.045316888017777e-01 -1.997396198185027e-01 -4.216575062872800e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>9.500000000000000e+01 6.796791834556047e-01 -7.045376736482865e-01 -1.997108046288966e-01 -4.217189232014360e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>9.600000000000000e+01 6.796810658444614e-01 -7.045436594972865e-01 -1.996819831342765e-01 -4.217802990030720e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>9.700000000000000e+01 6.796829480627019e-01 -7.045496462769856e-01 -1.996531552486250e-01 -4.218416341516560e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>9.800000000000000e+01 6.796848300095097e-01 -7.045556340610444e-01 -1.996243210622798e-01 -4.219029281964820e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>9.900000000000000e+01 6.796867117714123e-01 -7.045616227842402e-01 -1.995954804989941e-01 -4.219641815816980e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.000000000000000e+02 6.796885933255380e-01 -7.045676124646588e-01 -1.995666335746971e-01 -4.220253941013960e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.010000000000000e+02 6.796904746220614e-01 -7.045736031379983e-01 -1.995377803348005e-01 -4.220865655569230e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.020000000000000e+02 6.796923557182968e-01 -7.045795947603323e-01 -1.995089207298232e-01 -4.221476962745790e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.030000000000000e+02 6.796942366154390e-01 -7.045855873298367e-01 -1.994800547590306e-01 -4.222087862845600e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.040000000000000e+02 6.796961172538162e-01 -7.045915808937199e-01 -1.994511824669762e-01 -4.222698350936580e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.050000000000000e+02 6.796979976852925e-01 -7.045975754080924e-01 -1.994223038181599e-01 -4.223308432377840e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.060000000000000e+02 6.796998779255191e-01 -7.046035708629457e-01 -1.993934187931938e-01 -4.223918106666610e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.070000000000000e+02 6.797017578961645e-01 -7.046095673167410e-01 -1.993645274591496e-01 -4.224527369504360e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.080000000000000e+02 6.797036376917659e-01 -7.046155646976316e-01 -1.993356297340957e-01 -4.225136226123380e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.090000000000000e+02 6.797055172182811e-01 -7.046215630731820e-01 -1.993067257049162e-01 -4.225744672978040e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.100000000000000e+02 6.797073965522089e-01 -7.046275623893914e-01 -1.992778152955133e-01 -4.226352711795160e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.110000000000000e+02 6.797092756839871e-01 -7.046335626522799e-01 -1.992488985150173e-01 -4.226960342441640e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.120000000000000e+02 6.797111545451996e-01 -7.046395639095456e-01 -1.992199754295197e-01 -4.227567563101480e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.130000000000000e+02 6.797130332134302e-01 -7.046455661048171e-01 -1.991910459655104e-01 -4.228174376472930e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.140000000000000e+02 6.797149116732815e-01 -7.046515692483717e-01 -1.991621101374741e-01 -4.228780782186530e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.150000000000000e+02 6.797167898714911e-01 -7.046575733784293e-01 -1.991331679940133e-01 -4.229386778112310e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.160000000000000e+02 6.797186678692761e-01 -7.046635784513378e-01 -1.991042194748240e-01 -4.229992365824300e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.170000000000000e+02 6.797205456600242e-01 -7.046695844701800e-01 -1.990752645881302e-01 -4.230597545771560e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.180000000000000e+02 6.797224231929014e-01 -7.046755914710134e-01 -1.990463033812120e-01 -4.231202316153090e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.190000000000000e+02 6.797243005156455e-01 -7.046815994188381e-01 -1.990173358088236e-01 -4.231806678692700e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.200000000000000e+02 6.797261776449124e-01 -7.046876083013288e-01 -1.989883618542364e-01 -4.232410633855860e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.210000000000000e+02 6.797280544946541e-01 -7.046936181790645e-01 -1.989593815997579e-01 -4.233014179108430e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.220000000000000e+02 6.797299311798736e-01 -7.046996289703368e-01 -1.989303949329057e-01 -4.233617317510400e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.230000000000000e+02 6.797318075843050e-01 -7.047056407566004e-01 -1.989014019664283e-01 -4.234220045996710e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.240000000000000e+02 6.797336837877276e-01 -7.047116534806431e-01 -1.988724026229552e-01 -4.234822366896840e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.250000000000000e+02 6.797355597921615e-01 -7.047176671404248e-01 -1.988433969000887e-01 -4.235424280315040e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.260000000000000e+02 6.797374355242299e-01 -7.047236817876797e-01 -1.988143848676253e-01 -4.236025783996730e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.270000000000000e+02 6.797393110583803e-01 -7.047296973694713e-01 -1.987853664521773e-01 -4.236626879825200e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.280000000000000e+02 6.797411863821243e-01 -7.047357138916002e-01 -1.987563416709577e-01 -4.237227568937300e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.290000000000000e+02 6.797430614399738e-01 -7.047417313962825e-01 -1.987273105692628e-01 -4.237827847718480e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.300000000000000e+02 6.797449362940748e-01 -7.047477498368057e-01 -1.986982730912777e-01 -4.238427719175490e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.310000000000000e+02 6.797468109439584e-01 -7.047537692133381e-01 -1.986692292359904e-01 -4.239027183080040e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.320000000000000e+02 6.797486853211984e-01 -7.047597895736176e-01 -1.986401790695730e-01 -4.239626237607330e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.330000000000000e+02 6.797505595173958e-01 -7.047658108521972e-01 -1.986111225027640e-01 -4.240224885338540e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.340000000000000e+02 6.797524334436709e-01 -7.047718331129262e-01 -1.985820596178356e-01 -4.240823122922970e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.350000000000000e+02 6.797543071639158e-01 -7.047778563082016e-01 -1.985529903564512e-01 -4.241420953208690e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.360000000000000e+02 6.797561806809566e-01 -7.047838804346076e-01 -1.985239147172657e-01 -4.242018376796050e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.370000000000000e+02 6.797580539211397e-01 -7.047899055464529e-01 -1.984948327649853e-01 -4.242615390024520e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.380000000000000e+02 6.797599269624665e-01 -7.047959315858279e-01 -1.984657444282991e-01 -4.243211996316710e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.390000000000000e+02 6.797617997916312e-01 -7.048019585618789e-01 -1.984366497188867e-01 -4.243808195154290e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.400000000000000e+02 6.797636723557344e-01 -7.048079865133727e-01 -1.984075486832945e-01 -4.244403983950480e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.410000000000000e+02 6.797655447081312e-01 -7.048140153988206e-01 -1.983784412764372e-01 -4.244999366054020e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.420000000000000e+02 6.797674168530146e-01 -7.048200452153767e-01 -1.983493274921200e-01 -4.245594341194520e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.430000000000000e+02 6.797692887287506e-01 -7.048260760093651e-01 -1.983202073822311e-01 -4.246188905734140e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.440000000000000e+02 6.797711603963520e-01 -7.048321077321323e-01 -1.982910808982288e-01 -4.246783064260640e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.450000000000000e+02 6.797730318568528e-01 -7.048381403862743e-01 -1.982619480296380e-01 -4.247376814522210e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.460000000000000e+02 6.797749030429507e-01 -7.048441740175544e-01 -1.982328088443416e-01 -4.247970155428780e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.470000000000000e+02 6.797767740425864e-01 -7.048502085623766e-01 -1.982036632581659e-01 -4.248563089884010e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.480000000000000e+02 6.797786447688474e-01 -7.048562440816140e-01 -1.981745113552329e-01 -4.249155615536030e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.490000000000000e+02 6.797805152918426e-01 -7.048622805270170e-01 -1.981453530624595e-01 -4.249747733175350e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.500000000000000e+02 6.797823856004088e-01 -7.048683179042089e-01 -1.981161883940513e-01 -4.250339443528250e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.510000000000000e+02 6.797842556315041e-01 -7.048743562578088e-01 -1.980870174095032e-01 -4.250930744517820e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.520000000000000e+02 6.797861254679065e-01 -7.048803955271700e-01 -1.980578400312500e-01 -4.251521639305070e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.530000000000000e+02 6.797879950808270e-01 -7.048864357327520e-01 -1.980286562852194e-01 -4.252112126740020e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.540000000000000e+02 6.797898644234995e-01 -7.048924769088557e-01 -1.979994662123582e-01 -4.252702204480930e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.550000000000000e+02 6.797917335587214e-01 -7.048985190102082e-01 -1.979702697516701e-01 -4.253291874413050e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.560000000000000e+02 6.797936024814468e-01 -7.049045620367884e-01 -1.979410669144260e-01 -4.253881138206560e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.570000000000000e+02 6.797954711314728e-01 -7.049106060338930e-01 -1.979118577512490e-01 -4.254469992276370e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.580000000000000e+02 6.797973395895273e-01 -7.049166509416007e-01 -1.978826421881329e-01 -4.255058440165000e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.590000000000000e+02 6.797992077727463e-01 -7.049226968198082e-01 -1.978534203010406e-01 -4.255646478521280e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.600000000000000e+02 6.798010757438010e-01 -7.049287436221506e-01 -1.978241920317650e-01 -4.256234109922370e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.610000000000000e+02 6.798029435130043e-01 -7.049347913405176e-01 -1.977949573702664e-01 -4.256821334811320e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.620000000000000e+02 6.798048109921104e-01 -7.049408400387458e-01 -1.977657163974766e-01 -4.257408149615750e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.630000000000000e+02 6.798066782686570e-01 -7.049468896519006e-01 -1.977364690331906e-01 -4.257994558159980e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.640000000000000e+02 6.798085453254362e-01 -7.049529401935497e-01 -1.977072152891063e-01 -4.258580558837690e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.650000000000000e+02 6.798104121186409e-01 -7.049589916930997e-01 -1.976779552097546e-01 -4.259166151046600e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.660000000000000e+02 6.798122786875559e-01 -7.049650441220499e-01 -1.976486887566367e-01 -4.259751335948540e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.670000000000000e+02 6.798141450456567e-01 -7.049710974699759e-01 -1.976194159167985e-01 -4.260336114115990e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.680000000000000e+02 6.798160111310448e-01 -7.049771517814684e-01 -1.975901367469469e-01 -4.260920483048780e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.690000000000000e+02 6.798178769972170e-01 -7.049832070156776e-01 -1.975608511999767e-01 -4.261504445648290e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.700000000000000e+02 6.798197426591834e-01 -7.049892631641861e-01 -1.975315592543420e-01 -4.262088000696420e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.710000000000000e+02 6.798216080319331e-01 -7.049953202865271e-01 -1.975022609925256e-01 -4.262671145906310e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.720000000000000e+02 6.798234732209134e-01 -7.050013783035031e-01 -1.974729563203813e-01 -4.263253886532880e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.730000000000000e+02 6.798253381257020e-01 -7.050074372898302e-01 -1.974436453256216e-01 -4.263836217341660e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.740000000000000e+02 6.798272028242294e-01 -7.050134971891345e-01 -1.974143279332440e-01 -4.264418140844000e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.750000000000000e+02 6.798290672951102e-01 -7.050195580133446e-01 -1.973850041695649e-01 -4.264999658042160e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.760000000000000e+02 6.798309315042805e-01 -7.050256197886668e-01 -1.973556740611991e-01 -4.265580766411970e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.770000000000000e+02 6.798327954797303e-01 -7.050316824936707e-01 -1.973263375827155e-01 -4.266161467351580e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.780000000000000e+02 6.798346592564191e-01 -7.050377461022169e-01 -1.972969947013596e-01 -4.266741762312860e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.790000000000000e+02 6.798365227410014e-01 -7.050438106819047e-01 -1.972676455028438e-01 -4.267321647505450e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.800000000000000e+02 6.798383860193378e-01 -7.050498761693755e-01 -1.972382899075223e-01 -4.267901126463060e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.810000000000000e+02 6.798402490773372e-01 -7.050559425747454e-01 -1.972089279269271e-01 -4.268480198400300e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.820000000000000e+02 6.798421118500496e-01 -7.050620099429011e-01 -1.971795596251077e-01 -4.269058861845190e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.830000000000000e+02 6.798439744368735e-01 -7.050680782037289e-01 -1.971501849026640e-01 -4.269637119032000e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.840000000000000e+02 6.798458367370194e-01 -7.050741474283274e-01 -1.971208038566758e-01 -4.270214967021480e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.850000000000000e+02 6.798476988269346e-01 -7.050802175609912e-01 -1.970914164143522e-01 -4.270792408501470e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.860000000000000e+02 6.798495606920428e-01 -7.050862886102385e-01 -1.970620225921574e-01 -4.271369443824960e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.870000000000000e+02 6.798514222739783e-01 -7.050923606200558e-01 -1.970326224391282e-01 -4.271946069470040e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.880000000000000e+02 6.798532836506548e-01 -7.050984335328769e-01 -1.970032158829008e-01 -4.272522288649730e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.890000000000000e+02 6.798551448009553e-01 -7.051045073627854e-01 -1.969738029441770e-01 -4.273098100985320e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.900000000000000e+02 6.798570056664353e-01 -7.051105821499222e-01 -1.969443836810372e-01 -4.273673505268180e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.910000000000000e+02 6.798588663180682e-01 -7.051166578441354e-01 -1.969149580221255e-01 -4.274248503037880e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.920000000000000e+02 6.798607267547637e-01 -7.051227344464227e-01 -1.968855259661000e-01 -4.274823093809000e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.930000000000000e+02 6.798625869035370e-01 -7.051288120083469e-01 -1.968560875826636e-01 -4.275397275312360e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.940000000000000e+02 6.798644468316455e-01 -7.051348904797335e-01 -1.968266428101466e-01 -4.275971050558920e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.950000000000000e+02 6.798663065475848e-01 -7.051409698549571e-01 -1.967971916374721e-01 -4.276544419224420e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.960000000000000e+02 6.798681659713435e-01 -7.051470501891645e-01 -1.967677341444176e-01 -4.277117379677370e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.970000000000000e+02 6.798700252083145e-01 -7.051531314085940e-01 -1.967382702241842e-01 -4.277689933943110e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.980000000000000e+02 6.798718841447217e-01 -7.051592135931014e-01 -1.967087999876984e-01 -4.278262079004330e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.990000000000000e+02 6.798737428751541e-01 -7.051652966732846e-01 -1.966793233462688e-01 -4.278833818531920e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.000000000000000e+02 6.798756013870554e-01 -7.051713806585288e-01 -1.966498403091284e-01 -4.279405151570000e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.010000000000000e+02 6.798774596011082e-01 -7.051774656058257e-01 -1.966203509500633e-01 -4.279976075122290e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.020000000000000e+02 6.798793176047739e-01 -7.051835514505909e-01 -1.965908551878366e-01 -4.280546592800730e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.030000000000000e+02 6.798811753820057e-01 -7.051896382039839e-01 -1.965613530366951e-01 -4.281116703969420e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.040000000000000e+02 6.798830328785108e-01 -7.051957259050775e-01 -1.965318445464533e-01 -4.281686406426270e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.050000000000000e+02 6.798848901500238e-01 -7.052018145124993e-01 -1.965023296651326e-01 -4.282255702482280e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.060000000000000e+02 6.798867472016763e-01 -7.052079040219095e-01 -1.964728083874397e-01 -4.282824592370850e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.070000000000000e+02 6.798886039654499e-01 -7.052139944820403e-01 -1.964432807767602e-01 -4.283393073556980e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.080000000000000e+02 6.798904605329755e-01 -7.052200858268264e-01 -1.964137467443024e-01 -4.283961148898780e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.090000000000000e+02 6.798923168074383e-01 -7.052261781237396e-01 -1.963842063854064e-01 -4.284528816068030e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.100000000000000e+02 6.798941728609138e-01 -7.052322713221690e-01 -1.963546596267274e-01 -4.285096076426350e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.110000000000000e+02 6.798960286978132e-01 -7.052383654171293e-01 -1.963251064663201e-01 -4.285662930873390e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.120000000000000e+02 6.798978842441032e-01 -7.052444604613733e-01 -1.962955469740358e-01 -4.286229376856430e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.130000000000000e+02 6.798997395631307e-01 -7.052505564083331e-01 -1.962659810899465e-01 -4.286795416770520e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.140000000000000e+02 6.799015946610585e-01 -7.052566532548605e-01 -1.962364088033276e-01 -4.287361049732730e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.150000000000000e+02 6.799034494766948e-01 -7.052627510435318e-01 -1.962068301739770e-01 -4.287926274180850e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.160000000000000e+02 6.799053040579373e-01 -7.052688497371346e-01 -1.961772451606945e-01 -4.288491093034770e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.170000000000000e+02 6.799071584244262e-01 -7.052749493234310e-01 -1.961476537385194e-01 -4.289055505502580e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.180000000000000e+02 6.799090124953324e-01 -7.052810498586009e-01 -1.961180559871833e-01 -4.289619509676460e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.190000000000000e+02 6.799108663419909e-01 -7.052871512925548e-01 -1.960884518339890e-01 -4.290183106891620e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.200000000000000e+02 6.799127199705892e-01 -7.052932536182239e-01 -1.960588412771350e-01 -4.290746298584930e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.210000000000000e+02 6.799145733007834e-01 -7.052993568929989e-01 -1.960292243923389e-01 -4.291309081939600e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.220000000000000e+02 6.799164264410558e-01 -7.053054610388255e-01 -1.959996010742728e-01 -4.291871460284140e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.230000000000000e+02 6.799182792742511e-01 -7.053115661404445e-01 -1.959699714317722e-01 -4.292433429053130e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.240000000000000e+02 6.799201318924670e-01 -7.053176721286518e-01 -1.959403353818848e-01 -4.292994992757770e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.250000000000000e+02 6.799219842782368e-01 -7.053237790168198e-01 -1.959106929375021e-01 -4.293556150005920e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.260000000000000e+02 6.799238363838389e-01 -7.053298868396233e-01 -1.958810441415389e-01 -4.294116898626830e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.270000000000000e+02 6.799256882489312e-01 -7.053359955650910e-01 -1.958513889621641e-01 -4.294677241668230e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.280000000000000e+02 6.799275399007848e-01 -7.053421051753849e-01 -1.958217273673531e-01 -4.295237178653950e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.290000000000000e+02 6.799293912523900e-01 -7.053482157312343e-01 -1.957920594425984e-01 -4.295796707415940e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.300000000000000e+02 6.799312423804701e-01 -7.053543271785773e-01 -1.957623851101765e-01 -4.296355829516520e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.310000000000000e+02 6.799330932777483e-01 -7.053604395198165e-01 -1.957327043816172e-01 -4.296914546069910e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.320000000000000e+02 6.799349438895221e-01 -7.053665527947474e-01 -1.957030173063042e-01 -4.297472854615510e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.330000000000000e+02 6.799367942876130e-01 -7.053726669509697e-01 -1.956733238154107e-01 -4.298030757673090e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.340000000000000e+02 6.799386444002338e-01 -7.053787820404068e-01 -1.956436239750128e-01 -4.298588252308550e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.350000000000000e+02 6.799404942750004e-01 -7.053848980264166e-01 -1.956139177432166e-01 -4.299145341204710e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.360000000000000e+02 6.799423439304839e-01 -7.053910148959684e-01 -1.955842050996064e-01 -4.299702024455190e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.370000000000000e+02 6.799441932868407e-01 -7.053971327065053e-01 -1.955544861186160e-01 -4.300258299023900e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.380000000000000e+02 6.799460424220555e-01 -7.054032513999069e-01 -1.955247607284734e-01 -4.300814168384420e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.390000000000000e+02 6.799478913162851e-01 -7.054093709916773e-01 -1.954950289433865e-01 -4.301369630812860e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.400000000000000e+02 6.799497399253909e-01 -7.054154915115455e-01 -1.954652908083617e-01 -4.301924685673470e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.410000000000000e+02 6.799515883048342e-01 -7.054216129194452e-01 -1.954355462688653e-01 -4.302479334583630e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.420000000000000e+02 6.799534364486993e-01 -7.054277352179514e-01 -1.954057953324866e-01 -4.303033578017730e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.430000000000000e+02 6.799552843018397e-01 -7.054338584479759e-01 -1.953760380472673e-01 -4.303587413029110e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.440000000000000e+02 6.799571319212289e-01 -7.054399825667831e-01 -1.953462743608417e-01 -4.304140842226400e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.450000000000000e+02 6.799589793143376e-01 -7.054461075679146e-01 -1.953165042666282e-01 -4.304693866173220e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.460000000000000e+02 6.799608264114252e-01 -7.054522335037593e-01 -1.952867278243909e-01 -4.305246480854950e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.470000000000000e+02 6.799626732958443e-01 -7.054583603087674e-01 -1.952569449652997e-01 -4.305798692057540e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.480000000000000e+02 6.799645198865102e-01 -7.054644880452009e-01 -1.952271557560460e-01 -4.306350494368820e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.490000000000000e+02 6.799663662478446e-01 -7.054706166648559e-01 -1.951973601373549e-01 -4.306901890707300e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.500000000000000e+02 6.799682123672300e-01 -7.054767461736650e-01 -1.951675581265924e-01 -4.307452882197600e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.510000000000000e+02 6.799700582031040e-01 -7.054828766041455e-01 -1.951377497556802e-01 -4.308003465524490e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.520000000000000e+02 6.799719037993398e-01 -7.054890079235407e-01 -1.951079349834540e-01 -4.308553642525750e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.530000000000000e+02 6.799737491623745e-01 -7.054951401249805e-01 -1.950781138069646e-01 -4.309103414418460e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.540000000000000e+02 6.799755942368141e-01 -7.055012732503474e-01 -1.950482862727311e-01 -4.309652777778040e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.550000000000000e+02 6.799774390652883e-01 -7.055074072658489e-01 -1.950184523451998e-01 -4.310201735551260e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.560000000000000e+02 6.799792836711779e-01 -7.055135421545229e-01 -1.949886120003735e-01 -4.310750288265310e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.570000000000000e+02 6.799811279726711e-01 -7.055196779764594e-01 -1.949587653119178e-01 -4.311298432096380e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.580000000000000e+02 6.799829720696676e-01 -7.055258146566715e-01 -1.949289121893675e-01 -4.311846171898520e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.590000000000000e+02 6.799848158555376e-01 -7.055319522715081e-01 -1.948990527338428e-01 -4.312393503978870e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.600000000000000e+02 6.799866594173840e-01 -7.055380907592211e-01 -1.948691868578758e-01 -4.312940430344600e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.610000000000000e+02 6.799885027376091e-01 -7.055442301305632e-01 -1.948393145807669e-01 -4.313486951217600e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.620000000000000e+02 6.799903437330825e-01 -7.055503719134103e-01 -1.948094378296771e-01 -4.314032979820430e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.630000000000000e+02 6.799921885598681e-01 -7.055565115924540e-01 -1.947795509023465e-01 -4.314578771245710e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.640000000000000e+02 6.799940311106697e-01 -7.055626536447086e-01 -1.947496594578396e-01 -4.315124073250150e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.650000000000000e+02 6.799958733666632e-01 -7.055687966182198e-01 -1.947197616570699e-01 -4.315668966962220e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.660000000000000e+02 6.799977153858934e-01 -7.055749404682642e-01 -1.946898574492786e-01 -4.316213455739350e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.670000000000000e+02 6.799995571682322e-01 -7.055810851947246e-01 -1.946599468331228e-01 -4.316757539367460e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.680000000000000e+02 6.800013986536546e-01 -7.055872308428952e-01 -1.946300298594589e-01 -4.317301214224540e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.690000000000000e+02 6.800032398987002e-01 -7.055933773683748e-01 -1.946001064806982e-01 -4.317844484070730e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.700000000000000e+02 6.800050809094393e-01 -7.055995247668866e-01 -1.945701766888613e-01 -4.318387348717150e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.710000000000000e+02 6.800069216160569e-01 -7.056056730897458e-01 -1.945402405465657e-01 -4.318929804830290e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.720000000000000e+02 6.800087719761647e-01 -7.056118150292564e-01 -1.945102888288200e-01 -4.319472266742780e-02 3.720000000000000e-12 3.510000000000000e-12 1.110000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.730000000000000e+02 6.800106285608964e-01 -7.056179531014544e-01 -1.944803247074674e-01 -4.320014591186370e-02 3.720000000000000e-12 3.510000000000000e-12 1.110000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.740000000000000e+02 6.800124685148802e-01 -7.056241040720422e-01 -1.944503693701792e-01 -4.320555830709490e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.530000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.170000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.750000000000000e+02 6.800143082323805e-01 -7.056302559152922e-01 -1.944204076167761e-01 -4.321096664370000e-02 3.700000000000000e-12 3.500000000000000e-12 1.160000000000000e-13 6.510000000000000e-13 3.850000000000000e-12 -1.920000000000000e-12 8.150000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.760000000000000e+02 6.800161476428638e-01 -7.056364086811139e-01 -1.943904395150271e-01 -4.321637089962240e-02 3.700000000000000e-12 3.500000000000000e-12 1.170000000000000e-13 6.500000000000000e-13 3.850000000000000e-12 -1.920000000000000e-12 8.140000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.770000000000000e+02 6.800179868134718e-01 -7.056425623204187e-01 -1.943604650003440e-01 -4.322177109833850e-02 3.700000000000000e-12 3.500000000000000e-12 1.190000000000000e-13 6.490000000000000e-13 3.850000000000000e-12 -1.910000000000000e-12 8.130000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.780000000000000e+02 6.800198257563828e-01 -7.056487168213401e-01 -1.943304840662219e-01 -4.322716725906180e-02 3.700000000000000e-12 3.500000000000000e-12 1.180000000000000e-13 6.490000000000000e-13 3.850000000000000e-12 -1.910000000000000e-12 8.130000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.790000000000000e+02 6.800216643871712e-01 -7.056548722478666e-01 -1.943004967843931e-01 -4.323255933074930e-02 3.700000000000000e-12 3.500000000000000e-12 1.190000000000000e-13 6.480000000000000e-13 3.850000000000000e-12 -1.910000000000000e-12 8.120000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.800000000000000e+02 6.800235027783970e-01 -7.056610285445999e-01 -1.942705030905896e-01 -4.323794735306230e-02 3.700000000000000e-12 3.490000000000000e-12 1.230000000000000e-13 6.450000000000000e-13 3.840000000000000e-12 -1.910000000000000e-12 8.060000000000000e-13 7.880000000000000e-12 -2.380000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.810000000000000e+02 6.800253409346203e-01 -7.056671857083662e-01 -1.942405029782267e-01 -4.324333132348980e-02 3.700000000000000e-12 3.490000000000000e-12 1.240000000000000e-13 6.440000000000000e-13 3.840000000000000e-12 -1.910000000000000e-12 8.050000000000000e-13 7.880000000000000e-12 -2.380000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.820000000000000e+02 6.800271853035798e-01 -7.056733390051212e-01 -1.942104904705938e-01 -4.324871393030960e-02 3.700000000000000e-12 3.490000000000000e-12 1.230000000000000e-13 6.440000000000000e-13 3.840000000000000e-12 -1.900000000000000e-12 8.050000000000000e-13 7.880000000000000e-12 -2.380000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.830000000000000e+02 6.800290337684854e-01 -7.056794899887119e-01 -1.941804675260357e-01 -4.325409428645660e-02 3.700000000000000e-12 3.490000000000000e-12 1.230000000000000e-13 6.440000000000000e-13 3.840000000000000e-12 -1.900000000000000e-12 8.050000000000000e-13 7.880000000000000e-12 -2.380000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.840000000000000e+02 6.800308710951687e-01 -7.056856498393206e-01 -1.941504482732636e-01 -4.325946605880240e-02 3.700000000000000e-12 3.490000000000000e-12 1.240000000000000e-13 6.420000000000000e-13 3.840000000000000e-12 -1.900000000000000e-12 8.040000000000000e-13 7.880000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.850000000000000e+02 6.800327081877929e-01 -7.056918105541162e-01 -1.941204225983502e-01 -4.326483377834180e-02 3.700000000000000e-12 3.490000000000000e-12 1.250000000000000e-13 6.410000000000000e-13 3.840000000000000e-12 -1.900000000000000e-12 8.020000000000000e-13 7.880000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.860000000000000e+02 6.800345450279224e-01 -7.056979721440877e-01 -1.940903905222845e-01 -4.327019744924040e-02 3.700000000000000e-12 3.490000000000000e-12 1.260000000000000e-13 6.400000000000000e-13 3.840000000000000e-12 -1.900000000000000e-12 8.010000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.870000000000000e+02 6.800363815718353e-01 -7.057041346425851e-01 -1.940603520808704e-01 -4.327555704198350e-02 3.700000000000000e-12 3.490000000000000e-12 1.270000000000000e-13 6.390000000000000e-13 3.840000000000000e-12 -1.900000000000000e-12 8.000000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.880000000000000e+02 6.800382178757998e-01 -7.057102980065399e-01 -1.940303072240221e-01 -4.328091258717610e-02 3.700000000000000e-12 3.490000000000000e-12 1.270000000000000e-13 6.390000000000000e-13 3.840000000000000e-12 -1.900000000000000e-12 8.000000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.890000000000000e+02 6.800400539303699e-01 -7.057164622422814e-01 -1.940002559599285e-01 -4.328626408111950e-02 3.700000000000000e-12 3.490000000000000e-12 1.280000000000000e-13 6.380000000000000e-13 3.840000000000000e-12 -1.900000000000000e-12 7.990000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.900000000000000e+02 6.800418896856781e-01 -7.057226273865107e-01 -1.939701983327810e-01 -4.329161149869400e-02 3.700000000000000e-12 3.490000000000000e-12 1.300000000000000e-13 6.370000000000000e-13 3.840000000000000e-12 -1.900000000000000e-12 7.980000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.910000000000000e+02 6.800437251952343e-01 -7.057287933985669e-01 -1.939401342941489e-01 -4.329695486704600e-02 3.700000000000000e-12 3.490000000000000e-12 1.310000000000000e-13 6.360000000000000e-13 3.840000000000000e-12 -1.900000000000000e-12 7.960000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.920000000000000e+02 6.800455640215590e-01 -7.057349576634192e-01 -1.939100605350644e-01 -4.330229566315500e-02 3.700000000000000e-12 3.490000000000000e-12 1.300000000000000e-13 6.360000000000000e-13 3.840000000000000e-12 -1.890000000000000e-12 7.960000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.930000000000000e+02 6.800474048929434e-01 -7.057411211137069e-01 -1.938799782350156e-01 -4.330763335869410e-02 3.700000000000000e-12 3.490000000000000e-12 1.300000000000000e-13 6.360000000000000e-13 3.840000000000000e-12 -1.890000000000000e-12 7.960000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.940000000000000e+02 6.800492396130379e-01 -7.057472897657984e-01 -1.938498950018737e-01 -4.331296454552660e-02 3.700000000000000e-12 3.490000000000000e-12 1.310000000000000e-13 6.340000000000000e-13 3.830000000000000e-12 -1.890000000000000e-12 7.950000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.950000000000000e+02 6.800510740907735e-01 -7.057534592811132e-01 -1.938198053511975e-01 -4.331829168320820e-02 3.700000000000000e-12 3.490000000000000e-12 1.320000000000000e-13 6.330000000000000e-13 3.830000000000000e-12 -1.890000000000000e-12 7.940000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.960000000000000e+02 6.800529082602366e-01 -7.057596297073655e-01 -1.937897093438714e-01 -4.332361474455530e-02 3.700000000000000e-12 3.490000000000000e-12 1.330000000000000e-13 6.320000000000000e-13 3.830000000000000e-12 -1.890000000000000e-12 7.920000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.970000000000000e+02 6.800547422135207e-01 -7.057658009771285e-01 -1.937596068919702e-01 -4.332893376351720e-02 3.700000000000000e-12 3.490000000000000e-12 1.330000000000000e-13 6.320000000000000e-13 3.830000000000000e-12 -1.890000000000000e-12 7.920000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.980000000000000e+02 6.800565758502106e-01 -7.057719731615167e-01 -1.937294980928684e-01 -4.333424871012740e-02 3.700000000000000e-12 3.490000000000000e-12 1.330000000000000e-13 6.320000000000000e-13 3.830000000000000e-12 -1.890000000000000e-12 7.920000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.990000000000000e+02 6.800584092542421e-01 -7.057781461990635e-01 -1.936993828662977e-01 -4.333955961496180e-02 3.700000000000000e-12 3.490000000000000e-12 1.340000000000000e-13 6.310000000000000e-13 3.830000000000000e-12 -1.890000000000000e-12 7.910000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.000000000000000e+02 6.800602423965444e-01 -7.057843201128331e-01 -1.936692612333187e-01 -4.334486645220950e-02 3.700000000000000e-12 3.490000000000000e-12 1.370000000000000e-13 6.290000000000000e-13 3.830000000000000e-12 -1.890000000000000e-12 7.890000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.010000000000000e+02 6.800620752489481e-01 -7.057904949193428e-01 -1.936391332278207e-01 -4.335016923129100e-02 3.700000000000000e-12 3.490000000000000e-12 1.360000000000000e-13 6.290000000000000e-13 3.830000000000000e-12 -1.890000000000000e-12 7.890000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.020000000000000e+02 6.800644394734375e-01 -7.057960240025316e-01 -1.936093530548097e-01 -4.335607311087000e-02 3.700000000000000e-12 3.490000000000000e-12 1.370000000000000e-13 6.280000000000001e-13 3.830000000000000e-12 -1.880000000000000e-12 7.870000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.030000000000000e+02 6.800662099626688e-01 -7.058022743575298e-01 -1.935791808418024e-01 -4.336127677278720e-02 3.700000000000000e-12 3.490000000000000e-12 1.370000000000000e-13 6.280000000000001e-13 3.830000000000000e-12 -1.880000000000000e-12 7.870000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.040000000000000e+02 6.800679823561149e-01 -7.058085232968602e-01 -1.935490019777740e-01 -4.336648070798970e-02 3.700000000000000e-12 3.490000000000000e-12 1.370000000000000e-13 6.280000000000001e-13 3.830000000000000e-12 -1.880000000000000e-12 7.870000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.050000000000000e+02 6.800697572740785e-01 -7.058147706185546e-01 -1.935188149694217e-01 -4.337168512617530e-02 3.700000000000000e-12 3.490000000000000e-12 1.390000000000000e-13 6.250000000000000e-13 3.830000000000000e-12 -1.880000000000000e-12 7.850000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.060000000000000e+02 6.800715348115959e-01 -7.058210162409955e-01 -1.934886196787965e-01 -4.337689046396430e-02 3.700000000000000e-12 3.490000000000000e-12 1.390000000000000e-13 6.250000000000000e-13 3.830000000000000e-12 -1.880000000000000e-12 7.850000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.070000000000000e+02 6.800733146676580e-01 -7.058272601562531e-01 -1.934584170540734e-01 -4.338209732359600e-02 3.700000000000000e-12 3.490000000000000e-12 1.400000000000000e-13 6.240000000000000e-13 3.830000000000000e-12 -1.880000000000000e-12 7.840000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.080000000000000e+02 6.800750963970092e-01 -7.058335023457607e-01 -1.934282085873377e-01 -4.338730631888740e-02 3.700000000000000e-12 3.490000000000000e-12 1.400000000000000e-13 6.240000000000000e-13 3.830000000000000e-12 -1.880000000000000e-12 7.830000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.090000000000000e+02 6.800768796934054e-01 -7.058397426907372e-01 -1.933979956928406e-01 -4.339251786595870e-02 3.700000000000000e-12 3.490000000000000e-12 1.400000000000000e-13 6.240000000000000e-13 3.830000000000000e-12 -1.880000000000000e-12 7.830000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.100000000000000e+02 6.800786646053507e-01 -7.058459809165807e-01 -1.933677791939897e-01 -4.339773199255140e-02 3.700000000000000e-12 3.490000000000000e-12 1.420000000000000e-13 6.220000000000000e-13 3.830000000000000e-12 -1.880000000000000e-12 7.810000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.110000000000000e+02 6.800804515977056e-01 -7.058522166070010e-01 -1.933375590727444e-01 -4.340294825743240e-02 3.700000000000000e-12 3.490000000000000e-12 1.420000000000000e-13 6.220000000000000e-13 3.830000000000000e-12 -1.880000000000000e-12 7.810000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.120000000000000e+02 6.800822588065927e-01 -7.058584365326280e-01 -1.933073183873061e-01 -4.340817308002680e-02 3.700000000000000e-12 3.490000000000000e-12 1.430000000000000e-13 6.210000000000000e-13 3.820000000000000e-12 -1.880000000000000e-12 7.800000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.130000000000000e+02 6.800840522858849e-01 -7.058646658638073e-01 -1.932770881414288e-01 -4.341339091750420e-02 3.700000000000000e-12 3.490000000000000e-12 1.430000000000000e-13 6.210000000000000e-13 3.820000000000000e-12 -1.880000000000000e-12 7.800000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.140000000000000e+02 6.800858499148742e-01 -7.058708917723857e-01 -1.932468508586869e-01 -4.341860807557950e-02 3.700000000000000e-12 3.490000000000000e-12 1.430000000000000e-13 6.210000000000000e-13 3.820000000000000e-12 -1.880000000000000e-12 7.800000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.150000000000000e+02 6.800876516570992e-01 -7.058771146110748e-01 -1.932166055230281e-01 -4.342382389926380e-02 3.700000000000000e-12 3.490000000000000e-12 1.440000000000000e-13 6.200000000000000e-13 3.820000000000000e-12 -1.870000000000000e-12 7.780000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.160000000000000e+02 6.800894568475073e-01 -7.058833351635689e-01 -1.931863516630958e-01 -4.342903814640470e-02 3.700000000000000e-12 3.490000000000000e-12 1.450000000000000e-13 6.190000000000000e-13 3.820000000000000e-12 -1.870000000000000e-12 7.770000000000000e-13 7.890000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.170000000000000e+02 6.800912643221110e-01 -7.058895545116237e-01 -1.931560893868945e-01 -4.343425096506160e-02 3.700000000000000e-12 3.490000000000000e-12 1.450000000000000e-13 6.190000000000000e-13 3.820000000000000e-12 -1.870000000000000e-12 7.770000000000000e-13 7.890000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.180000000000000e+02 6.800930727187896e-01 -7.058957737833765e-01 -1.931258192714218e-01 -4.343946276631000e-02 3.700000000000000e-12 3.490000000000000e-12 1.450000000000000e-13 6.190000000000000e-13 3.820000000000000e-12 -1.870000000000000e-12 7.770000000000000e-13 7.890000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.190000000000000e+02 6.800948808447127e-01 -7.059019938571479e-01 -1.930955421893178e-01 -4.344467405715620e-02 3.700000000000000e-12 3.480000000000000e-12 1.460000000000000e-13 6.180000000000000e-13 3.820000000000000e-12 -1.870000000000000e-12 7.760000000000000e-13 7.890000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.200000000000000e+02 6.800966879858228e-01 -7.059082151169886e-01 -1.930652591494158e-01 -4.344988527753310e-02 3.700000000000000e-12 3.480000000000000e-12 1.470000000000000e-13 6.160000000000000e-13 3.820000000000000e-12 -1.870000000000000e-12 7.750000000000000e-13 7.890000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.210000000000000e+02 6.800984940569759e-01 -7.059144373489267e-01 -1.930349711758078e-01 -4.345509667388730e-02 3.700000000000000e-12 3.480000000000000e-12 1.470000000000000e-13 6.160000000000000e-13 3.820000000000000e-12 -1.870000000000000e-12 7.740000000000000e-13 7.890000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.220000000000000e+02 6.801003020370210e-01 -7.059206579863587e-01 -1.930046769274401e-01 -4.346030926481870e-02 3.700000000000000e-12 3.480000000000000e-12 1.480000000000000e-13 6.150000000000000e-13 3.820000000000000e-12 -1.870000000000000e-12 7.730000000000000e-13 7.890000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.230000000000000e+02 6.801021078577804e-01 -7.059268796031856e-01 -1.929743818578749e-01 -4.346552067656540e-02 3.700000000000000e-12 3.480000000000000e-12 1.480000000000000e-13 6.150000000000000e-13 3.820000000000000e-12 -1.870000000000000e-12 7.730000000000000e-13 7.890000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.240000000000000e+02 6.801039149963756e-01 -7.059330992606205e-01 -1.929440843497088e-01 -4.347073141034490e-02 3.700000000000000e-12 3.480000000000000e-12 1.480000000000000e-13 6.150000000000000e-13 3.820000000000000e-12 -1.870000000000000e-12 7.730000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.250000000000000e+02 6.801057243103703e-01 -7.059393160402793e-01 -1.929137848951576e-01 -4.347594077503440e-02 3.700000000000000e-12 3.480000000000000e-12 1.500000000000000e-13 6.130000000000000e-13 3.820000000000000e-12 -1.870000000000000e-12 7.710000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.260000000000000e+02 6.801075363507137e-01 -7.059455293769104e-01 -1.928834837823045e-01 -4.348114804967640e-02 3.700000000000000e-12 3.480000000000000e-12 1.510000000000000e-13 6.120000000000000e-13 3.820000000000000e-12 -1.860000000000000e-12 7.700000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.270000000000000e+02 6.801093513191596e-01 -7.059517390925577e-01 -1.928531810928108e-01 -4.348635260410910e-02 3.700000000000000e-12 3.480000000000000e-12 1.510000000000000e-13 6.120000000000000e-13 3.820000000000000e-12 -1.860000000000000e-12 7.700000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.280000000000000e+02 6.801111691377855e-01 -7.059579453254369e-01 -1.928228767002737e-01 -4.349155397262000e-02 3.700000000000000e-12 3.480000000000000e-12 1.520000000000000e-13 6.110000000000000e-13 3.820000000000000e-12 -1.860000000000000e-12 7.680000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.290000000000000e+02 6.801129895795008e-01 -7.059641484040237e-01 -1.927925702686442e-01 -4.349675186292970e-02 3.700000000000000e-12 3.480000000000000e-12 1.520000000000000e-13 6.110000000000000e-13 3.820000000000000e-12 -1.860000000000000e-12 7.680000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.300000000000000e+02 6.801148124070654e-01 -7.059703487146184e-01 -1.927622612561160e-01 -4.350194611383860e-02 3.700000000000000e-12 3.480000000000000e-12 1.530000000000000e-13 6.100000000000000e-13 3.820000000000000e-12 -1.860000000000000e-12 7.670000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.310000000000000e+02 6.801166374723390e-01 -7.059765465972978e-01 -1.927319489590141e-01 -4.350713663679110e-02 3.700000000000000e-12 3.480000000000000e-12 1.530000000000000e-13 6.100000000000000e-13 3.820000000000000e-12 -1.860000000000000e-12 7.670000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.320000000000000e+02 6.801184993492909e-01 -7.059827168493201e-01 -1.927016004199913e-01 -4.351233788818200e-02 3.700000000000000e-12 3.480000000000000e-12 1.540000000000000e-13 6.080000000000000e-13 3.810000000000000e-12 -1.860000000000000e-12 7.660000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.330000000000000e+02 6.801203289352233e-01 -7.059889104477063e-01 -1.926712793077983e-01 -4.351752088297940e-02 3.700000000000000e-12 3.480000000000000e-12 1.540000000000000e-13 6.090000000000000e-13 3.810000000000000e-12 -1.860000000000000e-12 7.650000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.340000000000000e+02 6.801221609731459e-01 -7.059951019419735e-01 -1.926409529417248e-01 -4.352270024785650e-02 3.700000000000000e-12 3.480000000000000e-12 1.540000000000000e-13 6.090000000000000e-13 3.810000000000000e-12 -1.860000000000000e-12 7.650000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.350000000000000e+02 6.801239956176084e-01 -7.060012912206600e-01 -1.926106211194158e-01 -4.352787626215090e-02 3.700000000000000e-12 3.480000000000000e-12 1.550000000000000e-13 6.070000000000000e-13 3.810000000000000e-12 -1.860000000000000e-12 7.640000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.360000000000000e+02 6.801258329907574e-01 -7.060074781139022e-01 -1.925802839342549e-01 -4.353304934964170e-02 3.700000000000000e-12 3.480000000000000e-12 1.550000000000000e-13 6.070000000000000e-13 3.810000000000000e-12 -1.860000000000000e-12 7.640000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.370000000000000e+02 6.801276731500231e-01 -7.060136624505002e-01 -1.925499416972246e-01 -4.353822000451810e-02 3.700000000000000e-12 3.480000000000000e-12 1.560000000000000e-13 6.060000000000000e-13 3.810000000000000e-12 -1.860000000000000e-12 7.630000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.380000000000000e+02 6.801295160474115e-01 -7.060198441369843e-01 -1.925195948200177e-01 -4.354338866278710e-02 3.700000000000000e-12 3.480000000000000e-12 1.560000000000000e-13 6.060000000000000e-13 3.810000000000000e-12 -1.860000000000000e-12 7.630000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.390000000000000e+02 6.801313614774970e-01 -7.060260232454797e-01 -1.924892437082617e-01 -4.354855556228500e-02 3.700000000000000e-12 3.480000000000000e-12 1.550000000000000e-13 6.060000000000000e-13 3.810000000000000e-12 -1.860000000000000e-12 7.630000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.400000000000000e+02 6.801332090266611e-01 -7.060322000869281e-01 -1.924588886956475e-01 -4.355372063951040e-02 3.700000000000000e-12 3.480000000000000e-12 1.570000000000000e-13 6.050000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.610000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.410000000000000e+02 6.801350580620289e-01 -7.060383752329706e-01 -1.924285300092317e-01 -4.355888350077100e-02 3.700000000000000e-12 3.480000000000000e-12 1.560000000000000e-13 6.050000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.610000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.420000000000000e+02 6.801369151651825e-01 -7.060445440378701e-01 -1.923981608769439e-01 -4.356404658792890e-02 3.700000000000000e-12 3.480000000000000e-12 1.570000000000000e-13 6.050000000000000e-13 3.810000000000000e-12 -1.860000000000000e-12 7.630000000000000e-13 7.910000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.430000000000000e+02 6.801387647563755e-01 -7.060507182148600e-01 -1.923677949636090e-01 -4.356920293958800e-02 3.700000000000000e-12 3.480000000000000e-12 1.570000000000000e-13 6.050000000000000e-13 3.810000000000000e-12 -1.860000000000000e-12 7.630000000000000e-13 7.910000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.440000000000000e+02 6.801406135260747e-01 -7.060568931226953e-01 -1.923374251072434e-01 -4.357435495124470e-02 3.700000000000000e-12 3.480000000000000e-12 1.560000000000000e-13 6.050000000000000e-13 3.810000000000000e-12 -1.860000000000000e-12 7.630000000000000e-13 7.910000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.450000000000000e+02 6.801424610737332e-01 -7.060630693323596e-01 -1.923070507392924e-01 -4.357950212529070e-02 3.700000000000000e-12 3.480000000000000e-12 1.580000000000000e-13 6.040000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.620000000000000e-13 7.910000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.460000000000000e+02 6.801443073457261e-01 -7.060692471347370e-01 -1.922766710300751e-01 -4.358464423831640e-02 3.700000000000000e-12 3.480000000000000e-12 1.570000000000000e-13 6.040000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.620000000000000e-13 7.910000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.470000000000000e+02 6.801461525871760e-01 -7.060754265624326e-01 -1.922462849855272e-01 -4.358978131172920e-02 3.700000000000000e-12 3.480000000000000e-12 1.580000000000000e-13 6.030000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.610000000000000e-13 7.910000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.480000000000000e+02 6.801479972114610e-01 -7.060816074762175e-01 -1.922158916139338e-01 -4.359491351177890e-02 3.700000000000000e-12 3.480000000000000e-12 1.580000000000000e-13 6.030000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.600000000000000e-13 7.910000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.490000000000000e+02 6.801498416365545e-01 -7.060877896807292e-01 -1.921854901090596e-01 -4.360004102168940e-02 3.700000000000000e-12 3.480000000000000e-12 1.580000000000000e-13 6.030000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.600000000000000e-13 7.910000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.500000000000000e+02 6.801516861526294e-01 -7.060939730226484e-01 -1.921550799812269e-01 -4.360516394000830e-02 3.700000000000000e-12 3.480000000000000e-12 1.580000000000000e-13 6.030000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.600000000000000e-13 7.920000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.510000000000000e+02 6.801535308504425e-01 -7.061001574578133e-01 -1.921246610761919e-01 -4.361028222892130e-02 3.700000000000000e-12 3.480000000000000e-12 1.580000000000000e-13 6.030000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.600000000000000e-13 7.920000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.520000000000000e+02 6.801554001039072e-01 -7.061063250660442e-01 -1.920942106598000e-01 -4.361540601906740e-02 3.700000000000000e-12 3.480000000000000e-12 1.590000000000000e-13 6.020000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.590000000000000e-13 7.920000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.530000000000000e+02 6.801572446539955e-01 -7.061125121322184e-01 -1.920637744903463e-01 -4.362051448039410e-02 3.700000000000000e-12 3.480000000000000e-12 1.590000000000000e-13 6.020000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.590000000000000e-13 7.920000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.540000000000000e+02 6.801590885724863e-01 -7.061187010483723e-01 -1.920333297755846e-01 -4.362561767248610e-02 3.700000000000000e-12 3.480000000000000e-12 1.590000000000000e-13 6.020000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.590000000000000e-13 7.920000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.550000000000000e+02 6.801609313471219e-01 -7.061248923784263e-01 -1.920028762938195e-01 -4.363071541324870e-02 3.700000000000000e-12 3.480000000000000e-12 1.630000000000000e-13 6.040000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.570000000000000e-13 7.930000000000000e-12 -2.400000000000000e-12 7.740000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>3.560000000000000e+02 6.801627724101943e-01 -7.061310868066147e-01 -1.919724135575382e-01 -4.363580760661090e-02 3.700000000000000e-12 3.480000000000000e-12 1.630000000000000e-13 6.040000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.570000000000000e-13 7.930000000000000e-12 -2.400000000000000e-12 7.740000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>3.570000000000000e+02 6.801646112014484e-01 -7.061372850557405e-01 -1.919419408921662e-01 -4.364089423738440e-02 3.700000000000000e-12 3.480000000000000e-12 1.640000000000000e-13 6.030000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.550000000000000e-13 7.930000000000000e-12 -2.400000000000000e-12 7.740000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>3.580000000000000e+02 6.801664472598314e-01 -7.061434877568908e-01 -1.919114575967263e-01 -4.364597534221030e-02 3.700000000000000e-12 3.480000000000000e-12 1.640000000000000e-13 6.030000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.550000000000000e-13 7.930000000000000e-12 -2.400000000000000e-12 7.740000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>3.590000000000000e+02 6.801682803280756e-01 -7.061496952973384e-01 -1.918809631407742e-01 -4.365105097467090e-02 3.700000000000000e-12 3.480000000000000e-12 1.640000000000000e-13 6.030000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.550000000000000e-13 7.930000000000000e-12 -2.400000000000000e-12 7.740000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>3.600000000000000e+02 6.801701104290790e-01 -7.061559077022543e-01 -1.918504573352982e-01 -4.365612117832780e-02 3.700000000000000e-12 3.480000000000000e-12 1.640000000000000e-13 6.030000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.550000000000000e-13 7.930000000000000e-12 -2.400000000000000e-12 7.740000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>3.610000000000000e+02 6.801719378710744e-01 -7.061621246060932e-01 -1.918199404230304e-01 -4.366118597359400e-02 3.700000000000000e-12 3.480000000000000e-12 1.640000000000000e-13 6.030000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.550000000000000e-13 7.930000000000000e-12 -2.400000000000000e-12 7.740000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>3.620000000000000e+02 6.801737691071448e-01 -7.061683409708717e-01 -1.917894074939692e-01 -4.366624785963960e-02 3.710000000000000e-12 3.490000000000000e-12 1.650000000000000e-13 5.980000000000000e-13 3.820000000000000e-12 -1.850000000000000e-12 7.510000000000000e-13 7.930000000000000e-12 -2.400000000000000e-12 7.750000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>3.630000000000000e+02 6.801755927532240e-01 -7.061745648166142e-01 -1.917588705339414e-01 -4.367130179434690e-02 3.710000000000000e-12 3.490000000000000e-12 1.650000000000000e-13 5.980000000000000e-13 3.820000000000000e-12 -1.850000000000000e-12 7.500000000000000e-13 7.930000000000000e-12 -2.400000000000000e-12 7.750000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>3.640000000000000e+02 6.801774151031481e-01 -7.061807911800915e-01 -1.917283249311070e-01 -4.367635024783870e-02 3.710000000000000e-12 3.490000000000000e-12 1.650000000000000e-13 5.980000000000000e-13 3.820000000000000e-12 -1.850000000000000e-12 7.500000000000000e-13 7.930000000000000e-12 -2.400000000000000e-12 7.750000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>3.650000000000000e+02 6.801792361594092e-01 -7.061870198433671e-01 -1.916977714849323e-01 -4.368139317898700e-02 3.710000000000000e-12 3.490000000000000e-12 1.640000000000000e-13 5.990000000000000e-13 3.820000000000000e-12 -1.850000000000000e-12 7.540000000000000e-13 7.940000000000000e-12 -2.420000000000000e-12 7.759999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>3.660000000000000e+02 6.801810555277493e-01 -7.061932510359407e-01 -1.916672107545939e-01 -4.368643054771070e-02 3.710000000000000e-12 3.490000000000000e-12 1.640000000000000e-13 5.990000000000000e-13 3.820000000000000e-12 -1.850000000000000e-12 7.530000000000000e-13 7.940000000000000e-12 -2.420000000000000e-12 7.759999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>3.670000000000000e+02 6.801828724913421e-01 -7.061994853641913e-01 -1.916366430558360e-01 -4.369146231322840e-02 3.710000000000000e-12 3.490000000000000e-12 1.650000000000000e-13 5.980000000000000e-13 3.820000000000000e-12 -1.850000000000000e-12 7.520000000000000e-13 7.940000000000000e-12 -2.420000000000000e-12 7.759999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>3.680000000000000e+02 6.801846862046709e-01 -7.062057236062526e-01 -1.916060685283139e-01 -4.369648843495330e-02 3.710000000000000e-12 3.490000000000000e-12 1.650000000000000e-13 5.980000000000000e-13 3.820000000000000e-12 -1.850000000000000e-12 7.520000000000000e-13 7.940000000000000e-12 -2.420000000000000e-12 7.759999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>3.690000000000000e+02 6.801864959373461e-01 -7.062119664532197e-01 -1.915754872232734e-01 -4.370150887459910e-02 3.710000000000000e-12 3.490000000000000e-12 1.650000000000000e-13 5.980000000000000e-13 3.820000000000000e-12 -1.850000000000000e-12 7.520000000000000e-13 7.940000000000000e-12 -2.420000000000000e-12 7.759999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>3.700000000000000e+02 6.801883012909300e-01 -7.062182142840798e-01 -1.915448991616742e-01 -4.370652360356150e-02 3.710000000000000e-12 3.490000000000000e-12 1.660000000000000e-13 5.970000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.510000000000000e-13 7.950000000000001e-12 -2.420000000000000e-12 7.759999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>3.710000000000000e+02 6.801901023146560e-01 -7.062244670488351e-01 -1.915143043496762e-01 -4.371153262270760e-02 3.710000000000000e-12 3.490000000000000e-12 1.660000000000000e-13 5.970000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.510000000000000e-13 7.950000000000001e-12 -2.420000000000000e-12 7.759999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>3.720000000000000e+02 6.801919285068792e-01 -7.062307029180814e-01 -1.914836757033568e-01 -4.371654822898150e-02 3.710000000000000e-12 3.490000000000000e-12 1.660000000000000e-13 5.970000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.500000000000000e-13 7.950000000000001e-12 -2.420000000000000e-12 7.759999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>3.730000000000000e+02 6.801937226254594e-01 -7.062369638605401e-01 -1.914530673190127e-01 -4.372154608550890e-02 3.710000000000000e-12 3.490000000000000e-12 1.660000000000000e-13 5.970000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.500000000000000e-13 7.950000000000001e-12 -2.420000000000000e-12 7.759999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>3.740000000000000e+02 6.801955146018881e-01 -7.062432276131284e-01 -1.914224521275256e-01 -4.372653870990670e-02 3.710000000000000e-12 3.490000000000000e-12 1.650000000000000e-13 5.970000000000000e-13 3.810000000000000e-12 -1.840000000000000e-12 7.500000000000000e-13 7.950000000000001e-12 -2.420000000000000e-12 7.759999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>3.750000000000000e+02 6.801973053107719e-01 -7.062494932801145e-01 -1.913918302260797e-01 -4.373152652557850e-02 3.710000000000000e-12 3.490000000000000e-12 1.690000000000000e-13 6.000000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.520000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.760000000000000e+02 6.801990954756447e-01 -7.062557600607223e-01 -1.913612018674053e-01 -4.373651009200950e-02 3.710000000000000e-12 3.490000000000000e-12 1.690000000000000e-13 6.000000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.520000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.770000000000000e+02 6.802008856196530e-01 -7.062620273028956e-01 -1.913305674546980e-01 -4.374149002614150e-02 3.710000000000000e-12 3.490000000000000e-12 1.690000000000000e-13 6.000000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.510000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.780000000000000e+02 6.802026760627290e-01 -7.062682945362354e-01 -1.912999274617662e-01 -4.374646686422570e-02 3.720000000000000e-12 3.500000000000000e-12 1.710000000000000e-13 5.960000000000000e-13 3.820000000000000e-12 -1.850000000000000e-12 7.470000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.790000000000000e+02 6.802044669429620e-01 -7.062745614976668e-01 -1.912692822987938e-01 -4.375144090226060e-02 3.720000000000000e-12 3.500000000000000e-12 1.710000000000000e-13 5.960000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.470000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.800000000000000e+02 6.802062582397056e-01 -7.062808281513652e-01 -1.912386321853256e-01 -4.375641207007920e-02 3.720000000000000e-12 3.500000000000000e-12 1.710000000000000e-13 5.960000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.470000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.810000000000000e+02 6.802080497998825e-01 -7.062870946838381e-01 -1.912079770820723e-01 -4.376137989923880e-02 3.720000000000000e-12 3.500000000000000e-12 1.710000000000000e-13 5.960000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.470000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.820000000000000e+02 6.802098402435032e-01 -7.062933622898558e-01 -1.911773177679569e-01 -4.376634314456770e-02 3.720000000000000e-12 3.500000000000000e-12 1.720000000000000e-13 5.950000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.450000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.830000000000000e+02 6.802116314901038e-01 -7.062996297857557e-01 -1.911466517663737e-01 -4.377130188354560e-02 3.720000000000000e-12 3.500000000000000e-12 1.710000000000000e-13 5.950000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.450000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.840000000000000e+02 6.802134220469110e-01 -7.063058984866772e-01 -1.911159798039798e-01 -4.377625490746310e-02 3.720000000000000e-12 3.500000000000000e-12 1.710000000000000e-13 5.950000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.450000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.850000000000000e+02 6.802152115236040e-01 -7.063121688228459e-01 -1.910853017684443e-01 -4.378120181914800e-02 3.720000000000000e-12 3.500000000000000e-12 1.710000000000000e-13 5.950000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.450000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.860000000000000e+02 6.802169995375121e-01 -7.063184411126199e-01 -1.910546178355632e-01 -4.378614264958230e-02 3.720000000000000e-12 3.500000000000000e-12 1.710000000000000e-13 5.950000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.450000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.870000000000000e+02 6.802187857635544e-01 -7.063247155260187e-01 -1.910239284347045e-01 -4.379107782205750e-02 3.720000000000000e-12 3.500000000000000e-12 1.710000000000000e-13 5.950000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.450000000000000e-13 7.980000000000000e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.880000000000000e+02 6.802205700179722e-01 -7.063309920503870e-01 -1.909932341104011e-01 -4.379600800975710e-02 3.720000000000000e-12 3.500000000000000e-12 1.710000000000000e-13 5.950000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.450000000000000e-13 7.980000000000000e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.890000000000000e+02 6.802223523626676e-01 -7.063372704514413e-01 -1.909625353388405e-01 -4.380093394402210e-02 3.720000000000000e-12 3.500000000000000e-12 1.710000000000000e-13 5.950000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.450000000000000e-13 7.980000000000000e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.900000000000000e+02 6.802241331925430e-01 -7.063435502433074e-01 -1.909318323677224e-01 -4.380585623906630e-02 3.720000000000000e-12 3.500000000000000e-12 1.730000000000000e-13 5.990000000000000e-13 3.820000000000000e-12 -1.850000000000000e-12 7.470000000000000e-13 8.000000000000000e-12 -2.420000000000000e-12 7.800000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.910000000000000e+02 6.802259132479141e-01 -7.063498307049770e-01 -1.909011251377613e-01 -4.381077527536250e-02 3.720000000000000e-12 3.500000000000000e-12 1.730000000000000e-13 5.990000000000000e-13 3.820000000000000e-12 -1.850000000000000e-12 7.470000000000000e-13 8.000000000000000e-12 -2.420000000000000e-12 7.800000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.920000000000000e+02 6.802277300521115e-01 -7.063560840505319e-01 -1.908703791748643e-01 -4.381570661980990e-02 3.720000000000000e-12 3.500000000000000e-12 1.740000000000000e-13 5.980000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.460000000000000e-13 8.000000000000000e-12 -2.420000000000000e-12 7.810000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.930000000000000e+02 6.802295115937508e-01 -7.063623632619583e-01 -1.908396621669644e-01 -4.382061920954230e-02 3.720000000000000e-12 3.500000000000000e-12 1.740000000000000e-13 5.980000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.460000000000000e-13 8.000000000000000e-12 -2.420000000000000e-12 7.810000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.940000000000000e+02 6.802312952915669e-01 -7.063686407597149e-01 -1.908089393521965e-01 -4.382552818300820e-02 3.720000000000000e-12 3.500000000000000e-12 1.740000000000000e-13 5.980000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.450000000000000e-13 8.000000000000000e-12 -2.420000000000000e-12 7.800000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.950000000000000e+02 6.802330816816051e-01 -7.063749162250748e-01 -1.907782100979862e-01 -4.383043310046160e-02 3.720000000000000e-12 3.500000000000000e-12 1.740000000000000e-13 5.980000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.450000000000000e-13 8.000000000000000e-12 -2.420000000000000e-12 7.800000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.960000000000000e+02 6.802348708755319e-01 -7.063811897329385e-01 -1.907474738372137e-01 -4.383533347823560e-02 3.720000000000000e-12 3.500000000000000e-12 1.740000000000000e-13 5.980000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.450000000000000e-13 8.000000000000000e-12 -2.420000000000000e-12 7.800000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.970000000000000e+02 6.802366626172719e-01 -7.063874616847539e-01 -1.907167300998881e-01 -4.384022885310550e-02 3.730000000000000e-12 3.510000000000000e-12 1.740000000000000e-13 5.950000000000000e-13 3.830000000000000e-12 -1.840000000000000e-12 7.420000000000000e-13 8.000000000000000e-12 -2.420000000000000e-12 7.810000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.980000000000000e+02 6.802384564385460e-01 -7.063937326485615e-01 -1.906859785353562e-01 -4.384511884977200e-02 3.730000000000000e-12 3.510000000000000e-12 1.740000000000000e-13 5.950000000000000e-13 3.830000000000000e-12 -1.840000000000000e-12 7.420000000000000e-13 8.000000000000000e-12 -2.420000000000000e-12 7.810000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.990000000000000e+02 6.802402518470395e-01 -7.064000031677929e-01 -1.906552189334111e-01 -4.385000325053290e-02 3.730000000000000e-12 3.510000000000000e-12 1.740000000000000e-13 5.950000000000000e-13 3.830000000000000e-12 -1.840000000000000e-12 7.420000000000000e-13 8.000000000000000e-12 -2.420000000000000e-12 7.810000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.000000000000000e+02 6.802420484814161e-01 -7.064062736029311e-01 -1.906244512462664e-01 -4.385488204621590e-02 3.730000000000000e-12 3.510000000000000e-12 1.730000000000000e-13 5.960000000000000e-13 3.830000000000000e-12 -1.850000000000000e-12 7.450000000000000e-13 8.020000000000000e-12 -2.430000000000000e-12 7.820000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.010000000000000e+02 6.802438461925319e-01 -7.064125440497465e-01 -1.905936755979732e-01 -4.385975545315480e-02 3.730000000000000e-12 3.510000000000000e-12 1.730000000000000e-13 5.960000000000000e-13 3.830000000000000e-12 -1.850000000000000e-12 7.450000000000000e-13 8.020000000000000e-12 -2.430000000000000e-12 7.820000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.020000000000000e+02 6.802456458038937e-01 -7.064188137855374e-01 -1.905628915571316e-01 -4.386462419835680e-02 3.730000000000000e-12 3.510000000000000e-12 1.730000000000000e-13 5.960000000000000e-13 3.830000000000000e-12 -1.850000000000000e-12 7.450000000000000e-13 8.020000000000000e-12 -2.430000000000000e-12 7.820000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.030000000000000e+02 6.802474460071875e-01 -7.064250835867260e-01 -1.905321009419303e-01 -4.386948815338650e-02 3.730000000000000e-12 3.510000000000000e-12 1.730000000000000e-13 5.960000000000000e-13 3.830000000000000e-12 -1.840000000000000e-12 7.440000000000000e-13 8.020000000000000e-12 -2.430000000000000e-12 7.820000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.040000000000000e+02 6.802492478494531e-01 -7.064313524611116e-01 -1.905013034914019e-01 -4.387434818085840e-02 3.730000000000000e-12 3.510000000000000e-12 1.730000000000000e-13 5.960000000000000e-13 3.830000000000000e-12 -1.840000000000000e-12 7.440000000000000e-13 8.020000000000000e-12 -2.430000000000000e-12 7.820000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.050000000000000e+02 6.802510516157936e-01 -7.064376199848340e-01 -1.904704996464725e-01 -4.387920475798640e-02 3.740000000000000e-12 3.510000000000000e-12 1.760000000000000e-13 5.990000000000000e-13 3.830000000000000e-12 -1.850000000000000e-12 7.430000000000000e-13 8.030000000000000e-12 -2.420000000000000e-12 7.830000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.060000000000000e+02 6.802528575401868e-01 -7.064438858073744e-01 -1.904396897833301e-01 -4.388405825600820e-02 3.740000000000000e-12 3.510000000000000e-12 1.760000000000000e-13 5.990000000000000e-13 3.830000000000000e-12 -1.850000000000000e-12 7.430000000000000e-13 8.030000000000000e-12 -2.420000000000000e-12 7.830000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.070000000000000e+02 6.802546657741058e-01 -7.064501496950181e-01 -1.904088741663710e-01 -4.388890893086110e-02 3.750000000000000e-12 3.520000000000000e-12 1.760000000000000e-13 5.960000000000000e-13 3.840000000000000e-12 -1.840000000000000e-12 7.400000000000000e-13 8.030000000000000e-12 -2.420000000000000e-12 7.830000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.080000000000000e+02 6.802564763724911e-01 -7.064564115528399e-01 -1.903780529140825e-01 -4.389375693432620e-02 3.750000000000000e-12 3.520000000000000e-12 1.760000000000000e-13 5.960000000000000e-13 3.840000000000000e-12 -1.840000000000000e-12 7.400000000000000e-13 8.030000000000000e-12 -2.420000000000000e-12 7.830000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.090000000000000e+02 6.802582892833321e-01 -7.064626714398087e-01 -1.903472259760865e-01 -4.389860233141870e-02 3.750000000000000e-12 3.520000000000000e-12 1.760000000000000e-13 5.960000000000000e-13 3.840000000000000e-12 -1.840000000000000e-12 7.400000000000000e-13 8.030000000000000e-12 -2.420000000000000e-12 7.830000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.100000000000000e+02 6.802601043407317e-01 -7.064689295760400e-01 -1.903163931272641e-01 -4.390344511595710e-02 3.750000000000000e-12 3.520000000000000e-12 1.750000000000000e-13 5.970000000000000e-13 3.840000000000000e-12 -1.850000000000000e-12 7.430000000000000e-13 8.040000000000000e-12 -2.430000000000000e-12 7.840000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>4.110000000000000e+02 6.802619212649104e-01 -7.064751863358286e-01 -1.902855539902404e-01 -4.390828522450710e-02 3.750000000000000e-12 3.520000000000000e-12 1.750000000000000e-13 5.970000000000000e-13 3.840000000000000e-12 -1.850000000000000e-12 7.430000000000000e-13 8.040000000000000e-12 -2.430000000000000e-12 7.840000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>4.120000000000000e+02 6.802637721074779e-01 -7.064814183017823e-01 -1.902546777612606e-01 -4.391313633033190e-02 3.750000000000000e-12 3.520000000000000e-12 1.750000000000000e-13 5.970000000000000e-13 3.840000000000000e-12 -1.850000000000000e-12 7.430000000000000e-13 8.040000000000000e-12 -2.430000000000000e-12 7.840000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>4.130000000000000e+02 6.802655915507858e-01 -7.064876738714381e-01 -1.902238246395407e-01 -4.391797080113560e-02 3.750000000000000e-12 3.520000000000000e-12 1.750000000000000e-13 5.970000000000000e-13 3.840000000000000e-12 -1.850000000000000e-12 7.430000000000000e-13 8.040000000000000e-12 -2.430000000000000e-12 7.840000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>4.140000000000000e+02 6.802674115316771e-01 -7.064939296988663e-01 -1.901929639553983e-01 -4.392280237536900e-02 3.750000000000000e-12 3.520000000000000e-12 1.750000000000000e-13 5.970000000000000e-13 3.840000000000000e-12 -1.850000000000000e-12 7.420000000000000e-13 8.040000000000000e-12 -2.430000000000000e-12 7.840000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>4.150000000000000e+02 6.802692315605059e-01 -7.065001862801269e-01 -1.901620955966321e-01 -4.392763112805400e-02 3.750000000000000e-12 3.520000000000000e-12 1.780000000000000e-13 6.000000000000000e-13 3.840000000000000e-12 -1.850000000000000e-12 7.420000000000000e-13 8.060000000000001e-12 -2.420000000000000e-12 7.850000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>4.160000000000000e+02 6.802710512089848e-01 -7.065064439727169e-01 -1.901312197150202e-01 -4.393245726940230e-02 3.750000000000000e-12 3.520000000000000e-12 1.780000000000000e-13 6.000000000000000e-13 3.840000000000000e-12 -1.850000000000000e-12 7.420000000000000e-13 8.060000000000001e-12 -2.420000000000000e-12 7.850000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>4.170000000000000e+02 6.802728701677373e-01 -7.065127029536329e-01 -1.901003366799004e-01 -4.393728112991470e-02 3.760000000000000e-12 3.540000000000000e-12 1.780000000000000e-13 5.980000000000000e-13 3.860000000000000e-12 -1.850000000000000e-12 7.410000000000000e-13 8.069999999999999e-12 -2.430000000000000e-12 7.859999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.180000000000000e+02 6.802746882974433e-01 -7.065189632039591e-01 -1.900694469660521e-01 -4.394210310213120e-02 3.760000000000000e-12 3.540000000000000e-12 1.780000000000000e-13 5.980000000000000e-13 3.860000000000000e-12 -1.850000000000000e-12 7.410000000000000e-13 8.069999999999999e-12 -2.430000000000000e-12 7.859999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.190000000000000e+02 6.802765056648097e-01 -7.065252245174817e-01 -1.900385510136808e-01 -4.394692355124710e-02 3.760000000000000e-12 3.540000000000000e-12 1.770000000000000e-13 5.980000000000000e-13 3.860000000000000e-12 -1.850000000000000e-12 7.410000000000000e-13 8.069999999999999e-12 -2.430000000000000e-12 7.859999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.200000000000000e+02 6.802783225387664e-01 -7.065314865404763e-01 -1.900076491151806e-01 -4.395174272391700e-02 3.760000000000000e-12 3.540000000000000e-12 1.780000000000000e-13 5.980000000000000e-13 3.860000000000000e-12 -1.850000000000000e-12 7.410000000000000e-13 8.069999999999999e-12 -2.430000000000000e-12 7.859999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.210000000000000e+02 6.802801393378579e-01 -7.065377488374247e-01 -1.899767413728930e-01 -4.395656068831830e-02 3.760000000000000e-12 3.540000000000000e-12 1.770000000000000e-13 5.980000000000000e-13 3.860000000000000e-12 -1.850000000000000e-12 7.410000000000000e-13 8.069999999999999e-12 -2.430000000000000e-12 7.859999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.220000000000000e+02 6.802819525251127e-01 -7.065440139322317e-01 -1.899458314848123e-01 -4.396137562331650e-02 3.760000000000000e-12 3.540000000000000e-12 1.770000000000000e-13 5.980000000000000e-13 3.860000000000000e-12 -1.850000000000000e-12 7.410000000000000e-13 8.069999999999999e-12 -2.430000000000000e-12 7.859999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.230000000000000e+02 6.802837704595793e-01 -7.065502756113528e-01 -1.899149118966115e-01 -4.396619067104030e-02 3.760000000000000e-12 3.540000000000000e-12 1.770000000000000e-13 5.980000000000000e-13 3.860000000000000e-12 -1.850000000000000e-12 7.410000000000000e-13 8.069999999999999e-12 -2.430000000000000e-12 7.859999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.240000000000000e+02 6.802855892643807e-01 -7.065565367099876e-01 -1.898839864069531e-01 -4.397100382987110e-02 3.760000000000000e-12 3.540000000000000e-12 1.770000000000000e-13 5.980000000000000e-13 3.860000000000000e-12 -1.850000000000000e-12 7.400000000000000e-13 8.069999999999999e-12 -2.430000000000000e-12 7.859999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.250000000000000e+02 6.802874087251581e-01 -7.065627973659192e-01 -1.898530553261513e-01 -4.397581485068910e-02 3.770000000000000e-12 3.550000000000000e-12 1.810000000000000e-13 5.970000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.390000000000000e-13 8.100000000000000e-12 -2.430000000000000e-12 7.890000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.260000000000000e+02 6.802892282868032e-01 -7.065690579557221e-01 -1.898221192658409e-01 -4.398062361920790e-02 3.770000000000000e-12 3.550000000000000e-12 1.810000000000000e-13 5.970000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.380000000000000e-13 8.100000000000000e-12 -2.430000000000000e-12 7.890000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.270000000000000e+02 6.802910471598365e-01 -7.065753190113121e-01 -1.897911790571878e-01 -4.398543020499480e-02 3.770000000000000e-12 3.550000000000000e-12 1.810000000000000e-13 5.970000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.380000000000000e-13 8.100000000000000e-12 -2.430000000000000e-12 7.890000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.280000000000000e+02 6.802928645164167e-01 -7.065815810870441e-01 -1.897602355410413e-01 -4.399023487081920e-02 3.770000000000000e-12 3.550000000000000e-12 1.810000000000000e-13 5.970000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.380000000000000e-13 8.100000000000000e-12 -2.430000000000000e-12 7.890000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.290000000000000e+02 6.802946797156906e-01 -7.065878446162231e-01 -1.897292892971905e-01 -4.399503806009420e-02 3.770000000000000e-12 3.550000000000000e-12 1.810000000000000e-13 5.980000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.380000000000000e-13 8.100000000000000e-12 -2.430000000000000e-12 7.890000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.300000000000000e+02 6.802964924828465e-01 -7.065941098048144e-01 -1.896983404063894e-01 -4.399984036039130e-02 3.770000000000000e-12 3.550000000000000e-12 1.800000000000000e-13 5.980000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.410000000000000e-13 8.110000000000000e-12 -2.450000000000000e-12 7.900000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.310000000000000e+02 6.802983029757570e-01 -7.066003765969556e-01 -1.896673883543656e-01 -4.400464243895090e-02 3.770000000000000e-12 3.550000000000000e-12 1.800000000000000e-13 5.980000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.410000000000000e-13 8.110000000000000e-12 -2.450000000000000e-12 7.900000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.320000000000000e+02 6.803001533380484e-01 -7.066066140030287e-01 -1.896363931612669e-01 -4.400946266643310e-02 3.780000000000000e-12 3.550000000000000e-12 1.840000000000000e-13 6.000000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.390000000000000e-13 8.120000000000000e-12 -2.440000000000000e-12 7.910000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.330000000000000e+02 6.803019611034552e-01 -7.066128830087639e-01 -1.896054315308723e-01 -4.401426608303030e-02 3.780000000000000e-12 3.550000000000000e-12 1.840000000000000e-13 6.010000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.390000000000000e-13 8.120000000000000e-12 -2.440000000000000e-12 7.910000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.340000000000000e+02 6.803037686768679e-01 -7.066191524283109e-01 -1.895744633869473e-01 -4.401907060692340e-02 3.780000000000000e-12 3.550000000000000e-12 1.840000000000000e-13 6.010000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.390000000000000e-13 8.120000000000000e-12 -2.440000000000000e-12 7.910000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.350000000000000e+02 6.803055767518681e-01 -7.066254217928893e-01 -1.895434880307972e-01 -4.402387603844530e-02 3.780000000000000e-12 3.550000000000000e-12 1.840000000000000e-13 6.010000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.390000000000000e-13 8.130000000000000e-12 -2.440000000000000e-12 7.910000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.360000000000000e+02 6.803073858539772e-01 -7.066316906779148e-01 -1.895125052941892e-01 -4.402868178039780e-02 3.780000000000000e-12 3.550000000000000e-12 1.840000000000000e-13 6.010000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.390000000000000e-13 8.130000000000000e-12 -2.440000000000000e-12 7.910000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.370000000000000e+02 6.803091963301170e-01 -7.066379587255932e-01 -1.894815154687763e-01 -4.403348694406500e-02 3.790000000000000e-12 3.560000000000000e-12 1.840000000000000e-13 5.980000000000000e-13 3.880000000000000e-12 -1.850000000000000e-12 7.390000000000000e-13 8.140000000000000e-12 -2.450000000000000e-12 7.920000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.380000000000000e+02 6.803110083621803e-01 -7.066442256763065e-01 -1.894505190952507e-01 -4.403829054478440e-02 3.790000000000000e-12 3.560000000000000e-12 1.840000000000000e-13 5.980000000000000e-13 3.880000000000000e-12 -1.850000000000000e-12 7.380000000000000e-13 8.140000000000000e-12 -2.450000000000000e-12 7.920000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.390000000000000e+02 6.803128219705727e-01 -7.066504914192853e-01 -1.894195167105630e-01 -4.404309172225810e-02 3.790000000000000e-12 3.560000000000000e-12 1.840000000000000e-13 5.980000000000000e-13 3.880000000000000e-12 -1.850000000000000e-12 7.380000000000000e-13 8.140000000000000e-12 -2.450000000000000e-12 7.920000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.400000000000000e+02 6.803146370035202e-01 -7.066567560436259e-01 -1.893885086538902e-01 -4.404788992134960e-02 3.790000000000000e-12 3.560000000000000e-12 1.840000000000000e-13 5.980000000000000e-13 3.880000000000000e-12 -1.850000000000000e-12 7.380000000000000e-13 8.140000000000000e-12 -2.450000000000000e-12 7.920000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.410000000000000e+02 6.803164531387218e-01 -7.066630198532664e-01 -1.893574949844595e-01 -4.405268497857830e-02 3.790000000000000e-12 3.560000000000000e-12 1.830000000000000e-13 5.980000000000000e-13 3.880000000000000e-12 -1.850000000000000e-12 7.380000000000000e-13 8.140000000000000e-12 -2.450000000000000e-12 7.920000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.420000000000000e+02 6.803182664650349e-01 -7.066692858714224e-01 -1.893264787655951e-01 -4.405747562224080e-02 3.790000000000000e-12 3.560000000000000e-12 1.840000000000000e-13 5.970000000000000e-13 3.880000000000000e-12 -1.850000000000000e-12 7.370000000000000e-13 8.140000000000000e-12 -2.450000000000000e-12 7.920000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.430000000000000e+02 6.803200833919300e-01 -7.066755495237650e-01 -1.892954532433296e-01 -4.406226526501960e-02 3.790000000000000e-12 3.560000000000000e-12 1.840000000000000e-13 5.970000000000000e-13 3.880000000000000e-12 -1.850000000000000e-12 7.370000000000000e-13 8.140000000000000e-12 -2.450000000000000e-12 7.920000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.440000000000000e+02 6.803219000057933e-01 -7.066818138184671e-01 -1.892644214571921e-01 -4.406705301269040e-02 3.790000000000000e-12 3.560000000000000e-12 1.840000000000000e-13 5.970000000000000e-13 3.880000000000000e-12 -1.850000000000000e-12 7.370000000000000e-13 8.140000000000000e-12 -2.450000000000000e-12 7.920000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.450000000000000e+02 6.803237159759746e-01 -7.066880790344341e-01 -1.892333834231832e-01 -4.407183941563450e-02 3.790000000000000e-12 3.560000000000000e-12 1.870000000000000e-13 6.010000000000000e-13 3.880000000000000e-12 -1.850000000000000e-12 7.390000000000000e-13 8.169999999999999e-12 -2.450000000000000e-12 7.940000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.460000000000000e+02 6.803255311253283e-01 -7.066943452343719e-01 -1.892023394442672e-01 -4.407662488914970e-02 3.790000000000000e-12 3.560000000000000e-12 1.860000000000000e-13 6.010000000000000e-13 3.880000000000000e-12 -1.850000000000000e-12 7.390000000000000e-13 8.169999999999999e-12 -2.450000000000000e-12 7.940000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.470000000000000e+02 6.803273454047817e-01 -7.067006123017689e-01 -1.891712900767801e-01 -4.408140965843110e-02 3.800000000000000e-12 3.570000000000000e-12 1.880000000000000e-13 5.970000000000000e-13 3.890000000000000e-12 -1.850000000000000e-12 7.350000000000000e-13 8.169999999999999e-12 -2.450000000000000e-12 7.940000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.480000000000000e+02 6.803291588421839e-01 -7.067068800227996e-01 -1.891402360111027e-01 -4.408619374805630e-02 3.800000000000000e-12 3.570000000000000e-12 1.880000000000000e-13 5.970000000000000e-13 3.890000000000000e-12 -1.850000000000000e-12 7.340000000000000e-13 8.169999999999999e-12 -2.450000000000000e-12 7.940000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.490000000000000e+02 6.803309714939706e-01 -7.067131481749768e-01 -1.891091779080065e-01 -4.409097700937710e-02 3.800000000000000e-12 3.570000000000000e-12 1.880000000000000e-13 5.970000000000000e-13 3.890000000000000e-12 -1.850000000000000e-12 7.340000000000000e-13 8.169999999999999e-12 -2.450000000000000e-12 7.940000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.500000000000000e+02 6.803327834150843e-01 -7.067194165915641e-01 -1.890781162542221e-01 -4.409575917158480e-02 3.800000000000000e-12 3.570000000000000e-12 1.890000000000000e-13 5.960000000000000e-13 3.890000000000000e-12 -1.850000000000000e-12 7.330000000000000e-13 8.169999999999999e-12 -2.450000000000000e-12 7.940000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.510000000000000e+02 6.803345946534085e-01 -7.067256851867987e-01 -1.890470512746948e-01 -4.410053989890760e-02 3.800000000000000e-12 3.570000000000000e-12 1.890000000000000e-13 5.960000000000000e-13 3.890000000000000e-12 -1.850000000000000e-12 7.330000000000000e-13 8.169999999999999e-12 -2.450000000000000e-12 7.940000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.520000000000000e+02 6.803364394377216e-01 -7.067319287058482e-01 -1.890159508673926e-01 -4.410533344858510e-02 3.800000000000000e-12 3.570000000000000e-12 1.890000000000000e-13 5.950000000000000e-13 3.890000000000000e-12 -1.850000000000000e-12 7.350000000000000e-13 8.179999999999999e-12 -2.460000000000000e-12 7.959999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.530000000000000e+02 6.803382495328318e-01 -7.067381976175982e-01 -1.889848788136730e-01 -4.411011029925720e-02 3.800000000000000e-12 3.570000000000000e-12 1.890000000000000e-13 5.950000000000000e-13 3.890000000000000e-12 -1.850000000000000e-12 7.350000000000000e-13 8.179999999999999e-12 -2.460000000000000e-12 7.959999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.540000000000000e+02 6.803400592993639e-01 -7.067444666503566e-01 -1.889538025843840e-01 -4.411488479575560e-02 3.800000000000000e-12 3.570000000000000e-12 1.890000000000000e-13 5.950000000000000e-13 3.890000000000000e-12 -1.850000000000000e-12 7.350000000000000e-13 8.179999999999999e-12 -2.460000000000000e-12 7.959999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.550000000000000e+02 6.803418690541270e-01 -7.067507356732268e-01 -1.889227215701331e-01 -4.411965675097470e-02 3.800000000000000e-12 3.570000000000000e-12 1.920000000000000e-13 5.990000000000000e-13 3.890000000000000e-12 -1.850000000000000e-12 7.340000000000000e-13 8.190000000000000e-12 -2.450000000000000e-12 7.969999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.560000000000000e+02 6.803436792623270e-01 -7.067570044260013e-01 -1.888916350920696e-01 -4.412442605665890e-02 3.800000000000000e-12 3.570000000000000e-12 1.920000000000000e-13 5.990000000000000e-13 3.890000000000000e-12 -1.850000000000000e-12 7.340000000000000e-13 8.190000000000000e-12 -2.450000000000000e-12 7.969999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.570000000000000e+02 6.803454905143478e-01 -7.067632725234611e-01 -1.888605424693584e-01 -4.412919268352170e-02 3.810000000000000e-12 3.580000000000000e-12 1.940000000000000e-13 5.940000000000000e-13 3.900000000000000e-12 -1.850000000000000e-12 7.290000000000000e-13 8.190000000000000e-12 -2.450000000000000e-12 7.969999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.580000000000000e+02 6.803473034519605e-01 -7.067695395029227e-01 -1.888294431080919e-01 -4.413395667692460e-02 3.810000000000000e-12 3.580000000000000e-12 1.940000000000000e-13 5.940000000000000e-13 3.900000000000000e-12 -1.850000000000000e-12 7.290000000000000e-13 8.190000000000000e-12 -2.450000000000000e-12 7.969999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.590000000000000e+02 6.803491186622448e-01 -7.067758048968200e-01 -1.887983366158546e-01 -4.413871814003550e-02 3.810000000000000e-12 3.580000000000000e-12 1.940000000000000e-13 5.940000000000000e-13 3.900000000000000e-12 -1.850000000000000e-12 7.290000000000000e-13 8.190000000000000e-12 -2.450000000000000e-12 7.969999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.600000000000000e+02 6.803509365731008e-01 -7.067820683077765e-01 -1.887672229035642e-01 -4.414347720742450e-02 3.810000000000000e-12 3.580000000000000e-12 1.940000000000000e-13 5.940000000000000e-13 3.900000000000000e-12 -1.850000000000000e-12 7.310000000000000e-13 8.210000000000000e-12 -2.460000000000000e-12 7.980000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.610000000000000e+02 6.803527573764295e-01 -7.067883294700855e-01 -1.887361022380261e-01 -4.414823402099550e-02 3.810000000000000e-12 3.580000000000000e-12 1.940000000000000e-13 5.940000000000000e-13 3.900000000000000e-12 -1.850000000000000e-12 7.310000000000000e-13 8.210000000000000e-12 -2.460000000000000e-12 7.980000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.620000000000000e+02 6.803545708357642e-01 -7.067945957983303e-01 -1.887049847384032e-01 -4.415298436161800e-02 3.810000000000000e-12 3.580000000000000e-12 1.950000000000000e-13 5.930000000000000e-13 3.900000000000000e-12 -1.850000000000000e-12 7.300000000000000e-13 8.210000000000000e-12 -2.460000000000000e-12 7.980000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.630000000000000e+02 6.803563969492094e-01 -7.068008523799267e-01 -1.886738520916976e-01 -4.415773705908380e-02 3.810000000000000e-12 3.580000000000000e-12 1.950000000000000e-13 5.930000000000000e-13 3.900000000000000e-12 -1.850000000000000e-12 7.300000000000000e-13 8.210000000000000e-12 -2.460000000000000e-12 7.980000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.640000000000000e+02 6.803582249837111e-01 -7.068071070564178e-01 -1.886427146044410e-01 -4.416248790794260e-02 3.810000000000000e-12 3.580000000000000e-12 1.950000000000000e-13 5.930000000000000e-13 3.900000000000000e-12 -1.850000000000000e-12 7.300000000000000e-13 8.210000000000000e-12 -2.460000000000000e-12 7.980000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.650000000000000e+02 6.803600541606709e-01 -7.068133604016299e-01 -1.886115728910247e-01 -4.416723708608340e-02 3.810000000000000e-12 3.580000000000000e-12 1.990000000000000e-13 5.950000000000000e-13 3.900000000000000e-12 -1.850000000000000e-12 7.280000000000000e-13 8.220000000000000e-12 -2.450000000000000e-12 7.990000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.660000000000000e+02 6.803618835539779e-01 -7.068196131942610e-01 -1.885804273235806e-01 -4.417198480093930e-02 3.810000000000000e-12 3.580000000000000e-12 1.990000000000000e-13 5.950000000000000e-13 3.890000000000000e-12 -1.850000000000000e-12 7.270000000000000e-13 8.220000000000000e-12 -2.450000000000000e-12 7.990000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.670000000000000e+02 6.803637122207733e-01 -7.068258662962895e-01 -1.885492780265805e-01 -4.417673124308570e-02 3.830000000000000e-12 3.590000000000000e-12 2.000000000000000e-13 5.910000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.260000000000000e-13 8.230000000000000e-12 -2.460000000000000e-12 8.010000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.680000000000000e+02 6.803655394111383e-01 -7.068321204408440e-01 -1.885181249350094e-01 -4.418147650180370e-02 3.830000000000000e-12 3.590000000000000e-12 2.000000000000000e-13 5.910000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.260000000000000e-13 8.230000000000000e-12 -2.460000000000000e-12 8.010000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.690000000000000e+02 6.803673648158205e-01 -7.068383759788941e-01 -1.884869678739297e-01 -4.418622046281020e-02 3.830000000000000e-12 3.590000000000000e-12 2.000000000000000e-13 5.910000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.260000000000000e-13 8.240000000000000e-12 -2.460000000000000e-12 8.010000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.700000000000000e+02 6.803691887579600e-01 -7.068446326807400e-01 -1.884558066296656e-01 -4.419096272799490e-02 3.830000000000000e-12 3.590000000000000e-12 2.010000000000000e-13 5.900000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.250000000000000e-13 8.240000000000000e-12 -2.470000000000000e-12 8.010000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.710000000000000e+02 6.803710122222661e-01 -7.068508896981386e-01 -1.884246409905228e-01 -4.419570259868910e-02 3.830000000000000e-12 3.590000000000000e-12 2.010000000000000e-13 5.900000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.250000000000000e-13 8.240000000000000e-12 -2.470000000000000e-12 8.010000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.720000000000000e+02 6.803728686876107e-01 -7.068571220725769e-01 -1.883934406845775e-01 -4.420045289464950e-02 3.830000000000000e-12 3.590000000000000e-12 2.040000000000000e-13 5.930000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.260000000000000e-13 8.260000000000001e-12 -2.470000000000000e-12 8.030000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.730000000000000e+02 6.803746956145477e-01 -7.068633757872791e-01 -1.883622656994435e-01 -4.420518520033690e-02 3.830000000000000e-12 3.590000000000000e-12 2.040000000000000e-13 5.930000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.260000000000000e-13 8.260000000000001e-12 -2.470000000000000e-12 8.030000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.740000000000000e+02 6.803765261844503e-01 -7.068696261476821e-01 -1.883310858131882e-01 -4.420991250208020e-02 3.830000000000000e-12 3.590000000000000e-12 2.040000000000000e-13 5.930000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.260000000000000e-13 8.260000000000001e-12 -2.470000000000000e-12 8.030000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.750000000000000e+02 6.803783608264738e-01 -7.068758727928139e-01 -1.882999009065380e-01 -4.421463446717630e-02 3.840000000000000e-12 3.600000000000000e-12 2.070000000000000e-13 5.870000000000000e-13 3.920000000000000e-12 -1.850000000000000e-12 7.200000000000000e-13 8.260000000000001e-12 -2.470000000000000e-12 8.030000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.760000000000000e+02 6.803801991461443e-01 -7.068821161140445e-01 -1.882687108892860e-01 -4.421935128504470e-02 3.840000000000000e-12 3.600000000000000e-12 2.080000000000000e-13 5.860000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.190000000000000e-13 8.260000000000001e-12 -2.470000000000000e-12 8.030000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.770000000000000e+02 6.803820401074957e-01 -7.068883570808240e-01 -1.882375157116770e-01 -4.422406360152890e-02 3.840000000000000e-12 3.600000000000000e-12 2.080000000000000e-13 5.860000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.190000000000000e-13 8.260000000000001e-12 -2.470000000000000e-12 8.030000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.780000000000000e+02 6.803838824298796e-01 -7.068945968701824e-01 -1.882063153735754e-01 -4.422877229686940e-02 3.840000000000000e-12 3.600000000000000e-12 2.120000000000000e-13 5.890000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.200000000000000e-13 8.290000000000000e-12 -2.470000000000000e-12 8.060000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>4.790000000000000e+02 6.803857250455710e-01 -7.069008364431604e-01 -1.881751099313517e-01 -4.423347818673940e-02 3.840000000000000e-12 3.600000000000000e-12 2.120000000000000e-13 5.890000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.200000000000000e-13 8.290000000000000e-12 -2.470000000000000e-12 8.060000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>4.800000000000000e+02 6.803875674548957e-01 -7.069070762198838e-01 -1.881438994973934e-01 -4.423818175490420e-02 3.840000000000000e-12 3.600000000000000e-12 2.130000000000000e-13 5.880000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.190000000000000e-13 8.290000000000000e-12 -2.470000000000000e-12 8.060000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>4.810000000000000e+02 6.803894098561737e-01 -7.069133159634268e-01 -1.881126842355853e-01 -4.424288303041550e-02 3.840000000000000e-12 3.600000000000000e-12 2.140000000000000e-13 5.870000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.180000000000000e-13 8.290000000000000e-12 -2.470000000000000e-12 8.060000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>4.820000000000000e+02 6.803912639514307e-01 -7.069195468184943e-01 -1.880814540762603e-01 -4.424758634173140e-02 3.850000000000000e-12 3.610000000000000e-12 2.140000000000000e-13 5.840000000000000e-13 3.930000000000000e-12 -1.850000000000000e-12 7.170000000000000e-13 8.300000000000000e-12 -2.480000000000000e-12 8.069999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.830000000000000e+02 6.803931088853072e-01 -7.069257839480435e-01 -1.880502298073997e-01 -4.425228175150710e-02 3.850000000000000e-12 3.610000000000000e-12 2.140000000000000e-13 5.840000000000000e-13 3.930000000000000e-12 -1.850000000000000e-12 7.170000000000000e-13 8.300000000000000e-12 -2.480000000000000e-12 8.069999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.840000000000000e+02 6.803949564346709e-01 -7.069320184084023e-01 -1.880190014450611e-01 -4.425697349443240e-02 3.850000000000000e-12 3.610000000000000e-12 2.150000000000000e-13 5.830000000000000e-13 3.920000000000000e-12 -1.850000000000000e-12 7.160000000000000e-13 8.300000000000000e-12 -2.480000000000000e-12 8.069999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.850000000000000e+02 6.803968069423726e-01 -7.069382497896975e-01 -1.879877693261727e-01 -4.426166140886420e-02 3.850000000000000e-12 3.610000000000000e-12 2.160000000000000e-13 5.820000000000000e-13 3.920000000000000e-12 -1.850000000000000e-12 7.150000000000000e-13 8.300000000000000e-12 -2.480000000000000e-12 8.069999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.860000000000000e+02 6.803986601013317e-01 -7.069444782772060e-01 -1.879565338110631e-01 -4.426634572011170e-02 3.850000000000000e-12 3.610000000000000e-12 2.160000000000000e-13 5.820000000000000e-13 3.920000000000000e-12 -1.840000000000000e-12 7.150000000000000e-13 8.300000000000000e-12 -2.480000000000000e-12 8.069999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.870000000000000e+02 6.804005150458041e-01 -7.069507045881674e-01 -1.879252952073051e-01 -4.427102696962610e-02 3.850000000000000e-12 3.610000000000000e-12 2.200000000000000e-13 5.840000000000000e-13 3.920000000000000e-12 -1.840000000000000e-12 7.130000000000000e-13 8.320000000000000e-12 -2.470000000000000e-12 8.080000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.880000000000000e+02 6.804023706504176e-01 -7.069569297294003e-01 -1.878940536421642e-01 -4.427570583048060e-02 3.850000000000000e-12 3.610000000000000e-12 2.200000000000000e-13 5.840000000000000e-13 3.920000000000000e-12 -1.840000000000000e-12 7.130000000000000e-13 8.320000000000000e-12 -2.470000000000000e-12 8.080000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.890000000000000e+02 6.804042259214623e-01 -7.069631546749781e-01 -1.878628089106905e-01 -4.428038288456980e-02 3.850000000000000e-12 3.610000000000000e-12 2.200000000000000e-13 5.840000000000000e-13 3.920000000000000e-12 -1.840000000000000e-12 7.120000000000000e-13 8.320000000000000e-12 -2.470000000000000e-12 8.080000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.900000000000000e+02 6.804060803357034e-01 -7.069693800786994e-01 -1.878315603707232e-01 -4.428505845139280e-02 3.850000000000000e-12 3.610000000000000e-12 2.210000000000000e-13 5.830000000000000e-13 3.920000000000000e-12 -1.840000000000000e-12 7.130000000000000e-13 8.330000000000000e-12 -2.480000000000000e-12 8.100000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.910000000000000e+02 6.804079340040512e-01 -7.069756061183868e-01 -1.878003069515258e-01 -4.428973252110370e-02 3.850000000000000e-12 3.610000000000000e-12 2.210000000000000e-13 5.830000000000000e-13 3.920000000000000e-12 -1.840000000000000e-12 7.130000000000000e-13 8.330000000000000e-12 -2.480000000000000e-12 8.100000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.920000000000000e+02 6.804098174966778e-01 -7.069818104037153e-01 -1.877690192113430e-01 -4.429441767122830e-02 3.860000000000000e-12 3.620000000000000e-12 2.230000000000000e-13 5.780000000000000e-13 3.930000000000000e-12 -1.840000000000000e-12 7.090000000000000e-13 8.330000000000000e-12 -2.480000000000000e-12 8.100000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.930000000000000e+02 6.804116720343808e-01 -7.069880365587891e-01 -1.877377520462600e-01 -4.429908778681280e-02 3.860000000000000e-12 3.620000000000000e-12 2.230000000000000e-13 5.780000000000000e-13 3.930000000000000e-12 -1.840000000000000e-12 7.090000000000000e-13 8.330000000000000e-12 -2.480000000000000e-12 8.100000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.940000000000000e+02 6.804135284959884e-01 -7.069942617995010e-01 -1.877064763980241e-01 -4.430375537644200e-02 3.860000000000000e-12 3.620000000000000e-12 2.230000000000000e-13 5.780000000000000e-13 3.930000000000000e-12 -1.840000000000000e-12 7.080000000000000e-13 8.330000000000000e-12 -2.480000000000000e-12 8.100000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.950000000000000e+02 6.804153875696328e-01 -7.070004855633120e-01 -1.876751919267832e-01 -4.430842027146590e-02 3.870000000000000e-12 3.620000000000000e-12 2.280000000000000e-13 5.800000000000000e-13 3.930000000000000e-12 -1.840000000000000e-12 7.090000000000000e-13 8.360000000000001e-12 -2.480000000000000e-12 8.120000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.960000000000000e+02 6.804172494894142e-01 -7.070067075283486e-01 -1.876438989760214e-01 -4.431308254072470e-02 3.870000000000000e-12 3.620000000000000e-12 2.280000000000000e-13 5.800000000000000e-13 3.930000000000000e-12 -1.840000000000000e-12 7.090000000000000e-13 8.360000000000001e-12 -2.480000000000000e-12 8.120000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.970000000000000e+02 6.804191140311587e-01 -7.070129276594594e-01 -1.876125984225085e-01 -4.431774245838540e-02 3.860000000000000e-12 3.620000000000000e-12 2.280000000000000e-13 5.790000000000000e-13 3.930000000000000e-12 -1.840000000000000e-12 7.070000000000000e-13 8.360000000000001e-12 -2.490000000000000e-12 8.120000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.980000000000000e+02 6.804209806186307e-01 -7.070191461952581e-01 -1.875812913617432e-01 -4.432240041299860e-02 3.860000000000000e-12 3.620000000000000e-12 2.280000000000000e-13 5.790000000000000e-13 3.930000000000000e-12 -1.840000000000000e-12 7.070000000000000e-13 8.360000000000001e-12 -2.490000000000000e-12 8.120000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.990000000000000e+02 6.804228484731202e-01 -7.070253636083783e-01 -1.875499787396011e-01 -4.432705680440600e-02 3.860000000000000e-12 3.620000000000000e-12 2.280000000000000e-13 5.790000000000000e-13 3.930000000000000e-12 -1.840000000000000e-12 7.070000000000000e-13 8.360000000000001e-12 -2.490000000000000e-12 8.120000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.000000000000000e+02 6.804247167509674e-01 -7.070315805567897e-01 -1.875186610578563e-01 -4.433171195433680e-02 3.880000000000000e-12 3.630000000000000e-12 2.300000000000000e-13 5.740000000000000e-13 3.940000000000000e-12 -1.840000000000000e-12 7.030000000000000e-13 8.360000000000001e-12 -2.490000000000000e-12 8.120000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.010000000000000e+02 6.804265846554490e-01 -7.070377978113996e-01 -1.874873382524493e-01 -4.433636605698650e-02 3.880000000000000e-12 3.630000000000000e-12 2.310000000000000e-13 5.730000000000000e-13 3.940000000000000e-12 -1.840000000000000e-12 7.020000000000000e-13 8.360000000000001e-12 -2.490000000000000e-12 8.120000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.020000000000000e+02 6.804284457956532e-01 -7.070440203922262e-01 -1.874560151564688e-01 -4.434101669297690e-02 3.880000000000000e-12 3.630000000000000e-12 2.330000000000000e-13 5.770000000000000e-13 3.940000000000000e-12 -1.840000000000000e-12 7.040000000000000e-13 8.379999999999999e-12 -2.490000000000000e-12 8.150000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.030000000000000e+02 6.804303111768971e-01 -7.070502404805854e-01 -1.874246801654535e-01 -4.434566870546690e-02 3.880000000000000e-12 3.630000000000000e-12 2.330000000000000e-13 5.770000000000000e-13 3.940000000000000e-12 -1.840000000000000e-12 7.040000000000000e-13 8.379999999999999e-12 -2.490000000000000e-12 8.150000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.040000000000000e+02 6.804321748860434e-01 -7.070564627194242e-01 -1.873933378655103e-01 -4.435031939194290e-02 3.880000000000000e-12 3.630000000000000e-12 2.340000000000000e-13 5.760000000000000e-13 3.940000000000000e-12 -1.840000000000000e-12 7.020000000000000e-13 8.379999999999999e-12 -2.490000000000000e-12 8.150000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.050000000000000e+02 6.804340370307466e-01 -7.070626871720161e-01 -1.873619877137878e-01 -4.435496836958380e-02 3.880000000000000e-12 3.630000000000000e-12 2.360000000000000e-13 5.750000000000000e-13 3.940000000000000e-12 -1.840000000000000e-12 7.010000000000000e-13 8.379999999999999e-12 -2.490000000000000e-12 8.150000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.060000000000000e+02 6.804358979687370e-01 -7.070689135627078e-01 -1.873306295686791e-01 -4.435961512606940e-02 3.880000000000000e-12 3.630000000000000e-12 2.370000000000000e-13 5.740000000000000e-13 3.940000000000000e-12 -1.840000000000000e-12 7.000000000000000e-13 8.379999999999999e-12 -2.490000000000000e-12 8.150000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.070000000000000e+02 6.804377582037535e-01 -7.070751413725604e-01 -1.872992636922413e-01 -4.436425908282890e-02 3.880000000000000e-12 3.630000000000000e-12 2.360000000000000e-13 5.740000000000000e-13 3.940000000000000e-12 -1.840000000000000e-12 7.030000000000000e-13 8.400000000000000e-12 -2.500000000000000e-12 8.160000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.080000000000000e+02 6.804396182491000e-01 -7.070813699927277e-01 -1.872678906381760e-01 -4.436889971764570e-02 3.880000000000000e-12 3.630000000000000e-12 2.350000000000000e-13 5.740000000000000e-13 3.940000000000000e-12 -1.840000000000000e-12 7.030000000000000e-13 8.400000000000000e-12 -2.500000000000000e-12 8.160000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.090000000000000e+02 6.804414784981926e-01 -7.070875988822702e-01 -1.872365110885500e-01 -4.437353672502190e-02 3.880000000000000e-12 3.630000000000000e-12 2.370000000000000e-13 5.730000000000000e-13 3.940000000000000e-12 -1.840000000000000e-12 7.020000000000000e-13 8.400000000000000e-12 -2.500000000000000e-12 8.160000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.100000000000000e+02 6.804433391438437e-01 -7.070938276792915e-01 -1.872051256936050e-01 -4.437817015905710e-02 3.890000000000000e-12 3.640000000000000e-12 2.390000000000000e-13 5.690000000000000e-13 3.950000000000000e-12 -1.840000000000000e-12 6.970000000000000e-13 8.400000000000000e-12 -2.500000000000000e-12 8.160000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.110000000000000e+02 6.804452001695896e-01 -7.071000562381442e-01 -1.871737349519128e-01 -4.438280047869550e-02 3.890000000000000e-12 3.640000000000000e-12 2.390000000000000e-13 5.690000000000000e-13 3.950000000000000e-12 -1.840000000000000e-12 6.970000000000000e-13 8.400000000000000e-12 -2.500000000000000e-12 8.160000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.120000000000000e+02 6.804471034366796e-01 -7.071062534855720e-01 -1.871422995800814e-01 -4.438744658244870e-02 3.890000000000000e-12 3.640000000000000e-12 2.420000000000000e-13 5.720000000000000e-13 3.950000000000000e-12 -1.840000000000000e-12 6.980000000000000e-13 8.420000000000000e-12 -2.500000000000000e-12 8.190000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.130000000000000e+02 6.804489647120614e-01 -7.071124817441781e-01 -1.871108987606872e-01 -4.439207304059260e-02 3.890000000000000e-12 3.640000000000000e-12 2.420000000000000e-13 5.720000000000000e-13 3.950000000000000e-12 -1.840000000000000e-12 6.980000000000000e-13 8.420000000000000e-12 -2.500000000000000e-12 8.190000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.140000000000000e+02 6.804508259103161e-01 -7.071187100141300e-01 -1.870794927818112e-01 -4.439669859822580e-02 3.890000000000000e-12 3.640000000000000e-12 2.420000000000000e-13 5.720000000000000e-13 3.950000000000000e-12 -1.840000000000000e-12 6.980000000000000e-13 8.420000000000000e-12 -2.500000000000000e-12 8.190000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.150000000000000e+02 6.804526871032610e-01 -7.071249382973606e-01 -1.870480813402299e-01 -4.440132339068760e-02 3.890000000000000e-12 3.640000000000000e-12 2.430000000000000e-13 5.710000000000000e-13 3.950000000000000e-12 -1.840000000000000e-12 6.970000000000000e-13 8.420000000000000e-12 -2.500000000000000e-12 8.190000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.160000000000000e+02 6.804545485690342e-01 -7.071311664598303e-01 -1.870166640316401e-01 -4.440594698177390e-02 3.890000000000000e-12 3.640000000000000e-12 2.440000000000000e-13 5.700000000000000e-13 3.950000000000000e-12 -1.840000000000000e-12 6.960000000000000e-13 8.420000000000000e-12 -2.500000000000000e-12 8.190000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.170000000000000e+02 6.804564107329627e-01 -7.071373942640587e-01 -1.869852404170683e-01 -4.441056847217940e-02 3.900000000000000e-12 3.660000000000000e-12 2.440000000000000e-13 5.660000000000000e-13 3.960000000000000e-12 -1.840000000000000e-12 6.920000000000000e-13 8.420000000000000e-12 -2.500000000000000e-12 8.190000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.180000000000000e+02 6.804582740277767e-01 -7.071436214673144e-01 -1.869538100930558e-01 -4.441518678245570e-02 3.900000000000000e-12 3.660000000000000e-12 2.440000000000000e-13 5.660000000000000e-13 3.960000000000000e-12 -1.840000000000000e-12 6.920000000000000e-13 8.430000000000000e-12 -2.500000000000000e-12 8.190000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.190000000000000e+02 6.804601387148121e-01 -7.071498479544605e-01 -1.869223727551841e-01 -4.441980101007110e-02 3.900000000000000e-12 3.650000000000000e-12 2.450000000000000e-13 5.650000000000000e-13 3.960000000000000e-12 -1.830000000000000e-12 6.910000000000000e-13 8.430000000000000e-12 -2.500000000000000e-12 8.190000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.200000000000000e+02 6.804620047249804e-01 -7.071560738611651e-01 -1.868909282409560e-01 -4.442441072380310e-02 3.900000000000000e-12 3.650000000000000e-12 2.480000000000000e-13 5.690000000000000e-13 3.960000000000000e-12 -1.840000000000000e-12 6.930000000000000e-13 8.450000000000001e-12 -2.500000000000000e-12 8.210000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.210000000000000e+02 6.804638715878522e-01 -7.071622996319363e-01 -1.868594765370707e-01 -4.442901609572860e-02 3.900000000000000e-12 3.650000000000000e-12 2.490000000000000e-13 5.680000000000000e-13 3.960000000000000e-12 -1.840000000000000e-12 6.920000000000000e-13 8.450000000000001e-12 -2.500000000000000e-12 8.210000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.220000000000000e+02 6.804657468579826e-01 -7.071685197822557e-01 -1.868280098581551e-01 -4.443362144168260e-02 3.900000000000000e-12 3.650000000000000e-12 2.490000000000000e-13 5.680000000000000e-13 3.960000000000000e-12 -1.840000000000000e-12 6.920000000000000e-13 8.450000000000001e-12 -2.500000000000000e-12 8.210000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.230000000000000e+02 6.804676128318610e-01 -7.071747475383846e-01 -1.867965441021969e-01 -4.443822051350210e-02 3.900000000000000e-12 3.650000000000000e-12 2.480000000000000e-13 5.680000000000000e-13 3.960000000000000e-12 -1.840000000000000e-12 6.920000000000000e-13 8.450000000000001e-12 -2.500000000000000e-12 8.210000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.240000000000000e+02 6.804694769925534e-01 -7.071809774728639e-01 -1.867650714649811e-01 -4.444281789767960e-02 3.900000000000000e-12 3.650000000000000e-12 2.500000000000000e-13 5.670000000000000e-13 3.960000000000000e-12 -1.830000000000000e-12 6.910000000000000e-13 8.450000000000001e-12 -2.500000000000000e-12 8.210000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.250000000000000e+02 6.804713387700733e-01 -7.071872101007519e-01 -1.867335919061132e-01 -4.444741428047780e-02 3.920000000000000e-12 3.670000000000000e-12 2.550000000000000e-13 5.650000000000000e-13 3.970000000000000e-12 -1.840000000000000e-12 6.880000000000000e-13 8.479999999999999e-12 -2.510000000000000e-12 8.240000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.260000000000000e+02 6.804731980370196e-01 -7.071934455708004e-01 -1.867021052564498e-01 -4.445200994083620e-02 3.920000000000000e-12 3.670000000000000e-12 2.550000000000000e-13 5.660000000000000e-13 3.970000000000000e-12 -1.840000000000000e-12 6.880000000000000e-13 8.479999999999999e-12 -2.510000000000000e-12 8.240000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.270000000000000e+02 6.804750550979983e-01 -7.071996836573675e-01 -1.866706112812963e-01 -4.445660477547360e-02 3.920000000000000e-12 3.670000000000000e-12 2.550000000000000e-13 5.660000000000000e-13 3.970000000000000e-12 -1.830000000000000e-12 6.880000000000000e-13 8.479999999999999e-12 -2.510000000000000e-12 8.240000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.280000000000000e+02 6.804769105518069e-01 -7.072059238521039e-01 -1.866391098014493e-01 -4.446119844182430e-02 3.920000000000000e-12 3.670000000000000e-12 2.550000000000000e-13 5.650000000000000e-13 3.970000000000000e-12 -1.840000000000000e-12 6.900000000000000e-13 8.490000000000000e-12 -2.520000000000000e-12 8.250000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.290000000000000e+02 6.804787650873577e-01 -7.072121655091635e-01 -1.866076008413017e-01 -4.446579055046080e-02 3.920000000000000e-12 3.670000000000000e-12 2.550000000000000e-13 5.650000000000000e-13 3.970000000000000e-12 -1.840000000000000e-12 6.890000000000000e-13 8.490000000000000e-12 -2.520000000000000e-12 8.250000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.300000000000000e+02 6.804806192923739e-01 -7.072184079886291e-01 -1.865760847431044e-01 -4.447038083298010e-02 3.920000000000000e-12 3.660000000000000e-12 2.560000000000000e-13 5.640000000000000e-13 3.970000000000000e-12 -1.840000000000000e-12 6.880000000000000e-13 8.490000000000000e-12 -2.520000000000000e-12 8.250000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.310000000000000e+02 6.804824735366802e-01 -7.072246507599401e-01 -1.865445621806901e-01 -4.447496922648460e-02 3.920000000000000e-12 3.660000000000000e-12 2.560000000000000e-13 5.640000000000000e-13 3.970000000000000e-12 -1.830000000000000e-12 6.880000000000000e-13 8.490000000000000e-12 -2.520000000000000e-12 8.250000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.320000000000000e+02 6.804843301541184e-01 -7.072308918192621e-01 -1.865130319755352e-01 -4.447955681574660e-02 3.920000000000000e-12 3.660000000000000e-12 2.570000000000000e-13 5.630000000000000e-13 3.970000000000000e-12 -1.830000000000000e-12 6.870000000000000e-13 8.490000000000000e-12 -2.520000000000000e-12 8.250000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.330000000000000e+02 6.804861847334052e-01 -7.072371341863908e-01 -1.864814991615314e-01 -4.448414195264290e-02 3.920000000000000e-12 3.660000000000000e-12 2.570000000000000e-13 5.630000000000000e-13 3.970000000000000e-12 -1.830000000000000e-12 6.870000000000000e-13 8.490000000000000e-12 -2.520000000000000e-12 8.250000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.340000000000000e+02 6.804880393992045e-01 -7.072433761168424e-01 -1.864499623126039e-01 -4.448872584268990e-02 3.920000000000000e-12 3.660000000000000e-12 2.570000000000000e-13 5.630000000000000e-13 3.970000000000000e-12 -1.830000000000000e-12 6.870000000000000e-13 8.490000000000000e-12 -2.520000000000000e-12 8.250000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.350000000000000e+02 6.804898941164037e-01 -7.072496175776053e-01 -1.864184216420885e-01 -4.449330864578800e-02 3.930000000000000e-12 3.680000000000000e-12 2.580000000000000e-13 5.590000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.860000000000000e-13 8.500000000000000e-12 -2.530000000000000e-12 8.269999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.360000000000000e+02 6.804917489208079e-01 -7.072558585928699e-01 -1.863868769202563e-01 -4.449789038455780e-02 3.930000000000000e-12 3.680000000000000e-12 2.580000000000000e-13 5.600000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.860000000000000e-13 8.500000000000000e-12 -2.530000000000000e-12 8.269999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.370000000000000e+02 6.804936038904005e-01 -7.072620992192971e-01 -1.863553276634038e-01 -4.450247098345640e-02 3.930000000000000e-12 3.680000000000000e-12 2.620000000000000e-13 5.620000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.830000000000000e-13 8.520000000000000e-12 -2.520000000000000e-12 8.279999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.380000000000000e+02 6.804954590820982e-01 -7.072683395082562e-01 -1.863237734829476e-01 -4.450705037355140e-02 3.930000000000000e-12 3.680000000000000e-12 2.620000000000000e-13 5.620000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.830000000000000e-13 8.520000000000000e-12 -2.520000000000000e-12 8.279999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.390000000000000e+02 6.804973144598477e-01 -7.072745794679552e-01 -1.862922144610335e-01 -4.451162862181950e-02 3.930000000000000e-12 3.680000000000000e-12 2.620000000000000e-13 5.620000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.830000000000000e-13 8.520000000000000e-12 -2.520000000000000e-12 8.279999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.400000000000000e+02 6.804991698544183e-01 -7.072808190293802e-01 -1.862606514046339e-01 -4.451620602542600e-02 3.930000000000000e-12 3.680000000000000e-12 2.630000000000000e-13 5.610000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.820000000000000e-13 8.520000000000000e-12 -2.520000000000000e-12 8.279999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.410000000000000e+02 6.805012867909005e-01 -7.072867527392439e-01 -1.862293183242573e-01 -4.452065893477910e-02 3.930000000000000e-12 3.680000000000000e-12 2.630000000000000e-13 5.610000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.820000000000000e-13 8.520000000000000e-12 -2.520000000000000e-12 8.279999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.420000000000000e+02 6.805031799178527e-01 -7.072929563598265e-01 -1.861977466990716e-01 -4.452521902984450e-02 3.930000000000000e-12 3.680000000000000e-12 2.630000000000000e-13 5.600000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.840000000000000e-13 8.530000000000000e-12 -2.530000000000000e-12 8.290000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.430000000000000e+02 6.805050809828308e-01 -7.072991540833821e-01 -1.861661626019244e-01 -4.452977982830140e-02 3.930000000000000e-12 3.680000000000000e-12 2.630000000000000e-13 5.600000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.840000000000000e-13 8.530000000000000e-12 -2.530000000000000e-12 8.290000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.440000000000000e+02 6.805069643946929e-01 -7.073053648728441e-01 -1.861345901826797e-01 -4.453433024015160e-02 3.930000000000000e-12 3.680000000000000e-12 2.630000000000000e-13 5.600000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.840000000000000e-13 8.530000000000000e-12 -2.530000000000000e-12 8.290000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.450000000000000e+02 6.805088484871842e-01 -7.073115751425622e-01 -1.861030121403158e-01 -4.453887821101840e-02 3.930000000000000e-12 3.680000000000000e-12 2.630000000000000e-13 5.610000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.840000000000000e-13 8.530000000000000e-12 -2.530000000000000e-12 8.290000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.460000000000000e+02 6.805107332163123e-01 -7.073177849245140e-01 -1.860714285159732e-01 -4.454342372226410e-02 3.930000000000000e-12 3.680000000000000e-12 2.630000000000000e-13 5.610000000000000e-13 3.970000000000000e-12 -1.830000000000000e-12 6.840000000000000e-13 8.530000000000000e-12 -2.530000000000000e-12 8.290000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.470000000000000e+02 6.805126186383037e-01 -7.073239941757525e-01 -1.860398392575891e-01 -4.454796680331320e-02 3.940000000000000e-12 3.690000000000000e-12 2.670000000000000e-13 5.600000000000000e-13 3.990000000000000e-12 -1.830000000000000e-12 6.820000000000000e-13 8.560000000000001e-12 -2.530000000000000e-12 8.320000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.480000000000000e+02 6.805145046966103e-01 -7.073302029383208e-01 -1.860082444163940e-01 -4.455250742541880e-02 3.940000000000000e-12 3.690000000000000e-12 2.670000000000000e-13 5.600000000000000e-13 3.990000000000000e-12 -1.830000000000000e-12 6.810000000000000e-13 8.560000000000001e-12 -2.530000000000000e-12 8.320000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.490000000000000e+02 6.805163914426786e-01 -7.073364111727845e-01 -1.859766439449270e-01 -4.455704561595780e-02 3.940000000000000e-12 3.690000000000000e-12 2.660000000000000e-13 5.600000000000000e-13 3.990000000000000e-12 -1.830000000000000e-12 6.810000000000000e-13 8.560000000000001e-12 -2.530000000000000e-12 8.320000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.500000000000000e+02 6.805182788688150e-01 -7.073426188839199e-01 -1.859450378506618e-01 -4.456158137431390e-02 3.940000000000000e-12 3.690000000000000e-12 2.680000000000000e-13 5.590000000000000e-13 3.990000000000000e-12 -1.830000000000000e-12 6.800000000000000e-13 8.560000000000001e-12 -2.530000000000000e-12 8.320000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.510000000000000e+02 6.805201669190556e-01 -7.073488261144781e-01 -1.859134261816430e-01 -4.456611466499450e-02 3.940000000000000e-12 3.690000000000000e-12 2.670000000000000e-13 5.590000000000000e-13 3.990000000000000e-12 -1.830000000000000e-12 6.800000000000000e-13 8.560000000000001e-12 -2.530000000000000e-12 8.320000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.520000000000000e+02 6.805220573093533e-01 -7.073550315906878e-01 -1.858818073197795e-01 -4.457064624071170e-02 3.940000000000000e-12 3.690000000000000e-12 2.680000000000000e-13 5.580000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.790000000000000e-13 8.560000000000001e-12 -2.530000000000000e-12 8.320000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.530000000000000e+02 6.805239494795332e-01 -7.073612357265610e-01 -1.858501817943947e-01 -4.457517586236790e-02 3.940000000000000e-12 3.690000000000000e-12 2.680000000000000e-13 5.580000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.790000000000000e-13 8.560000000000001e-12 -2.530000000000000e-12 8.320000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.540000000000000e+02 6.805258395218137e-01 -7.073674414197361e-01 -1.858185532921351e-01 -4.457970182543620e-02 3.940000000000000e-12 3.690000000000000e-12 2.680000000000000e-13 5.580000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.790000000000000e-13 8.560000000000001e-12 -2.530000000000000e-12 8.320000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.550000000000000e+02 6.805277302574784e-01 -7.073736465783308e-01 -1.857869191482154e-01 -4.458422535487440e-02 3.940000000000000e-12 3.690000000000000e-12 2.670000000000000e-13 5.590000000000000e-13 3.990000000000000e-12 -1.830000000000000e-12 6.820000000000000e-13 8.569999999999999e-12 -2.550000000000000e-12 8.330000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.560000000000000e+02 6.805296216745166e-01 -7.073798512091868e-01 -1.857552793768310e-01 -4.458874645517210e-02 3.940000000000000e-12 3.690000000000000e-12 2.670000000000000e-13 5.590000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.820000000000000e-13 8.569999999999999e-12 -2.550000000000000e-12 8.330000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.570000000000000e+02 6.805315137141127e-01 -7.073860553560423e-01 -1.857236340313879e-01 -4.459326509655990e-02 3.950000000000000e-12 3.700000000000000e-12 2.690000000000000e-13 5.550000000000000e-13 4.000000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.569999999999999e-12 -2.550000000000000e-12 8.330000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.580000000000000e+02 6.805334064588721e-01 -7.073922589567497e-01 -1.856919830339849e-01 -4.459778131764620e-02 3.950000000000000e-12 3.700000000000000e-12 2.690000000000000e-13 5.550000000000000e-13 4.000000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.569999999999999e-12 -2.550000000000000e-12 8.330000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.590000000000000e+02 6.805352998263100e-01 -7.073984620725992e-01 -1.856603264603890e-01 -4.460229507836520e-02 3.950000000000000e-12 3.700000000000000e-12 2.690000000000000e-13 5.550000000000000e-13 4.000000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.569999999999999e-12 -2.550000000000000e-12 8.330000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.600000000000000e+02 6.805371938683505e-01 -7.074046646641636e-01 -1.856286642617684e-01 -4.460680640401320e-02 3.950000000000000e-12 3.700000000000000e-12 2.710000000000000e-13 5.590000000000000e-13 4.000000000000000e-12 -1.830000000000000e-12 6.800000000000000e-13 8.590000000000000e-12 -2.550000000000000e-12 8.350000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.610000000000000e+02 6.805390886029358e-01 -7.074108667175882e-01 -1.855969964205011e-01 -4.461131530278950e-02 3.950000000000000e-12 3.700000000000000e-12 2.710000000000000e-13 5.590000000000000e-13 4.000000000000000e-12 -1.830000000000000e-12 6.790000000000000e-13 8.590000000000000e-12 -2.550000000000000e-12 8.350000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.620000000000000e+02 6.805409918404088e-01 -7.074170624399340e-01 -1.855653155572003e-01 -4.461582517318450e-02 3.950000000000000e-12 3.700000000000000e-12 2.720000000000000e-13 5.580000000000000e-13 4.000000000000000e-12 -1.830000000000000e-12 6.780000000000000e-13 8.600000000000000e-12 -2.550000000000000e-12 8.350000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.630000000000000e+02 6.805429009851827e-01 -7.074232537550383e-01 -1.855336241221036e-01 -4.462033488695880e-02 3.950000000000000e-12 3.700000000000000e-12 2.720000000000000e-13 5.580000000000000e-13 4.000000000000000e-12 -1.830000000000000e-12 6.780000000000000e-13 8.600000000000000e-12 -2.550000000000000e-12 8.350000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.640000000000000e+02 6.805447977018727e-01 -7.074294542616685e-01 -1.855019394368551e-01 -4.462483646043270e-02 3.950000000000000e-12 3.700000000000000e-12 2.720000000000000e-13 5.580000000000000e-13 4.000000000000000e-12 -1.830000000000000e-12 6.780000000000000e-13 8.600000000000000e-12 -2.550000000000000e-12 8.350000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.650000000000000e+02 6.805466950362852e-01 -7.074356542817831e-01 -1.854702491810835e-01 -4.462933558548260e-02 3.950000000000000e-12 3.700000000000000e-12 2.730000000000000e-13 5.570000000000000e-13 3.990000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.600000000000000e-12 -2.550000000000000e-12 8.360000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.660000000000000e+02 6.805485930491795e-01 -7.074418537716606e-01 -1.854385532922979e-01 -4.463383227730270e-02 3.950000000000000e-12 3.700000000000000e-12 2.730000000000000e-13 5.570000000000000e-13 3.990000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.600000000000000e-12 -2.550000000000000e-12 8.360000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.670000000000000e+02 6.805504917507675e-01 -7.074480527231749e-01 -1.854068517601737e-01 -4.463832654073590e-02 3.950000000000000e-12 3.700000000000000e-12 2.720000000000000e-13 5.580000000000000e-13 3.990000000000000e-12 -1.830000000000000e-12 6.800000000000000e-13 8.610000000000000e-12 -2.560000000000000e-12 8.369999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.680000000000000e+02 6.805523910575262e-01 -7.074542511980290e-01 -1.853751446623895e-01 -4.464281833753750e-02 3.950000000000000e-12 3.700000000000000e-12 2.710000000000000e-13 5.580000000000000e-13 3.990000000000000e-12 -1.830000000000000e-12 6.800000000000000e-13 8.610000000000000e-12 -2.560000000000000e-12 8.369999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.690000000000000e+02 6.805542910572175e-01 -7.074604491286851e-01 -1.853434319197339e-01 -4.464730771795980e-02 3.950000000000000e-12 3.700000000000000e-12 2.710000000000000e-13 5.580000000000000e-13 3.990000000000000e-12 -1.830000000000000e-12 6.790000000000000e-13 8.610000000000000e-12 -2.560000000000000e-12 8.369999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.700000000000000e+02 6.805561917285031e-01 -7.074666465323102e-01 -1.853117135472950e-01 -4.465179466146390e-02 3.970000000000000e-12 3.710000000000000e-12 2.760000000000000e-13 5.570000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.750000000000000e-13 8.620000000000000e-12 -2.550000000000000e-12 8.379999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.710000000000000e+02 6.805580930180705e-01 -7.074728434466908e-01 -1.852799895977349e-01 -4.465627915226250e-02 3.970000000000000e-12 3.710000000000000e-12 2.760000000000000e-13 5.570000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.740000000000000e-13 8.620000000000000e-12 -2.550000000000000e-12 8.379999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.720000000000000e+02 6.805599950109590e-01 -7.074790398085944e-01 -1.852482599890111e-01 -4.466076122545080e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.730000000000000e+02 6.805618976158928e-01 -7.074852356854846e-01 -1.852165248061569e-01 -4.466524083938010e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.740000000000000e+02 6.805638008983755e-01 -7.074914310263259e-01 -1.851847839909751e-01 -4.466971803463320e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.750000000000000e+02 6.805657048604445e-01 -7.074976258316985e-01 -1.851530375346965e-01 -4.467419279619480e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.760000000000000e+02 6.805676094409745e-01 -7.075038201451924e-01 -1.851212854973860e-01 -4.467866510485430e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.770000000000000e+02 6.805695146960570e-01 -7.075100139253930e-01 -1.850895278235674e-01 -4.468313498080430e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.780000000000000e+02 6.805714206288039e-01 -7.075162071671730e-01 -1.850577645149062e-01 -4.468760243977380e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.790000000000000e+02 6.805733271728232e-01 -7.075223999221897e-01 -1.850259956267711e-01 -4.469206743462320e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.800000000000000e+02 6.805752344004763e-01 -7.075285921339283e-01 -1.849942210953318e-01 -4.469653001128730e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.810000000000000e+02 6.805771422928842e-01 -7.075347838166015e-01 -1.849624409360073e-01 -4.470099015726920e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.820000000000000e+02 6.805790508025281e-01 -7.075409750044676e-01 -1.849306551942538e-01 -4.470544785461200e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.830000000000000e+02 6.805809600136632e-01 -7.075471656352235e-01 -1.848988637878261e-01 -4.470990313580800e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.840000000000000e+02 6.805828698307244e-01 -7.075533557795428e-01 -1.848670668058809e-01 -4.471435595726460e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.850000000000000e+02 6.805847803251571e-01 -7.075595453812051e-01 -1.848352641863081e-01 -4.471880636687220e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.860000000000000e+02 6.805866914915339e-01 -7.075657344467025e-01 -1.848034559265214e-01 -4.472325434402590e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.870000000000000e+02 6.805886032718196e-01 -7.075719230181050e-01 -1.847716420819424e-01 -4.472769986616110e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.880000000000000e+02 6.805905157254911e-01 -7.075781110492009e-01 -1.847398225991315e-01 -4.473214296896920e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.890000000000000e+02 6.805924288515512e-01 -7.075842985409305e-01 -1.847079974765933e-01 -4.473658364775430e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.900000000000000e+02 6.805943425824637e-01 -7.075904855427991e-01 -1.846761667778728e-01 -4.474102187345890e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.910000000000000e+02 6.805962569908148e-01 -7.075966720003660e-01 -1.846443304335873e-01 -4.474545767819880e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.920000000000000e+02 6.805981720717642e-01 -7.076028579155387e-01 -1.846124884502809e-01 -4.474989106724630e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.930000000000000e+02 6.806000877625229e-01 -7.076090433376953e-01 -1.845806408790939e-01 -4.475432199264100e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.940000000000000e+02 6.806020041191391e-01 -7.076152282208984e-01 -1.845487876750901e-01 -4.475875050257690e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.950000000000000e+02 6.806039211508469e-01 -7.076214125592438e-01 -1.845169288253257e-01 -4.476317659217400e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.960000000000000e+02 6.806058387904138e-01 -7.076275964027753e-01 -1.844850643913227e-01 -4.476760022782080e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.970000000000000e+02 6.806077571168555e-01 -7.076337796911591e-01 -1.844531943001218e-01 -4.477202145144800e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.980000000000000e+02 6.806096760592454e-01 -7.076399624771855e-01 -1.844213186167506e-01 -4.477644022782020e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.990000000000000e+02 6.806115956594206e-01 -7.076461447277239e-01 -1.843894373044297e-01 -4.478085658495750e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.000000000000000e+02 6.806135159379672e-01 -7.076523264299429e-01 -1.843575503359406e-01 -4.478527051363270e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.010000000000000e+02 6.806154368222731e-01 -7.076585076337463e-01 -1.843256577876024e-01 -4.478968200348310e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.020000000000000e+02 6.806173583647662e-01 -7.076646883011479e-01 -1.842937596055554e-01 -4.479409106853670e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.030000000000000e+02 6.806192805904152e-01 -7.076708684137979e-01 -1.842618557637039e-01 -4.479849771546850e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.040000000000000e+02 6.806212034085927e-01 -7.076770480368718e-01 -1.842299463510489e-01 -4.480290191436160e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.050000000000000e+02 6.806231269015282e-01 -7.076832271106166e-01 -1.841980312846037e-01 -4.480730368998010e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.060000000000000e+02 6.806250510583440e-01 -7.076894056399192e-01 -1.841661105801514e-01 -4.481170305426870e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.070000000000000e+02 6.806269758190756e-01 -7.076955836709498e-01 -1.841341842888569e-01 -4.481609996742830e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.080000000000000e+02 6.806289012665798e-01 -7.077017611404951e-01 -1.841022523340594e-01 -4.482049447313670e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.090000000000000e+02 6.806308273162907e-01 -7.077079381122506e-01 -1.840703147920051e-01 -4.482488652546510e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.100000000000000e+02 6.806327540363198e-01 -7.077141145331748e-01 -1.840383716018563e-01 -4.482927616631790e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.110000000000000e+02 6.806346814199060e-01 -7.077202904088615e-01 -1.840064227667008e-01 -4.483366338614220e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.120000000000000e+02 6.806366094029825e-01 -7.077264657851488e-01 -1.839744683495275e-01 -4.483804816428820e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.130000000000000e+02 6.806385380508827e-01 -7.077326406136876e-01 -1.839425082859625e-01 -4.484243052514650e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.140000000000000e+02 6.806404673640545e-01 -7.077388148939621e-01 -1.839105425740186e-01 -4.484681046698540e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.150000000000000e+02 6.806423972815441e-01 -7.077449886695021e-01 -1.838785712737441e-01 -4.485118797050810e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.160000000000000e+02 6.806443278510637e-01 -7.077511619073037e-01 -1.838465943321854e-01 -4.485556303840600e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.170000000000000e+02 6.806462591012522e-01 -7.077573345810102e-01 -1.838146117320522e-01 -4.485993571161200e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.180000000000000e+02 6.806481909370581e-01 -7.077635067643873e-01 -1.837826235543106e-01 -4.486430592555760e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.190000000000000e+02 6.806501234388842e-01 -7.077696783941123e-01 -1.837506297290610e-01 -4.486867373457920e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.200000000000000e+02 6.806520566020791e-01 -7.077758494757149e-01 -1.837186302538764e-01 -4.487303912072410e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.210000000000000e+02 6.806539903682228e-01 -7.077820200497232e-01 -1.836866251890621e-01 -4.487740207277580e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.220000000000000e+02 6.806559248125247e-01 -7.077881900623336e-01 -1.836546144563401e-01 -4.488176260783480e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.230000000000000e+02 6.806578598589749e-01 -7.077943595667765e-01 -1.836225981335875e-01 -4.488612070928050e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.240000000000000e+02 6.806597955590322e-01 -7.078005285257449e-01 -1.835905761677870e-01 -4.489047639079790e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.250000000000000e+02 6.806617319248200e-01 -7.078066969292897e-01 -1.835585485476301e-01 -4.489482966044730e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.260000000000000e+02 6.806636688880379e-01 -7.078128648275482e-01 -1.835265153375409e-01 -4.489918048866720e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.270000000000000e+02 6.806656065089071e-01 -7.078190321759418e-01 -1.834944764779350e-01 -4.490352889766620e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.280000000000000e+02 6.806675447893018e-01 -7.078251989702612e-01 -1.834624319716208e-01 -4.490787490265400e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.290000000000000e+02 6.806694836636518e-01 -7.078313652608742e-01 -1.834303818751729e-01 -4.491221846127150e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.300000000000000e+02 6.806714232012057e-01 -7.078375309957319e-01 -1.833983261221829e-01 -4.491655960437200e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.310000000000000e+02 6.806733633934785e-01 -7.078436961779525e-01 -1.833662647261695e-01 -4.492089834494080e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.320000000000000e+02 6.806753041752375e-01 -7.078498608591596e-01 -1.833341977398859e-01 -4.492523463142980e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.330000000000000e+02 6.806772456449776e-01 -7.078560249621955e-01 -1.833021250769521e-01 -4.492956852853420e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.340000000000000e+02 6.806791876994079e-01 -7.078621885658611e-01 -1.832700468288954e-01 -4.493389997494180e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.350000000000000e+02 6.806811304222570e-01 -7.078683516062020e-01 -1.832379629181729e-01 -4.493822901489690e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.360000000000000e+02 6.806830737898589e-01 -7.078745140998804e-01 -1.832058733674463e-01 -4.494255564071590e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.370000000000000e+02 6.806850177579234e-01 -7.078806760791975e-01 -1.831737782183893e-01 -4.494687983335490e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.380000000000000e+02 6.806869623766859e-01 -7.078868375069791e-01 -1.831416774208552e-01 -4.495120161067370e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.390000000000000e+02 6.806889076540393e-01 -7.078929983764155e-01 -1.831095709675389e-01 -4.495552097888330e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.400000000000000e+02 6.806908535227985e-01 -7.078991587375911e-01 -1.830774589201096e-01 -4.495983790418430e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.410000000000000e+02 6.806928000382613e-01 -7.079053185469351e-01 -1.830453412297512e-01 -4.496415242299260e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.420000000000000e+02 6.806947472238813e-01 -7.079114777879364e-01 -1.830132178699826e-01 -4.496846453672560e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.430000000000000e+02 6.806966949806493e-01 -7.079176365332347e-01 -1.829810889353541e-01 -4.497277420453460e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.440000000000000e+02 6.806986434112186e-01 -7.079237947058986e-01 -1.829489543276551e-01 -4.497708147207000e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.450000000000000e+02 6.807005924796364e-01 -7.079299523317365e-01 -1.829168140812343e-01 -4.498138632621690e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.460000000000000e+02 6.807025421428867e-01 -7.079361094432369e-01 -1.828846682339453e-01 -4.498568874147190e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.470000000000000e+02 6.807044924778166e-01 -7.079422659811857e-01 -1.828525167154901e-01 -4.498998876143240e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.480000000000000e+02 6.807064434050233e-01 -7.079484220043960e-01 -1.828203596000608e-01 -4.499428634920480e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.490000000000000e+02 6.807083949744324e-01 -7.079545774770304e-01 -1.827881968351337e-01 -4.499858151555730e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.500000000000000e+02 6.807103472083096e-01 -7.079607323793300e-01 -1.827560284050028e-01 -4.500287428703820e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.510000000000000e+02 6.807123000235670e-01 -7.079668867743577e-01 -1.827238543838677e-01 -4.500716461578460e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.520000000000000e+02 6.807142534872245e-01 -7.079730406109251e-01 -1.826916747090908e-01 -4.501145253643870e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.530000000000000e+02 6.807162076071777e-01 -7.079791938822150e-01 -1.826594893733536e-01 -4.501573805522380e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.540000000000000e+02 6.807181623060411e-01 -7.079853466455538e-01 -1.826272984489629e-01 -4.502002113610010e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.550000000000000e+02 6.807201176632410e-01 -7.079914988416366e-01 -1.825951018588372e-01 -4.502430181221130e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.560000000000000e+02 6.807220736585090e-01 -7.079976504838594e-01 -1.825628996241920e-01 -4.502858008200500e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.570000000000000e+02 6.807240302473074e-01 -7.080038016054792e-01 -1.825306917852352e-01 -4.503285592160440e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.580000000000000e+02 6.807259875027123e-01 -7.080099521519357e-01 -1.824984782708074e-01 -4.503712936134690e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.590000000000000e+02 6.807279453417535e-01 -7.080161021847218e-01 -1.824662591585503e-01 -4.504140036269920e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.600000000000000e+02 6.807299038336975e-01 -7.080222516494622e-01 -1.824340343871619e-01 -4.504566897066450e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.610000000000000e+02 6.807318629667408e-01 -7.080284005573719e-01 -1.824018039601574e-01 -4.504993516177940e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.620000000000000e+02 6.807338226858302e-01 -7.080345489457980e-01 -1.823695679365381e-01 -4.505419893081690e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.630000000000000e+02 6.807357830503799e-01 -7.080406967725612e-01 -1.823373262529522e-01 -4.505846028812930e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.640000000000000e+02 6.807377440639806e-01 -7.080468440329223e-01 -1.823050789088007e-01 -4.506271924503720e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.650000000000000e+02 6.807397056552275e-01 -7.080529907790288e-01 -1.822728259725109e-01 -4.506697577275010e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.660000000000000e+02 6.807416678960652e-01 -7.080591369593643e-01 -1.822405673687968e-01 -4.507122988717470e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.670000000000000e+02 6.807436307805834e-01 -7.080652825740191e-01 -1.822083031113624e-01 -4.507548160941980e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.680000000000000e+02 6.807455942449967e-01 -7.080714276724660e-01 -1.821760332543794e-01 -4.507973089539750e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.690000000000000e+02 6.807475583582121e-01 -7.080775722013274e-01 -1.821437577350872e-01 -4.508397778533580e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.700000000000000e+02 6.807495231100620e-01 -7.080837161698509e-01 -1.821114765572078e-01 -4.508822226114910e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.710000000000000e+02 6.807514884451850e-01 -7.080898596163767e-01 -1.820791897783101e-01 -4.509246431277890e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.720000000000000e+02 6.807534544423335e-01 -7.080960024832067e-01 -1.820468973191290e-01 -4.509670396615490e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.730000000000000e+02 6.807554210228176e-01 -7.081021448260580e-01 -1.820145992594473e-01 -4.510094120088160e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.740000000000000e+02 6.807573882392532e-01 -7.081082866081659e-01 -1.819822955414662e-01 -4.510517602201180e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.750000000000000e+02 6.807593561051585e-01 -7.081144278162731e-01 -1.819499861577594e-01 -4.510940845226630e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.760000000000000e+02 6.807613245471359e-01 -7.081205685059022e-01 -1.819176711743164e-01 -4.511363845025670e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.770000000000000e+02 6.807632936272958e-01 -7.081267086294700e-01 -1.818853505330568e-01 -4.511786604857500e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.780000000000000e+02 6.807652633546568e-01 -7.081328481796877e-01 -1.818530242246962e-01 -4.512209125162740e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.790000000000000e+02 6.807672336486459e-01 -7.081389872181768e-01 -1.818206923203216e-01 -4.512631401016290e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.800000000000000e+02 6.807692045960232e-01 -7.081451256763670e-01 -1.817883547444964e-01 -4.513053438404330e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.810000000000000e+02 6.807711761716351e-01 -7.081512635742973e-01 -1.817560115161019e-01 -4.513475235086060e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.820000000000000e+02 6.807731483341586e-01 -7.081574009417341e-01 -1.817236626749872e-01 -4.513896789508200e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.830000000000000e+02 6.807751211464188e-01 -7.081635377313235e-01 -1.816913081605091e-01 -4.514318104496230e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.840000000000000e+02 6.807770945415387e-01 -7.081696739929957e-01 -1.816589480342367e-01 -4.514739176662900e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.850000000000000e+02 6.807790685731693e-01 -7.081758096847086e-01 -1.816265822478663e-01 -4.515160009362310e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.860000000000000e+02 6.807810432430113e-01 -7.081819448049966e-01 -1.815942107982048e-01 -4.515580602477600e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.870000000000000e+02 6.807830184844125e-01 -7.081880794028822e-01 -1.815618337483745e-01 -4.516000953096380e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.880000000000000e+02 6.807849943642746e-01 -7.081942134298039e-01 -1.815294510295447e-01 -4.516421063063060e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.890000000000000e+02 6.807869708857051e-01 -7.082003468802595e-01 -1.814970626441921e-01 -4.516840934189250e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.900000000000000e+02 6.807889479711839e-01 -7.082064798128702e-01 -1.814646686623046e-01 -4.517260562145490e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.910000000000000e+02 6.807909257043773e-01 -7.082126121643321e-01 -1.814322690043164e-01 -4.517679950921920e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.920000000000000e+02 6.807929040608919e-01 -7.082187439530008e-01 -1.813998636910308e-01 -4.518099099009130e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.930000000000000e+02 6.807948829980202e-01 -7.082248752089418e-01 -1.813674527653983e-01 -4.518518005255610e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.940000000000000e+02 6.807968625706520e-01 -7.082310058895476e-01 -1.813350361770212e-01 -4.518936672841060e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.950000000000000e+02 6.807988427745676e-01 -7.082371360007492e-01 -1.813026139213409e-01 -4.519355099519470e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.960000000000000e+02 6.808008235496430e-01 -7.082432655837332e-01 -1.812701860623031e-01 -4.519773284530540e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.970000000000000e+02 6.808028049778222e-01 -7.082493945776093e-01 -1.812377525192185e-01 -4.520191231089780e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.980000000000000e+02 6.808047869844066e-01 -7.082555230385364e-01 -1.812053133603006e-01 -4.520608935222300e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.990000000000000e+02 6.808067696151456e-01 -7.082616509318331e-01 -1.811728685412241e-01 -4.521026399003330e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.000000000000000e+02 6.808087528808324e-01 -7.082677782470129e-01 -1.811404180553752e-01 -4.521443624120280e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.010000000000000e+02 6.808107367189448e-01 -7.082739050315358e-01 -1.811079619584937e-01 -4.521860606904870e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.020000000000000e+02 6.808127211848252e-01 -7.082800312431887e-01 -1.810755001979677e-01 -4.522277350093610e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.030000000000000e+02 6.808147062875297e-01 -7.082861568746440e-01 -1.810430327644590e-01 -4.522693854130610e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.040000000000000e+02 6.808166919547797e-01 -7.082922819791505e-01 -1.810105597265315e-01 -4.523110115844970e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.050000000000000e+02 6.808186782542116e-01 -7.082984065056950e-01 -1.809780810189561e-01 -4.523526138288520e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.060000000000000e+02 6.808206651833549e-01 -7.083045304551714e-01 -1.809455966442655e-01 -4.523941921625540e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.070000000000000e+02 6.808226526815658e-01 -7.083106538736483e-01 -1.809131066564336e-01 -4.524357462268660e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.080000000000000e+02 6.808246408266715e-01 -7.083167766999217e-01 -1.808806109865182e-01 -4.524772765356300e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.090000000000000e+02 6.808266295396548e-01 -7.083228989952568e-01 -1.808481097025336e-01 -4.525187825548610e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.100000000000000e+02 6.808286188842521e-01 -7.083290207093024e-01 -1.808156027482012e-01 -4.525602647125950e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.110000000000000e+02 6.808306088556996e-01 -7.083351418457807e-01 -1.807830901256167e-01 -4.526017229450540e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.120000000000000e+02 6.808325993906527e-01 -7.083412624509203e-01 -1.807505718957297e-01 -4.526431569978880e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.130000000000000e+02 6.808345905564706e-01 -7.083473824753863e-01 -1.807180479900354e-01 -4.526845670821170e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.140000000000000e+02 6.808365823478467e-01 -7.083535019206981e-01 -1.806855184172763e-01 -4.527259532948540e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.150000000000000e+02 6.808385747024017e-01 -7.083596208327423e-01 -1.806529832366167e-01 -4.527673153625900e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.160000000000000e+02 6.808405676861033e-01 -7.083657391632148e-01 -1.806204423808666e-01 -4.528086534902890e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.170000000000000e+02 6.808425612949469e-01 -7.083718569141539e-01 -1.805878958540248e-01 -4.528499676875270e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.180000000000000e+02 6.808445554663316e-01 -7.083779741301267e-01 -1.805553437189790e-01 -4.528912577730150e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.190000000000000e+02 6.808465502650366e-01 -7.083840907651980e-01 -1.805227859061624e-01 -4.529325238532250e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.200000000000000e+02 6.808485456872755e-01 -7.083902068182659e-01 -1.804902224263644e-01 -4.529737661253660e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.210000000000000e+02 6.808505416740982e-01 -7.083963223345281e-01 -1.804576533311229e-01 -4.530149842143130e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.220000000000000e+02 6.808525383000187e-01 -7.084024372581978e-01 -1.804250785475814e-01 -4.530561784332790e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.230000000000000e+02 6.808545354967350e-01 -7.084085516369897e-01 -1.803924981467175e-01 -4.530973486453200e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.240000000000000e+02 6.808565333097875e-01 -7.084146654400594e-01 -1.803599120755737e-01 -4.531384948245440e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.250000000000000e+02 6.808585317482313e-01 -7.084207786567212e-01 -1.803273203326689e-01 -4.531796172255330e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.260000000000000e+02 6.808605307461827e-01 -7.084268913377275e-01 -1.802947229753115e-01 -4.532207154186230e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.270000000000000e+02 6.808625303655046e-01 -7.084330034355817e-01 -1.802621199454352e-01 -4.532617897309750e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.280000000000000e+02 6.808645306111482e-01 -7.084391149463797e-01 -1.802295112367289e-01 -4.533028401655080e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.290000000000000e+02 6.808665314136469e-01 -7.084452259209501e-01 -1.801968969160628e-01 -4.533438664397530e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.300000000000000e+02 6.808685328387164e-01 -7.084513363089135e-01 -1.801642769216742e-01 -4.533848688982390e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.310000000000000e+02 6.808705348799348e-01 -7.084574461156008e-01 -1.801316512563733e-01 -4.534258474463640e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.320000000000000e+02 6.808725374849748e-01 -7.084635553786779e-01 -1.800990199715337e-01 -4.534668019014930e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.330000000000000e+02 6.808745407264242e-01 -7.084696640445132e-01 -1.800663829943334e-01 -4.535077325221610e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.340000000000000e+02 6.808765445274881e-01 -7.084757721686717e-01 -1.800337404004194e-01 -4.535486390395650e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.350000000000000e+02 6.808785489501280e-01 -7.084818797050537e-01 -1.800010921280964e-01 -4.535895216883330e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.360000000000000e+02 6.808805539885986e-01 -7.084879866566256e-01 -1.799684381839022e-01 -4.536303804935630e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.370000000000000e+02 6.808825595851908e-01 -7.084940930654516e-01 -1.799357786234989e-01 -4.536712152250130e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.380000000000000e+02 6.808845657958876e-01 -7.085001988895191e-01 -1.799031133917713e-01 -4.537120261140240e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.390000000000000e+02 6.808865726322215e-01 -7.085063041218627e-01 -1.798704424717370e-01 -4.537528130763220e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.400000000000000e+02 6.808885800162574e-01 -7.085124088174284e-01 -1.798377659436623e-01 -4.537935759310230e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.410000000000000e+02 6.808905880228995e-01 -7.085185129211795e-01 -1.798050837316965e-01 -4.538343149243010e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.420000000000000e+02 6.808925966404363e-01 -7.085246164397966e-01 -1.797723958498352e-01 -4.538750301011960e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.430000000000000e+02 6.808946058156794e-01 -7.085307194127197e-01 -1.797397023476891e-01 -4.539157212047940e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.440000000000000e+02 6.808966156077765e-01 -7.085368217959314e-01 -1.797070031662165e-01 -4.539563884575310e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.450000000000000e+02 6.808986260138759e-01 -7.085429235909795e-01 -1.796742983074390e-01 -4.539970318507640e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.460000000000000e+02 6.809006369722996e-01 -7.085490248429075e-01 -1.796415878308517e-01 -4.540376511360940e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.470000000000000e+02 6.809026485667781e-01 -7.085551254882401e-01 -1.796088716563944e-01 -4.540782467161120e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.480000000000000e+02 6.809046607166711e-01 -7.085612255861896e-01 -1.795761498617157e-01 -4.541188182573490e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.490000000000000e+02 6.809066734762103e-01 -7.085673250978856e-01 -1.795434223889629e-01 -4.541593658670240e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.500000000000000e+02 6.809086868482833e-01 -7.085734240172480e-01 -1.795106892425292e-01 -4.541998897723170e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.510000000000000e+02 6.809107007753857e-01 -7.085795223902923e-01 -1.794779504683220e-01 -4.542403894865620e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.520000000000000e+02 6.809127153146730e-01 -7.085856201711339e-01 -1.794452060170373e-01 -4.542808654336990e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.530000000000000e+02 6.809147304700425e-01 -7.085917173566478e-01 -1.794124558833610e-01 -4.543213176120150e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.540000000000000e+02 6.809167461612653e-01 -7.085978140072384e-01 -1.793797001410882e-01 -4.543617455961240e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.550000000000000e+02 6.809187624832950e-01 -7.086039100509950e-01 -1.793469386994671e-01 -4.544021498396970e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.560000000000000e+02 6.809207794036682e-01 -7.086100055097396e-01 -1.793141715932427e-01 -4.544425303178730e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.570000000000000e+02 6.809227968779552e-01 -7.086161004178703e-01 -1.792813988601950e-01 -4.544828867191410e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.580000000000000e+02 6.809248149786700e-01 -7.086221947206348e-01 -1.792486204300674e-01 -4.545232193730730e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.590000000000000e+02 6.809268336361344e-01 -7.086282884690779e-01 -1.792158363700675e-01 -4.545635279947880e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.600000000000000e+02 6.809288528965587e-01 -7.086343816288192e-01 -1.791830466334801e-01 -4.546038127492950e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.610000000000000e+02 6.809308727638658e-01 -7.086404741944884e-01 -1.791502512202048e-01 -4.546440737751010e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.620000000000000e+02 6.809328931891661e-01 -7.086465662034507e-01 -1.791174501731815e-01 -4.546843107638470e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.630000000000000e+02 6.809349142121880e-01 -7.086526576250545e-01 -1.790846434545153e-01 -4.547245239215630e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.640000000000000e+02 6.809369358509707e-01 -7.086587484448578e-01 -1.790518310470846e-01 -4.547647133568360e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.650000000000000e+02 6.809389580280220e-01 -7.086648387212425e-01 -1.790190130221216e-01 -4.548048786559470e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.660000000000000e+02 6.809409808169218e-01 -7.086709283971335e-01 -1.789861893119021e-01 -4.548450202472730e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.670000000000000e+02 6.809430042157032e-01 -7.086770174745259e-01 -1.789533599149803e-01 -4.548851380560880e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.680000000000000e+02 6.809450281540091e-01 -7.086831060049913e-01 -1.789205248992581e-01 -4.549252317939930e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.690000000000000e+02 6.809470526996855e-01 -7.086891939372164e-01 -1.788876841989991e-01 -4.549653017703370e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.700000000000000e+02 6.809490778541782e-01 -7.086952812695326e-01 -1.788548378121055e-01 -4.550053479957960e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.710000000000000e+02 6.809511035558852e-01 -7.087013680477118e-01 -1.788219857963538e-01 -4.550453701745240e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.720000000000000e+02 6.809531298739107e-01 -7.087074542187775e-01 -1.787891280864303e-01 -4.550853686681940e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.730000000000000e+02 6.809551567347115e-01 -7.087135398378043e-01 -1.787562647506948e-01 -4.551253431037690e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.740000000000000e+02 6.809571842084384e-01 -7.087196248498925e-01 -1.787233957255401e-01 -4.551652939180000e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.750000000000000e+02 6.809592122855965e-01 -7.087257092648864e-01 -1.786905210115027e-01 -4.552052208621420e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.760000000000000e+02 6.809612408943675e-01 -7.087317931328768e-01 -1.786576406840331e-01 -4.552451238042590e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.770000000000000e+02 6.809632701153938e-01 -7.087378763948103e-01 -1.786247546607199e-01 -4.552850029950050e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.780000000000000e+02 6.809652999391334e-01 -7.087439590557560e-01 -1.785918629534919e-01 -4.553248584889750e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.790000000000000e+02 6.809673302969796e-01 -7.087500411674791e-01 -1.785589656251333e-01 -4.553646899116820e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.800000000000000e+02 6.809693612624313e-01 -7.087561226736718e-01 -1.785260626061762e-01 -4.554044976452320e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.810000000000000e+02 6.809713928294867e-01 -7.087622035793449e-01 -1.784931538990471e-01 -4.554442815966870e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.820000000000000e+02 6.809734249366683e-01 -7.087682839290854e-01 -1.784602395640665e-01 -4.554840415403300e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.830000000000000e+02 6.809754576576139e-01 -7.087743636668711e-01 -1.784273195306426e-01 -4.555237778355030e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.840000000000000e+02 6.809774909284921e-01 -7.087804428394224e-01 -1.783943938604884e-01 -4.555634902224500e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.850000000000000e+02 6.809795247865806e-01 -7.087865214201099e-01 -1.783614625127611e-01 -4.556031787566800e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.860000000000000e+02 6.809815592580190e-01 -7.087925993873060e-01 -1.783285254651504e-01 -4.556428436537280e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.870000000000000e+02 6.809835942614045e-01 -7.087986768016250e-01 -1.782955827945016e-01 -4.556824845276870e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.880000000000000e+02 6.809856298581493e-01 -7.088047536168951e-01 -1.782626344402904e-01 -4.557221016364830e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.890000000000000e+02 6.809876660630629e-01 -7.088108298203344e-01 -1.782296803902026e-01 -4.557616951212150e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.900000000000000e+02 6.809897027959312e-01 -7.088169054724142e-01 -1.781967207182155e-01 -4.558012645544500e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.910000000000000e+02 6.809917401362764e-01 -7.088229805134013e-01 -1.781637553464046e-01 -4.558408102760380e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.920000000000000e+02 6.809937780645423e-01 -7.088290549558639e-01 -1.781307842963182e-01 -4.558803322952690e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.930000000000000e+02 6.809958165329454e-01 -7.088351288356377e-01 -1.780978076116843e-01 -4.559198303543690e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.940000000000000e+02 6.809978555933653e-01 -7.088412021129333e-01 -1.780648252428481e-01 -4.559593047151980e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.950000000000000e+02 6.809998952571137e-01 -7.088472747786925e-01 -1.780318371782307e-01 -4.559987554330640e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.960000000000000e+02 6.810019354521004e-01 -7.088533468876873e-01 -1.779988434831693e-01 -4.560381820935310e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.970000000000000e+02 6.810039762578107e-01 -7.088594183787453e-01 -1.779658440831257e-01 -4.560775851298640e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.980000000000000e+02 6.810060176050697e-01 -7.088654893026132e-01 -1.779328390450043e-01 -4.561169642575130e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.990000000000000e+02 6.810080595429023e-01 -7.088715596219997e-01 -1.778998283210010e-01 -4.561563197022770e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.000000000000000e+02 6.810101020781255e-01 -7.088776293319464e-01 -1.778668119021065e-01 -4.561956514524570e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.010000000000000e+02 6.810121451376883e-01 -7.088836984861102e-01 -1.778337898589654e-01 -4.562349592057990e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.020000000000000e+02 6.810141887990662e-01 -7.088897670266296e-01 -1.778007621146855e-01 -4.562742432701820e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.030000000000000e+02 6.810162330521961e-01 -7.088958349582328e-01 -1.777677286834468e-01 -4.563135037444490e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.040000000000000e+02 6.810182778329679e-01 -7.089019023312081e-01 -1.777346896194735e-01 -4.563527401563940e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.050000000000000e+02 6.810203232075799e-01 -7.089079690920732e-01 -1.777016448662802e-01 -4.563919530200060e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.060000000000000e+02 6.810223691734331e-01 -7.089140352458700e-01 -1.776685944169317e-01 -4.564311420941110e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.070000000000000e+02 6.810244156743013e-01 -7.089201008310853e-01 -1.776355383320309e-01 -4.564703073158420e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.080000000000000e+02 6.810264627770446e-01 -7.089261657985555e-01 -1.776024765430099e-01 -4.565094488984420e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.090000000000000e+02 6.810285104226231e-01 -7.089322301918273e-01 -1.775694091062104e-01 -4.565485665793490e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.100000000000000e+02 6.810305586443592e-01 -7.089382939842455e-01 -1.775363359914986e-01 -4.565876605837320e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.110000000000000e+02 6.810326074653478e-01 -7.089443571590238e-01 -1.775032571733386e-01 -4.566267309503310e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.120000000000000e+02 6.810346568094643e-01 -7.089504197721435e-01 -1.774701727253826e-01 -4.566657773623850e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.130000000000000e+02 6.810367067459103e-01 -7.089564817711747e-01 -1.774370825803762e-01 -4.567048001376540e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.140000000000000e+02 6.810387572721706e-01 -7.089625431570388e-01 -1.774039867408901e-01 -4.567437992923030e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.150000000000000e+02 6.810408083217846e-01 -7.089686039806952e-01 -1.773708852660710e-01 -4.567827744130390e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.160000000000000e+02 6.810428599569692e-01 -7.089746641919925e-01 -1.773377781023370e-01 -4.568217259730110e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.170000000000000e+02 6.810449121886879e-01 -7.089807237832272e-01 -1.773046652358094e-01 -4.568606539560540e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.180000000000000e+02 6.810469649423324e-01 -7.089867828114678e-01 -1.772715467334860e-01 -4.568995579117810e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.190000000000000e+02 6.810490182762355e-01 -7.089928412309413e-01 -1.772384225420232e-01 -4.569384382024000e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.200000000000000e+02 6.810510722065449e-01 -7.089988990271111e-01 -1.772052926495194e-01 -4.569772950222150e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.210000000000000e+02 6.810531266556628e-01 -7.090049562603973e-01 -1.771721571232530e-01 -4.570161278370090e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.220000000000000e+02 6.810551817101914e-01 -7.090110128638626e-01 -1.771390158825626e-01 -4.570549371372280e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.230000000000000e+02 6.810572372911720e-01 -7.090170688967409e-01 -1.771058690012700e-01 -4.570937225225740e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.240000000000000e+02 6.810592934599027e-01 -7.090231243124995e-01 -1.770727164196713e-01 -4.571324842754930e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.250000000000000e+02 6.810613502063598e-01 -7.090291791176860e-01 -1.770395581475625e-01 -4.571712223780550e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.260000000000000e+02 6.810634074798574e-01 -7.090352333492478e-01 -1.770063942341844e-01 -4.572099366282570e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.270000000000000e+02 6.810654653331903e-01 -7.090412869666515e-01 -1.769732246288753e-01 -4.572486272934330e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.280000000000000e+02 6.810675237761251e-01 -7.090473399641873e-01 -1.769400493162878e-01 -4.572872942819650e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.290000000000000e+02 6.810695827351571e-01 -7.090533923940712e-01 -1.769068683719928e-01 -4.573259374049080e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.300000000000000e+02 6.810716422795037e-01 -7.090594442041902e-01 -1.768736817277645e-01 -4.573645569576060e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.310000000000000e+02 6.810737024046939e-01 -7.090654953984015e-01 -1.768404893845741e-01 -4.574031528538560e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.320000000000000e+02 6.810757630529478e-01 -7.090715460186111e-01 -1.768072913993834e-01 -4.574417248825620e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.330000000000000e+02 6.810778242969725e-01 -7.090775960093723e-01 -1.767740877022290e-01 -4.574802734016340e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.340000000000000e+02 6.810798860660643e-01 -7.090836454226515e-01 -1.767408783616552e-01 -4.575187981177660e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.350000000000000e+02 6.810819484087633e-01 -7.090896942229294e-01 -1.767076633267141e-01 -4.575572991624150e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.360000000000000e+02 6.810840113444374e-01 -7.090957423950847e-01 -1.766744425780280e-01 -4.575957766279200e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.370000000000000e+02 6.810860747875246e-01 -7.091017900007616e-01 -1.766412162019485e-01 -4.576342302466930e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.380000000000000e+02 6.810881388119088e-01 -7.091078369854313e-01 -1.766079841231059e-01 -4.576726602656120e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.390000000000000e+02 6.810902034157582e-01 -7.091138833487657e-01 -1.765747463451501e-01 -4.577110667506850e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.400000000000000e+02 6.810922685419595e-01 -7.091199291347565e-01 -1.765415029183413e-01 -4.577494493299320e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t</ATTLISTList>\n\t</ATT>\n\t<TIL>monkey</TIL>\n\t<GEO>\n\t\t<EFFECTIVETIME>1959-09-18T00:00:00.000000Z</EFFECTIVETIME>\n\t\t<MODELGENERATIONTIME>1959-12-16T00:00:00.000000Z</MODELGENERATIONTIME>\n\t\t<SATID>Imaginary1</SATID>\n\t\t<PRINCIPAL_DISTANCE>\n\t\t\t<GENERATIONTIME>1959-12-05T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<PD>7.949165000000000e+03</PD>\n\t\t</PRINCIPAL_DISTANCE>\n\t\t<OPTICAL_DISTORTION>\n\t\t\t<GENERATIONTIME>1958-01-01T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<POLYORDER>0</POLYORDER>\n\t\t\t<ALIST>0.000000000000000e+00</ALIST>\n\t\t\t<BLIST>0.000000000000000e+00</BLIST>\n\t\t</OPTICAL_DISTORTION>\n\t\t<PERSPECTIVE_CENTER>\n\t\t\t<GENERATIONTIME>1958-01-01T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<CX>0.000000000000000e+00</CX>\n\t\t\t<CY>0.000000000000000e+00</CY>\n\t\t\t<CZ>0.000000000000000e+00</CZ>\n\t\t</PERSPECTIVE_CENTER>\n\t\t<CAMERA_ATTITUDE>\n\t\t\t<GENERATIONTIME>1959-06-08T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<QCS1>0.000000000000000e+00</QCS1>\n\t\t\t<QCS2>0.000000000000000e+00</QCS2>\n\t\t\t<QCS3>0.000000000000000e+00</QCS3>\n\t\t\t<QCS4>1.000000000000000e+00</QCS4>\n\t\t</CAMERA_ATTITUDE>\n\t\t<DETECTOR_MOUNTING>\n\t\t\t<GENERATIONTIME>1959-12-16T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<BAND_P>\n\t\t\t\t<BANDID>P</BANDID>\n\t\t\t\t<DETECTOR_ARRAY>\n\t\t\t\t\t<DETARRID>1</DETARRID>\n\t\t\t\t\t<DETORIGINX>5.372000000000000e-02</DETORIGINX>\n\t\t\t\t\t<DETORIGINY>1.407119300000000e+02</DETORIGINY>\n\t\t\t\t\t<DETROTANGLE>0.000000000000000e+00</DETROTANGLE>\n\t\t\t\t\t<DETPITCH>8.000000000000000e-03</DETPITCH>\n\t\t\t\t</DETECTOR_ARRAY>\n\t\t\t</BAND_P>\n\t\t</DETECTOR_MOUNTING>\n\t</GEO>\n        \t<RPB>\n\t\t<SATID>IMAGINE01</SATID>\n\t\t<BANDID>P</BANDID>\n\t\t<SPECID>RPC00Y</SPECID>\n\t\t<IMAGE>\n\t\t\t<LINEOFFSET>11856</LINEOFFSET>\n\t\t\t<SAMPOFFSET>17564</SAMPOFFSET>\n\t\t\t<LATOFFSET>3.974540000000000e+01</LATOFFSET>\n\t\t\t<LONGOFFSET>-1.052903000000000e+02</LONGOFFSET>\n\t\t\t<HEIGHTOFFSET>2281</HEIGHTOFFSET>\n\t\t\t<LINESCALE>12384</LINESCALE>\n\t\t\t<SAMPSCALE>17927</SAMPSCALE>\n\t\t\t<LATSCALE>1.003000000000000e-01</LATSCALE>\n\t\t\t<LONGSCALE>1.345000000000000e-01</LONGSCALE>\n\t\t\t<HEIGHTSCALE>637</HEIGHTSCALE>\n\t\t\t<LINENUMCOEFList>\n\t\t\t\t<LINENUMCOEF>4.683662000000000e-03 2.746477000000000e-01 -1.231100000000000e+00 4.273921000000000e-02 1.234612000000000e-04 2.079892000000000e-05 2.803797000000000e-05 -1.625616000000000e-03 -3.580082000000000e-03 9.675819999999999e-06 -2.546898000000000e-06 2.437124000000000e-06 2.683441000000000e-05 2.832873000000000e-06 -1.765243000000000e-05 -6.187956999999999e-05 -1.335746000000000e-05 4.754263000000000e-07 8.598401000000000e-06 4.395393000000000e-06</LINENUMCOEF>\n\t\t\t</LINENUMCOEFList>\n\t\t\t<LINEDENCOEFList>\n\t\t\t\t<LINEDENCOEF>1.000000000000000e+00 -6.927463000000000e-04 1.374485000000000e-03 -1.832948000000000e-04 3.793725000000000e-05 -2.426451000000000e-06 5.328107000000000e-06 5.042993000000000e-06 -5.045604000000000e-05 1.005969000000000e-05 -1.014973000000000e-05 3.421277000000000e-06 2.035450000000000e-04 -8.247975000000000e-08 -4.562828000000000e-05 -3.053413000000000e-04 3.611736000000000e-07 1.162165000000000e-06 2.272529000000000e-05 -3.711560000000000e-08</LINEDENCOEF>\n\t\t\t</LINEDENCOEFList>\n\t\t\t<SAMPNUMCOEFList>\n\t\t\t\t<SAMPNUMCOEF>-7.306375000000000e-03 9.830429000000001e-01 3.542948000000000e-03 -1.894230000000000e-02 -6.090531000000000e-04 5.183200000000000e-04 -1.865072000000000e-04 7.436490000000000e-03 -6.180940000000000e-04 -7.676881000000001e-06 -4.251489000000000e-06 3.392046000000000e-05 7.682103000000000e-06 -3.827847000000000e-06 1.743396000000000e-05 -8.450706000000000e-05 -8.998127000000000e-07 7.975684000000000e-06 9.288044000000000e-06 -1.585929000000000e-06</SAMPNUMCOEF>\n\t\t\t</SAMPNUMCOEFList>\n\t\t\t<SAMPDENCOEFList>\n\t\t\t\t<SAMPDENCOEF>1.000000000000000e+00 -1.162718000000000e-04 6.204958000000000e-04 -6.463894000000000e-04 -1.800104000000000e-05 -3.829136000000000e-06 2.878440000000000e-06 1.192222000000000e-05 -1.355693000000000e-05 -5.064440000000000e-06 -4.852090000000000e-08 -4.637834000000000e-08 5.601284000000000e-07 2.741121000000000e-08 -8.104437000000000e-07 7.045655000000000e-07 0.000000000000000e+00 -5.420071000000000e-08 -5.402048000000000e-08 -1.211995000000000e-07</SAMPDENCOEF>\n\t\t\t</SAMPDENCOEFList>\n\t\t</IMAGE>\n\t</RPB>\n</isd>\n"
  },
  {
    "path": "src/asp/Camera/tests/dg_example2.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<isd>\n\t<IMD>\n\t\t<BANDID>P</BANDID>\n\t\t<PANSHARPENALGORITHM>None</PANSHARPENALGORITHM>\n\t\t<NUMROWS>27576</NUMROWS>\n\t\t<NUMCOLUMNS>35170</NUMCOLUMNS>\n\t\t<PRODUCTLEVEL>Stereo 1B</PRODUCTLEVEL>\n\t\t<PRODUCTTYPE>Stereo</PRODUCTTYPE>\n\t\t<NUMBEROFLOOKS>2</NUMBEROFLOOKS>\n\t\t<RADIOMETRICLEVEL>Corrected</RADIOMETRICLEVEL>\n\t\t<BITSPERPIXEL>16</BITSPERPIXEL>\n\t\t<COMPRESSIONTYPE>None</COMPRESSIONTYPE>\n\t\t<OUTPUTFORMAT>GeoTIFF</OUTPUTFORMAT>\n\t\t<IMAGE>\n\t\t\t<SATID>Imaginary1</SATID>\n\t\t\t<MODE>FullSwath</MODE>\n\t\t\t<SCANDIRECTION>Forward</SCANDIRECTION>\n\t\t\t<TLCTIME>1432-11-25T17:40:29.834958Z</TLCTIME>\n\t\t\t<NUMTLC>2</NUMTLC>\n\t\t\t<TLCLISTList>\n\t\t\t\t<TLCLIST>0.000000000000000e+00 0.000000000000000e+00</TLCLIST>\n\t\t\t\t<TLCLIST>2.789200000000000e+04 2.324333000000000e+00</TLCLIST>\n\t\t\t</TLCLISTList>\n\t\t\t<FIRSTLINETIME>1432-11-25T17:40:29.834958Z</FIRSTLINETIME>\n\t\t\t<AVGLINERATE>1.200000000000000e+04</AVGLINERATE>\n\t\t\t<EXPOSUREDURATION>2.666670000000000e-03</EXPOSUREDURATION>\n\t\t\t<MINCOLLECTEDROWGSD>5.080000000000000e-01</MINCOLLECTEDROWGSD>\n\t\t\t<MAXCOLLECTEDROWGSD>5.080000000000000e-01</MAXCOLLECTEDROWGSD>\n\t\t\t<MEANCOLLECTEDROWGSD>5.080000000000000e-01</MEANCOLLECTEDROWGSD>\n\t\t\t<MINCOLLECTEDCOLGSD>5.240000000000000e-01</MINCOLLECTEDCOLGSD>\n\t\t\t<MAXCOLLECTEDCOLGSD>5.250000000000000e-01</MAXCOLLECTEDCOLGSD>\n\t\t\t<MEANCOLLECTEDCOLGSD>5.250000000000000e-01</MEANCOLLECTEDCOLGSD>\n\t\t\t<MEANCOLLECTEDGSD>5.160000000000000e-01</MEANCOLLECTEDGSD>\n\t\t\t<ROWUNCERTAINTY>1.600000000000000e+01</ROWUNCERTAINTY>\n\t\t\t<COLUNCERTAINTY>3.055000000000000e+01</COLUNCERTAINTY>\n\t\t\t<MINSUNAZ>1.621000000000000e+02</MINSUNAZ>\n\t\t\t<MAXSUNAZ>1.621000000000000e+02</MAXSUNAZ>\n\t\t\t<MEANSUNAZ>1.621000000000000e+02</MEANSUNAZ>\n\t\t\t<MINSUNEL>2.760000000000000e+01</MINSUNEL>\n\t\t\t<MAXSUNEL>2.770000000000000e+01</MAXSUNEL>\n\t\t\t<MEANSUNEL>2.760000000000000e+01</MEANSUNEL>\n\t\t\t<MINSATAZ>7.400000000000000e+01</MINSATAZ>\n\t\t\t<MAXSATAZ>8.270000000000000e+01</MAXSATAZ>\n\t\t\t<MEANSATAZ>7.830000000000000e+01</MEANSATAZ>\n\t\t\t<MINSATEL>7.750000000000000e+01</MINSATEL>\n\t\t\t<MAXSATEL>7.820000000000000e+01</MAXSATEL>\n\t\t\t<MEANSATEL>7.790000000000001e+01</MEANSATEL>\n\t\t\t<MININTRACKVIEWANGLE>4.000000000000000e+00</MININTRACKVIEWANGLE>\n\t\t\t<MAXINTRACKVIEWANGLE>4.300000000000000e+00</MAXINTRACKVIEWANGLE>\n\t\t\t<MEANINTRACKVIEWANGLE>4.100000000000000e+00</MEANINTRACKVIEWANGLE>\n\t\t\t<MINCROSSTRACKVIEWANGLE>1.030000000000000e+01</MINCROSSTRACKVIEWANGLE>\n\t\t\t<MAXCROSSTRACKVIEWANGLE>1.070000000000000e+01</MAXCROSSTRACKVIEWANGLE>\n\t\t\t<MEANCROSSTRACKVIEWANGLE>1.050000000000000e+01</MEANCROSSTRACKVIEWANGLE>\n\t\t\t<MINOFFNADIRVIEWANGLE>1.130000000000000e+01</MINOFFNADIRVIEWANGLE>\n\t\t\t<MAXOFFNADIRVIEWANGLE>1.130000000000000e+01</MAXOFFNADIRVIEWANGLE>\n\t\t\t<MEANOFFNADIRVIEWANGLE>1.130000000000000e+01</MEANOFFNADIRVIEWANGLE>\n\t\t\t<PNIIRS>4.600000000000000e+00</PNIIRS>\n\t\t\t<CLOUDCOVER>0.000000000000000e+00</CLOUDCOVER>\n\t\t\t<RESAMPLINGKERNEL>CC</RESAMPLINGKERNEL>\n\t\t\t<TDILEVEL>32</TDILEVEL>\n\t\t\t<POSITIONKNOWLEDGESRC>R</POSITIONKNOWLEDGESRC>\n\t\t\t<ATTITUDEKNOWLEDGESRC>R</ATTITUDEKNOWLEDGESRC>\n\t\t</IMAGE>\n\t</IMD>\n\t<EPH>\n\t\t<SATID>Imaginary1</SATID>\n\t\t<GENERATIONTIME>1432-11-25T19:05:33.862633Z</GENERATIONTIME>\n\t\t<STARTTIME>1432-11-25T17:40:21.387413Z</STARTTIME>\n\t\t<NUMPOINTS>931</NUMPOINTS>\n\t\t<TIMEINTERVAL>2.000000000000000e-02</TIMEINTERVAL>\n\t\t<EPHEMLISTList>\n\t\t\t<EPHEMLIST>1.000000000000000e+00 -1.264786099517881e+06 -5.079788984103872e+06 4.447110266754559e+06 -2.810824796318426e+03 -4.317015677790741e+03 -5.713803070374209e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.000000000000000e+00 -1.264842315405748e+06 -5.079875322324694e+06 4.446995990591982e+06 -2.810806474997520e+03 -4.316883162896974e+03 -5.713912662339114e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.000000000000000e+00 -1.264898530934286e+06 -5.079961657908056e+06 4.446881712220941e+06 -2.810788152274015e+03 -4.316750645754544e+03 -5.714022251482255e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.000000000000000e+00 -1.264954746092496e+06 -5.080047990834096e+06 4.446767431667244e+06 -2.810769828231033e+03 -4.316618126363581e+03 -5.714131837768030e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.000000000000000e+00 -1.265010960885827e+06 -5.080134321112684e+06 4.446653148918072e+06 -2.810751502044848e+03 -4.316485605127642e+03 -5.714241421236855e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.000000000000000e+00 -1.265067175314160e+06 -5.080220648743652e+06 4.446538863973644e+06 -2.810733173525062e+03 -4.316353081892289e+03 -5.714351002089194e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.000000000000000e+00 -1.265123389377621e+06 -5.080306973727209e+06 4.446424576833691e+06 -2.810714844240871e+03 -4.316220556562411e+03 -5.714460579728314e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.000000000000000e+00 -1.265179603054010e+06 -5.080393296023355e+06 4.446310287550225e+06 -2.810696513066640e+03 -4.316088032753253e+03 -5.714570151846040e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.000000000000000e+00 -1.265235816398463e+06 -5.080479615731570e+06 4.446195995993895e+06 -2.810678179875879e+03 -4.315955501355695e+03 -5.714679725523418e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.000000000000000e+01 -1.265292029366854e+06 -5.080565932772273e+06 4.446081702268185e+06 -2.810659844721672e+03 -4.315822969832768e+03 -5.714789294980564e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.100000000000000e+01 -1.265348241970073e+06 -5.080652247165151e+06 4.445967406347499e+06 -2.810641507489429e+03 -4.315690436290932e+03 -5.714898861727119e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.200000000000000e+01 -1.265404454219244e+06 -5.080738558930263e+06 4.445853108205749e+06 -2.810623168904423e+03 -4.315557898674017e+03 -5.715008427039278e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.300000000000000e+01 -1.265460666081250e+06 -5.080824868007886e+06 4.445738807920609e+06 -2.810604829044986e+03 -4.315425362725256e+03 -5.715117986454004e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.400000000000000e+01 -1.265516877599978e+06 -5.080911174477259e+06 4.445624505389022e+06 -2.810586485952013e+03 -4.315292821201429e+03 -5.715227546394125e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.500000000000000e+01 -1.265573088742548e+06 -5.080997478279040e+06 4.445510200688178e+06 -2.810568142505838e+03 -4.315160279292229e+03 -5.715337101627397e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.600000000000000e+01 -1.265629299519852e+06 -5.081083779432915e+06 4.445395893792474e+06 -2.810549796960044e+03 -4.315027735297114e+03 -5.715446654210965e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.700000000000000e+01 -1.265685509909765e+06 -5.081170077899013e+06 4.445281584753774e+06 -2.810531449894400e+03 -4.314895193212630e+03 -5.715556200815625e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.800000000000000e+01 -1.265741719978424e+06 -5.081256373796647e+06 4.445167273416875e+06 -2.810513100348325e+03 -4.314762641286388e+03 -5.715665750913574e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.900000000000000e+01 -1.265797929648705e+06 -5.081342666986700e+06 4.445052959962756e+06 -2.810494749920369e+03 -4.314630093120733e+03 -5.715775293333953e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.000000000000000e+01 -1.265854138986493e+06 -5.081428957588099e+06 4.444938644236696e+06 -2.810476395696284e+03 -4.314497537389122e+03 -5.715884838053921e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.100000000000000e+01 -1.265910347914917e+06 -5.081515245462115e+06 4.444824326419187e+06 -2.810458042802524e+03 -4.314364986645493e+03 -5.715994373206236e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.200000000000000e+01 -1.265966556477778e+06 -5.081601530687852e+06 4.444710006407319e+06 -2.810439686865067e+03 -4.314232434167718e+03 -5.716103905840911e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.300000000000000e+01 -1.266022764719201e+06 -5.081687813344901e+06 4.444595684097529e+06 -2.810421328533046e+03 -4.314099872003807e+03 -5.716213441810765e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.400000000000000e+01 -1.266078972573074e+06 -5.081774093314022e+06 4.444481359644975e+06 -2.810402968760773e+03 -4.313967311684031e+03 -5.716322971819766e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.500000000000000e+01 -1.266135180072279e+06 -5.081860370654580e+06 4.444367032972403e+06 -2.810384606302935e+03 -4.313834747447174e+03 -5.716432500840567e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.600000000000000e+01 -1.266191387172940e+06 -5.081946645287407e+06 4.444252704182852e+06 -2.810366244440468e+03 -4.313702186498078e+03 -5.716542021919487e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.700000000000000e+01 -1.266247593929943e+06 -5.082032917311561e+06 4.444138373147404e+06 -2.810347879319712e+03 -4.313569619945310e+03 -5.716651543554642e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.800000000000000e+01 -1.266303800354173e+06 -5.082119186746714e+06 4.444024039840457e+06 -2.810329510837939e+03 -4.313437045814743e+03 -5.716761067310840e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.900000000000000e+01 -1.266360006379752e+06 -5.082205453474016e+06 4.443909704416695e+06 -2.810311142583800e+03 -4.313304475071472e+03 -5.716870583205785e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.000000000000000e+01 -1.266416212006573e+06 -5.082291717493303e+06 4.443795366876342e+06 -2.810292773728662e+03 -4.313171907873805e+03 -5.716980091471785e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.100000000000000e+01 -1.266472417300510e+06 -5.082377978923464e+06 4.443681027064656e+06 -2.810274401125877e+03 -4.313039333166981e+03 -5.717089601970699e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.200000000000000e+01 -1.266528622239692e+06 -5.082464237725020e+06 4.443566685033014e+06 -2.810256027266850e+03 -4.312906754237058e+03 -5.717199111106711e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.300000000000000e+01 -1.266584826801925e+06 -5.082550493857998e+06 4.443452340833462e+06 -2.810237651244327e+03 -4.312774175409240e+03 -5.717308615934208e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.400000000000000e+01 -1.266641031009329e+06 -5.082636747362289e+06 4.443337994414066e+06 -2.810219273755713e+03 -4.312641592436413e+03 -5.717418119428040e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.500000000000000e+01 -1.266697234828801e+06 -5.082722998178212e+06 4.443223645852537e+06 -2.810200895235276e+03 -4.312509011308006e+03 -5.717527616788339e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.600000000000000e+01 -1.266753438282212e+06 -5.082809246345269e+06 4.443109295097439e+06 -2.810182514121101e+03 -4.312376428166257e+03 -5.717637111653935e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.700000000000000e+01 -1.266809641402691e+06 -5.082895491923187e+06 4.442994942071002e+06 -2.810164131262554e+03 -4.312243837070509e+03 -5.717746608238745e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.800000000000000e+01 -1.266865844135124e+06 -5.082981734812613e+06 4.442880586902601e+06 -2.810145746647177e+03 -4.312111247863489e+03 -5.717856098965532e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.900000000000000e+01 -1.266922046501396e+06 -5.083067975053054e+06 4.442766229540798e+06 -2.810127359992593e+03 -4.311978656813126e+03 -5.717965586829900e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.000000000000000e+01 -1.266978248490632e+06 -5.083154212624881e+06 4.442651870011152e+06 -2.810108972973550e+03 -4.311846065045994e+03 -5.718075070249666e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.100000000000000e+01 -1.267034450124716e+06 -5.083240447567604e+06 4.442537508262213e+06 -2.810090583290125e+03 -4.311713469542280e+03 -5.718184552532036e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.200000000000000e+01 -1.267090651381533e+06 -5.083326679841385e+06 4.442423144345879e+06 -2.810072191835382e+03 -4.311580874183983e+03 -5.718294030306070e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.300000000000000e+01 -1.267146852305201e+06 -5.083412909525770e+06 4.442308778158534e+06 -2.810053798073835e+03 -4.311448270817283e+03 -5.718403510079851e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.400000000000000e+01 -1.267203052829617e+06 -5.083499136501586e+06 4.442194409855405e+06 -2.810035403514999e+03 -4.311315671109256e+03 -5.718512982224186e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.500000000000000e+01 -1.267259252998658e+06 -5.083585360847999e+06 4.442080039333372e+06 -2.810017006268665e+03 -4.311183067523140e+03 -5.718622453349666e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.600000000000000e+01 -1.267315452812447e+06 -5.083671582565223e+06 4.441965666592167e+06 -2.809998607777927e+03 -4.311050459860421e+03 -5.718731922993380e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.700000000000000e+01 -1.267371652226799e+06 -5.083757801573637e+06 4.441851291735511e+06 -2.809980207828703e+03 -4.310917855915009e+03 -5.718841385245355e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.800000000000000e+01 -1.267427851285829e+06 -5.083844017952774e+06 4.441736914659799e+06 -2.809961806814529e+03 -4.310785247864109e+03 -5.718950845961423e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.900000000000000e+01 -1.267484050022416e+06 -5.083930231761965e+06 4.441622535287729e+06 -2.809943401578330e+03 -4.310652630390795e+03 -5.719060310581365e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.000000000000000e+01 -1.267540248337466e+06 -5.084016442822562e+06 4.441508153852057e+06 -2.809924996390579e+03 -4.310520020289421e+03 -5.719169764353683e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.100000000000000e+01 -1.267596446308086e+06 -5.084102651273580e+06 4.441393770171655e+06 -2.809906589652447e+03 -4.310387404024188e+03 -5.719279218381498e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.200000000000000e+01 -1.267652643945153e+06 -5.084188857134701e+06 4.441279384220896e+06 -2.809888178985893e+03 -4.310254780541284e+03 -5.719388674489735e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.300000000000000e+01 -1.267708841182575e+06 -5.084275060286768e+06 4.441164996155038e+06 -2.809869767737591e+03 -4.310122160638734e+03 -5.719498122938782e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.400000000000000e+01 -1.267765038042466e+06 -5.084361260769644e+06 4.441050605922125e+06 -2.809851355908731e+03 -4.309989539950772e+03 -5.719607567089182e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.500000000000000e+01 -1.267821234535717e+06 -5.084447458603008e+06 4.440936213496549e+06 -2.809832942185753e+03 -4.309856917817999e+03 -5.719717008008787e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.600000000000000e+01 -1.267877430673199e+06 -5.084533653806511e+06 4.440821818852678e+06 -2.809814525355438e+03 -4.309724291587392e+03 -5.719826448256853e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.700000000000000e+01 -1.267933626444043e+06 -5.084619846360535e+06 4.440707422016089e+06 -2.809796107921289e+03 -4.309591663131126e+03 -5.719935885324782e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.800000000000000e+01 -1.267989821870050e+06 -5.084706036304440e+06 4.440593022935477e+06 -2.809777686901722e+03 -4.309459029079797e+03 -5.720045323076884e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.900000000000000e+01 -1.268046016907355e+06 -5.084792223559134e+06 4.440478621713941e+06 -2.809759265881616e+03 -4.309326396568026e+03 -5.720154754493913e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.000000000000000e+01 -1.268102211544850e+06 -5.084878408104619e+06 4.440364218377544e+06 -2.809740844051478e+03 -4.309193767459494e+03 -5.720264178487406e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.100000000000000e+01 -1.268158405848394e+06 -5.084964590059689e+06 4.440249812771450e+06 -2.809722418534095e+03 -4.309061131118909e+03 -5.720373604468043e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.200000000000000e+01 -1.268214599796122e+06 -5.085050769384897e+06 4.440135404947073e+06 -2.809703991915452e+03 -4.308928490460925e+03 -5.720483029090086e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.300000000000000e+01 -1.268270793365923e+06 -5.085136946040430e+06 4.440020994956316e+06 -2.809685563303193e+03 -4.308795849732146e+03 -5.720592449466522e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.400000000000000e+01 -1.268326986590672e+06 -5.085223120085591e+06 4.439906582721873e+06 -2.809667131653343e+03 -4.308663203505550e+03 -5.720701870217842e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.500000000000000e+01 -1.268383179404522e+06 -5.085309291401653e+06 4.439792168398536e+06 -2.809648701064403e+03 -4.308530562188988e+03 -5.720811281589628e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.600000000000000e+01 -1.268439371884320e+06 -5.085395460127207e+06 4.439677751805611e+06 -2.809630266749600e+03 -4.308397913579003e+03 -5.720920695011020e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.700000000000000e+01 -1.268495563985975e+06 -5.085481626182796e+06 4.439563333046701e+06 -2.809611830788402e+03 -4.308265264807369e+03 -5.721030104108968e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.800000000000000e+01 -1.268551755698614e+06 -5.085567789548808e+06 4.439448912147379e+06 -2.809593394792175e+03 -4.308132617213363e+03 -5.721139507166661e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.900000000000000e+01 -1.268607947099088e+06 -5.085653950363824e+06 4.439334488926941e+06 -2.809574954355781e+03 -4.307999958826846e+03 -5.721248915269092e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.000000000000000e+01 -1.268664138088323e+06 -5.085740108449296e+06 4.439220063618226e+06 -2.809556513370168e+03 -4.307867305649527e+03 -5.721358314449552e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.100000000000000e+01 -1.268720328721427e+06 -5.085826263904526e+06 4.439105636091731e+06 -2.809538071491233e+03 -4.307734648378881e+03 -5.721467712009930e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.200000000000000e+01 -1.268776518976205e+06 -5.085912416689591e+06 4.438991206399532e+06 -2.809519626843446e+03 -4.307601991138831e+03 -5.721577105577953e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.300000000000000e+01 -1.268832708896767e+06 -5.085998566883973e+06 4.438876774437963e+06 -2.809501180355492e+03 -4.307469326054065e+03 -5.721686500814139e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.400000000000000e+01 -1.268888898395041e+06 -5.086084714328958e+06 4.438762340414037e+06 -2.809482733863016e+03 -4.307336668179046e+03 -5.721795885359143e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.500000000000000e+01 -1.268945087569858e+06 -5.086170859202744e+06 4.438647904095335e+06 -2.809464283248959e+03 -4.307204001256327e+03 -5.721905273469492e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.600000000000000e+01 -1.269001276377368e+06 -5.086257001426257e+06 4.438533465584976e+06 -2.809445831785054e+03 -4.307071331673892e+03 -5.722014658838339e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.700000000000000e+01 -1.269057464795468e+06 -5.086343140959717e+06 4.438419024934883e+06 -2.809427379090407e+03 -4.306938664166779e+03 -5.722124037987427e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.800000000000000e+01 -1.269113652868017e+06 -5.086429277882207e+06 4.438304582041877e+06 -2.809408923215822e+03 -4.306805990913729e+03 -5.722233417760982e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.900000000000000e+01 -1.269169840562159e+06 -5.086515412134496e+06 4.438190136983231e+06 -2.809390466919817e+03 -4.306673317082030e+03 -5.722342793010550e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.000000000000000e+01 -1.269226027866784e+06 -5.086601543696600e+06 4.438075689785029e+06 -2.809372009415806e+03 -4.306540645129557e+03 -5.722452162182052e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.100000000000000e+01 -1.269282214847742e+06 -5.086687672687243e+06 4.437961240292369e+06 -2.809353547788733e+03 -4.306407963903553e+03 -5.722561535091264e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.200000000000000e+01 -1.269338401428197e+06 -5.086773798967930e+06 4.437846788685956e+06 -2.809335086690340e+03 -4.306275285774827e+03 -5.722670900246152e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.300000000000000e+01 -1.269394587640937e+06 -5.086859922597822e+06 4.437732334888606e+06 -2.809316622859045e+03 -4.306142606101705e+03 -5.722780262604831e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.400000000000000e+01 -1.269450773530062e+06 -5.086946043656360e+06 4.437617878796636e+06 -2.809298156516355e+03 -4.306009916442046e+03 -5.722889628561510e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.500000000000000e+01 -1.269506958996517e+06 -5.087032161965087e+06 4.437503420642952e+06 -2.809279690115390e+03 -4.305877234165499e+03 -5.722998983720555e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.600000000000000e+01 -1.269563144128128e+06 -5.087118277682316e+06 4.437388960220939e+06 -2.809261220042929e+03 -4.305744544537015e+03 -5.723108340946651e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.700000000000000e+01 -1.269619328870058e+06 -5.087204390709208e+06 4.437274497659598e+06 -2.809242750226366e+03 -4.305611856093553e+03 -5.723217692005430e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.800000000000000e+01 -1.269675513266165e+06 -5.087290501124832e+06 4.437160032855736e+06 -2.809224277241484e+03 -4.305479162200686e+03 -5.723327043454318e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.900000000000000e+01 -1.269731697283349e+06 -5.087376608869601e+06 4.437045565887131e+06 -2.809205802275862e+03 -4.305346468272915e+03 -5.723436390626418e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.000000000000000e+01 -1.269787880910747e+06 -5.087462713923908e+06 4.436931096779373e+06 -2.809187327593699e+03 -4.305213775520439e+03 -5.723545731627531e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.100000000000000e+01 -1.269844064214200e+06 -5.087548816406441e+06 4.436816625377537e+06 -2.809168848859477e+03 -4.305081073579920e+03 -5.723655076267451e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.200000000000000e+01 -1.269900247138628e+06 -5.087634916217989e+06 4.436702151811131e+06 -2.809150368319726e+03 -4.304948371539586e+03 -5.723764416605889e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.300000000000000e+01 -1.269956429662169e+06 -5.087721013319156e+06 4.436587676131604e+06 -2.809131888202458e+03 -4.304815672788728e+03 -5.723873749090171e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.400000000000000e+01 -1.270012611839674e+06 -5.087807107808799e+06 4.436473198209877e+06 -2.809113405101313e+03 -4.304682968181095e+03 -5.723983082198250e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.500000000000000e+01 -1.270068793649039e+06 -5.087893199647150e+06 4.436358718097894e+06 -2.809094919668286e+03 -4.304550262031348e+03 -5.724092412337493e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.600000000000000e+01 -1.270124975079402e+06 -5.087979288814602e+06 4.436244235821241e+06 -2.809076434008208e+03 -4.304417555044343e+03 -5.724201738070020e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.700000000000000e+01 -1.270181156163536e+06 -5.088065375370287e+06 4.436129751302720e+06 -2.809057944507493e+03 -4.304284842895786e+03 -5.724311064256611e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.800000000000000e+01 -1.270237336879588e+06 -5.088151459274797e+06 4.436015264593781e+06 -2.809039454404493e+03 -4.304152128222768e+03 -5.724420387492163e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.900000000000000e+01 -1.270293517205456e+06 -5.088237540488359e+06 4.435900775746365e+06 -2.809020962810196e+03 -4.304019415273579e+03 -5.724529704892446e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.000000000000000e+02 -1.270349697184994e+06 -5.088323619090023e+06 4.435786284657248e+06 -2.809002468112682e+03 -4.303886696775628e+03 -5.724639022729705e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.010000000000000e+02 -1.270405876785352e+06 -5.088409695020592e+06 4.435671791403744e+06 -2.808983973233550e+03 -4.303753977838130e+03 -5.724748335835634e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.020000000000000e+02 -1.270462056028393e+06 -5.088495768319494e+06 4.435557295934346e+06 -2.808965475371246e+03 -4.303621255096309e+03 -5.724857647987395e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.030000000000000e+02 -1.270518234881031e+06 -5.088581838927172e+06 4.435442798326869e+06 -2.808946976337203e+03 -4.303488534336801e+03 -5.724966953969896e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.040000000000000e+02 -1.270574413354383e+06 -5.088667906863631e+06 4.435328298555175e+06 -2.808928476979827e+03 -4.303355812701435e+03 -5.725076255616985e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.050000000000000e+02 -1.270630591492299e+06 -5.088753972207901e+06 4.435213796516028e+06 -2.808909973965505e+03 -4.303223083933624e+03 -5.725185559152228e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.060000000000000e+02 -1.270686769283668e+06 -5.088840034940020e+06 4.435099292235506e+06 -2.808891467711560e+03 -4.303090349479323e+03 -5.725294863287120e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.070000000000000e+02 -1.270742946640692e+06 -5.088926094901802e+06 4.434984785920267e+06 -2.808872963613928e+03 -4.302957623680928e+03 -5.725404154712483e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.080000000000000e+02 -1.270799123662088e+06 -5.089012152271142e+06 4.434870277337902e+06 -2.808854455193882e+03 -4.302824890545871e+03 -5.725513448465646e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.090000000000000e+02 -1.270855300315015e+06 -5.089098206988857e+06 4.434755766565740e+06 -2.808835946112618e+03 -4.302692155210366e+03 -5.725622739044242e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.100000000000000e+02 -1.270911476610347e+06 -5.089184259074580e+06 4.434641253578129e+06 -2.808817434371103e+03 -4.302559416063651e+03 -5.725732028535845e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.110000000000000e+02 -1.270967652525982e+06 -5.089270308488543e+06 4.434526738427024e+06 -2.808798920663241e+03 -4.302426676879089e+03 -5.725841313748408e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.120000000000000e+02 -1.271023828073037e+06 -5.089356355250759e+06 4.434412221086292e+06 -2.808780406191308e+03 -4.302293935268939e+03 -5.725950596003044e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.130000000000000e+02 -1.271080003229422e+06 -5.089442399321473e+06 4.434297701607881e+06 -2.808761890508727e+03 -4.302161195506334e+03 -5.726059872210150e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.140000000000000e+02 -1.271136178049969e+06 -5.089528440799486e+06 4.434183179862677e+06 -2.808743371175632e+03 -4.302028448232129e+03 -5.726169150591786e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.150000000000000e+02 -1.271192352490841e+06 -5.089614479605833e+06 4.434068655953879e+06 -2.808724851465368e+03 -4.301895700555016e+03 -5.726278424298349e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.160000000000000e+02 -1.271248526562913e+06 -5.089700515760136e+06 4.433954129855838e+06 -2.808706329517224e+03 -4.301762950850302e+03 -5.726387695368921e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.170000000000000e+02 -1.271304700288049e+06 -5.089786549301823e+06 4.433839601517036e+06 -2.808687804370239e+03 -4.301630195820561e+03 -5.726496966742877e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.180000000000000e+02 -1.271360873600438e+06 -5.089872580112343e+06 4.433725071092417e+06 -2.808669280271973e+03 -4.301497445453605e+03 -5.726606228947875e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.190000000000000e+02 -1.271417046576891e+06 -5.089958608330074e+06 4.433610538401117e+06 -2.808650752688519e+03 -4.301364687889782e+03 -5.726715493014407e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.200000000000000e+02 -1.271473219195310e+06 -5.090044633915263e+06 4.433496003495088e+06 -2.808632222149665e+03 -4.301231926511977e+03 -5.726824756120797e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.210000000000000e+02 -1.271529391378902e+06 -5.090130656729594e+06 4.433381466555169e+06 -2.808613693870955e+03 -4.301099173868778e+03 -5.726934006419496e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.220000000000000e+02 -1.271585563259335e+06 -5.090216677010252e+06 4.433266927271275e+06 -2.808595159811802e+03 -4.300966408420080e+03 -5.727043263859106e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.230000000000000e+02 -1.271641734726846e+06 -5.090302694559548e+06 4.433152385901858e+06 -2.808576626984931e+03 -4.300833647755335e+03 -5.727152511960103e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.240000000000000e+02 -1.271697905869232e+06 -5.090388709535629e+06 4.433037842240154e+06 -2.808558089985380e+03 -4.300700878095401e+03 -5.727261763593659e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.250000000000000e+02 -1.271754076631431e+06 -5.090474721839387e+06 4.432923296415754e+06 -2.808539551243588e+03 -4.300568108315726e+03 -5.727371010916506e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.260000000000000e+02 -1.271810247013570e+06 -5.090560731471027e+06 4.432808748428377e+06 -2.808521012178646e+03 -4.300435337850576e+03 -5.727480253758918e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.270000000000000e+02 -1.271866417004545e+06 -5.090646738410607e+06 4.432694198304136e+06 -2.808502471742330e+03 -4.300302569596246e+03 -5.727589490345700e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.280000000000000e+02 -1.271922586659181e+06 -5.090732742756883e+06 4.432579645913859e+06 -2.808483927685696e+03 -4.300169793517060e+03 -5.727698729331292e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.290000000000000e+02 -1.271978755900687e+06 -5.090818744371566e+06 4.432465091438416e+06 -2.808465384674187e+03 -4.300037022594242e+03 -5.727807958774191e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.300000000000000e+02 -1.272034924838829e+06 -5.090904743452343e+06 4.432350534619254e+06 -2.808446836705292e+03 -4.299904238558184e+03 -5.727917195240054e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.310000000000000e+02 -1.272091093374596e+06 -5.090990739820985e+06 4.432235975689492e+06 -2.808428287760383e+03 -4.299771458527577e+03 -5.728026423906076e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.320000000000000e+02 -1.272147261541081e+06 -5.091076733537048e+06 4.432121414571218e+06 -2.808409738166180e+03 -4.299638675653327e+03 -5.728135649885918e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.330000000000000e+02 -1.272203429316108e+06 -5.091162724560685e+06 4.432006851316583e+06 -2.808391186566565e+03 -4.299505895151526e+03 -5.728244869756937e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.340000000000000e+02 -1.272259596765735e+06 -5.091248713010789e+06 4.431892285770038e+06 -2.808372632581864e+03 -4.299373104574188e+03 -5.728354093225494e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.350000000000000e+02 -1.272315763801943e+06 -5.091334698728951e+06 4.431777718138835e+06 -2.808354078098514e+03 -4.299240319766618e+03 -5.728463307339507e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.360000000000000e+02 -1.272371930523500e+06 -5.091420681893026e+06 4.431663148190278e+06 -2.808335518866476e+03 -4.299107523633264e+03 -5.728572527014504e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.370000000000000e+02 -1.272428096820662e+06 -5.091506662305417e+06 4.431548576182900e+06 -2.808316961482898e+03 -4.298974734451152e+03 -5.728681735431191e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.380000000000000e+02 -1.272484262803182e+06 -5.091592640163762e+06 4.431434001858108e+06 -2.808298399234457e+03 -4.298841934061372e+03 -5.728790949366964e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.390000000000000e+02 -1.272540428361076e+06 -5.091678615270095e+06 4.431319425474942e+06 -2.808279837225609e+03 -4.298709141222232e+03 -5.728900152270110e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.400000000000000e+02 -1.272596593560393e+06 -5.091764587743303e+06 4.431204846877832e+06 -2.808261273950000e+03 -4.298576343715313e+03 -5.729009354148136e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.410000000000000e+02 -1.272652758412001e+06 -5.091850557603001e+06 4.431090266041128e+06 -2.808242707430403e+03 -4.298443541276833e+03 -5.729118556043990e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.420000000000000e+02 -1.272708922882824e+06 -5.091936524789680e+06 4.430975683042685e+06 -2.808224139125018e+03 -4.298310738133823e+03 -5.729227754097287e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.430000000000000e+02 -1.272765086962004e+06 -5.092022489283781e+06 4.430861097908126e+06 -2.808205571097253e+03 -4.298177936854327e+03 -5.729336945462373e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.440000000000000e+02 -1.272821250693369e+06 -5.092108451164241e+06 4.430746510534130e+06 -2.808186999707599e+03 -4.298045129556700e+03 -5.729446137727962e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.450000000000000e+02 -1.272877414076802e+06 -5.092194410430898e+06 4.430631920920918e+06 -2.808168425125075e+03 -4.297912317120220e+03 -5.729555330147854e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.460000000000000e+02 -1.272933577046516e+06 -5.092280366965297e+06 4.430517329223522e+06 -2.808149851913605e+03 -4.297779509195067e+03 -5.729664513385762e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.470000000000000e+02 -1.272989739679211e+06 -5.092366320905578e+06 4.430402735261138e+06 -2.808131274214904e+03 -4.297646694256461e+03 -5.729773698764903e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.480000000000000e+02 -1.273045901953044e+06 -5.092452272212396e+06 4.430288139085265e+06 -2.808112695479753e+03 -4.297513875242731e+03 -5.729882882565703e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.490000000000000e+02 -1.273102063812975e+06 -5.092538220786726e+06 4.430173540825544e+06 -2.808094116389107e+03 -4.297381061496499e+03 -5.729992057340233e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.500000000000000e+02 -1.273158225324791e+06 -5.092624166747034e+06 4.430058940326887e+06 -2.808075533840181e+03 -4.297248242258061e+03 -5.730101232652306e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.510000000000000e+02 -1.273214386477643e+06 -5.092710110073756e+06 4.429944337614905e+06 -2.808056950356278e+03 -4.297115418831549e+03 -5.730210406429376e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.520000000000000e+02 -1.273270547249440e+06 -5.092796050727184e+06 4.429829732741589e+06 -2.808038364863763e+03 -4.296982595274133e+03 -5.730319576019688e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.530000000000000e+02 -1.273326707651049e+06 -5.092881988726921e+06 4.429715125681278e+06 -2.808019777259476e+03 -4.296849769908806e+03 -5.730428742751956e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.540000000000000e+02 -1.273382867682599e+06 -5.092967924073176e+06 4.429600516433698e+06 -2.808001188756169e+03 -4.296716942020253e+03 -5.730537906658468e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.550000000000000e+02 -1.273439027343973e+06 -5.093053856765786e+06 4.429485904999069e+06 -2.807982598068004e+03 -4.296584112463997e+03 -5.730647067630631e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.560000000000000e+02 -1.273495186635057e+06 -5.093139786804584e+06 4.429371291377611e+06 -2.807964005169632e+03 -4.296451280910513e+03 -5.730756225931639e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.570000000000000e+02 -1.273551345544987e+06 -5.093225714170006e+06 4.429256675594943e+06 -2.807945411803652e+03 -4.296318448766362e+03 -5.730865379743329e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.580000000000000e+02 -1.273607504117514e+06 -5.093311638940845e+06 4.429142057547886e+06 -2.807926814437975e+03 -4.296185609502259e+03 -5.730974535568023e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.590000000000000e+02 -1.273663662275864e+06 -5.093397560978917e+06 4.429027437417408e+06 -2.807908218187518e+03 -4.296052775111347e+03 -5.731083682046054e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.600000000000000e+02 -1.273719820096815e+06 -5.093483480422441e+06 4.428912815022484e+06 -2.807889618176531e+03 -4.295919933285127e+03 -5.731192830676625e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.610000000000000e+02 -1.273775977536316e+06 -5.093569397192182e+06 4.428798190466908e+06 -2.807871016368312e+03 -4.295787091589817e+03 -5.731301974830719e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.620000000000000e+02 -1.273832134594488e+06 -5.093655311288344e+06 4.428683563750402e+06 -2.807852414303479e+03 -4.295654249150488e+03 -5.731411114523587e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.630000000000000e+02 -1.273888291293188e+06 -5.093741222750296e+06 4.428568934821409e+06 -2.807833809496610e+03 -4.295521403233732e+03 -5.731520252904827e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.640000000000000e+02 -1.273944447632299e+06 -5.093827131577872e+06 4.428454303680142e+06 -2.807815202040687e+03 -4.295388553277328e+03 -5.731629390365166e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.650000000000000e+02 -1.274000603589976e+06 -5.093913037731747e+06 4.428339670378117e+06 -2.807796594109516e+03 -4.295255702997776e+03 -5.731738523135041e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.660000000000000e+02 -1.274056759177090e+06 -5.093998941231521e+06 4.428225034889663e+06 -2.807777984092368e+03 -4.295122850788379e+03 -5.731847653129345e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.670000000000000e+02 -1.274112914404509e+06 -5.094084842096795e+06 4.428110397189104e+06 -2.807759371307670e+03 -4.294989994847414e+03 -5.731956782017018e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.680000000000000e+02 -1.274169069250389e+06 -5.094170740288246e+06 4.427995757327959e+06 -2.807740758136357e+03 -4.294857138362156e+03 -5.732065906346094e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.690000000000000e+02 -1.274225223736587e+06 -5.094256635845237e+06 4.427881115254654e+06 -2.807722142421061e+03 -4.294724278137423e+03 -5.732175029479424e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.700000000000000e+02 -1.274281377830028e+06 -5.094342528708315e+06 4.427766471047102e+06 -2.807703525086996e+03 -4.294591419694576e+03 -5.732284146797504e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.710000000000000e+02 -1.274337531552810e+06 -5.094428418917213e+06 4.427651824653240e+06 -2.807684907207368e+03 -4.294458558937557e+03 -5.732393260979654e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.720000000000000e+02 -1.274393684915720e+06 -5.094514306491401e+06 4.427537176047550e+06 -2.807666285997649e+03 -4.294325694583084e+03 -5.732502374191384e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.730000000000000e+02 -1.274449837896916e+06 -5.094600191391561e+06 4.427422525281562e+06 -2.807647664615482e+03 -4.294192829642968e+03 -5.732611482785661e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.740000000000000e+02 -1.274505990529233e+06 -5.094686073676818e+06 4.427307872277792e+06 -2.807629039861279e+03 -4.294059959178139e+03 -5.732720591902031e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.750000000000000e+02 -1.274562142779606e+06 -5.094771953287717e+06 4.427193217114165e+06 -2.807610413489984e+03 -4.293927088778797e+03 -5.732829696516580e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.760000000000000e+02 -1.274618294659141e+06 -5.094857830244228e+06 4.427078559764505e+06 -2.807591786246917e+03 -4.293794215696734e+03 -5.732938798415722e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.770000000000000e+02 -1.274674446167728e+06 -5.094943704546191e+06 4.426963900229036e+06 -2.807573156842665e+03 -4.293661341241511e+03 -5.733047897145309e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.780000000000000e+02 -1.274730597294261e+06 -5.095029576173674e+06 4.426849238533875e+06 -2.807554525492817e+03 -4.293528466144808e+03 -5.733156992053981e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.790000000000000e+02 -1.274786748082799e+06 -5.095115445205918e+06 4.426734574575149e+06 -2.807535892060720e+03 -4.293395583552917e+03 -5.733266088443524e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.800000000000000e+02 -1.274842898456352e+06 -5.095201311504458e+06 4.426619908534388e+06 -2.807517258234596e+03 -4.293262706287474e+03 -5.733375175787056e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.810000000000000e+02 -1.274899048469713e+06 -5.095287175167918e+06 4.426505240282304e+06 -2.807498621667551e+03 -4.293129825356593e+03 -5.733484261961319e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.820000000000000e+02 -1.274955198112025e+06 -5.095373036176745e+06 4.426390569844528e+06 -2.807479984299815e+03 -4.292996942018704e+03 -5.733593345179142e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.830000000000000e+02 -1.275011347427022e+06 -5.095458894609663e+06 4.426275897117832e+06 -2.807461342350199e+03 -4.292864049720257e+03 -5.733702432059876e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.840000000000000e+02 -1.275067496337955e+06 -5.095544750328598e+06 4.426161222283258e+06 -2.807442701122513e+03 -4.292731160164295e+03 -5.733811511397959e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.850000000000000e+02 -1.275123644855691e+06 -5.095630603353149e+06 4.426046545315136e+06 -2.807424058452137e+03 -4.292598272892506e+03 -5.733920584464126e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.860000000000000e+02 -1.275179793046004e+06 -5.095716453801664e+06 4.425931866058256e+06 -2.807405411660381e+03 -4.292465376111520e+03 -5.734029661416482e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.870000000000000e+02 -1.275235940821164e+06 -5.095802301516329e+06 4.425817184719581e+06 -2.807386765972007e+03 -4.292332484402948e+03 -5.734138728883048e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.880000000000000e+02 -1.275292088268912e+06 -5.095888146654999e+06 4.425702501092096e+06 -2.807368116136796e+03 -4.292199583458286e+03 -5.734247800037139e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.890000000000000e+02 -1.275348235312259e+06 -5.095973989079242e+06 4.425587815357356e+06 -2.807349465568690e+03 -4.292066686062791e+03 -5.734356863650864e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.900000000000000e+02 -1.275404382017219e+06 -5.096059828907772e+06 4.425473127359651e+06 -2.807330812620085e+03 -4.291933780792340e+03 -5.734465929160311e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.910000000000000e+02 -1.275460528306811e+06 -5.096145666002175e+06 4.425358437280552e+06 -2.807312159540496e+03 -4.291800881016951e+03 -5.734574985386286e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.920000000000000e+02 -1.275516674246801e+06 -5.096231500480780e+06 4.425243744964837e+06 -2.807293503005624e+03 -4.291667975672573e+03 -5.734684042201065e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.930000000000000e+02 -1.275572819826338e+06 -5.096317332324047e+06 4.425129050438142e+06 -2.807274845483510e+03 -4.291535066161007e+03 -5.734793097484235e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.940000000000000e+02 -1.275628965023340e+06 -5.096403161492314e+06 4.425014353752498e+06 -2.807256185980702e+03 -4.291402156550394e+03 -5.734902148547348e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.950000000000000e+02 -1.275685109870637e+06 -5.096488988044659e+06 4.424899654830399e+06 -2.807237523305779e+03 -4.291269241340702e+03 -5.735011200101261e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.960000000000000e+02 -1.275741254302470e+06 -5.096574811862804e+06 4.424784953827037e+06 -2.807218861862468e+03 -4.291136331195467e+03 -5.735120242123715e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.970000000000000e+02 -1.275797398395505e+06 -5.096660633084690e+06 4.424670250561423e+06 -2.807200196006891e+03 -4.291003413818241e+03 -5.735229286411828e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.980000000000000e+02 -1.275853542073006e+06 -5.096746451572303e+06 4.424555545214660e+06 -2.807181531538066e+03 -4.290870501372839e+03 -5.735338321204737e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.990000000000000e+02 -1.275909685444663e+06 -5.096832267522927e+06 4.424440837527856e+06 -2.807162861821519e+03 -4.290737576024168e+03 -5.735447362952497e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.000000000000000e+02 -1.275965828378592e+06 -5.096918080699460e+06 4.424326127812170e+06 -2.807144192742267e+03 -4.290604659774296e+03 -5.735556392338809e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.010000000000000e+02 -1.276021970984726e+06 -5.097003891299558e+06 4.424211415808214e+06 -2.807125520916949e+03 -4.290471733916844e+03 -5.735665425098090e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.020000000000000e+02 -1.276078113240985e+06 -5.097089699283551e+06 4.424096701568027e+06 -2.807106846113757e+03 -4.290338802274538e+03 -5.735774458406489e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.030000000000000e+02 -1.276134255070392e+06 -5.097175504513090e+06 4.423981985273222e+06 -2.807088171133192e+03 -4.290205878279876e+03 -5.735883480809614e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.040000000000000e+02 -1.276190396549937e+06 -5.097261307126572e+06 4.423867266742135e+06 -2.807069494541169e+03 -4.290072947954220e+03 -5.735992503599181e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.050000000000000e+02 -1.276246537624604e+06 -5.097347107025132e+06 4.423752546104556e+06 -2.807050817196931e+03 -4.289940021414233e+03 -5.736101518679697e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.060000000000000e+02 -1.276302678371131e+06 -5.097432904346784e+06 4.423637823179310e+06 -2.807032135541880e+03 -4.289807085622509e+03 -5.736210537524170e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.070000000000000e+02 -1.276358818734751e+06 -5.097518698993028e+06 4.423523098095690e+06 -2.807013453792513e+03 -4.289674149106503e+03 -5.736319551826361e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.080000000000000e+02 -1.276414958748202e+06 -5.097604491022802e+06 4.423408370776336e+06 -2.806994768152490e+03 -4.289541207296427e+03 -5.736428566689439e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.090000000000000e+02 -1.276471098367695e+06 -5.097690280357352e+06 4.423293641324642e+06 -2.806976082834784e+03 -4.289408266966293e+03 -5.736537575149429e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.100000000000000e+02 -1.276527237604092e+06 -5.097776067016254e+06 4.423178909714907e+06 -2.806957395641758e+03 -4.289275326348775e+03 -5.736646579489786e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.110000000000000e+02 -1.276583376501193e+06 -5.097861851078295e+06 4.423064175843691e+06 -2.806938704754781e+03 -4.289142378533148e+03 -5.736755585761720e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.120000000000000e+02 -1.276639514982273e+06 -5.097947632405513e+06 4.422949439892140e+06 -2.806920015113360e+03 -4.289009435403086e+03 -5.736864582790530e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.130000000000000e+02 -1.276695653113089e+06 -5.098033411116177e+06 4.422834701704971e+06 -2.806901322125931e+03 -4.288876487078111e+03 -5.736973580072873e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.140000000000000e+02 -1.276751790871567e+06 -5.098119187170642e+06 4.422719961334239e+06 -2.806882626955038e+03 -4.288743536674543e+03 -5.737082574734728e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.150000000000000e+02 -1.276807928268808e+06 -5.098204960588847e+06 4.422605218753752e+06 -2.806863930431872e+03 -4.288610582051692e+03 -5.737191568058211e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.160000000000000e+02 -1.276864065271769e+06 -5.098290731311427e+06 4.422490474041485e+06 -2.806845232822718e+03 -4.288477629094513e+03 -5.737300555435734e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.170000000000000e+02 -1.276920201902281e+06 -5.098376499377687e+06 4.422375727145830e+06 -2.806826532629156e+03 -4.288344674698813e+03 -5.737409539874246e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.180000000000000e+02 -1.276976338160478e+06 -5.098462264787833e+06 4.422260978066508e+06 -2.806807831955713e+03 -4.288211717552813e+03 -5.737518521482327e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.190000000000000e+02 -1.277032474068199e+06 -5.098548027581167e+06 4.422146226751896e+06 -2.806789128003958e+03 -4.288078754960196e+03 -5.737627503506468e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.200000000000000e+02 -1.277088609614345e+06 -5.098633787737785e+06 4.422031473228136e+06 -2.806770421226664e+03 -4.287945788546036e+03 -5.737736484513245e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.210000000000000e+02 -1.277144744755135e+06 -5.098719545178969e+06 4.421916717598644e+06 -2.806751715202045e+03 -4.287812825322510e+03 -5.737845457630045e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.220000000000000e+02 -1.277200879534281e+06 -5.098805299983359e+06 4.421801959760119e+06 -2.806733005817247e+03 -4.287679858778545e+03 -5.737954429573922e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.230000000000000e+02 -1.277257013962890e+06 -5.098891052170883e+06 4.421687199686361e+06 -2.806714294986524e+03 -4.287546885766137e+03 -5.738063401935698e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.240000000000000e+02 -1.277313147974975e+06 -5.098976801623005e+06 4.421572437533131e+06 -2.806695583442996e+03 -4.287413918548300e+03 -5.738172365042153e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.250000000000000e+02 -1.277369281636293e+06 -5.099062548457936e+06 4.421457673145110e+06 -2.806676868984869e+03 -4.287280945560045e+03 -5.738281328656805e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.260000000000000e+02 -1.277425414925007e+06 -5.099148292636422e+06 4.421342906573875e+06 -2.806658153563236e+03 -4.287147970379347e+03 -5.738390289220167e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.270000000000000e+02 -1.277481547851987e+06 -5.099234034178031e+06 4.421228137793719e+06 -2.806639435588964e+03 -4.287014991275646e+03 -5.738499248727439e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.280000000000000e+02 -1.277537680395153e+06 -5.099319773043135e+06 4.421113366856716e+06 -2.806620715647025e+03 -4.286882012411652e+03 -5.738608203752964e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.290000000000000e+02 -1.277593812576592e+06 -5.099405509271400e+06 4.420998593710735e+06 -2.806601994588085e+03 -4.286749029090274e+03 -5.738717157521002e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.300000000000000e+02 -1.277649944341300e+06 -5.099491242764020e+06 4.420883818485632e+06 -2.806583273012151e+03 -4.286616051227834e+03 -5.738826102208777e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.310000000000000e+02 -1.277706075776979e+06 -5.099576973678657e+06 4.420769040974223e+06 -2.806564547431225e+03 -4.286483064375245e+03 -5.738935050323702e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.320000000000000e+02 -1.277762206828868e+06 -5.099662701916876e+06 4.420654261305862e+06 -2.806545821487535e+03 -4.286350076900945e+03 -5.739043993933740e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.330000000000000e+02 -1.277818337507746e+06 -5.099748427498115e+06 4.420539479455005e+06 -2.806527092734239e+03 -4.286217087620113e+03 -5.739152934981213e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.340000000000000e+02 -1.277874467846677e+06 -5.099834150481753e+06 4.420424695343601e+06 -2.806508362073978e+03 -4.286084090399270e+03 -5.739261877763259e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.350000000000000e+02 -1.277930597746747e+06 -5.099919870690108e+06 4.420309909205218e+06 -2.806489631625892e+03 -4.285951102294795e+03 -5.739370808366296e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.360000000000000e+02 -1.277986727306632e+06 -5.100005588300535e+06 4.420195120806730e+06 -2.806470897731789e+03 -4.285818107087864e+03 -5.739479740717725e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.370000000000000e+02 -1.278042856504506e+06 -5.100091303273787e+06 4.420080330199713e+06 -2.806452162460633e+03 -4.285685107369539e+03 -5.739588671962543e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.380000000000000e+02 -1.278098985318299e+06 -5.100177015570256e+06 4.419965537436251e+06 -2.806433425547907e+03 -4.285552107695003e+03 -5.739697598737594e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.390000000000000e+02 -1.278155113758871e+06 -5.100262725209502e+06 4.419850742490635e+06 -2.806414686182531e+03 -4.285419106308044e+03 -5.739806522726863e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.400000000000000e+02 -1.278211241826350e+06 -5.100348432191726e+06 4.419735945362591e+06 -2.806395946228461e+03 -4.285286102401402e+03 -5.739915443755582e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.410000000000000e+02 -1.278267369487691e+06 -5.100434136457607e+06 4.419621146130137e+06 -2.806377205312407e+03 -4.285153102176594e+03 -5.740024357251692e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.420000000000000e+02 -1.278323496819608e+06 -5.100519838145020e+06 4.419506344611970e+06 -2.806358460254854e+03 -4.285020092596274e+03 -5.740133274508424e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.430000000000000e+02 -1.278379623778326e+06 -5.100605537175289e+06 4.419391540911543e+06 -2.806339714576455e+03 -4.284887080697150e+03 -5.740242188664866e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.440000000000000e+02 -1.278435750352753e+06 -5.100691233528531e+06 4.419276735055011e+06 -2.806320967009358e+03 -4.284754068821193e+03 -5.740351098472563e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.450000000000000e+02 -1.278491876564723e+06 -5.100776927244020e+06 4.419161926990730e+06 -2.806302216715457e+03 -4.284621053125558e+03 -5.740460007217825e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.460000000000000e+02 -1.278548002392412e+06 -5.100862618282524e+06 4.419047116770294e+06 -2.806283466146400e+03 -4.284488037003660e+03 -5.740568911272987e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.470000000000000e+02 -1.278604127835622e+06 -5.100948306643757e+06 4.418932304394085e+06 -2.806264713086729e+03 -4.284355020902985e+03 -5.740677811236505e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.480000000000000e+02 -1.278660252927407e+06 -5.101033992387081e+06 4.418817489784034e+06 -2.806245958645017e+03 -4.284221998989538e+03 -5.740786711087047e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.490000000000000e+02 -1.278716377634722e+06 -5.101119675453168e+06 4.418702673018160e+06 -2.806227202166456e+03 -4.284088976739573e+03 -5.740895606926308e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.500000000000000e+02 -1.278772501968431e+06 -5.101205355861584e+06 4.418587854070752e+06 -2.806208443564622e+03 -4.283955952768703e+03 -5.741004499846648e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.510000000000000e+02 -1.278828625928657e+06 -5.101291033612525e+06 4.418473032941538e+06 -2.806189684203465e+03 -4.283822926342407e+03 -5.741113389829770e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.520000000000000e+02 -1.278884749493337e+06 -5.101376708666407e+06 4.418358209682606e+06 -2.806170923388956e+03 -4.283689901799427e+03 -5.741222273862198e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.530000000000000e+02 -1.278940872717226e+06 -5.101462381121626e+06 4.418243384164503e+06 -2.806152159057611e+03 -4.283556869764236e+03 -5.741331159966525e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.540000000000000e+02 -1.278996995578497e+06 -5.101548050938964e+06 4.418128556438821e+06 -2.806133393284289e+03 -4.283423833619829e+03 -5.741440044683582e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.550000000000000e+02 -1.279053118044122e+06 -5.101633718059117e+06 4.418013726583594e+06 -2.806114626527582e+03 -4.283290799108590e+03 -5.741548923441542e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.560000000000000e+02 -1.279109240113974e+06 -5.101719382481926e+06 4.417898894599054e+06 -2.806095858077829e+03 -4.283157766608442e+03 -5.741657796253626e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.570000000000000e+02 -1.279165361832081e+06 -5.101805044286440e+06 4.417784060381165e+06 -2.806077088161067e+03 -4.283024727911784e+03 -5.741766669280192e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.580000000000000e+02 -1.279221483176299e+06 -5.101890703432950e+06 4.417669223982194e+06 -2.806058315414041e+03 -4.282891687606879e+03 -5.741875539601747e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.590000000000000e+02 -1.279277604146750e+06 -5.101976359921656e+06 4.417554385401864e+06 -2.806039541936047e+03 -4.282758644798782e+03 -5.741984407010464e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.600000000000000e+02 -1.279333724754295e+06 -5.102062013772112e+06 4.417439544614456e+06 -2.806020765602874e+03 -4.282625598370131e+03 -5.742093273258263e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.610000000000000e+02 -1.279389844976871e+06 -5.102147664944726e+06 4.417324701672074e+06 -2.806001987681992e+03 -4.282492551816944e+03 -5.742202135143585e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.620000000000000e+02 -1.279445964826544e+06 -5.102233313459087e+06 4.417209856548660e+06 -2.805983257188343e+03 -4.282359486272295e+03 -5.742310986267881e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.630000000000000e+02 -1.279502084296997e+06 -5.102318959308037e+06 4.417095009254208e+06 -2.805964428211254e+03 -4.282226454116560e+03 -5.742419848562716e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.640000000000000e+02 -1.279558203419559e+06 -5.102404602545802e+06 4.416980159717042e+06 -2.805945643988480e+03 -4.282093397805608e+03 -5.742528705164031e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.650000000000000e+02 -1.279614322124254e+06 -5.102490243046697e+06 4.416865308102630e+06 -2.805926860891526e+03 -4.281960346425288e+03 -5.742637552401476e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.660000000000000e+02 -1.279670440476802e+06 -5.102575880928799e+06 4.416750454255533e+06 -2.805908074462490e+03 -4.281827289542747e+03 -5.742746400113551e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.670000000000000e+02 -1.279726558455141e+06 -5.102661516152524e+06 4.416635598227861e+06 -2.805889285870697e+03 -4.281694230917512e+03 -5.742855244940189e+03 1.906327359800000e-03 6.706186422100000e-04 1.191261010900000e-03 2.277565510300000e-03 1.835863948600000e-03 3.473120718900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.680000000000000e+02 -1.279782676070371e+06 -5.102747148737782e+06 4.416520739993399e+06 -2.805870496075871e+03 -4.281561167830239e+03 -5.742964088546234e+03 1.906327359800000e-03 6.706186422100000e-04 1.191261010900000e-03 2.277565510300000e-03 1.835863948600000e-03 3.473120718900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.690000000000000e+02 -1.279838793289458e+06 -5.102832778625303e+06 4.416405879630193e+06 -2.805851704824050e+03 -4.281428106705654e+03 -5.743072926145064e+03 1.906327359800000e-03 6.706186422100000e-04 1.191261010900000e-03 2.277565510300000e-03 1.835863948600000e-03 3.473120718900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.700000000000000e+02 -1.279894910156175e+06 -5.102918405893731e+06 4.416291017034693e+06 -2.805832910523576e+03 -4.281295040086800e+03 -5.743181764091642e+03 1.906327359800000e-03 6.706186422100000e-04 1.191261010900000e-03 2.277565510300000e-03 1.835863948600000e-03 3.473120718900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.710000000000000e+02 -1.279951026648707e+06 -5.103004030503864e+06 4.416176152258510e+06 -2.805814115489270e+03 -4.281161970891010e+03 -5.743290599182586e+03 1.906327359800000e-03 6.706186422100000e-04 1.191261010900000e-03 2.277565510300000e-03 1.835863948600000e-03 3.473120718900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.720000000000000e+02 -1.280007142717958e+06 -5.103089652379040e+06 4.416061285405545e+06 -2.805795069131365e+03 -4.281029028800604e+03 -5.743399438811032e+03 1.906327359800000e-03 6.706186422100000e-04 1.191261010900000e-03 2.277565510300000e-03 1.835863948600000e-03 3.473120718900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.730000000000000e+02 -1.280063258418591e+06 -5.103175271625338e+06 4.415946416338124e+06 -2.805775846600983e+03 -4.280896165040842e+03 -5.743508288271773e+03 1.906327359800000e-03 6.706186422100000e-04 1.191261010900000e-03 2.277565510300000e-03 1.835863948600000e-03 3.473120718900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.740000000000000e+02 -1.280119373729612e+06 -5.103260888185742e+06 4.415831545126399e+06 -2.805757046595906e+03 -4.280763093835842e+03 -5.743617111562724e+03 1.906327359800000e-03 6.706186422100000e-04 1.191261010900000e-03 2.277565510300000e-03 1.835863948600000e-03 3.473120718900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.750000000000000e+02 -1.280175488699060e+06 -5.103346502146542e+06 4.415716671656704e+06 -2.805738243079264e+03 -4.280630014946653e+03 -5.743725937064522e+03 1.906327359800000e-03 6.706186422100000e-04 1.191261010900000e-03 2.277565510300000e-03 1.835863948600000e-03 3.473120718900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.760000000000000e+02 -1.280231603250254e+06 -5.103432113370050e+06 4.415601796110408e+06 -2.805719440411037e+03 -4.280496941282806e+03 -5.743834753098806e+03 1.906327359800000e-03 6.706186422100000e-04 1.191261010900000e-03 2.277565510300000e-03 1.835863948600000e-03 3.473120718900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.770000000000000e+02 -1.280287717459883e+06 -5.103517721994001e+06 4.415486918306090e+06 -2.805700634171057e+03 -4.280363860145862e+03 -5.743943571208394e+03 1.906268516600000e-03 6.702978758300000e-04 1.191403989300000e-03 2.276747549300000e-03 1.835663190900000e-03 3.474116876700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.780000000000000e+02 -1.280343831283950e+06 -5.103603327939428e+06 4.415372038347768e+06 -2.805681826363963e+03 -4.280230778991960e+03 -5.744052384866140e+03 1.906268516600000e-03 6.702978758300000e-04 1.191403989300000e-03 2.276747549300000e-03 1.835663190900000e-03 3.474116876700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.790000000000000e+02 -1.280399944733542e+06 -5.103688931226240e+06 4.415257156209220e+06 -2.805663017460001e+03 -4.280097695510217e+03 -5.744161195632501e+03 1.906268516600000e-03 6.702978758300000e-04 1.191403989300000e-03 2.276747549300000e-03 1.835663190900000e-03 3.474116876700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.800000000000000e+02 -1.280456057830492e+06 -5.103774531893658e+06 4.415142271838760e+06 -2.805644205613575e+03 -4.279964606154267e+03 -5.744270006989320e+03 1.906268516600000e-03 6.702978758300000e-04 1.191403989300000e-03 2.276747549300000e-03 1.835663190900000e-03 3.474116876700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.810000000000000e+02 -1.280512170508856e+06 -5.103860129823348e+06 4.415027385392325e+06 -2.805625393159503e+03 -4.279831522831657e+03 -5.744378808881816e+03 1.906268516600000e-03 6.702978758300000e-04 1.191403989300000e-03 2.276747549300000e-03 1.835663190900000e-03 3.474116876700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.820000000000000e+02 -1.280568282832841e+06 -5.103945725141881e+06 4.414912496719407e+06 -2.805606491645318e+03 -4.279698842298398e+03 -5.744487336728486e+03 1.906268516600000e-03 6.702978758300000e-04 1.191403989300000e-03 2.276747549300000e-03 1.835663190900000e-03 3.474116876700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.830000000000000e+02 -1.280624394770896e+06 -5.104031317800600e+06 4.414797605895503e+06 -2.805587526181225e+03 -4.279566446234290e+03 -5.744595669992283e+03 1.906268516600000e-03 6.702978758300000e-04 1.191403989300000e-03 2.276747549300000e-03 1.835663190900000e-03 3.474116876700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.840000000000000e+02 -1.280680506301905e+06 -5.104116907742329e+06 4.414682712968305e+06 -2.805568709566884e+03 -4.279433356192778e+03 -5.744704463375074e+03 1.906268516600000e-03 6.702978758300000e-04 1.191403989300000e-03 2.276747549300000e-03 1.835663190900000e-03 3.474116876700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.850000000000000e+02 -1.280736617491068e+06 -5.104202495084164e+06 4.414567817783523e+06 -2.805549889332644e+03 -4.279300258846196e+03 -5.744813258723896e+03 1.906268516600000e-03 6.702978758300000e-04 1.191403989300000e-03 2.276747549300000e-03 1.835663190900000e-03 3.474116876700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.860000000000000e+02 -1.280792728294380e+06 -5.104288079747152e+06 4.414452920445194e+06 -2.805531067205353e+03 -4.279167161265011e+03 -5.744922049925223e+03 1.906268516600000e-03 6.702978758300000e-04 1.191403989300000e-03 2.276747549300000e-03 1.835663190900000e-03 3.474116876700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.870000000000000e+02 -1.280848838722943e+06 -5.104373661751200e+06 4.414338020927087e+06 -2.805512244378053e+03 -4.279034061435552e+03 -5.745030838006505e+03 1.906209609700000e-03 6.699770440600000e-04 1.191546798200000e-03 2.275929702200000e-03 1.835462037800000e-03 3.475113014300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.880000000000000e+02 -1.280904948776637e+06 -5.104459241096140e+06 4.414223119229430e+06 -2.805493419289647e+03 -4.278900959788022e+03 -5.745139623301537e+03 1.906209609700000e-03 6.699770440600000e-04 1.191546798200000e-03 2.275929702200000e-03 1.835462037800000e-03 3.475113014300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.890000000000000e+02 -1.280961058433408e+06 -5.104544817742422e+06 4.414108215404349e+06 -2.805474592774142e+03 -4.278767859869127e+03 -5.745248402758034e+03 1.906209609700000e-03 6.699770440600000e-04 1.191546798200000e-03 2.275929702200000e-03 1.835462037800000e-03 3.475113014300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.900000000000000e+02 -1.281017167759205e+06 -5.104630391808407e+06 4.413993309295841e+06 -2.805455763801674e+03 -4.278634750151130e+03 -5.745357185584853e+03 1.906209609700000e-03 6.699770440600000e-04 1.191546798200000e-03 2.275929702200000e-03 1.835462037800000e-03 3.475113014300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.910000000000000e+02 -1.281073276688087e+06 -5.104715963175777e+06 4.413878401059859e+06 -2.805436933410287e+03 -4.278501642347624e+03 -5.745465962428235e+03 1.906209609700000e-03 6.699770440600000e-04 1.191546798200000e-03 2.275929702200000e-03 1.835462037800000e-03 3.475113014300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.920000000000000e+02 -1.281129385222781e+06 -5.104801531850369e+06 4.413763490702376e+06 -2.805418243427207e+03 -4.278368835741445e+03 -5.745574445481687e+03 1.906209609700000e-03 6.699770440600000e-04 1.191546798200000e-03 2.275929702200000e-03 1.835462037800000e-03 3.475113014300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.930000000000000e+02 -1.281185493417586e+06 -5.104887097930252e+06 4.413648578103636e+06 -2.805399650371648e+03 -4.278236230332252e+03 -5.745682729268003e+03 1.906209609700000e-03 6.699770440600000e-04 1.191546798200000e-03 2.275929702200000e-03 1.835462037800000e-03 3.475113014300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.940000000000000e+02 -1.281241601221440e+06 -5.104972661322294e+06 4.413533663363242e+06 -2.805380814698034e+03 -4.278103116374285e+03 -5.745791497625802e+03 1.906209609700000e-03 6.699770440600000e-04 1.191546798200000e-03 2.275929702200000e-03 1.835462037800000e-03 3.475113014300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.950000000000000e+02 -1.281297708650101e+06 -5.105058222054819e+06 4.413418746443855e+06 -2.805361976819807e+03 -4.277970000577932e+03 -5.745900263188904e+03 1.906209609700000e-03 6.699770440600000e-04 1.191546798200000e-03 2.275929702200000e-03 1.835462037800000e-03 3.475113014300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.960000000000000e+02 -1.281353815703692e+06 -5.105143780128028e+06 4.413303827345201e+06 -2.805343138113417e+03 -4.277836882279314e+03 -5.746009025879530e+03 1.906209609700000e-03 6.699770440600000e-04 1.191546798200000e-03 2.275929702200000e-03 1.835462037800000e-03 3.475113014300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.970000000000000e+02 -1.281409922382018e+06 -5.105229335541645e+06 4.413188906067664e+06 -2.805324296556294e+03 -4.277703762458553e+03 -5.746117785808476e+03 1.906150639000000e-03 6.696561470700000e-04 1.191689437600000e-03 2.275111969100000e-03 1.835260489200000e-03 3.476109131300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.980000000000000e+02 -1.281466028685207e+06 -5.105314888295865e+06 4.413073982610972e+06 -2.805305454378530e+03 -4.277570640020612e+03 -5.746226542864480e+03 1.906150639000000e-03 6.696561470700000e-04 1.191689437600000e-03 2.275111969100000e-03 1.835260489200000e-03 3.476109131300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.990000000000000e+02 -1.281522134602171e+06 -5.105400438370847e+06 4.412959057001308e+06 -2.805286610315814e+03 -4.277437517913490e+03 -5.746335295340466e+03 1.906150639000000e-03 6.696561470700000e-04 1.191689437600000e-03 2.275111969100000e-03 1.835260489200000e-03 3.476109131300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.000000000000000e+02 -1.281578240143765e+06 -5.105485985786105e+06 4.412844129212928e+06 -2.805267764080142e+03 -4.277304393540851e+03 -5.746444045333413e+03 1.906150639000000e-03 6.696561470700000e-04 1.191689437600000e-03 2.275111969100000e-03 1.835260489200000e-03 3.476109131300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.010000000000000e+02 -1.281634345321083e+06 -5.105571530561536e+06 4.412729199219610e+06 -2.805248916510370e+03 -4.277171265322488e+03 -5.746552793689982e+03 1.906150639000000e-03 6.696561470700000e-04 1.191689437600000e-03 2.275111969100000e-03 1.835260489200000e-03 3.476109131300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.020000000000000e+02 -1.281690450107593e+06 -5.105657072665113e+06 4.412614267077288e+06 -2.805229843041788e+03 -4.277038512071585e+03 -5.746661347363225e+03 1.906150639000000e-03 6.696561470700000e-04 1.191689437600000e-03 2.275111969100000e-03 1.835260489200000e-03 3.476109131300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.030000000000000e+02 -1.281746554515348e+06 -5.105742612129383e+06 4.412499332752633e+06 -2.805210610264715e+03 -4.276906017508903e+03 -5.746769766610353e+03 1.906150639000000e-03 6.696561470700000e-04 1.191689437600000e-03 2.275111969100000e-03 1.835260489200000e-03 3.476109131300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.040000000000000e+02 -1.281802658519505e+06 -5.105828148883317e+06 4.412384396316031e+06 -2.805191757981926e+03 -4.276772884884222e+03 -5.746878504909087e+03 1.906150639000000e-03 6.696561470700000e-04 1.191689437600000e-03 2.275111969100000e-03 1.835260489200000e-03 3.476109131300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.050000000000000e+02 -1.281858762192069e+06 -5.105913683056189e+06 4.412269457596979e+06 -2.805172901457142e+03 -4.276639742971007e+03 -5.746987246941012e+03 1.906150639000000e-03 6.696561470700000e-04 1.191689437600000e-03 2.275111969100000e-03 1.835260489200000e-03 3.476109131300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.060000000000000e+02 -1.281914865445178e+06 -5.105999214490359e+06 4.412154516803412e+06 -2.805154044629782e+03 -4.276506606607858e+03 -5.747095979754648e+03 1.906150639000000e-03 6.696561470700000e-04 1.191689437600000e-03 2.275111969100000e-03 1.835260489200000e-03 3.476109131300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.070000000000000e+02 -1.281970968333799e+06 -5.106084743284456e+06 4.412039573805233e+06 -2.805135186566887e+03 -4.276373465946503e+03 -5.747204711233883e+03 1.906091604600000e-03 6.693351851700000e-04 1.191831907200000e-03 2.274294350600000e-03 1.835058545400000e-03 3.477105226500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.080000000000000e+02 -1.282027070835803e+06 -5.106170269398826e+06 4.411924628654761e+06 -2.805116326216852e+03 -4.276240325540293e+03 -5.747313438361674e+03 1.906091604600000e-03 6.693351851700000e-04 1.191831907200000e-03 2.274294350600000e-03 1.835058545400000e-03 3.477105226500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.090000000000000e+02 -1.282083172984214e+06 -5.106255792892713e+06 4.411809681273828e+06 -2.805097464129812e+03 -4.276107178998525e+03 -5.747422165764066e+03 1.906091604600000e-03 6.693351851700000e-04 1.191831907200000e-03 2.274294350600000e-03 1.835058545400000e-03 3.477105226500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.100000000000000e+02 -1.282139274746017e+06 -5.106341313706919e+06 4.411694731740545e+06 -2.805078600213002e+03 -4.275974032428167e+03 -5.747530888837142e+03 1.906091604600000e-03 6.693351851700000e-04 1.191831907200000e-03 2.274294350600000e-03 1.835058545400000e-03 3.477105226500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.110000000000000e+02 -1.282195376143031e+06 -5.106426831880637e+06 4.411579780003208e+06 -2.805059733698647e+03 -4.275840882180501e+03 -5.747639610679833e+03 1.906091604600000e-03 6.693351851700000e-04 1.191831907200000e-03 2.274294350600000e-03 1.835058545400000e-03 3.477105226500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.120000000000000e+02 -1.282251477144342e+06 -5.106512347360555e+06 4.411464826144416e+06 -2.805040960389066e+03 -4.275708009213463e+03 -5.747748077154759e+03 1.906091604600000e-03 6.693351851700000e-04 1.191831907200000e-03 2.274294350600000e-03 1.835058545400000e-03 3.477105226500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.130000000000000e+02 -1.282307577770725e+06 -5.106597860185523e+06 4.411349870121493e+06 -2.805022249702033e+03 -4.275575327153216e+03 -5.747856366882505e+03 1.906091604600000e-03 6.693351851700000e-04 1.191831907200000e-03 2.274294350600000e-03 1.835058545400000e-03 3.477105226500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.140000000000000e+02 -1.282363678026998e+06 -5.106683370360524e+06 4.411234911907025e+06 -2.805003378254977e+03 -4.275442172767925e+03 -5.747965078567809e+03 1.906091604600000e-03 6.693351851700000e-04 1.191831907200000e-03 2.274294350600000e-03 1.835058545400000e-03 3.477105226500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.150000000000000e+02 -1.282419777929474e+06 -5.106768877914798e+06 4.411119951462421e+06 -2.804984505265712e+03 -4.275309012022810e+03 -5.748073790614690e+03 1.906091604600000e-03 6.693351851700000e-04 1.191831907200000e-03 2.274294350600000e-03 1.835058545400000e-03 3.477105226500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.160000000000000e+02 -1.282475877412223e+06 -5.106854382730111e+06 4.411004988943720e+06 -2.804965631652187e+03 -4.275175856912603e+03 -5.748182493518066e+03 1.906091604600000e-03 6.693351851700000e-04 1.191831907200000e-03 2.274294350600000e-03 1.835058545400000e-03 3.477105226500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.170000000000000e+02 -1.282531976540940e+06 -5.106939884924363e+06 4.410890024195328e+06 -2.804946755035114e+03 -4.275042696176180e+03 -5.748291196843869e+03 1.906032506300000e-03 6.690141584900000e-04 1.191974206900000e-03 2.273476846500000e-03 1.834856206500000e-03 3.478101299700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.180000000000000e+02 -1.282588075293812e+06 -5.107025384458411e+06 4.410775057268918e+06 -2.804927877501216e+03 -4.274909533350121e+03 -5.748399897021050e+03 1.906032506300000e-03 6.690141584900000e-04 1.191974206900000e-03 2.273476846500000e-03 1.834856206500000e-03 3.478101299700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.190000000000000e+02 -1.282644173681692e+06 -5.107110881351763e+06 4.410660088138730e+06 -2.804908997344578e+03 -4.274776366402264e+03 -5.748508596315739e+03 1.906032506300000e-03 6.690141584900000e-04 1.191974206900000e-03 2.273476846500000e-03 1.834856206500000e-03 3.478101299700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.200000000000000e+02 -1.282700271649633e+06 -5.107196375505880e+06 4.410545116934841e+06 -2.804890116719293e+03 -4.274643205297269e+03 -5.748617286244389e+03 1.906032506300000e-03 6.690141584900000e-04 1.191974206900000e-03 2.273476846500000e-03 1.834856206500000e-03 3.478101299700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.210000000000000e+02 -1.282756369307425e+06 -5.107281867117709e+06 4.410430143397277e+06 -2.804871232717551e+03 -4.274510030605509e+03 -5.748725982801488e+03 1.906032506300000e-03 6.690141584900000e-04 1.191974206900000e-03 2.273476846500000e-03 1.834856206500000e-03 3.478101299700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.220000000000000e+02 -1.282812466528778e+06 -5.107367355977590e+06 4.410315167815122e+06 -2.804852074900025e+03 -4.274377215079717e+03 -5.748834517176007e+03 1.906032506300000e-03 6.690141584900000e-04 1.191974206900000e-03 2.273476846500000e-03 1.834856206500000e-03 3.478101299700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.230000000000000e+02 -1.282868563366035e+06 -5.107452842191138e+06 4.410200190057553e+06 -2.804832725712000e+03 -4.274244640696984e+03 -5.748942944168151e+03 1.906032506300000e-03 6.690141584900000e-04 1.191974206900000e-03 2.273476846500000e-03 1.834856206500000e-03 3.478101299700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.240000000000000e+02 -1.282924659812585e+06 -5.107538325717973e+06 4.410085210156978e+06 -2.804813837534696e+03 -4.274111467513979e+03 -5.749051625939813e+03 1.906032506300000e-03 6.690141584900000e-04 1.191974206900000e-03 2.273476846500000e-03 1.834856206500000e-03 3.478101299700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.250000000000000e+02 -1.282980755893850e+06 -5.107623806603739e+06 4.409970228053132e+06 -2.804794946766628e+03 -4.273978290575739e+03 -5.749160306536612e+03 1.906032506300000e-03 6.690141584900000e-04 1.191974206900000e-03 2.273476846500000e-03 1.834856206500000e-03 3.478101299700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.260000000000000e+02 -1.283036851598992e+06 -5.107709284828974e+06 4.409855243771714e+06 -2.804776055254730e+03 -4.273845111257147e+03 -5.749268984132526e+03 1.906032506300000e-03 6.690141584900000e-04 1.191974206900000e-03 2.273476846500000e-03 1.834856206500000e-03 3.478101299700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.270000000000000e+02 -1.283092946927892e+06 -5.107794760393513e+06 4.409740257312947e+06 -2.804757161432804e+03 -4.273711930179375e+03 -5.749377658918290e+03 1.905973344300000e-03 6.686930673300000e-04 1.192116336500000e-03 2.272659457300000e-03 1.834653472500000e-03 3.479097349900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.280000000000000e+02 -1.283149041880437e+06 -5.107880233297191e+06 4.409625268677051e+06 -2.804738265328433e+03 -4.273578747029878e+03 -5.749486331119658e+03 1.905973344300000e-03 6.686930673300000e-04 1.192116336500000e-03 2.272659457300000e-03 1.834653472500000e-03 3.479097349900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.290000000000000e+02 -1.283205136467716e+06 -5.107965703559881e+06 4.409510277837779e+06 -2.804719368009649e+03 -4.273445559914955e+03 -5.749595001723126e+03 1.905973344300000e-03 6.686930673300000e-04 1.192116336500000e-03 2.272659457300000e-03 1.834653472500000e-03 3.479097349900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.300000000000000e+02 -1.283261230667685e+06 -5.108051171142085e+06 4.409395284847299e+06 -2.804700468970077e+03 -4.273312372582142e+03 -5.749703668096460e+03 1.905973344300000e-03 6.686930673300000e-04 1.192116336500000e-03 2.272659457300000e-03 1.834653472500000e-03 3.479097349900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.310000000000000e+02 -1.283317324502157e+06 -5.108136636082971e+06 4.409280289653884e+06 -2.804681567112387e+03 -4.273179181654507e+03 -5.749812333268691e+03 1.905973344300000e-03 6.686930673300000e-04 1.192116336500000e-03 2.272659457300000e-03 1.834653472500000e-03 3.479097349900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.320000000000000e+02 -1.283373417938384e+06 -5.108222098330185e+06 4.409165292340072e+06 -2.804662666342765e+03 -4.273046313581209e+03 -5.749920747655823e+03 1.905973344300000e-03 6.686930673300000e-04 1.192116336500000e-03 2.272659457300000e-03 1.834653472500000e-03 3.479097349900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.330000000000000e+02 -1.283429510979883e+06 -5.108307557894566e+06 4.409050292900916e+06 -2.804643764110103e+03 -4.272913670453676e+03 -5.750028986710843e+03 1.905973344300000e-03 6.686930673300000e-04 1.192116336500000e-03 2.272659457300000e-03 1.834653472500000e-03 3.479097349900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.340000000000000e+02 -1.283485603669352e+06 -5.108393014841805e+06 4.408935291226891e+06 -2.804624858076585e+03 -4.272780472958061e+03 -5.750137643251053e+03 1.905973344300000e-03 6.686930673300000e-04 1.192116336500000e-03 2.272659457300000e-03 1.834653472500000e-03 3.479097349900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.350000000000000e+02 -1.283541695971335e+06 -5.108478469108361e+06 4.408820287401942e+06 -2.804605950028805e+03 -4.272647275581501e+03 -5.750246295429742e+03 1.905973344300000e-03 6.686930673300000e-04 1.192116336500000e-03 2.272659457300000e-03 1.834653472500000e-03 3.479097349900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.360000000000000e+02 -1.283597787896680e+06 -5.108563920713729e+06 4.408705281400318e+06 -2.804587039947304e+03 -4.272514076343768e+03 -5.750354944758918e+03 1.905973344300000e-03 6.686930673300000e-04 1.192116336500000e-03 2.272659457300000e-03 1.834653472500000e-03 3.479097349900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.370000000000000e+02 -1.283653879445514e+06 -5.108649369658115e+06 4.408590273221748e+06 -2.804568129082197e+03 -4.272380874589976e+03 -5.750463591207093e+03 1.905914118400000e-03 6.683719118600000e-04 1.192258296000000e-03 2.271842183200000e-03 1.834450343700000e-03 3.480093376400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.380000000000000e+02 -1.283709970628685e+06 -5.108734815961023e+06 4.408475262840464e+06 -2.804549215322687e+03 -4.272247669269605e+03 -5.750572236464504e+03 1.905914118400000e-03 6.683719118600000e-04 1.192258296000000e-03 2.271842183200000e-03 1.834450343700000e-03 3.480093376400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.390000000000000e+02 -1.283766061413182e+06 -5.108820259563292e+06 4.408360250334634e+06 -2.804530300361737e+03 -4.272114465640828e+03 -5.750680875823144e+03 1.905914118400000e-03 6.683719118600000e-04 1.192258296000000e-03 2.271842183200000e-03 1.834450343700000e-03 3.480093376400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.400000000000000e+02 -1.283822151810096e+06 -5.108905700484798e+06 4.408245235678005e+06 -2.804511385014743e+03 -4.271981261525428e+03 -5.750789510592184e+03 1.905914118400000e-03 6.683719118600000e-04 1.192258296000000e-03 2.271842183200000e-03 1.834450343700000e-03 3.480093376400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.410000000000000e+02 -1.283878241863172e+06 -5.108991138804024e+06 4.408130218766877e+06 -2.804492466160167e+03 -4.271848050020208e+03 -5.750898147332041e+03 1.905914118400000e-03 6.683719118600000e-04 1.192258296000000e-03 2.271842183200000e-03 1.834450343700000e-03 3.480093376400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.420000000000000e+02 -1.283934331516991e+06 -5.109076574427203e+06 4.408015199734733e+06 -2.804473521747252e+03 -4.271715075682235e+03 -5.751006609716784e+03 1.905914118400000e-03 6.683719118600000e-04 1.192258296000000e-03 2.271842183200000e-03 1.834450343700000e-03 3.480093376400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.430000000000000e+02 -1.283990420832865e+06 -5.109162007468143e+06 4.407900178437877e+06 -2.804454558210442e+03 -4.271582255541986e+03 -5.751114958014618e+03 1.905914118400000e-03 6.683719118600000e-04 1.192258296000000e-03 2.271842183200000e-03 1.834450343700000e-03 3.480093376400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.440000000000000e+02 -1.284046509710609e+06 -5.109247437737794e+06 4.407785155109868e+06 -2.804435635270760e+03 -4.271449043573264e+03 -5.751223581443453e+03 1.905914118400000e-03 6.683719118600000e-04 1.192258296000000e-03 2.271842183200000e-03 1.834450343700000e-03 3.480093376400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.450000000000000e+02 -1.284102598233328e+06 -5.109332865385210e+06 4.407670129553732e+06 -2.804416709328953e+03 -4.271315826052361e+03 -5.751332205233858e+03 1.905914118400000e-03 6.683719118600000e-04 1.192258296000000e-03 2.271842183200000e-03 1.834450343700000e-03 3.480093376400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.460000000000000e+02 -1.284158686357289e+06 -5.109418290331962e+06 4.407555101873117e+06 -2.804397783402419e+03 -4.271182609695367e+03 -5.751440823012688e+03 1.905914118400000e-03 6.683719118600000e-04 1.192258296000000e-03 2.271842183200000e-03 1.834450343700000e-03 3.480093376400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.470000000000000e+02 -1.284214774148083e+06 -5.109503712695707e+06 4.407440071912514e+06 -2.804378852989093e+03 -4.271049384135070e+03 -5.751549444551260e+03 1.905854828700000e-03 6.680506922499999e-04 1.192400085100000e-03 2.271025024300000e-03 1.834246820000000e-03 3.481089378800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.480000000000000e+02 -1.284270861551010e+06 -5.109589132378371e+06 4.407325039801569e+06 -2.804359922145217e+03 -4.270916158408172e+03 -5.751658061276348e+03 1.905854828700000e-03 6.680506922499999e-04 1.192400085100000e-03 2.271025024300000e-03 1.834246820000000e-03 3.481089378800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.490000000000000e+02 -1.284326948565960e+06 -5.109674549379786e+06 4.407210005540495e+06 -2.804340989599808e+03 -4.270782932458600e+03 -5.751766673768115e+03 1.905854828700000e-03 6.680506922499999e-04 1.192400085100000e-03 2.271025024300000e-03 1.834246820000000e-03 3.481089378800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.500000000000000e+02 -1.284383035203778e+06 -5.109759963719435e+06 4.407094969103537e+06 -2.804322054765423e+03 -4.270649704516906e+03 -5.751875283617703e+03 1.905854828700000e-03 6.680506922499999e-04 1.192400085100000e-03 2.271025024300000e-03 1.834246820000000e-03 3.481089378800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.510000000000000e+02 -1.284439121464592e+06 -5.109845375397537e+06 4.406979930490422e+06 -2.804303119155303e+03 -4.270516474435532e+03 -5.751983890297324e+03 1.905854828700000e-03 6.680506922499999e-04 1.192400085100000e-03 2.271025024300000e-03 1.834246820000000e-03 3.481089378800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.520000000000000e+02 -1.284495207305267e+06 -5.109930784344469e+06 4.406864889812598e+06 -2.804284224615571e+03 -4.270383707626755e+03 -5.752092122992807e+03 1.905854828700000e-03 6.680506922499999e-04 1.192400085100000e-03 2.271025024300000e-03 1.834246820000000e-03 3.481089378800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.530000000000000e+02 -1.284551292805300e+06 -5.110016190708165e+06 4.406749846888044e+06 -2.804265354768956e+03 -4.270251251483525e+03 -5.752200104441359e+03 1.905854828700000e-03 6.680506922499999e-04 1.192400085100000e-03 2.271025024300000e-03 1.834246820000000e-03 3.481089378800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.540000000000000e+02 -1.284607377904876e+06 -5.110101594368333e+06 4.406634801842847e+06 -2.804246414481921e+03 -4.270118017033456e+03 -5.752308701040227e+03 1.905854828700000e-03 6.680506922499999e-04 1.192400085100000e-03 2.271025024300000e-03 1.834246820000000e-03 3.481089378800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.550000000000000e+02 -1.284663462671080e+06 -5.110186995445280e+06 4.406519754517925e+06 -2.804227469864471e+03 -4.269984773357598e+03 -5.752417301347289e+03 1.905854828700000e-03 6.680506922499999e-04 1.192400085100000e-03 2.271025024300000e-03 1.834246820000000e-03 3.481089378800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.560000000000000e+02 -1.284719547016089e+06 -5.110272393781614e+06 4.406404705121414e+06 -2.804208524930394e+03 -4.269851535290134e+03 -5.752525892412696e+03 1.905854828700000e-03 6.680506922499999e-04 1.192400085100000e-03 2.271025024300000e-03 1.834246820000000e-03 3.481089378800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.570000000000000e+02 -1.284775630994845e+06 -5.110357789475804e+06 4.406289653523092e+06 -2.804189578792380e+03 -4.269718292837593e+03 -5.752634482192499e+03 1.905795475100000e-03 6.677294088100000e-04 1.192541703700000e-03 2.270207981000000e-03 1.834042901700000e-03 3.482085356100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.580000000000000e+02 -1.284831714585224e+06 -5.110443182488263e+06 4.406174599775329e+06 -2.804170630277608e+03 -4.269585050718063e+03 -5.752743067603660e+03 1.905795475100000e-03 6.677294088100000e-04 1.192541703700000e-03 2.270207981000000e-03 1.834042901700000e-03 3.482085356100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.590000000000000e+02 -1.284887797820245e+06 -5.110528572878148e+06 4.406059543799878e+06 -2.804151680177241e+03 -4.269451802328586e+03 -5.752851653319913e+03 1.905795475100000e-03 6.677294088100000e-04 1.192541703700000e-03 2.270207981000000e-03 1.834042901700000e-03 3.482085356100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.600000000000000e+02 -1.284943880666900e+06 -5.110613960586340e+06 4.405944485674932e+06 -2.804132728220490e+03 -4.269318554078309e+03 -5.752960234594586e+03 1.905795475100000e-03 6.677294088100000e-04 1.192541703700000e-03 2.270207981000000e-03 1.834042901700000e-03 3.482085356100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.610000000000000e+02 -1.284999963114113e+06 -5.110699345593027e+06 4.405829425426704e+06 -2.804113774976275e+03 -4.269185307593682e+03 -5.753068809954040e+03 1.905795475100000e-03 6.677294088100000e-04 1.192541703700000e-03 2.270207981000000e-03 1.834042901700000e-03 3.482085356100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.620000000000000e+02 -1.285056045222105e+06 -5.110784728019627e+06 4.405714362899084e+06 -2.804094535184599e+03 -4.269052216749851e+03 -5.753177383245855e+03 1.905795475100000e-03 6.677294088100000e-04 1.192541703700000e-03 2.270207981000000e-03 1.834042901700000e-03 3.482085356100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.630000000000000e+02 -1.285112126907965e+06 -5.110870107726963e+06 4.405599298279275e+06 -2.804075096374486e+03 -4.268919244755111e+03 -5.753285945369116e+03 1.905795475100000e-03 6.677294088100000e-04 1.192541703700000e-03 2.270207981000000e-03 1.834042901700000e-03 3.482085356100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.640000000000000e+02 -1.285168208219842e+06 -5.110955484778496e+06 4.405484231475736e+06 -2.804056136865292e+03 -4.268785988245039e+03 -5.753394515563977e+03 1.905795475100000e-03 6.677294088100000e-04 1.192541703700000e-03 2.270207981000000e-03 1.834042901700000e-03 3.482085356100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.650000000000000e+02 -1.285224289154220e+06 -5.111040859167913e+06 4.405369162496836e+06 -2.804037176536838e+03 -4.268652729877482e+03 -5.753503082393435e+03 1.905795475100000e-03 6.677294088100000e-04 1.192541703700000e-03 2.270207981000000e-03 1.834042901700000e-03 3.482085356100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.660000000000000e+02 -1.285280369710984e+06 -5.111126230895047e+06 4.405254091342786e+06 -2.804018214029957e+03 -4.268519469288318e+03 -5.753611646707955e+03 1.905795475100000e-03 6.677294088100000e-04 1.192541703700000e-03 2.270207981000000e-03 1.834042901700000e-03 3.482085356100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.670000000000000e+02 -1.285336449890019e+06 -5.111211599959725e+06 4.405139018013815e+06 -2.803999249260503e+03 -4.268386206849785e+03 -5.753720208260858e+03 1.905736057700000e-03 6.674080616700000e-04 1.192683151700000e-03 2.269391053200000e-03 1.833838588900000e-03 3.483081307800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.680000000000000e+02 -1.285392529691451e+06 -5.111296966362162e+06 4.405023942509648e+06 -2.803980283779277e+03 -4.268252942135494e+03 -5.753828766720105e+03 1.905736057700000e-03 6.674080616700000e-04 1.192683151700000e-03 2.269391053200000e-03 1.833838588900000e-03 3.483081307800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.690000000000000e+02 -1.285448609115164e+06 -5.111382330102198e+06 4.404908864830502e+06 -2.803961315841394e+03 -4.268119675530489e+03 -5.753937322531094e+03 1.905736057700000e-03 6.674080616700000e-04 1.192683151700000e-03 2.269391053200000e-03 1.833838588900000e-03 3.483081307800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.700000000000000e+02 -1.285504688150080e+06 -5.111467691160013e+06 4.404793785002599e+06 -2.803942346345396e+03 -4.267986408917226e+03 -5.754045873887208e+03 1.905736057700000e-03 6.674080616700000e-04 1.192683151700000e-03 2.269391053200000e-03 1.833838588900000e-03 3.483081307800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.710000000000000e+02 -1.285560766807285e+06 -5.111553049555463e+06 4.404678702999668e+06 -2.803923375920962e+03 -4.267853139882074e+03 -5.754154422352156e+03 1.905736057700000e-03 6.674080616700000e-04 1.192683151700000e-03 2.269391053200000e-03 1.833838588900000e-03 3.483081307800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.720000000000000e+02 -1.285616845098298e+06 -5.111638405318195e+06 4.404563618804193e+06 -2.803904439593704e+03 -4.267720381315753e+03 -5.754262564366303e+03 1.905736057700000e-03 6.674080616700000e-04 1.192683151700000e-03 2.269391053200000e-03 1.833838588900000e-03 3.483081307800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.730000000000000e+02 -1.285672923002324e+06 -5.111723758417157e+06 4.404448532472409e+06 -2.803885528611889e+03 -4.267587978932448e+03 -5.754370420611231e+03 1.905736057700000e-03 6.674080616700000e-04 1.192683151700000e-03 2.269391053200000e-03 1.833838588900000e-03 3.483081307800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.740000000000000e+02 -1.285729000504185e+06 -5.111809108810024e+06 4.404333444023489e+06 -2.803866552334947e+03 -4.267454704191942e+03 -5.754478960531183e+03 1.905736057700000e-03 6.674080616700000e-04 1.192683151700000e-03 2.269391053200000e-03 1.833838588900000e-03 3.483081307800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.750000000000000e+02 -1.285785077660918e+06 -5.111894456599047e+06 4.404218353322108e+06 -2.803847572613915e+03 -4.267321421920773e+03 -5.754587502494382e+03 1.905736057700000e-03 6.674080616700000e-04 1.192683151700000e-03 2.269391053200000e-03 1.833838588900000e-03 3.483081307800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.760000000000000e+02 -1.285841154395923e+06 -5.111979801646933e+06 4.404103260549972e+06 -2.803828593858475e+03 -4.267188144596936e+03 -5.754696035181372e+03 1.905736057700000e-03 6.674080616700000e-04 1.192683151700000e-03 2.269391053200000e-03 1.833838588900000e-03 3.483081307800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.770000000000000e+02 -1.285897230785811e+06 -5.112065144091012e+06 4.403988165525320e+06 -2.803809611613570e+03 -4.267054859948384e+03 -5.754804569774403e+03 1.905676576500000e-03 6.670866511400000e-04 1.192824428900000e-03 2.268574241600000e-03 1.833633881600000e-03 3.484077233000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.780000000000000e+02 -1.285953306775659e+06 -5.112150483832913e+06 4.403873068378361e+06 -2.803790627803772e+03 -4.266921576944819e+03 -5.754913098663198e+03 1.905676576500000e-03 6.670866511400000e-04 1.192824428900000e-03 2.268574241600000e-03 1.833633881600000e-03 3.484077233000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.790000000000000e+02 -1.286009382409439e+06 -5.112235820951409e+06 4.403757969004833e+06 -2.803771642484313e+03 -4.266788288285700e+03 -5.755021627356434e+03 1.905676576500000e-03 6.670866511400000e-04 1.192824428900000e-03 2.268574241600000e-03 1.833633881600000e-03 3.484077233000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.800000000000000e+02 -1.286065457654153e+06 -5.112321155387410e+06 4.403642867482946e+06 -2.803752655347574e+03 -4.266654999110269e+03 -5.755130152089867e+03 1.905676576500000e-03 6.670866511400000e-04 1.192824428900000e-03 2.268574241600000e-03 1.833633881600000e-03 3.484077233000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.810000000000000e+02 -1.286121532520641e+06 -5.112406487160394e+06 4.403527763786931e+06 -2.803733665780971e+03 -4.266521708489510e+03 -5.755238673826255e+03 1.905676576500000e-03 6.670866511400000e-04 1.192824428900000e-03 2.268574241600000e-03 1.833633881600000e-03 3.484077233000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.820000000000000e+02 -1.286177606986255e+06 -5.112491816234142e+06 4.403412657970302e+06 -2.803714633488466e+03 -4.266388561470211e+03 -5.755347099675462e+03 1.905676576500000e-03 6.670866511400000e-04 1.192824428900000e-03 2.268574241600000e-03 1.833633881600000e-03 3.484077233000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.830000000000000e+02 -1.286233681077863e+06 -5.112577142659954e+06 4.403297549969056e+06 -2.803695567523700e+03 -4.266255510787450e+03 -5.755455461616548e+03 1.905676576500000e-03 6.670866511400000e-04 1.192824428900000e-03 2.268574241600000e-03 1.833633881600000e-03 3.484077233000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.840000000000000e+02 -1.286289754802759e+06 -5.112662466443392e+06 4.403182439766339e+06 -2.803676573403606e+03 -4.266122211588759e+03 -5.755563976366439e+03 1.905676576500000e-03 6.670866511400000e-04 1.192824428900000e-03 2.268574241600000e-03 1.833633881600000e-03 3.484077233000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.850000000000000e+02 -1.286345828138411e+06 -5.112747787544136e+06 4.403067327415555e+06 -2.803657577307490e+03 -4.265988912463520e+03 -5.755672486777101e+03 1.905676576500000e-03 6.670866511400000e-04 1.192824428900000e-03 2.268574241600000e-03 1.833633881600000e-03 3.484077233000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.860000000000000e+02 -1.286401901106626e+06 -5.112833106001297e+06 4.402952212864920e+06 -2.803638578637103e+03 -4.265855609729278e+03 -5.755780995890641e+03 1.905676576500000e-03 6.670866511400000e-04 1.192824428900000e-03 2.268574241600000e-03 1.833633881600000e-03 3.484077233000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.870000000000000e+02 -1.286457973674649e+06 -5.112918421756175e+06 4.402837096192172e+06 -2.803619580081669e+03 -4.265722308318424e+03 -5.755889498835357e+03 1.905617031300000e-03 6.667651773900000e-04 1.192965535200000e-03 2.267757546100000e-03 1.833428780000000e-03 3.485073131200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.880000000000000e+02 -1.286514045864285e+06 -5.113003734847872e+06 4.402721977345521e+06 -2.803600579323735e+03 -4.265589004885779e+03 -5.755997999123883e+03 1.905617031300000e-03 6.667651773900000e-04 1.192965535200000e-03 2.267757546100000e-03 1.833428780000000e-03 3.485073131200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.890000000000000e+02 -1.286570117708296e+06 -5.113089045335131e+06 4.402606856247180e+06 -2.803581574901281e+03 -4.265455694155155e+03 -5.756106501369412e+03 1.905617031300000e-03 6.667651773900000e-04 1.192965535200000e-03 2.267757546100000e-03 1.833428780000000e-03 3.485073131200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.900000000000000e+02 -1.286626189152008e+06 -5.113174353119984e+06 4.402491733026893e+06 -2.803562570545235e+03 -4.265322384652763e+03 -5.756214997538976e+03 1.905617031300000e-03 6.667651773900000e-04 1.192965535200000e-03 2.267757546100000e-03 1.833428780000000e-03 3.485073131200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.910000000000000e+02 -1.286682260206267e+06 -5.113259658221900e+06 4.402376607658882e+06 -2.803543564422424e+03 -4.265189075184503e+03 -5.756323489311318e+03 1.905617031300000e-03 6.667651773900000e-04 1.192965535200000e-03 2.267757546100000e-03 1.833428780000000e-03 3.485073131200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.920000000000000e+02 -1.286738330880097e+06 -5.113344960668077e+06 4.402261480122424e+06 -2.803524464881888e+03 -4.265056149631571e+03 -5.756431724688684e+03 1.905617031300000e-03 6.667651773900000e-04 1.192965535200000e-03 2.267757546100000e-03 1.833428780000000e-03 3.485073131200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.930000000000000e+02 -1.286794401191233e+06 -5.113430260497920e+06 4.402146350375975e+06 -2.803505300055589e+03 -4.264923486998884e+03 -5.756539783436724e+03 1.905617031300000e-03 6.667651773900000e-04 1.192965535200000e-03 2.267757546100000e-03 1.833428780000000e-03 3.485073131200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.940000000000000e+02 -1.286850471095368e+06 -5.113515557613459e+06 4.402031218523376e+06 -2.803486288737857e+03 -4.264790171533631e+03 -5.756648266586712e+03 1.905617031300000e-03 6.667651773900000e-04 1.192965535200000e-03 2.267757546100000e-03 1.833428780000000e-03 3.485073131200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.950000000000000e+02 -1.286906540620785e+06 -5.113600852065410e+06 4.401916084497439e+06 -2.803467275114746e+03 -4.264656854123459e+03 -5.756756747065720e+03 1.905617031300000e-03 6.667651773900000e-04 1.192965535200000e-03 2.267757546100000e-03 1.833428780000000e-03 3.485073131200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.960000000000000e+02 -1.286962609800489e+06 -5.113686143912870e+06 4.401800948219867e+06 -2.803448259320743e+03 -4.264523528819873e+03 -5.756865229320409e+03 1.905617031300000e-03 6.667651773900000e-04 1.192965535200000e-03 2.267757546100000e-03 1.833428780000000e-03 3.485073131200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.970000000000000e+02 -1.287018678579487e+06 -5.113771433057402e+06 4.401685809821082e+06 -2.803429241525319e+03 -4.264390205554311e+03 -5.756973705760101e+03 1.905557422200000e-03 6.664436405900000e-04 1.193106470400000e-03 2.266940966900000e-03 1.833223284200000e-03 3.486069001700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.980000000000000e+02 -1.287074746968871e+06 -5.113856719518842e+06 4.401570669274804e+06 -2.803410223751747e+03 -4.264256881619712e+03 -5.757082177580313e+03 1.905557422200000e-03 6.664436405900000e-04 1.193106470400000e-03 2.266940966900000e-03 1.833223284200000e-03 3.486069001700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.990000000000000e+02 -1.287130814990437e+06 -5.113942003336289e+06 4.401455526529240e+06 -2.803391203049001e+03 -4.264123554094806e+03 -5.757190648238369e+03 1.905557422200000e-03 6.664436405900000e-04 1.193106470400000e-03 2.266940966900000e-03 1.833223284200000e-03 3.486069001700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.000000000000000e+02 -1.287186882622152e+06 -5.114027284470320e+06 4.401340381636631e+06 -2.803372180626488e+03 -4.263990226663703e+03 -5.757299114434905e+03 1.905557422200000e-03 6.664436405900000e-04 1.193106470400000e-03 2.266940966900000e-03 1.833223284200000e-03 3.486069001700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.010000000000000e+02 -1.287242949897017e+06 -5.114112562980010e+06 4.401225234518670e+06 -2.803353156455227e+03 -4.263856892945983e+03 -5.757407581011666e+03 1.905557422200000e-03 6.664436405900000e-04 1.193106470400000e-03 2.266940966900000e-03 1.833223284200000e-03 3.486069001700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.020000000000000e+02 -1.287299016760973e+06 -5.114197838774255e+06 4.401110085311399e+06 -2.803334173381568e+03 -4.263723921321453e+03 -5.757515751050747e+03 1.905557422200000e-03 6.664436405900000e-04 1.193106470400000e-03 2.266940966900000e-03 1.833223284200000e-03 3.486069001700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.030000000000000e+02 -1.287355083260623e+06 -5.114283111940534e+06 4.400994933909546e+06 -2.803315216188801e+03 -4.263591194329118e+03 -5.757623719898452e+03 1.905557422200000e-03 6.664436405900000e-04 1.193106470400000e-03 2.266940966900000e-03 1.833223284200000e-03 3.486069001700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.040000000000000e+02 -1.287411149366600e+06 -5.114368382416579e+06 4.400879780369683e+06 -2.803296187353928e+03 -4.263457856516642e+03 -5.757732176173228e+03 1.905557422200000e-03 6.664436405900000e-04 1.193106470400000e-03 2.266940966900000e-03 1.833223284200000e-03 3.486069001700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.050000000000000e+02 -1.287467215115501e+06 -5.114453650268010e+06 4.400764624604854e+06 -2.803277155128838e+03 -4.263324513142109e+03 -5.757840632972003e+03 1.905557422200000e-03 6.664436405900000e-04 1.193106470400000e-03 2.266940966900000e-03 1.833223284200000e-03 3.486069001700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.060000000000000e+02 -1.287523280441473e+06 -5.114538915376909e+06 4.400649466771360e+06 -2.803258122537964e+03 -4.263191175219919e+03 -5.757949080683125e+03 1.905557422200000e-03 6.664436405900000e-04 1.193106470400000e-03 2.266940966900000e-03 1.833223284200000e-03 3.486069001700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.070000000000000e+02 -1.287579345388470e+06 -5.114624177821985e+06 4.400534306764876e+06 -2.803239089399183e+03 -4.263057835039708e+03 -5.758057525218524e+03 1.905497749200000e-03 6.661220410500000e-04 1.193247234300000e-03 2.266124504400000e-03 1.833017394400000e-03 3.487064843700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.080000000000000e+02 -1.287635410011077e+06 -5.114709437701065e+06 4.400419144455723e+06 -2.803220050830841e+03 -4.262924483891992e+03 -5.758165975228431e+03 1.905497749200000e-03 6.661220410500000e-04 1.193247234300000e-03 2.266124504400000e-03 1.833017394400000e-03 3.487064843700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.090000000000000e+02 -1.287691474199854e+06 -5.114794694818117e+06 4.400303980103758e+06 -2.803201014093140e+03 -4.262791139446569e+03 -5.758274414278719e+03 1.905497749200000e-03 6.661220410500000e-04 1.193247234300000e-03 2.266124504400000e-03 1.833017394400000e-03 3.487064843700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.100000000000000e+02 -1.287747538053295e+06 -5.114879949349586e+06 4.400188813475084e+06 -2.803181973109209e+03 -4.262657785887574e+03 -5.758382856900746e+03 1.905497749200000e-03 6.661220410500000e-04 1.193247234300000e-03 2.266124504400000e-03 1.833017394400000e-03 3.487064843700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.110000000000000e+02 -1.287803601505542e+06 -5.114965201177578e+06 4.400073644726004e+06 -2.803162930786080e+03 -4.262524434274051e+03 -5.758491293500399e+03 1.905497749200000e-03 6.661220410500000e-04 1.193247234300000e-03 2.266124504400000e-03 1.833017394400000e-03 3.487064843700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.120000000000000e+02 -1.287859664554604e+06 -5.115050450307036e+06 4.399958473858929e+06 -2.803143782541853e+03 -4.262391320607097e+03 -5.758599589660706e+03 1.905497749200000e-03 6.661220410500000e-04 1.193247234300000e-03 2.266124504400000e-03 1.833017394400000e-03 3.487064843700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.130000000000000e+02 -1.287915727218629e+06 -5.115135696776466e+06 4.399843300829062e+06 -2.803124557760747e+03 -4.262258370191722e+03 -5.758707789493588e+03 1.905497749200000e-03 6.661220410500000e-04 1.193247234300000e-03 2.266124504400000e-03 1.833017394400000e-03 3.487064843700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.140000000000000e+02 -1.287971789548613e+06 -5.115220940662733e+06 4.399728125519264e+06 -2.803105508915357e+03 -4.262125006866780e+03 -5.758816222325813e+03 1.905497749200000e-03 6.661220410500000e-04 1.193247234300000e-03 2.266124504400000e-03 1.833017394400000e-03 3.487064843700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.150000000000000e+02 -1.288027851455512e+06 -5.115306181806367e+06 4.399612948140997e+06 -2.803086460989503e+03 -4.261991648441753e+03 -5.758924645948366e+03 1.905497749200000e-03 6.661220410500000e-04 1.193247234300000e-03 2.266124504400000e-03 1.833017394400000e-03 3.487064843700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.160000000000000e+02 -1.288083912983038e+06 -5.115391420285688e+06 4.399497768590417e+06 -2.803067410926079e+03 -4.261858288427308e+03 -5.759033066560192e+03 1.905497749200000e-03 6.661220410500000e-04 1.193247234300000e-03 2.266124504400000e-03 1.833017394400000e-03 3.487064843700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.170000000000000e+02 -1.288139974163942e+06 -5.115476656159387e+06 4.399382586789685e+06 -2.803048357053939e+03 -4.261724920786910e+03 -5.759141489431920e+03 1.905438012300000e-03 6.658003788999999e-04 1.193387826900000e-03 2.265308158600000e-03 1.832811110600000e-03 3.488060656700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.180000000000000e+02 -1.288196034943569e+06 -5.115561889329570e+06 4.399267402868624e+06 -2.803029303421715e+03 -4.261591554466871e+03 -5.759249906088819e+03 1.905438012300000e-03 6.658003788999999e-04 1.193387826900000e-03 2.265308158600000e-03 1.832811110600000e-03 3.488060656700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.190000000000000e+02 -1.288252095321807e+06 -5.115647119796083e+06 4.399152216827453e+06 -2.803010248515722e+03 -4.261458190069335e+03 -5.759358316714627e+03 1.905438012300000e-03 6.658003788999999e-04 1.193387826900000e-03 2.265308158600000e-03 1.832811110600000e-03 3.488060656700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.200000000000000e+02 -1.288308155342360e+06 -5.115732347637231e+06 4.399037028562322e+06 -2.802991190356157e+03 -4.261324820096776e+03 -5.759466727814665e+03 1.905438012300000e-03 6.658003788999999e-04 1.193387826900000e-03 2.265308158600000e-03 1.832811110600000e-03 3.488060656700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.210000000000000e+02 -1.288364214994399e+06 -5.115817572833593e+06 4.398921838098970e+06 -2.802972130977203e+03 -4.261191445783593e+03 -5.759575137596882e+03 1.905438012300000e-03 6.658003788999999e-04 1.193387826900000e-03 2.265308158600000e-03 1.832811110600000e-03 3.488060656700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.220000000000000e+02 -1.288420274254113e+06 -5.115902795353240e+06 4.398806645494830e+06 -2.802952984040263e+03 -4.261058450555754e+03 -5.759683292552165e+03 1.905438012300000e-03 6.658003788999999e-04 1.193387826900000e-03 2.265308158600000e-03 1.832811110600000e-03 3.488060656700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.230000000000000e+02 -1.288476333092463e+06 -5.115988015151588e+06 4.398691450819564e+06 -2.802933777909675e+03 -4.260925723138477e+03 -5.759791264874044e+03 1.905438012300000e-03 6.658003788999999e-04 1.193387826900000e-03 2.265308158600000e-03 1.832811110600000e-03 3.488060656700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.240000000000000e+02 -1.288532391581865e+06 -5.116073232340274e+06 4.398576253899493e+06 -2.802914712779984e+03 -4.260792342913602e+03 -5.759899666196868e+03 1.905438012300000e-03 6.658003788999999e-04 1.193387826900000e-03 2.265308158600000e-03 1.832811110600000e-03 3.488060656700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.250000000000000e+02 -1.288588449702448e+06 -5.116158446883767e+06 4.398461054781763e+06 -2.802895644871784e+03 -4.260658959194275e+03 -5.760008066219392e+03 1.905438012300000e-03 6.658003788999999e-04 1.193387826900000e-03 2.265308158600000e-03 1.832811110600000e-03 3.488060656700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.260000000000000e+02 -1.288644507399571e+06 -5.116243658684216e+06 4.398345853596207e+06 -2.802876578160038e+03 -4.260525580464524e+03 -5.760116456850970e+03 1.905438012300000e-03 6.658003788999999e-04 1.193387826900000e-03 2.265308158600000e-03 1.832811110600000e-03 3.488060656700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.270000000000000e+02 -1.288700564738841e+06 -5.116328867859123e+06 4.398230650186912e+06 -2.802857508201494e+03 -4.260392196042893e+03 -5.760224848041235e+03 1.905378211400000e-03 6.654786544600000e-04 1.193528248000000e-03 2.264491930000000e-03 1.832604432900000e-03 3.489056439700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.280000000000000e+02 -1.288756621698234e+06 -5.116414074369109e+06 4.398115444606147e+06 -2.802838435903409e+03 -4.260258809842895e+03 -5.760333236448824e+03 1.905378211400000e-03 6.654786544600000e-04 1.193528248000000e-03 2.264491930000000e-03 1.832604432900000e-03 3.489056439700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.290000000000000e+02 -1.288812678277874e+06 -5.116499278214367e+06 4.398000236853638e+06 -2.802819362975247e+03 -4.260125421227493e+03 -5.760441621834206e+03 1.905378211400000e-03 6.654786544600000e-04 1.193528248000000e-03 2.264491930000000e-03 1.832604432900000e-03 3.489056439700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.300000000000000e+02 -1.288868734488604e+06 -5.116584479414353e+06 4.397885026903577e+06 -2.802800287272475e+03 -4.259992028964664e+03 -5.760550006033103e+03 1.905378211400000e-03 6.654786544600000e-04 1.193528248000000e-03 2.264491930000000e-03 1.832604432900000e-03 3.489056439700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.310000000000000e+02 -1.288924790286487e+06 -5.116669677890464e+06 4.397769814860293e+06 -2.802781210631253e+03 -4.259858640419221e+03 -5.760658382704624e+03 1.905378211400000e-03 6.654786544600000e-04 1.193528248000000e-03 2.264491930000000e-03 1.832604432900000e-03 3.489056439700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.320000000000000e+02 -1.288980845721780e+06 -5.116754873749075e+06 4.397654600597555e+06 -2.802761900152731e+03 -4.259725651677686e+03 -5.760766550711428e+03 1.905378211400000e-03 6.654786544600000e-04 1.193528248000000e-03 2.264491930000000e-03 1.832604432900000e-03 3.489056439700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.330000000000000e+02 -1.289036900761973e+06 -5.116840066943523e+06 4.397539384187737e+06 -2.802742424770073e+03 -4.259592944597644e+03 -5.760874570284466e+03 1.905378211400000e-03 6.654786544600000e-04 1.193528248000000e-03 2.264491930000000e-03 1.832604432900000e-03 3.489056439700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.340000000000000e+02 -1.289092955422504e+06 -5.116925257473519e+06 4.397424165605820e+06 -2.802723342480097e+03 -4.259459543888455e+03 -5.760982943167215e+03 1.905378211400000e-03 6.654786544600000e-04 1.193528248000000e-03 2.264491930000000e-03 1.832604432900000e-03 3.489056439700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.350000000000000e+02 -1.289149009659179e+06 -5.117010445260013e+06 4.397308944956769e+06 -2.802704259815642e+03 -4.259326149060232e+03 -5.761091306650728e+03 1.905378211400000e-03 6.654786544600000e-04 1.193528248000000e-03 2.264491930000000e-03 1.832604432900000e-03 3.489056439700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.360000000000000e+02 -1.289205063581418e+06 -5.117095630498892e+06 4.397193721980540e+06 -2.802685172099627e+03 -4.259192741124175e+03 -5.761199677056347e+03 1.905378211400000e-03 6.654786544600000e-04 1.193528248000000e-03 2.264491930000000e-03 1.832604432900000e-03 3.489056439700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.370000000000000e+02 -1.289261117079809e+06 -5.117180812994299e+06 4.397078496937127e+06 -2.802666085541429e+03 -4.259059338043666e+03 -5.761308038191684e+03 1.905318346600000e-03 6.651568678800000e-04 1.193668497400000e-03 2.263675818700000e-03 1.832397361600000e-03 3.490052192200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.380000000000000e+02 -1.289317170198053e+06 -5.117265992824498e+06 4.396963269722648e+06 -2.802646996683301e+03 -4.258925933322248e+03 -5.761416396423960e+03 1.905318346600000e-03 6.651568678800000e-04 1.193668497400000e-03 2.263675818700000e-03 1.832397361600000e-03 3.490052192200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.390000000000000e+02 -1.289373222936031e+06 -5.117351169989326e+06 4.396848040337319e+06 -2.802627905451798e+03 -4.258792526646448e+03 -5.761524752021003e+03 1.905318346600000e-03 6.651568678800000e-04 1.193668497400000e-03 2.263675818700000e-03 1.832397361600000e-03 3.490052192200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.400000000000000e+02 -1.289429275315779e+06 -5.117436344528201e+06 4.396732808728815e+06 -2.802608812669906e+03 -4.258659113987244e+03 -5.761633107679545e+03 1.905318346600000e-03 6.651568678800000e-04 1.193668497400000e-03 2.263675818700000e-03 1.832397361600000e-03 3.490052192200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.410000000000000e+02 -1.289485327315273e+06 -5.117521516401739e+06 4.396617574949404e+06 -2.802589717607771e+03 -4.258525699300848e+03 -5.761741460718289e+03 1.905318346600000e-03 6.651568678800000e-04 1.193668497400000e-03 2.263675818700000e-03 1.832397361600000e-03 3.490052192200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.420000000000000e+02 -1.289541378916444e+06 -5.117606685573355e+06 4.396502339055128e+06 -2.802570818676966e+03 -4.258392425110395e+03 -5.761849619798847e+03 1.905318346600000e-03 6.651568678800000e-04 1.193668497400000e-03 2.263675818700000e-03 1.832397361600000e-03 3.490052192200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.430000000000000e+02 -1.289597430151389e+06 -5.117691852097457e+06 4.396387100978923e+06 -2.802552056639316e+03 -4.258259243265066e+03 -5.761957646276137e+03 1.905318346600000e-03 6.651568678800000e-04 1.193668497400000e-03 2.263675818700000e-03 1.832397361600000e-03 3.490052192200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.440000000000000e+02 -1.289653481002072e+06 -5.117777015949129e+06 4.396271860741255e+06 -2.802532956644885e+03 -4.258125824464340e+03 -5.762065989128032e+03 1.905318346600000e-03 6.651568678800000e-04 1.193668497400000e-03 2.263675818700000e-03 1.832397361600000e-03 3.490052192200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.450000000000000e+02 -1.289709531450378e+06 -5.117862177095986e+06 4.396156618385143e+06 -2.802513855531281e+03 -4.257992407495844e+03 -5.762174325955808e+03 1.905318346600000e-03 6.651568678800000e-04 1.193668497400000e-03 2.263675818700000e-03 1.832397361600000e-03 3.490052192200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.460000000000000e+02 -1.289765581573097e+06 -5.117947335675435e+06 4.396041373728086e+06 -2.802494751090383e+03 -4.257858978882188e+03 -5.762282667869501e+03 1.905318346600000e-03 6.651568678800000e-04 1.193668497400000e-03 2.263675818700000e-03 1.832397361600000e-03 3.490052192200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.470000000000000e+02 -1.289821631293361e+06 -5.118032491549985e+06 4.395926126952700e+06 -2.802475644920957e+03 -4.257725552365725e+03 -5.762391003815726e+03 1.905258417700000e-03 6.648350193600001e-04 1.193808575000000e-03 2.262859824800000e-03 1.832189896600000e-03 3.491047913700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.480000000000000e+02 -1.289877680600352e+06 -5.118117644700242e+06 4.395810878084740e+06 -2.802456539449082e+03 -4.257592128771463e+03 -5.762499332149177e+03 1.905258417700000e-03 6.648350193600001e-04 1.193808575000000e-03 2.262859824800000e-03 1.832189896600000e-03 3.491047913700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.490000000000000e+02 -1.289933729548710e+06 -5.118202795224041e+06 4.395695626994267e+06 -2.802437430675262e+03 -4.257458699770406e+03 -5.762607660845948e+03 1.905258417700000e-03 6.648350193600001e-04 1.193808575000000e-03 2.262859824800000e-03 1.832189896600000e-03 3.491047913700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.500000000000000e+02 -1.289989778138320e+06 -5.118287943121219e+06 4.395580373681504e+06 -2.802418318778764e+03 -4.257325265333747e+03 -5.762715989851802e+03 1.905258417700000e-03 6.648350193600001e-04 1.193808575000000e-03 2.262859824800000e-03 1.832189896600000e-03 3.491047913700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.510000000000000e+02 -1.290045826292645e+06 -5.118373088254791e+06 4.395465118328412e+06 -2.802399208427341e+03 -4.257191837568443e+03 -5.762824308057301e+03 1.905258417700000e-03 6.648350193600001e-04 1.193808575000000e-03 2.262859824800000e-03 1.832189896600000e-03 3.491047913700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.520000000000000e+02 -1.290101874070794e+06 -5.118458230751198e+06 4.395349860783062e+06 -2.802379770811249e+03 -4.257058856394227e+03 -5.762932421897295e+03 1.905258417700000e-03 6.648350193600001e-04 1.193808575000000e-03 2.262859824800000e-03 1.832189896600000e-03 3.491047913700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.530000000000000e+02 -1.290157921446734e+06 -5.118543370578283e+06 4.395234601099342e+06 -2.802360104309338e+03 -4.256926187193570e+03 -5.763040391566505e+03 1.905258417700000e-03 6.648350193600001e-04 1.193808575000000e-03 2.262859824800000e-03 1.832189896600000e-03 3.491047913700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.540000000000000e+02 -1.290213968481274e+06 -5.118628507809830e+06 4.395119339152029e+06 -2.802340985965411e+03 -4.256792742492244e+03 -5.763148710588896e+03 1.905258417700000e-03 6.648350193600001e-04 1.193808575000000e-03 2.262859824800000e-03 1.832189896600000e-03 3.491047913700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.550000000000000e+02 -1.290270015102212e+06 -5.118713642316694e+06 4.395004075112715e+06 -2.802321866605947e+03 -4.256659301391102e+03 -5.763257022209923e+03 1.905258417700000e-03 6.648350193600001e-04 1.193808575000000e-03 2.262859824800000e-03 1.832189896600000e-03 3.491047913700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.560000000000000e+02 -1.290326061342287e+06 -5.118798774157496e+06 4.394888808903517e+06 -2.802302745095348e+03 -4.256525858405561e+03 -5.763365331049014e+03 1.905258417700000e-03 6.648350193600001e-04 1.193808575000000e-03 2.262859824800000e-03 1.832189896600000e-03 3.491047913700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.570000000000000e+02 -1.290382107201626e+06 -5.118883903332436e+06 4.394773540524162e+06 -2.802283622782361e+03 -4.256392412994966e+03 -5.763473636945854e+03 1.905198424900000e-03 6.645131092000000e-04 1.193948480600000e-03 2.262043948700000e-03 1.831982038200000e-03 3.492043603000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.580000000000000e+02 -1.290438152680034e+06 -5.118969029841245e+06 4.394658269975035e+06 -2.802264497715161e+03 -4.256258966114336e+03 -5.763581940002156e+03 1.905198424900000e-03 6.645131092000000e-04 1.193948480600000e-03 2.262043948700000e-03 1.831982038200000e-03 3.492043603000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.590000000000000e+02 -1.290494197788583e+06 -5.119054153703704e+06 4.394542997229827e+06 -2.802245371421806e+03 -4.256125514933946e+03 -5.763690241709759e+03 1.905198424900000e-03 6.645131092000000e-04 1.193948480600000e-03 2.262043948700000e-03 1.831982038200000e-03 3.492043603000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.600000000000000e+02 -1.290550242483356e+06 -5.119139274841281e+06 4.394427722392911e+06 -2.802226244258434e+03 -4.255992067262683e+03 -5.763798536024774e+03 1.905198424900000e-03 6.645131092000000e-04 1.193948480600000e-03 2.262043948700000e-03 1.831982038200000e-03 3.492043603000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.610000000000000e+02 -1.290606286818994e+06 -5.119224393351782e+06 4.394312445334313e+06 -2.802207113911667e+03 -4.255858614216078e+03 -5.763906830627734e+03 1.905198424900000e-03 6.645131092000000e-04 1.193948480600000e-03 2.262043948700000e-03 1.831982038200000e-03 3.492043603000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.620000000000000e+02 -1.290662330776917e+06 -5.119309509202610e+06 4.394197166111995e+06 -2.802188142546402e+03 -4.255725477752591e+03 -5.764014814195497e+03 1.905198424900000e-03 6.645131092000000e-04 1.193948480600000e-03 2.262043948700000e-03 1.831982038200000e-03 3.492043603000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.630000000000000e+02 -1.290718374356196e+06 -5.119394622392613e+06 4.394081884737701e+06 -2.802169280323796e+03 -4.255592561944173e+03 -5.764122580144163e+03 1.905198424900000e-03 6.645131092000000e-04 1.193948480600000e-03 2.262043948700000e-03 1.831982038200000e-03 3.492043603000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.640000000000000e+02 -1.290774417548843e+06 -5.119479732906413e+06 4.393966601207037e+06 -2.802150144720257e+03 -4.255459102926926e+03 -5.764230866116893e+03 1.905198424900000e-03 6.645131092000000e-04 1.193948480600000e-03 2.262043948700000e-03 1.831982038200000e-03 3.492043603000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.650000000000000e+02 -1.290830460360472e+06 -5.119564840754033e+06 4.393851315506663e+06 -2.802131008287686e+03 -4.255325641343421e+03 -5.764339149265147e+03 1.905198424900000e-03 6.645131092000000e-04 1.193948480600000e-03 2.262043948700000e-03 1.831982038200000e-03 3.492043603000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.660000000000000e+02 -1.290886502780017e+06 -5.119649945915719e+06 4.393736027662847e+06 -2.802111870046493e+03 -4.255192179857511e+03 -5.764447427991742e+03 1.905198424900000e-03 6.645131092000000e-04 1.193948480600000e-03 2.262043948700000e-03 1.831982038200000e-03 3.492043603000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.670000000000000e+02 -1.290942544829262e+06 -5.119735048430487e+06 4.393620737623729e+06 -2.802092729196049e+03 -4.255058714587560e+03 -5.764555705562817e+03 1.905138368000000e-03 6.641911375300000e-04 1.194088214100000e-03 2.261228190400000e-03 1.831773786400000e-03 3.493039260000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.680000000000000e+02 -1.290998586497382e+06 -5.119820148278951e+06 4.393505445415078e+06 -2.802073587509575e+03 -4.254925246981700e+03 -5.764663980138555e+03 1.905138368000000e-03 6.641911375300000e-04 1.194088214100000e-03 2.261228190400000e-03 1.831773786400000e-03 3.493039260000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.690000000000000e+02 -1.291054627806165e+06 -5.119905245500124e+06 4.393390150985016e+06 -2.802054442614878e+03 -4.254791773629685e+03 -5.764772255291039e+03 1.905138368000000e-03 6.641911375300000e-04 1.194088214100000e-03 2.261228190400000e-03 1.831773786400000e-03 3.493039260000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.700000000000000e+02 -1.291110668689789e+06 -5.119990339976320e+06 4.393274854490045e+06 -2.802035297331255e+03 -4.254658306174554e+03 -5.764880521049017e+03 1.905138368000000e-03 6.641911375300000e-04 1.194088214100000e-03 2.261228190400000e-03 1.831773786400000e-03 3.493039260000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.710000000000000e+02 -1.291166709214085e+06 -5.120075431825263e+06 4.393159555773618e+06 -2.802016150391073e+03 -4.254524832357249e+03 -5.764988787194745e+03 1.905138368000000e-03 6.641911375300000e-04 1.194088214100000e-03 2.261228190400000e-03 1.831773786400000e-03 3.493039260000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.720000000000000e+02 -1.291222749351925e+06 -5.120160521013735e+06 4.393044254890789e+06 -2.801996749059153e+03 -4.254391668610504e+03 -5.765096921491219e+03 1.905138368000000e-03 6.641911375300000e-04 1.194088214100000e-03 2.261228190400000e-03 1.831773786400000e-03 3.493039260000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.730000000000000e+02 -1.291278789081363e+06 -5.120245607513094e+06 4.392928951887228e+06 -2.801977171683813e+03 -4.254258721929120e+03 -5.765204961092214e+03 1.905138368000000e-03 6.641911375300000e-04 1.194088214100000e-03 2.261228190400000e-03 1.831773786400000e-03 3.493039260000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.740000000000000e+02 -1.291334828425276e+06 -5.120330691338430e+06 4.392813646724419e+06 -2.801958019033118e+03 -4.254125242306438e+03 -5.765313218654262e+03 1.905138368000000e-03 6.641911375300000e-04 1.194088214100000e-03 2.261228190400000e-03 1.831773786400000e-03 3.493039260000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.750000000000000e+02 -1.291390867376706e+06 -5.120415772477357e+06 4.392698339418855e+06 -2.801938864480298e+03 -4.253991762893401e+03 -5.765421471750252e+03 1.905138368000000e-03 6.641911375300000e-04 1.194088214100000e-03 2.261228190400000e-03 1.831773786400000e-03 3.493039260000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.760000000000000e+02 -1.291446905957678e+06 -5.120500850969235e+06 4.392583029918158e+06 -2.801919708586342e+03 -4.253858278958170e+03 -5.765529723712605e+03 1.905138368000000e-03 6.641911375300000e-04 1.194088214100000e-03 2.261228190400000e-03 1.831773786400000e-03 3.493039260000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.770000000000000e+02 -1.291502944135235e+06 -5.120585926755160e+06 4.392467718300699e+06 -2.801900551660816e+03 -4.253724796979994e+03 -5.765637969524629e+03 1.905078247100000e-03 6.638691046700000e-04 1.194227775400000e-03 2.260412550500000e-03 1.831565141300000e-03 3.494034883400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.780000000000000e+02 -1.291558981985897e+06 -5.120670999972046e+06 4.392352404384363e+06 -2.801881389894494e+03 -4.253591304027929e+03 -5.765746220542035e+03 1.905078247100000e-03 6.638691046700000e-04 1.194227775400000e-03 2.260412550500000e-03 1.831565141300000e-03 3.494034883400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.790000000000000e+02 -1.291615019422200e+06 -5.120756070463437e+06 4.392237088377260e+06 -2.801862228787504e+03 -4.253457814057427e+03 -5.765854463924321e+03 1.905078247100000e-03 6.638691046700000e-04 1.194227775400000e-03 2.260412550500000e-03 1.831565141300000e-03 3.494034883400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.800000000000000e+02 -1.291671056465928e+06 -5.120841138268330e+06 4.392121770227511e+06 -2.801843065967503e+03 -4.253324324074746e+03 -5.765962702928552e+03 1.905078247100000e-03 6.638691046700000e-04 1.194227775400000e-03 2.260412550500000e-03 1.831565141300000e-03 3.494034883400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.810000000000000e+02 -1.291727093127915e+06 -5.120926203406158e+06 4.392006449909301e+06 -2.801823900868431e+03 -4.253190832446889e+03 -5.766070939024570e+03 1.905078247100000e-03 6.638691046700000e-04 1.194227775400000e-03 2.260412550500000e-03 1.831565141300000e-03 3.494034883400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.820000000000000e+02 -1.291783129430640e+06 -5.121011265921935e+06 4.391891127374696e+06 -2.801804756825099e+03 -4.253057617389095e+03 -5.766178952615599e+03 1.905078247100000e-03 6.638691046700000e-04 1.194227775400000e-03 2.260412550500000e-03 1.831565141300000e-03 3.494034883400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.830000000000000e+02 -1.291839165335996e+06 -5.121096325750973e+06 4.391775802718147e+06 -2.801785626158919e+03 -4.252924600225096e+03 -5.766286806268073e+03 1.905078247100000e-03 6.638691046700000e-04 1.194227775400000e-03 2.260412550500000e-03 1.831565141300000e-03 3.494034883400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.840000000000000e+02 -1.291895200828916e+06 -5.121181382858068e+06 4.391660475966131e+06 -2.801766457248849e+03 -4.252791103842031e+03 -5.766395032212802e+03 1.905078247100000e-03 6.638691046700000e-04 1.194227775400000e-03 2.260412550500000e-03 1.831565141300000e-03 3.494034883400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.850000000000000e+02 -1.291951235983828e+06 -5.121266437376373e+06 4.391545146941504e+06 -2.801747284136533e+03 -4.252657598317470e+03 -5.766503261710181e+03 1.905078247100000e-03 6.638691046700000e-04 1.194227775400000e-03 2.260412550500000e-03 1.831565141300000e-03 3.494034883400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.860000000000000e+02 -1.292007270713029e+06 -5.121351489149087e+06 4.391429815852904e+06 -2.801728110732861e+03 -4.252524098430811e+03 -5.766611481972129e+03 1.905078247100000e-03 6.638691046700000e-04 1.194227775400000e-03 2.260412550500000e-03 1.831565141300000e-03 3.494034883400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.870000000000000e+02 -1.292063305115175e+06 -5.121436538352611e+06 4.391314482465578e+06 -2.801708934206390e+03 -4.252390586624373e+03 -5.766719707425736e+03 1.905018062100000e-03 6.635470107900000e-04 1.194367164200000e-03 2.259597028800000e-03 1.831356103200000e-03 3.495030472900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.880000000000000e+02 -1.292119339080677e+06 -5.121521584791020e+06 4.391199147040282e+06 -2.801689757759627e+03 -4.252257082465964e+03 -5.766827921973070e+03 1.905018062100000e-03 6.635470107900000e-04 1.194367164200000e-03 2.259597028800000e-03 1.831356103200000e-03 3.495030472900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.890000000000000e+02 -1.292175372686048e+06 -5.121606628601181e+06 4.391083809394866e+06 -2.801670578070017e+03 -4.252123572573885e+03 -5.766936137099579e+03 1.905018062100000e-03 6.635470107900000e-04 1.194367164200000e-03 2.259597028800000e-03 1.831356103200000e-03 3.495030472900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.900000000000000e+02 -1.292231405931412e+06 -5.121691669783298e+06 4.390968469529055e+06 -2.801651396600892e+03 -4.251990056819720e+03 -5.767044352285462e+03 1.905018062100000e-03 6.635470107900000e-04 1.194367164200000e-03 2.259597028800000e-03 1.831356103200000e-03 3.495030472900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.910000000000000e+02 -1.292287438783820e+06 -5.121776708278481e+06 4.390853127521225e+06 -2.801632213623247e+03 -4.251856540788744e+03 -5.767152563207172e+03 1.905018062100000e-03 6.635470107900000e-04 1.194367164200000e-03 2.259597028800000e-03 1.831356103200000e-03 3.495030472900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.920000000000000e+02 -1.292343471222102e+06 -5.121861744052957e+06 4.390737783428235e+06 -2.801613071835321e+03 -4.251723305115896e+03 -5.767260540394437e+03 1.905018062100000e-03 6.635470107900000e-04 1.194367164200000e-03 2.259597028800000e-03 1.831356103200000e-03 3.495030472900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.930000000000000e+02 -1.292399503299385e+06 -5.121946777204480e+06 4.390622437128250e+06 -2.801593958232766e+03 -4.251590256238309e+03 -5.767368359842860e+03 1.905018062100000e-03 6.635470107900000e-04 1.194367164200000e-03 2.259597028800000e-03 1.831356103200000e-03 3.495030472900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.940000000000000e+02 -1.292455534952773e+06 -5.122031807613841e+06 4.390507088759788e+06 -2.801574771465947e+03 -4.251456741804145e+03 -5.767476555811377e+03 1.905018062100000e-03 6.635470107900000e-04 1.194367164200000e-03 2.259597028800000e-03 1.831356103200000e-03 3.495030472900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.950000000000000e+02 -1.292511566267715e+06 -5.122116835433855e+06 4.390391738119432e+06 -2.801555580848110e+03 -4.251323218020533e+03 -5.767584755338629e+03 1.905018062100000e-03 6.635470107900000e-04 1.194367164200000e-03 2.259597028800000e-03 1.831356103200000e-03 3.495030472900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.960000000000000e+02 -1.292567597189604e+06 -5.122201860566857e+06 4.390276385337180e+06 -2.801536389937880e+03 -4.251189693621443e+03 -5.767692950345402e+03 1.905018062100000e-03 6.635470107900000e-04 1.194367164200000e-03 2.259597028800000e-03 1.831356103200000e-03 3.495030472900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.970000000000000e+02 -1.292623627729181e+06 -5.122286883032136e+06 4.390161030387371e+06 -2.801517196014051e+03 -4.251056167662267e+03 -5.767801142689055e+03 1.904957813100000e-03 6.632248560600000e-04 1.194506380600000e-03 2.258781625700000e-03 1.831146672100000e-03 3.496026027900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.980000000000000e+02 -1.292679657897529e+06 -5.122371902849469e+06 4.390045673243666e+06 -2.801498001181154e+03 -4.250922637437453e+03 -5.767909333521908e+03 1.904957813100000e-03 6.632248560600000e-04 1.194506380600000e-03 2.258781625700000e-03 1.831146672100000e-03 3.496026027900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.990000000000000e+02 -1.292735687639794e+06 -5.122456919920839e+06 4.389930314036579e+06 -2.801478805710492e+03 -4.250789112641642e+03 -5.768017515426547e+03 1.904957813100000e-03 6.632248560600000e-04 1.194506380600000e-03 2.258781625700000e-03 1.831146672100000e-03 3.496026027900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.000000000000000e+02 -1.292791717065326e+06 -5.122541934441786e+06 4.389814952505754e+06 -2.801459605299015e+03 -4.250655575249329e+03 -5.768125703793069e+03 1.904957813100000e-03 6.632248560600000e-04 1.194506380600000e-03 2.258781625700000e-03 1.831146672100000e-03 3.496026027900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.010000000000000e+02 -1.292847746064785e+06 -5.122626946216809e+06 4.389699588911496e+06 -2.801440405925706e+03 -4.250522042471966e+03 -5.768233883139435e+03 1.904957813100000e-03 6.632248560600000e-04 1.194506380600000e-03 2.258781625700000e-03 1.831146672100000e-03 3.496026027900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.020000000000000e+02 -1.292903774699016e+06 -5.122711955370374e+06 4.389584223101103e+06 -2.801420967246297e+03 -4.250388864331037e+03 -5.768341890974319e+03 1.904957813100000e-03 6.632248560600000e-04 1.194506380600000e-03 2.258781625700000e-03 1.831146672100000e-03 3.496026027900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.030000000000000e+02 -1.292959802889128e+06 -5.122796961772427e+06 4.389468855256874e+06 -2.801401362999305e+03 -4.250255943216379e+03 -5.768449769795414e+03 1.904957813100000e-03 6.632248560600000e-04 1.194506380600000e-03 2.258781625700000e-03 1.831146672100000e-03 3.496026027900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.040000000000000e+02 -1.293015830727220e+06 -5.122881965561005e+06 4.389353485172852e+06 -2.801382157647907e+03 -4.250122400832067e+03 -5.768557943551994e+03 1.904957813100000e-03 6.632248560600000e-04 1.194506380600000e-03 2.258781625700000e-03 1.831146672100000e-03 3.496026027900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.050000000000000e+02 -1.293071858171858e+06 -5.122966966662099e+06 4.389238112947617e+06 -2.801362950192124e+03 -4.249988858508730e+03 -5.768666113041901e+03 1.904957813100000e-03 6.632248560600000e-04 1.194506380600000e-03 2.258781625700000e-03 1.831146672100000e-03 3.496026027900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.060000000000000e+02 -1.293127885211981e+06 -5.123051965055969e+06 4.389122738607456e+06 -2.801343741543593e+03 -4.249855317942547e+03 -5.768774276604397e+03 1.904957813100000e-03 6.632248560600000e-04 1.194506380600000e-03 2.258781625700000e-03 1.831146672100000e-03 3.496026027900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.070000000000000e+02 -1.293183911891502e+06 -5.123136960821090e+06 4.389007362047850e+06 -2.801324531274406e+03 -4.249721771492462e+03 -5.768882440173777e+03 1.904897500000000e-03 6.629026408000000e-04 1.194645424200000e-03 2.257966341500000e-03 1.830936848100000e-03 3.497021547300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.080000000000000e+02 -1.293239938188329e+06 -5.123221953918049e+06 4.388891983321307e+06 -2.801305318096742e+03 -4.249588223368045e+03 -5.768990601121884e+03 1.904897500000000e-03 6.629026408000000e-04 1.194645424200000e-03 2.257966341500000e-03 1.830936848100000e-03 3.497021547300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.090000000000000e+02 -1.293295964113531e+06 -5.123306944366602e+06 4.388776602401490e+06 -2.801286103672231e+03 -4.249454670724522e+03 -5.769098760891410e+03 1.904897500000000e-03 6.629026408000000e-04 1.194645424200000e-03 2.257966341500000e-03 1.830936848100000e-03 3.497021547300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.100000000000000e+02 -1.293351989645108e+06 -5.123391932127471e+06 4.388661219340743e+06 -2.801266887584065e+03 -4.249321118319885e+03 -5.769206916075208e+03 1.904897500000000e-03 6.629026408000000e-04 1.194645424200000e-03 2.257966341500000e-03 1.830936848100000e-03 3.497021547300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.110000000000000e+02 -1.293408014793885e+06 -5.123476917220047e+06 4.388545834113234e+06 -2.801247669191142e+03 -4.249187564016192e+03 -5.769315068552877e+03 1.904897500000000e-03 6.629026408000000e-04 1.194645424200000e-03 2.257966341500000e-03 1.830936848100000e-03 3.497021547300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.120000000000000e+02 -1.293464039562520e+06 -5.123561899651409e+06 4.388430446724906e+06 -2.801228576292051e+03 -4.249054350629139e+03 -5.769422906448473e+03 1.904897500000000e-03 6.629026408000000e-04 1.194645424200000e-03 2.257966341500000e-03 1.830936848100000e-03 3.497021547300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.130000000000000e+02 -1.293520063928009e+06 -5.123646879382128e+06 4.388315057239043e+06 -2.801209570447410e+03 -4.248921378570688e+03 -5.769530520932123e+03 1.904897500000000e-03 6.629026408000000e-04 1.194645424200000e-03 2.257966341500000e-03 1.830936848100000e-03 3.497021547300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.140000000000000e+02 -1.293576087948063e+06 -5.123731856511409e+06 4.388199665497350e+06 -2.801190345805745e+03 -4.248787814645206e+03 -5.769638667946940e+03 1.904897500000000e-03 6.629026408000000e-04 1.194645424200000e-03 2.257966341500000e-03 1.830936848100000e-03 3.497021547300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.150000000000000e+02 -1.293632111563451e+06 -5.123816830933355e+06 4.388084271640914e+06 -2.801171121402831e+03 -4.248654251754968e+03 -5.769746808976498e+03 1.904897500000000e-03 6.629026408000000e-04 1.194645424200000e-03 2.257966341500000e-03 1.830936848100000e-03 3.497021547300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.160000000000000e+02 -1.293688134806888e+06 -5.123901802706496e+06 4.387968875591762e+06 -2.801151894189292e+03 -4.248520685383934e+03 -5.769854948703281e+03 1.904897500000000e-03 6.629026408000000e-04 1.194645424200000e-03 2.257966341500000e-03 1.830936848100000e-03 3.497021547300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.170000000000000e+02 -1.293744157656372e+06 -5.123986771791544e+06 4.387853477402250e+06 -2.801132665222960e+03 -4.248387118792807e+03 -5.769963084227905e+03 1.904837122700000e-03 6.625803651500000e-04 1.194784295100000e-03 2.257151176200000e-03 1.830726631300000e-03 3.498017030800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.180000000000000e+02 -1.293800180101082e+06 -5.124071738169146e+06 4.387738077098176e+06 -2.801113436410152e+03 -4.248253553876601e+03 -5.770071213322387e+03 1.904837122700000e-03 6.625803651500000e-04 1.194784295100000e-03 2.257151176200000e-03 1.830726631300000e-03 3.498017030800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.190000000000000e+02 -1.293856202184681e+06 -5.124156701917378e+06 4.387622674575482e+06 -2.801094204365462e+03 -4.248119983069199e+03 -5.770179343105428e+03 1.904837122700000e-03 6.625803651500000e-04 1.194784295100000e-03 2.257151176200000e-03 1.830726631300000e-03 3.498017030800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.200000000000000e+02 -1.293912223896109e+06 -5.124241663016508e+06 4.387507269860468e+06 -2.801074969704893e+03 -4.247986408784719e+03 -5.770287471500716e+03 1.904837122700000e-03 6.625803651500000e-04 1.194784295100000e-03 2.257151176200000e-03 1.830726631300000e-03 3.498017030800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.210000000000000e+02 -1.293968245213602e+06 -5.124326621427634e+06 4.387391863004989e+06 -2.801055734637606e+03 -4.247852833816568e+03 -5.770395595476717e+03 1.904837122700000e-03 6.625803651500000e-04 1.194784295100000e-03 2.257151176200000e-03 1.830726631300000e-03 3.498017030800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.220000000000000e+02 -1.294024266131265e+06 -5.124411577157174e+06 4.387276454012074e+06 -2.801036212114819e+03 -4.247719594141149e+03 -5.770503582950802e+03 1.904837122700000e-03 6.625803651500000e-04 1.194784295100000e-03 2.257151176200000e-03 1.830726631300000e-03 3.498017030800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.230000000000000e+02 -1.294080286637332e+06 -5.124496530195870e+06 4.387161042902139e+06 -2.801016490378385e+03 -4.247586587701311e+03 -5.770611473607609e+03 1.904837122700000e-03 6.625803651500000e-04 1.194784295100000e-03 2.257151176200000e-03 1.830726631300000e-03 3.498017030800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.240000000000000e+02 -1.294136306777759e+06 -5.124581480597214e+06 4.387045629584231e+06 -2.800997249045946e+03 -4.247453005115100e+03 -5.770719590606049e+03 1.904837122700000e-03 6.625803651500000e-04 1.194784295100000e-03 2.257151176200000e-03 1.830726631300000e-03 3.498017030800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.250000000000000e+02 -1.294192326491122e+06 -5.124666428251482e+06 4.386930214204636e+06 -2.800978007455472e+03 -4.247319427976433e+03 -5.770827698510105e+03 1.904837122700000e-03 6.625803651500000e-04 1.194784295100000e-03 2.257151176200000e-03 1.830726631300000e-03 3.498017030800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.260000000000000e+02 -1.294248345876034e+06 -5.124751373334876e+06 4.386814796528442e+06 -2.800958762592161e+03 -4.247185839496918e+03 -5.770935811218827e+03 1.904837122700000e-03 6.625803651500000e-04 1.194784295100000e-03 2.257151176200000e-03 1.830726631300000e-03 3.498017030800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.270000000000000e+02 -1.294304364844839e+06 -5.124836315690792e+06 4.386699376764434e+06 -2.800939517071277e+03 -4.247052254311583e+03 -5.771043916621585e+03 1.904776681300000e-03 6.622580294100000e-04 1.194922992900000e-03 2.256336130300000e-03 1.830516021900000e-03 3.499012477300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.280000000000000e+02 -1.294360383474016e+06 -5.124921255455946e+06 4.386583954730337e+06 -2.800920267259638e+03 -4.246918660315317e+03 -5.771152025353003e+03 1.904776681300000e-03 6.622580294100000e-04 1.194922992900000e-03 2.256336130300000e-03 1.830516021900000e-03 3.499012477300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.290000000000000e+02 -1.294416401676152e+06 -5.125006192474114e+06 4.386468530634454e+06 -2.800901018640601e+03 -4.246785070884677e+03 -5.771260125044217e+03 1.904776681300000e-03 6.622580294100000e-04 1.194922992900000e-03 2.256336130300000e-03 1.830516021900000e-03 3.499012477300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.300000000000000e+02 -1.294472419483957e+06 -5.125091126803795e+06 4.386353104398788e+06 -2.800881768228367e+03 -4.246651481819998e+03 -5.771368220110608e+03 1.904776681300000e-03 6.622580294100000e-04 1.194922992900000e-03 2.256336130300000e-03 1.830516021900000e-03 3.499012477300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.310000000000000e+02 -1.294528436962973e+06 -5.125176058562138e+06 4.386237675867124e+06 -2.800862513126437e+03 -4.246517881486572e+03 -5.771476320521367e+03 1.904776681300000e-03 6.622580294100000e-04 1.194922992900000e-03 2.256336130300000e-03 1.830516021900000e-03 3.499012477300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.320000000000000e+02 -1.294584454005254e+06 -5.125260987559057e+06 4.386122245304414e+06 -2.800843327278314e+03 -4.246384549210433e+03 -5.771584185085191e+03 1.904776681300000e-03 6.622580294100000e-04 1.194922992900000e-03 2.256336130300000e-03 1.830516021900000e-03 3.499012477300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.330000000000000e+02 -1.294640470669463e+06 -5.125345913901402e+06 4.386006812576168e+06 -2.800824185175342e+03 -4.246251395585117e+03 -5.771691891789581e+03 1.904776681300000e-03 6.622580294100000e-04 1.194922992900000e-03 2.256336130300000e-03 1.830516021900000e-03 3.499012477300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.340000000000000e+02 -1.294696486939144e+06 -5.125430837554970e+06 4.385891377708538e+06 -2.800804927861533e+03 -4.246117796190988e+03 -5.771799977100791e+03 1.904776681300000e-03 6.622580294100000e-04 1.194922992900000e-03 2.256336130300000e-03 1.830516021900000e-03 3.499012477300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.350000000000000e+02 -1.294752502825261e+06 -5.125515758539408e+06 4.385775940675342e+06 -2.800785668050863e+03 -4.245984195274743e+03 -5.771908059503318e+03 1.904776681300000e-03 6.622580294100000e-04 1.194922992900000e-03 2.256336130300000e-03 1.830516021900000e-03 3.499012477300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.360000000000000e+02 -1.294808518349586e+06 -5.125600676893641e+06 4.385660501424647e+06 -2.800766405245528e+03 -4.245850588416202e+03 -5.772016142530273e+03 1.904776681300000e-03 6.622580294100000e-04 1.194922992900000e-03 2.256336130300000e-03 1.830516021900000e-03 3.499012477300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.370000000000000e+02 -1.294864533490358e+06 -5.125685592578779e+06 4.385545060008329e+06 -2.800747141503046e+03 -4.245716979492110e+03 -5.772124222401080e+03 1.904716175800000e-03 6.619356337700000e-04 1.195061517600000e-03 2.255521203800000e-03 1.830305020100000e-03 3.500007886400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.380000000000000e+02 -1.294920548225578e+06 -5.125770505555565e+06 4.385429616478764e+06 -2.800727876592133e+03 -4.245583372321683e+03 -5.772232296341435e+03 1.904716175800000e-03 6.619356337700000e-04 1.195061517600000e-03 2.255521203800000e-03 1.830305020100000e-03 3.500007886400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.390000000000000e+02 -1.294976562587955e+06 -5.125855415882476e+06 4.385314170757943e+06 -2.800708608868906e+03 -4.245449761368142e+03 -5.772340369205704e+03 1.904716175800000e-03 6.619356337700000e-04 1.195061517600000e-03 2.255521203800000e-03 1.830305020100000e-03 3.500007886400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.400000000000000e+02 -1.295032576566674e+06 -5.125940323540171e+06 4.385198722871674e+06 -2.800689340364764e+03 -4.245316148139241e+03 -5.772448439006065e+03 1.904716175800000e-03 6.619356337700000e-04 1.195061517600000e-03 2.255521203800000e-03 1.830305020100000e-03 3.500007886400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.410000000000000e+02 -1.295088590183502e+06 -5.126025228567573e+06 4.385083272768013e+06 -2.800670068693411e+03 -4.245182529259857e+03 -5.772556509283070e+03 1.904716175800000e-03 6.619356337700000e-04 1.195061517600000e-03 2.255521203800000e-03 1.830305020100000e-03 3.500007886400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.420000000000000e+02 -1.295144603381335e+06 -5.126110130872119e+06 4.384967820580614e+06 -2.800650682058602e+03 -4.245049179872004e+03 -5.772664420181509e+03 1.904716175800000e-03 6.619356337700000e-04 1.195061517600000e-03 2.255521203800000e-03 1.830305020100000e-03 3.500007886400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.430000000000000e+02 -1.295200616199272e+06 -5.126195030530170e+06 4.384852366214643e+06 -2.800631214765169e+03 -4.244916011646492e+03 -5.772772223687080e+03 1.904716175800000e-03 6.619356337700000e-04 1.195061517600000e-03 2.255521203800000e-03 1.830305020100000e-03 3.500007886400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.440000000000000e+02 -1.295256628609081e+06 -5.126279927475408e+06 4.384736909741409e+06 -2.800611939631242e+03 -4.244782394090094e+03 -5.772880279081864e+03 1.904716175800000e-03 6.619356337700000e-04 1.195061517600000e-03 2.255521203800000e-03 1.830305020100000e-03 3.500007886400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.450000000000000e+02 -1.295312640656777e+06 -5.126364821790069e+06 4.384621451051179e+06 -2.800592661389326e+03 -4.244648771127067e+03 -5.772988334744809e+03 1.904716175800000e-03 6.619356337700000e-04 1.195061517600000e-03 2.255521203800000e-03 1.830305020100000e-03 3.500007886400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.460000000000000e+02 -1.295368652353425e+06 -5.126449713493899e+06 4.384505990117596e+06 -2.800573380834161e+03 -4.244515140157123e+03 -5.773096392295755e+03 1.904716175800000e-03 6.619356337700000e-04 1.195061517600000e-03 2.255521203800000e-03 1.830305020100000e-03 3.500007886400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.470000000000000e+02 -1.295424663611304e+06 -5.126534602430271e+06 4.384390527149693e+06 -2.800554100022161e+03 -4.244381516829966e+03 -5.773204439108124e+03 1.904655606000000e-03 6.616131784100000e-04 1.195199869100000e-03 2.254706396900000e-03 1.830093625800000e-03 3.501003257400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.480000000000000e+02 -1.295480674507127e+06 -5.126619488736186e+06 4.384275061964627e+06 -2.800534817545412e+03 -4.244247887292070e+03 -5.773312486185907e+03 1.904655606000000e-03 6.616131784100000e-04 1.195199869100000e-03 2.254706396900000e-03 1.830093625800000e-03 3.501003257400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.490000000000000e+02 -1.295536685018890e+06 -5.126704372372400e+06 4.384159594614787e+06 -2.800515532606738e+03 -4.244114256068125e+03 -5.773420530463524e+03 1.904655606000000e-03 6.616131784100000e-04 1.195199869100000e-03 2.254706396900000e-03 1.830093625800000e-03 3.501003257400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.500000000000000e+02 -1.295592695146484e+06 -5.126789253338746e+06 4.384044125100390e+06 -2.800496245481532e+03 -4.243980622789903e+03 -5.773528572101939e+03 1.904655606000000e-03 6.616131784100000e-04 1.195199869100000e-03 2.254706396900000e-03 1.830093625800000e-03 3.501003257400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.510000000000000e+02 -1.295648704900970e+06 -5.126874131654966e+06 4.383928653395087e+06 -2.800476957247753e+03 -4.243846985625191e+03 -5.773636612024813e+03 1.904655606000000e-03 6.616131784100000e-04 1.195199869100000e-03 2.254706396900000e-03 1.830093625800000e-03 3.501003257400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.520000000000000e+02 -1.295704714262521e+06 -5.126959007289744e+06 4.383813179558098e+06 -2.800457775120331e+03 -4.243713743833398e+03 -5.773744305161229e+03 1.904655606000000e-03 6.616131784100000e-04 1.195199869100000e-03 2.254706396900000e-03 1.830093625800000e-03 3.501003257400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.530000000000000e+02 -1.295760723179043e+06 -5.127043880152931e+06 4.383697703721949e+06 -2.800438668342357e+03 -4.243580785760718e+03 -5.773851748359451e+03 1.904655606000000e-03 6.616131784100000e-04 1.195199869100000e-03 2.254706396900000e-03 1.830093625800000e-03 3.501003257400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.540000000000000e+02 -1.295816731773427e+06 -5.127128750457079e+06 4.383582225573297e+06 -2.800419374379384e+03 -4.243447140528337e+03 -5.773959781434824e+03 1.904655606000000e-03 6.616131784100000e-04 1.195199869100000e-03 2.254706396900000e-03 1.830093625800000e-03 3.501003257400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.550000000000000e+02 -1.295872739972605e+06 -5.127213618071748e+06 4.383466745286291e+06 -2.800400078491922e+03 -4.243313495372270e+03 -5.774067810159929e+03 1.904655606000000e-03 6.616131784100000e-04 1.195199869100000e-03 2.254706396900000e-03 1.830093625800000e-03 3.501003257400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.560000000000000e+02 -1.295928747776460e+06 -5.127298482996769e+06 4.383351262861156e+06 -2.800380780830324e+03 -4.243179850046951e+03 -5.774175834656300e+03 1.904655606000000e-03 6.616131784100000e-04 1.195199869100000e-03 2.254706396900000e-03 1.830093625800000e-03 3.501003257400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.570000000000000e+02 -1.295984755196056e+06 -5.127383345251885e+06 4.383235778271534e+06 -2.800361482421522e+03 -4.243046202434941e+03 -5.774283856083181e+03 1.904594972100000e-03 6.612906636300001e-04 1.195338047100000e-03 2.253891710100000e-03 1.829881839300000e-03 3.501998589400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.580000000000000e+02 -1.296040762220262e+06 -5.127468204817283e+06 4.383120291543900e+06 -2.800342181647844e+03 -4.242912555140035e+03 -5.774391873164507e+03 1.904594972100000e-03 6.612906636300001e-04 1.195338047100000e-03 2.253891710100000e-03 1.829881839300000e-03 3.501998589400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.590000000000000e+02 -1.296096768860143e+06 -5.127553061712695e+06 4.383004802651896e+06 -2.800322880369419e+03 -4.242778905240371e+03 -5.774499887313536e+03 1.904594972100000e-03 6.612906636300001e-04 1.195338047100000e-03 2.253891710100000e-03 1.829881839300000e-03 3.501998589400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.600000000000000e+02 -1.296152775137458e+06 -5.127637915977023e+06 4.382889311543563e+06 -2.800303575614486e+03 -4.242645249880645e+03 -5.774607901923486e+03 1.904594972100000e-03 6.612906636300001e-04 1.195338047100000e-03 2.253891710100000e-03 1.829881839300000e-03 3.501998589400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.610000000000000e+02 -1.296208781019273e+06 -5.127722767551512e+06 4.382773818297389e+06 -2.800284269090371e+03 -4.242511594692269e+03 -5.774715912047143e+03 1.904594972100000e-03 6.612906636300001e-04 1.195338047100000e-03 2.253891710100000e-03 1.829881839300000e-03 3.501998589400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.620000000000000e+02 -1.296264786510966e+06 -5.127807616462979e+06 4.382658322889930e+06 -2.800264677167253e+03 -4.242378290958506e+03 -5.774823773017320e+03 1.904594972100000e-03 6.612906636300001e-04 1.195338047100000e-03 2.253891710100000e-03 1.829881839300000e-03 3.501998589400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.630000000000000e+02 -1.296320791585244e+06 -5.127892462674784e+06 4.382542825378776e+06 -2.800244885092732e+03 -4.242245236267283e+03 -5.774931525938013e+03 1.904594972100000e-03 6.612906636300001e-04 1.195338047100000e-03 2.253891710100000e-03 1.829881839300000e-03 3.501998589400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.640000000000000e+02 -1.296376796321691e+06 -5.127977306299786e+06 4.382427325592160e+06 -2.800225571814179e+03 -4.242111569378060e+03 -5.775039532349443e+03 1.904594972100000e-03 6.612906636300001e-04 1.195338047100000e-03 2.253891710100000e-03 1.829881839300000e-03 3.501998589400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.650000000000000e+02 -1.296432800607967e+06 -5.128062147137372e+06 4.382311823798053e+06 -2.800206260832429e+03 -4.241977911187295e+03 -5.775147526163482e+03 1.904594972100000e-03 6.612906636300001e-04 1.195338047100000e-03 2.253891710100000e-03 1.829881839300000e-03 3.501998589400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.660000000000000e+02 -1.296488804553346e+06 -5.128146985382693e+06 4.382196319735773e+06 -2.800186945602813e+03 -4.241844243707951e+03 -5.775255523636581e+03 1.904594972100000e-03 6.612906636300001e-04 1.195338047100000e-03 2.253891710100000e-03 1.829881839300000e-03 3.501998589400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.670000000000000e+02 -1.296544808103014e+06 -5.128231820937927e+06 4.382080813535992e+06 -2.800167628511175e+03 -4.241710576245429e+03 -5.775363516778911e+03 1.904534274000000e-03 6.609680895700000e-04 1.195476051600000e-03 2.253077143200000e-03 1.829669660600000e-03 3.502993882000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.680000000000000e+02 -1.296600811268042e+06 -5.128316653822815e+06 4.381965305172350e+06 -2.800148310849651e+03 -4.241576906354939e+03 -5.775471506883386e+03 1.904534274000000e-03 6.609680895700000e-04 1.195476051600000e-03 2.253077143200000e-03 1.829669660600000e-03 3.502993882000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.690000000000000e+02 -1.296656814026430e+06 -5.128401483998133e+06 4.381849794697252e+06 -2.800128991545894e+03 -4.241443238514466e+03 -5.775579491038635e+03 1.904534274000000e-03 6.609680895700000e-04 1.195476051600000e-03 2.253077143200000e-03 1.829669660600000e-03 3.502993882000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.700000000000000e+02 -1.296712816443697e+06 -5.128486311580895e+06 4.381734281954365e+06 -2.800109668403055e+03 -4.241309561270863e+03 -5.775687478765911e+03 1.904534274000000e-03 6.609680895700000e-04 1.195476051600000e-03 2.253077143200000e-03 1.829669660600000e-03 3.502993882000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.710000000000000e+02 -1.296768818465275e+06 -5.128571136473658e+06 4.381618767073877e+06 -2.800090344782137e+03 -4.241175883566253e+03 -5.775795461939941e+03 1.904534274000000e-03 6.609680895700000e-04 1.195476051600000e-03 2.253077143200000e-03 1.829669660600000e-03 3.502993882000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.720000000000000e+02 -1.296824820080324e+06 -5.128655958662420e+06 4.381503250086745e+06 -2.800071033888383e+03 -4.241042498256823e+03 -5.775903215169545e+03 1.904534274000000e-03 6.609680895700000e-04 1.195476051600000e-03 2.253077143200000e-03 1.829669660600000e-03 3.502993882000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.730000000000000e+02 -1.296880821304073e+06 -5.128740778178066e+06 4.381387730960260e+06 -2.800051732054644e+03 -4.240909313590799e+03 -5.776010808885510e+03 1.904534274000000e-03 6.609680895700000e-04 1.195476051600000e-03 2.253077143200000e-03 1.829669660600000e-03 3.502993882000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.740000000000000e+02 -1.296936822128086e+06 -5.128825594996576e+06 4.381272209705736e+06 -2.800032403757973e+03 -4.240775633691374e+03 -5.776118780357959e+03 1.904534274000000e-03 6.609680895700000e-04 1.195476051600000e-03 2.253077143200000e-03 1.829669660600000e-03 3.502993882000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.750000000000000e+02 -1.296992822588922e+06 -5.128910409183266e+06 4.381156686235891e+06 -2.800013072127449e+03 -4.240641948430211e+03 -5.776226752155452e+03 1.904534274000000e-03 6.609680895700000e-04 1.195476051600000e-03 2.253077143200000e-03 1.829669660600000e-03 3.502993882000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.760000000000000e+02 -1.297048822632020e+06 -5.128995220640705e+06 4.381041160680921e+06 -2.799993741155213e+03 -4.240508266060273e+03 -5.776334716407145e+03 1.904534274000000e-03 6.609680895700000e-04 1.195476051600000e-03 2.253077143200000e-03 1.829669660600000e-03 3.502993882000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.770000000000000e+02 -1.297104822333827e+06 -5.129080029505412e+06 4.380925632858380e+06 -2.799974406193973e+03 -4.240374574493590e+03 -5.776442684136886e+03 1.904473511600000e-03 6.606454565500000e-04 1.195613882300000e-03 2.252262696700000e-03 1.829457090000000e-03 3.503989134200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.780000000000000e+02 -1.297160821628604e+06 -5.129164835660074e+06 4.380810102925070e+06 -2.799955069763625e+03 -4.240240884990179e+03 -5.776550645835820e+03 1.904473511600000e-03 6.606454565500000e-04 1.195613882300000e-03 2.252262696700000e-03 1.829457090000000e-03 3.503989134200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.790000000000000e+02 -1.297216820516473e+06 -5.129249639104891e+06 4.380694570880716e+06 -2.799935733541190e+03 -4.240107196506871e+03 -5.776658601582926e+03 1.904473511600000e-03 6.606454565500000e-04 1.195613882300000e-03 2.252262696700000e-03 1.829457090000000e-03 3.503989134200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.800000000000000e+02 -1.297272819041070e+06 -5.129334439917807e+06 4.380579036621153e+06 -2.799916394026995e+03 -4.239973502912030e+03 -5.776766557449097e+03 1.904473511600000e-03 6.606454565500000e-04 1.195613882300000e-03 2.252262696700000e-03 1.829457090000000e-03 3.503989134200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.810000000000000e+02 -1.297328817191343e+06 -5.129419238079123e+06 4.380463500172696e+06 -2.799897052035439e+03 -4.239839805143751e+03 -5.776874512388085e+03 1.904473511600000e-03 6.606454565500000e-04 1.195613882300000e-03 2.252262696700000e-03 1.829457090000000e-03 3.503989134200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.820000000000000e+02 -1.297384814942893e+06 -5.129504033556356e+06 4.380347961590910e+06 -2.799877576930704e+03 -4.239706424437891e+03 -5.776982280221954e+03 1.904473511600000e-03 6.606454565500000e-04 1.195613882300000e-03 2.252262696700000e-03 1.829457090000000e-03 3.503989134200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.830000000000000e+02 -1.297440812274895e+06 -5.129588826320128e+06 4.380232420923554e+06 -2.799858007698216e+03 -4.239573267305486e+03 -5.777089914736425e+03 1.904473511600000e-03 6.606454565500000e-04 1.195613882300000e-03 2.252262696700000e-03 1.829457090000000e-03 3.503989134200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.840000000000000e+02 -1.297496809220242e+06 -5.129673616410318e+06 4.380116878096703e+06 -2.799838662252296e+03 -4.239439566957462e+03 -5.777197857741445e+03 1.904473511600000e-03 6.606454565500000e-04 1.195613882300000e-03 2.252262696700000e-03 1.829457090000000e-03 3.503989134200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.850000000000000e+02 -1.297552805802139e+06 -5.129758403868395e+06 4.380001333054920e+06 -2.799819313533758e+03 -4.239305861224330e+03 -5.777305801061922e+03 1.904473511600000e-03 6.606454565500000e-04 1.195613882300000e-03 2.252262696700000e-03 1.829457090000000e-03 3.503989134200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.860000000000000e+02 -1.297608801987662e+06 -5.129843188635635e+06 4.379885785876731e+06 -2.799799963097780e+03 -4.239172155532601e+03 -5.777413739973910e+03 1.904473511600000e-03 6.606454565500000e-04 1.195613882300000e-03 2.252262696700000e-03 1.829457090000000e-03 3.503989134200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.870000000000000e+02 -1.297664797787872e+06 -5.129927970731757e+06 4.379770236535757e+06 -2.799780611806046e+03 -4.239038447330759e+03 -5.777521676029716e+03 1.904412685000000e-03 6.603227647600000e-04 1.195751539200000e-03 2.251448370800000e-03 1.829244127400000e-03 3.504984345400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.880000000000000e+02 -1.297720793202653e+06 -5.130012750156605e+06 4.379654685032221e+06 -2.799761258285514e+03 -4.238904737396909e+03 -5.777629609222172e+03 1.904412685000000e-03 6.603227647600000e-04 1.195751539200000e-03 2.251448370800000e-03 1.829244127400000e-03 3.504984345400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.890000000000000e+02 -1.297776788242827e+06 -5.130097526929528e+06 4.379539131340244e+06 -2.799741902061926e+03 -4.238771023677878e+03 -5.777737541290298e+03 1.904412685000000e-03 6.603227647600000e-04 1.195751539200000e-03 2.251448370800000e-03 1.829244127400000e-03 3.504984345400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.900000000000000e+02 -1.297832782886648e+06 -5.130182301011697e+06 4.379423575511757e+06 -2.799722545663165e+03 -4.238637309501473e+03 -5.777845468676847e+03 1.904412685000000e-03 6.603227647600000e-04 1.195751539200000e-03 2.251448370800000e-03 1.829244127400000e-03 3.504984345400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.910000000000000e+02 -1.297888777123064e+06 -5.130267072383438e+06 4.379308017573086e+06 -2.799703187762296e+03 -4.238503597212837e+03 -5.777953390180362e+03 1.904412685000000e-03 6.603227647600000e-04 1.195751539200000e-03 2.251448370800000e-03 1.829244127400000e-03 3.504984345400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.920000000000000e+02 -1.297944770996083e+06 -5.130351841127758e+06 4.379192457424023e+06 -2.799683845714520e+03 -4.238370134617490e+03 -5.778061112662673e+03 1.904412685000000e-03 6.603227647600000e-04 1.195751539200000e-03 2.251448370800000e-03 1.829244127400000e-03 3.504984345400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.930000000000000e+02 -1.298000764479622e+06 -5.130436607201173e+06 4.379076895130295e+06 -2.799664516448820e+03 -4.238236848156784e+03 -5.778168692585567e+03 1.904412685000000e-03 6.603227647600000e-04 1.195751539200000e-03 2.251448370800000e-03 1.829244127400000e-03 3.504984345400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.940000000000000e+02 -1.298056757576890e+06 -5.130521370601943e+06 4.378961330675844e+06 -2.799645152263005e+03 -4.238103125947310e+03 -5.778276608841540e+03 1.904412685000000e-03 6.603227647600000e-04 1.195751539200000e-03 2.251448370800000e-03 1.829244127400000e-03 3.504984345400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.950000000000000e+02 -1.298112750299340e+06 -5.130606131350547e+06 4.378845764033295e+06 -2.799625785561538e+03 -4.237969400224986e+03 -5.778384523689879e+03 1.904412685000000e-03 6.603227647600000e-04 1.195751539200000e-03 2.251448370800000e-03 1.829244127400000e-03 3.504984345400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.960000000000000e+02 -1.298168742625226e+06 -5.130690889408155e+06 4.378730195254574e+06 -2.799606418473733e+03 -4.237835673820689e+03 -5.778492434114141e+03 1.904412685000000e-03 6.603227647600000e-04 1.195751539200000e-03 2.251448370800000e-03 1.829244127400000e-03 3.504984345400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.970000000000000e+02 -1.298224734565286e+06 -5.130775644794001e+06 4.378614624313970e+06 -2.799587048617137e+03 -4.237701945848523e+03 -5.778600341778694e+03 1.904351794100000e-03 6.600000143500000e-04 1.195889022200000e-03 2.250634165600000e-03 1.829030773100000e-03 3.505979515100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.980000000000000e+02 -1.298280726119646e+06 -5.130860397508289e+06 4.378499051211204e+06 -2.799567677953418e+03 -4.237568215538947e+03 -5.778708246437121e+03 1.904351794100000e-03 6.600000143500000e-04 1.195889022200000e-03 2.250634165600000e-03 1.829030773100000e-03 3.505979515100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.990000000000000e+02 -1.298336717299126e+06 -5.130945147570363e+06 4.378383475920398e+06 -2.799548304699284e+03 -4.237434481516232e+03 -5.778816149869195e+03 1.904351794100000e-03 6.600000143500000e-04 1.195889022200000e-03 2.250634165600000e-03 1.829030773100000e-03 3.505979515100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.000000000000000e+02 -1.298392708103608e+06 -5.131029894980060e+06 4.378267898441764e+06 -2.799528928530534e+03 -4.237300743635260e+03 -5.778924052319561e+03 1.904351794100000e-03 6.600000143500000e-04 1.195889022200000e-03 2.250634165600000e-03 1.829030773100000e-03 3.505979515100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.010000000000000e+02 -1.298448698456676e+06 -5.131114639601015e+06 4.378152318957791e+06 -2.799509554570915e+03 -4.237167014727463e+03 -5.779031942019441e+03 1.904351794100000e-03 6.600000143500000e-04 1.195889022200000e-03 2.250634165600000e-03 1.829030773100000e-03 3.505979515100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.020000000000000e+02 -1.298504688465727e+06 -5.131199381637206e+06 4.378036737213604e+06 -2.799490084378038e+03 -4.237033727969995e+03 -5.779139535579812e+03 1.904351794100000e-03 6.600000143500000e-04 1.195889022200000e-03 2.250634165600000e-03 1.829030773100000e-03 3.505979515100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.030000000000000e+02 -1.298560678063763e+06 -5.131284120977738e+06 4.377921153370222e+06 -2.799470547962928e+03 -4.236900756350233e+03 -5.779246915635808e+03 1.904351794100000e-03 6.600000143500000e-04 1.195889022200000e-03 2.250634165600000e-03 1.829030773100000e-03 3.505979515100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.040000000000000e+02 -1.298616667272151e+06 -5.131368857639803e+06 4.377805567373945e+06 -2.799451166799607e+03 -4.236767013932177e+03 -5.779354803188535e+03 1.904351794100000e-03 6.600000143500000e-04 1.195889022200000e-03 2.250634165600000e-03 1.829030773100000e-03 3.505979515100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.050000000000000e+02 -1.298672656083581e+06 -5.131453591610400e+06 4.377689979242182e+06 -2.799431783929038e+03 -4.236633271554139e+03 -5.779462686331138e+03 1.904351794100000e-03 6.600000143500000e-04 1.195889022200000e-03 2.250634165600000e-03 1.829030773100000e-03 3.505979515100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.060000000000000e+02 -1.298728644541670e+06 -5.131538322967391e+06 4.377574388870719e+06 -2.799412397284615e+03 -4.236499521745838e+03 -5.779570571529256e+03 1.904351794100000e-03 6.600000143500000e-04 1.195889022200000e-03 2.250634165600000e-03 1.829030773100000e-03 3.505979515100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.070000000000000e+02 -1.298784632559072e+06 -5.131623051554929e+06 4.377458796468158e+06 -2.799393012157806e+03 -4.236365778864419e+03 -5.779678445803189e+03 1.904290838900000e-03 6.596772056700000e-04 1.196026331000000e-03 2.249820081400000e-03 1.828817027200000e-03 3.506974642300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.080000000000000e+02 -1.298840620233999e+06 -5.131707777548286e+06 4.377343201799896e+06 -2.799373622586965e+03 -4.236232026875362e+03 -5.779786323670586e+03 1.904290838900000e-03 6.596772056700000e-04 1.196026331000000e-03 2.249820081400000e-03 1.828817027200000e-03 3.506974642300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.090000000000000e+02 -1.298896607511904e+06 -5.131792500850128e+06 4.377227604996210e+06 -2.799354232560480e+03 -4.236098274231797e+03 -5.779894197123275e+03 1.904290838900000e-03 6.596772056700000e-04 1.196026331000000e-03 2.249820081400000e-03 1.828817027200000e-03 3.506974642300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.100000000000000e+02 -1.298952594414541e+06 -5.131877221499317e+06 4.377112006005101e+06 -2.799334839857690e+03 -4.235964518173422e+03 -5.780002069161351e+03 1.904290838900000e-03 6.596772056700000e-04 1.196026331000000e-03 2.249820081400000e-03 1.828817027200000e-03 3.506974642300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.110000000000000e+02 -1.299008580908994e+06 -5.131961939437170e+06 4.376996404905131e+06 -2.799315445873708e+03 -4.235830764000465e+03 -5.780109935228274e+03 1.904290838900000e-03 6.596772056700000e-04 1.196026331000000e-03 2.249820081400000e-03 1.828817027200000e-03 3.506974642300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.120000000000000e+02 -1.299064567017328e+06 -5.132046654704984e+06 4.376880801645388e+06 -2.799296054747269e+03 -4.235697111569549e+03 -5.780217718762303e+03 1.904290838900000e-03 6.596772056700000e-04 1.196026331000000e-03 2.249820081400000e-03 1.828817027200000e-03 3.506974642300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.130000000000000e+02 -1.299120552745912e+06 -5.132131367315551e+06 4.376765196211852e+06 -2.799276663386943e+03 -4.235563528973637e+03 -5.780325444964279e+03 1.904290838900000e-03 6.596772056700000e-04 1.196026331000000e-03 2.249820081400000e-03 1.828817027200000e-03 3.506974642300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.140000000000000e+02 -1.299176538106905e+06 -5.132216077287252e+06 4.376649588572419e+06 -2.799257262773778e+03 -4.235429762937812e+03 -5.780433307381692e+03 1.904290838900000e-03 6.596772056700000e-04 1.196026331000000e-03 2.249820081400000e-03 1.828817027200000e-03 3.506974642300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.150000000000000e+02 -1.299232523037866e+06 -5.132300784508700e+06 4.376533978876255e+06 -2.799237863159360e+03 -4.235296002097136e+03 -5.780541160392713e+03 1.904290838900000e-03 6.596772056700000e-04 1.196026331000000e-03 2.249820081400000e-03 1.828817027200000e-03 3.506974642300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.160000000000000e+02 -1.299288507604280e+06 -5.132385489096748e+06 4.376418366966886e+06 -2.799218460318233e+03 -4.235162235701212e+03 -5.780649013823217e+03 1.904290838900000e-03 6.596772056700000e-04 1.196026331000000e-03 2.249820081400000e-03 1.828817027200000e-03 3.506974642300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.170000000000000e+02 -1.299344491816964e+06 -5.132470191070726e+06 4.376302752818421e+06 -2.799199053830204e+03 -4.235028461674831e+03 -5.780756869403352e+03 1.904229819300000e-03 6.593543388400000e-04 1.196163465500000e-03 2.249006118300000e-03 1.828602889700000e-03 3.507969726500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.180000000000000e+02 -1.299400475588577e+06 -5.132554890274832e+06 4.376187136639516e+06 -2.799179648987892e+03 -4.234894694834958e+03 -5.780864713815000e+03 1.904229819300000e-03 6.593543388400000e-04 1.196163465500000e-03 2.249006118300000e-03 1.828602889700000e-03 3.507969726500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.190000000000000e+02 -1.299456458973675e+06 -5.132639586806414e+06 4.376071518299811e+06 -2.799160241810641e+03 -4.234760926076939e+03 -5.780972555547720e+03 1.904229819300000e-03 6.593543388400000e-04 1.196163465500000e-03 2.249006118300000e-03 1.828602889700000e-03 3.507969726500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.200000000000000e+02 -1.299512442015868e+06 -5.132724280743303e+06 4.375955897695061e+06 -2.799140830634800e+03 -4.234627148005919e+03 -5.781080400837245e+03 1.904229819300000e-03 6.593543388400000e-04 1.196163465500000e-03 2.249006118300000e-03 1.828602889700000e-03 3.507969726500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.210000000000000e+02 -1.299568424660614e+06 -5.132808971988196e+06 4.375840274955574e+06 -2.799121418864776e+03 -4.234493369409365e+03 -5.781188241674249e+03 1.904229819300000e-03 6.593543388400000e-04 1.196163465500000e-03 2.249006118300000e-03 1.828602889700000e-03 3.507969726500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.220000000000000e+02 -1.299624406904241e+06 -5.132893660551862e+06 4.375724650088522e+06 -2.799101830610154e+03 -4.234360142469241e+03 -5.781295738322017e+03 1.904229819300000e-03 6.593543388400000e-04 1.196163465500000e-03 2.249006118300000e-03 1.828602889700000e-03 3.507969726500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.230000000000000e+02 -1.299680388714961e+06 -5.132978346389635e+06 4.375609023168780e+06 -2.799082120868834e+03 -4.234227303570864e+03 -5.781402990260774e+03 1.904229819300000e-03 6.593543388400000e-04 1.196163465500000e-03 2.249006118300000e-03 1.828602889700000e-03 3.507969726500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.240000000000000e+02 -1.299736370155557e+06 -5.133063029584228e+06 4.375493394048939e+06 -2.799062704141431e+03 -4.234093520975463e+03 -5.781510820864135e+03 1.904229819300000e-03 6.593543388400000e-04 1.196163465500000e-03 2.249006118300000e-03 1.828602889700000e-03 3.507969726500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.250000000000000e+02 -1.299792351209338e+06 -5.133147710105926e+06 4.375377762768811e+06 -2.799043284835290e+03 -4.233959736705425e+03 -5.781618648708191e+03 1.904229819300000e-03 6.593543388400000e-04 1.196163465500000e-03 2.249006118300000e-03 1.828602889700000e-03 3.507969726500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.260000000000000e+02 -1.299848331887368e+06 -5.133232387974436e+06 4.375262129301991e+06 -2.799023864486897e+03 -4.233825947993095e+03 -5.781726475220648e+03 1.904229819300000e-03 6.593543388400000e-04 1.196163465500000e-03 2.249006118300000e-03 1.828602889700000e-03 3.507969726500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.270000000000000e+02 -1.299904312167666e+06 -5.133317063150601e+06 4.375146493700949e+06 -2.799004442399946e+03 -4.233692159525400e+03 -5.781834297184479e+03 1.904168735400000e-03 6.590314141700000e-04 1.196300425600000e-03 2.248192276700000e-03 1.828388360900000e-03 3.508964766800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.280000000000000e+02 -1.299960292039184e+06 -5.133401735614763e+06 4.375030855992025e+06 -2.798985018849473e+03 -4.233558372748166e+03 -5.781942113402254e+03 1.904168735400000e-03 6.590314141700000e-04 1.196300425600000e-03 2.248192276700000e-03 1.828388360900000e-03 3.508964766800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.290000000000000e+02 -1.300016271545776e+06 -5.133486405445102e+06 4.374915216070461e+06 -2.798965593755803e+03 -4.233424579787242e+03 -5.782049929802088e+03 1.904168735400000e-03 6.590314141700000e-04 1.196300425600000e-03 2.248192276700000e-03 1.828388360900000e-03 3.508964766800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.300000000000000e+02 -1.300072250643597e+06 -5.133571072563489e+06 4.374799574040968e+06 -2.798946167126305e+03 -4.233290789152471e+03 -5.782157740010613e+03 1.904168735400000e-03 6.590314141700000e-04 1.196300425600000e-03 2.248192276700000e-03 1.828388360900000e-03 3.508964766800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.310000000000000e+02 -1.300128229398122e+06 -5.133655737086709e+06 4.374683929747031e+06 -2.798926736553988e+03 -4.233156988763381e+03 -5.782265554079695e+03 1.904168735400000e-03 6.590314141700000e-04 1.196300425600000e-03 2.248192276700000e-03 1.828388360900000e-03 3.508964766800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.320000000000000e+02 -1.300184207743006e+06 -5.133740398902543e+06 4.374568283348123e+06 -2.798907261813847e+03 -4.233023416085544e+03 -5.782373211124000e+03 1.904168735400000e-03 6.590314141700000e-04 1.196300425600000e-03 2.248192276700000e-03 1.828388360900000e-03 3.508964766800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.330000000000000e+02 -1.300240185669107e+06 -5.133825057999010e+06 4.374452634866631e+06 -2.798887754358902e+03 -4.232890003156653e+03 -5.782480757215786e+03 1.904168735400000e-03 6.590314141700000e-04 1.196300425600000e-03 2.248192276700000e-03 1.828388360900000e-03 3.508964766800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.340000000000000e+02 -1.300296163198755e+06 -5.133909714405549e+06 4.374336984247710e+06 -2.798868321343994e+03 -4.232756204053895e+03 -5.782588556034229e+03 1.904168735400000e-03 6.590314141700000e-04 1.196300425600000e-03 2.248192276700000e-03 1.828388360900000e-03 3.508964766800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.350000000000000e+02 -1.300352140385045e+06 -5.133994368216880e+06 4.374221331364400e+06 -2.798848884149868e+03 -4.232622395740406e+03 -5.782696358404314e+03 1.904168735400000e-03 6.590314141700000e-04 1.196300425600000e-03 2.248192276700000e-03 1.828388360900000e-03 3.508964766800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.360000000000000e+02 -1.300408117140411e+06 -5.134079019276920e+06 4.374105676425924e+06 -2.798829446541783e+03 -4.232488592965377e+03 -5.782804151709655e+03 1.904168735400000e-03 6.590314141700000e-04 1.196300425600000e-03 2.248192276700000e-03 1.828388360900000e-03 3.508964766800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.370000000000000e+02 -1.300464093563359e+06 -5.134163667761271e+06 4.373990019196874e+06 -2.798810005769224e+03 -4.232354778329724e+03 -5.782911950123470e+03 1.904107587100000e-03 6.587084318599999e-04 1.196437211100000e-03 2.247378556700000e-03 1.828173440800000e-03 3.509959762700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.380000000000000e+02 -1.300520069566331e+06 -5.134248313513860e+06 4.373874359886484e+06 -2.798790564460730e+03 -4.232220967615642e+03 -5.783019740733909e+03 1.904107587100000e-03 6.587084318599999e-04 1.196437211100000e-03 2.247378556700000e-03 1.828173440800000e-03 3.509959762700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.390000000000000e+02 -1.300576045181994e+06 -5.134332956592992e+06 4.373758698416593e+06 -2.798771120464674e+03 -4.232087154964149e+03 -5.783127528827329e+03 1.904107587100000e-03 6.587084318599999e-04 1.196437211100000e-03 2.247378556700000e-03 1.828173440800000e-03 3.509959762700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.400000000000000e+02 -1.300632020388623e+06 -5.134417596959898e+06 4.373643034839189e+06 -2.798751676954696e+03 -4.231953343772509e+03 -5.783235310531612e+03 1.904107587100000e-03 6.587084318599999e-04 1.196437211100000e-03 2.247378556700000e-03 1.828173440800000e-03 3.509959762700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.410000000000000e+02 -1.300687995240746e+06 -5.134502234711850e+06 4.373527369023852e+06 -2.798732229623145e+03 -4.231819525051143e+03 -5.783343094378276e+03 1.904107587100000e-03 6.587084318599999e-04 1.196437211100000e-03 2.247378556700000e-03 1.828173440800000e-03 3.509959762700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.420000000000000e+02 -1.300743969694249e+06 -5.134586869776309e+06 4.373411701079346e+06 -2.798712766234881e+03 -4.231685984573964e+03 -5.783450671695971e+03 1.904107587100000e-03 6.587084318599999e-04 1.196437211100000e-03 2.247378556700000e-03 1.828173440800000e-03 3.509959762700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.430000000000000e+02 -1.300799943758020e+06 -5.134671502173332e+06 4.373296030986789e+06 -2.798693292121214e+03 -4.231552635527303e+03 -5.783558105210785e+03 1.904107587100000e-03 6.587084318599999e-04 1.196437211100000e-03 2.247378556700000e-03 1.828173440800000e-03 3.509959762700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.440000000000000e+02 -1.300855917441611e+06 -5.134756131909693e+06 4.373180358717592e+06 -2.798673839440202e+03 -4.231418810904891e+03 -5.783665880421579e+03 1.904107587100000e-03 6.587084318599999e-04 1.196437211100000e-03 2.247378556700000e-03 1.828173440800000e-03 3.509959762700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.450000000000000e+02 -1.300911890726760e+06 -5.134840758952869e+06 4.373064684315366e+06 -2.798654385141589e+03 -4.231284986180191e+03 -5.783773651294062e+03 1.904107587100000e-03 6.587084318599999e-04 1.196437211100000e-03 2.247378556700000e-03 1.828173440800000e-03 3.509959762700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.460000000000000e+02 -1.300967863591729e+06 -5.134925383264100e+06 4.372949007832099e+06 -2.798634931402233e+03 -4.231151164704460e+03 -5.783881414409525e+03 1.904107587100000e-03 6.587084318599999e-04 1.196437211100000e-03 2.247378556700000e-03 1.828173440800000e-03 3.509959762700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.470000000000000e+02 -1.301023836134691e+06 -5.135010005018456e+06 4.372833329033013e+06 -2.798615472198239e+03 -4.231017330561093e+03 -5.783989184197473e+03 1.904046374400000e-03 6.583853920800000e-04 1.196573822000000e-03 2.246564958500000e-03 1.827958129600000e-03 3.510954713500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.480000000000000e+02 -1.301079808235544e+06 -5.135094624001819e+06 4.372717648205258e+06 -2.798596014375402e+03 -4.230883503105017e+03 -5.784096943312528e+03 1.904046374400000e-03 6.583853920800000e-04 1.196573822000000e-03 2.246564958500000e-03 1.827958129600000e-03 3.510954713500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.490000000000000e+02 -1.301135779992543e+06 -5.135179240389369e+06 4.372601965113880e+06 -2.798576552684998e+03 -4.230749666320246e+03 -5.784204705932761e+03 1.904046374400000e-03 6.583853920800000e-04 1.196573822000000e-03 2.246564958500000e-03 1.827958129600000e-03 3.510954713500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.500000000000000e+02 -1.301191751339990e+06 -5.135263854064059e+06 4.372486279915897e+06 -2.798557089386434e+03 -4.230615831702098e+03 -5.784312462514251e+03 1.904046374400000e-03 6.583853920800000e-04 1.196573822000000e-03 2.246564958500000e-03 1.827958129600000e-03 3.510954713500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.510000000000000e+02 -1.301247722310802e+06 -5.135348465084531e+06 4.372370592532631e+06 -2.798537625040000e+03 -4.230481992758369e+03 -5.784420217677283e+03 1.904046374400000e-03 6.583853920800000e-04 1.196573822000000e-03 2.246564958500000e-03 1.827958129600000e-03 3.510954713500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.520000000000000e+02 -1.301303692858411e+06 -5.135433073378057e+06 4.372254903071687e+06 -2.798518022879777e+03 -4.230348424921797e+03 -5.784527822760740e+03 1.904046374400000e-03 6.583853920800000e-04 1.196573822000000e-03 2.246564958500000e-03 1.827958129600000e-03 3.510954713500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.530000000000000e+02 -1.301359663025619e+06 -5.135517679028125e+06 4.372139211428085e+06 -2.798498321840276e+03 -4.230215038715585e+03 -5.784635328357409e+03 1.904046374400000e-03 6.583853920800000e-04 1.196573822000000e-03 2.246564958500000e-03 1.827958129600000e-03 3.510954713500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.540000000000000e+02 -1.301415632789282e+06 -5.135602281976081e+06 4.372023517663469e+06 -2.798478852695154e+03 -4.230081195600575e+03 -5.784743073328099e+03 1.904046374400000e-03 6.583853920800000e-04 1.196573822000000e-03 2.246564958500000e-03 1.827958129600000e-03 3.510954713500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.550000000000000e+02 -1.301471602132375e+06 -5.135686882191629e+06 4.371907821818501e+06 -2.798459382615586e+03 -4.229947356255645e+03 -5.784850810780059e+03 1.904046374400000e-03 6.583853920800000e-04 1.196573822000000e-03 2.246564958500000e-03 1.827958129600000e-03 3.510954713500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.560000000000000e+02 -1.301527571131280e+06 -5.135771479810946e+06 4.371792123710466e+06 -2.798439908386024e+03 -4.229813507610399e+03 -5.784958551832450e+03 1.904046374400000e-03 6.583853920800000e-04 1.196573822000000e-03 2.246564958500000e-03 1.827958129600000e-03 3.510954713500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.570000000000000e+02 -1.301583539731479e+06 -5.135856074736850e+06 4.371676423469761e+06 -2.798420433909215e+03 -4.229679658391056e+03 -5.785066288325937e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.580000000000000e+02 -1.301639507921851e+06 -5.135940666949577e+06 4.371560721122913e+06 -2.798400957659173e+03 -4.229545811287350e+03 -5.785174018889501e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.590000000000000e+02 -1.301695475768090e+06 -5.136025256566192e+06 4.371445016512826e+06 -2.798381478741008e+03 -4.229411954215909e+03 -5.785281752930498e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.600000000000000e+02 -1.301751443204508e+06 -5.136109843469678e+06 4.371329309796548e+06 -2.798361998363019e+03 -4.229278099409635e+03 -5.785389480798497e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.610000000000000e+02 -1.301807410263779e+06 -5.136194427718294e+06 4.371213600895883e+06 -2.798342515430184e+03 -4.229144240535731e+03 -5.785497207685858e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.620000000000000e+02 -1.301863376924167e+06 -5.136279009273293e+06 4.371097889862836e+06 -2.798323032121034e+03 -4.229010381364779e+03 -5.785604929861686e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.630000000000000e+02 -1.301919343196490e+06 -5.136363588153991e+06 4.370982176671488e+06 -2.798303546616654e+03 -4.228876520150426e+03 -5.785712649393292e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.640000000000000e+02 -1.301975309058772e+06 -5.136448164321279e+06 4.370866461374344e+06 -2.798284059623923e+03 -4.228742661136724e+03 -5.785820362813009e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.650000000000000e+02 -1.302031274565781e+06 -5.136532737872729e+06 4.370750743840433e+06 -2.798264570725799e+03 -4.228608793838608e+03 -5.785928078130996e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.660000000000000e+02 -1.302087239706470e+06 -5.136617308788694e+06 4.370635024096114e+06 -2.798245078386682e+03 -4.228474921253626e+03 -5.786035793749992e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.670000000000000e+02 -1.302143204382378e+06 -5.136701876893773e+06 4.370519302376869e+06 -2.798225587223418e+03 -4.228341059527255e+03 -5.786143495672130e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.680000000000000e+02 -1.302199168724759e+06 -5.136786442421826e+06 4.370403578368745e+06 -2.798206092899582e+03 -4.228207186466588e+03 -5.786251202296571e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.690000000000000e+02 -1.302255132667936e+06 -5.136871005255869e+06 4.370287852228802e+06 -2.798186596780472e+03 -4.228073313296303e+03 -5.786358904664351e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.700000000000000e+02 -1.302311096233641e+06 -5.136955565434671e+06 4.370172123904987e+06 -2.798167097906439e+03 -4.227939436437810e+03 -5.786466605851079e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.710000000000000e+02 -1.302367059389224e+06 -5.137040122900030e+06 4.370056393475441e+06 -2.798147599254724e+03 -4.227805560952367e+03 -5.786574300828665e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.720000000000000e+02 -1.302423022156341e+06 -5.137124677690601e+06 4.369940660888274e+06 -2.798128097731926e+03 -4.227671683676429e+03 -5.786681993256266e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.730000000000000e+02 -1.302478984546046e+06 -5.137209229826055e+06 4.369824926117075e+06 -2.798108595185156e+03 -4.227537802371223e+03 -5.786789684032574e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.740000000000000e+02 -1.302534946547296e+06 -5.137293779286770e+06 4.369709189188197e+06 -2.798089090248722e+03 -4.227403919133945e+03 -5.786897372162880e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.750000000000000e+02 -1.302590908181825e+06 -5.137378326111505e+06 4.369593450049583e+06 -2.798069582115022e+03 -4.227270030290755e+03 -5.787005060729335e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.760000000000000e+02 -1.302646869384204e+06 -5.137462870183663e+06 4.369477708857818e+06 -2.798050075049148e+03 -4.227136146519418e+03 -5.787112739970709e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.770000000000000e+02 -1.302702830252653e+06 -5.137547411678287e+06 4.369361965377828e+06 -2.798030563498679e+03 -4.227002251754197e+03 -5.787220424211118e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.780000000000000e+02 -1.302758790677794e+06 -5.137631950400553e+06 4.369246219871284e+06 -2.798011051924582e+03 -4.226868364323048e+03 -5.787328097894552e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.790000000000000e+02 -1.302814750736237e+06 -5.137716486486920e+06 4.369130472154891e+06 -2.797991538756917e+03 -4.226734470649661e+03 -5.787435771817499e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.800000000000000e+02 -1.302870710416938e+06 -5.137801019917766e+06 4.369014722255023e+06 -2.797972022812806e+03 -4.226600573753156e+03 -5.787543444220389e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.810000000000000e+02 -1.302926669687003e+06 -5.137885550634525e+06 4.368898970250335e+06 -2.797952505449324e+03 -4.226466678272568e+03 -5.787651111071013e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.820000000000000e+02 -1.302982628590264e+06 -5.137970078715269e+06 4.368783216035970e+06 -2.797932986549781e+03 -4.226332776947059e+03 -5.787758777839810e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.830000000000000e+02 -1.303038587071894e+06 -5.138054604062386e+06 4.368667459743051e+06 -2.797913466175293e+03 -4.226198879331993e+03 -5.787866437366763e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.840000000000000e+02 -1.303094545208497e+06 -5.138139126812328e+06 4.368551701188273e+06 -2.797893943254453e+03 -4.226064972196709e+03 -5.787974099978583e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.850000000000000e+02 -1.303150502912558e+06 -5.138223646809230e+06 4.368435940581037e+06 -2.797874419883062e+03 -4.225931070549343e+03 -5.788081753593043e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.860000000000000e+02 -1.303206460249509e+06 -5.138308164169703e+06 4.368320177764681e+06 -2.797854893283814e+03 -4.225797163345660e+03 -5.788189407618116e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.870000000000000e+02 -1.303262417208550e+06 -5.138392678874478e+06 4.368204412765073e+06 -2.797835365475525e+03 -4.225663251839422e+03 -5.788297060272353e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.880000000000000e+02 -1.303318373789569e+06 -5.138477190923402e+06 4.368088645582433e+06 -2.797815835046566e+03 -4.225529336519085e+03 -5.788404711781864e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.890000000000000e+02 -1.303374329926899e+06 -5.138561700199557e+06 4.367972876373895e+06 -2.797796304592349e+03 -4.225395429069541e+03 -5.788512352338594e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.900000000000000e+02 -1.303430285729911e+06 -5.138646206897731e+06 4.367857104877673e+06 -2.797776771055982e+03 -4.225261509644531e+03 -5.788619998035422e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.910000000000000e+02 -1.303486241122021e+06 -5.138730710881556e+06 4.367741331277038e+06 -2.797757236178169e+03 -4.225127592064508e+03 -5.788727637828275e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.920000000000000e+02 -1.303542196124959e+06 -5.138815212189780e+06 4.367625555519928e+06 -2.797737699100323e+03 -4.224993672825955e+03 -5.788835274691542e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.930000000000000e+02 -1.303598150738854e+06 -5.138899710822613e+06 4.367509777606054e+06 -2.797718161190905e+03 -4.224859751151632e+03 -5.788942908632476e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.940000000000000e+02 -1.303654104963585e+06 -5.138984206779892e+06 4.367393997535643e+06 -2.797698621037845e+03 -4.224725827644546e+03 -5.789050539792114e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.950000000000000e+02 -1.303710058799043e+06 -5.139068700061455e+06 4.367278215308921e+06 -2.797679078687591e+03 -4.224591902440008e+03 -5.789158168050051e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.960000000000000e+02 -1.303766012245348e+06 -5.139153190667496e+06 4.367162430925607e+06 -2.797659535440012e+03 -4.224457974557808e+03 -5.789265793593656e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.970000000000000e+02 -1.303821965280462e+06 -5.139237678558835e+06 4.367046644438404e+06 -2.797639990627658e+03 -4.224324048871755e+03 -5.789373413065920e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.980000000000000e+02 -1.303877917959120e+06 -5.139322163832936e+06 4.366930855716261e+06 -2.797620443295923e+03 -4.224190115242916e+03 -5.789481034430990e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.990000000000000e+02 -1.303933870237520e+06 -5.139406646411831e+06 4.366815064864018e+06 -2.797600894372050e+03 -4.224056181812873e+03 -5.789588651226402e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.000000000000000e+02 -1.303989822126467e+06 -5.139491126314805e+06 4.366699271855749e+06 -2.797581343188309e+03 -4.223922246404399e+03 -5.789696265355999e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.010000000000000e+02 -1.304045773626091e+06 -5.139575603542062e+06 4.366583476691173e+06 -2.797561791343452e+03 -4.223788308535234e+03 -5.789803876510496e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.020000000000000e+02 -1.304101724747192e+06 -5.139660078112888e+06 4.366467679344358e+06 -2.797542236546760e+03 -4.223654367090287e+03 -5.789911486480182e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.030000000000000e+02 -1.304157675435044e+06 -5.139744549929873e+06 4.366351879946315e+06 -2.797522681455169e+03 -4.223520431269972e+03 -5.790019087290761e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.040000000000000e+02 -1.304213625777154e+06 -5.139829019148817e+06 4.366236078287506e+06 -2.797503123798571e+03 -4.223386485554010e+03 -5.790126691468566e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.050000000000000e+02 -1.304269575740638e+06 -5.139913485711216e+06 4.366120274446627e+06 -2.797483563303515e+03 -4.223252536334306e+03 -5.790234294360042e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.060000000000000e+02 -1.304325525292612e+06 -5.139997949558550e+06 4.366004468502374e+06 -2.797464001497981e+03 -4.223118588721897e+03 -5.790341891514061e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.070000000000000e+02 -1.304381474444126e+06 -5.140082410710475e+06 4.365888660428319e+06 -2.797444439493375e+03 -4.222984640751484e+03 -5.790449483931620e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.080000000000000e+02 -1.304437423216827e+06 -5.140166869205605e+06 4.365772850172528e+06 -2.797424874201429e+03 -4.222850689216600e+03 -5.790557075296028e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.090000000000000e+02 -1.304493371599919e+06 -5.140251325024694e+06 4.365657037760888e+06 -2.797405308116851e+03 -4.222716735270635e+03 -5.790664663703358e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.100000000000000e+02 -1.304549319593287e+06 -5.140335778167584e+06 4.365541223193617e+06 -2.797385739779631e+03 -4.222582779572621e+03 -5.790772249273001e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.110000000000000e+02 -1.304605267196815e+06 -5.140420228634110e+06 4.365425406470945e+06 -2.797366169296461e+03 -4.222448822083061e+03 -5.790879831989785e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.120000000000000e+02 -1.304661214410626e+06 -5.140504676424471e+06 4.365309587592595e+06 -2.797346597842874e+03 -4.222314862248932e+03 -5.790987411774269e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.130000000000000e+02 -1.304717161245532e+06 -5.140589121557955e+06 4.365193766532624e+06 -2.797327023940392e+03 -4.222180898537544e+03 -5.791094990387552e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.140000000000000e+02 -1.304773107657721e+06 -5.140673563956619e+06 4.365077943395910e+06 -2.797307448776387e+03 -4.222046938843702e+03 -5.791202561447357e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.150000000000000e+02 -1.304829053701939e+06 -5.140758003717890e+06 4.364962118051358e+06 -2.797287872422953e+03 -4.221912972756625e+03 -5.791310132684796e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.160000000000000e+02 -1.304884999356217e+06 -5.140842440802719e+06 4.364846290551522e+06 -2.797268293347740e+03 -4.221779005131014e+03 -5.791417701121652e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.170000000000000e+02 -1.304940944642288e+06 -5.140926875249821e+06 4.364730460844293e+06 -2.797248711393991e+03 -4.221645031704234e+03 -5.791525270000727e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.180000000000000e+02 -1.304996889494746e+06 -5.141011306942748e+06 4.364614629086384e+06 -2.797229130407076e+03 -4.221511063320124e+03 -5.791632829631020e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.190000000000000e+02 -1.305052833989926e+06 -5.141095736017441e+06 4.364498795094864e+06 -2.797209545774156e+03 -4.221377087869913e+03 -5.791740390967239e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.200000000000000e+02 -1.305108778084026e+06 -5.141180162395963e+06 4.364382958974616e+06 -2.797189959254937e+03 -4.221243112121132e+03 -5.791847948229268e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.210000000000000e+02 -1.305164721777176e+06 -5.141264586078517e+06 4.364267120725368e+06 -2.797170372640100e+03 -4.221109135901118e+03 -5.791955500797078e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.220000000000000e+02 -1.305220665101935e+06 -5.141349007123142e+06 4.364151280269009e+06 -2.797150782165718e+03 -4.220975154550700e+03 -5.792063053716908e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.230000000000000e+02 -1.305276608036595e+06 -5.141433425491164e+06 4.364035437657594e+06 -2.797131191050629e+03 -4.220841170581005e+03 -5.792170603771106e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.240000000000000e+02 -1.305332550559195e+06 -5.141517841143535e+06 4.363919592943680e+06 -2.797111598524447e+03 -4.220707188449135e+03 -5.792278147960771e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.250000000000000e+02 -1.305388492691461e+06 -5.141602254118981e+06 4.363803746075162e+06 -2.797092003729306e+03 -4.220573204725144e+03 -5.792385689200629e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.260000000000000e+02 -1.305444434444439e+06 -5.141686664437135e+06 4.363687897025591e+06 -2.797072407864043e+03 -4.220439216648096e+03 -5.792493229046418e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.270000000000000e+02 -1.305500375828933e+06 -5.141771072117275e+06 4.363572045769022e+06 -2.797052808536733e+03 -4.220305223101568e+03 -5.792600769329803e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.280000000000000e+02 -1.305556316801150e+06 -5.141855477081489e+06 4.363456192410351e+06 -2.797033208208687e+03 -4.220171231278646e+03 -5.792708303662600e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.290000000000000e+02 -1.305612257372129e+06 -5.141939879349421e+06 4.363340336923140e+06 -2.797013607267463e+03 -4.220037239140298e+03 -5.792815833402143e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.300000000000000e+02 -1.305668197563600e+06 -5.142024278959775e+06 4.363224479255266e+06 -2.796994003782439e+03 -4.219903243160719e+03 -5.792923361982199e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.310000000000000e+02 -1.305724137364526e+06 -5.142108675892958e+06 4.363108619433127e+06 -2.796974398022455e+03 -4.219769245362966e+03 -5.793030887783259e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.320000000000000e+02 -1.305780076753191e+06 -5.142193070110306e+06 4.362992757508793e+06 -2.796954792317146e+03 -4.219635249086112e+03 -5.793138407344345e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.330000000000000e+02 -1.305836015794919e+06 -5.142277461728136e+06 4.362876893325613e+06 -2.796935182121820e+03 -4.219501243515148e+03 -5.793245930620741e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.340000000000000e+02 -1.305891954435239e+06 -5.142361850649479e+06 4.362761027014176e+06 -2.796915571625310e+03 -4.219367237512794e+03 -5.793353449259905e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.350000000000000e+02 -1.305947892674032e+06 -5.142446236874178e+06 4.362645158574704e+06 -2.796895959218107e+03 -4.219233231489138e+03 -5.793460963629500e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.360000000000000e+02 -1.306003830500266e+06 -5.142530620382640e+06 4.362529288033601e+06 -2.796876345626349e+03 -4.219099227373343e+03 -5.793568471989598e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.370000000000000e+02 -1.306059767957740e+06 -5.142615001252796e+06 4.362413415285895e+06 -2.796856730111193e+03 -4.218965217404711e+03 -5.793675980428418e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.380000000000000e+02 -1.306115705024504e+06 -5.142699379445615e+06 4.362297540384147e+06 -2.796837112648128e+03 -4.218831205229386e+03 -5.793783486240850e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.390000000000000e+02 -1.306171641700441e+06 -5.142783754960940e+06 4.362181663328592e+06 -2.796817492739735e+03 -4.218697191452496e+03 -5.793890989184232e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.400000000000000e+02 -1.306227577996595e+06 -5.142868127818401e+06 4.362065784092772e+06 -2.796797871675508e+03 -4.218563173316749e+03 -5.793998490772482e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.410000000000000e+02 -1.306283513880093e+06 -5.142952497959551e+06 4.361949902755440e+06 -2.796778249211797e+03 -4.218429157245739e+03 -5.794105986324879e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.420000000000000e+02 -1.306339449394498e+06 -5.143036865461942e+06 4.361834019212116e+06 -2.796758623627830e+03 -4.218295135463633e+03 -5.794213482349872e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.430000000000000e+02 -1.306395384507171e+06 -5.143121230267488e+06 4.361718133541049e+06 -2.796738997577598e+03 -4.218161113198408e+03 -5.794320973845973e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.440000000000000e+02 -1.306451319207088e+06 -5.143205592356609e+06 4.361602245768643e+06 -2.796719370414037e+03 -4.218027092853588e+03 -5.794428459294667e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.450000000000000e+02 -1.306507253592395e+06 -5.143289951903977e+06 4.361486355659525e+06 -2.796699737697531e+03 -4.217893057772732e+03 -5.794535952950030e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.460000000000000e+02 -1.306563187510359e+06 -5.143374308637823e+06 4.361370463579904e+06 -2.796680107346928e+03 -4.217759033094347e+03 -5.794643432790268e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.470000000000000e+02 -1.306619121037216e+06 -5.143458662693858e+06 4.361254569346931e+06 -2.796660474373983e+03 -4.217625007109932e+03 -5.794750909615816e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.480000000000000e+02 -1.306675054194925e+06 -5.143543014111125e+06 4.361138672907964e+06 -2.796640839618296e+03 -4.217490974686420e+03 -5.794858386896100e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.490000000000000e+02 -1.306730986983368e+06 -5.143627362889463e+06 4.361022774263230e+06 -2.796621201743855e+03 -4.217356936894078e+03 -5.794965864392431e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.500000000000000e+02 -1.306786919347842e+06 -5.143711708931589e+06 4.360906873543851e+06 -2.796601562850675e+03 -4.217222902806719e+03 -5.795073334474433e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.510000000000000e+02 -1.306842851332150e+06 -5.143796052315406e+06 4.360790970644828e+06 -2.796581923073495e+03 -4.217088864488302e+03 -5.795180802991922e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.520000000000000e+02 -1.306898782914329e+06 -5.143880393001899e+06 4.360675065618748e+06 -2.796562281040420e+03 -4.216954826203025e+03 -5.795288267344941e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.530000000000000e+02 -1.306954714105190e+06 -5.143964731010335e+06 4.360559158439656e+06 -2.796542637099355e+03 -4.216820786193158e+03 -5.795395728696192e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.540000000000000e+02 -1.307010644937607e+06 -5.144049066399178e+06 4.360443249028726e+06 -2.796522990867239e+03 -4.216686738076471e+03 -5.795503191954274e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.550000000000000e+02 -1.307066575367795e+06 -5.144133399090573e+06 4.360327337490906e+06 -2.796503342818177e+03 -4.216552690058155e+03 -5.795610650815868e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.560000000000000e+02 -1.307122505384725e+06 -5.144217729064953e+06 4.360211423852609e+06 -2.796483693509309e+03 -4.216418643940556e+03 -5.795718103707583e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.570000000000000e+02 -1.307178435010351e+06 -5.144302056361353e+06 4.360095508061194e+06 -2.796464043386796e+03 -4.216284595461277e+03 -5.795825553614330e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.580000000000000e+02 -1.307234364277232e+06 -5.144386381037749e+06 4.359979590038495e+06 -2.796444389181064e+03 -4.216150539734557e+03 -5.795933005536419e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.590000000000000e+02 -1.307290293130908e+06 -5.144470702997243e+06 4.359863669915156e+06 -2.796424735069289e+03 -4.216016485327289e+03 -5.796040451355769e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.600000000000000e+02 -1.307346221582179e+06 -5.144555022259106e+06 4.359747747665224e+06 -2.796405079187086e+03 -4.215882431039888e+03 -5.796147892743888e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.610000000000000e+02 -1.307402149641847e+06 -5.144639338842583e+06 4.359631823262726e+06 -2.796385420957077e+03 -4.215748374734931e+03 -5.796255331531947e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.620000000000000e+02 -1.307458077320956e+06 -5.144723652767299e+06 4.359515896681212e+06 -2.796365761631992e+03 -4.215614314468717e+03 -5.796362768642244e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.630000000000000e+02 -1.307514004641220e+06 -5.144807964071915e+06 4.359399967868521e+06 -2.796346098639828e+03 -4.215480246532395e+03 -5.796470207907178e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.640000000000000e+02 -1.307569931515194e+06 -5.144892272600952e+06 4.359284037034378e+06 -2.796326435675139e+03 -4.215346186314843e+03 -5.796577636338778e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.650000000000000e+02 -1.307625858019418e+06 -5.144976578490522e+06 4.359168103995195e+06 -2.796306770995637e+03 -4.215212119899623e+03 -5.796685065014497e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.660000000000000e+02 -1.307681784142858e+06 -5.145060881721038e+06 4.359052168777382e+06 -2.796287103616357e+03 -4.215078049816899e+03 -5.796792492463868e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.670000000000000e+02 -1.307737709841739e+06 -5.145145182214693e+06 4.358936231485915e+06 -2.796267435376641e+03 -4.214943983421462e+03 -5.796899912449787e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.680000000000000e+02 -1.307793635159846e+06 -5.145229480049338e+06 4.358820292015770e+06 -2.796247766010531e+03 -4.214809912924199e+03 -5.797007330875324e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.690000000000000e+02 -1.307849560107980e+06 -5.145313775244226e+06 4.358704350340970e+06 -2.796228093202591e+03 -4.214675836759148e+03 -5.797114749871530e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.700000000000000e+02 -1.307905484675107e+06 -5.145398067779773e+06 4.358588406487932e+06 -2.796208417837175e+03 -4.214541756873779e+03 -5.797222167620788e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.710000000000000e+02 -1.307961408817695e+06 -5.145482357578547e+06 4.358472460561142e+06 -2.796188743130892e+03 -4.214407680299842e+03 -5.797329577552163e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.720000000000000e+02 -1.308017332579206e+06 -5.145566644717904e+06 4.358356512456230e+06 -2.796169065124840e+03 -4.214273600244556e+03 -5.797436986369079e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.730000000000000e+02 -1.308073255937939e+06 -5.145650929159229e+06 4.358240562225298e+06 -2.796149386891881e+03 -4.214139519582045e+03 -5.797544390651728e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.740000000000000e+02 -1.308129178915607e+06 -5.145735210941177e+06 4.358124609816185e+06 -2.796129705880511e+03 -4.214005435167276e+03 -5.797651793803439e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.750000000000000e+02 -1.308185101523004e+06 -5.145819490082996e+06 4.358008655202925e+06 -2.796110021591009e+03 -4.213871345481502e+03 -5.797759197161477e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.760000000000000e+02 -1.308241023716604e+06 -5.145903766507249e+06 4.357892698490014e+06 -2.796090337720662e+03 -4.213737256843759e+03 -5.797866594485179e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.770000000000000e+02 -1.308296945507205e+06 -5.145988040233192e+06 4.357776739651479e+06 -2.796070651827972e+03 -4.213603168498069e+03 -5.797973987356197e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.780000000000000e+02 -1.308352866927431e+06 -5.146072311318877e+06 4.357660778608964e+06 -2.796050962887754e+03 -4.213469074375805e+03 -5.798081380712738e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.790000000000000e+02 -1.308408787922838e+06 -5.146156579667483e+06 4.357544815493165e+06 -2.796031274491032e+03 -4.213334983724123e+03 -5.798188766183331e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.800000000000000e+02 -1.308464708569708e+06 -5.146240845414681e+06 4.357428850120939e+06 -2.796011581912016e+03 -4.213200883583217e+03 -5.798296155371849e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.810000000000000e+02 -1.308520628780618e+06 -5.146325108405069e+06 4.357312882702078e+06 -2.795991889211528e+03 -4.213066789172392e+03 -5.798403535273434e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.820000000000000e+02 -1.308576548632082e+06 -5.146409368774686e+06 4.357196913052929e+06 -2.795972193916188e+03 -4.212932686728696e+03 -5.798510917147553e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.830000000000000e+02 -1.308632468080258e+06 -5.146493626445627e+06 4.357080941278663e+06 -2.795952496687357e+03 -4.212798584392107e+03 -5.798618294669644e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.840000000000000e+02 -1.308688387136179e+06 -5.146577881437502e+06 4.356964967352823e+06 -2.795932798608201e+03 -4.212664480090886e+03 -5.798725668926945e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.850000000000000e+02 -1.308744305799732e+06 -5.146662133750147e+06 4.356848991275616e+06 -2.795913098227812e+03 -4.212530373527186e+03 -5.798833040746421e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.860000000000000e+02 -1.308800224070804e+06 -5.146746383383404e+06 4.356733013047273e+06 -2.795893395634910e+03 -4.212396265431260e+03 -5.798940409548505e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.870000000000000e+02 -1.308856141960427e+06 -5.146830630356871e+06 4.356617032641323e+06 -2.795873691755825e+03 -4.212262153026568e+03 -5.799047777009080e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.880000000000000e+02 -1.308912059446666e+06 -5.146914874631589e+06 4.356501050110374e+06 -2.795853986112831e+03 -4.212128040551605e+03 -5.799155140178990e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.890000000000000e+02 -1.308967976518485e+06 -5.146999116187993e+06 4.356385065480864e+06 -2.795834279031921e+03 -4.211993930125127e+03 -5.799262497348658e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.900000000000000e+02 -1.309023893219671e+06 -5.147083355103889e+06 4.356269078647712e+06 -2.795814570568434e+03 -4.211859813453164e+03 -5.799369854655544e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.910000000000000e+02 -1.309079809528272e+06 -5.147167591340314e+06 4.356153089663543e+06 -2.795794859447240e+03 -4.211725695109997e+03 -5.799477209234147e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.920000000000000e+02 -1.309135725455095e+06 -5.147251824916507e+06 4.356037098502374e+06 -2.795775145920033e+03 -4.211591572952691e+03 -5.799584562570872e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.930000000000000e+02 -1.309191640967519e+06 -5.147336055774469e+06 4.355921105242539e+06 -2.795755432379923e+03 -4.211457452197898e+03 -5.799691909792823e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.940000000000000e+02 -1.309247556098172e+06 -5.147420283972241e+06 4.355805109805656e+06 -2.795735716241937e+03 -4.211323327814965e+03 -5.799799255714845e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.950000000000000e+02 -1.309303470836025e+06 -5.147504509490262e+06 4.355689112218146e+06 -2.795715997732424e+03 -4.211189201540075e+03 -5.799906598953090e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.960000000000000e+02 -1.309359385170287e+06 -5.147588732309333e+06 4.355573112505941e+06 -2.795696278947054e+03 -4.211055074793174e+03 -5.800013937578714e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.970000000000000e+02 -1.309415299155329e+06 -5.147672952526151e+06 4.355457110538411e+06 -2.795676555626027e+03 -4.210920938840231e+03 -5.800121279854231e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.980000000000000e+02 -1.309471212703973e+06 -5.147757169985757e+06 4.355341106524907e+06 -2.795656833245146e+03 -4.210786808110224e+03 -5.800228612781328e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.990000000000000e+02 -1.309527125848847e+06 -5.147841384746180e+06 4.355225100387044e+06 -2.795637109212253e+03 -4.210652677460377e+03 -5.800335941260457e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.000000000000000e+02 -1.309583038633477e+06 -5.147925596884830e+06 4.355109092020230e+06 -2.795617381431390e+03 -4.210518539321916e+03 -5.800443271785148e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.010000000000000e+02 -1.309638951036166e+06 -5.148009806363115e+06 4.354993081476595e+06 -2.795597652483966e+03 -4.210384396868576e+03 -5.800550600921731e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.020000000000000e+02 -1.309694863024069e+06 -5.148094013122700e+06 4.354877068834974e+06 -2.795577922331183e+03 -4.210250256264062e+03 -5.800657924110932e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.030000000000000e+02 -1.309750774607971e+06 -5.148178217182822e+06 4.354761054069393e+06 -2.795558189991293e+03 -4.210116116016256e+03 -5.800765242870316e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.040000000000000e+02 -1.309806685798920e+06 -5.148262418563070e+06 4.354645037153371e+06 -2.795538457350550e+03 -4.209981973218783e+03 -5.800872558570332e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.050000000000000e+02 -1.309862596618616e+06 -5.148346617302063e+06 4.354529018034708e+06 -2.795518721151981e+03 -4.209847824720222e+03 -5.800979874908660e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.060000000000000e+02 -1.309918507045124e+06 -5.148430813360862e+06 4.354412996766052e+06 -2.795498982974901e+03 -4.209713674679979e+03 -5.801087188139109e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.070000000000000e+02 -1.309974417067657e+06 -5.148515006720276e+06 4.354296973373324e+06 -2.795479244299147e+03 -4.209579523908455e+03 -5.801194497042995e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.080000000000000e+02 -1.310030326718751e+06 -5.148599197438190e+06 4.354180947778300e+06 -2.795459502006101e+03 -4.209445367916193e+03 -5.801301806252925e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.090000000000000e+02 -1.310086235922159e+06 -5.148683385379088e+06 4.354064920164155e+06 -2.795439761298818e+03 -4.209311218882144e+03 -5.801409104560887e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.100000000000000e+02 -1.310142144754142e+06 -5.148767570678526e+06 4.353948890347660e+06 -2.795420017509850e+03 -4.209177064084010e+03 -5.801516403354814e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.110000000000000e+02 -1.310198053225488e+06 -5.148851753355725e+06 4.353832858302819e+06 -2.795400269855244e+03 -4.209042901993304e+03 -5.801623704095335e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.120000000000000e+02 -1.310253961259952e+06 -5.148935933275188e+06 4.353716824212833e+06 -2.795380523365585e+03 -4.208908745235744e+03 -5.801730995316187e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.130000000000000e+02 -1.310309868922885e+06 -5.149020110553064e+06 4.353600787920658e+06 -2.795360773790034e+03 -4.208774582524692e+03 -5.801838287164685e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.140000000000000e+02 -1.310365776203253e+06 -5.149104285169804e+06 4.353484749452729e+06 -2.795341021291264e+03 -4.208640416231407e+03 -5.801945577813395e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.150000000000000e+02 -1.310421683068457e+06 -5.149188457067462e+06 4.353368708887409e+06 -2.795321269097083e+03 -4.208506251607150e+03 -5.802052862020404e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.160000000000000e+02 -1.310477589551113e+06 -5.149272626304027e+06 4.353252666146278e+06 -2.795301514259009e+03 -4.208372082952805e+03 -5.802160145243372e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.170000000000000e+02 -1.310533495651100e+06 -5.149356792879337e+06 4.353136621229568e+06 -2.795281756498342e+03 -4.208237910754280e+03 -5.802267427237857e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.180000000000000e+02 -1.310589401357634e+06 -5.149440956774210e+06 4.353020574163206e+06 -2.795261998041367e+03 -4.208103736230806e+03 -5.802374706170905e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.190000000000000e+02 -1.310645306659696e+06 -5.149525117969097e+06 4.352904524973629e+06 -2.795242237933649e+03 -4.207969561483691e+03 -5.802481980882055e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.200000000000000e+02 -1.310701211546254e+06 -5.149609276444463e+06 4.352788473687286e+06 -2.795222476350660e+03 -4.207835389070935e+03 -5.802589249401230e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.210000000000000e+02 -1.310757116050164e+06 -5.149693432258653e+06 4.352672420225252e+06 -2.795202713491935e+03 -4.207701212079462e+03 -5.802696516772444e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.220000000000000e+02 -1.310813020182143e+06 -5.149777585430765e+06 4.352556364561703e+06 -2.795182947191983e+03 -4.207567029877995e+03 -5.802803784366541e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.230000000000000e+02 -1.310868923931400e+06 -5.149861735941620e+06 4.352440306722573e+06 -2.795163179304579e+03 -4.207432843290299e+03 -5.802911050799296e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.240000000000000e+02 -1.310924827243282e+06 -5.149945883694153e+06 4.352324246839168e+06 -2.795143411386957e+03 -4.207298662522793e+03 -5.803018307853191e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.250000000000000e+02 -1.310980730194029e+06 -5.150030028823863e+06 4.352208184728199e+06 -2.795123639516580e+03 -4.207164474265654e+03 -5.803125567033261e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.260000000000000e+02 -1.311036632740137e+06 -5.150114171253436e+06 4.352092120494254e+06 -2.795103867589908e+03 -4.207030285495965e+03 -5.803232821541318e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.270000000000000e+02 -1.311092534903302e+06 -5.150198311021469e+06 4.351976054085121e+06 -2.795084092692480e+03 -4.206896092971126e+03 -5.803340074996708e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.280000000000000e+02 -1.311148436661596e+06 -5.150282448089040e+06 4.351859985553464e+06 -2.795064316152281e+03 -4.206761900717237e+03 -5.803447323860799e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.290000000000000e+02 -1.311204338026051e+06 -5.150366582475730e+06 4.351743914872785e+06 -2.795044538866537e+03 -4.206627705852162e+03 -5.803554569896367e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.300000000000000e+02 -1.311260238996551e+06 -5.150450714181378e+06 4.351627842043307e+06 -2.795024759232971e+03 -4.206493509203121e+03 -5.803661813158134e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.310000000000000e+02 -1.311316139551166e+06 -5.150534843167077e+06 4.351511767117700e+06 -2.795004978404122e+03 -4.206359314632945e+03 -5.803769050302380e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.320000000000000e+02 -1.311372039733651e+06 -5.150618969510522e+06 4.351395689990800e+06 -2.794985195686965e+03 -4.206225113852977e+03 -5.803876287762029e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.330000000000000e+02 -1.311427939521999e+06 -5.150703093172687e+06 4.351279610715441e+06 -2.794965410464462e+03 -4.206090911310057e+03 -5.803983522497981e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.340000000000000e+02 -1.311483838927234e+06 -5.150787214173142e+06 4.351163529265127e+06 -2.794945623690289e+03 -4.205956704749832e+03 -5.804090755783486e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.350000000000000e+02 -1.311539737927437e+06 -5.150871332472986e+06 4.351047445692519e+06 -2.794925835457786e+03 -4.205822498125017e+03 -5.804197984650088e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.360000000000000e+02 -1.311595636533390e+06 -5.150955448091419e+06 4.350931359971623e+06 -2.794906044762935e+03 -4.205688289645052e+03 -5.804305210843409e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.370000000000000e+02 -1.311651534745222e+06 -5.151039561028655e+06 4.350815272102161e+06 -2.794886253284464e+03 -4.205554078988739e+03 -5.804412433901768e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.380000000000000e+02 -1.311707432562820e+06 -5.151123671284528e+06 4.350699182084360e+06 -2.794866459718828e+03 -4.205419866299023e+03 -5.804519654262548e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.390000000000000e+02 -1.311763329996973e+06 -5.151207778878249e+06 4.350583089892217e+06 -2.794846663276325e+03 -4.205285650125260e+03 -5.804626873329731e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.400000000000000e+02 -1.311819227015085e+06 -5.151291883751903e+06 4.350466995604129e+06 -2.794826867076580e+03 -4.205151435074533e+03 -5.804734086389522e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.410000000000000e+02 -1.311875123649763e+06 -5.151375985963446e+06 4.350350899141643e+06 -2.794807068148594e+03 -4.205017216522430e+03 -5.804841298106615e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.420000000000000e+02 -1.311931019879076e+06 -5.151460085473973e+06 4.350234800557436e+06 -2.794787267369238e+03 -4.204882997900683e+03 -5.804948505573024e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.430000000000000e+02 -1.311986915714057e+06 -5.151544182303058e+06 4.350118699825010e+06 -2.794767465904913e+03 -4.204748776951711e+03 -5.805055709975318e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.440000000000000e+02 -1.312042811198216e+06 -5.151628276528015e+06 4.350002596839679e+06 -2.794747660232191e+03 -4.204614546785225e+03 -5.805162917885872e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.450000000000000e+02 -1.312098706244188e+06 -5.151712367993727e+06 4.349886491811473e+06 -2.794727854289453e+03 -4.204480321998616e+03 -5.805270116849917e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.460000000000000e+02 -1.312154600928437e+06 -5.151796456835981e+06 4.349770384556539e+06 -2.794708045984114e+03 -4.204346089585973e+03 -5.805377317373704e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.470000000000000e+02 -1.312210495163524e+06 -5.151880542899556e+06 4.349654275285078e+06 -2.794688237462495e+03 -4.204211864737912e+03 -5.805484507311186e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.480000000000000e+02 -1.312266389047726e+06 -5.151964626358952e+06 4.349538163760769e+06 -2.794668426134027e+03 -4.204077630072589e+03 -5.805591700616284e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.490000000000000e+02 -1.312322282526399e+06 -5.152048707117178e+06 4.349422050114973e+06 -2.794648613148791e+03 -4.203943395380079e+03 -5.805698889558513e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.500000000000000e+02 -1.312378175610333e+06 -5.152132785193435e+06 4.349305934321688e+06 -2.794628797923475e+03 -4.203809159017880e+03 -5.805806075597476e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.510000000000000e+02 -1.312434068299651e+06 -5.152216860587929e+06 4.349189816380635e+06 -2.794608981818085e+03 -4.203674920096150e+03 -5.805913258825521e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.520000000000000e+02 -1.312489960583335e+06 -5.152300933281137e+06 4.349073696318266e+06 -2.794589163898357e+03 -4.203540681435647e+03 -5.806020437543132e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.530000000000000e+02 -1.312545852504892e+06 -5.152385003350338e+06 4.348957574029889e+06 -2.794569342517689e+03 -4.203406435177086e+03 -5.806127618255904e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.540000000000000e+02 -1.312601744020822e+06 -5.152469070718293e+06 4.348841449620145e+06 -2.794549520754554e+03 -4.203272188416088e+03 -5.806234794427046e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.550000000000000e+02 -1.312657635120104e+06 -5.152553135365480e+06 4.348725323115491e+06 -2.794529697454786e+03 -4.203137943788304e+03 -5.806341964586201e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.560000000000000e+02 -1.312713525813534e+06 -5.152637197311097e+06 4.348609194489921e+06 -2.794509872691586e+03 -4.203003698871295e+03 -5.806449130496770e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.570000000000000e+02 -1.312769416144850e+06 -5.152721256632790e+06 4.348493063638231e+06 -2.794490045486315e+03 -4.202869446281152e+03 -5.806556298032900e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.580000000000000e+02 -1.312825306070243e+06 -5.152805313252837e+06 4.348376930665739e+06 -2.794470216236395e+03 -4.202735193809768e+03 -5.806663461260361e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.590000000000000e+02 -1.312881195600737e+06 -5.152889367190800e+06 4.348260795545935e+06 -2.794450386015004e+03 -4.202600939080941e+03 -5.806770621491291e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.600000000000000e+02 -1.312937084736220e+06 -5.152973418446507e+06 4.348144658279043e+06 -2.794430553629235e+03 -4.202466682196235e+03 -5.806877779147379e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.610000000000000e+02 -1.312992973476578e+06 -5.153057467019809e+06 4.348028518865286e+06 -2.794410719014704e+03 -4.202332423829492e+03 -5.806984933756669e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.620000000000000e+02 -1.313048861821931e+06 -5.153141512910907e+06 4.347912377304394e+06 -2.794390883560545e+03 -4.202198163079908e+03 -5.807092085407337e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.630000000000000e+02 -1.313104749783074e+06 -5.153225556138990e+06 4.347796233570343e+06 -2.794371045428031e+03 -4.202063898429014e+03 -5.807199235988970e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.640000000000000e+02 -1.313160637338080e+06 -5.153309596665188e+06 4.347680087715841e+06 -2.794351205495626e+03 -4.201929634035467e+03 -5.807306382057865e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.650000000000000e+02 -1.313216524497978e+06 -5.153393634509055e+06 4.347563939714367e+06 -2.794331364846791e+03 -4.201795367136883e+03 -5.807413525207250e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.660000000000000e+02 -1.313272411251748e+06 -5.153477669651086e+06 4.347447789592384e+06 -2.794311522252610e+03 -4.201661100435393e+03 -5.807520663949378e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.670000000000000e+02 -1.313328297642891e+06 -5.153561702168522e+06 4.347331637245169e+06 -2.794291676179658e+03 -4.201526826065473e+03 -5.807627804743061e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.680000000000000e+02 -1.313384183595206e+06 -5.153645731926098e+06 4.347215482856107e+06 -2.794271831074238e+03 -4.201392557076891e+03 -5.807734936080517e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.690000000000000e+02 -1.313440069163097e+06 -5.153729759020419e+06 4.347099326294231e+06 -2.794251983384188e+03 -4.201258284228796e+03 -5.807842066278810e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.700000000000000e+02 -1.313495954357351e+06 -5.153813783470675e+06 4.346983167533530e+06 -2.794232132415747e+03 -4.201124005918984e+03 -5.807949196811946e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.710000000000000e+02 -1.313551839156285e+06 -5.153897805238361e+06 4.346867006626202e+06 -2.794212280664766e+03 -4.200989725205576e+03 -5.808056324377880e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.720000000000000e+02 -1.313607723548801e+06 -5.153981824303846e+06 4.346750843598878e+06 -2.794192426646375e+03 -4.200855444810266e+03 -5.808163447581470e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.730000000000000e+02 -1.313663607524121e+06 -5.154065840647978e+06 4.346634678477520e+06 -2.794172572776189e+03 -4.200721165692706e+03 -5.808270564707297e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.740000000000000e+02 -1.313719491125745e+06 -5.154149854348002e+06 4.346518511157388e+06 -2.794152715835337e+03 -4.200586880882891e+03 -5.808377682251589e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.750000000000000e+02 -1.313775374353551e+06 -5.154233865403756e+06 4.346402341638717e+06 -2.794132855450279e+03 -4.200452590749601e+03 -5.808484800096648e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.760000000000000e+02 -1.313831257174960e+06 -5.154317873757386e+06 4.346286169999939e+06 -2.794112995059229e+03 -4.200318300013974e+03 -5.808591913318818e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.770000000000000e+02 -1.313887139535343e+06 -5.154401879311997e+06 4.346169996372498e+06 -2.794093135039730e+03 -4.200184018722131e+03 -5.808699014331242e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.780000000000000e+02 -1.313943021576319e+06 -5.154485882318957e+06 4.346053820415467e+06 -2.794073269549990e+03 -4.200049722561817e+03 -5.808806123547126e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.790000000000000e+02 -1.313998903199888e+06 -5.154569882604327e+06 4.345937642364750e+06 -2.794053404191803e+03 -4.199915427609746e+03 -5.808913226744147e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.800000000000000e+02 -1.314054784438643e+06 -5.154653880225993e+06 4.345821462141840e+06 -2.794033536112621e+03 -4.199781129155034e+03 -5.809020328593730e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.810000000000000e+02 -1.314110665270664e+06 -5.154737875145101e+06 4.345705279799457e+06 -2.794013666304471e+03 -4.199646830780273e+03 -5.809127426033644e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.820000000000000e+02 -1.314166545739683e+06 -5.154821867439232e+06 4.345589095232334e+06 -2.793993794172112e+03 -4.199512524152139e+03 -5.809234525473535e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.830000000000000e+02 -1.314222425747389e+06 -5.154905856933999e+06 4.345472908677072e+06 -2.793973922258550e+03 -4.199378227370659e+03 -5.809341612471721e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.840000000000000e+02 -1.314278305402926e+06 -5.154989843823059e+06 4.345356719870945e+06 -2.793954047640989e+03 -4.199243920730596e+03 -5.809448702814709e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.850000000000000e+02 -1.314334184651670e+06 -5.155073828009518e+06 4.345240528945399e+06 -2.793934171317364e+03 -4.199109613856365e+03 -5.809555788971027e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.860000000000000e+02 -1.314390063515303e+06 -5.155157809531907e+06 4.345124335848171e+06 -2.793914292071247e+03 -4.198975303669815e+03 -5.809662873722683e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.870000000000000e+02 -1.314445941950352e+06 -5.155241788313054e+06 4.345008140683969e+06 -2.793894413704070e+03 -4.198840996505010e+03 -5.809769950805112e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.880000000000000e+02 -1.314501820000304e+06 -5.155325764430178e+06 4.344891943348033e+06 -2.793874532434760e+03 -4.198706685867413e+03 -5.809877026593213e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.890000000000000e+02 -1.314557697675947e+06 -5.155409737902450e+06 4.344775743814329e+06 -2.793854648029223e+03 -4.198572369409181e+03 -5.809984102919606e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.900000000000000e+02 -1.314613574944697e+06 -5.155493708672049e+06 4.344659542161341e+06 -2.793834763380746e+03 -4.198438052744485e+03 -5.810091174430280e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.910000000000000e+02 -1.314669451828246e+06 -5.155577676777493e+06 4.344543338336770e+06 -2.793814875888236e+03 -4.198303732011799e+03 -5.810198245061862e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.920000000000000e+02 -1.314725328304674e+06 -5.155661642179944e+06 4.344427132393359e+06 -2.793794986698535e+03 -4.198169411616048e+03 -5.810305311081454e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.930000000000000e+02 -1.314781204374105e+06 -5.155745604879602e+06 4.344310924330824e+06 -2.793775097070085e+03 -4.198035090666776e+03 -5.810412372623695e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.940000000000000e+02 -1.314837080047329e+06 -5.155829564895649e+06 4.344194714123146e+06 -2.793755205471776e+03 -4.197900767950180e+03 -5.810519431222855e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.950000000000000e+02 -1.314892955367830e+06 -5.155913522305273e+06 4.344078501665536e+06 -2.793735309498355e+03 -4.197766435806909e+03 -5.810626493539496e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.960000000000000e+02 -1.314948830259428e+06 -5.155997476973307e+06 4.343962287141477e+06 -2.793715414220575e+03 -4.197632106908217e+03 -5.810733548100145e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.970000000000000e+02 -1.315004704721931e+06 -5.156081428899480e+06 4.343846070551366e+06 -2.793695517646234e+03 -4.197497782113195e+03 -5.810840595099618e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.980000000000000e+02 -1.315060578820864e+06 -5.156165378200010e+06 4.343729851737413e+06 -2.793675618856290e+03 -4.197363449367826e+03 -5.810947643826742e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.990000000000000e+02 -1.315116452534311e+06 -5.156249324836061e+06 4.343613630752341e+06 -2.793655717330244e+03 -4.197229112782068e+03 -5.811054691461026e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.000000000000000e+02 -1.315172325829456e+06 -5.156333268749468e+06 4.343497407675137e+06 -2.793635814441489e+03 -4.197094778309895e+03 -5.811161733032358e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.010000000000000e+02 -1.315228198750026e+06 -5.156417210017766e+06 4.343381182400514e+06 -2.793615910014272e+03 -4.196960437496717e+03 -5.811268774859845e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.020000000000000e+02 -1.315284071274105e+06 -5.156501148602135e+06 4.343264954981196e+06 -2.793596003201988e+03 -4.196826095224592e+03 -5.811375813688950e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.030000000000000e+02 -1.315339943357977e+06 -5.156585084425072e+06 4.343148725522427e+06 -2.793576095995393e+03 -4.196691758162251e+03 -5.811482843765762e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.040000000000000e+02 -1.315395815110765e+06 -5.156669017680109e+06 4.343032493761386e+06 -2.793556185279116e+03 -4.196557407777233e+03 -5.811589880075238e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.050000000000000e+02 -1.315451686412460e+06 -5.156752948154435e+06 4.342916259987096e+06 -2.793536274600734e+03 -4.196423064915097e+03 -5.811696905744496e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.060000000000000e+02 -1.315507557339238e+06 -5.156836875983207e+06 4.342800024016004e+06 -2.793516360759811e+03 -4.196288716509792e+03 -5.811803931755611e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.070000000000000e+02 -1.315563427891228e+06 -5.156920801166623e+06 4.342683785847824e+06 -2.793496445157632e+03 -4.196154361846508e+03 -5.811910958053169e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.080000000000000e+02 -1.315619298024635e+06 -5.157004723627083e+06 4.342567545587975e+06 -2.793476527753936e+03 -4.196020009538225e+03 -5.812017978293104e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.090000000000000e+02 -1.315675167772284e+06 -5.157088643422776e+06 4.342451303157403e+06 -2.793456609154884e+03 -4.195885652738092e+03 -5.812124997279658e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.100000000000000e+02 -1.315731037090464e+06 -5.157172560476231e+06 4.342335058661377e+06 -2.793436689753626e+03 -4.195751300012280e+03 -5.812232008523895e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.110000000000000e+02 -1.315786906033552e+06 -5.157256474883924e+06 4.342218811968820e+06 -2.793416767011295e+03 -4.195616941503966e+03 -5.812339020360246e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.120000000000000e+02 -1.315842774579876e+06 -5.157340386607401e+06 4.342102563131975e+06 -2.793396843625939e+03 -4.195482580695908e+03 -5.812446029094775e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.130000000000000e+02 -1.315898642740221e+06 -5.157424295665832e+06 4.341986312124806e+06 -2.793376917541618e+03 -4.195348216263527e+03 -5.812553036560421e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.140000000000000e+02 -1.315954510459976e+06 -5.157508201962416e+06 4.341870059078837e+06 -2.793356990901156e+03 -4.195213857409690e+03 -5.812660035071878e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.150000000000000e+02 -1.316010377837354e+06 -5.157592105671302e+06 4.341753803757452e+06 -2.793337061383379e+03 -4.195079487049569e+03 -5.812767038207460e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.160000000000000e+02 -1.316066244785052e+06 -5.157676006637707e+06 4.341637546370951e+06 -2.793317130760566e+03 -4.194945120112915e+03 -5.812874034208362e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.170000000000000e+02 -1.316122111379243e+06 -5.157759904996760e+06 4.341521286735740e+06 -2.793297196242784e+03 -4.194810744180533e+03 -5.812981033402404e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.180000000000000e+02 -1.316177977511070e+06 -5.157843800555406e+06 4.341405025114153e+06 -2.793277263617065e+03 -4.194676376983342e+03 -5.813088020295197e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.190000000000000e+02 -1.316233843289397e+06 -5.157927693506735e+06 4.341288761243795e+06 -2.793257326881756e+03 -4.194542000564334e+03 -5.813195010636992e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.200000000000000e+02 -1.316289708659623e+06 -5.158011583753960e+06 4.341172495256201e+06 -2.793237388462810e+03 -4.194407624097960e+03 -5.813301996647217e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.210000000000000e+02 -1.316345573632766e+06 -5.158095471316611e+06 4.341056227124834e+06 -2.793217449112217e+03 -4.194273245440235e+03 -5.813408979595673e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.220000000000000e+02 -1.316401438197736e+06 -5.158179356175082e+06 4.340939956876348e+06 -2.793197507617263e+03 -4.194138866869168e+03 -5.813515958305503e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.230000000000000e+02 -1.316457302398246e+06 -5.158263238406861e+06 4.340823684405410e+06 -2.793177563862843e+03 -4.194004480439412e+03 -5.813622938687818e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.240000000000000e+02 -1.316513166179695e+06 -5.158347117915181e+06 4.340707409843558e+06 -2.793157618844231e+03 -4.193870095745550e+03 -5.813729913248483e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.250000000000000e+02 -1.316569029585554e+06 -5.158430994777160e+06 4.340591133085966e+06 -2.793137670505457e+03 -4.193735705681932e+03 -5.813836888085558e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.260000000000000e+02 -1.316624892528777e+06 -5.158514868838442e+06 4.340474854342478e+06 -2.793117724418763e+03 -4.193601324451075e+03 -5.813943850403319e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.270000000000000e+02 -1.316680755107319e+06 -5.158598740272753e+06 4.340358573376931e+06 -2.793097774577044e+03 -4.193466935728789e+03 -5.814050814743901e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.280000000000000e+02 -1.316736617310164e+06 -5.158682609060599e+06 4.340242290215809e+06 -2.793077821481064e+03 -4.193332541420928e+03 -5.814157779492452e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.290000000000000e+02 -1.316792479126544e+06 -5.158766475182864e+06 4.340126004885103e+06 -2.793057867273805e+03 -4.193198142972903e+03 -5.814264742691439e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.300000000000000e+02 -1.316848340512755e+06 -5.158850338562118e+06 4.340009717490100e+06 -2.793037912068963e+03 -4.193063748293321e+03 -5.814371698459459e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.310000000000000e+02 -1.316904201534062e+06 -5.158934199314109e+06 4.339893427873428e+06 -2.793017953285129e+03 -4.192929346324219e+03 -5.814478656026865e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t</EPHEMLISTList>\n\t</EPH>\n\t<ATT>\n\t\t<SATID>Imaginary1</SATID>\n\t\t<GENERATIONTIME>1432-11-30T00:18:13.000000Z</GENERATIONTIME>\n\t\t<STARTTIME>1432-11-25T17:40:21.387413Z</STARTTIME>\n\t\t<NUMPOINTS>931</NUMPOINTS>\n\t\t<TIMEINTERVAL>2.000000000000000e-02</TIMEINTERVAL>\n\t\t<ATTLISTList>\n\t\t\t<ATTLIST>1.000000000000000e+00 5.963495484933250e-01 -6.934368026823722e-01 -3.205075648978710e-01 -2.465512472908900e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.000000000000000e+00 5.963334485063230e-01 -6.934402641385681e-01 -3.205023134940338e-01 -2.465872772649916e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.000000000000000e+00 5.963173459829008e-01 -6.934437240797997e-01 -3.204970630833572e-01 -2.466233098658573e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.000000000000000e+00 5.963012409191887e-01 -6.934471825095347e-01 -3.204918136671009e-01 -2.466593450899359e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.000000000000000e+00 5.962851333581405e-01 -6.934506393968903e-01 -3.204865652212883e-01 -2.466953829498429e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.000000000000000e+00 5.962690233064322e-01 -6.934540947368222e-01 -3.204813177418672e-01 -2.467314234473679e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.000000000000000e+00 5.962529106883656e-01 -6.934575485816902e-01 -3.204760712709986e-01 -2.467674665620057e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.000000000000000e+00 5.962367956000061e-01 -6.934610008664329e-01 -3.204708257531446e-01 -2.468035123150793e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.000000000000000e+00 5.962206779376155e-01 -6.934644516573011e-01 -3.204655812497633e-01 -2.468395606897328e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.000000000000000e+01 5.962045577877020e-01 -6.934679008981546e-01 -3.204603377092656e-01 -2.468756117001870e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.100000000000000e+01 5.961884351324633e-01 -6.934713485998710e-01 -3.204550951420113e-01 -2.469116653439147e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.200000000000000e+01 5.961723099125963e-01 -6.934747948022648e-01 -3.204498535817096e-01 -2.469477216070176e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.300000000000000e+01 5.961561821927567e-01 -6.934782394632878e-01 -3.204446129897190e-01 -2.469837805001064e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.400000000000000e+01 5.961400519781010e-01 -6.934816825744373e-01 -3.204393733657354e-01 -2.470198420334876e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.500000000000000e+01 5.961239191944268e-01 -6.934851241904247e-01 -3.204341347488972e-01 -2.470559061803488e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.600000000000000e+01 5.961077839033464e-01 -6.934885642668045e-01 -3.204288971051644e-01 -2.470919729594134e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.700000000000000e+01 5.960916461248322e-01 -6.934920027915257e-01 -3.204236604216075e-01 -2.471280423715702e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.800000000000000e+01 5.960755057630196e-01 -6.934954398242309e-01 -3.204184247559836e-01 -2.471641144042779e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.900000000000000e+01 5.960593629049137e-01 -6.934988753118163e-01 -3.204131900542727e-01 -2.472001890652165e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.000000000000000e+01 5.960432175518950e-01 -6.935023092461473e-01 -3.204079563197292e-01 -2.472362663681442e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.100000000000000e+01 5.960270696119827e-01 -6.935057416988473e-01 -3.204027235985216e-01 -2.472723462725539e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.200000000000000e+01 5.960109192105725e-01 -6.935091725776286e-01 -3.203974918230958e-01 -2.473084288210392e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.300000000000000e+01 5.959947662212670e-01 -6.935126019656676e-01 -3.203922610668132e-01 -2.473445139884083e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.400000000000000e+01 5.959786107367339e-01 -6.935160298047833e-01 -3.203870312732254e-01 -2.473806017861001e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.500000000000000e+01 5.959624527462324e-01 -6.935194560986740e-01 -3.203818024501873e-01 -2.474166922179334e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.600000000000000e+01 5.959462921807978e-01 -6.935228808995441e-01 -3.203765746331682e-01 -2.474527852562468e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.700000000000000e+01 5.959301291152834e-01 -6.935263041491916e-01 -3.203713477836417e-01 -2.474888809322502e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.800000000000000e+01 5.959139635303619e-01 -6.935297258595577e-01 -3.203661219128118e-01 -2.475249792429986e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.900000000000000e+01 5.958977953876535e-01 -6.935331460637981e-01 -3.203608970376077e-01 -2.475610801645606e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.000000000000000e+01 5.958816247276902e-01 -6.935365647332759e-01 -3.203556731350649e-01 -2.475971837078005e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.100000000000000e+01 5.958654515659898e-01 -6.935399818499989e-01 -3.203504502005374e-01 -2.476332898902641e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.200000000000000e+01 5.958492758239277e-01 -6.935433974706469e-01 -3.203452282763290e-01 -2.476693986861518e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.300000000000000e+01 5.958330975956216e-01 -6.935468115314921e-01 -3.203400073080473e-01 -2.477055101163230e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.400000000000000e+01 5.958169167968498e-01 -6.935502240885938e-01 -3.203347873440147e-01 -2.477416241623961e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.500000000000000e+01 5.958007334783809e-01 -6.935536351095709e-01 -3.203295683533821e-01 -2.477777408312934e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.600000000000000e+01 5.957845476672612e-01 -6.935570445729173e-01 -3.203243503221717e-01 -2.478138601347311e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.700000000000000e+01 5.957683592517051e-01 -6.935604525527732e-01 -3.203191333148164e-01 -2.478499820491594e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.800000000000000e+01 5.957521683498366e-01 -6.935638589720776e-01 -3.203139172614070e-01 -2.478861065951070e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.900000000000000e+01 5.957359749296874e-01 -6.935672638504508e-01 -3.203087021809259e-01 -2.479222337684642e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.000000000000000e+01 5.957197789254000e-01 -6.935706672345534e-01 -3.203034881092564e-01 -2.479583635490696e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.100000000000000e+01 5.957035804087587e-01 -6.935740690716977e-01 -3.202982750074372e-01 -2.479944959606435e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.200000000000000e+01 5.956873793836106e-01 -6.935774693610692e-01 -3.202930628715563e-01 -2.480306309997592e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.300000000000000e+01 5.956711757771349e-01 -6.935808681485248e-01 -3.202878517449968e-01 -2.480667686555360e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.400000000000000e+01 5.956549696574441e-01 -6.935842653929869e-01 -3.202826415850674e-01 -2.481029089328688e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.500000000000000e+01 5.956387610228994e-01 -6.935876610906739e-01 -3.202774323952580e-01 -2.481390518402432e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.600000000000000e+01 5.956225498025520e-01 -6.935910552906670e-01 -3.202722242150084e-01 -2.481751973583518e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.700000000000000e+01 5.956063360994895e-01 -6.935944479252367e-01 -3.202670169835045e-01 -2.482113455060338e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.800000000000000e+01 5.955901198008600e-01 -6.935978390681455e-01 -3.202618107664686e-01 -2.482474962616520e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.900000000000000e+01 5.955739009914686e-01 -6.936012286564881e-01 -3.202566055184079e-01 -2.482836496546671e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.000000000000000e+01 5.955576796706271e-01 -6.936046167005381e-01 -3.202514012328815e-01 -2.483198056648215e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.100000000000000e+01 5.955414557510735e-01 -6.936080032528257e-01 -3.202461979634867e-01 -2.483559642840323e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.200000000000000e+01 5.955252293318546e-01 -6.936113882427798e-01 -3.202409956553429e-01 -2.483921255411300e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.300000000000000e+01 5.955090003840441e-01 -6.936147716969625e-01 -3.202357943199382e-01 -2.484282894149646e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.400000000000000e+01 5.954927688549129e-01 -6.936181536494961e-01 -3.202305939879770e-01 -2.484644558955687e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.500000000000000e+01 5.954765347978335e-01 -6.936215340616457e-01 -3.202253946300737e-01 -2.485006249995111e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.600000000000000e+01 5.954602982379663e-01 -6.936249129143417e-01 -3.202201962325925e-01 -2.485367967357837e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.700000000000000e+01 5.954440590790617e-01 -6.936282902754441e-01 -3.202149988483514e-01 -2.485729710760312e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.800000000000000e+01 5.954278174209470e-01 -6.936316660726892e-01 -3.202098024227193e-01 -2.486091480516273e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.900000000000000e+01 5.954115731795561e-01 -6.936350403688445e-01 -3.202046069995444e-01 -2.486453276307944e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.000000000000000e+01 5.953953264150372e-01 -6.936384131227152e-01 -3.201994125442216e-01 -2.486815098274666e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.100000000000000e+01 5.953790771349843e-01 -6.936417843218095e-01 -3.201942190565329e-01 -2.487176946570709e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.200000000000000e+01 5.953628252519734e-01 -6.936451540289733e-01 -3.201890265836372e-01 -2.487538820913815e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.300000000000000e+01 5.953465708585710e-01 -6.936485221815413e-01 -3.201838350721254e-01 -2.487900721508204e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.400000000000000e+01 5.953303139383689e-01 -6.936518887871543e-01 -3.201786445330014e-01 -2.488262648376704e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.500000000000000e+01 5.953140544224789e-01 -6.936552539002737e-01 -3.201734550001881e-01 -2.488624601197602e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.600000000000000e+01 5.952977923898282e-01 -6.936586174575374e-01 -3.201682664343946e-01 -2.488986580339267e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.700000000000000e+01 5.952815278273781e-01 -6.936619794721731e-01 -3.201630788396856e-01 -2.489348585677432e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.800000000000000e+01 5.952652606747908e-01 -6.936653399870153e-01 -3.201578922488232e-01 -2.489710617024854e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.900000000000000e+01 5.952489909956817e-01 -6.936686989493723e-01 -3.201527066310618e-01 -2.490072674708778e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.000000000000000e+01 5.952327187980915e-01 -6.936720563634461e-01 -3.201475219750973e-01 -2.490434758550100e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.100000000000000e+01 5.952164439861021e-01 -6.936754122900775e-01 -3.201423383378647e-01 -2.490796868399643e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.200000000000000e+01 5.952001666972812e-01 -6.936787666352044e-01 -3.201371556408298e-01 -2.491159004583801e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.300000000000000e+01 5.951838867927925e-01 -6.936821194907280e-01 -3.201319739641367e-01 -2.491521166815588e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.400000000000000e+01 5.951676043662508e-01 -6.936854708000496e-01 -3.201267932494812e-01 -2.491883355168444e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.500000000000000e+01 5.951513194162378e-01 -6.936888205535481e-01 -3.201216135038383e-01 -2.492245569839335e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.600000000000000e+01 5.951350318647413e-01 -6.936921688097918e-01 -3.201164347676463e-01 -2.492607810526401e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.700000000000000e+01 5.951187417859234e-01 -6.936955155189363e-01 -3.201112569977896e-01 -2.492970077384643e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.800000000000000e+01 5.951024491774880e-01 -6.936988606776453e-01 -3.201060801981189e-01 -2.493332370497121e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.900000000000000e+01 5.950861539708645e-01 -6.937022043367708e-01 -3.201009044045274e-01 -2.493694689609643e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.000000000000000e+01 5.950698562321249e-01 -6.937055464509746e-01 -3.200957295791358e-01 -2.494057034877783e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.100000000000000e+01 5.950535559644743e-01 -6.937088870108112e-01 -3.200905557241730e-01 -2.494419406444030e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.200000000000000e+01 5.950372530965135e-01 -6.937122260736504e-01 -3.200853828742149e-01 -2.494781803957289e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.300000000000000e+01 5.950209477258321e-01 -6.937155635676187e-01 -3.200802109766590e-01 -2.495144227748198e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.400000000000000e+01 5.950046397403153e-01 -6.937188995659945e-01 -3.200750400967163e-01 -2.495506677601340e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.500000000000000e+01 5.949883292321714e-01 -6.937222340142908e-01 -3.200698701761726e-01 -2.495869153564323e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.600000000000000e+01 5.949720161944864e-01 -6.937255669078459e-01 -3.200647012243401e-01 -2.496231655796988e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.700000000000000e+01 5.949557005440560e-01 -6.937288983099982e-01 -3.200595332838110e-01 -2.496594183960961e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.800000000000000e+01 5.949393823622567e-01 -6.937322281590499e-01 -3.200543663117987e-01 -2.496956738364712e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.900000000000000e+01 5.949230616575850e-01 -6.937355564520826e-01 -3.200492003010865e-01 -2.497319318964233e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.000000000000000e+01 5.949067383373392e-01 -6.937388832545199e-01 -3.200440353024404e-01 -2.497681925484717e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.100000000000000e+01 5.948904124811241e-01 -6.937422085036233e-01 -3.200388712755112e-01 -2.498044558274537e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.200000000000000e+01 5.948740840915734e-01 -6.937455322028362e-01 -3.200337082149045e-01 -2.498407217229264e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.300000000000000e+01 5.948577531038263e-01 -6.937488543993023e-01 -3.200285461551465e-01 -2.498769902126767e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.400000000000000e+01 5.948414195683520e-01 -6.937521750517383e-01 -3.200233850714050e-01 -2.499132613214623e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.500000000000000e+01 5.948250835055611e-01 -6.937554941477793e-01 -3.200182249505472e-01 -2.499495350503257e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.600000000000000e+01 5.948087448243335e-01 -6.937588117517522e-01 -3.200130658424456e-01 -2.499858113721983e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.700000000000000e+01 5.947924036426032e-01 -6.937621277775725e-01 -3.200079076831945e-01 -2.500220903256627e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.800000000000000e+01 5.947760598388919e-01 -6.937654423118820e-01 -3.200027505388533e-01 -2.500583718732290e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.900000000000000e+01 5.947597135056757e-01 -6.937687552920460e-01 -3.199975943561440e-01 -2.500946560353754e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.000000000000000e+02 5.947433646311175e-01 -6.937720667213739e-01 -3.199924391442291e-01 -2.501309428178330e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.010000000000000e+02 5.947270131383015e-01 -6.937753766565631e-01 -3.199872849436153e-01 -2.501672321928921e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.020000000000000e+02 5.947106591185725e-01 -6.937786850312163e-01 -3.199821317045474e-01 -2.502035241896552e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.030000000000000e+02 5.946943025553553e-01 -6.937819918599081e-01 -3.199769794337756e-01 -2.502398187969594e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.040000000000000e+02 5.946779433740239e-01 -6.937852971931932e-01 -3.199718281734123e-01 -2.502761159966291e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.050000000000000e+02 5.946615816560762e-01 -6.937886009692653e-01 -3.199666778806349e-01 -2.503124158195784e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.060000000000000e+02 5.946452173987642e-01 -6.937919031907777e-01 -3.199615285559351e-01 -2.503487182628358e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.070000000000000e+02 5.946288505193315e-01 -6.937952039241976e-01 -3.199563802394547e-01 -2.503850232859488e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.080000000000000e+02 5.946124811308657e-01 -6.937985030799778e-01 -3.199512328743450e-01 -2.504213309396082e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.090000000000000e+02 5.945961091218266e-01 -6.938018007389807e-01 -3.199460865203791e-01 -2.504576411867422e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.100000000000000e+02 5.945797345667441e-01 -6.938050968476684e-01 -3.199409411364602e-01 -2.504939540497011e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.110000000000000e+02 5.945633574776932e-01 -6.938083913994917e-01 -3.199357967141053e-01 -2.505302695272837e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.120000000000000e+02 5.945469777688589e-01 -6.938116844528166e-01 -3.199306533016420e-01 -2.505665875982788e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.130000000000000e+02 5.945305955121162e-01 -6.938149759593698e-01 -3.199255108572929e-01 -2.506029082776333e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.140000000000000e+02 5.945142107096709e-01 -6.938182659115205e-01 -3.199203693831181e-01 -2.506392315770956e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.150000000000000e+02 5.944978232920357e-01 -6.938215543619360e-01 -3.199152289147439e-01 -2.506755574687046e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.160000000000000e+02 5.944814333270347e-01 -6.938248412617518e-01 -3.199100894148164e-01 -2.507118859730097e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.170000000000000e+02 5.944650408197891e-01 -6.938281266047164e-01 -3.199049508816102e-01 -2.507482170958562e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.180000000000000e+02 5.944486456896313e-01 -6.938314104535795e-01 -3.198998133555278e-01 -2.507845508017952e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.190000000000000e+02 5.944322480073333e-01 -6.938346927505855e-01 -3.198946768019052e-01 -2.508208871255612e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.200000000000000e+02 5.944158477881314e-01 -6.938379734869778e-01 -3.198895412105031e-01 -2.508572260668103e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.210000000000000e+02 5.943994449362703e-01 -6.938412527371786e-01 -3.198844066293955e-01 -2.508935675837790e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.220000000000000e+02 5.943830395717906e-01 -6.938445304033408e-01 -3.198792730000598e-01 -2.509299117357678e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.230000000000000e+02 5.943666315748002e-01 -6.938478065801496e-01 -3.198741403818355e-01 -2.509662584677926e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.240000000000000e+02 5.943502210341279e-01 -6.938510811961015e-01 -3.198690087307395e-01 -2.510026078217089e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.250000000000000e+02 5.943338079413171e-01 -6.938543542623921e-01 -3.198638780475554e-01 -2.510389597840766e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.260000000000000e+02 5.943173922222373e-01 -6.938576258303847e-01 -3.198587483733594e-01 -2.510753143345823e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.270000000000000e+02 5.943009739605279e-01 -6.938608958424468e-01 -3.198536196605747e-01 -2.511116714936078e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.280000000000000e+02 5.942845531413441e-01 -6.938641643028394e-01 -3.198484919207467e-01 -2.511480312682926e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.290000000000000e+02 5.942681297000669e-01 -6.938674312642671e-01 -3.198433651846097e-01 -2.511843936252737e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.300000000000000e+02 5.942517036998641e-01 -6.938706966708451e-01 -3.198382394239084e-01 -2.512207586039414e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.310000000000000e+02 5.942352751580358e-01 -6.938739605203547e-01 -3.198331146222158e-01 -2.512571261888975e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.320000000000000e+02 5.942188439766111e-01 -6.938772228773838e-01 -3.198279908360212e-01 -2.512934963600596e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.330000000000000e+02 5.942024102815575e-01 -6.938804836558810e-01 -3.198228679934454e-01 -2.513298691471342e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.340000000000000e+02 5.941859739408791e-01 -6.938837429407635e-01 -3.198177461720605e-01 -2.513662445275198e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.350000000000000e+02 5.941695350554377e-01 -6.938870006703509e-01 -3.198126253096829e-01 -2.514026225106608e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.360000000000000e+02 5.941530936198414e-01 -6.938902568377425e-01 -3.198075054154790e-01 -2.514390031151736e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.370000000000000e+02 5.941366495420465e-01 -6.938935115182172e-01 -3.198023865332625e-01 -2.514753862935681e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.380000000000000e+02 5.941202029200671e-01 -6.938967646315529e-01 -3.197972686154099e-01 -2.515117720946776e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.390000000000000e+02 5.941037537379749e-01 -6.939000161998720e-01 -3.197921516632574e-01 -2.515481604918821e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.400000000000000e+02 5.940873019197094e-01 -6.939032662690517e-01 -3.197870357232521e-01 -2.515845514777033e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.410000000000000e+02 5.940708475546300e-01 -6.939065147751727e-01 -3.197819207461049e-01 -2.516209450785617e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.420000000000000e+02 5.940543906245400e-01 -6.939097617339568e-01 -3.197768067394562e-01 -2.516573412828373e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.430000000000000e+02 5.940379310622844e-01 -6.939130071930527e-01 -3.197716937397529e-01 -2.516937400698415e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.440000000000000e+02 5.940214689445460e-01 -6.939162510939633e-01 -3.197665817069217e-01 -2.517301414692614e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.450000000000000e+02 5.940050042731916e-01 -6.939194934349817e-01 -3.197614706396076e-01 -2.517665454816015e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.460000000000000e+02 5.939885369487319e-01 -6.939227342920387e-01 -3.197563605886279e-01 -2.518029520662561e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.470000000000000e+02 5.939720671083063e-01 -6.939259735609928e-01 -3.197512514824172e-01 -2.518393612760766e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.480000000000000e+02 5.939555946240176e-01 -6.939292113330432e-01 -3.197461433904615e-01 -2.518757730716809e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.490000000000000e+02 5.939391195756869e-01 -6.939324475577686e-01 -3.197410362644709e-01 -2.519121874635385e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.500000000000000e+02 5.939226419797434e-01 -6.939356822164472e-01 -3.197359300993169e-01 -2.519486044694838e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.510000000000000e+02 5.939061617323881e-01 -6.939389153823169e-01 -3.197308249518014e-01 -2.519850240588850e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.520000000000000e+02 5.938896789326313e-01 -6.939421469881319e-01 -3.197257207651347e-01 -2.520214462541099e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.530000000000000e+02 5.938731935645897e-01 -6.939453770434374e-01 -3.197206175485475e-01 -2.520578710530826e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.540000000000000e+02 5.938567055621180e-01 -6.939486055940434e-01 -3.197155153386286e-01 -2.520942984376001e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.550000000000000e+02 5.938402149955635e-01 -6.939518325904304e-01 -3.197104140959646e-01 -2.521307284267295e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.560000000000000e+02 5.938237218617209e-01 -6.939550580344330e-01 -3.197053138220191e-01 -2.521671610195997e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.570000000000000e+02 5.938072260949041e-01 -6.939582819726853e-01 -3.197002145524018e-01 -2.522035961958963e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.580000000000000e+02 5.937907277825910e-01 -6.939615043391238e-01 -3.196951162410162e-01 -2.522400339883508e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.590000000000000e+02 5.937742268274110e-01 -6.939647252093629e-01 -3.196900189367545e-01 -2.522764743546677e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.600000000000000e+02 5.937577233108013e-01 -6.939679445181373e-01 -3.196849225990890e-01 -2.523129173325457e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.610000000000000e+02 5.937412172305927e-01 -6.939711622711280e-01 -3.196798272260287e-01 -2.523493629124718e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.620000000000000e+02 5.937247085032633e-01 -6.939743785262853e-01 -3.196747328638038e-01 -2.523858110715158e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.630000000000000e+02 5.937081972125754e-01 -6.939775932224297e-01 -3.196696394670008e-01 -2.524222618368582e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.640000000000000e+02 5.936916833469824e-01 -6.939808063672200e-01 -3.196645470417170e-01 -2.524587152053645e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.650000000000000e+02 5.936751668481477e-01 -6.939840180033076e-01 -3.196594556187473e-01 -2.524951711564703e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.660000000000000e+02 5.936586477722523e-01 -6.939872280899129e-01 -3.196543651672847e-01 -2.525316297076474e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.670000000000000e+02 5.936421261292641e-01 -6.939904366185281e-01 -3.196492756821953e-01 -2.525680908638291e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.680000000000000e+02 5.936256018448161e-01 -6.939936436430019e-01 -3.196441872031732e-01 -2.526045546000960e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.690000000000000e+02 5.936090749817083e-01 -6.939968491167861e-01 -3.196390996964594e-01 -2.526410209379515e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.700000000000000e+02 5.935925455622586e-01 -6.940000530273210e-01 -3.196340131471838e-01 -2.526774898767586e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.710000000000000e+02 5.935760134860903e-01 -6.940032554420494e-01 -3.196289276123579e-01 -2.527139613934543e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.720000000000000e+02 5.935594788686240e-01 -6.940064562788033e-01 -3.196238430282375e-01 -2.527504355216931e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.730000000000000e+02 5.935429415967239e-01 -6.940096556185131e-01 -3.196187594560366e-01 -2.527869122260191e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.740000000000000e+02 5.935264017613865e-01 -6.940128533937887e-01 -3.196136768470668e-01 -2.528233915378313e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.750000000000000e+02 5.935098593465404e-01 -6.940160496188829e-01 -3.196085952077760e-01 -2.528598734460695e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.760000000000000e+02 5.934933142836686e-01 -6.940192443401340e-01 -3.196035145767547e-01 -2.528963579340801e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.770000000000000e+02 5.934767666486487e-01 -6.940224375041409e-01 -3.195984349115559e-01 -2.529328450224692e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.780000000000000e+02 5.934602164398782e-01 -6.940256291127626e-01 -3.195933562120336e-01 -2.529693347085675e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.790000000000000e+02 5.934436635806586e-01 -6.940288192146215e-01 -3.195882785234725e-01 -2.530058269801861e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.800000000000000e+02 5.934271081453075e-01 -6.940320077654138e-01 -3.195832017992626e-01 -2.530423218418965e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.810000000000000e+02 5.934105501357425e-01 -6.940351947576734e-01 -3.195781260416192e-01 -2.530788193053715e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.820000000000000e+02 5.933939894752047e-01 -6.940383802457890e-01 -3.195730512922587e-01 -2.531153193472447e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.830000000000000e+02 5.933774262625864e-01 -6.940415641556880e-01 -3.195679774987988e-01 -2.531518220034026e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.840000000000000e+02 5.933608603882822e-01 -6.940447465715733e-01 -3.195629047168693e-01 -2.531883272281630e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.850000000000000e+02 5.933442919481969e-01 -6.940479274249024e-01 -3.195578328936423e-01 -2.532248350498215e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.860000000000000e+02 5.933277209263624e-01 -6.940511067195551e-01 -3.195527620419779e-01 -2.532613454774188e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.870000000000000e+02 5.933111472513779e-01 -6.940542845141970e-01 -3.195476921955767e-01 -2.532978584734204e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.880000000000000e+02 5.932945709981585e-01 -6.940574607469282e-01 -3.195426233182980e-01 -2.533343740760373e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.890000000000000e+02 5.932779921590845e-01 -6.940606354306832e-01 -3.195375554090208e-01 -2.533708922675783e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.900000000000000e+02 5.932614106739320e-01 -6.940638086002890e-01 -3.195324885053045e-01 -2.534074130447745e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.910000000000000e+02 5.932448265970226e-01 -6.940669802254099e-01 -3.195274225716565e-01 -2.534439364067788e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.920000000000000e+02 5.932282399514861e-01 -6.940701502826078e-01 -3.195223575992404e-01 -2.534804623732640e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.930000000000000e+02 5.932116506373217e-01 -6.940733188425197e-01 -3.195172936426466e-01 -2.535169909145204e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.940000000000000e+02 5.931950587499305e-01 -6.940764858403796e-01 -3.195122306471919e-01 -2.535535220520347e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.950000000000000e+02 5.931784642787462e-01 -6.940796512797266e-01 -3.195071686205774e-01 -2.535900557896216e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.960000000000000e+02 5.931618671440145e-01 -6.940828152227858e-01 -3.195021076025617e-01 -2.536265920919174e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.970000000000000e+02 5.931452674633902e-01 -6.940859775789152e-01 -3.194970475325439e-01 -2.536631310066410e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.980000000000000e+02 5.931286651093792e-01 -6.940891384448442e-01 -3.194919884760423e-01 -2.536996724832029e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.990000000000000e+02 5.931120601796604e-01 -6.940922977404562e-01 -3.194869303857446e-01 -2.537362165704913e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.000000000000000e+02 5.930954526610904e-01 -6.940954554882843e-01 -3.194818732600005e-01 -2.537727632381546e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.010000000000000e+02 5.930788424875465e-01 -6.940986117226934e-01 -3.194768171424980e-01 -2.538093124902251e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.020000000000000e+02 5.930622297155446e-01 -6.941017664060808e-01 -3.194717620001363e-01 -2.538458643376201e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.030000000000000e+02 5.930456143741677e-01 -6.941049195257439e-01 -3.194667078114413e-01 -2.538824187726392e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.040000000000000e+02 5.930289963624082e-01 -6.941080711438643e-01 -3.194616546372847e-01 -2.539189757831176e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.050000000000000e+02 5.930123757609849e-01 -6.941112212093655e-01 -3.194566024289943e-01 -2.539555353798759e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.060000000000000e+02 5.929957525802598e-01 -6.941143697065727e-01 -3.194515511855367e-01 -2.539920975813481e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.070000000000000e+02 5.929791267236668e-01 -6.941175167083270e-01 -3.194465009566919e-01 -2.540286623498010e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.080000000000000e+02 5.929624983146484e-01 -6.941206621245073e-01 -3.194414516758046e-01 -2.540652297256371e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.090000000000000e+02 5.929458672356342e-01 -6.941238060414892e-01 -3.194364034050151e-01 -2.541017996676279e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.100000000000000e+02 5.929292335686065e-01 -6.941269484004278e-01 -3.194313560992716e-01 -2.541383722003336e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.110000000000000e+02 5.929125973154699e-01 -6.941300891949961e-01 -3.194263097600749e-01 -2.541749473331922e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.120000000000000e+02 5.928959583861007e-01 -6.941332284958360e-01 -3.194212644321857e-01 -2.542115250257519e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.130000000000000e+02 5.928793168774059e-01 -6.941363662279315e-01 -3.194162200658762e-01 -2.542481053178003e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.140000000000000e+02 5.928626727716888e-01 -6.941395024055386e-01 -3.194111766692030e-01 -2.542846882000487e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.150000000000000e+02 5.928460260035214e-01 -6.941426370728627e-01 -3.194061342789786e-01 -2.543212736566162e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.160000000000000e+02 5.928293766307424e-01 -6.941457701925174e-01 -3.194010928606710e-01 -2.543578616965699e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.170000000000000e+02 5.928127246860271e-01 -6.941489017389632e-01 -3.193960523972915e-01 -2.543944523332745e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.180000000000000e+02 5.927960700540404e-01 -6.941520317924366e-01 -3.193910129525877e-01 -2.544310455350080e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.190000000000000e+02 5.927794128336964e-01 -6.941551602811005e-01 -3.193859744728600e-01 -2.544676413331950e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.200000000000000e+02 5.927627530227526e-01 -6.941582872072627e-01 -3.193809369583165e-01 -2.545042397249887e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.210000000000000e+02 5.927460905364819e-01 -6.941614126343634e-01 -3.193759004528645e-01 -2.545408406780806e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.220000000000000e+02 5.927294254898468e-01 -6.941645364770361e-01 -3.193708648953066e-01 -2.545774442328339e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.230000000000000e+02 5.927127577543321e-01 -6.941676588235882e-01 -3.193658303573979e-01 -2.546140503561473e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.240000000000000e+02 5.926960874425168e-01 -6.941707796018117e-01 -3.193607967721373e-01 -2.546506590653385e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.250000000000000e+02 5.926794145184335e-01 -6.941738988295498e-01 -3.193557641634421e-01 -2.546872703639757e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.260000000000000e+02 5.926627389327228e-01 -6.941770165432284e-01 -3.193507325570514e-01 -2.547238842338513e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.270000000000000e+02 5.926460607390308e-01 -6.941801327037913e-01 -3.193457019236446e-01 -2.547605006918274e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.280000000000000e+02 5.926293799593386e-01 -6.941832472977633e-01 -3.193406722492930e-01 -2.547971197394349e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.290000000000000e+02 5.926126964966059e-01 -6.941863603903082e-01 -3.193356435890153e-01 -2.548337413543742e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.300000000000000e+02 5.925960104415207e-01 -6.941894719233686e-01 -3.193306158886707e-01 -2.548703655502345e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.310000000000000e+02 5.925793217838339e-01 -6.941925818945079e-01 -3.193255891593611e-01 -2.549069923420611e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.320000000000000e+02 5.925626304523192e-01 -6.941956903588906e-01 -3.193205634367769e-01 -2.549436216989765e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.330000000000000e+02 5.925459365475558e-01 -6.941987972446352e-01 -3.193155386655632e-01 -2.549802536507546e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.340000000000000e+02 5.925292399525902e-01 -6.942019026296814e-01 -3.193105149124728e-01 -2.550168881718772e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.350000000000000e+02 5.925125407726293e-01 -6.942050064504156e-01 -3.193054921124666e-01 -2.550535252709858e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.360000000000000e+02 5.924958389840526e-01 -6.942081087125979e-01 -3.193004702847660e-01 -2.550901649617034e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.370000000000000e+02 5.924791345202760e-01 -6.942112094647038e-01 -3.192954494646355e-01 -2.551268072211040e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.380000000000000e+02 5.924624274480718e-01 -6.942143086619417e-01 -3.192904296133479e-01 -2.551634520629559e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.390000000000000e+02 5.924457177840148e-01 -6.942174062911652e-01 -3.192854107221271e-01 -2.552000994940116e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.400000000000000e+02 5.924290054300999e-01 -6.942205024205226e-01 -3.192803928450646e-01 -2.552367494872186e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.410000000000000e+02 5.924122904781791e-01 -6.942235969888351e-01 -3.192753759288355e-01 -2.552734020609709e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.420000000000000e+02 5.923955729205286e-01 -6.942266899930429e-01 -3.192703599824216e-01 -2.553100572287685e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.430000000000000e+02 5.923788526754873e-01 -6.942297814944711e-01 -3.192653450479891e-01 -2.553467149590940e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.440000000000000e+02 5.923621298306025e-01 -6.942328714326469e-01 -3.192603310760380e-01 -2.553833752736328e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.450000000000000e+02 5.923454043785779e-01 -6.942359598099628e-01 -3.192553180717255e-01 -2.554200381748470e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.460000000000000e+02 5.923286762442525e-01 -6.942390466809010e-01 -3.192503060750496e-01 -2.554567036374512e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.470000000000000e+02 5.923119455370348e-01 -6.942421319685377e-01 -3.192452950250858e-01 -2.554933716914359e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.480000000000000e+02 5.922952121337584e-01 -6.942452157551723e-01 -3.192402849919846e-01 -2.555300423095437e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.490000000000000e+02 5.922784761310101e-01 -6.942482979763074e-01 -3.192352759198196e-01 -2.555667155114797e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.500000000000000e+02 5.922617375155167e-01 -6.942513786396654e-01 -3.192302678163376e-01 -2.556033912958406e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.510000000000000e+02 5.922449962137571e-01 -6.942544577962853e-01 -3.192252607220536e-01 -2.556400696422407e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.520000000000000e+02 5.922282523102583e-01 -6.942575353889496e-01 -3.192202545884405e-01 -2.556767505693264e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.530000000000000e+02 5.922115057887622e-01 -6.942606114228638e-01 -3.192152494277627e-01 -2.557134340837991e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.540000000000000e+02 5.921947565917942e-01 -6.942636859401482e-01 -3.192102452702181e-01 -2.557501201651959e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.550000000000000e+02 5.921780047664987e-01 -6.942667589108790e-01 -3.192052420872511e-01 -2.557868088197118e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.560000000000000e+02 5.921612503503613e-01 -6.942698303084313e-01 -3.192002398578056e-01 -2.558235000575949e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.570000000000000e+02 5.921444932333499e-01 -6.942729002047769e-01 -3.191952386454548e-01 -2.558601938573843e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.580000000000000e+02 5.921277335345235e-01 -6.942759685185314e-01 -3.191902383825299e-01 -2.558968902472779e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.590000000000000e+02 5.921109711437211e-01 -6.942790353263651e-01 -3.191852391298027e-01 -2.559335891968498e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.600000000000000e+02 5.920942061470961e-01 -6.942821005664612e-01 -3.191802408400133e-01 -2.559702907319006e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.610000000000000e+02 5.920774385265447e-01 -6.942851642533763e-01 -3.191752435214250e-01 -2.560069948430063e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.620000000000000e+02 5.920606657423099e-01 -6.942882281620454e-01 -3.191702485792464e-01 -2.560437008368737e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.630000000000000e+02 5.920438953072188e-01 -6.942912870375865e-01 -3.191652518577061e-01 -2.560804107692616e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.640000000000000e+02 5.920271197714951e-01 -6.942943460871939e-01 -3.191602574788457e-01 -2.561171226069447e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.650000000000000e+02 5.920103415430473e-01 -6.942974036336299e-01 -3.191552641061104e-01 -2.561538369945763e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.660000000000000e+02 5.919935607057178e-01 -6.943004596109251e-01 -3.191502716971138e-01 -2.561905539684907e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.670000000000000e+02 5.919767772491649e-01 -6.943035140282088e-01 -3.191452802558263e-01 -2.562272735213872e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.680000000000000e+02 5.919599910950082e-01 -6.943065669387796e-01 -3.191402898261354e-01 -2.562639956337490e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.690000000000000e+02 5.919432023321575e-01 -6.943096182834930e-01 -3.191353003564102e-01 -2.563007203232263e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.700000000000000e+02 5.919264109451774e-01 -6.943126680681256e-01 -3.191303118577349e-01 -2.563374475945071e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.710000000000000e+02 5.919096168597729e-01 -6.943157163465792e-01 -3.191253243695841e-01 -2.563741774224957e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.720000000000000e+02 5.918928334504350e-01 -6.943187537665586e-01 -3.191203304949952e-01 -2.564109134628123e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.160000000000001e-12 2.050000000000000e-11 -9.770000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.730000000000000e+02 5.918760565867468e-01 -6.943217832106326e-01 -3.191153325222185e-01 -2.564476545959495e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.160000000000001e-12 2.050000000000000e-11 -9.770000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.740000000000000e+02 5.918592546035150e-01 -6.943248268340828e-01 -3.191103479536296e-01 -2.564843921389879e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.770000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.750000000000000e+02 5.918424499892497e-01 -6.943278688991349e-01 -3.191053643592831e-01 -2.565211322636740e-01 2.430000000000000e-11 2.170000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.260000000000000e-11 -1.630000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.750000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.760000000000000e+02 5.918256426936491e-01 -6.943309094486778e-01 -3.191003817618008e-01 -2.565578749403226e-01 2.430000000000000e-11 2.170000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.260000000000000e-11 -1.630000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.750000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.770000000000000e+02 5.918088327714436e-01 -6.943339484359375e-01 -3.190954001356258e-01 -2.565946201995423e-01 2.430000000000000e-11 2.170000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.260000000000000e-11 -1.630000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.740000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.780000000000000e+02 5.917920202175332e-01 -6.943369858686865e-01 -3.190904194803941e-01 -2.566313680310039e-01 2.430000000000000e-11 2.170000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.260000000000000e-11 -1.630000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.740000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.790000000000000e+02 5.917752049814906e-01 -6.943400217806751e-01 -3.190854398245241e-01 -2.566681184228312e-01 2.430000000000000e-11 2.170000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.260000000000000e-11 -1.630000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.740000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.800000000000000e+02 5.917583871070718e-01 -6.943430561385726e-01 -3.190804611449463e-01 -2.567048713914728e-01 2.440000000000000e-11 2.170000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.260000000000000e-11 -1.630000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.740000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.810000000000000e+02 5.917415666272183e-01 -6.943460889258443e-01 -3.190754834188410e-01 -2.567416269325679e-01 2.440000000000000e-11 2.170000000000000e-11 -1.230000000000000e-11 1.260000000000000e-11 2.260000000000000e-11 -1.630000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.730000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.820000000000000e+02 5.917247524136722e-01 -6.943491139276953e-01 -3.190705017480212e-01 -2.567783874921506e-01 2.440000000000000e-11 2.170000000000000e-11 -1.230000000000000e-11 1.260000000000000e-11 2.260000000000000e-11 -1.630000000000000e-11 9.140000000000000e-12 2.050000000000000e-11 -9.720000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.830000000000000e+02 5.917079418806728e-01 -6.943521329557739e-01 -3.190655175598193e-01 -2.568151523555228e-01 2.440000000000000e-11 2.170000000000000e-11 -1.230000000000000e-11 1.260000000000000e-11 2.260000000000000e-11 -1.630000000000000e-11 9.140000000000000e-12 2.050000000000000e-11 -9.720000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.840000000000000e+02 5.916911133939351e-01 -6.943551611498376e-01 -3.190605428066734e-01 -2.568519155839403e-01 2.440000000000000e-11 2.170000000000000e-11 -1.230000000000000e-11 1.260000000000000e-11 2.260000000000000e-11 -1.630000000000000e-11 9.140000000000000e-12 2.050000000000000e-11 -9.710000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.850000000000000e+02 5.916742822810304e-01 -6.943581877781175e-01 -3.190555690224480e-01 -2.568886813942531e-01 2.440000000000000e-11 2.180000000000000e-11 -1.230000000000000e-11 1.270000000000000e-11 2.270000000000000e-11 -1.630000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.699999999999999e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.860000000000000e+02 5.916574485454388e-01 -6.943612128423852e-01 -3.190505962020400e-01 -2.569254497784838e-01 2.440000000000000e-11 2.180000000000000e-11 -1.230000000000000e-11 1.270000000000000e-11 2.270000000000000e-11 -1.630000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.699999999999999e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.870000000000000e+02 5.916406121060998e-01 -6.943642363978294e-01 -3.190456243907824e-01 -2.569622207163433e-01 2.450000000000000e-11 2.180000000000000e-11 -1.230000000000000e-11 1.270000000000000e-11 2.270000000000000e-11 -1.630000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.689999999999999e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.880000000000000e+02 5.916237730413361e-01 -6.943672583892355e-01 -3.190406535450835e-01 -2.569989942293092e-01 2.450000000000000e-11 2.180000000000000e-11 -1.230000000000000e-11 1.270000000000000e-11 2.270000000000000e-11 -1.630000000000000e-11 9.140000000000000e-12 2.050000000000000e-11 -9.689999999999999e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.890000000000000e+02 5.916069313541610e-01 -6.943702788163933e-01 -3.190356836615309e-01 -2.570357703137387e-01 2.450000000000000e-11 2.180000000000000e-11 -1.230000000000000e-11 1.270000000000000e-11 2.270000000000000e-11 -1.630000000000000e-11 9.140000000000000e-12 2.050000000000000e-11 -9.689999999999999e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.900000000000000e+02 5.915900869535334e-01 -6.943732977357040e-01 -3.190307147945447e-01 -2.570725489577526e-01 2.450000000000000e-11 2.180000000000000e-11 -1.230000000000000e-11 1.270000000000000e-11 2.270000000000000e-11 -1.640000000000000e-11 9.189999999999999e-12 2.060000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.910000000000000e+02 5.915732399313975e-01 -6.943763150893472e-01 -3.190257468887185e-01 -2.571093301731860e-01 2.450000000000000e-11 2.180000000000000e-11 -1.230000000000000e-11 1.270000000000000e-11 2.270000000000000e-11 -1.640000000000000e-11 9.189999999999999e-12 2.060000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.920000000000000e+02 5.915563871305913e-01 -6.943793330863186e-01 -3.190207816875355e-01 -2.571461130934614e-01 2.450000000000000e-11 2.190000000000000e-11 -1.230000000000000e-11 1.270000000000000e-11 2.270000000000000e-11 -1.640000000000000e-11 9.189999999999999e-12 2.060000000000000e-11 -9.770000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.930000000000000e+02 5.915395294187301e-01 -6.943823511137004e-01 -3.190158187147280e-01 -2.571828979668923e-01 2.450000000000000e-11 2.190000000000000e-11 -1.230000000000000e-11 1.270000000000000e-11 2.270000000000000e-11 -1.640000000000000e-11 9.189999999999999e-12 2.060000000000000e-11 -9.770000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.940000000000000e+02 5.915226744342094e-01 -6.943853638304457e-01 -3.190108537481933e-01 -2.572196868809012e-01 2.450000000000000e-11 2.190000000000000e-11 -1.230000000000000e-11 1.270000000000000e-11 2.270000000000000e-11 -1.640000000000000e-11 9.189999999999999e-12 2.060000000000000e-11 -9.770000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.950000000000000e+02 5.915058168179784e-01 -6.943883749847428e-01 -3.190058897487663e-01 -2.572564783676836e-01 2.460000000000000e-11 2.190000000000000e-11 -1.230000000000000e-11 1.270000000000000e-11 2.280000000000000e-11 -1.640000000000000e-11 9.179999999999999e-12 2.060000000000000e-11 -9.770000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.960000000000000e+02 5.914889564967606e-01 -6.943913846274958e-01 -3.190009267567477e-01 -2.572932724068370e-01 2.460000000000000e-11 2.190000000000000e-11 -1.230000000000000e-11 1.270000000000000e-11 2.280000000000000e-11 -1.640000000000000e-11 9.179999999999999e-12 2.060000000000000e-11 -9.760000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.970000000000000e+02 5.914720935771467e-01 -6.943943926836857e-01 -3.189959647129031e-01 -2.573300690277110e-01 2.460000000000000e-11 2.190000000000000e-11 -1.240000000000000e-11 1.270000000000000e-11 2.280000000000000e-11 -1.640000000000000e-11 9.179999999999999e-12 2.060000000000000e-11 -9.750000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.980000000000000e+02 5.914552279404289e-01 -6.943973992360142e-01 -3.189910036826188e-01 -2.573668681974245e-01 2.460000000000000e-11 2.190000000000000e-11 -1.240000000000000e-11 1.270000000000000e-11 2.280000000000000e-11 -1.640000000000000e-11 9.179999999999999e-12 2.060000000000000e-11 -9.750000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.990000000000000e+02 5.914383596811951e-01 -6.944004042190270e-01 -3.189860436126273e-01 -2.574036699397122e-01 2.460000000000000e-11 2.190000000000000e-11 -1.240000000000000e-11 1.270000000000000e-11 2.280000000000000e-11 -1.640000000000000e-11 9.179999999999999e-12 2.060000000000000e-11 -9.750000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.000000000000000e+02 5.914214887813167e-01 -6.944034076438452e-01 -3.189810845133386e-01 -2.574404742518179e-01 2.460000000000000e-11 2.190000000000000e-11 -1.240000000000000e-11 1.270000000000000e-11 2.280000000000000e-11 -1.640000000000000e-11 9.179999999999999e-12 2.060000000000000e-11 -9.740000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.010000000000000e+02 5.914046151815887e-01 -6.944064095503727e-01 -3.189761264179895e-01 -2.574772811194260e-01 2.460000000000000e-11 2.190000000000000e-11 -1.240000000000000e-11 1.270000000000000e-11 2.280000000000000e-11 -1.640000000000000e-11 9.179999999999999e-12 2.060000000000000e-11 -9.740000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.020000000000000e+02 5.913879963867059e-01 -6.944095768564661e-01 -3.189708818905229e-01 -2.575134050990811e-01 2.460000000000000e-11 2.200000000000000e-11 -1.240000000000000e-11 1.270000000000000e-11 2.280000000000000e-11 -1.640000000000000e-11 9.179999999999999e-12 2.060000000000000e-11 -9.730000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.030000000000000e+02 5.913710908180344e-01 -6.944125581297270e-01 -3.189659523749431e-01 -2.575502927235037e-01 2.460000000000000e-11 2.200000000000000e-11 -1.240000000000000e-11 1.270000000000000e-11 2.280000000000000e-11 -1.640000000000000e-11 9.179999999999999e-12 2.060000000000000e-11 -9.730000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.040000000000000e+02 5.913541835045778e-01 -6.944155385251428e-01 -3.189610227761947e-01 -2.575871803021919e-01 2.460000000000000e-11 2.200000000000000e-11 -1.240000000000000e-11 1.270000000000000e-11 2.280000000000000e-11 -1.640000000000000e-11 9.179999999999999e-12 2.060000000000000e-11 -9.730000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.050000000000000e+02 5.913372745065445e-01 -6.944185178638008e-01 -3.189560931737013e-01 -2.576240680805720e-01 2.470000000000000e-11 2.200000000000000e-11 -1.240000000000000e-11 1.270000000000000e-11 2.290000000000000e-11 -1.640000000000000e-11 9.179999999999999e-12 2.060000000000000e-11 -9.710000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.060000000000000e+02 5.913203638243970e-01 -6.944214960670192e-01 -3.189511636599131e-01 -2.576609561548143e-01 2.470000000000000e-11 2.200000000000000e-11 -1.240000000000000e-11 1.270000000000000e-11 2.290000000000000e-11 -1.640000000000000e-11 9.179999999999999e-12 2.060000000000000e-11 -9.710000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.070000000000000e+02 5.913034514196017e-01 -6.944244731305931e-01 -3.189462343482442e-01 -2.576978444838838e-01 2.470000000000000e-11 2.200000000000000e-11 -1.240000000000000e-11 1.270000000000000e-11 2.290000000000000e-11 -1.640000000000000e-11 9.179999999999999e-12 2.060000000000000e-11 -9.710000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.080000000000000e+02 5.912865372481506e-01 -6.944274490804222e-01 -3.189413053753891e-01 -2.577347329294052e-01 2.470000000000000e-11 2.200000000000000e-11 -1.240000000000000e-11 1.270000000000000e-11 2.290000000000000e-11 -1.640000000000000e-11 9.179999999999999e-12 2.060000000000000e-11 -9.699999999999999e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.090000000000000e+02 5.912696212920824e-01 -6.944304239284989e-01 -3.189363768939262e-01 -2.577716213111489e-01 2.470000000000000e-11 2.200000000000000e-11 -1.240000000000000e-11 1.270000000000000e-11 2.290000000000000e-11 -1.640000000000000e-11 9.170000000000001e-12 2.060000000000000e-11 -9.699999999999999e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.100000000000000e+02 5.912527035783678e-01 -6.944333976450446e-01 -3.189314490517635e-01 -2.578085094642389e-01 2.480000000000000e-11 2.210000000000000e-11 -1.250000000000000e-11 1.280000000000000e-11 2.290000000000000e-11 -1.650000000000000e-11 9.230000000000000e-12 2.070000000000000e-11 -9.789999999999999e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.110000000000000e+02 5.912357841757553e-01 -6.944363701560252e-01 -3.189265219645919e-01 -2.578453972871583e-01 2.480000000000000e-11 2.210000000000000e-11 -1.250000000000000e-11 1.280000000000000e-11 2.290000000000000e-11 -1.650000000000000e-11 9.230000000000000e-12 2.070000000000000e-11 -9.789999999999999e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.120000000000000e+02 5.912188601282394e-01 -6.944393434967950e-01 -3.189215973665177e-01 -2.578822839312433e-01 2.480000000000000e-11 2.210000000000000e-11 -1.250000000000000e-11 1.280000000000000e-11 2.290000000000000e-11 -1.650000000000000e-11 9.230000000000000e-12 2.070000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.130000000000000e+02 5.912019375993054e-01 -6.944423133256588e-01 -3.189166718663808e-01 -2.579191711513629e-01 2.480000000000000e-11 2.210000000000000e-11 -1.250000000000000e-11 1.280000000000000e-11 2.290000000000000e-11 -1.650000000000000e-11 9.230000000000000e-12 2.070000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.140000000000000e+02 5.911850135812312e-01 -6.944452817442737e-01 -3.189117470162506e-01 -2.579560582640364e-01 2.480000000000000e-11 2.210000000000000e-11 -1.250000000000000e-11 1.280000000000000e-11 2.290000000000000e-11 -1.650000000000000e-11 9.220000000000000e-12 2.070000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.150000000000000e+02 5.911680880594964e-01 -6.944482487969971e-01 -3.189068225981056e-01 -2.579929454524756e-01 2.480000000000000e-11 2.210000000000000e-11 -1.250000000000000e-11 1.280000000000000e-11 2.300000000000000e-11 -1.650000000000000e-11 9.220000000000000e-12 2.060000000000000e-11 -9.770000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.160000000000000e+02 5.911511609809345e-01 -6.944512145971979e-01 -3.189018983321382e-01 -2.580298328789301e-01 2.480000000000000e-11 2.210000000000000e-11 -1.250000000000000e-11 1.280000000000000e-11 2.300000000000000e-11 -1.650000000000000e-11 9.220000000000000e-12 2.060000000000000e-11 -9.770000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.170000000000000e+02 5.911342322890790e-01 -6.944541792966968e-01 -3.188969739192114e-01 -2.580667206334871e-01 2.480000000000000e-11 2.210000000000000e-11 -1.250000000000000e-11 1.280000000000000e-11 2.300000000000000e-11 -1.650000000000000e-11 9.220000000000000e-12 2.060000000000000e-11 -9.760000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.180000000000000e+02 5.911173019749008e-01 -6.944571430354725e-01 -3.188920490889463e-01 -2.581036086938276e-01 2.480000000000000e-11 2.210000000000000e-11 -1.250000000000000e-11 1.280000000000000e-11 2.300000000000000e-11 -1.650000000000000e-11 9.210000000000000e-12 2.060000000000000e-11 -9.760000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.190000000000000e+02 5.911003701243096e-01 -6.944601058893241e-01 -3.188871236411941e-01 -2.581404969061211e-01 2.480000000000000e-11 2.210000000000000e-11 -1.250000000000000e-11 1.280000000000000e-11 2.300000000000000e-11 -1.650000000000000e-11 9.210000000000000e-12 2.060000000000000e-11 -9.760000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.200000000000000e+02 5.910834369414890e-01 -6.944630678342011e-01 -3.188821974711751e-01 -2.581773849966356e-01 2.490000000000000e-11 2.220000000000000e-11 -1.250000000000000e-11 1.280000000000000e-11 2.300000000000000e-11 -1.650000000000000e-11 9.220000000000000e-12 2.060000000000000e-11 -9.740000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.210000000000000e+02 5.910665027298865e-01 -6.944660287461724e-01 -3.188772705713225e-01 -2.582142726132025e-01 2.490000000000000e-11 2.220000000000000e-11 -1.250000000000000e-11 1.280000000000000e-11 2.300000000000000e-11 -1.650000000000000e-11 9.220000000000000e-12 2.060000000000000e-11 -9.740000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.220000000000000e+02 5.910496138582622e-01 -6.944689562128986e-01 -3.188723176208844e-01 -2.582511720586225e-01 2.490000000000000e-11 2.220000000000000e-11 -1.250000000000000e-11 1.280000000000000e-11 2.300000000000000e-11 -1.650000000000000e-11 9.210000000000000e-12 2.060000000000000e-11 -9.720000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.230000000000000e+02 5.910326785354487e-01 -6.944719145164832e-01 -3.188673895234846e-01 -2.582880576981866e-01 2.490000000000000e-11 2.220000000000000e-11 -1.250000000000000e-11 1.280000000000000e-11 2.300000000000000e-11 -1.650000000000000e-11 9.210000000000000e-12 2.060000000000000e-11 -9.720000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.240000000000000e+02 5.910157428961152e-01 -6.944748713361503e-01 -3.188624610207928e-01 -2.583249420465512e-01 2.490000000000000e-11 2.220000000000000e-11 -1.250000000000000e-11 1.280000000000000e-11 2.300000000000000e-11 -1.650000000000000e-11 9.210000000000000e-12 2.060000000000000e-11 -9.720000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.250000000000000e+02 5.909988068088693e-01 -6.944778267158010e-01 -3.188575322359375e-01 -2.583618251348266e-01 2.490000000000000e-11 2.220000000000000e-11 -1.250000000000000e-11 1.280000000000000e-11 2.310000000000000e-11 -1.650000000000000e-11 9.210000000000000e-12 2.060000000000000e-11 -9.710000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.260000000000000e+02 5.909818698957027e-01 -6.944807808460968e-01 -3.188526032716093e-01 -2.583987071888953e-01 2.490000000000000e-11 2.220000000000000e-11 -1.250000000000000e-11 1.280000000000000e-11 2.310000000000000e-11 -1.650000000000000e-11 9.210000000000000e-12 2.060000000000000e-11 -9.710000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.270000000000000e+02 5.909649315861545e-01 -6.944837340272759e-01 -3.188476742196532e-01 -2.584355885934089e-01 2.500000000000000e-11 2.220000000000000e-11 -1.250000000000000e-11 1.280000000000000e-11 2.310000000000000e-11 -1.650000000000000e-11 9.210000000000000e-12 2.060000000000000e-11 -9.710000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.280000000000000e+02 5.909479912226194e-01 -6.944866865941698e-01 -3.188427451838806e-01 -2.584724698241752e-01 2.500000000000000e-11 2.220000000000000e-11 -1.250000000000000e-11 1.280000000000000e-11 2.310000000000000e-11 -1.650000000000000e-11 9.210000000000000e-12 2.060000000000000e-11 -9.699999999999999e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.290000000000000e+02 5.909310481858988e-01 -6.944896388290154e-01 -3.188378163032102e-01 -2.585093513667528e-01 2.500000000000000e-11 2.220000000000000e-11 -1.250000000000000e-11 1.280000000000000e-11 2.310000000000000e-11 -1.650000000000000e-11 9.200000000000000e-12 2.060000000000000e-11 -9.699999999999999e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.300000000000000e+02 5.909141020056720e-01 -6.944925908900452e-01 -3.188328877633905e-01 -2.585462336413357e-01 2.500000000000000e-11 2.230000000000000e-11 -1.250000000000000e-11 1.280000000000000e-11 2.310000000000000e-11 -1.650000000000000e-11 9.210000000000000e-12 2.060000000000000e-11 -9.699999999999999e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.310000000000000e+02 5.908971524264404e-01 -6.944955427787406e-01 -3.188279597869852e-01 -2.585831169524708e-01 2.500000000000000e-11 2.230000000000000e-11 -1.250000000000000e-11 1.280000000000000e-11 2.310000000000000e-11 -1.650000000000000e-11 9.200000000000000e-12 2.060000000000000e-11 -9.689999999999999e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.320000000000000e+02 5.908802095781815e-01 -6.944984872395084e-01 -3.188230269938680e-01 -2.586200042714139e-01 2.500000000000000e-11 2.230000000000000e-11 -1.260000000000000e-11 1.280000000000000e-11 2.310000000000000e-11 -1.660000000000000e-11 9.250000000000000e-12 2.070000000000000e-11 -9.789999999999999e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.330000000000000e+02 5.908632532882420e-01 -6.945014382756296e-01 -3.188181007604915e-01 -2.586568900574462e-01 2.500000000000000e-11 2.230000000000000e-11 -1.260000000000000e-11 1.280000000000000e-11 2.310000000000000e-11 -1.660000000000000e-11 9.250000000000000e-12 2.070000000000000e-11 -9.789999999999999e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.340000000000000e+02 5.908462939817773e-01 -6.945043885263817e-01 -3.188131755478240e-01 -2.586937770853950e-01 2.500000000000000e-11 2.230000000000000e-11 -1.260000000000000e-11 1.280000000000000e-11 2.310000000000000e-11 -1.660000000000000e-11 9.250000000000000e-12 2.070000000000000e-11 -9.789999999999999e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.350000000000000e+02 5.908293319602620e-01 -6.945073377992603e-01 -3.188082512755854e-01 -2.587306652814428e-01 2.510000000000000e-11 2.230000000000000e-11 -1.260000000000000e-11 1.280000000000000e-11 2.320000000000000e-11 -1.660000000000000e-11 9.250000000000000e-12 2.070000000000000e-11 -9.770000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.360000000000000e+02 5.908123675020691e-01 -6.945102859959903e-01 -3.188033277158631e-01 -2.587675545536184e-01 2.510000000000000e-11 2.230000000000000e-11 -1.260000000000000e-11 1.280000000000000e-11 2.320000000000000e-11 -1.660000000000000e-11 9.250000000000000e-12 2.070000000000000e-11 -9.770000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.370000000000000e+02 5.907954008269557e-01 -6.945132331217395e-01 -3.187984045234780e-01 -2.588044448107299e-01 2.510000000000000e-11 2.230000000000000e-11 -1.260000000000000e-11 1.280000000000000e-11 2.320000000000000e-11 -1.660000000000000e-11 9.250000000000000e-12 2.070000000000000e-11 -9.760000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.380000000000000e+02 5.907784320867945e-01 -6.945161792629834e-01 -3.187934812951915e-01 -2.588413359699503e-01 2.510000000000000e-11 2.230000000000000e-11 -1.260000000000000e-11 1.280000000000000e-11 2.320000000000000e-11 -1.660000000000000e-11 9.250000000000000e-12 2.070000000000000e-11 -9.760000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.390000000000000e+02 5.907614613761017e-01 -6.945191245449944e-01 -3.187885576439500e-01 -2.588782279553789e-01 2.510000000000000e-11 2.230000000000000e-11 -1.260000000000000e-11 1.280000000000000e-11 2.320000000000000e-11 -1.660000000000000e-11 9.250000000000000e-12 2.070000000000000e-11 -9.760000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.400000000000000e+02 5.907444887493126e-01 -6.945220690859372e-01 -3.187836332698911e-01 -2.589151206943108e-01 2.510000000000000e-11 2.240000000000000e-11 -1.260000000000000e-11 1.280000000000000e-11 2.320000000000000e-11 -1.660000000000000e-11 9.240000000000000e-12 2.070000000000000e-11 -9.750000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.410000000000000e+02 5.907275142341686e-01 -6.945250129622232e-01 -3.187787080102262e-01 -2.589520141182047e-01 2.510000000000000e-11 2.240000000000000e-11 -1.260000000000000e-11 1.280000000000000e-11 2.320000000000000e-11 -1.660000000000000e-11 9.240000000000000e-12 2.070000000000000e-11 -9.750000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.420000000000000e+02 5.907105484164645e-01 -6.945279487825892e-01 -3.187737760277499e-01 -2.589889110876736e-01 2.510000000000000e-11 2.240000000000000e-11 -1.260000000000000e-11 1.280000000000000e-11 2.320000000000000e-11 -1.660000000000000e-11 9.250000000000000e-12 2.070000000000000e-11 -9.740000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.430000000000000e+02 5.906935701000017e-01 -6.945308913411690e-01 -3.187688491331288e-01 -2.590258057369896e-01 2.510000000000000e-11 2.240000000000000e-11 -1.260000000000000e-11 1.280000000000000e-11 2.320000000000000e-11 -1.660000000000000e-11 9.240000000000000e-12 2.070000000000000e-11 -9.740000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.440000000000000e+02 5.906765897889685e-01 -6.945338331650311e-01 -3.187639217613003e-01 -2.590627009967258e-01 2.510000000000000e-11 2.240000000000000e-11 -1.260000000000000e-11 1.280000000000000e-11 2.320000000000000e-11 -1.660000000000000e-11 9.240000000000000e-12 2.070000000000000e-11 -9.740000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.450000000000000e+02 5.906596073491523e-01 -6.945367741859964e-01 -3.187589942568204e-01 -2.590995969310563e-01 2.520000000000000e-11 2.240000000000000e-11 -1.260000000000000e-11 1.280000000000000e-11 2.320000000000000e-11 -1.660000000000000e-11 9.240000000000000e-12 2.070000000000000e-11 -9.740000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.460000000000000e+02 5.906426225933300e-01 -6.945397143476566e-01 -3.187540669908646e-01 -2.591364936606425e-01 2.520000000000000e-11 2.240000000000000e-11 -1.260000000000000e-11 1.280000000000000e-11 2.320000000000000e-11 -1.660000000000000e-11 9.240000000000000e-12 2.070000000000000e-11 -9.730000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.470000000000000e+02 5.906256352997493e-01 -6.945426536151866e-01 -3.187491403102333e-01 -2.591733913568865e-01 2.520000000000000e-11 2.240000000000000e-11 -1.260000000000000e-11 1.280000000000000e-11 2.330000000000000e-11 -1.660000000000000e-11 9.240000000000000e-12 2.070000000000000e-11 -9.730000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.480000000000000e+02 5.906086452461078e-01 -6.945455919729938e-01 -3.187442144919944e-01 -2.592102902265307e-01 2.520000000000000e-11 2.240000000000000e-11 -1.260000000000000e-11 1.280000000000000e-11 2.330000000000000e-11 -1.660000000000000e-11 9.240000000000000e-12 2.070000000000000e-11 -9.730000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.490000000000000e+02 5.905916522484375e-01 -6.945485294150615e-01 -3.187392897113263e-01 -2.592471904884515e-01 2.520000000000000e-11 2.240000000000000e-11 -1.260000000000000e-11 1.280000000000000e-11 2.330000000000000e-11 -1.660000000000000e-11 9.230000000000000e-12 2.070000000000000e-11 -9.730000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.500000000000000e+02 5.905746561923702e-01 -6.945514659334190e-01 -3.187343660293517e-01 -2.592840923482773e-01 2.520000000000000e-11 2.250000000000000e-11 -1.260000000000000e-11 1.280000000000000e-11 2.330000000000000e-11 -1.660000000000000e-11 9.230000000000000e-12 2.070000000000000e-11 -9.720000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.510000000000000e+02 5.905576570444631e-01 -6.945544015113340e-01 -3.187294434042187e-01 -2.593209959772329e-01 2.520000000000000e-11 2.250000000000000e-11 -1.260000000000000e-11 1.280000000000000e-11 2.330000000000000e-11 -1.660000000000000e-11 9.230000000000000e-12 2.070000000000000e-11 -9.720000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.520000000000000e+02 5.905406642080196e-01 -6.945573295606731e-01 -3.187245165643217e-01 -2.593579040845627e-01 2.520000000000000e-11 2.250000000000000e-11 -1.260000000000000e-11 1.280000000000000e-11 2.330000000000000e-11 -1.660000000000000e-11 9.230000000000000e-12 2.070000000000000e-11 -9.710000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.530000000000000e+02 5.905236590113392e-01 -6.945602631798656e-01 -3.187195957056815e-01 -2.593948115760654e-01 2.520000000000000e-11 2.250000000000000e-11 -1.270000000000000e-11 1.280000000000000e-11 2.330000000000000e-11 -1.660000000000000e-11 9.230000000000000e-12 2.070000000000000e-11 -9.710000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.540000000000000e+02 5.905066508884041e-01 -6.945631957784320e-01 -3.187146755736847e-01 -2.594317210762263e-01 2.520000000000000e-11 2.250000000000000e-11 -1.270000000000000e-11 1.280000000000000e-11 2.330000000000000e-11 -1.660000000000000e-11 9.230000000000000e-12 2.070000000000000e-11 -9.710000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.550000000000000e+02 5.904896398706079e-01 -6.945661273354273e-01 -3.187097561470346e-01 -2.594686325944713e-01 2.530000000000000e-11 2.250000000000000e-11 -1.270000000000000e-11 1.290000000000000e-11 2.340000000000000e-11 -1.670000000000000e-11 9.279999999999999e-12 2.080000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.560000000000000e+02 5.904726259420937e-01 -6.945690578318947e-01 -3.187048374961136e-01 -2.595055461298242e-01 2.530000000000000e-11 2.250000000000000e-11 -1.270000000000000e-11 1.290000000000000e-11 2.340000000000000e-11 -1.670000000000000e-11 9.279999999999999e-12 2.080000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.570000000000000e+02 5.904556090446846e-01 -6.945719872421683e-01 -3.186999197783551e-01 -2.595424616886527e-01 2.530000000000000e-11 2.250000000000000e-11 -1.270000000000000e-11 1.290000000000000e-11 2.340000000000000e-11 -1.670000000000000e-11 9.279999999999999e-12 2.080000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.580000000000000e+02 5.904385890960226e-01 -6.945749155261131e-01 -3.186950032106449e-01 -2.595793792980445e-01 2.530000000000000e-11 2.260000000000000e-11 -1.270000000000000e-11 1.290000000000000e-11 2.340000000000000e-11 -1.670000000000000e-11 9.270000000000001e-12 2.080000000000000e-11 -9.760000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.590000000000000e+02 5.904215660150908e-01 -6.945778426237519e-01 -3.186900880270145e-01 -2.596162990140571e-01 2.530000000000000e-11 2.260000000000000e-11 -1.270000000000000e-11 1.290000000000000e-11 2.340000000000000e-11 -1.670000000000000e-11 9.270000000000001e-12 2.080000000000000e-11 -9.760000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.600000000000000e+02 5.904045397468964e-01 -6.945807684525553e-01 -3.186851744332235e-01 -2.596532209285666e-01 2.540000000000000e-11 2.260000000000000e-11 -1.270000000000000e-11 1.290000000000000e-11 2.340000000000000e-11 -1.670000000000000e-11 9.270000000000001e-12 2.080000000000000e-11 -9.760000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.610000000000000e+02 5.903875102769084e-01 -6.945836929071367e-01 -3.186802625728868e-01 -2.596901451788146e-01 2.540000000000000e-11 2.260000000000000e-11 -1.270000000000000e-11 1.290000000000000e-11 2.340000000000000e-11 -1.670000000000000e-11 9.260000000000001e-12 2.080000000000000e-11 -9.760000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.620000000000000e+02 5.903705190953407e-01 -6.945865868084511e-01 -3.186753296828287e-01 -2.597270834172373e-01 2.540000000000000e-11 2.260000000000000e-11 -1.270000000000000e-11 1.290000000000000e-11 2.340000000000000e-11 -1.670000000000000e-11 9.260000000000001e-12 2.080000000000000e-11 -9.750000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.630000000000000e+02 5.903534833412855e-01 -6.945895080964636e-01 -3.186704214143642e-01 -2.597640130285854e-01 2.540000000000000e-11 2.260000000000000e-11 -1.270000000000000e-11 1.290000000000000e-11 2.340000000000000e-11 -1.670000000000000e-11 9.260000000000001e-12 2.080000000000000e-11 -9.750000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.640000000000000e+02 5.903364445535536e-01 -6.945924275401237e-01 -3.186655148685640e-01 -2.598009458592104e-01 2.540000000000000e-11 2.260000000000000e-11 -1.270000000000000e-11 1.290000000000000e-11 2.340000000000000e-11 -1.670000000000000e-11 9.260000000000001e-12 2.080000000000000e-11 -9.750000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.650000000000000e+02 5.903194028064566e-01 -6.945953449336816e-01 -3.186606099398972e-01 -2.598378824179055e-01 2.540000000000000e-11 2.260000000000000e-11 -1.270000000000000e-11 1.290000000000000e-11 2.340000000000000e-11 -1.670000000000000e-11 9.260000000000001e-12 2.080000000000000e-11 -9.740000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.660000000000000e+02 5.903023581536750e-01 -6.945982600547675e-01 -3.186557065087073e-01 -2.598748233217995e-01 2.540000000000000e-11 2.260000000000000e-11 -1.270000000000000e-11 1.290000000000000e-11 2.340000000000000e-11 -1.670000000000000e-11 9.260000000000001e-12 2.080000000000000e-11 -9.740000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.670000000000000e+02 5.902853106145990e-01 -6.946011726757277e-01 -3.186508044630414e-01 -2.599117692702411e-01 2.540000000000000e-11 2.270000000000000e-11 -1.280000000000000e-11 1.290000000000000e-11 2.350000000000000e-11 -1.670000000000000e-11 9.260000000000001e-12 2.080000000000000e-11 -9.730000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.680000000000000e+02 5.902682601693620e-01 -6.946040825774248e-01 -3.186459037157556e-01 -2.599487209981579e-01 2.540000000000000e-11 2.270000000000000e-11 -1.280000000000000e-11 1.290000000000000e-11 2.350000000000000e-11 -1.670000000000000e-11 9.260000000000001e-12 2.070000000000000e-11 -9.730000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.690000000000000e+02 5.902512067609031e-01 -6.946069895640183e-01 -3.186410042196630e-01 -2.599856792132867e-01 2.540000000000000e-11 2.270000000000000e-11 -1.280000000000000e-11 1.290000000000000e-11 2.350000000000000e-11 -1.670000000000000e-11 9.260000000000001e-12 2.080000000000000e-11 -9.730000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.700000000000000e+02 5.902341503042655e-01 -6.946098934732954e-01 -3.186361059822977e-01 -2.600226445293888e-01 2.550000000000000e-11 2.270000000000000e-11 -1.280000000000000e-11 1.290000000000000e-11 2.350000000000000e-11 -1.670000000000000e-11 9.260000000000001e-12 2.070000000000000e-11 -9.710000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.710000000000000e+02 5.902170906993423e-01 -6.946127941781406e-01 -3.186312090811967e-01 -2.600596174147290e-01 2.550000000000000e-11 2.270000000000000e-11 -1.280000000000000e-11 1.290000000000000e-11 2.350000000000000e-11 -1.670000000000000e-11 9.260000000000001e-12 2.070000000000000e-11 -9.710000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.720000000000000e+02 5.902000395438711e-01 -6.946156833819166e-01 -3.186263072382979e-01 -2.600966013964269e-01 2.550000000000000e-11 2.270000000000000e-11 -1.280000000000000e-11 1.290000000000000e-11 2.350000000000000e-11 -1.670000000000000e-11 9.260000000000001e-12 2.070000000000000e-11 -9.699999999999999e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.730000000000000e+02 5.901829733523937e-01 -6.946185773932744e-01 -3.186214135835806e-01 -2.601335901245214e-01 2.550000000000000e-11 2.270000000000000e-11 -1.280000000000000e-11 1.290000000000000e-11 2.350000000000000e-11 -1.670000000000000e-11 9.260000000000001e-12 2.070000000000000e-11 -9.699999999999999e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.740000000000000e+02 5.901659037584862e-01 -6.946214679281478e-01 -3.186165220174466e-01 -2.601705867921671e-01 2.550000000000000e-11 2.270000000000000e-11 -1.280000000000000e-11 1.290000000000000e-11 2.350000000000000e-11 -1.670000000000000e-11 9.260000000000001e-12 2.070000000000000e-11 -9.699999999999999e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.750000000000000e+02 5.901488307296958e-01 -6.946243548948796e-01 -3.186116329405435e-01 -2.602075912232495e-01 2.550000000000000e-11 2.270000000000000e-11 -1.280000000000000e-11 1.290000000000000e-11 2.350000000000000e-11 -1.670000000000000e-11 9.260000000000001e-12 2.070000000000000e-11 -9.689999999999999e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.760000000000000e+02 5.901317542650071e-01 -6.946272382011882e-01 -3.186067467730851e-01 -2.602446031482044e-01 2.550000000000000e-11 2.270000000000000e-11 -1.280000000000000e-11 1.290000000000000e-11 2.350000000000000e-11 -1.670000000000000e-11 9.250000000000000e-12 2.070000000000000e-11 -9.689999999999999e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.770000000000000e+02 5.901146743870617e-01 -6.946301177684325e-01 -3.186018638998043e-01 -2.602816222510464e-01 2.560000000000000e-11 2.280000000000000e-11 -1.280000000000000e-11 1.290000000000000e-11 2.350000000000000e-11 -1.670000000000000e-11 9.250000000000000e-12 2.070000000000000e-11 -9.680000000000001e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.780000000000000e+02 5.900975911308390e-01 -6.946329935523826e-01 -3.185969846090162e-01 -2.603186482142208e-01 2.560000000000000e-11 2.280000000000000e-11 -1.280000000000000e-11 1.290000000000000e-11 2.350000000000000e-11 -1.670000000000000e-11 9.250000000000000e-12 2.070000000000000e-11 -9.680000000000001e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.790000000000000e+02 5.900805045314543e-01 -6.946358655632282e-01 -3.185921090430657e-01 -2.603556807535040e-01 2.560000000000000e-11 2.280000000000000e-11 -1.280000000000000e-11 1.290000000000000e-11 2.350000000000000e-11 -1.670000000000000e-11 9.250000000000000e-12 2.070000000000000e-11 -9.680000000000001e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.800000000000000e+02 5.900634146134776e-01 -6.946387338758792e-01 -3.185872371756673e-01 -2.603927196424165e-01 2.560000000000000e-11 2.280000000000000e-11 -1.280000000000000e-11 1.290000000000000e-11 2.360000000000000e-11 -1.680000000000000e-11 9.300000000000000e-12 2.080000000000000e-11 -9.780000000000001e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.810000000000000e+02 5.900463213803443e-01 -6.946415986256690e-01 -3.185823688283419e-01 -2.604297647274997e-01 2.560000000000000e-11 2.280000000000000e-11 -1.280000000000000e-11 1.290000000000000e-11 2.360000000000000e-11 -1.680000000000000e-11 9.300000000000000e-12 2.080000000000000e-11 -9.770000000000001e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.820000000000000e+02 5.900292348717907e-01 -6.946444529312412e-01 -3.185774981905553e-01 -2.604668187219109e-01 2.560000000000000e-11 2.280000000000000e-11 -1.290000000000000e-11 1.290000000000000e-11 2.360000000000000e-11 -1.680000000000000e-11 9.289999999999999e-12 2.080000000000000e-11 -9.770000000000001e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.830000000000000e+02 5.900121348805404e-01 -6.946473110884361e-01 -3.185726360628517e-01 -2.605038760619089e-01 2.560000000000000e-11 2.280000000000000e-11 -1.290000000000000e-11 1.290000000000000e-11 2.360000000000000e-11 -1.680000000000000e-11 9.289999999999999e-12 2.080000000000000e-11 -9.770000000000001e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.840000000000000e+02 5.899950313612599e-01 -6.946501661957769e-01 -3.185677767125657e-01 -2.605409396114526e-01 2.560000000000000e-11 2.280000000000000e-11 -1.290000000000000e-11 1.290000000000000e-11 2.360000000000000e-11 -1.680000000000000e-11 9.289999999999999e-12 2.080000000000000e-11 -9.770000000000001e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.850000000000000e+02 5.899779241647224e-01 -6.946530183532204e-01 -3.185629200945184e-01 -2.605780094940847e-01 2.570000000000000e-11 2.290000000000000e-11 -1.290000000000000e-11 1.290000000000000e-11 2.360000000000000e-11 -1.680000000000000e-11 9.289999999999999e-12 2.080000000000000e-11 -9.750000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.860000000000000e+02 5.899608131219856e-01 -6.946558675881297e-01 -3.185580663372199e-01 -2.606150858590500e-01 2.570000000000000e-11 2.290000000000000e-11 -1.290000000000000e-11 1.290000000000000e-11 2.360000000000000e-11 -1.680000000000000e-11 9.289999999999999e-12 2.080000000000000e-11 -9.750000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.870000000000000e+02 5.899436980674200e-01 -6.946587138545092e-01 -3.185532157166355e-01 -2.606521688632705e-01 2.570000000000000e-11 2.290000000000000e-11 -1.290000000000000e-11 1.290000000000000e-11 2.360000000000000e-11 -1.680000000000000e-11 9.300000000000000e-12 2.080000000000000e-11 -9.740000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.880000000000000e+02 5.899265788674714e-01 -6.946615570459930e-01 -3.185483685877988e-01 -2.606892586552229e-01 2.570000000000000e-11 2.290000000000000e-11 -1.290000000000000e-11 1.290000000000000e-11 2.360000000000000e-11 -1.680000000000000e-11 9.300000000000000e-12 2.080000000000000e-11 -9.740000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.890000000000000e+02 5.899094554494745e-01 -6.946643970196328e-01 -3.185435252942779e-01 -2.607263553570069e-01 2.570000000000000e-11 2.290000000000000e-11 -1.290000000000000e-11 1.290000000000000e-11 2.360000000000000e-11 -1.680000000000000e-11 9.289999999999999e-12 2.080000000000000e-11 -9.740000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.900000000000000e+02 5.898923278211571e-01 -6.946672336270362e-01 -3.185386860814128e-01 -2.607634590432957e-01 2.570000000000000e-11 2.290000000000000e-11 -1.290000000000000e-11 1.290000000000000e-11 2.370000000000000e-11 -1.680000000000000e-11 9.300000000000000e-12 2.080000000000000e-11 -9.730000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.910000000000000e+02 5.898751960728623e-01 -6.946700667476043e-01 -3.185338510391901e-01 -2.608005697175992e-01 2.570000000000000e-11 2.290000000000000e-11 -1.290000000000000e-11 1.290000000000000e-11 2.370000000000000e-11 -1.680000000000000e-11 9.289999999999999e-12 2.080000000000000e-11 -9.730000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.920000000000000e+02 5.898580843221218e-01 -6.946728795253411e-01 -3.185290069075511e-01 -2.608376939215207e-01 2.570000000000000e-11 2.290000000000000e-11 -1.290000000000000e-11 1.290000000000000e-11 2.370000000000000e-11 -1.680000000000000e-11 9.300000000000000e-12 2.080000000000000e-11 -9.720000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.930000000000000e+02 5.898409448256785e-01 -6.946757055905615e-01 -3.185241798036690e-01 -2.608748181596042e-01 2.570000000000000e-11 2.290000000000000e-11 -1.290000000000000e-11 1.290000000000000e-11 2.370000000000000e-11 -1.680000000000000e-11 9.300000000000000e-12 2.080000000000000e-11 -9.710000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.940000000000000e+02 5.898238017251072e-01 -6.946785282960837e-01 -3.185193562015465e-01 -2.609119486874477e-01 2.570000000000000e-11 2.290000000000000e-11 -1.290000000000000e-11 1.290000000000000e-11 2.370000000000000e-11 -1.680000000000000e-11 9.300000000000000e-12 2.080000000000000e-11 -9.710000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.950000000000000e+02 5.898066551663620e-01 -6.946813479135037e-01 -3.185145356916158e-01 -2.609490849489614e-01 2.570000000000000e-11 2.290000000000000e-11 -1.290000000000000e-11 1.290000000000000e-11 2.370000000000000e-11 -1.690000000000000e-11 9.300000000000000e-12 2.080000000000000e-11 -9.699999999999999e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.960000000000000e+02 5.897895052519888e-01 -6.946841648192522e-01 -3.185097178485846e-01 -2.609862262266103e-01 2.570000000000000e-11 2.290000000000000e-11 -1.290000000000000e-11 1.290000000000000e-11 2.370000000000000e-11 -1.690000000000000e-11 9.300000000000000e-12 2.080000000000000e-11 -9.699999999999999e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.970000000000000e+02 5.897723520457850e-01 -6.946869794557534e-01 -3.185049022680479e-01 -2.610233716896737e-01 2.580000000000000e-11 2.300000000000000e-11 -1.290000000000000e-11 1.290000000000000e-11 2.380000000000000e-11 -1.680000000000000e-11 9.260000000000001e-12 2.080000000000000e-11 -9.710000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.980000000000000e+02 5.897551955909337e-01 -6.946897922769764e-01 -3.185000885894664e-01 -2.610605204702026e-01 2.590000000000000e-11 2.300000000000000e-11 -1.290000000000000e-11 1.290000000000000e-11 2.380000000000000e-11 -1.680000000000000e-11 9.250000000000000e-12 2.080000000000000e-11 -9.710000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.990000000000000e+02 5.897380359323424e-01 -6.946926036902876e-01 -3.184952765073052e-01 -2.610976717537088e-01 2.590000000000000e-11 2.300000000000000e-11 -1.290000000000000e-11 1.290000000000000e-11 2.380000000000000e-11 -1.680000000000000e-11 9.250000000000000e-12 2.080000000000000e-11 -9.710000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.000000000000000e+02 5.897208731332050e-01 -6.946954140055263e-01 -3.184904657762735e-01 -2.611348248708189e-01 2.590000000000000e-11 2.300000000000000e-11 -1.290000000000000e-11 1.290000000000000e-11 2.380000000000000e-11 -1.680000000000000e-11 9.250000000000000e-12 2.080000000000000e-11 -9.689999999999999e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.010000000000000e+02 5.897037072765023e-01 -6.946982234026168e-01 -3.184856562157240e-01 -2.611719793745818e-01 2.590000000000000e-11 2.300000000000000e-11 -1.290000000000000e-11 1.290000000000000e-11 2.380000000000000e-11 -1.680000000000000e-11 9.250000000000000e-12 2.080000000000000e-11 -9.689999999999999e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.020000000000000e+02 5.896865445905913e-01 -6.947010276170882e-01 -3.184808443412815e-01 -2.612091367931734e-01 2.590000000000000e-11 2.300000000000000e-11 -1.290000000000000e-11 1.290000000000000e-11 2.380000000000000e-11 -1.680000000000000e-11 9.250000000000000e-12 2.080000000000000e-11 -9.680000000000001e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.030000000000000e+02 5.896693728553010e-01 -6.947038351729158e-01 -3.184760368800616e-01 -2.612462938409807e-01 2.590000000000000e-11 2.300000000000000e-11 -1.290000000000000e-11 1.290000000000000e-11 2.380000000000000e-11 -1.680000000000000e-11 9.250000000000000e-12 2.080000000000000e-11 -9.680000000000001e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.040000000000000e+02 5.896521982267650e-01 -6.947066415700808e-01 -3.184712305274243e-01 -2.612834526163331e-01 2.590000000000000e-11 2.300000000000000e-11 -1.290000000000000e-11 1.290000000000000e-11 2.380000000000000e-11 -1.680000000000000e-11 9.250000000000000e-12 2.080000000000000e-11 -9.680000000000001e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.050000000000000e+02 5.896350206561158e-01 -6.947094465455552e-01 -3.184664254466194e-01 -2.613206137285826e-01 2.590000000000000e-11 2.310000000000000e-11 -1.300000000000000e-11 1.300000000000000e-11 2.380000000000000e-11 -1.690000000000000e-11 9.310000000000000e-12 2.090000000000000e-11 -9.760000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.060000000000000e+02 5.896178400333606e-01 -6.947122498062798e-01 -3.184616218756435e-01 -2.613577779133925e-01 2.590000000000000e-11 2.310000000000000e-11 -1.300000000000000e-11 1.300000000000000e-11 2.380000000000000e-11 -1.690000000000000e-11 9.310000000000000e-12 2.090000000000000e-11 -9.750000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.070000000000000e+02 5.896006562105103e-01 -6.947150510721312e-01 -3.184568200855063e-01 -2.613949459171109e-01 2.590000000000000e-11 2.310000000000000e-11 -1.300000000000000e-11 1.300000000000000e-11 2.380000000000000e-11 -1.690000000000000e-11 9.310000000000000e-12 2.090000000000000e-11 -9.750000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.080000000000000e+02 5.895834690447578e-01 -6.947178501165443e-01 -3.184520203171201e-01 -2.614321183683068e-01 2.590000000000000e-11 2.310000000000000e-11 -1.300000000000000e-11 1.300000000000000e-11 2.390000000000000e-11 -1.690000000000000e-11 9.320000000000000e-12 2.090000000000000e-11 -9.740000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.090000000000000e+02 5.895662784491618e-01 -6.947206468004871e-01 -3.184472227126934e-01 -2.614692956568526e-01 2.590000000000000e-11 2.310000000000000e-11 -1.300000000000000e-11 1.300000000000000e-11 2.390000000000000e-11 -1.690000000000000e-11 9.310000000000000e-12 2.090000000000000e-11 -9.740000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.100000000000000e+02 5.895490844325995e-01 -6.947234410946330e-01 -3.184424272643574e-01 -2.615064778476818e-01 2.590000000000000e-11 2.310000000000000e-11 -1.300000000000000e-11 1.300000000000000e-11 2.390000000000000e-11 -1.690000000000000e-11 9.320000000000000e-12 2.090000000000000e-11 -9.730000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.110000000000000e+02 5.895318871172164e-01 -6.947262330827644e-01 -3.184376337983363e-01 -2.615436646519333e-01 2.600000000000000e-11 2.310000000000000e-11 -1.300000000000000e-11 1.300000000000000e-11 2.390000000000000e-11 -1.690000000000000e-11 9.310000000000000e-12 2.090000000000000e-11 -9.730000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.120000000000000e+02 5.895147078388958e-01 -6.947290081407874e-01 -3.184328304048916e-01 -2.615808613214444e-01 2.600000000000000e-11 2.310000000000000e-11 -1.300000000000000e-11 1.300000000000000e-11 2.390000000000000e-11 -1.700000000000000e-11 9.320000000000000e-12 2.090000000000000e-11 -9.720000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.130000000000000e+02 5.894975046648619e-01 -6.947317961173853e-01 -3.184280398942907e-01 -2.616180553144086e-01 2.600000000000000e-11 2.310000000000000e-11 -1.300000000000000e-11 1.300000000000000e-11 2.390000000000000e-11 -1.700000000000000e-11 9.320000000000000e-12 2.090000000000000e-11 -9.720000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.140000000000000e+02 5.894802990195879e-01 -6.947345824671063e-01 -3.184232502842962e-01 -2.616552515628480e-01 2.600000000000000e-11 2.310000000000000e-11 -1.300000000000000e-11 1.300000000000000e-11 2.390000000000000e-11 -1.700000000000000e-11 9.320000000000000e-12 2.090000000000000e-11 -9.720000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.150000000000000e+02 5.894630911927085e-01 -6.947373674242426e-01 -3.184184612607191e-01 -2.616924491733102e-01 2.600000000000000e-11 2.310000000000000e-11 -1.300000000000000e-11 1.300000000000000e-11 2.390000000000000e-11 -1.700000000000000e-11 9.320000000000000e-12 2.090000000000000e-11 -9.710000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.160000000000000e+02 5.894458814141741e-01 -6.947401511698651e-01 -3.184136726161952e-01 -2.617296473986219e-01 2.600000000000000e-11 2.310000000000000e-11 -1.300000000000000e-11 1.300000000000000e-11 2.390000000000000e-11 -1.700000000000000e-11 9.320000000000000e-12 2.090000000000000e-11 -9.699999999999999e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.170000000000000e+02 5.894286698333805e-01 -6.947429338221170e-01 -3.184088842450384e-01 -2.617668457167926e-01 2.610000000000000e-11 2.320000000000000e-11 -1.300000000000000e-11 1.290000000000000e-11 2.400000000000000e-11 -1.690000000000000e-11 9.279999999999999e-12 2.090000000000000e-11 -9.710000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.180000000000000e+02 5.894114565171377e-01 -6.947457154430015e-01 -3.184040961015365e-01 -2.618040438681228e-01 2.610000000000000e-11 2.320000000000000e-11 -1.300000000000000e-11 1.290000000000000e-11 2.400000000000000e-11 -1.690000000000000e-11 9.270000000000001e-12 2.090000000000000e-11 -9.710000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.190000000000000e+02 5.893942414623748e-01 -6.947484960573419e-01 -3.183993081413461e-01 -2.618412418473559e-01 2.610000000000000e-11 2.320000000000000e-11 -1.300000000000000e-11 1.290000000000000e-11 2.400000000000000e-11 -1.690000000000000e-11 9.270000000000001e-12 2.090000000000000e-11 -9.710000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.200000000000000e+02 5.893770246167669e-01 -6.947512756777319e-01 -3.183945202700193e-01 -2.618784398534472e-01 2.610000000000000e-11 2.320000000000000e-11 -1.300000000000000e-11 1.300000000000000e-11 2.400000000000000e-11 -1.690000000000000e-11 9.279999999999999e-12 2.090000000000000e-11 -9.699999999999999e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.210000000000000e+02 5.893598059002253e-01 -6.947540543282109e-01 -3.183897323221016e-01 -2.619156382036452e-01 2.610000000000000e-11 2.320000000000000e-11 -1.300000000000000e-11 1.300000000000000e-11 2.400000000000000e-11 -1.690000000000000e-11 9.270000000000001e-12 2.090000000000000e-11 -9.699999999999999e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.220000000000000e+02 5.893426082411166e-01 -6.947568159190997e-01 -3.183849314406180e-01 -2.619528436132450e-01 2.610000000000000e-11 2.330000000000000e-11 -1.300000000000000e-11 1.300000000000000e-11 2.400000000000000e-11 -1.700000000000000e-11 9.279999999999999e-12 2.080000000000000e-11 -9.689999999999999e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.230000000000000e+02 5.893253855153259e-01 -6.947595928254763e-01 -3.183801426937408e-01 -2.619900435178870e-01 2.610000000000000e-11 2.330000000000000e-11 -1.300000000000000e-11 1.300000000000000e-11 2.400000000000000e-11 -1.700000000000000e-11 9.279999999999999e-12 2.080000000000000e-11 -9.689999999999999e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.240000000000000e+02 5.893081606676938e-01 -6.947623690176438e-01 -3.183753533089288e-01 -2.620272443332297e-01 2.610000000000000e-11 2.330000000000000e-11 -1.300000000000000e-11 1.300000000000000e-11 2.400000000000000e-11 -1.700000000000000e-11 9.279999999999999e-12 2.090000000000000e-11 -9.689999999999999e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.250000000000000e+02 5.892909336471884e-01 -6.947651446154045e-01 -3.183705632931739e-01 -2.620644458471012e-01 2.620000000000000e-11 2.330000000000000e-11 -1.310000000000000e-11 1.300000000000000e-11 2.400000000000000e-11 -1.700000000000000e-11 9.289999999999999e-12 2.080000000000000e-11 -9.670000000000001e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.260000000000000e+02 5.892737044311627e-01 -6.947679197139898e-01 -3.183657728199945e-01 -2.621016476464763e-01 2.620000000000000e-11 2.330000000000000e-11 -1.310000000000000e-11 1.300000000000000e-11 2.400000000000000e-11 -1.700000000000000e-11 9.279999999999999e-12 2.080000000000000e-11 -9.670000000000001e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.270000000000000e+02 5.892564730318360e-01 -6.947706943492022e-01 -3.183609822081107e-01 -2.621388492213537e-01 2.620000000000000e-11 2.330000000000000e-11 -1.310000000000000e-11 1.300000000000000e-11 2.400000000000000e-11 -1.700000000000000e-11 9.289999999999999e-12 2.080000000000000e-11 -9.660000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.280000000000000e+02 5.892392395028159e-01 -6.947734684657036e-01 -3.183561918573428e-01 -2.621760501120765e-01 2.620000000000000e-11 2.330000000000000e-11 -1.310000000000000e-11 1.300000000000000e-11 2.400000000000000e-11 -1.700000000000000e-11 9.289999999999999e-12 2.080000000000000e-11 -9.660000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.290000000000000e+02 5.892220039444839e-01 -6.947762418973109e-01 -3.183514021591740e-01 -2.622132500580089e-01 2.620000000000000e-11 2.330000000000000e-11 -1.310000000000000e-11 1.300000000000000e-11 2.400000000000000e-11 -1.700000000000000e-11 9.279999999999999e-12 2.080000000000000e-11 -9.660000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.300000000000000e+02 5.892047665066678e-01 -6.947790143658767e-01 -3.183466134077163e-01 -2.622504491024603e-01 2.620000000000000e-11 2.330000000000000e-11 -1.310000000000000e-11 1.300000000000000e-11 2.400000000000000e-11 -1.700000000000000e-11 9.279999999999999e-12 2.080000000000000e-11 -9.660000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.310000000000000e+02 5.891875273851376e-01 -6.947817855047761e-01 -3.183418257357244e-01 -2.622876476157980e-01 2.620000000000000e-11 2.330000000000000e-11 -1.310000000000000e-11 1.300000000000000e-11 2.400000000000000e-11 -1.700000000000000e-11 9.279999999999999e-12 2.080000000000000e-11 -9.660000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.320000000000000e+02 5.891703294141535e-01 -6.947845250233186e-01 -3.183370157081875e-01 -2.623248580598964e-01 2.620000000000000e-11 2.330000000000000e-11 -1.310000000000000e-11 1.300000000000000e-11 2.400000000000000e-11 -1.700000000000000e-11 9.279999999999999e-12 2.080000000000000e-11 -9.650000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.330000000000000e+02 5.891530876573813e-01 -6.947872922878675e-01 -3.183322298625004e-01 -2.623620574889514e-01 2.620000000000000e-11 2.330000000000000e-11 -1.310000000000000e-11 1.300000000000000e-11 2.400000000000000e-11 -1.700000000000000e-11 9.279999999999999e-12 2.080000000000000e-11 -9.650000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.340000000000000e+02 5.891358449966476e-01 -6.947900570958478e-01 -3.183274444585361e-01 -2.623992583932591e-01 2.620000000000000e-11 2.330000000000000e-11 -1.310000000000000e-11 1.300000000000000e-11 2.400000000000000e-11 -1.700000000000000e-11 9.279999999999999e-12 2.080000000000000e-11 -9.650000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.350000000000000e+02 5.891186017293450e-01 -6.947928192404119e-01 -3.183226590607003e-01 -2.624364611805055e-01 2.620000000000000e-11 2.330000000000000e-11 -1.310000000000000e-11 1.300000000000000e-11 2.400000000000000e-11 -1.700000000000000e-11 9.270000000000001e-12 2.080000000000000e-11 -9.650000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.360000000000000e+02 5.891013581608872e-01 -6.947955786454124e-01 -3.183178732126851e-01 -2.624736659193408e-01 2.620000000000000e-11 2.330000000000000e-11 -1.310000000000000e-11 1.300000000000000e-11 2.400000000000000e-11 -1.700000000000000e-11 9.270000000000001e-12 2.080000000000000e-11 -9.650000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.370000000000000e+02 5.890841145900709e-01 -6.947983353562955e-01 -3.183130864891679e-01 -2.625108723338757e-01 2.620000000000000e-11 2.330000000000000e-11 -1.310000000000000e-11 1.300000000000000e-11 2.410000000000000e-11 -1.700000000000000e-11 9.310000000000000e-12 2.100000000000000e-11 -9.740000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.380000000000000e+02 5.890668712845241e-01 -6.948010895136425e-01 -3.183082985367903e-01 -2.625480798793449e-01 2.620000000000000e-11 2.330000000000000e-11 -1.310000000000000e-11 1.300000000000000e-11 2.410000000000000e-11 -1.700000000000000e-11 9.310000000000000e-12 2.100000000000000e-11 -9.740000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.390000000000000e+02 5.890496284435018e-01 -6.948038413219532e-01 -3.183035091049088e-01 -2.625852878710689e-01 2.620000000000000e-11 2.330000000000000e-11 -1.310000000000000e-11 1.300000000000000e-11 2.410000000000000e-11 -1.700000000000000e-11 9.310000000000000e-12 2.100000000000000e-11 -9.740000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.400000000000000e+02 5.890323861517418e-01 -6.948065910254536e-01 -3.182987180647543e-01 -2.626224956288160e-01 2.640000000000000e-11 2.350000000000000e-11 -1.320000000000000e-11 1.300000000000000e-11 2.420000000000000e-11 -1.710000000000000e-11 9.320000000000000e-12 2.090000000000000e-11 -9.670000000000001e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.410000000000000e+02 5.890151443317465e-01 -6.948093388958894e-01 -3.182939254180302e-01 -2.626597026056542e-01 2.640000000000000e-11 2.350000000000000e-11 -1.320000000000000e-11 1.300000000000000e-11 2.420000000000000e-11 -1.710000000000000e-11 9.320000000000000e-12 2.090000000000000e-11 -9.670000000000001e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.420000000000000e+02 5.889978819716319e-01 -6.948120997795312e-01 -3.182891426656596e-01 -2.626969027111850e-01 2.640000000000000e-11 2.350000000000000e-11 -1.320000000000000e-11 1.300000000000000e-11 2.420000000000000e-11 -1.710000000000000e-11 9.320000000000000e-12 2.090000000000000e-11 -9.670000000000001e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.430000000000000e+02 5.889806400440366e-01 -6.948148449190564e-01 -3.182843472894206e-01 -2.627341074241641e-01 2.640000000000000e-11 2.350000000000000e-11 -1.320000000000000e-11 1.300000000000000e-11 2.420000000000000e-11 -1.710000000000000e-11 9.310000000000000e-12 2.090000000000000e-11 -9.660000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.440000000000000e+02 5.889633971214852e-01 -6.948175892276386e-01 -3.182795509706276e-01 -2.627713111908299e-01 2.640000000000000e-11 2.350000000000000e-11 -1.320000000000000e-11 1.300000000000000e-11 2.420000000000000e-11 -1.710000000000000e-11 9.310000000000000e-12 2.090000000000000e-11 -9.660000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.450000000000000e+02 5.889461523640128e-01 -6.948203330963815e-01 -3.182747540531877e-01 -2.628085144431997e-01 2.640000000000000e-11 2.350000000000000e-11 -1.320000000000000e-11 1.300000000000000e-11 2.420000000000000e-11 -1.710000000000000e-11 9.310000000000000e-12 2.090000000000000e-11 -9.660000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.460000000000000e+02 5.889289048752789e-01 -6.948230769081700e-01 -3.182699568853323e-01 -2.628457177556388e-01 2.640000000000000e-11 2.350000000000000e-11 -1.320000000000000e-11 1.300000000000000e-11 2.420000000000000e-11 -1.710000000000000e-11 9.310000000000000e-12 2.090000000000000e-11 -9.660000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.470000000000000e+02 5.889116538249032e-01 -6.948258209861046e-01 -3.182651597873186e-01 -2.628829217460804e-01 2.640000000000000e-11 2.350000000000000e-11 -1.320000000000000e-11 1.300000000000000e-11 2.420000000000000e-11 -1.710000000000000e-11 9.310000000000000e-12 2.090000000000000e-11 -9.660000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.480000000000000e+02 5.888943985869851e-01 -6.948285655292816e-01 -3.182603630223382e-01 -2.629201269706896e-01 2.640000000000000e-11 2.350000000000000e-11 -1.320000000000000e-11 1.300000000000000e-11 2.420000000000000e-11 -1.710000000000000e-11 9.310000000000000e-12 2.090000000000000e-11 -9.660000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.490000000000000e+02 5.888771388663756e-01 -6.948313105523543e-01 -3.182555667727208e-01 -2.629573338296987e-01 2.640000000000000e-11 2.350000000000000e-11 -1.320000000000000e-11 1.300000000000000e-11 2.420000000000000e-11 -1.710000000000000e-11 9.300000000000000e-12 2.090000000000000e-11 -9.660000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.500000000000000e+02 5.888598747786584e-01 -6.948340558495361e-01 -3.182507711260389e-01 -2.629945425004637e-01 2.640000000000000e-11 2.350000000000000e-11 -1.320000000000000e-11 1.300000000000000e-11 2.420000000000000e-11 -1.710000000000000e-11 9.300000000000000e-12 2.090000000000000e-11 -9.660000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.510000000000000e+02 5.888426068547477e-01 -6.948368010001711e-01 -3.182459760736534e-01 -2.630317529145130e-01 2.640000000000000e-11 2.350000000000000e-11 -1.320000000000000e-11 1.300000000000000e-11 2.420000000000000e-11 -1.710000000000000e-11 9.300000000000000e-12 2.090000000000000e-11 -9.660000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.520000000000000e+02 5.888253917413067e-01 -6.948395062830113e-01 -3.182411509350623e-01 -2.630689803085968e-01 2.640000000000000e-11 2.350000000000000e-11 -1.320000000000000e-11 1.300000000000000e-11 2.420000000000000e-11 -1.710000000000000e-11 9.300000000000000e-12 2.090000000000000e-11 -9.660000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.530000000000000e+02 5.888081189276576e-01 -6.948422493261439e-01 -3.182363567304404e-01 -2.631061931828941e-01 2.640000000000000e-11 2.350000000000000e-11 -1.320000000000000e-11 1.300000000000000e-11 2.420000000000000e-11 -1.710000000000000e-11 9.300000000000000e-12 2.090000000000000e-11 -9.660000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.540000000000000e+02 5.887908452426157e-01 -6.948449903811125e-01 -3.182315626814343e-01 -2.631434065563687e-01 2.640000000000000e-11 2.350000000000000e-11 -1.320000000000000e-11 1.300000000000000e-11 2.420000000000000e-11 -1.710000000000000e-11 9.289999999999999e-12 2.090000000000000e-11 -9.650000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.550000000000000e+02 5.887735715631032e-01 -6.948477289761975e-01 -3.182267685918510e-01 -2.631806199495639e-01 2.640000000000000e-11 2.350000000000000e-11 -1.320000000000000e-11 1.300000000000000e-11 2.420000000000000e-11 -1.710000000000000e-11 9.289999999999999e-12 2.090000000000000e-11 -9.650000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.560000000000000e+02 5.887562984709093e-01 -6.948504648368283e-01 -3.182219742857026e-01 -2.632178329988051e-01 2.640000000000000e-11 2.350000000000000e-11 -1.320000000000000e-11 1.300000000000000e-11 2.420000000000000e-11 -1.710000000000000e-11 9.289999999999999e-12 2.090000000000000e-11 -9.650000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.570000000000000e+02 5.887390262002465e-01 -6.948531979006782e-01 -3.182171796280827e-01 -2.632550455082202e-01 2.640000000000000e-11 2.350000000000000e-11 -1.320000000000000e-11 1.300000000000000e-11 2.420000000000000e-11 -1.710000000000000e-11 9.289999999999999e-12 2.090000000000000e-11 -9.650000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.580000000000000e+02 5.887217546568978e-01 -6.948559282923032e-01 -3.182123845371357e-01 -2.632922574591498e-01 2.660000000000000e-11 2.360000000000000e-11 -1.320000000000000e-11 1.300000000000000e-11 2.430000000000000e-11 -1.710000000000000e-11 9.240000000000000e-12 2.090000000000000e-11 -9.670000000000001e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.590000000000000e+02 5.887044834891642e-01 -6.948586562722624e-01 -3.182075889880564e-01 -2.633294689807248e-01 2.660000000000000e-11 2.360000000000000e-11 -1.320000000000000e-11 1.300000000000000e-11 2.430000000000000e-11 -1.710000000000000e-11 9.240000000000000e-12 2.090000000000000e-11 -9.670000000000001e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.600000000000000e+02 5.886872121850539e-01 -6.948613821745951e-01 -3.182027930128812e-01 -2.633666802976453e-01 2.660000000000000e-11 2.370000000000000e-11 -1.330000000000000e-11 1.300000000000000e-11 2.440000000000000e-11 -1.710000000000000e-11 9.289999999999999e-12 2.080000000000000e-11 -9.580000000000001e-12 1.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.610000000000000e+02 5.886699401711903e-01 -6.948641063449025e-01 -3.181979966997828e-01 -2.634038916732104e-01 2.660000000000000e-11 2.370000000000000e-11 -1.330000000000000e-11 1.300000000000000e-11 2.440000000000000e-11 -1.710000000000000e-11 9.289999999999999e-12 2.080000000000000e-11 -9.570000000000001e-12 1.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.620000000000000e+02 5.886526567836088e-01 -6.948668361861173e-01 -3.181932057339993e-01 -2.634411005424462e-01 2.670000000000000e-11 2.370000000000000e-11 -1.330000000000000e-11 1.300000000000000e-11 2.440000000000000e-11 -1.710000000000000e-11 9.289999999999999e-12 2.080000000000000e-11 -9.570000000000001e-12 1.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.630000000000000e+02 5.886353817836361e-01 -6.948695577296178e-01 -3.181884092213625e-01 -2.634783127512724e-01 2.670000000000000e-11 2.370000000000000e-11 -1.330000000000000e-11 1.300000000000000e-11 2.440000000000000e-11 -1.710000000000000e-11 9.289999999999999e-12 2.080000000000000e-11 -9.570000000000001e-12 1.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.640000000000000e+02 5.886181047164143e-01 -6.948722781945434e-01 -3.181836129380968e-01 -2.635155256421162e-01 2.670000000000000e-11 2.370000000000000e-11 -1.330000000000000e-11 1.300000000000000e-11 2.440000000000000e-11 -1.710000000000000e-11 9.289999999999999e-12 2.080000000000000e-11 -9.570000000000001e-12 1.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.650000000000000e+02 5.886008253764795e-01 -6.948749975942807e-01 -3.181788171414928e-01 -2.635527393272855e-01 2.670000000000000e-11 2.370000000000000e-11 -1.330000000000000e-11 1.300000000000000e-11 2.440000000000000e-11 -1.710000000000000e-11 9.279999999999999e-12 2.080000000000000e-11 -9.570000000000001e-12 1.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.660000000000000e+02 5.885835436849942e-01 -6.948777158432244e-01 -3.181740220953114e-01 -2.635899538893884e-01 2.670000000000000e-11 2.370000000000000e-11 -1.330000000000000e-11 1.300000000000000e-11 2.440000000000000e-11 -1.710000000000000e-11 9.279999999999999e-12 2.080000000000000e-11 -9.570000000000001e-12 1.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.670000000000000e+02 5.885662596669270e-01 -6.948804327779271e-01 -3.181692280474755e-01 -2.636271694035304e-01 2.670000000000000e-11 2.370000000000000e-11 -1.330000000000000e-11 1.300000000000000e-11 2.440000000000000e-11 -1.710000000000000e-11 9.279999999999999e-12 2.080000000000000e-11 -9.570000000000001e-12 1.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.680000000000000e+02 5.885489734253450e-01 -6.948831481833708e-01 -3.181644352032855e-01 -2.636643859578205e-01 2.670000000000000e-11 2.370000000000000e-11 -1.330000000000000e-11 1.300000000000000e-11 2.440000000000000e-11 -1.710000000000000e-11 9.279999999999999e-12 2.080000000000000e-11 -9.570000000000001e-12 1.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.690000000000000e+02 5.885316851170886e-01 -6.948858618212306e-01 -3.181596436974485e-01 -2.637016036669450e-01 2.670000000000000e-11 2.370000000000000e-11 -1.330000000000000e-11 1.300000000000000e-11 2.440000000000000e-11 -1.710000000000000e-11 9.279999999999999e-12 2.080000000000000e-11 -9.570000000000001e-12 1.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.700000000000000e+02 5.885143949338798e-01 -6.948885734544360e-01 -3.181548535721063e-01 -2.637388226761091e-01 2.670000000000000e-11 2.370000000000000e-11 -1.330000000000000e-11 1.300000000000000e-11 2.440000000000000e-11 -1.720000000000000e-11 9.270000000000001e-12 2.080000000000000e-11 -9.570000000000001e-12 1.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.710000000000000e+02 5.884971030886889e-01 -6.948912828679180e-01 -3.181500647647579e-01 -2.637760431513463e-01 2.670000000000000e-11 2.370000000000000e-11 -1.330000000000000e-11 1.300000000000000e-11 2.440000000000000e-11 -1.720000000000000e-11 9.270000000000001e-12 2.080000000000000e-11 -9.560000000000000e-12 1.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.720000000000000e+02 5.884798518599743e-01 -6.948939603662780e-01 -3.181452540715797e-01 -2.638132769840489e-01 2.670000000000000e-11 2.370000000000000e-11 -1.330000000000000e-11 1.310000000000000e-11 2.440000000000000e-11 -1.720000000000000e-11 9.320000000000000e-12 2.100000000000000e-11 -9.670000000000001e-12 1.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.730000000000000e+02 5.884625573626229e-01 -6.948966648576408e-01 -3.181404673241751e-01 -2.638505008574457e-01 2.670000000000000e-11 2.370000000000000e-11 -1.330000000000000e-11 1.310000000000000e-11 2.440000000000000e-11 -1.720000000000000e-11 9.320000000000000e-12 2.100000000000000e-11 -9.670000000000001e-12 1.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.740000000000000e+02 5.884452618676588e-01 -6.948993667465198e-01 -3.181356811796136e-01 -2.638877265830525e-01 2.670000000000000e-11 2.370000000000000e-11 -1.330000000000000e-11 1.310000000000000e-11 2.440000000000000e-11 -1.720000000000000e-11 9.310000000000000e-12 2.100000000000000e-11 -9.660000000000000e-12 1.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.750000000000000e+02 5.884279655776723e-01 -6.949020660053281e-01 -3.181308953150391e-01 -2.639249541701205e-01 2.670000000000000e-11 2.370000000000000e-11 -1.330000000000000e-11 1.300000000000000e-11 2.440000000000000e-11 -1.720000000000000e-11 9.310000000000000e-12 2.100000000000000e-11 -9.660000000000000e-12 1.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.760000000000000e+02 5.884106686758982e-01 -6.949047626425779e-01 -3.181261094258283e-01 -2.639621835540669e-01 2.670000000000000e-11 2.370000000000000e-11 -1.330000000000000e-11 1.300000000000000e-11 2.440000000000000e-11 -1.720000000000000e-11 9.310000000000000e-12 2.100000000000000e-11 -9.660000000000000e-12 1.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.770000000000000e+02 5.883933713200483e-01 -6.949074566838066e-01 -3.181213232635035e-01 -2.639994146147843e-01 2.680000000000000e-11 2.380000000000000e-11 -1.330000000000000e-11 1.300000000000000e-11 2.450000000000000e-11 -1.720000000000000e-11 9.260000000000001e-12 2.100000000000000e-11 -9.680000000000001e-12 1.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.780000000000000e+02 5.883760736350990e-01 -6.949101481501971e-01 -3.181165366688722e-01 -2.640366472090906e-01 2.680000000000000e-11 2.380000000000000e-11 -1.330000000000000e-11 1.300000000000000e-11 2.450000000000000e-11 -1.720000000000000e-11 9.260000000000001e-12 2.100000000000000e-11 -9.680000000000001e-12 1.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.790000000000000e+02 5.883587757045583e-01 -6.949128370407848e-01 -3.181117495960701e-01 -2.640738812080595e-01 2.680000000000000e-11 2.380000000000000e-11 -1.330000000000000e-11 1.300000000000000e-11 2.450000000000000e-11 -1.720000000000000e-11 9.260000000000001e-12 2.100000000000000e-11 -9.680000000000001e-12 1.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.800000000000000e+02 5.883414775597865e-01 -6.949155233255734e-01 -3.181069621203456e-01 -2.641111165295334e-01 2.680000000000000e-11 2.380000000000000e-11 -1.330000000000000e-11 1.300000000000000e-11 2.450000000000000e-11 -1.720000000000000e-11 9.250000000000000e-12 2.100000000000000e-11 -9.680000000000001e-12 1.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.810000000000000e+02 5.883241791699956e-01 -6.949182069521852e-01 -3.181021744251813e-01 -2.641483531583770e-01 2.680000000000000e-11 2.380000000000000e-11 -1.330000000000000e-11 1.300000000000000e-11 2.450000000000000e-11 -1.720000000000000e-11 9.250000000000000e-12 2.100000000000000e-11 -9.680000000000001e-12 1.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.820000000000000e+02 5.883068866268988e-01 -6.949208835195128e-01 -3.180973833798006e-01 -2.641855928750644e-01 2.690000000000000e-11 2.390000000000000e-11 -1.340000000000000e-11 1.310000000000000e-11 2.460000000000000e-11 -1.730000000000000e-11 9.310000000000000e-12 2.090000000000000e-11 -9.580000000000001e-12 1.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.830000000000000e+02 5.882895873875101e-01 -6.949235616844704e-01 -3.180925960493193e-01 -2.642228323324988e-01 2.690000000000000e-11 2.390000000000000e-11 -1.340000000000000e-11 1.310000000000000e-11 2.460000000000000e-11 -1.730000000000000e-11 9.310000000000000e-12 2.090000000000000e-11 -9.580000000000001e-12 1.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.840000000000000e+02 5.882722874242562e-01 -6.949262371162247e-01 -3.180878093012846e-01 -2.642600733936700e-01 2.690000000000000e-11 2.390000000000000e-11 -1.340000000000000e-11 1.310000000000000e-11 2.460000000000000e-11 -1.730000000000000e-11 9.310000000000000e-12 2.090000000000000e-11 -9.580000000000001e-12 1.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.850000000000000e+02 5.882549864884214e-01 -6.949289098982067e-01 -3.180830233126779e-01 -2.642973161790787e-01 2.690000000000000e-11 2.390000000000000e-11 -1.340000000000000e-11 1.310000000000000e-11 2.460000000000000e-11 -1.730000000000000e-11 9.300000000000000e-12 2.090000000000000e-11 -9.580000000000001e-12 1.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.860000000000000e+02 5.882376843278579e-01 -6.949315801862801e-01 -3.180782381513658e-01 -2.643345607576167e-01 2.690000000000000e-11 2.390000000000000e-11 -1.340000000000000e-11 1.310000000000000e-11 2.460000000000000e-11 -1.730000000000000e-11 9.300000000000000e-12 2.090000000000000e-11 -9.580000000000001e-12 1.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.870000000000000e+02 5.882203807203297e-01 -6.949342481930718e-01 -3.180734537744209e-01 -2.643718071156074e-01 2.690000000000000e-11 2.390000000000000e-11 -1.340000000000000e-11 1.310000000000000e-11 2.460000000000000e-11 -1.730000000000000e-11 9.300000000000000e-12 2.090000000000000e-11 -9.580000000000001e-12 1.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.880000000000000e+02 5.882030755066365e-01 -6.949369141563081e-01 -3.180686700533975e-01 -2.644090551359867e-01 2.690000000000000e-11 2.390000000000000e-11 -1.340000000000000e-11 1.310000000000000e-11 2.460000000000000e-11 -1.730000000000000e-11 9.300000000000000e-12 2.090000000000000e-11 -9.580000000000001e-12 1.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.890000000000000e+02 5.881857686137594e-01 -6.949395783021320e-01 -3.180638868156816e-01 -2.644463045935742e-01 2.690000000000000e-11 2.390000000000000e-11 -1.340000000000000e-11 1.310000000000000e-11 2.460000000000000e-11 -1.730000000000000e-11 9.300000000000000e-12 2.090000000000000e-11 -9.580000000000001e-12 1.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.900000000000000e+02 5.881684600587601e-01 -6.949422408155229e-01 -3.180591038913979e-01 -2.644835551678165e-01 2.690000000000000e-11 2.390000000000000e-11 -1.340000000000000e-11 1.300000000000000e-11 2.460000000000000e-11 -1.730000000000000e-11 9.300000000000000e-12 2.090000000000000e-11 -9.589999999999999e-12 1.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.910000000000000e+02 5.881511499267612e-01 -6.949449018272047e-01 -3.180543211557624e-01 -2.645208064753180e-01 2.690000000000000e-11 2.390000000000000e-11 -1.340000000000000e-11 1.300000000000000e-11 2.460000000000000e-11 -1.730000000000000e-11 9.289999999999999e-12 2.090000000000000e-11 -9.580000000000001e-12 1.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.920000000000000e+02 5.881338417987459e-01 -6.949475589818361e-01 -3.180495366554452e-01 -2.645580590900449e-01 2.690000000000000e-11 2.390000000000000e-11 -1.340000000000000e-11 1.300000000000000e-11 2.460000000000000e-11 -1.730000000000000e-11 9.289999999999999e-12 2.090000000000000e-11 -9.580000000000001e-12 1.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.930000000000000e+02 5.881165287841086e-01 -6.949502172267124e-01 -3.180447542326138e-01 -2.645953107154252e-01 2.690000000000000e-11 2.390000000000000e-11 -1.340000000000000e-11 1.300000000000000e-11 2.460000000000000e-11 -1.730000000000000e-11 9.289999999999999e-12 2.090000000000000e-11 -9.580000000000001e-12 1.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.940000000000000e+02 5.880992143226798e-01 -6.949528741937295e-01 -3.180399721057058e-01 -2.646325620665817e-01 2.690000000000000e-11 2.390000000000000e-11 -1.340000000000000e-11 1.300000000000000e-11 2.460000000000000e-11 -1.730000000000000e-11 9.289999999999999e-12 2.090000000000000e-11 -9.580000000000001e-12 1.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.950000000000000e+02 5.880818982501613e-01 -6.949555299857788e-01 -3.180351904586206e-01 -2.646698130173166e-01 2.690000000000000e-11 2.390000000000000e-11 -1.340000000000000e-11 1.300000000000000e-11 2.460000000000000e-11 -1.730000000000000e-11 9.289999999999999e-12 2.090000000000000e-11 -9.580000000000001e-12 1.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.960000000000000e+02 5.880645802873361e-01 -6.949581847345780e-01 -3.180304095059376e-01 -2.647070635842289e-01 2.690000000000000e-11 2.390000000000000e-11 -1.340000000000000e-11 1.300000000000000e-11 2.460000000000000e-11 -1.730000000000000e-11 9.279999999999999e-12 2.090000000000000e-11 -9.580000000000001e-12 1.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.970000000000000e+02 5.880472600983636e-01 -6.949608385762234e-01 -3.180256294534483e-01 -2.647443139086806e-01 2.690000000000000e-11 2.390000000000000e-11 -1.340000000000000e-11 1.300000000000000e-11 2.460000000000000e-11 -1.730000000000000e-11 9.279999999999999e-12 2.090000000000000e-11 -9.580000000000001e-12 1.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.980000000000000e+02 5.880299373846022e-01 -6.949634916059197e-01 -3.180208504577000e-01 -2.647815642157340e-01 2.690000000000000e-11 2.390000000000000e-11 -1.340000000000000e-11 1.300000000000000e-11 2.460000000000000e-11 -1.730000000000000e-11 9.279999999999999e-12 2.090000000000000e-11 -9.580000000000001e-12 1.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.990000000000000e+02 5.880126119861054e-01 -6.949661438269985e-01 -3.180160725952168e-01 -2.648188147594945e-01 2.690000000000000e-11 2.390000000000000e-11 -1.340000000000000e-11 1.300000000000000e-11 2.460000000000000e-11 -1.730000000000000e-11 9.279999999999999e-12 2.090000000000000e-11 -9.580000000000001e-12 1.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.000000000000000e+02 5.879952839589644e-01 -6.949687951124411e-01 -3.180112958472531e-01 -2.648560657706930e-01 2.700000000000000e-11 2.400000000000000e-11 -1.340000000000000e-11 1.300000000000000e-11 2.470000000000000e-11 -1.720000000000000e-11 9.230000000000000e-12 2.090000000000000e-11 -9.599999999999999e-12 1.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.010000000000000e+02 5.879779536009161e-01 -6.949714451954034e-01 -3.180065201049506e-01 -2.648933174185998e-01 2.700000000000000e-11 2.400000000000000e-11 -1.340000000000000e-11 1.300000000000000e-11 2.470000000000000e-11 -1.720000000000000e-11 9.230000000000000e-12 2.090000000000000e-11 -9.599999999999999e-12 1.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.020000000000000e+02 5.879606630646701e-01 -6.949740644452396e-01 -3.180017224091932e-01 -2.649305814393725e-01 2.710000000000000e-11 2.410000000000000e-11 -1.350000000000000e-11 1.310000000000000e-11 2.480000000000000e-11 -1.730000000000000e-11 9.279999999999999e-12 2.080000000000000e-11 -9.500000000000000e-12 1.600000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.030000000000000e+02 5.879433296573264e-01 -6.949767109250355e-01 -3.179969481413305e-01 -2.649678345687942e-01 2.710000000000000e-11 2.410000000000000e-11 -1.350000000000000e-11 1.300000000000000e-11 2.480000000000000e-11 -1.730000000000000e-11 9.279999999999999e-12 2.080000000000000e-11 -9.500000000000000e-12 1.600000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.040000000000000e+02 5.879259956292240e-01 -6.949793549627717e-01 -3.179921743423720e-01 -2.650050884340261e-01 2.710000000000000e-11 2.410000000000000e-11 -1.350000000000000e-11 1.300000000000000e-11 2.480000000000000e-11 -1.730000000000000e-11 9.279999999999999e-12 2.080000000000000e-11 -9.500000000000000e-12 1.600000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.050000000000000e+02 5.879086614556825e-01 -6.949819962238477e-01 -3.179874008931027e-01 -2.650423430007982e-01 2.710000000000000e-11 2.410000000000000e-11 -1.350000000000000e-11 1.300000000000000e-11 2.480000000000000e-11 -1.730000000000000e-11 9.279999999999999e-12 2.080000000000000e-11 -9.510000000000000e-12 1.600000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.060000000000000e+02 5.878913274104115e-01 -6.949846345121425e-01 -3.179826277380722e-01 -2.650795982425631e-01 2.710000000000000e-11 2.410000000000000e-11 -1.350000000000000e-11 1.300000000000000e-11 2.480000000000000e-11 -1.730000000000000e-11 9.279999999999999e-12 2.080000000000000e-11 -9.510000000000000e-12 1.600000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.070000000000000e+02 5.878739935411265e-01 -6.949872697925172e-01 -3.179778548759694e-01 -2.651168541470488e-01 2.710000000000000e-11 2.410000000000000e-11 -1.350000000000000e-11 1.300000000000000e-11 2.480000000000000e-11 -1.730000000000000e-11 9.279999999999999e-12 2.080000000000000e-11 -9.500000000000000e-12 1.600000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.080000000000000e+02 5.878566596984033e-01 -6.949899021825474e-01 -3.179730823375851e-01 -2.651541107002954e-01 2.710000000000000e-11 2.410000000000000e-11 -1.350000000000000e-11 1.300000000000000e-11 2.480000000000000e-11 -1.730000000000000e-11 9.270000000000001e-12 2.080000000000000e-11 -9.500000000000000e-12 1.600000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.090000000000000e+02 5.878393255999493e-01 -6.949925319204806e-01 -3.179683101606842e-01 -2.651913678582231e-01 2.710000000000000e-11 2.410000000000000e-11 -1.350000000000000e-11 1.300000000000000e-11 2.480000000000000e-11 -1.730000000000000e-11 9.270000000000001e-12 2.080000000000000e-11 -9.500000000000000e-12 1.600000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.100000000000000e+02 5.878219909051503e-01 -6.949951593210907e-01 -3.179635383692510e-01 -2.652286255219506e-01 2.710000000000000e-11 2.410000000000000e-11 -1.350000000000000e-11 1.300000000000000e-11 2.480000000000000e-11 -1.730000000000000e-11 9.270000000000001e-12 2.090000000000000e-11 -9.500000000000000e-12 1.600000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.110000000000000e+02 5.878046552766588e-01 -6.949977847298375e-01 -3.179587669634912e-01 -2.652658835334145e-01 2.710000000000000e-11 2.410000000000000e-11 -1.350000000000000e-11 1.300000000000000e-11 2.480000000000000e-11 -1.730000000000000e-11 9.270000000000001e-12 2.090000000000000e-11 -9.500000000000000e-12 1.600000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.120000000000000e+02 5.877873133458417e-01 -6.950004120450206e-01 -3.179539986944827e-01 -2.653031402775282e-01 2.710000000000000e-11 2.410000000000000e-11 -1.350000000000000e-11 1.300000000000000e-11 2.480000000000000e-11 -1.730000000000000e-11 9.260000000000001e-12 2.090000000000000e-11 -9.500000000000000e-12 1.600000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.130000000000000e+02 5.877699750189249e-01 -6.950030344315845e-01 -3.179492279759940e-01 -2.653403984066725e-01 2.710000000000000e-11 2.410000000000000e-11 -1.350000000000000e-11 1.300000000000000e-11 2.480000000000000e-11 -1.730000000000000e-11 9.260000000000001e-12 2.090000000000000e-11 -9.500000000000000e-12 1.600000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.140000000000000e+02 5.877526350348073e-01 -6.950056556751673e-01 -3.179444575452863e-01 -2.653776563793666e-01 2.710000000000000e-11 2.420000000000000e-11 -1.350000000000000e-11 1.300000000000000e-11 2.480000000000000e-11 -1.730000000000000e-11 9.260000000000001e-12 2.090000000000000e-11 -9.500000000000000e-12 1.600000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.150000000000000e+02 5.877352932437616e-01 -6.950082759181794e-01 -3.179396873824579e-01 -2.654149141778855e-01 2.710000000000000e-11 2.420000000000000e-11 -1.350000000000000e-11 1.300000000000000e-11 2.480000000000000e-11 -1.730000000000000e-11 9.260000000000001e-12 2.090000000000000e-11 -9.500000000000000e-12 1.600000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.160000000000000e+02 5.877179495207198e-01 -6.950108952189600e-01 -3.179349175025726e-01 -2.654521719081102e-01 2.710000000000000e-11 2.420000000000000e-11 -1.350000000000000e-11 1.300000000000000e-11 2.480000000000000e-11 -1.730000000000000e-11 9.250000000000000e-12 2.090000000000000e-11 -9.489999999999999e-12 1.600000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.170000000000000e+02 5.877006037618500e-01 -6.950135135542833e-01 -3.179301479687496e-01 -2.654894297847961e-01 2.720000000000000e-11 2.420000000000000e-11 -1.350000000000000e-11 1.310000000000000e-11 2.480000000000000e-11 -1.740000000000000e-11 9.300000000000000e-12 2.100000000000000e-11 -9.599999999999999e-12 1.600000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.180000000000000e+02 5.876832558939851e-01 -6.950161308252751e-01 -3.179253788958586e-01 -2.655266880907334e-01 2.720000000000000e-11 2.420000000000000e-11 -1.350000000000000e-11 1.310000000000000e-11 2.480000000000000e-11 -1.740000000000000e-11 9.300000000000000e-12 2.100000000000000e-11 -9.599999999999999e-12 1.600000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.190000000000000e+02 5.876659058921084e-01 -6.950187468682493e-01 -3.179206104400271e-01 -2.655639471222265e-01 2.720000000000000e-11 2.420000000000000e-11 -1.350000000000000e-11 1.310000000000000e-11 2.480000000000000e-11 -1.740000000000000e-11 9.289999999999999e-12 2.100000000000000e-11 -9.589999999999999e-12 1.600000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.200000000000000e+02 5.876485537965235e-01 -6.950213614720170e-01 -3.179158427739692e-01 -2.656012071353507e-01 2.730000000000000e-11 2.430000000000000e-11 -1.350000000000000e-11 1.300000000000000e-11 2.490000000000000e-11 -1.730000000000000e-11 9.250000000000000e-12 2.100000000000000e-11 -9.620000000000000e-12 1.600000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.210000000000000e+02 5.876311997230000e-01 -6.950239744037523e-01 -3.179110760464117e-01 -2.656384683044471e-01 2.730000000000000e-11 2.430000000000000e-11 -1.350000000000000e-11 1.300000000000000e-11 2.490000000000000e-11 -1.730000000000000e-11 9.250000000000000e-12 2.100000000000000e-11 -9.620000000000000e-12 1.600000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.220000000000000e+02 5.876138909449281e-01 -6.950265523658973e-01 -3.179062845990487e-01 -2.656757438822100e-01 2.740000000000000e-11 2.440000000000000e-11 -1.360000000000000e-11 1.310000000000000e-11 2.500000000000000e-11 -1.740000000000000e-11 9.310000000000000e-12 2.090000000000000e-11 -9.530000000000000e-12 1.600000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.230000000000000e+02 5.875965335457058e-01 -6.950291613366745e-01 -3.179015198603029e-01 -2.657130074482968e-01 2.740000000000000e-11 2.440000000000000e-11 -1.360000000000000e-11 1.310000000000000e-11 2.500000000000000e-11 -1.740000000000000e-11 9.300000000000000e-12 2.090000000000000e-11 -9.530000000000000e-12 1.590000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.240000000000000e+02 5.875791748999094e-01 -6.950317681418330e-01 -3.178967559025686e-01 -2.657502720303440e-01 2.740000000000000e-11 2.440000000000000e-11 -1.360000000000000e-11 1.310000000000000e-11 2.500000000000000e-11 -1.740000000000000e-11 9.300000000000000e-12 2.090000000000000e-11 -9.530000000000000e-12 1.590000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.250000000000000e+02 5.875618153192986e-01 -6.950343727746088e-01 -3.178919923767287e-01 -2.657875373738401e-01 2.740000000000000e-11 2.440000000000000e-11 -1.360000000000000e-11 1.310000000000000e-11 2.500000000000000e-11 -1.740000000000000e-11 9.300000000000000e-12 2.090000000000000e-11 -9.520000000000000e-12 1.590000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.260000000000000e+02 5.875444551155058e-01 -6.950369753099488e-01 -3.178872288058295e-01 -2.658248031639850e-01 2.740000000000000e-11 2.440000000000000e-11 -1.360000000000000e-11 1.310000000000000e-11 2.500000000000000e-11 -1.740000000000000e-11 9.300000000000000e-12 2.090000000000000e-11 -9.520000000000000e-12 1.590000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.270000000000000e+02 5.875270945793766e-01 -6.950395758752691e-01 -3.178824646493578e-01 -2.658620690709610e-01 2.740000000000000e-11 2.440000000000000e-11 -1.360000000000000e-11 1.310000000000000e-11 2.500000000000000e-11 -1.740000000000000e-11 9.289999999999999e-12 2.090000000000000e-11 -9.520000000000000e-12 1.590000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.280000000000000e+02 5.875097339587407e-01 -6.950421746086340e-01 -3.178776993923615e-01 -2.658993348018197e-01 2.740000000000000e-11 2.440000000000000e-11 -1.360000000000000e-11 1.310000000000000e-11 2.500000000000000e-11 -1.740000000000000e-11 9.289999999999999e-12 2.090000000000000e-11 -9.520000000000000e-12 1.590000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.290000000000000e+02 5.874923734325125e-01 -6.950447716185011e-01 -3.178729326395213e-01 -2.659366001504294e-01 2.740000000000000e-11 2.440000000000000e-11 -1.360000000000000e-11 1.310000000000000e-11 2.500000000000000e-11 -1.740000000000000e-11 9.289999999999999e-12 2.090000000000000e-11 -9.520000000000000e-12 1.590000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.300000000000000e+02 5.874750130821288e-01 -6.950473669583371e-01 -3.178681641905603e-01 -2.659738650366955e-01 2.740000000000000e-11 2.440000000000000e-11 -1.360000000000000e-11 1.300000000000000e-11 2.500000000000000e-11 -1.740000000000000e-11 9.289999999999999e-12 2.090000000000000e-11 -9.520000000000000e-12 1.590000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.310000000000000e+02 5.874576528653014e-01 -6.950499606227531e-01 -3.178633940772710e-01 -2.660111295302847e-01 2.740000000000000e-11 2.440000000000000e-11 -1.360000000000000e-11 1.300000000000000e-11 2.500000000000000e-11 -1.740000000000000e-11 9.279999999999999e-12 2.090000000000000e-11 -9.520000000000000e-12 1.590000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.320000000000000e+02 5.874402923852159e-01 -6.950525527169167e-01 -3.178586226697234e-01 -2.660483937906339e-01 2.740000000000000e-11 2.440000000000000e-11 -1.360000000000000e-11 1.300000000000000e-11 2.500000000000000e-11 -1.740000000000000e-11 9.279999999999999e-12 2.090000000000000e-11 -9.520000000000000e-12 1.590000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.330000000000000e+02 5.874229317398661e-01 -6.950551428900594e-01 -3.178538501591616e-01 -2.660856582892380e-01 2.740000000000000e-11 2.440000000000000e-11 -1.360000000000000e-11 1.300000000000000e-11 2.500000000000000e-11 -1.740000000000000e-11 9.279999999999999e-12 2.090000000000000e-11 -9.520000000000000e-12 1.590000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.340000000000000e+02 5.874055702623016e-01 -6.950577312677021e-01 -3.178490771766248e-01 -2.661229234165732e-01 2.740000000000000e-11 2.440000000000000e-11 -1.360000000000000e-11 1.300000000000000e-11 2.500000000000000e-11 -1.740000000000000e-11 9.279999999999999e-12 2.090000000000000e-11 -9.520000000000000e-12 1.590000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.350000000000000e+02 5.873882074174798e-01 -6.950603178788433e-01 -3.178443042339090e-01 -2.661601896661175e-01 2.740000000000000e-11 2.440000000000000e-11 -1.360000000000000e-11 1.300000000000000e-11 2.500000000000000e-11 -1.740000000000000e-11 9.270000000000001e-12 2.090000000000000e-11 -9.510000000000000e-12 1.590000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.360000000000000e+02 5.873708426559063e-01 -6.950629028087122e-01 -3.178395317557940e-01 -2.661974575199300e-01 2.740000000000000e-11 2.440000000000000e-11 -1.360000000000000e-11 1.300000000000000e-11 2.500000000000000e-11 -1.740000000000000e-11 9.270000000000001e-12 2.090000000000000e-11 -9.510000000000000e-12 1.590000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.370000000000000e+02 5.873534755000190e-01 -6.950654861779432e-01 -3.178347600131700e-01 -2.662347273922744e-01 2.740000000000000e-11 2.440000000000000e-11 -1.360000000000000e-11 1.300000000000000e-11 2.500000000000000e-11 -1.740000000000000e-11 9.270000000000001e-12 2.090000000000000e-11 -9.510000000000000e-12 1.590000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.380000000000000e+02 5.873361056340924e-01 -6.950680681042352e-01 -3.178299890832726e-01 -2.662719995789108e-01 2.740000000000000e-11 2.440000000000000e-11 -1.360000000000000e-11 1.300000000000000e-11 2.500000000000000e-11 -1.740000000000000e-11 9.270000000000001e-12 2.090000000000000e-11 -9.510000000000000e-12 1.590000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.390000000000000e+02 5.873187329748918e-01 -6.950706486603880e-01 -3.178252188403056e-01 -2.663092742221100e-01 2.740000000000000e-11 2.440000000000000e-11 -1.360000000000000e-11 1.300000000000000e-11 2.500000000000000e-11 -1.740000000000000e-11 9.270000000000001e-12 2.090000000000000e-11 -9.510000000000000e-12 1.590000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.400000000000000e+02 5.873013576991700e-01 -6.950732278427990e-01 -3.178204489787553e-01 -2.663465513045863e-01 2.740000000000000e-11 2.440000000000000e-11 -1.360000000000000e-11 1.300000000000000e-11 2.500000000000000e-11 -1.740000000000000e-11 9.260000000000001e-12 2.090000000000000e-11 -9.510000000000000e-12 1.590000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.410000000000000e+02 5.872839802125299e-01 -6.950758055608205e-01 -3.178156790679983e-01 -2.663838306809415e-01 2.740000000000000e-11 2.440000000000000e-11 -1.360000000000000e-11 1.300000000000000e-11 2.500000000000000e-11 -1.740000000000000e-11 9.260000000000001e-12 2.090000000000000e-11 -9.510000000000000e-12 1.590000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.420000000000000e+02 5.872666241226706e-01 -6.950783654441578e-01 -3.178108960359582e-01 -2.664211186146118e-01 2.750000000000000e-11 2.450000000000000e-11 -1.360000000000000e-11 1.300000000000000e-11 2.510000000000000e-11 -1.740000000000000e-11 9.210000000000000e-12 2.100000000000000e-11 -9.530000000000000e-12 1.590000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.430000000000000e+02 5.872492438565683e-01 -6.950809397077689e-01 -3.178061246341826e-01 -2.664584019877330e-01 2.750000000000000e-11 2.450000000000000e-11 -1.360000000000000e-11 1.300000000000000e-11 2.510000000000000e-11 -1.740000000000000e-11 9.210000000000000e-12 2.100000000000000e-11 -9.530000000000000e-12 1.590000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.440000000000000e+02 5.872318629032612e-01 -6.950835119546510e-01 -3.178013519515749e-01 -2.664956872028239e-01 2.750000000000000e-11 2.450000000000000e-11 -1.360000000000000e-11 1.300000000000000e-11 2.510000000000000e-11 -1.740000000000000e-11 9.210000000000000e-12 2.100000000000000e-11 -9.530000000000000e-12 1.590000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.450000000000000e+02 5.872144814627993e-01 -6.950860820435831e-01 -3.177965778451486e-01 -2.665329743570003e-01 2.760000000000000e-11 2.460000000000000e-11 -1.370000000000000e-11 1.300000000000000e-11 2.520000000000000e-11 -1.750000000000000e-11 9.260000000000001e-12 2.090000000000000e-11 -9.430000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.460000000000000e+02 5.871970994729333e-01 -6.950886499034225e-01 -3.177918023609356e-01 -2.665702637170916e-01 2.760000000000000e-11 2.460000000000000e-11 -1.370000000000000e-11 1.300000000000000e-11 2.520000000000000e-11 -1.750000000000000e-11 9.260000000000001e-12 2.090000000000000e-11 -9.430000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.470000000000000e+02 5.871797166448167e-01 -6.950912155338735e-01 -3.177870257092981e-01 -2.666075556682385e-01 2.760000000000000e-11 2.460000000000000e-11 -1.370000000000000e-11 1.300000000000000e-11 2.520000000000000e-11 -1.750000000000000e-11 9.260000000000001e-12 2.090000000000000e-11 -9.430000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.480000000000000e+02 5.871623325560366e-01 -6.950937789908480e-01 -3.177822482091274e-01 -2.666448506135625e-01 2.760000000000000e-11 2.460000000000000e-11 -1.370000000000000e-11 1.300000000000000e-11 2.520000000000000e-11 -1.750000000000000e-11 9.260000000000001e-12 2.090000000000000e-11 -9.430000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.490000000000000e+02 5.871449467691510e-01 -6.950963403633866e-01 -3.177774702172825e-01 -2.666821488573654e-01 2.760000000000000e-11 2.460000000000000e-11 -1.370000000000000e-11 1.300000000000000e-11 2.520000000000000e-11 -1.750000000000000e-11 9.260000000000001e-12 2.090000000000000e-11 -9.430000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.500000000000000e+02 5.871275589390302e-01 -6.950988997498267e-01 -3.177726920638705e-01 -2.667194505081261e-01 2.760000000000000e-11 2.460000000000000e-11 -1.370000000000000e-11 1.300000000000000e-11 2.520000000000000e-11 -1.750000000000000e-11 9.250000000000000e-12 2.090000000000000e-11 -9.420000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.510000000000000e+02 5.871101688762794e-01 -6.951014572403337e-01 -3.177679140084063e-01 -2.667567554368162e-01 2.760000000000000e-11 2.460000000000000e-11 -1.370000000000000e-11 1.300000000000000e-11 2.520000000000000e-11 -1.750000000000000e-11 9.250000000000000e-12 2.090000000000000e-11 -9.420000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.520000000000000e+02 5.870927755166525e-01 -6.951040136367778e-01 -3.177631367901908e-01 -2.667940630138804e-01 2.760000000000000e-11 2.460000000000000e-11 -1.370000000000000e-11 1.300000000000000e-11 2.520000000000000e-11 -1.750000000000000e-11 9.250000000000000e-12 2.090000000000000e-11 -9.420000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.530000000000000e+02 5.870753810108268e-01 -6.951065675440066e-01 -3.177583593854063e-01 -2.668313733594254e-01 2.760000000000000e-11 2.460000000000000e-11 -1.370000000000000e-11 1.300000000000000e-11 2.520000000000000e-11 -1.750000000000000e-11 9.250000000000000e-12 2.090000000000000e-11 -9.420000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.540000000000000e+02 5.870579844437934e-01 -6.951091197362769e-01 -3.177535824241380e-01 -2.668686857180433e-01 2.760000000000000e-11 2.460000000000000e-11 -1.370000000000000e-11 1.300000000000000e-11 2.520000000000000e-11 -1.750000000000000e-11 9.250000000000000e-12 2.090000000000000e-11 -9.420000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.550000000000000e+02 5.870405858992074e-01 -6.951116702603918e-01 -3.177488059578897e-01 -2.669059997213608e-01 2.760000000000000e-11 2.460000000000000e-11 -1.370000000000000e-11 1.300000000000000e-11 2.520000000000000e-11 -1.750000000000000e-11 9.240000000000000e-12 2.090000000000000e-11 -9.420000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.560000000000000e+02 5.870231853796027e-01 -6.951142191652044e-01 -3.177440300410564e-01 -2.669433151708449e-01 2.760000000000000e-11 2.460000000000000e-11 -1.370000000000000e-11 1.300000000000000e-11 2.520000000000000e-11 -1.750000000000000e-11 9.240000000000000e-12 2.090000000000000e-11 -9.420000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.570000000000000e+02 5.870057828089180e-01 -6.951167664950982e-01 -3.177392547269935e-01 -2.669806320537564e-01 2.760000000000000e-11 2.460000000000000e-11 -1.370000000000000e-11 1.300000000000000e-11 2.520000000000000e-11 -1.750000000000000e-11 9.240000000000000e-12 2.090000000000000e-11 -9.420000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.580000000000000e+02 5.869883780860840e-01 -6.951193122682291e-01 -3.177344800454723e-01 -2.670179505086620e-01 2.760000000000000e-11 2.460000000000000e-11 -1.370000000000000e-11 1.300000000000000e-11 2.520000000000000e-11 -1.750000000000000e-11 9.230000000000000e-12 2.090000000000000e-11 -9.420000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.590000000000000e+02 5.869709711684574e-01 -6.951218564469129e-01 -3.177297059714993e-01 -2.670552707561114e-01 2.760000000000000e-11 2.460000000000000e-11 -1.370000000000000e-11 1.300000000000000e-11 2.520000000000000e-11 -1.750000000000000e-11 9.230000000000000e-12 2.090000000000000e-11 -9.410000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.600000000000000e+02 5.869535621526131e-01 -6.951243989117891e-01 -3.177249323983031e-01 -2.670925930204285e-01 2.770000000000000e-11 2.470000000000000e-11 -1.370000000000000e-11 1.300000000000000e-11 2.530000000000000e-11 -1.750000000000000e-11 9.179999999999999e-12 2.090000000000000e-11 -9.430000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.610000000000000e+02 5.869361513198960e-01 -6.951269394511921e-01 -3.177201591288774e-01 -2.671299174673777e-01 2.770000000000000e-11 2.470000000000000e-11 -1.370000000000000e-11 1.300000000000000e-11 2.530000000000000e-11 -1.750000000000000e-11 9.179999999999999e-12 2.090000000000000e-11 -9.430000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.620000000000000e+02 5.869187867807525e-01 -6.951294442753391e-01 -3.177153598952387e-01 -2.671672575595799e-01 2.770000000000000e-11 2.470000000000000e-11 -1.370000000000000e-11 1.300000000000000e-11 2.530000000000000e-11 -1.750000000000000e-11 9.170000000000001e-12 2.090000000000000e-11 -9.420000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.630000000000000e+02 5.869013737950214e-01 -6.951319800561934e-01 -3.177105863872959e-01 -2.672045864840520e-01 2.770000000000000e-11 2.470000000000000e-11 -1.370000000000000e-11 1.300000000000000e-11 2.530000000000000e-11 -1.750000000000000e-11 9.170000000000001e-12 2.090000000000000e-11 -9.420000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.640000000000000e+02 5.868839605901154e-01 -6.951345129873079e-01 -3.177058123139796e-01 -2.672419175164567e-01 2.770000000000000e-11 2.470000000000000e-11 -1.370000000000000e-11 1.300000000000000e-11 2.530000000000000e-11 -1.750000000000000e-11 9.170000000000001e-12 2.090000000000000e-11 -9.420000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.650000000000000e+02 5.868665476336227e-01 -6.951370428450682e-01 -3.177010374464457e-01 -2.672792504828218e-01 2.780000000000000e-11 2.480000000000000e-11 -1.380000000000000e-11 1.300000000000000e-11 2.540000000000000e-11 -1.760000000000000e-11 9.220000000000000e-12 2.080000000000000e-11 -9.320000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.660000000000000e+02 5.868491351901779e-01 -6.951395695398537e-01 -3.176962616576819e-01 -2.673165851854707e-01 2.780000000000000e-11 2.480000000000000e-11 -1.380000000000000e-11 1.300000000000000e-11 2.540000000000000e-11 -1.760000000000000e-11 9.220000000000000e-12 2.080000000000000e-11 -9.320000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.670000000000000e+02 5.868317232596179e-01 -6.951420931443648e-01 -3.176914849465883e-01 -2.673539214364552e-01 2.780000000000000e-11 2.480000000000000e-11 -1.380000000000000e-11 1.300000000000000e-11 2.540000000000000e-11 -1.760000000000000e-11 9.220000000000000e-12 2.080000000000000e-11 -9.320000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.680000000000000e+02 5.868143115573040e-01 -6.951446138978723e-01 -3.176867074449010e-01 -2.673912590813756e-01 2.780000000000000e-11 2.480000000000000e-11 -1.380000000000000e-11 1.300000000000000e-11 2.540000000000000e-11 -1.760000000000000e-11 9.220000000000000e-12 2.080000000000000e-11 -9.320000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.690000000000000e+02 5.867968995364318e-01 -6.951471321863054e-01 -3.176819294074077e-01 -2.674285980136997e-01 2.780000000000000e-11 2.480000000000000e-11 -1.380000000000000e-11 1.300000000000000e-11 2.540000000000000e-11 -1.760000000000000e-11 9.220000000000000e-12 2.080000000000000e-11 -9.320000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.700000000000000e+02 5.867794864474135e-01 -6.951496485019975e-01 -3.176771511864957e-01 -2.674659381792224e-01 2.780000000000000e-11 2.480000000000000e-11 -1.380000000000000e-11 1.300000000000000e-11 2.540000000000000e-11 -1.760000000000000e-11 9.210000000000000e-12 2.080000000000000e-11 -9.320000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.710000000000000e+02 5.867620714272890e-01 -6.951521633890155e-01 -3.176723731921683e-01 -2.675032795693996e-01 2.780000000000000e-11 2.480000000000000e-11 -1.380000000000000e-11 1.300000000000000e-11 2.540000000000000e-11 -1.760000000000000e-11 9.210000000000000e-12 2.080000000000000e-11 -9.320000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.720000000000000e+02 5.867446611246515e-01 -6.951546720955358e-01 -3.176675917420238e-01 -2.675406243214082e-01 2.790000000000000e-11 2.480000000000000e-11 -1.380000000000000e-11 1.310000000000000e-11 2.540000000000000e-11 -1.760000000000000e-11 9.250000000000000e-12 2.100000000000000e-11 -9.420000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.730000000000000e+02 5.867272397386643e-01 -6.951571856551073e-01 -3.176628154028994e-01 -2.675779682466817e-01 2.790000000000000e-11 2.480000000000000e-11 -1.380000000000000e-11 1.310000000000000e-11 2.540000000000000e-11 -1.760000000000000e-11 9.250000000000000e-12 2.100000000000000e-11 -9.420000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.740000000000000e+02 5.867098142196144e-01 -6.951596991195140e-01 -3.176580403438659e-01 -2.676153135068081e-01 2.790000000000000e-11 2.480000000000000e-11 -1.380000000000000e-11 1.310000000000000e-11 2.540000000000000e-11 -1.760000000000000e-11 9.250000000000000e-12 2.100000000000000e-11 -9.420000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.750000000000000e+02 5.866923842595693e-01 -6.951622126737922e-01 -3.176532666925566e-01 -2.676526601434159e-01 2.790000000000000e-11 2.480000000000000e-11 -1.380000000000000e-11 1.310000000000000e-11 2.540000000000000e-11 -1.760000000000000e-11 9.250000000000000e-12 2.100000000000000e-11 -9.420000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.760000000000000e+02 5.866749498169868e-01 -6.951647263488984e-01 -3.176484944237309e-01 -2.676900081957384e-01 2.790000000000000e-11 2.480000000000000e-11 -1.380000000000000e-11 1.310000000000000e-11 2.540000000000000e-11 -1.760000000000000e-11 9.240000000000000e-12 2.100000000000000e-11 -9.410000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.770000000000000e+02 5.866575110726610e-01 -6.951672400495676e-01 -3.176437233734483e-01 -2.677273577080792e-01 2.800000000000000e-11 2.490000000000000e-11 -1.380000000000000e-11 1.300000000000000e-11 2.550000000000000e-11 -1.760000000000000e-11 9.200000000000000e-12 2.100000000000000e-11 -9.430000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.780000000000000e+02 5.866400683499513e-01 -6.951697536005664e-01 -3.176389532769495e-01 -2.677647087396250e-01 2.800000000000000e-11 2.490000000000000e-11 -1.380000000000000e-11 1.300000000000000e-11 2.550000000000000e-11 -1.760000000000000e-11 9.189999999999999e-12 2.100000000000000e-11 -9.430000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.790000000000000e+02 5.866226220227498e-01 -6.951722667971002e-01 -3.176341838238451e-01 -2.678020613697649e-01 2.800000000000000e-11 2.490000000000000e-11 -1.380000000000000e-11 1.300000000000000e-11 2.550000000000000e-11 -1.760000000000000e-11 9.189999999999999e-12 2.100000000000000e-11 -9.430000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.800000000000000e+02 5.866051724382451e-01 -6.951747794443727e-01 -3.176294147174676e-01 -2.678394156941872e-01 2.800000000000000e-11 2.490000000000000e-11 -1.380000000000000e-11 1.300000000000000e-11 2.550000000000000e-11 -1.760000000000000e-11 9.179999999999999e-12 2.100000000000000e-11 -9.420000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.810000000000000e+02 5.865877198697079e-01 -6.951772913785852e-01 -3.176246457286122e-01 -2.678767718100333e-01 2.800000000000000e-11 2.490000000000000e-11 -1.380000000000000e-11 1.300000000000000e-11 2.550000000000000e-11 -1.760000000000000e-11 9.179999999999999e-12 2.100000000000000e-11 -9.420000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.820000000000000e+02 5.865702915953132e-01 -6.951797834181532e-01 -3.176198619731151e-01 -2.679141374109590e-01 2.800000000000000e-11 2.490000000000000e-11 -1.380000000000000e-11 1.300000000000000e-11 2.550000000000000e-11 -1.760000000000000e-11 9.179999999999999e-12 2.100000000000000e-11 -9.420000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.830000000000000e+02 5.865528335774208e-01 -6.951822935359712e-01 -3.176150929898333e-01 -2.679514972554268e-01 2.800000000000000e-11 2.490000000000000e-11 -1.380000000000000e-11 1.300000000000000e-11 2.550000000000000e-11 -1.760000000000000e-11 9.179999999999999e-12 2.100000000000000e-11 -9.420000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.840000000000000e+02 5.865353730257773e-01 -6.951848025485315e-01 -3.176103241590456e-01 -2.679888588778601e-01 2.800000000000000e-11 2.490000000000000e-11 -1.380000000000000e-11 1.300000000000000e-11 2.550000000000000e-11 -1.760000000000000e-11 9.170000000000001e-12 2.100000000000000e-11 -9.420000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.850000000000000e+02 5.865179100956148e-01 -6.951873102950598e-01 -3.176055557290150e-01 -2.680262220601862e-01 2.800000000000000e-11 2.490000000000000e-11 -1.380000000000000e-11 1.300000000000000e-11 2.550000000000000e-11 -1.760000000000000e-11 9.170000000000001e-12 2.100000000000000e-11 -9.420000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.860000000000000e+02 5.865004449952715e-01 -6.951898165950547e-01 -3.176007880003015e-01 -2.680635864575237e-01 2.800000000000000e-11 2.490000000000000e-11 -1.380000000000000e-11 1.300000000000000e-11 2.550000000000000e-11 -1.760000000000000e-11 9.170000000000001e-12 2.100000000000000e-11 -9.410000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.870000000000000e+02 5.864829779762812e-01 -6.951923212771586e-01 -3.175960212573547e-01 -2.681009516261491e-01 2.800000000000000e-11 2.490000000000000e-11 -1.380000000000000e-11 1.300000000000000e-11 2.550000000000000e-11 -1.760000000000000e-11 9.170000000000001e-12 2.100000000000000e-11 -9.410000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.880000000000000e+02 5.864655092945393e-01 -6.951948242247349e-01 -3.175912556977663e-01 -2.681383170741410e-01 2.800000000000000e-11 2.490000000000000e-11 -1.380000000000000e-11 1.300000000000000e-11 2.550000000000000e-11 -1.760000000000000e-11 9.160000000000001e-12 2.100000000000000e-11 -9.410000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.890000000000000e+02 5.864480391551858e-01 -6.951973254242699e-01 -3.175864913744524e-01 -2.681756823249348e-01 2.800000000000000e-11 2.490000000000000e-11 -1.380000000000000e-11 1.300000000000000e-11 2.550000000000000e-11 -1.760000000000000e-11 9.160000000000001e-12 2.100000000000000e-11 -9.410000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.900000000000000e+02 5.864305676589907e-01 -6.951998249974500e-01 -3.175817281699456e-01 -2.682130469817971e-01 2.810000000000000e-11 2.500000000000000e-11 -1.390000000000000e-11 1.310000000000000e-11 2.560000000000000e-11 -1.770000000000000e-11 9.220000000000000e-12 2.090000000000000e-11 -9.320000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.910000000000000e+02 5.864130947655712e-01 -6.952023232012958e-01 -3.175769658166143e-01 -2.682504107838410e-01 2.810000000000000e-11 2.500000000000000e-11 -1.390000000000000e-11 1.310000000000000e-11 2.560000000000000e-11 -1.770000000000000e-11 9.220000000000000e-12 2.090000000000000e-11 -9.310000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.920000000000000e+02 5.863956260718777e-01 -6.952048163207856e-01 -3.175722008109748e-01 -2.682877752716800e-01 2.810000000000000e-11 2.500000000000000e-11 -1.390000000000000e-11 1.310000000000000e-11 2.560000000000000e-11 -1.770000000000000e-11 9.210000000000000e-12 2.090000000000000e-11 -9.300000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.930000000000000e+02 5.863781496913424e-01 -6.952073128761582e-01 -3.175674391203923e-01 -2.683251372842003e-01 2.810000000000000e-11 2.500000000000000e-11 -1.390000000000000e-11 1.310000000000000e-11 2.560000000000000e-11 -1.770000000000000e-11 9.210000000000000e-12 2.090000000000000e-11 -9.300000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.940000000000000e+02 5.863606710206287e-01 -6.952098091220050e-01 -3.175626773672606e-01 -2.683624987290895e-01 2.810000000000000e-11 2.500000000000000e-11 -1.390000000000000e-11 1.310000000000000e-11 2.560000000000000e-11 -1.770000000000000e-11 9.210000000000000e-12 2.090000000000000e-11 -9.300000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.950000000000000e+02 5.863431896565763e-01 -6.952123052507850e-01 -3.175579155113822e-01 -2.683998600359310e-01 2.820000000000000e-11 2.510000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.570000000000000e-11 -1.770000000000000e-11 9.160000000000001e-12 2.100000000000000e-11 -9.320000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.960000000000000e+02 5.863257052398329e-01 -6.952148012799562e-01 -3.175531537222354e-01 -2.684372217434572e-01 2.820000000000000e-11 2.510000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.570000000000000e-11 -1.770000000000000e-11 9.150000000000000e-12 2.100000000000000e-11 -9.320000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.970000000000000e+02 5.863082174973093e-01 -6.952172970512899e-01 -3.175483923494231e-01 -2.684745844435248e-01 2.820000000000000e-11 2.510000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.570000000000000e-11 -1.770000000000000e-11 9.150000000000000e-12 2.100000000000000e-11 -9.320000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.980000000000000e+02 5.862907262671981e-01 -6.952197922682785e-01 -3.175436318466187e-01 -2.685119487195913e-01 2.820000000000000e-11 2.510000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.570000000000000e-11 -1.770000000000000e-11 9.150000000000000e-12 2.100000000000000e-11 -9.320000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.990000000000000e+02 5.862732315044108e-01 -6.952222865592735e-01 -3.175388726717793e-01 -2.685493150894387e-01 2.820000000000000e-11 2.510000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.570000000000000e-11 -1.770000000000000e-11 9.150000000000000e-12 2.100000000000000e-11 -9.320000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.000000000000000e+02 5.862557332676986e-01 -6.952247795513603e-01 -3.175341151880539e-01 -2.685866839593044e-01 2.820000000000000e-11 2.510000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.570000000000000e-11 -1.770000000000000e-11 9.140000000000000e-12 2.100000000000000e-11 -9.310000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.010000000000000e+02 5.862382316920366e-01 -6.952272709379806e-01 -3.175293595896643e-01 -2.686240555968497e-01 2.820000000000000e-11 2.510000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.570000000000000e-11 -1.770000000000000e-11 9.140000000000000e-12 2.100000000000000e-11 -9.300000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.020000000000000e+02 5.862207532079811e-01 -6.952297420581097e-01 -3.175245915695942e-01 -2.686614375280610e-01 2.820000000000000e-11 2.510000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.570000000000000e-11 -1.770000000000000e-11 9.130000000000000e-12 2.100000000000000e-11 -9.300000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.030000000000000e+02 5.862032454728993e-01 -6.952322298044825e-01 -3.175198395199714e-01 -2.686988149384708e-01 2.820000000000000e-11 2.510000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.570000000000000e-11 -1.770000000000000e-11 9.130000000000000e-12 2.100000000000000e-11 -9.300000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.040000000000000e+02 5.861857348828309e-01 -6.952347157949949e-01 -3.175150887831609e-01 -2.687361951214418e-01 2.820000000000000e-11 2.510000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.570000000000000e-11 -1.770000000000000e-11 9.130000000000000e-12 2.100000000000000e-11 -9.300000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.050000000000000e+02 5.861682215291913e-01 -6.952372002316747e-01 -3.175103389006207e-01 -2.687735778951129e-01 2.820000000000000e-11 2.510000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.570000000000000e-11 -1.770000000000000e-11 9.120000000000000e-12 2.100000000000000e-11 -9.289999999999999e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.060000000000000e+02 5.861507054539878e-01 -6.952396833814493e-01 -3.175055893825497e-01 -2.688109630545123e-01 2.820000000000000e-11 2.510000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.570000000000000e-11 -1.770000000000000e-11 9.120000000000000e-12 2.100000000000000e-11 -9.289999999999999e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.070000000000000e+02 5.861331866585314e-01 -6.952421655172295e-01 -3.175008397761618e-01 -2.688483504242874e-01 2.820000000000000e-11 2.510000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.570000000000000e-11 -1.770000000000000e-11 9.110000000000000e-12 2.100000000000000e-11 -9.289999999999999e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.080000000000000e+02 5.861156651119892e-01 -6.952446468632852e-01 -3.174960897240426e-01 -2.688857399123634e-01 2.820000000000000e-11 2.510000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.570000000000000e-11 -1.770000000000000e-11 9.110000000000000e-12 2.100000000000000e-11 -9.289999999999999e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.090000000000000e+02 5.860981407548821e-01 -6.952471275577010e-01 -3.174913390033984e-01 -2.689231315529875e-01 2.820000000000000e-11 2.510000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.570000000000000e-11 -1.770000000000000e-11 9.110000000000000e-12 2.100000000000000e-11 -9.289999999999999e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.100000000000000e+02 5.860806134970684e-01 -6.952496076389161e-01 -3.174865875402547e-01 -2.689605255290772e-01 2.830000000000000e-11 2.520000000000000e-11 -1.380000000000000e-11 1.290000000000000e-11 2.580000000000000e-11 -1.770000000000000e-11 9.060000000000001e-12 2.100000000000000e-11 -9.300000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.110000000000000e+02 5.860630832111199e-01 -6.952520870576340e-01 -3.174818353984232e-01 -2.689979221687941e-01 2.830000000000000e-11 2.520000000000000e-11 -1.380000000000000e-11 1.290000000000000e-11 2.580000000000000e-11 -1.770000000000000e-11 9.060000000000001e-12 2.100000000000000e-11 -9.300000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.120000000000000e+02 5.860455526278586e-01 -6.952545636684537e-01 -3.174770811687704e-01 -2.690353227289192e-01 2.840000000000000e-11 2.520000000000000e-11 -1.380000000000000e-11 1.290000000000000e-11 2.580000000000000e-11 -1.770000000000000e-11 9.050000000000000e-12 2.100000000000000e-11 -9.289999999999999e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.130000000000000e+02 5.860280157419054e-01 -6.952570414292534e-01 -3.174723282366854e-01 -2.690727260660675e-01 2.840000000000000e-11 2.520000000000000e-11 -1.380000000000000e-11 1.290000000000000e-11 2.580000000000000e-11 -1.770000000000000e-11 9.050000000000000e-12 2.100000000000000e-11 -9.289999999999999e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.140000000000000e+02 5.860104752233183e-01 -6.952595181986952e-01 -3.174675752640515e-01 -2.691101334744250e-01 2.840000000000000e-11 2.520000000000000e-11 -1.380000000000000e-11 1.290000000000000e-11 2.580000000000000e-11 -1.770000000000000e-11 9.050000000000000e-12 2.100000000000000e-11 -9.289999999999999e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.150000000000000e+02 5.859929308441728e-01 -6.952619939189821e-01 -3.174628224650206e-01 -2.691475453445576e-01 2.840000000000000e-11 2.530000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.590000000000000e-11 -1.770000000000000e-11 9.100000000000000e-12 2.090000000000000e-11 -9.189999999999999e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.160000000000000e+02 5.859753824049120e-01 -6.952644685784900e-01 -3.174580700122047e-01 -2.691849619347510e-01 2.840000000000000e-11 2.530000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.590000000000000e-11 -1.770000000000000e-11 9.100000000000000e-12 2.090000000000000e-11 -9.189999999999999e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.170000000000000e+02 5.859578297601089e-01 -6.952669421941766e-01 -3.174533180428444e-01 -2.692223833531892e-01 2.840000000000000e-11 2.530000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.590000000000000e-11 -1.770000000000000e-11 9.100000000000000e-12 2.090000000000000e-11 -9.189999999999999e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.180000000000000e+02 5.859402728408525e-01 -6.952694147789898e-01 -3.174485666821319e-01 -2.692598095660187e-01 2.840000000000000e-11 2.530000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.590000000000000e-11 -1.770000000000000e-11 9.100000000000000e-12 2.090000000000000e-11 -9.189999999999999e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.190000000000000e+02 5.859227116709622e-01 -6.952718863063096e-01 -3.174438160709173e-01 -2.692972404213353e-01 2.840000000000000e-11 2.530000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.590000000000000e-11 -1.770000000000000e-11 9.089999999999999e-12 2.090000000000000e-11 -9.189999999999999e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.200000000000000e+02 5.859051463728423e-01 -6.952743566834101e-01 -3.174390663870568e-01 -2.693346756799100e-01 2.850000000000000e-11 2.530000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.590000000000000e-11 -1.780000000000000e-11 9.089999999999999e-12 2.100000000000000e-11 -9.179999999999999e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.210000000000000e+02 5.858875771598755e-01 -6.952768257452879e-01 -3.174343178483161e-01 -2.693721150443412e-01 2.850000000000000e-11 2.530000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.590000000000000e-11 -1.780000000000000e-11 9.079999999999999e-12 2.100000000000000e-11 -9.179999999999999e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.220000000000000e+02 5.858700442965538e-01 -6.952792651375006e-01 -3.174295489442543e-01 -2.694095694715736e-01 2.850000000000000e-11 2.530000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.590000000000000e-11 -1.780000000000000e-11 9.079999999999999e-12 2.100000000000000e-11 -9.179999999999999e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.230000000000000e+02 5.858524681343797e-01 -6.952817309011466e-01 -3.174248034073474e-01 -2.694470160119946e-01 2.850000000000000e-11 2.530000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.590000000000000e-11 -1.780000000000000e-11 9.079999999999999e-12 2.100000000000000e-11 -9.179999999999999e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.240000000000000e+02 5.858348889715289e-01 -6.952841947056411e-01 -3.174200596593129e-01 -2.694844655673552e-01 2.850000000000000e-11 2.530000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.590000000000000e-11 -1.780000000000000e-11 9.079999999999999e-12 2.100000000000000e-11 -9.170000000000001e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.250000000000000e+02 5.858173070961499e-01 -6.952866564410199e-01 -3.174153177738452e-01 -2.695219177065405e-01 2.860000000000000e-11 2.540000000000000e-11 -1.390000000000000e-11 1.290000000000000e-11 2.600000000000000e-11 -1.770000000000000e-11 9.020000000000000e-12 2.100000000000000e-11 -9.179999999999999e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.260000000000000e+02 5.857997227486680e-01 -6.952891161103021e-01 -3.174105776979354e-01 -2.695593719602450e-01 2.860000000000000e-11 2.540000000000000e-11 -1.390000000000000e-11 1.290000000000000e-11 2.600000000000000e-11 -1.770000000000000e-11 9.020000000000000e-12 2.100000000000000e-11 -9.179999999999999e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.270000000000000e+02 5.857821361107132e-01 -6.952915738363965e-01 -3.174058392506267e-01 -2.695968278286714e-01 2.860000000000000e-11 2.540000000000000e-11 -1.390000000000000e-11 1.290000000000000e-11 2.600000000000000e-11 -1.770000000000000e-11 9.020000000000000e-12 2.100000000000000e-11 -9.179999999999999e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.280000000000000e+02 5.857645473039378e-01 -6.952940298476485e-01 -3.174011021459068e-01 -2.696342847944115e-01 2.860000000000000e-11 2.540000000000000e-11 -1.390000000000000e-11 1.290000000000000e-11 2.600000000000000e-11 -1.770000000000000e-11 9.010000000000000e-12 2.100000000000000e-11 -9.179999999999999e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.290000000000000e+02 5.857469563968277e-01 -6.952964844501076e-01 -3.173963660281785e-01 -2.696717423373847e-01 2.860000000000000e-11 2.540000000000000e-11 -1.390000000000000e-11 1.290000000000000e-11 2.600000000000000e-11 -1.770000000000000e-11 9.010000000000000e-12 2.100000000000000e-11 -9.179999999999999e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.300000000000000e+02 5.857293634163256e-01 -6.952989379979103e-01 -3.173916305056663e-01 -2.697091999466067e-01 2.860000000000000e-11 2.540000000000000e-11 -1.390000000000000e-11 1.290000000000000e-11 2.600000000000000e-11 -1.770000000000000e-11 9.000000000000000e-12 2.100000000000000e-11 -9.170000000000001e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.310000000000000e+02 5.857117683600849e-01 -6.953013908703486e-01 -3.173868951737872e-01 -2.697466571251707e-01 2.860000000000000e-11 2.540000000000000e-11 -1.390000000000000e-11 1.290000000000000e-11 2.600000000000000e-11 -1.770000000000000e-11 9.000000000000000e-12 2.100000000000000e-11 -9.170000000000001e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.320000000000000e+02 5.856944368947047e-01 -6.953037624774738e-01 -3.173820601354442e-01 -2.697838623406612e-01 2.860000000000000e-11 2.540000000000000e-11 -1.390000000000000e-11 1.290000000000000e-11 2.600000000000000e-11 -1.770000000000000e-11 9.000000000000000e-12 2.100000000000000e-11 -9.170000000000001e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.330000000000000e+02 5.856768658658663e-01 -6.953062037147749e-01 -3.173773103153456e-01 -2.698213015354438e-01 2.860000000000000e-11 2.540000000000000e-11 -1.390000000000000e-11 1.290000000000000e-11 2.600000000000000e-11 -1.770000000000000e-11 9.000000000000000e-12 2.100000000000000e-11 -9.170000000000001e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.340000000000000e+02 5.856592842556815e-01 -6.953086494198389e-01 -3.173725653467898e-01 -2.698587400331517e-01 2.860000000000000e-11 2.540000000000000e-11 -1.390000000000000e-11 1.290000000000000e-11 2.600000000000000e-11 -1.770000000000000e-11 8.989999999999999e-12 2.100000000000000e-11 -9.160000000000001e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.350000000000000e+02 5.856417002716372e-01 -6.953110938098434e-01 -3.173678207701076e-01 -2.698961801647775e-01 2.860000000000000e-11 2.540000000000000e-11 -1.390000000000000e-11 1.290000000000000e-11 2.600000000000000e-11 -1.770000000000000e-11 8.989999999999999e-12 2.100000000000000e-11 -9.150000000000000e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.360000000000000e+02 5.856241139157427e-01 -6.953135368925616e-01 -3.173630765783489e-01 -2.699336219130233e-01 2.860000000000000e-11 2.540000000000000e-11 -1.390000000000000e-11 1.290000000000000e-11 2.600000000000000e-11 -1.770000000000000e-11 8.979999999999999e-12 2.100000000000000e-11 -9.150000000000000e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.370000000000000e+02 5.856065251053210e-01 -6.953159787152158e-01 -3.173583328227506e-01 -2.699710652742937e-01 2.860000000000000e-11 2.540000000000000e-11 -1.390000000000000e-11 1.290000000000000e-11 2.600000000000000e-11 -1.780000000000000e-11 9.030000000000000e-12 2.110000000000000e-11 -9.250000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.380000000000000e+02 5.855889339083709e-01 -6.953184192391336e-01 -3.173535894604843e-01 -2.700085102499489e-01 2.860000000000000e-11 2.540000000000000e-11 -1.390000000000000e-11 1.290000000000000e-11 2.600000000000000e-11 -1.780000000000000e-11 9.030000000000000e-12 2.110000000000000e-11 -9.250000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.390000000000000e+02 5.855713403546023e-01 -6.953208584395167e-01 -3.173488464773070e-01 -2.700459568550708e-01 2.860000000000000e-11 2.540000000000000e-11 -1.390000000000000e-11 1.290000000000000e-11 2.600000000000000e-11 -1.780000000000000e-11 9.020000000000000e-12 2.110000000000000e-11 -9.250000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.400000000000000e+02 5.855537443355530e-01 -6.953232963948154e-01 -3.173441039307017e-01 -2.700834050542197e-01 2.870000000000000e-11 2.550000000000000e-11 -1.390000000000000e-11 1.290000000000000e-11 2.610000000000000e-11 -1.780000000000000e-11 8.970000000000001e-12 2.120000000000000e-11 -9.260000000000001e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.410000000000000e+02 5.855361459442947e-01 -6.953257330332522e-01 -3.173393617733928e-01 -2.701208548848608e-01 2.870000000000000e-11 2.550000000000000e-11 -1.390000000000000e-11 1.290000000000000e-11 2.610000000000000e-11 -1.780000000000000e-11 8.970000000000001e-12 2.120000000000000e-11 -9.260000000000001e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.420000000000000e+02 5.855185491719553e-01 -6.953281655496542e-01 -3.173346178332730e-01 -2.701583074671813e-01 2.880000000000000e-11 2.560000000000000e-11 -1.400000000000000e-11 1.300000000000000e-11 2.620000000000000e-11 -1.790000000000000e-11 9.020000000000000e-12 2.110000000000000e-11 -9.160000000000001e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.430000000000000e+02 5.855009527298933e-01 -6.953305948497700e-01 -3.173298728115886e-01 -2.701957624383356e-01 2.880000000000000e-11 2.560000000000000e-11 -1.400000000000000e-11 1.300000000000000e-11 2.620000000000000e-11 -1.790000000000000e-11 9.020000000000000e-12 2.110000000000000e-11 -9.160000000000001e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.440000000000000e+02 5.854833471354922e-01 -6.953330276078120e-01 -3.173251318620752e-01 -2.702332171171619e-01 2.880000000000000e-11 2.560000000000000e-11 -1.400000000000000e-11 1.300000000000000e-11 2.620000000000000e-11 -1.790000000000000e-11 9.020000000000000e-12 2.110000000000000e-11 -9.160000000000001e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.450000000000000e+02 5.854657391541639e-01 -6.953354590628759e-01 -3.173203913063377e-01 -2.702706734140444e-01 2.880000000000000e-11 2.560000000000000e-11 -1.400000000000000e-11 1.300000000000000e-11 2.620000000000000e-11 -1.790000000000000e-11 9.010000000000000e-12 2.110000000000000e-11 -9.150000000000000e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.460000000000000e+02 5.854481287239500e-01 -6.953378892606827e-01 -3.173156511765706e-01 -2.703081313066868e-01 2.880000000000000e-11 2.560000000000000e-11 -1.400000000000000e-11 1.300000000000000e-11 2.620000000000000e-11 -1.790000000000000e-11 9.010000000000000e-12 2.110000000000000e-11 -9.150000000000000e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.470000000000000e+02 5.854305159341220e-01 -6.953403181273479e-01 -3.173109114303517e-01 -2.703455908405129e-01 2.880000000000000e-11 2.560000000000000e-11 -1.400000000000000e-11 1.300000000000000e-11 2.620000000000000e-11 -1.790000000000000e-11 9.010000000000000e-12 2.110000000000000e-11 -9.150000000000000e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.480000000000000e+02 5.854129006980108e-01 -6.953427457366954e-01 -3.173061721069501e-01 -2.703830519661484e-01 2.880000000000000e-11 2.560000000000000e-11 -1.400000000000000e-11 1.300000000000000e-11 2.620000000000000e-11 -1.790000000000000e-11 9.000000000000000e-12 2.110000000000000e-11 -9.150000000000000e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.490000000000000e+02 5.853952830671537e-01 -6.953451720414179e-01 -3.173014331844996e-01 -2.704205147182452e-01 2.880000000000000e-11 2.560000000000000e-11 -1.400000000000000e-11 1.300000000000000e-11 2.620000000000000e-11 -1.790000000000000e-11 9.000000000000000e-12 2.110000000000000e-11 -9.150000000000000e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.500000000000000e+02 5.853776630748353e-01 -6.953475970248998e-01 -3.172966946404721e-01 -2.704579790928218e-01 2.880000000000000e-11 2.560000000000000e-11 -1.400000000000000e-11 1.300000000000000e-11 2.620000000000000e-11 -1.790000000000000e-11 8.989999999999999e-12 2.110000000000000e-11 -9.130000000000000e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.510000000000000e+02 5.853600406153219e-01 -6.953500207577379e-01 -3.172919565343655e-01 -2.704954450663388e-01 2.880000000000000e-11 2.560000000000000e-11 -1.400000000000000e-11 1.300000000000000e-11 2.620000000000000e-11 -1.790000000000000e-11 8.989999999999999e-12 2.110000000000000e-11 -9.130000000000000e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.520000000000000e+02 5.853424254339851e-01 -6.953524363827998e-01 -3.172872135692935e-01 -2.705329153892326e-01 2.880000000000000e-11 2.560000000000000e-11 -1.400000000000000e-11 1.300000000000000e-11 2.620000000000000e-11 -1.790000000000000e-11 8.979999999999999e-12 2.110000000000000e-11 -9.120000000000000e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.530000000000000e+02 5.853248146224551e-01 -6.953548459422469e-01 -3.172824673287505e-01 -2.705703892476099e-01 2.880000000000000e-11 2.560000000000000e-11 -1.400000000000000e-11 1.300000000000000e-11 2.620000000000000e-11 -1.790000000000000e-11 8.979999999999999e-12 2.110000000000000e-11 -9.120000000000000e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.540000000000000e+02 5.853071849456428e-01 -6.953572657986130e-01 -3.172777304320631e-01 -2.706078600557705e-01 2.880000000000000e-11 2.560000000000000e-11 -1.400000000000000e-11 1.300000000000000e-11 2.620000000000000e-11 -1.790000000000000e-11 8.979999999999999e-12 2.110000000000000e-11 -9.120000000000000e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.550000000000000e+02 5.852895528935942e-01 -6.953596843431190e-01 -3.172729939198171e-01 -2.706453324796315e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.920000000000000e-12 2.120000000000000e-11 -9.130000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.560000000000000e+02 5.852719184580404e-01 -6.953621015729359e-01 -3.172682578012318e-01 -2.706828065324546e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.920000000000000e-12 2.120000000000000e-11 -9.130000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.570000000000000e+02 5.852542815612930e-01 -6.953645175484408e-01 -3.172635221149122e-01 -2.707202821807774e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.920000000000000e-12 2.120000000000000e-11 -9.130000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.580000000000000e+02 5.852366423075759e-01 -6.953669321971048e-01 -3.172587868032843e-01 -2.707577594519683e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.910000000000000e-12 2.120000000000000e-11 -9.130000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.590000000000000e+02 5.852190005915120e-01 -6.953693455857081e-01 -3.172540519277470e-01 -2.707952383292633e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.910000000000000e-12 2.120000000000000e-11 -9.120000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.600000000000000e+02 5.852013565048416e-01 -6.953717576564767e-01 -3.172493174340336e-01 -2.708327188252471e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.900000000000000e-12 2.120000000000000e-11 -9.110000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.610000000000000e+02 5.851837100217011e-01 -6.953741684237309e-01 -3.172445833380956e-01 -2.708702009392699e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.900000000000000e-12 2.120000000000000e-11 -9.110000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.620000000000000e+02 5.851660610850813e-01 -6.953765779297217e-01 -3.172398496694150e-01 -2.709076846504131e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.630000000000000e+02 5.851484097590725e-01 -6.953789861278076e-01 -3.172351163936827e-01 -2.709451699790525e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.640000000000000e+02 5.851307560616458e-01 -6.953813930073960e-01 -3.172303834995215e-01 -2.709826569258024e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.650000000000000e+02 5.851130998844488e-01 -6.953837986385580e-01 -3.172256510492222e-01 -2.710201454708074e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.660000000000000e+02 5.850954413358767e-01 -6.953862029458314e-01 -3.172209189830160e-01 -2.710576356425430e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.670000000000000e+02 5.850777803951108e-01 -6.953886059542803e-01 -3.172161873056501e-01 -2.710951274150090e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.680000000000000e+02 5.850601169953407e-01 -6.953910076963832e-01 -3.172114560617900e-01 -2.711326207957394e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.690000000000000e+02 5.850424512088878e-01 -6.953934081280363e-01 -3.172067252077339e-01 -2.711701157918326e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.700000000000000e+02 5.850247830368903e-01 -6.953958072457348e-01 -3.172019947440637e-01 -2.712076124080577e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.710000000000000e+02 5.850071124005890e-01 -6.953982051082478e-01 -3.171972647113503e-01 -2.712451106150847e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.720000000000000e+02 5.849894394067295e-01 -6.954006016376769e-01 -3.171925350528047e-01 -2.712826104477260e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.730000000000000e+02 5.849717639406388e-01 -6.954029969133201e-01 -3.171878058313053e-01 -2.713201118753874e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.740000000000000e+02 5.849540860919462e-01 -6.954053908729213e-01 -3.171830769972923e-01 -2.713576149212427e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.750000000000000e+02 5.849364058534681e-01 -6.954077835188361e-01 -3.171783485558634e-01 -2.713951195876995e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.760000000000000e+02 5.849187231543139e-01 -6.954101749078743e-01 -3.171736205411951e-01 -2.714326258409567e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.770000000000000e+02 5.849010380595855e-01 -6.954125649831299e-01 -3.171688929240919e-01 -2.714701337195486e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.780000000000000e+02 5.848833505824673e-01 -6.954149537469204e-01 -3.171641656901418e-01 -2.715076432048855e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.790000000000000e+02 5.848656606310142e-01 -6.954173412553879e-01 -3.171594388941021e-01 -2.715451542861942e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.800000000000000e+02 5.848479682972464e-01 -6.954197274445862e-01 -3.171547124851289e-01 -2.715826669873385e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.810000000000000e+02 5.848302735737035e-01 -6.954221123230289e-01 -3.171499864649467e-01 -2.716201812994903e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.820000000000000e+02 5.848125763768405e-01 -6.954244959445196e-01 -3.171452608816330e-01 -2.716576972075597e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.830000000000000e+02 5.847948768200809e-01 -6.954268782347893e-01 -3.171405356698738e-01 -2.716952147326623e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.840000000000000e+02 5.847771747920576e-01 -6.954292592636632e-01 -3.171358108949500e-01 -2.717327338585004e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.850000000000000e+02 5.847594703769200e-01 -6.954316389810870e-01 -3.171310865053671e-01 -2.717702545910952e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.860000000000000e+02 5.847417635703021e-01 -6.954340173826565e-01 -3.171263625075116e-01 -2.718077769425781e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.870000000000000e+02 5.847240542921777e-01 -6.954363945256665e-01 -3.171216389440188e-01 -2.718453008876911e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.880000000000000e+02 5.847063426146137e-01 -6.954387703590261e-01 -3.171169157755906e-01 -2.718828264468806e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.890000000000000e+02 5.846886285574723e-01 -6.954411448755839e-01 -3.171121929870191e-01 -2.719203536123818e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.900000000000000e+02 5.846709120224511e-01 -6.954435181323835e-01 -3.171074706385945e-01 -2.719578823782857e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.910000000000000e+02 5.846531930957800e-01 -6.954458900767090e-01 -3.171027486784128e-01 -2.719954127534470e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.920000000000000e+02 5.846354717746990e-01 -6.954482607077976e-01 -3.170980271091700e-01 -2.720329447415265e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.930000000000000e+02 5.846177479850914e-01 -6.954506300775927e-01 -3.170933059709897e-01 -2.720704783211655e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.940000000000000e+02 5.846000218004164e-01 -6.954529981340173e-01 -3.170885852238311e-01 -2.721080135132157e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.950000000000000e+02 5.845822932197179e-01 -6.954553648774245e-01 -3.170838648680027e-01 -2.721455503173886e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.960000000000000e+02 5.845645621696898e-01 -6.954577303591899e-01 -3.170791449431832e-01 -2.721830887125490e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.970000000000000e+02 5.845468287406869e-01 -6.954600945177026e-01 -3.170744253987201e-01 -2.722206287199883e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.980000000000000e+02 5.845290928537464e-01 -6.954624574023535e-01 -3.170697062808771e-01 -2.722581703281180e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.990000000000000e+02 5.845113545641019e-01 -6.954648189786803e-01 -3.170649875566854e-01 -2.722957135436939e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.000000000000000e+02 5.844936138763418e-01 -6.954671792419352e-01 -3.170602692241519e-01 -2.723332583702329e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.010000000000000e+02 5.844758707090094e-01 -6.954695382492416e-01 -3.170555513273636e-01 -2.723708047842747e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.020000000000000e+02 5.844581251559721e-01 -6.954718959329390e-01 -3.170508338159378e-01 -2.724083528147186e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.030000000000000e+02 5.844403772040307e-01 -6.954742523079823e-01 -3.170461166932985e-01 -2.724459024466375e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.040000000000000e+02 5.844226267704047e-01 -6.954766074228710e-01 -3.170414000098757e-01 -2.724834536740388e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.050000000000000e+02 5.844048739455676e-01 -6.954789612171122e-01 -3.170366837143173e-01 -2.725210065159378e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.060000000000000e+02 5.843871187196821e-01 -6.954813137009034e-01 -3.170319678096324e-01 -2.725585609628257e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.070000000000000e+02 5.843693610160483e-01 -6.954836649268263e-01 -3.170272523380220e-01 -2.725961169948128e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.080000000000000e+02 5.843516009405999e-01 -6.954860148174994e-01 -3.170225372432346e-01 -2.726336746465719e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.090000000000000e+02 5.843338383896745e-01 -6.954883634468985e-01 -3.170178225806694e-01 -2.726712338860778e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.100000000000000e+02 5.843160734396614e-01 -6.954907107608660e-01 -3.170131083087279e-01 -2.727087947350444e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.110000000000000e+02 5.842983060846727e-01 -6.954930567632314e-01 -3.170083944303905e-01 -2.727463571917777e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.120000000000000e+02 5.842805362623766e-01 -6.954954014976492e-01 -3.170036809793610e-01 -2.727839212382372e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.130000000000000e+02 5.842627640233117e-01 -6.954977449269839e-01 -3.169989679287539e-01 -2.728214868910164e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.140000000000000e+02 5.842449894075324e-01 -6.955000870274668e-01 -3.169942552538495e-01 -2.728590541525713e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.150000000000000e+02 5.842272122843237e-01 -6.955024278849737e-01 -3.169895430289044e-01 -2.728966229965500e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.160000000000000e+02 5.842094327846888e-01 -6.955047674092403e-01 -3.169848311813445e-01 -2.729341934557590e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.170000000000000e+02 5.841916508636360e-01 -6.955071056292645e-01 -3.169801197367355e-01 -2.729717655218351e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.180000000000000e+02 5.841738664722402e-01 -6.955094425864351e-01 -3.169754087172885e-01 -2.730093391671568e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.190000000000000e+02 5.841560796793650e-01 -6.955117782235155e-01 -3.169706980904252e-01 -2.730469144269303e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.200000000000000e+02 5.841382904845881e-01 -6.955141125452683e-01 -3.169659878533504e-01 -2.730844912920921e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.210000000000000e+02 5.841204988011045e-01 -6.955164456126073e-01 -3.169612780530048e-01 -2.731220697376175e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.220000000000000e+02 5.841027047488182e-01 -6.955187773370833e-01 -3.169565686263153e-01 -2.731596498044239e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.230000000000000e+02 5.840849082066607e-01 -6.955211078061588e-01 -3.169518596373633e-01 -2.731972314532624e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.240000000000000e+02 5.840671092649424e-01 -6.955234369582445e-01 -3.169471510356347e-01 -2.732348147053730e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.250000000000000e+02 5.840493079217062e-01 -6.955257647920037e-01 -3.169424428233881e-01 -2.732723995646432e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.260000000000000e+02 5.840315040865945e-01 -6.955280913696625e-01 -3.169377350501790e-01 -2.733099860072574e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.270000000000000e+02 5.840136978582137e-01 -6.955304166201872e-01 -3.169330276631203e-01 -2.733475740635207e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.280000000000000e+02 5.839958892081509e-01 -6.955327405680767e-01 -3.169283206745694e-01 -2.733851637163930e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.290000000000000e+02 5.839780780929669e-01 -6.955350632424827e-01 -3.169236141086801e-01 -2.734227549554220e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.300000000000000e+02 5.839602645601643e-01 -6.955373846071993e-01 -3.169189079409361e-01 -2.734603477985875e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.310000000000000e+02 5.839424486213922e-01 -6.955397046548893e-01 -3.169142021641203e-01 -2.734979422469596e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.320000000000000e+02 5.839246302074598e-01 -6.955420234364549e-01 -3.169094968142101e-01 -2.735355382760485e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.330000000000000e+02 5.839068093998936e-01 -6.955443408868918e-01 -3.169047918510442e-01 -2.735731359225576e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.340000000000000e+02 5.838889861094081e-01 -6.955466570748655e-01 -3.169000873193608e-01 -2.736107351495706e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.350000000000000e+02 5.838711604164700e-01 -6.955489719433202e-01 -3.168953831754061e-01 -2.736483359800086e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.360000000000000e+02 5.838533323100364e-01 -6.955512855009193e-01 -3.168906794242438e-01 -2.736859384084723e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.370000000000000e+02 5.838355017298018e-01 -6.955535977851144e-01 -3.168859761012539e-01 -2.737235424263861e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.380000000000000e+02 5.838176687211944e-01 -6.955559087659493e-01 -3.168812731802392e-01 -2.737611480422213e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.390000000000000e+02 5.837998333145428e-01 -6.955582184217171e-01 -3.168765706445820e-01 -2.737987552646077e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.400000000000000e+02 5.837819954152460e-01 -6.955605268176491e-01 -3.168718685461019e-01 -2.738363640684894e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.410000000000000e+02 5.837641551128304e-01 -6.955628338938911e-01 -3.168671668340473e-01 -2.738739744726880e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.420000000000000e+02 5.837463123929925e-01 -6.955651396554128e-01 -3.168624655187589e-01 -2.739115864820293e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.430000000000000e+02 5.837284671943698e-01 -6.955674441488053e-01 -3.168577646312576e-01 -2.739492000720076e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.440000000000000e+02 5.837106195763908e-01 -6.955697473330390e-01 -3.168530641384842e-01 -2.739868152573258e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.450000000000000e+02 5.836927695441628e-01 -6.955720491933975e-01 -3.168483640437939e-01 -2.740244320595047e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.460000000000000e+02 5.836749170318810e-01 -6.955743497928002e-01 -3.168436643728734e-01 -2.740620504282199e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.470000000000000e+02 5.836570621307416e-01 -6.955766490582023e-01 -3.168389650810632e-01 -2.740996704051923e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.480000000000000e+02 5.836392047384135e-01 -6.955789470590961e-01 -3.168342662250465e-01 -2.741372919653729e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.490000000000000e+02 5.836213449303548e-01 -6.955812437419429e-01 -3.168295677638069e-01 -2.741749151302781e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.500000000000000e+02 5.836034827182855e-01 -6.955835391041530e-01 -3.168248696872848e-01 -2.742125398920773e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.510000000000000e+02 5.835856179985505e-01 -6.955858332137573e-01 -3.168201720542758e-01 -2.742501662297985e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.520000000000000e+02 5.835677508875651e-01 -6.955881259907279e-01 -3.168154748002195e-01 -2.742877941721936e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.530000000000000e+02 5.835498813469788e-01 -6.955904174605910e-01 -3.168107779463452e-01 -2.743254237105254e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.540000000000000e+02 5.835320093166678e-01 -6.955927076618763e-01 -3.168060815272026e-01 -2.743630548340127e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.550000000000000e+02 5.835141348741624e-01 -6.955949965443786e-01 -3.168013854978563e-01 -2.744006875558487e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.560000000000000e+02 5.834962580148892e-01 -6.955972841122019e-01 -3.167966898598680e-01 -2.744383218724767e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.570000000000000e+02 5.834783786654938e-01 -6.955995704144100e-01 -3.167919946542331e-01 -2.744759577671007e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.580000000000000e+02 5.834604969197658e-01 -6.956018553809091e-01 -3.167872998321029e-01 -2.745135952732799e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.590000000000000e+02 5.834426126855181e-01 -6.956041390824514e-01 -3.167826054397302e-01 -2.745512343532155e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.600000000000000e+02 5.834247260354545e-01 -6.956064214662310e-01 -3.167779114383129e-01 -2.745888750298885e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.610000000000000e+02 5.834068369703270e-01 -6.956087025301940e-01 -3.167732178279383e-01 -2.746265173057257e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.620000000000000e+02 5.833889454069964e-01 -6.956109823315106e-01 -3.167685246541772e-01 -2.746641611588949e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.630000000000000e+02 5.833710514209808e-01 -6.956132608141853e-01 -3.167638318774125e-01 -2.747018066154171e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.640000000000000e+02 5.833531550259811e-01 -6.956155379778383e-01 -3.167591394844141e-01 -2.747394536613369e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.650000000000000e+02 5.833352561337060e-01 -6.956178138760706e-01 -3.167544475277447e-01 -2.747771022867325e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.660000000000000e+02 5.833173548210511e-01 -6.956200884555152e-01 -3.167497559649418e-01 -2.748147525113297e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.670000000000000e+02 5.832994510909917e-01 -6.956223617185553e-01 -3.167450647913811e-01 -2.748524043270335e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.680000000000000e+02 5.832815448604923e-01 -6.956246337186902e-01 -3.167403740546705e-01 -2.748900577187235e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.690000000000000e+02 5.832636362191355e-01 -6.956269043911956e-01 -3.167356837069057e-01 -2.749277127142218e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.700000000000000e+02 5.832457251486519e-01 -6.956291737498391e-01 -3.167309937570452e-01 -2.749653693060527e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.710000000000000e+02 5.832278115833165e-01 -6.956314418455223e-01 -3.167263042377223e-01 -2.750030274661883e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.720000000000000e+02 5.832098956260603e-01 -6.956337086004795e-01 -3.167216150958865e-01 -2.750406872330643e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.730000000000000e+02 5.831919771671186e-01 -6.956359740942818e-01 -3.167169263893606e-01 -2.750783485705177e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.740000000000000e+02 5.831740562877817e-01 -6.956382382668485e-01 -3.167122380754318e-01 -2.751160115062404e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.750000000000000e+02 5.831561329925340e-01 -6.956405011134896e-01 -3.167075501521728e-01 -2.751536760437264e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.760000000000000e+02 5.831382071844491e-01 -6.956427627071282e-01 -3.167028626690587e-01 -2.751913421460132e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.770000000000000e+02 5.831202789687576e-01 -6.956450229719894e-01 -3.166981755697529e-01 -2.752290098454169e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.780000000000000e+02 5.831023483192034e-01 -6.956472819226700e-01 -3.166934888703323e-01 -2.752666791410986e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.790000000000000e+02 5.830844151794714e-01 -6.956495396046427e-01 -3.166888025976340e-01 -2.753043500054790e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.800000000000000e+02 5.830664796132707e-01 -6.956517959642123e-01 -3.166841167219613e-01 -2.753420224723870e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.810000000000000e+02 5.830485416150840e-01 -6.956540510145710e-01 -3.166794312404689e-01 -2.753796965223715e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.820000000000000e+02 5.830306011328652e-01 -6.956563047837491e-01 -3.166747461861094e-01 -2.754173721558481e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.830000000000000e+02 5.830126582345619e-01 -6.956585572282714e-01 -3.166700615191317e-01 -2.754550493834141e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.840000000000000e+02 5.829947128434927e-01 -6.956608084007722e-01 -3.166653772815733e-01 -2.754927281850406e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.850000000000000e+02 5.829767650241529e-01 -6.956630582554145e-01 -3.166606934384076e-01 -2.755304085791704e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.860000000000000e+02 5.829588147807234e-01 -6.956653067889245e-01 -3.166560099871700e-01 -2.755680905669798e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.870000000000000e+02 5.829408620354734e-01 -6.956675540546792e-01 -3.166513269704571e-01 -2.756057741281340e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.880000000000000e+02 5.829229068623707e-01 -6.956698000025611e-01 -3.166466443467315e-01 -2.756434592793293e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.890000000000000e+02 5.829049492715592e-01 -6.956720446262921e-01 -3.166419621096092e-01 -2.756811460212181e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.900000000000000e+02 5.828869891587379e-01 -6.956742879943926e-01 -3.166372803181250e-01 -2.757188343325451e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.910000000000000e+02 5.828690266395175e-01 -6.956765300273531e-01 -3.166325989082742e-01 -2.757565242419386e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.920000000000000e+02 5.828510616754471e-01 -6.956787707507837e-01 -3.166279179013008e-01 -2.757942157405953e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.930000000000000e+02 5.828330942174438e-01 -6.956810102026629e-01 -3.166232373215231e-01 -2.758319088074500e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.940000000000000e+02 5.828151243252382e-01 -6.956832483368977e-01 -3.166185571386063e-01 -2.758696034662875e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.950000000000000e+02 5.827971520090908e-01 -6.956854851471268e-01 -3.166138773461051e-01 -2.759072997177953e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.960000000000000e+02 5.827791771874248e-01 -6.956877206918572e-01 -3.166091979872700e-01 -2.759449975360566e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.970000000000000e+02 5.827611999535102e-01 -6.956899548988957e-01 -3.166045190150286e-01 -2.759826969590304e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.980000000000000e+02 5.827432202258372e-01 -6.956921878351339e-01 -3.165998404676824e-01 -2.760203979451962e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.990000000000000e+02 5.827252380631254e-01 -6.956944194551884e-01 -3.165951623154489e-01 -2.760581005180557e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.000000000000000e+02 5.827072534710865e-01 -6.956966497498854e-01 -3.165904845578452e-01 -2.760958046881501e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.010000000000000e+02 5.826892663667650e-01 -6.956988787799151e-01 -3.165858072381525e-01 -2.761335104269267e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.020000000000000e+02 5.826712768270340e-01 -6.957011064943041e-01 -3.165811303125931e-01 -2.761712177497065e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.030000000000000e+02 5.826532848794255e-01 -6.957033328720889e-01 -3.165764537668129e-01 -2.762089266665937e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.040000000000000e+02 5.826352903993585e-01 -6.957055579997335e-01 -3.165717776686401e-01 -2.762466371437880e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.050000000000000e+02 5.826172935012799e-01 -6.957077817937122e-01 -3.165671019575464e-01 -2.762843492185479e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.060000000000000e+02 5.825992941611964e-01 -6.957100042730495e-01 -3.165624266448607e-01 -2.763220628795079e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.070000000000000e+02 5.825812923192838e-01 -6.957122254809077e-01 -3.165577517620805e-01 -2.763597781069690e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.080000000000000e+02 5.825632880668580e-01 -6.957144453488653e-01 -3.165530772618108e-01 -2.763974949338902e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.090000000000000e+02 5.825452813078505e-01 -6.957166639529077e-01 -3.165484031908835e-01 -2.764352133167844e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.100000000000000e+02 5.825272721059203e-01 -6.957188812393303e-01 -3.165437295196725e-01 -2.764729332895106e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.110000000000000e+02 5.825092604788189e-01 -6.957210971940696e-01 -3.165390562391017e-01 -2.765106548593716e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.120000000000000e+02 5.824912463439814e-01 -6.957233118835827e-01 -3.165343833887144e-01 -2.765483779867471e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.130000000000000e+02 5.824732297631289e-01 -6.957255252567345e-01 -3.165297109392333e-01 -2.765861027027131e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.140000000000000e+02 5.824552107571479e-01 -6.957277372996592e-01 -3.165250388784912e-01 -2.766238290110101e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.150000000000000e+02 5.824371892380432e-01 -6.957299480778293e-01 -3.165203672517569e-01 -2.766615568793791e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.160000000000000e+02 5.824191652746327e-01 -6.957321575387126e-01 -3.165156960238288e-01 -2.766992863342431e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.170000000000000e+02 5.824011388855037e-01 -6.957343656688602e-01 -3.165110251844822e-01 -2.767370173809153e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.180000000000000e+02 5.823831099805280e-01 -6.957365725328419e-01 -3.165063547815302e-01 -2.767747499909810e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.190000000000000e+02 5.823650786300579e-01 -6.957387780818642e-01 -3.165016847761464e-01 -2.768124841823826e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.200000000000000e+02 5.823470448566271e-01 -6.957409823008985e-01 -3.164970151552803e-01 -2.768502199593362e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.210000000000000e+02 5.823290085661269e-01 -6.957431852525021e-01 -3.164923459716862e-01 -2.768879573012030e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.220000000000000e+02 5.823109698521846e-01 -6.957453868690139e-01 -3.164876771753546e-01 -2.769256962371734e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.230000000000000e+02 5.822929286375025e-01 -6.957475872059478e-01 -3.164830088071746e-01 -2.769634367425067e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.240000000000000e+02 5.822748849732314e-01 -6.957497862328947e-01 -3.164783408358728e-01 -2.770011788207128e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.250000000000000e+02 5.822568388807733e-01 -6.957519839259674e-01 -3.164736732546169e-01 -2.770389224935368e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.260000000000000e+02 5.822387902618280e-01 -6.957541803591372e-01 -3.164690061135010e-01 -2.770766677235049e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.270000000000000e+02 5.822207392135617e-01 -6.957563754610457e-01 -3.164643393613722e-01 -2.771144145429691e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.280000000000000e+02 5.822026857222734e-01 -6.957585692434597e-01 -3.164596730040027e-01 -2.771521629435090e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.290000000000000e+02 5.821846297103098e-01 -6.957607617597373e-01 -3.164550070838612e-01 -2.771899129047319e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.300000000000000e+02 5.821665712627864e-01 -6.957629529494422e-01 -3.164503415548917e-01 -2.772276644510718e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.310000000000000e+02 5.821485103723264e-01 -6.957651428198749e-01 -3.164456764194593e-01 -2.772654175759239e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.320000000000000e+02 5.821304469698791e-01 -6.957673314146972e-01 -3.164410117174953e-01 -2.773031722680575e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.330000000000000e+02 5.821123811384951e-01 -6.957695186773272e-01 -3.164363474026121e-01 -2.773409285469521e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.340000000000000e+02 5.820943128053812e-01 -6.957717046576937e-01 -3.164316835146523e-01 -2.773786863936038e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.350000000000000e+02 5.820762420142032e-01 -6.957738893270475e-01 -3.164270200284908e-01 -2.774164458160786e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.360000000000000e+02 5.820581687899399e-01 -6.957760726662133e-01 -3.164223569311706e-01 -2.774542068237662e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.370000000000000e+02 5.820400930493064e-01 -6.957782547337412e-01 -3.164176942674763e-01 -2.774919693924091e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.380000000000000e+02 5.820220148551207e-01 -6.957804354849367e-01 -3.164130320033753e-01 -2.775297335400457e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.390000000000000e+02 5.820039342263251e-01 -6.957826149048855e-01 -3.164083701291627e-01 -2.775674992743318e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.400000000000000e+02 5.819858510723547e-01 -6.957847930609107e-01 -3.164037086914346e-01 -2.776052665622155e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.410000000000000e+02 5.819677654759241e-01 -6.957869698906334e-01 -3.163990476475529e-01 -2.776430354341566e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.420000000000000e+02 5.819496774375017e-01 -6.957891453958156e-01 -3.163943869956590e-01 -2.776808058858043e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.430000000000000e+02 5.819315868742189e-01 -6.957913196335117e-01 -3.163897267809997e-01 -2.777185778952395e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.440000000000000e+02 5.819134938671313e-01 -6.957934925413013e-01 -3.163850669625369e-01 -2.777563514946820e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.450000000000000e+02 5.818953984093933e-01 -6.957956641333685e-01 -3.163804075381466e-01 -2.777941266642878e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.460000000000000e+02 5.818773004397692e-01 -6.957978344442328e-01 -3.163757485456281e-01 -2.778319034017449e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.470000000000000e+02 5.818592000430243e-01 -6.958000034233444e-01 -3.163710899335022e-01 -2.778696817136654e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.480000000000000e+02 5.818410971278563e-01 -6.958021711240455e-01 -3.163664317571461e-01 -2.779074615935458e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.490000000000000e+02 5.818229917597070e-01 -6.958043375058253e-01 -3.163617739776330e-01 -2.779452430490382e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.500000000000000e+02 5.818048839454777e-01 -6.958065025622731e-01 -3.163571165917429e-01 -2.779830260843371e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.510000000000000e+02 5.817867736100961e-01 -6.958086663461525e-01 -3.163524596398105e-01 -2.780208106775203e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.520000000000000e+02 5.817686608316146e-01 -6.958108288032028e-01 -3.163478030789305e-01 -2.780585968488011e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.530000000000000e+02 5.817505455909165e-01 -6.958129899417663e-01 -3.163431469219805e-01 -2.780963846015780e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.540000000000000e+02 5.817324278297862e-01 -6.958151498075382e-01 -3.163384911974209e-01 -2.781341739098508e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.550000000000000e+02 5.817143076344311e-01 -6.958173083404936e-01 -3.163338358579657e-01 -2.781719647961862e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.560000000000000e+02 5.816961849714265e-01 -6.958194655627148e-01 -3.163291809220889e-01 -2.782097572531674e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.570000000000000e+02 5.816780597959783e-01 -6.958216215007350e-01 -3.163245264166255e-01 -2.782475512765062e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.580000000000000e+02 5.816599321845121e-01 -6.958237761050522e-01 -3.163198722974089e-01 -2.782853468793607e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.590000000000000e+02 5.816418020571233e-01 -6.958259294306408e-01 -3.163152186080582e-01 -2.783231440406337e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.600000000000000e+02 5.816236694709122e-01 -6.958280814368287e-01 -3.163105653176532e-01 -2.783609427767481e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.610000000000000e+02 5.816055344366186e-01 -6.958302321157006e-01 -3.163059124202110e-01 -2.783987430907752e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.620000000000000e+02 5.815873968776649e-01 -6.958323815210938e-01 -3.163012599568550e-01 -2.784365449603383e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.630000000000000e+02 5.815692568616415e-01 -6.958345296037094e-01 -3.162966078917271e-01 -2.784743484071190e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.640000000000000e+02 5.815511143976942e-01 -6.958366763591807e-01 -3.162919562183046e-01 -2.785121534292659e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.650000000000000e+02 5.815329694007949e-01 -6.958388218461087e-01 -3.162873049829473e-01 -2.785499600041934e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.660000000000000e+02 5.815148219614794e-01 -6.958409660013981e-01 -3.162826541360672e-01 -2.785877681557379e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.670000000000000e+02 5.814966720551789e-01 -6.958431088372415e-01 -3.162780036934651e-01 -2.786255778857196e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.680000000000000e+02 5.814785196322499e-01 -6.958452503969265e-01 -3.162733536768749e-01 -2.786633891638949e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.690000000000000e+02 5.814603647463017e-01 -6.958473906361835e-01 -3.162687040607646e-01 -2.787012020168500e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.700000000000000e+02 5.814422074099109e-01 -6.958495295445863e-01 -3.162640548388659e-01 -2.787390164504185e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.710000000000000e+02 5.814240475428735e-01 -6.958516671809677e-01 -3.162594060528345e-01 -2.787768324366982e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.720000000000000e+02 5.814058852479905e-01 -6.958538034735398e-01 -3.162547576464547e-01 -2.788146500031716e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.730000000000000e+02 5.813877204231332e-01 -6.958559384954224e-01 -3.162501096738626e-01 -2.788524691178429e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.740000000000000e+02 5.813695531339568e-01 -6.958580721950373e-01 -3.162454621023588e-01 -2.788902898085467e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.750000000000000e+02 5.813513834021187e-01 -6.958602045567507e-01 -3.162408149200974e-01 -2.789281120815051e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.760000000000000e+02 5.813332111234679e-01 -6.958623356575390e-01 -3.162361681808935e-01 -2.789659358996684e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.770000000000000e+02 5.813150364030600e-01 -6.958644654288825e-01 -3.162315218245857e-01 -2.790037612821580e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.780000000000000e+02 5.812968592173021e-01 -6.958665938713704e-01 -3.162268758727366e-01 -2.790415882511533e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.790000000000000e+02 5.812786794994969e-01 -6.958687210427844e-01 -3.162222303548325e-01 -2.790794167670128e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.800000000000000e+02 5.812604973256570e-01 -6.958708468854302e-01 -3.162175852319191e-01 -2.791172468583376e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.810000000000000e+02 5.812423126926801e-01 -6.958729714036002e-01 -3.162129405040593e-01 -2.791550785197454e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.820000000000000e+02 5.812241255262258e-01 -6.958750946447176e-01 -3.162082962139302e-01 -2.791929117383943e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.830000000000000e+02 5.812059359280037e-01 -6.958772165474577e-01 -3.162036523003404e-01 -2.792307465236257e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.840000000000000e+02 5.811877437937374e-01 -6.958793371731296e-01 -3.161990088262405e-01 -2.792685828673430e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.850000000000000e+02 5.811695491941765e-01 -6.958814564774579e-01 -3.161943657499202e-01 -2.793064207787844e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.860000000000000e+02 5.811513521482911e-01 -6.958835744442788e-01 -3.161897230623827e-01 -2.793442602678650e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.870000000000000e+02 5.811331525547214e-01 -6.958856911498272e-01 -3.161850808152155e-01 -2.793821012960814e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.880000000000000e+02 5.811149505113100e-01 -6.958878065197522e-01 -3.161804389584545e-01 -2.794199439005827e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.890000000000000e+02 5.810967459999881e-01 -6.958899205652878e-01 -3.161757975022972e-01 -2.794577880783594e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.900000000000000e+02 5.810785389530592e-01 -6.958920333376604e-01 -3.161711564809435e-01 -2.794956338028511e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.910000000000000e+02 5.810603294453802e-01 -6.958941447811916e-01 -3.161665158553826e-01 -2.795334811001148e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.920000000000000e+02 5.810421174764387e-01 -6.958962548983457e-01 -3.161618756242864e-01 -2.795713299655139e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.930000000000000e+02 5.810239029759451e-01 -6.958983637385437e-01 -3.161572358253394e-01 -2.796091803784308e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.940000000000000e+02 5.810056860006197e-01 -6.959004712601424e-01 -3.161525964285756e-01 -2.796470323574547e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.950000000000000e+02 5.809874665694046e-01 -6.959025774445649e-01 -3.161479574264141e-01 -2.796848859169596e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.960000000000000e+02 5.809692445987980e-01 -6.959046823590764e-01 -3.161433188587358e-01 -2.797227410168842e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.970000000000000e+02 5.809510201926489e-01 -6.959067859299050e-01 -3.161386806695309e-01 -2.797605976873053e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.980000000000000e+02 5.809327932460990e-01 -6.959088882236331e-01 -3.161340429192251e-01 -2.797984559109964e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.990000000000000e+02 5.809145638337309e-01 -6.959109891896249e-01 -3.161294055661758e-01 -2.798363157050214e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.000000000000000e+02 5.808963319634960e-01 -6.959130888255755e-01 -3.161247686038135e-01 -2.798741770649591e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.010000000000000e+02 5.808780975397640e-01 -6.959151871939737e-01 -3.161201320862030e-01 -2.799120399717788e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.020000000000000e+02 5.808598606617771e-01 -6.959172842267435e-01 -3.161154959584729e-01 -2.799499044496779e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.030000000000000e+02 5.808416213174963e-01 -6.959193799369323e-01 -3.161108602240852e-01 -2.799877704862250e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.040000000000000e+02 5.808233794256747e-01 -6.959214743695692e-01 -3.161062249335686e-01 -2.800256380799301e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.050000000000000e+02 5.808051350748651e-01 -6.959235674750707e-01 -3.161015900315101e-01 -2.800635072318234e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.060000000000000e+02 5.807868882549465e-01 -6.959256592517621e-01 -3.160969555280244e-01 -2.801013779545733e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.070000000000000e+02 5.807686388909959e-01 -6.959277497523529e-01 -3.160923214632559e-01 -2.801392502261977e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.080000000000000e+02 5.807503870900764e-01 -6.959298389056441e-01 -3.160876877767071e-01 -2.801771240688037e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.090000000000000e+02 5.807321327395073e-01 -6.959319267874047e-01 -3.160830545308733e-01 -2.802149994561799e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.100000000000000e+02 5.807138759254036e-01 -6.959340133412668e-01 -3.160784216765503e-01 -2.802528764042817e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.110000000000000e+02 5.806956166460356e-01 -6.959360985620483e-01 -3.160737892179524e-01 -2.802907549237413e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.120000000000000e+02 5.806773548168237e-01 -6.959381825117258e-01 -3.160691571989988e-01 -2.803286349853105e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.130000000000000e+02 5.806590905178923e-01 -6.959402651320853e-01 -3.160645255771965e-01 -2.803665166143753e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.140000000000000e+02 5.806408237610376e-01 -6.959423464205376e-01 -3.160598943425227e-01 -2.804043998031655e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.150000000000000e+02 5.806225544454130e-01 -6.959444264371912e-01 -3.160552635552945e-01 -2.804422845422669e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.160000000000000e+02 5.806042826706947e-01 -6.959465051209457e-01 -3.160506331562557e-01 -2.804801708426454e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.170000000000000e+02 5.805860084151201e-01 -6.959485824783535e-01 -3.160460031617608e-01 -2.805180587135971e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.180000000000000e+02 5.805677316239107e-01 -6.959506585600499e-01 -3.160413735941470e-01 -2.805559481166358e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.190000000000000e+02 5.805494523586150e-01 -6.959527333100070e-01 -3.160367444271813e-01 -2.805938390918646e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.200000000000000e+02 5.805311706173489e-01 -6.959548067353131e-01 -3.160321156581771e-01 -2.806317316275553e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.210000000000000e+02 5.805128863381084e-01 -6.959568788783360e-01 -3.160274873210229e-01 -2.806696257076716e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.220000000000000e+02 5.804945996055608e-01 -6.959589496800560e-01 -3.160228593693650e-01 -2.807075213545651e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.230000000000000e+02 5.804763103272732e-01 -6.959610192007165e-01 -3.160182318554973e-01 -2.807454185500813e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.240000000000000e+02 5.804580185738928e-01 -6.959630873960984e-01 -3.160136047378450e-01 -2.807833173034932e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.250000000000000e+02 5.804397243544648e-01 -6.959651542546071e-01 -3.160089780141460e-01 -2.808212176263198e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.260000000000000e+02 5.804214275809261e-01 -6.959672198480055e-01 -3.160043517259676e-01 -2.808591194748871e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.270000000000000e+02 5.804031283351840e-01 -6.959692841070644e-01 -3.159997258354755e-01 -2.808970228929750e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.280000000000000e+02 5.803848266166751e-01 -6.959713470330723e-01 -3.159951003420692e-01 -2.809349278781627e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.290000000000000e+02 5.803665223419990e-01 -6.959734086859748e-01 -3.159904752896953e-01 -2.809728344037404e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.300000000000000e+02 5.803482156026000e-01 -6.959754690056189e-01 -3.159858506263420e-01 -2.810107424872477e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.310000000000000e+02 5.803299063837136e-01 -6.959775279948167e-01 -3.159812263639046e-01 -2.810486521377699e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t</ATTLISTList>\n\t</ATT>\n\t<TIL>\n\t\t<BANDID>P</BANDID>\n\t\t<NUMTILES>1</NUMTILES>\n\t\t<TILESIZEX>35170</TILESIZEX>\n\t\t<TILESIZEY>27576</TILESIZEY>\n\t\t<TILEUNITS>Pixels</TILEUNITS>\n\t\t<TILEOVERLAP>3545</TILEOVERLAP>\n\t\t<TILE>\n\t\t\t<FILENAME>07NOV25174027-P1BS_R1C1-005728210010_01_P001.TIF</FILENAME>\n\t\t\t<ULCOLOFFSET>0</ULCOLOFFSET>\n\t\t\t<ULROWOFFSET>0</ULROWOFFSET>\n\t\t\t<URCOLOFFSET>35169</URCOLOFFSET>\n\t\t\t<URROWOFFSET>0</URROWOFFSET>\n\t\t\t<LRCOLOFFSET>35169</LRCOLOFFSET>\n\t\t\t<LRROWOFFSET>27575</LRROWOFFSET>\n\t\t\t<LLCOLOFFSET>0</LLCOLOFFSET>\n\t\t\t<LLROWOFFSET>27575</LLROWOFFSET>\n\t\t\t<ULLON>-1.053955881000000e+02</ULLON>\n\t\t\t<ULLAT>3.980947709000000e+01</ULLAT>\n\t\t\t<URLON>-1.051834485800000e+02</URLON>\n\t\t\t<URLAT>3.981066533000000e+01</URLAT>\n\t\t\t<LRLON>-1.051836261900000e+02</LRLON>\n\t\t\t<LRLAT>3.968439626000000e+01</LRLAT>\n\t\t\t<LLLON>-1.053955469800000e+02</LLLON>\n\t\t\t<LLLAT>3.968329551000000e+01</LLLAT>\n\t\t</TILE>\n\t</TIL>\n\t<GEO>\n\t\t<EFFECTIVETIME>1432-09-18T00:00:00.000000Z</EFFECTIVETIME>\n\t\t<MODELGENERATIONTIME>1432-12-16T00:00:00.000000Z</MODELGENERATIONTIME>\n\t\t<SATID>Imaginary1</SATID>\n\t\t<GEOMODELLEVEL>LV1B</GEOMODELLEVEL>\n\t\t<PRINCIPAL_DISTANCE>\n\t\t\t<GENERATIONTIME>1432-12-05T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<PD>7.949165000000000e+03</PD>\n\t\t</PRINCIPAL_DISTANCE>\n\t\t<OPTICAL_DISTORTION>\n\t\t\t<GENERATIONTIME>2000-01-01T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<POLYORDER>0</POLYORDER>\n\t\t\t<ALIST>0.000000000000000e+00</ALIST>\n\t\t\t<BLIST>0.000000000000000e+00</BLIST>\n\t\t</OPTICAL_DISTORTION>\n\t\t<PERSPECTIVE_CENTER>\n\t\t\t<GENERATIONTIME>2000-01-01T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<CX>0.000000000000000e+00</CX>\n\t\t\t<CY>0.000000000000000e+00</CY>\n\t\t\t<CZ>0.000000000000000e+00</CZ>\n\t\t</PERSPECTIVE_CENTER>\n\t\t<CAMERA_ATTITUDE>\n\t\t\t<GENERATIONTIME>1432-06-08T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<QCS1>0.000000000000000e+00</QCS1>\n\t\t\t<QCS2>0.000000000000000e+00</QCS2>\n\t\t\t<QCS3>0.000000000000000e+00</QCS3>\n\t\t\t<QCS4>1.000000000000000e+00</QCS4>\n\t\t</CAMERA_ATTITUDE>\n\t\t<DETECTOR_MOUNTING>\n\t\t\t<GENERATIONTIME>1432-12-16T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<BAND_P>\n\t\t\t\t<BANDID>P</BANDID>\n\t\t\t\t<DETECTOR_ARRAY>\n\t\t\t\t\t<DETARRID>1</DETARRID>\n\t\t\t\t\t<DETORIGINX>5.372000000000000e-02</DETORIGINX>\n\t\t\t\t\t<DETORIGINY>1.407119300000000e+02</DETORIGINY>\n\t\t\t\t\t<DETROTANGLE>0.000000000000000e+00</DETROTANGLE>\n\t\t\t\t\t<DETPITCH>8.000000000000000e-03</DETPITCH>\n\t\t\t\t</DETECTOR_ARRAY>\n\t\t\t</BAND_P>\n\t\t</DETECTOR_MOUNTING>\n\t</GEO>\n</isd>\n"
  },
  {
    "path": "src/asp/Camera/tests/dg_example3.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<isd>\n\t<IMD>\n\t\t<VERSION>Monkey</VERSION>\n\t\t<BANDID>P</BANDID>\n\t\t<NUMROWS>54272</NUMROWS>\n\t\t<NUMCOLUMNS>35840</NUMCOLUMNS>\n\t\t<BITSPERPIXEL>16</BITSPERPIXEL>\n\t\t<COMPRESSIONTYPE>JPEG2000</COMPRESSIONTYPE>\n\t\t<OUTPUTFORMAT>NITF21NCDRD</OUTPUTFORMAT>\n\t\t<IMAGE>\n\t\t\t<SATID>WV01</SATID>\n\t\t\t<MODE>FullSwath</MODE>\n\t\t\t<SCANDIRECTION>Forward</SCANDIRECTION>\n\t\t\t<TLCTIME>1959-11-15T22:24:14.209479Z</TLCTIME>\n\t\t\t<NUMTLC>1</NUMTLC>\n\t\t\t<TLCLISTList>\n\t\t\t\t<TLCLIST>1.010200000000000e+05 0.000000000000000e+00</TLCLIST>\n\t\t\t</TLCLISTList>\n\t\t\t<FIRSTLINETIME>1959-11-15T22:24:10.000312Z</FIRSTLINETIME>\n\t\t\t<AVGLINERATE>2.400000000000000e+04</AVGLINERATE>\n\t\t\t<EXPOSUREDURATION>1.333330000000000e-03</EXPOSUREDURATION>\n\t\t\t<MINCOLLECTEDROWGSD>5.820000000000000e-01</MINCOLLECTEDROWGSD>\n\t\t\t<MAXCOLLECTEDROWGSD>5.830000000000000e-01</MAXCOLLECTEDROWGSD>\n\t\t\t<MEANCOLLECTEDROWGSD>5.820000000000000e-01</MEANCOLLECTEDROWGSD>\n\t\t\t<MINCOLLECTEDCOLGSD>6.760000000000000e-01</MINCOLLECTEDCOLGSD>\n\t\t\t<MAXCOLLECTEDCOLGSD>6.820000000000001e-01</MAXCOLLECTEDCOLGSD>\n\t\t\t<MEANCOLLECTEDCOLGSD>6.790000000000000e-01</MEANCOLLECTEDCOLGSD>\n\t\t\t<MEANCOLLECTEDGSD>6.290000000000000e-01</MEANCOLLECTEDGSD>\n\t\t\t<MEANPRODUCTROWGSD>5.860000000000000e-01</MEANPRODUCTROWGSD>\n\t\t\t<MEANPRODUCTCOLGSD>6.770000000000000e-01</MEANPRODUCTCOLGSD>\n\t\t\t<MEANPRODUCTGSD>6.300000000000000e-01</MEANPRODUCTGSD>\n\t\t\t<ROWUNCERTAINTY>3.294000000000000e+01</ROWUNCERTAINTY>\n\t\t\t<COLUNCERTAINTY>7.561000000000000e+01</COLUNCERTAINTY>\n\t\t\t<MINSUNAZ>1.870000000000000e+02</MINSUNAZ>\n\t\t\t<MAXSUNAZ>1.871000000000000e+02</MAXSUNAZ>\n\t\t\t<MEANSUNAZ>1.871000000000000e+02</MEANSUNAZ>\n\t\t\t<MINSUNEL>4.390000000000000e+01</MINSUNEL>\n\t\t\t<MAXSUNEL>4.410000000000000e+01</MAXSUNEL>\n\t\t\t<MEANSUNEL>4.400000000000000e+01</MEANSUNEL>\n\t\t\t<MINSATAZ>2.570000000000000e+02</MINSATAZ>\n\t\t\t<MAXSATAZ>2.595000000000000e+02</MAXSATAZ>\n\t\t\t<MEANSATAZ>2.582000000000000e+02</MEANSATAZ>\n\t\t\t<MINSATEL>5.860000000000000e+01</MINSATEL>\n\t\t\t<MAXSATEL>5.950000000000000e+01</MAXSATEL>\n\t\t\t<MEANSATEL>5.910000000000000e+01</MEANSATEL>\n\t\t\t<MININTRACKVIEWANGLE>-1.780000000000000e+01</MININTRACKVIEWANGLE>\n\t\t\t<MAXINTRACKVIEWANGLE>-1.650000000000000e+01</MAXINTRACKVIEWANGLE>\n\t\t\t<MEANINTRACKVIEWANGLE>-1.710000000000000e+01</MEANINTRACKVIEWANGLE>\n\t\t\t<MINCROSSTRACKVIEWANGLE>-2.370000000000000e+01</MINCROSSTRACKVIEWANGLE>\n\t\t\t<MAXCROSSTRACKVIEWANGLE>-2.230000000000000e+01</MAXCROSSTRACKVIEWANGLE>\n\t\t\t<MEANCROSSTRACKVIEWANGLE>-2.300000000000000e+01</MEANCROSSTRACKVIEWANGLE>\n\t\t\t<MINOFFNADIRVIEWANGLE>2.830000000000000e+01</MINOFFNADIRVIEWANGLE>\n\t\t\t<MAXOFFNADIRVIEWANGLE>2.830000000000000e+01</MAXOFFNADIRVIEWANGLE>\n\t\t\t<MEANOFFNADIRVIEWANGLE>2.830000000000000e+01</MEANOFFNADIRVIEWANGLE>\n\t\t\t<PNIIRS>4.700000000000000e+00</PNIIRS>\n\t\t\t<CLOUDCOVER>2.000000000000000e-02</CLOUDCOVER>\n\t\t\t<RESAMPLINGKERNEL>CC</RESAMPLINGKERNEL>\n\t\t\t<POSITIONKNOWLEDGESRC>R</POSITIONKNOWLEDGESRC>\n\t\t\t<ATTITUDEKNOWLEDGESRC>R</ATTITUDEKNOWLEDGESRC>\n\t\t\t<REVNUMBER>26387</REVNUMBER>\n\t\t</IMAGE>\n\t</IMD>\n\t<EPH>\n\t\t<SATID>Imaginary1</SATID>\n\t\t<GENERATIONTIME>1959-11-15T23:10:47.429131Z</GENERATIONTIME>\n\t\t<STARTTIME>1959-11-15T22:23:59.803099Z</STARTTIME>\n\t\t<NUMPOINTS>1031</NUMPOINTS>\n\t\t<TIMEINTERVAL>2.000000000000000e-02</TIMEINTERVAL>\n\t\t<EPHEMLISTList>\n\t\t\t<EPHEMLIST>1.000000000000000e+00 -2.222801220490064e+06 -9.762394661473891e+05 6.418958437574347e+06 -7.264228935222518e+03 8.299702698268845e+00 -2.508742481120458e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.000000000000000e+00 -2.222946504075846e+06 -9.762392996922520e+05 6.418908261298127e+06 -7.264174485733922e+03 8.344852287009303e+00 -2.508900782518880e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.000000000000000e+00 -2.223091786556884e+06 -9.762391323337869e+05 6.418858081861349e+06 -7.264120031792038e+03 8.390002324739243e+00 -2.509059084882994e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.000000000000000e+00 -2.223237067967512e+06 -9.762389640727162e+05 6.418807899252011e+06 -7.264065574168916e+03 8.435152563402482e+00 -2.509217385983949e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.000000000000000e+00 -2.223382348290439e+06 -9.762387949086854e+05 6.418757713476153e+06 -7.264011112829769e+03 8.480302142865838e+00 -2.509375685868814e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.000000000000000e+00 -2.223527627557777e+06 -9.762386248423835e+05 6.418707524522544e+06 -7.263956647356594e+03 8.525451700741257e+00 -2.509533985774678e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.000000000000000e+00 -2.223672905672717e+06 -9.762384538717479e+05 6.418657332425038e+06 -7.263902179036207e+03 8.570601215894129e+00 -2.509692282012013e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.000000000000000e+00 -2.223818182667155e+06 -9.762382819974745e+05 6.418607137172480e+06 -7.263847707332437e+03 8.615749776792455e+00 -2.509850576062117e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.000000000000000e+00 -2.223963458703341e+06 -9.762381092230049e+05 6.418556938708129e+06 -7.263793230419710e+03 8.660899434079738e+00 -2.510008873281924e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.000000000000000e+01 -2.224108733619083e+06 -9.762379355449006e+05 6.418506737088706e+06 -7.263738750272652e+03 8.706048516209876e+00 -2.510167167910249e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.100000000000000e+01 -2.224254007414096e+06 -9.762377609631632e+05 6.418456532314301e+06 -7.263684266648410e+03 8.751197098205381e+00 -2.510325460647801e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.200000000000000e+01 -2.224399280023964e+06 -9.762375854764269e+05 6.418406324407458e+06 -7.263629780628594e+03 8.796345261921402e+00 -2.510483748400926e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.300000000000000e+01 -2.224544551707455e+06 -9.762374090901923e+05 6.418356113277656e+06 -7.263575288924545e+03 8.841494070283005e+00 -2.510642040656624e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.400000000000000e+01 -2.224689822205239e+06 -9.762372317989608e+05 6.418305899015607e+06 -7.263520794640564e+03 8.886642014386581e+00 -2.510800328429023e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.500000000000000e+01 -2.224835091614793e+06 -9.762370536048014e+05 6.418255681587212e+06 -7.263466296676665e+03 8.931790072653996e+00 -2.510958614929335e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.600000000000000e+01 -2.224980360000610e+06 -9.762368745090910e+05 6.418205460969910e+06 -7.263411794352536e+03 8.976938138653622e+00 -2.511116902099589e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.700000000000000e+01 -2.225125627265249e+06 -9.762366945097694e+05 6.418155237197781e+06 -7.263357288554137e+03 9.022085744384384e+00 -2.511275187373452e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.800000000000000e+01 -2.225270893506212e+06 -9.762365136089015e+05 6.418105010236717e+06 -7.263302778385054e+03 9.067233903704874e+00 -2.511433473380050e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.900000000000000e+01 -2.225416158593678e+06 -9.762363318037436e+05 6.418054780132135e+06 -7.263248265257948e+03 9.112381270213348e+00 -2.511591755991595e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.000000000000000e+01 -2.225561422624520e+06 -9.762361490963558e+05 6.418004546850143e+06 -7.263193748059746e+03 9.157528628190164e+00 -2.511750038443510e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.100000000000000e+01 -2.225706685534311e+06 -9.762359654853769e+05 6.417954310413283e+06 -7.263139227531511e+03 9.202675829184471e+00 -2.511908318604733e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.200000000000000e+01 -2.225851947290187e+06 -9.762357809701157e+05 6.417904070833060e+06 -7.263084704066678e+03 9.247822320081610e+00 -2.512066595315422e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.300000000000000e+01 -2.225997208022004e+06 -9.762355955533232e+05 6.417853828064018e+06 -7.263030176166919e+03 9.292969331345205e+00 -2.512224872940329e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.400000000000000e+01 -2.226142467664721e+06 -9.762354092336313e+05 6.417803582128925e+06 -7.262975644546981e+03 9.338115845718903e+00 -2.512383149371044e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.500000000000000e+01 -2.226287726218063e+06 -9.762352220110417e+05 6.417753333027874e+06 -7.262921109246512e+03 9.383262225226673e+00 -2.512541424516107e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.600000000000000e+01 -2.226432983649987e+06 -9.762350338848740e+05 6.417703080772087e+06 -7.262866570660811e+03 9.428408416583352e+00 -2.512699697240921e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.700000000000000e+01 -2.226578240057349e+06 -9.762348448571857e+05 6.417652825327642e+06 -7.262812027510614e+03 9.473554813452608e+00 -2.512857971230831e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.800000000000000e+01 -2.226723495342726e+06 -9.762346549259251e+05 6.417602566728654e+06 -7.262757481135056e+03 9.518700518051190e+00 -2.513016242598459e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.900000000000000e+01 -2.226868749474091e+06 -9.762344640904082e+05 6.417552304986341e+06 -7.262702931814838e+03 9.563846320463625e+00 -2.513174510588916e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.000000000000000e+01 -2.227014002677802e+06 -9.762342723554372e+05 6.417502040021427e+06 -7.262648376861761e+03 9.608992398810472e+00 -2.513332782905300e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.100000000000000e+01 -2.227159254662174e+06 -9.762340797148480e+05 6.417451771936062e+06 -7.262593819703276e+03 9.654137450870252e+00 -2.513491049660910e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.200000000000000e+01 -2.227304505589447e+06 -9.762338861720717e+05 6.417401500673431e+06 -7.262539258542560e+03 9.699283065144556e+00 -2.513649316093787e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.300000000000000e+01 -2.227449755426746e+06 -9.762336917264222e+05 6.417351226245038e+06 -7.262484693615137e+03 9.744427944044759e+00 -2.513807581451105e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.400000000000000e+01 -2.227595004174415e+06 -9.762334963779048e+05 6.417300948650766e+06 -7.262430125041596e+03 9.789573204960789e+00 -2.513965845455781e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.500000000000000e+01 -2.227740251864550e+06 -9.762333001272082e+05 6.417250667879372e+06 -7.262375552391281e+03 9.834718137910215e+00 -2.514124109296526e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.600000000000000e+01 -2.227885498367364e+06 -9.762331029715985e+05 6.417200383976322e+06 -7.262320977152334e+03 9.879862274242043e+00 -2.514282368688424e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.700000000000000e+01 -2.228030743845081e+06 -9.762329049144981e+05 6.417150096884779e+06 -7.262266397452642e+03 9.925007014233586e+00 -2.514440629071213e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.800000000000000e+01 -2.228175988297408e+06 -9.762327059559070e+05 6.417099806604841e+06 -7.262211813346097e+03 9.970151766529341e+00 -2.514598890254409e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.900000000000000e+01 -2.228321231529819e+06 -9.762325060917344e+05 6.417049513204670e+06 -7.262157226970944e+03 1.001529522587941e+01 -2.514757146044110e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.000000000000000e+01 -2.228466473736913e+06 -9.762323053260787e+05 6.416999216616081e+06 -7.262102636264811e+03 1.006043960728894e+01 -2.514915402472448e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.100000000000000e+01 -2.228611714918394e+06 -9.762321036589452e+05 6.416948916839161e+06 -7.262048040987794e+03 1.010558363612131e+01 -2.515073660147668e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.200000000000000e+01 -2.228756954976866e+06 -9.762319010882879e+05 6.416898613908052e+06 -7.261993442426713e+03 1.015072724613623e+01 -2.515231915386327e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.300000000000000e+01 -2.228902193847919e+06 -9.762316976127394e+05 6.416848307845327e+06 -7.261938841313643e+03 1.019587083757781e+01 -2.515390166120183e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.400000000000000e+01 -2.229047431693146e+06 -9.762314932357246e+05 6.416797998594352e+06 -7.261884235800171e+03 1.024101407028749e+01 -2.515548417612977e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.500000000000000e+01 -2.229192668447507e+06 -9.762312879558778e+05 6.416747686177910e+06 -7.261829626471571e+03 1.028615700328029e+01 -2.515706668195006e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.600000000000000e+01 -2.229337904176100e+06 -9.762310817745655e+05 6.416697370573186e+06 -7.261775012787320e+03 1.033130072362641e+01 -2.515864919476838e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.700000000000000e+01 -2.229483138748933e+06 -9.762308746890620e+05 6.416647051825749e+06 -7.261720396076477e+03 1.037644328533329e+01 -2.516023167542001e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.800000000000000e+01 -2.229628372166368e+06 -9.762306666993754e+05 6.416596729935484e+06 -7.261665776526232e+03 1.042158587045648e+01 -2.516181411927512e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.900000000000000e+01 -2.229773604622338e+06 -9.762304578095946e+05 6.416546404834370e+06 -7.261611151667031e+03 1.046672878972029e+01 -2.516339659709405e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.000000000000000e+01 -2.229918835922332e+06 -9.762302480156344e+05 6.416496076590627e+06 -7.261556523948009e+03 1.051187095258516e+01 -2.516497903822862e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.100000000000000e+01 -2.230064066099067e+06 -9.762300373181815e+05 6.416445745192776e+06 -7.261501892868266e+03 1.055701317409890e+01 -2.516656145748804e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.200000000000000e+01 -2.230209295217008e+06 -9.762298257186024e+05 6.416395410618213e+06 -7.261447257735346e+03 1.060215518674352e+01 -2.516814387449516e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.300000000000000e+01 -2.230354523243494e+06 -9.762296132162154e+05 6.416345072878383e+06 -7.261392618878507e+03 1.064729686610198e+01 -2.516972627976704e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.400000000000000e+01 -2.230499750178876e+06 -9.762293998110276e+05 6.416294731973168e+06 -7.261337976364875e+03 1.069243875764477e+01 -2.517130867171531e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.500000000000000e+01 -2.230644975990499e+06 -9.762291855023596e+05 6.416244387914021e+06 -7.261283330477082e+03 1.073758026670151e+01 -2.517289104190851e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.600000000000000e+01 -2.230790200775180e+06 -9.762289702922566e+05 6.416194040666972e+06 -7.261228680159393e+03 1.078272144299569e+01 -2.517447342053132e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.700000000000000e+01 -2.230935424500903e+06 -9.762287541800385e+05 6.416143690243252e+06 -7.261174025789190e+03 1.082786336016642e+01 -2.517605579744938e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.800000000000000e+01 -2.231080646940582e+06 -9.762285371609494e+05 6.416093336722544e+06 -7.261119369978144e+03 1.087300343663250e+01 -2.517763809652258e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.900000000000000e+01 -2.231225868483008e+06 -9.762283192431564e+05 6.416042979968419e+06 -7.261064708195913e+03 1.091814499134819e+01 -2.517922044912900e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.000000000000000e+01 -2.231371088868929e+06 -9.762281004212215e+05 6.415992620071852e+06 -7.261010043482304e+03 1.096328563680521e+01 -2.518080276702047e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.100000000000000e+01 -2.231516308098070e+06 -9.762278806951455e+05 6.415942257032936e+06 -7.260955375766701e+03 1.100842571129837e+01 -2.518238505242176e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.200000000000000e+01 -2.231661526364985e+06 -9.762276600690127e+05 6.415891890783393e+06 -7.260900702962906e+03 1.105356665069667e+01 -2.518396736576059e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.300000000000000e+01 -2.231806743475181e+06 -9.762274385387485e+05 6.415841521391477e+06 -7.260846027095205e+03 1.109870678948562e+01 -2.518554964823839e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.400000000000000e+01 -2.231951959493113e+06 -9.762272161057144e+05 6.415791148834573e+06 -7.260791347589407e+03 1.114384671169674e+01 -2.518713191660116e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.500000000000000e+01 -2.232097174419122e+06 -9.762269927699128e+05 6.415740773112552e+06 -7.260736664367016e+03 1.118898687759852e+01 -2.518871417336663e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.600000000000000e+01 -2.232242388188189e+06 -9.762267685299893e+05 6.415690394248253e+06 -7.260681978299654e+03 1.123412625559797e+01 -2.519029639303707e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.700000000000000e+01 -2.232387600929508e+06 -9.762265433886647e+05 6.415640012196300e+06 -7.260627287620798e+03 1.127926561376307e+01 -2.519187862649443e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.800000000000000e+01 -2.232532812578679e+06 -9.762263173445817e+05 6.415589626979313e+06 -7.260572593403761e+03 1.132440532427609e+01 -2.519346084332788e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.900000000000000e+01 -2.232678023135424e+06 -9.762260903977458e+05 6.415539238597381e+06 -7.260517895355776e+03 1.136954448954958e+01 -2.519504305135269e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.000000000000000e+01 -2.232823232631825e+06 -9.762258625488392e+05 6.415488847039239e+06 -7.260463193273370e+03 1.141468349157597e+01 -2.519662525660359e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.100000000000000e+01 -2.232968440971130e+06 -9.762256337958288e+05 6.415438452338867e+06 -7.260408488275263e+03 1.145982251189335e+01 -2.519820742726959e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.200000000000000e+01 -2.233113648282305e+06 -9.762254041414303e+05 6.415388054450966e+06 -7.260353778803772e+03 1.150496125142513e+01 -2.519978960761429e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.300000000000000e+01 -2.233258854403869e+06 -9.762251735822582e+05 6.415337653432260e+06 -7.260299066839841e+03 1.155009965144654e+01 -2.520137174108826e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.400000000000000e+01 -2.233404059562107e+06 -9.762249421230612e+05 6.415287249203252e+06 -7.260244349547578e+03 1.159523835622798e+01 -2.520295390897845e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.500000000000000e+01 -2.233549263594901e+06 -9.762247097604516e+05 6.415236841820893e+06 -7.260189628995202e+03 1.164037674038130e+01 -2.520453605190823e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.600000000000000e+01 -2.233694466502584e+06 -9.762244764944320e+05 6.415186431285064e+06 -7.260134905073769e+03 1.168551503966358e+01 -2.520611817312907e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.700000000000000e+01 -2.233839668284889e+06 -9.762242423250092e+05 6.415136017595867e+06 -7.260080177949525e+03 1.173065270658770e+01 -2.520770026757359e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.800000000000000e+01 -2.233984869103350e+06 -9.762240072555718e+05 6.415085600696528e+06 -7.260025445461680e+03 1.177579085473053e+01 -2.520928239753083e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.900000000000000e+01 -2.234130068634665e+06 -9.762237712793498e+05 6.415035180700669e+06 -7.259970711725101e+03 1.182092812756582e+01 -2.521086444484370e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.000000000000000e+01 -2.234275267169838e+06 -9.762235344024400e+05 6.414984757506018e+06 -7.259915973070715e+03 1.186606563038612e+01 -2.521244651480436e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.100000000000000e+01 -2.234420464676210e+06 -9.762232966241736e+05 6.414934331124042e+06 -7.259861229880657e+03 1.191120285547586e+01 -2.521402859620641e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.200000000000000e+01 -2.234565660927587e+06 -9.762230579398110e+05 6.414883901634256e+06 -7.259806485047723e+03 1.195633975969261e+01 -2.521561060654926e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.300000000000000e+01 -2.234710856247112e+06 -9.762228183561236e+05 6.414833468923065e+06 -7.259751734481379e+03 1.200147690605573e+01 -2.521719266278977e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.400000000000000e+01 -2.234856050343854e+06 -9.762225778670256e+05 6.414783033092739e+06 -7.259696981809532e+03 1.204661349294980e+01 -2.521877466102363e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.500000000000000e+01 -2.235001243476440e+06 -9.762223364779343e+05 6.414732594052361e+06 -7.259642223963780e+03 1.209175037724762e+01 -2.522035668923075e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.600000000000000e+01 -2.235146435450409e+06 -9.762220941847885e+05 6.414682151870287e+06 -7.259587463061913e+03 1.213688678688615e+01 -2.522193868658212e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.700000000000000e+01 -2.235291626330823e+06 -9.762218509889505e+05 6.414631706523646e+06 -7.259532698520458e+03 1.218202318349526e+01 -2.522352066998567e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.800000000000000e+01 -2.235436816085049e+06 -9.762216068897469e+05 6.414581258023915e+06 -7.259477930737672e+03 1.222715906115926e+01 -2.522510262779043e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.900000000000000e+01 -2.235582004777521e+06 -9.762213618885298e+05 6.414530806348430e+06 -7.259423158741884e+03 1.227229489841977e+01 -2.522668458797272e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.000000000000000e+01 -2.235727192376221e+06 -9.762211159846276e+05 6.414480351508453e+06 -7.259368383166193e+03 1.231743091646842e+01 -2.522826653262292e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.100000000000000e+01 -2.235872378880870e+06 -9.762208691780441e+05 6.414429893504078e+06 -7.259313603861609e+03 1.236256651099424e+01 -2.522984846562532e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.200000000000000e+01 -2.236017564291180e+06 -9.762206214687856e+05 6.414379432335405e+06 -7.259258820796190e+03 1.240770166846443e+01 -2.523143038788194e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.300000000000000e+01 -2.236162748672220e+06 -9.762203728581974e+05 6.414328967979542e+06 -7.259204033349939e+03 1.245283771579639e+01 -2.523301231784594e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.400000000000000e+01 -2.236307931829539e+06 -9.762201233422413e+05 6.414278500504896e+06 -7.259149243710093e+03 1.249797232343923e+01 -2.523459419182035e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.500000000000000e+01 -2.236453113957023e+06 -9.762198729249669e+05 6.414228029843255e+06 -7.259094449551018e+03 1.254310713991018e+01 -2.523617607703827e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.600000000000000e+01 -2.236598294990293e+06 -9.762196216050296e+05 6.414177556017272e+06 -7.259039651837827e+03 1.258824205282934e+01 -2.523775794594038e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.700000000000000e+01 -2.236743474928858e+06 -9.762193693824258e+05 6.414127079027112e+06 -7.258984850307414e+03 1.263337661651954e+01 -2.523933980575478e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.800000000000000e+01 -2.236888653773058e+06 -9.762191162571677e+05 6.414076598872654e+06 -7.258930045092889e+03 1.267851119546941e+01 -2.524092165290757e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.900000000000000e+01 -2.237033831522614e+06 -9.762188622292544e+05 6.414026115554004e+06 -7.258875236283315e+03 1.272364548537760e+01 -2.524250348468134e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.000000000000000e+02 -2.237179008177243e+06 -9.762186072986869e+05 6.413975629071249e+06 -7.258820423628122e+03 1.276877946701507e+01 -2.524408530819973e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.010000000000000e+02 -2.237324183737284e+06 -9.762183514654727e+05 6.413925139424276e+06 -7.258765607393474e+03 1.281391363039870e+01 -2.524566711617592e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.020000000000000e+02 -2.237469358202461e+06 -9.762180947296120e+05 6.413874646613175e+06 -7.258710787404982e+03 1.285904745948585e+01 -2.524724891326777e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.030000000000000e+02 -2.237614531540130e+06 -9.762178370904400e+05 6.413824150649443e+06 -7.258655964091753e+03 1.290418067254296e+01 -2.524883068709224e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.040000000000000e+02 -2.237759703880065e+06 -9.762175785506460e+05 6.413773651487384e+06 -7.258601135960711e+03 1.294931470417561e+01 -2.525041248100494e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.050000000000000e+02 -2.237904875060202e+06 -9.762173191068711e+05 6.413723149184061e+06 -7.258546304898764e+03 1.299444801357913e+01 -2.525199424037628e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.060000000000000e+02 -2.238050045144961e+06 -9.762170587604665e+05 6.413672643716792e+06 -7.258491470154736e+03 1.303958089206824e+01 -2.525357598676294e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.070000000000000e+02 -2.238195214069976e+06 -9.762167975100846e+05 6.413622135108234e+06 -7.258436632497100e+03 1.308471377753938e+01 -2.525515769855603e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.080000000000000e+02 -2.238340382028903e+06 -9.762165353597695e+05 6.413571623290197e+06 -7.258381789524863e+03 1.312984674162479e+01 -2.525673944412663e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.090000000000000e+02 -2.238485548827939e+06 -9.762162723054867e+05 6.413521108330927e+06 -7.258326943710266e+03 1.317497961020925e+01 -2.525832115301499e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.100000000000000e+02 -2.238630714531518e+06 -9.762160083485870e+05 6.413470590207731e+06 -7.258272094164469e+03 1.322011201213007e+01 -2.525990285029555e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.110000000000000e+02 -2.238775879074641e+06 -9.762157434877256e+05 6.413420068943502e+06 -7.258217241695473e+03 1.326524379812162e+01 -2.526148451289161e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.120000000000000e+02 -2.238921042619438e+06 -9.762154777262689e+05 6.413369544481131e+06 -7.258162384361181e+03 1.331037639714327e+01 -2.526306619690600e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.130000000000000e+02 -2.239066205100908e+06 -9.762152110628781e+05 6.413319016843514e+06 -7.258107523005404e+03 1.335550855378418e+01 -2.526464787758278e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.140000000000000e+02 -2.239211366356991e+06 -9.762149434941910e+05 6.413268486087734e+06 -7.258052659405057e+03 1.340063987367506e+01 -2.526622950414279e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.150000000000000e+02 -2.239356526582169e+06 -9.762146750242474e+05 6.413217952145283e+06 -7.257997791380055e+03 1.344577189782981e+01 -2.526781113951593e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.160000000000000e+02 -2.239501685776153e+06 -9.762144056530467e+05 6.413167415016256e+06 -7.257942918936678e+03 1.349090354367263e+01 -2.526939278287700e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.170000000000000e+02 -2.239646843809247e+06 -9.762141353779093e+05 6.413116874746353e+06 -7.257888043542704e+03 1.353603462519621e+01 -2.527097439237044e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.180000000000000e+02 -2.239792000714139e+06 -9.762138641995051e+05 6.413066331324050e+06 -7.257833164788782e+03 1.358116596289108e+01 -2.527255598012709e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.190000000000000e+02 -2.239937156555261e+06 -9.762135921191864e+05 6.413015784726644e+06 -7.257778281996555e+03 1.362629683741818e+01 -2.527413756501176e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.200000000000000e+02 -2.240082311267627e+06 -9.762133191356109e+05 6.412965234977036e+06 -7.257723395846137e+03 1.367142728365351e+01 -2.527571912770568e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.210000000000000e+02 -2.240227464916276e+06 -9.762130452501222e+05 6.412914682052304e+06 -7.257668505731452e+03 1.371655814976131e+01 -2.527730068594445e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.220000000000000e+02 -2.240372617468380e+06 -9.762127704620570e+05 6.412864125964013e+06 -7.257613611769129e+03 1.376168843452439e+01 -2.527888223581780e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.230000000000000e+02 -2.240517768859562e+06 -9.762124947700753e+05 6.412813566734860e+06 -7.257558714994874e+03 1.380681859277024e+01 -2.528046374815280e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.240000000000000e+02 -2.240662919283665e+06 -9.762122181782009e+05 6.412763004296507e+06 -7.257503812955139e+03 1.385194911885978e+01 -2.528204529298786e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.250000000000000e+02 -2.240808068578638e+06 -9.762119406830877e+05 6.412712438706077e+06 -7.257448907563024e+03 1.389707906606932e+01 -2.528362681537865e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.260000000000000e+02 -2.240953216680118e+06 -9.762116622834007e+05 6.412661869986271e+06 -7.257393999715789e+03 1.394220868099927e+01 -2.528520828997244e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.270000000000000e+02 -2.241098363814296e+06 -9.762113829838259e+05 6.412611298057325e+06 -7.257339086551678e+03 1.398733883403418e+01 -2.528678979861807e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.280000000000000e+02 -2.241243509786766e+06 -9.762111027803574e+05 6.412560722987795e+06 -7.257284170495755e+03 1.403246788271849e+01 -2.528837127142319e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.290000000000000e+02 -2.241388654694941e+06 -9.762108216750009e+05 6.412510144743327e+06 -7.257229250391219e+03 1.407759772811559e+01 -2.528995274238589e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.300000000000000e+02 -2.241533798473824e+06 -9.762105396664226e+05 6.412459563346838e+06 -7.257174326880126e+03 1.412272688057669e+01 -2.529153419238172e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.310000000000000e+02 -2.241678941123131e+06 -9.762102567546257e+05 6.412408978798431e+06 -7.257119400170441e+03 1.416785541164100e+01 -2.529311561554646e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.320000000000000e+02 -2.241824082740265e+06 -9.762099729416216e+05 6.412358391063746e+06 -7.257064468876752e+03 1.421298460543133e+01 -2.529469705199851e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.330000000000000e+02 -2.241969223227685e+06 -9.762096882254049e+05 6.412307800177196e+06 -7.257009534398043e+03 1.425811314586315e+01 -2.529627846121542e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.340000000000000e+02 -2.242114362553373e+06 -9.762094026053112e+05 6.412257206150069e+06 -7.256954596915437e+03 1.430324147761286e+01 -2.529785983831823e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.350000000000000e+02 -2.242259500846461e+06 -9.762091160840229e+05 6.412206608936815e+06 -7.256899655045789e+03 1.434836967098028e+01 -2.529944122263723e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.360000000000000e+02 -2.242404638041959e+06 -9.762088286601984e+05 6.412156008560349e+06 -7.256844709390247e+03 1.439349773872337e+01 -2.530102259710312e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.370000000000000e+02 -2.242549774140209e+06 -9.762085403338455e+05 6.412105405020556e+06 -7.256789760042549e+03 1.443862591904534e+01 -2.530260395919343e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.380000000000000e+02 -2.242694909205632e+06 -9.762082511063053e+05 6.412054798294704e+06 -7.256734806323733e+03 1.448375396754145e+01 -2.530418532804445e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.390000000000000e+02 -2.242840043108546e+06 -9.762079609749037e+05 6.412004188428550e+06 -7.256679849582729e+03 1.452888152462177e+01 -2.530576666513799e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.400000000000000e+02 -2.242985175946337e+06 -9.762076699416512e+05 6.411953575387725e+06 -7.256624888806558e+03 1.457400937302461e+01 -2.530734799970012e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.410000000000000e+02 -2.243130307589334e+06 -9.762073780038803e+05 6.411902959217998e+06 -7.256569925476476e+03 1.461913631551479e+01 -2.530892928897020e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.420000000000000e+02 -2.243275438198995e+06 -9.762070851649317e+05 6.411852339862377e+06 -7.256514957675060e+03 1.466426326299987e+01 -2.531051058792454e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.430000000000000e+02 -2.243420567678615e+06 -9.762067914228066e+05 6.411801717354999e+06 -7.256459986600454e+03 1.470939034221655e+01 -2.531209186262157e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.440000000000000e+02 -2.243565696092617e+06 -9.762064967788439e+05 6.411751091673122e+06 -7.256405011434294e+03 1.475451709470633e+01 -2.531367313602305e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.450000000000000e+02 -2.243710823440713e+06 -9.762062012330471e+05 6.411700462816841e+06 -7.256350032168037e+03 1.479964362683387e+01 -2.531525440843197e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.460000000000000e+02 -2.243855949658542e+06 -9.762059047840799e+05 6.411649830808877e+06 -7.256295049635913e+03 1.484477039965543e+01 -2.531683565644057e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.470000000000000e+02 -2.244001074777972e+06 -9.762056074326185e+05 6.411599195637976e+06 -7.256240063298557e+03 1.488989651474790e+01 -2.531841689482989e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.480000000000000e+02 -2.244146198734652e+06 -9.762053091773308e+05 6.411548557326872e+06 -7.256185074187699e+03 1.493502257952642e+01 -2.531999809467945e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.490000000000000e+02 -2.244291321754723e+06 -9.762050100228870e+05 6.411497915795693e+06 -7.256130079361819e+03 1.498014903005921e+01 -2.532157933971541e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.500000000000000e+02 -2.244436443579126e+06 -9.762047099639594e+05 6.411447271135923e+06 -7.256075081946569e+03 1.502527449741578e+01 -2.532316054043858e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.510000000000000e+02 -2.244581564208211e+06 -9.762044090005468e+05 6.411396623347455e+06 -7.256020082139426e+03 1.507040007376628e+01 -2.532474169189424e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.520000000000000e+02 -2.244726683835776e+06 -9.762041071366593e+05 6.411345972361827e+06 -7.255965077377676e+03 1.511552537754619e+01 -2.532632286656735e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.530000000000000e+02 -2.244871802429182e+06 -9.762038043716216e+05 6.411295318190562e+06 -7.255910068159348e+03 1.516065091413142e+01 -2.532790405061939e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.540000000000000e+02 -2.245016919859400e+06 -9.762035007027850e+05 6.411244660879246e+06 -7.255855056077799e+03 1.520577622015389e+01 -2.532948519857866e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.550000000000000e+02 -2.245162036190828e+06 -9.762031961314733e+05 6.411194000405123e+06 -7.255800040267183e+03 1.525090130833880e+01 -2.533106633501543e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.560000000000000e+02 -2.245307151390841e+06 -9.762028906570346e+05 6.411143336779720e+06 -7.255745021103322e+03 1.529602554176321e+01 -2.533264744889782e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.570000000000000e+02 -2.245452265492130e+06 -9.762025842801320e+05 6.411092669991486e+06 -7.255689998274752e+03 1.534115029319969e+01 -2.533422854986494e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.580000000000000e+02 -2.245597378558898e+06 -9.762022770021001e+05 6.411042000017733e+06 -7.255634971003892e+03 1.538627478482707e+01 -2.533580965951110e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.590000000000000e+02 -2.245742490494446e+06 -9.762019688209493e+05 6.410991326892632e+06 -7.255579940414762e+03 1.543139918742489e+01 -2.533739074606035e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.600000000000000e+02 -2.245887601330840e+06 -9.762016597373436e+05 6.410940650604848e+06 -7.255524906146361e+03 1.547652341326278e+01 -2.533897181969895e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.610000000000000e+02 -2.246032711067799e+06 -9.762013497512885e+05 6.410889971154479e+06 -7.255469868133749e+03 1.552164718864483e+01 -2.534055288210798e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.620000000000000e+02 -2.246177819770346e+06 -9.762010388641167e+05 6.410839288518536e+06 -7.255414825672724e+03 1.556677156189980e+01 -2.534213395386400e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.630000000000000e+02 -2.246322927276490e+06 -9.762007270725099e+05 6.410788602754284e+06 -7.255359780669723e+03 1.561189493900267e+01 -2.534371497998826e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.640000000000000e+02 -2.246468033715319e+06 -9.762004143791284e+05 6.410737913816092e+06 -7.255304731638615e+03 1.565701823557464e+01 -2.534529600314765e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.650000000000000e+02 -2.246613139054828e+06 -9.762001007833097e+05 6.410687221715266e+06 -7.255249678860847e+03 1.570214175510915e+01 -2.534687701554052e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.660000000000000e+02 -2.246758243294743e+06 -9.761997862850594e+05 6.410636526451908e+06 -7.255194622433674e+03 1.574726483672438e+01 -2.534845801402397e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.670000000000000e+02 -2.246903346434780e+06 -9.761994708843809e+05 6.410585828026114e+06 -7.255139562244740e+03 1.579238767329514e+01 -2.535003900189502e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.680000000000000e+02 -2.247048448475275e+06 -9.761991545812733e+05 6.410535126437766e+06 -7.255084498446680e+03 1.583751068097655e+01 -2.535161997507118e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.690000000000000e+02 -2.247193549415949e+06 -9.761988373757456e+05 6.410484421686955e+06 -7.255029430872703e+03 1.588263323008761e+01 -2.535320093791124e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.700000000000000e+02 -2.247338649256526e+06 -9.761985192678004e+05 6.410433713773784e+06 -7.254974359611382e+03 1.592775547451049e+01 -2.535478188799522e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.710000000000000e+02 -2.247483747932653e+06 -9.761982002561082e+05 6.410383002721014e+06 -7.254919285521721e+03 1.597287775645054e+01 -2.535636280118624e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.720000000000000e+02 -2.247628845573216e+06 -9.761978803433324e+05 6.410332288483055e+06 -7.254864206869844e+03 1.601799962533593e+01 -2.535794372634580e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.730000000000000e+02 -2.247773942178557e+06 -9.761975595294730e+05 6.410281571059783e+06 -7.254809123832198e+03 1.606312209584587e+01 -2.535952465906213e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.740000000000000e+02 -2.247919037554342e+06 -9.761972378105585e+05 6.410230850519938e+06 -7.254754038556172e+03 1.610824347513730e+01 -2.536110553751933e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.750000000000000e+02 -2.248064131894339e+06 -9.761969151905648e+05 6.410180126794977e+06 -7.254698948878755e+03 1.615336497973783e+01 -2.536268642369822e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.760000000000000e+02 -2.248209225198892e+06 -9.761965916694980e+05 6.410129399884772e+06 -7.254643854700857e+03 1.619848700995956e+01 -2.536426732063420e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.770000000000000e+02 -2.248354317370688e+06 -9.761962672453696e+05 6.410078669823746e+06 -7.254588757202484e+03 1.624360842950477e+01 -2.536584819424367e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.780000000000000e+02 -2.248499408409451e+06 -9.761959419181907e+05 6.410027936612004e+06 -7.254533656403550e+03 1.628872929972317e+01 -2.536742904400086e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.790000000000000e+02 -2.248644498250844e+06 -9.761956156866340e+05 6.409977200272321e+06 -7.254478553138179e+03 1.633385005295492e+01 -2.536900984654151e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.800000000000000e+02 -2.248789587088623e+06 -9.761952885546798e+05 6.409926460736115e+06 -7.254423444958733e+03 1.637897069312925e+01 -2.537059067117581e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.810000000000000e+02 -2.248934674825490e+06 -9.761949605203446e+05 6.409875718037823e+06 -7.254368333111297e+03 1.642409107915265e+01 -2.537217148253622e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.820000000000000e+02 -2.249079761558804e+06 -9.761946315856120e+05 6.409824972142980e+06 -7.254313216368403e+03 1.646921234929860e+01 -2.537375231603338e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.830000000000000e+02 -2.249224847029350e+06 -9.761943017451941e+05 6.409774223143336e+06 -7.254258097858086e+03 1.651433211845256e+01 -2.537533308172713e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.840000000000000e+02 -2.249369931463862e+06 -9.761939710037307e+05 6.409723470958643e+06 -7.254202974935145e+03 1.655945232155528e+01 -2.537691385562714e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.850000000000000e+02 -2.249515014797376e+06 -9.761936393598962e+05 6.409672715611886e+06 -7.254147848334892e+03 1.660457236583454e+01 -2.537849461657293e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.860000000000000e+02 -2.249660096964919e+06 -9.761933068123778e+05 6.409621957126074e+06 -7.254092718746881e+03 1.664969143769287e+01 -2.538007534457659e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.870000000000000e+02 -2.249805178160877e+06 -9.761929733651361e+05 6.409571195432371e+06 -7.254037583942979e+03 1.669481169644769e+01 -2.538165610395130e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.880000000000000e+02 -2.249950258223276e+06 -9.761926390148759e+05 6.409520430588134e+06 -7.253982445848387e+03 1.673993131166571e+01 -2.538323683914665e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.890000000000000e+02 -2.250095337119489e+06 -9.761923037609409e+05 6.409469662604916e+06 -7.253927304822898e+03 1.678505010042818e+01 -2.538481753987874e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.900000000000000e+02 -2.250240414946879e+06 -9.761919676053105e+05 6.409418891448236e+06 -7.253872159722872e+03 1.683016952809135e+01 -2.538639823936006e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.910000000000000e+02 -2.250385491672823e+06 -9.761916305473369e+05 6.409368117129645e+06 -7.253817010897326e+03 1.687528830231508e+01 -2.538797892696417e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.920000000000000e+02 -2.250530567329373e+06 -9.761912925876711e+05 6.409317339637788e+06 -7.253761858023312e+03 1.692040715958294e+01 -2.538955961225416e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.930000000000000e+02 -2.250675641884537e+06 -9.761909537256636e+05 6.409266558983996e+06 -7.253706701446583e+03 1.696552618351660e+01 -2.539114028549588e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.940000000000000e+02 -2.250820715273364e+06 -9.761906139600022e+05 6.409215775191281e+06 -7.253651541964365e+03 1.701064428619634e+01 -2.539272092350879e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.950000000000000e+02 -2.250965787592576e+06 -9.761902732926632e+05 6.409164988225373e+06 -7.253596378377165e+03 1.705576232754885e+01 -2.539430156072201e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.960000000000000e+02 -2.251110858810187e+06 -9.761899317229933e+05 6.409114198097605e+06 -7.253541211116544e+03 1.710088073958048e+01 -2.539588218517780e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.970000000000000e+02 -2.251255928861023e+06 -9.761895892496754e+05 6.409063404831070e+06 -7.253486040954023e+03 1.714599804151328e+01 -2.539746277420089e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.980000000000000e+02 -2.251400997939448e+06 -9.761892458766667e+05 6.409012608356888e+06 -7.253430865500102e+03 1.719111634927393e+01 -2.539904339658987e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.990000000000000e+02 -2.251546065851166e+06 -9.761889016000225e+05 6.408961808743915e+06 -7.253375687162015e+03 1.723623381542677e+01 -2.540062398320029e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.000000000000000e+02 -2.251691132692903e+06 -9.761885564217156e+05 6.408911005957865e+06 -7.253320504705408e+03 1.728135125337496e+01 -2.540220456940704e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.010000000000000e+02 -2.251836198335653e+06 -9.761882103391176e+05 6.408860200044472e+06 -7.253265319821745e+03 1.732646842368732e+01 -2.540378510724880e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.020000000000000e+02 -2.251981263005489e+06 -9.761878633568403e+05 6.408809390923590e+06 -7.253210129592512e+03 1.737158578368823e+01 -2.540536567950292e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.030000000000000e+02 -2.252126326540447e+06 -9.761875154715970e+05 6.408758578652632e+06 -7.253154936041372e+03 1.741670272552642e+01 -2.540694622860402e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.040000000000000e+02 -2.252271388908538e+06 -9.761871666827336e+05 6.408707763242941e+06 -7.253099739613159e+03 1.746181940209743e+01 -2.540852674206894e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.050000000000000e+02 -2.252416450141820e+06 -9.761868169909077e+05 6.408656944683155e+06 -7.253044539917420e+03 1.750693576848221e+01 -2.541010723091247e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.060000000000000e+02 -2.252561510401667e+06 -9.761864663994181e+05 6.408606122916052e+06 -7.252989334936833e+03 1.755205205934448e+01 -2.541168775228591e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.070000000000000e+02 -2.252706569429767e+06 -9.761861149030013e+05 6.408555298033222e+06 -7.252934127824682e+03 1.759716833890374e+01 -2.541326821710551e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.080000000000000e+02 -2.252851627354954e+06 -9.761857625042954e+05 6.408504469988983e+06 -7.252878917005045e+03 1.764228375235842e+01 -2.541484866941941e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.090000000000000e+02 -2.252996684306909e+06 -9.761854092059255e+05 6.408453638737344e+06 -7.252823700979831e+03 1.768740029542960e+01 -2.541642915270889e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.100000000000000e+02 -2.253141740091343e+06 -9.761850550039602e+05 6.408402804347203e+06 -7.252768482000935e+03 1.773251588106552e+01 -2.541800960213626e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.110000000000000e+02 -2.253286794804986e+06 -9.761846999003693e+05 6.408351966784251e+06 -7.252713258920556e+03 1.777763145829954e+01 -2.541959005068087e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.120000000000000e+02 -2.253431848383504e+06 -9.761843438938425e+05 6.408301126071312e+06 -7.252658032596400e+03 1.782274708139130e+01 -2.542117047414124e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.130000000000000e+02 -2.253576900826617e+06 -9.761839869843854e+05 6.408250282208480e+06 -7.252602802923892e+03 1.786786211529096e+01 -2.542275087510828e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.140000000000000e+02 -2.253721952134045e+06 -9.761836291720015e+05 6.408199435195860e+06 -7.252547569977336e+03 1.791297649373871e+01 -2.542433125144715e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.150000000000000e+02 -2.253867002435461e+06 -9.761832704593166e+05 6.408148584987444e+06 -7.252492332171183e+03 1.795809184761706e+01 -2.542591164888202e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.160000000000000e+02 -2.254012051665914e+06 -9.761829108450237e+05 6.408097731606266e+06 -7.252437090256649e+03 1.800320685291084e+01 -2.542749204542732e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.170000000000000e+02 -2.254157099728132e+06 -9.761825503271590e+05 6.408046875086843e+06 -7.252381845418506e+03 1.804832110851902e+01 -2.542907240739207e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.180000000000000e+02 -2.254302146687111e+06 -9.761821889070326e+05 6.407996015406108e+06 -7.252326596849948e+03 1.809343581358942e+01 -2.543065275825335e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.190000000000000e+02 -2.254447192477921e+06 -9.761818265833430e+05 6.407945152587113e+06 -7.252271345475277e+03 1.813854964321774e+01 -2.543223307115012e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.200000000000000e+02 -2.254592237294252e+06 -9.761814633600246e+05 6.407894286561110e+06 -7.252216088818151e+03 1.818366368596332e+01 -2.543381341663135e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.210000000000000e+02 -2.254737280974802e+06 -9.761810992338011e+05 6.407843417385344e+06 -7.252160828825191e+03 1.822877803829599e+01 -2.543539373978544e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.220000000000000e+02 -2.254882323519072e+06 -9.761807342046768e+05 6.407792545059989e+06 -7.252105565497838e+03 1.827389152959029e+01 -2.543697403990095e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.230000000000000e+02 -2.255027364862756e+06 -9.761803682713486e+05 6.407741669607882e+06 -7.252050299741470e+03 1.831900468667067e+01 -2.543855429172573e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.240000000000000e+02 -2.255172405199546e+06 -9.761800014377495e+05 6.407690790960260e+06 -7.251995029056159e+03 1.836411801211739e+01 -2.544013456611972e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.250000000000000e+02 -2.255317444432172e+06 -9.761796337019160e+05 6.407639909151650e+06 -7.251939754723710e+03 1.840923090235506e+01 -2.544171482655080e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.260000000000000e+02 -2.255462482593299e+06 -9.761792650645007e+05 6.407589024170448e+06 -7.251884476245212e+03 1.845434453793041e+01 -2.544329508777763e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.270000000000000e+02 -2.255607519585665e+06 -9.761788955235548e+05 6.407538136051194e+06 -7.251829194908614e+03 1.849945697703268e+01 -2.544487531233613e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.280000000000000e+02 -2.255752555538298e+06 -9.761785250816899e+05 6.407487244748071e+06 -7.251773909084455e+03 1.854456967744179e+01 -2.544645554704907e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.290000000000000e+02 -2.255897590419215e+06 -9.761781537382563e+05 6.407436350272426e+06 -7.251718619158844e+03 1.858968284791806e+01 -2.544803578113645e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.300000000000000e+02 -2.256042624066499e+06 -9.761777814899941e+05 6.407385452681773e+06 -7.251663327138933e+03 1.863479462323534e+01 -2.544961595689556e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.310000000000000e+02 -2.256187656673824e+06 -9.761774083408242e+05 6.407334551907319e+06 -7.251608030586530e+03 1.867990669366881e+01 -2.545119614409290e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.320000000000000e+02 -2.256332688209211e+06 -9.761770342900966e+05 6.407283647960421e+06 -7.251552730011998e+03 1.872501900665185e+01 -2.545277632829525e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.330000000000000e+02 -2.256477718575184e+06 -9.761766593358547e+05 6.407232740875702e+06 -7.251497426506449e+03 1.877013043759834e+01 -2.545435647807777e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.340000000000000e+02 -2.256622747901402e+06 -9.761762834807161e+05 6.407181830607105e+06 -7.251442118507946e+03 1.881524252866518e+01 -2.545593663838546e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.350000000000000e+02 -2.256767776090594e+06 -9.761759067227234e+05 6.407130917189181e+06 -7.251386807237426e+03 1.886035397930775e+01 -2.545751677403237e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.360000000000000e+02 -2.256912803174808e+06 -9.761755290625326e+05 6.407080000610543e+06 -7.251331492235109e+03 1.890546513535401e+01 -2.545909689818640e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.370000000000000e+02 -2.257057829122053e+06 -9.761751504994944e+05 6.407029080882560e+06 -7.251276173953891e+03 1.895057625941448e+01 -2.546067699822551e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.380000000000000e+02 -2.257202854029040e+06 -9.761747710355732e+05 6.406978157970867e+06 -7.251220851246625e+03 1.899568739066532e+01 -2.546225710652249e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.390000000000000e+02 -2.257347877798504e+06 -9.761743906688158e+05 6.406927231910021e+06 -7.251165525156393e+03 1.904079786319170e+01 -2.546383719328089e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.400000000000000e+02 -2.257492900463105e+06 -9.761740093998696e+05 6.406876302688416e+06 -7.251110195440440e+03 1.908590893363726e+01 -2.546541726606543e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.410000000000000e+02 -2.257637922054892e+06 -9.761736272293968e+05 6.406825370294660e+06 -7.251054861600452e+03 1.913101941590381e+01 -2.546699733824709e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.420000000000000e+02 -2.257782942476608e+06 -9.761732441554450e+05 6.406774434763321e+06 -7.250999524862002e+03 1.917612925975487e+01 -2.546857737524530e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.430000000000000e+02 -2.257927961760926e+06 -9.761728601786678e+05 6.406723496082791e+06 -7.250944184831238e+03 1.922123933909918e+01 -2.547015738866589e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.440000000000000e+02 -2.258072980069175e+06 -9.761724753023235e+05 6.406672554195707e+06 -7.250888839507771e+03 1.926634974175323e+01 -2.547173743494609e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.450000000000000e+02 -2.258217997174809e+06 -9.761720895218625e+05 6.406621609182614e+06 -7.250833491685590e+03 1.931145895573098e+01 -2.547331743446496e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.460000000000000e+02 -2.258363013207464e+06 -9.761717028398879e+05 6.406570660997418e+06 -7.250778139822411e+03 1.935656883872301e+01 -2.547489743175607e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.470000000000000e+02 -2.258508028134332e+06 -9.761713152557552e+05 6.406519709651785e+06 -7.250722784229424e+03 1.940167797620390e+01 -2.547647741724049e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.480000000000000e+02 -2.258653041955751e+06 -9.761709267694647e+05 6.406468755145592e+06 -7.250667424936108e+03 1.944678753119149e+01 -2.547805739075086e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.490000000000000e+02 -2.258798054736085e+06 -9.761705373823206e+05 6.406417797455946e+06 -7.250612061180459e+03 1.949189702401000e+01 -2.547963737348427e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.500000000000000e+02 -2.258943066248792e+06 -9.761701470897774e+05 6.406366836663417e+06 -7.250556695688375e+03 1.953700508669993e+01 -2.548121728785434e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.510000000000000e+02 -2.259088076849764e+06 -9.761697558989889e+05 6.406315872641427e+06 -7.250501324189212e+03 1.958211467827675e+01 -2.548279725587621e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.520000000000000e+02 -2.259233086280143e+06 -9.761693638047561e+05 6.406264905482039e+06 -7.250445949730054e+03 1.962722340511843e+01 -2.548437719033239e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.530000000000000e+02 -2.259378094507316e+06 -9.761689708064343e+05 6.406213935196859e+06 -7.250390572745212e+03 1.967233123577631e+01 -2.548595707897553e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.540000000000000e+02 -2.259523101660923e+06 -9.761685769066258e+05 6.406162961739775e+06 -7.250335191737430e+03 1.971743953118718e+01 -2.548753696476076e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.550000000000000e+02 -2.259668107772999e+06 -9.761681821059863e+05 6.406111985099382e+06 -7.250279806233439e+03 1.976254772881464e+01 -2.548911686069591e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.560000000000000e+02 -2.259813112746298e+06 -9.761677864025687e+05 6.406061005310273e+06 -7.250224417370937e+03 1.980765538643200e+01 -2.549069673448323e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.570000000000000e+02 -2.259958116581165e+06 -9.761673897963723e+05 6.406010022372332e+06 -7.250169025278923e+03 1.985276326677109e+01 -2.549227658292557e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.580000000000000e+02 -2.260103119341744e+06 -9.761669922887026e+05 6.405959036262729e+06 -7.250113629069343e+03 1.989787065335341e+01 -2.549385643062545e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.590000000000000e+02 -2.260248120996067e+06 -9.761665938789180e+05 6.405908046992846e+06 -7.250058229245717e+03 1.994297809086927e+01 -2.549543626371211e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.600000000000000e+02 -2.260393121576169e+06 -9.761661945676649e+05 6.405857054551267e+06 -7.250002825196511e+03 1.998808554674326e+01 -2.549701609938553e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.610000000000000e+02 -2.260538121017120e+06 -9.761657943536500e+05 6.405806058961106e+06 -7.249947417926930e+03 2.003319240451407e+01 -2.549859590899247e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.620000000000000e+02 -2.260683119286953e+06 -9.761653932362294e+05 6.405755060233746e+06 -7.249892007762915e+03 2.007829913912295e+01 -2.550017568362952e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.630000000000000e+02 -2.260828116514661e+06 -9.761649912179994e+05 6.405704058323269e+06 -7.249836593122933e+03 2.012340584579690e+01 -2.550175546787515e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.640000000000000e+02 -2.260973112635326e+06 -9.761645882976712e+05 6.405653053252781e+06 -7.249781174799423e+03 2.016851202292651e+01 -2.550333523913480e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.650000000000000e+02 -2.261118107649283e+06 -9.761641844752412e+05 6.405602045022154e+06 -7.249725752692607e+03 2.021361878543166e+01 -2.550491500084930e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.660000000000000e+02 -2.261263101556255e+06 -9.761637797507168e+05 6.405551033631496e+06 -7.249670327006655e+03 2.025872493005639e+01 -2.550649474658941e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.670000000000000e+02 -2.261408094420594e+06 -9.761633741253960e+05 6.405500019057882e+06 -7.249614896798108e+03 2.030383105760367e+01 -2.550807450324733e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.680000000000000e+02 -2.261553086081052e+06 -9.761629675960434e+05 6.405449001358736e+06 -7.249559464059897e+03 2.034893692377096e+01 -2.550965421459880e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.690000000000000e+02 -2.261698076666626e+06 -9.761625601652556e+05 6.405397980488123e+06 -7.249504027304191e+03 2.039404261935678e+01 -2.551123392256662e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.700000000000000e+02 -2.261843066144702e+06 -9.761621518323824e+05 6.405346956457643e+06 -7.249448586730842e+03 2.043914789871030e+01 -2.551281362138677e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.710000000000000e+02 -2.261988054515639e+06 -9.761617425974326e+05 6.405295929267185e+06 -7.249393142608847e+03 2.048425349775340e+01 -2.551439330390719e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.720000000000000e+02 -2.262133041778935e+06 -9.761613324604097e+05 6.405244898916912e+06 -7.249337694680794e+03 2.052935837791742e+01 -2.551597297678235e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.730000000000000e+02 -2.262278027934940e+06 -9.761609214213151e+05 6.405193865406708e+06 -7.249282243129895e+03 2.057446364607264e+01 -2.551755263548442e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.740000000000000e+02 -2.262423012983359e+06 -9.761605094801510e+05 6.405142828736669e+06 -7.249226787896099e+03 2.061956839067588e+01 -2.551913228118687e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.750000000000000e+02 -2.262567996923931e+06 -9.761600966369229e+05 6.405091788906891e+06 -7.249171328905290e+03 2.066467291964327e+01 -2.552071191614873e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.760000000000000e+02 -2.262712979756973e+06 -9.761596828916308e+05 6.405040745917259e+06 -7.249115866263615e+03 2.070977764931550e+01 -2.552229153761997e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.770000000000000e+02 -2.262857961514547e+06 -9.761592682449333e+05 6.404989699756350e+06 -7.249060399572822e+03 2.075488196782968e+01 -2.552387115645406e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.780000000000000e+02 -2.263002942131719e+06 -9.761588526955328e+05 6.404938650447292e+06 -7.249004929489268e+03 2.079998592621391e+01 -2.552545075422153e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.790000000000000e+02 -2.263147921641152e+06 -9.761584362440816e+05 6.404887597978458e+06 -7.248949455855766e+03 2.084509018012281e+01 -2.552703033571404e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.800000000000000e+02 -2.263292900042566e+06 -9.761580188905819e+05 6.404836542349935e+06 -7.248893978399020e+03 2.089019393075111e+01 -2.552860990816520e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.810000000000000e+02 -2.263437877335678e+06 -9.761576006350386e+05 6.404785483561826e+06 -7.248838497314006e+03 2.093529726416949e+01 -2.553018946614172e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.820000000000000e+02 -2.263582853488517e+06 -9.761571814768080e+05 6.404734421625530e+06 -7.248783012910917e+03 2.098040089033765e+01 -2.553176900132413e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.830000000000000e+02 -2.263727828597534e+06 -9.761567614178328e+05 6.404683356506663e+06 -7.248727524066705e+03 2.102550406630613e+01 -2.553334854486486e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.840000000000000e+02 -2.263872802566131e+06 -9.761563404561777e+05 6.404632288239650e+06 -7.248672031816297e+03 2.107060739367859e+01 -2.553492806800852e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.850000000000000e+02 -2.264017775426335e+06 -9.761559185924928e+05 6.404581216813085e+06 -7.248616536031999e+03 2.111571029948442e+01 -2.553650757402288e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.860000000000000e+02 -2.264162747177872e+06 -9.761554958267810e+05 6.404530142227057e+06 -7.248561036449965e+03 2.116081284605463e+01 -2.553808707035925e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.870000000000000e+02 -2.264307717821081e+06 -9.761550721590434e+05 6.404479064481446e+06 -7.248505533210529e+03 2.120591572839533e+01 -2.553966655346497e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.880000000000000e+02 -2.264452687355679e+06 -9.761546475892881e+05 6.404427983576353e+06 -7.248450026288288e+03 2.125101808162776e+01 -2.554124602356685e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.890000000000000e+02 -2.264597655781384e+06 -9.761542221175173e+05 6.404376899511875e+06 -7.248394515647567e+03 2.129612008056719e+01 -2.554282548176573e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.900000000000000e+02 -2.264742623066228e+06 -9.761537957430866e+05 6.404325812299414e+06 -7.248339001734773e+03 2.134122234612201e+01 -2.554440491586870e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.910000000000000e+02 -2.264887589339211e+06 -9.761533684680782e+05 6.404274721893050e+06 -7.248283484867951e+03 2.138634950383488e+01 -2.554598433080072e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.920000000000000e+02 -2.265032554395696e+06 -9.761529402894253e+05 6.404223628365587e+06 -7.248227962043758e+03 2.143142556762902e+01 -2.554756376817592e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.930000000000000e+02 -2.265177518353823e+06 -9.761525112089763e+05 6.404172531674979e+06 -7.248172437040047e+03 2.147652726828568e+01 -2.554914316504065e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.940000000000000e+02 -2.265322481267519e+06 -9.761520812278159e+05 6.404121431801983e+06 -7.248116907538853e+03 2.152162886406816e+01 -2.555072257202539e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.950000000000000e+02 -2.265467443104188e+06 -9.761516503453015e+05 6.404070328758225e+06 -7.248061373999377e+03 2.156673020974699e+01 -2.555230197614634e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.960000000000000e+02 -2.265612403767242e+06 -9.761512185595082e+05 6.404019222578165e+06 -7.248005837550283e+03 2.161183140209312e+01 -2.555388134575717e+03 5.034972896900000e-03 2.111294149600000e-05 1.354145687900000e-03 1.572075627200000e-03 8.179915850000000e-05 1.563550221100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.970000000000000e+02 -2.265757363320812e+06 -9.761507858717251e+05 6.403968113238921e+06 -7.247950297374565e+03 2.165693211309681e+01 -2.555546070362238e+03 5.034972896900000e-03 2.111294149600000e-05 1.354145687900000e-03 1.572075627200000e-03 8.179915850000000e-05 1.563550221100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.980000000000000e+02 -2.265902321700623e+06 -9.761503522806721e+05 6.403917000763431e+06 -7.247894754347795e+03 2.170203259775715e+01 -2.555704002529808e+03 5.034972896900000e-03 2.111294149600000e-05 1.354145687900000e-03 1.572075627200000e-03 8.179915850000000e-05 1.563550221100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.990000000000000e+02 -2.266047279067943e+06 -9.761499177895644e+05 6.403865885094143e+06 -7.247839206426017e+03 2.174713334287279e+01 -2.555861936845508e+03 5.034972896900000e-03 2.111294149600000e-05 1.354145687900000e-03 1.572075627200000e-03 8.179915850000000e-05 1.563550221100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.000000000000000e+02 -2.266192235293247e+06 -9.761494823958341e+05 6.403814766277278e+06 -7.247783655178930e+03 2.179223353773148e+01 -2.556019868855839e+03 5.034972896900000e-03 2.111294149600000e-05 1.354145687900000e-03 1.572075627200000e-03 8.179915850000000e-05 1.563550221100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.010000000000000e+02 -2.266337190379942e+06 -9.761490461027398e+05 6.403763644321481e+06 -7.247728253603522e+03 2.183717106104291e+01 -2.556177359919118e+03 5.034972896900000e-03 2.111294149600000e-05 1.354145687900000e-03 1.572075627200000e-03 8.179915850000000e-05 1.563550221100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.020000000000000e+02 -2.266482144402239e+06 -9.761486089259820e+05 6.403712519244158e+06 -7.247673528680629e+03 2.188138401962811e+01 -2.556332899194491e+03 5.034972896900000e-03 2.111294149600000e-05 1.354145687900000e-03 1.572075627200000e-03 8.179915850000000e-05 1.563550221100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.030000000000000e+02 -2.266627097304469e+06 -9.761481708470524e+05 6.403661391011418e+06 -7.247617966446368e+03 2.192648368460615e+01 -2.556490827391451e+03 5.034972896900000e-03 2.111294149600000e-05 1.354145687900000e-03 1.572075627200000e-03 8.179915850000000e-05 1.563550221100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.040000000000000e+02 -2.266772049129430e+06 -9.761477318668005e+05 6.403610259607993e+06 -7.247562400185490e+03 2.197158375928433e+01 -2.556648755305836e+03 5.034972896900000e-03 2.111294149600000e-05 1.354145687900000e-03 1.572075627200000e-03 8.179915850000000e-05 1.563550221100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.050000000000000e+02 -2.266916999747603e+06 -9.761472919826608e+05 6.403559125080111e+06 -7.247506831340421e+03 2.201668291504947e+01 -2.556806678814480e+03 5.034972896900000e-03 2.111294149600000e-05 1.354145687900000e-03 1.572075627200000e-03 8.179915850000000e-05 1.563550221100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.060000000000000e+02 -2.267061949384860e+06 -9.761468511991304e+05 6.403507987347131e+06 -7.247451257239721e+03 2.206178231877917e+01 -2.556964605480967e+03 5.034358077200000e-03 2.094029629600000e-05 1.354942171100000e-03 1.572124544400000e-03 8.173427468699999e-05 1.564158498300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.070000000000000e+02 -2.267206897783087e+06 -9.761464095110806e+05 6.403456846501214e+06 -7.247395681059116e+03 2.210688133162427e+01 -2.557122526356343e+03 5.034358077200000e-03 2.094029629600000e-05 1.354942171100000e-03 1.572124544400000e-03 8.173427468699999e-05 1.564158498300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.080000000000000e+02 -2.267351845135637e+06 -9.761459669223605e+05 6.403405702473318e+06 -7.247340100372759e+03 2.215198012350828e+01 -2.557280448258434e+03 5.034358077200000e-03 2.094029629600000e-05 1.354942171100000e-03 1.572124544400000e-03 8.173427468699999e-05 1.564158498300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.090000000000000e+02 -2.267496791378233e+06 -9.761455234316927e+05 6.403354555286394e+06 -7.247284516051076e+03 2.219707909722237e+01 -2.557438368766891e+03 5.034358077200000e-03 2.094029629600000e-05 1.354942171100000e-03 1.572124544400000e-03 8.173427468699999e-05 1.564158498300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.100000000000000e+02 -2.267641736510604e+06 -9.761450790390788e+05 6.403303404940533e+06 -7.247228927953099e+03 2.224217778987091e+01 -2.557596288251365e+03 5.034358077200000e-03 2.094029629600000e-05 1.354942171100000e-03 1.572124544400000e-03 8.173427468699999e-05 1.564158498300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.110000000000000e+02 -2.267786680600459e+06 -9.761446337488678e+05 6.403252251422425e+06 -7.247173504588128e+03 2.228712337889232e+01 -2.557753725404299e+03 5.034358077200000e-03 2.094029629600000e-05 1.354942171100000e-03 1.572124544400000e-03 8.173427468699999e-05 1.564158498300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.120000000000000e+02 -2.267931623469445e+06 -9.761441875708376e+05 6.403201094844191e+06 -7.247118832627929e+03 2.233138742564140e+01 -2.557909004972712e+03 5.034358077200000e-03 2.094029629600000e-05 1.354942171100000e-03 1.572124544400000e-03 8.173427468699999e-05 1.564158498300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.130000000000000e+02 -2.268076565307416e+06 -9.761437404924500e+05 6.403149935078725e+06 -7.247063233154086e+03 2.237648566479146e+01 -2.558066921821988e+03 5.034358077200000e-03 2.094029629600000e-05 1.354942171100000e-03 1.572124544400000e-03 8.173427468699999e-05 1.564158498300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.140000000000000e+02 -2.268221505970047e+06 -9.761432925108492e+05 6.403098772177585e+06 -7.247007630873271e+03 2.242158335112012e+01 -2.558224834912900e+03 5.034358077200000e-03 2.094029629600000e-05 1.354942171100000e-03 1.572124544400000e-03 8.173427468699999e-05 1.564158498300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.150000000000000e+02 -2.268366445586890e+06 -9.761428436286027e+05 6.403047606094484e+06 -7.246952024088896e+03 2.246668134209477e+01 -2.558382749052512e+03 5.034358077200000e-03 2.094029629600000e-05 1.354942171100000e-03 1.572124544400000e-03 8.173427468699999e-05 1.564158498300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.160000000000000e+02 -2.268511384060767e+06 -9.761423938437924e+05 6.402996436864140e+06 -7.246896413949886e+03 2.251177903745602e+01 -2.558540660984496e+03 5.033742948100000e-03 2.076768112900000e-05 1.355738373500000e-03 1.572173478800000e-03 8.166930216999999e-05 1.564767132000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.170000000000000e+02 -2.268656321391376e+06 -9.761419431564223e+05 6.402945264486658e+06 -7.246840800550014e+03 2.255687593951794e+01 -2.558698570418295e+03 5.033742948100000e-03 2.076768112900000e-05 1.355738373500000e-03 1.572173478800000e-03 8.166930216999999e-05 1.564767132000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.180000000000000e+02 -2.268801257675990e+06 -9.761414915684140e+05 6.402894088927284e+06 -7.246785182712901e+03 2.260197367390867e+01 -2.558856480743757e+03 5.033742948100000e-03 2.076768112900000e-05 1.355738373500000e-03 1.572173478800000e-03 8.166930216999999e-05 1.564767132000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.190000000000000e+02 -2.268946192817402e+06 -9.761410390778523e+05 6.402842910220747e+06 -7.246729561500646e+03 2.264707079924074e+01 -2.559014388901820e+03 5.033742948100000e-03 2.076768112900000e-05 1.355738373500000e-03 1.572173478800000e-03 8.166930216999999e-05 1.564767132000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.200000000000000e+02 -2.269091126847641e+06 -9.761405856853822e+05 6.402791728355606e+06 -7.246673936650841e+03 2.269216734594531e+01 -2.559172295630123e+03 5.033742948100000e-03 2.076768112900000e-05 1.355738373500000e-03 1.572173478800000e-03 8.166930216999999e-05 1.564767132000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.210000000000000e+02 -2.269236059769953e+06 -9.761401313939777e+05 6.402740543340039e+06 -7.246618453299984e+03 2.273711567618540e+01 -2.559329785791479e+03 5.033742948100000e-03 2.076768112900000e-05 1.355738373500000e-03 1.572173478800000e-03 8.166930216999999e-05 1.564767132000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.220000000000000e+02 -2.269380991526032e+06 -9.761396762154861e+05 6.402689355236482e+06 -7.246563613298669e+03 2.278140097840625e+01 -2.559485423895016e+03 5.033742948100000e-03 2.076768112900000e-05 1.355738373500000e-03 1.572173478800000e-03 8.166930216999999e-05 1.564767132000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.230000000000000e+02 -2.269525922233850e+06 -9.761392201363344e+05 6.402638163951832e+06 -7.246507977525765e+03 2.282649752181382e+01 -2.559643326704724e+03 5.033742948100000e-03 2.076768112900000e-05 1.355738373500000e-03 1.572173478800000e-03 8.166930216999999e-05 1.564767132000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.240000000000000e+02 -2.269670851895018e+06 -9.761387631565654e+05 6.402586969485498e+06 -7.246452337135824e+03 2.287159409686993e+01 -2.559801230864343e+03 5.033742948100000e-03 2.076768112900000e-05 1.355738373500000e-03 1.572173478800000e-03 8.166930216999999e-05 1.564767132000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.250000000000000e+02 -2.269815780315429e+06 -9.761383052723485e+05 6.402535771906881e+06 -7.246396694685993e+03 2.291668955793958e+01 -2.559959129142202e+03 5.033742948100000e-03 2.076768112900000e-05 1.355738373500000e-03 1.572173478800000e-03 8.166930216999999e-05 1.564767132000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.260000000000000e+02 -2.269960707753857e+06 -9.761378464887966e+05 6.402484571123462e+06 -7.246341047041993e+03 2.296178601232413e+01 -2.560117030440972e+03 5.033127509400000e-03 2.059509593600000e-05 1.356534294900000e-03 1.572222430500000e-03 8.160424093600001e-05 1.565376122300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.270000000000000e+02 -2.270105634016197e+06 -9.761373868020814e+05 6.402433367204634e+06 -7.246285396404352e+03 2.300688169841911e+01 -2.560274928494738e+03 5.033127509400000e-03 2.059509593600000e-05 1.356534294900000e-03 1.572222430500000e-03 8.160424093600001e-05 1.565376122300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.280000000000000e+02 -2.270250559199078e+06 -9.761369262141242e+05 6.402382160115853e+06 -7.246229741726596e+03 2.305197711231958e+01 -2.560432826264070e+03 5.033127509400000e-03 2.059509593600000e-05 1.356534294900000e-03 1.572222430500000e-03 8.160424093600001e-05 1.565376122300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.290000000000000e+02 -2.270395483238230e+06 -9.761364647236465e+05 6.402330949880091e+06 -7.246174083698638e+03 2.309707276519691e+01 -2.560590721844006e+03 5.033127509400000e-03 2.059509593600000e-05 1.356534294900000e-03 1.572222430500000e-03 8.160424093600001e-05 1.565376122300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.300000000000000e+02 -2.270540406068776e+06 -9.761360023293805e+05 6.402279736520560e+06 -7.246118423270578e+03 2.314216735178928e+01 -2.560748612500050e+03 5.033127509400000e-03 2.059509593600000e-05 1.356534294900000e-03 1.572222430500000e-03 8.160424093600001e-05 1.565376122300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.310000000000000e+02 -2.270685327919321e+06 -9.761355390389404e+05 6.402228519964417e+06 -7.246062895882317e+03 2.318710507252123e+01 -2.560906110114374e+03 5.033127509400000e-03 2.059509593600000e-05 1.356534294900000e-03 1.572222430500000e-03 8.160424093600001e-05 1.565376122300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.320000000000000e+02 -2.270830248707195e+06 -9.761350748644418e+05 6.402177300280946e+06 -7.246007980878596e+03 2.323134336755442e+01 -2.561061841755021e+03 5.033127509400000e-03 2.059509593600000e-05 1.356534294900000e-03 1.572222430500000e-03 8.160424093600001e-05 1.565376122300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.330000000000000e+02 -2.270975168337443e+06 -9.761346097871803e+05 6.402126077455469e+06 -7.245952308215293e+03 2.327643777948040e+01 -2.561219732143083e+03 5.033127509400000e-03 2.059509593600000e-05 1.356534294900000e-03 1.572222430500000e-03 8.160424093600001e-05 1.565376122300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.340000000000000e+02 -2.271120086855904e+06 -9.761341438080567e+05 6.402074851471582e+06 -7.245896631812933e+03 2.332153246736118e+01 -2.561377621433480e+03 5.033127509400000e-03 2.059509593600000e-05 1.356534294900000e-03 1.572222430500000e-03 8.160424093600001e-05 1.565376122300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.350000000000000e+02 -2.271265004197696e+06 -9.761336769257997e+05 6.402023622352507e+06 -7.245840952580191e+03 2.336662644678520e+01 -2.561535507026392e+03 5.033127509400000e-03 2.059509593600000e-05 1.356534294900000e-03 1.572222430500000e-03 8.160424093600001e-05 1.565376122300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.360000000000000e+02 -2.271409920524041e+06 -9.761332091436026e+05 6.401972390040553e+06 -7.245785268404732e+03 2.341172051059715e+01 -2.561693394882406e+03 5.032511760400000e-03 2.042254060800000e-05 1.357329935500000e-03 1.572271399500000e-03 8.153909095499999e-05 1.565985469200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.370000000000000e+02 -2.271554835673767e+06 -9.761327404582743e+05 6.401921154593387e+06 -7.245729581398995e+03 2.345681458692678e+01 -2.561851279080866e+03 5.032511760400000e-03 2.042254060800000e-05 1.357329935500000e-03 1.572271399500000e-03 8.153909095499999e-05 1.565985469200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.380000000000000e+02 -2.271699749743511e+06 -9.761322708717390e+05 6.401869915976434e+06 -7.245673890269823e+03 2.350190832958745e+01 -2.562009163224324e+03 5.032511760400000e-03 2.042254060800000e-05 1.357329935500000e-03 1.572271399500000e-03 8.153909095499999e-05 1.565985469200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.390000000000000e+02 -2.271844662797580e+06 -9.761318003852690e+05 6.401818674166671e+06 -7.245618194263311e+03 2.354700219204977e+01 -2.562167049448725e+03 5.032511760400000e-03 2.042254060800000e-05 1.357329935500000e-03 1.572271399500000e-03 8.153909095499999e-05 1.565985469200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.400000000000000e+02 -2.271989574545616e+06 -9.761313289931358e+05 6.401767429268011e+06 -7.245562496936603e+03 2.359209542981489e+01 -2.562324927752270e+03 5.032511760400000e-03 2.042254060800000e-05 1.357329935500000e-03 1.572271399500000e-03 8.153909095499999e-05 1.565985469200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.410000000000000e+02 -2.272134485281383e+06 -9.761308567042446e+05 6.401716181186027e+06 -7.245506961449239e+03 2.363703022999960e+01 -2.562482332584697e+03 5.032511760400000e-03 2.042254060800000e-05 1.357329935500000e-03 1.572271399500000e-03 8.153909095499999e-05 1.565985469200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.420000000000000e+02 -2.272279394910242e+06 -9.761303835305519e+05 6.401664930002233e+06 -7.245452164478205e+03 2.368125934706828e+01 -2.562637619294368e+03 5.032511760400000e-03 2.042254060800000e-05 1.357329935500000e-03 1.572271399500000e-03 8.153909095499999e-05 1.565985469200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.430000000000000e+02 -2.272424303350503e+06 -9.761299094535296e+05 6.401613675687523e+06 -7.245396455417555e+03 2.372635230059552e+01 -2.562795495939308e+03 5.032511760400000e-03 2.042254060800000e-05 1.357329935500000e-03 1.572271399500000e-03 8.153909095499999e-05 1.565985469200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.440000000000000e+02 -2.272569210710329e+06 -9.761294344753159e+05 6.401562418203173e+06 -7.245340742243803e+03 2.377144508070137e+01 -2.562953372508729e+03 5.032511760400000e-03 2.042254060800000e-05 1.357329935500000e-03 1.572271399500000e-03 8.153909095499999e-05 1.565985469200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.450000000000000e+02 -2.272714116957152e+06 -9.761289585952825e+05 6.401511157560842e+06 -7.245285025358015e+03 2.381653733933328e+01 -2.563111247860527e+03 5.032511760400000e-03 2.042254060800000e-05 1.357329935500000e-03 1.572271399500000e-03 8.153909095499999e-05 1.565985469200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.460000000000000e+02 -2.272859022091294e+06 -9.761284818134244e+05 6.401459893760416e+06 -7.245229304899213e+03 2.386162998704702e+01 -2.563269121656025e+03 5.031895701200000e-03 2.025001518800000e-05 1.358125294700000e-03 1.572320385600000e-03 8.147385225299999e-05 1.566595172200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.470000000000000e+02 -2.273003926112282e+06 -9.761280041297517e+05 6.401408626802059e+06 -7.245173580611809e+03 2.390672202480911e+01 -2.563426994555268e+03 5.031895701200000e-03 2.025001518800000e-05 1.358125294700000e-03 1.572320385600000e-03 8.147385225299999e-05 1.566595172200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.480000000000000e+02 -2.273148829085046e+06 -9.761275255455369e+05 6.401357356662521e+06 -7.245117851942970e+03 2.395181457243532e+01 -2.563584868167191e+03 5.031895701200000e-03 2.025001518800000e-05 1.358125294700000e-03 1.572320385600000e-03 8.147385225299999e-05 1.566595172200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.490000000000000e+02 -2.273293730880117e+06 -9.761270460582405e+05 6.401306083388158e+06 -7.245062120293560e+03 2.399690651041587e+01 -2.563742738509536e+03 5.031895701200000e-03 2.025001518800000e-05 1.358125294700000e-03 1.572320385600000e-03 8.147385225299999e-05 1.566595172200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.500000000000000e+02 -2.273438631432617e+06 -9.761265656665997e+05 6.401254807002216e+06 -7.245006386596149e+03 2.404199719283065e+01 -2.563900602937708e+03 5.031895701200000e-03 2.025001518800000e-05 1.358125294700000e-03 1.572320385600000e-03 8.147385225299999e-05 1.566595172200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.510000000000000e+02 -2.273583531068757e+06 -9.761260843799564e+05 6.401203527397141e+06 -7.244950791299717e+03 2.408693979574022e+01 -2.564058060392779e+03 5.031895701200000e-03 2.025001518800000e-05 1.358125294700000e-03 1.572320385600000e-03 8.147385225299999e-05 1.566595172200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.520000000000000e+02 -2.273728429572763e+06 -9.761256022071454e+05 6.401152244691545e+06 -7.244895835955256e+03 2.413121580168968e+01 -2.564213679187771e+03 5.031895701200000e-03 2.025001518800000e-05 1.358125294700000e-03 1.572320385600000e-03 8.147385225299999e-05 1.566595172200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.530000000000000e+02 -2.273873326885031e+06 -9.761251191310035e+05 6.401100958856164e+06 -7.244840090063858e+03 2.417630646989701e+01 -2.564371543240286e+03 5.031895701200000e-03 2.025001518800000e-05 1.358125294700000e-03 1.572320385600000e-03 8.147385225299999e-05 1.566595172200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.540000000000000e+02 -2.274018223116342e+06 -9.761246351537051e+05 6.401049669851308e+06 -7.244784340063116e+03 2.422139774684291e+01 -2.564529407249163e+03 5.031895701200000e-03 2.025001518800000e-05 1.358125294700000e-03 1.572320385600000e-03 8.147385225299999e-05 1.566595172200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.550000000000000e+02 -2.274163118234109e+06 -9.761241502746162e+05 6.400998377688653e+06 -7.244728586404975e+03 2.426648860711768e+01 -2.564687269893402e+03 5.031895701200000e-03 2.025001518800000e-05 1.358125294700000e-03 1.572320385600000e-03 8.147385225299999e-05 1.566595172200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.560000000000000e+02 -2.274308012270350e+06 -9.761236644943800e+05 6.400947082356730e+06 -7.244672828714161e+03 2.431157907447107e+01 -2.564845132223939e+03 5.031279331200000e-03 2.007751956700000e-05 1.358920372500000e-03 1.572369388900000e-03 8.140852479900000e-05 1.567205231600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.570000000000000e+02 -2.274452905160822e+06 -9.761231778117260e+05 6.400895783878551e+06 -7.244617067647495e+03 2.435666984104321e+01 -2.565002992441854e+03 5.031279331200000e-03 2.007751956700000e-05 1.358920372500000e-03 1.572369388900000e-03 8.140852479900000e-05 1.567205231600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.580000000000000e+02 -2.274597796872733e+06 -9.761226902260245e+05 6.400844482265864e+06 -7.244561303674871e+03 2.440175966792773e+01 -2.565160849164958e+03 5.031279331200000e-03 2.007751956700000e-05 1.358920372500000e-03 1.572369388900000e-03 8.140852479900000e-05 1.567205231600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.590000000000000e+02 -2.274742687535606e+06 -9.761222017398165e+05 6.400793177472262e+06 -7.244505535300812e+03 2.444684994954960e+01 -2.565318706652370e+03 5.031279331200000e-03 2.007751956700000e-05 1.358920372500000e-03 1.572369388900000e-03 8.140852479900000e-05 1.567205231600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.600000000000000e+02 -2.274887577084573e+06 -9.761217123518371e+05 6.400741869520986e+06 -7.244449763227673e+03 2.449193990051452e+01 -2.565476562896529e+03 5.031279331200000e-03 2.007751956700000e-05 1.358920372500000e-03 1.572369388900000e-03 8.140852479900000e-05 1.567205231600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.610000000000000e+02 -2.275032465522738e+06 -9.761212220653279e+05 6.400690558421769e+06 -7.244394156550368e+03 2.453686761327120e+01 -2.565633936210727e+03 5.031279331200000e-03 2.007751956700000e-05 1.358920372500000e-03 1.572369388900000e-03 8.140852479900000e-05 1.567205231600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.620000000000000e+02 -2.275177352866226e+06 -9.761207308947011e+05 6.400639244217153e+06 -7.244339299680280e+03 2.458107580060692e+01 -2.565789162187195e+03 5.031279331200000e-03 2.007751956700000e-05 1.358920372500000e-03 1.572369388900000e-03 8.140852479900000e-05 1.567205231600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.630000000000000e+02 -2.275322239148516e+06 -9.761202388233546e+05 6.400587926835962e+06 -7.244283515804162e+03 2.462616541443606e+01 -2.565947016963676e+03 5.031279331200000e-03 2.007751956700000e-05 1.358920372500000e-03 1.572369388900000e-03 8.140852479900000e-05 1.567205231600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.640000000000000e+02 -2.275467124187220e+06 -9.761197458477182e+05 6.400536606343580e+06 -7.244227729828192e+03 2.467125413135099e+01 -2.566104865995078e+03 5.031279331200000e-03 2.007751956700000e-05 1.358920372500000e-03 1.572369388900000e-03 8.140852479900000e-05 1.567205231600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.650000000000000e+02 -2.275612008273332e+06 -9.761192519734903e+05 6.400485282635686e+06 -7.244171938172428e+03 2.471634398222025e+01 -2.566262719400474e+03 5.031279331200000e-03 2.007751956700000e-05 1.358920372500000e-03 1.572369388900000e-03 8.140852479900000e-05 1.567205231600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.660000000000000e+02 -2.275756891083625e+06 -9.761187571943504e+05 6.400433955828159e+06 -7.244116144830165e+03 2.476143251678911e+01 -2.566420565882906e+03 5.030662650000000e-03 1.990505368600000e-05 1.359715168900000e-03 1.572418409500000e-03 8.134310858300000e-05 1.567815647200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.670000000000000e+02 -2.275901772843871e+06 -9.761182615147253e+05 6.400382625840048e+06 -7.244060346921217e+03 2.480652117028342e+01 -2.566578413571848e+03 5.030662650000000e-03 1.990505368600000e-05 1.359715168900000e-03 1.572418409500000e-03 8.134310858300000e-05 1.567815647200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.680000000000000e+02 -2.276046653489831e+06 -9.761177649333624e+05 6.400331292694398e+06 -7.244004545503003e+03 2.485160972558651e+01 -2.566736259499868e+03 5.030662650000000e-03 1.990505368600000e-05 1.359715168900000e-03 1.572418409500000e-03 8.134310858300000e-05 1.567815647200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.690000000000000e+02 -2.276191533021224e+06 -9.761172674502536e+05 6.400279956391289e+06 -7.243948740186309e+03 2.489669828792597e+01 -2.566894104760429e+03 5.030662650000000e-03 1.990505368600000e-05 1.359715168900000e-03 1.572418409500000e-03 8.134310858300000e-05 1.567815647200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.700000000000000e+02 -2.276336411405474e+06 -9.761167690647815e+05 6.400228616942420e+06 -7.243892931718979e+03 2.494178597967402e+01 -2.567051947215616e+03 5.030662650000000e-03 1.990505368600000e-05 1.359715168900000e-03 1.572418409500000e-03 8.134310858300000e-05 1.567815647200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.710000000000000e+02 -2.276481288710557e+06 -9.761162697812633e+05 6.400177274333156e+06 -7.243837271160555e+03 2.498672143731858e+01 -2.567209356506473e+03 5.030662650000000e-03 1.990505368600000e-05 1.359715168900000e-03 1.572418409500000e-03 8.134310858300000e-05 1.567815647200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.720000000000000e+02 -2.276626164943737e+06 -9.761157696132042e+05 6.400125928604350e+06 -7.243782284018284e+03 2.503097571651907e+01 -2.567364835577207e+03 5.030662650000000e-03 1.990505368600000e-05 1.359715168900000e-03 1.572418409500000e-03 8.134310858300000e-05 1.567815647200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.730000000000000e+02 -2.276771039948624e+06 -9.761152685411953e+05 6.400074579758884e+06 -7.243726464908581e+03 2.507606338102681e+01 -2.567522673343799e+03 5.030662650000000e-03 1.990505368600000e-05 1.359715168900000e-03 1.572418409500000e-03 8.134310858300000e-05 1.567815647200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.740000000000000e+02 -2.276915913967738e+06 -9.761147665699892e+05 6.400023227709762e+06 -7.243670640556232e+03 2.512115118358332e+01 -2.567680514204947e+03 5.030662650000000e-03 1.990505368600000e-05 1.359715168900000e-03 1.572418409500000e-03 8.134310858300000e-05 1.567815647200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.750000000000000e+02 -2.277060786807054e+06 -9.761142636958058e+05 6.399971872526585e+06 -7.243614813264475e+03 2.516623822600016e+01 -2.567838351677084e+03 5.030662650000000e-03 1.990505368600000e-05 1.359715168900000e-03 1.572418409500000e-03 8.134310858300000e-05 1.567815647200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.760000000000000e+02 -2.277205658531493e+06 -9.761137599199009e+05 6.399920514186061e+06 -7.243558982314690e+03 2.521132579595172e+01 -2.567996187838401e+03 5.030045657400000e-03 1.973261748800000e-05 1.360509683700000e-03 1.572467447200000e-03 8.127760359000000e-05 1.568426418900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.770000000000000e+02 -2.277350529076194e+06 -9.761132552410284e+05 6.399869152711467e+06 -7.243503148510752e+03 2.525641221202250e+01 -2.568154020351642e+03 5.030045657400000e-03 1.973261748800000e-05 1.360509683700000e-03 1.572467447200000e-03 8.127760359000000e-05 1.568426418900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.780000000000000e+02 -2.277495398570043e+06 -9.761127496617064e+05 6.399817788056551e+06 -7.243447310167465e+03 2.530149893259957e+01 -2.568311854003356e+03 5.030045657400000e-03 1.973261748800000e-05 1.360509683700000e-03 1.572467447200000e-03 8.127760359000000e-05 1.568426418900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.790000000000000e+02 -2.277640266948788e+06 -9.761122431806772e+05 6.399766420244367e+06 -7.243391468174169e+03 2.534658581951288e+01 -2.568469686302042e+03 5.030045657400000e-03 1.973261748800000e-05 1.360509683700000e-03 1.572467447200000e-03 8.127760359000000e-05 1.568426418900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.800000000000000e+02 -2.277785134244451e+06 -9.761117357985821e+05 6.399715049263423e+06 -7.243335622067115e+03 2.539167229165011e+01 -2.568627518510793e+03 5.030045657400000e-03 1.973261748800000e-05 1.360509683700000e-03 1.572467447200000e-03 8.127760359000000e-05 1.568426418900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.810000000000000e+02 -2.277930000362652e+06 -9.761112275165340e+05 6.399663675156490e+06 -7.243279911733539e+03 2.543660776853514e+01 -2.568784951820700e+03 5.030045657400000e-03 1.973261748800000e-05 1.360509683700000e-03 1.572467447200000e-03 8.127760359000000e-05 1.568426418900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.820000000000000e+02 -2.278074865518969e+06 -9.761107183519033e+05 6.399612297885838e+06 -7.243224813605408e+03 2.548087417733512e+01 -2.568940627865560e+03 5.030045657400000e-03 1.973261748800000e-05 1.360509683700000e-03 1.572467447200000e-03 8.127760359000000e-05 1.568426418900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.830000000000000e+02 -2.278219729481236e+06 -9.761102082840522e+05 6.399560917486244e+06 -7.243168956886294e+03 2.552595985619445e+01 -2.569098455225438e+03 5.030045657400000e-03 1.973261748800000e-05 1.360509683700000e-03 1.572467447200000e-03 8.127760359000000e-05 1.568426418900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.840000000000000e+02 -2.278364592263462e+06 -9.761096973132561e+05 6.399509533952690e+06 -7.243113097351265e+03 2.557104542940053e+01 -2.569256278889100e+03 5.030045657400000e-03 1.973261748800000e-05 1.360509683700000e-03 1.572467447200000e-03 8.127760359000000e-05 1.568426418900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.850000000000000e+02 -2.278509454059102e+06 -9.761091854432926e+05 6.399458147215721e+06 -7.243057232448909e+03 2.561613144003729e+01 -2.569414106008399e+03 5.030045657400000e-03 1.973261748800000e-05 1.360509683700000e-03 1.572467447200000e-03 8.127760359000000e-05 1.568426418900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.860000000000000e+02 -2.278654314577270e+06 -9.761086726685032e+05 6.399406757379768e+06 -7.243001365874307e+03 2.566121602517003e+01 -2.569571926167293e+03 5.029428352700000e-03 1.956021086200000e-05 1.361303917100000e-03 1.572516502100000e-03 8.121200979100000e-05 1.569037546900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.870000000000000e+02 -2.278799174044329e+06 -9.761081589932926e+05 6.399355364363563e+06 -7.242945494824769e+03 2.570630142289454e+01 -2.569729747311269e+03 5.029428352700000e-03 1.956021086200000e-05 1.361303917100000e-03 1.572516502100000e-03 8.121200979100000e-05 1.569037546900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.880000000000000e+02 -2.278944032492291e+06 -9.761076444182988e+05 6.399303968155606e+06 -7.242889618909241e+03 2.575138671902320e+01 -2.569887570481168e+03 5.029428352700000e-03 1.956021086200000e-05 1.361303917100000e-03 1.572516502100000e-03 8.121200979100000e-05 1.569037546900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.890000000000000e+02 -2.279088889759428e+06 -9.761071289403761e+05 6.399252568813961e+06 -7.242833740052472e+03 2.579647144470820e+01 -2.570045390279747e+03 5.029428352700000e-03 1.956021086200000e-05 1.361303917100000e-03 1.572516502100000e-03 8.121200979100000e-05 1.569037546900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.900000000000000e+02 -2.279233745910655e+06 -9.761066125607848e+05 6.399201166315325e+06 -7.242777857549666e+03 2.584155639204545e+01 -2.570203208717260e+03 5.029428352700000e-03 1.956021086200000e-05 1.361303917100000e-03 1.572516502100000e-03 8.121200979100000e-05 1.569037546900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.910000000000000e+02 -2.279378600949045e+06 -9.761060952825629e+05 6.399149760669262e+06 -7.242722138122391e+03 2.588648933526022e+01 -2.570360552320495e+03 5.029428352700000e-03 1.956021086200000e-05 1.361303917100000e-03 1.572516502100000e-03 8.121200979100000e-05 1.569037546900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.920000000000000e+02 -2.279523454816191e+06 -9.761055771177863e+05 6.399098351944251e+06 -7.242667158420321e+03 2.593074684333860e+01 -2.570515783856294e+03 5.029428352700000e-03 1.956021086200000e-05 1.361303917100000e-03 1.572516502100000e-03 8.121200979100000e-05 1.569037546900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.930000000000000e+02 -2.279668307656050e+06 -9.761050580530813e+05 6.399046940030415e+06 -7.242611264164472e+03 2.597583169280509e+01 -2.570673600705555e+03 5.029428352700000e-03 1.956021086200000e-05 1.361303917100000e-03 1.572516502100000e-03 8.121200979100000e-05 1.569037546900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.940000000000000e+02 -2.279813159314926e+06 -9.761045380854654e+05 6.398995524982956e+06 -7.242555367002766e+03 2.602091577354724e+01 -2.570831414074709e+03 5.029428352700000e-03 1.956021086200000e-05 1.361303917100000e-03 1.572516502100000e-03 8.121200979100000e-05 1.569037546900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.950000000000000e+02 -2.279958009824828e+06 -9.761040172155751e+05 6.398944106790381e+06 -7.242499466569228e+03 2.606599903579720e+01 -2.570989224982351e+03 5.029428352700000e-03 1.956021086200000e-05 1.361303917100000e-03 1.572516502100000e-03 8.121200979100000e-05 1.569037546900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.960000000000000e+02 -2.280102859218387e+06 -9.761034954440378e+05 6.398892685440960e+06 -7.242443562382471e+03 2.611108281719521e+01 -2.571147034844340e+03 5.028810735900000e-03 1.938783385300000e-05 1.362097868400000e-03 1.572565574100000e-03 8.114632721199999e-05 1.569649030700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.970000000000000e+02 -2.280247707527402e+06 -9.761029727714898e+05 6.398841260923276e+06 -7.242387654169405e+03 2.615616606906295e+01 -2.571304844365053e+03 5.028810735900000e-03 1.938783385300000e-05 1.362097868400000e-03 1.572565574100000e-03 8.114632721199999e-05 1.569649030700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.980000000000000e+02 -2.280392554752203e+06 -9.761024491979275e+05 6.398789833237197e+06 -7.242331741863311e+03 2.620124971055026e+01 -2.571462653780478e+03 5.028810735900000e-03 1.938783385300000e-05 1.362097868400000e-03 1.572565574100000e-03 8.114632721199999e-05 1.569649030700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.990000000000000e+02 -2.280537400795670e+06 -9.761019247214773e+05 6.398738402417630e+06 -7.242275826672648e+03 2.624633265857099e+01 -2.571620459661510e+03 5.028810735900000e-03 1.938783385300000e-05 1.362097868400000e-03 1.572565574100000e-03 8.114632721199999e-05 1.569649030700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.000000000000000e+02 -2.280682245754356e+06 -9.761013993440226e+05 6.398686968429867e+06 -7.242219907323199e+03 2.629141547634487e+01 -2.571778265592282e+03 5.028810735900000e-03 1.938783385300000e-05 1.362097868400000e-03 1.572565574100000e-03 8.114632721199999e-05 1.569649030700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.010000000000000e+02 -2.280827089631322e+06 -9.761008730689115e+05 6.398635531281514e+06 -7.242164119298601e+03 2.633633128695155e+01 -2.571935684742305e+03 5.028810735900000e-03 1.938783385300000e-05 1.362097868400000e-03 1.572565574100000e-03 8.114632721199999e-05 1.569649030700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.020000000000000e+02 -2.280971932366936e+06 -9.761003459096634e+05 6.398584091032737e+06 -7.242108930486958e+03 2.638050164417027e+01 -2.572091381278628e+03 5.028810735900000e-03 1.938783385300000e-05 1.362097868400000e-03 1.572565574100000e-03 8.114632721199999e-05 1.569649030700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.030000000000000e+02 -2.281116773877830e+06 -9.760998178467108e+05 6.398532647666062e+06 -7.242053001347721e+03 2.642558318291944e+01 -2.572249180027959e+03 5.028810735900000e-03 1.938783385300000e-05 1.362097868400000e-03 1.572565574100000e-03 8.114632721199999e-05 1.569649030700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.040000000000000e+02 -2.281261614368649e+06 -9.760992888840192e+05 6.398481201107939e+06 -7.241997067458185e+03 2.647066568517607e+01 -2.572406980535352e+03 5.028810735900000e-03 1.938783385300000e-05 1.362097868400000e-03 1.572565574100000e-03 8.114632721199999e-05 1.569649030700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.050000000000000e+02 -2.281406453839103e+06 -9.760987590215927e+05 6.398429751358449e+06 -7.241941128531638e+03 2.651574841680505e+01 -2.572564783559392e+03 5.028810735900000e-03 1.938783385300000e-05 1.362097868400000e-03 1.572565574100000e-03 8.114632721199999e-05 1.569649030700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.060000000000000e+02 -2.281551292127494e+06 -9.760982282563050e+05 6.398378298475735e+06 -7.241885186841963e+03 2.656083011271787e+01 -2.572722582692777e+03 5.028192806500000e-03 1.921548635100000e-05 1.362891537700000e-03 1.572614663400000e-03 8.108055582100000e-05 1.570260870500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.070000000000000e+02 -2.281696129234158e+06 -9.760976965881535e+05 6.398326842459667e+06 -7.241829242150508e+03 2.660591197443657e+01 -2.572880378666471e+03 5.028192806500000e-03 1.921548635100000e-05 1.362891537700000e-03 1.572614663400000e-03 8.108055582100000e-05 1.570260870500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.080000000000000e+02 -2.281840965255469e+06 -9.760971640190288e+05 6.398275383275605e+06 -7.241773293447341e+03 2.665099328819576e+01 -2.573038174256602e+03 5.028192806500000e-03 1.921548635100000e-05 1.362891537700000e-03 1.572614663400000e-03 8.108055582100000e-05 1.570260870500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.090000000000000e+02 -2.281985800094911e+06 -9.760966305470529e+05 6.398223920958247e+06 -7.241717341848906e+03 2.669607445177948e+01 -2.573195966373476e+03 5.028192806500000e-03 1.921548635100000e-05 1.362891537700000e-03 1.572614663400000e-03 8.108055582100000e-05 1.570260870500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.100000000000000e+02 -2.282130633913618e+06 -9.760960961753562e+05 6.398172455449647e+06 -7.241661385356355e+03 2.674115584556449e+01 -2.573353760607850e+03 5.028192806500000e-03 1.921548635100000e-05 1.362891537700000e-03 1.572614663400000e-03 8.108055582100000e-05 1.570260870500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.110000000000000e+02 -2.282275466585401e+06 -9.760955609044111e+05 6.398120986805452e+06 -7.241605586219471e+03 2.678608821122225e+01 -2.573511096796364e+03 5.028192806500000e-03 1.921548635100000e-05 1.362891537700000e-03 1.572614663400000e-03 8.108055582100000e-05 1.570260870500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.120000000000000e+02 -2.282420298148490e+06 -9.760950247478974e+05 6.398069515057632e+06 -7.241550498730840e+03 2.683035974932895e+01 -2.573666403004215e+03 5.028192806500000e-03 1.921548635100000e-05 1.362891537700000e-03 1.572614663400000e-03 8.108055582100000e-05 1.570260870500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.130000000000000e+02 -2.282565128652859e+06 -9.760944876909457e+05 6.398018040132219e+06 -7.241494530818542e+03 2.687544067974852e+01 -2.573824194673912e+03 5.028192806500000e-03 1.921548635100000e-05 1.362891537700000e-03 1.572614663400000e-03 8.108055582100000e-05 1.570260870500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.140000000000000e+02 -2.282709957974581e+06 -9.760939497311598e+05 6.397966562073792e+06 -7.241438560072416e+03 2.692052092991477e+01 -2.573981982670901e+03 5.028192806500000e-03 1.921548635100000e-05 1.362891537700000e-03 1.572614663400000e-03 8.108055582100000e-05 1.570260870500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.150000000000000e+02 -2.282854786113997e+06 -9.760934108685444e+05 6.397915080882230e+06 -7.241382586398652e+03 2.696560124798751e+01 -2.574139767297544e+03 5.028192806500000e-03 1.921548635100000e-05 1.362891537700000e-03 1.572614663400000e-03 8.108055582100000e-05 1.570260870500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.160000000000000e+02 -2.282999613199956e+06 -9.760928711056062e+05 6.397863596511180e+06 -7.241326608283402e+03 2.701068122764477e+01 -2.574297552748742e+03 5.027574564200000e-03 1.904316829800000e-05 1.363684925000000e-03 1.572663769700000e-03 8.101469560600000e-05 1.570873066100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.170000000000000e+02 -2.283144439199887e+06 -9.760923304417187e+05 6.397812108972351e+06 -7.241270626049122e+03 2.705576120552794e+01 -2.574455338144247e+03 5.027574564200000e-03 1.904316829800000e-05 1.363684925000000e-03 1.572663769700000e-03 8.101469560600000e-05 1.570873066100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.180000000000000e+02 -2.283289264017296e+06 -9.760917888750158e+05 6.397760618300468e+06 -7.241214640963652e+03 2.710084096080104e+01 -2.574613119941034e+03 5.027574564200000e-03 1.904316829800000e-05 1.363684925000000e-03 1.572663769700000e-03 8.101469560600000e-05 1.570873066100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.190000000000000e+02 -2.283434087748747e+06 -9.760912464073690e+05 6.397709124460780e+06 -7.241158651762572e+03 2.714592076681998e+01 -2.574770901675421e+03 5.027574564200000e-03 1.904316829800000e-05 1.363684925000000e-03 1.572663769700000e-03 8.101469560600000e-05 1.570873066100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.200000000000000e+02 -2.283578910393944e+06 -9.760907030387881e+05 6.397657627453391e+06 -7.241102658467271e+03 2.719099998139393e+01 -2.574928683252848e+03 5.027574564200000e-03 1.904316829800000e-05 1.363684925000000e-03 1.572663769700000e-03 8.101469560600000e-05 1.570873066100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.210000000000000e+02 -2.283723731892048e+06 -9.760901587711350e+05 6.397606127310912e+06 -7.241046829643698e+03 2.723592403837230e+01 -2.575085986980733e+03 5.027574564200000e-03 1.904316829800000e-05 1.363684925000000e-03 1.572663769700000e-03 8.101469560600000e-05 1.570873066100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.220000000000000e+02 -2.283868552252912e+06 -9.760896136181761e+05 6.397554624077536e+06 -7.240991744903139e+03 2.728015467784059e+01 -2.575241170188554e+03 5.027574564200000e-03 1.904316829800000e-05 1.363684925000000e-03 1.572663769700000e-03 8.101469560600000e-05 1.570873066100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.230000000000000e+02 -2.284013371505254e+06 -9.760890675638552e+05 6.397503117684474e+06 -7.240935741058632e+03 2.732523378390241e+01 -2.575398946851575e+03 5.027574564200000e-03 1.904316829800000e-05 1.363684925000000e-03 1.572663769700000e-03 8.101469560600000e-05 1.570873066100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.240000000000000e+02 -2.284158189638990e+06 -9.760885206079873e+05 6.397451608135348e+06 -7.240879733501299e+03 2.737031256276305e+01 -2.575556722309933e+03 5.027574564200000e-03 1.904316829800000e-05 1.363684925000000e-03 1.572663769700000e-03 8.101469560600000e-05 1.570873066100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.250000000000000e+02 -2.284303006621551e+06 -9.760879727499528e+05 6.397400095441885e+06 -7.240823722674195e+03 2.741539075838611e+01 -2.575714495316522e+03 5.027574564200000e-03 1.904316829800000e-05 1.363684925000000e-03 1.572663769700000e-03 8.101469560600000e-05 1.570873066100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.260000000000000e+02 -2.284447822517841e+06 -9.760874239910023e+05 6.397348579580720e+06 -7.240767707823569e+03 2.746046920048292e+01 -2.575872268014389e+03 5.026956008600000e-03 1.887087963500000e-05 1.364478030000000e-03 1.572712893300000e-03 8.094874655400000e-05 1.571485617500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.270000000000000e+02 -2.284592637295309e+06 -9.760868743305168e+05 6.397297060563566e+06 -7.240711689192982e+03 2.750554750246530e+01 -2.576030039704568e+03 5.026956008600000e-03 1.887087963500000e-05 1.364478030000000e-03 1.572712893300000e-03 8.094874655400000e-05 1.571485617500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.280000000000000e+02 -2.284737450953655e+06 -9.760863237684972e+05 6.397245538390532e+06 -7.240655666928046e+03 2.755062521619351e+01 -2.576187809957572e+03 5.026956008600000e-03 1.887087963500000e-05 1.364478030000000e-03 1.572712893300000e-03 8.094874655400000e-05 1.571485617500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.290000000000000e+02 -2.284882263460955e+06 -9.760857723043241e+05 6.397194013073109e+06 -7.240599641338116e+03 2.759570319907985e+01 -2.576345577958871e+03 5.026956008600000e-03 1.887087963500000e-05 1.364478030000000e-03 1.572712893300000e-03 8.094874655400000e-05 1.571485617500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.300000000000000e+02 -2.285027074881480e+06 -9.760852199392475e+05 6.397142484588161e+06 -7.240543611737164e+03 2.764078089129231e+01 -2.576503345587370e+03 5.026956008600000e-03 1.887087963500000e-05 1.364478030000000e-03 1.572712893300000e-03 8.094874655400000e-05 1.571485617500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.310000000000000e+02 -2.285171885217909e+06 -9.760846666762761e+05 6.397090952944151e+06 -7.240487725609449e+03 2.768570809887942e+01 -2.576660694380537e+03 5.026956008600000e-03 1.887087963500000e-05 1.364478030000000e-03 1.572712893300000e-03 8.094874655400000e-05 1.571485617500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.320000000000000e+02 -2.285316694456955e+06 -9.760841125282587e+05 6.397039418187899e+06 -7.240432493152518e+03 2.772996747192857e+01 -2.576816177051644e+03 5.026956008600000e-03 1.887087963500000e-05 1.364478030000000e-03 1.572712893300000e-03 8.094874655400000e-05 1.571485617500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.330000000000000e+02 -2.285461502580705e+06 -9.760835574788061e+05 6.396987880274376e+06 -7.240376452456263e+03 2.777504442874113e+01 -2.576973941144470e+03 5.026956008600000e-03 1.887087963500000e-05 1.364478030000000e-03 1.572712893300000e-03 8.094874655400000e-05 1.571485617500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.340000000000000e+02 -2.285606309585317e+06 -9.760830015278392e+05 6.396936339204971e+06 -7.240320408133104e+03 2.782012163568413e+01 -2.577131703824703e+03 5.026956008600000e-03 1.887087963500000e-05 1.364478030000000e-03 1.572712893300000e-03 8.094874655400000e-05 1.571485617500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.350000000000000e+02 -2.285751115567339e+06 -9.760824446772329e+05 6.396884794944896e+06 -7.240264358867952e+03 2.786519888130462e+01 -2.577289468739074e+03 5.026956008600000e-03 1.887087963500000e-05 1.364478030000000e-03 1.572712893300000e-03 8.094874655400000e-05 1.571485617500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.360000000000000e+02 -2.285895920236005e+06 -9.760818869213887e+05 6.396833247598903e+06 -7.240208308311620e+03 2.791027473561243e+01 -2.577447225655318e+03 5.026337139100000e-03 1.869862025200000e-05 1.365270852900000e-03 1.572762033900000e-03 8.088270863200001e-05 1.572098524900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.370000000000000e+02 -2.286040723849862e+06 -9.760813282652867e+05 6.396781697073855e+06 -7.240152253377491e+03 2.795535123990447e+01 -2.577604983269424e+03 5.026337139100000e-03 1.869862025200000e-05 1.365270852900000e-03 1.572762033900000e-03 8.088270863200001e-05 1.572098524900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.380000000000000e+02 -2.286185526408636e+06 -9.760807687089306e+05 6.396730143369833e+06 -7.240096193815340e+03 2.800042773635897e+01 -2.577762742241461e+03 5.026337139100000e-03 1.869862025200000e-05 1.365270852900000e-03 1.572762033900000e-03 8.088270863200001e-05 1.572098524900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.390000000000000e+02 -2.286330327847483e+06 -9.760802082510783e+05 6.396678586510203e+06 -7.240040130656047e+03 2.804550372111132e+01 -2.577920499677002e+03 5.026337139100000e-03 1.869862025200000e-05 1.365270852900000e-03 1.572762033900000e-03 8.088270863200001e-05 1.572098524900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.400000000000000e+02 -2.286475128102201e+06 -9.760796468904938e+05 6.396627026518103e+06 -7.239984064567577e+03 2.809057970766446e+01 -2.578078253746362e+03 5.026337139100000e-03 1.869862025200000e-05 1.365270852900000e-03 1.572762033900000e-03 8.088270863200001e-05 1.572098524900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.410000000000000e+02 -2.286619927272137e+06 -9.760790846321683e+05 6.396575463366685e+06 -7.239928134330041e+03 2.813549909919095e+01 -2.578235610169228e+03 5.026337139100000e-03 1.869862025200000e-05 1.365270852900000e-03 1.572762033900000e-03 8.088270863200001e-05 1.572098524900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.420000000000000e+02 -2.286764725269291e+06 -9.760785214880939e+05 6.396523897127548e+06 -7.239872824287391e+03 2.817972212409606e+01 -2.578391193467496e+03 5.026337139100000e-03 1.869862025200000e-05 1.365270852900000e-03 1.572762033900000e-03 8.088270863200001e-05 1.572098524900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.430000000000000e+02 -2.286909522146170e+06 -9.760779574425288e+05 6.396472327732928e+06 -7.239816746855116e+03 2.822479773572820e+01 -2.578548944809038e+03 5.026337139100000e-03 1.869862025200000e-05 1.365270852900000e-03 1.572762033900000e-03 8.088270863200001e-05 1.572098524900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.440000000000000e+02 -2.287054317902975e+06 -9.760773924954890e+05 6.396420755182756e+06 -7.239760665796134e+03 2.826987286783884e+01 -2.578706694698330e+03 5.026337139100000e-03 1.869862025200000e-05 1.365270852900000e-03 1.572762033900000e-03 8.088270863200001e-05 1.572098524900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.450000000000000e+02 -2.287199112507148e+06 -9.760768266463564e+05 6.396369179488761e+06 -7.239704581360882e+03 2.831494746786623e+01 -2.578864442436447e+03 5.026337139100000e-03 1.869862025200000e-05 1.365270852900000e-03 1.572762033900000e-03 8.088270863200001e-05 1.572098524900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.460000000000000e+02 -2.287343906055846e+06 -9.760762598969949e+05 6.396317600615919e+06 -7.239648492485110e+03 2.836002274335237e+01 -2.579022191046506e+03 5.025717955700000e-03 1.852639019400000e-05 1.366063393100000e-03 1.572811191700000e-03 8.081658186900000e-05 1.572711787700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.470000000000000e+02 -2.287488698451761e+06 -9.760756922455452e+05 6.396266018599307e+06 -7.239592400324013e+03 2.840509717364512e+01 -2.579179937235767e+03 5.025717955700000e-03 1.852639019400000e-05 1.366063393100000e-03 1.572811191700000e-03 8.081658186900000e-05 1.572711787700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.480000000000000e+02 -2.287633489759783e+06 -9.760751236932568e+05 6.396214433415536e+06 -7.239536304114489e+03 2.845017196121083e+01 -2.579337683189784e+03 5.025717955700000e-03 1.852639019400000e-05 1.366063393100000e-03 1.572811191700000e-03 8.081658186900000e-05 1.572711787700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.490000000000000e+02 -2.287778279882814e+06 -9.760745542382677e+05 6.396162845099607e+06 -7.239480204971624e+03 2.849524618453719e+01 -2.579495425760122e+03 5.025717955700000e-03 1.852639019400000e-05 1.366063393100000e-03 1.572811191700000e-03 8.081658186900000e-05 1.572711787700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.500000000000000e+02 -2.287923068949656e+06 -9.760739838830638e+05 6.396111253605078e+06 -7.239424101330999e+03 2.854032021133921e+01 -2.579653169314093e+03 5.025717955700000e-03 1.852639019400000e-05 1.366063393100000e-03 1.572811191700000e-03 8.081658186900000e-05 1.572711787700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.510000000000000e+02 -2.288067856867225e+06 -9.760734126289767e+05 6.396059658976286e+06 -7.239368163306031e+03 2.858523497015602e+01 -2.579810432650710e+03 5.025717955700000e-03 1.852639019400000e-05 1.366063393100000e-03 1.572811191700000e-03 8.081658186900000e-05 1.572711787700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.520000000000000e+02 -2.288212643652388e+06 -9.760728404902616e+05 6.396008061255137e+06 -7.239312974231231e+03 2.862943859675016e+01 -2.579965565568122e+03 5.025717955700000e-03 1.852639019400000e-05 1.366063393100000e-03 1.572811191700000e-03 8.081658186900000e-05 1.572711787700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.530000000000000e+02 -2.288357429342582e+06 -9.760722674506013e+05 6.395956460369363e+06 -7.239256859989817e+03 2.867451197333691e+01 -2.580123304240407e+03 5.025717955700000e-03 1.852639019400000e-05 1.366063393100000e-03 1.572811191700000e-03 8.081658186900000e-05 1.572711787700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.540000000000000e+02 -2.288502213944438e+06 -9.760716935101160e+05 6.395904856316573e+06 -7.239200741695668e+03 2.871958588761422e+01 -2.580281042698601e+03 5.025717955700000e-03 1.852639019400000e-05 1.366063393100000e-03 1.572811191700000e-03 8.081658186900000e-05 1.572711787700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.550000000000000e+02 -2.288646997328596e+06 -9.760711186663372e+05 6.395853249143430e+06 -7.239144620869471e+03 2.876465879416523e+01 -2.580438776635551e+03 5.025717955700000e-03 1.852639019400000e-05 1.366063393100000e-03 1.572811191700000e-03 8.081658186900000e-05 1.572711787700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.560000000000000e+02 -2.288791779656128e+06 -9.760705429223671e+05 6.395801638791827e+06 -7.239088495607237e+03 2.880973148245761e+01 -2.580596511382762e+03 5.025098457900000e-03 1.835418935100000e-05 1.366855650800000e-03 1.572860366600000e-03 8.075036623100001e-05 1.573325406100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.570000000000000e+02 -2.288936560830558e+06 -9.760699662763444e+05 6.395750025296573e+06 -7.239032367133957e+03 2.885480444428370e+01 -2.580754243563802e+03 5.025098457900000e-03 1.835418935100000e-05 1.366855650800000e-03 1.572860366600000e-03 8.075036623100001e-05 1.573325406100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.580000000000000e+02 -2.289081341012756e+06 -9.760693887313668e+05 6.395698408599610e+06 -7.238976233200855e+03 2.889987759286447e+01 -2.580911979419654e+03 5.025098457900000e-03 1.835418935100000e-05 1.366855650800000e-03 1.572860366600000e-03 8.075036623100001e-05 1.573325406100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.590000000000000e+02 -2.289226119912628e+06 -9.760688102818772e+05 6.395646788805626e+06 -7.238920097750647e+03 2.894494991811828e+01 -2.581069707946198e+03 5.025098457900000e-03 1.835418935100000e-05 1.366855650800000e-03 1.572860366600000e-03 8.075036623100001e-05 1.573325406100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.600000000000000e+02 -2.289370897820321e+06 -9.760682309334379e+05 6.395595165809908e+06 -7.238863956896116e+03 2.899002254993644e+01 -2.581227439999309e+03 5.025098457900000e-03 1.835418935100000e-05 1.366855650800000e-03 1.572860366600000e-03 8.075036623100001e-05 1.573325406100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.610000000000000e+02 -2.289515674544979e+06 -9.760676506855184e+05 6.395543539691012e+06 -7.238807964666852e+03 2.903493612514774e+01 -2.581384739385715e+03 5.025098457900000e-03 1.835418935100000e-05 1.366855650800000e-03 1.572860366600000e-03 8.075036623100001e-05 1.573325406100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.620000000000000e+02 -2.289660450025181e+06 -9.760670695507686e+05 6.395491910514191e+06 -7.238752645133454e+03 2.907914460472398e+01 -2.581540122013574e+03 5.025098457900000e-03 1.835418935100000e-05 1.366855650800000e-03 1.572860366600000e-03 8.075036623100001e-05 1.573325406100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.630000000000000e+02 -2.289805224571157e+06 -9.760664875181955e+05 6.395440278114715e+06 -7.238696493344420e+03 2.912421668300155e+01 -2.581697850178983e+03 5.025098457900000e-03 1.835418935100000e-05 1.366855650800000e-03 1.572860366600000e-03 8.075036623100001e-05 1.573325406100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.640000000000000e+02 -2.289949997930836e+06 -9.760659045829854e+05 6.395388642583560e+06 -7.238640338690721e+03 2.916928799563058e+01 -2.581855574761423e+03 5.025098457900000e-03 1.835418935100000e-05 1.366855650800000e-03 1.572860366600000e-03 8.075036623100001e-05 1.573325406100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.650000000000000e+02 -2.290094770201375e+06 -9.760653207469865e+05 6.395337003885659e+06 -7.238584179963147e+03 2.921436001233221e+01 -2.582013299196476e+03 5.025098457900000e-03 1.835418935100000e-05 1.366855650800000e-03 1.572860366600000e-03 8.075036623100001e-05 1.573325406100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.660000000000000e+02 -2.290239541317943e+06 -9.760647360089717e+05 6.395285362044407e+06 -7.238528017909847e+03 2.925943127385636e+01 -2.582171021329378e+03 5.024478645400000e-03 1.818201766400000e-05 1.367647625700000e-03 1.572909558500000e-03 8.068406170600000e-05 1.573939380100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.670000000000000e+02 -2.290384311312535e+06 -9.760641503695662e+05 6.395233717048259e+06 -7.238471852180613e+03 2.930450202100016e+01 -2.582328742145229e+03 5.024478645400000e-03 1.818201766400000e-05 1.367647625700000e-03 1.572909558500000e-03 8.068406170600000e-05 1.573939380100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.680000000000000e+02 -2.290529080185495e+06 -9.760635638287659e+05 6.395182068897088e+06 -7.238415682750078e+03 2.934957332580871e+01 -2.582486461771593e+03 5.024478645400000e-03 1.818201766400000e-05 1.367647625700000e-03 1.572909558500000e-03 8.068406170600000e-05 1.573939380100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.690000000000000e+02 -2.290673847936535e+06 -9.760629763865777e+05 6.395130417590999e+06 -7.238359509716116e+03 2.939464400649510e+01 -2.582644179873846e+03 5.024478645400000e-03 1.818201766400000e-05 1.367647625700000e-03 1.572909558500000e-03 8.068406170600000e-05 1.573939380100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.700000000000000e+02 -2.290818614597644e+06 -9.760623880436238e+05 6.395078763118431e+06 -7.238303332469857e+03 2.943971449575105e+01 -2.582801898164672e+03 5.024478645400000e-03 1.818201766400000e-05 1.367647625700000e-03 1.572909558500000e-03 8.068406170600000e-05 1.573939380100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.710000000000000e+02 -2.290963380075546e+06 -9.760617988010518e+05 6.395027105523201e+06 -7.238247311332593e+03 2.948463512924437e+01 -2.582959163824855e+03 5.024478645400000e-03 1.818201766400000e-05 1.367647625700000e-03 1.572909558500000e-03 8.068406170600000e-05 1.573939380100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.720000000000000e+02 -2.291108144417879e+06 -9.760612086728580e+05 6.394975444833186e+06 -7.238191994427766e+03 2.952888794383520e+01 -2.583114428590055e+03 5.024478645400000e-03 1.818201766400000e-05 1.367647625700000e-03 1.572909558500000e-03 8.068406170600000e-05 1.573939380100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.730000000000000e+02 -2.291252907736897e+06 -9.760606176451733e+05 6.394923780952631e+06 -7.238135805885437e+03 2.957395849664306e+01 -2.583272143999923e+03 5.024478645400000e-03 1.818201766400000e-05 1.367647625700000e-03 1.572909558500000e-03 8.068406170600000e-05 1.573939380100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.740000000000000e+02 -2.291397669804573e+06 -9.760600257136548e+05 6.394872113963898e+06 -7.238079615232687e+03 2.961902809874917e+01 -2.583429853726253e+03 5.024478645400000e-03 1.818201766400000e-05 1.367647625700000e-03 1.572909558500000e-03 8.068406170600000e-05 1.573939380100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.750000000000000e+02 -2.291542430814216e+06 -9.760594328820052e+05 6.394820443797164e+06 -7.238023420106247e+03 2.966409741414219e+01 -2.583587564360988e+03 5.024478645400000e-03 1.818201766400000e-05 1.367647625700000e-03 1.572909558500000e-03 8.068406170600000e-05 1.573939380100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.760000000000000e+02 -2.291687190701631e+06 -9.760588391489886e+05 6.394768770475611e+06 -7.237967221342246e+03 2.970916728280076e+01 -2.583745273629112e+03 5.023858517700000e-03 1.800987507500000e-05 1.368439317700000e-03 1.572958767600000e-03 8.061766828000000e-05 1.574553709600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.770000000000000e+02 -2.291831949563343e+06 -9.760582445164587e+05 6.394717093964367e+06 -7.237911017625065e+03 2.975423709411103e+01 -2.583902985147161e+03 5.023858517700000e-03 1.800987507500000e-05 1.368439317700000e-03 1.572958767600000e-03 8.061766828000000e-05 1.574553709600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.780000000000000e+02 -2.291976707140942e+06 -9.760576489795009e+05 6.394665414356793e+06 -7.237854812234063e+03 2.979930555264932e+01 -2.584060689750534e+03 5.023858517700000e-03 1.800987507500000e-05 1.368439317700000e-03 1.572958767600000e-03 8.061766828000000e-05 1.574553709600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.790000000000000e+02 -2.292121463660633e+06 -9.760570525424210e+05 6.394613731571163e+06 -7.237798602423156e+03 2.984437478952364e+01 -2.584218395169166e+03 5.023858517700000e-03 1.800987507500000e-05 1.368439317700000e-03 1.572958767600000e-03 8.061766828000000e-05 1.574553709600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.800000000000000e+02 -2.292266219025328e+06 -9.760564552033758e+05 6.394562045642547e+06 -7.237742389215668e+03 2.988944339088948e+01 -2.584376098489790e+03 5.023858517700000e-03 1.800987507500000e-05 1.368439317700000e-03 1.572958767600000e-03 8.061766828000000e-05 1.574553709600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.810000000000000e+02 -2.292410973334332e+06 -9.760558569671058e+05 6.394510356543921e+06 -7.237686310426608e+03 2.993436752619436e+01 -2.584533409940624e+03 5.023858517700000e-03 1.800987507500000e-05 1.368439317700000e-03 1.572958767600000e-03 8.061766828000000e-05 1.574553709600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.820000000000000e+02 -2.292555726477986e+06 -9.760552578441491e+05 6.394458664354341e+06 -7.237630846964076e+03 2.997864808052671e+01 -2.584688969742283e+03 5.023858517700000e-03 1.800987507500000e-05 1.368439317700000e-03 1.572958767600000e-03 8.061766828000000e-05 1.574553709600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.830000000000000e+02 -2.292700478596974e+06 -9.760546578217306e+05 6.394406968974677e+06 -7.237574622015515e+03 3.002371632934796e+01 -2.584846671369621e+03 5.023858517700000e-03 1.800987507500000e-05 1.368439317700000e-03 1.572958767600000e-03 8.061766828000000e-05 1.574553709600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.840000000000000e+02 -2.292845229560888e+06 -9.760540568973637e+05 6.394355270452054e+06 -7.237518393763834e+03 3.006878463209105e+01 -2.585004370676514e+03 5.023858517700000e-03 1.800987507500000e-05 1.368439317700000e-03 1.572958767600000e-03 8.061766828000000e-05 1.574553709600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.850000000000000e+02 -2.292989979433971e+06 -9.760534550722780e+05 6.394303568763250e+06 -7.237462161487369e+03 3.011385269053383e+01 -2.585162069647875e+03 5.023858517700000e-03 1.800987507500000e-05 1.368439317700000e-03 1.572958767600000e-03 8.061766828000000e-05 1.574553709600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.860000000000000e+02 -2.293134728151418e+06 -9.760528523452533e+05 6.394251863931691e+06 -7.237405925831817e+03 3.015892012838120e+01 -2.585319766473749e+03 5.023238074400000e-03 1.783776147500000e-05 1.369230727100000e-03 1.573007993800000e-03 8.055118592000000e-05 1.575168394600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.870000000000000e+02 -2.293279475745837e+06 -9.760522487169009e+05 6.394200155945591e+06 -7.237349686553512e+03 3.020398809716028e+01 -2.585477461890743e+03 5.023238074400000e-03 1.783776147500000e-05 1.369230727100000e-03 1.573007993800000e-03 8.055118592000000e-05 1.575168394600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.880000000000000e+02 -2.293424222216934e+06 -9.760516441872289e+05 6.394148444805050e+06 -7.237293443585635e+03 3.024905533484136e+01 -2.585635156017186e+03 5.023238074400000e-03 1.783776147500000e-05 1.369230727100000e-03 1.573007993800000e-03 8.055118592000000e-05 1.575168394600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.890000000000000e+02 -2.293568967628970e+06 -9.760510387574703e+05 6.394096730486833e+06 -7.237237196115712e+03 3.029412259512358e+01 -2.585792851144640e+03 5.023238074400000e-03 1.783776147500000e-05 1.369230727100000e-03 1.573007993800000e-03 8.055118592000000e-05 1.575168394600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.900000000000000e+02 -2.293713711788699e+06 -9.760504324239400e+05 6.394045013060818e+06 -7.237180946585226e+03 3.033918962006393e+01 -2.585950540493322e+03 5.023238074400000e-03 1.783776147500000e-05 1.369230727100000e-03 1.573007993800000e-03 8.055118592000000e-05 1.575168394600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.910000000000000e+02 -2.293858454925149e+06 -9.760498251942170e+05 6.393993292455203e+06 -7.237124865264991e+03 3.038409279740068e+01 -2.586107743597503e+03 5.023238074400000e-03 1.783776147500000e-05 1.369230727100000e-03 1.573007993800000e-03 8.055118592000000e-05 1.575168394600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.920000000000000e+02 -2.294003196819273e+06 -9.760492170784394e+05 6.393941568798279e+06 -7.237069552947851e+03 3.042826561259133e+01 -2.586262765955171e+03 5.023238074400000e-03 1.783776147500000e-05 1.369230727100000e-03 1.573007993800000e-03 8.055118592000000e-05 1.575168394600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.930000000000000e+02 -2.294147937703182e+06 -9.760486080635128e+05 6.393889841946007e+06 -7.237013290853322e+03 3.047333258147071e+01 -2.586420455944234e+03 5.023238074400000e-03 1.783776147500000e-05 1.369230727100000e-03 1.573007993800000e-03 8.055118592000000e-05 1.575168394600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.940000000000000e+02 -2.294292677398818e+06 -9.760479981460582e+05 6.393838111962780e+06 -7.236957025848611e+03 3.051839900546298e+01 -2.586578142493151e+03 5.023238074400000e-03 1.783776147500000e-05 1.369230727100000e-03 1.573007993800000e-03 8.055118592000000e-05 1.575168394600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.950000000000000e+02 -2.294437415905899e+06 -9.760473873260852e+05 6.393786378848707e+06 -7.236900757970584e+03 3.056346446907867e+01 -2.586735825478288e+03 5.023238074400000e-03 1.783776147500000e-05 1.369230727100000e-03 1.573007993800000e-03 8.055118592000000e-05 1.575168394600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.960000000000000e+02 -2.294582153418332e+06 -9.760467756072703e+05 6.393734642533642e+06 -7.236844484845044e+03 3.060853102638055e+01 -2.586893511585223e+03 5.022617315300000e-03 1.766567690700000e-05 1.370021853100000e-03 1.573057237000000e-03 8.048461465400000e-05 1.575783434900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.970000000000000e+02 -2.294726889677539e+06 -9.760461629847207e+05 6.393682903111126e+06 -7.236788209591698e+03 3.065359604871011e+01 -2.587051192033140e+03 5.022617315300000e-03 1.766567690700000e-05 1.370021853100000e-03 1.573057237000000e-03 8.048461465400000e-05 1.575783434900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.980000000000000e+02 -2.294871624877435e+06 -9.760455494621064e+05 6.393631160511006e+06 -7.236731929901989e+03 3.069866210566656e+01 -2.587208873352524e+03 5.022617315300000e-03 1.766567690700000e-05 1.370021853100000e-03 1.573057237000000e-03 8.048461465400000e-05 1.575783434900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.990000000000000e+02 -2.295016358985462e+06 -9.760449350388256e+05 6.393579414745055e+06 -7.236675646093920e+03 3.074372746846029e+01 -2.587366554570927e+03 5.022617315300000e-03 1.766567690700000e-05 1.370021853100000e-03 1.573057237000000e-03 8.048461465400000e-05 1.575783434900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.000000000000000e+02 -2.295161091936836e+06 -9.760443197136567e+05 6.393527665836710e+06 -7.236619358959299e+03 3.078879250905226e+01 -2.587524233515053e+03 5.022617315300000e-03 1.766567690700000e-05 1.370021853100000e-03 1.573057237000000e-03 8.048461465400000e-05 1.575783434900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.010000000000000e+02 -2.295305823734731e+06 -9.760437034897252e+05 6.393475913793887e+06 -7.236563210611585e+03 3.083370137248011e+01 -2.587681508449275e+03 5.022617315300000e-03 1.766567690700000e-05 1.370021853100000e-03 1.573057237000000e-03 8.048461465400000e-05 1.575783434900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.020000000000000e+02 -2.295450554388224e+06 -9.760430863809088e+05 6.393424158653639e+06 -7.236507691514919e+03 3.087791296513731e+01 -2.587836992923308e+03 5.022617315300000e-03 1.766567690700000e-05 1.370021853100000e-03 1.573057237000000e-03 8.048461465400000e-05 1.575783434900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.030000000000000e+02 -2.295595284056861e+06 -9.760424683734763e+05 6.393372400308819e+06 -7.236451392176989e+03 3.092297795193818e+01 -2.587994671478064e+03 5.022617315300000e-03 1.766567690700000e-05 1.370021853100000e-03 1.573057237000000e-03 8.048461465400000e-05 1.575783434900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.040000000000000e+02 -2.295740012472176e+06 -9.760418494623333e+05 6.393320638856594e+06 -7.236395090851075e+03 3.096804253527199e+01 -2.588152344048434e+03 5.022617315300000e-03 1.766567690700000e-05 1.370021853100000e-03 1.573057237000000e-03 8.048461465400000e-05 1.575783434900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.050000000000000e+02 -2.295884739827454e+06 -9.760412296511510e+05 6.393268874227008e+06 -7.236338784991539e+03 3.101310716756853e+01 -2.588310017706264e+03 5.022617315300000e-03 1.766567690700000e-05 1.370021853100000e-03 1.573057237000000e-03 8.048461465400000e-05 1.575783434900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.060000000000000e+02 -2.296029465961111e+06 -9.760406089368826e+05 6.393217106478547e+06 -7.236282476676600e+03 3.105817060508667e+01 -2.588467686632862e+03 5.021996240100000e-03 1.749362126200000e-05 1.370812695800000e-03 1.573106497300000e-03 8.041795444800000e-05 1.576398830400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.070000000000000e+02 -2.296174191099301e+06 -9.760399873238052e+05 6.393165335529345e+06 -7.236226163094817e+03 3.110323511085139e+01 -2.588625358729942e+03 5.021996240100000e-03 1.749362126200000e-05 1.370812695800000e-03 1.573106497300000e-03 8.041795444800000e-05 1.576398830400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.080000000000000e+02 -2.296318914983477e+06 -9.760393648070358e+05 6.393113561472998e+06 -7.236169847393219e+03 3.114829841111899e+01 -2.588783025166774e+03 5.021996240100000e-03 1.749362126200000e-05 1.370812695800000e-03 1.573106497300000e-03 8.041795444800000e-05 1.576398830400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.090000000000000e+02 -2.296463637872025e+06 -9.760387413914617e+05 6.393061784215954e+06 -7.236113526439421e+03 3.119336251797836e+01 -2.588940694719135e+03 5.021996240100000e-03 1.749362126200000e-05 1.370812695800000e-03 1.573106497300000e-03 8.041795444800000e-05 1.576398830400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.100000000000000e+02 -2.296608359474371e+06 -9.760381170715974e+05 6.393010003863432e+06 -7.236057203784588e+03 3.123842545742923e+01 -2.589098357454976e+03 5.021996240100000e-03 1.749362126200000e-05 1.370812695800000e-03 1.573106497300000e-03 8.041795444800000e-05 1.576398830400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.110000000000000e+02 -2.296753080084058e+06 -9.760374918561256e+05 6.392958220320317e+06 -7.236001051903615e+03 3.128332921469996e+01 -2.589255527808722e+03 5.021996240100000e-03 1.749362126200000e-05 1.370812695800000e-03 1.573106497300000e-03 8.041795444800000e-05 1.576398830400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.120000000000000e+02 -2.296897799616606e+06 -9.760368657573452e+05 6.392906433667007e+06 -7.235945680012991e+03 3.132752336964239e+01 -2.589410491302286e+03 5.021996240100000e-03 1.749362126200000e-05 1.370812695800000e-03 1.573106497300000e-03 8.041795444800000e-05 1.576398830400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.130000000000000e+02 -2.297042517886498e+06 -9.760362387547339e+05 6.392854643909698e+06 -7.235889346013307e+03 3.137258598967952e+01 -2.589568151307526e+03 5.021996240100000e-03 1.749362126200000e-05 1.370812695800000e-03 1.573106497300000e-03 8.041795444800000e-05 1.576398830400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.140000000000000e+02 -2.297187235095473e+06 -9.760356108521180e+05 6.392802850975322e+06 -7.235833007526532e+03 3.141764840220623e+01 -2.589725812256739e+03 5.021996240100000e-03 1.749362126200000e-05 1.370812695800000e-03 1.573106497300000e-03 8.041795444800000e-05 1.576398830400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.150000000000000e+02 -2.297331951179355e+06 -9.760349820482755e+05 6.392751054887115e+06 -7.235776665327678e+03 3.146271119006934e+01 -2.589883472036084e+03 5.021996240100000e-03 1.749362126200000e-05 1.370812695800000e-03 1.573106497300000e-03 8.041795444800000e-05 1.576398830400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.160000000000000e+02 -2.297476666137875e+06 -9.760343523432106e+05 6.392699255645178e+06 -7.235720319439543e+03 3.150777372445521e+01 -2.590041130549449e+03 5.021374848300000e-03 1.732159448200000e-05 1.371603255200000e-03 1.573155774700000e-03 8.035120528800000e-05 1.577014581100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.170000000000000e+02 -2.297621380002997e+06 -9.760337217375438e+05 6.392647453237933e+06 -7.235663969526699e+03 3.155283553382151e+01 -2.590198788699860e+03 5.021374848300000e-03 1.732159448200000e-05 1.371603255200000e-03 1.573155774700000e-03 8.035120528800000e-05 1.577014581100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.180000000000000e+02 -2.297766092710560e+06 -9.760330902300513e+05 6.392595647688617e+06 -7.235607616267703e+03 3.159789792104684e+01 -2.590356444678804e+03 5.021374848300000e-03 1.732159448200000e-05 1.371603255200000e-03 1.573155774700000e-03 8.035120528800000e-05 1.577014581100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.190000000000000e+02 -2.297910804292535e+06 -9.760324578213510e+05 6.392543838985648e+06 -7.235551259330372e+03 3.164295973286852e+01 -2.590514099344590e+03 5.021374848300000e-03 1.732159448200000e-05 1.371603255200000e-03 1.573155774700000e-03 8.035120528800000e-05 1.577014581100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.200000000000000e+02 -2.298055514651875e+06 -9.760318245096196e+05 6.392492027164192e+06 -7.235494899919402e+03 3.168802052275547e+01 -2.590671749342333e+03 5.021374848300000e-03 1.732159448200000e-05 1.371603255200000e-03 1.573155774700000e-03 8.035120528800000e-05 1.577014581100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.210000000000000e+02 -2.298200224082076e+06 -9.760311903033106e+05 6.392440212126990e+06 -7.235438677349632e+03 3.173293409504456e+01 -2.590829001771826e+03 5.021374848300000e-03 1.732159448200000e-05 1.371603255200000e-03 1.573155774700000e-03 8.035120528800000e-05 1.577014581100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.220000000000000e+02 -2.298344932302782e+06 -9.760305552101495e+05 6.392388394016127e+06 -7.235383088658174e+03 3.177718440178595e+01 -2.590984455353287e+03 5.021374848300000e-03 1.732159448200000e-05 1.371603255200000e-03 1.573155774700000e-03 8.035120528800000e-05 1.577014581100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.230000000000000e+02 -2.298489639389528e+06 -9.760299192156357e+05 6.392336572754644e+06 -7.235326717079159e+03 3.182224581918928e+01 -2.591142104885861e+03 5.021374848300000e-03 1.732159448200000e-05 1.371603255200000e-03 1.573155774700000e-03 8.035120528800000e-05 1.577014581100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.240000000000000e+02 -2.298634345285808e+06 -9.760292823187136e+05 6.392284748363018e+06 -7.235270342587253e+03 3.186730634701280e+01 -2.591299750972697e+03 5.021374848300000e-03 1.732159448200000e-05 1.371603255200000e-03 1.573155774700000e-03 8.035120528800000e-05 1.577014581100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.250000000000000e+02 -2.298779050184865e+06 -9.760286445230371e+05 6.392232920771204e+06 -7.235213962854798e+03 3.191236717216555e+01 -2.591457400111187e+03 5.021374848300000e-03 1.732159448200000e-05 1.371603255200000e-03 1.573155774700000e-03 8.035120528800000e-05 1.577014581100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.260000000000000e+02 -2.298923753893520e+06 -9.760280058249605e+05 6.392181090049224e+06 -7.235157580216531e+03 3.195742794732149e+01 -2.591615045828348e+03 5.020753139600000e-03 1.714959650700000e-05 1.372393531200000e-03 1.573205069100000e-03 8.028436716200000e-05 1.577630687100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.270000000000000e+02 -2.299068456379248e+06 -9.760273662238794e+05 6.392129256208871e+06 -7.235101195131421e+03 3.200248784460427e+01 -2.591772686812657e+03 5.020753139600000e-03 1.714959650700000e-05 1.372393531200000e-03 1.573205069100000e-03 8.028436716200000e-05 1.577630687100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.280000000000000e+02 -2.299213157835276e+06 -9.760267257234468e+05 6.392077419180094e+06 -7.235044805076574e+03 3.204754776421592e+01 -2.591930330085002e+03 5.020753139600000e-03 1.714959650700000e-05 1.372393531200000e-03 1.573205069100000e-03 8.028436716200000e-05 1.577630687100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.290000000000000e+02 -2.299357858197436e+06 -9.760260843224470e+05 6.392025578986151e+06 -7.234988411029499e+03 3.209260818900003e+01 -2.592087972968332e+03 5.020753139600000e-03 1.714959650700000e-05 1.372393531200000e-03 1.573205069100000e-03 8.028436716200000e-05 1.577630687100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.300000000000000e+02 -2.299502557400950e+06 -9.760254420196683e+05 6.391973735650529e+06 -7.234932013643483e+03 3.213766806890573e+01 -2.592245613602176e+03 5.020753139600000e-03 1.714959650700000e-05 1.372393531200000e-03 1.573205069100000e-03 8.028436716200000e-05 1.577630687100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.310000000000000e+02 -2.299647255480698e+06 -9.760247988186900e+05 6.391921889169828e+06 -7.234875758073320e+03 3.218257916735200e+01 -2.592402843132475e+03 5.020753139600000e-03 1.714959650700000e-05 1.372393531200000e-03 1.573205069100000e-03 8.028436716200000e-05 1.577630687100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.320000000000000e+02 -2.299791952487081e+06 -9.760241547334178e+05 6.391870039566969e+06 -7.234820146374444e+03 3.222683060912212e+01 -2.592558247726564e+03 5.020753139600000e-03 1.714959650700000e-05 1.372393531200000e-03 1.573205069100000e-03 8.028436716200000e-05 1.577630687100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.330000000000000e+02 -2.299936648420820e+06 -9.760235097480015e+05 6.391818186791234e+06 -7.234763737210457e+03 3.227189011201574e+01 -2.592715886784233e+03 5.020753139600000e-03 1.714959650700000e-05 1.372393531200000e-03 1.573205069100000e-03 8.028436716200000e-05 1.577630687100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.340000000000000e+02 -2.300081343163576e+06 -9.760228638602195e+05 6.391766330885543e+06 -7.234707325143291e+03 3.231694934494567e+01 -2.592873522402964e+03 5.020753139600000e-03 1.714959650700000e-05 1.372393531200000e-03 1.573205069100000e-03 8.028436716200000e-05 1.577630687100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.350000000000000e+02 -2.300226036715068e+06 -9.760222170700709e+05 6.391714471850006e+06 -7.234650910261606e+03 3.236200794692300e+01 -2.593031154319448e+03 5.020753139600000e-03 1.714959650700000e-05 1.372393531200000e-03 1.573205069100000e-03 8.028436716200000e-05 1.577630687100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.360000000000000e+02 -2.300370729139518e+06 -9.760215693787773e+05 6.391662609661322e+06 -7.234594491633615e+03 3.240706614629158e+01 -2.593188785120072e+03 5.020131113400000e-03 1.697762722800000e-05 1.373183523700000e-03 1.573254380600000e-03 8.021744003500000e-05 1.578247148300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.370000000000000e+02 -2.300515420566265e+06 -9.760209207887572e+05 6.391610744272572e+06 -7.234538067779573e+03 3.245212538057694e+01 -2.593346418967174e+03 5.020131113400000e-03 1.697762722800000e-05 1.373183523700000e-03 1.573254380600000e-03 8.021744003500000e-05 1.578247148300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.380000000000000e+02 -2.300660110833783e+06 -9.760202712969959e+05 6.391558875742348e+06 -7.234481640606480e+03 3.249718387586299e+01 -2.593504050500144e+03 5.020131113400000e-03 1.697762722800000e-05 1.373183523700000e-03 1.573254380600000e-03 8.021744003500000e-05 1.578247148300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.390000000000000e+02 -2.300804799941776e+06 -9.760196209034873e+05 6.391507004070750e+06 -7.234425210064124e+03 3.254224184045728e+01 -2.593661679868741e+03 5.020131113400000e-03 1.697762722800000e-05 1.373183523700000e-03 1.573254380600000e-03 8.021744003500000e-05 1.578247148300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.400000000000000e+02 -2.300949487922850e+06 -9.760189696088424e+05 6.391455129245961e+06 -7.234368775944558e+03 3.258730027331984e+01 -2.593819307699521e+03 5.020131113400000e-03 1.697762722800000e-05 1.373183523700000e-03 1.573254380600000e-03 8.021744003500000e-05 1.578247148300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.410000000000000e+02 -2.301094174747752e+06 -9.760183174156197e+05 6.391403251288996e+06 -7.234312502456978e+03 3.263220007603206e+01 -2.593976472250044e+03 5.020131113400000e-03 1.697762722800000e-05 1.373183523700000e-03 1.573254380600000e-03 8.021744003500000e-05 1.578247148300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.420000000000000e+02 -2.301238860419793e+06 -9.760176643376765e+05 6.391351370245011e+06 -7.234256955853776e+03 3.267639628745516e+01 -2.594131581676538e+03 5.020131113400000e-03 1.697762722800000e-05 1.373183523700000e-03 1.573254380600000e-03 8.021744003500000e-05 1.578247148300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.430000000000000e+02 -2.301383545014137e+06 -9.760170103595363e+05 6.391299486029962e+06 -7.234200510341783e+03 3.272145429543352e+01 -2.594289206863173e+03 5.020131113400000e-03 1.697762722800000e-05 1.373183523700000e-03 1.573254380600000e-03 8.021744003500000e-05 1.578247148300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.440000000000000e+02 -2.301528228448805e+06 -9.760163554796703e+05 6.391247598673602e+06 -7.234144061562250e+03 3.276651160733459e+01 -2.594446829596317e+03 5.020131113400000e-03 1.697762722800000e-05 1.373183523700000e-03 1.573254380600000e-03 8.021744003500000e-05 1.578247148300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.450000000000000e+02 -2.301672910820268e+06 -9.760156996998999e+05 6.391195708140914e+06 -7.234087608286742e+03 3.281156885219096e+01 -2.594604453300289e+03 5.020131113400000e-03 1.697762722800000e-05 1.373183523700000e-03 1.573254380600000e-03 8.021744003500000e-05 1.578247148300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.460000000000000e+02 -2.301817591903123e+06 -9.760150430159904e+05 6.391143814513717e+06 -7.234031153342731e+03 3.285662551118131e+01 -2.594762070142385e+03 5.019508769700000e-03 1.680568669000000e-05 1.373973232300000e-03 1.573303709100000e-03 8.015042393500000e-05 1.578863964400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.470000000000000e+02 -2.301962271954871e+06 -9.760143854327915e+05 6.391091917698540e+06 -7.233974693509971e+03 3.290168199751173e+01 -2.594919689034170e+03 5.019508769700000e-03 1.680568669000000e-05 1.373973232300000e-03 1.573303709100000e-03 8.015042393500000e-05 1.578863964400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.480000000000000e+02 -2.302106950911362e+06 -9.760137269490858e+05 6.391040017718662e+06 -7.233918229630690e+03 3.294673914343315e+01 -2.595077307693565e+03 5.019508769700000e-03 1.680568669000000e-05 1.373973232300000e-03 1.573303709100000e-03 8.015042393500000e-05 1.578863964400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.490000000000000e+02 -2.302251628707810e+06 -9.760130675636790e+05 6.390988114597604e+06 -7.233861762391188e+03 3.299179539746572e+01 -2.595234924145538e+03 5.019508769700000e-03 1.680568669000000e-05 1.373973232300000e-03 1.573303709100000e-03 8.015042393500000e-05 1.578863964400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.500000000000000e+02 -2.302396305376188e+06 -9.760124072771736e+05 6.390936208323758e+06 -7.233805291545704e+03 3.303685142915310e+01 -2.595392539103342e+03 5.019508769700000e-03 1.680568669000000e-05 1.373973232300000e-03 1.573303709100000e-03 8.015042393500000e-05 1.578863964400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.510000000000000e+02 -2.302540980919675e+06 -9.760117460927095e+05 6.390884298904980e+06 -7.233748958670242e+03 3.308175087610030e+01 -2.595549753762369e+03 5.019508769700000e-03 1.680568669000000e-05 1.373973232300000e-03 1.573303709100000e-03 8.015042393500000e-05 1.578863964400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.520000000000000e+02 -2.302685655343970e+06 -9.760110840241499e+05 6.390832386379334e+06 -7.233693253195255e+03 3.312595080405259e+01 -2.595705189518026e+03 5.019508769700000e-03 1.680568669000000e-05 1.373973232300000e-03 1.573303709100000e-03 8.015042393500000e-05 1.578863964400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.530000000000000e+02 -2.302830328659843e+06 -9.760104210548747e+05 6.390780470693761e+06 -7.233636770973645e+03 3.317100649882238e+01 -2.595862801772251e+03 5.019508769700000e-03 1.680568669000000e-05 1.373973232300000e-03 1.573303709100000e-03 8.015042393500000e-05 1.578863964400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.540000000000000e+02 -2.302975000783268e+06 -9.760097571833066e+05 6.390728551878775e+06 -7.233580285786195e+03 3.321606215106934e+01 -2.596020410775433e+03 5.019508769700000e-03 1.680568669000000e-05 1.373973232300000e-03 1.573303709100000e-03 8.015042393500000e-05 1.578863964400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.550000000000000e+02 -2.303119671746221e+06 -9.760090924100579e+05 6.390676629922768e+06 -7.233523797424321e+03 3.326111704583005e+01 -2.596178017066318e+03 5.019508769700000e-03 1.680568669000000e-05 1.373973232300000e-03 1.573303709100000e-03 8.015042393500000e-05 1.578863964400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.560000000000000e+02 -2.303264341709640e+06 -9.760084267381456e+05 6.390624704767272e+06 -7.233467303645565e+03 3.330617231240166e+01 -2.596335626889870e+03 5.018886108000000e-03 1.663377478100000e-05 1.374762657100000e-03 1.573353054600000e-03 8.008331882600000e-05 1.579481135400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.570000000000000e+02 -2.303409010415908e+06 -9.760077601627480e+05 6.390572776505874e+06 -7.233410807938605e+03 3.335122717111173e+01 -2.596493230581415e+03 5.018886108000000e-03 1.663377478100000e-05 1.374762657100000e-03 1.573353054600000e-03 8.008331882600000e-05 1.579481135400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.580000000000000e+02 -2.303553678154747e+06 -9.760070926892975e+05 6.390520845033318e+06 -7.233354306418226e+03 3.339628225006695e+01 -2.596650838890849e+03 5.018886108000000e-03 1.663377478100000e-05 1.374762657100000e-03 1.573353054600000e-03 8.008331882600000e-05 1.579481135400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.590000000000000e+02 -2.303698344604038e+06 -9.760064243117662e+05 6.390468910466627e+06 -7.233297803276848e+03 3.344133668730038e+01 -2.596808440209386e+03 5.018886108000000e-03 1.663377478100000e-05 1.374762657100000e-03 1.573353054600000e-03 8.008331882600000e-05 1.579481135400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.600000000000000e+02 -2.303843009989225e+06 -9.760057550343777e+05 6.390416972723898e+06 -7.233241295681996e+03 3.348639122742989e+01 -2.596966042388359e+03 5.018886108000000e-03 1.663377478100000e-05 1.374762657100000e-03 1.573353054600000e-03 8.008331882600000e-05 1.579481135400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.610000000000000e+02 -2.303987674248873e+06 -9.760050848591599e+05 6.390365031838028e+06 -7.233184951153392e+03 3.353128379276615e+01 -2.597123175074384e+03 5.018886108000000e-03 1.663377478100000e-05 1.374762657100000e-03 1.573353054600000e-03 8.008331882600000e-05 1.579481135400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.620000000000000e+02 -2.304132337399315e+06 -9.760044138004952e+05 6.390313087850197e+06 -7.233129345977893e+03 3.357545878505539e+01 -2.597278220524346e+03 5.018886108000000e-03 1.663377478100000e-05 1.374762657100000e-03 1.573353054600000e-03 8.008331882600000e-05 1.579481135400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.630000000000000e+02 -2.304276999405974e+06 -9.760037418405013e+05 6.390261140715275e+06 -7.233072827403797e+03 3.362051256433864e+01 -2.597435818906247e+03 5.018886108000000e-03 1.663377478100000e-05 1.374762657100000e-03 1.573353054600000e-03 8.008331882600000e-05 1.579481135400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.640000000000000e+02 -2.304421660283534e+06 -9.760030689794616e+05 6.390209190427921e+06 -7.233016305136201e+03 3.366556600214747e+01 -2.597593416029368e+03 5.018886108000000e-03 1.663377478100000e-05 1.374762657100000e-03 1.573353054600000e-03 8.008331882600000e-05 1.579481135400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.650000000000000e+02 -2.304566320032335e+06 -9.760023952173759e+05 6.390157236988008e+06 -7.232959779124208e+03 3.371061979206698e+01 -2.597751012069913e+03 5.018886108000000e-03 1.663377478100000e-05 1.374762657100000e-03 1.573353054600000e-03 8.008331882600000e-05 1.579481135400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.660000000000000e+02 -2.304710978652103e+06 -9.760017205542516e+05 6.390105280395642e+06 -7.232903249524650e+03 3.375567314394053e+01 -2.597908606554642e+03 5.018263127900000e-03 1.646189144500000e-05 1.375551797800000e-03 1.573402417100000e-03 8.001612469600000e-05 1.580098661500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.670000000000000e+02 -2.304855636078063e+06 -9.760010449888910e+05 6.390053320674362e+06 -7.232846716921988e+03 3.380072561475990e+01 -2.598066197849610e+03 5.018263127900000e-03 1.646189144500000e-05 1.375551797800000e-03 1.573402417100000e-03 8.001612469600000e-05 1.580098661500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.680000000000000e+02 -2.305000292504015e+06 -9.760003685248996e+05 6.390001357753716e+06 -7.232790179141709e+03 3.384577920270254e+01 -2.598223792052215e+03 5.018263127900000e-03 1.646189144500000e-05 1.375551797800000e-03 1.573402417100000e-03 8.001612469600000e-05 1.580098661500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.690000000000000e+02 -2.305144947736228e+06 -9.759996911586766e+05 6.389949391704139e+06 -7.232733638513234e+03 3.389083207028264e+01 -2.598381382646376e+03 5.018263127900000e-03 1.646189144500000e-05 1.375551797800000e-03 1.573402417100000e-03 8.001612469600000e-05 1.580098661500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.700000000000000e+02 -2.305289601838896e+06 -9.759990128914282e+05 6.389897422502275e+06 -7.232677093988549e+03 3.393588443860386e+01 -2.598538972532311e+03 5.018263127900000e-03 1.646189144500000e-05 1.375551797800000e-03 1.573402417100000e-03 8.001612469600000e-05 1.580098661500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.710000000000000e+02 -2.305434254815036e+06 -9.759983337261686e+05 6.389845450155530e+06 -7.232620679596188e+03 3.398078651740127e+01 -2.598696184633669e+03 5.018263127900000e-03 1.646189144500000e-05 1.375551797800000e-03 1.573402417100000e-03 8.001612469600000e-05 1.580098661500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.720000000000000e+02 -2.305578906673605e+06 -9.759976536762562e+05 6.389793474698432e+06 -7.232564856106836e+03 3.402501798416407e+01 -2.598851722526878e+03 5.018263127900000e-03 1.646189144500000e-05 1.375551797800000e-03 1.573402417100000e-03 8.001612469600000e-05 1.580098661500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.730000000000000e+02 -2.305723557424678e+06 -9.759969727257353e+05 6.389741496081029e+06 -7.232508300275673e+03 3.407007053351742e+01 -2.599009309559314e+03 5.018263127900000e-03 1.646189144500000e-05 1.375551797800000e-03 1.573402417100000e-03 8.001612469600000e-05 1.580098661500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.740000000000000e+02 -2.305868206949405e+06 -9.759962908724044e+05 6.389689514346557e+06 -7.232451742136782e+03 3.411512199289439e+01 -2.599166891476089e+03 5.018263127900000e-03 1.646189144500000e-05 1.375551797800000e-03 1.573402417100000e-03 8.001612469600000e-05 1.580098661500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.750000000000000e+02 -2.306012855376469e+06 -9.759956081186660e+05 6.389637529448207e+06 -7.232395179782359e+03 3.416017325231181e+01 -2.599324473579984e+03 5.018263127900000e-03 1.646189144500000e-05 1.375551797800000e-03 1.573402417100000e-03 8.001612469600000e-05 1.580098661500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.760000000000000e+02 -2.306157502738447e+06 -9.759949244651252e+05 6.389585541374129e+06 -7.232338613014128e+03 3.420522524026012e+01 -2.599482056464748e+03 5.017639829100000e-03 1.629003662300000e-05 1.376340654400000e-03 1.573451796600000e-03 7.994884153100000e-05 1.580716542400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.770000000000000e+02 -2.306302148938335e+06 -9.759942399099814e+05 6.389533550159602e+06 -7.232282042920642e+03 3.425027659133721e+01 -2.599639637060999e+03 5.017639829100000e-03 1.629003662300000e-05 1.376340654400000e-03 1.573451796600000e-03 7.994884153100000e-05 1.580716542400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.780000000000000e+02 -2.306446794008099e+06 -9.759935544538414e+05 6.389481555793001e+06 -7.232225469144749e+03 3.429532751864599e+01 -2.599797216363729e+03 5.017639829100000e-03 1.629003662300000e-05 1.376340654400000e-03 1.573451796600000e-03 7.994884153100000e-05 1.580716542400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.790000000000000e+02 -2.306591437948074e+06 -9.759928680967103e+05 6.389429558274202e+06 -7.232168891696190e+03 3.434037866281784e+01 -2.599954794379061e+03 5.017639829100000e-03 1.629003662300000e-05 1.376340654400000e-03 1.573451796600000e-03 7.994884153100000e-05 1.580716542400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.800000000000000e+02 -2.306736080757986e+06 -9.759921808385875e+05 6.389377557603304e+06 -7.232112310624472e+03 3.438542955266476e+01 -2.600112370946413e+03 5.017639829100000e-03 1.629003662300000e-05 1.376340654400000e-03 1.573451796600000e-03 7.994884153100000e-05 1.580716542400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.810000000000000e+02 -2.306880722441456e+06 -9.759914926823219e+05 6.389325553791297e+06 -7.232055920844881e+03 3.443033786482727e+01 -2.600269401968038e+03 5.017639829100000e-03 1.629003662300000e-05 1.376340654400000e-03 1.573451796600000e-03 7.994884153100000e-05 1.580716542400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.820000000000000e+02 -2.307025363119745e+06 -9.759908036424856e+05 6.389273546848882e+06 -7.232000395190915e+03 3.447461454458838e+01 -2.600424009625004e+03 5.017639829100000e-03 1.629003662300000e-05 1.376340654400000e-03 1.573451796600000e-03 7.994884153100000e-05 1.580716542400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.830000000000000e+02 -2.307170002591421e+06 -9.759901137002571e+05 6.389221536782218e+06 -7.231943803096415e+03 3.451966461308064e+01 -2.600581582536063e+03 5.017639829100000e-03 1.629003662300000e-05 1.376340654400000e-03 1.573451796600000e-03 7.994884153100000e-05 1.580716542400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.840000000000000e+02 -2.307314640868469e+06 -9.759894228558550e+05 6.389169523586949e+06 -7.231887208119981e+03 3.456471463671934e+01 -2.600739151969119e+03 5.017639829100000e-03 1.629003662300000e-05 1.376340654400000e-03 1.573451796600000e-03 7.994884153100000e-05 1.580716542400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.850000000000000e+02 -2.307459278144036e+06 -9.759887311128780e+05 6.389117507192772e+06 -7.231830607864847e+03 3.460976477226782e+01 -2.600896724531353e+03 5.017639829100000e-03 1.629003662300000e-05 1.376340654400000e-03 1.573451796600000e-03 7.994884153100000e-05 1.580716542400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.860000000000000e+02 -2.307603914127703e+06 -9.759880384659404e+05 6.389065487705395e+06 -7.231774005916011e+03 3.465481376557278e+01 -2.601054290288031e+03 5.017016211000000e-03 1.611821020400000e-05 1.377129227100000e-03 1.573501193200000e-03 7.988146929600000e-05 1.581334778300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.870000000000000e+02 -2.307748549109946e+06 -9.759873449204298e+05 6.389013465019081e+06 -7.231717398699397e+03 3.469986377513990e+01 -2.601211859189825e+03 5.017016211000000e-03 1.611821020400000e-05 1.377129227100000e-03 1.573501193200000e-03 7.988146929600000e-05 1.581334778300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.880000000000000e+02 -2.307893182929296e+06 -9.759866504733636e+05 6.388961439192609e+06 -7.231660788197129e+03 3.474491300317368e+01 -2.601369425687496e+03 5.017016211000000e-03 1.611821020400000e-05 1.377129227100000e-03 1.573501193200000e-03 7.988146929600000e-05 1.581334778300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.890000000000000e+02 -2.308037815553240e+06 -9.759859551241413e+05 6.388909410237816e+06 -7.231604174828954e+03 3.478996168694732e+01 -2.601526988638191e+03 5.017016211000000e-03 1.611821020400000e-05 1.377129227100000e-03 1.573501193200000e-03 7.988146929600000e-05 1.581334778300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.900000000000000e+02 -2.308182447207774e+06 -9.759852588769560e+05 6.388857378072411e+06 -7.231547555696520e+03 3.483501145103153e+01 -2.601684556102601e+03 5.017016211000000e-03 1.611821020400000e-05 1.377129227100000e-03 1.573501193200000e-03 7.988146929600000e-05 1.581334778300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.910000000000000e+02 -2.308327077637313e+06 -9.759845617303624e+05 6.388805342797697e+06 -7.231491063611123e+03 3.487989340249192e+01 -2.601841753922066e+03 5.017016211000000e-03 1.611821020400000e-05 1.377129227100000e-03 1.573501193200000e-03 7.988146929600000e-05 1.581334778300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.920000000000000e+02 -2.308471706840635e+06 -9.759838636989928e+05 6.388753304450812e+06 -7.231435145628209e+03 3.492403167255549e+01 -2.601997322448986e+03 5.017016211000000e-03 1.611821020400000e-05 1.377129227100000e-03 1.573501193200000e-03 7.988146929600000e-05 1.581334778300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.930000000000000e+02 -2.308616334964999e+06 -9.759831647676412e+05 6.388701262933206e+06 -7.231378516810354e+03 3.496908034197929e+01 -2.602154882496796e+03 5.017016211000000e-03 1.611821020400000e-05 1.377129227100000e-03 1.573501193200000e-03 7.988146929600000e-05 1.581334778300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.940000000000000e+02 -2.308760961958274e+06 -9.759824649353505e+05 6.388649218263859e+06 -7.231321884333040e+03 3.501412868617993e+01 -2.602312441193087e+03 5.017016211000000e-03 1.611821020400000e-05 1.377129227100000e-03 1.573501193200000e-03 7.988146929600000e-05 1.581334778300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.950000000000000e+02 -2.308905587852407e+06 -9.759817642027236e+05 6.388597170431125e+06 -7.231265247639813e+03 3.505917658934621e+01 -2.602470000062866e+03 5.017016211000000e-03 1.611821020400000e-05 1.377129227100000e-03 1.573501193200000e-03 7.988146929600000e-05 1.581334778300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.960000000000000e+02 -2.309050212551035e+06 -9.759810625679693e+05 6.388545119470113e+06 -7.231208608191666e+03 3.510422464935658e+01 -2.602627555117187e+03 5.016392273600000e-03 1.594641223400000e-05 1.377917515100000e-03 1.573550606700000e-03 7.981400801700001e-05 1.581953368800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.970000000000000e+02 -2.309194836182614e+06 -9.759803600334852e+05 6.388493065334026e+06 -7.231151964240817e+03 3.514927210006482e+01 -2.602785111125289e+03 5.016392273600000e-03 1.594641223400000e-05 1.377917515100000e-03 1.573550606700000e-03 7.981400801700001e-05 1.581953368800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.980000000000000e+02 -2.309339458650781e+06 -9.759796565974763e+05 6.388441008057968e+06 -7.231095317006145e+03 3.519432001280950e+01 -2.602942664788770e+03 5.016392273600000e-03 1.594641223400000e-05 1.377917515100000e-03 1.573550606700000e-03 7.981400801700001e-05 1.581953368800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.990000000000000e+02 -2.309484079987488e+06 -9.759789522605491e+05 6.388388947630296e+06 -7.231038666089721e+03 3.523936725764017e+01 -2.603100217144557e+03 5.016392273600000e-03 1.594641223400000e-05 1.377917515100000e-03 1.573550606700000e-03 7.981400801700001e-05 1.581953368800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.000000000000000e+02 -2.309628700160214e+06 -9.759782470221096e+05 6.388336884062854e+06 -7.230982011814405e+03 3.528441405942357e+01 -2.603257767316165e+03 5.016392273600000e-03 1.594641223400000e-05 1.377917515100000e-03 1.573550606700000e-03 7.981400801700001e-05 1.581953368800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.010000000000000e+02 -2.309773319236608e+06 -9.759775408863425e+05 6.388284817339966e+06 -7.230925495053384e+03 3.532931173331093e+01 -2.603414920287308e+03 5.016392273600000e-03 1.594641223400000e-05 1.377917515100000e-03 1.573550606700000e-03 7.981400801700001e-05 1.581953368800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.020000000000000e+02 -2.309917937223480e+06 -9.759768338664833e+05 6.388232747499057e+06 -7.230869604082289e+03 3.537354258631362e+01 -2.603570306977359e+03 5.016392273600000e-03 1.594641223400000e-05 1.377917515100000e-03 1.573550606700000e-03 7.981400801700001e-05 1.581953368800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.030000000000000e+02 -2.310062554039746e+06 -9.759761259450067e+05 6.388180674520799e+06 -7.230812938512145e+03 3.541858879774819e+01 -2.603727854211665e+03 5.016392273600000e-03 1.594641223400000e-05 1.377917515100000e-03 1.573550606700000e-03 7.981400801700001e-05 1.581953368800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.040000000000000e+02 -2.310207169724392e+06 -9.759754171226243e+05 6.388128598390975e+06 -7.230756269215600e+03 3.546363562182268e+01 -2.603885400326497e+03 5.016392273600000e-03 1.594641223400000e-05 1.377917515100000e-03 1.573550606700000e-03 7.981400801700001e-05 1.581953368800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.050000000000000e+02 -2.310351784277136e+06 -9.759747073993445e+05 6.388076519109693e+06 -7.230699596304546e+03 3.550868181967897e+01 -2.604042944950919e+03 5.016392273600000e-03 1.594641223400000e-05 1.377917515100000e-03 1.573550606700000e-03 7.981400801700001e-05 1.581953368800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.060000000000000e+02 -2.310496397633235e+06 -9.759739967739804e+05 6.388024436700549e+06 -7.230642920488226e+03 3.555372732928259e+01 -2.604200486131962e+03 5.015768016400000e-03 1.577464260100000e-05 1.378705518600000e-03 1.573600037200000e-03 7.974645766000000e-05 1.582572314100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.070000000000000e+02 -2.310641009986426e+06 -9.759732852501053e+05 6.387972351092925e+06 -7.230586239348503e+03 3.559877379111251e+01 -2.604358030601300e+03 5.015768016400000e-03 1.577464260100000e-05 1.378705518600000e-03 1.573600037200000e-03 7.974645766000000e-05 1.582572314100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.080000000000000e+02 -2.310785621175052e+06 -9.759725728247452e+05 6.387920262345740e+06 -7.230529554973450e+03 3.564381947846778e+01 -2.604515572530116e+03 5.015768016400000e-03 1.577464260100000e-05 1.378705518600000e-03 1.573600037200000e-03 7.974645766000000e-05 1.582572314100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.090000000000000e+02 -2.310930231167224e+06 -9.759718594973132e+05 6.387868170470624e+06 -7.230472867724651e+03 3.568886495837396e+01 -2.604673110953750e+03 5.015768016400000e-03 1.577464260100000e-05 1.378705518600000e-03 1.573600037200000e-03 7.974645766000000e-05 1.582572314100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.100000000000000e+02 -2.311074840027132e+06 -9.759711452690018e+05 6.387816075444176e+06 -7.230416176784405e+03 3.573391010707431e+01 -2.604830648113772e+03 5.015768016400000e-03 1.577464260100000e-05 1.378705518600000e-03 1.573600037200000e-03 7.974645766000000e-05 1.582572314100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.110000000000000e+02 -2.311219447757964e+06 -9.759704301431099e+05 6.387763977276184e+06 -7.230359655337860e+03 3.577879016293315e+01 -2.604987699663997e+03 5.015768016400000e-03 1.577464260100000e-05 1.378705518600000e-03 1.573600037200000e-03 7.974645766000000e-05 1.582572314100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.120000000000000e+02 -2.311364054435110e+06 -9.759697141354021e+05 6.387711875987923e+06 -7.230303900893686e+03 3.582293755070236e+01 -2.605142594833091e+03 5.015768016400000e-03 1.577464260100000e-05 1.378705518600000e-03 1.573600037200000e-03 7.974645766000000e-05 1.582572314100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.130000000000000e+02 -2.311508659923722e+06 -9.759689972257973e+05 6.387659771568845e+06 -7.230247198590308e+03 3.586798214419187e+01 -2.605300129302379e+03 5.015768016400000e-03 1.577464260100000e-05 1.378705518600000e-03 1.573600037200000e-03 7.974645766000000e-05 1.582572314100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.140000000000000e+02 -2.311653264247335e+06 -9.759682794147303e+05 6.387607664010365e+06 -7.230190492984709e+03 3.591302640449283e+01 -2.605457661438313e+03 5.015768016400000e-03 1.577464260100000e-05 1.378705518600000e-03 1.573600037200000e-03 7.974645766000000e-05 1.582572314100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.150000000000000e+02 -2.311797867470748e+06 -9.759675607033941e+05 6.387555553288857e+06 -7.230133783396086e+03 3.595807108637078e+01 -2.605615193150070e+03 5.015768016400000e-03 1.577464260100000e-05 1.378705518600000e-03 1.573600037200000e-03 7.974645766000000e-05 1.582572314100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.160000000000000e+02 -2.311942469561457e+06 -9.759668410911999e+05 6.387503439416168e+06 -7.230077070045540e+03 3.600311534174566e+01 -2.605772723786839e+03 5.015143439100000e-03 1.560290124800000e-05 1.379493237500000e-03 1.573649484600000e-03 7.967881821100000e-05 1.583191614000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.170000000000000e+02 -2.312087070551411e+06 -9.759661205787475e+05 6.387451322380641e+06 -7.230020352567044e+03 3.604815927816733e+01 -2.605930254359602e+03 5.015143439100000e-03 1.560290124800000e-05 1.379493237500000e-03 1.573649484600000e-03 7.967881821100000e-05 1.583191614000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.180000000000000e+02 -2.312231670312022e+06 -9.759653991636629e+05 6.387399202229189e+06 -7.229963632764319e+03 3.609320297731247e+01 -2.606087779917531e+03 5.015143439100000e-03 1.560290124800000e-05 1.379493237500000e-03 1.573649484600000e-03 7.967881821100000e-05 1.583191614000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.190000000000000e+02 -2.312376269004173e+06 -9.759646768489161e+05 6.387347078903116e+06 -7.229906908326152e+03 3.613824676423371e+01 -2.606245306826282e+03 5.015143439100000e-03 1.560290124800000e-05 1.379493237500000e-03 1.573649484600000e-03 7.967881821100000e-05 1.583191614000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.200000000000000e+02 -2.312520866530881e+06 -9.759639536327353e+05 6.387294952437805e+06 -7.229850180716039e+03 3.618328974476913e+01 -2.606402831020254e+03 5.015143439100000e-03 1.560290124800000e-05 1.379493237500000e-03 1.573649484600000e-03 7.967881821100000e-05 1.583191614000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.210000000000000e+02 -2.312665462992350e+06 -9.759632295197702e+05 6.387242822806677e+06 -7.229793606656806e+03 3.622819000416681e+01 -2.606559914867565e+03 5.015143439100000e-03 1.560290124800000e-05 1.379493237500000e-03 1.573649484600000e-03 7.967881821100000e-05 1.583191614000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.220000000000000e+02 -2.312810058371404e+06 -9.759625045222543e+05 6.387190690060458e+06 -7.229737732735483e+03 3.627244999832391e+01 -2.606715032152024e+03 5.015143439100000e-03 1.560290124800000e-05 1.379493237500000e-03 1.573649484600000e-03 7.967881821100000e-05 1.583191614000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.230000000000000e+02 -2.312954652543192e+06 -9.759617786225353e+05 6.387138554190260e+06 -7.229680993737282e+03 3.631749332441922e+01 -2.606872553683168e+03 5.015143439100000e-03 1.560290124800000e-05 1.379493237500000e-03 1.573649484600000e-03 7.967881821100000e-05 1.583191614000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.240000000000000e+02 -2.313099245452779e+06 -9.759610518196196e+05 6.387086415216139e+06 -7.229624252702236e+03 3.636253531926511e+01 -2.607030069356574e+03 5.015143439100000e-03 1.560290124800000e-05 1.379493237500000e-03 1.573649484600000e-03 7.967881821100000e-05 1.583191614000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.250000000000000e+02 -2.313243837422158e+06 -9.759603241194346e+05 6.387034273020567e+06 -7.229567505415195e+03 3.640757800273047e+01 -2.607187590848961e+03 5.015143439100000e-03 1.560290124800000e-05 1.379493237500000e-03 1.573649484600000e-03 7.967881821100000e-05 1.583191614000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.260000000000000e+02 -2.313388428226072e+06 -9.759595955178342e+05 6.386982127685765e+06 -7.229510754956326e+03 3.645262085937856e+01 -2.607345109676281e+03 5.014518541200000e-03 1.543118811600000e-05 1.380280671700000e-03 1.573698949000000e-03 7.961108965500000e-05 1.583811268500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.270000000000000e+02 -2.313533017864252e+06 -9.759588660148230e+05 6.386929979211821e+06 -7.229454001146535e+03 3.649766311850584e+01 -2.607502626291375e+03 5.014518541200000e-03 1.543118811600000e-05 1.380280671700000e-03 1.573698949000000e-03 7.961108965500000e-05 1.583811268500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.280000000000000e+02 -2.313677606368627e+06 -9.759581356109991e+05 6.386877827587086e+06 -7.229397243752951e+03 3.654270471436584e+01 -2.607660141330364e+03 5.014518541200000e-03 1.543118811600000e-05 1.380280671700000e-03 1.573698949000000e-03 7.961108965500000e-05 1.583811268500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.290000000000000e+02 -2.313822193804006e+06 -9.759574043075449e+05 6.386825672787897e+06 -7.229340481820148e+03 3.658774739013674e+01 -2.607817657504198e+03 5.014518541200000e-03 1.543118811600000e-05 1.380280671700000e-03 1.573698949000000e-03 7.961108965500000e-05 1.583811268500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.300000000000000e+02 -2.313966780041195e+06 -9.759566721021034e+05 6.386773514861416e+06 -7.229283716970972e+03 3.663278892011795e+01 -2.607975170245367e+03 5.014518541200000e-03 1.543118811600000e-05 1.380280671700000e-03 1.573698949000000e-03 7.961108965500000e-05 1.583811268500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.310000000000000e+02 -2.314111365082827e+06 -9.759559389976606e+05 6.386721353815856e+06 -7.229227094293210e+03 3.667768061103249e+01 -2.608132273838357e+03 5.014518541200000e-03 1.543118811600000e-05 1.380280671700000e-03 1.573698949000000e-03 7.961108965500000e-05 1.583811268500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.320000000000000e+02 -2.314255949105063e+06 -9.759552050105124e+05 6.386669189627738e+06 -7.229171112688761e+03 3.672190787476899e+01 -2.608287573212318e+03 5.014518541200000e-03 1.543118811600000e-05 1.380280671700000e-03 1.573698949000000e-03 7.961108965500000e-05 1.583811268500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.330000000000000e+02 -2.314400531998451e+06 -9.759544701226633e+05 6.386617022287006e+06 -7.229114336897303e+03 3.676694892079161e+01 -2.608445082075900e+03 5.014518541200000e-03 1.543118811600000e-05 1.380280671700000e-03 1.573698949000000e-03 7.961108965500000e-05 1.583811268500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.340000000000000e+02 -2.314545113758016e+06 -9.759537343340225e+05 6.386564851795480e+06 -7.229057557452365e+03 3.681198996042735e+01 -2.608602589587993e+03 5.014518541200000e-03 1.543118811600000e-05 1.380280671700000e-03 1.573698949000000e-03 7.961108965500000e-05 1.583811268500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.350000000000000e+02 -2.314689694383482e+06 -9.759529976445903e+05 6.386512678153257e+06 -7.229000774281849e+03 3.685703087472359e+01 -2.608760095940437e+03 5.014518541200000e-03 1.543118811600000e-05 1.380280671700000e-03 1.573698949000000e-03 7.961108965500000e-05 1.583811268500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.360000000000000e+02 -2.314834273874562e+06 -9.759522600543746e+05 6.386460501360440e+06 -7.228943987450961e+03 3.690207118168360e+01 -2.608917600929932e+03 5.013893322200000e-03 1.525950309600000e-05 1.381067821200000e-03 1.573748430400000e-03 7.954327195800000e-05 1.584431277800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.370000000000000e+02 -2.314978852231599e+06 -9.759515215633751e+05 6.386408321416903e+06 -7.228887196911525e+03 3.694711187002676e+01 -2.609075104738632e+03 5.013893322200000e-03 1.525950309600000e-05 1.381067821200000e-03 1.573748430400000e-03 7.954327195800000e-05 1.584431277800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.380000000000000e+02 -2.315123429454317e+06 -9.759507821715970e+05 6.386356138322752e+06 -7.228830402766495e+03 3.699215204970903e+01 -2.609232607039125e+03 5.013893322200000e-03 1.525950309600000e-05 1.381067821200000e-03 1.573748430400000e-03 7.954327195800000e-05 1.584431277800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.390000000000000e+02 -2.315268005477977e+06 -9.759500418778670e+05 6.386303952101626e+06 -7.228773605678754e+03 3.703719139850242e+01 -2.609390105996894e+03 5.013893322200000e-03 1.525950309600000e-05 1.381067821200000e-03 1.573748430400000e-03 7.954327195800000e-05 1.584431277800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.400000000000000e+02 -2.315412580431830e+06 -9.759493006845433e+05 6.386251762706314e+06 -7.228716804167813e+03 3.708223164056056e+01 -2.609547605760160e+03 5.013893322200000e-03 1.525950309600000e-05 1.381067821200000e-03 1.573748430400000e-03 7.954327195800000e-05 1.584431277800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.410000000000000e+02 -2.315557154254355e+06 -9.759485585937091e+05 6.386199570169432e+06 -7.228660159481625e+03 3.712710847436003e+01 -2.609704655791827e+03 5.013893322200000e-03 1.525950309600000e-05 1.381067821200000e-03 1.573748430400000e-03 7.954327195800000e-05 1.584431277800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.420000000000000e+02 -2.315701726917855e+06 -9.759478156190991e+05 6.386147374546272e+06 -7.228604226624469e+03 3.717125995618821e+01 -2.609859705768127e+03 5.013893322200000e-03 1.525950309600000e-05 1.381067821200000e-03 1.573748430400000e-03 7.954327195800000e-05 1.584431277800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.430000000000000e+02 -2.315846298446430e+06 -9.759470717437207e+05 6.386095175772714e+06 -7.228547413756826e+03 3.721629972192900e+01 -2.610017202767103e+03 5.013893322200000e-03 1.525950309600000e-05 1.381067821200000e-03 1.573748430400000e-03 7.954327195800000e-05 1.584431277800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.440000000000000e+02 -2.315990868808021e+06 -9.759463269669970e+05 6.386042973860471e+06 -7.228490597611812e+03 3.726133876159784e+01 -2.610174697346895e+03 5.013893322200000e-03 1.525950309600000e-05 1.381067821200000e-03 1.573748430400000e-03 7.954327195800000e-05 1.584431277800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.450000000000000e+02 -2.316135438099017e+06 -9.759455812906998e+05 6.385990768774306e+06 -7.228433776860507e+03 3.730637787547974e+01 -2.610332193191845e+03 5.013893322200000e-03 1.525950309600000e-05 1.381067821200000e-03 1.573748430400000e-03 7.954327195800000e-05 1.584431277800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.460000000000000e+02 -2.316280006126419e+06 -9.759448347112971e+05 6.385938560584768e+06 -7.228376954175531e+03 3.735141642381319e+01 -2.610489682941653e+03 5.013267782100000e-03 1.508784623100000e-05 1.381854685500000e-03 1.573797928700000e-03 7.947536514400000e-05 1.585051641400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.470000000000000e+02 -2.316424573083079e+06 -9.759440872323287e+05 6.385886349221366e+06 -7.228320126994247e+03 3.739645475554491e+01 -2.610647173640420e+03 5.013267782100000e-03 1.508784623100000e-05 1.381854685500000e-03 1.573797928700000e-03 7.947536514400000e-05 1.585051641400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.480000000000000e+02 -2.316569138904891e+06 -9.759433388526171e+05 6.385834134707528e+06 -7.228263296071756e+03 3.744149345786249e+01 -2.610804663247269e+03 5.013267782100000e-03 1.508784623100000e-05 1.381854685500000e-03 1.573797928700000e-03 7.947536514400000e-05 1.585051641400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.490000000000000e+02 -2.316713703591573e+06 -9.759425895721697e+05 6.385781917043357e+06 -7.228206461470396e+03 3.748653151109380e+01 -2.610962151539936e+03 5.013267782100000e-03 1.508784623100000e-05 1.381854685500000e-03 1.573797928700000e-03 7.947536514400000e-05 1.585051641400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.500000000000000e+02 -2.316858267142848e+06 -9.759418393909899e+05 6.385729696228951e+06 -7.228149623218682e+03 3.753156934898473e+01 -2.611119638462124e+03 5.013267782100000e-03 1.508784623100000e-05 1.381854685500000e-03 1.573797928700000e-03 7.947536514400000e-05 1.585051641400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.510000000000000e+02 -2.317002829562374e+06 -9.759410883122401e+05 6.385677472273436e+06 -7.228092947142383e+03 3.757644925138530e+01 -2.611276661592819e+03 5.013267782100000e-03 1.508784623100000e-05 1.381854685500000e-03 1.573797928700000e-03 7.947536514400000e-05 1.585051641400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.520000000000000e+02 -2.317147390862561e+06 -9.759403363499828e+05 6.385625245218847e+06 -7.228037005704234e+03 3.762062409201405e+01 -2.611431624652499e+03 5.013267782100000e-03 1.508784623100000e-05 1.381854685500000e-03 1.573797928700000e-03 7.947536514400000e-05 1.585051641400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.530000000000000e+02 -2.317291951053375e+06 -9.759395834874806e+05 6.385573015004500e+06 -7.227980156036621e+03 3.766566156479567e+01 -2.611589109005121e+03 5.013267782100000e-03 1.508784623100000e-05 1.381854685500000e-03 1.573797928700000e-03 7.947536514400000e-05 1.585051641400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.540000000000000e+02 -2.317436510076676e+06 -9.759388297236719e+05 6.385520781651654e+06 -7.227923303166681e+03 3.771069895387353e+01 -2.611746590766071e+03 5.013267782100000e-03 1.508784623100000e-05 1.381854685500000e-03 1.573797928700000e-03 7.947536514400000e-05 1.585051641400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.550000000000000e+02 -2.317581067899981e+06 -9.759380750579701e+05 6.385468545172197e+06 -7.227866447413829e+03 3.775573589972933e+01 -2.611904069042311e+03 5.013267782100000e-03 1.508784623100000e-05 1.381854685500000e-03 1.573797928700000e-03 7.947536514400000e-05 1.585051641400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.560000000000000e+02 -2.317725624651868e+06 -9.759373194927353e+05 6.385416305519095e+06 -7.227809587164827e+03 3.780077239531991e+01 -2.612061548253979e+03 5.012641920500000e-03 1.491621741200000e-05 1.382641264700000e-03 1.573847444000000e-03 7.940736918000000e-05 1.585672359500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.570000000000000e+02 -2.317870180332690e+06 -9.759365630279657e+05 6.385364062692213e+06 -7.227752722389743e+03 3.784580971302483e+01 -2.612219028546523e+03 5.012641920500000e-03 1.491621741200000e-05 1.382641264700000e-03 1.573847444000000e-03 7.940736918000000e-05 1.585672359500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.580000000000000e+02 -2.318014734748631e+06 -9.759358056601401e+05 6.385311816762450e+06 -7.227695855620659e+03 3.789084574630530e+01 -2.612376502877120e+03 5.012641920500000e-03 1.491621741200000e-05 1.382641264700000e-03 1.573847444000000e-03 7.940736918000000e-05 1.585672359500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.590000000000000e+02 -2.318159288093361e+06 -9.759350473927901e+05 6.385259567658961e+06 -7.227638984324425e+03 3.793588233807913e+01 -2.612533978278260e+03 5.012641920500000e-03 1.491621741200000e-05 1.382641264700000e-03 1.573847444000000e-03 7.940736918000000e-05 1.585672359500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.600000000000000e+02 -2.318303840366594e+06 -9.759342882259187e+05 6.385207315381845e+06 -7.227582108531044e+03 3.798091871477840e+01 -2.612691454628470e+03 5.012641920500000e-03 1.491621741200000e-05 1.382641264700000e-03 1.573847444000000e-03 7.940736918000000e-05 1.585672359500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.610000000000000e+02 -2.318448391377700e+06 -9.759335281589850e+05 6.385155060010185e+06 -7.227525378732546e+03 3.802580512882668e+01 -2.612848512242600e+03 5.012641920500000e-03 1.491621741200000e-05 1.382641264700000e-03 1.573847444000000e-03 7.940736918000000e-05 1.585672359500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.620000000000000e+02 -2.318592941329747e+06 -9.759327672087252e+05 6.385102801511308e+06 -7.227469304077137e+03 3.807002829397496e+01 -2.613003731103108e+03 5.012641920500000e-03 1.491621741200000e-05 1.382641264700000e-03 1.573847444000000e-03 7.940736918000000e-05 1.585672359500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.630000000000000e+02 -2.318737490163624e+06 -9.759320053581048e+05 6.385050539855875e+06 -7.227412417756923e+03 3.811506412727337e+01 -2.613161202441135e+03 5.012641920500000e-03 1.491621741200000e-05 1.382641264700000e-03 1.573847444000000e-03 7.940736918000000e-05 1.585672359500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.640000000000000e+02 -2.318882037828844e+06 -9.759312426062180e+05 6.384998275062354e+06 -7.227355528095961e+03 3.816009922605775e+01 -2.613318671534826e+03 5.012641920500000e-03 1.491621741200000e-05 1.382641264700000e-03 1.573847444000000e-03 7.940736918000000e-05 1.585672359500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.650000000000000e+02 -2.319026584357971e+06 -9.759304789536498e+05 6.384946007118835e+06 -7.227298634828107e+03 3.820513476887757e+01 -2.613476139172173e+03 5.012641920500000e-03 1.491621741200000e-05 1.382641264700000e-03 1.573847444000000e-03 7.940736918000000e-05 1.585672359500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.660000000000000e+02 -2.319171129718510e+06 -9.759297143998202e+05 6.384893736037212e+06 -7.227241738327835e+03 3.825016975178835e+01 -2.613633604277618e+03 5.012015736800000e-03 1.474461658000000e-05 1.383427558600000e-03 1.573896976100000e-03 7.933928405100000e-05 1.586293432000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.670000000000000e+02 -2.319315674006819e+06 -9.759289489464939e+05 6.384841461782206e+06 -7.227184837207956e+03 3.829520438166981e+01 -2.613791070659602e+03 5.012015736800000e-03 1.474461658000000e-05 1.383427558600000e-03 1.573896976100000e-03 7.933928405100000e-05 1.586293432000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.680000000000000e+02 -2.319460217126605e+06 -9.759281825919142e+05 6.384789184389071e+06 -7.227127932911129e+03 3.834023929967813e+01 -2.613948534400289e+03 5.012015736800000e-03 1.474461658000000e-05 1.383427558600000e-03 1.573896976100000e-03 7.933928405100000e-05 1.586293432000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.690000000000000e+02 -2.319604759045357e+06 -9.759274153354953e+05 6.384736903869699e+06 -7.227071025678954e+03 3.838527368900509e+01 -2.614105994797709e+03 5.012015736800000e-03 1.474461658000000e-05 1.383427558600000e-03 1.573896976100000e-03 7.933928405100000e-05 1.586293432000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.700000000000000e+02 -2.319749299891667e+06 -9.759266471795939e+05 6.384684620177025e+06 -7.227014114068533e+03 3.843030746694845e+01 -2.614263455797721e+03 5.012015736800000e-03 1.474461658000000e-05 1.383427558600000e-03 1.573896976100000e-03 7.933928405100000e-05 1.586293432000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.710000000000000e+02 -2.319893839668846e+06 -9.759258781274150e+05 6.384632333319188e+06 -7.226957346122954e+03 3.847518171134618e+01 -2.614420504259974e+03 5.012015736800000e-03 1.474461658000000e-05 1.383427558600000e-03 1.573896976100000e-03 7.933928405100000e-05 1.586293432000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.720000000000000e+02 -2.320038378253927e+06 -9.759251081908121e+05 6.384580043382908e+06 -7.226901235771167e+03 3.851933925752058e+01 -2.614575705902015e+03 5.012015736800000e-03 1.474461658000000e-05 1.383427558600000e-03 1.573896976100000e-03 7.933928405100000e-05 1.586293432000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.730000000000000e+02 -2.320182915633167e+06 -9.759243373523038e+05 6.384527750322158e+06 -7.226844313948519e+03 3.856437292890834e+01 -2.614733161025995e+03 5.012015736800000e-03 1.474461658000000e-05 1.383427558600000e-03 1.573896976100000e-03 7.933928405100000e-05 1.586293432000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.740000000000000e+02 -2.320327451939879e+06 -9.759235656143212e+05 6.384475454088126e+06 -7.226787387665785e+03 3.860940647450582e+01 -2.614890617000307e+03 5.012015736800000e-03 1.474461658000000e-05 1.383427558600000e-03 1.573896976100000e-03 7.933928405100000e-05 1.586293432000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.750000000000000e+02 -2.320471987109344e+06 -9.759227929756967e+05 6.384423154704500e+06 -7.226730457595314e+03 3.865443966696114e+01 -2.615048071973394e+03 5.012015736800000e-03 1.474461658000000e-05 1.383427558600000e-03 1.573896976100000e-03 7.933928405100000e-05 1.586293432000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.760000000000000e+02 -2.320616521141908e+06 -9.759220194364323e+05 6.384370852171158e+06 -7.226673523956693e+03 3.869947314984606e+01 -2.615205525376515e+03 5.011389230800000e-03 1.457304367700000e-05 1.384213567200000e-03 1.573946525200000e-03 7.927110974100000e-05 1.586914858900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.770000000000000e+02 -2.320761054037295e+06 -9.759212449965358e+05 6.384318546488198e+06 -7.226616586551999e+03 3.874450611753863e+01 -2.615362977711024e+03 5.011389230800000e-03 1.457304367700000e-05 1.384213567200000e-03 1.573946525200000e-03 7.927110974100000e-05 1.586914858900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.780000000000000e+02 -2.320905585795215e+06 -9.759204696560072e+05 6.384266237655725e+06 -7.226559645506180e+03 3.878953875020423e+01 -2.615520428644049e+03 5.011389230800000e-03 1.457304367700000e-05 1.384213567200000e-03 1.573946525200000e-03 7.927110974100000e-05 1.586914858900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.790000000000000e+02 -2.321050116416015e+06 -9.759196934148526e+05 6.384213925673612e+06 -7.226502700808236e+03 3.883457162237076e+01 -2.615677878234368e+03 5.011389230800000e-03 1.457304367700000e-05 1.384213567200000e-03 1.573946525200000e-03 7.927110974100000e-05 1.586914858900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.800000000000000e+02 -2.321194645899412e+06 -9.759189162730728e+05 6.384161610541960e+06 -7.226445752418489e+03 3.887960412581634e+01 -2.615835326560180e+03 5.011389230800000e-03 1.457304367700000e-05 1.384213567200000e-03 1.573946525200000e-03 7.927110974100000e-05 1.586914858900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.810000000000000e+02 -2.321339174248659e+06 -9.759181382334278e+05 6.384109292270661e+06 -7.226388976806701e+03 3.892449848198825e+01 -2.615992284087559e+03 5.011389230800000e-03 1.457304367700000e-05 1.384213567200000e-03 1.573946525200000e-03 7.927110974100000e-05 1.586914858900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.820000000000000e+02 -2.321483701579554e+06 -9.759173593099791e+05 6.384056970866665e+06 -7.226332982595113e+03 3.896878107180277e+01 -2.616147062786037e+03 5.011389230800000e-03 1.457304367700000e-05 1.384213567200000e-03 1.573946525200000e-03 7.927110974100000e-05 1.586914858900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.830000000000000e+02 -2.321628227631025e+06 -9.759165794833530e+05 6.384004646365160e+06 -7.226276024026059e+03 3.901381241213932e+01 -2.616304505147950e+03 5.011389230800000e-03 1.457304367700000e-05 1.384213567200000e-03 1.573946525200000e-03 7.927110974100000e-05 1.586914858900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.840000000000000e+02 -2.321772752641649e+06 -9.759157987578671e+05 6.383952318678729e+06 -7.226219060571468e+03 3.905884461800619e+01 -2.616461949571530e+03 5.011389230800000e-03 1.457304367700000e-05 1.384213567200000e-03 1.573946525200000e-03 7.927110974100000e-05 1.586914858900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.850000000000000e+02 -2.321917276450078e+06 -9.759150171306088e+05 6.383899987866498e+06 -7.226162094273640e+03 3.910387594093058e+01 -2.616619390384504e+03 5.011389230800000e-03 1.457304367700000e-05 1.384213567200000e-03 1.573946525200000e-03 7.927110974100000e-05 1.586914858900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.860000000000000e+02 -2.322061799152672e+06 -9.759142346033342e+05 6.383847653893148e+06 -7.226105123858139e+03 3.914890712266478e+01 -2.616776831108911e+03 5.010762402000000e-03 1.440149859300000e-05 1.384999290400000e-03 1.573996091200000e-03 7.920284621400000e-05 1.587536640300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.870000000000000e+02 -2.322206320749770e+06 -9.759134511760431e+05 6.383795316758558e+06 -7.226048149410134e+03 3.919393872755896e+01 -2.616934271539712e+03 5.010762402000000e-03 1.440149859300000e-05 1.384999290400000e-03 1.573996091200000e-03 7.920284621400000e-05 1.587536640300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.880000000000000e+02 -2.322350841176664e+06 -9.759126668475760e+05 6.383742976486436e+06 -7.225991171607494e+03 3.923896960658760e+01 -2.617091709766346e+03 5.010762402000000e-03 1.440149859300000e-05 1.384999290400000e-03 1.573996091200000e-03 7.920284621400000e-05 1.587536640300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.890000000000000e+02 -2.322495360465291e+06 -9.759118816185168e+05 6.383690633065080e+06 -7.225934190174847e+03 3.928400031500578e+01 -2.617249146569388e+03 5.010762402000000e-03 1.440149859300000e-05 1.384999290400000e-03 1.573996091200000e-03 7.920284621400000e-05 1.587536640300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.900000000000000e+02 -2.322639878551560e+06 -9.759110954877068e+05 6.383638286517983e+06 -7.225877205876867e+03 3.932903078512524e+01 -2.617406579855267e+03 5.010762402000000e-03 1.440149859300000e-05 1.384999290400000e-03 1.573996091200000e-03 7.920284621400000e-05 1.587536640300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.910000000000000e+02 -2.322784395630855e+06 -9.759103084620122e+05 6.383585936781062e+06 -7.225820335237469e+03 3.937389314295484e+01 -2.617563682789234e+03 5.010762402000000e-03 1.440149859300000e-05 1.384999290400000e-03 1.573996091200000e-03 7.920284621400000e-05 1.587536640300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.920000000000000e+02 -2.322928911415012e+06 -9.759095205510545e+05 6.383533583993557e+06 -7.225763992902139e+03 3.941800356889243e+01 -2.617719293174605e+03 5.010762402000000e-03 1.440149859300000e-05 1.384999290400000e-03 1.573996091200000e-03 7.920284621400000e-05 1.587536640300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.930000000000000e+02 -2.323073426113770e+06 -9.759087317404744e+05 6.383481228037434e+06 -7.225706996832875e+03 3.946303388274586e+01 -2.617876724779950e+03 5.010762402000000e-03 1.440149859300000e-05 1.384999290400000e-03 1.573996091200000e-03 7.920284621400000e-05 1.587536640300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.940000000000000e+02 -2.323217939674097e+06 -9.759079420293190e+05 6.383428868932130e+06 -7.225649997048406e+03 3.950806395783118e+01 -2.618034155191225e+03 5.010762402000000e-03 1.440149859300000e-05 1.384999290400000e-03 1.573996091200000e-03 7.920284621400000e-05 1.587536640300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.950000000000000e+02 -2.323362452095711e+06 -9.759071514175984e+05 6.383376506677750e+06 -7.225592993641593e+03 3.955309323457496e+01 -2.618191584126911e+03 5.010762402000000e-03 1.440149859300000e-05 1.384999290400000e-03 1.573996091200000e-03 7.920284621400000e-05 1.587536640300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.960000000000000e+02 -2.323506963411167e+06 -9.759063599058946e+05 6.383324141262352e+06 -7.225535986071357e+03 3.959812315956518e+01 -2.618349013137258e+03 5.010135250200000e-03 1.422998137200000e-05 1.385784727800000e-03 1.574045674100000e-03 7.913449349800000e-05 1.588158775800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.970000000000000e+02 -2.323651473555561e+06 -9.759055674930507e+05 6.383271772709741e+06 -7.225478975284985e+03 3.964315223991585e+01 -2.618506439559745e+03 5.010135250200000e-03 1.422998137200000e-05 1.385784727800000e-03 1.574045674100000e-03 7.913449349800000e-05 1.588158775800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.980000000000000e+02 -2.323795982561438e+06 -9.759047741796452e+05 6.383219401007975e+06 -7.225421960795238e+03 3.968818175655329e+01 -2.618663864789289e+03 5.010135250200000e-03 1.422998137200000e-05 1.385784727800000e-03 1.574045674100000e-03 7.913449349800000e-05 1.588158775800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.990000000000000e+02 -2.323940490428519e+06 -9.759039799656905e+05 6.383167026157161e+06 -7.225364942640086e+03 3.973321055720331e+01 -2.618821288665063e+03 5.010135250200000e-03 1.422998137200000e-05 1.385784727800000e-03 1.574045674100000e-03 7.913449349800000e-05 1.588158775800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.000000000000000e+02 -2.324084997156525e+06 -9.759031848511851e+05 6.383114648157395e+06 -7.225307920790548e+03 3.977823918616591e+01 -2.618978711293205e+03 5.010135250200000e-03 1.422998137200000e-05 1.385784727800000e-03 1.574045674100000e-03 7.913449349800000e-05 1.588158775800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.010000000000000e+02 -2.324229502749423e+06 -9.759023888391803e+05 6.383062267018606e+06 -7.225251076527232e+03 3.982311564497002e+01 -2.619135629993162e+03 5.010135250200000e-03 1.422998137200000e-05 1.385784727800000e-03 1.574045674100000e-03 7.913449349800000e-05 1.588158775800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.020000000000000e+02 -2.324374007218814e+06 -9.759015919431784e+05 6.383009882787234e+06 -7.225195035991683e+03 3.986731286136927e+01 -2.619290308646294e+03 5.010135250200000e-03 1.422998137200000e-05 1.385784727800000e-03 1.574045674100000e-03 7.913449349800000e-05 1.588158775800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.030000000000000e+02 -2.324518510571880e+06 -9.759007941470533e+05 6.382957495398560e+06 -7.225138002759471e+03 3.991234121172513e+01 -2.619447728636639e+03 5.010135250200000e-03 1.422998137200000e-05 1.385784727800000e-03 1.574045674100000e-03 7.913449349800000e-05 1.588158775800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.040000000000000e+02 -2.324663012657150e+06 -9.758999954480693e+05 6.382905104908164e+06 -7.225080967551755e+03 3.995736888695205e+01 -2.619605142660158e+03 5.010135250200000e-03 1.422998137200000e-05 1.385784727800000e-03 1.574045674100000e-03 7.913449349800000e-05 1.588158775800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.050000000000000e+02 -2.324807513635399e+06 -9.758991958491363e+05 6.382852711257055e+06 -7.225023928255569e+03 4.000239637851655e+01 -2.619762556512054e+03 5.010135250200000e-03 1.422998137200000e-05 1.385784727800000e-03 1.574045674100000e-03 7.913449349800000e-05 1.588158775800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.060000000000000e+02 -2.324952013635171e+06 -9.758983953525769e+05 6.382800314398050e+06 -7.224966883145725e+03 4.004742434508083e+01 -2.619919974935362e+03 5.009507775100000e-03 1.405849190500000e-05 1.386569879500000e-03 1.574095273900000e-03 7.906605155500001e-05 1.588781265600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.070000000000000e+02 -2.325096512399139e+06 -9.758975939537524e+05 6.382747914425584e+06 -7.224909835689009e+03 4.009245197139222e+01 -2.620077388423012e+03 5.009507775100000e-03 1.405849190500000e-05 1.386569879500000e-03 1.574095273900000e-03 7.906605155500001e-05 1.588781265600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.080000000000000e+02 -2.325241010087867e+06 -9.758967916555689e+05 6.382695511280732e+06 -7.224852783687190e+03 4.013747944032681e+01 -2.620234802986336e+03 5.009507775100000e-03 1.405849190500000e-05 1.386569879500000e-03 1.574095273900000e-03 7.906605155500001e-05 1.588781265600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.090000000000000e+02 -2.325385506508442e+06 -9.758959884545483e+05 6.382643105034295e+06 -7.224795729631708e+03 4.018250651405799e+01 -2.620392211811517e+03 5.009507775100000e-03 1.405849190500000e-05 1.386569879500000e-03 1.574095273900000e-03 7.906605155500001e-05 1.588781265600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.100000000000000e+02 -2.325530001853830e+06 -9.758951843541756e+05 6.382590695615448e+06 -7.224738671105022e+03 4.022753332366943e+01 -2.620549621505348e+03 5.009507775100000e-03 1.405849190500000e-05 1.386569879500000e-03 1.574095273900000e-03 7.906605155500001e-05 1.588781265600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.110000000000000e+02 -2.325674496062605e+06 -9.758943793564704e+05 6.382538283057000e+06 -7.224681772144231e+03 4.027240110634071e+01 -2.620706576477587e+03 5.009507775100000e-03 1.405849190500000e-05 1.386569879500000e-03 1.574095273900000e-03 7.906605155500001e-05 1.588781265600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.120000000000000e+02 -2.325818989177233e+06 -9.758935734760596e+05 6.382485867389064e+06 -7.224625595888793e+03 4.031656276290161e+01 -2.620861512798772e+03 5.009507775100000e-03 1.405849190500000e-05 1.386569879500000e-03 1.574095273900000e-03 7.906605155500001e-05 1.588781265600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.130000000000000e+02 -2.325963481068443e+06 -9.758927666936480e+05 6.382433448603135e+06 -7.224568526827668e+03 4.036158889898044e+01 -2.621018917471079e+03 5.009507775100000e-03 1.405849190500000e-05 1.386569879500000e-03 1.574095273900000e-03 7.906605155500001e-05 1.588781265600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.140000000000000e+02 -2.326107971851755e+06 -9.758919590113173e+05 6.382381026656787e+06 -7.224511453594610e+03 4.040661481579519e+01 -2.621176322196825e+03 5.009507775100000e-03 1.405849190500000e-05 1.386569879500000e-03 1.574095273900000e-03 7.906605155500001e-05 1.588781265600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.150000000000000e+02 -2.326252461430902e+06 -9.758911504273347e+05 6.382328601585382e+06 -7.224454377660337e+03 4.045164072402079e+01 -2.621333722972692e+03 5.009507775100000e-03 1.405849190500000e-05 1.386569879500000e-03 1.574095273900000e-03 7.906605155500001e-05 1.588781265600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.160000000000000e+02 -2.326396949998826e+06 -9.758903409451761e+05 6.382276173318054e+06 -7.224397296287028e+03 4.049666684626951e+01 -2.621491127280859e+03 5.008879976200000e-03 1.388703013200000e-05 1.387354745300000e-03 1.574144890600000e-03 7.899752037100000e-05 1.589404109500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.170000000000000e+02 -2.326541437297611e+06 -9.758895305602202e+05 6.382223741949519e+06 -7.224340212848892e+03 4.054169187329913e+01 -2.621648525849311e+03 5.008879976200000e-03 1.388703013200000e-05 1.387354745300000e-03 1.574144890600000e-03 7.899752037100000e-05 1.589404109500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.180000000000000e+02 -2.326685923617430e+06 -9.758887192776694e+05 6.382171307373213e+06 -7.224283123800617e+03 4.058671805263717e+01 -2.621805928462379e+03 5.008879976200000e-03 1.388703013200000e-05 1.387354745300000e-03 1.574144890600000e-03 7.899752037100000e-05 1.589404109500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.190000000000000e+02 -2.326830408668176e+06 -9.758879070923283e+05 6.382118869695680e+06 -7.224226032624277e+03 4.063174315804190e+01 -2.621963325509798e+03 5.008879976200000e-03 1.388703013200000e-05 1.387354745300000e-03 1.574144890600000e-03 7.899752037100000e-05 1.589404109500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.200000000000000e+02 -2.326974892578378e+06 -9.758870940065117e+05 6.382066428869713e+06 -7.224168937800196e+03 4.067676780468705e+01 -2.622120721168335e+03 5.008879976200000e-03 1.388703013200000e-05 1.387354745300000e-03 1.574144890600000e-03 7.899752037100000e-05 1.589404109500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.210000000000000e+02 -2.327119375447767e+06 -9.758862800248914e+05 6.382013984867407e+06 -7.224111976804436e+03 4.072164652799955e+01 -2.622277733289216e+03 5.008879976200000e-03 1.388703013200000e-05 1.387354745300000e-03 1.574144890600000e-03 7.899752037100000e-05 1.589404109500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.220000000000000e+02 -2.327263857125132e+06 -9.758854651575980e+05 6.381961537783202e+06 -7.224055630928875e+03 4.076587159950986e+01 -2.622433024264548e+03 5.008879976200000e-03 1.388703013200000e-05 1.387354745300000e-03 1.574144890600000e-03 7.899752037100000e-05 1.589404109500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.230000000000000e+02 -2.327408337586335e+06 -9.758846493884786e+05 6.381909087578344e+06 -7.223998525593432e+03 4.081089619492747e+01 -2.622590414874304e+03 5.008879976200000e-03 1.388703013200000e-05 1.387354745300000e-03 1.574144890600000e-03 7.899752037100000e-05 1.589404109500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.240000000000000e+02 -2.327552816971318e+06 -9.758838327200547e+05 6.381856634201414e+06 -7.223941415694476e+03 4.085592037062804e+01 -2.622747806594812e+03 5.008879976200000e-03 1.388703013200000e-05 1.387354745300000e-03 1.574144890600000e-03 7.899752037100000e-05 1.589404109500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.250000000000000e+02 -2.327697295215391e+06 -9.758830151511743e+05 6.381804177676183e+06 -7.223884302191692e+03 4.090094426197194e+01 -2.622905196815168e+03 5.008879976200000e-03 1.388703013200000e-05 1.387354745300000e-03 1.574144890600000e-03 7.899752037100000e-05 1.589404109500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.260000000000000e+02 -2.327841772383299e+06 -9.758821966829952e+05 6.381751717978849e+06 -7.223827184128008e+03 4.094596876842357e+01 -2.623062588189365e+03 5.008251853200000e-03 1.371559599500000e-05 1.388139325000000e-03 1.574194524100000e-03 7.892889993000000e-05 1.590027307600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.270000000000000e+02 -2.327986248378160e+06 -9.758813773137907e+05 6.381699255145013e+06 -7.223770062797892e+03 4.099099261424215e+01 -2.623219977124691e+03 5.008251853200000e-03 1.371559599500000e-05 1.388139325000000e-03 1.574194524100000e-03 7.892889993000000e-05 1.590027307600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.280000000000000e+02 -2.328130723103083e+06 -9.758805570418343e+05 6.381646789210291e+06 -7.223712939414432e+03 4.103601550437247e+01 -2.623377360299465e+03 5.008251853200000e-03 1.371559599500000e-05 1.388139325000000e-03 1.574194524100000e-03 7.892889993000000e-05 1.590027307600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.290000000000000e+02 -2.328275196783825e+06 -9.758797358711648e+05 6.381594320091710e+06 -7.223655811180830e+03 4.108103913253373e+01 -2.623534745422604e+03 5.008251853200000e-03 1.371559599500000e-05 1.388139325000000e-03 1.574194524100000e-03 7.892889993000000e-05 1.590027307600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.300000000000000e+02 -2.328419669355698e+06 -9.758789138006313e+05 6.381541847813038e+06 -7.223598678839398e+03 4.112606253590067e+01 -2.623692130422553e+03 5.008251853200000e-03 1.371559599500000e-05 1.388139325000000e-03 1.574194524100000e-03 7.892889993000000e-05 1.590027307600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.310000000000000e+02 -2.328564140821944e+06 -9.758780908333105e+05 6.381489372384110e+06 -7.223541718217116e+03 4.117093218090361e+01 -2.623849028488937e+03 5.008251853200000e-03 1.371559599500000e-05 1.388139325000000e-03 1.574194524100000e-03 7.892889993000000e-05 1.590027307600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.320000000000000e+02 -2.328708611045008e+06 -9.758772669801088e+05 6.381436893904637e+06 -7.223485539045451e+03 4.121511883359960e+01 -2.624003751851202e+03 5.008251853200000e-03 1.371559599500000e-05 1.388139325000000e-03 1.574194524100000e-03 7.892889993000000e-05 1.590027307600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.330000000000000e+02 -2.328853080213177e+06 -9.758764422280297e+05 6.381384412245222e+06 -7.223428396152764e+03 4.126014119070615e+01 -2.624161131892568e+03 5.008251853200000e-03 1.371559599500000e-05 1.388139325000000e-03 1.574194524100000e-03 7.892889993000000e-05 1.590027307600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.340000000000000e+02 -2.328997548272392e+06 -9.758756165761016e+05 6.381331927425737e+06 -7.223371249138632e+03 4.130516411187662e+01 -2.624318511886180e+03 5.008251853200000e-03 1.371559599500000e-05 1.388139325000000e-03 1.574194524100000e-03 7.892889993000000e-05 1.590027307600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.350000000000000e+02 -2.329142015157977e+06 -9.758747900231760e+05 6.381279439469964e+06 -7.223314098864079e+03 4.135018645240314e+01 -2.624475889429303e+03 5.008251853200000e-03 1.371559599500000e-05 1.388139325000000e-03 1.574194524100000e-03 7.892889993000000e-05 1.590027307600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.360000000000000e+02 -2.329286480901844e+06 -9.758739625698384e+05 6.381226948366171e+06 -7.223256944963812e+03 4.139520816766779e+01 -2.624633265515398e+03 5.007623405400000e-03 1.354418938500000e-05 1.388923618800000e-03 1.574244174500000e-03 7.886019019600000e-05 1.590650860000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.370000000000000e+02 -2.329430945472138e+06 -9.758731342155092e+05 6.381174454126064e+06 -7.223199787702901e+03 4.144023024776325e+01 -2.624790639470712e+03 5.007623405400000e-03 1.354418938500000e-05 1.388923618800000e-03 1.574244174500000e-03 7.886019019600000e-05 1.590650860000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.380000000000000e+02 -2.329575408932974e+06 -9.758723049613509e+05 6.381121956726069e+06 -7.223142626458056e+03 4.148525176934436e+01 -2.624948012948455e+03 5.007623405400000e-03 1.354418938500000e-05 1.388923618800000e-03 1.574244174500000e-03 7.886019019600000e-05 1.590650860000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.390000000000000e+02 -2.329719871251877e+06 -9.758714748067828e+05 6.381069456178123e+06 -7.223085461448836e+03 4.153027327079968e+01 -2.625105385376627e+03 5.007623405400000e-03 1.354418938500000e-05 1.388923618800000e-03 1.574244174500000e-03 7.886019019600000e-05 1.590650860000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.400000000000000e+02 -2.329864332525774e+06 -9.758706437535408e+05 6.381016952446575e+06 -7.223028291551220e+03 4.157529519514532e+01 -2.625262759838952e+03 5.007623405400000e-03 1.354418938500000e-05 1.388923618800000e-03 1.574244174500000e-03 7.886019019600000e-05 1.590650860000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.410000000000000e+02 -2.330008792499505e+06 -9.758698118001226e+05 6.380964445633736e+06 -7.222971254335313e+03 4.162016134982758e+01 -2.625419753957240e+03 5.007623405400000e-03 1.354418938500000e-05 1.388923618800000e-03 1.574244174500000e-03 7.886019019600000e-05 1.590650860000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.420000000000000e+02 -2.330153251303915e+06 -9.758689789624468e+05 6.380911935729114e+06 -7.222914811618097e+03 4.166433750249263e+01 -2.625575083803445e+03 5.007623405400000e-03 1.354418938500000e-05 1.388923618800000e-03 1.574244174500000e-03 7.886019019600000e-05 1.590650860000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.430000000000000e+02 -2.330297709046353e+06 -9.758681452258043e+05 6.380859422647126e+06 -7.222857631682121e+03 4.170935864483752e+01 -2.625732451867127e+03 5.007623405400000e-03 1.354418938500000e-05 1.388923618800000e-03 1.574244174500000e-03 7.886019019600000e-05 1.590650860000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.440000000000000e+02 -2.330442165614505e+06 -9.758673105881989e+05 6.380806906429085e+06 -7.222800448335213e+03 4.175437937338111e+01 -2.625889817899190e+03 5.007623405400000e-03 1.354418938500000e-05 1.388923618800000e-03 1.574244174500000e-03 7.886019019600000e-05 1.590650860000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.450000000000000e+02 -2.330586621040285e+06 -9.758664750502149e+05 6.380754387063256e+06 -7.222743261378973e+03 4.179939947429156e+01 -2.626047182429646e+03 5.007623405400000e-03 1.354418938500000e-05 1.388923618800000e-03 1.574244174500000e-03 7.886019019600000e-05 1.590650860000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.460000000000000e+02 -2.330731075324024e+06 -9.758656386118509e+05 6.380701864549512e+06 -7.222686070791344e+03 4.184441985310153e+01 -2.626204545562812e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.470000000000000e+02 -2.330875528433051e+06 -9.758648012725416e+05 6.380649338899872e+06 -7.222628876831359e+03 4.188943941124748e+01 -2.626361906539786e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.480000000000000e+02 -2.331019980432092e+06 -9.758639630334310e+05 6.380596810090523e+06 -7.222571678918149e+03 4.193445962821528e+01 -2.626519267014467e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.490000000000000e+02 -2.331164431320873e+06 -9.758631238945295e+05 6.380544278121558e+06 -7.222514476810963e+03 4.197947930051271e+01 -2.626676627583463e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.500000000000000e+02 -2.331308881034708e+06 -9.758622838546906e+05 6.380491743016778e+06 -7.222457271426703e+03 4.202449861605690e+01 -2.626833985759496e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.510000000000000e+02 -2.331453329606141e+06 -9.758614429144881e+05 6.380439204764211e+06 -7.222400062441921e+03 4.206951818311299e+01 -2.626991342452918e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.520000000000000e+02 -2.331597777034898e+06 -9.758606010739326e+05 6.380386663363959e+06 -7.222342849751345e+03 4.211453713305846e+01 -2.627148697908019e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.530000000000000e+02 -2.331742223256299e+06 -9.758597583318817e+05 6.380334118839827e+06 -7.222285634176315e+03 4.215955542886972e+01 -2.627306049887438e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.540000000000000e+02 -2.331886668463859e+06 -9.758589146917696e+05 6.380281571120574e+06 -7.222228413324499e+03 4.220457477289921e+01 -2.627463404985591e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.550000000000000e+02 -2.332031112464127e+06 -9.758580701501688e+05 6.380229020277416e+06 -7.222171189595133e+03 4.224959332053531e+01 -2.627620756582338e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.560000000000000e+02 -2.332175555289021e+06 -9.758572247076561e+05 6.380176466298607e+06 -7.222113962583345e+03 4.229461117508528e+01 -2.627778105784971e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.570000000000000e+02 -2.332319996971063e+06 -9.758563783648058e+05 6.380123909172165e+06 -7.222056731895892e+03 4.233962936908991e+01 -2.627935453713952e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.580000000000000e+02 -2.332464437574171e+06 -9.758555311227647e+05 6.380071348874559e+06 -7.221999496785375e+03 4.238464733119012e+01 -2.628092802375128e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.590000000000000e+02 -2.332608877002088e+06 -9.758546829798189e+05 6.380018785441221e+06 -7.221942258250110e+03 4.242966540366751e+01 -2.628250149068578e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.600000000000000e+02 -2.332753315286737e+06 -9.758538339365517e+05 6.379966218860408e+06 -7.221885016186149e+03 4.247468283348761e+01 -2.628407494040628e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.610000000000000e+02 -2.332897752427839e+06 -9.758529839929612e+05 6.379913649132215e+06 -7.221827770379682e+03 4.251970007260222e+01 -2.628564837894966e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.620000000000000e+02 -2.333042188425724e+06 -9.758521331490491e+05 6.379861076256520e+06 -7.221770520924001e+03 4.256471755760745e+01 -2.628722180398993e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.630000000000000e+02 -2.333186623215735e+06 -9.758512814036821e+05 6.379808500257142e+06 -7.221713268601577e+03 4.260973415147866e+01 -2.628879519369224e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.640000000000000e+02 -2.333331056926359e+06 -9.758504287591475e+05 6.379755921086743e+06 -7.221656011740828e+03 4.265475073770008e+01 -2.629036859395360e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.650000000000000e+02 -2.333475489590127e+06 -9.758495752160145e+05 6.379703338733332e+06 -7.221598750034971e+03 4.269976818800363e+01 -2.629194201353544e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.660000000000000e+02 -2.333619920981420e+06 -9.758487207702964e+05 6.379650753280042e+06 -7.221541486266658e+03 4.274478443955933e+01 -2.629351537575815e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.670000000000000e+02 -2.333764351260909e+06 -9.758478654248468e+05 6.379598164667663e+06 -7.221484218336425e+03 4.278980063484963e+01 -2.629508873827467e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.680000000000000e+02 -2.333908780396736e+06 -9.758470091791030e+05 6.379545572907941e+06 -7.221426946849388e+03 4.283481674776614e+01 -2.629666208461613e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.690000000000000e+02 -2.334053208388644e+06 -9.758461520330659e+05 6.379492978000969e+06 -7.221369671643189e+03 4.287983277688231e+01 -2.629823541919671e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.700000000000000e+02 -2.334197635236333e+06 -9.758452939867396e+05 6.379440379946852e+06 -7.221312392733720e+03 4.292484821754275e+01 -2.629980874133994e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.710000000000000e+02 -2.334342060972341e+06 -9.758444350407002e+05 6.379387778733598e+06 -7.221255109789268e+03 4.296986405711921e+01 -2.630138206054115e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.720000000000000e+02 -2.334486485531795e+06 -9.758435751938093e+05 6.379335174385112e+06 -7.221197823480133e+03 4.301487917424802e+01 -2.630295535803486e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.730000000000000e+02 -2.334630908947233e+06 -9.758427144466379e+05 6.379282566889409e+06 -7.221140533580143e+03 4.305989467986197e+01 -2.630452864050790e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.740000000000000e+02 -2.334775331153989e+06 -9.758418527980536e+05 6.379229956270322e+06 -7.221083240798124e+03 4.310490929512362e+01 -2.630610188807652e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.750000000000000e+02 -2.334919752280538e+06 -9.758409902503402e+05 6.379177342480486e+06 -7.221025943562202e+03 4.314992370632483e+01 -2.630767514379754e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.760000000000000e+02 -2.335064172262855e+06 -9.758401268023615e+05 6.379124725543504e+06 -7.220968642541400e+03 4.319493851863292e+01 -2.630924838977727e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.770000000000000e+02 -2.335208591100649e+06 -9.758392624541179e+05 6.379072105459485e+06 -7.220911337998127e+03 4.323995302138992e+01 -2.631082161854125e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.780000000000000e+02 -2.335353008890205e+06 -9.758383972073221e+05 6.379019482192912e+06 -7.220854028401914e+03 4.328496745060473e+01 -2.631239487179063e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.790000000000000e+02 -2.335497425342170e+06 -9.758375310568599e+05 6.378966855850498e+06 -7.220796717618958e+03 4.332998118526983e+01 -2.631396804417158e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.800000000000000e+02 -2.335641840745955e+06 -9.758366640078499e+05 6.378914226325510e+06 -7.220739401975281e+03 4.337499505354890e+01 -2.631554123591476e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.810000000000000e+02 -2.335786255004719e+06 -9.758357960585937e+05 6.378861593653661e+06 -7.220682082671458e+03 4.342000849090799e+01 -2.631711441412533e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.820000000000000e+02 -2.335930668150987e+06 -9.758349272096612e+05 6.378808957822952e+06 -7.220624759230646e+03 4.346502225707798e+01 -2.631868759212325e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.830000000000000e+02 -2.336075080119898e+06 -9.758340574599237e+05 6.378756318857305e+06 -7.220567432535579e+03 4.351003524088343e+01 -2.632026074539257e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.840000000000000e+02 -2.336219490943982e+06 -9.758331868099438e+05 6.378703676744719e+06 -7.220510102128381e+03 4.355504874174909e+01 -2.632183388699817e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.850000000000000e+02 -2.336363900558580e+06 -9.758323152585984e+05 6.378651031509056e+06 -7.220452768960427e+03 4.360006120412073e+01 -2.632340699035179e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.860000000000000e+02 -2.336508309156538e+06 -9.758314428092981e+05 6.378598383079155e+06 -7.220395430410918e+03 4.364507388883659e+01 -2.632498012724054e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.870000000000000e+02 -2.336652716577257e+06 -9.758305694591990e+05 6.378545731514271e+06 -7.220338088571542e+03 4.369008698906360e+01 -2.632655324094624e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.880000000000000e+02 -2.336797122788271e+06 -9.758296952077462e+05 6.378493076826381e+06 -7.220280743875334e+03 4.373509907002440e+01 -2.632812631902199e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.890000000000000e+02 -2.336941527885864e+06 -9.758288200566435e+05 6.378440418979963e+06 -7.220223395142537e+03 4.378011102173571e+01 -2.632969939393374e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.900000000000000e+02 -2.337085931838182e+06 -9.758279440053258e+05 6.378387757986768e+06 -7.220166042758612e+03 4.382512317712795e+01 -2.633127245537395e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.910000000000000e+02 -2.337230334677139e+06 -9.758270670543645e+05 6.378335093835010e+06 -7.220108686237540e+03 4.387013515919118e+01 -2.633284551635619e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.920000000000000e+02 -2.337374736305890e+06 -9.758261892020656e+05 6.378282426560435e+06 -7.220051326816164e+03 4.391514619676180e+01 -2.633441854293138e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.930000000000000e+02 -2.337519136853523e+06 -9.758253104506959e+05 6.378229756115397e+06 -7.219993962973327e+03 4.396015803386727e+01 -2.633599157723316e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.940000000000000e+02 -2.337663536158830e+06 -9.758244307974249e+05 6.378177082559402e+06 -7.219936596669182e+03 4.400516907707902e+01 -2.633756456528783e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.950000000000000e+02 -2.337807934382449e+06 -9.758235502450966e+05 6.378124405833145e+06 -7.219879225823483e+03 4.405017957483588e+01 -2.633913756368148e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.960000000000000e+02 -2.337952331460359e+06 -9.758226687925721e+05 6.378071725960263e+06 -7.219821851394071e+03 4.409519080817162e+01 -2.634071054702934e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.970000000000000e+02 -2.338096727392069e+06 -9.758217864398642e+05 6.378019042940932e+06 -7.219764473159872e+03 4.414020113064996e+01 -2.634228352054106e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.980000000000000e+02 -2.338241122177920e+06 -9.758209031869686e+05 6.377966356775030e+06 -7.219707091370103e+03 4.418521187119931e+01 -2.634385647809088e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.990000000000000e+02 -2.338385515881999e+06 -9.758200190350242e+05 6.377913667438883e+06 -7.219649705043596e+03 4.423022239340496e+01 -2.634542944599693e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.000000000000000e+02 -2.338529908310927e+06 -9.758191339806470e+05 6.377860975003910e+06 -7.219592316635973e+03 4.427523185826944e+01 -2.634700235722672e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.010000000000000e+02 -2.338674299690322e+06 -9.758182480277867e+05 6.377808279386780e+06 -7.219534923351437e+03 4.432024222164166e+01 -2.634857528857650e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.020000000000000e+02 -2.338818689955534e+06 -9.758173611753214e+05 6.377755580611369e+06 -7.219477525973693e+03 4.436525233724271e+01 -2.635014821822975e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.030000000000000e+02 -2.338963079009742e+06 -9.758164734215650e+05 6.377702878713439e+06 -7.219420125740097e+03 4.441026142864349e+01 -2.635172111224751e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.040000000000000e+02 -2.339107466853290e+06 -9.758155847665168e+05 6.377650173692872e+06 -7.219362722699654e+03 4.445527074563230e+01 -2.635329396990374e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.050000000000000e+02 -2.339251853614619e+06 -9.758146952124375e+05 6.377597465502209e+06 -7.219305315107360e+03 4.450027986248512e+01 -2.635486683832841e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.060000000000000e+02 -2.339396239293452e+06 -9.758138047593377e+05 6.377544754141550e+06 -7.219247903017277e+03 4.454528886004573e+01 -2.635643971608922e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.070000000000000e+02 -2.339540623697033e+06 -9.758129134038286e+05 6.377492039682114e+06 -7.219190488924012e+03 4.459029748464131e+01 -2.635801253540910e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.080000000000000e+02 -2.339685006953610e+06 -9.758120211481743e+05 6.377439322076520e+06 -7.219133071143292e+03 4.463530549390487e+01 -2.635958534185421e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.090000000000000e+02 -2.339829389224423e+06 -9.758111279951939e+05 6.377386601265170e+06 -7.219075647630040e+03 4.468031470797675e+01 -2.636115819174736e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.100000000000000e+02 -2.339973770219562e+06 -9.758102339398217e+05 6.377333877355208e+06 -7.219018222095590e+03 4.472532251759530e+01 -2.636273098320301e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.110000000000000e+02 -2.340118150131841e+06 -9.758093389854447e+05 6.377281150275373e+06 -7.218960792049232e+03 4.477033049117136e+01 -2.636430378450713e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.120000000000000e+02 -2.340262528832860e+06 -9.758084431298034e+05 6.377228420073115e+06 -7.218903359135230e+03 4.481533849806851e+01 -2.636587655101675e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.130000000000000e+02 -2.340406906418896e+06 -9.758075463745999e+05 6.377175686712855e+06 -7.218845922194367e+03 4.486034602373462e+01 -2.636744931391482e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.140000000000000e+02 -2.340551282825301e+06 -9.758066487187125e+05 6.377122950218483e+06 -7.218788481932406e+03 4.490535296135843e+01 -2.636902205401821e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.150000000000000e+02 -2.340695658181133e+06 -9.758057501643905e+05 6.377070210542286e+06 -7.218731036751496e+03 4.495036091274432e+01 -2.637059481540131e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.160000000000000e+02 -2.340840032260861e+06 -9.758048507077014e+05 6.377017467767646e+06 -7.218673589555139e+03 4.499536753460987e+01 -2.637216751824782e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.170000000000000e+02 -2.340984405321635e+06 -9.758039503531525e+05 6.376964721799486e+06 -7.218616137050899e+03 4.504037454441222e+01 -2.637374025261297e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.180000000000000e+02 -2.341128777170718e+06 -9.758030490973677e+05 6.376911972709067e+06 -7.218558681700323e+03 4.508538140839548e+01 -2.637531295152814e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.190000000000000e+02 -2.341273147872192e+06 -9.758021469414766e+05 6.376859220472693e+06 -7.218501222649264e+03 4.513038795425842e+01 -2.637688563806064e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.200000000000000e+02 -2.341417517361416e+06 -9.758012438843634e+05 6.376806465114269e+06 -7.218443760750911e+03 4.517539358344617e+01 -2.637845828880857e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.210000000000000e+02 -2.341561885831806e+06 -9.758003399293988e+05 6.376753706562263e+06 -7.218386293530558e+03 4.522040039036455e+01 -2.638003097182101e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.220000000000000e+02 -2.341706253057620e+06 -9.757994350726566e+05 6.376700944900164e+06 -7.218328823903374e+03 4.526540569370060e+01 -2.638160360683665e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.230000000000000e+02 -2.341850619167917e+06 -9.757985293163848e+05 6.376648180080234e+06 -7.218271350137224e+03 4.531041179404879e+01 -2.638317624188023e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.240000000000000e+02 -2.341994984130237e+06 -9.757976226600283e+05 6.376595412114483e+06 -7.218213872776792e+03 4.535541720384357e+01 -2.638474886148710e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.250000000000000e+02 -2.342139347944295e+06 -9.757967151035885e+05 6.376542641003008e+06 -7.218156391625097e+03 4.540042239822345e+01 -2.638632147121942e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.260000000000000e+02 -2.342283710674790e+06 -9.757958066481934e+05 6.376489866721871e+06 -7.218098906032134e+03 4.544542809869364e+01 -2.638789408902399e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.270000000000000e+02 -2.342428072192729e+06 -9.757948972915981e+05 6.376437089318804e+06 -7.218041417640545e+03 4.549043312310526e+01 -2.638946666984835e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.280000000000000e+02 -2.342572432497845e+06 -9.757939870338136e+05 6.376384308793899e+06 -7.217983926258447e+03 4.553543727355358e+01 -2.639103921879990e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.290000000000000e+02 -2.342716791751342e+06 -9.757930758776406e+05 6.376331525087508e+06 -7.217926430127005e+03 4.558044229940485e+01 -2.639261178433995e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.300000000000000e+02 -2.342861149824247e+06 -9.757921638208457e+05 6.376278738247354e+06 -7.217868930624765e+03 4.562544671378126e+01 -2.639418432842992e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.310000000000000e+02 -2.343005506716276e+06 -9.757912508634330e+05 6.376225948273540e+06 -7.217811427855875e+03 4.567045036136383e+01 -2.639575684817829e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.320000000000000e+02 -2.343149862492124e+06 -9.757903370065194e+05 6.376173155142127e+06 -7.217753921110674e+03 4.571545480102716e+01 -2.639732936353952e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.330000000000000e+02 -2.343294217119119e+06 -9.757894222495599e+05 6.376120358865201e+06 -7.217696410587216e+03 4.576045822168248e+01 -2.639890186829145e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.340000000000000e+02 -2.343438570597607e+06 -9.757885065925468e+05 6.376067559442632e+06 -7.217638896391858e+03 4.580546225716567e+01 -2.640047436032911e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.350000000000000e+02 -2.343582922959487e+06 -9.757875900360510e+05 6.376014756862612e+06 -7.217581378151042e+03 4.585046577316805e+01 -2.640204684922604e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.360000000000000e+02 -2.343727274140127e+06 -9.757866725789574e+05 6.375961951149065e+06 -7.217523856593080e+03 4.589546874433174e+01 -2.640361931525623e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.370000000000000e+02 -2.343871624107687e+06 -9.757857542207021e+05 6.375909142313783e+06 -7.217466332256663e+03 4.594047183576936e+01 -2.640519174415738e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.380000000000000e+02 -2.344015973054938e+06 -9.757848349646545e+05 6.375856330285390e+06 -7.217408802604309e+03 4.598547496517639e+01 -2.640676420456512e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.390000000000000e+02 -2.344160320788549e+06 -9.757839148074605e+05 6.375803515135461e+06 -7.217351269956735e+03 4.603047738725671e+01 -2.640833663331858e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.400000000000000e+02 -2.344304667373214e+06 -9.757829937502369e+05 6.375750696840047e+06 -7.217293733788878e+03 4.607548024604162e+01 -2.640990904516995e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.410000000000000e+02 -2.344449012744311e+06 -9.757820717918753e+05 6.375697875423080e+06 -7.217236194707629e+03 4.612048214926917e+01 -2.641148142304124e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.420000000000000e+02 -2.344593357030238e+06 -9.757811489346131e+05 6.375645050837001e+06 -7.217178651103162e+03 4.616548405212814e+01 -2.641305381094207e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.430000000000000e+02 -2.344737700166995e+06 -9.757802251773375e+05 6.375592223105520e+06 -7.217121103912810e+03 4.621048613403750e+01 -2.641462618359473e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.440000000000000e+02 -2.344882042186483e+06 -9.757793005206088e+05 6.375539392216809e+06 -7.217063552542428e+03 4.625548813276447e+01 -2.641619855694812e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.450000000000000e+02 -2.345026382991894e+06 -9.757783749627566e+05 6.375486558206733e+06 -7.217005998346728e+03 4.630048927041871e+01 -2.641777089398808e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.460000000000000e+02 -2.345170722712256e+06 -9.757774485060194e+05 6.375433721027493e+06 -7.216948439678539e+03 4.634549094051488e+01 -2.641934323992899e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.470000000000000e+02 -2.345315061250573e+06 -9.757765211487245e+05 6.375380880715020e+06 -7.216890877751429e+03 4.639049194871625e+01 -2.642091556138123e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.480000000000000e+02 -2.345459398639351e+06 -9.757755928914311e+05 6.375328037257263e+06 -7.216833312047928e+03 4.643549321438687e+01 -2.642248787277503e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.490000000000000e+02 -2.345603734878319e+06 -9.757746637341498e+05 6.375275190654337e+06 -7.216775742854112e+03 4.648049386793096e+01 -2.642406016596366e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.500000000000000e+02 -2.345748069967183e+06 -9.757737336768800e+05 6.375222340906332e+06 -7.216718169768664e+03 4.652549425895711e+01 -2.642563245196491e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.510000000000000e+02 -2.345892403938463e+06 -9.757728027201827e+05 6.375169488001207e+06 -7.216660592769607e+03 4.657049515090013e+01 -2.642720473173136e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.520000000000000e+02 -2.346036736695368e+06 -9.757718708623881e+05 6.375116631974830e+06 -7.216603012866974e+03 4.661549522508997e+01 -2.642877697733267e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.530000000000000e+02 -2.346181068366291e+06 -9.757709381057355e+05 6.375063772779609e+06 -7.216545428410376e+03 4.666049508172641e+01 -2.643034923367378e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.540000000000000e+02 -2.346325398822904e+06 -9.757700044479964e+05 6.375010910463115e+06 -7.216487841169982e+03 4.670549495595976e+01 -2.643192145300764e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.550000000000000e+02 -2.346469728161423e+06 -9.757690698908403e+05 6.374958044989679e+06 -7.216430249831989e+03 4.675049475878617e+01 -2.643349367081079e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.560000000000000e+02 -2.346614056349408e+06 -9.757681344337246e+05 6.374905176371326e+06 -7.216372654816444e+03 4.679549382534844e+01 -2.643506587541460e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.570000000000000e+02 -2.346758383419362e+06 -9.757671980772004e+05 6.374852304595998e+06 -7.216315055689179e+03 4.684049360779940e+01 -2.643663807923667e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.580000000000000e+02 -2.346902709242123e+06 -9.757662608190542e+05 6.374799429711589e+06 -7.216257454164247e+03 4.688549196390976e+01 -2.643821023494373e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.590000000000000e+02 -2.347047034043217e+06 -9.757653226631747e+05 6.374746551634474e+06 -7.216199847254726e+03 4.693049158265325e+01 -2.643978242452491e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.600000000000000e+02 -2.347191357565010e+06 -9.757643836051233e+05 6.374693670460185e+06 -7.216142238383018e+03 4.697548984583310e+01 -2.644135455426031e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.610000000000000e+02 -2.347335680064572e+06 -9.757634436493496e+05 6.374640786093391e+06 -7.216084624163485e+03 4.702048843191160e+01 -2.644292671642860e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.620000000000000e+02 -2.347480001349233e+06 -9.757625027925189e+05 6.374587898605541e+06 -7.216027007116661e+03 4.706548711042333e+01 -2.644449884281140e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.630000000000000e+02 -2.347624321483043e+06 -9.757615610357512e+05 6.374535007972877e+06 -7.215969386330756e+03 4.711048510860783e+01 -2.644607095768410e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.640000000000000e+02 -2.347768640465730e+06 -9.757606183790512e+05 6.374482114195505e+06 -7.215911761894598e+03 4.715548278545022e+01 -2.644764305881542e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.650000000000000e+02 -2.347912958265466e+06 -9.757596748218630e+05 6.374429217285231e+06 -7.215854134226134e+03 4.720048069636367e+01 -2.644921513517577e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.660000000000000e+02 -2.348057274946300e+06 -9.757587303653021e+05 6.374376317218289e+06 -7.215796502501815e+03 4.724547817290126e+01 -2.645078720869922e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.670000000000000e+02 -2.348201590540122e+06 -9.757577850099282e+05 6.374323413982846e+06 -7.215738866194251e+03 4.729047573994058e+01 -2.645235929387401e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.680000000000000e+02 -2.348345904854268e+06 -9.757568387524174e+05 6.374270507650383e+06 -7.215681227902825e+03 4.733547260586616e+01 -2.645393132012194e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.690000000000000e+02 -2.348490218145797e+06 -9.757558915972074e+05 6.374217598125523e+06 -7.215623584282036e+03 4.738047008832054e+01 -2.645550337841646e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.700000000000000e+02 -2.348634530221425e+06 -9.757549435409766e+05 6.374164685479980e+06 -7.215565937833369e+03 4.742546663854675e+01 -2.645707540047375e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.710000000000000e+02 -2.348778841081495e+06 -9.757539945837299e+05 6.374111769713629e+06 -7.215508288510982e+03 4.747046305746665e+01 -2.645864738791134e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.720000000000000e+02 -2.348923150918509e+06 -9.757530447287954e+05 6.374058850755027e+06 -7.215450633828053e+03 4.751545961612169e+01 -2.646021940800500e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.730000000000000e+02 -2.349067459507657e+06 -9.757520939722962e+05 6.374005928687613e+06 -7.215392976825654e+03 4.756045592637776e+01 -2.646179137845998e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.740000000000000e+02 -2.349211766977313e+06 -9.757511423164569e+05 6.373953003463732e+06 -7.215335315608363e+03 4.760545186798649e+01 -2.646336335039746e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.750000000000000e+02 -2.349356073295041e+06 -9.757501897607268e+05 6.373900075095430e+06 -7.215277650804020e+03 4.765044744954339e+01 -2.646493530687004e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.760000000000000e+02 -2.349500378461170e+06 -9.757492363051040e+05 6.373847143582576e+06 -7.215219982294277e+03 4.769544336512521e+01 -2.646650725139714e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.770000000000000e+02 -2.349644682475421e+06 -9.757482819495944e+05 6.373794208925273e+06 -7.215162310095297e+03 4.774043885741683e+01 -2.646807918318849e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.780000000000000e+02 -2.349788985305359e+06 -9.757473266936542e+05 6.373741271135568e+06 -7.215104634653078e+03 4.778543364930006e+01 -2.646965109007762e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.790000000000000e+02 -2.349933287047801e+06 -9.757463705389403e+05 6.373688330177505e+06 -7.215046954700246e+03 4.783042915138738e+01 -2.647122300692855e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.800000000000000e+02 -2.350077587605989e+06 -9.757454134837989e+05 6.373635386087012e+06 -7.214989271492951e+03 4.787542403205843e+01 -2.647279489921712e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.810000000000000e+02 -2.350221886947480e+06 -9.757444555276866e+05 6.373582438876145e+06 -7.214931585478921e+03 4.792041803814409e+01 -2.647436675474651e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.820000000000000e+02 -2.350366185201256e+06 -9.757434966728077e+05 6.373529488496991e+06 -7.214873894881693e+03 4.796541289533640e+01 -2.647593862225854e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.830000000000000e+02 -2.350510482366832e+06 -9.757425369191740e+05 6.373476534949733e+06 -7.214816199841262e+03 4.801040723792865e+01 -2.647751049733436e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.840000000000000e+02 -2.350654778348063e+06 -9.757415762651290e+05 6.373423578270074e+06 -7.214758501502855e+03 4.805540179585302e+01 -2.647908234941370e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.850000000000000e+02 -2.350799073048193e+06 -9.757406147090198e+05 6.373370618493963e+06 -7.214700801204491e+03 4.810039522951713e+01 -2.648065414177953e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.860000000000000e+02 -2.350943366756377e+06 -9.757396522558220e+05 6.373317655513979e+06 -7.214643095073776e+03 4.814538895074335e+01 -2.648222597955541e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.870000000000000e+02 -2.351087659279997e+06 -9.757386889022221e+05 6.373264689401679e+06 -7.214585385782763e+03 4.819038299032022e+01 -2.648379779067081e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.880000000000000e+02 -2.351231950618773e+06 -9.757377246482279e+05 6.373211720157160e+06 -7.214527673130327e+03 4.823537626556620e+01 -2.648536958004920e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.890000000000000e+02 -2.351376240708113e+06 -9.757367594927435e+05 6.373158747804435e+06 -7.214469958168310e+03 4.828036865898943e+01 -2.648694131927063e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.900000000000000e+02 -2.351520529773461e+06 -9.757357934396237e+05 6.373105772259723e+06 -7.214412237787939e+03 4.832536208406471e+01 -2.648851309306788e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.910000000000000e+02 -2.351664817653749e+06 -9.757348264861231e+05 6.373052793582877e+06 -7.214354514134873e+03 4.837035484914193e+01 -2.649008484278575e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.920000000000000e+02 -2.351809104445171e+06 -9.757338586338958e+05 6.372999811738146e+06 -7.214296786017533e+03 4.841534753142692e+01 -2.649165660082446e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.930000000000000e+02 -2.351953389955114e+06 -9.757328898796408e+05 6.372946826797117e+06 -7.214239055908769e+03 4.846033984758020e+01 -2.649322830037514e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.940000000000000e+02 -2.352097674376246e+06 -9.757319202266657e+05 6.372893838688173e+06 -7.214181321219538e+03 4.850533205561125e+01 -2.649480001136762e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.950000000000000e+02 -2.352241957643975e+06 -9.757309496738759e+05 6.372840847435332e+06 -7.214123582984915e+03 4.855032377807920e+01 -2.649637170571803e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.960000000000000e+02 -2.352386239790797e+06 -9.757299782218233e+05 6.372787853026502e+06 -7.214065840510313e+03 4.859531600547001e+01 -2.649794340261034e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.970000000000000e+02 -2.352530520655436e+06 -9.757290058677605e+05 6.372734855521642e+06 -7.214008096126671e+03 4.864030685862654e+01 -2.649951503834001e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.980000000000000e+02 -2.352674800559809e+06 -9.757280326171938e+05 6.372681854801072e+06 -7.213950345560700e+03 4.868529902520051e+01 -2.650108672934057e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.990000000000000e+02 -2.352819079214221e+06 -9.757270584651727e+05 6.372628850972490e+06 -7.213892592525601e+03 4.873029035890340e+01 -2.650265837452832e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.000000000000000e+02 -2.352963356682697e+06 -9.757260834128091e+05 6.372575844012093e+06 -7.213834836238039e+03 4.877528083048877e+01 -2.650422999500677e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.010000000000000e+02 -2.353107633029904e+06 -9.757251074611997e+05 6.372522833895840e+06 -7.213777075916443e+03 4.882027195336252e+01 -2.650580161254098e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.020000000000000e+02 -2.353251908191245e+06 -9.757241306092492e+05 6.372469820647747e+06 -7.213719312315969e+03 4.886526256215565e+01 -2.650737320624079e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.030000000000000e+02 -2.353396182230740e+06 -9.757231528580631e+05 6.372416804244001e+06 -7.213661544579059e+03 4.891025274915768e+01 -2.650894479925700e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.040000000000000e+02 -2.353540455084433e+06 -9.757221742065484e+05 6.372363784708396e+06 -7.213603773648843e+03 4.895524298182389e+01 -2.651051636639400e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.050000000000000e+02 -2.353684726848505e+06 -9.757211946563467e+05 6.372310762005148e+06 -7.213545998190874e+03 4.900023341792652e+01 -2.651208794367727e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.060000000000000e+02 -2.353828997490513e+06 -9.757202142069259e+05 6.372257736146323e+06 -7.213488218633417e+03 4.904522324657212e+01 -2.651365951919033e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.070000000000000e+02 -2.353973266914345e+06 -9.757192328566329e+05 6.372204707167671e+06 -7.213430436163590e+03 4.909021331471196e+01 -2.651523106134579e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.080000000000000e+02 -2.354117535183812e+06 -9.757182506065752e+05 6.372151675045460e+06 -7.213372650155825e+03 4.913520250067414e+01 -2.651680258647885e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.090000000000000e+02 -2.354261802267103e+06 -9.757172674562030e+05 6.372098639791518e+06 -7.213314860823693e+03 4.918019197844608e+01 -2.651837408938068e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.100000000000000e+02 -2.354406068292560e+06 -9.757162834077179e+05 6.372045601358094e+06 -7.213257066577566e+03 4.922518135879655e+01 -2.651994561268365e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.110000000000000e+02 -2.354550333099130e+06 -9.757152984583838e+05 6.371992559805111e+06 -7.213199269442689e+03 4.927017007619341e+01 -2.652151710158148e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.120000000000000e+02 -2.354694596751453e+06 -9.757143126092928e+05 6.371939515108516e+06 -7.213141468735123e+03 4.931515913901235e+01 -2.652308857496100e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.130000000000000e+02 -2.354838859184949e+06 -9.757133258593592e+05 6.371886467292342e+06 -7.213083665137231e+03 4.936014726021514e+01 -2.652466001385553e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.140000000000000e+02 -2.354983120527952e+06 -9.757123382107813e+05 6.371833416308827e+06 -7.213025856947512e+03 4.940513535612101e+01 -2.652623146450318e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.150000000000000e+02 -2.355127380716497e+06 -9.757113496624606e+05 6.371780362181781e+06 -7.212968045297007e+03 4.945012375358277e+01 -2.652780289659980e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.160000000000000e+02 -2.355271639750303e+06 -9.757103602144021e+05 6.371727304911297e+06 -7.212910229785196e+03 4.949511183371506e+01 -2.652937432064312e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.170000000000000e+02 -2.355415897629084e+06 -9.757093698666148e+05 6.371674244497485e+06 -7.212852410667678e+03 4.954009924313496e+01 -2.653094572958903e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.180000000000000e+02 -2.355560154353180e+06 -9.757083786190958e+05 6.371621180940215e+06 -7.212794587854762e+03 4.958508712331007e+01 -2.653251712637802e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.190000000000000e+02 -2.355704409922321e+06 -9.757073864718532e+05 6.371568114239588e+06 -7.212736761367684e+03 4.963007453986067e+01 -2.653408851000808e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.200000000000000e+02 -2.355848664336214e+06 -9.757063934248908e+05 6.371515044395714e+06 -7.212678931236312e+03 4.967506144634676e+01 -2.653565987965395e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.210000000000000e+02 -2.355992917627362e+06 -9.757053994787554e+05 6.371461971396484e+06 -7.212621097019462e+03 4.972004896820562e+01 -2.653723124770655e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.220000000000000e+02 -2.356137169698813e+06 -9.757044046318186e+05 6.371408895278003e+06 -7.212563259940295e+03 4.976503521146516e+01 -2.653880258037788e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.230000000000000e+02 -2.356281420679518e+06 -9.757034088862593e+05 6.371355815992246e+06 -7.212505418345628e+03 4.981002235748386e+01 -2.654037392315882e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.240000000000000e+02 -2.356425670504897e+06 -9.757024122409940e+05 6.371302733563263e+06 -7.212447573093838e+03 4.985500904829962e+01 -2.654194525232468e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.250000000000000e+02 -2.356569919046062e+06 -9.757014146938468e+05 6.371249648039061e+06 -7.212389725840597e+03 4.989999439486731e+01 -2.654351652292350e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.260000000000000e+02 -2.356714166624861e+06 -9.757004162502773e+05 6.371196559299757e+06 -7.212331872408469e+03 4.994498116178016e+01 -2.654508784861618e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.270000000000000e+02 -2.356858412919510e+06 -9.756994169048250e+05 6.371143467465206e+06 -7.212274016952370e+03 4.998996699310001e+01 -2.654665911653835e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.280000000000000e+02 -2.357002658122628e+06 -9.756984166607793e+05 6.371090372463663e+06 -7.212216157015296e+03 5.003495249310079e+01 -2.654823039306651e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.290000000000000e+02 -2.357146902202405e+06 -9.756974155175884e+05 6.371037274306970e+06 -7.212158293007516e+03 5.007993858403155e+01 -2.654980166758436e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.300000000000000e+02 -2.357291144997810e+06 -9.756964134725350e+05 6.370984173055120e+06 -7.212100426958260e+03 5.012492346329122e+01 -2.655137288468695e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.310000000000000e+02 -2.357435386701471e+06 -9.756954105288937e+05 6.370931068636348e+06 -7.212042556386415e+03 5.016990837978824e+01 -2.655294411168084e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.320000000000000e+02 -2.357579627185123e+06 -9.756944066844890e+05 6.370877961098445e+06 -7.211984683022912e+03 5.021489309286750e+01 -2.655451530190431e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.330000000000000e+02 -2.357723866544725e+06 -9.756934019409582e+05 6.370824850405650e+06 -7.211926805554960e+03 5.025987736871875e+01 -2.655608649055495e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.340000000000000e+02 -2.357868104812769e+06 -9.756923962988484e+05 6.370771736545855e+06 -7.211868923590961e+03 5.030486234631741e+01 -2.655765768868157e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.350000000000000e+02 -2.358012341956818e+06 -9.756913897576175e+05 6.370718619531134e+06 -7.211811037447618e+03 5.034984699936894e+01 -2.655922888729451e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.360000000000000e+02 -2.358156577880156e+06 -9.756903823156424e+05 6.370665499397549e+06 -7.211753148615070e+03 5.039483074863116e+01 -2.656080004606519e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.370000000000000e+02 -2.358300812647420e+06 -9.756893739740073e+05 6.370612376120996e+06 -7.211695255985540e+03 5.043981516431903e+01 -2.656237119549708e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.380000000000000e+02 -2.358445046194029e+06 -9.756883647316347e+05 6.370559249725555e+06 -7.211637360628987e+03 5.048479834390909e+01 -2.656394230595807e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.390000000000000e+02 -2.358589278680442e+06 -9.756873545912482e+05 6.370506120151405e+06 -7.211579460251144e+03 5.052978181089446e+01 -2.656551343981700e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.400000000000000e+02 -2.358733509946264e+06 -9.756863435501263e+05 6.370452987458341e+06 -7.211521557050851e+03 5.057476534833563e+01 -2.656708453786955e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.410000000000000e+02 -2.358877740087651e+06 -9.756853316099097e+05 6.370399851610515e+06 -7.211463649854527e+03 5.061974835109183e+01 -2.656865563138357e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.420000000000000e+02 -2.359021969104330e+06 -9.756843187705994e+05 6.370346712608020e+06 -7.211405738435985e+03 5.066473137676680e+01 -2.657022672669050e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.430000000000000e+02 -2.359166196900197e+06 -9.756833050305704e+05 6.370293570486696e+06 -7.211347824287048e+03 5.070971411861571e+01 -2.657179778356012e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.440000000000000e+02 -2.359310423603557e+06 -9.756822903919984e+05 6.370240425198691e+06 -7.211289905534529e+03 5.075469692002729e+01 -2.657336885248577e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.450000000000000e+02 -2.359454649053403e+06 -9.756812748521743e+05 6.370187276804055e+06 -7.211231984435304e+03 5.079967867474402e+01 -2.657493987232052e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.460000000000000e+02 -2.359598873410797e+06 -9.756802584138145e+05 6.370134125242715e+06 -7.211174058802815e+03 5.084466106687928e+01 -2.657651090258409e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.470000000000000e+02 -2.359743096610970e+06 -9.756792410758373e+05 6.370080970538828e+06 -7.211116129519242e+03 5.088964283025534e+01 -2.657808191899499e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.480000000000000e+02 -2.359887318622110e+06 -9.756782228377042e+05 6.370027812704257e+06 -7.211058196954776e+03 5.093462476734548e+01 -2.657965291197524e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.490000000000000e+02 -2.360031539604662e+06 -9.756772037021253e+05 6.369974651679145e+06 -7.211000259016255e+03 5.097960697473249e+01 -2.658122393779411e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.500000000000000e+02 -2.360175759333334e+06 -9.756761836653233e+05 6.369921487547543e+06 -7.210942318781923e+03 5.102458790111834e+01 -2.658279491305804e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.510000000000000e+02 -2.360319977937047e+06 -9.756751627294563e+05 6.369868320261345e+06 -7.210884374309703e+03 5.106956962225772e+01 -2.658436589087826e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.520000000000000e+02 -2.360464195319084e+06 -9.756741408929061e+05 6.369815149856643e+06 -7.210826427045891e+03 5.111455061004629e+01 -2.658593683171536e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.530000000000000e+02 -2.360608411543455e+06 -9.756731181567662e+05 6.369761976309557e+06 -7.210768476210480e+03 5.115953092501086e+01 -2.658750775654767e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.540000000000000e+02 -2.360752626642637e+06 -9.756720945215743e+05 6.369708799607948e+06 -7.210710521106275e+03 5.120451181144800e+01 -2.658907868466262e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.550000000000000e+02 -2.360896840584222e+06 -9.756710699867995e+05 6.369655619763933e+06 -7.210652562523770e+03 5.124949219847875e+01 -2.659064959434524e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.560000000000000e+02 -2.361041053367916e+06 -9.756700445524402e+05 6.369602436777600e+06 -7.210594600113982e+03 5.129447227235852e+01 -2.659222049505078e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.570000000000000e+02 -2.361185264994060e+06 -9.756690182185010e+05 6.369549250648830e+06 -7.210536634109998e+03 5.133945258988970e+01 -2.659379138077412e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.580000000000000e+02 -2.361329475462175e+06 -9.756679909849920e+05 6.369496061377800e+06 -7.210478664411002e+03 5.138443210224121e+01 -2.659536225374534e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.590000000000000e+02 -2.361473684772593e+06 -9.756669628519071e+05 6.369442868964383e+06 -7.210420691069026e+03 5.142941211723112e+01 -2.659693311316181e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.600000000000000e+02 -2.361617892957179e+06 -9.756659338197970e+05 6.369389673396680e+06 -7.210362713574526e+03 5.147439171345333e+01 -2.659850397228161e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.610000000000000e+02 -2.361762099919230e+06 -9.756649038870436e+05 6.369336474710795e+06 -7.210304733295175e+03 5.151937066666517e+01 -2.660007479429384e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.620000000000000e+02 -2.361906305787647e+06 -9.756638730558101e+05 6.369283272858602e+06 -7.210246748536376e+03 5.156435008124912e+01 -2.660164562518229e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.630000000000000e+02 -2.362050510465733e+06 -9.756628413244820e+05 6.369230067876203e+06 -7.210188760469236e+03 5.160932898193525e+01 -2.660321643307331e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.640000000000000e+02 -2.362194714049617e+06 -9.756618086946821e+05 6.369176859727692e+06 -7.210130767870441e+03 5.165430779228544e+01 -2.660478725098661e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.650000000000000e+02 -2.362338916314669e+06 -9.756607751626335e+05 6.369123648496967e+06 -7.210072773747078e+03 5.169928609913707e+01 -2.660635799804524e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.660000000000000e+02 -2.362483117549869e+06 -9.756597407332023e+05 6.369070434076103e+06 -7.210014774302307e+03 5.174426449220492e+01 -2.660792877639671e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.670000000000000e+02 -2.362627317529953e+06 -9.756587054026134e+05 6.369017216549224e+06 -7.209956772344894e+03 5.178924202756920e+01 -2.660949951025109e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.680000000000000e+02 -2.362771516480237e+06 -9.756576691746444e+05 6.368963995832179e+06 -7.209898765153433e+03 5.183422049199982e+01 -2.661107027342852e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.690000000000000e+02 -2.362915714143336e+06 -9.756566320449860e+05 6.368910772021103e+06 -7.209840755918809e+03 5.187919789185865e+01 -2.661264097942440e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.700000000000000e+02 -2.363059910711794e+06 -9.756555940168771e+05 6.368857545044068e+06 -7.209782742110800e+03 5.192417531809457e+01 -2.661421169660865e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.710000000000000e+02 -2.363204106185954e+06 -9.756545550903220e+05 6.368804314900947e+06 -7.209724723883814e+03 5.196915312825843e+01 -2.661578242099665e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.720000000000000e+02 -2.363348300436773e+06 -9.756535152631688e+05 6.368751081639945e+06 -7.209666702759757e+03 5.201413007226262e+01 -2.661735311120292e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.730000000000000e+02 -2.363492493528869e+06 -9.756524745364980e+05 6.368697845236924e+06 -7.209608678059202e+03 5.205910727110219e+01 -2.661892378595889e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.740000000000000e+02 -2.363636685494108e+06 -9.756514329108538e+05 6.368644605679968e+06 -7.209550649135351e+03 5.210408422583467e+01 -2.662049446238384e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.750000000000000e+02 -2.363780876203643e+06 -9.756503903840857e+05 6.368591363017230e+06 -7.209492617851684e+03 5.214906013259692e+01 -2.662206509014492e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.760000000000000e+02 -2.363925065818512e+06 -9.756493469588887e+05 6.368538117188532e+06 -7.209434582134209e+03 5.219403670056363e+01 -2.662363572562883e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.770000000000000e+02 -2.364069254274160e+06 -9.756483026341862e+05 6.368484868217991e+06 -7.209376542632412e+03 5.223901310466513e+01 -2.662520635104595e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.780000000000000e+02 -2.364213441634579e+06 -9.756472574110683e+05 6.368431616081689e+06 -7.209318498730191e+03 5.228398891209140e+01 -2.662677698271707e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.790000000000000e+02 -2.364357627771561e+06 -9.756462112873781e+05 6.368378360827545e+06 -7.209260451880990e+03 5.232896510359625e+01 -2.662834758211913e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.800000000000000e+02 -2.364501812749096e+06 -9.756451642641968e+05 6.368325102431639e+06 -7.209202401416919e+03 5.237394070131575e+01 -2.662991816671747e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.810000000000000e+02 -2.364645996502641e+06 -9.756441163404572e+05 6.368271840918106e+06 -7.209144348157073e+03 5.241891546074110e+01 -2.663148871444827e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.820000000000000e+02 -2.364790179161073e+06 -9.756430675183118e+05 6.368218576238759e+06 -7.209086290359485e+03 5.246389080192387e+01 -2.663305927264304e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.830000000000000e+02 -2.364934360691772e+06 -9.756420177972238e+05 6.368165308405787e+06 -7.209028228406488e+03 5.250886593034176e+01 -2.663462983069245e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.840000000000000e+02 -2.365078541030800e+06 -9.756409671761238e+05 6.368112037443099e+06 -7.208970163287570e+03 5.255384094884393e+01 -2.663620036212461e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.850000000000000e+02 -2.365222720210024e+06 -9.756399156555547e+05 6.368058763338780e+06 -7.208912094508993e+03 5.259881544074743e+01 -2.663777087998475e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.860000000000000e+02 -2.365366898229155e+06 -9.756388632355182e+05 6.368005486092930e+06 -7.208854021944453e+03 5.264378973880197e+01 -2.663934138780682e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.870000000000000e+02 -2.365511075088536e+06 -9.756378099160207e+05 6.367952205705428e+06 -7.208795945842331e+03 5.268876412362822e+01 -2.664091187906202e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.880000000000000e+02 -2.365655250787888e+06 -9.756367556970599e+05 6.367898922176373e+06 -7.208737866004789e+03 5.273373833357866e+01 -2.664248235893320e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.890000000000000e+02 -2.365799425262657e+06 -9.756357005775792e+05 6.367845635529909e+06 -7.208679783269744e+03 5.277871139484685e+01 -2.664405280453606e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.900000000000000e+02 -2.365943598641724e+06 -9.756346445597169e+05 6.367792345717832e+06 -7.208621696193658e+03 5.282368528302709e+01 -2.664562325543030e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.910000000000000e+02 -2.366087770924808e+06 -9.756335876434756e+05 6.367739052740232e+06 -7.208563604463862e+03 5.286865923789838e+01 -2.664719371964516e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.920000000000000e+02 -2.366231941983098e+06 -9.756325298267265e+05 6.367685756645306e+06 -7.208505509918995e+03 5.291363204436328e+01 -2.664876414738551e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.930000000000000e+02 -2.366376111881191e+06 -9.756314711105295e+05 6.367632457408882e+06 -7.208447411762761e+03 5.295860557162467e+01 -2.665033456082094e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.940000000000000e+02 -2.366520280554547e+06 -9.756304114938329e+05 6.367579155055111e+06 -7.208389310723300e+03 5.300357791173452e+01 -2.665190493959624e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.950000000000000e+02 -2.366664448195687e+06 -9.756293509798441e+05 6.367525849511954e+06 -7.208331204407613e+03 5.304855080991193e+01 -2.665347534857782e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.960000000000000e+02 -2.366808614580018e+06 -9.756282895648219e+05 6.367472540863448e+06 -7.208273095578083e+03 5.309352329625632e+01 -2.665504571335663e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.970000000000000e+02 -2.366952779835573e+06 -9.756272272509127e+05 6.367419229061680e+06 -7.208214982722943e+03 5.313849528608037e+01 -2.665661607437721e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.980000000000000e+02 -2.367096943930580e+06 -9.756261640375815e+05 6.367365914118543e+06 -7.208156866206295e+03 5.318346772922700e+01 -2.665818642231550e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.990000000000000e+02 -2.367241106864747e+06 -9.756250999248354e+05 6.367312596034142e+06 -7.208098745990227e+03 5.322843953332664e+01 -2.665975675769693e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.000000000000000e+03 -2.367385268637792e+06 -9.756240349126781e+05 6.367259274808578e+06 -7.208040622060276e+03 5.327341098070805e+01 -2.666132708103522e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.001000000000000e+03 -2.367529429314321e+06 -9.756229690021802e+05 6.367205950417669e+06 -7.207982493695538e+03 5.331838308289664e+01 -2.666289741207930e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.002000000000000e+03 -2.367673588701273e+06 -9.756219021901391e+05 6.367152622933694e+06 -7.207924363392581e+03 5.336335414845676e+01 -2.666446768324690e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.003000000000000e+03 -2.367817746991145e+06 -9.756208344797703e+05 6.367099292284572e+06 -7.207866228393421e+03 5.340832488212165e+01 -2.666603796867586e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.004000000000000e+03 -2.367961904152143e+06 -9.756197658705346e+05 6.367045958482210e+06 -7.207808089428920e+03 5.345329630313230e+01 -2.666760824925742e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.005000000000000e+03 -2.368106060119736e+06 -9.756186963613727e+05 6.366992621550773e+06 -7.207749947211109e+03 5.349826700839907e+01 -2.666917850530863e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.006000000000000e+03 -2.368250214893639e+06 -9.756176259522925e+05 6.366939281490363e+06 -7.207691801708744e+03 5.354323702075730e+01 -2.667074873767850e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.007000000000000e+03 -2.368394368538450e+06 -9.756165546443575e+05 6.366885938276794e+06 -7.207633652171407e+03 5.358820766137420e+01 -2.667231896703744e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.008000000000000e+03 -2.368538521053688e+06 -9.756154824375780e+05 6.366832591910237e+06 -7.207575498516278e+03 5.363317765279521e+01 -2.667388919502871e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.009000000000000e+03 -2.368682672375430e+06 -9.756144093308854e+05 6.366779242414634e+06 -7.207517341574222e+03 5.367814793037483e+01 -2.667545939983981e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.010000000000000e+03 -2.368826822599780e+06 -9.756133353258843e+05 6.366725889753983e+06 -7.207459180156741e+03 5.372311798441562e+01 -2.667702961303844e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.011000000000000e+03 -2.368970971533696e+06 -9.756122604193845e+05 6.366672534000602e+06 -7.207401016737784e+03 5.376808702202388e+01 -2.667859976809104e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.012000000000000e+03 -2.369115119370270e+06 -9.756111846145842e+05 6.366619175082151e+06 -7.207342848806440e+03 5.381305653558496e+01 -2.668016993283220e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.013000000000000e+03 -2.369259266044991e+06 -9.756101079104242e+05 6.366565813022802e+06 -7.207284677238870e+03 5.385802561532417e+01 -2.668174008341830e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.014000000000000e+03 -2.369403411557561e+06 -9.756090303069062e+05 6.366512447822653e+06 -7.207226501897377e+03 5.390299442234274e+01 -2.668331022360391e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.015000000000000e+03 -2.369547555908320e+06 -9.756079518040334e+05 6.366459079481589e+06 -7.207168323024823e+03 5.394796340042659e+01 -2.668488034709168e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.016000000000000e+03 -2.369691699097000e+06 -9.756068724018082e+05 6.366405707999705e+06 -7.207110140458917e+03 5.399293207832068e+01 -2.668645045801199e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.017000000000000e+03 -2.369835841123305e+06 -9.756057921002423e+05 6.366352333377103e+06 -7.207051954075660e+03 5.403790006715261e+01 -2.668802055950728e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.018000000000000e+03 -2.369979981955460e+06 -9.756047108988009e+05 6.366298955625703e+06 -7.206993764638736e+03 5.408286837349401e+01 -2.668959063160670e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.019000000000000e+03 -2.370124121721691e+06 -9.756036287996161e+05 6.366245574697434e+06 -7.206935570139558e+03 5.412783665517347e+01 -2.669116072785986e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.020000000000000e+03 -2.370268260196822e+06 -9.756025457989711e+05 6.366192190676698e+06 -7.206877373691386e+03 5.417280394865789e+01 -2.669273076460465e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.021000000000000e+03 -2.370412397573961e+06 -9.756014619000582e+05 6.366138803491114e+06 -7.206819172760005e+03 5.421777166289229e+01 -2.669430081021905e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.022000000000000e+03 -2.370556533756244e+06 -9.756003771012890e+05 6.366085413176988e+06 -7.206760968531630e+03 5.426273873268298e+01 -2.669587083251854e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.023000000000000e+03 -2.370700668808255e+06 -9.755992914037276e+05 6.366032019710111e+06 -7.206702760285090e+03 5.430770618034140e+01 -2.669744085123456e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.024000000000000e+03 -2.370844802793971e+06 -9.755982048084378e+05 6.365978623066483e+06 -7.206644547013650e+03 5.435267367565534e+01 -2.669901089312400e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.025000000000000e+03 -2.370988935456100e+06 -9.755971173111846e+05 6.365925223342577e+06 -7.206586332205773e+03 5.439763982731057e+01 -2.670058086433676e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.026000000000000e+03 -2.371133067051990e+06 -9.755960289162071e+05 6.365871820441903e+06 -7.206528112515261e+03 5.444260694958851e+01 -2.670215085532898e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.027000000000000e+03 -2.371277197452865e+06 -9.755949396213946e+05 6.365818414412743e+06 -7.206469889540267e+03 5.448757336406227e+01 -2.670372082264604e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.028000000000000e+03 -2.371421326658444e+06 -9.755938494267507e+05 6.365765005255206e+06 -7.206411663331184e+03 5.453253908194043e+01 -2.670529076494883e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.029000000000000e+03 -2.371565454829676e+06 -9.755927583349262e+05 6.365711592908917e+06 -7.206353431695064e+03 5.457750586772293e+01 -2.670686074161046e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.030000000000000e+03 -2.371709581645058e+06 -9.755916663406257e+05 6.365658177494469e+06 -7.206295199021306e+03 5.462247126360936e+01 -2.670843063426932e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.031000000000000e+03 -2.371853707393413e+06 -9.755905734486260e+05 6.365604758903529e+06 -7.206236961319997e+03 5.466743666779895e+01 -2.671000055014264e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t</EPHEMLISTList>\n\t</EPH>\n\t<ATT>\n\t\t<SATID>Imaginary1</SATID>\n\t\t<GENERATIONTIME>1959-11-15T23:10:43.000000Z</GENERATIONTIME>\n\t\t<STARTTIME>1959-11-15T22:23:59.803099Z</STARTTIME>\n\t\t<NUMPOINTS>1031</NUMPOINTS>\n\t\t<TIMEINTERVAL>2.000000000000000e-02</TIMEINTERVAL>\n\t\t<ATTLISTList>\n\t\t\t<ATTLIST>1.000000000000000e+00 2.308894118549610e-01 -8.990762562434501e-01 1.494696383953982e-01 -3.406035703724804e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.000000000000000e+00 2.308492020770009e-01 -8.991127309774625e-01 1.495516019293347e-01 -3.404985480953350e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.000000000000000e+00 2.308089902341199e-01 -8.991491841801299e-01 1.496335571642471e-01 -3.403935269444570e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.000000000000000e+00 2.307687763281080e-01 -8.991856158536370e-01 1.497155041012714e-01 -3.402885069255873e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.000000000000000e+00 2.307285604192713e-01 -8.992220259822782e-01 1.497974427417665e-01 -3.401834880519700e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.000000000000000e+00 2.306883424874052e-01 -8.992584145759258e-01 1.498793730874100e-01 -3.400784703237341e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.000000000000000e+00 2.306481225094515e-01 -8.992947816491049e-01 1.499612951370056e-01 -3.399734537318842e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.000000000000000e+00 2.306079005610273e-01 -8.993311271795466e-01 1.500432088930861e-01 -3.398684382961558e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.000000000000000e+00 2.305676765723902e-01 -8.993674511896107e-01 1.501251143584271e-01 -3.397634240167445e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.000000000000000e+01 2.305274506020569e-01 -8.994037536686000e-01 1.502070115320059e-01 -3.396584108959652e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.100000000000000e+01 2.304872226594778e-01 -8.994400346174009e-01 1.502889004151541e-01 -3.395533989377414e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.200000000000000e+01 2.304469927202688e-01 -8.994762940499997e-01 1.503707810071873e-01 -3.394483881351499e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.300000000000000e+01 2.304067608103468e-01 -8.995125319538942e-01 1.504526533138381e-01 -3.393433785144547e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.400000000000000e+01 2.303665269504526e-01 -8.995487483340324e-01 1.505345173322320e-01 -3.392383700630191e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.500000000000000e+01 2.303262911170911e-01 -8.995849431991954e-01 1.506163730643592e-01 -3.391333627859154e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.600000000000000e+01 2.302860533409442e-01 -8.996211165411750e-01 1.506982205127815e-01 -3.390283566962244e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.700000000000000e+01 2.302458136359687e-01 -8.996572683622930e-01 1.507800596772582e-01 -3.389233517917147e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.800000000000000e+01 2.302055719711680e-01 -8.996933986738531e-01 1.508618905597058e-01 -3.388183480758828e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.900000000000000e+01 2.301653283998280e-01 -8.997295074659423e-01 1.509437131596643e-01 -3.387133455523497e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.000000000000000e+01 2.301250829100820e-01 -8.997655947436747e-01 1.510255274798994e-01 -3.386083442276749e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.100000000000000e+01 2.300848355003111e-01 -8.998016605133887e-01 1.511073335198798e-01 -3.385033440996632e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.200000000000000e+01 2.300445862012883e-01 -8.998377047698745e-01 1.511891312808153e-01 -3.383983451740198e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.300000000000000e+01 2.300043349842962e-01 -8.998737275226939e-01 1.512709207651531e-01 -3.382933474570658e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.400000000000000e+01 2.299640819001276e-01 -8.999097287608179e-01 1.513527019735164e-01 -3.381883509566505e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.500000000000000e+01 2.299238269335729e-01 -8.999457084934267e-01 1.514344749070214e-01 -3.380833556715259e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.600000000000000e+01 2.298835700858401e-01 -8.999816667249317e-01 1.515162395656930e-01 -3.379783616024466e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.700000000000000e+01 2.298433113728034e-01 -9.000176034511378e-01 1.515979959525289e-01 -3.378733687617775e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.800000000000000e+01 2.298030508222436e-01 -9.000535186697274e-01 1.516797440674307e-01 -3.377683771501871e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.900000000000000e+01 2.297627883878651e-01 -9.000894124010627e-01 1.517614839099722e-01 -3.376633867584494e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.000000000000000e+01 2.297225241332041e-01 -9.001252846210382e-01 1.518432154857528e-01 -3.375583976184146e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.100000000000000e+01 2.296822580587850e-01 -9.001611353423585e-01 1.519249387912090e-01 -3.374534097108244e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.200000000000000e+01 2.296419901216817e-01 -9.001969645783855e-01 1.520066538291376e-01 -3.373484230413469e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.300000000000000e+01 2.296017204013964e-01 -9.002327723075633e-01 1.520883606012721e-01 -3.372434376259611e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.400000000000000e+01 2.295614488356576e-01 -9.002685585546394e-01 1.521700591075273e-01 -3.371384534544187e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.500000000000000e+01 2.295211754852434e-01 -9.003043233023146e-01 1.522517493502999e-01 -3.370334705438131e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.600000000000000e+01 2.294809003489005e-01 -9.003400665589960e-01 1.523334313286813e-01 -3.369284888863371e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.700000000000000e+01 2.294406233969273e-01 -9.003757883336136e-01 1.524151050455747e-01 -3.368235084904254e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.800000000000000e+01 2.294003446708202e-01 -9.004114886163227e-01 1.524967705026567e-01 -3.367185293667498e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.900000000000000e+01 2.293600642035009e-01 -9.004471674060155e-01 1.525784276983174e-01 -3.366135515099752e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.000000000000000e+01 2.293197819208796e-01 -9.004828247255421e-01 1.526600766354939e-01 -3.365085749215226e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.100000000000000e+01 2.292794979130939e-01 -9.005184605487431e-01 1.527417173164173e-01 -3.364035996223485e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.200000000000000e+01 2.292392121595090e-01 -9.005540748895517e-01 1.528233497404930e-01 -3.362986256029100e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.300000000000000e+01 2.291989246258878e-01 -9.005896677652546e-01 1.529049739067952e-01 -3.361936528540764e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.400000000000000e+01 2.291586353857804e-01 -9.006252391503853e-01 1.529865898200752e-01 -3.360886814051653e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.500000000000000e+01 2.291183444289115e-01 -9.006607890544261e-01 1.530681974803833e-01 -3.359837112511848e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.600000000000000e+01 2.290780517110294e-01 -9.006963174941237e-01 1.531497968887997e-01 -3.358787423903505e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.700000000000000e+01 2.290377573234469e-01 -9.007318244469139e-01 1.532313880457337e-01 -3.357737748341247e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.800000000000000e+01 2.289974611982641e-01 -9.007673099394223e-01 1.533129709509062e-01 -3.356688085709674e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.900000000000000e+01 2.289571633857536e-01 -9.008027739530313e-01 1.533945456093615e-01 -3.355638436276632e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.000000000000000e+01 2.289168638978387e-01 -9.008382164936758e-01 1.534761120192709e-01 -3.354588799944336e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.100000000000000e+01 2.288765627060905e-01 -9.008736375737706e-01 1.535576701813471e-01 -3.353539176704579e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.200000000000000e+01 2.288362598510320e-01 -9.009090371818700e-01 1.536392200983933e-01 -3.352489566709856e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.300000000000000e+01 2.287959553395181e-01 -9.009444153207390e-01 1.537207617711923e-01 -3.351439969970121e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.400000000000000e+01 2.287556491449151e-01 -9.009797720031660e-01 1.538022951999299e-01 -3.350390386457154e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.500000000000000e+01 2.287153413034640e-01 -9.010151072220647e-01 1.538838203857627e-01 -3.349340816243304e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.600000000000000e+01 2.286750318456321e-01 -9.010504209683966e-01 1.539653373319234e-01 -3.348291259483580e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.700000000000000e+01 2.286347207055850e-01 -9.010857132690624e-01 1.540468460375301e-01 -3.347241716042535e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.800000000000000e+01 2.285944079807784e-01 -9.011209841023743e-01 1.541283465015993e-01 -3.346192185977502e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.900000000000000e+01 2.285540935922069e-01 -9.011562334870054e-01 1.542098387300032e-01 -3.345142669433174e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.000000000000000e+01 2.285137776151513e-01 -9.011914614095998e-01 1.542913227207110e-01 -3.344093166399171e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.100000000000000e+01 2.284734600386710e-01 -9.012266678779165e-01 1.543727984747985e-01 -3.343043676871194e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.200000000000000e+01 2.284331408358278e-01 -9.012618528990183e-01 1.544542659956163e-01 -3.341994200962399e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.300000000000000e+01 2.283928200641718e-01 -9.012970164635473e-01 1.545357252819850e-01 -3.340944738672195e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.400000000000000e+01 2.283524977100913e-01 -9.013321585782165e-01 1.546171763360017e-01 -3.339895290037957e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.500000000000000e+01 2.283121737558622e-01 -9.013672792528318e-01 1.546986191579301e-01 -3.338845855050068e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.600000000000000e+01 2.282718482490026e-01 -9.014023784775136e-01 1.547800537486034e-01 -3.337796433781504e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.700000000000000e+01 2.282315211949859e-01 -9.014374562506439e-01 1.548614801114584e-01 -3.336747026357852e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.800000000000000e+01 2.281911925523044e-01 -9.014725125919364e-01 1.549428982453311e-01 -3.335697632671091e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.900000000000000e+01 2.281508623898268e-01 -9.015075474824252e-01 1.550243081524572e-01 -3.334648252887447e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.000000000000000e+01 2.281105306968765e-01 -9.015425609288161e-01 1.551057098344290e-01 -3.333598887026744e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.100000000000000e+01 2.280701974427602e-01 -9.015775529481680e-01 1.551871032896935e-01 -3.332549534980210e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.200000000000000e+01 2.280298626912333e-01 -9.016125235194308e-01 1.552684885228014e-01 -3.331500196995136e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.300000000000000e+01 2.279895264045469e-01 -9.016474726639646e-01 1.553498655310191e-01 -3.330450872900098e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.400000000000000e+01 2.279491886218353e-01 -9.016824003659851e-01 1.554312343198999e-01 -3.329401562964052e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.500000000000000e+01 2.279088493366654e-01 -9.017173066365933e-01 1.555125948878840e-01 -3.328352267073331e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.600000000000000e+01 2.278685085455387e-01 -9.017521914808375e-01 1.555939472354268e-01 -3.327302985248539e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.700000000000000e+01 2.278281662843085e-01 -9.017870548908180e-01 1.556752913643080e-01 -3.326253717585483e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.800000000000000e+01 2.277878225474481e-01 -9.018218968676485e-01 1.557566272783169e-01 -3.325204464209868e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.900000000000000e+01 2.277474773219202e-01 -9.018567174292514e-01 1.558379549724133e-01 -3.324155224884253e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.000000000000000e+01 2.277071306398798e-01 -9.018915165602589e-01 1.559192744531291e-01 -3.323105999910311e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.100000000000000e+01 2.276667825297102e-01 -9.019262942562478e-01 1.560005857216081e-01 -3.322056789344175e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.200000000000000e+01 2.276264329300378e-01 -9.019610505484073e-01 1.560818887736019e-01 -3.321007592915521e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.300000000000000e+01 2.275860819157970e-01 -9.019957854061734e-01 1.561631836171321e-01 -3.319958411038891e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.400000000000000e+01 2.275457294529367e-01 -9.020304988535253e-01 1.562444702473319e-01 -3.318909243455180e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.500000000000000e+01 2.275053755732782e-01 -9.020651908761904e-01 1.563257486702097e-01 -3.317860090441764e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.600000000000000e+01 2.274650202784912e-01 -9.020998614835187e-01 1.564070188837957e-01 -3.316810951878419e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.700000000000000e+01 2.274246635627925e-01 -9.021345106793968e-01 1.564882808895608e-01 -3.315761827828199e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.800000000000000e+01 2.273843054540360e-01 -9.021691384595830e-01 1.565695346886553e-01 -3.314712718346152e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.900000000000000e+01 2.273439459552609e-01 -9.022037448252392e-01 1.566507802833999e-01 -3.313663623505077e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.000000000000000e+01 2.273035850449646e-01 -9.022383297884106e-01 1.567320176733800e-01 -3.312614543262731e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.100000000000000e+01 2.272632227706302e-01 -9.022728933373279e-01 1.568132468606372e-01 -3.311565477740380e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.200000000000000e+01 2.272228591413087e-01 -9.023074354730778e-01 1.568944678465360e-01 -3.310516426976299e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.300000000000000e+01 2.271824941003548e-01 -9.023419562165601e-01 1.569756806316125e-01 -3.309467390923438e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.400000000000000e+01 2.271421277408804e-01 -9.023764555465444e-01 1.570568852155585e-01 -3.308418369659251e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.500000000000000e+01 2.271017600289642e-01 -9.024109334726971e-01 1.571380816021496e-01 -3.307369363271641e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.600000000000000e+01 2.270613909549660e-01 -9.024453900040622e-01 1.572192697906354e-01 -3.306320371720071e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.700000000000000e+01 2.270210205597379e-01 -9.024798251311715e-01 1.573004497831998e-01 -3.305271395108554e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.800000000000000e+01 2.269806488256975e-01 -9.025142388637961e-01 1.573816215800093e-01 -3.304222433426889e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.900000000000000e+01 2.269402757761213e-01 -9.025486311982713e-01 1.574627851826934e-01 -3.303173486744131e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.000000000000000e+02 2.268999014261082e-01 -9.025830021336675e-01 1.575439405927323e-01 -3.302124555111638e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.010000000000000e+02 2.268595257470780e-01 -9.026173516834319e-01 1.576250878100695e-01 -3.301075638495227e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.020000000000000e+02 2.268191487818678e-01 -9.026516798373662e-01 1.577062268367185e-01 -3.300026737006468e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.030000000000000e+02 2.267787705440897e-01 -9.026859865960027e-01 1.577873576736031e-01 -3.298977850669729e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.040000000000000e+02 2.267383909922869e-01 -9.027202719732419e-01 1.578684803225331e-01 -3.297928979517886e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.050000000000000e+02 2.266980101796506e-01 -9.027545359602429e-01 1.579495947830754e-01 -3.296880123566155e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.060000000000000e+02 2.266576281145961e-01 -9.027887785563894e-01 1.580307010576523e-01 -3.295831282898973e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.070000000000000e+02 2.266172447597033e-01 -9.028229997800067e-01 1.581117991449383e-01 -3.294782457415085e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.080000000000000e+02 2.265768601771996e-01 -9.028571996087290e-01 1.581928890507955e-01 -3.293733647408182e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.090000000000000e+02 2.265364743240973e-01 -9.028913780665899e-01 1.582739707716453e-01 -3.292684852669599e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.100000000000000e+02 2.264960872520458e-01 -9.029255351385356e-01 1.583550443107866e-01 -3.291636073377974e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.110000000000000e+02 2.264556989574077e-01 -9.029596708318259e-01 1.584361096682655e-01 -3.290587309496257e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.120000000000000e+02 2.264153094101776e-01 -9.029937851555798e-01 1.585171668466072e-01 -3.289538561105754e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.130000000000000e+02 2.263749186719728e-01 -9.030278780952676e-01 1.585982158472060e-01 -3.288489828311763e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.140000000000000e+02 2.263345267302740e-01 -9.030619496639966e-01 1.586792566683216e-01 -3.287441110986375e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.150000000000000e+02 2.262941335539853e-01 -9.030959998702920e-01 1.587602893129718e-01 -3.286392409232203e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.160000000000000e+02 2.262537392150850e-01 -9.031300286942483e-01 1.588413137838595e-01 -3.285343723224960e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.170000000000000e+02 2.262133436960753e-01 -9.031640361496733e-01 1.589223300796641e-01 -3.284295052849594e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.180000000000000e+02 2.261729469656500e-01 -9.031980222499667e-01 1.590033382007226e-01 -3.283246398089076e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.190000000000000e+02 2.261325490907524e-01 -9.032319869749883e-01 1.590843381507197e-01 -3.282197759155911e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.200000000000000e+02 2.260921500600669e-01 -9.032659303345620e-01 1.591653299295246e-01 -3.281149135996107e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.210000000000000e+02 2.260517498451678e-01 -9.032998523401684e-01 1.592463135380557e-01 -3.280100528622666e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.220000000000000e+02 2.260113485107555e-01 -9.033337529753727e-01 1.593272889786086e-01 -3.279051937168809e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.230000000000000e+02 2.259709460114244e-01 -9.033676322611585e-01 1.594082562495924e-01 -3.278003361514978e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.240000000000000e+02 2.259305423854644e-01 -9.034014901831258e-01 1.594892153562206e-01 -3.276954801906414e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.250000000000000e+02 2.258901376498703e-01 -9.034353267445270e-01 1.595701662973877e-01 -3.275906258279634e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.260000000000000e+02 2.258497317753174e-01 -9.034691419609769e-01 1.596511090718433e-01 -3.274857730550200e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.270000000000000e+02 2.258093247876409e-01 -9.035029358212805e-01 1.597320436850627e-01 -3.273809218959928e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.280000000000000e+02 2.257689167326978e-01 -9.035367083200190e-01 1.598129701360737e-01 -3.272760723484922e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.290000000000000e+02 2.257285075328280e-01 -9.035704594841432e-01 1.598938884251612e-01 -3.271712244053541e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.300000000000000e+02 2.256880972689268e-01 -9.036041892927150e-01 1.599747985542908e-01 -3.270663780814236e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.310000000000000e+02 2.256476859386232e-01 -9.036378977506594e-01 1.600557005245803e-01 -3.269615333780101e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.320000000000000e+02 2.256072735071238e-01 -9.036715848706289e-01 1.601365943372820e-01 -3.268566902973604e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.330000000000000e+02 2.255668600256648e-01 -9.037052506426118e-01 1.602174799933967e-01 -3.267518488451172e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.340000000000000e+02 2.255264454711699e-01 -9.037388950791800e-01 1.602983574923177e-01 -3.266470090165642e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.350000000000000e+02 2.254860298804758e-01 -9.037725181683604e-01 1.603792268382106e-01 -3.265421708311803e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.360000000000000e+02 2.254456132456498e-01 -9.038061199188467e-01 1.604600880309865e-01 -3.264373342842701e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.370000000000000e+02 2.254051955576450e-01 -9.038397003375781e-01 1.605409410708927e-01 -3.263324993765853e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.380000000000000e+02 2.253647768549280e-01 -9.038732594139562e-01 1.606217859610819e-01 -3.262276661232033e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.390000000000000e+02 2.253243571335272e-01 -9.039067971572640e-01 1.607026227004933e-01 -3.261228345155280e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.400000000000000e+02 2.252839363788981e-01 -9.039403135734095e-01 1.607834512908293e-01 -3.260180045602453e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.410000000000000e+02 2.252435146337346e-01 -9.039738086561190e-01 1.608642717321700e-01 -3.259131762590643e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.420000000000000e+02 2.252030918978883e-01 -9.040072824048069e-01 1.609450840283314e-01 -3.258083496256971e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.430000000000000e+02 2.251626681419598e-01 -9.040407348360634e-01 1.610258881774482e-01 -3.257035246492249e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.440000000000000e+02 2.251222434208357e-01 -9.040741659338269e-01 1.611066841831087e-01 -3.255987013483763e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.450000000000000e+02 2.250818177356854e-01 -9.041075757018505e-01 1.611874720465026e-01 -3.254938797252271e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.460000000000000e+02 2.250413910460068e-01 -9.041409641594673e-01 1.612682517660020e-01 -3.253890597687710e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.470000000000000e+02 2.250009634262089e-01 -9.041743312851411e-01 1.613490233454103e-01 -3.252842414993818e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.480000000000000e+02 2.249605348218896e-01 -9.042076771028360e-01 1.614297867827374e-01 -3.251794249029646e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.490000000000000e+02 2.249201052867583e-01 -9.042410015921282e-01 1.615105420842294e-01 -3.250746100099434e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.500000000000000e+02 2.248796748333138e-01 -9.042743047606233e-01 1.615912892471164e-01 -3.249697968058097e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.510000000000000e+02 2.248392433987138e-01 -9.043075866331863e-01 1.616720282702221e-01 -3.248649852793446e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.520000000000000e+02 2.247988110762783e-01 -9.043408471771598e-01 1.617527591603132e-01 -3.247601754673968e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.530000000000000e+02 2.247583778306900e-01 -9.043740864094076e-01 1.618334819170882e-01 -3.246553673615424e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.540000000000000e+02 2.247179436581624e-01 -9.044073043389339e-01 1.619141965387736e-01 -3.245505609541191e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.550000000000000e+02 2.246775085865939e-01 -9.044405009586891e-01 1.619949030283154e-01 -3.244457562579045e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.560000000000000e+02 2.246370726521809e-01 -9.044736762617176e-01 1.620756013872978e-01 -3.243409532803686e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.570000000000000e+02 2.245966357879474e-01 -9.045068302733079e-01 1.621562916149142e-01 -3.242361520117217e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.580000000000000e+02 2.245561980666496e-01 -9.045399629715483e-01 1.622369737155533e-01 -3.241313524744262e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.590000000000000e+02 2.245157594582064e-01 -9.045730743732480e-01 1.623176476872635e-01 -3.240265546573445e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.600000000000000e+02 2.244753199839536e-01 -9.046061644744997e-01 1.623983135322956e-01 -3.239217585694149e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.610000000000000e+02 2.244348796692358e-01 -9.046392332710161e-01 1.624789712524871e-01 -3.238169642180859e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.620000000000000e+02 2.243944384760956e-01 -9.046722807774734e-01 1.625596208483077e-01 -3.237121716023925e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.630000000000000e+02 2.243539964605100e-01 -9.047053069841393e-01 1.626402623197842e-01 -3.236073807246732e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.640000000000000e+02 2.243135536112907e-01 -9.047383118950887e-01 1.627208956698758e-01 -3.235025915937824e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.650000000000000e+02 2.242731099111618e-01 -9.047712955209639e-01 1.628015208980154e-01 -3.233978042061912e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.660000000000000e+02 2.242326654043892e-01 -9.048042578511847e-01 1.628821380065774e-01 -3.232930185735796e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.670000000000000e+02 2.241922200896362e-01 -9.048371988903483e-01 1.629627469966664e-01 -3.231882346974421e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.680000000000000e+02 2.241517739456388e-01 -9.048701186494763e-01 1.630433478681252e-01 -3.230834525757387e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.690000000000000e+02 2.241113270216638e-01 -9.049030171163283e-01 1.631239406234864e-01 -3.229786722212791e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.700000000000000e+02 2.240708793134708e-01 -9.049358942964694e-01 1.632045252637703e-01 -3.228738936349059e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.710000000000000e+02 2.240304307870408e-01 -9.049687502070621e-01 1.632851017873808e-01 -3.227691168069305e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.720000000000000e+02 2.239899815191802e-01 -9.050015848229833e-01 1.633656702000140e-01 -3.226643417655971e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.730000000000000e+02 2.239495314522033e-01 -9.050343981673739e-01 1.634462305004473e-01 -3.225595685006920e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.740000000000000e+02 2.239090806423519e-01 -9.050671902313685e-01 1.635267826882597e-01 -3.224547970122622e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.750000000000000e+02 2.238686290767930e-01 -9.050999610177051e-01 1.636073267673971e-01 -3.223500273135591e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.760000000000000e+02 2.238281767417444e-01 -9.051327105349189e-01 1.636878627378910e-01 -3.222452594041973e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.770000000000000e+02 2.237877236835232e-01 -9.051654387746062e-01 1.637683906006427e-01 -3.221404932891813e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.780000000000000e+02 2.237472699051987e-01 -9.051981457399043e-01 1.638489103568783e-01 -3.220357289709835e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.790000000000000e+02 2.237068153680171e-01 -9.052308314495456e-01 1.639294220048208e-01 -3.219309664388158e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.800000000000000e+02 2.236663601390179e-01 -9.052634958797162e-01 1.640099255507795e-01 -3.218262057238749e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.810000000000000e+02 2.236259042032932e-01 -9.052961390423744e-01 1.640904209938499e-01 -3.217214468174148e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.820000000000000e+02 2.235854475304530e-01 -9.053287609487398e-01 1.641709083351387e-01 -3.216166897224738e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.830000000000000e+02 2.235449901937572e-01 -9.053613615862548e-01 1.642513875739740e-01 -3.215119344378681e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.840000000000000e+02 2.235045321496182e-01 -9.053939409667434e-01 1.643318587131818e-01 -3.214071809732330e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.850000000000000e+02 2.234640734228127e-01 -9.054264990880224e-01 1.644123217535782e-01 -3.213024293311351e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.860000000000000e+02 2.234236140525130e-01 -9.054590359431254e-01 1.644927766964319e-01 -3.211976795173924e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.870000000000000e+02 2.233831539714562e-01 -9.054915515526950e-01 1.645732235432854e-01 -3.210929315338940e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.880000000000000e+02 2.233426932493050e-01 -9.055240459024677e-01 1.646536622947568e-01 -3.209881853861549e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.890000000000000e+02 2.233022318954889e-01 -9.055565189944188e-01 1.647340929517387e-01 -3.208834410756840e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.900000000000000e+02 2.232617698578591e-01 -9.055889708470033e-01 1.648145155146224e-01 -3.207786986005804e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.910000000000000e+02 2.232213072124431e-01 -9.056214014400680e-01 1.648949299863760e-01 -3.206739579773885e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.920000000000000e+02 2.231808439302228e-01 -9.056538107864756e-01 1.649753363677421e-01 -3.205692192037142e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.930000000000000e+02 2.231403800053746e-01 -9.056861988930678e-01 1.650557346584288e-01 -3.204644822785361e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.940000000000000e+02 2.230999154906678e-01 -9.057185657483666e-01 1.651361248601688e-01 -3.203597472107650e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.950000000000000e+02 2.230594503712542e-01 -9.057509113586414e-01 1.652165069752026e-01 -3.202550140059914e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.960000000000000e+02 2.230189846182527e-01 -9.057832357383928e-01 1.652968810024963e-01 -3.201502826579687e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.970000000000000e+02 2.229785183084750e-01 -9.058155388682289e-01 1.653772469448040e-01 -3.200455531807542e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.980000000000000e+02 2.229380513813789e-01 -9.058478207665662e-01 1.654576048037784e-01 -3.199408255776890e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.990000000000000e+02 2.228975838957542e-01 -9.058800814237062e-01 1.655379545792557e-01 -3.198360998494869e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.000000000000000e+02 2.228571158404180e-01 -9.059123208447037e-01 1.656182962735805e-01 -3.197313760025589e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.010000000000000e+02 2.228166471957429e-01 -9.059445390438133e-01 1.656986298844098e-01 -3.196266540255518e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.020000000000000e+02 2.227761780131056e-01 -9.059767360015503e-01 1.657789554182482e-01 -3.195219339486491e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.030000000000000e+02 2.227357082865583e-01 -9.060089117287713e-01 1.658592728733668e-01 -3.194172157602826e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.040000000000000e+02 2.226952380035607e-01 -9.060410662345509e-01 1.659395822492399e-01 -3.193124994578874e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.050000000000000e+02 2.226547671835319e-01 -9.060731995156708e-01 1.660198835481492e-01 -3.192077850500230e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.060000000000000e+02 2.226142958689505e-01 -9.061053115574969e-01 1.661001767752735e-01 -3.191030725600834e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.070000000000000e+02 2.225738239865559e-01 -9.061374023958486e-01 1.661804619243396e-01 -3.189983619549152e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.080000000000000e+02 2.225333516329866e-01 -9.061694719991232e-01 1.662607390020496e-01 -3.188936532675309e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.090000000000000e+02 2.224928787329093e-01 -9.062015203925373e-01 1.663410080083983e-01 -3.187889464930468e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.100000000000000e+02 2.224524053634943e-01 -9.062335475602964e-01 1.664212689439241e-01 -3.186842416364036e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.110000000000000e+02 2.224119315031609e-01 -9.062655535109161e-01 1.665015218105944e-01 -3.185795387016284e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.120000000000000e+02 2.223714571351574e-01 -9.062975382558111e-01 1.665817666071881e-01 -3.184748376827781e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.130000000000000e+02 2.223309823073429e-01 -9.063295017832752e-01 1.666620033364477e-01 -3.183701385925106e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.140000000000000e+02 2.222905070289412e-01 -9.063614440944239e-01 1.667422319998011e-01 -3.182654414346794e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.150000000000000e+02 2.222500312486702e-01 -9.063933652064923e-01 1.668224525980038e-01 -3.181607462098400e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.160000000000000e+02 2.222095550345786e-01 -9.064252651029605e-01 1.669026651334534e-01 -3.180560529304742e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.170000000000000e+02 2.221690783889361e-01 -9.064571437900708e-01 1.669828696057496e-01 -3.179513615916548e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.180000000000000e+02 2.221286012672856e-01 -9.064890012846714e-01 1.670630660148043e-01 -3.178466721906829e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.190000000000000e+02 2.220881237332467e-01 -9.065208375717145e-01 1.671432543628869e-01 -3.177419847390440e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.200000000000000e+02 2.220476457894645e-01 -9.065526526488730e-01 1.672234346543726e-01 -3.176372992534780e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.210000000000000e+02 2.220071673902770e-01 -9.065844465399640e-01 1.673036068854050e-01 -3.175326157142076e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.220000000000000e+02 2.219666886126675e-01 -9.066162192237019e-01 1.673837710600421e-01 -3.174279341402816e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.230000000000000e+02 2.219262094104197e-01 -9.066479707212709e-01 1.674639271759886e-01 -3.173232545189831e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.240000000000000e+02 2.218857298217798e-01 -9.066797010185438e-01 1.675440752388811e-01 -3.172185768752019e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.250000000000000e+02 2.218452498586035e-01 -9.067114101185845e-01 1.676242152486578e-01 -3.171139012061969e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.260000000000000e+02 2.218047694701558e-01 -9.067430980412624e-01 1.677043472044196e-01 -3.170092275053905e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.270000000000000e+02 2.217642887481013e-01 -9.067747647631796e-01 1.677844711089856e-01 -3.169045557883431e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.280000000000000e+02 2.217238076522590e-01 -9.068064102980944e-01 1.678645869641152e-01 -3.167998860571695e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.290000000000000e+02 2.216833261682507e-01 -9.068380346556960e-01 1.679446947691512e-01 -3.166952183088218e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.300000000000000e+02 2.216428443657672e-01 -9.068696378217486e-01 1.680247945250885e-01 -3.165905525490374e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.310000000000000e+02 2.216023622104419e-01 -9.069012198062111e-01 1.681048862349372e-01 -3.164858887860527e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.320000000000000e+02 2.215618797002905e-01 -9.069327806146663e-01 1.681849698984909e-01 -3.163812270196627e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.330000000000000e+02 2.215213968831396e-01 -9.069643202383212e-01 1.682650455172512e-01 -3.162765672550845e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.340000000000000e+02 2.214809137123154e-01 -9.069958386928917e-01 1.683451130920010e-01 -3.161719094938343e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.350000000000000e+02 2.214404302429016e-01 -9.070273359671166e-01 1.684251726242895e-01 -3.160672537431115e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.360000000000000e+02 2.213999464726758e-01 -9.070588120649842e-01 1.685052241156553e-01 -3.159626000065338e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.370000000000000e+02 2.213594623823140e-01 -9.070902669978242e-01 1.685852675652402e-01 -3.158579482798961e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.380000000000000e+02 2.213189780044676e-01 -9.071217007562022e-01 1.686653029769433e-01 -3.157532985796490e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.390000000000000e+02 2.212784933609110e-01 -9.071531133398973e-01 1.687453303510913e-01 -3.156486509053351e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.400000000000000e+02 2.212380083897078e-01 -9.071845047724861e-01 1.688253496862561e-01 -3.155440052477118e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.410000000000000e+02 2.211975231811331e-01 -9.072158750273209e-01 1.689053609874809e-01 -3.154393616317306e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.420000000000000e+02 2.211570377154623e-01 -9.072472241179256e-01 1.689853642535184e-01 -3.153347200473582e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.430000000000000e+02 2.211165519575312e-01 -9.072785520590089e-01 1.690653594839392e-01 -3.152300804915153e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.440000000000000e+02 2.210760659578969e-01 -9.073098588333510e-01 1.691453466844067e-01 -3.151254429896071e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.450000000000000e+02 2.210355797460459e-01 -9.073411444419111e-01 1.692253258534460e-01 -3.150208075333562e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.460000000000000e+02 2.209950932558976e-01 -9.073724089068373e-01 1.693052969910037e-01 -3.149161741197308e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.470000000000000e+02 2.209546065715346e-01 -9.074036522054765e-01 1.693852601011247e-01 -3.148115427671855e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.480000000000000e+02 2.209141196301770e-01 -9.074348743626155e-01 1.694652151817523e-01 -3.147069134638297e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.490000000000000e+02 2.208736324860719e-01 -9.074660753626225e-01 1.695451622371381e-01 -3.146022862287389e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.500000000000000e+02 2.208331451618891e-01 -9.074972552087094e-01 1.696251012655576e-01 -3.144976610520593e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.510000000000000e+02 2.207926575919656e-01 -9.075284139163655e-01 1.697050322706234e-01 -3.143930379476456e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.520000000000000e+02 2.207521698525456e-01 -9.075595514719998e-01 1.697849552521910e-01 -3.142884169156527e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.530000000000000e+02 2.207116819420223e-01 -9.075906678812696e-01 1.698648702107515e-01 -3.141837979550178e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.540000000000000e+02 2.206711938227875e-01 -9.076217631569006e-01 1.699447771473057e-01 -3.140791810692613e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.550000000000000e+02 2.206307055471661e-01 -9.076528372848403e-01 1.700246760655409e-01 -3.139745662746382e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.560000000000000e+02 2.205902171211319e-01 -9.076838902701012e-01 1.701045669651901e-01 -3.138699535670345e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.570000000000000e+02 2.205497285032364e-01 -9.077149221304037e-01 1.701844498449678e-01 -3.137653429394483e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.580000000000000e+02 2.205092397649834e-01 -9.077459328444872e-01 1.702643247101131e-01 -3.136607344147015e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.590000000000000e+02 2.204687508688814e-01 -9.077769224296948e-01 1.703441915589663e-01 -3.135561279843042e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.600000000000000e+02 2.204282618391633e-01 -9.078078908812764e-01 1.704240503941069e-01 -3.134515236579988e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.610000000000000e+02 2.203877726950160e-01 -9.078388381989423e-01 1.705039012163325e-01 -3.133469214371442e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.620000000000000e+02 2.203472834077072e-01 -9.078697643971353e-01 1.705837440243194e-01 -3.132423213152705e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.630000000000000e+02 2.203067940170254e-01 -9.079006694631750e-01 1.706635788228773e-01 -3.131377233129635e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.640000000000000e+02 2.202663045407925e-01 -9.079315533972259e-01 1.707434056127563e-01 -3.130331274312695e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.650000000000000e+02 2.202258149224295e-01 -9.079624162220118e-01 1.708232243919963e-01 -3.129285336596204e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.660000000000000e+02 2.201853252356105e-01 -9.079932579173663e-01 1.709030351647084e-01 -3.128239420168898e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.670000000000000e+02 2.201448354746725e-01 -9.080240784875077e-01 1.709828379327863e-01 -3.127193525082714e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.680000000000000e+02 2.201043456132650e-01 -9.080548779498038e-01 1.710626326928654e-01 -3.126147651182031e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.690000000000000e+02 2.200638556889891e-01 -9.080856562923092e-01 1.711424194496907e-01 -3.125101798667813e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.700000000000000e+02 2.200233657190614e-01 -9.081164135144628e-01 1.712221982045240e-01 -3.124055967573182e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.710000000000000e+02 2.199828756600056e-01 -9.081471496346535e-01 1.713019689559082e-01 -3.123010157822704e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.720000000000000e+02 2.199423855874556e-01 -9.081778646321416e-01 1.713817317083257e-01 -3.121964369607030e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.730000000000000e+02 2.199018954379995e-01 -9.082085585319067e-01 1.714614864594658e-01 -3.120918602804016e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.740000000000000e+02 2.198614052746941e-01 -9.082392313173081e-01 1.715412332130633e-01 -3.119872857578069e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.750000000000000e+02 2.198209150881464e-01 -9.082698829956553e-01 1.716209719697834e-01 -3.118827133924153e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.760000000000000e+02 2.197804248581610e-01 -9.083005135776420e-01 1.717007027291295e-01 -3.117781431821053e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.770000000000000e+02 2.197399346379958e-01 -9.083311230489441e-01 1.717804254949706e-01 -3.116735751434506e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.780000000000000e+02 2.196994444159893e-01 -9.083617114194755e-01 1.718601402668128e-01 -3.115690092705926e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.790000000000000e+02 2.196589541638267e-01 -9.083922787016864e-01 1.719398470443260e-01 -3.114644455619064e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.800000000000000e+02 2.196184639433182e-01 -9.084228248793574e-01 1.720195458312390e-01 -3.113598840335736e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.810000000000000e+02 2.195779737513631e-01 -9.084533499577218e-01 1.720992366284800e-01 -3.112553246865558e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.820000000000000e+02 2.195374835455929e-01 -9.084838539557250e-01 1.721789194340390e-01 -3.111507675111027e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.830000000000000e+02 2.194969934044070e-01 -9.085143368489591e-01 1.722585942542054e-01 -3.110462125342257e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.840000000000000e+02 2.194565032744605e-01 -9.085447986618467e-01 1.723382610854267e-01 -3.109416597387725e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.850000000000000e+02 2.194160131996881e-01 -9.085752393831573e-01 1.724179199312106e-01 -3.108371091391562e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.860000000000000e+02 2.193755231902307e-01 -9.086056590137509e-01 1.724975707930613e-01 -3.107325607394454e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.870000000000000e+02 2.193350332083635e-01 -9.086360575701133e-01 1.725772136696710e-01 -3.106280145333657e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.880000000000000e+02 2.192945433134246e-01 -9.086664350368555e-01 1.726568485647191e-01 -3.105234705365575e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.890000000000000e+02 2.192540535029514e-01 -9.086967914190029e-01 1.727364754791529e-01 -3.104189287501232e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.900000000000000e+02 2.192135637363773e-01 -9.087271267349023e-01 1.728160944109917e-01 -3.103143891646948e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.910000000000000e+02 2.191730725401924e-01 -9.087574414716281e-01 1.728957052972007e-01 -3.102098514441726e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.920000000000000e+02 2.191325845382991e-01 -9.087877341123974e-01 1.729753083432086e-01 -3.101053166651483e-01 1.860000000000000e-10 2.250000000000000e-11 -3.780000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.930000000000000e+02 2.190920950584809e-01 -9.088180062006632e-01 1.730549033413756e-01 -3.100007837374675e-01 1.860000000000000e-10 2.250000000000000e-11 -3.780000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.940000000000000e+02 2.190516057029482e-01 -9.088482572100332e-01 1.731344903656375e-01 -3.098962530445900e-01 1.860000000000000e-10 2.250000000000000e-11 -3.780000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.950000000000000e+02 2.190111164762024e-01 -9.088784871441590e-01 1.732140694167223e-01 -3.097917245868442e-01 1.860000000000000e-10 2.250000000000000e-11 -3.780000000000000e-11 4.460000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.960000000000000e+02 2.189706273526352e-01 -9.089086960182917e-01 1.732936404922406e-01 -3.096871983535451e-01 1.860000000000000e-10 2.240000000000000e-11 -3.790000000000000e-11 4.460000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.810000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.970000000000000e+02 2.189301383785509e-01 -9.089388838195767e-01 1.733732035966299e-01 -3.095826743618136e-01 1.860000000000000e-10 2.240000000000000e-11 -3.790000000000000e-11 4.460000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.810000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.980000000000000e+02 2.188896495247935e-01 -9.089690505635122e-01 1.734527587278601e-01 -3.094781526025304e-01 1.860000000000000e-10 2.240000000000000e-11 -3.790000000000000e-11 4.460000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.810000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.990000000000000e+02 2.188491608188548e-01 -9.089991962406317e-01 1.735323058908677e-01 -3.093736330959166e-01 1.860000000000000e-10 2.240000000000000e-11 -3.800000000000000e-11 4.460000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.810000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.000000000000000e+02 2.188086722782314e-01 -9.090293208530628e-01 1.736118450853936e-01 -3.092691158381359e-01 1.860000000000000e-10 2.240000000000000e-11 -3.800000000000000e-11 4.460000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.810000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.010000000000000e+02 2.187681896454637e-01 -9.090594225097781e-01 1.736913765774022e-01 -3.091646021912636e-01 1.860000000000000e-10 2.240000000000000e-11 -3.800000000000000e-11 4.470000000000000e-11 1.740000000000000e-11 3.090000000000000e-11 -1.810000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.150000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.020000000000000e+02 2.187283911966451e-01 -9.090888526171280e-01 1.737707389882590e-01 -3.090616106915828e-01 1.860000000000000e-10 2.240000000000000e-11 -3.810000000000000e-11 4.470000000000000e-11 1.740000000000000e-11 3.090000000000000e-11 -1.810000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.150000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.030000000000000e+02 2.186878209857443e-01 -9.091189716151923e-01 1.738503273875531e-01 -3.089569485690247e-01 1.860000000000000e-10 2.230000000000000e-11 -3.810000000000000e-11 4.470000000000000e-11 1.740000000000000e-11 3.090000000000000e-11 -1.810000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.150000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.040000000000000e+02 2.186472567115229e-01 -9.091490721149922e-01 1.739299003670912e-01 -3.088522811365780e-01 1.860000000000000e-10 2.230000000000000e-11 -3.810000000000000e-11 4.470000000000000e-11 1.740000000000000e-11 3.090000000000000e-11 -1.810000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.150000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.050000000000000e+02 2.186066979668279e-01 -9.091791531845845e-01 1.740094578519534e-01 -3.087476114833460e-01 1.860000000000000e-10 2.230000000000000e-11 -3.810000000000000e-11 4.470000000000000e-11 1.740000000000000e-11 3.090000000000000e-11 -1.800000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.150000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.060000000000000e+02 2.185661443498866e-01 -9.092092139565390e-01 1.740889997864909e-01 -3.086429424981175e-01 1.860000000000000e-10 2.230000000000000e-11 -3.820000000000000e-11 4.480000000000000e-11 1.740000000000000e-11 3.090000000000000e-11 -1.800000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.150000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.070000000000000e+02 2.185255954697113e-01 -9.092392536426981e-01 1.741685261449475e-01 -3.085382768156557e-01 1.860000000000000e-10 2.230000000000000e-11 -3.820000000000000e-11 4.480000000000000e-11 1.740000000000000e-11 3.090000000000000e-11 -1.800000000000000e-11 1.670000000000000e-10 -2.360000000000000e-11 7.150000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.080000000000000e+02 2.184850509567223e-01 -9.092692715430465e-01 1.742480369448701e-01 -3.084336167749477e-01 1.860000000000000e-10 2.230000000000000e-11 -3.830000000000000e-11 4.480000000000000e-11 1.740000000000000e-11 3.090000000000000e-11 -1.800000000000000e-11 1.670000000000000e-10 -2.360000000000000e-11 7.150000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.090000000000000e+02 2.184445104761907e-01 -9.092992670492093e-01 1.743275322587385e-01 -3.083289643922002e-01 1.870000000000000e-10 2.230000000000000e-11 -3.830000000000000e-11 4.480000000000000e-11 1.740000000000000e-11 3.090000000000000e-11 -1.800000000000000e-11 1.670000000000000e-10 -2.360000000000000e-11 7.150000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.100000000000000e+02 2.184039737347347e-01 -9.093292396457033e-01 1.744070122275358e-01 -3.082243213442263e-01 1.870000000000000e-10 2.230000000000000e-11 -3.830000000000000e-11 4.480000000000000e-11 1.740000000000000e-11 3.090000000000000e-11 -1.800000000000000e-11 1.670000000000000e-10 -2.360000000000000e-11 7.150000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.110000000000000e+02 2.183634712922895e-01 -9.093591787469733e-01 1.744864785365781e-01 -3.081196962897959e-01 1.870000000000000e-10 2.220000000000000e-11 -3.840000000000000e-11 4.490000000000000e-11 1.730000000000000e-11 3.090000000000000e-11 -1.800000000000000e-11 1.670000000000000e-10 -2.360000000000000e-11 7.139999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.120000000000000e+02 2.183229413375034e-01 -9.093891043347664e-01 1.745659285586194e-01 -3.080150755878994e-01 1.870000000000000e-10 2.220000000000000e-11 -3.840000000000000e-11 4.490000000000000e-11 1.730000000000000e-11 3.090000000000000e-11 -1.790000000000000e-11 1.670000000000000e-10 -2.360000000000000e-11 7.139999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.130000000000000e+02 2.182824145175236e-01 -9.094190059883994e-01 1.746453641446036e-01 -3.079104672502554e-01 1.870000000000000e-10 2.220000000000000e-11 -3.840000000000000e-11 4.490000000000000e-11 1.730000000000000e-11 3.090000000000000e-11 -1.790000000000000e-11 1.670000000000000e-10 -2.360000000000000e-11 7.139999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.140000000000000e+02 2.182418907014378e-01 -9.094488835218212e-01 1.747247857591377e-01 -3.078058716876565e-01 1.870000000000000e-10 2.220000000000000e-11 -3.840000000000000e-11 4.490000000000000e-11 1.730000000000000e-11 3.090000000000000e-11 -1.790000000000000e-11 1.670000000000000e-10 -2.360000000000000e-11 7.139999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.150000000000000e+02 2.182013697741260e-01 -9.094787368155478e-01 1.748041939353540e-01 -3.077012890640893e-01 1.870000000000000e-10 2.220000000000000e-11 -3.850000000000000e-11 4.490000000000000e-11 1.730000000000000e-11 3.090000000000000e-11 -1.790000000000000e-11 1.670000000000000e-10 -2.360000000000000e-11 7.139999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.160000000000000e+02 2.181608516231709e-01 -9.095085658092504e-01 1.748835892620452e-01 -3.075967193347119e-01 1.870000000000000e-10 2.220000000000000e-11 -3.850000000000000e-11 4.500000000000000e-11 1.730000000000000e-11 3.080000000000000e-11 -1.790000000000000e-11 1.670000000000000e-10 -2.360000000000000e-11 7.139999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.170000000000000e+02 2.181203361266777e-01 -9.095383704944475e-01 1.749629723683466e-01 -3.074921622843806e-01 1.870000000000000e-10 2.220000000000000e-11 -3.850000000000000e-11 4.500000000000000e-11 1.730000000000000e-11 3.080000000000000e-11 -1.790000000000000e-11 1.670000000000000e-10 -2.360000000000000e-11 7.139999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.180000000000000e+02 2.180798231473371e-01 -9.095681509058914e-01 1.750423439086247e-01 -3.073876175655729e-01 1.870000000000000e-10 2.220000000000000e-11 -3.860000000000000e-11 4.500000000000000e-11 1.730000000000000e-11 3.080000000000000e-11 -1.790000000000000e-11 1.670000000000000e-10 -2.360000000000000e-11 7.139999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.190000000000000e+02 2.180393125344187e-01 -9.095979071113059e-01 1.751217045477113e-01 -3.072830847354840e-01 1.870000000000000e-10 2.210000000000000e-11 -3.860000000000000e-11 4.500000000000000e-11 1.730000000000000e-11 3.080000000000000e-11 -1.790000000000000e-11 1.670000000000000e-10 -2.360000000000000e-11 7.139999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.200000000000000e+02 2.179988041268932e-01 -9.096276392023134e-01 1.752010549493006e-01 -3.071785632870930e-01 1.870000000000000e-10 2.210000000000000e-11 -3.860000000000000e-11 4.500000000000000e-11 1.730000000000000e-11 3.080000000000000e-11 -1.790000000000000e-11 1.670000000000000e-10 -2.360000000000000e-11 7.139999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.210000000000000e+02 2.179583309185672e-01 -9.096573363563061e-01 1.752803973888566e-01 -3.070740605905148e-01 1.870000000000000e-10 2.210000000000000e-11 -3.870000000000000e-11 4.510000000000000e-11 1.730000000000000e-11 3.080000000000000e-11 -1.780000000000000e-11 1.670000000000000e-10 -2.360000000000000e-11 7.130000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.220000000000000e+02 2.179178264412829e-01 -9.096870205434086e-01 1.753597292580436e-01 -3.069695602637316e-01 1.870000000000000e-10 2.210000000000000e-11 -3.870000000000000e-11 4.510000000000000e-11 1.720000000000000e-11 3.080000000000000e-11 -1.780000000000000e-11 1.670000000000000e-10 -2.360000000000000e-11 7.130000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.230000000000000e+02 2.178773237164017e-01 -9.097166809446092e-01 1.754390527850335e-01 -3.068650696628613e-01 1.870000000000000e-10 2.210000000000000e-11 -3.870000000000000e-11 4.510000000000000e-11 1.720000000000000e-11 3.080000000000000e-11 -1.780000000000000e-11 1.660000000000000e-10 -2.360000000000000e-11 7.130000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.240000000000000e+02 2.178368226343742e-01 -9.097463176637610e-01 1.755183685476988e-01 -3.067605882510685e-01 1.870000000000000e-10 2.210000000000000e-11 -3.870000000000000e-11 4.510000000000000e-11 1.720000000000000e-11 3.080000000000000e-11 -1.780000000000000e-11 1.660000000000000e-10 -2.360000000000000e-11 7.130000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.250000000000000e+02 2.177963231189962e-01 -9.097759307943918e-01 1.755976770879213e-01 -3.066561155176429e-01 1.870000000000000e-10 2.210000000000000e-11 -3.880000000000000e-11 4.510000000000000e-11 1.720000000000000e-11 3.080000000000000e-11 -1.780000000000000e-11 1.660000000000000e-10 -2.360000000000000e-11 7.130000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.260000000000000e+02 2.177558251307198e-01 -9.098055204182185e-01 1.756769789070850e-01 -3.065516509827569e-01 1.870000000000000e-10 2.200000000000000e-11 -3.880000000000000e-11 4.510000000000000e-11 1.720000000000000e-11 3.080000000000000e-11 -1.780000000000000e-11 1.660000000000000e-10 -2.360000000000000e-11 7.130000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.270000000000000e+02 2.177153286656720e-01 -9.098350866066860e-01 1.757562744619077e-01 -3.064471941961178e-01 1.870000000000000e-10 2.200000000000000e-11 -3.880000000000000e-11 4.520000000000000e-11 1.720000000000000e-11 3.080000000000000e-11 -1.780000000000000e-11 1.660000000000000e-10 -2.360000000000000e-11 7.130000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.280000000000000e+02 2.176748337540152e-01 -9.098646294228609e-01 1.758355641603455e-01 -3.063427447350024e-01 1.870000000000000e-10 2.200000000000000e-11 -3.890000000000000e-11 4.520000000000000e-11 1.720000000000000e-11 3.080000000000000e-11 -1.770000000000000e-11 1.660000000000000e-10 -2.360000000000000e-11 7.130000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.290000000000000e+02 2.176343404588909e-01 -9.098941489235323e-01 1.759148483573692e-01 -3.062383022013221e-01 1.870000000000000e-10 2.200000000000000e-11 -3.890000000000000e-11 4.520000000000000e-11 1.720000000000000e-11 3.080000000000000e-11 -1.770000000000000e-11 1.660000000000000e-10 -2.360000000000000e-11 7.130000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.300000000000000e+02 2.175938488729382e-01 -9.099236451620892e-01 1.759941273504324e-01 -3.061338662182886e-01 1.870000000000000e-10 2.200000000000000e-11 -3.890000000000000e-11 4.520000000000000e-11 1.720000000000000e-11 3.070000000000000e-11 -1.770000000000000e-11 1.660000000000000e-10 -2.360000000000000e-11 7.130000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.310000000000000e+02 2.175533966719647e-01 -9.099531058191375e-01 1.760734032673062e-01 -3.060294454271762e-01 1.870000000000000e-10 2.200000000000000e-11 -3.900000000000000e-11 4.520000000000000e-11 1.720000000000000e-11 3.070000000000000e-11 -1.770000000000000e-11 1.660000000000000e-10 -2.360000000000000e-11 7.120000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.320000000000000e+02 2.175129088728016e-01 -9.099825556956482e-01 1.761526725121108e-01 -3.059250214842686e-01 1.870000000000000e-10 2.200000000000000e-11 -3.900000000000000e-11 4.520000000000000e-11 1.720000000000000e-11 3.070000000000000e-11 -1.770000000000000e-11 1.660000000000000e-10 -2.360000000000000e-11 7.120000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.330000000000000e+02 2.174724231825521e-01 -9.100119824784821e-01 1.762319370846305e-01 -3.058206030536382e-01 1.870000000000000e-10 2.200000000000000e-11 -3.900000000000000e-11 4.530000000000000e-11 1.710000000000000e-11 3.070000000000000e-11 -1.770000000000000e-11 1.660000000000000e-10 -2.360000000000000e-11 7.120000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.340000000000000e+02 2.174319397503923e-01 -9.100413862326702e-01 1.763111970366545e-01 -3.057161898225277e-01 1.870000000000000e-10 2.200000000000000e-11 -3.900000000000000e-11 4.530000000000000e-11 1.710000000000000e-11 3.070000000000000e-11 -1.770000000000000e-11 1.660000000000000e-10 -2.360000000000000e-11 7.120000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.350000000000000e+02 2.173914587176851e-01 -9.100707670286665e-01 1.763904523557502e-01 -3.056117815042242e-01 1.870000000000000e-10 2.190000000000000e-11 -3.910000000000000e-11 4.530000000000000e-11 1.710000000000000e-11 3.070000000000000e-11 -1.770000000000000e-11 1.660000000000000e-10 -2.360000000000000e-11 7.120000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.360000000000000e+02 2.173509802071697e-01 -9.101001249426995e-01 1.764697029672214e-01 -3.055073778436879e-01 1.870000000000000e-10 2.190000000000000e-11 -3.910000000000000e-11 4.530000000000000e-11 1.710000000000000e-11 3.070000000000000e-11 -1.760000000000000e-11 1.660000000000000e-10 -2.360000000000000e-11 7.120000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.370000000000000e+02 2.173105043112678e-01 -9.101294600568106e-01 1.765489487366417e-01 -3.054029786244194e-01 1.870000000000000e-10 2.190000000000000e-11 -3.910000000000000e-11 4.530000000000000e-11 1.710000000000000e-11 3.070000000000000e-11 -1.760000000000000e-11 1.660000000000000e-10 -2.360000000000000e-11 7.120000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.380000000000000e+02 2.172700310835878e-01 -9.101587724578684e-01 1.766281894741904e-01 -3.052985836750521e-01 1.870000000000000e-10 2.190000000000000e-11 -3.920000000000000e-11 4.540000000000000e-11 1.710000000000000e-11 3.070000000000000e-11 -1.760000000000000e-11 1.660000000000000e-10 -2.360000000000000e-11 7.120000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.390000000000000e+02 2.172295605350784e-01 -9.101880622354965e-01 1.767074249416822e-01 -3.051941928743213e-01 1.870000000000000e-10 2.190000000000000e-11 -3.920000000000000e-11 4.540000000000000e-11 1.710000000000000e-11 3.070000000000000e-11 -1.760000000000000e-11 1.650000000000000e-10 -2.360000000000000e-11 7.120000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.400000000000000e+02 2.171890926344787e-01 -9.102173294799029e-01 1.767866548619069e-01 -3.050898061519315e-01 1.870000000000000e-10 2.190000000000000e-11 -3.920000000000000e-11 4.540000000000000e-11 1.710000000000000e-11 3.070000000000000e-11 -1.760000000000000e-11 1.650000000000000e-10 -2.360000000000000e-11 7.120000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.410000000000000e+02 2.171486606655229e-01 -9.102465632994049e-01 1.768658806530744e-01 -3.049854315104322e-01 1.870000000000000e-10 2.190000000000000e-11 -3.930000000000000e-11 4.540000000000000e-11 1.710000000000000e-11 3.070000000000000e-11 -1.760000000000000e-11 1.650000000000000e-10 -2.360000000000000e-11 7.110000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>3.420000000000000e+02 2.171081978263163e-01 -9.102757857396032e-01 1.769450985583689e-01 -3.048810529188828e-01 1.870000000000000e-10 2.190000000000000e-11 -3.930000000000000e-11 4.540000000000000e-11 1.710000000000000e-11 3.070000000000000e-11 -1.760000000000000e-11 1.650000000000000e-10 -2.360000000000000e-11 7.110000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>3.430000000000000e+02 2.170677373541053e-01 -9.103049858956359e-01 1.770243099838546e-01 -3.047766784520353e-01 1.870000000000000e-10 2.180000000000000e-11 -3.930000000000000e-11 4.540000000000000e-11 1.710000000000000e-11 3.070000000000000e-11 -1.760000000000000e-11 1.650000000000000e-10 -2.360000000000000e-11 7.110000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>3.440000000000000e+02 2.170272791317583e-01 -9.103341638353911e-01 1.771035146327541e-01 -3.046723081796432e-01 1.870000000000000e-10 2.180000000000000e-11 -3.930000000000000e-11 4.550000000000000e-11 1.700000000000000e-11 3.070000000000000e-11 -1.760000000000000e-11 1.650000000000000e-10 -2.360000000000000e-11 7.110000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>3.450000000000000e+02 2.169868230526116e-01 -9.103633196162755e-01 1.771827122376346e-01 -3.045679421785643e-01 1.870000000000000e-10 2.180000000000000e-11 -3.930000000000000e-11 4.550000000000000e-11 1.700000000000000e-11 3.070000000000000e-11 -1.750000000000000e-11 1.650000000000000e-10 -2.360000000000000e-11 7.110000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>3.460000000000000e+02 2.169463690312184e-01 -9.103924532858891e-01 1.772619025696176e-01 -3.044635805177204e-01 1.880000000000000e-10 2.180000000000000e-11 -3.940000000000000e-11 4.550000000000000e-11 1.700000000000000e-11 3.060000000000000e-11 -1.750000000000000e-11 1.650000000000000e-10 -2.360000000000000e-11 7.110000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>3.470000000000000e+02 2.169059170093831e-01 -9.104215648840243e-01 1.773410854442297e-01 -3.043592232443528e-01 1.880000000000000e-10 2.180000000000000e-11 -3.940000000000000e-11 4.550000000000000e-11 1.700000000000000e-11 3.060000000000000e-11 -1.750000000000000e-11 1.650000000000000e-10 -2.360000000000000e-11 7.110000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>3.480000000000000e+02 2.168654669575414e-01 -9.104506544465453e-01 1.774202607228874e-01 -3.042548703704966e-01 1.880000000000000e-10 2.180000000000000e-11 -3.940000000000000e-11 4.550000000000000e-11 1.700000000000000e-11 3.060000000000000e-11 -1.750000000000000e-11 1.650000000000000e-10 -2.360000000000000e-11 7.110000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>3.490000000000000e+02 2.168250188731149e-01 -9.104797220095192e-01 1.774994283088090e-01 -3.041505218640737e-01 1.880000000000000e-10 2.180000000000000e-11 -3.950000000000000e-11 4.550000000000000e-11 1.700000000000000e-11 3.060000000000000e-11 -1.750000000000000e-11 1.650000000000000e-10 -2.360000000000000e-11 7.110000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>3.500000000000000e+02 2.167845727754137e-01 -9.105087676149153e-01 1.775785881401927e-01 -3.040461776393281e-01 1.880000000000000e-10 2.180000000000000e-11 -3.950000000000000e-11 4.560000000000000e-11 1.700000000000000e-11 3.060000000000000e-11 -1.750000000000000e-11 1.650000000000000e-10 -2.360000000000000e-11 7.110000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>3.510000000000000e+02 2.167441623363327e-01 -9.105377802483298e-01 1.776577419629997e-01 -3.039418456780410e-01 1.880000000000000e-10 2.170000000000000e-11 -3.950000000000000e-11 4.560000000000000e-11 1.700000000000000e-11 3.060000000000000e-11 -1.750000000000000e-11 1.650000000000000e-10 -2.360000000000000e-11 7.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.520000000000000e+02 2.167037203130810e-01 -9.105667821183517e-01 1.777368861980951e-01 -3.038375095173496e-01 1.880000000000000e-10 2.170000000000000e-11 -3.960000000000000e-11 4.560000000000000e-11 1.700000000000000e-11 3.060000000000000e-11 -1.750000000000000e-11 1.650000000000000e-10 -2.360000000000000e-11 7.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.530000000000000e+02 2.166632803748638e-01 -9.105957622495946e-01 1.778160226108076e-01 -3.037331770043498e-01 1.880000000000000e-10 2.170000000000000e-11 -3.960000000000000e-11 4.560000000000000e-11 1.700000000000000e-11 3.060000000000000e-11 -1.740000000000000e-11 1.650000000000000e-10 -2.360000000000000e-11 7.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.540000000000000e+02 2.166228425361718e-01 -9.106247207613007e-01 1.778951511862917e-01 -3.036288477967112e-01 1.880000000000000e-10 2.170000000000000e-11 -3.960000000000000e-11 4.560000000000000e-11 1.700000000000000e-11 3.060000000000000e-11 -1.740000000000000e-11 1.650000000000000e-10 -2.360000000000000e-11 7.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.550000000000000e+02 2.165824067891789e-01 -9.106536577995543e-01 1.779742719013193e-01 -3.035245214919119e-01 1.880000000000000e-10 2.170000000000000e-11 -3.960000000000000e-11 4.560000000000000e-11 1.690000000000000e-11 3.060000000000000e-11 -1.740000000000000e-11 1.650000000000000e-10 -2.360000000000000e-11 7.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.560000000000000e+02 2.165419730966231e-01 -9.106825735375957e-01 1.780533847198659e-01 -3.034201976338463e-01 1.880000000000000e-10 2.170000000000000e-11 -3.970000000000000e-11 4.570000000000000e-11 1.690000000000000e-11 3.060000000000000e-11 -1.740000000000000e-11 1.640000000000000e-10 -2.360000000000000e-11 7.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.570000000000000e+02 2.165015413861694e-01 -9.107114681741025e-01 1.781324895933974e-01 -3.033158757217332e-01 1.880000000000000e-10 2.170000000000000e-11 -3.970000000000000e-11 4.570000000000000e-11 1.690000000000000e-11 3.060000000000000e-11 -1.740000000000000e-11 1.640000000000000e-10 -2.360000000000000e-11 7.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.580000000000000e+02 2.164611115460240e-01 -9.107403419302263e-01 1.782115864604446e-01 -3.032115552223004e-01 1.880000000000000e-10 2.170000000000000e-11 -3.970000000000000e-11 4.570000000000000e-11 1.690000000000000e-11 3.060000000000000e-11 -1.740000000000000e-11 1.640000000000000e-10 -2.360000000000000e-11 7.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.590000000000000e+02 2.164206834224635e-01 -9.107691950447356e-01 1.782906752480441e-01 -3.031072355852207e-01 1.880000000000000e-10 2.160000000000000e-11 -3.980000000000000e-11 4.570000000000000e-11 1.690000000000000e-11 3.060000000000000e-11 -1.740000000000000e-11 1.640000000000000e-10 -2.360000000000000e-11 7.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.600000000000000e+02 2.163802568171380e-01 -9.107980277691926e-01 1.783697558741395e-01 -3.030029162580762e-01 1.880000000000000e-10 2.160000000000000e-11 -3.980000000000000e-11 4.570000000000000e-11 1.690000000000000e-11 3.060000000000000e-11 -1.740000000000000e-11 1.640000000000000e-10 -2.360000000000000e-11 7.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.610000000000000e+02 2.163398657243938e-01 -9.108268291041610e-01 1.784488301082418e-01 -3.028986050073699e-01 1.880000000000000e-10 2.160000000000000e-11 -3.980000000000000e-11 4.580000000000000e-11 1.690000000000000e-11 3.050000000000000e-11 -1.730000000000000e-11 1.640000000000000e-10 -2.360000000000000e-11 7.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.620000000000000e+02 2.162994413843868e-01 -9.108556218273125e-01 1.785278941399967e-01 -3.027942847154158e-01 1.880000000000000e-10 2.160000000000000e-11 -3.980000000000000e-11 4.580000000000000e-11 1.690000000000000e-11 3.050000000000000e-11 -1.730000000000000e-11 1.640000000000000e-10 -2.360000000000000e-11 7.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.630000000000000e+02 2.162590177066572e-01 -9.108843949370709e-01 1.786069497225553e-01 -3.026899632156351e-01 1.880000000000000e-10 2.160000000000000e-11 -3.990000000000000e-11 4.580000000000000e-11 1.690000000000000e-11 3.050000000000000e-11 -1.730000000000000e-11 1.640000000000000e-10 -2.360000000000000e-11 7.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.640000000000000e+02 2.162185943276806e-01 -9.109131486835732e-01 1.786859967455111e-01 -3.025856400912039e-01 1.880000000000000e-10 2.160000000000000e-11 -3.990000000000000e-11 4.580000000000000e-11 1.690000000000000e-11 3.050000000000000e-11 -1.730000000000000e-11 1.640000000000000e-10 -2.360000000000000e-11 7.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.650000000000000e+02 2.161781708553064e-01 -9.109418833061852e-01 1.787650350869194e-01 -3.024813149842599e-01 1.880000000000000e-10 2.160000000000000e-11 -3.990000000000000e-11 4.580000000000000e-11 1.690000000000000e-11 3.050000000000000e-11 -1.730000000000000e-11 1.640000000000000e-10 -2.360000000000000e-11 7.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.660000000000000e+02 2.161377468757480e-01 -9.109705990315995e-01 1.788440646120605e-01 -3.023769875974714e-01 1.880000000000000e-10 2.160000000000000e-11 -4.000000000000000e-11 4.590000000000000e-11 1.680000000000000e-11 3.050000000000000e-11 -1.730000000000000e-11 1.640000000000000e-10 -2.360000000000000e-11 7.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.670000000000000e+02 2.160973219620285e-01 -9.109992960730345e-01 1.789230851715730e-01 -3.022726576916295e-01 1.880000000000000e-10 2.150000000000000e-11 -4.000000000000000e-11 4.590000000000000e-11 1.680000000000000e-11 3.050000000000000e-11 -1.730000000000000e-11 1.640000000000000e-10 -2.360000000000000e-11 7.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.680000000000000e+02 2.160568956821439e-01 -9.110279746304546e-01 1.790020966013879e-01 -3.021683250793081e-01 1.880000000000000e-10 2.150000000000000e-11 -4.000000000000000e-11 4.590000000000000e-11 1.680000000000000e-11 3.050000000000000e-11 -1.730000000000000e-11 1.640000000000000e-10 -2.360000000000000e-11 7.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.690000000000000e+02 2.160164676062664e-01 -9.110566348916899e-01 1.790810987249911e-01 -3.020639896150996e-01 1.880000000000000e-10 2.150000000000000e-11 -4.000000000000000e-11 4.590000000000000e-11 1.680000000000000e-11 3.050000000000000e-11 -1.730000000000000e-11 1.640000000000000e-10 -2.360000000000000e-11 7.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.700000000000000e+02 2.159760373124623e-01 -9.110852770340511e-01 1.791600913570709e-01 -3.019596511845887e-01 1.880000000000000e-10 2.150000000000000e-11 -4.010000000000000e-11 4.590000000000000e-11 1.680000000000000e-11 3.050000000000000e-11 -1.730000000000000e-11 1.640000000000000e-10 -2.360000000000000e-11 7.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.710000000000000e+02 2.159356380495989e-01 -9.111138901650111e-01 1.792390761847360e-01 -3.018553178874525e-01 1.880000000000000e-10 2.150000000000000e-11 -4.010000000000000e-11 4.590000000000000e-11 1.680000000000000e-11 3.050000000000000e-11 -1.720000000000000e-11 1.640000000000000e-10 -2.360000000000000e-11 7.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.720000000000000e+02 2.158952021105797e-01 -9.111424965682120e-01 1.793180492906146e-01 -3.017509732406616e-01 1.880000000000000e-10 2.150000000000000e-11 -4.010000000000000e-11 4.600000000000000e-11 1.680000000000000e-11 3.050000000000000e-11 -1.720000000000000e-11 1.630000000000000e-10 -2.360000000000000e-11 7.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.730000000000000e+02 2.158547627772681e-01 -9.111710853355596e-01 1.793970123898314e-01 -3.016466253422878e-01 1.880000000000000e-10 2.150000000000000e-11 -4.010000000000000e-11 4.600000000000000e-11 1.680000000000000e-11 3.050000000000000e-11 -1.720000000000000e-11 1.630000000000000e-10 -2.360000000000000e-11 7.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.740000000000000e+02 2.158143196918478e-01 -9.111996566144281e-01 1.794759653604341e-01 -3.015422740838064e-01 1.880000000000000e-10 2.150000000000000e-11 -4.020000000000000e-11 4.600000000000000e-11 1.680000000000000e-11 3.050000000000000e-11 -1.720000000000000e-11 1.630000000000000e-10 -2.360000000000000e-11 7.080000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.750000000000000e+02 2.157738725147198e-01 -9.112282105444959e-01 1.795549081224838e-01 -3.014379193416178e-01 1.880000000000000e-10 2.150000000000000e-11 -4.020000000000000e-11 4.600000000000000e-11 1.680000000000000e-11 3.050000000000000e-11 -1.720000000000000e-11 1.630000000000000e-10 -2.360000000000000e-11 7.080000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.760000000000000e+02 2.157334209235156e-01 -9.112567472567632e-01 1.796338406446092e-01 -3.013335609767496e-01 1.880000000000000e-10 2.140000000000000e-11 -4.020000000000000e-11 4.600000000000000e-11 1.680000000000000e-11 3.050000000000000e-11 -1.720000000000000e-11 1.630000000000000e-10 -2.360000000000000e-11 7.080000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.770000000000000e+02 2.156929646123120e-01 -9.112852668716376e-01 1.797127629480714e-01 -3.012291988387091e-01 1.880000000000000e-10 2.140000000000000e-11 -4.030000000000000e-11 4.600000000000000e-11 1.670000000000000e-11 3.050000000000000e-11 -1.720000000000000e-11 1.630000000000000e-10 -2.360000000000000e-11 7.080000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.780000000000000e+02 2.156525032910667e-01 -9.113137694972642e-01 1.797916751044323e-01 -3.011248327722675e-01 1.880000000000000e-10 2.140000000000000e-11 -4.030000000000000e-11 4.610000000000000e-11 1.670000000000000e-11 3.050000000000000e-11 -1.720000000000000e-11 1.630000000000000e-10 -2.360000000000000e-11 7.080000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.790000000000000e+02 2.156120366850946e-01 -9.113422552281745e-01 1.798705772268759e-01 -3.010204626270460e-01 1.880000000000000e-10 2.140000000000000e-11 -4.030000000000000e-11 4.610000000000000e-11 1.670000000000000e-11 3.040000000000000e-11 -1.710000000000000e-11 1.630000000000000e-10 -2.360000000000000e-11 7.080000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.800000000000000e+02 2.155715645344290e-01 -9.113707241439025e-01 1.799494694590829e-01 -3.009160882687926e-01 1.880000000000000e-10 2.140000000000000e-11 -4.030000000000000e-11 4.610000000000000e-11 1.670000000000000e-11 3.040000000000000e-11 -1.710000000000000e-11 1.630000000000000e-10 -2.360000000000000e-11 7.080000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.810000000000000e+02 2.155311215691209e-01 -9.113991648209151e-01 1.800283539534974e-01 -3.008117181422452e-01 1.880000000000000e-10 2.140000000000000e-11 -4.040000000000000e-11 4.610000000000000e-11 1.670000000000000e-11 3.040000000000000e-11 -1.710000000000000e-11 1.630000000000000e-10 -2.360000000000000e-11 7.080000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.820000000000000e+02 2.154906376138305e-01 -9.114276002814898e-01 1.801072268887756e-01 -3.007073350757256e-01 1.880000000000000e-10 2.140000000000000e-11 -4.040000000000000e-11 4.610000000000000e-11 1.670000000000000e-11 3.040000000000000e-11 -1.710000000000000e-11 1.630000000000000e-10 -2.360000000000000e-11 7.080000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.830000000000000e+02 2.154501474373766e-01 -9.114560190687157e-01 1.801860903999001e-01 -3.006029475887106e-01 1.880000000000000e-10 2.130000000000000e-11 -4.040000000000000e-11 4.610000000000000e-11 1.670000000000000e-11 3.040000000000000e-11 -1.710000000000000e-11 1.630000000000000e-10 -2.360000000000000e-11 7.080000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.840000000000000e+02 2.154096508568382e-01 -9.114844211964777e-01 1.802649446058164e-01 -3.004985557038822e-01 1.890000000000000e-10 2.130000000000000e-11 -4.040000000000000e-11 4.620000000000000e-11 1.670000000000000e-11 3.040000000000000e-11 -1.710000000000000e-11 1.630000000000000e-10 -2.360000000000000e-11 7.080000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.850000000000000e+02 2.153691477199001e-01 -9.115128066605271e-01 1.803437895901500e-01 -3.003941594980102e-01 1.890000000000000e-10 2.130000000000000e-11 -4.050000000000000e-11 4.620000000000000e-11 1.670000000000000e-11 3.040000000000000e-11 -1.710000000000000e-11 1.630000000000000e-10 -2.360000000000000e-11 7.080000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.860000000000000e+02 2.153286379102649e-01 -9.115411754382022e-01 1.804226253974313e-01 -3.002897591013535e-01 1.890000000000000e-10 2.130000000000000e-11 -4.050000000000000e-11 4.620000000000000e-11 1.670000000000000e-11 3.040000000000000e-11 -1.710000000000000e-11 1.630000000000000e-10 -2.360000000000000e-11 7.070000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.870000000000000e+02 2.152881213546416e-01 -9.115695274870989e-01 1.805014520345464e-01 -3.001853546959891e-01 1.890000000000000e-10 2.130000000000000e-11 -4.050000000000000e-11 4.620000000000000e-11 1.670000000000000e-11 3.040000000000000e-11 -1.710000000000000e-11 1.630000000000000e-10 -2.360000000000000e-11 7.070000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.880000000000000e+02 2.152475980285121e-01 -9.115978627440556e-01 1.805802694758064e-01 -3.000809465118889e-01 1.890000000000000e-10 2.130000000000000e-11 -4.060000000000000e-11 4.620000000000000e-11 1.670000000000000e-11 3.040000000000000e-11 -1.700000000000000e-11 1.630000000000000e-10 -2.360000000000000e-11 7.070000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.890000000000000e+02 2.152070679610745e-01 -9.116261811245339e-01 1.806590776710576e-01 -2.999765348205404e-01 1.890000000000000e-10 2.130000000000000e-11 -4.060000000000000e-11 4.620000000000000e-11 1.670000000000000e-11 3.040000000000000e-11 -1.700000000000000e-11 1.630000000000000e-10 -2.360000000000000e-11 7.070000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.900000000000000e+02 2.151665312374387e-01 -9.116544825223736e-01 1.807378765548228e-01 -2.998721199287543e-01 1.890000000000000e-10 2.130000000000000e-11 -4.060000000000000e-11 4.630000000000000e-11 1.660000000000000e-11 3.040000000000000e-11 -1.700000000000000e-11 1.630000000000000e-10 -2.360000000000000e-11 7.070000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.910000000000000e+02 2.151260187495662e-01 -9.116827567161417e-01 1.808166678498101e-01 -2.997677097205587e-01 1.890000000000000e-10 2.120000000000000e-11 -4.070000000000000e-11 4.630000000000000e-11 1.660000000000000e-11 3.040000000000000e-11 -1.700000000000000e-11 1.620000000000000e-10 -2.360000000000000e-11 7.070000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.920000000000000e+02 2.150854691915414e-01 -9.117110237475623e-01 1.808954479074705e-01 -2.996632894536504e-01 1.890000000000000e-10 2.120000000000000e-11 -4.070000000000000e-11 4.630000000000000e-11 1.660000000000000e-11 3.040000000000000e-11 -1.700000000000000e-11 1.620000000000000e-10 -2.360000000000000e-11 7.070000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.930000000000000e+02 2.150449135563752e-01 -9.117392733555317e-01 1.809742184660836e-01 -2.995588670449406e-01 1.890000000000000e-10 2.120000000000000e-11 -4.070000000000000e-11 4.630000000000000e-11 1.660000000000000e-11 3.040000000000000e-11 -1.700000000000000e-11 1.620000000000000e-10 -2.360000000000000e-11 7.070000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.940000000000000e+02 2.150043521262560e-01 -9.117675053600933e-01 1.810529794902979e-01 -2.994544428688393e-01 1.890000000000000e-10 2.120000000000000e-11 -4.070000000000000e-11 4.630000000000000e-11 1.660000000000000e-11 3.040000000000000e-11 -1.700000000000000e-11 1.620000000000000e-10 -2.360000000000000e-11 7.070000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.950000000000000e+02 2.149637852159065e-01 -9.117957195701204e-01 1.811317309641906e-01 -2.993500172994351e-01 1.890000000000000e-10 2.120000000000000e-11 -4.070000000000000e-11 4.630000000000000e-11 1.660000000000000e-11 3.040000000000000e-11 -1.700000000000000e-11 1.620000000000000e-10 -2.360000000000000e-11 7.070000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.960000000000000e+02 2.149232131630979e-01 -9.118239157873579e-01 1.812104728913868e-01 -2.992455907049240e-01 1.890000000000000e-10 2.120000000000000e-11 -4.080000000000000e-11 4.640000000000000e-11 1.660000000000000e-11 3.030000000000000e-11 -1.690000000000000e-11 1.620000000000000e-10 -2.360000000000000e-11 7.070000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.970000000000000e+02 2.148826363201363e-01 -9.118520938105252e-01 1.812892052935981e-01 -2.991411634420865e-01 1.890000000000000e-10 2.120000000000000e-11 -4.080000000000000e-11 4.640000000000000e-11 1.660000000000000e-11 3.030000000000000e-11 -1.690000000000000e-11 1.620000000000000e-10 -2.360000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.980000000000000e+02 2.148420550464780e-01 -9.118802534387060e-01 1.813679282067696e-01 -2.990367358535599e-01 1.890000000000000e-10 2.120000000000000e-11 -4.080000000000000e-11 4.640000000000000e-11 1.660000000000000e-11 3.030000000000000e-11 -1.690000000000000e-11 1.620000000000000e-10 -2.360000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.990000000000000e+02 2.148014697031842e-01 -9.119083944746404e-01 1.814466416737507e-01 -2.989323082661913e-01 1.890000000000000e-10 2.120000000000000e-11 -4.080000000000000e-11 4.640000000000000e-11 1.660000000000000e-11 3.030000000000000e-11 -1.690000000000000e-11 1.620000000000000e-10 -2.360000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.000000000000000e+02 2.147608806477787e-01 -9.119365167268884e-01 1.815253457376655e-01 -2.988278809921210e-01 1.890000000000000e-10 2.110000000000000e-11 -4.090000000000000e-11 4.640000000000000e-11 1.660000000000000e-11 3.030000000000000e-11 -1.690000000000000e-11 1.620000000000000e-10 -2.360000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.010000000000000e+02 2.147203302451869e-01 -9.119646062283709e-01 1.816040429404275e-01 -2.987234646856888e-01 1.890000000000000e-10 2.110000000000000e-11 -4.090000000000000e-11 4.650000000000000e-11 1.650000000000000e-11 3.030000000000000e-11 -1.690000000000000e-11 1.620000000000000e-10 -2.360000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.020000000000000e+02 2.146797348145186e-01 -9.119926903687600e-01 1.816827282959747e-01 -2.986190389322995e-01 1.890000000000000e-10 2.110000000000000e-11 -4.090000000000000e-11 4.650000000000000e-11 1.650000000000000e-11 3.030000000000000e-11 -1.690000000000000e-11 1.620000000000000e-10 -2.360000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.030000000000000e+02 2.146391367041284e-01 -9.120207551949994e-01 1.817614043081148e-01 -2.985146143698695e-01 1.890000000000000e-10 2.110000000000000e-11 -4.100000000000000e-11 4.650000000000000e-11 1.650000000000000e-11 3.030000000000000e-11 -1.690000000000000e-11 1.620000000000000e-10 -2.360000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.040000000000000e+02 2.145985362382892e-01 -9.120488005454360e-01 1.818400709540139e-01 -2.984101912861803e-01 1.890000000000000e-10 2.110000000000000e-11 -4.100000000000000e-11 4.650000000000000e-11 1.650000000000000e-11 3.030000000000000e-11 -1.690000000000000e-11 1.620000000000000e-10 -2.360000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.050000000000000e+02 2.145579337306491e-01 -9.120768262650355e-01 1.819187281837091e-01 -2.983057699736238e-01 1.890000000000000e-10 2.110000000000000e-11 -4.100000000000000e-11 4.650000000000000e-11 1.650000000000000e-11 3.030000000000000e-11 -1.690000000000000e-11 1.620000000000000e-10 -2.360000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.060000000000000e+02 2.145173294825937e-01 -9.121048322050187e-01 1.819973759219210e-01 -2.982013507304190e-01 1.890000000000000e-10 2.110000000000000e-11 -4.100000000000000e-11 4.650000000000000e-11 1.650000000000000e-11 3.030000000000000e-11 -1.680000000000000e-11 1.620000000000000e-10 -2.360000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.070000000000000e+02 2.144767237804532e-01 -9.121328182233250e-01 1.820760140733436e-01 -2.980969338580012e-01 1.890000000000000e-10 2.110000000000000e-11 -4.110000000000000e-11 4.660000000000000e-11 1.650000000000000e-11 3.030000000000000e-11 -1.680000000000000e-11 1.620000000000000e-10 -2.360000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.080000000000000e+02 2.144361168934635e-01 -9.121607841846419e-01 1.821546425288389e-01 -2.979925196586369e-01 1.890000000000000e-10 2.100000000000000e-11 -4.110000000000000e-11 4.660000000000000e-11 1.650000000000000e-11 3.030000000000000e-11 -1.680000000000000e-11 1.610000000000000e-10 -2.360000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.090000000000000e+02 2.143955090710365e-01 -9.121887299613245e-01 1.822332611745966e-01 -2.978881084289678e-01 1.890000000000000e-10 2.100000000000000e-11 -4.110000000000000e-11 4.660000000000000e-11 1.650000000000000e-11 3.030000000000000e-11 -1.680000000000000e-11 1.610000000000000e-10 -2.360000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.100000000000000e+02 2.143549005399750e-01 -9.122166554343584e-01 1.823118699007181e-01 -2.977837004537935e-01 1.890000000000000e-10 2.100000000000000e-11 -4.110000000000000e-11 4.660000000000000e-11 1.650000000000000e-11 3.030000000000000e-11 -1.680000000000000e-11 1.610000000000000e-10 -2.360000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.110000000000000e+02 2.143143221097160e-01 -9.122445504590905e-01 1.823904704764568e-01 -2.976793035730264e-01 1.890000000000000e-10 2.100000000000000e-11 -4.120000000000000e-11 4.660000000000000e-11 1.650000000000000e-11 3.030000000000000e-11 -1.680000000000000e-11 1.610000000000000e-10 -2.360000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.120000000000000e+02 2.142737127420025e-01 -9.122724350067698e-01 1.824690590942859e-01 -2.975749028863535e-01 1.890000000000000e-10 2.100000000000000e-11 -4.120000000000000e-11 4.660000000000000e-11 1.650000000000000e-11 3.030000000000000e-11 -1.680000000000000e-11 1.610000000000000e-10 -2.360000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.130000000000000e+02 2.142331031928296e-01 -9.123002989525865e-01 1.825476375633389e-01 -2.974705061807574e-01 1.890000000000000e-10 2.100000000000000e-11 -4.120000000000000e-11 4.660000000000000e-11 1.650000000000000e-11 3.030000000000000e-11 -1.680000000000000e-11 1.610000000000000e-10 -2.360000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.140000000000000e+02 2.141924935847028e-01 -9.123281422180822e-01 1.826262058504056e-01 -2.973661136470582e-01 1.890000000000000e-10 2.100000000000000e-11 -4.120000000000000e-11 4.670000000000000e-11 1.640000000000000e-11 3.030000000000000e-11 -1.680000000000000e-11 1.610000000000000e-10 -2.360000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.150000000000000e+02 2.141518840163105e-01 -9.123559647346818e-01 1.827047639405996e-01 -2.972617254520376e-01 1.890000000000000e-10 2.100000000000000e-11 -4.130000000000000e-11 4.670000000000000e-11 1.640000000000000e-11 3.030000000000000e-11 -1.670000000000000e-11 1.610000000000000e-10 -2.360000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.160000000000000e+02 2.141112745661899e-01 -9.123837664432296e-01 1.827833118314676e-01 -2.971573417407493e-01 1.890000000000000e-10 2.090000000000000e-11 -4.130000000000000e-11 4.670000000000000e-11 1.640000000000000e-11 3.030000000000000e-11 -1.670000000000000e-11 1.610000000000000e-10 -2.360000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.170000000000000e+02 2.140706652949507e-01 -9.124115472937915e-01 1.828618495267000e-01 -2.970529626393271e-01 1.890000000000000e-10 2.090000000000000e-11 -4.130000000000000e-11 4.670000000000000e-11 1.640000000000000e-11 3.020000000000000e-11 -1.670000000000000e-11 1.610000000000000e-10 -2.360000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.180000000000000e+02 2.140300562481309e-01 -9.124393072459083e-01 1.829403770307945e-01 -2.969485882553741e-01 1.890000000000000e-10 2.090000000000000e-11 -4.140000000000000e-11 4.670000000000000e-11 1.640000000000000e-11 3.020000000000000e-11 -1.670000000000000e-11 1.610000000000000e-10 -2.360000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.190000000000000e+02 2.139894474579803e-01 -9.124670462689096e-01 1.830188943447575e-01 -2.968442186783208e-01 1.890000000000000e-10 2.090000000000000e-11 -4.140000000000000e-11 4.670000000000000e-11 1.640000000000000e-11 3.020000000000000e-11 -1.670000000000000e-11 1.610000000000000e-10 -2.360000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.200000000000000e+02 2.139488389421184e-01 -9.124947643435051e-01 1.830974014655919e-01 -2.967398539757658e-01 1.890000000000000e-10 2.090000000000000e-11 -4.140000000000000e-11 4.680000000000000e-11 1.640000000000000e-11 3.020000000000000e-11 -1.670000000000000e-11 1.610000000000000e-10 -2.360000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.210000000000000e+02 2.139082628463446e-01 -9.125224509300776e-01 1.831759003937811e-01 -2.966355021732076e-01 1.890000000000000e-10 2.090000000000000e-11 -4.140000000000000e-11 4.680000000000000e-11 1.640000000000000e-11 3.020000000000000e-11 -1.670000000000000e-11 1.610000000000000e-10 -2.360000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.220000000000000e+02 2.138676548603585e-01 -9.125501271042262e-01 1.832543871298031e-01 -2.965311473087975e-01 1.890000000000000e-10 2.090000000000000e-11 -4.150000000000000e-11 4.680000000000000e-11 1.640000000000000e-11 3.020000000000000e-11 -1.670000000000000e-11 1.610000000000000e-10 -2.360000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.230000000000000e+02 2.138270470784839e-01 -9.125777823561128e-01 1.833328636960949e-01 -2.964267973322997e-01 1.900000000000000e-10 2.090000000000000e-11 -4.150000000000000e-11 4.680000000000000e-11 1.640000000000000e-11 3.020000000000000e-11 -1.670000000000000e-11 1.610000000000000e-10 -2.360000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.240000000000000e+02 2.137864394134291e-01 -9.126054167272981e-01 1.834113301416488e-01 -2.963224521675566e-01 1.900000000000000e-10 2.090000000000000e-11 -4.150000000000000e-11 4.680000000000000e-11 1.640000000000000e-11 3.020000000000000e-11 -1.670000000000000e-11 1.610000000000000e-10 -2.360000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.250000000000000e+02 2.137458317362290e-01 -9.126330302757859e-01 1.834897865522606e-01 -2.962181116947953e-01 1.900000000000000e-10 2.080000000000000e-11 -4.150000000000000e-11 4.680000000000000e-11 1.640000000000000e-11 3.020000000000000e-11 -1.660000000000000e-11 1.610000000000000e-10 -2.360000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.260000000000000e+02 2.137052238726536e-01 -9.126606230744346e-01 1.835682330571135e-01 -2.961137757538698e-01 1.900000000000000e-10 2.080000000000000e-11 -4.160000000000000e-11 4.690000000000000e-11 1.630000000000000e-11 3.020000000000000e-11 -1.660000000000000e-11 1.600000000000000e-10 -2.360000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.270000000000000e+02 2.136646156019474e-01 -9.126881952085992e-01 1.836466698324114e-01 -2.960094441500256e-01 1.900000000000000e-10 2.080000000000000e-11 -4.160000000000000e-11 4.690000000000000e-11 1.630000000000000e-11 3.020000000000000e-11 -1.660000000000000e-11 1.600000000000000e-10 -2.360000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.280000000000000e+02 2.136240066622251e-01 -9.127157467725725e-01 1.837250970988370e-01 -2.959051166623953e-01 1.900000000000000e-10 2.080000000000000e-11 -4.160000000000000e-11 4.690000000000000e-11 1.630000000000000e-11 3.020000000000000e-11 -1.660000000000000e-11 1.600000000000000e-10 -2.360000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.290000000000000e+02 2.135833967615262e-01 -9.127432778647369e-01 1.838035151124351e-01 -2.958007930565046e-01 1.900000000000000e-10 2.080000000000000e-11 -4.160000000000000e-11 4.690000000000000e-11 1.630000000000000e-11 3.020000000000000e-11 -1.660000000000000e-11 1.600000000000000e-10 -2.360000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.300000000000000e+02 2.135427855917116e-01 -9.127707885836752e-01 1.838819241530242e-01 -2.956964730933555e-01 1.900000000000000e-10 2.080000000000000e-11 -4.160000000000000e-11 4.690000000000000e-11 1.630000000000000e-11 3.020000000000000e-11 -1.660000000000000e-11 1.600000000000000e-10 -2.360000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.310000000000000e+02 2.135022062382492e-01 -9.127982680886525e-01 1.839603266345856e-01 -2.955921648661431e-01 1.900000000000000e-10 2.080000000000000e-11 -4.170000000000000e-11 4.690000000000000e-11 1.630000000000000e-11 3.020000000000000e-11 -1.660000000000000e-11 1.600000000000000e-10 -2.360000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.320000000000000e+02 2.134615916348458e-01 -9.128257383379647e-01 1.840387185905960e-01 -2.954878514998542e-01 1.900000000000000e-10 2.080000000000000e-11 -4.170000000000000e-11 4.700000000000000e-11 1.630000000000000e-11 3.020000000000000e-11 -1.660000000000000e-11 1.600000000000000e-10 -2.360000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.330000000000000e+02 2.134209749310924e-01 -9.128531884757674e-01 1.841171024015930e-01 -2.953835410992435e-01 1.900000000000000e-10 2.070000000000000e-11 -4.170000000000000e-11 4.700000000000000e-11 1.630000000000000e-11 3.020000000000000e-11 -1.660000000000000e-11 1.600000000000000e-10 -2.360000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.340000000000000e+02 2.133803559420676e-01 -9.128806185721233e-01 1.841954782915670e-01 -2.952792334559864e-01 1.900000000000000e-10 2.070000000000000e-11 -4.180000000000000e-11 4.700000000000000e-11 1.630000000000000e-11 3.020000000000000e-11 -1.650000000000000e-11 1.600000000000000e-10 -2.360000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.350000000000000e+02 2.133397345538799e-01 -9.129080286876924e-01 1.842738464420637e-01 -2.951749283653315e-01 1.900000000000000e-10 2.070000000000000e-11 -4.180000000000000e-11 4.700000000000000e-11 1.630000000000000e-11 3.020000000000000e-11 -1.650000000000000e-11 1.600000000000000e-10 -2.360000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.360000000000000e+02 2.132991107299178e-01 -9.129354188747623e-01 1.843522069909684e-01 -2.950706256192706e-01 1.900000000000000e-10 2.070000000000000e-11 -4.180000000000000e-11 4.700000000000000e-11 1.630000000000000e-11 3.020000000000000e-11 -1.650000000000000e-11 1.600000000000000e-10 -2.360000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.370000000000000e+02 2.132584845118135e-01 -9.129627891785964e-01 1.844305600352059e-01 -2.949663250000966e-01 1.900000000000000e-10 2.070000000000000e-11 -4.180000000000000e-11 4.700000000000000e-11 1.630000000000000e-11 3.020000000000000e-11 -1.650000000000000e-11 1.600000000000000e-10 -2.360000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.380000000000000e+02 2.132178560129392e-01 -9.129901396383477e-01 1.845089056387653e-01 -2.948620262773445e-01 1.900000000000000e-10 2.070000000000000e-11 -4.190000000000000e-11 4.710000000000000e-11 1.630000000000000e-11 3.020000000000000e-11 -1.650000000000000e-11 1.600000000000000e-10 -2.360000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.390000000000000e+02 2.131772254078527e-01 -9.130174702876632e-01 1.845872438423668e-01 -2.947577292075723e-01 1.900000000000000e-10 2.070000000000000e-11 -4.190000000000000e-11 4.710000000000000e-11 1.620000000000000e-11 3.020000000000000e-11 -1.650000000000000e-11 1.600000000000000e-10 -2.360000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.400000000000000e+02 2.131365929167681e-01 -9.130447811546988e-01 1.846655746735108e-01 -2.946534335393058e-01 1.900000000000000e-10 2.070000000000000e-11 -4.190000000000000e-11 4.710000000000000e-11 1.620000000000000e-11 3.020000000000000e-11 -1.650000000000000e-11 1.600000000000000e-10 -2.360000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>4.410000000000000e+02 2.130959958218327e-01 -9.130720601406312e-01 1.847439005630707e-01 -2.945491482927547e-01 1.900000000000000e-10 2.060000000000000e-11 -4.190000000000000e-11 4.710000000000000e-11 1.620000000000000e-11 3.010000000000000e-11 -1.650000000000000e-11 1.600000000000000e-10 -2.360000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>4.420000000000000e+02 2.130553603175974e-01 -9.130993315050986e-01 1.848222167248805e-01 -2.944448546838311e-01 1.900000000000000e-10 2.060000000000000e-11 -4.200000000000000e-11 4.710000000000000e-11 1.620000000000000e-11 3.010000000000000e-11 -1.650000000000000e-11 1.600000000000000e-10 -2.360000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>4.430000000000000e+02 2.130147236906870e-01 -9.131265831330676e-01 1.849005255909141e-01 -2.943405617697176e-01 1.900000000000000e-10 2.060000000000000e-11 -4.200000000000000e-11 4.710000000000000e-11 1.620000000000000e-11 3.010000000000000e-11 -1.650000000000000e-11 1.600000000000000e-10 -2.360000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>4.440000000000000e+02 2.129740861774179e-01 -9.131538150247405e-01 1.849788271854042e-01 -2.942362693750867e-01 1.900000000000000e-10 2.060000000000000e-11 -4.200000000000000e-11 4.710000000000000e-11 1.620000000000000e-11 3.010000000000000e-11 -1.640000000000000e-11 1.600000000000000e-10 -2.360000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>4.450000000000000e+02 2.129334479887373e-01 -9.131810271719604e-01 1.850571215193142e-01 -2.941319773771240e-01 1.900000000000000e-10 2.060000000000000e-11 -4.200000000000000e-11 4.720000000000000e-11 1.620000000000000e-11 3.010000000000000e-11 -1.640000000000000e-11 1.600000000000000e-10 -2.360000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>4.460000000000000e+02 2.128928093062224e-01 -9.132082195591096e-01 1.851354085787164e-01 -2.940276857130595e-01 1.900000000000000e-10 2.060000000000000e-11 -4.210000000000000e-11 4.720000000000000e-11 1.620000000000000e-11 3.010000000000000e-11 -1.640000000000000e-11 1.590000000000000e-10 -2.360000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>4.470000000000000e+02 2.128521702817279e-01 -9.132353921645868e-01 1.852136883119308e-01 -2.939233943840514e-01 1.900000000000000e-10 2.060000000000000e-11 -4.210000000000000e-11 4.720000000000000e-11 1.620000000000000e-11 3.010000000000000e-11 -1.640000000000000e-11 1.590000000000000e-10 -2.360000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>4.480000000000000e+02 2.128115310418726e-01 -9.132625449633127e-01 1.852919606184164e-01 -2.938191034513088e-01 1.900000000000000e-10 2.060000000000000e-11 -4.210000000000000e-11 4.720000000000000e-11 1.620000000000000e-11 3.010000000000000e-11 -1.640000000000000e-11 1.590000000000000e-10 -2.360000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>4.490000000000000e+02 2.127708916947870e-01 -9.132896779290858e-01 1.853702253416998e-01 -2.937148130284877e-01 1.900000000000000e-10 2.060000000000000e-11 -4.210000000000000e-11 4.720000000000000e-11 1.620000000000000e-11 3.010000000000000e-11 -1.640000000000000e-11 1.590000000000000e-10 -2.360000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>4.500000000000000e+02 2.127302523376192e-01 -9.133167910370320e-01 1.854484822686873e-01 -2.936105232692313e-01 1.900000000000000e-10 2.060000000000000e-11 -4.210000000000000e-11 4.720000000000000e-11 1.620000000000000e-11 3.010000000000000e-11 -1.640000000000000e-11 1.590000000000000e-10 -2.360000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>4.510000000000000e+02 2.126896465990910e-01 -9.133438732963082e-01 1.855267333612420e-01 -2.935062427785108e-01 1.900000000000000e-10 2.050000000000000e-11 -4.220000000000000e-11 4.730000000000000e-11 1.620000000000000e-11 3.010000000000000e-11 -1.640000000000000e-11 1.590000000000000e-10 -2.360000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>4.520000000000000e+02 2.126490074993357e-01 -9.133709466331422e-01 1.856049738741958e-01 -2.934019548830313e-01 1.900000000000000e-10 2.050000000000000e-11 -4.220000000000000e-11 4.730000000000000e-11 1.610000000000000e-11 3.010000000000000e-11 -1.640000000000000e-11 1.590000000000000e-10 -2.360000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>4.530000000000000e+02 2.126083686672195e-01 -9.133980000692656e-01 1.856832057127334e-01 -2.932976681775228e-01 1.900000000000000e-10 2.050000000000000e-11 -4.220000000000000e-11 4.730000000000000e-11 1.610000000000000e-11 3.010000000000000e-11 -1.630000000000000e-11 1.590000000000000e-10 -2.360000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>4.540000000000000e+02 2.125677301930212e-01 -9.134250336051886e-01 1.857614285652939e-01 -2.931933828061751e-01 1.900000000000000e-10 2.050000000000000e-11 -4.230000000000000e-11 4.730000000000000e-11 1.610000000000000e-11 3.010000000000000e-11 -1.630000000000000e-11 1.590000000000000e-10 -2.360000000000000e-11 7.020000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.550000000000000e+02 2.125270921601258e-01 -9.134520472483028e-01 1.858396421484255e-01 -2.930890988794891e-01 1.900000000000000e-10 2.050000000000000e-11 -4.230000000000000e-11 4.730000000000000e-11 1.610000000000000e-11 3.010000000000000e-11 -1.630000000000000e-11 1.590000000000000e-10 -2.360000000000000e-11 7.020000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.560000000000000e+02 2.124864546364480e-01 -9.134790410121354e-01 1.859178462271990e-01 -2.929848164697649e-01 1.900000000000000e-10 2.050000000000000e-11 -4.230000000000000e-11 4.730000000000000e-11 1.610000000000000e-11 3.010000000000000e-11 -1.630000000000000e-11 1.590000000000000e-10 -2.360000000000000e-11 7.020000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.570000000000000e+02 2.124458176656069e-01 -9.135060149148192e-01 1.859960406320561e-01 -2.928805356114270e-01 1.900000000000000e-10 2.050000000000000e-11 -4.230000000000000e-11 4.740000000000000e-11 1.610000000000000e-11 3.010000000000000e-11 -1.630000000000000e-11 1.590000000000000e-10 -2.360000000000000e-11 7.020000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.580000000000000e+02 2.124051812588746e-01 -9.135329689772216e-01 1.860742252678211e-01 -2.927762563068046e-01 1.900000000000000e-10 2.050000000000000e-11 -4.240000000000000e-11 4.740000000000000e-11 1.610000000000000e-11 3.010000000000000e-11 -1.630000000000000e-11 1.590000000000000e-10 -2.360000000000000e-11 7.020000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.590000000000000e+02 2.123645453891723e-01 -9.135599032214524e-01 1.861524001134625e-01 -2.926719785351136e-01 1.900000000000000e-10 2.040000000000000e-11 -4.240000000000000e-11 4.740000000000000e-11 1.610000000000000e-11 3.010000000000000e-11 -1.630000000000000e-11 1.590000000000000e-10 -2.360000000000000e-11 7.020000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.600000000000000e+02 2.123239099897476e-01 -9.135868176691277e-01 1.862305652155093e-01 -2.925677022628667e-01 1.900000000000000e-10 2.040000000000000e-11 -4.240000000000000e-11 4.740000000000000e-11 1.610000000000000e-11 3.010000000000000e-11 -1.630000000000000e-11 1.590000000000000e-10 -2.360000000000000e-11 7.020000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.610000000000000e+02 2.122833108932798e-01 -9.136137005917935e-01 1.863087231063780e-01 -2.924634365209212e-01 1.900000000000000e-10 2.040000000000000e-11 -4.240000000000000e-11 4.740000000000000e-11 1.610000000000000e-11 3.010000000000000e-11 -1.630000000000000e-11 1.590000000000000e-10 -2.360000000000000e-11 7.020000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.620000000000000e+02 2.122426760895036e-01 -9.136405755057455e-01 1.863868690619740e-01 -2.923591631489789e-01 1.900000000000000e-10 2.040000000000000e-11 -4.250000000000000e-11 4.740000000000000e-11 1.610000000000000e-11 3.010000000000000e-11 -1.630000000000000e-11 1.590000000000000e-10 -2.360000000000000e-11 7.020000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.630000000000000e+02 2.122020413569772e-01 -9.136674306786543e-01 1.864650056604196e-01 -2.922548911909910e-01 1.900000000000000e-10 2.040000000000000e-11 -4.250000000000000e-11 4.740000000000000e-11 1.610000000000000e-11 3.000000000000000e-11 -1.620000000000000e-11 1.590000000000000e-10 -2.360000000000000e-11 7.020000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.640000000000000e+02 2.121614065256751e-01 -9.136942661277602e-01 1.865431330433501e-01 -2.921506206405737e-01 1.900000000000000e-10 2.040000000000000e-11 -4.250000000000000e-11 4.750000000000000e-11 1.610000000000000e-11 3.000000000000000e-11 -1.620000000000000e-11 1.590000000000000e-10 -2.360000000000000e-11 7.020000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.650000000000000e+02 2.121207714272484e-01 -9.137210818720056e-01 1.866212513234860e-01 -2.920463515030057e-01 1.910000000000000e-10 2.040000000000000e-11 -4.250000000000000e-11 4.750000000000000e-11 1.610000000000000e-11 3.000000000000000e-11 -1.620000000000000e-11 1.590000000000000e-10 -2.360000000000000e-11 7.020000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.660000000000000e+02 2.120801359033226e-01 -9.137478779345483e-01 1.866993605695825e-01 -2.919420837910273e-01 1.910000000000000e-10 2.040000000000000e-11 -4.260000000000000e-11 4.750000000000000e-11 1.600000000000000e-11 3.000000000000000e-11 -1.620000000000000e-11 1.580000000000000e-10 -2.360000000000000e-11 7.020000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.670000000000000e+02 2.120394998122928e-01 -9.137746543452540e-01 1.867774607979178e-01 -2.918378175176182e-01 1.910000000000000e-10 2.030000000000000e-11 -4.260000000000000e-11 4.750000000000000e-11 1.600000000000000e-11 3.000000000000000e-11 -1.620000000000000e-11 1.580000000000000e-10 -2.360000000000000e-11 7.020000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.680000000000000e+02 2.119988630313380e-01 -9.138014111430363e-01 1.868555519684404e-01 -2.917335526897537e-01 1.910000000000000e-10 2.030000000000000e-11 -4.260000000000000e-11 4.750000000000000e-11 1.600000000000000e-11 3.000000000000000e-11 -1.620000000000000e-11 1.580000000000000e-10 -2.360000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.690000000000000e+02 2.119582254554341e-01 -9.138281483770876e-01 1.869336339878906e-01 -2.916292893033351e-01 1.910000000000000e-10 2.030000000000000e-11 -4.260000000000000e-11 4.750000000000000e-11 1.600000000000000e-11 3.000000000000000e-11 -1.620000000000000e-11 1.580000000000000e-10 -2.360000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.700000000000000e+02 2.119175869918158e-01 -9.138548661071972e-01 1.870117067197001e-01 -2.915250273399314e-01 1.910000000000000e-10 2.030000000000000e-11 -4.260000000000000e-11 4.750000000000000e-11 1.600000000000000e-11 3.000000000000000e-11 -1.620000000000000e-11 1.580000000000000e-10 -2.360000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.710000000000000e+02 2.118769790271567e-01 -9.138815541190733e-01 1.870897721696459e-01 -2.914207747377379e-01 1.910000000000000e-10 2.030000000000000e-11 -4.270000000000000e-11 4.760000000000000e-11 1.600000000000000e-11 3.000000000000000e-11 -1.620000000000000e-11 1.580000000000000e-10 -2.360000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.720000000000000e+02 2.118363385310320e-01 -9.139082330563840e-01 1.871678258166281e-01 -2.913165155095063e-01 1.910000000000000e-10 2.030000000000000e-11 -4.270000000000000e-11 4.760000000000000e-11 1.600000000000000e-11 3.000000000000000e-11 -1.620000000000000e-11 1.580000000000000e-10 -2.360000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.730000000000000e+02 2.117956968838400e-01 -9.139348927138140e-01 1.872458696520068e-01 -2.912122575715891e-01 1.910000000000000e-10 2.030000000000000e-11 -4.270000000000000e-11 4.760000000000000e-11 1.600000000000000e-11 3.000000000000000e-11 -1.610000000000000e-11 1.580000000000000e-10 -2.360000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.740000000000000e+02 2.117550539856020e-01 -9.139615331694758e-01 1.873239035137134e-01 -2.911080008698513e-01 1.910000000000000e-10 2.030000000000000e-11 -4.270000000000000e-11 4.760000000000000e-11 1.600000000000000e-11 3.000000000000000e-11 -1.610000000000000e-11 1.580000000000000e-10 -2.360000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.750000000000000e+02 2.117144097302885e-01 -9.139881544955156e-01 1.874019272653820e-01 -2.910037453567523e-01 1.910000000000000e-10 2.030000000000000e-11 -4.280000000000000e-11 4.760000000000000e-11 1.600000000000000e-11 3.000000000000000e-11 -1.610000000000000e-11 1.580000000000000e-10 -2.360000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.760000000000000e+02 2.116737640078089e-01 -9.140147567549287e-01 1.874799408019713e-01 -2.908994909962619e-01 1.910000000000000e-10 2.020000000000000e-11 -4.280000000000000e-11 4.770000000000000e-11 1.600000000000000e-11 3.000000000000000e-11 -1.610000000000000e-11 1.580000000000000e-10 -2.360000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.770000000000000e+02 2.116331167089270e-01 -9.140413399994598e-01 1.875579440513557e-01 -2.907952377658309e-01 1.910000000000000e-10 2.020000000000000e-11 -4.280000000000000e-11 4.770000000000000e-11 1.600000000000000e-11 3.000000000000000e-11 -1.610000000000000e-11 1.580000000000000e-10 -2.360000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.780000000000000e+02 2.115924677306679e-01 -9.140679042695500e-01 1.876359369714014e-01 -2.906909856544984e-01 1.910000000000000e-10 2.020000000000000e-11 -4.280000000000000e-11 4.770000000000000e-11 1.600000000000000e-11 3.000000000000000e-11 -1.610000000000000e-11 1.580000000000000e-10 -2.360000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.790000000000000e+02 2.115518169807493e-01 -9.140944495963769e-01 1.877139195421980e-01 -2.905867346582532e-01 1.910000000000000e-10 2.020000000000000e-11 -4.290000000000000e-11 4.770000000000000e-11 1.590000000000000e-11 3.000000000000000e-11 -1.610000000000000e-11 1.580000000000000e-10 -2.360000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.800000000000000e+02 2.115111643800902e-01 -9.141209760059141e-01 1.877918917580307e-01 -2.904824847706201e-01 1.910000000000000e-10 2.020000000000000e-11 -4.290000000000000e-11 4.770000000000000e-11 1.590000000000000e-11 3.000000000000000e-11 -1.610000000000000e-11 1.580000000000000e-10 -2.360000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.810000000000000e+02 2.114705425888019e-01 -9.141474728367343e-01 1.878698559240533e-01 -2.903782442926562e-01 1.910000000000000e-10 2.020000000000000e-11 -4.290000000000000e-11 4.770000000000000e-11 1.590000000000000e-11 3.000000000000000e-11 -1.610000000000000e-11 1.580000000000000e-10 -2.360000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.820000000000000e+02 2.114298861038105e-01 -9.141739614914240e-01 1.879478074456937e-01 -2.902739965438905e-01 1.910000000000000e-10 2.020000000000000e-11 -4.290000000000000e-11 4.770000000000000e-11 1.590000000000000e-11 3.000000000000000e-11 -1.610000000000000e-11 1.580000000000000e-10 -2.360000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.830000000000000e+02 2.113892276090870e-01 -9.142004313222458e-01 1.880257486279421e-01 -2.901697497568541e-01 1.910000000000000e-10 2.020000000000000e-11 -4.300000000000000e-11 4.780000000000000e-11 1.590000000000000e-11 3.000000000000000e-11 -1.600000000000000e-11 1.580000000000000e-10 -2.360000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.840000000000000e+02 2.113485670702293e-01 -9.142268823793529e-01 1.881036794785066e-01 -2.900655038072210e-01 1.910000000000000e-10 2.010000000000000e-11 -4.300000000000000e-11 4.780000000000000e-11 1.590000000000000e-11 3.000000000000000e-11 -1.600000000000000e-11 1.580000000000000e-10 -2.360000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.850000000000000e+02 2.113079044609893e-01 -9.142533147242996e-01 1.881816000087860e-01 -2.899612585261511e-01 1.910000000000000e-10 2.010000000000000e-11 -4.300000000000000e-11 4.780000000000000e-11 1.590000000000000e-11 3.000000000000000e-11 -1.600000000000000e-11 1.580000000000000e-10 -2.360000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.860000000000000e+02 2.112672397634393e-01 -9.142797284282158e-01 1.882595102372706e-01 -2.898570137036343e-01 1.910000000000000e-10 2.010000000000000e-11 -4.300000000000000e-11 4.780000000000000e-11 1.590000000000000e-11 3.000000000000000e-11 -1.600000000000000e-11 1.570000000000000e-10 -2.360000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.870000000000000e+02 2.112265729712821e-01 -9.143061235673619e-01 1.883374101941120e-01 -2.897527690970467e-01 1.910000000000000e-10 2.010000000000000e-11 -4.310000000000000e-11 4.780000000000000e-11 1.590000000000000e-11 3.000000000000000e-11 -1.600000000000000e-11 1.570000000000000e-10 -2.360000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.880000000000000e+02 2.111859040944933e-01 -9.143325002172727e-01 1.884152999234226e-01 -2.896485244446952e-01 1.910000000000000e-10 2.010000000000000e-11 -4.310000000000000e-11 4.780000000000000e-11 1.590000000000000e-11 3.000000000000000e-11 -1.600000000000000e-11 1.570000000000000e-10 -2.360000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.890000000000000e+02 2.111452331642737e-01 -9.143588584460893e-01 1.884931794806791e-01 -2.895442794849066e-01 1.910000000000000e-10 2.010000000000000e-11 -4.310000000000000e-11 4.780000000000000e-11 1.590000000000000e-11 2.990000000000000e-11 -1.600000000000000e-11 1.570000000000000e-10 -2.360000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.900000000000000e+02 2.111045602363482e-01 -9.143851983082412e-01 1.885710489303931e-01 -2.894400339751020e-01 1.910000000000000e-10 2.010000000000000e-11 -4.310000000000000e-11 4.790000000000000e-11 1.590000000000000e-11 2.990000000000000e-11 -1.600000000000000e-11 1.570000000000000e-10 -2.360000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.910000000000000e+02 2.110639199150464e-01 -9.144115085725826e-01 1.886489108158282e-01 -2.893357965204276e-01 1.910000000000000e-10 2.010000000000000e-11 -4.320000000000000e-11 4.790000000000000e-11 1.590000000000000e-11 2.990000000000000e-11 -1.600000000000000e-11 1.570000000000000e-10 -2.360000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.920000000000000e+02 2.110232432601153e-01 -9.144378117885380e-01 1.887267602562271e-01 -2.892315493485474e-01 1.910000000000000e-10 2.000000000000000e-11 -4.320000000000000e-11 4.790000000000000e-11 1.590000000000000e-11 2.990000000000000e-11 -1.600000000000000e-11 1.570000000000000e-10 -2.360000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.930000000000000e+02 2.109825649136318e-01 -9.144640966788530e-01 1.888045997793789e-01 -2.891273011839995e-01 1.910000000000000e-10 2.000000000000000e-11 -4.320000000000000e-11 4.790000000000000e-11 1.580000000000000e-11 2.990000000000000e-11 -1.590000000000000e-11 1.570000000000000e-10 -2.360000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.940000000000000e+02 2.109418849994488e-01 -9.144903632145863e-01 1.888824294263712e-01 -2.890230520123356e-01 1.910000000000000e-10 2.000000000000000e-11 -4.320000000000000e-11 4.790000000000000e-11 1.580000000000000e-11 2.990000000000000e-11 -1.590000000000000e-11 1.570000000000000e-10 -2.360000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.950000000000000e+02 2.109012036334170e-01 -9.145166113494912e-01 1.889602492198081e-01 -2.889188018918249e-01 1.910000000000000e-10 2.000000000000000e-11 -4.320000000000000e-11 4.790000000000000e-11 1.580000000000000e-11 2.990000000000000e-11 -1.590000000000000e-11 1.570000000000000e-10 -2.360000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.960000000000000e+02 2.108605209090383e-01 -9.145428410251655e-01 1.890380591640143e-01 -2.888145509476464e-01 1.910000000000000e-10 2.000000000000000e-11 -4.330000000000000e-11 4.800000000000000e-11 1.580000000000000e-11 2.990000000000000e-11 -1.590000000000000e-11 1.570000000000000e-10 -2.360000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.970000000000000e+02 2.108198368835641e-01 -9.145690521772808e-01 1.891158592478649e-01 -2.887102993605872e-01 1.910000000000000e-10 2.000000000000000e-11 -4.330000000000000e-11 4.800000000000000e-11 1.580000000000000e-11 2.990000000000000e-11 -1.590000000000000e-11 1.570000000000000e-10 -2.360000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.980000000000000e+02 2.107791515695114e-01 -9.145952447411335e-01 1.891936494504976e-01 -2.886060473520007e-01 1.910000000000000e-10 2.000000000000000e-11 -4.330000000000000e-11 4.800000000000000e-11 1.580000000000000e-11 2.990000000000000e-11 -1.590000000000000e-11 1.570000000000000e-10 -2.360000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.990000000000000e+02 2.107384649302406e-01 -9.146214186567253e-01 1.892714297467299e-01 -2.885017951674369e-01 1.910000000000000e-10 2.000000000000000e-11 -4.330000000000000e-11 4.800000000000000e-11 1.580000000000000e-11 2.990000000000000e-11 -1.590000000000000e-11 1.570000000000000e-10 -2.360000000000000e-11 6.990000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.000000000000000e+02 2.106977768803538e-01 -9.146475738730780e-01 1.893492001130408e-01 -2.883975430587455e-01 1.910000000000000e-10 2.000000000000000e-11 -4.340000000000000e-11 4.800000000000000e-11 1.580000000000000e-11 2.990000000000000e-11 -1.590000000000000e-11 1.570000000000000e-10 -2.360000000000000e-11 6.990000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.010000000000000e+02 2.106571240710444e-01 -9.146736983546171e-01 1.894269632196007e-01 -2.882933006883850e-01 1.910000000000000e-10 1.990000000000000e-11 -4.340000000000000e-11 4.800000000000000e-11 1.580000000000000e-11 2.990000000000000e-11 -1.590000000000000e-11 1.570000000000000e-10 -2.360000000000000e-11 6.990000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.020000000000000e+02 2.106164327899247e-01 -9.146998160681388e-01 1.895047136968949e-01 -2.881890494283537e-01 1.910000000000000e-10 1.990000000000000e-11 -4.340000000000000e-11 4.800000000000000e-11 1.580000000000000e-11 2.990000000000000e-11 -1.590000000000000e-11 1.570000000000000e-10 -2.360000000000000e-11 6.990000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.030000000000000e+02 2.105757396419524e-01 -9.147259150024866e-01 1.895824542393226e-01 -2.880847988730117e-01 1.910000000000000e-10 1.990000000000000e-11 -4.340000000000000e-11 4.810000000000000e-11 1.580000000000000e-11 2.990000000000000e-11 -1.580000000000000e-11 1.570000000000000e-10 -2.360000000000000e-11 6.990000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.040000000000000e+02 2.105350444539993e-01 -9.147519951558232e-01 1.896601848742445e-01 -2.879805491498704e-01 1.910000000000000e-10 1.990000000000000e-11 -4.340000000000000e-11 4.810000000000000e-11 1.580000000000000e-11 2.990000000000000e-11 -1.580000000000000e-11 1.570000000000000e-10 -2.360000000000000e-11 6.990000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.050000000000000e+02 2.104943470688501e-01 -9.147780565358953e-01 1.897379056414059e-01 -2.878763003362413e-01 1.910000000000000e-10 1.990000000000000e-11 -4.350000000000000e-11 4.810000000000000e-11 1.580000000000000e-11 2.990000000000000e-11 -1.580000000000000e-11 1.570000000000000e-10 -2.360000000000000e-11 6.990000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.060000000000000e+02 2.104536473581357e-01 -9.148040991578585e-01 1.898156165903000e-01 -2.877720524583314e-01 1.910000000000000e-10 1.990000000000000e-11 -4.350000000000000e-11 4.810000000000000e-11 1.580000000000000e-11 2.990000000000000e-11 -1.580000000000000e-11 1.560000000000000e-10 -2.360000000000000e-11 6.990000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.070000000000000e+02 2.104129452311448e-01 -9.148301230417492e-01 1.898933177769523e-01 -2.876678054948707e-01 1.910000000000000e-10 1.990000000000000e-11 -4.350000000000000e-11 4.810000000000000e-11 1.570000000000000e-11 2.990000000000000e-11 -1.580000000000000e-11 1.560000000000000e-10 -2.360000000000000e-11 6.990000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.080000000000000e+02 2.103722406405669e-01 -9.148561282098636e-01 1.899710092591715e-01 -2.875635593843160e-01 1.910000000000000e-10 1.990000000000000e-11 -4.350000000000000e-11 4.810000000000000e-11 1.570000000000000e-11 2.990000000000000e-11 -1.580000000000000e-11 1.560000000000000e-10 -2.360000000000000e-11 6.990000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.090000000000000e+02 2.103315335834890e-01 -9.148821146842003e-01 1.900486910912594e-01 -2.874593140357125e-01 1.920000000000000e-10 1.990000000000000e-11 -4.360000000000000e-11 4.810000000000000e-11 1.570000000000000e-11 2.990000000000000e-11 -1.580000000000000e-11 1.560000000000000e-10 -2.360000000000000e-11 6.990000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.100000000000000e+02 2.102908240989648e-01 -9.149080824840736e-01 1.901263633190123e-01 -2.873550693413658e-01 1.920000000000000e-10 1.980000000000000e-11 -4.360000000000000e-11 4.820000000000000e-11 1.570000000000000e-11 2.990000000000000e-11 -1.580000000000000e-11 1.560000000000000e-10 -2.360000000000000e-11 6.990000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.110000000000000e+02 2.102501446631871e-01 -9.149340210616737e-01 1.902040283859198e-01 -2.872508335214963e-01 1.920000000000000e-10 1.980000000000000e-11 -4.360000000000000e-11 4.820000000000000e-11 1.570000000000000e-11 2.990000000000000e-11 -1.580000000000000e-11 1.560000000000000e-10 -2.360000000000000e-11 6.990000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.120000000000000e+02 2.102094305818122e-01 -9.149599515501777e-01 1.902816814957546e-01 -2.871465898124421e-01 1.920000000000000e-10 1.980000000000000e-11 -4.360000000000000e-11 4.820000000000000e-11 1.570000000000000e-11 2.990000000000000e-11 -1.580000000000000e-11 1.560000000000000e-10 -2.360000000000000e-11 6.990000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.130000000000000e+02 2.101687143845973e-01 -9.149858633857054e-01 1.903593250547215e-01 -2.870423464629420e-01 1.920000000000000e-10 1.980000000000000e-11 -4.370000000000000e-11 4.820000000000000e-11 1.570000000000000e-11 2.990000000000000e-11 -1.580000000000000e-11 1.560000000000000e-10 -2.360000000000000e-11 6.990000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.140000000000000e+02 2.101279962158747e-01 -9.150117565584521e-01 1.904369590435877e-01 -2.869381034236274e-01 1.920000000000000e-10 1.980000000000000e-11 -4.370000000000000e-11 4.820000000000000e-11 1.570000000000000e-11 2.990000000000000e-11 -1.570000000000000e-11 1.560000000000000e-10 -2.360000000000000e-11 6.990000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.150000000000000e+02 2.100872762295232e-01 -9.150376310485984e-01 1.905145834238531e-01 -2.868338606829132e-01 1.920000000000000e-10 1.980000000000000e-11 -4.370000000000000e-11 4.820000000000000e-11 1.570000000000000e-11 2.990000000000000e-11 -1.570000000000000e-11 1.560000000000000e-10 -2.360000000000000e-11 6.990000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.160000000000000e+02 2.100465545837565e-01 -9.150634868262999e-01 1.905921981400640e-01 -2.867296182694171e-01 1.920000000000000e-10 1.980000000000000e-11 -4.370000000000000e-11 4.830000000000000e-11 1.570000000000000e-11 2.980000000000000e-11 -1.570000000000000e-11 1.560000000000000e-10 -2.360000000000000e-11 6.979999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.170000000000000e+02 2.100058314350223e-01 -9.150893238530152e-01 1.906698031258922e-01 -2.866253762482485e-01 1.920000000000000e-10 1.980000000000000e-11 -4.380000000000000e-11 4.830000000000000e-11 1.570000000000000e-11 2.980000000000000e-11 -1.570000000000000e-11 1.560000000000000e-10 -2.360000000000000e-11 6.979999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.180000000000000e+02 2.099651069342621e-01 -9.151151420834104e-01 1.907473983114465e-01 -2.865211347128827e-01 1.920000000000000e-10 1.970000000000000e-11 -4.380000000000000e-11 4.830000000000000e-11 1.570000000000000e-11 2.980000000000000e-11 -1.570000000000000e-11 1.560000000000000e-10 -2.360000000000000e-11 6.979999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.190000000000000e+02 2.099243812235525e-01 -9.151409414675159e-01 1.908249836325857e-01 -2.864168937745826e-01 1.920000000000000e-10 1.970000000000000e-11 -4.380000000000000e-11 4.830000000000000e-11 1.570000000000000e-11 2.980000000000000e-11 -1.570000000000000e-11 1.560000000000000e-10 -2.360000000000000e-11 6.979999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.200000000000000e+02 2.098836544323458e-01 -9.151667219539623e-01 1.909025590407555e-01 -2.863126535482732e-01 1.920000000000000e-10 1.970000000000000e-11 -4.380000000000000e-11 4.830000000000000e-11 1.570000000000000e-11 2.980000000000000e-11 -1.570000000000000e-11 1.560000000000000e-10 -2.360000000000000e-11 6.979999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.210000000000000e+02 2.098429603680682e-01 -9.151924725157441e-01 1.909801270636490e-01 -2.862084228341942e-01 1.920000000000000e-10 1.970000000000000e-11 -4.390000000000000e-11 4.830000000000000e-11 1.560000000000000e-11 2.980000000000000e-11 -1.570000000000000e-11 1.560000000000000e-10 -2.360000000000000e-11 6.979999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.220000000000000e+02 2.098022317438388e-01 -9.152182150637327e-01 1.910576826160957e-01 -2.861041843179288e-01 1.920000000000000e-10 1.970000000000000e-11 -4.390000000000000e-11 4.830000000000000e-11 1.560000000000000e-11 2.980000000000000e-11 -1.570000000000000e-11 1.560000000000000e-10 -2.360000000000000e-11 6.979999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.230000000000000e+02 2.097615023338574e-01 -9.152439385820565e-01 1.911352282963865e-01 -2.859999467334496e-01 1.920000000000000e-10 1.970000000000000e-11 -4.390000000000000e-11 4.840000000000000e-11 1.560000000000000e-11 2.980000000000000e-11 -1.570000000000000e-11 1.560000000000000e-10 -2.360000000000000e-11 6.979999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.240000000000000e+02 2.097207722023860e-01 -9.152696430423370e-01 1.912127641951138e-01 -2.858957100777340e-01 1.920000000000000e-10 1.970000000000000e-11 -4.390000000000000e-11 4.840000000000000e-11 1.560000000000000e-11 2.980000000000000e-11 -1.570000000000000e-11 1.560000000000000e-10 -2.360000000000000e-11 6.979999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.250000000000000e+02 2.096800413991837e-01 -9.152953284256289e-01 1.912902904377876e-01 -2.857914743047520e-01 1.920000000000000e-10 1.970000000000000e-11 -4.390000000000000e-11 4.840000000000000e-11 1.560000000000000e-11 2.980000000000000e-11 -1.560000000000000e-11 1.560000000000000e-10 -2.360000000000000e-11 6.979999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.260000000000000e+02 2.096393099614649e-01 -9.153209947223664e-01 1.913678071760637e-01 -2.856872393299425e-01 1.920000000000000e-10 1.960000000000000e-11 -4.400000000000000e-11 4.840000000000000e-11 1.560000000000000e-11 2.980000000000000e-11 -1.560000000000000e-11 1.560000000000000e-10 -2.360000000000000e-11 6.979999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.270000000000000e+02 2.095985779162438e-01 -9.153466419311483e-01 1.914453145768403e-01 -2.855830050395735e-01 1.920000000000000e-10 1.960000000000000e-11 -4.400000000000000e-11 4.840000000000000e-11 1.560000000000000e-11 2.980000000000000e-11 -1.560000000000000e-11 1.550000000000000e-10 -2.360000000000000e-11 6.979999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.280000000000000e+02 2.095578452811533e-01 -9.153722700571493e-01 1.915228128082756e-01 -2.854787713045365e-01 1.920000000000000e-10 1.960000000000000e-11 -4.400000000000000e-11 4.840000000000000e-11 1.560000000000000e-11 2.980000000000000e-11 -1.560000000000000e-11 1.550000000000000e-10 -2.360000000000000e-11 6.979999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.290000000000000e+02 2.095171120643738e-01 -9.153978791100641e-01 1.916003020256502e-01 -2.853745379964392e-01 1.920000000000000e-10 1.960000000000000e-11 -4.400000000000000e-11 4.840000000000000e-11 1.560000000000000e-11 2.980000000000000e-11 -1.560000000000000e-11 1.550000000000000e-10 -2.360000000000000e-11 6.979999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.300000000000000e+02 2.094763782623643e-01 -9.154234691019451e-01 1.916777823608764e-01 -2.852703050032718e-01 1.920000000000000e-10 1.960000000000000e-11 -4.400000000000000e-11 4.850000000000000e-11 1.560000000000000e-11 2.980000000000000e-11 -1.560000000000000e-11 1.550000000000000e-10 -2.360000000000000e-11 6.979999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.310000000000000e+02 2.094356769749172e-01 -9.154490292609312e-01 1.917552564675641e-01 -2.851660808236771e-01 1.920000000000000e-10 1.960000000000000e-11 -4.410000000000000e-11 4.850000000000000e-11 1.560000000000000e-11 2.980000000000000e-11 -1.560000000000000e-11 1.550000000000000e-10 -2.360000000000000e-11 6.970000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.320000000000000e+02 2.093949419203982e-01 -9.154745811692190e-01 1.918327193180991e-01 -2.850618482544087e-01 1.920000000000000e-10 1.960000000000000e-11 -4.410000000000000e-11 4.850000000000000e-11 1.560000000000000e-11 2.980000000000000e-11 -1.560000000000000e-11 1.550000000000000e-10 -2.360000000000000e-11 6.970000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.330000000000000e+02 2.093542061473903e-01 -9.155001140538329e-01 1.919101735020247e-01 -2.849576158698653e-01 1.920000000000000e-10 1.960000000000000e-11 -4.410000000000000e-11 4.850000000000000e-11 1.560000000000000e-11 2.980000000000000e-11 -1.560000000000000e-11 1.550000000000000e-10 -2.360000000000000e-11 6.970000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.340000000000000e+02 2.093134695481628e-01 -9.155256279261753e-01 1.919876190405189e-01 -2.848533837103672e-01 1.920000000000000e-10 1.960000000000000e-11 -4.410000000000000e-11 4.850000000000000e-11 1.560000000000000e-11 2.980000000000000e-11 -1.560000000000000e-11 1.550000000000000e-10 -2.360000000000000e-11 6.970000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.350000000000000e+02 2.092727319754983e-01 -9.155511227975456e-01 1.920650559423283e-01 -2.847491518539346e-01 1.920000000000000e-10 1.960000000000000e-11 -4.410000000000000e-11 4.850000000000000e-11 1.560000000000000e-11 2.980000000000000e-11 -1.550000000000000e-11 1.550000000000000e-10 -2.360000000000000e-11 6.970000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.360000000000000e+02 2.092319932421161e-01 -9.155765986800173e-01 1.921424842138585e-01 -2.846449204071433e-01 1.920000000000000e-10 1.950000000000000e-11 -4.420000000000000e-11 4.860000000000000e-11 1.550000000000000e-11 2.980000000000000e-11 -1.550000000000000e-11 1.550000000000000e-10 -2.360000000000000e-11 6.970000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.370000000000000e+02 2.091912531247283e-01 -9.156020555870812e-01 1.922199038677825e-01 -2.845406894942756e-01 1.920000000000000e-10 1.950000000000000e-11 -4.420000000000000e-11 4.860000000000000e-11 1.550000000000000e-11 2.980000000000000e-11 -1.550000000000000e-11 1.550000000000000e-10 -2.360000000000000e-11 6.970000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.380000000000000e+02 2.091505113719812e-01 -9.156274935347620e-01 1.922973149284786e-01 -2.844364592442145e-01 1.920000000000000e-10 1.950000000000000e-11 -4.420000000000000e-11 4.860000000000000e-11 1.550000000000000e-11 2.980000000000000e-11 -1.550000000000000e-11 1.550000000000000e-10 -2.360000000000000e-11 6.970000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.390000000000000e+02 2.091097677188676e-01 -9.156529125416272e-01 1.923747174323720e-01 -2.843322297795513e-01 1.920000000000000e-10 1.950000000000000e-11 -4.420000000000000e-11 4.860000000000000e-11 1.550000000000000e-11 2.980000000000000e-11 -1.550000000000000e-11 1.550000000000000e-10 -2.360000000000000e-11 6.970000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.400000000000000e+02 2.090690219010850e-01 -9.156783126292405e-01 1.924521114251365e-01 -2.842280012064213e-01 1.920000000000000e-10 1.950000000000000e-11 -4.430000000000000e-11 4.860000000000000e-11 1.550000000000000e-11 2.980000000000000e-11 -1.550000000000000e-11 1.550000000000000e-10 -2.360000000000000e-11 6.970000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.410000000000000e+02 2.090283074679510e-01 -9.157036828238563e-01 1.925294996043108e-01 -2.841237823942655e-01 1.920000000000000e-10 1.950000000000000e-11 -4.430000000000000e-11 4.860000000000000e-11 1.550000000000000e-11 2.980000000000000e-11 -1.550000000000000e-11 1.550000000000000e-10 -2.360000000000000e-11 6.970000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.420000000000000e+02 2.089875566186891e-01 -9.157290451504778e-01 1.926068767223660e-01 -2.840195558154403e-01 1.920000000000000e-10 1.950000000000000e-11 -4.430000000000000e-11 4.860000000000000e-11 1.550000000000000e-11 2.980000000000000e-11 -1.550000000000000e-11 1.550000000000000e-10 -2.360000000000000e-11 6.970000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.430000000000000e+02 2.089468029809717e-01 -9.157543886389425e-01 1.926842454592589e-01 -2.839153302735583e-01 1.920000000000000e-10 1.950000000000000e-11 -4.430000000000000e-11 4.870000000000000e-11 1.550000000000000e-11 2.980000000000000e-11 -1.550000000000000e-11 1.550000000000000e-10 -2.360000000000000e-11 6.970000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.440000000000000e+02 2.089060464401835e-01 -9.157797133222740e-01 1.927616058307150e-01 -2.838111057475898e-01 1.920000000000000e-10 1.940000000000000e-11 -4.440000000000000e-11 4.870000000000000e-11 1.550000000000000e-11 2.980000000000000e-11 -1.550000000000000e-11 1.550000000000000e-10 -2.360000000000000e-11 6.970000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.450000000000000e+02 2.088652869361649e-01 -9.158050192370315e-01 1.928389578282156e-01 -2.837068821813485e-01 1.920000000000000e-10 1.940000000000000e-11 -4.440000000000000e-11 4.870000000000000e-11 1.550000000000000e-11 2.980000000000000e-11 -1.550000000000000e-11 1.550000000000000e-10 -2.360000000000000e-11 6.970000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.460000000000000e+02 2.088245244584397e-01 -9.158303064244538e-01 1.929163014168351e-01 -2.836026594847910e-01 1.920000000000000e-10 1.940000000000000e-11 -4.440000000000000e-11 4.870000000000000e-11 1.550000000000000e-11 2.980000000000000e-11 -1.540000000000000e-11 1.550000000000000e-10 -2.360000000000000e-11 6.970000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.470000000000000e+02 2.087837590376029e-01 -9.158555749320035e-01 1.929936365350300e-01 -2.834984375355218e-01 1.920000000000000e-10 1.940000000000000e-11 -4.440000000000000e-11 4.870000000000000e-11 1.550000000000000e-11 2.980000000000000e-11 -1.540000000000000e-11 1.550000000000000e-10 -2.360000000000000e-11 6.970000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.480000000000000e+02 2.087429907345323e-01 -9.158808248144924e-01 1.930709630963229e-01 -2.833942161819581e-01 1.920000000000000e-10 1.940000000000000e-11 -4.440000000000000e-11 4.870000000000000e-11 1.550000000000000e-11 2.980000000000000e-11 -1.540000000000000e-11 1.550000000000000e-10 -2.360000000000000e-11 6.970000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.490000000000000e+02 2.087022196282028e-01 -9.159060561351158e-01 1.931482809903128e-01 -2.832899952482733e-01 1.920000000000000e-10 1.940000000000000e-11 -4.450000000000000e-11 4.870000000000000e-11 1.550000000000000e-11 2.980000000000000e-11 -1.540000000000000e-11 1.550000000000000e-10 -2.360000000000000e-11 6.970000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.500000000000000e+02 2.086614458061604e-01 -9.159312689655869e-01 1.932255900854487e-01 -2.831857745390872e-01 1.920000000000000e-10 1.940000000000000e-11 -4.450000000000000e-11 4.870000000000000e-11 1.550000000000000e-11 2.970000000000000e-11 -1.540000000000000e-11 1.540000000000000e-10 -2.360000000000000e-11 6.970000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.510000000000000e+02 2.086207064342790e-01 -9.159564513260644e-01 1.933028931864565e-01 -2.830815635232554e-01 1.920000000000000e-10 1.940000000000000e-11 -4.450000000000000e-11 4.880000000000000e-11 1.540000000000000e-11 2.970000000000000e-11 -1.540000000000000e-11 1.540000000000000e-10 -2.360000000000000e-11 6.960000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.520000000000000e+02 2.085799274553594e-01 -9.159816274194711e-01 1.933801842216235e-01 -2.829773426320652e-01 1.920000000000000e-10 1.930000000000000e-11 -4.450000000000000e-11 4.880000000000000e-11 1.540000000000000e-11 2.970000000000000e-11 -1.540000000000000e-11 1.540000000000000e-10 -2.360000000000000e-11 6.960000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.530000000000000e+02 2.085391460394756e-01 -9.160067852713345e-01 1.934574659625187e-01 -2.828731213271471e-01 1.920000000000000e-10 1.930000000000000e-11 -4.460000000000000e-11 4.880000000000000e-11 1.540000000000000e-11 2.970000000000000e-11 -1.540000000000000e-11 1.540000000000000e-10 -2.360000000000000e-11 6.960000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.540000000000000e+02 2.084983622917498e-01 -9.160319249635650e-01 1.935347382191887e-01 -2.827688994066250e-01 1.920000000000000e-10 1.930000000000000e-11 -4.460000000000000e-11 4.880000000000000e-11 1.540000000000000e-11 2.970000000000000e-11 -1.540000000000000e-11 1.540000000000000e-10 -2.360000000000000e-11 6.960000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.550000000000000e+02 2.084575763355901e-01 -9.160570465684127e-01 1.936120007961654e-01 -2.826646766901636e-01 1.930000000000000e-10 1.930000000000000e-11 -4.460000000000000e-11 4.880000000000000e-11 1.540000000000000e-11 2.970000000000000e-11 -1.540000000000000e-11 1.540000000000000e-10 -2.360000000000000e-11 6.960000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.560000000000000e+02 2.084167883188247e-01 -9.160821501431045e-01 1.936892534983684e-01 -2.825604530278389e-01 1.930000000000000e-10 1.930000000000000e-11 -4.460000000000000e-11 4.880000000000000e-11 1.540000000000000e-11 2.970000000000000e-11 -1.530000000000000e-11 1.540000000000000e-10 -2.360000000000000e-11 6.960000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.570000000000000e+02 2.083759984174736e-01 -9.161072357248247e-01 1.937664961406917e-01 -2.824562283071506e-01 1.930000000000000e-10 1.930000000000000e-11 -4.460000000000000e-11 4.890000000000000e-11 1.540000000000000e-11 2.970000000000000e-11 -1.530000000000000e-11 1.540000000000000e-10 -2.360000000000000e-11 6.960000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.580000000000000e+02 2.083352068357988e-01 -9.161323033268366e-01 1.938437285573794e-01 -2.823520024592054e-01 1.930000000000000e-10 1.930000000000000e-11 -4.470000000000000e-11 4.890000000000000e-11 1.540000000000000e-11 2.970000000000000e-11 -1.530000000000000e-11 1.540000000000000e-10 -2.360000000000000e-11 6.960000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.590000000000000e+02 2.082944138005784e-01 -9.161573529376221e-01 1.939209506115182e-01 -2.822477754593080e-01 1.930000000000000e-10 1.930000000000000e-11 -4.470000000000000e-11 4.890000000000000e-11 1.540000000000000e-11 2.970000000000000e-11 -1.530000000000000e-11 1.540000000000000e-10 -2.360000000000000e-11 6.960000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.600000000000000e+02 2.082536195511764e-01 -9.161823845211938e-01 1.939981622042557e-01 -2.821435473270025e-01 1.930000000000000e-10 1.930000000000000e-11 -4.470000000000000e-11 4.890000000000000e-11 1.540000000000000e-11 2.970000000000000e-11 -1.530000000000000e-11 1.540000000000000e-10 -2.360000000000000e-11 6.960000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.610000000000000e+02 2.082128589858885e-01 -9.162073867532563e-01 1.940753660909977e-01 -2.820393272016098e-01 1.930000000000000e-10 1.920000000000000e-11 -4.470000000000000e-11 4.890000000000000e-11 1.540000000000000e-11 2.970000000000000e-11 -1.530000000000000e-11 1.540000000000000e-10 -2.360000000000000e-11 6.960000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.620000000000000e+02 2.081720630096352e-01 -9.162323820956372e-01 1.941525566548932e-01 -2.819350970099951e-01 1.930000000000000e-10 1.920000000000000e-11 -4.480000000000000e-11 4.890000000000000e-11 1.540000000000000e-11 2.970000000000000e-11 -1.530000000000000e-11 1.540000000000000e-10 -2.360000000000000e-11 6.960000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.630000000000000e+02 2.081312664788284e-01 -9.162573591961047e-01 1.942297367490557e-01 -2.818308659378739e-01 1.930000000000000e-10 1.920000000000000e-11 -4.480000000000000e-11 4.890000000000000e-11 1.540000000000000e-11 2.970000000000000e-11 -1.530000000000000e-11 1.540000000000000e-10 -2.360000000000000e-11 6.960000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.640000000000000e+02 2.080904695527254e-01 -9.162823179676138e-01 1.943069064663514e-01 -2.817266340989070e-01 1.930000000000000e-10 1.920000000000000e-11 -4.480000000000000e-11 4.900000000000000e-11 1.540000000000000e-11 2.970000000000000e-11 -1.530000000000000e-11 1.540000000000000e-10 -2.360000000000000e-11 6.960000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.650000000000000e+02 2.080496723499803e-01 -9.163072583258566e-01 1.943840659360061e-01 -2.816224016029346e-01 1.930000000000000e-10 1.920000000000000e-11 -4.480000000000000e-11 4.900000000000000e-11 1.540000000000000e-11 2.970000000000000e-11 -1.530000000000000e-11 1.540000000000000e-10 -2.360000000000000e-11 6.960000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.660000000000000e+02 2.080088749491293e-01 -9.163321801951453e-01 1.944612153118654e-01 -2.815181685444860e-01 1.930000000000000e-10 1.920000000000000e-11 -4.480000000000000e-11 4.900000000000000e-11 1.530000000000000e-11 2.970000000000000e-11 -1.530000000000000e-11 1.540000000000000e-10 -2.360000000000000e-11 6.950000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>5.670000000000000e+02 2.079680773939598e-01 -9.163570835128514e-01 1.945383547578702e-01 -2.814139349943114e-01 1.930000000000000e-10 1.920000000000000e-11 -4.490000000000000e-11 4.900000000000000e-11 1.530000000000000e-11 2.970000000000000e-11 -1.530000000000000e-11 1.540000000000000e-10 -2.360000000000000e-11 6.950000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>5.680000000000000e+02 2.079272797022357e-01 -9.163819682325579e-01 1.946154844314728e-01 -2.813097009940373e-01 1.930000000000000e-10 1.920000000000000e-11 -4.490000000000000e-11 4.900000000000000e-11 1.530000000000000e-11 2.970000000000000e-11 -1.520000000000000e-11 1.540000000000000e-10 -2.360000000000000e-11 6.950000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>5.690000000000000e+02 2.078864818754669e-01 -9.164068343252179e-01 1.946926044679359e-01 -2.812054665559790e-01 1.930000000000000e-10 1.920000000000000e-11 -4.490000000000000e-11 4.900000000000000e-11 1.530000000000000e-11 2.970000000000000e-11 -1.520000000000000e-11 1.540000000000000e-10 -2.360000000000000e-11 6.950000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>5.700000000000000e+02 2.078456839065942e-01 -9.164316817797343e-01 1.947697149653619e-01 -2.811012316658893e-01 1.930000000000000e-10 1.910000000000000e-11 -4.490000000000000e-11 4.900000000000000e-11 1.530000000000000e-11 2.970000000000000e-11 -1.520000000000000e-11 1.540000000000000e-10 -2.360000000000000e-11 6.950000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>5.710000000000000e+02 2.078049217290539e-01 -9.164564989244293e-01 1.948468189353401e-01 -2.809970057405206e-01 1.930000000000000e-10 1.910000000000000e-11 -4.490000000000000e-11 4.910000000000000e-11 1.530000000000000e-11 2.970000000000000e-11 -1.520000000000000e-11 1.540000000000000e-10 -2.360000000000000e-11 6.950000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>5.720000000000000e+02 2.077641234480311e-01 -9.164813091368235e-01 1.949239104577974e-01 -2.808927698296381e-01 1.930000000000000e-10 1.910000000000000e-11 -4.500000000000000e-11 4.910000000000000e-11 1.530000000000000e-11 2.970000000000000e-11 -1.520000000000000e-11 1.530000000000000e-10 -2.360000000000000e-11 6.950000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>5.730000000000000e+02 2.077233249917857e-01 -9.165061007729706e-01 1.950009924328763e-01 -2.807885333315372e-01 1.930000000000000e-10 1.910000000000000e-11 -4.500000000000000e-11 4.910000000000000e-11 1.530000000000000e-11 2.970000000000000e-11 -1.520000000000000e-11 1.530000000000000e-10 -2.360000000000000e-11 6.950000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>5.740000000000000e+02 2.076825263352942e-01 -9.165308738783126e-01 1.950780647528851e-01 -2.806842962032541e-01 1.930000000000000e-10 1.910000000000000e-11 -4.500000000000000e-11 4.910000000000000e-11 1.530000000000000e-11 2.970000000000000e-11 -1.520000000000000e-11 1.530000000000000e-10 -2.360000000000000e-11 6.950000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>5.750000000000000e+02 2.076417274368310e-01 -9.165556285050902e-01 1.951551272695053e-01 -2.805800584202502e-01 1.930000000000000e-10 1.910000000000000e-11 -4.500000000000000e-11 4.910000000000000e-11 1.530000000000000e-11 2.970000000000000e-11 -1.520000000000000e-11 1.530000000000000e-10 -2.360000000000000e-11 6.950000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>5.760000000000000e+02 2.076009282300014e-01 -9.165803647087010e-01 1.952321798081127e-01 -2.804758199843246e-01 1.930000000000000e-10 1.910000000000000e-11 -4.510000000000000e-11 4.910000000000000e-11 1.530000000000000e-11 2.970000000000000e-11 -1.520000000000000e-11 1.530000000000000e-10 -2.360000000000000e-11 6.950000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>5.770000000000000e+02 2.075601286179220e-01 -9.166050825435772e-01 1.953092221858799e-01 -2.803715809288458e-01 1.930000000000000e-10 1.910000000000000e-11 -4.510000000000000e-11 4.910000000000000e-11 1.530000000000000e-11 2.970000000000000e-11 -1.520000000000000e-11 1.530000000000000e-10 -2.360000000000000e-11 6.950000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>5.780000000000000e+02 2.075193284710072e-01 -9.166297820587929e-01 1.953862542305725e-01 -2.802673413217072e-01 1.930000000000000e-10 1.900000000000000e-11 -4.510000000000000e-11 4.920000000000000e-11 1.530000000000000e-11 2.970000000000000e-11 -1.520000000000000e-11 1.530000000000000e-10 -2.360000000000000e-11 6.950000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>5.790000000000000e+02 2.074785276295641e-01 -9.166544632938124e-01 1.954632757978648e-01 -2.801631012652607e-01 1.930000000000000e-10 1.900000000000000e-11 -4.510000000000000e-11 4.920000000000000e-11 1.530000000000000e-11 2.970000000000000e-11 -1.510000000000000e-11 1.530000000000000e-10 -2.360000000000000e-11 6.950000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>5.800000000000000e+02 2.074377259081046e-01 -9.166791262756440e-01 1.955402867866015e-01 -2.800588608917950e-01 1.930000000000000e-10 1.900000000000000e-11 -4.510000000000000e-11 4.920000000000000e-11 1.530000000000000e-11 2.970000000000000e-11 -1.510000000000000e-11 1.530000000000000e-10 -2.360000000000000e-11 6.950000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>5.810000000000000e+02 2.073969458197532e-01 -9.167037636397817e-01 1.956172890509768e-01 -2.799546263551375e-01 1.930000000000000e-10 1.900000000000000e-11 -4.520000000000000e-11 4.920000000000000e-11 1.520000000000000e-11 2.970000000000000e-11 -1.510000000000000e-11 1.530000000000000e-10 -2.360000000000000e-11 6.950000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>5.820000000000000e+02 2.073561417223713e-01 -9.167283901352278e-01 1.956942788018970e-01 -2.798503858390961e-01 1.930000000000000e-10 1.900000000000000e-11 -4.520000000000000e-11 4.920000000000000e-11 1.520000000000000e-11 2.970000000000000e-11 -1.510000000000000e-11 1.530000000000000e-10 -2.360000000000000e-11 6.950000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>5.830000000000000e+02 2.073153361242422e-01 -9.167529983674073e-01 1.957712580066773e-01 -2.797461455150795e-01 1.930000000000000e-10 1.900000000000000e-11 -4.520000000000000e-11 4.920000000000000e-11 1.520000000000000e-11 2.970000000000000e-11 -1.510000000000000e-11 1.530000000000000e-10 -2.360000000000000e-11 6.950000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>5.840000000000000e+02 2.072745288276367e-01 -9.167775883070046e-01 1.958482267807345e-01 -2.796419055580109e-01 1.930000000000000e-10 1.900000000000000e-11 -4.520000000000000e-11 4.920000000000000e-11 1.520000000000000e-11 2.970000000000000e-11 -1.510000000000000e-11 1.530000000000000e-10 -2.360000000000000e-11 6.950000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>5.850000000000000e+02 2.072337196532762e-01 -9.168021599175269e-01 1.959251852728768e-01 -2.795376661292959e-01 1.930000000000000e-10 1.900000000000000e-11 -4.520000000000000e-11 4.920000000000000e-11 1.520000000000000e-11 2.970000000000000e-11 -1.510000000000000e-11 1.530000000000000e-10 -2.360000000000000e-11 6.950000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>5.860000000000000e+02 2.071929084452257e-01 -9.168267131606788e-01 1.960021336489276e-01 -2.794334273669903e-01 1.930000000000000e-10 1.890000000000000e-11 -4.530000000000000e-11 4.930000000000000e-11 1.520000000000000e-11 2.960000000000000e-11 -1.510000000000000e-11 1.530000000000000e-10 -2.360000000000000e-11 6.940000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.870000000000000e+02 2.071520950737109e-01 -9.168512480021772e-01 1.960790720741770e-01 -2.793291893768935e-01 1.930000000000000e-10 1.890000000000000e-11 -4.530000000000000e-11 4.930000000000000e-11 1.520000000000000e-11 2.960000000000000e-11 -1.510000000000000e-11 1.530000000000000e-10 -2.360000000000000e-11 6.940000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.880000000000000e+02 2.071112794360490e-01 -9.168757644169221e-01 1.961560006965973e-01 -2.792249522266306e-01 1.930000000000000e-10 1.890000000000000e-11 -4.530000000000000e-11 4.930000000000000e-11 1.520000000000000e-11 2.960000000000000e-11 -1.510000000000000e-11 1.530000000000000e-10 -2.360000000000000e-11 6.940000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.890000000000000e+02 2.070704614562775e-01 -9.169002623930337e-01 1.962329196332089e-01 -2.791207159422191e-01 1.930000000000000e-10 1.890000000000000e-11 -4.530000000000000e-11 4.930000000000000e-11 1.520000000000000e-11 2.960000000000000e-11 -1.510000000000000e-11 1.530000000000000e-10 -2.360000000000000e-11 6.940000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.900000000000000e+02 2.070296410836544e-01 -9.169247419342899e-01 1.963098289613296e-01 -2.790164805073040e-01 1.930000000000000e-10 1.890000000000000e-11 -4.530000000000000e-11 4.930000000000000e-11 1.520000000000000e-11 2.960000000000000e-11 -1.500000000000000e-11 1.530000000000000e-10 -2.360000000000000e-11 6.940000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.910000000000000e+02 2.069888611512369e-01 -9.169491891511464e-01 1.963867323608960e-01 -2.789122572189663e-01 1.930000000000000e-10 1.890000000000000e-11 -4.540000000000000e-11 4.930000000000000e-11 1.520000000000000e-11 2.960000000000000e-11 -1.500000000000000e-11 1.530000000000000e-10 -2.360000000000000e-11 6.940000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.920000000000000e+02 2.069480359318673e-01 -9.169736318995820e-01 1.964636225408664e-01 -2.788080232757880e-01 1.930000000000000e-10 1.890000000000000e-11 -4.540000000000000e-11 4.940000000000000e-11 1.520000000000000e-11 2.960000000000000e-11 -1.500000000000000e-11 1.530000000000000e-10 -2.360000000000000e-11 6.940000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.930000000000000e+02 2.069072082933734e-01 -9.169980563149668e-01 1.965405031048862e-01 -2.787037899098144e-01 1.930000000000000e-10 1.890000000000000e-11 -4.540000000000000e-11 4.940000000000000e-11 1.520000000000000e-11 2.960000000000000e-11 -1.500000000000000e-11 1.530000000000000e-10 -2.360000000000000e-11 6.940000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.940000000000000e+02 2.068663782538808e-01 -9.170224624526540e-01 1.966173739909519e-01 -2.785995569815130e-01 1.930000000000000e-10 1.890000000000000e-11 -4.540000000000000e-11 4.940000000000000e-11 1.520000000000000e-11 2.960000000000000e-11 -1.500000000000000e-11 1.530000000000000e-10 -2.360000000000000e-11 6.940000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.950000000000000e+02 2.068255458367831e-01 -9.170468503711329e-01 1.966942351244182e-01 -2.784953243458891e-01 1.930000000000000e-10 1.890000000000000e-11 -4.540000000000000e-11 4.940000000000000e-11 1.520000000000000e-11 2.960000000000000e-11 -1.500000000000000e-11 1.520000000000000e-10 -2.360000000000000e-11 6.940000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.960000000000000e+02 2.067847110650573e-01 -9.170712201272033e-01 1.967710864290042e-01 -2.783910918648315e-01 1.930000000000000e-10 1.880000000000000e-11 -4.550000000000000e-11 4.940000000000000e-11 1.520000000000000e-11 2.960000000000000e-11 -1.500000000000000e-11 1.520000000000000e-10 -2.360000000000000e-11 6.940000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.970000000000000e+02 2.067438739549096e-01 -9.170955717717038e-01 1.968479278360502e-01 -2.782868594193795e-01 1.930000000000000e-10 1.880000000000000e-11 -4.550000000000000e-11 4.940000000000000e-11 1.510000000000000e-11 2.960000000000000e-11 -1.500000000000000e-11 1.520000000000000e-10 -2.360000000000000e-11 6.940000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.980000000000000e+02 2.067030345119235e-01 -9.171199053458867e-01 1.969247592918639e-01 -2.781826269193606e-01 1.930000000000000e-10 1.880000000000000e-11 -4.550000000000000e-11 4.940000000000000e-11 1.510000000000000e-11 2.960000000000000e-11 -1.500000000000000e-11 1.520000000000000e-10 -2.360000000000000e-11 6.940000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.990000000000000e+02 2.066621927290031e-01 -9.171442208787636e-01 1.970015807605821e-01 -2.780783943116724e-01 1.930000000000000e-10 1.880000000000000e-11 -4.550000000000000e-11 4.950000000000000e-11 1.510000000000000e-11 2.960000000000000e-11 -1.500000000000000e-11 1.520000000000000e-10 -2.360000000000000e-11 6.940000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.000000000000000e+02 2.066213485874662e-01 -9.171685183855003e-01 1.970783922254113e-01 -2.779741615839322e-01 1.930000000000000e-10 1.880000000000000e-11 -4.560000000000000e-11 4.950000000000000e-11 1.510000000000000e-11 2.960000000000000e-11 -1.500000000000000e-11 1.520000000000000e-10 -2.360000000000000e-11 6.940000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.010000000000000e+02 2.065805364168351e-01 -9.171927867236679e-01 1.971551966562401e-01 -2.778699378976507e-01 1.930000000000000e-10 1.880000000000000e-11 -4.560000000000000e-11 4.950000000000000e-11 1.510000000000000e-11 2.960000000000000e-11 -1.490000000000000e-11 1.520000000000000e-10 -2.360000000000000e-11 6.930000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.020000000000000e+02 2.065396874795343e-01 -9.172170481679413e-01 1.972319881410343e-01 -2.777657050463211e-01 1.930000000000000e-10 1.880000000000000e-11 -4.560000000000000e-11 4.950000000000000e-11 1.510000000000000e-11 2.960000000000000e-11 -1.490000000000000e-11 1.520000000000000e-10 -2.360000000000000e-11 6.930000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.030000000000000e+02 2.064988361126767e-01 -9.172412915485728e-01 1.973087696797622e-01 -2.776614722461050e-01 1.930000000000000e-10 1.880000000000000e-11 -4.560000000000000e-11 4.950000000000000e-11 1.510000000000000e-11 2.960000000000000e-11 -1.490000000000000e-11 1.520000000000000e-10 -2.360000000000000e-11 6.930000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.040000000000000e+02 2.064579823160168e-01 -9.172655168301298e-01 1.973855413211930e-01 -2.775572395915729e-01 1.930000000000000e-10 1.870000000000000e-11 -4.560000000000000e-11 4.950000000000000e-11 1.510000000000000e-11 2.960000000000000e-11 -1.490000000000000e-11 1.520000000000000e-10 -2.360000000000000e-11 6.930000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.050000000000000e+02 2.064171261179741e-01 -9.172897239694791e-01 1.974623031263783e-01 -2.774530071727822e-01 1.940000000000000e-10 1.870000000000000e-11 -4.570000000000000e-11 4.950000000000000e-11 1.510000000000000e-11 2.960000000000000e-11 -1.490000000000000e-11 1.520000000000000e-10 -2.360000000000000e-11 6.930000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.060000000000000e+02 2.063762675828462e-01 -9.173139129190614e-01 1.975390551685905e-01 -2.773487750591214e-01 1.940000000000000e-10 1.870000000000000e-11 -4.570000000000000e-11 4.960000000000000e-11 1.510000000000000e-11 2.960000000000000e-11 -1.490000000000000e-11 1.520000000000000e-10 -2.360000000000000e-11 6.930000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.070000000000000e+02 2.063354068156576e-01 -9.173380836303324e-01 1.976157975336725e-01 -2.772445432840418e-01 1.940000000000000e-10 1.870000000000000e-11 -4.570000000000000e-11 4.960000000000000e-11 1.510000000000000e-11 2.960000000000000e-11 -1.490000000000000e-11 1.520000000000000e-10 -2.360000000000000e-11 6.930000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.080000000000000e+02 2.062945439622351e-01 -9.173622360572512e-01 1.976925303192113e-01 -2.771403118339903e-01 1.940000000000000e-10 1.870000000000000e-11 -4.570000000000000e-11 4.960000000000000e-11 1.510000000000000e-11 2.960000000000000e-11 -1.490000000000000e-11 1.520000000000000e-10 -2.360000000000000e-11 6.930000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.090000000000000e+02 2.062536792053908e-01 -9.173863701597305e-01 1.977692536329592e-01 -2.770360806408724e-01 1.940000000000000e-10 1.870000000000000e-11 -4.570000000000000e-11 4.960000000000000e-11 1.510000000000000e-11 2.960000000000000e-11 -1.490000000000000e-11 1.520000000000000e-10 -2.360000000000000e-11 6.930000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.100000000000000e+02 2.062128127577829e-01 -9.174104859065595e-01 1.978459675891347e-01 -2.769318495802406e-01 1.940000000000000e-10 1.870000000000000e-11 -4.580000000000000e-11 4.960000000000000e-11 1.510000000000000e-11 2.960000000000000e-11 -1.490000000000000e-11 1.520000000000000e-10 -2.360000000000000e-11 6.930000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.110000000000000e+02 2.061719798342692e-01 -9.174345719373196e-01 1.979226753721881e-01 -2.768276278100154e-01 1.940000000000000e-10 1.870000000000000e-11 -4.580000000000000e-11 4.960000000000000e-11 1.510000000000000e-11 2.960000000000000e-11 -1.490000000000000e-11 1.520000000000000e-10 -2.360000000000000e-11 6.930000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.120000000000000e+02 2.061311107137579e-01 -9.174586509262502e-01 1.979993709602723e-01 -2.767233964373701e-01 1.940000000000000e-10 1.860000000000000e-11 -4.580000000000000e-11 4.960000000000000e-11 1.500000000000000e-11 2.960000000000000e-11 -1.480000000000000e-11 1.520000000000000e-10 -2.360000000000000e-11 6.930000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.130000000000000e+02 2.060902406161317e-01 -9.174827115375017e-01 1.980760575191598e-01 -2.766191645389828e-01 1.940000000000000e-10 1.860000000000000e-11 -4.580000000000000e-11 4.970000000000000e-11 1.500000000000000e-11 2.960000000000000e-11 -1.480000000000000e-11 1.520000000000000e-10 -2.360000000000000e-11 6.930000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.140000000000000e+02 2.060493697668507e-01 -9.175067537893031e-01 1.981527351296349e-01 -2.765149318397542e-01 1.940000000000000e-10 1.860000000000000e-11 -4.590000000000000e-11 4.970000000000000e-11 1.500000000000000e-11 2.960000000000000e-11 -1.480000000000000e-11 1.520000000000000e-10 -2.360000000000000e-11 6.930000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.150000000000000e+02 2.060084983707846e-01 -9.175307777105833e-01 1.982294038459204e-01 -2.764106980630776e-01 1.940000000000000e-10 1.860000000000000e-11 -4.590000000000000e-11 4.970000000000000e-11 1.500000000000000e-11 2.960000000000000e-11 -1.480000000000000e-11 1.520000000000000e-10 -2.360000000000000e-11 6.930000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.160000000000000e+02 2.059676266066142e-01 -9.175547833380860e-01 1.983060636921268e-01 -2.763064629471602e-01 1.940000000000000e-10 1.860000000000000e-11 -4.590000000000000e-11 4.970000000000000e-11 1.500000000000000e-11 2.960000000000000e-11 -1.480000000000000e-11 1.520000000000000e-10 -2.360000000000000e-11 6.920000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.170000000000000e+02 2.059267546237383e-01 -9.175787707129375e-01 1.983827146606510e-01 -2.762022262599270e-01 1.940000000000000e-10 1.860000000000000e-11 -4.590000000000000e-11 4.970000000000000e-11 1.500000000000000e-11 2.960000000000000e-11 -1.480000000000000e-11 1.520000000000000e-10 -2.360000000000000e-11 6.920000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.180000000000000e+02 2.058858825413097e-01 -9.176027398769472e-01 1.984593567135607e-01 -2.760979878111126e-01 1.940000000000000e-10 1.860000000000000e-11 -4.590000000000000e-11 4.970000000000000e-11 1.500000000000000e-11 2.960000000000000e-11 -1.480000000000000e-11 1.510000000000000e-10 -2.360000000000000e-11 6.920000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.190000000000000e+02 2.058450104489463e-01 -9.176266908686110e-01 1.985359897873229e-01 -2.759937474617202e-01 1.940000000000000e-10 1.860000000000000e-11 -4.600000000000000e-11 4.970000000000000e-11 1.500000000000000e-11 2.960000000000000e-11 -1.480000000000000e-11 1.510000000000000e-10 -2.360000000000000e-11 6.920000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.200000000000000e+02 2.058041384086948e-01 -9.176506237194675e-01 1.986126137984336e-01 -2.758895051307340e-01 1.940000000000000e-10 1.860000000000000e-11 -4.600000000000000e-11 4.970000000000000e-11 1.500000000000000e-11 2.960000000000000e-11 -1.480000000000000e-11 1.510000000000000e-10 -2.360000000000000e-11 6.920000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.210000000000000e+02 2.057632958205930e-01 -9.176745289373023e-01 1.986892312675352e-01 -2.757852686621668e-01 1.940000000000000e-10 1.850000000000000e-11 -4.600000000000000e-11 4.980000000000000e-11 1.500000000000000e-11 2.960000000000000e-11 -1.480000000000000e-11 1.510000000000000e-10 -2.360000000000000e-11 6.920000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.220000000000000e+02 2.057224239734511e-01 -9.176984255593457e-01 1.987658368712464e-01 -2.756810223668991e-01 1.940000000000000e-10 1.850000000000000e-11 -4.600000000000000e-11 4.980000000000000e-11 1.500000000000000e-11 2.950000000000000e-11 -1.480000000000000e-11 1.510000000000000e-10 -2.360000000000000e-11 6.920000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.230000000000000e+02 2.056815522237266e-01 -9.177223040674155e-01 1.988424331306157e-01 -2.755767742004562e-01 1.940000000000000e-10 1.850000000000000e-11 -4.600000000000000e-11 4.980000000000000e-11 1.500000000000000e-11 2.950000000000000e-11 -1.470000000000000e-11 1.510000000000000e-10 -2.360000000000000e-11 6.920000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.240000000000000e+02 2.056406805472448e-01 -9.177461644451735e-01 1.989190199645699e-01 -2.754725243042830e-01 1.940000000000000e-10 1.850000000000000e-11 -4.610000000000000e-11 4.980000000000000e-11 1.500000000000000e-11 2.950000000000000e-11 -1.470000000000000e-11 1.510000000000000e-10 -2.360000000000000e-11 6.920000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.250000000000000e+02 2.055998089056101e-01 -9.177700066652581e-01 1.989955973054239e-01 -2.753682728577970e-01 1.940000000000000e-10 1.850000000000000e-11 -4.610000000000000e-11 4.980000000000000e-11 1.500000000000000e-11 2.950000000000000e-11 -1.470000000000000e-11 1.510000000000000e-10 -2.360000000000000e-11 6.920000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.260000000000000e+02 2.055589372495067e-01 -9.177938306921950e-01 1.990721651003146e-01 -2.752640200652333e-01 1.940000000000000e-10 1.850000000000000e-11 -4.610000000000000e-11 4.980000000000000e-11 1.500000000000000e-11 2.950000000000000e-11 -1.470000000000000e-11 1.510000000000000e-10 -2.360000000000000e-11 6.920000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.270000000000000e+02 2.055180655224563e-01 -9.178176364864615e-01 1.991487233102756e-01 -2.751597661399650e-01 1.940000000000000e-10 1.850000000000000e-11 -4.610000000000000e-11 4.990000000000000e-11 1.500000000000000e-11 2.950000000000000e-11 -1.470000000000000e-11 1.510000000000000e-10 -2.360000000000000e-11 6.920000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.280000000000000e+02 2.054771936649053e-01 -9.178414240089612e-01 1.992252719079752e-01 -2.750555112881600e-01 1.940000000000000e-10 1.850000000000000e-11 -4.620000000000000e-11 4.990000000000000e-11 1.490000000000000e-11 2.950000000000000e-11 -1.470000000000000e-11 1.510000000000000e-10 -2.360000000000000e-11 6.920000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.290000000000000e+02 2.054363216186834e-01 -9.178651932261594e-01 1.993018108733967e-01 -2.749512556913947e-01 1.940000000000000e-10 1.840000000000000e-11 -4.620000000000000e-11 4.990000000000000e-11 1.490000000000000e-11 2.950000000000000e-11 -1.470000000000000e-11 1.510000000000000e-10 -2.360000000000000e-11 6.920000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.300000000000000e+02 2.053954493307614e-01 -9.178889441146847e-01 1.993783401913558e-01 -2.748469994902328e-01 1.940000000000000e-10 1.840000000000000e-11 -4.620000000000000e-11 4.990000000000000e-11 1.490000000000000e-11 2.950000000000000e-11 -1.470000000000000e-11 1.510000000000000e-10 -2.360000000000000e-11 6.920000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.310000000000000e+02 2.053546104325411e-01 -9.179126657601328e-01 1.994548628926316e-01 -2.747427518237880e-01 1.940000000000000e-10 1.840000000000000e-11 -4.620000000000000e-11 4.990000000000000e-11 1.490000000000000e-11 2.950000000000000e-11 -1.470000000000000e-11 1.510000000000000e-10 -2.370000000000000e-11 6.910000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.320000000000000e+02 2.053137375381454e-01 -9.179363799796888e-01 1.995313728806317e-01 -2.746384946147794e-01 1.940000000000000e-10 1.840000000000000e-11 -4.620000000000000e-11 4.990000000000000e-11 1.490000000000000e-11 2.950000000000000e-11 -1.470000000000000e-11 1.510000000000000e-10 -2.360000000000000e-11 6.910000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.330000000000000e+02 2.052728642998436e-01 -9.179600758939552e-01 1.996078731849206e-01 -2.745342368621710e-01 1.940000000000000e-10 1.840000000000000e-11 -4.630000000000000e-11 4.990000000000000e-11 1.490000000000000e-11 2.950000000000000e-11 -1.470000000000000e-11 1.510000000000000e-10 -2.360000000000000e-11 6.910000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.340000000000000e+02 2.052319907003811e-01 -9.179837535462416e-01 1.996843637970387e-01 -2.744299784522160e-01 1.940000000000000e-10 1.840000000000000e-11 -4.630000000000000e-11 4.990000000000000e-11 1.490000000000000e-11 2.950000000000000e-11 -1.460000000000000e-11 1.510000000000000e-10 -2.360000000000000e-11 6.910000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.350000000000000e+02 2.051911167279737e-01 -9.180074129951029e-01 1.997608447126511e-01 -2.743257192128616e-01 1.940000000000000e-10 1.840000000000000e-11 -4.630000000000000e-11 5.000000000000000e-11 1.490000000000000e-11 2.950000000000000e-11 -1.460000000000000e-11 1.510000000000000e-10 -2.360000000000000e-11 6.910000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.360000000000000e+02 2.051502423701060e-01 -9.180310543108260e-01 1.998373159355193e-01 -2.742214589271376e-01 1.940000000000000e-10 1.840000000000000e-11 -4.630000000000000e-11 5.000000000000000e-11 1.490000000000000e-11 2.950000000000000e-11 -1.460000000000000e-11 1.510000000000000e-10 -2.370000000000000e-11 6.910000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.370000000000000e+02 2.051093676076473e-01 -9.180546775706143e-01 1.999137774808936e-01 -2.741171973511086e-01 1.940000000000000e-10 1.830000000000000e-11 -4.630000000000000e-11 5.000000000000000e-11 1.490000000000000e-11 2.950000000000000e-11 -1.460000000000000e-11 1.510000000000000e-10 -2.370000000000000e-11 6.910000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.380000000000000e+02 2.050684924095982e-01 -9.180782828530257e-01 1.999902293784036e-01 -2.740129342342579e-01 1.940000000000000e-10 1.830000000000000e-11 -4.640000000000000e-11 5.000000000000000e-11 1.490000000000000e-11 2.950000000000000e-11 -1.460000000000000e-11 1.510000000000000e-10 -2.370000000000000e-11 6.910000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.390000000000000e+02 2.050276167290923e-01 -9.181018702324626e-01 2.000666716736144e-01 -2.739086693397735e-01 1.940000000000000e-10 1.830000000000000e-11 -4.640000000000000e-11 5.000000000000000e-11 1.490000000000000e-11 2.950000000000000e-11 -1.460000000000000e-11 1.510000000000000e-10 -2.360000000000000e-11 6.910000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.400000000000000e+02 2.049867404993994e-01 -9.181254397740584e-01 2.001431044290376e-01 -2.738044024639325e-01 1.940000000000000e-10 1.830000000000000e-11 -4.640000000000000e-11 5.000000000000000e-11 1.490000000000000e-11 2.950000000000000e-11 -1.460000000000000e-11 1.510000000000000e-10 -2.360000000000000e-11 6.910000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.410000000000000e+02 2.049458999434498e-01 -9.181489797782654e-01 2.002195310543179e-01 -2.737001432460144e-01 1.940000000000000e-10 1.830000000000000e-11 -4.640000000000000e-11 5.000000000000000e-11 1.490000000000000e-11 2.950000000000000e-11 -1.460000000000000e-11 1.500000000000000e-10 -2.370000000000000e-11 6.910000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.420000000000000e+02 2.049050223449134e-01 -9.181725137827438e-01 2.002959449862906e-01 -2.735958719969228e-01 1.940000000000000e-10 1.830000000000000e-11 -4.650000000000000e-11 5.010000000000000e-11 1.490000000000000e-11 2.950000000000000e-11 -1.460000000000000e-11 1.500000000000000e-10 -2.370000000000000e-11 6.910000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.430000000000000e+02 2.048641438958001e-01 -9.181960300501502e-01 2.003723496612479e-01 -2.734915984764710e-01 1.940000000000000e-10 1.830000000000000e-11 -4.650000000000000e-11 5.010000000000000e-11 1.490000000000000e-11 2.950000000000000e-11 -1.460000000000000e-11 1.500000000000000e-10 -2.370000000000000e-11 6.910000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.440000000000000e+02 2.048232644752784e-01 -9.182195285775494e-01 2.004487451963888e-01 -2.733873227084728e-01 1.940000000000000e-10 1.830000000000000e-11 -4.650000000000000e-11 5.010000000000000e-11 1.480000000000000e-11 2.950000000000000e-11 -1.460000000000000e-11 1.500000000000000e-10 -2.370000000000000e-11 6.910000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.450000000000000e+02 2.047823839648886e-01 -9.182430093443560e-01 2.005251317141901e-01 -2.732830447702247e-01 1.940000000000000e-10 1.830000000000000e-11 -4.650000000000000e-11 5.010000000000000e-11 1.480000000000000e-11 2.950000000000000e-11 -1.450000000000000e-11 1.500000000000000e-10 -2.360000000000000e-11 6.910000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.460000000000000e+02 2.047415022540329e-01 -9.182664723153487e-01 2.006015093387917e-01 -2.731787647810227e-01 1.940000000000000e-10 1.820000000000000e-11 -4.650000000000000e-11 5.010000000000000e-11 1.480000000000000e-11 2.950000000000000e-11 -1.450000000000000e-11 1.500000000000000e-10 -2.370000000000000e-11 6.899999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>6.470000000000000e+02 2.047006192442798e-01 -9.182899174443450e-01 2.006778781930176e-01 -2.730744828888538e-01 1.940000000000000e-10 1.820000000000000e-11 -4.660000000000000e-11 5.010000000000000e-11 1.480000000000000e-11 2.950000000000000e-11 -1.450000000000000e-11 1.500000000000000e-10 -2.370000000000000e-11 6.899999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>6.480000000000000e+02 2.046597348508542e-01 -9.183133446788961e-01 2.007542383959454e-01 -2.729701992553417e-01 1.940000000000000e-10 1.820000000000000e-11 -4.660000000000000e-11 5.010000000000000e-11 1.480000000000000e-11 2.950000000000000e-11 -1.450000000000000e-11 1.500000000000000e-10 -2.370000000000000e-11 6.899999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>6.490000000000000e+02 2.046188490004509e-01 -9.183367539651520e-01 2.008305900610036e-01 -2.728659140424615e-01 1.940000000000000e-10 1.820000000000000e-11 -4.660000000000000e-11 5.020000000000000e-11 1.480000000000000e-11 2.950000000000000e-11 -1.450000000000000e-11 1.500000000000000e-10 -2.370000000000000e-11 6.899999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>6.500000000000000e+02 2.045779616262418e-01 -9.183601452529216e-01 2.009069332955264e-01 -2.727616273995878e-01 1.940000000000000e-10 1.820000000000000e-11 -4.660000000000000e-11 5.020000000000000e-11 1.480000000000000e-11 2.950000000000000e-11 -1.450000000000000e-11 1.500000000000000e-10 -2.370000000000000e-11 6.899999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>6.510000000000000e+02 2.045371063876368e-01 -9.183835075901949e-01 2.009832713413696e-01 -2.726573485857741e-01 1.940000000000000e-10 1.820000000000000e-11 -4.660000000000000e-11 5.020000000000000e-11 1.480000000000000e-11 2.950000000000000e-11 -1.450000000000000e-11 1.500000000000000e-10 -2.370000000000000e-11 6.899999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>6.520000000000000e+02 2.044962157560330e-01 -9.184068627654151e-01 2.010595980231706e-01 -2.725530594390955e-01 1.940000000000000e-10 1.820000000000000e-11 -4.670000000000000e-11 5.020000000000000e-11 1.480000000000000e-11 2.950000000000000e-11 -1.450000000000000e-11 1.500000000000000e-10 -2.370000000000000e-11 6.899999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>6.530000000000000e+02 2.044553233681914e-01 -9.184301998500842e-01 2.011359165749080e-01 -2.724487691536055e-01 1.940000000000000e-10 1.810000000000000e-11 -4.670000000000000e-11 5.020000000000000e-11 1.480000000000000e-11 2.950000000000000e-11 -1.450000000000000e-11 1.500000000000000e-10 -2.370000000000000e-11 6.899999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>6.540000000000000e+02 2.044144291153950e-01 -9.184535188398562e-01 2.012122270952132e-01 -2.723444777620752e-01 1.940000000000000e-10 1.810000000000000e-11 -4.670000000000000e-11 5.020000000000000e-11 1.480000000000000e-11 2.950000000000000e-11 -1.450000000000000e-11 1.500000000000000e-10 -2.370000000000000e-11 6.899999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>6.550000000000000e+02 2.043735328727030e-01 -9.184768197426889e-01 2.012885296839018e-01 -2.722401852669427e-01 1.940000000000000e-10 1.810000000000000e-11 -4.670000000000000e-11 5.020000000000000e-11 1.480000000000000e-11 2.950000000000000e-11 -1.450000000000000e-11 1.500000000000000e-10 -2.370000000000000e-11 6.899999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>6.560000000000000e+02 2.043326345031643e-01 -9.185001025767507e-01 2.013648244426946e-01 -2.721358916436003e-01 1.940000000000000e-10 1.810000000000000e-11 -4.680000000000000e-11 5.030000000000000e-11 1.480000000000000e-11 2.950000000000000e-11 -1.440000000000000e-11 1.500000000000000e-10 -2.370000000000000e-11 6.899999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>6.570000000000000e+02 2.042917338659315e-01 -9.185233673668826e-01 2.014411114750794e-01 -2.720315968462844e-01 1.940000000000000e-10 1.810000000000000e-11 -4.680000000000000e-11 5.030000000000000e-11 1.480000000000000e-11 2.950000000000000e-11 -1.440000000000000e-11 1.500000000000000e-10 -2.370000000000000e-11 6.899999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>6.580000000000000e+02 2.042508308269726e-01 -9.185466141411022e-01 2.015173908833368e-01 -2.719273008139880e-01 1.940000000000000e-10 1.810000000000000e-11 -4.680000000000000e-11 5.030000000000000e-11 1.480000000000000e-11 2.950000000000000e-11 -1.440000000000000e-11 1.500000000000000e-10 -2.370000000000000e-11 6.899999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>6.590000000000000e+02 2.042099252708324e-01 -9.185698429266660e-01 2.015936627651479e-01 -2.718230034774339e-01 1.940000000000000e-10 1.810000000000000e-11 -4.680000000000000e-11 5.030000000000000e-11 1.470000000000000e-11 2.950000000000000e-11 -1.440000000000000e-11 1.500000000000000e-10 -2.370000000000000e-11 6.890000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.600000000000000e+02 2.041690171086266e-01 -9.185930537473942e-01 2.016699272076612e-01 -2.717187047665122e-01 1.940000000000000e-10 1.810000000000000e-11 -4.680000000000000e-11 5.030000000000000e-11 1.470000000000000e-11 2.950000000000000e-11 -1.440000000000000e-11 1.500000000000000e-10 -2.370000000000000e-11 6.890000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.610000000000000e+02 2.041281393798777e-01 -9.186162359217985e-01 2.017461874069010e-01 -2.716144136104625e-01 1.940000000000000e-10 1.800000000000000e-11 -4.690000000000000e-11 5.030000000000000e-11 1.470000000000000e-11 2.940000000000000e-11 -1.440000000000000e-11 1.500000000000000e-10 -2.370000000000000e-11 6.890000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.620000000000000e+02 2.040872258657944e-01 -9.186394108631240e-01 2.018224371667000e-01 -2.715101119729250e-01 1.950000000000000e-10 1.800000000000000e-11 -4.690000000000000e-11 5.030000000000000e-11 1.470000000000000e-11 2.940000000000000e-11 -1.440000000000000e-11 1.500000000000000e-10 -2.370000000000000e-11 6.890000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.630000000000000e+02 2.040463096647783e-01 -9.186625678778350e-01 2.018986796308216e-01 -2.714058088096469e-01 1.950000000000000e-10 1.800000000000000e-11 -4.690000000000000e-11 5.030000000000000e-11 1.470000000000000e-11 2.940000000000000e-11 -1.440000000000000e-11 1.500000000000000e-10 -2.370000000000000e-11 6.890000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.640000000000000e+02 2.040053907943298e-01 -9.186857069707950e-01 2.019749147876417e-01 -2.713015041074198e-01 1.950000000000000e-10 1.800000000000000e-11 -4.690000000000000e-11 5.040000000000000e-11 1.470000000000000e-11 2.940000000000000e-11 -1.440000000000000e-11 1.500000000000000e-10 -2.370000000000000e-11 6.890000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.650000000000000e+02 2.039644692775023e-01 -9.187088281470579e-01 2.020511425869723e-01 -2.711971978769432e-01 1.950000000000000e-10 1.800000000000000e-11 -4.690000000000000e-11 5.040000000000000e-11 1.470000000000000e-11 2.940000000000000e-11 -1.440000000000000e-11 1.490000000000000e-10 -2.370000000000000e-11 6.890000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.660000000000000e+02 2.039235451299880e-01 -9.187319314152255e-01 2.021273629376846e-01 -2.710928901530343e-01 1.950000000000000e-10 1.800000000000000e-11 -4.700000000000000e-11 5.040000000000000e-11 1.470000000000000e-11 2.940000000000000e-11 -1.430000000000000e-11 1.490000000000000e-10 -2.370000000000000e-11 6.890000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.670000000000000e+02 2.038826183478741e-01 -9.187550167910952e-01 2.022035757060678e-01 -2.709885809927978e-01 1.950000000000000e-10 1.800000000000000e-11 -4.700000000000000e-11 5.040000000000000e-11 1.470000000000000e-11 2.940000000000000e-11 -1.430000000000000e-11 1.490000000000000e-10 -2.370000000000000e-11 6.890000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.680000000000000e+02 2.038416889004520e-01 -9.187780843002230e-01 2.022797807162458e-01 -2.708842704721173e-01 1.950000000000000e-10 1.800000000000000e-11 -4.700000000000000e-11 5.040000000000000e-11 1.470000000000000e-11 2.940000000000000e-11 -1.430000000000000e-11 1.490000000000000e-10 -2.370000000000000e-11 6.890000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.690000000000000e+02 2.038007567267231e-01 -9.188011339799174e-01 2.023559777517268e-01 -2.707799586804306e-01 1.950000000000000e-10 1.800000000000000e-11 -4.700000000000000e-11 5.040000000000000e-11 1.470000000000000e-11 2.940000000000000e-11 -1.430000000000000e-11 1.490000000000000e-10 -2.370000000000000e-11 6.890000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.700000000000000e+02 2.037598217358180e-01 -9.188241658799829e-01 2.024321665587740e-01 -2.706756457154247e-01 1.950000000000000e-10 1.790000000000000e-11 -4.700000000000000e-11 5.040000000000000e-11 1.470000000000000e-11 2.940000000000000e-11 -1.430000000000000e-11 1.490000000000000e-10 -2.370000000000000e-11 6.890000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.710000000000000e+02 2.037189213173530e-01 -9.188471679439457e-01 2.025083504433304e-01 -2.705713419033984e-01 1.950000000000000e-10 1.790000000000000e-11 -4.710000000000000e-11 5.050000000000000e-11 1.470000000000000e-11 2.940000000000000e-11 -1.430000000000000e-11 1.490000000000000e-10 -2.370000000000000e-11 6.880000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.720000000000000e+02 2.036779803303213e-01 -9.188701644811863e-01 2.025845219182164e-01 -2.704670268887625e-01 1.950000000000000e-10 1.790000000000000e-11 -4.710000000000000e-11 5.050000000000000e-11 1.470000000000000e-11 2.940000000000000e-11 -1.430000000000000e-11 1.490000000000000e-10 -2.370000000000000e-11 6.880000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.730000000000000e+02 2.036370361411783e-01 -9.188931434518828e-01 2.026606842467611e-01 -2.703627109817265e-01 1.950000000000000e-10 1.790000000000000e-11 -4.710000000000000e-11 5.050000000000000e-11 1.470000000000000e-11 2.940000000000000e-11 -1.430000000000000e-11 1.490000000000000e-10 -2.370000000000000e-11 6.880000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.740000000000000e+02 2.035960886145241e-01 -9.189161049392778e-01 2.027368371011060e-01 -2.702583942569275e-01 1.950000000000000e-10 1.790000000000000e-11 -4.710000000000000e-11 5.050000000000000e-11 1.470000000000000e-11 2.940000000000000e-11 -1.430000000000000e-11 1.490000000000000e-10 -2.370000000000000e-11 6.880000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.750000000000000e+02 2.035551376290850e-01 -9.189390490257304e-01 2.028129801613671e-01 -2.701540767757454e-01 1.950000000000000e-10 1.790000000000000e-11 -4.710000000000000e-11 5.050000000000000e-11 1.460000000000000e-11 2.940000000000000e-11 -1.430000000000000e-11 1.490000000000000e-10 -2.370000000000000e-11 6.880000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.760000000000000e+02 2.035141830870780e-01 -9.189619757880040e-01 2.028891131296686e-01 -2.700497585847175e-01 1.950000000000000e-10 1.790000000000000e-11 -4.720000000000000e-11 5.050000000000000e-11 1.460000000000000e-11 2.940000000000000e-11 -1.430000000000000e-11 1.490000000000000e-10 -2.370000000000000e-11 6.880000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.770000000000000e+02 2.034732249208674e-01 -9.189848852929112e-01 2.029652357436448e-01 -2.699454397151462e-01 1.950000000000000e-10 1.780000000000000e-11 -4.720000000000000e-11 5.050000000000000e-11 1.460000000000000e-11 2.940000000000000e-11 -1.420000000000000e-11 1.490000000000000e-10 -2.370000000000000e-11 6.880000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.780000000000000e+02 2.034322630995917e-01 -9.190077775930996e-01 2.030413477881831e-01 -2.698411201835788e-01 1.950000000000000e-10 1.780000000000000e-11 -4.720000000000000e-11 5.060000000000000e-11 1.460000000000000e-11 2.940000000000000e-11 -1.420000000000000e-11 1.490000000000000e-10 -2.370000000000000e-11 6.880000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.790000000000000e+02 2.033912976336521e-01 -9.190306527242180e-01 2.031174491043840e-01 -2.697367999912605e-01 1.950000000000000e-10 1.780000000000000e-11 -4.720000000000000e-11 5.060000000000000e-11 1.460000000000000e-11 2.940000000000000e-11 -1.420000000000000e-11 1.490000000000000e-10 -2.370000000000000e-11 6.880000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.800000000000000e+02 2.033503285778989e-01 -9.190535107028714e-01 2.031935395945342e-01 -2.696324791248865e-01 1.950000000000000e-10 1.780000000000000e-11 -4.730000000000000e-11 5.060000000000000e-11 1.460000000000000e-11 2.940000000000000e-11 -1.420000000000000e-11 1.490000000000000e-10 -2.370000000000000e-11 6.880000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.810000000000000e+02 2.033093801895025e-01 -9.190763437250157e-01 2.032696215673147e-01 -2.695281641682328e-01 1.950000000000000e-10 1.780000000000000e-11 -4.730000000000000e-11 5.060000000000000e-11 1.460000000000000e-11 2.940000000000000e-11 -1.420000000000000e-11 1.490000000000000e-10 -2.370000000000000e-11 6.870000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>6.820000000000000e+02 2.032684042986552e-01 -9.190991673727983e-01 2.033456903543852e-01 -2.694238418603782e-01 1.950000000000000e-10 1.780000000000000e-11 -4.730000000000000e-11 5.060000000000000e-11 1.460000000000000e-11 2.940000000000000e-11 -1.420000000000000e-11 1.490000000000000e-10 -2.370000000000000e-11 6.870000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>6.830000000000000e+02 2.032274252492234e-01 -9.191219738086027e-01 2.034217483640325e-01 -2.693195187528558e-01 1.950000000000000e-10 1.780000000000000e-11 -4.730000000000000e-11 5.060000000000000e-11 1.460000000000000e-11 2.940000000000000e-11 -1.420000000000000e-11 1.490000000000000e-10 -2.370000000000000e-11 6.870000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>6.840000000000000e+02 2.031864432614503e-01 -9.191447629857551e-01 2.034977956904161e-01 -2.692151947787555e-01 1.950000000000000e-10 1.780000000000000e-11 -4.730000000000000e-11 5.060000000000000e-11 1.460000000000000e-11 2.940000000000000e-11 -1.420000000000000e-11 1.490000000000000e-10 -2.370000000000000e-11 6.870000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>6.850000000000000e+02 2.031454585833190e-01 -9.191675348509604e-01 2.035738324394394e-01 -2.691108698638927e-01 1.950000000000000e-10 1.780000000000000e-11 -4.740000000000000e-11 5.060000000000000e-11 1.460000000000000e-11 2.940000000000000e-11 -1.420000000000000e-11 1.490000000000000e-10 -2.370000000000000e-11 6.870000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>6.860000000000000e+02 2.031044714801959e-01 -9.191902893499001e-01 2.036498587102226e-01 -2.690065439295184e-01 1.950000000000000e-10 1.770000000000000e-11 -4.740000000000000e-11 5.070000000000000e-11 1.460000000000000e-11 2.940000000000000e-11 -1.420000000000000e-11 1.490000000000000e-10 -2.370000000000000e-11 6.870000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>6.870000000000000e+02 2.030634822243564e-01 -9.192130264318931e-01 2.037258745785049e-01 -2.689022168968891e-01 1.950000000000000e-10 1.770000000000000e-11 -4.740000000000000e-11 5.070000000000000e-11 1.460000000000000e-11 2.940000000000000e-11 -1.420000000000000e-11 1.490000000000000e-10 -2.370000000000000e-11 6.870000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>6.880000000000000e+02 2.030224910855694e-01 -9.192357460534030e-01 2.038018800848331e-01 -2.687978886913752e-01 1.950000000000000e-10 1.770000000000000e-11 -4.740000000000000e-11 5.070000000000000e-11 1.460000000000000e-11 2.940000000000000e-11 -1.410000000000000e-11 1.480000000000000e-10 -2.370000000000000e-11 6.870000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>6.890000000000000e+02 2.029814983238329e-01 -9.192584481802956e-01 2.038778752274818e-01 -2.686935592456474e-01 1.950000000000000e-10 1.770000000000000e-11 -4.740000000000000e-11 5.070000000000000e-11 1.460000000000000e-11 2.940000000000000e-11 -1.410000000000000e-11 1.480000000000000e-10 -2.370000000000000e-11 6.870000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>6.900000000000000e+02 2.029405041841254e-01 -9.192811327889208e-01 2.039538599612854e-01 -2.685892285008913e-01 1.950000000000000e-10 1.770000000000000e-11 -4.750000000000000e-11 5.070000000000000e-11 1.460000000000000e-11 2.940000000000000e-11 -1.410000000000000e-11 1.480000000000000e-10 -2.370000000000000e-11 6.870000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>6.910000000000000e+02 2.028995541179263e-01 -9.193037852689074e-01 2.040298386552564e-01 -2.684849088260182e-01 1.950000000000000e-10 1.770000000000000e-11 -4.750000000000000e-11 5.070000000000000e-11 1.450000000000000e-11 2.940000000000000e-11 -1.410000000000000e-11 1.480000000000000e-10 -2.370000000000000e-11 6.860000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.920000000000000e+02 2.028585578963082e-01 -9.193264348072591e-01 2.041058023037717e-01 -2.683805753379671e-01 1.950000000000000e-10 1.770000000000000e-11 -4.750000000000000e-11 5.070000000000000e-11 1.450000000000000e-11 2.940000000000000e-11 -1.410000000000000e-11 1.480000000000000e-10 -2.370000000000000e-11 6.860000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.930000000000000e+02 2.028175609438579e-01 -9.193490668039136e-01 2.041817552358375e-01 -2.682762404097132e-01 1.950000000000000e-10 1.760000000000000e-11 -4.750000000000000e-11 5.080000000000000e-11 1.450000000000000e-11 2.940000000000000e-11 -1.410000000000000e-11 1.480000000000000e-10 -2.370000000000000e-11 6.860000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.940000000000000e+02 2.027765634562881e-01 -9.193716812591618e-01 2.042576973386960e-01 -2.681719039896869e-01 1.950000000000000e-10 1.760000000000000e-11 -4.760000000000000e-11 5.080000000000000e-11 1.450000000000000e-11 2.940000000000000e-11 -1.410000000000000e-11 1.480000000000000e-10 -2.370000000000000e-11 6.860000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.950000000000000e+02 2.027355656262566e-01 -9.193942781729627e-01 2.043336285213083e-01 -2.680675660133740e-01 1.950000000000000e-10 1.760000000000000e-11 -4.760000000000000e-11 5.080000000000000e-11 1.450000000000000e-11 2.940000000000000e-11 -1.410000000000000e-11 1.480000000000000e-10 -2.370000000000000e-11 6.860000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.960000000000000e+02 2.026945676449032e-01 -9.194168575437328e-01 2.044095487280499e-01 -2.679632263958027e-01 1.950000000000000e-10 1.760000000000000e-11 -4.760000000000000e-11 5.080000000000000e-11 1.450000000000000e-11 2.930000000000000e-11 -1.410000000000000e-11 1.480000000000000e-10 -2.370000000000000e-11 6.860000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.970000000000000e+02 2.026535696997324e-01 -9.194394193679104e-01 2.044854579493932e-01 -2.678588850263937e-01 1.950000000000000e-10 1.760000000000000e-11 -4.760000000000000e-11 5.080000000000000e-11 1.450000000000000e-11 2.930000000000000e-11 -1.410000000000000e-11 1.480000000000000e-10 -2.370000000000000e-11 6.860000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.980000000000000e+02 2.026125719702950e-01 -9.194619636410025e-01 2.045613562259794e-01 -2.677545417654044e-01 1.950000000000000e-10 1.760000000000000e-11 -4.760000000000000e-11 5.080000000000000e-11 1.450000000000000e-11 2.930000000000000e-11 -1.410000000000000e-11 1.480000000000000e-10 -2.370000000000000e-11 6.860000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.990000000000000e+02 2.025715746211443e-01 -9.194844903589223e-01 2.046372436480008e-01 -2.676501964450089e-01 1.950000000000000e-10 1.760000000000000e-11 -4.770000000000000e-11 5.080000000000000e-11 1.450000000000000e-11 2.930000000000000e-11 -1.400000000000000e-11 1.480000000000000e-10 -2.370000000000000e-11 6.860000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.000000000000000e+02 2.025305777930677e-01 -9.195069995203032e-01 2.047131203500201e-01 -2.675458488718024e-01 1.950000000000000e-10 1.760000000000000e-11 -4.770000000000000e-11 5.080000000000000e-11 1.450000000000000e-11 2.930000000000000e-11 -1.400000000000000e-11 1.480000000000000e-10 -2.370000000000000e-11 6.860000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.010000000000000e+02 2.024896106598300e-01 -9.195294817524393e-01 2.047889894013712e-01 -2.674415068438067e-01 1.950000000000000e-10 1.750000000000000e-11 -4.770000000000000e-11 5.090000000000000e-11 1.450000000000000e-11 2.930000000000000e-11 -1.400000000000000e-11 1.480000000000000e-10 -2.370000000000000e-11 6.860000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.020000000000000e+02 2.024486151692182e-01 -9.195519558151065e-01 2.048648452000430e-01 -2.673371541216083e-01 1.950000000000000e-10 1.750000000000000e-11 -4.770000000000000e-11 5.090000000000000e-11 1.450000000000000e-11 2.930000000000000e-11 -1.400000000000000e-11 1.480000000000000e-10 -2.370000000000000e-11 6.860000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.030000000000000e+02 2.024076204187637e-01 -9.195744123460294e-01 2.049406908485491e-01 -2.672327984911054e-01 1.950000000000000e-10 1.750000000000000e-11 -4.780000000000000e-11 5.090000000000000e-11 1.450000000000000e-11 2.930000000000000e-11 -1.400000000000000e-11 1.480000000000000e-10 -2.370000000000000e-11 6.850000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.040000000000000e+02 2.023666264072428e-01 -9.195968513641719e-01 2.050165265508740e-01 -2.671284397413867e-01 1.950000000000000e-10 1.750000000000000e-11 -4.780000000000000e-11 5.090000000000000e-11 1.450000000000000e-11 2.930000000000000e-11 -1.400000000000000e-11 1.480000000000000e-10 -2.370000000000000e-11 6.850000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.050000000000000e+02 2.023256331031492e-01 -9.196192728922212e-01 2.050923524971602e-01 -2.670240776817192e-01 1.950000000000000e-10 1.750000000000000e-11 -4.780000000000000e-11 5.090000000000000e-11 1.450000000000000e-11 2.930000000000000e-11 -1.400000000000000e-11 1.480000000000000e-10 -2.370000000000000e-11 6.850000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.060000000000000e+02 2.022846404545959e-01 -9.196416769541382e-01 2.051681688559620e-01 -2.669197121484795e-01 1.950000000000000e-10 1.750000000000000e-11 -4.780000000000000e-11 5.090000000000000e-11 1.440000000000000e-11 2.930000000000000e-11 -1.400000000000000e-11 1.480000000000000e-10 -2.370000000000000e-11 6.850000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.070000000000000e+02 2.022436483989501e-01 -9.196640635735607e-01 2.052439757673269e-01 -2.668153430087342e-01 1.950000000000000e-10 1.750000000000000e-11 -4.780000000000000e-11 5.100000000000000e-11 1.440000000000000e-11 2.930000000000000e-11 -1.400000000000000e-11 1.480000000000000e-10 -2.370000000000000e-11 6.850000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.080000000000000e+02 2.022026568736133e-01 -9.196864327719192e-01 2.053197733392179e-01 -2.667109701614207e-01 1.950000000000000e-10 1.750000000000000e-11 -4.790000000000000e-11 5.100000000000000e-11 1.440000000000000e-11 2.930000000000000e-11 -1.400000000000000e-11 1.480000000000000e-10 -2.370000000000000e-11 6.850000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.090000000000000e+02 2.021616658239828e-01 -9.197087845675304e-01 2.053955616475283e-01 -2.666065935345274e-01 1.950000000000000e-10 1.740000000000000e-11 -4.790000000000000e-11 5.100000000000000e-11 1.440000000000000e-11 2.930000000000000e-11 -1.400000000000000e-11 1.480000000000000e-10 -2.370000000000000e-11 6.850000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.100000000000000e+02 2.021206752075700e-01 -9.197311189759080e-01 2.054713407363417e-01 -2.665022130808123e-01 1.950000000000000e-10 1.740000000000000e-11 -4.790000000000000e-11 5.100000000000000e-11 1.440000000000000e-11 2.930000000000000e-11 -1.390000000000000e-11 1.480000000000000e-10 -2.370000000000000e-11 6.850000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.110000000000000e+02 2.020797193736983e-01 -9.197534249263574e-01 2.055471140981055e-01 -2.663978382795612e-01 1.950000000000000e-10 1.740000000000000e-11 -4.790000000000000e-11 5.100000000000000e-11 1.440000000000000e-11 2.930000000000000e-11 -1.390000000000000e-11 1.470000000000000e-10 -2.380000000000000e-11 6.850000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.120000000000000e+02 2.020387295506398e-01 -9.197757245996806e-01 2.056228747789345e-01 -2.662934501003407e-01 1.950000000000000e-10 1.740000000000000e-11 -4.800000000000000e-11 5.100000000000000e-11 1.440000000000000e-11 2.930000000000000e-11 -1.390000000000000e-11 1.470000000000000e-10 -2.370000000000000e-11 6.850000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.130000000000000e+02 2.019977401042129e-01 -9.197980069232267e-01 2.056986262294430e-01 -2.661890580399026e-01 1.950000000000000e-10 1.740000000000000e-11 -4.800000000000000e-11 5.100000000000000e-11 1.440000000000000e-11 2.930000000000000e-11 -1.390000000000000e-11 1.470000000000000e-10 -2.370000000000000e-11 6.840000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.140000000000000e+02 2.019567510220833e-01 -9.198202719111060e-01 2.057743684172243e-01 -2.660846620917403e-01 1.950000000000000e-10 1.740000000000000e-11 -4.800000000000000e-11 5.100000000000000e-11 1.440000000000000e-11 2.930000000000000e-11 -1.390000000000000e-11 1.470000000000000e-10 -2.370000000000000e-11 6.840000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.150000000000000e+02 2.019157622856266e-01 -9.198425195797206e-01 2.058501013049270e-01 -2.659802622500338e-01 1.950000000000000e-10 1.740000000000000e-11 -4.800000000000000e-11 5.110000000000000e-11 1.440000000000000e-11 2.930000000000000e-11 -1.390000000000000e-11 1.470000000000000e-10 -2.370000000000000e-11 6.840000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.160000000000000e+02 2.018747738657819e-01 -9.198647499477696e-01 2.059258248568156e-01 -2.658758585077009e-01 1.950000000000000e-10 1.740000000000000e-11 -4.800000000000000e-11 5.110000000000000e-11 1.440000000000000e-11 2.930000000000000e-11 -1.390000000000000e-11 1.470000000000000e-10 -2.380000000000000e-11 6.840000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.170000000000000e+02 2.018337857223981e-01 -9.198869630358730e-01 2.060015390426414e-01 -2.657714508551783e-01 1.950000000000000e-10 1.730000000000000e-11 -4.810000000000000e-11 5.110000000000000e-11 1.440000000000000e-11 2.930000000000000e-11 -1.390000000000000e-11 1.470000000000000e-10 -2.380000000000000e-11 6.840000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.180000000000000e+02 2.017927978073676e-01 -9.199091588658508e-01 2.060772438402661e-01 -2.656670392784872e-01 1.950000000000000e-10 1.730000000000000e-11 -4.810000000000000e-11 5.110000000000000e-11 1.440000000000000e-11 2.930000000000000e-11 -1.390000000000000e-11 1.470000000000000e-10 -2.380000000000000e-11 6.840000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.190000000000000e+02 2.017518100746440e-01 -9.199313374600879e-01 2.061529392335252e-01 -2.655626237554469e-01 1.950000000000000e-10 1.730000000000000e-11 -4.810000000000000e-11 5.110000000000000e-11 1.440000000000000e-11 2.930000000000000e-11 -1.390000000000000e-11 1.470000000000000e-10 -2.370000000000000e-11 6.840000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.200000000000000e+02 2.017108224927356e-01 -9.199534988413858e-01 2.062286252076712e-01 -2.654582042502180e-01 1.950000000000000e-10 1.730000000000000e-11 -4.810000000000000e-11 5.110000000000000e-11 1.440000000000000e-11 2.930000000000000e-11 -1.390000000000000e-11 1.470000000000000e-10 -2.370000000000000e-11 6.840000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.210000000000000e+02 2.016698687514061e-01 -9.199756321781414e-01 2.063043051913728e-01 -2.653537900534392e-01 1.950000000000000e-10 1.730000000000000e-11 -4.810000000000000e-11 5.110000000000000e-11 1.430000000000000e-11 2.930000000000000e-11 -1.380000000000000e-11 1.470000000000000e-10 -2.380000000000000e-11 6.840000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.220000000000000e+02 2.016288815315399e-01 -9.199977592099400e-01 2.063799722407439e-01 -2.652493623723523e-01 1.950000000000000e-10 1.730000000000000e-11 -4.820000000000000e-11 5.120000000000000e-11 1.430000000000000e-11 2.930000000000000e-11 -1.380000000000000e-11 1.470000000000000e-10 -2.380000000000000e-11 6.840000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.230000000000000e+02 2.015878946553503e-01 -9.200198691134613e-01 2.064556297202230e-01 -2.651449304091993e-01 1.950000000000000e-10 1.730000000000000e-11 -4.820000000000000e-11 5.120000000000000e-11 1.430000000000000e-11 2.930000000000000e-11 -1.380000000000000e-11 1.470000000000000e-10 -2.380000000000000e-11 6.830000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.240000000000000e+02 2.015469083607520e-01 -9.200419619321649e-01 2.065312774852862e-01 -2.650404939523980e-01 1.950000000000000e-10 1.730000000000000e-11 -4.820000000000000e-11 5.120000000000000e-11 1.430000000000000e-11 2.930000000000000e-11 -1.380000000000000e-11 1.470000000000000e-10 -2.380000000000000e-11 6.830000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.250000000000000e+02 2.015059230137426e-01 -9.200640377234308e-01 2.066069153085985e-01 -2.649360527091445e-01 1.950000000000000e-10 1.720000000000000e-11 -4.820000000000000e-11 5.120000000000000e-11 1.430000000000000e-11 2.930000000000000e-11 -1.380000000000000e-11 1.470000000000000e-10 -2.380000000000000e-11 6.830000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.260000000000000e+02 2.014649391268396e-01 -9.200860965628324e-01 2.066825428601526e-01 -2.648316062920941e-01 1.950000000000000e-10 1.720000000000000e-11 -4.830000000000000e-11 5.120000000000000e-11 1.430000000000000e-11 2.930000000000000e-11 -1.380000000000000e-11 1.470000000000000e-10 -2.380000000000000e-11 6.830000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.270000000000000e+02 2.014239573747010e-01 -9.201081385469985e-01 2.067581596913758e-01 -2.647271542100054e-01 1.950000000000000e-10 1.720000000000000e-11 -4.830000000000000e-11 5.120000000000000e-11 1.430000000000000e-11 2.930000000000000e-11 -1.380000000000000e-11 1.470000000000000e-10 -2.380000000000000e-11 6.830000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.280000000000000e+02 2.013829785989995e-01 -9.201301637956538e-01 2.068337652259242e-01 -2.646226958642168e-01 1.960000000000000e-10 1.720000000000000e-11 -4.830000000000000e-11 5.120000000000000e-11 1.430000000000000e-11 2.930000000000000e-11 -1.380000000000000e-11 1.470000000000000e-10 -2.380000000000000e-11 6.830000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.290000000000000e+02 2.013420038055166e-01 -9.201521724516927e-01 2.069093587583220e-01 -2.645182305517521e-01 1.960000000000000e-10 1.720000000000000e-11 -4.830000000000000e-11 5.120000000000000e-11 1.430000000000000e-11 2.930000000000000e-11 -1.380000000000000e-11 1.470000000000000e-10 -2.380000000000000e-11 6.830000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.300000000000000e+02 2.013010341489408e-01 -9.201741646794942e-01 2.069849394637437e-01 -2.644137574751970e-01 1.960000000000000e-10 1.720000000000000e-11 -4.830000000000000e-11 5.130000000000000e-11 1.430000000000000e-11 2.930000000000000e-11 -1.380000000000000e-11 1.470000000000000e-10 -2.380000000000000e-11 6.830000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.310000000000000e+02 2.012601012222353e-01 -9.201961308978642e-01 2.070605095628001e-01 -2.643092842035824e-01 1.960000000000000e-10 1.720000000000000e-11 -4.840000000000000e-11 5.130000000000000e-11 1.430000000000000e-11 2.930000000000000e-11 -1.370000000000000e-11 1.470000000000000e-10 -2.380000000000000e-11 6.830000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.320000000000000e+02 2.012186475482414e-01 -9.202180247658108e-01 2.071362182037556e-01 -2.642052798170624e-01 1.960000000000000e-10 1.710000000000000e-11 -4.840000000000000e-11 5.130000000000000e-11 1.430000000000000e-11 2.930000000000000e-11 -1.370000000000000e-11 1.470000000000000e-10 -2.380000000000000e-11 6.830000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.330000000000000e+02 2.011776156480479e-01 -9.202399562583287e-01 2.072117844411100e-01 -2.641008637936777e-01 1.960000000000000e-10 1.710000000000000e-11 -4.840000000000000e-11 5.130000000000000e-11 1.430000000000000e-11 2.930000000000000e-11 -1.370000000000000e-11 1.470000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.340000000000000e+02 2.011365824309081e-01 -9.202618702765664e-01 2.072873410074230e-01 -2.639964461525257e-01 1.960000000000000e-10 1.710000000000000e-11 -4.840000000000000e-11 5.130000000000000e-11 1.430000000000000e-11 2.930000000000000e-11 -1.370000000000000e-11 1.470000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.350000000000000e+02 2.010955479510183e-01 -9.202837668082289e-01 2.073628879049363e-01 -2.638920269035462e-01 1.960000000000000e-10 1.710000000000000e-11 -4.840000000000000e-11 5.130000000000000e-11 1.430000000000000e-11 2.920000000000000e-11 -1.370000000000000e-11 1.470000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.360000000000000e+02 2.010545122258517e-01 -9.203056458503637e-01 2.074384251336456e-01 -2.637876060538909e-01 1.960000000000000e-10 1.710000000000000e-11 -4.850000000000000e-11 5.130000000000000e-11 1.430000000000000e-11 2.920000000000000e-11 -1.370000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.370000000000000e+02 2.010134751978394e-01 -9.203275074257292e-01 2.075139526839861e-01 -2.636831835857196e-01 1.960000000000000e-10 1.710000000000000e-11 -4.850000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.370000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.380000000000000e+02 2.009724369420715e-01 -9.203493515119944e-01 2.075894705624926e-01 -2.635787595247400e-01 1.960000000000000e-10 1.710000000000000e-11 -4.850000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.370000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.390000000000000e+02 2.009313974284759e-01 -9.203711781231735e-01 2.076649787631445e-01 -2.634743338598741e-01 1.960000000000000e-10 1.710000000000000e-11 -4.850000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.370000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.400000000000000e+02 2.008903566634206e-01 -9.203929872581303e-01 2.077404772851393e-01 -2.633699066010417e-01 1.960000000000000e-10 1.710000000000000e-11 -4.850000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.370000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.410000000000000e+02 2.008493204776031e-01 -9.204147770501098e-01 2.078159667348621e-01 -2.632654793578842e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.370000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.420000000000000e+02 2.008083089928490e-01 -9.204365410230766e-01 2.078914492319834e-01 -2.631610577671638e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.430000000000000e+02 2.007672645288495e-01 -9.204582977438427e-01 2.079669187064803e-01 -2.630566257136336e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.440000000000000e+02 2.007262188552832e-01 -9.204800369921285e-01 2.080423784945334e-01 -2.629521920680030e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.450000000000000e+02 2.006851719954693e-01 -9.205017587631110e-01 2.081178285967719e-01 -2.628477568390740e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.460000000000000e+02 2.006441239032550e-01 -9.205234630750463e-01 2.081932690052881e-01 -2.627433200146311e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.470000000000000e+02 2.006030746442069e-01 -9.205451499112050e-01 2.082686997243605e-01 -2.626388816100392e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.480000000000000e+02 2.005620241506893e-01 -9.205668192951040e-01 2.083441207448353e-01 -2.625344416120202e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.490000000000000e+02 2.005209725062420e-01 -9.205884712033733e-01 2.084195320732075e-01 -2.624300000437689e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.500000000000000e+02 2.004799196849431e-01 -9.206101056495182e-01 2.084949337033293e-01 -2.623255568928543e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.510000000000000e+02 2.004388656649617e-01 -9.206317226431437e-01 2.085703256303627e-01 -2.622211121563359e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.520000000000000e+02 2.003978105066921e-01 -9.206533221683323e-01 2.086457078583742e-01 -2.621166658509430e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.530000000000000e+02 2.003567541998761e-01 -9.206749042335494e-01 2.087210803828740e-01 -2.620122179686301e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.540000000000000e+02 2.003156967057261e-01 -9.206964688497332e-01 2.087964431998136e-01 -2.619077685141066e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.550000000000000e+02 2.002746380845312e-01 -9.207180160059544e-01 2.088717963101384e-01 -2.618033174891900e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.560000000000000e+02 2.002335783459752e-01 -9.207395457017900e-01 2.089471397130520e-01 -2.616988648988802e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.570000000000000e+02 2.001925174448911e-01 -9.207610579543559e-01 2.090224734012010e-01 -2.615944107336708e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.580000000000000e+02 2.001514554384623e-01 -9.207825527471655e-01 2.090977973796209e-01 -2.614899550140879e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.590000000000000e+02 2.001103922906925e-01 -9.208040300976822e-01 2.091731116398451e-01 -2.613854977232611e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.600000000000000e+02 2.000693280543852e-01 -9.208254899916204e-01 2.092484161857081e-01 -2.612810388783154e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.610000000000000e+02 2.000282627146072e-01 -9.208469324373036e-01 2.093237110132451e-01 -2.611765784748468e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.620000000000000e+02 1.999871962500590e-01 -9.208683574449976e-01 2.093989961171187e-01 -2.610721165075573e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.630000000000000e+02 1.999461287164221e-01 -9.208897650019656e-01 2.094742714999289e-01 -2.609676529869448e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.640000000000000e+02 1.999050601064920e-01 -9.209111551107568e-01 2.095495371606266e-01 -2.608631879207156e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.650000000000000e+02 1.998639903824522e-01 -9.209325277861280e-01 2.096247930925997e-01 -2.607587213013985e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.660000000000000e+02 1.998229196087411e-01 -9.209538830166430e-01 2.097000392968082e-01 -2.606542531295492e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.670000000000000e+02 1.997818477727236e-01 -9.209752208057780e-01 2.097752757721308e-01 -2.605497834138258e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.680000000000000e+02 1.997407748684763e-01 -9.209965411596820e-01 2.098505025143622e-01 -2.604453121507711e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.690000000000000e+02 1.996997009065617e-01 -9.210178440784860e-01 2.099257195222827e-01 -2.603408393431567e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.700000000000000e+02 1.996586259228451e-01 -9.210391295541902e-01 2.100009267974337e-01 -2.602363650008966e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.710000000000000e+02 1.996175498733018e-01 -9.210603976035493e-01 2.100761243324991e-01 -2.601318891147496e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.720000000000000e+02 1.995764728153478e-01 -9.210816482133152e-01 2.101513121305577e-01 -2.600274116954457e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.730000000000000e+02 1.995353946950570e-01 -9.211028814034242e-01 2.102264901831978e-01 -2.599229327309366e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.740000000000000e+02 1.994943155783001e-01 -9.211240971578799e-01 2.103016584942112e-01 -2.598184522346524e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.750000000000000e+02 1.994532354670089e-01 -9.211452954763119e-01 2.103768170635367e-01 -2.597139702168815e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.760000000000000e+02 1.994121543171352e-01 -9.211664763779446e-01 2.104519658822578e-01 -2.596094866608956e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.770000000000000e+02 1.993710721706042e-01 -9.211876398528397e-01 2.105271049526032e-01 -2.595050015783400e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.780000000000000e+02 1.993299890556073e-01 -9.212087858930155e-01 2.106022342768739e-01 -2.594005149844482e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.790000000000000e+02 1.992889049265041e-01 -9.212299145239431e-01 2.106773538423103e-01 -2.592960268446199e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.800000000000000e+02 1.992478198251929e-01 -9.212510257283216e-01 2.107524636558504e-01 -2.591915371928881e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.810000000000000e+02 1.992067337639367e-01 -9.212721195082071e-01 2.108275637149176e-01 -2.590870460250613e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.820000000000000e+02 1.991656467157335e-01 -9.212931958748900e-01 2.109026540140070e-01 -2.589825533366742e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.830000000000000e+02 1.991245587321425e-01 -9.213142548170179e-01 2.109777345556327e-01 -2.588780591368562e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.840000000000000e+02 1.990834697538417e-01 -9.213352963562627e-01 2.110528053307025e-01 -2.587735634119718e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.850000000000000e+02 1.990423798570335e-01 -9.213563204733248e-01 2.111278663442469e-01 -2.586690661784478e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.860000000000000e+02 1.990012890341639e-01 -9.213773271692636e-01 2.112029175961952e-01 -2.585645674488671e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.870000000000000e+02 1.989601972325498e-01 -9.213983164685275e-01 2.112779590750360e-01 -2.584600671965320e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.880000000000000e+02 1.989191045333436e-01 -9.214192883494141e-01 2.113529907869011e-01 -2.583555654417843e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.890000000000000e+02 1.988780109174424e-01 -9.214402428191482e-01 2.114280127288638e-01 -2.582510621864599e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.900000000000000e+02 1.988369163631769e-01 -9.214611798889472e-01 2.115030248949363e-01 -2.581465574226089e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.910000000000000e+02 1.987958209105186e-01 -9.214820995487042e-01 2.115780272877287e-01 -2.580420511638716e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.920000000000000e+02 1.987547245830499e-01 -9.215030017968435e-01 2.116530199059472e-01 -2.579375434092821e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.930000000000000e+02 1.987136273192986e-01 -9.215238866532789e-01 2.117280027417494e-01 -2.578330341520098e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.940000000000000e+02 1.986725291749603e-01 -9.215447541077578e-01 2.118029757963889e-01 -2.577285233952413e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.950000000000000e+02 1.986314301895499e-01 -9.215656041470622e-01 2.118779390745427e-01 -2.576240111624663e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.960000000000000e+02 1.985903302720630e-01 -9.215864368054845e-01 2.119528925618961e-01 -2.575194974234949e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.970000000000000e+02 1.985492295314261e-01 -9.216072520516428e-01 2.120278362685471e-01 -2.574149822088359e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.980000000000000e+02 1.985081278898578e-01 -9.216280499139522e-01 2.121027701826924e-01 -2.573104654970293e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.990000000000000e+02 1.984670254141037e-01 -9.216488303729109e-01 2.121776943105211e-01 -2.572059473118659e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.000000000000000e+02 1.984259221038637e-01 -9.216695934370563e-01 2.122526086465018e-01 -2.571014276381167e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.010000000000000e+02 1.983848179144274e-01 -9.216903391184845e-01 2.123275131861820e-01 -2.569969064811563e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.020000000000000e+02 1.983437129019676e-01 -9.217110674043526e-01 2.124024079324930e-01 -2.568923838518178e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.030000000000000e+02 1.983026070903794e-01 -9.217317782929902e-01 2.124772928842089e-01 -2.567878597492470e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.040000000000000e+02 1.982615004115043e-01 -9.217524718097200e-01 2.125521680305494e-01 -2.566833341546815e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.050000000000000e+02 1.982203929370233e-01 -9.217731479318418e-01 2.126270333793586e-01 -2.565788070983416e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.060000000000000e+02 1.981792846672668e-01 -9.217938066628074e-01 2.127018889283037e-01 -2.564742785801197e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.070000000000000e+02 1.981381755668102e-01 -9.218144480223199e-01 2.127767346671716e-01 -2.563697485756413e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.080000000000000e+02 1.980970656949007e-01 -9.218350719917078e-01 2.128515706026463e-01 -2.562652171112960e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.090000000000000e+02 1.980559549977299e-01 -9.218556785876271e-01 2.129263967281460e-01 -2.561606841848512e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.100000000000000e+02 1.980148435506708e-01 -9.218762677967768e-01 2.130012130452056e-01 -2.560561497952351e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.110000000000000e+02 1.979737313246924e-01 -9.218968396271506e-01 2.130760195512636e-01 -2.559516139488865e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.120000000000000e+02 1.979326182966437e-01 -9.219173940928861e-01 2.131508162385262e-01 -2.558470766299029e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.130000000000000e+02 1.978915045296888e-01 -9.219379311748493e-01 2.132256031134175e-01 -2.557425378636380e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.140000000000000e+02 1.978503900206205e-01 -9.219584508792551e-01 2.133003801721553e-01 -2.556379976439858e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.150000000000000e+02 1.978092747181991e-01 -9.219789532227529e-01 2.133751474078825e-01 -2.555334559669268e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.160000000000000e+02 1.977681587005932e-01 -9.219994381895212e-01 2.134499048235564e-01 -2.554289128372098e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.170000000000000e+02 1.977270419482473e-01 -9.220199057829032e-01 2.135246524187245e-01 -2.553243682689636e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.180000000000000e+02 1.976859244431220e-01 -9.220403560170185e-01 2.135993901851214e-01 -2.552198222427527e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.190000000000000e+02 1.976448062213888e-01 -9.220607888822127e-01 2.136741181255822e-01 -2.551152747737307e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.200000000000000e+02 1.976036873052129e-01 -9.220812043765673e-01 2.137488362392502e-01 -2.550107258630684e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.210000000000000e+02 1.975625676344340e-01 -9.221016025179758e-01 2.138235445192388e-01 -2.549061755091472e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.220000000000000e+02 1.975214473067685e-01 -9.221219832843868e-01 2.138982429710579e-01 -2.548016237220692e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.230000000000000e+02 1.974803262330727e-01 -9.221423467046062e-01 2.139729315834038e-01 -2.546970704868934e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.240000000000000e+02 1.974392044947869e-01 -9.221626927569091e-01 2.140476103628235e-01 -2.545925158243215e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.250000000000000e+02 1.973980820751730e-01 -9.221830214502306e-01 2.141222793049954e-01 -2.544879597293366e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.260000000000000e+02 1.973569589529891e-01 -9.222033327932354e-01 2.141969384054330e-01 -2.543834022015125e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.270000000000000e+02 1.973158351668339e-01 -9.222236267803617e-01 2.142715876641607e-01 -2.542788432417661e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.280000000000000e+02 1.972747107395192e-01 -9.222439034078705e-01 2.143462270814624e-01 -2.541742828564594e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.290000000000000e+02 1.972335856143123e-01 -9.222641626933760e-01 2.144208566502641e-01 -2.540697210424241e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.300000000000000e+02 1.971924598542704e-01 -9.222844046234805e-01 2.144954763734627e-01 -2.539651578076326e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.310000000000000e+02 1.971513334724085e-01 -9.223046291975888e-01 2.145700862502058e-01 -2.538605931556306e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.320000000000000e+02 1.971102063995946e-01 -9.223248364397141e-01 2.146446862703758e-01 -2.537560270721780e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.330000000000000e+02 1.970690787447340e-01 -9.223450263193818e-01 2.147192764440647e-01 -2.536514595856650e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.340000000000000e+02 1.970279504156671e-01 -9.223651988695982e-01 2.147938567573945e-01 -2.535468906702116e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.350000000000000e+02 1.969868214941148e-01 -9.223853540669547e-01 2.148684272181055e-01 -2.534423203516772e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.360000000000000e+02 1.969456919715396e-01 -9.224054919193796e-01 2.149429878217722e-01 -2.533377486224040e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.370000000000000e+02 1.969045618029813e-01 -9.224256124455652e-01 2.150175385595125e-01 -2.532331754676091e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.380000000000000e+02 1.968634310577009e-01 -9.224457156220661e-01 2.150920794402383e-01 -2.531286009220579e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.390000000000000e+02 1.968222997333635e-01 -9.224658014580525e-01 2.151666104581656e-01 -2.530240249698977e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.400000000000000e+02 1.967811677807478e-01 -9.224858699711610e-01 2.152411316054543e-01 -2.529194476025893e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.410000000000000e+02 1.967400352748509e-01 -9.225059211425689e-01 2.153156428875500e-01 -2.528148688366092e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.420000000000000e+02 1.966989022024411e-01 -9.225259549768722e-01 2.153901443025911e-01 -2.527102886779120e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.430000000000000e+02 1.966577685381148e-01 -9.225459714873081e-01 2.154646358434583e-01 -2.526057071148514e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.440000000000000e+02 1.966166343175987e-01 -9.225659706652155e-01 2.155391175125259e-01 -2.525011241600518e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.450000000000000e+02 1.965754995620469e-01 -9.225859525098229e-01 2.156135893083614e-01 -2.523965398119390e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.460000000000000e+02 1.965343642336358e-01 -9.226059170335128e-01 2.156880512254878e-01 -2.522919540702455e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.470000000000000e+02 1.964932283814127e-01 -9.226258642266147e-01 2.157625032660202e-01 -2.521873669411753e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.480000000000000e+02 1.964520919699309e-01 -9.226457941031665e-01 2.158369454231897e-01 -2.520827784176505e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.490000000000000e+02 1.964109550498010e-01 -9.226657066505551e-01 2.159113777006520e-01 -2.519781885141314e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.500000000000000e+02 1.963698176166880e-01 -9.226856018737575e-01 2.159858000955055e-01 -2.518735972291558e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.510000000000000e+02 1.963286796321643e-01 -9.227054797877667e-01 2.160602126006048e-01 -2.517690045547696e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.520000000000000e+02 1.962875411577103e-01 -9.227253403789071e-01 2.161346152193614e-01 -2.516644105011052e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.530000000000000e+02 1.962464022019614e-01 -9.227451836447920e-01 2.162090079525156e-01 -2.515598150804581e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.540000000000000e+02 1.962052627172800e-01 -9.227650096073806e-01 2.162833907891943e-01 -2.514552182697002e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.550000000000000e+02 1.961641227453612e-01 -9.227848182545122e-01 2.163577637335810e-01 -2.513506200882221e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.560000000000000e+02 1.961229823221872e-01 -9.228046095790700e-01 2.164321267871013e-01 -2.512460205437758e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.570000000000000e+02 1.960818413788847e-01 -9.228243836057924e-01 2.165064799389113e-01 -2.511414196195389e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.580000000000000e+02 1.960407000087855e-01 -9.228441403116516e-01 2.165808231960180e-01 -2.510368173321381e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.590000000000000e+02 1.959995581284091e-01 -9.228638797212452e-01 2.166551565489260e-01 -2.509322136754861e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.600000000000000e+02 1.959584158202497e-01 -9.228836018181951e-01 2.167294800010421e-01 -2.508276086533764e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.610000000000000e+02 1.959172730690445e-01 -9.229033066045651e-01 2.168037935523078e-01 -2.507230022811588e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.620000000000000e+02 1.958761298376709e-01 -9.229229941005495e-01 2.168780971920236e-01 -2.506183945337227e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.630000000000000e+02 1.958349861989246e-01 -9.229426642848574e-01 2.169523909276722e-01 -2.505137854370553e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.640000000000000e+02 1.957938421358872e-01 -9.229623171664997e-01 2.170266747548127e-01 -2.504091749860259e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.650000000000000e+02 1.957526976130680e-01 -9.229819527611388e-01 2.171009486655372e-01 -2.503045631684840e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.660000000000000e+02 1.957115526949432e-01 -9.230015710501529e-01 2.171752126663430e-01 -2.501999500080143e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.670000000000000e+02 1.956704073691949e-01 -9.230211720402827e-01 2.172494667538620e-01 -2.500953355033213e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.680000000000000e+02 1.956292616298434e-01 -9.230407557417568e-01 2.173237109211678e-01 -2.499907196383533e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.690000000000000e+02 1.955881154818315e-01 -9.230603221501943e-01 2.173979451706403e-01 -2.498861024343463e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.700000000000000e+02 1.955469689658295e-01 -9.230798712609957e-01 2.174721695017302e-01 -2.497814838879610e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.710000000000000e+02 1.955058220425354e-01 -9.230994030902423e-01 2.175463839065607e-01 -2.496768639884173e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.720000000000000e+02 1.954646747587981e-01 -9.231189176217924e-01 2.176205883918318e-01 -2.495722427638950e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.730000000000000e+02 1.954235270748220e-01 -9.231384148774835e-01 2.176947829459406e-01 -2.494676201859541e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.740000000000000e+02 1.953823790475702e-01 -9.231578948395138e-01 2.177689675755738e-01 -2.493629962810389e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.750000000000000e+02 1.953412306682811e-01 -9.231773575150911e-01 2.178431422767421e-01 -2.492583710438832e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.760000000000000e+02 1.953000819057170e-01 -9.231968029177213e-01 2.179173070425290e-01 -2.491537444660432e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.770000000000000e+02 1.952589328104448e-01 -9.232162310348497e-01 2.179914618767660e-01 -2.490491165621023e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.780000000000000e+02 1.952177833949766e-01 -9.232356418668850e-01 2.180656067780840e-01 -2.489444873330174e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.790000000000000e+02 1.951766336118297e-01 -9.232550354301328e-01 2.181397417391144e-01 -2.488398567730877e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.800000000000000e+02 1.951354835172122e-01 -9.232744117126330e-01 2.182138667628399e-01 -2.487352248910571e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.810000000000000e+02 1.950943331221869e-01 -9.232937707152602e-01 2.182879818477167e-01 -2.486305916874606e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.820000000000000e+02 1.950531823724512e-01 -9.233131124557029e-01 2.183620869860319e-01 -2.485259571570875e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.830000000000000e+02 1.950120313512169e-01 -9.233324369110151e-01 2.184361821859310e-01 -2.484213213238221e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.840000000000000e+02 1.949708799964213e-01 -9.233517441069458e-01 2.185102674350737e-01 -2.483166841626536e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.850000000000000e+02 1.949297283627470e-01 -9.233710340320270e-01 2.185843427362901e-01 -2.482120456819026e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.860000000000000e+02 1.948885764616219e-01 -9.233903066790556e-01 2.186584080933068e-01 -2.481074059072471e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.870000000000000e+02 1.948474242369843e-01 -9.234095620742508e-01 2.187324634929348e-01 -2.480027648079055e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.880000000000000e+02 1.948062717638402e-01 -9.234288001972676e-01 2.188065089421259e-01 -2.478981224056922e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.890000000000000e+02 1.947651190312310e-01 -9.234480210568146e-01 2.188805444360754e-01 -2.477934786921774e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.900000000000000e+02 1.947239660041619e-01 -9.234672246620348e-01 2.189545699709876e-01 -2.476888336752969e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.910000000000000e+02 1.946828127397424e-01 -9.234864110022835e-01 2.190285855489953e-01 -2.475841873591092e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.920000000000000e+02 1.946416592373178e-01 -9.235055800790045e-01 2.191025911691875e-01 -2.474795397507298e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.930000000000000e+02 1.946005054642233e-01 -9.235247319109359e-01 2.191765868212625e-01 -2.473748908262202e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.940000000000000e+02 1.945593514705344e-01 -9.235438664809371e-01 2.192505725122340e-01 -2.472702406151289e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.950000000000000e+02 1.945181972609973e-01 -9.235629837927047e-01 2.193245482392584e-01 -2.471655891136410e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.960000000000000e+02 1.944770428002909e-01 -9.235820838602625e-01 2.193985139953401e-01 -2.470609363145568e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.970000000000000e+02 1.944358881519350e-01 -9.236011666709487e-01 2.194724697836905e-01 -2.469562822235500e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.980000000000000e+02 1.943947332615978e-01 -9.236202322377138e-01 2.195464155996061e-01 -2.468516268503597e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.990000000000000e+02 1.943535781777928e-01 -9.236392805558367e-01 2.196203514421059e-01 -2.467469701865279e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.000000000000000e+02 1.943124229262792e-01 -9.236583116191323e-01 2.196942773130924e-01 -2.466423122444550e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.010000000000000e+02 1.942712674423649e-01 -9.236773254502092e-01 2.197681932023528e-01 -2.465376530107699e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.020000000000000e+02 1.942301117839887e-01 -9.236963220357850e-01 2.198420991137695e-01 -2.464329924973410e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.030000000000000e+02 1.941889559715620e-01 -9.237153013713867e-01 2.199159950485755e-01 -2.463283307149991e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.040000000000000e+02 1.941477999627318e-01 -9.237342634756647e-01 2.199898809972800e-01 -2.462236676469284e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.050000000000000e+02 1.941066437849625e-01 -9.237532083411046e-01 2.200637569625274e-01 -2.461190033085443e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.060000000000000e+02 1.940654874825817e-01 -9.237721359579828e-01 2.201376229470327e-01 -2.460143377102320e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.070000000000000e+02 1.940243309857128e-01 -9.237910463545242e-01 2.202114789372610e-01 -2.459096708245211e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.080000000000000e+02 1.939831743803655e-01 -9.238099395053552e-01 2.202853249430313e-01 -2.458050026813364e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.090000000000000e+02 1.939420175997304e-01 -9.238288154361377e-01 2.203591609522263e-01 -2.457003332591142e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.100000000000000e+02 1.939008607089000e-01 -9.238476741265683e-01 2.204329869728368e-01 -2.455956625869257e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.110000000000000e+02 1.938597037017539e-01 -9.238665155861908e-01 2.205068029990709e-01 -2.454909906502229e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.120000000000000e+02 1.938185465409118e-01 -9.238853398289023e-01 2.205806090241099e-01 -2.453863174436489e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.130000000000000e+02 1.937773892932340e-01 -9.239041468385866e-01 2.206544050530659e-01 -2.452816429817760e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.140000000000000e+02 1.937362319497686e-01 -9.239229366185749e-01 2.207281910844795e-01 -2.451769672717806e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.150000000000000e+02 1.936950744718713e-01 -9.239417091863318e-01 2.208019671092664e-01 -2.450722902978929e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.160000000000000e+02 1.936539169120575e-01 -9.239604645287419e-01 2.208757331317628e-01 -2.449676120754662e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.170000000000000e+02 1.936127592912225e-01 -9.239792026427790e-01 2.209494891522564e-01 -2.448629326104929e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.180000000000000e+02 1.935716015511431e-01 -9.239979235505728e-01 2.210232351601712e-01 -2.447582518864020e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.190000000000000e+02 1.935304437525829e-01 -9.240166272363818e-01 2.210969711609275e-01 -2.446535699210094e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.200000000000000e+02 1.934892859038999e-01 -9.240353137011814e-01 2.211706971532020e-01 -2.445488867165923e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.210000000000000e+02 1.934481279556446e-01 -9.240539829635146e-01 2.212444131280480e-01 -2.444442022616757e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.220000000000000e+02 1.934069699977839e-01 -9.240726350007250e-01 2.213181190933484e-01 -2.443395165749406e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.230000000000000e+02 1.933658119461331e-01 -9.240912698400668e-01 2.213918150372171e-01 -2.442348296421133e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.240000000000000e+02 1.933246538674122e-01 -9.241098874654852e-01 2.214655009648400e-01 -2.441301414777906e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.250000000000000e+02 1.932834957828379e-01 -9.241284878770115e-01 2.215391768744800e-01 -2.440254520780409e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.260000000000000e+02 1.932423376310149e-01 -9.241470710899078e-01 2.216128427603058e-01 -2.439207614503983e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.270000000000000e+02 1.932011794629074e-01 -9.241656370994478e-01 2.216864986213052e-01 -2.438160695847167e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.280000000000000e+02 1.931600213047772e-01 -9.241841858961811e-01 2.217601444616237e-01 -2.437113765036641e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.290000000000000e+02 1.931188630998520e-01 -9.242027175025627e-01 2.218337802702636e-01 -2.436066821885307e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.300000000000000e+02 1.930777049146809e-01 -9.242212319049594e-01 2.219074060508779e-01 -2.435019866463712e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.310000000000000e+02 1.930365467382174e-01 -9.242397291058205e-01 2.219810218027520e-01 -2.433972898887532e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.320000000000000e+02 1.929953885520859e-01 -9.242582091177201e-01 2.220546275183143e-01 -2.432925919008571e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.330000000000000e+02 1.929542304060092e-01 -9.242766719261269e-01 2.221282232034467e-01 -2.431878927045243e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.340000000000000e+02 1.929130722485347e-01 -9.242951175502269e-01 2.222018088488528e-01 -2.430831922876237e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.350000000000000e+02 1.928719141393318e-01 -9.243135459754421e-01 2.222753844594161e-01 -2.429784906652308e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.360000000000000e+02 1.928307560847222e-01 -9.243319572057672e-01 2.223489500319946e-01 -2.428737878314983e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.370000000000000e+02 1.927895980246216e-01 -9.243503512623522e-01 2.224225055566554e-01 -2.427690837742123e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.380000000000000e+02 1.927484400525781e-01 -9.243687281206123e-01 2.224960510422387e-01 -2.426643785160666e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.390000000000000e+02 1.927072821375675e-01 -9.243870877901627e-01 2.225695864848672e-01 -2.425596720601537e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.400000000000000e+02 1.926661242492035e-01 -9.244054302881867e-01 2.226431118748399e-01 -2.424549643855342e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.410000000000000e+02 1.926249664557030e-01 -9.244237555942524e-01 2.227166272203041e-01 -2.423502555199178e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.420000000000000e+02 1.925838087361582e-01 -9.244420637186782e-01 2.227901325160910e-01 -2.422455454568540e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.430000000000000e+02 1.925426510811869e-01 -9.244603546703858e-01 2.228636277563096e-01 -2.421408341866979e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.440000000000000e+02 1.925014935195584e-01 -9.244786284407328e-01 2.229371129444377e-01 -2.420361217278939e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.450000000000000e+02 1.924603360714028e-01 -9.244968850308849e-01 2.230105880781206e-01 -2.419314080737025e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.460000000000000e+02 1.924191786939442e-01 -9.245151244541320e-01 2.230840531512149e-01 -2.418266932245791e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.470000000000000e+02 1.923780214478014e-01 -9.245333466964201e-01 2.231575081685263e-01 -2.417219771931400e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.480000000000000e+02 1.923368642842560e-01 -9.245515517776326e-01 2.232309531199773e-01 -2.416172599629798e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.490000000000000e+02 1.922957072511437e-01 -9.245697396822833e-01 2.233043880121204e-01 -2.415125415607846e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.500000000000000e+02 1.922545503762607e-01 -9.245879104106635e-01 2.233778128425918e-01 -2.414078219770951e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.510000000000000e+02 1.922133935886207e-01 -9.246060639858341e-01 2.234512276009372e-01 -2.413031012013807e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.520000000000000e+02 1.921722369513625e-01 -9.246242003937006e-01 2.235246322915875e-01 -2.411983792448240e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.530000000000000e+02 1.921310804847355e-01 -9.246423196299161e-01 2.235980269158811e-01 -2.410936561183251e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.540000000000000e+02 1.920899241385413e-01 -9.246604217132721e-01 2.236714114645467e-01 -2.409889318100336e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.550000000000000e+02 1.920487679635165e-01 -9.246785066320630e-01 2.237447859414288e-01 -2.408842063324572e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.560000000000000e+02 1.920076119635396e-01 -9.246965743887212e-01 2.238181503446340e-01 -2.407794796865584e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.570000000000000e+02 1.919664561069139e-01 -9.247146249969304e-01 2.238915046668254e-01 -2.406747518635134e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.580000000000000e+02 1.919253004638823e-01 -9.247326584380235e-01 2.239648489152344e-01 -2.405700228839220e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.590000000000000e+02 1.918841449630620e-01 -9.247506747383167e-01 2.240381830771873e-01 -2.404652927270279e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.600000000000000e+02 1.918429896764997e-01 -9.247686738777681e-01 2.241115071604712e-01 -2.403605614167992e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.610000000000000e+02 1.918018345927074e-01 -9.247866558660449e-01 2.241848211595602e-01 -2.402558289420365e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.620000000000000e+02 1.917606796916806e-01 -9.248046207099915e-01 2.242581250707605e-01 -2.401510953074773e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.630000000000000e+02 1.917195250107918e-01 -9.248225684037250e-01 2.243314188951236e-01 -2.400463605166182e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.640000000000000e+02 1.916783705589655e-01 -9.248404989457409e-01 2.244047026330070e-01 -2.399416245794894e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.650000000000000e+02 1.916372162993277e-01 -9.248584123568271e-01 2.244779762726815e-01 -2.398368874680778e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.660000000000000e+02 1.915960622890402e-01 -9.248763086154562e-01 2.245512398241589e-01 -2.397321492220331e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.670000000000000e+02 1.915549085268749e-01 -9.248941877311472e-01 2.246244932812025e-01 -2.396274098231779e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.680000000000000e+02 1.915137549754367e-01 -9.249120497139497e-01 2.246977366393104e-01 -2.395226692785463e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.690000000000000e+02 1.914726016865879e-01 -9.249298945572679e-01 2.247709698989162e-01 -2.394179275834443e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.700000000000000e+02 1.914314486595435e-01 -9.249477222603584e-01 2.248441930606305e-01 -2.393131847525280e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.710000000000000e+02 1.913902958762154e-01 -9.249655328325822e-01 2.249174061189052e-01 -2.392084407810391e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.720000000000000e+02 1.913491433822377e-01 -9.249833262662367e-01 2.249906090756622e-01 -2.391036956721814e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.730000000000000e+02 1.913079911334654e-01 -9.250011025774153e-01 2.250638019228441e-01 -2.389989494183580e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.740000000000000e+02 1.912668391804337e-01 -9.250188617529465e-01 2.251369846654395e-01 -2.388942020371423e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.750000000000000e+02 1.912256875344205e-01 -9.250366037960336e-01 2.252101573004829e-01 -2.387894535216747e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.760000000000000e+02 1.911845361483457e-01 -9.250543287213736e-01 2.252833198210633e-01 -2.386847038710098e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.770000000000000e+02 1.911433850626791e-01 -9.250720365213316e-01 2.253564722292414e-01 -2.385799530921399e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.780000000000000e+02 1.911022343225613e-01 -9.250897271836845e-01 2.254296145298269e-01 -2.384752012035521e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.790000000000000e+02 1.910610838448572e-01 -9.251074007415856e-01 2.255027467062470e-01 -2.383704481707286e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.800000000000000e+02 1.910199337079387e-01 -9.251250571722458e-01 2.255758687678678e-01 -2.382656940222101e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.810000000000000e+02 1.909787839141067e-01 -9.251426964801702e-01 2.256489807115444e-01 -2.381609387534605e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.820000000000000e+02 1.909376344259235e-01 -9.251603186777744e-01 2.257220825311303e-01 -2.380561823639138e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.830000000000000e+02 1.908964852876767e-01 -9.251779237554638e-01 2.257951742299912e-01 -2.379514248639606e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.840000000000000e+02 1.908553364774898e-01 -9.251955117253607e-01 2.258682558009784e-01 -2.378466662426360e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.850000000000000e+02 1.908141880373272e-01 -9.252130825770375e-01 2.259413272479753e-01 -2.377419065149744e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.860000000000000e+02 1.907730399570422e-01 -9.252306363174087e-01 2.260143885671612e-01 -2.376371456776993e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.870000000000000e+02 1.907318922207910e-01 -9.252481729551295e-01 2.260874397532539e-01 -2.375323837267041e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.880000000000000e+02 1.906907448550208e-01 -9.252656924854833e-01 2.261604808074812e-01 -2.374276206698062e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.890000000000000e+02 1.906495979043538e-01 -9.252831948995277e-01 2.262335117325546e-01 -2.373228565153119e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.900000000000000e+02 1.906084512915214e-01 -9.253006802223450e-01 2.263065325167690e-01 -2.372180912505409e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.910000000000000e+02 1.905673050749804e-01 -9.253181484390511e-01 2.263795431657971e-01 -2.371133248930370e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.920000000000000e+02 1.905261592907671e-01 -9.253355995449818e-01 2.264525436801315e-01 -2.370085574434737e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.930000000000000e+02 1.904850138536860e-01 -9.253530335692869e-01 2.265255340458867e-01 -2.369037888817001e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.940000000000000e+02 1.904438688657915e-01 -9.253704504847781e-01 2.265985142737798e-01 -2.367990192334920e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.950000000000000e+02 1.904027242844704e-01 -9.253878503040539e-01 2.266714843585945e-01 -2.366942485008145e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.960000000000000e+02 1.903615801116169e-01 -9.254052330355487e-01 2.267444442938400e-01 -2.365894766673027e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.970000000000000e+02 1.903204363919690e-01 -9.254225986656782e-01 2.268173940856428e-01 -2.364847037561455e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.980000000000000e+02 1.902792930684052e-01 -9.254399472169902e-01 2.268903337224114e-01 -2.363799297481393e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.990000000000000e+02 1.902381502121831e-01 -9.254572786705464e-01 2.269632632116728e-01 -2.362751546647733e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.000000000000000e+03 1.901970078133985e-01 -9.254745930331922e-01 2.270361825496216e-01 -2.361703785028353e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.001000000000000e+03 1.901558658353094e-01 -9.254918903186869e-01 2.271090917290607e-01 -2.360656012568720e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.002000000000000e+03 1.901147243274908e-01 -9.255091705196117e-01 2.271819907513694e-01 -2.359608229266614e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.003000000000000e+03 1.900735833171244e-01 -9.255264336264077e-01 2.272548796210762e-01 -2.358560435354181e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.004000000000000e+03 1.900324427341577e-01 -9.255436796657290e-01 2.273277583247255e-01 -2.357512630599606e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.005000000000000e+03 1.899913026514139e-01 -9.255609086196916e-01 2.274006268690738e-01 -2.356464815172550e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.006000000000000e+03 1.899501630746052e-01 -9.255781204901852e-01 2.274734852525029e-01 -2.355416989088482e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.007000000000000e+03 1.899090239495533e-01 -9.255953152965094e-01 2.275463334653312e-01 -2.354369152239462e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.008000000000000e+03 1.898678853593107e-01 -9.256124930160200e-01 2.276191715170566e-01 -2.353321304874045e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.009000000000000e+03 1.898267472370994e-01 -9.256296536750982e-01 2.276919993941170e-01 -2.352273446744865e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.010000000000000e+03 1.897856096455444e-01 -9.256467972552579e-01 2.277648171044916e-01 -2.351225578116870e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.011000000000000e+03 1.897444725821337e-01 -9.256639237656195e-01 2.278376246422641e-01 -2.350177698829101e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.012000000000000e+03 1.897033360221854e-01 -9.256810332130437e-01 2.279104220039814e-01 -2.349129808964431e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.013000000000000e+03 1.896622000056324e-01 -9.256981255901010e-01 2.279832091918221e-01 -2.348081908592529e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.014000000000000e+03 1.896210645326502e-01 -9.257152009004441e-01 2.280559862033835e-01 -2.347033997711952e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.015000000000000e+03 1.895799295779779e-01 -9.257322591557350e-01 2.281287530319817e-01 -2.345986076252397e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.016000000000000e+03 1.895387951794362e-01 -9.257493003476793e-01 2.282015096805542e-01 -2.344938144327611e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.017000000000000e+03 1.894976613690882e-01 -9.257663244698123e-01 2.282742561512350e-01 -2.343890202033817e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.018000000000000e+03 1.894565280768793e-01 -9.257833315487808e-01 2.283469924304330e-01 -2.342842249138228e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.019000000000000e+03 1.894153953746271e-01 -9.258003215624353e-01 2.284197185280341e-01 -2.341794285959789e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.020000000000000e+03 1.893742632551705e-01 -9.258172945221335e-01 2.284924344369293e-01 -2.340746312297943e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.021000000000000e+03 1.893331316992362e-01 -9.258342504330364e-01 2.285651401544073e-01 -2.339698328252041e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.022000000000000e+03 1.892920007490240e-01 -9.258511892877904e-01 2.286378356827159e-01 -2.338650333870780e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.023000000000000e+03 1.892508703671516e-01 -9.258681111003743e-01 2.287105210144570e-01 -2.337602329096979e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.024000000000000e+03 1.892097406020262e-01 -9.258850158576133e-01 2.287831961551698e-01 -2.336554314127670e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.025000000000000e+03 1.891686114632737e-01 -9.259019035663011e-01 2.288558610996232e-01 -2.335506288788515e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.026000000000000e+03 1.891274828966536e-01 -9.259187742411684e-01 2.289285158411207e-01 -2.334458253121910e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.027000000000000e+03 1.890863549712076e-01 -9.259356278670949e-01 2.290011603850426e-01 -2.333410207236935e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.028000000000000e+03 1.890452276913399e-01 -9.259524644464028e-01 2.290737947295957e-01 -2.332362151145186e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.029000000000000e+03 1.890041010094339e-01 -9.259692839940250e-01 2.291464188674456e-01 -2.331314084833566e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.030000000000000e+03 1.889629749773837e-01 -9.259860865048734e-01 2.292190327983936e-01 -2.330266008207113e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.031000000000000e+03 1.889218496090159e-01 -9.260028719713975e-01 2.292916365267090e-01 -2.329217921533654e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t</ATTLISTList>\n\t</ATT>\n\t<TIL>Today I learned</TIL>\n\t<GEO>\n\t\t<EFFECTIVETIME>1960-03-18T00:00:00.000000Z</EFFECTIVETIME>\n\t\t<MODELGENERATIONTIME>1958-12-16T00:00:00.000000Z</MODELGENERATIONTIME>\n\t\t<SATID>Imaginary1</SATID>\n\t\t<PRINCIPAL_DISTANCE>\n\t\t\t<GENERATIONTIME>1958-12-05T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<PD>7.949165000000000e+03</PD>\n\t\t</PRINCIPAL_DISTANCE>\n\t\t<OPTICAL_DISTORTION>\n\t\t\t<GENERATIONTIME>1958-01-01T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<POLYORDER>0</POLYORDER>\n\t\t\t<ALIST>0.000000000000000e+00</ALIST>\n\t\t\t<BLIST>0.000000000000000e+00</BLIST>\n\t\t</OPTICAL_DISTORTION>\n\t\t<PERSPECTIVE_CENTER>\n\t\t\t<GENERATIONTIME>1956-01-01T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<CX>0.000000000000000e+00</CX>\n\t\t\t<CY>0.000000000000000e+00</CY>\n\t\t\t<CZ>0.000000000000000e+00</CZ>\n\t\t</PERSPECTIVE_CENTER>\n\t\t<CAMERA_ATTITUDE>\n\t\t\t<GENERATIONTIME>1958-06-08T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<QCS1>0.000000000000000e+00</QCS1>\n\t\t\t<QCS2>0.000000000000000e+00</QCS2>\n\t\t\t<QCS3>0.000000000000000e+00</QCS3>\n\t\t\t<QCS4>1.000000000000000e+00</QCS4>\n\t\t</CAMERA_ATTITUDE>\n\t\t<DETECTOR_MOUNTING>\n\t\t\t<GENERATIONTIME>1958-12-16T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<BAND_P>\n\t\t\t\t<BANDID>P</BANDID>\n\t\t\t\t<DETECTOR_ARRAY>\n\t\t\t\t\t<DETARRID>1</DETARRID>\n\t\t\t\t\t<DETORIGINX>5.372000000000000e-02</DETORIGINX>\n\t\t\t\t\t<DETORIGINY>1.407119300000001e+02</DETORIGINY>\n\t\t\t\t\t<DETROTANGLE>0.000000000000000e+00</DETROTANGLE>\n\t\t\t\t\t<DETPITCH>8.000000000000000e-03</DETPITCH>\n\t\t\t\t</DETECTOR_ARRAY>\n\t\t\t</BAND_P>\n\t\t</DETECTOR_MOUNTING>\n\t</GEO>\n\t<RPB>\n\t\t<SATID>Imaginary1</SATID>\n\t\t<BANDID>P</BANDID>\n\t\t<SPECID>RPC00B</SPECID>\n\t\t<IMAGE>\n\t\t\t<ERRBIAS>2.248000000000000e+01</ERRBIAS>\n\t\t\t<ERRRAND>1.700000000000000e-01</ERRRAND>\n\t\t\t<LINEOFFSET>26709</LINEOFFSET>\n\t\t\t<SAMPOFFSET>17600</SAMPOFFSET>\n\t\t\t<LATOFFSET>6.936799999999999e+01</LATOFFSET>\n\t\t\t<LONGOFFSET>-1.503627000000000e+02</LONGOFFSET>\n\t\t\t<HEIGHTOFFSET>171</HEIGHTOFFSET>\n\t\t\t<LINESCALE>26801</LINESCALE>\n\t\t\t<SAMPSCALE>18028</SAMPSCALE>\n\t\t\t<LATSCALE>1.452000000000000e-01</LATSCALE>\n\t\t\t<LONGSCALE>3.025000000000000e-01</LONGSCALE>\n\t\t\t<HEIGHTSCALE>500</HEIGHTSCALE>\n\t\t\t<LINENUMCOEFList>\n\t\t\t\t<LINENUMCOEF>-2.642488000000000e-03 4.073312000000000e-02 -1.037927000000000e+00 -2.908791000000000e-03 2.527253000000000e-03 1.720480000000000e-05 -2.298363000000000e-04 -1.931314000000000e-03 1.414244000000000e-03 -4.137852000000000e-07 1.168644000000000e-06 4.706566000000000e-06 -4.094229000000000e-05 -5.476480000000000e-07 1.895910000000000e-05 4.507786000000000e-05 1.392624000000000e-05 -4.610817000000000e-07 -3.069979000000000e-07 4.819229000000000e-08</LINENUMCOEF>\n\t\t\t</LINENUMCOEFList>\n\t\t\t<LINEDENCOEFList>\n\t\t\t\t<LINEDENCOEF>1.000000000000000e+00 2.809603000000000e-03 -1.385344000000000e-03 -2.469585000000000e-04 -2.351781000000000e-05 1.305840000000000e-06 -6.348779000000000e-07 -8.182297000000000e-06 2.742548000000000e-05 -1.350941000000000e-05 -2.416994000000000e-08 -2.417287000000000e-07 -3.325114000000000e-06 -6.310966000000000e-08 7.676432000000000e-07 2.579810000000000e-05 0.000000000000000e+00 0.000000000000000e+00 -3.465923000000000e-08 -2.079038000000000e-08</LINEDENCOEF>\n\t\t\t</LINEDENCOEFList>\n\t\t\t<SAMPNUMCOEFList>\n\t\t\t\t<SAMPNUMCOEF>1.060367000000000e-02 9.771339000000000e-01 8.255671000000000e-06 2.407707000000000e-02 -6.094459000000000e-04 1.710430000000000e-04 -2.064366000000000e-04 -1.078889000000000e-02 -3.772612000000000e-04 7.264004000000000e-06 8.476389000000001e-06 8.267796999999999e-05 -1.021893000000000e-04 -2.022639000000000e-05 8.934325000000001e-05 -1.632024000000000e-05 -1.763215000000000e-07 -7.503294000000000e-06 -3.476233000000000e-06 -4.905996000000000e-07</SAMPNUMCOEF>\n\t\t\t</SAMPNUMCOEFList>\n\t\t\t<SAMPDENCOEFList>\n\t\t\t\t<SAMPDENCOEF>1.000000000000000e+00 1.784514000000000e-04 6.009599000000000e-04 -4.226862000000000e-04 -5.705897000000000e-05 4.452041000000000e-06 -4.490610000000000e-06 -1.681007000000000e-05 8.248283000000000e-05 -2.083347000000000e-05 -1.470603000000000e-08 4.739356000000000e-07 -3.430188000000000e-06 -2.083383000000000e-07 3.598836000000000e-06 1.034853000000000e-06 -4.322756000000000e-08 -1.689295000000000e-07 1.725840000000000e-07 0.000000000000000e+00</SAMPDENCOEF>\n\t\t\t</SAMPDENCOEFList>\n\t\t</IMAGE>\n\t</RPB>\n</isd>\n"
  },
  {
    "path": "src/asp/Camera/tests/dg_example4.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<isd>\n\t<IMD>\n\t\t<VERSION>AA</VERSION>\n\t\t<BANDID>P</BANDID>\n\t\t<NUMROWS>23708</NUMROWS>\n\t\t<NUMCOLUMNS>35170</NUMCOLUMNS>\n\t\t<RADIOMETRICLEVEL>Corrected</RADIOMETRICLEVEL>\n\t\t<BITSPERPIXEL>16</BITSPERPIXEL>\n\t\t<COMPRESSIONTYPE>None</COMPRESSIONTYPE>\n\t\t<OUTPUTFORMAT>GeoTIFF</OUTPUTFORMAT>\n\t\t<IMAGE>\n\t\t\t<SATID>Imaginary1</SATID>\n\t\t\t<MODE>FullSwath</MODE>\n\t\t\t<SCANDIRECTION>Forward</SCANDIRECTION>\n\t\t\t<TLCTIME>1959-11-25T17:39:48.740958Z</TLCTIME>\n\t\t\t<NUMTLC>2</NUMTLC>\n\t\t\t<TLCLISTList>\n\t\t\t\t<TLCLIST>0.000000000000000e+00 0.000000000000000e+00</TLCLIST>\n\t\t\t\t<TLCLIST>2.370800000000000e+04 1.975667000000000e+00</TLCLIST>\n\t\t\t</TLCLISTList>\n\t\t\t<FIRSTLINETIME>1959-11-25T17:39:48.740958Z</FIRSTLINETIME>\n\t\t\t<AVGLINERATE>1.200000000000000e+04</AVGLINERATE>\n\t\t\t<EXPOSUREDURATION>2.666670000000000e-03</EXPOSUREDURATION>\n\t\t\t<MINCOLLECTEDROWGSD>7.290000000000000e-01</MINCOLLECTEDROWGSD>\n\t\t\t<MAXCOLLECTEDROWGSD>7.320000000000000e-01</MAXCOLLECTEDROWGSD>\n\t\t\t<MEANCOLLECTEDROWGSD>7.310000000000000e-01</MEANCOLLECTEDROWGSD>\n\t\t\t<MINCOLLECTEDCOLGSD>6.720000000000000e-01</MINCOLLECTEDCOLGSD>\n\t\t\t<MAXCOLLECTEDCOLGSD>6.720000000000000e-01</MAXCOLLECTEDCOLGSD>\n\t\t\t<MEANCOLLECTEDCOLGSD>6.720000000000000e-01</MEANCOLLECTEDCOLGSD>\n\t\t\t<MEANCOLLECTEDGSD>7.010000000000000e-01</MEANCOLLECTEDGSD>\n\t\t\t<ROWUNCERTAINTY>5.732000000000000e+01</ROWUNCERTAINTY>\n\t\t\t<COLUNCERTAINTY>3.417000000000000e+01</COLUNCERTAINTY>\n\t\t\t<MINSUNAZ>1.619000000000000e+02</MINSUNAZ>\n\t\t\t<MAXSUNAZ>1.620000000000000e+02</MAXSUNAZ>\n\t\t\t<MEANSUNAZ>1.619000000000000e+02</MEANSUNAZ>\n\t\t\t<MINSUNEL>2.750000000000000e+01</MINSUNEL>\n\t\t\t<MAXSUNEL>2.770000000000000e+01</MAXSUNEL>\n\t\t\t<MEANSUNEL>2.760000000000000e+01</MEANSUNEL>\n\t\t\t<MINSATAZ>2.660000000000000e+01</MINSATAZ>\n\t\t\t<MAXSATAZ>2.720000000000000e+01</MAXSATAZ>\n\t\t\t<MEANSATAZ>2.690000000000000e+01</MEANSATAZ>\n\t\t\t<MINSATEL>5.200000000000000e+01</MINSATEL>\n\t\t\t<MAXSATEL>5.320000000000000e+01</MAXSATEL>\n\t\t\t<MEANSATEL>5.260000000000000e+01</MEANSATEL>\n\t\t\t<MININTRACKVIEWANGLE>3.240000000000000e+01</MININTRACKVIEWANGLE>\n\t\t\t<MAXINTRACKVIEWANGLE>3.270000000000000e+01</MAXINTRACKVIEWANGLE>\n\t\t\t<MEANINTRACKVIEWANGLE>3.260000000000000e+01</MEANINTRACKVIEWANGLE>\n\t\t\t<MINCROSSTRACKVIEWANGLE>1.170000000000000e+01</MINCROSSTRACKVIEWANGLE>\n\t\t\t<MAXCROSSTRACKVIEWANGLE>1.210000000000000e+01</MAXCROSSTRACKVIEWANGLE>\n\t\t\t<MEANCROSSTRACKVIEWANGLE>1.190000000000000e+01</MEANCROSSTRACKVIEWANGLE>\n\t\t\t<MINOFFNADIRVIEWANGLE>3.440000000000000e+01</MINOFFNADIRVIEWANGLE>\n\t\t\t<MAXOFFNADIRVIEWANGLE>3.440000000000000e+01</MAXOFFNADIRVIEWANGLE>\n\t\t\t<MEANOFFNADIRVIEWANGLE>3.440000000000000e+01</MEANOFFNADIRVIEWANGLE>\n\t\t\t<PNIIRS>4.200000000000000e+00</PNIIRS>\n\t\t\t<CLOUDCOVER>0.000000000000000e+00</CLOUDCOVER>\n\t\t\t<RESAMPLINGKERNEL>CC</RESAMPLINGKERNEL>\n\t\t\t<TDILEVEL>32</TDILEVEL>\n\t\t\t<POSITIONKNOWLEDGESRC>R</POSITIONKNOWLEDGESRC>\n\t\t\t<ATTITUDEKNOWLEDGESRC>R</ATTITUDEKNOWLEDGESRC>\n\t\t</IMAGE>\n\t</IMD>\n\t<EPH>\n\t\t<SATID>Imaginary1</SATID>\n\t\t<GENERATIONTIME>1959-11-25T19:05:33.862633Z</GENERATIONTIME>\n\t\t<STARTTIME>1959-11-25T17:39:40.987511Z</STARTTIME>\n\t\t<NUMPOINTS>840</NUMPOINTS>\n\t\t<TIMEINTERVAL>2.000000000000000e-02</TIMEINTERVAL>\n\t\t<EPHEMLISTList>\n\t\t\t<EPHEMLIST>1.000000000000000e+00 -1.150529111070304e+06 -4.900037170821411e+06 4.673402253879593e+06 -2.844266339347013e+03 -4.580208925894603e+03 -5.486888667664808e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.000000000000000e+00 -1.150585995837413e+06 -4.900128772944907e+06 4.673292515863864e+06 -2.844251584254513e+03 -4.580080713915985e+03 -5.487003834508436e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.000000000000000e+00 -1.150642880303100e+06 -4.900220372492305e+06 4.673182775558697e+06 -2.844236826943937e+03 -4.579952496310532e+03 -5.487119001767498e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.000000000000000e+00 -1.150699764494275e+06 -4.900311969514028e+06 4.673073032904602e+06 -2.844222067857655e+03 -4.579824274595800e+03 -5.487234167951268e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.000000000000000e+00 -1.150756648380619e+06 -4.900403563953296e+06 4.672963287968581e+06 -2.844207307142466e+03 -4.579696052627004e+03 -5.487349329716501e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.000000000000000e+00 -1.150813531973219e+06 -4.900495155830931e+06 4.672853540726059e+06 -2.844192543983192e+03 -4.579567828490194e+03 -5.487464489059428e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.000000000000000e+00 -1.150870415294624e+06 -4.900586745189165e+06 4.672743791127197e+06 -2.844177779207410e+03 -4.579439598388071e+03 -5.487579648831945e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.000000000000000e+00 -1.150927298277373e+06 -4.900678331901664e+06 4.672634039321106e+06 -2.844163013479430e+03 -4.579311373453886e+03 -5.487694799271948e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.000000000000000e+00 -1.150984180988860e+06 -4.900769916094676e+06 4.672524285158779e+06 -2.844148245986792e+03 -4.579183142428841e+03 -5.487809950315375e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.000000000000000e+01 -1.151041063417754e+06 -4.900861497747016e+06 4.672414528665220e+06 -2.844133475840487e+03 -4.579054907747178e+03 -5.487925100296267e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.100000000000000e+01 -1.151097945507887e+06 -4.900953076753495e+06 4.672304769964599e+06 -2.844118705172034e+03 -4.578926677823406e+03 -5.488040241099258e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.200000000000000e+01 -1.151154827371495e+06 -4.901044653324357e+06 4.672195008808733e+06 -2.844103931308538e+03 -4.578798434954264e+03 -5.488155388977065e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.300000000000000e+01 -1.151211708907560e+06 -4.901136227270410e+06 4.672085245420964e+06 -2.844089156197057e+03 -4.578670195508489e+03 -5.488270529139892e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.400000000000000e+01 -1.151268590149601e+06 -4.901227798654475e+06 4.671975479727124e+06 -2.844074379018060e+03 -4.578541953612254e+03 -5.488385666949694e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.500000000000000e+01 -1.151325471075321e+06 -4.901319367434779e+06 4.671865711776550e+06 -2.844059601800196e+03 -4.578413712984060e+03 -5.488500798328534e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.600000000000000e+01 -1.151382351740661e+06 -4.901410933716147e+06 4.671755941445468e+06 -2.844044821060139e+03 -4.578285464949879e+03 -5.488615932223071e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.700000000000000e+01 -1.151439232123080e+06 -4.901502497456396e+06 4.671646168783685e+06 -2.844030037785475e+03 -4.578157213251616e+03 -5.488731065006846e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.800000000000000e+01 -1.151496112155442e+06 -4.901594058529757e+06 4.671536393939713e+06 -2.844015255598032e+03 -4.578028967718285e+03 -5.488846186690504e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.900000000000000e+01 -1.151552991938527e+06 -4.901685617125041e+06 4.671426616690597e+06 -2.844000469617523e+03 -4.577900713024012e+03 -5.488961312502534e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.000000000000000e+01 -1.151609871416160e+06 -4.901777173137079e+06 4.671316837160538e+06 -2.843985681735768e+03 -4.577772458286071e+03 -5.489076433841945e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.100000000000000e+01 -1.151666750610898e+06 -4.901868726608082e+06 4.671207055299672e+06 -2.843970892771224e+03 -4.577644199024388e+03 -5.489191554142876e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.200000000000000e+01 -1.151723629500114e+06 -4.901960277495755e+06 4.671097271157968e+06 -2.843956101303744e+03 -4.577515939868817e+03 -5.489306670116709e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.300000000000000e+01 -1.151780508061520e+06 -4.902051825758324e+06 4.670987484784760e+06 -2.843941310398315e+03 -4.577387683219245e+03 -5.489421778337507e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.400000000000000e+01 -1.151837386373473e+06 -4.902143371542585e+06 4.670877696006669e+06 -2.843926515631169e+03 -4.577259417541747e+03 -5.489536890603293e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.500000000000000e+01 -1.151894264402217e+06 -4.902234914785371e+06 4.670767904898304e+06 -2.843911718023092e+03 -4.577131148313282e+03 -5.489652001800463e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.600000000000000e+01 -1.151951142103047e+06 -4.902326455402927e+06 4.670658111558600e+06 -2.843896921042729e+03 -4.577002881675212e+03 -5.489767105143569e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.700000000000000e+01 -1.152008019509473e+06 -4.902417993458058e+06 4.670548315913371e+06 -2.843882121649303e+03 -4.576874612858939e+03 -5.489882206058975e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.800000000000000e+01 -1.152064896632588e+06 -4.902509528971580e+06 4.670438517938030e+06 -2.843867319682478e+03 -4.576746340501584e+03 -5.489997305776314e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.900000000000000e+01 -1.152121773472520e+06 -4.902601061943715e+06 4.670328717632309e+06 -2.843852516488502e+03 -4.576618063637789e+03 -5.490112404505194e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.000000000000000e+01 -1.152178649973106e+06 -4.902692592269323e+06 4.670218915120433e+06 -2.843837712704800e+03 -4.576489791849443e+03 -5.490227493822896e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.100000000000000e+01 -1.152235526246320e+06 -4.902784120158154e+06 4.670109110154591e+06 -2.843822904164006e+03 -4.576361507616246e+03 -5.490342590489337e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.200000000000000e+01 -1.152292402191408e+06 -4.902875645421492e+06 4.669999302957743e+06 -2.843808096122985e+03 -4.576233225949493e+03 -5.490457679381193e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.300000000000000e+01 -1.152349277796962e+06 -4.902967168038044e+06 4.669889493555067e+06 -2.843793286913500e+03 -4.576104949464185e+03 -5.490572759035058e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.400000000000000e+01 -1.152406153186410e+06 -4.903058688238930e+06 4.669779681673459e+06 -2.843778474140327e+03 -4.575976658274283e+03 -5.490687847413945e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.500000000000000e+01 -1.152463028269964e+06 -4.903150205856049e+06 4.669669867511555e+06 -2.843763659399241e+03 -4.575848366705903e+03 -5.490802931635549e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.600000000000000e+01 -1.152519903036292e+06 -4.903241720868234e+06 4.669560051094379e+06 -2.843748843207369e+03 -4.575720076748883e+03 -5.490918009777291e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.700000000000000e+01 -1.152576777496739e+06 -4.903333233296691e+06 4.669450232396863e+06 -2.843734026809636e+03 -4.575591785692230e+03 -5.491033083576515e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.800000000000000e+01 -1.152633651662393e+06 -4.903424743162243e+06 4.669340411394418e+06 -2.843719207983936e+03 -4.575463492932561e+03 -5.491148154551486e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.900000000000000e+01 -1.152690525544347e+06 -4.903516250485696e+06 4.669230588062446e+06 -2.843704386635668e+03 -4.575335196288773e+03 -5.491263224595757e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.000000000000000e+01 -1.152747399142728e+06 -4.903607755267271e+06 4.669120762400682e+06 -2.843689563948833e+03 -4.575206895288075e+03 -5.491378293574211e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.100000000000000e+01 -1.152804272434999e+06 -4.903699257464811e+06 4.669010934458954e+06 -2.843674739451556e+03 -4.575078594068126e+03 -5.491493358189720e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.200000000000000e+01 -1.152861145409841e+06 -4.903790757057165e+06 4.668901104262288e+06 -2.843659913643468e+03 -4.574950294300805e+03 -5.491608416797939e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.300000000000000e+01 -1.152918018134627e+06 -4.903882254170460e+06 4.668791271661562e+06 -2.843645085271854e+03 -4.574821984989120e+03 -5.491723479295699e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.400000000000000e+01 -1.152974890530784e+06 -4.903973748657627e+06 4.668681436830656e+06 -2.843630255873566e+03 -4.574693678917060e+03 -5.491838534141622e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.500000000000000e+01 -1.153031762631818e+06 -4.904065240581444e+06 4.668571599695355e+06 -2.843615424267048e+03 -4.574565370809171e+03 -5.491953586346244e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.600000000000000e+01 -1.153088634482690e+06 -4.904156730026064e+06 4.668461760156151e+06 -2.843600590214636e+03 -4.574437053293622e+03 -5.492068642270134e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.700000000000000e+01 -1.153145505993540e+06 -4.904248216823312e+06 4.668351918411899e+06 -2.843585755024012e+03 -4.574308740734860e+03 -5.492183689136757e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.800000000000000e+01 -1.153202377242944e+06 -4.904339701120278e+06 4.668242074288663e+06 -2.843570917922168e+03 -4.574180420390991e+03 -5.492298738103873e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.900000000000000e+01 -1.153259248152341e+06 -4.904431182769935e+06 4.668132227960333e+06 -2.843556080060214e+03 -4.574052105153576e+03 -5.492413777716386e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.000000000000000e+01 -1.153316118788852e+06 -4.904522661897971e+06 4.668022379278250e+06 -2.843541239267616e+03 -4.573923784110380e+03 -5.492528818211897e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.100000000000000e+01 -1.153372989130191e+06 -4.904614138462659e+06 4.667912528291783e+06 -2.843526397590566e+03 -4.573795460904361e+03 -5.492643855574530e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.200000000000000e+01 -1.153429859187451e+06 -4.904705612484806e+06 4.667802674976319e+06 -2.843511553215319e+03 -4.573667133734673e+03 -5.492758892152260e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.300000000000000e+01 -1.153486728926893e+06 -4.904797083901284e+06 4.667692819406519e+06 -2.843496707544644e+03 -4.573538808049596e+03 -5.492873922690167e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.400000000000000e+01 -1.153543598382262e+06 -4.904888552775256e+06 4.667582961507676e+06 -2.843481860526524e+03 -4.573410477939130e+03 -5.492988952223373e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.500000000000000e+01 -1.153600467531033e+06 -4.904980019064590e+06 4.667473101329635e+06 -2.843467011793300e+03 -4.573282147756354e+03 -5.493103977227182e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.600000000000000e+01 -1.153657336395500e+06 -4.905071482811065e+06 4.667363238822975e+06 -2.843452160288984e+03 -4.573153813781507e+03 -5.493219001333411e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.700000000000000e+01 -1.153714204964581e+06 -4.905162943993925e+06 4.667253374012247e+06 -2.843437307982118e+03 -4.573025477108835e+03 -5.493334022723365e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.800000000000000e+01 -1.153771073238083e+06 -4.905254402612862e+06 4.667143506897822e+06 -2.843422453017709e+03 -4.572897138747175e+03 -5.493449041381165e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.900000000000000e+01 -1.153827941216130e+06 -4.905345858668094e+06 4.667033637479442e+06 -2.843407597158233e+03 -4.572768797866286e+03 -5.493564057213151e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.000000000000000e+01 -1.153884808909815e+06 -4.905437312180419e+06 4.666923765732494e+06 -2.843392738801496e+03 -4.572640452983973e+03 -5.493679072200657e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.100000000000000e+01 -1.153941676296602e+06 -4.905528763107707e+06 4.666813891706831e+06 -2.843377878402196e+03 -4.572512107970349e+03 -5.493794082857313e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.200000000000000e+01 -1.153998543387832e+06 -4.905620211471166e+06 4.666704015377372e+06 -2.843363017441559e+03 -4.572383760459086e+03 -5.493909090518860e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.300000000000000e+01 -1.154055410183384e+06 -4.905711657270607e+06 4.666594136744323e+06 -2.843348153923399e+03 -4.572255410789019e+03 -5.494024095801255e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.400000000000000e+01 -1.154112276694348e+06 -4.905803100526833e+06 4.666484255783088e+06 -2.843333288033959e+03 -4.572127057540642e+03 -5.494139099823244e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.500000000000000e+01 -1.154169142876027e+06 -4.905894541156168e+06 4.666374372592675e+06 -2.843318422338207e+03 -4.571998706797271e+03 -5.494254096268891e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.600000000000000e+01 -1.154226008784337e+06 -4.905985979263305e+06 4.666264487049202e+06 -2.843303553799633e+03 -4.571870350720647e+03 -5.494369093154796e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.700000000000000e+01 -1.154282874396747e+06 -4.906077414806122e+06 4.666154599202517e+06 -2.843288682830397e+03 -4.571741992438925e+03 -5.494484087643367e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.800000000000000e+01 -1.154339739713385e+06 -4.906168847784837e+06 4.666044709052360e+06 -2.843273811176478e+03 -4.571613631705432e+03 -5.494599079153784e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.900000000000000e+01 -1.154396604745338e+06 -4.906260278220244e+06 4.665934816574119e+06 -2.843258936751139e+03 -4.571485267252272e+03 -5.494714069704265e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.000000000000000e+01 -1.154453469458874e+06 -4.906351706049254e+06 4.665824921842472e+06 -2.843244060987852e+03 -4.571356904121445e+03 -5.494829054374317e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.100000000000000e+01 -1.154510333887738e+06 -4.906443131335001e+06 4.665715024782693e+06 -2.843229183998753e+03 -4.571228536773508e+03 -5.494944037806771e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.200000000000000e+01 -1.154567198031729e+06 -4.906534554077177e+06 4.665605125395147e+06 -2.843214303794174e+03 -4.571100165869832e+03 -5.495059020341043e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.300000000000000e+01 -1.154624061868566e+06 -4.906625974234062e+06 4.665495223729224e+06 -2.843199423239261e+03 -4.570971794176063e+03 -5.495173998338155e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.400000000000000e+01 -1.154680925409340e+06 -4.906717391826447e+06 4.665385319760310e+06 -2.843184540549422e+03 -4.570843420385077e+03 -5.495288973712725e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.500000000000000e+01 -1.154737788665132e+06 -4.906808806875126e+06 4.665275413463791e+06 -2.843169655036500e+03 -4.570715042893835e+03 -5.495403948133842e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.600000000000000e+01 -1.154794651613666e+06 -4.906900219338380e+06 4.665165504889054e+06 -2.843154769233221e+03 -4.570586664482401e+03 -5.495518918101102e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.700000000000000e+01 -1.154851514266028e+06 -4.906991629237007e+06 4.665055594011488e+06 -2.843139881116995e+03 -4.570458284256192e+03 -5.495633885287098e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.800000000000000e+01 -1.154908376622101e+06 -4.907083036570825e+06 4.664945680831304e+06 -2.843124990803692e+03 -4.570329901775607e+03 -5.495748850011772e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.900000000000000e+01 -1.154965238659604e+06 -4.907174441298127e+06 4.664835765397899e+06 -2.843110100459730e+03 -4.570201520461547e+03 -5.495863808398282e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.000000000000000e+01 -1.155022100434441e+06 -4.907265843523558e+06 4.664725847587340e+06 -2.843095206624067e+03 -4.570073131690681e+03 -5.495978769314877e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.100000000000000e+01 -1.155078961890472e+06 -4.907357243142126e+06 4.664615927523985e+06 -2.843080311355226e+03 -4.569944744603838e+03 -5.496093724089453e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.200000000000000e+01 -1.155135823072649e+06 -4.907448640237903e+06 4.664506005108253e+06 -2.843065414629913e+03 -4.569816351275252e+03 -5.496208679444347e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.300000000000000e+01 -1.155192683935948e+06 -4.907540034726722e+06 4.664396080439836e+06 -2.843050515736385e+03 -4.569687959721338e+03 -5.496323628913139e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.400000000000000e+01 -1.155249544525319e+06 -4.907631426692662e+06 4.664286153419144e+06 -2.843035615414764e+03 -4.569559561987407e+03 -5.496438578896835e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.500000000000000e+01 -1.155306404807031e+06 -4.907722816072658e+06 4.664176224120885e+06 -2.843020713163069e+03 -4.569431164083182e+03 -5.496553524533780e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.600000000000000e+01 -1.155363264769761e+06 -4.907814202845571e+06 4.664066292570105e+06 -2.843005809429155e+03 -4.569302767773566e+03 -5.496668464127544e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.700000000000000e+01 -1.155420124469661e+06 -4.907905587116427e+06 4.663956358642382e+06 -2.842990903844056e+03 -4.569174363438064e+03 -5.496783405989848e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.800000000000000e+01 -1.155476983861794e+06 -4.907996968801212e+06 4.663846422437257e+06 -2.842975996279350e+03 -4.569045959131432e+03 -5.496898343359439e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.900000000000000e+01 -1.155533842979658e+06 -4.908088347962614e+06 4.663736483880439e+06 -2.842961085763979e+03 -4.568917548917253e+03 -5.497013281700698e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.000000000000000e+01 -1.155590701756154e+06 -4.908179724475113e+06 4.663626543120671e+06 -2.842946175802107e+03 -4.568789143443045e+03 -5.497128210416423e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.100000000000000e+01 -1.155647560258395e+06 -4.908271098464282e+06 4.663516600009158e+06 -2.842931263162876e+03 -4.568660732213298e+03 -5.497243139851564e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.200000000000000e+01 -1.155704418475052e+06 -4.908362469908987e+06 4.663406654570953e+06 -2.842916347579419e+03 -4.568532317509039e+03 -5.497358068195705e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.300000000000000e+01 -1.155761276372644e+06 -4.908453838746571e+06 4.663296706880289e+06 -2.842901432037963e+03 -4.568403903549264e+03 -5.497472990528127e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.400000000000000e+01 -1.155818133995873e+06 -4.908545205060690e+06 4.663186756838045e+06 -2.842886513584070e+03 -4.568275484064951e+03 -5.497587913490115e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.500000000000000e+01 -1.155874991322208e+06 -4.908636568809252e+06 4.663076804494101e+06 -2.842871592728384e+03 -4.568147062727805e+03 -5.497702833743227e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.600000000000000e+01 -1.155931848329377e+06 -4.908727929950567e+06 4.662966849897867e+06 -2.842856672016299e+03 -4.568018642278726e+03 -5.497817747817630e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.700000000000000e+01 -1.155988705050784e+06 -4.908819288547194e+06 4.662856892975205e+06 -2.842841748015673e+03 -4.567890218193316e+03 -5.497932661093408e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.800000000000000e+01 -1.156045561464160e+06 -4.908910644557439e+06 4.662746933775521e+06 -2.842826823819952e+03 -4.567761793118867e+03 -5.498047569932273e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.900000000000000e+01 -1.156102417614191e+06 -4.909001998064948e+06 4.662636972199687e+06 -2.842811895910526e+03 -4.567633361174029e+03 -5.498162480900789e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.000000000000000e+02 -1.156159273444750e+06 -4.909093348964773e+06 4.662527008372096e+06 -2.842796966748417e+03 -4.567504930416047e+03 -5.498277386069291e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.010000000000000e+02 -1.156216128955963e+06 -4.909184697257137e+06 4.662417042292492e+06 -2.842782037507791e+03 -4.567376500664933e+03 -5.498392285059853e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.020000000000000e+02 -1.156272984192528e+06 -4.909276043025675e+06 4.662307073861729e+06 -2.842767105266476e+03 -4.567248065530181e+03 -5.498507184599629e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.030000000000000e+02 -1.156329839165524e+06 -4.909367386291160e+06 4.662197103055177e+06 -2.842752169526072e+03 -4.567119623048505e+03 -5.498622086574209e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.040000000000000e+02 -1.156386693751856e+06 -4.909458726823345e+06 4.662087130145821e+06 -2.842737236159083e+03 -4.566991191890783e+03 -5.498736972535802e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.050000000000000e+02 -1.156443548108242e+06 -4.909550064915373e+06 4.661977154786103e+06 -2.842722298301765e+03 -4.566862748430161e+03 -5.498851865572372e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.060000000000000e+02 -1.156500402178548e+06 -4.909641400462311e+06 4.661867177100432e+06 -2.842707357553832e+03 -4.566734301078247e+03 -5.498966757845177e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.070000000000000e+02 -1.156557255906893e+06 -4.909732733359624e+06 4.661757197212764e+06 -2.842692417785086e+03 -4.566605858096571e+03 -5.499081640618123e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.080000000000000e+02 -1.156614109360295e+06 -4.909824063732712e+06 4.661647214974411e+06 -2.842677474416332e+03 -4.566477409952301e+03 -5.499196524023264e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.090000000000000e+02 -1.156670962550078e+06 -4.909915391602735e+06 4.661537230360270e+06 -2.842662529114237e+03 -4.566348953955546e+03 -5.499311409581958e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.100000000000000e+02 -1.156727815408916e+06 -4.910006716843826e+06 4.661427243519608e+06 -2.842647582587687e+03 -4.566220501066961e+03 -5.499426287704412e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.110000000000000e+02 -1.156784667947893e+06 -4.910098039476763e+06 4.661317254427799e+06 -2.842632634722024e+03 -4.566092049832412e+03 -5.499541159672718e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.120000000000000e+02 -1.156841520211948e+06 -4.910189359585556e+06 4.661207262985204e+06 -2.842617685353838e+03 -4.565963592481087e+03 -5.499656032131907e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.130000000000000e+02 -1.156898372178557e+06 -4.910280677128133e+06 4.661097269241722e+06 -2.842602733558466e+03 -4.565835133179066e+03 -5.499770901976718e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.140000000000000e+02 -1.156955223858803e+06 -4.910371992125261e+06 4.660987273172718e+06 -2.842587779243282e+03 -4.565706669957761e+03 -5.499885770913411e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.150000000000000e+02 -1.157012075252817e+06 -4.910463304577160e+06 4.660877274777933e+06 -2.842572823660461e+03 -4.565578202608126e+03 -5.500000638552833e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.160000000000000e+02 -1.157068926315674e+06 -4.910554614399873e+06 4.660767274156960e+06 -2.842557867008848e+03 -4.565449738346610e+03 -5.500115498704139e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.170000000000000e+02 -1.157125777080865e+06 -4.910645921656067e+06 4.660657271235478e+06 -2.842542908243628e+03 -4.565321272091635e+03 -5.500230356135726e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.180000000000000e+02 -1.157182627559714e+06 -4.910737226366895e+06 4.660547265988373e+06 -2.842527948095325e+03 -4.565192801678863e+03 -5.500345212347203e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.190000000000000e+02 -1.157239477740908e+06 -4.910828528511248e+06 4.660437258440705e+06 -2.842512985838483e+03 -4.565064329017664e+03 -5.500460066052059e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.200000000000000e+02 -1.157296327613124e+06 -4.910919828067995e+06 4.660327248617536e+06 -2.842498021559147e+03 -4.564935856224390e+03 -5.500574915422580e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.210000000000000e+02 -1.157353177221297e+06 -4.911011125121132e+06 4.660217236419208e+06 -2.842483055570052e+03 -4.564807375712488e+03 -5.500689766729941e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.220000000000000e+02 -1.157410026486819e+06 -4.911102419523763e+06 4.660107222020037e+06 -2.842468088076580e+03 -4.564678900309353e+03 -5.500804609039477e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.230000000000000e+02 -1.157466875488228e+06 -4.911193711422692e+06 4.659997205245812e+06 -2.842453118884190e+03 -4.564550417147433e+03 -5.500919453314606e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.240000000000000e+02 -1.157523724180601e+06 -4.911285000733973e+06 4.659887186196138e+06 -2.842438147717739e+03 -4.564421933365905e+03 -5.501034293645719e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.250000000000000e+02 -1.157580572563824e+06 -4.911376287457443e+06 4.659777164871238e+06 -2.842423174714715e+03 -4.564293449781891e+03 -5.501149129280417e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.260000000000000e+02 -1.157637420671623e+06 -4.911467571656134e+06 4.659667141196298e+06 -2.842408200157342e+03 -4.564164959991508e+03 -5.501263965502825e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.270000000000000e+02 -1.157694268447879e+06 -4.911558853225172e+06 4.659557115295780e+06 -2.842393224428646e+03 -4.564036473365310e+03 -5.501378794221748e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.280000000000000e+02 -1.157751115970878e+06 -4.911650132310958e+06 4.659447086995930e+06 -2.842378244950554e+03 -4.563907977732702e+03 -5.501493626885192e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.290000000000000e+02 -1.157807963173548e+06 -4.911741408788074e+06 4.659337056445612e+06 -2.842363265453650e+03 -4.563779483125079e+03 -5.501608453332415e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.300000000000000e+02 -1.157864810078170e+06 -4.911832682698227e+06 4.659227023595320e+06 -2.842348283688554e+03 -4.563650986509332e+03 -5.501723277142027e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.310000000000000e+02 -1.157921656673430e+06 -4.911923954020308e+06 4.659116988470130e+06 -2.842333300081384e+03 -4.563522489660076e+03 -5.501838096622433e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.320000000000000e+02 -1.157978503004253e+06 -4.912015222838267e+06 4.659006950970355e+06 -2.842318314476045e+03 -4.563393984836485e+03 -5.501952918383498e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.330000000000000e+02 -1.158035349014441e+06 -4.912106489047130e+06 4.658896911220641e+06 -2.842303326923101e+03 -4.563265481785996e+03 -5.502067734167819e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.340000000000000e+02 -1.158092194715323e+06 -4.912197752668047e+06 4.658786869195876e+06 -2.842288338997628e+03 -4.563136977960232e+03 -5.502182545417339e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.350000000000000e+02 -1.158149040117984e+06 -4.912289013721783e+06 4.658676824871410e+06 -2.842273348822791e+03 -4.563008472083676e+03 -5.502297354056945e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.360000000000000e+02 -1.158205885244700e+06 -4.912380272250024e+06 4.658566778197742e+06 -2.842258355489071e+03 -4.562879960628598e+03 -5.502412163476751e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.370000000000000e+02 -1.158262730062005e+06 -4.912471528190184e+06 4.658456729249188e+06 -2.842243361971740e+03 -4.562751448545757e+03 -5.502526968151961e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.380000000000000e+02 -1.158319574580980e+06 -4.912562781563034e+06 4.658346678001096e+06 -2.842228365996533e+03 -4.562622934344506e+03 -5.502641770368349e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.390000000000000e+02 -1.158376418801509e+06 -4.912654032368389e+06 4.658236624453678e+06 -2.842213367906349e+03 -4.562494418115616e+03 -5.502756569894454e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.400000000000000e+02 -1.158433262701320e+06 -4.912745280564608e+06 4.658126568656394e+06 -2.842198369709035e+03 -4.562365902873752e+03 -5.502871363278264e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.410000000000000e+02 -1.158490106336292e+06 -4.912836526256173e+06 4.658016510485158e+06 -2.842183368138239e+03 -4.562237380381233e+03 -5.502986158950476e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.420000000000000e+02 -1.158546949683911e+06 -4.912927769401041e+06 4.657906449989897e+06 -2.842168363896095e+03 -4.562108854062119e+03 -5.503100953702363e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.430000000000000e+02 -1.158603792688309e+06 -4.913019009894783e+06 4.657796387294654e+06 -2.842153360457620e+03 -4.561980332222231e+03 -5.503215738952478e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.440000000000000e+02 -1.158660635450158e+06 -4.913110247925587e+06 4.657686322175892e+06 -2.842138352708486e+03 -4.561851799613107e+03 -5.503330529883975e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.450000000000000e+02 -1.158717477857356e+06 -4.913201483283999e+06 4.657576254882442e+06 -2.842123344794960e+03 -4.561723273881315e+03 -5.503445309726495e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.460000000000000e+02 -1.158774319988419e+06 -4.913292716116721e+06 4.657466185240003e+06 -2.842108335234259e+03 -4.561594741796339e+03 -5.503560090319568e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.470000000000000e+02 -1.158831161809555e+06 -4.913383946360675e+06 4.657356113323534e+06 -2.842093323381529e+03 -4.561466209790116e+03 -5.503674866524151e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.480000000000000e+02 -1.158888003376882e+06 -4.913475174120710e+06 4.657246039008463e+06 -2.842078309124447e+03 -4.561337668387877e+03 -5.503789646389006e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.490000000000000e+02 -1.158944844589497e+06 -4.913566399208312e+06 4.657135962518764e+06 -2.842063294502320e+03 -4.561209133503902e+03 -5.503904415560080e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.500000000000000e+02 -1.159001685503280e+06 -4.913657621727939e+06 4.657025883730334e+06 -2.842048277761278e+03 -4.561080596594672e+03 -5.504019182040975e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.510000000000000e+02 -1.159058526140752e+06 -4.913748841721660e+06 4.656915802593191e+06 -2.842033259542652e+03 -4.560952053848240e+03 -5.504133948759569e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.520000000000000e+02 -1.159115366490593e+06 -4.913840059168374e+06 4.656805719132397e+06 -2.842018238280638e+03 -4.560823507267878e+03 -5.504248714731303e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.530000000000000e+02 -1.159172206552689e+06 -4.913931274067899e+06 4.656695633348170e+06 -2.842003214660535e+03 -4.560694956781908e+03 -5.504363479707200e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.540000000000000e+02 -1.159229046304774e+06 -4.914022486378607e+06 4.656585545289976e+06 -2.841988190576093e+03 -4.560566405556490e+03 -5.504478240160712e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.550000000000000e+02 -1.159285885713142e+06 -4.914113696037565e+06 4.656475455032634e+06 -2.841973165872654e+03 -4.560437859482440e+03 -5.504592991190972e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.560000000000000e+02 -1.159342724867248e+06 -4.914204903211967e+06 4.656365362377415e+06 -2.841958137253684e+03 -4.560309304135315e+03 -5.504707746457514e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.570000000000000e+02 -1.159399563711236e+06 -4.914296107797430e+06 4.656255267448400e+06 -2.841943108250072e+03 -4.560180748200602e+03 -5.504822497037966e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.580000000000000e+02 -1.159456402256106e+06 -4.914387309814564e+06 4.656145170221085e+06 -2.841928076547665e+03 -4.560052190310143e+03 -5.504937245130940e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.590000000000000e+02 -1.159513240501984e+06 -4.914478509263587e+06 4.656035070695212e+06 -2.841913044054540e+03 -4.559923629941019e+03 -5.505051990316801e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.600000000000000e+02 -1.159570078448758e+06 -4.914569706144325e+06 4.655924968870988e+06 -2.841898009308997e+03 -4.559795067451519e+03 -5.505166732952694e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.610000000000000e+02 -1.159626916096302e+06 -4.914660900456604e+06 4.655814864748633e+06 -2.841882972135561e+03 -4.559666503195977e+03 -5.505281472818868e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.620000000000000e+02 -1.159683753444752e+06 -4.914752092200642e+06 4.655704758327880e+06 -2.841867934470212e+03 -4.559537936207125e+03 -5.505396209857956e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.630000000000000e+02 -1.159740590505184e+06 -4.914843281397182e+06 4.655594649584064e+06 -2.841852893898874e+03 -4.559409365406308e+03 -5.505510946068770e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.640000000000000e+02 -1.159797427232697e+06 -4.914934467962373e+06 4.655484538616895e+06 -2.841837852513516e+03 -4.559280797862085e+03 -5.505625674545290e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.650000000000000e+02 -1.159854263683395e+06 -4.915025652001026e+06 4.655374425301747e+06 -2.841822809226096e+03 -4.559152224456187e+03 -5.505740403469651e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.660000000000000e+02 -1.159911099834778e+06 -4.915116833471132e+06 4.655264309688574e+06 -2.841807763930031e+03 -4.559023648840441e+03 -5.505855129809542e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.670000000000000e+02 -1.159967935686723e+06 -4.915208012372514e+06 4.655154191777592e+06 -2.841792716331181e+03 -4.558895071195907e+03 -5.505969853544923e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.680000000000000e+02 -1.160024771239355e+06 -4.915299188705390e+06 4.655044071568538e+06 -2.841777667871725e+03 -4.558766491207622e+03 -5.506084574290964e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.690000000000000e+02 -1.160081606526152e+06 -4.915390362532332e+06 4.654933948986996e+06 -2.841762616025784e+03 -4.558637903791051e+03 -5.506199297474513e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.700000000000000e+02 -1.160138441457423e+06 -4.915481533685839e+06 4.654823824232176e+06 -2.841747563762891e+03 -4.558509323062311e+03 -5.506314009852463e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.710000000000000e+02 -1.160195276089283e+06 -4.915572702270715e+06 4.654713697179453e+06 -2.841732511029155e+03 -4.558380739991208e+03 -5.506428719064448e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.720000000000000e+02 -1.160252110466310e+06 -4.915663868370302e+06 4.654603567729681e+06 -2.841717453670260e+03 -4.558252148015572e+03 -5.506543432516855e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.730000000000000e+02 -1.160308944532654e+06 -4.915755031880246e+06 4.654493436006983e+06 -2.841702396043576e+03 -4.558123555121537e+03 -5.506658141510594e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.740000000000000e+02 -1.160365778254614e+06 -4.915846192737643e+06 4.654383302086201e+06 -2.841687337659920e+03 -4.557994967361794e+03 -5.506772841163612e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.750000000000000e+02 -1.160422611721639e+06 -4.915937351109614e+06 4.654273165768533e+06 -2.841672275667749e+03 -4.557866370503402e+03 -5.506887544761498e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.760000000000000e+02 -1.160479444877868e+06 -4.916028506891811e+06 4.654163027178105e+06 -2.841657212883795e+03 -4.557737772920202e+03 -5.507002243974164e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.770000000000000e+02 -1.160536277734397e+06 -4.916119660104981e+06 4.654052886290241e+06 -2.841642148264060e+03 -4.557609173136513e+03 -5.507116940516494e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.780000000000000e+02 -1.160593110291093e+06 -4.916210810748943e+06 4.653942743105166e+06 -2.841627081059322e+03 -4.557480571645950e+03 -5.507231634310219e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.790000000000000e+02 -1.160649942548095e+06 -4.916301958823916e+06 4.653832597622608e+06 -2.841612013298626e+03 -4.557351967338244e+03 -5.507346325376352e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.800000000000000e+02 -1.160706774505279e+06 -4.916393104329723e+06 4.653722449842788e+06 -2.841596943104002e+03 -4.557223361231730e+03 -5.507461013703274e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.810000000000000e+02 -1.160763606151337e+06 -4.916484247245287e+06 4.653612299790794e+06 -2.841581871148091e+03 -4.557094754722674e+03 -5.507575697810995e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.820000000000000e+02 -1.160820437542369e+06 -4.916575387675351e+06 4.653502147341957e+06 -2.841566796843717e+03 -4.556966138613009e+03 -5.507690385716120e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.830000000000000e+02 -1.160877268588619e+06 -4.916666525452365e+06 4.653391992695702e+06 -2.841551721291274e+03 -4.556837527893202e+03 -5.507805064289034e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.840000000000000e+02 -1.160934099346189e+06 -4.916757660681075e+06 4.653281835727354e+06 -2.841536644613062e+03 -4.556708912633122e+03 -5.507919741843364e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.850000000000000e+02 -1.160990929792571e+06 -4.916848793319498e+06 4.653171676486894e+06 -2.841521565994612e+03 -4.556580297362415e+03 -5.508034414929202e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.860000000000000e+02 -1.161047759972429e+06 -4.916939923451077e+06 4.653061514874998e+06 -2.841506484020091e+03 -4.556451674615382e+03 -5.508149090475548e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.870000000000000e+02 -1.161104589829916e+06 -4.917031050971502e+06 4.652951351015825e+06 -2.841491402120867e+03 -4.556323052831034e+03 -5.508263759824675e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.880000000000000e+02 -1.161161419364916e+06 -4.917122175880610e+06 4.652841184909587e+06 -2.841476318559175e+03 -4.556194432795372e+03 -5.508378423098125e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.890000000000000e+02 -1.161218248599702e+06 -4.917213298220025e+06 4.652731016506728e+06 -2.841461232902410e+03 -4.556065810511246e+03 -5.508493083858846e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.900000000000000e+02 -1.161275077590370e+06 -4.917304418094483e+06 4.652620845682560e+06 -2.841446144423438e+03 -4.555937176866660e+03 -5.508607750110782e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.910000000000000e+02 -1.161331906269638e+06 -4.917395535378386e+06 4.652510672586603e+06 -2.841431054039296e+03 -4.555808543126577e+03 -5.508722411949972e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.920000000000000e+02 -1.161388734615005e+06 -4.917486650029767e+06 4.652400497268844e+06 -2.841415962565876e+03 -4.555679912641251e+03 -5.508837066186855e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.930000000000000e+02 -1.161445562660177e+06 -4.917577762111539e+06 4.652290319654368e+06 -2.841400870417292e+03 -4.555551279600870e+03 -5.508951717529146e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.940000000000000e+02 -1.161502390416234e+06 -4.917668871644435e+06 4.652180139718493e+06 -2.841385775612106e+03 -4.555422642657485e+03 -5.509066368005160e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.950000000000000e+02 -1.161559217849475e+06 -4.917759978565578e+06 4.652069957536095e+06 -2.841370679225754e+03 -4.555294007253090e+03 -5.509181012546589e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.960000000000000e+02 -1.161616045038385e+06 -4.917851083021482e+06 4.651959772932701e+06 -2.841355580199527e+03 -4.555165360637401e+03 -5.509295662369158e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.970000000000000e+02 -1.161672871870827e+06 -4.917942184802851e+06 4.651849586157556e+06 -2.841340480232637e+03 -4.555036720946046e+03 -5.509410301433109e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.980000000000000e+02 -1.161729698425290e+06 -4.918033284056189e+06 4.651739397036187e+06 -2.841325379007723e+03 -4.554908075046583e+03 -5.509524940941537e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.990000000000000e+02 -1.161786524690456e+06 -4.918124380760428e+06 4.651629205593686e+06 -2.841310274798608e+03 -4.554779425509763e+03 -5.509639579507056e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.000000000000000e+02 -1.161843350643823e+06 -4.918215474873597e+06 4.651519011880050e+06 -2.841295168751823e+03 -4.554650775890122e+03 -5.509754213619808e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.010000000000000e+02 -1.161900176296716e+06 -4.918306566416807e+06 4.651408815870123e+06 -2.841280062142756e+03 -4.554522123348437e+03 -5.509868845095965e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.020000000000000e+02 -1.161957001649014e+06 -4.918397655389889e+06 4.651298617564120e+06 -2.841264953102658e+03 -4.554393469117082e+03 -5.509983473739898e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.030000000000000e+02 -1.162013826700602e+06 -4.918488741792665e+06 4.651188416962255e+06 -2.841249841903648e+03 -4.554264812697756e+03 -5.510098099848559e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.040000000000000e+02 -1.162070651451606e+06 -4.918579825625350e+06 4.651078214064261e+06 -2.841234729801721e+03 -4.554136153771807e+03 -5.510212723124317e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.050000000000000e+02 -1.162127475901913e+06 -4.918670906887776e+06 4.650968008870349e+06 -2.841219615513253e+03 -4.554007492740412e+03 -5.510327343807761e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.060000000000000e+02 -1.162184300051402e+06 -4.918761985579765e+06 4.650857801380741e+06 -2.841204499003339e+03 -4.553878830014973e+03 -5.510441961568291e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.070000000000000e+02 -1.162241123911393e+06 -4.918853061722425e+06 4.650747591570271e+06 -2.841189381236472e+03 -4.553750162617042e+03 -5.510556578478550e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.080000000000000e+02 -1.162297947436923e+06 -4.918944135231888e+06 4.650637379538893e+06 -2.841174261944863e+03 -4.553621498963415e+03 -5.510671187574417e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.090000000000000e+02 -1.162354770706460e+06 -4.919035206254608e+06 4.650527165112078e+06 -2.841159140300288e+03 -4.553492825527375e+03 -5.510785800614703e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.100000000000000e+02 -1.162411593641547e+06 -4.919126274644172e+06 4.650416948464304e+06 -2.841144017641710e+03 -4.553364155466382e+03 -5.510900405921655e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.110000000000000e+02 -1.162468416275639e+06 -4.919217340463081e+06 4.650306729521099e+06 -2.841128892558820e+03 -4.553235483315887e+03 -5.511015008730119e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.120000000000000e+02 -1.162525238631247e+06 -4.919308403753331e+06 4.650196508232411e+06 -2.841113765950585e+03 -4.553106805200430e+03 -5.511129611896557e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.130000000000000e+02 -1.162582060697067e+06 -4.919399464493859e+06 4.650086284623339e+06 -2.841098636758805e+03 -4.552978123264001e+03 -5.511244214092967e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.140000000000000e+02 -1.162638882417021e+06 -4.919490522580034e+06 4.649976058818587e+06 -2.841083506902005e+03 -4.552849446256258e+03 -5.511358807092464e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.150000000000000e+02 -1.162695703836001e+06 -4.919581578095647e+06 4.649865830718308e+06 -2.841068376159833e+03 -4.552720766917384e+03 -5.511473397103791e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.160000000000000e+02 -1.162752524998660e+06 -4.919672631124066e+06 4.649755600223115e+06 -2.841053241721418e+03 -4.552592078399603e+03 -5.511587991154567e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.170000000000000e+02 -1.162809345826539e+06 -4.919763681518903e+06 4.649645367507511e+06 -2.841038106044193e+03 -4.552463393124023e+03 -5.511702577686662e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.180000000000000e+02 -1.162866166386912e+06 -4.919854729405695e+06 4.649535132421841e+06 -2.841022968508459e+03 -4.552334700107473e+03 -5.511817166220058e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.190000000000000e+02 -1.162922986601331e+06 -4.919945774638067e+06 4.649424895140611e+06 -2.841007830360738e+03 -4.552206012037203e+03 -5.511931745519352e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.200000000000000e+02 -1.162979806525626e+06 -4.920036817320275e+06 4.649314655539539e+06 -2.840992689391856e+03 -4.552077320270445e+03 -5.512046323850840e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.210000000000000e+02 -1.163036626182310e+06 -4.920127857494300e+06 4.649204413568556e+06 -2.840977546573228e+03 -4.551948620578250e+03 -5.512160904334190e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.220000000000000e+02 -1.163093445515226e+06 -4.920218895055420e+06 4.649094169352540e+06 -2.840962401575019e+03 -4.551819922866901e+03 -5.512275478784592e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.230000000000000e+02 -1.163150264535701e+06 -4.920309930024729e+06 4.648983922866325e+06 -2.840947256531522e+03 -4.551691223979411e+03 -5.512390048896862e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.240000000000000e+02 -1.163207083277185e+06 -4.920400962464715e+06 4.648873674035423e+06 -2.840932108200295e+03 -4.551562519849387e+03 -5.512504619551278e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.250000000000000e+02 -1.163263901705989e+06 -4.920491992312543e+06 4.648763422934745e+06 -2.840916958136983e+03 -4.551433815238222e+03 -5.512619186042509e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.260000000000000e+02 -1.163320719811052e+06 -4.920583019547557e+06 4.648653169588941e+06 -2.840901807919180e+03 -4.551305111861482e+03 -5.512733746217690e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.270000000000000e+02 -1.163377537659400e+06 -4.920674044294869e+06 4.648542913848794e+06 -2.840886654061033e+03 -4.551176399175538e+03 -5.512848310513376e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.280000000000000e+02 -1.163434355172580e+06 -4.920765066408133e+06 4.648432655888853e+06 -2.840871498950579e+03 -4.551047690101062e+03 -5.512962866988415e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.290000000000000e+02 -1.163491172417864e+06 -4.920856086012857e+06 4.648322395559419e+06 -2.840856341942467e+03 -4.550918972901047e+03 -5.513077425803320e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.300000000000000e+02 -1.163547989316804e+06 -4.920947102962696e+06 4.648212133035045e+06 -2.840841184272019e+03 -4.550790260777059e+03 -5.513191975301028e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.310000000000000e+02 -1.163604805936425e+06 -4.921038117382763e+06 4.648101868166510e+06 -2.840826023595991e+03 -4.550661543125591e+03 -5.513306525452610e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.320000000000000e+02 -1.163661622265660e+06 -4.921129129252391e+06 4.647991600978463e+06 -2.840810861595468e+03 -4.550532821370392e+03 -5.513421074303834e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.330000000000000e+02 -1.163718438281937e+06 -4.921220138529520e+06 4.647881331521076e+06 -2.840795697418383e+03 -4.550404099407493e+03 -5.513535618962638e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.340000000000000e+02 -1.163775253985376e+06 -4.921311145214363e+06 4.647771059794094e+06 -2.840780532663925e+03 -4.550275376538245e+03 -5.513650159296721e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.350000000000000e+02 -1.163832069409439e+06 -4.921402149369385e+06 4.647660785723004e+06 -2.840765365081456e+03 -4.550146648256850e+03 -5.513764700107045e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.360000000000000e+02 -1.163888884520431e+06 -4.921493150931775e+06 4.647550509382746e+06 -2.840750195457035e+03 -4.550017919827124e+03 -5.513879236614668e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.370000000000000e+02 -1.163945699329676e+06 -4.921584149922628e+06 4.647440230748145e+06 -2.840735025126626e+03 -4.549889188602994e+03 -5.513993770442671e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.380000000000000e+02 -1.164002513848240e+06 -4.921675146362652e+06 4.647329949794509e+06 -2.840719852034787e+03 -4.549760454059056e+03 -5.514108302957738e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.390000000000000e+02 -1.164059328031255e+06 -4.921766140168156e+06 4.647219666621682e+06 -2.840704678088866e+03 -4.549631722184866e+03 -5.514222828267240e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.400000000000000e+02 -1.164116141934793e+06 -4.921857131443746e+06 4.647109381104860e+06 -2.840689502391848e+03 -4.549502984646141e+03 -5.514337353779854e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.410000000000000e+02 -1.164172955525167e+06 -4.921948120126623e+06 4.646999093318983e+06 -2.840674324861493e+03 -4.549374246882589e+03 -5.514451874960729e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.420000000000000e+02 -1.164229768835831e+06 -4.922039106279232e+06 4.646888803189528e+06 -2.840659144343034e+03 -4.549245503439986e+03 -5.514566396913211e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.430000000000000e+02 -1.164286581833341e+06 -4.922130089839163e+06 4.646778510790969e+06 -2.840643963342353e+03 -4.549116759165489e+03 -5.514680914436035e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.440000000000000e+02 -1.164343394528777e+06 -4.922221070827122e+06 4.646668216098604e+06 -2.840628780193780e+03 -4.548988012991344e+03 -5.514795429176187e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.450000000000000e+02 -1.164400206933201e+06 -4.922312049263806e+06 4.646557919087737e+06 -2.840613594276181e+03 -4.548859263102077e+03 -5.514909942938601e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.460000000000000e+02 -1.164457018990804e+06 -4.922403025045071e+06 4.646447619882673e+06 -2.840598409233281e+03 -4.548730517616822e+03 -5.515024447261867e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.470000000000000e+02 -1.164513830813271e+06 -4.922493998379327e+06 4.646337318234636e+06 -2.840583219019079e+03 -4.548601759766613e+03 -5.515138958955755e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.480000000000000e+02 -1.164570642300033e+06 -4.922584969078952e+06 4.646227014367600e+06 -2.840568029234033e+03 -4.548473004729972e+03 -5.515253462747403e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.490000000000000e+02 -1.164627453462164e+06 -4.922675937164646e+06 4.646116708256858e+06 -2.840552837932941e+03 -4.548344251034975e+03 -5.515367960749245e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.500000000000000e+02 -1.164684264377865e+06 -4.922766902782318e+06 4.646006399728222e+06 -2.840537642578651e+03 -4.548215486715839e+03 -5.515482464154799e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.510000000000000e+02 -1.164741074968940e+06 -4.922857865786097e+06 4.645896088955829e+06 -2.840522446919258e+03 -4.548086723255349e+03 -5.515596961631279e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.520000000000000e+02 -1.164797885235281e+06 -4.922948826175817e+06 4.645785775939899e+06 -2.840507250040388e+03 -4.547957961389874e+03 -5.515711452971970e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.530000000000000e+02 -1.164854695221517e+06 -4.923039784034774e+06 4.645675460580978e+06 -2.840492050075385e+03 -4.547829193953856e+03 -5.515825945035536e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.540000000000000e+02 -1.164911504871838e+06 -4.923130739258849e+06 4.645565143003391e+06 -2.840476850375020e+03 -4.547700429320879e+03 -5.515940429281403e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.550000000000000e+02 -1.164968314242070e+06 -4.923221691952203e+06 4.645454823082759e+06 -2.840461647867241e+03 -4.547571659014412e+03 -5.516054914211055e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.560000000000000e+02 -1.165025123309712e+06 -4.923312642072924e+06 4.645344500869130e+06 -2.840446442853996e+03 -4.547442886760027e+03 -5.516169396559521e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.570000000000000e+02 -1.165081932052525e+06 -4.923403589579501e+06 4.645234176412083e+06 -2.840431238033108e+03 -4.547314115435612e+03 -5.516283872696538e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.580000000000000e+02 -1.165138740503868e+06 -4.923494534534230e+06 4.645123849637235e+06 -2.840416029933083e+03 -4.547185340838482e+03 -5.516398347713130e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.590000000000000e+02 -1.165195548697434e+06 -4.923585476999911e+06 4.645013520469550e+06 -2.840400819589738e+03 -4.547056556268590e+03 -5.516512826768972e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.600000000000000e+02 -1.165252356554792e+06 -4.923676416830327e+06 4.644903189083688e+06 -2.840385608044455e+03 -4.546927775188814e+03 -5.516627298090944e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.610000000000000e+02 -1.165309164120576e+06 -4.923767354108753e+06 4.644792855380180e+06 -2.840370393975649e+03 -4.546798990231342e+03 -5.516741768460078e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.620000000000000e+02 -1.165365971373467e+06 -4.923858288793362e+06 4.644682519408756e+06 -2.840355225785978e+03 -4.546670188576375e+03 -5.516856226868937e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.630000000000000e+02 -1.165422778307146e+06 -4.923949220876525e+06 4.644572181179011e+06 -2.840339963335913e+03 -4.546541420424878e+03 -5.516970694202174e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.640000000000000e+02 -1.165479584964677e+06 -4.924040150436529e+06 4.644461840597177e+06 -2.840324743968192e+03 -4.546412628915295e+03 -5.517085156424979e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.650000000000000e+02 -1.165536391297093e+06 -4.924131077382049e+06 4.644351497772365e+06 -2.840309524524399e+03 -4.546283838399535e+03 -5.517199612504527e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.660000000000000e+02 -1.165593197349026e+06 -4.924222001796350e+06 4.644241152605093e+06 -2.840294302059045e+03 -4.546155042542819e+03 -5.517314069083206e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.670000000000000e+02 -1.165650003109170e+06 -4.924312923658396e+06 4.644130805120492e+06 -2.840279076866794e+03 -4.546026242593492e+03 -5.517428524980293e+03 1.916870120600000e-03 7.337122999400000e-04 1.159096367800000e-03 2.444819232100000e-03 1.868036280500000e-03 3.272469259000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.680000000000000e+02 -1.165706808521722e+06 -4.924403842864110e+06 4.644020455442934e+06 -2.840263852539814e+03 -4.545897447455306e+03 -5.517542971107204e+03 1.916870120600000e-03 7.337122999400000e-04 1.159096367800000e-03 2.444819232100000e-03 1.868036280500000e-03 3.272469259000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.690000000000000e+02 -1.165763613653685e+06 -4.924494759538471e+06 4.643910103423076e+06 -2.840248625185939e+03 -4.545768646651914e+03 -5.517657418007521e+03 1.916870120600000e-03 7.337122999400000e-04 1.159096367800000e-03 2.444819232100000e-03 1.868036280500000e-03 3.272469259000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.700000000000000e+02 -1.165820418482567e+06 -4.924585673639591e+06 4.643799749110977e+06 -2.840233395524254e+03 -4.545639843864918e+03 -5.517771862267744e+03 1.916870120600000e-03 7.337122999400000e-04 1.159096367800000e-03 2.444819232100000e-03 1.868036280500000e-03 3.272469259000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.710000000000000e+02 -1.165877222986126e+06 -4.924676585125968e+06 4.643689392556232e+06 -2.840218165950092e+03 -4.545511041939851e+03 -5.517886300422885e+03 1.916870120600000e-03 7.337122999400000e-04 1.159096367800000e-03 2.444819232100000e-03 1.868036280500000e-03 3.272469259000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.720000000000000e+02 -1.165934027205992e+06 -4.924767494089013e+06 4.643579033665133e+06 -2.840202786895663e+03 -4.545382648720954e+03 -5.518000457471592e+03 1.916870120600000e-03 7.337122999400000e-04 1.159096367800000e-03 2.444819232100000e-03 1.868036280500000e-03 3.272469259000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.730000000000000e+02 -1.165990831087042e+06 -4.924858400435004e+06 4.643468672559977e+06 -2.840187311450798e+03 -4.545254530555154e+03 -5.518114421727834e+03 1.916870120600000e-03 7.337122999400000e-04 1.159096367800000e-03 2.444819232100000e-03 1.868036280500000e-03 3.272469259000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.740000000000000e+02 -1.166047634708204e+06 -4.924949304288351e+06 4.643358309066248e+06 -2.840172073952302e+03 -4.545125713568120e+03 -5.518228860065032e+03 1.916870120600000e-03 7.337122999400000e-04 1.159096367800000e-03 2.444819232100000e-03 1.868036280500000e-03 3.272469259000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.750000000000000e+02 -1.166104437992551e+06 -4.925040205505672e+06 4.643247943355346e+06 -2.840156835485618e+03 -4.544996900133768e+03 -5.518343290514320e+03 1.916870120600000e-03 7.337122999400000e-04 1.159096367800000e-03 2.444819232100000e-03 1.868036280500000e-03 3.272469259000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.760000000000000e+02 -1.166161240973770e+06 -4.925131104149744e+06 4.643137575352211e+06 -2.840141596251096e+03 -4.544868083785215e+03 -5.518457718411961e+03 1.916870120600000e-03 7.337122999400000e-04 1.159096367800000e-03 2.444819232100000e-03 1.868036280500000e-03 3.272469259000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.770000000000000e+02 -1.166218043629377e+06 -4.925222000178695e+06 4.643027205106924e+06 -2.840126355667363e+03 -4.544739269083874e+03 -5.518572140192507e+03 1.916823711500000e-03 7.334078665900000e-04 1.159269326400000e-03 2.443984690900000e-03 1.867915683200000e-03 3.273454095500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.780000000000000e+02 -1.166274846026357e+06 -4.925312893717471e+06 4.642916832470113e+06 -2.840111110926993e+03 -4.544610445512106e+03 -5.518686565941822e+03 1.916823711500000e-03 7.334078665900000e-04 1.159269326400000e-03 2.443984690900000e-03 1.867915683200000e-03 3.273454095500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.790000000000000e+02 -1.166331648086550e+06 -4.925403784620310e+06 4.642806457616026e+06 -2.840095866796953e+03 -4.544481624367292e+03 -5.518800984039082e+03 1.916823711500000e-03 7.334078665900000e-04 1.159269326400000e-03 2.443984690900000e-03 1.867915683200000e-03 3.273454095500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.800000000000000e+02 -1.166388449854576e+06 -4.925494672970454e+06 4.642696080445157e+06 -2.840080620070802e+03 -4.544352799734383e+03 -5.518915400888013e+03 1.916823711500000e-03 7.334078665900000e-04 1.159269326400000e-03 2.443984690900000e-03 1.867915683200000e-03 3.273454095500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.810000000000000e+02 -1.166445251307949e+06 -4.925585558726020e+06 4.642585701007579e+06 -2.840065371344765e+03 -4.544223974616518e+03 -5.519029813701432e+03 1.916823711500000e-03 7.334078665900000e-04 1.159269326400000e-03 2.443984690900000e-03 1.867915683200000e-03 3.273454095500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.820000000000000e+02 -1.166502052478665e+06 -4.925676441956272e+06 4.642475319232903e+06 -2.840050036618713e+03 -4.544095467661826e+03 -5.519143992948872e+03 1.916823711500000e-03 7.334078665900000e-04 1.159269326400000e-03 2.443984690900000e-03 1.867915683200000e-03 3.273454095500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.830000000000000e+02 -1.166558853326205e+06 -4.925767322592112e+06 4.642364935211979e+06 -2.840034643639323e+03 -4.543967175035474e+03 -5.519258013264394e+03 1.916823711500000e-03 7.334078665900000e-04 1.159269326400000e-03 2.443984690900000e-03 1.867915683200000e-03 3.273454095500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.840000000000000e+02 -1.166615653864806e+06 -4.925858200644052e+06 4.642254548911585e+06 -2.840019390244958e+03 -4.543838341321183e+03 -5.519372419330269e+03 1.916823711500000e-03 7.334078665900000e-04 1.159269326400000e-03 2.443984690900000e-03 1.867915683200000e-03 3.273454095500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.850000000000000e+02 -1.166672454077510e+06 -4.925949076080530e+06 4.642144160369478e+06 -2.840004135341224e+03 -4.543709509387291e+03 -5.519486819240626e+03 1.916823711500000e-03 7.334078665900000e-04 1.159269326400000e-03 2.443984690900000e-03 1.867915683200000e-03 3.273454095500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.860000000000000e+02 -1.166729254020125e+06 -4.926039949005619e+06 4.642033769461199e+06 -2.839988877160108e+03 -4.543580669905296e+03 -5.519601221613322e+03 1.916823711500000e-03 7.334078665900000e-04 1.159269326400000e-03 2.443984690900000e-03 1.867915683200000e-03 3.273454095500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.870000000000000e+02 -1.166786053636852e+06 -4.926130819315278e+06 4.641923376311160e+06 -2.839973618800369e+03 -4.543451831386440e+03 -5.519715617917904e+03 1.916777237000000e-03 7.331033551700000e-04 1.159442133400000e-03 2.443150217600000e-03 1.867794695500000e-03 3.274438960700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.880000000000000e+02 -1.166842852961130e+06 -4.926221687071898e+06 4.641812980844765e+06 -2.839958357800975e+03 -4.543322989359393e+03 -5.519830013010094e+03 1.916777237000000e-03 7.331033551700000e-04 1.159442133400000e-03 2.443150217600000e-03 1.867794695500000e-03 3.274438960700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.890000000000000e+02 -1.166899651992842e+06 -4.926312552275287e+06 4.641702583062227e+06 -2.839943094260792e+03 -4.543194143280063e+03 -5.519944407301464e+03 1.916777237000000e-03 7.331033551700000e-04 1.159442133400000e-03 2.443150217600000e-03 1.867794695500000e-03 3.274438960700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.900000000000000e+02 -1.166956450709745e+06 -4.926403414883974e+06 4.641592183013158e+06 -2.839927830234144e+03 -4.543065296629653e+03 -5.520058796949835e+03 1.916777237000000e-03 7.331033551700000e-04 1.159442133400000e-03 2.443150217600000e-03 1.867794695500000e-03 3.274438960700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.910000000000000e+02 -1.167013249134093e+06 -4.926494274939477e+06 4.641481780647893e+06 -2.839912563588357e+03 -4.542936446028258e+03 -5.520173185747494e+03 1.916777237000000e-03 7.331033551700000e-04 1.159442133400000e-03 2.443150217600000e-03 1.867794695500000e-03 3.274438960700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.920000000000000e+02 -1.167070047232581e+06 -4.926585132388047e+06 4.641371376049115e+06 -2.839897313451336e+03 -4.542808044682814e+03 -5.520287185139953e+03 1.916777237000000e-03 7.331033551700000e-04 1.159442133400000e-03 2.443150217600000e-03 1.867794695500000e-03 3.274438960700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.930000000000000e+02 -1.167126845007805e+06 -4.926675987239993e+06 4.641260969216676e+06 -2.839882074955960e+03 -4.542679939136136e+03 -5.520400926003512e+03 1.916777237000000e-03 7.331033551700000e-04 1.159442133400000e-03 2.443150217600000e-03 1.867794695500000e-03 3.274438960700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.940000000000000e+02 -1.167183642487466e+06 -4.926766839533217e+06 4.641150560074680e+06 -2.839866803445793e+03 -4.542551083979373e+03 -5.520515304795755e+03 1.916777237000000e-03 7.331033551700000e-04 1.159442133400000e-03 2.443150217600000e-03 1.867794695500000e-03 3.274438960700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.950000000000000e+02 -1.167240439663165e+06 -4.926857689252108e+06 4.641040148641804e+06 -2.839851529672712e+03 -4.542422226824200e+03 -5.520629680940214e+03 1.916777237000000e-03 7.331033551700000e-04 1.159442133400000e-03 2.443150217600000e-03 1.867794695500000e-03 3.274438960700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.960000000000000e+02 -1.167297236535031e+06 -4.926948536396886e+06 4.640929734917783e+06 -2.839836255090182e+03 -4.542293366952744e+03 -5.520744054385536e+03 1.916777237000000e-03 7.331033551700000e-04 1.159442133400000e-03 2.443150217600000e-03 1.867794695500000e-03 3.274438960700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.970000000000000e+02 -1.167354033080494e+06 -4.927039380925559e+06 4.640819318952872e+06 -2.839820978494224e+03 -4.542164508905134e+03 -5.520858421867362e+03 1.916730697200000e-03 7.327987657500000e-04 1.159614788800000e-03 2.442315812500000e-03 1.867673317500000e-03 3.275423854800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.980000000000000e+02 -1.167410829355605e+06 -4.927130222942557e+06 4.640708900622107e+06 -2.839805700065937e+03 -4.542035643028407e+03 -5.520972791395001e+03 1.916730697200000e-03 7.327987657500000e-04 1.159614788800000e-03 2.442315812500000e-03 1.867673317500000e-03 3.275423854800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.990000000000000e+02 -1.167467625337872e+06 -4.927221062406025e+06 4.640598479975575e+06 -2.839790418715379e+03 -4.541906773493767e+03 -5.521087159961718e+03 1.916730697200000e-03 7.327987657500000e-04 1.159614788800000e-03 2.442315812500000e-03 1.867673317500000e-03 3.275423854800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.000000000000000e+02 -1.167524420960092e+06 -4.927311899190725e+06 4.640488057163144e+06 -2.839775137564015e+03 -4.541777910421434e+03 -5.521201517683911e+03 1.916730697200000e-03 7.327987657500000e-04 1.159614788800000e-03 2.442315812500000e-03 1.867673317500000e-03 3.275423854800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.010000000000000e+02 -1.167581216323027e+06 -4.927402733484466e+06 4.640377631960077e+06 -2.839759853587550e+03 -4.541649038200998e+03 -5.521315879002683e+03 1.916730697200000e-03 7.327987657500000e-04 1.159614788800000e-03 2.442315812500000e-03 1.867673317500000e-03 3.275423854800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.020000000000000e+02 -1.167638011367999e+06 -4.927493565189105e+06 4.640267204495324e+06 -2.839744435115327e+03 -4.541520477759975e+03 -5.521430034130097e+03 1.916730697200000e-03 7.327987657500000e-04 1.159614788800000e-03 2.442315812500000e-03 1.867673317500000e-03 3.275423854800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.030000000000000e+02 -1.167694806077752e+06 -4.927584394279960e+06 4.640156774806090e+06 -2.839728927258385e+03 -4.541392126038913e+03 -5.521544049175813e+03 1.916730697200000e-03 7.327987657500000e-04 1.159614788800000e-03 2.442315812500000e-03 1.867673317500000e-03 3.275423854800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.040000000000000e+02 -1.167751600509837e+06 -4.927675220845649e+06 4.640046342767142e+06 -2.839713637947765e+03 -4.541263247272046e+03 -5.521658402340074e+03 1.916730697200000e-03 7.327987657500000e-04 1.159614788800000e-03 2.442315812500000e-03 1.867673317500000e-03 3.275423854800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.050000000000000e+02 -1.167808394626511e+06 -4.927766044815863e+06 4.639935908462640e+06 -2.839698347157437e+03 -4.541134367939999e+03 -5.521772751303821e+03 1.916730697200000e-03 7.327987657500000e-04 1.159614788800000e-03 2.442315812500000e-03 1.867673317500000e-03 3.275423854800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.060000000000000e+02 -1.167865188438829e+06 -4.927856866211262e+06 4.639825471867855e+06 -2.839683053735073e+03 -4.541005486782760e+03 -5.521887097640480e+03 1.916730697200000e-03 7.327987657500000e-04 1.159614788800000e-03 2.442315812500000e-03 1.867673317500000e-03 3.275423854800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.070000000000000e+02 -1.167921981969292e+06 -4.927947685073739e+06 4.639715032932631e+06 -2.839667759080832e+03 -4.540876599440735e+03 -5.522001444373384e+03 1.916684092000000e-03 7.324940982599999e-04 1.159787292700000e-03 2.441481475500000e-03 1.867551549200000e-03 3.276408778400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.080000000000000e+02 -1.167978775150603e+06 -4.928038501277970e+06 4.639604591807020e+06 -2.839652463048036e+03 -4.540747717460427e+03 -5.522115781895379e+03 1.916684092000000e-03 7.324940982599999e-04 1.159787292700000e-03 2.441481475500000e-03 1.867551549200000e-03 3.276408778400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.090000000000000e+02 -1.168035568061169e+06 -4.928129314970030e+06 4.639494148316131e+06 -2.839637165177146e+03 -4.540618827615805e+03 -5.522230121492788e+03 1.916684092000000e-03 7.324940982599999e-04 1.159787292700000e-03 2.441481475500000e-03 1.867551549200000e-03 3.276408778400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.100000000000000e+02 -1.168092360644957e+06 -4.928220126045564e+06 4.639383702584909e+06 -2.839621865624315e+03 -4.540489939329622e+03 -5.522344455202048e+03 1.916684092000000e-03 7.324940982599999e-04 1.159787292700000e-03 2.441481475500000e-03 1.867551549200000e-03 3.276408778400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.110000000000000e+02 -1.168149152935402e+06 -4.928310934566902e+06 4.639273254538730e+06 -2.839606563730941e+03 -4.540361047171467e+03 -5.522458787867845e+03 1.916684092000000e-03 7.324940982599999e-04 1.159787292700000e-03 2.441481475500000e-03 1.867551549200000e-03 3.276408778400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.120000000000000e+02 -1.168205944931243e+06 -4.928401740542039e+06 4.639162804183202e+06 -2.839591190951622e+03 -4.540232539404275e+03 -5.522572825065521e+03 1.916684092000000e-03 7.324940982599999e-04 1.159787292700000e-03 2.441481475500000e-03 1.867551549200000e-03 3.276408778400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.130000000000000e+02 -1.168262736603401e+06 -4.928492543923707e+06 4.639052351585020e+06 -2.839575770428658e+03 -4.540104289182313e+03 -5.522686662666879e+03 1.916684092000000e-03 7.324940982599999e-04 1.159787292700000e-03 2.441481475500000e-03 1.867551549200000e-03 3.276408778400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.140000000000000e+02 -1.168319527965100e+06 -4.928583344719361e+06 4.638941896709986e+06 -2.839560463088232e+03 -4.539975390561541e+03 -5.522800987164927e+03 1.916684092000000e-03 7.324940982599999e-04 1.159787292700000e-03 2.441481475500000e-03 1.867551549200000e-03 3.276408778400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.150000000000000e+02 -1.168376318999931e+06 -4.928674142898409e+06 4.638831439594741e+06 -2.839545155739224e+03 -4.539846492955506e+03 -5.522915305479598e+03 1.916684092000000e-03 7.324940982599999e-04 1.159787292700000e-03 2.441481475500000e-03 1.867551549200000e-03 3.276408778400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.160000000000000e+02 -1.168433109763684e+06 -4.928764938564839e+06 4.638720980114744e+06 -2.839529844892784e+03 -4.539717588096503e+03 -5.523029626101293e+03 1.916684092000000e-03 7.324940982599999e-04 1.159787292700000e-03 2.441481475500000e-03 1.867551549200000e-03 3.276408778400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.170000000000000e+02 -1.168489900233880e+06 -4.928855731676806e+06 4.638610518320111e+06 -2.839514531459401e+03 -4.539588679383663e+03 -5.523143945774246e+03 1.916637421700000e-03 7.321893526300000e-04 1.159959645300000e-03 2.440647206400000e-03 1.867429390700000e-03 3.277393732300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.180000000000000e+02 -1.168546690354740e+06 -4.928946522130374e+06 4.638500054335333e+06 -2.839499218891026e+03 -4.539459775280196e+03 -5.523258255861896e+03 1.916637421700000e-03 7.321893526300000e-04 1.159959645300000e-03 2.440647206400000e-03 1.867429390700000e-03 3.277393732300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.190000000000000e+02 -1.168603480204414e+06 -4.929037310071184e+06 4.638389587985964e+06 -2.839483902687131e+03 -4.539330863720520e+03 -5.523372568488076e+03 1.916637421700000e-03 7.321893526300000e-04 1.159959645300000e-03 2.440647206400000e-03 1.867429390700000e-03 3.277393732300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.200000000000000e+02 -1.168660269726883e+06 -4.929128095394914e+06 4.638279119396971e+06 -2.839468585194058e+03 -4.539201953757956e+03 -5.523486875018888e+03 1.916637421700000e-03 7.321893526300000e-04 1.159959645300000e-03 2.440647206400000e-03 1.867429390700000e-03 3.277393732300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.210000000000000e+02 -1.168717058933451e+06 -4.929218878122605e+06 4.638168648543150e+06 -2.839453267288825e+03 -4.539073042983393e+03 -5.523601177077907e+03 1.916637421700000e-03 7.321893526300000e-04 1.159959645300000e-03 2.440647206400000e-03 1.867429390700000e-03 3.277393732300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.220000000000000e+02 -1.168773847870052e+06 -4.929309658345157e+06 4.638058175332256e+06 -2.839438015362064e+03 -4.538944518597977e+03 -5.523715120694993e+03 1.916637421700000e-03 7.321893526300000e-04 1.159959645300000e-03 2.440647206400000e-03 1.867429390700000e-03 3.277393732300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.230000000000000e+02 -1.168830636484562e+06 -4.929400435968916e+06 4.637947699887505e+06 -2.839422809760101e+03 -4.538816253992560e+03 -5.523828820716756e+03 1.916637421700000e-03 7.321893526300000e-04 1.159959645300000e-03 2.440647206400000e-03 1.867429390700000e-03 3.277393732300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.240000000000000e+02 -1.168887424743925e+06 -4.929491210923617e+06 4.637837222265426e+06 -2.839407486316265e+03 -4.538687338701432e+03 -5.523943113030855e+03 1.916637421700000e-03 7.321893526300000e-04 1.159959645300000e-03 2.440647206400000e-03 1.867429390700000e-03 3.277393732300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.250000000000000e+02 -1.168944212754170e+06 -4.929581983406818e+06 4.637726742229323e+06 -2.839392158839987e+03 -4.538558412726428e+03 -5.524057410762072e+03 1.916637421700000e-03 7.321893526300000e-04 1.159959645300000e-03 2.440647206400000e-03 1.867429390700000e-03 3.277393732300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.260000000000000e+02 -1.169001000425978e+06 -4.929672753252119e+06 4.637616259978573e+06 -2.839376831626690e+03 -4.538429489427224e+03 -5.524171700799097e+03 1.916637421700000e-03 7.321893526300000e-04 1.159959645300000e-03 2.440647206400000e-03 1.867429390700000e-03 3.277393732300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.270000000000000e+02 -1.169057787803962e+06 -4.929763520542650e+06 4.637505775413565e+06 -2.839361501883073e+03 -4.538300562325876e+03 -5.524285989818241e+03 1.916590686300000e-03 7.318845289300000e-04 1.160131846800000e-03 2.439813005600000e-03 1.867306842000000e-03 3.278378716600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.280000000000000e+02 -1.169114574876813e+06 -4.929854285257414e+06 4.637395288559468e+06 -2.839346169662939e+03 -4.538171633234626e+03 -5.524400276278435e+03 1.916590686300000e-03 7.318845289300000e-04 1.160131846800000e-03 2.439813005600000e-03 1.867306842000000e-03 3.278378716600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.290000000000000e+02 -1.169171361644669e+06 -4.929945047396624e+06 4.637284799416019e+06 -2.839330836911925e+03 -4.538042701580508e+03 -5.524514559785822e+03 1.916590686300000e-03 7.318845289300000e-04 1.160131846800000e-03 2.439813005600000e-03 1.867306842000000e-03 3.278378716600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.300000000000000e+02 -1.169228148107405e+06 -4.930035806960110e+06 4.637174307983432e+06 -2.839315501715297e+03 -4.537913768106537e+03 -5.524628840578085e+03 1.916590686300000e-03 7.318845289300000e-04 1.160131846800000e-03 2.439813005600000e-03 1.867306842000000e-03 3.278378716600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.310000000000000e+02 -1.169284934264909e+06 -4.930126563947693e+06 4.637063814261919e+06 -2.839300164358477e+03 -4.537784832380954e+03 -5.524743118888424e+03 1.916590686300000e-03 7.318845289300000e-04 1.160131846800000e-03 2.439813005600000e-03 1.867306842000000e-03 3.278378716600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.320000000000000e+02 -1.169341720123623e+06 -4.930217318387037e+06 4.636953318229603e+06 -2.839284582443540e+03 -4.537656223267795e+03 -5.524857228321160e+03 1.916590686300000e-03 7.318845289300000e-04 1.160131846800000e-03 2.439813005600000e-03 1.867306842000000e-03 3.278378716600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.330000000000000e+02 -1.169398505656603e+06 -4.930308070238420e+06 4.636842819941572e+06 -2.839268836683422e+03 -4.537527833272874e+03 -5.524971222610785e+03 1.916590686300000e-03 7.318845289300000e-04 1.160131846800000e-03 2.439813005600000e-03 1.867306842000000e-03 3.278378716600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.340000000000000e+02 -1.169455290858296e+06 -4.930398819465403e+06 4.636732319422763e+06 -2.839253495830934e+03 -4.537398894377855e+03 -5.525085489119494e+03 1.916590686300000e-03 7.318845289300000e-04 1.160131846800000e-03 2.439813005600000e-03 1.867306842000000e-03 3.278378716600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.350000000000000e+02 -1.169512075777055e+06 -4.930489566158090e+06 4.636621816565169e+06 -2.839238151890624e+03 -4.537269949981590e+03 -5.525199756281616e+03 1.916590686300000e-03 7.318845289300000e-04 1.160131846800000e-03 2.439813005600000e-03 1.867306842000000e-03 3.278378716600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.360000000000000e+02 -1.169568860412762e+06 -4.930580310316293e+06 4.636511311368992e+06 -2.839222804780890e+03 -4.537140999787455e+03 -5.525314024381477e+03 1.916590686300000e-03 7.318845289300000e-04 1.160131846800000e-03 2.439813005600000e-03 1.867306842000000e-03 3.278378716600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.370000000000000e+02 -1.169625644698471e+06 -4.930671051815315e+06 4.636400803983746e+06 -2.839207458709298e+03 -4.537012054289997e+03 -5.525428282751129e+03 1.916543885900000e-03 7.315796270600000e-04 1.160303897300000e-03 2.438978872800000e-03 1.867183903200000e-03 3.279363732100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.380000000000000e+02 -1.169682428712318e+06 -4.930761790800725e+06 4.636290294234910e+06 -2.839192108921598e+03 -4.536883101654281e+03 -5.525542543425067e+03 1.916543885900000e-03 7.315796270600000e-04 1.160303897300000e-03 2.438978872800000e-03 1.867183903200000e-03 3.279363732100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.390000000000000e+02 -1.169739212409470e+06 -4.930852527189062e+06 4.636179782222545e+06 -2.839176757521561e+03 -4.536754148506706e+03 -5.525656799915781e+03 1.916543885900000e-03 7.315796270600000e-04 1.160303897300000e-03 2.438978872800000e-03 1.867183903200000e-03 3.279363732100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.400000000000000e+02 -1.169795995801233e+06 -4.930943261001368e+06 4.636069267921425e+06 -2.839161405078297e+03 -4.536625193022366e+03 -5.525771053494503e+03 1.916543885900000e-03 7.315796270600000e-04 1.160303897300000e-03 2.438978872800000e-03 1.867183903200000e-03 3.279363732100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.410000000000000e+02 -1.169852778887492e+06 -4.931033992237468e+06 4.635958751331761e+06 -2.839146050626973e+03 -4.536496235303352e+03 -5.525885304508794e+03 1.916543885900000e-03 7.315796270600000e-04 1.160303897300000e-03 2.438978872800000e-03 1.867183903200000e-03 3.279363732100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.420000000000000e+02 -1.169909561646211e+06 -4.931124720863192e+06 4.635848232510258e+06 -2.839130716289931e+03 -4.536367660639112e+03 -5.525999220776214e+03 1.916543885900000e-03 7.315796270600000e-04 1.160303897300000e-03 2.438978872800000e-03 1.867183903200000e-03 3.279363732100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.430000000000000e+02 -1.169966344113333e+06 -4.931215446949970e+06 4.635737711381677e+06 -2.839115394832157e+03 -4.536239332781837e+03 -5.526112919523269e+03 1.916543885900000e-03 7.315796270600000e-04 1.160303897300000e-03 2.438978872800000e-03 1.867183903200000e-03 3.279363732100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.440000000000000e+02 -1.170023126236293e+06 -4.931306170388632e+06 4.635627188050807e+06 -2.839100035731153e+03 -4.536110372308300e+03 -5.526227158916675e+03 1.916543885900000e-03 7.315796270600000e-04 1.160303897300000e-03 2.438978872800000e-03 1.867183903200000e-03 3.279363732100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.450000000000000e+02 -1.170079908098244e+06 -4.931396891334045e+06 4.635516662331912e+06 -2.839084672892321e+03 -4.535981402652804e+03 -5.526341402331580e+03 1.916543885900000e-03 7.315796270600000e-04 1.160303897300000e-03 2.438978872800000e-03 1.867183903200000e-03 3.279363732100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.460000000000000e+02 -1.170136689632235e+06 -4.931487609661536e+06 4.635406134374523e+06 -2.839069309969312e+03 -4.535852434081943e+03 -5.526455639542997e+03 1.916543885900000e-03 7.315796270600000e-04 1.160303897300000e-03 2.438978872800000e-03 1.867183903200000e-03 3.279363732100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.470000000000000e+02 -1.170193470838072e+06 -4.931578325370803e+06 4.635295604179007e+06 -2.839053945078582e+03 -4.535723467291401e+03 -5.526569870814719e+03 1.916497020500000e-03 7.312746470800000e-04 1.160475796800000e-03 2.438144808300000e-03 1.867060574400000e-03 3.280348779100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.480000000000000e+02 -1.170250251760596e+06 -4.931669038545320e+06 4.635185071645238e+06 -2.839038578720682e+03 -4.535594494182935e+03 -5.526684102693697e+03 1.916497020500000e-03 7.312746470800000e-04 1.160475796800000e-03 2.438144808300000e-03 1.867060574400000e-03 3.280348779100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.490000000000000e+02 -1.170307032410866e+06 -4.931759749205721e+06 4.635074536748463e+06 -2.839023208754726e+03 -4.535465514149155e+03 -5.526798336647696e+03 1.916497020500000e-03 7.312746470800000e-04 1.160475796800000e-03 2.438144808300000e-03 1.867060574400000e-03 3.280348779100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.500000000000000e+02 -1.170363812699344e+06 -4.931850457185335e+06 4.634963999688632e+06 -2.839007838709218e+03 -4.535336540698760e+03 -5.526912559799483e+03 1.916497020500000e-03 7.312746470800000e-04 1.160475796800000e-03 2.438144808300000e-03 1.867060574400000e-03 3.280348779100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.510000000000000e+02 -1.170420592704399e+06 -4.931941162630064e+06 4.634853460290707e+06 -2.838992466877366e+03 -4.535207561157114e+03 -5.527026783511716e+03 1.916497020500000e-03 7.312746470800000e-04 1.160475796800000e-03 2.438144808300000e-03 1.867060574400000e-03 3.280348779100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.520000000000000e+02 -1.170477372401133e+06 -4.932031865507069e+06 4.634742918611214e+06 -2.838976971124473e+03 -4.535079027235198e+03 -5.527140684938235e+03 1.916497020500000e-03 7.312746470800000e-04 1.160475796800000e-03 2.438144808300000e-03 1.867060574400000e-03 3.280348779100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.530000000000000e+02 -1.170534151780964e+06 -4.932122565809376e+06 4.634632374669896e+06 -2.838961392216275e+03 -4.534950788275323e+03 -5.527254371763398e+03 1.916497020500000e-03 7.312746470800000e-04 1.160475796800000e-03 2.438144808300000e-03 1.867060574400000e-03 3.280348779100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.540000000000000e+02 -1.170590930858405e+06 -4.932213263541541e+06 4.634521828432781e+06 -2.838946014756458e+03 -4.534821800409837e+03 -5.527368588940945e+03 1.916497020500000e-03 7.312746470800000e-04 1.160475796800000e-03 2.438144808300000e-03 1.867060574400000e-03 3.280348779100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.550000000000000e+02 -1.170647709596315e+06 -4.932303958634463e+06 4.634411279982796e+06 -2.838930636351082e+03 -4.534692816000457e+03 -5.527482798320735e+03 1.916497020500000e-03 7.312746470800000e-04 1.160475796800000e-03 2.438144808300000e-03 1.867060574400000e-03 3.280348779100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.560000000000000e+02 -1.170704488050465e+06 -4.932394651192022e+06 4.634300729195303e+06 -2.838915254730054e+03 -4.534563826172359e+03 -5.527597008339188e+03 1.916497020500000e-03 7.312746470800000e-04 1.160475796800000e-03 2.438144808300000e-03 1.867060574400000e-03 3.280348779100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.570000000000000e+02 -1.170761266198627e+06 -4.932485341172813e+06 4.634190176119980e+06 -2.838899872479760e+03 -4.534434833601692e+03 -5.527711215599239e+03 1.916450090400000e-03 7.309695889300000e-04 1.160647545600000e-03 2.437310812100000e-03 1.866936855500000e-03 3.281333858200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.580000000000000e+02 -1.170818044062957e+06 -4.932576028618138e+06 4.634079620707254e+06 -2.838884486504292e+03 -4.534305835691168e+03 -5.527825423659955e+03 1.916450090400000e-03 7.309695889300000e-04 1.160647545600000e-03 2.437310812100000e-03 1.866936855500000e-03 3.281333858200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.590000000000000e+02 -1.170874821587698e+06 -4.932666713424184e+06 4.633969063081723e+06 -2.838869101176789e+03 -4.534176840540276e+03 -5.527939623791080e+03 1.916450090400000e-03 7.309695889300000e-04 1.160647545600000e-03 2.437310812100000e-03 1.866936855500000e-03 3.281333858200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.600000000000000e+02 -1.170931598806262e+06 -4.932757395653203e+06 4.633858503168681e+06 -2.838853713361925e+03 -4.534047843550857e+03 -5.528053821241768e+03 1.916450090400000e-03 7.309695889300000e-04 1.160647545600000e-03 2.437310812100000e-03 1.866936855500000e-03 3.281333858200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.610000000000000e+02 -1.170988375729713e+06 -4.932848075325825e+06 4.633747940943372e+06 -2.838838323045793e+03 -4.533918842785497e+03 -5.528168017637177e+03 1.916450090400000e-03 7.309695889300000e-04 1.160647545600000e-03 2.437310812100000e-03 1.866936855500000e-03 3.281333858200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.620000000000000e+02 -1.171045152347420e+06 -4.932938752427900e+06 4.633637376436062e+06 -2.838822952783026e+03 -4.533790161190530e+03 -5.528281933011269e+03 1.916450090400000e-03 7.309695889300000e-04 1.160647545600000e-03 2.437310812100000e-03 1.866936855500000e-03 3.281333858200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.630000000000000e+02 -1.171101928645328e+06 -4.933029426937067e+06 4.633526809682422e+06 -2.838807594472756e+03 -4.533661692998925e+03 -5.528395659397963e+03 1.916450090400000e-03 7.309695889300000e-04 1.160647545600000e-03 2.437310812100000e-03 1.866936855500000e-03 3.281333858200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.640000000000000e+02 -1.171158704664810e+06 -4.933120098920972e+06 4.633416240579143e+06 -2.838792198020894e+03 -4.533532682185984e+03 -5.528509850946482e+03 1.916450090400000e-03 7.309695889300000e-04 1.160647545600000e-03 2.437310812100000e-03 1.866936855500000e-03 3.281333858200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.650000000000000e+02 -1.171215480355670e+06 -4.933210768286148e+06 4.633305669238415e+06 -2.838776801570437e+03 -4.533403672320815e+03 -5.528624036370416e+03 1.916450090400000e-03 7.309695889300000e-04 1.160647545600000e-03 2.437310812100000e-03 1.866936855500000e-03 3.281333858200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.660000000000000e+02 -1.171272255728966e+06 -4.933301435053229e+06 4.633195095635482e+06 -2.838761403273365e+03 -4.533274662215284e+03 -5.528738217491405e+03 1.916450090400000e-03 7.309695889300000e-04 1.160647545600000e-03 2.437310812100000e-03 1.866936855500000e-03 3.281333858200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.670000000000000e+02 -1.171329030795759e+06 -4.933392099242846e+06 4.633084519745574e+06 -2.838746002632724e+03 -4.533145650037216e+03 -5.528852396063012e+03 1.916403095400000e-03 7.306644525399999e-04 1.160819143800000e-03 2.436476883900000e-03 1.866812746700000e-03 3.282318970100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.680000000000000e+02 -1.171385805567351e+06 -4.933482760876016e+06 4.632973941543460e+06 -2.838730600964762e+03 -4.533016633575247e+03 -5.528966573342265e+03 1.916403095400000e-03 7.306644525399999e-04 1.160819143800000e-03 2.436476883900000e-03 1.866812746700000e-03 3.282318970100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.690000000000000e+02 -1.171442580043626e+06 -4.933573419952565e+06 4.632863361029346e+06 -2.838715196480159e+03 -4.532887613417141e+03 -5.529080749640234e+03 1.916403095400000e-03 7.306644525399999e-04 1.160819143800000e-03 2.436476883900000e-03 1.866812746700000e-03 3.282318970100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.700000000000000e+02 -1.171499354179764e+06 -4.933664076389114e+06 4.632752778303358e+06 -2.838699791080532e+03 -4.532758596525911e+03 -5.529194918288372e+03 1.916403095400000e-03 7.306644525399999e-04 1.160819143800000e-03 2.436476883900000e-03 1.866812746700000e-03 3.282318970100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.710000000000000e+02 -1.171556128031773e+06 -4.933754730289883e+06 4.632642193240344e+06 -2.838684384085841e+03 -4.532629573471685e+03 -5.529309087468044e+03 1.916403095400000e-03 7.306644525399999e-04 1.160819143800000e-03 2.436476883900000e-03 1.866812746700000e-03 3.282318970100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.720000000000000e+02 -1.171612901573593e+06 -4.933845381620971e+06 4.632531605895728e+06 -2.838668798704362e+03 -4.532500948585298e+03 -5.529422998731588e+03 1.916403095400000e-03 7.306644525399999e-04 1.160819143800000e-03 2.436476883900000e-03 1.866812746700000e-03 3.282318970100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.730000000000000e+02 -1.171669674795743e+06 -4.933936030374351e+06 4.632421016288907e+06 -2.838653096208484e+03 -4.532372586324184e+03 -5.529536737829148e+03 1.916403095400000e-03 7.306644525399999e-04 1.160819143800000e-03 2.436476883900000e-03 1.866812746700000e-03 3.282318970100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.740000000000000e+02 -1.171726447694254e+06 -4.934026676518496e+06 4.632310424433276e+06 -2.838637683481681e+03 -4.532243556987539e+03 -5.529650898802573e+03 1.916403095400000e-03 7.306644525399999e-04 1.160819143800000e-03 2.436476883900000e-03 1.866812746700000e-03 3.282318970100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.750000000000000e+02 -1.171783220297155e+06 -4.934117320105628e+06 4.632199830266129e+06 -2.838622267962735e+03 -4.532114523909561e+03 -5.529765058821041e+03 1.916403095400000e-03 7.306644525399999e-04 1.160819143800000e-03 2.436476883900000e-03 1.866812746700000e-03 3.282318970100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.760000000000000e+02 -1.171839992571041e+06 -4.934207961073571e+06 4.632089233862150e+06 -2.838606852344837e+03 -4.531985492000168e+03 -5.529879212577314e+03 1.916403095400000e-03 7.306644525399999e-04 1.160819143800000e-03 2.436476883900000e-03 1.866812746700000e-03 3.282318970100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.770000000000000e+02 -1.171896764560510e+06 -4.934298599505340e+06 4.631978635121617e+06 -2.838591433981583e+03 -4.531856454351886e+03 -5.529993367025540e+03 1.916356035800000e-03 7.303592379900000e-04 1.160990591400000e-03 2.435643024100000e-03 1.866688248000000e-03 3.283304115100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.780000000000000e+02 -1.171953536209556e+06 -4.934389235296768e+06 4.631868034169662e+06 -2.838576014284956e+03 -4.531727420126997e+03 -5.530107513882613e+03 1.916356035800000e-03 7.303592379900000e-04 1.160990591400000e-03 2.435643024100000e-03 1.866688248000000e-03 3.283304115100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.790000000000000e+02 -1.172010307596540e+06 -4.934479868593663e+06 4.631757430831142e+06 -2.838560592371788e+03 -4.531598376298026e+03 -5.530221664421426e+03 1.916356035800000e-03 7.303592379900000e-04 1.160990591400000e-03 2.435643024100000e-03 1.866688248000000e-03 3.283304115100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.800000000000000e+02 -1.172067078654292e+06 -4.934570499271062e+06 4.631646825256165e+06 -2.838545168846176e+03 -4.531469334051521e+03 -5.530335809031350e+03 1.916356035800000e-03 7.303592379900000e-04 1.160990591400000e-03 2.435643024100000e-03 1.866688248000000e-03 3.283304115100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.810000000000000e+02 -1.172123849393871e+06 -4.934661127349591e+06 4.631536217419959e+06 -2.838529743609350e+03 -4.531340291335026e+03 -5.530449949470507e+03 1.916356035800000e-03 7.303592379900000e-04 1.160990591400000e-03 2.435643024100000e-03 1.866688248000000e-03 3.283304115100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.820000000000000e+02 -1.172180619839827e+06 -4.934751752878908e+06 4.631425607279762e+06 -2.838514420495992e+03 -4.531211636655004e+03 -5.530563714882419e+03 1.916356035800000e-03 7.303592379900000e-04 1.160990591400000e-03 2.435643024100000e-03 1.866688248000000e-03 3.283304115100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.830000000000000e+02 -1.172237389946290e+06 -4.934842375776360e+06 4.631314994946084e+06 -2.838499164614165e+03 -4.531083245071190e+03 -5.530677225237603e+03 1.916356035800000e-03 7.303592379900000e-04 1.160990591400000e-03 2.435643024100000e-03 1.866688248000000e-03 3.283304115100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.840000000000000e+02 -1.172294159787169e+06 -4.934932996172830e+06 4.631204380233576e+06 -2.838483734207314e+03 -4.530954192350823e+03 -5.530791360370473e+03 1.916356035800000e-03 7.303592379900000e-04 1.160990591400000e-03 2.435643024100000e-03 1.866688248000000e-03 3.283304115100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.850000000000000e+02 -1.172350929332166e+06 -4.935023614011976e+06 4.631093763209921e+06 -2.838468301057922e+03 -4.530825135543493e+03 -5.530905494813764e+03 1.916356035800000e-03 7.303592379900000e-04 1.160990591400000e-03 2.435643024100000e-03 1.866688248000000e-03 3.283304115100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.860000000000000e+02 -1.172407698547638e+06 -4.935114229231242e+06 4.630983143950303e+06 -2.838452866506072e+03 -4.530696080315432e+03 -5.531019623237642e+03 1.916356035800000e-03 7.303592379900000e-04 1.160990591400000e-03 2.435643024100000e-03 1.866688248000000e-03 3.283304115100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.870000000000000e+02 -1.172464467433714e+06 -4.935204841830851e+06 4.630872522454459e+06 -2.838437432004209e+03 -4.530567026239581e+03 -5.531133745348128e+03 1.916308911700000e-03 7.300539451700000e-04 1.161161888700000e-03 2.434809232500000e-03 1.866563359400000e-03 3.284289293800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.880000000000000e+02 -1.172521236046152e+06 -4.935295451914587e+06 4.630761898597664e+06 -2.838421994136050e+03 -4.530437964708826e+03 -5.531247869859329e+03 1.916308911700000e-03 7.300539451700000e-04 1.161161888700000e-03 2.434809232500000e-03 1.866563359400000e-03 3.284289293800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.890000000000000e+02 -1.172578004362481e+06 -4.935386059440690e+06 4.630651272430108e+06 -2.838406553386064e+03 -4.530308899615299e+03 -5.531361993305560e+03 1.916308911700000e-03 7.300539451700000e-04 1.161161888700000e-03 2.434809232500000e-03 1.866563359400000e-03 3.284289293800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.900000000000000e+02 -1.172634772326963e+06 -4.935476664305428e+06 4.630540644076464e+06 -2.838391113701064e+03 -4.530179838825577e+03 -5.531476107353968e+03 1.916308911700000e-03 7.300539451700000e-04 1.161161888700000e-03 2.434809232500000e-03 1.866563359400000e-03 3.284289293800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.910000000000000e+02 -1.172691540006521e+06 -4.935567266633363e+06 4.630430013387017e+06 -2.838375670749730e+03 -4.530050772561325e+03 -5.531590222105180e+03 1.916308911700000e-03 7.300539451700000e-04 1.161161888700000e-03 2.434809232500000e-03 1.866563359400000e-03 3.284289293800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.920000000000000e+02 -1.172748307350982e+06 -4.935657866347280e+06 4.630319380464622e+06 -2.838359958130226e+03 -4.529922013117632e+03 -5.531704196330925e+03 1.916308911700000e-03 7.300539451700000e-04 1.161161888700000e-03 2.434809232500000e-03 1.866563359400000e-03 3.284289293800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.930000000000000e+02 -1.172805074392089e+06 -4.935748463516862e+06 4.630208745232150e+06 -2.838344066361132e+03 -4.529793449767618e+03 -5.531818081870466e+03 1.916308911700000e-03 7.300539451700000e-04 1.161161888700000e-03 2.434809232500000e-03 1.866563359400000e-03 3.284289293800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.940000000000000e+02 -1.172861841135118e+06 -4.935839058125239e+06 4.630098107693218e+06 -2.838328617324733e+03 -4.529664373641889e+03 -5.531932191557493e+03 1.916308911700000e-03 7.300539451700000e-04 1.161161888700000e-03 2.434809232500000e-03 1.866563359400000e-03 3.284289293800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.950000000000000e+02 -1.172918607525960e+06 -4.935929650071779e+06 4.629987467968798e+06 -2.838313167700806e+03 -4.529535302286453e+03 -5.532046292199363e+03 1.916308911700000e-03 7.300539451700000e-04 1.161161888700000e-03 2.434809232500000e-03 1.866563359400000e-03 3.284289293800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.960000000000000e+02 -1.172975373631787e+06 -4.936020239481434e+06 4.629876825908691e+06 -2.838297716587480e+03 -4.529406225200061e+03 -5.532160392961131e+03 1.916308911700000e-03 7.300539451700000e-04 1.161161888700000e-03 2.434809232500000e-03 1.866563359400000e-03 3.284289293800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.970000000000000e+02 -1.173032139430047e+06 -4.936110826312316e+06 4.629766181563242e+06 -2.838282262485241e+03 -4.529277146135861e+03 -5.532274491383416e+03 1.916261723000000e-03 7.297485741300000e-04 1.161333035700000e-03 2.433975509300000e-03 1.866438081100000e-03 3.285274506600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.980000000000000e+02 -1.173088904920877e+06 -4.936201410564650e+06 4.629655534932193e+06 -2.838266807859823e+03 -4.529148064547033e+03 -5.532388586817739e+03 1.916261723000000e-03 7.297485741300000e-04 1.161333035700000e-03 2.433975509300000e-03 1.866438081100000e-03 3.285274506600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.990000000000000e+02 -1.173145670126497e+06 -4.936291992279826e+06 4.629544885965766e+06 -2.838251349979527e+03 -4.529018977515313e+03 -5.532502682921848e+03 1.916261723000000e-03 7.297485741300000e-04 1.161333035700000e-03 2.433975509300000e-03 1.866438081100000e-03 3.285274506600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.000000000000000e+02 -1.173202434990930e+06 -4.936382571353746e+06 4.629434234789144e+06 -2.838235891166943e+03 -4.528889893618796e+03 -5.532616771500427e+03 1.916261723000000e-03 7.297485741300000e-04 1.161333035700000e-03 2.433975509300000e-03 1.866438081100000e-03 3.285274506600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.010000000000000e+02 -1.173259199558994e+06 -4.936473147869769e+06 4.629323581302088e+06 -2.838220431066320e+03 -4.528760805534964e+03 -5.532730858820491e+03 1.916261723000000e-03 7.297485741300000e-04 1.161333035700000e-03 2.433975509300000e-03 1.866438081100000e-03 3.285274506600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.020000000000000e+02 -1.173315963810116e+06 -4.936563721794691e+06 4.629212925562739e+06 -2.838205063292064e+03 -4.528632143417418e+03 -5.532844544198377e+03 1.916261723000000e-03 7.297485741300000e-04 1.161333035700000e-03 2.433975509300000e-03 1.866438081100000e-03 3.285274506600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.030000000000000e+02 -1.173372727749885e+06 -4.936654293142287e+06 4.629102267566605e+06 -2.838189755543937e+03 -4.528503762107792e+03 -5.532957963193769e+03 1.916261723000000e-03 7.297485741300000e-04 1.161333035700000e-03 2.433975509300000e-03 1.866438081100000e-03 3.285274506600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.040000000000000e+02 -1.173429491359338e+06 -4.936744861868904e+06 4.628991607335920e+06 -2.838174291087234e+03 -4.528374671054363e+03 -5.533072038954011e+03 1.916261723000000e-03 7.297485741300000e-04 1.161333035700000e-03 2.433975509300000e-03 1.866438081100000e-03 3.285274506600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.050000000000000e+02 -1.173486254683374e+06 -4.936835428058102e+06 4.628880944770175e+06 -2.838158823483017e+03 -4.528245574408880e+03 -5.533186115459751e+03 1.916261723000000e-03 7.297485741300000e-04 1.161333035700000e-03 2.433975509300000e-03 1.866438081100000e-03 3.285274506600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.060000000000000e+02 -1.173543017699528e+06 -4.936925991668137e+06 4.628770279919581e+06 -2.838143353618029e+03 -4.528116475808305e+03 -5.533300189280877e+03 1.916261723000000e-03 7.297485741300000e-04 1.161333035700000e-03 2.433975509300000e-03 1.866438081100000e-03 3.285274506600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.070000000000000e+02 -1.173599780407931e+06 -4.937016552699233e+06 4.628659612783877e+06 -2.838127883035237e+03 -4.527987374828289e+03 -5.533414260080197e+03 1.916214469900000e-03 7.294431248400000e-04 1.161504032700000e-03 2.433141854400000e-03 1.866312412900000e-03 3.286259754100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.080000000000000e+02 -1.173656542819552e+06 -4.937107111171862e+06 4.628548943338433e+06 -2.838112409122952e+03 -4.527858270014689e+03 -5.533528330239678e+03 1.916214469900000e-03 7.294431248400000e-04 1.161504032700000e-03 2.433141854400000e-03 1.866312412900000e-03 3.286259754100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.090000000000000e+02 -1.173713304912180e+06 -4.937197667044679e+06 4.628438271632981e+06 -2.838096935040533e+03 -4.527729164601804e+03 -5.533642395647862e+03 1.916214469900000e-03 7.294431248400000e-04 1.161504032700000e-03 2.433141854400000e-03 1.866312412900000e-03 3.286259754100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.100000000000000e+02 -1.173770066696867e+06 -4.937288220338293e+06 4.628327597642740e+06 -2.838081458589359e+03 -4.527600057128318e+03 -5.533756458507765e+03 1.916214469900000e-03 7.294431248400000e-04 1.161504032700000e-03 2.433141854400000e-03 1.866312412900000e-03 3.286259754100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.110000000000000e+02 -1.173826828173498e+06 -4.937378771052533e+06 4.628216921367922e+06 -2.838065979941718e+03 -4.527470947749088e+03 -5.533870518613145e+03 1.916214469900000e-03 7.294431248400000e-04 1.161504032700000e-03 2.433141854400000e-03 1.866312412900000e-03 3.286259754100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.120000000000000e+02 -1.173883589337707e+06 -4.937469319194195e+06 4.628106242811725e+06 -2.838050275725150e+03 -4.527342164688628e+03 -5.533984402373073e+03 1.916214469900000e-03 7.294431248400000e-04 1.161504032700000e-03 2.433141854400000e-03 1.866312412900000e-03 3.286259754100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.130000000000000e+02 -1.173940350172330e+06 -4.937559864741279e+06 4.627995562008154e+06 -2.838034421005966e+03 -4.527213598711318e+03 -5.534098167246038e+03 1.916214469900000e-03 7.294431248400000e-04 1.161504032700000e-03 2.433141854400000e-03 1.866312412900000e-03 3.286259754100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.140000000000000e+02 -1.173997110705166e+06 -4.937650407720714e+06 4.627884878905904e+06 -2.838018937076555e+03 -4.527084482855391e+03 -5.534212219120732e+03 1.916214469900000e-03 7.294431248400000e-04 1.161504032700000e-03 2.433141854400000e-03 1.866312412900000e-03 3.286259754100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.150000000000000e+02 -1.174053870918791e+06 -4.937740948100082e+06 4.627774193543977e+06 -2.838003452511045e+03 -4.526955366209408e+03 -5.534326266612436e+03 1.916214469900000e-03 7.294431248400000e-04 1.161504032700000e-03 2.433141854400000e-03 1.866312412900000e-03 3.286259754100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.160000000000000e+02 -1.174110630846614e+06 -4.937831485941540e+06 4.627663505847583e+06 -2.837987965255639e+03 -4.526826243983796e+03 -5.534440314632566e+03 1.916214469900000e-03 7.294431248400000e-04 1.161504032700000e-03 2.433141854400000e-03 1.866312412900000e-03 3.286259754100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.170000000000000e+02 -1.174167390454993e+06 -4.937922021182586e+06 4.627552815891935e+06 -2.837972475897496e+03 -4.526697121400866e+03 -5.534554358565700e+03 1.916167152500000e-03 7.291375972000000e-04 1.161674879600000e-03 2.432308267800000e-03 1.866186355100000e-03 3.287245037000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.180000000000000e+02 -1.174224149766401e+06 -4.938012553864981e+06 4.627442123626774e+06 -2.837956985450230e+03 -4.526567994666313e+03 -5.534668401120146e+03 1.916167152500000e-03 7.291375972000000e-04 1.161674879600000e-03 2.432308267800000e-03 1.866186355100000e-03 3.287245037000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.190000000000000e+02 -1.174280908758380e+06 -4.938103083947008e+06 4.627331429102315e+06 -2.837941493097833e+03 -4.526438867828841e+03 -5.534782439287274e+03 1.916167152500000e-03 7.291375972000000e-04 1.161674879600000e-03 2.432308267800000e-03 1.866186355100000e-03 3.287245037000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.200000000000000e+02 -1.174337667430813e+06 -4.938193611428494e+06 4.627220732318763e+06 -2.837925998936802e+03 -4.526309740271295e+03 -5.534896473538370e+03 1.916167152500000e-03 7.291375972000000e-04 1.161674879600000e-03 2.432308267800000e-03 1.866186355100000e-03 3.287245037000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.210000000000000e+02 -1.174394425795000e+06 -4.938284136330433e+06 4.627110033250868e+06 -2.837910503947951e+03 -4.526180610848811e+03 -5.535010504388450e+03 1.916167152500000e-03 7.291375972000000e-04 1.161674879600000e-03 2.432308267800000e-03 1.866186355100000e-03 3.287245037000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.220000000000000e+02 -1.174451183886796e+06 -4.938374658722389e+06 4.626999331831391e+06 -2.837895131995696e+03 -4.526051851254866e+03 -5.535124166682923e+03 1.916167152500000e-03 7.291375972000000e-04 1.161674879600000e-03 2.432308267800000e-03 1.866186355100000e-03 3.287245037000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.230000000000000e+02 -1.174507941621227e+06 -4.938465178448201e+06 4.626888628259265e+06 -2.837879845022010e+03 -4.525923346694341e+03 -5.535237573130557e+03 1.916167152500000e-03 7.291375972000000e-04 1.161674879600000e-03 2.432308267800000e-03 1.866186355100000e-03 3.287245037000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.240000000000000e+02 -1.174564699055478e+06 -4.938555695609552e+06 4.626777922384628e+06 -2.837864343831934e+03 -4.525794208717712e+03 -5.535351597888840e+03 1.916167152500000e-03 7.291375972000000e-04 1.161674879600000e-03 2.432308267800000e-03 1.866186355100000e-03 3.287245037000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.250000000000000e+02 -1.174621456147667e+06 -4.938646210128611e+06 4.626667214301202e+06 -2.837848841775130e+03 -4.525665074295453e+03 -5.535465614748939e+03 1.916167152500000e-03 7.291375972000000e-04 1.161674879600000e-03 2.432308267800000e-03 1.866186355100000e-03 3.287245037000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.260000000000000e+02 -1.174678212976112e+06 -4.938736722150980e+06 4.626556503833670e+06 -2.837833337025443e+03 -4.525535930218221e+03 -5.535579635532459e+03 1.916167152500000e-03 7.291375972000000e-04 1.161674879600000e-03 2.432308267800000e-03 1.866186355100000e-03 3.287245037000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.270000000000000e+02 -1.174734969507190e+06 -4.938827231614182e+06 4.626445791057263e+06 -2.837817829842948e+03 -4.525406782303596e+03 -5.535693655276204e+03 1.916119770900000e-03 7.288319913100000e-04 1.161845576800000e-03 2.431474749700000e-03 1.866059907600000e-03 3.288230355500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.280000000000000e+02 -1.174791725696099e+06 -4.938917738434958e+06 4.626335076072223e+06 -2.837802321524310e+03 -4.525277637752196e+03 -5.535807667401987e+03 1.916119770900000e-03 7.288319913100000e-04 1.161845576800000e-03 2.431474749700000e-03 1.866059907600000e-03 3.288230355500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.290000000000000e+02 -1.174848481609988e+06 -4.939008242738143e+06 4.626224358728247e+06 -2.837786811216121e+03 -4.525148485451136e+03 -5.535921681548255e+03 1.916119770900000e-03 7.288319913100000e-04 1.161845576800000e-03 2.431474749700000e-03 1.866059907600000e-03 3.288230355500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.300000000000000e+02 -1.174905237192892e+06 -4.939098744419720e+06 4.626113639150579e+06 -2.837771299441619e+03 -4.525019334506330e+03 -5.536035689896309e+03 1.916119770900000e-03 7.288319913100000e-04 1.161845576800000e-03 2.431474749700000e-03 1.866059907600000e-03 3.288230355500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.310000000000000e+02 -1.174961992444691e+06 -4.939189243479520e+06 4.626002917339445e+06 -2.837755786199863e+03 -4.524890185355167e+03 -5.536149692082727e+03 1.916119770900000e-03 7.288319913100000e-04 1.161845576800000e-03 2.431474749700000e-03 1.866059907600000e-03 3.288230355500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.320000000000000e+02 -1.175018747371381e+06 -4.939279739948890e+06 4.625892193275807e+06 -2.837740007177711e+03 -4.524761553069987e+03 -5.536263377442824e+03 1.916119770900000e-03 7.288319913100000e-04 1.161845576800000e-03 2.431474749700000e-03 1.866059907600000e-03 3.288230355500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.330000000000000e+02 -1.175075502041684e+06 -4.939370233969095e+06 4.625781466801972e+06 -2.837724046670771e+03 -4.524633252222796e+03 -5.536376862709598e+03 1.916119770900000e-03 7.288319913100000e-04 1.161845576800000e-03 2.431474749700000e-03 1.866059907600000e-03 3.288230355500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.340000000000000e+02 -1.175132256344472e+06 -4.939460725299857e+06 4.625670738176171e+06 -2.837708529150790e+03 -4.524504096065987e+03 -5.536490856686933e+03 1.916119770900000e-03 7.288319913100000e-04 1.161845576800000e-03 2.431474749700000e-03 1.866059907600000e-03 3.288230355500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.350000000000000e+02 -1.175189010371948e+06 -4.939551214112623e+06 4.625560007191903e+06 -2.837693008167270e+03 -4.524374932630046e+03 -5.536604852951354e+03 1.916119770900000e-03 7.288319913100000e-04 1.161845576800000e-03 2.431474749700000e-03 1.866059907600000e-03 3.288230355500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.360000000000000e+02 -1.175245764079316e+06 -4.939641700324162e+06 4.625449273949430e+06 -2.837677485394799e+03 -4.524245768905388e+03 -5.536718844932573e+03 1.916119770900000e-03 7.288319913100000e-04 1.161845576800000e-03 2.431474749700000e-03 1.866059907600000e-03 3.288230355500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.370000000000000e+02 -1.175302517500209e+06 -4.939732183996984e+06 4.625338538373453e+06 -2.837661960942601e+03 -4.524116599190371e+03 -5.536832837328963e+03 1.916072325100000e-03 7.285263070500000e-04 1.162016124200000e-03 2.430641299900000e-03 1.865933070500000e-03 3.289215710400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.380000000000000e+02 -1.175359270589836e+06 -4.939822665047858e+06 4.625227800564227e+06 -2.837646434994882e+03 -4.523987430989592e+03 -5.536946823809834e+03 1.916072325100000e-03 7.285263070500000e-04 1.162016124200000e-03 2.430641299900000e-03 1.865933070500000e-03 3.289215710400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.390000000000000e+02 -1.175416023359248e+06 -4.939913143497380e+06 4.625117060496962e+06 -2.837630907363830e+03 -4.523858262570667e+03 -5.537060805901870e+03 1.916072325100000e-03 7.285263070500000e-04 1.162016124200000e-03 2.430641299900000e-03 1.865933070500000e-03 3.289215710400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.400000000000000e+02 -1.175472775819741e+06 -4.940003619366527e+06 4.625006318146381e+06 -2.837615378746794e+03 -4.523729091691795e+03 -5.537174785159496e+03 1.916072325100000e-03 7.285263070500000e-04 1.162016124200000e-03 2.430641299900000e-03 1.865933070500000e-03 3.289215710400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.410000000000000e+02 -1.175529527982371e+06 -4.940094092675887e+06 4.624895573487679e+06 -2.837599847672433e+03 -4.523599916912130e+03 -5.537288763440370e+03 1.916072325100000e-03 7.285263070500000e-04 1.162016124200000e-03 2.430641299900000e-03 1.865933070500000e-03 3.289215710400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.420000000000000e+02 -1.175586279826104e+06 -4.940184563387034e+06 4.624784826574453e+06 -2.837584385726535e+03 -4.523470905342116e+03 -5.537402569595098e+03 1.916072325100000e-03 7.285263070500000e-04 1.162016124200000e-03 2.430641299900000e-03 1.865933070500000e-03 3.289215710400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.430000000000000e+02 -1.175643031354351e+06 -4.940275031506700e+06 4.624674077403424e+06 -2.837568970195571e+03 -4.523341999474260e+03 -5.537516261656926e+03 1.916072325100000e-03 7.285263070500000e-04 1.162016124200000e-03 2.430641299900000e-03 1.865933070500000e-03 3.289215710400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.440000000000000e+02 -1.175699782570332e+06 -4.940365497039879e+06 4.624563325956458e+06 -2.837553433676062e+03 -4.523212818345023e+03 -5.537630231644457e+03 1.916072325100000e-03 7.285263070500000e-04 1.162016124200000e-03 2.430641299900000e-03 1.865933070500000e-03 3.289215710400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.450000000000000e+02 -1.175756533488222e+06 -4.940455960012961e+06 4.624452572201746e+06 -2.837537894435288e+03 -4.523083633303375e+03 -5.537744200782526e+03 1.916072325100000e-03 7.285263070500000e-04 1.162016124200000e-03 2.430641299900000e-03 1.865933070500000e-03 3.289215710400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.460000000000000e+02 -1.175813284085815e+06 -4.940546420384654e+06 4.624341816189062e+06 -2.837522354975728e+03 -4.522954447721712e+03 -5.537858165144890e+03 1.916072325100000e-03 7.285263070500000e-04 1.162016124200000e-03 2.430641299900000e-03 1.865933070500000e-03 3.289215710400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.470000000000000e+02 -1.175870034385253e+06 -4.940636878196166e+06 4.624231057868741e+06 -2.837506812428144e+03 -4.522825258399477e+03 -5.537972128678703e+03 1.916024815300000e-03 7.282205444900000e-04 1.162186522100000e-03 2.429807918700000e-03 1.865805843800000e-03 3.290201102000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.480000000000000e+02 -1.175926784353150e+06 -4.940727333385437e+06 4.624120297315572e+06 -2.837491269670093e+03 -4.522696069936750e+03 -5.538086086268673e+03 1.916024815300000e-03 7.282205444900000e-04 1.162186522100000e-03 2.429807918700000e-03 1.865805843800000e-03 3.290201102000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.490000000000000e+02 -1.175983534022897e+06 -4.940817786014574e+06 4.624009534454722e+06 -2.837475724315399e+03 -4.522566878207052e+03 -5.538200042416177e+03 1.916024815300000e-03 7.282205444900000e-04 1.162186522100000e-03 2.429807918700000e-03 1.865805843800000e-03 3.290201102000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.500000000000000e+02 -1.176040283372046e+06 -4.940908236041889e+06 4.623898769336433e+06 -2.837460177259643e+03 -4.522437685830378e+03 -5.538313994540504e+03 1.916024815300000e-03 7.282205444900000e-04 1.162186522100000e-03 2.429807918700000e-03 1.865805843800000e-03 3.290201102000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.510000000000000e+02 -1.176097032423054e+06 -4.940998683509102e+06 4.623788001910406e+06 -2.837444628799514e+03 -4.522308489127788e+03 -5.538427945570066e+03 1.916024815300000e-03 7.282205444900000e-04 1.162186522100000e-03 2.429807918700000e-03 1.865805843800000e-03 3.290201102000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.520000000000000e+02 -1.176153781149712e+06 -4.941089128385573e+06 4.623677232234369e+06 -2.837428890370758e+03 -4.522179843691722e+03 -5.538541517585916e+03 1.916024815300000e-03 7.282205444900000e-04 1.162186522100000e-03 2.429807918700000e-03 1.865805843800000e-03 3.290201102000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.530000000000000e+02 -1.176210529557112e+06 -4.941179570692773e+06 4.623566460296229e+06 -2.837413024479209e+03 -4.522051561990952e+03 -5.538654838696844e+03 1.916024815300000e-03 7.282205444900000e-04 1.162186522100000e-03 2.429807918700000e-03 1.865805843800000e-03 3.290201102000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.540000000000000e+02 -1.176267277654430e+06 -4.941270010417743e+06 4.623455686077037e+06 -2.837397470922285e+03 -4.521922358788325e+03 -5.538768781463265e+03 1.916024815300000e-03 7.282205444900000e-04 1.162186522100000e-03 2.429807918700000e-03 1.865805843800000e-03 3.290201102000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.550000000000000e+02 -1.176324025442219e+06 -4.941360447561554e+06 4.623344909575502e+06 -2.837381915053363e+03 -4.521793153725582e+03 -5.538882721489161e+03 1.916024815300000e-03 7.282205444900000e-04 1.162186522100000e-03 2.429807918700000e-03 1.865805843800000e-03 3.290201102000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.560000000000000e+02 -1.176380772953865e+06 -4.941450882186297e+06 4.623234130716769e+06 -2.837366355553218e+03 -4.521663941443398e+03 -5.538996663822491e+03 1.916024815300000e-03 7.282205444900000e-04 1.162186522100000e-03 2.429807918700000e-03 1.865805843800000e-03 3.290201102000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.570000000000000e+02 -1.176437520100156e+06 -4.941541314126167e+06 4.623123349700763e+06 -2.837350797517883e+03 -4.521534735541898e+03 -5.539110594871401e+03 1.915977241500000e-03 7.279147035700000e-04 1.162356770500000e-03 2.428974605900000e-03 1.865678227700000e-03 3.291186530900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.580000000000000e+02 -1.176494266981400e+06 -4.941631743567626e+06 4.623012566302639e+06 -2.837335234974877e+03 -4.521405520468032e+03 -5.539224530243863e+03 1.915977241500000e-03 7.279147035700000e-04 1.162356770500000e-03 2.428974605900000e-03 1.865678227700000e-03 3.291186530900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.590000000000000e+02 -1.176551013530722e+06 -4.941722170386386e+06 4.622901780672283e+06 -2.837319672518042e+03 -4.521276306801448e+03 -5.539338459085668e+03 1.915977241500000e-03 7.279147035700000e-04 1.162356770500000e-03 2.428974605900000e-03 1.865678227700000e-03 3.291186530900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.600000000000000e+02 -1.176607759748004e+06 -4.941812594582275e+06 4.622790992809899e+06 -2.837304108499238e+03 -4.521147094350264e+03 -5.539452382293842e+03 1.915977241500000e-03 7.279147035700000e-04 1.162356770500000e-03 2.428974605900000e-03 1.865678227700000e-03 3.291186530900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.610000000000000e+02 -1.176664505677799e+06 -4.941903016238119e+06 4.622680202615617e+06 -2.837288541632617e+03 -4.521017876557835e+03 -5.539566305896398e+03 1.915977241500000e-03 7.279147035700000e-04 1.162356770500000e-03 2.428974605900000e-03 1.865678227700000e-03 3.291186530900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.620000000000000e+02 -1.176721251301090e+06 -4.941993435318035e+06 4.622569410145113e+06 -2.837273133080033e+03 -4.520888925877040e+03 -5.539679931244406e+03 1.915977241500000e-03 7.279147035700000e-04 1.162356770500000e-03 2.428974605900000e-03 1.865678227700000e-03 3.291186530900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.630000000000000e+02 -1.176777996615867e+06 -4.942083851817995e+06 4.622458615411481e+06 -2.837257827662698e+03 -4.520760151997376e+03 -5.539793358128603e+03 1.915977241500000e-03 7.279147035700000e-04 1.162356770500000e-03 2.428974605900000e-03 1.865678227700000e-03 3.291186530900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.640000000000000e+02 -1.176834741603062e+06 -4.942174265703481e+06 4.622347818435727e+06 -2.837242255897207e+03 -4.520630929545761e+03 -5.539907271805603e+03 1.915977241500000e-03 7.279147035700000e-04 1.162356770500000e-03 2.428974605900000e-03 1.865678227700000e-03 3.291186530900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.650000000000000e+02 -1.176891486313956e+06 -4.942264677069750e+06 4.622237019102933e+06 -2.837226681849956e+03 -4.520501699083946e+03 -5.540021187842368e+03 1.915977241500000e-03 7.279147035700000e-04 1.162356770500000e-03 2.428974605900000e-03 1.865678227700000e-03 3.291186530900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.660000000000000e+02 -1.176948230670268e+06 -4.942355085771396e+06 4.622126217588506e+06 -2.837211107448246e+03 -4.520372473692245e+03 -5.540135094501279e+03 1.915977241500000e-03 7.279147035700000e-04 1.162356770500000e-03 2.428974605900000e-03 1.865678227700000e-03 3.291186530900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.670000000000000e+02 -1.177004974761213e+06 -4.942445491974228e+06 4.622015413692438e+06 -2.837195528999207e+03 -4.520243239320646e+03 -5.540249005115114e+03 1.915929603700000e-03 7.276087842200000e-04 1.162526869600000e-03 2.428141361500000e-03 1.865550222000000e-03 3.292171997700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.680000000000000e+02 -1.177061718508750e+06 -4.942535895533228e+06 4.621904607589664e+06 -2.837179951039190e+03 -4.520114007722080e+03 -5.540362907884318e+03 1.915929603700000e-03 7.276087842200000e-04 1.162526869600000e-03 2.428141361500000e-03 1.865550222000000e-03 3.292171997700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.690000000000000e+02 -1.177118461957433e+06 -4.942626296531216e+06 4.621793799180274e+06 -2.837164370424090e+03 -4.519984772368730e+03 -5.540476809641661e+03 1.915929603700000e-03 7.276087842200000e-04 1.162526869600000e-03 2.428141361500000e-03 1.865550222000000e-03 3.292171997700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.700000000000000e+02 -1.177175205084810e+06 -4.942716694926518e+06 4.621682988514555e+06 -2.837148787912166e+03 -4.519855536734469e+03 -5.540590707160273e+03 1.915929603700000e-03 7.276087842200000e-04 1.162526869600000e-03 2.428141361500000e-03 1.865550222000000e-03 3.292171997700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.710000000000000e+02 -1.177231947924504e+06 -4.942807090781593e+06 4.621572175517143e+06 -2.837133203792161e+03 -4.519726295081897e+03 -5.540704605080367e+03 1.915929603700000e-03 7.276087842200000e-04 1.162526869600000e-03 2.428141361500000e-03 1.865550222000000e-03 3.292171997700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.720000000000000e+02 -1.177288690405333e+06 -4.942897483980070e+06 4.621461360343771e+06 -2.837117418739598e+03 -4.519597478193144e+03 -5.540818234425570e+03 1.915929603700000e-03 7.276087842200000e-04 1.162526869600000e-03 2.428141361500000e-03 1.865550222000000e-03 3.292171997700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.730000000000000e+02 -1.177345432607189e+06 -4.942987874680838e+06 4.621350542812869e+06 -2.837101498768670e+03 -4.519468929983126e+03 -5.540931695453717e+03 1.915929603700000e-03 7.276087842200000e-04 1.162526869600000e-03 2.428141361500000e-03 1.865550222000000e-03 3.292171997700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.740000000000000e+02 -1.177402174499048e+06 -4.943078262800012e+06 4.621239723000194e+06 -2.837085908313816e+03 -4.519339680416045e+03 -5.541045586829892e+03 1.915929603700000e-03 7.276087842200000e-04 1.162526869600000e-03 2.428141361500000e-03 1.865550222000000e-03 3.292171997700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.750000000000000e+02 -1.177458916035933e+06 -4.943168648254064e+06 4.621128901006553e+06 -2.837070317594600e+03 -4.519210435670449e+03 -5.541159468997357e+03 1.915929603700000e-03 7.276087842200000e-04 1.162526869600000e-03 2.428141361500000e-03 1.865550222000000e-03 3.292171997700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.760000000000000e+02 -1.177515657284958e+06 -4.943259031167667e+06 4.621018076681493e+06 -2.837054724987367e+03 -4.519081185082334e+03 -5.541273351544738e+03 1.915929603700000e-03 7.276087842200000e-04 1.162526869600000e-03 2.428141361500000e-03 1.865550222000000e-03 3.292171997700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.770000000000000e+02 -1.177572398234844e+06 -4.943349411519905e+06 4.620907250050247e+06 -2.837039129831022e+03 -4.518951930445373e+03 -5.541387233276538e+03 1.915881902200000e-03 7.273027865200000e-04 1.162696819600000e-03 2.427308185800000e-03 1.865421826900000e-03 3.293157502900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.780000000000000e+02 -1.177629138885474e+06 -4.943439789310598e+06 4.620796421113043e+06 -2.837023531995026e+03 -4.518822672354131e+03 -5.541501113756790e+03 1.915881902200000e-03 7.273027865200000e-04 1.162696819600000e-03 2.427308185800000e-03 1.865421826900000e-03 3.293157502900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.790000000000000e+02 -1.177685879181149e+06 -4.943530164436262e+06 4.620685589994780e+06 -2.837007935082991e+03 -4.518693418609746e+03 -5.541614984892848e+03 1.915881902200000e-03 7.273027865200000e-04 1.162696819600000e-03 2.427308185800000e-03 1.865421826900000e-03 3.293157502900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.800000000000000e+02 -1.177742619199909e+06 -4.943620537041910e+06 4.620574756520431e+06 -2.836992334586223e+03 -4.518564157735580e+03 -5.541728858236012e+03 1.915881902200000e-03 7.273027865200000e-04 1.162696819600000e-03 2.427308185800000e-03 1.865421826900000e-03 3.293157502900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.810000000000000e+02 -1.177799358885810e+06 -4.943710907023667e+06 4.620463920815385e+06 -2.836976732674644e+03 -4.518434898317739e+03 -5.541842725682380e+03 1.915881902200000e-03 7.273027865200000e-04 1.162696819600000e-03 2.427308185800000e-03 1.865421826900000e-03 3.293157502900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.820000000000000e+02 -1.177856098249895e+06 -4.943801274410027e+06 4.620353082860474e+06 -2.836961117609916e+03 -4.518306014487479e+03 -5.541956281632905e+03 1.915881902200000e-03 7.273027865200000e-04 1.162696819600000e-03 2.427308185800000e-03 1.865421826900000e-03 3.293157502900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.830000000000000e+02 -1.177912837297382e+06 -4.943891639216062e+06 4.620242242647623e+06 -2.836945491336409e+03 -4.518177378691284e+03 -5.542069631214431e+03 1.915881902200000e-03 7.273027865200000e-04 1.162696819600000e-03 2.427308185800000e-03 1.865421826900000e-03 3.293157502900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.840000000000000e+02 -1.177969576047804e+06 -4.943982001464706e+06 4.620131400123787e+06 -2.836929884783249e+03 -4.518048110459461e+03 -5.542183492085639e+03 1.915881902200000e-03 7.273027865200000e-04 1.162696819600000e-03 2.427308185800000e-03 1.865421826900000e-03 3.293157502900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.850000000000000e+02 -1.178026314487637e+06 -4.944072361130900e+06 4.620020555319245e+06 -2.836914275769487e+03 -4.517918840570239e+03 -5.542297350114528e+03 1.915881902200000e-03 7.273027865200000e-04 1.162696819600000e-03 2.427308185800000e-03 1.865421826900000e-03 3.293157502900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.860000000000000e+02 -1.178083052650261e+06 -4.944162718276668e+06 4.619909708159095e+06 -2.836898663530790e+03 -4.517789563162539e+03 -5.542411210511034e+03 1.915881902200000e-03 7.273027865200000e-04 1.162696819600000e-03 2.427308185800000e-03 1.865421826900000e-03 3.293157502900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.870000000000000e+02 -1.178139790468811e+06 -4.944253072777820e+06 4.619798858793299e+06 -2.836883051424940e+03 -4.517660288773413e+03 -5.542525063022260e+03 1.915834136900000e-03 7.269967103700000e-04 1.162866620500000e-03 2.426475078500000e-03 1.865293042500000e-03 3.294143047000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.880000000000000e+02 -1.178196527943181e+06 -4.944343424634185e+06 4.619688007222073e+06 -2.836867438675885e+03 -4.517531017471477e+03 -5.542638907938633e+03 1.915834136900000e-03 7.269967103700000e-04 1.162866620500000e-03 2.426475078500000e-03 1.865293042500000e-03 3.294143047000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.890000000000000e+02 -1.178253265151395e+06 -4.944433773990729e+06 4.619577153270361e+06 -2.836851821716134e+03 -4.517401737209934e+03 -5.542752756859652e+03 1.915834136900000e-03 7.269967103700000e-04 1.162866620500000e-03 2.426475078500000e-03 1.865293042500000e-03 3.294143047000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.900000000000000e+02 -1.178310002048925e+06 -4.944524120764730e+06 4.619466297038053e+06 -2.836836204064289e+03 -4.517272454456023e+03 -5.542866602841618e+03 1.915834136900000e-03 7.269967103700000e-04 1.162866620500000e-03 2.426475078500000e-03 1.865293042500000e-03 3.294143047000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.910000000000000e+02 -1.178366738624491e+06 -4.944614464935280e+06 4.619355438550401e+06 -2.836820584542579e+03 -4.517143171340818e+03 -5.542980444640980e+03 1.915834136900000e-03 7.269967103700000e-04 1.162866620500000e-03 2.426475078500000e-03 1.865293042500000e-03 3.294143047000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.920000000000000e+02 -1.178423474873752e+06 -4.944704806507966e+06 4.619244577810504e+06 -2.836804751757510e+03 -4.517014175719457e+03 -5.543094137639641e+03 1.915834136900000e-03 7.269967103700000e-04 1.162866620500000e-03 2.426475078500000e-03 1.865293042500000e-03 3.294143047000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.930000000000000e+02 -1.178480210788637e+06 -4.944795145476801e+06 4.619133714832102e+06 -2.836788778408086e+03 -4.516885369739545e+03 -5.543207730627068e+03 1.915834136900000e-03 7.269967103700000e-04 1.162866620500000e-03 2.426475078500000e-03 1.865293042500000e-03 3.294143047000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.940000000000000e+02 -1.178536946411622e+06 -4.944885481898083e+06 4.619022849530850e+06 -2.836773153142477e+03 -4.516756078372077e+03 -5.543321565861787e+03 1.915834136900000e-03 7.269967103700000e-04 1.162866620500000e-03 2.426475078500000e-03 1.865293042500000e-03 3.294143047000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.950000000000000e+02 -1.178593681712423e+06 -4.944975815715623e+06 4.618911981974638e+06 -2.836757526168096e+03 -4.516626787094574e+03 -5.543435396467550e+03 1.915834136900000e-03 7.269967103700000e-04 1.162866620500000e-03 2.426475078500000e-03 1.865293042500000e-03 3.294143047000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.960000000000000e+02 -1.178650416691165e+06 -4.945066146929625e+06 4.618801112163201e+06 -2.836741898713377e+03 -4.516497494688285e+03 -5.543549222907779e+03 1.915834136900000e-03 7.269967103700000e-04 1.162866620500000e-03 2.426475078500000e-03 1.865293042500000e-03 3.294143047000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.970000000000000e+02 -1.178707151381142e+06 -4.945156475601991e+06 4.618690240021783e+06 -2.836726267713366e+03 -4.516368197305806e+03 -5.543663049745724e+03 1.915786308000000e-03 7.266905558200000e-04 1.163036272500000e-03 2.425642039900000e-03 1.865163868700000e-03 3.295128630400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.980000000000000e+02 -1.178763885748991e+06 -4.945246801670735e+06 4.618579365625247e+06 -2.836710636373125e+03 -4.516238898888639e+03 -5.543776872277394e+03 1.915786308000000e-03 7.266905558200000e-04 1.163036272500000e-03 2.425642039900000e-03 1.865163868700000e-03 3.295128630400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.990000000000000e+02 -1.178820619805758e+06 -4.945337125156416e+06 4.618468488948768e+06 -2.836695002782878e+03 -4.516109598518797e+03 -5.543890692118001e+03 1.915786308000000e-03 7.266905558200000e-04 1.163036272500000e-03 2.425642039900000e-03 1.865163868700000e-03 3.295128630400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.000000000000000e+02 -1.178877353562489e+06 -4.945427446079592e+06 4.618357609967509e+06 -2.836679366456229e+03 -4.515980294424697e+03 -5.544004510955315e+03 1.915786308000000e-03 7.266905558200000e-04 1.163036272500000e-03 2.425642039900000e-03 1.865163868700000e-03 3.295128630400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.010000000000000e+02 -1.178934086974659e+06 -4.945517764357566e+06 4.618246728781398e+06 -2.836663730619545e+03 -4.515850993220522e+03 -5.544118321858204e+03 1.915786308000000e-03 7.266905558200000e-04 1.163036272500000e-03 2.425642039900000e-03 1.865163868700000e-03 3.295128630400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.020000000000000e+02 -1.178990820100996e+06 -4.945608080101999e+06 4.618135845273538e+06 -2.836648242746400e+03 -4.515722095507655e+03 -5.544231726450035e+03 1.915786308000000e-03 7.266905558200000e-04 1.163036272500000e-03 2.425642039900000e-03 1.865163868700000e-03 3.295128630400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.030000000000000e+02 -1.179047552902790e+06 -4.945698393242766e+06 4.618024959540632e+06 -2.836632853309185e+03 -4.515593469056472e+03 -5.544344856635176e+03 1.915786308000000e-03 7.266905558200000e-04 1.163036272500000e-03 2.425642039900000e-03 1.865163868700000e-03 3.295128630400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.040000000000000e+02 -1.179104285384221e+06 -4.945788703783333e+06 4.617914071548514e+06 -2.836617211860006e+03 -4.515464159593885e+03 -5.544458660947841e+03 1.915786308000000e-03 7.266905558200000e-04 1.163036272500000e-03 2.425642039900000e-03 1.865163868700000e-03 3.295128630400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.050000000000000e+02 -1.179161017565519e+06 -4.945879011761302e+06 4.617803181251728e+06 -2.836601567515332e+03 -4.515334846283374e+03 -5.544572464430699e+03 1.915786308000000e-03 7.266905558200000e-04 1.163036272500000e-03 2.425642039900000e-03 1.865163868700000e-03 3.295128630400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.060000000000000e+02 -1.179217749435410e+06 -4.945969317155782e+06 4.617692288675538e+06 -2.836585921146353e+03 -4.515205531046840e+03 -5.544686265099603e+03 1.915786308000000e-03 7.266905558200000e-04 1.163036272500000e-03 2.425642039900000e-03 1.865163868700000e-03 3.295128630400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.070000000000000e+02 -1.179274481016344e+06 -4.946059620008434e+06 4.617581393769584e+06 -2.836570273122324e+03 -4.515076209697882e+03 -5.544800066263574e+03 1.915738415600000e-03 7.263843228300000e-04 1.163205775800000e-03 2.424809070000000e-03 1.865034305600000e-03 3.296114253800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.080000000000000e+02 -1.179331212252306e+06 -4.946149920215328e+06 4.617470496659478e+06 -2.836554623420290e+03 -4.514946891823211e+03 -5.544913859977736e+03 1.915738415600000e-03 7.263843228300000e-04 1.163205775800000e-03 2.424809070000000e-03 1.865034305600000e-03 3.296114253800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.090000000000000e+02 -1.179387943210405e+06 -4.946240217901031e+06 4.617359597194665e+06 -2.836538971862989e+03 -4.514817566249520e+03 -5.545027655592620e+03 1.915738415600000e-03 7.263843228300000e-04 1.163205775800000e-03 2.424809070000000e-03 1.865034305600000e-03 3.296114253800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.100000000000000e+02 -1.179444673812386e+06 -4.946330512920301e+06 4.617248695550702e+06 -2.836523319658999e+03 -4.514688245502964e+03 -5.545141442175250e+03 1.915738415600000e-03 7.263843228300000e-04 1.163205775800000e-03 2.424809070000000e-03 1.865034305600000e-03 3.296114253800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.110000000000000e+02 -1.179501404136263e+06 -4.946420805418034e+06 4.617137791552464e+06 -2.836507663861179e+03 -4.514558917809058e+03 -5.545255230810923e+03 1.915738415600000e-03 7.263843228300000e-04 1.163205775800000e-03 2.424809070000000e-03 1.865034305600000e-03 3.296114253800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.120000000000000e+02 -1.179558134131700e+06 -4.946511095320180e+06 4.617026885304419e+06 -2.836491716620339e+03 -4.514430020347598e+03 -5.545368787313014e+03 1.915738415600000e-03 7.263843228300000e-04 1.163205775800000e-03 2.424809070000000e-03 1.865034305600000e-03 3.296114253800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.130000000000000e+02 -1.179614863804942e+06 -4.946601382651261e+06 4.616915976786871e+06 -2.836475574133062e+03 -4.514301406848834e+03 -5.545482190104914e+03 1.915738415600000e-03 7.263843228300000e-04 1.163205775800000e-03 2.424809070000000e-03 1.865034305600000e-03 3.296114253800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.140000000000000e+02 -1.179671593147573e+06 -4.946691667363383e+06 4.616805066032812e+06 -2.836459913873271e+03 -4.514172075945923e+03 -5.545595967445537e+03 1.915738415600000e-03 7.263843228300000e-04 1.163205775800000e-03 2.424809070000000e-03 1.865034305600000e-03 3.296114253800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.150000000000000e+02 -1.179728322178642e+06 -4.946781949491885e+06 4.616694152999526e+06 -2.836444253051437e+03 -4.514042742686719e+03 -5.545709741676553e+03 1.915738415600000e-03 7.263843228300000e-04 1.163205775800000e-03 2.424809070000000e-03 1.865034305600000e-03 3.296114253800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.160000000000000e+02 -1.179785050898026e+06 -4.946872229036590e+06 4.616583237687218e+06 -2.836428589705368e+03 -4.513913407285834e+03 -5.545823513495914e+03 1.915738415600000e-03 7.263843228300000e-04 1.163205775800000e-03 2.424809070000000e-03 1.865034305600000e-03 3.296114253800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.170000000000000e+02 -1.179841779327937e+06 -4.946962506038766e+06 4.616472320046000e+06 -2.836412923419011e+03 -4.513784066538607e+03 -5.545937285747275e+03 1.915690459700000e-03 7.260780113200000e-04 1.163375130400000e-03 2.423976168500000e-03 1.864904353300000e-03 3.297099917900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.180000000000000e+02 -1.179898507457337e+06 -4.947052780477899e+06 4.616361400100656e+06 -2.836397255949466e+03 -4.513654721274525e+03 -5.546051056957935e+03 1.915690459700000e-03 7.260780113200000e-04 1.163375130400000e-03 2.423976168500000e-03 1.864904353300000e-03 3.297099917900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.190000000000000e+02 -1.179955235241466e+06 -4.947143052270955e+06 4.616250477951618e+06 -2.836381587418128e+03 -4.513525379478318e+03 -5.546164820451521e+03 1.915690459700000e-03 7.260780113200000e-04 1.163375130400000e-03 2.423976168500000e-03 1.864904353300000e-03 3.297099917900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.200000000000000e+02 -1.180011962747172e+06 -4.947233321542062e+06 4.616139553448774e+06 -2.836365915326659e+03 -4.513396030429691e+03 -5.546278586234052e+03 1.915690459700000e-03 7.260780113200000e-04 1.163375130400000e-03 2.423976168500000e-03 1.864904353300000e-03 3.297099917900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.210000000000000e+02 -1.180068689885298e+06 -4.947323588125701e+06 4.616028626792297e+06 -2.836350244603025e+03 -4.513266687493000e+03 -5.546392341022969e+03 1.915690459700000e-03 7.260780113200000e-04 1.163375130400000e-03 2.423976168500000e-03 1.864904353300000e-03 3.297099917900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.220000000000000e+02 -1.180125416756416e+06 -4.947413852215947e+06 4.615917697763773e+06 -2.836334585451822e+03 -4.513137732076208e+03 -5.546505763977629e+03 1.915690459700000e-03 7.260780113200000e-04 1.163375130400000e-03 2.423976168500000e-03 1.864904353300000e-03 3.297099917900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.230000000000000e+02 -1.180182143297591e+06 -4.947504113700830e+06 4.615806766509421e+06 -2.836318936423188e+03 -4.513009038376073e+03 -5.546618960089306e+03 1.915690459700000e-03 7.260780113200000e-04 1.163375130400000e-03 2.423976168500000e-03 1.864904353300000e-03 3.297099917900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.240000000000000e+02 -1.180238869512725e+06 -4.947594372575447e+06 4.615695833008092e+06 -2.836303258577156e+03 -4.512879684098427e+03 -5.546732711503298e+03 1.915690459700000e-03 7.260780113200000e-04 1.163375130400000e-03 2.423976168500000e-03 1.864904353300000e-03 3.297099917900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.250000000000000e+02 -1.180295595393459e+06 -4.947684628824324e+06 4.615584897278509e+06 -2.836287579399519e+03 -4.512750331218651e+03 -5.546846457038570e+03 1.915690459700000e-03 7.260780113200000e-04 1.163375130400000e-03 2.423976168500000e-03 1.864904353300000e-03 3.297099917900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.260000000000000e+02 -1.180352320984560e+06 -4.947774882530528e+06 4.615473959220178e+06 -2.836271898574284e+03 -4.512620972368536e+03 -5.546960202945169e+03 1.915690459700000e-03 7.260780113200000e-04 1.163375130400000e-03 2.423976168500000e-03 1.864904353300000e-03 3.297099917900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.270000000000000e+02 -1.180409046274753e+06 -4.947865133673173e+06 4.615363018858367e+06 -2.836256215163332e+03 -4.512491609629081e+03 -5.547073947916141e+03 1.915642440400000e-03 7.257716213700000e-04 1.163544336500000e-03 2.423143335900000e-03 1.864774011800000e-03 3.298085622700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.280000000000000e+02 -1.180465771230436e+06 -4.947955382189950e+06 4.615252076268471e+06 -2.836240530165366e+03 -4.512362248637341e+03 -5.547187686832634e+03 1.915642440400000e-03 7.257716213700000e-04 1.163544336500000e-03 2.423143335900000e-03 1.864774011800000e-03 3.298085622700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.290000000000000e+02 -1.180522495874062e+06 -4.948045628122496e+06 4.615141131400106e+06 -2.836224844566760e+03 -4.512232885012952e+03 -5.547301422885980e+03 1.915642440400000e-03 7.257716213700000e-04 1.163544336500000e-03 2.423143335900000e-03 1.864774011800000e-03 3.298085622700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.300000000000000e+02 -1.180579220216674e+06 -4.948135871491353e+06 4.615030184228424e+06 -2.836209156205276e+03 -4.512103517564804e+03 -5.547415158028307e+03 1.915642440400000e-03 7.257716213700000e-04 1.163544336500000e-03 2.423143335900000e-03 1.864774011800000e-03 3.298085622700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.310000000000000e+02 -1.180635944246992e+06 -4.948226112275633e+06 4.614919234778703e+06 -2.836193465565452e+03 -4.511974148286271e+03 -5.547528890390966e+03 1.915642440400000e-03 7.257716213700000e-04 1.163544336500000e-03 2.423143335900000e-03 1.864774011800000e-03 3.298085622700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.320000000000000e+02 -1.180692667954652e+06 -4.948316350459358e+06 4.614808283079760e+06 -2.836177807691172e+03 -4.511845003549788e+03 -5.547642416700411e+03 1.915642440400000e-03 7.257716213700000e-04 1.163544336500000e-03 2.423143335900000e-03 1.864774011800000e-03 3.298085622700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.330000000000000e+02 -1.180749391368812e+06 -4.948406586098884e+06 4.614697329069703e+06 -2.836162168214490e+03 -4.511716003053260e+03 -5.547755809936136e+03 1.915642440400000e-03 7.257716213700000e-04 1.163544336500000e-03 2.423143335900000e-03 1.864774011800000e-03 3.298085622700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.340000000000000e+02 -1.180806114465930e+06 -4.948496819145043e+06 4.614586372792236e+06 -2.836146472849588e+03 -4.511586624981178e+03 -5.547869535734055e+03 1.915642440400000e-03 7.257716213700000e-04 1.163544336500000e-03 2.423143335900000e-03 1.864774011800000e-03 3.298085622700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.350000000000000e+02 -1.180862837228375e+06 -4.948587049565166e+06 4.614475414286915e+06 -2.836130776058893e+03 -4.511457248634894e+03 -5.547983255424837e+03 1.915642440400000e-03 7.257716213700000e-04 1.163544336500000e-03 2.423143335900000e-03 1.864774011800000e-03 3.298085622700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.360000000000000e+02 -1.180919559700674e+06 -4.948677277441917e+06 4.614364453453697e+06 -2.836115076217179e+03 -4.511327866617715e+03 -5.548096975863334e+03 1.915642440400000e-03 7.257716213700000e-04 1.163544336500000e-03 2.423143335900000e-03 1.864774011800000e-03 3.298085622700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.370000000000000e+02 -1.180976281815991e+06 -4.948767502651258e+06 4.614253490442704e+06 -2.836099377167701e+03 -4.511198489305595e+03 -5.548210686736835e+03 1.915594357800000e-03 7.254651528800000e-04 1.163713394300000e-03 2.422310571900000e-03 1.864643281100000e-03 3.299071369300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.380000000000000e+02 -1.181033003652330e+06 -4.948857725337978e+06 4.614142525078696e+06 -2.836083674768109e+03 -4.511069104515569e+03 -5.548324399988710e+03 1.915594357800000e-03 7.254651528800000e-04 1.163713394300000e-03 2.422310571900000e-03 1.864643281100000e-03 3.299071369300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.390000000000000e+02 -1.181089725187249e+06 -4.948947945460476e+06 4.614031557412020e+06 -2.836067969484307e+03 -4.510939716129131e+03 -5.548438112194475e+03 1.915594357800000e-03 7.254651528800000e-04 1.163713394300000e-03 2.422310571900000e-03 1.864643281100000e-03 3.299071369300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.400000000000000e+02 -1.181146446376247e+06 -4.949038162936158e+06 4.613920587542672e+06 -2.836052264863758e+03 -4.510810330578602e+03 -5.548551816442293e+03 1.915594357800000e-03 7.254651528800000e-04 1.163713394300000e-03 2.422310571900000e-03 1.864643281100000e-03 3.299071369300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.410000000000000e+02 -1.181203167297318e+06 -4.949128377909779e+06 4.613809615295399e+06 -2.836036556208428e+03 -4.510680935812330e+03 -5.548665524812778e+03 1.915594357800000e-03 7.254651528800000e-04 1.163713394300000e-03 2.422310571900000e-03 1.864643281100000e-03 3.299071369300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.420000000000000e+02 -1.181259887880271e+06 -4.949218590266990e+06 4.613698640827733e+06 -2.836020690059407e+03 -4.510552044827615e+03 -5.548778880764256e+03 1.915594357800000e-03 7.254651528800000e-04 1.163713394300000e-03 2.422310571900000e-03 1.864643281100000e-03 3.299071369300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.430000000000000e+02 -1.181316608115535e+06 -4.949308800000509e+06 4.613587664161148e+06 -2.836004720519096e+03 -4.510423487706306e+03 -5.548892000961408e+03 1.915594357800000e-03 7.254651528800000e-04 1.163713394300000e-03 2.422310571900000e-03 1.864643281100000e-03 3.299071369300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.440000000000000e+02 -1.181373328054015e+06 -4.949399007178499e+06 4.613476685181388e+06 -2.835989006956538e+03 -4.510294088541461e+03 -5.549005699224931e+03 1.915594357800000e-03 7.254651528800000e-04 1.163713394300000e-03 2.422310571900000e-03 1.864643281100000e-03 3.299071369300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.450000000000000e+02 -1.181430047668550e+06 -4.949489211750600e+06 4.613365703949413e+06 -2.835973291664693e+03 -4.510164688715359e+03 -5.549119393495495e+03 1.915594357800000e-03 7.254651528800000e-04 1.163713394300000e-03 2.422310571900000e-03 1.864643281100000e-03 3.299071369300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.460000000000000e+02 -1.181486766959265e+06 -4.949579413717040e+06 4.613254720464971e+06 -2.835957575821585e+03 -4.510035288595015e+03 -5.549233082943897e+03 1.915594357800000e-03 7.254651528800000e-04 1.163713394300000e-03 2.422310571900000e-03 1.864643281100000e-03 3.299071369300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.470000000000000e+02 -1.181543485948285e+06 -4.949669613118911e+06 4.613143734678287e+06 -2.835941857122855e+03 -4.509905884466622e+03 -5.549346771673976e+03 1.915546211900000e-03 7.251586059200000e-04 1.163882303800000e-03 2.421477876700000e-03 1.864512161300000e-03 3.300057157800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.480000000000000e+02 -1.181600204613416e+06 -4.949759809915034e+06 4.613032746639243e+06 -2.835926137832332e+03 -4.509776479913313e+03 -5.549460455708379e+03 1.915546211900000e-03 7.251586059200000e-04 1.163882303800000e-03 2.421477876700000e-03 1.864512161300000e-03 3.300057157800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.490000000000000e+02 -1.181656922976858e+06 -4.949850004146636e+06 4.612921756297910e+06 -2.835910415818971e+03 -4.509647071448647e+03 -5.549574138884992e+03 1.915546211900000e-03 7.251586059200000e-04 1.163882303800000e-03 2.421477876700000e-03 1.864512161300000e-03 3.300057157800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.500000000000000e+02 -1.181713641049655e+06 -4.949940195834244e+06 4.612810763629426e+06 -2.835894690884847e+03 -4.509517657482999e+03 -5.549687822608204e+03 1.915546211900000e-03 7.251586059200000e-04 1.163882303800000e-03 2.421477876700000e-03 1.864512161300000e-03 3.300057157800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.510000000000000e+02 -1.181770358776142e+06 -4.950030384874567e+06 4.612699768758890e+06 -2.835878966420944e+03 -4.509388246354422e+03 -5.549801498460985e+03 1.915546211900000e-03 7.251586059200000e-04 1.163882303800000e-03 2.421477876700000e-03 1.864512161300000e-03 3.300057157800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.520000000000000e+02 -1.181827076190261e+06 -4.950120571335440e+06 4.612588771616427e+06 -2.835863268599706e+03 -4.509259127905632e+03 -5.549914914761768e+03 1.915546211900000e-03 7.251586059200000e-04 1.163882303800000e-03 2.421477876700000e-03 1.864512161300000e-03 3.300057157800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.530000000000000e+02 -1.181883793309267e+06 -4.950210755252114e+06 4.612477772167491e+06 -2.835847586928969e+03 -4.509130199422803e+03 -5.550028161259942e+03 1.915546211900000e-03 7.251586059200000e-04 1.163882303800000e-03 2.421477876700000e-03 1.864512161300000e-03 3.300057157800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.540000000000000e+02 -1.181940510097566e+06 -4.950300936550512e+06 4.612366770481372e+06 -2.835831856792655e+03 -4.509000779976563e+03 -5.550141830586941e+03 1.915546211900000e-03 7.251586059200000e-04 1.163882303800000e-03 2.421477876700000e-03 1.864512161300000e-03 3.300057157800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.550000000000000e+02 -1.181997226550494e+06 -4.950391115222046e+06 4.612255766568510e+06 -2.835816125096045e+03 -4.508871362273376e+03 -5.550255493855854e+03 1.915546211900000e-03 7.251586059200000e-04 1.163882303800000e-03 2.421477876700000e-03 1.864512161300000e-03 3.300057157800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.560000000000000e+02 -1.182053942712561e+06 -4.950481291349311e+06 4.612144760328823e+06 -2.835800390328036e+03 -4.508741938796325e+03 -5.550369157963890e+03 1.915546211900000e-03 7.251586059200000e-04 1.163882303800000e-03 2.421477876700000e-03 1.864512161300000e-03 3.300057157800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.570000000000000e+02 -1.182110658561580e+06 -4.950571464891138e+06 4.612033751812193e+06 -2.835784654749568e+03 -4.508612512875321e+03 -5.550482819145923e+03 1.915498003000000e-03 7.248519804199999e-04 1.164051065200000e-03 2.420645250300000e-03 1.864380652400000e-03 3.301042988900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.580000000000000e+02 -1.182167374108511e+06 -4.950661635867918e+06 4.611922740993922e+06 -2.835768916039362e+03 -4.508483083485960e+03 -5.550596479284886e+03 1.915498003000000e-03 7.248519804199999e-04 1.164051065200000e-03 2.420645250300000e-03 1.864380652400000e-03 3.301042988900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.590000000000000e+02 -1.182224089331165e+06 -4.950751804238480e+06 4.611811727923891e+06 -2.835753176898750e+03 -4.508353653321613e+03 -5.550710134946797e+03 1.915498003000000e-03 7.248519804199999e-04 1.164051065200000e-03 2.420645250300000e-03 1.864380652400000e-03 3.301042988900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.600000000000000e+02 -1.182280804240589e+06 -4.950841970023338e+06 4.611700712577236e+06 -2.835737435671434e+03 -4.508224220929723e+03 -5.550823788072574e+03 1.915498003000000e-03 7.248519804199999e-04 1.164051065200000e-03 2.420645250300000e-03 1.864380652400000e-03 3.301042988900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.610000000000000e+02 -1.182337518836660e+06 -4.950932133222325e+06 4.611589694954180e+06 -2.835721692024967e+03 -4.508094786834610e+03 -5.550937438376462e+03 1.915498003000000e-03 7.248519804199999e-04 1.164051065200000e-03 2.420645250300000e-03 1.864380652400000e-03 3.301042988900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.620000000000000e+02 -1.182394233117115e+06 -4.951022293842166e+06 4.611478675058762e+06 -2.835705827900856e+03 -4.507965675340050e+03 -5.551050870067017e+03 1.915498003000000e-03 7.248519804199999e-04 1.164051065200000e-03 2.420645250300000e-03 1.864380652400000e-03 3.301042988900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.630000000000000e+02 -1.182450947076843e+06 -4.951112451880679e+06 4.611367652901721e+06 -2.835689882248852e+03 -4.507836777596686e+03 -5.551164155883229e+03 1.915498003000000e-03 7.248519804199999e-04 1.164051065200000e-03 2.420645250300000e-03 1.864380652400000e-03 3.301042988900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.640000000000000e+02 -1.182507660694067e+06 -4.951202607279319e+06 4.611256628533734e+06 -2.835674134160605e+03 -4.507707340439318e+03 -5.551277794747827e+03 1.915498003000000e-03 7.248519804199999e-04 1.164051065200000e-03 2.420645250300000e-03 1.864380652400000e-03 3.301042988900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.650000000000000e+02 -1.182564374042586e+06 -4.951292760174941e+06 4.611145601788930e+06 -2.835658383640359e+03 -4.507577893870630e+03 -5.551391437175108e+03 1.915498003000000e-03 7.248519804199999e-04 1.164051065200000e-03 2.420645250300000e-03 1.864380652400000e-03 3.301042988900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.660000000000000e+02 -1.182621087066503e+06 -4.951382910463909e+06 4.611034572792907e+06 -2.835642631294573e+03 -4.507448446787894e+03 -5.551505075531671e+03 1.915498003000000e-03 7.248519804199999e-04 1.164051065200000e-03 2.420645250300000e-03 1.864380652400000e-03 3.301042988900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.670000000000000e+02 -1.182677799765700e+06 -4.951473058146060e+06 4.610923541545887e+06 -2.835626877008485e+03 -4.507318999817590e+03 -5.551618709350490e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.680000000000000e+02 -1.182734512129150e+06 -4.951563203200911e+06 4.610812508072685e+06 -2.835611122997490e+03 -4.507189553513253e+03 -5.551732337186389e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.690000000000000e+02 -1.182791224212513e+06 -4.951653345731745e+06 4.610701472248116e+06 -2.835595365223696e+03 -4.507060100244728e+03 -5.551845967152312e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.700000000000000e+02 -1.182847935959898e+06 -4.951743485634938e+06 4.610590434197788e+06 -2.835579606181724e+03 -4.506930648212766e+03 -5.551959591351218e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.710000000000000e+02 -1.182904647404897e+06 -4.951833622972775e+06 4.610479393846205e+06 -2.835563845915562e+03 -4.506801192080821e+03 -5.552073214178678e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.720000000000000e+02 -1.182961358536154e+06 -4.951923757724263e+06 4.610368351218816e+06 -2.835548082852867e+03 -4.506671734203429e+03 -5.552186834387498e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.730000000000000e+02 -1.183018069342644e+06 -4.952013889868930e+06 4.610257306340437e+06 -2.835532319459702e+03 -4.506542275369926e+03 -5.552300450225736e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.740000000000000e+02 -1.183074779880028e+06 -4.952104019510039e+06 4.610146259085874e+06 -2.835516552185143e+03 -4.506412807659775e+03 -5.552414069827518e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.750000000000000e+02 -1.183131490070100e+06 -4.952194146502611e+06 4.610035209630915e+06 -2.835500783881256e+03 -4.506283343200482e+03 -5.552527681890203e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.760000000000000e+02 -1.183188199946451e+06 -4.952284270908915e+06 4.609924157900051e+06 -2.835485014683748e+03 -4.506153876219801e+03 -5.552641291128044e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.770000000000000e+02 -1.183244909486655e+06 -4.952374392687417e+06 4.609813103943663e+06 -2.835469244157086e+03 -4.506024410791017e+03 -5.552754894366382e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.780000000000000e+02 -1.183301618757531e+06 -4.952464511962051e+06 4.609702047611455e+06 -2.835453469673595e+03 -4.505894936330933e+03 -5.552868501528769e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.790000000000000e+02 -1.183358327669960e+06 -4.952554628567550e+06 4.609590989103852e+06 -2.835437696147023e+03 -4.505765466417645e+03 -5.552982099196392e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.800000000000000e+02 -1.183415036290757e+06 -4.952644742627856e+06 4.609479928270545e+06 -2.835421919372389e+03 -4.505635991123298e+03 -5.553095697453233e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.810000000000000e+02 -1.183471744597499e+06 -4.952734854101421e+06 4.609368865161923e+06 -2.835406140558807e+03 -4.505506513548865e+03 -5.553209293196016e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.820000000000000e+02 -1.183528452601463e+06 -4.952824963009141e+06 4.609257799752633e+06 -2.835390360423624e+03 -4.505377031764720e+03 -5.553322887700587e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.830000000000000e+02 -1.183585160280144e+06 -4.952915069309358e+06 4.609146732093226e+06 -2.835374577883274e+03 -4.505247550084093e+03 -5.553436477883326e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.840000000000000e+02 -1.183641867622513e+06 -4.953005172981602e+06 4.609035662208526e+06 -2.835358795527759e+03 -4.505118069360503e+03 -5.553550061884945e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.850000000000000e+02 -1.183698574706538e+06 -4.953095274170467e+06 4.608924589923126e+06 -2.835343008740520e+03 -4.504988577860300e+03 -5.553663651462966e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.860000000000000e+02 -1.183755281442864e+06 -4.953185372710330e+06 4.608813515437949e+06 -2.835327220978447e+03 -4.504859089446896e+03 -5.553777233615714e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.870000000000000e+02 -1.183811987842773e+06 -4.953275468622098e+06 4.608702438727647e+06 -2.835311433273252e+03 -4.504729602403207e+03 -5.553890809303637e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.880000000000000e+02 -1.183868693950768e+06 -4.953365561988314e+06 4.608591359692071e+06 -2.835295642433844e+03 -4.504600109680853e+03 -5.554004385774911e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.890000000000000e+02 -1.183925399744419e+06 -4.953455652767438e+06 4.608480278381614e+06 -2.835279849338261e+03 -4.504470614868670e+03 -5.554117959671570e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.900000000000000e+02 -1.183982105223860e+06 -4.953545740959696e+06 4.608369194796020e+06 -2.835264055620423e+03 -4.504341117764305e+03 -5.554231530433046e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.910000000000000e+02 -1.184038810388969e+06 -4.953635826564905e+06 4.608258108935491e+06 -2.835248259441471e+03 -4.504211618317237e+03 -5.554345098920187e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.920000000000000e+02 -1.184095515273092e+06 -4.953725909644932e+06 4.608147020724975e+06 -2.835232459841948e+03 -4.504082112070611e+03 -5.554458669243618e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.930000000000000e+02 -1.184152219775972e+06 -4.953815990013903e+06 4.608035930390032e+06 -2.835216661871476e+03 -4.503952613528027e+03 -5.554572227167880e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.940000000000000e+02 -1.184208924009032e+06 -4.953906067878400e+06 4.607924837679950e+06 -2.835200860123191e+03 -4.503823106069001e+03 -5.554685788836906e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.950000000000000e+02 -1.184265627927538e+06 -4.953996143155552e+06 4.607813742695317e+06 -2.835185056023103e+03 -4.503693596628809e+03 -5.554799347883946e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.960000000000000e+02 -1.184322331509309e+06 -4.954086215804216e+06 4.607702645486057e+06 -2.835169251957958e+03 -4.503564088166191e+03 -5.554912900801305e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.970000000000000e+02 -1.184379034787613e+06 -4.954176285886129e+06 4.607591545977260e+06 -2.835153444861574e+03 -4.503434576199308e+03 -5.555026452658010e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.980000000000000e+02 -1.184435737740265e+06 -4.954266353360152e+06 4.607480444218851e+06 -2.835137637149818e+03 -4.503305063420639e+03 -5.555140000153462e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.990000000000000e+02 -1.184492440411764e+06 -4.954356418308799e+06 4.607369340110661e+06 -2.835121826212222e+03 -4.503175543368515e+03 -5.555253549788747e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.000000000000000e+02 -1.184549142712768e+06 -4.954446480566522e+06 4.607258233853676e+06 -2.835106014925196e+03 -4.503046030198390e+03 -5.555367088588171e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.010000000000000e+02 -1.184605844743781e+06 -4.954536540319587e+06 4.607147125221761e+06 -2.835090201145738e+03 -4.502916507453676e+03 -5.555480631101649e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.020000000000000e+02 -1.184662546460076e+06 -4.954626597485130e+06 4.607036014315515e+06 -2.835074385345786e+03 -4.502786982605692e+03 -5.555594170946484e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.030000000000000e+02 -1.184719247839227e+06 -4.954716652021641e+06 4.606924901185349e+06 -2.835058567806065e+03 -4.502657459465302e+03 -5.555707704849893e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.040000000000000e+02 -1.184775948925975e+06 -4.954806704012010e+06 4.606813785730608e+06 -2.835042748901541e+03 -4.502527930174691e+03 -5.555821239135660e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.050000000000000e+02 -1.184832649664441e+06 -4.954896753352725e+06 4.606702668076999e+06 -2.835026928865947e+03 -4.502398404324148e+03 -5.555934765778393e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.060000000000000e+02 -1.184889350132575e+06 -4.954986800188289e+06 4.606591548049038e+06 -2.835011104926083e+03 -4.502268869274367e+03 -5.556048296452121e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.070000000000000e+02 -1.184946050263587e+06 -4.955076844394906e+06 4.606480425797061e+06 -2.834995281038226e+03 -4.502139335270410e+03 -5.556161820933687e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.080000000000000e+02 -1.185002750090740e+06 -4.955166886034283e+06 4.606369301246142e+06 -2.834979454030092e+03 -4.502009797795366e+03 -5.556275344365936e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.090000000000000e+02 -1.185059449569552e+06 -4.955256925023964e+06 4.606258174496419e+06 -2.834963627497009e+03 -4.501880263021574e+03 -5.556388860051152e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.100000000000000e+02 -1.185116148755666e+06 -4.955346961467110e+06 4.606147045422599e+06 -2.834947797749811e+03 -4.501750722744409e+03 -5.556502376407114e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.110000000000000e+02 -1.185172847615507e+06 -4.955436995301551e+06 4.606035914100206e+06 -2.834931966240316e+03 -4.501621182336520e+03 -5.556615888350943e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.120000000000000e+02 -1.185229546182661e+06 -4.955527026589499e+06 4.605924780453663e+06 -2.834916133115528e+03 -4.501491635761296e+03 -5.556729400801565e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.130000000000000e+02 -1.185286244434706e+06 -4.955617055289445e+06 4.605813644533390e+06 -2.834900297734315e+03 -4.501362087207242e+03 -5.556842910585834e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.140000000000000e+02 -1.185342942360378e+06 -4.955707081380563e+06 4.605702506364703e+06 -2.834884460526418e+03 -4.501232538546498e+03 -5.556956415966879e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.150000000000000e+02 -1.185399639993248e+06 -4.955797104925045e+06 4.605591365872030e+06 -2.834868621567091e+03 -4.501102983768602e+03 -5.557069921873272e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.160000000000000e+02 -1.185456337244002e+06 -4.955887125757426e+06 4.605480223256416e+06 -2.834852783158236e+03 -4.500973437465482e+03 -5.557183415234455e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.170000000000000e+02 -1.185513034246329e+06 -4.955977144125482e+06 4.605369078216823e+06 -2.834836939581801e+03 -4.500843878878758e+03 -5.557296915731852e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.180000000000000e+02 -1.185569730888848e+06 -4.956067159822805e+06 4.605257931004039e+06 -2.834821097221281e+03 -4.500714324678936e+03 -5.557410406762974e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.190000000000000e+02 -1.185626427260653e+06 -4.956157173014519e+06 4.605146781417423e+06 -2.834805250805939e+03 -4.500584761370629e+03 -5.557523901813231e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.200000000000000e+02 -1.185683123283568e+06 -4.956247183555814e+06 4.605035629632946e+06 -2.834789403460582e+03 -4.500455201504136e+03 -5.557637389132836e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.210000000000000e+02 -1.185739819024623e+06 -4.956337191570878e+06 4.604924475499691e+06 -2.834773553921240e+03 -4.500325633762617e+03 -5.557750878624736e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.220000000000000e+02 -1.185796514405569e+06 -4.956427196914784e+06 4.604813319193787e+06 -2.834757703448626e+03 -4.500196071276311e+03 -5.557864358891381e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.230000000000000e+02 -1.185853209504584e+06 -4.956517199732367e+06 4.604702160539214e+06 -2.834741850783837e+03 -4.500066500914286e+03 -5.557977841329775e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.240000000000000e+02 -1.185909904276953e+06 -4.956607199940817e+06 4.604590999636625e+06 -2.834725996518061e+03 -4.499936930545743e+03 -5.558091319182658e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.250000000000000e+02 -1.185966598733708e+06 -4.956697197560618e+06 4.604479836461118e+06 -2.834710139795038e+03 -4.499807357908405e+03 -5.558204794697997e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.260000000000000e+02 -1.186023292874977e+06 -4.956787192591992e+06 4.604368671012432e+06 -2.834694282332877e+03 -4.499677783061226e+03 -5.558318267062622e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.270000000000000e+02 -1.186079986678340e+06 -4.956877184993447e+06 4.604257503341003e+06 -2.834678423479754e+03 -4.499548209613634e+03 -5.558431733588609e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.280000000000000e+02 -1.186136680210585e+06 -4.956967174888750e+06 4.604146333296379e+06 -2.834662560661855e+03 -4.499418627096731e+03 -5.558545204058617e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.290000000000000e+02 -1.186193373404937e+06 -4.957057162154176e+06 4.604035161028961e+06 -2.834646697928679e+03 -4.499289045543746e+03 -5.558658668392814e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.300000000000000e+02 -1.186250066261279e+06 -4.957147146789561e+06 4.603923986538963e+06 -2.834630833715718e+03 -4.499159465715838e+03 -5.558772126659802e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.310000000000000e+02 -1.186306758857543e+06 -4.957237128939312e+06 4.603812809650821e+06 -2.834614965206970e+03 -4.499029875055428e+03 -5.558885590471648e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.320000000000000e+02 -1.186363451082363e+06 -4.957327108397099e+06 4.603701630615385e+06 -2.834599098086605e+03 -4.498900290423857e+03 -5.558999043390144e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.330000000000000e+02 -1.186420143035881e+06 -4.957417085348509e+06 4.603590449207023e+06 -2.834583226383228e+03 -4.498770697316288e+03 -5.559112500036813e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.340000000000000e+02 -1.186476834640185e+06 -4.957507059649178e+06 4.603479265601254e+06 -2.834567355329365e+03 -4.498641106740446e+03 -5.559225949004075e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.350000000000000e+02 -1.186533525928599e+06 -4.957597031360902e+06 4.603368079722960e+06 -2.834551481760559e+03 -4.498511514319513e+03 -5.559339395310025e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.360000000000000e+02 -1.186590216912161e+06 -4.957687000504148e+06 4.603256891547236e+06 -2.834535605773746e+03 -4.498381918022916e+03 -5.559452840586182e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.370000000000000e+02 -1.186646907590996e+06 -4.957776967079140e+06 4.603145701073818e+06 -2.834519728413668e+03 -4.498252317610361e+03 -5.559566284565750e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.380000000000000e+02 -1.186703597942691e+06 -4.957866931044402e+06 4.603034508353149e+06 -2.834503849314627e+03 -4.498122716841976e+03 -5.559679724310488e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.390000000000000e+02 -1.186760287978275e+06 -4.957956892420404e+06 4.602923313360326e+06 -2.834487967861758e+03 -4.497993114023221e+03 -5.559793161491390e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.400000000000000e+02 -1.186816977675579e+06 -4.958046851166074e+06 4.602812116145327e+06 -2.834472086541658e+03 -4.497863512517785e+03 -5.559906592228946e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.410000000000000e+02 -1.186873667090236e+06 -4.958136807384483e+06 4.602700916582776e+06 -2.834456201842854e+03 -4.497733903537714e+03 -5.560020025331159e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.420000000000000e+02 -1.186930356177525e+06 -4.958226760992859e+06 4.602589714773351e+06 -2.834440314914816e+03 -4.497604294347030e+03 -5.560133454297150e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.430000000000000e+02 -1.186987044948727e+06 -4.958316712012060e+06 4.602478510691675e+06 -2.834424427656299e+03 -4.497474682540998e+03 -5.560246880265211e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.440000000000000e+02 -1.187043733403723e+06 -4.958406660441926e+06 4.602367304337963e+06 -2.834408537690877e+03 -4.497345068997906e+03 -5.560360303568162e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.450000000000000e+02 -1.187100421553548e+06 -4.958496606302924e+06 4.602256095687309e+06 -2.834392645415006e+03 -4.497215451649224e+03 -5.560473725734900e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.460000000000000e+02 -1.187157109364882e+06 -4.958586549533334e+06 4.602144884814803e+06 -2.834376753014521e+03 -4.497085835125098e+03 -5.560587141976484e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.470000000000000e+02 -1.187213796882122e+06 -4.958676490215432e+06 4.602033671620348e+06 -2.834360857121454e+03 -4.496956213492605e+03 -5.560700558681368e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.480000000000000e+02 -1.187270484094241e+06 -4.958766428328787e+06 4.601922456128786e+06 -2.834344959887534e+03 -4.496826587440089e+03 -5.560813974324961e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.490000000000000e+02 -1.187327170945393e+06 -4.958856363770004e+06 4.601811238465945e+06 -2.834329062308998e+03 -4.496696966358184e+03 -5.560927380724334e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.500000000000000e+02 -1.187383857513486e+06 -4.958946296683430e+06 4.601700018456195e+06 -2.834313160969988e+03 -4.496567338417543e+03 -5.561040789148439e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.510000000000000e+02 -1.187440543742914e+06 -4.959036226966055e+06 4.601588796224872e+06 -2.834297259775101e+03 -4.496437711202875e+03 -5.561154191609859e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.520000000000000e+02 -1.187497229655855e+06 -4.959126154658990e+06 4.601477571721946e+06 -2.834281356359813e+03 -4.496308081925850e+03 -5.561267591458117e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.530000000000000e+02 -1.187553915263340e+06 -4.959216079782711e+06 4.601366344922513e+06 -2.834265450172898e+03 -4.496178449160160e+03 -5.561380990113622e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.540000000000000e+02 -1.187610600554348e+06 -4.959306002316784e+06 4.601255115851426e+06 -2.834249543320177e+03 -4.496048813611380e+03 -5.561494386058546e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.550000000000000e+02 -1.187667285517614e+06 -4.959395922240401e+06 4.601143884534028e+06 -2.834233634465480e+03 -4.495919178061697e+03 -5.561607777594497e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.560000000000000e+02 -1.187723970186466e+06 -4.959485839615311e+06 4.601032650895161e+06 -2.834217722769267e+03 -4.495789536943752e+03 -5.561721169681998e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.570000000000000e+02 -1.187780654538736e+06 -4.959575754400442e+06 4.600921414984804e+06 -2.834201810076647e+03 -4.495659893311195e+03 -5.561834558984518e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.580000000000000e+02 -1.187837338563076e+06 -4.959665666574857e+06 4.600810176828453e+06 -2.834185895109717e+03 -4.495530249522943e+03 -5.561947944126759e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.590000000000000e+02 -1.187894022248469e+06 -4.959755576118133e+06 4.600698936450983e+06 -2.834169980232286e+03 -4.495400606774479e+03 -5.562061323073318e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.600000000000000e+02 -1.187950705661680e+06 -4.959845483153935e+06 4.600587693701841e+06 -2.834154061334624e+03 -4.495270955266605e+03 -5.562174705723680e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.610000000000000e+02 -1.188007388713416e+06 -4.959935387516976e+06 4.600476448782258e+06 -2.834138141977394e+03 -4.495141308591981e+03 -5.562288079297694e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.620000000000000e+02 -1.188064071492980e+06 -4.960025289372575e+06 4.600365201490952e+06 -2.834122220086052e+03 -4.495011652425687e+03 -5.562401456517518e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.630000000000000e+02 -1.188120753922227e+06 -4.960115188576098e+06 4.600253952004028e+06 -2.834106297208342e+03 -4.494881999437611e+03 -5.562514826258879e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.640000000000000e+02 -1.188177436045627e+06 -4.960205085209923e+06 4.600142700221191e+06 -2.834090371632749e+03 -4.494752342934001e+03 -5.562628194796129e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.650000000000000e+02 -1.188234117874455e+06 -4.960294979294896e+06 4.600031446117040e+06 -2.834074444469512e+03 -4.494622680105803e+03 -5.562741563949056e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.660000000000000e+02 -1.188290799330571e+06 -4.960384870686407e+06 4.599920189867704e+06 -2.834058517146123e+03 -4.494493024436124e+03 -5.562854921979098e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.670000000000000e+02 -1.188347480525316e+06 -4.960474759590620e+06 4.599808931222097e+06 -2.834042585441969e+03 -4.494363357814595e+03 -5.562968285676762e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.680000000000000e+02 -1.188404161380799e+06 -4.960564645863314e+06 4.599697670355863e+06 -2.834026653814038e+03 -4.494233692129250e+03 -5.563081643271028e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.690000000000000e+02 -1.188460841941484e+06 -4.960654529586851e+06 4.599586407168690e+06 -2.834010718993634e+03 -4.494104021041500e+03 -5.563195001434173e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.700000000000000e+02 -1.188517522140382e+06 -4.960744410637263e+06 4.599475141811591e+06 -2.833994783775228e+03 -4.493974355131869e+03 -5.563308350212285e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.710000000000000e+02 -1.188574202044491e+06 -4.960834289138556e+06 4.599363874133503e+06 -2.833978846780316e+03 -4.493844682930939e+03 -5.563421699661939e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.720000000000000e+02 -1.188630881609035e+06 -4.960924165007902e+06 4.599252604235332e+06 -2.833962907963492e+03 -4.493715012514966e+03 -5.563535043153743e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.730000000000000e+02 -1.188687560901013e+06 -4.961014038369314e+06 4.599141331966016e+06 -2.833946966621455e+03 -4.493585332785875e+03 -5.563648390137139e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.740000000000000e+02 -1.188744239831144e+06 -4.961103909057557e+06 4.599030057526832e+06 -2.833931024796927e+03 -4.493455657754952e+03 -5.563761728169390e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.750000000000000e+02 -1.188800918477329e+06 -4.961193777216885e+06 4.598918780742065e+06 -2.833915079360252e+03 -4.493325975882571e+03 -5.563875068140996e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.760000000000000e+02 -1.188857596795113e+06 -4.961283642764981e+06 4.598807501711980e+06 -2.833899133531012e+03 -4.493196292904746e+03 -5.563988403899361e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.770000000000000e+02 -1.188914274806671e+06 -4.961373505742935e+06 4.598696220386524e+06 -2.833883185127600e+03 -4.493066606292719e+03 -5.564101738495337e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.780000000000000e+02 -1.188970952511885e+06 -4.961463366150577e+06 4.598584936765910e+06 -2.833867233925175e+03 -4.492936916093168e+03 -5.564215071990196e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.790000000000000e+02 -1.189027629844016e+06 -4.961553223864353e+06 4.598473651000692e+06 -2.833851284241157e+03 -4.492807231850115e+03 -5.564328394610790e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.800000000000000e+02 -1.189084306903247e+06 -4.961643079069744e+06 4.598362362864855e+06 -2.833835330361532e+03 -4.492677538947462e+03 -5.564441720925342e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.810000000000000e+02 -1.189140983633740e+06 -4.961732931663429e+06 4.598251072484299e+06 -2.833819374890296e+03 -4.492547845602759e+03 -5.564555043013685e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.820000000000000e+02 -1.189197660046765e+06 -4.961822781666261e+06 4.598139779833621e+06 -2.833803418404165e+03 -4.492418149934865e+03 -5.564668362167813e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.830000000000000e+02 -1.189254336142127e+06 -4.961912629077934e+06 4.598028484913194e+06 -2.833787459386873e+03 -4.492288452248554e+03 -5.564781678810505e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.840000000000000e+02 -1.189311011897662e+06 -4.962002473857419e+06 4.597917187773036e+06 -2.833771500282563e+03 -4.492158755744090e+03 -5.564894989222830e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.850000000000000e+02 -1.189367687357831e+06 -4.962092316087035e+06 4.597805888312797e+06 -2.833755538092219e+03 -4.492029053615060e+03 -5.565008300337527e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.860000000000000e+02 -1.189424362511374e+06 -4.962182155745985e+06 4.597694586557837e+06 -2.833739573258033e+03 -4.491899347914650e+03 -5.565121610268497e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.870000000000000e+02 -1.189481037358417e+06 -4.962271992834485e+06 4.597583282507882e+06 -2.833723607239174e+03 -4.491769637774035e+03 -5.565234919082214e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.880000000000000e+02 -1.189537711843126e+06 -4.962361827249249e+06 4.597471976288860e+06 -2.833707640633540e+03 -4.491639932702376e+03 -5.565348218690084e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.890000000000000e+02 -1.189594386043385e+06 -4.962451659134465e+06 4.597360667724992e+06 -2.833691670413173e+03 -4.491510220497054e+03 -5.565461520475940e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.900000000000000e+02 -1.189651059914754e+06 -4.962541488407850e+06 4.597249356916580e+06 -2.833675700015682e+03 -4.491380507364098e+03 -5.565574817807449e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.910000000000000e+02 -1.189707733468255e+06 -4.962631315089870e+06 4.597138043838700e+06 -2.833659727153275e+03 -4.491250792590944e+03 -5.565688112286964e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.920000000000000e+02 -1.189764406681489e+06 -4.962721139139096e+06 4.597026728541849e+06 -2.833643753104388e+03 -4.491121078968587e+03 -5.565801401051168e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.930000000000000e+02 -1.189821079588009e+06 -4.962810960617613e+06 4.596915410950335e+06 -2.833627777682704e+03 -4.490991361305139e+03 -5.565914688453347e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.940000000000000e+02 -1.189877752221129e+06 -4.962900779587097e+06 4.596804090988936e+06 -2.833611798284886e+03 -4.490861634570463e+03 -5.566027979786266e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.950000000000000e+02 -1.189934424480444e+06 -4.962990595861815e+06 4.596692768884172e+06 -2.833595818864827e+03 -4.490731914768494e+03 -5.566141260131896e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.960000000000000e+02 -1.189991096455228e+06 -4.963080409606922e+06 4.596581444434610e+06 -2.833579837324563e+03 -4.490602186950593e+03 -5.566254542715884e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.970000000000000e+02 -1.190047768122994e+06 -4.963170220780884e+06 4.596470117690919e+06 -2.833563852669016e+03 -4.490472455589514e+03 -5.566367824301419e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.980000000000000e+02 -1.190104439450440e+06 -4.963260029322062e+06 4.596358788728277e+06 -2.833547867958630e+03 -4.490342725619816e+03 -5.566481099471865e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.990000000000000e+02 -1.190161110437454e+06 -4.963349835230291e+06 4.596247457546890e+06 -2.833531881958196e+03 -4.490212996730227e+03 -5.566594369032082e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.000000000000000e+02 -1.190217781139629e+06 -4.963439638608471e+06 4.596136124021243e+06 -2.833515892408691e+03 -4.490083260718791e+03 -5.566707640729014e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.010000000000000e+02 -1.190274451512521e+06 -4.963529439374355e+06 4.596024788251661e+06 -2.833499902426734e+03 -4.489953524021570e+03 -5.566820907886882e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.020000000000000e+02 -1.190331121567161e+06 -4.963619237548389e+06 4.595913450213211e+06 -2.833483910322122e+03 -4.489823785448742e+03 -5.566934172234485e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.030000000000000e+02 -1.190387791303428e+06 -4.963709033130402e+06 4.595802109906103e+06 -2.833467915796457e+03 -4.489694044744981e+03 -5.567047434114201e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.040000000000000e+02 -1.190444460721449e+06 -4.963798826120608e+06 4.595690767330077e+06 -2.833451920585022e+03 -4.489564301597943e+03 -5.567160693012411e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.050000000000000e+02 -1.190501129821110e+06 -4.963888616518831e+06 4.595579422485341e+06 -2.833435923066557e+03 -4.489434556387528e+03 -5.567273949336566e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.060000000000000e+02 -1.190557798613435e+06 -4.963978404345516e+06 4.595468075346968e+06 -2.833419922903903e+03 -4.489304807496786e+03 -5.567387204565384e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.070000000000000e+02 -1.190614467053981e+06 -4.964068189518428e+06 4.595356726015292e+06 -2.833403923195379e+03 -4.489175061479471e+03 -5.567500451936699e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.080000000000000e+02 -1.190671135220549e+06 -4.964157972181544e+06 4.595245374314628e+06 -2.833387919101121e+03 -4.489045306431574e+03 -5.567613703383120e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.090000000000000e+02 -1.190727803024126e+06 -4.964247752170195e+06 4.595134020445924e+06 -2.833371915905623e+03 -4.488915556054557e+03 -5.567726945297774e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.100000000000000e+02 -1.190784470531449e+06 -4.964337529607871e+06 4.595022664258483e+06 -2.833355909528671e+03 -4.488785800124559e+03 -5.567840187894520e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.110000000000000e+02 -1.190841137720118e+06 -4.964427304453177e+06 4.594911305802825e+06 -2.833339900956510e+03 -4.488656042273434e+03 -5.567953427750675e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.120000000000000e+02 -1.190897804601400e+06 -4.964517076726940e+06 4.594799945053532e+06 -2.833323891211543e+03 -4.488526280161385e+03 -5.568066666335110e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.130000000000000e+02 -1.190954471130614e+06 -4.964606846346547e+06 4.594688582111430e+06 -2.833307880359090e+03 -4.488396521135288e+03 -5.568179897581862e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.140000000000000e+02 -1.191011137363350e+06 -4.964696613414879e+06 4.594577216850968e+06 -2.833291866519207e+03 -4.488266756887202e+03 -5.568293129152032e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.150000000000000e+02 -1.191067803299736e+06 -4.964786377932140e+06 4.594465849271879e+06 -2.833275851069927e+03 -4.488136986651105e+03 -5.568406361062994e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.160000000000000e+02 -1.191124468895087e+06 -4.964876139815724e+06 4.594354479474988e+06 -2.833259834052346e+03 -4.488007217526985e+03 -5.568519587463019e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.170000000000000e+02 -1.191181134160431e+06 -4.964965899086078e+06 4.594243107435373e+06 -2.833243815349977e+03 -4.487877448657900e+03 -5.568632809108190e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.180000000000000e+02 -1.191237799140458e+06 -4.965055655825836e+06 4.594131733052131e+06 -2.833227794544246e+03 -4.487747671801980e+03 -5.568746032955068e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.190000000000000e+02 -1.191294463745925e+06 -4.965145409869988e+06 4.594020356526729e+06 -2.833211773562288e+03 -4.487617901759012e+03 -5.568859245990649e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.200000000000000e+02 -1.191351128076981e+06 -4.965235161403794e+06 4.593908977632976e+06 -2.833195748702369e+03 -4.487488122826196e+03 -5.568972462756934e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.210000000000000e+02 -1.191407792078051e+06 -4.965324910324456e+06 4.593797596496388e+06 -2.833179723371267e+03 -4.487358343004473e+03 -5.569085675169728e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.220000000000000e+02 -1.191464455737798e+06 -4.965414656611074e+06 4.593686213142504e+06 -2.833163696318671e+03 -4.487228564938155e+03 -5.569198881612172e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.230000000000000e+02 -1.191521119134328e+06 -4.965504400408068e+06 4.593574827394942e+06 -2.833147666123492e+03 -4.487098775637595e+03 -5.569312093383428e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.240000000000000e+02 -1.191577782156124e+06 -4.965594141509252e+06 4.593463439505511e+06 -2.833131635971351e+03 -4.486968993106814e+03 -5.569425294283289e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.250000000000000e+02 -1.191634444903332e+06 -4.965683880099872e+06 4.593352049247987e+06 -2.833115601821959e+03 -4.486839201583357e+03 -5.569538499049623e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.260000000000000e+02 -1.191691107309236e+06 -4.965773616056526e+06 4.593240656773067e+06 -2.833099567718309e+03 -4.486709410979157e+03 -5.569651697748512e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.270000000000000e+02 -1.191747769396002e+06 -4.965863349420247e+06 4.593129262030641e+06 -2.833083531398782e+03 -4.486579618425807e+03 -5.569764893739063e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.280000000000000e+02 -1.191804431152372e+06 -4.965953080170270e+06 4.593017865046090e+06 -2.833067493182864e+03 -4.486449825804359e+03 -5.569878085335040e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.290000000000000e+02 -1.191861092589612e+06 -4.966042808327402e+06 4.592906465793988e+06 -2.833051454195161e+03 -4.486320030553612e+03 -5.569991274140659e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.300000000000000e+02 -1.191917753729887e+06 -4.966132533932676e+06 4.592795064224220e+06 -2.833035412100495e+03 -4.486190229905104e+03 -5.570104463464729e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.310000000000000e+02 -1.191974414539662e+06 -4.966222256924116e+06 4.592683660412489e+06 -2.833019368262399e+03 -4.486060428875964e+03 -5.570217648583060e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.320000000000000e+02 -1.192031075041339e+06 -4.966311977343136e+06 4.592572254308210e+06 -2.833003323102899e+03 -4.485930623787845e+03 -5.570330832328324e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.330000000000000e+02 -1.192087735201305e+06 -4.966401695127642e+06 4.592460845987242e+06 -2.832987276115752e+03 -4.485800820166460e+03 -5.570444010388862e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.340000000000000e+02 -1.192144395053107e+06 -4.966491410339639e+06 4.592349435373831e+06 -2.832971227895309e+03 -4.485671012490280e+03 -5.570557187033830e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.350000000000000e+02 -1.192201054574346e+06 -4.966581122937768e+06 4.592238022518519e+06 -2.832955177802863e+03 -4.485541204627742e+03 -5.570670359371053e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.360000000000000e+02 -1.192257713787185e+06 -4.966670832963039e+06 4.592126607371187e+06 -2.832939125045031e+03 -4.485411392727632e+03 -5.570783530913622e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.370000000000000e+02 -1.192314372702892e+06 -4.966760540436264e+06 4.592015189906411e+06 -2.832923070667751e+03 -4.485281575135911e+03 -5.570896702554915e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.380000000000000e+02 -1.192371031310210e+06 -4.966850245336680e+06 4.591903770149563e+06 -2.832907013679409e+03 -4.485151753632621e+03 -5.571009873273438e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.390000000000000e+02 -1.192427689542185e+06 -4.966939947540548e+06 4.591792348251864e+06 -2.832890956389175e+03 -4.485021939030776e+03 -5.571123033171106e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.400000000000000e+02 -1.192484347476925e+06 -4.967029647192238e+06 4.591680924036879e+06 -2.832874897630216e+03 -4.484892118388840e+03 -5.571236193386537e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.410000000000000e+02 -1.192541005069750e+06 -4.967119344209211e+06 4.591569497605494e+06 -2.832858837325472e+03 -4.484762299256955e+03 -5.571349347757988e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.420000000000000e+02 -1.192597662365103e+06 -4.967209038673662e+06 4.591458068857251e+06 -2.832842774094901e+03 -4.484632474733791e+03 -5.571462502560673e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.430000000000000e+02 -1.192654319351970e+06 -4.967298730565204e+06 4.591346637817048e+06 -2.832826709491727e+03 -4.484502645731523e+03 -5.571575656356981e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.440000000000000e+02 -1.192710976007959e+06 -4.967388419842497e+06 4.591235204535441e+06 -2.832810643103478e+03 -4.484372816767994e+03 -5.571688805622844e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.450000000000000e+02 -1.192767632332953e+06 -4.967478106505360e+06 4.591123769012650e+06 -2.832794574923185e+03 -4.484242987553228e+03 -5.571801950599508e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.460000000000000e+02 -1.192824288338218e+06 -4.967567790574599e+06 4.591012331223235e+06 -2.832778505919911e+03 -4.484113155692581e+03 -5.571915092822054e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.470000000000000e+02 -1.192880944034694e+06 -4.967657472070507e+06 4.590900891142400e+06 -2.832762433750108e+03 -4.483983320272836e+03 -5.572028234078685e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.480000000000000e+02 -1.192937599433642e+06 -4.967747151013881e+06 4.590789448744708e+06 -2.832746359878689e+03 -4.483853478972089e+03 -5.572141375624351e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.490000000000000e+02 -1.192994254468124e+06 -4.967836827281024e+06 4.590678004181401e+06 -2.832730285537595e+03 -4.483723642601006e+03 -5.572254508044847e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.500000000000000e+02 -1.193050909238261e+06 -4.967926501057046e+06 4.590566557226146e+06 -2.832714206856594e+03 -4.483593795471827e+03 -5.572367645924354e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.510000000000000e+02 -1.193107563632802e+06 -4.968016172136299e+06 4.590455108130411e+06 -2.832698129453857e+03 -4.483463954882560e+03 -5.572480772583524e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.520000000000000e+02 -1.193164217729597e+06 -4.968105840662717e+06 4.590343656718188e+06 -2.832682048885656e+03 -4.483334108440981e+03 -5.572593900156881e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.530000000000000e+02 -1.193220871517386e+06 -4.968195506615532e+06 4.590232203014874e+06 -2.832665965609068e+03 -4.483204258490821e+03 -5.572707026519211e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.540000000000000e+02 -1.193277524962892e+06 -4.968285169933210e+06 4.590120747095722e+06 -2.832649882715756e+03 -4.483074409485763e+03 -5.572820146647507e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.550000000000000e+02 -1.193334178077130e+06 -4.968374830636170e+06 4.590009288935777e+06 -2.832633797552604e+03 -4.482944560407060e+03 -5.572933262553670e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.560000000000000e+02 -1.193390830915671e+06 -4.968464488827149e+06 4.589897828409368e+06 -2.832617708695573e+03 -4.482814702001085e+03 -5.573046382457025e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.570000000000000e+02 -1.193447483422954e+06 -4.968554144403446e+06 4.589786365642115e+06 -2.832601619373866e+03 -4.482684843037093e+03 -5.573159497734963e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.580000000000000e+02 -1.193504135598786e+06 -4.968643797364764e+06 4.589674900634391e+06 -2.832585527873580e+03 -4.482554984039341e+03 -5.573272608717546e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.590000000000000e+02 -1.193560787454426e+06 -4.968733447731895e+06 4.589563433360755e+06 -2.832569435357809e+03 -4.482425122577517e+03 -5.573385716882040e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.600000000000000e+02 -1.193617438967489e+06 -4.968823095463511e+06 4.589451963871776e+06 -2.832553341625110e+03 -4.482295262690120e+03 -5.573498819006828e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.610000000000000e+02 -1.193674090193541e+06 -4.968912740662343e+06 4.589340492041781e+06 -2.832537244407338e+03 -4.482165395434683e+03 -5.573611923428578e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.620000000000000e+02 -1.193730741088157e+06 -4.969002383246279e+06 4.589229017971217e+06 -2.832521146546066e+03 -4.482035527504810e+03 -5.573725023400162e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.630000000000000e+02 -1.193787391662363e+06 -4.969092023235733e+06 4.589117541635117e+06 -2.832505046692121e+03 -4.481905657509191e+03 -5.573838120660193e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.640000000000000e+02 -1.193844041927175e+06 -4.969181660651103e+06 4.589006063008519e+06 -2.832488943999188e+03 -4.481775783870496e+03 -5.573951216876624e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.650000000000000e+02 -1.193900691849315e+06 -4.969271295430876e+06 4.588894582166699e+06 -2.832472841545429e+03 -4.481645911268421e+03 -5.574064306849519e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.660000000000000e+02 -1.193957341473209e+06 -4.969360927657190e+06 4.588783099009144e+06 -2.832456735865773e+03 -4.481516033092517e+03 -5.574177397532713e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.670000000000000e+02 -1.194013990765331e+06 -4.969450557268139e+06 4.588671613611620e+06 -2.832440628311527e+03 -4.481386154771479e+03 -5.574290483877836e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.680000000000000e+02 -1.194070639736946e+06 -4.969540184284517e+06 4.588560125948674e+06 -2.832424520070049e+03 -4.481256273902262e+03 -5.574403567328338e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.690000000000000e+02 -1.194127288387937e+06 -4.969629808706149e+06 4.588448636020519e+06 -2.832408409526511e+03 -4.481126390935542e+03 -5.574516648230404e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.700000000000000e+02 -1.194183936718187e+06 -4.969719430532866e+06 4.588337143827378e+06 -2.832392296743628e+03 -4.480996506324699e+03 -5.574629726184723e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.710000000000000e+02 -1.194240584716687e+06 -4.969809049744310e+06 4.588225649394165e+06 -2.832376183447659e+03 -4.480866620809060e+03 -5.574742799820687e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.720000000000000e+02 -1.194297232405511e+06 -4.969898666381324e+06 4.588114152670885e+06 -2.832360067220346e+03 -4.480736731648170e+03 -5.574855872455326e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.730000000000000e+02 -1.194353879762519e+06 -4.969988280402975e+06 4.588002653707646e+06 -2.832343950621813e+03 -4.480606841786715e+03 -5.574968940541538e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.740000000000000e+02 -1.194410526843264e+06 -4.970077891911963e+06 4.587891152378735e+06 -2.832327829886046e+03 -4.480476943016462e+03 -5.575082012472863e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.750000000000000e+02 -1.194467173547414e+06 -4.970167500722952e+06 4.587779648911035e+06 -2.832311709040235e+03 -4.480347051049705e+03 -5.575195073592115e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.760000000000000e+02 -1.194523819964181e+06 -4.970257107000739e+06 4.587668143102792e+06 -2.832295586313148e+03 -4.480217151084222e+03 -5.575308136811115e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.770000000000000e+02 -1.194580466037771e+06 -4.970346710642298e+06 4.587556635080157e+06 -2.832279462027178e+03 -4.480087252931987e+03 -5.575421193948729e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.780000000000000e+02 -1.194637111812606e+06 -4.970436311729737e+06 4.587445124742592e+06 -2.832263334620004e+03 -4.479957349167289e+03 -5.575534251780093e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.790000000000000e+02 -1.194693757255411e+06 -4.970525910201557e+06 4.587333612165399e+06 -2.832247206989733e+03 -4.479827444647837e+03 -5.575647305042115e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.800000000000000e+02 -1.194750402388337e+06 -4.970615506098728e+06 4.587222097298411e+06 -2.832231076558416e+03 -4.479697536434939e+03 -5.575760357283840e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.810000000000000e+02 -1.194807047177863e+06 -4.970705099359369e+06 4.587110580217417e+06 -2.832214944755815e+03 -4.479567629856808e+03 -5.575873403507914e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.820000000000000e+02 -1.194863691646386e+06 -4.970794690024840e+06 4.586999060871769e+06 -2.832198812120036e+03 -4.479437720748836e+03 -5.575986446887141e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.830000000000000e+02 -1.194920335804847e+06 -4.970884278115398e+06 4.586887539236651e+06 -2.832182676465116e+03 -4.479307807808530e+03 -5.576099489456348e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.840000000000000e+02 -1.194976979664498e+06 -4.970973863651830e+06 4.586776015286610e+06 -2.832166538956822e+03 -4.479177889226293e+03 -5.576212532180844e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.850000000000000e+02 -1.195033623169561e+06 -4.971063446531123e+06 4.586664489147810e+06 -2.832150400746743e+03 -4.479047973703023e+03 -5.576325567425440e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.860000000000000e+02 -1.195090266364448e+06 -4.971153026835380e+06 4.586552960719702e+06 -2.832134259548620e+03 -4.478918054555903e+03 -5.576438601675291e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.870000000000000e+02 -1.195146909238158e+06 -4.971242604544245e+06 4.586441430027218e+06 -2.832118117678859e+03 -4.478788132892778e+03 -5.576551632997259e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.880000000000000e+02 -1.195203551779439e+06 -4.971332179636982e+06 4.586329897095759e+06 -2.832101974138831e+03 -4.478658211047827e+03 -5.576664659922516e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.890000000000000e+02 -1.195260194021573e+06 -4.971421752175113e+06 4.586218361849966e+06 -2.832085827243856e+03 -4.478528283640059e+03 -5.576777687602713e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.900000000000000e+02 -1.195316835931289e+06 -4.971511322097157e+06 4.586106824365148e+06 -2.832069680171095e+03 -4.478398355461970e+03 -5.576890710707085e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.910000000000000e+02 -1.195373477497334e+06 -4.971600889382386e+06 4.585995284666719e+06 -2.832053531517447e+03 -4.478268429070834e+03 -5.577003727763722e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.920000000000000e+02 -1.195430118764130e+06 -4.971690454112876e+06 4.585883742654115e+06 -2.832037379943932e+03 -4.478138496919414e+03 -5.577116745543990e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.930000000000000e+02 -1.195486759709533e+06 -4.971780016247715e+06 4.585772198377462e+06 -2.832021227479374e+03 -4.478008562443484e+03 -5.577229760336784e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.940000000000000e+02 -1.195543400344562e+06 -4.971869575807290e+06 4.585660651811775e+06 -2.832005072425618e+03 -4.477878624086255e+03 -5.577342774168238e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.950000000000000e+02 -1.195600040669100e+06 -4.971959132791433e+06 4.585549102957269e+06 -2.831988914559586e+03 -4.477748682150289e+03 -5.577455786889248e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.960000000000000e+02 -1.195656680638738e+06 -4.972048687118113e+06 4.585437551914465e+06 -2.831972757177445e+03 -4.477618742763433e+03 -5.577568792025101e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.970000000000000e+02 -1.195713320286685e+06 -4.972138238848713e+06 4.585325998608147e+06 -2.831956597253673e+03 -4.477488801773055e+03 -5.577681794314361e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.980000000000000e+02 -1.195769959624193e+06 -4.972227788004011e+06 4.585214443012858e+06 -2.831940435901017e+03 -4.477358856582357e+03 -5.577794795389504e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.990000000000000e+02 -1.195826598651151e+06 -4.972317334583830e+06 4.585102885128805e+06 -2.831924271947571e+03 -4.477228907514786e+03 -5.577907795504430e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.000000000000000e+02 -1.195883237345172e+06 -4.972406878546878e+06 4.584991325006602e+06 -2.831908106098477e+03 -4.477098958240183e+03 -5.578020791343844e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.010000000000000e+02 -1.195939875717522e+06 -4.972496419913931e+06 4.584879762620789e+06 -2.831891939653796e+03 -4.476969006532398e+03 -5.578133784153961e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.020000000000000e+02 -1.195996513745816e+06 -4.972585958643706e+06 4.584768198021976e+06 -2.831875771636827e+03 -4.476839056500075e+03 -5.578246771005504e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.030000000000000e+02 -1.196053151496731e+06 -4.972675494859369e+06 4.584656631059177e+06 -2.831859599638956e+03 -4.476709097168979e+03 -5.578359761943640e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.040000000000000e+02 -1.196109788881336e+06 -4.972765028396678e+06 4.584545061933731e+06 -2.831843428662674e+03 -4.476579142558302e+03 -5.578472743283953e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.050000000000000e+02 -1.196166425999706e+06 -4.972854559440474e+06 4.584433490419045e+06 -2.831827253258851e+03 -4.476449177104859e+03 -5.578585730171028e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.060000000000000e+02 -1.196223062740403e+06 -4.972944087785022e+06 4.584321916767349e+06 -2.831811077752956e+03 -4.476319218460188e+03 -5.578698706249754e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.070000000000000e+02 -1.196279699192605e+06 -4.973033613594980e+06 4.584210340776762e+06 -2.831794900048782e+03 -4.476189252115694e+03 -5.578811684316922e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.080000000000000e+02 -1.196336335311595e+06 -4.973123136787830e+06 4.584098762548467e+06 -2.831778720288800e+03 -4.476059285697593e+03 -5.578924658070936e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.090000000000000e+02 -1.196392971097491e+06 -4.973212657363789e+06 4.583987182082202e+06 -2.831762539827600e+03 -4.475929318668168e+03 -5.579037627352336e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.100000000000000e+02 -1.196449606583582e+06 -4.973302175384344e+06 4.583875599302566e+06 -2.831746356572789e+03 -4.475799345904607e+03 -5.579150597277155e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.110000000000000e+02 -1.196506241736351e+06 -4.973391690787660e+06 4.583764014285388e+06 -2.831730171328343e+03 -4.475669373189983e+03 -5.579263562759545e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.120000000000000e+02 -1.196562876567054e+06 -4.973481203594508e+06 4.583652427005203e+06 -2.831713985344990e+03 -4.475539397765919e+03 -5.579376525502060e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.130000000000000e+02 -1.196619511075579e+06 -4.973570713804713e+06 4.583540837462217e+06 -2.831697797070093e+03 -4.475409420500119e+03 -5.579489485482170e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.140000000000000e+02 -1.196676145272937e+06 -4.973660221438658e+06 4.583429245631448e+06 -2.831681606092501e+03 -4.475279439469099e+03 -5.579602444454697e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.150000000000000e+02 -1.196732779103602e+06 -4.973749726393803e+06 4.583317651638656e+06 -2.831665416097846e+03 -4.475149462992021e+03 -5.579715393986156e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.160000000000000e+02 -1.196789412656508e+06 -4.973839228834378e+06 4.583206055282407e+06 -2.831649222187447e+03 -4.475019477374125e+03 -5.579828347442379e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.170000000000000e+02 -1.196846045898138e+06 -4.973928728698560e+06 4.583094456638533e+06 -2.831633025439332e+03 -4.474889488260987e+03 -5.579941299729648e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.180000000000000e+02 -1.196902678772971e+06 -4.974018225883820e+06 4.582982855832808e+06 -2.831616829664339e+03 -4.474759503632669e+03 -5.580054242637455e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.190000000000000e+02 -1.196959311325414e+06 -4.974107720472183e+06 4.582871252764613e+06 -2.831600631751227e+03 -4.474629516776406e+03 -5.580167183031062e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.200000000000000e+02 -1.197015943610998e+06 -4.974197212566207e+06 4.582759647308125e+06 -2.831584429278199e+03 -4.474499519418016e+03 -5.580280128745911e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.210000000000000e+02 -1.197072575540810e+06 -4.974286702001737e+06 4.582648039664746e+06 -2.831568227395378e+03 -4.474369524757249e+03 -5.580393066712381e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.220000000000000e+02 -1.197129207159176e+06 -4.974376188860655e+06 4.582536429734015e+06 -2.831552022406670e+03 -4.474239526627294e+03 -5.580506003607064e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.230000000000000e+02 -1.197185838443957e+06 -4.974465673102083e+06 4.582424817566082e+06 -2.831535816906799e+03 -4.474109527523739e+03 -5.580618936242077e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.240000000000000e+02 -1.197242469395038e+06 -4.974555154725849e+06 4.582313203161168e+06 -2.831519609599047e+03 -4.473979528549980e+03 -5.580731864289402e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.250000000000000e+02 -1.197299100023436e+06 -4.974644633752334e+06 4.582201586494276e+06 -2.831503400165733e+03 -4.473849527380830e+03 -5.580844789790187e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.260000000000000e+02 -1.197355730340405e+06 -4.974734110202286e+06 4.582089967539930e+06 -2.831487189379915e+03 -4.473719521947240e+03 -5.580957714093379e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.270000000000000e+02 -1.197412360356960e+06 -4.974823584096084e+06 4.581978346273127e+06 -2.831470975600319e+03 -4.473589511036673e+03 -5.581070638915631e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.280000000000000e+02 -1.197468990006203e+06 -4.974913055310296e+06 4.581866722845365e+06 -2.831454761187219e+03 -4.473459505464424e+03 -5.581183554374575e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.290000000000000e+02 -1.197525619355042e+06 -4.975002523968391e+06 4.581755097105094e+06 -2.831438545147369e+03 -4.473329493469458e+03 -5.581296470520757e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.300000000000000e+02 -1.197582248392230e+06 -4.975091990049653e+06 4.581643469077744e+06 -2.831422326419899e+03 -4.473199477960758e+03 -5.581409385445994e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.310000000000000e+02 -1.197638877084261e+06 -4.975181453492290e+06 4.581531838839177e+06 -2.831406106345656e+03 -4.473069464048606e+03 -5.581522294381699e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.320000000000000e+02 -1.197695505453520e+06 -4.975270914337598e+06 4.581420206338692e+06 -2.831389885369461e+03 -4.472939447562026e+03 -5.581635200539326e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.330000000000000e+02 -1.197752133510945e+06 -4.975360372605816e+06 4.581308571551454e+06 -2.831373661402753e+03 -4.472809427527359e+03 -5.581748105638005e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.340000000000000e+02 -1.197808761267783e+06 -4.975449828317692e+06 4.581196934451975e+06 -2.831357435611624e+03 -4.472679401399629e+03 -5.581861011240906e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.350000000000000e+02 -1.197865388679408e+06 -4.975539281390899e+06 4.581085295141338e+06 -2.831341208597335e+03 -4.472549376786358e+03 -5.581973910867112e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.360000000000000e+02 -1.197922015745697e+06 -4.975628731825273e+06 4.580973653619763e+06 -2.831324979957078e+03 -4.472419354093826e+03 -5.582086804363325e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.370000000000000e+02 -1.197978642522428e+06 -4.975718179723715e+06 4.580862009760893e+06 -2.831308749406481e+03 -4.472289323226652e+03 -5.582199700101884e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.380000000000000e+02 -1.198035268964968e+06 -4.975807625003905e+06 4.580750363665812e+06 -2.831292517029972e+03 -4.472159292314049e+03 -5.582312591404961e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.390000000000000e+02 -1.198091895106584e+06 -4.975897067727273e+06 4.580638715259084e+06 -2.831276281525874e+03 -4.472029255827311e+03 -5.582425483363900e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.400000000000000e+02 -1.198148520891759e+06 -4.975986507791362e+06 4.580527064666537e+06 -2.831260046398957e+03 -4.471899222303998e+03 -5.582538367455914e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t</EPHEMLISTList>\n\t</EPH>\n\t<ATT>\n\t\t<SATID>Imaginary1</SATID>\n\t\t<GENERATIONTIME>1959-11-30T00:18:13.000000Z</GENERATIONTIME>\n\t\t<STARTTIME>1959-11-25T17:39:40.987511Z</STARTTIME>\n\t\t<NUMPOINTS>840</NUMPOINTS>\n\t\t<TIMEINTERVAL>2.000000000000000e-02</TIMEINTERVAL>\n\t\t<ATTLISTList>\n\t\t\t<ATTLIST>1.000000000000000e+00 6.795012901179663e-01 -7.039793799103053e-01 -2.023917199358860e-01 -4.157668926833060e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.000000000000000e+00 6.795031921696149e-01 -7.039852730262131e-01 -2.023634939866958e-01 -4.158321169664750e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.000000000000000e+00 6.795050940076900e-01 -7.039911671585269e-01 -2.023352617254185e-01 -4.158973001693780e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.000000000000000e+00 6.795069956282339e-01 -7.039970623085654e-01 -2.023070231575671e-01 -4.159624423340190e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.000000000000000e+00 6.795088970622606e-01 -7.040029584543205e-01 -2.022787782519255e-01 -4.160275435235960e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.000000000000000e+00 6.795107983244882e-01 -7.040088555841620e-01 -2.022505269954615e-01 -4.160926038219470e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.000000000000000e+00 6.795126993442279e-01 -7.040147537480659e-01 -2.022222694541582e-01 -4.161576229965050e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.000000000000000e+00 6.795146002014344e-01 -7.040206528897818e-01 -2.021940055491108e-01 -4.162226012287550e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>9.000000000000000e+00 6.795165008206093e-01 -7.040265530611999e-01 -2.021657353543056e-01 -4.162875383594130e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.000000000000000e+01 6.795184012613739e-01 -7.040324542188404e-01 -2.021374588139688e-01 -4.163524346048480e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.100000000000000e+01 6.795203015174702e-01 -7.040383563686955e-01 -2.021091759287698e-01 -4.164172898266690e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.200000000000000e+01 6.795222015273501e-01 -7.040442595509356e-01 -2.020808867636002e-01 -4.164821040134950e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.300000000000000e+01 6.795241013689588e-01 -7.040501637119229e-01 -2.020525912387455e-01 -4.165468772698050e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.400000000000000e+01 6.795260010190228e-01 -7.040560688668507e-01 -2.020242893776136e-01 -4.166116095744060e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.500000000000000e+01 6.795279004301762e-01 -7.040619750503345e-01 -2.019959812213390e-01 -4.166763006948090e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.600000000000000e+01 6.795297996610842e-01 -7.040678822172045e-01 -2.019676667204161e-01 -4.167409509825730e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.700000000000000e+01 6.795316987072143e-01 -7.040737903710086e-01 -2.019393458766498e-01 -4.168055603755300e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.800000000000000e+01 6.795335975150002e-01 -7.040796995524565e-01 -2.019110187332267e-01 -4.168701285238810e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.900000000000000e+01 6.795354961360811e-01 -7.040856097198989e-01 -2.018826852506496e-01 -4.169346558437880e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.000000000000000e+01 6.795373945807668e-01 -7.040915208672780e-01 -2.018543454144770e-01 -4.169991422628810e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.100000000000000e+01 6.795392927722119e-01 -7.040974330490690e-01 -2.018259992963614e-01 -4.170635875234390e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.200000000000000e+01 6.795411908128990e-01 -7.041033461910222e-01 -2.017976468003938e-01 -4.171279919900170e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.300000000000000e+01 6.795430886004499e-01 -7.041092603677667e-01 -2.017692880179178e-01 -4.171923552104290e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.400000000000000e+01 6.795449862043442e-01 -7.041151755254639e-01 -2.017409228913374e-01 -4.172566776259380e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.500000000000000e+01 6.795468836354301e-01 -7.041210916568698e-01 -2.017125514075215e-01 -4.173209592126210e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.600000000000000e+01 6.795487808108983e-01 -7.041270088231787e-01 -2.016841736381700e-01 -4.173851995499380e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.700000000000000e+01 6.795506778088990e-01 -7.041329269658226e-01 -2.016557895141527e-01 -4.174493990213870e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.800000000000000e+01 6.795525746226287e-01 -7.041388460888128e-01 -2.016273990420547e-01 -4.175135576251040e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.900000000000000e+01 6.795544711875586e-01 -7.041447662384701e-01 -2.015990022805154e-01 -4.175776751059130e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.000000000000000e+01 6.795563675697758e-01 -7.041506873681586e-01 -2.015705991641825e-01 -4.176417516142380e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.100000000000000e+01 6.795582637705441e-01 -7.041566094724618e-01 -2.015421897003983e-01 -4.177057873886140e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.200000000000000e+01 6.795601597194840e-01 -7.041625326055196e-01 -2.015137739450329e-01 -4.177697819421850e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.300000000000000e+01 6.795620555097833e-01 -7.041684566994181e-01 -2.014853518115018e-01 -4.178337356262010e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.400000000000000e+01 6.795639510474406e-01 -7.041743818175766e-01 -2.014569233952892e-01 -4.178976483219710e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.500000000000000e+01 6.795658464051249e-01 -7.041803079097471e-01 -2.014284886223090e-01 -4.179615201370400e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.600000000000000e+01 6.795677415806715e-01 -7.041862349773556e-01 -2.014000474931086e-01 -4.180253510417940e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.700000000000000e+01 6.795696364968842e-01 -7.041921630755553e-01 -2.013716000788236e-01 -4.180891407532190e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.800000000000000e+01 6.795715312385208e-01 -7.041980921417377e-01 -2.013431463024344e-01 -4.181528896355330e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.900000000000000e+01 6.795734257882386e-01 -7.042040221875822e-01 -2.013146861801534e-01 -4.182165976446780e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.000000000000000e+01 6.795753200928879e-01 -7.042099532511444e-01 -2.012862197602649e-01 -4.182802645705700e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.100000000000000e+01 6.795772142114155e-01 -7.042158852897767e-01 -2.012577469866033e-01 -4.183438906049140e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.200000000000000e+01 6.795791081393254e-01 -7.042218183066008e-01 -2.012292678618453e-01 -4.184074757087550e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.300000000000000e+01 6.795810018215931e-01 -7.042277523386692e-01 -2.012007824414075e-01 -4.184710198032180e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.400000000000000e+01 6.795828953184365e-01 -7.042336873443790e-01 -2.011722906634436e-01 -4.185345229695360e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.500000000000000e+01 6.795847886270806e-01 -7.042396233240191e-01 -2.011437925326658e-01 -4.185979852681810e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.600000000000000e+01 6.795866816859607e-01 -7.042455603201958e-01 -2.011152881086695e-01 -4.186614065477190e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.700000000000000e+01 6.795885745799152e-01 -7.042514982738010e-01 -2.010867773061127e-01 -4.187247869648390e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.800000000000000e+01 6.795904672174917e-01 -7.042574372480126e-01 -2.010582602146097e-01 -4.187881263177330e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.900000000000000e+01 6.795923596757100e-01 -7.042633771889883e-01 -2.010297367569464e-01 -4.188514247551360e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.000000000000000e+01 6.795942519378680e-01 -7.042693181059694e-01 -2.010012069532644e-01 -4.189146823511180e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.100000000000000e+01 6.795961439552599e-01 -7.042752600345781e-01 -2.009726708460155e-01 -4.189778988667740e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.200000000000000e+01 6.795980357844214e-01 -7.042812029327177e-01 -2.009441283839045e-01 -4.190410745539760e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.300000000000000e+01 6.795999274203595e-01 -7.042871468046601e-01 -2.009155795682612e-01 -4.191042093254690e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.400000000000000e+01 6.796018188080356e-01 -7.042930916886662e-01 -2.008870244518403e-01 -4.191673030325510e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.500000000000000e+01 6.796037100041895e-01 -7.042990375436710e-01 -2.008584629804457e-01 -4.192303558586010e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.600000000000000e+01 6.796056010159021e-01 -7.043049843631807e-01 -2.008298951488766e-01 -4.192933678804790e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.700000000000000e+01 6.796074917731262e-01 -7.043109321979667e-01 -2.008013210200126e-01 -4.193563387966340e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.800000000000000e+01 6.796093823611057e-01 -7.043168809854401e-01 -2.007727405152986e-01 -4.194192689510570e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.900000000000000e+01 6.796112726996719e-01 -7.043228307833497e-01 -2.007441537077760e-01 -4.194821580246480e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.000000000000000e+01 6.796131628397541e-01 -7.043287815536684e-01 -2.007155605512496e-01 -4.195450062470620e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.100000000000000e+01 6.796150527998679e-01 -7.043347332831532e-01 -2.006869610264543e-01 -4.196078136485220e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.200000000000000e+01 6.796169424965223e-01 -7.043406860315834e-01 -2.006583552103851e-01 -4.196705799195700e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.300000000000000e+01 6.796188320142774e-01 -7.043466397368305e-01 -2.006297430251785e-01 -4.197333054018500e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.400000000000000e+01 6.796207213316237e-01 -7.043525944136150e-01 -2.006011244908768e-01 -4.197959900343160e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.500000000000000e+01 6.796226104022928e-01 -7.043585500965851e-01 -2.005724996459374e-01 -4.198586335411420e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.600000000000000e+01 6.796244992744610e-01 -7.043645067481321e-01 -2.005438684502678e-01 -4.199212362336900e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.700000000000000e+01 6.796263879612657e-01 -7.043704643589256e-01 -2.005152308895167e-01 -4.199837981206470e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.800000000000000e+01 6.796282763888346e-01 -7.043764229821449e-01 -2.004865870310055e-01 -4.200463189077510e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.900000000000000e+01 6.796301646299087e-01 -7.043823825638621e-01 -2.004579368085549e-01 -4.201087989126120e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.000000000000000e+01 6.796320526743754e-01 -7.043883431120742e-01 -2.004292802281825e-01 -4.201712380273550e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.100000000000000e+01 6.796339404640521e-01 -7.043943046673543e-01 -2.004006173455687e-01 -4.202336360900710e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.200000000000000e+01 6.796358280863000e-01 -7.044002671655367e-01 -2.003719480801510e-01 -4.202959934540350e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.300000000000000e+01 6.796377154506369e-01 -7.044062306726971e-01 -2.003432725126685e-01 -4.203583097116940e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.400000000000000e+01 6.796396026170802e-01 -7.044121951441673e-01 -2.003145905885660e-01 -4.204205851297100e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.500000000000000e+01 6.796414895980506e-01 -7.044181605699508e-01 -2.002859022968422e-01 -4.204828197833920e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.600000000000000e+01 6.796433763167853e-01 -7.044241270061340e-01 -2.002572077056954e-01 -4.205450133201960e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.700000000000000e+01 6.796452628469613e-01 -7.044300943980907e-01 -2.002285067480556e-01 -4.206071660618740e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.800000000000000e+01 6.796471491794277e-01 -7.044360627519347e-01 -2.001997994317655e-01 -4.206692779737960e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.900000000000000e+01 6.796490352585286e-01 -7.044420321083782e-01 -2.001710858057136e-01 -4.207313487882250e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.000000000000000e+01 6.796509211421690e-01 -7.044480024227050e-01 -2.001423658208579e-01 -4.207933788561480e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.100000000000000e+01 6.796528068342278e-01 -7.044539736935043e-01 -2.001136394686103e-01 -4.208553680796570e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.200000000000000e+01 6.796546922590817e-01 -7.044599459736781e-01 -2.000849068215534e-01 -4.209173162493760e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.300000000000000e+01 6.796565775227883e-01 -7.044659191869860e-01 -2.000561677783481e-01 -4.209792237019010e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.400000000000000e+01 6.796584625182990e-01 -7.044718934092341e-01 -2.000274224403609e-01 -4.210410901012060e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.500000000000000e+01 6.796603473237741e-01 -7.044778685840885e-01 -1.999986707327806e-01 -4.211029156948910e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.600000000000000e+01 6.796622319377462e-01 -7.044838447124563e-01 -1.999699126555146e-01 -4.211647004561090e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.700000000000000e+01 6.796641162823588e-01 -7.044898218484826e-01 -1.999411482841119e-01 -4.212264441894000e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.800000000000000e+01 6.796660004402233e-01 -7.044957999329756e-01 -1.999123775387696e-01 -4.212881471373130e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.900000000000000e+01 6.796678843935604e-01 -7.045017789771568e-01 -1.998836004379378e-01 -4.213498092998230e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>9.000000000000000e+01 6.796697681018203e-01 -7.045077590123142e-01 -1.998548170131007e-01 -4.214114303771320e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>9.100000000000000e+01 6.796716515954266e-01 -7.045137400133533e-01 -1.998260272412535e-01 -4.214730106329730e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>9.200000000000000e+01 6.796735349070104e-01 -7.045197219563238e-01 -1.997972310910624e-01 -4.215345501780120e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>9.300000000000000e+01 6.796754179552619e-01 -7.045257049010482e-01 -1.997684286340649e-01 -4.215960486174000e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>9.400000000000000e+01 6.796773008000128e-01 -7.045316888017777e-01 -1.997396198185027e-01 -4.216575062872800e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>9.500000000000000e+01 6.796791834556047e-01 -7.045376736482865e-01 -1.997108046288966e-01 -4.217189232014360e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>9.600000000000000e+01 6.796810658444614e-01 -7.045436594972865e-01 -1.996819831342765e-01 -4.217802990030720e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>9.700000000000000e+01 6.796829480627019e-01 -7.045496462769856e-01 -1.996531552486250e-01 -4.218416341516560e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>9.800000000000000e+01 6.796848300095097e-01 -7.045556340610444e-01 -1.996243210622798e-01 -4.219029281964820e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>9.900000000000000e+01 6.796867117714123e-01 -7.045616227842402e-01 -1.995954804989941e-01 -4.219641815816980e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.000000000000000e+02 6.796885933255380e-01 -7.045676124646588e-01 -1.995666335746971e-01 -4.220253941013960e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.010000000000000e+02 6.796904746220614e-01 -7.045736031379983e-01 -1.995377803348005e-01 -4.220865655569230e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.020000000000000e+02 6.796923557182968e-01 -7.045795947603323e-01 -1.995089207298232e-01 -4.221476962745790e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.030000000000000e+02 6.796942366154390e-01 -7.045855873298367e-01 -1.994800547590306e-01 -4.222087862845600e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.040000000000000e+02 6.796961172538162e-01 -7.045915808937199e-01 -1.994511824669762e-01 -4.222698350936580e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.050000000000000e+02 6.796979976852925e-01 -7.045975754080924e-01 -1.994223038181599e-01 -4.223308432377840e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.060000000000000e+02 6.796998779255191e-01 -7.046035708629457e-01 -1.993934187931938e-01 -4.223918106666610e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.070000000000000e+02 6.797017578961645e-01 -7.046095673167410e-01 -1.993645274591496e-01 -4.224527369504360e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.080000000000000e+02 6.797036376917659e-01 -7.046155646976316e-01 -1.993356297340957e-01 -4.225136226123380e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.090000000000000e+02 6.797055172182811e-01 -7.046215630731820e-01 -1.993067257049162e-01 -4.225744672978040e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.100000000000000e+02 6.797073965522089e-01 -7.046275623893914e-01 -1.992778152955133e-01 -4.226352711795160e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.110000000000000e+02 6.797092756839871e-01 -7.046335626522799e-01 -1.992488985150173e-01 -4.226960342441640e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.120000000000000e+02 6.797111545451996e-01 -7.046395639095456e-01 -1.992199754295197e-01 -4.227567563101480e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.130000000000000e+02 6.797130332134302e-01 -7.046455661048171e-01 -1.991910459655104e-01 -4.228174376472930e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.140000000000000e+02 6.797149116732815e-01 -7.046515692483717e-01 -1.991621101374741e-01 -4.228780782186530e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.150000000000000e+02 6.797167898714911e-01 -7.046575733784293e-01 -1.991331679940133e-01 -4.229386778112310e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.160000000000000e+02 6.797186678692761e-01 -7.046635784513378e-01 -1.991042194748240e-01 -4.229992365824300e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.170000000000000e+02 6.797205456600242e-01 -7.046695844701800e-01 -1.990752645881302e-01 -4.230597545771560e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.180000000000000e+02 6.797224231929014e-01 -7.046755914710134e-01 -1.990463033812120e-01 -4.231202316153090e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.190000000000000e+02 6.797243005156455e-01 -7.046815994188381e-01 -1.990173358088236e-01 -4.231806678692700e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.200000000000000e+02 6.797261776449124e-01 -7.046876083013288e-01 -1.989883618542364e-01 -4.232410633855860e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.210000000000000e+02 6.797280544946541e-01 -7.046936181790645e-01 -1.989593815997579e-01 -4.233014179108430e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.220000000000000e+02 6.797299311798736e-01 -7.046996289703368e-01 -1.989303949329057e-01 -4.233617317510400e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.230000000000000e+02 6.797318075843050e-01 -7.047056407566004e-01 -1.989014019664283e-01 -4.234220045996710e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.240000000000000e+02 6.797336837877276e-01 -7.047116534806431e-01 -1.988724026229552e-01 -4.234822366896840e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.250000000000000e+02 6.797355597921615e-01 -7.047176671404248e-01 -1.988433969000887e-01 -4.235424280315040e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.260000000000000e+02 6.797374355242299e-01 -7.047236817876797e-01 -1.988143848676253e-01 -4.236025783996730e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.270000000000000e+02 6.797393110583803e-01 -7.047296973694713e-01 -1.987853664521773e-01 -4.236626879825200e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.280000000000000e+02 6.797411863821243e-01 -7.047357138916002e-01 -1.987563416709577e-01 -4.237227568937300e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.290000000000000e+02 6.797430614399738e-01 -7.047417313962825e-01 -1.987273105692628e-01 -4.237827847718480e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.300000000000000e+02 6.797449362940748e-01 -7.047477498368057e-01 -1.986982730912777e-01 -4.238427719175490e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.310000000000000e+02 6.797468109439584e-01 -7.047537692133381e-01 -1.986692292359904e-01 -4.239027183080040e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.320000000000000e+02 6.797486853211984e-01 -7.047597895736176e-01 -1.986401790695730e-01 -4.239626237607330e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.330000000000000e+02 6.797505595173958e-01 -7.047658108521972e-01 -1.986111225027640e-01 -4.240224885338540e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.340000000000000e+02 6.797524334436709e-01 -7.047718331129262e-01 -1.985820596178356e-01 -4.240823122922970e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.350000000000000e+02 6.797543071639158e-01 -7.047778563082016e-01 -1.985529903564512e-01 -4.241420953208690e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.360000000000000e+02 6.797561806809566e-01 -7.047838804346076e-01 -1.985239147172657e-01 -4.242018376796050e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.370000000000000e+02 6.797580539211397e-01 -7.047899055464529e-01 -1.984948327649853e-01 -4.242615390024520e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.380000000000000e+02 6.797599269624665e-01 -7.047959315858279e-01 -1.984657444282991e-01 -4.243211996316710e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.390000000000000e+02 6.797617997916312e-01 -7.048019585618789e-01 -1.984366497188867e-01 -4.243808195154290e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.400000000000000e+02 6.797636723557344e-01 -7.048079865133727e-01 -1.984075486832945e-01 -4.244403983950480e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.410000000000000e+02 6.797655447081312e-01 -7.048140153988206e-01 -1.983784412764372e-01 -4.244999366054020e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.420000000000000e+02 6.797674168530146e-01 -7.048200452153767e-01 -1.983493274921200e-01 -4.245594341194520e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.430000000000000e+02 6.797692887287506e-01 -7.048260760093651e-01 -1.983202073822311e-01 -4.246188905734140e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.440000000000000e+02 6.797711603963520e-01 -7.048321077321323e-01 -1.982910808982288e-01 -4.246783064260640e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.450000000000000e+02 6.797730318568528e-01 -7.048381403862743e-01 -1.982619480296380e-01 -4.247376814522210e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.460000000000000e+02 6.797749030429507e-01 -7.048441740175544e-01 -1.982328088443416e-01 -4.247970155428780e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.470000000000000e+02 6.797767740425864e-01 -7.048502085623766e-01 -1.982036632581659e-01 -4.248563089884010e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.480000000000000e+02 6.797786447688474e-01 -7.048562440816140e-01 -1.981745113552329e-01 -4.249155615536030e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.490000000000000e+02 6.797805152918426e-01 -7.048622805270170e-01 -1.981453530624595e-01 -4.249747733175350e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.500000000000000e+02 6.797823856004088e-01 -7.048683179042089e-01 -1.981161883940513e-01 -4.250339443528250e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.510000000000000e+02 6.797842556315041e-01 -7.048743562578088e-01 -1.980870174095032e-01 -4.250930744517820e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.520000000000000e+02 6.797861254679065e-01 -7.048803955271700e-01 -1.980578400312500e-01 -4.251521639305070e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.530000000000000e+02 6.797879950808270e-01 -7.048864357327520e-01 -1.980286562852194e-01 -4.252112126740020e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.540000000000000e+02 6.797898644234995e-01 -7.048924769088557e-01 -1.979994662123582e-01 -4.252702204480930e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.550000000000000e+02 6.797917335587214e-01 -7.048985190102082e-01 -1.979702697516701e-01 -4.253291874413050e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.560000000000000e+02 6.797936024814468e-01 -7.049045620367884e-01 -1.979410669144260e-01 -4.253881138206560e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.570000000000000e+02 6.797954711314728e-01 -7.049106060338930e-01 -1.979118577512490e-01 -4.254469992276370e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.580000000000000e+02 6.797973395895273e-01 -7.049166509416007e-01 -1.978826421881329e-01 -4.255058440165000e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.590000000000000e+02 6.797992077727463e-01 -7.049226968198082e-01 -1.978534203010406e-01 -4.255646478521280e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.600000000000000e+02 6.798010757438010e-01 -7.049287436221506e-01 -1.978241920317650e-01 -4.256234109922370e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.610000000000000e+02 6.798029435130043e-01 -7.049347913405176e-01 -1.977949573702664e-01 -4.256821334811320e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.620000000000000e+02 6.798048109921104e-01 -7.049408400387458e-01 -1.977657163974766e-01 -4.257408149615750e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.630000000000000e+02 6.798066782686570e-01 -7.049468896519006e-01 -1.977364690331906e-01 -4.257994558159980e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.640000000000000e+02 6.798085453254362e-01 -7.049529401935497e-01 -1.977072152891063e-01 -4.258580558837690e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.650000000000000e+02 6.798104121186409e-01 -7.049589916930997e-01 -1.976779552097546e-01 -4.259166151046600e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.660000000000000e+02 6.798122786875559e-01 -7.049650441220499e-01 -1.976486887566367e-01 -4.259751335948540e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.670000000000000e+02 6.798141450456567e-01 -7.049710974699759e-01 -1.976194159167985e-01 -4.260336114115990e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.680000000000000e+02 6.798160111310448e-01 -7.049771517814684e-01 -1.975901367469469e-01 -4.260920483048780e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.690000000000000e+02 6.798178769972170e-01 -7.049832070156776e-01 -1.975608511999767e-01 -4.261504445648290e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.700000000000000e+02 6.798197426591834e-01 -7.049892631641861e-01 -1.975315592543420e-01 -4.262088000696420e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.710000000000000e+02 6.798216080319331e-01 -7.049953202865271e-01 -1.975022609925256e-01 -4.262671145906310e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.720000000000000e+02 6.798234732209134e-01 -7.050013783035031e-01 -1.974729563203813e-01 -4.263253886532880e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.730000000000000e+02 6.798253381257020e-01 -7.050074372898302e-01 -1.974436453256216e-01 -4.263836217341660e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.740000000000000e+02 6.798272028242294e-01 -7.050134971891345e-01 -1.974143279332440e-01 -4.264418140844000e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.750000000000000e+02 6.798290672951102e-01 -7.050195580133446e-01 -1.973850041695649e-01 -4.264999658042160e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.760000000000000e+02 6.798309315042805e-01 -7.050256197886668e-01 -1.973556740611991e-01 -4.265580766411970e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.770000000000000e+02 6.798327954797303e-01 -7.050316824936707e-01 -1.973263375827155e-01 -4.266161467351580e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.780000000000000e+02 6.798346592564191e-01 -7.050377461022169e-01 -1.972969947013596e-01 -4.266741762312860e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.790000000000000e+02 6.798365227410014e-01 -7.050438106819047e-01 -1.972676455028438e-01 -4.267321647505450e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.800000000000000e+02 6.798383860193378e-01 -7.050498761693755e-01 -1.972382899075223e-01 -4.267901126463060e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.810000000000000e+02 6.798402490773372e-01 -7.050559425747454e-01 -1.972089279269271e-01 -4.268480198400300e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.820000000000000e+02 6.798421118500496e-01 -7.050620099429011e-01 -1.971795596251077e-01 -4.269058861845190e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.830000000000000e+02 6.798439744368735e-01 -7.050680782037289e-01 -1.971501849026640e-01 -4.269637119032000e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.840000000000000e+02 6.798458367370194e-01 -7.050741474283274e-01 -1.971208038566758e-01 -4.270214967021480e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.850000000000000e+02 6.798476988269346e-01 -7.050802175609912e-01 -1.970914164143522e-01 -4.270792408501470e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.860000000000000e+02 6.798495606920428e-01 -7.050862886102385e-01 -1.970620225921574e-01 -4.271369443824960e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.870000000000000e+02 6.798514222739783e-01 -7.050923606200558e-01 -1.970326224391282e-01 -4.271946069470040e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.880000000000000e+02 6.798532836506548e-01 -7.050984335328769e-01 -1.970032158829008e-01 -4.272522288649730e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.890000000000000e+02 6.798551448009553e-01 -7.051045073627854e-01 -1.969738029441770e-01 -4.273098100985320e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.900000000000000e+02 6.798570056664353e-01 -7.051105821499222e-01 -1.969443836810372e-01 -4.273673505268180e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.910000000000000e+02 6.798588663180682e-01 -7.051166578441354e-01 -1.969149580221255e-01 -4.274248503037880e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.920000000000000e+02 6.798607267547637e-01 -7.051227344464227e-01 -1.968855259661000e-01 -4.274823093809000e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.930000000000000e+02 6.798625869035370e-01 -7.051288120083469e-01 -1.968560875826636e-01 -4.275397275312360e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.940000000000000e+02 6.798644468316455e-01 -7.051348904797335e-01 -1.968266428101466e-01 -4.275971050558920e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.950000000000000e+02 6.798663065475848e-01 -7.051409698549571e-01 -1.967971916374721e-01 -4.276544419224420e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.960000000000000e+02 6.798681659713435e-01 -7.051470501891645e-01 -1.967677341444176e-01 -4.277117379677370e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.970000000000000e+02 6.798700252083145e-01 -7.051531314085940e-01 -1.967382702241842e-01 -4.277689933943110e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.980000000000000e+02 6.798718841447217e-01 -7.051592135931014e-01 -1.967087999876984e-01 -4.278262079004330e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.990000000000000e+02 6.798737428751541e-01 -7.051652966732846e-01 -1.966793233462688e-01 -4.278833818531920e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.000000000000000e+02 6.798756013870554e-01 -7.051713806585288e-01 -1.966498403091284e-01 -4.279405151570000e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.010000000000000e+02 6.798774596011082e-01 -7.051774656058257e-01 -1.966203509500633e-01 -4.279976075122290e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.020000000000000e+02 6.798793176047739e-01 -7.051835514505909e-01 -1.965908551878366e-01 -4.280546592800730e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.030000000000000e+02 6.798811753820057e-01 -7.051896382039839e-01 -1.965613530366951e-01 -4.281116703969420e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.040000000000000e+02 6.798830328785108e-01 -7.051957259050775e-01 -1.965318445464533e-01 -4.281686406426270e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.050000000000000e+02 6.798848901500238e-01 -7.052018145124993e-01 -1.965023296651326e-01 -4.282255702482280e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.060000000000000e+02 6.798867472016763e-01 -7.052079040219095e-01 -1.964728083874397e-01 -4.282824592370850e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.070000000000000e+02 6.798886039654499e-01 -7.052139944820403e-01 -1.964432807767602e-01 -4.283393073556980e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.080000000000000e+02 6.798904605329755e-01 -7.052200858268264e-01 -1.964137467443024e-01 -4.283961148898780e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.090000000000000e+02 6.798923168074383e-01 -7.052261781237396e-01 -1.963842063854064e-01 -4.284528816068030e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.100000000000000e+02 6.798941728609138e-01 -7.052322713221690e-01 -1.963546596267274e-01 -4.285096076426350e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.110000000000000e+02 6.798960286978132e-01 -7.052383654171293e-01 -1.963251064663201e-01 -4.285662930873390e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.120000000000000e+02 6.798978842441032e-01 -7.052444604613733e-01 -1.962955469740358e-01 -4.286229376856430e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.130000000000000e+02 6.798997395631307e-01 -7.052505564083331e-01 -1.962659810899465e-01 -4.286795416770520e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.140000000000000e+02 6.799015946610585e-01 -7.052566532548605e-01 -1.962364088033276e-01 -4.287361049732730e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.150000000000000e+02 6.799034494766948e-01 -7.052627510435318e-01 -1.962068301739770e-01 -4.287926274180850e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.160000000000000e+02 6.799053040579373e-01 -7.052688497371346e-01 -1.961772451606945e-01 -4.288491093034770e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.170000000000000e+02 6.799071584244262e-01 -7.052749493234310e-01 -1.961476537385194e-01 -4.289055505502580e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.180000000000000e+02 6.799090124953324e-01 -7.052810498586009e-01 -1.961180559871833e-01 -4.289619509676460e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.190000000000000e+02 6.799108663419909e-01 -7.052871512925548e-01 -1.960884518339890e-01 -4.290183106891620e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.200000000000000e+02 6.799127199705892e-01 -7.052932536182239e-01 -1.960588412771350e-01 -4.290746298584930e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.210000000000000e+02 6.799145733007834e-01 -7.052993568929989e-01 -1.960292243923389e-01 -4.291309081939600e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.220000000000000e+02 6.799164264410558e-01 -7.053054610388255e-01 -1.959996010742728e-01 -4.291871460284140e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.230000000000000e+02 6.799182792742511e-01 -7.053115661404445e-01 -1.959699714317722e-01 -4.292433429053130e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.240000000000000e+02 6.799201318924670e-01 -7.053176721286518e-01 -1.959403353818848e-01 -4.292994992757770e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.250000000000000e+02 6.799219842782368e-01 -7.053237790168198e-01 -1.959106929375021e-01 -4.293556150005920e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.260000000000000e+02 6.799238363838389e-01 -7.053298868396233e-01 -1.958810441415389e-01 -4.294116898626830e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.270000000000000e+02 6.799256882489312e-01 -7.053359955650910e-01 -1.958513889621641e-01 -4.294677241668230e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.280000000000000e+02 6.799275399007848e-01 -7.053421051753849e-01 -1.958217273673531e-01 -4.295237178653950e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.290000000000000e+02 6.799293912523900e-01 -7.053482157312343e-01 -1.957920594425984e-01 -4.295796707415940e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.300000000000000e+02 6.799312423804701e-01 -7.053543271785773e-01 -1.957623851101765e-01 -4.296355829516520e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.310000000000000e+02 6.799330932777483e-01 -7.053604395198165e-01 -1.957327043816172e-01 -4.296914546069910e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.320000000000000e+02 6.799349438895221e-01 -7.053665527947474e-01 -1.957030173063042e-01 -4.297472854615510e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.330000000000000e+02 6.799367942876130e-01 -7.053726669509697e-01 -1.956733238154107e-01 -4.298030757673090e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.340000000000000e+02 6.799386444002338e-01 -7.053787820404068e-01 -1.956436239750128e-01 -4.298588252308550e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.350000000000000e+02 6.799404942750004e-01 -7.053848980264166e-01 -1.956139177432166e-01 -4.299145341204710e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.360000000000000e+02 6.799423439304839e-01 -7.053910148959684e-01 -1.955842050996064e-01 -4.299702024455190e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.370000000000000e+02 6.799441932868407e-01 -7.053971327065053e-01 -1.955544861186160e-01 -4.300258299023900e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.380000000000000e+02 6.799460424220555e-01 -7.054032513999069e-01 -1.955247607284734e-01 -4.300814168384420e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.390000000000000e+02 6.799478913162851e-01 -7.054093709916773e-01 -1.954950289433865e-01 -4.301369630812860e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.400000000000000e+02 6.799497399253909e-01 -7.054154915115455e-01 -1.954652908083617e-01 -4.301924685673470e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.410000000000000e+02 6.799515883048342e-01 -7.054216129194452e-01 -1.954355462688653e-01 -4.302479334583630e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.420000000000000e+02 6.799534364486993e-01 -7.054277352179514e-01 -1.954057953324866e-01 -4.303033578017730e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.430000000000000e+02 6.799552843018397e-01 -7.054338584479759e-01 -1.953760380472673e-01 -4.303587413029110e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.440000000000000e+02 6.799571319212289e-01 -7.054399825667831e-01 -1.953462743608417e-01 -4.304140842226400e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.450000000000000e+02 6.799589793143376e-01 -7.054461075679146e-01 -1.953165042666282e-01 -4.304693866173220e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.460000000000000e+02 6.799608264114252e-01 -7.054522335037593e-01 -1.952867278243909e-01 -4.305246480854950e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.470000000000000e+02 6.799626732958443e-01 -7.054583603087674e-01 -1.952569449652997e-01 -4.305798692057540e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.480000000000000e+02 6.799645198865102e-01 -7.054644880452009e-01 -1.952271557560460e-01 -4.306350494368820e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.490000000000000e+02 6.799663662478446e-01 -7.054706166648559e-01 -1.951973601373549e-01 -4.306901890707300e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.500000000000000e+02 6.799682123672300e-01 -7.054767461736650e-01 -1.951675581265924e-01 -4.307452882197600e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.510000000000000e+02 6.799700582031040e-01 -7.054828766041455e-01 -1.951377497556802e-01 -4.308003465524490e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.520000000000000e+02 6.799719037993398e-01 -7.054890079235407e-01 -1.951079349834540e-01 -4.308553642525750e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.530000000000000e+02 6.799737491623745e-01 -7.054951401249805e-01 -1.950781138069646e-01 -4.309103414418460e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.540000000000000e+02 6.799755942368141e-01 -7.055012732503474e-01 -1.950482862727311e-01 -4.309652777778040e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.550000000000000e+02 6.799774390652883e-01 -7.055074072658489e-01 -1.950184523451998e-01 -4.310201735551260e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.560000000000000e+02 6.799792836711779e-01 -7.055135421545229e-01 -1.949886120003735e-01 -4.310750288265310e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.570000000000000e+02 6.799811279726711e-01 -7.055196779764594e-01 -1.949587653119178e-01 -4.311298432096380e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.580000000000000e+02 6.799829720696676e-01 -7.055258146566715e-01 -1.949289121893675e-01 -4.311846171898520e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.590000000000000e+02 6.799848158555376e-01 -7.055319522715081e-01 -1.948990527338428e-01 -4.312393503978870e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.600000000000000e+02 6.799866594173840e-01 -7.055380907592211e-01 -1.948691868578758e-01 -4.312940430344600e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.610000000000000e+02 6.799885027376091e-01 -7.055442301305632e-01 -1.948393145807669e-01 -4.313486951217600e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.620000000000000e+02 6.799903437330825e-01 -7.055503719134103e-01 -1.948094378296771e-01 -4.314032979820430e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.630000000000000e+02 6.799921885598681e-01 -7.055565115924540e-01 -1.947795509023465e-01 -4.314578771245710e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.640000000000000e+02 6.799940311106697e-01 -7.055626536447086e-01 -1.947496594578396e-01 -4.315124073250150e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.650000000000000e+02 6.799958733666632e-01 -7.055687966182198e-01 -1.947197616570699e-01 -4.315668966962220e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.660000000000000e+02 6.799977153858934e-01 -7.055749404682642e-01 -1.946898574492786e-01 -4.316213455739350e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.670000000000000e+02 6.799995571682322e-01 -7.055810851947246e-01 -1.946599468331228e-01 -4.316757539367460e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.680000000000000e+02 6.800013986536546e-01 -7.055872308428952e-01 -1.946300298594589e-01 -4.317301214224540e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.690000000000000e+02 6.800032398987002e-01 -7.055933773683748e-01 -1.946001064806982e-01 -4.317844484070730e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.700000000000000e+02 6.800050809094393e-01 -7.055995247668866e-01 -1.945701766888613e-01 -4.318387348717150e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.710000000000000e+02 6.800069216160569e-01 -7.056056730897458e-01 -1.945402405465657e-01 -4.318929804830290e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.720000000000000e+02 6.800087719761647e-01 -7.056118150292564e-01 -1.945102888288200e-01 -4.319472266742780e-02 3.720000000000000e-12 3.510000000000000e-12 1.110000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.730000000000000e+02 6.800106285608964e-01 -7.056179531014544e-01 -1.944803247074674e-01 -4.320014591186370e-02 3.720000000000000e-12 3.510000000000000e-12 1.110000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.740000000000000e+02 6.800124685148802e-01 -7.056241040720422e-01 -1.944503693701792e-01 -4.320555830709490e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.530000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.170000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.750000000000000e+02 6.800143082323805e-01 -7.056302559152922e-01 -1.944204076167761e-01 -4.321096664370000e-02 3.700000000000000e-12 3.500000000000000e-12 1.160000000000000e-13 6.510000000000000e-13 3.850000000000000e-12 -1.920000000000000e-12 8.150000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.760000000000000e+02 6.800161476428638e-01 -7.056364086811139e-01 -1.943904395150271e-01 -4.321637089962240e-02 3.700000000000000e-12 3.500000000000000e-12 1.170000000000000e-13 6.500000000000000e-13 3.850000000000000e-12 -1.920000000000000e-12 8.140000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.770000000000000e+02 6.800179868134718e-01 -7.056425623204187e-01 -1.943604650003440e-01 -4.322177109833850e-02 3.700000000000000e-12 3.500000000000000e-12 1.190000000000000e-13 6.490000000000000e-13 3.850000000000000e-12 -1.910000000000000e-12 8.130000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.780000000000000e+02 6.800198257563828e-01 -7.056487168213401e-01 -1.943304840662219e-01 -4.322716725906180e-02 3.700000000000000e-12 3.500000000000000e-12 1.180000000000000e-13 6.490000000000000e-13 3.850000000000000e-12 -1.910000000000000e-12 8.130000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.790000000000000e+02 6.800216643871712e-01 -7.056548722478666e-01 -1.943004967843931e-01 -4.323255933074930e-02 3.700000000000000e-12 3.500000000000000e-12 1.190000000000000e-13 6.480000000000000e-13 3.850000000000000e-12 -1.910000000000000e-12 8.120000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.800000000000000e+02 6.800235027783970e-01 -7.056610285445999e-01 -1.942705030905896e-01 -4.323794735306230e-02 3.700000000000000e-12 3.490000000000000e-12 1.230000000000000e-13 6.450000000000000e-13 3.840000000000000e-12 -1.910000000000000e-12 8.060000000000000e-13 7.880000000000000e-12 -2.380000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.810000000000000e+02 6.800253409346203e-01 -7.056671857083662e-01 -1.942405029782267e-01 -4.324333132348980e-02 3.700000000000000e-12 3.490000000000000e-12 1.240000000000000e-13 6.440000000000000e-13 3.840000000000000e-12 -1.910000000000000e-12 8.050000000000000e-13 7.880000000000000e-12 -2.380000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.820000000000000e+02 6.800271853035798e-01 -7.056733390051212e-01 -1.942104904705938e-01 -4.324871393030960e-02 3.700000000000000e-12 3.490000000000000e-12 1.230000000000000e-13 6.440000000000000e-13 3.840000000000000e-12 -1.900000000000000e-12 8.050000000000000e-13 7.880000000000000e-12 -2.380000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.830000000000000e+02 6.800290337684854e-01 -7.056794899887119e-01 -1.941804675260357e-01 -4.325409428645660e-02 3.700000000000000e-12 3.490000000000000e-12 1.230000000000000e-13 6.440000000000000e-13 3.840000000000000e-12 -1.900000000000000e-12 8.050000000000000e-13 7.880000000000000e-12 -2.380000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.840000000000000e+02 6.800308710951687e-01 -7.056856498393206e-01 -1.941504482732636e-01 -4.325946605880240e-02 3.700000000000000e-12 3.490000000000000e-12 1.240000000000000e-13 6.420000000000000e-13 3.840000000000000e-12 -1.900000000000000e-12 8.040000000000000e-13 7.880000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.850000000000000e+02 6.800327081877929e-01 -7.056918105541162e-01 -1.941204225983502e-01 -4.326483377834180e-02 3.700000000000000e-12 3.490000000000000e-12 1.250000000000000e-13 6.410000000000000e-13 3.840000000000000e-12 -1.900000000000000e-12 8.020000000000000e-13 7.880000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.860000000000000e+02 6.800345450279224e-01 -7.056979721440877e-01 -1.940903905222845e-01 -4.327019744924040e-02 3.700000000000000e-12 3.490000000000000e-12 1.260000000000000e-13 6.400000000000000e-13 3.840000000000000e-12 -1.900000000000000e-12 8.010000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.870000000000000e+02 6.800363815718353e-01 -7.057041346425851e-01 -1.940603520808704e-01 -4.327555704198350e-02 3.700000000000000e-12 3.490000000000000e-12 1.270000000000000e-13 6.390000000000000e-13 3.840000000000000e-12 -1.900000000000000e-12 8.000000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.880000000000000e+02 6.800382178757998e-01 -7.057102980065399e-01 -1.940303072240221e-01 -4.328091258717610e-02 3.700000000000000e-12 3.490000000000000e-12 1.270000000000000e-13 6.390000000000000e-13 3.840000000000000e-12 -1.900000000000000e-12 8.000000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.890000000000000e+02 6.800400539303699e-01 -7.057164622422814e-01 -1.940002559599285e-01 -4.328626408111950e-02 3.700000000000000e-12 3.490000000000000e-12 1.280000000000000e-13 6.380000000000000e-13 3.840000000000000e-12 -1.900000000000000e-12 7.990000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.900000000000000e+02 6.800418896856781e-01 -7.057226273865107e-01 -1.939701983327810e-01 -4.329161149869400e-02 3.700000000000000e-12 3.490000000000000e-12 1.300000000000000e-13 6.370000000000000e-13 3.840000000000000e-12 -1.900000000000000e-12 7.980000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.910000000000000e+02 6.800437251952343e-01 -7.057287933985669e-01 -1.939401342941489e-01 -4.329695486704600e-02 3.700000000000000e-12 3.490000000000000e-12 1.310000000000000e-13 6.360000000000000e-13 3.840000000000000e-12 -1.900000000000000e-12 7.960000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.920000000000000e+02 6.800455640215590e-01 -7.057349576634192e-01 -1.939100605350644e-01 -4.330229566315500e-02 3.700000000000000e-12 3.490000000000000e-12 1.300000000000000e-13 6.360000000000000e-13 3.840000000000000e-12 -1.890000000000000e-12 7.960000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.930000000000000e+02 6.800474048929434e-01 -7.057411211137069e-01 -1.938799782350156e-01 -4.330763335869410e-02 3.700000000000000e-12 3.490000000000000e-12 1.300000000000000e-13 6.360000000000000e-13 3.840000000000000e-12 -1.890000000000000e-12 7.960000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.940000000000000e+02 6.800492396130379e-01 -7.057472897657984e-01 -1.938498950018737e-01 -4.331296454552660e-02 3.700000000000000e-12 3.490000000000000e-12 1.310000000000000e-13 6.340000000000000e-13 3.830000000000000e-12 -1.890000000000000e-12 7.950000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.950000000000000e+02 6.800510740907735e-01 -7.057534592811132e-01 -1.938198053511975e-01 -4.331829168320820e-02 3.700000000000000e-12 3.490000000000000e-12 1.320000000000000e-13 6.330000000000000e-13 3.830000000000000e-12 -1.890000000000000e-12 7.940000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.960000000000000e+02 6.800529082602366e-01 -7.057596297073655e-01 -1.937897093438714e-01 -4.332361474455530e-02 3.700000000000000e-12 3.490000000000000e-12 1.330000000000000e-13 6.320000000000000e-13 3.830000000000000e-12 -1.890000000000000e-12 7.920000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.970000000000000e+02 6.800547422135207e-01 -7.057658009771285e-01 -1.937596068919702e-01 -4.332893376351720e-02 3.700000000000000e-12 3.490000000000000e-12 1.330000000000000e-13 6.320000000000000e-13 3.830000000000000e-12 -1.890000000000000e-12 7.920000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.980000000000000e+02 6.800565758502106e-01 -7.057719731615167e-01 -1.937294980928684e-01 -4.333424871012740e-02 3.700000000000000e-12 3.490000000000000e-12 1.330000000000000e-13 6.320000000000000e-13 3.830000000000000e-12 -1.890000000000000e-12 7.920000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.990000000000000e+02 6.800584092542421e-01 -7.057781461990635e-01 -1.936993828662977e-01 -4.333955961496180e-02 3.700000000000000e-12 3.490000000000000e-12 1.340000000000000e-13 6.310000000000000e-13 3.830000000000000e-12 -1.890000000000000e-12 7.910000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.000000000000000e+02 6.800602423965444e-01 -7.057843201128331e-01 -1.936692612333187e-01 -4.334486645220950e-02 3.700000000000000e-12 3.490000000000000e-12 1.370000000000000e-13 6.290000000000000e-13 3.830000000000000e-12 -1.890000000000000e-12 7.890000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.010000000000000e+02 6.800620752489481e-01 -7.057904949193428e-01 -1.936391332278207e-01 -4.335016923129100e-02 3.700000000000000e-12 3.490000000000000e-12 1.360000000000000e-13 6.290000000000000e-13 3.830000000000000e-12 -1.890000000000000e-12 7.890000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.020000000000000e+02 6.800644394734375e-01 -7.057960240025316e-01 -1.936093530548097e-01 -4.335607311087000e-02 3.700000000000000e-12 3.490000000000000e-12 1.370000000000000e-13 6.280000000000001e-13 3.830000000000000e-12 -1.880000000000000e-12 7.870000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.030000000000000e+02 6.800662099626688e-01 -7.058022743575298e-01 -1.935791808418024e-01 -4.336127677278720e-02 3.700000000000000e-12 3.490000000000000e-12 1.370000000000000e-13 6.280000000000001e-13 3.830000000000000e-12 -1.880000000000000e-12 7.870000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.040000000000000e+02 6.800679823561149e-01 -7.058085232968602e-01 -1.935490019777740e-01 -4.336648070798970e-02 3.700000000000000e-12 3.490000000000000e-12 1.370000000000000e-13 6.280000000000001e-13 3.830000000000000e-12 -1.880000000000000e-12 7.870000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.050000000000000e+02 6.800697572740785e-01 -7.058147706185546e-01 -1.935188149694217e-01 -4.337168512617530e-02 3.700000000000000e-12 3.490000000000000e-12 1.390000000000000e-13 6.250000000000000e-13 3.830000000000000e-12 -1.880000000000000e-12 7.850000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.060000000000000e+02 6.800715348115959e-01 -7.058210162409955e-01 -1.934886196787965e-01 -4.337689046396430e-02 3.700000000000000e-12 3.490000000000000e-12 1.390000000000000e-13 6.250000000000000e-13 3.830000000000000e-12 -1.880000000000000e-12 7.850000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.070000000000000e+02 6.800733146676580e-01 -7.058272601562531e-01 -1.934584170540734e-01 -4.338209732359600e-02 3.700000000000000e-12 3.490000000000000e-12 1.400000000000000e-13 6.240000000000000e-13 3.830000000000000e-12 -1.880000000000000e-12 7.840000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.080000000000000e+02 6.800750963970092e-01 -7.058335023457607e-01 -1.934282085873377e-01 -4.338730631888740e-02 3.700000000000000e-12 3.490000000000000e-12 1.400000000000000e-13 6.240000000000000e-13 3.830000000000000e-12 -1.880000000000000e-12 7.830000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.090000000000000e+02 6.800768796934054e-01 -7.058397426907372e-01 -1.933979956928406e-01 -4.339251786595870e-02 3.700000000000000e-12 3.490000000000000e-12 1.400000000000000e-13 6.240000000000000e-13 3.830000000000000e-12 -1.880000000000000e-12 7.830000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.100000000000000e+02 6.800786646053507e-01 -7.058459809165807e-01 -1.933677791939897e-01 -4.339773199255140e-02 3.700000000000000e-12 3.490000000000000e-12 1.420000000000000e-13 6.220000000000000e-13 3.830000000000000e-12 -1.880000000000000e-12 7.810000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.110000000000000e+02 6.800804515977056e-01 -7.058522166070010e-01 -1.933375590727444e-01 -4.340294825743240e-02 3.700000000000000e-12 3.490000000000000e-12 1.420000000000000e-13 6.220000000000000e-13 3.830000000000000e-12 -1.880000000000000e-12 7.810000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.120000000000000e+02 6.800822588065927e-01 -7.058584365326280e-01 -1.933073183873061e-01 -4.340817308002680e-02 3.700000000000000e-12 3.490000000000000e-12 1.430000000000000e-13 6.210000000000000e-13 3.820000000000000e-12 -1.880000000000000e-12 7.800000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.130000000000000e+02 6.800840522858849e-01 -7.058646658638073e-01 -1.932770881414288e-01 -4.341339091750420e-02 3.700000000000000e-12 3.490000000000000e-12 1.430000000000000e-13 6.210000000000000e-13 3.820000000000000e-12 -1.880000000000000e-12 7.800000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.140000000000000e+02 6.800858499148742e-01 -7.058708917723857e-01 -1.932468508586869e-01 -4.341860807557950e-02 3.700000000000000e-12 3.490000000000000e-12 1.430000000000000e-13 6.210000000000000e-13 3.820000000000000e-12 -1.880000000000000e-12 7.800000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.150000000000000e+02 6.800876516570992e-01 -7.058771146110748e-01 -1.932166055230281e-01 -4.342382389926380e-02 3.700000000000000e-12 3.490000000000000e-12 1.440000000000000e-13 6.200000000000000e-13 3.820000000000000e-12 -1.870000000000000e-12 7.780000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.160000000000000e+02 6.800894568475073e-01 -7.058833351635689e-01 -1.931863516630958e-01 -4.342903814640470e-02 3.700000000000000e-12 3.490000000000000e-12 1.450000000000000e-13 6.190000000000000e-13 3.820000000000000e-12 -1.870000000000000e-12 7.770000000000000e-13 7.890000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.170000000000000e+02 6.800912643221110e-01 -7.058895545116237e-01 -1.931560893868945e-01 -4.343425096506160e-02 3.700000000000000e-12 3.490000000000000e-12 1.450000000000000e-13 6.190000000000000e-13 3.820000000000000e-12 -1.870000000000000e-12 7.770000000000000e-13 7.890000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.180000000000000e+02 6.800930727187896e-01 -7.058957737833765e-01 -1.931258192714218e-01 -4.343946276631000e-02 3.700000000000000e-12 3.490000000000000e-12 1.450000000000000e-13 6.190000000000000e-13 3.820000000000000e-12 -1.870000000000000e-12 7.770000000000000e-13 7.890000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.190000000000000e+02 6.800948808447127e-01 -7.059019938571479e-01 -1.930955421893178e-01 -4.344467405715620e-02 3.700000000000000e-12 3.480000000000000e-12 1.460000000000000e-13 6.180000000000000e-13 3.820000000000000e-12 -1.870000000000000e-12 7.760000000000000e-13 7.890000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.200000000000000e+02 6.800966879858228e-01 -7.059082151169886e-01 -1.930652591494158e-01 -4.344988527753310e-02 3.700000000000000e-12 3.480000000000000e-12 1.470000000000000e-13 6.160000000000000e-13 3.820000000000000e-12 -1.870000000000000e-12 7.750000000000000e-13 7.890000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.210000000000000e+02 6.800984940569759e-01 -7.059144373489267e-01 -1.930349711758078e-01 -4.345509667388730e-02 3.700000000000000e-12 3.480000000000000e-12 1.470000000000000e-13 6.160000000000000e-13 3.820000000000000e-12 -1.870000000000000e-12 7.740000000000000e-13 7.890000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.220000000000000e+02 6.801003020370210e-01 -7.059206579863587e-01 -1.930046769274401e-01 -4.346030926481870e-02 3.700000000000000e-12 3.480000000000000e-12 1.480000000000000e-13 6.150000000000000e-13 3.820000000000000e-12 -1.870000000000000e-12 7.730000000000000e-13 7.890000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.230000000000000e+02 6.801021078577804e-01 -7.059268796031856e-01 -1.929743818578749e-01 -4.346552067656540e-02 3.700000000000000e-12 3.480000000000000e-12 1.480000000000000e-13 6.150000000000000e-13 3.820000000000000e-12 -1.870000000000000e-12 7.730000000000000e-13 7.890000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.240000000000000e+02 6.801039149963756e-01 -7.059330992606205e-01 -1.929440843497088e-01 -4.347073141034490e-02 3.700000000000000e-12 3.480000000000000e-12 1.480000000000000e-13 6.150000000000000e-13 3.820000000000000e-12 -1.870000000000000e-12 7.730000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.250000000000000e+02 6.801057243103703e-01 -7.059393160402793e-01 -1.929137848951576e-01 -4.347594077503440e-02 3.700000000000000e-12 3.480000000000000e-12 1.500000000000000e-13 6.130000000000000e-13 3.820000000000000e-12 -1.870000000000000e-12 7.710000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.260000000000000e+02 6.801075363507137e-01 -7.059455293769104e-01 -1.928834837823045e-01 -4.348114804967640e-02 3.700000000000000e-12 3.480000000000000e-12 1.510000000000000e-13 6.120000000000000e-13 3.820000000000000e-12 -1.860000000000000e-12 7.700000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.270000000000000e+02 6.801093513191596e-01 -7.059517390925577e-01 -1.928531810928108e-01 -4.348635260410910e-02 3.700000000000000e-12 3.480000000000000e-12 1.510000000000000e-13 6.120000000000000e-13 3.820000000000000e-12 -1.860000000000000e-12 7.700000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.280000000000000e+02 6.801111691377855e-01 -7.059579453254369e-01 -1.928228767002737e-01 -4.349155397262000e-02 3.700000000000000e-12 3.480000000000000e-12 1.520000000000000e-13 6.110000000000000e-13 3.820000000000000e-12 -1.860000000000000e-12 7.680000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.290000000000000e+02 6.801129895795008e-01 -7.059641484040237e-01 -1.927925702686442e-01 -4.349675186292970e-02 3.700000000000000e-12 3.480000000000000e-12 1.520000000000000e-13 6.110000000000000e-13 3.820000000000000e-12 -1.860000000000000e-12 7.680000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.300000000000000e+02 6.801148124070654e-01 -7.059703487146184e-01 -1.927622612561160e-01 -4.350194611383860e-02 3.700000000000000e-12 3.480000000000000e-12 1.530000000000000e-13 6.100000000000000e-13 3.820000000000000e-12 -1.860000000000000e-12 7.670000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.310000000000000e+02 6.801166374723390e-01 -7.059765465972978e-01 -1.927319489590141e-01 -4.350713663679110e-02 3.700000000000000e-12 3.480000000000000e-12 1.530000000000000e-13 6.100000000000000e-13 3.820000000000000e-12 -1.860000000000000e-12 7.670000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.320000000000000e+02 6.801184993492909e-01 -7.059827168493201e-01 -1.927016004199913e-01 -4.351233788818200e-02 3.700000000000000e-12 3.480000000000000e-12 1.540000000000000e-13 6.080000000000000e-13 3.810000000000000e-12 -1.860000000000000e-12 7.660000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.330000000000000e+02 6.801203289352233e-01 -7.059889104477063e-01 -1.926712793077983e-01 -4.351752088297940e-02 3.700000000000000e-12 3.480000000000000e-12 1.540000000000000e-13 6.090000000000000e-13 3.810000000000000e-12 -1.860000000000000e-12 7.650000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.340000000000000e+02 6.801221609731459e-01 -7.059951019419735e-01 -1.926409529417248e-01 -4.352270024785650e-02 3.700000000000000e-12 3.480000000000000e-12 1.540000000000000e-13 6.090000000000000e-13 3.810000000000000e-12 -1.860000000000000e-12 7.650000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.350000000000000e+02 6.801239956176084e-01 -7.060012912206600e-01 -1.926106211194158e-01 -4.352787626215090e-02 3.700000000000000e-12 3.480000000000000e-12 1.550000000000000e-13 6.070000000000000e-13 3.810000000000000e-12 -1.860000000000000e-12 7.640000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.360000000000000e+02 6.801258329907574e-01 -7.060074781139022e-01 -1.925802839342549e-01 -4.353304934964170e-02 3.700000000000000e-12 3.480000000000000e-12 1.550000000000000e-13 6.070000000000000e-13 3.810000000000000e-12 -1.860000000000000e-12 7.640000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.370000000000000e+02 6.801276731500231e-01 -7.060136624505002e-01 -1.925499416972246e-01 -4.353822000451810e-02 3.700000000000000e-12 3.480000000000000e-12 1.560000000000000e-13 6.060000000000000e-13 3.810000000000000e-12 -1.860000000000000e-12 7.630000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.380000000000000e+02 6.801295160474115e-01 -7.060198441369843e-01 -1.925195948200177e-01 -4.354338866278710e-02 3.700000000000000e-12 3.480000000000000e-12 1.560000000000000e-13 6.060000000000000e-13 3.810000000000000e-12 -1.860000000000000e-12 7.630000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.390000000000000e+02 6.801313614774970e-01 -7.060260232454797e-01 -1.924892437082617e-01 -4.354855556228500e-02 3.700000000000000e-12 3.480000000000000e-12 1.550000000000000e-13 6.060000000000000e-13 3.810000000000000e-12 -1.860000000000000e-12 7.630000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.400000000000000e+02 6.801332090266611e-01 -7.060322000869281e-01 -1.924588886956475e-01 -4.355372063951040e-02 3.700000000000000e-12 3.480000000000000e-12 1.570000000000000e-13 6.050000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.610000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.410000000000000e+02 6.801350580620289e-01 -7.060383752329706e-01 -1.924285300092317e-01 -4.355888350077100e-02 3.700000000000000e-12 3.480000000000000e-12 1.560000000000000e-13 6.050000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.610000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.420000000000000e+02 6.801369151651825e-01 -7.060445440378701e-01 -1.923981608769439e-01 -4.356404658792890e-02 3.700000000000000e-12 3.480000000000000e-12 1.570000000000000e-13 6.050000000000000e-13 3.810000000000000e-12 -1.860000000000000e-12 7.630000000000000e-13 7.910000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.430000000000000e+02 6.801387647563755e-01 -7.060507182148600e-01 -1.923677949636090e-01 -4.356920293958800e-02 3.700000000000000e-12 3.480000000000000e-12 1.570000000000000e-13 6.050000000000000e-13 3.810000000000000e-12 -1.860000000000000e-12 7.630000000000000e-13 7.910000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.440000000000000e+02 6.801406135260747e-01 -7.060568931226953e-01 -1.923374251072434e-01 -4.357435495124470e-02 3.700000000000000e-12 3.480000000000000e-12 1.560000000000000e-13 6.050000000000000e-13 3.810000000000000e-12 -1.860000000000000e-12 7.630000000000000e-13 7.910000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.450000000000000e+02 6.801424610737332e-01 -7.060630693323596e-01 -1.923070507392924e-01 -4.357950212529070e-02 3.700000000000000e-12 3.480000000000000e-12 1.580000000000000e-13 6.040000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.620000000000000e-13 7.910000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.460000000000000e+02 6.801443073457261e-01 -7.060692471347370e-01 -1.922766710300751e-01 -4.358464423831640e-02 3.700000000000000e-12 3.480000000000000e-12 1.570000000000000e-13 6.040000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.620000000000000e-13 7.910000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.470000000000000e+02 6.801461525871760e-01 -7.060754265624326e-01 -1.922462849855272e-01 -4.358978131172920e-02 3.700000000000000e-12 3.480000000000000e-12 1.580000000000000e-13 6.030000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.610000000000000e-13 7.910000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.480000000000000e+02 6.801479972114610e-01 -7.060816074762175e-01 -1.922158916139338e-01 -4.359491351177890e-02 3.700000000000000e-12 3.480000000000000e-12 1.580000000000000e-13 6.030000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.600000000000000e-13 7.910000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.490000000000000e+02 6.801498416365545e-01 -7.060877896807292e-01 -1.921854901090596e-01 -4.360004102168940e-02 3.700000000000000e-12 3.480000000000000e-12 1.580000000000000e-13 6.030000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.600000000000000e-13 7.910000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.500000000000000e+02 6.801516861526294e-01 -7.060939730226484e-01 -1.921550799812269e-01 -4.360516394000830e-02 3.700000000000000e-12 3.480000000000000e-12 1.580000000000000e-13 6.030000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.600000000000000e-13 7.920000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.510000000000000e+02 6.801535308504425e-01 -7.061001574578133e-01 -1.921246610761919e-01 -4.361028222892130e-02 3.700000000000000e-12 3.480000000000000e-12 1.580000000000000e-13 6.030000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.600000000000000e-13 7.920000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.520000000000000e+02 6.801554001039072e-01 -7.061063250660442e-01 -1.920942106598000e-01 -4.361540601906740e-02 3.700000000000000e-12 3.480000000000000e-12 1.590000000000000e-13 6.020000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.590000000000000e-13 7.920000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.530000000000000e+02 6.801572446539955e-01 -7.061125121322184e-01 -1.920637744903463e-01 -4.362051448039410e-02 3.700000000000000e-12 3.480000000000000e-12 1.590000000000000e-13 6.020000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.590000000000000e-13 7.920000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.540000000000000e+02 6.801590885724863e-01 -7.061187010483723e-01 -1.920333297755846e-01 -4.362561767248610e-02 3.700000000000000e-12 3.480000000000000e-12 1.590000000000000e-13 6.020000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.590000000000000e-13 7.920000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.550000000000000e+02 6.801609313471219e-01 -7.061248923784263e-01 -1.920028762938195e-01 -4.363071541324870e-02 3.700000000000000e-12 3.480000000000000e-12 1.630000000000000e-13 6.040000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.570000000000000e-13 7.930000000000000e-12 -2.400000000000000e-12 7.740000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>3.560000000000000e+02 6.801627724101943e-01 -7.061310868066147e-01 -1.919724135575382e-01 -4.363580760661090e-02 3.700000000000000e-12 3.480000000000000e-12 1.630000000000000e-13 6.040000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.570000000000000e-13 7.930000000000000e-12 -2.400000000000000e-12 7.740000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>3.570000000000000e+02 6.801646112014484e-01 -7.061372850557405e-01 -1.919419408921662e-01 -4.364089423738440e-02 3.700000000000000e-12 3.480000000000000e-12 1.640000000000000e-13 6.030000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.550000000000000e-13 7.930000000000000e-12 -2.400000000000000e-12 7.740000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>3.580000000000000e+02 6.801664472598314e-01 -7.061434877568908e-01 -1.919114575967263e-01 -4.364597534221030e-02 3.700000000000000e-12 3.480000000000000e-12 1.640000000000000e-13 6.030000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.550000000000000e-13 7.930000000000000e-12 -2.400000000000000e-12 7.740000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>3.590000000000000e+02 6.801682803280756e-01 -7.061496952973384e-01 -1.918809631407742e-01 -4.365105097467090e-02 3.700000000000000e-12 3.480000000000000e-12 1.640000000000000e-13 6.030000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.550000000000000e-13 7.930000000000000e-12 -2.400000000000000e-12 7.740000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>3.600000000000000e+02 6.801701104290790e-01 -7.061559077022543e-01 -1.918504573352982e-01 -4.365612117832780e-02 3.700000000000000e-12 3.480000000000000e-12 1.640000000000000e-13 6.030000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.550000000000000e-13 7.930000000000000e-12 -2.400000000000000e-12 7.740000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>3.610000000000000e+02 6.801719378710744e-01 -7.061621246060932e-01 -1.918199404230304e-01 -4.366118597359400e-02 3.700000000000000e-12 3.480000000000000e-12 1.640000000000000e-13 6.030000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.550000000000000e-13 7.930000000000000e-12 -2.400000000000000e-12 7.740000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>3.620000000000000e+02 6.801737691071448e-01 -7.061683409708717e-01 -1.917894074939692e-01 -4.366624785963960e-02 3.710000000000000e-12 3.490000000000000e-12 1.650000000000000e-13 5.980000000000000e-13 3.820000000000000e-12 -1.850000000000000e-12 7.510000000000000e-13 7.930000000000000e-12 -2.400000000000000e-12 7.750000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>3.630000000000000e+02 6.801755927532240e-01 -7.061745648166142e-01 -1.917588705339414e-01 -4.367130179434690e-02 3.710000000000000e-12 3.490000000000000e-12 1.650000000000000e-13 5.980000000000000e-13 3.820000000000000e-12 -1.850000000000000e-12 7.500000000000000e-13 7.930000000000000e-12 -2.400000000000000e-12 7.750000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>3.640000000000000e+02 6.801774151031481e-01 -7.061807911800915e-01 -1.917283249311070e-01 -4.367635024783870e-02 3.710000000000000e-12 3.490000000000000e-12 1.650000000000000e-13 5.980000000000000e-13 3.820000000000000e-12 -1.850000000000000e-12 7.500000000000000e-13 7.930000000000000e-12 -2.400000000000000e-12 7.750000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>3.650000000000000e+02 6.801792361594092e-01 -7.061870198433671e-01 -1.916977714849323e-01 -4.368139317898700e-02 3.710000000000000e-12 3.490000000000000e-12 1.640000000000000e-13 5.990000000000000e-13 3.820000000000000e-12 -1.850000000000000e-12 7.540000000000000e-13 7.940000000000000e-12 -2.420000000000000e-12 7.759999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>3.660000000000000e+02 6.801810555277493e-01 -7.061932510359407e-01 -1.916672107545939e-01 -4.368643054771070e-02 3.710000000000000e-12 3.490000000000000e-12 1.640000000000000e-13 5.990000000000000e-13 3.820000000000000e-12 -1.850000000000000e-12 7.530000000000000e-13 7.940000000000000e-12 -2.420000000000000e-12 7.759999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>3.670000000000000e+02 6.801828724913421e-01 -7.061994853641913e-01 -1.916366430558360e-01 -4.369146231322840e-02 3.710000000000000e-12 3.490000000000000e-12 1.650000000000000e-13 5.980000000000000e-13 3.820000000000000e-12 -1.850000000000000e-12 7.520000000000000e-13 7.940000000000000e-12 -2.420000000000000e-12 7.759999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>3.680000000000000e+02 6.801846862046709e-01 -7.062057236062526e-01 -1.916060685283139e-01 -4.369648843495330e-02 3.710000000000000e-12 3.490000000000000e-12 1.650000000000000e-13 5.980000000000000e-13 3.820000000000000e-12 -1.850000000000000e-12 7.520000000000000e-13 7.940000000000000e-12 -2.420000000000000e-12 7.759999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>3.690000000000000e+02 6.801864959373461e-01 -7.062119664532197e-01 -1.915754872232734e-01 -4.370150887459910e-02 3.710000000000000e-12 3.490000000000000e-12 1.650000000000000e-13 5.980000000000000e-13 3.820000000000000e-12 -1.850000000000000e-12 7.520000000000000e-13 7.940000000000000e-12 -2.420000000000000e-12 7.759999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>3.700000000000000e+02 6.801883012909300e-01 -7.062182142840798e-01 -1.915448991616742e-01 -4.370652360356150e-02 3.710000000000000e-12 3.490000000000000e-12 1.660000000000000e-13 5.970000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.510000000000000e-13 7.950000000000001e-12 -2.420000000000000e-12 7.759999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>3.710000000000000e+02 6.801901023146560e-01 -7.062244670488351e-01 -1.915143043496762e-01 -4.371153262270760e-02 3.710000000000000e-12 3.490000000000000e-12 1.660000000000000e-13 5.970000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.510000000000000e-13 7.950000000000001e-12 -2.420000000000000e-12 7.759999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>3.720000000000000e+02 6.801919285068792e-01 -7.062307029180814e-01 -1.914836757033568e-01 -4.371654822898150e-02 3.710000000000000e-12 3.490000000000000e-12 1.660000000000000e-13 5.970000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.500000000000000e-13 7.950000000000001e-12 -2.420000000000000e-12 7.759999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>3.730000000000000e+02 6.801937226254594e-01 -7.062369638605401e-01 -1.914530673190127e-01 -4.372154608550890e-02 3.710000000000000e-12 3.490000000000000e-12 1.660000000000000e-13 5.970000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.500000000000000e-13 7.950000000000001e-12 -2.420000000000000e-12 7.759999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>3.740000000000000e+02 6.801955146018881e-01 -7.062432276131284e-01 -1.914224521275256e-01 -4.372653870990670e-02 3.710000000000000e-12 3.490000000000000e-12 1.650000000000000e-13 5.970000000000000e-13 3.810000000000000e-12 -1.840000000000000e-12 7.500000000000000e-13 7.950000000000001e-12 -2.420000000000000e-12 7.759999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>3.750000000000000e+02 6.801973053107719e-01 -7.062494932801145e-01 -1.913918302260797e-01 -4.373152652557850e-02 3.710000000000000e-12 3.490000000000000e-12 1.690000000000000e-13 6.000000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.520000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.760000000000000e+02 6.801990954756447e-01 -7.062557600607223e-01 -1.913612018674053e-01 -4.373651009200950e-02 3.710000000000000e-12 3.490000000000000e-12 1.690000000000000e-13 6.000000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.520000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.770000000000000e+02 6.802008856196530e-01 -7.062620273028956e-01 -1.913305674546980e-01 -4.374149002614150e-02 3.710000000000000e-12 3.490000000000000e-12 1.690000000000000e-13 6.000000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.510000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.780000000000000e+02 6.802026760627290e-01 -7.062682945362354e-01 -1.912999274617662e-01 -4.374646686422570e-02 3.720000000000000e-12 3.500000000000000e-12 1.710000000000000e-13 5.960000000000000e-13 3.820000000000000e-12 -1.850000000000000e-12 7.470000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.790000000000000e+02 6.802044669429620e-01 -7.062745614976668e-01 -1.912692822987938e-01 -4.375144090226060e-02 3.720000000000000e-12 3.500000000000000e-12 1.710000000000000e-13 5.960000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.470000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.800000000000000e+02 6.802062582397056e-01 -7.062808281513652e-01 -1.912386321853256e-01 -4.375641207007920e-02 3.720000000000000e-12 3.500000000000000e-12 1.710000000000000e-13 5.960000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.470000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.810000000000000e+02 6.802080497998825e-01 -7.062870946838381e-01 -1.912079770820723e-01 -4.376137989923880e-02 3.720000000000000e-12 3.500000000000000e-12 1.710000000000000e-13 5.960000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.470000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.820000000000000e+02 6.802098402435032e-01 -7.062933622898558e-01 -1.911773177679569e-01 -4.376634314456770e-02 3.720000000000000e-12 3.500000000000000e-12 1.720000000000000e-13 5.950000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.450000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.830000000000000e+02 6.802116314901038e-01 -7.062996297857557e-01 -1.911466517663737e-01 -4.377130188354560e-02 3.720000000000000e-12 3.500000000000000e-12 1.710000000000000e-13 5.950000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.450000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.840000000000000e+02 6.802134220469110e-01 -7.063058984866772e-01 -1.911159798039798e-01 -4.377625490746310e-02 3.720000000000000e-12 3.500000000000000e-12 1.710000000000000e-13 5.950000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.450000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.850000000000000e+02 6.802152115236040e-01 -7.063121688228459e-01 -1.910853017684443e-01 -4.378120181914800e-02 3.720000000000000e-12 3.500000000000000e-12 1.710000000000000e-13 5.950000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.450000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.860000000000000e+02 6.802169995375121e-01 -7.063184411126199e-01 -1.910546178355632e-01 -4.378614264958230e-02 3.720000000000000e-12 3.500000000000000e-12 1.710000000000000e-13 5.950000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.450000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.870000000000000e+02 6.802187857635544e-01 -7.063247155260187e-01 -1.910239284347045e-01 -4.379107782205750e-02 3.720000000000000e-12 3.500000000000000e-12 1.710000000000000e-13 5.950000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.450000000000000e-13 7.980000000000000e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.880000000000000e+02 6.802205700179722e-01 -7.063309920503870e-01 -1.909932341104011e-01 -4.379600800975710e-02 3.720000000000000e-12 3.500000000000000e-12 1.710000000000000e-13 5.950000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.450000000000000e-13 7.980000000000000e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.890000000000000e+02 6.802223523626676e-01 -7.063372704514413e-01 -1.909625353388405e-01 -4.380093394402210e-02 3.720000000000000e-12 3.500000000000000e-12 1.710000000000000e-13 5.950000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.450000000000000e-13 7.980000000000000e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.900000000000000e+02 6.802241331925430e-01 -7.063435502433074e-01 -1.909318323677224e-01 -4.380585623906630e-02 3.720000000000000e-12 3.500000000000000e-12 1.730000000000000e-13 5.990000000000000e-13 3.820000000000000e-12 -1.850000000000000e-12 7.470000000000000e-13 8.000000000000000e-12 -2.420000000000000e-12 7.800000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.910000000000000e+02 6.802259132479141e-01 -7.063498307049770e-01 -1.909011251377613e-01 -4.381077527536250e-02 3.720000000000000e-12 3.500000000000000e-12 1.730000000000000e-13 5.990000000000000e-13 3.820000000000000e-12 -1.850000000000000e-12 7.470000000000000e-13 8.000000000000000e-12 -2.420000000000000e-12 7.800000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.920000000000000e+02 6.802277300521115e-01 -7.063560840505319e-01 -1.908703791748643e-01 -4.381570661980990e-02 3.720000000000000e-12 3.500000000000000e-12 1.740000000000000e-13 5.980000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.460000000000000e-13 8.000000000000000e-12 -2.420000000000000e-12 7.810000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.930000000000000e+02 6.802295115937508e-01 -7.063623632619583e-01 -1.908396621669644e-01 -4.382061920954230e-02 3.720000000000000e-12 3.500000000000000e-12 1.740000000000000e-13 5.980000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.460000000000000e-13 8.000000000000000e-12 -2.420000000000000e-12 7.810000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.940000000000000e+02 6.802312952915669e-01 -7.063686407597149e-01 -1.908089393521965e-01 -4.382552818300820e-02 3.720000000000000e-12 3.500000000000000e-12 1.740000000000000e-13 5.980000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.450000000000000e-13 8.000000000000000e-12 -2.420000000000000e-12 7.800000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.950000000000000e+02 6.802330816816051e-01 -7.063749162250748e-01 -1.907782100979862e-01 -4.383043310046160e-02 3.720000000000000e-12 3.500000000000000e-12 1.740000000000000e-13 5.980000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.450000000000000e-13 8.000000000000000e-12 -2.420000000000000e-12 7.800000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.960000000000000e+02 6.802348708755319e-01 -7.063811897329385e-01 -1.907474738372137e-01 -4.383533347823560e-02 3.720000000000000e-12 3.500000000000000e-12 1.740000000000000e-13 5.980000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.450000000000000e-13 8.000000000000000e-12 -2.420000000000000e-12 7.800000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.970000000000000e+02 6.802366626172719e-01 -7.063874616847539e-01 -1.907167300998881e-01 -4.384022885310550e-02 3.730000000000000e-12 3.510000000000000e-12 1.740000000000000e-13 5.950000000000000e-13 3.830000000000000e-12 -1.840000000000000e-12 7.420000000000000e-13 8.000000000000000e-12 -2.420000000000000e-12 7.810000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.980000000000000e+02 6.802384564385460e-01 -7.063937326485615e-01 -1.906859785353562e-01 -4.384511884977200e-02 3.730000000000000e-12 3.510000000000000e-12 1.740000000000000e-13 5.950000000000000e-13 3.830000000000000e-12 -1.840000000000000e-12 7.420000000000000e-13 8.000000000000000e-12 -2.420000000000000e-12 7.810000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.990000000000000e+02 6.802402518470395e-01 -7.064000031677929e-01 -1.906552189334111e-01 -4.385000325053290e-02 3.730000000000000e-12 3.510000000000000e-12 1.740000000000000e-13 5.950000000000000e-13 3.830000000000000e-12 -1.840000000000000e-12 7.420000000000000e-13 8.000000000000000e-12 -2.420000000000000e-12 7.810000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.000000000000000e+02 6.802420484814161e-01 -7.064062736029311e-01 -1.906244512462664e-01 -4.385488204621590e-02 3.730000000000000e-12 3.510000000000000e-12 1.730000000000000e-13 5.960000000000000e-13 3.830000000000000e-12 -1.850000000000000e-12 7.450000000000000e-13 8.020000000000000e-12 -2.430000000000000e-12 7.820000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.010000000000000e+02 6.802438461925319e-01 -7.064125440497465e-01 -1.905936755979732e-01 -4.385975545315480e-02 3.730000000000000e-12 3.510000000000000e-12 1.730000000000000e-13 5.960000000000000e-13 3.830000000000000e-12 -1.850000000000000e-12 7.450000000000000e-13 8.020000000000000e-12 -2.430000000000000e-12 7.820000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.020000000000000e+02 6.802456458038937e-01 -7.064188137855374e-01 -1.905628915571316e-01 -4.386462419835680e-02 3.730000000000000e-12 3.510000000000000e-12 1.730000000000000e-13 5.960000000000000e-13 3.830000000000000e-12 -1.850000000000000e-12 7.450000000000000e-13 8.020000000000000e-12 -2.430000000000000e-12 7.820000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.030000000000000e+02 6.802474460071875e-01 -7.064250835867260e-01 -1.905321009419303e-01 -4.386948815338650e-02 3.730000000000000e-12 3.510000000000000e-12 1.730000000000000e-13 5.960000000000000e-13 3.830000000000000e-12 -1.840000000000000e-12 7.440000000000000e-13 8.020000000000000e-12 -2.430000000000000e-12 7.820000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.040000000000000e+02 6.802492478494531e-01 -7.064313524611116e-01 -1.905013034914019e-01 -4.387434818085840e-02 3.730000000000000e-12 3.510000000000000e-12 1.730000000000000e-13 5.960000000000000e-13 3.830000000000000e-12 -1.840000000000000e-12 7.440000000000000e-13 8.020000000000000e-12 -2.430000000000000e-12 7.820000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.050000000000000e+02 6.802510516157936e-01 -7.064376199848340e-01 -1.904704996464725e-01 -4.387920475798640e-02 3.740000000000000e-12 3.510000000000000e-12 1.760000000000000e-13 5.990000000000000e-13 3.830000000000000e-12 -1.850000000000000e-12 7.430000000000000e-13 8.030000000000000e-12 -2.420000000000000e-12 7.830000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.060000000000000e+02 6.802528575401868e-01 -7.064438858073744e-01 -1.904396897833301e-01 -4.388405825600820e-02 3.740000000000000e-12 3.510000000000000e-12 1.760000000000000e-13 5.990000000000000e-13 3.830000000000000e-12 -1.850000000000000e-12 7.430000000000000e-13 8.030000000000000e-12 -2.420000000000000e-12 7.830000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.070000000000000e+02 6.802546657741058e-01 -7.064501496950181e-01 -1.904088741663710e-01 -4.388890893086110e-02 3.750000000000000e-12 3.520000000000000e-12 1.760000000000000e-13 5.960000000000000e-13 3.840000000000000e-12 -1.840000000000000e-12 7.400000000000000e-13 8.030000000000000e-12 -2.420000000000000e-12 7.830000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.080000000000000e+02 6.802564763724911e-01 -7.064564115528399e-01 -1.903780529140825e-01 -4.389375693432620e-02 3.750000000000000e-12 3.520000000000000e-12 1.760000000000000e-13 5.960000000000000e-13 3.840000000000000e-12 -1.840000000000000e-12 7.400000000000000e-13 8.030000000000000e-12 -2.420000000000000e-12 7.830000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.090000000000000e+02 6.802582892833321e-01 -7.064626714398087e-01 -1.903472259760865e-01 -4.389860233141870e-02 3.750000000000000e-12 3.520000000000000e-12 1.760000000000000e-13 5.960000000000000e-13 3.840000000000000e-12 -1.840000000000000e-12 7.400000000000000e-13 8.030000000000000e-12 -2.420000000000000e-12 7.830000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.100000000000000e+02 6.802601043407317e-01 -7.064689295760400e-01 -1.903163931272641e-01 -4.390344511595710e-02 3.750000000000000e-12 3.520000000000000e-12 1.750000000000000e-13 5.970000000000000e-13 3.840000000000000e-12 -1.850000000000000e-12 7.430000000000000e-13 8.040000000000000e-12 -2.430000000000000e-12 7.840000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>4.110000000000000e+02 6.802619212649104e-01 -7.064751863358286e-01 -1.902855539902404e-01 -4.390828522450710e-02 3.750000000000000e-12 3.520000000000000e-12 1.750000000000000e-13 5.970000000000000e-13 3.840000000000000e-12 -1.850000000000000e-12 7.430000000000000e-13 8.040000000000000e-12 -2.430000000000000e-12 7.840000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>4.120000000000000e+02 6.802637721074779e-01 -7.064814183017823e-01 -1.902546777612606e-01 -4.391313633033190e-02 3.750000000000000e-12 3.520000000000000e-12 1.750000000000000e-13 5.970000000000000e-13 3.840000000000000e-12 -1.850000000000000e-12 7.430000000000000e-13 8.040000000000000e-12 -2.430000000000000e-12 7.840000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>4.130000000000000e+02 6.802655915507858e-01 -7.064876738714381e-01 -1.902238246395407e-01 -4.391797080113560e-02 3.750000000000000e-12 3.520000000000000e-12 1.750000000000000e-13 5.970000000000000e-13 3.840000000000000e-12 -1.850000000000000e-12 7.430000000000000e-13 8.040000000000000e-12 -2.430000000000000e-12 7.840000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>4.140000000000000e+02 6.802674115316771e-01 -7.064939296988663e-01 -1.901929639553983e-01 -4.392280237536900e-02 3.750000000000000e-12 3.520000000000000e-12 1.750000000000000e-13 5.970000000000000e-13 3.840000000000000e-12 -1.850000000000000e-12 7.420000000000000e-13 8.040000000000000e-12 -2.430000000000000e-12 7.840000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>4.150000000000000e+02 6.802692315605059e-01 -7.065001862801269e-01 -1.901620955966321e-01 -4.392763112805400e-02 3.750000000000000e-12 3.520000000000000e-12 1.780000000000000e-13 6.000000000000000e-13 3.840000000000000e-12 -1.850000000000000e-12 7.420000000000000e-13 8.060000000000001e-12 -2.420000000000000e-12 7.850000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>4.160000000000000e+02 6.802710512089848e-01 -7.065064439727169e-01 -1.901312197150202e-01 -4.393245726940230e-02 3.750000000000000e-12 3.520000000000000e-12 1.780000000000000e-13 6.000000000000000e-13 3.840000000000000e-12 -1.850000000000000e-12 7.420000000000000e-13 8.060000000000001e-12 -2.420000000000000e-12 7.850000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>4.170000000000000e+02 6.802728701677373e-01 -7.065127029536329e-01 -1.901003366799004e-01 -4.393728112991470e-02 3.760000000000000e-12 3.540000000000000e-12 1.780000000000000e-13 5.980000000000000e-13 3.860000000000000e-12 -1.850000000000000e-12 7.410000000000000e-13 8.069999999999999e-12 -2.430000000000000e-12 7.859999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.180000000000000e+02 6.802746882974433e-01 -7.065189632039591e-01 -1.900694469660521e-01 -4.394210310213120e-02 3.760000000000000e-12 3.540000000000000e-12 1.780000000000000e-13 5.980000000000000e-13 3.860000000000000e-12 -1.850000000000000e-12 7.410000000000000e-13 8.069999999999999e-12 -2.430000000000000e-12 7.859999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.190000000000000e+02 6.802765056648097e-01 -7.065252245174817e-01 -1.900385510136808e-01 -4.394692355124710e-02 3.760000000000000e-12 3.540000000000000e-12 1.770000000000000e-13 5.980000000000000e-13 3.860000000000000e-12 -1.850000000000000e-12 7.410000000000000e-13 8.069999999999999e-12 -2.430000000000000e-12 7.859999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.200000000000000e+02 6.802783225387664e-01 -7.065314865404763e-01 -1.900076491151806e-01 -4.395174272391700e-02 3.760000000000000e-12 3.540000000000000e-12 1.780000000000000e-13 5.980000000000000e-13 3.860000000000000e-12 -1.850000000000000e-12 7.410000000000000e-13 8.069999999999999e-12 -2.430000000000000e-12 7.859999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.210000000000000e+02 6.802801393378579e-01 -7.065377488374247e-01 -1.899767413728930e-01 -4.395656068831830e-02 3.760000000000000e-12 3.540000000000000e-12 1.770000000000000e-13 5.980000000000000e-13 3.860000000000000e-12 -1.850000000000000e-12 7.410000000000000e-13 8.069999999999999e-12 -2.430000000000000e-12 7.859999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.220000000000000e+02 6.802819525251127e-01 -7.065440139322317e-01 -1.899458314848123e-01 -4.396137562331650e-02 3.760000000000000e-12 3.540000000000000e-12 1.770000000000000e-13 5.980000000000000e-13 3.860000000000000e-12 -1.850000000000000e-12 7.410000000000000e-13 8.069999999999999e-12 -2.430000000000000e-12 7.859999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.230000000000000e+02 6.802837704595793e-01 -7.065502756113528e-01 -1.899149118966115e-01 -4.396619067104030e-02 3.760000000000000e-12 3.540000000000000e-12 1.770000000000000e-13 5.980000000000000e-13 3.860000000000000e-12 -1.850000000000000e-12 7.410000000000000e-13 8.069999999999999e-12 -2.430000000000000e-12 7.859999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.240000000000000e+02 6.802855892643807e-01 -7.065565367099876e-01 -1.898839864069531e-01 -4.397100382987110e-02 3.760000000000000e-12 3.540000000000000e-12 1.770000000000000e-13 5.980000000000000e-13 3.860000000000000e-12 -1.850000000000000e-12 7.400000000000000e-13 8.069999999999999e-12 -2.430000000000000e-12 7.859999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.250000000000000e+02 6.802874087251581e-01 -7.065627973659192e-01 -1.898530553261513e-01 -4.397581485068910e-02 3.770000000000000e-12 3.550000000000000e-12 1.810000000000000e-13 5.970000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.390000000000000e-13 8.100000000000000e-12 -2.430000000000000e-12 7.890000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.260000000000000e+02 6.802892282868032e-01 -7.065690579557221e-01 -1.898221192658409e-01 -4.398062361920790e-02 3.770000000000000e-12 3.550000000000000e-12 1.810000000000000e-13 5.970000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.380000000000000e-13 8.100000000000000e-12 -2.430000000000000e-12 7.890000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.270000000000000e+02 6.802910471598365e-01 -7.065753190113121e-01 -1.897911790571878e-01 -4.398543020499480e-02 3.770000000000000e-12 3.550000000000000e-12 1.810000000000000e-13 5.970000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.380000000000000e-13 8.100000000000000e-12 -2.430000000000000e-12 7.890000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.280000000000000e+02 6.802928645164167e-01 -7.065815810870441e-01 -1.897602355410413e-01 -4.399023487081920e-02 3.770000000000000e-12 3.550000000000000e-12 1.810000000000000e-13 5.970000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.380000000000000e-13 8.100000000000000e-12 -2.430000000000000e-12 7.890000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.290000000000000e+02 6.802946797156906e-01 -7.065878446162231e-01 -1.897292892971905e-01 -4.399503806009420e-02 3.770000000000000e-12 3.550000000000000e-12 1.810000000000000e-13 5.980000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.380000000000000e-13 8.100000000000000e-12 -2.430000000000000e-12 7.890000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.300000000000000e+02 6.802964924828465e-01 -7.065941098048144e-01 -1.896983404063894e-01 -4.399984036039130e-02 3.770000000000000e-12 3.550000000000000e-12 1.800000000000000e-13 5.980000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.410000000000000e-13 8.110000000000000e-12 -2.450000000000000e-12 7.900000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.310000000000000e+02 6.802983029757570e-01 -7.066003765969556e-01 -1.896673883543656e-01 -4.400464243895090e-02 3.770000000000000e-12 3.550000000000000e-12 1.800000000000000e-13 5.980000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.410000000000000e-13 8.110000000000000e-12 -2.450000000000000e-12 7.900000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.320000000000000e+02 6.803001533380484e-01 -7.066066140030287e-01 -1.896363931612669e-01 -4.400946266643310e-02 3.780000000000000e-12 3.550000000000000e-12 1.840000000000000e-13 6.000000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.390000000000000e-13 8.120000000000000e-12 -2.440000000000000e-12 7.910000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.330000000000000e+02 6.803019611034552e-01 -7.066128830087639e-01 -1.896054315308723e-01 -4.401426608303030e-02 3.780000000000000e-12 3.550000000000000e-12 1.840000000000000e-13 6.010000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.390000000000000e-13 8.120000000000000e-12 -2.440000000000000e-12 7.910000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.340000000000000e+02 6.803037686768679e-01 -7.066191524283109e-01 -1.895744633869473e-01 -4.401907060692340e-02 3.780000000000000e-12 3.550000000000000e-12 1.840000000000000e-13 6.010000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.390000000000000e-13 8.120000000000000e-12 -2.440000000000000e-12 7.910000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.350000000000000e+02 6.803055767518681e-01 -7.066254217928893e-01 -1.895434880307972e-01 -4.402387603844530e-02 3.780000000000000e-12 3.550000000000000e-12 1.840000000000000e-13 6.010000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.390000000000000e-13 8.130000000000000e-12 -2.440000000000000e-12 7.910000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.360000000000000e+02 6.803073858539772e-01 -7.066316906779148e-01 -1.895125052941892e-01 -4.402868178039780e-02 3.780000000000000e-12 3.550000000000000e-12 1.840000000000000e-13 6.010000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.390000000000000e-13 8.130000000000000e-12 -2.440000000000000e-12 7.910000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.370000000000000e+02 6.803091963301170e-01 -7.066379587255932e-01 -1.894815154687763e-01 -4.403348694406500e-02 3.790000000000000e-12 3.560000000000000e-12 1.840000000000000e-13 5.980000000000000e-13 3.880000000000000e-12 -1.850000000000000e-12 7.390000000000000e-13 8.140000000000000e-12 -2.450000000000000e-12 7.920000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.380000000000000e+02 6.803110083621803e-01 -7.066442256763065e-01 -1.894505190952507e-01 -4.403829054478440e-02 3.790000000000000e-12 3.560000000000000e-12 1.840000000000000e-13 5.980000000000000e-13 3.880000000000000e-12 -1.850000000000000e-12 7.380000000000000e-13 8.140000000000000e-12 -2.450000000000000e-12 7.920000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.390000000000000e+02 6.803128219705727e-01 -7.066504914192853e-01 -1.894195167105630e-01 -4.404309172225810e-02 3.790000000000000e-12 3.560000000000000e-12 1.840000000000000e-13 5.980000000000000e-13 3.880000000000000e-12 -1.850000000000000e-12 7.380000000000000e-13 8.140000000000000e-12 -2.450000000000000e-12 7.920000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.400000000000000e+02 6.803146370035202e-01 -7.066567560436259e-01 -1.893885086538902e-01 -4.404788992134960e-02 3.790000000000000e-12 3.560000000000000e-12 1.840000000000000e-13 5.980000000000000e-13 3.880000000000000e-12 -1.850000000000000e-12 7.380000000000000e-13 8.140000000000000e-12 -2.450000000000000e-12 7.920000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.410000000000000e+02 6.803164531387218e-01 -7.066630198532664e-01 -1.893574949844595e-01 -4.405268497857830e-02 3.790000000000000e-12 3.560000000000000e-12 1.830000000000000e-13 5.980000000000000e-13 3.880000000000000e-12 -1.850000000000000e-12 7.380000000000000e-13 8.140000000000000e-12 -2.450000000000000e-12 7.920000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.420000000000000e+02 6.803182664650349e-01 -7.066692858714224e-01 -1.893264787655951e-01 -4.405747562224080e-02 3.790000000000000e-12 3.560000000000000e-12 1.840000000000000e-13 5.970000000000000e-13 3.880000000000000e-12 -1.850000000000000e-12 7.370000000000000e-13 8.140000000000000e-12 -2.450000000000000e-12 7.920000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.430000000000000e+02 6.803200833919300e-01 -7.066755495237650e-01 -1.892954532433296e-01 -4.406226526501960e-02 3.790000000000000e-12 3.560000000000000e-12 1.840000000000000e-13 5.970000000000000e-13 3.880000000000000e-12 -1.850000000000000e-12 7.370000000000000e-13 8.140000000000000e-12 -2.450000000000000e-12 7.920000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.440000000000000e+02 6.803219000057933e-01 -7.066818138184671e-01 -1.892644214571921e-01 -4.406705301269040e-02 3.790000000000000e-12 3.560000000000000e-12 1.840000000000000e-13 5.970000000000000e-13 3.880000000000000e-12 -1.850000000000000e-12 7.370000000000000e-13 8.140000000000000e-12 -2.450000000000000e-12 7.920000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.450000000000000e+02 6.803237159759746e-01 -7.066880790344341e-01 -1.892333834231832e-01 -4.407183941563450e-02 3.790000000000000e-12 3.560000000000000e-12 1.870000000000000e-13 6.010000000000000e-13 3.880000000000000e-12 -1.850000000000000e-12 7.390000000000000e-13 8.169999999999999e-12 -2.450000000000000e-12 7.940000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.460000000000000e+02 6.803255311253283e-01 -7.066943452343719e-01 -1.892023394442672e-01 -4.407662488914970e-02 3.790000000000000e-12 3.560000000000000e-12 1.860000000000000e-13 6.010000000000000e-13 3.880000000000000e-12 -1.850000000000000e-12 7.390000000000000e-13 8.169999999999999e-12 -2.450000000000000e-12 7.940000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.470000000000000e+02 6.803273454047817e-01 -7.067006123017689e-01 -1.891712900767801e-01 -4.408140965843110e-02 3.800000000000000e-12 3.570000000000000e-12 1.880000000000000e-13 5.970000000000000e-13 3.890000000000000e-12 -1.850000000000000e-12 7.350000000000000e-13 8.169999999999999e-12 -2.450000000000000e-12 7.940000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.480000000000000e+02 6.803291588421839e-01 -7.067068800227996e-01 -1.891402360111027e-01 -4.408619374805630e-02 3.800000000000000e-12 3.570000000000000e-12 1.880000000000000e-13 5.970000000000000e-13 3.890000000000000e-12 -1.850000000000000e-12 7.340000000000000e-13 8.169999999999999e-12 -2.450000000000000e-12 7.940000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.490000000000000e+02 6.803309714939706e-01 -7.067131481749768e-01 -1.891091779080065e-01 -4.409097700937710e-02 3.800000000000000e-12 3.570000000000000e-12 1.880000000000000e-13 5.970000000000000e-13 3.890000000000000e-12 -1.850000000000000e-12 7.340000000000000e-13 8.169999999999999e-12 -2.450000000000000e-12 7.940000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.500000000000000e+02 6.803327834150843e-01 -7.067194165915641e-01 -1.890781162542221e-01 -4.409575917158480e-02 3.800000000000000e-12 3.570000000000000e-12 1.890000000000000e-13 5.960000000000000e-13 3.890000000000000e-12 -1.850000000000000e-12 7.330000000000000e-13 8.169999999999999e-12 -2.450000000000000e-12 7.940000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.510000000000000e+02 6.803345946534085e-01 -7.067256851867987e-01 -1.890470512746948e-01 -4.410053989890760e-02 3.800000000000000e-12 3.570000000000000e-12 1.890000000000000e-13 5.960000000000000e-13 3.890000000000000e-12 -1.850000000000000e-12 7.330000000000000e-13 8.169999999999999e-12 -2.450000000000000e-12 7.940000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.520000000000000e+02 6.803364394377216e-01 -7.067319287058482e-01 -1.890159508673926e-01 -4.410533344858510e-02 3.800000000000000e-12 3.570000000000000e-12 1.890000000000000e-13 5.950000000000000e-13 3.890000000000000e-12 -1.850000000000000e-12 7.350000000000000e-13 8.179999999999999e-12 -2.460000000000000e-12 7.959999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.530000000000000e+02 6.803382495328318e-01 -7.067381976175982e-01 -1.889848788136730e-01 -4.411011029925720e-02 3.800000000000000e-12 3.570000000000000e-12 1.890000000000000e-13 5.950000000000000e-13 3.890000000000000e-12 -1.850000000000000e-12 7.350000000000000e-13 8.179999999999999e-12 -2.460000000000000e-12 7.959999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.540000000000000e+02 6.803400592993639e-01 -7.067444666503566e-01 -1.889538025843840e-01 -4.411488479575560e-02 3.800000000000000e-12 3.570000000000000e-12 1.890000000000000e-13 5.950000000000000e-13 3.890000000000000e-12 -1.850000000000000e-12 7.350000000000000e-13 8.179999999999999e-12 -2.460000000000000e-12 7.959999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.550000000000000e+02 6.803418690541270e-01 -7.067507356732268e-01 -1.889227215701331e-01 -4.411965675097470e-02 3.800000000000000e-12 3.570000000000000e-12 1.920000000000000e-13 5.990000000000000e-13 3.890000000000000e-12 -1.850000000000000e-12 7.340000000000000e-13 8.190000000000000e-12 -2.450000000000000e-12 7.969999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.560000000000000e+02 6.803436792623270e-01 -7.067570044260013e-01 -1.888916350920696e-01 -4.412442605665890e-02 3.800000000000000e-12 3.570000000000000e-12 1.920000000000000e-13 5.990000000000000e-13 3.890000000000000e-12 -1.850000000000000e-12 7.340000000000000e-13 8.190000000000000e-12 -2.450000000000000e-12 7.969999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.570000000000000e+02 6.803454905143478e-01 -7.067632725234611e-01 -1.888605424693584e-01 -4.412919268352170e-02 3.810000000000000e-12 3.580000000000000e-12 1.940000000000000e-13 5.940000000000000e-13 3.900000000000000e-12 -1.850000000000000e-12 7.290000000000000e-13 8.190000000000000e-12 -2.450000000000000e-12 7.969999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.580000000000000e+02 6.803473034519605e-01 -7.067695395029227e-01 -1.888294431080919e-01 -4.413395667692460e-02 3.810000000000000e-12 3.580000000000000e-12 1.940000000000000e-13 5.940000000000000e-13 3.900000000000000e-12 -1.850000000000000e-12 7.290000000000000e-13 8.190000000000000e-12 -2.450000000000000e-12 7.969999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.590000000000000e+02 6.803491186622448e-01 -7.067758048968200e-01 -1.887983366158546e-01 -4.413871814003550e-02 3.810000000000000e-12 3.580000000000000e-12 1.940000000000000e-13 5.940000000000000e-13 3.900000000000000e-12 -1.850000000000000e-12 7.290000000000000e-13 8.190000000000000e-12 -2.450000000000000e-12 7.969999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.600000000000000e+02 6.803509365731008e-01 -7.067820683077765e-01 -1.887672229035642e-01 -4.414347720742450e-02 3.810000000000000e-12 3.580000000000000e-12 1.940000000000000e-13 5.940000000000000e-13 3.900000000000000e-12 -1.850000000000000e-12 7.310000000000000e-13 8.210000000000000e-12 -2.460000000000000e-12 7.980000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.610000000000000e+02 6.803527573764295e-01 -7.067883294700855e-01 -1.887361022380261e-01 -4.414823402099550e-02 3.810000000000000e-12 3.580000000000000e-12 1.940000000000000e-13 5.940000000000000e-13 3.900000000000000e-12 -1.850000000000000e-12 7.310000000000000e-13 8.210000000000000e-12 -2.460000000000000e-12 7.980000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.620000000000000e+02 6.803545708357642e-01 -7.067945957983303e-01 -1.887049847384032e-01 -4.415298436161800e-02 3.810000000000000e-12 3.580000000000000e-12 1.950000000000000e-13 5.930000000000000e-13 3.900000000000000e-12 -1.850000000000000e-12 7.300000000000000e-13 8.210000000000000e-12 -2.460000000000000e-12 7.980000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.630000000000000e+02 6.803563969492094e-01 -7.068008523799267e-01 -1.886738520916976e-01 -4.415773705908380e-02 3.810000000000000e-12 3.580000000000000e-12 1.950000000000000e-13 5.930000000000000e-13 3.900000000000000e-12 -1.850000000000000e-12 7.300000000000000e-13 8.210000000000000e-12 -2.460000000000000e-12 7.980000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.640000000000000e+02 6.803582249837111e-01 -7.068071070564178e-01 -1.886427146044410e-01 -4.416248790794260e-02 3.810000000000000e-12 3.580000000000000e-12 1.950000000000000e-13 5.930000000000000e-13 3.900000000000000e-12 -1.850000000000000e-12 7.300000000000000e-13 8.210000000000000e-12 -2.460000000000000e-12 7.980000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.650000000000000e+02 6.803600541606709e-01 -7.068133604016299e-01 -1.886115728910247e-01 -4.416723708608340e-02 3.810000000000000e-12 3.580000000000000e-12 1.990000000000000e-13 5.950000000000000e-13 3.900000000000000e-12 -1.850000000000000e-12 7.280000000000000e-13 8.220000000000000e-12 -2.450000000000000e-12 7.990000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.660000000000000e+02 6.803618835539779e-01 -7.068196131942610e-01 -1.885804273235806e-01 -4.417198480093930e-02 3.810000000000000e-12 3.580000000000000e-12 1.990000000000000e-13 5.950000000000000e-13 3.890000000000000e-12 -1.850000000000000e-12 7.270000000000000e-13 8.220000000000000e-12 -2.450000000000000e-12 7.990000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.670000000000000e+02 6.803637122207733e-01 -7.068258662962895e-01 -1.885492780265805e-01 -4.417673124308570e-02 3.830000000000000e-12 3.590000000000000e-12 2.000000000000000e-13 5.910000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.260000000000000e-13 8.230000000000000e-12 -2.460000000000000e-12 8.010000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.680000000000000e+02 6.803655394111383e-01 -7.068321204408440e-01 -1.885181249350094e-01 -4.418147650180370e-02 3.830000000000000e-12 3.590000000000000e-12 2.000000000000000e-13 5.910000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.260000000000000e-13 8.230000000000000e-12 -2.460000000000000e-12 8.010000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.690000000000000e+02 6.803673648158205e-01 -7.068383759788941e-01 -1.884869678739297e-01 -4.418622046281020e-02 3.830000000000000e-12 3.590000000000000e-12 2.000000000000000e-13 5.910000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.260000000000000e-13 8.240000000000000e-12 -2.460000000000000e-12 8.010000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.700000000000000e+02 6.803691887579600e-01 -7.068446326807400e-01 -1.884558066296656e-01 -4.419096272799490e-02 3.830000000000000e-12 3.590000000000000e-12 2.010000000000000e-13 5.900000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.250000000000000e-13 8.240000000000000e-12 -2.470000000000000e-12 8.010000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.710000000000000e+02 6.803710122222661e-01 -7.068508896981386e-01 -1.884246409905228e-01 -4.419570259868910e-02 3.830000000000000e-12 3.590000000000000e-12 2.010000000000000e-13 5.900000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.250000000000000e-13 8.240000000000000e-12 -2.470000000000000e-12 8.010000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.720000000000000e+02 6.803728686876107e-01 -7.068571220725769e-01 -1.883934406845775e-01 -4.420045289464950e-02 3.830000000000000e-12 3.590000000000000e-12 2.040000000000000e-13 5.930000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.260000000000000e-13 8.260000000000001e-12 -2.470000000000000e-12 8.030000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.730000000000000e+02 6.803746956145477e-01 -7.068633757872791e-01 -1.883622656994435e-01 -4.420518520033690e-02 3.830000000000000e-12 3.590000000000000e-12 2.040000000000000e-13 5.930000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.260000000000000e-13 8.260000000000001e-12 -2.470000000000000e-12 8.030000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.740000000000000e+02 6.803765261844503e-01 -7.068696261476821e-01 -1.883310858131882e-01 -4.420991250208020e-02 3.830000000000000e-12 3.590000000000000e-12 2.040000000000000e-13 5.930000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.260000000000000e-13 8.260000000000001e-12 -2.470000000000000e-12 8.030000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.750000000000000e+02 6.803783608264738e-01 -7.068758727928139e-01 -1.882999009065380e-01 -4.421463446717630e-02 3.840000000000000e-12 3.600000000000000e-12 2.070000000000000e-13 5.870000000000000e-13 3.920000000000000e-12 -1.850000000000000e-12 7.200000000000000e-13 8.260000000000001e-12 -2.470000000000000e-12 8.030000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.760000000000000e+02 6.803801991461443e-01 -7.068821161140445e-01 -1.882687108892860e-01 -4.421935128504470e-02 3.840000000000000e-12 3.600000000000000e-12 2.080000000000000e-13 5.860000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.190000000000000e-13 8.260000000000001e-12 -2.470000000000000e-12 8.030000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.770000000000000e+02 6.803820401074957e-01 -7.068883570808240e-01 -1.882375157116770e-01 -4.422406360152890e-02 3.840000000000000e-12 3.600000000000000e-12 2.080000000000000e-13 5.860000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.190000000000000e-13 8.260000000000001e-12 -2.470000000000000e-12 8.030000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.780000000000000e+02 6.803838824298796e-01 -7.068945968701824e-01 -1.882063153735754e-01 -4.422877229686940e-02 3.840000000000000e-12 3.600000000000000e-12 2.120000000000000e-13 5.890000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.200000000000000e-13 8.290000000000000e-12 -2.470000000000000e-12 8.060000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>4.790000000000000e+02 6.803857250455710e-01 -7.069008364431604e-01 -1.881751099313517e-01 -4.423347818673940e-02 3.840000000000000e-12 3.600000000000000e-12 2.120000000000000e-13 5.890000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.200000000000000e-13 8.290000000000000e-12 -2.470000000000000e-12 8.060000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>4.800000000000000e+02 6.803875674548957e-01 -7.069070762198838e-01 -1.881438994973934e-01 -4.423818175490420e-02 3.840000000000000e-12 3.600000000000000e-12 2.130000000000000e-13 5.880000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.190000000000000e-13 8.290000000000000e-12 -2.470000000000000e-12 8.060000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>4.810000000000000e+02 6.803894098561737e-01 -7.069133159634268e-01 -1.881126842355853e-01 -4.424288303041550e-02 3.840000000000000e-12 3.600000000000000e-12 2.140000000000000e-13 5.870000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.180000000000000e-13 8.290000000000000e-12 -2.470000000000000e-12 8.060000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>4.820000000000000e+02 6.803912639514307e-01 -7.069195468184943e-01 -1.880814540762603e-01 -4.424758634173140e-02 3.850000000000000e-12 3.610000000000000e-12 2.140000000000000e-13 5.840000000000000e-13 3.930000000000000e-12 -1.850000000000000e-12 7.170000000000000e-13 8.300000000000000e-12 -2.480000000000000e-12 8.069999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.830000000000000e+02 6.803931088853072e-01 -7.069257839480435e-01 -1.880502298073997e-01 -4.425228175150710e-02 3.850000000000000e-12 3.610000000000000e-12 2.140000000000000e-13 5.840000000000000e-13 3.930000000000000e-12 -1.850000000000000e-12 7.170000000000000e-13 8.300000000000000e-12 -2.480000000000000e-12 8.069999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.840000000000000e+02 6.803949564346709e-01 -7.069320184084023e-01 -1.880190014450611e-01 -4.425697349443240e-02 3.850000000000000e-12 3.610000000000000e-12 2.150000000000000e-13 5.830000000000000e-13 3.920000000000000e-12 -1.850000000000000e-12 7.160000000000000e-13 8.300000000000000e-12 -2.480000000000000e-12 8.069999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.850000000000000e+02 6.803968069423726e-01 -7.069382497896975e-01 -1.879877693261727e-01 -4.426166140886420e-02 3.850000000000000e-12 3.610000000000000e-12 2.160000000000000e-13 5.820000000000000e-13 3.920000000000000e-12 -1.850000000000000e-12 7.150000000000000e-13 8.300000000000000e-12 -2.480000000000000e-12 8.069999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.860000000000000e+02 6.803986601013317e-01 -7.069444782772060e-01 -1.879565338110631e-01 -4.426634572011170e-02 3.850000000000000e-12 3.610000000000000e-12 2.160000000000000e-13 5.820000000000000e-13 3.920000000000000e-12 -1.840000000000000e-12 7.150000000000000e-13 8.300000000000000e-12 -2.480000000000000e-12 8.069999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.870000000000000e+02 6.804005150458041e-01 -7.069507045881674e-01 -1.879252952073051e-01 -4.427102696962610e-02 3.850000000000000e-12 3.610000000000000e-12 2.200000000000000e-13 5.840000000000000e-13 3.920000000000000e-12 -1.840000000000000e-12 7.130000000000000e-13 8.320000000000000e-12 -2.470000000000000e-12 8.080000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.880000000000000e+02 6.804023706504176e-01 -7.069569297294003e-01 -1.878940536421642e-01 -4.427570583048060e-02 3.850000000000000e-12 3.610000000000000e-12 2.200000000000000e-13 5.840000000000000e-13 3.920000000000000e-12 -1.840000000000000e-12 7.130000000000000e-13 8.320000000000000e-12 -2.470000000000000e-12 8.080000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.890000000000000e+02 6.804042259214623e-01 -7.069631546749781e-01 -1.878628089106905e-01 -4.428038288456980e-02 3.850000000000000e-12 3.610000000000000e-12 2.200000000000000e-13 5.840000000000000e-13 3.920000000000000e-12 -1.840000000000000e-12 7.120000000000000e-13 8.320000000000000e-12 -2.470000000000000e-12 8.080000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.900000000000000e+02 6.804060803357034e-01 -7.069693800786994e-01 -1.878315603707232e-01 -4.428505845139280e-02 3.850000000000000e-12 3.610000000000000e-12 2.210000000000000e-13 5.830000000000000e-13 3.920000000000000e-12 -1.840000000000000e-12 7.130000000000000e-13 8.330000000000000e-12 -2.480000000000000e-12 8.100000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.910000000000000e+02 6.804079340040512e-01 -7.069756061183868e-01 -1.878003069515258e-01 -4.428973252110370e-02 3.850000000000000e-12 3.610000000000000e-12 2.210000000000000e-13 5.830000000000000e-13 3.920000000000000e-12 -1.840000000000000e-12 7.130000000000000e-13 8.330000000000000e-12 -2.480000000000000e-12 8.100000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.920000000000000e+02 6.804098174966778e-01 -7.069818104037153e-01 -1.877690192113430e-01 -4.429441767122830e-02 3.860000000000000e-12 3.620000000000000e-12 2.230000000000000e-13 5.780000000000000e-13 3.930000000000000e-12 -1.840000000000000e-12 7.090000000000000e-13 8.330000000000000e-12 -2.480000000000000e-12 8.100000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.930000000000000e+02 6.804116720343808e-01 -7.069880365587891e-01 -1.877377520462600e-01 -4.429908778681280e-02 3.860000000000000e-12 3.620000000000000e-12 2.230000000000000e-13 5.780000000000000e-13 3.930000000000000e-12 -1.840000000000000e-12 7.090000000000000e-13 8.330000000000000e-12 -2.480000000000000e-12 8.100000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.940000000000000e+02 6.804135284959884e-01 -7.069942617995010e-01 -1.877064763980241e-01 -4.430375537644200e-02 3.860000000000000e-12 3.620000000000000e-12 2.230000000000000e-13 5.780000000000000e-13 3.930000000000000e-12 -1.840000000000000e-12 7.080000000000000e-13 8.330000000000000e-12 -2.480000000000000e-12 8.100000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.950000000000000e+02 6.804153875696328e-01 -7.070004855633120e-01 -1.876751919267832e-01 -4.430842027146590e-02 3.870000000000000e-12 3.620000000000000e-12 2.280000000000000e-13 5.800000000000000e-13 3.930000000000000e-12 -1.840000000000000e-12 7.090000000000000e-13 8.360000000000001e-12 -2.480000000000000e-12 8.120000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.960000000000000e+02 6.804172494894142e-01 -7.070067075283486e-01 -1.876438989760214e-01 -4.431308254072470e-02 3.870000000000000e-12 3.620000000000000e-12 2.280000000000000e-13 5.800000000000000e-13 3.930000000000000e-12 -1.840000000000000e-12 7.090000000000000e-13 8.360000000000001e-12 -2.480000000000000e-12 8.120000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.970000000000000e+02 6.804191140311587e-01 -7.070129276594594e-01 -1.876125984225085e-01 -4.431774245838540e-02 3.860000000000000e-12 3.620000000000000e-12 2.280000000000000e-13 5.790000000000000e-13 3.930000000000000e-12 -1.840000000000000e-12 7.070000000000000e-13 8.360000000000001e-12 -2.490000000000000e-12 8.120000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.980000000000000e+02 6.804209806186307e-01 -7.070191461952581e-01 -1.875812913617432e-01 -4.432240041299860e-02 3.860000000000000e-12 3.620000000000000e-12 2.280000000000000e-13 5.790000000000000e-13 3.930000000000000e-12 -1.840000000000000e-12 7.070000000000000e-13 8.360000000000001e-12 -2.490000000000000e-12 8.120000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.990000000000000e+02 6.804228484731202e-01 -7.070253636083783e-01 -1.875499787396011e-01 -4.432705680440600e-02 3.860000000000000e-12 3.620000000000000e-12 2.280000000000000e-13 5.790000000000000e-13 3.930000000000000e-12 -1.840000000000000e-12 7.070000000000000e-13 8.360000000000001e-12 -2.490000000000000e-12 8.120000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.000000000000000e+02 6.804247167509674e-01 -7.070315805567897e-01 -1.875186610578563e-01 -4.433171195433680e-02 3.880000000000000e-12 3.630000000000000e-12 2.300000000000000e-13 5.740000000000000e-13 3.940000000000000e-12 -1.840000000000000e-12 7.030000000000000e-13 8.360000000000001e-12 -2.490000000000000e-12 8.120000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.010000000000000e+02 6.804265846554490e-01 -7.070377978113996e-01 -1.874873382524493e-01 -4.433636605698650e-02 3.880000000000000e-12 3.630000000000000e-12 2.310000000000000e-13 5.730000000000000e-13 3.940000000000000e-12 -1.840000000000000e-12 7.020000000000000e-13 8.360000000000001e-12 -2.490000000000000e-12 8.120000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.020000000000000e+02 6.804284457956532e-01 -7.070440203922262e-01 -1.874560151564688e-01 -4.434101669297690e-02 3.880000000000000e-12 3.630000000000000e-12 2.330000000000000e-13 5.770000000000000e-13 3.940000000000000e-12 -1.840000000000000e-12 7.040000000000000e-13 8.379999999999999e-12 -2.490000000000000e-12 8.150000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.030000000000000e+02 6.804303111768971e-01 -7.070502404805854e-01 -1.874246801654535e-01 -4.434566870546690e-02 3.880000000000000e-12 3.630000000000000e-12 2.330000000000000e-13 5.770000000000000e-13 3.940000000000000e-12 -1.840000000000000e-12 7.040000000000000e-13 8.379999999999999e-12 -2.490000000000000e-12 8.150000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.040000000000000e+02 6.804321748860434e-01 -7.070564627194242e-01 -1.873933378655103e-01 -4.435031939194290e-02 3.880000000000000e-12 3.630000000000000e-12 2.340000000000000e-13 5.760000000000000e-13 3.940000000000000e-12 -1.840000000000000e-12 7.020000000000000e-13 8.379999999999999e-12 -2.490000000000000e-12 8.150000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.050000000000000e+02 6.804340370307466e-01 -7.070626871720161e-01 -1.873619877137878e-01 -4.435496836958380e-02 3.880000000000000e-12 3.630000000000000e-12 2.360000000000000e-13 5.750000000000000e-13 3.940000000000000e-12 -1.840000000000000e-12 7.010000000000000e-13 8.379999999999999e-12 -2.490000000000000e-12 8.150000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.060000000000000e+02 6.804358979687370e-01 -7.070689135627078e-01 -1.873306295686791e-01 -4.435961512606940e-02 3.880000000000000e-12 3.630000000000000e-12 2.370000000000000e-13 5.740000000000000e-13 3.940000000000000e-12 -1.840000000000000e-12 7.000000000000000e-13 8.379999999999999e-12 -2.490000000000000e-12 8.150000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.070000000000000e+02 6.804377582037535e-01 -7.070751413725604e-01 -1.872992636922413e-01 -4.436425908282890e-02 3.880000000000000e-12 3.630000000000000e-12 2.360000000000000e-13 5.740000000000000e-13 3.940000000000000e-12 -1.840000000000000e-12 7.030000000000000e-13 8.400000000000000e-12 -2.500000000000000e-12 8.160000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.080000000000000e+02 6.804396182491000e-01 -7.070813699927277e-01 -1.872678906381760e-01 -4.436889971764570e-02 3.880000000000000e-12 3.630000000000000e-12 2.350000000000000e-13 5.740000000000000e-13 3.940000000000000e-12 -1.840000000000000e-12 7.030000000000000e-13 8.400000000000000e-12 -2.500000000000000e-12 8.160000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.090000000000000e+02 6.804414784981926e-01 -7.070875988822702e-01 -1.872365110885500e-01 -4.437353672502190e-02 3.880000000000000e-12 3.630000000000000e-12 2.370000000000000e-13 5.730000000000000e-13 3.940000000000000e-12 -1.840000000000000e-12 7.020000000000000e-13 8.400000000000000e-12 -2.500000000000000e-12 8.160000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.100000000000000e+02 6.804433391438437e-01 -7.070938276792915e-01 -1.872051256936050e-01 -4.437817015905710e-02 3.890000000000000e-12 3.640000000000000e-12 2.390000000000000e-13 5.690000000000000e-13 3.950000000000000e-12 -1.840000000000000e-12 6.970000000000000e-13 8.400000000000000e-12 -2.500000000000000e-12 8.160000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.110000000000000e+02 6.804452001695896e-01 -7.071000562381442e-01 -1.871737349519128e-01 -4.438280047869550e-02 3.890000000000000e-12 3.640000000000000e-12 2.390000000000000e-13 5.690000000000000e-13 3.950000000000000e-12 -1.840000000000000e-12 6.970000000000000e-13 8.400000000000000e-12 -2.500000000000000e-12 8.160000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.120000000000000e+02 6.804471034366796e-01 -7.071062534855720e-01 -1.871422995800814e-01 -4.438744658244870e-02 3.890000000000000e-12 3.640000000000000e-12 2.420000000000000e-13 5.720000000000000e-13 3.950000000000000e-12 -1.840000000000000e-12 6.980000000000000e-13 8.420000000000000e-12 -2.500000000000000e-12 8.190000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.130000000000000e+02 6.804489647120614e-01 -7.071124817441781e-01 -1.871108987606872e-01 -4.439207304059260e-02 3.890000000000000e-12 3.640000000000000e-12 2.420000000000000e-13 5.720000000000000e-13 3.950000000000000e-12 -1.840000000000000e-12 6.980000000000000e-13 8.420000000000000e-12 -2.500000000000000e-12 8.190000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.140000000000000e+02 6.804508259103161e-01 -7.071187100141300e-01 -1.870794927818112e-01 -4.439669859822580e-02 3.890000000000000e-12 3.640000000000000e-12 2.420000000000000e-13 5.720000000000000e-13 3.950000000000000e-12 -1.840000000000000e-12 6.980000000000000e-13 8.420000000000000e-12 -2.500000000000000e-12 8.190000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.150000000000000e+02 6.804526871032610e-01 -7.071249382973606e-01 -1.870480813402299e-01 -4.440132339068760e-02 3.890000000000000e-12 3.640000000000000e-12 2.430000000000000e-13 5.710000000000000e-13 3.950000000000000e-12 -1.840000000000000e-12 6.970000000000000e-13 8.420000000000000e-12 -2.500000000000000e-12 8.190000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.160000000000000e+02 6.804545485690342e-01 -7.071311664598303e-01 -1.870166640316401e-01 -4.440594698177390e-02 3.890000000000000e-12 3.640000000000000e-12 2.440000000000000e-13 5.700000000000000e-13 3.950000000000000e-12 -1.840000000000000e-12 6.960000000000000e-13 8.420000000000000e-12 -2.500000000000000e-12 8.190000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.170000000000000e+02 6.804564107329627e-01 -7.071373942640587e-01 -1.869852404170683e-01 -4.441056847217940e-02 3.900000000000000e-12 3.660000000000000e-12 2.440000000000000e-13 5.660000000000000e-13 3.960000000000000e-12 -1.840000000000000e-12 6.920000000000000e-13 8.420000000000000e-12 -2.500000000000000e-12 8.190000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.180000000000000e+02 6.804582740277767e-01 -7.071436214673144e-01 -1.869538100930558e-01 -4.441518678245570e-02 3.900000000000000e-12 3.660000000000000e-12 2.440000000000000e-13 5.660000000000000e-13 3.960000000000000e-12 -1.840000000000000e-12 6.920000000000000e-13 8.430000000000000e-12 -2.500000000000000e-12 8.190000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.190000000000000e+02 6.804601387148121e-01 -7.071498479544605e-01 -1.869223727551841e-01 -4.441980101007110e-02 3.900000000000000e-12 3.650000000000000e-12 2.450000000000000e-13 5.650000000000000e-13 3.960000000000000e-12 -1.830000000000000e-12 6.910000000000000e-13 8.430000000000000e-12 -2.500000000000000e-12 8.190000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.200000000000000e+02 6.804620047249804e-01 -7.071560738611651e-01 -1.868909282409560e-01 -4.442441072380310e-02 3.900000000000000e-12 3.650000000000000e-12 2.480000000000000e-13 5.690000000000000e-13 3.960000000000000e-12 -1.840000000000000e-12 6.930000000000000e-13 8.450000000000001e-12 -2.500000000000000e-12 8.210000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.210000000000000e+02 6.804638715878522e-01 -7.071622996319363e-01 -1.868594765370707e-01 -4.442901609572860e-02 3.900000000000000e-12 3.650000000000000e-12 2.490000000000000e-13 5.680000000000000e-13 3.960000000000000e-12 -1.840000000000000e-12 6.920000000000000e-13 8.450000000000001e-12 -2.500000000000000e-12 8.210000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.220000000000000e+02 6.804657468579826e-01 -7.071685197822557e-01 -1.868280098581551e-01 -4.443362144168260e-02 3.900000000000000e-12 3.650000000000000e-12 2.490000000000000e-13 5.680000000000000e-13 3.960000000000000e-12 -1.840000000000000e-12 6.920000000000000e-13 8.450000000000001e-12 -2.500000000000000e-12 8.210000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.230000000000000e+02 6.804676128318610e-01 -7.071747475383846e-01 -1.867965441021969e-01 -4.443822051350210e-02 3.900000000000000e-12 3.650000000000000e-12 2.480000000000000e-13 5.680000000000000e-13 3.960000000000000e-12 -1.840000000000000e-12 6.920000000000000e-13 8.450000000000001e-12 -2.500000000000000e-12 8.210000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.240000000000000e+02 6.804694769925534e-01 -7.071809774728639e-01 -1.867650714649811e-01 -4.444281789767960e-02 3.900000000000000e-12 3.650000000000000e-12 2.500000000000000e-13 5.670000000000000e-13 3.960000000000000e-12 -1.830000000000000e-12 6.910000000000000e-13 8.450000000000001e-12 -2.500000000000000e-12 8.210000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.250000000000000e+02 6.804713387700733e-01 -7.071872101007519e-01 -1.867335919061132e-01 -4.444741428047780e-02 3.920000000000000e-12 3.670000000000000e-12 2.550000000000000e-13 5.650000000000000e-13 3.970000000000000e-12 -1.840000000000000e-12 6.880000000000000e-13 8.479999999999999e-12 -2.510000000000000e-12 8.240000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.260000000000000e+02 6.804731980370196e-01 -7.071934455708004e-01 -1.867021052564498e-01 -4.445200994083620e-02 3.920000000000000e-12 3.670000000000000e-12 2.550000000000000e-13 5.660000000000000e-13 3.970000000000000e-12 -1.840000000000000e-12 6.880000000000000e-13 8.479999999999999e-12 -2.510000000000000e-12 8.240000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.270000000000000e+02 6.804750550979983e-01 -7.071996836573675e-01 -1.866706112812963e-01 -4.445660477547360e-02 3.920000000000000e-12 3.670000000000000e-12 2.550000000000000e-13 5.660000000000000e-13 3.970000000000000e-12 -1.830000000000000e-12 6.880000000000000e-13 8.479999999999999e-12 -2.510000000000000e-12 8.240000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.280000000000000e+02 6.804769105518069e-01 -7.072059238521039e-01 -1.866391098014493e-01 -4.446119844182430e-02 3.920000000000000e-12 3.670000000000000e-12 2.550000000000000e-13 5.650000000000000e-13 3.970000000000000e-12 -1.840000000000000e-12 6.900000000000000e-13 8.490000000000000e-12 -2.520000000000000e-12 8.250000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.290000000000000e+02 6.804787650873577e-01 -7.072121655091635e-01 -1.866076008413017e-01 -4.446579055046080e-02 3.920000000000000e-12 3.670000000000000e-12 2.550000000000000e-13 5.650000000000000e-13 3.970000000000000e-12 -1.840000000000000e-12 6.890000000000000e-13 8.490000000000000e-12 -2.520000000000000e-12 8.250000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.300000000000000e+02 6.804806192923739e-01 -7.072184079886291e-01 -1.865760847431044e-01 -4.447038083298010e-02 3.920000000000000e-12 3.660000000000000e-12 2.560000000000000e-13 5.640000000000000e-13 3.970000000000000e-12 -1.840000000000000e-12 6.880000000000000e-13 8.490000000000000e-12 -2.520000000000000e-12 8.250000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.310000000000000e+02 6.804824735366802e-01 -7.072246507599401e-01 -1.865445621806901e-01 -4.447496922648460e-02 3.920000000000000e-12 3.660000000000000e-12 2.560000000000000e-13 5.640000000000000e-13 3.970000000000000e-12 -1.830000000000000e-12 6.880000000000000e-13 8.490000000000000e-12 -2.520000000000000e-12 8.250000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.320000000000000e+02 6.804843301541184e-01 -7.072308918192621e-01 -1.865130319755352e-01 -4.447955681574660e-02 3.920000000000000e-12 3.660000000000000e-12 2.570000000000000e-13 5.630000000000000e-13 3.970000000000000e-12 -1.830000000000000e-12 6.870000000000000e-13 8.490000000000000e-12 -2.520000000000000e-12 8.250000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.330000000000000e+02 6.804861847334052e-01 -7.072371341863908e-01 -1.864814991615314e-01 -4.448414195264290e-02 3.920000000000000e-12 3.660000000000000e-12 2.570000000000000e-13 5.630000000000000e-13 3.970000000000000e-12 -1.830000000000000e-12 6.870000000000000e-13 8.490000000000000e-12 -2.520000000000000e-12 8.250000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.340000000000000e+02 6.804880393992045e-01 -7.072433761168424e-01 -1.864499623126039e-01 -4.448872584268990e-02 3.920000000000000e-12 3.660000000000000e-12 2.570000000000000e-13 5.630000000000000e-13 3.970000000000000e-12 -1.830000000000000e-12 6.870000000000000e-13 8.490000000000000e-12 -2.520000000000000e-12 8.250000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.350000000000000e+02 6.804898941164037e-01 -7.072496175776053e-01 -1.864184216420885e-01 -4.449330864578800e-02 3.930000000000000e-12 3.680000000000000e-12 2.580000000000000e-13 5.590000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.860000000000000e-13 8.500000000000000e-12 -2.530000000000000e-12 8.269999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.360000000000000e+02 6.804917489208079e-01 -7.072558585928699e-01 -1.863868769202563e-01 -4.449789038455780e-02 3.930000000000000e-12 3.680000000000000e-12 2.580000000000000e-13 5.600000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.860000000000000e-13 8.500000000000000e-12 -2.530000000000000e-12 8.269999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.370000000000000e+02 6.804936038904005e-01 -7.072620992192971e-01 -1.863553276634038e-01 -4.450247098345640e-02 3.930000000000000e-12 3.680000000000000e-12 2.620000000000000e-13 5.620000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.830000000000000e-13 8.520000000000000e-12 -2.520000000000000e-12 8.279999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.380000000000000e+02 6.804954590820982e-01 -7.072683395082562e-01 -1.863237734829476e-01 -4.450705037355140e-02 3.930000000000000e-12 3.680000000000000e-12 2.620000000000000e-13 5.620000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.830000000000000e-13 8.520000000000000e-12 -2.520000000000000e-12 8.279999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.390000000000000e+02 6.804973144598477e-01 -7.072745794679552e-01 -1.862922144610335e-01 -4.451162862181950e-02 3.930000000000000e-12 3.680000000000000e-12 2.620000000000000e-13 5.620000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.830000000000000e-13 8.520000000000000e-12 -2.520000000000000e-12 8.279999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.400000000000000e+02 6.804991698544183e-01 -7.072808190293802e-01 -1.862606514046339e-01 -4.451620602542600e-02 3.930000000000000e-12 3.680000000000000e-12 2.630000000000000e-13 5.610000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.820000000000000e-13 8.520000000000000e-12 -2.520000000000000e-12 8.279999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.410000000000000e+02 6.805012867909005e-01 -7.072867527392439e-01 -1.862293183242573e-01 -4.452065893477910e-02 3.930000000000000e-12 3.680000000000000e-12 2.630000000000000e-13 5.610000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.820000000000000e-13 8.520000000000000e-12 -2.520000000000000e-12 8.279999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.420000000000000e+02 6.805031799178527e-01 -7.072929563598265e-01 -1.861977466990716e-01 -4.452521902984450e-02 3.930000000000000e-12 3.680000000000000e-12 2.630000000000000e-13 5.600000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.840000000000000e-13 8.530000000000000e-12 -2.530000000000000e-12 8.290000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.430000000000000e+02 6.805050809828308e-01 -7.072991540833821e-01 -1.861661626019244e-01 -4.452977982830140e-02 3.930000000000000e-12 3.680000000000000e-12 2.630000000000000e-13 5.600000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.840000000000000e-13 8.530000000000000e-12 -2.530000000000000e-12 8.290000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.440000000000000e+02 6.805069643946929e-01 -7.073053648728441e-01 -1.861345901826797e-01 -4.453433024015160e-02 3.930000000000000e-12 3.680000000000000e-12 2.630000000000000e-13 5.600000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.840000000000000e-13 8.530000000000000e-12 -2.530000000000000e-12 8.290000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.450000000000000e+02 6.805088484871842e-01 -7.073115751425622e-01 -1.861030121403158e-01 -4.453887821101840e-02 3.930000000000000e-12 3.680000000000000e-12 2.630000000000000e-13 5.610000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.840000000000000e-13 8.530000000000000e-12 -2.530000000000000e-12 8.290000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.460000000000000e+02 6.805107332163123e-01 -7.073177849245140e-01 -1.860714285159732e-01 -4.454342372226410e-02 3.930000000000000e-12 3.680000000000000e-12 2.630000000000000e-13 5.610000000000000e-13 3.970000000000000e-12 -1.830000000000000e-12 6.840000000000000e-13 8.530000000000000e-12 -2.530000000000000e-12 8.290000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.470000000000000e+02 6.805126186383037e-01 -7.073239941757525e-01 -1.860398392575891e-01 -4.454796680331320e-02 3.940000000000000e-12 3.690000000000000e-12 2.670000000000000e-13 5.600000000000000e-13 3.990000000000000e-12 -1.830000000000000e-12 6.820000000000000e-13 8.560000000000001e-12 -2.530000000000000e-12 8.320000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.480000000000000e+02 6.805145046966103e-01 -7.073302029383208e-01 -1.860082444163940e-01 -4.455250742541880e-02 3.940000000000000e-12 3.690000000000000e-12 2.670000000000000e-13 5.600000000000000e-13 3.990000000000000e-12 -1.830000000000000e-12 6.810000000000000e-13 8.560000000000001e-12 -2.530000000000000e-12 8.320000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.490000000000000e+02 6.805163914426786e-01 -7.073364111727845e-01 -1.859766439449270e-01 -4.455704561595780e-02 3.940000000000000e-12 3.690000000000000e-12 2.660000000000000e-13 5.600000000000000e-13 3.990000000000000e-12 -1.830000000000000e-12 6.810000000000000e-13 8.560000000000001e-12 -2.530000000000000e-12 8.320000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.500000000000000e+02 6.805182788688150e-01 -7.073426188839199e-01 -1.859450378506618e-01 -4.456158137431390e-02 3.940000000000000e-12 3.690000000000000e-12 2.680000000000000e-13 5.590000000000000e-13 3.990000000000000e-12 -1.830000000000000e-12 6.800000000000000e-13 8.560000000000001e-12 -2.530000000000000e-12 8.320000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.510000000000000e+02 6.805201669190556e-01 -7.073488261144781e-01 -1.859134261816430e-01 -4.456611466499450e-02 3.940000000000000e-12 3.690000000000000e-12 2.670000000000000e-13 5.590000000000000e-13 3.990000000000000e-12 -1.830000000000000e-12 6.800000000000000e-13 8.560000000000001e-12 -2.530000000000000e-12 8.320000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.520000000000000e+02 6.805220573093533e-01 -7.073550315906878e-01 -1.858818073197795e-01 -4.457064624071170e-02 3.940000000000000e-12 3.690000000000000e-12 2.680000000000000e-13 5.580000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.790000000000000e-13 8.560000000000001e-12 -2.530000000000000e-12 8.320000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.530000000000000e+02 6.805239494795332e-01 -7.073612357265610e-01 -1.858501817943947e-01 -4.457517586236790e-02 3.940000000000000e-12 3.690000000000000e-12 2.680000000000000e-13 5.580000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.790000000000000e-13 8.560000000000001e-12 -2.530000000000000e-12 8.320000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.540000000000000e+02 6.805258395218137e-01 -7.073674414197361e-01 -1.858185532921351e-01 -4.457970182543620e-02 3.940000000000000e-12 3.690000000000000e-12 2.680000000000000e-13 5.580000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.790000000000000e-13 8.560000000000001e-12 -2.530000000000000e-12 8.320000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.550000000000000e+02 6.805277302574784e-01 -7.073736465783308e-01 -1.857869191482154e-01 -4.458422535487440e-02 3.940000000000000e-12 3.690000000000000e-12 2.670000000000000e-13 5.590000000000000e-13 3.990000000000000e-12 -1.830000000000000e-12 6.820000000000000e-13 8.569999999999999e-12 -2.550000000000000e-12 8.330000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.560000000000000e+02 6.805296216745166e-01 -7.073798512091868e-01 -1.857552793768310e-01 -4.458874645517210e-02 3.940000000000000e-12 3.690000000000000e-12 2.670000000000000e-13 5.590000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.820000000000000e-13 8.569999999999999e-12 -2.550000000000000e-12 8.330000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.570000000000000e+02 6.805315137141127e-01 -7.073860553560423e-01 -1.857236340313879e-01 -4.459326509655990e-02 3.950000000000000e-12 3.700000000000000e-12 2.690000000000000e-13 5.550000000000000e-13 4.000000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.569999999999999e-12 -2.550000000000000e-12 8.330000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.580000000000000e+02 6.805334064588721e-01 -7.073922589567497e-01 -1.856919830339849e-01 -4.459778131764620e-02 3.950000000000000e-12 3.700000000000000e-12 2.690000000000000e-13 5.550000000000000e-13 4.000000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.569999999999999e-12 -2.550000000000000e-12 8.330000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.590000000000000e+02 6.805352998263100e-01 -7.073984620725992e-01 -1.856603264603890e-01 -4.460229507836520e-02 3.950000000000000e-12 3.700000000000000e-12 2.690000000000000e-13 5.550000000000000e-13 4.000000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.569999999999999e-12 -2.550000000000000e-12 8.330000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.600000000000000e+02 6.805371938683505e-01 -7.074046646641636e-01 -1.856286642617684e-01 -4.460680640401320e-02 3.950000000000000e-12 3.700000000000000e-12 2.710000000000000e-13 5.590000000000000e-13 4.000000000000000e-12 -1.830000000000000e-12 6.800000000000000e-13 8.590000000000000e-12 -2.550000000000000e-12 8.350000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.610000000000000e+02 6.805390886029358e-01 -7.074108667175882e-01 -1.855969964205011e-01 -4.461131530278950e-02 3.950000000000000e-12 3.700000000000000e-12 2.710000000000000e-13 5.590000000000000e-13 4.000000000000000e-12 -1.830000000000000e-12 6.790000000000000e-13 8.590000000000000e-12 -2.550000000000000e-12 8.350000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.620000000000000e+02 6.805409918404088e-01 -7.074170624399340e-01 -1.855653155572003e-01 -4.461582517318450e-02 3.950000000000000e-12 3.700000000000000e-12 2.720000000000000e-13 5.580000000000000e-13 4.000000000000000e-12 -1.830000000000000e-12 6.780000000000000e-13 8.600000000000000e-12 -2.550000000000000e-12 8.350000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.630000000000000e+02 6.805429009851827e-01 -7.074232537550383e-01 -1.855336241221036e-01 -4.462033488695880e-02 3.950000000000000e-12 3.700000000000000e-12 2.720000000000000e-13 5.580000000000000e-13 4.000000000000000e-12 -1.830000000000000e-12 6.780000000000000e-13 8.600000000000000e-12 -2.550000000000000e-12 8.350000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.640000000000000e+02 6.805447977018727e-01 -7.074294542616685e-01 -1.855019394368551e-01 -4.462483646043270e-02 3.950000000000000e-12 3.700000000000000e-12 2.720000000000000e-13 5.580000000000000e-13 4.000000000000000e-12 -1.830000000000000e-12 6.780000000000000e-13 8.600000000000000e-12 -2.550000000000000e-12 8.350000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.650000000000000e+02 6.805466950362852e-01 -7.074356542817831e-01 -1.854702491810835e-01 -4.462933558548260e-02 3.950000000000000e-12 3.700000000000000e-12 2.730000000000000e-13 5.570000000000000e-13 3.990000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.600000000000000e-12 -2.550000000000000e-12 8.360000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.660000000000000e+02 6.805485930491795e-01 -7.074418537716606e-01 -1.854385532922979e-01 -4.463383227730270e-02 3.950000000000000e-12 3.700000000000000e-12 2.730000000000000e-13 5.570000000000000e-13 3.990000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.600000000000000e-12 -2.550000000000000e-12 8.360000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.670000000000000e+02 6.805504917507675e-01 -7.074480527231749e-01 -1.854068517601737e-01 -4.463832654073590e-02 3.950000000000000e-12 3.700000000000000e-12 2.720000000000000e-13 5.580000000000000e-13 3.990000000000000e-12 -1.830000000000000e-12 6.800000000000000e-13 8.610000000000000e-12 -2.560000000000000e-12 8.369999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.680000000000000e+02 6.805523910575262e-01 -7.074542511980290e-01 -1.853751446623895e-01 -4.464281833753750e-02 3.950000000000000e-12 3.700000000000000e-12 2.710000000000000e-13 5.580000000000000e-13 3.990000000000000e-12 -1.830000000000000e-12 6.800000000000000e-13 8.610000000000000e-12 -2.560000000000000e-12 8.369999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.690000000000000e+02 6.805542910572175e-01 -7.074604491286851e-01 -1.853434319197339e-01 -4.464730771795980e-02 3.950000000000000e-12 3.700000000000000e-12 2.710000000000000e-13 5.580000000000000e-13 3.990000000000000e-12 -1.830000000000000e-12 6.790000000000000e-13 8.610000000000000e-12 -2.560000000000000e-12 8.369999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.700000000000000e+02 6.805561917285031e-01 -7.074666465323102e-01 -1.853117135472950e-01 -4.465179466146390e-02 3.970000000000000e-12 3.710000000000000e-12 2.760000000000000e-13 5.570000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.750000000000000e-13 8.620000000000000e-12 -2.550000000000000e-12 8.379999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.710000000000000e+02 6.805580930180705e-01 -7.074728434466908e-01 -1.852799895977349e-01 -4.465627915226250e-02 3.970000000000000e-12 3.710000000000000e-12 2.760000000000000e-13 5.570000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.740000000000000e-13 8.620000000000000e-12 -2.550000000000000e-12 8.379999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.720000000000000e+02 6.805599950109590e-01 -7.074790398085944e-01 -1.852482599890111e-01 -4.466076122545080e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.730000000000000e+02 6.805618976158928e-01 -7.074852356854846e-01 -1.852165248061569e-01 -4.466524083938010e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.740000000000000e+02 6.805638008983755e-01 -7.074914310263259e-01 -1.851847839909751e-01 -4.466971803463320e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.750000000000000e+02 6.805657048604445e-01 -7.074976258316985e-01 -1.851530375346965e-01 -4.467419279619480e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.760000000000000e+02 6.805676094409745e-01 -7.075038201451924e-01 -1.851212854973860e-01 -4.467866510485430e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.770000000000000e+02 6.805695146960570e-01 -7.075100139253930e-01 -1.850895278235674e-01 -4.468313498080430e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.780000000000000e+02 6.805714206288039e-01 -7.075162071671730e-01 -1.850577645149062e-01 -4.468760243977380e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.790000000000000e+02 6.805733271728232e-01 -7.075223999221897e-01 -1.850259956267711e-01 -4.469206743462320e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.800000000000000e+02 6.805752344004763e-01 -7.075285921339283e-01 -1.849942210953318e-01 -4.469653001128730e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.810000000000000e+02 6.805771422928842e-01 -7.075347838166015e-01 -1.849624409360073e-01 -4.470099015726920e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.820000000000000e+02 6.805790508025281e-01 -7.075409750044676e-01 -1.849306551942538e-01 -4.470544785461200e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.830000000000000e+02 6.805809600136632e-01 -7.075471656352235e-01 -1.848988637878261e-01 -4.470990313580800e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.840000000000000e+02 6.805828698307244e-01 -7.075533557795428e-01 -1.848670668058809e-01 -4.471435595726460e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.850000000000000e+02 6.805847803251571e-01 -7.075595453812051e-01 -1.848352641863081e-01 -4.471880636687220e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.860000000000000e+02 6.805866914915339e-01 -7.075657344467025e-01 -1.848034559265214e-01 -4.472325434402590e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.870000000000000e+02 6.805886032718196e-01 -7.075719230181050e-01 -1.847716420819424e-01 -4.472769986616110e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.880000000000000e+02 6.805905157254911e-01 -7.075781110492009e-01 -1.847398225991315e-01 -4.473214296896920e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.890000000000000e+02 6.805924288515512e-01 -7.075842985409305e-01 -1.847079974765933e-01 -4.473658364775430e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.900000000000000e+02 6.805943425824637e-01 -7.075904855427991e-01 -1.846761667778728e-01 -4.474102187345890e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.910000000000000e+02 6.805962569908148e-01 -7.075966720003660e-01 -1.846443304335873e-01 -4.474545767819880e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.920000000000000e+02 6.805981720717642e-01 -7.076028579155387e-01 -1.846124884502809e-01 -4.474989106724630e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.930000000000000e+02 6.806000877625229e-01 -7.076090433376953e-01 -1.845806408790939e-01 -4.475432199264100e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.940000000000000e+02 6.806020041191391e-01 -7.076152282208984e-01 -1.845487876750901e-01 -4.475875050257690e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.950000000000000e+02 6.806039211508469e-01 -7.076214125592438e-01 -1.845169288253257e-01 -4.476317659217400e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.960000000000000e+02 6.806058387904138e-01 -7.076275964027753e-01 -1.844850643913227e-01 -4.476760022782080e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.970000000000000e+02 6.806077571168555e-01 -7.076337796911591e-01 -1.844531943001218e-01 -4.477202145144800e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.980000000000000e+02 6.806096760592454e-01 -7.076399624771855e-01 -1.844213186167506e-01 -4.477644022782020e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.990000000000000e+02 6.806115956594206e-01 -7.076461447277239e-01 -1.843894373044297e-01 -4.478085658495750e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.000000000000000e+02 6.806135159379672e-01 -7.076523264299429e-01 -1.843575503359406e-01 -4.478527051363270e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.010000000000000e+02 6.806154368222731e-01 -7.076585076337463e-01 -1.843256577876024e-01 -4.478968200348310e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.020000000000000e+02 6.806173583647662e-01 -7.076646883011479e-01 -1.842937596055554e-01 -4.479409106853670e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.030000000000000e+02 6.806192805904152e-01 -7.076708684137979e-01 -1.842618557637039e-01 -4.479849771546850e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.040000000000000e+02 6.806212034085927e-01 -7.076770480368718e-01 -1.842299463510489e-01 -4.480290191436160e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.050000000000000e+02 6.806231269015282e-01 -7.076832271106166e-01 -1.841980312846037e-01 -4.480730368998010e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.060000000000000e+02 6.806250510583440e-01 -7.076894056399192e-01 -1.841661105801514e-01 -4.481170305426870e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.070000000000000e+02 6.806269758190756e-01 -7.076955836709498e-01 -1.841341842888569e-01 -4.481609996742830e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.080000000000000e+02 6.806289012665798e-01 -7.077017611404951e-01 -1.841022523340594e-01 -4.482049447313670e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.090000000000000e+02 6.806308273162907e-01 -7.077079381122506e-01 -1.840703147920051e-01 -4.482488652546510e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.100000000000000e+02 6.806327540363198e-01 -7.077141145331748e-01 -1.840383716018563e-01 -4.482927616631790e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.110000000000000e+02 6.806346814199060e-01 -7.077202904088615e-01 -1.840064227667008e-01 -4.483366338614220e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.120000000000000e+02 6.806366094029825e-01 -7.077264657851488e-01 -1.839744683495275e-01 -4.483804816428820e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.130000000000000e+02 6.806385380508827e-01 -7.077326406136876e-01 -1.839425082859625e-01 -4.484243052514650e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.140000000000000e+02 6.806404673640545e-01 -7.077388148939621e-01 -1.839105425740186e-01 -4.484681046698540e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.150000000000000e+02 6.806423972815441e-01 -7.077449886695021e-01 -1.838785712737441e-01 -4.485118797050810e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.160000000000000e+02 6.806443278510637e-01 -7.077511619073037e-01 -1.838465943321854e-01 -4.485556303840600e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.170000000000000e+02 6.806462591012522e-01 -7.077573345810102e-01 -1.838146117320522e-01 -4.485993571161200e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.180000000000000e+02 6.806481909370581e-01 -7.077635067643873e-01 -1.837826235543106e-01 -4.486430592555760e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.190000000000000e+02 6.806501234388842e-01 -7.077696783941123e-01 -1.837506297290610e-01 -4.486867373457920e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.200000000000000e+02 6.806520566020791e-01 -7.077758494757149e-01 -1.837186302538764e-01 -4.487303912072410e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.210000000000000e+02 6.806539903682228e-01 -7.077820200497232e-01 -1.836866251890621e-01 -4.487740207277580e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.220000000000000e+02 6.806559248125247e-01 -7.077881900623336e-01 -1.836546144563401e-01 -4.488176260783480e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.230000000000000e+02 6.806578598589749e-01 -7.077943595667765e-01 -1.836225981335875e-01 -4.488612070928050e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.240000000000000e+02 6.806597955590322e-01 -7.078005285257449e-01 -1.835905761677870e-01 -4.489047639079790e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.250000000000000e+02 6.806617319248200e-01 -7.078066969292897e-01 -1.835585485476301e-01 -4.489482966044730e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.260000000000000e+02 6.806636688880379e-01 -7.078128648275482e-01 -1.835265153375409e-01 -4.489918048866720e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.270000000000000e+02 6.806656065089071e-01 -7.078190321759418e-01 -1.834944764779350e-01 -4.490352889766620e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.280000000000000e+02 6.806675447893018e-01 -7.078251989702612e-01 -1.834624319716208e-01 -4.490787490265400e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.290000000000000e+02 6.806694836636518e-01 -7.078313652608742e-01 -1.834303818751729e-01 -4.491221846127150e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.300000000000000e+02 6.806714232012057e-01 -7.078375309957319e-01 -1.833983261221829e-01 -4.491655960437200e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.310000000000000e+02 6.806733633934785e-01 -7.078436961779525e-01 -1.833662647261695e-01 -4.492089834494080e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.320000000000000e+02 6.806753041752375e-01 -7.078498608591596e-01 -1.833341977398859e-01 -4.492523463142980e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.330000000000000e+02 6.806772456449776e-01 -7.078560249621955e-01 -1.833021250769521e-01 -4.492956852853420e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.340000000000000e+02 6.806791876994079e-01 -7.078621885658611e-01 -1.832700468288954e-01 -4.493389997494180e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.350000000000000e+02 6.806811304222570e-01 -7.078683516062020e-01 -1.832379629181729e-01 -4.493822901489690e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.360000000000000e+02 6.806830737898589e-01 -7.078745140998804e-01 -1.832058733674463e-01 -4.494255564071590e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.370000000000000e+02 6.806850177579234e-01 -7.078806760791975e-01 -1.831737782183893e-01 -4.494687983335490e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.380000000000000e+02 6.806869623766859e-01 -7.078868375069791e-01 -1.831416774208552e-01 -4.495120161067370e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.390000000000000e+02 6.806889076540393e-01 -7.078929983764155e-01 -1.831095709675389e-01 -4.495552097888330e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.400000000000000e+02 6.806908535227985e-01 -7.078991587375911e-01 -1.830774589201096e-01 -4.495983790418430e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.410000000000000e+02 6.806928000382613e-01 -7.079053185469351e-01 -1.830453412297512e-01 -4.496415242299260e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.420000000000000e+02 6.806947472238813e-01 -7.079114777879364e-01 -1.830132178699826e-01 -4.496846453672560e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.430000000000000e+02 6.806966949806493e-01 -7.079176365332347e-01 -1.829810889353541e-01 -4.497277420453460e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.440000000000000e+02 6.806986434112186e-01 -7.079237947058986e-01 -1.829489543276551e-01 -4.497708147207000e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.450000000000000e+02 6.807005924796364e-01 -7.079299523317365e-01 -1.829168140812343e-01 -4.498138632621690e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.460000000000000e+02 6.807025421428867e-01 -7.079361094432369e-01 -1.828846682339453e-01 -4.498568874147190e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.470000000000000e+02 6.807044924778166e-01 -7.079422659811857e-01 -1.828525167154901e-01 -4.498998876143240e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.480000000000000e+02 6.807064434050233e-01 -7.079484220043960e-01 -1.828203596000608e-01 -4.499428634920480e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.490000000000000e+02 6.807083949744324e-01 -7.079545774770304e-01 -1.827881968351337e-01 -4.499858151555730e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.500000000000000e+02 6.807103472083096e-01 -7.079607323793300e-01 -1.827560284050028e-01 -4.500287428703820e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.510000000000000e+02 6.807123000235670e-01 -7.079668867743577e-01 -1.827238543838677e-01 -4.500716461578460e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.520000000000000e+02 6.807142534872245e-01 -7.079730406109251e-01 -1.826916747090908e-01 -4.501145253643870e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.530000000000000e+02 6.807162076071777e-01 -7.079791938822150e-01 -1.826594893733536e-01 -4.501573805522380e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.540000000000000e+02 6.807181623060411e-01 -7.079853466455538e-01 -1.826272984489629e-01 -4.502002113610010e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.550000000000000e+02 6.807201176632410e-01 -7.079914988416366e-01 -1.825951018588372e-01 -4.502430181221130e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.560000000000000e+02 6.807220736585090e-01 -7.079976504838594e-01 -1.825628996241920e-01 -4.502858008200500e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.570000000000000e+02 6.807240302473074e-01 -7.080038016054792e-01 -1.825306917852352e-01 -4.503285592160440e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.580000000000000e+02 6.807259875027123e-01 -7.080099521519357e-01 -1.824984782708074e-01 -4.503712936134690e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.590000000000000e+02 6.807279453417535e-01 -7.080161021847218e-01 -1.824662591585503e-01 -4.504140036269920e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.600000000000000e+02 6.807299038336975e-01 -7.080222516494622e-01 -1.824340343871619e-01 -4.504566897066450e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.610000000000000e+02 6.807318629667408e-01 -7.080284005573719e-01 -1.824018039601574e-01 -4.504993516177940e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.620000000000000e+02 6.807338226858302e-01 -7.080345489457980e-01 -1.823695679365381e-01 -4.505419893081690e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.630000000000000e+02 6.807357830503799e-01 -7.080406967725612e-01 -1.823373262529522e-01 -4.505846028812930e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.640000000000000e+02 6.807377440639806e-01 -7.080468440329223e-01 -1.823050789088007e-01 -4.506271924503720e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.650000000000000e+02 6.807397056552275e-01 -7.080529907790288e-01 -1.822728259725109e-01 -4.506697577275010e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.660000000000000e+02 6.807416678960652e-01 -7.080591369593643e-01 -1.822405673687968e-01 -4.507122988717470e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.670000000000000e+02 6.807436307805834e-01 -7.080652825740191e-01 -1.822083031113624e-01 -4.507548160941980e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.680000000000000e+02 6.807455942449967e-01 -7.080714276724660e-01 -1.821760332543794e-01 -4.507973089539750e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.690000000000000e+02 6.807475583582121e-01 -7.080775722013274e-01 -1.821437577350872e-01 -4.508397778533580e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.700000000000000e+02 6.807495231100620e-01 -7.080837161698509e-01 -1.821114765572078e-01 -4.508822226114910e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.710000000000000e+02 6.807514884451850e-01 -7.080898596163767e-01 -1.820791897783101e-01 -4.509246431277890e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.720000000000000e+02 6.807534544423335e-01 -7.080960024832067e-01 -1.820468973191290e-01 -4.509670396615490e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.730000000000000e+02 6.807554210228176e-01 -7.081021448260580e-01 -1.820145992594473e-01 -4.510094120088160e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.740000000000000e+02 6.807573882392532e-01 -7.081082866081659e-01 -1.819822955414662e-01 -4.510517602201180e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.750000000000000e+02 6.807593561051585e-01 -7.081144278162731e-01 -1.819499861577594e-01 -4.510940845226630e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.760000000000000e+02 6.807613245471359e-01 -7.081205685059022e-01 -1.819176711743164e-01 -4.511363845025670e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.770000000000000e+02 6.807632936272958e-01 -7.081267086294700e-01 -1.818853505330568e-01 -4.511786604857500e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.780000000000000e+02 6.807652633546568e-01 -7.081328481796877e-01 -1.818530242246962e-01 -4.512209125162740e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.790000000000000e+02 6.807672336486459e-01 -7.081389872181768e-01 -1.818206923203216e-01 -4.512631401016290e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.800000000000000e+02 6.807692045960232e-01 -7.081451256763670e-01 -1.817883547444964e-01 -4.513053438404330e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.810000000000000e+02 6.807711761716351e-01 -7.081512635742973e-01 -1.817560115161019e-01 -4.513475235086060e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.820000000000000e+02 6.807731483341586e-01 -7.081574009417341e-01 -1.817236626749872e-01 -4.513896789508200e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.830000000000000e+02 6.807751211464188e-01 -7.081635377313235e-01 -1.816913081605091e-01 -4.514318104496230e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.840000000000000e+02 6.807770945415387e-01 -7.081696739929957e-01 -1.816589480342367e-01 -4.514739176662900e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.850000000000000e+02 6.807790685731693e-01 -7.081758096847086e-01 -1.816265822478663e-01 -4.515160009362310e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.860000000000000e+02 6.807810432430113e-01 -7.081819448049966e-01 -1.815942107982048e-01 -4.515580602477600e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.870000000000000e+02 6.807830184844125e-01 -7.081880794028822e-01 -1.815618337483745e-01 -4.516000953096380e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.880000000000000e+02 6.807849943642746e-01 -7.081942134298039e-01 -1.815294510295447e-01 -4.516421063063060e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.890000000000000e+02 6.807869708857051e-01 -7.082003468802595e-01 -1.814970626441921e-01 -4.516840934189250e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.900000000000000e+02 6.807889479711839e-01 -7.082064798128702e-01 -1.814646686623046e-01 -4.517260562145490e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.910000000000000e+02 6.807909257043773e-01 -7.082126121643321e-01 -1.814322690043164e-01 -4.517679950921920e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.920000000000000e+02 6.807929040608919e-01 -7.082187439530008e-01 -1.813998636910308e-01 -4.518099099009130e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.930000000000000e+02 6.807948829980202e-01 -7.082248752089418e-01 -1.813674527653983e-01 -4.518518005255610e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.940000000000000e+02 6.807968625706520e-01 -7.082310058895476e-01 -1.813350361770212e-01 -4.518936672841060e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.950000000000000e+02 6.807988427745676e-01 -7.082371360007492e-01 -1.813026139213409e-01 -4.519355099519470e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.960000000000000e+02 6.808008235496430e-01 -7.082432655837332e-01 -1.812701860623031e-01 -4.519773284530540e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.970000000000000e+02 6.808028049778222e-01 -7.082493945776093e-01 -1.812377525192185e-01 -4.520191231089780e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.980000000000000e+02 6.808047869844066e-01 -7.082555230385364e-01 -1.812053133603006e-01 -4.520608935222300e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.990000000000000e+02 6.808067696151456e-01 -7.082616509318331e-01 -1.811728685412241e-01 -4.521026399003330e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.000000000000000e+02 6.808087528808324e-01 -7.082677782470129e-01 -1.811404180553752e-01 -4.521443624120280e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.010000000000000e+02 6.808107367189448e-01 -7.082739050315358e-01 -1.811079619584937e-01 -4.521860606904870e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.020000000000000e+02 6.808127211848252e-01 -7.082800312431887e-01 -1.810755001979677e-01 -4.522277350093610e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.030000000000000e+02 6.808147062875297e-01 -7.082861568746440e-01 -1.810430327644590e-01 -4.522693854130610e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.040000000000000e+02 6.808166919547797e-01 -7.082922819791505e-01 -1.810105597265315e-01 -4.523110115844970e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.050000000000000e+02 6.808186782542116e-01 -7.082984065056950e-01 -1.809780810189561e-01 -4.523526138288520e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.060000000000000e+02 6.808206651833549e-01 -7.083045304551714e-01 -1.809455966442655e-01 -4.523941921625540e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.070000000000000e+02 6.808226526815658e-01 -7.083106538736483e-01 -1.809131066564336e-01 -4.524357462268660e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.080000000000000e+02 6.808246408266715e-01 -7.083167766999217e-01 -1.808806109865182e-01 -4.524772765356300e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.090000000000000e+02 6.808266295396548e-01 -7.083228989952568e-01 -1.808481097025336e-01 -4.525187825548610e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.100000000000000e+02 6.808286188842521e-01 -7.083290207093024e-01 -1.808156027482012e-01 -4.525602647125950e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.110000000000000e+02 6.808306088556996e-01 -7.083351418457807e-01 -1.807830901256167e-01 -4.526017229450540e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.120000000000000e+02 6.808325993906527e-01 -7.083412624509203e-01 -1.807505718957297e-01 -4.526431569978880e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.130000000000000e+02 6.808345905564706e-01 -7.083473824753863e-01 -1.807180479900354e-01 -4.526845670821170e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.140000000000000e+02 6.808365823478467e-01 -7.083535019206981e-01 -1.806855184172763e-01 -4.527259532948540e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.150000000000000e+02 6.808385747024017e-01 -7.083596208327423e-01 -1.806529832366167e-01 -4.527673153625900e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.160000000000000e+02 6.808405676861033e-01 -7.083657391632148e-01 -1.806204423808666e-01 -4.528086534902890e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.170000000000000e+02 6.808425612949469e-01 -7.083718569141539e-01 -1.805878958540248e-01 -4.528499676875270e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.180000000000000e+02 6.808445554663316e-01 -7.083779741301267e-01 -1.805553437189790e-01 -4.528912577730150e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.190000000000000e+02 6.808465502650366e-01 -7.083840907651980e-01 -1.805227859061624e-01 -4.529325238532250e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.200000000000000e+02 6.808485456872755e-01 -7.083902068182659e-01 -1.804902224263644e-01 -4.529737661253660e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.210000000000000e+02 6.808505416740982e-01 -7.083963223345281e-01 -1.804576533311229e-01 -4.530149842143130e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.220000000000000e+02 6.808525383000187e-01 -7.084024372581978e-01 -1.804250785475814e-01 -4.530561784332790e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.230000000000000e+02 6.808545354967350e-01 -7.084085516369897e-01 -1.803924981467175e-01 -4.530973486453200e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.240000000000000e+02 6.808565333097875e-01 -7.084146654400594e-01 -1.803599120755737e-01 -4.531384948245440e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.250000000000000e+02 6.808585317482313e-01 -7.084207786567212e-01 -1.803273203326689e-01 -4.531796172255330e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.260000000000000e+02 6.808605307461827e-01 -7.084268913377275e-01 -1.802947229753115e-01 -4.532207154186230e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.270000000000000e+02 6.808625303655046e-01 -7.084330034355817e-01 -1.802621199454352e-01 -4.532617897309750e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.280000000000000e+02 6.808645306111482e-01 -7.084391149463797e-01 -1.802295112367289e-01 -4.533028401655080e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.290000000000000e+02 6.808665314136469e-01 -7.084452259209501e-01 -1.801968969160628e-01 -4.533438664397530e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.300000000000000e+02 6.808685328387164e-01 -7.084513363089135e-01 -1.801642769216742e-01 -4.533848688982390e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.310000000000000e+02 6.808705348799348e-01 -7.084574461156008e-01 -1.801316512563733e-01 -4.534258474463640e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.320000000000000e+02 6.808725374849748e-01 -7.084635553786779e-01 -1.800990199715337e-01 -4.534668019014930e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.330000000000000e+02 6.808745407264242e-01 -7.084696640445132e-01 -1.800663829943334e-01 -4.535077325221610e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.340000000000000e+02 6.808765445274881e-01 -7.084757721686717e-01 -1.800337404004194e-01 -4.535486390395650e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.350000000000000e+02 6.808785489501280e-01 -7.084818797050537e-01 -1.800010921280964e-01 -4.535895216883330e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.360000000000000e+02 6.808805539885986e-01 -7.084879866566256e-01 -1.799684381839022e-01 -4.536303804935630e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.370000000000000e+02 6.808825595851908e-01 -7.084940930654516e-01 -1.799357786234989e-01 -4.536712152250130e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.380000000000000e+02 6.808845657958876e-01 -7.085001988895191e-01 -1.799031133917713e-01 -4.537120261140240e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.390000000000000e+02 6.808865726322215e-01 -7.085063041218627e-01 -1.798704424717370e-01 -4.537528130763220e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.400000000000000e+02 6.808885800162574e-01 -7.085124088174284e-01 -1.798377659436623e-01 -4.537935759310230e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.410000000000000e+02 6.808905880228995e-01 -7.085185129211795e-01 -1.798050837316965e-01 -4.538343149243010e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.420000000000000e+02 6.808925966404363e-01 -7.085246164397966e-01 -1.797723958498352e-01 -4.538750301011960e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.430000000000000e+02 6.808946058156794e-01 -7.085307194127197e-01 -1.797397023476891e-01 -4.539157212047940e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.440000000000000e+02 6.808966156077765e-01 -7.085368217959314e-01 -1.797070031662165e-01 -4.539563884575310e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.450000000000000e+02 6.808986260138759e-01 -7.085429235909795e-01 -1.796742983074390e-01 -4.539970318507640e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.460000000000000e+02 6.809006369722996e-01 -7.085490248429075e-01 -1.796415878308517e-01 -4.540376511360940e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.470000000000000e+02 6.809026485667781e-01 -7.085551254882401e-01 -1.796088716563944e-01 -4.540782467161120e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.480000000000000e+02 6.809046607166711e-01 -7.085612255861896e-01 -1.795761498617157e-01 -4.541188182573490e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.490000000000000e+02 6.809066734762103e-01 -7.085673250978856e-01 -1.795434223889629e-01 -4.541593658670240e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.500000000000000e+02 6.809086868482833e-01 -7.085734240172480e-01 -1.795106892425292e-01 -4.541998897723170e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.510000000000000e+02 6.809107007753857e-01 -7.085795223902923e-01 -1.794779504683220e-01 -4.542403894865620e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.520000000000000e+02 6.809127153146730e-01 -7.085856201711339e-01 -1.794452060170373e-01 -4.542808654336990e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.530000000000000e+02 6.809147304700425e-01 -7.085917173566478e-01 -1.794124558833610e-01 -4.543213176120150e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.540000000000000e+02 6.809167461612653e-01 -7.085978140072384e-01 -1.793797001410882e-01 -4.543617455961240e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.550000000000000e+02 6.809187624832950e-01 -7.086039100509950e-01 -1.793469386994671e-01 -4.544021498396970e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.560000000000000e+02 6.809207794036682e-01 -7.086100055097396e-01 -1.793141715932427e-01 -4.544425303178730e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.570000000000000e+02 6.809227968779552e-01 -7.086161004178703e-01 -1.792813988601950e-01 -4.544828867191410e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.580000000000000e+02 6.809248149786700e-01 -7.086221947206348e-01 -1.792486204300674e-01 -4.545232193730730e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.590000000000000e+02 6.809268336361344e-01 -7.086282884690779e-01 -1.792158363700675e-01 -4.545635279947880e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.600000000000000e+02 6.809288528965587e-01 -7.086343816288192e-01 -1.791830466334801e-01 -4.546038127492950e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.610000000000000e+02 6.809308727638658e-01 -7.086404741944884e-01 -1.791502512202048e-01 -4.546440737751010e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.620000000000000e+02 6.809328931891661e-01 -7.086465662034507e-01 -1.791174501731815e-01 -4.546843107638470e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.630000000000000e+02 6.809349142121880e-01 -7.086526576250545e-01 -1.790846434545153e-01 -4.547245239215630e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.640000000000000e+02 6.809369358509707e-01 -7.086587484448578e-01 -1.790518310470846e-01 -4.547647133568360e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.650000000000000e+02 6.809389580280220e-01 -7.086648387212425e-01 -1.790190130221216e-01 -4.548048786559470e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.660000000000000e+02 6.809409808169218e-01 -7.086709283971335e-01 -1.789861893119021e-01 -4.548450202472730e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.670000000000000e+02 6.809430042157032e-01 -7.086770174745259e-01 -1.789533599149803e-01 -4.548851380560880e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.680000000000000e+02 6.809450281540091e-01 -7.086831060049913e-01 -1.789205248992581e-01 -4.549252317939930e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.690000000000000e+02 6.809470526996855e-01 -7.086891939372164e-01 -1.788876841989991e-01 -4.549653017703370e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.700000000000000e+02 6.809490778541782e-01 -7.086952812695326e-01 -1.788548378121055e-01 -4.550053479957960e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.710000000000000e+02 6.809511035558852e-01 -7.087013680477118e-01 -1.788219857963538e-01 -4.550453701745240e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.720000000000000e+02 6.809531298739107e-01 -7.087074542187775e-01 -1.787891280864303e-01 -4.550853686681940e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.730000000000000e+02 6.809551567347115e-01 -7.087135398378043e-01 -1.787562647506948e-01 -4.551253431037690e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.740000000000000e+02 6.809571842084384e-01 -7.087196248498925e-01 -1.787233957255401e-01 -4.551652939180000e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.750000000000000e+02 6.809592122855965e-01 -7.087257092648864e-01 -1.786905210115027e-01 -4.552052208621420e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.760000000000000e+02 6.809612408943675e-01 -7.087317931328768e-01 -1.786576406840331e-01 -4.552451238042590e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.770000000000000e+02 6.809632701153938e-01 -7.087378763948103e-01 -1.786247546607199e-01 -4.552850029950050e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.780000000000000e+02 6.809652999391334e-01 -7.087439590557560e-01 -1.785918629534919e-01 -4.553248584889750e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.790000000000000e+02 6.809673302969796e-01 -7.087500411674791e-01 -1.785589656251333e-01 -4.553646899116820e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.800000000000000e+02 6.809693612624313e-01 -7.087561226736718e-01 -1.785260626061762e-01 -4.554044976452320e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.810000000000000e+02 6.809713928294867e-01 -7.087622035793449e-01 -1.784931538990471e-01 -4.554442815966870e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.820000000000000e+02 6.809734249366683e-01 -7.087682839290854e-01 -1.784602395640665e-01 -4.554840415403300e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.830000000000000e+02 6.809754576576139e-01 -7.087743636668711e-01 -1.784273195306426e-01 -4.555237778355030e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.840000000000000e+02 6.809774909284921e-01 -7.087804428394224e-01 -1.783943938604884e-01 -4.555634902224500e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.850000000000000e+02 6.809795247865806e-01 -7.087865214201099e-01 -1.783614625127611e-01 -4.556031787566800e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.860000000000000e+02 6.809815592580190e-01 -7.087925993873060e-01 -1.783285254651504e-01 -4.556428436537280e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.870000000000000e+02 6.809835942614045e-01 -7.087986768016250e-01 -1.782955827945016e-01 -4.556824845276870e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.880000000000000e+02 6.809856298581493e-01 -7.088047536168951e-01 -1.782626344402904e-01 -4.557221016364830e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.890000000000000e+02 6.809876660630629e-01 -7.088108298203344e-01 -1.782296803902026e-01 -4.557616951212150e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.900000000000000e+02 6.809897027959312e-01 -7.088169054724142e-01 -1.781967207182155e-01 -4.558012645544500e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.910000000000000e+02 6.809917401362764e-01 -7.088229805134013e-01 -1.781637553464046e-01 -4.558408102760380e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.920000000000000e+02 6.809937780645423e-01 -7.088290549558639e-01 -1.781307842963182e-01 -4.558803322952690e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.930000000000000e+02 6.809958165329454e-01 -7.088351288356377e-01 -1.780978076116843e-01 -4.559198303543690e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.940000000000000e+02 6.809978555933653e-01 -7.088412021129333e-01 -1.780648252428481e-01 -4.559593047151980e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.950000000000000e+02 6.809998952571137e-01 -7.088472747786925e-01 -1.780318371782307e-01 -4.559987554330640e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.960000000000000e+02 6.810019354521004e-01 -7.088533468876873e-01 -1.779988434831693e-01 -4.560381820935310e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.970000000000000e+02 6.810039762578107e-01 -7.088594183787453e-01 -1.779658440831257e-01 -4.560775851298640e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.980000000000000e+02 6.810060176050697e-01 -7.088654893026132e-01 -1.779328390450043e-01 -4.561169642575130e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.990000000000000e+02 6.810080595429023e-01 -7.088715596219997e-01 -1.778998283210010e-01 -4.561563197022770e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.000000000000000e+02 6.810101020781255e-01 -7.088776293319464e-01 -1.778668119021065e-01 -4.561956514524570e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.010000000000000e+02 6.810121451376883e-01 -7.088836984861102e-01 -1.778337898589654e-01 -4.562349592057990e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.020000000000000e+02 6.810141887990662e-01 -7.088897670266296e-01 -1.778007621146855e-01 -4.562742432701820e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.030000000000000e+02 6.810162330521961e-01 -7.088958349582328e-01 -1.777677286834468e-01 -4.563135037444490e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.040000000000000e+02 6.810182778329679e-01 -7.089019023312081e-01 -1.777346896194735e-01 -4.563527401563940e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.050000000000000e+02 6.810203232075799e-01 -7.089079690920732e-01 -1.777016448662802e-01 -4.563919530200060e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.060000000000000e+02 6.810223691734331e-01 -7.089140352458700e-01 -1.776685944169317e-01 -4.564311420941110e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.070000000000000e+02 6.810244156743013e-01 -7.089201008310853e-01 -1.776355383320309e-01 -4.564703073158420e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.080000000000000e+02 6.810264627770446e-01 -7.089261657985555e-01 -1.776024765430099e-01 -4.565094488984420e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.090000000000000e+02 6.810285104226231e-01 -7.089322301918273e-01 -1.775694091062104e-01 -4.565485665793490e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.100000000000000e+02 6.810305586443592e-01 -7.089382939842455e-01 -1.775363359914986e-01 -4.565876605837320e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.110000000000000e+02 6.810326074653478e-01 -7.089443571590238e-01 -1.775032571733386e-01 -4.566267309503310e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.120000000000000e+02 6.810346568094643e-01 -7.089504197721435e-01 -1.774701727253826e-01 -4.566657773623850e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.130000000000000e+02 6.810367067459103e-01 -7.089564817711747e-01 -1.774370825803762e-01 -4.567048001376540e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.140000000000000e+02 6.810387572721706e-01 -7.089625431570388e-01 -1.774039867408901e-01 -4.567437992923030e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.150000000000000e+02 6.810408083217846e-01 -7.089686039806952e-01 -1.773708852660710e-01 -4.567827744130390e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.160000000000000e+02 6.810428599569692e-01 -7.089746641919925e-01 -1.773377781023370e-01 -4.568217259730110e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.170000000000000e+02 6.810449121886879e-01 -7.089807237832272e-01 -1.773046652358094e-01 -4.568606539560540e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.180000000000000e+02 6.810469649423324e-01 -7.089867828114678e-01 -1.772715467334860e-01 -4.568995579117810e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.190000000000000e+02 6.810490182762355e-01 -7.089928412309413e-01 -1.772384225420232e-01 -4.569384382024000e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.200000000000000e+02 6.810510722065449e-01 -7.089988990271111e-01 -1.772052926495194e-01 -4.569772950222150e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.210000000000000e+02 6.810531266556628e-01 -7.090049562603973e-01 -1.771721571232530e-01 -4.570161278370090e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.220000000000000e+02 6.810551817101914e-01 -7.090110128638626e-01 -1.771390158825626e-01 -4.570549371372280e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.230000000000000e+02 6.810572372911720e-01 -7.090170688967409e-01 -1.771058690012700e-01 -4.570937225225740e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.240000000000000e+02 6.810592934599027e-01 -7.090231243124995e-01 -1.770727164196713e-01 -4.571324842754930e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.250000000000000e+02 6.810613502063598e-01 -7.090291791176860e-01 -1.770395581475625e-01 -4.571712223780550e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.260000000000000e+02 6.810634074798574e-01 -7.090352333492478e-01 -1.770063942341844e-01 -4.572099366282570e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.270000000000000e+02 6.810654653331903e-01 -7.090412869666515e-01 -1.769732246288753e-01 -4.572486272934330e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.280000000000000e+02 6.810675237761251e-01 -7.090473399641873e-01 -1.769400493162878e-01 -4.572872942819650e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.290000000000000e+02 6.810695827351571e-01 -7.090533923940712e-01 -1.769068683719928e-01 -4.573259374049080e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.300000000000000e+02 6.810716422795037e-01 -7.090594442041902e-01 -1.768736817277645e-01 -4.573645569576060e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.310000000000000e+02 6.810737024046939e-01 -7.090654953984015e-01 -1.768404893845741e-01 -4.574031528538560e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.320000000000000e+02 6.810757630529478e-01 -7.090715460186111e-01 -1.768072913993834e-01 -4.574417248825620e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.330000000000000e+02 6.810778242969725e-01 -7.090775960093723e-01 -1.767740877022290e-01 -4.574802734016340e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.340000000000000e+02 6.810798860660643e-01 -7.090836454226515e-01 -1.767408783616552e-01 -4.575187981177660e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.350000000000000e+02 6.810819484087633e-01 -7.090896942229294e-01 -1.767076633267141e-01 -4.575572991624150e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.360000000000000e+02 6.810840113444374e-01 -7.090957423950847e-01 -1.766744425780280e-01 -4.575957766279200e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.370000000000000e+02 6.810860747875246e-01 -7.091017900007616e-01 -1.766412162019485e-01 -4.576342302466930e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.380000000000000e+02 6.810881388119088e-01 -7.091078369854313e-01 -1.766079841231059e-01 -4.576726602656120e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.390000000000000e+02 6.810902034157582e-01 -7.091138833487657e-01 -1.765747463451501e-01 -4.577110667506850e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.400000000000000e+02 6.810922685419595e-01 -7.091199291347565e-01 -1.765415029183413e-01 -4.577494493299320e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t</ATTLISTList>\n\t</ATT>\n\t<TIL>monkey</TIL>\n\t<GEO>\n\t\t<EFFECTIVETIME>1959-09-18T00:00:00.000000Z</EFFECTIVETIME>\n\t\t<MODELGENERATIONTIME>1959-12-16T00:00:00.000000Z</MODELGENERATIONTIME>\n\t\t<SATID>Imaginary1</SATID>\n\t\t<PRINCIPAL_DISTANCE>\n\t\t\t<GENERATIONTIME>1959-12-05T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<PD>7.949165000000000e+03</PD>\n\t\t</PRINCIPAL_DISTANCE>\n\t\t<OPTICAL_DISTORTION>\n\t\t\t<GENERATIONTIME>1958-01-01T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<POLYORDER>0</POLYORDER>\n\t\t\t<ALIST>0.000000000000000e+00</ALIST>\n\t\t\t<BLIST>0.000000000000000e+00</BLIST>\n\t\t</OPTICAL_DISTORTION>\n\t\t<PERSPECTIVE_CENTER>\n\t\t\t<GENERATIONTIME>1958-01-01T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<CX>0.000000000000000e+00</CX>\n\t\t\t<CY>0.000000000000000e+00</CY>\n\t\t\t<CZ>0.000000000000000e+00</CZ>\n\t\t</PERSPECTIVE_CENTER>\n\t\t<CAMERA_ATTITUDE>\n\t\t\t<GENERATIONTIME>1959-06-08T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<QCS1>0.000000000000000e+00</QCS1>\n\t\t\t<QCS2>0.000000000000000e+00</QCS2>\n\t\t\t<QCS3>0.000000000000000e+00</QCS3>\n\t\t\t<QCS4>1.000000000000000e+00</QCS4>\n\t\t</CAMERA_ATTITUDE>\n\t\t<DETECTOR_MOUNTING>\n\t\t\t<GENERATIONTIME>1959-12-16T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<BAND_P>\n\t\t\t\t<BANDID>P</BANDID>\n\t\t\t\t<DETECTOR_ARRAY>\n\t\t\t\t\t<DETARRID>1</DETARRID>\n\t\t\t\t\t<DETORIGINX>5.372000000000000e-02</DETORIGINX>\n\t\t\t\t\t<DETORIGINY>1.407119300000000e+02</DETORIGINY>\n\t\t\t\t\t<DETROTANGLE>0.000000000000000e+00</DETROTANGLE>\n\t\t\t\t\t<DETPITCH>8.000000000000000e-03</DETPITCH>\n\t\t\t\t</DETECTOR_ARRAY>\n\t\t\t</BAND_P>\n\t\t</DETECTOR_MOUNTING>\n\t</GEO>\n        \t<RPB>\n\t\t<SATID>IMAGINE01</SATID>\n\t\t<BANDID>P</BANDID>\n\t\t<SPECID>RPC00Y</SPECID>\n\t\t<IMAGE>\n\t\t\t<LINEOFFSET>11856</LINEOFFSET>\n\t\t\t<SAMPOFFSET>17564</SAMPOFFSET>\n\t\t\t<LATOFFSET>3.774540000000000e+01</LATOFFSET>\n\t\t\t<LONGOFFSET>-1.032903000000000e+02</LONGOFFSET>\n\t\t\t<HEIGHTOFFSET>2287</HEIGHTOFFSET>\n\t\t\t<LINESCALE>12383</LINESCALE>\n\t\t\t<SAMPSCALE>17929</SAMPSCALE>\n\t\t\t<LATSCALE>1.003050000000000e-01</LATSCALE>\n\t\t\t<LONGSCALE>1.345060000000000e-01</LONGSCALE>\n\t\t\t<HEIGHTSCALE>638</HEIGHTSCALE>\n\t\t\t<LINENUMCOEFList>\n\t\t\t\t<LINENUMCOEF>4.64662000000000e-03 2.746477000000000e-01 -1.231100000000000e+00 4.273921000000000e-02 1.233612000000000e-04 2.079892000000000e-05 2.803797000000000e-05 -1.625616000000000e-03 -3.560082000000000e-03 9.375819999999999e-06 -2.546898000000000e-06 2.437124000000000e-06 2.683441000000000e-05 2.832873000000000e-06 -1.765243000000000e-05 -6.187956999999999e-05 -1.335746000000000e-05 4.754263000000000e-07 8.598401000000000e-06 4.395393000000000e-06</LINENUMCOEF>\n\t\t\t</LINENUMCOEFList>\n\t\t\t<LINEDENCOEFList>\n\t\t\t\t<LINEDENCOEF>1.000000000000000e+00 -7.927463000000000e-04 1.274485000000000e-03 -1.732948000000000e-04 3.733725000000000e-05 -2.416451000000000e-06 5.358107000000000e-06 5.2042993000000000e-06 -5.045604000000000e-05 1.005969000000000e-05 -1.014973000000000e-05 3.421277000000000e-06 2.035450000000000e-04 -8.247975000000000e-08 -4.562828000000000e-05 -3.053413000000000e-04 3.611736000000000e-07 1.162165000000000e-06 2.272529000000000e-05 -3.711560000000000e-08</LINEDENCOEF>\n\t\t\t</LINEDENCOEFList>\n\t\t\t<SAMPNUMCOEFList>\n\t\t\t\t<SAMPNUMCOEF>-7.306375000000000e-03 9.830429000000001e-01 3.542948000000000e-03 -1.894230000000000e-02 -6.090531000000000e-04 5.183200000000000e-04 -1.865072000000000e-04 7.436490000000000e-03 -6.180940000000000e-04 -7.676881000000001e-06 -4.251489000000000e-06 3.392046000000000e-05 7.682103000000000e-06 -3.827847000000000e-06 1.743396000000000e-05 -8.450706000000000e-05 -8.998127000000000e-07 7.975684000000000e-06 9.288044000000000e-06 -1.585929000000000e-06</SAMPNUMCOEF>\n\t\t\t</SAMPNUMCOEFList>\n\t\t\t<SAMPDENCOEFList>\n\t\t\t\t<SAMPDENCOEF>1.000000000000000e+00 -1.162718000000000e-04 6.204958000000000e-04 -6.463894000000000e-04 -1.800104000000000e-05 -3.829136000000000e-06 2.878440000000000e-06 1.192222000000000e-05 -1.355693000000000e-05 -5.064440000000000e-06 -4.852090000000000e-08 -4.637834000000000e-08 5.601284000000000e-07 2.741121000000000e-08 -8.104437000000000e-07 7.045655000000000e-07 0.000000000000000e+00 -5.420071000000000e-08 -5.402048000000000e-08 -1.211995000000000e-07</SAMPDENCOEF>\n\t\t\t</SAMPDENCOEFList>\n\t\t</IMAGE>\n\t</RPB>\n</isd>\n"
  },
  {
    "path": "src/asp/Camera/tests/sample.RPB",
    "content": "satId = \"sc00110\";\nbandId = \"c1_PAN\";\nSpecId = \"RPC00B\";\nBEGIN_GROUP = IMAGE\n\terrBias =   0.02;\n\terrRand =   0.03;\n\tlineOffset =   531.0;\n\tsampOffset =  1278.0;\n\tlatOffset =  37.619800;\n\tlongOffset = -122.373300;\n\theightOffset =  -40.00;\n\tlineScale =   531.0;\n\tsampScale =  1278.0;\n\tlatScale =   0.011500;\n\tlongScale =    0.020600;\n\theightScale =  580.00;\n\tlineNumCoef = (\n\t\t 9.318045017e-03,\n\t\t-5.508823053e-01,\n\t\t-2.364340703e+00,\n\t\t-3.071606965e-01,\n\t\t 1.478389904e+00,\n\t\t 8.440748673e-01,\n\t\t 3.078921569e+00,\n\t\t 2.900906367e-01,\n\t\t 4.718241664e-01,\n\t\t 3.749347695e-01,\n\t\t 6.910711609e+00,\n\t\t 1.915340522e+00,\n\t\t 1.509441224e+01,\n\t\t 7.709535170e-01,\n\t\t 1.088127807e+01,\n\t\t 1.687799834e+01,\n\t\t-2.301142036e-01,\n\t\t 2.434723000e+00,\n\t\t-2.434911706e-01,\n\t\t 1.342808018e-02);\n\tlineDenCoef = (\n\t\t 1.000000000e+00,\n\t\t-5.935009269e-01,\n\t\t-2.274207258e-01,\n\t\t-1.272214359e+00,\n\t\t-4.740295946e+00,\n\t\t-2.560207845e+00,\n\t\t 9.959442978e-01,\n\t\t-3.511033902e+00,\n\t\t-7.145089853e+00,\n\t\t-2.516117870e-02,\n\t\t 2.969571273e-03,\n\t\t 5.605685421e-03,\n\t\t 8.803055003e-03,\n\t\t 2.476267065e-03,\n\t\t 5.738761395e-03,\n\t\t-3.606373386e-03,\n\t\t-2.219523225e-03,\n\t\t 8.317793510e-03,\n\t\t 9.416783177e-03,\n\t\t-5.677814480e-03);\n\tsampNumCoef = (\n\t\t-2.929216508e-03,\n\t\t 1.392781931e+00,\n\t\t-2.321862543e-01,\n\t\t 1.374836054e-01,\n\t\t-2.453196168e-01,\n\t\t-2.041146900e-01,\n\t\t-1.433836694e-02,\n\t\t-8.727822488e-01,\n\t\t 8.902139391e-02,\n\t\t-1.147072498e-02,\n\t\t-2.991008172e+00,\n\t\t-4.924477511e+00,\n\t\t-8.839292317e+00,\n\t\t-3.956845118e-01,\n\t\t-5.587423001e+00,\n\t\t 1.661046811e+00,\n\t\t-2.233445422e-01,\n\t\t-2.208923683e+00,\n\t\t-5.346737767e-01,\n\t\t-2.114068368e-02);\n\tsampDenCoef = (\n\t\t 1.000000000e+00,\n\t\t-6.345567885e-01,\n\t\t-2.907310635e-01,\n\t\t-8.791516709e-02,\n\t\t-4.611410138e+00,\n\t\t-1.237998272e+00,\n\t\t-1.902775739e+00,\n\t\t-3.540698264e+00,\n\t\t-7.128017431e+00,\n\t\t-1.619988714e-01,\n\t\t 3.039575996e-03,\n\t\t-1.368501979e-03,\n\t\t-1.054400076e-02,\n\t\t 1.501293403e-03,\n\t\t-8.119659279e-03,\n\t\t-1.199720923e-02,\n\t\t 2.254479075e-03,\n\t\t 3.858787500e-03,\n\t\t 5.672344142e-03,\n\t\t-1.950670407e-03);\nEND_GROUP = IMAGE\nEND;\n"
  },
  {
    "path": "src/asp/Camera/tests/spot_example1.xml",
    "content": "<?xml version='1.0' encoding='UTF-8'?>\n<?xml-stylesheet href=\"spot_style.xsl\" type=\"text/xsl\" ?>\n<Dimap_Document xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:noNamespaceSchemaLocation='Spot_Scene.xsd' name='spot_example1.xml'>\n<Metadata_Id>\n<METADATA_FORMAT version='1.1'>DIMAP</METADATA_FORMAT>\n<METADATA_PROFILE>SPOTSEGMENT_1A</METADATA_PROFILE>\n</Metadata_Id>\n<Dataset_Id>\n<DATASET_NAME>SEGMENT S5 S 1 S 08/03/04 12:31:03.1</DATASET_NAME>\n<COPYRIGHT>COPYRIGHT CNES 04 03 2008 12 H 31 MN 03 S</COPYRIGHT>\n<DATASET_QL_PATH href='PREVIEW.JPG'></DATASET_QL_PATH>\n<DATASET_QL_FORMAT version='6b'>JPEG</DATASET_QL_FORMAT>\n<DATASET_TN_PATH href='ICON.JPG'></DATASET_TN_PATH>\n<DATASET_TN_FORMAT version='6b'>JPEG</DATASET_TN_FORMAT>\n</Dataset_Id>\n<Dataset_Frame>\n<Vertex>\n<FRAME_LON>-75.519946</FRAME_LON>\n<FRAME_LAT>-76.636309</FRAME_LAT>\n<FRAME_ROW>1</FRAME_ROW>\n<FRAME_COL>1</FRAME_COL>\n</Vertex>\n<Vertex>\n<FRAME_LON>-71.924271</FRAME_LON>\n<FRAME_LAT>-77.389028</FRAME_LAT>\n<FRAME_ROW>1</FRAME_ROW>\n<FRAME_COL>300</FRAME_COL>\n</Vertex>\n<Vertex>\n<FRAME_LON>-88.569672</FRAME_LON>\n<FRAME_LAT>-80.241112</FRAME_LAT>\n<FRAME_ROW>96168</FRAME_ROW>\n<FRAME_COL>300</FRAME_COL>\n</Vertex>\n<Vertex>\n<FRAME_LON>-91.818476</FRAME_LON>\n<FRAME_LAT>-79.298919</FRAME_LAT>\n<FRAME_ROW>96168</FRAME_ROW>\n<FRAME_COL>1</FRAME_COL>\n</Vertex>\n<Scene_Center>\n<FRAME_LON>-81.063053</FRAME_LON>\n<FRAME_LAT>-78.506964</FRAME_LAT>\n<FRAME_ROW>48085</FRAME_ROW>\n<FRAME_COL>150</FRAME_COL>\n</Scene_Center>\n<SCENE_ORIENTATION>49.713950</SCENE_ORIENTATION>\n</Dataset_Frame>\n<Coordinate_Reference_System>\n<GEO_TABLES version='5.2'>EPSG</GEO_TABLES>\n<Horizontal_CS>\n<HORIZONTAL_CS_CODE>epsg:4326</HORIZONTAL_CS_CODE>\n<HORIZONTAL_CS_TYPE>GEOGRAPHIC</HORIZONTAL_CS_TYPE>\n<HORIZONTAL_CS_NAME>WGS 84</HORIZONTAL_CS_NAME>\n</Horizontal_CS>\n</Coordinate_Reference_System>\n<Raster_CS>\n<RASTER_CS_TYPE>POINT</RASTER_CS_TYPE>\n<PIXEL_ORIGIN>1</PIXEL_ORIGIN>\n</Raster_CS>\n<Geoposition>\n<Geoposition_Points>\n<Tie_Point>\n<TIE_POINT_CRS_X>-75.519946</TIE_POINT_CRS_X>\n<TIE_POINT_CRS_Y>-76.636309</TIE_POINT_CRS_Y>\n<TIE_POINT_CRS_Z>0.000000</TIE_POINT_CRS_Z>\n<TIE_POINT_DATA_X>1.000000</TIE_POINT_DATA_X>\n<TIE_POINT_DATA_Y>1.000000</TIE_POINT_DATA_Y>\n</Tie_Point>\n<Tie_Point>\n<TIE_POINT_CRS_X>-71.924271</TIE_POINT_CRS_X>\n<TIE_POINT_CRS_Y>-77.389028</TIE_POINT_CRS_Y>\n<TIE_POINT_CRS_Z>0.000000</TIE_POINT_CRS_Z>\n<TIE_POINT_DATA_X>12000.000000</TIE_POINT_DATA_X>\n<TIE_POINT_DATA_Y>1.000000</TIE_POINT_DATA_Y>\n</Tie_Point>\n<Tie_Point>\n<TIE_POINT_CRS_X>-88.569672</TIE_POINT_CRS_X>\n<TIE_POINT_CRS_Y>-80.241112</TIE_POINT_CRS_Y>\n<TIE_POINT_CRS_Z>0.000000</TIE_POINT_CRS_Z>\n<TIE_POINT_DATA_X>12000.000000</TIE_POINT_DATA_X>\n<TIE_POINT_DATA_Y>96168.000000</TIE_POINT_DATA_Y>\n</Tie_Point>\n<Tie_Point>\n<TIE_POINT_CRS_X>-91.818476</TIE_POINT_CRS_X>\n<TIE_POINT_CRS_Y>-79.298919</TIE_POINT_CRS_Y>\n<TIE_POINT_CRS_Z>0.000000</TIE_POINT_CRS_Z>\n<TIE_POINT_DATA_X>1.000000</TIE_POINT_DATA_X>\n<TIE_POINT_DATA_Y>96168.000000</TIE_POINT_DATA_Y>\n</Tie_Point>\n</Geoposition_Points>\n\n<Simplified_Location_Model>\n<Direct_Location_Model>\n<lc_List>\n<lc>-7.5560649386e+01</lc>\n<lc>-1.2976212651e-04</lc>\n<lc>2.8600829541e-04</lc>\n<lc>-2.9284213207e-10</lc>\n<lc>-4.1257262919e-10</lc>\n<lc>1.6484672095e-09</lc>\n</lc_List>\n<pc_List>\n<pc>-7.6635614572e+01</pc>\n<pc>-3.2338993789e-05</pc>\n<pc>-6.4084400701e-05</pc>\n<pc>-1.6460209928e-10</pc>\n<pc>4.8069271919e-11</pc>\n<pc>1.2624430549e-10</pc>\n</pc_List>\n</Direct_Location_Model>\n\n<Reverse_Location_Model>\n<lc_List>\n<lc>-3199166.022880</lc>\n<lc>-43137.711806</lc>\n<lc>-20966.303248</lc>\n<lc>-267.539086</lc>\n<lc>-44.693625</lc>\n<lc>21.174976</lc>\n</lc_List>\n<pc_List>\n<pc>299074.641282</pc>\n<pc>1205.106966</pc>\n<pc>12639.635136</pc>\n<pc>113.900926</pc>\n<pc>1.371322</pc>\n<pc>14.125565</pc>\n</pc_List>\n</Reverse_Location_Model>\n</Simplified_Location_Model>\n</Geoposition>\n<Image_Display>\n<Band_Display_Order>\n<RED_CHANNEL>1</RED_CHANNEL>\n<GREEN_CHANNEL>1</GREEN_CHANNEL>\n<BLUE_CHANNEL>1</BLUE_CHANNEL>\n</Band_Display_Order>\n<Special_Value>\n<SPECIAL_VALUE_INDEX>255</SPECIAL_VALUE_INDEX>\n<SPECIAL_VALUE_TEXT>SATURATED</SPECIAL_VALUE_TEXT>\n<Special_Value_Color>\n<RED_LEVEL>1</RED_LEVEL>\n<GREEN_LEVEL>1</GREEN_LEVEL>\n<BLUE_LEVEL>1</BLUE_LEVEL>\n</Special_Value_Color>\n</Special_Value>\n<Special_Value>\n<SPECIAL_VALUE_INDEX>0</SPECIAL_VALUE_INDEX>\n<SPECIAL_VALUE_TEXT>NODATA</SPECIAL_VALUE_TEXT>\n<Special_Value_Color>\n<RED_LEVEL>0</RED_LEVEL>\n<GREEN_LEVEL>0</GREEN_LEVEL>\n<BLUE_LEVEL>0</BLUE_LEVEL>\n</Special_Value_Color>\n</Special_Value>\n</Image_Display>\n<Production>\n<JOB_ID>331017101</JOB_ID>\n<PRODUCT_TYPE>SQASSV20</PRODUCT_TYPE>\n<PRODUCT_INFO>Spot SYSTEM SEGMENT level 1A</PRODUCT_INFO>\n<DATASET_PRODUCER_NAME>SPOT_IMAGE</DATASET_PRODUCER_NAME>\n<DATASET_PRODUCER_URL href='http://www.spotimage.fr'></DATASET_PRODUCER_URL>\n<DATASET_PRODUCTION_DATE>2009-03-20T14:33:23.448000</DATASET_PRODUCTION_DATE>\n<Production_Facility>\n<SOFTWARE_NAME>CAP_T</SOFTWARE_NAME>\n<SOFTWARE_VERSION>SPOT5_V07_03P4</SOFTWARE_VERSION>\n<PROCESSING_CENTER>SLS_TOULOUSE</PROCESSING_CENTER>\n</Production_Facility>\n</Production>\n<Dataset_Sources>\n<Source_Information>\n<SOURCE_TYPE>SEGMENT</SOURCE_TYPE>\n<SOURCE_ID>S5S1S0803041231031</SOURCE_ID>\n<SOURCE_DESCRIPTION>SEGMENT HRS1 S</SOURCE_DESCRIPTION>\n<Scene_Source>\n<IMAGING_DATE>2008-03-04</IMAGING_DATE>\n<IMAGING_TIME>12:31:39</IMAGING_TIME>\n<MISSION>SPOT</MISSION>\n<MISSION_INDEX>5</MISSION_INDEX>\n<INSTRUMENT>HRS</INSTRUMENT>\n<INSTRUMENT_INDEX>1</INSTRUMENT_INDEX>\n<SENSOR_CODE>S</SENSOR_CODE>\n<SCENE_PROCESSING_LEVEL>0</SCENE_PROCESSING_LEVEL>\n<INCIDENCE_ANGLE>-22.885488</INCIDENCE_ANGLE>\n<VIEWING_ANGLE>0.000000</VIEWING_ANGLE>\n<SUN_AZIMUTH>77.673760</SUN_AZIMUTH>\n<SUN_ELEVATION>9.100812</SUN_ELEVATION>\n<Imaging_Parameters>\n<REVOLUTION_NUMBER>157</REVOLUTION_NUMBER>\n<COMPRESSION_MODE>DCT</COMPRESSION_MODE>\n<DIRECT_PLAYBACK_INDICATOR>MX</DIRECT_PLAYBACK_INDICATOR>\n<SWATH_MODE>FULL</SWATH_MODE>\n</Imaging_Parameters>\n</Scene_Source>\n</Source_Information>\n</Dataset_Sources>\n<Raster_Dimensions>\n<NCOLS>300</NCOLS>\n<NROWS>96168</NROWS>\n<NBANDS>1</NBANDS>\n</Raster_Dimensions>\n<Raster_Encoding>\n<NBITS>8</NBITS>\n<BYTEORDER>I</BYTEORDER>\n<SKIPBYTES>0</SKIPBYTES>\n<BANDS_LAYOUT>BIL</BANDS_LAYOUT>\n<COMPRESSION_NAME>NONE</COMPRESSION_NAME>\n<DATA_TYPE>UNSIGNED</DATA_TYPE>\n</Raster_Encoding>\n<Data_Access>\n<DATA_FILE_ORGANISATION>BAND_COMPOSITE</DATA_FILE_ORGANISATION>\n<DATA_FILE_FORMAT>RAW</DATA_FILE_FORMAT>\n<DATA_FILE_FORMAT_DESC>BIL</DATA_FILE_FORMAT_DESC>\n<Data_File>\n<DATA_FILE_PATH href='IMAGERY.BIL'></DATA_FILE_PATH>\n</Data_File>\n</Data_Access>\n<Data_Processing>\n<PROCESSING_LEVEL>1A</PROCESSING_LEVEL>\n<GEOMETRIC_PROCESSING>RAW</GEOMETRIC_PROCESSING>\n<RADIOMETRIC_PROCESSING>SYSTEM</RADIOMETRIC_PROCESSING>\n<Processing_Options>\n<Dynamic_Stretch>\n<Thresholds>\n<BAND_INDEX>1</BAND_INDEX>\n<LOW_THRESHOLD>1</LOW_THRESHOLD>\n<HIGH_THRESHOLD>255</HIGH_THRESHOLD>\n</Thresholds>\n</Dynamic_Stretch>\n<DECOMPRESSION_TYPE>QIA+C</DECOMPRESSION_TYPE>\n<Deconvolution>\n<KERNEL_ID>0</KERNEL_ID>\n<KERNEL_DATE>1950-01-01T00:00:00.000000</KERNEL_DATE>\n</Deconvolution>\n<Correction_Algorithm>\n<ALGORITHM_TYPE>DCT_COMPRESSION_CORRECTION</ALGORITHM_TYPE>\n<ALGORITHM_NAME>DCT_COMPRESSION_CORRECTION</ALGORITHM_NAME>\n<ALGORITHM_ACTIVATION>N</ALGORITHM_ACTIVATION>\n</Correction_Algorithm>\n</Processing_Options>\n</Data_Processing>\n<Image_Interpretation>\n<Spectral_Band_Info>\n<BAND_DESCRIPTION>PAN</BAND_DESCRIPTION>\n<PHYSICAL_UNIT>equivalent radiance (W.m-2.Sr-1.um-1)</PHYSICAL_UNIT>\n<PHYSICAL_BIAS>0.000000</PHYSICAL_BIAS>\n<PHYSICAL_GAIN>1.282918</PHYSICAL_GAIN>\n<PHYSICAL_CALIBRATION_DATE>2000-03-01T00:00:00.000000</PHYSICAL_CALIBRATION_DATE>\n<BAND_INDEX>1</BAND_INDEX>\n</Spectral_Band_Info>\n</Image_Interpretation>\n<Data_Strip>\n<Data_Strip_Identification>\n<DATA_STRIP_ID>S5S1S0803041231031</DATA_STRIP_ID>\n</Data_Strip_Identification>\n\n<Satellite_Time>\n<UT_DATE>21247 45064.160035</UT_DATE>\n<CLOCK_VALUE>4201790976</CLOCK_VALUE>\n<CLOCK_PERIOD>3.9062410727e-03</CLOCK_PERIOD>\n<BOARD_TIME>4201790976</BOARD_TIME>\n<TAI_TUC>33</TAI_TUC>\n</Satellite_Time>\n\n<Ephemeris>\n<SATELLITE_ALTITUDE>853502.971972</SATELLITE_ALTITUDE>\n<NADIR_LAT>-76.520028</NADIR_LAT>\n<NADIR_LON>-71.790643</NADIR_LON>\n<Points>\n<Point>\n<Location>\n<X>1.7495691231e+06</X>\n<Y>-2.2672541162e+06</Y>\n<Z>-6.6183333707e+06</Z>\n</Location>\n<Velocity>\n<X>-6.2538959540e+03</X>\n<Y>3.1331303950e+03</Y>\n<Z>-2.7272519760e+03</Z>\n</Velocity>\n<TIME>2008-03-04T12:28:27.000000</TIME>\n</Point>\n<Point>\n<Location>\n<X>1.5613605504e+06</X>\n<Y>-2.1717893254e+06</Y>\n<Z>-6.6969776103e+06</Z>\n</Location>\n<Velocity>\n<X>-6.2922791080e+03</X>\n<Y>3.2307123710e+03</Y>\n<Z>-2.5152848660e+03</Z>\n</Velocity>\n<TIME>2008-03-04T12:28:57.000000</TIME>\n</Point>\n<Point>\n<Location>\n<X>1.3720962960e+06</X>\n<Y>-2.0734405370e+06</Y>\n<Z>-6.7692267226e+06</Z>\n</Location>\n<Velocity>\n<X>-6.3242716390e+03</X>\n<Y>3.3253773500e+03</Y>\n<Z>-2.3009438260e+03</Z>\n</Velocity>\n<TIME>2008-03-04T12:29:27.000000</TIME>\n</Point>\n<Point>\n<Location>\n<X>1.1819683237e+06</X>\n<Y>-1.9722970102e+06</Y>\n<Z>-6.8350125303e+06</Z>\n</Location>\n<Velocity>\n<X>-6.3498582640e+03</X>\n<Y>3.4170091580e+03</Y>\n<Z>-2.0844318930e+03</Z>\n</Velocity>\n<TIME>2008-03-04T12:29:57.000000</TIME>\n</Point>\n<Point>\n<Location>\n<X>9.9116895999e+05</X>\n<Y>-1.8684514484e+06</Y>\n<Z>-6.8942729756e+06</Z>\n</Location>\n<Velocity>\n<X>-6.3690301090e+03</X>\n<Y>3.5054943780e+03</Y>\n<Z>-1.8659539520e+03</Z>\n</Velocity>\n<TIME>2008-03-04T12:30:27.000000</TIME>\n</Point>\n<Point>\n<Location>\n<X>7.9989070129e+05</X>\n<Y>-1.7619999146e+06</Y>\n<Z>-6.9469521725e+06</Z>\n</Location>\n<Velocity>\n<X>-6.3817846990e+03</X>\n<Y>3.5907224880e+03</Y>\n<Z>-1.6457165640e+03</Z>\n</Velocity>\n<TIME>2008-03-04T12:30:57.000000</TIME>\n</Point>\n<Point>\n<Location>\n<X>6.0832602248e+05</X>\n<Y>-1.6530417422e+06</Y>\n<Z>-6.9930004548e+06</Z>\n</Location>\n<Velocity>\n<X>-6.3881259460e+03</X>\n<Y>3.6725859930e+03</Y>\n<Z>-1.4239277650e+03</Z>\n</Velocity>\n<TIME>2008-03-04T12:31:27.000000</TIME>\n</Point>\n<Point>\n<Location>\n<X>4.1666718582e+05</X>\n<Y>-1.5416794427e+06</Y>\n<Z>-7.0323744171e+06</Z>\n</Location>\n<Velocity>\n<X>-6.3880641040e+03</X>\n<Y>3.7509805410e+03</Y>\n<Z>-1.2007968730e+03</Z>\n</Velocity>\n<TIME>2008-03-04T12:31:57.000000</TIME>\n</Point>\n<Point>\n<Location>\n<X>2.2510605159e+05</X>\n<Y>-1.4280186094e+06</Y>\n<Z>-7.0650369501e+06</Z>\n</Location>\n<Velocity>\n<X>-6.3816157100e+03</X>\n<Y>3.8258050340e+03</Y>\n<Z>-9.7653430460e+02</Z>\n</Velocity>\n<TIME>2008-03-04T12:32:27.000000</TIME>\n</Point>\n<Point>\n<Location>\n<X>3.3833890323e+04</X>\n<Y>-1.3121678187e+06</Y>\n<Z>-7.0909572719e+06</Z>\n</Location>\n<Velocity>\n<X>-6.3688035330e+03</X>\n<Y>3.8969617210e+03</Y>\n<Z>-7.5135141360e+02</Z>\n</Velocity>\n<TIME>2008-03-04T12:32:57.000000</TIME>\n</Point>\n<Point>\n<Location>\n<X>-1.5695880356e+05</X>\n<Y>-1.1942385283e+06</Y>\n<Z>-7.1101109530e+06</Z>\n</Location>\n<Velocity>\n<X>-6.3496565420e+03</X>\n<Y>3.9643562960e+03</Y>\n<Z>-5.2546034740e+02</Z>\n</Velocity>\n<TIME>2008-03-04T12:33:27.000000</TIME>\n</Point>\n<Point>\n<Location>\n<X>-3.4708249746e+05</X>\n<Y>-1.0743449716e+06</Y>\n<Z>-7.1224799386e+06</Z>\n</Location>\n<Velocity>\n<X>-6.3242098850e+03</X>\n<Y>4.0278980180e+03</Y>\n<Z>-2.9907388240e+02</Z>\n</Velocity>\n<TIME>2008-03-04T12:33:57.000000</TIME>\n</Point>\n<Point>\n<Location>\n<X>-5.3634880554e+05</X>\n<Y>-9.5260404934e+05</Y>\n<Z>-7.1280525641e+06</Z>\n</Location>\n<Velocity>\n<X>-6.2925048610e+03</X>\n<Y>4.0874998320e+03</Y>\n<Z>-7.2405237150e+01</Z>\n</Velocity>\n<TIME>2008-03-04T12:34:27.000000</TIME>\n</Point>\n</Points>\n<DORIS_USED>Y</DORIS_USED>\n<Doris_Points>\n<Doris_Point>\n<TIME>2008-03-04T12:31:20.000000</TIME>\n<Location>\n<X>8.6369144000e+07</X>\n<Y>-1.7977672500e+08</Y>\n<Z>-6.9301268900e+08</Z>\n</Location>\n<Velocity>\n<X>-6.3782470000e+06</X>\n<Y>3.5626830000e+06</Y>\n<Z>-1.7193120000e+06</Z>\n</Velocity>\n<ERROR_ESTIMATION>1.0000000000e+01</ERROR_ESTIMATION>\n</Doris_Point>\n<Doris_Point>\n<TIME>2008-03-04T12:31:30.000000</TIME>\n<Location>\n<X>7.9989070000e+07</X>\n<Y>-1.7619999100e+08</Y>\n<Z>-6.9469521700e+08</Z>\n</Location>\n<Velocity>\n<X>-6.3817850000e+06</X>\n<Y>3.5907240000e+06</Y>\n<Z>-1.6457170000e+06</Z>\n</Velocity>\n<ERROR_ESTIMATION>1.1000000000e+01</ERROR_ESTIMATION>\n</Doris_Point>\n<Doris_Point>\n<TIME>2008-03-04T12:31:40.000000</TIME>\n<Location>\n<X>7.3605814000e+07</X>\n<Y>-1.7259540400e+08</Y>\n<Z>-6.9630406400e+08</Z>\n</Location>\n<Velocity>\n<X>-6.3846110000e+06</X>\n<Y>3.6183910000e+06</Y>\n<Z>-1.5719490000e+06</Z>\n</Velocity>\n<ERROR_ESTIMATION>1.1000000000e+01</ERROR_ESTIMATION>\n</Doris_Point>\n<Doris_Point>\n<TIME>2008-03-04T12:31:50.000000</TIME>\n<Location>\n<X>6.7220087000e+07</X>\n<Y>-1.6896333800e+08</Y>\n<Z>-6.9783906000e+08</Z>\n</Location>\n<Velocity>\n<X>-6.3867250000e+06</X>\n<Y>3.6456800000e+06</Y>\n<Z>-1.4980170000e+06</Z>\n</Velocity>\n<ERROR_ESTIMATION>1.1000000000e+01</ERROR_ESTIMATION>\n</Doris_Point>\n<Doris_Point>\n<TIME>2008-03-04T12:32:00.000000</TIME>\n<Location>\n<X>6.0832602000e+07</X>\n<Y>-1.6530417500e+08</Y>\n<Z>-6.9930004500e+08</Z>\n</Location>\n<Velocity>\n<X>-6.3881260000e+06</X>\n<Y>3.6725870000e+06</Y>\n<Z>-1.4239280000e+06</Z>\n</Velocity>\n<ERROR_ESTIMATION>1.2000000000e+01</ERROR_ESTIMATION>\n</Doris_Point>\n<Doris_Point>\n<TIME>2008-03-04T12:32:10.000000</TIME>\n<Location>\n<X>5.4444073000e+07</X>\n<Y>-1.6161829500e+08</Y>\n<Z>-7.0068686600e+08</Z>\n</Location>\n<Velocity>\n<X>-6.3888170000e+06</X>\n<Y>3.6991090000e+06</Y>\n<Z>-1.3496900000e+06</Z>\n</Velocity>\n<ERROR_ESTIMATION>1.2000000000e+01</ERROR_ESTIMATION>\n</Doris_Point>\n<Doris_Point>\n<TIME>2008-03-04T12:32:20.000000</TIME>\n<Location>\n<X>4.8055208000e+07</X>\n<Y>-1.5790608800e+08</Y>\n<Z>-7.0199937800e+08</Z>\n</Location>\n<Velocity>\n<X>-6.3887960000e+06</X>\n<Y>3.7252420000e+06</Y>\n<Z>-1.2753100000e+06</Z>\n</Velocity>\n<ERROR_ESTIMATION>1.2000000000e+01</ERROR_ESTIMATION>\n</Doris_Point>\n<Doris_Point>\n<TIME>2008-03-04T12:32:30.000000</TIME>\n<Location>\n<X>4.1666717000e+07</X>\n<Y>-1.5416794400e+08</Y>\n<Z>-7.0323744200e+08</Z>\n</Location>\n<Velocity>\n<X>-6.3880650000e+06</X>\n<Y>3.7509820000e+06</Y>\n<Z>-1.2007970000e+06</Z>\n</Velocity>\n<ERROR_ESTIMATION>1.2000000000e+01</ERROR_ESTIMATION>\n</Doris_Point>\n</Doris_Points>\n<Orbital_Bulletin>\n<UT_DATE>21245 80579.999999</UT_DATE>\n<ELLIPSE_AXIS>7.2004926200e+06</ELLIPSE_AXIS>\n<ELLIPSE_ECCENTRICITY_VECTOR_EX>4.1950000000e-05</ELLIPSE_ECCENTRICITY_VECTOR_EX>\n<ELLIPSE_ECCENTRICITY_VECTOR_EY>1.1452500000e-03</ELLIPSE_ECCENTRICITY_VECTOR_EY>\n<ELLIPSE_INCLINATION>1.7224965660e+00</ELLIPSE_INCLINATION>\n<RIGHT_ASCENSION>2.3705628420e+00</RIGHT_ASCENSION>\n<LATITUDE_ARGUMENT>1.0317291540e+00</LATITUDE_ARGUMENT>\n<P7>8.6383808093e-17</P7>\n<P8>0.0000000000e+00</P8>\n<P9>2.6179199219e+00</P9>\n<P10>6.0000610352e-01</P10>\n</Orbital_Bulletin>\n</Ephemeris>\n\n<Satellite_Attitudes>\n<Raw_Attitudes>\n<Aocs_Attitude>\n<Angles_List>\n<Angles>\n<TIME>2008-03-04T12:31:03.081912</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>3.1999999225e-06</PITCH>\n<ROLL>-3.1999999225e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:04.081910</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>4.0000000340e-06</PITCH>\n<ROLL>-3.1999999225e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:05.081908</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>4.0000000340e-06</PITCH>\n<ROLL>-3.1999999225e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:06.081906</TIME>\n<YAW>-5.6000000825e-06</YAW>\n<PITCH>3.1999999225e-06</PITCH>\n<ROLL>-2.3999999855e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:07.081903</TIME>\n<YAW>-5.6000000825e-06</YAW>\n<PITCH>3.1999999225e-06</PITCH>\n<ROLL>-1.5999999961e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:08.081901</TIME>\n<YAW>-5.6000000825e-06</YAW>\n<PITCH>2.3999999855e-06</PITCH>\n<ROLL>-1.5999999961e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:09.081899</TIME>\n<YAW>-5.6000000825e-06</YAW>\n<PITCH>2.3999999855e-06</PITCH>\n<ROLL>-1.5999999961e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:10.081896</TIME>\n<YAW>-5.6000000825e-06</YAW>\n<PITCH>2.3999999855e-06</PITCH>\n<ROLL>-1.5999999961e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:11.081894</TIME>\n<YAW>-5.6000000825e-06</YAW>\n<PITCH>2.3999999855e-06</PITCH>\n<ROLL>-1.5999999961e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:12.081892</TIME>\n<YAW>-5.6000000825e-06</YAW>\n<PITCH>2.3999999855e-06</PITCH>\n<ROLL>-1.5999999961e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:13.081890</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>2.3999999855e-06</PITCH>\n<ROLL>-2.3999999855e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:14.081887</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>2.3999999855e-06</PITCH>\n<ROLL>-2.3999999855e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:15.081885</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>3.1999999225e-06</PITCH>\n<ROLL>-3.1999999225e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:16.081883</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>3.1999999225e-06</PITCH>\n<ROLL>-3.1999999225e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:17.081880</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>3.1999999225e-06</PITCH>\n<ROLL>-3.1999999225e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:18.081878</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>2.3999999855e-06</PITCH>\n<ROLL>-3.1999999225e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:19.081876</TIME>\n<YAW>-4.0000000340e-06</YAW>\n<PITCH>1.5999999961e-06</PITCH>\n<ROLL>-3.1999999225e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:20.081874</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>1.5999999961e-06</PITCH>\n<ROLL>-3.1999999225e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:21.081871</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>1.5999999961e-06</PITCH>\n<ROLL>-3.1999999225e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:22.081869</TIME>\n<YAW>-5.6000000825e-06</YAW>\n<PITCH>1.5999999961e-06</PITCH>\n<ROLL>-2.3999999855e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:23.081867</TIME>\n<YAW>-5.6000000825e-06</YAW>\n<PITCH>2.3999999855e-06</PITCH>\n<ROLL>-1.5999999961e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:24.081864</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>2.3999999855e-06</PITCH>\n<ROLL>-1.5999999961e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:25.081862</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>3.1999999225e-06</PITCH>\n<ROLL>-1.5999999961e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:26.081860</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>3.1999999225e-06</PITCH>\n<ROLL>-1.5999999961e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:27.081858</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>3.1999999225e-06</PITCH>\n<ROLL>-1.5999999961e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:28.081855</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>3.1999999225e-06</PITCH>\n<ROLL>-2.3999999855e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:29.081853</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>2.3999999855e-06</PITCH>\n<ROLL>-2.3999999855e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:30.081851</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>2.3999999855e-06</PITCH>\n<ROLL>-3.1999999225e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:31.081848</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>1.5999999961e-06</PITCH>\n<ROLL>-3.1999999225e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:32.081846</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>8.0000000680e-07</PITCH>\n<ROLL>-3.1999999225e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:33.081844</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>-3.1999999225e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:34.081842</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>-8.0000000680e-07</PITCH>\n<ROLL>-3.1999999225e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:35.081839</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>-1.5999999961e-06</PITCH>\n<ROLL>-3.1999999225e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:36.081837</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>-2.3999999855e-06</PITCH>\n<ROLL>-3.1999999225e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:37.081835</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>-2.3999999855e-06</PITCH>\n<ROLL>-3.1999999225e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:38.081832</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>-4.0000000340e-06</PITCH>\n<ROLL>-2.3999999855e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:39.081830</TIME>\n<YAW>-5.6000000825e-06</YAW>\n<PITCH>-4.7999999710e-06</PITCH>\n<ROLL>-1.5999999961e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:40.081828</TIME>\n<YAW>-5.6000000825e-06</YAW>\n<PITCH>-5.6000000825e-06</PITCH>\n<ROLL>-8.0000000680e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:41.081826</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>-5.6000000825e-06</PITCH>\n<ROLL>-8.0000000680e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:42.081823</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>-5.6000000825e-06</PITCH>\n<ROLL>-8.0000000680e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:43.081821</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>-6.4000000195e-06</PITCH>\n<ROLL>-8.0000000680e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:44.081819</TIME>\n<YAW>-5.6000000825e-06</YAW>\n<PITCH>-7.1999999565e-06</PITCH>\n<ROLL>-1.5999999961e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:45.081816</TIME>\n<YAW>-5.6000000825e-06</YAW>\n<PITCH>-7.1999999565e-06</PITCH>\n<ROLL>-2.3999999855e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:46.081814</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>-5.6000000825e-06</PITCH>\n<ROLL>-2.3999999855e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:47.081812</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>-4.0000000340e-06</PITCH>\n<ROLL>-3.1999999225e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:48.081810</TIME>\n<YAW>-4.0000000340e-06</YAW>\n<PITCH>-3.1999999225e-06</PITCH>\n<ROLL>-3.1999999225e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:49.081807</TIME>\n<YAW>-4.0000000340e-06</YAW>\n<PITCH>-2.3999999855e-06</PITCH>\n<ROLL>-3.1999999225e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:50.081805</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>-3.1999999225e-06</PITCH>\n<ROLL>-3.1999999225e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:51.081803</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>-4.0000000340e-06</PITCH>\n<ROLL>-3.1999999225e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:52.081800</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>-4.7999999710e-06</PITCH>\n<ROLL>-3.1999999225e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:53.081798</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>-4.7999999710e-06</PITCH>\n<ROLL>-3.1999999225e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:54.081796</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>-4.7999999710e-06</PITCH>\n<ROLL>-2.3999999855e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:55.081794</TIME>\n<YAW>-5.6000000825e-06</YAW>\n<PITCH>-5.6000000825e-06</PITCH>\n<ROLL>-1.5999999961e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:56.081791</TIME>\n<YAW>-5.6000000825e-06</YAW>\n<PITCH>-5.6000000825e-06</PITCH>\n<ROLL>-1.5999999961e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:57.081789</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>-5.6000000825e-06</PITCH>\n<ROLL>-1.5999999961e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:58.081787</TIME>\n<YAW>-5.6000000825e-06</YAW>\n<PITCH>-4.7999999710e-06</PITCH>\n<ROLL>-1.5999999961e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:59.081784</TIME>\n<YAW>-5.6000000825e-06</YAW>\n<PITCH>-4.7999999710e-06</PITCH>\n<ROLL>-1.5999999961e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:00.081782</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>-4.7999999710e-06</PITCH>\n<ROLL>-2.3999999855e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:01.081780</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>-4.7999999710e-06</PITCH>\n<ROLL>-2.3999999855e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:02.081778</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>-4.7999999710e-06</PITCH>\n<ROLL>-2.3999999855e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:03.081775</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>-5.6000000825e-06</PITCH>\n<ROLL>-3.1999999225e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:04.081773</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>-5.6000000825e-06</PITCH>\n<ROLL>-3.1999999225e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:05.081771</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>-5.6000000825e-06</PITCH>\n<ROLL>-3.1999999225e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:06.081768</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>-6.4000000195e-06</PITCH>\n<ROLL>-3.1999999225e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:07.081766</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>-7.1999999565e-06</PITCH>\n<ROLL>-3.1999999225e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:08.081764</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>-7.1999999565e-06</PITCH>\n<ROLL>-4.0000000340e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:09.081762</TIME>\n<YAW>-4.0000000340e-06</YAW>\n<PITCH>-5.6000000825e-06</PITCH>\n<ROLL>-3.1999999225e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:10.081759</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>-3.1999999225e-06</PITCH>\n<ROLL>-2.3999999855e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:11.081757</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>-3.1999999225e-06</PITCH>\n<ROLL>-1.5999999961e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:12.081755</TIME>\n<YAW>-5.6000000825e-06</YAW>\n<PITCH>-3.1999999225e-06</PITCH>\n<ROLL>-1.5999999961e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:13.081752</TIME>\n<YAW>-4.7999999710e-06</YAW>\n<PITCH>-4.0000000340e-06</PITCH>\n<ROLL>-8.0000000680e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:14.081750</TIME>\n<YAW>-5.6000000825e-06</YAW>\n<PITCH>-4.7999999710e-06</PITCH>\n<ROLL>-1.5999999961e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n</Angles_List>\n<Angular_Speeds_List>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:03.206912</TIME>\n<YAW>6.9999920310e-07</YAW>\n<PITCH>6.9999920310e-07</PITCH>\n<ROLL>-2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:03.331912</TIME>\n<YAW>2.0000076964e-07</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:03.456912</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>1.1999993819e-06</PITCH>\n<ROLL>-6.9999920310e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:03.581911</TIME>\n<YAW>2.9999940914e-07</YAW>\n<PITCH>8.9999997274e-07</PITCH>\n<ROLL>2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:03.706911</TIME>\n<YAW>-3.9999979396e-07</YAW>\n<PITCH>6.0000056360e-07</PITCH>\n<ROLL>-1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:03.831911</TIME>\n<YAW>-1.0000003576e-07</YAW>\n<PITCH>2.9999940914e-07</PITCH>\n<ROLL>-6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:03.956910</TIME>\n<YAW>6.9999920310e-07</YAW>\n<PITCH>6.0000056360e-07</PITCH>\n<ROLL>-1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:04.081910</TIME>\n<YAW>-1.0000003576e-07</YAW>\n<PITCH>2.9999940914e-07</PITCH>\n<ROLL>-6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:04.206910</TIME>\n<YAW>-5.0000017878e-07</YAW>\n<PITCH>-2.9999940914e-07</PITCH>\n<ROLL>7.9999958792e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:04.331910</TIME>\n<YAW>2.9999940914e-07</YAW>\n<PITCH>8.9999997274e-07</PITCH>\n<ROLL>2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:04.456909</TIME>\n<YAW>5.0000017878e-07</YAW>\n<PITCH>7.9999958792e-07</PITCH>\n<ROLL>-8.9999997274e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:04.581909</TIME>\n<YAW>2.0000076964e-07</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>3.9999979396e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:04.706909</TIME>\n<YAW>2.9999940914e-07</YAW>\n<PITCH>8.9999997274e-07</PITCH>\n<ROLL>2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:04.831908</TIME>\n<YAW>-5.0000017878e-07</YAW>\n<PITCH>-2.9999940914e-07</PITCH>\n<ROLL>7.9999958792e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:04.956908</TIME>\n<YAW>2.0000076964e-07</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>3.9999979396e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:05.081908</TIME>\n<YAW>6.9999920310e-07</YAW>\n<PITCH>-1.4000001515e-06</PITCH>\n<ROLL>1.1999993819e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:05.206908</TIME>\n<YAW>2.0000076964e-07</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:05.331907</TIME>\n<YAW>-5.0000017878e-07</YAW>\n<PITCH>-2.9999940914e-07</PITCH>\n<ROLL>7.9999958792e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:05.456907</TIME>\n<YAW>-8.9999997274e-07</YAW>\n<PITCH>-8.9999997274e-07</PITCH>\n<ROLL>1.4000001515e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:05.581907</TIME>\n<YAW>-5.0000017878e-07</YAW>\n<PITCH>-2.9999940914e-07</PITCH>\n<ROLL>8.9999997274e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:05.706906</TIME>\n<YAW>2.0000076964e-07</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:05.831906</TIME>\n<YAW>-5.0000017878e-07</YAW>\n<PITCH>-2.9999940914e-07</PITCH>\n<ROLL>8.9999997274e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:05.956906</TIME>\n<YAW>-5.0000017878e-07</YAW>\n<PITCH>-2.9999940914e-07</PITCH>\n<ROLL>8.9999997274e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:06.081906</TIME>\n<YAW>-1.0000003576e-07</YAW>\n<PITCH>2.9999940914e-07</PITCH>\n<ROLL>-3.9999979396e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:06.206905</TIME>\n<YAW>-7.9999958792e-07</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>1.4000001515e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:06.331905</TIME>\n<YAW>-5.0000017878e-07</YAW>\n<PITCH>-2.9999940914e-07</PITCH>\n<ROLL>8.9999997274e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:06.456905</TIME>\n<YAW>1.0000003576e-07</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:06.581904</TIME>\n<YAW>-5.0000017878e-07</YAW>\n<PITCH>-2.9999940914e-07</PITCH>\n<ROLL>8.9999997274e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:06.706904</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>-7.9999958792e-07</PITCH>\n<ROLL>6.9999920310e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:06.831904</TIME>\n<YAW>-8.9999997274e-07</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:06.956904</TIME>\n<YAW>5.0000017878e-07</YAW>\n<PITCH>-1.0000003576e-07</PITCH>\n<ROLL>1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:07.081903</TIME>\n<YAW>2.9999940914e-07</YAW>\n<PITCH>-1.0000003576e-06</PITCH>\n<ROLL>2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:07.206903</TIME>\n<YAW>2.9999940914e-07</YAW>\n<PITCH>-1.0000003576e-06</PITCH>\n<ROLL>2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:07.331903</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>-6.9999920310e-07</PITCH>\n<ROLL>-6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:07.456902</TIME>\n<YAW>3.9999979396e-07</YAW>\n<PITCH>-1.0000003576e-07</PITCH>\n<ROLL>2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:07.581902</TIME>\n<YAW>6.9999920310e-07</YAW>\n<PITCH>-2.9999940914e-07</PITCH>\n<ROLL>3.9999979396e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:07.706902</TIME>\n<YAW>3.9999979396e-07</YAW>\n<PITCH>-1.0000003576e-07</PITCH>\n<ROLL>2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:07.831902</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>-6.9999920310e-07</PITCH>\n<ROLL>-6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:07.956901</TIME>\n<YAW>1.1999993819e-06</YAW>\n<PITCH>2.0000076964e-07</PITCH>\n<ROLL>-1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:08.081901</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>-6.9999920310e-07</PITCH>\n<ROLL>-6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:08.206901</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>-6.9999920310e-07</PITCH>\n<ROLL>-6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:08.331900</TIME>\n<YAW>3.9999979396e-07</YAW>\n<PITCH>-1.0000003576e-07</PITCH>\n<ROLL>2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:08.456900</TIME>\n<YAW>6.0000056360e-07</YAW>\n<PITCH>-2.9999940914e-07</PITCH>\n<ROLL>-8.9999997274e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:08.581900</TIME>\n<YAW>1.0000003576e-07</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>-6.9999920310e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:08.706900</TIME>\n<YAW>3.9999979396e-07</YAW>\n<PITCH>-1.0000003576e-07</PITCH>\n<ROLL>2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:08.831899</TIME>\n<YAW>5.0000017878e-07</YAW>\n<PITCH>7.9999958792e-07</PITCH>\n<ROLL>-6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:08.956899</TIME>\n<YAW>3.9999979396e-07</YAW>\n<PITCH>-1.0000003576e-07</PITCH>\n<ROLL>2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:09.081899</TIME>\n<YAW>-2.0000076964e-07</YAW>\n<PITCH>2.9999940914e-07</PITCH>\n<ROLL>-2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:09.206898</TIME>\n<YAW>1.0000003576e-07</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>-6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:09.331898</TIME>\n<YAW>1.0000003576e-07</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>7.9999958792e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:09.456898</TIME>\n<YAW>8.9999997274e-07</YAW>\n<PITCH>1.4000001515e-06</PITCH>\n<ROLL>-1.1000007424e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:09.581898</TIME>\n<YAW>7.9999958792e-07</YAW>\n<PITCH>3.9999979396e-07</PITCH>\n<ROLL>3.9999979396e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:09.706897</TIME>\n<YAW>3.9999979396e-07</YAW>\n<PITCH>-1.0000003576e-07</PITCH>\n<ROLL>2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:09.831897</TIME>\n<YAW>-2.0000076964e-07</YAW>\n<PITCH>2.9999940914e-07</PITCH>\n<ROLL>-1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:09.956897</TIME>\n<YAW>3.9999979396e-07</YAW>\n<PITCH>-1.0000003576e-07</PITCH>\n<ROLL>3.9999979396e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:10.081896</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>-6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:10.206896</TIME>\n<YAW>2.0000076964e-07</YAW>\n<PITCH>-1.0000003576e-06</PITCH>\n<ROLL>5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:10.331896</TIME>\n<YAW>3.9999979396e-07</YAW>\n<PITCH>7.9999958792e-07</PITCH>\n<ROLL>-5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:10.456896</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>-5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:10.581895</TIME>\n<YAW>-7.9999958792e-07</YAW>\n<PITCH>7.9999958792e-07</PITCH>\n<ROLL>1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:10.706895</TIME>\n<YAW>-6.9999920310e-07</YAW>\n<PITCH>-1.0000003576e-07</PITCH>\n<ROLL>-1.0000003576e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:10.831895</TIME>\n<YAW>7.9999958792e-07</YAW>\n<PITCH>5.0000017878e-07</PITCH>\n<ROLL>-8.9999997274e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:10.956894</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>-5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:11.081894</TIME>\n<YAW>-8.9999997274e-07</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:11.206894</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>-5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:11.331894</TIME>\n<YAW>7.9999958792e-07</YAW>\n<PITCH>5.0000017878e-07</PITCH>\n<ROLL>-8.9999997274e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:11.456893</TIME>\n<YAW>-2.0000076964e-07</YAW>\n<PITCH>2.9999940914e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:11.581893</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>-5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:11.706893</TIME>\n<YAW>6.9999920310e-07</YAW>\n<PITCH>5.0000017878e-07</PITCH>\n<ROLL>-7.9999958792e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:11.831892</TIME>\n<YAW>6.9999920310e-07</YAW>\n<PITCH>5.0000017878e-07</PITCH>\n<ROLL>-7.9999958792e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:11.956892</TIME>\n<YAW>3.9999979396e-07</YAW>\n<PITCH>-1.0000003576e-07</PITCH>\n<ROLL>5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:12.081892</TIME>\n<YAW>7.9999958792e-07</YAW>\n<PITCH>3.9999979396e-07</PITCH>\n<ROLL>6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:12.206892</TIME>\n<YAW>8.9999997274e-07</YAW>\n<PITCH>-6.0000056360e-07</PITCH>\n<ROLL>-1.1000007424e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:12.331891</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>1.0000003576e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:12.456891</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>-3.9999979396e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:12.581891</TIME>\n<YAW>6.9999920310e-07</YAW>\n<PITCH>5.0000017878e-07</PITCH>\n<ROLL>-7.9999958792e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:12.706890</TIME>\n<YAW>6.9999920310e-07</YAW>\n<PITCH>5.0000017878e-07</PITCH>\n<ROLL>-7.9999958792e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:12.831890</TIME>\n<YAW>3.9999979396e-07</YAW>\n<PITCH>-1.0000003576e-07</PITCH>\n<ROLL>6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:12.956890</TIME>\n<YAW>6.0000056360e-07</YAW>\n<PITCH>-2.9999940914e-07</PITCH>\n<ROLL>-6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:13.081890</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>-3.9999979396e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:13.206889</TIME>\n<YAW>-2.9999940914e-07</YAW>\n<PITCH>3.9999979396e-07</PITCH>\n<ROLL>-1.4000001515e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:13.331889</TIME>\n<YAW>8.9999997274e-07</YAW>\n<PITCH>1.4000001515e-06</PITCH>\n<ROLL>-7.9999958792e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:13.456889</TIME>\n<YAW>-2.0000076964e-07</YAW>\n<PITCH>2.9999940914e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:13.581888</TIME>\n<YAW>6.9999920310e-07</YAW>\n<PITCH>5.0000017878e-07</PITCH>\n<ROLL>-6.9999920310e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:13.706888</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>-2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:13.831888</TIME>\n<YAW>7.9999958792e-07</YAW>\n<PITCH>3.9999979396e-07</PITCH>\n<ROLL>6.9999920310e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:13.956888</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>-2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:14.081887</TIME>\n<YAW>6.9999920310e-07</YAW>\n<PITCH>5.0000017878e-07</PITCH>\n<ROLL>-6.9999920310e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:14.206887</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>-2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:14.331887</TIME>\n<YAW>6.9999920310e-07</YAW>\n<PITCH>5.0000017878e-07</PITCH>\n<ROLL>-6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:14.456886</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>1.1000007424e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:14.581886</TIME>\n<YAW>1.0000003576e-07</YAW>\n<PITCH>1.0000003576e-06</PITCH>\n<ROLL>-3.9999979396e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:14.706886</TIME>\n<YAW>6.9999920310e-07</YAW>\n<PITCH>5.0000017878e-07</PITCH>\n<ROLL>-6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:14.831886</TIME>\n<YAW>-1.0000003576e-07</YAW>\n<PITCH>-6.9999920310e-07</PITCH>\n<ROLL>-1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:14.956885</TIME>\n<YAW>-2.9999940914e-07</YAW>\n<PITCH>3.9999979396e-07</PITCH>\n<ROLL>-1.2999997667e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:15.081885</TIME>\n<YAW>6.9999920310e-07</YAW>\n<PITCH>5.0000017878e-07</PITCH>\n<ROLL>-6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:15.206885</TIME>\n<YAW>2.0000076964e-07</YAW>\n<PITCH>-1.0000003576e-06</PITCH>\n<ROLL>8.9999997274e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:15.331884</TIME>\n<YAW>6.9999920310e-07</YAW>\n<PITCH>5.0000017878e-07</PITCH>\n<ROLL>-6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:15.456884</TIME>\n<YAW>-6.0000056360e-07</YAW>\n<PITCH>6.9999920310e-07</PITCH>\n<ROLL>-7.9999958792e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:15.581884</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>-2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:15.706884</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>-2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:15.831883</TIME>\n<YAW>6.9999920310e-07</YAW>\n<PITCH>5.0000017878e-07</PITCH>\n<ROLL>-5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:15.956883</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>-2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:16.081883</TIME>\n<YAW>-1.0000003576e-07</YAW>\n<PITCH>-6.9999920310e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:16.206882</TIME>\n<YAW>6.9999920310e-07</YAW>\n<PITCH>5.0000017878e-07</PITCH>\n<ROLL>-5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:16.331882</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>-1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:16.456882</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>-1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:16.581882</TIME>\n<YAW>5.0000017878e-07</YAW>\n<PITCH>-2.9999940914e-07</PITCH>\n<ROLL>-3.9999979396e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:16.706881</TIME>\n<YAW>-2.9999940914e-07</YAW>\n<PITCH>2.9999940914e-07</PITCH>\n<ROLL>2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:16.831881</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>-1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:16.956881</TIME>\n<YAW>7.9999958792e-07</YAW>\n<PITCH>-6.0000056360e-07</PITCH>\n<ROLL>-7.9999958792e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:17.081880</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>-1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:17.206880</TIME>\n<YAW>5.0000017878e-07</YAW>\n<PITCH>-2.9999940914e-07</PITCH>\n<ROLL>-2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:17.331880</TIME>\n<YAW>2.9999940914e-07</YAW>\n<PITCH>-1.0000003576e-07</PITCH>\n<ROLL>8.9999997274e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:17.456880</TIME>\n<YAW>-1.0000003576e-07</YAW>\n<PITCH>-6.9999920310e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:17.581879</TIME>\n<YAW>-2.9999940914e-07</YAW>\n<PITCH>2.9999940914e-07</PITCH>\n<ROLL>2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:17.706879</TIME>\n<YAW>6.9999920310e-07</YAW>\n<PITCH>5.0000017878e-07</PITCH>\n<ROLL>-3.9999979396e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:17.831879</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:17.956878</TIME>\n<YAW>-5.0000017878e-07</YAW>\n<PITCH>-3.9999979396e-07</PITCH>\n<ROLL>-8.9999997274e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:18.081878</TIME>\n<YAW>1.0000003576e-07</YAW>\n<PITCH>-1.0000003576e-06</PITCH>\n<ROLL>-2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:18.206878</TIME>\n<YAW>-1.0000003576e-07</YAW>\n<PITCH>-6.9999920310e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:18.331878</TIME>\n<YAW>1.1999993819e-06</YAW>\n<PITCH>-8.9999997274e-07</PITCH>\n<ROLL>2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:18.456877</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:18.581877</TIME>\n<YAW>-5.0000017878e-07</YAW>\n<PITCH>-5.0000017878e-07</PITCH>\n<ROLL>5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:18.706877</TIME>\n<YAW>1.1999993819e-06</YAW>\n<PITCH>-8.9999997274e-07</PITCH>\n<ROLL>2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:18.831876</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:18.956876</TIME>\n<YAW>-1.0000003576e-07</YAW>\n<PITCH>-6.9999920310e-07</PITCH>\n<ROLL>1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:19.081876</TIME>\n<YAW>7.9999958792e-07</YAW>\n<PITCH>-6.0000056360e-07</PITCH>\n<ROLL>-6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:19.206876</TIME>\n<YAW>-1.0000003576e-07</YAW>\n<PITCH>-6.9999920310e-07</PITCH>\n<ROLL>1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:19.331875</TIME>\n<YAW>-3.9999979396e-07</YAW>\n<PITCH>3.9999979396e-07</PITCH>\n<ROLL>-8.9999997274e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:19.456875</TIME>\n<YAW>-2.0000076964e-07</YAW>\n<PITCH>-6.9999920310e-07</PITCH>\n<ROLL>1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:19.581875</TIME>\n<YAW>6.0000056360e-07</YAW>\n<PITCH>5.0000017878e-07</PITCH>\n<ROLL>-2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:19.706874</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:19.831874</TIME>\n<YAW>6.0000056360e-07</YAW>\n<PITCH>5.0000017878e-07</PITCH>\n<ROLL>-2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:19.956874</TIME>\n<YAW>-5.0000017878e-07</YAW>\n<PITCH>-3.9999979396e-07</PITCH>\n<ROLL>-7.9999958792e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:20.081874</TIME>\n<YAW>-2.0000076964e-07</YAW>\n<PITCH>-6.9999920310e-07</PITCH>\n<ROLL>2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:20.206873</TIME>\n<YAW>-3.9999979396e-07</YAW>\n<PITCH>3.9999979396e-07</PITCH>\n<ROLL>-8.9999997274e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:20.331873</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:20.456873</TIME>\n<YAW>6.0000056360e-07</YAW>\n<PITCH>5.0000017878e-07</PITCH>\n<ROLL>-2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:20.581872</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:20.706872</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:20.831872</TIME>\n<YAW>6.0000056360e-07</YAW>\n<PITCH>5.0000017878e-07</PITCH>\n<ROLL>-2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:20.956872</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>1.5999991758e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:21.081871</TIME>\n<YAW>-2.0000076964e-07</YAW>\n<PITCH>-6.9999920310e-07</PITCH>\n<ROLL>2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:21.206871</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:21.331871</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>1.5999991758e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:21.456870</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>1.5999991758e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:21.581870</TIME>\n<YAW>-3.9999979396e-07</YAW>\n<PITCH>2.9999940914e-07</PITCH>\n<ROLL>6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:21.706870</TIME>\n<YAW>-8.9999997274e-07</YAW>\n<PITCH>7.9999958792e-07</PITCH>\n<ROLL>8.9999997274e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:21.831870</TIME>\n<YAW>7.9999958792e-07</YAW>\n<PITCH>-6.0000056360e-07</PITCH>\n<ROLL>1.0000003576e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:21.956869</TIME>\n<YAW>-1.1000007424e-06</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>1.0000003576e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:22.081869</TIME>\n<YAW>-2.0000076964e-07</YAW>\n<PITCH>1.1999993819e-06</PITCH>\n<ROLL>5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:22.206869</TIME>\n<YAW>-1.1000007424e-06</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>1.0000003576e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:22.331868</TIME>\n<YAW>-3.9999979396e-07</YAW>\n<PITCH>2.9999940914e-07</PITCH>\n<ROLL>6.9999920310e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:22.456868</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:22.581868</TIME>\n<YAW>-3.9999979396e-07</YAW>\n<PITCH>2.9999940914e-07</PITCH>\n<ROLL>6.9999920310e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:22.706868</TIME>\n<YAW>-1.0000003576e-07</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:22.831867</TIME>\n<YAW>6.0000056360e-07</YAW>\n<PITCH>5.0000017878e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:22.956867</TIME>\n<YAW>6.0000056360e-07</YAW>\n<PITCH>5.0000017878e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:23.081867</TIME>\n<YAW>-3.9999979396e-07</YAW>\n<PITCH>2.9999940914e-07</PITCH>\n<ROLL>6.9999920310e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:23.206866</TIME>\n<YAW>2.0000076964e-07</YAW>\n<PITCH>-1.0000003576e-07</PITCH>\n<ROLL>-1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:23.331866</TIME>\n<YAW>6.0000056360e-07</YAW>\n<PITCH>5.0000017878e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:23.456866</TIME>\n<YAW>6.0000056360e-07</YAW>\n<PITCH>5.0000017878e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:23.581866</TIME>\n<YAW>6.0000056360e-07</YAW>\n<PITCH>5.0000017878e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:23.706865</TIME>\n<YAW>-3.9999979396e-07</YAW>\n<PITCH>2.9999940914e-07</PITCH>\n<ROLL>7.9999958792e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:23.831865</TIME>\n<YAW>1.5999991758e-06</YAW>\n<PITCH>6.9999920310e-07</PITCH>\n<ROLL>-7.9999958792e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:23.956865</TIME>\n<YAW>2.0000076964e-07</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>1.4000001515e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:24.081864</TIME>\n<YAW>6.0000056360e-07</YAW>\n<PITCH>5.0000017878e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:24.206864</TIME>\n<YAW>6.9999920310e-07</YAW>\n<PITCH>1.4000001515e-06</PITCH>\n<ROLL>-1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:24.331864</TIME>\n<YAW>2.0000076964e-07</YAW>\n<PITCH>7.9999958792e-07</PITCH>\n<ROLL>-1.0000003576e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:24.456864</TIME>\n<YAW>6.0000056360e-07</YAW>\n<PITCH>5.0000017878e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:24.581863</TIME>\n<YAW>-3.9999979396e-07</YAW>\n<PITCH>3.9999979396e-07</PITCH>\n<ROLL>-6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:24.706863</TIME>\n<YAW>6.0000056360e-07</YAW>\n<PITCH>5.0000017878e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:24.831863</TIME>\n<YAW>-6.0000056360e-07</YAW>\n<PITCH>1.5999991758e-06</PITCH>\n<ROLL>-2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:24.956862</TIME>\n<YAW>-1.0000003576e-07</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>3.9999979396e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:25.081862</TIME>\n<YAW>2.0000076964e-07</YAW>\n<PITCH>7.9999958792e-07</PITCH>\n<ROLL>-8.9999997274e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:25.206862</TIME>\n<YAW>-1.0000003576e-07</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>3.9999979396e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:25.331862</TIME>\n<YAW>5.0000017878e-07</YAW>\n<PITCH>5.0000017878e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:25.456861</TIME>\n<YAW>5.0000017878e-07</YAW>\n<PITCH>5.0000017878e-07</PITCH>\n<ROLL>1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:25.581861</TIME>\n<YAW>5.0000017878e-07</YAW>\n<PITCH>5.0000017878e-07</PITCH>\n<ROLL>1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:25.706861</TIME>\n<YAW>-1.0000003576e-07</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:25.831860</TIME>\n<YAW>3.9999979396e-07</YAW>\n<PITCH>-2.9999940914e-07</PITCH>\n<ROLL>2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:25.956860</TIME>\n<YAW>1.0000003576e-07</YAW>\n<PITCH>-1.0000003576e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:26.081860</TIME>\n<YAW>2.0000076964e-07</YAW>\n<PITCH>7.9999958792e-07</PITCH>\n<ROLL>-7.9999958792e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:26.206860</TIME>\n<YAW>5.0000017878e-07</YAW>\n<PITCH>5.0000017878e-07</PITCH>\n<ROLL>1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:26.331859</TIME>\n<YAW>-2.9999940914e-07</YAW>\n<PITCH>-6.9999920310e-07</PITCH>\n<ROLL>6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:26.456859</TIME>\n<YAW>-2.9999940914e-07</YAW>\n<PITCH>-6.9999920310e-07</PITCH>\n<ROLL>-6.9999920310e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:26.581859</TIME>\n<YAW>5.0000017878e-07</YAW>\n<PITCH>5.0000017878e-07</PITCH>\n<ROLL>1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:26.706858</TIME>\n<YAW>-6.0000056360e-07</YAW>\n<PITCH>-3.9999979396e-07</PITCH>\n<ROLL>-2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:26.831858</TIME>\n<YAW>-5.0000017878e-07</YAW>\n<PITCH>3.9999979396e-07</PITCH>\n<ROLL>-3.9999979396e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:26.956858</TIME>\n<YAW>-1.0000003576e-06</YAW>\n<PITCH>-1.0000003576e-07</PITCH>\n<ROLL>-1.2999997667e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:27.081858</TIME>\n<YAW>-2.0000076964e-07</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>-7.9999958792e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:27.206857</TIME>\n<YAW>-6.0000056360e-07</YAW>\n<PITCH>-3.9999979396e-07</PITCH>\n<ROLL>-2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:27.331857</TIME>\n<YAW>-1.0000003576e-07</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:27.456857</TIME>\n<YAW>2.9999940914e-07</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>-1.1000007424e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:27.581856</TIME>\n<YAW>-6.0000056360e-07</YAW>\n<PITCH>-3.9999979396e-07</PITCH>\n<ROLL>-2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:27.706856</TIME>\n<YAW>7.9999958792e-07</YAW>\n<PITCH>2.0000076964e-07</PITCH>\n<ROLL>-1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:27.831856</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>-6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:27.956856</TIME>\n<YAW>7.9999958792e-07</YAW>\n<PITCH>2.0000076964e-07</PITCH>\n<ROLL>-1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:28.081855</TIME>\n<YAW>6.9999920310e-07</YAW>\n<PITCH>-6.0000056360e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:28.206855</TIME>\n<YAW>-2.9999940914e-07</YAW>\n<PITCH>-6.9999920310e-07</PITCH>\n<ROLL>-6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:28.331855</TIME>\n<YAW>5.0000017878e-07</YAW>\n<PITCH>5.0000017878e-07</PITCH>\n<ROLL>2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:28.456854</TIME>\n<YAW>6.9999920310e-07</YAW>\n<PITCH>-6.0000056360e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:28.581854</TIME>\n<YAW>2.9999940914e-07</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>-1.0000003576e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:28.706854</TIME>\n<YAW>1.0000003576e-07</YAW>\n<PITCH>7.9999958792e-07</PITCH>\n<ROLL>-6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:28.831854</TIME>\n<YAW>7.9999958792e-07</YAW>\n<PITCH>2.0000076964e-07</PITCH>\n<ROLL>-1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:28.956853</TIME>\n<YAW>-2.9999940914e-07</YAW>\n<PITCH>-6.9999920310e-07</PITCH>\n<ROLL>-6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:29.081853</TIME>\n<YAW>1.0000003576e-07</YAW>\n<PITCH>7.9999958792e-07</PITCH>\n<ROLL>-6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:29.206853</TIME>\n<YAW>2.9999940914e-07</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>-8.9999997274e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:29.331852</TIME>\n<YAW>-2.9999940914e-07</YAW>\n<PITCH>-6.9999920310e-07</PITCH>\n<ROLL>-5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:29.456852</TIME>\n<YAW>1.0000003576e-07</YAW>\n<PITCH>7.9999958792e-07</PITCH>\n<ROLL>-6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:29.581852</TIME>\n<YAW>6.9999920310e-07</YAW>\n<PITCH>-6.0000056360e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:29.706852</TIME>\n<YAW>3.9999979396e-07</YAW>\n<PITCH>6.0000056360e-07</PITCH>\n<ROLL>-1.0000003576e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:29.831851</TIME>\n<YAW>2.9999940914e-07</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>-8.9999997274e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:29.956851</TIME>\n<YAW>2.9999940914e-07</YAW>\n<PITCH>-2.9999940914e-07</PITCH>\n<ROLL>5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:30.081851</TIME>\n<YAW>-3.9999979396e-07</YAW>\n<PITCH>-6.9999920310e-07</PITCH>\n<ROLL>-5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:30.206850</TIME>\n<YAW>5.0000017878e-07</YAW>\n<PITCH>-1.5000005363e-06</PITCH>\n<ROLL>2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:30.331850</TIME>\n<YAW>2.9999940914e-07</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>-7.9999958792e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:30.456850</TIME>\n<YAW>2.0000076964e-07</YAW>\n<PITCH>-1.1999993819e-06</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:30.581850</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>-3.9999979396e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:30.706849</TIME>\n<YAW>-3.9999979396e-07</YAW>\n<PITCH>-6.9999920310e-07</PITCH>\n<ROLL>-3.9999979396e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:30.831849</TIME>\n<YAW>6.0000056360e-07</YAW>\n<PITCH>-6.0000056360e-07</PITCH>\n<ROLL>1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:30.956849</TIME>\n<YAW>3.9999979396e-07</YAW>\n<PITCH>-1.4000001515e-06</PITCH>\n<ROLL>-1.1000007424e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:31.081848</TIME>\n<YAW>-5.0000017878e-07</YAW>\n<PITCH>-1.5999991758e-06</PITCH>\n<ROLL>-2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:31.206848</TIME>\n<YAW>-6.9999920310e-07</YAW>\n<PITCH>-2.9999940914e-07</PITCH>\n<ROLL>-1.4000001515e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:31.331848</TIME>\n<YAW>-6.9999920310e-07</YAW>\n<PITCH>-3.9999979396e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:31.456848</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>-1.0000003576e-06</PITCH>\n<ROLL>5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:31.581847</TIME>\n<YAW>2.9999940914e-07</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>-7.9999958792e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:31.706847</TIME>\n<YAW>-2.9999940914e-07</YAW>\n<PITCH>-6.9999920310e-07</PITCH>\n<ROLL>1.0000003576e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:31.831847</TIME>\n<YAW>-1.0000003576e-07</YAW>\n<PITCH>-8.9999997274e-07</PITCH>\n<ROLL>-7.9999958792e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:31.956846</TIME>\n<YAW>5.0000017878e-07</YAW>\n<PITCH>-1.5000005363e-06</PITCH>\n<ROLL>2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:32.081846</TIME>\n<YAW>2.9999940914e-07</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>-6.9999920310e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:32.206846</TIME>\n<YAW>-2.0000076964e-07</YAW>\n<PITCH>-1.9000003303e-06</PITCH>\n<ROLL>6.9999920310e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:32.331846</TIME>\n<YAW>6.0000056360e-07</YAW>\n<PITCH>-6.0000056360e-07</PITCH>\n<ROLL>2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:32.456845</TIME>\n<YAW>1.0000003576e-06</YAW>\n<PITCH>-8.9999997274e-07</PITCH>\n<ROLL>1.2999997667e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:32.581845</TIME>\n<YAW>2.0000076964e-07</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>-6.9999920310e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:32.706845</TIME>\n<YAW>-2.0000076964e-07</YAW>\n<PITCH>-1.9000003303e-06</PITCH>\n<ROLL>7.9999958792e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:32.831844</TIME>\n<YAW>2.9999940914e-07</YAW>\n<PITCH>-2.9999940914e-07</PITCH>\n<ROLL>6.9999920310e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:32.956844</TIME>\n<YAW>2.0000076964e-07</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>-6.9999920310e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:33.081844</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>-1.0000003576e-06</PITCH>\n<ROLL>6.9999920310e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:33.206844</TIME>\n<YAW>2.0000076964e-07</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>-6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:33.331843</TIME>\n<YAW>-3.9999979396e-07</YAW>\n<PITCH>-6.9999920310e-07</PITCH>\n<ROLL>-2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:33.456843</TIME>\n<YAW>-2.0000076964e-07</YAW>\n<PITCH>-1.9000003303e-06</PITCH>\n<ROLL>7.9999958792e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:33.581843</TIME>\n<YAW>2.0000076964e-07</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>-6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:33.706842</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>-1.0000003576e-06</PITCH>\n<ROLL>6.9999920310e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:33.831842</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>-1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:33.956842</TIME>\n<YAW>5.0000017878e-07</YAW>\n<PITCH>-5.0000017878e-07</PITCH>\n<ROLL>-1.0000003576e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:34.081842</TIME>\n<YAW>-3.9999979396e-07</YAW>\n<PITCH>-6.9999920310e-07</PITCH>\n<ROLL>-2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:34.206841</TIME>\n<YAW>3.9999979396e-07</YAW>\n<PITCH>-1.5000005363e-06</PITCH>\n<ROLL>5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:34.331841</TIME>\n<YAW>2.0000076964e-07</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>-6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:34.456841</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>-1.0000003576e-06</PITCH>\n<ROLL>7.9999958792e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:34.581840</TIME>\n<YAW>2.0000076964e-07</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>-5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:34.706840</TIME>\n<YAW>-6.0000056360e-07</YAW>\n<PITCH>-1.5999991758e-06</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:34.831840</TIME>\n<YAW>2.0000076964e-07</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>-5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:34.956840</TIME>\n<YAW>3.9999979396e-07</YAW>\n<PITCH>-1.5000005363e-06</PITCH>\n<ROLL>6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:35.081839</TIME>\n<YAW>-1.0000003576e-07</YAW>\n<PITCH>-8.9999997274e-07</PITCH>\n<ROLL>-6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:35.206839</TIME>\n<YAW>2.0000076964e-07</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>-5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:35.331839</TIME>\n<YAW>2.0000076964e-07</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>-5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:35.456838</TIME>\n<YAW>-3.9999979396e-07</YAW>\n<PITCH>-6.9999920310e-07</PITCH>\n<ROLL>-1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:35.581838</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:35.706838</TIME>\n<YAW>6.0000056360e-07</YAW>\n<PITCH>-6.0000056360e-07</PITCH>\n<ROLL>5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:35.831838</TIME>\n<YAW>-1.0000003576e-07</YAW>\n<PITCH>-8.9999997274e-07</PITCH>\n<ROLL>-5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:35.956837</TIME>\n<YAW>8.9999997274e-07</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>-7.9999958792e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:36.081837</TIME>\n<YAW>-1.0000003576e-07</YAW>\n<PITCH>-1.0000003576e-06</PITCH>\n<ROLL>8.9999997274e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:36.206837</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>-1.1000007424e-06</PITCH>\n<ROLL>-2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:36.331836</TIME>\n<YAW>6.9999920310e-07</YAW>\n<PITCH>2.0000076964e-07</PITCH>\n<ROLL>3.9999979396e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:36.456836</TIME>\n<YAW>8.9999997274e-07</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>-7.9999958792e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:36.581836</TIME>\n<YAW>6.9999920310e-07</YAW>\n<PITCH>2.0000076964e-07</PITCH>\n<ROLL>3.9999979396e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:36.706836</TIME>\n<YAW>6.0000056360e-07</YAW>\n<PITCH>-6.0000056360e-07</PITCH>\n<ROLL>5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:36.831835</TIME>\n<YAW>-3.9999979396e-07</YAW>\n<PITCH>-6.9999920310e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:36.956835</TIME>\n<YAW>2.0000076964e-07</YAW>\n<PITCH>-2.9999940914e-07</PITCH>\n<ROLL>1.0000003576e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:37.081835</TIME>\n<YAW>-1.0000003576e-07</YAW>\n<PITCH>-1.0000003576e-06</PITCH>\n<ROLL>1.0000003576e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:37.206834</TIME>\n<YAW>-7.9999958792e-07</YAW>\n<PITCH>-3.9999979396e-07</PITCH>\n<ROLL>3.9999979396e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:37.331834</TIME>\n<YAW>5.0000017878e-07</YAW>\n<PITCH>-6.0000056360e-07</PITCH>\n<ROLL>6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:37.456834</TIME>\n<YAW>-1.0000003576e-07</YAW>\n<PITCH>-1.0000003576e-06</PITCH>\n<ROLL>1.0000003576e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:37.581834</TIME>\n<YAW>-6.0000056360e-07</YAW>\n<PITCH>-1.5999991758e-06</PITCH>\n<ROLL>1.5999991758e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:37.706833</TIME>\n<YAW>-5.0000017878e-07</YAW>\n<PITCH>-6.9999920310e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:37.831833</TIME>\n<YAW>-7.9999958792e-07</YAW>\n<PITCH>-3.9999979396e-07</PITCH>\n<ROLL>3.9999979396e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:37.956833</TIME>\n<YAW>-2.0000076964e-07</YAW>\n<PITCH>-1.9000003303e-06</PITCH>\n<ROLL>1.1000007424e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:38.081832</TIME>\n<YAW>-5.0000017878e-07</YAW>\n<PITCH>-6.9999920310e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:38.206832</TIME>\n<YAW>-2.0000076964e-07</YAW>\n<PITCH>-1.9000003303e-06</PITCH>\n<ROLL>1.1999993819e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:38.331832</TIME>\n<YAW>-7.9999958792e-07</YAW>\n<PITCH>-3.9999979396e-07</PITCH>\n<ROLL>5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:38.456832</TIME>\n<YAW>-5.0000017878e-07</YAW>\n<PITCH>-6.9999920310e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:38.581831</TIME>\n<YAW>-3.9999979396e-07</YAW>\n<PITCH>-6.9999920310e-07</PITCH>\n<ROLL>1.5000005363e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:38.706831</TIME>\n<YAW>-6.0000056360e-07</YAW>\n<PITCH>-1.5999991758e-06</PITCH>\n<ROLL>2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:38.831831</TIME>\n<YAW>-1.0000003576e-07</YAW>\n<PITCH>-1.0000003576e-06</PITCH>\n<ROLL>1.1000007424e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:38.956830</TIME>\n<YAW>-7.9999958792e-07</YAW>\n<PITCH>-3.9999979396e-07</PITCH>\n<ROLL>5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:39.081830</TIME>\n<YAW>-2.9999940914e-07</YAW>\n<PITCH>-1.9000003303e-06</PITCH>\n<ROLL>1.1999993819e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:39.206830</TIME>\n<YAW>5.0000017878e-07</YAW>\n<PITCH>-6.0000056360e-07</PITCH>\n<ROLL>6.9999920310e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:39.331830</TIME>\n<YAW>6.0000056360e-07</YAW>\n<PITCH>-6.0000056360e-07</PITCH>\n<ROLL>2.2000049754e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:39.456829</TIME>\n<YAW>-5.0000017878e-07</YAW>\n<PITCH>-6.9999920310e-07</PITCH>\n<ROLL>1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:39.581829</TIME>\n<YAW>5.0000017878e-07</YAW>\n<PITCH>-6.0000056360e-07</PITCH>\n<ROLL>7.9999958792e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:39.706829</TIME>\n<YAW>-5.0000017878e-07</YAW>\n<PITCH>-6.9999920310e-07</PITCH>\n<ROLL>1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:39.831828</TIME>\n<YAW>-1.0000003576e-07</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:39.956828</TIME>\n<YAW>1.0000003576e-07</YAW>\n<PITCH>-1.2999997667e-06</PITCH>\n<ROLL>6.9999920310e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:40.081828</TIME>\n<YAW>-1.0000003576e-07</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:40.206828</TIME>\n<YAW>1.0000003576e-07</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>-1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:40.331827</TIME>\n<YAW>6.0000056360e-07</YAW>\n<PITCH>2.9999940914e-07</PITCH>\n<ROLL>-6.9999920310e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:40.456827</TIME>\n<YAW>8.9999997274e-07</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>8.9999997274e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:40.581827</TIME>\n<YAW>-2.0000076964e-07</YAW>\n<PITCH>-8.9999997274e-07</PITCH>\n<ROLL>-2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:40.706826</TIME>\n<YAW>8.9999997274e-07</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>-5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:40.831826</TIME>\n<YAW>6.0000056360e-07</YAW>\n<PITCH>2.0000076964e-07</PITCH>\n<ROLL>6.9999920310e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:40.956826</TIME>\n<YAW>1.0000003576e-07</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>-1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:41.081826</TIME>\n<YAW>2.9999940914e-07</YAW>\n<PITCH>6.0000056360e-07</PITCH>\n<ROLL>-2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:41.206825</TIME>\n<YAW>1.0000003576e-07</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>-1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:41.331825</TIME>\n<YAW>1.0000003576e-06</YAW>\n<PITCH>1.0000003576e-06</PITCH>\n<ROLL>-6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:41.456825</TIME>\n<YAW>-7.9999958792e-07</YAW>\n<PITCH>-3.9999979396e-07</PITCH>\n<ROLL>6.9999920310e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:41.581824</TIME>\n<YAW>1.0000003576e-06</YAW>\n<PITCH>1.0000003576e-06</PITCH>\n<ROLL>-5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:41.706824</TIME>\n<YAW>3.9999979396e-07</YAW>\n<PITCH>-5.0000017878e-07</PITCH>\n<ROLL>-5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:41.831824</TIME>\n<YAW>1.0000003576e-07</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:41.956824</TIME>\n<YAW>-5.0000017878e-07</YAW>\n<PITCH>-6.9999920310e-07</PITCH>\n<ROLL>2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:42.081823</TIME>\n<YAW>1.0000003576e-07</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:42.206823</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>8.9999997274e-07</PITCH>\n<ROLL>-1.1000007424e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:42.331823</TIME>\n<YAW>1.0000003576e-07</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:42.456822</TIME>\n<YAW>1.0000003576e-07</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:42.581822</TIME>\n<YAW>-8.9999997274e-07</YAW>\n<PITCH>-2.9999940914e-07</PITCH>\n<ROLL>-6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:42.706822</TIME>\n<YAW>1.0000003576e-07</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:42.831822</TIME>\n<YAW>1.0000003576e-07</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:42.956821</TIME>\n<YAW>2.9999940914e-07</YAW>\n<PITCH>-1.4000001515e-06</PITCH>\n<ROLL>-2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:43.081821</TIME>\n<YAW>-6.9999920310e-07</YAW>\n<PITCH>-1.5999991758e-06</PITCH>\n<ROLL>5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:43.206821</TIME>\n<YAW>3.9999979396e-07</YAW>\n<PITCH>-5.0000017878e-07</PITCH>\n<ROLL>-3.9999979396e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:43.331820</TIME>\n<YAW>-2.0000076964e-07</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>-8.9999997274e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:43.456820</TIME>\n<YAW>2.9999940914e-07</YAW>\n<PITCH>-1.4000001515e-06</PITCH>\n<ROLL>-2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:43.581820</TIME>\n<YAW>-2.0000076964e-07</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>-8.9999997274e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:43.706820</TIME>\n<YAW>-3.9999979396e-07</YAW>\n<PITCH>-1.7999929642e-06</PITCH>\n<ROLL>1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:43.831819</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>-1.1000007424e-06</PITCH>\n<ROLL>-1.1999993819e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:43.956819</TIME>\n<YAW>-2.0000076964e-07</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>-8.9999997274e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:44.081819</TIME>\n<YAW>-6.0000056360e-07</YAW>\n<PITCH>-6.0000056360e-07</PITCH>\n<ROLL>-1.0000003576e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:44.206818</TIME>\n<YAW>-5.0000017878e-07</YAW>\n<PITCH>2.9999940914e-07</PITCH>\n<ROLL>-1.9000003303e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:44.331818</TIME>\n<YAW>1.0000003576e-07</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:44.456818</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>8.9999997274e-07</PITCH>\n<ROLL>-1.0000003576e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:44.581818</TIME>\n<YAW>-1.2999997667e-06</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>-1.5000005363e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:44.706817</TIME>\n<YAW>6.0000056360e-07</YAW>\n<PITCH>1.2999997667e-06</PITCH>\n<ROLL>-1.2999997667e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:44.831817</TIME>\n<YAW>2.0000076964e-07</YAW>\n<PITCH>6.0000056360e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:44.956817</TIME>\n<YAW>1.0000003576e-06</YAW>\n<PITCH>1.0000003576e-06</PITCH>\n<ROLL>-2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:45.081816</TIME>\n<YAW>2.0000076964e-07</YAW>\n<PITCH>6.0000056360e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:45.206816</TIME>\n<YAW>6.0000056360e-07</YAW>\n<PITCH>1.2999997667e-06</PITCH>\n<ROLL>-1.2999997667e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:45.331816</TIME>\n<YAW>1.1000007424e-06</YAW>\n<PITCH>1.9000003303e-06</PITCH>\n<ROLL>-3.9999979396e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:45.456816</TIME>\n<YAW>1.0000003576e-06</YAW>\n<PITCH>1.0000003576e-06</PITCH>\n<ROLL>-2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:45.581815</TIME>\n<YAW>7.9999958792e-07</YAW>\n<PITCH>2.0999976093e-06</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:45.706815</TIME>\n<YAW>3.9999979396e-07</YAW>\n<PITCH>1.4000001515e-06</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:45.831815</TIME>\n<YAW>1.0000003576e-06</YAW>\n<PITCH>1.0000003576e-06</PITCH>\n<ROLL>-2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:45.956814</TIME>\n<YAW>1.5000005363e-06</YAW>\n<PITCH>2.5999995334e-06</PITCH>\n<ROLL>-1.7999929642e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:46.081814</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>7.9999958792e-07</PITCH>\n<ROLL>5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:46.206814</TIME>\n<YAW>1.1000007424e-06</YAW>\n<PITCH>1.9000003303e-06</PITCH>\n<ROLL>-2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:46.331814</TIME>\n<YAW>6.0000056360e-07</YAW>\n<PITCH>1.2999997667e-06</PITCH>\n<ROLL>-1.1999993819e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:46.456813</TIME>\n<YAW>7.9999958792e-07</YAW>\n<PITCH>2.0999976093e-06</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:46.581813</TIME>\n<YAW>3.9999979396e-07</YAW>\n<PITCH>1.4000001515e-06</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:46.706813</TIME>\n<YAW>-2.0000076964e-07</YAW>\n<PITCH>2.0000076964e-06</PITCH>\n<ROLL>-5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:46.831812</TIME>\n<YAW>6.0000056360e-07</YAW>\n<PITCH>1.2999997667e-06</PITCH>\n<ROLL>-1.1999993819e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:46.956812</TIME>\n<YAW>-1.0000003576e-07</YAW>\n<PITCH>8.9999997274e-07</PITCH>\n<ROLL>-7.9999958792e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:47.081812</TIME>\n<YAW>8.9999997274e-07</YAW>\n<PITCH>1.0000003576e-06</PITCH>\n<ROLL>-1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:47.206812</TIME>\n<YAW>-2.0000076964e-07</YAW>\n<PITCH>2.0000076964e-06</PITCH>\n<ROLL>-5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:47.331811</TIME>\n<YAW>1.1000007424e-06</YAW>\n<PITCH>1.9000003303e-06</PITCH>\n<ROLL>-2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:47.456811</TIME>\n<YAW>-3.9999979396e-07</YAW>\n<PITCH>1.1000007424e-06</PITCH>\n<ROLL>-2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:47.581811</TIME>\n<YAW>2.0000076964e-07</YAW>\n<PITCH>6.0000056360e-07</PITCH>\n<ROLL>2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:47.706810</TIME>\n<YAW>8.9999997274e-07</YAW>\n<PITCH>1.0000003576e-06</PITCH>\n<ROLL>-1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:47.831810</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>1.7999929642e-06</PITCH>\n<ROLL>-8.9999997274e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:47.956810</TIME>\n<YAW>6.0000056360e-07</YAW>\n<PITCH>1.1999993819e-06</PITCH>\n<ROLL>2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:48.081810</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:48.206809</TIME>\n<YAW>2.0000076964e-07</YAW>\n<PITCH>6.0000056360e-07</PITCH>\n<ROLL>2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:48.331809</TIME>\n<YAW>-3.9999979396e-07</YAW>\n<PITCH>1.1000007424e-06</PITCH>\n<ROLL>-2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:48.456809</TIME>\n<YAW>-1.0000003576e-07</YAW>\n<PITCH>8.9999997274e-07</PITCH>\n<ROLL>-6.9999920310e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:48.581808</TIME>\n<YAW>-3.9999979396e-07</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:48.706808</TIME>\n<YAW>3.9999979396e-07</YAW>\n<PITCH>3.9999979396e-07</PITCH>\n<ROLL>-8.9999997274e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:48.831808</TIME>\n<YAW>-6.0000056360e-07</YAW>\n<PITCH>-6.9999920310e-07</PITCH>\n<ROLL>7.9999958792e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:48.956808</TIME>\n<YAW>-2.0000076964e-07</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>-5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:49.081807</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>3.9999979396e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:49.206807</TIME>\n<YAW>2.9999940914e-07</YAW>\n<PITCH>-5.0000017878e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:49.331807</TIME>\n<YAW>-6.0000056360e-07</YAW>\n<PITCH>-6.9999920310e-07</PITCH>\n<ROLL>7.9999958792e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:49.456806</TIME>\n<YAW>-2.0000076964e-07</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>-5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:49.581806</TIME>\n<YAW>2.0000076964e-07</YAW>\n<PITCH>-1.4000001515e-06</PITCH>\n<ROLL>1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:49.706806</TIME>\n<YAW>2.9999940914e-07</YAW>\n<PITCH>-5.0000017878e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:49.831806</TIME>\n<YAW>-3.9999979396e-07</YAW>\n<PITCH>-7.9999958792e-07</PITCH>\n<ROLL>-2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:49.956805</TIME>\n<YAW>-3.9999979396e-07</YAW>\n<PITCH>-1.7999929642e-06</PITCH>\n<ROLL>5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:50.081805</TIME>\n<YAW>2.9999940914e-07</YAW>\n<PITCH>-5.0000017878e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:50.206805</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>-1.1000007424e-06</PITCH>\n<ROLL>6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:50.331804</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>-8.9999997274e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:50.456804</TIME>\n<YAW>-1.0000003576e-06</YAW>\n<PITCH>-2.9999940914e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:50.581804</TIME>\n<YAW>8.9999997274e-07</YAW>\n<PITCH>-1.0000003576e-06</PITCH>\n<ROLL>-1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:50.706804</TIME>\n<YAW>-6.0000056360e-07</YAW>\n<PITCH>-6.9999920310e-07</PITCH>\n<ROLL>8.9999997274e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:50.831803</TIME>\n<YAW>-1.0000003576e-07</YAW>\n<PITCH>-1.1000007424e-06</PITCH>\n<ROLL>-6.9999920310e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:50.956803</TIME>\n<YAW>-2.9999940914e-07</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>-3.9999979396e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:51.081803</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>-7.9999958792e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:51.206802</TIME>\n<YAW>-2.9999940914e-07</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>-3.9999979396e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:51.331802</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:51.456802</TIME>\n<YAW>2.9999940914e-07</YAW>\n<PITCH>-5.0000017878e-07</PITCH>\n<ROLL>1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:51.581802</TIME>\n<YAW>-2.9999940914e-07</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>-2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:51.706801</TIME>\n<YAW>-1.0000003576e-07</YAW>\n<PITCH>8.9999997274e-07</PITCH>\n<ROLL>-5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:51.831801</TIME>\n<YAW>6.9999920310e-07</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>-1.1999993819e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:51.956801</TIME>\n<YAW>2.9999940914e-07</YAW>\n<PITCH>-5.0000017878e-07</PITCH>\n<ROLL>2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:52.081800</TIME>\n<YAW>1.1000007424e-06</YAW>\n<PITCH>-1.0000003576e-07</PITCH>\n<ROLL>1.2999997667e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:52.206800</TIME>\n<YAW>6.9999920310e-07</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>-1.1000007424e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:52.331800</TIME>\n<YAW>2.9999940914e-07</YAW>\n<PITCH>-5.0000017878e-07</PITCH>\n<ROLL>2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:52.456800</TIME>\n<YAW>6.9999920310e-07</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:52.581799</TIME>\n<YAW>2.9999940914e-07</YAW>\n<PITCH>-5.0000017878e-07</PITCH>\n<ROLL>2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:52.706799</TIME>\n<YAW>2.0000076964e-07</YAW>\n<PITCH>-1.4000001515e-06</PITCH>\n<ROLL>3.9999979396e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:52.831799</TIME>\n<YAW>8.9999997274e-07</YAW>\n<PITCH>1.0000003576e-06</PITCH>\n<ROLL>2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:52.956798</TIME>\n<YAW>-1.0000003576e-06</YAW>\n<PITCH>-2.9999940914e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:53.081798</TIME>\n<YAW>1.0000003576e-06</YAW>\n<PITCH>-1.0000003576e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:53.206798</TIME>\n<YAW>2.9999940914e-07</YAW>\n<PITCH>-6.0000056360e-07</PITCH>\n<ROLL>1.6999995607e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:53.331798</TIME>\n<YAW>-2.9999940914e-07</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>-2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:53.456797</TIME>\n<YAW>-1.0000003576e-06</YAW>\n<PITCH>-3.9999979396e-07</PITCH>\n<ROLL>1.5999991758e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:53.581797</TIME>\n<YAW>-5.0000017878e-07</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>1.0000003576e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:53.706797</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>6.9999920310e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:53.831796</TIME>\n<YAW>-1.0000003576e-07</YAW>\n<PITCH>8.9999997274e-07</PITCH>\n<ROLL>-2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:53.956796</TIME>\n<YAW>-2.0000076964e-07</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>1.1999993819e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:54.081796</TIME>\n<YAW>-2.9999940914e-07</YAW>\n<PITCH>-8.9999997274e-07</PITCH>\n<ROLL>6.9999920310e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:54.206796</TIME>\n<YAW>2.9999940914e-07</YAW>\n<PITCH>-6.0000056360e-07</PITCH>\n<ROLL>1.7999929642e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:54.331795</TIME>\n<YAW>-2.9999940914e-07</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>1.1999993819e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:54.456795</TIME>\n<YAW>2.9999940914e-07</YAW>\n<PITCH>-5.0000017878e-07</PITCH>\n<ROLL>2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:54.581795</TIME>\n<YAW>-2.0000076964e-07</YAW>\n<PITCH>8.9999997274e-07</PITCH>\n<ROLL>-2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:54.706794</TIME>\n<YAW>-1.0000003576e-06</YAW>\n<PITCH>-3.9999979396e-07</PITCH>\n<ROLL>1.5999991758e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:54.831794</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>-6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:54.956794</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>7.9999958792e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:55.081794</TIME>\n<YAW>1.0000003576e-06</YAW>\n<PITCH>-1.0000003576e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:55.206793</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>-5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:55.331793</TIME>\n<YAW>-5.0000017878e-07</YAW>\n<PITCH>-7.9999958792e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:55.456793</TIME>\n<YAW>3.9999979396e-07</YAW>\n<PITCH>2.9999940914e-07</PITCH>\n<ROLL>2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:55.581792</TIME>\n<YAW>-2.9999940914e-07</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>-1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:55.706792</TIME>\n<YAW>6.0000056360e-07</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>-8.9999997274e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:55.831792</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>8.9999997274e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:55.956792</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>-5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:56.081791</TIME>\n<YAW>-2.9999940914e-07</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:56.206791</TIME>\n<YAW>7.9999958792e-07</YAW>\n<PITCH>1.0000003576e-06</PITCH>\n<ROLL>3.9999979396e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:56.331791</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>-3.9999979396e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:56.456790</TIME>\n<YAW>-2.0000076964e-07</YAW>\n<PITCH>8.9999997274e-07</PITCH>\n<ROLL>-1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:56.581790</TIME>\n<YAW>2.9999940914e-07</YAW>\n<PITCH>3.9999979396e-07</PITCH>\n<ROLL>-3.9999979396e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:56.706790</TIME>\n<YAW>-2.0000076964e-07</YAW>\n<PITCH>8.9999997274e-07</PITCH>\n<ROLL>-1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:56.831790</TIME>\n<YAW>1.1000007424e-06</YAW>\n<PITCH>6.9999920310e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:56.956789</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>1.0000003576e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:57.081789</TIME>\n<YAW>7.9999958792e-07</YAW>\n<PITCH>1.0000003576e-06</PITCH>\n<ROLL>-8.9999997274e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:57.206789</TIME>\n<YAW>2.9999940914e-07</YAW>\n<PITCH>3.9999979396e-07</PITCH>\n<ROLL>-2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:57.331788</TIME>\n<YAW>1.0000003576e-07</YAW>\n<PITCH>5.0000017878e-07</PITCH>\n<ROLL>8.9999997274e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:57.456788</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>-3.9999979396e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:57.581788</TIME>\n<YAW>2.9999940914e-07</YAW>\n<PITCH>3.9999979396e-07</PITCH>\n<ROLL>-2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:57.706788</TIME>\n<YAW>2.0000076964e-07</YAW>\n<PITCH>-5.0000017878e-07</PITCH>\n<ROLL>6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:57.831787</TIME>\n<YAW>6.0000056360e-07</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>-6.9999920310e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:57.956787</TIME>\n<YAW>-7.9999958792e-07</YAW>\n<PITCH>-6.0000056360e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:58.081787</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>6.9999920310e-07</PITCH>\n<ROLL>-1.2999997667e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:58.206786</TIME>\n<YAW>2.0000076964e-07</YAW>\n<PITCH>-5.0000017878e-07</PITCH>\n<ROLL>6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:58.331786</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>-2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:58.456786</TIME>\n<YAW>2.9999940914e-07</YAW>\n<PITCH>3.9999979396e-07</PITCH>\n<ROLL>-2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:58.581786</TIME>\n<YAW>-1.1000007424e-06</YAW>\n<PITCH>-2.9999940914e-07</PITCH>\n<ROLL>-8.9999997274e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:58.706785</TIME>\n<YAW>2.9999940914e-07</YAW>\n<PITCH>3.9999979396e-07</PITCH>\n<ROLL>-2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:58.831785</TIME>\n<YAW>-3.9999979396e-07</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>-1.2999997667e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:58.956785</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>6.0000056360e-07</PITCH>\n<ROLL>-3.9999979396e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:59.081784</TIME>\n<YAW>2.9999940914e-07</YAW>\n<PITCH>3.9999979396e-07</PITCH>\n<ROLL>-2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:59.206784</TIME>\n<YAW>-3.9999979396e-07</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>-1.2999997667e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:59.331784</TIME>\n<YAW>6.9999920310e-07</YAW>\n<PITCH>1.0000003576e-06</PITCH>\n<ROLL>-6.9999920310e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:59.456784</TIME>\n<YAW>6.0000056360e-07</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>7.9999958792e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:59.581783</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>6.0000056360e-07</PITCH>\n<ROLL>-2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:59.706783</TIME>\n<YAW>6.0000056360e-07</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>-6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:59.831783</TIME>\n<YAW>6.0000056360e-07</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>-6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:31:59.956782</TIME>\n<YAW>6.0000056360e-07</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>-6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:00.081782</TIME>\n<YAW>1.1000007424e-06</YAW>\n<PITCH>6.9999920310e-07</PITCH>\n<ROLL>2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:00.206782</TIME>\n<YAW>6.0000056360e-07</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>-5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:00.331782</TIME>\n<YAW>8.9999997274e-07</YAW>\n<PITCH>-1.0000003576e-07</PITCH>\n<ROLL>3.9999979396e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:00.456781</TIME>\n<YAW>-2.0000076964e-07</YAW>\n<PITCH>8.9999997274e-07</PITCH>\n<ROLL>1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:00.581781</TIME>\n<YAW>6.0000056360e-07</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>-5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:00.706781</TIME>\n<YAW>6.0000056360e-07</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>-5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:00.831780</TIME>\n<YAW>2.0000076964e-07</YAW>\n<PITCH>5.0000017878e-07</PITCH>\n<ROLL>-1.5000005363e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:00.956780</TIME>\n<YAW>6.9999920310e-07</YAW>\n<PITCH>1.0000003576e-06</PITCH>\n<ROLL>-6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:01.081780</TIME>\n<YAW>-3.9999979396e-07</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:01.206780</TIME>\n<YAW>2.0000076964e-07</YAW>\n<PITCH>-5.0000017878e-07</PITCH>\n<ROLL>7.9999958792e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:01.331779</TIME>\n<YAW>6.0000056360e-07</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>-5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:01.456779</TIME>\n<YAW>3.9999979396e-07</YAW>\n<PITCH>1.4000001515e-06</PITCH>\n<ROLL>-1.5999991758e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:01.581779</TIME>\n<YAW>6.0000056360e-07</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>-3.9999979396e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:01.706778</TIME>\n<YAW>-1.0000003576e-07</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>-1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:01.831778</TIME>\n<YAW>-5.0000017878e-07</YAW>\n<PITCH>-7.9999958792e-07</PITCH>\n<ROLL>3.9999979396e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:01.956778</TIME>\n<YAW>8.9999997274e-07</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>-8.9999997274e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:02.081778</TIME>\n<YAW>3.9999979396e-07</YAW>\n<PITCH>-6.9999920310e-07</PITCH>\n<ROLL>-2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:02.206777</TIME>\n<YAW>-1.0000003576e-07</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:02.331777</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>-1.2999997667e-06</PITCH>\n<ROLL>-2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:02.456777</TIME>\n<YAW>2.0000076964e-07</YAW>\n<PITCH>5.0000017878e-07</PITCH>\n<ROLL>-1.4000001515e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:02.581776</TIME>\n<YAW>-1.0000003576e-07</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:02.706776</TIME>\n<YAW>-2.0000076964e-07</YAW>\n<PITCH>-1.1000007424e-06</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:02.831776</TIME>\n<YAW>6.0000056360e-07</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>-3.9999979396e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:02.956776</TIME>\n<YAW>-3.9999979396e-07</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>-1.0000003576e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:03.081775</TIME>\n<YAW>-2.0000076964e-07</YAW>\n<PITCH>-1.1000007424e-06</PITCH>\n<ROLL>1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:03.206775</TIME>\n<YAW>5.0000017878e-07</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>-2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:03.331775</TIME>\n<YAW>-2.9999940914e-07</YAW>\n<PITCH>8.9999997274e-07</PITCH>\n<ROLL>2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:03.456774</TIME>\n<YAW>5.0000017878e-07</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>-2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:03.581774</TIME>\n<YAW>5.0000017878e-07</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>-2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:03.706774</TIME>\n<YAW>-1.0000003576e-07</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:03.831774</TIME>\n<YAW>-3.9999979396e-07</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>3.9999979396e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:03.956773</TIME>\n<YAW>6.9999920310e-07</YAW>\n<PITCH>1.0000003576e-06</PITCH>\n<ROLL>-3.9999979396e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:04.081773</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>-1.4000001515e-06</PITCH>\n<ROLL>1.1999993819e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:04.206773</TIME>\n<YAW>5.0000017878e-07</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>-2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:04.331772</TIME>\n<YAW>6.9999920310e-07</YAW>\n<PITCH>1.0000003576e-06</PITCH>\n<ROLL>-3.9999979396e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:04.456772</TIME>\n<YAW>3.9999979396e-07</YAW>\n<PITCH>-6.9999920310e-07</PITCH>\n<ROLL>-1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:04.581772</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>5.0000017878e-07</PITCH>\n<ROLL>1.4000001515e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:04.706772</TIME>\n<YAW>8.9999997274e-07</YAW>\n<PITCH>-1.0000003576e-07</PITCH>\n<ROLL>6.9999920310e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:04.831771</TIME>\n<YAW>-1.0000003576e-07</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:04.956771</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>-2.9999940914e-07</PITCH>\n<ROLL>-1.1000007424e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:05.081771</TIME>\n<YAW>-1.0000003576e-07</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:05.206770</TIME>\n<YAW>6.9999920310e-07</YAW>\n<PITCH>-1.0000003576e-06</PITCH>\n<ROLL>8.9999997274e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:05.331770</TIME>\n<YAW>1.0000003576e-07</YAW>\n<PITCH>-5.0000017878e-07</PITCH>\n<ROLL>-2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:05.456770</TIME>\n<YAW>3.9999979396e-07</YAW>\n<PITCH>-6.9999920310e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:05.581770</TIME>\n<YAW>-1.0000003576e-07</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:05.706769</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>-1.2999997667e-06</PITCH>\n<ROLL>-1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:05.831769</TIME>\n<YAW>-6.0000056360e-07</YAW>\n<PITCH>-7.9999958792e-07</PITCH>\n<ROLL>-6.9999920310e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:05.956769</TIME>\n<YAW>6.9999920310e-07</YAW>\n<PITCH>-8.9999997274e-07</PITCH>\n<ROLL>-3.9999979396e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:06.081768</TIME>\n<YAW>-3.9999979396e-07</YAW>\n<PITCH>-2.0000076964e-06</PITCH>\n<ROLL>3.9999979396e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:06.206768</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>-1.2999997667e-06</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:06.331768</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>-1.2999997667e-06</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:06.456768</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>-2.9999940914e-07</PITCH>\n<ROLL>-1.0000003576e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:06.581767</TIME>\n<YAW>-2.9999940914e-07</YAW>\n<PITCH>-1.0000003576e-06</PITCH>\n<ROLL>-1.1000007424e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:06.706767</TIME>\n<YAW>-2.9999940914e-07</YAW>\n<PITCH>-1.1000007424e-06</PITCH>\n<ROLL>2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:06.831767</TIME>\n<YAW>2.9999940914e-07</YAW>\n<PITCH>-6.0000056360e-07</PITCH>\n<ROLL>-1.4000001515e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:06.956766</TIME>\n<YAW>-5.0000017878e-07</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>-6.9999920310e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:07.081766</TIME>\n<YAW>-5.0000017878e-07</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>-6.9999920310e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:07.206766</TIME>\n<YAW>-1.0000003576e-07</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:07.331766</TIME>\n<YAW>-6.0000056360e-07</YAW>\n<PITCH>-7.9999958792e-07</PITCH>\n<ROLL>-6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:07.456765</TIME>\n<YAW>-2.9999940914e-07</YAW>\n<PITCH>8.9999997274e-07</PITCH>\n<ROLL>-7.9999958792e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:07.581765</TIME>\n<YAW>-1.0000003576e-07</YAW>\n<PITCH>6.9999920310e-07</PITCH>\n<ROLL>-6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:07.706765</TIME>\n<YAW>5.0000017878e-07</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:07.831764</TIME>\n<YAW>-2.9999940914e-07</YAW>\n<PITCH>8.9999997274e-07</PITCH>\n<ROLL>-7.9999958792e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:07.956764</TIME>\n<YAW>6.0000056360e-07</YAW>\n<PITCH>1.0000003576e-06</PITCH>\n<ROLL>-1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:08.081764</TIME>\n<YAW>1.1000007424e-06</YAW>\n<PITCH>1.6999995607e-06</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:08.206764</TIME>\n<YAW>5.0000017878e-07</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:08.331763</TIME>\n<YAW>2.9999940914e-07</YAW>\n<PITCH>1.2999997667e-06</PITCH>\n<ROLL>2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:08.456763</TIME>\n<YAW>7.9999958792e-07</YAW>\n<PITCH>1.9000003303e-06</PITCH>\n<ROLL>-2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:08.581763</TIME>\n<YAW>2.9999940914e-07</YAW>\n<PITCH>1.2999997667e-06</PITCH>\n<ROLL>2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:08.706762</TIME>\n<YAW>7.9999958792e-07</YAW>\n<PITCH>1.9000003303e-06</PITCH>\n<ROLL>1.1999993819e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:08.831762</TIME>\n<YAW>7.9999958792e-07</YAW>\n<PITCH>1.9000003303e-06</PITCH>\n<ROLL>1.1999993819e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:08.956762</TIME>\n<YAW>1.0000003576e-07</YAW>\n<PITCH>2.4000022544e-06</PITCH>\n<ROLL>6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:09.081762</TIME>\n<YAW>2.9999940914e-07</YAW>\n<PITCH>1.2999997667e-06</PITCH>\n<ROLL>2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:09.206761</TIME>\n<YAW>-5.0000017878e-07</YAW>\n<PITCH>2.0000076964e-06</PITCH>\n<ROLL>1.0000003576e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:09.331761</TIME>\n<YAW>-2.0000076964e-07</YAW>\n<PITCH>1.7999929642e-06</PITCH>\n<ROLL>6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:09.456761</TIME>\n<YAW>-1.0000003576e-07</YAW>\n<PITCH>2.7000068995e-06</PITCH>\n<ROLL>1.1000007424e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:09.581760</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>2.7000068995e-06</PITCH>\n<ROLL>5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:09.706760</TIME>\n<YAW>-5.0000017878e-07</YAW>\n<PITCH>2.0000076964e-06</PITCH>\n<ROLL>1.1000007424e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:09.831760</TIME>\n<YAW>-6.0000056360e-07</YAW>\n<PITCH>1.1000007424e-06</PITCH>\n<ROLL>1.1999993819e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:09.956760</TIME>\n<YAW>5.0000017878e-07</YAW>\n<PITCH>2.2000049754e-06</PITCH>\n<ROLL>2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:10.081759</TIME>\n<YAW>-6.0000056360e-07</YAW>\n<PITCH>1.1000007424e-06</PITCH>\n<ROLL>1.1999993819e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:10.206759</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>5.0000017878e-07</PITCH>\n<ROLL>1.7999929642e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:10.331759</TIME>\n<YAW>-2.9999940914e-07</YAW>\n<PITCH>8.9999997274e-07</PITCH>\n<ROLL>7.9999958792e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:10.456758</TIME>\n<YAW>6.9999920310e-07</YAW>\n<PITCH>1.0000003576e-06</PITCH>\n<ROLL>1.5000005363e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:10.581758</TIME>\n<YAW>-2.0000076964e-07</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:10.706758</TIME>\n<YAW>2.9999940914e-07</YAW>\n<PITCH>1.2999997667e-06</PITCH>\n<ROLL>3.9999979396e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:10.831758</TIME>\n<YAW>-1.0000003576e-07</YAW>\n<PITCH>-2.9999940914e-07</PITCH>\n<ROLL>2.0000076964e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:10.956757</TIME>\n<YAW>-3.9999979396e-07</YAW>\n<PITCH>8.9999997274e-07</PITCH>\n<ROLL>-5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:11.081757</TIME>\n<YAW>5.0000017878e-07</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:11.206757</TIME>\n<YAW>5.0000017878e-07</YAW>\n<PITCH>1.0000003576e-07</PITCH>\n<ROLL>2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:11.331756</TIME>\n<YAW>-8.9999997274e-07</YAW>\n<PITCH>2.9999940914e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:11.456756</TIME>\n<YAW>-3.9999979396e-07</YAW>\n<PITCH>8.9999997274e-07</PITCH>\n<ROLL>-5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:11.581756</TIME>\n<YAW>1.0000003576e-07</YAW>\n<PITCH>5.0000017878e-07</PITCH>\n<ROLL>-7.9999958792e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:11.706756</TIME>\n<YAW>-2.9999940914e-07</YAW>\n<PITCH>-1.1000007424e-06</PITCH>\n<ROLL>6.9999920310e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:11.831755</TIME>\n<YAW>7.9999958792e-07</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>-1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:11.956755</TIME>\n<YAW>-6.9999920310e-07</YAW>\n<PITCH>-7.9999958792e-07</PITCH>\n<ROLL>-2.0000076964e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:12.081755</TIME>\n<YAW>3.9999979396e-07</YAW>\n<PITCH>2.0000076964e-07</PITCH>\n<ROLL>-1.1999993819e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:12.206754</TIME>\n<YAW>2.9999940914e-07</YAW>\n<PITCH>-6.9999920310e-07</PITCH>\n<ROLL>3.9999979396e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:12.331754</TIME>\n<YAW>1.0000003576e-06</YAW>\n<PITCH>-1.1999993819e-06</PITCH>\n<ROLL>8.9999997274e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:12.456754</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>-1.2999997667e-06</PITCH>\n<ROLL>2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:12.581754</TIME>\n<YAW>6.0000056360e-07</YAW>\n<PITCH>-8.9999997274e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:12.706753</TIME>\n<YAW>2.9999940914e-07</YAW>\n<PITCH>-6.9999920310e-07</PITCH>\n<ROLL>3.9999979396e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:12.831753</TIME>\n<YAW>-2.0000076964e-07</YAW>\n<PITCH>-1.0000003576e-07</PITCH>\n<ROLL>-6.9999920310e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:12.956753</TIME>\n<YAW>2.9999940914e-07</YAW>\n<PITCH>-6.9999920310e-07</PITCH>\n<ROLL>3.9999979396e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:13.081752</TIME>\n<YAW>-6.0000056360e-07</YAW>\n<PITCH>0.0000000000e+00</PITCH>\n<ROLL>-2.9999940914e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:13.206752</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>-1.2999997667e-06</PITCH>\n<ROLL>3.9999979396e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:13.331752</TIME>\n<YAW>0.0000000000e+00</YAW>\n<PITCH>-2.9999940914e-07</PITCH>\n<ROLL>-5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:13.456752</TIME>\n<YAW>-3.9999979396e-07</YAW>\n<PITCH>-1.0000003576e-06</PITCH>\n<ROLL>-6.0000056360e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:13.581751</TIME>\n<YAW>3.9999979396e-07</YAW>\n<PITCH>2.0000076964e-07</PITCH>\n<ROLL>-1.1000007424e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:13.706751</TIME>\n<YAW>-6.9999920310e-07</YAW>\n<PITCH>-7.9999958792e-07</PITCH>\n<ROLL>-1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:13.831751</TIME>\n<YAW>6.0000056360e-07</YAW>\n<PITCH>-8.9999997274e-07</PITCH>\n<ROLL>0.0000000000e+00</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:13.956750</TIME>\n<YAW>-3.9999979396e-07</YAW>\n<PITCH>-1.0000003576e-06</PITCH>\n<ROLL>-5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:14.081750</TIME>\n<YAW>2.0000076964e-07</YAW>\n<PITCH>-6.0000056360e-07</PITCH>\n<ROLL>-8.9999997274e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:14.206750</TIME>\n<YAW>-3.9999979396e-07</YAW>\n<PITCH>-1.1000007424e-06</PITCH>\n<ROLL>8.9999997274e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:14.331750</TIME>\n<YAW>6.0000056360e-07</YAW>\n<PITCH>-8.9999997274e-07</PITCH>\n<ROLL>1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:14.456749</TIME>\n<YAW>3.9999979396e-07</YAW>\n<PITCH>2.0000076964e-07</PITCH>\n<ROLL>-1.0000003576e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:14.581749</TIME>\n<YAW>2.9999940914e-07</YAW>\n<PITCH>-6.9999920310e-07</PITCH>\n<ROLL>5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:14.706749</TIME>\n<YAW>-3.9999979396e-07</YAW>\n<PITCH>-1.0000003576e-06</PITCH>\n<ROLL>-5.0000017878e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:14.831748</TIME>\n<YAW>6.0000056360e-07</YAW>\n<PITCH>-8.9999997274e-07</PITCH>\n<ROLL>1.0000003576e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:14.956748</TIME>\n<YAW>-3.9999979396e-07</YAW>\n<PITCH>-1.0000003576e-06</PITCH>\n<ROLL>-3.9999979396e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:15.081748</TIME>\n<YAW>-2.0000076964e-07</YAW>\n<PITCH>7.9999958792e-07</PITCH>\n<ROLL>-1.5000005363e-06</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:15.206748</TIME>\n<YAW>2.0000076964e-07</YAW>\n<PITCH>-6.0000056360e-07</PITCH>\n<ROLL>-7.9999958792e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n<Angular_Speeds>\n<TIME>2008-03-04T12:32:15.331747</TIME>\n<YAW>-2.0000076964e-07</YAW>\n<PITCH>-2.0000076964e-07</PITCH>\n<ROLL>7.9999958792e-07</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angular_Speeds>\n</Angular_Speeds_List>\n</Aocs_Attitude>\n<Star_Tracker_Attitude>\n<TU1_TUC>-0.335640</TU1_TUC>\n<U>-0.000001</U>\n<V>0.000002</V>\n<Quaternion_List>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:03.206912</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.3065856695e-01</Q0>\n<Q1>8.9903533459e-01</Q1>\n<Q2>4.1715109348e-01</Q2>\n<Q3>-2.5486033410e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:03.331912</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.3060051203e-01</Q0>\n<Q1>8.9904558659e-01</Q1>\n<Q2>4.1714566946e-01</Q2>\n<Q3>-2.5511495769e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:03.456912</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.3054236770e-01</Q0>\n<Q1>8.9905583858e-01</Q1>\n<Q2>4.1714018583e-01</Q2>\n<Q3>-2.5537047535e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:03.581911</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.3048419356e-01</Q0>\n<Q1>8.9906609058e-01</Q1>\n<Q2>4.1713476181e-01</Q2>\n<Q3>-2.5562528521e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:03.706911</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.3042607903e-01</Q0>\n<Q1>8.9907634258e-01</Q1>\n<Q2>4.1712933779e-01</Q2>\n<Q3>-2.5588031858e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:03.831911</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.3036796451e-01</Q0>\n<Q1>8.9908659458e-01</Q1>\n<Q2>4.1712385416e-01</Q2>\n<Q3>-2.5613553822e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:03.956910</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.3030982018e-01</Q0>\n<Q1>8.9909684658e-01</Q1>\n<Q2>4.1711837053e-01</Q2>\n<Q3>-2.5639049709e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:04.081910</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.3025170565e-01</Q0>\n<Q1>8.9910697937e-01</Q1>\n<Q2>4.1711294651e-01</Q2>\n<Q3>-2.5664567947e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:04.206910</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.3019362092e-01</Q0>\n<Q1>8.9911723137e-01</Q1>\n<Q2>4.1710752249e-01</Q2>\n<Q3>-2.5689993054e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:04.331910</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.3013544679e-01</Q0>\n<Q1>8.9912748337e-01</Q1>\n<Q2>4.1710209847e-01</Q2>\n<Q3>-2.5715474039e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:04.456909</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.3007730246e-01</Q0>\n<Q1>8.9913761616e-01</Q1>\n<Q2>4.1709655523e-01</Q2>\n<Q3>-2.5741018355e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:04.581909</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.3001918793e-01</Q0>\n<Q1>8.9914786816e-01</Q1>\n<Q2>4.1709113121e-01</Q2>\n<Q3>-2.5766469538e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:04.706909</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.2996104360e-01</Q0>\n<Q1>8.9915812016e-01</Q1>\n<Q2>4.1708564758e-01</Q2>\n<Q3>-2.5791950524e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:04.831908</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.2990292907e-01</Q0>\n<Q1>8.9916825294e-01</Q1>\n<Q2>4.1708022356e-01</Q2>\n<Q3>-2.5817371905e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:04.956908</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.2984478474e-01</Q0>\n<Q1>8.9917850494e-01</Q1>\n<Q2>4.1707473993e-01</Q2>\n<Q3>-2.5842823088e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:05.081908</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.2978672981e-01</Q0>\n<Q1>8.9918863773e-01</Q1>\n<Q2>4.1706925631e-01</Q2>\n<Q3>-2.5868188590e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:05.206908</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.2972861528e-01</Q0>\n<Q1>8.9919888973e-01</Q1>\n<Q2>4.1706377268e-01</Q2>\n<Q3>-2.5893639773e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:05.331907</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.2967050076e-01</Q0>\n<Q1>8.9920902252e-01</Q1>\n<Q2>4.1705834866e-01</Q2>\n<Q3>-2.5919046253e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:05.456907</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.2961241603e-01</Q0>\n<Q1>8.9921915531e-01</Q1>\n<Q2>4.1705292463e-01</Q2>\n<Q3>-2.5944422930e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:05.581907</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.2955430150e-01</Q0>\n<Q1>8.9922940731e-01</Q1>\n<Q2>4.1704750061e-01</Q2>\n<Q3>-2.5969844311e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:05.706906</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.2949618697e-01</Q0>\n<Q1>8.9923954010e-01</Q1>\n<Q2>4.1704201698e-01</Q2>\n<Q3>-2.5995295495e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:05.831906</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.2943807244e-01</Q0>\n<Q1>8.9924967289e-01</Q1>\n<Q2>4.1703659296e-01</Q2>\n<Q3>-2.6020716876e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:05.956906</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.2937995791e-01</Q0>\n<Q1>8.9925980568e-01</Q1>\n<Q2>4.1703116894e-01</Q2>\n<Q3>-2.6046141982e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:06.081906</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.2932184339e-01</Q0>\n<Q1>8.9927005768e-01</Q1>\n<Q2>4.1702568531e-01</Q2>\n<Q3>-2.6071660221e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:06.206905</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.2926369905e-01</Q0>\n<Q1>8.9928019047e-01</Q1>\n<Q2>4.1702026129e-01</Q2>\n<Q3>-2.6097066700e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:06.331905</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.2920555472e-01</Q0>\n<Q1>8.9929032326e-01</Q1>\n<Q2>4.1701477766e-01</Q2>\n<Q3>-2.6122450829e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:06.456905</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.2914741039e-01</Q0>\n<Q1>8.9930045605e-01</Q1>\n<Q2>4.1700929403e-01</Q2>\n<Q3>-2.6147902012e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:06.581904</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.2908929586e-01</Q0>\n<Q1>8.9931058884e-01</Q1>\n<Q2>4.1700387001e-01</Q2>\n<Q3>-2.6173323393e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:06.706904</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.2903121114e-01</Q0>\n<Q1>8.9932072163e-01</Q1>\n<Q2>4.1699838638e-01</Q2>\n<Q3>-2.6198741049e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:06.831904</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.2897312641e-01</Q0>\n<Q1>8.9933085442e-01</Q1>\n<Q2>4.1699296236e-01</Q2>\n<Q3>-2.6224233210e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:06.956904</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.2891501188e-01</Q0>\n<Q1>8.9934098721e-01</Q1>\n<Q2>4.1698741913e-01</Q2>\n<Q3>-2.6249695569e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:07.081903</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.2885695696e-01</Q0>\n<Q1>8.9935112000e-01</Q1>\n<Q2>4.1698193550e-01</Q2>\n<Q3>-2.6275131851e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:07.206903</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.2879890203e-01</Q0>\n<Q1>8.9936125278e-01</Q1>\n<Q2>4.1697639227e-01</Q2>\n<Q3>-2.6300564408e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:07.331903</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.2874075770e-01</Q0>\n<Q1>8.9937138557e-01</Q1>\n<Q2>4.1697090864e-01</Q2>\n<Q3>-2.6326075196e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:07.456902</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.2868264318e-01</Q0>\n<Q1>8.9938151836e-01</Q1>\n<Q2>4.1696536541e-01</Q2>\n<Q3>-2.6351537555e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:07.581902</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.2862455845e-01</Q0>\n<Q1>8.9939165115e-01</Q1>\n<Q2>4.1695982218e-01</Q2>\n<Q3>-2.6376985013e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:07.706902</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.2856644392e-01</Q0>\n<Q1>8.9940178394e-01</Q1>\n<Q2>4.1695427895e-01</Q2>\n<Q3>-2.6402447373e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:07.831902</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.2850838900e-01</Q0>\n<Q1>8.9941179752e-01</Q1>\n<Q2>4.1694879532e-01</Q2>\n<Q3>-2.6427950710e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:07.956901</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.2845027447e-01</Q0>\n<Q1>8.9942204952e-01</Q1>\n<Q2>4.1694319248e-01</Q2>\n<Q3>-2.6453439146e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:08.081901</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.2839221954e-01</Q0>\n<Q1>8.9943206310e-01</Q1>\n<Q2>4.1693770885e-01</Q2>\n<Q3>-2.6478942484e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:08.206901</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.2833416462e-01</Q0>\n<Q1>8.9944219589e-01</Q1>\n<Q2>4.1693216562e-01</Q2>\n<Q3>-2.6504445821e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:08.331900</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.2827599049e-01</Q0>\n<Q1>8.9945232868e-01</Q1>\n<Q2>4.1692662239e-01</Q2>\n<Q3>-2.6529930532e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:08.456900</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.2821793556e-01</Q0>\n<Q1>8.9946234226e-01</Q1>\n<Q2>4.1692107916e-01</Q2>\n<Q3>-2.6555459946e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:08.581900</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.2815982103e-01</Q0>\n<Q1>8.9947247505e-01</Q1>\n<Q2>4.1691553593e-01</Q2>\n<Q3>-2.6580993086e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:08.706900</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.2810170650e-01</Q0>\n<Q1>8.9948260784e-01</Q1>\n<Q2>4.1690999269e-01</Q2>\n<Q3>-2.6606455445e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:08.831899</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.2804359198e-01</Q0>\n<Q1>8.9949262142e-01</Q1>\n<Q2>4.1690444946e-01</Q2>\n<Q3>-2.6631996036e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:08.956899</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.2798547745e-01</Q0>\n<Q1>8.9950275421e-01</Q1>\n<Q2>4.1689890623e-01</Q2>\n<Q3>-2.6657458395e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:09.081899</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.2792733312e-01</Q0>\n<Q1>8.9951288700e-01</Q1>\n<Q2>4.1689336300e-01</Q2>\n<Q3>-2.6682972908e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:09.206898</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.2786921859e-01</Q0>\n<Q1>8.9952290058e-01</Q1>\n<Q2>4.1688781977e-01</Q2>\n<Q3>-2.6708506048e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:09.331898</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.2781107426e-01</Q0>\n<Q1>8.9953303337e-01</Q1>\n<Q2>4.1688227653e-01</Q2>\n<Q3>-2.6733968407e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:09.456898</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.2775290012e-01</Q0>\n<Q1>8.9954304695e-01</Q1>\n<Q2>4.1687667370e-01</Q2>\n<Q3>-2.6759557426e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:09.581898</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.2769475579e-01</Q0>\n<Q1>8.9955317974e-01</Q1>\n<Q2>4.1687113047e-01</Q2>\n<Q3>-2.6785030961e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:09.706897</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.2763664126e-01</Q0>\n<Q1>8.9956319332e-01</Q1>\n<Q2>4.1686558723e-01</Q2>\n<Q3>-2.6810489595e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:09.831897</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.2757849693e-01</Q0>\n<Q1>8.9957332611e-01</Q1>\n<Q2>4.1686004400e-01</Q2>\n<Q3>-2.6836004108e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:09.956897</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.2752038240e-01</Q0>\n<Q1>8.9958333969e-01</Q1>\n<Q2>4.1685450077e-01</Q2>\n<Q3>-2.6861466467e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:10.081896</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.2746226788e-01</Q0>\n<Q1>8.9959335327e-01</Q1>\n<Q2>4.1684895754e-01</Q2>\n<Q3>-2.6886999607e-02</Q3>\n</Quaternion>\n<Quaternion>\n<Q_TIME>2008-03-04T12:31:10.206896</Q_TIME>\n<Q_STATUS>3</Q_STATUS>\n<Q0>1.2740421295e-01</Q0>\n<Q1>8.9960336685e-01</Q1>\n<Q2>4.1684335470e-01</Q2>\n<Q3>-2.6912428439e-02</Q3>\n</Quaternion>\n</Quaternion_List>\n</Star_Tracker_Attitude>\n</Raw_Attitudes>\n<Corrected_Attitudes>\n<STAR_TRACKER_USED>Y</STAR_TRACKER_USED>\n<Corrected_Attitude>\n<Angles>\n<TIME>2008-03-04T12:31:03.206912</TIME>\n<YAW>1.1621635280e-03</YAW>\n<PITCH>-9.5496029568e-04</PITCH>\n<ROLL>-1.7549389832e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:03.331912</TIME>\n<YAW>1.1622064463e-03</YAW>\n<PITCH>-9.5506049908e-04</PITCH>\n<ROLL>-1.7576724833e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:03.456912</TIME>\n<YAW>1.1623283868e-03</YAW>\n<PITCH>-9.5492219975e-04</PITCH>\n<ROLL>-1.7704390877e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:03.581911</TIME>\n<YAW>1.1623599330e-03</YAW>\n<PITCH>-9.5479158109e-04</PITCH>\n<ROLL>-1.7663227190e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:03.706911</TIME>\n<YAW>1.1623883717e-03</YAW>\n<PITCH>-9.5475042923e-04</PITCH>\n<ROLL>-1.7710977149e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:03.831911</TIME>\n<YAW>1.1625188884e-03</YAW>\n<PITCH>-9.5469064290e-04</PITCH>\n<ROLL>-1.7806616409e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:03.956910</TIME>\n<YAW>1.1626545043e-03</YAW>\n<PITCH>-9.5459808519e-04</PITCH>\n<ROLL>-1.7829313571e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:04.081910</TIME>\n<YAW>1.1625788800e-03</YAW>\n<PITCH>-9.5457555994e-04</PITCH>\n<ROLL>-1.7906614047e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:04.206910</TIME>\n<YAW>1.1626282423e-03</YAW>\n<PITCH>-9.5465344165e-04</PITCH>\n<ROLL>-1.7834187971e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:04.331910</TIME>\n<YAW>1.1626582054e-03</YAW>\n<PITCH>-9.5452392088e-04</PITCH>\n<ROLL>-1.7786295427e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:04.456909</TIME>\n<YAW>1.1627879668e-03</YAW>\n<PITCH>-9.5441882245e-04</PITCH>\n<ROLL>-1.7913184938e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:04.581909</TIME>\n<YAW>1.1628282479e-03</YAW>\n<PITCH>-9.5442137030e-04</PITCH>\n<ROLL>-1.7859322391e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:04.706909</TIME>\n<YAW>1.1629661769e-03</YAW>\n<PITCH>-9.5434235940e-04</PITCH>\n<ROLL>-1.7848465579e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:04.831908</TIME>\n<YAW>1.1629143170e-03</YAW>\n<PITCH>-9.5439980422e-04</PITCH>\n<ROLL>-1.7744953881e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:04.956908</TIME>\n<YAW>1.1630594764e-03</YAW>\n<PITCH>-9.5434573648e-04</PITCH>\n<ROLL>-1.7678268548e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:05.081908</TIME>\n<YAW>1.1631318018e-03</YAW>\n<PITCH>-9.5455497224e-04</PITCH>\n<ROLL>-1.7537405236e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:05.206908</TIME>\n<YAW>1.1632779821e-03</YAW>\n<PITCH>-9.5455449439e-04</PITCH>\n<ROLL>-1.7493368719e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:05.331907</TIME>\n<YAW>1.1632289399e-03</YAW>\n<PITCH>-9.5462440511e-04</PITCH>\n<ROLL>-1.7358584401e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:05.456907</TIME>\n<YAW>1.1631888328e-03</YAW>\n<PITCH>-9.5477383355e-04</PITCH>\n<ROLL>-1.7194053060e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:05.581907</TIME>\n<YAW>1.1632347586e-03</YAW>\n<PITCH>-9.5480143174e-04</PITCH>\n<ROLL>-1.7077614958e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:05.706906</TIME>\n<YAW>1.1632805370e-03</YAW>\n<PITCH>-9.5483085992e-04</PITCH>\n<ROLL>-1.7035268368e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:05.831906</TIME>\n<YAW>1.1632265082e-03</YAW>\n<PITCH>-9.5488935381e-04</PITCH>\n<ROLL>-1.6922814269e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:05.956906</TIME>\n<YAW>1.1631712529e-03</YAW>\n<PITCH>-9.5494473636e-04</PITCH>\n<ROLL>-1.6815942911e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:06.081906</TIME>\n<YAW>1.1632982771e-03</YAW>\n<PITCH>-9.5488830010e-04</PITCH>\n<ROLL>-1.6884533236e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:06.206905</TIME>\n<YAW>1.1632458381e-03</YAW>\n<PITCH>-9.5490467691e-04</PITCH>\n<ROLL>-1.6717006744e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:06.331905</TIME>\n<YAW>1.1633060396e-03</YAW>\n<PITCH>-9.5493764501e-04</PITCH>\n<ROLL>-1.6523600176e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:06.456905</TIME>\n<YAW>1.1633486496e-03</YAW>\n<PITCH>-9.5491454731e-04</PITCH>\n<ROLL>-1.6449605772e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:06.581904</TIME>\n<YAW>1.1632931190e-03</YAW>\n<PITCH>-9.5497205178e-04</PITCH>\n<ROLL>-1.6330429867e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:06.706904</TIME>\n<YAW>1.1633469851e-03</YAW>\n<PITCH>-9.5508414396e-04</PITCH>\n<ROLL>-1.6243753490e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:06.831904</TIME>\n<YAW>1.1632741664e-03</YAW>\n<PITCH>-9.5513709328e-04</PITCH>\n<ROLL>-1.6274516846e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:06.956904</TIME>\n<YAW>1.1634216431e-03</YAW>\n<PITCH>-9.5515510407e-04</PITCH>\n<ROLL>-1.6256402866e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:07.081903</TIME>\n<YAW>1.1634715795e-03</YAW>\n<PITCH>-9.5530419197e-04</PITCH>\n<ROLL>-1.6224731032e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:07.206903</TIME>\n<YAW>1.1636293668e-03</YAW>\n<PITCH>-9.5545428136e-04</PITCH>\n<ROLL>-1.6200598705e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:07.331903</TIME>\n<YAW>1.1636548436e-03</YAW>\n<PITCH>-9.5538139546e-04</PITCH>\n<ROLL>-1.6225875574e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:07.456902</TIME>\n<YAW>1.1638013938e-03</YAW>\n<PITCH>-9.5539839747e-04</PITCH>\n<ROLL>-1.6203200450e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:07.581902</TIME>\n<YAW>1.1639530299e-03</YAW>\n<PITCH>-9.5548247149e-04</PITCH>\n<ROLL>-1.6177526747e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:07.706902</TIME>\n<YAW>1.1640990117e-03</YAW>\n<PITCH>-9.5550051632e-04</PITCH>\n<ROLL>-1.6152587010e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:07.831902</TIME>\n<YAW>1.1640307341e-03</YAW>\n<PITCH>-9.5562527182e-04</PITCH>\n<ROLL>-1.6241027875e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:07.956901</TIME>\n<YAW>1.1643762219e-03</YAW>\n<PITCH>-9.5558670656e-04</PITCH>\n<ROLL>-1.6269659114e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:08.081901</TIME>\n<YAW>1.1643074715e-03</YAW>\n<PITCH>-9.5571146486e-04</PITCH>\n<ROLL>-1.6355847898e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:08.206901</TIME>\n<YAW>1.1644451139e-03</YAW>\n<PITCH>-9.5580244860e-04</PITCH>\n<ROLL>-1.6449866282e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:08.331900</TIME>\n<YAW>1.1645810480e-03</YAW>\n<PITCH>-9.5569365924e-04</PITCH>\n<ROLL>-1.6409588112e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:08.456900</TIME>\n<YAW>1.1646121246e-03</YAW>\n<PITCH>-9.5579343608e-04</PITCH>\n<ROLL>-1.6554577808e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:08.581900</TIME>\n<YAW>1.1647382546e-03</YAW>\n<PITCH>-9.5575237376e-04</PITCH>\n<ROLL>-1.6648944856e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:08.706900</TIME>\n<YAW>1.1648822841e-03</YAW>\n<PITCH>-9.5577049467e-04</PITCH>\n<ROLL>-1.6614912268e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:08.831899</TIME>\n<YAW>1.1649067017e-03</YAW>\n<PITCH>-9.5575272967e-04</PITCH>\n<ROLL>-1.6726767373e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:08.956899</TIME>\n<YAW>1.1650502413e-03</YAW>\n<PITCH>-9.5577087160e-04</PITCH>\n<ROLL>-1.6690463553e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:09.081899</TIME>\n<YAW>1.1651785977e-03</YAW>\n<PITCH>-9.5569185144e-04</PITCH>\n<ROLL>-1.6721884748e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:09.206898</TIME>\n<YAW>1.1652042161e-03</YAW>\n<PITCH>-9.5568031784e-04</PITCH>\n<ROLL>-1.6816956845e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:09.331898</TIME>\n<YAW>1.1653454260e-03</YAW>\n<PITCH>-9.5564491836e-04</PITCH>\n<ROLL>-1.6752332975e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:09.456898</TIME>\n<YAW>1.1654602699e-03</YAW>\n<PITCH>-9.5547732654e-04</PITCH>\n<ROLL>-1.6911045519e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:09.581898</TIME>\n<YAW>1.1655981341e-03</YAW>\n<PITCH>-9.5543261194e-04</PITCH>\n<ROLL>-1.6864241900e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:09.706897</TIME>\n<YAW>1.1656418285e-03</YAW>\n<PITCH>-9.5548335830e-04</PITCH>\n<ROLL>-1.6820824239e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:09.831897</TIME>\n<YAW>1.1657687364e-03</YAW>\n<PITCH>-9.5540442697e-04</PITCH>\n<ROLL>-1.6845435541e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:09.956897</TIME>\n<YAW>1.1658109170e-03</YAW>\n<PITCH>-9.5545309817e-04</PITCH>\n<ROLL>-1.6806472293e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:10.081896</TIME>\n<YAW>1.1658348760e-03</YAW>\n<PITCH>-9.5544158149e-04</PITCH>\n<ROLL>-1.6893645538e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:10.206896</TIME>\n<YAW>1.1659955583e-03</YAW>\n<PITCH>-9.5562223221e-04</PITCH>\n<ROLL>-1.6857138954e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:10.331896</TIME>\n<YAW>1.1661085080e-03</YAW>\n<PITCH>-9.5545241407e-04</PITCH>\n<ROLL>-1.6932691482e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:10.456896</TIME>\n<YAW>1.1661326408e-03</YAW>\n<PITCH>-9.5544505909e-04</PITCH>\n<ROLL>-1.7009793043e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:10.581895</TIME>\n<YAW>1.1660489938e-03</YAW>\n<PITCH>-9.5534206842e-04</PITCH>\n<ROLL>-1.7000680505e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:10.706895</TIME>\n<YAW>1.1660685796e-03</YAW>\n<PITCH>-9.5536964007e-04</PITCH>\n<ROLL>-1.7140643261e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:10.831895</TIME>\n<YAW>1.1661916829e-03</YAW>\n<PITCH>-9.5533415817e-04</PITCH>\n<ROLL>-1.7283122139e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:10.956894</TIME>\n<YAW>1.1662149563e-03</YAW>\n<PITCH>-9.5532580021e-04</PITCH>\n<ROLL>-1.7355712433e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:11.081894</TIME>\n<YAW>1.1662492808e-03</YAW>\n<PITCH>-9.5535583977e-04</PITCH>\n<ROLL>-1.7346799588e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:11.206894</TIME>\n<YAW>1.1662720129e-03</YAW>\n<PITCH>-9.5534853019e-04</PITCH>\n<ROLL>-1.7417155120e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:11.331894</TIME>\n<YAW>1.1663938033e-03</YAW>\n<PITCH>-9.5521521928e-04</PITCH>\n<ROLL>-1.7485194211e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:11.456893</TIME>\n<YAW>1.1664182993e-03</YAW>\n<PITCH>-9.5516575529e-04</PITCH>\n<ROLL>-1.7501576473e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:11.581893</TIME>\n<YAW>1.1665475823e-03</YAW>\n<PITCH>-9.5515521894e-04</PITCH>\n<ROLL>-1.7583660042e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:11.706893</TIME>\n<YAW>1.1666700263e-03</YAW>\n<PITCH>-9.5512289990e-04</PITCH>\n<ROLL>-1.7711504424e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:11.831892</TIME>\n<YAW>1.1667906913e-03</YAW>\n<PITCH>-9.5503596214e-04</PITCH>\n<ROLL>-1.7813292604e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:11.956892</TIME>\n<YAW>1.1669372042e-03</YAW>\n<PITCH>-9.5508460065e-04</PITCH>\n<ROLL>-1.7764663355e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:12.081892</TIME>\n<YAW>1.1670773891e-03</YAW>\n<PITCH>-9.5501670973e-04</PITCH>\n<ROLL>-1.7685186338e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:12.206892</TIME>\n<YAW>1.1672138278e-03</YAW>\n<PITCH>-9.5513095880e-04</PITCH>\n<ROLL>-1.7853102969e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:12.331891</TIME>\n<YAW>1.1672686837e-03</YAW>\n<PITCH>-9.5518740533e-04</PITCH>\n<ROLL>-1.7633765037e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:12.456891</TIME>\n<YAW>1.1673956315e-03</YAW>\n<PITCH>-9.5512644400e-04</PITCH>\n<ROLL>-1.7676281688e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:12.581891</TIME>\n<YAW>1.1676237117e-03</YAW>\n<PITCH>-9.5509091421e-04</PITCH>\n<ROLL>-1.7811217146e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:12.706890</TIME>\n<YAW>1.1676433825e-03</YAW>\n<PITCH>-9.5503414031e-04</PITCH>\n<ROLL>-1.7911610048e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:12.831890</TIME>\n<YAW>1.1677881907e-03</YAW>\n<PITCH>-9.5508284246e-04</PITCH>\n<ROLL>-1.7855006523e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:12.956890</TIME>\n<YAW>1.1679174733e-03</YAW>\n<PITCH>-9.5512913903e-04</PITCH>\n<ROLL>-1.7942773756e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:13.081890</TIME>\n<YAW>1.1679438970e-03</YAW>\n<PITCH>-9.5509829563e-04</PITCH>\n<ROLL>-1.7986188063e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:13.206889</TIME>\n<YAW>1.1680523722e-03</YAW>\n<PITCH>-9.5502773453e-04</PITCH>\n<ROLL>-1.8180783773e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:13.331889</TIME>\n<YAW>1.1683903532e-03</YAW>\n<PITCH>-9.5495404182e-04</PITCH>\n<ROLL>-1.8258763918e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:13.456889</TIME>\n<YAW>1.1683109241e-03</YAW>\n<PITCH>-9.5488534912e-04</PITCH>\n<ROLL>-1.8232071249e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:13.581888</TIME>\n<YAW>1.1685372549e-03</YAW>\n<PITCH>-9.5484888345e-04</PITCH>\n<ROLL>-1.8357843130e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:13.706888</TIME>\n<YAW>1.1685625222e-03</YAW>\n<PITCH>-9.5481804867e-04</PITCH>\n<ROLL>-1.8395600369e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:13.831888</TIME>\n<YAW>1.1685999577e-03</YAW>\n<PITCH>-9.5478028792e-04</PITCH>\n<ROLL>-1.8306816969e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:13.956888</TIME>\n<YAW>1.1687257418e-03</YAW>\n<PITCH>-9.5477310520e-04</PITCH>\n<ROLL>-1.8360591482e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:14.081887</TIME>\n<YAW>1.1688501614e-03</YAW>\n<PITCH>-9.5471303159e-04</PITCH>\n<ROLL>-1.8463529253e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:14.206887</TIME>\n<YAW>1.1688761419e-03</YAW>\n<PITCH>-9.5473581420e-04</PITCH>\n<ROLL>-1.8521670034e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:14.331887</TIME>\n<YAW>1.1688918243e-03</YAW>\n<PITCH>-9.5467697883e-04</PITCH>\n<ROLL>-1.8614099812e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:14.456886</TIME>\n<YAW>1.1690349356e-03</YAW>\n<PITCH>-9.5463319786e-04</PITCH>\n<ROLL>-1.8459392549e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:14.581886</TIME>\n<YAW>1.1690494264e-03</YAW>\n<PITCH>-9.5452388237e-04</PITCH>\n<ROLL>-1.8517968034e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:14.706886</TIME>\n<YAW>1.1691726284e-03</YAW>\n<PITCH>-9.5446484882e-04</PITCH>\n<ROLL>-1.8615250312e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:14.831886</TIME>\n<YAW>1.1692065699e-03</YAW>\n<PITCH>-9.5456617329e-04</PITCH>\n<ROLL>-1.8639033865e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:14.956885</TIME>\n<YAW>1.1692135011e-03</YAW>\n<PITCH>-9.5452883941e-04</PITCH>\n<ROLL>-1.8817726684e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:15.081885</TIME>\n<YAW>1.1693369603e-03</YAW>\n<PITCH>-9.5447293036e-04</PITCH>\n<ROLL>-1.8904906226e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:15.206885</TIME>\n<YAW>1.1694942725e-03</YAW>\n<PITCH>-9.5462694752e-04</PITCH>\n<ROLL>-1.8819575386e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:15.331884</TIME>\n<YAW>1.1694953426e-03</YAW>\n<PITCH>-9.5447618559e-04</PITCH>\n<ROLL>-1.8958495290e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:15.456884</TIME>\n<YAW>1.1695033766e-03</YAW>\n<PITCH>-9.5439875214e-04</PITCH>\n<ROLL>-1.9080990805e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:15.581884</TIME>\n<YAW>1.1695259814e-03</YAW>\n<PITCH>-9.5439481729e-04</PITCH>\n<ROLL>-1.9114278733e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:15.706884</TIME>\n<YAW>1.1696556465e-03</YAW>\n<PITCH>-9.5438753684e-04</PITCH>\n<ROLL>-1.9161319258e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:15.831883</TIME>\n<YAW>1.1697778061e-03</YAW>\n<PITCH>-9.5433064491e-04</PITCH>\n<ROLL>-1.9241675056e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:15.956883</TIME>\n<YAW>1.1697003935e-03</YAW>\n<PITCH>-9.5435647901e-04</PITCH>\n<ROLL>-1.9278300765e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:16.081883</TIME>\n<YAW>1.1698394016e-03</YAW>\n<PITCH>-9.5443084133e-04</PITCH>\n<ROLL>-1.9286508535e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:16.206882</TIME>\n<YAW>1.1699608748e-03</YAW>\n<PITCH>-9.5437397184e-04</PITCH>\n<ROLL>-1.9363461489e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:16.331882</TIME>\n<YAW>1.1699721471e-03</YAW>\n<PITCH>-9.5426478768e-04</PITCH>\n<ROLL>-1.9406258186e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:16.456882</TIME>\n<YAW>1.1700002710e-03</YAW>\n<PITCH>-9.5426043260e-04</PITCH>\n<ROLL>-1.9440790348e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:16.581882</TIME>\n<YAW>1.1701309280e-03</YAW>\n<PITCH>-9.5430994750e-04</PITCH>\n<ROLL>-1.9498073148e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:16.706881</TIME>\n<YAW>1.1701544649e-03</YAW>\n<PITCH>-9.5426703509e-04</PITCH>\n<ROLL>-1.9462785174e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:16.831881</TIME>\n<YAW>1.1701818928e-03</YAW>\n<PITCH>-9.5426267511e-04</PITCH>\n<ROLL>-1.9493931408e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:16.956881</TIME>\n<YAW>1.1704171424e-03</YAW>\n<PITCH>-9.5435002063e-04</PITCH>\n<ROLL>-1.9614319429e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:17.081880</TIME>\n<YAW>1.1703368774e-03</YAW>\n<PITCH>-9.5434801758e-04</PITCH>\n<ROLL>-1.9628382527e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:17.206880</TIME>\n<YAW>1.1705746158e-03</YAW>\n<PITCH>-9.5439731835e-04</PITCH>\n<ROLL>-1.9688078076e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:17.331880</TIME>\n<YAW>1.1707100767e-03</YAW>\n<PITCH>-9.5427597942e-04</PITCH>\n<ROLL>-1.9545132229e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:17.456880</TIME>\n<YAW>1.1706389644e-03</YAW>\n<PITCH>-9.5438034903e-04</PITCH>\n<ROLL>-1.9539546033e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:17.581879</TIME>\n<YAW>1.1706688404e-03</YAW>\n<PITCH>-9.5436370082e-04</PITCH>\n<ROLL>-1.9517936401e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:17.706879</TIME>\n<YAW>1.1707866355e-03</YAW>\n<PITCH>-9.5428120861e-04</PITCH>\n<ROLL>-1.9568842774e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:17.831879</TIME>\n<YAW>1.1708131292e-03</YAW>\n<PITCH>-9.5427996593e-04</PITCH>\n<ROLL>-1.9584246543e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:17.956878</TIME>\n<YAW>1.1708327098e-03</YAW>\n<PITCH>-9.5435072737e-04</PITCH>\n<ROLL>-1.9722023882e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:18.081878</TIME>\n<YAW>1.1708657604e-03</YAW>\n<PITCH>-9.5449288880e-04</PITCH>\n<ROLL>-1.9777282862e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:18.206878</TIME>\n<YAW>1.1709023411e-03</YAW>\n<PITCH>-9.5462379309e-04</PITCH>\n<ROLL>-1.9785451063e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:18.331878</TIME>\n<YAW>1.1712475154e-03</YAW>\n<PITCH>-9.5455749816e-04</PITCH>\n<ROLL>-1.9740451594e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:18.456877</TIME>\n<YAW>1.1712729243e-03</YAW>\n<PITCH>-9.5455523966e-04</PITCH>\n<ROLL>-1.9750185526e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:18.581877</TIME>\n<YAW>1.1712026054e-03</YAW>\n<PITCH>-9.5462158814e-04</PITCH>\n<ROLL>-1.9676085219e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:18.706877</TIME>\n<YAW>1.1713511515e-03</YAW>\n<PITCH>-9.5474404633e-04</PITCH>\n<ROLL>-1.9635067409e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:18.831876</TIME>\n<YAW>1.1714751457e-03</YAW>\n<PITCH>-9.5471239117e-04</PITCH>\n<ROLL>-1.9634552473e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:18.956876</TIME>\n<YAW>1.1714092521e-03</YAW>\n<PITCH>-9.5484281821e-04</PITCH>\n<ROLL>-1.9637057695e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:19.081876</TIME>\n<YAW>1.1717480251e-03</YAW>\n<PITCH>-9.5490328743e-04</PITCH>\n<ROLL>-1.9733554855e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:19.206876</TIME>\n<YAW>1.1716825914e-03</YAW>\n<PITCH>-9.5503681132e-04</PITCH>\n<ROLL>-1.9727097577e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:19.331875</TIME>\n<YAW>1.1715798334e-03</YAW>\n<PITCH>-9.5494901753e-04</PITCH>\n<ROLL>-1.9835894124e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:19.456875</TIME>\n<YAW>1.1717205543e-03</YAW>\n<PITCH>-9.5504973387e-04</PITCH>\n<ROLL>-1.9834980472e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:19.581875</TIME>\n<YAW>1.1718438575e-03</YAW>\n<PITCH>-9.5499652969e-04</PITCH>\n<ROLL>-1.9883724040e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:19.706874</TIME>\n<YAW>1.1718669465e-03</YAW>\n<PITCH>-9.5499435064e-04</PITCH>\n<ROLL>-1.9882168124e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:19.831874</TIME>\n<YAW>1.1719897942e-03</YAW>\n<PITCH>-9.5494116479e-04</PITCH>\n<ROLL>-1.9928639938e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:19.956874</TIME>\n<YAW>1.1720048643e-03</YAW>\n<PITCH>-9.5498628480e-04</PITCH>\n<ROLL>-2.0035914784e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:20.081874</TIME>\n<YAW>1.1719378220e-03</YAW>\n<PITCH>-9.5511979134e-04</PITCH>\n<ROLL>-2.0021600563e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:20.206873</TIME>\n<YAW>1.1719435277e-03</YAW>\n<PITCH>-9.5506167689e-04</PITCH>\n<ROLL>-2.0136224961e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:20.331873</TIME>\n<YAW>1.1718662271e-03</YAW>\n<PITCH>-9.5504242132e-04</PITCH>\n<ROLL>-2.0097699575e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:20.456873</TIME>\n<YAW>1.1720944170e-03</YAW>\n<PITCH>-9.5495898447e-04</PITCH>\n<ROLL>-2.0140688613e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:20.581872</TIME>\n<YAW>1.1721168082e-03</YAW>\n<PITCH>-9.5496000288e-04</PITCH>\n<ROLL>-2.0124536601e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:20.706872</TIME>\n<YAW>1.1721451863e-03</YAW>\n<PITCH>-9.5495786432e-04</PITCH>\n<ROLL>-2.0123095293e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:20.831872</TIME>\n<YAW>1.1722662174e-03</YAW>\n<PITCH>-9.5490475455e-04</PITCH>\n<ROLL>-2.0160498936e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:20.956872</TIME>\n<YAW>1.1723062150e-03</YAW>\n<PITCH>-9.5489791699e-04</PITCH>\n<ROLL>-1.9949434018e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:21.081871</TIME>\n<YAW>1.1723438546e-03</YAW>\n<PITCH>-9.5500008999e-04</PITCH>\n<ROLL>-1.9928266040e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:21.206871</TIME>\n<YAW>1.1724705635e-03</YAW>\n<PITCH>-9.5496879373e-04</PITCH>\n<ROLL>-1.9915325016e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:21.331871</TIME>\n<YAW>1.1725224864e-03</YAW>\n<PITCH>-9.5497948122e-04</PITCH>\n<ROLL>-1.9669749184e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:21.456870</TIME>\n<YAW>1.1725606322e-03</YAW>\n<PITCH>-9.5496856165e-04</PITCH>\n<ROLL>-1.9460853549e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:21.581870</TIME>\n<YAW>1.1725901611e-03</YAW>\n<PITCH>-9.5492832497e-04</PITCH>\n<ROLL>-1.9393096826e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:21.706870</TIME>\n<YAW>1.1725094503e-03</YAW>\n<PITCH>-9.5483483253e-04</PITCH>\n<ROLL>-1.9291495137e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:21.831870</TIME>\n<YAW>1.1726548821e-03</YAW>\n<PITCH>-9.5491944704e-04</PITCH>\n<ROLL>-1.9163646932e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:21.956869</TIME>\n<YAW>1.1725836401e-03</YAW>\n<PITCH>-9.5493028569e-04</PITCH>\n<ROLL>-1.9043459254e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:22.081869</TIME>\n<YAW>1.1726023208e-03</YAW>\n<PITCH>-9.5478470476e-04</PITCH>\n<ROLL>-1.8987529828e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:22.206869</TIME>\n<YAW>1.1724240773e-03</YAW>\n<PITCH>-9.5480320416e-04</PITCH>\n<ROLL>-1.8843897590e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:22.331868</TIME>\n<YAW>1.1725551157e-03</YAW>\n<PITCH>-9.5469544744e-04</PITCH>\n<ROLL>-1.8779133544e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:22.456868</TIME>\n<YAW>1.1725810893e-03</YAW>\n<PITCH>-9.5469642557e-04</PITCH>\n<ROLL>-1.8755197645e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:22.581868</TIME>\n<YAW>1.1725013453e-03</YAW>\n<PITCH>-9.5465972156e-04</PITCH>\n<ROLL>-1.8663937286e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:22.706868</TIME>\n<YAW>1.1725268505e-03</YAW>\n<PITCH>-9.5466070927e-04</PITCH>\n<ROLL>-1.8637753122e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:22.831867</TIME>\n<YAW>1.1727506789e-03</YAW>\n<PITCH>-9.5457647310e-04</PITCH>\n<ROLL>-1.8659062409e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:22.956867</TIME>\n<YAW>1.1728758693e-03</YAW>\n<PITCH>-9.5452535715e-04</PITCH>\n<ROLL>-1.8679594224e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:23.081867</TIME>\n<YAW>1.1729025426e-03</YAW>\n<PITCH>-9.5448515700e-04</PITCH>\n<ROLL>-1.8598308697e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:23.206866</TIME>\n<YAW>1.1729244555e-03</YAW>\n<PITCH>-9.5449953909e-04</PITCH>\n<ROLL>-1.8606844837e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:23.331866</TIME>\n<YAW>1.1731581557e-03</YAW>\n<PITCH>-9.5442739232e-04</PITCH>\n<ROLL>-1.8605867292e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:23.456866</TIME>\n<YAW>1.1732824357e-03</YAW>\n<PITCH>-9.5437629023e-04</PITCH>\n<ROLL>-1.8621844457e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:23.581866</TIME>\n<YAW>1.1734064899e-03</YAW>\n<PITCH>-9.5432519366e-04</PITCH>\n<ROLL>-1.8636681549e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:23.706865</TIME>\n<YAW>1.1734320628e-03</YAW>\n<PITCH>-9.5428400019e-04</PITCH>\n<ROLL>-1.8549718960e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:23.831865</TIME>\n<YAW>1.1736531063e-03</YAW>\n<PITCH>-9.5419516435e-04</PITCH>\n<ROLL>-1.8650485605e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:23.956865</TIME>\n<YAW>1.1737990205e-03</YAW>\n<PITCH>-9.5422181449e-04</PITCH>\n<ROLL>-1.8494228067e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:24.081864</TIME>\n<YAW>1.1739222292e-03</YAW>\n<PITCH>-9.5416971981e-04</PITCH>\n<ROLL>-1.8504489477e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:24.206864</TIME>\n<YAW>1.1740352908e-03</YAW>\n<PITCH>-9.5398958922e-04</PITCH>\n<ROLL>-1.8510832451e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:24.331864</TIME>\n<YAW>1.1741273831e-03</YAW>\n<PITCH>-9.5380912571e-04</PITCH>\n<ROLL>-1.8727731469e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:24.456864</TIME>\n<YAW>1.1742507572e-03</YAW>\n<PITCH>-9.5376120522e-04</PITCH>\n<ROLL>-1.8727883385e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:24.581863</TIME>\n<YAW>1.1742639429e-03</YAW>\n<PITCH>-9.5372745760e-04</PITCH>\n<ROLL>-1.8833657805e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:24.706863</TIME>\n<YAW>1.1743859807e-03</YAW>\n<PITCH>-9.5365272344e-04</PITCH>\n<ROLL>-1.8819101554e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:24.831863</TIME>\n<YAW>1.1742841385e-03</YAW>\n<PITCH>-9.5348010238e-04</PITCH>\n<ROLL>-1.8866207606e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:24.956862</TIME>\n<YAW>1.1744120730e-03</YAW>\n<PITCH>-9.5344984153e-04</PITCH>\n<ROLL>-1.8821561848e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:25.081862</TIME>\n<YAW>1.1745172645e-03</YAW>\n<PITCH>-9.5334291334e-04</PITCH>\n<ROLL>-1.8943479935e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:25.206862</TIME>\n<YAW>1.1744389689e-03</YAW>\n<PITCH>-9.5334912164e-04</PITCH>\n<ROLL>-1.8882685936e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:25.331862</TIME>\n<YAW>1.1745374722e-03</YAW>\n<PITCH>-9.5305440681e-04</PITCH>\n<ROLL>-1.8915302262e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:25.456861</TIME>\n<YAW>1.1745581044e-03</YAW>\n<PITCH>-9.5300429731e-04</PITCH>\n<ROLL>-1.8907820318e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:25.581861</TIME>\n<YAW>1.1747859397e-03</YAW>\n<PITCH>-9.5292605885e-04</PITCH>\n<ROLL>-1.8899652478e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:25.706861</TIME>\n<YAW>1.1748132143e-03</YAW>\n<PITCH>-9.5292556953e-04</PITCH>\n<ROLL>-1.8855394302e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:25.831860</TIME>\n<YAW>1.1748439116e-03</YAW>\n<PITCH>-9.5298392801e-04</PITCH>\n<ROLL>-1.8821444241e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:25.956860</TIME>\n<YAW>1.1749681559e-03</YAW>\n<PITCH>-9.5299604429e-04</PITCH>\n<ROLL>-1.8819414417e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:26.081860</TIME>\n<YAW>1.1749723880e-03</YAW>\n<PITCH>-9.5291785603e-04</PITCH>\n<ROLL>-1.8939468828e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:26.206860</TIME>\n<YAW>1.1750998839e-03</YAW>\n<PITCH>-9.5286827737e-04</PITCH>\n<ROLL>-1.8932803384e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:26.331859</TIME>\n<YAW>1.1752297488e-03</YAW>\n<PITCH>-9.5278255017e-04</PITCH>\n<ROLL>-1.8784681372e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:26.456859</TIME>\n<YAW>1.1752476595e-03</YAW>\n<PITCH>-9.5289645994e-04</PITCH>\n<ROLL>-1.8908855578e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:26.581859</TIME>\n<YAW>1.1752670853e-03</YAW>\n<PITCH>-9.5285051242e-04</PITCH>\n<ROLL>-1.8884498571e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:26.706858</TIME>\n<YAW>1.1752863931e-03</YAW>\n<PITCH>-9.5289844345e-04</PITCH>\n<ROLL>-1.8935563266e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:26.831858</TIME>\n<YAW>1.1752964650e-03</YAW>\n<PITCH>-9.5284515203e-04</PITCH>\n<ROLL>-1.8995178089e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:26.956858</TIME>\n<YAW>1.1751918435e-03</YAW>\n<PITCH>-9.5286554447e-04</PITCH>\n<ROLL>-1.9169644919e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:27.081858</TIME>\n<YAW>1.1751997355e-03</YAW>\n<PITCH>-9.5285351174e-04</PITCH>\n<ROLL>-1.9278713045e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:27.206857</TIME>\n<YAW>1.1751189856e-03</YAW>\n<PITCH>-9.5292996360e-04</PITCH>\n<ROLL>-1.9332548965e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:27.331857</TIME>\n<YAW>1.1750430159e-03</YAW>\n<PITCH>-9.5291058101e-04</PITCH>\n<ROLL>-1.9167435398e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:27.456857</TIME>\n<YAW>1.1751594731e-03</YAW>\n<PITCH>-9.5294859726e-04</PITCH>\n<ROLL>-1.9312223761e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:27.581856</TIME>\n<YAW>1.1751772634e-03</YAW>\n<PITCH>-9.5299658985e-04</PITCH>\n<ROLL>-1.9355408159e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:27.706856</TIME>\n<YAW>1.1753003540e-03</YAW>\n<PITCH>-9.5298830271e-04</PITCH>\n<ROLL>-1.9386828718e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:27.831856</TIME>\n<YAW>1.1754179177e-03</YAW>\n<PITCH>-9.5298510726e-04</PITCH>\n<ROLL>-1.9476503027e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:27.956856</TIME>\n<YAW>1.1755396646e-03</YAW>\n<PITCH>-9.5295000167e-04</PITCH>\n<ROLL>-1.9493210984e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:28.081855</TIME>\n<YAW>1.1755728097e-03</YAW>\n<PITCH>-9.5307447065e-04</PITCH>\n<ROLL>-1.9512126860e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:28.206855</TIME>\n<YAW>1.1756951243e-03</YAW>\n<PITCH>-9.5316113110e-04</PITCH>\n<ROLL>-1.9615546239e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:28.331855</TIME>\n<YAW>1.1758223179e-03</YAW>\n<PITCH>-9.5305287803e-04</PITCH>\n<ROLL>-1.9505311934e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:28.456854</TIME>\n<YAW>1.1759530751e-03</YAW>\n<PITCH>-9.5312215032e-04</PITCH>\n<ROLL>-1.9501060072e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:28.581854</TIME>\n<YAW>1.1759684442e-03</YAW>\n<PITCH>-9.5318859441e-04</PITCH>\n<ROLL>-1.9642931599e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:28.706854</TIME>\n<YAW>1.1760755678e-03</YAW>\n<PITCH>-9.5308319857e-04</PITCH>\n<ROLL>-1.9734310212e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:28.831854</TIME>\n<YAW>1.1763031950e-03</YAW>\n<PITCH>-9.5304448265e-04</PITCH>\n<ROLL>-1.9757192629e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:28.956853</TIME>\n<YAW>1.1762185869e-03</YAW>\n<PITCH>-9.5316527342e-04</PITCH>\n<ROLL>-1.9840254887e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:29.081853</TIME>\n<YAW>1.1763241910e-03</YAW>\n<PITCH>-9.5305681184e-04</PITCH>\n<ROLL>-1.9934931346e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:29.206853</TIME>\n<YAW>1.1764468284e-03</YAW>\n<PITCH>-9.5312267759e-04</PITCH>\n<ROLL>-2.0078562776e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:29.331852</TIME>\n<YAW>1.1764570978e-03</YAW>\n<PITCH>-9.5310786872e-04</PITCH>\n<ROLL>-2.0101161810e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:29.456852</TIME>\n<YAW>1.1764628970e-03</YAW>\n<PITCH>-9.5302769022e-04</PITCH>\n<ROLL>-2.0199809909e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:29.581852</TIME>\n<YAW>1.1766999294e-03</YAW>\n<PITCH>-9.5309752474e-04</PITCH>\n<ROLL>-2.0192719587e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:29.706852</TIME>\n<YAW>1.1768110429e-03</YAW>\n<PITCH>-9.5305490414e-04</PITCH>\n<ROLL>-2.0354898444e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:29.831851</TIME>\n<YAW>1.1769235461e-03</YAW>\n<PITCH>-9.5306840487e-04</PITCH>\n<ROLL>-2.0458891401e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:29.956851</TIME>\n<YAW>1.1769541348e-03</YAW>\n<PITCH>-9.5312580862e-04</PITCH>\n<ROLL>-2.0396680516e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:30.081851</TIME>\n<YAW>1.1769749814e-03</YAW>\n<PITCH>-9.5324397551e-04</PITCH>\n<ROLL>-2.0483706390e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:30.206850</TIME>\n<YAW>1.1770133290e-03</YAW>\n<PITCH>-9.5344698813e-04</PITCH>\n<ROLL>-2.0454516161e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:30.331850</TIME>\n<YAW>1.1770115416e-03</YAW>\n<PITCH>-9.5336881472e-04</PITCH>\n<ROLL>-2.0611357153e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:30.456850</TIME>\n<YAW>1.1771524183e-03</YAW>\n<PITCH>-9.5355361296e-04</PITCH>\n<ROLL>-2.0627531533e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:30.581850</TIME>\n<YAW>1.1772661246e-03</YAW>\n<PITCH>-9.5353010288e-04</PITCH>\n<ROLL>-2.0666307744e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:30.706849</TIME>\n<YAW>1.1772859850e-03</YAW>\n<PITCH>-9.5364727601e-04</PITCH>\n<ROLL>-2.0747658905e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:30.831849</TIME>\n<YAW>1.1773124400e-03</YAW>\n<PITCH>-9.5371912938e-04</PITCH>\n<ROLL>-2.0716794539e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:30.956849</TIME>\n<YAW>1.1774394410e-03</YAW>\n<PITCH>-9.5392856795e-04</PITCH>\n<ROLL>-2.0886480482e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:31.081848</TIME>\n<YAW>1.1774684208e-03</YAW>\n<PITCH>-9.5412741383e-04</PITCH>\n<ROLL>-2.0928888103e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:31.206848</TIME>\n<YAW>1.1773706349e-03</YAW>\n<PITCH>-9.5418782481e-04</PITCH>\n<ROLL>-2.1128278112e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:31.331848</TIME>\n<YAW>1.1773925089e-03</YAW>\n<PITCH>-9.5415232312e-04</PITCH>\n<ROLL>-2.1043189830e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:31.456848</TIME>\n<YAW>1.1774276178e-03</YAW>\n<PITCH>-9.5430585769e-04</PITCH>\n<ROLL>-2.0971125629e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:31.581847</TIME>\n<YAW>1.1775454480e-03</YAW>\n<PITCH>-9.5434391358e-04</PITCH>\n<ROLL>-2.1080692729e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:31.706847</TIME>\n<YAW>1.1775799385e-03</YAW>\n<PITCH>-9.5442625471e-04</PITCH>\n<ROLL>-2.0948949426e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:31.831847</TIME>\n<YAW>1.1774952329e-03</YAW>\n<PITCH>-9.5458383062e-04</PITCH>\n<ROLL>-2.1073619019e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:31.956846</TIME>\n<YAW>1.1776397032e-03</YAW>\n<PITCH>-9.5478942125e-04</PITCH>\n<ROLL>-2.1029130736e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:32.081846</TIME>\n<YAW>1.1777566215e-03</YAW>\n<PITCH>-9.5482854119e-04</PITCH>\n<ROLL>-2.1134159181e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:32.206846</TIME>\n<YAW>1.1777983758e-03</YAW>\n<PITCH>-9.5505758361e-04</PITCH>\n<ROLL>-2.1033161127e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:32.331846</TIME>\n<YAW>1.1779353894e-03</YAW>\n<PITCH>-9.5516436919e-04</PITCH>\n<ROLL>-2.1063423851e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:32.456845</TIME>\n<YAW>1.1781896499e-03</YAW>\n<PITCH>-9.5528369274e-04</PITCH>\n<ROLL>-2.0924915577e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:32.581845</TIME>\n<YAW>1.1783057163e-03</YAW>\n<PITCH>-9.5532285376e-04</PITCH>\n<ROLL>-2.1025370142e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:32.706845</TIME>\n<YAW>1.1782491683e-03</YAW>\n<PITCH>-9.5558603415e-04</PITCH>\n<ROLL>-2.0913931091e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:32.831844</TIME>\n<YAW>1.1783812198e-03</YAW>\n<PITCH>-9.5561197713e-04</PITCH>\n<ROLL>-2.0827163565e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:32.956844</TIME>\n<YAW>1.1784966459e-03</YAW>\n<PITCH>-9.5565118139e-04</PITCH>\n<ROLL>-2.0924201996e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:33.081844</TIME>\n<YAW>1.1785370895e-03</YAW>\n<PITCH>-9.5580519977e-04</PITCH>\n<ROLL>-2.0839717651e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:33.206844</TIME>\n<YAW>1.1786520940e-03</YAW>\n<PITCH>-9.5584443225e-04</PITCH>\n<ROLL>-2.0934476973e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:33.331843</TIME>\n<YAW>1.1786754332e-03</YAW>\n<PITCH>-9.5586718197e-04</PITCH>\n<ROLL>-2.0917835779e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:33.456843</TIME>\n<YAW>1.1786157961e-03</YAW>\n<PITCH>-9.5612416733e-04</PITCH>\n<ROLL>-2.0813050329e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:33.581843</TIME>\n<YAW>1.1788393591e-03</YAW>\n<PITCH>-9.5616586322e-04</PITCH>\n<ROLL>-2.0904861947e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:33.706842</TIME>\n<YAW>1.1787695689e-03</YAW>\n<PITCH>-9.5631643820e-04</PITCH>\n<ROLL>-2.0814235584e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:33.831842</TIME>\n<YAW>1.1787850243e-03</YAW>\n<PITCH>-9.5631537330e-04</PITCH>\n<ROLL>-2.0846784907e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:33.956842</TIME>\n<YAW>1.1790046484e-03</YAW>\n<PITCH>-9.5639217970e-04</PITCH>\n<ROLL>-2.1000281168e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:34.081842</TIME>\n<YAW>1.1790259948e-03</YAW>\n<PITCH>-9.5648410001e-04</PITCH>\n<ROLL>-2.1040974553e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:34.206841</TIME>\n<YAW>1.1790664157e-03</YAW>\n<PITCH>-9.5669080367e-04</PITCH>\n<ROLL>-2.0971112462e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:34.331841</TIME>\n<YAW>1.1790835411e-03</YAW>\n<PITCH>-9.5667532375e-04</PITCH>\n<ROLL>-2.0959856517e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:34.456841</TIME>\n<YAW>1.1791198191e-03</YAW>\n<PITCH>-9.5682314835e-04</PITCH>\n<ROLL>-2.0876325113e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:34.581840</TIME>\n<YAW>1.1793408212e-03</YAW>\n<PITCH>-9.5683708649e-04</PITCH>\n<ROLL>-2.0946536486e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:34.706840</TIME>\n<YAW>1.1791642831e-03</YAW>\n<PITCH>-9.5706590537e-04</PITCH>\n<ROLL>-2.0958935876e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:34.831840</TIME>\n<YAW>1.1792839568e-03</YAW>\n<PITCH>-9.5710233407e-04</PITCH>\n<ROLL>-2.1047944494e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:34.956840</TIME>\n<YAW>1.1794221024e-03</YAW>\n<PITCH>-9.5728247365e-04</PITCH>\n<ROLL>-2.0963643658e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:35.081839</TIME>\n<YAW>1.1794486268e-03</YAW>\n<PITCH>-9.5743848257e-04</PITCH>\n<ROLL>-2.1068416578e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:35.206839</TIME>\n<YAW>1.1794619346e-03</YAW>\n<PITCH>-9.5748496852e-04</PITCH>\n<ROLL>-2.1126777739e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:35.331839</TIME>\n<YAW>1.1795857715e-03</YAW>\n<PITCH>-9.5749255297e-04</PITCH>\n<ROLL>-2.1132677847e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:35.456838</TIME>\n<YAW>1.1796065804e-03</YAW>\n<PITCH>-9.5758972364e-04</PITCH>\n<ROLL>-2.1147472907e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:35.581838</TIME>\n<YAW>1.1796190714e-03</YAW>\n<PITCH>-9.5758874534e-04</PITCH>\n<ROLL>-2.1164171917e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:35.706838</TIME>\n<YAW>1.1797535560e-03</YAW>\n<PITCH>-9.5766046790e-04</PITCH>\n<ROLL>-2.1098512520e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:35.831838</TIME>\n<YAW>1.1797704053e-03</YAW>\n<PITCH>-9.5779378722e-04</PITCH>\n<ROLL>-2.1175043656e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:35.956837</TIME>\n<YAW>1.1799896438e-03</YAW>\n<PITCH>-9.5777992451e-04</PITCH>\n<ROLL>-2.1295399757e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:36.081837</TIME>\n<YAW>1.1799256974e-03</YAW>\n<PITCH>-9.5796157612e-04</PITCH>\n<ROLL>-2.1191392425e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:36.206837</TIME>\n<YAW>1.1800545605e-03</YAW>\n<PITCH>-9.5810970218e-04</PITCH>\n<ROLL>-2.1237981725e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:36.331836</TIME>\n<YAW>1.1802767668e-03</YAW>\n<PITCH>-9.5794512111e-04</PITCH>\n<ROLL>-2.1187394663e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:36.456836</TIME>\n<YAW>1.1804951151e-03</YAW>\n<PITCH>-9.5793231002e-04</PITCH>\n<ROLL>-2.1303165105e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:36.581836</TIME>\n<YAW>1.1806183352e-03</YAW>\n<PITCH>-9.5789868989e-04</PITCH>\n<ROLL>-2.1245951511e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:36.706836</TIME>\n<YAW>1.1807510818e-03</YAW>\n<PITCH>-9.5797048982e-04</PITCH>\n<ROLL>-2.1171136780e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:36.831835</TIME>\n<YAW>1.1807762284e-03</YAW>\n<PITCH>-9.5808514946e-04</PITCH>\n<ROLL>-2.1208312044e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:36.956835</TIME>\n<YAW>1.1808042606e-03</YAW>\n<PITCH>-9.5812575824e-04</PITCH>\n<ROLL>-2.1052393317e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:37.081835</TIME>\n<YAW>1.1808433541e-03</YAW>\n<PITCH>-9.5827046895e-04</PITCH>\n<ROLL>-2.0954041986e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:37.206834</TIME>\n<YAW>1.1807635713e-03</YAW>\n<PITCH>-9.5835391299e-04</PITCH>\n<ROLL>-2.0909014008e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:37.331834</TIME>\n<YAW>1.1811040916e-03</YAW>\n<PITCH>-9.5837251480e-04</PITCH>\n<ROLL>-2.0883732181e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:37.456834</TIME>\n<YAW>1.1812433149e-03</YAW>\n<PITCH>-9.5849607834e-04</PITCH>\n<ROLL>-2.0760767328e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:37.581834</TIME>\n<YAW>1.1811869536e-03</YAW>\n<PITCH>-9.5871499513e-04</PITCH>\n<ROLL>-2.0562611083e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:37.706833</TIME>\n<YAW>1.1811038404e-03</YAW>\n<PITCH>-9.5881289827e-04</PITCH>\n<ROLL>-2.0552343468e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:37.831833</TIME>\n<YAW>1.1810211819e-03</YAW>\n<PITCH>-9.5889118456e-04</PITCH>\n<ROLL>-2.0515124716e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:37.956833</TIME>\n<YAW>1.1810701572e-03</YAW>\n<PITCH>-9.5914751140e-04</PITCH>\n<ROLL>-2.0378941808e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:38.081832</TIME>\n<YAW>1.1809863963e-03</YAW>\n<PITCH>-9.5924542667e-04</PITCH>\n<ROLL>-2.0365311380e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:38.206832</TIME>\n<YAW>1.1810349225e-03</YAW>\n<PITCH>-9.5950175716e-04</PITCH>\n<ROLL>-2.0226865049e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:38.331832</TIME>\n<YAW>1.1810557278e-03</YAW>\n<PITCH>-9.5944806055e-04</PITCH>\n<ROLL>-2.0123268905e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:38.456832</TIME>\n<YAW>1.1810770431e-03</YAW>\n<PITCH>-9.5953690227e-04</PITCH>\n<ROLL>-2.0133328462e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:38.581831</TIME>\n<YAW>1.1811099627e-03</YAW>\n<PITCH>-9.5962839525e-04</PITCH>\n<ROLL>-1.9921382702e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:38.706831</TIME>\n<YAW>1.1810424778e-03</YAW>\n<PITCH>-9.5987674287e-04</PITCH>\n<ROLL>-1.9932951440e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:38.831831</TIME>\n<YAW>1.1810791748e-03</YAW>\n<PITCH>-9.6000081886e-04</PITCH>\n<ROLL>-1.9792899455e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:38.956830</TIME>\n<YAW>1.1809953390e-03</YAW>\n<PITCH>-9.6005748107e-04</PITCH>\n<ROLL>-1.9719713132e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:39.081830</TIME>\n<YAW>1.1810422860e-03</YAW>\n<PITCH>-9.6031384949e-04</PITCH>\n<ROLL>-1.9573338128e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:39.206830</TIME>\n<YAW>1.1811790198e-03</YAW>\n<PITCH>-9.6040918954e-04</PITCH>\n<ROLL>-1.9497190141e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:39.331830</TIME>\n<YAW>1.1812373227e-03</YAW>\n<PITCH>-9.6054581775e-04</PITCH>\n<ROLL>-1.9113892258e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:39.456829</TIME>\n<YAW>1.1812569649e-03</YAW>\n<PITCH>-9.6063369237e-04</PITCH>\n<ROLL>-1.9114885385e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:39.581829</TIME>\n<YAW>1.1813937400e-03</YAW>\n<PITCH>-9.6070839410e-04</PITCH>\n<ROLL>-1.9009464685e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:39.706829</TIME>\n<YAW>1.1814145803e-03</YAW>\n<PITCH>-9.6080352827e-04</PITCH>\n<ROLL>-1.8994769002e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:39.831828</TIME>\n<YAW>1.1813298897e-03</YAW>\n<PITCH>-9.6083172480e-04</PITCH>\n<ROLL>-1.8976437818e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:39.956828</TIME>\n<YAW>1.1814706486e-03</YAW>\n<PITCH>-9.6099323835e-04</PITCH>\n<ROLL>-1.8891409123e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:40.081828</TIME>\n<YAW>1.1814862092e-03</YAW>\n<PITCH>-9.6100160446e-04</PITCH>\n<ROLL>-1.8849509021e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:40.206828</TIME>\n<YAW>1.1816059677e-03</YAW>\n<PITCH>-9.6104114081e-04</PITCH>\n<ROLL>-1.8885120425e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:40.331827</TIME>\n<YAW>1.1818388817e-03</YAW>\n<PITCH>-9.6107366515e-04</PITCH>\n<ROLL>-1.8866944572e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:40.456827</TIME>\n<YAW>1.1820753129e-03</YAW>\n<PITCH>-9.6105145787e-04</PITCH>\n<ROLL>-1.8756654342e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:40.581827</TIME>\n<YAW>1.1819942138e-03</YAW>\n<PITCH>-9.6121499811e-04</PITCH>\n<ROLL>-1.8793618836e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:40.706826</TIME>\n<YAW>1.1822146856e-03</YAW>\n<PITCH>-9.6120409494e-04</PITCH>\n<ROLL>-1.8866015726e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:40.831826</TIME>\n<YAW>1.1823378924e-03</YAW>\n<PITCH>-9.6116725568e-04</PITCH>\n<ROLL>-1.8779084893e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:40.956826</TIME>\n<YAW>1.1823580608e-03</YAW>\n<PITCH>-9.6121316084e-04</PITCH>\n<ROLL>-1.8789920979e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:41.081826</TIME>\n<YAW>1.1824666665e-03</YAW>\n<PITCH>-9.6114735286e-04</PITCH>\n<ROLL>-1.8834018556e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:41.206825</TIME>\n<YAW>1.1824874860e-03</YAW>\n<PITCH>-9.6121909222e-04</PITCH>\n<ROLL>-1.8854985688e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:41.331825</TIME>\n<YAW>1.1828104373e-03</YAW>\n<PITCH>-9.6109781962e-04</PITCH>\n<ROLL>-1.8885460059e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:41.456825</TIME>\n<YAW>1.1827306705e-03</YAW>\n<PITCH>-9.6117873107e-04</PITCH>\n<ROLL>-1.8811129318e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:41.581824</TIME>\n<YAW>1.1829400204e-03</YAW>\n<PITCH>-9.6106247530e-04</PITCH>\n<ROLL>-1.8891981668e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:41.706824</TIME>\n<YAW>1.1830651148e-03</YAW>\n<PITCH>-9.6114571040e-04</PITCH>\n<ROLL>-1.8961124716e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:41.831824</TIME>\n<YAW>1.1831812078e-03</YAW>\n<PITCH>-9.6115854413e-04</PITCH>\n<ROLL>-1.8969453225e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:41.956824</TIME>\n<YAW>1.1830992333e-03</YAW>\n<PITCH>-9.6128080432e-04</PITCH>\n<ROLL>-1.8942293321e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:42.081823</TIME>\n<YAW>1.1832251589e-03</YAW>\n<PITCH>-9.6132168786e-04</PITCH>\n<ROLL>-1.8956311555e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:42.206823</TIME>\n<YAW>1.1832178138e-03</YAW>\n<PITCH>-9.6122698826e-04</PITCH>\n<ROLL>-1.9119048456e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:42.331823</TIME>\n<YAW>1.1832259167e-03</YAW>\n<PITCH>-9.6117570402e-04</PITCH>\n<ROLL>-1.9045322228e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:42.456822</TIME>\n<YAW>1.1833512341e-03</YAW>\n<PITCH>-9.6121659743e-04</PITCH>\n<ROLL>-1.9055921841e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:42.581822</TIME>\n<YAW>1.1832531591e-03</YAW>\n<PITCH>-9.6128305204e-04</PITCH>\n<ROLL>-1.9144043549e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:42.706822</TIME>\n<YAW>1.1832704663e-03</YAW>\n<PITCH>-9.6132899435e-04</PITCH>\n<ROLL>-1.9138999727e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:42.831822</TIME>\n<YAW>1.1833934336e-03</YAW>\n<PITCH>-9.6136471920e-04</PITCH>\n<ROLL>-1.9159632346e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:42.956821</TIME>\n<YAW>1.1834187476e-03</YAW>\n<PITCH>-9.6155640238e-04</PITCH>\n<ROLL>-1.9187483544e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:43.081821</TIME>\n<YAW>1.1834521424e-03</YAW>\n<PITCH>-9.6178014857e-04</PITCH>\n<ROLL>-1.9147037507e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:43.206821</TIME>\n<YAW>1.1835748338e-03</YAW>\n<PITCH>-9.6186342468e-04</PITCH>\n<ROLL>-1.9202499414e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:43.331820</TIME>\n<YAW>1.1836877128e-03</YAW>\n<PITCH>-9.6184024613e-04</PITCH>\n<ROLL>-1.9273318467e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:43.456820</TIME>\n<YAW>1.1837104818e-03</YAW>\n<PITCH>-9.6202679483e-04</PITCH>\n<ROLL>-1.9310071984e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:43.581820</TIME>\n<YAW>1.1837198871e-03</YAW>\n<PITCH>-9.6203958546e-04</PITCH>\n<ROLL>-1.9439407683e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:43.706820</TIME>\n<YAW>1.1837499321e-03</YAW>\n<PITCH>-9.6227783574e-04</PITCH>\n<ROLL>-1.9432560451e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:43.831819</TIME>\n<YAW>1.1837581924e-03</YAW>\n<PITCH>-9.6243442033e-04</PITCH>\n<ROLL>-1.9599234603e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:43.956819</TIME>\n<YAW>1.1837670306e-03</YAW>\n<PITCH>-9.6244719339e-04</PITCH>\n<ROLL>-1.9725176037e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:44.081819</TIME>\n<YAW>1.1837718289e-03</YAW>\n<PITCH>-9.6252421261e-04</PITCH>\n<ROLL>-1.9852376841e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:44.206818</TIME>\n<YAW>1.1837562020e-03</YAW>\n<PITCH>-9.6247823516e-04</PITCH>\n<ROLL>-2.0101420447e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:44.331818</TIME>\n<YAW>1.1838840282e-03</YAW>\n<PITCH>-9.6257791347e-04</PITCH>\n<ROLL>-2.0181457551e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:44.456818</TIME>\n<YAW>1.1839814546e-03</YAW>\n<PITCH>-9.6245866092e-04</PITCH>\n<ROLL>-2.0311283611e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:44.581818</TIME>\n<YAW>1.1837653078e-03</YAW>\n<PITCH>-9.6246918708e-04</PITCH>\n<ROLL>-2.0498038176e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:44.706817</TIME>\n<YAW>1.1839633518e-03</YAW>\n<PITCH>-9.6232005204e-04</PITCH>\n<ROLL>-2.0692606858e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:44.831817</TIME>\n<YAW>1.1840741385e-03</YAW>\n<PITCH>-9.6222979569e-04</PITCH>\n<ROLL>-2.0685683535e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:44.956817</TIME>\n<YAW>1.1842856475e-03</YAW>\n<PITCH>-9.6211067208e-04</PITCH>\n<ROLL>-2.0744621465e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:45.081816</TIME>\n<YAW>1.1842981168e-03</YAW>\n<PITCH>-9.6207279021e-04</PITCH>\n<ROLL>-2.0755943169e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:45.206816</TIME>\n<YAW>1.1843884280e-03</YAW>\n<PITCH>-9.6190813272e-04</PITCH>\n<ROLL>-2.0906841884e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:45.331816</TIME>\n<YAW>1.1845647534e-03</YAW>\n<PITCH>-9.6147479131e-04</PITCH>\n<ROLL>-2.1078087832e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:45.456816</TIME>\n<YAW>1.1846764995e-03</YAW>\n<PITCH>-9.6138217086e-04</PITCH>\n<ROLL>-2.1140589004e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:45.581815</TIME>\n<YAW>1.1848803760e-03</YAW>\n<PITCH>-9.6112148555e-04</PITCH>\n<ROLL>-2.1145177038e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:45.706815</TIME>\n<YAW>1.1849801055e-03</YAW>\n<PITCH>-9.6092588828e-04</PITCH>\n<ROLL>-2.1146784122e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:45.831815</TIME>\n<YAW>1.1850918968e-03</YAW>\n<PITCH>-9.6081259195e-04</PITCH>\n<ROLL>-2.1180008716e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:45.956814</TIME>\n<YAW>1.1853773470e-03</YAW>\n<PITCH>-9.6047548573e-04</PITCH>\n<ROLL>-2.1421766174e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:46.081814</TIME>\n<YAW>1.1853910905e-03</YAW>\n<PITCH>-9.6040349696e-04</PITCH>\n<ROLL>-2.1358871605e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:46.206814</TIME>\n<YAW>1.1856975447e-03</YAW>\n<PITCH>-9.6014807402e-04</PITCH>\n<ROLL>-2.1423629601e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:46.331814</TIME>\n<YAW>1.1856649682e-03</YAW>\n<PITCH>-9.5983419874e-04</PITCH>\n<ROLL>-2.1670648488e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:46.456813</TIME>\n<YAW>1.1858674677e-03</YAW>\n<PITCH>-9.5957360730e-04</PITCH>\n<ROLL>-2.1667190302e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:46.581813</TIME>\n<YAW>1.1858668375e-03</YAW>\n<PITCH>-9.5940446705e-04</PITCH>\n<ROLL>-2.1669012153e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:46.706813</TIME>\n<YAW>1.1859600141e-03</YAW>\n<PITCH>-9.5913404549e-04</PITCH>\n<ROLL>-2.1752129009e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:46.831812</TIME>\n<YAW>1.1860565501e-03</YAW>\n<PITCH>-9.5899078283e-04</PITCH>\n<ROLL>-2.1909553271e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:46.956812</TIME>\n<YAW>1.1860512188e-03</YAW>\n<PITCH>-9.5889815482e-04</PITCH>\n<ROLL>-2.2024790953e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:47.081812</TIME>\n<YAW>1.1862600544e-03</YAW>\n<PITCH>-9.5875859039e-04</PITCH>\n<ROLL>-2.2038352884e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:47.206812</TIME>\n<YAW>1.1863524759e-03</YAW>\n<PITCH>-9.5848818666e-04</PITCH>\n<ROLL>-2.2116909417e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:47.331811</TIME>\n<YAW>1.1866714188e-03</YAW>\n<PITCH>-9.5825190943e-04</PITCH>\n<ROLL>-2.2126481170e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:47.456811</TIME>\n<YAW>1.1866655251e-03</YAW>\n<PITCH>-9.5809108080e-04</PITCH>\n<ROLL>-2.2173077895e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:47.581811</TIME>\n<YAW>1.1867821890e-03</YAW>\n<PITCH>-9.5802950021e-04</PITCH>\n<ROLL>-2.2148941329e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:47.706810</TIME>\n<YAW>1.1868894984e-03</YAW>\n<PITCH>-9.5790900889e-04</PITCH>\n<ROLL>-2.2178446427e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:47.831810</TIME>\n<YAW>1.1869813811e-03</YAW>\n<PITCH>-9.5768618327e-04</PITCH>\n<ROLL>-2.2289538783e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:47.956810</TIME>\n<YAW>1.1870921131e-03</YAW>\n<PITCH>-9.5755845944e-04</PITCH>\n<ROLL>-2.2264048738e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:48.081810</TIME>\n<YAW>1.1872149501e-03</YAW>\n<PITCH>-9.5756927362e-04</PITCH>\n<ROLL>-2.2219821493e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:48.206809</TIME>\n<YAW>1.1873306814e-03</YAW>\n<PITCH>-9.5750670299e-04</PITCH>\n<ROLL>-2.2189954426e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:48.331809</TIME>\n<YAW>1.1874322007e-03</YAW>\n<PITCH>-9.5730044116e-04</PITCH>\n<ROLL>-2.2189993349e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:48.456809</TIME>\n<YAW>1.1874321693e-03</YAW>\n<PITCH>-9.5720303766e-04</PITCH>\n<ROLL>-2.2300568569e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:48.581808</TIME>\n<YAW>1.1874456480e-03</YAW>\n<PITCH>-9.5719013295e-04</PITCH>\n<ROLL>-2.2226302805e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:48.706808</TIME>\n<YAW>1.1875478956e-03</YAW>\n<PITCH>-9.5712659149e-04</PITCH>\n<ROLL>-2.2337660428e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:48.831808</TIME>\n<YAW>1.1874715779e-03</YAW>\n<PITCH>-9.5724628725e-04</PITCH>\n<ROLL>-2.2252901517e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:48.956808</TIME>\n<YAW>1.1875793707e-03</YAW>\n<PITCH>-9.5722825505e-04</PITCH>\n<ROLL>-2.2334061043e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:49.081807</TIME>\n<YAW>1.1876043828e-03</YAW>\n<PITCH>-9.5729726968e-04</PITCH>\n<ROLL>-2.2287985786e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:49.206807</TIME>\n<YAW>1.1877242260e-03</YAW>\n<PITCH>-9.5734954893e-04</PITCH>\n<ROLL>-2.2285171005e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:49.331807</TIME>\n<YAW>1.1876385032e-03</YAW>\n<PITCH>-9.5739068495e-04</PITCH>\n<ROLL>-2.2224863948e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:49.456806</TIME>\n<YAW>1.1876466451e-03</YAW>\n<PITCH>-9.5739769430e-04</PITCH>\n<ROLL>-2.2309808450e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:49.581806</TIME>\n<YAW>1.1876782006e-03</YAW>\n<PITCH>-9.5758766604e-04</PITCH>\n<ROLL>-2.2281927477e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:49.706806</TIME>\n<YAW>1.1877982919e-03</YAW>\n<PITCH>-9.5766688323e-04</PITCH>\n<ROLL>-2.2286954649e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:49.831806</TIME>\n<YAW>1.1878170394e-03</YAW>\n<PITCH>-9.5778658166e-04</PITCH>\n<ROLL>-2.2338494123e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:49.956805</TIME>\n<YAW>1.1877463820e-03</YAW>\n<PITCH>-9.5802521048e-04</PITCH>\n<ROLL>-2.2266284085e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:50.081805</TIME>\n<YAW>1.1878734962e-03</YAW>\n<PITCH>-9.5809934635e-04</PITCH>\n<ROLL>-2.2276847421e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:50.206805</TIME>\n<YAW>1.1880051887e-03</YAW>\n<PITCH>-9.5824891504e-04</PITCH>\n<ROLL>-2.2195606398e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:50.331804</TIME>\n<YAW>1.1880038861e-03</YAW>\n<PITCH>-9.5822495186e-04</PITCH>\n<ROLL>-2.2339822900e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:50.456804</TIME>\n<YAW>1.1879103527e-03</YAW>\n<PITCH>-9.5828890760e-04</PITCH>\n<ROLL>-2.2361383280e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:50.581804</TIME>\n<YAW>1.1880404028e-03</YAW>\n<PITCH>-9.5842302860e-04</PITCH>\n<ROLL>-2.2378733401e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:50.706804</TIME>\n<YAW>1.1880686449e-03</YAW>\n<PITCH>-9.5853858266e-04</PITCH>\n<ROLL>-2.2289986385e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:50.831803</TIME>\n<YAW>1.1880837297e-03</YAW>\n<PITCH>-9.5867178283e-04</PITCH>\n<ROLL>-2.2371721742e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:50.956803</TIME>\n<YAW>1.1880895123e-03</YAW>\n<PITCH>-9.5867987661e-04</PITCH>\n<ROLL>-2.2443074567e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:51.081803</TIME>\n<YAW>1.1880945440e-03</YAW>\n<PITCH>-9.5870866802e-04</PITCH>\n<ROLL>-2.2539137700e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:51.206802</TIME>\n<YAW>1.1882076344e-03</YAW>\n<PITCH>-9.5871152899e-04</PITCH>\n<ROLL>-2.2621123415e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:51.331802</TIME>\n<YAW>1.1882209956e-03</YAW>\n<PITCH>-9.5868237751e-04</PITCH>\n<ROLL>-2.2557775128e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:51.456802</TIME>\n<YAW>1.1883475888e-03</YAW>\n<PITCH>-9.5876275804e-04</PITCH>\n<ROLL>-2.2542333430e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:51.581802</TIME>\n<YAW>1.1882535055e-03</YAW>\n<PITCH>-9.5879667600e-04</PITCH>\n<ROLL>-2.2616473689e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:51.706801</TIME>\n<YAW>1.1882491783e-03</YAW>\n<PITCH>-9.5867763921e-04</PITCH>\n<ROLL>-2.2671763431e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:51.831801</TIME>\n<YAW>1.1884608241e-03</YAW>\n<PITCH>-9.5864632907e-04</PITCH>\n<ROLL>-2.2828157765e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:51.956801</TIME>\n<YAW>1.1885866506e-03</YAW>\n<PITCH>-9.5872673166e-04</PITCH>\n<ROLL>-2.2808144481e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:52.081800</TIME>\n<YAW>1.1887220435e-03</YAW>\n<PITCH>-9.5877503171e-04</PITCH>\n<ROLL>-2.2642224258e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:52.206800</TIME>\n<YAW>1.1889331337e-03</YAW>\n<PITCH>-9.5874374351e-04</PITCH>\n<ROLL>-2.2795155482e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:52.331800</TIME>\n<YAW>1.1890327076e-03</YAW>\n<PITCH>-9.5865673580e-04</PITCH>\n<ROLL>-2.2922737098e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:52.456800</TIME>\n<YAW>1.1890540629e-03</YAW>\n<PITCH>-9.5867599347e-04</PITCH>\n<ROLL>-2.2882890256e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:52.581799</TIME>\n<YAW>1.1891789830e-03</YAW>\n<PITCH>-9.5875541237e-04</PITCH>\n<ROLL>-2.2857131338e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:52.706799</TIME>\n<YAW>1.1893132311e-03</YAW>\n<PITCH>-9.5894133995e-04</PITCH>\n<ROLL>-2.2813641460e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:52.831799</TIME>\n<YAW>1.1895293237e-03</YAW>\n<PITCH>-9.5881902679e-04</PITCH>\n<ROLL>-2.2804717719e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:52.956798</TIME>\n<YAW>1.1894412537e-03</YAW>\n<PITCH>-9.5888289747e-04</PITCH>\n<ROLL>-2.2799168376e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:53.081798</TIME>\n<YAW>1.1895567847e-03</YAW>\n<PITCH>-9.5888482818e-04</PITCH>\n<ROLL>-2.2797832732e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:53.206798</TIME>\n<YAW>1.1895988230e-03</YAW>\n<PITCH>-9.5901153103e-04</PITCH>\n<ROLL>-2.2588754356e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:53.331798</TIME>\n<YAW>1.1895953317e-03</YAW>\n<PITCH>-9.5891711468e-04</PITCH>\n<ROLL>-2.2716794115e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:53.456797</TIME>\n<YAW>1.1896208345e-03</YAW>\n<PITCH>-9.5896980064e-04</PITCH>\n<ROLL>-2.2525490074e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:53.581797</TIME>\n<YAW>1.1895354341e-03</YAW>\n<PITCH>-9.5895812832e-04</PITCH>\n<ROLL>-2.2397509970e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:53.706797</TIME>\n<YAW>1.1895611855e-03</YAW>\n<PITCH>-9.5900215467e-04</PITCH>\n<ROLL>-2.2292520022e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:53.831796</TIME>\n<YAW>1.1896612191e-03</YAW>\n<PITCH>-9.5887907900e-04</PITCH>\n<ROLL>-2.2341279787e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:53.956796</TIME>\n<YAW>1.1896870956e-03</YAW>\n<PITCH>-9.5890241530e-04</PITCH>\n<ROLL>-2.2208175952e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:54.081796</TIME>\n<YAW>1.1896094048e-03</YAW>\n<PITCH>-9.5903761637e-04</PITCH>\n<ROLL>-2.2110763325e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:54.206796</TIME>\n<YAW>1.1896486813e-03</YAW>\n<PITCH>-9.5913741851e-04</PITCH>\n<ROLL>-2.1880213606e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:54.331795</TIME>\n<YAW>1.1896659825e-03</YAW>\n<PITCH>-9.5899216078e-04</PITCH>\n<ROLL>-2.1682787748e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:54.456795</TIME>\n<YAW>1.1898943866e-03</YAW>\n<PITCH>-9.5904163308e-04</PITCH>\n<ROLL>-2.1640247028e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:54.581795</TIME>\n<YAW>1.1898942841e-03</YAW>\n<PITCH>-9.5894513936e-04</PITCH>\n<ROLL>-2.1690781509e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:54.706794</TIME>\n<YAW>1.1898192961e-03</YAW>\n<PITCH>-9.5900274787e-04</PITCH>\n<ROLL>-2.1470902479e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:54.831794</TIME>\n<YAW>1.1898273516e-03</YAW>\n<PITCH>-9.5905313416e-04</PITCH>\n<ROLL>-2.1554246758e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:54.956794</TIME>\n<YAW>1.1898494722e-03</YAW>\n<PITCH>-9.5909099893e-04</PITCH>\n<ROLL>-2.1451356145e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:55.081794</TIME>\n<YAW>1.1900798123e-03</YAW>\n<PITCH>-9.5911615161e-04</PITCH>\n<ROLL>-2.1452347459e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:55.206793</TIME>\n<YAW>1.1900873789e-03</YAW>\n<PITCH>-9.5916552894e-04</PITCH>\n<ROLL>-2.1532266781e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:55.331793</TIME>\n<YAW>1.1900994512e-03</YAW>\n<PITCH>-9.5923453496e-04</PITCH>\n<ROLL>-2.1570720664e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:55.456793</TIME>\n<YAW>1.1902178428e-03</YAW>\n<PITCH>-9.5920403213e-04</PITCH>\n<ROLL>-2.1544250442e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:55.581792</TIME>\n<YAW>1.1902263749e-03</YAW>\n<PITCH>-9.5919133981e-04</PITCH>\n<ROLL>-2.1543245650e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:55.706792</TIME>\n<YAW>1.1904410184e-03</YAW>\n<PITCH>-9.5918145080e-04</PITCH>\n<ROLL>-2.1685357565e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:55.831792</TIME>\n<YAW>1.1903644756e-03</YAW>\n<PITCH>-9.5925087208e-04</PITCH>\n<ROLL>-2.1569714695e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:55.956792</TIME>\n<YAW>1.1904774349e-03</YAW>\n<PITCH>-9.5927010270e-04</PITCH>\n<ROLL>-2.1643087981e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:56.081791</TIME>\n<YAW>1.1904847122e-03</YAW>\n<PITCH>-9.5927814955e-04</PITCH>\n<ROLL>-2.1663378253e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:56.206791</TIME>\n<YAW>1.1905987123e-03</YAW>\n<PITCH>-9.5916699373e-04</PITCH>\n<ROLL>-2.1592878899e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:56.331791</TIME>\n<YAW>1.1908118686e-03</YAW>\n<PITCH>-9.5910953342e-04</PITCH>\n<ROLL>-2.1691011512e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:56.456790</TIME>\n<YAW>1.1908167290e-03</YAW>\n<PITCH>-9.5900613582e-04</PITCH>\n<ROLL>-2.1733435854e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:56.581790</TIME>\n<YAW>1.1909239436e-03</YAW>\n<PITCH>-9.5893852591e-04</PITCH>\n<ROLL>-2.1777367310e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:56.706790</TIME>\n<YAW>1.1909222337e-03</YAW>\n<PITCH>-9.5884838941e-04</PITCH>\n<ROLL>-2.1795162473e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:56.831790</TIME>\n<YAW>1.1910404305e-03</YAW>\n<PITCH>-9.5876643233e-04</PITCH>\n<ROLL>-2.1792994126e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:56.956789</TIME>\n<YAW>1.1911687102e-03</YAW>\n<PITCH>-9.5880525697e-04</PITCH>\n<ROLL>-2.1671027286e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:57.081789</TIME>\n<YAW>1.1913707329e-03</YAW>\n<PITCH>-9.5866307280e-04</PITCH>\n<ROLL>-2.1804726615e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:57.206789</TIME>\n<YAW>1.1913792531e-03</YAW>\n<PITCH>-9.5864758383e-04</PITCH>\n<ROLL>-2.1864055626e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:57.331788</TIME>\n<YAW>1.1914942510e-03</YAW>\n<PITCH>-9.5856858084e-04</PITCH>\n<ROLL>-2.1782183048e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:57.456788</TIME>\n<YAW>1.1914000602e-03</YAW>\n<PITCH>-9.5862365770e-04</PITCH>\n<ROLL>-2.1824555933e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:57.581788</TIME>\n<YAW>1.1915146022e-03</YAW>\n<PITCH>-9.5857688937e-04</PITCH>\n<ROLL>-2.1880651543e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:57.706788</TIME>\n<YAW>1.1916395895e-03</YAW>\n<PITCH>-9.5863133401e-04</PITCH>\n<ROLL>-2.1791115939e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:57.831787</TIME>\n<YAW>1.1917513113e-03</YAW>\n<PITCH>-9.5861875535e-04</PITCH>\n<ROLL>-2.1910034706e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:57.956787</TIME>\n<YAW>1.1916637495e-03</YAW>\n<PITCH>-9.5872552263e-04</PITCH>\n<ROLL>-2.1906471032e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:58.081787</TIME>\n<YAW>1.1917541687e-03</YAW>\n<PITCH>-9.5862304689e-04</PITCH>\n<ROLL>-2.2083589000e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:58.206786</TIME>\n<YAW>1.1918872873e-03</YAW>\n<PITCH>-9.5869718708e-04</PITCH>\n<ROLL>-2.2010767453e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:58.331786</TIME>\n<YAW>1.1918910358e-03</YAW>\n<PITCH>-9.5866932911e-04</PITCH>\n<ROLL>-2.2086775160e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:58.456786</TIME>\n<YAW>1.1918966394e-03</YAW>\n<PITCH>-9.5862695873e-04</PITCH>\n<ROLL>-2.2122360853e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:58.581786</TIME>\n<YAW>1.1917925234e-03</YAW>\n<PITCH>-9.5867183334e-04</PITCH>\n<ROLL>-2.2247669705e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:58.706785</TIME>\n<YAW>1.1919055104e-03</YAW>\n<PITCH>-9.5862404084e-04</PITCH>\n<ROLL>-2.2293477052e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:58.831785</TIME>\n<YAW>1.1919013782e-03</YAW>\n<PITCH>-9.5861285130e-04</PITCH>\n<ROLL>-2.2470439155e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:58.956785</TIME>\n<YAW>1.1920108222e-03</YAW>\n<PITCH>-9.5855370716e-04</PITCH>\n<ROLL>-2.2540876831e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:59.081784</TIME>\n<YAW>1.1920145036e-03</YAW>\n<PITCH>-9.5848343245e-04</PITCH>\n<ROLL>-2.2558397172e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:59.206784</TIME>\n<YAW>1.1920125221e-03</YAW>\n<PITCH>-9.5850536679e-04</PITCH>\n<ROLL>-2.2730891581e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:59.331784</TIME>\n<YAW>1.1922169234e-03</YAW>\n<PITCH>-9.5830323636e-04</PITCH>\n<ROLL>-2.2828080930e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:59.456784</TIME>\n<YAW>1.1923443466e-03</YAW>\n<PITCH>-9.5831842317e-04</PITCH>\n<ROLL>-2.2732515152e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:59.581783</TIME>\n<YAW>1.1924518678e-03</YAW>\n<PITCH>-9.5823136839e-04</PITCH>\n<ROLL>-2.2784834561e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:59.706783</TIME>\n<YAW>1.1925624500e-03</YAW>\n<PITCH>-9.5822606596e-04</PITCH>\n<ROLL>-2.2873175584e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:59.831783</TIME>\n<YAW>1.1926717539e-03</YAW>\n<PITCH>-9.5819386749e-04</PITCH>\n<ROLL>-2.2947985290e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:31:59.956782</TIME>\n<YAW>1.1927820567e-03</YAW>\n<PITCH>-9.5818755549e-04</PITCH>\n<ROLL>-2.3034022459e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:00.081782</TIME>\n<YAW>1.1930046913e-03</YAW>\n<PITCH>-9.5810737455e-04</PITCH>\n<ROLL>-2.3001082553e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:00.206782</TIME>\n<YAW>1.1931134619e-03</YAW>\n<PITCH>-9.5807520542e-04</PITCH>\n<ROLL>-2.3072447160e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:00.331782</TIME>\n<YAW>1.1933399334e-03</YAW>\n<PITCH>-9.5803432764e-04</PITCH>\n<ROLL>-2.3022671588e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:00.456781</TIME>\n<YAW>1.1933420540e-03</YAW>\n<PITCH>-9.5794345636e-04</PITCH>\n<ROLL>-2.3001819498e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:00.581781</TIME>\n<YAW>1.1933514689e-03</YAW>\n<PITCH>-9.5793610363e-04</PITCH>\n<ROLL>-2.3078643874e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:00.706781</TIME>\n<YAW>1.1935672112e-03</YAW>\n<PITCH>-9.5789952327e-04</PITCH>\n<ROLL>-2.3157810296e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:00.831780</TIME>\n<YAW>1.1936623445e-03</YAW>\n<PITCH>-9.5783756484e-04</PITCH>\n<ROLL>-2.3356900693e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:00.956780</TIME>\n<YAW>1.1937720757e-03</YAW>\n<PITCH>-9.5775335604e-04</PITCH>\n<ROLL>-2.3458267035e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:01.081780</TIME>\n<YAW>1.1937800834e-03</YAW>\n<PITCH>-9.5773597133e-04</PITCH>\n<ROLL>-2.3416143668e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:01.206780</TIME>\n<YAW>1.1938087119e-03</YAW>\n<PITCH>-9.5780909955e-04</PITCH>\n<ROLL>-2.3312371116e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:01.331779</TIME>\n<YAW>1.1940240738e-03</YAW>\n<PITCH>-9.5775082344e-04</PITCH>\n<ROLL>-2.3359930062e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:01.456779</TIME>\n<YAW>1.1940099752e-03</YAW>\n<PITCH>-9.5760915797e-04</PITCH>\n<ROLL>-2.3578922992e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:01.581779</TIME>\n<YAW>1.1942260375e-03</YAW>\n<PITCH>-9.5757884362e-04</PITCH>\n<ROLL>-2.3636571382e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:01.706778</TIME>\n<YAW>1.1942412357e-03</YAW>\n<PITCH>-9.5762213049e-04</PITCH>\n<ROLL>-2.3661695328e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:01.831778</TIME>\n<YAW>1.1941588449e-03</YAW>\n<PITCH>-9.5773498201e-04</PITCH>\n<ROLL>-2.3605031294e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:01.956778</TIME>\n<YAW>1.1943719847e-03</YAW>\n<PITCH>-9.5773995499e-04</PITCH>\n<ROLL>-2.3724359423e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:02.081778</TIME>\n<YAW>1.1944980481e-03</YAW>\n<PITCH>-9.5783980568e-04</PITCH>\n<ROLL>-2.3769694731e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:02.206777</TIME>\n<YAW>1.1945125300e-03</YAW>\n<PITCH>-9.5788310229e-04</PITCH>\n<ROLL>-2.3790264922e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:02.331777</TIME>\n<YAW>1.1947374494e-03</YAW>\n<PITCH>-9.5793764718e-04</PITCH>\n<ROLL>-2.3798488306e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:02.456777</TIME>\n<YAW>1.1947315326e-03</YAW>\n<PITCH>-9.5790151338e-04</PITCH>\n<ROLL>-2.3991707377e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:02.581776</TIME>\n<YAW>1.1948547241e-03</YAW>\n<PITCH>-9.5794652209e-04</PITCH>\n<ROLL>-2.4007681101e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:02.706776</TIME>\n<YAW>1.1948779285e-03</YAW>\n<PITCH>-9.5809636776e-04</PITCH>\n<ROLL>-2.4007023284e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:02.831776</TIME>\n<YAW>1.1948846054e-03</YAW>\n<PITCH>-9.5806833089e-04</PITCH>\n<ROLL>-2.4037516798e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:02.956776</TIME>\n<YAW>1.1948852786e-03</YAW>\n<PITCH>-9.5808389626e-04</PITCH>\n<ROLL>-2.4184753759e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:03.081775</TIME>\n<YAW>1.1949068940e-03</YAW>\n<PITCH>-9.5820582500e-04</PITCH>\n<ROLL>-2.4168297477e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:03.206775</TIME>\n<YAW>1.1950218750e-03</YAW>\n<PITCH>-9.5820021092e-04</PITCH>\n<ROLL>-2.4220010338e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:03.331775</TIME>\n<YAW>1.1950157839e-03</YAW>\n<PITCH>-9.5794452678e-04</PITCH>\n<ROLL>-2.4173836891e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:03.456774</TIME>\n<YAW>1.1952381904e-03</YAW>\n<PITCH>-9.5793337275e-04</PITCH>\n<ROLL>-2.4235479288e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:03.581774</TIME>\n<YAW>1.1953526423e-03</YAW>\n<PITCH>-9.5792777355e-04</PITCH>\n<ROLL>-2.4283751366e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:03.706774</TIME>\n<YAW>1.1953637886e-03</YAW>\n<PITCH>-9.5794527849e-04</PITCH>\n<ROLL>-2.4278292696e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:03.831774</TIME>\n<YAW>1.1952794296e-03</YAW>\n<PITCH>-9.5797886718e-04</PITCH>\n<ROLL>-2.4228006554e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:03.956773</TIME>\n<YAW>1.1953827991e-03</YAW>\n<PITCH>-9.5783984298e-04</PITCH>\n<ROLL>-2.4277156619e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:04.081773</TIME>\n<YAW>1.1955269826e-03</YAW>\n<PITCH>-9.5804714576e-04</PITCH>\n<ROLL>-2.4141602746e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:04.206773</TIME>\n<YAW>1.1956378849e-03</YAW>\n<PITCH>-9.5800848223e-04</PITCH>\n<ROLL>-2.4185233340e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:04.331772</TIME>\n<YAW>1.1954988568e-03</YAW>\n<PITCH>-9.5768767841e-04</PITCH>\n<ROLL>-2.4473315450e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:04.456772</TIME>\n<YAW>1.1956215656e-03</YAW>\n<PITCH>-9.5778763586e-04</PITCH>\n<ROLL>-2.4496894409e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:04.581772</TIME>\n<YAW>1.1956379616e-03</YAW>\n<PITCH>-9.5772015939e-04</PITCH>\n<ROLL>-2.4313933305e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:04.706772</TIME>\n<YAW>1.1957738462e-03</YAW>\n<PITCH>-9.5776938655e-04</PITCH>\n<ROLL>-2.4226220245e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:04.831771</TIME>\n<YAW>1.1958911499e-03</YAW>\n<PITCH>-9.5778141167e-04</PITCH>\n<ROLL>-2.4222671488e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:04.956771</TIME>\n<YAW>1.1959006989e-03</YAW>\n<PITCH>-9.5785001247e-04</PITCH>\n<ROLL>-2.4371892526e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:05.081771</TIME>\n<YAW>1.1959113760e-03</YAW>\n<PITCH>-9.5787384109e-04</PITCH>\n<ROLL>-2.4340470268e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:05.206770</TIME>\n<YAW>1.1960545559e-03</YAW>\n<PITCH>-9.5802132778e-04</PITCH>\n<ROLL>-2.4244915246e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:05.331770</TIME>\n<YAW>1.1960550079e-03</YAW>\n<PITCH>-9.5804951537e-04</PITCH>\n<ROLL>-2.4343634844e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:05.456770</TIME>\n<YAW>1.1961841122e-03</YAW>\n<PITCH>-9.5814233230e-04</PITCH>\n<ROLL>-2.4366920728e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:05.581770</TIME>\n<YAW>1.1963002746e-03</YAW>\n<PITCH>-9.5815547023e-04</PITCH>\n<ROLL>-2.4356511036e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:05.706769</TIME>\n<YAW>1.1963278140e-03</YAW>\n<PITCH>-9.5834496025e-04</PITCH>\n<ROLL>-2.4375594886e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:05.831769</TIME>\n<YAW>1.1962356493e-03</YAW>\n<PITCH>-9.5846982518e-04</PITCH>\n<ROLL>-2.4463291959e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:05.956769</TIME>\n<YAW>1.1963633140e-03</YAW>\n<PITCH>-9.5860409584e-04</PITCH>\n<ROLL>-2.4533665824e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:06.081768</TIME>\n<YAW>1.1962912984e-03</YAW>\n<PITCH>-9.5885603005e-04</PITCH>\n<ROLL>-2.4482334767e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:06.206768</TIME>\n<YAW>1.1963180678e-03</YAW>\n<PITCH>-9.5904655636e-04</PITCH>\n<ROLL>-2.4496883238e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:06.331768</TIME>\n<YAW>1.1965382404e-03</YAW>\n<PITCH>-9.5902209556e-04</PITCH>\n<ROLL>-2.4492768246e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:06.456768</TIME>\n<YAW>1.1965457767e-03</YAW>\n<PITCH>-9.5909073976e-04</PITCH>\n<ROLL>-2.4628332402e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:06.581767</TIME>\n<YAW>1.1965581660e-03</YAW>\n<PITCH>-9.5924530581e-04</PITCH>\n<ROLL>-2.4786415559e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:06.706767</TIME>\n<YAW>1.1965849676e-03</YAW>\n<PITCH>-9.5939439988e-04</PITCH>\n<ROLL>-2.4744732791e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:06.831767</TIME>\n<YAW>1.1965901489e-03</YAW>\n<PITCH>-9.5947761217e-04</PITCH>\n<ROLL>-2.4916183900e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:06.956766</TIME>\n<YAW>1.1965936644e-03</YAW>\n<PITCH>-9.5946450031e-04</PITCH>\n<ROLL>-2.5010072214e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:07.081766</TIME>\n<YAW>1.1964993583e-03</YAW>\n<PITCH>-9.5950340125e-04</PITCH>\n<ROLL>-2.5124426570e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:07.206766</TIME>\n<YAW>1.1965148541e-03</YAW>\n<PITCH>-9.5952008693e-04</PITCH>\n<ROLL>-2.5082548233e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:07.331766</TIME>\n<YAW>1.1965193002e-03</YAW>\n<PITCH>-9.5951420837e-04</PITCH>\n<ROLL>-2.5159590759e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:07.456765</TIME>\n<YAW>1.1965126913e-03</YAW>\n<PITCH>-9.5939561639e-04</PITCH>\n<ROLL>-2.5265670083e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:07.581765</TIME>\n<YAW>1.1966177452e-03</YAW>\n<PITCH>-9.5931273893e-04</PITCH>\n<ROLL>-2.5368078582e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:07.706765</TIME>\n<YAW>1.1967346326e-03</YAW>\n<PITCH>-9.5927936171e-04</PITCH>\n<ROLL>-2.5361655013e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:07.831764</TIME>\n<YAW>1.1966288022e-03</YAW>\n<PITCH>-9.5918477527e-04</PITCH>\n<ROLL>-2.5473575163e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:07.956764</TIME>\n<YAW>1.1967355479e-03</YAW>\n<PITCH>-9.5906662875e-04</PITCH>\n<ROLL>-2.5507428656e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:08.081764</TIME>\n<YAW>1.1970436322e-03</YAW>\n<PITCH>-9.5883296226e-04</PITCH>\n<ROLL>-2.5519185435e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:08.206764</TIME>\n<YAW>1.1970622578e-03</YAW>\n<PITCH>-9.5885047248e-04</PITCH>\n<ROLL>-2.5529814656e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:08.331763</TIME>\n<YAW>1.1970472119e-03</YAW>\n<PITCH>-9.5859115901e-04</PITCH>\n<ROLL>-2.5579533947e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:08.456763</TIME>\n<YAW>1.1972519110e-03</YAW>\n<PITCH>-9.5834216371e-04</PITCH>\n<ROLL>-2.5611648553e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:08.581763</TIME>\n<YAW>1.1973599633e-03</YAW>\n<PITCH>-9.5818878274e-04</PITCH>\n<ROLL>-2.5574637107e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:08.706762</TIME>\n<YAW>1.1975784884e-03</YAW>\n<PITCH>-9.5795297139e-04</PITCH>\n<ROLL>-2.5431608874e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:08.831762</TIME>\n<YAW>1.1975902834e-03</YAW>\n<PITCH>-9.5774670683e-04</PITCH>\n<ROLL>-2.5284803563e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:08.956762</TIME>\n<YAW>1.1976890024e-03</YAW>\n<PITCH>-9.5744635921e-04</PITCH>\n<ROLL>-2.5209420467e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:09.081762</TIME>\n<YAW>1.1977951591e-03</YAW>\n<PITCH>-9.5726609332e-04</PITCH>\n<ROLL>-2.5155453559e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:09.206761</TIME>\n<YAW>1.1978008282e-03</YAW>\n<PITCH>-9.5701330565e-04</PITCH>\n<ROLL>-2.5033240902e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:09.331761</TIME>\n<YAW>1.1977978408e-03</YAW>\n<PITCH>-9.5670091884e-04</PITCH>\n<ROLL>-2.4837015170e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:09.456761</TIME>\n<YAW>1.1977965936e-03</YAW>\n<PITCH>-9.5635600926e-04</PITCH>\n<ROLL>-2.4702362500e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:09.581760</TIME>\n<YAW>1.1978903122e-03</YAW>\n<PITCH>-9.5601539356e-04</PITCH>\n<ROLL>-2.4635821944e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:09.706760</TIME>\n<YAW>1.1977885568e-03</YAW>\n<PITCH>-9.5579522351e-04</PITCH>\n<ROLL>-2.4509576960e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:09.831760</TIME>\n<YAW>1.1978026430e-03</YAW>\n<PITCH>-9.5564896582e-04</PITCH>\n<ROLL>-2.4364974106e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:09.956760</TIME>\n<YAW>1.1978980668e-03</YAW>\n<PITCH>-9.5536326874e-04</PITCH>\n<ROLL>-2.4319770972e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:10.081759</TIME>\n<YAW>1.1979133293e-03</YAW>\n<PITCH>-9.5522216983e-04</PITCH>\n<ROLL>-2.4159420616e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:10.206759</TIME>\n<YAW>1.1979395562e-03</YAW>\n<PITCH>-9.5517305682e-04</PITCH>\n<ROLL>-2.3941905654e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:10.331759</TIME>\n<YAW>1.1979555266e-03</YAW>\n<PITCH>-9.5505990693e-04</PITCH>\n<ROLL>-2.3791664218e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:10.456758</TIME>\n<YAW>1.1981822768e-03</YAW>\n<PITCH>-9.5493590894e-04</PITCH>\n<ROLL>-2.3602344523e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:10.581758</TIME>\n<YAW>1.1982033994e-03</YAW>\n<PITCH>-9.5497814583e-04</PITCH>\n<ROLL>-2.3537495357e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:10.706758</TIME>\n<YAW>1.1982084458e-03</YAW>\n<PITCH>-9.5482171738e-04</PITCH>\n<ROLL>-2.3478079467e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:10.831758</TIME>\n<YAW>1.1982431204e-03</YAW>\n<PITCH>-9.5487813279e-04</PITCH>\n<ROLL>-2.3238119186e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:10.956757</TIME>\n<YAW>1.1982410432e-03</YAW>\n<PITCH>-9.5475817643e-04</PITCH>\n<ROLL>-2.3307774867e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:11.081757</TIME>\n<YAW>1.1983621340e-03</YAW>\n<PITCH>-9.5474406154e-04</PITCH>\n<ROLL>-2.3291671000e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:11.206757</TIME>\n<YAW>1.1984830512e-03</YAW>\n<PITCH>-9.5472994890e-04</PITCH>\n<ROLL>-2.3274417397e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:11.331756</TIME>\n<YAW>1.1983856690e-03</YAW>\n<PITCH>-9.5469112567e-04</PITCH>\n<ROLL>-2.3233521746e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:11.456756</TIME>\n<YAW>1.1983813771e-03</YAW>\n<PITCH>-9.5456604941e-04</PITCH>\n<ROLL>-2.3312109796e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:11.581756</TIME>\n<YAW>1.1984896986e-03</YAW>\n<PITCH>-9.5452323620e-04</PITCH>\n<ROLL>-2.3424977700e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:11.706756</TIME>\n<YAW>1.1984199586e-03</YAW>\n<PITCH>-9.5469460068e-04</PITCH>\n<ROLL>-2.3342572632e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:11.831755</TIME>\n<YAW>1.1985383206e-03</YAW>\n<PITCH>-9.5469404843e-04</PITCH>\n<ROLL>-2.3358891253e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:11.956755</TIME>\n<YAW>1.1985548472e-03</YAW>\n<PITCH>-9.5481316655e-04</PITCH>\n<ROLL>-2.3398318143e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:12.081755</TIME>\n<YAW>1.1986592890e-03</YAW>\n<PITCH>-9.5477876577e-04</PITCH>\n<ROLL>-2.3559370820e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:12.206754</TIME>\n<YAW>1.1986896504e-03</YAW>\n<PITCH>-9.5489269274e-04</PITCH>\n<ROLL>-2.3525655116e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:12.331754</TIME>\n<YAW>1.1989262197e-03</YAW>\n<PITCH>-9.5497942604e-04</PITCH>\n<ROLL>-2.3493072417e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:12.456754</TIME>\n<YAW>1.1989523448e-03</YAW>\n<PITCH>-9.5514187674e-04</PITCH>\n<ROLL>-2.3433671711e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:12.581754</TIME>\n<YAW>1.1989815439e-03</YAW>\n<PITCH>-9.5529831484e-04</PITCH>\n<ROLL>-2.3448197449e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:12.706753</TIME>\n<YAW>1.1991098754e-03</YAW>\n<PITCH>-9.5538878783e-04</PITCH>\n<ROLL>-2.3400420741e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:12.831753</TIME>\n<YAW>1.1992218563e-03</YAW>\n<PITCH>-9.5541229812e-04</PITCH>\n<ROLL>-2.3499625920e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:12.956753</TIME>\n<YAW>1.1992499259e-03</YAW>\n<PITCH>-9.5550030457e-04</PITCH>\n<ROLL>-2.3446694522e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:13.081752</TIME>\n<YAW>1.1991557581e-03</YAW>\n<PITCH>-9.5550945487e-04</PITCH>\n<ROLL>-2.3489750515e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:13.206752</TIME>\n<YAW>1.1992898074e-03</YAW>\n<PITCH>-9.5569416807e-04</PITCH>\n<ROLL>-2.3447561608e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:13.331752</TIME>\n<YAW>1.1992925274e-03</YAW>\n<PITCH>-9.5567706959e-04</PITCH>\n<ROLL>-2.3620139889e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:13.456752</TIME>\n<YAW>1.1992054690e-03</YAW>\n<PITCH>-9.5580735324e-04</PITCH>\n<ROLL>-2.3682341666e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:13.581751</TIME>\n<YAW>1.1994173218e-03</YAW>\n<PITCH>-9.5577348761e-04</PITCH>\n<ROLL>-2.3827843466e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:13.706751</TIME>\n<YAW>1.1993316726e-03</YAW>\n<PITCH>-9.5588921828e-04</PITCH>\n<ROLL>-2.3848480347e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:13.831751</TIME>\n<YAW>1.1994670034e-03</YAW>\n<PITCH>-9.5604088288e-04</PITCH>\n<ROLL>-2.3863256838e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:13.956750</TIME>\n<YAW>1.1993793697e-03</YAW>\n<PITCH>-9.5617015887e-04</PITCH>\n<ROLL>-2.3920916738e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:14.081750</TIME>\n<YAW>1.1995999213e-03</YAW>\n<PITCH>-9.5624290827e-04</PITCH>\n<ROLL>-2.4045046153e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:14.206750</TIME>\n<YAW>1.1995255127e-03</YAW>\n<PITCH>-9.5638736779e-04</PITCH>\n<ROLL>-2.3927583496e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:14.331750</TIME>\n<YAW>1.1996563392e-03</YAW>\n<PITCH>-9.5647898961e-04</PITCH>\n<ROLL>-2.3926509843e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:14.456749</TIME>\n<YAW>1.1997684423e-03</YAW>\n<PITCH>-9.5646846799e-04</PITCH>\n<ROLL>-2.4073518265e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:14.581749</TIME>\n<YAW>1.1997957566e-03</YAW>\n<PITCH>-9.5656266959e-04</PITCH>\n<ROLL>-2.3992300173e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:14.706749</TIME>\n<YAW>1.1998160650e-03</YAW>\n<PITCH>-9.5671516603e-04</PITCH>\n<ROLL>-2.4067133081e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:14.831748</TIME>\n<YAW>1.1999489445e-03</YAW>\n<PITCH>-9.5683887702e-04</PITCH>\n<ROLL>-2.4060348741e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:14.956748</TIME>\n<YAW>1.1999689308e-03</YAW>\n<PITCH>-9.5699138769e-04</PITCH>\n<ROLL>-2.4132896883e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:15.081748</TIME>\n<YAW>1.1999598499e-03</YAW>\n<PITCH>-9.5688958098e-04</PITCH>\n<ROLL>-2.4332153788e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:15.206748</TIME>\n<YAW>1.2000805925e-03</YAW>\n<PITCH>-9.5696489115e-04</PITCH>\n<ROLL>-2.4429682049e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n<Angles>\n<TIME>2008-03-04T12:32:15.331747</TIME>\n<YAW>1.2001004714e-03</YAW>\n<PITCH>-9.5696493468e-04</PITCH>\n<ROLL>-2.4331461036e-05</ROLL>\n<OUT_OF_RANGE>N</OUT_OF_RANGE>\n</Angles>\n</Corrected_Attitude>\n</Corrected_Attitudes>\n</Satellite_Attitudes>\n\n<Sensor_Configuration>\n<Time_Stamp>\n<LINE_PERIOD>7.5199705115e-04</LINE_PERIOD>\n<SCENE_CENTER_TIME>2008-03-04T12:31:39.349737</SCENE_CENTER_TIME>\n<SCENE_CENTER_LINE>48085</SCENE_CENTER_LINE>\n<SCENE_CENTER_COL>6001</SCENE_CENTER_COL>\n</Time_Stamp>\n\n<DEREGISTRATION_VALUE>0.000000</DEREGISTRATION_VALUE>\n<COUPLED_DEREGISTRATION_VALUE>0.000000</COUPLED_DEREGISTRATION_VALUE>\n<Instrument_Look_Angles_List>\n<Instrument_Look_Angles>\n<VALIDITY_DATE>2000-03-01T00:00:00.000000</VALIDITY_DATE>\n<BAND_INDEX>1</BAND_INDEX>\n<Look_Angles_List>\n<Look_Angles>\n<DETECTOR_ID>1</DETECTOR_ID>\n<PSI_X>3.4977750140e-01</PSI_X>\n<PSI_Y>-7.1371362400e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>2</DETECTOR_ID>\n<PSI_X>3.4977749200e-01</PSI_X>\n<PSI_Y>-7.1359536900e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>3</DETECTOR_ID>\n<PSI_X>3.4977748260e-01</PSI_X>\n<PSI_Y>-7.1347711200e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>4</DETECTOR_ID>\n<PSI_X>3.4977747330e-01</PSI_X>\n<PSI_Y>-7.1335885600e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>5</DETECTOR_ID>\n<PSI_X>3.4977746390e-01</PSI_X>\n<PSI_Y>-7.1324059900e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>6</DETECTOR_ID>\n<PSI_X>3.4977745450e-01</PSI_X>\n<PSI_Y>-7.1312234100e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>7</DETECTOR_ID>\n<PSI_X>3.4977744510e-01</PSI_X>\n<PSI_Y>-7.1300408400e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>8</DETECTOR_ID>\n<PSI_X>3.4977743570e-01</PSI_X>\n<PSI_Y>-7.1288582500e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>9</DETECTOR_ID>\n<PSI_X>3.4977742640e-01</PSI_X>\n<PSI_Y>-7.1276756700e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>10</DETECTOR_ID>\n<PSI_X>3.4977741700e-01</PSI_X>\n<PSI_Y>-7.1264930800e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>11</DETECTOR_ID>\n<PSI_X>3.4977740760e-01</PSI_X>\n<PSI_Y>-7.1253104900e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>12</DETECTOR_ID>\n<PSI_X>3.4977739820e-01</PSI_X>\n<PSI_Y>-7.1241279000e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>13</DETECTOR_ID>\n<PSI_X>3.4977738890e-01</PSI_X>\n<PSI_Y>-7.1229453000e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>14</DETECTOR_ID>\n<PSI_X>3.4977737950e-01</PSI_X>\n<PSI_Y>-7.1217627000e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>15</DETECTOR_ID>\n<PSI_X>3.4977737010e-01</PSI_X>\n<PSI_Y>-7.1205800900e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>16</DETECTOR_ID>\n<PSI_X>3.4977736070e-01</PSI_X>\n<PSI_Y>-7.1193974800e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>17</DETECTOR_ID>\n<PSI_X>3.4977735130e-01</PSI_X>\n<PSI_Y>-7.1182148700e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>18</DETECTOR_ID>\n<PSI_X>3.4977734200e-01</PSI_X>\n<PSI_Y>-7.1170322600e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>19</DETECTOR_ID>\n<PSI_X>3.4977733260e-01</PSI_X>\n<PSI_Y>-7.1158496400e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>20</DETECTOR_ID>\n<PSI_X>3.4977732320e-01</PSI_X>\n<PSI_Y>-7.1146670200e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>21</DETECTOR_ID>\n<PSI_X>3.4977731380e-01</PSI_X>\n<PSI_Y>-7.1134843900e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>22</DETECTOR_ID>\n<PSI_X>3.4977730450e-01</PSI_X>\n<PSI_Y>-7.1123017600e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>23</DETECTOR_ID>\n<PSI_X>3.4977729510e-01</PSI_X>\n<PSI_Y>-7.1111191300e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>24</DETECTOR_ID>\n<PSI_X>3.4977728570e-01</PSI_X>\n<PSI_Y>-7.1099364900e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>25</DETECTOR_ID>\n<PSI_X>3.4977727630e-01</PSI_X>\n<PSI_Y>-7.1087538500e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>26</DETECTOR_ID>\n<PSI_X>3.4977726690e-01</PSI_X>\n<PSI_Y>-7.1075712100e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>27</DETECTOR_ID>\n<PSI_X>3.4977725760e-01</PSI_X>\n<PSI_Y>-7.1063885600e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>28</DETECTOR_ID>\n<PSI_X>3.4977724820e-01</PSI_X>\n<PSI_Y>-7.1052059100e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>29</DETECTOR_ID>\n<PSI_X>3.4977723880e-01</PSI_X>\n<PSI_Y>-7.1040232500e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>30</DETECTOR_ID>\n<PSI_X>3.4977722940e-01</PSI_X>\n<PSI_Y>-7.1028406000e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>31</DETECTOR_ID>\n<PSI_X>3.4977722010e-01</PSI_X>\n<PSI_Y>-7.1016579400e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>32</DETECTOR_ID>\n<PSI_X>3.4977721070e-01</PSI_X>\n<PSI_Y>-7.1004752700e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>33</DETECTOR_ID>\n<PSI_X>3.4977720130e-01</PSI_X>\n<PSI_Y>-7.0992926000e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>34</DETECTOR_ID>\n<PSI_X>3.4977719190e-01</PSI_X>\n<PSI_Y>-7.0981099300e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>35</DETECTOR_ID>\n<PSI_X>3.4977718250e-01</PSI_X>\n<PSI_Y>-7.0969272600e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>36</DETECTOR_ID>\n<PSI_X>3.4977717320e-01</PSI_X>\n<PSI_Y>-7.0957445800e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>37</DETECTOR_ID>\n<PSI_X>3.4977716380e-01</PSI_X>\n<PSI_Y>-7.0945619000e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>38</DETECTOR_ID>\n<PSI_X>3.4977715440e-01</PSI_X>\n<PSI_Y>-7.0933792100e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>39</DETECTOR_ID>\n<PSI_X>3.4977714500e-01</PSI_X>\n<PSI_Y>-7.0921965200e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>40</DETECTOR_ID>\n<PSI_X>3.4977713570e-01</PSI_X>\n<PSI_Y>-7.0910138300e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>41</DETECTOR_ID>\n<PSI_X>3.4977712630e-01</PSI_X>\n<PSI_Y>-7.0898311300e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>42</DETECTOR_ID>\n<PSI_X>3.4977711690e-01</PSI_X>\n<PSI_Y>-7.0886484300e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>43</DETECTOR_ID>\n<PSI_X>3.4977710750e-01</PSI_X>\n<PSI_Y>-7.0874657300e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>44</DETECTOR_ID>\n<PSI_X>3.4977709810e-01</PSI_X>\n<PSI_Y>-7.0862830200e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>45</DETECTOR_ID>\n<PSI_X>3.4977708880e-01</PSI_X>\n<PSI_Y>-7.0851003100e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>46</DETECTOR_ID>\n<PSI_X>3.4977707940e-01</PSI_X>\n<PSI_Y>-7.0839176000e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>47</DETECTOR_ID>\n<PSI_X>3.4977707000e-01</PSI_X>\n<PSI_Y>-7.0827348800e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>48</DETECTOR_ID>\n<PSI_X>3.4977706060e-01</PSI_X>\n<PSI_Y>-7.0815521600e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>49</DETECTOR_ID>\n<PSI_X>3.4977705130e-01</PSI_X>\n<PSI_Y>-7.0803694400e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>50</DETECTOR_ID>\n<PSI_X>3.4977704190e-01</PSI_X>\n<PSI_Y>-7.0791867100e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>51</DETECTOR_ID>\n<PSI_X>3.4977703250e-01</PSI_X>\n<PSI_Y>-7.0780039800e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>52</DETECTOR_ID>\n<PSI_X>3.4977702310e-01</PSI_X>\n<PSI_Y>-7.0768212500e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>53</DETECTOR_ID>\n<PSI_X>3.4977701380e-01</PSI_X>\n<PSI_Y>-7.0756385100e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>54</DETECTOR_ID>\n<PSI_X>3.4977700440e-01</PSI_X>\n<PSI_Y>-7.0744557700e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>55</DETECTOR_ID>\n<PSI_X>3.4977699500e-01</PSI_X>\n<PSI_Y>-7.0732730200e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>56</DETECTOR_ID>\n<PSI_X>3.4977698560e-01</PSI_X>\n<PSI_Y>-7.0720902800e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>57</DETECTOR_ID>\n<PSI_X>3.4977697630e-01</PSI_X>\n<PSI_Y>-7.0709075200e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>58</DETECTOR_ID>\n<PSI_X>3.4977696690e-01</PSI_X>\n<PSI_Y>-7.0697247700e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>59</DETECTOR_ID>\n<PSI_X>3.4977695750e-01</PSI_X>\n<PSI_Y>-7.0685420100e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>60</DETECTOR_ID>\n<PSI_X>3.4977694810e-01</PSI_X>\n<PSI_Y>-7.0673592500e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>61</DETECTOR_ID>\n<PSI_X>3.4977693870e-01</PSI_X>\n<PSI_Y>-7.0661764800e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>62</DETECTOR_ID>\n<PSI_X>3.4977692940e-01</PSI_X>\n<PSI_Y>-7.0649937100e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>63</DETECTOR_ID>\n<PSI_X>3.4977692000e-01</PSI_X>\n<PSI_Y>-7.0638109400e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>64</DETECTOR_ID>\n<PSI_X>3.4977691060e-01</PSI_X>\n<PSI_Y>-7.0626281600e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>65</DETECTOR_ID>\n<PSI_X>3.4977690120e-01</PSI_X>\n<PSI_Y>-7.0614453800e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>66</DETECTOR_ID>\n<PSI_X>3.4977689190e-01</PSI_X>\n<PSI_Y>-7.0602626000e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>67</DETECTOR_ID>\n<PSI_X>3.4977688250e-01</PSI_X>\n<PSI_Y>-7.0590798100e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>68</DETECTOR_ID>\n<PSI_X>3.4977687310e-01</PSI_X>\n<PSI_Y>-7.0578970200e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>69</DETECTOR_ID>\n<PSI_X>3.4977686370e-01</PSI_X>\n<PSI_Y>-7.0567142300e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>70</DETECTOR_ID>\n<PSI_X>3.4977685440e-01</PSI_X>\n<PSI_Y>-7.0555314300e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>71</DETECTOR_ID>\n<PSI_X>3.4977684500e-01</PSI_X>\n<PSI_Y>-7.0543486300e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>72</DETECTOR_ID>\n<PSI_X>3.4977683560e-01</PSI_X>\n<PSI_Y>-7.0531658300e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>73</DETECTOR_ID>\n<PSI_X>3.4977682620e-01</PSI_X>\n<PSI_Y>-7.0519830200e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>74</DETECTOR_ID>\n<PSI_X>3.4977681690e-01</PSI_X>\n<PSI_Y>-7.0508002100e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>75</DETECTOR_ID>\n<PSI_X>3.4977680750e-01</PSI_X>\n<PSI_Y>-7.0496174000e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>76</DETECTOR_ID>\n<PSI_X>3.4977679810e-01</PSI_X>\n<PSI_Y>-7.0484345800e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>77</DETECTOR_ID>\n<PSI_X>3.4977678870e-01</PSI_X>\n<PSI_Y>-7.0472517600e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>78</DETECTOR_ID>\n<PSI_X>3.4977677940e-01</PSI_X>\n<PSI_Y>-7.0460689300e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>79</DETECTOR_ID>\n<PSI_X>3.4977677000e-01</PSI_X>\n<PSI_Y>-7.0448861000e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>80</DETECTOR_ID>\n<PSI_X>3.4977676060e-01</PSI_X>\n<PSI_Y>-7.0437032700e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>81</DETECTOR_ID>\n<PSI_X>3.4977675120e-01</PSI_X>\n<PSI_Y>-7.0425204400e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>82</DETECTOR_ID>\n<PSI_X>3.4977674180e-01</PSI_X>\n<PSI_Y>-7.0413376000e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>83</DETECTOR_ID>\n<PSI_X>3.4977673250e-01</PSI_X>\n<PSI_Y>-7.0401547600e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>84</DETECTOR_ID>\n<PSI_X>3.4977672310e-01</PSI_X>\n<PSI_Y>-7.0389719100e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>85</DETECTOR_ID>\n<PSI_X>3.4977671370e-01</PSI_X>\n<PSI_Y>-7.0377890600e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>86</DETECTOR_ID>\n<PSI_X>3.4977670430e-01</PSI_X>\n<PSI_Y>-7.0366062100e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>87</DETECTOR_ID>\n<PSI_X>3.4977669500e-01</PSI_X>\n<PSI_Y>-7.0354233500e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>88</DETECTOR_ID>\n<PSI_X>3.4977668560e-01</PSI_X>\n<PSI_Y>-7.0342404900e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>89</DETECTOR_ID>\n<PSI_X>3.4977667620e-01</PSI_X>\n<PSI_Y>-7.0330576300e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>90</DETECTOR_ID>\n<PSI_X>3.4977666680e-01</PSI_X>\n<PSI_Y>-7.0318747600e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>91</DETECTOR_ID>\n<PSI_X>3.4977665750e-01</PSI_X>\n<PSI_Y>-7.0306918900e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>92</DETECTOR_ID>\n<PSI_X>3.4977664810e-01</PSI_X>\n<PSI_Y>-7.0295090200e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>93</DETECTOR_ID>\n<PSI_X>3.4977663870e-01</PSI_X>\n<PSI_Y>-7.0283261400e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>94</DETECTOR_ID>\n<PSI_X>3.4977662930e-01</PSI_X>\n<PSI_Y>-7.0271432600e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>95</DETECTOR_ID>\n<PSI_X>3.4977662000e-01</PSI_X>\n<PSI_Y>-7.0259603800e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>96</DETECTOR_ID>\n<PSI_X>3.4977661060e-01</PSI_X>\n<PSI_Y>-7.0247774900e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>97</DETECTOR_ID>\n<PSI_X>3.4977660120e-01</PSI_X>\n<PSI_Y>-7.0235946000e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>98</DETECTOR_ID>\n<PSI_X>3.4977659180e-01</PSI_X>\n<PSI_Y>-7.0224117100e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>99</DETECTOR_ID>\n<PSI_X>3.4977658250e-01</PSI_X>\n<PSI_Y>-7.0212288100e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>100</DETECTOR_ID>\n<PSI_X>3.4977657310e-01</PSI_X>\n<PSI_Y>-7.0200459100e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>101</DETECTOR_ID>\n<PSI_X>3.4977656370e-01</PSI_X>\n<PSI_Y>-7.0188630000e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>102</DETECTOR_ID>\n<PSI_X>3.4977655430e-01</PSI_X>\n<PSI_Y>-7.0176801000e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>103</DETECTOR_ID>\n<PSI_X>3.4977654500e-01</PSI_X>\n<PSI_Y>-7.0164971800e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>104</DETECTOR_ID>\n<PSI_X>3.4977653560e-01</PSI_X>\n<PSI_Y>-7.0153142700e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>105</DETECTOR_ID>\n<PSI_X>3.4977652620e-01</PSI_X>\n<PSI_Y>-7.0141313500e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>106</DETECTOR_ID>\n<PSI_X>3.4977651680e-01</PSI_X>\n<PSI_Y>-7.0129484300e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>107</DETECTOR_ID>\n<PSI_X>3.4977650750e-01</PSI_X>\n<PSI_Y>-7.0117655000e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>108</DETECTOR_ID>\n<PSI_X>3.4977649810e-01</PSI_X>\n<PSI_Y>-7.0105825700e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>109</DETECTOR_ID>\n<PSI_X>3.4977648870e-01</PSI_X>\n<PSI_Y>-7.0093996400e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>110</DETECTOR_ID>\n<PSI_X>3.4977647930e-01</PSI_X>\n<PSI_Y>-7.0082167100e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>111</DETECTOR_ID>\n<PSI_X>3.4977647000e-01</PSI_X>\n<PSI_Y>-7.0070337700e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>112</DETECTOR_ID>\n<PSI_X>3.4977646060e-01</PSI_X>\n<PSI_Y>-7.0058508200e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>113</DETECTOR_ID>\n<PSI_X>3.4977645120e-01</PSI_X>\n<PSI_Y>-7.0046678800e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>114</DETECTOR_ID>\n<PSI_X>3.4977644180e-01</PSI_X>\n<PSI_Y>-7.0034849300e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>115</DETECTOR_ID>\n<PSI_X>3.4977643250e-01</PSI_X>\n<PSI_Y>-7.0023019800e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>116</DETECTOR_ID>\n<PSI_X>3.4977642310e-01</PSI_X>\n<PSI_Y>-7.0011190200e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>117</DETECTOR_ID>\n<PSI_X>3.4977641370e-01</PSI_X>\n<PSI_Y>-6.9999360600e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>118</DETECTOR_ID>\n<PSI_X>3.4977640430e-01</PSI_X>\n<PSI_Y>-6.9987531000e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>119</DETECTOR_ID>\n<PSI_X>3.4977639500e-01</PSI_X>\n<PSI_Y>-6.9975701300e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>120</DETECTOR_ID>\n<PSI_X>3.4977638560e-01</PSI_X>\n<PSI_Y>-6.9963871600e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>121</DETECTOR_ID>\n<PSI_X>3.4977637620e-01</PSI_X>\n<PSI_Y>-6.9952041800e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>122</DETECTOR_ID>\n<PSI_X>3.4977636680e-01</PSI_X>\n<PSI_Y>-6.9940212100e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>123</DETECTOR_ID>\n<PSI_X>3.4977635750e-01</PSI_X>\n<PSI_Y>-6.9928382300e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>124</DETECTOR_ID>\n<PSI_X>3.4977634810e-01</PSI_X>\n<PSI_Y>-6.9916552400e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>125</DETECTOR_ID>\n<PSI_X>3.4977633870e-01</PSI_X>\n<PSI_Y>-6.9904722600e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>126</DETECTOR_ID>\n<PSI_X>3.4977632930e-01</PSI_X>\n<PSI_Y>-6.9892892600e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>127</DETECTOR_ID>\n<PSI_X>3.4977632000e-01</PSI_X>\n<PSI_Y>-6.9881062700e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>128</DETECTOR_ID>\n<PSI_X>3.4977631060e-01</PSI_X>\n<PSI_Y>-6.9869232700e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>129</DETECTOR_ID>\n<PSI_X>3.4977630120e-01</PSI_X>\n<PSI_Y>-6.9857402700e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>130</DETECTOR_ID>\n<PSI_X>3.4977629190e-01</PSI_X>\n<PSI_Y>-6.9845572700e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>131</DETECTOR_ID>\n<PSI_X>3.4977628250e-01</PSI_X>\n<PSI_Y>-6.9833742600e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>132</DETECTOR_ID>\n<PSI_X>3.4977627310e-01</PSI_X>\n<PSI_Y>-6.9821912500e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>133</DETECTOR_ID>\n<PSI_X>3.4977626370e-01</PSI_X>\n<PSI_Y>-6.9810082300e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>134</DETECTOR_ID>\n<PSI_X>3.4977625440e-01</PSI_X>\n<PSI_Y>-6.9798252100e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>135</DETECTOR_ID>\n<PSI_X>3.4977624500e-01</PSI_X>\n<PSI_Y>-6.9786421900e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>136</DETECTOR_ID>\n<PSI_X>3.4977623560e-01</PSI_X>\n<PSI_Y>-6.9774591600e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>137</DETECTOR_ID>\n<PSI_X>3.4977622620e-01</PSI_X>\n<PSI_Y>-6.9762761400e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>138</DETECTOR_ID>\n<PSI_X>3.4977621690e-01</PSI_X>\n<PSI_Y>-6.9750931000e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>139</DETECTOR_ID>\n<PSI_X>3.4977620750e-01</PSI_X>\n<PSI_Y>-6.9739100700e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>140</DETECTOR_ID>\n<PSI_X>3.4977619810e-01</PSI_X>\n<PSI_Y>-6.9727270300e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>141</DETECTOR_ID>\n<PSI_X>3.4977618870e-01</PSI_X>\n<PSI_Y>-6.9715439900e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>142</DETECTOR_ID>\n<PSI_X>3.4977617940e-01</PSI_X>\n<PSI_Y>-6.9703609400e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>143</DETECTOR_ID>\n<PSI_X>3.4977617000e-01</PSI_X>\n<PSI_Y>-6.9691778900e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>144</DETECTOR_ID>\n<PSI_X>3.4977616060e-01</PSI_X>\n<PSI_Y>-6.9679948400e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>145</DETECTOR_ID>\n<PSI_X>3.4977615120e-01</PSI_X>\n<PSI_Y>-6.9668117800e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>146</DETECTOR_ID>\n<PSI_X>3.4977614190e-01</PSI_X>\n<PSI_Y>-6.9656287200e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>147</DETECTOR_ID>\n<PSI_X>3.4977613250e-01</PSI_X>\n<PSI_Y>-6.9644456600e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>148</DETECTOR_ID>\n<PSI_X>3.4977612310e-01</PSI_X>\n<PSI_Y>-6.9632625900e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>149</DETECTOR_ID>\n<PSI_X>3.4977611370e-01</PSI_X>\n<PSI_Y>-6.9620795200e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>150</DETECTOR_ID>\n<PSI_X>3.4977610440e-01</PSI_X>\n<PSI_Y>-6.9608964500e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>151</DETECTOR_ID>\n<PSI_X>3.4977609500e-01</PSI_X>\n<PSI_Y>-6.9597133700e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>152</DETECTOR_ID>\n<PSI_X>3.4977608560e-01</PSI_X>\n<PSI_Y>-6.9585302900e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>153</DETECTOR_ID>\n<PSI_X>3.4977607630e-01</PSI_X>\n<PSI_Y>-6.9573472000e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>154</DETECTOR_ID>\n<PSI_X>3.4977606690e-01</PSI_X>\n<PSI_Y>-6.9561641200e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>155</DETECTOR_ID>\n<PSI_X>3.4977605750e-01</PSI_X>\n<PSI_Y>-6.9549810300e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>156</DETECTOR_ID>\n<PSI_X>3.4977604810e-01</PSI_X>\n<PSI_Y>-6.9537979300e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>157</DETECTOR_ID>\n<PSI_X>3.4977603880e-01</PSI_X>\n<PSI_Y>-6.9526148300e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>158</DETECTOR_ID>\n<PSI_X>3.4977602940e-01</PSI_X>\n<PSI_Y>-6.9514317300e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>159</DETECTOR_ID>\n<PSI_X>3.4977602000e-01</PSI_X>\n<PSI_Y>-6.9502486300e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>160</DETECTOR_ID>\n<PSI_X>3.4977601060e-01</PSI_X>\n<PSI_Y>-6.9490655200e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>161</DETECTOR_ID>\n<PSI_X>3.4977600130e-01</PSI_X>\n<PSI_Y>-6.9478824100e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>162</DETECTOR_ID>\n<PSI_X>3.4977599190e-01</PSI_X>\n<PSI_Y>-6.9466992900e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>163</DETECTOR_ID>\n<PSI_X>3.4977598250e-01</PSI_X>\n<PSI_Y>-6.9455161800e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>164</DETECTOR_ID>\n<PSI_X>3.4977597320e-01</PSI_X>\n<PSI_Y>-6.9443330500e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>165</DETECTOR_ID>\n<PSI_X>3.4977596380e-01</PSI_X>\n<PSI_Y>-6.9431499300e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>166</DETECTOR_ID>\n<PSI_X>3.4977595440e-01</PSI_X>\n<PSI_Y>-6.9419668000e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>167</DETECTOR_ID>\n<PSI_X>3.4977594500e-01</PSI_X>\n<PSI_Y>-6.9407836700e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>168</DETECTOR_ID>\n<PSI_X>3.4977593570e-01</PSI_X>\n<PSI_Y>-6.9396005300e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>169</DETECTOR_ID>\n<PSI_X>3.4977592630e-01</PSI_X>\n<PSI_Y>-6.9384173900e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>170</DETECTOR_ID>\n<PSI_X>3.4977591690e-01</PSI_X>\n<PSI_Y>-6.9372342500e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>171</DETECTOR_ID>\n<PSI_X>3.4977590750e-01</PSI_X>\n<PSI_Y>-6.9360511100e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>172</DETECTOR_ID>\n<PSI_X>3.4977589820e-01</PSI_X>\n<PSI_Y>-6.9348679600e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>173</DETECTOR_ID>\n<PSI_X>3.4977588880e-01</PSI_X>\n<PSI_Y>-6.9336848000e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>174</DETECTOR_ID>\n<PSI_X>3.4977587940e-01</PSI_X>\n<PSI_Y>-6.9325016500e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>175</DETECTOR_ID>\n<PSI_X>3.4977587010e-01</PSI_X>\n<PSI_Y>-6.9313184900e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>176</DETECTOR_ID>\n<PSI_X>3.4977586070e-01</PSI_X>\n<PSI_Y>-6.9301353300e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>177</DETECTOR_ID>\n<PSI_X>3.4977585130e-01</PSI_X>\n<PSI_Y>-6.9289521600e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>178</DETECTOR_ID>\n<PSI_X>3.4977584190e-01</PSI_X>\n<PSI_Y>-6.9277689900e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>179</DETECTOR_ID>\n<PSI_X>3.4977583260e-01</PSI_X>\n<PSI_Y>-6.9265858200e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>180</DETECTOR_ID>\n<PSI_X>3.4977582320e-01</PSI_X>\n<PSI_Y>-6.9254026400e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>181</DETECTOR_ID>\n<PSI_X>3.4977581380e-01</PSI_X>\n<PSI_Y>-6.9242194600e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>182</DETECTOR_ID>\n<PSI_X>3.4977580440e-01</PSI_X>\n<PSI_Y>-6.9230362800e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>183</DETECTOR_ID>\n<PSI_X>3.4977579510e-01</PSI_X>\n<PSI_Y>-6.9218530900e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>184</DETECTOR_ID>\n<PSI_X>3.4977578570e-01</PSI_X>\n<PSI_Y>-6.9206699000e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>185</DETECTOR_ID>\n<PSI_X>3.4977577630e-01</PSI_X>\n<PSI_Y>-6.9194867000e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>186</DETECTOR_ID>\n<PSI_X>3.4977576700e-01</PSI_X>\n<PSI_Y>-6.9183035100e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>187</DETECTOR_ID>\n<PSI_X>3.4977575760e-01</PSI_X>\n<PSI_Y>-6.9171203100e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>188</DETECTOR_ID>\n<PSI_X>3.4977574820e-01</PSI_X>\n<PSI_Y>-6.9159371000e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>189</DETECTOR_ID>\n<PSI_X>3.4977573880e-01</PSI_X>\n<PSI_Y>-6.9147539000e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>190</DETECTOR_ID>\n<PSI_X>3.4977572950e-01</PSI_X>\n<PSI_Y>-6.9135706800e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>191</DETECTOR_ID>\n<PSI_X>3.4977572010e-01</PSI_X>\n<PSI_Y>-6.9123874700e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>192</DETECTOR_ID>\n<PSI_X>3.4977571070e-01</PSI_X>\n<PSI_Y>-6.9112042500e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>193</DETECTOR_ID>\n<PSI_X>3.4977570130e-01</PSI_X>\n<PSI_Y>-6.9100210300e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>194</DETECTOR_ID>\n<PSI_X>3.4977569200e-01</PSI_X>\n<PSI_Y>-6.9088378100e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>195</DETECTOR_ID>\n<PSI_X>3.4977568260e-01</PSI_X>\n<PSI_Y>-6.9076545800e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>196</DETECTOR_ID>\n<PSI_X>3.4977567320e-01</PSI_X>\n<PSI_Y>-6.9064713500e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>197</DETECTOR_ID>\n<PSI_X>3.4977566390e-01</PSI_X>\n<PSI_Y>-6.9052881100e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>198</DETECTOR_ID>\n<PSI_X>3.4977565450e-01</PSI_X>\n<PSI_Y>-6.9041048800e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>199</DETECTOR_ID>\n<PSI_X>3.4977564510e-01</PSI_X>\n<PSI_Y>-6.9029216300e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>200</DETECTOR_ID>\n<PSI_X>3.4977563570e-01</PSI_X>\n<PSI_Y>-6.9017383900e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>201</DETECTOR_ID>\n<PSI_X>3.4977562640e-01</PSI_X>\n<PSI_Y>-6.9005551400e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>202</DETECTOR_ID>\n<PSI_X>3.4977561700e-01</PSI_X>\n<PSI_Y>-6.8993718900e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>203</DETECTOR_ID>\n<PSI_X>3.4977560760e-01</PSI_X>\n<PSI_Y>-6.8981886300e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>204</DETECTOR_ID>\n<PSI_X>3.4977559830e-01</PSI_X>\n<PSI_Y>-6.8970053700e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>205</DETECTOR_ID>\n<PSI_X>3.4977558890e-01</PSI_X>\n<PSI_Y>-6.8958221100e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>206</DETECTOR_ID>\n<PSI_X>3.4977557950e-01</PSI_X>\n<PSI_Y>-6.8946388500e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>207</DETECTOR_ID>\n<PSI_X>3.4977557010e-01</PSI_X>\n<PSI_Y>-6.8934555800e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>208</DETECTOR_ID>\n<PSI_X>3.4977556080e-01</PSI_X>\n<PSI_Y>-6.8922723100e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>209</DETECTOR_ID>\n<PSI_X>3.4977555140e-01</PSI_X>\n<PSI_Y>-6.8910890300e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>210</DETECTOR_ID>\n<PSI_X>3.4977554200e-01</PSI_X>\n<PSI_Y>-6.8899057500e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>211</DETECTOR_ID>\n<PSI_X>3.4977553270e-01</PSI_X>\n<PSI_Y>-6.8887224700e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>212</DETECTOR_ID>\n<PSI_X>3.4977552330e-01</PSI_X>\n<PSI_Y>-6.8875391800e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>213</DETECTOR_ID>\n<PSI_X>3.4977551390e-01</PSI_X>\n<PSI_Y>-6.8863558900e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>214</DETECTOR_ID>\n<PSI_X>3.4977550450e-01</PSI_X>\n<PSI_Y>-6.8851726000e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>215</DETECTOR_ID>\n<PSI_X>3.4977549520e-01</PSI_X>\n<PSI_Y>-6.8839893000e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>216</DETECTOR_ID>\n<PSI_X>3.4977548580e-01</PSI_X>\n<PSI_Y>-6.8828060000e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>217</DETECTOR_ID>\n<PSI_X>3.4977547640e-01</PSI_X>\n<PSI_Y>-6.8816227000e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>218</DETECTOR_ID>\n<PSI_X>3.4977546710e-01</PSI_X>\n<PSI_Y>-6.8804394000e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>219</DETECTOR_ID>\n<PSI_X>3.4977545770e-01</PSI_X>\n<PSI_Y>-6.8792560900e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>220</DETECTOR_ID>\n<PSI_X>3.4977544830e-01</PSI_X>\n<PSI_Y>-6.8780727700e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>221</DETECTOR_ID>\n<PSI_X>3.4977543890e-01</PSI_X>\n<PSI_Y>-6.8768894600e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>222</DETECTOR_ID>\n<PSI_X>3.4977542960e-01</PSI_X>\n<PSI_Y>-6.8757061400e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>223</DETECTOR_ID>\n<PSI_X>3.4977542020e-01</PSI_X>\n<PSI_Y>-6.8745228100e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>224</DETECTOR_ID>\n<PSI_X>3.4977541080e-01</PSI_X>\n<PSI_Y>-6.8733394900e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>225</DETECTOR_ID>\n<PSI_X>3.4977540150e-01</PSI_X>\n<PSI_Y>-6.8721561600e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>226</DETECTOR_ID>\n<PSI_X>3.4977539210e-01</PSI_X>\n<PSI_Y>-6.8709728200e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>227</DETECTOR_ID>\n<PSI_X>3.4977538270e-01</PSI_X>\n<PSI_Y>-6.8697894800e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>228</DETECTOR_ID>\n<PSI_X>3.4977537330e-01</PSI_X>\n<PSI_Y>-6.8686061400e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>229</DETECTOR_ID>\n<PSI_X>3.4977536400e-01</PSI_X>\n<PSI_Y>-6.8674228000e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>230</DETECTOR_ID>\n<PSI_X>3.4977535460e-01</PSI_X>\n<PSI_Y>-6.8662394500e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>231</DETECTOR_ID>\n<PSI_X>3.4977534520e-01</PSI_X>\n<PSI_Y>-6.8650561000e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>232</DETECTOR_ID>\n<PSI_X>3.4977533590e-01</PSI_X>\n<PSI_Y>-6.8638727500e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>233</DETECTOR_ID>\n<PSI_X>3.4977532650e-01</PSI_X>\n<PSI_Y>-6.8626893900e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>234</DETECTOR_ID>\n<PSI_X>3.4977531710e-01</PSI_X>\n<PSI_Y>-6.8615060300e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>235</DETECTOR_ID>\n<PSI_X>3.4977530780e-01</PSI_X>\n<PSI_Y>-6.8603226700e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>236</DETECTOR_ID>\n<PSI_X>3.4977529840e-01</PSI_X>\n<PSI_Y>-6.8591393000e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>237</DETECTOR_ID>\n<PSI_X>3.4977528900e-01</PSI_X>\n<PSI_Y>-6.8579559300e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>238</DETECTOR_ID>\n<PSI_X>3.4977527960e-01</PSI_X>\n<PSI_Y>-6.8567725500e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>239</DETECTOR_ID>\n<PSI_X>3.4977527030e-01</PSI_X>\n<PSI_Y>-6.8555891800e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>240</DETECTOR_ID>\n<PSI_X>3.4977526090e-01</PSI_X>\n<PSI_Y>-6.8544057900e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>241</DETECTOR_ID>\n<PSI_X>3.4977525150e-01</PSI_X>\n<PSI_Y>-6.8532224100e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>242</DETECTOR_ID>\n<PSI_X>3.4977524220e-01</PSI_X>\n<PSI_Y>-6.8520390200e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>243</DETECTOR_ID>\n<PSI_X>3.4977523280e-01</PSI_X>\n<PSI_Y>-6.8508556300e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>244</DETECTOR_ID>\n<PSI_X>3.4977522340e-01</PSI_X>\n<PSI_Y>-6.8496722400e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>245</DETECTOR_ID>\n<PSI_X>3.4977521400e-01</PSI_X>\n<PSI_Y>-6.8484888400e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>246</DETECTOR_ID>\n<PSI_X>3.4977520470e-01</PSI_X>\n<PSI_Y>-6.8473054400e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>247</DETECTOR_ID>\n<PSI_X>3.4977519530e-01</PSI_X>\n<PSI_Y>-6.8461220300e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>248</DETECTOR_ID>\n<PSI_X>3.4977518590e-01</PSI_X>\n<PSI_Y>-6.8449386200e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>249</DETECTOR_ID>\n<PSI_X>3.4977517660e-01</PSI_X>\n<PSI_Y>-6.8437552100e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>250</DETECTOR_ID>\n<PSI_X>3.4977516720e-01</PSI_X>\n<PSI_Y>-6.8425718000e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>251</DETECTOR_ID>\n<PSI_X>3.4977515780e-01</PSI_X>\n<PSI_Y>-6.8413883800e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>252</DETECTOR_ID>\n<PSI_X>3.4977514850e-01</PSI_X>\n<PSI_Y>-6.8402049600e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>253</DETECTOR_ID>\n<PSI_X>3.4977513910e-01</PSI_X>\n<PSI_Y>-6.8390215300e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>254</DETECTOR_ID>\n<PSI_X>3.4977512970e-01</PSI_X>\n<PSI_Y>-6.8378381000e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>255</DETECTOR_ID>\n<PSI_X>3.4977512030e-01</PSI_X>\n<PSI_Y>-6.8366546700e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>256</DETECTOR_ID>\n<PSI_X>3.4977511100e-01</PSI_X>\n<PSI_Y>-6.8354712300e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>257</DETECTOR_ID>\n<PSI_X>3.4977510160e-01</PSI_X>\n<PSI_Y>-6.8342878000e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>258</DETECTOR_ID>\n<PSI_X>3.4977509220e-01</PSI_X>\n<PSI_Y>-6.8331043500e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>259</DETECTOR_ID>\n<PSI_X>3.4977508290e-01</PSI_X>\n<PSI_Y>-6.8319209100e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>260</DETECTOR_ID>\n<PSI_X>3.4977507350e-01</PSI_X>\n<PSI_Y>-6.8307374600e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>261</DETECTOR_ID>\n<PSI_X>3.4977506410e-01</PSI_X>\n<PSI_Y>-6.8295540100e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>262</DETECTOR_ID>\n<PSI_X>3.4977505480e-01</PSI_X>\n<PSI_Y>-6.8283705500e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>263</DETECTOR_ID>\n<PSI_X>3.4977504540e-01</PSI_X>\n<PSI_Y>-6.8271870900e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>264</DETECTOR_ID>\n<PSI_X>3.4977503600e-01</PSI_X>\n<PSI_Y>-6.8260036300e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>265</DETECTOR_ID>\n<PSI_X>3.4977502670e-01</PSI_X>\n<PSI_Y>-6.8248201600e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>266</DETECTOR_ID>\n<PSI_X>3.4977501730e-01</PSI_X>\n<PSI_Y>-6.8236366900e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>267</DETECTOR_ID>\n<PSI_X>3.4977500790e-01</PSI_X>\n<PSI_Y>-6.8224532200e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>268</DETECTOR_ID>\n<PSI_X>3.4977499850e-01</PSI_X>\n<PSI_Y>-6.8212697400e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>269</DETECTOR_ID>\n<PSI_X>3.4977498920e-01</PSI_X>\n<PSI_Y>-6.8200862700e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>270</DETECTOR_ID>\n<PSI_X>3.4977497980e-01</PSI_X>\n<PSI_Y>-6.8189027800e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>271</DETECTOR_ID>\n<PSI_X>3.4977497040e-01</PSI_X>\n<PSI_Y>-6.8177193000e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>272</DETECTOR_ID>\n<PSI_X>3.4977496110e-01</PSI_X>\n<PSI_Y>-6.8165358100e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>273</DETECTOR_ID>\n<PSI_X>3.4977495170e-01</PSI_X>\n<PSI_Y>-6.8153523100e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>274</DETECTOR_ID>\n<PSI_X>3.4977494230e-01</PSI_X>\n<PSI_Y>-6.8141688200e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>275</DETECTOR_ID>\n<PSI_X>3.4977493300e-01</PSI_X>\n<PSI_Y>-6.8129853200e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>276</DETECTOR_ID>\n<PSI_X>3.4977492360e-01</PSI_X>\n<PSI_Y>-6.8118018100e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>277</DETECTOR_ID>\n<PSI_X>3.4977491420e-01</PSI_X>\n<PSI_Y>-6.8106183100e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>278</DETECTOR_ID>\n<PSI_X>3.4977490480e-01</PSI_X>\n<PSI_Y>-6.8094348000e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>279</DETECTOR_ID>\n<PSI_X>3.4977489550e-01</PSI_X>\n<PSI_Y>-6.8082512900e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>280</DETECTOR_ID>\n<PSI_X>3.4977488610e-01</PSI_X>\n<PSI_Y>-6.8070677700e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>281</DETECTOR_ID>\n<PSI_X>3.4977487670e-01</PSI_X>\n<PSI_Y>-6.8058842500e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>282</DETECTOR_ID>\n<PSI_X>3.4977486740e-01</PSI_X>\n<PSI_Y>-6.8047007300e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>283</DETECTOR_ID>\n<PSI_X>3.4977485800e-01</PSI_X>\n<PSI_Y>-6.8035172000e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>284</DETECTOR_ID>\n<PSI_X>3.4977484860e-01</PSI_X>\n<PSI_Y>-6.8023336700e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>285</DETECTOR_ID>\n<PSI_X>3.4977483930e-01</PSI_X>\n<PSI_Y>-6.8011501400e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>286</DETECTOR_ID>\n<PSI_X>3.4977482990e-01</PSI_X>\n<PSI_Y>-6.7999666000e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>287</DETECTOR_ID>\n<PSI_X>3.4977482050e-01</PSI_X>\n<PSI_Y>-6.7987830600e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>288</DETECTOR_ID>\n<PSI_X>3.4977481120e-01</PSI_X>\n<PSI_Y>-6.7975995100e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>289</DETECTOR_ID>\n<PSI_X>3.4977480180e-01</PSI_X>\n<PSI_Y>-6.7964159700e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>290</DETECTOR_ID>\n<PSI_X>3.4977479240e-01</PSI_X>\n<PSI_Y>-6.7952324200e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>291</DETECTOR_ID>\n<PSI_X>3.4977478310e-01</PSI_X>\n<PSI_Y>-6.7940488600e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>292</DETECTOR_ID>\n<PSI_X>3.4977477370e-01</PSI_X>\n<PSI_Y>-6.7928653100e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>293</DETECTOR_ID>\n<PSI_X>3.4977476430e-01</PSI_X>\n<PSI_Y>-6.7916817500e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>294</DETECTOR_ID>\n<PSI_X>3.4977475490e-01</PSI_X>\n<PSI_Y>-6.7904981800e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>295</DETECTOR_ID>\n<PSI_X>3.4977474560e-01</PSI_X>\n<PSI_Y>-6.7893146200e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>296</DETECTOR_ID>\n<PSI_X>3.4977473620e-01</PSI_X>\n<PSI_Y>-6.7881310400e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>297</DETECTOR_ID>\n<PSI_X>3.4977472680e-01</PSI_X>\n<PSI_Y>-6.7869474700e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>298</DETECTOR_ID>\n<PSI_X>3.4977471750e-01</PSI_X>\n<PSI_Y>-6.7857638900e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>299</DETECTOR_ID>\n<PSI_X>3.4977470810e-01</PSI_X>\n<PSI_Y>-6.7845803100e-02</PSI_Y>\n</Look_Angles>\n<Look_Angles>\n<DETECTOR_ID>300</DETECTOR_ID>\n<PSI_X>3.4977469870e-01</PSI_X>\n<PSI_Y>-6.7833967300e-02</PSI_Y>\n</Look_Angles>\n</Look_Angles_List>\n</Instrument_Look_Angles>\n</Instrument_Look_Angles_List></Sensor_Configuration>\n\n<Frame_Counters>\n<SEGMENT_START>31</SEGMENT_START>\n<SCENE_START>31</SCENE_START>\n<SEGMENT_END>12051</SEGMENT_END>\n</Frame_Counters>\n\n<Data_Strip_Coordinates>\n<FIRST_PIXEL_RAW>1</FIRST_PIXEL_RAW>\n<FIRST_LINE_RAW>1</FIRST_LINE_RAW>\n<FIRST_PIXEL_1B>0</FIRST_PIXEL_1B>\n<FIRST_LINE_1B>0</FIRST_LINE_1B>\n</Data_Strip_Coordinates>\n\n<Models></Models>\n\n<Sensor_Calibration>\n<METHOD>NOINFO</METHOD>\n<Calibration>\n<Band_Parameters>\n<BAND_INDEX>1</BAND_INDEX>\n<Gain_Section>\n<GAIN_NUMBER>4</GAIN_NUMBER>\n<GAIN_ANALOG_VALUE>1.419000</GAIN_ANALOG_VALUE>\n<Pixel_Parameters>\n<G_DATE>2000-03-01T00:00:00.000000</G_DATE>\n<DC_DATE>2007-12-17T00:00:00.000000</DC_DATE>\n<Cells>\n<Cell>\n<G>1.010489</G>\n<DARK_CURRENT>2.267000</DARK_CURRENT>\n</Cell>\n\n<Cell>\n<G>1.012669</G>\n<DARK_CURRENT>2.345000</DARK_CURRENT>\n</Cell>\n\n<Cell>\n<G>1.015983</G>\n<DARK_CURRENT>2.246000</DARK_CURRENT>\n</Cell>\n\n<Cell>\n<G>1.012968</G>\n<DARK_CURRENT>2.340000</DARK_CURRENT>\n</Cell>\n\n<Cell>\n<G>1.005883</G>\n<DARK_CURRENT>2.297000</DARK_CURRENT>\n</Cell>\n\n<Cell>\n<G>1.008890</G>\n<DARK_CURRENT>2.202000</DARK_CURRENT>\n</Cell>\n\n<Cell>\n<G>0.998299</G>\n<DARK_CURRENT>2.320000</DARK_CURRENT>\n</Cell>\n\n<Cell>\n<G>1.009489</G>\n<DARK_CURRENT>2.214000</DARK_CURRENT>\n</Cell>\n\n<Cell>\n<G>0.999796</G>\n<DARK_CURRENT>2.362000</DARK_CURRENT>\n</Cell>\n\n<Cell>\n<G>1.004994</G>\n<DARK_CURRENT>2.211000</DARK_CURRENT>\n</Cell>\n\n<Cell>\n<G>1.001792</G>\n<DARK_CURRENT>2.312000</DARK_CURRENT>\n</Cell>\n\n<Cell>\n<G>1.008291</G>\n<DARK_CURRENT>2.240000</DARK_CURRENT>\n</Cell>\n\n<Cell>\n<G>0.990815</G>\n<DARK_CURRENT>2.315000</DARK_CURRENT>\n</Cell>\n\n<Cell>\n<G>1.006193</G>\n<DARK_CURRENT>2.236000</DARK_CURRENT>\n</Cell>\n\n<Cell>\n<G>0.993809</G>\n<DARK_CURRENT>2.357000</DARK_CURRENT>\n</Cell>\n\n<Cell>\n<G>1.001497</G>\n<DARK_CURRENT>2.226000</DARK_CURRENT>\n</Cell>\n\n<Cell>\n<G>0.996802</G>\n<DARK_CURRENT>2.367000</DARK_CURRENT>\n</Cell>\n\n<Cell>\n<G>1.006692</G>\n<DARK_CURRENT>2.221000</DARK_CURRENT>\n</Cell>\n\n<Cell>\n<G>1.003488</G>\n<DARK_CURRENT>2.319000</DARK_CURRENT>\n</Cell>\n\n<Cell>\n<G>1.002796</G>\n<DARK_CURRENT>2.214000</DARK_CURRENT>\n</Cell>\n\n<Cell>\n<G>1.000395</G>\n<DARK_CURRENT>2.314000</DARK_CURRENT>\n</Cell>\n\n<Cell>\n<G>1.007991</G>\n<DARK_CURRENT>2.207000</DARK_CURRENT>\n</Cell>\n\n<Cell>\n<G>0.994108</G>\n<DARK_CURRENT>2.289000</DARK_CURRENT>\n</Cell>\n\n<Cell>\n<G>1.006792</G>\n<DARK_CURRENT>2.218000</DARK_CURRENT>\n</Cell>\n\n<Cell>\n<G>0.998599</G>\n<DARK_CURRENT>2.305000</DARK_CURRENT>\n</Cell>\n\n<Cell>\n<G>1.002097</G>\n<DARK_CURRENT>2.223000</DARK_CURRENT>\n</Cell>\n\n<Cell>\n<G>1.003488</G>\n<DARK_CURRENT>2.308000</DARK_CURRENT>\n</Cell>\n\n<Cell>\n<G>1.005993</G>\n<DARK_CURRENT>2.219000</DARK_CURRENT>\n</Cell>\n\n<Cell>\n<G>0.998698</G>\n<DARK_CURRENT>2.305000</DARK_CURRENT>\n</Cell>\n\n<Cell>\n<G>1.001997</G>\n<DARK_CURRENT>2.197000</DARK_CURRENT>\n</Cell>\n\n<Cell>\n<G>0.996403</G>\n<DARK_CURRENT>2.311000</DARK_CURRENT>\n</Cell>\n\n<Cell>\n<G>1.005893</G>\n<DARK_CURRENT>2.213000</DARK_CURRENT>\n</Cell>\n\n<Cell>\n<G>0.996802</G>\n<DARK_CURRENT>2.322000</DARK_CURRENT>\n</Cell>\n\n<Cell>\n<G>1.004295</G>\n<DARK_CURRENT>2.200000</DARK_CURRENT>\n</Cell>\n\n<Cell>\n<G>1.004486</G>\n<DARK_CURRENT>2.306000</DARK_CURRENT>\n</Cell>\n\n<Cell>\n<G>1.003595</G>\n<DARK_CURRENT>2.203000</DARK_CURRENT>\n</Cell>\n\n<Cell>\n<G>0.999696</G>\n<DARK_CURRENT>2.313000</DARK_CURRENT>\n</Cell>\n\n<Cell>\n<G>1.006093</G>\n<DARK_CURRENT>2.226000</DARK_CURRENT>\n</Cell>\n\n<Cell>\n<G>0.991014</G>\n<DARK_CURRENT>2.342000</DARK_CURRENT>\n</Cell>\n\n<Cell>\n<G>1.004594</G>\n<DARK_CURRENT>2.210000</DARK_CURRENT>\n</Cell>\n\n<Cell>\n<G>0.998299</G>\n<DARK_CURRENT>2.285000</DARK_CURRENT>\n</Cell>\n\n<Cell>\n<G>1.005194</G>\n<DARK_CURRENT>2.200000</DARK_CURRENT>\n</Cell>\n\n<Cell>\n<G>1.003688</G>\n<DARK_CURRENT>2.289000</DARK_CURRENT>\n</Cell>\n\n</Cells>\n</Pixel_Parameters>\n</Gain_Section>\n\n<Dead_Detectors>\n<VALIDITY_DATE>2007-12-17T00:00:00.000000</VALIDITY_DATE>\n<Bad_Pixels></Bad_Pixels>\n</Dead_Detectors>\n</Band_Parameters>\n</Calibration>\n\n<Spectral_Sensitivities>\n<Band_Spectral_Sensitivities>\n<BAND_INDEX>1</BAND_INDEX>\n<FIRST_WAVELENGTH_VALUE>4.000000e-07</FIRST_WAVELENGTH_VALUE>\n<WAVELENGTH_STEP>1.000000e-08</WAVELENGTH_STEP>\n<CALIBRATION_DATE>2000-03-01T00:00:00.000000</CALIBRATION_DATE>\n<Spectral_Sensitivity_Values>\n<SPECTRAL_SENSITIVITY_VALUE>0.000000</SPECTRAL_SENSITIVITY_VALUE>\n<SPECTRAL_SENSITIVITY_VALUE>0.000000</SPECTRAL_SENSITIVITY_VALUE>\n<SPECTRAL_SENSITIVITY_VALUE>0.000000</SPECTRAL_SENSITIVITY_VALUE>\n<SPECTRAL_SENSITIVITY_VALUE>0.000000</SPECTRAL_SENSITIVITY_VALUE>\n<SPECTRAL_SENSITIVITY_VALUE>0.000000</SPECTRAL_SENSITIVITY_VALUE>\n<SPECTRAL_SENSITIVITY_VALUE>0.000000</SPECTRAL_SENSITIVITY_VALUE>\n<SPECTRAL_SENSITIVITY_VALUE>0.000000</SPECTRAL_SENSITIVITY_VALUE>\n<SPECTRAL_SENSITIVITY_VALUE>0.004800</SPECTRAL_SENSITIVITY_VALUE>\n<SPECTRAL_SENSITIVITY_VALUE>0.037000</SPECTRAL_SENSITIVITY_VALUE>\n<SPECTRAL_SENSITIVITY_VALUE>0.183400</SPECTRAL_SENSITIVITY_VALUE>\n<SPECTRAL_SENSITIVITY_VALUE>0.510700</SPECTRAL_SENSITIVITY_VALUE>\n<SPECTRAL_SENSITIVITY_VALUE>0.624300</SPECTRAL_SENSITIVITY_VALUE>\n<SPECTRAL_SENSITIVITY_VALUE>0.662800</SPECTRAL_SENSITIVITY_VALUE>\n<SPECTRAL_SENSITIVITY_VALUE>0.748900</SPECTRAL_SENSITIVITY_VALUE>\n<SPECTRAL_SENSITIVITY_VALUE>0.781100</SPECTRAL_SENSITIVITY_VALUE>\n<SPECTRAL_SENSITIVITY_VALUE>0.786900</SPECTRAL_SENSITIVITY_VALUE>\n<SPECTRAL_SENSITIVITY_VALUE>0.807200</SPECTRAL_SENSITIVITY_VALUE>\n<SPECTRAL_SENSITIVITY_VALUE>0.827200</SPECTRAL_SENSITIVITY_VALUE>\n<SPECTRAL_SENSITIVITY_VALUE>0.826600</SPECTRAL_SENSITIVITY_VALUE>\n<SPECTRAL_SENSITIVITY_VALUE>0.840800</SPECTRAL_SENSITIVITY_VALUE>\n<SPECTRAL_SENSITIVITY_VALUE>0.856000</SPECTRAL_SENSITIVITY_VALUE>\n<SPECTRAL_SENSITIVITY_VALUE>0.880500</SPECTRAL_SENSITIVITY_VALUE>\n<SPECTRAL_SENSITIVITY_VALUE>0.884800</SPECTRAL_SENSITIVITY_VALUE>\n<SPECTRAL_SENSITIVITY_VALUE>0.928700</SPECTRAL_SENSITIVITY_VALUE>\n<SPECTRAL_SENSITIVITY_VALUE>0.966400</SPECTRAL_SENSITIVITY_VALUE>\n<SPECTRAL_SENSITIVITY_VALUE>0.970800</SPECTRAL_SENSITIVITY_VALUE>\n<SPECTRAL_SENSITIVITY_VALUE>1.000000</SPECTRAL_SENSITIVITY_VALUE>\n<SPECTRAL_SENSITIVITY_VALUE>0.943300</SPECTRAL_SENSITIVITY_VALUE>\n<SPECTRAL_SENSITIVITY_VALUE>0.559100</SPECTRAL_SENSITIVITY_VALUE>\n<SPECTRAL_SENSITIVITY_VALUE>0.123500</SPECTRAL_SENSITIVITY_VALUE>\n<SPECTRAL_SENSITIVITY_VALUE>0.023500</SPECTRAL_SENSITIVITY_VALUE>\n<SPECTRAL_SENSITIVITY_VALUE>0.002300</SPECTRAL_SENSITIVITY_VALUE>\n<SPECTRAL_SENSITIVITY_VALUE>0.000000</SPECTRAL_SENSITIVITY_VALUE>\n<SPECTRAL_SENSITIVITY_VALUE>0.000000</SPECTRAL_SENSITIVITY_VALUE>\n</Spectral_Sensitivity_Values>\n</Band_Spectral_Sensitivities>\n</Spectral_Sensitivities>\n\n<Solar_Irradiance>\n<Band_Solar_Irradiance>\n<BAND_INDEX>1</BAND_INDEX>\n<SOLAR_IRRADIANCE_VALUE>1739</SOLAR_IRRADIANCE_VALUE>\n</Band_Solar_Irradiance>\n</Solar_Irradiance>\n</Sensor_Calibration>\n</Data_Strip>\n</Dimap_Document>\n"
  },
  {
    "path": "src/asp/Camera/tests/spot_style.xsl",
    "content": "<?xml version=\"1.0\"?>\n\n<!-- \nId : SSD1\nDescription : Stylesheet for SPOTScene products\nVersion : 2\n-->\n\n<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">\n\t<xsl:template match=\"/\">\n\t\t<html>\n\t\n\t\t\t<head>\n\t\t\t\t<meta http-equiv=\"content-type\" content=\"text/html;charset=ISO-8859-1\"/>\n\t\t\t\t<title>dimap</title>\n\t\t\t\t<style type=\"text/css\">\n\t\t\t\t\t.entete { color: #fff; font-style: italic; font-weight: bolder; font-size: 14px; font-family: Georgia, \"Times New Roman\" }\n\t\t\t\t\t.titre  { font-weight: bolder; font-size: 20px; font-family: Georgia, \"Times New Roman\"; text-align: center }\n\t\t\t\t\t.spotview { color: white; font-weight: bolder; font-size: 32px; font-family: Verdana, \"Times New Roman\"; text-align: center }\n\t\t\t\t\t.intitule { font-weight: bolder; font-size: 11px; font-family: Verdana, Arial }\n\t\t\t\t\t.intitule2 { color: silver; font-weight: bolder; font-size: 11px; font-family: Verdana, Arial }\n\t\t\t\t\t.description { font-size: 11px; font-family: Verdana, Arial }\n\t\t\t\t\t.affiche { display : show }\n\t\t\t\t\t.masque { display  : none }\n\t\t\t\n\t\t\t\t\t.onglets   {  font-weight: bolder; font-size: 11px; font-family: Verdana, Helvetica; text-decoration: none; text-align: center }\n\t\t\t\t\t.ongletsOn {  font-weight: bolder; font-size: 11px; font-family: Verdana, Helvetica; text-decoration: none; text-align: center }\n\t\t\t\n\t\t\t\t\ta.onglets    { color: #00607a; text-decoration: none; }\n\t\t\t\t\ta.onglets:active  { color: #00607a }\n\t\t\t\t\ta.onglets:hover  { color: white; text-decoration: none }\n\t\t\t\n\t\t\t\t\ta.ongletsOn    { color: #000000; text-decoration: none }\n\t\t\t\t\ta.ongletsOn:active  { color: #000000 }\n\t\t\t\t\ta.ongletsOn:hover  { color: #000000; text-decoration: none }\n\t\t\t\n\t\t\t\t\tdiv.onglets {background-color : #bbbbbb; }\n\t\t\t\t\tdiv.ongletsOn {background-color : #e4decb; }\n\t\t\t\n\t\t\t\t\ttd.onglets {background-color : #bbbbbb; border-style : solid; border-width : 1pt; border-color : black;}\n\t\t\t\t\ttd.ongletsOn {background-color : #e4decb;  border-style : solid; border-width : 1pt; border-color : black;}\n\t\t\t\n\t\t\t\t\t.ROI { border-style : thin-solid; border-color : white;}\n\t\t\t\t\t.ROIshow {  border-left : white 1px solid ; border-right : white 1px solid; border-bottom : white 1px solid ; border-top : white 1px solid ; display : show; visibility : visible }\n\t\t\t\t</style>\n\t\t\t\n\t\t\t\t<script language=\"javascript\">\n\t\t\t\t\tvar strPreviousOn = \"description\" ;\n\t\t\t\n\t\t\t\t\tfunction releaseFunc(strFunc) {\n\t\t\t\t\t\tvar str = \"divO_\" + strFunc;\n\t\t\t\t\t\tvar divelt = document.getElementById(str);\n\t\t\t\t\t\tdivelt.className=\"onglets\";\n\t\t\t\t\t\t\n\t\t\t\t\t\tstr = \"tdO_\" + strFunc;\n\t\t\t\t\t\tdivelt = document.getElementById(str);\n\t\t\t\t\t\tdivelt.className=\"onglets\";\n\t\t\t\t\t\t\n\t\t\t\t\t\tstr = \"aO_\" + strFunc;\n\t\t\t\t\t\tdivelt = document.getElementById(str);\n\t\t\t\t\t\tdivelt.className=\"onglets\";\n\t\t\t\t\t}\n\t\t\t\n\t\t\t\t\tfunction selectFunc(strFunc) {\n\t\t\t\t\t\tvar str = \"divO_\" + strFunc;\n\t\t\t\t\t\tvar divelt = document.getElementById(str);\n\t\t\t\t\t\tdivelt.className=\"ongletsOn\";\n\t\t\t\t\t\t\n\t\t\t\t\t\tstr = \"tdO_\" + strFunc;\n\t\t\t\t\t\tdivelt = document.getElementById(str);\n\t\t\t\t\t\tdivelt.className=\"ongletsOn\";\n\t\t\t\t\t\t\n\t\t\t\t\t\tstr = \"aO_\" + strFunc;\n\t\t\t\t\t\tdivelt = document.getElementById(str);\n\t\t\t\t\t\tdivelt.className=\"ongletsOn\";\n\t\t\t\n\t\t\t\t\t\tstrPreviousOn = strFunc;\n\t\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\tfunction details(strId) {\n\t\t\t\t\t\tvar divelt = document.getElementById(strId);\n\t\t\t\t\t\tif (divelt.className==\"masque\") {\n\t\t\t\t\t\t\tdivelt.className=\"affiche\";\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tdivelt.className=\"masque\";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\n\t\t\t\t\tfunction expandSources() {\n\t\t\t\t\t\t<xsl:for-each select=\"//Source_Information\">\n\t\t\t\t\t\t\teval('div<xsl:value-of select=\"position()\"/>.className = \\'affiche\\'');\n\t\t\t\t\t\t</xsl:for-each>\n\t\t\t\t\t}\n\t\t\t\n\t\t\t\t\tfunction onWindowResize(e) {\n\t\t\t//\t\t\tif (document.readyState == \"loaded\") {\n\t\t\t\t\t\t\torganize(strPreviousOn);\n\t\t\t//\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t// Taille de la scene\n\t\t\t\t\tfunction calcSceneSize() {\n\t\t\t\t\t\tframe_w = 0;\n\t\t\t\t\t\tframe_h = 0;\n\t\t\t\t\t\t<xsl:for-each select=\"//Dataset_Sources/Source_Frame/Vertex\">\n\t\t\t\t\t\t\tframe_w = Math.max(frame_w, <xsl:value-of select=\"FRAME_COL\"/>);\n\t\t\t\t\t\t\tframe_h = Math.max(frame_h, <xsl:value-of select=\"FRAME_ROW\"/>);\n\t\t\t\t\t\t</xsl:for-each> \n\t\t\t\t\t}\n\t\t\t\n\t\t\t\t\n\t\t\t\t\tfunction organize(strMode) {\n\t\t\t\t\t\n\t\t\t\t\t\tswitch(strMode) {\n\t\t\t\t\t\t\tcase \"description\":\n\t\t\t\t\t\t\t\tdocument.getElementById(\"divGenInfo\").className  = \"affiche\";\n\t\t\t\t\t\t\t\tdocument.getElementById(\"divImgDim\").className = \"affiche\";\n\t\t\t\t\t\t\t\tdocument.getElementById(\"divDtstFrm\").className = \"affiche\";\n\t\t\t\t\t\t\t\tdocument.getElementById(\"divSources\").className = \"masque\";\n\t\t\t\t\t\t\t\tdocument.getElementById(\"divCRS\").className = \"masque\";\n\t\t\t\t\t\t\t\tdocument.getElementById(\"divGEO\").className = \"masque\";\n\t\t\t\t\t\t\t\tdocument.getElementById(\"divProd\").className = \"affiche\";\n\t\t\t\t\t\t\t\tdocument.getElementById(\"divQuicklook\").className  = \"masque\";\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\t\t\t\tcase \"quicklook\":\n\t\t\t\t\t\t\t\tdocument.getElementById(\"divGenInfo\").className  = \"masque\";\n\t\t\t\t\t\t\t\tdocument.getElementById(\"divImgDim\").className = \"masque\";\n\t\t\t\t\t\t\t\tdocument.getElementById(\"divDtstFrm\").className = \"masque\";\n\t\t\t\t\t\t\t\tdocument.getElementById(\"divSources\").className = \"masque\";\n\t\t\t\t\t\t\t\tdocument.getElementById(\"divCRS\").className = \"masque\";\n\t\t\t\t\t\t\t\tdocument.getElementById(\"divGEO\").className = \"masque\";\n\t\t\t\t\t\t\t\tdocument.getElementById(\"divProd\").className = \"masque\";\n\t\t\t\t\t\t\t\tdocument.getElementById(\"divQuicklook\").className  = \"affiche\";\n\t\t\t\t\t\t\t\tupdateROIs();\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\n\t\t\t\t\t\t\tcase \"lineage\":\n\t\t\t\t\t\t\t\tdocument.getElementById(\"divGenInfo\").className  = \"masque\";\n\t\t\t\t\t\t\t\tdocument.getElementById(\"divImgDim\").className = \"masque\";\n\t\t\t\t\t\t\t\tdocument.getElementById(\"divDtstFrm\").className = \"masque\";\n\t\t\t\t\t\t\t\tdocument.getElementById(\"divCRS\").className = \"masque\";\n\t\t\t\t\t\t\t\tdocument.getElementById(\"divGEO\").className = \"masque\";\n\t\t\t\t\t\t\t\tdocument.getElementById(\"divQuicklook\").className  = \"masque\";\n\t\t\t\t\t\t\t\tdocument.getElementById(\"divProd\").className = \"affiche\";\n\t\t\t\t\t\t\t\tdocument.getElementById(\"divSources\").className = \"affiche\";\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\n\t\t\t\t\t\t\tcase \"crs\":\n\t\t\t\t\t\t\t\tdocument.getElementById(\"divGenInfo\").className  = \"masque\";\n\t\t\t\t\t\t\t\tdocument.getElementById(\"divImgDim\").className = \"masque\";\n\t\t\t\t\t\t\t\tdocument.getElementById(\"divDtstFrm\").className = \"masque\";\n\t\t\t\t\t\t\t\tdocument.getElementById(\"divSources\").className = \"masque\";\n\t\t\t\t\t\t\t\tdocument.getElementById(\"divCRS\").className = \"affiche\";\n\t\t\t\t\t\t\t\tdocument.getElementById(\"divGEO\").className = \"affiche\";\n\t\t\t\t\t\t\t\tdocument.getElementById(\"divProd\").className = \"masque\";\n\t\t\t\t\t\t\t\tdocument.getElementById(\"divQuicklook\").className  = \"masque\";\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\n\t\t\t\t\t\t\tcase \"globalinfo\":\n\t\t\t\t\t\t\t\tdocument.getElementById(\"divGenInfo\").className  = \"affiche\";\n\t\t\t\t\t\t\t\tdocument.getElementById(\"divImgDim\").className = \"affiche\";\n\t\t\t\t\t\t\t\tdocument.getElementById(\"divDtstFrm\").className = \"affiche\";\n\t\t\t\t\t\t\t\tdocument.getElementById(\"divSources\").className = \"affiche\";\n\t\t\t\t\t\t\t\tdocument.getElementById(\"divCRS\").className = \"affiche\";\n\t\t\t\t\t\t\t\tdocument.getElementById(\"divGEO\").className = \"affiche\";\n\t\t\t\t\t\t\t\tdocument.getElementById(\"divProd\").className = \"affiche\";\n\t\t\t\t\t\t\t\tdocument.getElementById(\"divQuicklook\").className  = \"affiche\";\n\t\t\t\t\t\t\t\tupdateROIs();\t\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t\treleaseFunc(strPreviousOn);\n\t\t\t\t\t\tselectFunc(strMode);\n\t\t\t\t\t\t\n\t\t\t\t\t\tupdateROIQc();\n\t\t\t\t\t}\t\t\t\t\n\t\t\t\t\n\t\t\t\t\tfunction updateROIs() {\n\t\t\t\t\t\tx = 0;\n\t\t\t\t\t\ty = 0;\n\t\t\t\t\t\tobj = document.getElementById(\"imgQl\");\n\t\t\t\t\t\twhile (obj.offsetParent != null) {\n\t\t\t\t\t\t\tx += obj.offsetLeft;\n\t\t\t\t\t\t\ty += obj.offsetTop;\n\t\t\t\t\t\t\tobj = obj.offsetParent;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tx += obj.offsetLeft;\n\t\t\t\t\t\ty += obj.offsetTop;\n\t\t\t\t\t\t\n\t\t\t\t\t\t// Taille de la scene d'origine\n\t\t\t\t\t\tcalcSceneSize();\n\t\t\t\t\n\t\t\t\t\t\t// Calcul de la position et de la taille de l'emprise sur le quicklook\t\t\n\t\t\t\t\t\t<xsl:for-each select=\"//Regions_Of_Interest/Region_Of_Interest\">\n\t\t\t\t\t\t\troi = roi<xsl:value-of select=\"position()\"/>;\n\t\t\t\t\t\t\troi.style.position = \"absolute\";\n\t\t\t\t\t\t\troi.className = \"ROIshow\";\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\troi.style.left =  x + <xsl:value-of select=\"COL_MIN\"/> * imgQl.width / frame_w + 1;\n\t\t\t\t\t\t\troi.style.top =  y + <xsl:value-of select=\"ROW_MIN\"/> * imgQl.height / frame_h + 1; \n\t\t\t\t\t\t\troi.style.width = (<xsl:value-of select=\"COL_MAX\"/> - <xsl:value-of select=\"COL_MIN\"/>) * imgQl.width / frame_w + 1;\n\t\t\t\t\t\t\troi.style.height = (<xsl:value-of select=\"ROW_MAX\"/> - <xsl:value-of select=\"ROW_MIN\"/>) * imgQl.height / frame_h + 1;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t</xsl:for-each> \n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tfunction updateROIQc() {\t\n\t\t\t\t\t\tx = 0;\n\t\t\t\t\t\ty = 0;\n\t\t\t\t\t\tobj = document.getElementById(\"imgQc\");\n\t\t\t\t\t\t\n\t\t\t\t\t\twhile (obj.offsetParent != null) {\n\t\t\t\t\t\t\tx += obj.offsetLeft;\n\t\t\t\t\t\t\ty += obj.offsetTop;\n\t\t\t\t\t\t\tobj = obj.offsetParent;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tx += obj.offsetLeft;\n\t\t\t\t\t\ty += obj.offsetTop;\n\t\t\t\t\n\t\t\t\t\t\t// Taille de la scene d'origine\n\t\t\t\t\t\tcalcSceneSize();\n\t\t\t\t\t\t\n\t\t\t\t\t\t// Gestion de la marge autour de l'icone\n\t\t\t\t\t\tvar imaQl = new Image();\n\t\t\t\t\t\timaQl.src =  \"preview.jpg\";\n\t\t\t\t\t\thQC = 128 * imaQl.height / 1000;\n\t\t\t\t\t\t\n\t\t\t\t\t\t// Calcul de la position et de la taille de l'emprise sur l'icone\t\t\n\t\t\t\t\t\t<xsl:for-each select=\"//Regions_Of_Interest/Region_Of_Interest\">\n\t\t\t\t\t\t\troi = qcroi<xsl:value-of select=\"position()\"/>;\n\t\t\t\t\t\t\troi.style.position = \"absolute\";\n\t\t\t\t\t\t\troi.className = \"ROIshow\";\n\t\t\t\t\t\t\n\t\t\t\t\t\t\troi.style.left =  x + <xsl:value-of select=\"COL_MIN\"/> * imgQc.width / frame_w + 1;\n\t\t\t\t\t\t\troi.style.top =  (y + <xsl:value-of select=\"ROW_MIN\"/> * imgQc.height / frame_h) + ((imgQc.height - hQC) / 2) + 1; \n\t\t\t\t\t\t\troi.style.width = (<xsl:value-of select=\"COL_MAX\"/> - <xsl:value-of select=\"COL_MIN\"/>) * imgQc.width / frame_w + 1;\n\t\t\t\t\t\t\troi.style.height = (<xsl:value-of select=\"ROW_MAX\"/> - <xsl:value-of select=\"ROW_MIN\"/>) * imgQc.height * imaQl.height / 1000 / frame_h + 1;\n\t\t\t\t\t\t</xsl:for-each> \n\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t</script>\n\t\t\t</head>\n\t\n\t\t\t<body bgcolor=\"#e4decb\" onload=\"organize('description')\" onresize=\"onWindowResize()\">\n\t\t\t\t<div align=\"center\">\n\t\t\t\t\t<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" id=\"tblOnglets\" width=\"80%\">\n\t\t\t\t\t\t<tr height=\"20\">\n\t\t\t\t\t\t\t<td width=\"100\" border=\"1\" height=\"20\" id=\"tdO_description\">\n\t\t\t\t\t\t\t\t<div id=\"divO_description\" class=\"ongletsOn\">\n\t\t\t\t\t\t\t\t\t<a id=\"aO_description\" class=\"ongletsOn\" href=\"javascript:organize('description')\">Description</a>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t<td width=\"10\" border=\"1\" height=\"20\"></td>\n\t\t\t\t\t\t\t<td width=\"100\" height=\"20\" id=\"tdO_lineage\" class=\"onglets\">\n\t\t\t\t\t\t\t\t<div id=\"divO_lineage\" class=\"onglets\">\n\t\t\t\t\t\t\t\t\t<a id=\"aO_lineage\" class=\"onglets\" href=\"javascript:organize('lineage')\">Lineage</a>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t<td width=\"10\" height=\"20\"></td>\n\t\t\t\t\t\t\t<td width=\"140\" height=\"20\" id=\"tdO_crs\" class=\"onglets\">\n\t\t\t\t\t\t\t\t<div id=\"divO_crs\" class=\"onglets\">\n\t\t\t\t\t\t\t\t\t<a id=\"aO_crs\" class=\"onglets\" href=\"javascript:organize('crs')\">Coordinate System</a>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t<td width=\"10\" height=\"20\"></td>\n\t\t\t\t\t\t\t<td width=\"100\" height=\"20\" id=\"tdO_quicklook\" class=\"onglets\">\n\t\t\t\t\t\t\t\t<div id=\"divO_quicklook\" class=\"onglets\">\n\t\t\t\t\t\t\t\t\t<a id=\"aO_quicklook\" class=\"onglets\" href=\"javascript:organize('quicklook')\">Quicklook</a>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t<td width=\"40\" height=\"20\"></td>\n\t\t\t\t\t\t\t<td width=\"150\" height=\"20\" id=\"tdO_globalinfo\" class=\"onglets\">\n\t\t\t\t\t\t\t\t<div id=\"divO_globalinfo\" class=\"onglets\">\n\t\t\t\t\t\t\t\t\t<a id=\"aO_globalinfo\" class=\"onglets\" href=\"javascript:organize('globalinfo')\">Printable information</a>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t<td width=\"10\" height=\"20\"></td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr height=\"5\"></tr>\n\t\t\t\t\t</table>\n\t\t\t\t</div>\n\t\t\t\t<div align=\"center\">\n\t\t\t\t\t<table border=\"3\" bordercolor=\"black\" cellpadding=\"0\" cellspacing=\"0\" width=\"80%\">\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\">\n\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\">\n\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<td width=\"120\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div align=\"center\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a target=\"_blank\" title=\"quicklook\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:attribute name=\"href\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"//DATASET_QL_PATH/@href\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</xsl:attribute>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img border=\"0\" id=\"imgQc\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:attribute name=\"src\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"//DATASET_TN_PATH/@href\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</xsl:attribute>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</img>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:for-each select=\"//Regions_Of_Interest/Region_Of_Interest\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"masque\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:attribute name=\"id\">qcroi<xsl:value-of select=\"position()\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</xsl:attribute>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<table class=\"ROI\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\" width=\"100%\" height=\"100%\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:attribute name=\"title\">ROI <xsl:value-of select=\"position()\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</xsl:attribute>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</xsl:for-each>\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<td width=\"80%\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<table border=\"0\" cellpadding=\"2\" cellspacing=\"5\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:if test=\"//GEOMETRIC_PROCESSING\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td width=\"8\"></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td bgcolor=\"#00607a\" width=\"70\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"intitule2\"> Type</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td width=\"20\"></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"intitule\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"//Production/PRODUCT_INFO\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</xsl:if>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:if test=\"//DATASET_NAME\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td width=\"8\"></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td bgcolor=\"#00607a\" width=\"70\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"intitule2\"> Layer</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td width=\"20\"></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"intitule\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"//Dataset_Id/DATASET_NAME\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</xsl:if>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:if test=\"//METADATA_FORMAT\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td width=\"8\"></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td bgcolor=\"#00607a\" width=\"70\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"intitule2\"> Format</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td width=\"20\"></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"intitule\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"//Metadata_Id/METADATA_FORMAT\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</xsl:if>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:if test=\"//DATA_FILE_FORMAT\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td width=\"8\"></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td bgcolor=\"#00607a\" width=\"70\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"intitule2\"> Raster</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td width=\"20\"></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"intitule\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"//Data_Access/DATA_FILE_FORMAT\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</xsl:if>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div align=\"right\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img WIDTH=\"120\" src=\"../LOGO.JPG\" border=\"0\" align=\"middle\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</table>\n\t\t\t\n\t\t\t\t\t<br/>\n\t\t\t\t\t<div id=\"divGenInfo\" class=\"affiche\">\n\t\t\t\t\t\t<table border=\"3\" bordercolor=\"#A9AB87\" cellpadding=\"0\" cellspacing=\"0\" width=\"80%\" bgcolor=\"#eeeeee\">\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td valign=\"middle\" align=\"center\">\n\t\t\t\t\t\t\t\t\t<br/>\n\t\t\t\t\t\t\t\t\t<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"95%\">\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td valign=\"top\">\n\t\t\t\t\t\t\t\t\t\t\t\t<table border=\"0\" cellpadding=\"0\" cellspacing=\"2\" width=\"100%\" bgcolor=\"#A9AB87\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"entete\">General Information</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t\t\t\t\t<br/>\n\t\t\t\t\t\t\t\t\t\t\t\t<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td valign=\"top\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"intitule\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<b>Map Name</b>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"description\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"//Dataset_Id/DATASET_NAME\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<br/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<br/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:if test=\"//GEOMETRIC_PROCESSING\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td valign=\"top\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"intitule\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<b>Geometric Processing Level</b>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"description\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"//GEOMETRIC_PROCESSING\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<br/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<br/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</xsl:if>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:if test=\"//RADIOMETRIC_PROCESSING\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td valign=\"top\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"intitule\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<b>Radiometric Processing Level</b>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"description\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"//RADIOMETRIC_PROCESSING\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<br/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<br/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</xsl:if>\n\t\t\t\t\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t\t<br/>\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t</div>\t<!-- /GenInfo -->\n\t\t\n\t\t\t\t\t<a name=\"description\"></a>\n\t\t\t\t\t<div id=\"divImgDim\" class=\"affiche\">\n\t\t\t\t\t\t<br/>\n\t\t\t\t\t\t<xsl:if test=\"//Raster_Dimensions\">\n\t\t\t\t\t\t\t<table border=\"3\" bordercolor=\"#A9AB87\" cellpadding=\"0\" cellspacing=\"0\" width=\"80%\" bgcolor=\"#eeeeee\">\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<td valign=\"middle\" align=\"center\">\n\t\t\t\t\t\t\t\t\t\t<br/>\n\t\t\t\t\t\t\t\t\t\t<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"95%\">\n\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t<td valign=\"top\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<table border=\"0\" cellpadding=\"0\" cellspacing=\"2\" width=\"100%\" bgcolor=\"#A9AB87\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"entete\">Image dimensions</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<br/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<table border=\"0\" cellpadding=\"0\" cellspacing=\"5\" width=\"100%\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:if test=\"//NCOLS\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td valign=\"top\" width=\"300\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"intitule\">Number of columns</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"description\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"//NCOLS\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</xsl:if>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:if test=\"//NROWS\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td valign=\"top\" width=\"300\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"intitule\">Number of rows</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"description\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"//NROWS\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</xsl:if>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:if test=\"//NBANDS\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td valign=\"top\" width=\"300\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"intitule\">Number of spectral bands</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"description\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"//NBANDS\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</xsl:if>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t\t\t<br/>\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t</xsl:if>\n\t\t\t\t\t</div> <!-- /divImgDim -->\n\t\t\n\t\t\t\t\t<a name=\"sourceinfo\"></a>\n\t\t\t\t\t<div id=\"divDtstFrm\" class=\"affiche\">\n\t\t\t\t\t\t<xsl:if test=\"//Dataset_Frame\">\n\t\t\t\t\t\t\t<br/>\n\t\t\t\t\t\t\t<table border=\"3\" bordercolor=\"#A9AB87\" cellpadding=\"0\" cellspacing=\"0\" width=\"80%\" bgcolor=\"#eeeeee\">\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<td valign=\"middle\" align=\"center\">\n\t\t\t\t\t\t\t\t\t\t<br/>\n\t\t\t\t\t\t\t\t\t\t<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"95%\">\n\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t<td valign=\"top\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<table border=\"0\" cellpadding=\"0\" cellspacing=\"2\" width=\"100%\" bgcolor=\"#A9AB87\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"entete\">Dataset framing</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<br/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<table border=\"0\" cellpadding=\"0\" cellspacing=\"2\" width=\"100%\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td valign=\"top\" width=\"33%\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"intitule\">Vertice</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td valign=\"top\" width=\"33%\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"description\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"intitule\">Longitude </span>(DEG)</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"description\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"intitule\">Latitude </span>(DEG)</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"description\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"intitule\">Row </span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"description\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"intitule\">Col </span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<br/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:for-each select=\"//Dataset_Frame/Vertex\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td valign=\"top\" width=\"33%\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"description\">#<xsl:value-of select=\"position()\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td valign=\"top\" width=\"33%\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"description\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"FRAME_LON\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"description\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"FRAME_LAT\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"description\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"FRAME_ROW\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"description\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"FRAME_COL\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</xsl:for-each>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:if test=\"//Regions_Of_Interest\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<table border=\"0\" cellpadding=\"0\" cellspacing=\"2\" width=\"100%\" bgcolor=\"#A9AB87\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"entete\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<b>Scene extracts</b>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<table border=\"0\" cellpadding=\"0\" cellspacing=\"2\" width=\"100%\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td valign=\"top\" width=\"33%\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"intitule\">Region Of Interest</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td valign=\"top\" width=\"33%\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"description\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"intitule\">Upper Left</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"description\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"intitule\">Lower Right </span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:for-each select=\"//Regions_Of_Interest/Region_Of_Interest\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td valign=\"top\" width=\"33%\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"description\">#<xsl:value-of select=\"position()\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td valign=\"top\" width=\"33%\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"description\">Row: <xsl:value-of select=\"ROW_MIN\"/>, Col: <xsl:value-of select=\"COL_MIN\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"description\">Row: <xsl:value-of select=\"ROW_MAX\"/>, Col: <xsl:value-of select=\"COL_MAX\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</xsl:for-each>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</xsl:if>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t\t\t<br/>\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t</xsl:if>\n\t\t\t\t\t</div> <!-- /divDtstFrm -->\n\t\t\n\t\t\t\t\t<div id=\"divSources\" class=\"masque\">\n\t\t\t\t\t\t<br/>\n\t\t\t\t\t\t<table border=\"3\" bordercolor=\"#A9AB87\" cellpadding=\"0\" cellspacing=\"0\" width=\"80%\" bgcolor=\"#eeeeee\">\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td valign=\"middle\" align=\"center\">\n\t\t\t\t\t\t\t\t\t<br/>\n\t\t\t\t\t\t\t\t\t<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"95%\">\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td valign=\"top\">\n\t\t\t\t\t\t\t\t\t\t\t\t<table border=\"0\" cellpadding=\"0\" cellspacing=\"2\" width=\"100%\" bgcolor=\"#A9AB87\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"entete\">Dataset sources</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t\t\t\t\t<br/>\n\t\t\t\t\t\t\t\t\t\t\t\t<table border=\"0\" cellpadding=\"0\" cellspacing=\"5\" width=\"100%\">\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:for-each select=\"//Source_Information\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td valign=\"top\" width=\"50\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"intitule\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a title=\"show / hide details\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:attribute name=\"href\">javascript:details(\"div<xsl:value-of select=\"generate-id()\"/>\")</xsl:attribute>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"Scene_Source/MISSION\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td class=\"description\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"SOURCE_ID\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td valign=\"top\"></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"masque\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:attribute name=\"id\">div<xsl:value-of select=\"generate-id()\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</xsl:attribute>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<table border=\"0\" cellspacing=\"5\" width=\"100%\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr valign=\"top\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td width=\"200\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<table border=\"0\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td class=\"intitule\" width=\"50\">ID</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td class=\"description\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"SOURCE_ID\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td class=\"intitule\" width=\"50\">K_J</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td class=\"description\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"Scene_Source/GRID_REFERENCE\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td class=\"intitule\" width=\"50\">SAT</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td class=\"description\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"Scene_Source/SHIFT_VALUE\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td class=\"intitule\" width=\"50\">DATE</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td class=\"description\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"Scene_Source/IMAGING_DATE\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td class=\"intitule\" width=\"50\">TIME</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td class=\"description\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"Scene_Source/IMAGING_TIME\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td class=\"intitule\" width=\"65\">INSTRUMENT</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td class=\"description\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"Scene_Source/INSTRUMENT\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"//Source_Information/Scene_Source/INSTRUMENT_INDEX\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td class=\"intitule\" width=\"65\">SENSOR</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td class=\"description\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"Scene_Source/SENSOR_CODE\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td class=\"intitule\" width=\"65\">INCIDENCE_ANGLE</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td class=\"description\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"Scene_Source/INCIDENCE_ANGLE\"/> (<xsl:value-of select=\"Scene_Source/INCIDENCE_ANGLE/@unit\"/>)</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td class=\"intitule\" width=\"65\">VIEWING_ANGLE</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td class=\"description\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"Scene_Source/VIEWING_ANGLE\"/> (<xsl:value-of select=\"Scene_Source/INCIDENCE_ANGLE/@unit\"/>)</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td class=\"intitule\" width=\"65\">SUN_AZIMUTH</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td class=\"description\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"Scene_Source/SUN_AZIMUTH\"/> (<xsl:value-of select=\"Scene_Source/INCIDENCE_ANGLE/@unit\"/>)</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td class=\"intitule\" width=\"65\">SUN_ELEVATION</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td class=\"description\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"Scene_Source/SUN_ELEVATION\"/> (<xsl:value-of select=\"Scene_Source/INCIDENCE_ANGLE/@unit\"/>)</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td width=\"250\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<table border=\"0\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td class=\"intitule\" width=\"65\">BAND DESCRIPTION</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td class=\"description\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:for-each select=\"//Spectral_Band_Info\">BAND <xsl:value-of select=\"BAND_INDEX\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<BR/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<FONT FACE=\"Trebuchet MS\" STYLE=\"font-size: 8 pt;\">\n\t  \t    \t\t\t\t\t\t\t\t\t\t\t\t\t\tType : <xsl:value-of select=\"BAND_DESCRIPTION\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<BR/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:if test=\"//Spectral_Band_Info/PHYSICAL_UNIT\">\n\t  \t      \t\t\t\t\t\t\t\t\t\t\t\t\t\t\tUnit : <xsl:value-of select=\"PHYSICAL_UNIT\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<BR/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</xsl:if>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:if test=\"//Spectral_Band_Info/PHYSICAL_GAIN\">\n\t  \t    \t\t\t\t\t\t\t\t\t\t\t\t\t  Gain : <xsl:value-of select=\"PHYSICAL_GAIN\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<BR/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</xsl:if>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:if test=\"//Spectral_Band_Info/PHYSICAL_BIAS\">\n\t  \t      \t\t\t\t\t\t\t\t\t\t\t\tBias : <xsl:value-of select=\"PHYSICAL_BIAS\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<BR/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</xsl:if>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</FONT>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</xsl:for-each>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</xsl:for-each>\n\t\t\t\t\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t\t<br/>\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t</div> <!-- /divSources -->\n\t\t\t\n\t\t\t\t\t<div id=\"divCRS\" class=\"masque\">\n\t\t\t\t\t\t<br/>\n\t\t\t\t\t\t<table border=\"3\" bordercolor=\"#A9AB87\" cellpadding=\"0\" cellspacing=\"0\" width=\"80%\" bgcolor=\"#eeeeee\">\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td valign=\"middle\" align=\"center\">\n\t\t\t\t\t\t\t\t\t<br/>\n\t\t\t\t\t\t\t\t\t<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"95%\">\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td valign=\"top\">\n\t\t\t\t\t\t\t\t\t\t\t\t<table border=\"0\" cellpadding=\"0\" cellspacing=\"2\" width=\"100%\" bgcolor=\"#A9AB87\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"entete\">Coordinate Reference System</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t\t\t\t\t<br/>\n\t\t\t\t\t\t\t\t\t\t\t\t<table border=\"0\" cellpadding=\"0\" cellspacing=\"5\" width=\"100%\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td valign=\"top\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"intitule\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<font color=\"#A9AB87\">Horizontal Coordinate System</font>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:if test=\"//GEO_TABLES\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td valign=\"top\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"intitule\">Geocoding tables identification</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"description\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"//GEO_TABLES\"/>(<xsl:value-of select=\"//GEO_TABLES/@version\"/>)</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</xsl:if>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:if test=\"//HORIZONTAL_CS_TYPE\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td valign=\"top\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"intitule\">Horizontal Coordinate System type</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"description\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"//HORIZONTAL_CS_TYPE\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</xsl:if>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:if test=\"//HORIZONTAL_CS_NAME\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td valign=\"top\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"intitule\">Horizontal coordinate system identification name</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"description\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"//HORIZONTAL_CS_NAME\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</xsl:if>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td valign=\"top\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"intitule\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<font color=\"#A9AB87\">Geographic Coordinate System</font>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"description\"></p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:if test=\"//GEOGRAPHIC_CS_NAME\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td valign=\"top\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"intitule\">Geographic Coordinate System</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"description\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"//GEOGRAPHIC_CS_NAME\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</xsl:if>\n\t\t\t\t\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t\t<br/>\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t</div> <!-- /divCRS -->\n\t\t\t\n\t\t\t\t\t<div id=\"divGEO\" class=\"masque\">\n\t\t\t\t\t\t<br/>\n\t\t\t\t\t\t<xsl:if test=\"//ULXMAP\">\n\t\t\t\n\t\t\t\t\t\t\t<table border=\"3\" bordercolor=\"#A9AB87\" cellpadding=\"0\" cellspacing=\"0\" width=\"80%\" bgcolor=\"#eeeeee\">\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<td valign=\"middle\" align=\"center\">\n\t\t\t\t\t\t\t\t\t\t<br/>\n\t\t\t\t\t\t\t\t\t\t<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"95%\">\n\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t<td valign=\"top\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<table border=\"0\" cellpadding=\"0\" cellspacing=\"2\" width=\"100%\" bgcolor=\"#A9AB87\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"entete\">Geoposition</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<br/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<table border=\"0\" cellpadding=\"0\" cellspacing=\"5\" width=\"100%\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:if test=\"//ULXMAP\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td valign=\"top\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"intitule\">Upper - Left Map X Coordinate</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"description\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"//ULXMAP\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"//ULXMAP/@unit\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</xsl:if>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:if test=\"//ULYMAP\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td valign=\"top\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"intitule\">Upper - Left Map Y Coordinate</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"description\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"//ULYMAP\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"//ULXMAP/@unit\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</xsl:if>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:if test=\"//XDIM\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td valign=\"top\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"intitule\">Image sampling</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"description\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"//XDIM\"/> x <xsl:value-of select=\"//YDIM\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</xsl:if>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t\t\t<br/>\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t</xsl:if>\n\t\t\t\t\t</div> <!-- /divGEO -->\n\t\t\t\n\t\t\t\t\t<div id=\"divProd\" class=\"affiche\">\n\t\t\t\t\t\t<br/>\n\t\t\t\t\t\t<xsl:if test=\"//Production\">\n\t\t\t\t\t\t\t<table border=\"3\" bordercolor=\"#A9AB87\" cellpadding=\"0\" cellspacing=\"0\" width=\"80%\" bgcolor=\"#eeeeee\">\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<td valign=\"middle\" align=\"center\">\n\t\t\t\t\t\t\t\t\t\t<br/>\n\t\t\t\t\t\t\t\t\t\t<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"95%\">\n\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t<td valign=\"top\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<table border=\"0\" cellpadding=\"0\" cellspacing=\"2\" width=\"100%\" bgcolor=\"#A9AB87\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"entete\">Production</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<br/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<table border=\"0\" cellpadding=\"0\" cellspacing=\"5\" width=\"100%\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:if test=\"//DATASET_PRODUCTION_DATE\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td valign=\"top\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"intitule\">Production Date</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"description\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"//DATASET_PRODUCTION_DATE\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</xsl:if>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:if test=\"//JOB_ID\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td valign=\"top\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"intitule\">Job identification</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"description\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"//JOB_ID\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<br/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</xsl:if>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:if test=\"//PRODUCT_TYPE\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td valign=\"top\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"intitule\">Product type identification</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"description\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"//PRODUCT_TYPE\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<br/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</xsl:if>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:if test=\"//DATASET_PRODUCER_NAME\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td valign=\"top\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"intitule\">Dataset Producer Identification</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"description\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"//DATASET_PRODUCER_NAME\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</xsl:if>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:if test=\"//DATASET_PRODUCER_URL\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td valign=\"top\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"intitule\">Producer link</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"description\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a target=\"_blank\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:attribute name=\"href\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"//DATASET_PRODUCER_URL/@href\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</xsl:attribute>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"//DATASET_PRODUCER_URL/@href\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</xsl:if>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t\t\t<br/>\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t</xsl:if>\n\t\t\t\t\t</div>\n\t\t\t\t\t<a name=\"quicklook\"></a>\n\t\t\t\t\t<div id=\"divQuicklook\" class=\"masque\">\n\t\t\t\t\t\t<br/>\n\t\t\t\t\t\t<xsl:if test=\"//DATASET_QL_PATH/@href\">\n\t\t\t\t\t\t\t<table border=\"3\" bordercolor=\"#A9AB87\" cellpadding=\"0\" cellspacing=\"0\" width=\"80%\" bgcolor=\"#eeeeee\">\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<td valign=\"middle\" align=\"center\">\n\t\t\t\t\t\t\t\t\t\t<br/>\n\t\t\t\t\t\t\t\t\t\t<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"95%\">\n\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t<td valign=\"top\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div align=\"center\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<table border=\"0\" cellpadding=\"0\" cellspacing=\"2\" width=\"100%\" bgcolor=\"#A9AB87\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"entete\">Quicklook</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<br/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img id=\"imgQl\" width=\"500\" height=\"500\" border=\"0\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:attribute name=\"src\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"//DATASET_QL_PATH/@href\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</xsl:attribute>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</img>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:for-each select=\"//Regions_Of_Interest/Region_Of_Interest\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"affiche\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:attribute name=\"id\">roi<xsl:value-of select=\"position()\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</xsl:attribute>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:attribute name=\"title\">ROI <xsl:value-of select=\"position()\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</xsl:attribute>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<table class=\"ROI\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\" width=\"100%\" height=\"100%\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xsl:attribute name=\"title\">ROI <xsl:value-of select=\"position()\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</xsl:attribute>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</xsl:for-each>\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t\t\t<br/>\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t</xsl:if>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</body>\n\t\t</html>\n\t</xsl:template>\n</xsl:stylesheet>\n"
  },
  {
    "path": "src/asp/Camera/tests/wv_mvp_1.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<isd>\n\t<IMD>\n\t\t<VERSION>24.06</VERSION>\n\t\t<GENERATIONTIME>2014-06-25T14:20:17.000000Z</GENERATIONTIME>\n\t\t<PRODUCTORDERID>053644866010_01_P001</PRODUCTORDERID>\n\t\t<PRODUCTCATALOGID>A03001011C7F3F00</PRODUCTCATALOGID>\n\t\t<CHILDCATALOGID>210001011C7F4600</CHILDCATALOGID>\n\t\t<IMAGEDESCRIPTOR>Stereo1B</IMAGEDESCRIPTOR>\n\t\t<BANDID>P</BANDID>\n\t\t<PANSHARPENALGORITHM>None</PANSHARPENALGORITHM>\n\t\t<NUMROWS>27968</NUMROWS>\n\t\t<NUMCOLUMNS>32837</NUMCOLUMNS>\n\t\t<PRODUCTLEVEL>Stereo 1B</PRODUCTLEVEL>\n\t\t<PRODUCTTYPE>Stereo</PRODUCTTYPE>\n\t\t<NUMBEROFLOOKS>2</NUMBEROFLOOKS>\n\t\t<RADIOMETRICLEVEL>Corrected</RADIOMETRICLEVEL>\n\t\t<BITSPERPIXEL>16</BITSPERPIXEL>\n\t\t<COMPRESSIONTYPE>None</COMPRESSIONTYPE>\n\t\t<OUTPUTFORMAT>GeoTIFF</OUTPUTFORMAT>\n\t\t<BAND_P>\n\t\t\t<ULLON>-1.162554465500000e+02</ULLON>\n\t\t\t<ULLAT>3.525504589000000e+01</ULLAT>\n\t\t\t<ULHAE>6.763099999999999e+02</ULHAE>\n\t\t\t<URLON>-1.160751748600000e+02</URLON>\n\t\t\t<URLAT>3.525505030000000e+01</URLAT>\n\t\t\t<URHAE>2.530800000000000e+02</URHAE>\n\t\t\t<LRLON>-1.160752699600000e+02</LRLON>\n\t\t\t<LRLAT>3.512911635000000e+01</LRLAT>\n\t\t\t<LRHAE>2.535400000000000e+02</LRHAE>\n\t\t\t<LLLON>-1.162554614000000e+02</LLLON>\n\t\t\t<LLLAT>3.512883153000000e+01</LLLAT>\n\t\t\t<LLHAE>3.159700000000000e+02</LLHAE>\n\t\t\t<ABSCALFACTOR>5.678345000000000e-02</ABSCALFACTOR>\n\t\t\t<EFFECTIVEBANDWIDTH>2.846000000000000e-01</EFFECTIVEBANDWIDTH>\n\t\t\t<TDILEVEL>32</TDILEVEL>\n\t\t</BAND_P>\n\t\t<IMAGE>\n\t\t\t<SATID>WV02</SATID>\n\t\t\t<MODE>FullSwath</MODE>\n\t\t\t<SCANDIRECTION>Forward</SCANDIRECTION>\n\t\t\t<CATID>1030010033C4AA00</CATID>\n\t\t\t<TLCTIME>2014-06-19T18:52:50.787577Z</TLCTIME>\n\t\t\t<NUMTLC>2</NUMTLC>\n\t\t\t<TLCLISTList>\n\t\t\t\t<TLCLIST>0.000000000000000e+00 0.000000000000000e+00</TLCLIST>\n\t\t\t\t<TLCLIST>3.804000000000000e+04 2.037800000000000e+00</TLCLIST>\n\t\t\t</TLCLISTList>\n\t\t\t<FIRSTLINETIME>2014-06-19T18:52:50.787577Z</FIRSTLINETIME>\n\t\t\t<AVGLINERATE>1.866719000000000e+04</AVGLINERATE>\n\t\t\t<EXPOSUREDURATION>1.714240000000000e-03</EXPOSUREDURATION>\n\t\t\t<MINCOLLECTEDROWGSD>4.660000000000000e-01</MINCOLLECTEDROWGSD>\n\t\t\t<MAXCOLLECTEDROWGSD>4.670000000000000e-01</MAXCOLLECTEDROWGSD>\n\t\t\t<MEANCOLLECTEDROWGSD>4.660000000000000e-01</MEANCOLLECTEDROWGSD>\n\t\t\t<MINCOLLECTEDCOLGSD>4.650000000000000e-01</MINCOLLECTEDCOLGSD>\n\t\t\t<MAXCOLLECTEDCOLGSD>4.650000000000000e-01</MAXCOLLECTEDCOLGSD>\n\t\t\t<MEANCOLLECTEDCOLGSD>4.650000000000000e-01</MEANCOLLECTEDCOLGSD>\n\t\t\t<MEANCOLLECTEDGSD>4.660000000000000e-01</MEANCOLLECTEDGSD>\n\t\t\t<MEANPRODUCTROWGSD>5.020000000000000e-01</MEANPRODUCTROWGSD>\n\t\t\t<MEANPRODUCTCOLGSD>5.000000000000000e-01</MEANPRODUCTCOLGSD>\n\t\t\t<MEANPRODUCTGSD>5.010000000000000e-01</MEANPRODUCTGSD>\n\t\t\t<ROWUNCERTAINTY>2.610000000000000e+01</ROWUNCERTAINTY>\n\t\t\t<COLUNCERTAINTY>3.569000000000000e+01</COLUNCERTAINTY>\n\t\t\t<MINSUNAZ>1.313000000000000e+02</MINSUNAZ>\n\t\t\t<MAXSUNAZ>1.316000000000000e+02</MAXSUNAZ>\n\t\t\t<MEANSUNAZ>1.315000000000000e+02</MEANSUNAZ>\n\t\t\t<MINSUNEL>7.359999999999999e+01</MINSUNEL>\n\t\t\t<MAXSUNEL>7.370000000000000e+01</MAXSUNEL>\n\t\t\t<MEANSUNEL>7.359999999999999e+01</MEANSUNEL>\n\t\t\t<MINSATAZ>1.330000000000000e+01</MINSATAZ>\n\t\t\t<MAXSATAZ>1.330000000000000e+01</MAXSATAZ>\n\t\t\t<MEANSATAZ>1.330000000000000e+01</MEANSATAZ>\n\t\t\t<MINSATEL>8.430000000000000e+01</MINSATEL>\n\t\t\t<MAXSATEL>8.520000000000000e+01</MAXSATEL>\n\t\t\t<MEANSATEL>8.470000000000000e+01</MEANSATEL>\n\t\t\t<MININTRACKVIEWANGLE>4.700000000000000e+00</MININTRACKVIEWANGLE>\n\t\t\t<MAXINTRACKVIEWANGLE>5.000000000000000e+00</MAXINTRACKVIEWANGLE>\n\t\t\t<MEANINTRACKVIEWANGLE>4.800000000000000e+00</MEANINTRACKVIEWANGLE>\n\t\t\t<MINCROSSTRACKVIEWANGLE>1.000000000000000e-01</MINCROSSTRACKVIEWANGLE>\n\t\t\t<MAXCROSSTRACKVIEWANGLE>3.000000000000000e-01</MAXCROSSTRACKVIEWANGLE>\n\t\t\t<MEANCROSSTRACKVIEWANGLE>2.000000000000000e-01</MEANCROSSTRACKVIEWANGLE>\n\t\t\t<MINOFFNADIRVIEWANGLE>4.700000000000000e+00</MINOFFNADIRVIEWANGLE>\n\t\t\t<MAXOFFNADIRVIEWANGLE>5.000000000000000e+00</MAXOFFNADIRVIEWANGLE>\n\t\t\t<MEANOFFNADIRVIEWANGLE>4.900000000000000e+00</MEANOFFNADIRVIEWANGLE>\n\t\t\t<PNIIRS>5.000000000000000e+00</PNIIRS>\n\t\t\t<CLOUDCOVER>0.000000000000000e+00</CLOUDCOVER>\n\t\t\t<RESAMPLINGKERNEL>MTF</RESAMPLINGKERNEL>\n\t\t\t<POSITIONKNOWLEDGESRC>R</POSITIONKNOWLEDGESRC>\n\t\t\t<ATTITUDEKNOWLEDGESRC>R</ATTITUDEKNOWLEDGESRC>\n\t\t\t<REVNUMBER>24638</REVNUMBER>\n\t\t</IMAGE>\n\t</IMD>\n\t<EPH>\n\t\t<SATID>WV02</SATID>\n\t\t<REVNUMBER>24638</REVNUMBER>\n\t\t<STRIPID>33C4AA</STRIPID>\n\t\t<TYPE>R</TYPE>\n\t\t<VERSION>A</VERSION>\n\t\t<GENERATIONTIME>2014-06-19T19:36:03.928341Z</GENERATIONTIME>\n\t\t<STARTTIME>2014-06-19T18:52:38.618188Z</STARTTIME>\n\t\t<NUMPOINTS>1318</NUMPOINTS>\n\t\t<TIMEINTERVAL>2.000000000000000e-02</TIMEINTERVAL>\n\t\t<EPHEMLISTList>\n\t\t\t<EPHEMLIST>1.000000000000000e+00 -2.501284088727512e+06 -5.179361196363801e+06 4.232105768759722e+06 -3.498050054757736e+03 -3.155804343010818e+03 -5.912812374552461e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.000000000000000e+00 -2.501354048157866e+06 -5.179424310024158e+06 4.231987513703220e+06 -3.498004821490111e+03 -3.155681338939969e+03 -5.912905210778157e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.000000000000000e+00 -2.501424006693856e+06 -5.179487421235477e+06 4.231869256770491e+06 -3.497959586490515e+03 -3.155558333555282e+03 -5.912998044373550e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.000000000000000e+00 -2.501493964302861e+06 -5.179550529962895e+06 4.231750998023492e+06 -3.497914350861992e+03 -3.155435328579298e+03 -5.913090873784251e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.000000000000000e+00 -2.501563921009042e+06 -5.179613636232250e+06 4.231632737416313e+06 -3.497869113046653e+03 -3.155312322550371e+03 -5.913183700657540e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.000000000000000e+00 -2.501633876859643e+06 -5.179676740094082e+06 4.231514474859164e+06 -3.497823869997081e+03 -3.155189310126118e+03 -5.913276529616748e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.000000000000000e+00 -2.501703831744252e+06 -5.179739841430358e+06 4.231396210561797e+06 -3.497778629949320e+03 -3.155066303068306e+03 -5.913369349677382e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.000000000000000e+00 -2.501773785757412e+06 -5.179802940342179e+06 4.231277944344563e+06 -3.497733384903312e+03 -3.154943291883957e+03 -5.913462170418728e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.000000000000000e+00 -2.501843738915081e+06 -5.179866036846566e+06 4.231159676177171e+06 -3.497688136425244e+03 -3.154820273264127e+03 -5.913554992881437e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.000000000000000e+01 -2.501913691122336e+06 -5.179929130842127e+06 4.231041406239879e+06 -3.497642888226796e+03 -3.154697259078266e+03 -5.913647808408632e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.100000000000000e+01 -2.501983642426438e+06 -5.179992222379384e+06 4.230923134442892e+06 -3.497597637765275e+03 -3.154574244107434e+03 -5.913740621287292e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.200000000000000e+01 -2.502053592795950e+06 -5.180055311424733e+06 4.230804860845936e+06 -3.497552388045780e+03 -3.154451230952972e+03 -5.913833428464303e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.300000000000000e+01 -2.502123542293921e+06 -5.180118398045586e+06 4.230686585329202e+06 -3.497507134163355e+03 -3.154328213237061e+03 -5.913926236126090e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.400000000000000e+01 -2.502193490888627e+06 -5.180181482208060e+06 4.230568307952926e+06 -3.497461878114587e+03 -3.154205194456168e+03 -5.914019041246331e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.500000000000000e+01 -2.502263438580225e+06 -5.180244563912311e+06 4.230450028716818e+06 -3.497416621034365e+03 -3.154082173812067e+03 -5.914111843676718e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.600000000000000e+01 -2.502333385368574e+06 -5.180307643158228e+06 4.230331747621106e+06 -3.497371361481350e+03 -3.153959152338564e+03 -5.914204643594304e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.700000000000000e+01 -2.502403331285133e+06 -5.180370719979443e+06 4.230213464605982e+06 -3.497326097724753e+03 -3.153836126197256e+03 -5.914297444077311e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.800000000000000e+01 -2.502473276251084e+06 -5.180433794291732e+06 4.230095179821220e+06 -3.497280836042384e+03 -3.153713103632207e+03 -5.914390237163798e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.900000000000000e+01 -2.502543220297882e+06 -5.180496866128735e+06 4.229976893207015e+06 -3.497235572749318e+03 -3.153590082071639e+03 -5.914483026248529e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.000000000000000e+01 -2.502613163504364e+06 -5.180559935574715e+06 4.229858604613533e+06 -3.497190303307911e+03 -3.153467052270163e+03 -5.914575818939544e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.100000000000000e+01 -2.502683105760125e+06 -5.180623002511695e+06 4.229740314250569e+06 -3.497145035930697e+03 -3.153344025963881e+03 -5.914668604285677e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.200000000000000e+01 -2.502753047128112e+06 -5.180686067006976e+06 4.229622021998465e+06 -3.497099764674608e+03 -3.153220997423427e+03 -5.914761388652945e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.300000000000000e+01 -2.502822987624277e+06 -5.180749129077584e+06 4.229503727826917e+06 -3.497054490684254e+03 -3.153097963163626e+03 -5.914854173402963e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.400000000000000e+01 -2.502892927153718e+06 -5.180812188622165e+06 4.229385431916228e+06 -3.497009217905455e+03 -3.152974935438155e+03 -5.914946949544543e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.500000000000000e+01 -2.502962865811063e+06 -5.180875245741833e+06 4.229267134086538e+06 -3.496963941123515e+03 -3.152851902875620e+03 -5.915039726240460e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.600000000000000e+01 -2.503032803580678e+06 -5.180938300419877e+06 4.229148834367578e+06 -3.496918662377678e+03 -3.152728866924475e+03 -5.915132501598278e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.700000000000000e+01 -2.503102740430837e+06 -5.181001352622444e+06 4.229030532819587e+06 -3.496873382026339e+03 -3.152605831799463e+03 -5.915225273052458e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.800000000000000e+01 -2.503172676377201e+06 -5.181064402366282e+06 4.228912229412782e+06 -3.496828099714498e+03 -3.152482795569581e+03 -5.915318041879068e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.900000000000000e+01 -2.503242611404133e+06 -5.181127449634678e+06 4.228793924176888e+06 -3.496782816991262e+03 -3.152359759418856e+03 -5.915410806593820e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.000000000000000e+01 -2.503312545558883e+06 -5.181190494478130e+06 4.228675617022077e+06 -3.496737530361662e+03 -3.152236718721830e+03 -5.915503571647142e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.100000000000000e+01 -2.503382478793928e+06 -5.181253536845906e+06 4.228557308038617e+06 -3.496692242109861e+03 -3.152113678774116e+03 -5.915596332849198e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.200000000000000e+01 -2.503452411093636e+06 -5.181316576721306e+06 4.228438997256245e+06 -3.496646954797624e+03 -3.151990640873681e+03 -5.915689088117949e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.300000000000000e+01 -2.503522342536734e+06 -5.181379614188451e+06 4.228320684525263e+06 -3.496601662030404e+03 -3.151867596583041e+03 -5.915781845580776e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.400000000000000e+01 -2.503592273060216e+06 -5.181442649180035e+06 4.228202369965450e+06 -3.496556369037077e+03 -3.151744552475868e+03 -5.915874598775447e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.500000000000000e+01 -2.503662202679740e+06 -5.181505681712811e+06 4.228084053547012e+06 -3.496511073941780e+03 -3.151621507396565e+03 -5.915967349342342e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.600000000000000e+01 -2.503732131426745e+06 -5.181568711820387e+06 4.227965735210126e+06 -3.496465774497758e+03 -3.151498457432408e+03 -5.916060100670906e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.700000000000000e+01 -2.503802059222440e+06 -5.181631739418599e+06 4.227847415104615e+06 -3.496420476862610e+03 -3.151375411565667e+03 -5.916152844453035e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.800000000000000e+01 -2.503871986114056e+06 -5.181694764557929e+06 4.227729093140630e+06 -3.496375176759279e+03 -3.151252364604520e+03 -5.916245585869492e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.900000000000000e+01 -2.503941912133041e+06 -5.181757787271981e+06 4.227610769258354e+06 -3.496329872675769e+03 -3.151129312923639e+03 -5.916338327760005e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.000000000000000e+01 -2.504011837216399e+06 -5.181820807493459e+06 4.227492443577589e+06 -3.496284569525948e+03 -3.151006263031037e+03 -5.916431063867258e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.100000000000000e+01 -2.504081761411354e+06 -5.181883825272843e+06 4.227374116008480e+06 -3.496239262734148e+03 -3.150883210536697e+03 -5.916523799076728e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.200000000000000e+01 -2.504151684686198e+06 -5.181946840576290e+06 4.227255786611307e+06 -3.496193954959678e+03 -3.150760158964321e+03 -5.916616530001421e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.300000000000000e+01 -2.504221607104245e+06 -5.182009853471393e+06 4.227137455265679e+06 -3.496148643309571e+03 -3.150637099704899e+03 -5.916709263016225e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.400000000000000e+01 -2.504291528586414e+06 -5.182072863873745e+06 4.227019122121941e+06 -3.496103331117813e+03 -3.150514043597165e+03 -5.916801990257625e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.500000000000000e+01 -2.504361449132559e+06 -5.182135871783229e+06 4.226900787180310e+06 -3.496058018171957e+03 -3.150390990071104e+03 -5.916894712159121e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.600000000000000e+01 -2.504431368821800e+06 -5.182198877284288e+06 4.226782450290385e+06 -3.496012702049817e+03 -3.150267929123834e+03 -5.916987435631906e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.700000000000000e+01 -2.504501287574946e+06 -5.182261880292434e+06 4.226664111602671e+06 -3.495967384591548e+03 -3.150144871210527e+03 -5.917080153816863e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.800000000000000e+01 -2.504571205455319e+06 -5.182324880875245e+06 4.226545770996786e+06 -3.495922064505246e+03 -3.150021807731022e+03 -5.917172872238912e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.900000000000000e+01 -2.504641122399625e+06 -5.182387878965190e+06 4.226427428593047e+06 -3.495876743659886e+03 -3.149898747232280e+03 -5.917265585099273e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.000000000000000e+01 -2.504711038470883e+06 -5.182450874629564e+06 4.226309084271581e+06 -3.495831418995945e+03 -3.149775681868667e+03 -5.917358298428810e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.100000000000000e+01 -2.504780953637669e+06 -5.182513867834820e+06 4.226190738092142e+06 -3.495786093070100e+03 -3.149652614788331e+03 -5.917451009107202e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.200000000000000e+01 -2.504850867868277e+06 -5.182576858547132e+06 4.226072390115013e+06 -3.495740766645893e+03 -3.149529550482132e+03 -5.917543714203332e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.300000000000000e+01 -2.504920781225723e+06 -5.182639846833800e+06 4.225954040220307e+06 -3.495695436393260e+03 -3.149406481361169e+03 -5.917636419745198e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.400000000000000e+01 -2.504990693662803e+06 -5.182702832644419e+06 4.225835688497815e+06 -3.495650105791867e+03 -3.149283412502551e+03 -5.917729121040525e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.500000000000000e+01 -2.505060605163594e+06 -5.182765815962020e+06 4.225717334977789e+06 -3.495604774746646e+03 -3.149160346164595e+03 -5.917821816868129e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.600000000000000e+01 -2.505130515791102e+06 -5.182828796853904e+06 4.225598979540336e+06 -3.495559439262508e+03 -3.149037275393902e+03 -5.917914513247744e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.700000000000000e+01 -2.505200425545489e+06 -5.182891775320223e+06 4.225480622185169e+06 -3.495514101370250e+03 -3.148914198875285e+03 -5.918007209849548e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.800000000000000e+01 -2.505270334347595e+06 -5.182954751276506e+06 4.225362263062822e+06 -3.495468763500225e+03 -3.148791127356463e+03 -5.918099899342665e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.900000000000000e+01 -2.505340242292284e+06 -5.183017724824024e+06 4.225243901992831e+06 -3.495423421503488e+03 -3.148668048526712e+03 -5.918192590842942e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.000000000000000e+01 -2.505410149253146e+06 -5.183080695827854e+06 4.225125539215663e+06 -3.495378082050378e+03 -3.148544977824409e+03 -5.918285272146357e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.100000000000000e+01 -2.505480055356323e+06 -5.183143664422688e+06 4.225007174491295e+06 -3.495332737489357e+03 -3.148421900865368e+03 -5.918377955380260e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.200000000000000e+01 -2.505549960554617e+06 -5.183206630558126e+06 4.224888807909526e+06 -3.495287391736931e+03 -3.148298821926408e+03 -5.918470636074131e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.300000000000000e+01 -2.505619864863680e+06 -5.183269594250901e+06 4.224770439440546e+06 -3.495242043016148e+03 -3.148175740096799e+03 -5.918563315676400e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.400000000000000e+01 -2.505689768267580e+06 -5.183332555484056e+06 4.224652069114611e+06 -3.495196691554814e+03 -3.148052657696844e+03 -5.918655992761122e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.500000000000000e+01 -2.505759670750709e+06 -5.183395514240888e+06 4.224533696961469e+06 -3.495151340578684e+03 -3.147929574906664e+03 -5.918748665528084e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.600000000000000e+01 -2.505829572328709e+06 -5.183458470538135e+06 4.224415322951299e+06 -3.495105987031700e+03 -3.147806491220043e+03 -5.918841335871769e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.700000000000000e+01 -2.505899472969866e+06 -5.183521424341992e+06 4.224296947144400e+06 -3.495060632554367e+03 -3.147683410712305e+03 -5.918934000635180e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.800000000000000e+01 -2.505969372784842e+06 -5.183584375770533e+06 4.224178569330243e+06 -3.495015273361621e+03 -3.147560318599881e+03 -5.919026670129863e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.900000000000000e+01 -2.506039271647220e+06 -5.183647324688879e+06 4.224060189749319e+06 -3.494969913941336e+03 -3.147437231337419e+03 -5.919119332733884e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.000000000000000e+01 -2.506109169588432e+06 -5.183710271130603e+06 4.223941808341791e+06 -3.494924553249337e+03 -3.147314145048971e+03 -5.919211991178244e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.100000000000000e+01 -2.506179066655989e+06 -5.183773215146398e+06 4.223823425017253e+06 -3.494879189784228e+03 -3.147191052977002e+03 -5.919304650055230e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.200000000000000e+01 -2.506248962770747e+06 -5.183836156651835e+06 4.223705039926290e+06 -3.494833826414299e+03 -3.147067966081826e+03 -5.919397301688652e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.300000000000000e+01 -2.506318858011774e+06 -5.183899095731293e+06 4.223586652918419e+06 -3.494788460074850e+03 -3.146944873438102e+03 -5.919489953838299e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.400000000000000e+01 -2.506388752363146e+06 -5.183962032367810e+06 4.223468264023904e+06 -3.494743090328106e+03 -3.146821778178748e+03 -5.919582604972054e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.500000000000000e+01 -2.506458645793170e+06 -5.184024966527584e+06 4.223349873303042e+06 -3.494697719538289e+03 -3.146698683706831e+03 -5.919675251930949e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.600000000000000e+01 -2.506528538317786e+06 -5.184087898227612e+06 4.223231480725506e+06 -3.494652347671289e+03 -3.146575587492327e+03 -5.919767896156073e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.700000000000000e+01 -2.506598429936857e+06 -5.184150827467782e+06 4.223113086291515e+06 -3.494606973269335e+03 -3.146452490183728e+03 -5.919860538050187e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.800000000000000e+01 -2.506668320634460e+06 -5.184213754231140e+06 4.222994690031333e+06 -3.494561597340508e+03 -3.146329393965690e+03 -5.919953175854017e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.900000000000000e+01 -2.506738210442323e+06 -5.184276678551519e+06 4.222876291884597e+06 -3.494516219932554e+03 -3.146206294013546e+03 -5.920045812255688e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.000000000000000e+01 -2.506808099360314e+06 -5.184339600428805e+06 4.222757891851522e+06 -3.494470839248871e+03 -3.146083191231669e+03 -5.920138447692224e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.100000000000000e+01 -2.506877987325165e+06 -5.184402519795526e+06 4.222639490052491e+06 -3.494425458515367e+03 -3.145960093147145e+03 -5.920231076233086e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.200000000000000e+01 -2.506947874447498e+06 -5.184465436769704e+06 4.222521086276935e+06 -3.494380073513934e+03 -3.145836985595562e+03 -5.920323708062988e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.300000000000000e+01 -2.507017760585066e+06 -5.184528351199597e+06 4.222402680795613e+06 -3.494334690247735e+03 -3.145713886903459e+03 -5.920416329717885e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.400000000000000e+01 -2.507087645927380e+06 -5.184591263287404e+06 4.222284273247741e+06 -3.494289299678003e+03 -3.145590773297266e+03 -5.920508959321418e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.500000000000000e+01 -2.507157530253388e+06 -5.184654172797301e+06 4.222165864054125e+06 -3.494243913001197e+03 -3.145467671775627e+03 -5.920601575801746e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.600000000000000e+01 -2.507227413720758e+06 -5.184717079897530e+06 4.222047452914563e+06 -3.494198521427795e+03 -3.145344563600028e+03 -5.920694194319719e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.700000000000000e+01 -2.507297296298076e+06 -5.184779984554577e+06 4.221929039888854e+06 -3.494153127636694e+03 -3.145221452020648e+03 -5.920786811637912e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.800000000000000e+01 -2.507367178000993e+06 -5.184842886785157e+06 4.221810624947174e+06 -3.494107730130527e+03 -3.145098335510999e+03 -5.920879429402147e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.900000000000000e+01 -2.507437058718916e+06 -5.184905786471321e+06 4.221692208300050e+06 -3.494062334381681e+03 -3.144975227540531e+03 -5.920972037161756e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.000000000000000e+01 -2.507506938562466e+06 -5.184968683731060e+06 4.221573789736891e+06 -3.494016936497917e+03 -3.144852113827023e+03 -5.921064644992790e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.100000000000000e+01 -2.507576817452609e+06 -5.185031578480097e+06 4.221455369408139e+06 -3.493971538266109e+03 -3.144729004999162e+03 -5.921157245981413e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.200000000000000e+01 -2.507646695515425e+06 -5.185094470852971e+06 4.221336947073656e+06 -3.493926133476027e+03 -3.144605885849269e+03 -5.921249851942128e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.300000000000000e+01 -2.507716572624865e+06 -5.185157360715178e+06 4.221218522973516e+06 -3.493880730669118e+03 -3.144482770126267e+03 -5.921342450653610e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.400000000000000e+01 -2.507786448843895e+06 -5.185220248133936e+06 4.221100096987758e+06 -3.493835324233747e+03 -3.144359652102788e+03 -5.921435048287344e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.500000000000000e+01 -2.507856324188151e+06 -5.185283133125959e+06 4.220981669086552e+06 -3.493789913788765e+03 -3.144236529113574e+03 -5.921527646541222e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.600000000000000e+01 -2.507926198578915e+06 -5.185346015607246e+06 4.220863239419852e+06 -3.493744505099424e+03 -3.144113409958188e+03 -5.921620237437539e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.700000000000000e+01 -2.507996072079062e+06 -5.185408895644917e+06 4.220744807867855e+06 -3.493699092905947e+03 -3.143990288160825e+03 -5.921712827382389e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.800000000000000e+01 -2.508065944657192e+06 -5.185471773205472e+06 4.220626374490373e+06 -3.493653680300252e+03 -3.143867166670298e+03 -5.921805413092299e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.900000000000000e+01 -2.508135816376276e+06 -5.185534648356100e+06 4.220507939167431e+06 -3.493608262863299e+03 -3.143744038527964e+03 -5.921898000801332e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.000000000000000e+02 -2.508205687125743e+06 -5.185597520978898e+06 4.220389502109593e+06 -3.493562846611168e+03 -3.143620916777902e+03 -5.921990580016802e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.010000000000000e+02 -2.508275557031967e+06 -5.185660391208630e+06 4.220271063076177e+06 -3.493517425982950e+03 -3.143497785802844e+03 -5.922083162437020e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.020000000000000e+02 -2.508345426000142e+06 -5.185723258944232e+06 4.220152622247700e+06 -3.493472004388654e+03 -3.143374657681842e+03 -5.922175739482967e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.030000000000000e+02 -2.508415294061701e+06 -5.185786124219244e+06 4.220034179564292e+06 -3.493426580869149e+03 -3.143251528747261e+03 -5.922268313719457e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.040000000000000e+02 -2.508485161201021e+06 -5.185848987016982e+06 4.219915735055706e+06 -3.493381157213141e+03 -3.143128399463517e+03 -5.922360883944832e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.050000000000000e+02 -2.508555027433737e+06 -5.185911847354171e+06 4.219797288692119e+06 -3.493335730958115e+03 -3.143005269611808e+03 -5.922453451577387e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.060000000000000e+02 -2.508624892807037e+06 -5.185974705281152e+06 4.219678840383594e+06 -3.493290299882354e+03 -3.142882132969587e+03 -5.922546021280007e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.070000000000000e+02 -2.508694757242213e+06 -5.186037560713973e+06 4.219560390280104e+06 -3.493244869676999e+03 -3.142758998296767e+03 -5.922638585139856e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.080000000000000e+02 -2.508764620786348e+06 -5.186100413702894e+06 4.219441938291886e+06 -3.493199435683693e+03 -3.142635861203888e+03 -5.922731148072046e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.090000000000000e+02 -2.508834483376514e+06 -5.186163264180786e+06 4.219323484538861e+06 -3.493154003428235e+03 -3.142512727870389e+03 -5.922823703700667e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.100000000000000e+02 -2.508904345091438e+06 -5.186226112231641e+06 4.219205028870985e+06 -3.493108567210226e+03 -3.142389589761566e+03 -5.922916259815929e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.110000000000000e+02 -2.508974205899431e+06 -5.186288957821701e+06 4.219086571348583e+06 -3.493063128219432e+03 -3.142266450753965e+03 -5.923008813615409e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.120000000000000e+02 -2.509044065800665e+06 -5.186351800951121e+06 4.218968111971377e+06 -3.493017688837876e+03 -3.142143310016813e+03 -5.923101364312818e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.130000000000000e+02 -2.509113924779218e+06 -5.186414641602967e+06 4.218849650769634e+06 -3.492972247448769e+03 -3.142020170058461e+03 -5.923193911350333e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.140000000000000e+02 -2.509183782882276e+06 -5.186477479827576e+06 4.218731187653414e+06 -3.492926802121991e+03 -3.141897025529409e+03 -5.923286458745856e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.150000000000000e+02 -2.509253640031146e+06 -5.186540315541021e+06 4.218612722772710e+06 -3.492881358909125e+03 -3.141773884745593e+03 -5.923378998649233e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.160000000000000e+02 -2.509323496336085e+06 -5.186603148860905e+06 4.218494255917342e+06 -3.492835909326409e+03 -3.141650735455210e+03 -5.923471542398447e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.170000000000000e+02 -2.509393351702324e+06 -5.186665979686207e+06 4.218375787267876e+06 -3.492790459189804e+03 -3.141527589027442e+03 -5.923564080553859e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.180000000000000e+02 -2.509463206145809e+06 -5.186728808033902e+06 4.218257316793974e+06 -3.492745009503732e+03 -3.141404442588835e+03 -5.923656614200390e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.190000000000000e+02 -2.509533059745241e+06 -5.186791633987961e+06 4.218138844345554e+06 -3.492699553119999e+03 -3.141281287980535e+03 -5.923749151675074e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.200000000000000e+02 -2.509602912342785e+06 -5.186854457380110e+06 4.218020370223433e+06 -3.492654100132050e+03 -3.141158143535181e+03 -5.923841677383159e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.210000000000000e+02 -2.509672764080537e+06 -5.186917278361837e+06 4.217901894156793e+06 -3.492608643682594e+03 -3.141034991403701e+03 -5.923934204946441e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.220000000000000e+02 -2.509742614926721e+06 -5.186980096899304e+06 4.217783416206137e+06 -3.492563183395560e+03 -3.140911836927701e+03 -5.924026731564852e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.230000000000000e+02 -2.509812464849951e+06 -5.187042912959046e+06 4.217664936431305e+06 -3.492517722940044e+03 -3.140788682652626e+03 -5.924119253881227e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.240000000000000e+02 -2.509882313865866e+06 -5.187105726557760e+06 4.217546454802450e+06 -3.492472260297664e+03 -3.140665527288852e+03 -5.924211773680319e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.250000000000000e+02 -2.509952161974326e+06 -5.187168537695331e+06 4.217427971319798e+06 -3.492426795212119e+03 -3.140542370909016e+03 -5.924304291056103e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.260000000000000e+02 -2.510022009191264e+06 -5.187231346388720e+06 4.217309485953000e+06 -3.492381328413487e+03 -3.140419210810806e+03 -5.924396807140743e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.270000000000000e+02 -2.510091855469233e+06 -5.187294152587390e+06 4.217190998792459e+06 -3.492335860856465e+03 -3.140296053748548e+03 -5.924489317643398e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.280000000000000e+02 -2.510161700855402e+06 -5.187356956341650e+06 4.217072509748220e+06 -3.492290390034308e+03 -3.140172893763688e+03 -5.924581827224327e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.290000000000000e+02 -2.510231545349938e+06 -5.187419757651652e+06 4.216954018819984e+06 -3.492244917695877e+03 -3.140049729937376e+03 -5.924674335479507e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.300000000000000e+02 -2.510301388921160e+06 -5.187482556483671e+06 4.216835526068101e+06 -3.492199443589593e+03 -3.139926567181781e+03 -5.924766839785902e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.310000000000000e+02 -2.510371231600469e+06 -5.187545352871199e+06 4.216717031432669e+06 -3.492153966370543e+03 -3.139803401540332e+03 -5.924859343069536e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.320000000000000e+02 -2.510441073309188e+06 -5.187608146730368e+06 4.216598535063722e+06 -3.492108491673132e+03 -3.139680241725412e+03 -5.924951837483126e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.330000000000000e+02 -2.510510914157459e+06 -5.187670938178612e+06 4.216480036751197e+06 -3.492063011766494e+03 -3.139557075361995e+03 -5.925044334029903e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.340000000000000e+02 -2.510580754145432e+06 -5.187733727216092e+06 4.216361536494810e+06 -3.492017527856063e+03 -3.139433902047231e+03 -5.925136832301673e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.350000000000000e+02 -2.510650593146838e+06 -5.187796513708235e+06 4.216243034535293e+06 -3.491972046143839e+03 -3.139310736655264e+03 -5.925229320698512e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.360000000000000e+02 -2.510720431271914e+06 -5.187859297772571e+06 4.216124530662425e+06 -3.491926560655229e+03 -3.139187566723777e+03 -5.925321809348427e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.370000000000000e+02 -2.510790268473514e+06 -5.187922079358844e+06 4.216006024966105e+06 -3.491881074736798e+03 -3.139064396850115e+03 -5.925414293915002e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.380000000000000e+02 -2.510860104814567e+06 -5.187984858534150e+06 4.215887517326287e+06 -3.491835583836825e+03 -3.138941220549060e+03 -5.925506780425915e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.390000000000000e+02 -2.510929940200341e+06 -5.188047635197557e+06 4.215769007923602e+06 -3.491790093300432e+03 -3.138818048785214e+03 -5.925599259925294e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.400000000000000e+02 -2.510999774709825e+06 -5.188110409433225e+06 4.215650496607422e+06 -3.491744600287374e+03 -3.138694871315628e+03 -5.925691739647989e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.410000000000000e+02 -2.511069608279823e+06 -5.188173181173847e+06 4.215531983498240e+06 -3.491699106345879e+03 -3.138571697122614e+03 -5.925784213745153e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.420000000000000e+02 -2.511139440973255e+06 -5.188235950486499e+06 4.215413468476005e+06 -3.491653608437681e+03 -3.138448517804517e+03 -5.925876688522736e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.430000000000000e+02 -2.511209272758758e+06 -5.188298717337736e+06 4.215294951600560e+06 -3.491608109639578e+03 -3.138325336675117e+03 -5.925969160506537e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.440000000000000e+02 -2.511279103604657e+06 -5.188361481693855e+06 4.215176432932274e+06 -3.491562610114212e+03 -3.138202158608760e+03 -5.926061626879230e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.450000000000000e+02 -2.511348933526587e+06 -5.188424243571532e+06 4.215057912441298e+06 -3.491517109199409e+03 -3.138078981334256e+03 -5.926154089261951e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.460000000000000e+02 -2.511418762587761e+06 -5.188487003038121e+06 4.214939390007064e+06 -3.491471604697979e+03 -3.137955796626757e+03 -5.926246553418342e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.470000000000000e+02 -2.511488590709125e+06 -5.188549760009421e+06 4.214820865780312e+06 -3.491426099203209e+03 -3.137832614885253e+03 -5.926339012158215e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.480000000000000e+02 -2.511558417953895e+06 -5.188612514552782e+06 4.214702339640473e+06 -3.491380590932006e+03 -3.137709427801710e+03 -5.926431471073969e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.490000000000000e+02 -2.511628244274639e+06 -5.188675266617698e+06 4.214583811677978e+06 -3.491335081068350e+03 -3.137586241593089e+03 -5.926523926059839e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.500000000000000e+02 -2.511698069686992e+06 -5.188738016220844e+06 4.214465281862983e+06 -3.491289569055481e+03 -3.137463054362309e+03 -5.926616378471369e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.510000000000000e+02 -2.511767894191108e+06 -5.188800763362383e+06 4.214346750195199e+06 -3.491244056138303e+03 -3.137339865329865e+03 -5.926708828091431e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.520000000000000e+02 -2.511837717786851e+06 -5.188863508042202e+06 4.214228216674845e+06 -3.491198540537850e+03 -3.137216675521349e+03 -5.926801275279793e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.530000000000000e+02 -2.511907540489850e+06 -5.188926250276967e+06 4.214109681272071e+06 -3.491153022065180e+03 -3.137093482633078e+03 -5.926893721426214e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.540000000000000e+02 -2.511977362268739e+06 -5.188988990033257e+06 4.213991144046740e+06 -3.491107503489122e+03 -3.136970289952359e+03 -5.926986163234900e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.550000000000000e+02 -2.512047183139143e+06 -5.189051727327749e+06 4.213872604968988e+06 -3.491061982304610e+03 -3.136847096272759e+03 -5.927078602697403e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.560000000000000e+02 -2.512117003100926e+06 -5.189114462160327e+06 4.213754064039049e+06 -3.491016459060992e+03 -3.136723901647166e+03 -5.927171039495590e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.570000000000000e+02 -2.512186822170002e+06 -5.189177194547934e+06 4.213635521226557e+06 -3.490970933611697e+03 -3.136600703524343e+03 -5.927263475135375e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.580000000000000e+02 -2.512256640298865e+06 -5.189239924439997e+06 4.213516976622126e+06 -3.490925407623952e+03 -3.136477508216553e+03 -5.927355905205825e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.590000000000000e+02 -2.512326457550712e+06 -5.189302651903835e+06 4.213398430105166e+06 -3.490879878604820e+03 -3.136354307461938e+03 -5.927448335643276e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.600000000000000e+02 -2.512396273878125e+06 -5.189365376888956e+06 4.213279881766132e+06 -3.490834348197167e+03 -3.136231107720083e+03 -5.927540761967295e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.610000000000000e+02 -2.512466089249453e+06 -5.189428099361669e+06 4.213161331665396e+06 -3.490788818144514e+03 -3.136107912348774e+03 -5.927633181382374e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.620000000000000e+02 -2.512535903775166e+06 -5.189490819439662e+06 4.213042779592133e+06 -3.490743283506421e+03 -3.135984708054717e+03 -5.927725603926572e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.630000000000000e+02 -2.512605717360576e+06 -5.189553537022075e+06 4.212924225727024e+06 -3.490697748248008e+03 -3.135861506319096e+03 -5.927818021088797e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.640000000000000e+02 -2.512675530037064e+06 -5.189616252142384e+06 4.212805670010143e+06 -3.490652210853832e+03 -3.135738303906391e+03 -5.927910435476583e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.650000000000000e+02 -2.512745341867821e+06 -5.189678964867879e+06 4.212687112320879e+06 -3.490606668874849e+03 -3.135615091777177e+03 -5.928002853436515e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.660000000000000e+02 -2.512815152726646e+06 -5.189741675064156e+06 4.212568552900088e+06 -3.490561127895395e+03 -3.135491886611015e+03 -5.928095262698344e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.670000000000000e+02 -2.512884962707951e+06 -5.189804382831817e+06 4.212449991567517e+06 -3.490515583010142e+03 -3.135368676545683e+03 -5.928187672478524e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.680000000000000e+02 -2.512954771733106e+06 -5.189867088087087e+06 4.212331428473281e+06 -3.490470039810187e+03 -3.135245470239300e+03 -5.928280074995037e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.690000000000000e+02 -2.513024579912288e+06 -5.189929790947354e+06 4.212212863407027e+06 -3.490424490776895e+03 -3.135122255526462e+03 -5.928372481004758e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.700000000000000e+02 -2.513094387166551e+06 -5.189992491328575e+06 4.212094296519392e+06 -3.490378939965956e+03 -3.134999041983076e+03 -5.928464883018203e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.710000000000000e+02 -2.513164193464560e+06 -5.190055189197336e+06 4.211975727870252e+06 -3.490333391363526e+03 -3.134875831959818e+03 -5.928557277627632e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.720000000000000e+02 -2.513233998869101e+06 -5.190117884620572e+06 4.211857157339667e+06 -3.490287838623954e+03 -3.134752619428973e+03 -5.928649671537818e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.730000000000000e+02 -2.513303803396092e+06 -5.190180577615214e+06 4.211738584897265e+06 -3.490242283478430e+03 -3.134629401279990e+03 -5.928742065580651e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.740000000000000e+02 -2.513373606998126e+06 -5.190243268130805e+06 4.211620010633518e+06 -3.490196726534001e+03 -3.134506184446236e+03 -5.928834455557212e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.750000000000000e+02 -2.513443409690821e+06 -5.190305956184016e+06 4.211501434518564e+06 -3.490151167612187e+03 -3.134382966352364e+03 -5.928926843002495e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.760000000000000e+02 -2.513513211490099e+06 -5.190368641791770e+06 4.211382856522032e+06 -3.490105606730014e+03 -3.134259744476072e+03 -5.929019229318887e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.770000000000000e+02 -2.513583012364304e+06 -5.190431324920401e+06 4.211264276704309e+06 -3.490060044179645e+03 -3.134136523833527e+03 -5.929111611546222e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.780000000000000e+02 -2.513652812313305e+06 -5.190494005569790e+06 4.211145695065623e+06 -3.490014480369762e+03 -3.134013303949024e+03 -5.929203989736409e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.790000000000000e+02 -2.513722611368773e+06 -5.190556683773657e+06 4.211027111545516e+06 -3.489968914885966e+03 -3.133890080411416e+03 -5.929296366574958e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.800000000000000e+02 -2.513792409530571e+06 -5.190619359531881e+06 4.210908526144198e+06 -3.489923345821186e+03 -3.133766853929840e+03 -5.929388742665692e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.810000000000000e+02 -2.513862206735537e+06 -5.190682032777239e+06 4.210789938982252e+06 -3.489877777222816e+03 -3.133643632413596e+03 -5.929481111460131e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.820000000000000e+02 -2.513932003109871e+06 -5.190744703644106e+06 4.210671349818680e+06 -3.489832203121492e+03 -3.133520399595051e+03 -5.929573485190774e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.830000000000000e+02 -2.514001798527306e+06 -5.190807371998053e+06 4.210552758894582e+06 -3.489786629232321e+03 -3.133397171548675e+03 -5.929665851866745e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.840000000000000e+02 -2.514071593003755e+06 -5.190870037856017e+06 4.210434166179581e+06 -3.489741055729388e+03 -3.133273945565742e+03 -5.929758212912351e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.850000000000000e+02 -2.514141386602096e+06 -5.190932701284995e+06 4.210315571553546e+06 -3.489695478451316e+03 -3.133150714998184e+03 -5.929850574229484e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.860000000000000e+02 -2.514211179290691e+06 -5.190995362251313e+06 4.210196975076873e+06 -3.489649898700733e+03 -3.133027483348960e+03 -5.929942933175284e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.870000000000000e+02 -2.514280971069690e+06 -5.191058020755128e+06 4.210078376749277e+06 -3.489604317938088e+03 -3.132904249879834e+03 -5.930035289396388e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.880000000000000e+02 -2.514350761938961e+06 -5.191120676796328e+06 4.209959776570979e+06 -3.489558734747039e+03 -3.132781015697982e+03 -5.930127643016686e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.890000000000000e+02 -2.514420551914120e+06 -5.191183330391568e+06 4.209841174512104e+06 -3.489513148506657e+03 -3.132657778460200e+03 -5.930219995672185e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.900000000000000e+02 -2.514490340963825e+06 -5.191245981507453e+06 4.209722570632557e+06 -3.489467562271640e+03 -3.132534541277635e+03 -5.930312344020667e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.910000000000000e+02 -2.514560129103687e+06 -5.191308630160648e+06 4.209603964902462e+06 -3.489421973516643e+03 -3.132411303263599e+03 -5.930404689882802e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.920000000000000e+02 -2.514629916317821e+06 -5.191371276334269e+06 4.209485357352134e+06 -3.489376383245805e+03 -3.132288066345844e+03 -5.930497031654089e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.930000000000000e+02 -2.514699702669393e+06 -5.191433920095543e+06 4.209366747860913e+06 -3.489330789681273e+03 -3.132164821456863e+03 -5.930589375336544e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.940000000000000e+02 -2.514769488063756e+06 -5.191496561343743e+06 4.209248136609579e+06 -3.489285195995702e+03 -3.132041581814955e+03 -5.930681711876018e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.950000000000000e+02 -2.514839272532276e+06 -5.191559200112293e+06 4.209129523538173e+06 -3.489239601246472e+03 -3.131918342854470e+03 -5.930774044319747e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.960000000000000e+02 -2.514909056138116e+06 -5.191621836468427e+06 4.209010908526029e+06 -3.489194002516002e+03 -3.131795096617508e+03 -5.930866378646391e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.970000000000000e+02 -2.514978838802298e+06 -5.191684470328089e+06 4.208892291724004e+06 -3.489148403222760e+03 -3.131671853040241e+03 -5.930958707508717e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.980000000000000e+02 -2.515048620572219e+06 -5.191747101741743e+06 4.208773673041535e+06 -3.489102801665504e+03 -3.131548606223920e+03 -5.931051035096228e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.990000000000000e+02 -2.515118401432001e+06 -5.191809730692510e+06 4.208655052508931e+06 -3.489057197984341e+03 -3.131425358372844e+03 -5.931143360103310e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.000000000000000e+02 -2.515188181412999e+06 -5.191872357213806e+06 4.208536430066224e+06 -3.489011589987549e+03 -3.131302105834718e+03 -5.931235685720437e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.010000000000000e+02 -2.515257960452386e+06 -5.191934981238712e+06 4.208417805833512e+06 -3.488965983256315e+03 -3.131178854900043e+03 -5.931328005505140e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.020000000000000e+02 -2.515327738581513e+06 -5.191997602800661e+06 4.208299179750819e+06 -3.488920373500015e+03 -3.131055603583081e+03 -5.931420322817363e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.030000000000000e+02 -2.515397515784502e+06 -5.192060221882761e+06 4.208180551848472e+06 -3.488874762968439e+03 -3.130932352811888e+03 -5.931512635958844e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.040000000000000e+02 -2.515467292093005e+06 -5.192122838518701e+06 4.208061922065986e+06 -3.488829150066011e+03 -3.130809098427900e+03 -5.931604948089995e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.050000000000000e+02 -2.515537067506893e+06 -5.192185452708367e+06 4.207943290403578e+06 -3.488783534325667e+03 -3.130685841252635e+03 -5.931697258996482e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.060000000000000e+02 -2.515606841994526e+06 -5.192248064418120e+06 4.207824656921671e+06 -3.488737916796361e+03 -3.130562585257932e+03 -5.931789565909145e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.070000000000000e+02 -2.515676615540315e+06 -5.192310673631343e+06 4.207706021650076e+06 -3.488692300279131e+03 -3.130439330805947e+03 -5.931881867157307e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.080000000000000e+02 -2.515746388254270e+06 -5.192373280465176e+06 4.207587384378487e+06 -3.488646676677902e+03 -3.130316066523439e+03 -5.931974173339351e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.090000000000000e+02 -2.515816159979060e+06 -5.192435884752152e+06 4.207468745407613e+06 -3.488601056153232e+03 -3.130192809720662e+03 -5.932066469458000e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.100000000000000e+02 -2.515885930824793e+06 -5.192498486609486e+06 4.207350104526978e+06 -3.488555431851617e+03 -3.130069548202089e+03 -5.932158765919225e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.110000000000000e+02 -2.515955700759837e+06 -5.192561086003542e+06 4.207231461797003e+06 -3.488509805154995e+03 -3.129946285863619e+03 -5.932251059822161e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.120000000000000e+02 -2.516025469815838e+06 -5.192623682967997e+06 4.207112817157197e+06 -3.488464175491410e+03 -3.129823018125596e+03 -5.932343354024443e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.130000000000000e+02 -2.516095237913927e+06 -5.192686277418937e+06 4.206994170758289e+06 -3.488418546381093e+03 -3.129699754731184e+03 -5.932435641238965e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.140000000000000e+02 -2.516165005101213e+06 -5.192748869406524e+06 4.206875522510199e+06 -3.488372914911581e+03 -3.129576490450661e+03 -5.932527925913550e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.150000000000000e+02 -2.516234771409344e+06 -5.192811458964429e+06 4.206756872352432e+06 -3.488327280646010e+03 -3.129453220751826e+03 -5.932620210808093e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.160000000000000e+02 -2.516304536790948e+06 -5.192874046042266e+06 4.206638220375515e+06 -3.488281644879095e+03 -3.129329951878013e+03 -5.932712491757310e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.170000000000000e+02 -2.516374301261633e+06 -5.192936630656681e+06 4.206519566549568e+06 -3.488236006878331e+03 -3.129206682127940e+03 -5.932804770095258e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.180000000000000e+02 -2.516444064790069e+06 -5.192999212774307e+06 4.206400910934522e+06 -3.488190369748287e+03 -3.129083414319248e+03 -5.932897042621607e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.190000000000000e+02 -2.516513827439106e+06 -5.193061792462061e+06 4.206282253410164e+06 -3.488144728479979e+03 -3.128960141668163e+03 -5.932989315749421e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.200000000000000e+02 -2.516583589208591e+06 -5.193124369719828e+06 4.206163593976726e+06 -3.488099082745780e+03 -3.128836864732609e+03 -5.933081589338513e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.210000000000000e+02 -2.516653350004232e+06 -5.193186944447227e+06 4.206044932814545e+06 -3.488053440131254e+03 -3.128713593048439e+03 -5.933173854089722e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.220000000000000e+02 -2.516723109935997e+06 -5.193249516761337e+06 4.205926269713281e+06 -3.488007791811302e+03 -3.128590315122254e+03 -5.933266121044551e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.230000000000000e+02 -2.516792868988305e+06 -5.193312086645561e+06 4.205807604702744e+06 -3.487962140704581e+03 -3.128467031948119e+03 -5.933358388118030e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.240000000000000e+02 -2.516862627066552e+06 -5.193374653999265e+06 4.205688937963796e+06 -3.487916490659113e+03 -3.128343755314757e+03 -5.933450646713241e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.250000000000000e+02 -2.516932384202092e+06 -5.193437218855839e+06 4.205570269436453e+06 -3.487870840419798e+03 -3.128220481026141e+03 -5.933542899830646e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.260000000000000e+02 -2.517002140505289e+06 -5.193499781332700e+06 4.205451598909670e+06 -3.487825184664639e+03 -3.128097195922895e+03 -5.933635157603675e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.270000000000000e+02 -2.517071895818576e+06 -5.193562341262227e+06 4.205332926684750e+06 -3.487779530886600e+03 -3.127973919257102e+03 -5.933727405361000e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.280000000000000e+02 -2.517141650299243e+06 -5.193624898811807e+06 4.205214252460826e+06 -3.487733870368193e+03 -3.127850632146550e+03 -5.933819658208470e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.290000000000000e+02 -2.517211403837256e+06 -5.193687453864343e+06 4.205095576448374e+06 -3.487688210865998e+03 -3.127727346931825e+03 -5.933911905194764e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.300000000000000e+02 -2.517281156463959e+06 -5.193750006453220e+06 4.204976898587396e+06 -3.487642548719720e+03 -3.127604060921976e+03 -5.934004149739525e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.310000000000000e+02 -2.517350908194955e+06 -5.193812556595074e+06 4.204858218848009e+06 -3.487596883463748e+03 -3.127480772203952e+03 -5.934096393154106e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.320000000000000e+02 -2.517420658998921e+06 -5.193875104256564e+06 4.204739537290141e+06 -3.487551218114867e+03 -3.127357483342512e+03 -5.934188632426903e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.330000000000000e+02 -2.517490408859887e+06 -5.193937649420733e+06 4.204620853944297e+06 -3.487505551948149e+03 -3.127234197526235e+03 -5.934280866158911e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.340000000000000e+02 -2.517560157840975e+06 -5.194000192154733e+06 4.204502168689745e+06 -3.487459882813180e+03 -3.127110906399389e+03 -5.934373100138576e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.350000000000000e+02 -2.517629905926305e+06 -5.194062732441697e+06 4.204383481556814e+06 -3.487414210547097e+03 -3.126987612268956e+03 -5.934465333163836e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.360000000000000e+02 -2.517699653084261e+06 -5.194125270248014e+06 4.204264792605950e+06 -3.487368536764691e+03 -3.126864319019377e+03 -5.934557562221786e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.370000000000000e+02 -2.517769399362226e+06 -5.194187805624082e+06 4.204146101746531e+06 -3.487322860328233e+03 -3.126741020438779e+03 -5.934649791373539e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.380000000000000e+02 -2.517839144649874e+06 -5.194250338452580e+06 4.204027409189573e+06 -3.487277185767078e+03 -3.126617730450451e+03 -5.934742010480330e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.390000000000000e+02 -2.517908889104477e+06 -5.194312868900818e+06 4.203908714634153e+06 -3.487231504711684e+03 -3.126494429553187e+03 -5.934834234803475e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.400000000000000e+02 -2.517978632616016e+06 -5.194375396851753e+06 4.203790018290788e+06 -3.487185824495865e+03 -3.126371130884464e+03 -5.934926453173919e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.410000000000000e+02 -2.518048375215827e+06 -5.194437922338760e+06 4.203671320099468e+06 -3.487140141548545e+03 -3.126247831476116e+03 -5.935018669117666e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.420000000000000e+02 -2.518118116903782e+06 -5.194500445361722e+06 4.203552620060417e+06 -3.487094456759616e+03 -3.126124530815428e+03 -5.935110882454597e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.430000000000000e+02 -2.518187857680036e+06 -5.194562965920796e+06 4.203433918173350e+06 -3.487048770710973e+03 -3.126001228625963e+03 -5.935203093034119e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.440000000000000e+02 -2.518257597512980e+06 -5.194625483982380e+06 4.203315214498718e+06 -3.487003084285964e+03 -3.125877928942024e+03 -5.935295298144122e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.450000000000000e+02 -2.518327336512641e+06 -5.194687999663552e+06 4.203196508825923e+06 -3.486957390871522e+03 -3.125754619320007e+03 -5.935387508186217e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.460000000000000e+02 -2.518397074537533e+06 -5.194750512813803e+06 4.203077801425731e+06 -3.486911700029273e+03 -3.125631315165147e+03 -5.935479709563420e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.470000000000000e+02 -2.518466811650379e+06 -5.194813023499878e+06 4.202959092178073e+06 -3.486866006667220e+03 -3.125508010271196e+03 -5.935571908402921e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.480000000000000e+02 -2.518536547851338e+06 -5.194875531721945e+06 4.202840381082652e+06 -3.486820312079146e+03 -3.125384703651331e+03 -5.935664104577420e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.490000000000000e+02 -2.518606283171750e+06 -5.194938037513360e+06 4.202721668079454e+06 -3.486774613553319e+03 -3.125261392460246e+03 -5.935756301092902e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.500000000000000e+02 -2.518676017579994e+06 -5.195000540840532e+06 4.202602953228939e+06 -3.486728912463285e+03 -3.125138080205007e+03 -5.935848495274883e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.510000000000000e+02 -2.518745751044769e+06 -5.195063041670139e+06 4.202484236591065e+06 -3.486683212652847e+03 -3.125014769816306e+03 -5.935940683477297e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.520000000000000e+02 -2.518815483628881e+06 -5.195125540069023e+06 4.202365518045557e+06 -3.486637508149589e+03 -3.124891455020282e+03 -5.936032872324283e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.530000000000000e+02 -2.518885215284978e+06 -5.195188035986852e+06 4.202246797683016e+06 -3.486591802501021e+03 -3.124768141051134e+03 -5.936125057040957e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.540000000000000e+02 -2.518954946028965e+06 -5.195250529440516e+06 4.202128075473026e+06 -3.486546095978016e+03 -3.124644825048046e+03 -5.936217239080096e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.550000000000000e+02 -2.519024675860697e+06 -5.195313020429906e+06 4.202009351415804e+06 -3.486500386825712e+03 -3.124521508242327e+03 -5.936309418674158e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.560000000000000e+02 -2.519094404748573e+06 -5.195375508921442e+06 4.201890625571827e+06 -3.486454677354883e+03 -3.124398194437307e+03 -5.936401592494077e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.570000000000000e+02 -2.519164132787167e+06 -5.195437995015670e+06 4.201771897760066e+06 -3.486408963372837e+03 -3.124274871037747e+03 -5.936493769753419e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.580000000000000e+02 -2.519233859881823e+06 -5.195500478611993e+06 4.201653168161649e+06 -3.486363248144742e+03 -3.124151550955009e+03 -5.936585941548005e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.590000000000000e+02 -2.519303586079917e+06 -5.195562959760763e+06 4.201534436685916e+06 -3.486317531418763e+03 -3.124028226979017e+03 -5.936678112027313e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.600000000000000e+02 -2.519373311318364e+06 -5.195625438394941e+06 4.201415703453588e+06 -3.486271814537094e+03 -3.123904907887342e+03 -5.936770275598261e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.610000000000000e+02 -2.519443035659973e+06 -5.195687914581336e+06 4.201296968344395e+06 -3.486226094909332e+03 -3.123781585772801e+03 -5.936862438022466e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.620000000000000e+02 -2.519512759104904e+06 -5.195750388320104e+06 4.201178231358043e+06 -3.486180373196873e+03 -3.123658260309066e+03 -5.936954599135363e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.630000000000000e+02 -2.519582481637280e+06 -5.195812859594399e+06 4.201059492524873e+06 -3.486134649096839e+03 -3.123534933583052e+03 -5.937046757932744e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.640000000000000e+02 -2.519652203256968e+06 -5.195875328404103e+06 4.200940751845119e+06 -3.486088922754685e+03 -3.123411606033488e+03 -5.937138914094085e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.650000000000000e+02 -2.519721923995598e+06 -5.195937794782827e+06 4.200822009258236e+06 -3.486043193900433e+03 -3.123288272931525e+03 -5.937231070394640e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.660000000000000e+02 -2.519791643774361e+06 -5.196000258646824e+06 4.200703264915074e+06 -3.485997464886288e+03 -3.123164944761674e+03 -5.937323219763515e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.670000000000000e+02 -2.519861362671788e+06 -5.196062720079612e+06 4.200584518665221e+06 -3.485951731983081e+03 -3.123041611460764e+03 -5.937415369757390e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.680000000000000e+02 -2.519931080640844e+06 -5.196125179031167e+06 4.200465770598776e+06 -3.485905999102326e+03 -3.122918278565679e+03 -5.937507515245438e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.690000000000000e+02 -2.520000797665659e+06 -5.196187635484641e+06 4.200347020746084e+06 -3.485860265721465e+03 -3.122794947948274e+03 -5.937599655458933e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.700000000000000e+02 -2.520070513840487e+06 -5.196250089540288e+06 4.200228268926605e+06 -3.485814526178089e+03 -3.122671609696219e+03 -5.937691798880831e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.710000000000000e+02 -2.520140229071097e+06 -5.196312541097901e+06 4.200109515320811e+06 -3.485768787595444e+03 -3.122548272851240e+03 -5.937783936748572e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.720000000000000e+02 -2.520209943404453e+06 -5.196374990207449e+06 4.199990759838718e+06 -3.485723045471073e+03 -3.122424933570016e+03 -5.937876073558242e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.730000000000000e+02 -2.520279656762050e+06 -5.196437436785477e+06 4.199872002630683e+06 -3.485677305624513e+03 -3.122301600078654e+03 -5.937968201684828e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.740000000000000e+02 -2.520349369253879e+06 -5.196499880948928e+06 4.199753243486012e+06 -3.485631561047542e+03 -3.122178259864746e+03 -5.938060331761901e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.750000000000000e+02 -2.520419080848331e+06 -5.196562322664242e+06 4.199634482465191e+06 -3.485585812879789e+03 -3.122054917201281e+03 -5.938152460813800e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.760000000000000e+02 -2.520488791514119e+06 -5.196624761898127e+06 4.199515719628200e+06 -3.485540065266752e+03 -3.121931574125811e+03 -5.938244585537347e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.770000000000000e+02 -2.520558501282553e+06 -5.196687198683915e+06 4.199396954914985e+06 -3.485494313829260e+03 -3.121808228526264e+03 -5.938336709399324e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.780000000000000e+02 -2.520628210106312e+06 -5.196749632971329e+06 4.199278188416176e+06 -3.485448562130276e+03 -3.121684885718420e+03 -5.938428827576768e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.790000000000000e+02 -2.520697918048478e+06 -5.196812064827399e+06 4.199159420010951e+06 -3.485402807681088e+03 -3.121561537242431e+03 -5.938520946080692e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.800000000000000e+02 -2.520767625045997e+06 -5.196874494185140e+06 4.199040649820061e+06 -3.485357052601527e+03 -3.121438191745044e+03 -5.938613058989306e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.810000000000000e+02 -2.520837331177368e+06 -5.196936921128033e+06 4.198921877693062e+06 -3.485311292331567e+03 -3.121314839636338e+03 -5.938705174025419e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.820000000000000e+02 -2.520907036348391e+06 -5.196999345555910e+06 4.198803103810471e+06 -3.485265534196541e+03 -3.121191491202165e+03 -5.938797281632678e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.830000000000000e+02 -2.520976740637463e+06 -5.197061767552167e+06 4.198684328022006e+06 -3.485219771140109e+03 -3.121068138592119e+03 -5.938889389871038e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.840000000000000e+02 -2.521046443950384e+06 -5.197124187016656e+06 4.198565550508192e+06 -3.485174010946937e+03 -3.120944791407769e+03 -5.938981489325732e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.850000000000000e+02 -2.521116146397104e+06 -5.197186604066282e+06 4.198446771058301e+06 -3.485128245372075e+03 -3.120821437819896e+03 -5.939073590891777e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.860000000000000e+02 -2.521185847930317e+06 -5.197249018650771e+06 4.198327989762967e+06 -3.485082478023139e+03 -3.120698083249445e+03 -5.939165689665634e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.870000000000000e+02 -2.521255548597353e+06 -5.197311430820428e+06 4.198209206531482e+06 -3.485036706515169e+03 -3.120574721332817e+03 -5.939257790435097e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.880000000000000e+02 -2.521325248256528e+06 -5.197373840424711e+06 4.198090421635307e+06 -3.484990938111716e+03 -3.120451369767689e+03 -5.939349879555090e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.890000000000000e+02 -2.521394947080711e+06 -5.197436247647357e+06 4.197971634743151e+06 -3.484945163018780e+03 -3.120328007762656e+03 -5.939441973715014e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.900000000000000e+02 -2.521464644959977e+06 -5.197498652371521e+06 4.197852846065694e+06 -3.484899388970788e+03 -3.120204647644286e+03 -5.939534062012282e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.910000000000000e+02 -2.521534341909906e+06 -5.197561054613814e+06 4.197734055573012e+06 -3.484853612959755e+03 -3.120081288736377e+03 -5.939626146396343e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.920000000000000e+02 -2.521604037977549e+06 -5.197623454424249e+06 4.197615263174919e+06 -3.484807833288507e+03 -3.119957924862861e+03 -5.939718231190110e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.930000000000000e+02 -2.521673733084430e+06 -5.197685851719426e+06 4.197496469021823e+06 -3.484762055105866e+03 -3.119834564894084e+03 -5.939810308767350e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.940000000000000e+02 -2.521743427340502e+06 -5.197748246616206e+06 4.197377672902963e+06 -3.484716271192179e+03 -3.119711196488803e+03 -5.939902389767318e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.950000000000000e+02 -2.521813120651263e+06 -5.197810639014212e+06 4.197258874999402e+06 -3.484670486479306e+03 -3.119587830949467e+03 -5.939994465324883e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.960000000000000e+02 -2.521882813016879e+06 -5.197873028913601e+06 4.197140075310856e+06 -3.484624702708184e+03 -3.119464467318284e+03 -5.940086535062906e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.970000000000000e+02 -2.521952504547194e+06 -5.197935416431130e+06 4.197021273626728e+06 -3.484578911789545e+03 -3.119341093709548e+03 -5.940178609820335e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.980000000000000e+02 -2.522022195085111e+06 -5.197997801399871e+06 4.196902470248141e+06 -3.484533124120002e+03 -3.119217727583361e+03 -5.940270674452166e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.990000000000000e+02 -2.522091884772023e+06 -5.198060183970081e+06 4.196783664904045e+06 -3.484487330898311e+03 -3.119094352996557e+03 -5.940362742425261e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.000000000000000e+02 -2.522161573497714e+06 -5.198122564024696e+06 4.196664857805653e+06 -3.484441537522016e+03 -3.118970983433347e+03 -5.940454803420030e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.010000000000000e+02 -2.522231261325256e+06 -5.198184941630688e+06 4.196546048832112e+06 -3.484395742898199e+03 -3.118847609556492e+03 -5.940546863199623e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.020000000000000e+02 -2.522300948238773e+06 -5.198247316771248e+06 4.196427238013781e+06 -3.484349945422465e+03 -3.118724235328787e+03 -5.940638920399387e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.030000000000000e+02 -2.522370634222413e+06 -5.198309689429554e+06 4.196308425381034e+06 -3.484304146813542e+03 -3.118600861837594e+03 -5.940730973516481e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.040000000000000e+02 -2.522440319323504e+06 -5.198372059655869e+06 4.196189610843143e+06 -3.484258345320601e+03 -3.118477482673470e+03 -5.940823027029151e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.050000000000000e+02 -2.522510003494740e+06 -5.198434427399974e+06 4.196070794490767e+06 -3.484212542377609e+03 -3.118354104664961e+03 -5.940915076391797e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.060000000000000e+02 -2.522579686751703e+06 -5.198496792678456e+06 4.195951976293981e+06 -3.484166737092498e+03 -3.118230725589497e+03 -5.941007123306244e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.070000000000000e+02 -2.522649369094560e+06 -5.198559155491464e+06 4.195833156252498e+06 -3.484120930842709e+03 -3.118107344716651e+03 -5.941099167458560e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.080000000000000e+02 -2.522719050523080e+06 -5.198621515838800e+06 4.195714334366711e+06 -3.484075122053860e+03 -3.117983963297725e+03 -5.941191208976110e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.090000000000000e+02 -2.522788731037410e+06 -5.198683873720615e+06 4.195595510636330e+06 -3.484029311981125e+03 -3.117860579839854e+03 -5.941283248032601e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.100000000000000e+02 -2.522858410653143e+06 -5.198746229153498e+06 4.195476685031427e+06 -3.483983498665238e+03 -3.117737193892402e+03 -5.941375285902314e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.110000000000000e+02 -2.522928089307254e+06 -5.198808582070534e+06 4.195357857672822e+06 -3.483937685931882e+03 -3.117613812420760e+03 -5.941467316715318e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.120000000000000e+02 -2.522997767078514e+06 -5.198870932555373e+06 4.195239028409483e+06 -3.483891870423045e+03 -3.117490425208212e+03 -5.941559347903955e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.130000000000000e+02 -2.523067443935338e+06 -5.198933280574509e+06 4.195120197301928e+06 -3.483846052288215e+03 -3.117367037504172e+03 -5.941651376472954e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.140000000000000e+02 -2.523137119877597e+06 -5.198995626127824e+06 4.195001364350380e+06 -3.483800232272791e+03 -3.117243648577206e+03 -5.941743402439246e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.150000000000000e+02 -2.523206794952606e+06 -5.199057969265560e+06 4.194882529464100e+06 -3.483754408162887e+03 -3.117120252350589e+03 -5.941835430335654e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.160000000000000e+02 -2.523276469034466e+06 -5.199120309854032e+06 4.194763692884513e+06 -3.483708586448141e+03 -3.116996864587671e+03 -5.941927448013568e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.170000000000000e+02 -2.523346142217366e+06 -5.199182647993304e+06 4.194644854430935e+06 -3.483662761334586e+03 -3.116873473770825e+03 -5.942019464899421e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.180000000000000e+02 -2.523415814501465e+06 -5.199244983683535e+06 4.194526014103086e+06 -3.483616934648315e+03 -3.116750079418528e+03 -5.942111480306420e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.190000000000000e+02 -2.523485485886626e+06 -5.199307316924602e+06 4.194407171901176e+06 -3.483571104604262e+03 -3.116626682295440e+03 -5.942203494742218e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.200000000000000e+02 -2.523555156309829e+06 -5.199369647649617e+06 4.194288327946043e+06 -3.483525274574614e+03 -3.116503289961422e+03 -5.942295502245955e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.210000000000000e+02 -2.523624825881273e+06 -5.199431975975596e+06 4.194169482026331e+06 -3.483479440344055e+03 -3.116379888230328e+03 -5.942387512899325e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.220000000000000e+02 -2.523694494490695e+06 -5.199494301785475e+06 4.194050634353498e+06 -3.483433606146783e+03 -3.116256491409264e+03 -5.942479516543861e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.230000000000000e+02 -2.523764162201124e+06 -5.199556625146177e+06 4.193931784806646e+06 -3.483387769746401e+03 -3.116133090829323e+03 -5.942571519162630e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.240000000000000e+02 -2.523833829028142e+06 -5.199618946074292e+06 4.193812933355847e+06 -3.483341929444094e+03 -3.116009685964671e+03 -5.942663521934789e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.250000000000000e+02 -2.523903494908742e+06 -5.199681264502924e+06 4.193694080121927e+06 -3.483296088506578e+03 -3.115886283470114e+03 -5.942755519458331e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.260000000000000e+02 -2.523973159858797e+06 -5.199743580448930e+06 4.193575225074456e+06 -3.483250247465337e+03 -3.115762881290284e+03 -5.942847512597266e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.270000000000000e+02 -2.524042823909617e+06 -5.199805893945573e+06 4.193456368153339e+06 -3.483204403408119e+03 -3.115639475993437e+03 -5.942939504778310e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.280000000000000e+02 -2.524112487045334e+06 -5.199868204976052e+06 4.193337509388957e+06 -3.483158556573193e+03 -3.115516070213123e+03 -5.943031494414658e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.290000000000000e+02 -2.524182149266119e+06 -5.199930513540517e+06 4.193218648781021e+06 -3.483112709226368e+03 -3.115392662265028e+03 -5.943123481258039e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.300000000000000e+02 -2.524251810571833e+06 -5.199992819638861e+06 4.193099786329754e+06 -3.483066859342749e+03 -3.115269253726697e+03 -5.943215465490190e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.310000000000000e+02 -2.524321470962335e+06 -5.200055123270960e+06 4.192980922035374e+06 -3.483021007153440e+03 -3.115145843879432e+03 -5.943307447389400e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.320000000000000e+02 -2.524391130437788e+06 -5.200117424436976e+06 4.192862055897601e+06 -3.482975153904135e+03 -3.115022432649571e+03 -5.943399426346004e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.330000000000000e+02 -2.524460788997961e+06 -5.200179723136699e+06 4.192743187916818e+06 -3.482929298167592e+03 -3.114899020224600e+03 -5.943491403001283e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.340000000000000e+02 -2.524530446643002e+06 -5.200242019370290e+06 4.192624318092742e+06 -3.482883440987984e+03 -3.114775606568712e+03 -5.943583376829821e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.350000000000000e+02 -2.524600103357075e+06 -5.200304313120943e+06 4.192505446455751e+06 -3.482837582849389e+03 -3.114652193366761e+03 -5.943675346643777e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.360000000000000e+02 -2.524669759171464e+06 -5.200366604421923e+06 4.192386572945754e+06 -3.482791721238273e+03 -3.114528777820148e+03 -5.943767315308944e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.370000000000000e+02 -2.524739414102048e+06 -5.200428893290059e+06 4.192267697532295e+06 -3.482745856900911e+03 -3.114405356368809e+03 -5.943859284411119e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.380000000000000e+02 -2.524809068054399e+06 -5.200491179625138e+06 4.192148820396562e+06 -3.482699993795413e+03 -3.114281941641783e+03 -5.943951244875198e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.390000000000000e+02 -2.524878721122668e+06 -5.200553463527145e+06 4.192029941357811e+06 -3.482654126500140e+03 -3.114158522103840e+03 -5.944043205933433e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.400000000000000e+02 -2.524948373291302e+06 -5.200615744979551e+06 4.191911060445920e+06 -3.482608257598871e+03 -3.114035098963603e+03 -5.944135165565827e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.410000000000000e+02 -2.525018024513023e+06 -5.200678023932198e+06 4.191792177751589e+06 -3.482562387842866e+03 -3.113911678686463e+03 -5.944227119792784e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.420000000000000e+02 -2.525087674866263e+06 -5.200740300468379e+06 4.191673293124233e+06 -3.482516513323691e+03 -3.113788251704372e+03 -5.944319075963499e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.430000000000000e+02 -2.525157324256894e+06 -5.200802574488158e+06 4.191554406744539e+06 -3.482470640208763e+03 -3.113664828865570e+03 -5.944411024839409e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.440000000000000e+02 -2.525226972747648e+06 -5.200864846058151e+06 4.191435518492077e+06 -3.482424764331055e+03 -3.113541402840053e+03 -5.944502972662702e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.450000000000000e+02 -2.525296620322661e+06 -5.200927115161557e+06 4.191316628397233e+06 -3.482378885664073e+03 -3.113417976207018e+03 -5.944594918016279e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.460000000000000e+02 -2.525366266982101e+06 -5.200989381798528e+06 4.191197736459718e+06 -3.482333006379744e+03 -3.113294547384985e+03 -5.944686860643648e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.470000000000000e+02 -2.525435912710015e+06 -5.201051645952193e+06 4.191078842710091e+06 -3.482287124911875e+03 -3.113171120182921e+03 -5.944778799249622e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.480000000000000e+02 -2.525505557569419e+06 -5.201113907689411e+06 4.190959947027399e+06 -3.482241239998622e+03 -3.113047685361555e+03 -5.944870739617449e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.490000000000000e+02 -2.525575201481611e+06 -5.201176166926675e+06 4.190841049562693e+06 -3.482195354485590e+03 -3.112924253333069e+03 -5.944962674486643e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.500000000000000e+02 -2.525644844446453e+06 -5.201238423663885e+06 4.190722150316196e+06 -3.482149468249979e+03 -3.112800824219074e+03 -5.945054603854262e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.510000000000000e+02 -2.525714486526961e+06 -5.201300677967887e+06 4.190603249166959e+06 -3.482103579781305e+03 -3.112677389377522e+03 -5.945146533301461e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.520000000000000e+02 -2.525784127707277e+06 -5.201362929821907e+06 4.190484346145364e+06 -3.482057687425767e+03 -3.112553952097596e+03 -5.945238461867031e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.530000000000000e+02 -2.525853767955844e+06 -5.201425179192462e+06 4.190365441311968e+06 -3.482011793871713e+03 -3.112430515423647e+03 -5.945330386459739e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.540000000000000e+02 -2.525923407288538e+06 -5.201487426096394e+06 4.190246534636321e+06 -3.481965899633832e+03 -3.112307077000559e+03 -5.945422308116994e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.550000000000000e+02 -2.525993045705219e+06 -5.201549670533582e+06 4.190127626118637e+06 -3.481920002826042e+03 -3.112183637700492e+03 -5.945514227339492e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.560000000000000e+02 -2.526062683205747e+06 -5.201611912503917e+06 4.190008715759143e+06 -3.481874103538647e+03 -3.112060197555574e+03 -5.945606144062303e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.570000000000000e+02 -2.526132319790289e+06 -5.201674152007547e+06 4.189889803557552e+06 -3.481828203583560e+03 -3.111936755386466e+03 -5.945698057993744e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.580000000000000e+02 -2.526201955427188e+06 -5.201736389010931e+06 4.189770889574593e+06 -3.481782302387327e+03 -3.111813316457798e+03 -5.945789966514614e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.590000000000000e+02 -2.526271590179441e+06 -5.201798623580909e+06 4.189651973689302e+06 -3.481736398711553e+03 -3.111689871911684e+03 -5.945881875181567e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.600000000000000e+02 -2.526341224031205e+06 -5.201860855700697e+06 4.189533055932065e+06 -3.481690491571212e+03 -3.111566424839760e+03 -5.945973782794485e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.610000000000000e+02 -2.526410856982336e+06 -5.201923085370173e+06 4.189414136303103e+06 -3.481644581076726e+03 -3.111442974642707e+03 -5.946065689627747e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.620000000000000e+02 -2.526480488985877e+06 -5.201985312539483e+06 4.189295214892647e+06 -3.481598671913969e+03 -3.111319526428292e+03 -5.946157590405493e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.630000000000000e+02 -2.526550120057392e+06 -5.202047537225190e+06 4.189176291670742e+06 -3.481552760708260e+03 -3.111196079349616e+03 -5.946249487358106e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.640000000000000e+02 -2.526619750212461e+06 -5.202109759443842e+06 4.189057366607444e+06 -3.481506847672615e+03 -3.111072630975646e+03 -5.946341381721879e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.650000000000000e+02 -2.526689379482655e+06 -5.202171979228935e+06 4.188938439642123e+06 -3.481460931610778e+03 -3.110949177547474e+03 -5.946433276203843e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.660000000000000e+02 -2.526759007820716e+06 -5.202234196530346e+06 4.188819510865506e+06 -3.481415014211382e+03 -3.110825724548306e+03 -5.946525166884384e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.670000000000000e+02 -2.526828635242208e+06 -5.202296411364632e+06 4.188700580247655e+06 -3.481369094228797e+03 -3.110702271123539e+03 -5.946617054886978e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.680000000000000e+02 -2.526898261731599e+06 -5.202358623715277e+06 4.188581647818451e+06 -3.481323174691920e+03 -3.110578817187771e+03 -5.946708938679015e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.690000000000000e+02 -2.526967887304449e+06 -5.202420833598848e+06 4.188462713547942e+06 -3.481277252347079e+03 -3.110455362878783e+03 -5.946800819881487e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.700000000000000e+02 -2.527037511976328e+06 -5.202483041031877e+06 4.188343777406177e+06 -3.481231326987959e+03 -3.110331905409001e+03 -5.946892700146367e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.710000000000000e+02 -2.527107135731691e+06 -5.202545245997863e+06 4.188224839423037e+06 -3.481185400536816e+03 -3.110208446314329e+03 -5.946984577619971e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.720000000000000e+02 -2.527176758570304e+06 -5.202607448496599e+06 4.188105899598922e+06 -3.481139471474092e+03 -3.110084986458596e+03 -5.947076452616331e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.730000000000000e+02 -2.527246380539444e+06 -5.202669648578231e+06 4.187986957843007e+06 -3.481093538624948e+03 -3.109961519372695e+03 -5.947168329331539e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.740000000000000e+02 -2.527316001544740e+06 -5.202731846142665e+06 4.187868014336574e+06 -3.481047606144277e+03 -3.109838056731018e+03 -5.947260199131772e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.750000000000000e+02 -2.527385621633173e+06 -5.202794041239775e+06 4.187749068989322e+06 -3.481001671410106e+03 -3.109714593369455e+03 -5.947352066245216e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.760000000000000e+02 -2.527455240789196e+06 -5.202856233853055e+06 4.187630121831137e+06 -3.480955736523199e+03 -3.109591130005128e+03 -5.947443929179185e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.770000000000000e+02 -2.527524859044087e+06 -5.202918424015718e+06 4.187511172801882e+06 -3.480909798439539e+03 -3.109467663726891e+03 -5.947535791133470e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.780000000000000e+02 -2.527594476413406e+06 -5.202980611744302e+06 4.187392221871602e+06 -3.480863856137932e+03 -3.109344192964387e+03 -5.947627653510006e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.790000000000000e+02 -2.527664092787393e+06 -5.203042796922344e+06 4.187273269251268e+06 -3.480817917667700e+03 -3.109220729473021e+03 -5.947719505601583e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.800000000000000e+02 -2.527733708291537e+06 -5.203104979683014e+06 4.187154314699655e+06 -3.480771973754580e+03 -3.109097259656492e+03 -5.947811359773615e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.810000000000000e+02 -2.527803322894293e+06 -5.203167159992873e+06 4.187035358277359e+06 -3.480726026764428e+03 -3.108973787293450e+03 -5.947903212699704e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.820000000000000e+02 -2.527872936564419e+06 -5.203229337818753e+06 4.186916400044440e+06 -3.480680079865504e+03 -3.108850314421704e+03 -5.947995061599495e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.830000000000000e+02 -2.527942549333086e+06 -5.203291513193775e+06 4.186797439940935e+06 -3.480634129205553e+03 -3.108726839564555e+03 -5.948086909299189e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.840000000000000e+02 -2.528012161169040e+06 -5.203353686084769e+06 4.186678478026910e+06 -3.480588178341516e+03 -3.108603364207015e+03 -5.948178753122063e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.850000000000000e+02 -2.528081772056453e+06 -5.203415856474982e+06 4.186559514332782e+06 -3.480542226977674e+03 -3.108479892292539e+03 -5.948270591039424e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.860000000000000e+02 -2.528151382057992e+06 -5.203478024430912e+06 4.186440548738038e+06 -3.480496271640951e+03 -3.108356415254074e+03 -5.948362429604638e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.870000000000000e+02 -2.528220991173818e+06 -5.203540189952710e+06 4.186321581242388e+06 -3.480450313433479e+03 -3.108232932842846e+03 -5.948454268380419e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.880000000000000e+02 -2.528290599325289e+06 -5.203602352956991e+06 4.186202611996969e+06 -3.480404355756745e+03 -3.108109455042097e+03 -5.948546100067537e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.890000000000000e+02 -2.528360206559364e+06 -5.203664513493614e+06 4.186083640911457e+06 -3.480358395236108e+03 -3.107985976582869e+03 -5.948637929341915e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.900000000000000e+02 -2.528429812907616e+06 -5.203726671596023e+06 4.185964667925194e+06 -3.480312432642868e+03 -3.107862492074150e+03 -5.948729758785082e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.910000000000000e+02 -2.528499418307098e+06 -5.203788827197510e+06 4.185845693159138e+06 -3.480266468990772e+03 -3.107739010917353e+03 -5.948821582665397e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.920000000000000e+02 -2.528569022804780e+06 -5.203850980347902e+06 4.185726716522963e+06 -3.480220502416959e+03 -3.107615526586633e+03 -5.948913405565531e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.930000000000000e+02 -2.528638626385117e+06 -5.203913131030711e+06 4.185607738046555e+06 -3.480174534639270e+03 -3.107492040658397e+03 -5.949005225717609e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.940000000000000e+02 -2.528708229032278e+06 -5.203975279229169e+06 4.185488757760331e+06 -3.480128565740364e+03 -3.107368555424541e+03 -5.949097041810391e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.950000000000000e+02 -2.528777830808922e+06 -5.204037425009765e+06 4.185369775543763e+06 -3.480082591476354e+03 -3.107245063948884e+03 -5.949188859893647e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.960000000000000e+02 -2.528847431636709e+06 -5.204099568289403e+06 4.185250791547499e+06 -3.480036618123031e+03 -3.107121574370869e+03 -5.949280672192800e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.970000000000000e+02 -2.528917031515410e+06 -5.204161709067880e+06 4.185131805771931e+06 -3.479990643962803e+03 -3.106998087634392e+03 -5.949372479081177e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.980000000000000e+02 -2.528986630523678e+06 -5.204223847428593e+06 4.185012818065831e+06 -3.479944666040187e+03 -3.106874593695967e+03 -5.949464287655501e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.990000000000000e+02 -2.529056228598577e+06 -5.204285983304837e+06 4.184893828550175e+06 -3.479898686543225e+03 -3.106751100691982e+03 -5.949556092274071e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.000000000000000e+02 -2.529125825755672e+06 -5.204348116713146e+06 4.184774837194997e+06 -3.479852704817682e+03 -3.106627606733249e+03 -5.949647894323016e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.010000000000000e+02 -2.529195421995127e+06 -5.204410247653672e+06 4.184655844000007e+06 -3.479806722268152e+03 -3.106504110895375e+03 -5.949739693581736e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.020000000000000e+02 -2.529265017332500e+06 -5.204472376142949e+06 4.184536848935239e+06 -3.479760736372227e+03 -3.106380612459157e+03 -5.949831491762351e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.030000000000000e+02 -2.529334611736254e+06 -5.204534502147567e+06 4.184417852061291e+06 -3.479714748819099e+03 -3.106257114744570e+03 -5.949923286148356e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.040000000000000e+02 -2.529404205206558e+06 -5.204596625667688e+06 4.184298853377884e+06 -3.479668761618372e+03 -3.106133617155989e+03 -5.950015076022271e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.050000000000000e+02 -2.529473797790370e+06 -5.204658746753124e+06 4.184179852794658e+06 -3.479622770250917e+03 -3.106010114918139e+03 -5.950106866379616e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.060000000000000e+02 -2.529543389440449e+06 -5.204720865353839e+06 4.184060850402415e+06 -3.479576776988330e+03 -3.105886613772412e+03 -5.950198652861619e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.070000000000000e+02 -2.529612980172660e+06 -5.204782981486622e+06 4.183941846170674e+06 -3.479530783122827e+03 -3.105763110609473e+03 -5.950290436514563e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.080000000000000e+02 -2.529682569955375e+06 -5.204845095117990e+06 4.183822840160212e+06 -3.479484788298436e+03 -3.105639610738708e+03 -5.950382214588216e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.090000000000000e+02 -2.529752158882929e+06 -5.204907206347942e+06 4.183703832189580e+06 -3.479438788774374e+03 -3.105516101333669e+03 -5.950473996123436e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.100000000000000e+02 -2.529821746845314e+06 -5.204969315059884e+06 4.183584822470358e+06 -3.479392789568176e+03 -3.105392596853441e+03 -5.950565770511646e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.110000000000000e+02 -2.529891333905183e+06 -5.205031421320259e+06 4.183465810881990e+06 -3.479346787328649e+03 -3.105269089358217e+03 -5.950657543888593e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.120000000000000e+02 -2.529960920046995e+06 -5.205093525112578e+06 4.183346797454383e+06 -3.479300784122976e+03 -3.105145580029406e+03 -5.950749314524170e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.130000000000000e+02 -2.530030505286303e+06 -5.205155626453376e+06 4.183227782157564e+06 -3.479254777324508e+03 -3.105022068389683e+03 -5.950841084050414e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.140000000000000e+02 -2.530100089575895e+06 -5.205217725292614e+06 4.183108765082343e+06 -3.479208770398953e+03 -3.104898558946882e+03 -5.950932848170258e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.150000000000000e+02 -2.530169672947316e+06 -5.205279821663727e+06 4.182989746168042e+06 -3.479162762305696e+03 -3.104775048150907e+03 -5.951024609388308e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.160000000000000e+02 -2.530239255431824e+06 -5.205341915599880e+06 4.182870725354485e+06 -3.479116750265488e+03 -3.104651532523704e+03 -5.951116371074416e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.170000000000000e+02 -2.530308836982191e+06 -5.205404007051040e+06 4.182751702732485e+06 -3.479070736461543e+03 -3.104528017774788e+03 -5.951208128935662e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.180000000000000e+02 -2.530378417629972e+06 -5.205466096050635e+06 4.182632678241363e+06 -3.479024721132532e+03 -3.104404499419689e+03 -5.951299885326223e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.190000000000000e+02 -2.530447997343641e+06 -5.205528182565284e+06 4.182513651941733e+06 -3.478978704192719e+03 -3.104280982024012e+03 -5.951391637767565e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.200000000000000e+02 -2.530517576138751e+06 -5.205590266611506e+06 4.182394623803621e+06 -3.478932684895906e+03 -3.104157463755449e+03 -5.951483387660977e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.210000000000000e+02 -2.530587154015470e+06 -5.205652348189456e+06 4.182275593826740e+06 -3.478886664794456e+03 -3.104033943552738e+03 -5.951575134784482e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.220000000000000e+02 -2.530656730989248e+06 -5.205714427315559e+06 4.182156561981278e+06 -3.478840640800003e+03 -3.103910420741091e+03 -5.951666881119127e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.230000000000000e+02 -2.530726307028865e+06 -5.205776503956710e+06 4.182037528327350e+06 -3.478794616951558e+03 -3.103786898230976e+03 -5.951758622953481e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.240000000000000e+02 -2.530795882102796e+06 -5.205838578079533e+06 4.181918492925581e+06 -3.478748593220995e+03 -3.103663380508284e+03 -5.951850357824114e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.250000000000000e+02 -2.530865456352140e+06 -5.205900649833589e+06 4.181799455504385e+06 -3.478702562013998e+03 -3.103539850300702e+03 -5.951942099227790e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.260000000000000e+02 -2.530935029604441e+06 -5.205962719036100e+06 4.181680416395686e+06 -3.478656534338927e+03 -3.103416327740728e+03 -5.952033830310160e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.270000000000000e+02 -2.531004601969406e+06 -5.206024785803366e+06 4.181561375388292e+06 -3.478610502331785e+03 -3.103292800679273e+03 -5.952125561877589e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.280000000000000e+02 -2.531074173431208e+06 -5.206086850118638e+06 4.181442332512631e+06 -3.478564467199588e+03 -3.103169270793466e+03 -5.952217292374899e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.290000000000000e+02 -2.531143743958615e+06 -5.206148911948808e+06 4.181323287828818e+06 -3.478518431824653e+03 -3.103045740701235e+03 -5.952309018855351e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.300000000000000e+02 -2.531213313582893e+06 -5.206210971327028e+06 4.181204241276671e+06 -3.478472393753581e+03 -3.102922208135240e+03 -5.952400743848610e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.310000000000000e+02 -2.531282882256811e+06 -5.206273028203294e+06 4.181085192947020e+06 -3.478426354461337e+03 -3.102798678321173e+03 -5.952492463700685e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.320000000000000e+02 -2.531352450027613e+06 -5.206335082627640e+06 4.180966142748967e+06 -3.478380313768963e+03 -3.102675144557720e+03 -5.952584182205853e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.330000000000000e+02 -2.531422016879373e+06 -5.206397134583249e+06 4.180847090713113e+06 -3.478334270078085e+03 -3.102551610589661e+03 -5.952675898128033e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.340000000000000e+02 -2.531491582812251e+06 -5.206459184070262e+06 4.180728036839162e+06 -3.478288225613951e+03 -3.102428074447420e+03 -5.952767611396501e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.350000000000000e+02 -2.531561147810415e+06 -5.206521231071951e+06 4.180608981157543e+06 -3.478242179414863e+03 -3.102304539653908e+03 -5.952859320566615e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.360000000000000e+02 -2.531630711905114e+06 -5.206583275621441e+06 4.180489923608070e+06 -3.478196130232885e+03 -3.102181001593333e+03 -5.952951028836667e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.370000000000000e+02 -2.531700275080823e+06 -5.206645317702265e+06 4.180370864220661e+06 -3.478150080206726e+03 -3.102057461978447e+03 -5.953042734147646e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.380000000000000e+02 -2.531769837337393e+06 -5.206707357314316e+06 4.180251802995532e+06 -3.478104027456333e+03 -3.101933921456287e+03 -5.953134437120880e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.390000000000000e+02 -2.531839398690381e+06 -5.206769394474096e+06 4.180132739902704e+06 -3.478057971657122e+03 -3.101810378062382e+03 -5.953226139009755e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.400000000000000e+02 -2.531908959077197e+06 -5.206831429115269e+06 4.180013675062721e+06 -3.478011917716062e+03 -3.101686838545359e+03 -5.953317833534968e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.410000000000000e+02 -2.531978518591834e+06 -5.206893461337460e+06 4.179894608294552e+06 -3.477965858639845e+03 -3.101563292507706e+03 -5.953409530075877e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.420000000000000e+02 -2.532048077187086e+06 -5.206955491090681e+06 4.179775539689043e+06 -3.477919797227059e+03 -3.101439745408846e+03 -5.953501224162107e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.430000000000000e+02 -2.532117634831741e+06 -5.207017518341850e+06 4.179656469306328e+06 -3.477873736608164e+03 -3.101316200331856e+03 -5.953592912462959e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.440000000000000e+02 -2.532187191557040e+06 -5.207079543124091e+06 4.179537397086211e+06 -3.477827673791745e+03 -3.101192654327901e+03 -5.953684598162951e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.450000000000000e+02 -2.532256747378529e+06 -5.207141565453920e+06 4.179418322998704e+06 -3.477781607527628e+03 -3.101069105658102e+03 -5.953776282872264e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.460000000000000e+02 -2.532326302312058e+06 -5.207203585348100e+06 4.179299247013303e+06 -3.477735538684141e+03 -3.100945551255605e+03 -5.953867967831296e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.470000000000000e+02 -2.532395856294645e+06 -5.207265602739950e+06 4.179180169251251e+06 -3.477689468918800e+03 -3.100822000039291e+03 -5.953959647255618e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.480000000000000e+02 -2.532465409326447e+06 -5.207327617629631e+06 4.179061089712257e+06 -3.477643399756938e+03 -3.100698450743640e+03 -5.954051321050308e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.490000000000000e+02 -2.532534961485764e+06 -5.207389630100122e+06 4.178942008245478e+06 -3.477597325645600e+03 -3.100574894987720e+03 -5.954142996729149e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.500000000000000e+02 -2.532604512694026e+06 -5.207451640068214e+06 4.178822925002210e+06 -3.477551251119814e+03 -3.100451342012116e+03 -5.954234666833783e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.510000000000000e+02 -2.532674063029822e+06 -5.207513647617147e+06 4.178703839831088e+06 -3.477505172851328e+03 -3.100327781421510e+03 -5.954326338831282e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.520000000000000e+02 -2.532743612398905e+06 -5.207575652647112e+06 4.178584752913621e+06 -3.477459094943063e+03 -3.100204225781325e+03 -5.954418003654506e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.530000000000000e+02 -2.532813160863875e+06 -5.207637655224457e+06 4.178465664129177e+06 -3.477413013771984e+03 -3.100080667226951e+03 -5.954509667527337e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.540000000000000e+02 -2.532882708377836e+06 -5.207699655299498e+06 4.178346573568110e+06 -3.477366933330373e+03 -3.099957110780741e+03 -5.954601325602356e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.550000000000000e+02 -2.532952255003403e+06 -5.207761652938565e+06 4.178227481109784e+06 -3.477320849254897e+03 -3.099833549306998e+03 -5.954692984085695e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.560000000000000e+02 -2.533021800740432e+06 -5.207823648141554e+06 4.178108386754416e+06 -3.477274760497135e+03 -3.099709983462596e+03 -5.954784643159989e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.570000000000000e+02 -2.533091345542021e+06 -5.207885640858774e+06 4.177989290592367e+06 -3.477228671745966e+03 -3.099586417789459e+03 -5.954876297880880e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.580000000000000e+02 -2.533160889407946e+06 -5.207947631090025e+06 4.177870192624028e+06 -3.477182581378533e+03 -3.099462852906512e+03 -5.954967948751356e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.590000000000000e+02 -2.533230432354045e+06 -5.208009618852071e+06 4.177751092818897e+06 -3.477136489767666e+03 -3.099339286676714e+03 -5.955059596756199e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.600000000000000e+02 -2.533299974364504e+06 -5.208071604128188e+06 4.177631991207413e+06 -3.477090396975359e+03 -3.099215721097561e+03 -5.955151240761684e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.610000000000000e+02 -2.533369515470550e+06 -5.208133586951490e+06 4.177512887729368e+06 -3.477044300715189e+03 -3.099092153175604e+03 -5.955242883607783e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.620000000000000e+02 -2.533439055688030e+06 -5.208195567338728e+06 4.177393782354244e+06 -3.476998201981766e+03 -3.098968579011634e+03 -5.955334526927045e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.630000000000000e+02 -2.533508594954068e+06 -5.208257545223361e+06 4.177274675203141e+06 -3.476952102439130e+03 -3.098845008142509e+03 -5.955426164595355e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.640000000000000e+02 -2.533578133268530e+06 -5.208319520605274e+06 4.177155566276291e+06 -3.476906002403385e+03 -3.098721440105108e+03 -5.955517796704106e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.650000000000000e+02 -2.533647670694314e+06 -5.208381493551051e+06 4.177036455452519e+06 -3.476859899865304e+03 -3.098597866242447e+03 -5.955609429071188e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.660000000000000e+02 -2.533717207246956e+06 -5.208443464077184e+06 4.176917342701826e+06 -3.476813791995583e+03 -3.098474285936752e+03 -5.955701063508003e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.670000000000000e+02 -2.533786742785187e+06 -5.208505432034099e+06 4.176798228296423e+06 -3.476767687257368e+03 -3.098350716152355e+03 -5.955792686261631e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.680000000000000e+02 -2.533856277481660e+06 -5.208567397604628e+06 4.176679111903592e+06 -3.476721577022417e+03 -3.098227135070235e+03 -5.955884313846846e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.690000000000000e+02 -2.533925811226479e+06 -5.208629360672401e+06 4.176559993735097e+06 -3.476675466525551e+03 -3.098103556675346e+03 -5.955975935832350e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.700000000000000e+02 -2.533995344003819e+06 -5.208691321220712e+06 4.176440873821396e+06 -3.476629356161864e+03 -3.097979983199790e+03 -5.956067550782876e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.710000000000000e+02 -2.534064875939289e+06 -5.208753279382550e+06 4.176321751920412e+06 -3.476583240249417e+03 -3.097856398547272e+03 -5.956159170524445e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.720000000000000e+02 -2.534134406922889e+06 -5.208815235041477e+06 4.176202628244097e+06 -3.476537123633761e+03 -3.097732816682022e+03 -5.956250784841023e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.730000000000000e+02 -2.534203936970454e+06 -5.208877188214261e+06 4.176083502761944e+06 -3.476491006595153e+03 -3.097609235347577e+03 -5.956342394830792e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.740000000000000e+02 -2.534273466144581e+06 -5.208939138967187e+06 4.175964375353276e+06 -3.476444884934059e+03 -3.097485647081244e+03 -5.956434006789511e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.750000000000000e+02 -2.534342994319687e+06 -5.209001087167336e+06 4.175845246260114e+06 -3.476398765134047e+03 -3.097362067611075e+03 -5.956525608679549e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.760000000000000e+02 -2.534412521637049e+06 -5.209063032964270e+06 4.175726115210143e+06 -3.476352641025897e+03 -3.097238478443996e+03 -5.956617213898488e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.770000000000000e+02 -2.534482048018132e+06 -5.209124976274868e+06 4.175606982354712e+06 -3.476306515207586e+03 -3.097114890570501e+03 -5.956708815039647e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.780000000000000e+02 -2.534551573478480e+06 -5.209186917115619e+06 4.175487847663818e+06 -3.476260387077199e+03 -3.096991301622994e+03 -5.956800413720512e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.790000000000000e+02 -2.534621098018253e+06 -5.209248855486680e+06 4.175368711137176e+06 -3.476214258286552e+03 -3.096867710920439e+03 -5.956892009457657e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.800000000000000e+02 -2.534690621652998e+06 -5.209310791404532e+06 4.175249572744771e+06 -3.476168125970558e+03 -3.096744117335866e+03 -5.956983604361130e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.810000000000000e+02 -2.534760144366890e+06 -5.209372724852464e+06 4.175130432517065e+06 -3.476121991386222e+03 -3.096620523004272e+03 -5.957075196601304e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.820000000000000e+02 -2.534829666144418e+06 -5.209434655814033e+06 4.175011290483991e+06 -3.476075856874229e+03 -3.096496928628381e+03 -5.957166784574573e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.830000000000000e+02 -2.534899186985347e+06 -5.209496584289035e+06 4.174892146645941e+06 -3.476029720278234e+03 -3.096373335426981e+03 -5.957258368730537e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.840000000000000e+02 -2.534968706921191e+06 -5.209558510310818e+06 4.174773000942173e+06 -3.475983581990940e+03 -3.096249738681566e+03 -5.957349951464091e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.850000000000000e+02 -2.535038225920461e+06 -5.209620433846080e+06 4.174653853433366e+06 -3.475937442267467e+03 -3.096126142793324e+03 -5.957441530218565e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.860000000000000e+02 -2.535107744045722e+06 -5.209682354961089e+06 4.174534703998823e+06 -3.475891297138106e+03 -3.096002540552277e+03 -5.957533111027722e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.870000000000000e+02 -2.535177261218762e+06 -5.209744273573010e+06 4.174415552789407e+06 -3.475845153584518e+03 -3.095878939938062e+03 -5.957624685868633e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.880000000000000e+02 -2.535246777439434e+06 -5.209806189681747e+06 4.174296399805334e+06 -3.475799008765764e+03 -3.095755342376871e+03 -5.957716255432647e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.890000000000000e+02 -2.535316292785983e+06 -5.209868103370152e+06 4.174177244895684e+06 -3.475752859221906e+03 -3.095631738346297e+03 -5.957807826761303e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.900000000000000e+02 -2.535385807195875e+06 -5.209930014571999e+06 4.174058088181087e+06 -3.475706709851388e+03 -3.095508134031825e+03 -5.957899393903029e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.910000000000000e+02 -2.535455320668964e+06 -5.209991923287179e+06 4.173938929661764e+06 -3.475660558576144e+03 -3.095384531001605e+03 -5.957990957074388e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.920000000000000e+02 -2.535524833267819e+06 -5.210053829581950e+06 4.173819769217013e+06 -3.475614402554636e+03 -3.095260921426484e+03 -5.958082522062239e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.930000000000000e+02 -2.535594344898548e+06 -5.210115733356913e+06 4.173700607027936e+06 -3.475568248185594e+03 -3.095137315645296e+03 -5.958174079849829e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.940000000000000e+02 -2.535663855592367e+06 -5.210177634645131e+06 4.173581443034293e+06 -3.475522092568368e+03 -3.095013710427361e+03 -5.958265633723200e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.950000000000000e+02 -2.535733365427508e+06 -5.210239533529455e+06 4.173462277085139e+06 -3.475475930598551e+03 -3.094890097367995e+03 -5.958357190960815e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.960000000000000e+02 -2.535802874310093e+06 -5.210301429910487e+06 4.173343109361588e+06 -3.475429770009434e+03 -3.094766485881810e+03 -5.958448742362305e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.970000000000000e+02 -2.535872382286896e+06 -5.210363323837797e+06 4.173223939773328e+06 -3.475383605217422e+03 -3.094642872116037e+03 -5.958540292949284e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.980000000000000e+02 -2.535941889295395e+06 -5.210425215245184e+06 4.173104768441013e+06 -3.475337442643626e+03 -3.094519261923564e+03 -5.958631836164661e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.990000000000000e+02 -2.536011395445165e+06 -5.210487104248654e+06 4.172985595153211e+06 -3.475291273870997e+03 -3.094395643482735e+03 -5.958723382887320e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.000000000000000e+02 -2.536080900642022e+06 -5.210548990748567e+06 4.172866420091569e+06 -3.475245104405415e+03 -3.094272028003983e+03 -5.958814924087216e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.010000000000000e+02 -2.536150404870463e+06 -5.210610874728486e+06 4.172747243286032e+06 -3.475198937065527e+03 -3.094148415979946e+03 -5.958906458029584e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.020000000000000e+02 -2.536219908240059e+06 -5.210672756304415e+06 4.172628064525166e+06 -3.475152763581050e+03 -3.094024795983476e+03 -5.958997995298553e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.030000000000000e+02 -2.536289410672306e+06 -5.210734635393297e+06 4.172508883960372e+06 -3.475106588487868e+03 -3.093901176688572e+03 -5.959089528764757e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.040000000000000e+02 -2.536358912183038e+06 -5.210796512011875e+06 4.172389701561134e+06 -3.475060412798353e+03 -3.093777555556038e+03 -5.959181059299620e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.050000000000000e+02 -2.536428412772125e+06 -5.210858386160035e+06 4.172270517327666e+06 -3.475014234645467e+03 -3.093653933401617e+03 -5.959272587424034e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.060000000000000e+02 -2.536497912455094e+06 -5.210920257854249e+06 4.172151331229956e+06 -3.474968053087982e+03 -3.093530308866403e+03 -5.959364114374401e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.070000000000000e+02 -2.536567411200766e+06 -5.210982127061501e+06 4.172032143328192e+06 -3.474921871668868e+03 -3.093406683982331e+03 -5.959455637192781e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.080000000000000e+02 -2.536636909024579e+06 -5.211043993798174e+06 4.171912953592528e+06 -3.474875687426482e+03 -3.093283058523812e+03 -5.959547157541463e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.090000000000000e+02 -2.536706405926686e+06 -5.211105858064421e+06 4.171793762022678e+06 -3.474829502090960e+03 -3.093159431583613e+03 -5.959638675021029e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.100000000000000e+02 -2.536775901922627e+06 -5.211167719876718e+06 4.171674568588616e+06 -3.474783313594771e+03 -3.093035801710982e+03 -5.959730191503083e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.110000000000000e+02 -2.536845396949588e+06 -5.211229579168613e+06 4.171555373411536e+06 -3.474737125674483e+03 -3.092912176310601e+03 -5.959821700974571e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.120000000000000e+02 -2.536914891117411e+06 -5.211291436056331e+06 4.171436176279459e+06 -3.474690932955898e+03 -3.092788541738738e+03 -5.959913213730310e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.130000000000000e+02 -2.536984384331943e+06 -5.211353290440279e+06 4.171316977374052e+06 -3.474644739659256e+03 -3.092664910058641e+03 -5.960004720944091e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.140000000000000e+02 -2.537053876593049e+06 -5.211415142320342e+06 4.171197776695549e+06 -3.474598545980087e+03 -3.092541281281236e+03 -5.960096222508801e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.150000000000000e+02 -2.537123368010581e+06 -5.211476991812726e+06 4.171078574031952e+06 -3.474552346964123e+03 -3.092417641188599e+03 -5.960187728815355e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.160000000000000e+02 -2.537192858427701e+06 -5.211538838751536e+06 4.170959369685916e+06 -3.474506149812206e+03 -3.092294009590596e+03 -5.960279225231571e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.170000000000000e+02 -2.537262347938285e+06 -5.211600683236125e+06 4.170840163476210e+06 -3.474459949422066e+03 -3.092170375286581e+03 -5.960370720565817e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.180000000000000e+02 -2.537331836558175e+06 -5.211662525283219e+06 4.170720955372295e+06 -3.474413746679926e+03 -3.092046735239717e+03 -5.960462216027485e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.190000000000000e+02 -2.537401324224552e+06 -5.211724364826408e+06 4.170601745495372e+06 -3.474367543092452e+03 -3.091923098120132e+03 -5.960553706067403e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.200000000000000e+02 -2.537470810999950e+06 -5.211786201931877e+06 4.170482533724682e+06 -3.474321335343801e+03 -3.091799456524707e+03 -5.960645196477108e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.210000000000000e+02 -2.537540296853196e+06 -5.211848036566620e+06 4.170363320120431e+06 -3.474275126733637e+03 -3.091675812771517e+03 -5.960736684269069e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.220000000000000e+02 -2.537609781752719e+06 -5.211909868697298e+06 4.170244104743501e+06 -3.474228917066023e+03 -3.091552172389351e+03 -5.960828166505859e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.230000000000000e+02 -2.537679265730020e+06 -5.211971698357205e+06 4.170124887533114e+06 -3.474182706691759e+03 -3.091428529974218e+03 -5.960919645976178e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.240000000000000e+02 -2.537748748831957e+06 -5.212033525595954e+06 4.170005668398747e+06 -3.474136490924609e+03 -3.091304881329234e+03 -5.961011127419143e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.250000000000000e+02 -2.537818230980054e+06 -5.212095350330566e+06 4.169886447491861e+06 -3.474090274631720e+03 -3.091181235545225e+03 -5.961102603311598e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.260000000000000e+02 -2.537887712174487e+06 -5.212157172561189e+06 4.169767224812168e+06 -3.474044059689157e+03 -3.091057591180564e+03 -5.961194073472526e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.270000000000000e+02 -2.537957192493439e+06 -5.212218992370577e+06 4.169648000208651e+06 -3.473997839224975e+03 -3.090933940799625e+03 -5.961285545555079e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.280000000000000e+02 -2.538026671858445e+06 -5.212280809675759e+06 4.169528773832774e+06 -3.473951618162496e+03 -3.090810293104063e+03 -5.961377012221832e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.290000000000000e+02 -2.538096150332332e+06 -5.212342624543162e+06 4.169409545563254e+06 -3.473905394764296e+03 -3.090686639788314e+03 -5.961468478938658e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.300000000000000e+02 -2.538165627867965e+06 -5.212404436922971e+06 4.169290315491057e+06 -3.473859169618544e+03 -3.090562987618233e+03 -5.961559941682362e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.310000000000000e+02 -2.538235104496540e+06 -5.212466246848208e+06 4.169171083555907e+06 -3.473812941287393e+03 -3.090439332399142e+03 -5.961651403503991e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.320000000000000e+02 -2.538304580171218e+06 -5.212528054269321e+06 4.169051849848270e+06 -3.473766713927218e+03 -3.090315679192423e+03 -5.961742859465760e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.330000000000000e+02 -2.538374054907429e+06 -5.212589859202681e+06 4.168932614338291e+06 -3.473720484531573e+03 -3.090192027401135e+03 -5.961834311456083e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.340000000000000e+02 -2.538443528783663e+06 -5.212651661731269e+06 4.168813376874419e+06 -3.473674250793022e+03 -3.090068366062520e+03 -5.961925766694844e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.350000000000000e+02 -2.538513001705786e+06 -5.212713461755579e+06 4.168694137638383e+06 -3.473628016148570e+03 -3.089944707691386e+03 -5.962017216523222e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.360000000000000e+02 -2.538582473689335e+06 -5.212775259292062e+06 4.168574896600165e+06 -3.473581780316690e+03 -3.089821050470443e+03 -5.962108662085910e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.370000000000000e+02 -2.538651944765798e+06 -5.212837054373999e+06 4.168455653698962e+06 -3.473535542836167e+03 -3.089697389148655e+03 -5.962200106506650e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.380000000000000e+02 -2.538721414919367e+06 -5.212898846984717e+06 4.168336408965248e+06 -3.473489302451590e+03 -3.089573727260673e+03 -5.962291548495177e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.390000000000000e+02 -2.538790884149915e+06 -5.212960637124099e+06 4.168217162399256e+06 -3.473443060254812e+03 -3.089450064255557e+03 -5.962382987787629e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.400000000000000e+02 -2.538860352473259e+06 -5.213022424808860e+06 4.168097913970437e+06 -3.473396816082805e+03 -3.089326397620199e+03 -5.962474425848732e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.410000000000000e+02 -2.538929819842275e+06 -5.213084209989202e+06 4.167978663769774e+06 -3.473350571152407e+03 -3.089202733949483e+03 -5.962565858425438e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.420000000000000e+02 -2.538999286272492e+06 -5.213145992681576e+06 4.167859411767240e+06 -3.473304325071102e+03 -3.089079071096553e+03 -5.962657286900666e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.430000000000000e+02 -2.539068751811054e+06 -5.213207772935818e+06 4.167740157871779e+06 -3.473258076008420e+03 -3.088955402717753e+03 -5.962748715707418e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.440000000000000e+02 -2.539138216457831e+06 -5.213269550751816e+06 4.167620902083613e+06 -3.473211823123113e+03 -3.088831729739261e+03 -5.962840144773108e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.450000000000000e+02 -2.539207680134365e+06 -5.213331326046648e+06 4.167501644554242e+06 -3.473165570094523e+03 -3.088708061423865e+03 -5.962931567103256e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.460000000000000e+02 -2.539277142934794e+06 -5.213393098919833e+06 4.167382385101842e+06 -3.473119313812964e+03 -3.088584385802474e+03 -5.963022990882541e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.470000000000000e+02 -2.539346604780573e+06 -5.213454869288368e+06 4.167263123878086e+06 -3.473073056411621e+03 -3.088460713062916e+03 -5.963114409411030e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.480000000000000e+02 -2.539416065687529e+06 -5.213516637168963e+06 4.167143860852437e+06 -3.473026799157311e+03 -3.088337040416556e+03 -5.963205823562903e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.490000000000000e+02 -2.539485525671183e+06 -5.213578402578076e+06 4.167024595994851e+06 -3.472980539198872e+03 -3.088213367035255e+03 -5.963297235271678e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.500000000000000e+02 -2.539554984747057e+06 -5.213640165532142e+06 4.166905329275298e+06 -3.472934276272583e+03 -3.088089690868231e+03 -5.963388645799789e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.510000000000000e+02 -2.539624442946634e+06 -5.213701926064422e+06 4.166786060632965e+06 -3.472888009634420e+03 -3.087966007017531e+03 -5.963480058221228e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.520000000000000e+02 -2.539693900144499e+06 -5.213763684042362e+06 4.166666790310154e+06 -3.472841745189824e+03 -3.087842331907572e+03 -5.963571460458507e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.530000000000000e+02 -2.539763356450129e+06 -5.213825439581741e+06 4.166547518095270e+06 -3.472795476449918e+03 -3.087718652095516e+03 -5.963662863255196e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.540000000000000e+02 -2.539832811832370e+06 -5.213887192649591e+06 4.166428244048545e+06 -3.472749206984718e+03 -3.087594970397148e+03 -5.963754263214370e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.550000000000000e+02 -2.539902266291083e+06 -5.213948943245807e+06 4.166308968170195e+06 -3.472702935112821e+03 -3.087471287644781e+03 -5.963845660751173e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.560000000000000e+02 -2.539971719826132e+06 -5.214010691370275e+06 4.166189690460450e+06 -3.472656660647602e+03 -3.087347604354695e+03 -5.963937055679067e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.570000000000000e+02 -2.540041172453334e+06 -5.214072437039701e+06 4.166070410888754e+06 -3.472610384586315e+03 -3.087223917241589e+03 -5.964028449283624e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.580000000000000e+02 -2.540110624141146e+06 -5.214134180220770e+06 4.165951129516030e+06 -3.472564106992138e+03 -3.087100230921209e+03 -5.964119838999363e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.590000000000000e+02 -2.540180074905372e+06 -5.214195920930200e+06 4.165831846311721e+06 -3.472517827593781e+03 -3.086976543524002e+03 -5.964211225992847e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.600000000000000e+02 -2.540249524745886e+06 -5.214257659167871e+06 4.165712561276052e+06 -3.472471546517685e+03 -3.086852854749322e+03 -5.964302610363470e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.610000000000000e+02 -2.540318973631229e+06 -5.214319394900571e+06 4.165593274469773e+06 -3.472425264506935e+03 -3.086729169008642e+03 -5.964393989305922e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.620000000000000e+02 -2.540388421639858e+06 -5.214381128211199e+06 4.165473985741280e+06 -3.472378979351633e+03 -3.086605475583067e+03 -5.964485369846188e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.630000000000000e+02 -2.540457868740314e+06 -5.214442859066553e+06 4.165354695151314e+06 -3.472332690425733e+03 -3.086481779830602e+03 -5.964576749369189e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.640000000000000e+02 -2.540527314854178e+06 -5.214504587383762e+06 4.165235402851431e+06 -3.472286403031073e+03 -3.086358090222436e+03 -5.964668120479872e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.650000000000000e+02 -2.540596760075555e+06 -5.214566313262275e+06 4.165116108659748e+06 -3.472240113053077e+03 -3.086234395104798e+03 -5.964759491703674e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.660000000000000e+02 -2.540666204388647e+06 -5.214628036685437e+06 4.164996812606747e+06 -3.472193819432039e+03 -3.086110697536170e+03 -5.964850861912110e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.670000000000000e+02 -2.540735647762005e+06 -5.214689757620031e+06 4.164877514753194e+06 -3.472147524626622e+03 -3.085987000631491e+03 -5.964942228122276e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.680000000000000e+02 -2.540805090211443e+06 -5.214751476082762e+06 4.164758215068522e+06 -3.472101228618389e+03 -3.085863302096374e+03 -5.965033591602135e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.690000000000000e+02 -2.540874531721180e+06 -5.214813192056972e+06 4.164638913583232e+06 -3.472054931709371e+03 -3.085739604269261e+03 -5.965124950912835e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.700000000000000e+02 -2.540943972338034e+06 -5.214874905592181e+06 4.164519610206735e+06 -3.472008630073586e+03 -3.085615902098957e+03 -5.965216310807292e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.710000000000000e+02 -2.541013411983892e+06 -5.214936616605820e+06 4.164400305090092e+06 -3.471962330544235e+03 -3.085492203452180e+03 -5.965307663430275e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.720000000000000e+02 -2.541082850768108e+06 -5.214998325213497e+06 4.164280998021806e+06 -3.471916024509840e+03 -3.085368496832050e+03 -5.965399019548800e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.730000000000000e+02 -2.541152288581256e+06 -5.215060031299558e+06 4.164161689213479e+06 -3.471869720287264e+03 -3.085244794097768e+03 -5.965490368350162e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.740000000000000e+02 -2.541221725485820e+06 -5.215121734930061e+06 4.164042378544249e+06 -3.471823412715531e+03 -3.085121088506923e+03 -5.965581716205835e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.750000000000000e+02 -2.541291161497311e+06 -5.215183436121439e+06 4.163923065984072e+06 -3.471777101070932e+03 -3.084997378384724e+03 -5.965673064408739e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.760000000000000e+02 -2.541360596521970e+06 -5.215245134774590e+06 4.163803751714285e+06 -3.471730792042083e+03 -3.084873673729285e+03 -5.965764404011914e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.770000000000000e+02 -2.541430030653586e+06 -5.215306830988654e+06 4.163684435553480e+06 -3.471684478995005e+03 -3.084749964552524e+03 -5.965855743928523e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.780000000000000e+02 -2.541499463860714e+06 -5.215368524730432e+06 4.163565117562424e+06 -3.471638163550809e+03 -3.084626254317550e+03 -5.965947081420037e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.790000000000000e+02 -2.541568896159159e+06 -5.215430216016619e+06 4.163445797710557e+06 -3.471591846042745e+03 -3.084502540775166e+03 -5.966038417546500e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.800000000000000e+02 -2.541638327517492e+06 -5.215491904814019e+06 4.163326476058644e+06 -3.471545527582703e+03 -3.084378827574809e+03 -5.966129749731558e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.810000000000000e+02 -2.541707757951216e+06 -5.215553591139067e+06 4.163207152576640e+06 -3.471499206148084e+03 -3.084255114077550e+03 -5.966221079373479e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.820000000000000e+02 -2.541777187460503e+06 -5.215615274991903e+06 4.163087827264256e+06 -3.471452884416565e+03 -3.084131398427397e+03 -5.966312406102048e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.830000000000000e+02 -2.541846616045112e+06 -5.215676956372337e+06 4.162968500121878e+06 -3.471406559490521e+03 -3.084007682219136e+03 -5.966403730544587e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.840000000000000e+02 -2.541916043720856e+06 -5.215738635297053e+06 4.162849171118948e+06 -3.471360232797893e+03 -3.083883962472959e+03 -5.966495053594060e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.850000000000000e+02 -2.541985470440640e+06 -5.215800311716329e+06 4.162729840346509e+06 -3.471313905473592e+03 -3.083760245352311e+03 -5.966586371285354e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.860000000000000e+02 -2.542054896235640e+06 -5.215861985663131e+06 4.162610507744245e+06 -3.471267576104204e+03 -3.083636527663166e+03 -5.966677686100986e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.870000000000000e+02 -2.542124321152959e+06 -5.215923657187209e+06 4.162491173221020e+06 -3.471221242769955e+03 -3.083512801959234e+03 -5.966769003114903e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.880000000000000e+02 -2.542193745082913e+06 -5.215985326172713e+06 4.162371836989007e+06 -3.471174910867212e+03 -3.083389083398621e+03 -5.966860311227209e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.890000000000000e+02 -2.542263168119261e+06 -5.216046992718729e+06 4.162252498866767e+06 -3.471128574683329e+03 -3.083265360038085e+03 -5.966951619940234e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.900000000000000e+02 -2.542332590246519e+06 -5.216108656808881e+06 4.162133158884283e+06 -3.471082236879047e+03 -3.083141632915121e+03 -5.967042927307079e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.910000000000000e+02 -2.542402011466727e+06 -5.216170318441744e+06 4.162013817042187e+06 -3.471036004557638e+03 -3.083017837696317e+03 -5.967134213091153e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.920000000000000e+02 -2.542471431747680e+06 -5.216231977590552e+06 4.161894473393484e+06 -3.470989553858479e+03 -3.082894175987033e+03 -5.967225534609332e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.930000000000000e+02 -2.542540851053240e+06 -5.216293634213495e+06 4.161775128012762e+06 -3.470943213191770e+03 -3.082770450740905e+03 -5.967316829691720e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.940000000000000e+02 -2.542610269449464e+06 -5.216355288380384e+06 4.161655780772176e+06 -3.470896869234812e+03 -3.082646722735084e+03 -5.967408123743595e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.950000000000000e+02 -2.542679686920554e+06 -5.216416940074584e+06 4.161536431702226e+06 -3.470850522525856e+03 -3.082522994249628e+03 -5.967499415237392e+03 2.243751877800000e-03 6.383592897800000e-04 1.423530972300000e-03 2.216684514500000e-03 1.745510200300000e-03 3.985888530500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.960000000000000e+02 -2.542749103513624e+06 -5.216478589345821e+06 4.161417080711782e+06 -3.470804172556561e+03 -3.082399257795312e+03 -5.967590708537438e+03 2.243504906400000e-03 6.378976975300000e-04 1.423490700900000e-03 2.216035043500000e-03 1.745179259300000e-03 3.986828046300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.970000000000000e+02 -2.542818519150191e+06 -5.216540236111261e+06 4.161297727952641e+06 -3.470757821363260e+03 -3.082275524960754e+03 -5.967681996243054e+03 2.243504906400000e-03 6.378976975300000e-04 1.423490700900000e-03 2.216035043500000e-03 1.745179259300000e-03 3.986828046300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.980000000000000e+02 -2.542887933846076e+06 -5.216601880387570e+06 4.161178373394233e+06 -3.470711470651179e+03 -3.082151791616007e+03 -5.967773279732950e+03 2.243504906400000e-03 6.378976975300000e-04 1.423490700900000e-03 2.216035043500000e-03 1.745179259300000e-03 3.986828046300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.990000000000000e+02 -2.542957347632427e+06 -5.216663522207705e+06 4.161059016976217e+06 -3.470665116091250e+03 -3.082028056038613e+03 -5.967864562192040e+03 2.243504906400000e-03 6.378976975300000e-04 1.423490700900000e-03 2.216035043500000e-03 1.745179259300000e-03 3.986828046300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.000000000000000e+02 -2.543026760493457e+06 -5.216725161555022e+06 4.160939658729102e+06 -3.470618759228999e+03 -3.081904319345090e+03 -5.967955842208585e+03 2.243504906400000e-03 6.378976975300000e-04 1.423490700900000e-03 2.216035043500000e-03 1.745179259300000e-03 3.986828046300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.010000000000000e+02 -2.543096172371968e+06 -5.216786798394225e+06 4.160820298745765e+06 -3.470571882830208e+03 -3.081781292733073e+03 -5.968046998202596e+03 2.243504906400000e-03 6.378976975300000e-04 1.423490700900000e-03 2.216035043500000e-03 1.745179259300000e-03 3.986828046300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.020000000000000e+02 -2.543165583333858e+06 -5.216848432772316e+06 4.160700936914696e+06 -3.470525470749469e+03 -3.081657623802848e+03 -5.968138261181654e+03 2.243504906400000e-03 6.378976975300000e-04 1.423490700900000e-03 2.216035043500000e-03 1.745179259300000e-03 3.986828046300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.030000000000000e+02 -2.543234993402550e+06 -5.216910064711558e+06 4.160581573192302e+06 -3.470479106570777e+03 -3.081533879737460e+03 -5.968229536244852e+03 2.243504906400000e-03 6.378976975300000e-04 1.423490700900000e-03 2.216035043500000e-03 1.745179259300000e-03 3.986828046300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.040000000000000e+02 -2.543304402499038e+06 -5.216971694128490e+06 4.160462207731527e+06 -3.470432744381083e+03 -3.081410139541585e+03 -5.968320803914473e+03 2.243504906400000e-03 6.378976975300000e-04 1.423490700900000e-03 2.216035043500000e-03 1.745179259300000e-03 3.986828046300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.050000000000000e+02 -2.543373810670126e+06 -5.217033321072570e+06 4.160342840441740e+06 -3.470386379757918e+03 -3.081286398356348e+03 -5.968412069140187e+03 2.243504906400000e-03 6.378976975300000e-04 1.423490700900000e-03 2.216035043500000e-03 1.745179259300000e-03 3.986828046300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.060000000000000e+02 -2.543443217946964e+06 -5.217094945576737e+06 4.160223471262598e+06 -3.470340010768088e+03 -3.081162652734968e+03 -5.968503334809268e+03 2.243257896400000e-03 6.374361456000000e-04 1.423450215500000e-03 2.215385747100000e-03 1.744848027300000e-03 3.987767481000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.070000000000000e+02 -2.543512624282776e+06 -5.217156567591571e+06 4.160104100284664e+06 -3.470293641971554e+03 -3.081038907006670e+03 -5.968594596191386e+03 2.243257896400000e-03 6.374361456000000e-04 1.423450215500000e-03 2.215385747100000e-03 1.744848027300000e-03 3.987767481000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.080000000000000e+02 -2.543582029677334e+06 -5.217218187116873e+06 4.159984727508331e+06 -3.470247271296504e+03 -3.080915162381920e+03 -5.968685853696812e+03 2.243257896400000e-03 6.374361456000000e-04 1.423450215500000e-03 2.215385747100000e-03 1.744848027300000e-03 3.987767481000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.090000000000000e+02 -2.543651434162080e+06 -5.217279804185840e+06 4.159865352872741e+06 -3.470200898671889e+03 -3.080791414423486e+03 -5.968777109790696e+03 2.243257896400000e-03 6.374361456000000e-04 1.423450215500000e-03 2.215385747100000e-03 1.744848027300000e-03 3.987767481000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.100000000000000e+02 -2.543720837752524e+06 -5.217341418814879e+06 4.159745976347828e+06 -3.470154521903454e+03 -3.080667661711423e+03 -5.968868366385671e+03 2.243257896400000e-03 6.374361456000000e-04 1.423450215500000e-03 2.215385747100000e-03 1.744848027300000e-03 3.987767481000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.110000000000000e+02 -2.543790240319870e+06 -5.217403030872544e+06 4.159626598174757e+06 -3.470107973017159e+03 -3.080543960911652e+03 -5.968959679373005e+03 2.243257896400000e-03 6.374361456000000e-04 1.423450215500000e-03 2.215385747100000e-03 1.744848027300000e-03 3.987767481000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.120000000000000e+02 -2.543859642020476e+06 -5.217464640519843e+06 4.159507218058183e+06 -3.470061576673788e+03 -3.080420211329319e+03 -5.969050935841989e+03 2.243257896400000e-03 6.374361456000000e-04 1.423450215500000e-03 2.215385747100000e-03 1.744848027300000e-03 3.987767481000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.130000000000000e+02 -2.543929042825683e+06 -5.217526247726103e+06 4.159387836054339e+06 -3.470015193308775e+03 -3.080296453186201e+03 -5.969142186031919e+03 2.243257896400000e-03 6.374361456000000e-04 1.423450215500000e-03 2.215385747100000e-03 1.744848027300000e-03 3.987767481000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.140000000000000e+02 -2.543998442611184e+06 -5.217587852360097e+06 4.159268452403858e+06 -3.469968812913168e+03 -3.080172705400195e+03 -5.969233424773527e+03 2.243257896400000e-03 6.374361456000000e-04 1.423450215500000e-03 2.215385747100000e-03 1.744848027300000e-03 3.987767481000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.150000000000000e+02 -2.544067841517942e+06 -5.217649454570641e+06 4.159149066833855e+06 -3.469922429289966e+03 -3.080048949889995e+03 -5.969324665166821e+03 2.243257896400000e-03 6.374361456000000e-04 1.423450215500000e-03 2.215385747100000e-03 1.744848027300000e-03 3.987767481000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.160000000000000e+02 -2.544137239545817e+06 -5.217711054357621e+06 4.159029679344544e+06 -3.469876040483955e+03 -3.079925188058607e+03 -5.969415907455599e+03 2.243010847600000e-03 6.369746338200000e-04 1.423409516000000e-03 2.214736624900000e-03 1.744516504000000e-03 3.988706834900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.170000000000000e+02 -2.544206636569523e+06 -5.217772651588790e+06 4.158910290178474e+06 -3.469829653606804e+03 -3.079801434619184e+03 -5.969507139910719e+03 2.243010847600000e-03 6.369746338200000e-04 1.423409516000000e-03 2.214736624900000e-03 1.744516504000000e-03 3.988706834900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.180000000000000e+02 -2.544276032714368e+06 -5.217834246396432e+06 4.158790899093032e+06 -3.469783263405460e+03 -3.079677673870949e+03 -5.969598373839556e+03 2.243010847600000e-03 6.369746338200000e-04 1.423409516000000e-03 2.214736624900000e-03 1.744516504000000e-03 3.988706834900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.190000000000000e+02 -2.544345427901998e+06 -5.217895838697857e+06 4.158671506239888e+06 -3.469736872303959e+03 -3.079553915877176e+03 -5.969689602483063e+03 2.243010847600000e-03 6.369746338200000e-04 1.423409516000000e-03 2.214736624900000e-03 1.744516504000000e-03 3.988706834900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.200000000000000e+02 -2.544414822179209e+06 -5.217957428542495e+06 4.158552111528403e+06 -3.469690478377401e+03 -3.079430155010574e+03 -5.969780829915366e+03 2.243010847600000e-03 6.369746338200000e-04 1.423409516000000e-03 2.214736624900000e-03 1.744516504000000e-03 3.988706834900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.210000000000000e+02 -2.544484215506860e+06 -5.218019015900725e+06 4.158432715063870e+06 -3.469644465667416e+03 -3.079307383892658e+03 -5.969871314513821e+03 2.243010847600000e-03 6.369746338200000e-04 1.423409516000000e-03 2.214736624900000e-03 1.744516504000000e-03 3.988706834900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.220000000000000e+02 -2.544553607909006e+06 -5.218080600787442e+06 4.158313316773101e+06 -3.469598106706273e+03 -3.079183720920354e+03 -5.969962461815416e+03 2.243010847600000e-03 6.369746338200000e-04 1.423409516000000e-03 2.214736624900000e-03 1.744516504000000e-03 3.988706834900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.230000000000000e+02 -2.544622999413775e+06 -5.218142183231155e+06 4.158193916598712e+06 -3.469551707222609e+03 -3.079059954037214e+03 -5.970053682668761e+03 2.243010847600000e-03 6.369746338200000e-04 1.423409516000000e-03 2.214736624900000e-03 1.744516504000000e-03 3.988706834900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.240000000000000e+02 -2.544692389976781e+06 -5.218203763185048e+06 4.158074514626597e+06 -3.469505305741720e+03 -3.078936188333790e+03 -5.970144899666124e+03 2.243010847600000e-03 6.369746338200000e-04 1.423409516000000e-03 2.214736624900000e-03 1.744516504000000e-03 3.988706834900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.250000000000000e+02 -2.544761779613540e+06 -5.218265340665521e+06 4.157955110826689e+06 -3.469458902388949e+03 -3.078812421423675e+03 -5.970236114047681e+03 2.243010847600000e-03 6.369746338200000e-04 1.423409516000000e-03 2.214736624900000e-03 1.744516504000000e-03 3.988706834900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.260000000000000e+02 -2.544831168339856e+06 -5.218326915689233e+06 4.157835705168402e+06 -3.469412497272916e+03 -3.078688650796968e+03 -5.970327327129507e+03 2.242763760000000e-03 6.365131621300000e-04 1.423368602200000e-03 2.214087676800000e-03 1.744184689200000e-03 3.989646107400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.270000000000000e+02 -2.544900556124297e+06 -5.218388488223059e+06 4.157716297712548e+06 -3.469366090209722e+03 -3.078564881629628e+03 -5.970418536176753e+03 2.242763760000000e-03 6.365131621300000e-04 1.423368602200000e-03 2.214087676800000e-03 1.744184689200000e-03 3.989646107400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.280000000000000e+02 -2.544969942982378e+06 -5.218450058283393e+06 4.157596888429057e+06 -3.469319681225217e+03 -3.078441111153629e+03 -5.970509742689523e+03 2.242763760000000e-03 6.365131621300000e-04 1.423368602200000e-03 2.214087676800000e-03 1.744184689200000e-03 3.989646107400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.290000000000000e+02 -2.545039328914258e+06 -5.218511625870382e+06 4.157477477317640e+06 -3.469273271228894e+03 -3.078317338931657e+03 -5.970600946436361e+03 2.242763760000000e-03 6.365131621300000e-04 1.423368602200000e-03 2.214087676800000e-03 1.744184689200000e-03 3.989646107400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.300000000000000e+02 -2.545108713919798e+06 -5.218573190983922e+06 4.157358064378513e+06 -3.469226858794059e+03 -3.078193565769526e+03 -5.970692147714829e+03 2.242763760000000e-03 6.365131621300000e-04 1.423368602200000e-03 2.214087676800000e-03 1.744184689200000e-03 3.989646107400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.310000000000000e+02 -2.545178097959618e+06 -5.218634753602884e+06 4.157238649674935e+06 -3.469180047476653e+03 -3.078070395588182e+03 -5.970783221450899e+03 2.242763760000000e-03 6.365131621300000e-04 1.423368602200000e-03 2.214087676800000e-03 1.744184689200000e-03 3.989646107400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.320000000000000e+02 -2.545247481105828e+06 -5.218696313784990e+06 4.157119233078930e+06 -3.469133591058461e+03 -3.077946677700161e+03 -5.970874406744178e+03 2.242763760000000e-03 6.365131621300000e-04 1.423368602200000e-03 2.214087676800000e-03 1.744184689200000e-03 3.989646107400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.330000000000000e+02 -2.545316863306076e+06 -5.218757871472990e+06 4.156999814693165e+06 -3.469087172741601e+03 -3.077822901330950e+03 -5.970965600050501e+03 2.242763760000000e-03 6.365131621300000e-04 1.423368602200000e-03 2.214087676800000e-03 1.744184689200000e-03 3.989646107400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.340000000000000e+02 -2.545386244611213e+06 -5.218819426720543e+06 4.156880394419133e+06 -3.469040751493824e+03 -3.077699119402212e+03 -5.971056793667733e+03 2.242763760000000e-03 6.365131621300000e-04 1.423368602200000e-03 2.214087676800000e-03 1.744184689200000e-03 3.989646107400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.350000000000000e+02 -2.545455624911627e+06 -5.218880979411997e+06 4.156760972469149e+06 -3.468994332356420e+03 -3.077575345847115e+03 -5.971147977373594e+03 2.242763760000000e-03 6.365131621300000e-04 1.423368602200000e-03 2.214087676800000e-03 1.744184689200000e-03 3.989646107400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.360000000000000e+02 -2.545525004347938e+06 -5.218942529695779e+06 4.156641548570755e+06 -3.468947907528353e+03 -3.077451563845582e+03 -5.971239164395431e+03 2.242516633600000e-03 6.360517305100000e-04 1.423327473900000e-03 2.213438902900000e-03 1.743852582600000e-03 3.990585298600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.370000000000000e+02 -2.545594382842107e+06 -5.219004077489531e+06 4.156522122875153e+06 -3.468901482593375e+03 -3.077327782106468e+03 -5.971330347085743e+03 2.242516633600000e-03 6.360517305100000e-04 1.423327473900000e-03 2.213438902900000e-03 1.743852582600000e-03 3.990585298600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.380000000000000e+02 -2.545663760378364e+06 -5.219065622776630e+06 4.156402695412859e+06 -3.468855056872875e+03 -3.077204003231198e+03 -5.971421524374256e+03 2.242516633600000e-03 6.360517305100000e-04 1.423327473900000e-03 2.213438902900000e-03 1.743852582600000e-03 3.990585298600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.390000000000000e+02 -2.545733137019121e+06 -5.219127165622977e+06 4.156283266062906e+06 -3.468808627212092e+03 -3.077080219385268e+03 -5.971512702173502e+03 2.242516633600000e-03 6.360517305100000e-04 1.423327473900000e-03 2.213438902900000e-03 1.743852582600000e-03 3.990585298600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.400000000000000e+02 -2.545802512748898e+06 -5.219188706012223e+06 4.156163834855300e+06 -3.468762195657302e+03 -3.076956432215814e+03 -5.971603878524931e+03 2.242516633600000e-03 6.360517305100000e-04 1.423327473900000e-03 2.213438902900000e-03 1.743852582600000e-03 3.990585298600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.410000000000000e+02 -2.545871887545546e+06 -5.219250243929416e+06 4.156044401865539e+06 -3.468716224819623e+03 -3.076833553820501e+03 -5.971694315852606e+03 2.242516633600000e-03 6.360517305100000e-04 1.423327473900000e-03 2.213438902900000e-03 1.743852582600000e-03 3.990585298600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.420000000000000e+02 -2.545941261413588e+06 -5.219311779371811e+06 4.155924967055446e+06 -3.468669835427194e+03 -3.076709857111568e+03 -5.971785412479448e+03 2.242516633600000e-03 6.360517305100000e-04 1.423327473900000e-03 2.213438902900000e-03 1.743852582600000e-03 3.990585298600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.430000000000000e+02 -2.546010634354874e+06 -5.219373312340501e+06 4.155805530418213e+06 -3.468623399115106e+03 -3.076586068138570e+03 -5.971876579532767e+03 2.242516633600000e-03 6.360517305100000e-04 1.423327473900000e-03 2.213438902900000e-03 1.743852582600000e-03 3.990585298600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.440000000000000e+02 -2.546080006353665e+06 -5.219434842818893e+06 4.155686091984308e+06 -3.468576961586482e+03 -3.076462279814158e+03 -5.971967742618014e+03 2.242516633600000e-03 6.360517305100000e-04 1.423327473900000e-03 2.213438902900000e-03 1.743852582600000e-03 3.990585298600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.450000000000000e+02 -2.546149377456724e+06 -5.219496370856389e+06 4.155566651663046e+06 -3.468530519569354e+03 -3.076338487217164e+03 -5.972058906115191e+03 2.242516633600000e-03 6.360517305100000e-04 1.423327473900000e-03 2.213438902900000e-03 1.743852582600000e-03 3.990585298600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.460000000000000e+02 -2.546218747664216e+06 -5.219557896453128e+06 4.155447209454140e+06 -3.468484075024888e+03 -3.076214689028811e+03 -5.972150069730180e+03 2.242269468200000e-03 6.355903387700000e-04 1.423286130900000e-03 2.212790302800000e-03 1.743520183800000e-03 3.991524408300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.470000000000000e+02 -2.546288116850823e+06 -5.219619419476924e+06 4.155327765600408e+06 -3.468437633058188e+03 -3.076090901279904e+03 -5.972241222067812e+03 2.242269468200000e-03 6.355903387700000e-04 1.423286130900000e-03 2.212790302800000e-03 1.743520183800000e-03 3.991524408300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.480000000000000e+02 -2.546357485157421e+06 -5.219680940076414e+06 4.155208319828831e+06 -3.468391187598912e+03 -3.075967106057859e+03 -5.972332376050255e+03 2.242269468200000e-03 6.355903387700000e-04 1.423286130900000e-03 2.212790302800000e-03 1.743520183800000e-03 3.991524408300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.490000000000000e+02 -2.546426852521337e+06 -5.219742458185499e+06 4.155088872260842e+06 -3.468344740373336e+03 -3.075843312095978e+03 -5.972423526015188e+03 2.242269468200000e-03 6.355903387700000e-04 1.423286130900000e-03 2.212790302800000e-03 1.743520183800000e-03 3.991524408300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.500000000000000e+02 -2.546496219004966e+06 -5.219803973870046e+06 4.154969422775452e+06 -3.468298288364283e+03 -3.075719511381591e+03 -5.972514677898123e+03 2.242269468200000e-03 6.355903387700000e-04 1.423286130900000e-03 2.212790302800000e-03 1.743520183800000e-03 3.991524408300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.510000000000000e+02 -2.546565584471433e+06 -5.219865487004724e+06 4.154849971612168e+06 -3.468251241597871e+03 -3.075596042343672e+03 -5.972605951849831e+03 2.242269468200000e-03 6.355903387700000e-04 1.423286130900000e-03 2.212790302800000e-03 1.743520183800000e-03 3.991524408300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.520000000000000e+02 -2.546634949024313e+06 -5.219926997681648e+06 4.154730518593444e+06 -3.468204728297045e+03 -3.075472275169680e+03 -5.972697108567172e+03 2.242269468200000e-03 6.355903387700000e-04 1.423286130900000e-03 2.212790302800000e-03 1.743520183800000e-03 3.991524408300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.530000000000000e+02 -2.546704312646701e+06 -5.219988505881114e+06 4.154611063754571e+06 -3.468158272395741e+03 -3.075348474704709e+03 -5.972788249547042e+03 2.242269468200000e-03 6.355903387700000e-04 1.423286130900000e-03 2.212790302800000e-03 1.743520183800000e-03 3.991524408300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.540000000000000e+02 -2.546773675341954e+06 -5.220050011606637e+06 4.154491607089072e+06 -3.468111815485975e+03 -3.075224672493371e+03 -5.972879387759472e+03 2.242269468200000e-03 6.355903387700000e-04 1.423286130900000e-03 2.212790302800000e-03 1.743520183800000e-03 3.991524408300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.550000000000000e+02 -2.546843037094306e+06 -5.220111514841613e+06 4.154372148627486e+06 -3.468065357489478e+03 -3.075100871028028e+03 -5.972970521884266e+03 2.242269468200000e-03 6.355903387700000e-04 1.423286130900000e-03 2.212790302800000e-03 1.743520183800000e-03 3.991524408300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.560000000000000e+02 -2.546912397934875e+06 -5.220173015618918e+06 4.154252688309422e+06 -3.468018895739203e+03 -3.074977067094943e+03 -5.973061655054555e+03 2.242022264000000e-03 6.351289871600000e-04 1.423244573200000e-03 2.212141876900000e-03 1.743187492900000e-03 3.992463435700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.570000000000000e+02 -2.546981757879460e+06 -5.220234513955189e+06 4.154133226104273e+06 -3.467972431508254e+03 -3.074853257496857e+03 -5.973152788357414e+03 2.242022264000000e-03 6.351289871600000e-04 1.423244573200000e-03 2.212141876900000e-03 1.743187492900000e-03 3.992463435700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.580000000000000e+02 -2.547051116834031e+06 -5.220296009751281e+06 4.154013762194294e+06 -3.467925968150169e+03 -3.074729454790487e+03 -5.973243913205160e+03 2.242022264000000e-03 6.351289871600000e-04 1.423244573200000e-03 2.212141876900000e-03 1.743187492900000e-03 3.992463435700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.590000000000000e+02 -2.547120474908174e+06 -5.220357503122781e+06 4.153894296367025e+06 -3.467879501075424e+03 -3.074605644484460e+03 -5.973335039880243e+03 2.242022264000000e-03 6.351289871600000e-04 1.423244573200000e-03 2.212141876900000e-03 1.743187492900000e-03 3.992463435700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.600000000000000e+02 -2.547189832039220e+06 -5.220418994003618e+06 4.153774828743929e+06 -3.467833032379241e+03 -3.074481835393330e+03 -5.973426162488317e+03 2.242022264000000e-03 6.351289871600000e-04 1.423244573200000e-03 2.212141876900000e-03 1.743187492900000e-03 3.992463435700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.610000000000000e+02 -2.547259188239833e+06 -5.220480482404685e+06 4.153655359337825e+06 -3.467787201704813e+03 -3.074358577147288e+03 -5.973516650462348e+03 2.242022264000000e-03 6.351289871600000e-04 1.423244573200000e-03 2.212141876900000e-03 1.743187492900000e-03 3.992463435700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.620000000000000e+02 -2.547328543510298e+06 -5.220541968328505e+06 4.153535888114510e+06 -3.467740793793804e+03 -3.074234819922821e+03 -5.973607704857300e+03 2.242022264000000e-03 6.351289871600000e-04 1.423244573200000e-03 2.212141876900000e-03 1.743187492900000e-03 3.992463435700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.630000000000000e+02 -2.547397897822467e+06 -5.220603451745676e+06 4.153416415124786e+06 -3.467694321303714e+03 -3.074111011093268e+03 -5.973698816549192e+03 2.242022264000000e-03 6.351289871600000e-04 1.423244573200000e-03 2.212141876900000e-03 1.743187492900000e-03 3.992463435700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.640000000000000e+02 -2.547467251253816e+06 -5.220664932737954e+06 4.153296940218371e+06 -3.467647843760960e+03 -3.073987195456597e+03 -5.973789930325293e+03 2.242022264000000e-03 6.351289871600000e-04 1.423244573200000e-03 2.212141876900000e-03 1.743187492900000e-03 3.992463435700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.650000000000000e+02 -2.547536603741993e+06 -5.220726411239536e+06 4.153177463516227e+06 -3.467601366586139e+03 -3.073863379921518e+03 -5.973881039614253e+03 2.242022264000000e-03 6.351289871600000e-04 1.423244573200000e-03 2.212141876900000e-03 1.743187492900000e-03 3.992463435700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.660000000000000e+02 -2.547605955302478e+06 -5.220787887266799e+06 4.153057984988256e+06 -3.467554886705284e+03 -3.073739563572097e+03 -5.973972146504412e+03 2.241775020900000e-03 6.346676754900000e-04 1.423202800500000e-03 2.211493624800000e-03 1.742854509500000e-03 3.993402380900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.670000000000000e+02 -2.547675305935142e+06 -5.220849360819633e+06 4.152938504634689e+06 -3.467508404588591e+03 -3.073615746335931e+03 -5.974063250792318e+03 2.241775020900000e-03 6.346676754900000e-04 1.423202800500000e-03 2.211493624800000e-03 1.742854509500000e-03 3.993402380900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.680000000000000e+02 -2.547744655655774e+06 -5.220910831914671e+06 4.152819022424920e+06 -3.467461920735170e+03 -3.073491925322721e+03 -5.974154353796939e+03 2.241775020900000e-03 6.346676754900000e-04 1.423202800500000e-03 2.211493624800000e-03 1.742854509500000e-03 3.993402380900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.690000000000000e+02 -2.547814004432981e+06 -5.220972300518831e+06 4.152699538419794e+06 -3.467415435386979e+03 -3.073368105224174e+03 -5.974245452833560e+03 2.241775020900000e-03 6.346676754900000e-04 1.423202800500000e-03 2.211493624800000e-03 1.742854509500000e-03 3.993402380900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.700000000000000e+02 -2.547883352282253e+06 -5.221033766648489e+06 4.152580052589234e+06 -3.467368947659496e+03 -3.073244284506712e+03 -5.974336549195955e+03 2.241775020900000e-03 6.346676754900000e-04 1.423202800500000e-03 2.211493624800000e-03 1.742854509500000e-03 3.993402380900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.710000000000000e+02 -2.547952699147875e+06 -5.221095230269753e+06 4.152460565027633e+06 -3.467322012128715e+03 -3.073121237533818e+03 -5.974427450553950e+03 2.241775020900000e-03 6.346676754900000e-04 1.423202800500000e-03 2.211493624800000e-03 1.742854509500000e-03 3.993402380900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.720000000000000e+02 -2.548022045109934e+06 -5.221156691444724e+06 4.152341075591921e+06 -3.467275475984537e+03 -3.072997490908101e+03 -5.974518522990203e+03 2.241775020900000e-03 6.346676754900000e-04 1.423202800500000e-03 2.211493624800000e-03 1.742854509500000e-03 3.993402380900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.730000000000000e+02 -2.548091390144287e+06 -5.221218150145441e+06 4.152221584330319e+06 -3.467228983793891e+03 -3.072873665843265e+03 -5.974609611264362e+03 2.241775020900000e-03 6.346676754900000e-04 1.423202800500000e-03 2.211493624800000e-03 1.742854509500000e-03 3.993402380900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.740000000000000e+02 -2.548160734266282e+06 -5.221279606388134e+06 4.152102091212993e+06 -3.467182488021598e+03 -3.072749838069431e+03 -5.974700698625381e+03 2.241775020900000e-03 6.346676754900000e-04 1.423202800500000e-03 2.211493624800000e-03 1.742854509500000e-03 3.993402380900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.750000000000000e+02 -2.548230077444526e+06 -5.221341060139717e+06 4.151982596300804e+06 -3.467135990901445e+03 -3.072626011119172e+03 -5.974791781992596e+03 2.241775020900000e-03 6.346676754900000e-04 1.423202800500000e-03 2.211493624800000e-03 1.742854509500000e-03 3.993402380900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.760000000000000e+02 -2.548299419726067e+06 -5.221402511449788e+06 4.151863099502513e+06 -3.467089491254332e+03 -3.072502178620840e+03 -5.974882865449970e+03 2.241527738800000e-03 6.342064037400000e-04 1.423160812700000e-03 2.210845546500000e-03 1.742521233200000e-03 3.994341243600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.770000000000000e+02 -2.548368761032623e+06 -5.221463960235839e+06 4.151743600969927e+06 -3.467042991650720e+03 -3.072378351095534e+03 -5.974973941932120e+03 2.241527738800000e-03 6.342064037400000e-04 1.423160812700000e-03 2.210845546500000e-03 1.742521233200000e-03 3.994341243600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.780000000000000e+02 -2.548438101426578e+06 -5.221525406563669e+06 4.151624100581998e+06 -3.466996489036634e+03 -3.072254520414719e+03 -5.975065017449440e+03 2.241527738800000e-03 6.342064037400000e-04 1.423160812700000e-03 2.210845546500000e-03 1.742521233200000e-03 3.994341243600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.790000000000000e+02 -2.548507440923710e+06 -5.221586850449911e+06 4.151504598308119e+06 -3.466949983620869e+03 -3.072130684313624e+03 -5.975156093128731e+03 2.241527738800000e-03 6.342064037400000e-04 1.423160812700000e-03 2.210845546500000e-03 1.742521233200000e-03 3.994341243600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.800000000000000e+02 -2.548576779414500e+06 -5.221648291779109e+06 4.151385094360749e+06 -3.466903480398087e+03 -3.072006856905001e+03 -5.975247158695302e+03 2.241527738800000e-03 6.342064037400000e-04 1.423160812700000e-03 2.210845546500000e-03 1.742521233200000e-03 3.994341243600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.810000000000000e+02 -2.548646117023246e+06 -5.221709730696253e+06 4.151265588504469e+06 -3.466856942779521e+03 -3.071883686134900e+03 -5.975337879746336e+03 2.241527738800000e-03 6.342064037400000e-04 1.423160812700000e-03 2.210845546500000e-03 1.742521233200000e-03 3.994341243600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.820000000000000e+02 -2.548715453671067e+06 -5.221771167105633e+06 4.151146080887138e+06 -3.466810431610734e+03 -3.071759918023713e+03 -5.975428908580565e+03 2.241527738800000e-03 6.342064037400000e-04 1.423160812700000e-03 2.210845546500000e-03 1.742521233200000e-03 3.994341243600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.830000000000000e+02 -2.548784789406122e+06 -5.221832601056720e+06 4.151026571414666e+06 -3.466763919439759e+03 -3.071636081878992e+03 -5.975519970783683e+03 2.241527738800000e-03 6.342064037400000e-04 1.423160812700000e-03 2.210845546500000e-03 1.742521233200000e-03 3.994341243600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.840000000000000e+02 -2.548854124244176e+06 -5.221894032566087e+06 4.150907060056496e+06 -3.466717404928252e+03 -3.071512239535775e+03 -5.975611033334206e+03 2.241527738800000e-03 6.342064037400000e-04 1.423160812700000e-03 2.210845546500000e-03 1.742521233200000e-03 3.994341243600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.850000000000000e+02 -2.548923458091327e+06 -5.221955461534777e+06 4.150787546994783e+06 -3.466670891171645e+03 -3.071388404166370e+03 -5.975702087453185e+03 2.241527738800000e-03 6.342064037400000e-04 1.423160812700000e-03 2.210845546500000e-03 1.742521233200000e-03 3.994341243600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.860000000000000e+02 -2.548992791041201e+06 -5.222016888061536e+06 4.150668032047827e+06 -3.466624373723150e+03 -3.071264564201573e+03 -5.975793141743568e+03 2.241280417700000e-03 6.337451718600000e-04 1.423118609600000e-03 2.210197642000000e-03 1.742187664000000e-03 3.995280023600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.870000000000000e+02 -2.549062123078323e+06 -5.222078312130027e+06 4.150548515245650e+06 -3.466577854216752e+03 -3.071140720217039e+03 -5.975884195047489e+03 2.241280417700000e-03 6.337451718600000e-04 1.423118609600000e-03 2.210197642000000e-03 1.742187664000000e-03 3.995280023600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.880000000000000e+02 -2.549131454155688e+06 -5.222139733690723e+06 4.150428996679445e+06 -3.466531334068756e+03 -3.071016879326104e+03 -5.975975242756618e+03 2.241280417700000e-03 6.337451718600000e-04 1.423118609600000e-03 2.210197642000000e-03 1.742187664000000e-03 3.995280023600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.890000000000000e+02 -2.549200784320032e+06 -5.222201152792934e+06 4.150309476258472e+06 -3.466484810826346e+03 -3.070893035643456e+03 -5.976066289345200e+03 2.241280417700000e-03 6.337451718600000e-04 1.423118609600000e-03 2.210197642000000e-03 1.742187664000000e-03 3.995280023600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.900000000000000e+02 -2.549270113571518e+06 -5.222262569436808e+06 4.150189953982441e+06 -3.466438285863305e+03 -3.070769188396173e+03 -5.976157334524916e+03 2.241280417700000e-03 6.337451718600000e-04 1.423118609600000e-03 2.210197642000000e-03 1.742187664000000e-03 3.995280023600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.910000000000000e+02 -2.549339441891571e+06 -5.222323983614794e+06 4.150070429885349e+06 -3.466391617594480e+03 -3.070645791441476e+03 -5.976248204038146e+03 2.241280417700000e-03 6.337451718600000e-04 1.423118609600000e-03 2.210197642000000e-03 1.742187664000000e-03 3.995280023600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.920000000000000e+02 -2.549408769250893e+06 -5.222385395285228e+06 4.149950904025831e+06 -3.466345075763510e+03 -3.070521990835864e+03 -5.976339223993325e+03 2.241280417700000e-03 6.337451718600000e-04 1.423118609600000e-03 2.210197642000000e-03 1.742187664000000e-03 3.995280023600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.930000000000000e+02 -2.549478095665806e+06 -5.222446804464118e+06 4.149831376372418e+06 -3.466298547558067e+03 -3.070398145588258e+03 -5.976430257000198e+03 2.241280417700000e-03 6.337451718600000e-04 1.423118609600000e-03 2.210197642000000e-03 1.742187664000000e-03 3.995280023600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.940000000000000e+02 -2.549547421230104e+06 -5.222508211250366e+06 4.149711846743019e+06 -3.466252012856555e+03 -3.070274289856224e+03 -5.976521294833684e+03 2.241280417700000e-03 6.337451718600000e-04 1.423118609600000e-03 2.210197642000000e-03 1.742187664000000e-03 3.995280023600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.950000000000000e+02 -2.549616745771796e+06 -5.222569615462691e+06 4.149592315471442e+06 -3.466205481040915e+03 -3.070150444477532e+03 -5.976612321296981e+03 2.241280417700000e-03 6.337451718600000e-04 1.423118609600000e-03 2.210197642000000e-03 1.742187664000000e-03 3.995280023600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.960000000000000e+02 -2.549686069478510e+06 -5.222631017298875e+06 4.149472782193482e+06 -3.466158942840541e+03 -3.070026586276674e+03 -5.976703353802419e+03 2.241033057500000e-03 6.332839796700000e-04 1.423076191100000e-03 2.209549911000000e-03 1.741853801400000e-03 3.996218720800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.970000000000000e+02 -2.549755392178168e+06 -5.222692416577567e+06 4.149353247243126e+06 -3.466112406364165e+03 -3.069902736668422e+03 -5.976794376497400e+03 2.241033057500000e-03 6.332839796700000e-04 1.423076191100000e-03 2.209549911000000e-03 1.741853801400000e-03 3.996218720800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.980000000000000e+02 -2.549824713980288e+06 -5.222753813414191e+06 4.149233710407796e+06 -3.466065867289816e+03 -3.069778881467216e+03 -5.976885399341018e+03 2.241033057500000e-03 6.332839796700000e-04 1.423076191100000e-03 2.209549911000000e-03 1.741853801400000e-03 3.996218720800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.990000000000000e+02 -2.549894034869109e+06 -5.222815207792166e+06 4.149114171718038e+06 -3.466019324897458e+03 -3.069655023436669e+03 -5.976976421199221e+03 2.241033057500000e-03 6.332839796700000e-04 1.423076191100000e-03 2.209549911000000e-03 1.741853801400000e-03 3.996218720800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.000000000000000e+02 -2.549963354797625e+06 -5.222876599661985e+06 4.148994631265067e+06 -3.465972781727426e+03 -3.069531168587270e+03 -5.977067437486907e+03 2.241033057500000e-03 6.332839796700000e-04 1.423076191100000e-03 2.209549911000000e-03 1.741853801400000e-03 3.996218720800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.010000000000000e+02 -2.550032673762782e+06 -5.222937989042043e+06 4.148875089056838e+06 -3.465926078116163e+03 -3.069408227247780e+03 -5.977158034772731e+03 2.241033057500000e-03 6.332839796700000e-04 1.423076191100000e-03 2.209549911000000e-03 1.741853801400000e-03 3.996218720800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.020000000000000e+02 -2.550101991827542e+06 -5.222999375979266e+06 4.148755544969266e+06 -3.465879513860537e+03 -3.069284456795775e+03 -5.977249007475336e+03 2.241033057500000e-03 6.332839796700000e-04 1.423076191100000e-03 2.209549911000000e-03 1.741853801400000e-03 3.996218720800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.030000000000000e+02 -2.550171308944493e+06 -5.223060760421542e+06 4.148635999094171e+06 -3.465832964484602e+03 -3.069160596254660e+03 -5.977340017324376e+03 2.241033057500000e-03 6.332839796700000e-04 1.423076191100000e-03 2.209549911000000e-03 1.741853801400000e-03 3.996218720800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.040000000000000e+02 -2.550240625116815e+06 -5.223122142372213e+06 4.148516451425399e+06 -3.465786414951410e+03 -3.069036735793883e+03 -5.977431022971970e+03 2.241033057500000e-03 6.332839796700000e-04 1.423076191100000e-03 2.209549911000000e-03 1.741853801400000e-03 3.996218720800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.050000000000000e+02 -2.550309940375617e+06 -5.223183521864093e+06 4.148396901902518e+06 -3.465739862363089e+03 -3.068912872694528e+03 -5.977522027394327e+03 2.241033057500000e-03 6.332839796700000e-04 1.423076191100000e-03 2.209549911000000e-03 1.741853801400000e-03 3.996218720800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.060000000000000e+02 -2.550379254720752e+06 -5.223244898897065e+06 4.148277350525745e+06 -3.465693306097482e+03 -3.068789006769101e+03 -5.977613031014437e+03 2.240785658300000e-03 6.328228274300000e-04 1.423033557000000e-03 2.208902353800000e-03 1.741519645400000e-03 3.997157334600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.070000000000000e+02 -2.550448568121151e+06 -5.223306273438356e+06 4.148157797355457e+06 -3.465646750338376e+03 -3.068665140685858e+03 -5.977704030220289e+03 2.240785658300000e-03 6.328228274300000e-04 1.423033557000000e-03 2.208902353800000e-03 1.741519645400000e-03 3.997157334600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.080000000000000e+02 -2.550517880607813e+06 -5.223367645520692e+06 4.148038242331382e+06 -3.465600190522650e+03 -3.068541272458893e+03 -5.977795028447980e+03 2.240785658300000e-03 6.328228274300000e-04 1.423033557000000e-03 2.208902353800000e-03 1.741519645400000e-03 3.997157334600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.090000000000000e+02 -2.550587192134041e+06 -5.223429015094840e+06 4.147918685544229e+06 -3.465553631789786e+03 -3.068417405892314e+03 -5.977886020974305e+03 2.240785658300000e-03 6.328228274300000e-04 1.423033557000000e-03 2.208902353800000e-03 1.741519645400000e-03 3.997157334600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.100000000000000e+02 -2.550656502762177e+06 -5.223490382226538e+06 4.147799126872891e+06 -3.465507068815258e+03 -3.068293534940772e+03 -5.977977013838052e+03 2.240785658300000e-03 6.328228274300000e-04 1.423033557000000e-03 2.208902353800000e-03 1.741519645400000e-03 3.997157334600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.110000000000000e+02 -2.550725812419072e+06 -5.223551746848891e+06 4.147679566480298e+06 -3.465460759862638e+03 -3.068170444394734e+03 -5.978067446526085e+03 2.240785658300000e-03 6.328228274300000e-04 1.423033557000000e-03 2.208902353800000e-03 1.741519645400000e-03 3.997157334600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.120000000000000e+02 -2.550795121159389e+06 -5.223613109010337e+06 4.147560004241492e+06 -3.465414219979275e+03 -3.068046649900405e+03 -5.978158377350009e+03 2.240785658300000e-03 6.328228274300000e-04 1.423033557000000e-03 2.208902353800000e-03 1.741519645400000e-03 3.997157334600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.130000000000000e+02 -2.550864428967718e+06 -5.223674468693653e+06 4.147440440184260e+06 -3.465367652240077e+03 -3.067922777029287e+03 -5.978249360973085e+03 2.240785658300000e-03 6.328228274300000e-04 1.423033557000000e-03 2.208902353800000e-03 1.741519645400000e-03 3.997157334600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.140000000000000e+02 -2.550933735862086e+06 -5.223735825917866e+06 4.147320874273559e+06 -3.465321081309073e+03 -3.067798901516623e+03 -5.978340343442399e+03 2.240785658300000e-03 6.328228274300000e-04 1.423033557000000e-03 2.208902353800000e-03 1.741519645400000e-03 3.997157334600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.150000000000000e+02 -2.551003041764563e+06 -5.223797180600841e+06 4.147201306660771e+06 -3.465274513074657e+03 -3.067675031724802e+03 -5.978431317168732e+03 2.240785658300000e-03 6.328228274300000e-04 1.423033557000000e-03 2.208902353800000e-03 1.741519645400000e-03 3.997157334600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.160000000000000e+02 -2.551072346831191e+06 -5.223858532907042e+06 4.147081737042758e+06 -3.465227937104612e+03 -3.067551149640868e+03 -5.978522297337679e+03 2.240538220000000e-03 6.323617149500000e-04 1.422990707100000e-03 2.208254970200000e-03 1.741185195700000e-03 3.998095864800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.170000000000000e+02 -2.551141650905654e+06 -5.223919882671782e+06 4.146962165723107e+06 -3.465181362230209e+03 -3.067427274237868e+03 -5.978613269067345e+03 2.240538220000000e-03 6.323617149500000e-04 1.422990707100000e-03 2.208254970200000e-03 1.741185195700000e-03 3.998095864800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.180000000000000e+02 -2.551210954066206e+06 -5.223981229977497e+06 4.146842592549852e+06 -3.465134785787729e+03 -3.067303395219449e+03 -5.978704239335462e+03 2.240538220000000e-03 6.323617149500000e-04 1.422990707100000e-03 2.208254970200000e-03 1.741185195700000e-03 3.998095864800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.190000000000000e+02 -2.551280256281477e+06 -5.224042574791163e+06 4.146723017583882e+06 -3.465088207986090e+03 -3.067179516992575e+03 -5.978795205636123e+03 2.240538220000000e-03 6.323617149500000e-04 1.422990707100000e-03 2.208254970200000e-03 1.741185195700000e-03 3.998095864800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.200000000000000e+02 -2.551349557613784e+06 -5.224103917178491e+06 4.146603440704070e+06 -3.465041624520814e+03 -3.067055632469654e+03 -5.978886174046252e+03 2.240538220000000e-03 6.323617149500000e-04 1.422990707100000e-03 2.208254970200000e-03 1.741185195700000e-03 3.998095864800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.210000000000000e+02 -2.551418857939942e+06 -5.224165257009316e+06 4.146483862154367e+06 -3.464995123846702e+03 -3.066931821590230e+03 -5.978977055408245e+03 2.240538220000000e-03 6.323617149500000e-04 1.422990707100000e-03 2.208254970200000e-03 1.741185195700000e-03 3.998095864800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.220000000000000e+02 -2.551488157398637e+06 -5.224226594430126e+06 4.146364281661132e+06 -3.464948544665327e+03 -3.066807941075651e+03 -5.979068010913840e+03 2.240538220000000e-03 6.323617149500000e-04 1.422990707100000e-03 2.208254970200000e-03 1.741185195700000e-03 3.998095864800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.230000000000000e+02 -2.551557455882066e+06 -5.224287929327340e+06 4.146244699433386e+06 -3.464901959860932e+03 -3.066684057803069e+03 -5.979158966582818e+03 2.240538220000000e-03 6.323617149500000e-04 1.422990707100000e-03 2.208254970200000e-03 1.741185195700000e-03 3.998095864800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.240000000000000e+02 -2.551626753466868e+06 -5.224349261781748e+06 4.146125115322170e+06 -3.464855370543290e+03 -3.066560170004017e+03 -5.979249922804493e+03 2.240538220000000e-03 6.323617149500000e-04 1.422990707100000e-03 2.208254970200000e-03 1.741185195700000e-03 3.998095864800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.250000000000000e+02 -2.551696050090448e+06 -5.224410591727430e+06 4.146005529449073e+06 -3.464808780867858e+03 -3.066436285038713e+03 -5.979340873431644e+03 2.240538220000000e-03 6.323617149500000e-04 1.422990707100000e-03 2.208254970200000e-03 1.741185195700000e-03 3.998095864800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.260000000000000e+02 -2.551765345799816e+06 -5.224471919213890e+06 4.145885941722785e+06 -3.464762189436166e+03 -3.066312396398389e+03 -5.979431822726227e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.270000000000000e+02 -2.551834640579212e+06 -5.224533244224564e+06 4.145766352173862e+06 -3.464715595350134e+03 -3.066188506826643e+03 -5.979522769658950e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.280000000000000e+02 -2.551903934412892e+06 -5.224594566742893e+06 4.145646760832875e+06 -3.464669000155090e+03 -3.066064618157565e+03 -5.979613712435363e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.290000000000000e+02 -2.551973227363470e+06 -5.224655886834826e+06 4.145527167578168e+06 -3.464622401137222e+03 -3.065940722259564e+03 -5.979704656877472e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.300000000000000e+02 -2.552042519352742e+06 -5.224717204418003e+06 4.145407572561669e+06 -3.464575801775320e+03 -3.065816829009277e+03 -5.979795595819701e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.310000000000000e+02 -2.552111810380571e+06 -5.224778519492312e+06 4.145287975783606e+06 -3.464529201649935e+03 -3.065692938670233e+03 -5.979886529335427e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.320000000000000e+02 -2.552181100509567e+06 -5.224839832123703e+06 4.145168377122317e+06 -3.464482598792181e+03 -3.065569042821235e+03 -5.979977463019398e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.330000000000000e+02 -2.552250389708272e+06 -5.224901142279083e+06 4.145048776638887e+06 -3.464435993301880e+03 -3.065445146561345e+03 -5.980068394047212e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.340000000000000e+02 -2.552319677976853e+06 -5.224962449958586e+06 4.144929174333016e+06 -3.464389386926994e+03 -3.065321247993787e+03 -5.980159322548932e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.350000000000000e+02 -2.552388965330773e+06 -5.225023755178564e+06 4.144809570174589e+06 -3.464342776958781e+03 -3.065197347170347e+03 -5.980250249892948e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.360000000000000e+02 -2.552458251738679e+06 -5.225085057906003e+06 4.144689964224519e+06 -3.464296165900079e+03 -3.065073446971977e+03 -5.980341173222479e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.370000000000000e+02 -2.552527537231956e+06 -5.225146358173946e+06 4.144570356421824e+06 -3.464249552965066e+03 -3.064949543040729e+03 -5.980432095311916e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.380000000000000e+02 -2.552596821763626e+06 -5.225207655932957e+06 4.144450746857766e+06 -3.464202939270743e+03 -3.064825642374558e+03 -5.980523011781164e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.390000000000000e+02 -2.552666105396004e+06 -5.225268951248690e+06 4.144331135411186e+06 -3.464156321588155e+03 -3.064701736852885e+03 -5.980613928709296e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.400000000000000e+02 -2.552735388082413e+06 -5.225330244071969e+06 4.144211522172826e+06 -3.464109703843235e+03 -3.064577831267069e+03 -5.980704841467795e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.410000000000000e+02 -2.552804669791503e+06 -5.225391534369799e+06 4.144091907203615e+06 -3.464063086639851e+03 -3.064453930578758e+03 -5.980795747048866e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.420000000000000e+02 -2.552873950663624e+06 -5.225452822290051e+06 4.143972290230640e+06 -3.464016461246184e+03 -3.064330017879407e+03 -5.980886659143583e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.430000000000000e+02 -2.552943230527225e+06 -5.225514107652008e+06 4.143852671587443e+06 -3.463969839882800e+03 -3.064206112340495e+03 -5.980977561032828e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.440000000000000e+02 -2.553012509491444e+06 -5.225575390570652e+06 4.143733051061807e+06 -3.463923214215250e+03 -3.064082202455279e+03 -5.981068463266506e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.450000000000000e+02 -2.553081787540532e+06 -5.225636671029432e+06 4.143613428684302e+06 -3.463876585243867e+03 -3.063958289688540e+03 -5.981159364532688e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.460000000000000e+02 -2.553151064674644e+06 -5.225697949028492e+06 4.143493804454640e+06 -3.463829954369869e+03 -3.063834373383511e+03 -5.981250264465841e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.470000000000000e+02 -2.553220340815506e+06 -5.225759224485442e+06 4.143374178524964e+06 -3.463783324533538e+03 -3.063710463802593e+03 -5.981341155974413e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.480000000000000e+02 -2.553289616041322e+06 -5.225820497482627e+06 4.143254550743237e+06 -3.463736692781148e+03 -3.063586550514203e+03 -5.981432046249077e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.490000000000000e+02 -2.553358890367562e+06 -5.225881768036371e+06 4.143134921079325e+06 -3.463690056707036e+03 -3.063462632757015e+03 -5.981522936943005e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.500000000000000e+02 -2.553428163747267e+06 -5.225943036097254e+06 4.143015289624509e+06 -3.463643419344567e+03 -3.063338715972833e+03 -5.981613823536310e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.510000000000000e+02 -2.553497436196204e+06 -5.226004301681858e+06 4.142895656348149e+06 -3.463596781120437e+03 -3.063214797223440e+03 -5.981704707405425e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.520000000000000e+02 -2.553566707714238e+06 -5.226065564790078e+06 4.142776021250463e+06 -3.463550140469498e+03 -3.063090877712986e+03 -5.981795588702789e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.530000000000000e+02 -2.553635978285619e+06 -5.226126825405362e+06 4.142656384362030e+06 -3.463503498293019e+03 -3.062966959102285e+03 -5.981886466061886e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.540000000000000e+02 -2.553705247972943e+06 -5.226188083593600e+06 4.142536745561151e+06 -3.463456852577052e+03 -3.062843033217352e+03 -5.981977344960280e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.550000000000000e+02 -2.553774516698041e+06 -5.226249339272507e+06 4.142417104999808e+06 -3.463410206439320e+03 -3.062719109810082e+03 -5.982068218494559e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.560000000000000e+02 -2.553843784476374e+06 -5.226310592458408e+06 4.142297462647880e+06 -3.463363558691348e+03 -3.062595187800800e+03 -5.982159087863815e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.570000000000000e+02 -2.553913051339319e+06 -5.226371843184325e+06 4.142177818444364e+06 -3.463316909009583e+03 -3.062471261917427e+03 -5.982249956098024e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.580000000000000e+02 -2.553982317271041e+06 -5.226433091433624e+06 4.142058172420010e+06 -3.463270256793174e+03 -3.062347335519194e+03 -5.982340821682361e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.590000000000000e+02 -2.554051582271696e+06 -5.226494337206449e+06 4.141938524574530e+06 -3.463223603639713e+03 -3.062223407203560e+03 -5.982431684555365e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.600000000000000e+02 -2.554120846341143e+06 -5.226555580502698e+06 4.141818874908142e+06 -3.463176947870407e+03 -3.062099478201508e+03 -5.982522544913511e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.610000000000000e+02 -2.554190109479249e+06 -5.226616821322251e+06 4.141699223421077e+06 -3.463130289954880e+03 -3.061975548129866e+03 -5.982613402722909e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.620000000000000e+02 -2.554259371686178e+06 -5.226678059665265e+06 4.141579570113036e+06 -3.463083631158020e+03 -3.061851616150554e+03 -5.982704257786972e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.630000000000000e+02 -2.554328632961786e+06 -5.226739295531622e+06 4.141459914984249e+06 -3.463036969708553e+03 -3.061727683552579e+03 -5.982795110318331e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.640000000000000e+02 -2.554397893305943e+06 -5.226800528921217e+06 4.141340258034937e+06 -3.462990306252529e+03 -3.061603749842122e+03 -5.982885960252289e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.650000000000000e+02 -2.554467152703204e+06 -5.226861759817767e+06 4.141220599295171e+06 -3.462943642694888e+03 -3.061479816228272e+03 -5.982976805951288e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.660000000000000e+02 -2.554536411184643e+06 -5.226922988254024e+06 4.141100938704455e+06 -3.462896975941935e+03 -3.061355879887796e+03 -5.983067650541483e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.670000000000000e+02 -2.554605668734511e+06 -5.226984214213444e+06 4.140981276293373e+06 -3.462850306547231e+03 -3.061231942788902e+03 -5.983158492669265e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.680000000000000e+02 -2.554674925384187e+06 -5.227045437729025e+06 4.140861612000915e+06 -3.462803634876519e+03 -3.061107999893489e+03 -5.983249334880681e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.690000000000000e+02 -2.554744181039904e+06 -5.227106658702112e+06 4.140741946009460e+06 -3.462756964070875e+03 -3.060984063835078e+03 -5.983340168701123e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.700000000000000e+02 -2.554813435810754e+06 -5.227167877247560e+06 4.140622278106712e+06 -3.462710288382448e+03 -3.060860120988774e+03 -5.983431004485726e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.710000000000000e+02 -2.554882689634486e+06 -5.227229093299822e+06 4.140502608413829e+06 -3.462663612804643e+03 -3.060736178373477e+03 -5.983521835853390e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.720000000000000e+02 -2.554951942542063e+06 -5.227290306891558e+06 4.140382936870478e+06 -3.462616933164368e+03 -3.060612233486750e+03 -5.983612666311309e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.730000000000000e+02 -2.555021194502446e+06 -5.227351517990055e+06 4.140263263537090e+06 -3.462570253795017e+03 -3.060488288196808e+03 -5.983703492614029e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.740000000000000e+02 -2.555090445531104e+06 -5.227412726611638e+06 4.140143588383532e+06 -3.462523572142545e+03 -3.060364342413231e+03 -5.983794316125991e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.750000000000000e+02 -2.555159695612287e+06 -5.227473932739774e+06 4.140023911440386e+06 -3.462476888493100e+03 -3.060240397649433e+03 -5.983885135878780e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.760000000000000e+02 -2.555228944792975e+06 -5.227535136423869e+06 4.139904232616276e+06 -3.462430202796888e+03 -3.060116446989861e+03 -5.983975955650061e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.770000000000000e+02 -2.555298192979418e+06 -5.227596337565294e+06 4.139784552093608e+06 -3.462383518334003e+03 -3.059992503027178e+03 -5.984066766919073e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.780000000000000e+02 -2.555367440296287e+06 -5.227657536295295e+06 4.139664869629691e+06 -3.462336827368752e+03 -3.059868550842961e+03 -5.984157581762334e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.790000000000000e+02 -2.555436686665734e+06 -5.227718732531927e+06 4.139545185376057e+06 -3.462290136702961e+03 -3.059744598727701e+03 -5.984248392179930e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.800000000000000e+02 -2.555505932103232e+06 -5.227779926291495e+06 4.139425499302564e+06 -3.462243443885025e+03 -3.059620645458672e+03 -5.984339200097495e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.810000000000000e+02 -2.555575176593038e+06 -5.227841117557470e+06 4.139305811439803e+06 -3.462196749257615e+03 -3.059496693359445e+03 -5.984430004078343e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.820000000000000e+02 -2.555644420197715e+06 -5.227902306395679e+06 4.139186121666020e+06 -3.462150051234650e+03 -3.059372733983559e+03 -5.984520809520189e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.830000000000000e+02 -2.555713662870227e+06 -5.227963492756659e+06 4.139066430072700e+06 -3.462103350135854e+03 -3.059248773766483e+03 -5.984611612767731e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.840000000000000e+02 -2.555782904532736e+06 -5.228024676558483e+06 4.138946736811401e+06 -3.462056653062358e+03 -3.059124821079361e+03 -5.984702405625740e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.850000000000000e+02 -2.555852145325500e+06 -5.228085857948795e+06 4.138827041609032e+06 -3.462009949615742e+03 -3.059000860311373e+03 -5.984793201913285e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.860000000000000e+02 -2.555921385170390e+06 -5.228147036845393e+06 4.138707344617657e+06 -3.461963244944121e+03 -3.058876900258099e+03 -5.984883994210238e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.870000000000000e+02 -2.555990624098765e+06 -5.228208213281257e+06 4.138587645776252e+06 -3.461916538648235e+03 -3.058752936404346e+03 -5.984974785170509e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.880000000000000e+02 -2.556059862063685e+06 -5.228269387207046e+06 4.138467945176146e+06 -3.461869831291835e+03 -3.058628975967615e+03 -5.985065570590491e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.890000000000000e+02 -2.556129099111811e+06 -5.228330558671877e+06 4.138348242726454e+06 -3.461823120942115e+03 -3.058505012189066e+03 -5.985156355129788e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.900000000000000e+02 -2.556198335227713e+06 -5.228391727659491e+06 4.138228538457256e+06 -3.461776409821734e+03 -3.058381046835844e+03 -5.985247136686176e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.910000000000000e+02 -2.556267570395650e+06 -5.228452894153370e+06 4.138108832399143e+06 -3.461729697155960e+03 -3.058257082443155e+03 -5.985337914284065e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.920000000000000e+02 -2.556336804677879e+06 -5.228514058219038e+06 4.137989124430861e+06 -3.461682979335875e+03 -3.058133111565348e+03 -5.985428693817087e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.930000000000000e+02 -2.556406037965370e+06 -5.228575219741778e+06 4.137869414764715e+06 -3.461636264125274e+03 -3.058009146524604e+03 -5.985519464609928e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.940000000000000e+02 -2.556475270351587e+06 -5.228636378819936e+06 4.137749703218703e+06 -3.461589545332070e+03 -3.057885176417966e+03 -5.985610235759553e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.950000000000000e+02 -2.556544501820783e+06 -5.228697535436996e+06 4.137629989823410e+06 -3.461542822578785e+03 -3.057761203887471e+03 -5.985701006027859e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.960000000000000e+02 -2.556613732341928e+06 -5.228758689560282e+06 4.137510274639304e+06 -3.461496100267444e+03 -3.057637231338404e+03 -5.985791771845842e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.970000000000000e+02 -2.556682961930380e+06 -5.228819841206012e+06 4.137390557636394e+06 -3.461449374760388e+03 -3.057513258246946e+03 -5.985882535369422e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.980000000000000e+02 -2.556752190586311e+06 -5.228880990374329e+06 4.137270838814402e+06 -3.461402648837151e+03 -3.057389283181039e+03 -5.985973295944411e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.990000000000000e+02 -2.556821418309571e+06 -5.228942137065128e+06 4.137151118173542e+06 -3.461355920138554e+03 -3.057265307487067e+03 -5.986064054055125e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.000000000000000e+02 -2.556890645100030e+06 -5.229003281278299e+06 4.137031395714041e+06 -3.461309189183432e+03 -3.057141330706388e+03 -5.986154809683136e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.010000000000000e+02 -2.556959870957844e+06 -5.229064423013983e+06 4.136911671435611e+06 -3.461262457355996e+03 -3.057017352193034e+03 -5.986245562466246e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.020000000000000e+02 -2.557029095882885e+06 -5.229125562272077e+06 4.136791945338473e+06 -3.461215723410327e+03 -3.056893372684199e+03 -5.986336312646069e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.030000000000000e+02 -2.557098319859417e+06 -5.229186699036064e+06 4.136672217453228e+06 -3.461168987639481e+03 -3.056769394312891e+03 -5.986427058916252e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.040000000000000e+02 -2.557167542903194e+06 -5.229247833322497e+06 4.136552487749214e+06 -3.461122251074643e+03 -3.056645414204588e+03 -5.986517802303727e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.050000000000000e+02 -2.557236765045274e+06 -5.229308965164075e+06 4.136432756165893e+06 -3.461075510691888e+03 -3.056521429177834e+03 -5.986608546087552e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.060000000000000e+02 -2.557305986238732e+06 -5.229370094511471e+06 4.136313022794622e+06 -3.461028768424921e+03 -3.056397445281365e+03 -5.986699285996095e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.070000000000000e+02 -2.557375206514912e+06 -5.229431221397643e+06 4.136193287574360e+06 -3.460982024293416e+03 -3.056273457869271e+03 -5.986790024535901e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.080000000000000e+02 -2.557444425826805e+06 -5.229492345773189e+06 4.136073550596630e+06 -3.460935279490164e+03 -3.056149473366499e+03 -5.986880757613309e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.090000000000000e+02 -2.557513644236947e+06 -5.229553467703857e+06 4.135953811739629e+06 -3.460888531896980e+03 -3.056025483166729e+03 -5.986971490979409e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.100000000000000e+02 -2.557582861698421e+06 -5.229614587140352e+06 4.135834071094720e+06 -3.460841782770255e+03 -3.055901494500768e+03 -5.987062220071576e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.110000000000000e+02 -2.557652078226674e+06 -5.229675704098944e+06 4.135714328631747e+06 -3.460795031188595e+03 -3.055777504472630e+03 -5.987152946932253e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.120000000000000e+02 -2.557721293821879e+06 -5.229736818579788e+06 4.135594584350419e+06 -3.460748278945700e+03 -3.055653512758269e+03 -5.987243670814340e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.130000000000000e+02 -2.557790508483896e+06 -5.229797930582776e+06 4.135474838250957e+06 -3.460701524195365e+03 -3.055529520070725e+03 -5.987334392281266e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.140000000000000e+02 -2.557859722228171e+06 -5.229859040124195e+06 4.135355090303211e+06 -3.460654765996686e+03 -3.055405525084213e+03 -5.987425112534775e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.150000000000000e+02 -2.557928935008099e+06 -5.229920147154999e+06 4.135235340598026e+06 -3.460608009000413e+03 -3.055281531431406e+03 -5.987515827216098e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.160000000000000e+02 -2.557998146885912e+06 -5.229981251740673e+06 4.135115589014105e+06 -3.460561247948209e+03 -3.055157533588183e+03 -5.987606542020515e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.170000000000000e+02 -2.558067357814693e+06 -5.230042353831904e+06 4.134995835642815e+06 -3.460514485135269e+03 -3.055033536487314e+03 -5.987697253096906e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.180000000000000e+02 -2.558136567763421e+06 -5.230103453396058e+06 4.134876080544635e+06 -3.460467724267981e+03 -3.054909543194863e+03 -5.987787956879733e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.190000000000000e+02 -2.558205776841105e+06 -5.230164550547795e+06 4.134756323507105e+06 -3.460420957585803e+03 -3.054785541602375e+03 -5.987878663914646e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.200000000000000e+02 -2.558274984985229e+06 -5.230225645221421e+06 4.134636564651978e+06 -3.460374188092321e+03 -3.054661539138875e+03 -5.987969368635191e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.210000000000000e+02 -2.558344192164786e+06 -5.230286737384294e+06 4.134516804039740e+06 -3.460327419858719e+03 -3.054537538597214e+03 -5.988060067436381e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.220000000000000e+02 -2.558413398441901e+06 -5.230347827101790e+06 4.134397041549241e+06 -3.460280647103582e+03 -3.054413533623098e+03 -5.988150766730363e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.230000000000000e+02 -2.558482603769952e+06 -5.230408914324888e+06 4.134277277271350e+06 -3.460233873936703e+03 -3.054289528946129e+03 -5.988241461844017e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.240000000000000e+02 -2.558551808179998e+06 -5.230469999086256e+06 4.134157511145514e+06 -3.460187097898329e+03 -3.054165521207789e+03 -5.988332155859727e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.250000000000000e+02 -2.558621011625125e+06 -5.230531081336603e+06 4.134037743263121e+06 -3.460140321084319e+03 -3.054041516490936e+03 -5.988422844408055e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.260000000000000e+02 -2.558690214167847e+06 -5.230592161141653e+06 4.133917973502332e+06 -3.460093541575743e+03 -3.053917506284298e+03 -5.988513533081545e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.270000000000000e+02 -2.558759415745690e+06 -5.230653238435726e+06 4.133798201984920e+06 -3.460046761886053e+03 -3.053793498726306e+03 -5.988604216184038e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.280000000000000e+02 -2.558828616389673e+06 -5.230714313251498e+06 4.133678428650333e+06 -3.459999979194863e+03 -3.053669490506357e+03 -5.988694896957051e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.290000000000000e+02 -2.558897816146735e+06 -5.230775385638281e+06 4.133558653407119e+06 -3.459953193452876e+03 -3.053545474702571e+03 -5.988785579170892e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.300000000000000e+02 -2.558967014907617e+06 -5.230836455481243e+06 4.133438876468215e+06 -3.459906408749939e+03 -3.053421465640145e+03 -5.988876252972629e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.310000000000000e+02 -2.559036212796889e+06 -5.230897522911384e+06 4.133319097590740e+06 -3.459859617968058e+03 -3.053297448175360e+03 -5.988966930214257e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.320000000000000e+02 -2.559105409705594e+06 -5.230958587814131e+06 4.133199316987121e+06 -3.459812829131968e+03 -3.053173434387679e+03 -5.989057600235869e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.330000000000000e+02 -2.559174605695848e+06 -5.231019650254845e+06 4.133079534536206e+06 -3.459766036487917e+03 -3.053049418393826e+03 -5.989148269177790e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.340000000000000e+02 -2.559243800783399e+06 -5.231080710250048e+06 4.132959750207299e+06 -3.459719241233434e+03 -3.052925396411941e+03 -5.989238938469935e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.350000000000000e+02 -2.559312994859001e+06 -5.231141767684948e+06 4.132839964213372e+06 -3.459672448069232e+03 -3.052801383409788e+03 -5.989329597600374e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.360000000000000e+02 -2.559382188062802e+06 -5.231202822706885e+06 4.132720176281124e+06 -3.459625649061842e+03 -3.052677361768008e+03 -5.989420260176661e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.370000000000000e+02 -2.559451380332612e+06 -5.231263875250472e+06 4.132600386531829e+06 -3.459578848882311e+03 -3.052553338272285e+03 -5.989510920127672e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.380000000000000e+02 -2.559520571652712e+06 -5.231324925299220e+06 4.132480594996104e+06 -3.459532047602412e+03 -3.052429315774689e+03 -5.989601575874163e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.390000000000000e+02 -2.559589762038546e+06 -5.231385972869405e+06 4.132360801643782e+06 -3.459485243676679e+03 -3.052305292659958e+03 -5.989692229083998e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.400000000000000e+02 -2.559658951490277e+06 -5.231447017961165e+06 4.132241006474567e+06 -3.459438438870639e+03 -3.052181267463964e+03 -5.989782879641642e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.410000000000000e+02 -2.559728139976604e+06 -5.231508060541634e+06 4.132121209549480e+06 -3.459391633801873e+03 -3.052057245192620e+03 -5.989873524523030e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.420000000000000e+02 -2.559797327559728e+06 -5.231569100676223e+06 4.132001410747160e+06 -3.459344824366518e+03 -3.051933218213479e+03 -5.989964169963939e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.430000000000000e+02 -2.559866514208637e+06 -5.231630138332319e+06 4.131881610128110e+06 -3.459298014052632e+03 -3.051809189508479e+03 -5.990054812559555e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.440000000000000e+02 -2.559935699938773e+06 -5.231691173526199e+06 4.131761807662157e+06 -3.459251200275621e+03 -3.051685158247499e+03 -5.990145454086634e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.450000000000000e+02 -2.560004884703259e+06 -5.231752206208602e+06 4.131642003440711e+06 -3.459204386379132e+03 -3.051561129554802e+03 -5.990236090056959e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.460000000000000e+02 -2.560074068549001e+06 -5.231813236428824e+06 4.131522197372294e+06 -3.459157570285978e+03 -3.051437097333453e+03 -5.990326724833878e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.470000000000000e+02 -2.560143251460183e+06 -5.231874264170284e+06 4.131402389487697e+06 -3.459110751608621e+03 -3.051313064367802e+03 -5.990417357111247e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.480000000000000e+02 -2.560212433468127e+06 -5.231935289465888e+06 4.131282579725838e+06 -3.459063930135576e+03 -3.051189025931062e+03 -5.990507989552562e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.490000000000000e+02 -2.560281614479204e+06 -5.231996312217263e+06 4.131162768269320e+06 -3.459017110023162e+03 -3.051064994127240e+03 -5.990598613480332e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.500000000000000e+02 -2.560350794602351e+06 -5.232057332538932e+06 4.131042954905587e+06 -3.458970284486825e+03 -3.050940956049659e+03 -5.990689239355983e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.510000000000000e+02 -2.560419973775406e+06 -5.232118350365542e+06 4.130923139755939e+06 -3.458923459392491e+03 -3.050816917558456e+03 -5.990779860998743e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.520000000000000e+02 -2.560489152013811e+06 -5.232179365713354e+06 4.130803322790200e+06 -3.458876631849298e+03 -3.050692878282733e+03 -5.990870480094170e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.530000000000000e+02 -2.560558329301842e+06 -5.232240378565895e+06 4.130683504038997e+06 -3.458829802542785e+03 -3.050568840333875e+03 -5.990961095149237e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.540000000000000e+02 -2.560627505670831e+06 -5.232301388956052e+06 4.130563683441241e+06 -3.458782971724894e+03 -3.050444798515829e+03 -5.991051708842349e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.550000000000000e+02 -2.560696681105064e+06 -5.232362396867342e+06 4.130443861027550e+06 -3.458736138689354e+03 -3.050320755679349e+03 -5.991142319995783e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.560000000000000e+02 -2.560765855604392e+06 -5.232423402299654e+06 4.130324036798153e+06 -3.458689303024544e+03 -3.050196712127488e+03 -5.991232928657214e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.570000000000000e+02 -2.560835029184560e+06 -5.232484405269514e+06 4.130204210722358e+06 -3.458642465388444e+03 -3.050072664994959e+03 -5.991323536036685e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.580000000000000e+02 -2.560904201814176e+06 -5.232545405743974e+06 4.130084382861357e+06 -3.458595626245072e+03 -3.049948618850940e+03 -5.991414139427317e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.590000000000000e+02 -2.560973373508980e+06 -5.232606403739557e+06 4.129964553184464e+06 -3.458548786138195e+03 -3.049824570990927e+03 -5.991504740011005e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.600000000000000e+02 -2.561042544284412e+06 -5.232667399272528e+06 4.129844721661495e+06 -3.458501942427301e+03 -3.049700520619327e+03 -5.991595339573519e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.610000000000000e+02 -2.561111714093599e+06 -5.232728392293666e+06 4.129724888383890e+06 -3.458455098462283e+03 -3.049576473036452e+03 -5.991685933531521e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.620000000000000e+02 -2.561180882983443e+06 -5.232789382852216e+06 4.129605053260143e+06 -3.458408252721773e+03 -3.049452421349311e+03 -5.991776526389618e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.630000000000000e+02 -2.561250050938221e+06 -5.232850370931715e+06 4.129485216320884e+06 -3.458361404513852e+03 -3.049328369291091e+03 -5.991867116486650e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.640000000000000e+02 -2.561319217957804e+06 -5.232911356532041e+06 4.129365377566338e+06 -3.458314554034978e+03 -3.049204316115063e+03 -5.991957704125052e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.650000000000000e+02 -2.561388384042345e+06 -5.232972339653349e+06 4.129245536996210e+06 -3.458267702441430e+03 -3.049080261229172e+03 -5.992048289030836e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.660000000000000e+02 -2.561457549207292e+06 -5.233033320311896e+06 4.129125694580322e+06 -3.458220847820613e+03 -3.048956203470100e+03 -5.992138872814189e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.670000000000000e+02 -2.561526713421351e+06 -5.233094298474832e+06 4.129005850379705e+06 -3.458173991671852e+03 -3.048832146758040e+03 -5.992229452588343e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.680000000000000e+02 -2.561595876669105e+06 -5.233155274125950e+06 4.128886004424484e+06 -3.458127136562079e+03 -3.048708091979609e+03 -5.992320026556888e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.690000000000000e+02 -2.561665039059458e+06 -5.233216247379689e+06 4.128766156502028e+06 -3.458080274300523e+03 -3.048584026971408e+03 -5.992410605492505e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.700000000000000e+02 -2.561734200436501e+06 -5.233277218072293e+06 4.128646306916628e+06 -3.458033414376823e+03 -3.048459970351430e+03 -5.992501174470829e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.710000000000000e+02 -2.561803360909436e+06 -5.233338186318463e+06 4.128526455455153e+06 -3.457986551705839e+03 -3.048335908363705e+03 -5.992591743529648e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.720000000000000e+02 -2.561872520446871e+06 -5.233399152085269e+06 4.128406602178810e+06 -3.457939686217857e+03 -3.048211845690391e+03 -5.992682310176790e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.730000000000000e+02 -2.561941679033395e+06 -5.233460115356507e+06 4.128286747117714e+06 -3.457892820746114e+03 -3.048087783095660e+03 -5.992772872545368e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.740000000000000e+02 -2.562010836700022e+06 -5.233521076164781e+06 4.128166890211273e+06 -3.457845952115526e+03 -3.047963717666072e+03 -5.992863433837989e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.750000000000000e+02 -2.562079993446616e+06 -5.233582034509987e+06 4.128047031459709e+06 -3.457799080063641e+03 -3.047839649611021e+03 -5.992953994076154e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.760000000000000e+02 -2.562149149242180e+06 -5.233642990359546e+06 4.127927170923552e+06 -3.457752207925454e+03 -3.047715581565429e+03 -5.993044550125762e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.770000000000000e+02 -2.562218304102162e+06 -5.233703943729712e+06 4.127807308572614e+06 -3.457705333792853e+03 -3.047591512541164e+03 -5.993135103499653e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.780000000000000e+02 -2.562287458010844e+06 -5.233764894604013e+06 4.127687444437534e+06 -3.457658457992410e+03 -3.047467444608384e+03 -5.993225652913048e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.790000000000000e+02 -2.562356610999538e+06 -5.233825843015322e+06 4.127567578457198e+06 -3.457611580233235e+03 -3.047343373087815e+03 -5.993316201040530e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.800000000000000e+02 -2.562425763083688e+06 -5.233886788979878e+06 4.127447710601415e+06 -3.457564698573512e+03 -3.047219296833883e+03 -5.993406749496623e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.810000000000000e+02 -2.562494914169699e+06 -5.233947732399426e+06 4.127327841052880e+06 -3.457517818086499e+03 -3.047095227026086e+03 -5.993497289645141e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.820000000000000e+02 -2.562564064366763e+06 -5.234008673388621e+06 4.127207969598418e+06 -3.457470934029296e+03 -3.046971149958156e+03 -5.993587831316054e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.830000000000000e+02 -2.562633213612341e+06 -5.234069611881834e+06 4.127088096360081e+06 -3.457424047983304e+03 -3.046847074361806e+03 -5.993678368986302e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.840000000000000e+02 -2.562702361906596e+06 -5.234130547879217e+06 4.126968221337571e+06 -3.457377161891176e+03 -3.046722998572338e+03 -5.993768902557328e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.850000000000000e+02 -2.562771509296111e+06 -5.234191481429727e+06 4.126848344439875e+06 -3.457330271685918e+03 -3.046598918272075e+03 -5.993859436445450e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.860000000000000e+02 -2.562840655734034e+06 -5.234252412484181e+06 4.126728465758452e+06 -3.457283380034525e+03 -3.046474838835848e+03 -5.993949966382420e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.870000000000000e+02 -2.562909801251669e+06 -5.234313341075441e+06 4.126608585232192e+06 -3.457236486796885e+03 -3.046350755756617e+03 -5.994040494871458e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.880000000000000e+02 -2.562978945817729e+06 -5.234374267170697e+06 4.126488702922138e+06 -3.457189591544737e+03 -3.046226673853417e+03 -5.994131019532817e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.890000000000000e+02 -2.563048089447654e+06 -5.234435190786180e+06 4.126368818798109e+06 -3.457142694369956e+03 -3.046102590927609e+03 -5.994221541505390e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.900000000000000e+02 -2.563117232094895e+06 -5.234496111872990e+06 4.126248932951063e+06 -3.457095799149405e+03 -3.045978511862436e+03 -5.994312056166504e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.910000000000000e+02 -2.563186373899455e+06 -5.234557030578183e+06 4.126129045107468e+06 -3.457048895775205e+03 -3.045854420561723e+03 -5.994402577383090e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.920000000000000e+02 -2.563255514689908e+06 -5.234617946721778e+06 4.126009155602137e+06 -3.457001994800009e+03 -3.045730337839424e+03 -5.994493088515879e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.930000000000000e+02 -2.563324654575421e+06 -5.234678860418377e+06 4.125889264221861e+06 -3.456955091003188e+03 -3.045606249439313e+03 -5.994583599931648e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.940000000000000e+02 -2.563393793524706e+06 -5.234739771635189e+06 4.125769371027693e+06 -3.456908184790321e+03 -3.045482160460016e+03 -5.994674108672665e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.950000000000000e+02 -2.563462931537640e+06 -5.234800680372079e+06 4.125649476019865e+06 -3.456861276620567e+03 -3.045358070167986e+03 -5.994764614898941e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.960000000000000e+02 -2.563532068614372e+06 -5.234861586629212e+06 4.125529579198081e+06 -3.456814367074308e+03 -3.045233978466206e+03 -5.994855118365062e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.970000000000000e+02 -2.563601204754666e+06 -5.234922490406380e+06 4.125409680562735e+06 -3.456767454827308e+03 -3.045109885873921e+03 -5.994945619470341e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.980000000000000e+02 -2.563670339974263e+06 -5.234983391720087e+06 4.125289780083122e+06 -3.456720540924460e+03 -3.044985789905569e+03 -5.995036119018789e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.990000000000000e+02 -2.563739474241878e+06 -5.235044290537528e+06 4.125169877820299e+06 -3.456673625451377e+03 -3.044861694746528e+03 -5.995126614710097e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.000000000000000e+02 -2.563808607526238e+06 -5.235105186825898e+06 4.125049973835338e+06 -3.456626710464181e+03 -3.044737604327020e+03 -5.995217103371321e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.010000000000000e+02 -2.563877739967632e+06 -5.235166080732459e+06 4.124930067854160e+06 -3.456579788927617e+03 -3.044613500931170e+03 -5.995307598160422e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.020000000000000e+02 -2.563946871425792e+06 -5.235226972109996e+06 4.124810160150772e+06 -3.456532867846572e+03 -3.044489402249240e+03 -5.995398085948823e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.030000000000000e+02 -2.564016001947299e+06 -5.235287861007424e+06 4.124690250634142e+06 -3.456485944588907e+03 -3.044365302482139e+03 -5.995488571212486e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.040000000000000e+02 -2.564085131547869e+06 -5.235348747441244e+06 4.124570339273555e+06 -3.456439019223021e+03 -3.044241199444674e+03 -5.995579055094004e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.050000000000000e+02 -2.564154260165107e+06 -5.235409631345969e+06 4.124450426190922e+06 -3.456392094496642e+03 -3.044117100783453e+03 -5.995669532063341e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.060000000000000e+02 -2.564223387876707e+06 -5.235470512803204e+06 4.124330511234357e+06 -3.456345165418273e+03 -3.043992997672409e+03 -5.995760009436847e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.070000000000000e+02 -2.564292514698402e+06 -5.235531391829438e+06 4.124210594373141e+06 -3.456298232800359e+03 -3.043868887057912e+03 -5.995850488442964e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.080000000000000e+02 -2.564361640505408e+06 -5.235592268293742e+06 4.124090675851059e+06 -3.456251301741730e+03 -3.043744785285304e+03 -5.995940957659419e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.090000000000000e+02 -2.564430765406873e+06 -5.235653142310653e+06 4.123970755454859e+06 -3.456204368301068e+03 -3.043620677871051e+03 -5.996031426911711e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.100000000000000e+02 -2.564499889355944e+06 -5.235714013831045e+06 4.123850833276032e+06 -3.456157433102275e+03 -3.043496571652763e+03 -5.996121892195694e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.110000000000000e+02 -2.564569012399194e+06 -5.235774882903819e+06 4.123730909223534e+06 -3.456110493901345e+03 -3.043372460631298e+03 -5.996212357894059e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.120000000000000e+02 -2.564638134490079e+06 -5.235835749480106e+06 4.123610983388341e+06 -3.456063554583575e+03 -3.043248349731363e+03 -5.996302819361446e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.130000000000000e+02 -2.564707255644029e+06 -5.235896613576140e+06 4.123491055740257e+06 -3.456016613101856e+03 -3.043124238006330e+03 -5.996393278157489e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.140000000000000e+02 -2.564776375860912e+06 -5.235957475191805e+06 4.123371126279502e+06 -3.455969669086143e+03 -3.043000125242748e+03 -5.996483734586895e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.150000000000000e+02 -2.564845495156448e+06 -5.236018334343586e+06 4.123251194975364e+06 -3.455922723350826e+03 -3.042876008876170e+03 -5.996574189613420e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.160000000000000e+02 -2.564914613468245e+06 -5.236079190966038e+06 4.123131261949772e+06 -3.455875777931502e+03 -3.042751897402947e+03 -5.996664637617262e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.170000000000000e+02 -2.564983730873988e+06 -5.236140045140720e+06 4.123011327050816e+06 -3.455828828454241e+03 -3.042627781161602e+03 -5.996755086044532e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.180000000000000e+02 -2.565052847342711e+06 -5.236200896835117e+06 4.122891390339054e+06 -3.455781877922387e+03 -3.042503663042509e+03 -5.996845531798748e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.190000000000000e+02 -2.565121962905401e+06 -5.236261746081780e+06 4.122771451753859e+06 -3.455734923121541e+03 -3.042379540644109e+03 -5.996935977820793e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.200000000000000e+02 -2.565191077515242e+06 -5.236322592831594e+06 4.122651511386735e+06 -3.455687967402574e+03 -3.042255418603609e+03 -5.997026419895690e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.210000000000000e+02 -2.565260191125682e+06 -5.236383437035716e+06 4.122531569328692e+06 -3.455641013881222e+03 -3.042131302731264e+03 -5.997116853298090e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.220000000000000e+02 -2.565329303845449e+06 -5.236444278808279e+06 4.122411625367107e+06 -3.455594054991303e+03 -3.042007180592254e+03 -5.997207288601974e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.230000000000000e+02 -2.565398415628007e+06 -5.236505118100434e+06 4.122291679592985e+06 -3.455547095269895e+03 -3.041883056569643e+03 -5.997297721121579e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.240000000000000e+02 -2.565467526488783e+06 -5.236565954928407e+06 4.122171731976111e+06 -3.455500132173712e+03 -3.041758929849258e+03 -5.997388152598661e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.250000000000000e+02 -2.565536636396516e+06 -5.236626789259411e+06 4.122051782577580e+06 -3.455453167682279e+03 -3.041634804054340e+03 -5.997478580067995e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.260000000000000e+02 -2.565605745382489e+06 -5.236687621126266e+06 4.121931831336234e+06 -3.455406201320281e+03 -3.041510674662306e+03 -5.997569006207949e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.270000000000000e+02 -2.565674853415440e+06 -5.236748450496205e+06 4.121811878313162e+06 -3.455359233603923e+03 -3.041386546393079e+03 -5.997659428213112e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.280000000000000e+02 -2.565743960495235e+06 -5.236809277369109e+06 4.121691923508587e+06 -3.455312264389012e+03 -3.041262418713105e+03 -5.997749846444781e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.290000000000000e+02 -2.565813066622038e+06 -5.236870101745135e+06 4.121571966922227e+06 -3.455265295270396e+03 -3.041138291513509e+03 -5.997840260144502e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.300000000000000e+02 -2.565882171889079e+06 -5.236930923722140e+06 4.121452008371690e+06 -3.455218319151483e+03 -3.041014153892767e+03 -5.997930678816060e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.310000000000000e+02 -2.565951276171732e+06 -5.236991743169382e+06 4.121332048100682e+06 -3.455171343548555e+03 -3.040890020908931e+03 -5.998021090503310e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.320000000000000e+02 -2.566020379485713e+06 -5.237052560103348e+06 4.121212086078477e+06 -3.455124368695788e+03 -3.040765890004518e+03 -5.998111496463183e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.330000000000000e+02 -2.566089481893039e+06 -5.237113374589153e+06 4.121092122183731e+06 -3.455077389242582e+03 -3.040641754895336e+03 -5.998201902819126e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.340000000000000e+02 -2.566158583378304e+06 -5.237174186610604e+06 4.120972156446583e+06 -3.455030408143651e+03 -3.040517615691359e+03 -5.998292307997772e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.350000000000000e+02 -2.566227683894689e+06 -5.237234996118628e+06 4.120852188958566e+06 -3.454983426051327e+03 -3.040393479884424e+03 -5.998382707633593e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.360000000000000e+02 -2.566296783504303e+06 -5.237295803178406e+06 4.120732219598168e+06 -3.454936440279399e+03 -3.040269339250257e+03 -5.998473107528134e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.370000000000000e+02 -2.566365882145070e+06 -5.237356607724793e+06 4.120612248486836e+06 -3.454889455432236e+03 -3.040145200318945e+03 -5.998563501809002e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.380000000000000e+02 -2.566434979894638e+06 -5.237417409839299e+06 4.120492275472606e+06 -3.454842464960513e+03 -3.040021055235990e+03 -5.998653898057166e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.390000000000000e+02 -2.566504076659526e+06 -5.237478209423868e+06 4.120372300738337e+06 -3.454795475437911e+03 -3.039896914608914e+03 -5.998744287198293e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.400000000000000e+02 -2.566573172471006e+06 -5.237539006511300e+06 4.120252324222858e+06 -3.454748485605523e+03 -3.039772774182920e+03 -5.998834672166609e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.410000000000000e+02 -2.566642267391189e+06 -5.237599801166776e+06 4.120132345804638e+06 -3.454701490943944e+03 -3.039648627329226e+03 -5.998925058842857e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.420000000000000e+02 -2.566711361357691e+06 -5.237660593324890e+06 4.120012365605657e+06 -3.454654494568556e+03 -3.039524481290427e+03 -5.999015441735159e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.430000000000000e+02 -2.566780454386238e+06 -5.237721383002121e+06 4.119892383595188e+06 -3.454607497491410e+03 -3.039400333644879e+03 -5.999105821627797e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.440000000000000e+02 -2.566849546476692e+06 -5.237782170198354e+06 4.119772399773448e+06 -3.454560498018847e+03 -3.039276184920235e+03 -5.999196199104459e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.450000000000000e+02 -2.566918637644475e+06 -5.237842954929792e+06 4.119652414110228e+06 -3.454513495300096e+03 -3.039152033551921e+03 -5.999286575442266e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.460000000000000e+02 -2.566987727858627e+06 -5.237903737163962e+06 4.119532426666115e+06 -3.454466492475739e+03 -3.039027882480128e+03 -5.999376947451495e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.470000000000000e+02 -2.567056817087804e+06 -5.237964516868017e+06 4.119412437502390e+06 -3.454419489580023e+03 -3.038903736060002e+03 -5.999467312772928e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.480000000000000e+02 -2.567125905456625e+06 -5.238025294172655e+06 4.119292446375227e+06 -3.454372481421595e+03 -3.038779578527696e+03 -5.999557682541933e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.490000000000000e+02 -2.567194992871607e+06 -5.238086068979858e+06 4.119172453467498e+06 -3.454325471558180e+03 -3.038655422251353e+03 -5.999648048285596e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.500000000000000e+02 -2.567264079332616e+06 -5.238146841289515e+06 4.119052458779436e+06 -3.454278460428633e+03 -3.038531266822151e+03 -5.999738409999209e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.510000000000000e+02 -2.567333164855367e+06 -5.238207611118092e+06 4.118932462280296e+06 -3.454231448345736e+03 -3.038407109319981e+03 -5.999828769092713e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.520000000000000e+02 -2.567402249439729e+06 -5.238268378465486e+06 4.118812463970312e+06 -3.454184434016619e+03 -3.038282951359550e+03 -5.999919125360035e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.530000000000000e+02 -2.567471333085555e+06 -5.238329143331584e+06 4.118692463849708e+06 -3.454137416935332e+03 -3.038158792589345e+03 -6.000009479249235e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.540000000000000e+02 -2.567540415777462e+06 -5.238389905700212e+06 4.118572461948635e+06 -3.454090400354729e+03 -3.038034633423805e+03 -6.000099828872040e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.550000000000000e+02 -2.567609497546419e+06 -5.238450665603896e+06 4.118452458206425e+06 -3.454043380363687e+03 -3.037910471762493e+03 -6.000190177360098e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.560000000000000e+02 -2.567678578376732e+06 -5.238511423026214e+06 4.118332452653751e+06 -3.453996357777757e+03 -3.037786309371402e+03 -6.000280523346496e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.570000000000000e+02 -2.567747658284124e+06 -5.238572177983615e+06 4.118212445259872e+06 -3.453949333821053e+03 -3.037662142936688e+03 -6.000370867985568e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.580000000000000e+02 -2.567816737237241e+06 -5.238632930443291e+06 4.118092436086083e+06 -3.453902307554476e+03 -3.037537978094173e+03 -6.000461208729052e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.590000000000000e+02 -2.567885815251806e+06 -5.238693680421692e+06 4.117972425101641e+06 -3.453855280681134e+03 -3.037413811318715e+03 -6.000551546599680e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.600000000000000e+02 -2.567954892327676e+06 -5.238754427918718e+06 4.117852412306767e+06 -3.453808251024740e+03 -3.037289643708487e+03 -6.000641882121397e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.610000000000000e+02 -2.568023968449163e+06 -5.238815172917943e+06 4.117732397732147e+06 -3.453761220457346e+03 -3.037165477170068e+03 -6.000732213311419e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.620000000000000e+02 -2.568093043647537e+06 -5.238875915452139e+06 4.117612381316578e+06 -3.453714187735906e+03 -3.037041306811999e+03 -6.000822543434507e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.630000000000000e+02 -2.568162117922666e+06 -5.238936655521192e+06 4.117492363060291e+06 -3.453667152009192e+03 -3.036917133748757e+03 -6.000912872327342e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.640000000000000e+02 -2.568231191243294e+06 -5.238997393092373e+06 4.117372343024409e+06 -3.453620114564531e+03 -3.036792961862313e+03 -6.001003197245229e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.650000000000000e+02 -2.568300263640696e+06 -5.239058128198448e+06 4.117252321147739e+06 -3.453573075380603e+03 -3.036668785940569e+03 -6.001093520999359e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.660000000000000e+02 -2.568369335083632e+06 -5.239118860806693e+06 4.117132297491406e+06 -3.453526034965394e+03 -3.036544611202618e+03 -6.001183840525823e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.670000000000000e+02 -2.568438405587510e+06 -5.239179590933305e+06 4.117012272025186e+06 -3.453478991847516e+03 -3.036420435714057e+03 -6.001274157617003e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.680000000000000e+02 -2.568507475121395e+06 -5.239240318545826e+06 4.116892244809687e+06 -3.453431949890193e+03 -3.036296261963280e+03 -6.001364468959152e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.690000000000000e+02 -2.568576543747356e+06 -5.239301043709366e+06 4.116772215723333e+06 -3.453384903765355e+03 -3.036172083825115e+03 -6.001454780569299e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.700000000000000e+02 -2.568645611449706e+06 -5.239361766407499e+06 4.116652184796796e+06 -3.453337854451835e+03 -3.036047902606410e+03 -6.001545091244265e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.710000000000000e+02 -2.568714678197496e+06 -5.239422486607772e+06 4.116532152090687e+06 -3.453290804907623e+03 -3.035923721676148e+03 -6.001635397660780e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.720000000000000e+02 -2.568783744006044e+06 -5.239483204326296e+06 4.116412117574954e+06 -3.453243752519745e+03 -3.035799540262640e+03 -6.001725701570573e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.730000000000000e+02 -2.568852808875516e+06 -5.239543919563214e+06 4.116292081249307e+06 -3.453196699529625e+03 -3.035675356869679e+03 -6.001816002630187e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.740000000000000e+02 -2.568921872790225e+06 -5.239604632302120e+06 4.116172043144414e+06 -3.453149644887609e+03 -3.035551174434454e+03 -6.001906299799512e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.750000000000000e+02 -2.568990935812226e+06 -5.239665342608105e+06 4.116052003138691e+06 -3.453102585069436e+03 -3.035426985788165e+03 -6.001996598731254e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.760000000000000e+02 -2.569059997848390e+06 -5.239726050383515e+06 4.115931961414579e+06 -3.453055527339925e+03 -3.035302800710419e+03 -6.002086890456921e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.770000000000000e+02 -2.569129058960780e+06 -5.239786755693434e+06 4.115811917850473e+06 -3.453008466455576e+03 -3.035178612754133e+03 -6.002177181121246e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.780000000000000e+02 -2.569198119102599e+06 -5.239847458488866e+06 4.115691872537969e+06 -3.452961404481474e+03 -3.035054428128212e+03 -6.002267466334154e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.790000000000000e+02 -2.569267178382863e+06 -5.239908158884040e+06 4.115571825263578e+06 -3.452914337530216e+03 -3.034930231894809e+03 -6.002357756104038e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.800000000000000e+02 -2.569336236677043e+06 -5.239968856748463e+06 4.115451776271180e+06 -3.452867270810113e+03 -3.034806040575038e+03 -6.002448038896710e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.810000000000000e+02 -2.569405294000546e+06 -5.240029552098325e+06 4.115331725530549e+06 -3.452820203582369e+03 -3.034681852265414e+03 -6.002538316112485e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.820000000000000e+02 -2.569474350431280e+06 -5.240090245015257e+06 4.115211672889093e+06 -3.452773132744545e+03 -3.034557656136329e+03 -6.002628595151657e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.830000000000000e+02 -2.569543405906812e+06 -5.240150935433882e+06 4.115091618469050e+06 -3.452726059758197e+03 -3.034433461768806e+03 -6.002718870123580e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.840000000000000e+02 -2.569612460442858e+06 -5.240211623370638e+06 4.114971562239666e+06 -3.452678986355539e+03 -3.034309265171967e+03 -6.002809142284319e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.850000000000000e+02 -2.569681514039271e+06 -5.240272308825421e+06 4.114851504201169e+06 -3.452631910096400e+03 -3.034185068145301e+03 -6.002899411916281e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.860000000000000e+02 -2.569750566695926e+06 -5.240332991798118e+06 4.114731444353775e+06 -3.452584831732487e+03 -3.034060869860207e+03 -6.002989679079654e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.870000000000000e+02 -2.569819618412973e+06 -5.240393672288878e+06 4.114611382697207e+06 -3.452537752363841e+03 -3.033936670161714e+03 -6.003079943294948e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.880000000000000e+02 -2.569888669190287e+06 -5.240454350297588e+06 4.114491319231675e+06 -3.452490670929586e+03 -3.033812469046193e+03 -6.003170205106720e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.890000000000000e+02 -2.569957719027725e+06 -5.240515025824140e+06 4.114371253957411e+06 -3.452443586901132e+03 -3.033688267515347e+03 -6.003260464247813e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.900000000000000e+02 -2.570026767925444e+06 -5.240575698868685e+06 4.114251186874124e+06 -3.452396501914433e+03 -3.033564064095678e+03 -6.003350720672167e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.910000000000000e+02 -2.570095815898862e+06 -5.240636369447400e+06 4.114131117951571e+06 -3.452349413926883e+03 -3.033439857656569e+03 -6.003440976030948e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.920000000000000e+02 -2.570164862916742e+06 -5.240697037527596e+06 4.114011047250906e+06 -3.452302324101524e+03 -3.033315652651122e+03 -6.003531227340214e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.930000000000000e+02 -2.570233908963702e+06 -5.240757703093136e+06 4.113890974802302e+06 -3.452255235519542e+03 -3.033191449379664e+03 -6.003621472863436e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.940000000000000e+02 -2.570302954132887e+06 -5.240818366241638e+06 4.113770900423197e+06 -3.452208140876438e+03 -3.033067237547650e+03 -6.003711721858395e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.950000000000000e+02 -2.570371998299790e+06 -5.240879026842685e+06 4.113650824357532e+06 -3.452161047558146e+03 -3.032943032537499e+03 -6.003801962296571e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.960000000000000e+02 -2.570441041573385e+06 -5.240939685010443e+06 4.113530746391764e+06 -3.452113950491232e+03 -3.032818819972751e+03 -6.003892204483944e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.970000000000000e+02 -2.570510083891260e+06 -5.241000340679569e+06 4.113410666648147e+06 -3.452066851529831e+03 -3.032694609011747e+03 -6.003982442559928e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.980000000000000e+02 -2.570579125269126e+06 -5.241060993866494e+06 4.113290585095925e+06 -3.452019751893938e+03 -3.032570395984370e+03 -6.004072677869290e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.990000000000000e+02 -2.570648165691297e+06 -5.241121644554823e+06 4.113170501765789e+06 -3.451972650485136e+03 -3.032446183993338e+03 -6.004162909309685e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.000000000000000e+03 -2.570717205204262e+06 -5.241182292793307e+06 4.113050416566562e+06 -3.451925544836836e+03 -3.032321967615615e+03 -6.004253141050482e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.001000000000000e+03 -2.570786243761561e+06 -5.241242938533233e+06 4.112930329589358e+06 -3.451878439642392e+03 -3.032197750921316e+03 -6.004343368509361e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.002000000000000e+03 -2.570855281378601e+06 -5.241303581790770e+06 4.112810240803927e+06 -3.451831332032489e+03 -3.032073533343046e+03 -6.004433593457616e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.003000000000000e+03 -2.570924318055239e+06 -5.241364222565825e+06 4.112690150210499e+06 -3.451784221604858e+03 -3.031949315356846e+03 -6.004523815845655e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.004000000000000e+03 -2.570993353776094e+06 -5.241424860842253e+06 4.112570057839251e+06 -3.451737111617643e+03 -3.031825097152200e+03 -6.004614033906361e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.005000000000000e+03 -2.571062388572121e+06 -5.241485496652512e+06 4.112449963629467e+06 -3.451689998358791e+03 -3.031700876187898e+03 -6.004704250899820e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.006000000000000e+03 -2.571131422427633e+06 -5.241546129980206e+06 4.112329867611841e+06 -3.451642882406631e+03 -3.031576654335885e+03 -6.004794465526696e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.007000000000000e+03 -2.571200455342795e+06 -5.241606760825485e+06 4.112209769786086e+06 -3.451595765892343e+03 -3.031452430749495e+03 -6.004884677151488e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.008000000000000e+03 -2.571269487317373e+06 -5.241667389188154e+06 4.112089670152594e+06 -3.451548646450150e+03 -3.031328206512081e+03 -6.004974886402729e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.009000000000000e+03 -2.571338518367065e+06 -5.241728015084639e+06 4.111969568680606e+06 -3.451501525264483e+03 -3.031203978689753e+03 -6.005065094247598e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.010000000000000e+03 -2.571407548460655e+06 -5.241788638482280e+06 4.111849465431280e+06 -3.451454402436209e+03 -3.031079751867740e+03 -6.005155298176793e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.011000000000000e+03 -2.571476577629086e+06 -5.241849259413515e+06 4.111729360343907e+06 -3.451407276440608e+03 -3.030955522354955e+03 -6.005245500947982e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.012000000000000e+03 -2.571545605841438e+06 -5.241909877845933e+06 4.111609253479133e+06 -3.451360150491099e+03 -3.030831292648641e+03 -6.005335699580397e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.013000000000000e+03 -2.571614633066499e+06 -5.241970493746879e+06 4.111489144898135e+06 -3.451313025135774e+03 -3.030707067857732e+03 -6.005425891056309e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.014000000000000e+03 -2.571683659397372e+06 -5.242031107213904e+06 4.111369034418299e+06 -3.451265894391176e+03 -3.030582836586278e+03 -6.005516084540704e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.015000000000000e+03 -2.571752684787587e+06 -5.242091718198327e+06 4.111248922130748e+06 -3.451218762640610e+03 -3.030458603636265e+03 -6.005606275219984e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.016000000000000e+03 -2.571821709252562e+06 -5.242152326716315e+06 4.111128808005239e+06 -3.451171628078209e+03 -3.030334367861641e+03 -6.005696464630998e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.017000000000000e+03 -2.571890732792153e+06 -5.242212932767741e+06 4.111008692041987e+06 -3.451124489903311e+03 -3.030210129005793e+03 -6.005786653320182e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.018000000000000e+03 -2.571959755328823e+06 -5.242273536271398e+06 4.110888574393079e+06 -3.451077354559059e+03 -3.030085896344058e+03 -6.005876833025816e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.019000000000000e+03 -2.572028776955673e+06 -5.242334137324821e+06 4.110768454875890e+06 -3.451030214936749e+03 -3.029961658828360e+03 -6.005967013299620e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.020000000000000e+03 -2.572097797641492e+06 -5.242394735895343e+06 4.110648333551598e+06 -3.450983073292028e+03 -3.029837420317509e+03 -6.006057190921549e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.021000000000000e+03 -2.572166817401971e+06 -5.242455331999393e+06 4.110528210389433e+06 -3.450935929542178e+03 -3.029713178449129e+03 -6.006147367199314e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.022000000000000e+03 -2.572235836205804e+06 -5.242515925604223e+06 4.110408085450742e+06 -3.450888783935913e+03 -3.029588937627427e+03 -6.006237539646600e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.023000000000000e+03 -2.572304854053153e+06 -5.242576516709989e+06 4.110287958735236e+06 -3.450841638557171e+03 -3.029464696856879e+03 -6.006327707732156e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.024000000000000e+03 -2.572373871006025e+06 -5.242637105381664e+06 4.110167830121227e+06 -3.450794487621778e+03 -3.029340449754717e+03 -6.006417877829625e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.025000000000000e+03 -2.572442886955526e+06 -5.242697691505242e+06 4.110047699822289e+06 -3.450747338368121e+03 -3.029216209301765e+03 -6.006508039288740e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.026000000000000e+03 -2.572511902026117e+06 -5.242758275211032e+06 4.109927567594302e+06 -3.450700184543182e+03 -3.029091959305711e+03 -6.006598203975977e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.027000000000000e+03 -2.572580916077830e+06 -5.242818856352498e+06 4.109807433711801e+06 -3.450653032892372e+03 -3.028967718064199e+03 -6.006688358646488e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.028000000000000e+03 -2.572649929281422e+06 -5.242879435108491e+06 4.109687297839736e+06 -3.450605873237982e+03 -3.028843464605806e+03 -6.006778519729659e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.029000000000000e+03 -2.572718941497234e+06 -5.242940011332741e+06 4.109567160252133e+06 -3.450558715622288e+03 -3.028719214935351e+03 -6.006868673525162e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.030000000000000e+03 -2.572787952740666e+06 -5.243000585041408e+06 4.109447020918738e+06 -3.450511557485008e+03 -3.028594968112113e+03 -6.006958821844996e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.031000000000000e+03 -2.572856963058187e+06 -5.243061156283189e+06 4.109326879748338e+06 -3.450464395917448e+03 -3.028470718764009e+03 -6.007048969051333e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.032000000000000e+03 -2.572925972465496e+06 -5.243121725074491e+06 4.109206736710153e+06 -3.450417231796076e+03 -3.028346463613347e+03 -6.007139116451072e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.033000000000000e+03 -2.572994980931279e+06 -5.243182291382588e+06 4.109086591865547e+06 -3.450370064718470e+03 -3.028222208054519e+03 -6.007229261361548e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.034000000000000e+03 -2.573063988440171e+06 -5.243242855191358e+06 4.108966445244705e+06 -3.450322897832276e+03 -3.028097952347217e+03 -6.007319402036230e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.035000000000000e+03 -2.573132995007564e+06 -5.243303416516970e+06 4.108846296817371e+06 -3.450275728244472e+03 -3.027973696161283e+03 -6.007409540129475e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.036000000000000e+03 -2.573202000648861e+06 -5.243363975375561e+06 4.108726146553292e+06 -3.450228555803768e+03 -3.027849436820040e+03 -6.007499677151241e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.037000000000000e+03 -2.573271005317614e+06 -5.243424531718499e+06 4.108605994543622e+06 -3.450181383954425e+03 -3.027725179717542e+03 -6.007589808455478e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.038000000000000e+03 -2.573340009029233e+06 -5.243485085561940e+06 4.108485840758103e+06 -3.450134211135649e+03 -3.027600923374701e+03 -6.007679935631200e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.039000000000000e+03 -2.573409011861236e+06 -5.243545636987079e+06 4.108365685044540e+06 -3.450087031811045e+03 -3.027476658791717e+03 -6.007770066321987e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.040000000000000e+03 -2.573478013720586e+06 -5.243606185896499e+06 4.108245527585547e+06 -3.450039853554305e+03 -3.027352396282801e+03 -6.007860191140338e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.041000000000000e+03 -2.573547014638219e+06 -5.243666732322602e+06 4.108125368320379e+06 -3.449992673183882e+03 -3.027228132569214e+03 -6.007950313465620e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.042000000000000e+03 -2.573616014598461e+06 -5.243727276249028e+06 4.108005207279745e+06 -3.449945491139017e+03 -3.027103870147746e+03 -6.008040431737576e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.043000000000000e+03 -2.573685013632536e+06 -5.243787817708449e+06 4.107885044402384e+06 -3.449898307275516e+03 -3.026979604055690e+03 -6.008130548685343e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.044000000000000e+03 -2.573754011755846e+06 -5.243848356717003e+06 4.107764879658032e+06 -3.449851119210305e+03 -3.026855333195474e+03 -6.008220666112607e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.045000000000000e+03 -2.573823008875058e+06 -5.243908893177031e+06 4.107644713229838e+06 -3.449803932725516e+03 -3.026731069007833e+03 -6.008310774946277e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.046000000000000e+03 -2.573892005083528e+06 -5.243969427186235e+06 4.107524544934584e+06 -3.449756743327196e+03 -3.026606799332757e+03 -6.008400883986603e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.047000000000000e+03 -2.573961000365481e+06 -5.244029958728158e+06 4.107404374803151e+06 -3.449709550027037e+03 -3.026482527071738e+03 -6.008490992185577e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.048000000000000e+03 -2.574029994674489e+06 -5.244090487754175e+06 4.107284202926720e+06 -3.449662357897074e+03 -3.026358256911167e+03 -6.008581094447014e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.049000000000000e+03 -2.574098988072542e+06 -5.244151014329209e+06 4.107164029183554e+06 -3.449615161560621e+03 -3.026233982030168e+03 -6.008671197164311e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.050000000000000e+03 -2.574167980512908e+06 -5.244211538404374e+06 4.107043853665345e+06 -3.449567963701916e+03 -3.026109708167822e+03 -6.008761295897318e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.051000000000000e+03 -2.574236972026807e+06 -5.244272060012333e+06 4.106923676310827e+06 -3.449520764056027e+03 -3.025985430749388e+03 -6.008851393228162e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.052000000000000e+03 -2.574305962567512e+06 -5.244332579104213e+06 4.106803497211691e+06 -3.449473563890355e+03 -3.025861156090782e+03 -6.008941485132004e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.053000000000000e+03 -2.574374952181483e+06 -5.244393095728667e+06 4.106683316276695e+06 -3.449426360473650e+03 -3.025736878706140e+03 -6.009031575936948e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.054000000000000e+03 -2.574443940837813e+06 -5.244453609853334e+06 4.106563133566524e+06 -3.449379157044743e+03 -3.025612601392355e+03 -6.009121662494134e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.055000000000000e+03 -2.574512928567432e+06 -5.244514121510617e+06 4.106442949020423e+06 -3.449331950480954e+03 -3.025488321413551e+03 -6.009211747860387e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.056000000000000e+03 -2.574581915354671e+06 -5.244574630684142e+06 4.106322762669110e+06 -3.449284741429273e+03 -3.025364040421526e+03 -6.009301830822133e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.057000000000000e+03 -2.574650901199688e+06 -5.244635137374070e+06 4.106202574512288e+06 -3.449237531418146e+03 -3.025239757858727e+03 -6.009391910897442e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.058000000000000e+03 -2.574719886102248e+06 -5.244695641580191e+06 4.106082384550355e+06 -3.449190318694982e+03 -3.025115474378839e+03 -6.009481988631223e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.059000000000000e+03 -2.574788870062520e+06 -5.244756143302664e+06 4.105962192783022e+06 -3.449143105256765e+03 -3.024991189264304e+03 -6.009572063388003e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.060000000000000e+03 -2.574857853095886e+06 -5.244816642557625e+06 4.105841999180017e+06 -3.449095888128852e+03 -3.024866901520254e+03 -6.009662137217553e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.061000000000000e+03 -2.574926835155625e+06 -5.244877139296220e+06 4.105721803833051e+06 -3.449048670622442e+03 -3.024742616717042e+03 -6.009752205452436e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.062000000000000e+03 -2.574995816304016e+06 -5.244937633583587e+06 4.105601606619852e+06 -3.449001450627914e+03 -3.024618326114482e+03 -6.009842273841320e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.063000000000000e+03 -2.575064796494339e+06 -5.244998125370872e+06 4.105481407632126e+06 -3.448954229070096e+03 -3.024494036468117e+03 -6.009932338301121e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.064000000000000e+03 -2.575133775741980e+06 -5.245058614674217e+06 4.105361206839607e+06 -3.448907004979716e+03 -3.024369746373495e+03 -6.010022400077201e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.065000000000000e+03 -2.575202754047101e+06 -5.245119101493769e+06 4.105241004242001e+06 -3.448859780118372e+03 -3.024245454188072e+03 -6.010112459148662e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.066000000000000e+03 -2.575271731409574e+06 -5.245179585829413e+06 4.105120799839533e+06 -3.448812553202740e+03 -3.024121160896488e+03 -6.010202515644007e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.067000000000000e+03 -2.575340707813723e+06 -5.245240067664803e+06 4.105000593662930e+06 -3.448765324404483e+03 -3.023996869164599e+03 -6.010292568051081e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.068000000000000e+03 -2.575409683321820e+06 -5.245300547065062e+06 4.104880385589900e+06 -3.448718092168586e+03 -3.023872569500709e+03 -6.010382622235330e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.069000000000000e+03 -2.575478657856097e+06 -5.245361023948858e+06 4.104760175773163e+06 -3.448670859216455e+03 -3.023748273035245e+03 -6.010472670860544e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.070000000000000e+03 -2.575547631416425e+06 -5.245421498316075e+06 4.104639964212945e+06 -3.448623626241189e+03 -3.023623979110134e+03 -6.010562713925189e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.071000000000000e+03 -2.575616604065055e+06 -5.245481970231849e+06 4.104519750786962e+06 -3.448576389991506e+03 -3.023499680102789e+03 -6.010652757160688e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.072000000000000e+03 -2.575685575786234e+06 -5.245542439679737e+06 4.104399535526106e+06 -3.448529150238334e+03 -3.023375378528475e+03 -6.010742799339736e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.073000000000000e+03 -2.575754546549074e+06 -5.245602906627391e+06 4.104279318491080e+06 -3.448481910695770e+03 -3.023251076618836e+03 -6.010832837375490e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.074000000000000e+03 -2.575823516368957e+06 -5.245663371090955e+06 4.104159099651613e+06 -3.448434668374229e+03 -3.023126774282053e+03 -6.010922872842042e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.075000000000000e+03 -2.575892485230222e+06 -5.245723833054081e+06 4.104038879038432e+06 -3.448387424661935e+03 -3.023002473018272e+03 -6.011012904230039e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.076000000000000e+03 -2.575961453179608e+06 -5.245784292565624e+06 4.103918656559741e+06 -3.448340178512415e+03 -3.022878165833675e+03 -6.011102935809035e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.077000000000000e+03 -2.576030420170410e+06 -5.245844749576765e+06 4.103798432307265e+06 -3.448292931110224e+03 -3.022753859680018e+03 -6.011192963261519e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.078000000000000e+03 -2.576099386186958e+06 -5.245905204071157e+06 4.103678206311742e+06 -3.448245682682359e+03 -3.022629556876057e+03 -6.011282985233549e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.079000000000000e+03 -2.576168351307028e+06 -5.245965656130135e+06 4.103557978420355e+06 -3.448198430600204e+03 -3.022505246186210e+03 -6.011373009066418e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.080000000000000e+03 -2.576237315468404e+06 -5.246026105688645e+06 4.103437748755350e+06 -3.448151177615195e+03 -3.022380936621015e+03 -6.011463028544542e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.081000000000000e+03 -2.576306278686468e+06 -5.246086552762800e+06 4.103317517286439e+06 -3.448103921870977e+03 -3.022256626125195e+03 -6.011553045712310e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.082000000000000e+03 -2.576375240961370e+06 -5.246146997352764e+06 4.103197284013339e+06 -3.448056665156975e+03 -3.022132314066881e+03 -6.011643059994609e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.083000000000000e+03 -2.576444202308411e+06 -5.246207439474569e+06 4.103077048905937e+06 -3.448009405074366e+03 -3.022007999267886e+03 -6.011733073243724e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.084000000000000e+03 -2.576513162696700e+06 -5.246267879095892e+06 4.102956812024952e+06 -3.447962144831792e+03 -3.021883684725010e+03 -6.011823082223361e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.085000000000000e+03 -2.576582122126103e+06 -5.246328316216629e+06 4.102836573370608e+06 -3.447914883048853e+03 -3.021759371126359e+03 -6.011913087270194e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.086000000000000e+03 -2.576651080658567e+06 -5.246388750901601e+06 4.102716332821113e+06 -3.447867616196045e+03 -3.021635051156504e+03 -6.012003094089343e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.087000000000000e+03 -2.576720038216644e+06 -5.246449183069793e+06 4.102596090528696e+06 -3.447820350155719e+03 -3.021510733070139e+03 -6.012093095274559e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.088000000000000e+03 -2.576788994831251e+06 -5.246509612753554e+06 4.102475846432574e+06 -3.447773082268183e+03 -3.021386413883313e+03 -6.012183093775051e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.089000000000000e+03 -2.576857950486721e+06 -5.246570039936550e+06 4.102355600563480e+06 -3.447725812509926e+03 -3.021262096027619e+03 -6.012273088304899e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.090000000000000e+03 -2.576926905214258e+06 -5.246630464651395e+06 4.102235352860108e+06 -3.447678540983341e+03 -3.021137774515938e+03 -6.012363081473945e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.091000000000000e+03 -2.576995858998209e+06 -5.246690886881738e+06 4.102115103353186e+06 -3.447631267321129e+03 -3.021013451772050e+03 -6.012453072175634e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.092000000000000e+03 -2.577064811807390e+06 -5.246751306595016e+06 4.101994852103963e+06 -3.447583992717189e+03 -3.020889132371952e+03 -6.012543057359188e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.093000000000000e+03 -2.577133763750606e+06 -5.246811723904986e+06 4.101874598898576e+06 -3.447536713042052e+03 -3.020764801409709e+03 -6.012633047084700e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.094000000000000e+03 -2.577202714672527e+06 -5.246872138649240e+06 4.101754344042348e+06 -3.447489435518349e+03 -3.020640479144178e+03 -6.012723026858792e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.095000000000000e+03 -2.577271664697167e+06 -5.246932550957503e+06 4.101634087291426e+06 -3.447442152874544e+03 -3.020516150315111e+03 -6.012813008531823e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.096000000000000e+03 -2.577340613762609e+06 -5.246992960765009e+06 4.101513828767559e+06 -3.447394870163210e+03 -3.020391821730138e+03 -6.012902985895501e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.097000000000000e+03 -2.577409561884138e+06 -5.247053368087783e+06 4.101393568440630e+06 -3.447347584624332e+03 -3.020267492258512e+03 -6.012992960960077e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.098000000000000e+03 -2.577478509061921e+06 -5.247113772925989e+06 4.101273306310352e+06 -3.447300298458038e+03 -3.020143161323659e+03 -6.013082932911809e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.099000000000000e+03 -2.577547455311330e+06 -5.247174175295730e+06 4.101153042346430e+06 -3.447253008581137e+03 -3.020018827505361e+03 -6.013172904079765e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.100000000000000e+03 -2.577616400585674e+06 -5.247234575148226e+06 4.101032776640632e+06 -3.447205718301413e+03 -3.019894496559471e+03 -6.013262869707408e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.101000000000000e+03 -2.577685344900644e+06 -5.247294972499849e+06 4.100912509162157e+06 -3.447158428435654e+03 -3.019770165779713e+03 -6.013352830822525e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.102000000000000e+03 -2.577754288302649e+06 -5.247355367399164e+06 4.100792239819688e+06 -3.447111134163728e+03 -3.019645830136378e+03 -6.013442792564581e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.103000000000000e+03 -2.577823230791548e+06 -5.247415759846060e+06 4.100671968613442e+06 -3.447063835461719e+03 -3.019521490091799e+03 -6.013532754698726e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.104000000000000e+03 -2.577892172289921e+06 -5.247476149759565e+06 4.100551695695705e+06 -3.447016538878584e+03 -3.019397153887883e+03 -6.013622709491583e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.105000000000000e+03 -2.577961112859700e+06 -5.247536537204468e+06 4.100431420944640e+06 -3.446969238816643e+03 -3.019272814923604e+03 -6.013712663316570e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.106000000000000e+03 -2.578030052485231e+06 -5.247596922164423e+06 4.100311144390993e+06 -3.446921936843118e+03 -3.019148474811340e+03 -6.013802614515043e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.107000000000000e+03 -2.578098991197703e+06 -5.247657304672038e+06 4.100190865973433e+06 -3.446874631649757e+03 -3.019024129627058e+03 -6.013892565846153e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.108000000000000e+03 -2.578167928919307e+06 -5.247717684646003e+06 4.100070585844939e+06 -3.446827326530894e+03 -3.018899789165497e+03 -6.013982510408070e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.109000000000000e+03 -2.578236865712262e+06 -5.247778062151349e+06 4.099950303883159e+06 -3.446780019686689e+03 -3.018775445200497e+03 -6.014072453504680e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.110000000000000e+03 -2.578305801560922e+06 -5.247838437171749e+06 4.099830020118824e+06 -3.446732710474729e+03 -3.018651100195025e+03 -6.014162394149869e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.111000000000000e+03 -2.578374736449628e+06 -5.247898809690871e+06 4.099709734582689e+06 -3.446685399725108e+03 -3.018526756314014e+03 -6.014252330766482e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.112000000000000e+03 -2.578443670425088e+06 -5.247959179757525e+06 4.099589447182897e+06 -3.446638086346342e+03 -3.018402406945465e+03 -6.014342267435822e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.113000000000000e+03 -2.578512603440631e+06 -5.248019547322940e+06 4.099469158011239e+06 -3.446590771755105e+03 -3.018278058407667e+03 -6.014432200067514e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.114000000000000e+03 -2.578581535527129e+06 -5.248079912419443e+06 4.099348867006891e+06 -3.446543453269407e+03 -3.018153707370913e+03 -6.014522131802972e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.115000000000000e+03 -2.578650466653731e+06 -5.248140275014750e+06 4.099228574230608e+06 -3.446496135375908e+03 -3.018029356210829e+03 -6.014612059090195e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.116000000000000e+03 -2.578719396835813e+06 -5.248200635124969e+06 4.099108279652090e+06 -3.446448815015935e+03 -3.017905004251611e+03 -6.014701983847623e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.117000000000000e+03 -2.578788326042206e+06 -5.248260992717561e+06 4.098987983332602e+06 -3.446401493884087e+03 -3.017780655264861e+03 -6.014791903201874e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.118000000000000e+03 -2.578857254335125e+06 -5.248321347857530e+06 4.098867685149778e+06 -3.446354170328264e+03 -3.017656300617082e+03 -6.014881822596166e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.119000000000000e+03 -2.578926181667899e+06 -5.248381700496128e+06 4.098747385195400e+06 -3.446306845242593e+03 -3.017531947000029e+03 -6.014971738008418e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.120000000000000e+03 -2.578995108086928e+06 -5.248442050681879e+06 4.098627083378129e+06 -3.446259515976421e+03 -3.017407588690889e+03 -6.015061653838578e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.121000000000000e+03 -2.579064033561345e+06 -5.248502398382502e+06 4.098506779758713e+06 -3.446212185756259e+03 -3.017283228543613e+03 -6.015151566922174e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.122000000000000e+03 -2.579132958059890e+06 -5.248562743565391e+06 4.098386474398599e+06 -3.446164854480145e+03 -3.017158871995211e+03 -6.015241474414016e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.123000000000000e+03 -2.579201881644772e+06 -5.248623086295533e+06 4.098266167175399e+06 -3.446117520641329e+03 -3.017034509470104e+03 -6.015331382183957e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.124000000000000e+03 -2.579270804269323e+06 -5.248683426524186e+06 4.098145858180915e+06 -3.446070185335362e+03 -3.016910148205283e+03 -6.015421285817830e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.125000000000000e+03 -2.579339725948915e+06 -5.248743764267447e+06 4.098025547384837e+06 -3.446022847499780e+03 -3.016785785779156e+03 -6.015511187147037e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.126000000000000e+03 -2.579408646652690e+06 -5.248804099493045e+06 4.097905234847935e+06 -3.445975510969055e+03 -3.016661425469922e+03 -6.015601082472559e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.127000000000000e+03 -2.579477566473573e+06 -5.248864432298140e+06 4.097784920387279e+06 -3.445928168187299e+03 -3.016537056887676e+03 -6.015690981177089e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.128000000000000e+03 -2.579546485333875e+06 -5.248924762601559e+06 4.097664604155712e+06 -3.445880823847524e+03 -3.016412689131173e+03 -6.015780876023475e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.129000000000000e+03 -2.579615403202733e+06 -5.248985090371045e+06 4.097544286214010e+06 -3.445833481469131e+03 -3.016288325587287e+03 -6.015870763415889e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.130000000000000e+03 -2.579684320188585e+06 -5.249045415719941e+06 4.097423966348699e+06 -3.445786133094583e+03 -3.016163953296920e+03 -6.015960654308938e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.131000000000000e+03 -2.579753236198239e+06 -5.249105738550889e+06 4.097303644743171e+06 -3.445738784338961e+03 -3.016039583914515e+03 -6.016050539635798e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.132000000000000e+03 -2.579822151231852e+06 -5.249166058864040e+06 4.097183321397136e+06 -3.445691436400221e+03 -3.015915216553540e+03 -6.016140419259124e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.133000000000000e+03 -2.579891065366733e+06 -5.249226376740240e+06 4.097062996158352e+06 -3.445644082670396e+03 -3.015790843272498e+03 -6.016230300772645e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.134000000000000e+03 -2.579959978572030e+06 -5.249286692147206e+06 4.096942669087580e+06 -3.445596727650677e+03 -3.015666465723103e+03 -6.016320181004724e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.135000000000000e+03 -2.580028890770059e+06 -5.249347005003820e+06 4.096822340337688e+06 -3.445549373462188e+03 -3.015542095470703e+03 -6.016410052716902e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.136000000000000e+03 -2.580097802007208e+06 -5.249407315358583e+06 4.096702009817315e+06 -3.445502017905627e+03 -3.015417725791674e+03 -6.016499920609653e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.137000000000000e+03 -2.580166712392198e+06 -5.249467623325061e+06 4.096581677312470e+06 -3.445454656219571e+03 -3.015293343149414e+03 -6.016589794314233e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.138000000000000e+03 -2.580235621754310e+06 -5.249527928724919e+06 4.096461343159195e+06 -3.445407296707584e+03 -3.015168969066793e+03 -6.016679658143860e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.139000000000000e+03 -2.580304530201954e+06 -5.249588231671458e+06 4.096341007144013e+06 -3.445359932873078e+03 -3.015044590470772e+03 -6.016769522366137e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.140000000000000e+03 -2.580373437735286e+06 -5.249648532164827e+06 4.096220669266624e+06 -3.445312566203957e+03 -3.014920206023762e+03 -6.016859386935414e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.141000000000000e+03 -2.580442344292155e+06 -5.249708830140116e+06 4.096100329649377e+06 -3.445265199357387e+03 -3.014795824716130e+03 -6.016949245713045e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.142000000000000e+03 -2.580511249887917e+06 -5.249769125613413e+06 4.095979988261971e+06 -3.445217830674405e+03 -3.014671444500164e+03 -6.017039100633805e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.143000000000000e+03 -2.580580154553754e+06 -5.249829418617268e+06 4.095859645043049e+06 -3.445170460457126e+03 -3.014547060393450e+03 -6.017128954196104e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.144000000000000e+03 -2.580649058305039e+06 -5.249889709167765e+06 4.095739299962299e+06 -3.445123086054128e+03 -3.014422671642300e+03 -6.017218808150241e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.145000000000000e+03 -2.580717961048595e+06 -5.249949997167609e+06 4.095618953203149e+06 -3.445075713037985e+03 -3.014298289662743e+03 -6.017308653584152e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.146000000000000e+03 -2.580786862893120e+06 -5.250010282730334e+06 4.095498604551568e+06 -3.445028336036125e+03 -3.014173900225836e+03 -6.017398500805128e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.147000000000000e+03 -2.580855763776361e+06 -5.250070565790952e+06 4.095378254130096e+06 -3.444980957355617e+03 -3.014049512408601e+03 -6.017488343808135e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.148000000000000e+03 -2.580924663713978e+06 -5.250130846365805e+06 4.095257901907898e+06 -3.444933577744487e+03 -3.013925122113826e+03 -6.017578184393026e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.149000000000000e+03 -2.580993562705848e+06 -5.250191124454794e+06 4.095137547885204e+06 -3.444886195975520e+03 -3.013800731499879e+03 -6.017668022035728e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.150000000000000e+03 -2.581062460736321e+06 -5.250251400041603e+06 4.095017192092772e+06 -3.444838812524503e+03 -3.013676341702481e+03 -6.017757855889914e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.151000000000000e+03 -2.581131357852066e+06 -5.250311673174969e+06 4.094896834438706e+06 -3.444791426324101e+03 -3.013551946313859e+03 -6.017847689908062e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.152000000000000e+03 -2.581200253975437e+06 -5.250371943773817e+06 4.094776475075908e+06 -3.444744040753752e+03 -3.013427555933521e+03 -6.017937516731197e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.153000000000000e+03 -2.581269149214816e+06 -5.250432211951384e+06 4.094656113790852e+06 -3.444696648911345e+03 -3.013303156978287e+03 -6.018027347097714e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.154000000000000e+03 -2.581338043461841e+06 -5.250492477594470e+06 4.094535750797000e+06 -3.444649259121843e+03 -3.013178761869433e+03 -6.018117170163712e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.155000000000000e+03 -2.581406936809395e+06 -5.250552740800121e+06 4.094415385911352e+06 -3.444601864041225e+03 -3.013054360301685e+03 -6.018206995147764e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.156000000000000e+03 -2.581475829133322e+06 -5.250613001438690e+06 4.094295019378440e+06 -3.444554471455415e+03 -3.012929967276145e+03 -6.018296810109160e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.157000000000000e+03 -2.581544720573303e+06 -5.250673259656054e+06 4.094174650923128e+06 -3.444507074157405e+03 -3.012805564964149e+03 -6.018386628197905e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.158000000000000e+03 -2.581613611067093e+06 -5.250733515387246e+06 4.094054280667962e+06 -3.444459674001444e+03 -3.012681161967696e+03 -6.018476443894949e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.159000000000000e+03 -2.581682500583849e+06 -5.250793768600032e+06 4.093933908673730e+06 -3.444412274827360e+03 -3.012556760892837e+03 -6.018566253861093e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.160000000000000e+03 -2.581751389169942e+06 -5.250854019342886e+06 4.093813534849043e+06 -3.444364872387771e+03 -3.012432357462683e+03 -6.018656062531648e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.161000000000000e+03 -2.581820276809730e+06 -5.250914267599496e+06 4.093693159224660e+06 -3.444317467471664e+03 -3.012307952795480e+03 -6.018745868910485e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.162000000000000e+03 -2.581889163518875e+06 -5.250974513386201e+06 4.093572781769756e+06 -3.444270060950600e+03 -3.012183544595779e+03 -6.018835673774849e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.163000000000000e+03 -2.581958049250747e+06 -5.251034756654328e+06 4.093452402576171e+06 -3.444222654012088e+03 -3.012059139152351e+03 -6.018925473176760e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.164000000000000e+03 -2.582026934082704e+06 -5.251094997484709e+06 4.093332021491428e+06 -3.444175241656541e+03 -3.011934727418497e+03 -6.019015274469381e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.165000000000000e+03 -2.582095817921903e+06 -5.251155235780363e+06 4.093211638698478e+06 -3.444127831209513e+03 -3.011810319310285e+03 -6.019105068654535e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.166000000000000e+03 -2.582164700799213e+06 -5.251215471573565e+06 4.093091254136470e+06 -3.444080419542147e+03 -3.011685912446543e+03 -6.019194858589926e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.167000000000000e+03 -2.582233582776497e+06 -5.251275704928935e+06 4.092970867683459e+06 -3.444033002473268e+03 -3.011561498924415e+03 -6.019284650603298e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.168000000000000e+03 -2.582302463822912e+06 -5.251335935814256e+06 4.092850479400234e+06 -3.443985583867875e+03 -3.011437081737399e+03 -6.019374441137273e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.169000000000000e+03 -2.582371343891826e+06 -5.251396164180868e+06 4.092730089378649e+06 -3.443938164659604e+03 -3.011312667468658e+03 -6.019464226217641e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.170000000000000e+03 -2.582440222983109e+06 -5.251456390028660e+06 4.092609697618935e+06 -3.443890744982615e+03 -3.011188256124018e+03 -6.019554005773490e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.171000000000000e+03 -2.582509101158906e+06 -5.251516613422515e+06 4.092489303998625e+06 -3.443843322539547e+03 -3.011063839243360e+03 -6.019643785469871e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.172000000000000e+03 -2.582577978403490e+06 -5.251576834346051e+06 4.092368908548648e+06 -3.443795896103376e+03 -3.010939419882843e+03 -6.019733564306047e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.173000000000000e+03 -2.582646854686023e+06 -5.251637052767050e+06 4.092248511329816e+06 -3.443748470139099e+03 -3.010815000525503e+03 -6.019823338691996e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.174000000000000e+03 -2.582715730021868e+06 -5.251697268701592e+06 4.092128112311799e+06 -3.443701041520878e+03 -3.010690580401357e+03 -6.019913110626400e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.175000000000000e+03 -2.582784604426385e+06 -5.251757482165741e+06 4.092007711464279e+06 -3.443653609757363e+03 -3.010566157623304e+03 -6.020002881361831e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.176000000000000e+03 -2.582853477853242e+06 -5.251817693111106e+06 4.091887308878606e+06 -3.443606178855666e+03 -3.010441736620756e+03 -6.020092646507296e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.177000000000000e+03 -2.582922350317801e+06 -5.251877901553763e+06 4.091766904524456e+06 -3.443558746599527e+03 -3.010317316724245e+03 -6.020182407545601e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.178000000000000e+03 -2.582991221897411e+06 -5.251938107574495e+06 4.091646498249319e+06 -3.443511308208168e+03 -3.010192888612668e+03 -6.020272171859636e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.179000000000000e+03 -2.583060092514750e+06 -5.251998311092549e+06 4.091526090205637e+06 -3.443463869967985e+03 -3.010068460258431e+03 -6.020361932017399e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.180000000000000e+03 -2.583128962138681e+06 -5.252058512075474e+06 4.091405680454735e+06 -3.443416431991259e+03 -3.009944036968821e+03 -6.020451685142547e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.181000000000000e+03 -2.583197830846562e+06 -5.252118710604036e+06 4.091285268844100e+06 -3.443368990204936e+03 -3.009819608843652e+03 -6.020541438565234e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.182000000000000e+03 -2.583266698638542e+06 -5.252178906678388e+06 4.091164855373428e+06 -3.443321545164376e+03 -3.009695175354444e+03 -6.020631192283485e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.183000000000000e+03 -2.583335565436910e+06 -5.252239100217447e+06 4.091044440195870e+06 -3.443274100316249e+03 -3.009570746751256e+03 -6.020720939100589e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.184000000000000e+03 -2.583404431303815e+06 -5.252299291286076e+06 4.090924023188938e+06 -3.443226653829778e+03 -3.009446314592601e+03 -6.020810684431205e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.185000000000000e+03 -2.583473296223614e+06 -5.252359479867979e+06 4.090803604383399e+06 -3.443179204594357e+03 -3.009321881458869e+03 -6.020900427469176e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.186000000000000e+03 -2.583542160180687e+06 -5.252419665946887e+06 4.090683183810039e+06 -3.443131754108805e+03 -3.009197449680318e+03 -6.020990166215174e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.187000000000000e+03 -2.583611023221670e+06 -5.252479849571452e+06 4.090562761376905e+06 -3.443084300904135e+03 -3.009073012067376e+03 -6.021079905234008e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.188000000000000e+03 -2.583679885299954e+06 -5.252540030693051e+06 4.090442337175877e+06 -3.443036846576313e+03 -3.008948575237142e+03 -6.021169640200367e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.189000000000000e+03 -2.583748746399895e+06 -5.252600209295411e+06 4.090321911237736e+06 -3.442989391144218e+03 -3.008824141867268e+03 -6.021259369683050e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.190000000000000e+03 -2.583817606614631e+06 -5.252660385475697e+06 4.090201483378872e+06 -3.442941931577313e+03 -3.008699698756050e+03 -6.021349102232142e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.191000000000000e+03 -2.583886465851052e+06 -5.252720559136786e+06 4.090081053782826e+06 -3.442894471272948e+03 -3.008575258785181e+03 -6.021438829281073e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.192000000000000e+03 -2.583955324155505e+06 -5.252780730327066e+06 4.089960622358167e+06 -3.442847007857224e+03 -3.008450815826204e+03 -6.021528555290196e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.193000000000000e+03 -2.584024181497169e+06 -5.252840899014352e+06 4.089840189165710e+06 -3.442799544444621e+03 -3.008326373256509e+03 -6.021618276883745e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.194000000000000e+03 -2.584093037860409e+06 -5.252901065182367e+06 4.089719754236230e+06 -3.442752080450021e+03 -3.008201933192633e+03 -6.021707993235690e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.195000000000000e+03 -2.584161893338051e+06 -5.252961228928015e+06 4.089599317386628e+06 -3.442704610420851e+03 -3.008077485207555e+03 -6.021797712651738e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.196000000000000e+03 -2.584230747821803e+06 -5.253021390138264e+06 4.089478878830497e+06 -3.442657142333800e+03 -3.007953040742893e+03 -6.021887425005166e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.197000000000000e+03 -2.584299601357905e+06 -5.253081548861425e+06 4.089358438476570e+06 -3.442609671177635e+03 -3.007828595998041e+03 -6.021977134859816e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.198000000000000e+03 -2.584368453962014e+06 -5.253141705113808e+06 4.089237996293997e+06 -3.442562198571513e+03 -3.007704147221548e+03 -6.022066843384147e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.199000000000000e+03 -2.584437305618509e+06 -5.253201858879142e+06 4.089117552313559e+06 -3.442514723746931e+03 -3.007579697675304e+03 -6.022156549237237e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.200000000000000e+03 -2.584506156342731e+06 -5.253262010173479e+06 4.088997106504919e+06 -3.442467245054839e+03 -3.007455245616056e+03 -6.022246254181962e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.201000000000000e+03 -2.584575006103863e+06 -5.253322158964637e+06 4.088876658928908e+06 -3.442419766699592e+03 -3.007330793513418e+03 -6.022335954771788e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.202000000000000e+03 -2.584643854886281e+06 -5.253382305236347e+06 4.088756209616304e+06 -3.442372287861986e+03 -3.007206344258308e+03 -6.022425649889053e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.203000000000000e+03 -2.584712702751810e+06 -5.253442449053152e+06 4.088635758445106e+06 -3.442324804834715e+03 -3.007081890540650e+03 -6.022515345296089e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.204000000000000e+03 -2.584781549700611e+06 -5.253502590415202e+06 4.088515305415011e+06 -3.442277319035577e+03 -3.006957431111081e+03 -6.022605040935221e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.205000000000000e+03 -2.584850395655094e+06 -5.253562729241566e+06 4.088394850679045e+06 -3.442229833669258e+03 -3.006832976465158e+03 -6.022694729609866e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.206000000000000e+03 -2.584919240677084e+06 -5.253622865596793e+06 4.088274394115195e+06 -3.442182344982891e+03 -3.006708519097101e+03 -6.022784417208754e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.207000000000000e+03 -2.584988084751251e+06 -5.253682999464867e+06 4.088153935753730e+06 -3.442134855399503e+03 -3.006584060084987e+03 -6.022874101929105e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.208000000000000e+03 -2.585056927877363e+06 -5.253743130845587e+06 4.088033475595048e+06 -3.442087363039644e+03 -3.006459600340851e+03 -6.022963784241680e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.209000000000000e+03 -2.585125770055581e+06 -5.253803259739107e+06 4.087913013638854e+06 -3.442039869988905e+03 -3.006335138823336e+03 -6.023053463639629e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.210000000000000e+03 -2.585194611285764e+06 -5.253863386145320e+06 4.087792549885373e+06 -3.441992374233263e+03 -3.006210676483963e+03 -6.023143140641099e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.211000000000000e+03 -2.585263451583267e+06 -5.253923510080267e+06 4.087672084304267e+06 -3.441944875342048e+03 -3.006086211485909e+03 -6.023232816439006e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.212000000000000e+03 -2.585332290917269e+06 -5.253983631511781e+06 4.087551616956374e+06 -3.441897376427932e+03 -3.005961746447538e+03 -6.023322488063826e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.213000000000000e+03 -2.585401129303135e+06 -5.254043750455920e+06 4.087431147811348e+06 -3.441849875355129e+03 -3.005837280468492e+03 -6.023412157077786e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.214000000000000e+03 -2.585469966709739e+06 -5.254103866880251e+06 4.087310676930551e+06 -3.441802373599893e+03 -3.005712817599012e+03 -6.023501820583442e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.215000000000000e+03 -2.585538803230176e+06 -5.254163980881861e+06 4.087190204130304e+06 -3.441754867437234e+03 -3.005588345246943e+03 -6.023591487149890e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.216000000000000e+03 -2.585607638771379e+06 -5.254224092363712e+06 4.087069729594213e+06 -3.441707360640872e+03 -3.005463875928943e+03 -6.023681148223324e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.217000000000000e+03 -2.585676473333217e+06 -5.254284201325690e+06 4.086949253322507e+06 -3.441659853231467e+03 -3.005339409408523e+03 -6.023770803919067e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.218000000000000e+03 -2.585745307024251e+06 -5.254344307881028e+06 4.086828775100939e+06 -3.441612340312289e+03 -3.005214931900157e+03 -6.023860464032584e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.219000000000000e+03 -2.585814139689489e+06 -5.254404411868072e+06 4.086708295235386e+06 -3.441564829949662e+03 -3.005090462687159e+03 -6.023950114244337e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.220000000000000e+03 -2.585882971468166e+06 -5.254464513432094e+06 4.086587813450981e+06 -3.441517313434495e+03 -3.004965985177238e+03 -6.024039767772952e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.221000000000000e+03 -2.585951802252041e+06 -5.254524612460175e+06 4.086467329961400e+06 -3.441469798691468e+03 -3.004841511522901e+03 -6.024129414152373e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.222000000000000e+03 -2.586020632102820e+06 -5.254584709016728e+06 4.086346844644769e+06 -3.441422280170575e+03 -3.004717035434507e+03 -6.024219059534695e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.223000000000000e+03 -2.586089460958725e+06 -5.254644803037302e+06 4.086226357623071e+06 -3.441374763595417e+03 -3.004592563317242e+03 -6.024308697619119e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.224000000000000e+03 -2.586158288958993e+06 -5.254704894667133e+06 4.086105868621409e+06 -3.441327239368366e+03 -3.004468078731971e+03 -6.024398341991349e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.225000000000000e+03 -2.586227115964108e+06 -5.254764983760765e+06 4.085985377915133e+06 -3.441279715187572e+03 -3.004343599266565e+03 -6.024487979421063e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.226000000000000e+03 -2.586295941989724e+06 -5.254825070334496e+06 4.085864885473381e+06 -3.441232192091124e+03 -3.004219121667979e+03 -6.024577611105944e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.227000000000000e+03 -2.586364767128613e+06 -5.254885154485112e+06 4.085744391112958e+06 -3.441184663136613e+03 -3.004094635541944e+03 -6.024667246078516e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.228000000000000e+03 -2.586433591287722e+06 -5.254945236115608e+06 4.085623895017507e+06 -3.441137133112810e+03 -3.003970152546279e+03 -6.024756875729790e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.229000000000000e+03 -2.586502414498196e+06 -5.255005315258432e+06 4.085503397125602e+06 -3.441089602966317e+03 -3.003845667466604e+03 -6.024846502342723e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.230000000000000e+03 -2.586571236728920e+06 -5.255065391881182e+06 4.085382897498609e+06 -3.441042071758877e+03 -3.003721185646722e+03 -6.024936123562081e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.231000000000000e+03 -2.586640058057189e+06 -5.255125466064477e+06 4.085262395983892e+06 -3.440994535913375e+03 -3.003596696999861e+03 -6.025025746547947e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.232000000000000e+03 -2.586708878452175e+06 -5.255185537776176e+06 4.085141892642300e+06 -3.440946997725154e+03 -3.003472204972535e+03 -6.025115368308875e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.233000000000000e+03 -2.586777697836241e+06 -5.255245606935356e+06 4.085021387627100e+06 -3.440899460584924e+03 -3.003347719769869e+03 -6.025204981717563e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.234000000000000e+03 -2.586846516317932e+06 -5.255305673655171e+06 4.084900880723986e+06 -3.440851920154278e+03 -3.003223226938071e+03 -6.025294596633198e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.235000000000000e+03 -2.586915333819685e+06 -5.255365737854809e+06 4.084780372086048e+06 -3.440804378493521e+03 -3.003098737472968e+03 -6.025384206185025e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.236000000000000e+03 -2.586984150403301e+06 -5.255425799598723e+06 4.084659861591219e+06 -3.440756833139690e+03 -3.002974243054075e+03 -6.025473816030498e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.237000000000000e+03 -2.587052966022498e+06 -5.255485858838628e+06 4.084539349330929e+06 -3.440709287914436e+03 -3.002849748681578e+03 -6.025563421581641e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.238000000000000e+03 -2.587121780677139e+06 -5.255545915574423e+06 4.084418835305403e+06 -3.440661741131135e+03 -3.002725255549668e+03 -6.025653023061969e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.239000000000000e+03 -2.587190594413521e+06 -5.255605969854422e+06 4.084298319423139e+06 -3.440614189830431e+03 -3.002600757667940e+03 -6.025742625145778e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.240000000000000e+03 -2.587259407200850e+06 -5.255666021646487e+06 4.084177801745000e+06 -3.440566637944669e+03 -3.002476258127778e+03 -6.025832224200365e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.241000000000000e+03 -2.587328219023511e+06 -5.255726070934365e+06 4.084057282301779e+06 -3.440519084737171e+03 -3.002351759186964e+03 -6.025921819403902e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.242000000000000e+03 -2.587397029865890e+06 -5.255786117701818e+06 4.083936761124285e+06 -3.440471530849018e+03 -3.002227263538015e+03 -6.026011409005579e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.243000000000000e+03 -2.587465839821020e+06 -5.255846162045826e+06 4.083816238028767e+06 -3.440423972453258e+03 -3.002102758601634e+03 -6.026101001607968e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.244000000000000e+03 -2.587534648749450e+06 -5.255906203821031e+06 4.083695713290639e+06 -3.440376416220271e+03 -3.001978262035082e+03 -6.026190584477439e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.245000000000000e+03 -2.587603456821321e+06 -5.255966243204841e+06 4.083575186573773e+06 -3.440328852285301e+03 -3.001853753387624e+03 -6.026280173446658e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.246000000000000e+03 -2.587672263851034e+06 -5.256026280003755e+06 4.083454658244818e+06 -3.440281292610538e+03 -3.001729254394686e+03 -6.026369750939387e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.247000000000000e+03 -2.587741070008637e+06 -5.256086314395085e+06 4.083334127967806e+06 -3.440233725962986e+03 -3.001604745329952e+03 -6.026459333097599e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.248000000000000e+03 -2.587809875170446e+06 -5.256146346249883e+06 4.083213595987070e+06 -3.440186160939435e+03 -3.001480239904859e+03 -6.026548908301454e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.249000000000000e+03 -2.587878679413733e+06 -5.256206375648728e+06 4.083093062149947e+06 -3.440138591982054e+03 -3.001355730170056e+03 -6.026638483578394e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.250000000000000e+03 -2.587947482676433e+06 -5.256266402526958e+06 4.082972526578974e+06 -3.440091022102063e+03 -3.001231223073264e+03 -6.026728053723319e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.251000000000000e+03 -2.588016284989670e+06 -5.256326426917005e+06 4.082851989212708e+06 -3.440043451511105e+03 -3.001106714532571e+03 -6.026817620789700e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.252000000000000e+03 -2.588085086368788e+06 -5.256386448834883e+06 4.082731450020783e+06 -3.439995877732122e+03 -3.000982202784690e+03 -6.026907186967067e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.253000000000000e+03 -2.588153886829121e+06 -5.256446468296613e+06 4.082610908972851e+06 -3.439948299662485e+03 -3.000857686816897e+03 -6.026996753350358e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.254000000000000e+03 -2.588222686308924e+06 -5.256506485237818e+06 4.082490366190941e+06 -3.439900722690870e+03 -3.000733172711145e+03 -6.027086313987861e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.255000000000000e+03 -2.588291484823540e+06 -5.256566499674523e+06 4.082369821644696e+06 -3.439853144150941e+03 -3.000608659585313e+03 -6.027175870698939e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.256000000000000e+03 -2.588360282403784e+06 -5.256626511638878e+06 4.082249275273181e+06 -3.439805562393593e+03 -3.000484143674612e+03 -6.027265426312133e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.257000000000000e+03 -2.588429079065294e+06 -5.256686521147161e+06 4.082128727045514e+06 -3.439757977945997e+03 -3.000359622269320e+03 -6.027354981993654e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.258000000000000e+03 -2.588497874761403e+06 -5.256746528150786e+06 4.082008177053846e+06 -3.439710391381193e+03 -3.000235102189110e+03 -6.027444533844383e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.259000000000000e+03 -2.588566669461325e+06 -5.256806532617643e+06 4.081887625359056e+06 -3.439662807087048e+03 -3.000110585927221e+03 -6.027534078320549e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.260000000000000e+03 -2.588635463242300e+06 -5.256866534628274e+06 4.081767071808444e+06 -3.439615218248518e+03 -2.999986065201203e+03 -6.027623623259908e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.261000000000000e+03 -2.588704256073241e+06 -5.256926534150303e+06 4.081646516463405e+06 -3.439567627119050e+03 -2.999861543352232e+03 -6.027713165752032e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.262000000000000e+03 -2.588773047954301e+06 -5.256986531183884e+06 4.081525959323648e+06 -3.439520035047527e+03 -2.999737020025903e+03 -6.027802705300469e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.263000000000000e+03 -2.588841838900835e+06 -5.257046525745037e+06 4.081405400358810e+06 -3.439472440061942e+03 -2.999612493724105e+03 -6.027892243697452e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.264000000000000e+03 -2.588910628866265e+06 -5.257106517785264e+06 4.081284839660877e+06 -3.439424844101726e+03 -2.999487970408811e+03 -6.027981776806168e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.265000000000000e+03 -2.588979417897188e+06 -5.257166507353099e+06 4.081164277137799e+06 -3.439377246652234e+03 -2.999363443447231e+03 -6.028071308395893e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.266000000000000e+03 -2.589048205993464e+06 -5.257226494448427e+06 4.081043712789794e+06 -3.439329645890815e+03 -2.999238913580825e+03 -6.028160838998300e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.267000000000000e+03 -2.589116993093062e+06 -5.257286479006645e+06 4.080923146739448e+06 -3.439282045529515e+03 -2.999114388754436e+03 -6.028250362529961e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.268000000000000e+03 -2.589185779304451e+06 -5.257346461140768e+06 4.080802578772341e+06 -3.439234440344649e+03 -2.998989854478378e+03 -6.028339889301637e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.269000000000000e+03 -2.589254564503717e+06 -5.257406440721702e+06 4.080682009133413e+06 -3.439186836786357e+03 -2.998865326940289e+03 -6.028429407483324e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.270000000000000e+03 -2.589323348814505e+06 -5.257466417878309e+06 4.080561437578178e+06 -3.439139227247941e+03 -2.998740790768976e+03 -6.028518929059018e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.271000000000000e+03 -2.589392132159610e+06 -5.257526392530137e+06 4.080440864259286e+06 -3.439091617477814e+03 -2.998616255053269e+03 -6.028608446308787e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.272000000000000e+03 -2.589460914476907e+06 -5.257586364612502e+06 4.080320289299500e+06 -3.439044009667144e+03 -2.998491727932153e+03 -6.028697953819242e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.273000000000000e+03 -2.589529695921281e+06 -5.257646334286765e+06 4.080199712392626e+06 -3.438996396187365e+03 -2.998367189782584e+03 -6.028787465831782e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.274000000000000e+03 -2.589598476415235e+06 -5.257706301472210e+06 4.080079133691830e+06 -3.438948780614727e+03 -2.998242650655307e+03 -6.028876975219718e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.275000000000000e+03 -2.589667255943159e+06 -5.257766266152609e+06 4.079958553227941e+06 -3.438901163309632e+03 -2.998118112747890e+03 -6.028966480638748e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.276000000000000e+03 -2.589736034536160e+06 -5.257826228360344e+06 4.079837970939478e+06 -3.438853544493819e+03 -2.997993570849167e+03 -6.029055984731225e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.277000000000000e+03 -2.589804812163157e+06 -5.257886188063078e+06 4.079717386887851e+06 -3.438805924224230e+03 -2.997869030219479e+03 -6.029145484687708e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.278000000000000e+03 -2.589873588839485e+06 -5.257946145276812e+06 4.079596801042696e+06 -3.438758301248768e+03 -2.997744488728646e+03 -6.029234982268780e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.279000000000000e+03 -2.589942364549834e+06 -5.258006099985578e+06 4.079476213434309e+06 -3.438710678713184e+03 -2.997619947182863e+03 -6.029324475454281e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.280000000000000e+03 -2.590011139309540e+06 -5.258066052205390e+06 4.079355624032328e+06 -3.438663053524100e+03 -2.997495404967279e+03 -6.029413966136831e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.281000000000000e+03 -2.590079913133936e+06 -5.258126001952248e+06 4.079235032806376e+06 -3.438615425356232e+03 -2.997370859683226e+03 -6.029503455748811e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.282000000000000e+03 -2.590148686007713e+06 -5.258185949210188e+06 4.079114439786767e+06 -3.438567796126542e+03 -2.997246313177925e+03 -6.029592942342611e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.283000000000000e+03 -2.590217457946102e+06 -5.258245893995127e+06 4.078993844943289e+06 -3.438520163084085e+03 -2.997121763679489e+03 -6.029682428248337e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.284000000000000e+03 -2.590286228918329e+06 -5.258305836274981e+06 4.078873248336853e+06 -3.438472530341496e+03 -2.996997214393934e+03 -6.029771909688120e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.285000000000000e+03 -2.590354998924257e+06 -5.258365776049652e+06 4.078752649967676e+06 -3.438424895955873e+03 -2.996872666452422e+03 -6.029861387048907e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.286000000000000e+03 -2.590423768010151e+06 -5.258425713367366e+06 4.078632049744199e+06 -3.438377257151870e+03 -2.996748113878001e+03 -6.029950864894623e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.287000000000000e+03 -2.590492536129773e+06 -5.258485648179922e+06 4.078511447757914e+06 -3.438329618903599e+03 -2.996623560728062e+03 -6.030040338561502e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.288000000000000e+03 -2.590561303282985e+06 -5.258545580487225e+06 4.078390844009055e+06 -3.438281978966309e+03 -2.996499009265392e+03 -6.030129807991582e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.289000000000000e+03 -2.590630069516058e+06 -5.258605510337495e+06 4.078270238406047e+06 -3.438234334927469e+03 -2.996374453015631e+03 -6.030219277827126e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.290000000000000e+03 -2.590698834798201e+06 -5.258665437698657e+06 4.078149631009799e+06 -3.438186689653011e+03 -2.996249895026309e+03 -6.030308745006272e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.291000000000000e+03 -2.590767599113830e+06 -5.258725362554492e+06 4.078029021851129e+06 -3.438139043353361e+03 -2.996125337903784e+03 -6.030398208045829e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.292000000000000e+03 -2.590836362447336e+06 -5.258785284888780e+06 4.077908410960866e+06 -3.438091396408334e+03 -2.996000783744451e+03 -6.030487665646441e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.293000000000000e+03 -2.590905124860743e+06 -5.258845204766111e+06 4.077787798216323e+06 -3.438043746722731e+03 -2.995876224211867e+03 -6.030577123272299e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.294000000000000e+03 -2.590973886353913e+06 -5.258905122186368e+06 4.077667183617716e+06 -3.437996092788191e+03 -2.995751659760156e+03 -6.030666581447189e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.295000000000000e+03 -2.591042646833924e+06 -5.258965037052801e+06 4.077546567348881e+06 -3.437948440482759e+03 -2.995627102185413e+03 -6.030756030964584e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.296000000000000e+03 -2.591111406393718e+06 -5.259024949462201e+06 4.077425949225916e+06 -3.437900785032439e+03 -2.995502539042770e+03 -6.030845480814408e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.297000000000000e+03 -2.591180165002138e+06 -5.259084859382157e+06 4.077305329310423e+06 -3.437853127045227e+03 -2.995377975248173e+03 -6.030934928092700e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.298000000000000e+03 -2.591248922674804e+06 -5.259144766828923e+06 4.077184707571507e+06 -3.437805466965561e+03 -2.995253408052674e+03 -6.031024374025757e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.299000000000000e+03 -2.591317679380656e+06 -5.259204671770179e+06 4.077064084070596e+06 -3.437757805873823e+03 -2.995128841537153e+03 -6.031113815911788e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.300000000000000e+03 -2.591386435135014e+06 -5.259264574221916e+06 4.076943458777315e+06 -3.437710141958519e+03 -2.995004274235924e+03 -6.031203255442086e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.301000000000000e+03 -2.591455189922582e+06 -5.259324474168188e+06 4.076822831721978e+06 -3.437662478526902e+03 -2.994879707213501e+03 -6.031292690379955e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.302000000000000e+03 -2.591523943836008e+06 -5.259384371705500e+06 4.076702202721179e+06 -3.437614807892625e+03 -2.994755129674020e+03 -6.031382130316460e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.303000000000000e+03 -2.591592696689582e+06 -5.259444266640506e+06 4.076581572142396e+06 -3.437567141280747e+03 -2.994630564604324e+03 -6.031471557433528e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.304000000000000e+03 -2.591661448607180e+06 -5.259504159102187e+06 4.076460939740512e+06 -3.437519473041541e+03 -2.994505996021447e+03 -6.031560983029123e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.305000000000000e+03 -2.591730199650520e+06 -5.259564049154826e+06 4.076340305393321e+06 -3.437471797725604e+03 -2.994381417021592e+03 -6.031650413505877e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.306000000000000e+03 -2.591798949695758e+06 -5.259623936669507e+06 4.076219669345889e+06 -3.437424122966976e+03 -2.994256842745762e+03 -6.031739837006962e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.307000000000000e+03 -2.591867698758518e+06 -5.259683821662481e+06 4.076099031567326e+06 -3.437376449113544e+03 -2.994132270505635e+03 -6.031829254775547e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.308000000000000e+03 -2.591936446915878e+06 -5.259743704214053e+06 4.075978391904992e+06 -3.437328769436599e+03 -2.994007692090405e+03 -6.031918674551378e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.309000000000000e+03 -2.592005194106149e+06 -5.259803584259969e+06 4.075857750481029e+06 -3.437281090322946e+03 -2.993883113590686e+03 -6.032008089886681e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.310000000000000e+03 -2.592073940329191e+06 -5.259863461800128e+06 4.075737107295652e+06 -3.437233409075651e+03 -2.993758536521651e+03 -6.032097501347497e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.311000000000000e+03 -2.592142685615803e+06 -5.259923336866613e+06 4.075616462287884e+06 -3.437185725157795e+03 -2.993633956370978e+03 -6.032186911586578e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.312000000000000e+03 -2.592211429966132e+06 -5.259983209459573e+06 4.075495815457421e+06 -3.437138039013269e+03 -2.993509372769567e+03 -6.032276320573760e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.313000000000000e+03 -2.592280173333670e+06 -5.260043079530606e+06 4.075375166896319e+06 -3.437090352825405e+03 -2.993384791845630e+03 -6.032365723970678e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.314000000000000e+03 -2.592348915749195e+06 -5.260102947111796e+06 4.075254516543585e+06 -3.437042663876737e+03 -2.993260210142480e+03 -6.032455124976754e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.315000000000000e+03 -2.592417657259246e+06 -5.260162812251576e+06 4.075133864307099e+06 -3.436994971278619e+03 -2.993135621166883e+03 -6.032544527466956e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.316000000000000e+03 -2.592486397786393e+06 -5.260222674869367e+06 4.075013210340132e+06 -3.436947278451828e+03 -2.993011034940679e+03 -6.032633924423044e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.317000000000000e+03 -2.592555137330499e+06 -5.260282534965054e+06 4.074892554642914e+06 -3.436899585030595e+03 -2.992886451604420e+03 -6.032723315956415e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.318000000000000e+03 -2.592623875969019e+06 -5.260342392619258e+06 4.074771897062096e+06 -3.436851887733300e+03 -2.992761860913642e+03 -6.032812709131441e+03 2.240290742700000e-03 6.319006422100000e-04 1.422947641200000e-03 2.207607760000000e-03 1.740850452000000e-03 3.999034311300000e-03</EPHEMLIST>\n\t\t</EPHEMLISTList>\n\t</EPH>\n\t<ATT>\n\t\t<SATID>WV02</SATID>\n\t\t<REVNUMBER>24638</REVNUMBER>\n\t\t<STRIPID>33C4AA</STRIPID>\n\t\t<TYPE>R</TYPE>\n\t\t<VERSION>A</VERSION>\n\t\t<GENERATIONTIME>2014-06-19T19:50:03.000000Z</GENERATIONTIME>\n\t\t<STARTTIME>2014-06-19T18:52:38.618188Z</STARTTIME>\n\t\t<NUMPOINTS>1318</NUMPOINTS>\n\t\t<TIMEINTERVAL>2.000000000000000e-02</TIMEINTERVAL>\n\t\t<ATTLISTList>\n\t\t\t<ATTLIST>1.000000000000000e+00 4.856638307117520e-01 -7.582186065853338e-01 -2.484491018893427e-01 -3.570829482579089e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.000000000000000e+00 4.856623865766264e-01 -7.582324338020108e-01 -2.484210431013988e-01 -3.570750732546139e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.000000000000000e+00 4.856609407166058e-01 -7.582462620105406e-01 -2.483929819321295e-01 -3.570671972278733e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.000000000000000e+00 4.856594931206552e-01 -7.582600912199962e-01 -2.483649183868028e-01 -3.570593201689998e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.000000000000000e+00 4.856580438273597e-01 -7.582739214046277e-01 -2.483368524454104e-01 -3.570514420933451e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.000000000000000e+00 4.856565928566076e-01 -7.582877525481571e-01 -2.483087840986966e-01 -3.570435630140992e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.000000000000000e+00 4.856551400948181e-01 -7.583015847286134e-01 -2.482807134048268e-01 -3.570356828788219e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.000000000000000e+00 4.856536856962880e-01 -7.583154178439259e-01 -2.482526402834895e-01 -3.570278017494991e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.000000000000000e+00 4.856522295142588e-01 -7.583292519818370e-01 -2.482245648145051e-01 -3.570199195831331e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.000000000000000e+01 4.856507716461179e-01 -7.583430870906613e-01 -2.481964869426267e-01 -3.570120363946775e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.100000000000000e+01 4.856493120911646e-01 -7.583569231666661e-01 -2.481684066696835e-01 -3.570041521909743e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.200000000000000e+01 4.856478507699973e-01 -7.583707602604902e-01 -2.481403240378170e-01 -3.569962669424091e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.300000000000000e+01 4.856463877646031e-01 -7.583845983166970e-01 -2.481122390047822e-01 -3.569883806838100e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.400000000000000e+01 4.856449230621899e-01 -7.583984373454894e-01 -2.480841515765650e-01 -3.569804934059780e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.500000000000000e+01 4.856434565926476e-01 -7.584122773892199e-01 -2.480560617912565e-01 -3.569726050870773e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.600000000000000e+01 4.856419884458479e-01 -7.584261183928969e-01 -2.480279696004614e-01 -3.569647157545394e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.700000000000000e+01 4.856405186150057e-01 -7.584399603578096e-01 -2.479998750088165e-01 -3.569568254108666e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.800000000000000e+01 4.856390469973429e-01 -7.584538033527890e-01 -2.479717780696747e-01 -3.569489340118079e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.900000000000000e+01 4.856375737046661e-01 -7.584676473068438e-01 -2.479436787237463e-01 -3.569410415965105e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.000000000000000e+01 4.856360987373053e-01 -7.584814922129897e-01 -2.479155769732493e-01 -3.569331481770608e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.100000000000000e+01 4.856346219823077e-01 -7.584953381488873e-01 -2.478874728760932e-01 -3.569252537011223e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.200000000000000e+01 4.856331435840668e-01 -7.585091850211063e-01 -2.478593663562532e-01 -3.569173582228123e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.300000000000000e+01 4.856316634114294e-01 -7.585230329079009e-01 -2.478312574852385e-01 -3.569094617038515e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.400000000000000e+01 4.856301815595545e-01 -7.585368817589241e-01 -2.478031462089361e-01 -3.569015641585713e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.500000000000000e+01 4.856286980119600e-01 -7.585507315761271e-01 -2.477750325391050e-01 -3.568936655963180e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.600000000000000e+01 4.856272127075437e-01 -7.585645823976935e-01 -2.477469165085434e-01 -3.568857659955406e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.700000000000000e+01 4.856257257252657e-01 -7.585784341778956e-01 -2.477187980737506e-01 -3.568778653754222e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.800000000000000e+01 4.856242370379695e-01 -7.585922869317557e-01 -2.476906772498881e-01 -3.568699637296905e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.900000000000000e+01 4.856227466013140e-01 -7.586061406872419e-01 -2.476625540607197e-01 -3.568620610419743e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.000000000000000e+01 4.856212544718008e-01 -7.586199954057525e-01 -2.476344284772118e-01 -3.568541573368245e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.100000000000000e+01 4.856197606641757e-01 -7.586338510820153e-01 -2.476063004900282e-01 -3.568462526110946e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.200000000000000e+01 4.856182650898600e-01 -7.586477077709687e-01 -2.475781701468168e-01 -3.568383468347022e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.300000000000000e+01 4.856167678529599e-01 -7.586615654024150e-01 -2.475500373936915e-01 -3.568304400518315e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.400000000000000e+01 4.856152688613367e-01 -7.586754240374011e-01 -2.475219022788133e-01 -3.568225322239038e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.500000000000000e+01 4.856137681753951e-01 -7.586892836375679e-01 -2.474937647700851e-01 -3.568146233717689e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.600000000000000e+01 4.856122658105066e-01 -7.587031441906996e-01 -2.474656248601877e-01 -3.568067135047900e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.700000000000000e+01 4.856107616860344e-01 -7.587170057521455e-01 -2.474374825906157e-01 -3.567988025854728e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.800000000000000e+01 4.856092558819511e-01 -7.587308682689886e-01 -2.474093379196370e-01 -3.567908906456712e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.900000000000000e+01 4.856077483860922e-01 -7.587447317458027e-01 -2.473811908548025e-01 -3.567829776862112e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.000000000000000e+01 4.856062391194431e-01 -7.587585962356390e-01 -2.473530414372168e-01 -3.567750636725490e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.100000000000000e+01 4.856047281936355e-01 -7.587724616662732e-01 -2.473248896080325e-01 -3.567671486463744e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.200000000000000e+01 4.856032155659269e-01 -7.587863280661724e-01 -2.472967353894356e-01 -3.567592325891719e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.300000000000000e+01 4.856017011754524e-01 -7.588001954668283e-01 -2.472685788165090e-01 -3.567513154917214e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.400000000000000e+01 4.856001851134389e-01 -7.588140638189506e-01 -2.472404198376421e-01 -3.567433973696921e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.500000000000000e+01 4.855986673771651e-01 -7.588279331239776e-01 -2.472122584543429e-01 -3.567354782219129e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.600000000000000e+01 4.855971478522754e-01 -7.588418034447129e-01 -2.471840947310832e-01 -3.567275580250087e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.700000000000000e+01 4.855956266904369e-01 -7.588556746950548e-01 -2.471559285834827e-01 -3.567196368133824e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.800000000000000e+01 4.855941037570403e-01 -7.588695469514725e-01 -2.471277600864980e-01 -3.567117145548968e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.900000000000000e+01 4.855925791592020e-01 -7.588834201536656e-01 -2.470995891803786e-01 -3.567037912726433e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.000000000000000e+01 4.855910528607737e-01 -7.588972943182151e-01 -2.470714158865916e-01 -3.566958669649155e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.100000000000000e+01 4.855895248153913e-01 -7.589111694756441e-01 -2.470432402295753e-01 -3.566879416121957e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.200000000000000e+01 4.855879950894438e-01 -7.589250455878653e-01 -2.470150621725282e-01 -3.566800152298597e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.300000000000000e+01 4.855864636649945e-01 -7.589389226603539e-01 -2.469868817270757e-01 -3.566720878218567e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.400000000000000e+01 4.855849304967471e-01 -7.589528007242938e-01 -2.469586989166126e-01 -3.566641593665301e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.500000000000000e+01 4.855833956402895e-01 -7.589666797468725e-01 -2.469305137106429e-01 -3.566562298783697e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.600000000000000e+01 4.855818591225489e-01 -7.589805597062003e-01 -2.469023260965226e-01 -3.566482993752789e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.700000000000000e+01 4.855803208206106e-01 -7.589944406768748e-01 -2.468741361410610e-01 -3.566403678188375e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.800000000000000e+01 4.855787808654108e-01 -7.590083225854170e-01 -2.468459437710119e-01 -3.566324352370826e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.900000000000000e+01 4.855772391701851e-01 -7.590222054765081e-01 -2.468177490364582e-01 -3.566245016176179e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.000000000000000e+01 4.855756957767136e-01 -7.590360893349314e-01 -2.467895519110661e-01 -3.566165669534014e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.100000000000000e+01 4.855741507123668e-01 -7.590499741332828e-01 -2.467613523838295e-01 -3.566086312723373e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.200000000000000e+01 4.855726038938687e-01 -7.590638599259190e-01 -2.467331504987200e-01 -3.566006945409234e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.300000000000000e+01 4.855710553824487e-01 -7.590777466739580e-01 -2.467049462231081e-01 -3.565927567803571e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.400000000000000e+01 4.855695052201585e-01 -7.590916343528361e-01 -2.466767395337955e-01 -3.565848180009445e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.500000000000000e+01 4.855679532629655e-01 -7.591055230513573e-01 -2.466485305086037e-01 -3.565768781551691e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.600000000000000e+01 4.855663996401451e-01 -7.591194126891238e-01 -2.466203190780515e-01 -3.565689372854389e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.700000000000000e+01 4.855648443683409e-01 -7.591333032583812e-01 -2.465921052322197e-01 -3.565609953916852e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.800000000000000e+01 4.855632872881921e-01 -7.591471948468068e-01 -2.465638890610229e-01 -3.565530524413064e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.900000000000000e+01 4.855617285648840e-01 -7.591610873638833e-01 -2.465356704712700e-01 -3.565451084657446e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.000000000000000e+01 4.855601681590538e-01 -7.591749808307855e-01 -2.465074494852626e-01 -3.565371634573296e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.100000000000000e+01 4.855586059875254e-01 -7.591888752939543e-01 -2.464792261497835e-01 -3.565292173973344e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.200000000000000e+01 4.855570421657628e-01 -7.592027706893247e-01 -2.464510003998765e-01 -3.565212703090642e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.300000000000000e+01 4.855554765884952e-01 -7.592166670741993e-01 -2.464227722952441e-01 -3.565133221718229e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.400000000000000e+01 4.855539093465938e-01 -7.592305643942228e-01 -2.463945417862183e-01 -3.565053730111642e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.500000000000000e+01 4.855523404083345e-01 -7.592444626711528e-01 -2.463663088890881e-01 -3.564974228119304e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.600000000000000e+01 4.855507697184044e-01 -7.592583619370539e-01 -2.463380736346160e-01 -3.564894715591378e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.700000000000000e+01 4.855491973586912e-01 -7.592722621417386e-01 -2.463098359784600e-01 -3.564815192780152e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.800000000000000e+01 4.855476233322221e-01 -7.592861632844483e-01 -2.462815959185471e-01 -3.564735659667153e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.900000000000000e+01 4.855460475281032e-01 -7.593000654298586e-01 -2.462533535162492e-01 -3.564656115953553e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.000000000000000e+01 4.855444700495474e-01 -7.593139685147648e-01 -2.462251087156525e-01 -3.564576561958348e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.100000000000000e+01 4.855428909183381e-01 -7.593278725308922e-01 -2.461968615031006e-01 -3.564496997647706e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.200000000000000e+01 4.855413100088859e-01 -7.593417775453389e-01 -2.461686119503050e-01 -3.564417422799981e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.300000000000000e+01 4.855397274588817e-01 -7.593556834856952e-01 -2.461403599783097e-01 -3.564337837619720e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.400000000000000e+01 4.855381431476136e-01 -7.593695904095372e-01 -2.461121056585450e-01 -3.564258242023672e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.500000000000000e+01 4.855365571698245e-01 -7.593834982771590e-01 -2.460838489330751e-01 -3.564178635959502e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.600000000000000e+01 4.855349695068498e-01 -7.593974070866349e-01 -2.460555898167711e-01 -3.564099019612100e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.700000000000000e+01 4.855333801090594e-01 -7.594113168704979e-01 -2.460273283359290e-01 -3.564019392775141e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.800000000000000e+01 4.855317890110068e-01 -7.594252276061306e-01 -2.459990644723174e-01 -3.563939755577989e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.900000000000000e+01 4.855301962653054e-01 -7.594391392703647e-01 -2.459707981941309e-01 -3.563860108009346e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.000000000000000e+01 4.855286017287094e-01 -7.594530519410910e-01 -2.459425295827143e-01 -3.563780449791800e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.100000000000000e+01 4.855270055591640e-01 -7.594669655282298e-01 -2.459142585500374e-01 -3.563700781292946e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.200000000000000e+01 4.855254076990270e-01 -7.594808800562697e-01 -2.458859851311902e-01 -3.563621102526360e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.300000000000000e+01 4.855238080662866e-01 -7.594947955853703e-01 -2.458577093672415e-01 -3.563541413036220e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.400000000000000e+01 4.855222067895993e-01 -7.595087120315395e-01 -2.458294311902724e-01 -3.563461713320590e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.500000000000000e+01 4.855206038266621e-01 -7.595226294190704e-01 -2.458011506237605e-01 -3.563382003268386e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.600000000000000e+01 4.855189991112184e-01 -7.595365477945792e-01 -2.457728677016430e-01 -3.563302282546966e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.700000000000000e+01 4.855173927390108e-01 -7.595504670942147e-01 -2.457445823737650e-01 -3.563222551551016e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.800000000000000e+01 4.855157846346887e-01 -7.595643873662167e-01 -2.457162946804183e-01 -3.563142809993340e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.900000000000000e+01 4.855141748444584e-01 -7.595783085769219e-01 -2.456880045984324e-01 -3.563063058114012e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.000000000000000e+02 4.855125633864283e-01 -7.595922307242171e-01 -2.456597121147198e-01 -3.562983295793851e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.010000000000000e+02 4.855109501638568e-01 -7.596061538563159e-01 -2.456314172859100e-01 -3.562903522925074e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.020000000000000e+02 4.855093352928290e-01 -7.596200779099798e-01 -2.456031200461591e-01 -3.562823739720281e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.030000000000000e+02 4.855077187346968e-01 -7.596340029059653e-01 -2.455748204174451e-01 -3.562743946104324e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.040000000000000e+02 4.855061004181926e-01 -7.596479288887176e-01 -2.455465184383389e-01 -3.562664141827186e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.050000000000000e+02 4.855044804514634e-01 -7.596618557906776e-01 -2.455182140505844e-01 -3.562584327249390e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.060000000000000e+02 4.855028587964685e-01 -7.596757836309254e-01 -2.454899072763071e-01 -3.562504502322293e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.070000000000000e+02 4.855012353895428e-01 -7.596897124545002e-01 -2.454615981480748e-01 -3.562424666720963e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.080000000000000e+02 4.854996103457903e-01 -7.597036421870269e-01 -2.454332866046831e-01 -3.562344820876767e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.090000000000000e+02 4.854979835510291e-01 -7.597175729030822e-01 -2.454049727066358e-01 -3.562264964330842e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.100000000000000e+02 4.854963550747031e-01 -7.597315045535004e-01 -2.453766564185756e-01 -3.562185097421148e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.110000000000000e+02 4.854947249498416e-01 -7.597454371205085e-01 -2.453483377216417e-01 -3.562105220198765e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.120000000000000e+02 4.854930930483393e-01 -7.597593706819565e-01 -2.453200166858110e-01 -3.562025332259551e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.130000000000000e+02 4.854914595014201e-01 -7.597733051588004e-01 -2.452916932392945e-01 -3.561945433987630e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.140000000000000e+02 4.854898242770467e-01 -7.597872405664586e-01 -2.452633674009664e-01 -3.561865525353076e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.150000000000000e+02 4.854881872851030e-01 -7.598011769661279e-01 -2.452350392178102e-01 -3.561785605947538e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.160000000000000e+02 4.854865486391198e-01 -7.598151142790986e-01 -2.452067086314031e-01 -3.561705676297109e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.170000000000000e+02 4.854849083285250e-01 -7.598290525194547e-01 -2.451783756447150e-01 -3.561625736217246e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.180000000000000e+02 4.854832662425505e-01 -7.598429917531605e-01 -2.451500403188006e-01 -3.561545785382552e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.190000000000000e+02 4.854816225256577e-01 -7.598569318852274e-01 -2.451217025774471e-01 -3.561465824367231e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.200000000000000e+02 4.854799771279818e-01 -7.598708729589697e-01 -2.450933624431295e-01 -3.561385852764465e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.210000000000000e+02 4.854783299620834e-01 -7.598848150156426e-01 -2.450650199679832e-01 -3.561305870519423e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.220000000000000e+02 4.854766811657640e-01 -7.598987579735302e-01 -2.450366750760186e-01 -3.561225878012386e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.230000000000000e+02 4.854750306281937e-01 -7.599127019025635e-01 -2.450083278269378e-01 -3.561145874843490e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.240000000000000e+02 4.854733784131439e-01 -7.599266467622628e-01 -2.449799781865399e-01 -3.561065861234721e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.250000000000000e+02 4.854717245342174e-01 -7.599405925440994e-01 -2.449516261474602e-01 -3.560985837225569e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.260000000000000e+02 4.854700688971097e-01 -7.599545393039916e-01 -2.449232717618328e-01 -3.560905802542007e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.270000000000000e+02 4.854684116104431e-01 -7.599684869792919e-01 -2.448949149691438e-01 -3.560825757448621e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.280000000000000e+02 4.854667526551641e-01 -7.599824355774949e-01 -2.448665557812185e-01 -3.560745701956148e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.290000000000000e+02 4.854650919304338e-01 -7.599963851598229e-01 -2.448381942532966e-01 -3.560665635745133e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.300000000000000e+02 4.854634295587383e-01 -7.600103356538475e-01 -2.448098303177660e-01 -3.560585559148678e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.310000000000000e+02 4.854617655127583e-01 -7.600242870734213e-01 -2.447814639904894e-01 -3.560505472126767e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.320000000000000e+02 4.854600997305241e-01 -7.600382394625612e-01 -2.447530953031938e-01 -3.560425374358882e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.330000000000000e+02 4.854584322880148e-01 -7.600521927655318e-01 -2.447247242177268e-01 -3.560345266253369e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.340000000000000e+02 4.854567631209144e-01 -7.600661470212473e-01 -2.446963507694470e-01 -3.560265147605665e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.350000000000000e+02 4.854550922803417e-01 -7.600801022087164e-01 -2.446679749267854e-01 -3.560185018376125e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.360000000000000e+02 4.854534197594383e-01 -7.600940583227571e-01 -2.446395966968109e-01 -3.560104878712556e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.370000000000000e+02 4.854517455086437e-01 -7.601080153971932e-01 -2.446112161054428e-01 -3.560024728382764e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.380000000000000e+02 4.854500695906534e-01 -7.601219733882713e-01 -2.445828331204306e-01 -3.559944567679868e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.390000000000000e+02 4.854483920076718e-01 -7.601359323022654e-01 -2.445544477377951e-01 -3.559864396459418e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.400000000000000e+02 4.854467126592520e-01 -7.601498921936366e-01 -2.445260600149671e-01 -3.559784214526001e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.410000000000000e+02 4.854450316769459e-01 -7.601638529870133e-01 -2.444976698783838e-01 -3.559704022192692e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.420000000000000e+02 4.854433490110883e-01 -7.601778147072926e-01 -2.444692773570479e-01 -3.559623819398147e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.430000000000000e+02 4.854416645953154e-01 -7.601917773972623e-01 -2.444408824865293e-01 -3.559543605881620e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.440000000000000e+02 4.854399785321753e-01 -7.602057409966542e-01 -2.444124852100049e-01 -3.559463381914165e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.450000000000000e+02 4.854382908011028e-01 -7.602197055165062e-01 -2.443840855392026e-01 -3.559383147452214e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.460000000000000e+02 4.854366013176378e-01 -7.602336710028258e-01 -2.443556835223919e-01 -3.559302902325864e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.470000000000000e+02 4.854349101974297e-01 -7.602476373913069e-01 -2.443272790940863e-01 -3.559222646773169e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.480000000000000e+02 4.854332173351071e-01 -7.602616047407372e-01 -2.442988723139713e-01 -3.559142380558100e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.490000000000000e+02 4.854315228167524e-01 -7.602755730022110e-01 -2.442704631337126e-01 -3.559062103875261e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.500000000000000e+02 4.854298266252747e-01 -7.602895421846452e-01 -2.442420515631481e-01 -3.558981816692000e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.510000000000000e+02 4.854281286862004e-01 -7.603035123331759e-01 -2.442136376432415e-01 -3.558901518771007e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.520000000000000e+02 4.854264291044120e-01 -7.603174833834837e-01 -2.441852213167917e-01 -3.558821210440540e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.530000000000000e+02 4.854247278368388e-01 -7.603314553603648e-01 -2.441568026078214e-01 -3.558740891585756e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.540000000000000e+02 4.854230248307415e-01 -7.603454282982876e-01 -2.441283815445011e-01 -3.558660561988590e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.550000000000000e+02 4.854213201740588e-01 -7.603594021419782e-01 -2.440999580793349e-01 -3.558580221948557e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.560000000000000e+02 4.854196138428701e-01 -7.603733769058355e-01 -2.440715322254261e-01 -3.558499871386646e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.570000000000000e+02 4.854179057866389e-01 -7.603873526190648e-01 -2.440431040111572e-01 -3.558419510165762e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.580000000000000e+02 4.854161960713348e-01 -7.604013292450940e-01 -2.440146733990496e-01 -3.558339138416754e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.590000000000000e+02 4.854144846252790e-01 -7.604153068221338e-01 -2.439862404304451e-01 -3.558258756009635e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.600000000000000e+02 4.854127715188367e-01 -7.604292853108716e-01 -2.439578050655477e-01 -3.558178363089732e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.610000000000000e+02 4.854110567480418e-01 -7.604432647161219e-01 -2.439293673056282e-01 -3.558097959591774e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.620000000000000e+02 4.854093402398351e-01 -7.604572450730249e-01 -2.439009271942026e-01 -3.558017545455358e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.630000000000000e+02 4.854076220715042e-01 -7.604712263419513e-01 -2.438724846862748e-01 -3.557937120773766e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.640000000000000e+02 4.854059022396073e-01 -7.604852085221717e-01 -2.438440397847068e-01 -3.557856685582158e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.650000000000000e+02 4.854041806531345e-01 -7.604991916637207e-01 -2.438155925414287e-01 -3.557776239689036e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.660000000000000e+02 4.854024574319180e-01 -7.605131757035689e-01 -2.437871428872423e-01 -3.557695783273252e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.670000000000000e+02 4.854007325337957e-01 -7.605271606594348e-01 -2.437586908480499e-01 -3.557615316346016e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.680000000000000e+02 4.853990058977758e-01 -7.605411465747571e-01 -2.437302364551639e-01 -3.557534838588580e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.690000000000000e+02 4.853972775944775e-01 -7.605551333970019e-01 -2.437017796733105e-01 -3.557454350394391e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.700000000000000e+02 4.853955476539673e-01 -7.605691211140942e-01 -2.436733204837482e-01 -3.557373851731976e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.710000000000000e+02 4.853938159467299e-01 -7.605831098074511e-01 -2.436448589566730e-01 -3.557293342139240e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.720000000000000e+02 4.853920826280012e-01 -7.605970993767717e-01 -2.436163950090302e-01 -3.557212822203602e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.730000000000000e+02 4.853903475484505e-01 -7.606110899116748e-01 -2.435879287232719e-01 -3.557132291474063e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.740000000000000e+02 4.853886108366220e-01 -7.606250813372615e-01 -2.435594600277328e-01 -3.557051750281099e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.750000000000000e+02 4.853868724429347e-01 -7.606390736823200e-01 -2.435309889500455e-01 -3.556971198488698e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.760000000000000e+02 4.853851323099884e-01 -7.606530669802660e-01 -2.435025155223986e-01 -3.556890635937440e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.770000000000000e+02 4.853833905374773e-01 -7.606670611725296e-01 -2.434740396893596e-01 -3.556810062891103e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.780000000000000e+02 4.853816470962082e-01 -7.606810562767403e-01 -2.434455614669440e-01 -3.556729479253645e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.790000000000000e+02 4.853799019059292e-01 -7.606950523389832e-01 -2.434170809003224e-01 -3.556648884817674e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.800000000000000e+02 4.853781550702854e-01 -7.607090492956593e-01 -2.433885979328244e-01 -3.556568279909078e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.810000000000000e+02 4.853764065820118e-01 -7.607230471562098e-01 -2.433601125665924e-01 -3.556487664402621e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.820000000000000e+02 4.853746563484609e-01 -7.607370459664724e-01 -2.433316248564066e-01 -3.556407038199644e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.830000000000000e+02 4.853729044700323e-01 -7.607510456753221e-01 -2.433031347435156e-01 -3.556326401417725e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.840000000000000e+02 4.853711508779700e-01 -7.607650463231226e-01 -2.432746422663446e-01 -3.556245753861145e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.850000000000000e+02 4.853693956131932e-01 -7.607790478794091e-01 -2.432461474044148e-01 -3.556165095755441e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.860000000000000e+02 4.853676386952641e-01 -7.607930503346063e-01 -2.432176501461212e-01 -3.556084427110074e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.870000000000000e+02 4.853658800407991e-01 -7.608070537393330e-01 -2.431891505374430e-01 -3.556003747657941e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.880000000000000e+02 4.853641197397175e-01 -7.608210580383741e-01 -2.431606485291846e-01 -3.555923057681719e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.890000000000000e+02 4.853623577679474e-01 -7.608350632449251e-01 -2.431321441350419e-01 -3.555842357126186e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.900000000000000e+02 4.853605940558021e-01 -7.608490694038412e-01 -2.431036373925693e-01 -3.555761645718254e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.910000000000000e+02 4.853588286991457e-01 -7.608630764549630e-01 -2.430751282497697e-01 -3.555680923784367e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.920000000000000e+02 4.853570616955584e-01 -7.608770844008523e-01 -2.430466167075419e-01 -3.555600191288798e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.930000000000000e+02 4.853552929225539e-01 -7.608910933108348e-01 -2.430181028351927e-01 -3.555519447938489e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.940000000000000e+02 4.853535225325378e-01 -7.609051030992938e-01 -2.429895865464469e-01 -3.555438694067123e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.950000000000000e+02 4.853517504661253e-01 -7.609191137997232e-01 -2.429610678748285e-01 -3.555357929531637e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.960000000000000e+02 4.853499766778874e-01 -7.609331254343168e-01 -2.429325468474294e-01 -3.555277154284290e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.970000000000000e+02 4.853482012352660e-01 -7.609471379681734e-01 -2.429040234248990e-01 -3.555196368412497e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.980000000000000e+02 4.853464240834064e-01 -7.609611514305571e-01 -2.428754976390303e-01 -3.555115571813728e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.990000000000000e+02 4.853446452657497e-01 -7.609751657959779e-01 -2.428469694655881e-01 -3.555034764598339e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.000000000000000e+02 4.853428648006149e-01 -7.609891810503981e-01 -2.428184388955103e-01 -3.554953946870813e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.010000000000000e+02 4.853410825743171e-01 -7.610031972682061e-01 -2.427899059895788e-01 -3.554873118167922e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.020000000000000e+02 4.853392987386776e-01 -7.610172143536915e-01 -2.427613706655257e-01 -3.554792279019852e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.030000000000000e+02 4.853375132118238e-01 -7.610312323580253e-01 -2.427328329678260e-01 -3.554711429137416e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.040000000000000e+02 4.853357259734141e-01 -7.610452512906669e-01 -2.427042929088944e-01 -3.554630568503263e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.050000000000000e+02 4.853339370633593e-01 -7.610592711269778e-01 -2.426757504668891e-01 -3.554549697241337e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.060000000000000e+02 4.853321465233190e-01 -7.610732918438554e-01 -2.426472056180630e-01 -3.554468815431791e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.070000000000000e+02 4.853303542335197e-01 -7.610873135155076e-01 -2.426186584279782e-01 -3.554387922665755e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.080000000000000e+02 4.853285603084537e-01 -7.611013360625875e-01 -2.425901088370541e-01 -3.554307019477835e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.090000000000000e+02 4.853267646731952e-01 -7.611153595435988e-01 -2.425615568820378e-01 -3.554226105379759e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.100000000000000e+02 4.853249673668624e-01 -7.611293839252585e-01 -2.425330025447909e-01 -3.554145180666075e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.110000000000000e+02 4.853231684141311e-01 -7.611434091948539e-01 -2.425044458108786e-01 -3.554064245362804e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.120000000000000e+02 4.853213677382721e-01 -7.611574353963506e-01 -2.424758867236727e-01 -3.553983299272410e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.130000000000000e+02 4.853195653977849e-01 -7.611714625002490e-01 -2.424473252487694e-01 -3.553902342454765e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.140000000000000e+02 4.853177614083248e-01 -7.611854904928367e-01 -2.424187613790240e-01 -3.553821375030712e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.150000000000000e+02 4.853159556880166e-01 -7.611995194212319e-01 -2.423901951606462e-01 -3.553740396786139e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.160000000000000e+02 4.853141483184117e-01 -7.612135492392176e-01 -2.423616265475023e-01 -3.553659407904153e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.170000000000000e+02 4.853123392948375e-01 -7.612275799481288e-01 -2.423330555426715e-01 -3.553578408391181e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.180000000000000e+02 4.853105285388923e-01 -7.612416115981745e-01 -2.423044821885947e-01 -3.553497397945186e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.190000000000000e+02 4.853087161272680e-01 -7.612556441369855e-01 -2.422759064450742e-01 -3.553416376906931e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.200000000000000e+02 4.853069020875921e-01 -7.612696775474321e-01 -2.422473282969786e-01 -3.553335345361443e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.210000000000000e+02 4.853050862877635e-01 -7.612837119178030e-01 -2.422187478143871e-01 -3.553254302735852e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.220000000000000e+02 4.853032688729667e-01 -7.612977471499511e-01 -2.421901649207751e-01 -3.553173249663881e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.230000000000000e+02 4.853014497321349e-01 -7.613117833127787e-01 -2.421615796770168e-01 -3.553092185763504e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.240000000000000e+02 4.852996289548832e-01 -7.613258203590333e-01 -2.421329920311101e-01 -3.553011111169793e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.250000000000000e+02 4.852978065044027e-01 -7.613398583084163e-01 -2.421044020042651e-01 -3.552930025810995e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.260000000000000e+02 4.852959823279649e-01 -7.613538971837038e-01 -2.420758096290600e-01 -3.552848929689480e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.270000000000000e+02 4.852941565164494e-01 -7.613679369420768e-01 -2.420472148509127e-01 -3.552767822845589e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.280000000000000e+02 4.852923290437760e-01 -7.613819775862484e-01 -2.420186176888846e-01 -3.552686705439738e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.290000000000000e+02 4.852904998330724e-01 -7.613960191720157e-01 -2.419900181822822e-01 -3.552605577050638e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.300000000000000e+02 4.852886689913869e-01 -7.614100616310248e-01 -2.419614162732373e-01 -3.552524438067334e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.310000000000000e+02 4.852868364970797e-01 -7.614241049749971e-01 -2.419328119741609e-01 -3.552443288441864e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.320000000000000e+02 4.852850022702079e-01 -7.614381492550978e-01 -2.419042053283997e-01 -3.552362127866629e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.330000000000000e+02 4.852831664157822e-01 -7.614521944081760e-01 -2.418755962776944e-01 -3.552280956649620e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.340000000000000e+02 4.852813288442680e-01 -7.614662404834546e-01 -2.418469848734804e-01 -3.552199774600827e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.350000000000000e+02 4.852794896152715e-01 -7.614802874455248e-01 -2.418183710825551e-01 -3.552118581883246e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.360000000000000e+02 4.852776487425457e-01 -7.614943352883498e-01 -2.417897548964619e-01 -3.552037378488156e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.370000000000000e+02 4.852758061384027e-01 -7.615083840613281e-01 -2.417611363651684e-01 -3.551956164206573e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.380000000000000e+02 4.852739619093258e-01 -7.615224337081630e-01 -2.417325154268626e-01 -3.551874939203581e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.390000000000000e+02 4.852721159994426e-01 -7.615364842498166e-01 -2.417038921170124e-01 -3.551793703543888e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.400000000000000e+02 4.852702683690726e-01 -7.615505357193221e-01 -2.416752664545045e-01 -3.551712456925056e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.410000000000000e+02 4.852684191149575e-01 -7.615645880546215e-01 -2.416466383870805e-01 -3.551631199703713e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.420000000000000e+02 4.852665681850557e-01 -7.615786412873566e-01 -2.416180079434309e-01 -3.551549931709403e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.430000000000000e+02 4.852647155467021e-01 -7.615926954371505e-01 -2.415893751418600e-01 -3.551468652835327e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.440000000000000e+02 4.852628612505532e-01 -7.616067504753686e-01 -2.415607399535956e-01 -3.551387363191283e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.450000000000000e+02 4.852610053189686e-01 -7.616208063789832e-01 -2.415321023696484e-01 -3.551306063018915e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.460000000000000e+02 4.852591476618329e-01 -7.616348632145148e-01 -2.415034624357491e-01 -3.551224751804137e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.470000000000000e+02 4.852572883723457e-01 -7.616489209195163e-01 -2.414748201024062e-01 -3.551143429941477e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.480000000000000e+02 4.852554273694018e-01 -7.616629795432741e-01 -2.414461754146079e-01 -3.551062097168389e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.490000000000000e+02 4.852535647130156e-01 -7.616770390462130e-01 -2.414175283402860e-01 -3.550980753723852e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.500000000000000e+02 4.852517004196335e-01 -7.616910994206426e-01 -2.413888788694925e-01 -3.550899399607888e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.510000000000000e+02 4.852498343795826e-01 -7.617051607359518e-01 -2.413602270620314e-01 -3.550818034416435e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.520000000000000e+02 4.852479667249082e-01 -7.617192229058465e-01 -2.413315728470783e-01 -3.550736658669734e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.530000000000000e+02 4.852460974113945e-01 -7.617332859610886e-01 -2.413029162476366e-01 -3.550655272147952e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.540000000000000e+02 4.852442263625599e-01 -7.617473499468376e-01 -2.412742573066418e-01 -3.550573874627865e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.550000000000000e+02 4.852423536864363e-01 -7.617614147967091e-01 -2.412455959646124e-01 -3.550492466453670e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.560000000000000e+02 4.852404793630787e-01 -7.617754805252988e-01 -2.412169322316504e-01 -3.550411047508320e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.570000000000000e+02 4.852386033010756e-01 -7.617895471804075e-01 -2.411882661612698e-01 -3.550329617644142e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.580000000000000e+02 4.852367256417635e-01 -7.618036146831071e-01 -2.411595976727156e-01 -3.550248177163761e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.590000000000000e+02 4.852348462346670e-01 -7.618176831212817e-01 -2.411309268506664e-01 -3.550166725655009e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.600000000000000e+02 4.852329652161232e-01 -7.618317524164067e-01 -2.411022536181378e-01 -3.550085263454535e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.610000000000000e+02 4.852310825267471e-01 -7.618458225994292e-01 -2.410735780097889e-01 -3.550003790466686e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.620000000000000e+02 4.852291981291382e-01 -7.618598936928809e-01 -2.410449000465682e-01 -3.549922306569059e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.630000000000000e+02 4.852273120844037e-01 -7.618739656604098e-01 -2.410162196943605e-01 -3.549840811930378e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.640000000000000e+02 4.852254243958071e-01 -7.618880384997949e-01 -2.409875369514121e-01 -3.549759306557780e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.650000000000000e+02 4.852235349695100e-01 -7.619021122655397e-01 -2.409588518707440e-01 -3.549677790196387e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.660000000000000e+02 4.852216439341232e-01 -7.619161868851414e-01 -2.409301643791228e-01 -3.549596263133634e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.670000000000000e+02 4.852197512338977e-01 -7.619302623860243e-01 -2.409014745096878e-01 -3.549514725310163e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.680000000000000e+02 4.852178568147015e-01 -7.619443388048760e-01 -2.408727822912299e-01 -3.549433176475225e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.690000000000000e+02 4.852159607429322e-01 -7.619584161020988e-01 -2.408440876866962e-01 -3.549351616814785e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.700000000000000e+02 4.852140630541347e-01 -7.619724942478889e-01 -2.408153906793215e-01 -3.549270046588661e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.710000000000000e+02 4.852121636268259e-01 -7.619865733240998e-01 -2.407866913336724e-01 -3.549188465254467e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.720000000000000e+02 4.852102625802000e-01 -7.620006532536338e-01 -2.407579895853224e-01 -3.549106873267168e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.730000000000000e+02 4.852083598337641e-01 -7.620147340919317e-01 -2.407292854766904e-01 -3.549025270241306e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.740000000000000e+02 4.852064554263105e-01 -7.620288158058994e-01 -2.407005789896829e-01 -3.548943656471968e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.750000000000000e+02 4.852045494020382e-01 -7.620428983708349e-01 -2.406718700990101e-01 -3.548862032048972e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.760000000000000e+02 4.852026416177292e-01 -7.620569818767141e-01 -2.406431588831419e-01 -3.548780396458392e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.770000000000000e+02 4.852007322260185e-01 -7.620710662271901e-01 -2.406144452587805e-01 -3.548698750239283e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.780000000000000e+02 4.851988211838835e-01 -7.620851514523034e-01 -2.405857292483295e-01 -3.548617093175024e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.790000000000000e+02 4.851969084149795e-01 -7.620992375932544e-01 -2.405570108961484e-01 -3.548535425116070e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.800000000000000e+02 4.851949940170754e-01 -7.621133245951137e-01 -2.405282901464189e-01 -3.548453746275878e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.810000000000000e+02 4.851930779829772e-01 -7.621274124555656e-01 -2.404995670054967e-01 -3.548372056751628e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.820000000000000e+02 4.851911602096599e-01 -7.621415012451661e-01 -2.404708415278224e-01 -3.548290356059796e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.830000000000000e+02 4.851892408429460e-01 -7.621555908678841e-01 -2.404421136351239e-01 -3.548208644791713e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.840000000000000e+02 4.851873197435821e-01 -7.621696814164783e-01 -2.404133834018673e-01 -3.548126922346629e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.850000000000000e+02 4.851853970221316e-01 -7.621837728138701e-01 -2.403846507702772e-01 -3.548045189252010e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.860000000000000e+02 4.851834726358864e-01 -7.621978650899107e-01 -2.403559157626025e-01 -3.547963445292038e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.870000000000000e+02 4.851815465509622e-01 -7.622119582610878e-01 -2.403271783992993e-01 -3.547881690429459e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.880000000000000e+02 4.851796188338215e-01 -7.622260522981461e-01 -2.402984386394783e-01 -3.547799924653029e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.890000000000000e+02 4.851776894642599e-01 -7.622401471989473e-01 -2.402696964994928e-01 -3.547718148166382e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.900000000000000e+02 4.851757583665543e-01 -7.622542430186232e-01 -2.402409520182674e-01 -3.547636360549113e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.910000000000000e+02 4.851738256630013e-01 -7.622683396806945e-01 -2.402122051287001e-01 -3.547554562218496e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.920000000000000e+02 4.851718912923783e-01 -7.622824372185640e-01 -2.401834558660936e-01 -3.547472753047202e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.930000000000000e+02 4.851699552193376e-01 -7.622965356600184e-01 -2.401547042479892e-01 -3.547390932794989e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.940000000000000e+02 4.851680174960354e-01 -7.623106349637695e-01 -2.401259502488610e-01 -3.547309101800727e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.950000000000000e+02 4.851660781517447e-01 -7.623247351194486e-01 -2.400971938497645e-01 -3.547227260007260e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.960000000000000e+02 4.851641370856477e-01 -7.623388361884761e-01 -2.400684351067958e-01 -3.547145407086004e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.970000000000000e+02 4.851621943998239e-01 -7.623529380990122e-01 -2.400396739667101e-01 -3.547063543537206e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.980000000000000e+02 4.851602500126764e-01 -7.623670409136916e-01 -2.400109104703106e-01 -3.546981668846796e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.990000000000000e+02 4.851583039674510e-01 -7.623811445940879e-01 -2.399821445979219e-01 -3.546899783374449e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.000000000000000e+02 4.851563563212221e-01 -7.623952491140855e-01 -2.399533763147408e-01 -3.546817887128451e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.010000000000000e+02 4.851544069142392e-01 -7.624093545660423e-01 -2.399246057113727e-01 -3.546735979687887e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.020000000000000e+02 4.851524559088072e-01 -7.624234608515347e-01 -2.398958326975718e-01 -3.546654061550970e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.030000000000000e+02 4.851505032512240e-01 -7.624375680045616e-01 -2.398670573026442e-01 -3.546572132515339e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.040000000000000e+02 4.851485488775342e-01 -7.624516760600564e-01 -2.398382795637228e-01 -3.546490192445869e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.050000000000000e+02 4.851465928758742e-01 -7.624657849676598e-01 -2.398094994306653e-01 -3.546408241550808e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.060000000000000e+02 4.851446352372653e-01 -7.624798947313545e-01 -2.397807169089581e-01 -3.546326279822396e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.070000000000000e+02 4.851426758826093e-01 -7.624940053992584e-01 -2.397519320427282e-01 -3.546244307001938e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.080000000000000e+02 4.851407149119548e-01 -7.625081169098586e-01 -2.397231447765309e-01 -3.546162323410325e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.090000000000000e+02 4.851387522348798e-01 -7.625222293182190e-01 -2.396943551607716e-01 -3.546080328752010e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.100000000000000e+02 4.851367879305926e-01 -7.625363425742503e-01 -2.396655631520966e-01 -3.545998323305599e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.110000000000000e+02 4.851348219814494e-01 -7.625504566937447e-01 -2.396367687584628e-01 -3.545916306911265e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.120000000000000e+02 4.851328543112147e-01 -7.625645717165753e-01 -2.396079720247652e-01 -3.545834279443262e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.130000000000000e+02 4.851308850310939e-01 -7.625786875769278e-01 -2.395791728885106e-01 -3.545752241209967e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.140000000000000e+02 4.851289140909210e-01 -7.625928043053410e-01 -2.395503713775447e-01 -3.545670192044939e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.150000000000000e+02 4.851269414553166e-01 -7.626069219192367e-01 -2.395215675132014e-01 -3.545588131905564e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.160000000000000e+02 4.851249671826844e-01 -7.626210403929659e-01 -2.394927612594346e-01 -3.545506060780057e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.170000000000000e+02 4.851229912787361e-01 -7.626351597150115e-01 -2.394639526159258e-01 -3.545423978832262e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.180000000000000e+02 4.851210136493914e-01 -7.626492799426909e-01 -2.394351416351539e-01 -3.545341885754260e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.190000000000000e+02 4.851190343935027e-01 -7.626634010151596e-01 -2.394063282623727e-01 -3.545259781864151e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.200000000000000e+02 4.851170535274019e-01 -7.626775229273709e-01 -2.393775124867103e-01 -3.545177667112559e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.210000000000000e+02 4.851150709246352e-01 -7.626916457474117e-01 -2.393486943818728e-01 -3.545095541259553e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.220000000000000e+02 4.851130867138516e-01 -7.627057694052991e-01 -2.393198738732217e-01 -3.545013404546379e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.230000000000000e+02 4.851111008024986e-01 -7.627198939522257e-01 -2.392910510142744e-01 -3.544931256768993e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.240000000000000e+02 4.851091132561569e-01 -7.627340193464479e-01 -2.392622257691790e-01 -3.544849098162235e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.250000000000000e+02 4.851071240759092e-01 -7.627481455922716e-01 -2.392333981355192e-01 -3.544766928627094e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.260000000000000e+02 4.851051331913412e-01 -7.627622727312093e-01 -2.392045681531507e-01 -3.544684747957094e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.270000000000000e+02 4.851031406583909e-01 -7.627764007261320e-01 -2.391757357920277e-01 -3.544602556380544e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.280000000000000e+02 4.851011465254548e-01 -7.627905295484289e-01 -2.391469010248806e-01 -3.544520354026941e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.290000000000000e+02 4.850991506516809e-01 -7.628046592841198e-01 -2.391180639301942e-01 -3.544438140435398e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.300000000000000e+02 4.850971531649003e-01 -7.628187898545700e-01 -2.390892244370865e-01 -3.544355916019034e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.310000000000000e+02 4.850951540387815e-01 -7.628329212757083e-01 -2.390603825602202e-01 -3.544273680688629e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.320000000000000e+02 4.850931532148887e-01 -7.628470535830030e-01 -2.390315383323579e-01 -3.544191434251740e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.330000000000000e+02 4.850911507628616e-01 -7.628611867335636e-01 -2.390026917148055e-01 -3.544109176931479e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.340000000000000e+02 4.850891466343251e-01 -7.628753207566874e-01 -2.389738427347453e-01 -3.544026908568172e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.350000000000000e+02 4.850871408453840e-01 -7.628894556435700e-01 -2.389449913828246e-01 -3.543944629186097e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.360000000000000e+02 4.850851334477567e-01 -7.629035913596643e-01 -2.389161376313096e-01 -3.543862339000140e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.370000000000000e+02 4.850831243278318e-01 -7.629177279729955e-01 -2.388872815440828e-01 -3.543780037662471e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.380000000000000e+02 4.850811135889996e-01 -7.629318654276943e-01 -2.388584230609865e-01 -3.543697725358267e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.390000000000000e+02 4.850791012194524e-01 -7.629460037229973e-01 -2.388295621914229e-01 -3.543615402194344e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.400000000000000e+02 4.850770871286948e-01 -7.629601429153463e-01 -2.388006989855229e-01 -3.543533067848537e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.410000000000000e+02 4.850750714280138e-01 -7.629742829401306e-01 -2.387718333801235e-01 -3.543450722606362e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.420000000000000e+02 4.850730540807035e-01 -7.629884238131618e-01 -2.387429653979961e-01 -3.543368366468512e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.430000000000000e+02 4.850710350496168e-01 -7.630025655646379e-01 -2.387140950573137e-01 -3.543285999162956e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.440000000000000e+02 4.850690143601941e-01 -7.630167081735371e-01 -2.386852223458591e-01 -3.543203620868509e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.450000000000000e+02 4.850669920717224e-01 -7.630308516045550e-01 -2.386563472302710e-01 -3.543121231750666e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.460000000000000e+02 4.850649680499957e-01 -7.630449959396644e-01 -2.386274697854652e-01 -3.543038831368930e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.470000000000000e+02 4.850629424519824e-01 -7.630591410836710e-01 -2.385985899236936e-01 -3.542956420207574e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.480000000000000e+02 4.850609151279182e-01 -7.630732871229093e-01 -2.385697077303952e-01 -3.542873997874301e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.490000000000000e+02 4.850588861822197e-01 -7.630874339995672e-01 -2.385408231452511e-01 -3.542791564583029e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.500000000000000e+02 4.850568556233907e-01 -7.631015817082013e-01 -2.385119361635828e-01 -3.542709120358170e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.510000000000000e+02 4.850548233262905e-01 -7.631157303200434e-01 -2.384830468571647e-01 -3.542626664887669e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.520000000000000e+02 4.850527894403368e-01 -7.631298797444706e-01 -2.384541551425008e-01 -3.542544198632033e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.530000000000000e+02 4.850507539116964e-01 -7.631440300168904e-01 -2.384252610486450e-01 -3.542461721362140e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.540000000000000e+02 4.850487166641212e-01 -7.631581811824237e-01 -2.383963646188036e-01 -3.542379232851315e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.550000000000000e+02 4.850466778033574e-01 -7.631723331759475e-01 -2.383674657942135e-01 -3.542296733442177e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.560000000000000e+02 4.850446373261792e-01 -7.631864859992182e-01 -2.383385645767185e-01 -3.542214223120760e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.570000000000000e+02 4.850425951237996e-01 -7.632006397186262e-01 -2.383096610271710e-01 -3.542131701528960e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.580000000000000e+02 4.850405513407284e-01 -7.632147942478981e-01 -2.382807550641998e-01 -3.542049169086388e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.590000000000000e+02 4.850385058346101e-01 -7.632289496688445e-01 -2.382518467692082e-01 -3.541966625424118e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.600000000000000e+02 4.850364587198870e-01 -7.632431059122949e-01 -2.382229360781012e-01 -3.541884070888734e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.610000000000000e+02 4.850344099784089e-01 -7.632572629891670e-01 -2.381940230010301e-01 -3.541801505417366e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.620000000000000e+02 4.850323595115168e-01 -7.632714209635307e-01 -2.381651075918426e-01 -3.541718928610364e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.630000000000000e+02 4.850303074541630e-01 -7.632855797510280e-01 -2.381361897759407e-01 -3.541636340931330e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.640000000000000e+02 4.850282537422224e-01 -7.632997393895021e-01 -2.381072695895374e-01 -3.541553742191466e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.650000000000000e+02 4.850261983458391e-01 -7.633138998943105e-01 -2.380783470505187e-01 -3.541471132340547e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.660000000000000e+02 4.850241413116545e-01 -7.633280612404864e-01 -2.380494221315738e-01 -3.541388511453619e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.670000000000000e+02 4.850220826771494e-01 -7.633422234035006e-01 -2.380204948123478e-01 -3.541305879674980e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.680000000000000e+02 4.850200223029028e-01 -7.633563864698625e-01 -2.379915651703509e-01 -3.541223236520571e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.690000000000000e+02 4.850179603401419e-01 -7.633705503452121e-01 -2.379626331218793e-01 -3.541140582507824e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.700000000000000e+02 4.850158967359987e-01 -7.633847150604876e-01 -2.379336986968958e-01 -3.541057917484667e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.710000000000000e+02 4.850138314375685e-01 -7.633988806490858e-01 -2.379047619247381e-01 -3.540975241250728e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.720000000000000e+02 4.850117645336171e-01 -7.634130470563388e-01 -2.378758227559175e-01 -3.540892554093372e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.730000000000000e+02 4.850096959325414e-01 -7.634272143342211e-01 -2.378468812431979e-01 -3.540809855784395e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.740000000000000e+02 4.850076257076180e-01 -7.634413824452947e-01 -2.378179373430130e-01 -3.540727146412035e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.750000000000000e+02 4.850055538622939e-01 -7.634555513833322e-01 -2.377889910548893e-01 -3.540644426058622e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.760000000000000e+02 4.850034803173718e-01 -7.634697211978776e-01 -2.377600424228313e-01 -3.540561694437271e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.770000000000000e+02 4.850014051461925e-01 -7.634838918410849e-01 -2.377310914069488e-01 -3.540478951835053e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.780000000000000e+02 4.849993283600967e-01 -7.634980633044713e-01 -2.377021380014371e-01 -3.540396198310612e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.790000000000000e+02 4.849972498569708e-01 -7.635122356594297e-01 -2.376731822602967e-01 -3.540313433352734e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.800000000000000e+02 4.849951697537631e-01 -7.635264088235595e-01 -2.376442241221061e-01 -3.540230657540825e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.810000000000000e+02 4.849930880277291e-01 -7.635405828131950e-01 -2.376152635986663e-01 -3.540147870747072e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.820000000000000e+02 4.849910045808906e-01 -7.635547576907159e-01 -2.375863007440156e-01 -3.540065072597747e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.830000000000000e+02 4.849889195552765e-01 -7.635689333661404e-01 -2.375573354798425e-01 -3.539982263605536e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.840000000000000e+02 4.849868328229124e-01 -7.635831099202708e-01 -2.375283678769216e-01 -3.539899443297986e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.850000000000000e+02 4.849847444855863e-01 -7.635972872916685e-01 -2.374993978780696e-01 -3.539816611981617e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.860000000000000e+02 4.849826545094762e-01 -7.636114654957007e-01 -2.374704255040655e-01 -3.539733769640994e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.870000000000000e+02 4.849805628389278e-01 -7.636256445661694e-01 -2.374414507862917e-01 -3.539650916091023e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.880000000000000e+02 4.849784695434853e-01 -7.636398244666159e-01 -2.374124736836792e-01 -3.539568051432992e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.890000000000000e+02 4.849763746586052e-01 -7.636540051711531e-01 -2.373834941778888e-01 -3.539485175854661e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.900000000000000e+02 4.849742780284213e-01 -7.636681867725459e-01 -2.373545123571643e-01 -3.539402288890551e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.910000000000000e+02 4.849721798179185e-01 -7.636823691744155e-01 -2.373255281276276e-01 -3.539319390981142e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.920000000000000e+02 4.849700799656703e-01 -7.636965524103833e-01 -2.372965415250085e-01 -3.539236481995178e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.930000000000000e+02 4.849679784290558e-01 -7.637107365075443e-01 -2.372675525729674e-01 -3.539153561765486e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.940000000000000e+02 4.849658752559665e-01 -7.637249214375539e-01 -2.372385612443614e-01 -3.539070630421522e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.950000000000000e+02 4.849637704838904e-01 -7.637391071719819e-01 -2.372095675201734e-01 -3.538987688182669e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.960000000000000e+02 4.849616640103115e-01 -7.637532937798951e-01 -2.371805714556507e-01 -3.538904734585016e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.970000000000000e+02 4.849595559347458e-01 -7.637674811999916e-01 -2.371515729951882e-01 -3.538821769952578e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.980000000000000e+02 4.849574461663237e-01 -7.637816694812403e-01 -2.371225721921895e-01 -3.538738794107966e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.990000000000000e+02 4.849553347883807e-01 -7.637958585774027e-01 -2.370935689983085e-01 -3.538655807223169e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.000000000000000e+02 4.849532217884277e-01 -7.638100484946325e-01 -2.370645634210375e-01 -3.538572809278398e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.010000000000000e+02 4.849511070820658e-01 -7.638242392844010e-01 -2.370355555078582e-01 -3.538489799993302e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.020000000000000e+02 4.849489907679887e-01 -7.638384308845582e-01 -2.370065452041570e-01 -3.538406779714787e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.030000000000000e+02 4.849468728442187e-01 -7.638526232986833e-01 -2.369775325101601e-01 -3.538323748383252e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.040000000000000e+02 4.849447532060444e-01 -7.638668165907306e-01 -2.369485174847119e-01 -3.538240705651174e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.050000000000000e+02 4.849426319520354e-01 -7.638810106960345e-01 -2.369195000741829e-01 -3.538157651914866e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.060000000000000e+02 4.849405091079714e-01 -7.638952056024134e-01 -2.368904802628233e-01 -3.538074587181523e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.070000000000000e+02 4.849383845455094e-01 -7.639094013870511e-01 -2.368614581231647e-01 -3.537991511050262e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.080000000000000e+02 4.849362584000802e-01 -7.639235979691518e-01 -2.368324335785413e-01 -3.537908423914647e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.090000000000000e+02 4.849341305542993e-01 -7.639377954126980e-01 -2.368034066976943e-01 -3.537825325534020e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.100000000000000e+02 4.849320011045282e-01 -7.639519936673150e-01 -2.367743774235562e-01 -3.537742216049382e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.110000000000000e+02 4.849298700252345e-01 -7.639661927432919e-01 -2.367453457723134e-01 -3.537659095472262e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.120000000000000e+02 4.849277372491499e-01 -7.639803926828795e-01 -2.367163117814529e-01 -3.537575963553561e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.130000000000000e+02 4.849256028850411e-01 -7.639945934177231e-01 -2.366872753906704e-01 -3.537492820674106e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.140000000000000e+02 4.849234668769003e-01 -7.640087949858987e-01 -2.366582366299489e-01 -3.537409666570814e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.150000000000000e+02 4.849213291923861e-01 -7.640229974043131e-01 -2.366291955186434e-01 -3.537326501184450e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.160000000000000e+02 4.849191898800613e-01 -7.640372006403134e-01 -2.366001520305756e-01 -3.537243324721768e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.170000000000000e+02 4.849170489690456e-01 -7.640514046796610e-01 -2.365711061481145e-01 -3.537160137201127e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.180000000000000e+02 4.849149063479468e-01 -7.640656095878469e-01 -2.365420579348468e-01 -3.537076938301761e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.190000000000000e+02 4.849127621233603e-01 -7.640798153017248e-01 -2.365130073302581e-01 -3.536993728323150e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.200000000000000e+02 4.849106162882467e-01 -7.640940218241029e-01 -2.364839543388047e-01 -3.536910507263398e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.210000000000000e+02 4.849084687484883e-01 -7.641082292124475e-01 -2.364548990134949e-01 -3.536827274809048e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.220000000000000e+02 4.849063196295012e-01 -7.641224373882117e-01 -2.364258412845631e-01 -3.536744031396071e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.230000000000000e+02 4.849041688131024e-01 -7.641366464262407e-01 -2.363967812175669e-01 -3.536660776581584e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.240000000000000e+02 4.849020164014884e-01 -7.641508562660841e-01 -2.363677187544262e-01 -3.536577510650797e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.250000000000000e+02 4.848998623524867e-01 -7.641650669217999e-01 -2.363386539229833e-01 -3.536494233684155e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.260000000000000e+02 4.848977066176817e-01 -7.641792784369948e-01 -2.363095867455778e-01 -3.536410945246060e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.270000000000000e+02 4.848955492820212e-01 -7.641934907501766e-01 -2.362805171779488e-01 -3.536327645788321e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.280000000000000e+02 4.848933903284831e-01 -7.642077038728788e-01 -2.362514452292186e-01 -3.536244335226253e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.290000000000000e+02 4.848912296851741e-01 -7.642219178515010e-01 -2.362223709390592e-01 -3.536161013269942e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.300000000000000e+02 4.848890674125788e-01 -7.642361326460539e-01 -2.361932942745810e-01 -3.536077680166032e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.310000000000000e+02 4.848869035614081e-01 -7.642503482290184e-01 -2.361642152060378e-01 -3.535994336004661e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.320000000000000e+02 4.848847379895686e-01 -7.642645646834875e-01 -2.361351338147611e-01 -3.535910980387262e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.330000000000000e+02 4.848825708537333e-01 -7.642787819142666e-01 -2.361060500124741e-01 -3.535827613804531e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.340000000000000e+02 4.848804020090304e-01 -7.642930000100399e-01 -2.360769638806849e-01 -3.535744235774020e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.350000000000000e+02 4.848782315781894e-01 -7.643072188964244e-01 -2.360478753502152e-01 -3.535660846674498e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.360000000000000e+02 4.848760595147160e-01 -7.643214385991952e-01 -2.360187844481022e-01 -3.535577446397952e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.370000000000000e+02 4.848738857599202e-01 -7.643356591553495e-01 -2.359896912071152e-01 -3.535494034722779e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.380000000000000e+02 4.848717104140169e-01 -7.643498805030494e-01 -2.359605955711395e-01 -3.535410611978091e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.390000000000000e+02 4.848695334478140e-01 -7.643641026587265e-01 -2.359314975570560e-01 -3.535327178088388e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.400000000000000e+02 4.848673547900064e-01 -7.643783256710138e-01 -2.359023972033236e-01 -3.535243732715539e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.410000000000000e+02 4.848651745252160e-01 -7.643925494799025e-01 -2.358732944653387e-01 -3.535160276286131e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.420000000000000e+02 4.848629926490081e-01 -7.644067740917725e-01 -2.358441893442504e-01 -3.535076808707433e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.430000000000000e+02 4.848608090885334e-01 -7.644209995536236e-01 -2.358150818803213e-01 -3.534993329685772e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.440000000000000e+02 4.848586239136634e-01 -7.644352258196840e-01 -2.357859720353513e-01 -3.534909839499474e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.450000000000000e+02 4.848564371423810e-01 -7.644494528773785e-01 -2.357568597997726e-01 -3.534826338229692e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.460000000000000e+02 4.848542486667255e-01 -7.644636807914248e-01 -2.357277452349466e-01 -3.534742825540492e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.470000000000000e+02 4.848520586115465e-01 -7.644779094900450e-01 -2.356986282689430e-01 -3.534659301743446e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.480000000000000e+02 4.848498668795167e-01 -7.644921390327111e-01 -2.356695089567030e-01 -3.534575766513032e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.490000000000000e+02 4.848476735349011e-01 -7.645063693732176e-01 -2.356403872645461e-01 -3.534492220183694e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.500000000000000e+02 4.848454785792381e-01 -7.645206005168553e-01 -2.356112631893435e-01 -3.534408662632808e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.510000000000000e+02 4.848432819308241e-01 -7.645348325070329e-01 -2.355821367796078e-01 -3.534325093710894e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.520000000000000e+02 4.848410836851766e-01 -7.645490652925337e-01 -2.355530079790034e-01 -3.534241513583078e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.530000000000000e+02 4.848388838307278e-01 -7.645632988750812e-01 -2.355238767959339e-01 -3.534157922306831e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.540000000000000e+02 4.848366822990158e-01 -7.645775333002769e-01 -2.354947432677771e-01 -3.534074319577772e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.550000000000000e+02 4.848344791283284e-01 -7.645917685391829e-01 -2.354656073749544e-01 -3.533990705619229e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.560000000000000e+02 4.848322743811528e-01 -7.646060045531408e-01 -2.354364690824358e-01 -3.533907080635770e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.570000000000000e+02 4.848300679466737e-01 -7.646202414138064e-01 -2.354073284513920e-01 -3.533823444181879e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.580000000000000e+02 4.848278599127103e-01 -7.646344790669914e-01 -2.353781854324734e-01 -3.533739796545980e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.590000000000000e+02 4.848256502144903e-01 -7.646487175508664e-01 -2.353490400628571e-01 -3.533656137535226e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.600000000000000e+02 4.848234388942800e-01 -7.646629568405009e-01 -2.353198923184004e-01 -3.533572467262041e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.610000000000000e+02 4.848212259887912e-01 -7.646771969105042e-01 -2.352907421794619e-01 -3.533488785895003e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.620000000000000e+02 4.848190113659321e-01 -7.646914378404623e-01 -2.352615897210528e-01 -3.533405093016792e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.630000000000000e+02 4.848167951639155e-01 -7.647056795502943e-01 -2.352324348637261e-01 -3.533321388985092e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.640000000000000e+02 4.848145773582940e-01 -7.647199220548154e-01 -2.352032776212717e-01 -3.533237673714962e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.650000000000000e+02 4.848123578464386e-01 -7.647341654116161e-01 -2.351741180535561e-01 -3.533153946961671e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.660000000000000e+02 4.848101367430246e-01 -7.647484095486344e-01 -2.351449560966565e-01 -3.533070209128957e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.670000000000000e+02 4.848079140444434e-01 -7.647626544794873e-01 -2.351157917484832e-01 -3.532986459977561e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.680000000000000e+02 4.848056896534059e-01 -7.647769002494462e-01 -2.350866250691607e-01 -3.532902699454459e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.690000000000000e+02 4.848034636460094e-01 -7.647911468205090e-01 -2.350574560127273e-01 -3.532818927635951e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.700000000000000e+02 4.848012360545410e-01 -7.648053941738765e-01 -2.350282845606233e-01 -3.532735144601438e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.710000000000000e+02 4.847990067762354e-01 -7.648196423620692e-01 -2.349991107746749e-01 -3.532651350204895e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.720000000000000e+02 4.847967759044622e-01 -7.648338913365045e-01 -2.349699345991028e-01 -3.532567544579895e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.730000000000000e+02 4.847945433760437e-01 -7.648481411343838e-01 -2.349407560702366e-01 -3.532483727538411e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.740000000000000e+02 4.847923092144962e-01 -7.648623917358512e-01 -2.349115751767645e-01 -3.532399899254910e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.750000000000000e+02 4.847900734783403e-01 -7.648766431149999e-01 -2.348823918821192e-01 -3.532316059722418e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.760000000000000e+02 4.847878360332690e-01 -7.648908953424763e-01 -2.348532062663618e-01 -3.532232208714128e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.770000000000000e+02 4.847855970078075e-01 -7.649051483454242e-01 -2.348240182549317e-01 -3.532148346531551e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.780000000000000e+02 4.847833563764811e-01 -7.649194021380038e-01 -2.347948278626791e-01 -3.532064473110978e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.790000000000000e+02 4.847811140492311e-01 -7.649336567752556e-01 -2.347656351406193e-01 -3.531980588149424e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.800000000000000e+02 4.847788701310395e-01 -7.649479121910613e-01 -2.347364400302009e-01 -3.531896692019135e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.810000000000000e+02 4.847766246128093e-01 -7.649621683920853e-01 -2.347072425361348e-01 -3.531812784661362e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.820000000000000e+02 4.847743774044346e-01 -7.649764254346908e-01 -2.346780427090133e-01 -3.531728865747947e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.830000000000000e+02 4.847721286312143e-01 -7.649906832415935e-01 -2.346488404782736e-01 -3.531644935693891e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.840000000000000e+02 4.847698781697168e-01 -7.650049418857977e-01 -2.346196359146649e-01 -3.531560994134114e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.850000000000000e+02 4.847676261072611e-01 -7.650192013159204e-01 -2.345904289681637e-01 -3.531477041307438e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.860000000000000e+02 4.847653724624499e-01 -7.650334615151253e-01 -2.345612196302025e-01 -3.531393077372149e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.870000000000000e+02 4.847631170977237e-01 -7.650477225741507e-01 -2.345320079762666e-01 -3.531309101741514e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.880000000000000e+02 4.847608601741002e-01 -7.650619843936673e-01 -2.345027939157414e-01 -3.531225114950929e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.890000000000000e+02 4.847586016351453e-01 -7.650762470017345e-01 -2.344735774827802e-01 -3.531141116932403e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.900000000000000e+02 4.847563413977327e-01 -7.650905104543002e-01 -2.344443587226946e-01 -3.531057107306078e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.910000000000000e+02 4.847540795912967e-01 -7.651047746714696e-01 -2.344151375626347e-01 -3.530973086501870e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.920000000000000e+02 4.847518161693992e-01 -7.651190396764427e-01 -2.343859140306697e-01 -3.530889054460288e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.930000000000000e+02 4.847495510739122e-01 -7.651333055123608e-01 -2.343566881571123e-01 -3.530805010835334e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.940000000000000e+02 4.847472843641711e-01 -7.651475721398958e-01 -2.343274599095178e-01 -3.530720955872017e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.950000000000000e+02 4.847450160832610e-01 -7.651618395258505e-01 -2.342982292659781e-01 -3.530636889835641e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.960000000000000e+02 4.847427460919202e-01 -7.651761077633142e-01 -2.342689963025398e-01 -3.530552812108179e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.970000000000000e+02 4.847404745570708e-01 -7.651903767454866e-01 -2.342397609264790e-01 -3.530468723319781e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.980000000000000e+02 4.847382013190169e-01 -7.652046465754589e-01 -2.342105232262987e-01 -3.530384622833531e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.990000000000000e+02 4.847359264945647e-01 -7.652189171720702e-01 -2.341812831394562e-01 -3.530300511211731e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.000000000000000e+02 4.847336500855152e-01 -7.652331885417242e-01 -2.341520406622137e-01 -3.530216388307668e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.010000000000000e+02 4.847313719754489e-01 -7.652474607570062e-01 -2.341227958600913e-01 -3.530132253703922e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.020000000000000e+02 4.847290922831975e-01 -7.652617337355043e-01 -2.340935486693846e-01 -3.530048107969809e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.030000000000000e+02 4.847268109979087e-01 -7.652760074901221e-01 -2.340642990939554e-01 -3.529963950941029e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.040000000000000e+02 4.847245280169034e-01 -7.652902820824113e-01 -2.340350471925181e-01 -3.529879782295842e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.050000000000000e+02 4.847222434433228e-01 -7.653045574486427e-01 -2.340057929069607e-01 -3.529795602376912e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.060000000000000e+02 4.847199572894303e-01 -7.653188335797512e-01 -2.339765362308840e-01 -3.529711411246820e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.070000000000000e+02 4.847176694406113e-01 -7.653331105485083e-01 -2.339472772283638e-01 -3.529627208468942e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.080000000000000e+02 4.847153800260633e-01 -7.653473882738989e-01 -2.339180158269381e-01 -3.529542994498001e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.090000000000000e+02 4.847130889472508e-01 -7.653616668162190e-01 -2.338887520825449e-01 -3.529458769001046e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.100000000000000e+02 4.847107962656133e-01 -7.653759461361208e-01 -2.338594859610394e-01 -3.529374532205835e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.110000000000000e+02 4.847085019779276e-01 -7.653902262405219e-01 -2.338302174624474e-01 -3.529290283998479e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.120000000000000e+02 4.847062060222560e-01 -7.654045071581616e-01 -2.338009466253086e-01 -3.529206024343042e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.130000000000000e+02 4.847039084777617e-01 -7.654187888477985e-01 -2.337716734022246e-01 -3.529121753352731e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.140000000000000e+02 4.847016093359982e-01 -7.654330713144101e-01 -2.337423977980199e-01 -3.529037470995667e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.150000000000000e+02 4.846993085032320e-01 -7.654473546063203e-01 -2.337131198691957e-01 -3.528953177128905e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.160000000000000e+02 4.846970060971501e-01 -7.654616386637149e-01 -2.336838395447409e-01 -3.528868871895746e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.170000000000000e+02 4.846947020981449e-01 -7.654759234907111e-01 -2.336545568385583e-01 -3.528784555376120e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.180000000000000e+02 4.846923963983021e-01 -7.654902091521054e-01 -2.336252718123960e-01 -3.528700227229874e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.190000000000000e+02 4.846900891237535e-01 -7.655044955751428e-01 -2.335959843932317e-01 -3.528615887778255e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.200000000000000e+02 4.846877802590049e-01 -7.655187827639872e-01 -2.335666945917237e-01 -3.528531537065220e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.210000000000000e+02 4.846854697068923e-01 -7.655330707806830e-01 -2.335374024621756e-01 -3.528447174711941e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.220000000000000e+02 4.846831576001164e-01 -7.655473595458984e-01 -2.335081079286644e-01 -3.528362801111288e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.230000000000000e+02 4.846808438020997e-01 -7.655616491408025e-01 -2.334788110696207e-01 -3.528278415851219e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.240000000000000e+02 4.846785284311762e-01 -7.655759394884162e-01 -2.334495118196319e-01 -3.528194019401349e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.250000000000000e+02 4.846762114707391e-01 -7.655902306051849e-01 -2.334202101858260e-01 -3.528109611577792e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.260000000000000e+02 4.846738928038691e-01 -7.656045225627526e-01 -2.333909062346249e-01 -3.528025191984663e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.270000000000000e+02 4.846715725752460e-01 -7.656188152653288e-01 -2.333615998866319e-01 -3.527940761230328e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.280000000000000e+02 4.846692507571189e-01 -7.656331087362244e-01 -2.333322911552771e-01 -3.527856319093323e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.290000000000000e+02 4.846669272423068e-01 -7.656474030359357e-01 -2.333029801033438e-01 -3.527771865309985e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.300000000000000e+02 4.846646021558852e-01 -7.656616980910501e-01 -2.332736666587975e-01 -3.527687400223661e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.310000000000000e+02 4.846622754692944e-01 -7.656759939163604e-01 -2.332443508387677e-01 -3.527602923784383e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.320000000000000e+02 4.846599471078201e-01 -7.656902905613819e-01 -2.332150326844599e-01 -3.527518435663488e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.330000000000000e+02 4.846576171943734e-01 -7.657045879489290e-01 -2.331857121267976e-01 -3.527433936296345e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.340000000000000e+02 4.846552855882528e-01 -7.657188861588697e-01 -2.331563892480087e-01 -3.527349425330873e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.350000000000000e+02 4.846529524142206e-01 -7.657331851218382e-01 -2.331270639748176e-01 -3.527264903035002e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.360000000000000e+02 4.846506176444192e-01 -7.657474848534860e-01 -2.330977363235006e-01 -3.527180369336150e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.370000000000000e+02 4.846482811825746e-01 -7.657617854101768e-01 -2.330684063497928e-01 -3.527095823957188e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.380000000000000e+02 4.846459431647104e-01 -7.657760867091620e-01 -2.330390739763368e-01 -3.527011267328781e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.390000000000000e+02 4.846436035292566e-01 -7.657903887881546e-01 -2.330097392380277e-01 -3.526926699239587e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.400000000000000e+02 4.846412622275905e-01 -7.658046916754478e-01 -2.329804021631889e-01 -3.526842119548293e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.410000000000000e+02 4.846389193524381e-01 -7.658189953175427e-01 -2.329510626980200e-01 -3.526757528489783e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.420000000000000e+02 4.846365748737013e-01 -7.658332997314732e-01 -2.329217208600767e-01 -3.526672925983800e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.430000000000000e+02 4.846342287324701e-01 -7.658476049492992e-01 -2.328923766844356e-01 -3.526588311904029e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.440000000000000e+02 4.846318809876127e-01 -7.658619109345204e-01 -2.328630301378363e-01 -3.526503686445804e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.450000000000000e+02 4.846295316803431e-01 -7.658762176679498e-01 -2.328336811946941e-01 -3.526419049620369e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.460000000000000e+02 4.846271806834871e-01 -7.658905252198568e-01 -2.328043299301305e-01 -3.526334401145325e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.470000000000000e+02 4.846248281289138e-01 -7.659048335152381e-01 -2.327749762671355e-01 -3.526249741337830e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.480000000000000e+02 4.846224738969995e-01 -7.659191426261488e-01 -2.327456202742569e-01 -3.526165069816338e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.490000000000000e+02 4.846201180984200e-01 -7.659334524828676e-01 -2.327162618893398e-01 -3.526080386976465e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.500000000000000e+02 4.846177606993502e-01 -7.659477631047287e-01 -2.326869011320616e-01 -3.525995692725220e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.510000000000000e+02 4.846154016241758e-01 -7.659620745353831e-01 -2.326575380465264e-01 -3.525910986854604e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.520000000000000e+02 4.846130409733496e-01 -7.659763867229890e-01 -2.326281725721953e-01 -3.525826269501627e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.530000000000000e+02 4.846106787398660e-01 -7.659906996626296e-01 -2.325988047163291e-01 -3.525741540813464e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.540000000000000e+02 4.846083148254303e-01 -7.660050134170855e-01 -2.325694345340444e-01 -3.525656800405595e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.550000000000000e+02 4.846059493249599e-01 -7.660193279276274e-01 -2.325400619716211e-01 -3.525572048595733e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.560000000000000e+02 4.846035822585310e-01 -7.660336431816542e-01 -2.325106870177388e-01 -3.525487285448360e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.570000000000000e+02 4.846012135078077e-01 -7.660479592504438e-01 -2.324813097402749e-01 -3.525402510585663e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.580000000000000e+02 4.845988431734635e-01 -7.660622760743400e-01 -2.324519300812130e-01 -3.525317724294670e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.590000000000000e+02 4.845964712260229e-01 -7.660765936698447e-01 -2.324225480580664e-01 -3.525232926498473e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.600000000000000e+02 4.845940976533069e-01 -7.660909120442421e-01 -2.323931636778037e-01 -3.525148117152245e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.610000000000000e+02 4.845917225206102e-01 -7.661052311596275e-01 -2.323637769025411e-01 -3.525063296423879e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.620000000000000e+02 4.845893456882236e-01 -7.661195510953174e-01 -2.323343878141535e-01 -3.524978463962457e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.630000000000000e+02 4.845869673044798e-01 -7.661338717622138e-01 -2.323049963276651e-01 -3.524893620217357e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.640000000000000e+02 4.845845873195189e-01 -7.661481931972630e-01 -2.322756024691031e-01 -3.524808764891453e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.650000000000000e+02 4.845822056587374e-01 -7.661625154383619e-01 -2.322462062839009e-01 -3.524723897879254e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.660000000000000e+02 4.845798224386608e-01 -7.661768384147294e-01 -2.322168077055617e-01 -3.524639019547447e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.670000000000000e+02 4.845774376180936e-01 -7.661911621541131e-01 -2.321874067565917e-01 -3.524554129702956e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.680000000000000e+02 4.845750511467093e-01 -7.662054866858752e-01 -2.321580034663526e-01 -3.524469228197947e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.690000000000000e+02 4.845726630633415e-01 -7.662198119871350e-01 -2.321285978124142e-01 -3.524384315135672e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.700000000000000e+02 4.845702734281614e-01 -7.662341380167069e-01 -2.320991897620763e-01 -3.524299390791575e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.710000000000000e+02 4.845678821085129e-01 -7.662484648624387e-01 -2.320697793886611e-01 -3.524214454588775e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.720000000000000e+02 4.845654892365792e-01 -7.662627924336481e-01 -2.320403666203476e-01 -3.524129507146371e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.730000000000000e+02 4.845630947019518e-01 -7.662771208070390e-01 -2.320109515169201e-01 -3.524044547913026e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.740000000000000e+02 4.845606985873193e-01 -7.662914499262536e-01 -2.319815340333494e-01 -3.523959577265657e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.750000000000000e+02 4.845583008880378e-01 -7.663057797926437e-01 -2.319521141727936e-01 -3.523874595209903e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.760000000000000e+02 4.845559015258024e-01 -7.663201104618341e-01 -2.319226919772916e-01 -3.523789601328177e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.770000000000000e+02 4.845535005770593e-01 -7.663344418787414e-01 -2.318932674062688e-01 -3.523704596026180e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.780000000000000e+02 4.845510980463189e-01 -7.663487740429311e-01 -2.318638404563021e-01 -3.523619579265867e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.790000000000000e+02 4.845486938683101e-01 -7.663631069929907e-01 -2.318344111652688e-01 -3.523534550848309e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.800000000000000e+02 4.845462880747617e-01 -7.663774407116997e-01 -2.318049795142913e-01 -3.523449510827910e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.810000000000000e+02 4.845438807428146e-01 -7.663917751499707e-01 -2.317755454600722e-01 -3.523364459488343e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.820000000000000e+02 4.845414717102450e-01 -7.664061104074765e-01 -2.317461090951164e-01 -3.523279396275963e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.830000000000000e+02 4.845390611438795e-01 -7.664204463811508e-01 -2.317166703246144e-01 -3.523194321754047e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.840000000000000e+02 4.845366489126783e-01 -7.664347831501507e-01 -2.316872292238275e-01 -3.523109235499787e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.850000000000000e+02 4.845342351035227e-01 -7.664491206645204e-01 -2.316577857420695e-01 -3.523024137730384e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.860000000000000e+02 4.845318197088165e-01 -7.664634589261488e-01 -2.316283398846389e-01 -3.522939028466332e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.870000000000000e+02 4.845294026493405e-01 -7.664777979796645e-01 -2.315988916982940e-01 -3.522853907510782e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.880000000000000e+02 4.845269840200818e-01 -7.664921377752487e-01 -2.315694411258798e-01 -3.522768775008946e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.890000000000000e+02 4.845245638124620e-01 -7.665064783102559e-01 -2.315399881750997e-01 -3.522683631077697e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.900000000000000e+02 4.845221419296319e-01 -7.665208196453341e-01 -2.315105329009028e-01 -3.522598475360295e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.910000000000000e+02 4.845197120959738e-01 -7.665351656517118e-01 -2.314810788718654e-01 -3.522513286476791e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.910000000000000e-12 4.240000000000000e-11 4.480000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.390000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.920000000000000e+02 4.845172934459271e-01 -7.665495045273579e-01 -2.314516152066341e-01 -3.522428129556885e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.899999999999999e-12 4.240000000000000e-11 4.470000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.400000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.930000000000000e+02 4.845148667428034e-01 -7.665638481421917e-01 -2.314221528433506e-01 -3.522342939010727e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.899999999999999e-12 4.240000000000000e-11 4.470000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.400000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.940000000000000e+02 4.845124384631171e-01 -7.665781924951888e-01 -2.313926881011000e-01 -3.522257737001664e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.899999999999999e-12 4.240000000000000e-11 4.470000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.400000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.950000000000000e+02 4.845100086336864e-01 -7.665925375708619e-01 -2.313632209642275e-01 -3.522172523592648e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.899999999999999e-12 4.240000000000000e-11 4.470000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.400000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.960000000000000e+02 4.845075771103672e-01 -7.666068834539066e-01 -2.313337515164582e-01 -3.522087298365155e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.899999999999999e-12 4.240000000000000e-11 4.470000000000000e-12 -1.630000000000000e-11 5.540000000000000e-11 -1.860000000000000e-11 3.400000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.970000000000000e+02 4.845051440603032e-01 -7.666212300474536e-01 -2.313042796603734e-01 -3.522002061760184e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.889999999999999e-12 4.240000000000000e-11 4.470000000000000e-12 -1.630000000000000e-11 5.550000000000000e-11 -1.860000000000000e-11 3.400000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.980000000000000e+02 4.845027093145511e-01 -7.666355774540713e-01 -2.312748054928996e-01 -3.521916813224636e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.889999999999999e-12 4.240000000000000e-11 4.470000000000000e-12 -1.630000000000000e-11 5.550000000000000e-11 -1.860000000000000e-11 3.400000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.990000000000000e+02 4.845002730301384e-01 -7.666499255740818e-01 -2.312453289256785e-01 -3.521831553340268e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.889999999999999e-12 4.240000000000000e-11 4.470000000000000e-12 -1.630000000000000e-11 5.550000000000000e-11 -1.860000000000000e-11 3.400000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.000000000000000e+02 4.844978351625450e-01 -7.666642744360123e-01 -2.312158499836417e-01 -3.521746281926799e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.889999999999999e-12 4.240000000000000e-11 4.470000000000000e-12 -1.630000000000000e-11 5.550000000000000e-11 -1.860000000000000e-11 3.400000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.010000000000000e+02 4.844954348532013e-01 -7.666785998915229e-01 -2.311863463880392e-01 -3.521661132456261e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.880000000000001e-12 4.240000000000000e-11 4.470000000000000e-12 -1.630000000000000e-11 5.550000000000000e-11 -1.860000000000000e-11 3.400000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.020000000000000e+02 4.844933969782241e-01 -7.666925767843463e-01 -2.311568938564846e-01 -3.521578217375018e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.880000000000001e-12 4.240000000000000e-11 4.470000000000000e-12 -1.630000000000000e-11 5.550000000000000e-11 -1.860000000000000e-11 3.400000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.030000000000000e+02 4.844909141595178e-01 -7.667069753753595e-01 -2.311273853746324e-01 -3.521492577551872e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.880000000000001e-12 4.240000000000000e-11 4.470000000000000e-12 -1.630000000000000e-11 5.550000000000000e-11 -1.860000000000000e-11 3.400000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.040000000000000e+02 4.844884310239046e-01 -7.667213718400602e-01 -2.310978775142376e-01 -3.521406951434412e-01 9.320000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.870000000000001e-12 4.240000000000000e-11 4.470000000000000e-12 -1.630000000000000e-11 5.550000000000000e-11 -1.860000000000000e-11 3.400000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.050000000000000e+02 4.844859481641737e-01 -7.667357658431233e-01 -2.310683704129106e-01 -3.521321337270184e-01 9.330000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.870000000000001e-12 4.240000000000000e-11 4.470000000000000e-12 -1.630000000000000e-11 5.550000000000000e-11 -1.860000000000000e-11 3.400000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.060000000000000e+02 4.844834669000644e-01 -7.667501563130795e-01 -2.310388636719859e-01 -3.521235742853925e-01 9.330000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.870000000000001e-12 4.240000000000000e-11 4.470000000000000e-12 -1.630000000000000e-11 5.550000000000000e-11 -1.860000000000000e-11 3.400000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.070000000000000e+02 4.844809881343295e-01 -7.667645421446021e-01 -2.310093573750930e-01 -3.521150179292400e-01 9.330000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.860000000000000e-12 4.240000000000000e-11 4.470000000000000e-12 -1.630000000000000e-11 5.550000000000000e-11 -1.860000000000000e-11 3.410000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.080000000000000e+02 4.844785112488482e-01 -7.667789238170546e-01 -2.309798520678207e-01 -3.521064641082110e-01 9.330000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.860000000000000e-12 4.240000000000000e-11 4.470000000000000e-12 -1.630000000000000e-11 5.560000000000000e-11 -1.860000000000000e-11 3.410000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.090000000000000e+02 4.844760339728313e-01 -7.667933037548584e-01 -2.309503478454544e-01 -3.520979106054585e-01 9.330000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.860000000000000e-12 4.240000000000000e-11 4.470000000000000e-12 -1.630000000000000e-11 5.560000000000000e-11 -1.860000000000000e-11 3.410000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.100000000000000e+02 4.844735531095518e-01 -7.668076852528475e-01 -2.309208435670634e-01 -3.520893553927075e-01 9.330000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.860000000000000e-12 4.240000000000000e-11 4.470000000000000e-12 -1.630000000000000e-11 5.560000000000000e-11 -1.860000000000000e-11 3.410000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.110000000000000e+02 4.844710758130656e-01 -7.668220652704490e-01 -2.308913309422042e-01 -3.520808006844900e-01 9.330000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.860000000000000e-12 4.240000000000000e-11 4.470000000000000e-12 -1.630000000000000e-11 5.560000000000000e-11 -1.860000000000000e-11 3.410000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.120000000000000e+02 4.844685821844356e-01 -7.668364572853614e-01 -2.308618183225204e-01 -3.520722390292344e-01 9.330000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.850000000000000e-12 4.240000000000000e-11 4.460000000000000e-12 -1.630000000000000e-11 5.560000000000000e-11 -1.860000000000000e-11 3.410000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.130000000000000e+02 4.844660836547539e-01 -7.668508543475600e-01 -2.308322999866436e-01 -3.520636735840813e-01 9.330000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.850000000000000e-12 4.240000000000000e-11 4.460000000000000e-12 -1.630000000000000e-11 5.560000000000000e-11 -1.860000000000000e-11 3.410000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.140000000000000e+02 4.844635829140164e-01 -7.668652535062566e-01 -2.308027784738977e-01 -3.520551054077014e-01 9.330000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.850000000000000e-12 4.240000000000000e-11 4.460000000000000e-12 -1.630000000000000e-11 5.560000000000000e-11 -1.860000000000000e-11 3.410000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.150000000000000e+02 4.844610834622020e-01 -7.668796509646637e-01 -2.307732568504803e-01 -3.520465359431439e-01 9.330000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.840000000000000e-12 4.240000000000000e-11 4.460000000000000e-12 -1.630000000000000e-11 5.560000000000000e-11 -1.860000000000000e-11 3.410000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.160000000000000e+02 4.844585895078881e-01 -7.668940430644726e-01 -2.307437370959617e-01 -3.520379660707699e-01 9.330000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.840000000000000e-12 4.240000000000000e-11 4.460000000000000e-12 -1.630000000000000e-11 5.560000000000000e-11 -1.860000000000000e-11 3.410000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.170000000000000e+02 4.844561037501093e-01 -7.669084276524097e-01 -2.307142201456500e-01 -3.520293961554297e-01 9.330000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.840000000000000e-12 4.240000000000000e-11 4.460000000000000e-12 -1.630000000000000e-11 5.560000000000000e-11 -1.860000000000000e-11 3.410000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.180000000000000e+02 4.844536250260804e-01 -7.669228053665627e-01 -2.306847059622054e-01 -3.520208264334686e-01 9.330000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.830000000000000e-12 4.240000000000000e-11 4.460000000000000e-12 -1.630000000000000e-11 5.560000000000000e-11 -1.860000000000000e-11 3.410000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.190000000000000e+02 4.844511492662905e-01 -7.669371789233984e-01 -2.306551930063991e-01 -3.520122575973320e-01 9.340000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.830000000000000e-12 4.240000000000000e-11 4.460000000000000e-12 -1.630000000000000e-11 5.560000000000000e-11 -1.860000000000000e-11 3.410000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.200000000000000e+02 4.844486724415475e-01 -7.669515508412030e-01 -2.306256784101615e-01 -3.520036915853986e-01 9.340000000000000e-11 5.740000000000000e-11 2.010000000000000e-11 -9.830000000000000e-12 4.240000000000000e-11 4.460000000000000e-12 -1.630000000000000e-11 5.570000000000000e-11 -1.860000000000000e-11 3.410000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.210000000000000e+02 4.844461971581585e-01 -7.669659190608836e-01 -2.305961564590835e-01 -3.519951330407724e-01 9.340000000000000e-11 5.750000000000000e-11 2.010000000000000e-11 -9.830000000000000e-12 4.240000000000000e-11 4.460000000000000e-12 -1.630000000000000e-11 5.570000000000000e-11 -1.860000000000000e-11 3.410000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.220000000000000e+02 4.844437127507756e-01 -7.669802898454350e-01 -2.305666316318047e-01 -3.519865800606897e-01 9.340000000000000e-11 5.750000000000000e-11 2.010000000000000e-11 -9.820000000000000e-12 4.240000000000000e-11 4.460000000000000e-12 -1.630000000000000e-11 5.570000000000000e-11 -1.860000000000000e-11 3.420000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.230000000000000e+02 4.844412250207607e-01 -7.669946601021246e-01 -2.305371019684447e-01 -3.519780326827260e-01 9.340000000000000e-11 5.750000000000000e-11 2.010000000000000e-11 -9.820000000000000e-12 4.240000000000000e-11 4.460000000000000e-12 -1.630000000000000e-11 5.570000000000000e-11 -1.860000000000000e-11 3.420000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.240000000000000e+02 4.844387350856227e-01 -7.670090299068069e-01 -2.305075695144729e-01 -3.519694878630695e-01 9.340000000000000e-11 5.750000000000000e-11 2.010000000000000e-11 -9.820000000000000e-12 4.240000000000000e-11 4.460000000000000e-12 -1.630000000000000e-11 5.570000000000000e-11 -1.860000000000000e-11 3.420000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.250000000000000e+02 4.844362431382805e-01 -7.670233996786979e-01 -2.304780358640183e-01 -3.519609433781901e-01 9.340000000000000e-11 5.750000000000000e-11 2.010000000000000e-11 -9.820000000000000e-12 4.240000000000000e-11 4.460000000000000e-12 -1.630000000000000e-11 5.570000000000000e-11 -1.860000000000000e-11 3.420000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.260000000000000e+02 4.844337483583686e-01 -7.670377706787271e-01 -2.304485011558777e-01 -3.519523975180147e-01 9.340000000000000e-11 5.750000000000000e-11 2.010000000000000e-11 -9.810000000000000e-12 4.240000000000000e-11 4.460000000000000e-12 -1.630000000000000e-11 5.570000000000000e-11 -1.860000000000000e-11 3.420000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.270000000000000e+02 4.844312496589906e-01 -7.670521444065679e-01 -2.304189648446267e-01 -3.519438488666127e-01 9.340000000000000e-11 5.750000000000000e-11 2.010000000000000e-11 -9.810000000000000e-12 4.240000000000000e-11 4.460000000000000e-12 -1.630000000000000e-11 5.570000000000000e-11 -1.860000000000000e-11 3.420000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.280000000000000e+02 4.844287462862663e-01 -7.670665213652791e-01 -2.303894272754552e-01 -3.519352971382294e-01 9.340000000000000e-11 5.750000000000000e-11 2.010000000000000e-11 -9.810000000000000e-12 4.240000000000000e-11 4.460000000000000e-12 -1.630000000000000e-11 5.570000000000000e-11 -1.860000000000000e-11 3.420000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.290000000000000e+02 4.844262378104583e-01 -7.670809011646361e-01 -2.303598899955253e-01 -3.519267427611953e-01 9.340000000000000e-11 5.750000000000000e-11 2.010000000000000e-11 -9.799999999999999e-12 4.240000000000000e-11 4.460000000000000e-12 -1.630000000000000e-11 5.570000000000000e-11 -1.860000000000000e-11 3.420000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.300000000000000e+02 4.844237248790589e-01 -7.670952830650815e-01 -2.303303543853205e-01 -3.519181855521729e-01 9.340000000000000e-11 5.750000000000000e-11 2.010000000000000e-11 -9.799999999999999e-12 4.240000000000000e-11 4.460000000000000e-12 -1.630000000000000e-11 5.580000000000000e-11 -1.860000000000000e-11 3.420000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.310000000000000e+02 4.844212451997700e-01 -7.671096440572760e-01 -2.303008003821683e-01 -3.519096368910012e-01 9.340000000000000e-11 5.750000000000000e-11 2.010000000000000e-11 -9.799999999999999e-12 4.240000000000000e-11 4.460000000000000e-12 -1.630000000000000e-11 5.580000000000000e-11 -1.860000000000000e-11 3.420000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.320000000000000e+02 4.844187342913402e-01 -7.671240241403106e-01 -2.302712656153844e-01 -3.519010737213533e-01 9.350000000000000e-11 5.750000000000000e-11 2.010000000000000e-11 -9.789999999999999e-12 4.240000000000000e-11 4.450000000000000e-12 -1.630000000000000e-11 5.580000000000000e-11 -1.860000000000000e-11 3.420000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.330000000000000e+02 4.844162277899933e-01 -7.671384009488438e-01 -2.302417296604490e-01 -3.518925091080080e-01 9.350000000000000e-11 5.750000000000000e-11 2.010000000000000e-11 -9.789999999999999e-12 4.240000000000000e-11 4.450000000000000e-12 -1.630000000000000e-11 5.580000000000000e-11 -1.860000000000000e-11 3.420000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.340000000000000e+02 4.844137241453357e-01 -7.671527749322369e-01 -2.302121922685127e-01 -3.518839443685107e-01 9.350000000000000e-11 5.750000000000000e-11 2.010000000000000e-11 -9.789999999999999e-12 4.240000000000000e-11 4.450000000000000e-12 -1.630000000000000e-11 5.580000000000000e-11 -1.860000000000000e-11 3.420000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.350000000000000e+02 4.844112228287781e-01 -7.671671462399352e-01 -2.301826521744567e-01 -3.518753807323484e-01 9.350000000000000e-11 5.750000000000000e-11 2.010000000000000e-11 -9.789999999999999e-12 4.240000000000000e-11 4.450000000000000e-12 -1.630000000000000e-11 5.580000000000000e-11 -1.860000000000000e-11 3.430000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.360000000000000e+02 4.844087254611076e-01 -7.671815138926982e-01 -2.301531076045929e-01 -3.518668192632004e-01 9.350000000000000e-11 5.750000000000000e-11 2.010000000000000e-11 -9.780000000000001e-12 4.240000000000000e-11 4.450000000000000e-12 -1.630000000000000e-11 5.580000000000000e-11 -1.860000000000000e-11 3.430000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.370000000000000e+02 4.844062335506620e-01 -7.671958768454004e-01 -2.301235581449932e-01 -3.518582604336107e-01 9.350000000000000e-11 5.750000000000000e-11 2.010000000000000e-11 -9.780000000000001e-12 4.250000000000000e-11 4.450000000000000e-12 -1.630000000000000e-11 5.580000000000000e-11 -1.860000000000000e-11 3.430000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.380000000000000e+02 4.844037465146618e-01 -7.672102352469089e-01 -2.300940050974060e-01 -3.518497038696733e-01 9.350000000000000e-11 5.750000000000000e-11 2.010000000000000e-11 -9.770000000000001e-12 4.250000000000000e-11 4.450000000000000e-12 -1.630000000000000e-11 5.580000000000000e-11 -1.860000000000000e-11 3.430000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.390000000000000e+02 4.844012620408871e-01 -7.672245907922800e-01 -2.300644495724271e-01 -3.518411483322418e-01 9.350000000000000e-11 5.750000000000000e-11 2.010000000000000e-11 -9.770000000000001e-12 4.250000000000000e-11 4.450000000000000e-12 -1.630000000000000e-11 5.580000000000000e-11 -1.860000000000000e-11 3.430000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.400000000000000e+02 4.843987777832360e-01 -7.672389465708471e-01 -2.300348905126017e-01 -3.518325910057500e-01 9.350000000000000e-11 5.750000000000000e-11 2.010000000000000e-11 -9.770000000000001e-12 4.250000000000000e-11 4.450000000000000e-12 -1.630000000000000e-11 5.590000000000000e-11 -1.860000000000000e-11 3.430000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.410000000000000e+02 4.843962914352219e-01 -7.672533070224369e-01 -2.300053256586160e-01 -3.518240268594681e-01 9.350000000000000e-11 5.750000000000000e-11 2.010000000000000e-11 -9.770000000000001e-12 4.250000000000000e-11 4.450000000000000e-12 -1.630000000000000e-11 5.590000000000000e-11 -1.860000000000000e-11 3.430000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.420000000000000e+02 4.843938044907581e-01 -7.672676734486573e-01 -2.299757522648316e-01 -3.518154527900652e-01 9.350000000000000e-11 5.750000000000000e-11 2.010000000000000e-11 -9.760000000000000e-12 4.250000000000000e-11 4.440000000000000e-12 -1.630000000000000e-11 5.590000000000000e-11 -1.860000000000000e-11 3.430000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.430000000000000e+02 4.843913161139765e-01 -7.672820455714212e-01 -2.299461722515624e-01 -3.518068692961525e-01 9.350000000000000e-11 5.750000000000000e-11 2.010000000000000e-11 -9.760000000000000e-12 4.250000000000000e-11 4.440000000000000e-12 -1.630000000000000e-11 5.590000000000000e-11 -1.860000000000000e-11 3.430000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.440000000000000e+02 4.843888268250207e-01 -7.672964199707973e-01 -2.299165882802566e-01 -3.517982813781856e-01 9.360000000000001e-11 5.750000000000000e-11 2.010000000000000e-11 -9.760000000000000e-12 4.250000000000000e-11 4.440000000000000e-12 -1.630000000000000e-11 5.590000000000000e-11 -1.860000000000000e-11 3.430000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.450000000000000e+02 4.843863375743989e-01 -7.673107928097304e-01 -2.298870017548951e-01 -3.517896951775427e-01 9.360000000000001e-11 5.750000000000000e-11 2.010000000000000e-11 -9.750000000000000e-12 4.250000000000000e-11 4.440000000000000e-12 -1.630000000000000e-11 5.590000000000000e-11 -1.860000000000000e-11 3.430000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.460000000000000e+02 4.843838492452992e-01 -7.673251611893472e-01 -2.298574124305826e-01 -3.517811159609999e-01 9.360000000000001e-11 5.750000000000000e-11 2.010000000000000e-11 -9.750000000000000e-12 4.250000000000000e-11 4.440000000000000e-12 -1.630000000000000e-11 5.590000000000000e-11 -1.860000000000000e-11 3.430000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.470000000000000e+02 4.843813615219692e-01 -7.673395242930826e-01 -2.298278200572652e-01 -3.517725461082982e-01 9.360000000000001e-11 5.750000000000000e-11 2.010000000000000e-11 -9.750000000000000e-12 4.250000000000000e-11 4.440000000000000e-12 -1.630000000000000e-11 5.590000000000000e-11 -1.860000000000000e-11 3.440000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.480000000000000e+02 4.843788726325402e-01 -7.673538839296873e-01 -2.297982258227576e-01 -3.517639833382126e-01 9.360000000000001e-11 5.750000000000000e-11 2.010000000000000e-11 -9.740000000000000e-12 4.250000000000000e-11 4.440000000000000e-12 -1.630000000000000e-11 5.600000000000000e-11 -1.860000000000000e-11 3.440000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.490000000000000e+02 4.843763806771954e-01 -7.673682432801074e-01 -2.297686311270809e-01 -3.517554224134293e-01 9.360000000000001e-11 5.750000000000000e-11 2.010000000000000e-11 -9.740000000000000e-12 4.250000000000000e-11 4.440000000000000e-12 -1.630000000000000e-11 5.600000000000000e-11 -1.860000000000000e-11 3.440000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.500000000000000e+02 4.843738859375218e-01 -7.673826045111894e-01 -2.297390349794562e-01 -3.517468588660263e-01 9.360000000000001e-11 5.750000000000000e-11 2.010000000000000e-11 -9.740000000000000e-12 4.250000000000000e-11 4.440000000000000e-12 -1.630000000000000e-11 5.600000000000000e-11 -1.860000000000000e-11 3.440000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.510000000000000e+02 4.843714302318696e-01 -7.673969438371920e-01 -2.297094118700573e-01 -3.517383036616613e-01 9.360000000000001e-11 5.750000000000000e-11 2.010000000000000e-11 -9.740000000000000e-12 4.250000000000000e-11 4.440000000000000e-12 -1.630000000000000e-11 5.600000000000000e-11 -1.860000000000000e-11 3.440000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.520000000000000e+02 4.843689437707026e-01 -7.674113054514260e-01 -2.296798008902634e-01 -3.517297309565983e-01 9.360000000000001e-11 5.750000000000000e-11 2.010000000000000e-11 -9.730000000000000e-12 4.250000000000000e-11 4.440000000000000e-12 -1.640000000000000e-11 5.600000000000000e-11 -1.860000000000000e-11 3.440000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.530000000000000e+02 4.843664652712302e-01 -7.674256649694275e-01 -2.296501805734185e-01 -3.517211546516394e-01 9.360000000000001e-11 5.760000000000000e-11 2.010000000000000e-11 -9.730000000000000e-12 4.250000000000000e-11 4.440000000000000e-12 -1.640000000000000e-11 5.600000000000000e-11 -1.860000000000000e-11 3.440000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.540000000000000e+02 4.843639903199223e-01 -7.674400237765679e-01 -2.296205543562724e-01 -3.517125755560941e-01 9.360000000000001e-11 5.760000000000000e-11 2.010000000000000e-11 -9.730000000000000e-12 4.250000000000000e-11 4.440000000000000e-12 -1.640000000000000e-11 5.600000000000000e-11 -1.860000000000000e-11 3.440000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.550000000000000e+02 4.843615124337166e-01 -7.674543852353175e-01 -2.295909249923590e-01 -3.517039934620539e-01 9.370000000000000e-11 5.760000000000000e-11 2.010000000000000e-11 -9.720000000000000e-12 4.250000000000000e-11 4.440000000000000e-12 -1.640000000000000e-11 5.600000000000000e-11 -1.860000000000000e-11 3.440000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.560000000000000e+02 4.843590262293071e-01 -7.674687532716122e-01 -2.295612925642899e-01 -3.516954071609794e-01 9.370000000000000e-11 5.760000000000000e-11 2.010000000000000e-11 -9.720000000000000e-12 4.250000000000000e-11 4.430000000000000e-12 -1.640000000000000e-11 5.600000000000000e-11 -1.860000000000000e-11 3.440000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.570000000000000e+02 4.843565295051969e-01 -7.674831298308756e-01 -2.295316563209205e-01 -3.516868159275521e-01 9.370000000000000e-11 5.760000000000000e-11 2.010000000000000e-11 -9.710000000000000e-12 4.250000000000000e-11 4.430000000000000e-12 -1.640000000000000e-11 5.610000000000000e-11 -1.860000000000000e-11 3.450000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.580000000000000e+02 4.843540240372128e-01 -7.674975131058726e-01 -2.295020167526673e-01 -3.516782209374338e-01 9.370000000000000e-11 5.760000000000000e-11 2.010000000000000e-11 -9.710000000000000e-12 4.250000000000000e-11 4.430000000000000e-12 -1.640000000000000e-11 5.610000000000000e-11 -1.860000000000000e-11 3.450000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.590000000000000e+02 4.843515142732534e-01 -7.675118990796277e-01 -2.294723745588141e-01 -3.516696243731169e-01 9.370000000000000e-11 5.760000000000000e-11 2.010000000000000e-11 -9.710000000000000e-12 4.250000000000000e-11 4.430000000000000e-12 -1.640000000000000e-11 5.610000000000000e-11 -1.860000000000000e-11 3.450000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.600000000000000e+02 4.843490046788935e-01 -7.675262847247477e-01 -2.294427290552389e-01 -3.516610271367513e-01 9.370000000000000e-11 5.760000000000000e-11 2.010000000000000e-11 -9.710000000000000e-12 4.250000000000000e-11 4.430000000000000e-12 -1.640000000000000e-11 5.610000000000000e-11 -1.860000000000000e-11 3.450000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.610000000000000e+02 4.843464789876236e-01 -7.675406808257580e-01 -2.294130894994670e-01 -3.516524220535570e-01 9.370000000000000e-11 5.760000000000000e-11 2.010000000000000e-11 -9.699999999999999e-12 4.250000000000000e-11 4.430000000000000e-12 -1.640000000000000e-11 5.610000000000000e-11 -1.860000000000000e-11 3.450000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.620000000000000e+02 4.843439737498525e-01 -7.675550651763338e-01 -2.293834344738523e-01 -3.516438212216108e-01 9.370000000000000e-11 5.760000000000000e-11 2.010000000000000e-11 -9.699999999999999e-12 4.250000000000000e-11 4.430000000000000e-12 -1.640000000000000e-11 5.610000000000000e-11 -1.860000000000000e-11 3.450000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.630000000000000e+02 4.843414692251010e-01 -7.675694494794044e-01 -2.293537754776047e-01 -3.516352187835043e-01 9.370000000000000e-11 5.760000000000000e-11 2.010000000000000e-11 -9.689999999999999e-12 4.250000000000000e-11 4.430000000000000e-12 -1.640000000000000e-11 5.610000000000000e-11 -1.860000000000000e-11 3.450000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.640000000000000e+02 4.843389637010707e-01 -7.675838341373667e-01 -2.293241139589914e-01 -3.516266152737529e-01 9.370000000000000e-11 5.760000000000000e-11 2.010000000000000e-11 -9.689999999999999e-12 4.250000000000000e-11 4.430000000000000e-12 -1.640000000000000e-11 5.610000000000000e-11 -1.860000000000000e-11 3.450000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.650000000000000e+02 4.843364535070772e-01 -7.675982209667834e-01 -2.292944517293704e-01 -3.516180106009124e-01 9.380000000000000e-11 5.760000000000000e-11 2.010000000000000e-11 -9.689999999999999e-12 4.250000000000000e-11 4.420000000000000e-12 -1.640000000000000e-11 5.610000000000000e-11 -1.860000000000000e-11 3.450000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.660000000000000e+02 4.843339331648757e-01 -7.676126131354197e-01 -2.292647907812920e-01 -3.516094040956024e-01 9.380000000000000e-11 5.760000000000000e-11 2.010000000000000e-11 -9.689999999999999e-12 4.250000000000000e-11 4.420000000000000e-12 -1.640000000000000e-11 5.620000000000000e-11 -1.860000000000000e-11 3.450000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.670000000000000e+02 4.843313991375580e-01 -7.676270128757711e-01 -2.292351323928415e-01 -3.516007949219014e-01 9.380000000000000e-11 5.760000000000000e-11 2.010000000000000e-11 -9.680000000000001e-12 4.250000000000000e-11 4.420000000000000e-12 -1.640000000000000e-11 5.620000000000000e-11 -1.860000000000000e-11 3.460000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.680000000000000e+02 4.843288520953675e-01 -7.676414197385366e-01 -2.292054767915844e-01 -3.515921829883735e-01 9.380000000000000e-11 5.760000000000000e-11 2.010000000000000e-11 -9.680000000000001e-12 4.250000000000000e-11 4.420000000000000e-12 -1.640000000000000e-11 5.620000000000000e-11 -1.860000000000000e-11 3.460000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.690000000000000e+02 4.843262945668575e-01 -7.676558320625079e-01 -2.291758238294800e-01 -3.515835685347589e-01 9.380000000000000e-11 5.760000000000000e-11 2.010000000000000e-11 -9.680000000000001e-12 4.250000000000000e-11 4.420000000000000e-12 -1.640000000000000e-11 5.620000000000000e-11 -1.860000000000000e-11 3.460000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.700000000000000e+02 4.843237288029401e-01 -7.676702487463378e-01 -2.291461730966471e-01 -3.515749511317800e-01 9.380000000000000e-11 5.760000000000000e-11 2.010000000000000e-11 -9.670000000000001e-12 4.250000000000000e-11 4.420000000000000e-12 -1.640000000000000e-11 5.620000000000000e-11 -1.860000000000000e-11 3.460000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.710000000000000e+02 4.843211987164968e-01 -7.676846429932289e-01 -2.291164997380503e-01 -3.515663449961590e-01 9.380000000000000e-11 5.760000000000000e-11 2.010000000000000e-11 -9.670000000000001e-12 4.250000000000000e-11 4.420000000000000e-12 -1.640000000000000e-11 5.620000000000000e-11 -1.860000000000000e-11 3.460000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.720000000000000e+02 4.843186260211713e-01 -7.676990628391128e-01 -2.290868493191393e-01 -3.515577233882690e-01 9.380000000000000e-11 5.760000000000000e-11 2.010000000000000e-11 -9.660000000000000e-12 4.250000000000000e-11 4.410000000000000e-12 -1.640000000000000e-11 5.620000000000000e-11 -1.860000000000000e-11 3.460000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.730000000000000e+02 4.843160541755357e-01 -7.677134807303240e-01 -2.290571983365756e-01 -3.515491019231434e-01 9.380000000000000e-11 5.760000000000000e-11 2.010000000000000e-11 -9.660000000000000e-12 4.250000000000000e-11 4.410000000000000e-12 -1.640000000000000e-11 5.630000000000000e-11 -1.860000000000000e-11 3.460000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.740000000000000e+02 4.843134831815727e-01 -7.677278965521027e-01 -2.290275472867265e-01 -3.515404805254193e-01 9.380000000000000e-11 5.760000000000000e-11 2.010000000000000e-11 -9.660000000000000e-12 4.250000000000000e-11 4.410000000000000e-12 -1.640000000000000e-11 5.630000000000000e-11 -1.860000000000000e-11 3.460000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.750000000000000e+02 4.843109113412739e-01 -7.677423119038881e-01 -2.289978956217577e-01 -3.515318583984455e-01 9.389999999999999e-11 5.760000000000000e-11 2.010000000000000e-11 -9.660000000000000e-12 4.250000000000000e-11 4.410000000000000e-12 -1.640000000000000e-11 5.630000000000000e-11 -1.860000000000000e-11 3.460000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.760000000000000e+02 4.843083363414946e-01 -7.677567286189924e-01 -2.289682419916771e-01 -3.515232356041879e-01 9.389999999999999e-11 5.760000000000000e-11 2.010000000000000e-11 -9.650000000000000e-12 4.250000000000000e-11 4.410000000000000e-12 -1.640000000000000e-11 5.630000000000000e-11 -1.860000000000000e-11 3.460000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.770000000000000e+02 4.843057563474100e-01 -7.677711476746452e-01 -2.289385854880008e-01 -3.515146131270715e-01 9.389999999999999e-11 5.760000000000000e-11 2.010000000000000e-11 -9.650000000000000e-12 4.260000000000000e-11 4.410000000000000e-12 -1.640000000000000e-11 5.630000000000000e-11 -1.860000000000000e-11 3.470000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.780000000000000e+02 4.843031708403378e-01 -7.677855691568465e-01 -2.289089262445134e-01 -3.515059914056599e-01 9.389999999999999e-11 5.760000000000000e-11 2.010000000000000e-11 -9.650000000000000e-12 4.260000000000000e-11 4.410000000000000e-12 -1.640000000000000e-11 5.630000000000000e-11 -1.860000000000000e-11 3.470000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.790000000000000e+02 4.843005804005238e-01 -7.677999928301515e-01 -2.288792649705418e-01 -3.514973696918366e-01 9.389999999999999e-11 5.760000000000000e-11 2.010000000000000e-11 -9.640000000000000e-12 4.260000000000000e-11 4.410000000000000e-12 -1.640000000000000e-11 5.630000000000000e-11 -1.860000000000000e-11 3.470000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.800000000000000e+02 4.842979858441630e-01 -7.678144186825752e-01 -2.288496021078479e-01 -3.514887465986725e-01 9.389999999999999e-11 5.770000000000000e-11 2.010000000000000e-11 -9.640000000000000e-12 4.260000000000000e-11 4.410000000000000e-12 -1.640000000000000e-11 5.630000000000000e-11 -1.860000000000000e-11 3.470000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.810000000000000e+02 4.842954056478098e-01 -7.678288360611453e-01 -2.288199271218092e-01 -3.514801267972064e-01 9.389999999999999e-11 5.770000000000000e-11 2.010000000000000e-11 -9.640000000000000e-12 4.260000000000000e-11 4.410000000000000e-12 -1.640000000000000e-11 5.630000000000000e-11 -1.860000000000000e-11 3.470000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.820000000000000e+02 4.842928058508733e-01 -7.678432664294088e-01 -2.287902594541478e-01 -3.514714975343065e-01 9.389999999999999e-11 5.770000000000000e-11 2.010000000000000e-11 -9.630000000000000e-12 4.260000000000000e-11 4.400000000000000e-12 -1.640000000000000e-11 5.640000000000000e-11 -1.860000000000000e-11 3.470000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.830000000000000e+02 4.842902044204052e-01 -7.678576981390971e-01 -2.287605896951962e-01 -3.514628656249133e-01 9.389999999999999e-11 5.770000000000000e-11 2.010000000000000e-11 -9.630000000000000e-12 4.260000000000000e-11 4.400000000000000e-12 -1.640000000000000e-11 5.640000000000000e-11 -1.860000000000000e-11 3.470000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.840000000000000e+02 4.842876008238017e-01 -7.678721302614380e-01 -2.287309195232062e-01 -3.514542327389954e-01 9.400000000000000e-11 5.770000000000000e-11 2.010000000000000e-11 -9.630000000000000e-12 4.260000000000000e-11 4.400000000000000e-12 -1.640000000000000e-11 5.640000000000000e-11 -1.860000000000000e-11 3.470000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.850000000000000e+02 4.842849940418404e-01 -7.678865623036856e-01 -2.287012505797542e-01 -3.514456002891189e-01 9.400000000000000e-11 5.770000000000000e-11 2.010000000000000e-11 -9.620000000000000e-12 4.260000000000000e-11 4.400000000000000e-12 -1.640000000000000e-11 5.640000000000000e-11 -1.860000000000000e-11 3.470000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.860000000000000e+02 4.842823827847882e-01 -7.679009943768197e-01 -2.286715842438212e-01 -3.514369689130619e-01 9.400000000000000e-11 5.770000000000000e-11 2.010000000000000e-11 -9.620000000000000e-12 4.260000000000000e-11 4.400000000000000e-12 -1.640000000000000e-11 5.640000000000000e-11 -1.860000000000000e-11 3.470000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.870000000000000e+02 4.842797664904545e-01 -7.679154267572355e-01 -2.286419214552626e-01 -3.514283381707423e-01 9.400000000000000e-11 5.770000000000000e-11 2.010000000000000e-11 -9.610000000000000e-12 4.260000000000000e-11 4.390000000000000e-12 -1.640000000000000e-11 5.640000000000000e-11 -1.860000000000000e-11 3.480000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.880000000000000e+02 4.842771463256574e-01 -7.679298593021415e-01 -2.286122623720261e-01 -3.514197066642890e-01 9.400000000000000e-11 5.770000000000000e-11 2.010000000000000e-11 -9.610000000000000e-12 4.260000000000000e-11 4.390000000000000e-12 -1.640000000000000e-11 5.640000000000000e-11 -1.860000000000000e-11 3.480000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.890000000000000e+02 4.842745238870679e-01 -7.679442916644972e-01 -2.285826062731288e-01 -3.514110734215006e-01 9.400000000000000e-11 5.770000000000000e-11 2.010000000000000e-11 -9.610000000000000e-12 4.260000000000000e-11 4.390000000000000e-12 -1.640000000000000e-11 5.640000000000000e-11 -1.860000000000000e-11 3.480000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.900000000000000e+02 4.842719000590915e-01 -7.679587239371114e-01 -2.285529515618312e-01 -3.514024380598632e-01 9.400000000000000e-11 5.770000000000000e-11 2.010000000000000e-11 -9.610000000000000e-12 4.260000000000000e-11 4.390000000000000e-12 -1.640000000000000e-11 5.650000000000000e-11 -1.860000000000000e-11 3.480000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.910000000000000e+02 4.842692941837205e-01 -7.679731453619445e-01 -2.285232857171366e-01 -3.513938055781964e-01 9.400000000000000e-11 5.770000000000000e-11 2.010000000000000e-11 -9.599999999999999e-12 4.260000000000000e-11 4.390000000000000e-12 -1.640000000000000e-11 5.650000000000000e-11 -1.860000000000000e-11 3.480000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.920000000000000e+02 4.842666727373876e-01 -7.679875778327977e-01 -2.284936278598300e-01 -3.513851618919415e-01 9.400000000000000e-11 5.770000000000000e-11 2.010000000000000e-11 -9.599999999999999e-12 4.260000000000000e-11 4.390000000000000e-12 -1.640000000000000e-11 5.650000000000000e-11 -1.860000000000000e-11 3.480000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.930000000000000e+02 4.842640549100003e-01 -7.680020092926534e-01 -2.284639684347022e-01 -3.513765131189600e-01 9.410000000000000e-11 5.770000000000000e-11 2.010000000000000e-11 -9.589999999999999e-12 4.260000000000000e-11 4.390000000000000e-12 -1.640000000000000e-11 5.650000000000000e-11 -1.860000000000000e-11 3.480000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.940000000000000e+02 4.842614399874832e-01 -7.680164387734765e-01 -2.284343092800544e-01 -3.513678611636251e-01 9.410000000000000e-11 5.770000000000000e-11 2.010000000000000e-11 -9.589999999999999e-12 4.260000000000000e-11 4.390000000000000e-12 -1.650000000000000e-11 5.650000000000000e-11 -1.860000000000000e-11 3.480000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.950000000000000e+02 4.842588262943728e-01 -7.680308658886591e-01 -2.284046513336557e-01 -3.513592085707512e-01 9.410000000000000e-11 5.770000000000000e-11 2.010000000000000e-11 -9.589999999999999e-12 4.260000000000000e-11 4.390000000000000e-12 -1.650000000000000e-11 5.650000000000000e-11 -1.860000000000000e-11 3.480000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.960000000000000e+02 4.842562121504419e-01 -7.680452908134785e-01 -2.283749941036030e-01 -3.513505575933028e-01 9.410000000000000e-11 5.770000000000000e-11 2.010000000000000e-11 -9.589999999999999e-12 4.260000000000000e-11 4.380000000000000e-12 -1.650000000000000e-11 5.650000000000000e-11 -1.860000000000000e-11 3.480000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.970000000000000e+02 4.842535965843321e-01 -7.680597138784045e-01 -2.283453365834558e-01 -3.513419095023402e-01 9.410000000000000e-11 5.770000000000000e-11 2.010000000000000e-11 -9.580000000000001e-12 4.260000000000000e-11 4.380000000000000e-12 -1.650000000000000e-11 5.660000000000000e-11 -1.860000000000000e-11 3.490000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.980000000000000e+02 4.842509793893000e-01 -7.680741354831918e-01 -2.283156788529103e-01 -3.513332636574374e-01 9.410000000000000e-11 5.770000000000000e-11 2.010000000000000e-11 -9.580000000000001e-12 4.260000000000000e-11 4.380000000000000e-12 -1.650000000000000e-11 5.660000000000000e-11 -1.860000000000000e-11 3.490000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.990000000000000e+02 4.842483606472749e-01 -7.680885561361531e-01 -2.282860228986595e-01 -3.513246175436885e-01 9.410000000000000e-11 5.770000000000000e-11 2.010000000000000e-11 -9.570000000000001e-12 4.260000000000000e-11 4.380000000000000e-12 -1.650000000000000e-11 5.660000000000000e-11 -1.860000000000000e-11 3.490000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.000000000000000e+02 4.842457421216562e-01 -7.681029753344590e-01 -2.282563714855197e-01 -3.513159680339941e-01 9.410000000000000e-11 5.770000000000000e-11 2.010000000000000e-11 -9.570000000000001e-12 4.260000000000000e-11 4.380000000000000e-12 -1.650000000000000e-11 5.660000000000000e-11 -1.860000000000000e-11 3.490000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.010000000000000e+02 4.842431593491621e-01 -7.681173718491393e-01 -2.282267083249944e-01 -3.513073231434990e-01 9.410000000000000e-11 5.770000000000000e-11 2.010000000000000e-11 -9.570000000000001e-12 4.260000000000000e-11 4.380000000000000e-12 -1.650000000000000e-11 5.660000000000000e-11 -1.860000000000000e-11 3.490000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.020000000000000e+02 4.842405577636152e-01 -7.681317801686584e-01 -2.281970663432221e-01 -3.512986612898741e-01 9.420000000000000e-11 5.780000000000000e-11 2.010000000000000e-11 -9.560000000000000e-12 4.260000000000000e-11 4.370000000000000e-12 -1.650000000000000e-11 5.660000000000000e-11 -1.860000000000000e-11 3.490000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.030000000000000e+02 4.842379676864614e-01 -7.681461816635355e-01 -2.281674256892234e-01 -3.512899943080773e-01 9.420000000000000e-11 5.780000000000000e-11 2.010000000000000e-11 -9.560000000000000e-12 4.260000000000000e-11 4.370000000000000e-12 -1.650000000000000e-11 5.660000000000000e-11 -1.860000000000000e-11 3.490000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.040000000000000e+02 4.842353847672952e-01 -7.681605786294493e-01 -2.281377846699550e-01 -3.512813242756075e-01 9.420000000000000e-11 5.780000000000000e-11 2.010000000000000e-11 -9.560000000000000e-12 4.270000000000000e-11 4.370000000000000e-12 -1.650000000000000e-11 5.660000000000000e-11 -1.860000000000000e-11 3.490000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.050000000000000e+02 4.842328052485576e-01 -7.681749728958247e-01 -2.281081426442317e-01 -3.512726527884151e-01 9.420000000000000e-11 5.780000000000000e-11 2.010000000000000e-11 -9.550000000000000e-12 4.270000000000000e-11 4.370000000000000e-12 -1.650000000000000e-11 5.670000000000000e-11 -1.860000000000000e-11 3.500000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.060000000000000e+02 4.842302277284213e-01 -7.681893644556823e-01 -2.280784999849420e-01 -3.512639815521584e-01 9.420000000000000e-11 5.780000000000000e-11 2.010000000000000e-11 -9.550000000000000e-12 4.270000000000000e-11 4.370000000000000e-12 -1.650000000000000e-11 5.670000000000000e-11 -1.860000000000000e-11 3.500000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.070000000000000e+02 4.842276517728808e-01 -7.682037524454572e-01 -2.280488575228083e-01 -3.512553125146753e-01 9.420000000000000e-11 5.780000000000000e-11 2.010000000000000e-11 -9.540000000000000e-12 4.270000000000000e-11 4.360000000000000e-12 -1.650000000000000e-11 5.670000000000000e-11 -1.860000000000000e-11 3.500000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.080000000000000e+02 4.842250770350037e-01 -7.682181367824236e-01 -2.280192153376706e-01 -3.512466462840311e-01 9.420000000000000e-11 5.780000000000000e-11 2.010000000000000e-11 -9.540000000000000e-12 4.270000000000000e-11 4.360000000000000e-12 -1.650000000000000e-11 5.670000000000000e-11 -1.860000000000000e-11 3.500000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.090000000000000e+02 4.842225035681174e-01 -7.682325183610075e-01 -2.279895724719898e-01 -3.512379814527015e-01 9.420000000000000e-11 5.780000000000000e-11 2.010000000000000e-11 -9.540000000000000e-12 4.270000000000000e-11 4.360000000000000e-12 -1.650000000000000e-11 5.670000000000000e-11 -1.860000000000000e-11 3.500000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.100000000000000e+02 4.842199325616748e-01 -7.682468976811534e-01 -2.279599275651106e-01 -3.512293161707321e-01 9.420000000000000e-11 5.780000000000000e-11 2.010000000000000e-11 -9.540000000000000e-12 4.270000000000000e-11 4.360000000000000e-12 -1.650000000000000e-11 5.670000000000000e-11 -1.860000000000000e-11 3.500000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.110000000000000e+02 4.842173731172772e-01 -7.682612700596220e-01 -2.279302754118278e-01 -3.512206515119356e-01 9.430000000000000e-11 5.780000000000000e-11 2.010000000000000e-11 -9.530000000000000e-12 4.270000000000000e-11 4.360000000000000e-12 -1.650000000000000e-11 5.670000000000000e-11 -1.860000000000000e-11 3.500000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.120000000000000e+02 4.842148156311074e-01 -7.682756420915774e-01 -2.279006216612509e-01 -3.512119826237752e-01 9.430000000000000e-11 5.780000000000000e-11 2.010000000000000e-11 -9.530000000000000e-12 4.270000000000000e-11 4.350000000000000e-12 -1.650000000000000e-11 5.680000000000000e-11 -1.860000000000000e-11 3.510000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.130000000000000e+02 4.842122660066995e-01 -7.682900101874184e-01 -2.278709627578039e-01 -3.512033115258245e-01 9.430000000000000e-11 5.780000000000000e-11 2.010000000000000e-11 -9.520000000000000e-12 4.270000000000000e-11 4.350000000000000e-12 -1.650000000000000e-11 5.680000000000000e-11 -1.860000000000000e-11 3.510000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.140000000000000e+02 4.842097213557934e-01 -7.683043755317918e-01 -2.278413000184055e-01 -3.511946387534571e-01 9.430000000000000e-11 5.780000000000000e-11 2.010000000000000e-11 -9.520000000000000e-12 4.270000000000000e-11 4.350000000000000e-12 -1.650000000000000e-11 5.680000000000000e-11 -1.860000000000000e-11 3.510000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.150000000000000e+02 4.842071786874672e-01 -7.683187396498876e-01 -2.278116338462612e-01 -3.511859648314955e-01 9.430000000000000e-11 5.780000000000000e-11 2.010000000000000e-11 -9.520000000000000e-12 4.270000000000000e-11 4.350000000000000e-12 -1.650000000000000e-11 5.680000000000000e-11 -1.860000000000000e-11 3.510000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.160000000000000e+02 4.842046362378673e-01 -7.683331045210642e-01 -2.277819624300896e-01 -3.511772890354318e-01 9.430000000000000e-11 5.780000000000000e-11 2.010000000000000e-11 -9.520000000000000e-12 4.270000000000000e-11 4.350000000000000e-12 -1.650000000000000e-11 5.680000000000000e-11 -1.860000000000000e-11 3.510000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.170000000000000e+02 4.842020936413085e-01 -7.683474714969846e-01 -2.277522840798710e-01 -3.511686100065975e-01 9.430000000000000e-11 5.780000000000000e-11 2.010000000000000e-11 -9.510000000000000e-12 4.270000000000000e-11 4.350000000000000e-12 -1.650000000000000e-11 5.680000000000000e-11 -1.860000000000000e-11 3.510000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.180000000000000e+02 4.841989012794047e-01 -7.683623925044927e-01 -2.277221387519754e-01 -3.511599141513955e-01 9.440000000000000e-11 5.780000000000000e-11 2.010000000000000e-11 -9.510000000000000e-12 4.270000000000000e-11 4.340000000000000e-12 -1.650000000000000e-11 5.680000000000000e-11 -1.860000000000000e-11 3.510000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.190000000000000e+02 4.841962579925641e-01 -7.683768295027019e-01 -2.276924350836147e-01 -3.511512304336523e-01 9.440000000000000e-11 5.780000000000000e-11 2.010000000000000e-11 -9.500000000000000e-12 4.270000000000000e-11 4.340000000000000e-12 -1.650000000000000e-11 5.690000000000000e-11 -1.860000000000000e-11 3.510000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.200000000000000e+02 4.841936128449964e-01 -7.683912672582744e-01 -2.276627299317553e-01 -3.511425452453085e-01 9.440000000000000e-11 5.780000000000000e-11 2.010000000000000e-11 -9.500000000000000e-12 4.270000000000000e-11 4.340000000000000e-12 -1.650000000000000e-11 5.690000000000000e-11 -1.860000000000000e-11 3.510000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.210000000000000e+02 4.841909636110731e-01 -7.684057071581269e-01 -2.276330245741538e-01 -3.511338577913303e-01 9.440000000000000e-11 5.780000000000000e-11 2.010000000000000e-11 -9.500000000000000e-12 4.270000000000000e-11 4.340000000000000e-12 -1.650000000000000e-11 5.690000000000000e-11 -1.860000000000000e-11 3.510000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.220000000000000e+02 4.841883144084551e-01 -7.684201466431494e-01 -2.276033166451469e-01 -3.511251695269776e-01 9.440000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.489999999999999e-12 4.270000000000000e-11 4.340000000000000e-12 -1.650000000000000e-11 5.690000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.230000000000000e+02 4.841856634259413e-01 -7.684345868424198e-01 -2.275736071844148e-01 -3.511164798043157e-01 9.440000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.489999999999999e-12 4.270000000000000e-11 4.340000000000000e-12 -1.650000000000000e-11 5.690000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.240000000000000e+02 4.841830105713883e-01 -7.684490278065200e-01 -2.275438962474216e-01 -3.511077886031357e-01 9.440000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.480000000000001e-12 4.270000000000000e-11 4.330000000000000e-12 -1.650000000000000e-11 5.690000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.250000000000000e+02 4.841803558223461e-01 -7.684634695543152e-01 -2.275141838454331e-01 -3.510990959051830e-01 9.440000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.480000000000001e-12 4.270000000000000e-11 4.330000000000000e-12 -1.650000000000000e-11 5.690000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.260000000000000e+02 4.841776990967810e-01 -7.684779121324362e-01 -2.274844700275241e-01 -3.510904016891028e-01 9.440000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.480000000000001e-12 4.270000000000000e-11 4.330000000000000e-12 -1.650000000000000e-11 5.690000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.270000000000000e+02 4.841750404965479e-01 -7.684923554790002e-01 -2.274547547347684e-01 -3.510817059874389e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.280000000000000e+02 4.841723799932371e-01 -7.685067996127267e-01 -2.274250379832442e-01 -3.510730087873584e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.290000000000000e+02 4.841697175277385e-01 -7.685212445647865e-01 -2.273953198092951e-01 -3.510643100779826e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.300000000000000e+02 4.841670531642376e-01 -7.685356903017163e-01 -2.273656001738422e-01 -3.510556098687376e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.310000000000000e+02 4.841643869277018e-01 -7.685501368079273e-01 -2.273358790626801e-01 -3.510469081678941e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.320000000000000e+02 4.841617187190407e-01 -7.685645841393330e-01 -2.273061565351928e-01 -3.510382049506251e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.330000000000000e+02 4.841590486476237e-01 -7.685790322307232e-01 -2.272764325275380e-01 -3.510295002495778e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.340000000000000e+02 4.841563765930866e-01 -7.685934811562924e-01 -2.272467071095340e-01 -3.510207940224894e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.350000000000000e+02 4.841537026783030e-01 -7.686079308385838e-01 -2.272169802110171e-01 -3.510120863142842e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.360000000000000e+02 4.841510268554201e-01 -7.686223813096293e-01 -2.271872518588235e-01 -3.510033771028318e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.370000000000000e+02 4.841483490628132e-01 -7.686368326047206e-01 -2.271575220898566e-01 -3.509946663713445e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.380000000000000e+02 4.841456694064561e-01 -7.686512846619662e-01 -2.271277908418400e-01 -3.509859541488654e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.390000000000000e+02 4.841429878507056e-01 -7.686657374981757e-01 -2.270980581373280e-01 -3.509772404325272e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.400000000000000e+02 4.841403043262838e-01 -7.686801911597699e-01 -2.270683240153565e-01 -3.509685251903515e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.410000000000000e+02 4.841376189167941e-01 -7.686946455974204e-01 -2.270385884269876e-01 -3.509598084460879e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.420000000000000e+02 4.841349316378609e-01 -7.687091007898181e-01 -2.270088513675119e-01 -3.509510902272791e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.430000000000000e+02 4.841322423682111e-01 -7.687235568257913e-01 -2.269791129022938e-01 -3.509423704637558e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.440000000000000e+02 4.841295512258181e-01 -7.687380136232349e-01 -2.269493729666850e-01 -3.509336492138074e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.450000000000000e+02 4.841268581987408e-01 -7.687524711906796e-01 -2.269196315672916e-01 -3.509249264703270e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.460000000000000e+02 4.841241632095868e-01 -7.687669295757410e-01 -2.268898887492244e-01 -3.509162022059826e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.470000000000000e+02 4.841214663553379e-01 -7.687813887246847e-01 -2.268601444543313e-01 -3.509074764416720e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.480000000000000e+02 4.841187675363838e-01 -7.687958486924955e-01 -2.268303987428398e-01 -3.508987491547993e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.490000000000000e+02 4.841160668439740e-01 -7.688103094212696e-01 -2.268006515627392e-01 -3.508900203793343e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.500000000000000e+02 4.841133642634248e-01 -7.688247709237908e-01 -2.267709029213060e-01 -3.508812901022008e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.510000000000000e+02 4.841106597103946e-01 -7.688392332507048e-01 -2.267411528681419e-01 -3.508725582961155e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.520000000000000e+02 4.841079532821788e-01 -7.688536963416390e-01 -2.267114013472755e-01 -3.508638249946742e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.530000000000000e+02 4.841052449756287e-01 -7.688681601996810e-01 -2.266816483602434e-01 -3.508550901938396e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.540000000000000e+02 4.841025346991366e-01 -7.688826248761480e-01 -2.266518939622277e-01 -3.508463538712800e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.550000000000000e+02 4.840998225304518e-01 -7.688970903291500e-01 -2.266221381062377e-01 -3.508376160412526e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.560000000000000e+02 4.840971084989388e-01 -7.689115565390907e-01 -2.265923807759543e-01 -3.508288767161055e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.570000000000000e+02 4.840943925020358e-01 -7.689260235666268e-01 -2.265626220319836e-01 -3.508201358646519e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.580000000000000e+02 4.840916746416696e-01 -7.689404913498384e-01 -2.265328618150942e-01 -3.508113935195903e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.590000000000000e+02 4.840889548152225e-01 -7.689549599519736e-01 -2.265031001850189e-01 -3.508026496446963e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.600000000000000e+02 4.840862331256773e-01 -7.689694293091273e-01 -2.264733370824602e-01 -3.507939042756044e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.610000000000000e+02 4.840835095436813e-01 -7.689838994393373e-01 -2.264435725245505e-01 -3.507851574015964e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.620000000000000e+02 4.840807839940403e-01 -7.689983703888742e-01 -2.264138065552000e-01 -3.507764089960379e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.630000000000000e+02 4.840780565851703e-01 -7.690128420904647e-01 -2.263840391119546e-01 -3.507676590964845e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.640000000000000e+02 4.840753272773387e-01 -7.690273145685752e-01 -2.263542702179497e-01 -3.507589076885754e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.650000000000000e+02 4.840725960122480e-01 -7.690417878602932e-01 -2.263244999068864e-01 -3.507501547490817e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.660000000000000e+02 4.840698628660399e-01 -7.690562619157743e-01 -2.262947281358609e-01 -3.507414003092680e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.670000000000000e+02 4.840671278580024e-01 -7.690707367242112e-01 -2.262649548934451e-01 -3.507326443729620e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.680000000000000e+02 4.840643908596888e-01 -7.690852123623100e-01 -2.262351802552699e-01 -3.507238868998303e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.690000000000000e+02 4.840616520118912e-01 -7.690996887503930e-01 -2.262054041373855e-01 -3.507151279238027e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.700000000000000e+02 4.840589112692394e-01 -7.691141659074886e-01 -2.261756265694034e-01 -3.507063674460510e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.710000000000000e+02 4.840561685641935e-01 -7.691286438802419e-01 -2.261458475890141e-01 -3.506976054325716e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.720000000000000e+02 4.840534240285491e-01 -7.691431225843830e-01 -2.261160671210111e-01 -3.506888419341415e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.730000000000000e+02 4.840506775098291e-01 -7.691576021166150e-01 -2.260862852531231e-01 -3.506800768919418e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.740000000000000e+02 4.840479291206418e-01 -7.691720824057747e-01 -2.260565019208675e-01 -3.506713103475719e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.750000000000000e+02 4.840451788823169e-01 -7.691865634397874e-01 -2.260267171116266e-01 -3.506625423055854e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.760000000000000e+02 4.840424266431633e-01 -7.692010453084964e-01 -2.259969309149893e-01 -3.506537727199295e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.770000000000000e+02 4.840396725368122e-01 -7.692155279366431e-01 -2.259671432510928e-01 -3.506450016220783e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.780000000000000e+02 4.840369165782474e-01 -7.692300113045997e-01 -2.259373541151039e-01 -3.506362290368962e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.790000000000000e+02 4.840341586471849e-01 -7.692444954929661e-01 -2.259075635748032e-01 -3.506274549093097e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.800000000000000e+02 4.840313988266907e-01 -7.692589804488724e-01 -2.258777715827679e-01 -3.506186792705736e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.810000000000000e+02 4.840286371533685e-01 -7.692734661507793e-01 -2.258479781175360e-01 -3.506099021306152e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.820000000000000e+02 4.840258735103626e-01 -7.692879526656863e-01 -2.258181832490402e-01 -3.506011234580834e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.830000000000000e+02 4.840231080271140e-01 -7.693024399171420e-01 -2.257883869010724e-01 -3.505923432904896e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.840000000000000e+02 4.840203405716829e-01 -7.693169279929752e-01 -2.257585891481934e-01 -3.505835615686233e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.850000000000000e+02 4.840175712629861e-01 -7.693314168078926e-01 -2.257287899258596e-01 -3.505747783564132e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.860000000000000e+02 4.840148000663512e-01 -7.693459063896152e-01 -2.256989892520374e-01 -3.505659936287036e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.870000000000000e+02 4.840120268993290e-01 -7.693603967863861e-01 -2.256691871758565e-01 -3.505572073612038e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.880000000000000e+02 4.840092518975652e-01 -7.693748879178475e-01 -2.256393836175777e-01 -3.505484195936969e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.890000000000000e+02 4.840064749976207e-01 -7.693893798193427e-01 -2.256095786154913e-01 -3.505396303109331e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.900000000000000e+02 4.840036961392329e-01 -7.694038725291960e-01 -2.255797722045181e-01 -3.505308394889037e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.910000000000000e+02 4.840009154139563e-01 -7.694183659918149e-01 -2.255499643313534e-01 -3.505220471568987e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.920000000000000e+02 4.839981328180040e-01 -7.694328602043073e-01 -2.255201550001979e-01 -3.505132533231685e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.930000000000000e+02 4.839953482779278e-01 -7.694473552208201e-01 -2.254903442508768e-01 -3.505044579440233e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.940000000000000e+02 4.839925618288148e-01 -7.694618510118241e-01 -2.254605320659896e-01 -3.504956610464090e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.950000000000000e+02 4.839897735466730e-01 -7.694763475313539e-01 -2.254307184012154e-01 -3.504868626541652e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.960000000000000e+02 4.839869832878921e-01 -7.694908448706648e-01 -2.254009033393360e-01 -3.504780627113885e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.970000000000000e+02 4.839841912042209e-01 -7.695053429343526e-01 -2.253710867929475e-01 -3.504692612735764e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.980000000000000e+02 4.839813971393342e-01 -7.695198418190077e-01 -2.253412688531317e-01 -3.504604582853366e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.990000000000000e+02 4.839786012292424e-01 -7.695343414401996e-01 -2.253114494412314e-01 -3.504516537941796e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.000000000000000e+02 4.839758034407576e-01 -7.695488418183586e-01 -2.252816285766663e-01 -3.504428477879681e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.010000000000000e+02 4.839730036976379e-01 -7.695633430004469e-01 -2.252518063041138e-01 -3.504340402395243e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.020000000000000e+02 4.839702020723978e-01 -7.695778449413839e-01 -2.252219825817145e-01 -3.504252311739838e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.030000000000000e+02 4.839673985996737e-01 -7.695923476208371e-01 -2.251921573891044e-01 -3.504164206006256e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.040000000000000e+02 4.839645931694367e-01 -7.696068511054390e-01 -2.251623307910242e-01 -3.504076084828439e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.050000000000000e+02 4.839617858466670e-01 -7.696213553522273e-01 -2.251325027508873e-01 -3.503987948481382e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.060000000000000e+02 4.839589766796404e-01 -7.696358603349628e-01 -2.251026732395000e-01 -3.503899797055958e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.070000000000000e+02 4.839561655642142e-01 -7.696503661153602e-01 -2.250728423186624e-01 -3.503811630231761e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.080000000000000e+02 4.839533525902710e-01 -7.696648726414400e-01 -2.250430099349469e-01 -3.503723448246054e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.090000000000000e+02 4.839505376614121e-01 -7.696793799675706e-01 -2.250131761465859e-01 -3.503635250855770e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.100000000000000e+02 4.839477208823691e-01 -7.696938880325136e-01 -2.249833408916221e-01 -3.503547038351236e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.110000000000000e+02 4.839449022304880e-01 -7.697083968489004e-01 -2.249535041838381e-01 -3.503458810673119e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.120000000000000e+02 4.839420816182139e-01 -7.697229064707181e-01 -2.249236660745245e-01 -3.503370567509181e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.130000000000000e+02 4.839392591445029e-01 -7.697374168364822e-01 -2.248938265064303e-01 -3.503282309204682e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.140000000000000e+02 4.839364348220879e-01 -7.697519279368860e-01 -2.248639854727998e-01 -3.503194035825344e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.150000000000000e+02 4.839336085239557e-01 -7.697664398542058e-01 -2.248341430464753e-01 -3.503105746844095e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.160000000000000e+02 4.839307803626753e-01 -7.697809525134175e-01 -2.248042991641135e-01 -3.503017442754741e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.170000000000000e+02 4.839279503457443e-01 -7.697954659135560e-01 -2.247744538201706e-01 -3.502929123504245e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.180000000000000e+02 4.839251183754984e-01 -7.698099801174312e-01 -2.247446070709231e-01 -3.502840788694185e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.190000000000000e+02 4.839222845302391e-01 -7.698244950674399e-01 -2.247147588742790e-01 -3.502752438772552e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.200000000000000e+02 4.839194488411593e-01 -7.698390107491978e-01 -2.246849092104761e-01 -3.502664073745085e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.210000000000000e+02 4.839166111881997e-01 -7.698535272394059e-01 -2.246550581488136e-01 -3.502575693133944e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.220000000000000e+02 4.839137716891673e-01 -7.698680444598347e-01 -2.246252056227718e-01 -3.502487297451375e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.230000000000000e+02 4.839109302655198e-01 -7.698825624627158e-01 -2.245953516770846e-01 -3.502398886341309e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.240000000000000e+02 4.839080869529172e-01 -7.698970812232532e-01 -2.245654962921326e-01 -3.502310459975699e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.250000000000000e+02 4.839052417931074e-01 -7.699116007192403e-01 -2.245356394424685e-01 -3.502222018422779e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.260000000000000e+02 4.839023946828308e-01 -7.699261210093264e-01 -2.245057811904017e-01 -3.502133561414262e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.270000000000000e+02 4.838995456909215e-01 -7.699406420557819e-01 -2.244759214942880e-01 -3.502045089089236e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.280000000000000e+02 4.838966948702914e-01 -7.699551638231075e-01 -2.244460603244666e-01 -3.501956601680925e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.290000000000000e+02 4.838938420692483e-01 -7.699696864012676e-01 -2.244161977709605e-01 -3.501868098724173e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.300000000000000e+02 4.838909874237681e-01 -7.699842097147082e-01 -2.243863337517132e-01 -3.501779580520913e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.310000000000000e+02 4.838881309158045e-01 -7.699987337642971e-01 -2.243564682810484e-01 -3.501691047203391e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.320000000000000e+02 4.838852724551317e-01 -7.700132586146150e-01 -2.243266014087106e-01 -3.501602498273361e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.330000000000000e+02 4.838824121685906e-01 -7.700277841818136e-01 -2.242967330628549e-01 -3.501513934275900e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.340000000000000e+02 4.838795499188280e-01 -7.700423105495208e-01 -2.242668633242922e-01 -3.501425354746138e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.350000000000000e+02 4.838766858284877e-01 -7.700568376504400e-01 -2.242369921186836e-01 -3.501336759939102e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.360000000000000e+02 4.838738198610725e-01 -7.700713654956142e-01 -2.242071194715468e-01 -3.501248149946619e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.370000000000000e+02 4.838709519587402e-01 -7.700858941257233e-01 -2.241772454151815e-01 -3.501159524460283e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.380000000000000e+02 4.838680821818581e-01 -7.701004235044575e-01 -2.241473699141993e-01 -3.501070883664781e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.390000000000000e+02 4.838652105639454e-01 -7.701149536096134e-01 -2.241174929497347e-01 -3.500982227699785e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.400000000000000e+02 4.838623369937552e-01 -7.701294845099089e-01 -2.240876145869980e-01 -3.500893556167520e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.410000000000000e+02 4.838594615551297e-01 -7.701440161557430e-01 -2.240577347764733e-01 -3.500804869311031e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.420000000000000e+02 4.838565842622913e-01 -7.701585485330631e-01 -2.240278535118906e-01 -3.500716167276755e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.430000000000000e+02 4.838537050256498e-01 -7.701730816997030e-01 -2.239979708449603e-01 -3.500627449693474e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.440000000000000e+02 4.838508239426471e-01 -7.701876155938019e-01 -2.239680867196036e-01 -3.500538716927949e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.450000000000000e+02 4.838479409779353e-01 -7.702021502409693e-01 -2.239382011552144e-01 -3.500449968774971e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.460000000000000e+02 4.838450560890966e-01 -7.702166856634125e-01 -2.239083141783338e-01 -3.500361205156172e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.470000000000000e+02 4.838421693556301e-01 -7.702312218129957e-01 -2.238784257423054e-01 -3.500272426324050e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.480000000000000e+02 4.838392806820886e-01 -7.702457587461022e-01 -2.238485359040995e-01 -3.500183631986633e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.490000000000000e+02 4.838363901519966e-01 -7.702602964184062e-01 -2.238186446125241e-01 -3.500094822285913e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.500000000000000e+02 4.838334977820587e-01 -7.702748348104982e-01 -2.237887518612232e-01 -3.500005997452495e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.510000000000000e+02 4.838306034405069e-01 -7.702893740089363e-01 -2.237588577256052e-01 -3.499917156914552e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.520000000000000e+02 4.838277072485968e-01 -7.703039139370736e-01 -2.237289621356792e-01 -3.499828301123974e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.530000000000000e+02 4.838248092228415e-01 -7.703184545857970e-01 -2.236990650815493e-01 -3.499739430110065e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.540000000000000e+02 4.838219092366896e-01 -7.703329960307995e-01 -2.236691666383406e-01 -3.499650543469835e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.550000000000000e+02 4.838190073853983e-01 -7.703475382141063e-01 -2.236392667502800e-01 -3.499561641512707e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.560000000000000e+02 4.838161036943537e-01 -7.703620811198260e-01 -2.236093654027569e-01 -3.499472724324643e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.570000000000000e+02 4.838131980706468e-01 -7.703766248040514e-01 -2.235794626508517e-01 -3.499383791597133e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.580000000000000e+02 4.838102905954015e-01 -7.703911692188973e-01 -2.235495584464597e-01 -3.499294843563863e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.590000000000000e+02 4.838073811843759e-01 -7.704057144150809e-01 -2.235196528396208e-01 -3.499205879947053e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.600000000000000e+02 4.838044699382188e-01 -7.704202603287295e-01 -2.234897457723021e-01 -3.499116901125821e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.610000000000000e+02 4.838015568252190e-01 -7.704348069832014e-01 -2.234598372618078e-01 -3.499027906907549e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.620000000000000e+02 4.837986417605162e-01 -7.704493544270580e-01 -2.234299273594658e-01 -3.498938897062268e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.630000000000000e+02 4.837957248580799e-01 -7.704639025906995e-01 -2.234000159985491e-01 -3.498849871966533e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.640000000000000e+02 4.837928060929405e-01 -7.704784514894852e-01 -2.233701031938022e-01 -3.498760831526979e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.650000000000000e+02 4.837898854004406e-01 -7.704930011632560e-01 -2.233401889834158e-01 -3.498671775510236e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.660000000000000e+02 4.837869628404565e-01 -7.705075515734392e-01 -2.233102733331082e-01 -3.498582704150401e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.670000000000000e+02 4.837840384333759e-01 -7.705221027097847e-01 -2.232803562302591e-01 -3.498493617465588e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.680000000000000e+02 4.837811120843828e-01 -7.705366546321275e-01 -2.232504377302087e-01 -3.498404515089666e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.690000000000000e+02 4.837781838895169e-01 -7.705512072718165e-01 -2.232205177802987e-01 -3.498315397536393e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.700000000000000e+02 4.837752538387071e-01 -7.705657606476785e-01 -2.231905963820346e-01 -3.498226264514509e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.710000000000000e+02 4.837723218536341e-01 -7.705803147991408e-01 -2.231606735847886e-01 -3.498137115917332e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.720000000000000e+02 4.837693880418362e-01 -7.705948696619040e-01 -2.231307493249786e-01 -3.498047952073469e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.730000000000000e+02 4.837664522938737e-01 -7.706094253048867e-01 -2.231008236665050e-01 -3.497958772564344e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.740000000000000e+02 4.837635146871546e-01 -7.706239816773554e-01 -2.230708965652826e-01 -3.497869577712001e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.750000000000000e+02 4.837605752382975e-01 -7.706385387688546e-01 -2.230409680117936e-01 -3.497780367571386e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.760000000000000e+02 4.837576338571128e-01 -7.706530966376284e-01 -2.230110380582626e-01 -3.497691141767350e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.770000000000000e+02 4.837546906070957e-01 -7.706676552428489e-01 -2.229811066682611e-01 -3.497601900547290e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.780000000000000e+02 4.837517455199688e-01 -7.706822145659536e-01 -2.229511738229936e-01 -3.497512643995018e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.790000000000000e+02 4.837487985049490e-01 -7.706967746604746e-01 -2.229212395768670e-01 -3.497423371833513e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.800000000000000e+02 4.837458496235758e-01 -7.707113354867959e-01 -2.228913038945847e-01 -3.497334084303303e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.810000000000000e+02 4.837428988979868e-01 -7.707258970386589e-01 -2.228613667606685e-01 -3.497244781328487e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.820000000000000e+02 4.837399462355751e-01 -7.707404593643791e-01 -2.228314282328846e-01 -3.497155462750856e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.830000000000000e+02 4.837369917600356e-01 -7.707550223921478e-01 -2.228014882372360e-01 -3.497066128907256e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.840000000000000e+02 4.837340353479351e-01 -7.707695861983186e-01 -2.227715468463208e-01 -3.496976779353460e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.850000000000000e+02 4.837310770851414e-01 -7.707841507256235e-01 -2.227416040115201e-01 -3.496887414467381e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.860000000000000e+02 4.837281169722887e-01 -7.707987159773422e-01 -2.227116597312818e-01 -3.496798034171583e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.870000000000000e+02 4.837251549156263e-01 -7.708132820088612e-01 -2.226817140617904e-01 -3.496708638177967e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.880000000000000e+02 4.837221910417446e-01 -7.708278487439721e-01 -2.226517669283318e-01 -3.496619226884817e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.890000000000000e+02 4.837192252978345e-01 -7.708424162140618e-01 -2.226218183624154e-01 -3.496529800123856e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.900000000000000e+02 4.837162576194955e-01 -7.708569844626455e-01 -2.225918684008076e-01 -3.496440357586335e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.910000000000000e+02 4.837132881008956e-01 -7.708715534196715e-01 -2.225619169927381e-01 -3.496350899830852e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.920000000000000e+02 4.837103167333245e-01 -7.708861231043845e-01 -2.225319641384779e-01 -3.496261426545644e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.930000000000000e+02 4.837073434335165e-01 -7.709006935593169e-01 -2.225020098903855e-01 -3.496171937605375e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.940000000000000e+02 4.837043682967857e-01 -7.709152647276734e-01 -2.224720541919989e-01 -3.496082433296747e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.950000000000000e+02 4.837013912866960e-01 -7.709298366319477e-01 -2.224420970648150e-01 -3.495992913484814e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.960000000000000e+02 4.836984123753448e-01 -7.709444092891796e-01 -2.224121385256361e-01 -3.495903378066705e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.970000000000000e+02 4.836954316337517e-01 -7.709589826551713e-01 -2.223821785330075e-01 -3.495813827291946e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.980000000000000e+02 4.836924489600933e-01 -7.709735567916088e-01 -2.223522171474356e-01 -3.495724260817824e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.990000000000000e+02 4.836894644439871e-01 -7.709881316452292e-01 -2.223222543157664e-01 -3.495634678910876e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.000000000000000e+02 4.836864780811061e-01 -7.710027072211214e-01 -2.222922900398075e-01 -3.495545081500958e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.010000000000000e+02 4.836834897922369e-01 -7.710172835567743e-01 -2.222623243704910e-01 -3.495455468527134e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.020000000000000e+02 4.836804996578926e-01 -7.710318606134635e-01 -2.222323572567926e-01 -3.495365840047666e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.030000000000000e+02 4.836775076670338e-01 -7.710464383941008e-01 -2.222023887067246e-01 -3.495276196093871e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.040000000000000e+02 4.836745137682179e-01 -7.710610169290832e-01 -2.221724187513363e-01 -3.495186536503407e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.050000000000000e+02 4.836715180090299e-01 -7.710755961937908e-01 -2.221424473611416e-01 -3.495096861342087e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.060000000000000e+02 4.836685204164002e-01 -7.710901761650080e-01 -2.221124745228344e-01 -3.495007170827707e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.070000000000000e+02 4.836655208864850e-01 -7.711047569056896e-01 -2.220825002981549e-01 -3.494917464609753e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.080000000000000e+02 4.836625195550630e-01 -7.711193383415482e-01 -2.220525246040473e-01 -3.494827742969747e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.090000000000000e+02 4.836595162765114e-01 -7.711339205538833e-01 -2.220225475294580e-01 -3.494738005557753e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.100000000000000e+02 4.836565111751686e-01 -7.711485034691129e-01 -2.219925690003908e-01 -3.494648252740444e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.110000000000000e+02 4.836535042181948e-01 -7.711630871036960e-01 -2.219625890376308e-01 -3.494558484470820e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.120000000000000e+02 4.836504953418095e-01 -7.711776715007792e-01 -2.219326076776598e-01 -3.494468700441491e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.130000000000000e+02 4.836474846165510e-01 -7.711922566151281e-01 -2.219026248797988e-01 -3.494378900926525e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.140000000000000e+02 4.836444720545685e-01 -7.712068424390556e-01 -2.218726406371154e-01 -3.494289085965169e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.150000000000000e+02 4.836414575626874e-01 -7.712214290288996e-01 -2.218426550051452e-01 -3.494199255244747e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.160000000000000e+02 4.836384412390503e-01 -7.712360163286138e-01 -2.218126679247464e-01 -3.494109409013089e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.170000000000000e+02 4.836354230645488e-01 -7.712506043435904e-01 -2.217826794095781e-01 -3.494019547322678e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.180000000000000e+02 4.836324029696381e-01 -7.712651931192935e-01 -2.217526894999774e-01 -3.493929669870290e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.190000000000000e+02 4.836293810445357e-01 -7.712797825969852e-01 -2.217226981441589e-01 -3.493839777026148e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.200000000000000e+02 4.836263572431312e-01 -7.712943728089890e-01 -2.216927053679802e-01 -3.493749868544595e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.210000000000000e+02 4.836233315555841e-01 -7.713089637649370e-01 -2.216627111763298e-01 -3.493659944311927e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.220000000000000e+02 4.836203040435829e-01 -7.713235554175235e-01 -2.216327155363101e-01 -3.493570004721019e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.230000000000000e+02 4.836172746023166e-01 -7.713381478354047e-01 -2.216027185085020e-01 -3.493480049316396e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.240000000000000e+02 4.836142433274197e-01 -7.713527409577372e-01 -2.215727200374669e-01 -3.493390078462925e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.250000000000000e+02 4.836112102113016e-01 -7.713673347916384e-01 -2.215427201269335e-01 -3.493300092078605e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.260000000000000e+02 4.836081751749585e-01 -7.713819293833855e-01 -2.215127188246367e-01 -3.493210089926311e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.270000000000000e+02 4.836051383003947e-01 -7.713965246844088e-01 -2.214827160817540e-01 -3.493120072246614e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.280000000000000e+02 4.836020995826215e-01 -7.714111206976709e-01 -2.214527119013992e-01 -3.493030039017122e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.290000000000000e+02 4.835990589480797e-01 -7.714257174686053e-01 -2.214227063272159e-01 -3.492939989969921e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.300000000000000e+02 4.835960164716779e-01 -7.714403149429034e-01 -2.213926993181676e-01 -3.492849925521198e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.310000000000000e+02 4.835929721527279e-01 -7.714549131310010e-01 -2.213626908712112e-01 -3.492759845462999e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.320000000000000e+02 4.835899259242404e-01 -7.714695120729821e-01 -2.213326810266008e-01 -3.492669749576099e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.330000000000000e+02 4.835868778855311e-01 -7.714841117019500e-01 -2.213026697279529e-01 -3.492579638314041e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.340000000000000e+02 4.835838279076448e-01 -7.714987120990479e-01 -2.212726570509947e-01 -3.492489511183861e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.350000000000000e+02 4.835807761279397e-01 -7.715133131825523e-01 -2.212426429139172e-01 -3.492399368600980e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.360000000000000e+02 4.835777224838843e-01 -7.715279149861288e-01 -2.212126273554388e-01 -3.492309210435982e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.370000000000000e+02 4.835746669154944e-01 -7.715425175518510e-01 -2.211826104094496e-01 -3.492219036369026e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.380000000000000e+02 4.835716095406104e-01 -7.715571207999807e-01 -2.211525920092131e-01 -3.492128846946435e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.390000000000000e+02 4.835685503018505e-01 -7.715717247736629e-01 -2.211225721858910e-01 -3.492038641805923e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.400000000000000e+02 4.835654891611837e-01 -7.715863294937170e-01 -2.210925509632146e-01 -3.491948420857576e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.410000000000000e+02 4.835624261731150e-01 -7.716009349210474e-01 -2.210625283111773e-01 -3.491858184394181e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.420000000000000e+02 4.835593613599496e-01 -7.716155410467194e-01 -2.210325042150478e-01 -3.491767932391287e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.430000000000000e+02 4.835562946228694e-01 -7.716301479306178e-01 -2.210024787338206e-01 -3.491677664514306e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.440000000000000e+02 4.835532260495048e-01 -7.716447555181188e-01 -2.209724518162020e-01 -3.491587381075196e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.450000000000000e+02 4.835501556432031e-01 -7.716593638057361e-01 -2.209424234608672e-01 -3.491497082106750e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.460000000000000e+02 4.835470833294749e-01 -7.716739728420335e-01 -2.209123937111677e-01 -3.491406767286684e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.470000000000000e+02 4.835440092038774e-01 -7.716885825700394e-01 -2.208823625101284e-01 -3.491316436904973e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.480000000000000e+02 4.835409331479852e-01 -7.717031930529675e-01 -2.208523299314746e-01 -3.491226090731867e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.490000000000000e+02 4.835378552780354e-01 -7.717178042260024e-01 -2.208222959043472e-01 -3.491135729032144e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.500000000000000e+02 4.835347755656816e-01 -7.717324161066345e-01 -2.207922604455985e-01 -3.491045351698908e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.510000000000000e+02 4.835316939324976e-01 -7.717470287420789e-01 -2.207622236022798e-01 -3.490954958470811e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.520000000000000e+02 4.835286104719775e-01 -7.717616420740552e-01 -2.207321853196103e-01 -3.490864549681437e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.530000000000000e+02 4.835255251993082e-01 -7.717762560929806e-01 -2.207021455888465e-01 -3.490774125381287e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.540000000000000e+02 4.835224379789697e-01 -7.717908708841171e-01 -2.206721044897207e-01 -3.490683685052081e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.550000000000000e+02 4.835193489388048e-01 -7.718054863652827e-01 -2.206420619481445e-01 -3.490593229202092e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.560000000000000e+02 4.835162580819629e-01 -7.718201025356483e-01 -2.206120179619988e-01 -3.490502757813163e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.570000000000000e+02 4.835131652806261e-01 -7.718347194731570e-01 -2.205819726074152e-01 -3.490412270444920e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.580000000000000e+02 4.835100707019363e-01 -7.718493370762967e-01 -2.205519257852488e-01 -3.490321767647045e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.590000000000000e+02 4.835069741920248e-01 -7.718639554392173e-01 -2.205218775869696e-01 -3.490231248884753e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.600000000000000e+02 4.835038758725641e-01 -7.718785744860996e-01 -2.204918279411763e-01 -3.490140714594091e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.610000000000000e+02 4.835007757025299e-01 -7.718931942435920e-01 -2.204617768717460e-01 -3.490050164596903e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.620000000000000e+02 4.834976736292268e-01 -7.719078147416500e-01 -2.204317244110873e-01 -3.489959598749686e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.630000000000000e+02 4.834945697154010e-01 -7.719224359411060e-01 -2.204016705224620e-01 -3.489869017275238e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.640000000000000e+02 4.834914639901572e-01 -7.719370578262503e-01 -2.203716151880193e-01 -3.489778420224276e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.650000000000000e+02 4.834883563391319e-01 -7.719516804654043e-01 -2.203415584764796e-01 -3.489687807229740e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.660000000000000e+02 4.834852468555849e-01 -7.719663038029483e-01 -2.203115003322237e-01 -3.489597178574818e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.670000000000000e+02 4.834821355625039e-01 -7.719809278231762e-01 -2.202814407423579e-01 -3.489506534363560e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.680000000000000e+02 4.834790223432734e-01 -7.719955526008816e-01 -2.202513797751336e-01 -3.489415874119934e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.690000000000000e+02 4.834759072994732e-01 -7.720101780676661e-01 -2.202213173727372e-01 -3.489325198308375e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.700000000000000e+02 4.834727904169008e-01 -7.720248042334953e-01 -2.201912535432712e-01 -3.489234506847770e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.710000000000000e+02 4.834696716387226e-01 -7.720394311359716e-01 -2.201611883197914e-01 -3.489143799478728e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.720000000000000e+02 4.834665510644374e-01 -7.720540587118367e-01 -2.201311216442328e-01 -3.489053076582379e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.730000000000000e+02 4.834634285613051e-01 -7.720686870433919e-01 -2.201010535952850e-01 -3.488962337674144e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.740000000000000e+02 4.834603042415431e-01 -7.720833160619439e-01 -2.200709841065716e-01 -3.488871583131603e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.750000000000000e+02 4.834571781031812e-01 -7.720979457635168e-01 -2.200409131812567e-01 -3.488780813043793e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.760000000000000e+02 4.834540500400328e-01 -7.721125762214913e-01 -2.200108408796839e-01 -3.488690026871342e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.770000000000000e+02 4.834509201428009e-01 -7.721272073742272e-01 -2.199807671504072e-01 -3.488599225039680e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.780000000000000e+02 4.834477884574826e-01 -7.721418391967610e-01 -2.199506919651427e-01 -3.488508407635952e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.790000000000000e+02 4.834446548261031e-01 -7.721564717782490e-01 -2.199206154206740e-01 -3.488417574259541e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.800000000000000e+02 4.834415193834659e-01 -7.721711050447932e-01 -2.198905374341008e-01 -3.488326725194353e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.810000000000000e+02 4.834383821204727e-01 -7.721857390006516e-01 -2.198604580114293e-01 -3.488235860428047e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.820000000000000e+02 4.834352429354213e-01 -7.722003737024993e-01 -2.198303772153828e-01 -3.488144979713904e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.830000000000000e+02 4.834321019758296e-01 -7.722150090635064e-01 -2.198002949572540e-01 -3.488054083482423e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.840000000000000e+02 4.834289590764427e-01 -7.722296451849658e-01 -2.197702113354413e-01 -3.487963171155119e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.850000000000000e+02 4.834258143859839e-01 -7.722442819741794e-01 -2.197401262624237e-01 -3.487872243268185e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.860000000000000e+02 4.834226678529653e-01 -7.722589194630554e-01 -2.197100397687612e-01 -3.487781299629968e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.870000000000000e+02 4.834195194250901e-01 -7.722735576838545e-01 -2.196799518857930e-01 -3.487690340047307e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.880000000000000e+02 4.834163691499443e-01 -7.722881966068221e-01 -2.196498625856423e-01 -3.487599364688777e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.890000000000000e+02 4.834132170733374e-01 -7.723028362033082e-01 -2.196197718414709e-01 -3.487508373716582e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.900000000000000e+02 4.834100630901579e-01 -7.723174765384491e-01 -2.195896797157904e-01 -3.487417366745320e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.910000000000000e+02 4.834069072664852e-01 -7.723321175697121e-01 -2.195595861702559e-01 -3.487326344036111e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.920000000000000e+02 4.834037496494925e-01 -7.723467592701256e-01 -2.195294911763094e-01 -3.487235305705884e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.930000000000000e+02 4.834005901090410e-01 -7.723614017216756e-01 -2.194993948108011e-01 -3.487144251252757e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.940000000000000e+02 4.833974287421907e-01 -7.723760448562160e-01 -2.194692970193515e-01 -3.487053181176608e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.950000000000000e+02 4.833942655615391e-01 -7.723906886758876e-01 -2.194391977910913e-01 -3.486962095317513e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.960000000000000e+02 4.833911004744011e-01 -7.724053332292451e-01 -2.194090971844021e-01 -3.486870993511119e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.970000000000000e+02 4.833879336014745e-01 -7.724199784461234e-01 -2.193789951263013e-01 -3.486779876091426e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.980000000000000e+02 4.833847648074766e-01 -7.724346244091893e-01 -2.193488916976167e-01 -3.486688742587764e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.990000000000000e+02 4.833815942103498e-01 -7.724492710461442e-01 -2.193187868284385e-01 -3.486597593400235e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.000000000000000e+03 4.833784217997282e-01 -7.724639183595098e-01 -2.192886805264380e-01 -3.486506428562132e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.001000000000000e+03 4.833752474574097e-01 -7.724785664263841e-01 -2.192585728605675e-01 -3.486415247564088e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.002000000000000e+03 4.833720712986990e-01 -7.724932151735769e-01 -2.192284637633635e-01 -3.486324050847124e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.003000000000000e+03 4.833688933522358e-01 -7.725078645831177e-01 -2.191983532180947e-01 -3.486232838511246e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.004000000000000e+03 4.833657134776052e-01 -7.725225147434108e-01 -2.191682413077620e-01 -3.486141610016221e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.005000000000000e+03 4.833625317838361e-01 -7.725371655839037e-01 -2.191381279690445e-01 -3.486050365805560e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.006000000000000e+03 4.833593482870210e-01 -7.725518170957034e-01 -2.191080131921700e-01 -3.485959105908348e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.007000000000000e+03 4.833561628737146e-01 -7.725664693491613e-01 -2.190778970446760e-01 -3.485867829907682e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.008000000000000e+03 4.833529756735302e-01 -7.725811222634824e-01 -2.190477794500511e-01 -3.485776538271549e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.009000000000000e+03 4.833497865689272e-01 -7.725957759103068e-01 -2.190176604787168e-01 -3.485685230593162e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.010000000000000e+03 4.833465956574014e-01 -7.726104302313138e-01 -2.189875400723284e-01 -3.485593907173569e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.011000000000000e+03 4.833434029251159e-01 -7.726250852324548e-01 -2.189574182401628e-01 -3.485502568008148e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.012000000000000e+03 4.833402082848949e-01 -7.726397409702579e-01 -2.189272950333515e-01 -3.485411212725223e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.013000000000000e+03 4.833370118257291e-01 -7.726543973916954e-01 -2.188971703985647e-01 -3.485319841594934e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.014000000000000e+03 4.833338135614461e-01 -7.726690544804330e-01 -2.188670443305308e-01 -3.485228454814411e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.015000000000000e+03 4.833306134037838e-01 -7.726837122949438e-01 -2.188369168805856e-01 -3.485137051982695e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.016000000000000e+03 4.833274114078440e-01 -7.726983707995104e-01 -2.188067880167867e-01 -3.485045633321781e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.017000000000000e+03 4.833242076040057e-01 -7.727130299750747e-01 -2.187766577213564e-01 -3.484954198938226e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.018000000000000e+03 4.833210019113565e-01 -7.727276898780624e-01 -2.187465260403907e-01 -3.484862748407406e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.019000000000000e+03 4.833177944015477e-01 -7.727423504561259e-01 -2.187163929344087e-01 -3.484771282137848e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.020000000000000e+03 4.833145850599770e-01 -7.727570117207516e-01 -2.186862584113394e-01 -3.484679800021305e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.021000000000000e+03 4.833113738382090e-01 -7.727716737005565e-01 -2.186561225007897e-01 -3.484588301902868e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.022000000000000e+03 4.833081608231549e-01 -7.727863363438457e-01 -2.186259851505150e-01 -3.484496788045051e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.023000000000000e+03 4.833049459002870e-01 -7.728009997216707e-01 -2.185958464287948e-01 -3.484405258025904e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.024000000000000e+03 4.833017291855713e-01 -7.728156637566033e-01 -2.185657062689899e-01 -3.484313712365972e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.025000000000000e+03 4.832985106451065e-01 -7.728303284784683e-01 -2.185355646881950e-01 -3.484222150760429e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.026000000000000e+03 4.832952901983741e-01 -7.728449939270304e-01 -2.185054217381946e-01 -3.484130573113063e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.027000000000000e+03 4.832920679511992e-01 -7.728596600475974e-01 -2.184752773524544e-01 -3.484038979580074e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.028000000000000e+03 4.832888438915389e-01 -7.728743268336385e-01 -2.184451315432751e-01 -3.483947370389965e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.029000000000000e+03 4.832856179279520e-01 -7.728889943532018e-01 -2.184149843612302e-01 -3.483855744978221e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.030000000000000e+03 4.832823901536654e-01 -7.729036625468073e-01 -2.183848357517557e-01 -3.483764103706943e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.031000000000000e+03 4.832791605791076e-01 -7.729183314040300e-01 -2.183546857102231e-01 -3.483672446685436e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.032000000000000e+03 4.832759290930346e-01 -7.729330009926285e-01 -2.183245343034775e-01 -3.483580773528342e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.033000000000000e+03 4.832726958330501e-01 -7.729476712293093e-01 -2.182943814491909e-01 -3.483489084684478e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.034000000000000e+03 4.832694606653657e-01 -7.729623421984055e-01 -2.182642272266711e-01 -3.483397379635371e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.035000000000000e+03 4.832662237113846e-01 -7.729770138228735e-01 -2.182340715646311e-01 -3.483305658846702e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.036000000000000e+03 4.832629849188659e-01 -7.729916861338656e-01 -2.182039144946749e-01 -3.483213922147655e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.037000000000000e+03 4.832597442545036e-01 -7.730063591556338e-01 -2.181737560356777e-01 -3.483122169337557e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.038000000000000e+03 4.832565017551338e-01 -7.730210328638267e-01 -2.181435961664584e-01 -3.483030400572151e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.039000000000000e+03 4.832532574676317e-01 -7.730357072227838e-01 -2.181134348616847e-01 -3.482938616144871e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.040000000000000e+03 4.832500112842137e-01 -7.730503823069579e-01 -2.180832721830326e-01 -3.482846815506174e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.041000000000000e+03 4.832467632739403e-01 -7.730650580706525e-01 -2.180531080906621e-01 -3.482754998955296e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.042000000000000e+03 4.832435134727810e-01 -7.730797344925769e-01 -2.180229425629868e-01 -3.482663166594574e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.043000000000000e+03 4.832402617775003e-01 -7.730944116342535e-01 -2.179927756626218e-01 -3.482571318092512e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.044000000000000e+03 4.832370082699298e-01 -7.731090894432860e-01 -2.179626073416874e-01 -3.482479453770178e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.045000000000000e+03 4.832337529468561e-01 -7.731237679291151e-01 -2.179324375995733e-01 -3.482387573460100e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.046000000000000e+03 4.832304957388379e-01 -7.731384471271555e-01 -2.179022664806738e-01 -3.482295677055486e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.047000000000000e+03 4.832272367543462e-01 -7.731531269709798e-01 -2.178720939202902e-01 -3.482203764924501e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.048000000000000e+03 4.832239758720545e-01 -7.731678075397052e-01 -2.178419199895371e-01 -3.482111836542902e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.049000000000000e+03 4.832207131800170e-01 -7.731824887732641e-01 -2.178117446381783e-01 -3.482019892330458e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.050000000000000e+03 4.832174486863940e-01 -7.731971706702200e-01 -2.177815678602096e-01 -3.481927932237081e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.051000000000000e+03 4.832141823018342e-01 -7.732118532834538e-01 -2.177513897100529e-01 -3.481835955981804e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.052000000000000e+03 4.832109141102858e-01 -7.732265365642890e-01 -2.177212101367298e-01 -3.481743963793063e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.053000000000000e+03 4.832076441117291e-01 -7.732412205088144e-01 -2.176910291418022e-01 -3.481651955741909e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.054000000000000e+03 4.832043722245879e-01 -7.732559051701169e-01 -2.176608467732841e-01 -3.481559931475000e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.055000000000000e+03 4.832010985271133e-01 -7.732705904967573e-01 -2.176306629858253e-01 -3.481467891325976e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.056000000000000e+03 4.831978230275315e-01 -7.732852764847329e-01 -2.176004777742841e-01 -3.481375835295406e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.057000000000000e+03 4.831945456457859e-01 -7.732999631836620e-01 -2.175702911866901e-01 -3.481283763085807e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.058000000000000e+03 4.831912664745435e-01 -7.733146505356897e-01 -2.175401031681156e-01 -3.481191675033083e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.059000000000000e+03 4.831879854093722e-01 -7.733293386056336e-01 -2.175099137810746e-01 -3.481099570749954e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.060000000000000e+03 4.831847025606613e-01 -7.733440273232747e-01 -2.174797229606540e-01 -3.481007450663394e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.061000000000000e+03 4.831814179049626e-01 -7.733587167068798e-01 -2.174495307196206e-01 -3.480915314606994e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.062000000000000e+03 4.831781313427012e-01 -7.733734068131961e-01 -2.174193371194292e-01 -3.480823162311957e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.063000000000000e+03 4.831748429826920e-01 -7.733880975780290e-01 -2.173891420942795e-01 -3.480730994098816e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.064000000000000e+03 4.831715528369881e-01 -7.734027889924641e-01 -2.173589456376543e-01 -3.480638810032707e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.065000000000000e+03 4.831682607914484e-01 -7.734174811273817e-01 -2.173287478178733e-01 -3.480546609690184e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.066000000000000e+03 4.831649669250423e-01 -7.734321739334075e-01 -2.172985485882103e-01 -3.480454393357620e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.067000000000000e+03 4.831616712893474e-01 -7.734468673795043e-01 -2.172683479177537e-01 -3.480362161195389e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.068000000000000e+03 4.831583737436515e-01 -7.734615615480803e-01 -2.172381458924409e-01 -3.480269912782766e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.069000000000000e+03 4.831550744137335e-01 -7.734762563668752e-01 -2.172079424354478e-01 -3.480177648452773e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.070000000000000e+03 4.831517732545929e-01 -7.734909518638134e-01 -2.171777375737234e-01 -3.480085368035002e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.071000000000000e+03 4.831484702419486e-01 -7.735056480487036e-01 -2.171475313240050e-01 -3.479993071537791e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.072000000000000e+03 4.831451654419320e-01 -7.735203448814811e-01 -2.171173236466193e-01 -3.479900759174780e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.073000000000000e+03 4.831418587395204e-01 -7.735350424361113e-01 -2.170871146095577e-01 -3.479808430468287e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.074000000000000e+03 4.831385502654458e-01 -7.735497406296677e-01 -2.170569041357248e-01 -3.479716085921268e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.075000000000000e+03 4.831352399916107e-01 -7.735644394807963e-01 -2.170266922415744e-01 -3.479623725400370e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.076000000000000e+03 4.831319278099560e-01 -7.735791390528207e-01 -2.169964789932332e-01 -3.479531348579452e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.077000000000000e+03 4.831286138219956e-01 -7.735938392860758e-01 -2.169662643291636e-01 -3.479438955752976e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.078000000000000e+03 4.831252980692480e-01 -7.736085401557896e-01 -2.169360482244065e-01 -3.479346547044520e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.079000000000000e+03 4.831219804200330e-01 -7.736232417375007e-01 -2.169058307600617e-01 -3.479254122091017e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.080000000000000e+03 4.831186609517643e-01 -7.736379439878320e-01 -2.168756118884634e-01 -3.479161681072882e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.081000000000000e+03 4.831153397017624e-01 -7.736526468821079e-01 -2.168453915880492e-01 -3.479069224148680e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.082000000000000e+03 4.831120165767971e-01 -7.736673504781924e-01 -2.168151699148008e-01 -3.478976750971046e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.083000000000000e+03 4.831086916575070e-01 -7.736820547244404e-01 -2.167849468212753e-01 -3.478884261858055e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.084000000000000e+03 4.831053648681539e-01 -7.736967596703296e-01 -2.167547223521497e-01 -3.478791756476421e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.085000000000000e+03 4.831020362855006e-01 -7.737114652678381e-01 -2.167244964619263e-01 -3.478699235105301e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.086000000000000e+03 4.830987059043322e-01 -7.737261715150423e-01 -2.166942691557115e-01 -3.478606697821800e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.087000000000000e+03 4.830953736468468e-01 -7.737408784664901e-01 -2.166640404780713e-01 -3.478514144209202e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.088000000000000e+03 4.830920395651368e-01 -7.737555860870284e-01 -2.166338103990907e-01 -3.478421574505979e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.089000000000000e+03 4.830887037143307e-01 -7.737702943433883e-01 -2.166035788856844e-01 -3.478328988886293e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.090000000000000e+03 4.830853659797839e-01 -7.737850033042841e-01 -2.165733460075319e-01 -3.478236386973564e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.091000000000000e+03 4.830820264317585e-01 -7.737997129270063e-01 -2.165431117225338e-01 -3.478143768997922e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.092000000000000e+03 4.830786851187320e-01 -7.738144231836924e-01 -2.165128760011054e-01 -3.478051135083794e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.093000000000000e+03 4.830753418942692e-01 -7.738291341565970e-01 -2.164826389341427e-01 -3.477958484862865e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.094000000000000e+03 4.830719968866757e-01 -7.738438457781323e-01 -2.164524004408911e-01 -3.477865818553189e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.095000000000000e+03 4.830686500809335e-01 -7.738585580474510e-01 -2.164221605341051e-01 -3.477773136296480e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.096000000000000e+03 4.830653014039201e-01 -7.738732710149312e-01 -2.163919192560529e-01 -3.477680437718114e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.097000000000000e+03 4.830619509533394e-01 -7.738879846182631e-01 -2.163616765490582e-01 -3.477587723200051e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.098000000000000e+03 4.830585986189449e-01 -7.739026989259509e-01 -2.163314324793289e-01 -3.477494992330998e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.099000000000000e+03 4.830552445064910e-01 -7.739174138706083e-01 -2.163011869844782e-01 -3.477402245523367e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.100000000000000e+03 4.830518885968496e-01 -7.739321294678139e-01 -2.162709400747533e-01 -3.477309482626104e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.101000000000000e+03 4.830485307941351e-01 -7.739468457758560e-01 -2.162406918082715e-01 -3.477216703306127e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.102000000000000e+03 4.830451712011493e-01 -7.739615627266675e-01 -2.162104421252928e-01 -3.477123908015540e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.103000000000000e+03 4.830418098293093e-01 -7.739762803129867e-01 -2.161801910192052e-01 -3.477031096792180e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.104000000000000e+03 4.830384465709796e-01 -7.739909986079960e-01 -2.161499385524430e-01 -3.476938269107853e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.105000000000000e+03 4.830350815285286e-01 -7.740057175426349e-01 -2.161196846659572e-01 -3.476845425438494e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.106000000000000e+03 4.830317146683989e-01 -7.740204371389704e-01 -2.160894293795126e-01 -3.476752565629893e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.107000000000000e+03 4.830283459619656e-01 -7.740351574120607e-01 -2.160591727115846e-01 -3.476659689623361e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.108000000000000e+03 4.830249754803215e-01 -7.740498783237458e-01 -2.160289146176076e-01 -3.476566797551400e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.109000000000000e+03 4.830216031213690e-01 -7.740645999324248e-01 -2.159986551607984e-01 -3.476473889133136e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.110000000000000e+03 4.830182289684313e-01 -7.740793221872141e-01 -2.159683942911916e-01 -3.476380964647978e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.111000000000000e+03 4.830148530328174e-01 -7.740940450821781e-01 -2.159381320017842e-01 -3.476288024108146e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.112000000000000e+03 4.830114752168667e-01 -7.741087686742096e-01 -2.159078683527132e-01 -3.476195067223832e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.113000000000000e+03 4.830080955978889e-01 -7.741234929186948e-01 -2.158776032966870e-01 -3.476102094201762e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.114000000000000e+03 4.830047142213315e-01 -7.741382177846087e-01 -2.158473368076744e-01 -3.476009105256688e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.115000000000000e+03 4.830013309411774e-01 -7.741529433653308e-01 -2.158170689724438e-01 -3.475916099792825e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.116000000000000e+03 4.829979458782727e-01 -7.741676695840293e-01 -2.157867997195005e-01 -3.475823078279713e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.117000000000000e+03 4.829945590412597e-01 -7.741823964376896e-01 -2.157565290429805e-01 -3.475730040694487e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.118000000000000e+03 4.829911703125846e-01 -7.741971239943748e-01 -2.157262570153825e-01 -3.475636986698292e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.119000000000000e+03 4.829877798009445e-01 -7.742118521898681e-01 -2.156959835706452e-01 -3.475543916614787e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.120000000000000e+03 4.829843874974311e-01 -7.742265810258180e-01 -2.156657087156391e-01 -3.475450830482068e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.121000000000000e+03 4.829809933225404e-01 -7.742413105540905e-01 -2.156354324974519e-01 -3.475357727951089e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.122000000000000e+03 4.829775974011657e-01 -7.742560406991423e-01 -2.156051548406775e-01 -3.475264609430671e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.123000000000000e+03 4.829741995887287e-01 -7.742707715459184e-01 -2.155748758339922e-01 -3.475171474481136e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.124000000000000e+03 4.829707999968664e-01 -7.742855030283576e-01 -2.155445954095472e-01 -3.475078323437396e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.125000000000000e+03 4.829673986195143e-01 -7.743002351488513e-01 -2.155143135716151e-01 -3.474985156297626e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.126000000000000e+03 4.829639953594280e-01 -7.743149679703472e-01 -2.154840303779089e-01 -3.474891972646503e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.127000000000000e+03 4.829605903217851e-01 -7.743297014194868e-01 -2.154537457684760e-01 -3.474798773022320e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.128000000000000e+03 4.829571835003210e-01 -7.743444355063369e-01 -2.154234597450073e-01 -3.474705557271023e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.129000000000000e+03 4.829537748141849e-01 -7.743591702836118e-01 -2.153931723554308e-01 -3.474612325038148e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.130000000000000e+03 4.829503643296082e-01 -7.743739057010112e-01 -2.153628835635102e-01 -3.474519076742428e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.131000000000000e+03 4.829469520558362e-01 -7.743886417601744e-01 -2.153325933612156e-01 -3.474425812262273e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.132000000000000e+03 4.829435379205433e-01 -7.744033785059800e-01 -2.153023017922936e-01 -3.474332531325309e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.133000000000000e+03 4.829401220408659e-01 -7.744181158589009e-01 -2.152720087890524e-01 -3.474239234489037e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.134000000000000e+03 4.829367042544593e-01 -7.744328539225522e-01 -2.152417144481809e-01 -3.474145921095135e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.135000000000000e+03 4.829332847232318e-01 -7.744475926019725e-01 -2.152114186707958e-01 -3.474052591616060e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.136000000000000e+03 4.829298633963508e-01 -7.744623319249978e-01 -2.151811214888511e-01 -3.473959245933620e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.137000000000000e+03 4.829264401853611e-01 -7.744770719377816e-01 -2.151508229589155e-01 -3.473865883891842e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.138000000000000e+03 4.829230151989275e-01 -7.744918125861563e-01 -2.151205230112329e-01 -3.473772505613468e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.139000000000000e+03 4.829195884358113e-01 -7.745065538619544e-01 -2.150902216498929e-01 -3.473679111266130e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.140000000000000e+03 4.829161598009718e-01 -7.745212958242504e-01 -2.150599189322681e-01 -3.473585700492395e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.141000000000000e+03 4.829127293755948e-01 -7.745360384272315e-01 -2.150296148081789e-01 -3.473492273489466e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.142000000000000e+03 4.829092971882704e-01 -7.745507816516444e-01 -2.149993092611641e-01 -3.473398830384729e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.143000000000000e+03 4.829058631157235e-01 -7.745655255716890e-01 -2.149690023664106e-01 -3.473305370765743e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.144000000000000e+03 4.829024272588698e-01 -7.745802701229367e-01 -2.149386940641668e-01 -3.473211895029743e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.145000000000000e+03 4.828989896236993e-01 -7.745950153090534e-01 -2.149083843483474e-01 -3.473118403043017e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.146000000000000e+03 4.828955501337893e-01 -7.746097611686895e-01 -2.148780732683576e-01 -3.473024894694093e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.147000000000000e+03 4.828921088877650e-01 -7.746245076451793e-01 -2.148477607634484e-01 -3.472931370245064e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.148000000000000e+03 4.828886657625709e-01 -7.746392548138518e-01 -2.148174469082599e-01 -3.472837829258681e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.149000000000000e+03 4.828852208600788e-01 -7.746540026109302e-01 -2.147871316419896e-01 -3.472744272110813e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.150000000000000e+03 4.828817741848949e-01 -7.746687510346578e-01 -2.147568149616283e-01 -3.472650698788878e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.151000000000000e+03 4.828783256427960e-01 -7.746835001398417e-01 -2.147264969254658e-01 -3.472557109013641e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.152000000000000e+03 4.828748753186974e-01 -7.746982498795804e-01 -2.146961774805919e-01 -3.472463502971490e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.153000000000000e+03 4.828714232181722e-01 -7.747130002414565e-01 -2.146658566270160e-01 -3.472369880855548e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.154000000000000e+03 4.828679692476426e-01 -7.747277512924482e-01 -2.146355344181600e-01 -3.472276242136203e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.155000000000000e+03 4.828645135045103e-01 -7.747425029640223e-01 -2.146052107985649e-01 -3.472182587324552e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.156000000000000e+03 4.828610559761253e-01 -7.747572552740006e-01 -2.145748857724136e-01 -3.472088916166663e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.157000000000000e+03 4.828575965875784e-01 -7.747720082575912e-01 -2.145445593891518e-01 -3.471995228606762e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.158000000000000e+03 4.828541354472324e-01 -7.747867618520258e-01 -2.145142315821360e-01 -3.471901524943988e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.159000000000000e+03 4.828506724431045e-01 -7.748015161295048e-01 -2.144839024180936e-01 -3.471807804705910e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.160000000000000e+03 4.828472076686613e-01 -7.748162710277170e-01 -2.144535718425482e-01 -3.471714068313425e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.161000000000000e+03 4.828437411142233e-01 -7.748310265538314e-01 -2.144232398610534e-01 -3.471620315700522e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.162000000000000e+03 4.828402726905983e-01 -7.748457827620427e-01 -2.143929065280430e-01 -3.471526546555624e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.163000000000000e+03 4.828368024845981e-01 -7.748605396017340e-01 -2.143625717903181e-01 -3.471432761123280e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.164000000000000e+03 4.828333305176232e-01 -7.748752970531125e-01 -2.143322356374925e-01 -3.471338959605424e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.165000000000000e+03 4.828298566852130e-01 -7.748900551887131e-01 -2.143018981300243e-01 -3.471245141456288e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.166000000000000e+03 4.828263810731997e-01 -7.749048139522448e-01 -2.142715592175354e-01 -3.471151307043248e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.167000000000000e+03 4.828229036922878e-01 -7.749195733318570e-01 -2.142412188956034e-01 -3.471057456502940e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.168000000000000e+03 4.828194244378707e-01 -7.749343333951542e-01 -2.142108772265914e-01 -3.470963589389918e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.169000000000000e+03 4.828159434144427e-01 -7.749490940804598e-01 -2.141805341466618e-01 -3.470869706015295e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.170000000000000e+03 4.828124606164438e-01 -7.749638553911125e-01 -2.141501896593521e-01 -3.470775806353701e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.171000000000000e+03 4.828089759588146e-01 -7.749786173749661e-01 -2.141198438180089e-01 -3.470681890184378e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.172000000000000e+03 4.828054895636173e-01 -7.749933799568973e-01 -2.140894965490311e-01 -3.470587957934547e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.173000000000000e+03 4.828020012885156e-01 -7.750081432281002e-01 -2.140591479374563e-01 -3.470494009016973e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.174000000000000e+03 4.827985112550036e-01 -7.750229071112406e-01 -2.140287979110111e-01 -3.470400043907921e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.175000000000000e+03 4.827950194432993e-01 -7.750376716172919e-01 -2.139984464822222e-01 -3.470306062553943e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.176000000000000e+03 4.827915257745447e-01 -7.750524367990297e-01 -2.139680936975911e-01 -3.470212064580379e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.177000000000000e+03 4.827880303320537e-01 -7.750672026029817e-01 -2.139377395077496e-01 -3.470118050320466e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.178000000000000e+03 4.827845331214771e-01 -7.750819690192000e-01 -2.139073839117529e-01 -3.470024019917257e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.179000000000000e+03 4.827810340414869e-01 -7.750967361170231e-01 -2.138770269687117e-01 -3.469929972861059e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.180000000000000e+03 4.827775332044879e-01 -7.751115038285545e-01 -2.138466686104241e-01 -3.469835909518632e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.181000000000000e+03 4.827740305721007e-01 -7.751262721713748e-01 -2.138163088623927e-01 -3.469741829867723e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.182000000000000e+03 4.827705261084318e-01 -7.751410411676379e-01 -2.137859477466836e-01 -3.469647733770548e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.183000000000000e+03 4.827670198878116e-01 -7.751558107770637e-01 -2.137555852165010e-01 -3.469553621374741e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.184000000000000e+03 4.827635118048948e-01 -7.751705810602084e-01 -2.137252213374411e-01 -3.469459492382725e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.185000000000000e+03 4.827600019661661e-01 -7.751853519516144e-01 -2.136948560452772e-01 -3.469365347164632e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.186000000000000e+03 4.827564903569070e-01 -7.752001234616023e-01 -2.136644893486057e-01 -3.469271185635360e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.187000000000000e+03 4.827529768837161e-01 -7.752148956445223e-01 -2.136341213054146e-01 -3.469177007516718e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.188000000000000e+03 4.827494616224208e-01 -7.752296684565908e-01 -2.136037518689905e-01 -3.469082813013231e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.189000000000000e+03 4.827459446315192e-01 -7.752444418623482e-01 -2.135733810039204e-01 -3.468988602314985e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.190000000000000e+03 4.827424257537145e-01 -7.752592159523370e-01 -2.135430088079665e-01 -3.468894374979264e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.191000000000000e+03 4.827389051235953e-01 -7.752739906497911e-01 -2.135126351977261e-01 -3.468800131355841e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.192000000000000e+03 4.827353827110191e-01 -7.752887659696588e-01 -2.134822601928726e-01 -3.468705871402656e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.193000000000000e+03 4.827318584531619e-01 -7.753035419534504e-01 -2.134518838307919e-01 -3.468611594829795e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.194000000000000e+03 4.827283324230722e-01 -7.753183185566037e-01 -2.134215060673132e-01 -3.468517301882180e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.195000000000000e+03 4.827248046313274e-01 -7.753330957648389e-01 -2.133911268989713e-01 -3.468422992746777e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.196000000000000e+03 4.827212749787821e-01 -7.753478736486583e-01 -2.133607463827660e-01 -3.468328666870431e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.197000000000000e+03 4.827177436029624e-01 -7.753626521182022e-01 -2.133303644374211e-01 -3.468234324841531e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.198000000000000e+03 4.827142103498908e-01 -7.753774312682309e-01 -2.132999811565258e-01 -3.468139966102682e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.199000000000000e+03 4.827106753256965e-01 -7.753922110334874e-01 -2.132695964759870e-01 -3.468045591023557e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.200000000000000e+03 4.827071385650585e-01 -7.754069913908902e-01 -2.132392103755878e-01 -3.467951199755517e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.201000000000000e+03 4.827035999370828e-01 -7.754217724245326e-01 -2.132088229337060e-01 -3.467856791751949e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.202000000000000e+03 4.827000595420561e-01 -7.754365540728055e-01 -2.131784340897461e-01 -3.467762367360719e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.203000000000000e+03 4.826965173824836e-01 -7.754513363289895e-01 -2.131480438441996e-01 -3.467667926687873e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.204000000000000e+03 4.826929733685617e-01 -7.754661192489709e-01 -2.131176522516301e-01 -3.467573469391977e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.205000000000000e+03 4.826894275907194e-01 -7.754809027823213e-01 -2.130872592555644e-01 -3.467478995682765e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.206000000000000e+03 4.826858800492102e-01 -7.754956869237285e-01 -2.130568648578486e-01 -3.467384505657808e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.207000000000000e+03 4.826823306611048e-01 -7.755104717260376e-01 -2.130264691084739e-01 -3.467289998976131e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.208000000000000e+03 4.826787795298386e-01 -7.755252571244579e-01 -2.129960719452622e-01 -3.467195476022626e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.209000000000000e+03 4.826752265405658e-01 -7.755400431905488e-01 -2.129656734378844e-01 -3.467100936361150e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.210000000000000e+03 4.826716718035404e-01 -7.755548298552004e-01 -2.129352735201445e-01 -3.467006380402958e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.211000000000000e+03 4.826681152973914e-01 -7.755696171303923e-01 -2.129048722055667e-01 -3.466911808088173e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.212000000000000e+03 4.826645569429081e-01 -7.755844050679037e-01 -2.128744695414787e-01 -3.466817219064283e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.213000000000000e+03 4.826609968146840e-01 -7.755991936196767e-01 -2.128440654836000e-01 -3.466722613633463e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.214000000000000e+03 4.826574349372151e-01 -7.756139827727563e-01 -2.128136600164779e-01 -3.466627991833012e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.215000000000000e+03 4.826538711972880e-01 -7.756287725901688e-01 -2.127832532115307e-01 -3.466533353384293e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.216000000000000e+03 4.826503057048516e-01 -7.756435630105085e-01 -2.127528450000198e-01 -3.466438698546019e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.217000000000000e+03 4.826467384541074e-01 -7.756583540372667e-01 -2.127224353856428e-01 -3.466344027291748e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.218000000000000e+03 4.826431693570560e-01 -7.756731457164452e-01 -2.126920244250875e-01 -3.466249339463170e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.219000000000000e+03 4.826395984836861e-01 -7.756879380166510e-01 -2.126616120718909e-01 -3.466154635067037e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.220000000000000e+03 4.826360258523363e-01 -7.757027309149912e-01 -2.126311983192404e-01 -3.466059914395762e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.221000000000000e+03 4.826324513818510e-01 -7.757175244707383e-01 -2.126007832134321e-01 -3.465965176962544e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.222000000000000e+03 4.826288751785382e-01 -7.757323186122683e-01 -2.125703666922696e-01 -3.465870423265233e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.223000000000000e+03 4.826252971314681e-01 -7.757471134137272e-01 -2.125399488213583e-01 -3.465775652780291e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.224000000000000e+03 4.826217173016427e-01 -7.757619088255254e-01 -2.125095295681563e-01 -3.465680865961425e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.225000000000000e+03 4.826181357377489e-01 -7.757767048283378e-01 -2.124791088994687e-01 -3.465586062760433e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.226000000000000e+03 4.826145523225364e-01 -7.757915014940036e-01 -2.124486868869749e-01 -3.465491242756177e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.227000000000000e+03 4.826109671331482e-01 -7.758062987665897e-01 -2.124182634870411e-01 -3.465396406387622e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.228000000000000e+03 4.826073802158752e-01 -7.758210966245068e-01 -2.123878386692538e-01 -3.465301553673509e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.229000000000000e+03 4.826037914141118e-01 -7.758358951629796e-01 -2.123574125295085e-01 -3.465206684068858e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.230000000000000e+03 4.826002008874580e-01 -7.758506942844863e-01 -2.123269849708145e-01 -3.465111798122382e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.231000000000000e+03 4.825966085714067e-01 -7.758654940230022e-01 -2.122965560345473e-01 -3.465016895711905e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.232000000000000e+03 4.825930144410497e-01 -7.758802943963378e-01 -2.122661257353515e-01 -3.464921976689476e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.233000000000000e+03 4.825894185722635e-01 -7.758950953631788e-01 -2.122356940252974e-01 -3.464827041210702e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.234000000000000e+03 4.825858208377554e-01 -7.759098969941487e-01 -2.122052609848697e-01 -3.464732088967676e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.235000000000000e+03 4.825822213895218e-01 -7.759246992002310e-01 -2.121748265202789e-01 -3.464637120404894e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.236000000000000e+03 4.825786201528870e-01 -7.759395020230255e-01 -2.121443906786077e-01 -3.464542135336171e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.237000000000000e+03 4.825750170699202e-01 -7.759543055022694e-01 -2.121139534940026e-01 -3.464447133463023e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.238000000000000e+03 4.825714122415611e-01 -7.759691095746379e-01 -2.120835149057203e-01 -3.464352115163297e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.239000000000000e+03 4.825678056665405e-01 -7.759839142370324e-01 -2.120530749160761e-01 -3.464257080503568e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.240000000000000e+03 4.825641972397775e-01 -7.759987195574571e-01 -2.120226335881508e-01 -3.464162029031860e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.241000000000000e+03 4.825605870440105e-01 -7.760135254852313e-01 -2.119921908717319e-01 -3.464066961031867e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.242000000000000e+03 4.825569751104579e-01 -7.760283320019267e-01 -2.119617467477191e-01 -3.463971876592081e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.243000000000000e+03 4.825533613306965e-01 -7.760431391676250e-01 -2.119313012848126e-01 -3.463876775450169e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.244000000000000e+03 4.825497458005046e-01 -7.760579469334963e-01 -2.119008544213231e-01 -3.463781657736942e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.245000000000000e+03 4.825461285037952e-01 -7.760727552957020e-01 -2.118704061721057e-01 -3.463686523665258e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.246000000000000e+03 4.825425093930511e-01 -7.760875642987349e-01 -2.118399565610098e-01 -3.463591372748003e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.247000000000000e+03 4.825388885284941e-01 -7.761023738910295e-01 -2.118095055566765e-01 -3.463496205487034e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.248000000000000e+03 4.825352658340689e-01 -7.761171841299387e-01 -2.117790532020029e-01 -3.463401021388117e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.249000000000000e+03 4.825316413794312e-01 -7.761319949654524e-01 -2.117485994573345e-01 -3.463305820837606e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.250000000000000e+03 4.825280151856489e-01 -7.761468063892497e-01 -2.117181443083493e-01 -3.463210603809648e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.251000000000000e+03 4.825243871533805e-01 -7.761616184607485e-01 -2.116876878165143e-01 -3.463115369974619e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.252000000000000e+03 4.825207573534106e-01 -7.761764311342362e-01 -2.116572299396907e-01 -3.463020119622008e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.253000000000000e+03 4.825171258120440e-01 -7.761912443918535e-01 -2.116267706626263e-01 -3.462924852872473e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.254000000000000e+03 4.825134924263389e-01 -7.762060583027880e-01 -2.115963100462964e-01 -3.462829569230605e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.255000000000000e+03 4.825098572946269e-01 -7.762208728040721e-01 -2.115658480318882e-01 -3.462734269090704e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.256000000000000e+03 4.825062204067858e-01 -7.762356878994070e-01 -2.115353846266267e-01 -3.462638952460367e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.257000000000000e+03 4.825025816800921e-01 -7.762505036390633e-01 -2.115049198815136e-01 -3.462543619047435e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.258000000000000e+03 4.824989412399931e-01 -7.762653199481446e-01 -2.114744537194219e-01 -3.462448269247684e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.259000000000000e+03 4.824952989483450e-01 -7.762801369153887e-01 -2.114439862235498e-01 -3.462352902482181e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.260000000000000e+03 4.824916549231001e-01 -7.762949544605270e-01 -2.114135173249754e-01 -3.462257519321446e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.261000000000000e+03 4.824880091389703e-01 -7.763097726017658e-01 -2.113830470383126e-01 -3.462162119614078e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.262000000000000e+03 4.824843615288626e-01 -7.763245913808436e-01 -2.113525754046794e-01 -3.462066703101793e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.263000000000000e+03 4.824807121469599e-01 -7.763394107624371e-01 -2.113221023919417e-01 -3.461971270011415e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.264000000000000e+03 4.824770610396043e-01 -7.763542307211354e-01 -2.112916279709114e-01 -3.461875820438716e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.265000000000000e+03 4.824734080833955e-01 -7.763690513301977e-01 -2.112611522181476e-01 -3.461780353986987e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.266000000000000e+03 4.824697533753378e-01 -7.763838725287254e-01 -2.112306750751341e-01 -3.461684871020810e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.267000000000000e+03 4.824660969272405e-01 -7.763986943141892e-01 -2.112001965331375e-01 -3.461589371479248e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.268000000000000e+03 4.824624386501648e-01 -7.764135167332612e-01 -2.111697166496590e-01 -3.461493855197906e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.269000000000000e+03 4.824587786170170e-01 -7.764283397501425e-01 -2.111392353771792e-01 -3.461398322247147e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.270000000000000e+03 4.824551168243312e-01 -7.764431633568619e-01 -2.111087527215865e-01 -3.461302772811800e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.271000000000000e+03 4.824514532194884e-01 -7.764579875923534e-01 -2.110782687130274e-01 -3.461207206561715e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.272000000000000e+03 4.824477878857774e-01 -7.764728124093550e-01 -2.110477832993697e-01 -3.461111623707748e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.273000000000000e+03 4.824441207267809e-01 -7.764876378554801e-01 -2.110172965440110e-01 -3.461016024132755e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.274000000000000e+03 4.824404518068432e-01 -7.765024638965350e-01 -2.109868084059432e-01 -3.460920407950659e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.275000000000000e+03 4.824367811588129e-01 -7.765172905130532e-01 -2.109563188650211e-01 -3.460824775256763e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.276000000000000e+03 4.824331086583941e-01 -7.765321177801274e-01 -2.109258279979775e-01 -3.460729125624771e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.277000000000000e+03 4.824294344191834e-01 -7.765469456289483e-01 -2.108953357352858e-01 -3.460633459432523e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.278000000000000e+03 4.824257584497512e-01 -7.765617740527587e-01 -2.108648420724049e-01 -3.460537776733470e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.279000000000000e+03 4.824220806295783e-01 -7.765766031280423e-01 -2.108343470824575e-01 -3.460442077039486e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.280000000000000e+03 4.824184010815801e-01 -7.765914327763931e-01 -2.108038506915890e-01 -3.460346360840187e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.281000000000000e+03 4.824147197675231e-01 -7.766062630203833e-01 -2.107733529236369e-01 -3.460250628010426e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.282000000000000e+03 4.824110366438497e-01 -7.766210938882742e-01 -2.107428538050776e-01 -3.460154878355571e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.283000000000000e+03 4.824073517931546e-01 -7.766359253269715e-01 -2.107123532863849e-01 -3.460059112211063e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.284000000000000e+03 4.824036651051162e-01 -7.766507574078273e-01 -2.106818514340829e-01 -3.459963329101999e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.285000000000000e+03 4.823999766904669e-01 -7.766655900613113e-01 -2.106513481812251e-01 -3.459867529446530e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.286000000000000e+03 4.823962865400032e-01 -7.766804232893051e-01 -2.106208435349417e-01 -3.459771713280959e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.287000000000000e+03 4.823925945245747e-01 -7.766952571762169e-01 -2.105903375727546e-01 -3.459675880032885e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.288000000000000e+03 4.823889007928515e-01 -7.767100916287342e-01 -2.105598302046820e-01 -3.459580030265573e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.289000000000000e+03 4.823852053087782e-01 -7.767249266655699e-01 -2.105293214541494e-01 -3.459484163912712e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.290000000000000e+03 4.823815080136962e-01 -7.767397623257042e-01 -2.104988113563708e-01 -3.459388280696402e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.291000000000000e+03 4.823778089559674e-01 -7.767545985799401e-01 -2.104682998817654e-01 -3.459292380771471e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.292000000000000e+03 4.823741081653791e-01 -7.767694354107217e-01 -2.104377870120177e-01 -3.459196464221833e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.293000000000000e+03 4.823704055506696e-01 -7.767842728699691e-01 -2.104072728048227e-01 -3.459100530796891e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.294000000000000e+03 4.823667011886122e-01 -7.767991109094240e-01 -2.103767572137913e-01 -3.459004580785554e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.295000000000000e+03 4.823629950805624e-01 -7.768139495355998e-01 -2.103462402356300e-01 -3.458908614036320e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.296000000000000e+03 4.823592871628415e-01 -7.768287887806311e-01 -2.103157219121956e-01 -3.458812630454632e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.297000000000000e+03 4.823555775171640e-01 -7.768436285957085e-01 -2.102852021930915e-01 -3.458716630297236e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.298000000000000e+03 4.823518660637020e-01 -7.768584690293400e-01 -2.102546811277521e-01 -3.458620613280992e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.299000000000000e+03 4.823481528451525e-01 -7.768733100571243e-01 -2.102241586895698e-01 -3.458524579513922e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.300000000000000e+03 4.823444379092169e-01 -7.768881516477709e-01 -2.101936348502289e-01 -3.458428529199358e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.301000000000000e+03 4.823407211339721e-01 -7.769029938786823e-01 -2.101631096838566e-01 -3.458332461842140e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.302000000000000e+03 4.823370026201774e-01 -7.769178366790583e-01 -2.101325831321403e-01 -3.458236377975474e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.303000000000000e+03 4.823332823806236e-01 -7.769326800557349e-01 -2.101020551821570e-01 -3.458140277339550e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.304000000000000e+03 4.823295603119655e-01 -7.769475240632279e-01 -2.100715259007875e-01 -3.458044159738288e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.305000000000000e+03 4.823258365021861e-01 -7.769623686412431e-01 -2.100409952365715e-01 -3.457948025605452e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.306000000000000e+03 4.823221109492732e-01 -7.769772138008993e-01 -2.100104631873695e-01 -3.457851874725912e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.307000000000000e+03 4.823183835790079e-01 -7.769920595871999e-01 -2.099799297992509e-01 -3.457755706837543e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.308000000000000e+03 4.823146545067224e-01 -7.770069059214976e-01 -2.099493950044612e-01 -3.457659522503955e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.309000000000000e+03 4.823109235859429e-01 -7.770217529003504e-01 -2.099188588907671e-01 -3.457563321059209e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.310000000000000e+03 4.823071909689395e-01 -7.770366004281400e-01 -2.098883213658133e-01 -3.457467103082413e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.311000000000000e+03 4.823034565801953e-01 -7.770514485495896e-01 -2.098577824766163e-01 -3.457370868330116e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.312000000000000e+03 4.822997203923717e-01 -7.770662972815576e-01 -2.098272422403167e-01 -3.457274616694392e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.313000000000000e+03 4.822959824446831e-01 -7.770811466030652e-01 -2.097967006319446e-01 -3.457178348244906e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.314000000000000e+03 4.822922427808097e-01 -7.770959964840866e-01 -2.097661576260387e-01 -3.457082063195331e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.315000000000000e+03 4.822885012970125e-01 -7.771108469856499e-01 -2.097356132875504e-01 -3.456985761220641e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.316000000000000e+03 4.822847580639221e-01 -7.771256980695681e-01 -2.097050675715007e-01 -3.456889442460415e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.317000000000000e+03 4.822810131010130e-01 -7.771405497234924e-01 -2.096745204662550e-01 -3.456793106984775e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.318000000000000e+03 4.822772663272253e-01 -7.771554019917345e-01 -2.096439720238764e-01 -3.456696754606287e-01 9.450000000000000e-11 5.790000000000000e-11 2.010000000000000e-11 -9.470000000000001e-12 4.280000000000000e-11 4.330000000000000e-12 -1.660000000000000e-11 5.700000000000000e-11 -1.860000000000000e-11 3.520000000000000e-11</ATTLIST>\n\t\t</ATTLISTList>\n\t</ATT>\n\t<TIL>\n\t\t<BANDID>P</BANDID>\n\t\t<NUMTILES>1</NUMTILES>\n\t\t<TILESIZEX>32837</TILESIZEX>\n\t\t<TILESIZEY>27968</TILESIZEY>\n\t\t<TILEUNITS>Pixels</TILEUNITS>\n\t\t<TILEOVERLAP>0</TILEOVERLAP>\n\t\t<TILE>\n\t\t\t<FILENAME>14JUN19185250-P1BS_R1C1-053644866010_01_P001.TIF</FILENAME>\n\t\t\t<ULCOLOFFSET>0</ULCOLOFFSET>\n\t\t\t<ULROWOFFSET>0</ULROWOFFSET>\n\t\t\t<URCOLOFFSET>32836</URCOLOFFSET>\n\t\t\t<URROWOFFSET>0</URROWOFFSET>\n\t\t\t<LRCOLOFFSET>32836</LRCOLOFFSET>\n\t\t\t<LRROWOFFSET>27967</LRROWOFFSET>\n\t\t\t<LLCOLOFFSET>0</LLCOLOFFSET>\n\t\t\t<LLROWOFFSET>27967</LLROWOFFSET>\n\t\t\t<ULLON>-1.162554465500000e+02</ULLON>\n\t\t\t<ULLAT>3.525504589000000e+01</ULLAT>\n\t\t\t<URLON>-1.160751748600000e+02</URLON>\n\t\t\t<URLAT>3.525505030000000e+01</URLAT>\n\t\t\t<LRLON>-1.160752699600000e+02</LRLON>\n\t\t\t<LRLAT>3.512911635000000e+01</LRLAT>\n\t\t\t<LLLON>-1.162554614000000e+02</LLLON>\n\t\t\t<LLLAT>3.512883153000000e+01</LLLAT>\n\t\t</TILE>\n\t</TIL>\n\t<GEO>\n\t\t<EFFECTIVETIME>2009-10-08T00:00:00.000000Z</EFFECTIVETIME>\n\t\t<MODELGENERATIONTIME>2010-10-26T00:00:00.000000Z</MODELGENERATIONTIME>\n\t\t<SATID>WV02</SATID>\n\t\t<GEOMODELLEVEL>LV1B</GEOMODELLEVEL>\n\t\t<PRINCIPAL_DISTANCE>\n\t\t\t<GENERATIONTIME>2010-01-28T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<PD>1.324613900000000e+04</PD>\n\t\t</PRINCIPAL_DISTANCE>\n\t\t<OPTICAL_DISTORTION>\n\t\t\t<GENERATIONTIME>2009-09-10T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<POLYORDER>-1</POLYORDER>\n\t\t\t<ALISTList/>\n\t\t\t<BLISTList/>\n\t\t</OPTICAL_DISTORTION>\n\t\t<PERSPECTIVE_CENTER>\n\t\t\t<GENERATIONTIME>2009-09-10T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<CX>0.000000000000000e+00</CX>\n\t\t\t<CY>0.000000000000000e+00</CY>\n\t\t\t<CZ>0.000000000000000e+00</CZ>\n\t\t</PERSPECTIVE_CENTER>\n\t\t<CAMERA_ATTITUDE>\n\t\t\t<GENERATIONTIME>2009-09-10T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<QCS1>0.000000000000000e+00</QCS1>\n\t\t\t<QCS2>0.000000000000000e+00</QCS2>\n\t\t\t<QCS3>0.000000000000000e+00</QCS3>\n\t\t\t<QCS4>1.000000000000000e+00</QCS4>\n\t\t</CAMERA_ATTITUDE>\n\t\t<DETECTOR_MOUNTING>\n\t\t\t<GENERATIONTIME>2010-10-26T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<BAND_P>\n\t\t\t\t<BANDID>P</BANDID>\n\t\t\t\t<DETECTOR_ARRAY>\n\t\t\t\t\t<DETARRID>1</DETARRID>\n\t\t\t\t\t<DETORIGINX>-2.590000000000001e-01</DETORIGINX>\n\t\t\t\t\t<DETORIGINY>1.407274054017886e+02</DETORIGINY>\n\t\t\t\t\t<DETROTANGLE>0.000000000000000e+00</DETROTANGLE>\n\t\t\t\t\t<DETPITCH>8.570629999999999e-03</DETPITCH>\n\t\t\t\t</DETECTOR_ARRAY>\n\t\t\t</BAND_P>\n\t\t</DETECTOR_MOUNTING>\n\t</GEO>\n\t<STE>\n\t\t<NUMPAIR>1</NUMPAIR>\n\t\t<STEREO_PAIR>\n\t\t\t<FIRSTID>14JUN19185250-P1BS_R1C1-053644866010_01_P001.TIF</FIRSTID>\n\t\t\t<SECONDID>14JUN19185358-P1BS_R1C1-053644866010_01_P001.TIF</SECONDID>\n\t\t\t<OVERLAP>7.850000000000000e-01</OVERLAP>\n\t\t\t<ULLAT>3.525505000000000e+01</ULLAT>\n\t\t\t<ULLON>-1.162554470000000e+02</ULLON>\n\t\t\t<LRLAT>3.508343700000000e+01</LRLAT>\n\t\t\t<LRLON>-1.160751750000000e+02</LRLON>\n\t\t\t<B_CONV>3.545000000000000e+01</B_CONV>\n\t\t\t<E_CONV>3.532000000000000e+01</E_CONV>\n\t\t\t<B_ASYM>1.243000000000000e+01</B_ASYM>\n\t\t\t<E_ASYM>1.198000000000000e+01</E_ASYM>\n\t\t\t<B_BIE>7.756999999999999e+01</B_BIE>\n\t\t\t<E_BIE>7.802000000000000e+01</E_BIE>\n\t\t</STEREO_PAIR>\n\t</STE>\n\t<RPB>\n\t\t<SATID>WV02</SATID>\n\t\t<BANDID>P</BANDID>\n\t\t<SPECID>RPC00B</SPECID>\n\t\t<IMAGE>\n\t\t\t<ERRBIAS>1.454000000000000e+01</ERRBIAS>\n\t\t\t<ERRRAND>1.300000000000000e-01</ERRRAND>\n\t\t\t<LINEOFFSET>13983</LINEOFFSET>\n\t\t\t<SAMPOFFSET>16418</SAMPOFFSET>\n\t\t\t<LATOFFSET>3.519210000000000e+01</LATOFFSET>\n\t\t\t<LONGOFFSET>-1.161654000000000e+02</LONGOFFSET>\n\t\t\t<HEIGHTOFFSET>594</HEIGHTOFFSET>\n\t\t\t<LINESCALE>13984</LINESCALE>\n\t\t\t<SAMPSCALE>16418</SAMPSCALE>\n\t\t\t<LATSCALE>6.360000000000000e-02</LATSCALE>\n\t\t\t<LONGSCALE>9.030000000000001e-02</LONGSCALE>\n\t\t\t<HEIGHTSCALE>501</HEIGHTSCALE>\n\t\t\t<LINENUMCOEFList>\n\t\t\t\t<LINENUMCOEF>2.479540000000000e-03 2.675170000000000e-03 -1.010216000000000e+00 6.423813000000000e-03 -1.742385000000000e-06 3.192374000000000e-07 -9.397731000000001e-05 -6.025155000000000e-04 -1.514647000000000e-03 1.881127000000000e-07 1.050981000000000e-08 -2.802376000000000e-08 -2.066327000000000e-06 -3.537346000000000e-08 1.055054000000000e-05 4.508760000000000e-05 1.404390000000000e-05 -1.368291000000000e-07 -5.486724000000000e-07 -8.826508000000000e-08</LINENUMCOEF>\n\t\t\t</LINENUMCOEFList>\n\t\t\t<LINEDENCOEFList>\n\t\t\t\t<LINEDENCOEF>1.000000000000000e+00 -6.344514000000000e-06 9.338558000000000e-04 -1.108357000000000e-04 -8.872747000000000e-07 2.164620000000000e-08 -6.529546000000000e-07 -9.531319000000000e-06 2.087914000000000e-05 -1.390645000000000e-05 -3.707711000000000e-08 1.280555000000000e-08 2.833514000000000e-06 0.000000000000000e+00 1.530398000000000e-07 1.587414000000000e-04 2.572976000000000e-08 0.000000000000000e+00 -3.031035000000000e-06 0.000000000000000e+00</LINEDENCOEF>\n\t\t\t</LINEDENCOEFList>\n\t\t\t<SAMPNUMCOEFList>\n\t\t\t\t<SAMPNUMCOEF>-1.016050000000000e-03 1.002044000000000e+00 -5.099750000000000e-05 -1.292898000000000e-03 -3.078930000000000e-04 3.631983000000000e-04 -1.022721000000000e-04 6.293037999999999e-04 -2.928455000000000e-04 2.790148000000000e-07 -5.850374000000000e-08 -5.259033000000000e-06 -5.703175000000000e-06 -1.863973000000000e-06 1.354227000000000e-05 4.641160000000000e-05 -4.840792000000000e-08 3.582499000000000e-07 -9.756388000000000e-07 0.000000000000000e+00</SAMPNUMCOEF>\n\t\t\t</SAMPNUMCOEFList>\n\t\t\t<SAMPDENCOEFList>\n\t\t\t\t<SAMPDENCOEF>1.000000000000000e+00 3.880125000000000e-04 3.083408000000000e-04 -3.652563000000000e-04 -5.119245000000000e-06 0.000000000000000e+00 -3.872237000000000e-08 1.854776000000000e-06 2.857176000000000e-06 -2.075453000000000e-06 -2.115940000000000e-08 0.000000000000000e+00 -3.629210000000000e-08 0.000000000000000e+00 -1.815115000000000e-08 -5.799463000000000e-08 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00</SAMPDENCOEF>\n\t\t\t</SAMPDENCOEFList>\n\t\t</IMAGE>\n\t</RPB>\n</isd>\n"
  },
  {
    "path": "src/asp/Camera/tests/wv_mvp_2.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<isd>\n\t<IMD>\n\t\t<VERSION>24.06</VERSION>\n\t\t<GENERATIONTIME>2014-06-25T14:15:35.000000Z</GENERATIONTIME>\n\t\t<PRODUCTORDERID>053644866010_01_P001</PRODUCTORDERID>\n\t\t<PRODUCTCATALOGID>A03001011C7F3F00</PRODUCTCATALOGID>\n\t\t<CHILDCATALOGID>210001011C7F3E00</CHILDCATALOGID>\n\t\t<IMAGEDESCRIPTOR>Stereo1B</IMAGEDESCRIPTOR>\n\t\t<BANDID>P</BANDID>\n\t\t<PANSHARPENALGORITHM>None</PANSHARPENALGORITHM>\n\t\t<NUMROWS>23640</NUMROWS>\n\t\t<NUMCOLUMNS>35180</NUMCOLUMNS>\n\t\t<PRODUCTLEVEL>Stereo 1B</PRODUCTLEVEL>\n\t\t<PRODUCTTYPE>Stereo</PRODUCTTYPE>\n\t\t<NUMBEROFLOOKS>2</NUMBEROFLOOKS>\n\t\t<RADIOMETRICLEVEL>Corrected</RADIOMETRICLEVEL>\n\t\t<BITSPERPIXEL>16</BITSPERPIXEL>\n\t\t<COMPRESSIONTYPE>None</COMPRESSIONTYPE>\n\t\t<OUTPUTFORMAT>GeoTIFF</OUTPUTFORMAT>\n\t\t<BAND_P>\n\t\t\t<ULLON>-1.162691402400000e+02</ULLON>\n\t\t\t<ULLAT>3.525804882000000e+01</ULLAT>\n\t\t\t<ULHAE>6.306200000000000e+02</ULHAE>\n\t\t\t<URLON>-1.160623710800000e+02</URLON>\n\t\t\t<URLAT>3.527244732000000e+01</URLAT>\n\t\t\t<URHAE>2.667400000000000e+02</URHAE>\n\t\t\t<LRLON>-1.160630790400000e+02</LRLON>\n\t\t\t<LRLAT>3.514412735000000e+01</LRLAT>\n\t\t\t<LRHAE>2.531900000000000e+02</LRHAE>\n\t\t\t<LLLON>-1.162684863300000e+02</LLLON>\n\t\t\t<LLLAT>3.513157338000000e+01</LLLAT>\n\t\t\t<LLHAE>2.994700000000000e+02</LLHAE>\n\t\t\t<ABSCALFACTOR>5.678345000000000e-02</ABSCALFACTOR>\n\t\t\t<EFFECTIVEBANDWIDTH>2.846000000000000e-01</EFFECTIVEBANDWIDTH>\n\t\t\t<TDILEVEL>32</TDILEVEL>\n\t\t</BAND_P>\n\t\t<IMAGE>\n\t\t\t<SATID>WV02</SATID>\n\t\t\t<MODE>FullSwath</MODE>\n\t\t\t<SCANDIRECTION>Forward</SCANDIRECTION>\n\t\t\t<CATID>1030010032134D00</CATID>\n\t\t\t<TLCTIME>2014-06-19T18:53:58.287975Z</TLCTIME>\n\t\t\t<NUMTLC>2</NUMTLC>\n\t\t\t<TLCLISTList>\n\t\t\t\t<TLCLIST>0.000000000000000e+00 0.000000000000000e+00</TLCLIST>\n\t\t\t\t<TLCLIST>3.546400000000000e+04 1.773200000000000e+00</TLCLIST>\n\t\t\t</TLCLISTList>\n\t\t\t<FIRSTLINETIME>2014-06-19T18:53:58.287975Z</FIRSTLINETIME>\n\t\t\t<AVGLINERATE>2.000000000000000e+04</AVGLINERATE>\n\t\t\t<EXPOSUREDURATION>1.600000000000000e-03</EXPOSUREDURATION>\n\t\t\t<MINCOLLECTEDROWGSD>5.990000000000000e-01</MINCOLLECTEDROWGSD>\n\t\t\t<MAXCOLLECTEDROWGSD>6.050000000000000e-01</MAXCOLLECTEDROWGSD>\n\t\t\t<MEANCOLLECTEDROWGSD>6.020000000000000e-01</MEANCOLLECTEDROWGSD>\n\t\t\t<MINCOLLECTEDCOLGSD>5.320000000000000e-01</MINCOLLECTEDCOLGSD>\n\t\t\t<MAXCOLLECTEDCOLGSD>5.330000000000000e-01</MAXCOLLECTEDCOLGSD>\n\t\t\t<MEANCOLLECTEDCOLGSD>5.320000000000000e-01</MEANCOLLECTEDCOLGSD>\n\t\t\t<MEANCOLLECTEDGSD>5.659999999999999e-01</MEANCOLLECTEDGSD>\n\t\t\t<MEANPRODUCTROWGSD>6.050000000000000e-01</MEANPRODUCTROWGSD>\n\t\t\t<MEANPRODUCTCOLGSD>5.340000000000000e-01</MEANPRODUCTCOLGSD>\n\t\t\t<MEANPRODUCTGSD>5.690000000000000e-01</MEANPRODUCTGSD>\n\t\t\t<ROWUNCERTAINTY>5.634000000000000e+01</ROWUNCERTAINTY>\n\t\t\t<COLUNCERTAINTY>4.238000000000000e+01</COLUNCERTAINTY>\n\t\t\t<MINSUNAZ>1.320000000000000e+02</MINSUNAZ>\n\t\t\t<MAXSUNAZ>1.324000000000000e+02</MAXSUNAZ>\n\t\t\t<MEANSUNAZ>1.322000000000000e+02</MEANSUNAZ>\n\t\t\t<MINSUNEL>7.380000000000000e+01</MINSUNEL>\n\t\t\t<MAXSUNEL>7.380000000000000e+01</MAXSUNEL>\n\t\t\t<MEANSUNEL>7.380000000000000e+01</MEANSUNEL>\n\t\t\t<MINSATAZ>1.936000000000000e+02</MINSATAZ>\n\t\t\t<MAXSATAZ>1.936000000000000e+02</MAXSATAZ>\n\t\t\t<MEANSATAZ>1.936000000000000e+02</MEANSATAZ>\n\t\t\t<MINSATEL>5.960000000000000e+01</MINSATEL>\n\t\t\t<MAXSATEL>6.010000000000000e+01</MAXSATEL>\n\t\t\t<MEANSATEL>5.980000000000000e+01</MEANSATEL>\n\t\t\t<MININTRACKVIEWANGLE>-2.660000000000000e+01</MININTRACKVIEWANGLE>\n\t\t\t<MAXINTRACKVIEWANGLE>-2.630000000000000e+01</MAXINTRACKVIEWANGLE>\n\t\t\t<MEANINTRACKVIEWANGLE>-2.640000000000000e+01</MEANINTRACKVIEWANGLE>\n\t\t\t<MINCROSSTRACKVIEWANGLE>-1.700000000000000e+00</MINCROSSTRACKVIEWANGLE>\n\t\t\t<MAXCROSSTRACKVIEWANGLE>-1.500000000000000e+00</MAXCROSSTRACKVIEWANGLE>\n\t\t\t<MEANCROSSTRACKVIEWANGLE>-1.600000000000000e+00</MEANCROSSTRACKVIEWANGLE>\n\t\t\t<MINOFFNADIRVIEWANGLE>2.630000000000000e+01</MINOFFNADIRVIEWANGLE>\n\t\t\t<MAXOFFNADIRVIEWANGLE>2.660000000000000e+01</MAXOFFNADIRVIEWANGLE>\n\t\t\t<MEANOFFNADIRVIEWANGLE>2.650000000000000e+01</MEANOFFNADIRVIEWANGLE>\n\t\t\t<PNIIRS>4.800000000000000e+00</PNIIRS>\n\t\t\t<CLOUDCOVER>0.000000000000000e+00</CLOUDCOVER>\n\t\t\t<RESAMPLINGKERNEL>MTF</RESAMPLINGKERNEL>\n\t\t\t<POSITIONKNOWLEDGESRC>R</POSITIONKNOWLEDGESRC>\n\t\t\t<ATTITUDEKNOWLEDGESRC>R</ATTITUDEKNOWLEDGESRC>\n\t\t\t<REVNUMBER>24638</REVNUMBER>\n\t\t</IMAGE>\n\t</IMD>\n\t<EPH>\n\t\t<SATID>WV02</SATID>\n\t\t<REVNUMBER>24638</REVNUMBER>\n\t\t<STRIPID>32134D</STRIPID>\n\t\t<TYPE>R</TYPE>\n\t\t<VERSION>A</VERSION>\n\t\t<GENERATIONTIME>2014-06-19T19:36:03.928341Z</GENERATIONTIME>\n\t\t<STARTTIME>2014-06-19T18:53:46.118937Z</STARTTIME>\n\t\t<NUMPOINTS>1305</NUMPOINTS>\n\t\t<TIMEINTERVAL>2.000000000000000e-02</TIMEINTERVAL>\n\t\t<EPHEMLISTList>\n\t\t\t<EPHEMLIST>1.000000000000000e+00 -2.732012917896721e+06 -5.378221278823855e+06 3.822750360324236e+06 -3.334754101596712e+03 -2.734176406155461e+03 -6.211024976631162e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.000000000000000e+00 -2.732079611313953e+06 -5.378275959937119e+06 3.822626141413337e+06 -3.334702611957084e+03 -2.734049551601681e+03 -6.211108831243751e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.000000000000000e+00 -2.732146303714129e+06 -5.378330638526047e+06 3.822501920798615e+06 -3.334651122760710e+03 -2.733922699609604e+03 -6.211192680360878e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.000000000000000e+00 -2.732212995045926e+06 -5.378385314539533e+06 3.822377698588658e+06 -3.334599634220006e+03 -2.733795850228557e+03 -6.211276523859010e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.000000000000000e+00 -2.732279685394549e+06 -5.378439988062434e+06 3.822253474603167e+06 -3.334548140358944e+03 -2.733668994141884e+03 -6.211360368968600e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.000000000000000e+00 -2.732346374730059e+06 -5.378494659064979e+06 3.822129248905419e+06 -3.334496643173237e+03 -2.733542135555295e+03 -6.211444212757937e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.000000000000000e+00 -2.732413062978128e+06 -5.378549327473145e+06 3.822005021652721e+06 -3.334445149293901e+03 -2.733415282972237e+03 -6.211528048071146e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.000000000000000e+00 -2.732479750242812e+06 -5.378603993390578e+06 3.821880792624830e+06 -3.334393649421314e+03 -2.733288424109247e+03 -6.211611885112959e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.000000000000000e+00 -2.732546436449771e+06 -5.378658656743261e+06 3.821756561979054e+06 -3.334342150713154e+03 -2.733161567692414e+03 -6.211695716373179e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.000000000000000e+01 -2.732613121643575e+06 -5.378713317575582e+06 3.821632329621056e+06 -3.334290648821011e+03 -2.733034708408976e+03 -6.211779546419655e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.100000000000000e+01 -2.732679805824087e+06 -5.378767975887436e+06 3.821508095551073e+06 -3.334239143617842e+03 -2.732907846432084e+03 -6.211863375230620e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.200000000000000e+01 -2.732746488946769e+06 -5.378822631634482e+06 3.821383859863369e+06 -3.334187639549296e+03 -2.732780986735422e+03 -6.211947198352840e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.300000000000000e+01 -2.732813171071080e+06 -5.378877284875929e+06 3.821259622432082e+06 -3.334136131112789e+03 -2.732654122464673e+03 -6.212031021627713e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.400000000000000e+01 -2.732879852152196e+06 -5.378931935567194e+06 3.821135383352015e+06 -3.334084621275214e+03 -2.732527259298033e+03 -6.212114840969998e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.500000000000000e+01 -2.732946532205167e+06 -5.378986583723241e+06 3.821011142591352e+06 -3.334033110906808e+03 -2.732400394598805e+03 -6.212198657212100e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.600000000000000e+01 -2.733013211200072e+06 -5.379041229314321e+06 3.820886900213361e+06 -3.333981599918643e+03 -2.732273532966104e+03 -6.212282468225841e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.700000000000000e+01 -2.733079889211258e+06 -5.379095872414459e+06 3.820762656060658e+06 -3.333930083729118e+03 -2.732146664876479e+03 -6.212366280674929e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.800000000000000e+01 -2.733146566164399e+06 -5.379150512949667e+06 3.820638410290567e+06 -3.333878568816818e+03 -2.732019798885146e+03 -6.212450087454403e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.900000000000000e+01 -2.733213242133837e+06 -5.379205150993966e+06 3.820514162745687e+06 -3.333827048346561e+03 -2.731892926291611e+03 -6.212533895906100e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.000000000000000e+01 -2.733279917044966e+06 -5.379259786473139e+06 3.820389913583884e+06 -3.333775527637082e+03 -2.731766057126567e+03 -6.212617698778713e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.100000000000000e+01 -2.733346590912843e+06 -5.379314419402149e+06 3.820265662773334e+06 -3.333724007270881e+03 -2.731639188009078e+03 -6.212701497391896e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.200000000000000e+01 -2.733413263781916e+06 -5.379369049825274e+06 3.820141410219856e+06 -3.333672482001716e+03 -2.731512314470896e+03 -6.212785296337486e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.300000000000000e+01 -2.733479935607656e+06 -5.379423677698198e+06 3.820017156017738e+06 -3.333620956750547e+03 -2.731385441510290e+03 -6.212869090927604e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.400000000000000e+01 -2.733546606404832e+06 -5.379478303035636e+06 3.819892900135684e+06 -3.333569429254753e+03 -2.731258567777751e+03 -6.212952882870160e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.500000000000000e+01 -2.733613276173307e+06 -5.379532925837494e+06 3.819768642573928e+06 -3.333517899555025e+03 -2.731131693340466e+03 -6.213036672114205e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.600000000000000e+01 -2.733679944913235e+06 -5.379587546103897e+06 3.819644383332162e+06 -3.333466368953405e+03 -2.731004816911441e+03 -6.213120458650377e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.700000000000000e+01 -2.733746612624486e+06 -5.379642163834754e+06 3.819520122410624e+06 -3.333414836011818e+03 -2.730877940095177e+03 -6.213204242402685e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.800000000000000e+01 -2.733813279321818e+06 -5.379696779044784e+06 3.819395859778014e+06 -3.333363299793715e+03 -2.730751060471664e+03 -6.213288024955715e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.900000000000000e+01 -2.733879944930929e+06 -5.379751391660030e+06 3.819271595591685e+06 -3.333311766789944e+03 -2.730624186960908e+03 -6.213371799030590e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.000000000000000e+01 -2.733946609570823e+06 -5.379806001798934e+06 3.819147329599620e+06 -3.333260227352891e+03 -2.730497304990666e+03 -6.213455576065826e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.100000000000000e+01 -2.734013273166903e+06 -5.379860609387320e+06 3.819023061959711e+06 -3.333208686575801e+03 -2.730370424458267e+03 -6.213539348983310e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.200000000000000e+01 -2.734079935749111e+06 -5.379915214454939e+06 3.818898792608588e+06 -3.333157144157145e+03 -2.730243539898972e+03 -6.213623120502484e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.300000000000000e+01 -2.734146597272544e+06 -5.379969816957178e+06 3.818774521641257e+06 -3.333105600783080e+03 -2.730116658991566e+03 -6.213706886678184e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.400000000000000e+01 -2.734213257782032e+06 -5.380024416938614e+06 3.818650248962826e+06 -3.333054055645795e+03 -2.729989774412236e+03 -6.213790651345777e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.500000000000000e+01 -2.734279917277439e+06 -5.380079014399149e+06 3.818525974573520e+06 -3.333002507106159e+03 -2.729862887290536e+03 -6.213874414748301e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.600000000000000e+01 -2.734346575713965e+06 -5.380133609294242e+06 3.818401698568172e+06 -3.332950958274574e+03 -2.729736003262582e+03 -6.213958172756891e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.700000000000000e+01 -2.734413233166211e+06 -5.380188201698103e+06 3.818277420788819e+06 -3.332899405630643e+03 -2.729609111851750e+03 -6.214041931976023e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.800000000000000e+01 -2.734479889544711e+06 -5.380242791521740e+06 3.818153141424889e+06 -3.332847853648252e+03 -2.729482225342529e+03 -6.214125684498068e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.900000000000000e+01 -2.734546544908889e+06 -5.380297378824313e+06 3.818028860350481e+06 -3.332796298449171e+03 -2.729355336266612e+03 -6.214209435678539e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.000000000000000e+01 -2.734613199244012e+06 -5.380351963591144e+06 3.817904577596829e+06 -3.332744742363563e+03 -2.729228445468078e+03 -6.214293184016900e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.100000000000000e+01 -2.734679852535057e+06 -5.380406545807330e+06 3.817780293195696e+06 -3.332693184810723e+03 -2.729101556142464e+03 -6.214376928282011e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.200000000000000e+01 -2.734746504811664e+06 -5.380461125502381e+06 3.817656007084250e+06 -3.332641623959413e+03 -2.728974663977763e+03 -6.214460671372431e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.300000000000000e+01 -2.734813156088886e+06 -5.380515702691247e+06 3.817531719230647e+06 -3.332590060681048e+03 -2.728847766057488e+03 -6.214544414249901e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.400000000000000e+01 -2.734879806277260e+06 -5.380570277284976e+06 3.817407429824342e+06 -3.332538498703332e+03 -2.728720875463708e+03 -6.214628148986540e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.500000000000000e+01 -2.734946455480863e+06 -5.380624849387126e+06 3.817283138644805e+06 -3.332486931406173e+03 -2.728593978208953e+03 -6.214711885305176e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.600000000000000e+01 -2.735013103625416e+06 -5.380679418923792e+06 3.817158845849427e+06 -3.332435365358976e+03 -2.728467083166292e+03 -6.214795615917114e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.700000000000000e+01 -2.735079750785130e+06 -5.380733985968837e+06 3.817034551280925e+06 -3.332383793629806e+03 -2.728340181923444e+03 -6.214879348064939e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.800000000000000e+01 -2.735146396855945e+06 -5.380788550418749e+06 3.816910255159763e+06 -3.332332224796451e+03 -2.728213286813460e+03 -6.214963071880701e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.900000000000000e+01 -2.735213041941941e+06 -5.380843112377066e+06 3.816785957265409e+06 -3.332280650892635e+03 -2.728086384884652e+03 -6.215046797234233e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.000000000000000e+01 -2.735279685938781e+06 -5.380897671740055e+06 3.816661657818869e+06 -3.332229078685654e+03 -2.727959490403960e+03 -6.215130514203973e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.100000000000000e+01 -2.735346328965704e+06 -5.380952228626296e+06 3.816537356567519e+06 -3.332177501328935e+03 -2.727832586372330e+03 -6.215214234035530e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.200000000000000e+01 -2.735412970977926e+06 -5.381006782991271e+06 3.816413053606212e+06 -3.332125920965710e+03 -2.727705679641223e+03 -6.215297952487591e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.300000000000000e+01 -2.735479611915764e+06 -5.381061334775658e+06 3.816288749061344e+06 -3.332074341161083e+03 -2.727578777740725e+03 -6.215381664327593e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.400000000000000e+01 -2.735546251824040e+06 -5.381115884024019e+06 3.816164442837994e+06 -3.332022760616426e+03 -2.727451874628275e+03 -6.215465373015810e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.500000000000000e+01 -2.735612890717495e+06 -5.381170430751046e+06 3.816040134904849e+06 -3.331971176621931e+03 -2.727324968587402e+03 -6.215549080642102e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.600000000000000e+01 -2.735679528610893e+06 -5.381224974971443e+06 3.815915825230599e+06 -3.331919588427625e+03 -2.727198057959074e+03 -6.215632788342101e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.700000000000000e+01 -2.735746165429958e+06 -5.381279516611338e+06 3.815791513972655e+06 -3.331868002318655e+03 -2.727071151566536e+03 -6.215716488988855e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.800000000000000e+01 -2.735812801204235e+06 -5.381334055700159e+06 3.815667201068342e+06 -3.331816414396242e+03 -2.726944246497457e+03 -6.215800185797804e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.900000000000000e+01 -2.735879436008298e+06 -5.381388592312039e+06 3.815542886359645e+06 -3.331764821737422e+03 -2.726817332310322e+03 -6.215883885066999e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.000000000000000e+01 -2.735946069767592e+06 -5.381443126372888e+06 3.815418570004507e+06 -3.331713227666606e+03 -2.726690419285163e+03 -6.215967580384320e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.100000000000000e+01 -2.736012702467107e+06 -5.381497657867799e+06 3.815294252034710e+06 -3.331661633321035e+03 -2.726563509207447e+03 -6.216051270371741e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.200000000000000e+01 -2.736079334136761e+06 -5.381552186826505e+06 3.815169932386864e+06 -3.331610038095916e+03 -2.726436597543308e+03 -6.216134957449721e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.300000000000000e+01 -2.736145964821071e+06 -5.381606713293306e+06 3.815045610966564e+06 -3.331558437541065e+03 -2.726309679501820e+03 -6.216218645977349e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.400000000000000e+01 -2.736212594445498e+06 -5.381661237194111e+06 3.814921287931771e+06 -3.331506836939465e+03 -2.726182764402916e+03 -6.216302329069819e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.500000000000000e+01 -2.736279223025069e+06 -5.381715758543856e+06 3.814796963250636e+06 -3.331455236159108e+03 -2.726055849686345e+03 -6.216386007994860e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.600000000000000e+01 -2.736345850589421e+06 -5.381770277372034e+06 3.814672636860301e+06 -3.331403632310301e+03 -2.725928932171173e+03 -6.216469685615754e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.700000000000000e+01 -2.736412477123540e+06 -5.381824793663750e+06 3.814548308792541e+06 -3.331352025778335e+03 -2.725802014350217e+03 -6.216553360577114e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.800000000000000e+01 -2.736479102657341e+06 -5.381879307448721e+06 3.814423978983965e+06 -3.331300416916804e+03 -2.725675090248661e+03 -6.216637035523226e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.900000000000000e+01 -2.736545727086529e+06 -5.381933818623309e+06 3.814299647655634e+06 -3.331248810416495e+03 -2.725548175915224e+03 -6.216720700684957e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.000000000000000e+01 -2.736612350544895e+06 -5.381988327320540e+06 3.814175314523851e+06 -3.331197197533945e+03 -2.725421252670549e+03 -6.216804368984999e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.100000000000000e+01 -2.736678972928434e+06 -5.382042833437004e+06 3.814050979809158e+06 -3.331145587205591e+03 -2.725294333599322e+03 -6.216888030042391e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.200000000000000e+01 -2.736745594311320e+06 -5.382097337046485e+06 3.813926643354216e+06 -3.331093971694737e+03 -2.725167410423453e+03 -6.216971691409079e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.300000000000000e+01 -2.736812214708580e+06 -5.382151838163904e+06 3.813802305127169e+06 -3.331042352509417e+03 -2.725040479451854e+03 -6.217055354108232e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.400000000000000e+01 -2.736878834045687e+06 -5.382206336715213e+06 3.813677965286001e+06 -3.330990732919579e+03 -2.724913551881992e+03 -6.217139011326514e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.500000000000000e+01 -2.736945452292754e+06 -5.382260832670732e+06 3.813553623894049e+06 -3.330939115142075e+03 -2.724786631321922e+03 -6.217222660319481e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.600000000000000e+01 -2.737012069583845e+06 -5.382315326163707e+06 3.813429280667054e+06 -3.330887491398513e+03 -2.724659699405891e+03 -6.217306313402257e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.700000000000000e+01 -2.737078685784917e+06 -5.382369817060933e+06 3.813304935889205e+06 -3.330835869412772e+03 -2.724532774441583e+03 -6.217389958313195e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.800000000000000e+01 -2.737145301029748e+06 -5.382424305495403e+06 3.813180589276779e+06 -3.330784240165764e+03 -2.724405839033502e+03 -6.217473607496250e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.900000000000000e+01 -2.737211915199463e+06 -5.382478791348954e+06 3.813056241081877e+06 -3.330732613012464e+03 -2.724278907906059e+03 -6.217557249605231e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.000000000000000e+01 -2.737278528338568e+06 -5.382533274665851e+06 3.812931891210081e+06 -3.330680983570053e+03 -2.724151975946260e+03 -6.217640889116171e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.100000000000000e+01 -2.737345140417169e+06 -5.382587755416422e+06 3.812807539724732e+06 -3.330629353678778e+03 -2.724025047325021e+03 -6.217724523198276e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.200000000000000e+01 -2.737411751494937e+06 -5.382642233659944e+06 3.812683186499314e+06 -3.330577721075384e+03 -2.723898113036021e+03 -6.217808157156012e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.300000000000000e+01 -2.737478361541887e+06 -5.382696709366670e+06 3.812558831597344e+06 -3.330526085678888e+03 -2.723771178280275e+03 -6.217891788581950e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.400000000000000e+01 -2.737544970558178e+06 -5.382751182536732e+06 3.812434475018518e+06 -3.330474449467368e+03 -2.723644241898794e+03 -6.217975417086337e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.500000000000000e+01 -2.737611578573429e+06 -5.382805653199601e+06 3.812310116699960e+06 -3.330422809117572e+03 -2.723517300751808e+03 -6.218059045715364e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.600000000000000e+01 -2.737678185513121e+06 -5.382860121281264e+06 3.812185756799680e+06 -3.330371168990742e+03 -2.723390365116994e+03 -6.218142667576778e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.700000000000000e+01 -2.737744791451791e+06 -5.382914586855768e+06 3.812061395159600e+06 -3.330319526328952e+03 -2.723263423794992e+03 -6.218226289238471e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.800000000000000e+01 -2.737811396329806e+06 -5.382969049863885e+06 3.811937031906165e+06 -3.330267883279439e+03 -2.723136485356409e+03 -6.218309905657188e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.900000000000000e+01 -2.737878000161914e+06 -5.383023510320306e+06 3.811812667008067e+06 -3.330216238985490e+03 -2.723009548579932e+03 -6.218393517812052e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.000000000000000e+01 -2.737944603037513e+06 -5.383077968313831e+06 3.811688300275655e+06 -3.330164588840714e+03 -2.722882599863196e+03 -6.218477134272158e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.100000000000000e+01 -2.738011204807724e+06 -5.383132423696579e+06 3.811563932024733e+06 -3.330112941332848e+03 -2.722755660699414e+03 -6.218560740926236e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.200000000000000e+01 -2.738077805576539e+06 -5.383186876571903e+06 3.811439562034632e+06 -3.330061289444599e+03 -2.722628716599206e+03 -6.218644347898999e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.300000000000000e+01 -2.738144405329238e+06 -5.383241326925146e+06 3.811315190336610e+06 -3.330009635965479e+03 -2.722501768766427e+03 -6.218727953306691e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.400000000000000e+01 -2.738211004021065e+06 -5.383295774711897e+06 3.811190817025570e+06 -3.329957981884821e+03 -2.722374824694858e+03 -6.218811553160690e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.500000000000000e+01 -2.738277601696511e+06 -5.383350219976375e+06 3.811066442007074e+06 -3.329906324626737e+03 -2.722247877477797e+03 -6.218895151923179e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.600000000000000e+01 -2.738344198355731e+06 -5.383404662718715e+06 3.810942065280815e+06 -3.329854665593210e+03 -2.722120926598673e+03 -6.218978749174451e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.700000000000000e+01 -2.738410793953878e+06 -5.383459102894414e+06 3.810817686941887e+06 -3.329803005674934e+03 -2.721993979475181e+03 -6.219062341008843e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.800000000000000e+01 -2.738477388535718e+06 -5.383513540547937e+06 3.810693306895300e+06 -3.329751343826658e+03 -2.721867028555759e+03 -6.219145931467916e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.900000000000000e+01 -2.738543982101132e+06 -5.383567975679182e+06 3.810568925141294e+06 -3.329699678816132e+03 -2.721740075083728e+03 -6.219229520549352e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.000000000000000e+02 -2.738610574590493e+06 -5.383622408228953e+06 3.810444541806346e+06 -3.329648014691416e+03 -2.721613126521710e+03 -6.219313102835958e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.010000000000000e+02 -2.738677166108056e+06 -5.383676838300806e+06 3.810320156669219e+06 -3.329596345262074e+03 -2.721486168873923e+03 -6.219396687825351e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.020000000000000e+02 -2.738743756549584e+06 -5.383731265791222e+06 3.810195769951080e+06 -3.329544676712503e+03 -2.721359216140030e+03 -6.219480266021207e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.030000000000000e+02 -2.738810346004186e+06 -5.383785690788738e+06 3.810071381462790e+06 -3.329493002981453e+03 -2.721232256702296e+03 -6.219563845742402e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.040000000000000e+02 -2.738876934367910e+06 -5.383840113190094e+06 3.809946991424984e+06 -3.329441332362249e+03 -2.721105303643361e+03 -6.219647416928544e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.050000000000000e+02 -2.738943521714977e+06 -5.383894533069045e+06 3.809822599680077e+06 -3.329389658261411e+03 -2.720978347817001e+03 -6.219730986988658e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.060000000000000e+02 -2.739010108060133e+06 -5.383948950440260e+06 3.809698206196746e+06 -3.329337980029352e+03 -2.720851387406495e+03 -6.219814557082299e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.070000000000000e+02 -2.739076693358914e+06 -5.384003365259562e+06 3.809573811069375e+06 -3.329286301943651e+03 -2.720724427130613e+03 -6.219898122973827e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.080000000000000e+02 -2.739143277625965e+06 -5.384057777541546e+06 3.809449414266809e+06 -3.329234620836466e+03 -2.720597466719787e+03 -6.219981686285620e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.090000000000000e+02 -2.739209860876316e+06 -5.384112187301115e+06 3.809325015757184e+06 -3.329182938310518e+03 -2.720470502421722e+03 -6.220065248022666e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.100000000000000e+02 -2.739276443065217e+06 -5.384166594493868e+06 3.809200615635424e+06 -3.329131255137819e+03 -2.720343541452216e+03 -6.220148804432789e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.110000000000000e+02 -2.739343024252018e+06 -5.384220999178777e+06 3.809076213775506e+06 -3.329079567708843e+03 -2.720216575884983e+03 -6.220232360941227e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.120000000000000e+02 -2.739409604392265e+06 -5.384275401311668e+06 3.808951810271820e+06 -3.329027880505497e+03 -2.720089610449106e+03 -6.220315913211969e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.130000000000000e+02 -2.739476183500696e+06 -5.384329800907219e+06 3.808827405093036e+06 -3.328976190892506e+03 -2.719962644537733e+03 -6.220399462774032e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.140000000000000e+02 -2.739542761547449e+06 -5.384384197935794e+06 3.808702998302519e+06 -3.328924501282017e+03 -2.719835681545052e+03 -6.220483006895744e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.150000000000000e+02 -2.739609338607003e+06 -5.384438592471360e+06 3.808578589742132e+06 -3.328872807363828e+03 -2.719708711294957e+03 -6.220566552387922e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.160000000000000e+02 -2.739675914649506e+06 -5.384492984484280e+06 3.808454179475235e+06 -3.328821110438676e+03 -2.719581738023690e+03 -6.220650096647944e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.170000000000000e+02 -2.739742489600474e+06 -5.384547373900641e+06 3.808329767659912e+06 -3.328769414958934e+03 -2.719454772188748e+03 -6.220733632666675e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.180000000000000e+02 -2.739809063549282e+06 -5.384601760809159e+06 3.808205354106450e+06 -3.328717717129556e+03 -2.719327800595842e+03 -6.220817168427505e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.190000000000000e+02 -2.739875636480916e+06 -5.384656145194970e+06 3.808080938846639e+06 -3.328666015467531e+03 -2.719200826457949e+03 -6.220900703122366e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.200000000000000e+02 -2.739942208350653e+06 -5.384710527013689e+06 3.807956521975432e+06 -3.328614313766044e+03 -2.719073855405198e+03 -6.220984232319224e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.210000000000000e+02 -2.740008779203243e+06 -5.384764906309736e+06 3.807832103397808e+06 -3.328562610130175e+03 -2.718946880791903e+03 -6.221067760030722e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.220000000000000e+02 -2.740075349023592e+06 -5.384819283068172e+06 3.807707683145753e+06 -3.328510903762778e+03 -2.718819905629438e+03 -6.221151285220078e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.230000000000000e+02 -2.740141917796990e+06 -5.384873657274378e+06 3.807583261250540e+06 -3.328459197418611e+03 -2.718692931098601e+03 -6.221234806033378e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.240000000000000e+02 -2.740208485597635e+06 -5.384928029002045e+06 3.807458837554537e+06 -3.328407484952581e+03 -2.718565947812152e+03 -6.221318329774098e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.250000000000000e+02 -2.740275052321331e+06 -5.384982398147765e+06 3.807334412278980e+06 -3.328355772927434e+03 -2.718438969628751e+03 -6.221401846844048e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.260000000000000e+02 -2.740341617997968e+06 -5.385036764741186e+06 3.807209985360424e+06 -3.328304061445634e+03 -2.718311991609099e+03 -6.221485359512191e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.270000000000000e+02 -2.740408182642277e+06 -5.385091128796975e+06 3.807085556767530e+06 -3.328252347212152e+03 -2.718185013192369e+03 -6.221568869596495e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.280000000000000e+02 -2.740474746268996e+06 -5.385145490329787e+06 3.806961126468958e+06 -3.328200629962200e+03 -2.718058031993177e+03 -6.221652378340615e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.290000000000000e+02 -2.740541308848544e+06 -5.385199849310241e+06 3.806836694527555e+06 -3.328148912880566e+03 -2.717931050917068e+03 -6.221735882879160e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.300000000000000e+02 -2.740607870410522e+06 -5.385254205767760e+06 3.806712260880403e+06 -3.328097192321683e+03 -2.717804067535387e+03 -6.221819386071150e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.310000000000000e+02 -2.740674430954792e+06 -5.385308559702230e+06 3.806587825527733e+06 -3.328045468449741e+03 -2.717677081048761e+03 -6.221902888213790e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.320000000000000e+02 -2.740740990451786e+06 -5.385362911084283e+06 3.806463388532396e+06 -3.327993744926280e+03 -2.717550095035274e+03 -6.221986385901759e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.330000000000000e+02 -2.740807548916142e+06 -5.385417259928498e+06 3.806338949863225e+06 -3.327942018512101e+03 -2.717423108666905e+03 -6.222069881051584e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.340000000000000e+02 -2.740874106348007e+06 -5.385471606235015e+06 3.806214509519919e+06 -3.327890291226829e+03 -2.717296120711851e+03 -6.222153373288055e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.350000000000000e+02 -2.740940662717529e+06 -5.385525949974222e+06 3.806090067565857e+06 -3.327838563460185e+03 -2.717169135752486e+03 -6.222236860279094e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.360000000000000e+02 -2.741007218084028e+06 -5.385580291205034e+06 3.805965623874979e+06 -3.327786831833430e+03 -2.717042146269605e+03 -6.222320347143685e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.370000000000000e+02 -2.741073772462514e+06 -5.385634629942329e+06 3.805841178415398e+06 -3.327735095994450e+03 -2.716915149236102e+03 -6.222403835466534e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.380000000000000e+02 -2.741140325719102e+06 -5.385688966053259e+06 3.805716731471534e+06 -3.327683363922818e+03 -2.716788163095717e+03 -6.222487312838159e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.390000000000000e+02 -2.741206878017135e+06 -5.385743299699975e+06 3.805592282696282e+06 -3.327631624460889e+03 -2.716661166911858e+03 -6.222570794335374e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.400000000000000e+02 -2.741273429252746e+06 -5.385797630779359e+06 3.805467832310375e+06 -3.327579886528635e+03 -2.716534172358852e+03 -6.222654270278706e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.410000000000000e+02 -2.741339979455516e+06 -5.385851959320825e+06 3.805343380250889e+06 -3.327528145866643e+03 -2.716407177581410e+03 -6.222737743546848e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.420000000000000e+02 -2.741406528610453e+06 -5.385906285309514e+06 3.805218926549640e+06 -3.327476403961302e+03 -2.716280183822026e+03 -6.222821212856556e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.430000000000000e+02 -2.741473076747441e+06 -5.385960608775061e+06 3.805094471143170e+06 -3.327424660560730e+03 -2.716153186549755e+03 -6.222904680450012e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.440000000000000e+02 -2.741539623866340e+06 -5.386014929717356e+06 3.804970014031700e+06 -3.327372913534882e+03 -2.716026186231109e+03 -6.222988147112927e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.450000000000000e+02 -2.741606169937304e+06 -5.386069248106826e+06 3.804845555278635e+06 -3.327321165288932e+03 -2.715899187704675e+03 -6.223071609443749e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.460000000000000e+02 -2.741672714975335e+06 -5.386123563958340e+06 3.804721094852085e+06 -3.327269415923582e+03 -2.715772187285633e+03 -6.223155069121675e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.470000000000000e+02 -2.741739258995079e+06 -5.386177877286464e+06 3.804596632720882e+06 -3.327217663273919e+03 -2.715645184254281e+03 -6.223238527504669e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.480000000000000e+02 -2.741805801937247e+06 -5.386232188032367e+06 3.804472169011050e+06 -3.327165912387378e+03 -2.715518185771457e+03 -6.223321978857944e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.490000000000000e+02 -2.741872343905722e+06 -5.386286496299147e+06 3.804347703501750e+06 -3.327114155440250e+03 -2.715391178492635e+03 -6.223405433122177e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.500000000000000e+02 -2.741938884811216e+06 -5.386340801998254e+06 3.804223236382704e+06 -3.327062397918359e+03 -2.715264174781095e+03 -6.223488881918873e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.510000000000000e+02 -2.742005424668749e+06 -5.386395105144555e+06 3.804098767622031e+06 -3.327010640896893e+03 -2.715137170891992e+03 -6.223572326495591e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.520000000000000e+02 -2.742071963493048e+06 -5.386449405752703e+06 3.803974297188383e+06 -3.326958881516637e+03 -2.715010166544680e+03 -6.223655768331946e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.530000000000000e+02 -2.742138501313682e+06 -5.386503703852084e+06 3.803849825018822e+06 -3.326907117401976e+03 -2.714883157716786e+03 -6.223739210431761e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.540000000000000e+02 -2.742205038086243e+06 -5.386557999398599e+06 3.803725351207796e+06 -3.326855353663285e+03 -2.714756148975892e+03 -6.223822648246409e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.550000000000000e+02 -2.742271573825465e+06 -5.386612292406898e+06 3.803600875723955e+06 -3.326803587919809e+03 -2.714629139552957e+03 -6.223906083258520e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.560000000000000e+02 -2.742338108575766e+06 -5.386666582921098e+06 3.803476398472778e+06 -3.326751816433684e+03 -2.714502123640319e+03 -6.223989519949650e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.570000000000000e+02 -2.742404642218465e+06 -5.386720870823419e+06 3.803351919706643e+06 -3.326700049447110e+03 -2.714375115654761e+03 -6.224072946740739e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.580000000000000e+02 -2.742471174842469e+06 -5.386775156202122e+06 3.803227439236451e+06 -3.326648278664896e+03 -2.714248105427418e+03 -6.224156372304020e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.590000000000000e+02 -2.742537706477639e+06 -5.386829439086813e+06 3.803102956998726e+06 -3.326596503709993e+03 -2.714121087716494e+03 -6.224239799271167e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.600000000000000e+02 -2.742604237034712e+06 -5.386883719388971e+06 3.802978473183210e+06 -3.326544729610714e+03 -2.713994074991401e+03 -6.224323219433869e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.610000000000000e+02 -2.742670766528417e+06 -5.386937997123240e+06 3.802853987758567e+06 -3.326492955370153e+03 -2.713867065700357e+03 -6.224406633989029e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.620000000000000e+02 -2.742737295077738e+06 -5.386992272407635e+06 3.802729500471789e+06 -3.326441174056900e+03 -2.713740042958167e+03 -6.224490054107967e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.630000000000000e+02 -2.742803822519151e+06 -5.387046545079970e+06 3.802605011670566e+06 -3.326389395613328e+03 -2.713613029036868e+03 -6.224573464678604e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.640000000000000e+02 -2.742870348971351e+06 -5.387100815258025e+06 3.802480521102434e+06 -3.326337611598516e+03 -2.713486008888491e+03 -6.224656876723202e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.650000000000000e+02 -2.742936874375084e+06 -5.387155082883000e+06 3.802356028893444e+06 -3.326285828078429e+03 -2.713358988660315e+03 -6.224740284505439e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.660000000000000e+02 -2.743003398774773e+06 -5.387209347998991e+06 3.802231534949053e+06 -3.326234040062513e+03 -2.713231963893140e+03 -6.224823692464181e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.670000000000000e+02 -2.743069922096018e+06 -5.387263610532238e+06 3.802107039427453e+06 -3.326182252704058e+03 -2.713104944609909e+03 -6.224907093480138e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.680000000000000e+02 -2.743136444383542e+06 -5.387317870527078e+06 3.801982542233563e+06 -3.326130464644584e+03 -2.712977923217244e+03 -6.224990491747410e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.690000000000000e+02 -2.743202965652057e+06 -5.387372127998139e+06 3.801858043336034e+06 -3.326078673083153e+03 -2.712850899489927e+03 -6.225073888691140e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.700000000000000e+02 -2.743269485886586e+06 -5.387426382930595e+06 3.801733542766687e+06 -3.326026879437361e+03 -2.712723874993091e+03 -6.225157282910877e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.710000000000000e+02 -2.743336005102127e+06 -5.387480635339305e+06 3.801609040493621e+06 -3.325975083774665e+03 -2.712596846664821e+03 -6.225240675807452e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.720000000000000e+02 -2.743402523253902e+06 -5.387534885179910e+06 3.801484536612031e+06 -3.325923287433807e+03 -2.712469822111794e+03 -6.225324063191097e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.730000000000000e+02 -2.743469040401470e+06 -5.387589132511455e+06 3.801360030995242e+06 -3.325871488102567e+03 -2.712342791881415e+03 -6.225407450573761e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.740000000000000e+02 -2.743535556470446e+06 -5.387643377260203e+06 3.801235523801449e+06 -3.325819689725358e+03 -2.712215766669986e+03 -6.225490831093032e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.750000000000000e+02 -2.743602071564650e+06 -5.387697619529155e+06 3.801111014809739e+06 -3.325767884590098e+03 -2.712088733288003e+03 -6.225574214552384e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.760000000000000e+02 -2.743668585580286e+06 -5.387751859215343e+06 3.800986504240959e+06 -3.325716082176891e+03 -2.711961703713449e+03 -6.225657590882407e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.770000000000000e+02 -2.743735098576623e+06 -5.387806096377588e+06 3.800861991968968e+06 -3.325664276092217e+03 -2.711834671679791e+03 -6.225740966026496e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.780000000000000e+02 -2.743801610523827e+06 -5.387860330986330e+06 3.800737478057185e+06 -3.325612468761597e+03 -2.711707640808898e+03 -6.225824337147962e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.790000000000000e+02 -2.743868121451754e+06 -5.387914563071161e+06 3.800612962442125e+06 -3.325560659685069e+03 -2.711580606306703e+03 -6.225907706724537e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.800000000000000e+02 -2.743934631360273e+06 -5.387968792631975e+06 3.800488445124009e+06 -3.325508847215946e+03 -2.711453569076153e+03 -6.225991075109406e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.810000000000000e+02 -2.744001140219549e+06 -5.388023019639230e+06 3.800363926166271e+06 -3.325457033349647e+03 -2.711326533289972e+03 -6.226074439411259e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.820000000000000e+02 -2.744067648059434e+06 -5.388077244122510e+06 3.800239405505414e+06 -3.325405217707751e+03 -2.711199493891325e+03 -6.226157802173084e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.830000000000000e+02 -2.744134154864860e+06 -5.388131466066908e+06 3.800114883173443e+06 -3.325353399457794e+03 -2.711072453776963e+03 -6.226241162432330e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.840000000000000e+02 -2.744200660606277e+06 -5.388185685443118e+06 3.799990359233254e+06 -3.325301582195370e+03 -2.710945416153069e+03 -6.226324516996568e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.850000000000000e+02 -2.744267165298404e+06 -5.388239902265770e+06 3.799865833653475e+06 -3.325249763554807e+03 -2.710818379822599e+03 -6.226407867539951e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.860000000000000e+02 -2.744333669015349e+06 -5.388294116608365e+06 3.799741306276361e+06 -3.325197938773718e+03 -2.710691334837279e+03 -6.226491220956157e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.870000000000000e+02 -2.744400171638481e+06 -5.388348328353277e+06 3.799616777354387e+06 -3.325146116954982e+03 -2.710564296111021e+03 -6.226574565985976e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.880000000000000e+02 -2.744466673271609e+06 -5.388402537603442e+06 3.799492246666600e+06 -3.325094290087210e+03 -2.710437250733509e+03 -6.226657912437552e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.890000000000000e+02 -2.744533173855205e+06 -5.388456744299886e+06 3.799367714339624e+06 -3.325042461664009e+03 -2.710310206530042e+03 -6.226741255007563e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.900000000000000e+02 -2.744599673433969e+06 -5.388510948486893e+06 3.799243180278367e+06 -3.324990630690753e+03 -2.710183156834686e+03 -6.226824597280097e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.910000000000000e+02 -2.744666171918682e+06 -5.388565150076072e+06 3.799118644672646e+06 -3.324938801095673e+03 -2.710056114401932e+03 -6.226907931444214e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.920000000000000e+02 -2.744732669398294e+06 -5.388619349155618e+06 3.798994107333103e+06 -3.324886967150916e+03 -2.709929067013238e+03 -6.226991265907749e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.930000000000000e+02 -2.744799165843274e+06 -5.388673545696233e+06 3.798869568322642e+06 -3.324835132872130e+03 -2.709802018166451e+03 -6.227074597145031e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.940000000000000e+02 -2.744865661223792e+06 -5.388727739668395e+06 3.798745027704689e+06 -3.324783297893841e+03 -2.709674972600917e+03 -6.227157923113566e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.950000000000000e+02 -2.744932155628791e+06 -5.388781931160285e+06 3.798620485289869e+06 -3.324731456524869e+03 -2.709547918259688e+03 -6.227241252126802e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.960000000000000e+02 -2.744998648984189e+06 -5.388836120098470e+06 3.798495941235892e+06 -3.324679615369125e+03 -2.709420864530578e+03 -6.227324576688664e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.970000000000000e+02 -2.745065141260088e+06 -5.388890306453346e+06 3.798371395606368e+06 -3.324627774628068e+03 -2.709293815794674e+03 -6.227407894657674e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.980000000000000e+02 -2.745131632560540e+06 -5.388944490328045e+06 3.798246848179787e+06 -3.324575928985967e+03 -2.709166758082543e+03 -6.227491215063000e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.990000000000000e+02 -2.745198122766663e+06 -5.388998671604757e+06 3.798122299209191e+06 -3.324524084812901e+03 -2.709039707205836e+03 -6.227574527518814e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.000000000000000e+02 -2.745264611997078e+06 -5.389052850401087e+06 3.797997748442001e+06 -3.324472234592857e+03 -2.708912647846279e+03 -6.227657842719390e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.010000000000000e+02 -2.745331100148035e+06 -5.389107026614189e+06 3.797873196099132e+06 -3.324420386550641e+03 -2.708785592642898e+03 -6.227741150888795e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.020000000000000e+02 -2.745397587308458e+06 -5.389161200332232e+06 3.797748641991191e+06 -3.324368532890964e+03 -2.708658531008212e+03 -6.227824460641938e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.030000000000000e+02 -2.745464073359475e+06 -5.389215371437429e+06 3.797624086371251e+06 -3.324316682179581e+03 -2.708531478340543e+03 -6.227907760754761e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.040000000000000e+02 -2.745530558434824e+06 -5.389269540062307e+06 3.797499528954569e+06 -3.324264826687651e+03 -2.708404416155808e+03 -6.227991063498412e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.050000000000000e+02 -2.745597042460159e+06 -5.389323706133222e+06 3.797374969899394e+06 -3.324212969601037e+03 -2.708277355264290e+03 -6.228074362324309e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.060000000000000e+02 -2.745663525494715e+06 -5.389377869708905e+06 3.797250409079543e+06 -3.324161107393380e+03 -2.708150287813079e+03 -6.228157662559344e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.070000000000000e+02 -2.745730007405073e+06 -5.389432030657120e+06 3.797125846779167e+06 -3.324109250289197e+03 -2.708023230382265e+03 -6.228240951649135e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.080000000000000e+02 -2.745796488339425e+06 -5.389486189124770e+06 3.797001282682614e+06 -3.324057386512522e+03 -2.707896164771162e+03 -6.228324243634868e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.090000000000000e+02 -2.745862968223711e+06 -5.389540345038454e+06 3.796876716947616e+06 -3.324005522735369e+03 -2.707769099491038e+03 -6.228407531402175e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.100000000000000e+02 -2.745929447087485e+06 -5.389594498427481e+06 3.796752149511187e+06 -3.323953655712965e+03 -2.707642031390457e+03 -6.228490817949430e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.110000000000000e+02 -2.745995924856415e+06 -5.389648649218229e+06 3.796627580531602e+06 -3.323901790404686e+03 -2.707514970483752e+03 -6.228574096267678e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.120000000000000e+02 -2.746062401664217e+06 -5.389702797543179e+06 3.796503009724089e+06 -3.323849919308680e+03 -2.707387898326283e+03 -6.228657378497868e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.130000000000000e+02 -2.746128877421711e+06 -5.389756943314005e+06 3.796378437278526e+06 -3.323798046722608e+03 -2.707260827210888e+03 -6.228740656878711e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.140000000000000e+02 -2.746195352099095e+06 -5.389811086501196e+06 3.796253863258360e+06 -3.323746174949354e+03 -2.707133761071877e+03 -6.228823928490464e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.150000000000000e+02 -2.746261825755884e+06 -5.389865227163708e+06 3.796129287536867e+06 -3.323694301530810e+03 -2.707006691657205e+03 -6.228907198341782e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.160000000000000e+02 -2.746328298406773e+06 -5.389919365316143e+06 3.796004710082656e+06 -3.323642423363883e+03 -2.706879617585030e+03 -6.228990468537351e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.170000000000000e+02 -2.746394769962606e+06 -5.389973500870187e+06 3.795880131085631e+06 -3.323590547265862e+03 -2.706752550622833e+03 -6.229073730377765e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.180000000000000e+02 -2.746461240571923e+06 -5.390027633972988e+06 3.795755550229372e+06 -3.323538664089255e+03 -2.706625469973110e+03 -6.229156997872609e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.190000000000000e+02 -2.746527710115881e+06 -5.390081764506845e+06 3.795630967767006e+06 -3.323486780874779e+03 -2.706498392700087e+03 -6.229240259745729e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.200000000000000e+02 -2.746594178609187e+06 -5.390135892486356e+06 3.795506383667151e+06 -3.323434895930296e+03 -2.706371316854218e+03 -6.229323517703238e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.210000000000000e+02 -2.746660646066836e+06 -5.390190017926355e+06 3.795381797897901e+06 -3.323383010591646e+03 -2.706244239079645e+03 -6.229406772682732e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.220000000000000e+02 -2.746727112488598e+06 -5.390244140826670e+06 3.795257210459657e+06 -3.323331122193390e+03 -2.706117161063769e+03 -6.229490025150731e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.230000000000000e+02 -2.746793577844955e+06 -5.390298261158039e+06 3.795132621415354e+06 -3.323279235057044e+03 -2.705990085277484e+03 -6.229573271921764e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.240000000000000e+02 -2.746860042224798e+06 -5.390352379008548e+06 3.795008030575536e+06 -3.323227341515255e+03 -2.705863000954822e+03 -6.229656521624998e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.250000000000000e+02 -2.746926505494458e+06 -5.390406494245826e+06 3.794883438224962e+06 -3.323175450669020e+03 -2.705735925811063e+03 -6.229739761715264e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.260000000000000e+02 -2.746992967787632e+06 -5.390460607002271e+06 3.794758844078809e+06 -3.323123555400577e+03 -2.705608840736159e+03 -6.229823004455166e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.270000000000000e+02 -2.747059429044826e+06 -5.390514717219012e+06 3.794634248263756e+06 -3.323071657160434e+03 -2.705481755550170e+03 -6.229906244581362e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.280000000000000e+02 -2.747125889280755e+06 -5.390568824910631e+06 3.794509650748422e+06 -3.323019755914132e+03 -2.705354667253914e+03 -6.229989483508900e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.290000000000000e+02 -2.747192348421392e+06 -5.390622930003798e+06 3.794385051690592e+06 -3.322967857971813e+03 -2.705227585288022e+03 -6.230072713867159e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.300000000000000e+02 -2.747258806555618e+06 -5.390677032586580e+06 3.794260450900796e+06 -3.322915955631323e+03 -2.705100498768188e+03 -6.230155944354879e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.310000000000000e+02 -2.747325263653628e+06 -5.390731132629490e+06 3.794135848442501e+06 -3.322864050693107e+03 -2.704973411483186e+03 -6.230239172358222e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.320000000000000e+02 -2.747391719730414e+06 -5.390785230147356e+06 3.794011244283794e+06 -3.322812144424167e+03 -2.704846320584668e+03 -6.230322398609565e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.330000000000000e+02 -2.747458174741249e+06 -5.390839325095923e+06 3.793886638519926e+06 -3.322760237015604e+03 -2.704719233158759e+03 -6.230405619714804e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.340000000000000e+02 -2.747524628760450e+06 -5.390893417548784e+06 3.793762030992514e+06 -3.322708325804022e+03 -2.704592138198439e+03 -6.230488842058648e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.350000000000000e+02 -2.747591081669217e+06 -5.390947507388317e+06 3.793637421954733e+06 -3.322656417279623e+03 -2.704465052424576e+03 -6.230572054793266e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.360000000000000e+02 -2.747657533615761e+06 -5.391001594761322e+06 3.793512811090637e+06 -3.322604501683516e+03 -2.704337955978378e+03 -6.230655271766096e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.370000000000000e+02 -2.747723984496394e+06 -5.391055679565113e+06 3.793388198621247e+06 -3.322552586910898e+03 -2.704210861994628e+03 -6.230738483141129e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.380000000000000e+02 -2.747790434310987e+06 -5.391109761799583e+06 3.793263584546803e+06 -3.322500672013809e+03 -2.704083771120259e+03 -6.230821689062872e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.390000000000000e+02 -2.747856883133575e+06 -5.391163841538084e+06 3.793138968709435e+06 -3.322448751762405e+03 -2.703956673647206e+03 -6.230904896515518e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.400000000000000e+02 -2.747923330890147e+06 -5.391217918707301e+06 3.793014351266945e+06 -3.322396832817087e+03 -2.703829578378114e+03 -6.230988098264494e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.410000000000000e+02 -2.747989777654738e+06 -5.391271993380582e+06 3.792889732061460e+06 -3.322344908427073e+03 -2.703702476706534e+03 -6.231071301494892e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.420000000000000e+02 -2.748056223338212e+06 -5.391326065469703e+06 3.792765111282934e+06 -3.322292984475235e+03 -2.703575380021088e+03 -6.231154498133150e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.430000000000000e+02 -2.748122668000058e+06 -5.391380135033544e+06 3.792640488804592e+06 -3.322241059154527e+03 -2.703448279793230e+03 -6.231237693003688e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.440000000000000e+02 -2.748189111654981e+06 -5.391434202086690e+06 3.792515864595034e+06 -3.322189129355149e+03 -2.703321174783575e+03 -6.231320888145633e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.450000000000000e+02 -2.748255554213851e+06 -5.391488266540939e+06 3.792391238844229e+06 -3.322137201160057e+03 -2.703194077137474e+03 -6.231404075040101e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.460000000000000e+02 -2.748321995780644e+06 -5.391542328499210e+06 3.792266611330519e+06 -3.322085269157365e+03 -2.703066971773701e+03 -6.231487263258477e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.470000000000000e+02 -2.748388436266153e+06 -5.391596387873232e+06 3.792141982244050e+06 -3.322033337420586e+03 -2.702939872063514e+03 -6.231570444655781e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.480000000000000e+02 -2.748454875774341e+06 -5.391650444765914e+06 3.792017351363160e+06 -3.321981400820072e+03 -2.702812762746447e+03 -6.231653628753120e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.490000000000000e+02 -2.748521314186432e+06 -5.391704499059704e+06 3.791892718941069e+06 -3.321929465897374e+03 -2.702685660654119e+03 -6.231736804634175e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.500000000000000e+02 -2.748587751635765e+06 -5.391758550886631e+06 3.791768084693391e+06 -3.321877523527260e+03 -2.702558547893469e+03 -6.231819984923412e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.510000000000000e+02 -2.748654188003862e+06 -5.391812600129385e+06 3.791643448872825e+06 -3.321825583716592e+03 -2.702431439427810e+03 -6.231903157947133e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.520000000000000e+02 -2.748720623305415e+06 -5.391866646802553e+06 3.791518811447971e+06 -3.321773643167992e+03 -2.702304334275979e+03 -6.231986325712506e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.530000000000000e+02 -2.748787057599612e+06 -5.391920690964755e+06 3.791394172292571e+06 -3.321721698476896e+03 -2.702177224408727e+03 -6.232069493559425e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.540000000000000e+02 -2.748853490856949e+06 -5.391974732586762e+06 3.791269531469569e+06 -3.321669753074420e+03 -2.702050112769403e+03 -6.232152658504425e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.550000000000000e+02 -2.748919923077296e+06 -5.392028771668480e+06 3.791144888979193e+06 -3.321617805270081e+03 -2.701923000614117e+03 -6.232235820756852e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.560000000000000e+02 -2.748986354230859e+06 -5.392082808180454e+06 3.791020244884941e+06 -3.321565857011887e+03 -2.701795891733060e+03 -6.232318977636406e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.570000000000000e+02 -2.749052784406765e+06 -5.392136842210882e+06 3.790895598996737e+06 -3.321513904002112e+03 -2.701668773080559e+03 -6.232402137237526e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.580000000000000e+02 -2.749119213530645e+06 -5.392190873686199e+06 3.790770951473136e+06 -3.321461949307264e+03 -2.701541656109621e+03 -6.232485292785821e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.590000000000000e+02 -2.749185641573000e+06 -5.392244902577197e+06 3.790646302377088e+06 -3.321409996726267e+03 -2.701414543392036e+03 -6.232568441299257e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.600000000000000e+02 -2.749252068637494e+06 -5.392298928986500e+06 3.790521651487427e+06 -3.321358037805231e+03 -2.701287422140770e+03 -6.232651592703443e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.610000000000000e+02 -2.749318494635022e+06 -5.392352952825962e+06 3.790396998994158e+06 -3.321306078470859e+03 -2.701160303952789e+03 -6.232734738814326e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.620000000000000e+02 -2.749384919580571e+06 -5.392406974110390e+06 3.790272344865359e+06 -3.321254119555544e+03 -2.701033186300554e+03 -6.232817880417871e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.630000000000000e+02 -2.749451343503666e+06 -5.392460992869040e+06 3.790147689037992e+06 -3.321202157153831e+03 -2.700906065843155e+03 -6.232901020904117e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.640000000000000e+02 -2.749517766389345e+06 -5.392515009087133e+06 3.790023031543926e+06 -3.321150192426800e+03 -2.700778944775802e+03 -6.232984158705636e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.650000000000000e+02 -2.749584188237763e+06 -5.392569022764807e+06 3.789898372382858e+06 -3.321098227004823e+03 -2.700651821833806e+03 -6.233067293645241e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.660000000000000e+02 -2.749650609048788e+06 -5.392623033901962e+06 3.789773711555016e+06 -3.321046259073599e+03 -2.700524698351718e+03 -6.233150425954002e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.670000000000000e+02 -2.749717028807461e+06 -5.392677042483833e+06 3.789649049092273e+06 -3.320994289967128e+03 -2.700397576276116e+03 -6.233233554099417e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.680000000000000e+02 -2.749783447573239e+06 -5.392731048569229e+06 3.789524384867795e+06 -3.320942317061566e+03 -2.700270446337180e+03 -6.233316683627964e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.690000000000000e+02 -2.749849865286692e+06 -5.392785052099374e+06 3.789399719008342e+06 -3.320890342838186e+03 -2.700143317801881e+03 -6.233399809061334e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.700000000000000e+02 -2.749916281918035e+06 -5.392839053044842e+06 3.789275051577410e+06 -3.320838369142307e+03 -2.700016194526429e+03 -6.233482927738714e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.710000000000000e+02 -2.749982697526723e+06 -5.392893051464430e+06 3.789150382448172e+06 -3.320786393743636e+03 -2.699889067456402e+03 -6.233566044921075e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.720000000000000e+02 -2.750049112142180e+06 -5.392947047387298e+06 3.789025711557771e+06 -3.320734412609171e+03 -2.699761934167486e+03 -6.233649163630146e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.730000000000000e+02 -2.750115525660784e+06 -5.393001040710918e+06 3.788901039127340e+06 -3.320682434498560e+03 -2.699634807163287e+03 -6.233732273934578e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.740000000000000e+02 -2.750181938171352e+06 -5.393055031523188e+06 3.788776364967303e+06 -3.320630452036729e+03 -2.699507675436214e+03 -6.233815384419326e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.750000000000000e+02 -2.750248349629284e+06 -5.393109019780015e+06 3.788651689172802e+06 -3.320578468500337e+03 -2.699380545145743e+03 -6.233898490680021e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.760000000000000e+02 -2.750314760123666e+06 -5.393163005569511e+06 3.788527011553720e+06 -3.320526479091890e+03 -2.699253402954178e+03 -6.233981601173807e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.770000000000000e+02 -2.750381169520963e+06 -5.393216988759605e+06 3.788402332395006e+06 -3.320474491141047e+03 -2.699126268272042e+03 -6.234064703429496e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.780000000000000e+02 -2.750447577850690e+06 -5.393270969379530e+06 3.788277651633632e+06 -3.320422502993212e+03 -2.698999136844135e+03 -6.234147800203933e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.790000000000000e+02 -2.750513985172293e+06 -5.393324947488073e+06 3.788152969142745e+06 -3.320370512306936e+03 -2.698871999499203e+03 -6.234230896862267e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.800000000000000e+02 -2.750580391455989e+06 -5.393378923055811e+06 3.788028284985849e+06 -3.320318518736932e+03 -2.698744861805799e+03 -6.234313990976508e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.810000000000000e+02 -2.750646796716474e+06 -5.393432896097302e+06 3.787903599131543e+06 -3.320266522267589e+03 -2.698617721261804e+03 -6.234397083717556e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.820000000000000e+02 -2.750713200924257e+06 -5.393486866583366e+06 3.787778911642798e+06 -3.320214525888731e+03 -2.698490581138321e+03 -6.234480172160490e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.830000000000000e+02 -2.750779604093936e+06 -5.393540834528477e+06 3.787654222488387e+06 -3.320162526736709e+03 -2.698363440271470e+03 -6.234563258191060e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.840000000000000e+02 -2.750846006196016e+06 -5.393594799903461e+06 3.787529531731290e+06 -3.320110528578296e+03 -2.698236302184500e+03 -6.234646338402809e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.850000000000000e+02 -2.750912407319293e+06 -5.393648762796171e+06 3.787404839181900e+06 -3.320058524368222e+03 -2.698109155240234e+03 -6.234729421513862e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.860000000000000e+02 -2.750978807374716e+06 -5.393702723118554e+06 3.787280145030284e+06 -3.320006519671198e+03 -2.697982011548822e+03 -6.234812499281232e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.870000000000000e+02 -2.751045206406891e+06 -5.393756680914723e+06 3.787155449181230e+06 -3.319954513110855e+03 -2.697854864350797e+03 -6.234895575493695e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.880000000000000e+02 -2.751111604386055e+06 -5.393810636155261e+06 3.787030751698238e+06 -3.319902505356435e+03 -2.697727718154862e+03 -6.234978647741055e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.890000000000000e+02 -2.751178001326896e+06 -5.393864588854730e+06 3.786906052549913e+06 -3.319850495250157e+03 -2.697600571600085e+03 -6.235061717199515e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.900000000000000e+02 -2.751244397214744e+06 -5.393918538998606e+06 3.786781351767592e+06 -3.319798485401499e+03 -2.697473425128528e+03 -6.235144782438875e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.910000000000000e+02 -2.751310792064287e+06 -5.393972486601449e+06 3.786656649319861e+06 -3.319746473061760e+03 -2.697346277967875e+03 -6.235227845108327e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.920000000000000e+02 -2.751377185890214e+06 -5.394026431677816e+06 3.786531945175312e+06 -3.319694457455541e+03 -2.697219128143050e+03 -6.235310906489697e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.930000000000000e+02 -2.751443578692682e+06 -5.394080374227836e+06 3.786407239333646e+06 -3.319642440292653e+03 -2.697091974571229e+03 -6.235393966283577e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.940000000000000e+02 -2.751509970427101e+06 -5.394134314207455e+06 3.786282531890024e+06 -3.319590422478654e+03 -2.696964824589613e+03 -6.235477020655233e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.950000000000000e+02 -2.751576361137792e+06 -5.394188251660536e+06 3.786157822749745e+06 -3.319538401421434e+03 -2.696837671603796e+03 -6.235560073885710e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.960000000000000e+02 -2.751642750795272e+06 -5.394242186557906e+06 3.786033111975799e+06 -3.319486380516991e+03 -2.696710519186596e+03 -6.235643122721101e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.970000000000000e+02 -2.751709139458591e+06 -5.394296118957988e+06 3.785908399442017e+06 -3.319434354064169e+03 -2.696583360012752e+03 -6.235726173240305e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.980000000000000e+02 -2.751775527053811e+06 -5.394350048787679e+06 3.785783685306322e+06 -3.319382328444759e+03 -2.696456203815096e+03 -6.235809217926379e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.990000000000000e+02 -2.751841913580801e+06 -5.394403976046862e+06 3.785658969568942e+06 -3.319330302607510e+03 -2.696329050190306e+03 -6.235892257460390e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.000000000000000e+02 -2.751908299143148e+06 -5.394457900838000e+06 3.785534252008600e+06 -3.319278269562891e+03 -2.696201886437455e+03 -6.235975301022278e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.010000000000000e+02 -2.751974683578031e+06 -5.394511823000076e+06 3.785409532973092e+06 -3.319226241860773e+03 -2.696074732579917e+03 -6.236058333421726e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.020000000000000e+02 -2.752041067033471e+06 -5.394565742679493e+06 3.785284812146193e+06 -3.319174207531568e+03 -2.695947570414239e+03 -6.236141368730979e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.030000000000000e+02 -2.752107449450071e+06 -5.394619659817548e+06 3.785160089654717e+06 -3.319122170872221e+03 -2.695820407412065e+03 -6.236224401463018e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.040000000000000e+02 -2.752173830798364e+06 -5.394673574385081e+06 3.785035365561659e+06 -3.319070135644984e+03 -2.695693246403604e+03 -6.236307428538366e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.050000000000000e+02 -2.752240211122658e+06 -5.394727486425941e+06 3.784910639772309e+06 -3.319018096866542e+03 -2.695566083190472e+03 -6.236390454244973e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.060000000000000e+02 -2.752306590422822e+06 -5.394781395940028e+06 3.784785912286900e+06 -3.318966054922349e+03 -2.695438917063911e+03 -6.236473478730988e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.070000000000000e+02 -2.752372968624936e+06 -5.394835302854246e+06 3.784661183263374e+06 -3.318914015924459e+03 -2.695311757371389e+03 -6.236556494788484e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.080000000000000e+02 -2.752439345876918e+06 -5.394889207314872e+06 3.784536452385653e+06 -3.318861968495612e+03 -2.695184585113968e+03 -6.236639516576949e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.090000000000000e+02 -2.752505722045594e+06 -5.394943109190234e+06 3.784411719938273e+06 -3.318809922997098e+03 -2.695057417234723e+03 -6.236722531368271e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.100000000000000e+02 -2.752572097190090e+06 -5.394997008538819e+06 3.784286985794872e+06 -3.318757874316811e+03 -2.694930246870593e+03 -6.236805544747264e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.110000000000000e+02 -2.752638471265829e+06 -5.395050905316592e+06 3.784162250050631e+06 -3.318705825016305e+03 -2.694803079614838e+03 -6.236888552915587e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.120000000000000e+02 -2.752704844302603e+06 -5.395104799552971e+06 3.784037512641953e+06 -3.318653775474510e+03 -2.694675910526063e+03 -6.236971557989850e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.130000000000000e+02 -2.752771216344703e+06 -5.395158691291795e+06 3.783912773474112e+06 -3.318601720066602e+03 -2.694548735113519e+03 -6.237054564692735e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.140000000000000e+02 -2.752837587332755e+06 -5.395212580474387e+06 3.783788032673947e+06 -3.318549663397355e+03 -2.694421560841591e+03 -6.237137567399265e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.150000000000000e+02 -2.752903957237294e+06 -5.395266467071607e+06 3.783663290304463e+06 -3.318497609418545e+03 -2.694294390839844e+03 -6.237220562803757e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.160000000000000e+02 -2.752970326132239e+06 -5.395320351156563e+06 3.783538546207626e+06 -3.318445550433758e+03 -2.694167216204341e+03 -6.237303558648683e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.170000000000000e+02 -2.753036693987840e+06 -5.395374232699866e+06 3.783413800446981e+06 -3.318393489497410e+03 -2.694040040819281e+03 -6.237386551698602e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.180000000000000e+02 -2.753103060789437e+06 -5.395428111687026e+06 3.783289053053877e+06 -3.318341428725018e+03 -2.693912865858651e+03 -6.237469540416701e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.190000000000000e+02 -2.753169426581340e+06 -5.395481988161845e+06 3.783164303933582e+06 -3.318289363737465e+03 -2.693785685949564e+03 -6.237552529349882e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.200000000000000e+02 -2.753235791333780e+06 -5.395535862094957e+06 3.783039553149645e+06 -3.318237296227246e+03 -2.693658505792151e+03 -6.237635515523153e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.210000000000000e+02 -2.753302155017305e+06 -5.395589733457220e+06 3.782914800765062e+06 -3.318185229983078e+03 -2.693531327642916e+03 -6.237718496113074e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.220000000000000e+02 -2.753368517676111e+06 -5.395643602292370e+06 3.782790046685287e+06 -3.318133159981546e+03 -2.693404147141476e+03 -6.237801475498427e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.230000000000000e+02 -2.753434879265925e+06 -5.395697468556631e+06 3.782665291004982e+06 -3.318081091044900e+03 -2.693276968868933e+03 -6.237884449292716e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.240000000000000e+02 -2.753501239860660e+06 -5.395751332323088e+06 3.782540533566102e+06 -3.318029016877115e+03 -2.693149784195926e+03 -6.237967424451473e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.250000000000000e+02 -2.753567599430567e+06 -5.395805193562364e+06 3.782415774432193e+06 -3.317976939190994e+03 -2.693022596740327e+03 -6.238050398492812e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.260000000000000e+02 -2.753633957901761e+06 -5.395859052201428e+06 3.782291013761229e+06 -3.317924865123487e+03 -2.692895415343590e+03 -6.238133363969398e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.270000000000000e+02 -2.753700315362955e+06 -5.395912908327984e+06 3.782166251363511e+06 -3.317872786380782e+03 -2.692768229568787e+03 -6.238216329611194e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.280000000000000e+02 -2.753766671769599e+06 -5.395966761898037e+06 3.782041487334237e+06 -3.317820706468235e+03 -2.692641044878315e+03 -6.238299291241025e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.290000000000000e+02 -2.753833027166264e+06 -5.396020612955611e+06 3.781916721578137e+06 -3.317768623687049e+03 -2.692513854712278e+03 -6.238382252697843e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.300000000000000e+02 -2.753899381508401e+06 -5.396074461456717e+06 3.781791954190412e+06 -3.317716539639689e+03 -2.692386665644963e+03 -6.238465210181176e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.310000000000000e+02 -2.753965734810682e+06 -5.396128307415891e+06 3.781667185139641e+06 -3.317664453129893e+03 -2.692259476245615e+03 -6.238548164915436e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.320000000000000e+02 -2.754032087043644e+06 -5.396182150804002e+06 3.781542414488837e+06 -3.317612367868045e+03 -2.692132288681446e+03 -6.238631114156568e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.330000000000000e+02 -2.754098438281107e+06 -5.396235991694025e+06 3.781417642080118e+06 -3.317560277039643e+03 -2.692005095068688e+03 -6.238714064754506e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.340000000000000e+02 -2.754164788463987e+06 -5.396289830027578e+06 3.781292868039818e+06 -3.317508186083441e+03 -2.691877901787640e+03 -6.238797011201323e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.350000000000000e+02 -2.754231137636574e+06 -5.396343665848448e+06 3.781168092273186e+06 -3.317456090925218e+03 -2.691750703782333e+03 -6.238879957750794e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.360000000000000e+02 -2.754297485754314e+06 -5.396397499112648e+06 3.781043314875442e+06 -3.317403994316567e+03 -2.691623507039729e+03 -6.238962900337363e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.370000000000000e+02 -2.754363832787760e+06 -5.396451329791064e+06 3.780918535909603e+06 -3.317351900293749e+03 -2.691496314497934e+03 -6.239045835707605e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.380000000000000e+02 -2.754430178840410e+06 -5.396505157985984e+06 3.780793755154273e+06 -3.317299799523671e+03 -2.691369113489140e+03 -6.239128774108125e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.390000000000000e+02 -2.754496523793693e+06 -5.396558983580303e+06 3.780668972862981e+06 -3.317247700464308e+03 -2.691241919796857e+03 -6.239211704258443e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.400000000000000e+02 -2.754562867721791e+06 -5.396612806647280e+06 3.780544188877115e+06 -3.317195599866869e+03 -2.691114722068545e+03 -6.239294632943736e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.410000000000000e+02 -2.754629210639376e+06 -5.396666627201445e+06 3.780419403165239e+06 -3.317143494785378e+03 -2.690987519934184e+03 -6.239377561715697e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.420000000000000e+02 -2.754695552501899e+06 -5.396720445198822e+06 3.780294615822580e+06 -3.317091388283809e+03 -2.690860319090540e+03 -6.239460486498069e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.430000000000000e+02 -2.754761893324320e+06 -5.396774260654178e+06 3.780169826817175e+06 -3.317039281199147e+03 -2.690733116725504e+03 -6.239543408202110e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.440000000000000e+02 -2.754828233106515e+06 -5.396828073567402e+06 3.780045036149247e+06 -3.316987171815516e+03 -2.690605913181380e+03 -6.239626327473149e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.450000000000000e+02 -2.754894571833538e+06 -5.396881883923785e+06 3.779920243850705e+06 -3.316935060830107e+03 -2.690478711415588e+03 -6.239709242614099e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.460000000000000e+02 -2.754960909564756e+06 -5.396935691781942e+06 3.779795449794579e+06 -3.316882946109591e+03 -2.690351501836045e+03 -6.239792159069190e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.470000000000000e+02 -2.755027246240740e+06 -5.396989497083213e+06 3.779670654107944e+06 -3.316830829852099e+03 -2.690224293854320e+03 -6.239875071447369e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.480000000000000e+02 -2.755093581846834e+06 -5.397043299813111e+06 3.779545856822162e+06 -3.316778714563136e+03 -2.690097088212435e+03 -6.239957978231314e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.490000000000000e+02 -2.755159916397710e+06 -5.397097099986167e+06 3.779421057905803e+06 -3.316726597820735e+03 -2.689969883883056e+03 -6.240040881031931e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.500000000000000e+02 -2.755226249937648e+06 -5.397150897646135e+06 3.779296257264101e+06 -3.316674476998528e+03 -2.689842674845532e+03 -6.240123783868797e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.510000000000000e+02 -2.755292582481595e+06 -5.397204692807762e+06 3.779171454865085e+06 -3.316622352392310e+03 -2.689715458164552e+03 -6.240206687962676e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.520000000000000e+02 -2.755358913911014e+06 -5.397258485354013e+06 3.779046650962322e+06 -3.316570230214817e+03 -2.689588250816306e+03 -6.240289582539493e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.530000000000000e+02 -2.755425244329378e+06 -5.397312275387115e+06 3.778921845334381e+06 -3.316518103823049e+03 -2.689461038752015e+03 -6.240372477218813e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.540000000000000e+02 -2.755491573722042e+06 -5.397366062892578e+06 3.778797038012620e+06 -3.316465975784105e+03 -2.689333823046780e+03 -6.240455370299944e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.550000000000000e+02 -2.755557902044474e+06 -5.397419847826458e+06 3.778672229092277e+06 -3.316413847298116e+03 -2.689206610532324e+03 -6.240538258056658e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.560000000000000e+02 -2.755624229340939e+06 -5.397473630232499e+06 3.778547418478584e+06 -3.316361715384150e+03 -2.689079395365445e+03 -6.240621144591436e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.570000000000000e+02 -2.755690555596798e+06 -5.397527410096229e+06 3.778422606202908e+06 -3.316309582995563e+03 -2.688952178516475e+03 -6.240704028071590e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.580000000000000e+02 -2.755756880797017e+06 -5.397581187402856e+06 3.778297792297322e+06 -3.316257448361438e+03 -2.688824963343073e+03 -6.240786907771731e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.590000000000000e+02 -2.755823205000951e+06 -5.397634962210964e+06 3.778172976634850e+06 -3.316205310228889e+03 -2.688697740531313e+03 -6.240869788591315e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.600000000000000e+02 -2.755889528104872e+06 -5.397688734418172e+06 3.778048159437415e+06 -3.316153173501773e+03 -2.688570525001000e+03 -6.240952661325558e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.610000000000000e+02 -2.755955850212247e+06 -5.397742504126665e+06 3.777923340483561e+06 -3.316101031775688e+03 -2.688443302782871e+03 -6.241035535441575e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.620000000000000e+02 -2.756022171293625e+06 -5.397796271307345e+06 3.777798519836317e+06 -3.316048888119433e+03 -2.688316076777473e+03 -6.241118408159016e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.630000000000000e+02 -2.756088491304482e+06 -5.397850035916294e+06 3.777673697590936e+06 -3.315996743982415e+03 -2.688188854404077e+03 -6.241201275364482e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.640000000000000e+02 -2.756154810244688e+06 -5.397903797953407e+06 3.777548873747656e+06 -3.315944599719791e+03 -2.688061635112594e+03 -6.241284137146731e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.650000000000000e+02 -2.756221128173590e+06 -5.397957557477256e+06 3.777424048179478e+06 -3.315892452686069e+03 -2.687934409865144e+03 -6.241366998928132e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.660000000000000e+02 -2.756287445061459e+06 -5.398011314458536e+06 3.777299220949985e+06 -3.315840303088187e+03 -2.687807184352581e+03 -6.241449857977419e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.670000000000000e+02 -2.756353760878569e+06 -5.398065068867925e+06 3.777174392122758e+06 -3.315788153325494e+03 -2.687679962086801e+03 -6.241532711545931e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.680000000000000e+02 -2.756420075684261e+06 -5.398118820763983e+06 3.777049561570797e+06 -3.315736000764534e+03 -2.687552733882240e+03 -6.241615565117942e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.690000000000000e+02 -2.756486389478406e+06 -5.398172570146619e+06 3.776924729294333e+06 -3.315683843931758e+03 -2.687425501276978e+03 -6.241698418671102e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.700000000000000e+02 -2.756552702216478e+06 -5.398226316971912e+06 3.776799895388624e+06 -3.315631685610763e+03 -2.687298269962022e+03 -6.241781268268500e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.710000000000000e+02 -2.756619013854246e+06 -5.398280061196178e+06 3.776675059948395e+06 -3.315579530595684e+03 -2.687171044773909e+03 -6.241864109428191e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.720000000000000e+02 -2.756685324539448e+06 -5.398333802965304e+06 3.776550222657304e+06 -3.315527366943905e+03 -2.687043807514747e+03 -6.241946956161241e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.730000000000000e+02 -2.756751634124265e+06 -5.398387542133359e+06 3.776425383831797e+06 -3.315475205985086e+03 -2.686916576212327e+03 -6.242029794822467e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.740000000000000e+02 -2.756817942712151e+06 -5.398441278802488e+06 3.776300543250384e+06 -3.315423040249824e+03 -2.686789338545922e+03 -6.242112634608831e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.750000000000000e+02 -2.756884250184604e+06 -5.398495012855757e+06 3.776175701166707e+06 -3.315370876793124e+03 -2.686662109941044e+03 -6.242195465081671e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.760000000000000e+02 -2.756950556674934e+06 -5.398548744424740e+06 3.776050857295374e+06 -3.315318708775983e+03 -2.686534871854148e+03 -6.242278298020812e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.770000000000000e+02 -2.757016862123833e+06 -5.398602473450914e+06 3.775926011763323e+06 -3.315266538317223e+03 -2.686407633006461e+03 -6.242361128399751e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.780000000000000e+02 -2.757083166501578e+06 -5.398656199904989e+06 3.775801164634147e+06 -3.315214367634520e+03 -2.686280397444520e+03 -6.242443953308929e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.790000000000000e+02 -2.757149469852702e+06 -5.398709923830895e+06 3.775676315812507e+06 -3.315162195059726e+03 -2.686153158258079e+03 -6.242526776725468e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.800000000000000e+02 -2.757215772162292e+06 -5.398763645213939e+06 3.775551465330312e+06 -3.315110020247056e+03 -2.686025918321756e+03 -6.242609597481530e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.810000000000000e+02 -2.757282073444993e+06 -5.398817364068619e+06 3.775426613156118e+06 -3.315057841893141e+03 -2.685898675805631e+03 -6.242692417033305e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.820000000000000e+02 -2.757348373641800e+06 -5.398871080336677e+06 3.775301759416346e+06 -3.315005666014225e+03 -2.685771437568513e+03 -6.242775229393580e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.830000000000000e+02 -2.757414672856031e+06 -5.398924794120114e+06 3.775176903889641e+06 -3.314953483359166e+03 -2.685644190647176e+03 -6.242858044886136e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.840000000000000e+02 -2.757480970999077e+06 -5.398978505331502e+06 3.775052046765786e+06 -3.314901301474785e+03 -2.685516946847608e+03 -6.242940854520019e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.850000000000000e+02 -2.757547268100407e+06 -5.399032213999915e+06 3.774927187981644e+06 -3.314849117589053e+03 -2.685389701497084e+03 -6.243023661753160e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.860000000000000e+02 -2.757613564130301e+06 -5.399085920096069e+06 3.774802327600827e+06 -3.314796933502328e+03 -2.685262459791394e+03 -6.243106463340987e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.870000000000000e+02 -2.757679859133281e+06 -5.399139623663891e+06 3.774677465527978e+06 -3.314744747401240e+03 -2.685135214352788e+03 -6.243189263543104e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.880000000000000e+02 -2.757746153138797e+06 -5.399193324732476e+06 3.774552601699965e+06 -3.314692555784197e+03 -2.685007962738833e+03 -6.243272065126624e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.890000000000000e+02 -2.757812446072770e+06 -5.399247023228738e+06 3.774427736275435e+06 -3.314640364195306e+03 -2.684880713693919e+03 -6.243354861455117e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.900000000000000e+02 -2.757878737964932e+06 -5.399300719182010e+06 3.774302869190721e+06 -3.314588171908269e+03 -2.684753463297066e+03 -6.243437654681089e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.910000000000000e+02 -2.757945028829941e+06 -5.399354412606784e+06 3.774178000414367e+06 -3.314535975830387e+03 -2.684626210338968e+03 -6.243520446810319e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.920000000000000e+02 -2.758011318623295e+06 -5.399408103459186e+06 3.774053130041664e+06 -3.314483779698388e+03 -2.684498960514553e+03 -6.243603233462525e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.930000000000000e+02 -2.758077607389519e+06 -5.399461791783128e+06 3.773928257977258e+06 -3.314431581751890e+03 -2.684371707110122e+03 -6.243686018564298e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.940000000000000e+02 -2.758143895128482e+06 -5.399515477578505e+06 3.773803384221377e+06 -3.314379380594034e+03 -2.684244450777608e+03 -6.243768802467575e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.950000000000000e+02 -2.758210181810468e+06 -5.399569160816047e+06 3.773678508837624e+06 -3.314327177807002e+03 -2.684117196199860e+03 -6.243851582268154e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.960000000000000e+02 -2.758276467450431e+06 -5.399622841510474e+06 3.773553631794015e+06 -3.314274974582856e+03 -2.683989939546687e+03 -6.243934359178502e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.970000000000000e+02 -2.758342752048139e+06 -5.399676519661603e+06 3.773428753090962e+06 -3.314222768420925e+03 -2.683862682634883e+03 -6.244017133528780e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.980000000000000e+02 -2.758409035588951e+06 -5.399730195254995e+06 3.773303872759847e+06 -3.314170562161862e+03 -2.683735426274880e+03 -6.244099903615970e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.990000000000000e+02 -2.758475318102321e+06 -5.399783868319721e+06 3.773178990737527e+06 -3.314118352903612e+03 -2.683608166899254e+03 -6.244182672445663e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.000000000000000e+02 -2.758541599602900e+06 -5.399837538870267e+06 3.773054106992553e+06 -3.314066139250215e+03 -2.683480903154973e+03 -6.244265441295563e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.010000000000000e+02 -2.758607879987331e+06 -5.399891206804660e+06 3.772929221746431e+06 -3.314013929792007e+03 -2.683353647404103e+03 -6.244348200437387e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.020000000000000e+02 -2.758674159373786e+06 -5.399944872239505e+06 3.772804334745892e+06 -3.313961715006005e+03 -2.683226385172282e+03 -6.244430961011411e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.030000000000000e+02 -2.758740437732548e+06 -5.399998535145518e+06 3.772679446054548e+06 -3.313909496812271e+03 -2.683099120183861e+03 -6.244513720398945e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.040000000000000e+02 -2.758806715048989e+06 -5.400052195508253e+06 3.772554555703785e+06 -3.313857277919631e+03 -2.682971853705311e+03 -6.244596476748152e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.050000000000000e+02 -2.758872991293413e+06 -5.400105853298437e+06 3.772429663757209e+06 -3.313805058878992e+03 -2.682844590049041e+03 -6.244679227809806e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.060000000000000e+02 -2.758939266510030e+06 -5.400159508559732e+06 3.772304770119992e+06 -3.313752835992129e+03 -2.682717324239962e+03 -6.244761977611082e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.070000000000000e+02 -2.759005540669440e+06 -5.400213161263106e+06 3.772179874855211e+06 -3.313700613870014e+03 -2.682590058577554e+03 -6.244844722933967e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.080000000000000e+02 -2.759071813830547e+06 -5.400266811466712e+06 3.772054977836505e+06 -3.313648385569229e+03 -2.682462786414175e+03 -6.244927470094731e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.090000000000000e+02 -2.759138085919583e+06 -5.400320459097772e+06 3.771930079222037e+06 -3.313596158657670e+03 -2.682335516798352e+03 -6.245010211376428e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.100000000000000e+02 -2.759204356980764e+06 -5.400374104199931e+06 3.771805178916961e+06 -3.313543928203242e+03 -2.682208244464971e+03 -6.245092951516312e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.110000000000000e+02 -2.759270626954833e+06 -5.400427746714773e+06 3.771680277048282e+06 -3.313491698691824e+03 -2.682080977293221e+03 -6.245175684779298e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.120000000000000e+02 -2.759336895901078e+06 -5.400481386700754e+06 3.771555373488929e+06 -3.313439467374609e+03 -2.681953706536712e+03 -6.245258416488870e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.130000000000000e+02 -2.759403163819362e+06 -5.400535024157775e+06 3.771430468239127e+06 -3.313387232597752e+03 -2.681826433010115e+03 -6.245341147041898e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.140000000000000e+02 -2.759469430709557e+06 -5.400588659085736e+06 3.771305561299117e+06 -3.313334994441829e+03 -2.681699156895445e+03 -6.245423876316487e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.150000000000000e+02 -2.759535696586595e+06 -5.400642291499346e+06 3.771180652636898e+06 -3.313282753620417e+03 -2.681571875130106e+03 -6.245506605392507e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.160000000000000e+02 -2.759601961346867e+06 -5.400695921296465e+06 3.771055742474560e+06 -3.313230515329220e+03 -2.681444602695747e+03 -6.245589324926078e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.170000000000000e+02 -2.759668225093720e+06 -5.400749548579040e+06 3.770930830590481e+06 -3.313178272830845e+03 -2.681317325494562e+03 -6.245672044573925e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.180000000000000e+02 -2.759734487797742e+06 -5.400803173318048e+06 3.770805917047747e+06 -3.313126029437317e+03 -2.681190046695787e+03 -6.245754761324984e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.190000000000000e+02 -2.759800749429245e+06 -5.400856795484246e+06 3.770681001909981e+06 -3.313073786013007e+03 -2.681062771066218e+03 -6.245837472575485e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.200000000000000e+02 -2.759867010091561e+06 -5.400910415179557e+06 3.770556084955543e+06 -3.313021534881383e+03 -2.680935484915428e+03 -6.245920188231110e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.210000000000000e+02 -2.759933269651813e+06 -5.400964032272939e+06 3.770431166469399e+06 -3.312969287103949e+03 -2.680808205010968e+03 -6.246002895384192e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.220000000000000e+02 -2.759999528154122e+06 -5.401017646807945e+06 3.770306246356872e+06 -3.312917037667121e+03 -2.680680926557619e+03 -6.246085598591109e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.230000000000000e+02 -2.760065785687322e+06 -5.401071258872152e+06 3.770181324427477e+06 -3.312864782250839e+03 -2.680553636814077e+03 -6.246168305749454e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.240000000000000e+02 -2.760132042133037e+06 -5.401124868348874e+06 3.770056400935018e+06 -3.312812527439842e+03 -2.680426352168556e+03 -6.246251006220428e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.250000000000000e+02 -2.760198297550256e+06 -5.401178475296305e+06 3.769931475752948e+06 -3.312760269394502e+03 -2.680299064936912e+03 -6.246333705343739e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.260000000000000e+02 -2.760264551850457e+06 -5.401232079627148e+06 3.769806549071152e+06 -3.312708015643394e+03 -2.680171785828383e+03 -6.246416394661094e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.270000000000000e+02 -2.760330805196088e+06 -5.401285681501591e+06 3.769681620541172e+06 -3.312655753441387e+03 -2.680044494104634e+03 -6.246499089694856e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.280000000000000e+02 -2.760397057468774e+06 -5.401339280802967e+06 3.769556690416843e+06 -3.312603490924736e+03 -2.679917205870994e+03 -6.246581779213635e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.290000000000000e+02 -2.760463308683450e+06 -5.401392877545986e+06 3.769431758666154e+06 -3.312551228722764e+03 -2.679789917838530e+03 -6.246664464440722e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.300000000000000e+02 -2.760529558884329e+06 -5.401446471774250e+06 3.769306825194246e+06 -3.312498962282363e+03 -2.679662625058770e+03 -6.246747149785830e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.310000000000000e+02 -2.760595808041713e+06 -5.401500063458532e+06 3.769181890064747e+06 -3.312446693174250e+03 -2.679535331851872e+03 -6.246829832522395e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.320000000000000e+02 -2.760662056126199e+06 -5.401553652569826e+06 3.769056953340758e+06 -3.312394425529521e+03 -2.679408040729773e+03 -6.246912509562042e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.330000000000000e+02 -2.760728303181903e+06 -5.401607239151657e+06 3.768932014927589e+06 -3.312342153998000e+03 -2.679280747248821e+03 -6.246995185453688e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.340000000000000e+02 -2.760794549164642e+06 -5.401660823160465e+06 3.768807074920042e+06 -3.312289883734499e+03 -2.679153456209651e+03 -6.247077855575473e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.350000000000000e+02 -2.760860794148163e+06 -5.401714404668977e+06 3.768682133159833e+06 -3.312237607863208e+03 -2.679026158260293e+03 -6.247160527451684e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.360000000000000e+02 -2.760927038073240e+06 -5.401767983618841e+06 3.768557189774015e+06 -3.312185331006993e+03 -2.678898862035016e+03 -6.247243194941469e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.370000000000000e+02 -2.760993280954794e+06 -5.401821560024743e+06 3.768432244730580e+06 -3.312133053207867e+03 -2.678771563731348e+03 -6.247325859778447e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.380000000000000e+02 -2.761059522792697e+06 -5.401875133886601e+06 3.768307298029756e+06 -3.312080773147878e+03 -2.678644265022737e+03 -6.247408521806754e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.390000000000000e+02 -2.761125763586817e+06 -5.401928705204302e+06 3.768182349671780e+06 -3.312028490645611e+03 -2.678516965418804e+03 -6.247491181337197e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.400000000000000e+02 -2.761192003337307e+06 -5.401982273977992e+06 3.768057399656352e+06 -3.311976207388760e+03 -2.678389664362749e+03 -6.247573837838139e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.410000000000000e+02 -2.761258242044039e+06 -5.402035840207567e+06 3.767932447983698e+06 -3.311923921885239e+03 -2.678262362333980e+03 -6.247656491785515e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.420000000000000e+02 -2.761324479721654e+06 -5.402089403907491e+06 3.767807494622352e+06 -3.311871632949200e+03 -2.678135057798700e+03 -6.247739144440055e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.430000000000000e+02 -2.761390716355525e+06 -5.402142965063338e+06 3.767682539603716e+06 -3.311819343302539e+03 -2.678007751783612e+03 -6.247821794057209e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.440000000000000e+02 -2.761456951915984e+06 -5.402196523645894e+06 3.767557582991431e+06 -3.311767053396133e+03 -2.677880448806763e+03 -6.247904438344361e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.450000000000000e+02 -2.761523186417665e+06 -5.402250079669614e+06 3.767432624754032e+06 -3.311714762101954e+03 -2.677753147158106e+03 -6.247987078616679e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.460000000000000e+02 -2.761589419934596e+06 -5.402303633207434e+06 3.767307664732678e+06 -3.311662465915002e+03 -2.677625835907138e+03 -6.248069721547719e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.470000000000000e+02 -2.761655652363133e+06 -5.402357184157263e+06 3.767182703149731e+06 -3.311610170069723e+03 -2.677498530298228e+03 -6.248152357668431e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.480000000000000e+02 -2.761721883762521e+06 -5.402410732577475e+06 3.767057739878056e+06 -3.311557872193366e+03 -2.677371221062138e+03 -6.248234992358002e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.490000000000000e+02 -2.761788114117858e+06 -5.402464278453408e+06 3.766932774949598e+06 -3.311505572196235e+03 -2.677243911100302e+03 -6.248317624321401e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.500000000000000e+02 -2.761854343429010e+06 -5.402517821784967e+06 3.766807808364587e+06 -3.311453269739873e+03 -2.677116600347842e+03 -6.248400253746559e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.510000000000000e+02 -2.761920571710911e+06 -5.402571362586838e+06 3.766682840091016e+06 -3.311400965678448e+03 -2.676989286071163e+03 -6.248482881493892e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.520000000000000e+02 -2.761986798933876e+06 -5.402624900829819e+06 3.766557870192531e+06 -3.311348660102302e+03 -2.676861973110276e+03 -6.248565505291587e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.530000000000000e+02 -2.762053025097774e+06 -5.402678436513806e+06 3.766432898669368e+06 -3.311296353218778e+03 -2.676734661380873e+03 -6.248648125081871e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.540000000000000e+02 -2.762119250247084e+06 -5.402731969682604e+06 3.766307925426097e+06 -3.311244043774710e+03 -2.676607344027736e+03 -6.248730744607351e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.550000000000000e+02 -2.762185474337353e+06 -5.402785500292446e+06 3.766182950558076e+06 -3.311191732849788e+03 -2.676480027969264e+03 -6.248813360177308e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.560000000000000e+02 -2.762251697353676e+06 -5.402839028328685e+06 3.766057974097254e+06 -3.311139421463698e+03 -2.676352715264991e+03 -6.248895970367455e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.570000000000000e+02 -2.762317919384836e+06 -5.402892553878770e+06 3.765932995853064e+06 -3.311087105464967e+03 -2.676225392733630e+03 -6.248978583186132e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.580000000000000e+02 -2.762384140297672e+06 -5.402946076811560e+06 3.765808016111320e+06 -3.311034791706276e+03 -2.676098079914220e+03 -6.249061186436496e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.590000000000000e+02 -2.762450360225266e+06 -5.402999597258152e+06 3.765683034586308e+06 -3.310982472839310e+03 -2.675970757581551e+03 -6.249143792401836e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.600000000000000e+02 -2.762516579093639e+06 -5.403053115145693e+06 3.765558051436823e+06 -3.310930152793503e+03 -2.675843436492613e+03 -6.249226394294466e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.610000000000000e+02 -2.762582796961742e+06 -5.403106630532282e+06 3.765433066536250e+06 -3.310877827571749e+03 -2.675716108824915e+03 -6.249308997581689e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.620000000000000e+02 -2.762649013711563e+06 -5.403160143301660e+06 3.765308080137992e+06 -3.310825506419340e+03 -2.675588789291646e+03 -6.249391591174277e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.630000000000000e+02 -2.762715229461135e+06 -5.403213653570120e+06 3.765183091988568e+06 -3.310773179925236e+03 -2.675461463051445e+03 -6.249474186297699e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.640000000000000e+02 -2.762781444151247e+06 -5.403267161279371e+06 3.765058102215078e+06 -3.310720852185604e+03 -2.675334138284279e+03 -6.249556777274244e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.650000000000000e+02 -2.762847657796818e+06 -5.403320666444096e+06 3.764933110785495e+06 -3.310668523609374e+03 -2.675206811745985e+03 -6.249639365406556e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.660000000000000e+02 -2.762913870382958e+06 -5.403374169049652e+06 3.764808117731771e+06 -3.310616193838610e+03 -2.675079486508679e+03 -6.249721949447665e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.670000000000000e+02 -2.762980081953829e+06 -5.403427669139579e+06 3.764683122958994e+06 -3.310563859478555e+03 -2.674952156746687e+03 -6.249804533663209e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.680000000000000e+02 -2.763046292465284e+06 -5.403481166670369e+06 3.764558126562009e+06 -3.310511525486276e+03 -2.674824827249478e+03 -6.249887113535393e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.690000000000000e+02 -2.763112501902428e+06 -5.403534661627389e+06 3.764433128572763e+06 -3.310459191217452e+03 -2.674697500897966e+03 -6.249969688039305e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.700000000000000e+02 -2.763178710353731e+06 -5.403588154097799e+06 3.764308128801193e+06 -3.310406850496108e+03 -2.674570166070665e+03 -6.250052265404958e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.710000000000000e+02 -2.763244917745509e+06 -5.403641644009018e+06 3.764183127405581e+06 -3.310354510111982e+03 -2.674442831481156e+03 -6.250134838454000e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.720000000000000e+02 -2.763311124077544e+06 -5.403695131360866e+06 3.764058124386332e+06 -3.310302167919765e+03 -2.674315498395648e+03 -6.250217407604997e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.730000000000000e+02 -2.763377329335209e+06 -5.403748616138943e+06 3.763933119774871e+06 -3.310249826566026e+03 -2.674188167982972e+03 -6.250299971085565e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.740000000000000e+02 -2.763443533577455e+06 -5.403802098401319e+06 3.763808113444553e+06 -3.310197481497284e+03 -2.674060832584925e+03 -6.250382534543820e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.750000000000000e+02 -2.763509736774607e+06 -5.403855578118811e+06 3.763683105459050e+06 -3.310145133615936e+03 -2.673933496668485e+03 -6.250465095503384e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.760000000000000e+02 -2.763575938926820e+06 -5.403909055291553e+06 3.763558095818061e+06 -3.310092785183645e+03 -2.673806159033795e+03 -6.250547653461085e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.770000000000000e+02 -2.763642140033961e+06 -5.403962529919446e+06 3.763433084521815e+06 -3.310040434144129e+03 -2.673678820750536e+03 -6.250630208884152e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.780000000000000e+02 -2.763708340095907e+06 -5.404016002002388e+06 3.763308071570549e+06 -3.309988081170669e+03 -2.673551481579005e+03 -6.250712761568764e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.790000000000000e+02 -2.763774539127569e+06 -5.404069471555059e+06 3.763183056932240e+06 -3.309935726200265e+03 -2.673424139085961e+03 -6.250795312663437e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.800000000000000e+02 -2.763840737099289e+06 -5.404122938548281e+06 3.763058040670556e+06 -3.309883369919368e+03 -2.673296797642554e+03 -6.250877859837452e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.810000000000000e+02 -2.763906933996172e+06 -5.404176402967426e+06 3.762933022817463e+06 -3.309831013316831e+03 -2.673169459701634e+03 -6.250960401501714e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.820000000000000e+02 -2.763973129906953e+06 -5.404229864899840e+06 3.762808003182318e+06 -3.309778651897665e+03 -2.673042111828011e+03 -6.251042945931538e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.830000000000000e+02 -2.764039324742825e+06 -5.404283324258136e+06 3.762682981955873e+06 -3.309726289745937e+03 -2.672914767950370e+03 -6.251125484816357e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.840000000000000e+02 -2.764105518548233e+06 -5.404336781086051e+06 3.762557959042653e+06 -3.309673925677879e+03 -2.672787420234223e+03 -6.251208022311064e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.850000000000000e+02 -2.764171711263987e+06 -5.404390235325352e+06 3.762432934569780e+06 -3.309621562182355e+03 -2.672660077740970e+03 -6.251290553088408e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.860000000000000e+02 -2.764237902963784e+06 -5.404443687048616e+06 3.762307908378883e+06 -3.309569194689865e+03 -2.672532730674302e+03 -6.251373083783969e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.870000000000000e+02 -2.764304093618243e+06 -5.404497136226898e+06 3.762182880533099e+06 -3.309516826397180e+03 -2.672405381814982e+03 -6.251455611628147e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.880000000000000e+02 -2.764370283241995e+06 -5.404550582874645e+06 3.762057851000933e+06 -3.309464454427003e+03 -2.672278030512745e+03 -6.251538138261652e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.890000000000000e+02 -2.764436471790619e+06 -5.404604026948159e+06 3.761932819877800e+06 -3.309412082296908e+03 -2.672150682425199e+03 -6.251620659443273e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.900000000000000e+02 -2.764502659323324e+06 -5.404657468505690e+06 3.761807787036492e+06 -3.309359707632671e+03 -2.672023328324369e+03 -6.251703180522211e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.910000000000000e+02 -2.764568845795687e+06 -5.404710907503561e+06 3.761682752572419e+06 -3.309307331173002e+03 -2.671895976001068e+03 -6.251785697572715e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.920000000000000e+02 -2.764635031207581e+06 -5.404764343941673e+06 3.761557716485817e+06 -3.309254953625915e+03 -2.671768624914015e+03 -6.251868210513646e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.930000000000000e+02 -2.764701215603441e+06 -5.404817777863747e+06 3.761432678681203e+06 -3.309202573313777e+03 -2.671641268053171e+03 -6.251950723349075e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.940000000000000e+02 -2.764767398938857e+06 -5.404871209226095e+06 3.761307639253989e+06 -3.309150191814284e+03 -2.671513912491789e+03 -6.252033232092480e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.950000000000000e+02 -2.764833581228451e+06 -5.404924638043152e+06 3.761182598172686e+06 -3.309097807731590e+03 -2.671386556314791e+03 -6.252115738274882e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.960000000000000e+02 -2.764899762457620e+06 -5.404978064300520e+06 3.761057555468714e+06 -3.309045423921643e+03 -2.671259200605692e+03 -6.252198240066907e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.970000000000000e+02 -2.764965942655661e+06 -5.405031488027087e+06 3.760932511079032e+06 -3.308993036392080e+03 -2.671131842201297e+03 -6.252280740783429e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.980000000000000e+02 -2.765032121807967e+06 -5.405084909208451e+06 3.760807465035068e+06 -3.308940648095423e+03 -2.671004482357020e+03 -6.252363238470994e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.990000000000000e+02 -2.765098299899642e+06 -5.405138327829994e+06 3.760682417368774e+06 -3.308888258156674e+03 -2.670877123867758e+03 -6.252445732253488e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.000000000000000e+02 -2.765164476989596e+06 -5.405191743949722e+06 3.760557367953479e+06 -3.308835863195737e+03 -2.670749758701307e+03 -6.252528227396733e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.010000000000000e+02 -2.765230652989429e+06 -5.405245157480608e+06 3.760432316979250e+06 -3.308783470483452e+03 -2.670622397605332e+03 -6.252610715573713e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.020000000000000e+02 -2.765296827958039e+06 -5.405298568480665e+06 3.760307264319398e+06 -3.308731074121135e+03 -2.670495034003056e+03 -6.252693202555575e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.030000000000000e+02 -2.765363001895301e+06 -5.405351976949792e+06 3.760182209974166e+06 -3.308678674664350e+03 -2.670367668009038e+03 -6.252775688030548e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.040000000000000e+02 -2.765429174771850e+06 -5.405405382859068e+06 3.760057154006705e+06 -3.308626275468769e+03 -2.670240301838252e+03 -6.252858169417057e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.050000000000000e+02 -2.765495346602315e+06 -5.405458786222927e+06 3.759932096385518e+06 -3.308573873907400e+03 -2.670112935194390e+03 -6.252940648075752e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.060000000000000e+02 -2.765561517386561e+06 -5.405512187041265e+06 3.759807037110842e+06 -3.308521470029135e+03 -2.669985567720406e+03 -6.253023124147834e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.070000000000000e+02 -2.765627687124743e+06 -5.405565585314227e+06 3.759681976182375e+06 -3.308469065264549e+03 -2.669858199069256e+03 -6.253105597125941e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.080000000000000e+02 -2.765693855816633e+06 -5.405618981041629e+06 3.759556913600525e+06 -3.308416657720415e+03 -2.669730829601420e+03 -6.253188067726888e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.090000000000000e+02 -2.765760023432876e+06 -5.405672374194572e+06 3.759431849428458e+06 -3.308364251353197e+03 -2.669603462783721e+03 -6.253270532514996e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.100000000000000e+02 -2.765826190047117e+06 -5.405725764845551e+06 3.759306783507735e+06 -3.308311839656709e+03 -2.669476088923333e+03 -6.253352998972982e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.110000000000000e+02 -2.765892355629715e+06 -5.405779152965432e+06 3.759181715902066e+06 -3.308259424648223e+03 -2.669348712762661e+03 -6.253435463982891e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.120000000000000e+02 -2.765958520107045e+06 -5.405832538481750e+06 3.759056646769810e+06 -3.308207012995211e+03 -2.669221342493766e+03 -6.253517920676765e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.130000000000000e+02 -2.766024683582268e+06 -5.405885921496043e+06 3.758931575889065e+06 -3.308154595912047e+03 -2.669093965898846e+03 -6.253600378757897e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.140000000000000e+02 -2.766090845996226e+06 -5.405939301950138e+06 3.758806503387002e+06 -3.308102177382882e+03 -2.668966590583140e+03 -6.253682832878220e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.150000000000000e+02 -2.766157007363828e+06 -5.405992679858685e+06 3.758681429231585e+06 -3.308049758291453e+03 -2.668839213512535e+03 -6.253765284018858e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.160000000000000e+02 -2.766223167684942e+06 -5.406046055221595e+06 3.758556353423040e+06 -3.307997336657578e+03 -2.668711835801808e+03 -6.253847732590744e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.170000000000000e+02 -2.766289326959445e+06 -5.406099428038761e+06 3.758431275961609e+06 -3.307944912867643e+03 -2.668584457299774e+03 -6.253930178483243e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.180000000000000e+02 -2.766355485157975e+06 -5.406152798281294e+06 3.758306196910461e+06 -3.307892490243977e+03 -2.668457081316027e+03 -6.254012618629643e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.190000000000000e+02 -2.766421642383675e+06 -5.406206166050692e+06 3.758181116047664e+06 -3.307840060151866e+03 -2.668329694556186e+03 -6.254095063153934e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.200000000000000e+02 -2.766487798503638e+06 -5.406259531216234e+06 3.758056033659095e+06 -3.307787631887521e+03 -2.668202315170945e+03 -6.254177499395350e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.210000000000000e+02 -2.766553953577029e+06 -5.406312893836106e+06 3.757930949617500e+06 -3.307735203015093e+03 -2.668074933967060e+03 -6.254259932707818e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.220000000000000e+02 -2.766620107603621e+06 -5.406366253910139e+06 3.757805863923286e+06 -3.307682770850041e+03 -2.667947552459106e+03 -6.254342363646926e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.230000000000000e+02 -2.766686260657329e+06 -5.406419611511021e+06 3.757680776417462e+06 -3.307630333317551e+03 -2.667820159449706e+03 -6.254424798316560e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.240000000000000e+02 -2.766752412575749e+06 -5.406472966479030e+06 3.757555687449384e+06 -3.307577899222114e+03 -2.667692777604728e+03 -6.254507222215988e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.250000000000000e+02 -2.766818563462012e+06 -5.406526318915652e+06 3.757430596797117e+06 -3.307525461806372e+03 -2.667565393232362e+03 -6.254589644775029e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.260000000000000e+02 -2.766884713331026e+06 -5.406579668835517e+06 3.757305504428614e+06 -3.307473021790558e+03 -2.667438002841763e+03 -6.254672067259388e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.270000000000000e+02 -2.766950862123650e+06 -5.406633016180503e+06 3.757180410471072e+06 -3.307420581190138e+03 -2.667310616173344e+03 -6.254754484261972e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.280000000000000e+02 -2.767017009898762e+06 -5.406686361008540e+06 3.757055314797760e+06 -3.307368136426540e+03 -2.667183224663944e+03 -6.254836901377619e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.290000000000000e+02 -2.767083156597506e+06 -5.406739703261732e+06 3.756930217535342e+06 -3.307315692786640e+03 -2.667055835561374e+03 -6.254919312819478e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.300000000000000e+02 -2.767149302249258e+06 -5.406793042968994e+06 3.756805118620563e+06 -3.307263247067282e+03 -2.666928445433195e+03 -6.255001721653892e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.310000000000000e+02 -2.767215446912884e+06 -5.406846380188258e+06 3.756680017926692e+06 -3.307210794685527e+03 -2.666801047098161e+03 -6.255084133308408e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.320000000000000e+02 -2.767281590441043e+06 -5.406899714774595e+06 3.756554915770855e+06 -3.307158347791559e+03 -2.666673658863732e+03 -6.255166533728855e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.330000000000000e+02 -2.767347732980998e+06 -5.406953046872891e+06 3.756429811836029e+06 -3.307105893816188e+03 -2.666546262361385e+03 -6.255248937192277e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.340000000000000e+02 -2.767413874459159e+06 -5.407006376410747e+06 3.756304706280632e+06 -3.307053440196605e+03 -2.666418866091803e+03 -6.255331336337019e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.350000000000000e+02 -2.767480014919644e+06 -5.407059703431583e+06 3.756179599009659e+06 -3.307000982264408e+03 -2.666291465308855e+03 -6.255413735513112e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.360000000000000e+02 -2.767546154273822e+06 -5.407113027848278e+06 3.756054490213811e+06 -3.306948525833000e+03 -2.666164071691362e+03 -6.255496126658952e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.370000000000000e+02 -2.767612292610353e+06 -5.407166349747983e+06 3.755929379702327e+06 -3.306896067225147e+03 -2.666036672207137e+03 -6.255578517462001e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.380000000000000e+02 -2.767678429899595e+06 -5.407219669101601e+06 3.755804267538918e+06 -3.306843605389256e+03 -2.665909272518749e+03 -6.255660905815643e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.390000000000000e+02 -2.767744566141417e+06 -5.407272985909031e+06 3.755679153723827e+06 -3.306791141753229e+03 -2.665781871861853e+03 -6.255743291405447e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.400000000000000e+02 -2.767810701335981e+06 -5.407326300170407e+06 3.755554038256749e+06 -3.306738677389761e+03 -2.665654469556484e+03 -6.255825674043705e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.410000000000000e+02 -2.767876835497898e+06 -5.407379611900132e+06 3.755428921106163e+06 -3.306686209442812e+03 -2.665527064750789e+03 -6.255908055450456e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.420000000000000e+02 -2.767942968568048e+06 -5.407432921040111e+06 3.755303802399297e+06 -3.306633742222837e+03 -2.665399665080516e+03 -6.255990430119277e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.430000000000000e+02 -2.768009100620317e+06 -5.407486227662972e+06 3.755178681977116e+06 -3.306581272303359e+03 -2.665272259734945e+03 -6.256072804600297e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.440000000000000e+02 -2.768075231625091e+06 -5.407539531739622e+06 3.755053559903339e+06 -3.306528800127880e+03 -2.665144853756448e+03 -6.256155176375906e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.450000000000000e+02 -2.768141361626464e+06 -5.407592833313458e+06 3.754928436082961e+06 -3.306476322410754e+03 -2.665017441288552e+03 -6.256237549659208e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.460000000000000e+02 -2.768207490506625e+06 -5.407646132268625e+06 3.754803310769665e+06 -3.306423849069870e+03 -2.664890036874361e+03 -6.256319913169294e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.470000000000000e+02 -2.768273618368574e+06 -5.407699428706440e+06 3.754678183741624e+06 -3.306371370804078e+03 -2.664762628241862e+03 -6.256402276859278e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.480000000000000e+02 -2.768339745212466e+06 -5.407752722627025e+06 3.754553054998532e+06 -3.306318890140301e+03 -2.664635213742908e+03 -6.256484640307780e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.490000000000000e+02 -2.768405870949685e+06 -5.407806013943319e+06 3.754427924731116e+06 -3.306266410386808e+03 -2.664507806925993e+03 -6.256566995767577e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.500000000000000e+02 -2.768471995668583e+06 -5.407859302742196e+06 3.754302792749123e+06 -3.306213926965836e+03 -2.664380395327451e+03 -6.256649351079742e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.510000000000000e+02 -2.768538119339818e+06 -5.407912588994788e+06 3.754177659115739e+06 -3.306161442502791e+03 -2.664252981767328e+03 -6.256731703730238e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.520000000000000e+02 -2.768604241963261e+06 -5.407965872701011e+06 3.754052523831199e+06 -3.306108955586738e+03 -2.664125567839678e+03 -6.256814053645462e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.530000000000000e+02 -2.768670363509289e+06 -5.408019153831777e+06 3.753927386959249e+06 -3.306056468608976e+03 -2.663998157167127e+03 -6.256896398053330e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.540000000000000e+02 -2.768736484081264e+06 -5.408072432488662e+06 3.753802248277312e+06 -3.306003975661247e+03 -2.663870734765287e+03 -6.256978746566637e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.550000000000000e+02 -2.768802603531625e+06 -5.408125708526653e+06 3.753677108103146e+06 -3.305951485639814e+03 -2.663743321618146e+03 -6.257061085434324e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.560000000000000e+02 -2.768868721992922e+06 -5.408178982076078e+06 3.753551966151213e+06 -3.305898988936910e+03 -2.663615899994811e+03 -6.257143427248053e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.570000000000000e+02 -2.768934839347365e+06 -5.408232253021140e+06 3.753426822675235e+06 -3.305846495559828e+03 -2.663488484617959e+03 -6.257225760608641e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.580000000000000e+02 -2.769000955683192e+06 -5.408285521448610e+06 3.753301677485105e+06 -3.305793997640494e+03 -2.663361064733776e+03 -6.257308094102022e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.590000000000000e+02 -2.769067070985806e+06 -5.408338787344130e+06 3.753176530612270e+06 -3.305741497554742e+03 -2.663233641545295e+03 -6.257390426071558e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.600000000000000e+02 -2.769133185225596e+06 -5.408392050678623e+06 3.753051382120471e+06 -3.305688996464322e+03 -2.663106219407821e+03 -6.257472753982438e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.610000000000000e+02 -2.769199298431909e+06 -5.408445311480971e+06 3.752926231946436e+06 -3.305636491597089e+03 -2.662978794706898e+03 -6.257555080779383e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.620000000000000e+02 -2.769265410560686e+06 -5.408498569707838e+06 3.752801080185125e+06 -3.305583988584649e+03 -2.662851372094272e+03 -6.257637401712635e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.630000000000000e+02 -2.769331521670748e+06 -5.408551825417086e+06 3.752675926709751e+06 -3.305531480745391e+03 -2.662723945107671e+03 -6.257719722849230e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.640000000000000e+02 -2.769397631703004e+06 -5.408605078550668e+06 3.752550771647571e+06 -3.305478972629793e+03 -2.662596521420345e+03 -6.257802038559466e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.650000000000000e+02 -2.769463740701834e+06 -5.408658329152165e+06 3.752425614903014e+06 -3.305426462991685e+03 -2.662469093787730e+03 -6.257884352739487e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.660000000000000e+02 -2.769529848667097e+06 -5.408711577221496e+06 3.752300456476308e+06 -3.305373949651001e+03 -2.662341663824585e+03 -6.257966665664075e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.670000000000000e+02 -2.769595955539711e+06 -5.408764822700615e+06 3.752175296494725e+06 -3.305321437379213e+03 -2.662214238971331e+03 -6.258048971708293e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.680000000000000e+02 -2.769662061437742e+06 -5.408818065705529e+06 3.752050134703895e+06 -3.305268919037625e+03 -2.662086802637247e+03 -6.258131281785965e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.690000000000000e+02 -2.769728166198931e+06 -5.408871306076828e+06 3.751924971453387e+06 -3.305216404583304e+03 -2.661959377335057e+03 -6.258213580962465e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.700000000000000e+02 -2.769794269955791e+06 -5.408924543944760e+06 3.751799806457618e+06 -3.305163884582294e+03 -2.661831945592809e+03 -6.258295881621919e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.710000000000000e+02 -2.769860372664263e+06 -5.408977779266005e+06 3.751674639811557e+06 -3.305111363926721e+03 -2.661704512111472e+03 -6.258378179337420e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.720000000000000e+02 -2.769926474338863e+06 -5.409031012054874e+06 3.751549471483851e+06 -3.305058839484870e+03 -2.661577076166432e+03 -6.258460475896992e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.730000000000000e+02 -2.769992574950262e+06 -5.409084242282541e+06 3.751424301537726e+06 -3.305006315163272e+03 -2.661449640840875e+03 -6.258542768073043e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.740000000000000e+02 -2.770058674513073e+06 -5.409137469963385e+06 3.751299129941647e+06 -3.304953788674427e+03 -2.661322204595074e+03 -6.258625057633990e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.750000000000000e+02 -2.770124773012418e+06 -5.409190695082830e+06 3.751173956727613e+06 -3.304901260467136e+03 -2.661194769761101e+03 -6.258707343304260e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.760000000000000e+02 -2.770190870463199e+06 -5.409243917655491e+06 3.751048781863561e+06 -3.304848732048157e+03 -2.661067333047883e+03 -6.258789625888877e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.770000000000000e+02 -2.770256966880012e+06 -5.409297137695754e+06 3.750923605317960e+06 -3.304796199780403e+03 -2.660939894143971e+03 -6.258871907221546e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.780000000000000e+02 -2.770323062292206e+06 -5.409350355232467e+06 3.750798427027524e+06 -3.304743662457387e+03 -2.660812448254815e+03 -6.258954190056086e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.790000000000000e+02 -2.770389156582037e+06 -5.409403570149949e+06 3.750673247246039e+06 -3.304691129234007e+03 -2.660685010742681e+03 -6.259036463108925e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.800000000000000e+02 -2.770455249852534e+06 -5.409456782549442e+06 3.750548065751410e+06 -3.304638591925324e+03 -2.660557568386908e+03 -6.259118736233053e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.810000000000000e+02 -2.770521342118296e+06 -5.409509992445315e+06 3.750422882512104e+06 -3.304586049015440e+03 -2.660430119718451e+03 -6.259201010804690e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.820000000000000e+02 -2.770587433276325e+06 -5.409563199736388e+06 3.750297697750161e+06 -3.304533509383979e+03 -2.660302677238337e+03 -6.259283276978294e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.830000000000000e+02 -2.770653523370606e+06 -5.409616404465905e+06 3.750172511370701e+06 -3.304480967961415e+03 -2.660175236170342e+03 -6.259365539295516e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.840000000000000e+02 -2.770719612460233e+06 -5.409669606691897e+06 3.750047323246367e+06 -3.304428422761028e+03 -2.660047787727295e+03 -6.259447802698020e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.850000000000000e+02 -2.770785700515606e+06 -5.409722806385315e+06 3.749922133440919e+06 -3.304375874226999e+03 -2.659920336440613e+03 -6.259530064906899e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.860000000000000e+02 -2.770851787479917e+06 -5.409776003486807e+06 3.749796942082079e+06 -3.304323439661789e+03 -2.659792822092742e+03 -6.259612298923726e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.870000000000000e+02 -2.770917873425757e+06 -5.409829198074832e+06 3.749671749002763e+06 -3.304270776754683e+03 -2.659665440792467e+03 -6.259694574215837e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.880000000000000e+02 -2.770983958304467e+06 -5.409882390098047e+06 3.749546554313128e+06 -3.304218224716093e+03 -2.659537990595247e+03 -6.259776825425560e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.890000000000000e+02 -2.771050042119213e+06 -5.409935579559600e+06 3.749421358006313e+06 -3.304165671440264e+03 -2.659410541926612e+03 -6.259859072468471e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.900000000000000e+02 -2.771116124870149e+06 -5.409988766459609e+06 3.749296160082009e+06 -3.304113118390670e+03 -2.659283093112061e+03 -6.259941315429959e+03 2.158289275000000e-03 4.850856960000000e-04 1.396801995700000e-03 2.007607425800000e-03 1.615864649200000e-03 4.296222626400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.910000000000000e+02 -2.771182206660274e+06 -5.410041950899270e+06 3.749170960318082e+06 -3.304060556954195e+03 -2.659155632039453e+03 -6.260023563849442e+03 2.158032054700000e-03 4.846418725600000e-04 1.396688017100000e-03 2.007021877700000e-03 1.615434827000000e-03 4.297129596000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.920000000000000e+02 -2.771248287327397e+06 -5.410095132719320e+06 3.749045759064208e+06 -3.304007998295564e+03 -2.659028179951551e+03 -6.260105802827992e+03 2.158032054700000e-03 4.846418725600000e-04 1.396688017100000e-03 2.007021877700000e-03 1.615434827000000e-03 4.297129596000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.930000000000000e+02 -2.771314366974794e+06 -5.410148312021180e+06 3.748920556097709e+06 -3.303955436627504e+03 -2.658900722571493e+03 -6.260188041580948e+03 2.158032054700000e-03 4.846418725600000e-04 1.396688017100000e-03 2.007021877700000e-03 1.615434827000000e-03 4.297129596000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.940000000000000e+02 -2.771380445513946e+06 -5.410201488717943e+06 3.748795351609425e+06 -3.303902876920338e+03 -2.658773272030739e+03 -6.260270272254104e+03 2.158032054700000e-03 4.846418725600000e-04 1.396688017100000e-03 2.007021877700000e-03 1.615434827000000e-03 4.297129596000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.950000000000000e+02 -2.771446523062579e+06 -5.410254662925254e+06 3.748670145345448e+06 -3.303850310775249e+03 -2.658645813230508e+03 -6.260352505650925e+03 2.158032054700000e-03 4.846418725600000e-04 1.396688017100000e-03 2.007021877700000e-03 1.615434827000000e-03 4.297129596000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.960000000000000e+02 -2.771512599546842e+06 -5.410307834578585e+06 3.748544937467651e+06 -3.303797727448497e+03 -2.658518738369718e+03 -6.260434567505604e+03 2.158032054700000e-03 4.846418725600000e-04 1.396688017100000e-03 2.007021877700000e-03 1.615434827000000e-03 4.297129596000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.970000000000000e+02 -2.771578674967040e+06 -5.410361003670718e+06 3.748419727972854e+06 -3.303745157653857e+03 -2.658391300849848e+03 -6.260516784748566e+03 2.158032054700000e-03 4.846418725600000e-04 1.396688017100000e-03 2.007021877700000e-03 1.615434827000000e-03 4.297129596000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.980000000000000e+02 -2.771644749336632e+06 -5.410414170214410e+06 3.748294516831914e+06 -3.303692588177484e+03 -2.658263840437286e+03 -6.260599008261360e+03 2.158032054700000e-03 4.846418725600000e-04 1.396688017100000e-03 2.007021877700000e-03 1.615434827000000e-03 4.297129596000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.990000000000000e+02 -2.771710822656729e+06 -5.410467334210773e+06 3.748169304042391e+06 -3.303640016411202e+03 -2.658136378903881e+03 -6.260681229307648e+03 2.158032054700000e-03 4.846418725600000e-04 1.396688017100000e-03 2.007021877700000e-03 1.615434827000000e-03 4.297129596000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.000000000000000e+02 -2.771776894927196e+06 -5.410520495659716e+06 3.748044089604522e+06 -3.303587442034059e+03 -2.658008917247028e+03 -6.260763447580885e+03 2.158032054700000e-03 4.846418725600000e-04 1.396688017100000e-03 2.007021877700000e-03 1.615434827000000e-03 4.297129596000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.010000000000000e+02 -2.771842966118725e+06 -5.410573654532442e+06 3.747918873581543e+06 -3.303534869111248e+03 -2.657881457424453e+03 -6.260845660297975e+03 2.157774813600000e-03 4.841981161900000e-04 1.396573821900000e-03 2.006436534800000e-03 1.615004727600000e-03 4.298036444400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.020000000000000e+02 -2.771909036319564e+06 -5.410626810915633e+06 3.747793655783060e+06 -3.303482289677383e+03 -2.657753989294225e+03 -6.260927875792800e+03 2.157774813600000e-03 4.841981161900000e-04 1.396573821900000e-03 2.006436534800000e-03 1.615004727600000e-03 4.298036444400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.030000000000000e+02 -2.771975105455935e+06 -5.410679964736875e+06 3.747668436368164e+06 -3.303429709002774e+03 -2.657626522322816e+03 -6.261010087292118e+03 2.157774813600000e-03 4.841981161900000e-04 1.396573821900000e-03 2.006436534800000e-03 1.615004727600000e-03 4.298036444400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.040000000000000e+02 -2.772041173483808e+06 -5.410733115952924e+06 3.747543215431876e+06 -3.303377131662741e+03 -2.657499061696092e+03 -6.261092290301932e+03 2.157774813600000e-03 4.841981161900000e-04 1.396573821900000e-03 2.006436534800000e-03 1.615004727600000e-03 4.298036444400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.050000000000000e+02 -2.772107240506154e+06 -5.410786264664907e+06 3.747417992752017e+06 -3.303324549088100e+03 -2.657371594289950e+03 -6.261174494797901e+03 2.157774813600000e-03 4.841981161900000e-04 1.396573821900000e-03 2.006436534800000e-03 1.615004727600000e-03 4.298036444400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.060000000000000e+02 -2.772173306475695e+06 -5.410839410832819e+06 3.747292768424348e+06 -3.303271815996946e+03 -2.657244299883046e+03 -6.261256686120239e+03 2.157774813600000e-03 4.841981161900000e-04 1.396573821900000e-03 2.006436534800000e-03 1.615004727600000e-03 4.298036444400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.070000000000000e+02 -2.772239371377936e+06 -5.410892554436392e+06 3.747167542485999e+06 -3.303219222099825e+03 -2.657116840133888e+03 -6.261338884245009e+03 2.157774813600000e-03 4.841981161900000e-04 1.396573821900000e-03 2.006436534800000e-03 1.615004727600000e-03 4.298036444400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.080000000000000e+02 -2.772305435243145e+06 -5.410945695505031e+06 3.747042314871943e+06 -3.303166632365454e+03 -2.656989368127613e+03 -6.261421081991162e+03 2.157774813600000e-03 4.841981161900000e-04 1.396573821900000e-03 2.006436534800000e-03 1.615004727600000e-03 4.298036444400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.090000000000000e+02 -2.772371498043856e+06 -5.410998834011761e+06 3.746917085641452e+06 -3.303114042811632e+03 -2.656861896519897e+03 -6.261503275429250e+03 2.157774813600000e-03 4.841981161900000e-04 1.396573821900000e-03 2.006436534800000e-03 1.615004727600000e-03 4.298036444400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.100000000000000e+02 -2.772437559750489e+06 -5.411051969927572e+06 3.746791854858308e+06 -3.303061453947705e+03 -2.656734430176763e+03 -6.261585462101170e+03 2.157774813600000e-03 4.841981161900000e-04 1.396573821900000e-03 2.006436534800000e-03 1.615004727600000e-03 4.298036444400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.110000000000000e+02 -2.772503620451278e+06 -5.411105103339112e+06 3.746666622332094e+06 -3.303008859845213e+03 -2.656606957243474e+03 -6.261667650173476e+03 2.157517551700000e-03 4.837544269100000e-04 1.396459410100000e-03 2.005851397200000e-03 1.614574350900000e-03 4.298943171300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.120000000000000e+02 -2.772569680102196e+06 -5.411158234203139e+06 3.746541388157835e+06 -3.302956265169083e+03 -2.656479482522744e+03 -6.261749835286322e+03 2.157517551700000e-03 4.837544269100000e-04 1.396459410100000e-03 2.005851397200000e-03 1.614574350900000e-03 4.298943171300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.130000000000000e+02 -2.772635738703103e+06 -5.411211362519563e+06 3.746416152335759e+06 -3.302903667726130e+03 -2.656352007404623e+03 -6.261832017823774e+03 2.157517551700000e-03 4.837544269100000e-04 1.396459410100000e-03 2.005851397200000e-03 1.614574350900000e-03 4.298943171300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.140000000000000e+02 -2.772701796268600e+06 -5.411264488302736e+06 3.746290914834328e+06 -3.302851067163385e+03 -2.656224529308613e+03 -6.261914199127698e+03 2.157517551700000e-03 4.837544269100000e-04 1.396459410100000e-03 2.005851397200000e-03 1.614574350900000e-03 4.298943171300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.150000000000000e+02 -2.772767852784114e+06 -5.411317611538331e+06 3.746165675685014e+06 -3.302798465873822e+03 -2.656097049802572e+03 -6.261996377370894e+03 2.157517551700000e-03 4.837544269100000e-04 1.396459410100000e-03 2.005851397200000e-03 1.614574350900000e-03 4.298943171300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.160000000000000e+02 -2.772833908222051e+06 -5.411370732204564e+06 3.746040434955805e+06 -3.302745963441521e+03 -2.655969933727290e+03 -6.262078339736599e+03 2.157517551700000e-03 4.837544269100000e-04 1.396459410100000e-03 2.005851397200000e-03 1.614574350900000e-03 4.298943171300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.170000000000000e+02 -2.772899962638824e+06 -5.411423850351874e+06 3.745915192516903e+06 -3.302693363001633e+03 -2.655842473133970e+03 -6.262160500831113e+03 2.157517551700000e-03 4.837544269100000e-04 1.396459410100000e-03 2.005851397200000e-03 1.614574350900000e-03 4.298943171300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.180000000000000e+02 -2.772966015990370e+06 -5.411476965936692e+06 3.745789948462944e+06 -3.302640757201201e+03 -2.655714992401859e+03 -6.262242669565238e+03 2.157517551700000e-03 4.837544269100000e-04 1.396459410100000e-03 2.005851397200000e-03 1.614574350900000e-03 4.298943171300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.190000000000000e+02 -2.773032068306423e+06 -5.411530078988232e+06 3.745664702729722e+06 -3.302588148416703e+03 -2.655587509072720e+03 -6.262324836828653e+03 2.157517551700000e-03 4.837544269100000e-04 1.396459410100000e-03 2.005851397200000e-03 1.614574350900000e-03 4.298943171300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.200000000000000e+02 -2.773098119557387e+06 -5.411583189477498e+06 3.745539455381022e+06 -3.302535537545298e+03 -2.655460027160413e+03 -6.262407000372976e+03 2.157517551700000e-03 4.837544269100000e-04 1.396459410100000e-03 2.005851397200000e-03 1.614574350900000e-03 4.298943171300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.210000000000000e+02 -2.773164169743432e+06 -5.411636297404619e+06 3.745414206416549e+06 -3.302482927424363e+03 -2.655332545473797e+03 -6.262489159424414e+03 2.157260268900000e-03 4.833108046000000e-04 1.396344781300000e-03 2.005266464600000e-03 1.614143696500000e-03 4.299849776500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.220000000000000e+02 -2.773230218879049e+06 -5.411689402783877e+06 3.745288955804938e+06 -3.302430314495609e+03 -2.655205063463461e+03 -6.262571315886031e+03 2.157260268900000e-03 4.833108046000000e-04 1.396344781300000e-03 2.005266464600000e-03 1.614143696500000e-03 4.299849776500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.230000000000000e+02 -2.773296267008564e+06 -5.411742505658746e+06 3.745163703450537e+06 -3.302377697677852e+03 -2.655077573632855e+03 -6.262653473680091e+03 2.157260268900000e-03 4.833108046000000e-04 1.396344781300000e-03 2.005266464600000e-03 1.614143696500000e-03 4.299849776500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.240000000000000e+02 -2.773362314028779e+06 -5.411795605927994e+06 3.745038449576048e+06 -3.302325082396418e+03 -2.654950091478245e+03 -6.262735623217381e+03 2.157260268900000e-03 4.833108046000000e-04 1.396344781300000e-03 2.005266464600000e-03 1.614143696500000e-03 4.299849776500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.250000000000000e+02 -2.773428360027906e+06 -5.411848703678210e+06 3.744913193991020e+06 -3.302272462918605e+03 -2.654822604410217e+03 -6.262817772903451e+03 2.157260268900000e-03 4.833108046000000e-04 1.396344781300000e-03 2.005266464600000e-03 1.614143696500000e-03 4.299849776500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.260000000000000e+02 -2.773494404956650e+06 -5.411901798882848e+06 3.744787936795619e+06 -3.302219579420206e+03 -2.654695950202965e+03 -6.262899661143631e+03 2.157260268900000e-03 4.833108046000000e-04 1.396344781300000e-03 2.005266464600000e-03 1.614143696500000e-03 4.299849776500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.270000000000000e+02 -2.773560448826195e+06 -5.411954891532302e+06 3.744662677971562e+06 -3.302166940822220e+03 -2.654568505924650e+03 -6.262981792068039e+03 2.157260268900000e-03 4.833108046000000e-04 1.396344781300000e-03 2.005266464600000e-03 1.614143696500000e-03 4.299849776500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.280000000000000e+02 -2.773626491599019e+06 -5.412007981588557e+06 3.744537417600169e+06 -3.302114317957584e+03 -2.654441019881546e+03 -6.263063930699101e+03 2.157260268900000e-03 4.833108046000000e-04 1.396344781300000e-03 2.005266464600000e-03 1.614143696500000e-03 4.299849776500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.290000000000000e+02 -2.773692533380244e+06 -5.412061069154744e+06 3.744412155454527e+06 -3.302061690313527e+03 -2.654313524243473e+03 -6.263146071884279e+03 2.157260268900000e-03 4.833108046000000e-04 1.396344781300000e-03 2.005266464600000e-03 1.614143696500000e-03 4.299849776500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.300000000000000e+02 -2.773758574037238e+06 -5.412114154100759e+06 3.744286891820923e+06 -3.302009065419460e+03 -2.654186037852640e+03 -6.263228203534370e+03 2.157260268900000e-03 4.833108046000000e-04 1.396344781300000e-03 2.005266464600000e-03 1.614143696500000e-03 4.299849776500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.310000000000000e+02 -2.773824613687648e+06 -5.412167236542070e+06 3.744161626445320e+06 -3.301956434961109e+03 -2.654058545123327e+03 -6.263310336617399e+03 2.157002965400000e-03 4.828672495300000e-04 1.396229935700000e-03 2.004681737300000e-03 1.613712764400000e-03 4.300756258900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.320000000000000e+02 -2.773890652302184e+06 -5.412220316449902e+06 3.744036359390983e+06 -3.301903803128032e+03 -2.653931048123339e+03 -6.263392468245207e+03 2.157002965400000e-03 4.828672495300000e-04 1.396229935700000e-03 2.004681737300000e-03 1.613712764400000e-03 4.300756258900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.330000000000000e+02 -2.773956689821728e+06 -5.412273393766328e+06 3.743911090785464e+06 -3.301851171007243e+03 -2.653803557479726e+03 -6.263474593067193e+03 2.157002965400000e-03 4.828672495300000e-04 1.396229935700000e-03 2.004681737300000e-03 1.613712764400000e-03 4.300756258900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.340000000000000e+02 -2.774022726320048e+06 -5.412326468563684e+06 3.743785820469530e+06 -3.301798536363203e+03 -2.653676060674755e+03 -6.263556717829220e+03 2.157002965400000e-03 4.828672495300000e-04 1.396229935700000e-03 2.004681737300000e-03 1.613712764400000e-03 4.300756258900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.350000000000000e+02 -2.774088761796998e+06 -5.412379540841877e+06 3.743660548443417e+06 -3.301745897103468e+03 -2.653548559548367e+03 -6.263638842663110e+03 2.157002965400000e-03 4.828672495300000e-04 1.396229935700000e-03 2.004681737300000e-03 1.613712764400000e-03 4.300756258900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.360000000000000e+02 -2.774154796159032e+06 -5.412432610520400e+06 3.743535274898543e+06 -3.301693004288000e+03 -2.653421377542897e+03 -6.263720935590221e+03 2.157002965400000e-03 4.828672495300000e-04 1.396229935700000e-03 2.004681737300000e-03 1.613712764400000e-03 4.300756258900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.370000000000000e+02 -2.774220829485299e+06 -5.412485677666273e+06 3.743409999673985e+06 -3.301640349921571e+03 -2.653293895445142e+03 -6.263803050629605e+03 2.157002965400000e-03 4.828672495300000e-04 1.396229935700000e-03 2.004681737300000e-03 1.613712764400000e-03 4.300756258900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.380000000000000e+02 -2.774286861803049e+06 -5.412538742305627e+06 3.743284722711433e+06 -3.301587704325670e+03 -2.653166389333418e+03 -6.263885168505853e+03 2.157002965400000e-03 4.828672495300000e-04 1.396229935700000e-03 2.004681737300000e-03 1.613712764400000e-03 4.300756258900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.390000000000000e+02 -2.774352892996156e+06 -5.412591804324577e+06 3.743159444261611e+06 -3.301535061384504e+03 -2.653038892251623e+03 -6.263967276993142e+03 2.157002965400000e-03 4.828672495300000e-04 1.396229935700000e-03 2.004681737300000e-03 1.613712764400000e-03 4.300756258900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.400000000000000e+02 -2.774418923153095e+06 -5.412644863809897e+06 3.743034164133491e+06 -3.301482416828374e+03 -2.652911391705766e+03 -6.264049383768665e+03 2.157002965400000e-03 4.828672495300000e-04 1.396229935700000e-03 2.004681737300000e-03 1.613712764400000e-03 4.300756258900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.410000000000000e+02 -2.774484952273741e+06 -5.412697920761483e+06 3.742908882327301e+06 -3.301429769241472e+03 -2.652783888219532e+03 -6.264131489250525e+03 2.156745641100000e-03 4.824237615900000e-04 1.396114872800000e-03 2.004097215300000e-03 1.613281554400000e-03 4.301662618400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.420000000000000e+02 -2.774550980357953e+06 -5.412750975179242e+06 3.742783598843280e+06 -3.301377117772824e+03 -2.652656382332427e+03 -6.264213593587507e+03 2.156745641100000e-03 4.824237615900000e-04 1.396114872800000e-03 2.004097215300000e-03 1.613281554400000e-03 4.301662618400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.430000000000000e+02 -2.774617007376447e+06 -5.412804027034436e+06 3.742658313744701e+06 -3.301324466720702e+03 -2.652528876838472e+03 -6.264295693511680e+03 2.156745641100000e-03 4.824237615900000e-04 1.396114872800000e-03 2.004097215300000e-03 1.613281554400000e-03 4.301662618400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.440000000000000e+02 -2.774683033358535e+06 -5.412857076355833e+06 3.742533026968215e+06 -3.301271812582482e+03 -2.652401368532694e+03 -6.264377792108950e+03 2.156745641100000e-03 4.824237615900000e-04 1.396114872800000e-03 2.004097215300000e-03 1.613281554400000e-03 4.301662618400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.450000000000000e+02 -2.774749058245208e+06 -5.412910123085597e+06 3.742407738641223e+06 -3.301219158763608e+03 -2.652273865593609e+03 -6.264459884072293e+03 2.156745641100000e-03 4.824237615900000e-04 1.396114872800000e-03 2.004097215300000e-03 1.613281554400000e-03 4.301662618400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.460000000000000e+02 -2.774815082112209e+06 -5.412963167307783e+06 3.742282448610723e+06 -3.301166601815781e+03 -2.652146943727107e+03 -6.264541662226986e+03 2.156745641100000e-03 4.824237615900000e-04 1.396114872800000e-03 2.004097215300000e-03 1.613281554400000e-03 4.301662618400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.470000000000000e+02 -2.774881104906583e+06 -5.413016208961272e+06 3.742157156981048e+06 -3.301113948110180e+03 -2.652019467847627e+03 -6.264623733687442e+03 2.156745641100000e-03 4.824237615900000e-04 1.396114872800000e-03 2.004097215300000e-03 1.613281554400000e-03 4.301662618400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.480000000000000e+02 -2.774947126650880e+06 -5.413069248067603e+06 3.742031863702927e+06 -3.301061288112448e+03 -2.651891957175606e+03 -6.264705819880581e+03 2.156745641100000e-03 4.824237615900000e-04 1.396114872800000e-03 2.004097215300000e-03 1.613281554400000e-03 4.301662618400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.490000000000000e+02 -2.775013147358587e+06 -5.413122284640038e+06 3.741906568747173e+06 -3.301008624751923e+03 -2.651764443960584e+03 -6.264787904752383e+03 2.156745641100000e-03 4.824237615900000e-04 1.396114872800000e-03 2.004097215300000e-03 1.613281554400000e-03 4.301662618400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.500000000000000e+02 -2.775079167000133e+06 -5.413175318649615e+06 3.741781272177606e+06 -3.300955959869956e+03 -2.651636931994511e+03 -6.264869985721022e+03 2.156745641100000e-03 4.824237615900000e-04 1.396114872800000e-03 2.004097215300000e-03 1.613281554400000e-03 4.301662618400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.510000000000000e+02 -2.775145185546256e+06 -5.413228350067605e+06 3.741655974057512e+06 -3.300903297852591e+03 -2.651509424203788e+03 -6.264952059419044e+03 2.156488296000000e-03 4.819803407900000e-04 1.395999592700000e-03 2.003512898300000e-03 1.612850066300000e-03 4.302568854400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.520000000000000e+02 -2.775211203129249e+06 -5.413281379023797e+06 3.741530674100981e+06 -3.300850626715970e+03 -2.651381904140270e+03 -6.265034138898106e+03 2.156488296000000e-03 4.819803407900000e-04 1.395999592700000e-03 2.003512898300000e-03 1.612850066300000e-03 4.302568854400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.530000000000000e+02 -2.775277219601832e+06 -5.413334405373776e+06 3.741405372626184e+06 -3.300797957516973e+03 -2.651254391226193e+03 -6.265116210181910e+03 2.156488296000000e-03 4.819803407900000e-04 1.395999592700000e-03 2.003512898300000e-03 1.612850066300000e-03 4.302568854400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.540000000000000e+02 -2.775343235023021e+06 -5.413387429175405e+06 3.741280069505642e+06 -3.300745287677722e+03 -2.651126876476503e+03 -6.265198278559217e+03 2.156488296000000e-03 4.819803407900000e-04 1.395999592700000e-03 2.003512898300000e-03 1.612850066300000e-03 4.302568854400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.550000000000000e+02 -2.775409249407404e+06 -5.413440450443015e+06 3.741154764707796e+06 -3.300692614598020e+03 -2.650999359200044e+03 -6.265280345550806e+03 2.156488296000000e-03 4.819803407900000e-04 1.395999592700000e-03 2.003512898300000e-03 1.612850066300000e-03 4.302568854400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.560000000000000e+02 -2.775475262721698e+06 -5.413493469152148e+06 3.741029458296792e+06 -3.300639754222993e+03 -2.650872068029739e+03 -6.265362392355127e+03 2.156488296000000e-03 4.819803407900000e-04 1.395999592700000e-03 2.003512898300000e-03 1.612850066300000e-03 4.302568854400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.570000000000000e+02 -2.775541274979635e+06 -5.413546485308556e+06 3.740904150250280e+06 -3.300587067649109e+03 -2.650744560880592e+03 -6.265444452868690e+03 2.156488296000000e-03 4.819803407900000e-04 1.395999592700000e-03 2.003512898300000e-03 1.612850066300000e-03 4.302568854400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.580000000000000e+02 -2.775607286184769e+06 -5.413599498915324e+06 3.740778840560931e+06 -3.300534388552607e+03 -2.650617041007433e+03 -6.265526511669269e+03 2.156488296000000e-03 4.819803407900000e-04 1.395999592700000e-03 2.003512898300000e-03 1.612850066300000e-03 4.302568854400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.590000000000000e+02 -2.775673296338319e+06 -5.413652509973642e+06 3.740653529226111e+06 -3.300481708434719e+03 -2.650489519587224e+03 -6.265608567608581e+03 2.156488296000000e-03 4.819803407900000e-04 1.395999592700000e-03 2.003512898300000e-03 1.612850066300000e-03 4.302568854400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.600000000000000e+02 -2.775739305454880e+06 -5.413705518497837e+06 3.740528216214259e+06 -3.300429025171316e+03 -2.650361995299823e+03 -6.265690622272723e+03 2.156488296000000e-03 4.819803407900000e-04 1.395999592700000e-03 2.003512898300000e-03 1.612850066300000e-03 4.302568854400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.610000000000000e+02 -2.775805313504894e+06 -5.413758524458960e+06 3.740402901589201e+06 -3.300376340668609e+03 -2.650234472317417e+03 -6.265772672878047e+03 2.156230930200000e-03 4.815369871500000e-04 1.395884095100000e-03 2.002928786500000e-03 1.612418299800000e-03 4.303474966600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.620000000000000e+02 -2.775871320503223e+06 -5.413811527871570e+06 3.740277585318839e+06 -3.300323655279563e+03 -2.650106947749316e+03 -6.265854720577064e+03 2.156230930200000e-03 4.815369871500000e-04 1.395884095100000e-03 2.002928786500000e-03 1.612418299800000e-03 4.303474966600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.630000000000000e+02 -2.775937326420313e+06 -5.413864528706722e+06 3.740152267466998e+06 -3.300270969575202e+03 -2.649979426427226e+03 -6.265936762905483e+03 2.156230930200000e-03 4.815369871500000e-04 1.395884095100000e-03 2.002928786500000e-03 1.612418299800000e-03 4.303474966600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.640000000000000e+02 -2.776003331359016e+06 -5.413917527065292e+06 3.740026947811333e+06 -3.300218276496776e+03 -2.649851894671847e+03 -6.266018809363498e+03 2.156230930200000e-03 4.815369871500000e-04 1.395884095100000e-03 2.002928786500000e-03 1.612418299800000e-03 4.303474966600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.650000000000000e+02 -2.776069335172368e+06 -5.413970522803169e+06 3.739901626669518e+06 -3.300165587731132e+03 -2.649724370949237e+03 -6.266100846126103e+03 2.156230930200000e-03 4.815369871500000e-04 1.395884095100000e-03 2.002928786500000e-03 1.612418299800000e-03 4.303474966600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.660000000000000e+02 -2.776135337957800e+06 -5.414023516013665e+06 3.739776303858408e+06 -3.300113359901606e+03 -2.649597187604878e+03 -6.266182510165577e+03 2.156230930200000e-03 4.815369871500000e-04 1.395884095100000e-03 2.002928786500000e-03 1.612418299800000e-03 4.303474966600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.670000000000000e+02 -2.776201339705887e+06 -5.414076506689701e+06 3.739650979372379e+06 -3.300060690317228e+03 -2.649469678299031e+03 -6.266264523360214e+03 2.156230930200000e-03 4.815369871500000e-04 1.395884095100000e-03 2.002928786500000e-03 1.612418299800000e-03 4.303474966600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.680000000000000e+02 -2.776267340431417e+06 -5.414129494845863e+06 3.739525653177931e+06 -3.300007992143355e+03 -2.649342143506686e+03 -6.266346557371226e+03 2.156230930200000e-03 4.815369871500000e-04 1.395884095100000e-03 2.002928786500000e-03 1.612418299800000e-03 4.303474966600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.690000000000000e+02 -2.776333340104918e+06 -5.414182480453297e+06 3.739400325338737e+06 -3.299955291658262e+03 -2.649214608312715e+03 -6.266428588597406e+03 2.156230930200000e-03 4.815369871500000e-04 1.395884095100000e-03 2.002928786500000e-03 1.612418299800000e-03 4.303474966600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.700000000000000e+02 -2.776399338682131e+06 -5.414235463468644e+06 3.739274995950435e+06 -3.299902591881753e+03 -2.649087078290968e+03 -6.266510613102476e+03 2.156230930200000e-03 4.815369871500000e-04 1.395884095100000e-03 2.002928786500000e-03 1.612418299800000e-03 4.303474966600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.710000000000000e+02 -2.776465336222037e+06 -5.414288443949719e+06 3.739149664885519e+06 -3.299849889959637e+03 -2.648959544815130e+03 -6.266592636135289e+03 2.155973543500000e-03 4.810937005600000e-04 1.395768379900000e-03 2.002344879700000e-03 1.611986254700000e-03 4.304380954700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.720000000000000e+02 -2.776531332665581e+06 -5.414341421838671e+06 3.739024332271610e+06 -3.299797188538018e+03 -2.648832016830850e+03 -6.266674652398808e+03 2.155973543500000e-03 4.810937005600000e-04 1.395768379900000e-03 2.002344879700000e-03 1.611986254700000e-03 4.304380954700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.730000000000000e+02 -2.776597328130592e+06 -5.414394397250979e+06 3.738898997853992e+06 -3.299744481373373e+03 -2.648704477143737e+03 -6.266756672610685e+03 2.155973543500000e-03 4.810937005600000e-04 1.395768379900000e-03 2.002344879700000e-03 1.611986254700000e-03 4.304380954700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.740000000000000e+02 -2.776663322513966e+06 -5.414447370085622e+06 3.738773661855506e+06 -3.299691773540708e+03 -2.648576941021436e+03 -6.266838687471603e+03 2.155973543500000e-03 4.810937005600000e-04 1.395768379900000e-03 2.002344879700000e-03 1.611986254700000e-03 4.304380954700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.750000000000000e+02 -2.776729315830287e+06 -5.414500340356925e+06 3.738648324244586e+06 -3.299639064618109e+03 -2.648449406017760e+03 -6.266920698290345e+03 2.155973543500000e-03 4.810937005600000e-04 1.395768379900000e-03 2.002344879700000e-03 1.611986254700000e-03 4.304380954700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.760000000000000e+02 -2.776795308085279e+06 -5.414553308094041e+06 3.738522984991526e+06 -3.299585897726697e+03 -2.648322599766967e+03 -6.267002585785533e+03 2.155973543500000e-03 4.810937005600000e-04 1.395768379900000e-03 2.002344879700000e-03 1.611986254700000e-03 4.304380954700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.770000000000000e+02 -2.776861299266678e+06 -5.414606273262750e+06 3.738397644139179e+06 -3.299533159007062e+03 -2.648195101538709e+03 -6.267084585569707e+03 2.155973543500000e-03 4.810937005600000e-04 1.395768379900000e-03 2.002344879700000e-03 1.611986254700000e-03 4.304380954700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.780000000000000e+02 -2.776927289393303e+06 -5.414659235880187e+06 3.738272301647793e+06 -3.299480443770533e+03 -2.648067561515228e+03 -6.267166589443357e+03 2.155973543500000e-03 4.810937005600000e-04 1.395768379900000e-03 2.002344879700000e-03 1.611986254700000e-03 4.304380954700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.790000000000000e+02 -2.776993278467622e+06 -5.414712195948777e+06 3.738146957512035e+06 -3.299427727352229e+03 -2.647940020234747e+03 -6.267248590398127e+03 2.155973543500000e-03 4.810937005600000e-04 1.395768379900000e-03 2.002344879700000e-03 1.611986254700000e-03 4.304380954700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.800000000000000e+02 -2.777059266504229e+06 -5.414765153482828e+06 3.738021611700332e+06 -3.299375008228178e+03 -2.647812475762088e+03 -6.267330590020398e+03 2.155973543500000e-03 4.810937005600000e-04 1.395768379900000e-03 2.002344879700000e-03 1.611986254700000e-03 4.304380954700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.810000000000000e+02 -2.777125253444147e+06 -5.414818108424603e+06 3.737896264340141e+06 -3.299322289322235e+03 -2.647684937148851e+03 -6.267412582838631e+03 2.155716136100000e-03 4.806504812900000e-04 1.395652446900000e-03 2.001761178100000e-03 1.611553931100000e-03 4.305286817800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.820000000000000e+02 -2.777191239346366e+06 -5.414871060831876e+06 3.737770915303940e+06 -3.299269568821471e+03 -2.647557394499080e+03 -6.267494574193647e+03 2.155716136100000e-03 4.806504812900000e-04 1.395652446900000e-03 2.001761178100000e-03 1.611553931100000e-03 4.305286817800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.830000000000000e+02 -2.777257224225367e+06 -5.414924010718890e+06 3.737645564560331e+06 -3.299216843378384e+03 -2.647429847734516e+03 -6.267576565672013e+03 2.155716136100000e-03 4.806504812900000e-04 1.395652446900000e-03 2.001761178100000e-03 1.611553931100000e-03 4.305286817800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.840000000000000e+02 -2.777323208037184e+06 -5.414976958042537e+06 3.737520212204427e+06 -3.299164118296742e+03 -2.647302301075757e+03 -6.267658552896655e+03 2.155716136100000e-03 4.806504812900000e-04 1.395652446900000e-03 2.001761178100000e-03 1.611553931100000e-03 4.305286817800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.850000000000000e+02 -2.777389190796387e+06 -5.415029902817135e+06 3.737394858204662e+06 -3.299111390726863e+03 -2.647174753988732e+03 -6.267740537431011e+03 2.155716136100000e-03 4.806504812900000e-04 1.395652446900000e-03 2.001761178100000e-03 1.611553931100000e-03 4.305286817800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.860000000000000e+02 -2.777455172498670e+06 -5.415082845060967e+06 3.737269502567654e+06 -3.299058451416075e+03 -2.647048124558898e+03 -6.267822198789238e+03 2.155716136100000e-03 4.806504812900000e-04 1.395652446900000e-03 2.001761178100000e-03 1.611553931100000e-03 4.305286817800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.870000000000000e+02 -2.777521153133742e+06 -5.415135784742721e+06 3.737144145318189e+06 -3.299005708991794e+03 -2.646920626563473e+03 -6.267904159783225e+03 2.155716136100000e-03 4.806504812900000e-04 1.395652446900000e-03 2.001761178100000e-03 1.611553931100000e-03 4.305286817800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.880000000000000e+02 -2.777587132682092e+06 -5.415188721842051e+06 3.737018786498573e+06 -3.298952978106171e+03 -2.646793080376257e+03 -6.267986133302930e+03 2.155716136100000e-03 4.806504812900000e-04 1.395652446900000e-03 2.001761178100000e-03 1.611553931100000e-03 4.305286817800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.890000000000000e+02 -2.777653111192301e+06 -5.415241656406587e+06 3.736893426003686e+06 -3.298900243984158e+03 -2.646665531520684e+03 -6.268068105497526e+03 2.155716136100000e-03 4.806504812900000e-04 1.395652446900000e-03 2.001761178100000e-03 1.611553931100000e-03 4.305286817800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.900000000000000e+02 -2.777719088664517e+06 -5.415294588436466e+06 3.736768063833223e+06 -3.298847507963532e+03 -2.646537979148340e+03 -6.268150076132672e+03 2.155716136100000e-03 4.806504812900000e-04 1.395652446900000e-03 2.001761178100000e-03 1.611553931100000e-03 4.305286817800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.910000000000000e+02 -2.777785065083909e+06 -5.415347517917169e+06 3.736642700019223e+06 -3.298794769612702e+03 -2.646410425827282e+03 -6.268232044240915e+03 2.155458707900000e-03 4.802073292400000e-04 1.395536296000000e-03 2.001177681600000e-03 1.611121328500000e-03 4.306192555600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.920000000000000e+02 -2.777851040435637e+06 -5.415400444834207e+06 3.736517334593730e+06 -3.298742029967511e+03 -2.646282874130605e+03 -6.268314008172944e+03 2.155458707900000e-03 4.802073292400000e-04 1.395536296000000e-03 2.001177681600000e-03 1.611121328500000e-03 4.306192555600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.930000000000000e+02 -2.777917014778671e+06 -5.415453369245326e+06 3.736391967429205e+06 -3.298689286494540e+03 -2.646155314569526e+03 -6.268395973414827e+03 2.155458707900000e-03 4.802073292400000e-04 1.395536296000000e-03 2.001177681600000e-03 1.611121328500000e-03 4.306192555600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.940000000000000e+02 -2.777982988039364e+06 -5.415506291078411e+06 3.736266598684928e+06 -3.298636542804175e+03 -2.646027758524979e+03 -6.268477933121647e+03 2.155458707900000e-03 4.802073292400000e-04 1.395536296000000e-03 2.001177681600000e-03 1.611121328500000e-03 4.306192555600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.950000000000000e+02 -2.778048960261691e+06 -5.415559210376572e+06 3.736141228265703e+06 -3.298583795646422e+03 -2.645900199678077e+03 -6.268559891670608e+03 2.155458707900000e-03 4.802073292400000e-04 1.395536296000000e-03 2.001177681600000e-03 1.611121328500000e-03 4.306192555600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.960000000000000e+02 -2.778114931384853e+06 -5.415612127072831e+06 3.736015856293183e+06 -3.298530943992067e+03 -2.645772170562812e+03 -6.268642108213358e+03 2.155458707900000e-03 4.802073292400000e-04 1.395536296000000e-03 2.001177681600000e-03 1.611121328500000e-03 4.306192555600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.970000000000000e+02 -2.778180901469728e+06 -5.415665041233859e+06 3.735890482644942e+06 -3.298478188297001e+03 -2.645644584931982e+03 -6.268724074742162e+03 2.155458707900000e-03 4.802073292400000e-04 1.395536296000000e-03 2.001177681600000e-03 1.611121328500000e-03 4.306192555600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.980000000000000e+02 -2.778246870483707e+06 -5.415717952828113e+06 3.735765107392137e+06 -3.298425438851534e+03 -2.645517026635702e+03 -6.268806021918643e+03 2.155458707900000e-03 4.802073292400000e-04 1.395536296000000e-03 2.001177681600000e-03 1.611121328500000e-03 4.306192555600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.990000000000000e+02 -2.778312838473974e+06 -5.415770861901842e+06 3.735639730432603e+06 -3.298372684964221e+03 -2.645389463486388e+03 -6.268887969320073e+03 2.155458707900000e-03 4.802073292400000e-04 1.395536296000000e-03 2.001177681600000e-03 1.611121328500000e-03 4.306192555600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.000000000000000e+02 -2.778378805381593e+06 -5.415823768397345e+06 3.735514351893835e+06 -3.298319930896891e+03 -2.645261903643797e+03 -6.268969911265430e+03 2.155458707900000e-03 4.802073292400000e-04 1.395536296000000e-03 2.001177681600000e-03 1.611121328500000e-03 4.306192555600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.010000000000000e+02 -2.778444771265516e+06 -5.415876672372356e+06 3.735388971648279e+06 -3.298267173989745e+03 -2.645134338259801e+03 -6.269051853006212e+03 2.155201258900000e-03 4.797642444100000e-04 1.395419927000000e-03 2.000594390300000e-03 1.610688446900000e-03 4.307098167700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.020000000000000e+02 -2.778510736096214e+06 -5.415929573797981e+06 3.735263589759788e+06 -3.298214414677039e+03 -2.645006772162593e+03 -6.269133792147826e+03 2.155201258900000e-03 4.797642444100000e-04 1.395419927000000e-03 2.000594390300000e-03 1.610688446900000e-03 4.307098167700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.030000000000000e+02 -2.778576699858857e+06 -5.415982472659719e+06 3.735138206260418e+06 -3.298161654244540e+03 -2.644879207346375e+03 -6.269215727189067e+03 2.155201258900000e-03 4.797642444100000e-04 1.395419927000000e-03 2.000594390300000e-03 1.610688446900000e-03 4.307098167700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.040000000000000e+02 -2.778642662568296e+06 -5.416035368972104e+06 3.735012821118046e+06 -3.298108892884354e+03 -2.644751640880176e+03 -6.269297659372360e+03 2.155201258900000e-03 4.797642444100000e-04 1.395419927000000e-03 2.000594390300000e-03 1.610688446900000e-03 4.307098167700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.050000000000000e+02 -2.778708624195002e+06 -5.416088262706253e+06 3.734887434396538e+06 -3.298056131300141e+03 -2.644624077795914e+03 -6.269379586086607e+03 2.155201258900000e-03 4.797642444100000e-04 1.395419927000000e-03 2.000594390300000e-03 1.610688446900000e-03 4.307098167700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.060000000000000e+02 -2.778774584793453e+06 -5.416141153944355e+06 3.734762045978111e+06 -3.298003155078952e+03 -2.644497744864611e+03 -6.269461049457942e+03 2.155201258900000e-03 4.797642444100000e-04 1.395419927000000e-03 2.000594390300000e-03 1.610688446900000e-03 4.307098167700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.070000000000000e+02 -2.778840544349768e+06 -5.416194042645603e+06 3.734636655892683e+06 -3.297950374922774e+03 -2.644370240725634e+03 -6.269542949908790e+03 2.155201258900000e-03 4.797642444100000e-04 1.395419927000000e-03 2.000594390300000e-03 1.610688446900000e-03 4.307098167700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.080000000000000e+02 -2.778906502790286e+06 -5.416246928736296e+06 3.734511264299584e+06 -3.297897607115652e+03 -2.644242674970504e+03 -6.269624868586436e+03 2.155201258900000e-03 4.797642444100000e-04 1.395419927000000e-03 2.000594390300000e-03 1.610688446900000e-03 4.307098167700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.090000000000000e+02 -2.778972460192124e+06 -5.416299812291939e+06 3.734385871031949e+06 -3.297844837966676e+03 -2.644115105626904e+03 -6.269706785478310e+03 2.155201258900000e-03 4.797642444100000e-04 1.395419927000000e-03 2.000594390300000e-03 1.610688446900000e-03 4.307098167700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.100000000000000e+02 -2.779038416569845e+06 -5.416352693326823e+06 3.734260476058181e+06 -3.297792064131878e+03 -2.643987531584352e+03 -6.269788702636636e+03 2.155201258900000e-03 4.797642444100000e-04 1.395419927000000e-03 2.000594390300000e-03 1.610688446900000e-03 4.307098167700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.110000000000000e+02 -2.779104371879219e+06 -5.416405571797670e+06 3.734135079473975e+06 -3.297739289102476e+03 -2.643859958777866e+03 -6.269870615750178e+03 2.154943789200000e-03 4.793212268400000e-04 1.395303339800000e-03 2.000011304000000e-03 1.610255285900000e-03 4.308003653600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.120000000000000e+02 -2.779170326135107e+06 -5.416458447719007e+06 3.734009681247208e+06 -3.297686513511647e+03 -2.643732384463905e+03 -6.269952525771491e+03 2.154943789200000e-03 4.793212268400000e-04 1.395303339800000e-03 2.000011304000000e-03 1.610255285900000e-03 4.308003653600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.130000000000000e+02 -2.779236279352068e+06 -5.416511321105129e+06 3.733884281346293e+06 -3.297633734230968e+03 -2.643604807442132e+03 -6.270034434693765e+03 2.154943789200000e-03 4.793212268400000e-04 1.395303339800000e-03 2.000011304000000e-03 1.610255285900000e-03 4.308003653600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.140000000000000e+02 -2.779302231500579e+06 -5.416564191927155e+06 3.733758879835106e+06 -3.297580954015699e+03 -2.643477231678985e+03 -6.270116339440847e+03 2.154943789200000e-03 4.793212268400000e-04 1.395303339800000e-03 2.000011304000000e-03 1.610255285900000e-03 4.308003653600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.150000000000000e+02 -2.779368182566091e+06 -5.416617060170827e+06 3.733633476745158e+06 -3.297528174532790e+03 -2.643349658366013e+03 -6.270198238700459e+03 2.154943789200000e-03 4.793212268400000e-04 1.395303339800000e-03 2.000011304000000e-03 1.610255285900000e-03 4.308003653600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.160000000000000e+02 -2.779434132612729e+06 -5.416669925898492e+06 3.733508071954138e+06 -3.297475663924298e+03 -2.643222323792758e+03 -6.270279901049937e+03 2.154943789200000e-03 4.793212268400000e-04 1.395303339800000e-03 2.000011304000000e-03 1.610255285900000e-03 4.308003653600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.170000000000000e+02 -2.779500081605504e+06 -5.416722789076368e+06 3.733382665522114e+06 -3.297422893273158e+03 -2.643094758754674e+03 -6.270361784344941e+03 2.154943789200000e-03 4.793212268400000e-04 1.395303339800000e-03 2.000011304000000e-03 1.610255285900000e-03 4.308003653600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.180000000000000e+02 -2.779566029546339e+06 -5.416775649706340e+06 3.733257257444032e+06 -3.297370106631663e+03 -2.642967178367962e+03 -6.270443677971843e+03 2.154943789200000e-03 4.793212268400000e-04 1.395303339800000e-03 2.000011304000000e-03 1.610255285900000e-03 4.308003653600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.190000000000000e+02 -2.779631976433333e+06 -5.416828507786587e+06 3.733131847723950e+06 -3.297317317671158e+03 -2.642839597261269e+03 -6.270525568962712e+03 2.154943789200000e-03 4.793212268400000e-04 1.395303339800000e-03 2.000011304000000e-03 1.610255285900000e-03 4.308003653600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.200000000000000e+02 -2.779697922266355e+06 -5.416881363317010e+06 3.733006436362104e+06 -3.297264526328937e+03 -2.642712015568187e+03 -6.270607457285946e+03 2.154943789200000e-03 4.793212268400000e-04 1.395303339800000e-03 2.000011304000000e-03 1.610255285900000e-03 4.308003653600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.210000000000000e+02 -2.779763867060257e+06 -5.416934216312128e+06 3.732881023326369e+06 -3.297211733359092e+03 -2.642584430140629e+03 -6.270689344020963e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.220000000000000e+02 -2.779829810785415e+06 -5.416987066742999e+06 3.732755608680800e+06 -3.297158938268057e+03 -2.642456846678112e+03 -6.270771226810019e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.230000000000000e+02 -2.779895753456687e+06 -5.417039914624130e+06 3.732630192393275e+06 -3.297106142809800e+03 -2.642329261024610e+03 -6.270853106727167e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.240000000000000e+02 -2.779961695073937e+06 -5.417092759955442e+06 3.732504774464019e+06 -3.297053344565914e+03 -2.642201675227897e+03 -6.270934983962544e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.250000000000000e+02 -2.780027635651729e+06 -5.417145602751211e+06 3.732379354861452e+06 -3.297000543232804e+03 -2.642074086483522e+03 -6.271016859928893e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.260000000000000e+02 -2.780093575160830e+06 -5.417198442982799e+06 3.732253933648915e+06 -3.296947742331897e+03 -2.641946498038804e+03 -6.271098731523438e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.270000000000000e+02 -2.780159513571717e+06 -5.417251280621354e+06 3.732128510890287e+06 -3.296894941736533e+03 -2.641818915080398e+03 -6.271180596452378e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.280000000000000e+02 -2.780225450987117e+06 -5.417304115767458e+06 3.732003086363039e+06 -3.296842134968294e+03 -2.641691323306628e+03 -6.271262464200706e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.290000000000000e+02 -2.780291387377798e+06 -5.417356948392473e+06 3.731877660130512e+06 -3.296789325429249e+03 -2.641563726133948e+03 -6.271344331643990e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.300000000000000e+02 -2.780357322640775e+06 -5.417409778395626e+06 3.731752232415710e+06 -3.296736518665138e+03 -2.641436138035473e+03 -6.271426189652165e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.310000000000000e+02 -2.780423256878768e+06 -5.417462605877498e+06 3.731626802996098e+06 -3.296683707498791e+03 -2.641308545245517e+03 -6.271508047789445e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.320000000000000e+02 -2.780489190062543e+06 -5.417515430809461e+06 3.731501371935024e+06 -3.296630895426488e+03 -2.641180951074444e+03 -6.271589902936737e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.330000000000000e+02 -2.780555122147803e+06 -5.417568253148197e+06 3.731375939328378e+06 -3.296578083735670e+03 -2.641053362342853e+03 -6.271671751405716e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.340000000000000e+02 -2.780621053281615e+06 -5.417621073037636e+06 3.731250504857583e+06 -3.296525264070178e+03 -2.640925757879937e+03 -6.271753606661840e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.350000000000000e+02 -2.780686983287549e+06 -5.417673890305131e+06 3.731125068904804e+06 -3.296472447137255e+03 -2.640798162940249e+03 -6.271835452300352e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.360000000000000e+02 -2.780752912268315e+06 -5.417726705051237e+06 3.730999631247481e+06 -3.296419625955030e+03 -2.640670563305643e+03 -6.271917297997991e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.370000000000000e+02 -2.780818840165303e+06 -5.417779517218574e+06 3.730874192012627e+06 -3.296366806019229e+03 -2.640542966032447e+03 -6.271999138013278e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.380000000000000e+02 -2.780884767037142e+06 -5.417832326864560e+06 3.730748751073153e+06 -3.296313981573317e+03 -2.640415363995538e+03 -6.272080978239261e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.390000000000000e+02 -2.780950692854323e+06 -5.417885133960338e+06 3.730623308492961e+06 -3.296261155049418e+03 -2.640287761368191e+03 -6.272162815658875e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.400000000000000e+02 -2.781016617587617e+06 -5.417937938477286e+06 3.730497864335399e+06 -3.296208329543688e+03 -2.640160161060240e+03 -6.272244647521149e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.410000000000000e+02 -2.781082541266273e+06 -5.417990740444070e+06 3.730372418537045e+06 -3.296155501905162e+03 -2.640032560056306e+03 -6.272326476650523e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.420000000000000e+02 -2.781148463934227e+06 -5.418043539903714e+06 3.730246971002641e+06 -3.296102668586153e+03 -2.639904952641079e+03 -6.272408307278049e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.430000000000000e+02 -2.781214385474123e+06 -5.418096336741345e+06 3.730121521986528e+06 -3.296049839835968e+03 -2.639777352978741e+03 -6.272490128243982e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.440000000000000e+02 -2.781280306018031e+06 -5.418149131086252e+06 3.729996071202467e+06 -3.295997004805332e+03 -2.639649745222939e+03 -6.272571951747679e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.450000000000000e+02 -2.781346225477682e+06 -5.418201922852083e+06 3.729870618841672e+06 -3.295944169180346e+03 -2.639522140576022e+03 -6.272653770082673e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.460000000000000e+02 -2.781412143897299e+06 -5.418254712082095e+06 3.729745164808350e+06 -3.295891331902711e+03 -2.639394532305053e+03 -6.272735586789470e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.470000000000000e+02 -2.781478061291343e+06 -5.418307498790485e+06 3.729619709071077e+06 -3.295838489738973e+03 -2.639266919836414e+03 -6.272817403623008e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.480000000000000e+02 -2.781543977542466e+06 -5.418360282862405e+06 3.729494251884214e+06 -3.295785653195495e+03 -2.639139317172808e+03 -6.272899209380632e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.490000000000000e+02 -2.781609892812102e+06 -5.418413064455861e+06 3.729368792897830e+06 -3.295732808751064e+03 -2.639011704491370e+03 -6.272981019296033e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.500000000000000e+02 -2.781675807026671e+06 -5.418465843498886e+06 3.729243332271330e+06 -3.295679962095228e+03 -2.638884090930630e+03 -6.273062826597705e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.510000000000000e+02 -2.781741720171656e+06 -5.418518619977245e+06 3.729117870036238e+06 -3.295627116015067e+03 -2.638756477534483e+03 -6.273144629524119e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.520000000000000e+02 -2.781807632261605e+06 -5.418571393905219e+06 3.728992406160956e+06 -3.295574267250692e+03 -2.638628863792680e+03 -6.273226429813807e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.530000000000000e+02 -2.781873543296384e+06 -5.418624165282702e+06 3.728866940645718e+06 -3.295521416234069e+03 -2.638501249150961e+03 -6.273308227518112e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.540000000000000e+02 -2.781939453290835e+06 -5.418676934124199e+06 3.728741473458391e+06 -3.295468563561459e+03 -2.638373630887540e+03 -6.273390023594060e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.550000000000000e+02 -2.782005362215459e+06 -5.418729700400880e+06 3.728616004662869e+06 -3.295415709639348e+03 -2.638246013899658e+03 -6.273471815635686e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.560000000000000e+02 -2.782071270070120e+06 -5.418782464112646e+06 3.728490534259395e+06 -3.295362853968968e+03 -2.638118398503929e+03 -6.273553603730385e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.570000000000000e+02 -2.782137176884344e+06 -5.418835225288367e+06 3.728365062183994e+06 -3.295309997043678e+03 -2.637990779232419e+03 -6.273635390126320e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.580000000000000e+02 -2.782203082643224e+06 -5.418887983913498e+06 3.728239588468908e+06 -3.295257137062366e+03 -2.637863159570905e+03 -6.273717174077516e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.590000000000000e+02 -2.782268987332223e+06 -5.418940739973809e+06 3.728114113145677e+06 -3.295204277234083e+03 -2.637735540436438e+03 -6.273798953685374e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.600000000000000e+02 -2.782334891009948e+06 -5.418993493526667e+06 3.727988636087178e+06 -3.295151412037334e+03 -2.637607914598519e+03 -6.273880734775918e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.610000000000000e+02 -2.782400793617533e+06 -5.419046244514509e+06 3.727863157421004e+06 -3.295098545742546e+03 -2.637480289987741e+03 -6.273962511784314e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.620000000000000e+02 -2.782466695111078e+06 -5.419098992894386e+06 3.727737677242365e+06 -3.295045682538113e+03 -2.637352671774938e+03 -6.274044280434052e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.630000000000000e+02 -2.782532595651974e+06 -5.419151738824190e+06 3.727612195201264e+06 -3.294992809845672e+03 -2.637225039019412e+03 -6.274126056018769e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.640000000000000e+02 -2.782598495019841e+06 -5.419204482088391e+06 3.727486711775530e+06 -3.294939943233033e+03 -2.637097421405638e+03 -6.274207817905466e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.650000000000000e+02 -2.782664393435077e+06 -5.419257222902548e+06 3.727361226487260e+06 -3.294887068528007e+03 -2.636969788317057e+03 -6.274289586503249e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.660000000000000e+02 -2.782730290706677e+06 -5.419309961079872e+06 3.727235739750612e+06 -3.294834197696995e+03 -2.636842166520081e+03 -6.274371344166155e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.670000000000000e+02 -2.782796187025375e+06 -5.419362696806945e+06 3.727110251151889e+06 -3.294781317304381e+03 -2.636714529945812e+03 -6.274453108902384e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.680000000000000e+02 -2.782862082185777e+06 -5.419415429882864e+06 3.726984761136563e+06 -3.294728443247971e+03 -2.636586905727048e+03 -6.274534861085127e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.690000000000000e+02 -2.782927976349257e+06 -5.419468160465495e+06 3.726859269354618e+06 -3.294675562969303e+03 -2.636459273048935e+03 -6.274616615938144e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.700000000000000e+02 -2.782993869442275e+06 -5.419520888482934e+06 3.726733775965489e+06 -3.294622681287675e+03 -2.636331641371120e+03 -6.274698366953317e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.710000000000000e+02 -2.783059761450293e+06 -5.419573613920969e+06 3.726608281000721e+06 -3.294569800619123e+03 -2.636204012394734e+03 -6.274780112244736e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.720000000000000e+02 -2.783125652461189e+06 -5.419626336865561e+06 3.726482784269670e+06 -3.294516913617739e+03 -2.636076374748265e+03 -6.274861860351979e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.730000000000000e+02 -2.783191542387019e+06 -5.419679057230704e+06 3.726357285963086e+06 -3.294464027463941e+03 -2.635948739674279e+03 -6.274943602870287e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.740000000000000e+02 -2.783257431227657e+06 -5.419731775016308e+06 3.726231786081208e+06 -3.294411141039805e+03 -2.635821107882046e+03 -6.275025339995694e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.750000000000000e+02 -2.783323319056368e+06 -5.419784490294049e+06 3.726106284465053e+06 -3.294358249220195e+03 -2.635693469496955e+03 -6.275107078563393e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.760000000000000e+02 -2.783389205843948e+06 -5.419837203035351e+06 3.725980781177999e+06 -3.294305355713123e+03 -2.635565827510891e+03 -6.275188815506378e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.770000000000000e+02 -2.783455091546233e+06 -5.419889913197049e+06 3.725855276315814e+06 -3.294252462097877e+03 -2.635438188563643e+03 -6.275270547091572e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.780000000000000e+02 -2.783520976177765e+06 -5.419942620793405e+06 3.725729769846891e+06 -3.294199566828402e+03 -2.635310551151340e+03 -6.275352274713759e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.790000000000000e+02 -2.783586859753375e+06 -5.419995325838912e+06 3.725604261739084e+06 -3.294146670906427e+03 -2.635182912153993e+03 -6.275433999321467e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.800000000000000e+02 -2.783652742287618e+06 -5.420048028347817e+06 3.725478751960775e+06 -3.294093771715213e+03 -2.635055270278208e+03 -6.275515722708384e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.810000000000000e+02 -2.783718623809715e+06 -5.420100728348728e+06 3.725353240448508e+06 -3.294040867166009e+03 -2.634927621879107e+03 -6.275597447487389e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.820000000000000e+02 -2.783784504217065e+06 -5.420153425741318e+06 3.725227727424908e+06 -3.293987965705586e+03 -2.634799979929844e+03 -6.275679163890009e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.830000000000000e+02 -2.783850383553489e+06 -5.420206120568475e+06 3.725102212794845e+06 -3.293935062578302e+03 -2.634672339430541e+03 -6.275760876374365e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.840000000000000e+02 -2.783916261892524e+06 -5.420258812902070e+06 3.724976696398779e+06 -3.293882154635126e+03 -2.634544689438598e+03 -6.275842591342667e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.850000000000000e+02 -2.783982139131295e+06 -5.420311502641568e+06 3.724851178459876e+06 -3.293829247355781e+03 -2.634417044622388e+03 -6.275924299631525e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.860000000000000e+02 -2.784048015328381e+06 -5.420364189844270e+06 3.724725658850980e+06 -3.293776336716482e+03 -2.634289397360204e+03 -6.276006006545549e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.870000000000000e+02 -2.784113890483936e+06 -5.420416874510300e+06 3.724600137571791e+06 -3.293723424531090e+03 -2.634161746173849e+03 -6.276087711915112e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.880000000000000e+02 -2.784179764583149e+06 -5.420469556625219e+06 3.724474614654380e+06 -3.293670509623476e+03 -2.634034094621822e+03 -6.276169414674579e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.890000000000000e+02 -2.784245637567189e+06 -5.420522236131548e+06 3.724349090226396e+06 -3.293617596674185e+03 -2.633906450238449e+03 -6.276251109256899e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.900000000000000e+02 -2.784311509538938e+06 -5.420574913129837e+06 3.724223564064577e+06 -3.293564679899399e+03 -2.633778798172357e+03 -6.276332805046332e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.910000000000000e+02 -2.784377380454243e+06 -5.420627587576955e+06 3.724098036264704e+06 -3.293511760828060e+03 -2.633651145424189e+03 -6.276414498172252e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.920000000000000e+02 -2.784443250312965e+06 -5.420680259472806e+06 3.723972506827022e+06 -3.293458839400207e+03 -2.633523492219538e+03 -6.276496188560400e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.930000000000000e+02 -2.784509119129935e+06 -5.420732928831862e+06 3.723846975719365e+06 -3.293405916048028e+03 -2.633395835143466e+03 -6.276577877554470e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.940000000000000e+02 -2.784574986861004e+06 -5.420785595611006e+06 3.723721443037528e+06 -3.293352992726289e+03 -2.633268181582592e+03 -6.276659560913794e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.950000000000000e+02 -2.784640853579405e+06 -5.420838259881845e+06 3.723595908622482e+06 -3.293300063710700e+03 -2.633140521196051e+03 -6.276741245954341e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.960000000000000e+02 -2.784706719211919e+06 -5.420890921572802e+06 3.723470372633189e+06 -3.293247135959939e+03 -2.633012863354784e+03 -6.276822925228639e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.970000000000000e+02 -2.784772583773004e+06 -5.420943580698058e+06 3.723344835038207e+06 -3.293194206641695e+03 -2.632885207136007e+03 -6.276904600461624e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.980000000000000e+02 -2.784838447292154e+06 -5.420996237286412e+06 3.723219295773528e+06 -3.293141275348421e+03 -2.632757547031380e+03 -6.276986274330227e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.990000000000000e+02 -2.784904309739892e+06 -5.421048891309098e+06 3.723093754903089e+06 -3.293088342742267e+03 -2.632629888340984e+03 -6.277067944134196e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.000000000000000e+02 -2.784970171130763e+06 -5.421101542780355e+06 3.722968212395280e+06 -3.293035407994342e+03 -2.632502229011814e+03 -6.277149611183781e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.010000000000000e+02 -2.785036031523609e+06 -5.421154191757669e+06 3.722842668122371e+06 -3.292982468275168e+03 -2.632374560287332e+03 -6.277231280740510e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.020000000000000e+02 -2.785101890786249e+06 -5.421206838111903e+06 3.722717122371286e+06 -3.292929531315215e+03 -2.632246900524209e+03 -6.277312940943862e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.030000000000000e+02 -2.785167749035923e+06 -5.421259481957664e+06 3.722591574887427e+06 -3.292876588851245e+03 -2.632119234517188e+03 -6.277394602476520e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.040000000000000e+02 -2.785233606199430e+06 -5.421312123223392e+06 3.722466025829763e+06 -3.292823647827086e+03 -2.631991570430659e+03 -6.277476258445580e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.050000000000000e+02 -2.785299462320657e+06 -5.421364761952006e+06 3.722340475102964e+06 -3.292770703566418e+03 -2.631863903820465e+03 -6.277557913016784e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.060000000000000e+02 -2.785365317399465e+06 -5.421417398143413e+06 3.722214922707261e+06 -3.292717755681157e+03 -2.631736234745589e+03 -6.277639566342437e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.070000000000000e+02 -2.785431171421341e+06 -5.421470031783394e+06 3.722089368674206e+06 -3.292664807226695e+03 -2.631608563800638e+03 -6.277721216743706e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.080000000000000e+02 -2.785497024356718e+06 -5.421522662843125e+06 3.721963813067927e+06 -3.292611857817084e+03 -2.631480896623520e+03 -6.277802861853032e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.090000000000000e+02 -2.785562876249759e+06 -5.421575291365732e+06 3.721838255792553e+06 -3.292558906666888e+03 -2.631353225833690e+03 -6.277884505365620e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.100000000000000e+02 -2.785628727056325e+06 -5.421627917308122e+06 3.721712696943886e+06 -3.292505955320728e+03 -2.631225558143140e+03 -6.277966143538159e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.110000000000000e+02 -2.785694576864304e+06 -5.421680540756196e+06 3.721587136331012e+06 -3.292452997551599e+03 -2.631097882118139e+03 -6.278047784406348e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.120000000000000e+02 -2.785760425571156e+06 -5.421733161609758e+06 3.721461574176640e+06 -3.292400041960137e+03 -2.630970210173041e+03 -6.278129418396498e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.130000000000000e+02 -2.785826273235437e+06 -5.421785779926039e+06 3.721336010353569e+06 -3.292347083205497e+03 -2.630842535704952e+03 -6.278211050954181e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.140000000000000e+02 -2.785892119871676e+06 -5.421838395719274e+06 3.721210444830165e+06 -3.292294119727524e+03 -2.630714856749226e+03 -6.278292683685895e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.150000000000000e+02 -2.785957965392021e+06 -5.421891008903610e+06 3.721084877797296e+06 -3.292241160145627e+03 -2.630587183691628e+03 -6.278374307926597e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.160000000000000e+02 -2.786023809899019e+06 -5.421943619579267e+06 3.720959309032163e+06 -3.292188194757173e+03 -2.630459504347258e+03 -6.278455933653101e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.170000000000000e+02 -2.786089653319195e+06 -5.421996227674494e+06 3.720833738694313e+06 -3.292135229095080e+03 -2.630331828152586e+03 -6.278537554053417e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.180000000000000e+02 -2.786155495696707e+06 -5.422048833232420e+06 3.720708166687854e+06 -3.292082261648697e+03 -2.630204148466912e+03 -6.278619172821653e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.190000000000000e+02 -2.786221336987422e+06 -5.422101436209954e+06 3.720582593108604e+06 -3.292029294054126e+03 -2.630076471804667e+03 -6.278700786263185e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.200000000000000e+02 -2.786287177293882e+06 -5.422154036707304e+06 3.720457017733765e+06 -3.291976319021823e+03 -2.629948785011680e+03 -6.278782403676735e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.210000000000000e+02 -2.786353016498897e+06 -5.422206634609968e+06 3.720331440817934e+06 -3.291923346124997e+03 -2.629821102092658e+03 -6.278864014326217e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.220000000000000e+02 -2.786418854660918e+06 -5.422259229975097e+06 3.720205862234070e+06 -3.291870369586998e+03 -2.629693417001121e+03 -6.278945623604940e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.230000000000000e+02 -2.786484691736092e+06 -5.422311822759831e+06 3.720080282077457e+06 -3.291817394250730e+03 -2.629565734124130e+03 -6.279027227299576e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.240000000000000e+02 -2.786550527782958e+06 -5.422364413021392e+06 3.719954700220877e+06 -3.291764414397318e+03 -2.629438047003330e+03 -6.279108830961940e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.250000000000000e+02 -2.786616362757377e+06 -5.422417000716700e+06 3.719829116760162e+06 -3.291711433191233e+03 -2.629310360903517e+03 -6.279190430757118e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.260000000000000e+02 -2.786682196644849e+06 -5.422469585831563e+06 3.719703531726870e+06 -3.291658453603639e+03 -2.629182677082322e+03 -6.279272024747585e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.270000000000000e+02 -2.786748029547893e+06 -5.422522168466152e+06 3.719577944898174e+06 -3.291605466345192e+03 -2.629054982855808e+03 -6.279353622939230e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.280000000000000e+02 -2.786813861349063e+06 -5.422574748505782e+06 3.719452356529238e+06 -3.291552479940216e+03 -2.628927293833038e+03 -6.279435214359601e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.290000000000000e+02 -2.786879692063172e+06 -5.422627325964914e+06 3.719326766587892e+06 -3.291499494649785e+03 -2.628799607034162e+03 -6.279516800232778e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.300000000000000e+02 -2.786945521748753e+06 -5.422679900900740e+06 3.719201174946903e+06 -3.291446505188586e+03 -2.628671915725122e+03 -6.279598386033451e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.310000000000000e+02 -2.787011350376338e+06 -5.422732473284521e+06 3.719075581670240e+06 -3.291393513139374e+03 -2.628544223828375e+03 -6.279679969262542e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.320000000000000e+02 -2.787077177946085e+06 -5.422785043116382e+06 3.718949986757598e+06 -3.291340520409584e+03 -2.628416530087150e+03 -6.279761549607131e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.330000000000000e+02 -2.787143004428446e+06 -5.422837610367526e+06 3.718824390273130e+06 -3.291287527004287e+03 -2.628288840174357e+03 -6.279843124507002e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.340000000000000e+02 -2.787208829926212e+06 -5.422890175138299e+06 3.718698791993452e+06 -3.291234527901245e+03 -2.628161138510462e+03 -6.279924703302701e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.350000000000000e+02 -2.787274654321946e+06 -5.422942737314067e+06 3.718573192173741e+06 -3.291181529130248e+03 -2.628033442147755e+03 -6.280006275525018e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.360000000000000e+02 -2.787340477659507e+06 -5.422995296937690e+06 3.718447590718633e+06 -3.291128528209853e+03 -2.627905745434848e+03 -6.280087844866416e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.370000000000000e+02 -2.787406299939054e+06 -5.423047854009295e+06 3.718321987627822e+06 -3.291075526714890e+03 -2.627778046623213e+03 -6.280169411389044e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.380000000000000e+02 -2.787472121160448e+06 -5.423100408528795e+06 3.718196382901540e+06 -3.291022522503147e+03 -2.627650347493183e+03 -6.280250975278049e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.390000000000000e+02 -2.787537941338223e+06 -5.423152960510397e+06 3.718070776508152e+06 -3.290969515150209e+03 -2.627522645546442e+03 -6.280332537855195e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.400000000000000e+02 -2.787603760413881e+06 -5.423205509896981e+06 3.717945168574837e+06 -3.290916510052622e+03 -2.627394947869421e+03 -6.280414093438381e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.410000000000000e+02 -2.787669578460609e+06 -5.423258056760027e+06 3.717819558942479e+06 -3.290863500636032e+03 -2.627267245823190e+03 -6.280495648952516e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.420000000000000e+02 -2.787735395448949e+06 -5.423310601070806e+06 3.717693947675047e+06 -3.290810489020447e+03 -2.627139542709132e+03 -6.280577201932103e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.430000000000000e+02 -2.787801211364392e+06 -5.423363142815136e+06 3.717568334804116e+06 -3.290757477388026e+03 -2.627011840332618e+03 -6.280658750557609e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.440000000000000e+02 -2.787867026250787e+06 -5.423415682035860e+06 3.717442720234298e+06 -3.290704461493504e+03 -2.626884133175976e+03 -6.280740299272514e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.450000000000000e+02 -2.787932840064021e+06 -5.423468218689947e+06 3.717317104061448e+06 -3.290651444261995e+03 -2.626756427313558e+03 -6.280821843991054e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.460000000000000e+02 -2.787998652818915e+06 -5.423520752791840e+06 3.717191486253389e+06 -3.290598426426700e+03 -2.626628719840036e+03 -6.280903385684490e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.470000000000000e+02 -2.788064464529898e+06 -5.423573284355672e+06 3.717065866778658e+06 -3.290545404627704e+03 -2.626501009931154e+03 -6.280984926272855e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.480000000000000e+02 -2.788130275167801e+06 -5.423625813352962e+06 3.716940245700703e+06 -3.290492383064749e+03 -2.626373300506229e+03 -6.281066462505060e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.490000000000000e+02 -2.788196084747158e+06 -5.423678339797921e+06 3.716814622987882e+06 -3.290439359203593e+03 -2.626245590404610e+03 -6.281147996072186e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.500000000000000e+02 -2.788261893238521e+06 -5.423730863661839e+06 3.716688998704182e+06 -3.290386335013567e+03 -2.626117883445595e+03 -6.281229524346170e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.510000000000000e+02 -2.788327700700672e+06 -5.423783385002083e+06 3.716563372721795e+06 -3.290333307926417e+03 -2.625990171309254e+03 -6.281311052258594e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.520000000000000e+02 -2.788393507118829e+06 -5.423835903804231e+06 3.716437745072830e+06 -3.290280277819743e+03 -2.625862455763921e+03 -6.281392579069019e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.530000000000000e+02 -2.788459312448878e+06 -5.423888420025291e+06 3.716312115853155e+06 -3.290227247065111e+03 -2.625734744313575e+03 -6.281474100304647e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.540000000000000e+02 -2.788525116778928e+06 -5.423940933751215e+06 3.716186484871200e+06 -3.290174211711132e+03 -2.625607022853820e+03 -6.281555624138817e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.550000000000000e+02 -2.788590919976924e+06 -5.423993444853160e+06 3.716060852414094e+06 -3.290121179114768e+03 -2.625479310509881e+03 -6.281637138567895e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.560000000000000e+02 -2.788656722130681e+06 -5.424045953416872e+06 3.715935218290812e+06 -3.290068142949124e+03 -2.625351596090082e+03 -6.281718651547908e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.570000000000000e+02 -2.788722523255008e+06 -5.424098459456770e+06 3.715809582469166e+06 -3.290015104058978e+03 -2.625223875586892e+03 -6.281800164493959e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.580000000000000e+02 -2.788788323305713e+06 -5.424150962929788e+06 3.715683945045210e+06 -3.289962063569810e+03 -2.625096157060946e+03 -6.281881673257694e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.590000000000000e+02 -2.788854122297599e+06 -5.424203463850345e+06 3.715558305986756e+06 -3.289909022036052e+03 -2.624968436454661e+03 -6.281963179410751e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.600000000000000e+02 -2.788919920245197e+06 -5.424255962232658e+06 3.715432665262161e+06 -3.289855977386044e+03 -2.624840713672464e+03 -6.282044683950577e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.610000000000000e+02 -2.788985717075096e+06 -5.424308458005121e+06 3.715307023031061e+06 -3.289802934248539e+03 -2.624712997935229e+03 -6.282126180593451e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.620000000000000e+02 -2.789051512904693e+06 -5.424360951282270e+06 3.715181379038108e+06 -3.289749886425078e+03 -2.624585272571096e+03 -6.282207679700659e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.630000000000000e+02 -2.789117307689893e+06 -5.424413442021109e+06 3.715055733379178e+06 -3.289696835416654e+03 -2.624457544606097e+03 -6.282289177417314e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.640000000000000e+02 -2.789183101371940e+06 -5.424465930164348e+06 3.714930086182029e+06 -3.289643784783036e+03 -2.624329822061145e+03 -6.282370668493119e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.650000000000000e+02 -2.789248894009607e+06 -5.424518415769309e+06 3.714804437318832e+06 -3.289590732466303e+03 -2.624202095728559e+03 -6.282452158020824e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.660000000000000e+02 -2.789314685632078e+06 -5.424570898864494e+06 3.714678786726057e+06 -3.289537675073796e+03 -2.624074362738006e+03 -6.282533648854811e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.670000000000000e+02 -2.789380476136633e+06 -5.424623379349724e+06 3.714553134627109e+06 -3.289484618874000e+03 -2.623946637183766e+03 -6.282615131764285e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.680000000000000e+02 -2.789446265552743e+06 -5.424675857253728e+06 3.714427480957934e+06 -3.289431564427829e+03 -2.623818913969094e+03 -6.282696608785205e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.690000000000000e+02 -2.789512053968200e+06 -5.424728332662186e+06 3.714301825527457e+06 -3.289378503568267e+03 -2.623691181894769e+03 -6.282778088719042e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.700000000000000e+02 -2.789577841309601e+06 -5.424780805503529e+06 3.714176168495332e+06 -3.289325441141651e+03 -2.623563451544489e+03 -6.282859564570733e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.710000000000000e+02 -2.789643627591747e+06 -5.424833275792177e+06 3.714050509829368e+06 -3.289272377943064e+03 -2.623435719176068e+03 -6.282941037658005e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.720000000000000e+02 -2.789709412814419e+06 -5.424885743527962e+06 3.713924849529985e+06 -3.289219312148239e+03 -2.623307986790595e+03 -6.283022507920708e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.730000000000000e+02 -2.789775196992426e+06 -5.424938208725302e+06 3.713799187564988e+06 -3.289166244546035e+03 -2.623180250415304e+03 -6.283103976782832e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.740000000000000e+02 -2.789840980096323e+06 -5.424990671355525e+06 3.713673523998381e+06 -3.289113175265581e+03 -2.623052515694183e+03 -6.283185441645737e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.750000000000000e+02 -2.789906762140639e+06 -5.425043131432822e+06 3.713547858798521e+06 -3.289060104087489e+03 -2.622924780138247e+03 -6.283266903730264e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.760000000000000e+02 -2.789972543140174e+06 -5.425095588971616e+06 3.713422191933211e+06 -3.289007030846236e+03 -2.622797041082902e+03 -6.283348364311176e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.770000000000000e+02 -2.790038323036203e+06 -5.425148043914649e+06 3.713296523530231e+06 -3.288953958713940e+03 -2.622669307124740e+03 -6.283429818061079e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.780000000000000e+02 -2.790104101931134e+06 -5.425200496361863e+06 3.713170853366615e+06 -3.288900879599632e+03 -2.622541564854618e+03 -6.283511274736848e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.790000000000000e+02 -2.790169879707928e+06 -5.425252946199062e+06 3.713045181697150e+06 -3.288847804253697e+03 -2.622413828717536e+03 -6.283592722891525e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.800000000000000e+02 -2.790235656469004e+06 -5.425305393526182e+06 3.712919508298859e+06 -3.288794723509694e+03 -2.622286085798543e+03 -6.283674172554197e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.810000000000000e+02 -2.790301432126331e+06 -5.425357838257392e+06 3.712793833363301e+06 -3.288741643182627e+03 -2.622158348369700e+03 -6.283755615528558e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.820000000000000e+02 -2.790367206767957e+06 -5.425410280478556e+06 3.712668156698854e+06 -3.288688559437957e+03 -2.622030603324471e+03 -6.283837059473926e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.830000000000000e+02 -2.790432980335061e+06 -5.425462720132351e+06 3.712542478433472e+06 -3.288635473408427e+03 -2.621902860131879e+03 -6.283918499610760e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.840000000000000e+02 -2.790498752857094e+06 -5.425515157247474e+06 3.712416798503079e+06 -3.288582386028281e+03 -2.621775112847637e+03 -6.283999938181682e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.850000000000000e+02 -2.790564524289981e+06 -5.425567591780983e+06 3.712291117003576e+06 -3.288529298107148e+03 -2.621647369360788e+03 -6.284081371267084e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.860000000000000e+02 -2.790630294692180e+06 -5.425620023789919e+06 3.712165433807642e+06 -3.288476205789812e+03 -2.621519620991792e+03 -6.284162804543931e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.870000000000000e+02 -2.790696064019908e+06 -5.425672453231555e+06 3.712039749010641e+06 -3.288423114101723e+03 -2.621391872814704e+03 -6.284244233417598e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.880000000000000e+02 -2.790761832243732e+06 -5.425724880077234e+06 3.711914062676588e+06 -3.288370022732348e+03 -2.621264130144274e+03 -6.284325655642277e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.890000000000000e+02 -2.790827599480704e+06 -5.425777304441129e+06 3.711788374550592e+06 -3.288316924044092e+03 -2.621136376886482e+03 -6.284407081967844e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.900000000000000e+02 -2.790893365628443e+06 -5.425829726223386e+06 3.711662684855588e+06 -3.288263826669099e+03 -2.621008626016119e+03 -6.284488502588707e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.910000000000000e+02 -2.790959130745410e+06 -5.425882145481038e+06 3.711536993464237e+06 -3.288210724979788e+03 -2.620880870305138e+03 -6.284569923343844e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.920000000000000e+02 -2.791024894743592e+06 -5.425934562128301e+06 3.711411300568134e+06 -3.288157624999059e+03 -2.620753121943027e+03 -6.284651335982959e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.930000000000000e+02 -2.791090657696371e+06 -5.425986976236715e+06 3.711285606007511e+06 -3.288104523067836e+03 -2.620625370057701e+03 -6.284732747076428e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.940000000000000e+02 -2.791156419618272e+06 -5.426039387820465e+06 3.711159909750712e+06 -3.288051417173172e+03 -2.620497613578105e+03 -6.284814158031716e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.950000000000000e+02 -2.791222180435929e+06 -5.426091796808056e+06 3.711034211957431e+06 -3.287998311754691e+03 -2.620369862178536e+03 -6.284895562458507e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.960000000000000e+02 -2.791287940266657e+06 -5.426144203313850e+06 3.710908512372218e+06 -3.287945200328426e+03 -2.620242099452605e+03 -6.284976970712450e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.970000000000000e+02 -2.791353698978422e+06 -5.426196607209167e+06 3.710782811282535e+06 -3.287892090215292e+03 -2.620114344280484e+03 -6.285058370941473e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.980000000000000e+02 -2.791419456629967e+06 -5.426249008551252e+06 3.710657108560500e+06 -3.287838979663631e+03 -2.619986587302556e+03 -6.285139768157125e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.990000000000000e+02 -2.791485213235797e+06 -5.426301407354292e+06 3.710531404174447e+06 -3.287785865386120e+03 -2.619858827834048e+03 -6.285221164179648e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.000000000000000e+02 -2.791550968810428e+06 -5.426353803632460e+06 3.710405698092721e+06 -3.287732747003306e+03 -2.619731063673930e+03 -6.285302560172125e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.010000000000000e+02 -2.791616723266151e+06 -5.426406197300236e+06 3.710279990506392e+06 -3.287679631759129e+03 -2.619603305863351e+03 -6.285383947841855e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.020000000000000e+02 -2.791682476705336e+06 -5.426458588457449e+06 3.710154281192419e+06 -3.287626511174606e+03 -2.619475541327342e+03 -6.285465336963248e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.030000000000000e+02 -2.791748229054641e+06 -5.426510977032636e+06 3.710028570310520e+06 -3.287573390285901e+03 -2.619347780253898e+03 -6.285546720643101e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.040000000000000e+02 -2.791813980372786e+06 -5.426563363083019e+06 3.709902857732805e+06 -3.287520266600719e+03 -2.619220013470784e+03 -6.285628104147581e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.050000000000000e+02 -2.791879730615717e+06 -5.426615746565686e+06 3.709777143555198e+06 -3.287467141778263e+03 -2.619092248142833e+03 -6.285709483495507e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.060000000000000e+02 -2.791945479797942e+06 -5.426668127494810e+06 3.709651427746038e+06 -3.287414014330851e+03 -2.618964482068608e+03 -6.285790860360013e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.070000000000000e+02 -2.792011227919615e+06 -5.426720505870521e+06 3.709525710305018e+06 -3.287360886482557e+03 -2.618836714071490e+03 -6.285872234246272e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.080000000000000e+02 -2.792076974980509e+06 -5.426772881692656e+06 3.709399991232555e+06 -3.287307755343387e+03 -2.618708946360189e+03 -6.285953605492018e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.090000000000000e+02 -2.792142720980784e+06 -5.426825254961337e+06 3.709274270528342e+06 -3.287254623850639e+03 -2.618581176321004e+03 -6.286034973919591e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.100000000000000e+02 -2.792208465905664e+06 -5.426877625662209e+06 3.709148548224515e+06 -3.287201490848242e+03 -2.618453408302049e+03 -6.286116338108707e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.110000000000000e+02 -2.792274209784295e+06 -5.426929993823714e+06 3.709022824257510e+06 -3.287148354401478e+03 -2.618325637145767e+03 -6.286197701264779e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.120000000000000e+02 -2.792339952646120e+06 -5.426982359474506e+06 3.708897098563218e+06 -3.287095214532610e+03 -2.618197858421842e+03 -6.286279065366034e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.130000000000000e+02 -2.792405694359236e+06 -5.427034722486087e+06 3.708771371428981e+06 -3.287042077991859e+03 -2.618070091189776e+03 -6.286360418752221e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.140000000000000e+02 -2.792471435069918e+06 -5.427087083001042e+06 3.708645642536028e+06 -3.286988935244073e+03 -2.617942315245793e+03 -6.286441774878041e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.150000000000000e+02 -2.792537174675838e+06 -5.427139440919626e+06 3.708519912107363e+06 -3.286935794757661e+03 -2.617814543721469e+03 -6.286523123954508e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.160000000000000e+02 -2.792602913279349e+06 -5.427191796341616e+06 3.708394179919903e+06 -3.286882648088675e+03 -2.617686763375478e+03 -6.286604475807962e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.170000000000000e+02 -2.792668650777840e+06 -5.427244149167047e+06 3.708268446197199e+06 -3.286829501781273e+03 -2.617558988467320e+03 -6.286685821029075e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.180000000000000e+02 -2.792734387244653e+06 -5.427296499467381e+06 3.708142710779437e+06 -3.286776352801508e+03 -2.617431208005280e+03 -6.286767165945956e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.190000000000000e+02 -2.792800122635755e+06 -5.427348847199717e+06 3.708016973762560e+06 -3.286723202886239e+03 -2.617303428496810e+03 -6.286848506839595e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.200000000000000e+02 -2.792865856965645e+06 -5.427401192378244e+06 3.707891235114897e+06 -3.286670050163224e+03 -2.617175648781084e+03 -6.286929845091928e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.210000000000000e+02 -2.792931590205197e+06 -5.427453534974555e+06 3.707765494899955e+06 -3.286616898847989e+03 -2.617047871256665e+03 -6.287011177688495e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.220000000000000e+02 -2.792997322456655e+06 -5.427505875088320e+06 3.707639752894814e+06 -3.286563739644075e+03 -2.616920083409262e+03 -6.287092514518466e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.230000000000000e+02 -2.793063053573797e+06 -5.427558212577051e+06 3.707514009418219e+06 -3.286510584772047e+03 -2.616792303930026e+03 -6.287173841577104e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.240000000000000e+02 -2.793128783688228e+06 -5.427610547569004e+06 3.707388264183259e+06 -3.286457423527882e+03 -2.616664515889564e+03 -6.287255171380943e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.250000000000000e+02 -2.793194512711994e+06 -5.427662879978511e+06 3.707262517381599e+06 -3.286404262045531e+03 -2.616536730944629e+03 -6.287336495880419e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.260000000000000e+02 -2.793260240659880e+06 -5.427715209819974e+06 3.707136768981033e+06 -3.286351100525887e+03 -2.616408946618616e+03 -6.287417816094378e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.270000000000000e+02 -2.793325967590309e+06 -5.427767537150335e+06 3.707011018854165e+06 -3.286297934044544e+03 -2.616281155466907e+03 -6.287499137625833e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.280000000000000e+02 -2.793391693400692e+06 -5.427819861869677e+06 3.706885267224581e+06 -3.286244768882027e+03 -2.616153371731345e+03 -6.287580451199823e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.290000000000000e+02 -2.793457418178997e+06 -5.427872184063698e+06 3.706759513900537e+06 -3.286191601175482e+03 -2.616025582454430e+03 -6.287661764403694e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.300000000000000e+02 -2.793523141895831e+06 -5.427924503703770e+06 3.706633758946075e+06 -3.286138431287089e+03 -2.615897792198550e+03 -6.287743075024676e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.310000000000000e+02 -2.793588864565691e+06 -5.427976820804067e+06 3.706508002329524e+06 -3.286085257679522e+03 -2.615769999683831e+03 -6.287824384343300e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.320000000000000e+02 -2.793654586159457e+06 -5.428029135336199e+06 3.706382244114399e+06 -3.286032084639295e+03 -2.615642207311277e+03 -6.287905689312548e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.330000000000000e+02 -2.793720306691537e+06 -5.428081447314254e+06 3.706256484269204e+06 -3.285978908407295e+03 -2.615514414694639e+03 -6.287986991833598e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.340000000000000e+02 -2.793786026162095e+06 -5.428133756738361e+06 3.706130722793635e+06 -3.285925731867626e+03 -2.615386620238608e+03 -6.288068291296079e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.350000000000000e+02 -2.793851744527092e+06 -5.428186063565664e+06 3.706004959783656e+06 -3.285872555701166e+03 -2.615258831263036e+03 -6.288149584105564e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.360000000000000e+02 -2.793917461888838e+06 -5.428238367895851e+06 3.705879195016133e+06 -3.285819373402778e+03 -2.615131033620331e+03 -6.288230879594345e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.370000000000000e+02 -2.793983178174311e+06 -5.428290669657777e+06 3.705753428650310e+06 -3.285766191174678e+03 -2.615003236388703e+03 -6.288312170841965e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.380000000000000e+02 -2.794048893412651e+06 -5.428342968879859e+06 3.705627660622600e+06 -3.285713005605855e+03 -2.614875436564424e+03 -6.288393460762517e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.390000000000000e+02 -2.794114607559826e+06 -5.428395265519239e+06 3.705501891028975e+06 -3.285659819760996e+03 -2.614747639908629e+03 -6.288474745365317e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.400000000000000e+02 -2.794180320674520e+06 -5.428447559633056e+06 3.705376119741482e+06 -3.285606631140980e+03 -2.614619837764261e+03 -6.288556029679042e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.410000000000000e+02 -2.794246032712711e+06 -5.428499851178462e+06 3.705250346856087e+06 -3.285553441369001e+03 -2.614492036806937e+03 -6.288637309965748e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.420000000000000e+02 -2.794311743688890e+06 -5.428552140169613e+06 3.705124572341124e+06 -3.285500249022266e+03 -2.614364235355547e+03 -6.288718587632753e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.430000000000000e+02 -2.794377453588589e+06 -5.428604426592392e+06 3.704998796228188e+06 -3.285447057030182e+03 -2.614236434229374e+03 -6.288799860966929e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.440000000000000e+02 -2.794443162455560e+06 -5.428656710489448e+06 3.704873018421783e+06 -3.285393860682421e+03 -2.614108628382906e+03 -6.288881134393472e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.450000000000000e+02 -2.794508870216530e+06 -5.428708991789444e+06 3.704747239081714e+06 -3.285340665173544e+03 -2.613980827958020e+03 -6.288962400981286e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.460000000000000e+02 -2.794574576974057e+06 -5.428761270592247e+06 3.704621457984267e+06 -3.285287464616562e+03 -2.613853017708174e+03 -6.289043670266473e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.470000000000000e+02 -2.794640282625509e+06 -5.428813546797954e+06 3.704495675353269e+06 -3.285234264433577e+03 -2.613725213362767e+03 -6.289124932710457e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.480000000000000e+02 -2.794705987214928e+06 -5.428865820449438e+06 3.704369891092667e+06 -3.285181063605361e+03 -2.613597407205514e+03 -6.289206192238778e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.490000000000000e+02 -2.794771690771438e+06 -5.428918091575097e+06 3.704244105138860e+06 -3.285127857947897e+03 -2.613469596581476e+03 -6.289287451962804e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.500000000000000e+02 -2.794837393236395e+06 -5.428970360117851e+06 3.704118317619751e+06 -3.285074652343847e+03 -2.613341789200002e+03 -6.289368706185969e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.510000000000000e+02 -2.794903094683099e+06 -5.429022626149058e+06 3.703992528375455e+06 -3.285021442899132e+03 -2.613213974233857e+03 -6.289449961546943e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.520000000000000e+02 -2.794968795067528e+06 -5.429074889625881e+06 3.703866737501949e+06 -3.284968231284602e+03 -2.613086158423316e+03 -6.289531214258872e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.530000000000000e+02 -2.795034494331037e+06 -5.429127150491256e+06 3.703740945127145e+06 -3.284915021082807e+03 -2.612958350162307e+03 -6.289612458916979e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.540000000000000e+02 -2.795100192561550e+06 -5.429179408830774e+06 3.703615151059230e+06 -3.284861808154071e+03 -2.612830536053833e+03 -6.289693703422930e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.550000000000000e+02 -2.795165889729686e+06 -5.429231664615857e+06 3.703489355362278e+06 -3.284808593186613e+03 -2.612702721534283e+03 -6.289774945025830e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.560000000000000e+02 -2.795231585849934e+06 -5.429283917860652e+06 3.703363558004600e+06 -3.284755374542556e+03 -2.612574904260758e+03 -6.289856185527041e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.570000000000000e+02 -2.795297280893195e+06 -5.429336168536803e+06 3.703237759049730e+06 -3.284702156314995e+03 -2.612447087415406e+03 -6.289937421621722e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.580000000000000e+02 -2.795362974859243e+06 -5.429388416644138e+06 3.703111958498087e+06 -3.284648936132149e+03 -2.612319272081161e+03 -6.290018653914482e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.590000000000000e+02 -2.795428667748239e+06 -5.429440662182795e+06 3.702986156349366e+06 -3.284595716607531e+03 -2.612191457069018e+03 -6.290099881737578e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.600000000000000e+02 -2.795494359603922e+06 -5.429492905195390e+06 3.702860352508038e+06 -3.284542492256763e+03 -2.612063637447488e+03 -6.290181109817471e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.610000000000000e+02 -2.795560050411538e+06 -5.429545145667599e+06 3.702734547006261e+06 -3.284489264599571e+03 -2.611935815588127e+03 -6.290262336394262e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.620000000000000e+02 -2.795625740185866e+06 -5.429597383613779e+06 3.702608739811804e+06 -3.284436034430961e+03 -2.611807987697460e+03 -6.290343562800746e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.630000000000000e+02 -2.795691428824393e+06 -5.429649618934172e+06 3.702482931148353e+06 -3.284382806837019e+03 -2.611680169018149e+03 -6.290424779878583e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.640000000000000e+02 -2.795757116429369e+06 -5.429701851728352e+06 3.702357120792696e+06 -3.284329574812173e+03 -2.611552346089016e+03 -6.290505996870244e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.650000000000000e+02 -2.795822803000947e+06 -5.429754081996445e+06 3.702231308744524e+06 -3.284276340115385e+03 -2.611424517277404e+03 -6.290587213698414e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.660000000000000e+02 -2.795888488465877e+06 -5.429806309667168e+06 3.702105495163687e+06 -3.284223106462592e+03 -2.611296693666860e+03 -6.290668423696495e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.670000000000000e+02 -2.795954172882518e+06 -5.429858534797383e+06 3.701979679922722e+06 -3.284169868820710e+03 -2.611168867688768e+03 -6.290749632562767e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.680000000000000e+02 -2.796019856265645e+06 -5.429910757401443e+06 3.701853862989408e+06 -3.284116628649493e+03 -2.611041036207030e+03 -6.290830841030142e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.690000000000000e+02 -2.796085538527391e+06 -5.429962977393854e+06 3.701728044555518e+06 -3.284063390287249e+03 -2.610913211651180e+03 -6.290912041545095e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.700000000000000e+02 -2.796151219755370e+06 -5.430015194859915e+06 3.701602224429749e+06 -3.284010147875058e+03 -2.610785382416176e+03 -6.290993241990347e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.710000000000000e+02 -2.796216899905857e+06 -5.430067409757076e+06 3.701476402707562e+06 -3.283956905099803e+03 -2.610657553964683e+03 -6.291074438229073e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.720000000000000e+02 -2.796282579022499e+06 -5.430119622127847e+06 3.701350579293602e+06 -3.283903657641165e+03 -2.610529721001175e+03 -6.291155634613730e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.730000000000000e+02 -2.796348257061583e+06 -5.430171831929668e+06 3.701224754283336e+06 -3.283850410763021e+03 -2.610401888269664e+03 -6.291236826605454e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.740000000000000e+02 -2.796413934037597e+06 -5.430224039176674e+06 3.701098927645074e+06 -3.283797161213569e+03 -2.610274054966715e+03 -6.291318016056462e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.750000000000000e+02 -2.796479609935790e+06 -5.430276243854540e+06 3.700973099410982e+06 -3.283743910512263e+03 -2.610146222995530e+03 -6.291399201418040e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.760000000000000e+02 -2.796545284785558e+06 -5.430328445991862e+06 3.700847269516898e+06 -3.283690657961058e+03 -2.610018387628112e+03 -6.291480385125439e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.770000000000000e+02 -2.796610958572156e+06 -5.430380645574305e+06 3.700721437994984e+06 -3.283637403391896e+03 -2.609890551087245e+03 -6.291561566261501e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.780000000000000e+02 -2.796676631295441e+06 -5.430432842601785e+06 3.700595604845471e+06 -3.283584145914751e+03 -2.609762714360292e+03 -6.291642744793122e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.790000000000000e+02 -2.796742302940948e+06 -5.430485037060200e+06 3.700469770099993e+06 -3.283530889061515e+03 -2.609634877932387e+03 -6.291723918882441e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.800000000000000e+02 -2.796807973567037e+06 -5.430537229006358e+06 3.700343933631060e+06 -3.283477626897560e+03 -2.609507034523216e+03 -6.291805094508692e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.810000000000000e+02 -2.796873643100466e+06 -5.430589418369042e+06 3.700218095598557e+06 -3.283424364160332e+03 -2.609379194993292e+03 -6.291886264641074e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.820000000000000e+02 -2.796939311556012e+06 -5.430641605162602e+06 3.700092255970250e+06 -3.283371101995270e+03 -2.609251355420055e+03 -6.291967430508193e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.830000000000000e+02 -2.797004978933449e+06 -5.430693789386870e+06 3.699966414746554e+06 -3.283317837654949e+03 -2.609123517641049e+03 -6.292048592549424e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.840000000000000e+02 -2.797070645320654e+06 -5.430745971127323e+06 3.699840571735579e+06 -3.283264567839138e+03 -2.608995668189404e+03 -6.292129758299835e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.850000000000000e+02 -2.797136310600531e+06 -5.430798150270068e+06 3.699714727193008e+06 -3.283211298516125e+03 -2.608867824010214e+03 -6.292210917444840e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.860000000000000e+02 -2.797201974816810e+06 -5.430850326857690e+06 3.699588881023279e+06 -3.283158026889117e+03 -2.608739979450139e+03 -6.292292073795391e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.870000000000000e+02 -2.797267637969645e+06 -5.430902500890317e+06 3.699463033226096e+06 -3.283104754609170e+03 -2.608612133038840e+03 -6.292373227251190e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.880000000000000e+02 -2.797333300044292e+06 -5.430954672353631e+06 3.699337183833614e+06 -3.283051481001158e+03 -2.608484287931462e+03 -6.292454376711749e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.890000000000000e+02 -2.797398961040617e+06 -5.431006841247539e+06 3.699211332846080e+06 -3.282998205987335e+03 -2.608356444271645e+03 -6.292535522148745e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.900000000000000e+02 -2.797464621031855e+06 -5.431059007643276e+06 3.699085480103521e+06 -3.282944926100971e+03 -2.608228591047958e+03 -6.292616670073928e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.910000000000000e+02 -2.797530279930181e+06 -5.431111171455422e+06 3.698959625797768e+06 -3.282891646234872e+03 -2.608100740999605e+03 -6.292697812548949e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.920000000000000e+02 -2.797595937764689e+06 -5.431163332712322e+06 3.698833769865186e+06 -3.282838363523541e+03 -2.607972890444775e+03 -6.292778952533989e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.930000000000000e+02 -2.797661594506309e+06 -5.431215491385672e+06 3.698707912369352e+06 -3.282785082763917e+03 -2.607845042215645e+03 -6.292860086563017e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.940000000000000e+02 -2.797727250242598e+06 -5.431267647560684e+06 3.698582053118876e+06 -3.282731794912076e+03 -2.607717185220575e+03 -6.292941223740878e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.950000000000000e+02 -2.797792904900351e+06 -5.431319801166173e+06 3.698456192273681e+06 -3.282678506281716e+03 -2.607589329745007e+03 -6.293022356575298e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.960000000000000e+02 -2.797858558450487e+06 -5.431371952173837e+06 3.698330329897327e+06 -3.282625219638424e+03 -2.607461478548736e+03 -6.293103482565012e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.970000000000000e+02 -2.797924210995093e+06 -5.431424100683027e+06 3.698204465766678e+06 -3.282571926171846e+03 -2.607333619120162e+03 -6.293184611340977e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.980000000000000e+02 -2.797989862417397e+06 -5.431476246580132e+06 3.698078600136923e+06 -3.282518636315582e+03 -2.607205765809048e+03 -6.293265731706853e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.990000000000000e+02 -2.798055512804958e+06 -5.431528389950368e+06 3.697952732816673e+06 -3.282465341492690e+03 -2.607077908071708e+03 -6.293346852306829e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.000000000000000e+03 -2.798121162128417e+06 -5.431580530765200e+06 3.697826863870040e+06 -3.282412044727216e+03 -2.606950049725287e+03 -6.293427970048640e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.001000000000000e+03 -2.798186810402537e+06 -5.431632669038972e+06 3.697700993264781e+06 -3.282358746026243e+03 -2.606822187662274e+03 -6.293509086316967e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.002000000000000e+03 -2.798252457597970e+06 -5.431684804743160e+06 3.697575121065003e+06 -3.282305446363146e+03 -2.606694326672465e+03 -6.293590198526074e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.003000000000000e+03 -2.798318103729190e+06 -5.431736937891888e+06 3.697449247239008e+06 -3.282252144006548e+03 -2.606566465409384e+03 -6.293671308071437e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.004000000000000e+03 -2.798383748796348e+06 -5.431789068485283e+06 3.697323371786489e+06 -3.282198840957704e+03 -2.606438602415104e+03 -6.293752414686404e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.005000000000000e+03 -2.798449392799321e+06 -5.431841196523249e+06 3.697197494707678e+06 -3.282145535749804e+03 -2.606310738620569e+03 -6.293833518627885e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.006000000000000e+03 -2.798515035708747e+06 -5.431893321977278e+06 3.697071616066693e+06 -3.282092230015428e+03 -2.606182878350784e+03 -6.293914617216158e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.007000000000000e+03 -2.798580677612460e+06 -5.431945444932756e+06 3.696945735671593e+06 -3.282038919589621e+03 -2.606055008541980e+03 -6.293995718194022e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.008000000000000e+03 -2.798646318422557e+06 -5.431997565304250e+06 3.696819853714425e+06 -3.281985608439118e+03 -2.605927142055149e+03 -6.294076814000100e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.009000000000000e+03 -2.798711958139186e+06 -5.432049683091896e+06 3.696693970194892e+06 -3.281932298418554e+03 -2.605799278135993e+03 -6.294157904121177e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.010000000000000e+03 -2.798777596820681e+06 -5.432101798352437e+06 3.696568084985465e+06 -3.281878984290900e+03 -2.605671409667914e+03 -6.294238994135573e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.011000000000000e+03 -2.798843234452277e+06 -5.432153911071564e+06 3.696442198118315e+06 -3.281825666255729e+03 -2.605543538406573e+03 -6.294320083167731e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.012000000000000e+03 -2.798908871019530e+06 -5.432206021235202e+06 3.696316309625081e+06 -3.281772348054374e+03 -2.605415665644247e+03 -6.294401168925411e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.013000000000000e+03 -2.798974506493087e+06 -5.432258128814835e+06 3.696190419569879e+06 -3.281719029477340e+03 -2.605287795842107e+03 -6.294482249513544e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.014000000000000e+03 -2.799040140931251e+06 -5.432310233867208e+06 3.696064527825183e+06 -3.281665706061702e+03 -2.605159922002355e+03 -6.294563330101507e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.015000000000000e+03 -2.799105774290351e+06 -5.432362336349823e+06 3.695938634486509e+06 -3.281612383408627e+03 -2.605032048142684e+03 -6.294644406328339e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.016000000000000e+03 -2.799171406584867e+06 -5.432414436276794e+06 3.695812739522150e+06 -3.281559058298111e+03 -2.604904173578973e+03 -6.294725479975531e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.017000000000000e+03 -2.799237037829274e+06 -5.432466533662232e+06 3.695686842900401e+06 -3.281505729674842e+03 -2.604776296676152e+03 -6.294806552256410e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.018000000000000e+03 -2.799302667994509e+06 -5.432518628477854e+06 3.695560944684841e+06 -3.281452401534929e+03 -2.604648419743031e+03 -6.294887620308961e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.019000000000000e+03 -2.799368297080442e+06 -5.432570720723571e+06 3.695435044875707e+06 -3.281399072099777e+03 -2.604520544425110e+03 -6.294968684214383e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.020000000000000e+03 -2.799433925116157e+06 -5.432622810427695e+06 3.695309143409347e+06 -3.281345739093300e+03 -2.604392666476705e+03 -6.295049746910300e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.021000000000000e+03 -2.799499552101809e+06 -5.432674897590348e+06 3.695183240285449e+06 -3.281292404501411e+03 -2.604264784590279e+03 -6.295130808069663e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.022000000000000e+03 -2.799565177978735e+06 -5.432726982154568e+06 3.695057335632218e+06 -3.281239069889410e+03 -2.604136908919152e+03 -6.295211862445507e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.023000000000000e+03 -2.799630802820140e+06 -5.432779064191477e+06 3.694931429289616e+06 -3.281185732910241e+03 -2.604009026937494e+03 -6.295292916701502e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.024000000000000e+03 -2.799696426596665e+06 -5.432831143672587e+06 3.694805521321769e+06 -3.281132393133763e+03 -2.603881144843760e+03 -6.295373968269536e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.025000000000000e+03 -2.799762049308192e+06 -5.432883220597799e+06 3.694679611728916e+06 -3.281079051443131e+03 -2.603753261749129e+03 -6.295455017141360e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.026000000000000e+03 -2.799827670940251e+06 -5.432935294953048e+06 3.694553700542697e+06 -3.281025709686938e+03 -2.603625379302156e+03 -6.295536061734622e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.027000000000000e+03 -2.799893291536549e+06 -5.432987366780834e+06 3.694427787667505e+06 -3.280972363826221e+03 -2.603497492210786e+03 -6.295617106260368e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.028000000000000e+03 -2.799958911082334e+06 -5.433039436066857e+06 3.694301873135516e+06 -3.280919014279844e+03 -2.603369602232875e+03 -6.295698149742391e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.029000000000000e+03 -2.800024529519336e+06 -5.433091502754463e+06 3.694175957074229e+06 -3.280865667320404e+03 -2.603241716722860e+03 -6.295779186026899e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.030000000000000e+03 -2.800090146876649e+06 -5.433143566871951e+06 3.694050039419979e+06 -3.280812319256226e+03 -2.603113832473645e+03 -6.295860218235986e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.031000000000000e+03 -2.800155763197947e+06 -5.433195628461825e+06 3.693924120077152e+06 -3.280758966308545e+03 -2.602985943933745e+03 -6.295941250576380e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.032000000000000e+03 -2.800221378483385e+06 -5.433247687524198e+06 3.693798199045440e+06 -3.280705610805321e+03 -2.602858049390557e+03 -6.296022282744697e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.033000000000000e+03 -2.800286992688925e+06 -5.433299744016324e+06 3.693672276421111e+06 -3.280652253484081e+03 -2.602730156749004e+03 -6.296103310878470e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.034000000000000e+03 -2.800352605785507e+06 -5.433351797909940e+06 3.693546352267761e+06 -3.280598898550139e+03 -2.602602268186294e+03 -6.296184332080800e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.035000000000000e+03 -2.800418217846029e+06 -5.433403849275924e+06 3.693420426425870e+06 -3.280545539139849e+03 -2.602474375074339e+03 -6.296265353342650e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.036000000000000e+03 -2.800483828841150e+06 -5.433455898085803e+06 3.693294498959580e+06 -3.280492177422348e+03 -2.602346481634460e+03 -6.296346371788351e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.037000000000000e+03 -2.800549438785621e+06 -5.433507944353882e+06 3.693168569836625e+06 -3.280438813954903e+03 -2.602218584220596e+03 -6.296427388787775e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.038000000000000e+03 -2.800615047650111e+06 -5.433559988051692e+06 3.693042639121153e+06 -3.280385449159970e+03 -2.602090688162632e+03 -6.296508401771694e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.039000000000000e+03 -2.800680655449085e+06 -5.433612029193333e+06 3.692916706781442e+06 -3.280332081984305e+03 -2.601962791729682e+03 -6.296589411994142e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.040000000000000e+03 -2.800746262182705e+06 -5.433664067778930e+06 3.692790772817189e+06 -3.280278714220306e+03 -2.601834893361225e+03 -6.296670419329608e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.041000000000000e+03 -2.800811867865440e+06 -5.433716103822579e+06 3.692664837196672e+06 -3.280225343009518e+03 -2.601706992424702e+03 -6.296751425369154e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.042000000000000e+03 -2.800877472453346e+06 -5.433768137281623e+06 3.692538900015994e+06 -3.280171971415260e+03 -2.601579094974294e+03 -6.296832426011912e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.043000000000000e+03 -2.800943075990390e+06 -5.433820168198744e+06 3.692412961178984e+06 -3.280118598097145e+03 -2.601451193674551e+03 -6.296913425140579e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.044000000000000e+03 -2.801008678461836e+06 -5.433872196559676e+06 3.692287020717830e+06 -3.280065222558699e+03 -2.601323291945170e+03 -6.296994421458701e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.045000000000000e+03 -2.801074279838355e+06 -5.433924222335940e+06 3.692161078696681e+06 -3.280011846800915e+03 -2.601195393269405e+03 -6.297075412498094e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.046000000000000e+03 -2.801139880193100e+06 -5.433976245598609e+06 3.692035134955455e+06 -3.279958467035563e+03 -2.601067487346918e+03 -6.297156404582616e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.047000000000000e+03 -2.801205479467444e+06 -5.434028266290760e+06 3.691909189622386e+06 -3.279905085355550e+03 -2.600939582919245e+03 -6.297237392859253e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.048000000000000e+03 -2.801271077676141e+06 -5.434080284426708e+06 3.691783242665215e+06 -3.279851703200935e+03 -2.600811676813312e+03 -6.297318378082185e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.049000000000000e+03 -2.801336674833664e+06 -5.434132300020544e+06 3.691657294052218e+06 -3.279798317573437e+03 -2.600683768015256e+03 -6.297399362075906e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.050000000000000e+03 -2.801402270896072e+06 -5.434184313029628e+06 3.691531343879505e+06 -3.279744931547377e+03 -2.600555862854997e+03 -6.297480340613259e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.051000000000000e+03 -2.801467865921929e+06 -5.434236323510815e+06 3.691405392018940e+06 -3.279691542994207e+03 -2.600427951673479e+03 -6.297561318971048e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.052000000000000e+03 -2.801533459852700e+06 -5.434288331407284e+06 3.691279438598588e+06 -3.279638153941774e+03 -2.600300044099749e+03 -6.297642291932219e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.053000000000000e+03 -2.801599052746656e+06 -5.434340336775672e+06 3.691153483490851e+06 -3.279584760616722e+03 -2.600172131753817e+03 -6.297723264956471e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.054000000000000e+03 -2.801664644560145e+06 -5.434392339573557e+06 3.691027526791306e+06 -3.279531367540495e+03 -2.600044219952969e+03 -6.297804233605683e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.055000000000000e+03 -2.801730235322237e+06 -5.434444339829206e+06 3.690901568436258e+06 -3.279477970973754e+03 -2.599916305330463e+03 -6.297885201091030e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.056000000000000e+03 -2.801795824989013e+06 -5.434496337499988e+06 3.690775608521834e+06 -3.279424574459356e+03 -2.599788393872555e+03 -6.297966163125113e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.057000000000000e+03 -2.801861413619009e+06 -5.434548332642753e+06 3.690649646919880e+06 -3.279371174800863e+03 -2.599660477207794e+03 -6.298047124898650e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.058000000000000e+03 -2.801927001168208e+06 -5.434600325214794e+06 3.690523683726697e+06 -3.279317773302208e+03 -2.599532562226685e+03 -6.298128082746804e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.059000000000000e+03 -2.801992587622170e+06 -5.434652315202062e+06 3.690397718973938e+06 -3.279264373478067e+03 -2.599404649051889e+03 -6.298209035006356e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.060000000000000e+03 -2.802058173039156e+06 -5.434704302661176e+06 3.690271752533998e+06 -3.279210969136031e+03 -2.599276731730301e+03 -6.298289987162061e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.061000000000000e+03 -2.802123757389831e+06 -5.434756287563683e+06 3.690145784471028e+06 -3.279157562082523e+03 -2.599148813634471e+03 -6.298370936885576e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.062000000000000e+03 -2.802189340674355e+06 -5.434808269909712e+06 3.690019814784731e+06 -3.279104154750562e+03 -2.599020893924892e+03 -6.298451883436935e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.063000000000000e+03 -2.802254922878004e+06 -5.434860249685001e+06 3.689893843507299e+06 -3.279050746021148e+03 -2.598892975524435e+03 -6.298532826027455e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.064000000000000e+03 -2.802320504044428e+06 -5.434912226931971e+06 3.689767870543080e+06 -3.278997332757723e+03 -2.598765052517711e+03 -6.298613768725394e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.065000000000000e+03 -2.802386084144589e+06 -5.434964201622405e+06 3.689641895955693e+06 -3.278943918755875e+03 -2.598637127860344e+03 -6.298694708478001e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.066000000000000e+03 -2.802451663163767e+06 -5.435016173742035e+06 3.689515919777340e+06 -3.278890503710033e+03 -2.598509204523012e+03 -6.298775644103212e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.067000000000000e+03 -2.802517241116423e+06 -5.435068143304941e+06 3.689389941976290e+06 -3.278837085998914e+03 -2.598381280570519e+03 -6.298856577204254e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.068000000000000e+03 -2.802582818002704e+06 -5.435120110311253e+06 3.689263962552241e+06 -3.278783667669532e+03 -2.598253354891417e+03 -6.298937507338911e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.069000000000000e+03 -2.802648393822487e+06 -5.435172074760878e+06 3.689137981505426e+06 -3.278730247048835e+03 -2.598125428829693e+03 -6.299018434674800e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.070000000000000e+03 -2.802713968561052e+06 -5.435224036639548e+06 3.689011998868048e+06 -3.278676825308577e+03 -2.597997503760743e+03 -6.299099358063890e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.071000000000000e+03 -2.802779542247730e+06 -5.435275995975736e+06 3.688886014575865e+06 -3.278623401423793e+03 -2.597869575251379e+03 -6.299180279947489e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.072000000000000e+03 -2.802845114867704e+06 -5.435327952755102e+06 3.688760028661265e+06 -3.278569974769404e+03 -2.597741646522406e+03 -6.299261199178680e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.073000000000000e+03 -2.802910686421128e+06 -5.435379906977779e+06 3.688634041123940e+06 -3.278516547649965e+03 -2.597613716110941e+03 -6.299342115353762e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.074000000000000e+03 -2.802976256922467e+06 -5.435431858657832e+06 3.688508051932153e+06 -3.278463116852894e+03 -2.597485782856280e+03 -6.299423030458827e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.075000000000000e+03 -2.803041826342395e+06 -5.435483807766840e+06 3.688382061150081e+06 -3.278409684802620e+03 -2.597357851196652e+03 -6.299503941410530e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.076000000000000e+03 -2.803107394681083e+06 -5.435535754304926e+06 3.688256068777419e+06 -3.278356253435613e+03 -2.597229919667850e+03 -6.299584847974349e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.077000000000000e+03 -2.803172961982165e+06 -5.435587698314497e+06 3.688130074718491e+06 -3.278302817205350e+03 -2.597101983553570e+03 -6.299665754785253e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.078000000000000e+03 -2.803238528187137e+06 -5.435639639738803e+06 3.688004079101416e+06 -3.278249380672689e+03 -2.596974051208181e+03 -6.299746656041383e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.079000000000000e+03 -2.803304093354532e+06 -5.435691578634625e+06 3.687878081798002e+06 -3.278195941606941e+03 -2.596846112657307e+03 -6.299827557198765e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.080000000000000e+03 -2.803369657440437e+06 -5.435743514959377e+06 3.687752082904398e+06 -3.278142501290390e+03 -2.596718175653262e+03 -6.299908454223483e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.081000000000000e+03 -2.803435220430135e+06 -5.435795448698801e+06 3.687626082452816e+06 -3.278089060609368e+03 -2.596590242081996e+03 -6.299989345871831e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.082000000000000e+03 -2.803500782440504e+06 -5.435847379966338e+06 3.687500080187177e+06 -3.278035612817156e+03 -2.596462294948481e+03 -6.300070242785826e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.083000000000000e+03 -2.803566343281631e+06 -5.435899308577701e+06 3.687374076523517e+06 -3.277982169472529e+03 -2.596334361374350e+03 -6.300151127620390e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.084000000000000e+03 -2.803631903143364e+06 -5.435951234717118e+06 3.687248071045917e+06 -3.277928719615290e+03 -2.596206414045922e+03 -6.300232017531530e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.085000000000000e+03 -2.803697461850471e+06 -5.436003158214569e+06 3.687122064138255e+06 -3.277875272900435e+03 -2.596078478281474e+03 -6.300312896848201e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.086000000000000e+03 -2.803763019534141e+06 -5.436055079197407e+06 3.686996055513031e+06 -3.277821821092832e+03 -2.595950535817447e+03 -6.300393777455624e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.087000000000000e+03 -2.803828576165350e+06 -5.436106997637433e+06 3.686870045233883e+06 -3.277768367693826e+03 -2.595822589562515e+03 -6.300474656459187e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.088000000000000e+03 -2.803894131700191e+06 -5.436158913492080e+06 3.686744033396959e+06 -3.277714913816782e+03 -2.595694646907147e+03 -6.300555530064991e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.089000000000000e+03 -2.803959686196894e+06 -5.436210826817892e+06 3.686618019874605e+06 -3.277661455553917e+03 -2.595566699551614e+03 -6.300636403748890e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.090000000000000e+03 -2.804025239597261e+06 -5.436262737558355e+06 3.686492004794413e+06 -3.277607998866403e+03 -2.595438754351513e+03 -6.300717271738074e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.091000000000000e+03 -2.804090791959509e+06 -5.436314645770012e+06 3.686365988028713e+06 -3.277554537493677e+03 -2.595310804641026e+03 -6.300798139857658e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.092000000000000e+03 -2.804156343210565e+06 -5.436366551381988e+06 3.686239969737621e+06 -3.277501076867057e+03 -2.595182860437459e+03 -6.300879001172792e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.093000000000000e+03 -2.804221893452700e+06 -5.436418454493506e+06 3.686113949697006e+06 -3.277447611412475e+03 -2.595054906541038e+03 -6.300959864986060e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.094000000000000e+03 -2.804287442598265e+06 -5.436470355019525e+06 3.685987928098953e+06 -3.277394145969756e+03 -2.594926955793041e+03 -6.301040723378696e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.095000000000000e+03 -2.804352990690875e+06 -5.436522253002427e+06 3.685861904847770e+06 -3.277340676806968e+03 -2.594799002605862e+03 -6.301121580539666e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.096000000000000e+03 -2.804418537701522e+06 -5.436574148414030e+06 3.685735880007104e+06 -3.277287208068105e+03 -2.594671049763172e+03 -6.301202433337602e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.097000000000000e+03 -2.804484083615393e+06 -5.436626041240007e+06 3.685609853609348e+06 -3.277233738605352e+03 -2.594543100395609e+03 -6.301283280906810e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.098000000000000e+03 -2.804549628505570e+06 -5.436677931551268e+06 3.685483825494317e+06 -3.277180265191050e+03 -2.594415143697367e+03 -6.301364129522937e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.099000000000000e+03 -2.804615172313579e+06 -5.436729819291093e+06 3.685357795790144e+06 -3.277126790612993e+03 -2.594287188116725e+03 -6.301444974158651e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.100000000000000e+03 -2.804680715083047e+06 -5.436781704501851e+06 3.685231764401141e+06 -3.277073311509581e+03 -2.594159228159553e+03 -6.301525818790924e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.101000000000000e+03 -2.804746256755779e+06 -5.436833587127062e+06 3.685105731454911e+06 -3.277019833766567e+03 -2.594031270354651e+03 -6.301606657829458e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.102000000000000e+03 -2.804811797331651e+06 -5.436885467166632e+06 3.684979696951685e+06 -3.276966355701489e+03 -2.593903315770323e+03 -6.301687491569276e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.103000000000000e+03 -2.804877336868875e+06 -5.436937344677074e+06 3.684853660763799e+06 -3.276912873402253e+03 -2.593775356906914e+03 -6.301768325129157e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.104000000000000e+03 -2.804942875338428e+06 -5.436989219630215e+06 3.684727622954890e+06 -3.276859390222941e+03 -2.593647396156516e+03 -6.301849155913542e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.105000000000000e+03 -2.805008412740184e+06 -5.437041092025961e+06 3.684601583525200e+06 -3.276805904786980e+03 -2.593519434863282e+03 -6.301929983954764e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.106000000000000e+03 -2.805073949088593e+06 -5.437092961878363e+06 3.684475542442983e+06 -3.276752415886030e+03 -2.593391470922410e+03 -6.302010810739578e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.107000000000000e+03 -2.805139484354642e+06 -5.437144829159257e+06 3.684349499771893e+06 -3.276698927433519e+03 -2.593263507264620e+03 -6.302091633178159e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.108000000000000e+03 -2.805205018523521e+06 -5.437196693854330e+06 3.684223455544328e+06 -3.276645438051119e+03 -2.593135547355328e+03 -6.302172450362223e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.109000000000000e+03 -2.805270551639137e+06 -5.437248556006148e+06 3.684097409664044e+06 -3.276591947109297e+03 -2.593007583823871e+03 -6.302253265851703e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.110000000000000e+03 -2.805336083745104e+06 -5.437300415657058e+06 3.683971362035319e+06 -3.276538449324996e+03 -2.592879611689093e+03 -6.302334084271669e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.111000000000000e+03 -2.805401614724629e+06 -5.437352272693795e+06 3.683845312914254e+06 -3.276484953639037e+03 -2.592751646843378e+03 -6.302414894481847e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.112000000000000e+03 -2.805467144636195e+06 -5.437404127173075e+06 3.683719262172613e+06 -3.276431456954927e+03 -2.592623680374316e+03 -6.302495701853527e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.113000000000000e+03 -2.805532673508844e+06 -5.437455979123088e+06 3.683593209746665e+06 -3.276377956395962e+03 -2.592495709209843e+03 -6.302576509064541e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.114000000000000e+03 -2.805598201284108e+06 -5.437507828487166e+06 3.683467155764576e+06 -3.276324455130241e+03 -2.592367741370908e+03 -6.302657311107464e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.115000000000000e+03 -2.805663728005885e+06 -5.437559675307875e+06 3.683341100130096e+06 -3.276270951985586e+03 -2.592239770206810e+03 -6.302738111469480e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.116000000000000e+03 -2.805729253674050e+06 -5.437611519585110e+06 3.683215042843449e+06 -3.276217445811442e+03 -2.592111796071799e+03 -6.302818910518899e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.117000000000000e+03 -2.805794778259307e+06 -5.437663361290501e+06 3.683088983968848e+06 -3.276163938163002e+03 -2.591983823535807e+03 -6.302899705517318e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.118000000000000e+03 -2.805860301776389e+06 -5.437715200438311e+06 3.682962923474004e+06 -3.276110429822968e+03 -2.591855849182257e+03 -6.302980497623203e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.119000000000000e+03 -2.805925824225169e+06 -5.437767037028452e+06 3.682836861359145e+06 -3.276056919291732e+03 -2.591727874151346e+03 -6.303061287015778e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.120000000000000e+03 -2.805991345590935e+06 -5.437818871046686e+06 3.682710797656496e+06 -3.276003407266682e+03 -2.591599900497111e+03 -6.303142072465256e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.121000000000000e+03 -2.806056865932159e+06 -5.437870702549702e+06 3.682584732237810e+06 -3.275949891503852e+03 -2.591471919375811e+03 -6.303222858919960e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.122000000000000e+03 -2.806122385175712e+06 -5.437922531466638e+06 3.682458665263429e+06 -3.275896374855738e+03 -2.591343941788471e+03 -6.303303640196545e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.123000000000000e+03 -2.806187903321755e+06 -5.437974357797621e+06 3.682332596733057e+06 -3.275842859633921e+03 -2.591215966596931e+03 -6.303384415744323e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.124000000000000e+03 -2.806253420443049e+06 -5.438026181613256e+06 3.682206526486984e+06 -3.275789338715137e+03 -2.591087985087998e+03 -6.303465192681881e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.125000000000000e+03 -2.806318936466571e+06 -5.438078002842750e+06 3.682080454685388e+06 -3.275735817843786e+03 -2.590960006427457e+03 -6.303545964319868e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.126000000000000e+03 -2.806384451436211e+06 -5.438129821528647e+06 3.681954381231999e+06 -3.275682295222846e+03 -2.590832024313068e+03 -6.303626734274284e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.127000000000000e+03 -2.806449965366415e+06 -5.438181637684982e+06 3.681828306095058e+06 -3.275628768086533e+03 -2.590704037580657e+03 -6.303707504324402e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.128000000000000e+03 -2.806515478184160e+06 -5.438233451240994e+06 3.681702229434752e+06 -3.275575241656156e+03 -2.590576056292997e+03 -6.303788267623152e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.129000000000000e+03 -2.806580989918756e+06 -5.438285262225085e+06 3.681576151186800e+06 -3.275521715481168e+03 -2.590448075319370e+03 -6.303869026651834e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.130000000000000e+03 -2.806646500642961e+06 -5.438337070707817e+06 3.681450071191477e+06 -3.275468183016886e+03 -2.590320085578224e+03 -6.303949788425965e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.131000000000000e+03 -2.806712010283758e+06 -5.438388876618437e+06 3.681323989608981e+06 -3.275414649254756e+03 -2.590192097419671e+03 -6.304030546076653e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.132000000000000e+03 -2.806777518812144e+06 -5.438440679928812e+06 3.681197906502979e+06 -3.275361117653571e+03 -2.590064113547474e+03 -6.304111296826029e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.133000000000000e+03 -2.806843026300782e+06 -5.438492480709429e+06 3.681071821713937e+06 -3.275307581312072e+03 -2.589936125106365e+03 -6.304192047751521e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.134000000000000e+03 -2.806908532720672e+06 -5.438544278932151e+06 3.680945735305533e+06 -3.275254044329716e+03 -2.589808135286969e+03 -6.304272795566523e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.135000000000000e+03 -2.806974038086252e+06 -5.438596074611026e+06 3.680819647246004e+06 -3.275200503668330e+03 -2.589680142956715e+03 -6.304353542160311e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.136000000000000e+03 -2.807039542353665e+06 -5.438647867703564e+06 3.680693557631565e+06 -3.275146962692371e+03 -2.589552153753192e+03 -6.304434283497817e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.137000000000000e+03 -2.807105045566801e+06 -5.438699658252278e+06 3.680567466365943e+06 -3.275093420531410e+03 -2.589424161067181e+03 -6.304515022906003e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.138000000000000e+03 -2.807170547725521e+06 -5.438751446257073e+06 3.680441373449354e+06 -3.275039874447030e+03 -2.589296165461081e+03 -6.304595761385723e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.139000000000000e+03 -2.807236048785971e+06 -5.438803231675480e+06 3.680315278978029e+06 -3.274986328319889e+03 -2.589168173468157e+03 -6.304676494269860e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.140000000000000e+03 -2.807301548792026e+06 -5.438855014550013e+06 3.680189182855677e+06 -3.274932780300251e+03 -2.589040178018590e+03 -6.304757225536073e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.141000000000000e+03 -2.807367047714410e+06 -5.438906794852310e+06 3.680063085146519e+06 -3.274879231137324e+03 -2.588912183395953e+03 -6.304837952944121e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.142000000000000e+03 -2.807432545611289e+06 -5.438958572638786e+06 3.679936985722815e+06 -3.274825676496087e+03 -2.588784182410922e+03 -6.304918681658472e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.143000000000000e+03 -2.807498042424515e+06 -5.439010347853075e+06 3.679810884712239e+06 -3.274772122089881e+03 -2.588656182036374e+03 -6.304999405981213e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.144000000000000e+03 -2.807563538124816e+06 -5.439062120466828e+06 3.679684782179013e+06 -3.274718568348682e+03 -2.588528186664813e+03 -6.305080123770324e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.145000000000000e+03 -2.807629032770357e+06 -5.439113890536449e+06 3.679558677995398e+06 -3.274665011639189e+03 -2.588400188755427e+03 -6.305160840025337e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.146000000000000e+03 -2.807694526375860e+06 -5.439165658076195e+06 3.679432572129087e+06 -3.274611451873469e+03 -2.588272185301759e+03 -6.305241556117978e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.147000000000000e+03 -2.807760018926519e+06 -5.439217423071766e+06 3.679306464612490e+06 -3.274557887994746e+03 -2.588144179566319e+03 -6.305322271085087e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.148000000000000e+03 -2.807825510364210e+06 -5.439269185466806e+06 3.679180355573293e+06 -3.274504326711429e+03 -2.588016178126416e+03 -6.305402978951460e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.149000000000000e+03 -2.807891000747088e+06 -5.439320945317710e+06 3.679054244883738e+06 -3.274450762173391e+03 -2.587888173906956e+03 -6.305483685521178e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.150000000000000e+03 -2.807956490060447e+06 -5.439372702610263e+06 3.678928132576065e+06 -3.274397195085895e+03 -2.587760169240130e+03 -6.305564389439322e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.151000000000000e+03 -2.808021978304442e+06 -5.439424457344590e+06 3.678802018649965e+06 -3.274343627373867e+03 -2.587632162903665e+03 -6.305645090368690e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.152000000000000e+03 -2.808087465478946e+06 -5.439476209520600e+06 3.678675903105673e+06 -3.274290057476978e+03 -2.587504155841265e+03 -6.305725788603463e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.153000000000000e+03 -2.808152951583819e+06 -5.439527959138200e+06 3.678549785943421e+06 -3.274236484760472e+03 -2.587376148267973e+03 -6.305806484338091e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.154000000000000e+03 -2.808218436619222e+06 -5.439579706197517e+06 3.678423667162912e+06 -3.274182911810061e+03 -2.587248139059596e+03 -6.305887176890389e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.155000000000000e+03 -2.808283920599589e+06 -5.439631450712575e+06 3.678297546732372e+06 -3.274129335180409e+03 -2.587120127106055e+03 -6.305967868323993e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.156000000000000e+03 -2.808349403495661e+06 -5.439683192655043e+06 3.678171424716045e+06 -3.274075757744997e+03 -2.586992116331508e+03 -6.306048555590253e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.157000000000000e+03 -2.808414885322146e+06 -5.439734932039173e+06 3.678045301081619e+06 -3.274022178905141e+03 -2.586864104288727e+03 -6.306129240045911e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.158000000000000e+03 -2.808480366078825e+06 -5.439786668864791e+06 3.677919175829515e+06 -3.273968597497756e+03 -2.586736091857710e+03 -6.306209921832083e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.159000000000000e+03 -2.808545845736717e+06 -5.439838403103801e+06 3.677793049023429e+06 -3.273915017682685e+03 -2.586608081533991e+03 -6.306290597946244e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.160000000000000e+03 -2.808611324353964e+06 -5.439890134812570e+06 3.677666920535585e+06 -3.273861433091207e+03 -2.586480066852394e+03 -6.306371274155979e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.161000000000000e+03 -2.808676801901294e+06 -5.439941863962770e+06 3.677540790430228e+06 -3.273807846144132e+03 -2.586352051460046e+03 -6.306451947742304e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.162000000000000e+03 -2.808742278393432e+06 -5.439993590568647e+06 3.677414658675049e+06 -3.273754257658257e+03 -2.586224032622599e+03 -6.306532619542706e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.163000000000000e+03 -2.808807753801112e+06 -5.440045314601873e+06 3.677288525334285e+06 -3.273700667870116e+03 -2.586096014762257e+03 -6.306613287492122e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.164000000000000e+03 -2.808873228124204e+06 -5.440097036062364e+06 3.677162390408177e+06 -3.273647076770471e+03 -2.585967998449957e+03 -6.306693951342282e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.165000000000000e+03 -2.808938701377426e+06 -5.440148754964356e+06 3.677036253864416e+06 -3.273593484785373e+03 -2.585839980540621e+03 -6.306774612290713e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.166000000000000e+03 -2.809004173604350e+06 -5.440200471350092e+06 3.676910115607218e+06 -3.273539887560872e+03 -2.585711955975248e+03 -6.306855274561854e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.167000000000000e+03 -2.809069644688308e+06 -5.440252185106590e+06 3.676783975892862e+06 -3.273486292916141e+03 -2.585583940715072e+03 -6.306935927526732e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.168000000000000e+03 -2.809135114789686e+06 -5.440303896389191e+06 3.676657834368986e+06 -3.273432691550245e+03 -2.585455911962998e+03 -6.307016585514310e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.169000000000000e+03 -2.809200583762696e+06 -5.440355605056704e+06 3.676531691355873e+06 -3.273379091957481e+03 -2.585327890342091e+03 -6.307097235525810e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.170000000000000e+03 -2.809266051709163e+06 -5.440407311207802e+06 3.676405546629728e+06 -3.273325486937926e+03 -2.585199862325423e+03 -6.307177886829573e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.171000000000000e+03 -2.809331518556415e+06 -5.440459014772061e+06 3.676279400350265e+06 -3.273271883210035e+03 -2.585071836467258e+03 -6.307258532577087e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.172000000000000e+03 -2.809396984304222e+06 -5.440510715749323e+06 3.676153252517913e+06 -3.273218278581291e+03 -2.584943814301349e+03 -6.307339173090230e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.173000000000000e+03 -2.809462449025566e+06 -5.440562414210261e+06 3.676027102972326e+06 -3.273164670273976e+03 -2.584815784817658e+03 -6.307419814505737e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.174000000000000e+03 -2.809527912691193e+06 -5.440614110126546e+06 3.675900951777746e+06 -3.273111058686488e+03 -2.584687752289050e+03 -6.307500454751641e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.175000000000000e+03 -2.809593375228139e+06 -5.440665803427572e+06 3.675774799094460e+06 -3.273057448628913e+03 -2.584559727424059e+03 -6.307581086898585e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.176000000000000e+03 -2.809658836738510e+06 -5.440717494212203e+06 3.675648644698098e+06 -3.273003834933709e+03 -2.584431694744584e+03 -6.307661720148313e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.177000000000000e+03 -2.809724297149364e+06 -5.440769182409815e+06 3.675522488748942e+06 -3.272950221004952e+03 -2.584303665522426e+03 -6.307742347963819e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.178000000000000e+03 -2.809789756504251e+06 -5.440820868062638e+06 3.675396331151200e+06 -3.272896603533078e+03 -2.584175633705181e+03 -6.307822974530683e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.179000000000000e+03 -2.809855214788765e+06 -5.440872551156684e+06 3.675270171936574e+06 -3.272842985443873e+03 -2.584047600215749e+03 -6.307903598106649e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.180000000000000e+03 -2.809920672002772e+06 -5.440924231691869e+06 3.675144011105301e+06 -3.272789364947412e+03 -2.583919566190730e+03 -6.307984219005299e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.181000000000000e+03 -2.809986128160710e+06 -5.440975909682194e+06 3.675017848625604e+06 -3.272735741289529e+03 -2.583791529187162e+03 -6.308064838650482e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.182000000000000e+03 -2.810051583233601e+06 -5.441027585099582e+06 3.674891684561199e+06 -3.272682117729410e+03 -2.583663492603124e+03 -6.308145454053946e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.183000000000000e+03 -2.810117037235785e+06 -5.441079257957980e+06 3.674765518880493e+06 -3.272628491258537e+03 -2.583535456133077e+03 -6.308226066722505e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.184000000000000e+03 -2.810182490167416e+06 -5.441130928257504e+06 3.674639351583182e+06 -3.272574864166728e+03 -2.583407417664014e+03 -6.308306676546279e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.185000000000000e+03 -2.810247941999238e+06 -5.441182595969873e+06 3.674513182733522e+06 -3.272521236788767e+03 -2.583279382733956e+03 -6.308387280924918e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.186000000000000e+03 -2.810313392803933e+06 -5.441234261165481e+06 3.674387012171690e+06 -3.272467604095739e+03 -2.583151341054467e+03 -6.308467886698303e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.187000000000000e+03 -2.810378842523399e+06 -5.441285923788060e+06 3.674260840025427e+06 -3.272413971441728e+03 -2.583023299832336e+03 -6.308548488240363e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.188000000000000e+03 -2.810444291157516e+06 -5.441337583837523e+06 3.674134666294972e+06 -3.272360337803633e+03 -2.582895259858698e+03 -6.308629085668030e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.189000000000000e+03 -2.810509738749829e+06 -5.441389241356061e+06 3.674008490884517e+06 -3.272306699517954e+03 -2.582767215304575e+03 -6.308709683227052e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.190000000000000e+03 -2.810575185213130e+06 -5.441440896259235e+06 3.673882313985850e+06 -3.272253064637503e+03 -2.582639177226364e+03 -6.308790272361323e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.191000000000000e+03 -2.810640630663776e+06 -5.441492548659707e+06 3.673756135343078e+06 -3.272199423543379e+03 -2.582511130281800e+03 -6.308870864234370e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.192000000000000e+03 -2.810706075057945e+06 -5.441544198515103e+06 3.673629955052483e+06 -3.272145778887733e+03 -2.582383080942554e+03 -6.308951454777432e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.193000000000000e+03 -2.810771518366673e+06 -5.441595845797360e+06 3.673503773177795e+06 -3.272092134411511e+03 -2.582255031972108e+03 -6.309032041064558e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.194000000000000e+03 -2.810836960560719e+06 -5.441647490478193e+06 3.673377589783278e+06 -3.272038490961770e+03 -2.582126988113307e+03 -6.309112620614736e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.195000000000000e+03 -2.810902401712741e+06 -5.441699132627984e+06 3.673251404709091e+06 -3.271984843062769e+03 -2.581998939783600e+03 -6.309193200156820e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.196000000000000e+03 -2.810967841822895e+06 -5.441750772246854e+06 3.673125217954922e+06 -3.271931192246640e+03 -2.581870885868475e+03 -6.309273779484532e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.197000000000000e+03 -2.811033280818160e+06 -5.441802409264179e+06 3.672999029681275e+06 -3.271877541690875e+03 -2.581742837599150e+03 -6.309354352188931e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.198000000000000e+03 -2.811098718742365e+06 -5.441854043722362e+06 3.672872839791798e+06 -3.271823890421374e+03 -2.581614787531976e+03 -6.309434922002005e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.199000000000000e+03 -2.811164155609944e+06 -5.441905675635397e+06 3.672746648254700e+06 -3.271770235893501e+03 -2.581486735019092e+03 -6.309515490369326e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.200000000000000e+03 -2.811229591406201e+06 -5.441957304989111e+06 3.672620455102238e+06 -3.271716578899866e+03 -2.581358682056600e+03 -6.309596056048083e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.201000000000000e+03 -2.811295026145845e+06 -5.442008931797703e+06 3.672494260302086e+06 -3.271662920084805e+03 -2.581230624935559e+03 -6.309676620382515e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.202000000000000e+03 -2.811360459814194e+06 -5.442060556047002e+06 3.672368063886501e+06 -3.271609259234948e+03 -2.581102567656113e+03 -6.309757181703304e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.203000000000000e+03 -2.811425892352891e+06 -5.442112177680566e+06 3.672241865983798e+06 -3.271555599912499e+03 -2.580974517482980e+03 -6.309837735179997e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.204000000000000e+03 -2.811491323907648e+06 -5.442163796839392e+06 3.672115666273471e+06 -3.271501933715415e+03 -2.580846453957802e+03 -6.309918293673603e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.205000000000000e+03 -2.811556754332774e+06 -5.442215413382517e+06 3.671989465075953e+06 -3.271448269306599e+03 -2.580718397514606e+03 -6.309998844215255e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.206000000000000e+03 -2.811622183715475e+06 -5.442267027394365e+06 3.671863262199362e+06 -3.271394600560919e+03 -2.580590336482095e+03 -6.310079394748362e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.207000000000000e+03 -2.811687612012237e+06 -5.442318638832809e+06 3.671737057739454e+06 -3.271340932028920e+03 -2.580462275892334e+03 -6.310159940978313e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.208000000000000e+03 -2.811753039251949e+06 -5.442370247725852e+06 3.671610851632601e+06 -3.271287259803554e+03 -2.580334212804014e+03 -6.310240485983342e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.209000000000000e+03 -2.811818465361986e+06 -5.442421854003208e+06 3.671484644038610e+06 -3.271233590728251e+03 -2.580206156404668e+03 -6.310321022590862e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.210000000000000e+03 -2.811883890429546e+06 -5.442473457749278e+06 3.671358434765582e+06 -3.271179917354697e+03 -2.580078095108918e+03 -6.310401559307547e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.211000000000000e+03 -2.811949314454500e+06 -5.442525058963971e+06 3.671232223813751e+06 -3.271126239641079e+03 -2.579950029367166e+03 -6.310482095953251e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.212000000000000e+03 -2.812014737407887e+06 -5.442576657619248e+06 3.671106011246858e+06 -3.271072561058034e+03 -2.579821961974349e+03 -6.310562629713458e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.213000000000000e+03 -2.812080159260476e+06 -5.442628253686852e+06 3.670979797129183e+06 -3.271018882426775e+03 -2.579693897738050e+03 -6.310643158092662e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.214000000000000e+03 -2.812145580070343e+06 -5.442679847223015e+06 3.670853581332868e+06 -3.270965199029170e+03 -2.579565829138080e+03 -6.310723686558330e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.215000000000000e+03 -2.812210999764882e+06 -5.442731438157462e+06 3.670727364017733e+06 -3.270911518401441e+03 -2.579437764734704e+03 -6.310804207900946e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.216000000000000e+03 -2.812276418460384e+06 -5.442783026602740e+06 3.670601144927808e+06 -3.270857830269962e+03 -2.579309689641510e+03 -6.310884733367631e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.217000000000000e+03 -2.812341836025741e+06 -5.442834612432043e+06 3.670474924351561e+06 -3.270804143605056e+03 -2.579181622261087e+03 -6.310965250753644e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.218000000000000e+03 -2.812407252548422e+06 -5.442886195729967e+06 3.670348702096528e+06 -3.270750454266380e+03 -2.579053548905434e+03 -6.311045767983670e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.219000000000000e+03 -2.812472667955537e+06 -5.442937776426035e+06 3.670222478323077e+06 -3.270696765714903e+03 -2.578925480959019e+03 -6.311126278459323e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.220000000000000e+03 -2.812538082319723e+06 -5.442989354590536e+06 3.670096252871317e+06 -3.270643073047162e+03 -2.578797408471772e+03 -6.311206788802939e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.221000000000000e+03 -2.812603495626564e+06 -5.443040930209520e+06 3.669970025772962e+06 -3.270589378237330e+03 -2.578669332218549e+03 -6.311287297773481e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.222000000000000e+03 -2.812668907846741e+06 -5.443092503254673e+06 3.669843797092485e+06 -3.270535681680900e+03 -2.578541257890221e+03 -6.311367802680690e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.223000000000000e+03 -2.812734318994958e+06 -5.443144073740195e+06 3.669717566797551e+06 -3.270481984366482e+03 -2.578413181793818e+03 -6.311448304703375e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.224000000000000e+03 -2.812799729056540e+06 -5.443195641651915e+06 3.669591334920425e+06 -3.270428286052907e+03 -2.578285106865239e+03 -6.311528802656582e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.225000000000000e+03 -2.812865138074998e+06 -5.443247207031973e+06 3.669465101365258e+06 -3.270374582919431e+03 -2.578157027795466e+03 -6.311609300621116e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.226000000000000e+03 -2.812930546021386e+06 -5.443298769852335e+06 3.669338866195800e+06 -3.270320879356104e+03 -2.578028946655229e+03 -6.311689795684935e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.227000000000000e+03 -2.812995952866476e+06 -5.443350330084772e+06 3.669212629476346e+06 -3.270267175357336e+03 -2.577900869013549e+03 -6.311770285395049e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.228000000000000e+03 -2.813061358653792e+06 -5.443401887771406e+06 3.669086391111045e+06 -3.270213468129939e+03 -2.577772788720411e+03 -6.311850773734908e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.229000000000000e+03 -2.813126763368923e+06 -5.443453442898296e+06 3.668960151131619e+06 -3.270159759951825e+03 -2.577644707017477e+03 -6.311931259119988e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.230000000000000e+03 -2.813192166997204e+06 -5.443504995451273e+06 3.668833909570334e+06 -3.270106050609420e+03 -2.577516626399476e+03 -6.312011740547712e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.231000000000000e+03 -2.813257569596695e+06 -5.443556545486527e+06 3.668707666299305e+06 -3.270052336083200e+03 -2.577388539277064e+03 -6.312092223193426e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.232000000000000e+03 -2.813322971065704e+06 -5.443608092905696e+06 3.668581421542442e+06 -3.269998624521181e+03 -2.577260458589642e+03 -6.312172697644217e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.233000000000000e+03 -2.813388371520401e+06 -5.443659637821169e+06 3.668455175043904e+06 -3.269944906302106e+03 -2.577132369314916e+03 -6.312253174901381e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.234000000000000e+03 -2.813453770859095e+06 -5.443711180134592e+06 3.668328927027621e+06 -3.269891190291179e+03 -2.577004284738006e+03 -6.312333645073887e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.235000000000000e+03 -2.813519169168945e+06 -5.443762719930280e+06 3.668202677301619e+06 -3.269837468840411e+03 -2.576876193394997e+03 -6.312414116695489e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.236000000000000e+03 -2.813584566333442e+06 -5.443814257095600e+06 3.668076426122412e+06 -3.269783750137341e+03 -2.576748111408666e+03 -6.312494578934139e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.237000000000000e+03 -2.813649962469117e+06 -5.443865791743221e+06 3.667950173233419e+06 -3.269730027821740e+03 -2.576620021731359e+03 -6.312575042197730e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.238000000000000e+03 -2.813715357561289e+06 -5.443917323858975e+06 3.667823918666912e+06 -3.269676301115981e+03 -2.576491927545627e+03 -6.312655505437164e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.239000000000000e+03 -2.813780751508006e+06 -5.443968853344310e+06 3.667697662647363e+06 -3.269622576854174e+03 -2.576363842674652e+03 -6.312735959451325e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.240000000000000e+03 -2.813846144454877e+06 -5.444020380340015e+06 3.667571404854128e+06 -3.269568847234795e+03 -2.576235746172612e+03 -6.312816417019904e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.241000000000000e+03 -2.813911536299958e+06 -5.444071904747529e+06 3.667445145511674e+06 -3.269515117088590e+03 -2.576107652899369e+03 -6.312896869396955e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.242000000000000e+03 -2.813976927043112e+06 -5.444123426566774e+06 3.667318884620252e+06 -3.269461386536337e+03 -2.575979563344024e+03 -6.312977316312423e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.243000000000000e+03 -2.814042316786312e+06 -5.444174945896310e+06 3.667192621955293e+06 -3.269407650411649e+03 -2.575851461775515e+03 -6.313057767047320e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.244000000000000e+03 -2.814107705413061e+06 -5.444226462623549e+06 3.667066357773327e+06 -3.269353914716541e+03 -2.575723365847645e+03 -6.313138211093356e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.245000000000000e+03 -2.814173092966876e+06 -5.444277976790578e+06 3.666940091978484e+06 -3.269300177019958e+03 -2.575595269131711e+03 -6.313218652388864e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.246000000000000e+03 -2.814238479433353e+06 -5.444329488383468e+06 3.666813824602490e+06 -3.269246439331629e+03 -2.575467172851872e+03 -6.313299089480334e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.247000000000000e+03 -2.814303864826823e+06 -5.444380997416116e+06 3.666687555613725e+06 -3.269192698958755e+03 -2.575339076170797e+03 -6.313379523961787e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.248000000000000e+03 -2.814369249161970e+06 -5.444432503902708e+06 3.666561284979852e+06 -3.269138956727689e+03 -2.575210976156894e+03 -6.313459956748371e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.249000000000000e+03 -2.814434632453214e+06 -5.444484007857203e+06 3.666435012669054e+06 -3.269085210238549e+03 -2.575082871032562e+03 -6.313540389714426e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.250000000000000e+03 -2.814500014613163e+06 -5.444535509195167e+06 3.666308738873813e+06 -3.269031465328837e+03 -2.574954773792038e+03 -6.313620814482130e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.251000000000000e+03 -2.814565395729232e+06 -5.444587008001065e+06 3.666182463401581e+06 -3.268977717788113e+03 -2.574826670549198e+03 -6.313701239081901e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.252000000000000e+03 -2.814630775786742e+06 -5.444638504260753e+06 3.666056186284633e+06 -3.268923966897385e+03 -2.574698564779774e+03 -6.313781662310007e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.253000000000000e+03 -2.814696154785564e+06 -5.444689997974138e+06 3.665929907523205e+06 -3.268870212500694e+03 -2.574570456535904e+03 -6.313862084214246e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.254000000000000e+03 -2.814761532653141e+06 -5.444741489071063e+06 3.665803627277198e+06 -3.268816461674265e+03 -2.574442354488069e+03 -6.313942497758782e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.255000000000000e+03 -2.814826909491135e+06 -5.444792977649827e+06 3.665677345322557e+06 -3.268762705295503e+03 -2.574314245792174e+03 -6.314022912747763e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.256000000000000e+03 -2.814892285241252e+06 -5.444844463654110e+06 3.665551061787685e+06 -3.268708947611952e+03 -2.574186138461812e+03 -6.314103323721239e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.257000000000000e+03 -2.814957659918179e+06 -5.444895947098107e+06 3.665424776640236e+06 -3.268655189290199e+03 -2.574058029666627e+03 -6.314183731622096e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.258000000000000e+03 -2.815023033492623e+06 -5.444947427953537e+06 3.665298489944707e+06 -3.268601430144355e+03 -2.573929924433092e+03 -6.314264134322507e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.259000000000000e+03 -2.815088406066508e+06 -5.444998906318901e+06 3.665172201476495e+06 -3.268547665210094e+03 -2.573801807463273e+03 -6.314344540813364e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.260000000000000e+03 -2.815153777494306e+06 -5.445050382053581e+06 3.665045911556264e+06 -3.268493902786767e+03 -2.573673700147400e+03 -6.314424937905849e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.261000000000000e+03 -2.815219147877664e+06 -5.445101855255844e+06 3.664919619959955e+06 -3.268440136230578e+03 -2.573545588066062e+03 -6.314505334967647e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.262000000000000e+03 -2.815284517187655e+06 -5.445153325897720e+06 3.664793326751339e+06 -3.268386368866376e+03 -2.573417474251147e+03 -6.314585729152343e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.263000000000000e+03 -2.815349885409619e+06 -5.445204793965063e+06 3.664667031962701e+06 -3.268332600330494e+03 -2.573289361906318e+03 -6.314666119215602e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.264000000000000e+03 -2.815415252587028e+06 -5.445256259499935e+06 3.664540735498144e+06 -3.268278827106059e+03 -2.573161245148836e+03 -6.314746509345083e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.265000000000000e+03 -2.815480618690962e+06 -5.445307722474352e+06 3.664414437421445e+06 -3.268225053284409e+03 -2.573033126335579e+03 -6.314826896643233e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.266000000000000e+03 -2.815545983663147e+06 -5.445359182832034e+06 3.664288137861034e+06 -3.268171281596715e+03 -2.572905015010188e+03 -6.314907275669620e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.267000000000000e+03 -2.815611347619748e+06 -5.445410640685278e+06 3.664161836560765e+06 -3.268117503001557e+03 -2.572776895254461e+03 -6.314987657538360e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.268000000000000e+03 -2.815676710473693e+06 -5.445462095949919e+06 3.664035533712625e+06 -3.268063725919255e+03 -2.572648777671553e+03 -6.315068033756318e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.269000000000000e+03 -2.815742072282996e+06 -5.445513548682056e+06 3.663909229188651e+06 -3.268009944319604e+03 -2.572520655614190e+03 -6.315148409989200e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.270000000000000e+03 -2.815807433003924e+06 -5.445564998839453e+06 3.663782923085226e+06 -3.267956161639018e+03 -2.572392534734622e+03 -6.315228782188333e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.271000000000000e+03 -2.815872792665696e+06 -5.445616446450329e+06 3.663656615337947e+06 -3.267902377033409e+03 -2.572264410424171e+03 -6.315309152764608e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.272000000000000e+03 -2.815938151224483e+06 -5.445667891472389e+06 3.663530306043375e+06 -3.267848591584970e+03 -2.572136289877697e+03 -6.315389518061640e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.273000000000000e+03 -2.816003508738582e+06 -5.445719333961931e+06 3.663403995073010e+06 -3.267794803578010e+03 -2.572008163377055e+03 -6.315469883133444e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.274000000000000e+03 -2.816068865149716e+06 -5.445770773862691e+06 3.663277682555281e+06 -3.267741015156468e+03 -2.571880040509880e+03 -6.315550242789010e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.275000000000000e+03 -2.816134220515901e+06 -5.445822211230749e+06 3.663151368362231e+06 -3.267687222316777e+03 -2.571751912964168e+03 -6.315630602503386e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.276000000000000e+03 -2.816199574764605e+06 -5.445873645996013e+06 3.663025052653799e+06 -3.267633431713967e+03 -2.571623789587156e+03 -6.315710955361367e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.277000000000000e+03 -2.816264928011992e+06 -5.445925078270732e+06 3.662898735173824e+06 -3.267579634085618e+03 -2.571495655729191e+03 -6.315791312014188e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.278000000000000e+03 -2.816330280127110e+06 -5.445976507928441e+06 3.662772416210992e+06 -3.267525837850533e+03 -2.571367529455099e+03 -6.315871660692676e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.279000000000000e+03 -2.816395631153709e+06 -5.446027935011390e+06 3.662646095668849e+06 -3.267472041776618e+03 -2.571239403240766e+03 -6.315952005265298e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.280000000000000e+03 -2.816460981135271e+06 -5.446079359561610e+06 3.662519773451471e+06 -3.267418241621143e+03 -2.571111272605311e+03 -6.316032349630076e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.281000000000000e+03 -2.816526330057134e+06 -5.446130781564956e+06 3.662393449591151e+06 -3.267364438295886e+03 -2.570983139000381e+03 -6.316112692734203e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.282000000000000e+03 -2.816591677919440e+06 -5.446182201021566e+06 3.662267124087579e+06 -3.267310632731955e+03 -2.570855002258382e+03 -6.316193034228029e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.283000000000000e+03 -2.816657024692899e+06 -5.446233617903190e+06 3.662140797005276e+06 -3.267256825508779e+03 -2.570726866921369e+03 -6.316273371851764e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.284000000000000e+03 -2.816722370348608e+06 -5.446285032181887e+06 3.662014468408047e+06 -3.267203020838833e+03 -2.570598736024846e+03 -6.316353702357421e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.285000000000000e+03 -2.816787714959091e+06 -5.446336443927747e+06 3.661888138135857e+06 -3.267149211395822e+03 -2.570470600580802e+03 -6.316434033024393e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.286000000000000e+03 -2.816853058495159e+06 -5.446387853112602e+06 3.661761806253050e+06 -3.267095400098189e+03 -2.570342464164250e+03 -6.316514360955262e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.287000000000000e+03 -2.816918400956955e+06 -5.446439259736586e+06 3.661635472759321e+06 -3.267041587654101e+03 -2.570214326513618e+03 -6.316594685943214e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.288000000000000e+03 -2.816983742344361e+06 -5.446490663799599e+06 3.661509137654905e+06 -3.266987773103243e+03 -2.570086188050513e+03 -6.316675008239298e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.289000000000000e+03 -2.817049082628175e+06 -5.446542065273487e+06 3.661382801004153e+06 -3.266933958163012e+03 -2.569958053113095e+03 -6.316755325157239e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.290000000000000e+03 -2.817114421866680e+06 -5.446593464214506e+06 3.661256462678532e+06 -3.266880140594711e+03 -2.569829912218624e+03 -6.316835641880641e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.291000000000000e+03 -2.817179760059742e+06 -5.446644860622562e+06 3.661130122678274e+06 -3.266826318475305e+03 -2.569701767012664e+03 -6.316915958559759e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.292000000000000e+03 -2.817245097163638e+06 -5.446696254455470e+06 3.661003781099789e+06 -3.266772495215439e+03 -2.569573623071755e+03 -6.316996271195152e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.293000000000000e+03 -2.817310433178522e+06 -5.446747645713352e+06 3.660877437942770e+06 -3.266718672028762e+03 -2.569445479624862e+03 -6.317076579574409e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.294000000000000e+03 -2.817375768118795e+06 -5.446799034410148e+06 3.660751093175396e+06 -3.266664846793853e+03 -2.569317335234486e+03 -6.317156885292754e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.295000000000000e+03 -2.817441101969795e+06 -5.446850420531737e+06 3.660624746829960e+06 -3.266611020061770e+03 -2.569189192383286e+03 -6.317237187009455e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.296000000000000e+03 -2.817506434760735e+06 -5.446901804106306e+06 3.660498398842040e+06 -3.266557191508340e+03 -2.569061046130710e+03 -6.317317487041807e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.297000000000000e+03 -2.817571766476863e+06 -5.446953185119662e+06 3.660372049244110e+06 -3.266503360342685e+03 -2.568932899198995e+03 -6.317397784553318e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.298000000000000e+03 -2.817637097103796e+06 -5.447004563557900e+06 3.660245698067930e+06 -3.266449529121345e+03 -2.568804752985169e+03 -6.317478077769361e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.299000000000000e+03 -2.817702426670470e+06 -5.447055939448985e+06 3.660119345249607e+06 -3.266395694909460e+03 -2.568676603877118e+03 -6.317558369609177e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.300000000000000e+03 -2.817767755162221e+06 -5.447107312778792e+06 3.659992990821440e+06 -3.266341858217429e+03 -2.568548454147701e+03 -6.317638658842787e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.301000000000000e+03 -2.817833082593732e+06 -5.447158683561483e+06 3.659866634751071e+06 -3.266288019874068e+03 -2.568420301050502e+03 -6.317718946299650e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.302000000000000e+03 -2.817898408964863e+06 -5.447210051796956e+06 3.659740277038717e+06 -3.266234177834559e+03 -2.568292145035735e+03 -6.317799232710514e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.303000000000000e+03 -2.817963734217386e+06 -5.447261417429016e+06 3.659613917812873e+06 -3.266180336783759e+03 -2.568163994505952e+03 -6.317879512258895e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.304000000000000e+03 -2.818029058380502e+06 -5.447312780485854e+06 3.659487557009109e+06 -3.266126496082469e+03 -2.568035844437446e+03 -6.317959787441015e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.305000000000000e+03 -2.818094381497667e+06 -5.447364141009443e+06 3.659361194531472e+06 -3.266072650947815e+03 -2.567907689605788e+03 -6.318040062722191e+03 2.154686298700000e-03 4.788782764000000e-04 1.395186534100000e-03 1.999428422500000e-03 1.609821845400000e-03 4.308909013200000e-03</EPHEMLIST>\n\t\t</EPHEMLISTList>\n\t</EPH>\n\t<ATT>\n\t\t<SATID>WV02</SATID>\n\t\t<REVNUMBER>24638</REVNUMBER>\n\t\t<STRIPID>32134D</STRIPID>\n\t\t<TYPE>R</TYPE>\n\t\t<VERSION>A</VERSION>\n\t\t<GENERATIONTIME>2014-06-19T19:50:25.000000Z</GENERATIONTIME>\n\t\t<STARTTIME>2014-06-19T18:53:46.118937Z</STARTTIME>\n\t\t<NUMPOINTS>1305</NUMPOINTS>\n\t\t<TIMEINTERVAL>2.000000000000000e-02</TIMEINTERVAL>\n\t\t<ATTLISTList>\n\t\t\t<ATTLIST>1.000000000000000e+00 -3.766614153264418e-01 6.144911761585342e-01 3.179656883386397e-01 6.159745073190270e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.000000000000000e+00 -3.766663087076705e-01 6.145296261143697e-01 3.179321863189918e-01 6.159504488306643e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.000000000000000e+00 -3.766711958012161e-01 6.145680683213012e-01 3.178986884730226e-01 6.159263945640246e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.000000000000000e+00 -3.766760766022806e-01 6.146065027913686e-01 3.178651948021298e-01 6.159023445120828e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.000000000000000e+00 -3.766809511660710e-01 6.146449294762024e-01 3.178317052962652e-01 6.158782986973045e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.000000000000000e+00 -3.766858195022036e-01 6.146833483753227e-01 3.177982199536044e-01 6.158542571180098e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.000000000000000e+00 -3.766906815039645e-01 6.147217595731180e-01 3.177647387990326e-01 6.158302197451754e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.000000000000000e+00 -3.766955373137165e-01 6.147601629596012e-01 3.177312618022841e-01 6.158061866199002e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.000000000000000e+00 -3.767003868046073e-01 6.147985586327843e-01 3.176977889929969e-01 6.157821577094219e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.000000000000000e+01 -3.767052300544931e-01 6.148369465349933e-01 3.176643203548896e-01 6.157581330348659e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.100000000000000e+01 -3.767100670745148e-01 6.148753266603021e-01 3.176308558864198e-01 6.157341125989056e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.200000000000000e+01 -3.767148977749804e-01 6.149136990771733e-01 3.175973956091405e-01 6.157100963797043e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.300000000000000e+01 -3.767197222507454e-01 6.149520637142271e-01 3.175639395030674e-01 6.156860844035918e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.400000000000000e+01 -3.767245405016293e-01 6.149904205798113e-01 3.175304875683542e-01 6.156620766650374e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.500000000000000e+01 -3.767293524195860e-01 6.150287697459836e-01 3.174970398321946e-01 6.156380731469222e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.600000000000000e+01 -3.767341581254864e-01 6.150671111369956e-01 3.174635962665069e-01 6.156140738682054e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.700000000000000e+01 -3.767389576022498e-01 6.151054447549850e-01 3.174301568780163e-01 6.155900788365097e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.800000000000000e+01 -3.767437507519224e-01 6.151437706784142e-01 3.173967216896165e-01 6.155660880243485e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.900000000000000e+01 -3.767485376874921e-01 6.151820888214306e-01 3.173632906773232e-01 6.155421014634975e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.000000000000000e+01 -3.767533184040428e-01 6.152203991999926e-01 3.173298638417605e-01 6.155181191434690e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.100000000000000e+01 -3.767580927891489e-01 6.152587018891224e-01 3.172964412111977e-01 6.154941410462850e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.200000000000000e+01 -3.767628609852331e-01 6.152969967876090e-01 3.172630227539244e-01 6.154701672050513e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.300000000000000e+01 -3.767676228801095e-01 6.153352839791328e-01 3.172296084968710e-01 6.154461975936757e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.400000000000000e+01 -3.767723785501670e-01 6.153735634114172e-01 3.171961984233768e-01 6.154222322290135e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.500000000000000e+01 -3.767771279957584e-01 6.154118350858316e-01 3.171627925344362e-01 6.153982711117373e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.600000000000000e+01 -3.767818711222755e-01 6.154500990675509e-01 3.171293908538154e-01 6.153743142251118e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.700000000000000e+01 -3.767866080400632e-01 6.154883552835301e-01 3.170959933564765e-01 6.153503615902964e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.800000000000000e+01 -3.767913387344804e-01 6.155266037430764e-01 3.170626000472849e-01 6.153264132072076e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.900000000000000e+01 -3.767960631160570e-01 6.155648445189105e-01 3.170292109471918e-01 6.153024690498575e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.000000000000000e+01 -3.768007812862307e-01 6.156030775263792e-01 3.169958260358309e-01 6.152785291540719e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.100000000000000e+01 -3.768054932478030e-01 6.156413027762131e-01 3.169624453119968e-01 6.152545935107894e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.200000000000000e+01 -3.768101988788005e-01 6.156795203476958e-01 3.169290688066251e-01 6.152306621022035e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.300000000000000e+01 -3.768148983395752e-01 6.157177301407010e-01 3.168956964817055e-01 6.152067349526446e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.400000000000000e+01 -3.768195914857644e-01 6.157559322474583e-01 3.168623283738182e-01 6.151828120421505e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.500000000000000e+01 -3.768242784257387e-01 6.157941265962531e-01 3.168289644583324e-01 6.151588933915694e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.600000000000000e+01 -3.768289591513374e-01 6.158323132008204e-01 3.167956047372877e-01 6.151349789938648e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.700000000000000e+01 -3.768336335701279e-01 6.158704921138520e-01 3.167622492356149e-01 6.151110688428315e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.800000000000000e+01 -3.768383017751686e-01 6.159086632872093e-01 3.167288979303564e-01 6.150871629442382e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.900000000000000e+01 -3.768429637669574e-01 6.159468267133473e-01 3.166955508237591e-01 6.150632613069400e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.000000000000000e+01 -3.768476194546272e-01 6.159849824571173e-01 3.166622079384604e-01 6.150393639127699e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.100000000000000e+01 -3.768522689471744e-01 6.160231304485795e-01 3.166288692493097e-01 6.150154707806973e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.200000000000000e+01 -3.768569122256439e-01 6.160612706977571e-01 3.165955347625293e-01 6.149915819118555e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.300000000000000e+01 -3.768615491750535e-01 6.160994032814135e-01 3.165622045071577e-01 6.149676972876166e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.400000000000000e+01 -3.768661799445002e-01 6.161375281134868e-01 3.165288784468671e-01 6.149438169242865e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.500000000000000e+01 -3.768708045035138e-01 6.161756452007789e-01 3.164955565922379e-01 6.149199408310383e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.600000000000000e+01 -3.768754227577276e-01 6.162137546193200e-01 3.164622389654823e-01 6.148960689808470e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.700000000000000e+01 -3.768800348318159e-01 6.162518562754892e-01 3.164289255395127e-01 6.148722014078151e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.800000000000000e+01 -3.768846406213769e-01 6.162899502565098e-01 3.163956163382926e-01 6.148483380789415e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.900000000000000e+01 -3.768892401870236e-01 6.163280365075572e-01 3.163623113507227e-01 6.148244790204890e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.000000000000000e+01 -3.768938335603311e-01 6.163661150242823e-01 3.163290105680847e-01 6.148006242247053e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.100000000000000e+01 -3.768984206462312e-01 6.164041858545635e-01 3.162957140169880e-01 6.147767736909333e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.200000000000000e+01 -3.769030015136851e-01 6.164422489599468e-01 3.162624216810972e-01 6.147529274266094e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.300000000000000e+01 -3.769075761803360e-01 6.164803043389019e-01 3.162291335559798e-01 6.147290854274861e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.400000000000000e+01 -3.769121445573788e-01 6.165183520460802e-01 3.161958496651537e-01 6.147052476838591e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.500000000000000e+01 -3.769167067338090e-01 6.165563920206626e-01 3.161625699887800e-01 6.146814142151141e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.600000000000000e+01 -3.769212627046934e-01 6.165944242653861e-01 3.161292945294255e-01 6.146575850229656e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.700000000000000e+01 -3.769258123883238e-01 6.166324488477134e-01 3.160960233063452e-01 6.146337600826925e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.800000000000000e+01 -3.769303559009221e-01 6.166704656863423e-01 3.160627562934033e-01 6.146099394207767e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.900000000000000e+01 -3.769348931218190e-01 6.167084748530878e-01 3.160294935224019e-01 6.145861230255654e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.000000000000000e+01 -3.769394241494160e-01 6.167464762939692e-01 3.159962349692846e-01 6.145623109059942e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.100000000000000e+01 -3.769439489742669e-01 6.167844700191784e-01 3.159629806370489e-01 6.145385030588388e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.200000000000000e+01 -3.769484675121784e-01 6.168224560824527e-01 3.159297305478324e-01 6.145146994731738e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.300000000000000e+01 -3.769529798586350e-01 6.168604344141753e-01 3.158964846808405e-01 6.144909001737439e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.400000000000000e+01 -3.769574859930573e-01 6.168984050408748e-01 3.158632430404433e-01 6.144671051470475e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.500000000000000e+01 -3.769619858581086e-01 6.169363680003157e-01 3.158300056420448e-01 6.144433143851726e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.600000000000000e+01 -3.769664795142338e-01 6.169743232487924e-01 3.157967724728937e-01 6.144195279042185e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.700000000000000e+01 -3.769709670060365e-01 6.170122707599197e-01 3.157635435230475e-01 6.143957457111744e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.800000000000000e+01 -3.769754481671040e-01 6.170502106430771e-01 3.157303188343677e-01 6.143719677795316e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.900000000000000e+01 -3.769799231741124e-01 6.170881427957026e-01 3.156970983633369e-01 6.143481941289978e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.000000000000000e+01 -3.769843919816397e-01 6.171260672303311e-01 3.156638821248074e-01 6.143244247699694e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.100000000000000e+01 -3.769888544865758e-01 6.171639840333064e-01 3.156306701425904e-01 6.143006596694941e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.200000000000000e+01 -3.769933108558888e-01 6.172018930823761e-01 3.155974623792391e-01 6.142768988699080e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.300000000000000e+01 -3.769977609245423e-01 6.172397944881931e-01 3.155642588760110e-01 6.142531423428690e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.400000000000000e+01 -3.770022048162750e-01 6.172776881796133e-01 3.155310596026732e-01 6.142293901021945e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.500000000000000e+01 -3.770066425152719e-01 6.173155741733340e-01 3.154978645634320e-01 6.142056421413948e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.600000000000000e+01 -3.770110739368208e-01 6.173534525080544e-01 3.154646737828869e-01 6.141818984636778e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.700000000000000e+01 -3.770154991681025e-01 6.173913231461644e-01 3.154314872382626e-01 6.141581590677704e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.800000000000000e+01 -3.770199182087696e-01 6.174291860697027e-01 3.153983049336112e-01 6.141344239726041e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.900000000000000e+01 -3.770243309770119e-01 6.174670413527920e-01 3.153651268873532e-01 6.141106931471637e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.000000000000000e+01 -3.770287375570158e-01 6.175048889334562e-01 3.153319530812944e-01 6.140869666141591e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.100000000000000e+01 -3.770331379651881e-01 6.175427288065846e-01 3.152987835119003e-01 6.140632443732131e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.200000000000000e+01 -3.770375320853044e-01 6.175805610432032e-01 3.152656182097616e-01 6.140395264112909e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.300000000000000e+01 -3.770419200526506e-01 6.176183855578902e-01 3.152324571426618e-01 6.140158127505155e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.400000000000000e+01 -3.770463017430113e-01 6.176562024358752e-01 3.151993003418329e-01 6.139921033681380e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.500000000000000e+01 -3.770506772388706e-01 6.176940116185324e-01 3.151661477891388e-01 6.139683982845275e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.600000000000000e+01 -3.770550465882023e-01 6.177318130859795e-01 3.151329994724676e-01 6.139446974991826e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.700000000000000e+01 -3.770594096435647e-01 6.177696069281757e-01 3.150998554302861e-01 6.139210009951332e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.800000000000000e+01 -3.770637665173080e-01 6.178073930794695e-01 3.150667156353069e-01 6.138973087861777e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.900000000000000e+01 -3.770681172204852e-01 6.178451715317745e-01 3.150335800862440e-01 6.138736208770619e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.000000000000000e+01 -3.770724616350502e-01 6.178829423529614e-01 3.150004488148346e-01 6.138499372584340e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.100000000000000e+01 -3.770767998908987e-01 6.179207054786872e-01 3.149673217875965e-01 6.138262579351825e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.200000000000000e+01 -3.770811319642514e-01 6.179584609112533e-01 3.149341990135782e-01 6.138025829176917e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.300000000000000e+01 -3.770854577509279e-01 6.179962087245331e-01 3.149010805189319e-01 6.137789121849052e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.400000000000000e+01 -3.770897773918750e-01 6.180339488313140e-01 3.148679662697461e-01 6.137552457581710e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.500000000000000e+01 -3.770940908390809e-01 6.180716812590922e-01 3.148348562796265e-01 6.137315836350555e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.600000000000000e+01 -3.770983980122274e-01 6.181094060633924e-01 3.148017505693099e-01 6.137079258010851e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.700000000000000e+01 -3.771026990551990e-01 6.181471231551543e-01 3.147686491040467e-01 6.136842722781023e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.800000000000000e+01 -3.771069938295855e-01 6.181848326226304e-01 3.147355519195775e-01 6.136606230466661e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.900000000000000e+01 -3.771112824266430e-01 6.182225344056460e-01 3.147024589949164e-01 6.136369781248077e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.000000000000000e+02 -3.771155648389815e-01 6.182602285195817e-01 3.146693703316069e-01 6.136133375035134e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.010000000000000e+02 -3.771198410147098e-01 6.182979149853437e-01 3.146362859458002e-01 6.135897011880572e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.020000000000000e+02 -3.771241110073511e-01 6.183355937836732e-01 3.146032058233481e-01 6.135660691749337e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.030000000000000e+02 -3.771283748186287e-01 6.183732649018132e-01 3.145701299668250e-01 6.135424414773494e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.040000000000000e+02 -3.771326323768706e-01 6.184109284048152e-01 3.145370583926497e-01 6.135188180681058e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.050000000000000e+02 -3.771368837717879e-01 6.184485842225617e-01 3.145039910817871e-01 6.134951989752171e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.060000000000000e+02 -3.771411289896408e-01 6.184862323637471e-01 3.144709280389343e-01 6.134715841986879e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.070000000000000e+02 -3.771453679429712e-01 6.185238728953206e-01 3.144378692856398e-01 6.134479737164685e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.080000000000000e+02 -3.771496007786395e-01 6.185615057174096e-01 3.144048147876168e-01 6.134243675592683e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.090000000000000e+02 -3.771538273255909e-01 6.185991309447650e-01 3.143717645879657e-01 6.134007656971814e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.100000000000000e+02 -3.771580477284520e-01 6.186367484876666e-01 3.143387186517284e-01 6.133771681524017e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.110000000000000e+02 -3.771622619631373e-01 6.186743583552220e-01 3.143056769870804e-01 6.133535749290921e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.120000000000000e+02 -3.771664699325350e-01 6.187119606209157e-01 3.142726396179372e-01 6.133299860033151e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.130000000000000e+02 -3.771706717492587e-01 6.187495552079104e-01 3.142396065183666e-01 6.133064013993398e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.140000000000000e+02 -3.771748673827794e-01 6.187871421428509e-01 3.142065776961725e-01 6.132828211077864e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.150000000000000e+02 -3.771790567863147e-01 6.188247214475869e-01 3.141735531656644e-01 6.132592451307717e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.160000000000000e+02 -3.771832400041221e-01 6.188622930981388e-01 3.141405329165055e-01 6.132356734732907e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.170000000000000e+02 -3.771874170842698e-01 6.188998570745320e-01 3.141075169364527e-01 6.132121061349303e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.180000000000000e+02 -3.771915878793214e-01 6.189374134645590e-01 3.140745052645900e-01 6.131885431004732e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.190000000000000e+02 -3.771957525424013e-01 6.189749621683459e-01 3.140414978644516e-01 6.131649843979334e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.200000000000000e+02 -3.771999110322128e-01 6.190125032220206e-01 3.140084947461416e-01 6.131414300137945e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.210000000000000e+02 -3.772040632740002e-01 6.190500366707629e-01 3.139754959301388e-01 6.131178799406644e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.220000000000000e+02 -3.772082093826145e-01 6.190875624407475e-01 3.139425013891509e-01 6.130943341991169e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.230000000000000e+02 -3.772123492550814e-01 6.191250806050379e-01 3.139095111492282e-01 6.130707927681115e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.240000000000000e+02 -3.772164829532674e-01 6.191625911123649e-01 3.138765251979904e-01 6.130472556704132e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.250000000000000e+02 -3.772206105089215e-01 6.192000939581842e-01 3.138435435264893e-01 6.130237228983796e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.260000000000000e+02 -3.772247317935047e-01 6.192375892262817e-01 3.138105661679917e-01 6.130001944321599e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.270000000000000e+02 -3.772288469527634e-01 6.192750768173815e-01 3.137775930883888e-01 6.129766703025266e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.280000000000000e+02 -3.772329559402168e-01 6.193125567623408e-01 3.137446243003613e-01 6.129531505031393e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.290000000000000e+02 -3.772370586756989e-01 6.193500291209776e-01 3.137116598241255e-01 6.129296350152632e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.300000000000000e+02 -3.772411552747578e-01 6.193874938122634e-01 3.136786996332229e-01 6.129061238659146e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.310000000000000e+02 -3.772452457103284e-01 6.194249508561056e-01 3.136457437352883e-01 6.128826170504456e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.320000000000000e+02 -3.772493298957114e-01 6.194624003167455e-01 3.136127921521440e-01 6.128591145488408e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.330000000000000e+02 -3.772534079673450e-01 6.194998421013460e-01 3.135798448517932e-01 6.128356163900373e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.340000000000000e+02 -3.772574797973202e-01 6.195372762976596e-01 3.135469018667629e-01 6.128121225501389e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.350000000000000e+02 -3.772615454826897e-01 6.195747028459516e-01 3.135139631737728e-01 6.127886330444109e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.360000000000000e+02 -3.772656049981520e-01 6.196121217561600e-01 3.134810287813309e-01 6.127651478767427e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.370000000000000e+02 -3.772696582855431e-01 6.196495330666281e-01 3.134480987052909e-01 6.127416670387756e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.380000000000000e+02 -3.772737054232664e-01 6.196869367455969e-01 3.134151729246402e-01 6.127181905278108e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.390000000000000e+02 -3.772777464247981e-01 6.197243327613997e-01 3.133822514406825e-01 6.126947183696237e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.400000000000000e+02 -3.772817811534936e-01 6.197617212230588e-01 3.133493342858678e-01 6.126712505241962e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.410000000000000e+02 -3.772858097688203e-01 6.197991020198043e-01 3.133164214229183e-01 6.126477870271516e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.420000000000000e+02 -3.772898322310286e-01 6.198364751823231e-01 3.132835128622588e-01 6.126243278693057e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.430000000000000e+02 -3.772938484388813e-01 6.198738407759284e-01 3.132506086306213e-01 6.126008730359619e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.440000000000000e+02 -3.772978585079491e-01 6.199111987239551e-01 3.132177087007844e-01 6.125774225501421e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.450000000000000e+02 -3.773018624437603e-01 6.199485490286260e-01 3.131848130717808e-01 6.125539764093977e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.460000000000000e+02 -3.773058601499373e-01 6.199858917541584e-01 3.131519217688451e-01 6.125305345979056e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.470000000000000e+02 -3.773098517133904e-01 6.200232268412387e-01 3.131190347719733e-01 6.125070971350987e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.480000000000000e+02 -3.773138370708267e-01 6.200605543426455e-01 3.130861520966920e-01 6.124836640013087e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.490000000000000e+02 -3.773178162655933e-01 6.200978742152639e-01 3.130532737356918e-01 6.124602352199208e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.500000000000000e+02 -3.773217893438101e-01 6.201351864426009e-01 3.130203996767642e-01 6.124368107881701e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.510000000000000e+02 -3.773257561603262e-01 6.201724911218989e-01 3.129875299571266e-01 6.124133906807011e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.520000000000000e+02 -3.773297168465558e-01 6.202097881635666e-01 3.129546645459349e-01 6.123899749257357e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.530000000000000e+02 -3.773336714169666e-01 6.202470775550035e-01 3.129218034413179e-01 6.123665635307854e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.540000000000000e+02 -3.773376197401249e-01 6.202843593929337e-01 3.128889466758605e-01 6.123431564649232e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.550000000000000e+02 -3.773415619121558e-01 6.203216336116584e-01 3.128560942273482e-01 6.123197537495151e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.560000000000000e+02 -3.773454979684734e-01 6.203589001822024e-01 3.128232460890932e-01 6.122963553982139e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.570000000000000e+02 -3.773494277771886e-01 6.203961592125562e-01 3.127904022921983e-01 6.122729613696998e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.580000000000000e+02 -3.773533514839875e-01 6.204334105926440e-01 3.127575628037814e-01 6.122495717052161e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.590000000000000e+02 -3.773572689761608e-01 6.204706543955559e-01 3.127247276534865e-01 6.122261863877245e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.600000000000000e+02 -3.773611803246868e-01 6.205078905879560e-01 3.126918968229737e-01 6.122028054193279e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.610000000000000e+02 -3.773650855391997e-01 6.205451191627066e-01 3.126590703112279e-01 6.121794288045405e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.620000000000000e+02 -3.773689845310987e-01 6.205823401634285e-01 3.126262481439369e-01 6.121560565433423e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.630000000000000e+02 -3.773728773803351e-01 6.206195535616618e-01 3.125934302989204e-01 6.121326886293235e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.640000000000000e+02 -3.773767641169776e-01 6.206567593210953e-01 3.125606167724013e-01 6.121093250853895e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.650000000000000e+02 -3.773806446033580e-01 6.206939575448677e-01 3.125278075982678e-01 6.120859658772321e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.660000000000000e+02 -3.773845189689317e-01 6.207311481403229e-01 3.124950027466780e-01 6.120626110369251e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.670000000000000e+02 -3.773883872171551e-01 6.207683311176501e-01 3.124622022161856e-01 6.120392605554433e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.680000000000000e+02 -3.773922492238158e-01 6.208055065555409e-01 3.124294060396587e-01 6.120159144154780e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.690000000000000e+02 -3.773961051188072e-01 6.208426743654234e-01 3.123966141864725e-01 6.119925726451028e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.700000000000000e+02 -3.773999548737156e-01 6.208798345703038e-01 3.123638266643251e-01 6.119692352372700e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.710000000000000e+02 -3.774037984091728e-01 6.209169872228910e-01 3.123310434944136e-01 6.119459021793247e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.720000000000000e+02 -3.774076358519207e-01 6.209541322456448e-01 3.122982646454682e-01 6.119225734904308e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.730000000000000e+02 -3.774114670770346e-01 6.209912697155542e-01 3.122654901508917e-01 6.118992491551593e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.740000000000000e+02 -3.774152921632616e-01 6.210283995918177e-01 3.122327199906824e-01 6.118759291792460e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.750000000000000e+02 -3.774191111521972e-01 6.210655218325123e-01 3.121999541578704e-01 6.118526135858360e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.760000000000000e+02 -3.774229238877951e-01 6.211026365597929e-01 3.121671926900018e-01 6.118293023307277e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.770000000000000e+02 -3.774267305218181e-01 6.211397436637012e-01 3.121344355519552e-01 6.118059954525330e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.780000000000000e+02 -3.774305310288216e-01 6.211768431674207e-01 3.121016827503841e-01 6.117826929427131e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.790000000000000e+02 -3.774343253131294e-01 6.212139351325179e-01 3.120689343108741e-01 6.117593947874199e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.800000000000000e+02 -3.774381134775390e-01 6.212510194909504e-01 3.120361902090688e-01 6.117361010074369e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.810000000000000e+02 -3.774418955310695e-01 6.212880962425623e-01 3.120034504431130e-01 6.117128116009980e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.820000000000000e+02 -3.774456713656643e-01 6.213251654573047e-01 3.119707150416675e-01 6.116895265518012e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.830000000000000e+02 -3.774494410949439e-01 6.213622270621334e-01 3.119379839772597e-01 6.116662458806299e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.840000000000000e+02 -3.774532046263996e-01 6.213992811252274e-01 3.119052572734226e-01 6.116429695659978e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.850000000000000e+02 -3.774569620447774e-01 6.214363275885766e-01 3.118725349105504e-01 6.116196976272253e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.860000000000000e+02 -3.774607133307197e-01 6.214733664559190e-01 3.118398168960700e-01 6.115964300713640e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.870000000000000e+02 -3.774644584201083e-01 6.215103977893388e-01 3.118071032445674e-01 6.115731668701496e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.880000000000000e+02 -3.774681973758702e-01 6.215474215324710e-01 3.117743939437633e-01 6.115499080509679e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.890000000000000e+02 -3.774719302266932e-01 6.215844376762111e-01 3.117416889862790e-01 6.115266536118154e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.900000000000000e+02 -3.774756568536102e-01 6.216214462957167e-01 3.117089884038564e-01 6.115034035362367e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.910000000000000e+02 -3.774793773880638e-01 6.216584473166671e-01 3.116762921630214e-01 6.114801578383892e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.920000000000000e+02 -3.774830918003822e-01 6.216954407475992e-01 3.116436002740843e-01 6.114569165253424e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.930000000000000e+02 -3.774867999849146e-01 6.217324266655934e-01 3.116109127638914e-01 6.114336795729494e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.940000000000000e+02 -3.774905020791542e-01 6.217694049834759e-01 3.115782295987380e-01 6.114104470048238e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.950000000000000e+02 -3.774941980556230e-01 6.218063757082991e-01 3.115455507883954e-01 6.113872188284665e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.960000000000000e+02 -3.774978878317959e-01 6.218433389080454e-01 3.115128763530200e-01 6.113639950181026e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.970000000000000e+02 -3.775015715088584e-01 6.218802945202673e-01 3.114802062677893e-01 6.113407755900987e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.980000000000000e+02 -3.775052489927703e-01 6.219172425944942e-01 3.114475405596129e-01 6.113175605411119e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.990000000000000e+02 -3.775089203742098e-01 6.219541830883795e-01 3.114148792044129e-01 6.112943498731737e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.000000000000000e+02 -3.775125856315013e-01 6.219911160006732e-01 3.113822222111775e-01 6.112711435990449e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.010000000000000e+02 -3.775162446859683e-01 6.220280414011240e-01 3.113495695984867e-01 6.112479416895592e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.020000000000000e+02 -3.775198976483737e-01 6.220649592031565e-01 3.113169213417903e-01 6.112247441795909e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.030000000000000e+02 -3.775235444927731e-01 6.221018694434074e-01 3.112842774459550e-01 6.112015510480816e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.040000000000000e+02 -3.775271851285122e-01 6.221387721647444e-01 3.112516379377362e-01 6.111783622964434e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.050000000000000e+02 -3.775308196739722e-01 6.221756672994883e-01 3.112190027871039e-01 6.111551779384150e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.060000000000000e+02 -3.775344481026048e-01 6.222125548584410e-01 3.111863720029678e-01 6.111319979775430e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.070000000000000e+02 -3.775380703382640e-01 6.222494349140074e-01 3.111537456026567e-01 6.111088223810026e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.080000000000000e+02 -3.775416864924468e-01 6.222863073705063e-01 3.111211235625931e-01 6.110856511920146e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.090000000000000e+02 -3.775452964577658e-01 6.223231723127569e-01 3.110885059091831e-01 6.110624843797865e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.100000000000000e+02 -3.775489003121966e-01 6.223600296851367e-01 3.110558926246837e-01 6.110393219644936e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.110000000000000e+02 -3.775524980685340e-01 6.223968794914772e-01 3.110232837052984e-01 6.110161639389378e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.120000000000000e+02 -3.775560896260550e-01 6.224337217814738e-01 3.109906791803334e-01 6.109930103024912e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.130000000000000e+02 -3.775596750869299e-01 6.224705565006058e-01 3.109580790234094e-01 6.109698610636611e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.140000000000000e+02 -3.775632544394347e-01 6.225073836627503e-01 3.109254832378080e-01 6.109467162165582e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.150000000000000e+02 -3.775668275953177e-01 6.225442033200900e-01 3.108928918481268e-01 6.109235757527050e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.160000000000000e+02 -3.775703946704106e-01 6.225810153935439e-01 3.108603048268256e-01 6.109004396977853e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.170000000000000e+02 -3.775739556318323e-01 6.226178199200638e-01 3.108277221811673e-01 6.108773080334424e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.180000000000000e+02 -3.775775103994406e-01 6.226546169332261e-01 3.107951439356878e-01 6.108541807651749e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.190000000000000e+02 -3.775810590623883e-01 6.226914063916914e-01 3.107625700665651e-01 6.108310578948045e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.200000000000000e+02 -3.775846016541211e-01 6.227281882721813e-01 3.107300005667809e-01 6.108079394316301e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.210000000000000e+02 -3.775881380265948e-01 6.227649626739413e-01 3.106974354749189e-01 6.107848253490279e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.220000000000000e+02 -3.775916683512510e-01 6.228017294825403e-01 3.106648747490854e-01 6.107617156816647e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.230000000000000e+02 -3.775951924823944e-01 6.228384888021887e-01 3.106323184263196e-01 6.107386103971806e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.240000000000000e+02 -3.775987105200348e-01 6.228752405535927e-01 3.105997664845929e-01 6.107155095284772e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.250000000000000e+02 -3.776022224706752e-01 6.229119847535750e-01 3.105672189203673e-01 6.106924130588469e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.260000000000000e+02 -3.776057281985075e-01 6.229487214756151e-01 3.105346757718102e-01 6.106693209805680e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.270000000000000e+02 -3.776092278804931e-01 6.229854506101397e-01 3.105021369943884e-01 6.106462333213045e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.280000000000000e+02 -3.776127214438547e-01 6.230221722058261e-01 3.104696026076307e-01 6.106231500691401e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.290000000000000e+02 -3.776162088217853e-01 6.230588863200006e-01 3.104370726279291e-01 6.106000712012276e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.300000000000000e+02 -3.776196901130252e-01 6.230955928742280e-01 3.104045470335307e-01 6.105769967502591e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.310000000000000e+02 -3.776231653266194e-01 6.231322918683110e-01 3.103720258225249e-01 6.105539267144818e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.320000000000000e+02 -3.776266343304023e-01 6.231689833907450e-01 3.103395090296238e-01 6.105308610703394e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.330000000000000e+02 -3.776300972938357e-01 6.232056673349821e-01 3.103069966123282e-01 6.105077998460335e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.340000000000000e+02 -3.776335540695397e-01 6.232423437910884e-01 3.102744886104697e-01 6.104847430232064e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.350000000000000e+02 -3.776370047649307e-01 6.232790127053280e-01 3.102419849955494e-01 6.104616906074160e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.360000000000000e+02 -3.776404493526040e-01 6.233156740759869e-01 3.102094857786802e-01 6.104386426143813e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.370000000000000e+02 -3.776438877823068e-01 6.233523279535411e-01 3.101769909714849e-01 6.104155990204060e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.380000000000000e+02 -3.776473201165481e-01 6.233889742972033e-01 3.101445005592955e-01 6.103925598385810e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.390000000000000e+02 -3.776507463643596e-01 6.234256130914956e-01 3.101120145424687e-01 6.103695250816071e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.400000000000000e+02 -3.776541664262819e-01 6.234622444158618e-01 3.100795329456317e-01 6.103464947200281e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.410000000000000e+02 -3.776575804121760e-01 6.234988681865157e-01 3.100470557438413e-01 6.103234687867821e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.420000000000000e+02 -3.776609883251900e-01 6.235354844159835e-01 3.100145829353603e-01 6.103004472706703e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.430000000000000e+02 -3.776643900386921e-01 6.235720931824672e-01 3.099821145545743e-01 6.102774301553467e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.440000000000000e+02 -3.776677856722548e-01 6.236086944043333e-01 3.099496505727836e-01 6.102544174674592e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.450000000000000e+02 -3.776711752380178e-01 6.236452880880146e-01 3.099171909859905e-01 6.102314091976134e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.460000000000000e+02 -3.776745586190305e-01 6.236818742986060e-01 3.098847358271430e-01 6.102084053375865e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.470000000000000e+02 -3.776779359550075e-01 6.237184529562450e-01 3.098522850600857e-01 6.101854059035475e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.480000000000000e+02 -3.776813071109021e-01 6.237550241382898e-01 3.098198387223296e-01 6.101624108836202e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.490000000000000e+02 -3.776846721944211e-01 6.237915877907879e-01 3.097873967851982e-01 6.101394202835041e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.500000000000000e+02 -3.776880311969484e-01 6.238281439014897e-01 3.097549592547733e-01 6.101164341206267e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.510000000000000e+02 -3.776913840122555e-01 6.238646925609708e-01 3.097225261564798e-01 6.100934523578835e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.520000000000000e+02 -3.776947307753460e-01 6.239012336771368e-01 3.096900974576668e-01 6.100704750250963e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.530000000000000e+02 -3.776980714493122e-01 6.239377672678206e-01 3.096576731699166e-01 6.100475021236546e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.540000000000000e+02 -3.777014059433536e-01 6.239742934000496e-01 3.096252533167352e-01 6.100245336319436e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.550000000000000e+02 -3.777047343709241e-01 6.240108119985108e-01 3.095928378705483e-01 6.100015695733980e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.560000000000000e+02 -3.777080567339889e-01 6.240473230677928e-01 3.095604268312046e-01 6.099786099448391e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.570000000000000e+02 -3.777113729129118e-01 6.240838266770038e-01 3.095280202320866e-01 6.099556547353552e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.580000000000000e+02 -3.777146830477754e-01 6.241203227438354e-01 3.094956180371664e-01 6.099327039633485e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.590000000000000e+02 -3.777179870208303e-01 6.241568113535727e-01 3.094632202767678e-01 6.099097576017334e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.600000000000000e+02 -3.777212849189955e-01 6.241932924336070e-01 3.094308269322396e-01 6.098868156830962e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.610000000000000e+02 -3.777245767485087e-01 6.242297659943560e-01 3.093984380010552e-01 6.098638781968473e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.620000000000000e+02 -3.777278624062195e-01 6.242662321046705e-01 3.093660535108518e-01 6.098409451250274e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.630000000000000e+02 -3.777311419972376e-01 6.243026906905227e-01 3.093336734367478e-01 6.098180164935798e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.640000000000000e+02 -3.777344155212065e-01 6.243391417558891e-01 3.093012977794998e-01 6.097950923009215e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.650000000000000e+02 -3.777376828685792e-01 6.243755853761377e-01 3.092689265680564e-01 6.097721725257101e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.660000000000000e+02 -3.777409441607095e-01 6.244120214705947e-01 3.092365597727620e-01 6.097492571930598e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.670000000000000e+02 -3.777441993827438e-01 6.244484500530590e-01 3.092041973980350e-01 6.097263462984515e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.680000000000000e+02 -3.777474484292921e-01 6.244848711873585e-01 3.091718394730910e-01 6.097034398296378e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.690000000000000e+02 -3.777506914137536e-01 6.245212848069318e-01 3.091394859689640e-01 6.096805378018680e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.700000000000000e+02 -3.777539283447093e-01 6.245576909118767e-01 3.091071368838235e-01 6.096576402133005e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.710000000000000e+02 -3.777571591030367e-01 6.245940895753288e-01 3.090747922503769e-01 6.096347470488832e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.720000000000000e+02 -3.777603838226041e-01 6.246304807039068e-01 3.090424520363056e-01 6.096118583403648e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.730000000000000e+02 -3.777636023959775e-01 6.246668643868123e-01 3.090101162678034e-01 6.095889740522873e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.740000000000000e+02 -3.777668149027377e-01 6.247032405585892e-01 3.089777849276678e-01 6.095660942137695e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.750000000000000e+02 -3.777700213400828e-01 6.247396092292280e-01 3.089454580166227e-01 6.095432188185874e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.760000000000000e+02 -3.777732216053196e-01 6.247759704563751e-01 3.089131355639030e-01 6.095203478591266e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.770000000000000e+02 -3.777764158327880e-01 6.248123241701702e-01 3.088808175335524e-01 6.094974813445966e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.780000000000000e+02 -3.777796039960837e-01 6.248486703856956e-01 3.088485039338942e-01 6.094746192743270e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.790000000000000e+02 -3.777827859785748e-01 6.248850091744043e-01 3.088161947970670e-01 6.094517616337090e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.800000000000000e+02 -3.777859619370657e-01 6.249213404359494e-01 3.087838900836620e-01 6.094289084510377e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.810000000000000e+02 -3.777891318101504e-01 6.249576642113126e-01 3.087515898105598e-01 6.094060597164463e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.820000000000000e+02 -3.777922955365521e-01 6.249939805475162e-01 3.087192939939321e-01 6.093832154141444e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.830000000000000e+02 -3.777954532256825e-01 6.250302893699236e-01 3.086870026072404e-01 6.093603755689309e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.840000000000000e+02 -3.777986047848989e-01 6.250665907468123e-01 3.086547156746178e-01 6.093375401586232e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.850000000000000e+02 -3.778017502622305e-01 6.251028846341073e-01 3.086224331868124e-01 6.093147092059773e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.860000000000000e+02 -3.778048896941789e-01 6.251391710216971e-01 3.085901551335933e-01 6.092918827065559e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.870000000000000e+02 -3.778080229779701e-01 6.251754499738296e-01 3.085578815433094e-01 6.092690606464457e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.880000000000000e+02 -3.778111501951841e-01 6.252117214411262e-01 3.085256123955794e-01 6.092462430386818e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.890000000000000e+02 -3.778142713678093e-01 6.252479854080544e-01 3.084933476861217e-01 6.092234298903730e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.900000000000000e+02 -3.778173863821542e-01 6.252842419549779e-01 3.084610874447835e-01 6.092006211770703e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.910000000000000e+02 -3.778204953516758e-01 6.253204910043768e-01 3.084288316440340e-01 6.091778169245461e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.920000000000000e+02 -3.778235982647186e-01 6.253567325635179e-01 3.083965802881425e-01 6.091550171330452e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.930000000000000e+02 -3.778266950124343e-01 6.253929667073057e-01 3.083643334060702e-01 6.091322217811547e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.940000000000000e+02 -3.778297857357890e-01 6.254291933482895e-01 3.083320909619658e-01 6.091094308920012e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.950000000000000e+02 -3.778328703949433e-01 6.254654125084788e-01 3.082998529679217e-01 6.090866444642129e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.960000000000000e+02 -3.778359489164498e-01 6.255016242431441e-01 3.082676194432558e-01 6.090638624794469e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.970000000000000e+02 -3.778390213917552e-01 6.255378284832802e-01 3.082353903668749e-01 6.090410849651469e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.980000000000000e+02 -3.778420877581279e-01 6.255740252834289e-01 3.082031657544004e-01 6.090183118989384e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.990000000000000e+02 -3.778451480570883e-01 6.256102146169961e-01 3.081709455962405e-01 6.089955432898603e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.000000000000000e+02 -3.778482023065744e-01 6.256463964581243e-01 3.081387298910758e-01 6.089727791566453e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.010000000000000e+02 -3.778512504057728e-01 6.256825709002308e-01 3.081065186623024e-01 6.089500194566611e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.020000000000000e+02 -3.778542924745475e-01 6.257187378418465e-01 3.080743118835920e-01 6.089272642357353e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.030000000000000e+02 -3.778573284942449e-01 6.257548973058692e-01 3.080421095593796e-01 6.089045134823033e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.040000000000000e+02 -3.778603583554253e-01 6.257910493719617e-01 3.080099117182014e-01 6.088817671706014e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.050000000000000e+02 -3.778633821929314e-01 6.258271939437466e-01 3.079777183276113e-01 6.088590253350389e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.060000000000000e+02 -3.778663999712652e-01 6.258633310468259e-01 3.079455293976451e-01 6.088362879688850e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.070000000000000e+02 -3.778694116312874e-01 6.258994607333042e-01 3.079133449430425e-01 6.088135550504529e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.080000000000000e+02 -3.778724172445708e-01 6.259355829345792e-01 3.078811649496624e-01 6.087908266156220e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.090000000000000e+02 -3.778754167380955e-01 6.259716977208710e-01 3.078489894344981e-01 6.087681026315518e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.100000000000000e+02 -3.778784101861377e-01 6.260078050346726e-01 3.078168183808548e-01 6.087453831223335e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.110000000000000e+02 -3.778813976065898e-01 6.260439048719291e-01 3.077846517841601e-01 6.087226680859691e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.120000000000000e+02 -3.778843788577124e-01 6.260799973254900e-01 3.077524896825578e-01 6.086999574982922e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.130000000000000e+02 -3.778873540981103e-01 6.261160822828681e-01 3.077203320374554e-01 6.086772513986705e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.140000000000000e+02 -3.778903232941041e-01 6.261521597771392e-01 3.076881788571384e-01 6.086545497724296e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.150000000000000e+02 -3.778932863345133e-01 6.261882298891477e-01 3.076560301706627e-01 6.086318525933602e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.160000000000000e+02 -3.778962433671275e-01 6.262242925093814e-01 3.076238859428190e-01 6.086091599027877e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.170000000000000e+02 -3.778991943428101e-01 6.262603476770390e-01 3.075917461865040e-01 6.085864716869959e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.180000000000000e+02 -3.779021391898679e-01 6.262963954440248e-01 3.075596109210103e-01 6.085637879299592e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.190000000000000e+02 -3.779050779849140e-01 6.263324357534221e-01 3.075274801286748e-01 6.085411086542214e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.200000000000000e+02 -3.779080107647632e-01 6.263684685861705e-01 3.074953538003918e-01 6.085184338637631e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.210000000000000e+02 -3.779109374046160e-01 6.264044940323455e-01 3.074632319687426e-01 6.084957635295259e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.220000000000000e+02 -3.779138580371958e-01 6.264405119971330e-01 3.074311146015755e-01 6.084730976855468e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.230000000000000e+02 -3.779167725461327e-01 6.264765225670716e-01 3.073990017290004e-01 6.084504363024141e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.240000000000000e+02 -3.779196810182407e-01 6.265125256739775e-01 3.073668933313622e-01 6.084277794089549e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.250000000000000e+02 -3.779225834626792e-01 6.265485213175332e-01 3.073347894066317e-01 6.084051270034535e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.260000000000000e+02 -3.779254797583937e-01 6.265845095918036e-01 3.073026899854981e-01 6.083824790513480e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.270000000000000e+02 -3.779283700431043e-01 6.266204903919228e-01 3.072705950355517e-01 6.083598355940723e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.280000000000000e+02 -3.779312542858879e-01 6.266564637469159e-01 3.072385045647220e-01 6.083371966195552e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.290000000000000e+02 -3.779341324044655e-01 6.266924297071629e-01 3.072064185963629e-01 6.083145621178346e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.300000000000000e+02 -3.779370044872846e-01 6.267283882207730e-01 3.071743371077670e-01 6.082919321014986e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.310000000000000e+02 -3.779398705564209e-01 6.267643392721446e-01 3.071422600945561e-01 6.082693065777330e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.320000000000000e+02 -3.779427304887010e-01 6.268002829502534e-01 3.071101875889799e-01 6.082466855177173e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.330000000000000e+02 -3.779455844143404e-01 6.268362191576295e-01 3.070781195600824e-01 6.082240689592239e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.340000000000000e+02 -3.779484322326480e-01 6.268721479723594e-01 3.070460560336979e-01 6.082014568739171e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.350000000000000e+02 -3.779512740132498e-01 6.269080693422584e-01 3.070139969938748e-01 6.081788492829792e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.360000000000000e+02 -3.779541097745927e-01 6.269439832628821e-01 3.069819424358613e-01 6.081562461845407e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.370000000000000e+02 -3.779569393967777e-01 6.269798898209877e-01 3.069498923911037e-01 6.081336475504150e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.380000000000000e+02 -3.779597630115931e-01 6.270157889135534e-01 3.069178468289424e-01 6.081110534229915e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.390000000000000e+02 -3.779625806086219e-01 6.270516805665703e-01 3.068858057504225e-01 6.080884637840327e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.400000000000000e+02 -3.779653920601973e-01 6.270875648568432e-01 3.068537691912858e-01 6.080658786182603e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.410000000000000e+02 -3.779681974990540e-01 6.271234416937528e-01 3.068217371186556e-01 6.080432979558190e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.420000000000000e+02 -3.779709969214048e-01 6.271593110879236e-01 3.067897095334947e-01 6.080207217902319e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.430000000000000e+02 -3.779737902169809e-01 6.271951731130642e-01 3.067576864657868e-01 6.079981501014959e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.440000000000000e+02 -3.779765774777199e-01 6.272310277083838e-01 3.067256678928155e-01 6.079755829092320e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.450000000000000e+02 -3.779793587445092e-01 6.272668748498716e-01 3.066936538046794e-01 6.079530202203954e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.460000000000000e+02 -3.779821338802483e-01 6.273027146229071e-01 3.066616442392727e-01 6.079304620156251e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.470000000000000e+02 -3.779849030156295e-01 6.273385469492534e-01 3.066296391624717e-01 6.079079083142092e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.480000000000000e+02 -3.779876660495400e-01 6.273743719007612e-01 3.065976386012793e-01 6.078853590938560e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.490000000000000e+02 -3.779904230731820e-01 6.274101894149607e-01 3.065656425334586e-01 6.078628143761452e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.500000000000000e+02 -3.779931740624178e-01 6.274459995032290e-01 3.065336509671738e-01 6.078402741628328e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.510000000000000e+02 -3.779959189300890e-01 6.274818022236115e-01 3.065016639264997e-01 6.078177384386650e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.520000000000000e+02 -3.779986578036922e-01 6.275175975085897e-01 3.064696813768872e-01 6.077952072140780e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.530000000000000e+02 -3.780013906509406e-01 6.275533853663730e-01 3.064377033299068e-01 6.077726804974469e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.540000000000000e+02 -3.780041173759640e-01 6.275891658652595e-01 3.064057298112484e-01 6.077501582675257e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.550000000000000e+02 -3.780068380929877e-01 6.276249389358596e-01 3.063737607913919e-01 6.077276405424056e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.560000000000000e+02 -3.780095527993607e-01 6.276607045749839e-01 3.063417962729547e-01 6.077051273283136e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.570000000000000e+02 -3.780122613779867e-01 6.276964628653208e-01 3.063098362871310e-01 6.076826185995586e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.580000000000000e+02 -3.780149639988275e-01 6.277322136954789e-01 3.062778807905183e-01 6.076601143899507e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.590000000000000e+02 -3.780176604891141e-01 6.277679571750304e-01 3.062459298303438e-01 6.076376146725732e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.600000000000000e+02 -3.780203509878223e-01 6.278036932264894e-01 3.062139833693464e-01 6.076151194623955e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.610000000000000e+02 -3.780230354530654e-01 6.278394218645789e-01 3.061820414215956e-01 6.075926287657760e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.620000000000000e+02 -3.780257138108243e-01 6.278751431449557e-01 3.061501040068479e-01 6.075701425638973e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.630000000000000e+02 -3.780283861777587e-01 6.279108569965712e-01 3.061181710948891e-01 6.075476608754172e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.640000000000000e+02 -3.780310525237740e-01 6.279465634413590e-01 3.060862426944675e-01 6.075251836945843e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.650000000000000e+02 -3.780337127501508e-01 6.279822625386905e-01 3.060543188336995e-01 6.075027110098883e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.660000000000000e+02 -3.780363669898694e-01 6.280179542042774e-01 3.060223994784451e-01 6.074802428455018e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.670000000000000e+02 -3.780390152163753e-01 6.280536384619962e-01 3.059904846358895e-01 6.074577791922456e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.680000000000000e+02 -3.780416573267259e-01 6.280893153740834e-01 3.059585743352609e-01 6.074353200377075e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.690000000000000e+02 -3.780442934305563e-01 6.281249848677340e-01 3.059266685490971e-01 6.074128654053611e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.700000000000000e+02 -3.780469235375296e-01 6.281606469444391e-01 3.058947672748701e-01 6.073904152915210e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.710000000000000e+02 -3.780495475391429e-01 6.281963016854053e-01 3.058628705409938e-01 6.073679696680194e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.720000000000000e+02 -3.780521655534229e-01 6.282319489905571e-01 3.058309783209585e-01 6.073455285808392e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.730000000000000e+02 -3.780547774889118e-01 6.282675889447434e-01 3.057990906364906e-01 6.073230919907984e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.740000000000000e+02 -3.780573833956917e-01 6.283032215003372e-01 3.057672074778232e-01 6.073006599234970e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.750000000000000e+02 -3.780599833224646e-01 6.283388466432104e-01 3.057353288306630e-01 6.072782323730238e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.760000000000000e+02 -3.780625771333477e-01 6.283744644470852e-01 3.057034547344673e-01 6.072558093304187e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.770000000000000e+02 -3.780651649458336e-01 6.284100748425069e-01 3.056715851583727e-01 6.072333908125296e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.780000000000000e+02 -3.780677467553260e-01 6.284456778384585e-01 3.056397201038747e-01 6.072109768147609e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.790000000000000e+02 -3.780703224694118e-01 6.284812734922155e-01 3.056078595972077e-01 6.071885673247575e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.800000000000000e+02 -3.780728921772750e-01 6.285168617470015e-01 3.055760036158180e-01 6.071661623596929e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.810000000000000e+02 -3.780754558962620e-01 6.285524425904097e-01 3.055441521564701e-01 6.071437619258286e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.820000000000000e+02 -3.780780135098277e-01 6.285880161112720e-01 3.055123052494167e-01 6.071213659911379e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.830000000000000e+02 -3.780805651381845e-01 6.286235822145430e-01 3.054804628665190e-01 6.070989745959089e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.840000000000000e+02 -3.780831107149485e-01 6.286591409593808e-01 3.054486250243371e-01 6.070765877144856e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.850000000000000e+02 -3.780856502572387e-01 6.286946923313619e-01 3.054167917200193e-01 6.070542053551607e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.860000000000000e+02 -3.780881838089181e-01 6.287302363066076e-01 3.053849629424462e-01 6.070318275235262e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.870000000000000e+02 -3.780907112730633e-01 6.287657729454549e-01 3.053531387190708e-01 6.070094542062303e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.880000000000000e+02 -3.780932327569197e-01 6.288013021723661e-01 3.053213190235589e-01 6.069870854305491e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.890000000000000e+02 -3.780957482143456e-01 6.288368240310019e-01 3.052895038672566e-01 6.069647211768748e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.900000000000000e+02 -3.780982575821865e-01 6.288723385609720e-01 3.052576932685119e-01 6.069423614368633e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.910000000000000e+02 -3.781007609794052e-01 6.289078456809604e-01 3.052258871975897e-01 6.069200062381966e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.920000000000000e+02 -3.781032583698088e-01 6.289433454235401e-01 3.051940856638968e-01 6.068976555675241e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.930000000000000e+02 -3.781057496702708e-01 6.289788378396971e-01 3.051622886913247e-01 6.068753094143632e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.940000000000000e+02 -3.781082349648428e-01 6.290143228739563e-01 3.051304962589004e-01 6.068529677969672e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.950000000000000e+02 -3.781107142952837e-01 6.290498005038595e-01 3.050987083560208e-01 6.068306307205105e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.960000000000000e+02 -3.781131875092004e-01 6.290852708317032e-01 3.050669250240203e-01 6.068082981557056e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.970000000000000e+02 -3.781156547726054e-01 6.291207337465636e-01 3.050351462204146e-01 6.067859701380379e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.980000000000000e+02 -3.781181159700289e-01 6.291561893300358e-01 3.050033719762599e-01 6.067636466418330e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.990000000000000e+02 -3.781205711520504e-01 6.291916375450034e-01 3.049716022799467e-01 6.067413276824699e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.000000000000000e+02 -3.781230203522014e-01 6.292270783680800e-01 3.049398371239835e-01 6.067190132696496e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.010000000000000e+02 -3.781254634686413e-01 6.292625118846300e-01 3.049080765339405e-01 6.066967033680369e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.020000000000000e+02 -3.781279005962292e-01 6.292979380144968e-01 3.048763204885721e-01 6.066743980148993e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.030000000000000e+02 -3.781303317368199e-01 6.293333567622797e-01 3.048445689876854e-01 6.066520972069872e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.040000000000000e+02 -3.781327567925521e-01 6.293687681976352e-01 3.048128220577788e-01 6.066298009222997e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.050000000000000e+02 -3.781351758458176e-01 6.294041722705433e-01 3.047810796776001e-01 6.066075091746238e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.060000000000000e+02 -3.781375889498285e-01 6.294395689399318e-01 3.047493418351412e-01 6.065852219820161e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.070000000000000e+02 -3.781399959415057e-01 6.294749583218543e-01 3.047176085736599e-01 6.065629393065550e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.080000000000000e+02 -3.781423969883299e-01 6.295103402957083e-01 3.046858798514689e-01 6.065406611925025e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.090000000000000e+02 -3.781447919540598e-01 6.295457149658514e-01 3.046541557038405e-01 6.065183876013456e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.100000000000000e+02 -3.781471809442665e-01 6.295810822557014e-01 3.046224361050478e-01 6.064961185622462e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.110000000000000e+02 -3.781495639415509e-01 6.296164421872460e-01 3.045907210592875e-01 6.064738540636955e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.120000000000000e+02 -3.781519408593090e-01 6.296517948116702e-01 3.045590105917816e-01 6.064515940964581e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.130000000000000e+02 -3.781543117979546e-01 6.296871400623911e-01 3.045273046771577e-01 6.064293386823626e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.140000000000000e+02 -3.781566767586736e-01 6.297224779401217e-01 3.044956033160428e-01 6.064070878221892e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.150000000000000e+02 -3.781590356310875e-01 6.297578085186751e-01 3.044639065389329e-01 6.063848414953771e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.160000000000000e+02 -3.781613885417261e-01 6.297931317289237e-01 3.044322143113096e-01 6.063625997147095e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.170000000000000e+02 -3.781637354613565e-01 6.298284475770404e-01 3.044005266440543e-01 6.063403624891146e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.180000000000000e+02 -3.781660763110032e-01 6.298637561220419e-01 3.043688435584667e-01 6.063181297984211e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.190000000000000e+02 -3.781684111691219e-01 6.298990573165671e-01 3.043371650342486e-01 6.062959016556507e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.200000000000000e+02 -3.781707400617745e-01 6.299343511292881e-01 3.043054910677699e-01 6.062736780814882e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.210000000000000e+02 -3.781730628787409e-01 6.299696376555807e-01 3.042738216862713e-01 6.062514590344832e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.220000000000000e+02 -3.781753797410576e-01 6.300049168084989e-01 3.042421568597840e-01 6.062292445470854e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.230000000000000e+02 -3.781776905373288e-01 6.300401886517171e-01 3.042104966207475e-01 6.062070346089027e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.240000000000000e+02 -3.781799953628396e-01 6.300754531394549e-01 3.041788409424608e-01 6.061848292240365e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.250000000000000e+02 -3.781822942097738e-01 6.301107102698627e-01 3.041471898292135e-01 6.061626283997009e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.260000000000000e+02 -3.781845869858758e-01 6.301459601196282e-01 3.041155433045333e-01 6.061404321044943e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.270000000000000e+02 -3.781868737836722e-01 6.301812026036810e-01 3.040839013486054e-01 6.061182403816296e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.280000000000000e+02 -3.781891546166950e-01 6.302164377316859e-01 3.040522639562011e-01 6.060960532178066e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.290000000000000e+02 -3.781914293730822e-01 6.302516655784665e-01 3.040206311583001e-01 6.060738705920449e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.300000000000000e+02 -3.781936981478335e-01 6.302868860746036e-01 3.039890029318170e-01 6.060516925313922e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.310000000000000e+02 -3.781959609743457e-01 6.303220992032889e-01 3.039573792682405e-01 6.060295190393232e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.320000000000000e+02 -3.781982177180236e-01 6.303573050612649e-01 3.039257602035803e-01 6.060073500837145e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.330000000000000e+02 -3.782004685247249e-01 6.303925035447456e-01 3.038941457012410e-01 6.059851857024060e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.340000000000000e+02 -3.782027132679442e-01 6.304276947471521e-01 3.038625357947888e-01 6.059630258628966e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.350000000000000e+02 -3.782049520440398e-01 6.304628785938100e-01 3.038309304613984e-01 6.059408705967385e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.360000000000000e+02 -3.782071848476727e-01 6.304980550985140e-01 3.037993297021057e-01 6.059187198949549e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.370000000000000e+02 -3.782094115826556e-01 6.305332243254600e-01 3.037677335438125e-01 6.058965737398555e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.380000000000000e+02 -3.782116323542966e-01 6.305683862047274e-01 3.037361419596876e-01 6.058744321544759e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.390000000000000e+02 -3.782138471598537e-01 6.306035407396875e-01 3.037045549513827e-01 6.058522951387530e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.400000000000000e+02 -3.782160559048111e-01 6.306386879955683e-01 3.036729725450493e-01 6.058301626732452e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.410000000000000e+02 -3.782182586734688e-01 6.306738279166977e-01 3.036413947193796e-01 6.058080347765111e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.420000000000000e+02 -3.782204554847197e-01 6.307089604896057e-01 3.036098214706403e-01 6.057859114552089e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.430000000000000e+02 -3.782226462342774e-01 6.307440857883136e-01 3.035782528272539e-01 6.057637926856945e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.440000000000000e+02 -3.782248310143895e-01 6.307792037560852e-01 3.035466887651453e-01 6.057416784840645e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.450000000000000e+02 -3.782270098368258e-01 6.308143143842818e-01 3.035151292824583e-01 6.057195688554521e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.460000000000000e+02 -3.782291825965264e-01 6.308494177344629e-01 3.034835744097905e-01 6.056974637885733e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.470000000000000e+02 -3.782313494247022e-01 6.308845137344131e-01 3.034520241110290e-01 6.056753632973538e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.480000000000000e+02 -3.782335102037142e-01 6.309196024563902e-01 3.034204784197809e-01 6.056532673657086e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.490000000000000e+02 -3.782356650109730e-01 6.309546838515564e-01 3.033889373161877e-01 6.056311760086693e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.500000000000000e+02 -3.782378138617741e-01 6.309897579110428e-01 3.033574007971306e-01 6.056090892300402e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.510000000000000e+02 -3.782399566471187e-01 6.310248247077412e-01 3.033258688929799e-01 6.055870070092894e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.520000000000000e+02 -3.782420934845418e-01 6.310598841677557e-01 3.032943415729198e-01 6.055649293679902e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.530000000000000e+02 -3.782442243625639e-01 6.310949363003805e-01 3.032628188409115e-01 6.055428563041972e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.540000000000000e+02 -3.782463491701026e-01 6.311299811755942e-01 3.032313007285483e-01 6.055207878010925e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.550000000000000e+02 -3.782484680292642e-01 6.311650187185606e-01 3.031997872034556e-01 6.054987238791616e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.560000000000000e+02 -3.782505809432854e-01 6.312000489307535e-01 3.031682782653725e-01 6.054766645375287e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.570000000000000e+02 -3.782526877817535e-01 6.312350718887769e-01 3.031367739520086e-01 6.054546097614740e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.580000000000000e+02 -3.782547887058196e-01 6.312700875044145e-01 3.031052742185721e-01 6.054325595672644e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.590000000000000e+02 -3.782568835870603e-01 6.313050958464314e-01 3.030737791032321e-01 6.054105139468745e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.600000000000000e+02 -3.782589725069447e-01 6.313400968718812e-01 3.030422885836949e-01 6.053884729078930e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.610000000000000e+02 -3.782610554617313e-01 6.313750905761557e-01 3.030108026631769e-01 6.053664364584029e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.620000000000000e+02 -3.782631323774009e-01 6.314100770278869e-01 3.029793213599146e-01 6.053444045664920e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.630000000000000e+02 -3.782652033339085e-01 6.314450561570332e-01 3.029478446562284e-01 6.053223772666462e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.640000000000000e+02 -3.782672683401898e-01 6.314800279676891e-01 3.029163725493663e-01 6.053003545529367e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.650000000000000e+02 -3.782693272961495e-01 6.315149925267107e-01 3.028849050674279e-01 6.052783364066506e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.660000000000000e+02 -3.782713802963023e-01 6.315499497736435e-01 3.028534421859238e-01 6.052563228465903e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.670000000000000e+02 -3.782734273581052e-01 6.315848996916609e-01 3.028219839021143e-01 6.052343138833213e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.680000000000000e+02 -3.782754683644622e-01 6.316198423678036e-01 3.027905302473287e-01 6.052123094860672e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.690000000000000e+02 -3.782775034189733e-01 6.316547777354515e-01 3.027590811946468e-01 6.051903096756091e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.700000000000000e+02 -3.782795325271431e-01 6.316897057793995e-01 3.027276367454764e-01 6.051683144662159e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.710000000000000e+02 -3.782815555823671e-01 6.317246265838957e-01 3.026961969277305e-01 6.051463238251644e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.720000000000000e+02 -3.782835727197201e-01 6.317595400589315e-01 3.026647617063293e-01 6.051243377820650e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.730000000000000e+02 -3.782855838421276e-01 6.317944462736401e-01 3.026333311079603e-01 6.051023563146195e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.740000000000000e+02 -3.782875889766495e-01 6.318293452025173e-01 3.026019051276538e-01 6.050803794375638e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.750000000000000e+02 -3.782895881925017e-01 6.318642368044284e-01 3.025704837472619e-01 6.050584071621951e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.760000000000000e+02 -3.782915813517779e-01 6.318991211740487e-01 3.025390670046846e-01 6.050364394594522e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.770000000000000e+02 -3.782935685803929e-01 6.319339982274506e-01 3.025076548673306e-01 6.050144763570937e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.780000000000000e+02 -3.782955498406086e-01 6.319688679917387e-01 3.024762473461631e-01 6.049925178474647e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.790000000000000e+02 -3.782975250750212e-01 6.320037305048098e-01 3.024448444579969e-01 6.049705639210022e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.800000000000000e+02 -3.782994943608888e-01 6.320385857200691e-01 3.024134461825241e-01 6.049486145907605e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.810000000000000e+02 -3.783014577126236e-01 6.320734336313986e-01 3.023820525164941e-01 6.049266698582815e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.820000000000000e+02 -3.783034150100599e-01 6.321082743084731e-01 3.023506634950831e-01 6.049047297108643e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.830000000000000e+02 -3.783053664064082e-01 6.321431076619366e-01 3.023192790763269e-01 6.048827941695752e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.840000000000000e+02 -3.783073117631529e-01 6.321779337803979e-01 3.022878992993284e-01 6.048608632114353e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.850000000000000e+02 -3.783092511883561e-01 6.322127526006798e-01 3.022565241348888e-01 6.048389368520122e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.860000000000000e+02 -3.783111846561095e-01 6.322475641310554e-01 3.022251535924590e-01 6.048170150966757e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.870000000000000e+02 -3.783131120836335e-01 6.322823684331230e-01 3.021937876946750e-01 6.047950979240345e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.880000000000000e+02 -3.783150335929277e-01 6.323171654234419e-01 3.021624264102227e-01 6.047731853631845e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.890000000000000e+02 -3.783169491577005e-01 6.323519551278307e-01 3.021310697460543e-01 6.047512774026401e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.900000000000000e+02 -3.783188586613731e-01 6.323867376178576e-01 3.020997177357977e-01 6.047293740262253e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.910000000000000e+02 -3.783207622639033e-01 6.324215127929669e-01 3.020683703366769e-01 6.047074752629232e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.920000000000000e+02 -3.783226599184712e-01 6.324562806864231e-01 3.020370275621066e-01 6.046855811030691e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.930000000000000e+02 -3.783245515306202e-01 6.324910413569468e-01 3.020056894394989e-01 6.046636915331804e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.940000000000000e+02 -3.783264372022694e-01 6.325257947433595e-01 3.019743559415584e-01 6.046418065696417e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.950000000000000e+02 -3.783283169529744e-01 6.325605408317279e-01 3.019430270642926e-01 6.046199262193180e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.960000000000000e+02 -3.783301906735459e-01 6.325952796994097e-01 3.019117028377634e-01 6.045980504571166e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.970000000000000e+02 -3.783320584767290e-01 6.326300112672077e-01 3.018803832332931e-01 6.045761793121969e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.980000000000000e+02 -3.783339202529192e-01 6.326647356127622e-01 3.018490682810677e-01 6.045543127593608e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.990000000000000e+02 -3.783357761146463e-01 6.326994526633694e-01 3.018177579515671e-01 6.045324508215340e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.000000000000000e+02 -3.783376260232013e-01 6.327341624381539e-01 3.017864522573612e-01 6.045105934991806e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.010000000000000e+02 -3.783394699001277e-01 6.327688650044172e-01 3.017551512186939e-01 6.044887407633788e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.020000000000000e+02 -3.783413078637208e-01 6.328035602747447e-01 3.017238548061077e-01 6.044668926488197e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.030000000000000e+02 -3.783431398906354e-01 6.328382482664725e-01 3.016925630267602e-01 6.044450491509231e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.040000000000000e+02 -3.783449658765787e-01 6.328729290557966e-01 3.016612759091318e-01 6.044232102435030e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.050000000000000e+02 -3.783467859401575e-01 6.329076025615675e-01 3.016299934226830e-01 6.044013759550469e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.060000000000000e+02 -3.783486000708079e-01 6.329422687924466e-01 3.015987155711507e-01 6.043795462837588e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.070000000000000e+02 -3.783504081916789e-01 6.329769278016917e-01 3.015674423763260e-01 6.043577212136232e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.080000000000000e+02 -3.783522104033203e-01 6.330115795226914e-01 3.015361738120660e-01 6.043359007670227e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.090000000000000e+02 -3.783540066033456e-01 6.330462240303482e-01 3.015049099063664e-01 6.043140849181555e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.100000000000000e+02 -3.783557968614935e-01 6.330808612680371e-01 3.014736506430599e-01 6.042922736932608e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.110000000000000e+02 -3.783575812001062e-01 6.331154912264071e-01 3.014423960164054e-01 6.042704670935352e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.120000000000000e+02 -3.783593595058726e-01 6.331501139942488e-01 3.014111460563747e-01 6.042486650844656e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.130000000000000e+02 -3.783611318938977e-01 6.331847294798341e-01 3.013799007352587e-01 6.042268677064299e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.140000000000000e+02 -3.783628983644961e-01 6.332193376930739e-01 3.013486600525727e-01 6.042050749516109e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.150000000000000e+02 -3.783646587999570e-01 6.332539387127966e-01 3.013174240414443e-01 6.041832867971029e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.160000000000000e+02 -3.783664133235289e-01 6.332885324568531e-01 3.012861926696759e-01 6.041615032703960e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.170000000000000e+02 -3.783681619134762e-01 6.333231189414851e-01 3.012549659440084e-01 6.041397243672373e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.180000000000000e+02 -3.783699044940820e-01 6.333576982234965e-01 3.012237438853273e-01 6.041179500676011e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.190000000000000e+02 -3.783716411466622e-01 6.333922702340889e-01 3.011925264749618e-01 6.040961804045096e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.200000000000000e+02 -3.783733718808435e-01 6.334268349876397e-01 3.011613137082932e-01 6.040744153616815e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.210000000000000e+02 -3.783750965838506e-01 6.334613925531558e-01 3.011301056181418e-01 6.040526549235465e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.220000000000000e+02 -3.783768154226431e-01 6.334959428189483e-01 3.010989021604055e-01 6.040308991271469e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.230000000000000e+02 -3.783785282166917e-01 6.335304858978511e-01 3.010677033864710e-01 6.040091479441341e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.240000000000000e+02 -3.783802351125233e-01 6.335650217156428e-01 3.010365092542282e-01 6.039874013840668e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.250000000000000e+02 -3.783819360913530e-01 6.335995502714586e-01 3.010053197719106e-01 6.039656594580312e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.260000000000000e+02 -3.783836310321147e-01 6.336340716464088e-01 3.009741349736284e-01 6.039439221422982e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.270000000000000e+02 -3.783853200823512e-01 6.336685857504771e-01 3.009429548192477e-01 6.039221894613803e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.280000000000000e+02 -3.783870031997800e-01 6.337030926052191e-01 3.009117793223582e-01 6.039004614148951e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.290000000000000e+02 -3.783886803132677e-01 6.337375922686423e-01 3.008806085020082e-01 6.038787379795625e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.300000000000000e+02 -3.783903514908323e-01 6.337720846917576e-01 3.008494423414226e-01 6.038570191750386e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.310000000000000e+02 -3.783920167724634e-01 6.338065698402852e-01 3.008182808320216e-01 6.038353050190314e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.320000000000000e+02 -3.783936760355179e-01 6.338410478201305e-01 3.007871240047972e-01 6.038135954643034e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.330000000000000e+02 -3.783953294223791e-01 6.338755185147071e-01 3.007559718254157e-01 6.037918905636198e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.340000000000000e+02 -3.783969767904332e-01 6.339099820326923e-01 3.007248243318983e-01 6.037701902758377e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.350000000000000e+02 -3.783986182447394e-01 6.339444382977986e-01 3.006936814977788e-01 6.037484946308960e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.360000000000000e+02 -3.784002538000699e-01 6.339788873144238e-01 3.006625433180103e-01 6.037268036199432e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.370000000000000e+02 -3.784018833067446e-01 6.340133291723212e-01 3.006314098361351e-01 6.037051172233646e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.380000000000000e+02 -3.784035069573091e-01 6.340477637466053e-01 3.006002810004129e-01 6.036834354798977e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.390000000000000e+02 -3.784051246648816e-01 6.340821910977291e-01 3.005691568352004e-01 6.036617583708904e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.400000000000000e+02 -3.784067363616848e-01 6.341166112727959e-01 3.005380373599887e-01 6.036400858821509e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.410000000000000e+02 -3.784083421635541e-01 6.341510241925138e-01 3.005069225447047e-01 6.036184180418350e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.420000000000000e+02 -3.784099420559441e-01 6.341854298768619e-01 3.004758123928686e-01 6.035967548388266e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.430000000000000e+02 -3.784115359328242e-01 6.342198283881297e-01 3.004447069359504e-01 6.035750962609899e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.440000000000000e+02 -3.784131238996005e-01 6.342542196605687e-01 3.004136061456984e-01 6.035534423278903e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.450000000000000e+02 -3.784147059675099e-01 6.342886036815691e-01 3.003825100209432e-01 6.035317930488222e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.460000000000000e+02 -3.784162820266139e-01 6.343229805440951e-01 3.003514185899943e-01 6.035101483834284e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.470000000000000e+02 -3.784178522152270e-01 6.343573501407879e-01 3.003203318185115e-01 6.034885083774104e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.480000000000000e+02 -3.784194163718705e-01 6.343917125823526e-01 3.002892497513727e-01 6.034668729958259e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.490000000000000e+02 -3.784209746777486e-01 6.344260677602082e-01 3.002581723384669e-01 6.034452422666253e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.500000000000000e+02 -3.784225270404782e-01 6.344604157256124e-01 3.002270996076516e-01 6.034236161824951e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.510000000000000e+02 -3.784240734058951e-01 6.344947565207394e-01 3.001960315741223e-01 6.034019947279973e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.520000000000000e+02 -3.784256138815692e-01 6.345290900740558e-01 3.001649682096345e-01 6.033803779274377e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.530000000000000e+02 -3.784271484443800e-01 6.345634164070458e-01 3.001339095206905e-01 6.033587657719902e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.540000000000000e+02 -3.784286770027587e-01 6.345977355678806e-01 3.001028555355620e-01 6.033371582568587e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.550000000000000e+02 -3.784301996565193e-01 6.346320475118353e-01 3.000718062248300e-01 6.033155553836076e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.560000000000000e+02 -3.784317164222294e-01 6.346663522097533e-01 3.000407615878223e-01 6.032939571753476e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.570000000000000e+02 -3.784332271901540e-01 6.347006497544561e-01 3.000097216528639e-01 6.032723635916765e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.580000000000000e+02 -3.784347320680636e-01 6.347349400614700e-01 2.999786863934774e-01 6.032507746695223e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.590000000000000e+02 -3.784362309729604e-01 6.347692231903870e-01 2.999476558330250e-01 6.032291903891307e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.600000000000000e+02 -3.784377239588318e-01 6.348034991103481e-01 2.999166299570980e-01 6.032076107587625e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.610000000000000e+02 -3.784392110684076e-01 6.348377677895186e-01 2.998856087556351e-01 6.031860357926108e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.620000000000000e+02 -3.784406921492220e-01 6.348720293389537e-01 2.998545922702260e-01 6.031644654512673e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.630000000000000e+02 -3.784421673596623e-01 6.349062836440010e-01 2.998235804600546e-01 6.031428997788151e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.640000000000000e+02 -3.784436366746347e-01 6.349405307317881e-01 2.997925733315160e-01 6.031213387617620e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.650000000000000e+02 -3.784450999731642e-01 6.349747706790712e-01 2.997615709196289e-01 6.030997823802950e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.660000000000000e+02 -3.784465574002477e-01 6.350090033889008e-01 2.997305731858794e-01 6.030782306671335e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.670000000000000e+02 -3.784480089144633e-01 6.350432288994872e-01 2.996995801411080e-01 6.030566836051445e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.680000000000000e+02 -3.784494544427350e-01 6.350774472443057e-01 2.996685918089593e-01 6.030351411956750e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.690000000000000e+02 -3.784508940726514e-01 6.351116583890618e-01 2.996376081629191e-01 6.030136034355372e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.700000000000000e+02 -3.784523278186988e-01 6.351458623060188e-01 2.996066292028634e-01 6.029920703474052e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.710000000000000e+02 -3.784537555651887e-01 6.351800590812673e-01 2.995756549604572e-01 6.029705418999631e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.720000000000000e+02 -3.784551774442391e-01 6.352142486245691e-01 2.995446854008692e-01 6.029490181251381e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.730000000000000e+02 -3.784565933466632e-01 6.352484310154478e-01 2.995137205543310e-01 6.029274989951549e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.740000000000000e+02 -3.784580033439673e-01 6.352826062046837e-01 2.994827604025898e-01 6.029059845285395e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.750000000000000e+02 -3.784594074735629e-01 6.353167741705076e-01 2.994518049360116e-01 6.028844747320210e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.760000000000000e+02 -3.784608055815998e-01 6.353509350163056e-01 2.994208541979964e-01 6.028629695741603e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.770000000000000e+02 -3.784621978345898e-01 6.353850886283603e-01 2.993899081443913e-01 6.028414690946829e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.780000000000000e+02 -3.784635841710074e-01 6.354192350456098e-01 2.993589667934949e-01 6.028199732845769e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.790000000000000e+02 -3.784649645379569e-01 6.354533743222783e-01 2.993280301582823e-01 6.027984821159358e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.800000000000000e+02 -3.784663389965391e-01 6.354875064032925e-01 2.992970982252645e-01 6.027769956176319e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.810000000000000e+02 -3.784677075829133e-01 6.355216312634269e-01 2.992661709857862e-01 6.027555138003414e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.820000000000000e+02 -3.784690701860081e-01 6.355557489942459e-01 2.992352484690238e-01 6.027340366252625e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.830000000000000e+02 -3.784704269292104e-01 6.355898595071260e-01 2.992043306430839e-01 6.027125641266800e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.840000000000000e+02 -3.784717776881066e-01 6.356239628790172e-01 2.991734175443813e-01 6.026910962859776e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.850000000000000e+02 -3.784731225554686e-01 6.356580590527140e-01 2.991425091478284e-01 6.026696331201623e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.860000000000000e+02 -3.784744544233971e-01 6.356921528639745e-01 2.991116073941442e-01 6.026481730314700e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.870000000000000e+02 -3.784757945441390e-01 6.357262298741406e-01 2.990807064820917e-01 6.026267207852363e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.880000000000000e+02 -3.784771216700561e-01 6.357603045174689e-01 2.990498122144442e-01 6.026052716220713e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.890000000000000e+02 -3.784784429155752e-01 6.357943719648547e-01 2.990189226490462e-01 6.025838271343015e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.900000000000000e+02 -3.784797581697775e-01 6.358284322926958e-01 2.989880378173677e-01 6.025623872978464e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.910000000000000e+02 -3.784810675414865e-01 6.358624854135214e-01 2.989571576928311e-01 6.025409521523162e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.410000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.920000000000000e+02 -3.784823710292237e-01 6.358965313534712e-01 2.989262822731300e-01 6.025195216746807e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.400000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.930000000000000e+02 -3.784836685528771e-01 6.359305701529687e-01 2.988954115836110e-01 6.024980958625012e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.400000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.940000000000000e+02 -3.784849601790364e-01 6.359646017811811e-01 2.988645456049874e-01 6.024766747185333e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.400000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.950000000000000e+02 -3.784862459317241e-01 6.359986262060602e-01 2.988336843341707e-01 6.024552582655245e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.400000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.960000000000000e+02 -3.784875359708447e-01 6.360326365413065e-01 2.988028249897196e-01 6.024338487727892e-01 9.080000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.400000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.970000000000000e+02 -3.784888104745558e-01 6.360666462466145e-01 2.987719729976268e-01 6.024124417948600e-01 9.090000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.389999999999999e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.980000000000000e+02 -3.784900784268349e-01 6.361006492214575e-01 2.987411259006925e-01 6.023910393490887e-01 9.090000000000000e-11 4.630000000000000e-11 3.540000000000000e-11 -9.389999999999999e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.990000000000000e+02 -3.784913404884083e-01 6.361346450185202e-01 2.987102835189488e-01 6.023696415843667e-01 9.090000000000000e-11 4.630000000000000e-11 3.550000000000000e-11 -9.389999999999999e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.750000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.000000000000000e+02 -3.784925966997444e-01 6.361686336117945e-01 2.986794458421834e-01 6.023482485102727e-01 9.090000000000000e-11 4.630000000000000e-11 3.550000000000000e-11 -9.389999999999999e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.740000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.010000000000000e+02 -3.784938469164892e-01 6.362026151046840e-01 2.986486129104450e-01 6.023268600909192e-01 9.090000000000000e-11 4.630000000000000e-11 3.550000000000000e-11 -9.389999999999999e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.740000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.020000000000000e+02 -3.784966882595187e-01 6.362360979854843e-01 2.986160705210612e-01 6.023058417642508e-01 9.090000000000000e-11 4.630000000000000e-11 3.550000000000000e-11 -9.379999999999999e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.740000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.030000000000000e+02 -3.784976970836622e-01 6.362701312539704e-01 2.985855037235800e-01 6.022844098451791e-01 9.090000000000000e-11 4.630000000000000e-11 3.550000000000000e-11 -9.379999999999999e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.740000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.040000000000000e+02 -3.784987071563310e-01 6.363041611166144e-01 2.985549342111639e-01 6.022629778467503e-01 9.090000000000000e-11 4.630000000000000e-11 3.550000000000000e-11 -9.370000000000001e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.740000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.050000000000000e+02 -3.784997199535144e-01 6.363381851853883e-01 2.985243583658725e-01 6.022415491580783e-01 9.090000000000000e-11 4.630000000000000e-11 3.550000000000000e-11 -9.370000000000001e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.740000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.060000000000000e+02 -3.785007506132109e-01 6.363721907649974e-01 2.984937648045053e-01 6.022201333225473e-01 9.100000000000000e-11 4.630000000000000e-11 3.550000000000000e-11 -9.370000000000001e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.740000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.070000000000000e+02 -3.785017780398628e-01 6.364061909784986e-01 2.984631529925376e-01 6.021987299975434e-01 9.100000000000000e-11 4.630000000000000e-11 3.550000000000000e-11 -9.360000000000001e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.740000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.080000000000000e+02 -3.785028138180232e-01 6.364401791291526e-01 2.984325208225077e-01 6.021773400231983e-01 9.100000000000000e-11 4.630000000000000e-11 3.550000000000000e-11 -9.360000000000001e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.740000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.090000000000000e+02 -3.785038547363715e-01 6.364741588539063e-01 2.984018756573528e-01 6.021559579254313e-01 9.100000000000000e-11 4.630000000000000e-11 3.550000000000000e-11 -9.360000000000001e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.740000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.100000000000000e+02 -3.785048980648197e-01 6.365081311265242e-01 2.983712234549714e-01 6.021345814390198e-01 9.100000000000000e-11 4.630000000000000e-11 3.550000000000000e-11 -9.360000000000001e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.740000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.110000000000000e+02 -3.785059427713880e-01 6.365420928387983e-01 2.983405662444945e-01 6.021132134939907e-01 9.100000000000000e-11 4.630000000000000e-11 3.550000000000000e-11 -9.360000000000001e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.740000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.120000000000000e+02 -3.785069888046014e-01 6.365760405369841e-01 2.983099042282124e-01 6.020918576759564e-01 9.100000000000000e-11 4.630000000000000e-11 3.550000000000000e-11 -9.350000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.740000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.130000000000000e+02 -3.785080364807658e-01 6.366099750918717e-01 2.982792375372844e-01 6.020705128032580e-01 9.100000000000000e-11 4.630000000000000e-11 3.550000000000000e-11 -9.350000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.740000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.140000000000000e+02 -3.785090865699252e-01 6.366439004200050e-01 2.982485668339720e-01 6.020491739247597e-01 9.100000000000000e-11 4.630000000000000e-11 3.550000000000000e-11 -9.350000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.740000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.150000000000000e+02 -3.785101419571327e-01 6.366778174697130e-01 2.982178934914955e-01 6.020278375449838e-01 9.110000000000000e-11 4.630000000000000e-11 3.550000000000000e-11 -9.350000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.740000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.160000000000000e+02 -3.785112125124271e-01 6.367117192516573e-01 2.981872177910379e-01 6.020065047123753e-01 9.110000000000000e-11 4.630000000000000e-11 3.550000000000000e-11 -9.340000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.740000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.170000000000000e+02 -3.785122935174168e-01 6.367456080085757e-01 2.981565428946846e-01 6.019851744578634e-01 9.110000000000000e-11 4.630000000000000e-11 3.550000000000000e-11 -9.340000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.740000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.180000000000000e+02 -3.785133872798784e-01 6.367794824733588e-01 2.981258675780543e-01 6.019638472796407e-01 9.110000000000000e-11 4.630000000000000e-11 3.550000000000000e-11 -9.330000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.740000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.190000000000000e+02 -3.785144880263661e-01 6.368133469768605e-01 2.980951904837400e-01 6.019425229012563e-01 9.110000000000000e-11 4.630000000000000e-11 3.550000000000000e-11 -9.330000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.740000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.200000000000000e+02 -3.785155913490157e-01 6.368472029124626e-01 2.980645075510594e-01 6.019212046328174e-01 9.110000000000000e-11 4.630000000000000e-11 3.550000000000000e-11 -9.330000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.740000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.210000000000000e+02 -3.785166960639726e-01 6.368810469568024e-01 2.980338124705768e-01 6.018998998606617e-01 9.110000000000000e-11 4.630000000000000e-11 3.550000000000000e-11 -9.330000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.740000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.220000000000000e+02 -3.785178022060195e-01 6.369148753662101e-01 2.980031015426403e-01 6.018786143578593e-01 9.110000000000000e-11 4.630000000000000e-11 3.550000000000000e-11 -9.320000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.740000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.230000000000000e+02 -3.785189084878819e-01 6.369486896884369e-01 2.979723775650068e-01 6.018573459131185e-01 9.110000000000000e-11 4.630000000000000e-11 3.550000000000000e-11 -9.320000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.740000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.240000000000000e+02 -3.785200124139506e-01 6.369824959648878e-01 2.979416471125904e-01 6.018360864490606e-01 9.120000000000001e-11 4.630000000000000e-11 3.550000000000000e-11 -9.320000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.740000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.250000000000000e+02 -3.785211130800784e-01 6.370162981342482e-01 2.979109155729325e-01 6.018148296996795e-01 9.120000000000001e-11 4.630000000000000e-11 3.560000000000000e-11 -9.320000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.740000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.260000000000000e+02 -3.785222482243542e-01 6.370500704184024e-01 2.978801757492243e-01 6.017935827795943e-01 9.120000000000001e-11 4.630000000000000e-11 3.560000000000000e-11 -9.310000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.740000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.270000000000000e+02 -3.785233512948988e-01 6.370838564695617e-01 2.978494474373276e-01 6.017723315437726e-01 9.120000000000001e-11 4.630000000000000e-11 3.560000000000000e-11 -9.310000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.740000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.280000000000000e+02 -3.785244575623203e-01 6.371176323535369e-01 2.978187205601622e-01 6.017510841330347e-01 9.120000000000001e-11 4.630000000000000e-11 3.560000000000000e-11 -9.300000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.740000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.290000000000000e+02 -3.785255661989363e-01 6.371513999559624e-01 2.977879947880038e-01 6.017298392369055e-01 9.120000000000001e-11 4.630000000000000e-11 3.560000000000000e-11 -9.300000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.740000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.300000000000000e+02 -3.785266792731973e-01 6.371851583255370e-01 2.977572713801559e-01 6.017085959401863e-01 9.120000000000001e-11 4.630000000000000e-11 3.560000000000000e-11 -9.300000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.730000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.310000000000000e+02 -3.785278014709235e-01 6.372189032526497e-01 2.977265529160518e-01 6.016873544788894e-01 9.120000000000001e-11 4.630000000000000e-11 3.560000000000000e-11 -9.300000000000000e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.730000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.320000000000000e+02 -3.785289362120212e-01 6.372526315814269e-01 2.976958411079381e-01 6.016661151999331e-01 9.120000000000001e-11 4.630000000000000e-11 3.560000000000000e-11 -9.289999999999999e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.730000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.330000000000000e+02 -3.785300816695533e-01 6.372863453117429e-01 2.976651354188045e-01 6.016448774040614e-01 9.120000000000001e-11 4.630000000000000e-11 3.560000000000000e-11 -9.289999999999999e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.730000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.340000000000000e+02 -3.785312311538839e-01 6.373200501465801e-01 2.976344336999272e-01 6.016236403254192e-01 9.130000000000000e-11 4.630000000000000e-11 3.560000000000000e-11 -9.289999999999999e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.730000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.350000000000000e+02 -3.785323778711001e-01 6.373537500434577e-01 2.976037332466259e-01 6.016024053862015e-01 9.130000000000000e-11 4.630000000000000e-11 3.560000000000000e-11 -9.279999999999999e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.730000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.360000000000000e+02 -3.785335398746100e-01 6.373874303941223e-01 2.975730252194479e-01 6.015811810780992e-01 9.130000000000000e-11 4.640000000000000e-11 3.560000000000000e-11 -9.279999999999999e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.730000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.370000000000000e+02 -3.785346754474322e-01 6.374211182987423e-01 2.975423186463727e-01 6.015599604737907e-01 9.130000000000000e-11 4.630000000000000e-11 3.560000000000000e-11 -9.270000000000001e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.730000000000000e-11 3.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.380000000000000e+02 -3.785358067978115e-01 6.374548004471650e-01 2.975116070440360e-01 6.015387469090170e-01 9.130000000000000e-11 4.630000000000000e-11 3.560000000000000e-11 -9.270000000000001e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.730000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.390000000000000e+02 -3.785369345271114e-01 6.374884790602983e-01 2.974808922502687e-01 6.015175367436839e-01 9.130000000000000e-11 4.640000000000000e-11 3.560000000000000e-11 -9.270000000000001e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.730000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.400000000000000e+02 -3.785380581702355e-01 6.375221542532606e-01 2.974501781990164e-01 6.014963282035581e-01 9.130000000000000e-11 4.640000000000000e-11 3.560000000000000e-11 -9.270000000000001e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.730000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.410000000000000e+02 -3.785391759424852e-01 6.375558238772676e-01 2.974194694918656e-01 6.014751224150006e-01 9.130000000000000e-11 4.640000000000000e-11 3.560000000000000e-11 -9.270000000000001e-12 4.230000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.300000000000001e-11 -2.730000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.420000000000000e+02 -3.785402863239434e-01 6.375894863340436e-01 2.973887685767511e-01 6.014539208206071e-01 9.130000000000000e-11 4.640000000000000e-11 3.560000000000000e-11 -9.260000000000001e-12 4.220000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.310000000000000e-11 -2.730000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.430000000000000e+02 -3.785413896660205e-01 6.376231425627709e-01 2.973580742886275e-01 6.014327227824019e-01 9.140000000000000e-11 4.640000000000000e-11 3.560000000000000e-11 -9.260000000000001e-12 4.220000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.310000000000000e-11 -2.730000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.440000000000000e+02 -3.785424856979624e-01 6.376567953325118e-01 2.973273844112408e-01 6.014115266330115e-01 9.140000000000000e-11 4.640000000000000e-11 3.560000000000000e-11 -9.250000000000000e-12 4.220000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.310000000000000e-11 -2.730000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.450000000000000e+02 -3.785435694300555e-01 6.376904472223690e-01 2.972966993041396e-01 6.013903326021727e-01 9.140000000000000e-11 4.640000000000000e-11 3.560000000000000e-11 -9.250000000000000e-12 4.220000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.310000000000000e-11 -2.730000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.460000000000000e+02 -3.785446422803687e-01 6.377240922481870e-01 2.972660194170882e-01 6.013691459220144e-01 9.140000000000000e-11 4.640000000000000e-11 3.560000000000000e-11 -9.250000000000000e-12 4.220000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.310000000000000e-11 -2.730000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.470000000000000e+02 -3.785456786089938e-01 6.377577438218681e-01 2.972353533015090e-01 6.013479642847591e-01 9.140000000000000e-11 4.640000000000000e-11 3.560000000000000e-11 -9.240000000000000e-12 4.220000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.310000000000000e-11 -2.730000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.480000000000000e+02 -3.785466923610586e-01 6.377913944472177e-01 2.972046974170325e-01 6.013267886139999e-01 9.140000000000000e-11 4.640000000000000e-11 3.560000000000000e-11 -9.240000000000000e-12 4.220000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.310000000000000e-11 -2.730000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.490000000000000e+02 -3.785476920317085e-01 6.378250434784933e-01 2.971740480481564e-01 6.013056160853621e-01 9.140000000000000e-11 4.640000000000000e-11 3.560000000000000e-11 -9.240000000000000e-12 4.220000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.310000000000000e-11 -2.730000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.500000000000000e+02 -3.785486823912101e-01 6.378586891253115e-01 2.971434022707178e-01 6.012844470416647e-01 9.140000000000000e-11 4.640000000000000e-11 3.570000000000000e-11 -9.240000000000000e-12 4.220000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.310000000000000e-11 -2.730000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.510000000000000e+02 -3.785496621229962e-01 6.378923285231954e-01 2.971127602588222e-01 6.012632852662840e-01 9.140000000000000e-11 4.640000000000000e-11 3.570000000000000e-11 -9.230000000000000e-12 4.220000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.310000000000000e-11 -2.730000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.520000000000000e+02 -3.785506287332742e-01 6.379259601430072e-01 2.970821232462786e-01 6.012421333445855e-01 9.140000000000000e-11 4.640000000000000e-11 3.570000000000000e-11 -9.230000000000000e-12 4.220000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.310000000000000e-11 -2.730000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.530000000000000e+02 -3.785515830953432e-01 6.379595853752290e-01 2.970514907422374e-01 6.012209894969484e-01 9.149999999999999e-11 4.640000000000000e-11 3.570000000000000e-11 -9.220000000000000e-12 4.220000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.310000000000000e-11 -2.730000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.540000000000000e+02 -3.785525275215433e-01 6.379932065794131e-01 2.970208617422411e-01 6.011998502623450e-01 9.149999999999999e-11 4.640000000000000e-11 3.570000000000000e-11 -9.220000000000000e-12 4.220000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.310000000000000e-11 -2.730000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.550000000000000e+02 -3.785534612248599e-01 6.380268239334849e-01 2.969902377731122e-01 6.011787151949901e-01 9.149999999999999e-11 4.640000000000000e-11 3.570000000000000e-11 -9.220000000000000e-12 4.220000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.310000000000000e-11 -2.730000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.560000000000000e+02 -3.785543954686534e-01 6.380604239545891e-01 2.969596184775733e-01 6.011575916911528e-01 9.149999999999999e-11 4.640000000000000e-11 3.570000000000000e-11 -9.220000000000000e-12 4.220000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.310000000000000e-11 -2.730000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.570000000000000e+02 -3.785552975500396e-01 6.380940238355802e-01 2.969290145750861e-01 6.011364768050490e-01 9.149999999999999e-11 4.640000000000000e-11 3.570000000000000e-11 -9.210000000000000e-12 4.220000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.310000000000000e-11 -2.730000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.580000000000000e+02 -3.785561853990068e-01 6.381276136719902e-01 2.968984201226202e-01 6.011153726982336e-01 9.149999999999999e-11 4.640000000000000e-11 3.570000000000000e-11 -9.210000000000000e-12 4.220000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.310000000000000e-11 -2.730000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.590000000000000e+02 -3.785570637982481e-01 6.381611968527657e-01 2.968678317237232e-01 6.010942744424955e-01 9.149999999999999e-11 4.640000000000000e-11 3.570000000000000e-11 -9.210000000000000e-12 4.220000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.310000000000000e-11 -2.730000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.600000000000000e+02 -3.785579345196098e-01 6.381947754556908e-01 2.968372474934103e-01 6.010731796494029e-01 9.149999999999999e-11 4.640000000000000e-11 3.570000000000000e-11 -9.200000000000000e-12 4.220000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.310000000000000e-11 -2.730000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.610000000000000e+02 -3.785587952179696e-01 6.382283490836841e-01 2.968066679785534e-01 6.010520899493680e-01 9.149999999999999e-11 4.640000000000000e-11 3.570000000000000e-11 -9.200000000000000e-12 4.220000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.310000000000000e-11 -2.730000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.620000000000000e+02 -3.785596436239388e-01 6.382619169892572e-01 2.967760947745838e-01 6.010310067799018e-01 9.149999999999999e-11 4.640000000000000e-11 3.570000000000000e-11 -9.189999999999999e-12 4.220000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.310000000000000e-11 -2.720000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.630000000000000e+02 -3.785604814920069e-01 6.382954794865324e-01 2.967455282151287e-01 6.010099285402213e-01 9.160000000000000e-11 4.640000000000000e-11 3.570000000000000e-11 -9.189999999999999e-12 4.220000000000000e-11 1.280000000000000e-11 -2.200000000000000e-11 7.310000000000000e-11 -2.720000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.640000000000000e+02 -3.785613131273048e-01 6.383290362120121e-01 2.967149675974903e-01 6.009888532540307e-01 9.160000000000000e-11 4.640000000000000e-11 3.570000000000000e-11 -9.189999999999999e-12 4.220000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.310000000000000e-11 -2.720000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.650000000000000e+02 -3.785621411658445e-01 6.383625831975257e-01 2.966844145337673e-01 6.009677826822908e-01 9.160000000000000e-11 4.640000000000000e-11 3.570000000000000e-11 -9.189999999999999e-12 4.220000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.310000000000000e-11 -2.720000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.660000000000000e+02 -3.785629499174548e-01 6.383961233065851e-01 2.966538783981217e-01 6.009467190427703e-01 9.160000000000000e-11 4.640000000000000e-11 3.570000000000000e-11 -9.179999999999999e-12 4.220000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.310000000000000e-11 -2.720000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.670000000000000e+02 -3.785637658976243e-01 6.384296325974655e-01 2.966233551980849e-01 6.009256730427688e-01 9.160000000000000e-11 4.630000000000000e-11 3.570000000000000e-11 -9.179999999999999e-12 4.220000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.310000000000000e-11 -2.720000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.680000000000000e+02 -3.785645741559148e-01 6.384631243355280e-01 2.965928469102802e-01 6.009046390397749e-01 9.160000000000000e-11 4.640000000000000e-11 3.570000000000000e-11 -9.170000000000001e-12 4.220000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.310000000000000e-11 -2.720000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.690000000000000e+02 -3.785653765036382e-01 6.384966054251594e-01 2.965623481228040e-01 6.008836112335699e-01 9.160000000000000e-11 4.640000000000000e-11 3.570000000000000e-11 -9.170000000000001e-12 4.220000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.310000000000000e-11 -2.720000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.700000000000000e+02 -3.785661733613885e-01 6.385300794604583e-01 2.965318558762514e-01 6.008625870041522e-01 9.160000000000000e-11 4.640000000000000e-11 3.570000000000000e-11 -9.170000000000001e-12 4.220000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.310000000000000e-11 -2.720000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.710000000000000e+02 -3.785669627184650e-01 6.385635452295039e-01 2.965013708642375e-01 6.008415685666827e-01 9.160000000000000e-11 4.640000000000000e-11 3.570000000000000e-11 -9.170000000000001e-12 4.220000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.310000000000000e-11 -2.720000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.720000000000000e+02 -3.785677428045582e-01 6.385970011982965e-01 2.964708941371992e-01 6.008205581518448e-01 9.160000000000000e-11 4.630000000000000e-11 3.570000000000000e-11 -9.160000000000001e-12 4.220000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.310000000000000e-11 -2.720000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.730000000000000e+02 -3.785685140166207e-01 6.386304495478058e-01 2.964404246518954e-01 6.007995537097371e-01 9.170000000000000e-11 4.630000000000000e-11 3.580000000000000e-11 -9.160000000000001e-12 4.220000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.310000000000000e-11 -2.720000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.740000000000000e+02 -3.785692773050654e-01 6.386638946121900e-01 2.964099614866738e-01 6.007785504917585e-01 9.170000000000000e-11 4.630000000000000e-11 3.580000000000000e-11 -9.150000000000000e-12 4.220000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.310000000000000e-11 -2.720000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.750000000000000e+02 -3.785700336695219e-01 6.386973384199648e-01 2.963795068567391e-01 6.007575446201789e-01 9.170000000000000e-11 4.630000000000000e-11 3.580000000000000e-11 -9.150000000000000e-12 4.220000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.310000000000000e-11 -2.720000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.760000000000000e+02 -3.785708291861382e-01 6.387307500872819e-01 2.963490532985446e-01 6.007365435790588e-01 9.170000000000000e-11 4.630000000000000e-11 3.580000000000000e-11 -9.150000000000000e-12 4.220000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.310000000000000e-11 -2.720000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.770000000000000e+02 -3.785715857144659e-01 6.387641832384181e-01 2.963186260822309e-01 6.007155271325443e-01 9.170000000000000e-11 4.630000000000000e-11 3.580000000000000e-11 -9.140000000000000e-12 4.220000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.310000000000000e-11 -2.720000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.780000000000000e+02 -3.785723476277543e-01 6.387976087906618e-01 2.962882107226681e-01 6.006945053866428e-01 9.170000000000000e-11 4.630000000000000e-11 3.580000000000000e-11 -9.140000000000000e-12 4.220000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.310000000000000e-11 -2.720000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.790000000000000e+02 -3.785731121350869e-01 6.388310287367412e-01 2.962578031402140e-01 6.006734799956179e-01 9.170000000000000e-11 4.630000000000000e-11 3.580000000000000e-11 -9.140000000000000e-12 4.220000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.310000000000000e-11 -2.720000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.800000000000000e+02 -3.785738744104641e-01 6.388644441411527e-01 2.962274021816791e-01 6.006524534393910e-01 9.170000000000000e-11 4.630000000000000e-11 3.580000000000000e-11 -9.130000000000000e-12 4.220000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.310000000000000e-11 -2.720000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.810000000000000e+02 -3.785746297520271e-01 6.388978539024238e-01 2.961970101158774e-01 6.006314287359660e-01 9.170000000000000e-11 4.630000000000000e-11 3.580000000000000e-11 -9.130000000000000e-12 4.220000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.310000000000000e-11 -2.720000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.820000000000000e+02 -3.785753758129865e-01 6.389312567623844e-01 2.961666286115996e-01 6.006104078826265e-01 9.170000000000000e-11 4.630000000000000e-11 3.580000000000000e-11 -9.120000000000000e-12 4.210000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.310000000000000e-11 -2.720000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.830000000000000e+02 -3.785761134145925e-01 6.389646536699358e-01 2.961362556210009e-01 6.005893903651095e-01 9.170000000000000e-11 4.630000000000000e-11 3.580000000000000e-11 -9.120000000000000e-12 4.210000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.310000000000000e-11 -2.720000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.840000000000000e+02 -3.785768441967766e-01 6.389980470787613e-01 2.961058884012233e-01 6.005683738939813e-01 9.180000000000000e-11 4.630000000000000e-11 3.580000000000000e-11 -9.120000000000000e-12 4.210000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.310000000000000e-11 -2.720000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.850000000000000e+02 -3.785775702108244e-01 6.390314378060481e-01 2.960755273528421e-01 6.005473561106900e-01 9.180000000000000e-11 4.630000000000000e-11 3.580000000000000e-11 -9.110000000000000e-12 4.210000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.310000000000000e-11 -2.720000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.860000000000000e+02 -3.785783307904708e-01 6.390647997369377e-01 2.960451651066623e-01 6.005263436436886e-01 9.180000000000000e-11 4.630000000000000e-11 3.580000000000000e-11 -9.110000000000000e-12 4.210000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.310000000000000e-11 -2.720000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.870000000000000e+02 -3.785790632777780e-01 6.390981757367933e-01 2.960148213891264e-01 6.005053206555180e-01 9.180000000000000e-11 4.630000000000000e-11 3.580000000000000e-11 -9.100000000000000e-12 4.210000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.720000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.880000000000000e+02 -3.785798040643353e-01 6.391315417686042e-01 2.959844841369472e-01 6.004842957324377e-01 9.180000000000000e-11 4.630000000000000e-11 3.580000000000000e-11 -9.100000000000000e-12 4.210000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.720000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.890000000000000e+02 -3.785805500983149e-01 6.391649008659209e-01 2.959541496242291e-01 6.004632694083079e-01 9.180000000000000e-11 4.630000000000000e-11 3.580000000000000e-11 -9.100000000000000e-12 4.210000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.720000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.900000000000000e+02 -3.785812977952094e-01 6.391982564451297e-01 2.959238151252190e-01 6.004422416510489e-01 9.180000000000000e-11 4.630000000000000e-11 3.580000000000000e-11 -9.100000000000000e-12 4.210000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.720000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.910000000000000e+02 -3.785820464879064e-01 6.392316104388850e-01 2.958934794346685e-01 6.004212114181043e-01 9.180000000000000e-11 4.630000000000000e-11 3.580000000000000e-11 -9.089999999999999e-12 4.210000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.720000000000000e-11 3.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.920000000000000e+02 -3.785827977923311e-01 6.392649636303559e-01 2.958631419831031e-01 6.004001771371299e-01 9.180000000000000e-11 4.630000000000000e-11 3.580000000000000e-11 -9.079999999999999e-12 4.210000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.720000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.930000000000000e+02 -3.785835528374691e-01 6.392983156719032e-01 2.958328025553497e-01 6.003791385718481e-01 9.180000000000000e-11 4.630000000000000e-11 3.580000000000000e-11 -9.079999999999999e-12 4.210000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.720000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.940000000000000e+02 -3.785843111235871e-01 6.393316649288577e-01 2.958024610873311e-01 6.003580978091757e-01 9.180000000000000e-11 4.630000000000000e-11 3.580000000000000e-11 -9.079999999999999e-12 4.210000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.720000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.950000000000000e+02 -3.785850711531148e-01 6.393650088960134e-01 2.957721169865521e-01 6.003370587534016e-01 9.190000000000000e-11 4.630000000000000e-11 3.580000000000000e-11 -9.079999999999999e-12 4.210000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.720000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.960000000000000e+02 -3.785858242140244e-01 6.393983498930020e-01 2.957417713202585e-01 6.003160239029524e-01 9.190000000000000e-11 4.630000000000000e-11 3.590000000000000e-11 -9.070000000000001e-12 4.210000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.720000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.970000000000000e+02 -3.785865830261998e-01 6.394316779179280e-01 2.957114200225772e-01 6.002949978934029e-01 9.190000000000000e-11 4.630000000000000e-11 3.590000000000000e-11 -9.060000000000001e-12 4.210000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.980000000000000e+02 -3.785873410237400e-01 6.394649992843885e-01 2.956810655904080e-01 6.002739769123032e-01 9.190000000000000e-11 4.630000000000000e-11 3.590000000000000e-11 -9.060000000000001e-12 4.210000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.990000000000000e+02 -3.785880990453473e-01 6.394983162087491e-01 2.956507084264202e-01 6.002529578722299e-01 9.190000000000000e-11 4.630000000000000e-11 3.590000000000000e-11 -9.060000000000001e-12 4.210000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.000000000000000e+02 -3.785888577857964e-01 6.395316295397242e-01 2.956203481515233e-01 6.002319396179141e-01 9.190000000000000e-11 4.630000000000000e-11 3.590000000000000e-11 -9.060000000000001e-12 4.210000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.010000000000000e+02 -3.785896183660070e-01 6.395649385848062e-01 2.955899843211512e-01 6.002109223993811e-01 9.190000000000000e-11 4.630000000000000e-11 3.590000000000000e-11 -9.060000000000001e-12 4.210000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.020000000000000e+02 -3.785903815289288e-01 6.395982432371052e-01 2.955596169391483e-01 6.001899058602809e-01 9.190000000000000e-11 4.630000000000000e-11 3.590000000000000e-11 -9.050000000000000e-12 4.210000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.030000000000000e+02 -3.785911455745837e-01 6.396315457520857e-01 2.955292463893037e-01 6.001688884804778e-01 9.190000000000000e-11 4.630000000000000e-11 3.590000000000000e-11 -9.040000000000000e-12 4.210000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.040000000000000e+02 -3.785919064917793e-01 6.396648496473878e-01 2.954988736651429e-01 6.001478685516900e-01 9.190000000000000e-11 4.630000000000000e-11 3.590000000000000e-11 -9.040000000000000e-12 4.210000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.050000000000000e+02 -3.785926606932982e-01 6.396981573950726e-01 2.954685000679936e-01 6.001268450603490e-01 9.190000000000000e-11 4.630000000000000e-11 3.590000000000000e-11 -9.040000000000000e-12 4.210000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.060000000000000e+02 -3.785934514572729e-01 6.397314390839983e-01 2.954381143120191e-01 6.001058281444569e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.040000000000000e-12 4.210000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.070000000000000e+02 -3.785931694380140e-01 6.397643984996422e-01 2.954078614039266e-01 6.000857621107412e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.030000000000000e-12 4.210000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.080000000000000e+02 -3.785937790132498e-01 6.397976342876651e-01 2.953775758623304e-01 6.000648509370191e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.020000000000000e-12 4.210000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.090000000000000e+02 -3.785943822861730e-01 6.398308633741693e-01 2.953472959543575e-01 6.000439440138243e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.020000000000000e-12 4.210000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.100000000000000e+02 -3.785949793890524e-01 6.398640856686449e-01 2.953170216442765e-01 6.000230413742341e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.020000000000000e-12 4.210000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.110000000000000e+02 -3.785955703042263e-01 6.398973011910091e-01 2.952867529371226e-01 6.000021430081157e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.020000000000000e-12 4.210000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.120000000000000e+02 -3.785961549334484e-01 6.399305100069972e-01 2.952564898621457e-01 5.999812488953946e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.010000000000000e-12 4.210000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.130000000000000e+02 -3.785967333964548e-01 6.399637120346127e-01 2.952262323871077e-01 5.999603590662691e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.210000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.140000000000000e+02 -3.785973056614163e-01 6.399969073012557e-01 2.951959805213524e-01 5.999394735094379e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.150000000000000e+02 -3.785978716793653e-01 6.400300958434625e-01 2.951657342796449e-01 5.999185922119945e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.160000000000000e+02 -3.785984244113083e-01 6.400632824366564e-01 2.951354956431079e-01 5.998977135488890e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.170000000000000e+02 -3.785989776603595e-01 6.400964577084701e-01 2.951052607321855e-01 5.998768407196498e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.180000000000000e+02 -3.785995250252058e-01 6.401296260089205e-01 2.950750313474629e-01 5.998559722397220e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.190000000000000e+02 -3.786000662111914e-01 6.401627875399534e-01 2.950448075727933e-01 5.998351080407778e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.200000000000000e+02 -3.786006012251253e-01 6.401959422984341e-01 2.950145894073143e-01 5.998142481247237e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.210000000000000e+02 -3.786011299530555e-01 6.402290903607720e-01 2.949843768847437e-01 5.997933924677792e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.220000000000000e+02 -3.786016525611995e-01 6.402622316199243e-01 2.949541699586208e-01 5.997725411045626e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.230000000000000e+02 -3.786021688630233e-01 6.402953662016170e-01 2.949239686831026e-01 5.997516939944068e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.240000000000000e+02 -3.786026790250457e-01 6.403284939941983e-01 2.948937730123695e-01 5.997308511763499e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.250000000000000e+02 -3.786031829924109e-01 6.403616150342912e-01 2.948635829632443e-01 5.997100126400822e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.260000000000000e+02 -3.786036806789620e-01 6.403947293858396e-01 2.948333985606705e-01 5.996891783618783e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.270000000000000e+02 -3.786041722207514e-01 6.404278369621693e-01 2.948032197667246e-01 5.996683483694708e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.280000000000000e+02 -3.786046575697235e-01 6.404609377824456e-01 2.947730465982825e-01 5.996475226668661e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.290000000000000e+02 -3.786051366495855e-01 6.404940319039105e-01 2.947428790775215e-01 5.996267012326209e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.300000000000000e+02 -3.786056095582952e-01 6.405271192764678e-01 2.947127171755976e-01 5.996058840749959e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.310000000000000e+02 -3.786060762943740e-01 6.405601998876356e-01 2.946825608962632e-01 5.995850712088413e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.320000000000000e+02 -3.786065367744316e-01 6.405932737994779e-01 2.946524102637069e-01 5.995642626110451e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.330000000000000e+02 -3.786069911080491e-01 6.406263409455623e-01 2.946222652470008e-01 5.995434583010106e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.340000000000000e+02 -3.786074391651164e-01 6.406594013940304e-01 2.945921258874448e-01 5.995226582702201e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.350000000000000e+02 -3.786078810666573e-01 6.406924550898021e-01 2.945619921480199e-01 5.995018625217170e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.360000000000000e+02 -3.786083167907217e-01 6.407255020343068e-01 2.945318640382543e-01 5.994810710655786e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.370000000000000e+02 -3.786087462523776e-01 6.407585422949335e-01 2.945017415821428e-01 5.994602838740524e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.380000000000000e+02 -3.786091695483537e-01 6.407915757988858e-01 2.944716247547316e-01 5.994395009785352e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.390000000000000e+02 -3.786095866674029e-01 6.408246025595700e-01 2.944415135595881e-01 5.994187223724717e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.400000000000000e+02 -3.786099975354770e-01 6.408576226327009e-01 2.944114080183001e-01 5.993979480348853e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.410000000000000e+02 -3.786104022276692e-01 6.408906359644599e-01 2.943813081113538e-01 5.993771779878851e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.420000000000000e+02 -3.786108007707038e-01 6.409236425317577e-01 2.943512138332203e-01 5.993564122444176e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.430000000000000e+02 -3.786111930310515e-01 6.409566424435571e-01 2.943211252203510e-01 5.993356507568296e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.440000000000000e+02 -3.786115791295838e-01 6.409896355999641e-01 2.942910422425653e-01 5.993148935728303e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.450000000000000e+02 -3.786119590762372e-01 6.410226220085389e-01 2.942609648961326e-01 5.992941406823101e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.460000000000000e+02 -3.786123327536557e-01 6.410556017437357e-01 2.942308932165479e-01 5.992733920647609e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.470000000000000e+02 -3.786127003018629e-01 6.410885747098697e-01 2.942008271654790e-01 5.992526477553083e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.480000000000000e+02 -3.786130615711178e-01 6.411215410269185e-01 2.941707667840031e-01 5.992319077024569e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.490000000000000e+02 -3.786134167102945e-01 6.411545005716835e-01 2.941407120346244e-01 5.992111719647726e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.500000000000000e+02 -3.786137656774578e-01 6.411874533848331e-01 2.941106629286190e-01 5.991904405221230e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.510000000000000e+02 -3.786141083665044e-01 6.412203995417264e-01 2.940806194970246e-01 5.991697133480898e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.520000000000000e+02 -3.786144449202477e-01 6.412533389446584e-01 2.940505817007654e-01 5.991489904785797e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.530000000000000e+02 -3.786147753049554e-01 6.412862716180341e-01 2.940205495504353e-01 5.991282719060079e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.540000000000000e+02 -3.786150994247340e-01 6.413191976260008e-01 2.939905230748490e-01 5.991075576105831e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.550000000000000e+02 -3.786154173829898e-01 6.413521169040421e-01 2.939605022450930e-01 5.990868476126152e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.560000000000000e+02 -3.786157292118632e-01 6.413850294317974e-01 2.939304870530914e-01 5.990661419199670e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.570000000000000e+02 -3.786160347519290e-01 6.414179353144519e-01 2.939004775460149e-01 5.990454405000478e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.580000000000000e+02 -3.786163341764441e-01 6.414508344380017e-01 2.938704736753558e-01 5.990247433916270e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.590000000000000e+02 -3.786166273560386e-01 6.414837268936191e-01 2.938404754787921e-01 5.990040505627726e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.600000000000000e+02 -3.786169143735026e-01 6.415166126179737e-01 2.938104829351871e-01 5.989833620417522e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.610000000000000e+02 -3.786171952240799e-01 6.415494916243242e-01 2.937804960456183e-01 5.989626778192551e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.620000000000000e+02 -3.786174698381199e-01 6.415823639675307e-01 2.937505148301854e-01 5.989419978730965e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.630000000000000e+02 -3.786177382918390e-01 6.416152295737746e-01 2.937205392718890e-01 5.989213222449139e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.640000000000000e+02 -3.786180005859935e-01 6.416480884760658e-01 2.936905693666444e-01 5.989006509032794e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.650000000000000e+02 -3.786182566312360e-01 6.416809407041971e-01 2.936606051460429e-01 5.988799838596712e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.660000000000000e+02 -3.786185065267534e-01 6.417137862200093e-01 2.936306465786975e-01 5.988593211100642e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.670000000000000e+02 -3.786187502617348e-01 6.417466250045569e-01 2.936006936729636e-01 5.988386626799054e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.680000000000000e+02 -3.786189877574843e-01 6.417794571423440e-01 2.935707464479370e-01 5.988180085214350e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.690000000000000e+02 -3.786192190923023e-01 6.418122825581365e-01 2.935408048859967e-01 5.987973586768157e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.700000000000000e+02 -3.786194442738150e-01 6.418451012589081e-01 2.935108689843710e-01 5.987767131375173e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.710000000000000e+02 -3.786196632298344e-01 6.418779132969701e-01 2.934809387645685e-01 5.987560718849720e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.720000000000000e+02 -3.786198760265606e-01 6.419107186161132e-01 2.934510142106679e-01 5.987354349477801e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.730000000000000e+02 -3.786200826035550e-01 6.419435172713420e-01 2.934210953392075e-01 5.987148022994881e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.740000000000000e+02 -3.786202830321702e-01 6.419763092156380e-01 2.933911821309177e-01 5.986941739572296e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.750000000000000e+02 -3.786204773102365e-01 6.420090944412736e-01 2.933612745890801e-01 5.986735499314589e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.760000000000000e+02 -3.786206653365697e-01 6.420418730224027e-01 2.933313727431526e-01 5.986529301946129e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.770000000000000e+02 -3.786208472023316e-01 6.420746449049484e-01 2.933014765672333e-01 5.986323147621200e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.780000000000000e+02 -3.786210229439560e-01 6.421074100634866e-01 2.932715860522994e-01 5.986117036450277e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.790000000000000e+02 -3.786211924364403e-01 6.421401685819539e-01 2.932417012355898e-01 5.985910968165206e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.800000000000000e+02 -3.786213557725420e-01 6.421729203966460e-01 2.932118220920374e-01 5.985704943009407e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.810000000000000e+02 -3.786215129610195e-01 6.422056654988134e-01 2.931819486208285e-01 5.985498961049350e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.820000000000000e+02 -3.786216639245053e-01 6.422384039570975e-01 2.931520808430279e-01 5.985293021958756e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.830000000000000e+02 -3.786218087648949e-01 6.422711356974302e-01 2.931222187315063e-01 5.985087126044629e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.840000000000000e+02 -3.786219473593260e-01 6.423038607937569e-01 2.930923623242347e-01 5.984881273128695e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.850000000000000e+02 -3.786220798138368e-01 6.423365791904206e-01 2.930625115897121e-01 5.984675463315643e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.860000000000000e+02 -3.786222061299347e-01 6.423692908793297e-01 2.930326665298397e-01 5.984469696697444e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.870000000000000e+02 -3.786223261851781e-01 6.424019959448185e-01 2.930028271808576e-01 5.984263972990018e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.880000000000000e+02 -3.786224401246325e-01 6.424346942918925e-01 2.929729935020658e-01 5.984058292518467e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.890000000000000e+02 -3.786225479143144e-01 6.424673859536578e-01 2.929431655028790e-01 5.983852655120272e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.900000000000000e+02 -3.786226494592081e-01 6.425000709808675e-01 2.929133432140162e-01 5.983647060725238e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.910000000000000e+02 -3.786227448617240e-01 6.425327493117863e-01 2.928835266062791e-01 5.983441509515072e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.920000000000000e+02 -3.786228341307735e-01 6.425654209418271e-01 2.928537156781440e-01 5.983236001514047e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.930000000000000e+02 -3.786229171613529e-01 6.425980859413377e-01 2.928239104612346e-01 5.983030536500271e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.940000000000000e+02 -3.786229940449993e-01 6.426307442559707e-01 2.927941109294404e-01 5.982825114629845e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.950000000000000e+02 -3.786230647966564e-01 6.426633958663687e-01 2.927643170811460e-01 5.982619736047948e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.960000000000000e+02 -3.786231293196218e-01 6.426960408500401e-01 2.927345289436568e-01 5.982414400424264e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.970000000000000e+02 -3.786231877260038e-01 6.427286791302365e-01 2.927047464861780e-01 5.982209108048324e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.980000000000000e+02 -3.786232398984971e-01 6.427613107835352e-01 2.926749697442075e-01 5.982003858690029e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.990000000000000e+02 -3.786232859381282e-01 6.427939357470011e-01 2.926451986892163e-01 5.981798652549616e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.000000000000000e+02 -3.786233258335730e-01 6.428265540276646e-01 2.926154333257897e-01 5.981593489624670e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.010000000000000e+02 -3.786233595013803e-01 6.428591656748271e-01 2.925856736804134e-01 5.981388369807904e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.020000000000000e+02 -3.786233870327452e-01 6.428917706471649e-01 2.925559197250628e-01 5.981183293127104e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.030000000000000e+02 -3.786234084413032e-01 6.429243689198105e-01 2.925261714594670e-01 5.980978259788444e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.040000000000000e+02 -3.786234236015226e-01 6.429569605898670e-01 2.924964289192314e-01 5.980773269392506e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.050000000000000e+02 -3.786234326250199e-01 6.429895455765304e-01 2.924666920743920e-01 5.980568322271695e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.060000000000000e+02 -3.786234355322833e-01 6.430221238673390e-01 2.924369609200937e-01 5.980363418477902e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.070000000000000e+02 -3.786234321935406e-01 6.430546955537471e-01 2.924072354944862e-01 5.980158557686687e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.080000000000000e+02 -3.786234227681594e-01 6.430872605332717e-01 2.923775157521695e-01 5.979953740236840e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.090000000000000e+02 -3.786234071098983e-01 6.431198189000317e-01 2.923478017373337e-01 5.979748965849915e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.100000000000000e+02 -3.786233853133415e-01 6.431523705975939e-01 2.923180934229004e-01 5.979544234690137e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.110000000000000e+02 -3.786233573894851e-01 6.431849156071526e-01 2.922883908086922e-01 5.979339546914855e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.120000000000000e+02 -3.786233232401077e-01 6.432174540115095e-01 2.922586939218821e-01 5.979134902146332e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.130000000000000e+02 -3.786232829545047e-01 6.432499857428979e-01 2.922290027391786e-01 5.978930300685734e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.140000000000000e+02 -3.786232365584201e-01 6.432825107831477e-01 2.921993172545324e-01 5.978725742618918e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.150000000000000e+02 -3.786231839019383e-01 6.433150292480679e-01 2.921696375102992e-01 5.978521227466009e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.160000000000000e+02 -3.786231251424780e-01 6.433475410171858e-01 2.921399634645953e-01 5.978316755754823e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.170000000000000e+02 -3.786230602531698e-01 6.433800461208882e-01 2.921102951245087e-01 5.978112327317719e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.180000000000000e+02 -3.786229891405428e-01 6.434125446174257e-01 2.920806325191526e-01 5.977907942001294e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.190000000000000e+02 -3.786229118899688e-01 6.434450364566193e-01 2.920509756240389e-01 5.977703599948294e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.200000000000000e+02 -3.786228285198621e-01 6.434775216124907e-01 2.920213244371771e-01 5.977499301355230e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.210000000000000e+02 -3.786227389257078e-01 6.435100001742479e-01 2.919916789872692e-01 5.977295045807347e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.220000000000000e+02 -3.786226432312144e-01 6.435424720508446e-01 2.919620392409892e-01 5.977090833687737e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.230000000000000e+02 -3.786225413164808e-01 6.435749373312898e-01 2.919324052331094e-01 5.976886664651487e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.240000000000000e+02 -3.786224332923355e-01 6.436073959331753e-01 2.919027769340815e-01 5.976682539051910e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.250000000000000e+02 -3.786223191405563e-01 6.436398478767422e-01 2.918731543491713e-01 5.976478456784530e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.260000000000000e+02 -3.786221987517122e-01 6.436722932396181e-01 2.918435375108172e-01 5.976274417571890e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.270000000000000e+02 -3.786220722511635e-01 6.437047319231221e-01 2.918139263862523e-01 5.976070421866323e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.280000000000000e+02 -3.786219396238756e-01 6.437371639559815e-01 2.917843209781903e-01 5.975866469464162e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.290000000000000e+02 -3.786218007837303e-01 6.437695893957139e-01 2.917547213130297e-01 5.975662560186239e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.300000000000000e+02 -3.786216558140728e-01 6.438020081785929e-01 2.917251273690948e-01 5.975458694320513e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.310000000000000e+02 -3.786215047381921e-01 6.438344202945051e-01 2.916955391400284e-01 5.975254871883158e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.320000000000000e+02 -3.786213474347174e-01 6.438668258270653e-01 2.916659566620695e-01 5.975051092589071e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.330000000000000e+02 -3.786211840451589e-01 6.438992246859050e-01 2.916363798947135e-01 5.974847356736729e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.340000000000000e+02 -3.786210144201660e-01 6.439316169587492e-01 2.916068088845667e-01 5.974643664123367e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.350000000000000e+02 -3.786208386991671e-01 6.439640025693067e-01 2.915772435898335e-01 5.974440014915307e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.360000000000000e+02 -3.786206568593014e-01 6.439963815281846e-01 2.915476840190868e-01 5.974236409124959e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.370000000000000e+02 -3.786204687830304e-01 6.440287539163932e-01 2.915181302074973e-01 5.974032846475996e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.380000000000000e+02 -3.786202746167203e-01 6.440611196358793e-01 2.914885821138598e-01 5.973829327322537e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.390000000000000e+02 -3.786200743188045e-01 6.440934787142278e-01 2.914590397514926e-01 5.973625851589345e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.400000000000000e+02 -3.786198678102917e-01 6.441258312147631e-01 2.914295031431539e-01 5.973422419006900e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.410000000000000e+02 -3.786196551882062e-01 6.441581770623251e-01 2.913999722634874e-01 5.973219029917995e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.420000000000000e+02 -3.786194364349880e-01 6.441905162745668e-01 2.913704471179084e-01 5.973015684240829e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.430000000000000e+02 -3.786192114923255e-01 6.442228488943631e-01 2.913409277241970e-01 5.972812381819511e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.440000000000000e+02 -3.786189804247742e-01 6.442551748728882e-01 2.913114140656992e-01 5.972609122876295e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.450000000000000e+02 -3.786187432454172e-01 6.442874942090889e-01 2.912819061386545e-01 5.972405907381599e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.460000000000000e+02 -3.786184998474499e-01 6.443198069745504e-01 2.912524039755165e-01 5.972202735105593e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.470000000000000e+02 -3.786182503703934e-01 6.443521130738548e-01 2.912229075372127e-01 5.971999606407327e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.480000000000000e+02 -3.786179946880809e-01 6.443844125981392e-01 2.911934168608204e-01 5.971796520946172e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.490000000000000e+02 -3.786177328923823e-01 6.444167054842648e-01 2.911639319211138e-01 5.971593478967536e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.500000000000000e+02 -3.786174649856330e-01 6.444489917363528e-01 2.911344527177594e-01 5.971390480437384e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.510000000000000e+02 -3.786171908825640e-01 6.444812714049600e-01 2.911049792779948e-01 5.971187525241528e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.520000000000000e+02 -3.786169106339404e-01 6.445135444591520e-01 2.910755115878138e-01 5.970984613483811e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.530000000000000e+02 -3.786166243142984e-01 6.445458108560871e-01 2.910460496256644e-01 5.970781745282688e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.540000000000000e+02 -3.786163317604084e-01 6.445780706950730e-01 2.910165934420128e-01 5.970578920378796e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.550000000000000e+02 -3.786160331003349e-01 6.446103239096445e-01 2.909871429978501e-01 5.970376138891235e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.560000000000000e+02 -3.786157283555685e-01 6.446425704738672e-01 2.909576982899111e-01 5.970173401003229e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.570000000000000e+02 -3.786154173869855e-01 6.446748104813038e-01 2.909282593600728e-01 5.969970706406290e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.580000000000000e+02 -3.786151003422109e-01 6.447070438395315e-01 2.908988261655107e-01 5.969768055394431e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.590000000000000e+02 -3.786147770947496e-01 6.447392706335268e-01 2.908693987444567e-01 5.969565447689466e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.600000000000000e+02 -3.786144477404748e-01 6.447714907974222e-01 2.908399770704616e-01 5.969362883547107e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.610000000000000e+02 -3.786141122905302e-01 6.448037043357296e-01 2.908105611396484e-01 5.969160362890392e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.620000000000000e+02 -3.786137706237522e-01 6.448359113149040e-01 2.907811509910214e-01 5.968957885603473e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.630000000000000e+02 -3.786134228444863e-01 6.448681116718289e-01 2.907517465943475e-01 5.968755451877119e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.640000000000000e+02 -3.786130689843689e-01 6.449003053949514e-01 2.907223479401321e-01 5.968553061705264e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.650000000000000e+02 -3.786127089120312e-01 6.449324925661795e-01 2.906929550690482e-01 5.968350714861624e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.660000000000000e+02 -3.786123427172421e-01 6.449646731216664e-01 2.906635679567092e-01 5.968148411608907e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.670000000000000e+02 -3.786119704545591e-01 6.449968470406545e-01 2.906341865859810e-01 5.967946151932303e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.680000000000000e+02 -3.786115919706481e-01 6.450290144242448e-01 2.906048110032767e-01 5.967743935509371e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.690000000000000e+02 -3.786112073744896e-01 6.450611751870142e-01 2.905754411799268e-01 5.967541762735057e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.700000000000000e+02 -3.786108167002641e-01 6.450933293178043e-01 2.905460771053572e-01 5.967339633588137e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.710000000000000e+02 -3.786104198177496e-01 6.451254769041282e-01 2.905167188189690e-01 5.967137547780414e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.720000000000000e+02 -3.786100168634640e-01 6.451576178547198e-01 2.904873662820158e-01 5.966935505644491e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.730000000000000e+02 -3.786096077018339e-01 6.451897522607321e-01 2.904580195354674e-01 5.966733506879058e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.740000000000000e+02 -3.786091924676599e-01 6.452218800362014e-01 2.904286785404932e-01 5.966531551770754e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.750000000000000e+02 -3.786087711098295e-01 6.452540012151997e-01 2.903993433132601e-01 5.966329640220251e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.760000000000000e+02 -3.786083435703246e-01 6.452861158361453e-01 2.903700138722196e-01 5.966127772113862e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.770000000000000e+02 -3.786079099133940e-01 6.453182238652992e-01 2.903406901983740e-01 5.965925947524650e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.780000000000000e+02 -3.786074701890970e-01 6.453503252551773e-01 2.903113722804426e-01 5.965724166726915e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.790000000000000e+02 -3.786070242480306e-01 6.453824201254790e-01 2.902820601605157e-01 5.965522429192583e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.800000000000000e+02 -3.786065722036199e-01 6.454145083856304e-01 2.902527538088823e-01 5.965320735349615e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.810000000000000e+02 -3.786061140863566e-01 6.454465900290981e-01 2.902234532156859e-01 5.965119085146589e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.820000000000000e+02 -3.786056497518587e-01 6.454786651423967e-01 2.901941584261681e-01 5.964917478367078e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.830000000000000e+02 -3.786051793829681e-01 6.455107336112540e-01 2.901648693866921e-01 5.964715915371454e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.840000000000000e+02 -3.786047027878167e-01 6.455427955629823e-01 2.901355861550286e-01 5.964514395742178e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.850000000000000e+02 -3.786042201248426e-01 6.455748508976599e-01 2.901063086850449e-01 5.964312919802763e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.860000000000000e+02 -3.786037313613034e-01 6.456068996304876e-01 2.900770369885673e-01 5.964111487562427e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.870000000000000e+02 -3.786032363857125e-01 6.456389418447483e-01 2.900477710983480e-01 5.963910098691447e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.880000000000000e+02 -3.786027353457415e-01 6.456709774457120e-01 2.900185109716881e-01 5.963708753508894e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.890000000000000e+02 -3.786022282029137e-01 6.457030064439763e-01 2.899892566234005e-01 5.963507452095678e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.900000000000000e+02 -3.786017148717650e-01 6.457350289136308e-01 2.899600080773583e-01 5.963306194099458e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.910000000000000e+02 -3.786011954395611e-01 6.457670447882671e-01 2.899307653104141e-01 5.963104979821177e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.920000000000000e+02 -3.786006699249048e-01 6.457990540694265e-01 2.899015283161556e-01 5.962903809180596e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.930000000000000e+02 -3.786001382308640e-01 6.458310568134881e-01 2.898722971257435e-01 5.962702682054410e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.940000000000000e+02 -3.785996004265266e-01 6.458630529727816e-01 2.898430717203348e-01 5.962501598635200e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.950000000000000e+02 -3.785990565432507e-01 6.458950425380454e-01 2.898138520901185e-01 5.962300558895232e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.960000000000000e+02 -3.785985064798715e-01 6.459270255621642e-01 2.897846382684901e-01 5.962099562765004e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.970000000000000e+02 -3.785979503603216e-01 6.459590019815360e-01 2.897554302172131e-01 5.961898610355758e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.980000000000000e+02 -3.785973880349156e-01 6.459909718905437e-01 2.897262279825513e-01 5.961697701393902e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.990000000000000e+02 -3.785968196429108e-01 6.460229351937934e-01 2.896970315251458e-01 5.961496836243292e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.000000000000000e+02 -3.785962451478748e-01 6.460548919153741e-01 2.896678408569398e-01 5.961296014839585e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.010000000000000e+02 -3.785956644821100e-01 6.460868421151604e-01 2.896386559969933e-01 5.961095236894516e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.020000000000000e+02 -3.785950777222000e-01 6.461187857276319e-01 2.896094769262013e-01 5.960894502747921e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.030000000000000e+02 -3.785944848836829e-01 6.461507227542792e-01 2.895803036393571e-01 5.960693812333587e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.040000000000000e+02 -3.785938858567438e-01 6.461826532623742e-01 2.895511361711198e-01 5.960493165474672e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.050000000000000e+02 -3.785932807415809e-01 6.462145771915812e-01 2.895219744921891e-01 5.960292562354441e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.060000000000000e+02 -3.785926695545482e-01 6.462464945300874e-01 2.894928185990808e-01 5.960092003037318e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.070000000000000e+02 -3.785920521613407e-01 6.462784053703188e-01 2.894636685323271e-01 5.959891487200667e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.080000000000000e+02 -3.785914287542185e-01 6.463103095830687e-01 2.894345242365629e-01 5.959691015316414e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.090000000000000e+02 -3.785907991297128e-01 6.463422073078021e-01 2.894053857725713e-01 5.959490586892751e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.100000000000000e+02 -3.785901634509597e-01 6.463740984371259e-01 2.893762530932538e-01 5.959290202309983e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.110000000000000e+02 -3.785895216821121e-01 6.464059829926038e-01 2.893471262107291e-01 5.959089861526402e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.120000000000000e+02 -3.785888737118860e-01 6.464378610467595e-01 2.893180051594810e-01 5.958889564318126e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.130000000000000e+02 -3.785882196958363e-01 6.464697325143438e-01 2.892888898919777e-01 5.958689310875648e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.140000000000000e+02 -3.785875595829166e-01 6.465015974102674e-01 2.892597804274172e-01 5.958489101291590e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.150000000000000e+02 -3.785868932994694e-01 6.465334558005763e-01 2.892306767863266e-01 5.958288935240922e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.160000000000000e+02 -3.785862209162381e-01 6.465653076237217e-01 2.892015789512453e-01 5.958088813049954e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.170000000000000e+02 -3.785855424788712e-01 6.465971528649521e-01 2.891724869074652e-01 5.957888734683358e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.180000000000000e+02 -3.785848578576946e-01 6.466289916029291e-01 2.891434006958793e-01 5.957688699936161e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.190000000000000e+02 -3.785841671331091e-01 6.466608237907696e-01 2.891143202929046e-01 5.957488708943940e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.200000000000000e+02 -3.785834703652434e-01 6.466926493868832e-01 2.890852456821997e-01 5.957288761878553e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.210000000000000e+02 -3.785827674147284e-01 6.467244684913898e-01 2.890561769052267e-01 5.957088858360847e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.220000000000000e+02 -3.785820584106734e-01 6.467562810031590e-01 2.890271139272829e-01 5.956888998859773e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.230000000000000e+02 -3.785813432402120e-01 6.467880870212692e-01 2.889980567794460e-01 5.956689182889333e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.240000000000000e+02 -3.785806219891629e-01 6.468198864696728e-01 2.889690054404480e-01 5.956489410856166e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.250000000000000e+02 -3.785798946579145e-01 6.468516793622705e-01 2.889399599091722e-01 5.956289682635481e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.260000000000000e+02 -3.785791611756268e-01 6.468834657462031e-01 2.889109202079821e-01 5.956089998080257e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.270000000000000e+02 -3.785784215906012e-01 6.469152455815548e-01 2.888818863249736e-01 5.955890357397883e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.280000000000000e+02 -3.785776759606490e-01 6.469470188452892e-01 2.888528582418312e-01 5.955690760583120e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.290000000000000e+02 -3.785769241463301e-01 6.469787856205944e-01 2.888238360027250e-01 5.955491207427612e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.300000000000000e+02 -3.785761662447764e-01 6.470105458470755e-01 2.887948195794248e-01 5.955291698130027e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.310000000000000e+02 -3.785754022972324e-01 6.470422994959830e-01 2.887658089610959e-01 5.955092232816240e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.320000000000000e+02 -3.785746321610537e-01 6.470740466696648e-01 2.887368041902509e-01 5.954892811098014e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.330000000000000e+02 -3.785738560051442e-01 6.471057872526546e-01 2.887078052184281e-01 5.954693433414325e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.340000000000000e+02 -3.785730736536025e-01 6.471375213656763e-01 2.886788120985911e-01 5.954494099337906e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.350000000000000e+02 -3.785722852569927e-01 6.471692489141097e-01 2.886498247864319e-01 5.954294809177721e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.360000000000000e+02 -3.785714907714416e-01 6.472009699143670e-01 2.886208432981129e-01 5.954095562979127e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.370000000000000e+02 -3.785706901298839e-01 6.472326844237544e-01 2.885918676529619e-01 5.953896360475043e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.380000000000000e+02 -3.785698834194463e-01 6.472643923801890e-01 2.885628978269534e-01 5.953697201925903e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.390000000000000e+02 -3.785690706390566e-01 6.472960937921881e-01 2.885339338203770e-01 5.953498087267637e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.400000000000000e+02 -3.785682516918139e-01 6.473277887182562e-01 2.885049756643074e-01 5.953299016352811e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.410000000000000e+02 -3.785674266676470e-01 6.473594771050105e-01 2.884760233322392e-01 5.953099989341523e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.420000000000000e+02 -3.785665955925101e-01 6.473911589340983e-01 2.884470768178105e-01 5.952901006322230e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.430000000000000e+02 -3.785657583485826e-01 6.474228342888599e-01 2.884181361566343e-01 5.952702066988361e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.440000000000000e+02 -3.785649150337327e-01 6.474545030977837e-01 2.883892013218166e-01 5.952503171648628e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.450000000000000e+02 -3.785640656549613e-01 6.474861653681339e-01 2.883602723106087e-01 5.952304320215890e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.460000000000000e+02 -3.785632101120032e-01 6.475178211543421e-01 2.883313491560923e-01 5.952105512598516e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.470000000000000e+02 -3.785623485400132e-01 6.475494703808563e-01 2.883024318169885e-01 5.951906748981813e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.480000000000000e+02 -3.785614807957823e-01 6.475811131398043e-01 2.882735203377417e-01 5.951708029082091e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.490000000000000e+02 -3.785606070117183e-01 6.476127493382966e-01 2.882446146809077e-01 5.951509353272220e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.500000000000000e+02 -3.785597271490428e-01 6.476443790126147e-01 2.882157148575681e-01 5.951310721373468e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.510000000000000e+02 -3.785588411230075e-01 6.476760022108800e-01 2.881868208955983e-01 5.951112133289258e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.520000000000000e+02 -3.785579490228539e-01 6.477076188801685e-01 2.881579327686336e-01 5.950913589178559e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.530000000000000e+02 -3.785570508884366e-01 6.477392290032703e-01 2.881290504645453e-01 5.950715089056930e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.540000000000000e+02 -3.785561465826948e-01 6.477708326617714e-01 2.881001740269951e-01 5.950516632719818e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.550000000000000e+02 -3.785552362086175e-01 6.478024297912738e-01 2.880713034258685e-01 5.950318220381838e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.560000000000000e+02 -3.785543197861695e-01 6.478340203774942e-01 2.880424386565466e-01 5.950119852116871e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.570000000000000e+02 -3.785533972011369e-01 6.478656045034413e-01 2.880135797533386e-01 5.949921527604682e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.580000000000000e+02 -3.785524685933582e-01 6.478971820755209e-01 2.879847266757862e-01 5.949723247193492e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.590000000000000e+02 -3.785515338098454e-01 6.479287531988783e-01 2.879558794703270e-01 5.949525010509924e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.600000000000000e+02 -3.785505929880082e-01 6.479603177750958e-01 2.879270380982782e-01 5.949326817961650e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.610000000000000e+02 -3.785496461151629e-01 6.479918758163377e-01 2.878982025640079e-01 5.949128669498776e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.620000000000000e+02 -3.785486930599963e-01 6.480234274108863e-01 2.878693729079011e-01 5.948930564822794e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.630000000000000e+02 -3.785477339617604e-01 6.480549724802660e-01 2.878405490874234e-01 5.948732504131183e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.640000000000000e+02 -3.785467688170743e-01 6.480865110133543e-01 2.878117311068163e-01 5.948534487569082e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.650000000000000e+02 -3.785457975027537e-01 6.481180430950233e-01 2.877829190037526e-01 5.948336514836408e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.660000000000000e+02 -3.785448201192513e-01 6.481495686689498e-01 2.877541127478127e-01 5.948138586077641e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.670000000000000e+02 -3.785438367168389e-01 6.481810876938702e-01 2.877253123263706e-01 5.947940701506522e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.680000000000000e+02 -3.785428471486857e-01 6.482126002686249e-01 2.876965177844455e-01 5.947742860785584e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.690000000000000e+02 -3.785418515196793e-01 6.482441063359893e-01 2.876677290899578e-01 5.947545064048984e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.700000000000000e+02 -3.785408498183911e-01 6.482756058924363e-01 2.876389462492084e-01 5.947347311400352e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.710000000000000e+02 -3.785398420068814e-01 6.483070989712039e-01 2.876101692736657e-01 5.947149602686318e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.720000000000000e+02 -3.785388281582336e-01 6.483385855177438e-01 2.875813981435149e-01 5.946951938155072e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.730000000000000e+02 -3.785378081419300e-01 6.483700656282753e-01 2.875526328976709e-01 5.946754317423135e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.740000000000000e+02 -3.785367820923396e-01 6.484015392106794e-01 2.875238734975761e-01 5.946556740848845e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.750000000000000e+02 -3.785357499853472e-01 6.484330062848924e-01 2.874951199509940e-01 5.946359208353722e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.760000000000000e+02 -3.785347117367079e-01 6.484644669050597e-01 2.874663722847777e-01 5.946161719776665e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.770000000000000e+02 -3.785336674103765e-01 6.484959210312017e-01 2.874376304805780e-01 5.945964275258090e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.780000000000000e+02 -3.785326170733109e-01 6.485273686191764e-01 2.874088945194684e-01 5.945766874967553e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.790000000000000e+02 -3.785315605709788e-01 6.485588097773035e-01 2.873801644481872e-01 5.945569518504344e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.800000000000000e+02 -3.785304980035197e-01 6.485902444303924e-01 2.873514402392743e-01 5.945372206206656e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.810000000000000e+02 -3.785294294173709e-01 6.486216725588516e-01 2.873227218782416e-01 5.945174938085473e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.820000000000000e+02 -3.785283546614410e-01 6.486530942644236e-01 2.872940094114887e-01 5.944977713791386e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.830000000000000e+02 -3.785272739118097e-01 6.486845094288380e-01 2.872653027875785e-01 5.944780533765081e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.840000000000000e+02 -3.785261869897446e-01 6.487159181620530e-01 2.872366020627773e-01 5.944583397695747e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.850000000000000e+02 -3.785250940353377e-01 6.487473203871118e-01 2.872079071937844e-01 5.944386305763173e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.860000000000000e+02 -3.785239950404221e-01 6.487787161046241e-01 2.871792181849468e-01 5.944189258014561e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.870000000000000e+02 -3.785228898909720e-01 6.488101053932345e-01 2.871505350713617e-01 5.943992254170910e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.880000000000000e+02 -3.785217786978524e-01 6.488414881810415e-01 2.871218578206878e-01 5.943795294490064e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.890000000000000e+02 -3.785206614687475e-01 6.488728644642238e-01 2.870931864315751e-01 5.943598378994157e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.900000000000000e+02 -3.785195380940103e-01 6.489042343078600e-01 2.870645209394787e-01 5.943401507522562e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.910000000000000e+02 -3.785184086597786e-01 6.489355976674571e-01 2.870358613177503e-01 5.943204680163946e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.920000000000000e+02 -3.785172732104680e-01 6.489669545099674e-01 2.870072075547666e-01 5.943007897075225e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.930000000000000e+02 -3.785161315899877e-01 6.489983049468905e-01 2.869785596975219e-01 5.942811157828843e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.940000000000000e+02 -3.785149839507591e-01 6.490296488632258e-01 2.869499177035633e-01 5.942614462937611e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.950000000000000e+02 -3.785138302502616e-01 6.490609862998948e-01 2.869212815848401e-01 5.942417812190565e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.960000000000000e+02 -3.785126704271993e-01 6.490923173039004e-01 2.868926513601483e-01 5.942221205396746e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.970000000000000e+02 -3.785115045870463e-01 6.491236417901792e-01 2.868640270012255e-01 5.942024642972679e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.980000000000000e+02 -3.785103325941735e-01 6.491549598690114e-01 2.868354085470441e-01 5.941828124412223e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.990000000000000e+02 -3.785091545921786e-01 6.491862714313981e-01 2.868067959577312e-01 5.941631650206648e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.000000000000000e+03 -3.785079705333813e-01 6.492175765154173e-01 2.867781892477676e-01 5.941435220196554e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.001000000000000e+03 -3.785067803407690e-01 6.492488751724155e-01 2.867495884416359e-01 5.941238834216064e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.002000000000000e+03 -3.785055840879212e-01 6.492801673579659e-01 2.867209935176843e-01 5.941042492409101e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.003000000000000e+03 -3.785043818235530e-01 6.493114530382093e-01 2.866924044626463e-01 5.940846194922118e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.004000000000000e+03 -3.785031734173377e-01 6.493427323028828e-01 2.866638213165836e-01 5.940649941434065e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.005000000000000e+03 -3.785019589622228e-01 6.493740050901468e-01 2.866352440527104e-01 5.940453732180607e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.006000000000000e+03 -3.785007384890910e-01 6.494052713846228e-01 2.866066726620853e-01 5.940257567198963e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.007000000000000e+03 -3.784995118701513e-01 6.494365312616266e-01 2.865781071860054e-01 5.940061446303480e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.008000000000000e+03 -3.784982792385703e-01 6.494677846447608e-01 2.865495475836055e-01 5.939865369700721e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.009000000000000e+03 -3.784970404882174e-01 6.494990316073003e-01 2.865209938877586e-01 5.939669337129895e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.010000000000000e+03 -3.784957956899337e-01 6.495302720939801e-01 2.864924460795616e-01 5.939473348857739e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.011000000000000e+03 -3.784945448787399e-01 6.495615060844878e-01 2.864639041491551e-01 5.939277404953497e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.012000000000000e+03 -3.784932879100246e-01 6.495927336803972e-01 2.864353681405971e-01 5.939081505038035e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.013000000000000e+03 -3.784920249055247e-01 6.496239548045066e-01 2.864068380177990e-01 5.938885649376608e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.014000000000000e+03 -3.784907559021888e-01 6.496551694246115e-01 2.863783137719567e-01 5.938689838151170e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.015000000000000e+03 -3.784894807359123e-01 6.496863776597814e-01 2.863497954523216e-01 5.938494070890237e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.016000000000000e+03 -3.784881995423093e-01 6.497175794170228e-01 2.863212830196195e-01 5.938298347958822e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.017000000000000e+03 -3.784869123308900e-01 6.497487746891474e-01 2.862927764722578e-01 5.938102669405326e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.018000000000000e+03 -3.784856189709210e-01 6.497799635704019e-01 2.862642758498644e-01 5.937907034863368e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.019000000000000e+03 -3.784843195876104e-01 6.498111459769872e-01 2.862357811159227e-01 5.937711444650506e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.020000000000000e+03 -3.784830141835070e-01 6.498423219043351e-01 2.862072922712490e-01 5.937515898819216e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.021000000000000e+03 -3.784817026327345e-01 6.498734914391580e-01 2.861788093546965e-01 5.937320397058199e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.022000000000000e+03 -3.784803851141317e-01 6.499046544697332e-01 2.861503323122711e-01 5.937124939733138e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.023000000000000e+03 -3.784790614277876e-01 6.499358111225753e-01 2.861218612066397e-01 5.936929526454139e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.024000000000000e+03 -3.784777317483882e-01 6.499669612844441e-01 2.860933959857777e-01 5.936734157620553e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.025000000000000e+03 -3.784763960127119e-01 6.499981049997545e-01 2.860649366695350e-01 5.936538833076157e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.026000000000000e+03 -3.784750541748129e-01 6.500292423029435e-01 2.860364832725326e-01 5.936343552688944e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.027000000000000e+03 -3.784737062942703e-01 6.500603731485212e-01 2.860080357788351e-01 5.936148316676533e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.028000000000000e+03 -3.784723523957365e-01 6.500914975232214e-01 2.859795941816480e-01 5.935953125082382e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.029000000000000e+03 -3.784709923659994e-01 6.501226155135968e-01 2.859511585147693e-01 5.935757977540163e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.030000000000000e+03 -3.784696263002248e-01 6.501537270520547e-01 2.859227287512592e-01 5.935562874335715e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.031000000000000e+03 -3.784682542392729e-01 6.501848321058407e-01 2.858943048807711e-01 5.935367815639715e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.032000000000000e+03 -3.784668760311434e-01 6.502159307794456e-01 2.858658869500654e-01 5.935172801074110e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.033000000000000e+03 -3.784654918378885e-01 6.502470229704429e-01 2.858374749103938e-01 5.934977830984978e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.034000000000000e+03 -3.784641015156893e-01 6.502781087819834e-01 2.858090688054200e-01 5.934782904971568e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.035000000000000e+03 -3.784627051744552e-01 6.503091881300976e-01 2.857806686047368e-01 5.934588023421983e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.036000000000000e+03 -3.784613028170685e-01 6.503402610184436e-01 2.857522743077370e-01 5.934393186303261e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.037000000000000e+03 -3.784598943272465e-01 6.503713275250929e-01 2.857238859508318e-01 5.934198393348625e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.038000000000000e+03 -3.784584798179214e-01 6.504023875788147e-01 2.856955035003862e-01 5.934003644802943e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.039000000000000e+03 -3.784570592961416e-01 6.504334411740891e-01 2.856671269555268e-01 5.933808940708528e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.040000000000000e+03 -3.784556326390818e-01 6.504644883955540e-01 2.856387563543196e-01 5.933614280760253e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.041000000000000e+03 -3.784541999663532e-01 6.504955291610909e-01 2.856103916620890e-01 5.933419665284837e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.042000000000000e+03 -3.784527612843087e-01 6.505265634741054e-01 2.855820328768524e-01 5.933225094236499e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.043000000000000e+03 -3.784513164743636e-01 6.505575914100108e-01 2.855536800364071e-01 5.933030567385371e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.044000000000000e+03 -3.784498656452640e-01 6.505886128983061e-01 2.855253331086637e-01 5.932836084987739e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.045000000000000e+03 -3.784484087898411e-01 6.506196279494845e-01 2.854969920960317e-01 5.932641646985179e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.046000000000000e+03 -3.784469458310253e-01 6.506506366064821e-01 2.854686570245038e-01 5.932447253295851e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.047000000000000e+03 -3.784454768880556e-01 6.506816387981055e-01 2.854403278577376e-01 5.932252904137274e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.048000000000000e+03 -3.784440018143294e-01 6.507126346230623e-01 2.854120046413307e-01 5.932058599165101e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.049000000000000e+03 -3.784425207267428e-01 6.507436240010757e-01 2.853836873413653e-01 5.931864338699776e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.050000000000000e+03 -3.784410336378840e-01 6.507746069313044e-01 2.853553759539761e-01 5.931670122711320e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.051000000000000e+03 -3.784395404086711e-01 6.508055835010004e-01 2.853270705235104e-01 5.931475950938925e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.052000000000000e+03 -3.784380411831261e-01 6.508365536219881e-01 2.852987710062197e-01 5.931281823664024e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.053000000000000e+03 -3.784365359315314e-01 6.508675173074272e-01 2.852704774132733e-01 5.931087740900582e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.054000000000000e+03 -3.784350245730148e-01 6.508984746197446e-01 2.852421897692120e-01 5.930893702383953e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.055000000000000e+03 -3.784335072010012e-01 6.509294254925208e-01 2.852139080474707e-01 5.930699708397110e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.056000000000000e+03 -3.784319837974517e-01 6.509603699457540e-01 2.851856322534056e-01 5.930505758832357e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.057000000000000e+03 -3.784304543054441e-01 6.509913080107850e-01 2.851573624066545e-01 5.930311853636894e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.058000000000000e+03 -3.784289188353105e-01 6.510222396203591e-01 2.851290984738063e-01 5.930117993027999e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.059000000000000e+03 -3.784273772247877e-01 6.510531648880671e-01 2.851008405046104e-01 5.929924176577338e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.060000000000000e+03 -3.784258296182734e-01 6.510840837085753e-01 2.850725884577660e-01 5.929730404740807e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.061000000000000e+03 -3.784242760151387e-01 6.511149960879177e-01 2.850443423337081e-01 5.929536677476521e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.062000000000000e+03 -3.784227162798416e-01 6.511459021193903e-01 2.850161021744834e-01 5.929342994445308e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.063000000000000e+03 -3.784211505384890e-01 6.511768017206624e-01 2.849878679426390e-01 5.929149355948831e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.064000000000000e+03 -3.784195787924666e-01 6.512076948858395e-01 2.849596396396458e-01 5.928955762058330e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.065000000000000e+03 -3.784180009365526e-01 6.512385816918044e-01 2.849314172977663e-01 5.928762212468268e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.066000000000000e+03 -3.784164170594224e-01 6.512694620817007e-01 2.849032008908203e-01 5.928568707385337e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.067000000000000e+03 -3.784148271900515e-01 6.513003360350780e-01 2.848749904112919e-01 5.928375246907744e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.068000000000000e+03 -3.784132312045798e-01 6.513312036372811e-01 2.848467858977448e-01 5.928181830725541e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.069000000000000e+03 -3.784116292156953e-01 6.513620648129981e-01 2.848185873170587e-01 5.927988459128324e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.070000000000000e+03 -3.784100212029781e-01 6.513929195796171e-01 2.847903946759748e-01 5.927795132045360e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.071000000000000e+03 -3.784084071049252e-01 6.514237679758225e-01 2.847622079948966e-01 5.927601849368482e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.072000000000000e+03 -3.784067870314799e-01 6.514546099303893e-01 2.847340272410937e-01 5.927408611358126e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.073000000000000e+03 -3.784051608379865e-01 6.514854455428165e-01 2.847058524594472e-01 5.927215417650981e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.074000000000000e+03 -3.784035286478294e-01 6.515162747283981e-01 2.846776836138979e-01 5.927022268585866e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.075000000000000e+03 -3.784018904571325e-01 6.515470974953715e-01 2.846495207058582e-01 5.926829164112546e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.076000000000000e+03 -3.784002461386800e-01 6.515779139313671e-01 2.846213637749614e-01 5.926636103911860e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.077000000000000e+03 -3.783985958374532e-01 6.516087239327564e-01 2.845932127792524e-01 5.926443088421182e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.078000000000000e+03 -3.783969395461554e-01 6.516395275143253e-01 2.845650677205179e-01 5.926250117538303e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.079000000000000e+03 -3.783952771228384e-01 6.516703247652884e-01 2.845369286441842e-01 5.926057190992745e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.080000000000000e+03 -3.783936086999090e-01 6.517011156032377e-01 2.845087955101037e-01 5.925864309060288e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.081000000000000e+03 -3.783919342829749e-01 6.517319000278426e-01 2.844806683171456e-01 5.925671471736491e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.082000000000000e+03 -3.783902537682923e-01 6.517626780938769e-01 2.844525471005077e-01 5.925478678934710e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.083000000000000e+03 -3.783885672852591e-01 6.517934497421872e-01 2.844244318175497e-01 5.925285930706229e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.084000000000000e+03 -3.783868746722807e-01 6.518242150563741e-01 2.843963225226437e-01 5.925093226924636e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.085000000000000e+03 -3.783851761038724e-01 6.518549739443513e-01 2.843682191598855e-01 5.924900567779058e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.086000000000000e+03 -3.783834715147933e-01 6.518857264329099e-01 2.843401217528913e-01 5.924707953300330e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.087000000000000e+03 -3.783817608127057e-01 6.519164725901625e-01 2.843120303301452e-01 5.924515383214286e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.088000000000000e+03 -3.783800441291769e-01 6.519472123342628e-01 2.842839448516871e-01 5.924322857795217e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.089000000000000e+03 -3.783783214427364e-01 6.519779456727598e-01 2.842558653262329e-01 5.924130377077632e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.090000000000000e+03 -3.783765926430701e-01 6.520086726902196e-01 2.842277917870715e-01 5.923937940697923e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.091000000000000e+03 -3.783748578602009e-01 6.520393932910785e-01 2.841997241969902e-01 5.923745549078131e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.092000000000000e+03 -3.783731170873360e-01 6.520701074918795e-01 2.841716625572953e-01 5.923553202095552e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.093000000000000e+03 -3.783713702100630e-01 6.521008153567750e-01 2.841436069061524e-01 5.923360899613922e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.094000000000000e+03 -3.783696173197513e-01 6.521315168376025e-01 2.841155572147656e-01 5.923168641740129e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.095000000000000e+03 -3.783678584539541e-01 6.521622119038457e-01 2.840875134736165e-01 5.922976428638139e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.096000000000000e+03 -3.783660934868412e-01 6.521929006464111e-01 2.840594757213937e-01 5.922784259947467e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.097000000000000e+03 -3.783643225508934e-01 6.522235829787150e-01 2.840314439183579e-01 5.922592135987954e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.098000000000000e+03 -3.783625455300121e-01 6.522542589702781e-01 2.840034181025592e-01 5.922400056575425e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.099000000000000e+03 -3.783607625033148e-01 6.522849285770540e-01 2.839753982495494e-01 5.922208021828915e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.100000000000000e+03 -3.783589734930652e-01 6.523155917789331e-01 2.839473843544409e-01 5.922016031873316e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.101000000000000e+03 -3.783571783845934e-01 6.523462486634428e-01 2.839193764519092e-01 5.921824086333043e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.102000000000000e+03 -3.783553772842144e-01 6.523768991595865e-01 2.838913745105432e-01 5.921632185483636e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.103000000000000e+03 -3.783535701901781e-01 6.524075432614913e-01 2.838633785330770e-01 5.921440329410053e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.104000000000000e+03 -3.783517570045588e-01 6.524381810410694e-01 2.838353885497731e-01 5.921248517822769e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.105000000000000e+03 -3.783499378259016e-01 6.524688124326122e-01 2.838074045315628e-01 5.921056750977572e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.106000000000000e+03 -3.783481126593995e-01 6.524994374318451e-01 2.837794264780816e-01 5.920865028912305e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.107000000000000e+03 -3.783462813937886e-01 6.525300561197591e-01 2.837514544236638e-01 5.920673351302973e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.108000000000000e+03 -3.783444441806288e-01 6.525606683967745e-01 2.837234883226775e-01 5.920481718519344e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.109000000000000e+03 -3.783426008667965e-01 6.525912743618351e-01 2.836955282238475e-01 5.920290130238013e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.110000000000000e+03 -3.783407515781268e-01 6.526218739243300e-01 2.836675740907573e-01 5.920098586850212e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.111000000000000e+03 -3.783388962884032e-01 6.526524671203343e-01 2.836396259296378e-01 5.919907088118098e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.112000000000000e+03 -3.783370349226582e-01 6.526830539934844e-01 2.836116837657756e-01 5.919715633940632e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.113000000000000e+03 -3.783351675404171e-01 6.527136345004122e-01 2.835837475825955e-01 5.919524224517014e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.114000000000000e+03 -3.783332941923453e-01 6.527442086164260e-01 2.835558173642331e-01 5.919332859893806e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.115000000000000e+03 -3.783314147686321e-01 6.527747764109887e-01 2.835278931462694e-01 5.919141539858518e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.116000000000000e+03 -3.783295293328994e-01 6.528053378421579e-01 2.834999749102108e-01 5.918950264577689e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.117000000000000e+03 -3.783276379257410e-01 6.528358928878797e-01 2.834720626439109e-01 5.918759034115353e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.118000000000000e+03 -3.783257404259207e-01 6.528664416296110e-01 2.834441563857936e-01 5.918567848186032e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.119000000000000e+03 -3.783238369328001e-01 6.528969840010789e-01 2.834162561064583e-01 5.918376707048459e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.120000000000000e+03 -3.783219274650569e-01 6.529275199930389e-01 2.833883618007604e-01 5.918185610731936e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.121000000000000e+03 -3.783200119089883e-01 6.529580496754993e-01 2.833604735058340e-01 5.917994559035186e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.122000000000000e+03 -3.783180904041352e-01 6.529885729654784e-01 2.833325911782705e-01 5.917803552211612e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.123000000000000e+03 -3.783161628135940e-01 6.530190899572048e-01 2.833047148609745e-01 5.917612589913303e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.124000000000000e+03 -3.783142292569521e-01 6.530496005601000e-01 2.832768445199869e-01 5.917421672559861e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.125000000000000e+03 -3.783122896918955e-01 6.530801048148643e-01 2.832489801674535e-01 5.917230799936560e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.126000000000000e+03 -3.783103440467328e-01 6.531106027650152e-01 2.832211218273883e-01 5.917039971928505e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.127000000000000e+03 -3.783083924233974e-01 6.531410943404179e-01 2.831932694698840e-01 5.916849188823253e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.128000000000000e+03 -3.783064348262830e-01 6.531715795499743e-01 2.831654230928285e-01 5.916658450526601e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.129000000000000e+03 -3.783044711496272e-01 6.532020584625021e-01 2.831375827303205e-01 5.916467756813872e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.130000000000000e+03 -3.783025014765710e-01 6.532325310122326e-01 2.831097483594923e-01 5.916277108010972e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.131000000000000e+03 -3.783005258294233e-01 6.532629971958704e-01 2.830819199727584e-01 5.916086504069956e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.132000000000000e+03 -3.782985441130064e-01 6.532934570834524e-01 2.830540975996824e-01 5.915895944706604e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.133000000000000e+03 -3.782965564328736e-01 6.533239105940610e-01 2.830262812104425e-01 5.915705430304156e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.134000000000000e+03 -3.782945626753961e-01 6.533543578102939e-01 2.829984708402528e-01 5.915514960530552e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.135000000000000e+03 -3.782925629561564e-01 6.533847986527205e-01 2.829706664549824e-01 5.915324535709175e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.136000000000000e+03 -3.782905572572367e-01 6.534152331412139e-01 2.829428680599949e-01 5.915134155731440e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.137000000000000e+03 -3.782885454555548e-01 6.534456613542786e-01 2.829150756950620e-01 5.914943820348995e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.138000000000000e+03 -3.782865276949824e-01 6.534760831953293e-01 2.828872893170506e-01 5.914753529936948e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.139000000000000e+03 -3.782845039550406e-01 6.535064986859812e-01 2.828595089321095e-01 5.914563284380042e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.140000000000000e+03 -3.782824741477753e-01 6.535369078808254e-01 2.828317345692778e-01 5.914373083520694e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.141000000000000e+03 -3.782804383449668e-01 6.535673107365634e-01 2.828039662068048e-01 5.914182927504159e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.142000000000000e+03 -3.782783965723598e-01 6.535977072286034e-01 2.827762038389965e-01 5.913992816486705e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.143000000000000e+03 -3.782763487345066e-01 6.536280974313763e-01 2.827484474948956e-01 5.913802750139335e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.144000000000000e+03 -3.782742949209665e-01 6.536584812894769e-01 2.827206971472898e-01 5.913612728653531e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.145000000000000e+03 -3.782722351156657e-01 6.536888588067827e-01 2.826929528032915e-01 5.913422752077181e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.146000000000000e+03 -3.782701692486539e-01 6.537192300298394e-01 2.826652144857931e-01 5.913232820255678e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.147000000000000e+03 -3.782680974511932e-01 6.537495948728540e-01 2.826374821550283e-01 5.913042933509783e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.148000000000000e+03 -3.782660195710849e-01 6.537799534488899e-01 2.826097558574562e-01 5.912853091362951e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.149000000000000e+03 -3.782639357085844e-01 6.538103056826287e-01 2.825820355645370e-01 5.912663294164843e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.150000000000000e+03 -3.782618458887898e-01 6.538406515604415e-01 2.825543212691125e-01 5.912473541961724e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.151000000000000e+03 -3.782597499911270e-01 6.538709911654438e-01 2.825266130092874e-01 5.912283834445624e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.152000000000000e+03 -3.782576481129568e-01 6.539013244327052e-01 2.824989107560741e-01 5.912094171872099e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.153000000000000e+03 -3.782555402900173e-01 6.539316513392469e-01 2.824712144993732e-01 5.911904554336801e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.154000000000000e+03 -3.782534263728545e-01 6.539619719878459e-01 2.824435242861701e-01 5.911714981456490e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.155000000000000e+03 -3.782513064968062e-01 6.539922862856110e-01 2.824158400761336e-01 5.911525453607303e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.156000000000000e+03 -3.782491806243024e-01 6.540225942636803e-01 2.823881618810023e-01 5.911335970650953e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.157000000000000e+03 -3.782470487232391e-01 6.540528959428323e-01 2.823604897120880e-01 5.911146532530759e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.158000000000000e+03 -3.782449108706081e-01 6.540831912721096e-01 2.823328235465303e-01 5.910957139448928e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.159000000000000e+03 -3.782427669330466e-01 6.541134803475418e-01 2.823051634257550e-01 5.910767791020189e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.160000000000000e+03 -3.782406170501921e-01 6.541437630669950e-01 2.822775093090557e-01 5.910578487697438e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.161000000000000e+03 -3.782384611991431e-01 6.541740394516186e-01 2.822498612036706e-01 5.910389229380458e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.162000000000000e+03 -3.782362992737828e-01 6.542043095725819e-01 2.822222191436624e-01 5.910200015819782e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.163000000000000e+03 -3.782341313735319e-01 6.542345733677533e-01 2.821945830986857e-01 5.910010847233554e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.164000000000000e+03 -3.782319575132055e-01 6.542648308283938e-01 2.821669530650478e-01 5.909821723663153e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.165000000000000e+03 -3.782297775951563e-01 6.542950820199072e-01 2.821393290742225e-01 5.909632644880976e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.166000000000000e+03 -3.782275916990595e-01 6.543253268830848e-01 2.821117111035648e-01 5.909443611162498e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.167000000000000e+03 -3.782253998538075e-01 6.543555654164307e-01 2.820840991424119e-01 5.909254622412075e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.168000000000000e+03 -3.782232019312668e-01 6.543857976850712e-01 2.820564932349265e-01 5.909065678539621e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.169000000000000e+03 -3.782209980444125e-01 6.544160236344670e-01 2.820288933439208e-01 5.908876779625248e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.170000000000000e+03 -3.782187881964360e-01 6.544462432490704e-01 2.820012994715776e-01 5.908687925832093e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.171000000000000e+03 -3.782165722841667e-01 6.544764566106633e-01 2.819737116491249e-01 5.908499116787463e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.172000000000000e+03 -3.782143504492526e-01 6.545066636242585e-01 2.819461298337329e-01 5.908310352862920e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.173000000000000e+03 -3.782121225492339e-01 6.545368643773577e-01 2.819185540720307e-01 5.908121633800335e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.174000000000000e+03 -3.782098886722090e-01 6.545670588155302e-01 2.818909843370930e-01 5.907932959788951e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.175000000000000e+03 -3.782076488579537e-01 6.545972469235533e-01 2.818634206158763e-01 5.907744330826792e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.176000000000000e+03 -3.782054029658021e-01 6.546274287835033e-01 2.818358629551411e-01 5.907555746703584e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.177000000000000e+03 -3.782031511158129e-01 6.546576043254948e-01 2.818083113171089e-01 5.907367207627040e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.178000000000000e+03 -3.782008933139444e-01 6.546877735405069e-01 2.817807657017864e-01 5.907178713680699e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.179000000000000e+03 -3.781986294458072e-01 6.547179365095475e-01 2.817532261452204e-01 5.906990264548888e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.180000000000000e+03 -3.781963596242692e-01 6.547480931571121e-01 2.817256926134752e-01 5.906801860529385e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.181000000000000e+03 -3.781940838246970e-01 6.547782434992125e-01 2.816981651153309e-01 5.906613501582271e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.182000000000000e+03 -3.781918019784658e-01 6.548083875877999e-01 2.816706436724095e-01 5.906425187489616e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.183000000000000e+03 -3.781895142197868e-01 6.548385253308393e-01 2.816431282444106e-01 5.906236918626243e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.184000000000000e+03 -3.781872203891560e-01 6.548686568379544e-01 2.816156188816581e-01 5.906048694579806e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.185000000000000e+03 -3.781849206085665e-01 6.548987820316272e-01 2.815881155467076e-01 5.905860515628842e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.186000000000000e+03 -3.781826148596794e-01 6.549289009151761e-01 2.815606182477188e-01 5.905672381836781e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.187000000000000e+03 -3.781803030699599e-01 6.549590135474166e-01 2.815331270068774e-01 5.905484292931766e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.188000000000000e+03 -3.781779853075493e-01 6.549891198832917e-01 2.815056418040026e-01 5.905296249094965e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.189000000000000e+03 -3.781756616005730e-01 6.550192198986865e-01 2.814781626322485e-01 5.905108250468052e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.190000000000000e+03 -3.781733318450328e-01 6.550493136780410e-01 2.814506895228696e-01 5.904920296653084e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.191000000000000e+03 -3.781709961130155e-01 6.550794011567985e-01 2.814232224570908e-01 5.904732388015623e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.192000000000000e+03 -3.781686544407765e-01 6.551094823179167e-01 2.813957614235713e-01 5.904544524588266e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.193000000000000e+03 -3.781663067214420e-01 6.551395572393867e-01 2.813683064557880e-01 5.904356706052289e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.194000000000000e+03 -3.781639530333555e-01 6.551696258734054e-01 2.813408575297224e-01 5.904168932572380e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.195000000000000e+03 -3.781615933965140e-01 6.551996881971879e-01 2.813134146416892e-01 5.903981204312480e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.196000000000000e+03 -3.781592277116554e-01 6.552297442793403e-01 2.812859778234890e-01 5.903793521017129e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.197000000000000e+03 -3.781568561085862e-01 6.552597940434256e-01 2.812585470340961e-01 5.903605882920256e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.198000000000000e+03 -3.781544784487917e-01 6.552898375784738e-01 2.812311223184501e-01 5.903418289728458e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.199000000000000e+03 -3.781520948361238e-01 6.553198748130061e-01 2.812037036456053e-01 5.903230741738897e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.200000000000000e+03 -3.781497052833447e-01 6.553499057417697e-01 2.811762910121282e-01 5.903043238966121e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.201000000000000e+03 -3.781473096687610e-01 6.553799304465434e-01 2.811488844571173e-01 5.902855781117141e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.202000000000000e+03 -3.781449081016272e-01 6.554099488563705e-01 2.811214839472773e-01 5.902668368460002e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.203000000000000e+03 -3.781425005956399e-01 6.554399609716612e-01 2.810940894778924e-01 5.902481000946453e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.204000000000000e+03 -3.781400870381604e-01 6.554699668491244e-01 2.810667010882431e-01 5.902293678502896e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.205000000000000e+03 -3.781376675297328e-01 6.554999664426364e-01 2.810393187447442e-01 5.902106401178872e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.206000000000000e+03 -3.781352420689353e-01 6.555299597418969e-01 2.810119424506575e-01 5.901919169103921e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.207000000000000e+03 -3.781328105671330e-01 6.555599468145757e-01 2.809845722335590e-01 5.901731981984569e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.208000000000000e+03 -3.781303731354959e-01 6.555899275822132e-01 2.809572080604216e-01 5.901544840158821e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.209000000000000e+03 -3.781279296806137e-01 6.556199021199299e-01 2.809298499596476e-01 5.901357743277019e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.210000000000000e+03 -3.781254802657019e-01 6.556498703734123e-01 2.809024979144672e-01 5.901170691638845e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.211000000000000e+03 -3.781230249041485e-01 6.556798323348769e-01 2.808751519215710e-01 5.900983685282301e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.212000000000000e+03 -3.781205635026919e-01 6.557097880730430e-01 2.808478120103216e-01 5.900796723923193e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.213000000000000e+03 -3.781180961424646e-01 6.557397375381949e-01 2.808204781557432e-01 5.900609807734425e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.214000000000000e+03 -3.781156228590008e-01 6.557696806990682e-01 2.807931503489704e-01 5.900422936899461e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.215000000000000e+03 -3.781131435108640e-01 6.557996176634849e-01 2.807658286333383e-01 5.900236110941618e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.216000000000000e+03 -3.781106582120263e-01 6.558295483383695e-01 2.807385129769644e-01 5.900049330338191e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.217000000000000e+03 -3.781081669978799e-01 6.558594727198478e-01 2.807112033667326e-01 5.899862594989373e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.218000000000000e+03 -3.781056697238996e-01 6.558893908947500e-01 2.806838998505847e-01 5.899675904649528e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.219000000000000e+03 -3.781031665102400e-01 6.559193027930823e-01 2.806566023904111e-01 5.899489259529483e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.220000000000000e+03 -3.781006573407772e-01 6.559492084166575e-01 2.806293109937048e-01 5.899302659698274e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.221000000000000e+03 -3.780981421426101e-01 6.559791078182287e-01 2.806020256838780e-01 5.899116104946670e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.222000000000000e+03 -3.780956210385467e-01 6.560090009198010e-01 2.805747464228739e-01 5.898929595557320e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.223000000000000e+03 -3.780930938910485e-01 6.560388878139451e-01 2.805474732548524e-01 5.898743131193751e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.224000000000000e+03 -3.780905607846792e-01 6.560687684465026e-01 2.805202061540472e-01 5.898556712060221e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.225000000000000e+03 -3.780880217675755e-01 6.560986427797244e-01 2.804929451073193e-01 5.898370338352004e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.226000000000000e+03 -3.780854766853977e-01 6.561285109239201e-01 2.804656901630866e-01 5.898184009622609e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.227000000000000e+03 -3.780829256769246e-01 6.561583727901084e-01 2.804384412783791e-01 5.897997726197998e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.228000000000000e+03 -3.780803687212054e-01 6.561882283875868e-01 2.804111984615347e-01 5.897811488090844e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.229000000000000e+03 -3.780778057423956e-01 6.562180777711120e-01 2.803839617369093e-01 5.897625295083757e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.230000000000000e+03 -3.780752368129798e-01 6.562479208947471e-01 2.803567310824611e-01 5.897439147349361e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.231000000000000e+03 -3.780726619337288e-01 6.562777577508995e-01 2.803295065001042e-01 5.897253044979537e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.232000000000000e+03 -3.780700810434560e-01 6.563075883969334e-01 2.803022880076639e-01 5.897066987664843e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.233000000000000e+03 -3.780674942218573e-01 6.563374127632199e-01 2.802750755837229e-01 5.896880975792432e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.234000000000000e+03 -3.780649013823071e-01 6.563672309244470e-01 2.802478692540316e-01 5.896695008985418e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.235000000000000e+03 -3.780623026002672e-01 6.563970428179602e-01 2.802206689979080e-01 5.896509087577039e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.236000000000000e+03 -3.780596978914962e-01 6.564268484511361e-01 2.801934748086352e-01 5.896323211437469e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.237000000000000e+03 -3.780570871321542e-01 6.564566478925326e-01 2.801662867285189e-01 5.896137380417824e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.238000000000000e+03 -3.780544704381424e-01 6.564864410666424e-01 2.801391047219570e-01 5.895951594806135e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.239000000000000e+03 -3.780518478319686e-01 6.565162279741448e-01 2.801119287804533e-01 5.895765854512279e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.240000000000000e+03 -3.780492191605669e-01 6.565460086993076e-01 2.800847589561031e-01 5.895580159353245e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.241000000000000e+03 -3.780465845663832e-01 6.565757831611293e-01 2.800575952030292e-01 5.895394509556917e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.242000000000000e+03 -3.780439440560651e-01 6.566055513564050e-01 2.800304375199845e-01 5.895208905143670e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.243000000000000e+03 -3.780412974825721e-01 6.566353133715935e-01 2.800032859562196e-01 5.895023345880847e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.244000000000000e+03 -3.780386450022936e-01 6.566650691182929e-01 2.799761404611525e-01 5.894837832011789e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.245000000000000e+03 -3.780359865703435e-01 6.566948186220993e-01 2.799490010506008e-01 5.894652363485451e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.246000000000000e+03 -3.780333221231570e-01 6.567245619294033e-01 2.799218677451536e-01 5.894466940116194e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.247000000000000e+03 -3.780306517668203e-01 6.567542989672855e-01 2.798947405127807e-01 5.894281562209474e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.248000000000000e+03 -3.780279753900828e-01 6.567840298104182e-01 2.798676193896183e-01 5.894096229496515e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.249000000000000e+03 -3.780252930622409e-01 6.568137544108306e-01 2.798405043551966e-01 5.893910942185886e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.250000000000000e+03 -3.780226048315986e-01 6.568434727495273e-01 2.798133953932773e-01 5.893725700277880e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.251000000000000e+03 -3.780199105520617e-01 6.568731849144241e-01 2.797862925525461e-01 5.893540503519876e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.252000000000000e+03 -3.780172103438895e-01 6.569028908270367e-01 2.797591957959437e-01 5.893355352212464e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.253000000000000e+03 -3.780145042161286e-01 6.569325904825217e-01 2.797321051214656e-01 5.893170246382430e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.254000000000000e+03 -3.780117920520079e-01 6.569622839718904e-01 2.797050205650297e-01 5.892985185615038e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.255000000000000e+03 -3.780090739617381e-01 6.569919712067259e-01 2.796779420953337e-01 5.892800170358817e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.256000000000000e+03 -3.780063499450245e-01 6.570216521969321e-01 2.796508697119711e-01 5.892615200528467e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.257000000000000e+03 -3.780036199006475e-01 6.570513270103493e-01 2.796238034479965e-01 5.892430275881271e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.258000000000000e+03 -3.780008839626143e-01 6.570809955613253e-01 2.795967432615900e-01 5.892245396732322e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.259000000000000e+03 -3.779981419848767e-01 6.571106579356543e-01 2.795696892018144e-01 5.892060562850261e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.260000000000000e+03 -3.779953941087220e-01 6.571403140593901e-01 2.795426412220028e-01 5.891875774396000e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.261000000000000e+03 -3.779926402888475e-01 6.571699639500281e-01 2.795155993394567e-01 5.891691031404218e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.262000000000000e+03 -3.779898804448130e-01 6.571996076675450e-01 2.794885635797658e-01 5.891506333621818e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.263000000000000e+03 -3.779871146734466e-01 6.572292451494062e-01 2.794615339131224e-01 5.891321681287733e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.264000000000000e+03 -3.779843429944141e-01 6.572588763772440e-01 2.794345103351793e-01 5.891137074522561e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.265000000000000e+03 -3.779815652746313e-01 6.572885014468890e-01 2.794074928880171e-01 5.890952512932655e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.266000000000000e+03 -3.779787816227511e-01 6.573181202940378e-01 2.793804815371203e-01 5.890767996723182e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.267000000000000e+03 -3.779759920689769e-01 6.573477328826665e-01 2.793534762764872e-01 5.890583526152001e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.268000000000000e+03 -3.779731964813988e-01 6.573773393161887e-01 2.793264771465299e-01 5.890399100741066e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.269000000000000e+03 -3.779703949785758e-01 6.574069395067871e-01 2.792994841122500e-01 5.890214720896770e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.270000000000000e+03 -3.779675875398494e-01 6.574365334761304e-01 2.792724971799462e-01 5.890030386501179e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.271000000000000e+03 -3.779647740908578e-01 6.574661212716715e-01 2.792455163746587e-01 5.889846097404251e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.272000000000000e+03 -3.779619547597086e-01 6.574957028138612e-01 2.792185416559753e-01 5.889661853884629e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.273000000000000e+03 -3.779591293863668e-01 6.575252782043126e-01 2.791915730764614e-01 5.889477655606922e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.274000000000000e+03 -3.779562981082743e-01 6.575548473591080e-01 2.791646105925212e-01 5.889293502853764e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.275000000000000e+03 -3.779534609076934e-01 6.575844102832579e-01 2.791376542118505e-01 5.889109395667753e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.276000000000000e+03 -3.779506176921700e-01 6.576139670512038e-01 2.791107039628714e-01 5.888925333697448e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.277000000000000e+03 -3.779477685332137e-01 6.576435175987910e-01 2.790837598266117e-01 5.888741317311323e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.278000000000000e+03 -3.779449134843400e-01 6.576730619097343e-01 2.790568217841194e-01 5.888557346458774e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.279000000000000e+03 -3.779420524173031e-01 6.577026000660918e-01 2.790298898777024e-01 5.888373420867058e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.280000000000000e+03 -3.779391854201737e-01 6.577321320029035e-01 2.790029640815259e-01 5.888189540839981e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.281000000000000e+03 -3.779363124868247e-01 6.577616577277459e-01 2.789760443979964e-01 5.888005706341971e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.282000000000000e+03 -3.779334335696186e-01 6.577911772740601e-01 2.789491308431410e-01 5.887821917250393e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.283000000000000e+03 -3.779305487545859e-01 6.578206905888518e-01 2.789222233900099e-01 5.887638173753862e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.284000000000000e+03 -3.779276579195589e-01 6.578501977605122e-01 2.788953220773849e-01 5.887454475486359e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.285000000000000e+03 -3.779247611859884e-01 6.578796986971562e-01 2.788684268695761e-01 5.887270822885089e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.286000000000000e+03 -3.779218585059402e-01 6.579091934369268e-01 2.788415377817955e-01 5.887087215780586e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.287000000000000e+03 -3.779189498400123e-01 6.579386820076554e-01 2.788146548274938e-01 5.886903654072123e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.288000000000000e+03 -3.779160352442042e-01 6.579681643725055e-01 2.787877779898816e-01 5.886720137912465e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.289000000000000e+03 -3.779131147458730e-01 6.579976405183374e-01 2.787609072605060e-01 5.886536667333968e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.290000000000000e+03 -3.779101882154078e-01 6.580271105260482e-01 2.787340426825101e-01 5.886353242081209e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.291000000000000e+03 -3.779072557840702e-01 6.580565743075388e-01 2.787071842154258e-01 5.886169862508971e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.292000000000000e+03 -3.779043174306218e-01 6.580860318848605e-01 2.786803318657498e-01 5.885986528497409e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.293000000000000e+03 -3.779013730793951e-01 6.581154833105446e-01 2.786534856583509e-01 5.885803239848301e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.294000000000000e+03 -3.778984227947313e-01 6.581449285399766e-01 2.786266455741272e-01 5.885619996758824e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.295000000000000e+03 -3.778954666126719e-01 6.581743675520043e-01 2.785998116022105e-01 5.885436799306598e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.296000000000000e+03 -3.778925044262357e-01 6.582038004163002e-01 2.785729837779981e-01 5.885253647252852e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.297000000000000e+03 -3.778895363406147e-01 6.582332270647147e-01 2.785461620687685e-01 5.885070540860207e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.298000000000000e+03 -3.778865622707606e-01 6.582626475582617e-01 2.785193465020309e-01 5.884887479883163e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.299000000000000e+03 -3.778835822652519e-01 6.582920618609676e-01 2.784925370639570e-01 5.884704464498597e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.300000000000000e+03 -3.778805963569294e-01 6.583214699538583e-01 2.784657337446759e-01 5.884521494775612e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.301000000000000e+03 -3.778776044390255e-01 6.583508719085550e-01 2.784389365792161e-01 5.884338570453814e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.302000000000000e+03 -3.778746066193679e-01 6.583802676529122e-01 2.784121455344087e-01 5.884155691825846e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.303000000000000e+03 -3.778716028866477e-01 6.584096572043056e-01 2.783853606132971e-01 5.883972858776534e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.304000000000000e+03 -3.778685931467261e-01 6.584390406236604e-01 2.783585818472770e-01 5.883790071101113e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.305000000000000e+03 -3.778655774949179e-01 6.584684178410746e-01 2.783318092080966e-01 5.883607329124301e-01 9.200000000000001e-11 4.630000000000000e-11 3.590000000000000e-11 -9.000000000000000e-12 4.200000000000000e-11 1.290000000000000e-11 -2.200000000000000e-11 7.320000000000000e-11 -2.710000000000000e-11 3.110000000000000e-11</ATTLIST>\n\t\t</ATTLISTList>\n\t</ATT>\n\t<TIL>\n\t\t<BANDID>P</BANDID>\n\t\t<NUMTILES>1</NUMTILES>\n\t\t<TILESIZEX>35180</TILESIZEX>\n\t\t<TILESIZEY>23640</TILESIZEY>\n\t\t<TILEUNITS>Pixels</TILEUNITS>\n\t\t<TILEOVERLAP>0</TILEOVERLAP>\n\t\t<TILE>\n\t\t\t<FILENAME>14JUN19185358-P1BS_R1C1-053644866010_01_P001.TIF</FILENAME>\n\t\t\t<ULCOLOFFSET>0</ULCOLOFFSET>\n\t\t\t<ULROWOFFSET>0</ULROWOFFSET>\n\t\t\t<URCOLOFFSET>35179</URCOLOFFSET>\n\t\t\t<URROWOFFSET>0</URROWOFFSET>\n\t\t\t<LRCOLOFFSET>35179</LRCOLOFFSET>\n\t\t\t<LRROWOFFSET>23639</LRROWOFFSET>\n\t\t\t<LLCOLOFFSET>0</LLCOLOFFSET>\n\t\t\t<LLROWOFFSET>23639</LLROWOFFSET>\n\t\t\t<ULLON>-1.162691402400000e+02</ULLON>\n\t\t\t<ULLAT>3.525804882000000e+01</ULLAT>\n\t\t\t<URLON>-1.160623710800000e+02</URLON>\n\t\t\t<URLAT>3.527244732000000e+01</URLAT>\n\t\t\t<LRLON>-1.160630790400000e+02</LRLON>\n\t\t\t<LRLAT>3.514412735000000e+01</LRLAT>\n\t\t\t<LLLON>-1.162684863300000e+02</LLLON>\n\t\t\t<LLLAT>3.513157338000000e+01</LLLAT>\n\t\t</TILE>\n\t</TIL>\n\t<GEO>\n\t\t<EFFECTIVETIME>2009-10-08T00:00:00.000000Z</EFFECTIVETIME>\n\t\t<MODELGENERATIONTIME>2010-10-26T00:00:00.000000Z</MODELGENERATIONTIME>\n\t\t<SATID>WV02</SATID>\n\t\t<GEOMODELLEVEL>LV1B</GEOMODELLEVEL>\n\t\t<PRINCIPAL_DISTANCE>\n\t\t\t<GENERATIONTIME>2010-01-28T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<PD>1.324613900000000e+04</PD>\n\t\t</PRINCIPAL_DISTANCE>\n\t\t<OPTICAL_DISTORTION>\n\t\t\t<GENERATIONTIME>2009-09-10T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<POLYORDER>-1</POLYORDER>\n\t\t\t<ALISTList/>\n\t\t\t<BLISTList/>\n\t\t</OPTICAL_DISTORTION>\n\t\t<PERSPECTIVE_CENTER>\n\t\t\t<GENERATIONTIME>2009-09-10T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<CX>0.000000000000000e+00</CX>\n\t\t\t<CY>0.000000000000000e+00</CY>\n\t\t\t<CZ>0.000000000000000e+00</CZ>\n\t\t</PERSPECTIVE_CENTER>\n\t\t<CAMERA_ATTITUDE>\n\t\t\t<GENERATIONTIME>2009-09-10T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<QCS1>0.000000000000000e+00</QCS1>\n\t\t\t<QCS2>0.000000000000000e+00</QCS2>\n\t\t\t<QCS3>0.000000000000000e+00</QCS3>\n\t\t\t<QCS4>1.000000000000000e+00</QCS4>\n\t\t</CAMERA_ATTITUDE>\n\t\t<DETECTOR_MOUNTING>\n\t\t\t<GENERATIONTIME>2010-10-26T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<BAND_P>\n\t\t\t\t<BANDID>P</BANDID>\n\t\t\t\t<DETECTOR_ARRAY>\n\t\t\t\t\t<DETARRID>1</DETARRID>\n\t\t\t\t\t<DETORIGINX>-2.590000000000001e-01</DETORIGINX>\n\t\t\t\t\t<DETORIGINY>1.407276907149051e+02</DETORIGINY>\n\t\t\t\t\t<DETROTANGLE>0.000000000000000e+00</DETROTANGLE>\n\t\t\t\t\t<DETPITCH>8.000000000000000e-03</DETPITCH>\n\t\t\t\t</DETECTOR_ARRAY>\n\t\t\t</BAND_P>\n\t\t</DETECTOR_MOUNTING>\n\t</GEO>\n\t<STE>\n\t\t<NUMPAIR>1</NUMPAIR>\n\t\t<STEREO_PAIR>\n\t\t\t<FIRSTID>14JUN19185250-P1BS_R1C1-053644866010_01_P001.TIF</FIRSTID>\n\t\t\t<SECONDID>14JUN19185358-P1BS_R1C1-053644866010_01_P001.TIF</SECONDID>\n\t\t\t<OVERLAP>7.850000000000000e-01</OVERLAP>\n\t\t\t<ULLAT>3.525505000000000e+01</ULLAT>\n\t\t\t<ULLON>-1.162554470000000e+02</ULLON>\n\t\t\t<LRLAT>3.508343700000000e+01</LRLAT>\n\t\t\t<LRLON>-1.160751750000000e+02</LRLON>\n\t\t\t<B_CONV>3.545000000000000e+01</B_CONV>\n\t\t\t<E_CONV>3.532000000000000e+01</E_CONV>\n\t\t\t<B_ASYM>1.243000000000000e+01</B_ASYM>\n\t\t\t<E_ASYM>1.198000000000000e+01</E_ASYM>\n\t\t\t<B_BIE>7.756999999999999e+01</B_BIE>\n\t\t\t<E_BIE>7.802000000000000e+01</E_BIE>\n\t\t</STEREO_PAIR>\n\t</STE>\n\t<RPB>\n\t\t<SATID>WV02</SATID>\n\t\t<BANDID>P</BANDID>\n\t\t<SPECID>RPC00B</SPECID>\n\t\t<IMAGE>\n\t\t\t<ERRBIAS>1.778000000000000e+01</ERRBIAS>\n\t\t\t<ERRRAND>2.300000000000000e-01</ERRRAND>\n\t\t\t<LINEOFFSET>11819</LINEOFFSET>\n\t\t\t<SAMPOFFSET>17589</SAMPOFFSET>\n\t\t\t<LATOFFSET>3.520040000000000e+01</LATOFFSET>\n\t\t\t<LONGOFFSET>-1.161660000000000e+02</LONGOFFSET>\n\t\t\t<HEIGHTOFFSET>593</HEIGHTOFFSET>\n\t\t\t<LINESCALE>11820</LINESCALE>\n\t\t\t<SAMPSCALE>17590</SAMPSCALE>\n\t\t\t<LATSCALE>7.290000000000001e-02</LATSCALE>\n\t\t\t<LONGSCALE>1.039000000000000e-01</LONGSCALE>\n\t\t\t<HEIGHTSCALE>501</HEIGHTSCALE>\n\t\t\t<LINENUMCOEFList>\n\t\t\t\t<LINENUMCOEF>-2.083599000000000e-03 9.781855000000000e-02 -1.136655000000000e+00 -3.904645000000000e-02 1.193064000000000e-05 1.986915000000000e-05 -5.993411000000000e-05 -1.709761000000000e-04 2.295973000000000e-03 -1.710089000000000e-06 1.413443000000000e-06 3.207818000000000e-06 2.537940000000000e-05 4.477122000000000e-06 -3.793405000000000e-05 -1.828474000000000e-04 -5.191995000000000e-05 -1.362531000000000e-06 -1.059634000000000e-05 -1.774266000000000e-06</LINENUMCOEF>\n\t\t\t</LINENUMCOEFList>\n\t\t\t<LINEDENCOEFList>\n\t\t\t\t<LINEDENCOEF>1.000000000000000e+00 2.325544000000000e-04 1.941489000000000e-04 -1.519312000000000e-04 3.910371000000000e-05 1.242866000000000e-06 -1.686283000000000e-05 3.459492000000000e-05 -1.407777000000000e-04 4.514173000000000e-05 -2.632715000000000e-06 -3.183510000000000e-08 -3.827070000000000e-05 -2.671854000000000e-08 2.468878000000000e-06 1.845741000000000e-04 7.619315000000000e-07 7.473800000000000e-08 1.895651000000000e-05 0.000000000000000e+00</LINEDENCOEF>\n\t\t\t</LINEDENCOEFList>\n\t\t\t<SAMPNUMCOEFList>\n\t\t\t\t<SAMPNUMCOEF>3.071944000000000e-03 1.010292000000000e+00 -1.669209000000000e-03 7.247816000000000e-03 -1.307951000000000e-03 3.194267000000000e-04 -7.935816000000001e-05 -2.364895000000000e-03 9.383385000000000e-05 -9.666453999999999e-07 -2.420406000000000e-06 -5.923969000000000e-06 -4.342042000000000e-05 -6.004935000000000e-06 2.702899000000000e-05 2.619228000000000e-04 9.180096000000000e-07 -1.108684000000000e-06 2.742107000000000e-05 -3.410844000000000e-08</SAMPNUMCOEF>\n\t\t\t</SAMPNUMCOEFList>\n\t\t\t<SAMPDENCOEFList>\n\t\t\t\t<SAMPDENCOEF>1.000000000000000e+00 -7.187334000000000e-04 1.327193000000000e-03 -3.450880000000000e-04 -3.626948000000000e-06 2.895510000000000e-07 3.029188000000000e-06 1.909590000000000e-06 4.017305000000000e-05 -6.051905000000000e-06 -2.357291000000000e-08 -3.855491000000000e-08 5.791683000000000e-08 0.000000000000000e+00 6.878706999999999e-08 -1.329743000000000e-07 -1.776718000000000e-08 0.000000000000000e+00 -2.023122000000000e-08 0.000000000000000e+00</SAMPDENCOEF>\n\t\t\t</SAMPDENCOEFList>\n\t\t</IMAGE>\n\t</RPB>\n</isd>\n"
  },
  {
    "path": "src/asp/Camera/tests/wv_test1.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<isd>\n\t<IMD>\n\t\t<VERSION>23.11</VERSION>\n\t\t<GENERATIONTIME>2013-05-08T01:29:34.000000Z</GENERATIONTIME>\n\t\t<PRODUCTORDERID>500063426010_01_P001</PRODUCTORDERID>\n\t\t<PRODUCTCATALOGID>A030011E64C1AA00</PRODUCTCATALOGID>\n\t\t<CHILDCATALOGID>2100011E64C1A900</CHILDCATALOGID>\n\t\t<IMAGEDESCRIPTOR>Stereo1B</IMAGEDESCRIPTOR>\n\t\t<BANDID>P</BANDID>\n\t\t<PANSHARPENALGORITHM>None</PANSHARPENALGORITHM>\n\t\t<NUMROWS>22528</NUMROWS>\n\t\t<NUMCOLUMNS>35840</NUMCOLUMNS>\n\t\t<PRODUCTLEVEL>Stereo 1B</PRODUCTLEVEL>\n\t\t<PRODUCTTYPE>Stereo</PRODUCTTYPE>\n\t\t<NUMBEROFLOOKS>2</NUMBEROFLOOKS>\n\t\t<RADIOMETRICLEVEL>Corrected</RADIOMETRICLEVEL>\n\t\t<BITSPERPIXEL>16</BITSPERPIXEL>\n\t\t<COMPRESSIONTYPE>JPEG2000</COMPRESSIONTYPE>\n\t\t<JPEGPROFILENAME>nga_npje_pan_vl</JPEGPROFILENAME>\n\t\t<OUTPUTFORMAT>NITF21NCDRD</OUTPUTFORMAT>\n\t\t<BAND_P>\n\t\t\t<ULLON>-3.814998154000000e+01</ULLON>\n\t\t\t<ULLAT>7.255587169000000e+01</ULLAT>\n\t\t\t<ULHAE>3.231410000000000e+03</ULHAE>\n\t\t\t<URLON>-3.868863101000000e+01</URLON>\n\t\t\t<URLAT>7.254679814000001e+01</URLAT>\n\t\t\t<URHAE>3.205210000000000e+03</URHAE>\n\t\t\t<LRLON>-3.869039556000000e+01</LRLON>\n\t\t\t<LRLAT>7.264473667000000e+01</LRLAT>\n\t\t\t<LRHAE>3.222820000000000e+03</LRHAE>\n\t\t\t<LLLON>-3.814707665000000e+01</LLLON>\n\t\t\t<LLLAT>7.265401095999999e+01</LLLAT>\n\t\t\t<LLHAE>3.245980000000000e+03</LLHAE>\n\t\t\t<ABSCALFACTOR>3.788831000000000e-02</ABSCALFACTOR>\n\t\t\t<EFFECTIVEBANDWIDTH>2.846000000000000e-01</EFFECTIVEBANDWIDTH>\n\t\t\t<TDILEVEL>48</TDILEVEL>\n\t\t</BAND_P>\n\t\t<IMAGE>\n\t\t\t<SATID>WV02</SATID>\n\t\t\t<MODE>FullSwath</MODE>\n\t\t\t<SCANDIRECTION>Forward</SCANDIRECTION>\n\t\t\t<CATID>1030010021309100</CATID>\n\t\t\t<TLCTIME>2013-05-08T00:03:30.536775Z</TLCTIME>\n\t\t\t<NUMTLC>2</NUMTLC>\n\t\t\t<TLCLISTList>\n\t\t\t\t<TLCLIST>0.000000000000000e+00 0.000000000000000e+00</TLCLIST>\n\t\t\t\t<TLCLIST>2.175600000000000e+04 1.087800000000000e+00</TLCLIST>\n\t\t\t</TLCLISTList>\n\t\t\t<FIRSTLINETIME>2013-05-08T00:03:30.536775Z</FIRSTLINETIME>\n\t\t\t<AVGLINERATE>2.000000000000000e+04</AVGLINERATE>\n\t\t\t<EXPOSUREDURATION>2.400000000000000e-03</EXPOSUREDURATION>\n\t\t\t<MINCOLLECTEDROWGSD>5.030000000000000e-01</MINCOLLECTEDROWGSD>\n\t\t\t<MAXCOLLECTEDROWGSD>5.050000000000000e-01</MAXCOLLECTEDROWGSD>\n\t\t\t<MEANCOLLECTEDROWGSD>5.040000000000000e-01</MEANCOLLECTEDROWGSD>\n\t\t\t<MINCOLLECTEDCOLGSD>5.140000000000000e-01</MINCOLLECTEDCOLGSD>\n\t\t\t<MAXCOLLECTEDCOLGSD>5.160000000000000e-01</MAXCOLLECTEDCOLGSD>\n\t\t\t<MEANCOLLECTEDCOLGSD>5.150000000000000e-01</MEANCOLLECTEDCOLGSD>\n\t\t\t<MEANCOLLECTEDGSD>5.090000000000000e-01</MEANCOLLECTEDGSD>\n\t\t\t<MEANPRODUCTROWGSD>5.080000000000000e-01</MEANPRODUCTROWGSD>\n\t\t\t<MEANPRODUCTCOLGSD>5.170000000000000e-01</MEANPRODUCTCOLGSD>\n\t\t\t<MEANPRODUCTGSD>5.120000000000000e-01</MEANPRODUCTGSD>\n\t\t\t<ROWUNCERTAINTY>3.610000000000000e+01</ROWUNCERTAINTY>\n\t\t\t<COLUNCERTAINTY>4.465000000000000e+01</COLUNCERTAINTY>\n\t\t\t<MINSUNAZ>3.252000000000000e+02</MINSUNAZ>\n\t\t\t<MAXSUNAZ>3.252000000000000e+02</MAXSUNAZ>\n\t\t\t<MEANSUNAZ>3.252000000000000e+02</MEANSUNAZ>\n\t\t\t<MINSUNEL>2.800000000000000e+00</MINSUNEL>\n\t\t\t<MAXSUNEL>2.900000000000000e+00</MAXSUNEL>\n\t\t\t<MEANSUNEL>2.800000000000000e+00</MEANSUNEL>\n\t\t\t<MINSATAZ>2.309000000000000e+02</MINSATAZ>\n\t\t\t<MAXSATAZ>2.326000000000000e+02</MAXSATAZ>\n\t\t\t<MEANSATAZ>2.318000000000000e+02</MEANSATAZ>\n\t\t\t<MINSATEL>7.000000000000000e+01</MINSATEL>\n\t\t\t<MAXSATEL>7.009999999999999e+01</MAXSATEL>\n\t\t\t<MEANSATEL>7.009999999999999e+01</MEANSATEL>\n\t\t\t<MININTRACKVIEWANGLE>4.800000000000000e+00</MININTRACKVIEWANGLE>\n\t\t\t<MAXINTRACKVIEWANGLE>5.000000000000000e+00</MAXINTRACKVIEWANGLE>\n\t\t\t<MEANINTRACKVIEWANGLE>4.900000000000000e+00</MEANINTRACKVIEWANGLE>\n\t\t\t<MINCROSSTRACKVIEWANGLE>1.680000000000000e+01</MINCROSSTRACKVIEWANGLE>\n\t\t\t<MAXCROSSTRACKVIEWANGLE>1.710000000000000e+01</MAXCROSSTRACKVIEWANGLE>\n\t\t\t<MEANCROSSTRACKVIEWANGLE>1.700000000000000e+01</MEANCROSSTRACKVIEWANGLE>\n\t\t\t<MINOFFNADIRVIEWANGLE>1.760000000000000e+01</MINOFFNADIRVIEWANGLE>\n\t\t\t<MAXOFFNADIRVIEWANGLE>1.760000000000000e+01</MAXOFFNADIRVIEWANGLE>\n\t\t\t<MEANOFFNADIRVIEWANGLE>1.760000000000000e+01</MEANOFFNADIRVIEWANGLE>\n\t\t\t<PNIIRS>5.000000000000000e+00</PNIIRS>\n\t\t\t<CLOUDCOVER>9.900000000000000e-02</CLOUDCOVER>\n\t\t\t<RESAMPLINGKERNEL>CC</RESAMPLINGKERNEL>\n\t\t\t<POSITIONKNOWLEDGESRC>R</POSITIONKNOWLEDGESRC>\n\t\t\t<ATTITUDEKNOWLEDGESRC>R</ATTITUDEKNOWLEDGESRC>\n\t\t\t<REVNUMBER>18779</REVNUMBER>\n\t\t</IMAGE>\n\t</IMD>\n\t<EPH>\n\t\t<SATID>WV02</SATID>\n\t\t<REVNUMBER>18779</REVNUMBER>\n\t\t<STRIPID>213091</STRIPID>\n\t\t<TYPE>R</TYPE>\n\t\t<VERSION>A</VERSION>\n\t\t<GENERATIONTIME>2013-05-08T00:59:56.843858Z</GENERATIONTIME>\n\t\t<STARTTIME>2013-05-08T00:03:18.178844Z</STARTTIME>\n\t\t<NUMPOINTS>1291</NUMPOINTS>\n\t\t<TIMEINTERVAL>2.000000000000000e-02</TIMEINTERVAL>\n\t\t<EPHEMLISTList>\n\t\t\t<EPHEMLIST>1.000000000000000e+00 1.763095317768136e+06 -1.629469907669663e+06 6.721212961424038e+06 -6.984892016041722e+03 1.767353288205174e+03 2.255785377049622e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.000000000000000e+00 1.762955618729426e+06 -1.629434559805775e+06 6.721258075942655e+06 -6.984925213311876e+03 1.767409176353548e+03 2.255638019060586e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.000000000000000e+00 1.762815919028205e+06 -1.629399210824515e+06 6.721303187513623e+06 -6.984958407072121e+03 1.767465063675984e+03 2.255490661122472e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.000000000000000e+00 1.762676218664733e+06 -1.629363860725945e+06 6.721348296136853e+06 -6.984991597991826e+03 1.767520950580263e+03 2.255343300854855e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.000000000000000e+00 1.762536517638977e+06 -1.629328509510054e+06 6.721393401812356e+06 -6.985024785065336e+03 1.767576836162751e+03 2.255195942079014e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.000000000000000e+00 1.762396815951005e+06 -1.629293157176860e+06 6.721438504540115e+06 -6.985057970156398e+03 1.767632722087257e+03 2.255048577721702e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.000000000000000e+00 1.762257113600770e+06 -1.629257803726344e+06 6.721483604320141e+06 -6.985091151659445e+03 1.767688607287013e+03 2.254901213567998e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.000000000000000e+00 1.762117410588550e+06 -1.629222449158577e+06 6.721528701152352e+06 -6.985124329661718e+03 1.767744491358695e+03 2.254753849691679e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.000000000000000e+00 1.761977706914301e+06 -1.629187093473544e+06 6.721573795036760e+06 -6.985157503702948e+03 1.767800373987368e+03 2.254606487759647e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.000000000000000e+01 1.761838002577988e+06 -1.629151736671233e+06 6.721618885973374e+06 -6.985190675855869e+03 1.767856257415393e+03 2.254459119573487e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.100000000000000e+01 1.761698297579875e+06 -1.629116378751705e+06 6.721663973962114e+06 -6.985223844261143e+03 1.767912139494758e+03 2.254311752602338e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.200000000000000e+01 1.761558591919932e+06 -1.629081019714957e+06 6.721709059002991e+06 -6.985257009162785e+03 1.767968020637638e+03 2.254164385756660e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.300000000000000e+01 1.761418885598215e+06 -1.629045659560995e+06 6.721754141095986e+06 -6.985290171760521e+03 1.768023901944527e+03 2.254017014455987e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.400000000000000e+01 1.761279178614691e+06 -1.629010298289808e+06 6.721799220241113e+06 -6.985323329923119e+03 1.768079781552272e+03 2.253869646760191e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.500000000000000e+01 1.761139470969627e+06 -1.628974935901463e+06 6.721844296438283e+06 -6.985356486091890e+03 1.768135661441953e+03 2.253722273565069e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.600000000000000e+01 1.760999762662987e+06 -1.628939572395948e+06 6.721889369687513e+06 -6.985389637875552e+03 1.768191539616995e+03 2.253574903836133e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.700000000000000e+01 1.760860053694833e+06 -1.628904207773276e+06 6.721934439988780e+06 -6.985422787019816e+03 1.768247417731717e+03 2.253427530862436e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.800000000000000e+01 1.760720344065126e+06 -1.628868842033430e+06 6.721979507342099e+06 -6.985455932650790e+03 1.768303294893945e+03 2.253280158057571e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.900000000000000e+01 1.760580633774138e+06 -1.628833475176481e+06 6.722024571747385e+06 -6.985489075648585e+03 1.768359171884942e+03 2.253132782081864e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.000000000000000e+01 1.760440922821828e+06 -1.628798107202415e+06 6.722069633204653e+06 -6.985522215497298e+03 1.768415047967327e+03 2.252985405128013e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.100000000000000e+01 1.760301211208160e+06 -1.628762738111221e+06 6.722114691713912e+06 -6.985555351507235e+03 1.768470923299633e+03 2.252838029164777e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.200000000000000e+01 1.760161498933400e+06 -1.628727367902960e+06 6.722159747275078e+06 -6.985588484819679e+03 1.768526798200390e+03 2.252690650445410e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.300000000000000e+01 1.760021785997513e+06 -1.628691996577624e+06 6.722204799888168e+06 -6.985621614485283e+03 1.768582671901964e+03 2.252543272510050e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.400000000000000e+01 1.759882072400563e+06 -1.628656624135225e+06 6.722249849553155e+06 -6.985654741449203e+03 1.768638545503634e+03 2.252395891551769e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.500000000000000e+01 1.759742358142511e+06 -1.628621250575751e+06 6.722294896270056e+06 -6.985687865445188e+03 1.768694418844616e+03 2.252248508517325e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.600000000000000e+01 1.759602643223625e+06 -1.628585875899266e+06 6.722339940038787e+06 -6.985720985725070e+03 1.768750290741873e+03 2.252101126684261e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.700000000000000e+01 1.759462927643867e+06 -1.628550500105757e+06 6.722384980859361e+06 -6.985754102179961e+03 1.768806161345971e+03 2.251953746258260e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.800000000000000e+01 1.759323211403206e+06 -1.628515123195219e+06 6.722430018731791e+06 -6.985787216012598e+03 1.768862032245234e+03 2.251806362233874e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.900000000000000e+01 1.759183494501897e+06 -1.628479745167705e+06 6.722475053655988e+06 -6.985820326648725e+03 1.768917902061039e+03 2.251658977523447e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.000000000000000e+01 1.759043776939912e+06 -1.628444366023212e+06 6.722520085631968e+06 -6.985853433997997e+03 1.768973771388269e+03 2.251511591901342e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.100000000000000e+01 1.758904058717313e+06 -1.628408985761751e+06 6.722565114659715e+06 -6.985886538542299e+03 1.769029640184339e+03 2.251364203933595e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.200000000000000e+01 1.758764339834065e+06 -1.628373604383311e+06 6.722610140739237e+06 -6.985919639519371e+03 1.769085508238078e+03 2.251216816123107e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.300000000000000e+01 1.758624620290428e+06 -1.628338221887951e+06 6.722655163870447e+06 -6.985952736973628e+03 1.769141375277145e+03 2.251069428564169e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.400000000000000e+01 1.758484900086371e+06 -1.628302838275666e+06 6.722700184053364e+06 -6.985985831554265e+03 1.769197241675366e+03 2.250922038961344e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.500000000000000e+01 1.758345179221856e+06 -1.628267453546440e+06 6.722745201288000e+06 -6.986018923200427e+03 1.769253107891649e+03 2.250774647113207e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.600000000000000e+01 1.758205457697150e+06 -1.628232067700342e+06 6.722790215574266e+06 -6.986052011037042e+03 1.769308972904854e+03 2.250627256550489e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.700000000000000e+01 1.758065735512215e+06 -1.628196680737354e+06 6.722835226912179e+06 -6.986085096280322e+03 1.769364837849060e+03 2.250479862606172e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.800000000000000e+01 1.757926012667113e+06 -1.628161292657492e+06 6.722880235301717e+06 -6.986118178019227e+03 1.769420701494621e+03 2.250332469096876e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.900000000000000e+01 1.757786289161811e+06 -1.628125903460746e+06 6.722925240742893e+06 -6.986151256497517e+03 1.769476564798728e+03 2.250185074471780e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.000000000000000e+01 1.757646564996577e+06 -1.628090513147181e+06 6.722970243235625e+06 -6.986184331804731e+03 1.769532427396634e+03 2.250037678765150e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.100000000000000e+01 1.757506840171365e+06 -1.628055121716778e+06 6.723015242779922e+06 -6.986217403917552e+03 1.769588289177407e+03 2.249890282141715e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.200000000000000e+01 1.757367114686250e+06 -1.628019729169559e+06 6.723060239375764e+06 -6.986250472798371e+03 1.769644150392390e+03 2.249742884504289e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.300000000000000e+01 1.757227388541185e+06 -1.627984335505504e+06 6.723105233023169e+06 -6.986283537845531e+03 1.769700010342282e+03 2.249595488279540e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.400000000000000e+01 1.757087661736448e+06 -1.627948940724689e+06 6.723150223722050e+06 -6.986316600874475e+03 1.769755870683090e+03 2.249448086528252e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.500000000000000e+01 1.756947934271996e+06 -1.627913544827094e+06 6.723195211472419e+06 -6.986349660484011e+03 1.769811730057749e+03 2.249300684672611e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.600000000000000e+01 1.756808206147787e+06 -1.627878147812703e+06 6.723240196274286e+06 -6.986382715893898e+03 1.769867588039674e+03 2.249153285455258e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.700000000000000e+01 1.756668477364097e+06 -1.627842749681590e+06 6.723285178127571e+06 -6.986415768719370e+03 1.769923445877546e+03 2.249005882890779e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.800000000000000e+01 1.756528747920884e+06 -1.627807350433739e+06 6.723330157032285e+06 -6.986448818330709e+03 1.769979302958105e+03 2.248858479419350e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.900000000000000e+01 1.756389017818212e+06 -1.627771950069163e+06 6.723375132988409e+06 -6.986481864766430e+03 1.770035159300239e+03 2.248711074907396e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.000000000000000e+01 1.756249287056044e+06 -1.627736548587849e+06 6.723420105995956e+06 -6.986514908524951e+03 1.770091015735241e+03 2.248563667130846e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.100000000000000e+01 1.756109555634649e+06 -1.627701145989864e+06 6.723465076054839e+06 -6.986547947855204e+03 1.770146870322365e+03 2.248416263076322e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.200000000000000e+01 1.755969823553988e+06 -1.627665742275194e+06 6.723510043165077e+06 -6.986580984404853e+03 1.770202724300866e+03 2.248268856665359e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.300000000000000e+01 1.755830090814027e+06 -1.627630337443830e+06 6.723555007326677e+06 -6.986614018241258e+03 1.770258578436186e+03 2.248121447045535e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.400000000000000e+01 1.755690357415026e+06 -1.627594931495833e+06 6.723599968539554e+06 -6.986647048870250e+03 1.770314431793020e+03 2.247974036515970e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.500000000000000e+01 1.755550623356954e+06 -1.627559524431191e+06 6.723644926803723e+06 -6.986680076001659e+03 1.770370284149425e+03 2.247826626150680e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.600000000000000e+01 1.755410888639877e+06 -1.627524116249924e+06 6.723689882119164e+06 -6.986713099967014e+03 1.770426135737710e+03 2.247679214740701e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.700000000000000e+01 1.755271153263750e+06 -1.627488706952011e+06 6.723734834485890e+06 -6.986746120040773e+03 1.770481986420978e+03 2.247531804618789e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.800000000000000e+01 1.755131417228843e+06 -1.627453296537519e+06 6.723779783903817e+06 -6.986779138179670e+03 1.770537837189888e+03 2.247384388968692e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.900000000000000e+01 1.754991680535126e+06 -1.627417885006443e+06 6.723824730372955e+06 -6.986812152168701e+03 1.770593686598032e+03 2.247236975781021e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.000000000000000e+01 1.754851943182553e+06 -1.627382472358764e+06 6.723869673893323e+06 -6.986845163208942e+03 1.770649535682152e+03 2.247089560509518e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.100000000000000e+01 1.754712205171392e+06 -1.627347058594546e+06 6.723914614464832e+06 -6.986878171119433e+03 1.770705383977804e+03 2.246942144099526e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.200000000000000e+01 1.754572466501613e+06 -1.627311643713783e+06 6.723959552087494e+06 -6.986911176064781e+03 1.770761231907819e+03 2.246794725690502e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.300000000000000e+01 1.754432727173275e+06 -1.627276227716486e+06 6.724004486761291e+06 -6.986944177801871e+03 1.770817079061445e+03 2.246647306372587e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.400000000000000e+01 1.754292987186336e+06 -1.627240810602637e+06 6.724049418486237e+06 -6.986977176021010e+03 1.770872925504330e+03 2.246499887037164e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.500000000000000e+01 1.754153246541071e+06 -1.627205392372307e+06 6.724094347262245e+06 -6.987010170772984e+03 1.770928770717696e+03 2.246352467967674e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.600000000000000e+01 1.754013505237441e+06 -1.627169973025486e+06 6.724139273089329e+06 -6.987043162002932e+03 1.770984615187463e+03 2.246205048921364e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.700000000000000e+01 1.753873763275509e+06 -1.627134552562183e+06 6.724184195967468e+06 -6.987076150653038e+03 1.771040459358306e+03 2.246057626641319e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.800000000000000e+01 1.753734020655238e+06 -1.627099130982387e+06 6.724229115896676e+06 -6.987109136590021e+03 1.771096303591134e+03 2.245910201229482e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.900000000000000e+01 1.753594277376893e+06 -1.627063708286162e+06 6.724274032876869e+06 -6.987142118724894e+03 1.771152146555369e+03 2.245762777141084e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.000000000000000e+01 1.753454533440439e+06 -1.627028284473496e+06 6.724318946908062e+06 -6.987175097197862e+03 1.771207988141727e+03 2.245615354040222e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.100000000000000e+01 1.753314788845840e+06 -1.626992859544380e+06 6.724363857990262e+06 -6.987208073462691e+03 1.771263830279523e+03 2.245467925848760e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.200000000000000e+01 1.753175043593361e+06 -1.626957433498875e+06 6.724408766123393e+06 -6.987241046054698e+03 1.771319671208787e+03 2.245320498534968e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.300000000000000e+01 1.753035297682968e+06 -1.626922006336973e+06 6.724453671307457e+06 -6.987274014790961e+03 1.771375510852169e+03 2.245173072724323e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.400000000000000e+01 1.752895551114720e+06 -1.626886578058683e+06 6.724498573542442e+06 -6.987306981813697e+03 1.771431351051343e+03 2.245025640305211e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.500000000000000e+01 1.752755803888585e+06 -1.626851148663996e+06 6.724543472828357e+06 -6.987339943821770e+03 1.771487189167945e+03 2.244878213609161e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.600000000000000e+01 1.752616056004828e+06 -1.626815718152977e+06 6.724588369165123e+06 -6.987372903550374e+03 1.771543027490927e+03 2.244730782331373e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.700000000000000e+01 1.752476307463409e+06 -1.626780286525610e+06 6.724633262552746e+06 -6.987405860355527e+03 1.771598865091783e+03 2.244583349227425e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.800000000000000e+01 1.752336558264294e+06 -1.626744853781887e+06 6.724678152991243e+06 -6.987438814180659e+03 1.771654702370119e+03 2.244435914132090e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.900000000000000e+01 1.752196808407754e+06 -1.626709419921877e+06 6.724723040480531e+06 -6.987471764244307e+03 1.771710538801731e+03 2.244288479880538e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.000000000000000e+01 1.752057057893743e+06 -1.626673984945555e+06 6.724767925020616e+06 -6.987504711093015e+03 1.771766374113083e+03 2.244141045031832e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.100000000000000e+01 1.751917306722329e+06 -1.626638548852945e+06 6.724812806611487e+06 -6.987537654508977e+03 1.771822208544384e+03 2.243993610049440e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.200000000000000e+01 1.751777554893475e+06 -1.626603111644030e+06 6.724857685253149e+06 -6.987570594594007e+03 1.771878042527440e+03 2.243846174256315e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.300000000000000e+01 1.751637802407450e+06 -1.626567673318878e+06 6.724902560945523e+06 -6.987603531819419e+03 1.771933875910689e+03 2.243698736337881e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.400000000000000e+01 1.751498049264216e+06 -1.626532233877477e+06 6.724947433688620e+06 -6.987636465909146e+03 1.771989708658057e+03 2.243551297169681e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.500000000000000e+01 1.751358295463732e+06 -1.626496793319812e+06 6.724992303482452e+06 -6.987669396924073e+03 1.772045540962705e+03 2.243403856401645e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.600000000000000e+01 1.751218541006273e+06 -1.626461351645953e+06 6.725037170326936e+06 -6.987702324227259e+03 1.772101372178578e+03 2.243256416531177e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.700000000000000e+01 1.751078785891795e+06 -1.626425908855883e+06 6.725082034222083e+06 -6.987735248920251e+03 1.772157203138120e+03 2.243108973480301e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.800000000000000e+01 1.750939030120365e+06 -1.626390464949617e+06 6.725126895167877e+06 -6.987768169797113e+03 1.772213032873778e+03 2.242961531761351e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.900000000000000e+01 1.750799273691941e+06 -1.626355019927140e+06 6.725171753164329e+06 -6.987801087712459e+03 1.772268862365326e+03 2.242814087927372e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.000000000000000e+01 1.750659516606798e+06 -1.626319573788521e+06 6.725216608211352e+06 -6.987834002794004e+03 1.772324691222481e+03 2.242666641917557e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.100000000000000e+01 1.750519758864895e+06 -1.626284126533750e+06 6.725261460308961e+06 -6.987866914604890e+03 1.772380519491841e+03 2.242519195030346e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.200000000000000e+01 1.750380000466296e+06 -1.626248678162836e+06 6.725306309457137e+06 -6.987899822645500e+03 1.772436346579231e+03 2.242371749299761e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.300000000000000e+01 1.750240241410962e+06 -1.626213228675766e+06 6.725351155655890e+06 -6.987932727155035e+03 1.772492172769131e+03 2.242224303752388e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.400000000000000e+01 1.750100481699161e+06 -1.626177778072607e+06 6.725395998905138e+06 -6.987965629061345e+03 1.772547998634596e+03 2.242076855060029e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.500000000000000e+01 1.749960721330861e+06 -1.626142326353350e+06 6.725440839204895e+06 -6.987998527490749e+03 1.772603823663840e+03 2.241929406332990e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.600000000000000e+01 1.749820960306020e+06 -1.626106873517980e+06 6.725485676555173e+06 -6.988031423227866e+03 1.772659648640055e+03 2.241781954503320e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.700000000000000e+01 1.749681198624904e+06 -1.626071419566559e+06 6.725530510955886e+06 -6.988064316050844e+03 1.772715473044394e+03 2.241634500690221e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.800000000000000e+01 1.749541436287480e+06 -1.626035964499081e+06 6.725575342407049e+06 -6.988097205108387e+03 1.772771296433728e+03 2.241487047878171e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.900000000000000e+01 1.749401673293811e+06 -1.626000508315556e+06 6.725620170908639e+06 -6.988130090970807e+03 1.772827118822974e+03 2.241339594306962e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.000000000000000e+02 1.749261909643856e+06 -1.625965051015971e+06 6.725664996460673e+06 -6.988162973003700e+03 1.772882940438677e+03 2.241192141729120e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.010000000000000e+02 1.749122145337884e+06 -1.625929592600392e+06 6.725709819063064e+06 -6.988195852129307e+03 1.772938761325467e+03 2.241044687280209e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.020000000000000e+02 1.748982380375859e+06 -1.625894133068805e+06 6.725754638715825e+06 -6.988228728962464e+03 1.772994582359087e+03 2.240897228332480e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.030000000000000e+02 1.748842614757744e+06 -1.625858672421202e+06 6.725799455418969e+06 -6.988261602493567e+03 1.773050402763860e+03 2.240749768638290e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.040000000000000e+02 1.748702848483810e+06 -1.625823210657651e+06 6.725844269172412e+06 -6.988294472309884e+03 1.773106222044667e+03 2.240602309883148e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.050000000000000e+02 1.748563081554011e+06 -1.625787747778129e+06 6.725889079976165e+06 -6.988327338223352e+03 1.773162040005165e+03 2.240454852810673e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.060000000000000e+02 1.748423313968415e+06 -1.625752283782656e+06 6.725933887830215e+06 -6.988360201646148e+03 1.773217857793931e+03 2.240307392116629e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.070000000000000e+02 1.748283545726986e+06 -1.625716818671219e+06 6.725978692734567e+06 -6.988393061490167e+03 1.773273674740055e+03 2.240159931706544e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.080000000000000e+02 1.748143776829992e+06 -1.625681352443886e+06 6.726023494689141e+06 -6.988425918721454e+03 1.773329491523501e+03 2.240012468040929e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.090000000000000e+02 1.748004007277397e+06 -1.625645885100643e+06 6.726068293693948e+06 -6.988458772193634e+03 1.773385306956233e+03 2.239865005643586e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.100000000000000e+02 1.747864237069156e+06 -1.625610416641473e+06 6.726113089748999e+06 -6.988491623225850e+03 1.773441122802244e+03 2.239717538971611e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.110000000000000e+02 1.747724466205544e+06 -1.625574947066446e+06 6.726157882854215e+06 -6.988524470536663e+03 1.773496937182390e+03 2.239570073550149e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.120000000000000e+02 1.747584694686522e+06 -1.625539476375551e+06 6.726202673009604e+06 -6.988557314339996e+03 1.773552750638238e+03 2.239422608263711e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.130000000000000e+02 1.747444922512154e+06 -1.625504004568801e+06 6.726247460215150e+06 -6.988590155537818e+03 1.773608563908382e+03 2.239275139718308e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.140000000000000e+02 1.747305149682401e+06 -1.625468531646180e+06 6.726292244470863e+06 -6.988622992891434e+03 1.773664376314503e+03 2.239127672289895e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.150000000000000e+02 1.747165376197527e+06 -1.625433057607751e+06 6.726337025776658e+06 -6.988655827334754e+03 1.773720187908338e+03 2.238980203069365e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.160000000000000e+02 1.747025602057505e+06 -1.625397582453512e+06 6.726381804132554e+06 -6.988688658845294e+03 1.773775999347224e+03 2.238832731567362e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.170000000000000e+02 1.746885827262392e+06 -1.625362106183469e+06 6.726426579538524e+06 -6.988721486687887e+03 1.773831809248490e+03 2.238685261213932e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.180000000000000e+02 1.746746051812153e+06 -1.625326628797614e+06 6.726471351994584e+06 -6.988754311412802e+03 1.773887619105971e+03 2.238537789051988e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.190000000000000e+02 1.746606275707050e+06 -1.625291150296006e+06 6.726516121500651e+06 -6.988787133309766e+03 1.773943428397473e+03 2.238390314635637e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.200000000000000e+02 1.746466498947054e+06 -1.625255670678639e+06 6.726560888056736e+06 -6.988819951194438e+03 1.773999236099668e+03 2.238242842469222e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.210000000000000e+02 1.746326721532123e+06 -1.625220189945499e+06 6.726605651662851e+06 -6.988852766917949e+03 1.774055044463804e+03 2.238095364958454e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.220000000000000e+02 1.746186943462525e+06 -1.625184708096648e+06 6.726650412318913e+06 -6.988885578885991e+03 1.774110851421677e+03 2.237947888753999e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.230000000000000e+02 1.746047164738226e+06 -1.625149225132080e+06 6.726695170024934e+06 -6.988918387913822e+03 1.774166657929191e+03 2.237800410541150e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.240000000000000e+02 1.745907385359283e+06 -1.625113741051803e+06 6.726739924780899e+06 -6.988951193506742e+03 1.774222463517261e+03 2.237652932237214e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.250000000000000e+02 1.745767605325666e+06 -1.625078255855807e+06 6.726784676586814e+06 -6.988983995538037e+03 1.774278268255876e+03 2.237505454172003e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.260000000000000e+02 1.745627824637639e+06 -1.625042769544159e+06 6.726829425442597e+06 -6.989016794604250e+03 1.774334072574358e+03 2.237357974149006e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.270000000000000e+02 1.745488043295164e+06 -1.625007282116843e+06 6.726874171348267e+06 -6.989049590918467e+03 1.774389876410803e+03 2.237210491566231e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.280000000000000e+02 1.745348261298203e+06 -1.624971793573848e+06 6.726918914303823e+06 -6.989082383555114e+03 1.774445679298825e+03 2.237063009662477e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.290000000000000e+02 1.745208478647028e+06 -1.624936303915242e+06 6.726963654309194e+06 -6.989115172464168e+03 1.774501481103753e+03 2.236915528706225e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.300000000000000e+02 1.745068695341594e+06 -1.624900813141006e+06 6.727008391364387e+06 -6.989147958703551e+03 1.774557282688759e+03 2.236768044714409e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.310000000000000e+02 1.744928911381974e+06 -1.624865321251161e+06 6.727053125469386e+06 -6.989180741862173e+03 1.774613083375613e+03 2.236620559526104e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.320000000000000e+02 1.744789126768126e+06 -1.624829828245693e+06 6.727097856624199e+06 -6.989213521672642e+03 1.774668883663426e+03 2.236473073538289e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.330000000000000e+02 1.744649341500321e+06 -1.624794334124668e+06 6.727142584828744e+06 -6.989246298858425e+03 1.774724683864466e+03 2.236325584262674e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.340000000000000e+02 1.744509555578512e+06 -1.624758838888067e+06 6.727187310083034e+06 -6.989279071758300e+03 1.774780481940060e+03 2.236178098536937e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.350000000000000e+02 1.744369769002675e+06 -1.624723342535887e+06 6.727232032387083e+06 -6.989311841942816e+03 1.774836280296076e+03 2.236030609489674e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.360000000000000e+02 1.744229981773064e+06 -1.624687845068184e+06 6.727276751740804e+06 -6.989344609246225e+03 1.774892077928969e+03 2.235883118483379e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.370000000000000e+02 1.744090193889656e+06 -1.624652346484957e+06 6.727321468144213e+06 -6.989377373022303e+03 1.774947874879041e+03 2.235735627469570e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.380000000000000e+02 1.743950405352503e+06 -1.624616846786210e+06 6.727366181597287e+06 -6.989410133686182e+03 1.775003670800145e+03 2.235588135467067e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.390000000000000e+02 1.743810616161573e+06 -1.624581345971934e+06 6.727410892100038e+06 -6.989442890668609e+03 1.775059466056634e+03 2.235440643915545e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.400000000000000e+02 1.743670826317136e+06 -1.624545844042198e+06 6.727455599652389e+06 -6.989475644856371e+03 1.775115260913782e+03 2.235293149863670e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.410000000000000e+02 1.743531035819148e+06 -1.624510340996982e+06 6.727500304254347e+06 -6.989508396687490e+03 1.775171055739517e+03 2.235145651651457e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.420000000000000e+02 1.743391244667679e+06 -1.624474836836307e+06 6.727545005905892e+06 -6.989541143832254e+03 1.775226848652880e+03 2.234998158041466e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.430000000000000e+02 1.743251452862683e+06 -1.624439331560151e+06 6.727589704607039e+06 -6.989573888073401e+03 1.775282641047034e+03 2.234850662367925e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.440000000000000e+02 1.743111660404441e+06 -1.624403825168593e+06 6.727634400357703e+06 -6.989606629634854e+03 1.775338433429439e+03 2.234703163510088e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.450000000000000e+02 1.742971867292913e+06 -1.624368317661616e+06 6.727679093157898e+06 -6.989639367510805e+03 1.775394224465646e+03 2.234555665696417e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.460000000000000e+02 1.742832073528046e+06 -1.624332809039197e+06 6.727723783007635e+06 -6.989672102023921e+03 1.775450015011273e+03 2.234408167206592e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.470000000000000e+02 1.742692279110122e+06 -1.624297299301412e+06 6.727768469906833e+06 -6.989704833461964e+03 1.775505804640122e+03 2.234260667518588e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.480000000000000e+02 1.742552484039104e+06 -1.624261788448250e+06 6.727813153855500e+06 -6.989737562190991e+03 1.775561594345872e+03 2.234113164660281e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.490000000000000e+02 1.742412688315052e+06 -1.624226276479721e+06 6.727857834853619e+06 -6.989770287466013e+03 1.775617382828665e+03 2.233965662029741e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.500000000000000e+02 1.742272891937928e+06 -1.624190763395812e+06 6.727902512901206e+06 -6.989803009469128e+03 1.775673170994984e+03 2.233818158294955e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.510000000000000e+02 1.742133094907998e+06 -1.624155249196585e+06 6.727947187998171e+06 -6.989835728294542e+03 1.775728958286015e+03 2.233670653642124e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.520000000000000e+02 1.741993297225231e+06 -1.624119733882037e+06 6.727991860144530e+06 -6.989868444550364e+03 1.775784745227571e+03 2.233523145752452e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.530000000000000e+02 1.741853498889586e+06 -1.624084217452150e+06 6.728036529340295e+06 -6.989901156848785e+03 1.775840531336686e+03 2.233375639306838e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.540000000000000e+02 1.741713699901328e+06 -1.624048699906987e+06 6.728081195585383e+06 -6.989933865812410e+03 1.775896316265863e+03 2.233228132686175e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.550000000000000e+02 1.741573900260426e+06 -1.624013181246543e+06 6.728125858879805e+06 -6.989966572339149e+03 1.775952101494877e+03 2.233080621866635e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.560000000000000e+02 1.741434099966938e+06 -1.623977661470825e+06 6.728170519223543e+06 -6.989999275111963e+03 1.776007885180541e+03 2.232933112471364e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.570000000000000e+02 1.741294299020829e+06 -1.623942140579824e+06 6.728215176616610e+06 -6.990031974063832e+03 1.776063668069807e+03 2.232785604070510e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.580000000000000e+02 1.741154497422365e+06 -1.623906618573601e+06 6.728259831058919e+06 -6.990064670159381e+03 1.776119450202852e+03 2.232638093661326e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.590000000000000e+02 1.741014695171510e+06 -1.623871095452150e+06 6.728304482550486e+06 -6.990097363561465e+03 1.776175232362907e+03 2.232490580074650e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.600000000000000e+02 1.740874892268229e+06 -1.623835571215457e+06 6.728349131091325e+06 -6.990130054001251e+03 1.776231014089556e+03 2.232343064530031e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.610000000000000e+02 1.740735088712788e+06 -1.623800045863586e+06 6.728393776681349e+06 -6.990162740157985e+03 1.776286794094930e+03 2.232195552191203e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.620000000000000e+02 1.740595284505148e+06 -1.623764519396524e+06 6.728438419320568e+06 -6.990195423379166e+03 1.776342573585366e+03 2.232048037881954e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.630000000000000e+02 1.740455479645374e+06 -1.623728991814287e+06 6.728483059008969e+06 -6.990228104227580e+03 1.776398353222833e+03 2.231900519304754e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.640000000000000e+02 1.740315674133431e+06 -1.623693463116861e+06 6.728527695746562e+06 -6.990260781283551e+03 1.776454131706218e+03 2.231753001939921e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.650000000000000e+02 1.740175867969584e+06 -1.623657933304314e+06 6.728572329533261e+06 -6.990293455732060e+03 1.776509910042916e+03 2.231605481279709e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.660000000000000e+02 1.740036061153794e+06 -1.623622402376629e+06 6.728616960369079e+06 -6.990326125709040e+03 1.776565686692827e+03 2.231457964377840e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.670000000000000e+02 1.739896253686126e+06 -1.623586870333820e+06 6.728661588254003e+06 -6.990358793215994e+03 1.776621462957334e+03 2.231310443960985e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.680000000000000e+02 1.739756445566547e+06 -1.623551337175881e+06 6.728706213188040e+06 -6.990391457161333e+03 1.776677238508194e+03 2.231162923670724e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.690000000000000e+02 1.739616636795317e+06 -1.623515802902869e+06 6.728750835171102e+06 -6.990424118375404e+03 1.776733013837975e+03 2.231015400529354e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.700000000000000e+02 1.739476827372410e+06 -1.623480267514782e+06 6.728795454203213e+06 -6.990456776244519e+03 1.776788788108869e+03 2.230867877141823e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.710000000000000e+02 1.739337017297775e+06 -1.623444731011597e+06 6.728840070284375e+06 -6.990489430754203e+03 1.776844561922378e+03 2.230720353039543e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.720000000000000e+02 1.739197206571687e+06 -1.623409193393384e+06 6.728884683414511e+06 -6.990522082460549e+03 1.776900335176800e+03 2.230572826596120e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.730000000000000e+02 1.739057395194113e+06 -1.623373654660135e+06 6.728929293593627e+06 -6.990554730268511e+03 1.776956107285217e+03 2.230425301686178e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.740000000000000e+02 1.738917583165108e+06 -1.623338114811857e+06 6.728973900821712e+06 -6.990587375246997e+03 1.777011878778879e+03 2.230277774563110e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.750000000000000e+02 1.738777770484641e+06 -1.623302573848541e+06 6.729018505098773e+06 -6.990620017012857e+03 1.777067649863349e+03 2.230130246231869e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.760000000000000e+02 1.738637957152979e+06 -1.623267031770254e+06 6.729063106424724e+06 -6.990652654884747e+03 1.777123419653346e+03 2.229982719547953e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.770000000000000e+02 1.738498143170078e+06 -1.623231488576977e+06 6.729107704799586e+06 -6.990685291119084e+03 1.777179189945994e+03 2.229835186023234e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.780000000000000e+02 1.738358328535909e+06 -1.623195944268706e+06 6.729152300223366e+06 -6.990717922869074e+03 1.777234958729239e+03 2.229687656148951e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.790000000000000e+02 1.738218513250736e+06 -1.623160398845501e+06 6.729196892695980e+06 -6.990750551744843e+03 1.777290726988249e+03 2.229540124121712e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.800000000000000e+02 1.738078697314521e+06 -1.623124852307351e+06 6.729241482217441e+06 -6.990783177161600e+03 1.777346494265649e+03 2.229392592134581e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.810000000000000e+02 1.737938880727328e+06 -1.623089304654271e+06 6.729286068787731e+06 -6.990815799578799e+03 1.777402261085291e+03 2.229245058323898e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.820000000000000e+02 1.737799063489123e+06 -1.623053755886247e+06 6.729330652406865e+06 -6.990848419424700e+03 1.777458027914796e+03 2.229097520969657e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.830000000000000e+02 1.737659245600169e+06 -1.623018206003346e+06 6.729375233074752e+06 -6.990881035419511e+03 1.777513793499842e+03 2.228949985088856e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.840000000000000e+02 1.737519427060428e+06 -1.622982655005551e+06 6.729419810791410e+06 -6.990913647694133e+03 1.777569557621992e+03 2.228802450465018e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.850000000000000e+02 1.737379607869870e+06 -1.622947102892857e+06 6.729464385556852e+06 -6.990946256987449e+03 1.777625321636168e+03 2.228654913662401e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.860000000000000e+02 1.737239788028758e+06 -1.622911549665329e+06 6.729508957370993e+06 -6.990978863657055e+03 1.777681085413333e+03 2.228507373688186e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.870000000000000e+02 1.737099967537050e+06 -1.622875995322946e+06 6.729553526233845e+06 -6.991011466840975e+03 1.777736848245015e+03 2.228359833805822e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.880000000000000e+02 1.736960146394819e+06 -1.622840439865731e+06 6.729598092145388e+06 -6.991044067084636e+03 1.777792610482097e+03 2.228212292033362e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.890000000000000e+02 1.736820324602026e+06 -1.622804883293669e+06 6.729642655105639e+06 -6.991076663842151e+03 1.777848372045620e+03 2.228064750121927e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.900000000000000e+02 1.736680502158931e+06 -1.622769325606822e+06 6.729687215114509e+06 -6.991109257384565e+03 1.777904132845424e+03 2.227917207312654e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.910000000000000e+02 1.736540679065506e+06 -1.622733766805183e+06 6.729731772172011e+06 -6.991141847420443e+03 1.777959892628341e+03 2.227769664721096e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.920000000000000e+02 1.736400855321808e+06 -1.622698206888761e+06 6.729776326278130e+06 -6.991174434569020e+03 1.778015651925066e+03 2.227622119983242e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.930000000000000e+02 1.736261030927801e+06 -1.622662645857545e+06 6.729820877432873e+06 -6.991207018423290e+03 1.778071410789818e+03 2.227474574308320e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.940000000000000e+02 1.736121205883757e+06 -1.622627083711603e+06 6.729865425636162e+06 -6.991239600012742e+03 1.778127169598008e+03 2.227327024198528e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.950000000000000e+02 1.735981380189636e+06 -1.622591520450921e+06 6.729909970888004e+06 -6.991272176925516e+03 1.778182926345617e+03 2.227179478809904e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.960000000000000e+02 1.735841553845398e+06 -1.622555956075485e+06 6.729954513188417e+06 -6.991304751404540e+03 1.778238683416733e+03 2.227031929182519e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.970000000000000e+02 1.735701726851311e+06 -1.622520390585360e+06 6.729999052537315e+06 -6.991337321910441e+03 1.778294438835789e+03 2.226884381756631e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.980000000000000e+02 1.735561899207346e+06 -1.622484823980542e+06 6.730043588934709e+06 -6.991369889753462e+03 1.778350194134903e+03 2.226736831178055e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.990000000000000e+02 1.735422070913556e+06 -1.622449256261034e+06 6.730088122380583e+06 -6.991402454700866e+03 1.778405948971998e+03 2.226589278457398e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.000000000000000e+02 1.735282241969911e+06 -1.622413687426831e+06 6.730132652874946e+06 -6.991435016086133e+03 1.778461702961855e+03 2.226441725981572e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.010000000000000e+02 1.735142412376678e+06 -1.622378117477996e+06 6.730177180417716e+06 -6.991467574289292e+03 1.778517456221745e+03 2.226294172477250e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.020000000000000e+02 1.735002582133816e+06 -1.622342546414516e+06 6.730221705008905e+06 -6.991500128713467e+03 1.778573208199614e+03 2.226146620259697e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.030000000000000e+02 1.734862751241288e+06 -1.622306974236379e+06 6.730266226648530e+06 -6.991532681029868e+03 1.778628960825928e+03 2.225999062517009e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.040000000000000e+02 1.734722919699361e+06 -1.622271400943647e+06 6.730310745336502e+06 -6.991565229007287e+03 1.778684711550732e+03 2.225851508320553e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.050000000000000e+02 1.734583087507998e+06 -1.622235826536311e+06 6.730355261072835e+06 -6.991597774969138e+03 1.778740462461828e+03 2.225703948709131e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.060000000000000e+02 1.734443254667271e+06 -1.622200251014391e+06 6.730399773857508e+06 -6.991630316523246e+03 1.778796211816775e+03 2.225556392561356e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.070000000000000e+02 1.734303421177131e+06 -1.622164674377864e+06 6.730444283690539e+06 -6.991662855718307e+03 1.778851961309111e+03 2.225408832100675e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.080000000000000e+02 1.734163587037855e+06 -1.622129096626803e+06 6.730488790571840e+06 -6.991695391432067e+03 1.778907709842538e+03 2.225261271731460e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.090000000000000e+02 1.734023752249401e+06 -1.622093517761194e+06 6.730533294501424e+06 -6.991727923958842e+03 1.778963457480396e+03 2.225113710490575e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.100000000000000e+02 1.733883916811734e+06 -1.622057937781023e+06 6.730577795479305e+06 -6.991760453219967e+03 1.779019204777624e+03 2.224966148145802e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.110000000000000e+02 1.733744080725116e+06 -1.622022356686355e+06 6.730622293505398e+06 -6.991792979271753e+03 1.779074951292209e+03 2.224818584901712e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.120000000000000e+02 1.733604243989513e+06 -1.621986774477178e+06 6.730666788579716e+06 -6.991825502128690e+03 1.779130697024994e+03 2.224671020712812e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.130000000000000e+02 1.733464406604990e+06 -1.621951191153507e+06 6.730711280702242e+06 -6.991858021514744e+03 1.779186441677418e+03 2.224523456687806e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.140000000000000e+02 1.733324568571514e+06 -1.621915606715334e+06 6.730755769872987e+06 -6.991890537927269e+03 1.779242186283381e+03 2.224375890404302e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.150000000000000e+02 1.733184729889339e+06 -1.621880021162712e+06 6.730800256091865e+06 -6.991923051477346e+03 1.779297930233678e+03 2.224228322040684e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.160000000000000e+02 1.733044890558443e+06 -1.621844434495640e+06 6.730844739358890e+06 -6.991955561697863e+03 1.779353673587694e+03 2.224080752989466e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.170000000000000e+02 1.732905050578883e+06 -1.621808846714130e+06 6.730889219674045e+06 -6.991988068539611e+03 1.779409415895142e+03 2.223933183788664e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.180000000000000e+02 1.732765209950620e+06 -1.621773257818165e+06 6.730933697037340e+06 -6.992020571556621e+03 1.779465157016592e+03 2.223785615936458e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.190000000000000e+02 1.732625368673928e+06 -1.621737667807817e+06 6.730978171448693e+06 -6.992053072167651e+03 1.779520898324812e+03 2.223638043871079e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.200000000000000e+02 1.732485526748762e+06 -1.621702076683067e+06 6.731022642908117e+06 -6.992085569672872e+03 1.779576638803839e+03 2.223490470626122e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.210000000000000e+02 1.732345684175090e+06 -1.621666484443908e+06 6.731067111415621e+06 -6.992118063263019e+03 1.779632378282553e+03 2.223342898850226e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.220000000000000e+02 1.732205840953179e+06 -1.621630891090403e+06 6.731111576971126e+06 -6.992150554000921e+03 1.779688117253497e+03 2.223195324835507e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.230000000000000e+02 1.732065997082991e+06 -1.621595296622542e+06 6.731156039574643e+06 -6.992183041816436e+03 1.779743855840436e+03 2.223047748692434e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.240000000000000e+02 1.731926152564585e+06 -1.621559701040333e+06 6.731200499226150e+06 -6.992215525856034e+03 1.779799593002868e+03 2.222900173952386e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.250000000000000e+02 1.731786307397932e+06 -1.621524104343770e+06 6.731244955925664e+06 -6.992248007200979e+03 1.779855330361029e+03 2.222752595882580e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.260000000000000e+02 1.731646461583291e+06 -1.621488506532913e+06 6.731289409673098e+06 -6.992280485091062e+03 1.779911066454961e+03 2.222605018085721e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.270000000000000e+02 1.731506615120636e+06 -1.621452907607757e+06 6.731333860468467e+06 -6.992312960048129e+03 1.779966802241664e+03 2.222457438127205e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.280000000000000e+02 1.731366768009921e+06 -1.621417307568286e+06 6.731378308311783e+06 -6.992345431452296e+03 1.780022537243158e+03 2.222309858334220e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.290000000000000e+02 1.731226920251414e+06 -1.621381706414560e+06 6.731422753202964e+06 -6.992377899736984e+03 1.780078271276687e+03 2.222162277523012e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.300000000000000e+02 1.731087071845083e+06 -1.621346104146578e+06 6.731467195142018e+06 -6.992410364379735e+03 1.780134004661770e+03 2.222014697035780e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.310000000000000e+02 1.730947222790985e+06 -1.621310500764344e+06 6.731511634128932e+06 -6.992442825454405e+03 1.780189736618554e+03 2.221867117313421e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.320000000000000e+02 1.730807373089085e+06 -1.621274896267845e+06 6.731556070163710e+06 -6.992475284259239e+03 1.780245468988063e+03 2.221719532759639e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.330000000000000e+02 1.730667522739654e+06 -1.621239290657156e+06 6.731600503246279e+06 -6.992507740541056e+03 1.780301201297032e+03 2.221571944563131e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.340000000000000e+02 1.730527671742654e+06 -1.621203683932259e+06 6.731644933376641e+06 -6.992540192136785e+03 1.780356931361992e+03 2.221424361291008e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.350000000000000e+02 1.730387820098045e+06 -1.621168076093143e+06 6.731689360554819e+06 -6.992572640780974e+03 1.780412661400005e+03 2.221276775673591e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.360000000000000e+02 1.730247967806095e+06 -1.621132467139871e+06 6.731733784780721e+06 -6.992605086823941e+03 1.780468390986663e+03 2.221129186990639e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.370000000000000e+02 1.730108114866767e+06 -1.621096857072433e+06 6.731778206054363e+06 -6.992637529358422e+03 1.780524119742420e+03 2.220981598375702e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.380000000000000e+02 1.729968261280127e+06 -1.621061245890843e+06 6.731822624375726e+06 -6.992669968704567e+03 1.780579847649857e+03 2.220834008852956e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.390000000000000e+02 1.729828407046136e+06 -1.621025633595088e+06 6.731867039744823e+06 -6.992702404769666e+03 1.780635575036654e+03 2.220686418428068e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.400000000000000e+02 1.729688552165064e+06 -1.620990020185234e+06 6.731911452161571e+06 -6.992734838239789e+03 1.780691302445983e+03 2.220538824510611e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.410000000000000e+02 1.729548696636866e+06 -1.620954405661264e+06 6.731955861625980e+06 -6.992767267619702e+03 1.780747028117848e+03 2.220391233240896e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.420000000000000e+02 1.729408840461614e+06 -1.620918790023198e+06 6.732000268138031e+06 -6.992799694138846e+03 1.780802753215146e+03 2.220243639814217e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.430000000000000e+02 1.729268983639267e+06 -1.620883173271022e+06 6.732044671697740e+06 -6.992832117325859e+03 1.780858477992181e+03 2.220096045471458e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.440000000000000e+02 1.729129126170100e+06 -1.620847555404804e+06 6.732089072305020e+06 -6.992864537384460e+03 1.780914201872353e+03 2.219948450077072e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.450000000000000e+02 1.728989268054066e+06 -1.620811936424528e+06 6.732133469959885e+06 -6.992896953954958e+03 1.780969924859610e+03 2.219800854741612e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.460000000000000e+02 1.728849409291130e+06 -1.620776316330181e+06 6.732177864662349e+06 -6.992929367535171e+03 1.781025647532081e+03 2.219653257426745e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.470000000000000e+02 1.728709549881560e+06 -1.620740695121828e+06 6.732222256412325e+06 -6.992961777948039e+03 1.781081369336424e+03 2.219505659156133e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.480000000000000e+02 1.728569689825322e+06 -1.620705072799462e+06 6.732266645209828e+06 -6.992994185079847e+03 1.781137090664309e+03 2.219358059945457e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.490000000000000e+02 1.728429829122475e+06 -1.620669449363091e+06 6.732311031054841e+06 -6.993026588580354e+03 1.781192810488225e+03 2.219210461762769e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.500000000000000e+02 1.728289967772986e+06 -1.620633824812707e+06 6.732355413947369e+06 -6.993058990117106e+03 1.781248531236799e+03 2.219062857354927e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.510000000000000e+02 1.728150105777122e+06 -1.620598199148376e+06 6.732399793887339e+06 -6.993091387380069e+03 1.781304250165506e+03 2.218915256237079e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.520000000000000e+02 1.728010243134843e+06 -1.620562572370082e+06 6.732444170874756e+06 -6.993123781747407e+03 1.781359968579554e+03 2.218767653017864e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.530000000000000e+02 1.727870379846111e+06 -1.620526944477811e+06 6.732488544909636e+06 -6.993156173411444e+03 1.781415686939727e+03 2.218620046704903e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.540000000000000e+02 1.727730515911199e+06 -1.620491315471636e+06 6.732532915991894e+06 -6.993188561333301e+03 1.781471403954528e+03 2.218472441627619e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.550000000000000e+02 1.727590651330071e+06 -1.620455685351544e+06 6.732577284121541e+06 -6.993220945140077e+03 1.781527119714252e+03 2.218324838864598e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.560000000000000e+02 1.727450786102778e+06 -1.620420054117538e+06 6.732621649298561e+06 -6.993253326666828e+03 1.781582835400595e+03 2.218177231712694e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.570000000000000e+02 1.727310920229296e+06 -1.620384421769618e+06 6.732666011522965e+06 -6.993285704902145e+03 1.781638550462178e+03 2.218029623780379e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.580000000000000e+02 1.727171053709885e+06 -1.620348788307842e+06 6.732710370794670e+06 -6.993318079921808e+03 1.781694264981581e+03 2.217882014761757e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.590000000000000e+02 1.727031186544510e+06 -1.620313153732198e+06 6.732754727113689e+06 -6.993350451807542e+03 1.781749978440594e+03 2.217734404849198e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.600000000000000e+02 1.726891318733139e+06 -1.620277518042682e+06 6.732799080480036e+06 -6.993382820400194e+03 1.781805691638424e+03 2.217586793848638e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.610000000000000e+02 1.726751450276030e+06 -1.620241881239349e+06 6.732843430893625e+06 -6.993415185798357e+03 1.781861403870600e+03 2.217439182060405e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.620000000000000e+02 1.726611581173155e+06 -1.620206243322197e+06 6.732887778354471e+06 -6.993447548276673e+03 1.781917115884523e+03 2.217291567989876e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.630000000000000e+02 1.726471711424569e+06 -1.620170604291228e+06 6.732932122862550e+06 -6.993479907048562e+03 1.781972826445063e+03 2.217143955138755e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.640000000000000e+02 1.726331841030242e+06 -1.620134964146439e+06 6.732976464417879e+06 -6.993512263030296e+03 1.782028537079825e+03 2.216996339351365e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.650000000000000e+02 1.726191969990438e+06 -1.620099322887892e+06 6.733020803020375e+06 -6.993544615576566e+03 1.782084246660931e+03 2.216848723599360e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.660000000000000e+02 1.726052098305120e+06 -1.620063680515575e+06 6.733065138670048e+06 -6.993576964988890e+03 1.782139955629471e+03 2.216701106568098e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.670000000000000e+02 1.725912225974357e+06 -1.620028037029504e+06 6.733109471366876e+06 -6.993609311096413e+03 1.782195663744381e+03 2.216553488994975e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.680000000000000e+02 1.725772352998100e+06 -1.619992392429660e+06 6.733153801110880e+06 -6.993641653682121e+03 1.782251371114116e+03 2.216405871459945e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.690000000000000e+02 1.725632479376631e+06 -1.619956746716118e+06 6.733198127901971e+06 -6.993673993420065e+03 1.782307077955091e+03 2.216258251685758e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.700000000000000e+02 1.725492605109902e+06 -1.619921099888859e+06 6.733242451740161e+06 -6.993706330504468e+03 1.782362784586645e+03 2.216110628794574e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.710000000000000e+02 1.725352730197881e+06 -1.619885451947875e+06 6.733286772625466e+06 -6.993738663703769e+03 1.782418490220631e+03 2.215963007285874e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.720000000000000e+02 1.725212854640831e+06 -1.619849802893224e+06 6.733331090557802e+06 -6.993770993806972e+03 1.782474194946793e+03 2.215815384634595e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.730000000000000e+02 1.725072978438723e+06 -1.619814152724904e+06 6.733375405537178e+06 -6.993803320625217e+03 1.782529899206590e+03 2.215667761046581e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.740000000000000e+02 1.724933101591610e+06 -1.619778501442921e+06 6.733419717563579e+06 -6.993835644017250e+03 1.782585602205591e+03 2.215520137644477e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.750000000000000e+02 1.724793224099464e+06 -1.619742849047268e+06 6.733464026637015e+06 -6.993867964386905e+03 1.782641305073130e+03 2.215372512202341e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.760000000000000e+02 1.724653345962548e+06 -1.619707195538006e+06 6.733508332757406e+06 -6.993900281636226e+03 1.782697007151201e+03 2.215224885590836e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.770000000000000e+02 1.724513467180826e+06 -1.619671540915125e+06 6.733552635924757e+06 -6.993932595071406e+03 1.782752707926491e+03 2.215077260405867e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.780000000000000e+02 1.724373587754260e+06 -1.619635885178614e+06 6.733596936139089e+06 -6.993964906401462e+03 1.782808409178824e+03 2.214929629808984e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.790000000000000e+02 1.724233707683118e+06 -1.619600228328536e+06 6.733641233400315e+06 -6.993997213928904e+03 1.782864109361662e+03 2.214782000401841e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.800000000000000e+02 1.724093826967360e+06 -1.619564570364878e+06 6.733685527708449e+06 -6.994029518016494e+03 1.782919808325387e+03 2.214634371187594e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.810000000000000e+02 1.723953945607057e+06 -1.619528911287660e+06 6.733729819063471e+06 -6.994061819171932e+03 1.782975506881555e+03 2.214486739890594e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.820000000000000e+02 1.723814063602165e+06 -1.619493251096861e+06 6.733774107465394e+06 -6.994094117089247e+03 1.783031204962355e+03 2.214339107519174e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.830000000000000e+02 1.723674180952956e+06 -1.619457589792555e+06 6.733818392914132e+06 -6.994126412332726e+03 1.783086902758391e+03 2.214191472156616e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.840000000000000e+02 1.723534297659392e+06 -1.619421927374725e+06 6.733862675409703e+06 -6.994158703899839e+03 1.783142599369113e+03 2.214043837692388e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.850000000000000e+02 1.723394413721429e+06 -1.619386263843357e+06 6.733906954952113e+06 -6.994190992125865e+03 1.783198295281001e+03 2.213896202666122e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.860000000000000e+02 1.723254529139346e+06 -1.619350599198522e+06 6.733951231541284e+06 -6.994223277193564e+03 1.783253990563208e+03 2.213748566450597e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.870000000000000e+02 1.723114643913097e+06 -1.619314933440205e+06 6.733995505177228e+06 -6.994255558764830e+03 1.783309684798863e+03 2.213600930455522e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.880000000000000e+02 1.722974758042750e+06 -1.619279266568419e+06 6.734039775859923e+06 -6.994287837448115e+03 1.783365378715041e+03 2.213453292163937e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.890000000000000e+02 1.722834871528261e+06 -1.619243598583147e+06 6.734084043589382e+06 -6.994320112837156e+03 1.783421071834154e+03 2.213305653249629e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.900000000000000e+02 1.722694984369912e+06 -1.619207929484468e+06 6.734128308365524e+06 -6.994352385045797e+03 1.783476764345782e+03 2.213158013195413e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.910000000000000e+02 1.722555096567650e+06 -1.619172259272357e+06 6.734172570188360e+06 -6.994384654039495e+03 1.783532456310526e+03 2.213010372056317e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.920000000000000e+02 1.722415208121548e+06 -1.619136587946832e+06 6.734216829057872e+06 -6.994416919865273e+03 1.783588147271789e+03 2.212862730080124e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.930000000000000e+02 1.722275319031566e+06 -1.619100915507882e+06 6.734261084974072e+06 -6.994449182959667e+03 1.783643838256098e+03 2.212715085024537e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.940000000000000e+02 1.722135429297975e+06 -1.619065241955574e+06 6.734305337936877e+06 -6.994481441784483e+03 1.783699527596361e+03 2.212567443108161e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.950000000000000e+02 1.721995538920732e+06 -1.619029567289892e+06 6.734349587946297e+06 -6.994513697897254e+03 1.783755216542620e+03 2.212419798412150e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.960000000000000e+02 1.721855647899803e+06 -1.618993891510824e+06 6.734393835002349e+06 -6.994545950847165e+03 1.783810905006574e+03 2.212272152413608e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.970000000000000e+02 1.721715756235457e+06 -1.618958214618438e+06 6.734438079104947e+06 -6.994578200540919e+03 1.783866592690915e+03 2.212124505659085e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.980000000000000e+02 1.721575863927658e+06 -1.618922536612725e+06 6.734482320254104e+06 -6.994610447044747e+03 1.783922279840981e+03 2.211976857730946e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.990000000000000e+02 1.721435970976461e+06 -1.618886857493687e+06 6.734526558449800e+06 -6.994642690364670e+03 1.783977965901761e+03 2.211829209089574e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.000000000000000e+02 1.721296077381841e+06 -1.618851177261326e+06 6.734570793692051e+06 -6.994674930409373e+03 1.784033651777650e+03 2.211681559238106e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.010000000000000e+02 1.721156183144053e+06 -1.618815495915695e+06 6.734615025980770e+06 -6.994707167260653e+03 1.784089336727185e+03 2.211533908562366e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.020000000000000e+02 1.721016288263068e+06 -1.618779813456789e+06 6.734659255315970e+06 -6.994739400954864e+03 1.784145020907811e+03 2.211386256813358e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.030000000000000e+02 1.720876392738847e+06 -1.618744129884595e+06 6.734703481697666e+06 -6.994771631636141e+03 1.784200704879179e+03 2.211238603059505e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.040000000000000e+02 1.720736496571658e+06 -1.618708445199179e+06 6.734747705125772e+06 -6.994803858566872e+03 1.784256387534993e+03 2.211090950550148e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.050000000000000e+02 1.720596599761464e+06 -1.618672759400526e+06 6.734791925600304e+06 -6.994836082807235e+03 1.784312070041528e+03 2.210943294980843e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.060000000000000e+02 1.720456702308326e+06 -1.618637072488652e+06 6.734836143121240e+06 -6.994868303407311e+03 1.784367751164815e+03 2.210795640371875e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.070000000000000e+02 1.720316804212209e+06 -1.618601384463543e+06 6.734880357688593e+06 -6.994900520671396e+03 1.784423431930438e+03 2.210647984891068e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.080000000000000e+02 1.720176905473379e+06 -1.618565695325265e+06 6.734924569302278e+06 -6.994932734680387e+03 1.784479111823392e+03 2.210500328731711e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.090000000000000e+02 1.720037006091801e+06 -1.618530005073807e+06 6.734968777962313e+06 -6.994964946751769e+03 1.784534791983598e+03 2.210352666809860e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.100000000000000e+02 1.719897106067441e+06 -1.618494313709161e+06 6.735012983668707e+06 -6.994997154651225e+03 1.784590470980616e+03 2.210205007312582e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.110000000000000e+02 1.719757205400554e+06 -1.618458621231380e+06 6.735057186421377e+06 -6.995029359374967e+03 1.784646148996735e+03 2.210057346983207e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.120000000000000e+02 1.719617304091119e+06 -1.618422927640466e+06 6.735101386220334e+06 -6.995061560857946e+03 1.784701826453647e+03 2.209909685659690e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.130000000000000e+02 1.719477402139191e+06 -1.618387232936425e+06 6.735145583065565e+06 -6.995093759225636e+03 1.784757503058149e+03 2.209762023204993e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.140000000000000e+02 1.719337499544732e+06 -1.618351537119246e+06 6.735189776957073e+06 -6.995125953961325e+03 1.784813179029791e+03 2.209614361037471e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.150000000000000e+02 1.719197596308011e+06 -1.618315840188994e+06 6.735233967894783e+06 -6.995158145813993e+03 1.784868854439027e+03 2.209466696765224e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.160000000000000e+02 1.719057692428991e+06 -1.618280142145656e+06 6.735278155878705e+06 -6.995190334454795e+03 1.784924529066697e+03 2.209319031601118e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.170000000000000e+02 1.718917787907739e+06 -1.618244442989251e+06 6.735322340908819e+06 -6.995222519951352e+03 1.784980203019225e+03 2.209171365242649e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.180000000000000e+02 1.718777882744214e+06 -1.618208742719761e+06 6.735366522985138e+06 -6.995254702687253e+03 1.785035876855270e+03 2.209023696012410e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.190000000000000e+02 1.718637976938684e+06 -1.618173041337255e+06 6.735410702107579e+06 -6.995286881091852e+03 1.785091549196073e+03 2.208876029992622e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.200000000000000e+02 1.718498070491112e+06 -1.618137338841716e+06 6.735454878276155e+06 -6.995319056951176e+03 1.785147220942245e+03 2.208728360844045e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.210000000000000e+02 1.718358163401461e+06 -1.618101635233137e+06 6.735499051490875e+06 -6.995351229528515e+03 1.785202892209666e+03 2.208580690760038e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.220000000000000e+02 1.718218255670001e+06 -1.618065930511586e+06 6.735543221751661e+06 -6.995383399109172e+03 1.785258563215323e+03 2.208433018664414e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.230000000000000e+02 1.718078347296688e+06 -1.618030224677039e+06 6.735587389058526e+06 -6.995415564999460e+03 1.785314232768309e+03 2.208285347747669e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.240000000000000e+02 1.717938438281594e+06 -1.617994517729522e+06 6.735631553411445e+06 -6.995447727988952e+03 1.785369901767240e+03 2.208137674773579e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.250000000000000e+02 1.717798528624683e+06 -1.617958809669023e+06 6.735675714810438e+06 -6.995479887645610e+03 1.785425570620647e+03 2.207990000734077e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.260000000000000e+02 1.717658618326210e+06 -1.617923100495594e+06 6.735719873255414e+06 -6.995512044178225e+03 1.785481238334777e+03 2.207842325838744e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.270000000000000e+02 1.717518707386149e+06 -1.617887390209236e+06 6.735764028746390e+06 -6.995544197466199e+03 1.785536905366557e+03 2.207694650067863e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.280000000000000e+02 1.717378795804460e+06 -1.617851678809934e+06 6.735808181283381e+06 -6.995576347504608e+03 1.785592572088005e+03 2.207546973114762e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.290000000000000e+02 1.717238883581404e+06 -1.617815966297745e+06 6.735852330866301e+06 -6.995608494704018e+03 1.785648237976797e+03 2.207399294152330e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.300000000000000e+02 1.717098970716957e+06 -1.617780252672672e+06 6.735896477495158e+06 -6.995640638280634e+03 1.785703903204583e+03 2.207251615474004e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.310000000000000e+02 1.716959057211169e+06 -1.617744537934713e+06 6.735940621169942e+06 -6.995672778519101e+03 1.785759567126987e+03 2.207103936750951e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.320000000000000e+02 1.716819143064013e+06 -1.617708822083869e+06 6.735984761890661e+06 -6.995704915990224e+03 1.785815231262899e+03 2.206956254889367e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.330000000000000e+02 1.716679228275752e+06 -1.617673105120197e+06 6.736028899657230e+06 -6.995737049693253e+03 1.785870894005316e+03 2.206808574399307e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.340000000000000e+02 1.716539312846351e+06 -1.617637387043690e+06 6.736073034469665e+06 -6.995769180803757e+03 1.785926556606232e+03 2.206660890532933e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.350000000000000e+02 1.716399396775773e+06 -1.617601667854335e+06 6.736117166327976e+06 -6.995801308340564e+03 1.785982218352074e+03 2.206513206966156e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.360000000000000e+02 1.716259480064280e+06 -1.617565947552192e+06 6.736161295232082e+06 -6.995833432974294e+03 1.786037879638001e+03 2.206365521266414e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.370000000000000e+02 1.716119562711838e+06 -1.617530226137252e+06 6.736205421181995e+06 -6.995865553850672e+03 1.786093539676560e+03 2.206217836778853e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.380000000000000e+02 1.715979644718513e+06 -1.617494503609531e+06 6.736249544177695e+06 -6.995897671822681e+03 1.786149199080754e+03 2.206070150313483e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.390000000000000e+02 1.715839726084269e+06 -1.617458779969018e+06 6.736293664219196e+06 -6.995929785942603e+03 1.786204857660501e+03 2.205922464989731e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.400000000000000e+02 1.715699806809372e+06 -1.617423055215776e+06 6.736337781306412e+06 -6.995961898000954e+03 1.786260516471809e+03 2.205774774309836e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.410000000000000e+02 1.715559886893776e+06 -1.617387329349788e+06 6.736381895439360e+06 -6.995994006033747e+03 1.786316173678752e+03 2.205627085988342e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.420000000000000e+02 1.715419966337558e+06 -1.617351602371076e+06 6.736426006618017e+06 -6.996026111109516e+03 1.786371830455845e+03 2.205479395675706e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.430000000000000e+02 1.715280045140677e+06 -1.617315874279625e+06 6.736470114842398e+06 -6.996058212682113e+03 1.786427486475207e+03 2.205331705359260e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.440000000000000e+02 1.715140123303400e+06 -1.617280145075501e+06 6.736514220112419e+06 -6.996090311309968e+03 1.786483141982314e+03 2.205184013084622e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.450000000000000e+02 1.715000200825686e+06 -1.617244414758689e+06 6.736558322428092e+06 -6.996122407600003e+03 1.786538797520337e+03 2.205036316487503e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.460000000000000e+02 1.714860277707500e+06 -1.617208683329177e+06 6.736602421789434e+06 -6.996154499818860e+03 1.786594451727507e+03 2.204888622155087e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.470000000000000e+02 1.714720353949113e+06 -1.617172950787035e+06 6.736646518196354e+06 -6.996186588805265e+03 1.786650105169176e+03 2.204740926981240e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.480000000000000e+02 1.714580429550481e+06 -1.617137217132244e+06 6.736690611648871e+06 -6.996218674318196e+03 1.786705757628773e+03 2.204593231905792e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.490000000000000e+02 1.714440504511679e+06 -1.617101482364829e+06 6.736734702146962e+06 -6.996250756927780e+03 1.786761409627617e+03 2.204445534697972e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.500000000000000e+02 1.714300578832656e+06 -1.617065746484765e+06 6.736778789690644e+06 -6.996282835690771e+03 1.786817060563261e+03 2.204297838823356e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.510000000000000e+02 1.714160652513692e+06 -1.617030009492127e+06 6.736822874279828e+06 -6.996314912079181e+03 1.786872711551145e+03 2.204150138721271e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.520000000000000e+02 1.714020725554739e+06 -1.616994271386893e+06 6.736866955914532e+06 -6.996346985085706e+03 1.786928361411332e+03 2.204002438558240e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.530000000000000e+02 1.713880797955767e+06 -1.616958532169063e+06 6.736911034594767e+06 -6.996379055584121e+03 1.786984011640965e+03 2.203854734308467e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.540000000000000e+02 1.713740869717042e+06 -1.616922791838693e+06 6.736955110320448e+06 -6.996411121532438e+03 1.787039659786870e+03 2.203707034473406e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.550000000000000e+02 1.713600940838526e+06 -1.616887050395777e+06 6.736999183091589e+06 -6.996443184808337e+03 1.787095307673700e+03 2.203559331609728e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.560000000000000e+02 1.713461011320279e+06 -1.616851307840321e+06 6.737043252908173e+06 -6.996475244639800e+03 1.787150954579057e+03 2.203411628753925e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.570000000000000e+02 1.713321081162275e+06 -1.616815564172324e+06 6.737087319770211e+06 -6.996507301470488e+03 1.787206601274958e+03 2.203263923851096e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.580000000000000e+02 1.713181150364772e+06 -1.616779819391844e+06 6.737131383677619e+06 -6.996539355396435e+03 1.787262247423675e+03 2.203116216894265e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.590000000000000e+02 1.713041218927735e+06 -1.616744073498868e+06 6.737175444630407e+06 -6.996571405569885e+03 1.787317892178418e+03 2.202968511265324e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.600000000000000e+02 1.712901286851128e+06 -1.616708326493389e+06 6.737219502628593e+06 -6.996603452154357e+03 1.787373536392441e+03 2.202820805713456e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.610000000000000e+02 1.712761354135216e+06 -1.616672578375467e+06 6.737263557672093e+06 -6.996635497037963e+03 1.787429181037473e+03 2.202673093498835e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.620000000000000e+02 1.712621420779960e+06 -1.616636829145091e+06 6.737307609760917e+06 -6.996667538650453e+03 1.787484824900065e+03 2.202525380577880e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.630000000000000e+02 1.712481486785434e+06 -1.616601078802281e+06 6.737351658895048e+06 -6.996699575417876e+03 1.787540466407916e+03 2.202377673231953e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.640000000000000e+02 1.712341552151591e+06 -1.616565327347019e+06 6.737395705074499e+06 -6.996731609994899e+03 1.787596108575963e+03 2.202229960552225e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.650000000000000e+02 1.712201616878703e+06 -1.616529574779371e+06 6.737439748299186e+06 -6.996763640298523e+03 1.787651748948747e+03 2.202082251177155e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.660000000000000e+02 1.712061680966726e+06 -1.616493821099322e+06 6.737483788569118e+06 -6.996795668800434e+03 1.787707389746352e+03 2.201934535457770e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.670000000000000e+02 1.711921744415740e+06 -1.616458066306897e+06 6.737527825884283e+06 -6.996827693533102e+03 1.787763029424054e+03 2.201786820881752e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.680000000000000e+02 1.711781807225689e+06 -1.616422310402071e+06 6.737571860244687e+06 -6.996859714394905e+03 1.787818668069563e+03 2.201639107690900e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.690000000000000e+02 1.711641869396850e+06 -1.616386553384913e+06 6.737615891650253e+06 -6.996891732736618e+03 1.787874306211186e+03 2.201491391205953e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.700000000000000e+02 1.711501930929190e+06 -1.616350795255420e+06 6.737659920100988e+06 -6.996923748057778e+03 1.787929944201448e+03 2.201343672684012e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.710000000000000e+02 1.711361991822659e+06 -1.616315036013564e+06 6.737703945596911e+06 -6.996955759608718e+03 1.787985580897418e+03 2.201195955460822e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.720000000000000e+02 1.711222052077537e+06 -1.616279275659425e+06 6.737747968137934e+06 -6.996987768277354e+03 1.788041217242870e+03 2.201048235941617e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.730000000000000e+02 1.711082111693778e+06 -1.616243514192981e+06 6.737791987724068e+06 -6.997019773902808e+03 1.788096853060689e+03 2.200900514782885e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.740000000000000e+02 1.710942170671455e+06 -1.616207751614253e+06 6.737836004355302e+06 -6.997051775931308e+03 1.788152487590071e+03 2.200752794376763e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.750000000000000e+02 1.710802229010522e+06 -1.616171987923224e+06 6.737880018031639e+06 -6.997083775132112e+03 1.788208122106924e+03 2.200605071209763e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.760000000000000e+02 1.710662286711251e+06 -1.616136223119961e+06 6.737924028753002e+06 -6.997115770901691e+03 1.788263755735159e+03 2.200457347929930e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.770000000000000e+02 1.710522343773605e+06 -1.616100457204452e+06 6.737968036519404e+06 -6.997147763257215e+03 1.788319388200330e+03 2.200309624722367e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.780000000000000e+02 1.710382400197543e+06 -1.616064690176684e+06 6.738012041330853e+06 -6.997179752824416e+03 1.788375020665803e+03 2.200161898619253e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.790000000000000e+02 1.710242455983337e+06 -1.616028922036726e+06 6.738056043187270e+06 -6.997211738977166e+03 1.788430652102579e+03 2.200014172472839e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.800000000000000e+02 1.710102511130947e+06 -1.615993152784561e+06 6.738100042088664e+06 -6.997243721861826e+03 1.788486282925033e+03 2.199866445465263e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.810000000000000e+02 1.709962565640442e+06 -1.615957382420208e+06 6.738144038035023e+06 -6.997275701886294e+03 1.788541913105855e+03 2.199718716344633e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.820000000000000e+02 1.709822619511776e+06 -1.615921610943648e+06 6.738188031026352e+06 -6.997307678026144e+03 1.788597542430812e+03 2.199570988501070e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.830000000000000e+02 1.709682672745223e+06 -1.615885838354952e+06 6.738232021062573e+06 -6.997339651633577e+03 1.788653171419495e+03 2.199423257253571e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.840000000000000e+02 1.709542725340743e+06 -1.615850064654106e+06 6.738276008143694e+06 -6.997371621411067e+03 1.788708799030186e+03 2.199275527566653e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.850000000000000e+02 1.709402777298302e+06 -1.615814289841099e+06 6.738319992269731e+06 -6.997403588212887e+03 1.788764426484134e+03 2.199127795705877e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.860000000000000e+02 1.709262828618163e+06 -1.615778513915994e+06 6.738363973440602e+06 -6.997435552140692e+03 1.788820053337727e+03 2.198980061738944e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.870000000000000e+02 1.709122879300291e+06 -1.615742736878782e+06 6.738407951656317e+06 -6.997467511977956e+03 1.788875678792470e+03 2.198832330166702e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.880000000000000e+02 1.708982929344752e+06 -1.615706958729476e+06 6.738451926916858e+06 -6.997499469186370e+03 1.788931304070586e+03 2.198684595352567e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.890000000000000e+02 1.708842978751507e+06 -1.615671179468062e+06 6.738495899222238e+06 -6.997531423147208e+03 1.788986928671406e+03 2.198536859667926e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.900000000000000e+02 1.708703027520821e+06 -1.615635399094606e+06 6.738539868572372e+06 -6.997563374483825e+03 1.789042553080624e+03 2.198389120739253e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.910000000000000e+02 1.708563075652664e+06 -1.615599617609100e+06 6.738583834967276e+06 -6.997595322022561e+03 1.789098176325708e+03 2.198241383085854e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.920000000000000e+02 1.708423123147091e+06 -1.615563835011552e+06 6.738627798406929e+06 -6.997627266402177e+03 1.789153798668073e+03 2.198093644481364e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.930000000000000e+02 1.708283170004073e+06 -1.615528051301954e+06 6.738671758891343e+06 -6.997659207475152e+03 1.789209420734945e+03 2.197945904841438e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.940000000000000e+02 1.708143216223874e+06 -1.615492266480371e+06 6.738715716420436e+06 -6.997691145415874e+03 1.789265041861401e+03 2.197798164199143e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.950000000000000e+02 1.708003261806450e+06 -1.615456480546784e+06 6.738759670994219e+06 -6.997723080350030e+03 1.789320662434918e+03 2.197650421823571e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.960000000000000e+02 1.707863306751778e+06 -1.615420693501192e+06 6.738803622612708e+06 -6.997755011293856e+03 1.789376281749850e+03 2.197502681409092e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.970000000000000e+02 1.707723351060114e+06 -1.615384905343655e+06 6.738847571275818e+06 -6.997786939527977e+03 1.789431900910362e+03 2.197354937984946e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.980000000000000e+02 1.707583394731426e+06 -1.615349116074160e+06 6.738891516983561e+06 -6.997818864291075e+03 1.789487518992699e+03 2.197207194739210e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.990000000000000e+02 1.707443437765775e+06 -1.615313325692721e+06 6.738935459735919e+06 -6.997850786422702e+03 1.789543136859376e+03 2.197059448291714e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.000000000000000e+02 1.707303480163128e+06 -1.615277534199329e+06 6.738979399532907e+06 -6.997882705007063e+03 1.789598754102140e+03 2.196911701865640e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.010000000000000e+02 1.707163521923746e+06 -1.615241741594042e+06 6.739023336374437e+06 -6.997914620980685e+03 1.789654370754623e+03 2.196763952498751e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.020000000000000e+02 1.707023563047603e+06 -1.615205947876863e+06 6.739067270260524e+06 -6.997946532620296e+03 1.789709985982323e+03 2.196616206315391e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.030000000000000e+02 1.706883603534647e+06 -1.615170153047762e+06 6.739111201191181e+06 -6.997978441577400e+03 1.789765600838530e+03 2.196468457225374e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.040000000000000e+02 1.706743643385157e+06 -1.615134357106816e+06 6.739155129166325e+06 -6.998010347311229e+03 1.789821215208512e+03 2.196320707022301e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.050000000000000e+02 1.706603682599092e+06 -1.615098560054011e+06 6.739199054185969e+06 -6.998042250133845e+03 1.789876829088811e+03 2.196172954731485e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.060000000000000e+02 1.706463721176513e+06 -1.615062761889355e+06 6.739242976250093e+06 -6.998074149509868e+03 1.789932441860801e+03 2.196025202569337e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.070000000000000e+02 1.706323759117389e+06 -1.615026962612844e+06 6.739286895358710e+06 -6.998106046139838e+03 1.789988054675684e+03 2.195877447337487e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.080000000000000e+02 1.706183796421985e+06 -1.614991162224540e+06 6.739330811511736e+06 -6.998137938975793e+03 1.790043666182843e+03 2.195729693496842e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.090000000000000e+02 1.706043833090260e+06 -1.614955360724428e+06 6.739374724709190e+06 -6.998169827910770e+03 1.790099276072152e+03 2.195581941653554e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.100000000000000e+02 1.705903869122182e+06 -1.614919558112502e+06 6.739418634951074e+06 -6.998201714574954e+03 1.790154886671941e+03 2.195434184668919e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.110000000000000e+02 1.705763904518013e+06 -1.614883754388820e+06 6.739462542237313e+06 -6.998233597587850e+03 1.790210495840079e+03 2.195286428736944e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.120000000000000e+02 1.705623939277723e+06 -1.614847949553378e+06 6.739506446567915e+06 -6.998265477845741e+03 1.790266104766843e+03 2.195138670010587e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.130000000000000e+02 1.705483973401369e+06 -1.614812143606184e+06 6.739550347942867e+06 -6.998297354704502e+03 1.790321712884275e+03 2.194990911003948e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.140000000000000e+02 1.705344006888919e+06 -1.614776336547228e+06 6.739594246362177e+06 -6.998329227733632e+03 1.790377319759216e+03 2.194843153444644e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.150000000000000e+02 1.705204039740639e+06 -1.614740528376577e+06 6.739638141825762e+06 -6.998361098685253e+03 1.790432926975293e+03 2.194695390458476e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.160000000000000e+02 1.705064071956488e+06 -1.614704719094214e+06 6.739682034333636e+06 -6.998392965803259e+03 1.790488533049497e+03 2.194547628844395e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.170000000000000e+02 1.704924103536536e+06 -1.614668908700157e+06 6.739725923885779e+06 -6.998424829290006e+03 1.790544137543051e+03 2.194399868351301e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.180000000000000e+02 1.704784134480747e+06 -1.614633097194398e+06 6.739769810482204e+06 -6.998456689943982e+03 1.790599742474601e+03 2.194252104714135e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.190000000000000e+02 1.704644164789382e+06 -1.614597284576993e+06 6.739813694122830e+06 -6.998488548058441e+03 1.790655346905608e+03 2.194104337831849e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.200000000000000e+02 1.704504194462405e+06 -1.614561470847934e+06 6.739857574807665e+06 -6.998520402386435e+03 1.790710950095757e+03 2.193956572260858e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.210000000000000e+02 1.704364223499778e+06 -1.614525656007209e+06 6.739901452536729e+06 -6.998552253178113e+03 1.790766552451342e+03 2.193808806862432e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.220000000000000e+02 1.704224251901777e+06 -1.614489840054887e+06 6.739945327309933e+06 -6.998584100762707e+03 1.790822154004082e+03 2.193661040576419e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.230000000000000e+02 1.704084279668354e+06 -1.614454022990949e+06 6.739989199127290e+06 -6.998615945435034e+03 1.790877755245167e+03 2.193513272049175e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.240000000000000e+02 1.703944306799579e+06 -1.614418204815415e+06 6.740033067988783e+06 -6.998647787188675e+03 1.790933355883624e+03 2.193365501554616e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.250000000000000e+02 1.703804333295416e+06 -1.614382385528273e+06 6.740076933894426e+06 -6.998679625391841e+03 1.790988955730515e+03 2.193217731239649e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.260000000000000e+02 1.703664359156131e+06 -1.614346565129586e+06 6.740120796844133e+06 -6.998711460377614e+03 1.791044555027131e+03 2.193069959848744e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.270000000000000e+02 1.703524384381679e+06 -1.614310743619336e+06 6.740164656837919e+06 -6.998743292231829e+03 1.791100153246128e+03 2.192922187573085e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.280000000000000e+02 1.703384408972035e+06 -1.614274920997521e+06 6.740208513875796e+06 -6.998775121627621e+03 1.791155751838788e+03 2.192774411032720e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.290000000000000e+02 1.703244432927461e+06 -1.614239097264203e+06 6.740252367957680e+06 -6.998806946452748e+03 1.791211348432909e+03 2.192626638927962e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.300000000000000e+02 1.703104456247920e+06 -1.614203272419370e+06 6.740296219083583e+06 -6.998838768578616e+03 1.791266944833949e+03 2.192478863809293e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.310000000000000e+02 1.702964478933474e+06 -1.614167446463033e+06 6.740340067253488e+06 -6.998870587234932e+03 1.791322540064093e+03 2.192331088948318e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.320000000000000e+02 1.702824500984088e+06 -1.614131619395182e+06 6.740383912467409e+06 -6.998902402991245e+03 1.791378135209655e+03 2.192183311608305e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.330000000000000e+02 1.702684522400030e+06 -1.614095791215884e+06 6.740427754725259e+06 -6.998934215763145e+03 1.791433729774295e+03 2.192035532487605e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.340000000000000e+02 1.702544543181261e+06 -1.614059961925124e+06 6.740471594027053e+06 -6.998966025052682e+03 1.791489323251274e+03 2.191887753592215e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.350000000000000e+02 1.702404563327745e+06 -1.614024131522892e+06 6.740515430372805e+06 -6.998997831110766e+03 1.791544916264584e+03 2.191739973589204e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.360000000000000e+02 1.702264582839753e+06 -1.613988300009256e+06 6.740559263762431e+06 -6.999029633964130e+03 1.791600508511093e+03 2.191592192659586e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.370000000000000e+02 1.702124601717241e+06 -1.613952467384199e+06 6.740603094195942e+06 -6.999061433327680e+03 1.791656099781361e+03 2.191444411881693e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.380000000000000e+02 1.701984619960277e+06 -1.613916633647736e+06 6.740646921673322e+06 -6.999093229794418e+03 1.791711690513409e+03 2.191296629010581e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.390000000000000e+02 1.701844637568824e+06 -1.613880798799858e+06 6.740690746194582e+06 -6.999125023542137e+03 1.791767281376095e+03 2.191148842902813e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.400000000000000e+02 1.701704654543146e+06 -1.613844962840626e+06 6.740734567759638e+06 -6.999156813223975e+03 1.791822870551640e+03 2.191001059377604e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.410000000000000e+02 1.701564670883209e+06 -1.613809125770029e+06 6.740778386368505e+06 -6.999188599475791e+03 1.791878458746031e+03 2.190853275821125e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.420000000000000e+02 1.701424686589081e+06 -1.613773287588088e+06 6.740822202021162e+06 -6.999220383052144e+03 1.791934046760838e+03 2.190705489162285e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.430000000000000e+02 1.701284701660718e+06 -1.613737448294781e+06 6.740866014717625e+06 -6.999252163965377e+03 1.791989634867829e+03 2.190557699124085e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.440000000000000e+02 1.701144716098390e+06 -1.613701607890178e+06 6.740909824457804e+06 -6.999283941055292e+03 1.792045221538418e+03 2.190409910688130e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.450000000000000e+02 1.701004729902057e+06 -1.613665766374263e+06 6.740953631241721e+06 -6.999315715046498e+03 1.792100807384287e+03 2.190262121043199e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.460000000000000e+02 1.700864743071689e+06 -1.613629923747034e+06 6.740997435069381e+06 -6.999347485103588e+03 1.792156392441752e+03 2.190114332782465e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.470000000000000e+02 1.700724755607543e+06 -1.613594080008544e+06 6.741041235940708e+06 -6.999379253193498e+03 1.792211977492254e+03 2.189966539041792e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.480000000000000e+02 1.700584767509596e+06 -1.613558235158792e+06 6.741085033855708e+06 -6.999411017744412e+03 1.792267561760331e+03 2.189818745438370e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.490000000000000e+02 1.700444778777900e+06 -1.613522389197785e+06 6.741128828814365e+06 -6.999442778271967e+03 1.792323144302062e+03 2.189670954320804e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.500000000000000e+02 1.700304789412422e+06 -1.613486542125514e+06 6.741172620816694e+06 -6.999474536623522e+03 1.792378727693209e+03 2.189523157629086e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.510000000000000e+02 1.700164799413425e+06 -1.613450693942038e+06 6.741216409862608e+06 -6.999506290408727e+03 1.792434308681378e+03 2.189375365722627e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.520000000000000e+02 1.700024808780883e+06 -1.613414844647356e+06 6.741260195952121e+06 -6.999538042123256e+03 1.792489890064707e+03 2.189227568308035e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.530000000000000e+02 1.699884817514749e+06 -1.613378994241449e+06 6.741303979085249e+06 -6.999569790302237e+03 1.792545470655395e+03 2.189079771029366e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.540000000000000e+02 1.699744825615294e+06 -1.613343142724382e+06 6.741347759261902e+06 -6.999601535829174e+03 1.792601050992146e+03 2.188931970637475e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.550000000000000e+02 1.699604833082479e+06 -1.613307290096147e+06 6.741391536482102e+06 -6.999633277565603e+03 1.792656630147607e+03 2.188784171523469e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.560000000000000e+02 1.699464839916368e+06 -1.613271436356752e+06 6.741435310745824e+06 -6.999665015870402e+03 1.792712208282344e+03 2.188636372418755e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.570000000000000e+02 1.699324846116924e+06 -1.613235581506188e+06 6.741479082053081e+06 -6.999696750908305e+03 1.792767785706026e+03 2.188488572534342e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.580000000000000e+02 1.699184851684420e+06 -1.613199725544525e+06 6.741522850403792e+06 -6.999728483007308e+03 1.792823362849316e+03 2.188340770461543e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.590000000000000e+02 1.699044856618815e+06 -1.613163868471746e+06 6.741566615797967e+06 -6.999760211114998e+03 1.792878938258903e+03 2.188192970783075e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.600000000000000e+02 1.698904860920071e+06 -1.613128010287841e+06 6.741610378235621e+06 -6.999791937002246e+03 1.792934514472683e+03 2.188045165706395e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.610000000000000e+02 1.698764864588452e+06 -1.613092150992870e+06 6.741654137716672e+06 -6.999823660076083e+03 1.792990089890445e+03 2.187897358497682e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.620000000000000e+02 1.698624867623924e+06 -1.613056290586827e+06 6.741697894241130e+06 -6.999855379302867e+03 1.793045664078758e+03 2.187749552788102e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.630000000000000e+02 1.698484870026559e+06 -1.613020429069729e+06 6.741741647808977e+06 -6.999887095629117e+03 1.793101238089940e+03 2.187601744678283e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.640000000000000e+02 1.698344871796301e+06 -1.612984566441550e+06 6.741785398420230e+06 -6.999918808428782e+03 1.793156810927718e+03 2.187453937010742e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.650000000000000e+02 1.698204872933439e+06 -1.612948702702374e+06 6.741829146074800e+06 -6.999950517748911e+03 1.793212382978943e+03 2.187306129298669e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.660000000000000e+02 1.698064873437919e+06 -1.612912837852172e+06 6.741872890772700e+06 -6.999982224444217e+03 1.793267954690980e+03 2.187158318460619e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.670000000000000e+02 1.697924873309819e+06 -1.612876971890973e+06 6.741916632513914e+06 -7.000013927577465e+03 1.793323525514338e+03 2.187010507927212e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.680000000000000e+02 1.697784872549086e+06 -1.612841104818749e+06 6.741960371298457e+06 -7.000045627829518e+03 1.793379096056755e+03 2.186862695023142e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.690000000000000e+02 1.697644871156003e+06 -1.612805236635581e+06 6.742004107126238e+06 -7.000077324249382e+03 1.793434665192634e+03 2.186714883728126e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.700000000000000e+02 1.697504869130523e+06 -1.612769367341446e+06 6.742047839997279e+06 -7.000109017849670e+03 1.793490233903781e+03 2.186567069994549e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.710000000000000e+02 1.697364866472612e+06 -1.612733496936337e+06 6.742091569911584e+06 -7.000140708094898e+03 1.793545802083088e+03 2.186419255601599e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.720000000000000e+02 1.697224863182540e+06 -1.612697625420321e+06 6.742135296869077e+06 -7.000172394612381e+03 1.793601368935710e+03 2.186271442419674e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.730000000000000e+02 1.697084859260265e+06 -1.612661752793381e+06 6.742179020869769e+06 -7.000204078508980e+03 1.793656935612436e+03 2.186123625955178e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.740000000000000e+02 1.696944854705856e+06 -1.612625879055536e+06 6.742222741913641e+06 -7.000235759735670e+03 1.793712502173738e+03 2.185975806308906e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.750000000000000e+02 1.696804849519269e+06 -1.612590004206766e+06 6.742266460000703e+06 -7.000267436596980e+03 1.793768066979747e+03 2.185827990257556e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.760000000000000e+02 1.696664843700777e+06 -1.612554128247144e+06 6.742310175130874e+06 -7.000299110551936e+03 1.793823631359425e+03 2.185680172041762e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.770000000000000e+02 1.696524837250343e+06 -1.612518251176658e+06 6.742353887304169e+06 -7.000330782137601e+03 1.793879195694148e+03 2.185532349635292e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.780000000000000e+02 1.696384830167927e+06 -1.612482372995293e+06 6.742397596520599e+06 -7.000362450424511e+03 1.793934759678061e+03 2.185384526233101e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.790000000000000e+02 1.696244822453796e+06 -1.612446493703113e+06 6.742441302780081e+06 -7.000394114500348e+03 1.793990321525712e+03 2.185236706275517e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.800000000000000e+02 1.696104814107919e+06 -1.612410613300112e+06 6.742485006082625e+06 -7.000425775863670e+03 1.794045883563240e+03 2.185088883001741e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.810000000000000e+02 1.695964805130352e+06 -1.612374731786298e+06 6.742528706428216e+06 -7.000457433989567e+03 1.794101444665885e+03 2.184941059051962e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.820000000000000e+02 1.695824795521060e+06 -1.612338849161658e+06 6.742572403816867e+06 -7.000489089208820e+03 1.794157005386226e+03 2.184793232899110e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.830000000000000e+02 1.695684785280316e+06 -1.612302965426265e+06 6.742616098248492e+06 -7.000520740610131e+03 1.794212565011190e+03 2.184645408040041e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.840000000000000e+02 1.695544774408077e+06 -1.612267080580102e+06 6.742659789723107e+06 -7.000552389446500e+03 1.794268124198974e+03 2.184497579949401e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.850000000000000e+02 1.695404762904312e+06 -1.612231194623161e+06 6.742703478240722e+06 -7.000584034381988e+03 1.794323682588483e+03 2.184349753153345e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.860000000000000e+02 1.695264750769277e+06 -1.612195307555496e+06 6.742747163801256e+06 -7.000615676486705e+03 1.794379240143321e+03 2.184201924312120e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.870000000000000e+02 1.695124738002946e+06 -1.612159419377109e+06 6.742790846404720e+06 -7.000647315554958e+03 1.794434797577997e+03 2.184054093446238e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.880000000000000e+02 1.694984724605378e+06 -1.612123530088007e+06 6.742834526051098e+06 -7.000678950436799e+03 1.794490352980184e+03 2.183906265859369e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.890000000000000e+02 1.694844710576534e+06 -1.612087639688175e+06 6.742878202740399e+06 -7.000710583623774e+03 1.794545909502213e+03 2.183758430930276e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.900000000000000e+02 1.694704695916690e+06 -1.612051748177689e+06 6.742921876472545e+06 -7.000742212835219e+03 1.794601464511656e+03 2.183610598159087e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.910000000000000e+02 1.694564680625801e+06 -1.612015855556527e+06 6.742965547247543e+06 -7.000773838806591e+03 1.794657018770213e+03 2.183462764558836e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.920000000000000e+02 1.694424664703932e+06 -1.611979961824707e+06 6.743009215065379e+06 -7.000805461623809e+03 1.794712572192576e+03 2.183314929933638e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.930000000000000e+02 1.694284648151050e+06 -1.611944066982217e+06 6.743052879926062e+06 -7.000837081400393e+03 1.794768125550791e+03 2.183167093247169e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.940000000000000e+02 1.694144630967415e+06 -1.611908171029119e+06 6.743096541829512e+06 -7.000868697750217e+03 1.794823677652680e+03 2.183019256764327e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.950000000000000e+02 1.694004613153000e+06 -1.611872273965408e+06 6.743140200775742e+06 -7.000900310031981e+03 1.794879228304595e+03 2.182871422677807e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.960000000000000e+02 1.693864594707760e+06 -1.611836375791066e+06 6.743183856764762e+06 -7.000931919914944e+03 1.794934779172717e+03 2.182723584259790e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.970000000000000e+02 1.693724575631965e+06 -1.611800476506159e+06 6.743227509796489e+06 -7.000963526572984e+03 1.794990329463763e+03 2.182575744812209e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.980000000000000e+02 1.693584555925573e+06 -1.611764576110675e+06 6.743271159870941e+06 -7.000995130122387e+03 1.795045878691390e+03 2.182427904395825e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.990000000000000e+02 1.693444535588659e+06 -1.611728674604633e+06 6.743314806988091e+06 -7.001026730337117e+03 1.795101427455766e+03 2.182280063195980e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.000000000000000e+02 1.693304514621179e+06 -1.611692771988016e+06 6.743358451147960e+06 -7.001058327910493e+03 1.795156976100237e+03 2.182132218723729e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.010000000000000e+02 1.693164493023400e+06 -1.611656868260891e+06 6.743402092350462e+06 -7.001089921750136e+03 1.795212523394227e+03 2.181984375506793e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.020000000000000e+02 1.693024470795288e+06 -1.611620963423247e+06 6.743445730595605e+06 -7.001121511818969e+03 1.795268069495192e+03 2.181836533524167e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.030000000000000e+02 1.692884447936799e+06 -1.611585057475068e+06 6.743489365883409e+06 -7.001153099423087e+03 1.795323615878637e+03 2.181688687357717e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.040000000000000e+02 1.692744424448205e+06 -1.611549150416422e+06 6.743532998213789e+06 -7.001184684178015e+03 1.795379161612897e+03 2.181540839039316e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.050000000000000e+02 1.692604400329472e+06 -1.611513242247300e+06 6.743576627586757e+06 -7.001216264556613e+03 1.795434705676412e+03 2.181392994286420e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.060000000000000e+02 1.692464375580665e+06 -1.611477332967715e+06 6.743620254002294e+06 -7.001247842874172e+03 1.795490250129057e+03 2.181245143981170e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.070000000000000e+02 1.692324350201736e+06 -1.611441422577647e+06 6.743663877460413e+06 -7.001279417408423e+03 1.795545793294791e+03 2.181097295032757e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.080000000000000e+02 1.692184324192964e+06 -1.611405511077174e+06 6.743707497961029e+06 -7.001310988118839e+03 1.795601335341285e+03 2.180949447422123e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.090000000000000e+02 1.692044297554305e+06 -1.611369598466274e+06 6.743751115504158e+06 -7.001342556241870e+03 1.795656877013560e+03 2.180801596591228e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.100000000000000e+02 1.691904270285727e+06 -1.611333684744940e+06 6.743794730089813e+06 -7.001374121062751e+03 1.795712418387241e+03 2.180653744729391e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.110000000000000e+02 1.691764242387490e+06 -1.611297769913234e+06 6.743838341717909e+06 -7.001405683043829e+03 1.795767958994177e+03 2.180505890788958e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.120000000000000e+02 1.691624213859564e+06 -1.611261853971149e+06 6.743881950388459e+06 -7.001437241175813e+03 1.795823498426961e+03 2.180358038314872e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.130000000000000e+02 1.691484184702015e+06 -1.611225936918700e+06 6.743925556101445e+06 -7.001468796667340e+03 1.795879037778229e+03 2.180210182529609e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.140000000000000e+02 1.691344154914793e+06 -1.611190018755862e+06 6.743969158856883e+06 -7.001500348411450e+03 1.795934575866181e+03 2.180062327968506e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.150000000000000e+02 1.691204124498180e+06 -1.611154099482717e+06 6.744012758654685e+06 -7.001531897207032e+03 1.795990113650140e+03 2.179914471264568e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.160000000000000e+02 1.691064093452130e+06 -1.611118179099242e+06 6.744056355494862e+06 -7.001563442745955e+03 1.796045650512110e+03 2.179766613934821e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.170000000000000e+02 1.690924061776713e+06 -1.611082257605458e+06 6.744099949377403e+06 -7.001594985147119e+03 1.796101186794325e+03 2.179618755302442e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.180000000000000e+02 1.690784029471885e+06 -1.611046335001345e+06 6.744143540302314e+06 -7.001626524239289e+03 1.796156722445986e+03 2.179470895952942e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.190000000000000e+02 1.690643996537919e+06 -1.611010411286975e+06 6.744187128269516e+06 -7.001658060489634e+03 1.796212257600030e+03 2.179323034293567e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.200000000000000e+02 1.690503962974777e+06 -1.610974486462336e+06 6.744230713279019e+06 -7.001689593185255e+03 1.796267791799870e+03 2.179175172978317e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.210000000000000e+02 1.690363928782420e+06 -1.610938560527413e+06 6.744274295330837e+06 -7.001721122084270e+03 1.796323324842885e+03 2.179027312950146e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.220000000000000e+02 1.690223893961115e+06 -1.610902633482271e+06 6.744317874424890e+06 -7.001752648347296e+03 1.796378857656717e+03 2.178879449725286e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.230000000000000e+02 1.690083858510828e+06 -1.610866705326902e+06 6.744361450561189e+06 -7.001784171981121e+03 1.796434390308268e+03 2.178731583222814e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.240000000000000e+02 1.689943822431625e+06 -1.610830776061320e+06 6.744405023739712e+06 -7.001815691831419e+03 1.796489921806990e+03 2.178583717962730e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.250000000000000e+02 1.689803785723456e+06 -1.610794845685503e+06 6.744448593960476e+06 -7.001847207882683e+03 1.796545451892644e+03 2.178435854223879e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.260000000000000e+02 1.689663748386609e+06 -1.610758914199533e+06 6.744492161223397e+06 -7.001878721285437e+03 1.796600982094303e+03 2.178287987023017e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.270000000000000e+02 1.689523710421026e+06 -1.610722981603383e+06 6.744535725528484e+06 -7.001910231495764e+03 1.796656511353839e+03 2.178140119011353e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.280000000000000e+02 1.689383671826685e+06 -1.610687047897050e+06 6.744579286875756e+06 -7.001941739001796e+03 1.796712040722706e+03 2.177992247719112e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.290000000000000e+02 1.689243632603846e+06 -1.610651113080596e+06 6.744622845265127e+06 -7.001973242489281e+03 1.796767568319922e+03 2.177844378958572e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.300000000000000e+02 1.689103592752473e+06 -1.610615177154009e+06 6.744666400696609e+06 -7.002004743004269e+03 1.796823095683986e+03 2.177696508067125e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.310000000000000e+02 1.688963552272631e+06 -1.610579240117304e+06 6.744709953170185e+06 -7.002036240368180e+03 1.796878622111728e+03 2.177548636229097e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.320000000000000e+02 1.688823511164286e+06 -1.610543301970473e+06 6.744753502685868e+06 -7.002067735007074e+03 1.796934148754979e+03 2.177400761081683e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.330000000000000e+02 1.688683469427698e+06 -1.610507362713572e+06 6.744797049243573e+06 -7.002099225305270e+03 1.796989673405695e+03 2.177252889680472e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.340000000000000e+02 1.688543427062837e+06 -1.610471422346597e+06 6.744840592843316e+06 -7.002130713046318e+03 1.797045197760473e+03 2.177105014890059e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.350000000000000e+02 1.688403384069661e+06 -1.610435480869532e+06 6.744884133485107e+06 -7.002162197994518e+03 1.797100722272800e+03 2.176957137055311e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.360000000000000e+02 1.688263340448439e+06 -1.610399538282444e+06 6.744927671168865e+06 -7.002193678965918e+03 1.797156245151327e+03 2.176809261500521e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.370000000000000e+02 1.688123296199137e+06 -1.610363594585322e+06 6.744971205894602e+06 -7.002225156731146e+03 1.797211767348957e+03 2.176661384948254e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.380000000000000e+02 1.687983251321813e+06 -1.610327649778177e+06 6.745014737662299e+06 -7.002256631821621e+03 1.797267289256013e+03 2.176513505373116e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.390000000000000e+02 1.687843205816434e+06 -1.610291703861000e+06 6.745058266471968e+06 -7.002288103100460e+03 1.797322810141276e+03 2.176365627016355e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.400000000000000e+02 1.687703159683268e+06 -1.610255756833855e+06 6.745101792323529e+06 -7.002319571483916e+03 1.797378330469043e+03 2.176217746569975e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.410000000000000e+02 1.687563112922276e+06 -1.610219808696731e+06 6.745145315216991e+06 -7.002351036607987e+03 1.797433850189625e+03 2.176069865229249e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.420000000000000e+02 1.687423065533524e+06 -1.610183859449642e+06 6.745188835152340e+06 -7.002382498590352e+03 1.797489369120402e+03 2.175921982783009e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.430000000000000e+02 1.687283017516969e+06 -1.610147909092571e+06 6.745232352129584e+06 -7.002413957331920e+03 1.797544887343435e+03 2.175774099472364e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.440000000000000e+02 1.687142968872892e+06 -1.610111957625596e+06 6.745275866148641e+06 -7.002445413045033e+03 1.797600405369479e+03 2.175626214174448e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.450000000000000e+02 1.687002919601238e+06 -1.610076005048689e+06 6.745319377209529e+06 -7.002476865104310e+03 1.797655921849676e+03 2.175478330059128e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.460000000000000e+02 1.686862869701980e+06 -1.610040051361847e+06 6.745362885312255e+06 -7.002508314155958e+03 1.797711438157413e+03 2.175330443868962e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.470000000000000e+02 1.686722819175390e+06 -1.610004096565140e+06 6.745406390456738e+06 -7.002539759963048e+03 1.797766953680541e+03 2.175182556894196e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.480000000000000e+02 1.686582768021421e+06 -1.609968140658547e+06 6.745449892642993e+06 -7.002571202951482e+03 1.797822468762733e+03 2.175034667483138e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.490000000000000e+02 1.686442716240140e+06 -1.609932183642084e+06 6.745493391870996e+06 -7.002602642613941e+03 1.797877983132355e+03 2.174886777481424e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.500000000000000e+02 1.686302663831510e+06 -1.609896225515740e+06 6.745536888140766e+06 -7.002634078531538e+03 1.797933496321631e+03 2.174738888628505e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.510000000000000e+02 1.686162610795803e+06 -1.609860266279584e+06 6.745580381452216e+06 -7.002665510953909e+03 1.797989008595910e+03 2.174590999900069e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.520000000000000e+02 1.686022557132976e+06 -1.609824305933598e+06 6.745623871805360e+06 -7.002696941314706e+03 1.798044520979804e+03 2.174443105851540e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.530000000000000e+02 1.685882502842997e+06 -1.609788344477777e+06 6.745667359200211e+06 -7.002728367822116e+03 1.798100032557764e+03 2.174295212964994e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.540000000000000e+02 1.685742447926128e+06 -1.609752381912180e+06 6.745710843636689e+06 -7.002759791422615e+03 1.798155543391616e+03 2.174147318188808e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.550000000000000e+02 1.685602392382336e+06 -1.609716418236798e+06 6.745754325114802e+06 -7.002791211041976e+03 1.798211052783694e+03 2.173999425541567e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.560000000000000e+02 1.685462336211687e+06 -1.609680453451650e+06 6.745797803634534e+06 -7.002822627930731e+03 1.798266562095512e+03 2.173851529859785e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.570000000000000e+02 1.685322279414134e+06 -1.609644487556711e+06 6.745841279195895e+06 -7.002854041538581e+03 1.798322070776942e+03 2.173703633372361e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.580000000000000e+02 1.685182221989952e+06 -1.609608520552055e+06 6.745884751798809e+06 -7.002885452075752e+03 1.798377578626521e+03 2.173555735591404e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.590000000000000e+02 1.685042163939107e+06 -1.609572552437673e+06 6.745928221443279e+06 -7.002916859298427e+03 1.798433085728291e+03 2.173407837215010e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.600000000000000e+02 1.684902105261556e+06 -1.609536583213548e+06 6.745971688129327e+06 -7.002948263927417e+03 1.798488592858525e+03 2.173259935273201e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.610000000000000e+02 1.684762045957567e+06 -1.609500612879746e+06 6.746015151856863e+06 -7.002979664660033e+03 1.798544098699671e+03 2.173112035057937e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.620000000000000e+02 1.684621986027103e+06 -1.609464641436255e+06 6.746058612625908e+06 -7.003011062263394e+03 1.798599603799340e+03 2.172964133654781e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.630000000000000e+02 1.684481925470233e+06 -1.609428668883092e+06 6.746102070436437e+06 -7.003042456181578e+03 1.798655107581813e+03 2.172816233334523e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.640000000000000e+02 1.684341864286913e+06 -1.609392695220242e+06 6.746145525288462e+06 -7.003073847566626e+03 1.798710611749393e+03 2.172668328940998e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.650000000000000e+02 1.684201802477411e+06 -1.609356720447768e+06 6.746188977181902e+06 -7.003105235236050e+03 1.798766114385302e+03 2.172520425916722e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.660000000000000e+02 1.684061740041698e+06 -1.609320744565668e+06 6.746232426116773e+06 -7.003136619964005e+03 1.798821616863559e+03 2.172372520592972e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.670000000000000e+02 1.683921676979830e+06 -1.609284767573945e+06 6.746275872093053e+06 -7.003168001734890e+03 1.798877118617276e+03 2.172224613520380e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.680000000000000e+02 1.683781613291772e+06 -1.609248789472592e+06 6.746319315110756e+06 -7.003199380071434e+03 1.798932619665351e+03 2.172076706195081e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.690000000000000e+02 1.683641548977796e+06 -1.609212810261677e+06 6.746362755169798e+06 -7.003230755115837e+03 1.798988119984690e+03 2.171928798186828e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.700000000000000e+02 1.683501484037854e+06 -1.609176829941180e+06 6.746406192270191e+06 -7.003262126701309e+03 1.799043619147025e+03 2.171780890403493e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.710000000000000e+02 1.683361418471918e+06 -1.609140848511096e+06 6.746449626411953e+06 -7.003293495351572e+03 1.799099118088086e+03 2.171632980356583e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.720000000000000e+02 1.683221352280256e+06 -1.609104865971490e+06 6.746493057594996e+06 -7.003324860772292e+03 1.799154616285086e+03 2.171485069441862e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.730000000000000e+02 1.683081285462827e+06 -1.609068882322350e+06 6.746536485819335e+06 -7.003356223257882e+03 1.799210114128456e+03 2.171337156380079e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.740000000000000e+02 1.682941218019697e+06 -1.609032897563687e+06 6.746579911084950e+06 -7.003387582294356e+03 1.799265610740989e+03 2.171189243577616e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.750000000000000e+02 1.682801149950824e+06 -1.608996911695489e+06 6.746623333391855e+06 -7.003418938016654e+03 1.799321106998643e+03 2.171041329831247e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.760000000000000e+02 1.682661081256481e+06 -1.608960924717824e+06 6.746666752739967e+06 -7.003450290571193e+03 1.799376602280086e+03 2.170893415226668e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.770000000000000e+02 1.682521011936634e+06 -1.608924936630684e+06 6.746710169129300e+06 -7.003481640241962e+03 1.799432097182430e+03 2.170745498334291e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.780000000000000e+02 1.682380941991239e+06 -1.608888947434050e+06 6.746753582559865e+06 -7.003512985475874e+03 1.799487590616014e+03 2.170597585045902e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.790000000000000e+02 1.682240871420560e+06 -1.608852957127986e+06 6.746796993031580e+06 -7.003544328936846e+03 1.799543084425391e+03 2.170449665277083e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.800000000000000e+02 1.682100800224570e+06 -1.608816965712487e+06 6.746840400544458e+06 -7.003575668642271e+03 1.799598577088909e+03 2.170301746665020e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.810000000000000e+02 1.681960728403329e+06 -1.608780973187563e+06 6.746883805098479e+06 -7.003607005089818e+03 1.799654068875089e+03 2.170153827393156e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.820000000000000e+02 1.681820655956797e+06 -1.608744979553203e+06 6.746927206693660e+06 -7.003638332132068e+03 1.799709576539981e+03 2.170005912126136e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.830000000000000e+02 1.681680582901857e+06 -1.608708984813741e+06 6.746970605324766e+06 -7.003669668124457e+03 1.799765050484764e+03 2.169857986552778e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.840000000000000e+02 1.681540509205250e+06 -1.608672988960631e+06 6.747014001002107e+06 -7.003700994943194e+03 1.799820540205544e+03 2.169710064340212e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.850000000000000e+02 1.681400434883544e+06 -1.608636991998123e+06 6.747057393720550e+06 -7.003732319068154e+03 1.799876030034214e+03 2.169562138804410e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.860000000000000e+02 1.681260359937013e+06 -1.608600993926292e+06 6.747100783480010e+06 -7.003763639482630e+03 1.799931518667785e+03 2.169414214326912e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.870000000000000e+02 1.681120284365612e+06 -1.608564994745112e+06 6.747144170280496e+06 -7.003794956048091e+03 1.799987005696282e+03 2.169266291711299e+03 5.731380389900000e-03 -1.351171734700000e-03 -1.646838796700000e-03 2.125745568900000e-03 6.386027262600000e-04 1.932080894600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.880000000000000e+02 1.680980208169414e+06 -1.608528994454610e+06 6.747187554121998e+06 -7.003826270069731e+03 1.800042492726054e+03 2.169118365390692e+03 5.731768184400000e-03 -1.351514158300000e-03 -1.645882364300000e-03 2.126004866600000e-03 6.384039246100000e-04 1.931313163700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.890000000000000e+02 1.680840131348379e+06 -1.608492993054770e+06 6.747230935004522e+06 -7.003857580735112e+03 1.800097979265279e+03 2.168970438379952e+03 5.731768184400000e-03 -1.351514158300000e-03 -1.645882364300000e-03 2.126004866600000e-03 6.384039246100000e-04 1.931313163700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.900000000000000e+02 1.680700053902772e+06 -1.608456990545656e+06 6.747274312927988e+06 -7.003888887963860e+03 1.800153464623565e+03 2.168822511546358e+03 5.731768184400000e-03 -1.351514158300000e-03 -1.645882364300000e-03 2.126004866600000e-03 6.384039246100000e-04 1.931313163700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.910000000000000e+02 1.680559975832558e+06 -1.608420986927257e+06 6.747317687892412e+06 -7.003920192588121e+03 1.800208949904155e+03 2.168674581269597e+03 5.731768184400000e-03 -1.351514158300000e-03 -1.645882364300000e-03 2.126004866600000e-03 6.384039246100000e-04 1.931313163700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.920000000000000e+02 1.680419897137800e+06 -1.608384982199588e+06 6.747361059897767e+06 -7.003951087497882e+03 1.800263057422501e+03 2.168529161994516e+03 5.731768184400000e-03 -1.351514158300000e-03 -1.645882364300000e-03 2.126004866600000e-03 6.384039246100000e-04 1.931313163700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.930000000000000e+02 1.680279817800222e+06 -1.608348976382812e+06 6.747404429002628e+06 -7.003982360238202e+03 1.800318456423307e+03 2.168381386179829e+03 5.731768184400000e-03 -1.351514158300000e-03 -1.645882364300000e-03 2.126004866600000e-03 6.384039246100000e-04 1.931313163700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.940000000000000e+02 1.680139737841515e+06 -1.608312969459262e+06 6.747447795150586e+06 -7.004013654979250e+03 1.800373939352439e+03 2.168233454298410e+03 5.731768184400000e-03 -1.351514158300000e-03 -1.645882364300000e-03 2.126004866600000e-03 6.384039246100000e-04 1.931313163700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.950000000000000e+02 1.679999657258451e+06 -1.608276961426478e+06 6.747491158339422e+06 -7.004044946738743e+03 1.800429421758821e+03 2.168085520565298e+03 5.731768184400000e-03 -1.351514158300000e-03 -1.645882364300000e-03 2.126004866600000e-03 6.384039246100000e-04 1.931313163700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.960000000000000e+02 1.679859576050998e+06 -1.608240952284451e+06 6.747534518569151e+06 -7.004076234720415e+03 1.800484903177554e+03 2.167937587922101e+03 5.731768184400000e-03 -1.351514158300000e-03 -1.645882364300000e-03 2.126004866600000e-03 6.384039246100000e-04 1.931313163700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.970000000000000e+02 1.679719494219425e+06 -1.608204942033250e+06 6.747577875839691e+06 -7.004107519800379e+03 1.800540384005317e+03 2.167789653234084e+03 5.731768184400000e-03 -1.351514158300000e-03 -1.645882364300000e-03 2.126004866600000e-03 6.384039246100000e-04 1.931313163700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.980000000000000e+02 1.679579411763691e+06 -1.608168930672859e+06 6.747621230151051e+06 -7.004138801655989e+03 1.800595864115473e+03 2.167641717638442e+03 5.732155615200000e-03 -1.351856496200000e-03 -1.644925723900000e-03 2.126264187500000e-03 6.382049511600000e-04 1.930545859300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.990000000000000e+02 1.679439328683860e+06 -1.608132918203293e+06 6.747664581503213e+06 -7.004170080347507e+03 1.800651343499552e+03 2.167493780951216e+03 5.732155615200000e-03 -1.351856496200000e-03 -1.644925723900000e-03 2.126264187500000e-03 6.382049511600000e-04 1.930545859300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.000000000000000e+02 1.679299244979901e+06 -1.608096904624543e+06 6.747707929896191e+06 -7.004201356266504e+03 1.800706822963734e+03 2.167345841212770e+03 5.732155615200000e-03 -1.351856496200000e-03 -1.644925723900000e-03 2.126264187500000e-03 6.382049511600000e-04 1.930545859300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.010000000000000e+02 1.679159160652071e+06 -1.608060889936668e+06 6.747751275329904e+06 -7.004232628195315e+03 1.800762300759546e+03 2.167197903843763e+03 5.732155615200000e-03 -1.351856496200000e-03 -1.644925723900000e-03 2.126264187500000e-03 6.382049511600000e-04 1.930545859300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.020000000000000e+02 1.679019075700343e+06 -1.608024874139662e+06 6.747794617804360e+06 -7.004263480969945e+03 1.800816641735881e+03 2.167052295702552e+03 5.732155615200000e-03 -1.351856496200000e-03 -1.644925723900000e-03 2.126264187500000e-03 6.382049511600000e-04 1.930545859300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.030000000000000e+02 1.678878990116968e+06 -1.607988857251753e+06 6.747837957371208e+06 -7.004294721026443e+03 1.800872048637373e+03 2.166904499206231e+03 5.732155615200000e-03 -1.351856496200000e-03 -1.644925723900000e-03 2.126264187500000e-03 6.382049511600000e-04 1.930545859300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.040000000000000e+02 1.678738903915665e+06 -1.607952839257621e+06 6.747881293979938e+06 -7.004325983947737e+03 1.800927524876985e+03 2.166756556717909e+03 5.732155615200000e-03 -1.351856496200000e-03 -1.644925723900000e-03 2.126264187500000e-03 6.382049511600000e-04 1.930545859300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.050000000000000e+02 1.678598817090650e+06 -1.607916820154395e+06 6.747924627629356e+06 -7.004357243325824e+03 1.800983000086584e+03 2.166608614612688e+03 5.732155615200000e-03 -1.351856496200000e-03 -1.644925723900000e-03 2.126264187500000e-03 6.382049511600000e-04 1.930545859300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.060000000000000e+02 1.678458729641993e+06 -1.607880799942096e+06 6.747967958319446e+06 -7.004388499242828e+03 1.801038474541213e+03 2.166460672385590e+03 5.732155615200000e-03 -1.351856496200000e-03 -1.644925723900000e-03 2.126264187500000e-03 6.382049511600000e-04 1.930545859300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.070000000000000e+02 1.678318641569648e+06 -1.607844778620703e+06 6.748011286050219e+06 -7.004419752484931e+03 1.801093948732415e+03 2.166312727100929e+03 5.732155615200000e-03 -1.351856496200000e-03 -1.644925723900000e-03 2.126264187500000e-03 6.382049511600000e-04 1.930545859300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.080000000000000e+02 1.678178552873889e+06 -1.607808756190289e+06 6.748054610821594e+06 -7.004451002777578e+03 1.801149422519217e+03 2.166164779756337e+03 5.732542682600000e-03 -1.352198748500000e-03 -1.643968875700000e-03 2.126523531700000e-03 6.380058060600000e-04 1.929778981200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.090000000000000e+02 1.678038463554671e+06 -1.607772732650834e+06 6.748097932633581e+06 -7.004482249045886e+03 1.801204894613744e+03 2.166016834913047e+03 5.732542682600000e-03 -1.352198748500000e-03 -1.643968875700000e-03 2.126523531700000e-03 6.380058060600000e-04 1.929778981200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.100000000000000e+02 1.677898373611968e+06 -1.607736708002337e+06 6.748141251486198e+06 -7.004513492362334e+03 1.801260366661224e+03 2.165868887700275e+03 5.732542682600000e-03 -1.352198748500000e-03 -1.643968875700000e-03 2.126523531700000e-03 6.380058060600000e-04 1.929778981200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.110000000000000e+02 1.677758283046037e+06 -1.607700682244852e+06 6.748184567379354e+06 -7.004544731842289e+03 1.801315837246043e+03 2.165720942188329e+03 5.732542682600000e-03 -1.352198748500000e-03 -1.643968875700000e-03 2.126523531700000e-03 6.380058060600000e-04 1.929778981200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.120000000000000e+02 1.677618191856845e+06 -1.607664655378373e+06 6.748227880313073e+06 -7.004575493707916e+03 1.801370552210948e+03 2.165575175096869e+03 5.732542682600000e-03 -1.352198748500000e-03 -1.643968875700000e-03 2.126523531700000e-03 6.380058060600000e-04 1.929778981200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.130000000000000e+02 1.677478099996356e+06 -1.607628627401941e+06 6.748271190349116e+06 -7.004606698370691e+03 1.801425975456848e+03 2.165427359005671e+03 5.732542682600000e-03 -1.352198748500000e-03 -1.643968875700000e-03 2.126523531700000e-03 6.380058060600000e-04 1.929778981200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.140000000000000e+02 1.677338007512608e+06 -1.607592598317276e+06 6.748314497428575e+06 -7.004637929109702e+03 1.801481445081748e+03 2.165279406986650e+03 5.732542682600000e-03 -1.352198748500000e-03 -1.643968875700000e-03 2.126523531700000e-03 6.380058060600000e-04 1.929778981200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.150000000000000e+02 1.677197914405888e+06 -1.607556568123679e+06 6.748357801548503e+06 -7.004669156366486e+03 1.801536913448006e+03 2.165131455360872e+03 5.732542682600000e-03 -1.352198748500000e-03 -1.643968875700000e-03 2.126523531700000e-03 6.380058060600000e-04 1.929778981200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.160000000000000e+02 1.677057820676160e+06 -1.607520536821140e+06 6.748401102708912e+06 -7.004700379946120e+03 1.801592380480377e+03 2.164983504815644e+03 5.732542682600000e-03 -1.352198748500000e-03 -1.643968875700000e-03 2.126523531700000e-03 6.380058060600000e-04 1.929778981200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.170000000000000e+02 1.676917726323496e+06 -1.607484504409681e+06 6.748444400909781e+06 -7.004731600588540e+03 1.801647847157137e+03 2.164835552127879e+03 5.732542682600000e-03 -1.352198748500000e-03 -1.643968875700000e-03 2.126523531700000e-03 6.380058060600000e-04 1.929778981200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.180000000000000e+02 1.676777631347852e+06 -1.607448470889282e+06 6.748487696151122e+06 -7.004762818136837e+03 1.801703313693499e+03 2.164687597605288e+03 5.732929387000000e-03 -1.352540915500000e-03 -1.643011819600000e-03 2.126782899400000e-03 6.378064893900000e-04 1.929012529500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.190000000000000e+02 1.676637535749495e+06 -1.607412436260009e+06 6.748530988432857e+06 -7.004794032952873e+03 1.801758779468202e+03 2.164539640648400e+03 5.732929387000000e-03 -1.352540915500000e-03 -1.643011819600000e-03 2.126782899400000e-03 6.378064893900000e-04 1.929012529500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.200000000000000e+02 1.676497439528388e+06 -1.607376400521852e+06 6.748574277754991e+06 -7.004825244112523e+03 1.801814244296119e+03 2.164391684362263e+03 5.732929387000000e-03 -1.352540915500000e-03 -1.643011819600000e-03 2.126782899400000e-03 6.378064893900000e-04 1.929012529500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.210000000000000e+02 1.676357342684502e+06 -1.607340363674802e+06 6.748617564117546e+06 -7.004856451792703e+03 1.801869708425535e+03 2.164243727963475e+03 5.732929387000000e-03 -1.352540915500000e-03 -1.643011819600000e-03 2.126782899400000e-03 6.378064893900000e-04 1.929012529500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.220000000000000e+02 1.676217245218091e+06 -1.607304325718916e+06 6.748660847520436e+06 -7.004887138144977e+03 1.801924156038479e+03 2.164098322801484e+03 5.732929387000000e-03 -1.352540915500000e-03 -1.643011819600000e-03 2.126782899400000e-03 6.378064893900000e-04 1.929012529500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.230000000000000e+02 1.676077147160538e+06 -1.607268286680392e+06 6.748704128008162e+06 -7.004918307917734e+03 1.801979556579111e+03 2.163950520206301e+03 5.732929387000000e-03 -1.352540915500000e-03 -1.643011819600000e-03 2.126782899400000e-03 6.378064893900000e-04 1.929012529500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.240000000000000e+02 1.675937048484540e+06 -1.607232246535237e+06 6.748747405538279e+06 -7.004949506325609e+03 1.802035018661392e+03 2.163802559948992e+03 5.732929387000000e-03 -1.352540915500000e-03 -1.643011819600000e-03 2.126782899400000e-03 6.378064893900000e-04 1.929012529500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.250000000000000e+02 1.675796949186008e+06 -1.607196205281239e+06 6.748790680108741e+06 -7.004980701520680e+03 1.802090480120279e+03 2.163654598663540e+03 5.732929387000000e-03 -1.352540915500000e-03 -1.643011819600000e-03 2.126782899400000e-03 6.378064893900000e-04 1.929012529500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.260000000000000e+02 1.675656849265219e+06 -1.607160162918470e+06 6.748833951719461e+06 -7.005011893442624e+03 1.802145940920683e+03 2.163506636573165e+03 5.732929387000000e-03 -1.352540915500000e-03 -1.643011819600000e-03 2.126782899400000e-03 6.378064893900000e-04 1.929012529500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.270000000000000e+02 1.675516748722124e+06 -1.607124119446911e+06 6.748877220370458e+06 -7.005043082277581e+03 1.802201400845515e+03 2.163358673278368e+03 5.732929387000000e-03 -1.352540915500000e-03 -1.643011819600000e-03 2.126782899400000e-03 6.378064893900000e-04 1.929012529500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.280000000000000e+02 1.675376647556696e+06 -1.607088074866556e+06 6.748920486061735e+06 -7.005074267681691e+03 1.802256860417336e+03 2.163210709409117e+03 5.733315728700000e-03 -1.352882997200000e-03 -1.642054556400000e-03 2.127042290400000e-03 6.376070014100000e-04 1.928246504700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.290000000000000e+02 1.675236545769194e+06 -1.607052029177463e+06 6.748963748793224e+06 -7.005105449801830e+03 1.802312318870647e+03 2.163062745178812e+03 5.733315728700000e-03 -1.352882997200000e-03 -1.642054556400000e-03 2.127042290400000e-03 6.376070014100000e-04 1.928246504700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.300000000000000e+02 1.675096443359587e+06 -1.607015982379626e+06 6.749007008564923e+06 -7.005136629952333e+03 1.802367777782115e+03 2.162914774999136e+03 5.733315728700000e-03 -1.352882997200000e-03 -1.642054556400000e-03 2.127042290400000e-03 6.376070014100000e-04 1.928246504700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.310000000000000e+02 1.674956340327938e+06 -1.606979934473058e+06 6.749050265376824e+06 -7.005167805353856e+03 1.802423234382289e+03 2.162766810185018e+03 5.733315728700000e-03 -1.352882997200000e-03 -1.642054556400000e-03 2.127042290400000e-03 6.376070014100000e-04 1.928246504700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.320000000000000e+02 1.674816236674210e+06 -1.606943885457749e+06 6.749093519228932e+06 -7.005198636518909e+03 1.802477649834796e+03 2.162620856522094e+03 5.733315728700000e-03 -1.352882997200000e-03 -1.642054556400000e-03 2.127042290400000e-03 6.376070014100000e-04 1.928246504700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.330000000000000e+02 1.674676132386681e+06 -1.606907835349324e+06 6.749136770167327e+06 -7.005229785402975e+03 1.802533042149096e+03 2.162473009983813e+03 5.733315728700000e-03 -1.352882997200000e-03 -1.642054556400000e-03 2.127042290400000e-03 6.376070014100000e-04 1.928246504700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.340000000000000e+02 1.674536027478064e+06 -1.606871784133582e+06 6.749180018148222e+06 -7.005260951765794e+03 1.802588497188724e+03 2.162325040141176e+03 5.733315728700000e-03 -1.352882997200000e-03 -1.642054556400000e-03 2.127042290400000e-03 6.376070014100000e-04 1.928246504700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.350000000000000e+02 1.674395921947557e+06 -1.606835731809138e+06 6.749223263169271e+06 -7.005292114998903e+03 1.802643952148911e+03 2.162177068521341e+03 5.733315728700000e-03 -1.352882997200000e-03 -1.642054556400000e-03 2.127042290400000e-03 6.376070014100000e-04 1.928246504700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.360000000000000e+02 1.674255815795429e+06 -1.606799678376057e+06 6.749266505230394e+06 -7.005323274917051e+03 1.802699405954236e+03 2.162029096671738e+03 5.733315728700000e-03 -1.352882997200000e-03 -1.642054556400000e-03 2.127042290400000e-03 6.376070014100000e-04 1.928246504700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.370000000000000e+02 1.674115709021642e+06 -1.606763623834326e+06 6.749309744331598e+06 -7.005354431278537e+03 1.802754858773187e+03 2.161881125212619e+03 5.733315728700000e-03 -1.352882997200000e-03 -1.642054556400000e-03 2.127042290400000e-03 6.376070014100000e-04 1.928246504700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.380000000000000e+02 1.673975601626264e+06 -1.606727568183964e+06 6.749352980472867e+06 -7.005385584706238e+03 1.802810311177887e+03 2.161733151650097e+03 5.733701708100000e-03 -1.353224993900000e-03 -1.641097086000000e-03 2.127301705000000e-03 6.374073422300000e-04 1.927480906500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.390000000000000e+02 1.673835493609255e+06 -1.606691511424955e+06 6.749396213654216e+06 -7.005416734300639e+03 1.802865762466404e+03 2.161585179475445e+03 5.733701708100000e-03 -1.353224993900000e-03 -1.641097086000000e-03 2.127301705000000e-03 6.374073422300000e-04 1.927480906500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.400000000000000e+02 1.673695384970881e+06 -1.606655453557364e+06 6.749439443875563e+06 -7.005447881319708e+03 1.802921213483128e+03 2.161437203928160e+03 5.733701708100000e-03 -1.353224993900000e-03 -1.641097086000000e-03 2.127301705000000e-03 6.374073422300000e-04 1.927480906500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.410000000000000e+02 1.673555275711105e+06 -1.606619394581180e+06 6.749482671136916e+06 -7.005479025879257e+03 1.802976664628806e+03 2.161289224281647e+03 5.733701708100000e-03 -1.353224993900000e-03 -1.641097086000000e-03 2.127301705000000e-03 6.374073422300000e-04 1.927480906500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.420000000000000e+02 1.673415165829996e+06 -1.606583334496419e+06 6.749525895438261e+06 -7.005509676429311e+03 1.803030804270219e+03 2.161143975635713e+03 5.733701708100000e-03 -1.353224993900000e-03 -1.641097086000000e-03 2.127301705000000e-03 6.374073422300000e-04 1.927480906500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.430000000000000e+02 1.673275055332368e+06 -1.606547273327875e+06 6.749569116835692e+06 -7.005540784291580e+03 1.803086173461596e+03 2.160996162562293e+03 5.733701708100000e-03 -1.353224993900000e-03 -1.641097086000000e-03 2.127301705000000e-03 6.374073422300000e-04 1.927480906500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.440000000000000e+02 1.673134944211877e+06 -1.606511211051754e+06 6.749612335277130e+06 -7.005571918480038e+03 1.803141621930886e+03 2.160848183137222e+03 5.733701708100000e-03 -1.353224993900000e-03 -1.641097086000000e-03 2.127301705000000e-03 6.374073422300000e-04 1.927480906500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.450000000000000e+02 1.672994832470240e+06 -1.606475147667095e+06 6.749655550758501e+06 -7.005603049757738e+03 1.803197069608593e+03 2.160700201870688e+03 5.733701708100000e-03 -1.353224993900000e-03 -1.641097086000000e-03 2.127301705000000e-03 6.374073422300000e-04 1.927480906500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.460000000000000e+02 1.672854720107415e+06 -1.606439083173883e+06 6.749698763279817e+06 -7.005634177181275e+03 1.803252516235584e+03 2.160552222001273e+03 5.733701708100000e-03 -1.353224993900000e-03 -1.641097086000000e-03 2.127301705000000e-03 6.374073422300000e-04 1.927480906500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.470000000000000e+02 1.672714607123679e+06 -1.606403017572191e+06 6.749741972841001e+06 -7.005665301700528e+03 1.803307962487182e+03 2.160404239898950e+03 5.733701708100000e-03 -1.353224993900000e-03 -1.641097086000000e-03 2.127301705000000e-03 6.374073422300000e-04 1.927480906500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.480000000000000e+02 1.672574493518989e+06 -1.606366950862002e+06 6.749785179442061e+06 -7.005696422775136e+03 1.803363407761355e+03 2.160256257823076e+03 5.734087325500000e-03 -1.353566905700000e-03 -1.640139408700000e-03 2.127561143400000e-03 6.372075119800000e-04 1.926715735100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.490000000000000e+02 1.672434379293408e+06 -1.606330883043328e+06 6.749828383082977e+06 -7.005727540846305e+03 1.803418852351243e+03 2.160108274105567e+03 5.734087325500000e-03 -1.353566905700000e-03 -1.640139408700000e-03 2.127561143400000e-03 6.372075119800000e-04 1.926715735100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.500000000000000e+02 1.672294264446908e+06 -1.606294814116166e+06 6.749871583763768e+06 -7.005758655461183e+03 1.803474296304476e+03 2.159960290148089e+03 5.734087325500000e-03 -1.353566905700000e-03 -1.640139408700000e-03 2.127561143400000e-03 6.372075119800000e-04 1.926715735100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.510000000000000e+02 1.672154148979745e+06 -1.606258744080573e+06 6.749914781484346e+06 -7.005789767089585e+03 1.803529739695850e+03 2.159812304385639e+03 5.734087325500000e-03 -1.353566905700000e-03 -1.640139408700000e-03 2.127561143400000e-03 6.372075119800000e-04 1.926715735100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.520000000000000e+02 1.672014032891888e+06 -1.606222672936541e+06 6.749957976244725e+06 -7.005820477081771e+03 1.803584218800696e+03 2.159666447628253e+03 5.734087325500000e-03 -1.353566905700000e-03 -1.640139408700000e-03 2.127561143400000e-03 6.372075119800000e-04 1.926715735100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.530000000000000e+02 1.671873916168133e+06 -1.606186600696863e+06 6.750001168094791e+06 -7.005851558148544e+03 1.803639602064232e+03 2.159518589511598e+03 5.734087325500000e-03 -1.353566905700000e-03 -1.640139408700000e-03 2.127561143400000e-03 6.372075119800000e-04 1.926715735100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.540000000000000e+02 1.671733798825234e+06 -1.606150527350212e+06 6.750044356986942e+06 -7.005882660234570e+03 1.803695043375834e+03 2.159370600765560e+03 5.734087325500000e-03 -1.353566905700000e-03 -1.640139408700000e-03 2.127561143400000e-03 6.372075119800000e-04 1.926715735100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.550000000000000e+02 1.671593680861834e+06 -1.606114452895165e+06 6.750087542918834e+06 -7.005913759083446e+03 1.803750484048586e+03 2.159222611082537e+03 5.734087325500000e-03 -1.353566905700000e-03 -1.640139408700000e-03 2.127561143400000e-03 6.372075119800000e-04 1.926715735100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.560000000000000e+02 1.671453562277991e+06 -1.606078377331730e+06 6.750130725890452e+06 -7.005944854468045e+03 1.803805923499189e+03 2.159074621707459e+03 5.734087325500000e-03 -1.353566905700000e-03 -1.640139408700000e-03 2.127561143400000e-03 6.372075119800000e-04 1.926715735100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.570000000000000e+02 1.671313443073676e+06 -1.606042300659904e+06 6.750173905901810e+06 -7.005975947098082e+03 1.803861363304026e+03 2.158926628969911e+03 5.734087325500000e-03 -1.353566905700000e-03 -1.640139408700000e-03 2.127561143400000e-03 6.372075119800000e-04 1.926715735100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.580000000000000e+02 1.671173323249144e+06 -1.606006222879738e+06 6.750217082952824e+06 -7.006007036042809e+03 1.803916801415578e+03 2.158778637665929e+03 5.734472581300000e-03 -1.353908733000000e-03 -1.639181524600000e-03 2.127820605600000e-03 6.370075108100000e-04 1.925950990500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.590000000000000e+02 1.671033202804371e+06 -1.605970143991235e+06 6.750260257043510e+06 -7.006038122032601e+03 1.803972239259952e+03 2.158630644192933e+03 5.734472581300000e-03 -1.353908733000000e-03 -1.639181524600000e-03 2.127820605600000e-03 6.370075108100000e-04 1.925950990500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.600000000000000e+02 1.670893081739311e+06 -1.605934063994373e+06 6.750303428173876e+06 -7.006069204511218e+03 1.804027676199318e+03 2.158482650894967e+03 5.734472581300000e-03 -1.353908733000000e-03 -1.639181524600000e-03 2.127820605600000e-03 6.370075108100000e-04 1.925950990500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.610000000000000e+02 1.670752960054237e+06 -1.605897982889225e+06 6.750346596343841e+06 -7.006100283472716e+03 1.804083112121065e+03 2.158334657891794e+03 5.734472581300000e-03 -1.353908733000000e-03 -1.639181524600000e-03 2.127820605600000e-03 6.370075108100000e-04 1.925950990500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.620000000000000e+02 1.670612837749108e+06 -1.605861900675774e+06 6.750389761553422e+06 -7.006130872024653e+03 1.804137748128626e+03 2.158188932298843e+03 5.734472581300000e-03 -1.353908733000000e-03 -1.639181524600000e-03 2.127820605600000e-03 6.370075108100000e-04 1.925950990500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.630000000000000e+02 1.670472714785549e+06 -1.605825817356566e+06 6.750432923863165e+06 -7.006161915533269e+03 1.804193134326395e+03 2.158041073421690e+03 5.734472581300000e-03 -1.353908733000000e-03 -1.639181524600000e-03 2.127820605600000e-03 6.370075108100000e-04 1.925950990500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.640000000000000e+02 1.670332591200563e+06 -1.605789732929480e+06 6.750476083215929e+06 -7.006192985235884e+03 1.804248568564405e+03 2.157893076225718e+03 5.734472581300000e-03 -1.353908733000000e-03 -1.639181524600000e-03 2.127820605600000e-03 6.370075108100000e-04 1.925950990500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.650000000000000e+02 1.670192466995815e+06 -1.605753647394160e+06 6.750519239608214e+06 -7.006224052210373e+03 1.804304002506672e+03 2.157745076161464e+03 5.734472581300000e-03 -1.353908733000000e-03 -1.639181524600000e-03 2.127820605600000e-03 6.370075108100000e-04 1.925950990500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.660000000000000e+02 1.670052342171270e+06 -1.605717560750594e+06 6.750562393040040e+06 -7.006255115758476e+03 1.804359435547607e+03 2.157597075998580e+03 5.734472581300000e-03 -1.353908733000000e-03 -1.639181524600000e-03 2.127820605600000e-03 6.370075108100000e-04 1.925950990500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.670000000000000e+02 1.669912216726987e+06 -1.605681472998791e+06 6.750605543511380e+06 -7.006286175892134e+03 1.804414867389758e+03 2.157449075964736e+03 5.734472581300000e-03 -1.353908733000000e-03 -1.639181524600000e-03 2.127820605600000e-03 6.370075108100000e-04 1.925950990500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.680000000000000e+02 1.669772090662936e+06 -1.605645384138748e+06 6.750648691022246e+06 -7.006317233149459e+03 1.804470299430300e+03 2.157301073094237e+03 5.734857476000000e-03 -1.354250475900000e-03 -1.638223433600000e-03 2.128080091800000e-03 6.368073388100000e-04 1.925186672600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.690000000000000e+02 1.669631963979381e+06 -1.605609294170526e+06 6.750691835572567e+06 -7.006348287050152e+03 1.804525730400664e+03 2.157153070053317e+03 5.734857476000000e-03 -1.354250475900000e-03 -1.638223433600000e-03 2.128080091800000e-03 6.368073388100000e-04 1.925186672600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.700000000000000e+02 1.669491836676284e+06 -1.605573203094111e+06 6.750734977162344e+06 -7.006379337764000e+03 1.804581160403937e+03 2.157005066207840e+03 5.734857476000000e-03 -1.354250475900000e-03 -1.638223433600000e-03 2.128080091800000e-03 6.368073388100000e-04 1.925186672600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.710000000000000e+02 1.669351708753609e+06 -1.605537110909495e+06 6.750778115791595e+06 -7.006410385430901e+03 1.804636590373950e+03 2.156857060276936e+03 5.734857476000000e-03 -1.354250475900000e-03 -1.638223433600000e-03 2.128080091800000e-03 6.368073388100000e-04 1.925186672600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.720000000000000e+02 1.669211580211623e+06 -1.605501017616742e+06 6.750821251460238e+06 -7.006441081698063e+03 1.804690408200827e+03 2.156711604998999e+03 5.734857476000000e-03 -1.354250475900000e-03 -1.638223433600000e-03 2.128080091800000e-03 6.368073388100000e-04 1.925186672600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.730000000000000e+02 1.669071451078177e+06 -1.605464923253907e+06 6.750864384212729e+06 -7.006472101147710e+03 1.804745737234306e+03 2.156563755930134e+03 5.734857476000000e-03 -1.354250475900000e-03 -1.638223433600000e-03 2.128080091800000e-03 6.368073388100000e-04 1.925186672600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.740000000000000e+02 1.668931321331136e+06 -1.605428827786387e+06 6.750907514006084e+06 -7.006503139047602e+03 1.804801164519288e+03 2.156415748318102e+03 5.734857476000000e-03 -1.354250475900000e-03 -1.638223433600000e-03 2.128080091800000e-03 6.368073388100000e-04 1.925186672600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.750000000000000e+02 1.668791190964768e+06 -1.605392731210718e+06 6.750950640838840e+06 -7.006534173939006e+03 1.804856591696180e+03 2.156267738564234e+03 5.734857476000000e-03 -1.354250475900000e-03 -1.638223433600000e-03 2.128080091800000e-03 6.368073388100000e-04 1.925186672600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.760000000000000e+02 1.668651059979347e+06 -1.605356633526968e+06 6.750993764710912e+06 -7.006565205336891e+03 1.804912017654336e+03 2.156119729210481e+03 5.734857476000000e-03 -1.354250475900000e-03 -1.638223433600000e-03 2.128080091800000e-03 6.368073388100000e-04 1.925186672600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.770000000000000e+02 1.668510928374836e+06 -1.605320534735129e+06 6.751036885622316e+06 -7.006596233264821e+03 1.804967442626969e+03 2.155971719973476e+03 5.734857476000000e-03 -1.354250475900000e-03 -1.638223433600000e-03 2.128080091800000e-03 6.368073388100000e-04 1.925186672600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.780000000000000e+02 1.668370796151191e+06 -1.605284434835180e+06 6.751080003573066e+06 -7.006627258200218e+03 1.805022867486153e+03 2.155823708548304e+03 5.735242009700000e-03 -1.354592134500000e-03 -1.637265136500000e-03 2.128339602000000e-03 6.366069962400000e-04 1.924422782000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.790000000000000e+02 1.668230663308684e+06 -1.605248333827191e+06 6.751123118563076e+06 -7.006658279702572e+03 1.805078291073354e+03 2.155675697378068e+03 5.735242009700000e-03 -1.354592134500000e-03 -1.637265136500000e-03 2.128339602000000e-03 6.366069962400000e-04 1.924422782000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.800000000000000e+02 1.668090529847279e+06 -1.605212231711153e+06 6.751166230592361e+06 -7.006689298260806e+03 1.805133714268878e+03 2.155527684113435e+03 5.735242009700000e-03 -1.354592134500000e-03 -1.637265136500000e-03 2.128339602000000e-03 6.366069962400000e-04 1.924422782000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.810000000000000e+02 1.667950395767040e+06 -1.605176128487079e+06 6.751209339660900e+06 -7.006720314408306e+03 1.805189137642996e+03 2.155379666539367e+03 5.735242009700000e-03 -1.354592134500000e-03 -1.637265136500000e-03 2.128339602000000e-03 6.366069962400000e-04 1.924422782000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.820000000000000e+02 1.667810261067926e+06 -1.605140024154952e+06 6.751252445768707e+06 -7.006750735039794e+03 1.805243879232281e+03 2.155234150355904e+03 5.735242009700000e-03 -1.354592134500000e-03 -1.637265136500000e-03 2.128339602000000e-03 6.366069962400000e-04 1.924422782000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.830000000000000e+02 1.667670125741836e+06 -1.605103918722790e+06 6.751295548971941e+06 -7.006781708308678e+03 1.805299259235116e+03 2.155086285128515e+03 5.735242009700000e-03 -1.354592134500000e-03 -1.637265136500000e-03 2.128339602000000e-03 6.366069962400000e-04 1.924422782000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.840000000000000e+02 1.667529989801992e+06 -1.605067812184630e+06 6.751338649216129e+06 -7.006812714041532e+03 1.805354679611549e+03 2.154938268170932e+03 5.735242009700000e-03 -1.354592134500000e-03 -1.637265136500000e-03 2.128339602000000e-03 6.366069962400000e-04 1.924422782000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.850000000000000e+02 1.667389853243468e+06 -1.605031704538462e+06 6.751381746499530e+06 -7.006843716558291e+03 1.805410099500568e+03 2.154790250073578e+03 5.735242009700000e-03 -1.354592134500000e-03 -1.637265136500000e-03 2.128339602000000e-03 6.366069962400000e-04 1.924422782000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.860000000000000e+02 1.667249716066529e+06 -1.604995595784352e+06 6.751424840822059e+06 -7.006874715259549e+03 1.805465518012416e+03 2.154642233548836e+03 5.735242009700000e-03 -1.354592134500000e-03 -1.637265136500000e-03 2.128339602000000e-03 6.366069962400000e-04 1.924422782000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.870000000000000e+02 1.667109578271141e+06 -1.604959485922288e+06 6.751467932183733e+06 -7.006905711644082e+03 1.805520936717733e+03 2.154494212399539e+03 5.735242009700000e-03 -1.354592134500000e-03 -1.637265136500000e-03 2.128339602000000e-03 6.366069962400000e-04 1.924422782000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.880000000000000e+02 1.666969439857364e+06 -1.604923374952284e+06 6.751511020584527e+06 -7.006936704501533e+03 1.805576354350981e+03 2.154346191627742e+03 5.735626182900000e-03 -1.354933709000000e-03 -1.636306633300000e-03 2.128599136300000e-03 6.364064831900000e-04 1.923659318400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.890000000000000e+02 1.666829300825163e+06 -1.604887262874324e+06 6.751554106024459e+06 -7.006967693832381e+03 1.805631771128402e+03 2.154198171038786e+03 5.735626182900000e-03 -1.354933709000000e-03 -1.636306633300000e-03 2.128599136300000e-03 6.364064831900000e-04 1.923659318400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.900000000000000e+02 1.666689161174808e+06 -1.604851149688482e+06 6.751597188503446e+06 -7.006998680526264e+03 1.805687187672734e+03 2.154050147230170e+03 5.735626182900000e-03 -1.354933709000000e-03 -1.636306633300000e-03 2.128599136300000e-03 6.364064831900000e-04 1.923659318400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.910000000000000e+02 1.666549020906255e+06 -1.604815035394736e+06 6.751640268021502e+06 -7.007029663433123e+03 1.805742603058035e+03 2.153902124708729e+03 5.735626182900000e-03 -1.354933709000000e-03 -1.636306633300000e-03 2.128599136300000e-03 6.364064831900000e-04 1.923659318400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.920000000000000e+02 1.666408880019575e+06 -1.604778919993107e+06 6.751683344578604e+06 -7.007060184157079e+03 1.805797355471939e+03 2.153756162151629e+03 5.735626182900000e-03 -1.354933709000000e-03 -1.636306633300000e-03 2.128599136300000e-03 6.364064831900000e-04 1.923659318400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.930000000000000e+02 1.666268738506266e+06 -1.604742803491889e+06 6.751726418221491e+06 -7.007091133294443e+03 1.805852729765119e+03 2.153608260963284e+03 5.735626182900000e-03 -1.354933709000000e-03 -1.636306633300000e-03 2.128599136300000e-03 6.364064831900000e-04 1.923659318400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.940000000000000e+02 1.666128596374443e+06 -1.604706685883320e+06 6.751769488906255e+06 -7.007122107220604e+03 1.805908143576768e+03 2.153460233250513e+03 5.735626182900000e-03 -1.354933709000000e-03 -1.636306633300000e-03 2.128599136300000e-03 6.364064831900000e-04 1.923659318400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.950000000000000e+02 1.665988453624680e+06 -1.604670567166907e+06 6.751812556630009e+06 -7.007153077337716e+03 1.805963556037102e+03 2.153312207068169e+03 5.735626182900000e-03 -1.354933709000000e-03 -1.636306633300000e-03 2.128599136300000e-03 6.364064831900000e-04 1.923659318400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.960000000000000e+02 1.665848310256945e+06 -1.604634447342640e+06 6.751855621392770e+06 -7.007184044775671e+03 1.806018968564288e+03 2.153164177531602e+03 5.735626182900000e-03 -1.354933709000000e-03 -1.636306633300000e-03 2.128599136300000e-03 6.364064831900000e-04 1.923659318400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.970000000000000e+02 1.665708166271498e+06 -1.604598326410579e+06 6.751898683194451e+06 -7.007215008468525e+03 1.806074379719495e+03 2.153016149339715e+03 5.735626182900000e-03 -1.354933709000000e-03 -1.636306633300000e-03 2.128599136300000e-03 6.364064831900000e-04 1.923659318400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.980000000000000e+02 1.665568021668307e+06 -1.604562204370720e+06 6.751941742035069e+06 -7.007245968687074e+03 1.806129789816951e+03 2.152868121344981e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.990000000000000e+02 1.665427876447440e+06 -1.604526081223076e+06 6.751984797914601e+06 -7.007276926189436e+03 1.806185199919486e+03 2.152720090169460e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.000000000000000e+02 1.665287730608852e+06 -1.604489956967630e+06 6.752027850833066e+06 -7.007307880764439e+03 1.806240609575137e+03 2.152572056893314e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.010000000000000e+02 1.665147584152811e+06 -1.604453831604448e+06 6.752070900790376e+06 -7.007338831859144e+03 1.806296018190899e+03 2.152424023817445e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.020000000000000e+02 1.665007437079284e+06 -1.604417705133521e+06 6.752113947786546e+06 -7.007369780293611e+03 1.806351426510240e+03 2.152275987650825e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.030000000000000e+02 1.664867289388235e+06 -1.604381577554840e+06 6.752156991821592e+06 -7.007400724358008e+03 1.806406833389201e+03 2.152127954892007e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.040000000000000e+02 1.664727141079930e+06 -1.604345448868467e+06 6.752200032895427e+06 -7.007431666358247e+03 1.806462240432266e+03 2.151979916721301e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.050000000000000e+02 1.664586992154328e+06 -1.604309319074390e+06 6.752243071008065e+06 -7.007462604822390e+03 1.806517646518347e+03 2.151831878855430e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.060000000000000e+02 1.664446842611500e+06 -1.604273188172625e+06 6.752286106159490e+06 -7.007493539302875e+03 1.806573051082711e+03 2.151683843233979e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.070000000000000e+02 1.664306692451401e+06 -1.604237056163154e+06 6.752329138349709e+06 -7.007524470775154e+03 1.806628455445411e+03 2.151535805550773e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.080000000000000e+02 1.664166541674301e+06 -1.604200923046047e+06 6.752372167578646e+06 -7.007555399612848e+03 1.806683859345571e+03 2.151387764842683e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.090000000000000e+02 1.664026390280169e+06 -1.604164788821298e+06 6.752415193846313e+06 -7.007586324941410e+03 1.806739262293788e+03 2.151239724349140e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.100000000000000e+02 1.663886238268961e+06 -1.604128653488885e+06 6.752458217152721e+06 -7.007617246816960e+03 1.806794664597043e+03 2.151091683615449e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.110000000000000e+02 1.663746085640948e+06 -1.604092517048881e+06 6.752501237497785e+06 -7.007648165661705e+03 1.806850066115367e+03 2.150943641414696e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.120000000000000e+02 1.663605932396092e+06 -1.604056379501272e+06 6.752544254881526e+06 -7.007679081654792e+03 1.806905467475452e+03 2.150795596610963e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.130000000000000e+02 1.663465778534454e+06 -1.604020240846067e+06 6.752587269303916e+06 -7.007709994134776e+03 1.806960867591876e+03 2.150647552296323e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.140000000000000e+02 1.663325624056001e+06 -1.603984101083261e+06 6.752630280764975e+06 -7.007740903608654e+03 1.807016267498944e+03 2.150499505919147e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.150000000000000e+02 1.663185468960999e+06 -1.603947960212916e+06 6.752673289264617e+06 -7.007771809362074e+03 1.807071666004066e+03 2.150351460837748e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.160000000000000e+02 1.663045313249414e+06 -1.603911818235025e+06 6.752716294802858e+06 -7.007802712443639e+03 1.807127064635776e+03 2.150203412321324e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.170000000000000e+02 1.662905156921304e+06 -1.603875675149595e+06 6.752759297379675e+06 -7.007833611795385e+03 1.807182461590605e+03 2.150055365377600e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.180000000000000e+02 1.662764999976638e+06 -1.603839530956619e+06 6.752802296995085e+06 -7.007864508095619e+03 1.807237858473746e+03 2.149907316393168e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.190000000000000e+02 1.662624842415677e+06 -1.603803385656159e+06 6.752845293649004e+06 -7.007895401556079e+03 1.807293254857442e+03 2.149759265072805e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.200000000000000e+02 1.662484684238392e+06 -1.603767239248208e+06 6.752888287341445e+06 -7.007926291221423e+03 1.807348649893344e+03 2.149611215239813e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.210000000000000e+02 1.662344525444739e+06 -1.603731091732748e+06 6.752931278072420e+06 -7.007957177900215e+03 1.807404044529378e+03 2.149463163452028e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.220000000000000e+02 1.662204366034988e+06 -1.603694943109851e+06 6.752974265841849e+06 -7.007988061384571e+03 1.807459438652143e+03 2.149315110477499e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.230000000000000e+02 1.662064206009103e+06 -1.603658793379500e+06 6.753017250649744e+06 -7.008018941688597e+03 1.807514831871784e+03 2.149167056620776e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.240000000000000e+02 1.661924045367146e+06 -1.603622642541713e+06 6.753060232496084e+06 -7.008049819049241e+03 1.807570224559559e+03 2.149019000788894e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.250000000000000e+02 1.661783884109082e+06 -1.603586490596476e+06 6.753103211380883e+06 -7.008080693096345e+03 1.807625616792669e+03 2.148870944099348e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.260000000000000e+02 1.661643722235180e+06 -1.603550337543857e+06 6.753146187304063e+06 -7.008111562885315e+03 1.807681007249990e+03 2.148722890767495e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.270000000000000e+02 1.661503559745397e+06 -1.603514183383840e+06 6.753189160265632e+06 -7.008142430857321e+03 1.807736398072965e+03 2.148574831042185e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.280000000000000e+02 1.661363396639701e+06 -1.603478028116417e+06 6.753232130265607e+06 -7.008173295039934e+03 1.807791788095049e+03 2.148426772296226e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.290000000000000e+02 1.661223232918357e+06 -1.603441871741650e+06 6.753275097303900e+06 -7.008204156230438e+03 1.807847177299211e+03 2.148278711987825e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.300000000000000e+02 1.661083068581332e+06 -1.603405714259533e+06 6.753318061380531e+06 -7.008235013713907e+03 1.807902565495481e+03 2.148130652580955e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.310000000000000e+02 1.660942903628680e+06 -1.603369555670071e+06 6.753361022495474e+06 -7.008265868246964e+03 1.807957953007082e+03 2.147982591358288e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.320000000000000e+02 1.660802738060377e+06 -1.603333395973262e+06 6.753403980648750e+06 -7.008296719571835e+03 1.808013340176590e+03 2.147834528839010e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.330000000000000e+02 1.660662571876681e+06 -1.603297235169165e+06 6.753446935840266e+06 -7.008327567879102e+03 1.808068726648615e+03 2.147686464730703e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.340000000000000e+02 1.660522405077561e+06 -1.603261073257771e+06 6.753489888070046e+06 -7.008358412239334e+03 1.808124111578426e+03 2.147538402774653e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.350000000000000e+02 1.660382237662978e+06 -1.603224910239069e+06 6.753532837338096e+06 -7.008389254368580e+03 1.808179497255175e+03 2.147390335407735e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.360000000000000e+02 1.660242069633193e+06 -1.603188746113119e+06 6.753575783644339e+06 -7.008420092005998e+03 1.808234880518031e+03 2.147242272725018e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.370000000000000e+02 1.660101900988179e+06 -1.603152580879916e+06 6.753618726988783e+06 -7.008450927218158e+03 1.808290263983683e+03 2.147094205743420e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.380000000000000e+02 1.659961731727994e+06 -1.603116414539470e+06 6.753661667371413e+06 -7.008481759512870e+03 1.808345647009912e+03 2.146946136619202e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.390000000000000e+02 1.659821561852602e+06 -1.603080247091771e+06 6.753704604792237e+06 -7.008512588232354e+03 1.808401029112404e+03 2.146798067898959e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.400000000000000e+02 1.659681391362275e+06 -1.603044078536888e+06 6.753747539251180e+06 -7.008543413762310e+03 1.808456410598498e+03 2.146649998068479e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.410000000000000e+02 1.659541220256968e+06 -1.603007908874801e+06 6.753790470748250e+06 -7.008574236133429e+03 1.808511791244927e+03 2.146501927229883e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.420000000000000e+02 1.659401048536751e+06 -1.602971738105529e+06 6.753833399283427e+06 -7.008605055235073e+03 1.808567171085027e+03 2.146353855708439e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.430000000000000e+02 1.659260876201586e+06 -1.602935566229061e+06 6.753876324856729e+06 -7.008635871386272e+03 1.808622550845265e+03 2.146205781826613e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.440000000000000e+02 1.659120703251737e+06 -1.602899393245457e+06 6.753919247468069e+06 -7.008666684068573e+03 1.808677929358203e+03 2.146057708298718e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.450000000000000e+02 1.658980529687173e+06 -1.602863219154714e+06 6.753962167117464e+06 -7.008697493531238e+03 1.808733307172838e+03 2.145909633830836e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.460000000000000e+02 1.658840355507850e+06 -1.602827043956813e+06 6.754005083804925e+06 -7.008728299457550e+03 1.808788684162271e+03 2.145761559554358e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.470000000000000e+02 1.658700180714041e+06 -1.602790867651824e+06 6.754047997530371e+06 -7.008759101925017e+03 1.808844060263821e+03 2.145613485276942e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.480000000000000e+02 1.658560005305704e+06 -1.602754690239729e+06 6.754090908293811e+06 -7.008789902280207e+03 1.808899436399878e+03 2.145465405843510e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.490000000000000e+02 1.658419829282912e+06 -1.602718511720553e+06 6.754133816095231e+06 -7.008820698891156e+03 1.808954811425707e+03 2.145317327525654e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.500000000000000e+02 1.658279652645620e+06 -1.602682332094276e+06 6.754176720934642e+06 -7.008851492494266e+03 1.809010186285360e+03 2.145169247108604e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.510000000000000e+02 1.658139475394093e+06 -1.602646151360961e+06 6.754219622811961e+06 -7.008882282579108e+03 1.809065559874952e+03 2.145021167225315e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.520000000000000e+02 1.657999297528304e+06 -1.602609969520606e+06 6.754262521727204e+06 -7.008913069559584e+03 1.809120932847908e+03 2.144873085958194e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.530000000000000e+02 1.657859119048206e+06 -1.602573786573188e+06 6.754305417680381e+06 -7.008943852680424e+03 1.809176304716126e+03 2.144725006173441e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.540000000000000e+02 1.657718939954074e+06 -1.602537602518782e+06 6.754348310671411e+06 -7.008974633186474e+03 1.809231676225319e+03 2.144576923199882e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.550000000000000e+02 1.657578760245867e+06 -1.602501417357372e+06 6.754391200700304e+06 -7.009005410419739e+03 1.809287047197176e+03 2.144428839312244e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.560000000000000e+02 1.657438579923648e+06 -1.602465231088972e+06 6.754434087767048e+06 -7.009036185026693e+03 1.809342417757902e+03 2.144280752319042e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.570000000000000e+02 1.657298398987386e+06 -1.602429043713573e+06 6.754476971871651e+06 -7.009066955822095e+03 1.809397787413787e+03 2.144132666474110e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.580000000000000e+02 1.657158217437335e+06 -1.602392855231232e+06 6.754519853014031e+06 -7.009097723446302e+03 1.809453156136539e+03 2.143984579744874e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.590000000000000e+02 1.657018035273480e+06 -1.602356665641952e+06 6.754562731194203e+06 -7.009128487806406e+03 1.809508524165526e+03 2.143836492214491e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.600000000000000e+02 1.656877852495762e+06 -1.602320474945707e+06 6.754605606412180e+06 -7.009159248714703e+03 1.809563891371748e+03 2.143688404602673e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.610000000000000e+02 1.656737669104461e+06 -1.602284283142571e+06 6.754648478667876e+06 -7.009190006361567e+03 1.809619257919246e+03 2.143540316149743e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.620000000000000e+02 1.656597485099532e+06 -1.602248090232526e+06 6.754691347961308e+06 -7.009220761081258e+03 1.809674623707519e+03 2.143392225871375e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.630000000000000e+02 1.656457300481053e+06 -1.602211896215598e+06 6.754734214292458e+06 -7.009251512957097e+03 1.809729989217939e+03 2.143244133065842e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.640000000000000e+02 1.656317115248970e+06 -1.602175701091760e+06 6.754777077661332e+06 -7.009282260878958e+03 1.809785353738510e+03 2.143096041944432e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.650000000000000e+02 1.656176929403562e+06 -1.602139504861087e+06 6.754819938067856e+06 -7.009313006183048e+03 1.809840717906561e+03 2.142947947635860e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.660000000000000e+02 1.656036742944786e+06 -1.602103307523563e+06 6.754862795512042e+06 -7.009343748097176e+03 1.809896081020182e+03 2.142799853255848e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.670000000000000e+02 1.655896555872708e+06 -1.602067109079205e+06 6.754905649993866e+06 -7.009374486724600e+03 1.809951443421852e+03 2.142651758163839e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.680000000000000e+02 1.655756368187292e+06 -1.602030909528000e+06 6.754948501513344e+06 -7.009405222085335e+03 1.810006805310113e+03 2.142503662116574e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.690000000000000e+02 1.655616179888806e+06 -1.601994708870013e+06 6.754991350070397e+06 -7.009435954308281e+03 1.810062166422266e+03 2.142355564936070e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.700000000000000e+02 1.655475990977209e+06 -1.601958507105233e+06 6.755034195665033e+06 -7.009466683275672e+03 1.810117526727578e+03 2.142207467028923e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.710000000000000e+02 1.655335801452467e+06 -1.601922304233647e+06 6.755077038297267e+06 -7.009497408995316e+03 1.810172886418437e+03 2.142059368196627e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.720000000000000e+02 1.655195611314850e+06 -1.601886100255325e+06 6.755119877967019e+06 -7.009528131005706e+03 1.810228244980909e+03 2.141911270387640e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.730000000000000e+02 1.655055420564315e+06 -1.601849895170249e+06 6.755162714674298e+06 -7.009558850825292e+03 1.810283603764687e+03 2.141763167498778e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.740000000000000e+02 1.654915229200934e+06 -1.601813688978440e+06 6.755205548419089e+06 -7.009589566953843e+03 1.810338961278204e+03 2.141615065702470e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.750000000000000e+02 1.654775037224660e+06 -1.601777481679878e+06 6.755248379201402e+06 -7.009620279828322e+03 1.810394318239406e+03 2.141466962945301e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.760000000000000e+02 1.654634844635766e+06 -1.601741273274634e+06 6.755291207021154e+06 -7.009650989430723e+03 1.810449674486809e+03 2.141318859430884e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.770000000000000e+02 1.654494651434215e+06 -1.601705063762694e+06 6.755334031878364e+06 -7.009681696202441e+03 1.810505030025051e+03 2.141170753734088e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.780000000000000e+02 1.654354457619971e+06 -1.601668853144049e+06 6.755376853773039e+06 -7.009712399627941e+03 1.810560385334064e+03 2.141022647081503e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.790000000000000e+02 1.654214263193295e+06 -1.601632641418760e+06 6.755419672705099e+06 -7.009743099102724e+03 1.810615738686577e+03 2.140874542977538e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.800000000000000e+02 1.654074068154163e+06 -1.601596428586824e+06 6.755462488674559e+06 -7.009773796112421e+03 1.810671092436352e+03 2.140726434515904e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.810000000000000e+02 1.653933872502625e+06 -1.601560214648245e+06 6.755505301681398e+06 -7.009804489727903e+03 1.810726445014986e+03 2.140578326102840e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.820000000000000e+02 1.653793676238650e+06 -1.601523999603016e+06 6.755548111725627e+06 -7.009835180034532e+03 1.810781797121066e+03 2.140430216833337e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.830000000000000e+02 1.653653479362507e+06 -1.601487783451203e+06 6.755590918807167e+06 -7.009865866556860e+03 1.810837147852758e+03 2.140282109052437e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.840000000000000e+02 1.653513281874158e+06 -1.601451566192793e+06 6.755633722926033e+06 -7.009896550533256e+03 1.810892498311774e+03 2.140133997777831e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.850000000000000e+02 1.653373083773566e+06 -1.601415347827775e+06 6.755676524082232e+06 -7.009927231962904e+03 1.810947849069301e+03 2.139985882495976e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.860000000000000e+02 1.653232885060996e+06 -1.601379128356216e+06 6.755719322275689e+06 -7.009957908620118e+03 1.811003197540491e+03 2.139837772709142e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.870000000000000e+02 1.653092685736412e+06 -1.601342907778098e+06 6.755762117506410e+06 -7.009988583122555e+03 1.811058546204990e+03 2.139689657747284e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.880000000000000e+02 1.652952485799877e+06 -1.601306686093439e+06 6.755804909774379e+06 -7.010019253874731e+03 1.811113893651033e+03 2.139541544024410e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.890000000000000e+02 1.652812285251357e+06 -1.601270463302230e+06 6.755847699079612e+06 -7.010049921683149e+03 1.811169240773440e+03 2.139393428134459e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.900000000000000e+02 1.652672084091124e+06 -1.601234239404538e+06 6.755890485422024e+06 -7.010080586487564e+03 1.811224587495958e+03 2.139245310340110e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.910000000000000e+02 1.652531882319130e+06 -1.601198014400342e+06 6.755933268801629e+06 -7.010111247858111e+03 1.811279933167966e+03 2.139097192613977e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.920000000000000e+02 1.652391679935446e+06 -1.601161788289666e+06 6.755976049218406e+06 -7.010141906596373e+03 1.811335278482455e+03 2.138949071747056e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.930000000000000e+02 1.652251476940032e+06 -1.601125561072491e+06 6.756018826672370e+06 -7.010172560902291e+03 1.811390622350508e+03 2.138800954524069e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.940000000000000e+02 1.652111273333159e+06 -1.601089332748887e+06 6.756061601163439e+06 -7.010203212582222e+03 1.811445966014238e+03 2.138652834001643e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.950000000000000e+02 1.651971069114787e+06 -1.601053103318840e+06 6.756104372691628e+06 -7.010233860868881e+03 1.811501308504147e+03 2.138504713528439e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.960000000000000e+02 1.651830864284878e+06 -1.601016872782338e+06 6.756147141256944e+06 -7.010264506342364e+03 1.811556650840965e+03 2.138356590312379e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.970000000000000e+02 1.651690658843707e+06 -1.600980641139453e+06 6.756189906859313e+06 -7.010295148385751e+03 1.811611992547020e+03 2.138208466773599e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.980000000000000e+02 1.651550452791223e+06 -1.600944408390160e+06 6.756232669498742e+06 -7.010325787452982e+03 1.811667333508769e+03 2.138060341551229e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.990000000000000e+02 1.651410246127501e+06 -1.600908174534484e+06 6.756275429175214e+06 -7.010356423126872e+03 1.811722673383033e+03 2.137912216300449e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.000000000000000e+02 1.651270038852502e+06 -1.600871939572411e+06 6.756318185888740e+06 -7.010387055428959e+03 1.811778012888733e+03 2.137764090302232e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.010000000000000e+02 1.651129830966494e+06 -1.600835703504006e+06 6.756360939639243e+06 -7.010417684604955e+03 1.811833351537109e+03 2.137615963205998e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.020000000000000e+02 1.650989622469440e+06 -1.600799466329260e+06 6.756403690426733e+06 -7.010448310558534e+03 1.811888689491761e+03 2.137467835174491e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.030000000000000e+02 1.650849413361297e+06 -1.600763228048152e+06 6.756446438251222e+06 -7.010478933265068e+03 1.811944026698299e+03 2.137319706336330e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.040000000000000e+02 1.650709203642344e+06 -1.600726988660760e+06 6.756489183112632e+06 -7.010509552498167e+03 1.811999363104036e+03 2.137171577469426e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.050000000000000e+02 1.650568993312530e+06 -1.600690748167062e+06 6.756531925010969e+06 -7.010540168762086e+03 1.812054698959121e+03 2.137023446721103e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.060000000000000e+02 1.650428782371926e+06 -1.600654506567076e+06 6.756574663946220e+06 -7.010570781855118e+03 1.812110033877335e+03 2.136875315091174e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.070000000000000e+02 1.650288570820502e+06 -1.600618263860796e+06 6.756617399918397e+06 -7.010601391399980e+03 1.812165368308384e+03 2.136727183390155e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.080000000000000e+02 1.650148358658512e+06 -1.600582020048276e+06 6.756660132927416e+06 -7.010631998549190e+03 1.812220702615048e+03 2.136579047571397e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.090000000000000e+02 1.650008145885929e+06 -1.600545775129514e+06 6.756702862973293e+06 -7.010662601441538e+03 1.812276034945401e+03 2.136430915315238e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.100000000000000e+02 1.649867932502712e+06 -1.600509529104494e+06 6.756745590056040e+06 -7.010693201610957e+03 1.812331367276589e+03 2.136282779883907e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.110000000000000e+02 1.649727718509130e+06 -1.600473281973285e+06 6.756788314175572e+06 -7.010723798533511e+03 1.812386699160022e+03 2.136134643373662e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.120000000000000e+02 1.649587503905142e+06 -1.600437033735867e+06 6.756831035331908e+06 -7.010754392832760e+03 1.812442030438910e+03 2.135986503913747e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.130000000000000e+02 1.649447288690818e+06 -1.600400784392264e+06 6.756873753525024e+06 -7.010784983377322e+03 1.812497360686981e+03 2.135838365541329e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.140000000000000e+02 1.649307072866116e+06 -1.600364533942458e+06 6.756916468754935e+06 -7.010815570126895e+03 1.812552689725720e+03 2.135690228548534e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.150000000000000e+02 1.649166856431309e+06 -1.600328282386519e+06 6.756959181021558e+06 -7.010846154162949e+03 1.812608018606113e+03 2.135542088493349e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.160000000000000e+02 1.649026639386354e+06 -1.600292029724430e+06 6.757001890324909e+06 -7.010876735313533e+03 1.812663347024302e+03 2.135393946205476e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.170000000000000e+02 1.648886421731317e+06 -1.600255775956209e+06 6.757044596664966e+06 -7.010907312994712e+03 1.812718674327830e+03 2.135245804160663e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.180000000000000e+02 1.648746203466160e+06 -1.600219521081841e+06 6.757087300041742e+06 -7.010937887388194e+03 1.812774001049017e+03 2.135097661290484e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.190000000000000e+02 1.648605984591158e+06 -1.600183265101399e+06 6.757130000455159e+06 -7.010968458562062e+03 1.812829327195917e+03 2.134949517367861e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.200000000000000e+02 1.648465765106265e+06 -1.600147008014863e+06 6.757172697905227e+06 -7.010999026295662e+03 1.812884652225839e+03 2.134801373596715e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.210000000000000e+02 1.648325545011447e+06 -1.600110749822224e+06 6.757215392391957e+06 -7.011029591317038e+03 1.812939977092260e+03 2.134653226762477e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.220000000000000e+02 1.648185324306973e+06 -1.600074490523551e+06 6.757258083915272e+06 -7.011060152842192e+03 1.812995301097746e+03 2.134505080028608e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.230000000000000e+02 1.648045102992801e+06 -1.600038230118824e+06 6.757300772475181e+06 -7.011090711171792e+03 1.813050624283338e+03 2.134356932386913e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.240000000000000e+02 1.647904881069002e+06 -1.600001968608066e+06 6.757343458071667e+06 -7.011121266555136e+03 1.813105946975092e+03 2.134208782736738e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.250000000000000e+02 1.647764658535536e+06 -1.599965705991262e+06 6.757386140704744e+06 -7.011151818148891e+03 1.813161268614104e+03 2.134060634308687e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.260000000000000e+02 1.647624435392666e+06 -1.599929442268474e+06 6.757428820374327e+06 -7.011182367068186e+03 1.813216589887431e+03 2.133912482877870e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.270000000000000e+02 1.647484211640364e+06 -1.599893177439698e+06 6.757471497080433e+06 -7.011212912517784e+03 1.813271910305348e+03 2.133764331457089e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.280000000000000e+02 1.647343987278585e+06 -1.599856911504915e+06 6.757514170823073e+06 -7.011243454761900e+03 1.813327230148519e+03 2.133616178938450e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.290000000000000e+02 1.647203762307598e+06 -1.599820644464193e+06 6.757556841602162e+06 -7.011273993448393e+03 1.813382548844267e+03 2.133468026978906e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.300000000000000e+02 1.647063536727368e+06 -1.599784376317521e+06 6.757599509417717e+06 -7.011304529504490e+03 1.813437867340830e+03 2.133319871722669e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.310000000000000e+02 1.646923310537966e+06 -1.599748107064919e+06 6.757642174269720e+06 -7.011335061836920e+03 1.813493184627590e+03 2.133171717618839e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.320000000000000e+02 1.646783083739339e+06 -1.599711836706362e+06 6.757684836158182e+06 -7.011365591124280e+03 1.813548501634034e+03 2.133023561631834e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.330000000000000e+02 1.646642856331767e+06 -1.599675565241926e+06 6.757727495083020e+06 -7.011396117516257e+03 1.813603818162631e+03 2.132875403456614e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.340000000000000e+02 1.646502628315206e+06 -1.599639292671593e+06 6.757770151044250e+06 -7.011426640693504e+03 1.813659133756754e+03 2.132727244539321e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.350000000000000e+02 1.646362399689624e+06 -1.599603018995356e+06 6.757812804041884e+06 -7.011457159571673e+03 1.813714447810577e+03 2.132579088935136e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.360000000000000e+02 1.646222170455289e+06 -1.599566744213282e+06 6.757855454075838e+06 -7.011487675983510e+03 1.813769761904283e+03 2.132430929286182e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.370000000000000e+02 1.646081940612160e+06 -1.599530468325354e+06 6.757898101146128e+06 -7.011518189782373e+03 1.813825075916094e+03 2.132282766176350e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.380000000000000e+02 1.645941710160299e+06 -1.599494191331586e+06 6.757940745252734e+06 -7.011548699299306e+03 1.813880387948842e+03 2.132134606722905e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.390000000000000e+02 1.645801479099674e+06 -1.599457913231970e+06 6.757983386395667e+06 -7.011579206047418e+03 1.813935699857491e+03 2.131986444350807e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.400000000000000e+02 1.645661247430555e+06 -1.599421634026574e+06 6.758026024574849e+06 -7.011609710169429e+03 1.813991011895292e+03 2.131838278368229e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.410000000000000e+02 1.645521015152894e+06 -1.599385353715376e+06 6.758068659790291e+06 -7.011640210240414e+03 1.814046322120534e+03 2.131690115145175e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.420000000000000e+02 1.645380782266768e+06 -1.599349072298401e+06 6.758111292041974e+06 -7.011670707419811e+03 1.814101631941275e+03 2.131541949654393e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.430000000000000e+02 1.645240548772131e+06 -1.599312789775631e+06 6.758153921329912e+06 -7.011701201854710e+03 1.814156941562820e+03 2.131393781233406e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.440000000000000e+02 1.645100314669254e+06 -1.599276506147135e+06 6.758196547654023e+06 -7.011731691982745e+03 1.814212249626387e+03 2.131245616169555e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.450000000000000e+02 1.644960079958101e+06 -1.599240221412899e+06 6.758239171014319e+06 -7.011762178935645e+03 1.814267556763914e+03 2.131097450228569e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.460000000000000e+02 1.644819844638634e+06 -1.599203935572913e+06 6.758281791410815e+06 -7.011792663458343e+03 1.814322864129566e+03 2.130949279952425e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.470000000000000e+02 1.644679608711120e+06 -1.599167648627242e+06 6.758324408843427e+06 -7.011823144770550e+03 1.814378170761916e+03 2.130801108738078e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.480000000000000e+02 1.644539372175522e+06 -1.599131360575874e+06 6.758367023312169e+06 -7.011853622582247e+03 1.814433476460562e+03 2.130652937706030e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.490000000000000e+02 1.644399135031903e+06 -1.599095071418824e+06 6.758409634817021e+06 -7.011884097181754e+03 1.814488781302324e+03 2.130504765853671e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.500000000000000e+02 1.644258897280225e+06 -1.599058781156075e+06 6.758452243357998e+06 -7.011914568797431e+03 1.814544085889812e+03 2.130356591894689e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.510000000000000e+02 1.644118658920759e+06 -1.599022489787700e+06 6.758494848935019e+06 -7.011945036946910e+03 1.814599389439202e+03 2.130208418102005e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.520000000000000e+02 1.643978419953468e+06 -1.598986197313685e+06 6.758537451548095e+06 -7.011975501893703e+03 1.814654692231495e+03 2.130060243367641e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.530000000000000e+02 1.643838180378309e+06 -1.598949903734014e+06 6.758580051197239e+06 -7.012005963644388e+03 1.814709994332642e+03 2.129912067610398e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.540000000000000e+02 1.643697940195563e+06 -1.598913609048765e+06 6.758622647882368e+06 -7.012036422075586e+03 1.814765295859734e+03 2.129763891123340e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.550000000000000e+02 1.643557699405179e+06 -1.598877313257911e+06 6.758665241603498e+06 -7.012066877079089e+03 1.814820596274929e+03 2.129615714745491e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.560000000000000e+02 1.643417458007224e+06 -1.598841016361474e+06 6.758707832360610e+06 -7.012097329156572e+03 1.814875896302177e+03 2.129467536194858e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.570000000000000e+02 1.643277216001663e+06 -1.598804718359438e+06 6.758750420153715e+06 -7.012127777961365e+03 1.814931195613162e+03 2.129319356892122e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.580000000000000e+02 1.643136973388772e+06 -1.598768419251882e+06 6.758793004982734e+06 -7.012158223555065e+03 1.814986494363848e+03 2.129171176496104e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.590000000000000e+02 1.642996730168495e+06 -1.598732119038773e+06 6.758835586847677e+06 -7.012188666251324e+03 1.815041792381492e+03 2.129022994147874e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.600000000000000e+02 1.642856486340811e+06 -1.598695817720114e+06 6.758878165748558e+06 -7.012219105413464e+03 1.815097089696616e+03 2.128874811881731e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.610000000000000e+02 1.642716241905979e+06 -1.598659515295967e+06 6.758920741685295e+06 -7.012249541348199e+03 1.815152386157355e+03 2.128726628842372e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.620000000000000e+02 1.642575996863968e+06 -1.598623211766324e+06 6.758963314657904e+06 -7.012279974307456e+03 1.815207682336518e+03 2.128578443692994e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.630000000000000e+02 1.642435751214835e+06 -1.598586907131188e+06 6.759005884666362e+06 -7.012310403620561e+03 1.815262976943884e+03 2.128430259779173e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.640000000000000e+02 1.642295504958552e+06 -1.598550601390562e+06 6.759048451710685e+06 -7.012340830115089e+03 1.815318271787718e+03 2.128282072775924e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.650000000000000e+02 1.642155258095380e+06 -1.598514294544501e+06 6.759091015790790e+06 -7.012371252387568e+03 1.815373564734728e+03 2.128133889170207e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.660000000000000e+02 1.642015010625281e+06 -1.598477986592996e+06 6.759133576906689e+06 -7.012401672750513e+03 1.815428858182123e+03 2.127985699289217e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.670000000000000e+02 1.641874762548325e+06 -1.598441677536063e+06 6.759176135058368e+06 -7.012432088876650e+03 1.815484149820910e+03 2.127837512773896e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.680000000000000e+02 1.641734513864467e+06 -1.598405367373686e+06 6.759218690245833e+06 -7.012462502542461e+03 1.815539441815651e+03 2.127689321898827e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.690000000000000e+02 1.641594264573989e+06 -1.598369056105942e+06 6.759261242469006e+06 -7.012492912692098e+03 1.815594732752752e+03 2.127541131371333e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.700000000000000e+02 1.641454014676833e+06 -1.598332743732801e+06 6.759303791727901e+06 -7.012523319693057e+03 1.815650022681582e+03 2.127392939955570e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.710000000000000e+02 1.641313764172980e+06 -1.598296430254268e+06 6.759346338022530e+06 -7.012553723162810e+03 1.815705312113644e+03 2.127244748426247e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.720000000000000e+02 1.641173513062689e+06 -1.598260115670400e+06 6.759388881352810e+06 -7.012584123933905e+03 1.815760601072475e+03 2.127096554062999e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.730000000000000e+02 1.641033261345923e+06 -1.598223799981187e+06 6.759431421718757e+06 -7.012614521199090e+03 1.815815889200045e+03 2.126948359808516e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.740000000000000e+02 1.640893009022750e+06 -1.598187483186645e+06 6.759473959120352e+06 -7.012644915055859e+03 1.815871176200090e+03 2.126800165616494e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.750000000000000e+02 1.640752756093129e+06 -1.598151165286758e+06 6.759516493557605e+06 -7.012675305907189e+03 1.815926462965044e+03 2.126651969368202e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.760000000000000e+02 1.640612502557331e+06 -1.598114846281595e+06 6.759559025030433e+06 -7.012705693800591e+03 1.815981749092691e+03 2.126503771275397e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.770000000000000e+02 1.640472248415320e+06 -1.598078526171149e+06 6.759601553538855e+06 -7.012736078507946e+03 1.816037034539470e+03 2.126355572117358e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.780000000000000e+02 1.640331993667048e+06 -1.598042204955395e+06 6.759644079082880e+06 -7.012766459401055e+03 1.816092319012566e+03 2.126207374198161e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.790000000000000e+02 1.640191738312796e+06 -1.598005882634411e+06 6.759686601662429e+06 -7.012796837382607e+03 1.816147602835781e+03 2.126059174295454e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.800000000000000e+02 1.640051482352520e+06 -1.597969559208179e+06 6.759729121277511e+06 -7.012827212175907e+03 1.816202885813270e+03 2.125910973484898e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.810000000000000e+02 1.639911225786292e+06 -1.597933234676722e+06 6.759771637928110e+06 -7.012857583968243e+03 1.816258168583799e+03 2.125762770577223e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.820000000000000e+02 1.639770968614060e+06 -1.597896909040012e+06 6.759814151614238e+06 -7.012887952231475e+03 1.816313450379354e+03 2.125614567985092e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.830000000000000e+02 1.639630710836102e+06 -1.597860582298127e+06 6.759856662335817e+06 -7.012918317379384e+03 1.816368731278635e+03 2.125466364294543e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.840000000000000e+02 1.639490452452384e+06 -1.597824254451057e+06 6.759899170092854e+06 -7.012948678993548e+03 1.816424011345689e+03 2.125318160804948e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.850000000000000e+02 1.639350193462861e+06 -1.597787925498781e+06 6.759941674885364e+06 -7.012979037590661e+03 1.816479291040089e+03 2.125169955421157e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.860000000000000e+02 1.639209933867804e+06 -1.597751595441373e+06 6.759984176713271e+06 -7.013009393012008e+03 1.816534569936013e+03 2.125021749045959e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.870000000000000e+02 1.639069673667174e+06 -1.597715264278813e+06 6.760026675576581e+06 -7.013039745275309e+03 1.816589848279551e+03 2.124873541397626e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.880000000000000e+02 1.638929412861036e+06 -1.597678932011122e+06 6.760069171475274e+06 -7.013070094530241e+03 1.816645125837775e+03 2.124725332202488e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.890000000000000e+02 1.638789151449355e+06 -1.597642598638285e+06 6.760111664409369e+06 -7.013100440264238e+03 1.816700402739046e+03 2.124577123007275e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.900000000000000e+02 1.638648889432401e+06 -1.597606264160374e+06 6.760154154378784e+06 -7.013130782815376e+03 1.816755678777458e+03 2.124428912902346e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.910000000000000e+02 1.638508626810129e+06 -1.597569928577368e+06 6.760196641383529e+06 -7.013161121609310e+03 1.816810953755517e+03 2.124280703932387e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.920000000000000e+02 1.638368363582608e+06 -1.597533591889285e+06 6.760239125423586e+06 -7.013191458251518e+03 1.816866228837253e+03 2.124132489824043e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.930000000000000e+02 1.638228099749801e+06 -1.597497254096114e+06 6.760281606498970e+06 -7.013221790593935e+03 1.816921502307855e+03 2.123984279114607e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.940000000000000e+02 1.638087835311978e+06 -1.597460915197923e+06 6.760324084609597e+06 -7.013252120819088e+03 1.816976776204807e+03 2.123836062860054e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.950000000000000e+02 1.637947570269095e+06 -1.597424575194694e+06 6.760366559755481e+06 -7.013282447003758e+03 1.817032048352986e+03 2.123687849288410e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.960000000000000e+02 1.637807304621121e+06 -1.597388234086420e+06 6.760409031936633e+06 -7.013312770187160e+03 1.817087320378770e+03 2.123539633542245e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.970000000000000e+02 1.637667038368321e+06 -1.597351891873168e+06 6.760451501152975e+06 -7.013343090711153e+03 1.817142591978285e+03 2.123391414788000e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.980000000000000e+02 1.637526771510657e+06 -1.597315548554921e+06 6.760493967404520e+06 -7.013373406953797e+03 1.817197862040057e+03 2.123243199307498e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.990000000000000e+02 1.637386504048195e+06 -1.597279204131696e+06 6.760536430691246e+06 -7.013403721130945e+03 1.817253132112177e+03 2.123094978491334e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.000000000000000e+02 1.637246235980900e+06 -1.597242858603484e+06 6.760578891013165e+06 -7.013434030878689e+03 1.817308400669059e+03 2.122946761409996e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.010000000000000e+02 1.637105967309037e+06 -1.597206511970349e+06 6.760621348370200e+06 -7.013464338489673e+03 1.817363669751672e+03 2.122798538753661e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.020000000000000e+02 1.636965698032565e+06 -1.597170164232274e+06 6.760663802762366e+06 -7.013494642179495e+03 1.817418936938114e+03 2.122650318529041e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.030000000000000e+02 1.636825428151450e+06 -1.597133815389252e+06 6.760706254189667e+06 -7.013524942835960e+03 1.817474203927410e+03 2.122502096301633e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.040000000000000e+02 1.636685157665964e+06 -1.597097465441352e+06 6.760748702652027e+06 -7.013555239960371e+03 1.817529469865450e+03 2.122353874471271e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.050000000000000e+02 1.636544886576068e+06 -1.597061114388558e+06 6.760791148149463e+06 -7.013585534267621e+03 1.817584735462284e+03 2.122205650066802e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.060000000000000e+02 1.636404614881823e+06 -1.597024762230885e+06 6.760833590681948e+06 -7.013615825287306e+03 1.817640000171296e+03 2.122057425115722e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.070000000000000e+02 1.636264342583190e+06 -1.596988408968318e+06 6.760876030249499e+06 -7.013646112497240e+03 1.817695263809820e+03 2.121909201482211e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.080000000000000e+02 1.636124069680447e+06 -1.596952054600931e+06 6.760918466852035e+06 -7.013676397061556e+03 1.817750527277645e+03 2.121760974561069e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.090000000000000e+02 1.635983796173545e+06 -1.596915699128705e+06 6.760960900489570e+06 -7.013706678470651e+03 1.817805789968585e+03 2.121612746561891e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.100000000000000e+02 1.635843522062450e+06 -1.596879342551626e+06 6.761003331162110e+06 -7.013736956514981e+03 1.817861051920759e+03 2.121464518131119e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.110000000000000e+02 1.635703247347436e+06 -1.596842984869770e+06 6.761045758869587e+06 -7.013767231995344e+03 1.817916313795271e+03 2.121316286061423e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.120000000000000e+02 1.635562972028461e+06 -1.596806626083120e+06 6.761088183612001e+06 -7.013797503966194e+03 1.817971574592731e+03 2.121168054339455e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.130000000000000e+02 1.635422696105588e+06 -1.596770266191687e+06 6.761130605389339e+06 -7.013827772703455e+03 1.818026834680006e+03 2.121019821733170e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.140000000000000e+02 1.635282419578783e+06 -1.596733905195464e+06 6.761173024201612e+06 -7.013858037919007e+03 1.818082093941439e+03 2.120871589285248e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.150000000000000e+02 1.635142142448311e+06 -1.596697543094514e+06 6.761215440048741e+06 -7.013888299136073e+03 1.818137351672365e+03 2.120723359190339e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.160000000000000e+02 1.635001864714137e+06 -1.596661179888825e+06 6.761257852930737e+06 -7.013918557937888e+03 1.818192609393871e+03 2.120575124909822e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.170000000000000e+02 1.634861586376326e+06 -1.596624815578416e+06 6.761300262847584e+06 -7.013948814058794e+03 1.818247866964168e+03 2.120426887436605e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.180000000000000e+02 1.634721307434834e+06 -1.596588450163265e+06 6.761342669799293e+06 -7.013979066443618e+03 1.818303123368933e+03 2.120278651129697e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.190000000000000e+02 1.634581027889936e+06 -1.596552083643448e+06 6.761385073785781e+06 -7.014009315000684e+03 1.818358378459493e+03 2.120130416423689e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.200000000000000e+02 1.634440747741596e+06 -1.596515716018951e+06 6.761427474807064e+06 -7.014039561764994e+03 1.818413634056729e+03 2.119982175033828e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.210000000000000e+02 1.634300466989773e+06 -1.596479347289760e+06 6.761469872863153e+06 -7.014069804171491e+03 1.818468888182630e+03 2.119833937113135e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.220000000000000e+02 1.634160185634734e+06 -1.596442977455944e+06 6.761512267953968e+06 -7.014100043896809e+03 1.818524142028878e+03 2.119685696117299e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.230000000000000e+02 1.634019903676446e+06 -1.596406606517486e+06 6.761554660079519e+06 -7.014130280140957e+03 1.818579394883271e+03 2.119537455300386e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.240000000000000e+02 1.633879621114964e+06 -1.596370234474401e+06 6.761597049239793e+06 -7.014160513225836e+03 1.818634646801070e+03 2.119389213564488e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.250000000000000e+02 1.633739337950262e+06 -1.596333861326684e+06 6.761639435434797e+06 -7.014190742982957e+03 1.818689898379803e+03 2.119240970911624e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.260000000000000e+02 1.633599054182599e+06 -1.596297487074391e+06 6.761681818664453e+06 -7.014220969052972e+03 1.818745148516682e+03 2.119092729519976e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.270000000000000e+02 1.633458769811950e+06 -1.596261111717523e+06 6.761724198928772e+06 -7.014251192993434e+03 1.818800398933836e+03 2.118944482744728e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.280000000000000e+02 1.633318484838265e+06 -1.596224735256058e+06 6.761766576227770e+06 -7.014281413064896e+03 1.818855648461992e+03 2.118796237317174e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.290000000000000e+02 1.633178199261814e+06 -1.596188357690060e+06 6.761808950561364e+06 -7.014311629499015e+03 1.818910896482749e+03 2.118647993049306e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.300000000000000e+02 1.633037913082566e+06 -1.596151979019527e+06 6.761851321929566e+06 -7.014341843461465e+03 1.818966144533196e+03 2.118499744739946e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.310000000000000e+02 1.632897626300581e+06 -1.596115599244467e+06 6.761893690332357e+06 -7.014372053418691e+03 1.819021391161528e+03 2.118351498710348e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.320000000000000e+02 1.632757338915820e+06 -1.596079218364869e+06 6.761936055769753e+06 -7.014402260950029e+03 1.819076638021593e+03 2.118203248304832e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.330000000000000e+02 1.632617050928552e+06 -1.596042836380796e+06 6.761978418241668e+06 -7.014432464941849e+03 1.819131883853605e+03 2.118054998302227e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.340000000000000e+02 1.632476762338744e+06 -1.596006453292243e+06 6.762020777748121e+06 -7.014462666121173e+03 1.819187128940631e+03 2.117906746075866e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.350000000000000e+02 1.632336473146356e+06 -1.595970069099196e+06 6.762063134289118e+06 -7.014492863625692e+03 1.819242373496397e+03 2.117758494238622e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.360000000000000e+02 1.632196183351656e+06 -1.595933683801718e+06 6.762105487864584e+06 -7.014523057767797e+03 1.819297616827656e+03 2.117610242407710e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.370000000000000e+02 1.632055892954603e+06 -1.595897297399798e+06 6.762147838474528e+06 -7.014553248914462e+03 1.819352859884193e+03 2.117461988518398e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.380000000000000e+02 1.631915601955265e+06 -1.595860909893450e+06 6.762190186118932e+06 -7.014583437160991e+03 1.819408102120007e+03 2.117313732759789e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.390000000000000e+02 1.631775310353611e+06 -1.595824521282669e+06 6.762232530797811e+06 -7.014613621561108e+03 1.819463343612659e+03 2.117165478143844e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.400000000000000e+02 1.631635018149895e+06 -1.595788131567510e+06 6.762274872511082e+06 -7.014643803350284e+03 1.819518584565713e+03 2.117017220458868e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.410000000000000e+02 1.631494725344093e+06 -1.595751740747972e+06 6.762317211258759e+06 -7.014673981835135e+03 1.819573825107086e+03 2.116868961846778e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.420000000000000e+02 1.631354431936261e+06 -1.595715348824059e+06 6.762359547040821e+06 -7.014704156955381e+03 1.819629064387892e+03 2.116720703281459e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.430000000000000e+02 1.631214137926363e+06 -1.595678955795765e+06 6.762401879857282e+06 -7.014734327927246e+03 1.819684302385004e+03 2.116572447338835e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.440000000000000e+02 1.631073843314668e+06 -1.595642561663154e+06 6.762444209708062e+06 -7.014764496511040e+03 1.819739540409889e+03 2.116424187080740e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.450000000000000e+02 1.630933548101142e+06 -1.595606166426218e+06 6.762486536593176e+06 -7.014794662499240e+03 1.819794778103429e+03 2.116275923511838e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.460000000000000e+02 1.630793252285740e+06 -1.595569770084938e+06 6.762528860512631e+06 -7.014824824617439e+03 1.819850014912505e+03 2.116127661292824e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.470000000000000e+02 1.630652955868734e+06 -1.595533372639384e+06 6.762571181466349e+06 -7.014854982976429e+03 1.819905250202048e+03 2.115979400644905e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.480000000000000e+02 1.630512658850090e+06 -1.595496974089546e+06 6.762613499454346e+06 -7.014885138744909e+03 1.819960485272390e+03 2.115831136566663e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.490000000000000e+02 1.630372361229870e+06 -1.595460574435439e+06 6.762655814476598e+06 -7.014915291528183e+03 1.820015719992344e+03 2.115682870464691e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.500000000000000e+02 1.630232063008038e+06 -1.595424173677050e+06 6.762698126533121e+06 -7.014945440504751e+03 1.820070953593347e+03 2.115534605721988e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.510000000000000e+02 1.630091764184856e+06 -1.595387771814439e+06 6.762740435623834e+06 -7.014975586535064e+03 1.820126186725377e+03 2.115386338937240e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.520000000000000e+02 1.629951464760293e+06 -1.595351368847602e+06 6.762782741748748e+06 -7.015005729708681e+03 1.820181419201370e+03 2.115238069989570e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.530000000000000e+02 1.629811164734309e+06 -1.595314964776522e+06 6.762825044907876e+06 -7.015035868978607e+03 1.820236650682841e+03 2.115089802603949e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.540000000000000e+02 1.629670864107172e+06 -1.595278559601268e+06 6.762867345101139e+06 -7.015066005427821e+03 1.820291881526592e+03 2.114941532921245e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.550000000000000e+02 1.629530562878848e+06 -1.595242153321831e+06 6.762909642328547e+06 -7.015096139380814e+03 1.820347112595226e+03 2.114793259091638e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.560000000000000e+02 1.629390261049397e+06 -1.595205745938220e+06 6.762951936590084e+06 -7.015126268776009e+03 1.820402341606694e+03 2.114644989932740e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.570000000000000e+02 1.629249958618782e+06 -1.595169337450422e+06 6.762994227885761e+06 -7.015156395522341e+03 1.820457570361131e+03 2.114496717566792e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.580000000000000e+02 1.629109655587276e+06 -1.595132927858511e+06 6.763036516215499e+06 -7.015186518966538e+03 1.820512798653431e+03 2.114348444312912e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.590000000000000e+02 1.628969351954834e+06 -1.595096517162465e+06 6.763078801579311e+06 -7.015216639088139e+03 1.820568025515138e+03 2.114200171126235e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.600000000000000e+02 1.628829047721428e+06 -1.595060105362284e+06 6.763121083977207e+06 -7.015246756301226e+03 1.820623252737481e+03 2.114051895012456e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.610000000000000e+02 1.628688742887314e+06 -1.595023692458019e+06 6.763163363409109e+06 -7.015276870477404e+03 1.820678478904490e+03 2.113903617689227e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.620000000000000e+02 1.628548437452466e+06 -1.594987278449673e+06 6.763205639875025e+06 -7.015306980779767e+03 1.820733703986976e+03 2.113755341914823e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.630000000000000e+02 1.628408131416942e+06 -1.594950863337251e+06 6.763247913374944e+06 -7.015337088228390e+03 1.820788928360375e+03 2.113607064015665e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.640000000000000e+02 1.628267824780707e+06 -1.594914447120745e+06 6.763290183908870e+06 -7.015367192373174e+03 1.820844152404424e+03 2.113458785112268e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.650000000000000e+02 1.628127517544028e+06 -1.594878029800219e+06 6.763332451476729e+06 -7.015397293282477e+03 1.820899375698141e+03 2.113310505367822e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.660000000000000e+02 1.627987209706866e+06 -1.594841611375659e+06 6.763374716078533e+06 -7.015427391056093e+03 1.820954597938352e+03 2.113162224734810e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.670000000000000e+02 1.627846901269293e+06 -1.594805191847090e+06 6.763416977714261e+06 -7.015457485599609e+03 1.821009819582245e+03 2.113013943101844e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.680000000000000e+02 1.627706592231267e+06 -1.594768771214492e+06 6.763459236383926e+06 -7.015487576589740e+03 1.821065040667311e+03 2.112865661490107e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.690000000000000e+02 1.627566282593049e+06 -1.594732349477926e+06 6.763501492087447e+06 -7.015517664634315e+03 1.821120260810244e+03 2.112717378266801e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.700000000000000e+02 1.627425972354612e+06 -1.594695926637390e+06 6.763543744824842e+06 -7.015547750056303e+03 1.821175480996251e+03 2.112569091472403e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.710000000000000e+02 1.627285661515913e+06 -1.594659502692865e+06 6.763585994596114e+06 -7.015577831646782e+03 1.821230700012611e+03 2.112420806168355e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.720000000000000e+02 1.627145350077222e+06 -1.594623077644422e+06 6.763628241401192e+06 -7.015607910009979e+03 1.821285918168154e+03 2.112272520097988e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.730000000000000e+02 1.627005038038501e+06 -1.594586651492047e+06 6.763670485240084e+06 -7.015637984689620e+03 1.821341135173221e+03 2.112124235017852e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.740000000000000e+02 1.626864725399815e+06 -1.594550224235756e+06 6.763712726112771e+06 -7.015668056694991e+03 1.821396351824252e+03 2.111975946899649e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.750000000000000e+02 1.626724412161128e+06 -1.594513795875535e+06 6.763754964019264e+06 -7.015698125361702e+03 1.821451568080635e+03 2.111827657950810e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.760000000000000e+02 1.626584098322706e+06 -1.594477366411451e+06 6.763797198959487e+06 -7.015728190851760e+03 1.821506783407286e+03 2.111679368133609e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.770000000000000e+02 1.626443783884512e+06 -1.594440935843493e+06 6.763839430933455e+06 -7.015758253479577e+03 1.821561998388969e+03 2.111531075883422e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.780000000000000e+02 1.626303468846508e+06 -1.594404504171646e+06 6.763881659941170e+06 -7.015788313044692e+03 1.821617212911046e+03 2.111382781960271e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.790000000000000e+02 1.626163153208962e+06 -1.594368071395979e+06 6.763923885982561e+06 -7.015818368348672e+03 1.821672425638771e+03 2.111234491507164e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.800000000000000e+02 1.626022836971837e+06 -1.594331637516479e+06 6.763966109057636e+06 -7.015848420743342e+03 1.821727637823920e+03 2.111086198956476e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.810000000000000e+02 1.625882520135202e+06 -1.594295202533164e+06 6.764008329166377e+06 -7.015878470390573e+03 1.821782850045943e+03 2.110937903246266e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.820000000000000e+02 1.625742202699011e+06 -1.594258766446013e+06 6.764050546308800e+06 -7.015908517087959e+03 1.821838061720289e+03 2.110789605574953e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.830000000000000e+02 1.625601884663537e+06 -1.594222329255101e+06 6.764092760484821e+06 -7.015938559287852e+03 1.821893271247921e+03 2.110641312471631e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.840000000000000e+02 1.625461566028747e+06 -1.594185890960417e+06 6.764134971694452e+06 -7.015968599275588e+03 1.821948481328339e+03 2.110493013984260e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.850000000000000e+02 1.625321246794595e+06 -1.594149451561941e+06 6.764177179937709e+06 -7.015998636064585e+03 1.822003690588187e+03 2.110344714600242e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.860000000000000e+02 1.625180926961355e+06 -1.594113011059746e+06 6.764219385214509e+06 -7.016028669302113e+03 1.822058898985170e+03 2.110196415511803e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.870000000000000e+02 1.625040606528986e+06 -1.594076569453816e+06 6.764261587524868e+06 -7.016058699151482e+03 1.822114106236038e+03 2.110048116445707e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.880000000000000e+02 1.624900285497555e+06 -1.594040126744169e+06 6.764303786868761e+06 -7.016088726029465e+03 1.822169313089096e+03 2.109899815350974e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.890000000000000e+02 1.624759963867022e+06 -1.594003682930788e+06 6.764345983246205e+06 -7.016118749618706e+03 1.822224519352379e+03 2.109751513441805e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.900000000000000e+02 1.624619641637659e+06 -1.593967238013745e+06 6.764388176657121e+06 -7.016148770294383e+03 1.822279725084165e+03 2.109603209437524e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.910000000000000e+02 1.624479318809427e+06 -1.593930791993026e+06 6.764430367101518e+06 -7.016178787482170e+03 1.822334929887645e+03 2.109454905581527e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.920000000000000e+02 1.624338995382388e+06 -1.593894344868643e+06 6.764472554579380e+06 -7.016208801165933e+03 1.822390133599438e+03 2.109306602077173e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.930000000000000e+02 1.624198671356506e+06 -1.593857896640585e+06 6.764514739090720e+06 -7.016238811932248e+03 1.822445337046517e+03 2.109158296244828e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.940000000000000e+02 1.624058346732050e+06 -1.593821447308919e+06 6.764556920635453e+06 -7.016268819731725e+03 1.822500539868302e+03 2.109009988577568e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.950000000000000e+02 1.623918021508987e+06 -1.593784996873639e+06 6.764599099213596e+06 -7.016298824009691e+03 1.822555741863957e+03 2.108861681074900e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.960000000000000e+02 1.623777695687267e+06 -1.593748545334719e+06 6.764641274825161e+06 -7.016328824523928e+03 1.822610942614284e+03 2.108713374915518e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.970000000000000e+02 1.623637369267171e+06 -1.593712092692238e+06 6.764683447470069e+06 -7.016358822119155e+03 1.822666142848938e+03 2.108565066663973e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.980000000000000e+02 1.623497042248654e+06 -1.593675638946177e+06 6.764725617148330e+06 -7.016388816743345e+03 1.822721342640788e+03 2.108416756423160e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.990000000000000e+02 1.623356714631788e+06 -1.593639184096559e+06 6.764767783859926e+06 -7.016418809016091e+03 1.822776542417386e+03 2.108268441771300e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.000000000000000e+03 1.623216386416527e+06 -1.593602728143361e+06 6.764809947604868e+06 -7.016448797383083e+03 1.822831741252561e+03 2.108120128647933e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.001000000000000e+03 1.623076057603145e+06 -1.593566271086657e+06 6.764852108383080e+06 -7.016478782368699e+03 1.822886939005721e+03 2.107971815466561e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.002000000000000e+03 1.622935728191599e+06 -1.593529812926428e+06 6.764894266194571e+06 -7.016508763863182e+03 1.822942135585771e+03 2.107823502670627e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.003000000000000e+03 1.622795398181856e+06 -1.593493353662669e+06 6.764936421039355e+06 -7.016538741847819e+03 1.822997331304711e+03 2.107675190034319e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.004000000000000e+03 1.622655067574186e+06 -1.593456893295446e+06 6.764978572917351e+06 -7.016568717388443e+03 1.823052527288283e+03 2.107526873031192e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.005000000000000e+03 1.622514736368545e+06 -1.593420431824741e+06 6.765020721828572e+06 -7.016598689496980e+03 1.823107722046700e+03 2.107378556268246e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.006000000000000e+03 1.622374404565005e+06 -1.593383969250577e+06 6.765062867772998e+06 -7.016628658356562e+03 1.823162916178262e+03 2.107230238594831e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.007000000000000e+03 1.622234072163523e+06 -1.593347505572934e+06 6.765105010750645e+06 -7.016658623910751e+03 1.823218109727083e+03 2.107081920155128e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.008000000000000e+03 1.622093739164368e+06 -1.593311040791882e+06 6.765147150761433e+06 -7.016688586406246e+03 1.823273302410513e+03 2.106933600401655e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.009000000000000e+03 1.621953405567503e+06 -1.593274574907408e+06 6.765189287805367e+06 -7.016718545277819e+03 1.823328494069654e+03 2.106785281332118e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.010000000000000e+03 1.621813071372894e+06 -1.593238107919501e+06 6.765231421882470e+06 -7.016748501826149e+03 1.823383686049324e+03 2.106636957446827e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.011000000000000e+03 1.621672736580804e+06 -1.593201639828228e+06 6.765273552992651e+06 -7.016778454515642e+03 1.823438876606415e+03 2.106488635382040e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.012000000000000e+03 1.621532401191201e+06 -1.593165170633579e+06 6.765315681135933e+06 -7.016808403768064e+03 1.823494066293359e+03 2.106340313247377e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.013000000000000e+03 1.621392065204145e+06 -1.593128700335563e+06 6.765357806312290e+06 -7.016838350116715e+03 1.823549255373507e+03 2.106191989052956e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.014000000000000e+03 1.621251728619599e+06 -1.593092228934168e+06 6.765399928521737e+06 -7.016868292848938e+03 1.823604443746461e+03 2.106043665226194e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.015000000000000e+03 1.621111391437832e+06 -1.593055756429465e+06 6.765442047764196e+06 -7.016898233304550e+03 1.823659631956890e+03 2.105895336874717e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.016000000000000e+03 1.620971053658809e+06 -1.593019282821441e+06 6.765484164039675e+06 -7.016928169075096e+03 1.823714818303744e+03 2.105747013459191e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.017000000000000e+03 1.620830715282590e+06 -1.592982808110109e+06 6.765526277348162e+06 -7.016958103084213e+03 1.823770005017774e+03 2.105598683341777e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.018000000000000e+03 1.620690376309143e+06 -1.592946332295458e+06 6.765568387689664e+06 -7.016988033255604e+03 1.823825190797722e+03 2.105450354526631e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.019000000000000e+03 1.620550036738731e+06 -1.592909855377553e+06 6.765610495064100e+06 -7.017017960451036e+03 1.823880375934521e+03 2.105302023921186e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.020000000000000e+03 1.620409696571321e+06 -1.592873377356384e+06 6.765652599471488e+06 -7.017047884211523e+03 1.823935560194476e+03 2.105153693245404e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.021000000000000e+03 1.620269355806869e+06 -1.592836898231935e+06 6.765694700911838e+06 -7.017077805010920e+03 1.823990744020575e+03 2.105005360537325e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.022000000000000e+03 1.620129014445651e+06 -1.592800418004279e+06 6.765736799385066e+06 -7.017107722019749e+03 1.824045926472712e+03 2.104857029383653e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.023000000000000e+03 1.619988672487626e+06 -1.592763936673400e+06 6.765778894891190e+06 -7.017137635576218e+03 1.824101108186006e+03 2.104708698089943e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.024000000000000e+03 1.619848329932856e+06 -1.592727454239311e+06 6.765820987430189e+06 -7.017167546990316e+03 1.824156290012887e+03 2.104560361574120e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.025000000000000e+03 1.619707986781307e+06 -1.592690970702000e+06 6.765863077002075e+06 -7.017197454572394e+03 1.824211470761726e+03 2.104412026475933e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.026000000000000e+03 1.619567643033246e+06 -1.592654486061536e+06 6.765905163606769e+06 -7.017227358994493e+03 1.824266650654414e+03 2.104263690387109e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.027000000000000e+03 1.619427298688640e+06 -1.592618000317911e+06 6.765947247244285e+06 -7.017257260195880e+03 1.824321829960239e+03 2.104115353258216e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.028000000000000e+03 1.619286953747442e+06 -1.592581513471103e+06 6.765989327914634e+06 -7.017287158394405e+03 1.824377008788511e+03 2.103967014273751e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.029000000000000e+03 1.619146608209927e+06 -1.592545025521184e+06 6.766031405617734e+06 -7.017317052329868e+03 1.824432185924917e+03 2.103818678688534e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.030000000000000e+03 1.619006262076057e+06 -1.592508536468143e+06 6.766073480353602e+06 -7.017346944133229e+03 1.824487363311310e+03 2.103670337719740e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.031000000000000e+03 1.618865915345897e+06 -1.592472046311995e+06 6.766115552122216e+06 -7.017376832477013e+03 1.824542539598855e+03 2.103521996967126e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.032000000000000e+03 1.618725568019408e+06 -1.592435555052725e+06 6.766157620923587e+06 -7.017406717498571e+03 1.824597715395710e+03 2.103373655418637e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.033000000000000e+03 1.618585220096858e+06 -1.592399062690401e+06 6.766199686757640e+06 -7.017436599074697e+03 1.824652890262745e+03 2.103225313884172e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.034000000000000e+03 1.618444871578208e+06 -1.592362569225009e+06 6.766241749624384e+06 -7.017466477752248e+03 1.824708064419452e+03 2.103076970366646e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.035000000000000e+03 1.618304522463427e+06 -1.592326074656541e+06 6.766283809523831e+06 -7.017496353901101e+03 1.824763238918998e+03 2.102928622679013e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.036000000000000e+03 1.618164172752776e+06 -1.592289578985059e+06 6.766325866455904e+06 -7.017526226121165e+03 1.824818411695042e+03 2.102780277324791e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.037000000000000e+03 1.618023822446222e+06 -1.592253082210554e+06 6.766367920420613e+06 -7.017556094793580e+03 1.824873583724712e+03 2.102631932150856e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.038000000000000e+03 1.617883471543829e+06 -1.592216584333041e+06 6.766409971417940e+06 -7.017585961107317e+03 1.824928755495234e+03 2.102483582804387e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.039000000000000e+03 1.617743120045557e+06 -1.592180085352506e+06 6.766452019447898e+06 -7.017615823058738e+03 1.824983926004808e+03 2.102335236787993e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.040000000000000e+03 1.617602767951675e+06 -1.592143585269014e+06 6.766494064510406e+06 -7.017645682366824e+03 1.825039095883044e+03 2.102186887877237e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.041000000000000e+03 1.617462415262148e+06 -1.592107084082558e+06 6.766536106605479e+06 -7.017675538398191e+03 1.825094265301140e+03 2.102038537993012e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.042000000000000e+03 1.617322061977036e+06 -1.592070581793146e+06 6.766578145733096e+06 -7.017705391296166e+03 1.825149433823667e+03 2.101890187067198e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.043000000000000e+03 1.617181708096307e+06 -1.592034078400771e+06 6.766620181893272e+06 -7.017735240890240e+03 1.825204601799157e+03 2.101741835337466e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.044000000000000e+03 1.617041353620229e+06 -1.591997573905501e+06 6.766662215085924e+06 -7.017765087051684e+03 1.825259768763554e+03 2.101593483655643e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.045000000000000e+03 1.616900998548759e+06 -1.591961068307318e+06 6.766704245311064e+06 -7.017794930524356e+03 1.825314935487655e+03 2.101445128866170e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.046000000000000e+03 1.616760642881864e+06 -1.591924561606213e+06 6.766746272568707e+06 -7.017824770127005e+03 1.825370101208870e+03 2.101296775553630e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.047000000000000e+03 1.616620286619805e+06 -1.591888053802247e+06 6.766788296858775e+06 -7.017854606378462e+03 1.825425265544796e+03 2.101148422367992e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.048000000000000e+03 1.616479929762559e+06 -1.591851544895423e+06 6.766830318181277e+06 -7.017884440433533e+03 1.825480430530790e+03 2.101000063633342e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.049000000000000e+03 1.616339572310179e+06 -1.591815034885742e+06 6.766872336536196e+06 -7.017914270510634e+03 1.825535593817983e+03 2.100851707374358e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.050000000000000e+03 1.616199214262633e+06 -1.591778523773198e+06 6.766914351923540e+06 -7.017944097488470e+03 1.825590756875371e+03 2.100703349345842e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.051000000000000e+03 1.616058855620183e+06 -1.591742011557852e+06 6.766956364343238e+06 -7.017973921906955e+03 1.825645919678777e+03 2.100554987795921e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.052000000000000e+03 1.615918496382796e+06 -1.591705498239696e+06 6.766998373795294e+06 -7.018003742545208e+03 1.825701081122195e+03 2.100406627759186e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.053000000000000e+03 1.615778136550437e+06 -1.591668983818718e+06 6.767040380279725e+06 -7.018033559923674e+03 1.825756241926323e+03 2.100258266859006e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.054000000000000e+03 1.615637776123371e+06 -1.591632468294986e+06 6.767082383796451e+06 -7.018063373527461e+03 1.825811401734845e+03 2.100109907117311e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.055000000000000e+03 1.615497415101556e+06 -1.591595951668481e+06 6.767124384345484e+06 -7.018093185356752e+03 1.825866561678813e+03 2.099961540913631e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.056000000000000e+03 1.615357053485067e+06 -1.591559433939229e+06 6.767166381926802e+06 -7.018122993098833e+03 1.825921720341404e+03 2.099813177160039e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.057000000000000e+03 1.615216691273860e+06 -1.591522915107208e+06 6.767208376540422e+06 -7.018152797572321e+03 1.825976878475790e+03 2.099664812469105e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.058000000000000e+03 1.615076328468202e+06 -1.591486395172488e+06 6.767250368186262e+06 -7.018182598298829e+03 1.826032035150007e+03 2.099516449276305e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.059000000000000e+03 1.614935965068059e+06 -1.591449874135057e+06 6.767292356864337e+06 -7.018212396407798e+03 1.826087191703157e+03 2.099368082629067e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.060000000000000e+03 1.614795601073393e+06 -1.591413351994904e+06 6.767334342574657e+06 -7.018242191190207e+03 1.826142347650140e+03 2.099219715307210e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.061000000000000e+03 1.614655236484467e+06 -1.591376828752090e+06 6.767376325317143e+06 -7.018271983405442e+03 1.826197503237589e+03 2.099071344585344e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.062000000000000e+03 1.614514871301255e+06 -1.591340304406614e+06 6.767418305091805e+06 -7.018301771211836e+03 1.826252657202800e+03 2.098922977688678e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.063000000000000e+03 1.614374505523812e+06 -1.591303778958483e+06 6.767460281898631e+06 -7.018331556436447e+03 1.826307810768232e+03 2.098774607477298e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.064000000000000e+03 1.614234139152101e+06 -1.591267252407682e+06 6.767502255737625e+06 -7.018361338384740e+03 1.826362963955252e+03 2.098626236215160e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.065000000000000e+03 1.614093772186398e+06 -1.591230724754286e+06 6.767544226608710e+06 -7.018391117081584e+03 1.826418116180687e+03 2.098477864360701e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.066000000000000e+03 1.613953404626657e+06 -1.591194195998278e+06 6.767586194511905e+06 -7.018420892856917e+03 1.826473268056934e+03 2.098329490261276e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.067000000000000e+03 1.613813036472944e+06 -1.591157666139670e+06 6.767628159447185e+06 -7.018450665166859e+03 1.826528418852462e+03 2.098181116383624e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.068000000000000e+03 1.613672667725225e+06 -1.591121135178455e+06 6.767670121414564e+06 -7.018480434192956e+03 1.826583569165301e+03 2.098032741576528e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.069000000000000e+03 1.613532298383765e+06 -1.591084603114695e+06 6.767712080413960e+06 -7.018510199237090e+03 1.826638717752787e+03 2.097884369288648e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.070000000000000e+03 1.613391928448528e+06 -1.591048069948383e+06 6.767754036445390e+06 -7.018539962714733e+03 1.826693867197864e+03 2.097735989178710e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.071000000000000e+03 1.613251557919477e+06 -1.591011535679503e+06 6.767795989508861e+06 -7.018569722020978e+03 1.826749015408444e+03 2.097587611756344e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.072000000000000e+03 1.613111186796878e+06 -1.590975000308122e+06 6.767837939604299e+06 -7.018599477939606e+03 1.826804162429009e+03 2.097439234401773e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.073000000000000e+03 1.612970815080698e+06 -1.590938463834232e+06 6.767879886731712e+06 -7.018629230911096e+03 1.826859308965976e+03 2.097290855010596e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.074000000000000e+03 1.612830442771001e+06 -1.590901926257845e+06 6.767921830891085e+06 -7.018658980628641e+03 1.826914454928923e+03 2.097142474676210e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.075000000000000e+03 1.612690069867742e+06 -1.590865387578945e+06 6.767963772082427e+06 -7.018688727380149e+03 1.826969600423093e+03 2.096994092353324e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.076000000000000e+03 1.612549696371198e+06 -1.590828847797604e+06 6.768005710305660e+06 -7.018718470129846e+03 1.827024744253211e+03 2.096845712559866e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.077000000000000e+03 1.612409322281331e+06 -1.590792306913812e+06 6.768047645560798e+06 -7.018748210762680e+03 1.827079888649658e+03 2.096697327022427e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.078000000000000e+03 1.612268947598093e+06 -1.590755764927546e+06 6.768089577847849e+06 -7.018777947801644e+03 1.827135031933264e+03 2.096548942160349e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.079000000000000e+03 1.612128572321766e+06 -1.590719221838884e+06 6.768131507166737e+06 -7.018807681133955e+03 1.827190174100823e+03 2.096400558348337e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.080000000000000e+03 1.611988196452305e+06 -1.590682677647808e+06 6.768173433517476e+06 -7.018837411805960e+03 1.827245315976354e+03 2.096252171376829e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.081000000000000e+03 1.611847819989779e+06 -1.590646132354337e+06 6.768215356900043e+06 -7.018867138718696e+03 1.827300456558019e+03 2.096103785793919e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.082000000000000e+03 1.611707442934143e+06 -1.590609585958453e+06 6.768257277314453e+06 -7.018896862609647e+03 1.827355596923825e+03 2.095955398170999e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.083000000000000e+03 1.611567065285670e+06 -1.590573038460224e+06 6.768299194760626e+06 -7.018926583357810e+03 1.827410736335102e+03 2.095807009591817e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.084000000000000e+03 1.611426687044326e+06 -1.590536489859644e+06 6.768341109238575e+06 -7.018956300624849e+03 1.827465874756040e+03 2.095658621204087e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.085000000000000e+03 1.611286308210069e+06 -1.590499940156696e+06 6.768383020748310e+06 -7.018986014854319e+03 1.827521013008600e+03 2.095510230783973e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.086000000000000e+03 1.611145928783165e+06 -1.590463389351445e+06 6.768424929289753e+06 -7.019015725887007e+03 1.827576150428192e+03 2.095361839472638e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.087000000000000e+03 1.611005548763583e+06 -1.590426837443882e+06 6.768466834862917e+06 -7.019045433700925e+03 1.827631287081631e+03 2.095213447280504e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.088000000000000e+03 1.610865168151386e+06 -1.590390284434023e+06 6.768508737467784e+06 -7.019075138904874e+03 1.827686423288285e+03 2.095065051905096e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.089000000000000e+03 1.610724786946536e+06 -1.590353730321854e+06 6.768550637104364e+06 -7.019104839681956e+03 1.827741558314258e+03 2.094916660014356e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.090000000000000e+03 1.610584405149296e+06 -1.590317175107439e+06 6.768592533772578e+06 -7.019134538397900e+03 1.827796693394433e+03 2.094768262666463e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.091000000000000e+03 1.610444022759633e+06 -1.590280618790768e+06 6.768634427472441e+06 -7.019164232765183e+03 1.827851826466032e+03 2.094619869315008e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.092000000000000e+03 1.610303639777615e+06 -1.590244061371860e+06 6.768676318203934e+06 -7.019193924804393e+03 1.827906959887670e+03 2.094471471110797e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.093000000000000e+03 1.610163256203198e+06 -1.590207502850695e+06 6.768718205967067e+06 -7.019223613200516e+03 1.827962092388897e+03 2.094323073567484e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.094000000000000e+03 1.610022872036655e+06 -1.590170943227343e+06 6.768760090761762e+06 -7.019253297995840e+03 1.828017223538176e+03 2.094174676946925e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.095000000000000e+03 1.609882487277946e+06 -1.590134382501795e+06 6.768801972588030e+06 -7.019282980324618e+03 1.828072354571057e+03 2.094026276362409e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.096000000000000e+03 1.609742101927035e+06 -1.590097820674035e+06 6.768843851445884e+06 -7.019312659109589e+03 1.828127485057102e+03 2.093877875764810e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.097000000000000e+03 1.609601715984190e+06 -1.590061257744133e+06 6.768885727335245e+06 -7.019342334656659e+03 1.828182614581282e+03 2.093729474531353e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.098000000000000e+03 1.609461329449371e+06 -1.590024693712071e+06 6.768927600256128e+06 -7.019372007098679e+03 1.828237743415046e+03 2.093581071971772e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.099000000000000e+03 1.609320942322646e+06 -1.589988128577871e+06 6.768969470208508e+06 -7.019401676490698e+03 1.828292871736316e+03 2.093432667739089e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.100000000000000e+03 1.609180554603975e+06 -1.589951562341515e+06 6.769011337192403e+06 -7.019431342400428e+03 1.828347999281730e+03 2.093284263503548e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.101000000000000e+03 1.609040166293627e+06 -1.589914995003071e+06 6.769053201207732e+06 -7.019461004810508e+03 1.828403125640126e+03 2.093135859704846e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.102000000000000e+03 1.608899777391565e+06 -1.589878426562530e+06 6.769095062254508e+06 -7.019490664346883e+03 1.828458251540799e+03 2.092987453600672e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.103000000000000e+03 1.608759387897755e+06 -1.589841857019881e+06 6.769136920332741e+06 -7.019520320318652e+03 1.828513376662726e+03 2.092839047768210e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.104000000000000e+03 1.608618997812463e+06 -1.589805286375187e+06 6.769178775442351e+06 -7.019549973322696e+03 1.828568501316898e+03 2.092690639949529e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.105000000000000e+03 1.608478607135647e+06 -1.589768714628435e+06 6.769220627583357e+06 -7.019579623658075e+03 1.828623625656664e+03 2.092542229015090e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.106000000000000e+03 1.608338215867375e+06 -1.589732141779640e+06 6.769262476755732e+06 -7.019609269764643e+03 1.828678748133813e+03 2.092393821551824e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.107000000000000e+03 1.608197824007614e+06 -1.589695567828795e+06 6.769304322959495e+06 -7.019638913873774e+03 1.828733871484947e+03 2.092245407652656e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.108000000000000e+03 1.608057431556625e+06 -1.589658992775962e+06 6.769346166194562e+06 -7.019668553731184e+03 1.828788993043233e+03 2.092096997235869e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.109000000000000e+03 1.607917038514369e+06 -1.589622416621125e+06 6.769388006460948e+06 -7.019698190706451e+03 1.828844113789027e+03 2.091948584870678e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.110000000000000e+03 1.607776644880817e+06 -1.589585839364281e+06 6.769429843758665e+06 -7.019727824337008e+03 1.828899234276128e+03 2.091800171568272e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.111000000000000e+03 1.607636250656236e+06 -1.589549261005494e+06 6.769471678087633e+06 -7.019757455132997e+03 1.828954354142829e+03 2.091651755981381e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.112000000000000e+03 1.607495855840582e+06 -1.589512681544747e+06 6.769513509447861e+06 -7.019787081771458e+03 1.829009472529642e+03 2.091503343276438e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.113000000000000e+03 1.607355460433923e+06 -1.589476100982059e+06 6.769555337839339e+06 -7.019816705885096e+03 1.829064590543049e+03 2.091354927034799e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.114000000000000e+03 1.607215064436222e+06 -1.589439519317417e+06 6.769597163262071e+06 -7.019846326372368e+03 1.829119707754762e+03 2.091206511291122e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.115000000000000e+03 1.607074667847753e+06 -1.589402936550892e+06 6.769638985715983e+06 -7.019875944172267e+03 1.829174824917371e+03 2.091058092244957e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.116000000000000e+03 1.606934270668467e+06 -1.589366352682462e+06 6.769680805201086e+06 -7.019905558585826e+03 1.829229940802016e+03 2.090909673347617e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.117000000000000e+03 1.606793872898435e+06 -1.589329767712150e+06 6.769722621717359e+06 -7.019935170236070e+03 1.829285056614931e+03 2.090761251419033e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.118000000000000e+03 1.606653474537621e+06 -1.589293181639941e+06 6.769764435264817e+06 -7.019964777286818e+03 1.829340170548843e+03 2.090612834205228e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.119000000000000e+03 1.606513075586290e+06 -1.589256594465901e+06 6.769806245843383e+06 -7.019994382295346e+03 1.829395284679437e+03 2.090464411328940e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.120000000000000e+03 1.606372676044406e+06 -1.589220006190020e+06 6.769848053453064e+06 -7.020023984036817e+03 1.829450398019819e+03 2.090315987753604e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.121000000000000e+03 1.606232275911932e+06 -1.589183416812283e+06 6.769889858093873e+06 -7.020053581934219e+03 1.829505510411793e+03 2.090167565532554e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.122000000000000e+03 1.606091875189132e+06 -1.589146826332757e+06 6.769931659765734e+06 -7.020083176976774e+03 1.829560622074995e+03 2.090019141193962e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.123000000000000e+03 1.605951473875976e+06 -1.589110234751435e+06 6.769973458468656e+06 -7.020112768806897e+03 1.829615733076786e+03 2.089870715856111e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.124000000000000e+03 1.605811071972527e+06 -1.589073642068330e+06 6.770015254202624e+06 -7.020142357605404e+03 1.829670843675685e+03 2.089722288680767e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.125000000000000e+03 1.605670669478737e+06 -1.589037048283421e+06 6.770057046967649e+06 -7.020171943447155e+03 1.829725953854700e+03 2.089573859436191e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.126000000000000e+03 1.605530266394890e+06 -1.589000453396787e+06 6.770098836763652e+06 -7.020201525075370e+03 1.829781062255562e+03 2.089425433540604e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.127000000000000e+03 1.605389862720940e+06 -1.588963857408409e+06 6.770140623590641e+06 -7.020231103962310e+03 1.829836170389714e+03 2.089277004721256e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.128000000000000e+03 1.605249458456849e+06 -1.588927260318276e+06 6.770182407448635e+06 -7.020260679621149e+03 1.829891277909799e+03 2.089128574910291e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.129000000000000e+03 1.605109053602886e+06 -1.588890662126456e+06 6.770224188337551e+06 -7.020290252087866e+03 1.829946384622152e+03 2.088980144169291e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.130000000000000e+03 1.604968648159019e+06 -1.588854062832939e+06 6.770265966257401e+06 -7.020319820727988e+03 1.830001490375920e+03 2.088831714736044e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.131000000000000e+03 1.604828242125300e+06 -1.588817462437729e+06 6.770307741208170e+06 -7.020349386779153e+03 1.830056595483875e+03 2.088683282228300e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.132000000000000e+03 1.604687835501704e+06 -1.588780860940827e+06 6.770349513189866e+06 -7.020378949530408e+03 1.830111700237552e+03 2.088534848724102e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.133000000000000e+03 1.604547428288497e+06 -1.588744258342294e+06 6.770391282202413e+06 -7.020408509615997e+03 1.830166804661602e+03 2.088386412103528e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.134000000000000e+03 1.604407020485635e+06 -1.588707654642117e+06 6.770433048245820e+06 -7.020438065461199e+03 1.830221907222699e+03 2.088237979002500e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.135000000000000e+03 1.604266612093091e+06 -1.588671049840290e+06 6.770474811320104e+06 -7.020467618539335e+03 1.830277009804162e+03 2.088089542794010e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.136000000000000e+03 1.604126203111122e+06 -1.588634443936872e+06 6.770516571425181e+06 -7.020497169190863e+03 1.830332112472827e+03 2.087941102289316e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.137000000000000e+03 1.603985793539703e+06 -1.588597836931857e+06 6.770558328561065e+06 -7.020526715606604e+03 1.830387213223073e+03 2.087792665341561e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.138000000000000e+03 1.603845383378883e+06 -1.588561228825252e+06 6.770600082727738e+06 -7.020556258792836e+03 1.830442313194678e+03 2.087644227560464e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.139000000000000e+03 1.603704972628637e+06 -1.588524619617052e+06 6.770641833925213e+06 -7.020585799000128e+03 1.830497412938126e+03 2.087495787603670e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.140000000000000e+03 1.603564561289233e+06 -1.588488009307325e+06 6.770683582153410e+06 -7.020615335707942e+03 1.830552511621257e+03 2.087347347969167e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.141000000000000e+03 1.603424149360624e+06 -1.588451397896050e+06 6.770725327412341e+06 -7.020644869691248e+03 1.830607610236014e+03 2.087198905167950e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.142000000000000e+03 1.603283736842883e+06 -1.588414785383248e+06 6.770767069701990e+06 -7.020674400346430e+03 1.830662707522457e+03 2.087050462372242e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.143000000000000e+03 1.603143323735968e+06 -1.588378171768907e+06 6.770808809022363e+06 -7.020703927581762e+03 1.830717804397575e+03 2.086902019029978e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.144000000000000e+03 1.603002910040151e+06 -1.588341557053091e+06 6.770850545373388e+06 -7.020733451676544e+03 1.830772900475527e+03 2.086753574577160e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.145000000000000e+03 1.602862495755391e+06 -1.588304941235791e+06 6.770892278755077e+06 -7.020762973417152e+03 1.830827996544290e+03 2.086605125675972e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.146000000000000e+03 1.602722080881652e+06 -1.588268324316991e+06 6.770934009167435e+06 -7.020792490180187e+03 1.830883090538008e+03 2.086456682936042e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.147000000000000e+03 1.602581665419208e+06 -1.588231706296765e+06 6.770975736610391e+06 -7.020822005427898e+03 1.830938185234540e+03 2.086308232306679e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.148000000000000e+03 1.602441249368012e+06 -1.588195087175092e+06 6.771017461083953e+06 -7.020851516096775e+03 1.830993277956531e+03 2.086159786426056e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.149000000000000e+03 1.602300832728132e+06 -1.588158466951991e+06 6.771059182588101e+06 -7.020881023834579e+03 1.831048370093491e+03 2.086011338543647e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.150000000000000e+03 1.602160415499534e+06 -1.588121845627452e+06 6.771100901122854e+06 -7.020910528563437e+03 1.831103462007659e+03 2.085862888578697e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.151000000000000e+03 1.602019997682482e+06 -1.588085223201539e+06 6.771142616688126e+06 -7.020940030073984e+03 1.831158553108129e+03 2.085714437775937e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.152000000000000e+03 1.601879579276940e+06 -1.588048599674239e+06 6.771184329283933e+06 -7.020969528443622e+03 1.831213643327997e+03 2.085565985941614e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.153000000000000e+03 1.601739160282874e+06 -1.588011975045545e+06 6.771226038910287e+06 -7.020999023449892e+03 1.831268733132604e+03 2.085417533377602e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.154000000000000e+03 1.601598740700549e+06 -1.587975349315519e+06 6.771267745567107e+06 -7.021028515337456e+03 1.831323822114945e+03 2.085269079653986e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.155000000000000e+03 1.601458320529923e+06 -1.587938722484147e+06 6.771309449254405e+06 -7.021058004235749e+03 1.831378910519801e+03 2.085120624113371e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.156000000000000e+03 1.601317899771070e+06 -1.587902094551451e+06 6.771351149972166e+06 -7.021087489656140e+03 1.831433998051068e+03 2.084972168650537e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.157000000000000e+03 1.601177478423943e+06 -1.587865465517411e+06 6.771392847720399e+06 -7.021116971299170e+03 1.831489084308651e+03 2.084823714631445e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.158000000000000e+03 1.601037056488821e+06 -1.587828835382102e+06 6.771434542499028e+06 -7.021146450232913e+03 1.831544170531903e+03 2.084675257360474e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.159000000000000e+03 1.600896633965654e+06 -1.587792204145501e+06 6.771476234308063e+06 -7.021175926565822e+03 1.831599256223249e+03 2.084526796942855e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.160000000000000e+03 1.600756210854420e+06 -1.587755571807611e+06 6.771517923147516e+06 -7.021205399020619e+03 1.831654341030703e+03 2.084378337938632e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.161000000000000e+03 1.600615787155371e+06 -1.587718938368483e+06 6.771559609017310e+06 -7.021234868342532e+03 1.831709425058354e+03 2.084229877781939e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.162000000000000e+03 1.600475362868478e+06 -1.587682303828115e+06 6.771601291917453e+06 -7.021264334405065e+03 1.831764508228533e+03 2.084081416964489e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.163000000000000e+03 1.600334937993808e+06 -1.587645668186521e+06 6.771642971847931e+06 -7.021293796709694e+03 1.831819590192355e+03 2.083932957464508e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.164000000000000e+03 1.600194512531317e+06 -1.587609031443681e+06 6.771684648808758e+06 -7.021323256331863e+03 1.831874672039252e+03 2.083784494699826e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.165000000000000e+03 1.600054086481276e+06 -1.587572393599670e+06 6.771726322799850e+06 -7.021352712746334e+03 1.831929753123333e+03 2.083636031014672e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.166000000000000e+03 1.599913659843653e+06 -1.587535754654478e+06 6.771767993821219e+06 -7.021382166170696e+03 1.831984833798896e+03 2.083487565356457e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.167000000000000e+03 1.599773232618505e+06 -1.587499114608112e+06 6.771809661872851e+06 -7.021411616650029e+03 1.832039913928846e+03 2.083339097703757e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.168000000000000e+03 1.599632804805797e+06 -1.587462473460562e+06 6.771851326954756e+06 -7.021441062548968e+03 1.832094992221523e+03 2.083190634685750e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.169000000000000e+03 1.599492376405797e+06 -1.587425831211896e+06 6.771892989066856e+06 -7.021470506096269e+03 1.832150070406426e+03 2.083042167296955e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.170000000000000e+03 1.599351947418466e+06 -1.587389187862100e+06 6.771934648209160e+06 -7.021499947149330e+03 1.832205148580195e+03 2.082893695918917e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.171000000000000e+03 1.599211517843772e+06 -1.587352543411166e+06 6.771976304381685e+06 -7.021529383648290e+03 1.832260225131276e+03 2.082745228888771e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.172000000000000e+03 1.599071087681978e+06 -1.587315897859156e+06 6.772017957584349e+06 -7.021558817495090e+03 1.832315301093951e+03 2.082596758933098e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.173000000000000e+03 1.598930656933050e+06 -1.587279251206065e+06 6.772059607817166e+06 -7.021588248094925e+03 1.832370376538397e+03 2.082448287958266e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.174000000000000e+03 1.598790225597051e+06 -1.587242603451900e+06 6.772101255080114e+06 -7.021617675478672e+03 1.832425450993395e+03 2.082299816302873e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.175000000000000e+03 1.598649793673947e+06 -1.587205954596657e+06 6.772142899373212e+06 -7.021647099915385e+03 1.832480525536957e+03 2.082151342065516e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.176000000000000e+03 1.598509361163995e+06 -1.587169304640389e+06 6.772184540696371e+06 -7.021676520798325e+03 1.832535598724345e+03 2.082002868610828e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.177000000000000e+03 1.598368928067169e+06 -1.587132653583096e+06 6.772226179049614e+06 -7.021705938552632e+03 1.832590671075942e+03 2.081854394041711e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.178000000000000e+03 1.598228494383430e+06 -1.587096001424765e+06 6.772267814432947e+06 -7.021735353544937e+03 1.832645743422805e+03 2.081705916363693e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.179000000000000e+03 1.598088060113047e+06 -1.587059348165465e+06 6.772309446846291e+06 -7.021764764552153e+03 1.832700814449645e+03 2.081557440865787e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.180000000000000e+03 1.597947625255978e+06 -1.587022693805174e+06 6.772351076289659e+06 -7.021794172292010e+03 1.832755884600600e+03 2.081408964751353e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.181000000000000e+03 1.597807189812285e+06 -1.586986038343910e+06 6.772392702763037e+06 -7.021823577422839e+03 1.832810954281903e+03 2.081260485455512e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.182000000000000e+03 1.597666753781936e+06 -1.586949381781665e+06 6.772434326266432e+06 -7.021852978695269e+03 1.832866023189181e+03 2.081112007408834e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.183000000000000e+03 1.597526317165202e+06 -1.586912724118506e+06 6.772475946799766e+06 -7.021882377044117e+03 1.832921091483714e+03 2.080963527358333e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.184000000000000e+03 1.597385879962036e+06 -1.586876065354413e+06 6.772517564363054e+06 -7.021911772265385e+03 1.832976158813001e+03 2.080815046311059e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.185000000000000e+03 1.597245442172414e+06 -1.586839405489388e+06 6.772559178956304e+06 -7.021941164393286e+03 1.833031226002762e+03 2.080666563379779e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.186000000000000e+03 1.597105003796593e+06 -1.586802744523486e+06 6.772600790579438e+06 -7.021970552276777e+03 1.833086291438034e+03 2.080518083898413e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.187000000000000e+03 1.596964564834537e+06 -1.586766082456696e+06 6.772642399232471e+06 -7.021999937763298e+03 1.833141356688378e+03 2.080369600264082e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.188000000000000e+03 1.596824125286318e+06 -1.586729419289039e+06 6.772684004915385e+06 -7.022029320068879e+03 1.833196421344609e+03 2.080221115462302e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.189000000000000e+03 1.596683685151893e+06 -1.586692755020500e+06 6.772725607628185e+06 -7.022058699547388e+03 1.833251485897991e+03 2.080072627857623e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.190000000000000e+03 1.596543244431528e+06 -1.586656089651143e+06 6.772767207370804e+06 -7.022088075608177e+03 1.833306549394874e+03 2.079924140304743e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.191000000000000e+03 1.596402803125192e+06 -1.586619423180960e+06 6.772808804143245e+06 -7.022117448148390e+03 1.833361612022066e+03 2.079775652970354e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.192000000000000e+03 1.596262361232942e+06 -1.586582755609960e+06 6.772850397945494e+06 -7.022146816780561e+03 1.833416672762671e+03 2.079627168094918e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.193000000000000e+03 1.596121918754748e+06 -1.586546086938139e+06 6.772891988777560e+06 -7.022176182858453e+03 1.833471734171053e+03 2.079478678787904e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.194000000000000e+03 1.595981475690871e+06 -1.586509417165554e+06 6.772933576639367e+06 -7.022205546533630e+03 1.833526795283785e+03 2.079330185448490e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.195000000000000e+03 1.595841032041279e+06 -1.586472746292200e+06 6.772975161530926e+06 -7.022234905486825e+03 1.833581853942682e+03 2.079181697804027e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.196000000000000e+03 1.595700587805937e+06 -1.586436074318067e+06 6.773016743452248e+06 -7.022264262689479e+03 1.833636913908322e+03 2.079033202457773e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.197000000000000e+03 1.595560142985105e+06 -1.586399401243216e+06 6.773058322403257e+06 -7.022293615356394e+03 1.833691971658633e+03 2.078884711965027e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.198000000000000e+03 1.595419697578750e+06 -1.586362727067635e+06 6.773099898383963e+06 -7.022322965119032e+03 1.833747028903231e+03 2.078736219302807e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.199000000000000e+03 1.595279251586939e+06 -1.586326051791344e+06 6.773141471394350e+06 -7.022352312211809e+03 1.833802085817015e+03 2.078587723527797e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.200000000000000e+03 1.595138805009632e+06 -1.586289375414329e+06 6.773183041434426e+06 -7.022381655688876e+03 1.833857142066345e+03 2.078439228095630e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.201000000000000e+03 1.594998357847096e+06 -1.586252697936652e+06 6.773224608504117e+06 -7.022410996287175e+03 1.833912197731672e+03 2.078290730482010e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.202000000000000e+03 1.594857910099292e+06 -1.586216019358303e+06 6.773266172603434e+06 -7.022440333448548e+03 1.833967252273519e+03 2.078142233047966e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.203000000000000e+03 1.594717461766188e+06 -1.586179339679274e+06 6.773307733732385e+06 -7.022469667264108e+03 1.834022306385761e+03 2.077993734839722e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.204000000000000e+03 1.594577012848052e+06 -1.586142658899629e+06 6.773349291890897e+06 -7.022498997721850e+03 1.834077359218188e+03 2.077845236695211e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.205000000000000e+03 1.594436563344845e+06 -1.586105977019361e+06 6.773390847078976e+06 -7.022528325356746e+03 1.834132412140991e+03 2.077696735550043e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.206000000000000e+03 1.594296113256628e+06 -1.586069294038475e+06 6.773432399296612e+06 -7.022557649596752e+03 1.834187463854637e+03 2.077548234525521e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.207000000000000e+03 1.594155662583367e+06 -1.586032609956965e+06 6.773473948543812e+06 -7.022586970319259e+03 1.834242514731497e+03 2.077399733679933e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.208000000000000e+03 1.594015211325331e+06 -1.585995924774897e+06 6.773515494820496e+06 -7.022616288063435e+03 1.834297565074654e+03 2.077251230936162e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.209000000000000e+03 1.593874759482482e+06 -1.585959238492260e+06 6.773557038126679e+06 -7.022645602851148e+03 1.834352615026685e+03 2.077102726087364e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.210000000000000e+03 1.593734307054776e+06 -1.585922551109035e+06 6.773598578462374e+06 -7.022674914199814e+03 1.834407664070983e+03 2.076954221223313e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.211000000000000e+03 1.593593854042493e+06 -1.585885862625299e+06 6.773640115827496e+06 -7.022704221681843e+03 1.834462711741115e+03 2.076805718204380e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.212000000000000e+03 1.593453400445587e+06 -1.585849173041034e+06 6.773681650222069e+06 -7.022733526608883e+03 1.834517759230972e+03 2.076657211547133e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.213000000000000e+03 1.593312946264126e+06 -1.585812482356257e+06 6.773723181646062e+06 -7.022762828804318e+03 1.834572806448825e+03 2.076508701924588e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.214000000000000e+03 1.593172491498077e+06 -1.585775790570959e+06 6.773764710099493e+06 -7.022792127412783e+03 1.834627852956842e+03 2.076360192593012e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.215000000000000e+03 1.593032036147696e+06 -1.585739097685197e+06 6.773806235582286e+06 -7.022821422618714e+03 1.834682898278865e+03 2.076211683386505e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.216000000000000e+03 1.592891580212959e+06 -1.585702403698969e+06 6.773847758094448e+06 -7.022850714324660e+03 1.834737942752690e+03 2.076063174312125e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.217000000000000e+03 1.592751123693923e+06 -1.585665708612285e+06 6.773889277635962e+06 -7.022880003063930e+03 1.834792986572771e+03 2.075914663412877e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.218000000000000e+03 1.592610666590546e+06 -1.585629012425129e+06 6.773930794206845e+06 -7.022909288549296e+03 1.834848029850589e+03 2.075766151539549e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.219000000000000e+03 1.592470208903109e+06 -1.585592315137577e+06 6.773972307807012e+06 -7.022938570645473e+03 1.834903072152822e+03 2.075617639549612e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.220000000000000e+03 1.592329750631565e+06 -1.585555616749611e+06 6.774013818436476e+06 -7.022967850225462e+03 1.834958114287945e+03 2.075469123777838e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.221000000000000e+03 1.592189291775883e+06 -1.585518917261222e+06 6.774055326095253e+06 -7.022997125520872e+03 1.835013154965824e+03 2.075320611322261e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.222000000000000e+03 1.592048832336328e+06 -1.585482216672478e+06 6.774096830783262e+06 -7.023026398109425e+03 1.835068195420296e+03 2.075172095772194e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.223000000000000e+03 1.591908372312859e+06 -1.585445514983358e+06 6.774138332500516e+06 -7.023055668063462e+03 1.835123235556737e+03 2.075023576975251e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.224000000000000e+03 1.591767911705544e+06 -1.585408812193884e+06 6.774179831246994e+06 -7.023084933733841e+03 1.835178273857692e+03 2.074875061848096e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.225000000000000e+03 1.591627450514346e+06 -1.585372108304044e+06 6.774221327022712e+06 -7.023114197121520e+03 1.835233312709945e+03 2.074726541485155e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.226000000000000e+03 1.591486988739533e+06 -1.585335403313902e+06 6.774262819827592e+06 -7.023143456649693e+03 1.835288349867827e+03 2.074578023247766e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.227000000000000e+03 1.591346526381068e+06 -1.585298697223451e+06 6.774304309661640e+06 -7.023172712863764e+03 1.835343386373121e+03 2.074429504340559e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.228000000000000e+03 1.591206063438913e+06 -1.585261990032674e+06 6.774345796524876e+06 -7.023201966117756e+03 1.835398422621008e+03 2.074280983212894e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.229000000000000e+03 1.591065599913336e+06 -1.585225281741638e+06 6.774387280417214e+06 -7.023231216460500e+03 1.835453458086925e+03 2.074132460195349e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.230000000000000e+03 1.590925135804303e+06 -1.585188572350337e+06 6.774428761338670e+06 -7.023260463223916e+03 1.835508492861816e+03 2.073983937427249e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.231000000000000e+03 1.590784671111871e+06 -1.585151861858777e+06 6.774470239289227e+06 -7.023289706614914e+03 1.835563526317969e+03 2.073835414810366e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.232000000000000e+03 1.590644205836011e+06 -1.585115150266953e+06 6.774511714268895e+06 -7.023318947210341e+03 1.835618559943065e+03 2.073686889023305e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.233000000000000e+03 1.590503739976985e+06 -1.585078437574927e+06 6.774553186277596e+06 -7.023348184378125e+03 1.835673592416769e+03 2.073538363413928e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.234000000000000e+03 1.590363273534758e+06 -1.585041723782690e+06 6.774594655315341e+06 -7.023377418297396e+03 1.835728624163592e+03 2.073389836986101e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.235000000000000e+03 1.590222806509291e+06 -1.585005008890225e+06 6.774636121382144e+06 -7.023406648739563e+03 1.835783654992965e+03 2.073241310680875e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.236000000000000e+03 1.590082338900856e+06 -1.584968292897607e+06 6.774677584477927e+06 -7.023435876210535e+03 1.835838685388485e+03 2.073092782357443e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.237000000000000e+03 1.589941870709410e+06 -1.584931575804818e+06 6.774719044602698e+06 -7.023465100425386e+03 1.835893714954834e+03 2.072944253337235e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.238000000000000e+03 1.589801401935028e+06 -1.584894857611878e+06 6.774760501756445e+06 -7.023494321256679e+03 1.835948743570172e+03 2.072795724159747e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.239000000000000e+03 1.589660932577660e+06 -1.584858138318768e+06 6.774801955939174e+06 -7.023523539038577e+03 1.836003771780100e+03 2.072647193197613e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.240000000000000e+03 1.589520462637583e+06 -1.584821417925561e+06 6.774843407150809e+06 -7.023552754097352e+03 1.836058799853520e+03 2.072498659109805e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.241000000000000e+03 1.589379992114755e+06 -1.584784696432240e+06 6.774884855391365e+06 -7.023581965455734e+03 1.836113826594201e+03 2.072350126280222e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.242000000000000e+03 1.589239521009244e+06 -1.584747973838825e+06 6.774926300660821e+06 -7.023611173624035e+03 1.836168852555364e+03 2.072201592487024e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.243000000000000e+03 1.589099049321008e+06 -1.584711250145298e+06 6.774967742959188e+06 -7.023640377940209e+03 1.836223877477933e+03 2.072053060181510e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.244000000000000e+03 1.588958577050319e+06 -1.584674525351729e+06 6.775009182286391e+06 -7.023669580456262e+03 1.836278902864485e+03 2.071904521106719e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.245000000000000e+03 1.588818104197137e+06 -1.584637799458105e+06 6.775050618642437e+06 -7.023698778912069e+03 1.836333926542890e+03 2.071755984844299e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.246000000000000e+03 1.588677630761431e+06 -1.584601072464420e+06 6.775092052027345e+06 -7.023727973552309e+03 1.836388949530794e+03 2.071607449620192e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.247000000000000e+03 1.588537156743458e+06 -1.584564344370729e+06 6.775133482441030e+06 -7.023757165598458e+03 1.836443971906043e+03 2.071458911287928e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.248000000000000e+03 1.588396682143192e+06 -1.584527615177030e+06 6.775174909883507e+06 -7.023786354347552e+03 1.836498993575762e+03 2.071310372279047e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.249000000000000e+03 1.588256206960693e+06 -1.584490884883336e+06 6.775216334354760e+06 -7.023815539699956e+03 1.836554014209105e+03 2.071161833237825e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.250000000000000e+03 1.588115731195923e+06 -1.584454153489633e+06 6.775257755854797e+06 -7.023844722228767e+03 1.836609035092351e+03 2.071013291040148e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.251000000000000e+03 1.587975254849144e+06 -1.584417420995983e+06 6.775299174383542e+06 -7.023873901877909e+03 1.836664055136527e+03 2.070864746899232e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.252000000000000e+03 1.587834777920331e+06 -1.584380687402383e+06 6.775340589941004e+06 -7.023903077773611e+03 1.836719073801406e+03 2.070716204239322e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.253000000000000e+03 1.587694300409442e+06 -1.584343952708819e+06 6.775382002527202e+06 -7.023932249870888e+03 1.836774091682521e+03 2.070567662649514e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.254000000000000e+03 1.587553822316740e+06 -1.584307216915353e+06 6.775423412142049e+06 -7.023961419331261e+03 1.836829109037720e+03 2.070419118011380e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.255000000000000e+03 1.587413343642195e+06 -1.584270480021979e+06 6.775464818785562e+06 -7.023990585505339e+03 1.836884125821111e+03 2.070270572534740e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.256000000000000e+03 1.587272864385865e+06 -1.584233742028706e+06 6.775506222457726e+06 -7.024019748763919e+03 1.836939142082135e+03 2.070122024935524e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.257000000000000e+03 1.587132384547716e+06 -1.584197002935525e+06 6.775547623158545e+06 -7.024048908527765e+03 1.836994157354106e+03 2.069973477586849e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.258000000000000e+03 1.586991904128019e+06 -1.584160262742505e+06 6.775589020887944e+06 -7.024078065013337e+03 1.837049171987973e+03 2.069824929435449e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.259000000000000e+03 1.586851423126731e+06 -1.584123521449630e+06 6.775630415645942e+06 -7.024107218352747e+03 1.837104185749585e+03 2.069676380261261e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.260000000000000e+03 1.586710941543820e+06 -1.584086779056890e+06 6.775671807432541e+06 -7.024136368171940e+03 1.837159198724650e+03 2.069527831232074e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.261000000000000e+03 1.586570459379549e+06 -1.584050035564352e+06 6.775713196247665e+06 -7.024165514466546e+03 1.837214210676474e+03 2.069379282586134e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.262000000000000e+03 1.586429976633884e+06 -1.584013290972004e+06 6.775754582091331e+06 -7.024194658911431e+03 1.837269223151218e+03 2.069230727272414e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.263000000000000e+03 1.586289493306891e+06 -1.583976545279861e+06 6.775795964963517e+06 -7.024223799366904e+03 1.837324234039522e+03 2.069082174425067e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.264000000000000e+03 1.586149009398527e+06 -1.583939798487907e+06 6.775837344864233e+06 -7.024252936462865e+03 1.837379244494392e+03 2.068933620853073e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.265000000000000e+03 1.586008524909065e+06 -1.583903050596214e+06 6.775878721793407e+06 -7.024282070438226e+03 1.837434253957281e+03 2.068785066285913e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.266000000000000e+03 1.585868039838467e+06 -1.583866301604769e+06 6.775920095751047e+06 -7.024311201160227e+03 1.837489262914300e+03 2.068636510708008e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.267000000000000e+03 1.585727554186793e+06 -1.583829551513583e+06 6.775961466737135e+06 -7.024340328715050e+03 1.837544270812406e+03 2.068487954353657e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.268000000000000e+03 1.585587067954017e+06 -1.583792800322653e+06 6.776002834751683e+06 -7.024369452920851e+03 1.837599278494833e+03 2.068339397034035e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.269000000000000e+03 1.585446581140393e+06 -1.583756048032033e+06 6.776044199794615e+06 -7.024398574337099e+03 1.837654285270733e+03 2.068190837532616e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.270000000000000e+03 1.585306093745894e+06 -1.583719294641720e+06 6.776085561865937e+06 -7.024427691840477e+03 1.837709291028100e+03 2.068042279707720e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.271000000000000e+03 1.585165605770477e+06 -1.583682540151699e+06 6.776126920965669e+06 -7.024456806460281e+03 1.837764296372405e+03 2.067893719549036e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.272000000000000e+03 1.585025117214412e+06 -1.583645784562038e+06 6.776168277093727e+06 -7.024485918086320e+03 1.837819301054722e+03 2.067745157659585e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.273000000000000e+03 1.584884628077664e+06 -1.583609027872727e+06 6.776209630250127e+06 -7.024515025746839e+03 1.837874304496275e+03 2.067596597833181e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.274000000000000e+03 1.584744138360292e+06 -1.583572270083774e+06 6.776250980434848e+06 -7.024544130686781e+03 1.837929307412051e+03 2.067448035234570e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.275000000000000e+03 1.584603648062267e+06 -1.583535511195176e+06 6.776292327647903e+06 -7.024573232094222e+03 1.837984309661858e+03 2.067299472709305e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.276000000000000e+03 1.584463157183848e+06 -1.583498751206992e+06 6.776333671889215e+06 -7.024602330825993e+03 1.838039311748326e+03 2.067150906918768e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.277000000000000e+03 1.584322665725001e+06 -1.583461990119210e+06 6.776375013158794e+06 -7.024631425863405e+03 1.838094312195666e+03 2.067002342662296e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.278000000000000e+03 1.584182173685694e+06 -1.583425227931827e+06 6.776416351456653e+06 -7.024660518136454e+03 1.838149312748526e+03 2.066853775182552e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.279000000000000e+03 1.584041681066189e+06 -1.583388464644904e+06 6.776457686782715e+06 -7.024689606950413e+03 1.838204312412300e+03 2.066705207741723e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.280000000000000e+03 1.583901187866451e+06 -1.583351700258427e+06 6.776499019136989e+06 -7.024718692501402e+03 1.838259311140722e+03 2.066556639728085e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.281000000000000e+03 1.583760694086542e+06 -1.583314934772413e+06 6.776540348519459e+06 -7.024747775687015e+03 1.838314310018795e+03 2.066408067114636e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.282000000000000e+03 1.583620199726427e+06 -1.583278168186849e+06 6.776581674930138e+06 -7.024776854251645e+03 1.838369306843652e+03 2.066259499525957e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.283000000000000e+03 1.583479704786376e+06 -1.583241400501806e+06 6.776622998368946e+06 -7.024805930156790e+03 1.838424303496251e+03 2.066110928625187e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.284000000000000e+03 1.583339209266350e+06 -1.583204631717267e+06 6.776664318835895e+06 -7.024835002626146e+03 1.838479299106159e+03 2.065962357831234e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.285000000000000e+03 1.583198713166307e+06 -1.583167861833220e+06 6.776705636330997e+06 -7.024864072018027e+03 1.838534294514742e+03 2.065813785150099e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.286000000000000e+03 1.583058216486522e+06 -1.583131090849735e+06 6.776746950854176e+06 -7.024893138529533e+03 1.838589289165134e+03 2.065665210449011e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.287000000000000e+03 1.582917719226955e+06 -1.583094318766800e+06 6.776788262405443e+06 -7.024922201541139e+03 1.838644282925631e+03 2.065516635924726e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.288000000000000e+03 1.582777221387672e+06 -1.583057545584428e+06 6.776829570984776e+06 -7.024951261091159e+03 1.838699275680154e+03 2.065368061559153e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.289000000000000e+03 1.582636722968634e+06 -1.583020771302610e+06 6.776870876592193e+06 -7.024980317579932e+03 1.838754268183576e+03 2.065219485298860e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.290000000000000e+03 1.582496223970106e+06 -1.582983995921405e+06 6.776912179227614e+06 -7.025009370922377e+03 1.838809259688253e+03 2.065070908135780e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.291000000000000e+03 1.582355724379069e+06 -1.582947219437138e+06 6.776953478894942e+06 -7.025038421028684e+03 1.838864250604620e+03 2.064922329981999e+03 5.736009995900000e-03 -1.355275199700000e-03 -1.635347924100000e-03 2.128858694800000e-03 6.362057998100000e-04 1.922896281900000e-03</EPHEMLIST>\n\t\t</EPHEMLISTList>\n\t</EPH>\n\t<ATT>\n\t\t<SATID>WV02</SATID>\n\t\t<REVNUMBER>18779</REVNUMBER>\n\t\t<STRIPID>213091</STRIPID>\n\t\t<TYPE>R</TYPE>\n\t\t<VERSION>A</VERSION>\n\t\t<GENERATIONTIME>2013-05-08T01:09:17.000000Z</GENERATIONTIME>\n\t\t<STARTTIME>2013-05-08T00:03:18.178844Z</STARTTIME>\n\t\t<NUMPOINTS>1291</NUMPOINTS>\n\t\t<TIMEINTERVAL>2.000000000000000e-02</TIMEINTERVAL>\n\t\t<ATTLISTList>\n\t\t\t<ATTLIST>1.000000000000000e+00 -3.215719468520623e-01 -9.105833012683373e-01 -1.861350326337494e-01 1.810615477550771e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.000000000000000e+00 -3.215734975963654e-01 -9.105705047782088e-01 -1.861772712257704e-01 1.810797204286674e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.000000000000000e+00 -3.215750455196221e-01 -9.105577060224223e-01 -1.862195100384236e-01 1.810978966837729e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.000000000000000e+00 -3.215765906110792e-01 -9.105449050040894e-01 -1.862617490724596e-01 1.811160765214308e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.000000000000000e+00 -3.215781328723330e-01 -9.105321017224851e-01 -1.863039883267757e-01 1.811342599419414e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.000000000000000e+00 -3.215796723003703e-01 -9.105192961783202e-01 -1.863462278009530e-01 1.811524469458759e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.000000000000000e+00 -3.215812089170367e-01 -9.105064883644790e-01 -1.863884674911533e-01 1.811706375325247e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.000000000000000e+00 -3.215827426975361e-01 -9.104936782885056e-01 -1.864307074000220e-01 1.811888317036273e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.000000000000000e+00 -3.215842736477952e-01 -9.104808659483087e-01 -1.864729475258708e-01 1.812070294592673e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.000000000000000e+01 -3.215858017846472e-01 -9.104680513383557e-01 -1.865151878655411e-01 1.812252307989833e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.100000000000000e+01 -3.215873270862923e-01 -9.104552344652449e-01 -1.865574284212696e-01 1.812434357243674e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.200000000000000e+01 -3.215888495625202e-01 -9.104424153256662e-01 -1.865996691908480e-01 1.812616442353100e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.300000000000000e+01 -3.215903692129523e-01 -9.104295939194984e-01 -1.866419101735003e-01 1.812798563322503e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.400000000000000e+01 -3.215918860435006e-01 -9.104167702446558e-01 -1.866841513675422e-01 1.812980720152706e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.500000000000000e+01 -3.215934000398751e-01 -9.104039443053665e-01 -1.867263927741940e-01 1.813162912855917e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.600000000000000e+01 -3.215949112135455e-01 -9.103911160977906e-01 -1.867686343910216e-01 1.813345141430170e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.700000000000000e+01 -3.215964195666013e-01 -9.103782856210282e-01 -1.868108762169168e-01 1.813527405878618e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.800000000000000e+01 -3.215979250949646e-01 -9.103654528761465e-01 -1.868531182515406e-01 1.813709706207093e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.900000000000000e+01 -3.215994277970526e-01 -9.103526178633633e-01 -1.868953604943996e-01 1.813892042421434e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.000000000000000e+01 -3.216009276596617e-01 -9.103397805866262e-01 -1.869376029463811e-01 1.814074414532087e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.100000000000000e+01 -3.216024247241334e-01 -9.103269410326681e-01 -1.869798456010357e-01 1.814256822521997e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.200000000000000e+01 -3.216039189525132e-01 -9.103140992131861e-01 -1.870220884627616e-01 1.814439266415339e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.300000000000000e+01 -3.216054103507717e-01 -9.103012551260756e-01 -1.870643315298659e-01 1.814621746212899e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.400000000000000e+01 -3.216068989306096e-01 -9.102884087674048e-01 -1.871065747999478e-01 1.814804261912971e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.500000000000000e+01 -3.216083846966412e-01 -9.102755601354972e-01 -1.871488182714989e-01 1.814986813516994e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.600000000000000e+01 -3.216098676237968e-01 -9.102627092379839e-01 -1.871910619471784e-01 1.815169401042706e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.700000000000000e+01 -3.216113477252383e-01 -9.102498560704916e-01 -1.872333058243285e-01 1.815352024487235e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.800000000000000e+01 -3.216128250255648e-01 -9.102370006250374e-01 -1.872755498987591e-01 1.815534683841884e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.900000000000000e+01 -3.216142994812999e-01 -9.102241429150616e-01 -1.873177941755955e-01 1.815717379133754e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.000000000000000e+01 -3.216157711276389e-01 -9.102112829292374e-01 -1.873600386492268e-01 1.815900110348763e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.100000000000000e+01 -3.216172399395122e-01 -9.101984206752367e-01 -1.874022833221849e-01 1.816082877503857e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.200000000000000e+01 -3.216187059426732e-01 -9.101855561447132e-01 -1.874445281901274e-01 1.816265680589721e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.300000000000000e+01 -3.216201691211347e-01 -9.101726893424309e-01 -1.874867732544889e-01 1.816448519619524e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.400000000000000e+01 -3.216216294633022e-01 -9.101598202718303e-01 -1.875290185159309e-01 1.816631394602980e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.500000000000000e+01 -3.216230869959419e-01 -9.101469489242455e-01 -1.875712639699781e-01 1.816814305530217e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.600000000000000e+01 -3.216245417084327e-01 -9.101340753027473e-01 -1.876135096173445e-01 1.816997252411692e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.700000000000000e+01 -3.216259936012631e-01 -9.101211994069632e-01 -1.876557554570734e-01 1.817180235250935e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.800000000000000e+01 -3.216274426547756e-01 -9.101083212428569e-01 -1.876980014909634e-01 1.817363254062221e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.900000000000000e+01 -3.216288889068682e-01 -9.100954407982502e-01 -1.877402477130547e-01 1.817546308829929e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.000000000000000e+01 -3.216303323346252e-01 -9.100825580800939e-01 -1.877824941257027e-01 1.817729399570835e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.100000000000000e+01 -3.216317729336204e-01 -9.100696730895668e-01 -1.878247407286063e-01 1.817912526290996e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.200000000000000e+01 -3.216332107188040e-01 -9.100567858217112e-01 -1.878669875189370e-01 1.818095688986950e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.300000000000000e+01 -3.216346456830839e-01 -9.100438962785472e-01 -1.879092344967502e-01 1.818278887666114e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.400000000000000e+01 -3.216360778251691e-01 -9.100310044602016e-01 -1.879514816615085e-01 1.818462122334202e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.500000000000000e+01 -3.216375071423083e-01 -9.100181103673242e-01 -1.879937290126861e-01 1.818645392996419e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.600000000000000e+01 -3.216389336500358e-01 -9.100052139947951e-01 -1.880359765473180e-01 1.818828699648539e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.700000000000000e+01 -3.216403573356220e-01 -9.099923153463503e-01 -1.880782242663925e-01 1.819012042302165e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.800000000000000e+01 -3.216417781977617e-01 -9.099794144221838e-01 -1.881204721691901e-01 1.819195420961759e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.900000000000000e+01 -3.216431962357685e-01 -9.099665112222740e-01 -1.881627202549700e-01 1.819378835631886e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.000000000000000e+01 -3.216446114688368e-01 -9.099536057403450e-01 -1.882049685202814e-01 1.819562286306398e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.100000000000000e+01 -3.216460238808985e-01 -9.099406979811876e-01 -1.882472169665551e-01 1.819745772998647e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.200000000000000e+01 -3.216474334571596e-01 -9.099277879492524e-01 -1.882894655948660e-01 1.819929295720088e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.300000000000000e+01 -3.216488402340558e-01 -9.099148756328237e-01 -1.883317143994706e-01 1.820112854455623e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.400000000000000e+01 -3.216502441871948e-01 -9.099019610393188e-01 -1.883739633829044e-01 1.820296449222934e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.500000000000000e+01 -3.216516453192099e-01 -9.098890441676889e-01 -1.884162125439226e-01 1.820480080024444e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.600000000000000e+01 -3.216530436263901e-01 -9.098761250188669e-01 -1.884584618821852e-01 1.820663746866296e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.700000000000000e+01 -3.216544391366115e-01 -9.098632035838384e-01 -1.885007113930922e-01 1.820847449737761e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.800000000000000e+01 -3.216558318074270e-01 -9.098502798757180e-01 -1.885429610815735e-01 1.821031188665976e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.900000000000000e+01 -3.216572216705211e-01 -9.098373538842901e-01 -1.885852109425241e-01 1.821214963638233e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.000000000000000e+01 -3.216586087220133e-01 -9.098244256105620e-01 -1.886274609755658e-01 1.821398774660322e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.100000000000000e+01 -3.216599929468053e-01 -9.098114950590180e-01 -1.886697111819903e-01 1.821582621745167e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.200000000000000e+01 -3.216613743590006e-01 -9.097985622249906e-01 -1.887119615590308e-01 1.821766504889196e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.300000000000000e+01 -3.216627529492459e-01 -9.097856271111929e-01 -1.887542121070938e-01 1.821950424101496e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.400000000000000e+01 -3.216641287359503e-01 -9.097726897115993e-01 -1.887964628228425e-01 1.822134379376210e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.500000000000000e+01 -3.216655016901149e-01 -9.097597500350804e-01 -1.888387137094092e-01 1.822318370733574e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.600000000000000e+01 -3.216668718396156e-01 -9.097468080726228e-01 -1.888809647622031e-01 1.822502398162765e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.700000000000000e+01 -3.216682391624185e-01 -9.097338638309418e-01 -1.889232159833088e-01 1.822686461679539e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.800000000000000e+01 -3.216696036837031e-01 -9.097209173018752e-01 -1.889654673684955e-01 1.822870561274459e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.900000000000000e+01 -3.216709653872274e-01 -9.097079684902682e-01 -1.890077189192008e-01 1.823054696961093e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.000000000000000e+01 -3.216723242608235e-01 -9.096950173997440e-01 -1.890499706361385e-01 1.823238868749631e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.100000000000000e+01 -3.216736803344913e-01 -9.096820640206195e-01 -1.890922225144426e-01 1.823423076628073e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.200000000000000e+01 -3.216750335878598e-01 -9.096691083590430e-01 -1.891344745560941e-01 1.823607320612178e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.300000000000000e+01 -3.216763840258969e-01 -9.096561504132307e-01 -1.891767267595396e-01 1.823791600703119e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.400000000000000e+01 -3.216777316410677e-01 -9.096431901853222e-01 -1.892189791249384e-01 1.823975916909075e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.500000000000000e+01 -3.216790764557533e-01 -9.096302276680396e-01 -1.892612316484361e-01 1.824160269222008e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.600000000000000e+01 -3.216804184570551e-01 -9.096172628651734e-01 -1.893034843310233e-01 1.824344657653766e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.700000000000000e+01 -3.216817576281458e-01 -9.096042957818168e-01 -1.893457371740241e-01 1.824529082217045e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.800000000000000e+01 -3.216830939925264e-01 -9.095913264103380e-01 -1.893879901734381e-01 1.824713542903187e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.900000000000000e+01 -3.216844275608259e-01 -9.095783547471042e-01 -1.894302433271484e-01 1.824898039711590e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.000000000000000e+01 -3.216857582929185e-01 -9.095653808045607e-01 -1.894724966395519e-01 1.825082572667318e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.100000000000000e+01 -3.216870862118223e-01 -9.095524045752073e-01 -1.895147501067738e-01 1.825267141762366e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.200000000000000e+01 -3.216884113351070e-01 -9.095394260532835e-01 -1.895570037256007e-01 1.825451746991174e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.300000000000000e+01 -3.216897336325427e-01 -9.095264452480496e-01 -1.895992574993019e-01 1.825636388374854e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.400000000000000e+01 -3.216910531156926e-01 -9.095134621556408e-01 -1.896415114254548e-01 1.825821065911047e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.500000000000000e+01 -3.216923697917803e-01 -9.095004767735624e-01 -1.896837655022094e-01 1.826005779599677e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.600000000000000e+01 -3.216936836582351e-01 -9.094874891023460e-01 -1.897260197291888e-01 1.826190529447159e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.700000000000000e+01 -3.216949947053269e-01 -9.094744991448466e-01 -1.897682741067750e-01 1.826375315462464e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.800000000000000e+01 -3.216963029412008e-01 -9.094615068982574e-01 -1.898105286330576e-01 1.826560137645449e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.900000000000000e+01 -3.216976083755650e-01 -9.094485123592996e-01 -1.898527833058609e-01 1.826744995994694e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.000000000000000e+01 -3.216989109823568e-01 -9.094355155359177e-01 -1.898950381278960e-01 1.826929890529196e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.100000000000000e+01 -3.217002107851213e-01 -9.094225164204677e-01 -1.899372930951672e-01 1.827114821240133e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.200000000000000e+01 -3.217015077773832e-01 -9.094095150147555e-01 -1.899795482076876e-01 1.827299788135167e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.300000000000000e+01 -3.217028019625220e-01 -9.093965113175003e-01 -1.900218034641138e-01 1.827484791216265e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.400000000000000e+01 -3.217040933257526e-01 -9.093835053330884e-01 -1.900640588656700e-01 1.827669830496409e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.500000000000000e+01 -3.217053818827956e-01 -9.093704970563438e-01 -1.901063144093919e-01 1.827854905970943e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.600000000000000e+01 -3.217066676365635e-01 -9.093574864861329e-01 -1.901485700939980e-01 1.828040017642070e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.700000000000000e+01 -3.217079505711394e-01 -9.093444736271995e-01 -1.901908259208586e-01 1.828225165523398e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.800000000000000e+01 -3.217092307047199e-01 -9.093314584735869e-01 -1.902330818866869e-01 1.828410349608910e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.900000000000000e+01 -3.217105080108917e-01 -9.093184410333932e-01 -1.902753379941060e-01 1.828595569917048e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.000000000000000e+02 -3.217117825319721e-01 -9.093054212930513e-01 -1.903175942366688e-01 1.828780826428758e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.010000000000000e+02 -3.217130542261880e-01 -9.092923992654631e-01 -1.903598506191314e-01 1.828966119171631e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.020000000000000e+02 -3.217143231093560e-01 -9.092793749454239e-01 -1.904021071385193e-01 1.829151448140912e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.030000000000000e+02 -3.217155891901341e-01 -9.092663483299869e-01 -1.904443637927987e-01 1.829336813335699e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.040000000000000e+02 -3.217168524630042e-01 -9.092533194206149e-01 -1.904866205819734e-01 1.829522214764017e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.050000000000000e+02 -3.217181129270637e-01 -9.092402882173783e-01 -1.905288775052598e-01 1.829707652430127e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.060000000000000e+02 -3.217193705739141e-01 -9.092272547226914e-01 -1.905711345629157e-01 1.829893126342791e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.070000000000000e+02 -3.217206254213962e-01 -9.092142189307105e-01 -1.906133917517066e-01 1.830078636496109e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.080000000000000e+02 -3.217218774583686e-01 -9.092011808446726e-01 -1.906556490723694e-01 1.830264182901171e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.090000000000000e+02 -3.217231266788201e-01 -9.091881404662604e-01 -1.906979065247878e-01 1.830449765565030e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.100000000000000e+02 -3.217243731105254e-01 -9.091750977864967e-01 -1.907401641044313e-01 1.830635384476343e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.110000000000000e+02 -3.217256167183429e-01 -9.091620528161904e-01 -1.907824218151695e-01 1.830821039659291e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.120000000000000e+02 -3.217268575201071e-01 -9.091490055495010e-01 -1.908246796537713e-01 1.831006731107941e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.130000000000000e+02 -3.217280955107604e-01 -9.091359559877883e-01 -1.908669376200544e-01 1.831192458829255e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.140000000000000e+02 -3.217293307150163e-01 -9.091229041230420e-01 -1.909091957098932e-01 1.831378222813511e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.150000000000000e+02 -3.217305630908790e-01 -9.091098499682334e-01 -1.909514539280441e-01 1.831564023088685e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.160000000000000e+02 -3.217317926734967e-01 -9.090967935120596e-01 -1.909937122690210e-01 1.831749859639359e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.170000000000000e+02 -3.217330194271018e-01 -9.090837347655703e-01 -1.910359707366430e-01 1.831935732489297e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.180000000000000e+02 -3.217342434024500e-01 -9.090706737125379e-01 -1.910782293233942e-01 1.832121641614491e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.190000000000000e+02 -3.217354645588968e-01 -9.090576103655088e-01 -1.911204880338480e-01 1.832307587042236e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.200000000000000e+02 -3.217366829007826e-01 -9.090445447228994e-01 -1.911627468665345e-01 1.832493568773953e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.210000000000000e+02 -3.217378984553959e-01 -9.090314767758872e-01 -1.912050058169989e-01 1.832679586798432e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.220000000000000e+02 -3.217391111929256e-01 -9.090184065335997e-01 -1.912472648883987e-01 1.832865641137086e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.230000000000000e+02 -3.217403211236587e-01 -9.090053339925778e-01 -1.912895240784910e-01 1.833051731788048e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.240000000000000e+02 -3.217415282473778e-01 -9.089922591526559e-01 -1.913317833864606e-01 1.833237858755636e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.250000000000000e+02 -3.217427325739695e-01 -9.089791820105010e-01 -1.913740428101187e-01 1.833424022038183e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.260000000000000e+02 -3.217439340970870e-01 -9.089661025678385e-01 -1.914163023495680e-01 1.833610221644224e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.270000000000000e+02 -3.217451328034848e-01 -9.089530208286341e-01 -1.914585620056239e-01 1.833796457584843e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.280000000000000e+02 -3.217463287137970e-01 -9.089399367861648e-01 -1.915008217747022e-01 1.833982729852433e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.290000000000000e+02 -3.217475218236839e-01 -9.089268504415227e-01 -1.915430816566442e-01 1.834169038454432e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.300000000000000e+02 -3.217487121269711e-01 -9.089137617964421e-01 -1.915853416513459e-01 1.834355383398019e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.310000000000000e+02 -3.217498996086522e-01 -9.089006708554238e-01 -1.916276017599085e-01 1.834541764695716e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.320000000000000e+02 -3.217510843074916e-01 -9.088875776060249e-01 -1.916698619764003e-01 1.834728182329834e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.330000000000000e+02 -3.217522662049950e-01 -9.088744820538031e-01 -1.917121223024965e-01 1.834914636315648e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.340000000000000e+02 -3.217534452761496e-01 -9.088613842064371e-01 -1.917543827405316e-01 1.835101126670817e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.350000000000000e+02 -3.217546215696285e-01 -9.088482840483580e-01 -1.917966432832947e-01 1.835287653372106e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.360000000000000e+02 -3.217557950418728e-01 -9.088351815930320e-01 -1.918389039357033e-01 1.835474216448743e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.370000000000000e+02 -3.217569657262193e-01 -9.088220768297284e-01 -1.918811646925357e-01 1.835660815885982e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.380000000000000e+02 -3.217581335850601e-01 -9.088089697700783e-01 -1.919234255578125e-01 1.835847451708945e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.390000000000000e+02 -3.217592986647351e-01 -9.087958603992501e-01 -1.919656865246326e-01 1.836034123895604e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.400000000000000e+02 -3.217604609364649e-01 -9.087827487260464e-01 -1.920079475959948e-01 1.836220832467036e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.410000000000000e+02 -3.217616203983296e-01 -9.087696347508601e-01 -1.920502087712394e-01 1.836407577428088e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.420000000000000e+02 -3.217627770656339e-01 -9.087565184686297e-01 -1.920924700475425e-01 1.836594358774420e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.430000000000000e+02 -3.217639309246239e-01 -9.087433998834821e-01 -1.921347314257741e-01 1.836781176517485e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.440000000000000e+02 -3.217650819908698e-01 -9.087302789902283e-01 -1.921769929031984e-01 1.836968030653632e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.450000000000000e+02 -3.217662302441753e-01 -9.087171557950278e-01 -1.922192544815157e-01 1.837154921197935e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.460000000000000e+02 -3.217673757133011e-01 -9.087040302885958e-01 -1.922615161561063e-01 1.837341848138047e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.470000000000000e+02 -3.217685183626380e-01 -9.086909024818892e-01 -1.923037779308396e-01 1.837528811498984e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.480000000000000e+02 -3.217696582259659e-01 -9.086777723640398e-01 -1.923460398004505e-01 1.837715811265575e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.490000000000000e+02 -3.217707952723371e-01 -9.086646399445770e-01 -1.923883017680821e-01 1.837902847459390e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.500000000000000e+02 -3.217719295398897e-01 -9.086515052112583e-01 -1.924305638279109e-01 1.838089920062770e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.510000000000000e+02 -3.217730609954922e-01 -9.086383681742587e-01 -1.924728259834802e-01 1.838277029099384e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.520000000000000e+02 -3.217741896371664e-01 -9.086252288339909e-01 -1.925150882341353e-01 1.838464174574139e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.530000000000000e+02 -3.217753155069950e-01 -9.086120871769678e-01 -1.925573505735498e-01 1.838651356467101e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.540000000000000e+02 -3.217764385573120e-01 -9.085989432179504e-01 -1.925996130071332e-01 1.838838574810169e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.550000000000000e+02 -3.217775588213405e-01 -9.085857969462462e-01 -1.926418755297012e-01 1.839025829588388e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.560000000000000e+02 -3.217786762676852e-01 -9.085726483715265e-01 -1.926841381444436e-01 1.839213120823675e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.570000000000000e+02 -3.217797909382519e-01 -9.085594974803607e-01 -1.927264008450635e-01 1.839400448496131e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.580000000000000e+02 -3.217809027888809e-01 -9.085463442864027e-01 -1.927686636365098e-01 1.839587812635763e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.590000000000000e+02 -3.217820118522745e-01 -9.085331887791258e-01 -1.928109265136707e-01 1.839775213227851e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.600000000000000e+02 -3.217831181178387e-01 -9.085200309616606e-01 -1.928531894769983e-01 1.839962650282158e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.610000000000000e+02 -3.217842215829948e-01 -9.085068708345448e-01 -1.928954525260959e-01 1.840150123805190e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.620000000000000e+02 -3.217853222452230e-01 -9.084937083983622e-01 -1.929377156603767e-01 1.840337633802156e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.630000000000000e+02 -3.217864201117229e-01 -9.084805436506095e-01 -1.929799788780676e-01 1.840525180273167e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.640000000000000e+02 -3.217875151839985e-01 -9.084673765906006e-01 -1.930222421780657e-01 1.840712763221138e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.650000000000000e+02 -3.217886074570945e-01 -9.084542072196240e-01 -1.930645055602786e-01 1.840900382653930e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.660000000000000e+02 -3.217896969416107e-01 -9.084410355341248e-01 -1.931067690224372e-01 1.841088038569280e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.670000000000000e+02 -3.217907836084162e-01 -9.084278615430600e-01 -1.931490325674240e-01 1.841275730987975e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.680000000000000e+02 -3.217918674933515e-01 -9.084146852349129e-01 -1.931912961897369e-01 1.841463459893375e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.690000000000000e+02 -3.217929485820032e-01 -9.084015066139555e-01 -1.932335598904936e-01 1.841651225298730e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.700000000000000e+02 -3.217940268609542e-01 -9.083883256842090e-01 -1.932758236705002e-01 1.841839027215486e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.710000000000000e+02 -3.217951023620804e-01 -9.083751424354083e-01 -1.933180875247664e-01 1.842026865629192e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.720000000000000e+02 -3.217961750535560e-01 -9.083619568773169e-01 -1.933603514566346e-01 1.842214740563089e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.730000000000000e+02 -3.217972449580804e-01 -9.083487690025647e-01 -1.934026154622907e-01 1.842402652007971e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.740000000000000e+02 -3.217983120517304e-01 -9.083355788184657e-01 -1.934448795439410e-01 1.842590599981727e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.750000000000000e+02 -3.217993763637411e-01 -9.083223863155880e-01 -1.934871436969382e-01 1.842778584471381e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.760000000000000e+02 -3.218004378815285e-01 -9.083091914976260e-01 -1.935294079221607e-01 1.842966605489188e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.770000000000000e+02 -3.218014965891584e-01 -9.082959943693960e-01 -1.935716722207304e-01 1.843154663048064e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.780000000000000e+02 -3.218025525203205e-01 -9.082827949200608e-01 -1.936139365874345e-01 1.843342757132436e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.790000000000000e+02 -3.218036056483918e-01 -9.082695931577436e-01 -1.936562010249412e-01 1.843530887762644e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.800000000000000e+02 -3.218046559781794e-01 -9.082563890807178e-01 -1.936984655317235e-01 1.843719054939700e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.810000000000000e+02 -3.218057035147235e-01 -9.082431826871621e-01 -1.937407301062868e-01 1.843907258664901e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.820000000000000e+02 -3.218067482616649e-01 -9.082299739757186e-01 -1.937829947472544e-01 1.844095498939915e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.830000000000000e+02 -3.218077902162601e-01 -9.082167629469780e-01 -1.938252594542456e-01 1.844283775771367e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.840000000000000e+02 -3.218088293611479e-01 -9.082035496062065e-01 -1.938675242285578e-01 1.844472089173051e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.850000000000000e+02 -3.218098657307030e-01 -9.081903339423519e-01 -1.939097890649006e-01 1.844660439128891e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.860000000000000e+02 -3.218108993012397e-01 -9.081771159626110e-01 -1.939520539655587e-01 1.844848825657610e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.870000000000000e+02 -3.218119300780016e-01 -9.081638956651202e-01 -1.939943189289505e-01 1.845037248759946e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.880000000000000e+02 -3.218129580529680e-01 -9.081506730521781e-01 -1.940365839552433e-01 1.845225708444750e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.890000000000000e+02 -3.218139832485763e-01 -9.081374481164984e-01 -1.940788490406698e-01 1.845414204702786e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.900000000000000e+02 -3.218150056473166e-01 -9.081242208633297e-01 -1.941211141867246e-01 1.845602737549243e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.910000000000000e+02 -3.218160252503932e-01 -9.081109912920826e-01 -1.941633793923403e-01 1.845791306987206e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.920000000000000e+02 -3.218170420554819e-01 -9.080977594032600e-01 -1.942056446569576e-01 1.845979913022213e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.930000000000000e+02 -3.218180560851885e-01 -9.080845251895217e-01 -1.942479099767921e-01 1.846168555644897e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.940000000000000e+02 -3.218190673094090e-01 -9.080712886600892e-01 -1.942901753549331e-01 1.846357234877810e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.950000000000000e+02 -3.218200757414134e-01 -9.080580498105681e-01 -1.943324407887811e-01 1.846545950717004e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.960000000000000e+02 -3.218210813960362e-01 -9.080448086360704e-01 -1.943747062755399e-01 1.846734703157599e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.970000000000000e+02 -3.218220842459587e-01 -9.080315651449388e-01 -1.944169718179409e-01 1.846923492220561e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.980000000000000e+02 -3.218230843070991e-01 -9.080183193319433e-01 -1.944592374130507e-01 1.847112317900392e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.990000000000000e+02 -3.218240815732558e-01 -9.080050711988100e-01 -1.945015030607999e-01 1.847301180204896e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.000000000000000e+02 -3.218250760569271e-01 -9.079918207413878e-01 -1.945437687586901e-01 1.847490079130542e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.010000000000000e+02 -3.218260677460248e-01 -9.079785679632161e-01 -1.945860345075190e-01 1.847679014689443e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.020000000000000e+02 -3.218270566411022e-01 -9.079653128639109e-01 -1.946283003062999e-01 1.847867986885045e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.030000000000000e+02 -3.218280427611592e-01 -9.079520554372720e-01 -1.946705661517132e-01 1.848056995709980e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.040000000000000e+02 -3.218290260827010e-01 -9.079387956904357e-01 -1.947128320459974e-01 1.848246041183061e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.050000000000000e+02 -3.218300066013627e-01 -9.079255336245704e-01 -1.947550979887872e-01 1.848435123310629e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.060000000000000e+02 -3.218309843430073e-01 -9.079122692312886e-01 -1.947973639759571e-01 1.848624242081707e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.070000000000000e+02 -3.218319592962079e-01 -9.078990025139863e-01 -1.948396300080352e-01 1.848813397506754e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.080000000000000e+02 -3.218329314588495e-01 -9.078857334730570e-01 -1.948818960845543e-01 1.849002589592068e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.090000000000000e+02 -3.218339008201903e-01 -9.078724621116808e-01 -1.949241622059532e-01 1.849191818347741e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.100000000000000e+02 -3.218348674127955e-01 -9.078591884193781e-01 -1.949664283672042e-01 1.849381083758365e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.110000000000000e+02 -3.218358312113870e-01 -9.078459124038486e-01 -1.950086945707628e-01 1.849570385843864e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.120000000000000e+02 -3.218367922155044e-01 -9.078326340650297e-01 -1.950509608157694e-01 1.849759724608290e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.130000000000000e+02 -3.218377504232922e-01 -9.078193534032767e-01 -1.950932271016004e-01 1.849949100056939e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.140000000000000e+02 -3.218387058641800e-01 -9.078060704090998e-01 -1.951354934236287e-01 1.850138512176193e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.150000000000000e+02 -3.218396585016365e-01 -9.077927850937479e-01 -1.951777597857225e-01 1.850327960992675e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.160000000000000e+02 -3.218406083614572e-01 -9.077794974488775e-01 -1.952200261837142e-01 1.850517446494911e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.170000000000000e+02 -3.218415554230307e-01 -9.077662074807598e-01 -1.952622926193420e-01 1.850706968699287e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.180000000000000e+02 -3.218424997009018e-01 -9.077529151845998e-01 -1.953045590898560e-01 1.850896527600958e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.190000000000000e+02 -3.218434411974685e-01 -9.077396205593684e-01 -1.953468255942187e-01 1.851086123203549e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.200000000000000e+02 -3.218443798943955e-01 -9.077263236106410e-01 -1.953890921338178e-01 1.851275755521700e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.210000000000000e+02 -3.218453158221354e-01 -9.077130243286057e-01 -1.954313587039051e-01 1.851465424541100e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.220000000000000e+02 -3.218462489549408e-01 -9.076997227211102e-01 -1.954736253069815e-01 1.851655130282087e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.230000000000000e+02 -3.218471793027629e-01 -9.076864187848088e-01 -1.955158919408767e-01 1.851844872742512e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.240000000000000e+02 -3.218481068534393e-01 -9.076731125233085e-01 -1.955581586062597e-01 1.852034651933810e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.250000000000000e+02 -3.218490316383758e-01 -9.076598039264968e-01 -1.956004252982676e-01 1.852224467841043e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.260000000000000e+02 -3.218499536193148e-01 -9.076464930061673e-01 -1.956426920209661e-01 1.852414320492048e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.270000000000000e+02 -3.218508728205231e-01 -9.076331797544593e-01 -1.956849587703892e-01 1.852604209876138e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.280000000000000e+02 -3.218517892475229e-01 -9.076198641694249e-01 -1.957272255449259e-01 1.852794135993763e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.290000000000000e+02 -3.218527028701774e-01 -9.076065462602957e-01 -1.957694923476166e-01 1.852984098867973e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.300000000000000e+02 -3.218536137303639e-01 -9.075932260136579e-01 -1.958117591722922e-01 1.853174098477508e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.310000000000000e+02 -3.218545217845711e-01 -9.075799034430055e-01 -1.958540260235458e-01 1.853364134852578e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.320000000000000e+02 -3.218554270650646e-01 -9.075665785379555e-01 -1.958962928964142e-01 1.853554207977642e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.330000000000000e+02 -3.218563295599041e-01 -9.075532513020018e-01 -1.959385597916550e-01 1.853744317864897e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.340000000000000e+02 -3.218572292613705e-01 -9.075399217373722e-01 -1.959808267093131e-01 1.853934464522739e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.350000000000000e+02 -3.218581262000074e-01 -9.075265898342274e-01 -1.960230936446463e-01 1.854124647936602e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.360000000000000e+02 -3.218590203372425e-01 -9.075132556044602e-01 -1.960653606017412e-01 1.854314868134684e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.370000000000000e+02 -3.218599116975628e-01 -9.074999190401414e-01 -1.961076275766136e-01 1.854505125106050e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.380000000000000e+02 -3.218608002648047e-01 -9.074865801461405e-01 -1.961498945704235e-01 1.854695418864609e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.390000000000000e+02 -3.218616860605121e-01 -9.074732389154572e-01 -1.961921615795576e-01 1.854885749401160e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.400000000000000e+02 -3.218625690796945e-01 -9.074598953493929e-01 -1.962344286039005e-01 1.855076116723744e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.410000000000000e+02 -3.218634493042045e-01 -9.074465494534654e-01 -1.962766956447965e-01 1.855266520847060e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.420000000000000e+02 -3.218643267346942e-01 -9.074332012272399e-01 -1.963189627013016e-01 1.855456961774927e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.430000000000000e+02 -3.218652014072267e-01 -9.074198506591387e-01 -1.963612297679944e-01 1.855647439489332e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.440000000000000e+02 -3.218660732824804e-01 -9.074064977612896e-01 -1.964034968490405e-01 1.855837954019068e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.450000000000000e+02 -3.218669423782401e-01 -9.073931425278787e-01 -1.964457639412988e-01 1.856028505357151e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.460000000000000e+02 -3.218678087004014e-01 -9.073797849568410e-01 -1.964880310431130e-01 1.856219093503774e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.470000000000000e+02 -3.218686722292416e-01 -9.073664250541243e-01 -1.965302981561995e-01 1.856409718475923e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.480000000000000e+02 -3.218695329906140e-01 -9.073530628113703e-01 -1.965725652764155e-01 1.856600380261702e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.490000000000000e+02 -3.218703909487654e-01 -9.073396982396262e-01 -1.966148324073503e-01 1.856791078886976e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.500000000000000e+02 -3.218712461482799e-01 -9.073263313246266e-01 -1.966570995425312e-01 1.856981814328464e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.510000000000000e+02 -3.218720985597741e-01 -9.073129620753665e-01 -1.966993666848741e-01 1.857172586609042e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.520000000000000e+02 -3.218729481839996e-01 -9.072995904914035e-01 -1.967416338333612e-01 1.857363395732020e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.530000000000000e+02 -3.218737950355683e-01 -9.072862165679240e-01 -1.967839009852521e-01 1.857554241692275e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.540000000000000e+02 -3.218746390984423e-01 -9.072728403097148e-01 -1.968261681417991e-01 1.857745124504621e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.550000000000000e+02 -3.218754803955028e-01 -9.072594617093545e-01 -1.968684352992352e-01 1.857936044158880e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.560000000000000e+02 -3.218763188990360e-01 -9.072460807753565e-01 -1.969107024601393e-01 1.858127000676119e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.570000000000000e+02 -3.218771546297672e-01 -9.072326975009789e-01 -1.969529696210142e-01 1.858317994047479e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.580000000000000e+02 -3.218779875884842e-01 -9.072193118857030e-01 -1.969952367810200e-01 1.858509024277508e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.590000000000000e+02 -3.218788177447654e-01 -9.072059239389167e-01 -1.970375039430060e-01 1.858700091388560e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.600000000000000e+02 -3.218796451476356e-01 -9.071925336449558e-01 -1.970797710999676e-01 1.858891195354436e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.610000000000000e+02 -3.218804697562763e-01 -9.071791410164211e-01 -1.971220382562234e-01 1.859082336205135e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.620000000000000e+02 -3.218812915960635e-01 -9.071657460451057e-01 -1.971643054077030e-01 1.859273513928895e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.630000000000000e+02 -3.218821106416848e-01 -9.071523487387647e-01 -1.972065725566779e-01 1.859464728545408e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.640000000000000e+02 -3.218829269276286e-01 -9.071389490863183e-01 -1.972488396979515e-01 1.859655980037297e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.650000000000000e+02 -3.218837404272732e-01 -9.071255470958907e-01 -1.972911068340774e-01 1.859847268425931e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.660000000000000e+02 -3.218845511489306e-01 -9.071121427646557e-01 -1.973333739631002e-01 1.860038593709973e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.670000000000000e+02 -3.218853590886628e-01 -9.070987360936290e-01 -1.973756410846427e-01 1.860229955896037e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.680000000000000e+02 -3.218861642627507e-01 -9.070853270774725e-01 -1.974179081957654e-01 1.860421354977861e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.690000000000000e+02 -3.218869666499214e-01 -9.070719157226237e-01 -1.974601752983550e-01 1.860612790973588e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.700000000000000e+02 -3.218877662574057e-01 -9.070585020265977e-01 -1.975024423905905e-01 1.860804263882530e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.710000000000000e+02 -3.218885631044406e-01 -9.070450859831248e-01 -1.975447094691704e-01 1.860995773696585e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.720000000000000e+02 -3.218893571576705e-01 -9.070316676024527e-01 -1.975869765374692e-01 1.861187320441363e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.730000000000000e+02 -3.218901484491495e-01 -9.070182468742696e-01 -1.976292435906032e-01 1.861378904100856e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.740000000000000e+02 -3.218909369450400e-01 -9.070048238090195e-01 -1.976715106318822e-01 1.861570524700140e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.750000000000000e+02 -3.218917226841058e-01 -9.069913983942749e-01 -1.977137776555971e-01 1.861762182219027e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.760000000000000e+02 -3.218925056374344e-01 -9.069779706388830e-01 -1.977560446645687e-01 1.861953876680435e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.770000000000000e+02 -3.218932858123985e-01 -9.069645405403147e-01 -1.977983116569605e-01 1.862145608083569e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.780000000000000e+02 -3.218940632180492e-01 -9.069511080955126e-01 -1.978405786307300e-01 1.862337376426579e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.790000000000000e+02 -3.218948378571845e-01 -9.069376733033244e-01 -1.978828455847879e-01 1.862529181712770e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.800000000000000e+02 -3.218956097047517e-01 -9.069242361714461e-01 -1.979251125212912e-01 1.862721023961439e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.810000000000000e+02 -3.218963787781282e-01 -9.069107966941724e-01 -1.979673794372329e-01 1.862912903166006e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.820000000000000e+02 -3.218971450888379e-01 -9.068973548676664e-01 -1.980096463302675e-01 1.863104819323057e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.830000000000000e+02 -3.218979086195695e-01 -9.068839106971169e-01 -1.980519132017793e-01 1.863296772448399e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.840000000000000e+02 -3.218986693727315e-01 -9.068704641815607e-01 -1.980941800505426e-01 1.863488762544297e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.850000000000000e+02 -3.218994273573222e-01 -9.068570153179578e-01 -1.981364468745239e-01 1.863680789608902e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.860000000000000e+02 -3.219001825682544e-01 -9.068435641076421e-01 -1.981787136736017e-01 1.863872853650436e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.870000000000000e+02 -3.219009350006563e-01 -9.068301105519468e-01 -1.982209804474455e-01 1.864064954675686e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.880000000000000e+02 -3.219016846626702e-01 -9.068166546480794e-01 -1.982632471941873e-01 1.864257092683767e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.890000000000000e+02 -3.219024315496019e-01 -9.068031963973172e-01 -1.983055139134745e-01 1.864449267681359e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.900000000000000e+02 -3.219031756658954e-01 -9.067897357979888e-01 -1.983477806040147e-01 1.864641479670746e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.910000000000000e+02 -3.219039170165425e-01 -9.067762728483181e-01 -1.983900472642669e-01 1.864833728652546e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.920000000000000e+02 -3.219046555759806e-01 -9.067628075561399e-01 -1.984323138964957e-01 1.865026014646946e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.930000000000000e+02 -3.219053913760708e-01 -9.067493399112052e-01 -1.984745804958667e-01 1.865218337637766e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.940000000000000e+02 -3.219061244057725e-01 -9.067358699167265e-01 -1.985168470629852e-01 1.865410697636958e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.950000000000000e+02 -3.219068546541437e-01 -9.067223975759509e-01 -1.985591135982614e-01 1.865603094655142e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.960000000000000e+02 -3.219075821386810e-01 -9.067089228831589e-01 -1.986013800986227e-01 1.865795528685096e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.970000000000000e+02 -3.219083068488166e-01 -9.066954458414135e-01 -1.986436465646149e-01 1.865987999738505e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.980000000000000e+02 -3.219090287941636e-01 -9.066819664474813e-01 -1.986859129941319e-01 1.866180507813081e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.990000000000000e+02 -3.219097479460852e-01 -9.066684847101677e-01 -1.987281793898049e-01 1.866373052931014e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.000000000000000e+02 -3.219104643557277e-01 -9.066550006131426e-01 -1.987704457444510e-01 1.866565635063893e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.010000000000000e+02 -3.219111779811954e-01 -9.066415141693477e-01 -1.988127120624421e-01 1.866758254243121e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.020000000000000e+02 -3.219118888290272e-01 -9.066280253765189e-01 -1.988549783420476e-01 1.866950910468350e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.030000000000000e+02 -3.219125969212258e-01 -9.066145342275167e-01 -1.988972445796498e-01 1.867143603729459e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.040000000000000e+02 -3.219133022368427e-01 -9.066010407286776e-01 -1.989395107770573e-01 1.867336334044708e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.050000000000000e+02 -3.219140047846862e-01 -9.065875448770220e-01 -1.989817769322635e-01 1.867529101412291e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.060000000000000e+02 -3.219147045475322e-01 -9.065740466777563e-01 -1.990240430464978e-01 1.867721905847285e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.070000000000000e+02 -3.219154015635857e-01 -9.065605461186335e-01 -1.990663091141702e-01 1.867914747329283e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.080000000000000e+02 -3.219160958026446e-01 -9.065470432089070e-01 -1.991085751382135e-01 1.868107625882432e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.090000000000000e+02 -3.219167872596719e-01 -9.065335379499638e-01 -1.991508411183081e-01 1.868300541513689e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.100000000000000e+02 -3.219174759696103e-01 -9.065200303305844e-01 -1.991931070492663e-01 1.868493494204668e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.110000000000000e+02 -3.219181618937517e-01 -9.065065203627051e-01 -1.992353729350509e-01 1.868686483984944e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.120000000000000e+02 -3.219188450571401e-01 -9.064930080382282e-01 -1.992776387716808e-01 1.868879510842400e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.130000000000000e+02 -3.219195254388177e-01 -9.064794933635378e-01 -1.993199045608340e-01 1.869072574794524e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.140000000000000e+02 -3.219202030753331e-01 -9.064659763269093e-01 -1.993621702971328e-01 1.869265675821841e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.150000000000000e+02 -3.219208779342006e-01 -9.064524569383164e-01 -1.994044359837766e-01 1.869458813950046e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.160000000000000e+02 -3.219215500202974e-01 -9.064389351960207e-01 -1.994467016192389e-01 1.869651989179796e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.170000000000000e+02 -3.219222193360225e-01 -9.064254110990418e-01 -1.994889672023554e-01 1.869845201513762e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.180000000000000e+02 -3.219228858917050e-01 -9.064118846439223e-01 -1.995312327309383e-01 1.870038450949103e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.190000000000000e+02 -3.219235496928223e-01 -9.063983558286675e-01 -1.995734982035722e-01 1.870231737487367e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.200000000000000e+02 -3.219242106992742e-01 -9.063848246657189e-01 -1.996157636241895e-01 1.870425061157897e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.210000000000000e+02 -3.219248689529528e-01 -9.063712911416677e-01 -1.996580289867731e-01 1.870618421937710e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.220000000000000e+02 -3.219255244513847e-01 -9.063577552570264e-01 -1.997002942908727e-01 1.870811819833422e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.230000000000000e+02 -3.219261771671827e-01 -9.063442170202283e-01 -1.997425595388735e-01 1.871005254866288e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.240000000000000e+02 -3.219268271084625e-01 -9.063306764284919e-01 -1.997848247289175e-01 1.871198727035328e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.250000000000000e+02 -3.219274743173925e-01 -9.063171334683215e-01 -1.998270898549633e-01 1.871392236317273e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.260000000000000e+02 -3.219281187329517e-01 -9.063035881586886e-01 -1.998693549236480e-01 1.871585782756259e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.270000000000000e+02 -3.219287603846914e-01 -9.062900404900753e-01 -1.999116199304581e-01 1.871779366337114e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.280000000000000e+02 -3.219293992921838e-01 -9.062764904561109e-01 -1.999538848720919e-01 1.871972987051014e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.290000000000000e+02 -3.219300354088580e-01 -9.062629380712102e-01 -1.999961497534291e-01 1.872166644932906e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.300000000000000e+02 -3.219306687817758e-01 -9.062493833203356e-01 -2.000384145678440e-01 1.872360339956322e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.310000000000000e+02 -3.219312993642015e-01 -9.062358262179991e-01 -2.000806793201104e-01 1.872554072155477e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.320000000000000e+02 -3.219319272067369e-01 -9.062222667480472e-01 -2.001229440031791e-01 1.872747841501581e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.330000000000000e+02 -3.219325522755285e-01 -9.062087049208853e-01 -2.001652086203856e-01 1.872941648021461e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.340000000000000e+02 -3.219331745781024e-01 -9.061951407339411e-01 -2.002074731698854e-01 1.873135491714029e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.350000000000000e+02 -3.219337941255944e-01 -9.061815741835033e-01 -2.002497376493987e-01 1.873329372575850e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.360000000000000e+02 -3.219344109059804e-01 -9.061680052730963e-01 -2.002920020596223e-01 1.873523290619725e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.370000000000000e+02 -3.219350249204457e-01 -9.061544340021460e-01 -2.003342663994768e-01 1.873717245848643e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.380000000000000e+02 -3.219356361593113e-01 -9.061408603734817e-01 -2.003765306692523e-01 1.873911238273051e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.390000000000000e+02 -3.219362446590157e-01 -9.061272843754158e-01 -2.004187948636220e-01 1.874105267873132e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.400000000000000e+02 -3.219368503871364e-01 -9.061137060179033e-01 -2.004610589857376e-01 1.874299334674905e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.410000000000000e+02 -3.219374533448366e-01 -9.061001253003780e-01 -2.005033230345214e-01 1.874493438681364e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.420000000000000e+02 -3.219380535408320e-01 -9.060865422198700e-01 -2.005455870080473e-01 1.874687579891063e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.430000000000000e+02 -3.219386509849885e-01 -9.060729567730694e-01 -2.005878509041918e-01 1.874881758301342e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.440000000000000e+02 -3.219392456630206e-01 -9.060593689642131e-01 -2.006301147239183e-01 1.875075973926514e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.450000000000000e+02 -3.219398375735841e-01 -9.060457787935259e-01 -2.006723784664503e-01 1.875270226771202e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.460000000000000e+02 -3.219404267310485e-01 -9.060321862562782e-01 -2.007146421291232e-01 1.875464516829821e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.470000000000000e+02 -3.219410131239606e-01 -9.060185913558144e-01 -2.007569057125579e-01 1.875658844114867e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.480000000000000e+02 -3.219415967530995e-01 -9.060049940916893e-01 -2.007991692157220e-01 1.875853208629571e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.490000000000000e+02 -3.219421776177839e-01 -9.059913944638963e-01 -2.008414326378203e-01 1.876047610378580e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.500000000000000e+02 -3.219427557330638e-01 -9.059777924674921e-01 -2.008836959761084e-01 1.876242049355816e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.510000000000000e+02 -3.219433310849908e-01 -9.059641881066076e-01 -2.009259592315039e-01 1.876436525575426e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.520000000000000e+02 -3.219439036620427e-01 -9.059505813846759e-01 -2.009682224044489e-01 1.876631039048675e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.530000000000000e+02 -3.219444734989395e-01 -9.059369722905530e-01 -2.010104854898431e-01 1.876825589756650e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.540000000000000e+02 -3.219450405689858e-01 -9.059233608323887e-01 -2.010527484901293e-01 1.877020177721828e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.550000000000000e+02 -3.219456048749684e-01 -9.059097470091052e-01 -2.010950114040342e-01 1.877214802946141e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.560000000000000e+02 -3.219461664174669e-01 -9.058961308202993e-01 -2.011372742306093e-01 1.877409465433391e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.570000000000000e+02 -3.219467252148168e-01 -9.058825122599916e-01 -2.011795369667209e-01 1.877604165175323e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.580000000000000e+02 -3.219472812452003e-01 -9.058688913347948e-01 -2.012217996142233e-01 1.877798902191271e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.590000000000000e+02 -3.219478345064922e-01 -9.058552680451797e-01 -2.012640621724293e-01 1.877993676486383e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.600000000000000e+02 -3.219483850348150e-01 -9.058416423795612e-01 -2.013063246360813e-01 1.878188488040703e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.610000000000000e+02 -3.219489327885707e-01 -9.058280143507869e-01 -2.013485870093941e-01 1.878383336886577e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.620000000000000e+02 -3.219494777818986e-01 -9.058143839542011e-01 -2.013908492897369e-01 1.878578223018474e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.630000000000000e+02 -3.219500200106932e-01 -9.058007511908773e-01 -2.014331114767204e-01 1.878773146443286e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.640000000000000e+02 -3.219505595011058e-01 -9.057871160523735e-01 -2.014753735662823e-01 1.878968107147538e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.650000000000000e+02 -3.219510962283847e-01 -9.057734785462270e-01 -2.015176355606194e-01 1.879163105152568e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.660000000000000e+02 -3.219516301867039e-01 -9.057598386740766e-01 -2.015598974594850e-01 1.879358140465965e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.670000000000000e+02 -3.219521613925129e-01 -9.057461964305156e-01 -2.016021592600366e-01 1.879553213081079e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.680000000000000e+02 -3.219526898554730e-01 -9.057325518123015e-01 -2.016444209601828e-01 1.879748322995260e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.690000000000000e+02 -3.219532155372832e-01 -9.057189048312423e-01 -2.016866825637282e-01 1.879943470238846e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.700000000000000e+02 -3.219537384805953e-01 -9.057052554736950e-01 -2.017289440646503e-01 1.880138654787423e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.710000000000000e+02 -3.219542586633268e-01 -9.056916037464234e-01 -2.017712054646381e-01 1.880333876659306e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.720000000000000e+02 -3.219547760910229e-01 -9.056779496474141e-01 -2.018134667622717e-01 1.880529135855893e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.730000000000000e+02 -3.219552907626101e-01 -9.056642931768079e-01 -2.018557279567371e-01 1.880724432381629e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.740000000000000e+02 -3.219558026661274e-01 -9.056506343381553e-01 -2.018979890485755e-01 1.880919766248627e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.750000000000000e+02 -3.219563118299466e-01 -9.056369731223155e-01 -2.019402500334714e-01 1.881115137441823e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.760000000000000e+02 -3.219568182386048e-01 -9.056233095338980e-01 -2.019825109125032e-01 1.881310545976511e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.770000000000000e+02 -3.219573218773747e-01 -9.056096435773476e-01 -2.020247716864779e-01 1.881505991866217e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.780000000000000e+02 -3.219578227758170e-01 -9.055959752431492e-01 -2.020670323509419e-01 1.881701475095051e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.790000000000000e+02 -3.219583209117159e-01 -9.055823045380407e-01 -2.021092929077727e-01 1.881896995682825e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.800000000000000e+02 -3.219588162994566e-01 -9.055686314572906e-01 -2.021515533543199e-01 1.882092553623712e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.810000000000000e+02 -3.219593089180054e-01 -9.055549560073096e-01 -2.021938136921966e-01 1.882288148935898e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.820000000000000e+02 -3.219597988063939e-01 -9.055412781755975e-01 -2.022360739158309e-01 1.882483781597125e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.830000000000000e+02 -3.219602859257568e-01 -9.055275979741407e-01 -2.022783340290698e-01 1.882679451638332e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.840000000000000e+02 -3.219607702858954e-01 -9.055139153996528e-01 -2.023205940298070e-01 1.882875159056742e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.850000000000000e+02 -3.219612519082143e-01 -9.055002304451898e-01 -2.023628539145645e-01 1.883070903841810e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.860000000000000e+02 -3.219617307651834e-01 -9.054865431191660e-01 -2.024051136858400e-01 1.883266686016959e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.870000000000000e+02 -3.219622068751738e-01 -9.054728534155928e-01 -2.024473733405152e-01 1.883462505573665e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.880000000000000e+02 -3.219626802300790e-01 -9.054591613368073e-01 -2.024896328786661e-01 1.883658362521521e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.890000000000000e+02 -3.219631508344871e-01 -9.054454668811666e-01 -2.025318922988061e-01 1.883854256861197e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.900000000000000e+02 -3.219636186832309e-01 -9.054317700500351e-01 -2.025741516007834e-01 1.884050188601203e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.910000000000000e+02 -3.219640837836653e-01 -9.054180708408983e-01 -2.026164107827845e-01 1.884246157740356e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.920000000000000e+02 -3.219645461183502e-01 -9.054043692590347e-01 -2.026586698459853e-01 1.884442164294524e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.930000000000000e+02 -3.219650057269011e-01 -9.053906652917608e-01 -2.027009287847632e-01 1.884638208240872e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.940000000000000e+02 -3.219654625668811e-01 -9.053769589521892e-01 -2.027431876033658e-01 1.884834289612926e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.950000000000000e+02 -3.219659166522903e-01 -9.053632502357111e-01 -2.027854462991943e-01 1.885030408405028e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.960000000000000e+02 -3.219663679949714e-01 -9.053495391383972e-01 -2.028277048699073e-01 1.885226564612970e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.970000000000000e+02 -3.219668165895301e-01 -9.053358256616844e-01 -2.028699633153778e-01 1.885422758245412e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.980000000000000e+02 -3.219672624257779e-01 -9.053221098085882e-01 -2.029122216358611e-01 1.885618989312956e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.990000000000000e+02 -3.219677055073670e-01 -9.053083915777390e-01 -2.029544798300413e-01 1.885815257817325e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.000000000000000e+02 -3.219681458581165e-01 -9.052946709614331e-01 -2.029967378941677e-01 1.886011563746198e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.010000000000000e+02 -3.219685834343721e-01 -9.052809479731672e-01 -2.030389958326160e-01 1.886207907134062e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.020000000000000e+02 -3.219690182773784e-01 -9.052672225997450e-01 -2.030812536395857e-01 1.886404287956840e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.030000000000000e+02 -3.219694503610473e-01 -9.052534948491943e-01 -2.031235113171997e-01 1.886600706235869e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.040000000000000e+02 -3.219698797060273e-01 -9.052397647147428e-01 -2.031657688622651e-01 1.886797161962252e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.050000000000000e+02 -3.219703062971550e-01 -9.052260322009752e-01 -2.032080262756189e-01 1.886993655149976e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.060000000000000e+02 -3.219707301289355e-01 -9.052122973094053e-01 -2.032502835570194e-01 1.887190185806939e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.070000000000000e+02 -3.219711512266001e-01 -9.051985600318849e-01 -2.032925407025565e-01 1.887386753919803e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.080000000000000e+02 -3.219715695720206e-01 -9.051848203738651e-01 -2.033347977135943e-01 1.887583359505884e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.090000000000000e+02 -3.219719851546936e-01 -9.051710783384608e-01 -2.033770545904171e-01 1.887780002576052e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.100000000000000e+02 -3.219723980150305e-01 -9.051573339127401e-01 -2.034193113273372e-01 1.887976683106628e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.110000000000000e+02 -3.219728081104499e-01 -9.051435871098612e-01 -2.034615679285834e-01 1.888173401131554e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.120000000000000e+02 -3.219732154586458e-01 -9.051298379240521e-01 -2.035038243911329e-01 1.888370156642567e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.130000000000000e+02 -3.219736200620335e-01 -9.051160863543339e-01 -2.035460807138156e-01 1.888566949642189e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.140000000000000e+02 -3.219740219195516e-01 -9.051023324008468e-01 -2.035883368958083e-01 1.888763780134881e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.150000000000000e+02 -3.219744210273948e-01 -9.050885760645270e-01 -2.036305929367902e-01 1.888960648128284e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.160000000000000e+02 -3.219748173951579e-01 -9.050748173421558e-01 -2.036728488346901e-01 1.889157553619593e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.170000000000000e+02 -3.219752109906635e-01 -9.050610562436577e-01 -2.037151045923847e-01 1.889354496634927e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.180000000000000e+02 -3.219756018788993e-01 -9.050472927483554e-01 -2.037573602013245e-01 1.889551477133697e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.190000000000000e+02 -3.219759899975816e-01 -9.050335268756166e-01 -2.037996156680260e-01 1.889748495163435e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.200000000000000e+02 -3.219763753696627e-01 -9.050197586180134e-01 -2.038418709888566e-01 1.889945550712228e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.210000000000000e+02 -3.219767580040363e-01 -9.050059879725479e-01 -2.038841261618284e-01 1.890142643777722e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.220000000000000e+02 -3.219771378865031e-01 -9.049922149434333e-01 -2.039263811878327e-01 1.890339774374682e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.230000000000000e+02 -3.219775150281338e-01 -9.049784395269860e-01 -2.039686360646276e-01 1.890536942499266e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.240000000000000e+02 -3.219778894145088e-01 -9.049646617275342e-01 -2.040108907930070e-01 1.890734148165523e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.250000000000000e+02 -3.219782610669313e-01 -9.049508815381690e-01 -2.040531453695360e-01 1.890931391362594e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.260000000000000e+02 -3.219786299817750e-01 -9.049370989597718e-01 -2.040953997938706e-01 1.891128672098003e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.270000000000000e+02 -3.219789961279862e-01 -9.049233140019358e-01 -2.041376540686799e-01 1.891325990396790e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.280000000000000e+02 -3.219793595474936e-01 -9.049095266512527e-01 -2.041799081881279e-01 1.891523346233925e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.290000000000000e+02 -3.219797202216610e-01 -9.048957369133331e-01 -2.042221621536176e-01 1.891720739627238e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.300000000000000e+02 -3.219800781521896e-01 -9.048819447874481e-01 -2.042644159640009e-01 1.891918170579298e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.310000000000000e+02 -3.219804333266337e-01 -9.048681502773038e-01 -2.043066696198356e-01 1.892115639102845e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.320000000000000e+02 -3.219807857732226e-01 -9.048543533738090e-01 -2.043489231168869e-01 1.892313145182179e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.330000000000000e+02 -3.219811354707972e-01 -9.048405540833712e-01 -2.043911764568472e-01 1.892510688836920e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.340000000000000e+02 -3.219814824178313e-01 -9.048267524062780e-01 -2.044334296389423e-01 1.892708270071859e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.350000000000000e+02 -3.219818266343468e-01 -9.048129483360252e-01 -2.044756826598946e-01 1.892905888876919e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.360000000000000e+02 -3.219821681036903e-01 -9.047991418776001e-01 -2.045179355208697e-01 1.893103545268637e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.370000000000000e+02 -3.219825068292266e-01 -9.047853330297494e-01 -2.045601882205250e-01 1.893301239248427e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.380000000000000e+02 -3.219828428047412e-01 -9.047715217942151e-01 -2.046024407586904e-01 1.893498970824755e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.390000000000000e+02 -3.219831760561181e-01 -9.047577081626469e-01 -2.046446931314117e-01 1.893696739983459e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.400000000000000e+02 -3.219835065559301e-01 -9.047438921434277e-01 -2.046869453411003e-01 1.893894546748550e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.410000000000000e+02 -3.219838343096314e-01 -9.047300737346446e-01 -2.047291973861707e-01 1.894092391119999e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.420000000000000e+02 -3.219841593217865e-01 -9.047162529346442e-01 -2.047714492652024e-01 1.894290273098819e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.430000000000000e+02 -3.219844816059569e-01 -9.047024297389595e-01 -2.048137009756729e-01 1.894488192679330e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.440000000000000e+02 -3.219848011404742e-01 -9.046886041541582e-01 -2.048559525193207e-01 1.894686149881608e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.450000000000000e+02 -3.219851179216112e-01 -9.046747761812227e-01 -2.048982038956235e-01 1.894884144711985e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.460000000000000e+02 -3.219854319922081e-01 -9.046609458064582e-01 -2.049404550986725e-01 1.895082177144431e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.470000000000000e+02 -3.219857432966319e-01 -9.046471130471375e-01 -2.049827061341316e-01 1.895280247222648e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.480000000000000e+02 -3.219860518719747e-01 -9.046332778913778e-01 -2.050249569967584e-01 1.895478354924596e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.490000000000000e+02 -3.219863576936298e-01 -9.046194403467194e-01 -2.050672076885037e-01 1.895676500271556e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.500000000000000e+02 -3.219866608039058e-01 -9.046056003996361e-01 -2.051094582035274e-01 1.895874683237796e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.510000000000000e+02 -3.219869611526927e-01 -9.045917580656591e-01 -2.051517085468447e-01 1.896072903863271e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.520000000000000e+02 -3.219872587620667e-01 -9.045779133376392e-01 -2.051939587149527e-01 1.896271162136345e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.530000000000000e+02 -3.219875536427527e-01 -9.045640662120039e-01 -2.052362087056599e-01 1.896469458053246e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.540000000000000e+02 -3.219878457795014e-01 -9.045502166932988e-01 -2.052784585199537e-01 1.896667791629673e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.550000000000000e+02 -3.219881351804892e-01 -9.045363647787552e-01 -2.053207081559371e-01 1.896866162863641e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.560000000000000e+02 -3.219884218366613e-01 -9.045225104710117e-01 -2.053629576137597e-01 1.897064571765654e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.570000000000000e+02 -3.219887057560912e-01 -9.045086537673322e-01 -2.054052068915368e-01 1.897263018333798e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.580000000000000e+02 -3.219889869450919e-01 -9.044947946654667e-01 -2.054474559877687e-01 1.897461502568698e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.590000000000000e+02 -3.219892653806545e-01 -9.044809331724748e-01 -2.054897049041494e-01 1.897660024490204e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.600000000000000e+02 -3.219895411068187e-01 -9.044670692742857e-01 -2.055319536346565e-01 1.897858584071171e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.610000000000000e+02 -3.219898140706025e-01 -9.044532029873366e-01 -2.055742021846114e-01 1.898057181353795e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.620000000000000e+02 -3.219900843004435e-01 -9.044393343024739e-01 -2.056164505497879e-01 1.898255816321872e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.630000000000000e+02 -3.219903518043605e-01 -9.044254632169556e-01 -2.056586987283703e-01 1.898454488973931e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.640000000000000e+02 -3.219906165620011e-01 -9.044115897370055e-01 -2.057009467217415e-01 1.898653199327988e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.650000000000000e+02 -3.219908785911452e-01 -9.043977138567594e-01 -2.057431945270856e-01 1.898851947376608e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.660000000000000e+02 -3.219911378732322e-01 -9.043838355818756e-01 -2.057854421455772e-01 1.899050733136569e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.670000000000000e+02 -3.219913944260454e-01 -9.043699549065358e-01 -2.058276895742802e-01 1.899249556599528e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.680000000000000e+02 -3.219916482477433e-01 -9.043560718311295e-01 -2.058699368124500e-01 1.899448417770494e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.690000000000000e+02 -3.219918993272191e-01 -9.043421863588966e-01 -2.059121838605861e-01 1.899647316662356e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.700000000000000e+02 -3.219921476656250e-01 -9.043282984892835e-01 -2.059544307175987e-01 1.899846253278028e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.710000000000000e+02 -3.219923932838357e-01 -9.043144082155210e-01 -2.059966773801404e-01 1.900045227606506e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.720000000000000e+02 -3.219926361594819e-01 -9.043005155443982e-01 -2.060389238499983e-01 1.900244239668625e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.730000000000000e+02 -3.219928762977740e-01 -9.042866204740829e-01 -2.060811701256186e-01 1.900443289464439e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.740000000000000e+02 -3.219931137044242e-01 -9.042727230025616e-01 -2.061234162054512e-01 1.900642376994079e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.750000000000000e+02 -3.219933483783215e-01 -9.042588231299933e-01 -2.061656620886661e-01 1.900841502262047e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.760000000000000e+02 -3.219935803166105e-01 -9.042449208570190e-01 -2.062079077748143e-01 1.901040665275419e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.770000000000000e+02 -3.219938095128359e-01 -9.042310161854817e-01 -2.062501532636755e-01 1.901239866042501e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.780000000000000e+02 -3.219940359969314e-01 -9.042171091057589e-01 -2.062923985508727e-01 1.901439104545788e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.790000000000000e+02 -3.219942597220699e-01 -9.042031996323475e-01 -2.063346436409779e-01 1.901638380823546e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.800000000000000e+02 -3.219944807346204e-01 -9.041892877504452e-01 -2.063768885277388e-01 1.901837694846597e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.810000000000000e+02 -3.219946990027285e-01 -9.041753734698770e-01 -2.064191332138940e-01 1.902037046641718e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.820000000000000e+02 -3.219949145388039e-01 -9.041614567865423e-01 -2.064613776970689e-01 1.902236436203827e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.830000000000000e+02 -3.219951273510124e-01 -9.041475376976086e-01 -2.065036219755559e-01 1.902435863532158e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.840000000000000e+02 -3.219953374121073e-01 -9.041336162114721e-01 -2.065458660515021e-01 1.902635328649832e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.850000000000000e+02 -3.219955447690763e-01 -9.041196923131365e-01 -2.065881099185951e-01 1.902834831527112e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.860000000000000e+02 -3.219957493679643e-01 -9.041057660193446e-01 -2.066303535822030e-01 1.903034372207477e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.870000000000000e+02 -3.219959512557086e-01 -9.040918373151161e-01 -2.066725970360228e-01 1.903233950661205e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.880000000000000e+02 -3.219961503906170e-01 -9.040779062133766e-01 -2.067148402839010e-01 1.903433566922198e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.890000000000000e+02 -3.219963468128588e-01 -9.040639727012781e-01 -2.067570833203077e-01 1.903633220965506e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.900000000000000e+02 -3.219965404990738e-01 -9.040500367859232e-01 -2.067993261471230e-01 1.903832912812859e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.910000000000000e+02 -3.219967314526114e-01 -9.040360984660674e-01 -2.068415687630057e-01 1.904032642465588e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.920000000000000e+02 -3.219969196651128e-01 -9.040221577441314e-01 -2.068838111680058e-01 1.904232409933845e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.930000000000000e+02 -3.219971051708604e-01 -9.040082146091238e-01 -2.069260533572703e-01 1.904432215196811e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.940000000000000e+02 -3.219972879277845e-01 -9.039942690740429e-01 -2.069682953347977e-01 1.904632058289654e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.950000000000000e+02 -3.219974679575339e-01 -9.039803211318770e-01 -2.070105370971693e-01 1.904831939200598e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.960000000000000e+02 -3.219976452641859e-01 -9.039663707811528e-01 -2.070527786429634e-01 1.905031857930436e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.970000000000000e+02 -3.219978198476575e-01 -9.039524180216384e-01 -2.070950199714109e-01 1.905231814484264e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.980000000000000e+02 -3.219979916775272e-01 -9.039384628627304e-01 -2.071372610849984e-01 1.905431808887653e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.990000000000000e+02 -3.219981607958653e-01 -9.039245052909601e-01 -2.071795019780585e-01 1.905631841114563e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.000000000000000e+02 -3.219983271865920e-01 -9.039105453112061e-01 -2.072217426514526e-01 1.905831911180251e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.010000000000000e+02 -3.219984908402270e-01 -9.038965829261972e-01 -2.072639831054740e-01 1.906032019096591e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.020000000000000e+02 -3.219986517668872e-01 -9.038826181325571e-01 -2.073062233380160e-01 1.906232164860029e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.030000000000000e+02 -3.219988099785980e-01 -9.038686509263082e-01 -2.073484633467575e-01 1.906432348465613e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.040000000000000e+02 -3.219989654465868e-01 -9.038546813162582e-01 -2.073907031341722e-01 1.906632569939128e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.050000000000000e+02 -3.219991181933832e-01 -9.038407092951201e-01 -2.074329426967511e-01 1.906832829268059e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.060000000000000e+02 -3.219992682116049e-01 -9.038267348650083e-01 -2.074751820344274e-01 1.907033126461891e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.070000000000000e+02 -3.219994154997552e-01 -9.038127580262064e-01 -2.075174211464077e-01 1.907233461525423e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.080000000000000e+02 -3.219995600686461e-01 -9.037987787750497e-01 -2.075596600306912e-01 1.907433834455895e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.090000000000000e+02 -3.219997018962131e-01 -9.037847971183026e-01 -2.076018986888050e-01 1.907634245272976e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.100000000000000e+02 -3.219998410215332e-01 -9.037708130434638e-01 -2.076441371153789e-01 1.907834693952120e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.110000000000000e+02 -3.219999773981833e-01 -9.037568265649036e-01 -2.076863753148671e-01 1.908035180531963e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.120000000000000e+02 -3.220001110548829e-01 -9.037428376733847e-01 -2.077286132830683e-01 1.908235704995447e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.130000000000000e+02 -3.220002419887487e-01 -9.037288463696046e-01 -2.077708510194059e-01 1.908436267348816e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.140000000000000e+02 -3.220003701935600e-01 -9.037148526553360e-01 -2.078130885236170e-01 1.908636867600290e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.150000000000000e+02 -3.220004956796451e-01 -9.037008565270662e-01 -2.078553257937575e-01 1.908837505747432e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.160000000000000e+02 -3.220006184306075e-01 -9.036868579897749e-01 -2.078975628307089e-01 1.909038181805860e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.170000000000000e+02 -3.220007384584037e-01 -9.036728570394836e-01 -2.079397996322229e-01 1.909238895771062e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.180000000000000e+02 -3.220008557690320e-01 -9.036588536741149e-01 -2.079820361966615e-01 1.909439647642380e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.190000000000000e+02 -3.220009703466610e-01 -9.036448478983998e-01 -2.080242725250221e-01 1.909640437436384e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.200000000000000e+02 -3.220010822029966e-01 -9.036308397084628e-01 -2.080665086150248e-01 1.909841265148274e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.210000000000000e+02 -3.220011913397139e-01 -9.036168291035884e-01 -2.081087444655184e-01 1.910042130780544e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.220000000000000e+02 -3.220012977477881e-01 -9.036028160863638e-01 -2.081509800767326e-01 1.910243034344815e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.230000000000000e+02 -3.220014014305347e-01 -9.035888006555570e-01 -2.081932154473308e-01 1.910443975842394e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.240000000000000e+02 -3.220015023938967e-01 -9.035747828090850e-01 -2.082354505757424e-01 1.910644955273108e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.250000000000000e+02 -3.220016006255133e-01 -9.035607625506561e-01 -2.082776854623882e-01 1.910845972649688e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.260000000000000e+02 -3.220016961476872e-01 -9.035467398729851e-01 -2.083199201039854e-01 1.911047027960903e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.270000000000000e+02 -3.220017889330070e-01 -9.035327147845231e-01 -2.083621545026400e-01 1.911248121230490e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.280000000000000e+02 -3.220018790117117e-01 -9.035186872755555e-01 -2.084043886540004e-01 1.911449252440059e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.290000000000000e+02 -3.220019663519289e-01 -9.035046573558676e-01 -2.084466225608507e-01 1.911650421617976e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.300000000000000e+02 -3.220020509815494e-01 -9.034906250164855e-01 -2.084888562191039e-01 1.911851628747541e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.310000000000000e+02 -3.220021328734799e-01 -9.034765902657353e-01 -2.085310896308853e-01 1.912052873852765e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.320000000000000e+02 -3.220022120661412e-01 -9.034625530913254e-01 -2.085733227909336e-01 1.912254156909195e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.330000000000000e+02 -3.220022885256728e-01 -9.034485135036682e-01 -2.086155557022492e-01 1.912455477946702e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.340000000000000e+02 -3.220023622519282e-01 -9.034344715026231e-01 -2.086577883638812e-01 1.912656836969135e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.350000000000000e+02 -3.220024332799301e-01 -9.034204270769695e-01 -2.087000207709524e-01 1.912858233954474e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.360000000000000e+02 -3.220025015760487e-01 -9.034063802370469e-01 -2.087422529264328e-01 1.913059668932471e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.370000000000000e+02 -3.220025671516171e-01 -9.033923309790984e-01 -2.087844848280906e-01 1.913261141898519e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.380000000000000e+02 -3.220026300008326e-01 -9.033782793047431e-01 -2.088267164756664e-01 1.913462652861048e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.390000000000000e+02 -3.220026901421335e-01 -9.033642252079852e-01 -2.088689478661379e-01 1.913664201810192e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.400000000000000e+02 -3.220027475546516e-01 -9.033501686951442e-01 -2.089111790010451e-01 1.913865788766369e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.410000000000000e+02 -3.220028022539010e-01 -9.033361097611460e-01 -2.089534098776926e-01 1.914067413721861e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.420000000000000e+02 -3.220028542249734e-01 -9.033220484104786e-01 -2.089956404968337e-01 1.914269076691824e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.430000000000000e+02 -3.220029034771576e-01 -9.033079846400301e-01 -2.090378708564663e-01 1.914470777673117e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.440000000000000e+02 -3.220029500264587e-01 -9.032939184445012e-01 -2.090801009540242e-01 1.914672516658965e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.450000000000000e+02 -3.220029938345924e-01 -9.032798498357695e-01 -2.091223307927972e-01 1.914874293681363e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.460000000000000e+02 -3.220030349405280e-01 -9.032657788013712e-01 -2.091645603674847e-01 1.915076108715222e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.470000000000000e+02 -3.220030733247163e-01 -9.032517053472098e-01 -2.092067896794732e-01 1.915277961780046e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.480000000000000e+02 -3.220031089841220e-01 -9.032376294740566e-01 -2.092490187281311e-01 1.915479852881795e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.490000000000000e+02 -3.220031419299133e-01 -9.032235511781843e-01 -2.092912475113100e-01 1.915681782016357e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.500000000000000e+02 -3.220031721588708e-01 -9.032094704604218e-01 -2.093334760283992e-01 1.915883749189827e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.510000000000000e+02 -3.220031996725885e-01 -9.031953873200117e-01 -2.093757042784344e-01 1.916085754406069e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.520000000000000e+02 -3.220032244535223e-01 -9.031813017622964e-01 -2.094179322623919e-01 1.916287797681822e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.530000000000000e+02 -3.220032465428185e-01 -9.031672137741276e-01 -2.094601599747417e-01 1.916489878990241e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.540000000000000e+02 -3.220032658974586e-01 -9.031531233688030e-01 -2.095023874194636e-01 1.916691998368323e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.550000000000000e+02 -3.220032825345834e-01 -9.031390305407377e-01 -2.095446145936881e-01 1.916894155807054e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.560000000000000e+02 -3.220032964628910e-01 -9.031249352869832e-01 -2.095868414955440e-01 1.917096351304117e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.570000000000000e+02 -3.220033076813910e-01 -9.031108376076673e-01 -2.096290681241717e-01 1.917298584863943e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.580000000000000e+02 -3.220033161696684e-01 -9.030967375089660e-01 -2.096712944810409e-01 1.917500856506794e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.590000000000000e+02 -3.220033219442171e-01 -9.030826349854989e-01 -2.097135205633572e-01 1.917703166224100e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.600000000000000e+02 -3.220033250096982e-01 -9.030685300356130e-01 -2.097557463696355e-01 1.917905514016084e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.610000000000000e+02 -3.220033253626970e-01 -9.030544226601293e-01 -2.097979718994648e-01 1.918107899890336e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.620000000000000e+02 -3.220033229938817e-01 -9.030403128618034e-01 -2.098401971529051e-01 1.918310323857535e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.630000000000000e+02 -3.220033179012401e-01 -9.030262006410616e-01 -2.098824221292676e-01 1.918512785923353e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.640000000000000e+02 -3.220033101157408e-01 -9.030120859879635e-01 -2.099246468241646e-01 1.918715286068341e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.650000000000000e+02 -3.220032995973679e-01 -9.029979689148607e-01 -2.099668712412209e-01 1.918917824327466e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.660000000000000e+02 -3.220032863787983e-01 -9.029838494112750e-01 -2.100090953758623e-01 1.919120400679996e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.670000000000000e+02 -3.220032704319621e-01 -9.029697274858421e-01 -2.100513192302719e-01 1.919323015151099e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.680000000000000e+02 -3.220032517814742e-01 -9.029556031306235e-01 -2.100935428007661e-01 1.919525667726045e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.690000000000000e+02 -3.220032304194003e-01 -9.029414763478643e-01 -2.101357660874291e-01 1.919728358415823e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.700000000000000e+02 -3.220032063322010e-01 -9.029273471416466e-01 -2.101779890907793e-01 1.919931087234297e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.710000000000000e+02 -3.220031795423635e-01 -9.029132155047020e-01 -2.102202118073704e-01 1.920133854168304e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.720000000000000e+02 -3.220031500377620e-01 -9.028990814405967e-01 -2.102624342377458e-01 1.920336659231991e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.730000000000000e+02 -3.220031178241838e-01 -9.028849449473240e-01 -2.103046563802977e-01 1.920539502424715e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.740000000000000e+02 -3.220030828821224e-01 -9.028708060308219e-01 -2.103468782362568e-01 1.920742383765304e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.750000000000000e+02 -3.220030452500799e-01 -9.028566646787779e-01 -2.103890998004215e-01 1.920945303228493e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.760000000000000e+02 -3.220030048892498e-01 -9.028425209031634e-01 -2.104313210762625e-01 1.921148260848539e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.770000000000000e+02 -3.220029618165203e-01 -9.028283746984747e-01 -2.104735420609521e-01 1.921351256616445e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.780000000000000e+02 -3.220029160525217e-01 -9.028142260580293e-01 -2.105157627512551e-01 1.921554290520345e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.790000000000000e+02 -3.220028675612278e-01 -9.028000749929235e-01 -2.105579831503311e-01 1.921757362592455e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.800000000000000e+02 -3.220028163622196e-01 -9.027859214968051e-01 -2.106002032550599e-01 1.921960472821720e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.810000000000000e+02 -3.220027624450524e-01 -9.027717655727583e-01 -2.106424230656724e-01 1.922163621220175e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.820000000000000e+02 -3.220027069705842e-01 -9.027576068548896e-01 -2.106846424541102e-01 1.922366806913612e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.830000000000000e+02 -3.220026464958046e-01 -9.027434464273724e-01 -2.107268617964139e-01 1.922570032523207e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.840000000000000e+02 -3.220025844474557e-01 -9.027292832109630e-01 -2.107690807166470e-01 1.922773295436563e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.850000000000000e+02 -3.220025197046442e-01 -9.027151175583583e-01 -2.108112993364573e-01 1.922976596517340e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.860000000000000e+02 -3.220024522507570e-01 -9.027009494745387e-01 -2.108535176568701e-01 1.923179935783161e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.870000000000000e+02 -3.220023820718209e-01 -9.026867789637238e-01 -2.108957356784370e-01 1.923383313248328e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.880000000000000e+02 -3.220023091862749e-01 -9.026726060198986e-01 -2.109379533982286e-01 1.923586728903022e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.890000000000000e+02 -3.220022336090484e-01 -9.026584306381775e-01 -2.109801708136415e-01 1.923790182739609e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.900000000000000e+02 -3.220021553089398e-01 -9.026442528281370e-01 -2.110223879272884e-01 1.923993674786816e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.910000000000000e+02 -3.220020743018318e-01 -9.026300725845914e-01 -2.110646047364604e-01 1.924197205036293e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.710000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.920000000000000e+02 -3.220019399933813e-01 -9.026159058458731e-01 -2.111068267558936e-01 1.924400811982521e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.720000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.930000000000000e+02 -3.220018504727631e-01 -9.026017217112443e-01 -2.111490432899495e-01 1.924604421011053e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.720000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.940000000000000e+02 -3.220017613416962e-01 -9.025875341669196e-01 -2.111912591793264e-01 1.924808065901013e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.720000000000000e-11 -3.770000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.950000000000000e+02 -3.220016695002579e-01 -9.025733441893296e-01 -2.112334747609361e-01 1.925011749012408e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.720000000000000e-11 -3.780000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.960000000000000e+02 -3.220015749639822e-01 -9.025591517733985e-01 -2.112756900321122e-01 1.925215470337104e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.720000000000000e-11 -3.780000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.970000000000000e+02 -3.220014777103739e-01 -9.025449569259607e-01 -2.113179049945093e-01 1.925419229897294e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.720000000000000e-11 -3.780000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.980000000000000e+02 -3.220013777490268e-01 -9.025307596438120e-01 -2.113601196461067e-01 1.925623027689368e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.720000000000000e-11 -3.780000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.990000000000000e+02 -3.220012750767746e-01 -9.025165599277446e-01 -2.114023339863327e-01 1.925826863719897e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.720000000000000e-11 -3.780000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.000000000000000e+02 -3.220011697159067e-01 -9.025023577705555e-01 -2.114445480117890e-01 1.926030737975556e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.720000000000000e-11 -3.790000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.010000000000000e+02 -3.220010616369129e-01 -9.024881531812883e-01 -2.114867617248873e-01 1.926234650483925e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.720000000000000e-11 -3.790000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.020000000000000e+02 -3.220013675936915e-01 -9.024737735663699e-01 -2.115291059076512e-01 1.926438284674050e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.720000000000000e-11 -3.790000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.030000000000000e+02 -3.220011751932632e-01 -9.024595949537443e-01 -2.115712757663496e-01 1.926642621782271e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.720000000000000e-11 -3.790000000000000e-12 1.220000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.040000000000000e+02 -3.220010112802863e-01 -9.024454041228522e-01 -2.116134456832188e-01 1.926846930041165e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.720000000000000e-11 -3.790000000000000e-12 1.230000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.050000000000000e+02 -3.220008320240796e-01 -9.024312148185339e-01 -2.116556233796139e-01 1.927051213349884e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.720000000000000e-11 -3.790000000000000e-12 1.230000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.060000000000000e+02 -3.220006429425560e-01 -9.024170239918746e-01 -2.116978115699261e-01 1.927255492422656e-01 1.090000000000000e-10 -3.830000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.720000000000000e-11 -3.800000000000000e-12 1.230000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.070000000000000e+02 -3.220004517022315e-01 -9.024028301827935e-01 -2.117400049771973e-01 1.927459765439987e-01 1.090000000000000e-10 -3.840000000000000e-11 -1.630000000000000e-11 -1.560000000000000e-11 1.720000000000000e-11 -3.800000000000000e-12 1.230000000000000e-11 5.340000000000000e-11 1.360000000000000e-11 4.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.080000000000000e+02 -3.220002619640744e-01 -9.023886331624948e-01 -2.117821994655847e-01 1.927664027358270e-01 1.090000000000000e-10 -3.840000000000000e-11 -1.640000000000000e-11 -1.570000000000000e-11 1.720000000000000e-11 -3.800000000000000e-12 1.230000000000000e-11 5.350000000000000e-11 1.360000000000000e-11 4.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.090000000000000e+02 -3.220000758848889e-01 -9.023744322598068e-01 -2.118243919224436e-01 1.927868307758714e-01 1.090000000000000e-10 -3.840000000000000e-11 -1.640000000000000e-11 -1.570000000000000e-11 1.720000000000000e-11 -3.800000000000000e-12 1.230000000000000e-11 5.350000000000000e-11 1.360000000000000e-11 4.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.100000000000000e+02 -3.219998986218738e-01 -9.023602252232429e-01 -2.118665823008271e-01 1.928072626399957e-01 1.090000000000000e-10 -3.840000000000000e-11 -1.640000000000000e-11 -1.570000000000000e-11 1.720000000000000e-11 -3.800000000000000e-12 1.230000000000000e-11 5.350000000000000e-11 1.360000000000000e-11 4.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.110000000000000e+02 -3.219997344869607e-01 -9.023460101194980e-01 -2.119087721014872e-01 1.928276985243290e-01 1.090000000000000e-10 -3.840000000000000e-11 -1.640000000000000e-11 -1.570000000000000e-11 1.720000000000000e-11 -3.800000000000000e-12 1.230000000000000e-11 5.350000000000000e-11 1.360000000000000e-11 4.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.120000000000000e+02 -3.219995811681783e-01 -9.023317883483996e-01 -2.119509617931792e-01 1.928481352215870e-01 1.090000000000000e-10 -3.840000000000000e-11 -1.640000000000000e-11 -1.570000000000000e-11 1.720000000000000e-11 -3.810000000000000e-12 1.230000000000000e-11 5.350000000000000e-11 1.360000000000000e-11 4.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.130000000000000e+02 -3.219994152003124e-01 -9.023175678386186e-01 -2.119931537804605e-01 1.928685721694203e-01 1.090000000000000e-10 -3.840000000000000e-11 -1.640000000000000e-11 -1.570000000000000e-11 1.720000000000000e-11 -3.810000000000000e-12 1.230000000000000e-11 5.350000000000000e-11 1.360000000000000e-11 4.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.140000000000000e+02 -3.219992598704873e-01 -9.023033403642345e-01 -2.120353478469880e-01 1.928890092094669e-01 1.090000000000000e-10 -3.840000000000000e-11 -1.640000000000000e-11 -1.570000000000000e-11 1.720000000000000e-11 -3.810000000000000e-12 1.230000000000000e-11 5.350000000000000e-11 1.360000000000000e-11 4.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.150000000000000e+02 -3.219990940477899e-01 -9.022891109830017e-01 -2.120775528418085e-01 1.929094482251634e-01 1.090000000000000e-10 -3.840000000000000e-11 -1.640000000000000e-11 -1.570000000000000e-11 1.720000000000000e-11 -3.810000000000000e-12 1.230000000000000e-11 5.350000000000000e-11 1.360000000000000e-11 4.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.160000000000000e+02 -3.219989209436910e-01 -9.022748781365021e-01 -2.121197716167088e-01 1.929298880011449e-01 1.090000000000000e-10 -3.840000000000000e-11 -1.640000000000000e-11 -1.570000000000000e-11 1.720000000000000e-11 -3.810000000000000e-12 1.230000000000000e-11 5.350000000000000e-11 1.360000000000000e-11 4.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.170000000000000e+02 -3.219987458231221e-01 -9.022606417196934e-01 -2.121619970036940e-01 1.929503281140202e-01 1.090000000000000e-10 -3.840000000000000e-11 -1.640000000000000e-11 -1.570000000000000e-11 1.720000000000000e-11 -3.810000000000000e-12 1.230000000000000e-11 5.350000000000000e-11 1.360000000000000e-11 4.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.180000000000000e+02 -3.219985682318666e-01 -9.022464031349754e-01 -2.122042232091000e-01 1.929707691305861e-01 1.090000000000000e-10 -3.840000000000000e-11 -1.640000000000000e-11 -1.570000000000000e-11 1.720000000000000e-11 -3.820000000000000e-12 1.230000000000000e-11 5.350000000000000e-11 1.360000000000000e-11 4.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.190000000000000e+02 -3.219983866222483e-01 -9.022321619362654e-01 -2.122464516514974e-01 1.929912141570960e-01 1.090000000000000e-10 -3.840000000000000e-11 -1.640000000000000e-11 -1.570000000000000e-11 1.720000000000000e-11 -3.820000000000000e-12 1.230000000000000e-11 5.350000000000000e-11 1.370000000000000e-11 4.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.200000000000000e+02 -3.219982006929841e-01 -9.022179165275296e-01 -2.122886835641528e-01 1.930116697969421e-01 1.090000000000000e-10 -3.840000000000000e-11 -1.640000000000000e-11 -1.570000000000000e-11 1.720000000000000e-11 -3.820000000000000e-12 1.230000000000000e-11 5.350000000000000e-11 1.370000000000000e-11 4.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.210000000000000e+02 -3.219980131986101e-01 -9.022036658216323e-01 -2.123309171351906e-01 1.930321385227991e-01 1.090000000000000e-10 -3.840000000000000e-11 -1.640000000000000e-11 -1.570000000000000e-11 1.720000000000000e-11 -3.820000000000000e-12 1.230000000000000e-11 5.350000000000000e-11 1.370000000000000e-11 4.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.220000000000000e+02 -3.219978297178937e-01 -9.021894101088561e-01 -2.123731492472831e-01 1.930526130959946e-01 1.090000000000000e-10 -3.840000000000000e-11 -1.640000000000000e-11 -1.570000000000000e-11 1.720000000000000e-11 -3.820000000000000e-12 1.230000000000000e-11 5.350000000000000e-11 1.370000000000000e-11 4.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.230000000000000e+02 -3.219976229429170e-01 -9.021751589486350e-01 -2.124153841245085e-01 1.930730897415633e-01 1.090000000000000e-10 -3.840000000000000e-11 -1.640000000000000e-11 -1.570000000000000e-11 1.720000000000000e-11 -3.820000000000000e-12 1.230000000000000e-11 5.350000000000000e-11 1.370000000000000e-11 4.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.240000000000000e+02 -3.219974428860798e-01 -9.021608965598161e-01 -2.124576172044850e-01 1.930935638104156e-01 1.090000000000000e-10 -3.840000000000000e-11 -1.640000000000000e-11 -1.570000000000000e-11 1.720000000000000e-11 -3.830000000000000e-12 1.230000000000000e-11 5.350000000000000e-11 1.370000000000000e-11 4.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.250000000000000e+02 -3.219972633724763e-01 -9.021466319851210e-01 -2.124998486495048e-01 1.931140365236984e-01 1.090000000000000e-10 -3.840000000000000e-11 -1.640000000000000e-11 -1.580000000000000e-11 1.730000000000000e-11 -3.830000000000000e-12 1.230000000000000e-11 5.360000000000000e-11 1.370000000000000e-11 4.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.260000000000000e+02 -3.219970869795316e-01 -9.021323643746830e-01 -2.125420768578661e-01 1.931345093176904e-01 1.090000000000000e-10 -3.840000000000000e-11 -1.640000000000000e-11 -1.580000000000000e-11 1.730000000000000e-11 -3.830000000000000e-12 1.230000000000000e-11 5.360000000000000e-11 1.370000000000000e-11 4.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.270000000000000e+02 -3.219969115272033e-01 -9.021180940472405e-01 -2.125843028499822e-01 1.931549832163383e-01 1.090000000000000e-10 -3.840000000000000e-11 -1.640000000000000e-11 -1.580000000000000e-11 1.730000000000000e-11 -3.830000000000000e-12 1.230000000000000e-11 5.360000000000000e-11 1.370000000000000e-11 4.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.280000000000000e+02 -3.219967365326639e-01 -9.021038210165000e-01 -2.126265290580461e-01 1.931754562838485e-01 1.090000000000000e-10 -3.840000000000000e-11 -1.640000000000000e-11 -1.580000000000000e-11 1.730000000000000e-11 -3.830000000000000e-12 1.230000000000000e-11 5.360000000000000e-11 1.370000000000000e-11 4.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.290000000000000e+02 -3.219965617052361e-01 -9.020895457217648e-01 -2.126687521716440e-01 1.931959305970551e-01 1.090000000000000e-10 -3.840000000000000e-11 -1.640000000000000e-11 -1.580000000000000e-11 1.730000000000000e-11 -3.830000000000000e-12 1.240000000000000e-11 5.360000000000000e-11 1.370000000000000e-11 4.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.300000000000000e+02 -3.219963867327824e-01 -9.020752691296032e-01 -2.127109652240843e-01 1.932164098342186e-01 1.090000000000000e-10 -3.840000000000000e-11 -1.640000000000000e-11 -1.580000000000000e-11 1.730000000000000e-11 -3.840000000000000e-12 1.240000000000000e-11 5.360000000000000e-11 1.370000000000000e-11 4.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.310000000000000e+02 -3.219962115859990e-01 -9.020609916454321e-01 -2.127531672633126e-01 1.932368932045671e-01 1.090000000000000e-10 -3.840000000000000e-11 -1.650000000000000e-11 -1.580000000000000e-11 1.730000000000000e-11 -3.840000000000000e-12 1.240000000000000e-11 5.360000000000000e-11 1.370000000000000e-11 4.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.320000000000000e+02 -3.219960414075000e-01 -9.020467110085914e-01 -2.127953627614482e-01 1.932573777730262e-01 1.090000000000000e-10 -3.840000000000000e-11 -1.650000000000000e-11 -1.580000000000000e-11 1.730000000000000e-11 -3.840000000000000e-12 1.240000000000000e-11 5.360000000000000e-11 1.370000000000000e-11 4.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.330000000000000e+02 -3.219958373494471e-01 -9.020324380893195e-01 -2.128375606179698e-01 1.932778677305252e-01 1.090000000000000e-10 -3.840000000000000e-11 -1.650000000000000e-11 -1.580000000000000e-11 1.730000000000000e-11 -3.840000000000000e-12 1.240000000000000e-11 5.360000000000000e-11 1.370000000000000e-11 4.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.340000000000000e+02 -3.219956674435370e-01 -9.020181503467676e-01 -2.128797554805537e-01 1.932983608288673e-01 1.090000000000000e-10 -3.840000000000000e-11 -1.650000000000000e-11 -1.580000000000000e-11 1.730000000000000e-11 -3.840000000000000e-12 1.240000000000000e-11 5.360000000000000e-11 1.370000000000000e-11 4.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.350000000000000e+02 -3.219954956118896e-01 -9.020038568452687e-01 -2.129219554877879e-01 1.933188659007961e-01 1.090000000000000e-10 -3.840000000000000e-11 -1.650000000000000e-11 -1.580000000000000e-11 1.730000000000000e-11 -3.840000000000000e-12 1.240000000000000e-11 5.360000000000000e-11 1.370000000000000e-11 4.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.360000000000000e+02 -3.219953289811644e-01 -9.019895542924350e-01 -2.129641615932113e-01 1.933393853785276e-01 1.090000000000000e-10 -3.840000000000000e-11 -1.650000000000000e-11 -1.580000000000000e-11 1.730000000000000e-11 -3.840000000000000e-12 1.240000000000000e-11 5.360000000000000e-11 1.370000000000000e-11 4.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.370000000000000e+02 -3.219951651265689e-01 -9.019752457224768e-01 -2.130063707574894e-01 1.933599124837262e-01 1.090000000000000e-10 -3.840000000000000e-11 -1.650000000000000e-11 -1.580000000000000e-11 1.730000000000000e-11 -3.850000000000000e-12 1.240000000000000e-11 5.360000000000000e-11 1.370000000000000e-11 4.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.380000000000000e+02 -3.219949994371983e-01 -9.019609349539079e-01 -2.130485802383621e-01 1.933804400991201e-01 1.090000000000000e-10 -3.840000000000000e-11 -1.650000000000000e-11 -1.580000000000000e-11 1.730000000000000e-11 -3.850000000000000e-12 1.240000000000000e-11 5.360000000000000e-11 1.370000000000000e-11 4.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.390000000000000e+02 -3.219948273692498e-01 -9.019466245942125e-01 -2.130907875127103e-01 1.934009664085647e-01 1.090000000000000e-10 -3.840000000000000e-11 -1.650000000000000e-11 -1.580000000000000e-11 1.730000000000000e-11 -3.850000000000000e-12 1.240000000000000e-11 5.360000000000000e-11 1.370000000000000e-11 4.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.400000000000000e+02 -3.219946407588321e-01 -9.019323174300882e-01 -2.131329905011693e-01 1.934214943014602e-01 1.090000000000000e-10 -3.850000000000000e-11 -1.650000000000000e-11 -1.580000000000000e-11 1.730000000000000e-11 -3.850000000000000e-12 1.240000000000000e-11 5.370000000000000e-11 1.370000000000000e-11 4.660000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.410000000000000e+02 -3.219944422878577e-01 -9.019180118521779e-01 -2.131751903224938e-01 1.934420255872922e-01 1.090000000000000e-10 -3.850000000000000e-11 -1.650000000000000e-11 -1.590000000000000e-11 1.730000000000000e-11 -3.850000000000000e-12 1.240000000000000e-11 5.370000000000000e-11 1.370000000000000e-11 4.660000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.420000000000000e+02 -3.219942448971606e-01 -9.019037034474736e-01 -2.132173872616996e-01 1.934625589878667e-01 1.090000000000000e-10 -3.850000000000000e-11 -1.650000000000000e-11 -1.590000000000000e-11 1.730000000000000e-11 -3.850000000000000e-12 1.240000000000000e-11 5.370000000000000e-11 1.370000000000000e-11 4.660000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.430000000000000e+02 -3.219940054956403e-01 -9.018894061602796e-01 -2.132595860331017e-01 1.934830960206133e-01 1.090000000000000e-10 -3.850000000000000e-11 -1.650000000000000e-11 -1.590000000000000e-11 1.730000000000000e-11 -3.860000000000000e-12 1.240000000000000e-11 5.370000000000000e-11 1.370000000000000e-11 4.660000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.440000000000000e+02 -3.219938039437724e-01 -9.018750933143039e-01 -2.133017782602366e-01 1.935036373615644e-01 1.090000000000000e-10 -3.850000000000000e-11 -1.650000000000000e-11 -1.590000000000000e-11 1.730000000000000e-11 -3.860000000000000e-12 1.240000000000000e-11 5.370000000000000e-11 1.370000000000000e-11 4.660000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.450000000000000e+02 -3.219935952314251e-01 -9.018607768021322e-01 -2.133439651306672e-01 1.935242011690552e-01 1.090000000000000e-10 -3.850000000000000e-11 -1.650000000000000e-11 -1.590000000000000e-11 1.730000000000000e-11 -3.860000000000000e-12 1.240000000000000e-11 5.370000000000000e-11 1.370000000000000e-11 4.660000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.460000000000000e+02 -3.219933813285845e-01 -9.018464557528825e-01 -2.133861447086916e-01 1.935447903533193e-01 1.090000000000000e-10 -3.850000000000000e-11 -1.650000000000000e-11 -1.590000000000000e-11 1.730000000000000e-11 -3.860000000000000e-12 1.240000000000000e-11 5.370000000000000e-11 1.370000000000000e-11 4.660000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.470000000000000e+02 -3.219931653602333e-01 -9.018321308655991e-01 -2.134283210353702e-01 1.935653919990175e-01 1.090000000000000e-10 -3.850000000000000e-11 -1.650000000000000e-11 -1.590000000000000e-11 1.730000000000000e-11 -3.860000000000000e-12 1.240000000000000e-11 5.370000000000000e-11 1.370000000000000e-11 4.660000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.480000000000000e+02 -3.219929485718470e-01 -9.018178033862015e-01 -2.134704959987224e-01 1.935859961457802e-01 1.090000000000000e-10 -3.850000000000000e-11 -1.650000000000000e-11 -1.590000000000000e-11 1.730000000000000e-11 -3.860000000000000e-12 1.240000000000000e-11 5.370000000000000e-11 1.370000000000000e-11 4.660000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.490000000000000e+02 -3.219927269478381e-01 -9.018034750153153e-01 -2.135126719507182e-01 1.936065989563926e-01 1.090000000000000e-10 -3.850000000000000e-11 -1.650000000000000e-11 -1.590000000000000e-11 1.730000000000000e-11 -3.860000000000000e-12 1.240000000000000e-11 5.370000000000000e-11 1.370000000000000e-11 4.660000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.500000000000000e+02 -3.219924981742957e-01 -9.017891450193622e-01 -2.135548531075113e-01 1.936272030448025e-01 1.090000000000000e-10 -3.850000000000000e-11 -1.650000000000000e-11 -1.590000000000000e-11 1.730000000000000e-11 -3.870000000000000e-12 1.250000000000000e-11 5.370000000000000e-11 1.370000000000000e-11 4.670000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.510000000000000e+02 -3.219922639125691e-01 -9.017748109607415e-01 -2.135970439267516e-01 1.936478120788634e-01 1.090000000000000e-10 -3.850000000000000e-11 -1.660000000000000e-11 -1.590000000000000e-11 1.730000000000000e-11 -3.870000000000000e-12 1.250000000000000e-11 5.370000000000000e-11 1.370000000000000e-11 4.670000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.520000000000000e+02 -3.219920294642868e-01 -9.017604721984283e-01 -2.136392405751820e-01 1.936684244485855e-01 1.090000000000000e-10 -3.850000000000000e-11 -1.660000000000000e-11 -1.590000000000000e-11 1.730000000000000e-11 -3.870000000000000e-12 1.250000000000000e-11 5.370000000000000e-11 1.370000000000000e-11 4.670000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.530000000000000e+02 -3.219917645975769e-01 -9.017461400591041e-01 -2.136814414915322e-01 1.936890393954868e-01 1.090000000000000e-10 -3.850000000000000e-11 -1.660000000000000e-11 -1.590000000000000e-11 1.730000000000000e-11 -3.870000000000000e-12 1.250000000000000e-11 5.370000000000000e-11 1.370000000000000e-11 4.670000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.540000000000000e+02 -3.219915236244543e-01 -9.017317979313584e-01 -2.137236364932017e-01 1.937096551997450e-01 1.090000000000000e-10 -3.850000000000000e-11 -1.660000000000000e-11 -1.590000000000000e-11 1.730000000000000e-11 -3.870000000000000e-12 1.250000000000000e-11 5.370000000000000e-11 1.370000000000000e-11 4.670000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.550000000000000e+02 -3.219912709522317e-01 -9.017174573675011e-01 -2.137658238225331e-01 1.937302791892098e-01 1.090000000000000e-10 -3.850000000000000e-11 -1.660000000000000e-11 -1.590000000000000e-11 1.740000000000000e-11 -3.870000000000000e-12 1.250000000000000e-11 5.380000000000000e-11 1.370000000000000e-11 4.670000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.560000000000000e+02 -3.219910106325056e-01 -9.017031175794092e-01 -2.138080018168241e-01 1.937509101360011e-01 1.090000000000000e-10 -3.850000000000000e-11 -1.660000000000000e-11 -1.600000000000000e-11 1.740000000000000e-11 -3.880000000000000e-12 1.250000000000000e-11 5.380000000000000e-11 1.370000000000000e-11 4.670000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.570000000000000e+02 -3.219907466849032e-01 -9.016887764984172e-01 -2.138501761247719e-01 1.937715447569379e-01 1.090000000000000e-10 -3.850000000000000e-11 -1.660000000000000e-11 -1.600000000000000e-11 1.740000000000000e-11 -3.880000000000000e-12 1.250000000000000e-11 5.380000000000000e-11 1.370000000000000e-11 4.670000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.580000000000000e+02 -3.219904804073668e-01 -9.016744329302336e-01 -2.138923516425060e-01 1.937921810492194e-01 1.090000000000000e-10 -3.850000000000000e-11 -1.660000000000000e-11 -1.600000000000000e-11 1.740000000000000e-11 -3.880000000000000e-12 1.250000000000000e-11 5.380000000000000e-11 1.370000000000000e-11 4.670000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.590000000000000e+02 -3.219902065170655e-01 -9.016600873993651e-01 -2.139345304082259e-01 1.938128230976439e-01 1.090000000000000e-10 -3.850000000000000e-11 -1.660000000000000e-11 -1.600000000000000e-11 1.740000000000000e-11 -3.880000000000000e-12 1.250000000000000e-11 5.380000000000000e-11 1.380000000000000e-11 4.680000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.600000000000000e+02 -3.219899203384095e-01 -9.016457391666101e-01 -2.139767168686584e-01 1.938334771944004e-01 1.090000000000000e-10 -3.850000000000000e-11 -1.660000000000000e-11 -1.600000000000000e-11 1.740000000000000e-11 -3.880000000000000e-12 1.250000000000000e-11 5.380000000000000e-11 1.380000000000000e-11 4.680000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.610000000000000e+02 -3.219896241752229e-01 -9.016313874944660e-01 -2.140189098346785e-01 1.938541442463340e-01 1.090000000000000e-10 -3.850000000000000e-11 -1.660000000000000e-11 -1.600000000000000e-11 1.740000000000000e-11 -3.880000000000000e-12 1.250000000000000e-11 5.380000000000000e-11 1.380000000000000e-11 4.680000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.620000000000000e+02 -3.219893251966801e-01 -9.016170324519542e-01 -2.140611046820272e-01 1.938748171223600e-01 1.090000000000000e-10 -3.850000000000000e-11 -1.660000000000000e-11 -1.600000000000000e-11 1.740000000000000e-11 -3.880000000000000e-12 1.250000000000000e-11 5.380000000000000e-11 1.380000000000000e-11 4.680000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.630000000000000e+02 -3.219890090669191e-01 -9.016026798506162e-01 -2.141033023993850e-01 1.938954915101647e-01 1.090000000000000e-10 -3.850000000000000e-11 -1.660000000000000e-11 -1.600000000000000e-11 1.740000000000000e-11 -3.890000000000000e-12 1.250000000000000e-11 5.380000000000000e-11 1.380000000000000e-11 4.680000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.640000000000000e+02 -3.219887080136939e-01 -9.015883212627342e-01 -2.141454971272584e-01 1.939161595495244e-01 1.090000000000000e-10 -3.850000000000000e-11 -1.660000000000000e-11 -1.600000000000000e-11 1.740000000000000e-11 -3.890000000000000e-12 1.250000000000000e-11 5.380000000000000e-11 1.380000000000000e-11 4.680000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.650000000000000e+02 -3.219884038462826e-01 -9.015739648347887e-01 -2.141876851077781e-01 1.939368177236437e-01 1.090000000000000e-10 -3.860000000000000e-11 -1.660000000000000e-11 -1.600000000000000e-11 1.740000000000000e-11 -3.890000000000000e-12 1.250000000000000e-11 5.380000000000000e-11 1.380000000000000e-11 4.680000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.660000000000000e+02 -3.219880960446486e-01 -9.015596112210414e-01 -2.142298652252186e-01 1.939574650950343e-01 1.090000000000000e-10 -3.860000000000000e-11 -1.660000000000000e-11 -1.600000000000000e-11 1.740000000000000e-11 -3.890000000000000e-12 1.250000000000000e-11 5.380000000000000e-11 1.380000000000000e-11 4.690000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.670000000000000e+02 -3.219877844524855e-01 -9.015452580418987e-01 -2.142720431515901e-01 1.939781067264787e-01 1.090000000000000e-10 -3.860000000000000e-11 -1.660000000000000e-11 -1.600000000000000e-11 1.740000000000000e-11 -3.890000000000000e-12 1.250000000000000e-11 5.390000000000000e-11 1.380000000000000e-11 4.690000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.680000000000000e+02 -3.219874707474413e-01 -9.015309031147415e-01 -2.143142215360624e-01 1.939987470531091e-01 1.090000000000000e-10 -3.860000000000000e-11 -1.660000000000000e-11 -1.600000000000000e-11 1.740000000000000e-11 -3.890000000000000e-12 1.250000000000000e-11 5.390000000000000e-11 1.380000000000000e-11 4.690000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.690000000000000e+02 -3.219871580724346e-01 -9.015165442293109e-01 -2.143564031424474e-01 1.940193880752913e-01 1.090000000000000e-10 -3.860000000000000e-11 -1.660000000000000e-11 -1.600000000000000e-11 1.740000000000000e-11 -3.890000000000000e-12 1.250000000000000e-11 5.390000000000000e-11 1.380000000000000e-11 4.690000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.700000000000000e+02 -3.219868475847801e-01 -9.015021789950771e-01 -2.143985933661161e-01 1.940400330142591e-01 1.090000000000000e-10 -3.860000000000000e-11 -1.670000000000000e-11 -1.600000000000000e-11 1.740000000000000e-11 -3.900000000000000e-12 1.250000000000000e-11 5.390000000000000e-11 1.380000000000000e-11 4.690000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.710000000000000e+02 -3.219865411186140e-01 -9.014878074624865e-01 -2.144407881469412e-01 1.940606830707057e-01 1.090000000000000e-10 -3.860000000000000e-11 -1.670000000000000e-11 -1.610000000000000e-11 1.740000000000000e-11 -3.900000000000000e-12 1.260000000000000e-11 5.390000000000000e-11 1.380000000000000e-11 4.690000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.720000000000000e+02 -3.219862451487405e-01 -9.014734295783544e-01 -2.144829822752642e-01 1.940813335010957e-01 1.090000000000000e-10 -3.860000000000000e-11 -1.670000000000000e-11 -1.610000000000000e-11 1.740000000000000e-11 -3.900000000000000e-12 1.260000000000000e-11 5.390000000000000e-11 1.380000000000000e-11 4.690000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.730000000000000e+02 -3.219858874361039e-01 -9.014590681770942e-01 -2.145251845185313e-01 1.941019883992952e-01 1.090000000000000e-10 -3.860000000000000e-11 -1.670000000000000e-11 -1.610000000000000e-11 1.740000000000000e-11 -3.900000000000000e-12 1.260000000000000e-11 5.390000000000000e-11 1.380000000000000e-11 4.690000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.740000000000000e+02 -3.219855851379099e-01 -9.014446863569012e-01 -2.145673810190761e-01 1.941226401142341e-01 1.090000000000000e-10 -3.860000000000000e-11 -1.670000000000000e-11 -1.610000000000000e-11 1.740000000000000e-11 -3.900000000000000e-12 1.260000000000000e-11 5.390000000000000e-11 1.380000000000000e-11 4.690000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.750000000000000e+02 -3.219852625347343e-01 -9.014303086709590e-01 -2.146095751887100e-01 1.941432964517180e-01 1.090000000000000e-10 -3.860000000000000e-11 -1.670000000000000e-11 -1.610000000000000e-11 1.740000000000000e-11 -3.900000000000000e-12 1.260000000000000e-11 5.390000000000000e-11 1.380000000000000e-11 4.700000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.760000000000000e+02 -3.219849287592645e-01 -9.014159328372328e-01 -2.146517642636271e-01 1.941639559176347e-01 1.090000000000000e-10 -3.860000000000000e-11 -1.670000000000000e-11 -1.610000000000000e-11 1.740000000000000e-11 -3.910000000000000e-12 1.260000000000000e-11 5.390000000000000e-11 1.380000000000000e-11 4.700000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.770000000000000e+02 -3.219845916437044e-01 -9.014015560876831e-01 -2.146939504261452e-01 1.941846159641817e-01 1.090000000000000e-10 -3.860000000000000e-11 -1.670000000000000e-11 -1.610000000000000e-11 1.740000000000000e-11 -3.910000000000000e-12 1.260000000000000e-11 5.390000000000000e-11 1.380000000000000e-11 4.700000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.780000000000000e+02 -3.219842533683516e-01 -9.013871771187448e-01 -2.147361361960426e-01 1.942052762422284e-01 1.090000000000000e-10 -3.860000000000000e-11 -1.670000000000000e-11 -1.610000000000000e-11 1.740000000000000e-11 -3.910000000000000e-12 1.260000000000000e-11 5.390000000000000e-11 1.380000000000000e-11 4.700000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.790000000000000e+02 -3.219839152904621e-01 -9.013727935053205e-01 -2.147783270472866e-01 1.942259397027289e-01 1.100000000000000e-10 -3.860000000000000e-11 -1.670000000000000e-11 -1.610000000000000e-11 1.740000000000000e-11 -3.910000000000000e-12 1.260000000000000e-11 5.390000000000000e-11 1.380000000000000e-11 4.700000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.800000000000000e+02 -3.219835829580616e-01 -9.013584016765067e-01 -2.148205262365340e-01 1.942466101123027e-01 1.100000000000000e-10 -3.860000000000000e-11 -1.670000000000000e-11 -1.610000000000000e-11 1.740000000000000e-11 -3.910000000000000e-12 1.260000000000000e-11 5.400000000000000e-11 1.380000000000000e-11 4.700000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.810000000000000e+02 -3.219832557230164e-01 -9.013440021113677e-01 -2.148627319803672e-01 1.942672882855019e-01 1.100000000000000e-10 -3.860000000000000e-11 -1.670000000000000e-11 -1.610000000000000e-11 1.740000000000000e-11 -3.910000000000000e-12 1.260000000000000e-11 5.400000000000000e-11 1.380000000000000e-11 4.700000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.820000000000000e+02 -3.219829295138497e-01 -9.013295977359777e-01 -2.149049406759964e-01 1.942879713719470e-01 1.100000000000000e-10 -3.860000000000000e-11 -1.670000000000000e-11 -1.610000000000000e-11 1.740000000000000e-11 -3.910000000000000e-12 1.260000000000000e-11 5.400000000000000e-11 1.380000000000000e-11 4.710000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.830000000000000e+02 -3.219825981410418e-01 -9.013151920267028e-01 -2.149471509315682e-01 1.943086550378396e-01 1.100000000000000e-10 -3.860000000000000e-11 -1.670000000000000e-11 -1.610000000000000e-11 1.750000000000000e-11 -3.920000000000000e-12 1.260000000000000e-11 5.400000000000000e-11 1.380000000000000e-11 4.710000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.840000000000000e+02 -3.219822713613639e-01 -9.013007832602150e-01 -2.149893608631031e-01 1.943293331928414e-01 1.100000000000000e-10 -3.860000000000000e-11 -1.670000000000000e-11 -1.610000000000000e-11 1.750000000000000e-11 -3.920000000000000e-12 1.260000000000000e-11 5.400000000000000e-11 1.380000000000000e-11 4.710000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.850000000000000e+02 -3.219819404333636e-01 -9.012863758537576e-01 -2.150315708570811e-01 1.943499994080300e-01 1.100000000000000e-10 -3.860000000000000e-11 -1.680000000000000e-11 -1.610000000000000e-11 1.750000000000000e-11 -3.920000000000000e-12 1.260000000000000e-11 5.400000000000000e-11 1.380000000000000e-11 4.710000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.860000000000000e+02 -3.219816078609027e-01 -9.012719688809647e-01 -2.150737801130032e-01 1.943706547209248e-01 1.100000000000000e-10 -3.860000000000000e-11 -1.680000000000000e-11 -1.620000000000000e-11 1.750000000000000e-11 -3.920000000000000e-12 1.260000000000000e-11 5.400000000000000e-11 1.380000000000000e-11 4.710000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.870000000000000e+02 -3.219812749389822e-01 -9.012575606332051e-01 -2.151159878054700e-01 1.943913058257224e-01 1.100000000000000e-10 -3.860000000000000e-11 -1.680000000000000e-11 -1.620000000000000e-11 1.750000000000000e-11 -3.920000000000000e-12 1.260000000000000e-11 5.400000000000000e-11 1.380000000000000e-11 4.710000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.880000000000000e+02 -3.219809416132600e-01 -9.012431500033679e-01 -2.151581942694656e-01 1.944119575760410e-01 1.100000000000000e-10 -3.860000000000000e-11 -1.680000000000000e-11 -1.620000000000000e-11 1.750000000000000e-11 -3.920000000000000e-12 1.260000000000000e-11 5.400000000000000e-11 1.380000000000000e-11 4.710000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.890000000000000e+02 -3.219806103302515e-01 -9.012287345197774e-01 -2.152004016703895e-01 1.944326149804666e-01 1.100000000000000e-10 -3.860000000000000e-11 -1.680000000000000e-11 -1.620000000000000e-11 1.750000000000000e-11 -3.920000000000000e-12 1.260000000000000e-11 5.400000000000000e-11 1.380000000000000e-11 4.710000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.900000000000000e+02 -3.219802820660044e-01 -9.012143126529402e-01 -2.152426087507238e-01 1.944532848999153e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.680000000000000e-11 -1.620000000000000e-11 1.750000000000000e-11 -3.930000000000000e-12 1.270000000000000e-11 5.410000000000000e-11 1.380000000000000e-11 4.720000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.910000000000000e+02 -3.219799558001253e-01 -9.011998846104521e-01 -2.152848142939691e-01 1.944739694032817e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.680000000000000e-11 -1.620000000000000e-11 1.750000000000000e-11 -3.930000000000000e-12 1.270000000000000e-11 5.410000000000000e-11 1.380000000000000e-11 4.720000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.920000000000000e+02 -3.219796232793420e-01 -9.011853995123247e-01 -2.153268059962963e-01 1.944951529425298e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.680000000000000e-11 -1.620000000000000e-11 1.750000000000000e-11 -3.930000000000000e-12 1.270000000000000e-11 5.410000000000000e-11 1.390000000000000e-11 4.720000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.930000000000000e+02 -3.219792665403573e-01 -9.011709698629604e-01 -2.153689868661844e-01 1.945158977837506e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.680000000000000e-11 -1.620000000000000e-11 1.750000000000000e-11 -3.930000000000000e-12 1.270000000000000e-11 5.410000000000000e-11 1.390000000000000e-11 4.720000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.940000000000000e+02 -3.219789077921466e-01 -9.011565375394933e-01 -2.154111672637523e-01 1.945366464316590e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.680000000000000e-11 -1.620000000000000e-11 1.750000000000000e-11 -3.930000000000000e-12 1.270000000000000e-11 5.410000000000000e-11 1.390000000000000e-11 4.720000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.950000000000000e+02 -3.219785463552684e-01 -9.011421027557223e-01 -2.154533472589373e-01 1.945573989414520e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.680000000000000e-11 -1.620000000000000e-11 1.750000000000000e-11 -3.930000000000000e-12 1.270000000000000e-11 5.410000000000000e-11 1.390000000000000e-11 4.730000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.960000000000000e+02 -3.219781822467447e-01 -9.011276655061126e-01 -2.154955268489741e-01 1.945781553121246e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.680000000000000e-11 -1.620000000000000e-11 1.750000000000000e-11 -3.930000000000000e-12 1.270000000000000e-11 5.410000000000000e-11 1.390000000000000e-11 4.730000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.970000000000000e+02 -3.219778154458176e-01 -9.011132257969544e-01 -2.155377060352163e-01 1.945989155458549e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.680000000000000e-11 -1.620000000000000e-11 1.750000000000000e-11 -3.930000000000000e-12 1.270000000000000e-11 5.410000000000000e-11 1.390000000000000e-11 4.730000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.980000000000000e+02 -3.219774459554372e-01 -9.010987836271451e-01 -2.155798848163648e-01 1.946196796427749e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.680000000000000e-11 -1.620000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.410000000000000e-11 1.390000000000000e-11 4.730000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.990000000000000e+02 -3.219770737927883e-01 -9.010843389910734e-01 -2.156220631896984e-01 1.946404476019086e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.680000000000000e-11 -1.620000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.410000000000000e-11 1.390000000000000e-11 4.730000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.000000000000000e+02 -3.219766989454080e-01 -9.010698918924912e-01 -2.156642411555240e-01 1.946612194246308e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.730000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.010000000000000e+02 -3.219763214104970e-01 -9.010554423320334e-01 -2.157064187133214e-01 1.946819951116724e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.730000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.020000000000000e+02 -3.219759411858347e-01 -9.010409903102253e-01 -2.157485958623293e-01 1.947027746635822e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.030000000000000e+02 -3.219755582975752e-01 -9.010265358186563e-01 -2.157907725988369e-01 1.947235580786093e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.040000000000000e+02 -3.219751727141605e-01 -9.010120788670190e-01 -2.158329489253131e-01 1.947443453598143e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.050000000000000e+02 -3.219747844511686e-01 -9.009976194502335e-01 -2.158751248391465e-01 1.947651365063028e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.060000000000000e+02 -3.219743935020575e-01 -9.009831575701626e-01 -2.159173003400842e-01 1.947859315190191e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.070000000000000e+02 -3.219739998864204e-01 -9.009686932204620e-01 -2.159594754251005e-01 1.948067303967399e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.080000000000000e+02 -3.219736035726887e-01 -9.009542264108278e-01 -2.160016500966586e-01 1.948275331425328e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.090000000000000e+02 -3.219732045792668e-01 -9.009397571352905e-01 -2.160438243518558e-01 1.948483397552718e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.100000000000000e+02 -3.219728029193278e-01 -9.009252853895284e-01 -2.160859981883347e-01 1.948691502342521e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.110000000000000e+02 -3.219723985650909e-01 -9.009108111820444e-01 -2.161281716081615e-01 1.948899645822382e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.120000000000000e+02 -3.219719915400016e-01 -9.008963345052819e-01 -2.161703446079140e-01 1.949107827976891e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.130000000000000e+02 -3.219715818214544e-01 -9.008818553661632e-01 -2.162125171889988e-01 1.949316048828596e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.140000000000000e+02 -3.219711694375485e-01 -9.008673737556651e-01 -2.162546893475150e-01 1.949524308358276e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.150000000000000e+02 -3.219707543628158e-01 -9.008528896815633e-01 -2.162968610852836e-01 1.949732606591732e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.160000000000000e+02 -3.219703366238687e-01 -9.008384031353041e-01 -2.163390323985599e-01 1.949940943510932e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.170000000000000e+02 -3.219699161809764e-01 -9.008239141292026e-01 -2.163812032905146e-01 1.950149319152437e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.180000000000000e+02 -3.219694930829683e-01 -9.008094226477085e-01 -2.164233737551101e-01 1.950357733480053e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.190000000000000e+02 -3.219690672977346e-01 -9.007949287006889e-01 -2.164655437948484e-01 1.950566186525039e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.200000000000000e+02 -3.219686388293415e-01 -9.007804322866905e-01 -2.165077134083149e-01 1.950774678287761e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.210000000000000e+02 -3.219682076865519e-01 -9.007659334027813e-01 -2.165498825936104e-01 1.950983208764727e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.220000000000000e+02 -3.219677738740793e-01 -9.007514320472321e-01 -2.165920513494358e-01 1.951191777957105e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.230000000000000e+02 -3.219673373715257e-01 -9.007369282262937e-01 -2.166342196768978e-01 1.951400385885283e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.240000000000000e+02 -3.219668981864061e-01 -9.007224219374037e-01 -2.166763875742861e-01 1.951609032547242e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.250000000000000e+02 -3.219664563412089e-01 -9.007079131733076e-01 -2.167185550382908e-01 1.951817717928216e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.260000000000000e+02 -3.219660118153079e-01 -9.006934019402564e-01 -2.167607220702205e-01 1.952026442050149e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.270000000000000e+02 -3.219655645977714e-01 -9.006788882415204e-01 -2.168028886702030e-01 1.952235204925701e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.280000000000000e+02 -3.219651147267000e-01 -9.006643720649291e-01 -2.168450548333253e-01 1.952444006527255e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.290000000000000e+02 -3.219646621620403e-01 -9.006498534228518e-01 -2.168872205628890e-01 1.952652846892751e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.300000000000000e+02 -3.219642069296722e-01 -9.006353323069662e-01 -2.169293858552387e-01 1.952861726004600e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.310000000000000e+02 -3.219637490089515e-01 -9.006208087235783e-01 -2.169715507115579e-01 1.953070643883905e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.320000000000000e+02 -3.219632884303869e-01 -9.006062826629079e-01 -2.170137151277189e-01 1.953279600509235e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.330000000000000e+02 -3.219628251666159e-01 -9.005917541333280e-01 -2.170558791057139e-01 1.953488595908151e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.340000000000000e+02 -3.219623592206522e-01 -9.005772231337184e-01 -2.170980426442357e-01 1.953697630081855e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.350000000000000e+02 -3.219618906249252e-01 -9.005626896536943e-01 -2.171402057389645e-01 1.953906703007276e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.360000000000000e+02 -3.219614193298629e-01 -9.005481537086236e-01 -2.171823683941629e-01 1.954115814730333e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.370000000000000e+02 -3.219609453672988e-01 -9.005336152883092e-01 -2.172245306055721e-01 1.954324965228444e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.380000000000000e+02 -3.219604687289755e-01 -9.005190743951567e-01 -2.172666923731010e-01 1.954534154512551e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.390000000000000e+02 -3.219599894229101e-01 -9.005045310264702e-01 -2.173088536949320e-01 1.954743382579698e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.400000000000000e+02 -3.219595074459787e-01 -9.004899851829895e-01 -2.173510145705682e-01 1.954952649437503e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.410000000000000e+02 -3.219590227854878e-01 -9.004754368685408e-01 -2.173931750003083e-01 1.955161955100131e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.420000000000000e+02 -3.219585354488587e-01 -9.004608860805923e-01 -2.174353349824558e-01 1.955371299565583e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.430000000000000e+02 -3.219580454576942e-01 -9.004463328121700e-01 -2.174774945138072e-01 1.955580682819636e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.440000000000000e+02 -3.219575527781942e-01 -9.004317770736744e-01 -2.175196535969953e-01 1.955790104895317e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.450000000000000e+02 -3.219570574263400e-01 -9.004172188599019e-01 -2.175618122293902e-01 1.955999565783068e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.460000000000000e+02 -3.219565594115608e-01 -9.004026581677133e-01 -2.176039704090320e-01 1.956209065478730e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.470000000000000e+02 -3.219560587270593e-01 -9.003880949990047e-01 -2.176461281357961e-01 1.956418603992971e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.480000000000000e+02 -3.219555553535924e-01 -9.003735293596664e-01 -2.176882854106438e-01 1.956628181345447e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.490000000000000e+02 -3.219550493136437e-01 -9.003589612424230e-01 -2.177304422303451e-01 1.956837797521620e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.500000000000000e+02 -3.219545406192763e-01 -9.003443906433058e-01 -2.177725985926744e-01 1.957047452515117e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.510000000000000e+02 -3.219540292395578e-01 -9.003298175718123e-01 -2.178147544999604e-01 1.957257146356687e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.520000000000000e+02 -3.219535151876525e-01 -9.003152420236267e-01 -2.178569099498638e-01 1.957466879039069e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.530000000000000e+02 -3.219529984762396e-01 -9.003006639945869e-01 -2.178990649400962e-01 1.957676650555360e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.540000000000000e+02 -3.219524790820589e-01 -9.002860834917737e-01 -2.179412194722023e-01 1.957886460929977e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.550000000000000e+02 -3.219519570288119e-01 -9.002715005075542e-01 -2.179833735427743e-01 1.958096310146835e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.560000000000000e+02 -3.219514322911839e-01 -9.002569150497058e-01 -2.180255271534421e-01 1.958306198231167e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.570000000000000e+02 -3.219509049028636e-01 -9.002423271074500e-01 -2.180676802997871e-01 1.958516125158537e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.580000000000000e+02 -3.219503748309416e-01 -9.002277366909076e-01 -2.181098329843276e-01 1.958726090961438e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.590000000000000e+02 -3.219498420924998e-01 -9.002131437945299e-01 -2.181519852043307e-01 1.958936095629294e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.600000000000000e+02 -3.219493066904841e-01 -9.001985484172196e-01 -2.181941369584972e-01 1.959146139163292e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.610000000000000e+02 -3.219487686240959e-01 -9.001839505589854e-01 -2.182362882460883e-01 1.959356221569135e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.620000000000000e+02 -3.219482278718870e-01 -9.001693502264125e-01 -2.182784390682737e-01 1.959566342868435e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.630000000000000e+02 -3.219476844545791e-01 -9.001547474127818e-01 -2.183205894220146e-01 1.959776503047991e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.640000000000000e+02 -3.219471383910062e-01 -9.001401421119934e-01 -2.183627393044056e-01 1.959986702095673e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.650000000000000e+02 -3.219465896478049e-01 -9.001255343343111e-01 -2.184048887180000e-01 1.960196940044465e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.660000000000000e+02 -3.219460382275890e-01 -9.001109240787428e-01 -2.184470376615301e-01 1.960407216895855e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.670000000000000e+02 -3.219454841429953e-01 -9.000963113411160e-01 -2.184891861327779e-01 1.960617532643373e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.680000000000000e+02 -3.219449274034260e-01 -9.000816961183008e-01 -2.185313341297923e-01 1.960827887282783e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.690000000000000e+02 -3.219443679893100e-01 -9.000670784162184e-01 -2.185734816537275e-01 1.961038280835549e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.700000000000000e+02 -3.219438059051564e-01 -9.000524582332800e-01 -2.186156287031256e-01 1.961248713301556e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.710000000000000e+02 -3.219432411606576e-01 -9.000378355662652e-01 -2.186577752760069e-01 1.961459184676321e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.720000000000000e+02 -3.219426737526576e-01 -9.000232104159253e-01 -2.186999213718678e-01 1.961669694967526e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.730000000000000e+02 -3.219421036751436e-01 -9.000085827839859e-01 -2.187420669903111e-01 1.961880244183896e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.740000000000000e+02 -3.219415309264645e-01 -8.999939526707738e-01 -2.187842121305599e-01 1.962090832330950e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.750000000000000e+02 -3.219409555219083e-01 -8.999793200713069e-01 -2.188263567900725e-01 1.962301459399468e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.760000000000000e+02 -3.219403774543580e-01 -8.999646849875843e-01 -2.188685009687430e-01 1.962512125400476e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.770000000000000e+02 -3.219397967024194e-01 -8.999500474261750e-01 -2.189106446677178e-01 1.962722830355689e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.780000000000000e+02 -3.219392133164173e-01 -8.999354073710645e-01 -2.189527878809365e-01 1.962933574226308e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.790000000000000e+02 -3.219386272382846e-01 -8.999207648402950e-01 -2.189949306134089e-01 1.963144357066373e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.800000000000000e+02 -3.219380385149216e-01 -8.999061198189312e-01 -2.190370728594217e-01 1.963355178839955e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.810000000000000e+02 -3.219374471124733e-01 -8.998914723174410e-01 -2.190792146214288e-01 1.963566039579765e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.820000000000000e+02 -3.219368530626573e-01 -8.998768223256695e-01 -2.191213558952443e-01 1.963776939262658e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.830000000000000e+02 -3.219362563432026e-01 -8.998621698503879e-01 -2.191634966822781e-01 1.963987877912496e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.840000000000000e+02 -3.219356569492631e-01 -8.998475148929550e-01 -2.192056369820103e-01 1.964198855537056e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.850000000000000e+02 -3.219350549103084e-01 -8.998328574439236e-01 -2.192477767904845e-01 1.964409872115042e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.860000000000000e+02 -3.219344502048492e-01 -8.998181975098193e-01 -2.192899161090291e-01 1.964620927669679e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.870000000000000e+02 -3.219338428300535e-01 -8.998035350913663e-01 -2.193320549369214e-01 1.964832022207038e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.880000000000000e+02 -3.219332327931379e-01 -8.997888701861012e-01 -2.193741932724945e-01 1.965043155725122e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.890000000000000e+02 -3.219326201000821e-01 -8.997742027919732e-01 -2.194163311141455e-01 1.965254328222514e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.900000000000000e+02 -3.219320047502194e-01 -8.997595329089516e-01 -2.194584684611168e-01 1.965465539704808e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.910000000000000e+02 -3.219313867318701e-01 -8.997448605405473e-01 -2.195006053135691e-01 1.965676790185582e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.920000000000000e+02 -3.219307660409341e-01 -8.997301856878598e-01 -2.195427416709654e-01 1.965888079672454e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.930000000000000e+02 -3.219301427113014e-01 -8.997155083400511e-01 -2.195848775289181e-01 1.966099408140257e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.940000000000000e+02 -3.219295167170902e-01 -8.997008285050301e-01 -2.196270128891845e-01 1.966310775616030e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.950000000000000e+02 -3.219288880470694e-01 -8.996861461861666e-01 -2.196691477518771e-01 1.966522182113008e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.960000000000000e+02 -3.219282567248635e-01 -8.996714613758554e-01 -2.197112821136345e-01 1.966733627614732e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.970000000000000e+02 -3.219276227569147e-01 -8.996567740718274e-01 -2.197534159729904e-01 1.966945112120733e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.980000000000000e+02 -3.219269861151495e-01 -8.996420842827559e-01 -2.197955493317334e-01 1.967156635658597e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.990000000000000e+02 -3.219263468029788e-01 -8.996273920073761e-01 -2.198376821885755e-01 1.967368198229555e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.000000000000000e+02 -3.219257048563141e-01 -8.996126972342139e-01 -2.198798145389387e-01 1.967579799806602e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.010000000000000e+02 -3.219250602382389e-01 -8.995979999746533e-01 -2.199219463856673e-01 1.967791440426288e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.020000000000000e+02 -3.219244129621390e-01 -8.995833002243133e-01 -2.199640777264232e-01 1.968003120080841e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.030000000000000e+02 -3.219237630267062e-01 -8.995685979834401e-01 -2.200062085603285e-01 1.968214838775034e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.040000000000000e+02 -3.219231104407307e-01 -8.995538932490255e-01 -2.200483388856843e-01 1.968426596506382e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.050000000000000e+02 -3.219224551922159e-01 -8.995391860246814e-01 -2.200904687026730e-01 1.968638393288797e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.060000000000000e+02 -3.219217972716885e-01 -8.995244763132002e-01 -2.201325980112856e-01 1.968850229134522e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.070000000000000e+02 -3.219211367210969e-01 -8.995097641012078e-01 -2.201747268063559e-01 1.969062104011275e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.080000000000000e+02 -3.219204735020144e-01 -8.994950494005639e-01 -2.202168550908650e-01 1.969274017957001e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.090000000000000e+02 -3.219198076124689e-01 -8.994803322117239e-01 -2.202589828639983e-01 1.969485970977070e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.100000000000000e+02 -3.219191390775707e-01 -8.994656125266158e-01 -2.203011101222612e-01 1.969697963053594e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.110000000000000e+02 -3.219184679006571e-01 -8.994508903439499e-01 -2.203432368644968e-01 1.969909994188723e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.120000000000000e+02 -3.219177940430100e-01 -8.994361656757510e-01 -2.203853630935251e-01 1.970122064419367e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.130000000000000e+02 -3.219171175392713e-01 -8.994214385109223e-01 -2.204274888049717e-01 1.970334173719887e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.140000000000000e+02 -3.219164383825774e-01 -8.994067088514598e-01 -2.204696139985063e-01 1.970546322099826e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.150000000000000e+02 -3.219157565731651e-01 -8.993919766970492e-01 -2.205117386732772e-01 1.970758509564012e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.160000000000000e+02 -3.219150721042968e-01 -8.993772420496473e-01 -2.205538628289397e-01 1.970970736121893e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.170000000000000e+02 -3.219143849718900e-01 -8.993625049103501e-01 -2.205959864649466e-01 1.971183001781109e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.180000000000000e+02 -3.219136951943625e-01 -8.993477652731932e-01 -2.206381095784713e-01 1.971395306529441e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.190000000000000e+02 -3.219130027689926e-01 -8.993330231387948e-01 -2.206802321689540e-01 1.971607650374260e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.200000000000000e+02 -3.219123076792701e-01 -8.993182785121889e-01 -2.207223542370111e-01 1.971820033333459e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.210000000000000e+02 -3.219116099379856e-01 -8.993035313891833e-01 -2.207644757803721e-01 1.972032455399655e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.220000000000000e+02 -3.219109095487033e-01 -8.992887817684171e-01 -2.208065967978567e-01 1.972244916574802e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.230000000000000e+02 -3.219102064988365e-01 -8.992740296536894e-01 -2.208487172896928e-01 1.972457416873417e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.240000000000000e+02 -3.219095007929034e-01 -8.992592750433875e-01 -2.208908372544846e-01 1.972669956295721e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.250000000000000e+02 -3.219087924445028e-01 -8.992445179330666e-01 -2.209329566898852e-01 1.972882534833598e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.260000000000000e+02 -3.219080814335762e-01 -8.992297583288029e-01 -2.209750755970345e-01 1.973095152509428e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.270000000000000e+02 -3.219073677748688e-01 -8.992149962257897e-01 -2.210171939734733e-01 1.973307809314107e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.280000000000000e+02 -3.219066514698394e-01 -8.992002316234043e-01 -2.210593118180475e-01 1.973520505250013e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.290000000000000e+02 -3.219059325069871e-01 -8.991854645250291e-01 -2.211014291310548e-01 1.973733240332142e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.300000000000000e+02 -3.219052108889170e-01 -8.991706949296798e-01 -2.211435459112268e-01 1.973946014561890e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.310000000000000e+02 -3.219044866185913e-01 -8.991559228362352e-01 -2.211856621573219e-01 1.974158827940808e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.320000000000000e+02 -3.219037597100093e-01 -8.991411482401248e-01 -2.212277778669568e-01 1.974371680460376e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.330000000000000e+02 -3.219030301458910e-01 -8.991263711465498e-01 -2.212698930409930e-01 1.974584572140630e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.340000000000000e+02 -3.219022979190390e-01 -8.991115915576137e-01 -2.213120076791212e-01 1.974797502991479e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.350000000000000e+02 -3.219015630526627e-01 -8.990968094658451e-01 -2.213541217780585e-01 1.975010472996404e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.360000000000000e+02 -3.219008255366156e-01 -8.990820248742012e-01 -2.213962353379658e-01 1.975223482169248e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.370000000000000e+02 -3.219000853722130e-01 -8.990672377821041e-01 -2.214383483577016e-01 1.975436530512511e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.380000000000000e+02 -3.218993425457886e-01 -8.990524481936688e-01 -2.214804608376476e-01 1.975649618042206e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.390000000000000e+02 -3.218985970771029e-01 -8.990376561025105e-01 -2.215225727748612e-01 1.975862744744777e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.400000000000000e+02 -3.218978489722366e-01 -8.990228615064770e-01 -2.215646841679170e-01 1.976075910619939e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.410000000000000e+02 -3.218970982031338e-01 -8.990080644142391e-01 -2.216067950185387e-01 1.976289115695795e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.420000000000000e+02 -3.218963447843032e-01 -8.989932648210406e-01 -2.216489053243572e-01 1.976502359963819e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.430000000000000e+02 -3.218955887191628e-01 -8.989784627256429e-01 -2.216910150840257e-01 1.976715643424667e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.440000000000000e+02 -3.218948300162674e-01 -8.989636581251149e-01 -2.217331242958781e-01 1.976928966075890e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.450000000000000e+02 -3.218940686518681e-01 -8.989488510267709e-01 -2.217752329612128e-01 1.977142327941886e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.460000000000000e+02 -3.218933046481005e-01 -8.989340414234799e-01 -2.218173410768611e-01 1.977355729006955e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.470000000000000e+02 -3.218925379949250e-01 -8.989192293181649e-01 -2.218594486429659e-01 1.977569169284899e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.480000000000000e+02 -3.218917686967860e-01 -8.989044147092645e-01 -2.219015556580807e-01 1.977782648775478e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.490000000000000e+02 -3.218909967435207e-01 -8.988895975997909e-01 -2.219436621222384e-01 1.977996167491696e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.500000000000000e+02 -3.218902221547888e-01 -8.988747779833928e-01 -2.219857680325145e-01 1.978209725419975e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.510000000000000e+02 -3.218894449148151e-01 -8.988599558647993e-01 -2.220278733896068e-01 1.978423322579168e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.520000000000000e+02 -3.218886650250930e-01 -8.988451312433784e-01 -2.220699781923548e-01 1.978636958971614e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.530000000000000e+02 -3.218878824889151e-01 -8.988303041179319e-01 -2.221120824394233e-01 1.978850634598067e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.540000000000000e+02 -3.218870973186471e-01 -8.988154744843289e-01 -2.221541861287796e-01 1.979064349452705e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.550000000000000e+02 -3.218863094924695e-01 -8.988006423492776e-01 -2.221962892615221e-01 1.979278103558319e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.560000000000000e+02 -3.218855190226347e-01 -8.987858077087342e-01 -2.222383918355083e-01 1.979491896908257e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.570000000000000e+02 -3.218847259098820e-01 -8.987709705623040e-01 -2.222804938496511e-01 1.979705729505518e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.580000000000000e+02 -3.218839301593588e-01 -8.987561309081296e-01 -2.223225953026171e-01 1.979919601350591e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.590000000000000e+02 -3.218831317468945e-01 -8.987412887536599e-01 -2.223646961957270e-01 1.980133512468390e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.600000000000000e+02 -3.218823307059799e-01 -8.987264440881889e-01 -2.224067965247273e-01 1.980347462833081e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.610000000000000e+02 -3.218815270138535e-01 -8.987115969186467e-01 -2.224488962909813e-01 1.980561452469730e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.620000000000000e+02 -3.218807206874706e-01 -8.986967472395340e-01 -2.224909954918354e-01 1.980775481367039e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.630000000000000e+02 -3.218799116946036e-01 -8.986818950608104e-01 -2.225330941294426e-01 1.980989549557531e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.640000000000000e+02 -3.218791000866202e-01 -8.986670403661433e-01 -2.225751921978307e-01 1.981203656999534e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.650000000000000e+02 -3.218782858247360e-01 -8.986521831675067e-01 -2.226172896999037e-01 1.981417803732292e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.660000000000000e+02 -3.218774689164637e-01 -8.986373234623748e-01 -2.226593866339195e-01 1.981631989752821e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.670000000000000e+02 -3.218766493600411e-01 -8.986224612511161e-01 -2.227014829990900e-01 1.981846215066788e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.680000000000000e+02 -3.218758271777757e-01 -8.986075965265473e-01 -2.227435787922501e-01 1.982060479658107e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.690000000000000e+02 -3.218750023503273e-01 -8.985927292945212e-01 -2.227856740144251e-01 1.982274783548905e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.700000000000000e+02 -3.218741748621777e-01 -8.985778595597629e-01 -2.228277686660880e-01 1.982489126756557e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.710000000000000e+02 -3.218733447587316e-01 -8.985629873078169e-01 -2.228698627418561e-01 1.982703509244511e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.720000000000000e+02 -3.218725119999928e-01 -8.985481125510401e-01 -2.229119562447354e-01 1.982917931053204e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.730000000000000e+02 -3.218716766081344e-01 -8.985332352822908e-01 -2.229540491715779e-01 1.983132392166634e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.740000000000000e+02 -3.218708385634387e-01 -8.985183555075920e-01 -2.229961415233178e-01 1.983346892606389e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.750000000000000e+02 -3.218699978916402e-01 -8.985034732186808e-01 -2.230382332964667e-01 1.983561432353274e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.760000000000000e+02 -3.218691545700970e-01 -8.984885884224508e-01 -2.230803244923585e-01 1.983776011432409e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.770000000000000e+02 -3.218683086081998e-01 -8.984737011157854e-01 -2.231224151090733e-01 1.983990629839105e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.780000000000000e+02 -3.218674600225478e-01 -8.984588112932987e-01 -2.231645051440019e-01 1.984205287562228e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.790000000000000e+02 -3.218666087849638e-01 -8.984439189636265e-01 -2.232065945990047e-01 1.984419984631861e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.800000000000000e+02 -3.218657548994883e-01 -8.984290241253370e-01 -2.232486834726742e-01 1.984634721048056e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.810000000000000e+02 -3.218648983896430e-01 -8.984141267708400e-01 -2.232907717618003e-01 1.984849496793987e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.820000000000000e+02 -3.218640392427991e-01 -8.983992269039522e-01 -2.233328594665722e-01 1.985064311884508e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.830000000000000e+02 -3.218631774426161e-01 -8.983843245295828e-01 -2.233749465877115e-01 1.985279166339217e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.840000000000000e+02 -3.218623130134625e-01 -8.983694196399004e-01 -2.234170331218697e-01 1.985494060140040e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.850000000000000e+02 -3.218614459533055e-01 -8.983545122353861e-01 -2.234591190682214e-01 1.985708993292409e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.860000000000000e+02 -3.218605762485763e-01 -8.983396023200767e-01 -2.235012044272220e-01 1.985923965813455e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.870000000000000e+02 -3.218597039112047e-01 -8.983246898900570e-01 -2.235432891967123e-01 1.986138977696164e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.880000000000000e+02 -3.218588289221030e-01 -8.983097749511524e-01 -2.235853733775516e-01 1.986354028961691e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.890000000000000e+02 -3.218579513136164e-01 -8.982948574930206e-01 -2.236274569656363e-01 1.986569119584768e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.900000000000000e+02 -3.218570710586486e-01 -8.982799375239578e-01 -2.236695399627076e-01 1.986784249594638e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.910000000000000e+02 -3.218561881760022e-01 -8.982650150378858e-01 -2.237116223659537e-01 1.986999418978114e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.920000000000000e+02 -3.218553026453144e-01 -8.982500900410311e-01 -2.237537041763512e-01 1.987214627757520e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.930000000000000e+02 -3.218544144864028e-01 -8.982351625269962e-01 -2.237957853909935e-01 1.987429875918752e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.940000000000000e+02 -3.218535236946994e-01 -8.982202324969847e-01 -2.238378660094738e-01 1.987645163470916e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.950000000000000e+02 -3.218526302553428e-01 -8.982052999555171e-01 -2.238799460321824e-01 1.987860490430971e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.960000000000000e+02 -3.218517341997694e-01 -8.981903648925379e-01 -2.239220254551118e-01 1.988075856774358e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.970000000000000e+02 -3.218508354956876e-01 -8.981754273179792e-01 -2.239641042804861e-01 1.988291262535067e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.980000000000000e+02 -3.218499341675034e-01 -8.981604872239995e-01 -2.240061825049670e-01 1.988506707694822e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.990000000000000e+02 -3.218490301839905e-01 -8.981455446202455e-01 -2.240482601305529e-01 1.988722192285775e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.000000000000000e+02 -3.218481235854248e-01 -8.981305994938801e-01 -2.240903371524036e-01 1.988937716275370e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.010000000000000e+02 -3.218472143618804e-01 -8.981156518477941e-01 -2.241324135706188e-01 1.989153279677534e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.020000000000000e+02 -3.218463024790302e-01 -8.981007016926362e-01 -2.241744893874250e-01 1.989368882526777e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.030000000000000e+02 -3.218453879795403e-01 -8.980857490148170e-01 -2.242165645977604e-01 1.989584524788350e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.040000000000000e+02 -3.218444708449626e-01 -8.980707938199103e-01 -2.242586392025285e-01 1.989800206483876e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.050000000000000e+02 -3.218435510761274e-01 -8.980558361074968e-01 -2.243007132006267e-01 1.990015927616234e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.060000000000000e+02 -3.218426286688656e-01 -8.980408758787068e-01 -2.243427865914856e-01 1.990231688193285e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.070000000000000e+02 -3.218417036401615e-01 -8.980259131280356e-01 -2.243848593724774e-01 1.990447488203341e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.080000000000000e+02 -3.218407759781101e-01 -8.980109478589976e-01 -2.244269315438833e-01 1.990663327662157e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.090000000000000e+02 -3.218398456774633e-01 -8.979959800730878e-01 -2.244690031051738e-01 1.990879206578106e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.100000000000000e+02 -3.218389127508754e-01 -8.979810097661651e-01 -2.245110740541312e-01 1.991095124943387e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.110000000000000e+02 -3.218379771923778e-01 -8.979660369398758e-01 -2.245531443904747e-01 1.991311082768416e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.120000000000000e+02 -3.218370389984176e-01 -8.979510615951803e-01 -2.245952141135142e-01 1.991527080060033e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.130000000000000e+02 -3.218360981742026e-01 -8.979360837302578e-01 -2.246372832217944e-01 1.991743116817626e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.140000000000000e+02 -3.218351547284670e-01 -8.979211033422013e-01 -2.246793517134691e-01 1.991959193036917e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.150000000000000e+02 -3.218342086493173e-01 -8.979061204345223e-01 -2.247214195888129e-01 1.992175308733683e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.160000000000000e+02 -3.218332599356038e-01 -8.978911350074261e-01 -2.247634868469088e-01 1.992391463912604e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.170000000000000e+02 -3.218323085936010e-01 -8.978761470587548e-01 -2.248055534862012e-01 1.992607658572086e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.180000000000000e+02 -3.218313546244855e-01 -8.978611565879823e-01 -2.248476195055547e-01 1.992823892714686e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.190000000000000e+02 -3.218303980255106e-01 -8.978461635957399e-01 -2.248896849043818e-01 1.993040166347915e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.200000000000000e+02 -3.218294387882498e-01 -8.978311680845241e-01 -2.249317496824474e-01 1.993256479483058e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.210000000000000e+02 -3.218284769400879e-01 -8.978161700455580e-01 -2.249738138361573e-01 1.993472832098872e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.220000000000000e+02 -3.218275124583851e-01 -8.978011694857364e-01 -2.250158773667892e-01 1.993689224220929e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.230000000000000e+02 -3.218265453470054e-01 -8.977861664036861e-01 -2.250579402729543e-01 1.993905655849351e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.240000000000000e+02 -3.218255755929619e-01 -8.977711608033143e-01 -2.251000025549015e-01 1.994122127000043e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.250000000000000e+02 -3.218246032353945e-01 -8.977561526721436e-01 -2.251420642079418e-01 1.994338637641027e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.260000000000000e+02 -3.218236282362639e-01 -8.977411420219170e-01 -2.251841252347874e-01 1.994555187811929e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.270000000000000e+02 -3.218226506058978e-01 -8.977261288492272e-01 -2.252261856334456e-01 1.994771777506993e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.280000000000000e+02 -3.218216703717603e-01 -8.977111131452725e-01 -2.252682454003231e-01 1.994988406704799e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.290000000000000e+02 -3.218206874910165e-01 -8.976960949233060e-01 -2.253103045385750e-01 1.995205075449409e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.300000000000000e+02 -3.218197019841087e-01 -8.976810741767365e-01 -2.253523630452642e-01 1.995421783725824e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.310000000000000e+02 -3.218187138538331e-01 -8.976660509045029e-01 -2.253944209191625e-01 1.995638531535578e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.320000000000000e+02 -3.218177231059253e-01 -8.976510251046441e-01 -2.254364781587080e-01 1.995855318877048e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.330000000000000e+02 -3.218167297320103e-01 -8.976359967795652e-01 -2.254785347638345e-01 1.996072145762898e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.340000000000000e+02 -3.218157337104799e-01 -8.976209659359127e-01 -2.255205907355264e-01 1.996289012216512e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.350000000000000e+02 -3.218147350955518e-01 -8.976059325564643e-01 -2.255626460677065e-01 1.996505918191943e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.360000000000000e+02 -3.218137338365408e-01 -8.975908966569438e-01 -2.256047007642459e-01 1.996722863740556e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.370000000000000e+02 -3.218127299638061e-01 -8.975758582276393e-01 -2.256467548212911e-01 1.996939848838199e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.380000000000000e+02 -3.218117234450090e-01 -8.975608172785505e-01 -2.256888082408801e-01 1.997156873518573e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.390000000000000e+02 -3.218107143316276e-01 -8.975457737933175e-01 -2.257308610172005e-01 1.997373937738149e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.400000000000000e+02 -3.218097025725905e-01 -8.975307277877861e-01 -2.257729131541481e-01 1.997591041548729e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.410000000000000e+02 -3.218086882093124e-01 -8.975156792487646e-01 -2.258149646468487e-01 1.997808184915978e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.420000000000000e+02 -3.218076712017893e-01 -8.975006281886658e-01 -2.258570154980456e-01 1.998025367880671e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.430000000000000e+02 -3.218066515882623e-01 -8.974855745952975e-01 -2.258990657031623e-01 1.998242590411340e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.440000000000000e+02 -3.218056293479087e-01 -8.974705184749830e-01 -2.259411152632805e-01 1.998459852532107e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.450000000000000e+02 -3.218046044730449e-01 -8.974554598299872e-01 -2.259831641780819e-01 1.998677154253670e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.460000000000000e+02 -3.218035769994069e-01 -8.974403986489065e-01 -2.260252124432275e-01 1.998894495546789e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.470000000000000e+02 -3.218025468893492e-01 -8.974253349433604e-01 -2.260672600613532e-01 1.999111876451093e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.480000000000000e+02 -3.218015141510262e-01 -8.974102687106280e-01 -2.261093070306733e-01 1.999329296962720e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.490000000000000e+02 -3.218004787977291e-01 -8.973951999463456e-01 -2.261513533489881e-01 1.999546757073516e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.500000000000000e+02 -3.217994408315960e-01 -8.973801286496864e-01 -2.261933990150709e-01 1.999764256785121e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.510000000000000e+02 -3.217984002430200e-01 -8.973650548234443e-01 -2.262354440289590e-01 1.999981796111397e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.520000000000000e+02 -3.217973570182506e-01 -8.973499784717939e-01 -2.262774883908906e-01 2.000199375068651e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.530000000000000e+02 -3.217963111926251e-01 -8.973348995834576e-01 -2.263195320965738e-01 2.000416993627909e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.540000000000000e+02 -3.217952627304635e-01 -8.973198181694372e-01 -2.263615751484491e-01 2.000634651827103e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.550000000000000e+02 -3.217942116597725e-01 -8.973047342207625e-01 -2.264036175429031e-01 2.000852349644007e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.560000000000000e+02 -3.217931579675486e-01 -8.972896477413481e-01 -2.264456592801632e-01 2.001070087094702e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.570000000000000e+02 -3.217921016503884e-01 -8.972745587321121e-01 -2.264877003595110e-01 2.001287864185956e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.580000000000000e+02 -3.217910427307512e-01 -8.972594671857551e-01 -2.265297407780286e-01 2.001505680902014e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.590000000000000e+02 -3.217899811605658e-01 -8.972443731172549e-01 -2.265717805391055e-01 2.001723537290964e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.600000000000000e+02 -3.217889170106851e-01 -8.972292765041561e-01 -2.266138196351955e-01 2.001941433290857e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.610000000000000e+02 -3.217878502156202e-01 -8.972141773668432e-01 -2.266558580714656e-01 2.002159368967320e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.620000000000000e+02 -3.217867808159947e-01 -8.971990756923758e-01 -2.266978958431517e-01 2.002377344286362e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.630000000000000e+02 -3.217857087802014e-01 -8.971839714905251e-01 -2.267399329521829e-01 2.002595359281351e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.640000000000000e+02 -3.217846341503616e-01 -8.971688647478788e-01 -2.267819693936617e-01 2.002813413916849e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.650000000000000e+02 -3.217835569018637e-01 -8.971537554719555e-01 -2.268240051689940e-01 2.003031508220681e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.660000000000000e+02 -3.217824770145313e-01 -8.971386436689529e-01 -2.268660402789953e-01 2.003249642215205e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.670000000000000e+02 -3.217813945166479e-01 -8.971235293297901e-01 -2.269080747201004e-01 2.003467815878255e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.680000000000000e+02 -3.217803094265581e-01 -8.971084124485406e-01 -2.269501084895977e-01 2.003686029196380e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.690000000000000e+02 -3.217792216945886e-01 -8.970932930406108e-01 -2.269921415911806e-01 2.003904282220758e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.700000000000000e+02 -3.217781313550512e-01 -8.970781710950481e-01 -2.270341740206760e-01 2.004122574923113e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.710000000000000e+02 -3.217770384068837e-01 -8.970630466120347e-01 -2.270762057771478e-01 2.004340907308033e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.720000000000000e+02 -3.217759428358619e-01 -8.970479195958189e-01 -2.271182368610424e-01 2.004559279393774e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.730000000000000e+02 -3.217748446503187e-01 -8.970327900436258e-01 -2.271602672705644e-01 2.004777691176191e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.740000000000000e+02 -3.217737438406083e-01 -8.970176579583140e-01 -2.272022970056196e-01 2.004996142668359e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.750000000000000e+02 -3.217726404381633e-01 -8.970025233298377e-01 -2.272443260623068e-01 2.005214633844582e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.760000000000000e+02 -3.217715344078756e-01 -8.969873861690191e-01 -2.272863544429736e-01 2.005433164742605e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.770000000000000e+02 -3.217704257640727e-01 -8.969722464711967e-01 -2.273283821452788e-01 2.005651735352683e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.780000000000000e+02 -3.217693145112068e-01 -8.969571042348176e-01 -2.273704091677825e-01 2.005870345674264e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.790000000000000e+02 -3.217682006415066e-01 -8.969419594620993e-01 -2.274124355103375e-01 2.006088995719621e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.800000000000000e+02 -3.217670841513716e-01 -8.969268121540238e-01 -2.274544611722357e-01 2.006307685495735e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.810000000000000e+02 -3.217659650624842e-01 -8.969116623035891e-01 -2.274964861505304e-01 2.006526414986413e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.820000000000000e+02 -3.217648433554542e-01 -8.968965099167476e-01 -2.275385104459494e-01 2.006745184213386e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.830000000000000e+02 -3.217637190265402e-01 -8.968813549944488e-01 -2.275805340579763e-01 2.006963993185181e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.840000000000000e+02 -3.217625920991559e-01 -8.968661975291708e-01 -2.276225569834494e-01 2.007182841883491e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.850000000000000e+02 -3.217614625529777e-01 -8.968510375271610e-01 -2.276645792231782e-01 2.007401730330947e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.860000000000000e+02 -3.217603304037712e-01 -8.968358749832286e-01 -2.277066007748765e-01 2.007620658517793e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.870000000000000e+02 -3.217591956292000e-01 -8.968207099042532e-01 -2.277486216395332e-01 2.007839626468576e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.880000000000000e+02 -3.217580582467865e-01 -8.968055422845428e-01 -2.277906418145833e-01 2.008058634170946e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.890000000000000e+02 -3.217569182629045e-01 -8.967903721219412e-01 -2.278326612984138e-01 2.008277681622524e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.900000000000000e+02 -3.217557756620012e-01 -8.967751994211154e-01 -2.278746800915765e-01 2.008496768842917e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.910000000000000e+02 -3.217546304528847e-01 -8.967600241791428e-01 -2.279166981922373e-01 2.008715895827465e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.920000000000000e+02 -3.217534826283083e-01 -8.967448463981286e-01 -2.279587156000745e-01 2.008935062587054e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.930000000000000e+02 -3.217523322012931e-01 -8.967296660738230e-01 -2.280007323128743e-01 2.009154269113044e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.940000000000000e+02 -3.217511791562050e-01 -8.967144832109204e-01 -2.280427483311915e-01 2.009373515425155e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.950000000000000e+02 -3.217500235108583e-01 -8.966992978036632e-01 -2.280847636523807e-01 2.009592801510235e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.960000000000000e+02 -3.217488652563017e-01 -8.966841098547187e-01 -2.281267782762124e-01 2.009812127380299e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.970000000000000e+02 -3.217477043876599e-01 -8.966689193653941e-01 -2.281687922022684e-01 2.010031493044961e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.980000000000000e+02 -3.217465409115154e-01 -8.966537263334680e-01 -2.282108054289171e-01 2.010250898501624e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.990000000000000e+02 -3.217453748188726e-01 -8.966385307615961e-01 -2.282528179559909e-01 2.010470343762854e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.000000000000000e+03 -3.217442061406797e-01 -8.966233326398872e-01 -2.282948297796651e-01 2.010689828803041e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.001000000000000e+03 -3.217430348437760e-01 -8.966081319785520e-01 -2.283368409020672e-01 2.010909353658492e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.002000000000000e+03 -3.217418609292909e-01 -8.965929287770861e-01 -2.283788513220553e-01 2.011128918331753e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.003000000000000e+03 -3.217406844143230e-01 -8.965777230299574e-01 -2.284208610370536e-01 2.011348522810281e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.004000000000000e+03 -3.217395053030703e-01 -8.965625147356181e-01 -2.284628700458270e-01 2.011568167095108e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.005000000000000e+03 -3.217383235694289e-01 -8.965473039021353e-01 -2.285048783496807e-01 2.011787851214520e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.006000000000000e+03 -3.217371392349618e-01 -8.965320905225467e-01 -2.285468859456996e-01 2.012007575152200e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.007000000000000e+03 -3.217359523050122e-01 -8.965168745950217e-01 -2.285888928323657e-01 2.012227338906680e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.008000000000000e+03 -3.217347627530878e-01 -8.965016561276720e-01 -2.286308990111951e-01 2.012447142508058e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.009000000000000e+03 -3.217335705996913e-01 -8.964864351138956e-01 -2.286729044793099e-01 2.012666985940522e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.010000000000000e+03 -3.217323758483916e-01 -8.964712115524203e-01 -2.287149092353511e-01 2.012886869204288e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.011000000000000e+03 -3.217311784876436e-01 -8.964559854466534e-01 -2.287569132794930e-01 2.013106792315303e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.012000000000000e+03 -3.217299785247136e-01 -8.964407567941597e-01 -2.287989166100453e-01 2.013326755270280e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.013000000000000e+03 -3.217287759465504e-01 -8.964255255988720e-01 -2.288409192271942e-01 2.013546758085682e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.014000000000000e+03 -3.217275707840311e-01 -8.964102918509235e-01 -2.288829211271398e-01 2.013766800735778e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.015000000000000e+03 -3.217263629979945e-01 -8.963950555624142e-01 -2.289249223125207e-01 2.013986883262786e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.016000000000000e+03 -3.217251526228251e-01 -8.963798167223733e-01 -2.289669227792253e-01 2.014207005637627e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.017000000000000e+03 -3.217239396258174e-01 -8.963645753409204e-01 -2.290089225291915e-01 2.014427167895472e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.018000000000000e+03 -3.217227240450681e-01 -8.963493314059168e-01 -2.290509215579803e-01 2.014647370003676e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.019000000000000e+03 -3.217215058524538e-01 -8.963340849259881e-01 -2.290929198672381e-01 2.014867611994006e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.020000000000000e+03 -3.217202850593572e-01 -8.963188358974042e-01 -2.291349174549093e-01 2.015087893859231e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.021000000000000e+03 -3.217190616648443e-01 -8.963035843203108e-01 -2.291769143200355e-01 2.015308215603830e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.022000000000000e+03 -3.217178356629081e-01 -8.962883301963730e-01 -2.292189104622898e-01 2.015528577238546e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.023000000000000e+03 -3.217166070691996e-01 -8.962730735205171e-01 -2.292609058792381e-01 2.015748978752045e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.024000000000000e+03 -3.217153758616927e-01 -8.962578142995022e-01 -2.293029005718569e-01 2.015969420169410e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.025000000000000e+03 -3.217141420647203e-01 -8.962425525255221e-01 -2.293448945369415e-01 2.016189901471012e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.026000000000000e+03 -3.217129056561443e-01 -8.962272882053193e-01 -2.293868877755964e-01 2.016410422683001e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.027000000000000e+03 -3.217116666529903e-01 -8.962120213333875e-01 -2.294288802852672e-01 2.016630983792711e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.028000000000000e+03 -3.217104250501664e-01 -8.961967519111824e-01 -2.294708720653637e-01 2.016851584808594e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.029000000000000e+03 -3.217091808493325e-01 -8.961814799379565e-01 -2.295128631148761e-01 2.017072225734073e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.030000000000000e+03 -3.217079340427255e-01 -8.961662054160058e-01 -2.295548534334494e-01 2.017292906580171e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.031000000000000e+03 -3.217066846285350e-01 -8.961509283457267e-01 -2.295968430202600e-01 2.017513627352700e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.032000000000000e+03 -3.217054326311027e-01 -8.961356487193120e-01 -2.296388318721103e-01 2.017734388031935e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.033000000000000e+03 -3.217041780345234e-01 -8.961203665415418e-01 -2.296808199895451e-01 2.017955188638109e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.034000000000000e+03 -3.217029208228047e-01 -8.961050818173036e-01 -2.297228073729343e-01 2.018176029190158e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.035000000000000e+03 -3.217016610312665e-01 -8.960897945353339e-01 -2.297647940181128e-01 2.018396909657807e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.036000000000000e+03 -3.217003986252412e-01 -8.960745047063190e-01 -2.298067799272789e-01 2.018617830079315e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.037000000000000e+03 -3.216991336356194e-01 -8.960592123203904e-01 -2.298487650966615e-01 2.018838790428628e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.038000000000000e+03 -3.216978660278065e-01 -8.960439173882637e-01 -2.298907495283291e-01 2.019059790743042e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.039000000000000e+03 -3.216965958516305e-01 -8.960286198941098e-01 -2.299327332168425e-01 2.019280830978259e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.040000000000000e+03 -3.216953230531411e-01 -8.960133198546844e-01 -2.299747161660939e-01 2.019501911191146e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.041000000000000e+03 -3.216940476731102e-01 -8.959980172570090e-01 -2.300166983714459e-01 2.019723031346095e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.042000000000000e+03 -3.216927696824516e-01 -8.959827121100665e-01 -2.300586798344746e-01 2.019944191475148e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.043000000000000e+03 -3.216914891077351e-01 -8.959674044053475e-01 -2.301006605517970e-01 2.020165391556324e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.044000000000000e+03 -3.216902059320720e-01 -8.959520941479442e-01 -2.301426405240340e-01 2.020386631610892e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.045000000000000e+03 -3.216889201576243e-01 -8.959367813370299e-01 -2.301846197499496e-01 2.020607911640357e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.046000000000000e+03 -3.216876318051506e-01 -8.959214659659254e-01 -2.302265982266756e-01 2.020829231628292e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.047000000000000e+03 -3.216863408294142e-01 -8.959061480486450e-01 -2.302685759573180e-01 2.021050591623332e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.048000000000000e+03 -3.216850472762945e-01 -8.958908275706027e-01 -2.303105529368041e-01 2.021271991584819e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.049000000000000e+03 -3.216837511159676e-01 -8.958755045410136e-01 -2.303525291667642e-01 2.021493431545590e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.050000000000000e+03 -3.216824523793508e-01 -8.958601789500017e-01 -2.303945046434424e-01 2.021714911479375e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.051000000000000e+03 -3.216811510383680e-01 -8.958448508061801e-01 -2.304364793684326e-01 2.021936431418294e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.052000000000000e+03 -3.216798470983119e-01 -8.958295201077379e-01 -2.304784533402246e-01 2.022157991360839e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.053000000000000e+03 -3.216785405700001e-01 -8.958141868511246e-01 -2.305204265568246e-01 2.022379591300132e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.054000000000000e+03 -3.216772314614278e-01 -8.957988510336012e-01 -2.305623990166680e-01 2.022601231233426e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.055000000000000e+03 -3.216759197299705e-01 -8.957835126684380e-01 -2.306043707224335e-01 2.022822911205583e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.056000000000000e+03 -3.216746054199517e-01 -8.957681717415139e-01 -2.306463416692602e-01 2.023044631177752e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.057000000000000e+03 -3.216732885288592e-01 -8.957528282534745e-01 -2.306883118563215e-01 2.023266391155930e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.058000000000000e+03 -3.216719690335696e-01 -8.957374822113747e-01 -2.307302812847691e-01 2.023488191167539e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.059000000000000e+03 -3.216706469457642e-01 -8.957221336113936e-01 -2.307722499525355e-01 2.023710031204844e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.060000000000000e+03 -3.216693222766464e-01 -8.957067824498602e-01 -2.308142178575968e-01 2.023931911260556e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.061000000000000e+03 -3.216679950008839e-01 -8.956914287345249e-01 -2.308561850012923e-01 2.024153831364266e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.062000000000000e+03 -3.216666651470260e-01 -8.956760724562575e-01 -2.308981513800877e-01 2.024375791491843e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.063000000000000e+03 -3.216653326857565e-01 -8.956607136241149e-01 -2.309401169955466e-01 2.024597791675826e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.064000000000000e+03 -3.216639976533289e-01 -8.956453522265425e-01 -2.309820818434670e-01 2.024819831884559e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.065000000000000e+03 -3.216626600190919e-01 -8.956299882729647e-01 -2.310240459256460e-01 2.025041912152848e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.066000000000000e+03 -3.216613197978985e-01 -8.956146217585627e-01 -2.310660092397437e-01 2.025264032469830e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.067000000000000e+03 -3.216599769801322e-01 -8.955992526861932e-01 -2.311079717856066e-01 2.025486192848923e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.068000000000000e+03 -3.216586315873719e-01 -8.955838810489208e-01 -2.311499335603132e-01 2.025708393272697e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.069000000000000e+03 -3.216572835917533e-01 -8.955685068552933e-01 -2.311918945654118e-01 2.025930633773295e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.070000000000000e+03 -3.216559330035611e-01 -8.955531301019296e-01 -2.312338547989603e-01 2.026152914344290e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.071000000000000e+03 -3.216545798475534e-01 -8.955377507808940e-01 -2.312758142577651e-01 2.026375234965108e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.072000000000000e+03 -3.216532240868745e-01 -8.955223689035648e-01 -2.313177729441491e-01 2.026597595676704e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.073000000000000e+03 -3.216518657355965e-01 -8.955069844653687e-01 -2.313597308558433e-01 2.026819996468940e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.074000000000000e+03 -3.216505048048137e-01 -8.954915974626451e-01 -2.314016879908984e-01 2.027042437335033e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.075000000000000e+03 -3.216491412856817e-01 -8.954762078980342e-01 -2.314436443490299e-01 2.027264918287198e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.076000000000000e+03 -3.216477751697391e-01 -8.954608157739774e-01 -2.314855999300980e-01 2.027487439338714e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.077000000000000e+03 -3.216464064759552e-01 -8.954454210843613e-01 -2.315275547314141e-01 2.027710000474613e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.078000000000000e+03 -3.216450351934428e-01 -8.954300238324698e-01 -2.315695087528679e-01 2.027932601709118e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.079000000000000e+03 -3.216436613279844e-01 -8.954146240162609e-01 -2.316114619930902e-01 2.028155243041574e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.080000000000000e+03 -3.216422848691596e-01 -8.953992216388721e-01 -2.316534144519286e-01 2.028377924485764e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.081000000000000e+03 -3.216409058215428e-01 -8.953838166986939e-01 -2.316953661279971e-01 2.028600646041268e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.082000000000000e+03 -3.216395242031596e-01 -8.953684091899113e-01 -2.317373170186930e-01 2.028823407693986e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.083000000000000e+03 -3.216381399827928e-01 -8.953529991221277e-01 -2.317792671258322e-01 2.029046209479534e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.084000000000000e+03 -3.216367531759139e-01 -8.953375864903315e-01 -2.318212164470312e-01 2.029269051386327e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.085000000000000e+03 -3.216353638022983e-01 -8.953221712881561e-01 -2.318631649795388e-01 2.029491933398516e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.086000000000000e+03 -3.216339718364220e-01 -8.953067535234137e-01 -2.319051127246775e-01 2.029714855546159e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.087000000000000e+03 -3.216325772830658e-01 -8.952913331944579e-01 -2.319470596809843e-01 2.029937817828145e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.088000000000000e+03 -3.216311801281228e-01 -8.952759103055594e-01 -2.319890058486772e-01 2.030160820262409e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.089000000000000e+03 -3.216297804259406e-01 -8.952604848394725e-01 -2.320309512220416e-01 2.030383862799069e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.090000000000000e+03 -3.216283781205880e-01 -8.952450568135787e-01 -2.320728958050029e-01 2.030606945498133e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.091000000000000e+03 -3.216269732225135e-01 -8.952296262244481e-01 -2.321148395956111e-01 2.030830068352918e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.092000000000000e+03 -3.216255657502901e-01 -8.952141930660673e-01 -2.321567825912825e-01 2.031053231349190e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.093000000000000e+03 -3.216241557057432e-01 -8.951987573377200e-01 -2.321987247908096e-01 2.031276434488707e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.094000000000000e+03 -3.216227430650757e-01 -8.951833190466755e-01 -2.322406661953549e-01 2.031499677799926e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.095000000000000e+03 -3.216213278343243e-01 -8.951678781908922e-01 -2.322826068033479e-01 2.031722961280484e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.096000000000000e+03 -3.216199100460820e-01 -8.951524347599710e-01 -2.323245466109508e-01 2.031946284901797e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.097000000000000e+03 -3.216184896641239e-01 -8.951369887650927e-01 -2.323664856203853e-01 2.032169648704600e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.098000000000000e+03 -3.216170666958453e-01 -8.951215402037884e-01 -2.324084238299648e-01 2.032393052685176e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.099000000000000e+03 -3.216156411477979e-01 -8.951060890738284e-01 -2.324503612381369e-01 2.032616496841109e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.100000000000000e+03 -3.216142130286248e-01 -8.950906353723520e-01 -2.324922978431112e-01 2.032839981167422e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.101000000000000e+03 -3.216127823185680e-01 -8.950751791053575e-01 -2.325342336456974e-01 2.033063505688648e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.102000000000000e+03 -3.216113490234828e-01 -8.950597202708608e-01 -2.325761686443415e-01 2.033287070402576e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.103000000000000e+03 -3.216099131621013e-01 -8.950442588628261e-01 -2.326181028363954e-01 2.033510675294242e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.104000000000000e+03 -3.216084747204637e-01 -8.950287948854272e-01 -2.326600362221725e-01 2.033734320382450e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.105000000000000e+03 -3.216070336915865e-01 -8.950133283407209e-01 -2.327019688012116e-01 2.033958005677692e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.106000000000000e+03 -3.216055900755740e-01 -8.949978592285078e-01 -2.327439005725082e-01 2.034181731183926e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.107000000000000e+03 -3.216041438995025e-01 -8.949823875401264e-01 -2.327858315327080e-01 2.034405496877875e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.108000000000000e+03 -3.216026951415538e-01 -8.949669132822233e-01 -2.328277616827888e-01 2.034629302786163e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.109000000000000e+03 -3.216012437828947e-01 -8.949514364605855e-01 -2.328696910232916e-01 2.034853148931061e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.110000000000000e+03 -3.215997898752505e-01 -8.949359570587944e-01 -2.329116195487756e-01 2.035077035264793e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.111000000000000e+03 -3.215983333748159e-01 -8.949204750904162e-01 -2.329535472620778e-01 2.035300961835851e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.112000000000000e+03 -3.215968743047978e-01 -8.949049905480084e-01 -2.329954741601767e-01 2.035524928624746e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.113000000000000e+03 -3.215954126395045e-01 -8.948895034394895e-01 -2.330374002442503e-01 2.035748935661074e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.114000000000000e+03 -3.215939484129169e-01 -8.948740137540258e-01 -2.330793255103679e-01 2.035972982914609e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.115000000000000e+03 -3.215924816162752e-01 -8.948585214941548e-01 -2.331212499583946e-01 2.036197070399051e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.116000000000000e+03 -3.215910122225923e-01 -8.948430266682306e-01 -2.331631735895541e-01 2.036421198144834e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.117000000000000e+03 -3.215895402620823e-01 -8.948275292665780e-01 -2.332050964002970e-01 2.036645366125925e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.118000000000000e+03 -3.215880657356494e-01 -8.948120292887735e-01 -2.332470183894919e-01 2.036869574344979e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.119000000000000e+03 -3.215865886202628e-01 -8.947965267418463e-01 -2.332889395582040e-01 2.037093822829946e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.120000000000000e+03 -3.215851089277343e-01 -8.947810216219393e-01 -2.333308599043795e-01 2.037318111572630e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.121000000000000e+03 -3.215836266793743e-01 -8.947655139222074e-01 -2.333727794251667e-01 2.037542440555321e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.122000000000000e+03 -3.215821418367850e-01 -8.947500036545163e-01 -2.334146981229218e-01 2.037766809821339e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.123000000000000e+03 -3.215806544216855e-01 -8.947344908118914e-01 -2.334566159947579e-01 2.037991219352578e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.124000000000000e+03 -3.215791644383832e-01 -8.947189753928120e-01 -2.334985330393157e-01 2.038215669148772e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.125000000000000e+03 -3.215776718825205e-01 -8.947034573985106e-01 -2.335404492559041e-01 2.038440159217828e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.126000000000000e+03 -3.215761767486692e-01 -8.946879368304775e-01 -2.335823646441010e-01 2.038664689570180e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.127000000000000e+03 -3.215746790397417e-01 -8.946724136876570e-01 -2.336242792026028e-01 2.038889260206481e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.128000000000000e+03 -3.215731787628958e-01 -8.946568879676585e-01 -2.336661929297513e-01 2.039113871123127e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.129000000000000e+03 -3.215716759067507e-01 -8.946413596738457e-01 -2.337081058256220e-01 2.039338522336508e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.130000000000000e+03 -3.215701704959011e-01 -8.946258287983395e-01 -2.337500178870952e-01 2.039563213825547e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.131000000000000e+03 -3.215686624841415e-01 -8.946102953555172e-01 -2.337919291170429e-01 2.039787945640591e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.132000000000000e+03 -3.215671519224028e-01 -8.945947593292112e-01 -2.338338395101409e-01 2.040012717734151e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.133000000000000e+03 -3.215656387802405e-01 -8.945792207287857e-01 -2.338757490680585e-01 2.040237530141745e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.134000000000000e+03 -3.215641230593961e-01 -8.945636795535546e-01 -2.339176577895897e-01 2.040462382865198e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.135000000000000e+03 -3.215626047815895e-01 -8.945481357965445e-01 -2.339595656718603e-01 2.040687275886267e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.136000000000000e+03 -3.215610839333225e-01 -8.945325894617856e-01 -2.340014727151188e-01 2.040912209223484e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.137000000000000e+03 -3.215595605041711e-01 -8.945170405524210e-01 -2.340433789191755e-01 2.041137182890903e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.138000000000000e+03 -3.215580345016041e-01 -8.945014890659360e-01 -2.340852842824060e-01 2.041362196885051e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.139000000000000e+03 -3.215565059412416e-01 -8.944859349972772e-01 -2.341271888024484e-01 2.041587251193781e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.140000000000000e+03 -3.215549748073215e-01 -8.944703783511878e-01 -2.341690924797366e-01 2.041812345837940e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.141000000000000e+03 -3.215534411114502e-01 -8.944548191238781e-01 -2.342109953122434e-01 2.042037480809395e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.142000000000000e+03 -3.215519048203249e-01 -8.944392573256646e-01 -2.342528973017400e-01 2.042262656145742e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.143000000000000e+03 -3.215503659854500e-01 -8.944236929402014e-01 -2.342947984428802e-01 2.042487871798646e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.144000000000000e+03 -3.215488245734109e-01 -8.944081259777875e-01 -2.343366987375622e-01 2.042713127806767e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.145000000000000e+03 -3.215472805848619e-01 -8.943925564380799e-01 -2.343785981846701e-01 2.042938424173017e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.146000000000000e+03 -3.215457340474447e-01 -8.943769843122426e-01 -2.344204967808471e-01 2.043163760873060e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.147000000000000e+03 -3.215441849279371e-01 -8.943614096105142e-01 -2.344623945279705e-01 2.043389137945421e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.148000000000000e+03 -3.215426332451234e-01 -8.943458323268463e-01 -2.345042914234189e-01 2.043614555374686e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.149000000000000e+03 -3.215410789867644e-01 -8.943302524649277e-01 -2.345461874672058e-01 2.043840013177267e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.150000000000000e+03 -3.215395221754732e-01 -8.943146700175050e-01 -2.345880826563959e-01 2.044065511333861e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.151000000000000e+03 -3.215379627920675e-01 -8.942990849903990e-01 -2.346299769916960e-01 2.044291049868845e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.152000000000000e+03 -3.215364008295264e-01 -8.942834973856822e-01 -2.346718704726239e-01 2.044516628792893e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.153000000000000e+03 -3.215348363229987e-01 -8.942679071921575e-01 -2.347137630952107e-01 2.044742248073985e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.154000000000000e+03 -3.215332692397400e-01 -8.942523144199132e-01 -2.347556548612814e-01 2.044967907750255e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.155000000000000e+03 -3.215316995859366e-01 -8.942367190668664e-01 -2.347975457692612e-01 2.045193607818999e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.156000000000000e+03 -3.215301273714859e-01 -8.942211211297396e-01 -2.348394358173300e-01 2.045419348274229e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.157000000000000e+03 -3.215285525914628e-01 -8.942055206099470e-01 -2.348813250048318e-01 2.045645129124484e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.158000000000000e+03 -3.215269752552009e-01 -8.941899175043351e-01 -2.349232133301139e-01 2.045870950365286e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.159000000000000e+03 -3.215253953322291e-01 -8.941743118223577e-01 -2.349651007946238e-01 2.046096812031112e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.160000000000000e+03 -3.215238128694193e-01 -8.941587035491285e-01 -2.350069873934373e-01 2.046322714077944e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.161000000000000e+03 -3.215222278347240e-01 -8.941430926945172e-01 -2.350488731283098e-01 2.046548656543293e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.162000000000000e+03 -3.215206402308680e-01 -8.941274792575308e-01 -2.350907579979529e-01 2.046774639427961e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.163000000000000e+03 -3.215190500655803e-01 -8.941118632355747e-01 -2.351326420007267e-01 2.047000662728127e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.164000000000000e+03 -3.215174573401913e-01 -8.940962446280952e-01 -2.351745251354581e-01 2.047226726445983e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.165000000000000e+03 -3.215158620486868e-01 -8.940806234367695e-01 -2.352164074017567e-01 2.047452830592638e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.166000000000000e+03 -3.215142641983605e-01 -8.940649996591672e-01 -2.352582887979596e-01 2.047678975164226e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.167000000000000e+03 -3.215126637802537e-01 -8.940493732979458e-01 -2.353001693237970e-01 2.047905160173893e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.168000000000000e+03 -3.215110608116247e-01 -8.940337443475391e-01 -2.353420489767898e-01 2.048131385607611e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.169000000000000e+03 -3.215094552680566e-01 -8.940181128154161e-01 -2.353839277580534e-01 2.048357651495249e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.170000000000000e+03 -3.215078471619365e-01 -8.940024786975438e-01 -2.354258056655074e-01 2.048583957827740e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.171000000000000e+03 -3.215062365157257e-01 -8.939868419867190e-01 -2.354676826962497e-01 2.048810304585707e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.172000000000000e+03 -3.215046232861846e-01 -8.939712026963342e-01 -2.355095588529320e-01 2.049036691818269e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.173000000000000e+03 -3.215030075072005e-01 -8.939555608155909e-01 -2.355514341317173e-01 2.049263119494385e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.174000000000000e+03 -3.215013891535666e-01 -8.939399163522602e-01 -2.355933085336595e-01 2.049489587643833e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.175000000000000e+03 -3.214997682667239e-01 -8.939242692931665e-01 -2.356351820543097e-01 2.049716096227806e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.176000000000000e+03 -3.214981448042302e-01 -8.939086196514521e-01 -2.356770546962459e-01 2.049942645294668e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.177000000000000e+03 -3.214965187713242e-01 -8.938929674253334e-01 -2.357189264579733e-01 2.050169234842634e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.178000000000000e+03 -3.214948901919713e-01 -8.938773126071349e-01 -2.357607973364723e-01 2.050395864850727e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.179000000000000e+03 -3.214932590614494e-01 -8.938616551981288e-01 -2.358026673312419e-01 2.050622535328755e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.180000000000000e+03 -3.214916253663418e-01 -8.938459952024027e-01 -2.358445364423083e-01 2.050849246294003e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.181000000000000e+03 -3.214899890942978e-01 -8.938303326236834e-01 -2.358864046696683e-01 2.051075997763168e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.182000000000000e+03 -3.214883502932733e-01 -8.938146674467451e-01 -2.359282720083554e-01 2.051302789690630e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.183000000000000e+03 -3.214867089245053e-01 -8.937989996835727e-01 -2.359701384606343e-01 2.051529622121123e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.184000000000000e+03 -3.214850649806881e-01 -8.937833293363318e-01 -2.360120040260293e-01 2.051756495065697e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.185000000000000e+03 -3.214834185023054e-01 -8.937676563921485e-01 -2.360538687001874e-01 2.051983408486352e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.186000000000000e+03 -3.214817694658104e-01 -8.937519808582197e-01 -2.360957324841320e-01 2.052210362412229e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.187000000000000e+03 -3.214801178578188e-01 -8.937363027386239e-01 -2.361375953778800e-01 2.052437356860637e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.188000000000000e+03 -3.214784636974581e-01 -8.937206220271815e-01 -2.361794573788727e-01 2.052664391815953e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.189000000000000e+03 -3.214768069920709e-01 -8.937049387214490e-01 -2.362213184854487e-01 2.052891467274160e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.190000000000000e+03 -3.214751477233724e-01 -8.936892528269670e-01 -2.362631786981993e-01 2.053118583259042e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.191000000000000e+03 -3.214734859063363e-01 -8.936735643388907e-01 -2.363050380148452e-01 2.053345739758743e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.192000000000000e+03 -3.214718215092123e-01 -8.936578732670519e-01 -2.363468964369438e-01 2.053572936809984e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.193000000000000e+03 -3.214701545935342e-01 -8.936421795919535e-01 -2.363887539584553e-01 2.053800174352921e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.194000000000000e+03 -3.214684851030024e-01 -8.936264833310998e-01 -2.364306105830376e-01 2.054027452450537e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.195000000000000e+03 -3.214668130455992e-01 -8.936107844818458e-01 -2.364724663089758e-01 2.054254771098174e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.196000000000000e+03 -3.214651384622883e-01 -8.935950830311686e-01 -2.365143211318982e-01 2.054482130257115e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.197000000000000e+03 -3.214634613153761e-01 -8.935793789907168e-01 -2.365561750539543e-01 2.054709529971218e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.198000000000000e+03 -3.214617816094498e-01 -8.935636723589149e-01 -2.365980280737044e-01 2.054936970239303e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.199000000000000e+03 -3.214600993418167e-01 -8.935479631364509e-01 -2.366398801903549e-01 2.055164451068185e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.200000000000000e+03 -3.214584145436584e-01 -8.935322513133802e-01 -2.366817314003281e-01 2.055391972429179e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.201000000000000e+03 -3.214567271820725e-01 -8.935165368998443e-01 -2.367235817053797e-01 2.055619534361263e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.202000000000000e+03 -3.214550372581912e-01 -8.935008198953552e-01 -2.367654311043480e-01 2.055847136866821e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.203000000000000e+03 -3.214533448029178e-01 -8.934851002900561e-01 -2.368072795936816e-01 2.056074779917423e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.204000000000000e+03 -3.214516497739873e-01 -8.934693780970349e-01 -2.368491271758817e-01 2.056302463561789e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.205000000000000e+03 -3.214499522141764e-01 -8.934536533026982e-01 -2.368909738464468e-01 2.056530187759170e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.206000000000000e+03 -3.214482520867460e-01 -8.934379259184498e-01 -2.369328196073114e-01 2.056757952551637e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.207000000000000e+03 -3.214465494170899e-01 -8.934221959361662e-01 -2.369746644553699e-01 2.056985757916420e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.208000000000000e+03 -3.214448441935991e-01 -8.934064633592893e-01 -2.370165083906609e-01 2.057213603870532e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.209000000000000e+03 -3.214431364226902e-01 -8.933907281856680e-01 -2.370583514115994e-01 2.057441490410856e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.210000000000000e+03 -3.214414261028480e-01 -8.933749904156484e-01 -2.371001935172360e-01 2.057669417542495e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.211000000000000e+03 -3.214397132323215e-01 -8.933592500495694e-01 -2.371420347068188e-01 2.057897385272255e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.212000000000000e+03 -3.214379978056259e-01 -8.933435070890263e-01 -2.371838749797137e-01 2.058125393609368e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.213000000000000e+03 -3.214362798273250e-01 -8.933277615324247e-01 -2.372257143345438e-01 2.058353442553122e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.214000000000000e+03 -3.214345593187709e-01 -8.933120133729144e-01 -2.372675527685353e-01 2.058581532084844e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.215000000000000e+03 -3.214328362467521e-01 -8.932962626207359e-01 -2.373093902834435e-01 2.058809662244044e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.216000000000000e+03 -3.214311106336353e-01 -8.932805092687195e-01 -2.373512268764137e-01 2.059037833011003e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.217000000000000e+03 -3.214293824625861e-01 -8.932647533220051e-01 -2.373930625477736e-01 2.059266044407254e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.218000000000000e+03 -3.214276517540882e-01 -8.932489947740166e-01 -2.374348972948208e-01 2.059494296415003e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.219000000000000e+03 -3.214259184932846e-01 -8.932332336292181e-01 -2.374767311178441e-01 2.059722589054708e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.220000000000000e+03 -3.214241826773005e-01 -8.932174698883839e-01 -2.375185640159983e-01 2.059950922332902e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.221000000000000e+03 -3.214224443304767e-01 -8.932017035437240e-01 -2.375603959862774e-01 2.060179296227740e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.222000000000000e+03 -3.214207034358412e-01 -8.931859346003683e-01 -2.376022270291361e-01 2.060407710761890e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.223000000000000e+03 -3.214189599852156e-01 -8.931701630607608e-01 -2.376440571441493e-01 2.060636165947426e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.224000000000000e+03 -3.214172139853849e-01 -8.931543889226087e-01 -2.376858863297644e-01 2.060864661781290e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.225000000000000e+03 -3.214154654564397e-01 -8.931386121794606e-01 -2.377277145833170e-01 2.061093198246025e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.226000000000000e+03 -3.214137143645550e-01 -8.931228328417500e-01 -2.377695419065912e-01 2.061321775381948e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.227000000000000e+03 -3.214119607352687e-01 -8.931070509013104e-01 -2.378113682964912e-01 2.061550393165905e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.228000000000000e+03 -3.214102045709951e-01 -8.930912663572531e-01 -2.378531937517536e-01 2.061779051598891e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.229000000000000e+03 -3.214084458429287e-01 -8.930754792184317e-01 -2.378950182737593e-01 2.062007750716022e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.230000000000000e+03 -3.214066845898083e-01 -8.930596894725268e-01 -2.379368418583741e-01 2.062236490480290e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.231000000000000e+03 -3.214049207695999e-01 -8.930438971326093e-01 -2.379786645079016e-01 2.062465270939718e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.232000000000000e+03 -3.214031544288551e-01 -8.930281021839012e-01 -2.380204862175939e-01 2.062694092049074e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.233000000000000e+03 -3.214013855328866e-01 -8.930123046371077e-01 -2.380623069892915e-01 2.062922953849677e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.234000000000000e+03 -3.213996140944511e-01 -8.929965044880854e-01 -2.381041268209136e-01 2.063151856331692e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.235000000000000e+03 -3.213978401157527e-01 -8.929807017360121e-01 -2.381459457112115e-01 2.063380799496330e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.236000000000000e+03 -3.213960635959834e-01 -8.929648963809319e-01 -2.381877636593531e-01 2.063609783349417e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.237000000000000e+03 -3.213942845298135e-01 -8.929490884243934e-01 -2.382295806646821e-01 2.063838807900074e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.238000000000000e+03 -3.213925029178098e-01 -8.929332778660622e-01 -2.382713967261374e-01 2.064067873151728e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.239000000000000e+03 -3.213907187710121e-01 -8.929174647023361e-01 -2.383132118417766e-01 2.064296979096300e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.240000000000000e+03 -3.213889320868126e-01 -8.929016489338260e-01 -2.383550260109079e-01 2.064526125741501e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.241000000000000e+03 -3.213871428543399e-01 -8.928858305638245e-01 -2.383968392333084e-01 2.064755313102291e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.242000000000000e+03 -3.213853510760920e-01 -8.928700095913904e-01 -2.384386515077647e-01 2.064984541180062e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.243000000000000e+03 -3.213835567727706e-01 -8.928541860098809e-01 -2.384804628315791e-01 2.065213809956543e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.244000000000000e+03 -3.213817599168879e-01 -8.928383598277365e-01 -2.385222732060070e-01 2.065443119465651e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.245000000000000e+03 -3.213799605130969e-01 -8.928225310433653e-01 -2.385640826296063e-01 2.065672469706022e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.246000000000000e+03 -3.213781586009132e-01 -8.928066996442043e-01 -2.386058910982108e-01 2.065901860639526e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.247000000000000e+03 -3.213763541226645e-01 -8.927908656481931e-01 -2.386476986154312e-01 2.066131292331932e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.248000000000000e+03 -3.213745471095608e-01 -8.927750290453824e-01 -2.386895051777508e-01 2.066360764753867e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.249000000000000e+03 -3.213727375501653e-01 -8.927591898392165e-01 -2.387313107850446e-01 2.066590277921408e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.250000000000000e+03 -3.213709254809567e-01 -8.927433480180891e-01 -2.387731154333902e-01 2.066819831799552e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.251000000000000e+03 -3.213691108498318e-01 -8.927275035981872e-01 -2.388149191259523e-01 2.067049426448297e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.252000000000000e+03 -3.213672936739830e-01 -8.927116565739729e-01 -2.388567218603116e-01 2.067279061853023e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.253000000000000e+03 -3.213654739861930e-01 -8.926958069350031e-01 -2.388985236328380e-01 2.067508737982591e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.254000000000000e+03 -3.213636517409366e-01 -8.926799546953953e-01 -2.389403244461761e-01 2.067738454890104e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.255000000000000e+03 -3.213618269691040e-01 -8.926640998453019e-01 -2.389821242968446e-01 2.067968212546420e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.256000000000000e+03 -3.213599996546920e-01 -8.926482423896044e-01 -2.390239231850687e-01 2.068198010972471e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.257000000000000e+03 -3.213581698036994e-01 -8.926323823262884e-01 -2.390657211093038e-01 2.068427850165437e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.258000000000000e+03 -3.213563374232365e-01 -8.926165196529083e-01 -2.391075180680987e-01 2.068657730122754e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.259000000000000e+03 -3.213545024950241e-01 -8.926006543750893e-01 -2.391493140617919e-01 2.068887650867309e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.260000000000000e+03 -3.213526650426736e-01 -8.925847864852747e-01 -2.391911090874741e-01 2.069117612377602e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.261000000000000e+03 -3.213508250546961e-01 -8.925689159868722e-01 -2.392329031451359e-01 2.069347614670772e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.262000000000000e+03 -3.213489825248347e-01 -8.925530428817239e-01 -2.392746962341820e-01 2.069577657756990e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.263000000000000e+03 -3.213471374549496e-01 -8.925371671690909e-01 -2.393164883534479e-01 2.069807741638291e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.264000000000000e+03 -3.213452898718531e-01 -8.925212888404102e-01 -2.393582794997813e-01 2.070037866289707e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.265000000000000e+03 -3.213434397353936e-01 -8.925054079081086e-01 -2.394000696753849e-01 2.070268031758868e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.266000000000000e+03 -3.213415870772487e-01 -8.924895243620916e-01 -2.394418588767311e-01 2.070498238015626e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.267000000000000e+03 -3.213397318652987e-01 -8.924736382123137e-01 -2.394836471052789e-01 2.070728485098143e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.268000000000000e+03 -3.213378741518182e-01 -8.924577494421992e-01 -2.395254343559156e-01 2.070958772954327e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.269000000000000e+03 -3.213360138736827e-01 -8.924418580714049e-01 -2.395672206326067e-01 2.071189101656314e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.270000000000000e+03 -3.213341510825065e-01 -8.924259640835630e-01 -2.396090059302936e-01 2.071419471152685e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.271000000000000e+03 -3.213322857570556e-01 -8.924100674852297e-01 -2.396507902495322e-01 2.071649881469561e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.272000000000000e+03 -3.213304178905884e-01 -8.923941682783193e-01 -2.396925735899386e-01 2.071880332619102e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.273000000000000e+03 -3.213285475033732e-01 -8.923782664563288e-01 -2.397343559488725e-01 2.072110824583212e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.274000000000000e+03 -3.213266745687743e-01 -8.923623620274868e-01 -2.397761373273599e-01 2.072341357394305e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.275000000000000e+03 -3.213247991211852e-01 -8.923464549808456e-01 -2.398179177216777e-01 2.072571931019204e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.276000000000000e+03 -3.213229211428876e-01 -8.923305453217737e-01 -2.398596971322841e-01 2.072802545481765e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.277000000000000e+03 -3.213210406110691e-01 -8.923146330573244e-01 -2.399014755598461e-01 2.073033200809884e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.278000000000000e+03 -3.213191575672631e-01 -8.922987181743037e-01 -2.399432530000979e-01 2.073263896962715e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.279000000000000e+03 -3.213172719966038e-01 -8.922828006771824e-01 -2.399850294532763e-01 2.073494633961089e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.280000000000000e+03 -3.213153838870884e-01 -8.922668805696130e-01 -2.400268049192177e-01 2.073725411821362e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.281000000000000e+03 -3.213134932484407e-01 -8.922509578483838e-01 -2.400685793961549e-01 2.073956230537134e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.282000000000000e+03 -3.213116000838094e-01 -8.922350325123792e-01 -2.401103528827651e-01 2.074187090108551e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.283000000000000e+03 -3.213097043892471e-01 -8.922191045626352e-01 -2.401521253784460e-01 2.074417990544801e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.284000000000000e+03 -3.213078061603439e-01 -8.922031740004149e-01 -2.401938968824512e-01 2.074648931854126e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.285000000000000e+03 -3.213059054218497e-01 -8.921872408178061e-01 -2.402356673918099e-01 2.074879914013509e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.286000000000000e+03 -3.213040021358197e-01 -8.921713050265432e-01 -2.402774369085116e-01 2.075110937068587e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.287000000000000e+03 -3.213020963273348e-01 -8.921553666186088e-01 -2.403192054295604e-01 2.075342000995991e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.288000000000000e+03 -3.213001879888643e-01 -8.921394255962223e-01 -2.403609729545064e-01 2.075573105807793e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.289000000000000e+03 -3.212982771386341e-01 -8.921234819535242e-01 -2.404027394808796e-01 2.075804251487935e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.290000000000000e+03 -3.212963637433627e-01 -8.921075357007816e-01 -2.404445050103064e-01 2.076035438077111e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.291000000000000e+03 -3.212944478286193e-01 -8.920915868300341e-01 -2.404862695398113e-01 2.076266665541775e-01 1.100000000000000e-10 -3.870000000000000e-11 -1.690000000000000e-11 -1.630000000000000e-11 1.750000000000000e-11 -3.940000000000000e-12 1.270000000000000e-11 5.420000000000000e-11 1.390000000000000e-11 4.740000000000000e-11</ATTLIST>\n\t\t</ATTLISTList>\n\t</ATT>\n\t<TIL>\n\t\t<BANDID>P</BANDID>\n\t\t<NUMTILES>1</NUMTILES>\n\t\t<TILESIZEX>35180</TILESIZEX>\n\t\t<TILESIZEY>21756</TILESIZEY>\n\t\t<TILEUNITS>Pixels</TILEUNITS>\n\t\t<TILEOVERLAP>0</TILEOVERLAP>\n\t\t<TILE>\n\t\t\t<FILENAME>13MAY08000330-P1BS-500063426010_01_P001.NTF</FILENAME>\n\t\t\t<ULCOLOFFSET>0</ULCOLOFFSET>\n\t\t\t<ULROWOFFSET>0</ULROWOFFSET>\n\t\t\t<URCOLOFFSET>35839</URCOLOFFSET>\n\t\t\t<URROWOFFSET>0</URROWOFFSET>\n\t\t\t<LRCOLOFFSET>35839</LRCOLOFFSET>\n\t\t\t<LRROWOFFSET>22527</LRROWOFFSET>\n\t\t\t<LLCOLOFFSET>0</LLCOLOFFSET>\n\t\t\t<LLROWOFFSET>22527</LLROWOFFSET>\n\t\t\t<ULLON>-3.814998154000000e+01</ULLON>\n\t\t\t<ULLAT>7.255587169000000e+01</ULLAT>\n\t\t\t<URLON>-3.868863101000000e+01</URLON>\n\t\t\t<URLAT>7.254679814000001e+01</URLAT>\n\t\t\t<LRLON>-3.869039556000000e+01</LRLON>\n\t\t\t<LRLAT>7.264473667000000e+01</LRLAT>\n\t\t\t<LLLON>-3.814707665000000e+01</LLLON>\n\t\t\t<LLLAT>7.265401095999999e+01</LLLAT>\n\t\t</TILE>\n\t</TIL>\n\t<GEO>\n\t\t<EFFECTIVETIME>2009-10-08T00:00:00.000000Z</EFFECTIVETIME>\n\t\t<MODELGENERATIONTIME>2010-10-26T00:00:00.000000Z</MODELGENERATIONTIME>\n\t\t<SATID>WV02</SATID>\n\t\t<GEOMODELLEVEL>LV1B</GEOMODELLEVEL>\n\t\t<PRINCIPAL_DISTANCE>\n\t\t\t<GENERATIONTIME>2010-01-28T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<PD>1.324613900000000e+04</PD>\n\t\t</PRINCIPAL_DISTANCE>\n\t\t<OPTICAL_DISTORTION>\n\t\t\t<GENERATIONTIME>2009-09-10T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<POLYORDER>-1</POLYORDER>\n\t\t\t<ALISTList/>\n\t\t\t<BLISTList/>\n\t\t</OPTICAL_DISTORTION>\n\t\t<PERSPECTIVE_CENTER>\n\t\t\t<GENERATIONTIME>2009-09-10T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<CX>0.000000000000000e+00</CX>\n\t\t\t<CY>0.000000000000000e+00</CY>\n\t\t\t<CZ>0.000000000000000e+00</CZ>\n\t\t</PERSPECTIVE_CENTER>\n\t\t<CAMERA_ATTITUDE>\n\t\t\t<GENERATIONTIME>2009-09-10T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<QCS1>0.000000000000000e+00</QCS1>\n\t\t\t<QCS2>0.000000000000000e+00</QCS2>\n\t\t\t<QCS3>0.000000000000000e+00</QCS3>\n\t\t\t<QCS4>1.000000000000000e+00</QCS4>\n\t\t</CAMERA_ATTITUDE>\n\t\t<DETECTOR_MOUNTING>\n\t\t\t<GENERATIONTIME>2010-10-26T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<BAND_P>\n\t\t\t\t<BANDID>P</BANDID>\n\t\t\t\t<DETECTOR_ARRAY>\n\t\t\t\t\t<DETARRID>1</DETARRID>\n\t\t\t\t\t<DETORIGINX>-2.590000000000001e-01</DETORIGINX>\n\t\t\t\t\t<DETORIGINY>1.407276907149051e+02</DETORIGINY>\n\t\t\t\t\t<DETROTANGLE>0.000000000000000e+00</DETROTANGLE>\n\t\t\t\t\t<DETPITCH>8.000000000000000e-03</DETPITCH>\n\t\t\t\t</DETECTOR_ARRAY>\n\t\t\t</BAND_P>\n\t\t</DETECTOR_MOUNTING>\n\t</GEO>\n\t<STE>\n\t\t<NUMPAIR>1</NUMPAIR>\n\t\t<STEREO_PAIR>\n\t\t\t<FIRSTID>13MAY08000330-P1BS-500063426010_01_P001.NTF</FIRSTID>\n\t\t\t<SECONDID>13MAY08000439-P1BS-500063426010_01_P001.NTF</SECONDID>\n\t\t\t<OVERLAP>7.120000000000000e-01</OVERLAP>\n\t\t\t<ULLAT>7.265003600000000e+01</ULLAT>\n\t\t\t<ULLON>-3.869039600000000e+01</ULLON>\n\t\t\t<LRLAT>7.255045800000001e+01</LRLAT>\n\t\t\t<LRLON>-3.814754700000000e+01</LRLON>\n\t\t\t<B_CONV>3.433000000000000e+01</B_CONV>\n\t\t\t<E_CONV>3.426000000000000e+01</E_CONV>\n\t\t\t<B_ASYM>1.228000000000000e+01</B_ASYM>\n\t\t\t<E_ASYM>1.203000000000000e+01</E_ASYM>\n\t\t\t<B_BIE>6.745000000000000e+01</B_BIE>\n\t\t\t<E_BIE>6.731000000000000e+01</E_BIE>\n\t\t</STEREO_PAIR>\n\t</STE>\n\t<RPB>\n\t\t<SATID>WV02</SATID>\n\t\t<BANDID>P</BANDID>\n\t\t<SPECID>RPC00B</SPECID>\n\t\t<IMAGE>\n\t\t\t<ERRBIAS>1.657000000000000e+01</ERRBIAS>\n\t\t\t<ERRRAND>1.300000000000000e-01</ERRRAND>\n\t\t\t<LINEOFFSET>10877</LINEOFFSET>\n\t\t\t<SAMPOFFSET>17589</SAMPOFFSET>\n\t\t\t<LATOFFSET>7.260039999999999e+01</LATOFFSET>\n\t\t\t<LONGOFFSET>-3.841850000000000e+01</LONGOFFSET>\n\t\t\t<HEIGHTOFFSET>3226</HEIGHTOFFSET>\n\t\t\t<LINESCALE>10878</LINESCALE>\n\t\t\t<SAMPSCALE>17590</SAMPSCALE>\n\t\t\t<LATSCALE>5.470000000000000e-02</LATSCALE>\n\t\t\t<LONGSCALE>2.761000000000000e-01</LONGSCALE>\n\t\t\t<HEIGHTSCALE>501</HEIGHTSCALE>\n\t\t\t<LINENUMCOEFList>\n\t\t\t\t<LINENUMCOEF>-1.773509000000000e-03 -9.594335000000000e-02 1.115566000000000e+00 1.904674000000000e-02 -1.723221000000000e-04 -1.820258000000000e-05 1.356610000000000e-04 3.657458000000000e-03 3.504544000000000e-04 7.743681000000000e-07 1.133317000000000e-06 -8.556666000000000e-07 -5.610052000000000e-06 1.378561000000000e-06 -1.129529000000000e-05 6.716799000000000e-06 -1.570029000000000e-05 2.654702000000000e-07 1.217045000000000e-06 -2.708721000000000e-07</LINENUMCOEF>\n\t\t\t</LINENUMCOEFList>\n\t\t\t<LINEDENCOEFList>\n\t\t\t\t<LINEDENCOEF>1.000000000000000e+00 3.711317000000000e-04 1.652047000000000e-03 -1.185527000000000e-04 2.817102000000000e-06 1.537155000000000e-06 4.428738000000000e-08 1.503021000000000e-06 -9.376853000000000e-06 -1.411277000000000e-05 3.233315000000000e-06 2.813545000000000e-07 9.466708000000000e-05 2.048689000000000e-08 -8.547989999999999e-06 -3.594078000000000e-04 -3.281037000000000e-07 -1.461260000000000e-07 -1.838717000000000e-05 0.000000000000000e+00</LINEDENCOEF>\n\t\t\t</LINEDENCOEFList>\n\t\t\t<SAMPNUMCOEFList>\n\t\t\t\t<SAMPNUMCOEF>-5.487978000000000e-03 -1.020428000000000e+00 1.378983000000000e-03 -1.575434000000000e-02 2.386416000000000e-03 -2.450612000000000e-04 -1.392399000000000e-04 4.408862000000000e-03 7.709986999999999e-05 -5.951580000000000e-06 8.920986000000000e-07 -6.171271000000000e-06 2.909100000000000e-06 4.372961000000000e-06 -9.758121000000001e-07 5.103912000000000e-05 -2.909542000000000e-08 2.040637000000000e-06 2.861838000000000e-06 6.848166000000000e-08</SAMPNUMCOEF>\n\t\t\t</SAMPNUMCOEFList>\n\t\t\t<SAMPDENCOEFList>\n\t\t\t\t<SAMPDENCOEF>1.000000000000000e+00 -1.108366000000000e-03 2.440852000000000e-03 -3.364124000000000e-04 -5.321415000000000e-08 1.534990000000000e-06 6.571405000000000e-07 8.116123000000000e-06 -3.460231000000000e-06 -4.397034000000000e-06 2.281723000000000e-08 4.064412000000000e-08 2.826080000000000e-07 -1.233733000000000e-08 -1.464247000000000e-07 -1.854672000000000e-07 -2.048275000000000e-08 -1.005810000000000e-08 0.000000000000000e+00 0.000000000000000e+00</SAMPDENCOEF>\n\t\t\t</SAMPDENCOEFList>\n\t\t</IMAGE>\n\t</RPB>\n</isd>\n"
  },
  {
    "path": "src/asp/Camera/tests/wv_test2.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<isd>\n\t<IMD>\n\t\t<VERSION>23.11</VERSION>\n\t\t<GENERATIONTIME>2013-05-08T01:30:28.000000Z</GENERATIONTIME>\n\t\t<PRODUCTORDERID>500063426010_01_P001</PRODUCTORDERID>\n\t\t<PRODUCTCATALOGID>A030011E64C1AA00</PRODUCTCATALOGID>\n\t\t<CHILDCATALOGID>2100011E64C1AB00</CHILDCATALOGID>\n\t\t<IMAGEDESCRIPTOR>Stereo1B</IMAGEDESCRIPTOR>\n\t\t<BANDID>P</BANDID>\n\t\t<PANSHARPENALGORITHM>None</PANSHARPENALGORITHM>\n\t\t<NUMROWS>20480</NUMROWS>\n\t\t<NUMCOLUMNS>35840</NUMCOLUMNS>\n\t\t<PRODUCTLEVEL>Stereo 1B</PRODUCTLEVEL>\n\t\t<PRODUCTTYPE>Stereo</PRODUCTTYPE>\n\t\t<NUMBEROFLOOKS>2</NUMBEROFLOOKS>\n\t\t<RADIOMETRICLEVEL>Corrected</RADIOMETRICLEVEL>\n\t\t<BITSPERPIXEL>16</BITSPERPIXEL>\n\t\t<COMPRESSIONTYPE>JPEG2000</COMPRESSIONTYPE>\n\t\t<JPEGPROFILENAME>nga_npje_pan_vl</JPEGPROFILENAME>\n\t\t<OUTPUTFORMAT>NITF21NCDRD</OUTPUTFORMAT>\n\t\t<BAND_P>\n\t\t\t<ULLON>-3.808772277000000e+01</ULLON>\n\t\t\t<ULLAT>7.253032611000000e+01</ULLAT>\n\t\t\t<ULHAE>3.228280000000000e+03</ULHAE>\n\t\t\t<URLON>-3.875234323000000e+01</URLON>\n\t\t\t<URLAT>7.256520433999999e+01</URLAT>\n\t\t\t<URHAE>3.205400000000000e+03</URHAE>\n\t\t\t<LRLON>-3.875435021000000e+01</LRLON>\n\t\t\t<LRLAT>7.266925209999999e+01</LRLAT>\n\t\t\t<LRHAE>3.221790000000000e+03</LRHAE>\n\t\t\t<LLLON>-3.808531310000000e+01</LLLON>\n\t\t\t<LLLAT>7.263491770000000e+01</LLLAT>\n\t\t\t<LLHAE>3.244690000000000e+03</LLHAE>\n\t\t\t<ABSCALFACTOR>3.788831000000000e-02</ABSCALFACTOR>\n\t\t\t<EFFECTIVEBANDWIDTH>2.846000000000000e-01</EFFECTIVEBANDWIDTH>\n\t\t\t<TDILEVEL>48</TDILEVEL>\n\t\t</BAND_P>\n\t\t<IMAGE>\n\t\t\t<SATID>WV02</SATID>\n\t\t\t<MODE>FullSwath</MODE>\n\t\t\t<SCANDIRECTION>Forward</SCANDIRECTION>\n\t\t\t<CATID>1030010022D83700</CATID>\n\t\t\t<TLCTIME>2013-05-08T00:04:39.554575Z</TLCTIME>\n\t\t\t<NUMTLC>2</NUMTLC>\n\t\t\t<TLCLISTList>\n\t\t\t\t<TLCLIST>0.000000000000000e+00 0.000000000000000e+00</TLCLIST>\n\t\t\t\t<TLCLIST>1.987200000000000e+04 9.936000000000000e-01</TLCLIST>\n\t\t\t</TLCLISTList>\n\t\t\t<FIRSTLINETIME>2013-05-08T00:04:39.554575Z</FIRSTLINETIME>\n\t\t\t<AVGLINERATE>2.000000000000000e+04</AVGLINERATE>\n\t\t\t<EXPOSUREDURATION>2.400000000000000e-03</EXPOSUREDURATION>\n\t\t\t<MINCOLLECTEDROWGSD>5.850000000000000e-01</MINCOLLECTEDROWGSD>\n\t\t\t<MAXCOLLECTEDROWGSD>5.880000000000000e-01</MAXCOLLECTEDROWGSD>\n\t\t\t<MEANCOLLECTEDROWGSD>5.870000000000000e-01</MEANCOLLECTEDROWGSD>\n\t\t\t<MINCOLLECTEDCOLGSD>6.430000000000000e-01</MINCOLLECTEDCOLGSD>\n\t\t\t<MAXCOLLECTEDCOLGSD>6.440000000000000e-01</MAXCOLLECTEDCOLGSD>\n\t\t\t<MEANCOLLECTEDCOLGSD>6.430000000000000e-01</MEANCOLLECTEDCOLGSD>\n\t\t\t<MEANCOLLECTEDGSD>6.140000000000000e-01</MEANCOLLECTEDGSD>\n\t\t\t<MEANPRODUCTROWGSD>5.910000000000000e-01</MEANPRODUCTROWGSD>\n\t\t\t<MEANPRODUCTCOLGSD>6.460000000000000e-01</MEANPRODUCTCOLGSD>\n\t\t\t<MEANPRODUCTGSD>6.180000000000000e-01</MEANPRODUCTGSD>\n\t\t\t<ROWUNCERTAINTY>5.301000000000000e+01</ROWUNCERTAINTY>\n\t\t\t<COLUNCERTAINTY>7.365000000000001e+01</COLUNCERTAINTY>\n\t\t\t<MINSUNAZ>3.255000000000000e+02</MINSUNAZ>\n\t\t\t<MAXSUNAZ>3.255000000000000e+02</MAXSUNAZ>\n\t\t\t<MEANSUNAZ>3.255000000000000e+02</MEANSUNAZ>\n\t\t\t<MINSUNEL>2.700000000000000e+00</MINSUNEL>\n\t\t\t<MAXSUNEL>2.800000000000000e+00</MAXSUNEL>\n\t\t\t<MEANSUNEL>2.800000000000000e+00</MEANSUNEL>\n\t\t\t<MINSATAZ>3.061000000000000e+02</MINSATAZ>\n\t\t\t<MAXSATAZ>3.065000000000000e+02</MAXSATAZ>\n\t\t\t<MEANSATAZ>3.063000000000000e+02</MEANSATAZ>\n\t\t\t<MINSATEL>5.530000000000000e+01</MINSATEL>\n\t\t\t<MAXSATEL>5.570000000000000e+01</MAXSATEL>\n\t\t\t<MEANSATEL>5.550000000000000e+01</MEANSATEL>\n\t\t\t<MININTRACKVIEWANGLE>-2.550000000000000e+01</MININTRACKVIEWANGLE>\n\t\t\t<MAXINTRACKVIEWANGLE>-2.520000000000000e+01</MAXINTRACKVIEWANGLE>\n\t\t\t<MEANINTRACKVIEWANGLE>-2.540000000000000e+01</MEANINTRACKVIEWANGLE>\n\t\t\t<MINCROSSTRACKVIEWANGLE>1.720000000000000e+01</MINCROSSTRACKVIEWANGLE>\n\t\t\t<MAXCROSSTRACKVIEWANGLE>1.750000000000000e+01</MAXCROSSTRACKVIEWANGLE>\n\t\t\t<MEANCROSSTRACKVIEWANGLE>1.730000000000000e+01</MEANCROSSTRACKVIEWANGLE>\n\t\t\t<MINOFFNADIRVIEWANGLE>3.040000000000000e+01</MINOFFNADIRVIEWANGLE>\n\t\t\t<MAXOFFNADIRVIEWANGLE>3.040000000000000e+01</MAXOFFNADIRVIEWANGLE>\n\t\t\t<MEANOFFNADIRVIEWANGLE>3.040000000000000e+01</MEANOFFNADIRVIEWANGLE>\n\t\t\t<PNIIRS>4.700000000000000e+00</PNIIRS>\n\t\t\t<CLOUDCOVER>1.250000000000000e-01</CLOUDCOVER>\n\t\t\t<RESAMPLINGKERNEL>CC</RESAMPLINGKERNEL>\n\t\t\t<POSITIONKNOWLEDGESRC>R</POSITIONKNOWLEDGESRC>\n\t\t\t<ATTITUDEKNOWLEDGESRC>R</ATTITUDEKNOWLEDGESRC>\n\t\t\t<REVNUMBER>18779</REVNUMBER>\n\t\t</IMAGE>\n\t</IMD>\n\t<EPH>\n\t\t<SATID>WV02</SATID>\n\t\t<REVNUMBER>18779</REVNUMBER>\n\t\t<STRIPID>22D837</STRIPID>\n\t\t<TYPE>R</TYPE>\n\t\t<VERSION>A</VERSION>\n\t\t<GENERATIONTIME>2013-05-08T00:59:56.843858Z</GENERATIONTIME>\n\t\t<STARTTIME>2013-05-08T00:04:27.130007Z</STARTTIME>\n\t\t<NUMPOINTS>1293</NUMPOINTS>\n\t\t<TIMEINTERVAL>2.000000000000000e-02</TIMEINTERVAL>\n\t\t<EPHEMLISTList>\n\t\t\t<EPHEMLIST>1.000000000000000e+00 1.277975614733243e+06 -1.501070806665740e+06 6.859130154077343e+06 -7.080085464945229e+03 1.955418862844659e+03 1.743223286971454e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.000000000000000e+00 1.277834012083100e+06 -1.501031697543182e+06 6.859165017219362e+06 -7.080107555321261e+03 1.955472234452912e+03 1.743072908977810e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.000000000000000e+00 1.277692408992321e+06 -1.500992587353534e+06 6.859199877353513e+06 -7.080129642023668e+03 1.955525605196459e+03 1.742922532024959e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.000000000000000e+00 1.277550805461170e+06 -1.500953476096858e+06 6.859234734479731e+06 -7.080151725869380e+03 1.955578975384485e+03 1.742772152482353e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.000000000000000e+00 1.277409201489610e+06 -1.500914363773146e+06 6.859269588598025e+06 -7.080173806452748e+03 1.955632344697444e+03 1.742621772347835e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.000000000000000e+00 1.277267597077711e+06 -1.500875250382415e+06 6.859304439708383e+06 -7.080195883800284e+03 1.955685713403128e+03 1.742471391200515e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.000000000000000e+00 1.277125992225428e+06 -1.500836135924648e+06 6.859339287810812e+06 -7.080217958186513e+03 1.955739081693046e+03 1.742321007716768e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.000000000000000e+00 1.276984386933035e+06 -1.500797020399922e+06 6.859374132905249e+06 -7.080240028544998e+03 1.955792448084761e+03 1.742170627906655e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.000000000000000e+00 1.276842781200492e+06 -1.500757903808218e+06 6.859408974991702e+06 -7.080262096218950e+03 1.955845814206418e+03 1.742020244481447e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.000000000000000e+01 1.276701175027770e+06 -1.500718786149538e+06 6.859443814070179e+06 -7.080284160507416e+03 1.955899179892015e+03 1.741869860440808e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.100000000000000e+01 1.276559568415127e+06 -1.500679667423937e+06 6.859478650140620e+06 -7.080306221794584e+03 1.955952544790790e+03 1.741719474659717e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.200000000000000e+01 1.276417961362528e+06 -1.500640547631408e+06 6.859513483203030e+06 -7.080328280022307e+03 1.956005909007752e+03 1.741569087247179e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.300000000000000e+01 1.276276353870047e+06 -1.500601426771977e+06 6.859548313257394e+06 -7.080350334300894e+03 1.956059271651452e+03 1.741418702813297e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.400000000000000e+01 1.276134745937636e+06 -1.500562304845617e+06 6.859583140303727e+06 -7.080372385639881e+03 1.956112634125812e+03 1.741268315665430e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.500000000000000e+01 1.275993137565568e+06 -1.500523181852406e+06 6.859617964341960e+06 -7.080394433793421e+03 1.956165995632611e+03 1.741117927726792e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.600000000000000e+01 1.275851528753806e+06 -1.500484057792333e+06 6.859652785372102e+06 -7.080416478880534e+03 1.956219356408780e+03 1.740967538241925e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.700000000000000e+01 1.275709919502418e+06 -1.500444932665417e+06 6.859687603394139e+06 -7.080438520553413e+03 1.956272716414024e+03 1.740817148650819e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.800000000000000e+01 1.275568309811362e+06 -1.500405806471639e+06 6.859722418408078e+06 -7.080460559238199e+03 1.956326076082144e+03 1.740666756736325e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.900000000000000e+01 1.275426699680907e+06 -1.500366679211071e+06 6.859757230413858e+06 -7.080482594042190e+03 1.956379434007661e+03 1.740516367728276e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.000000000000000e+01 1.275285089111020e+06 -1.500327550883706e+06 6.859792039411488e+06 -7.080504625843128e+03 1.956432791255043e+03 1.740365976858435e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.100000000000000e+01 1.275143478101664e+06 -1.500288421489533e+06 6.859826845400977e+06 -7.080526654455241e+03 1.956486148208258e+03 1.740215584418429e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.200000000000000e+01 1.275001866653102e+06 -1.500249291028613e+06 6.859861648382260e+06 -7.080548680059202e+03 1.956539504428657e+03 1.740065190200882e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.300000000000000e+01 1.274860254765300e+06 -1.500210159500943e+06 6.859896448355345e+06 -7.080570702262601e+03 1.956592859490131e+03 1.739914796279682e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.400000000000000e+01 1.274718642438326e+06 -1.500171026906539e+06 6.859931245320219e+06 -7.080592721177203e+03 1.956646213997944e+03 1.739764401494241e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.500000000000000e+01 1.274577029672140e+06 -1.500131893245387e+06 6.859966039276892e+06 -7.080614736684633e+03 1.956699567470963e+03 1.739614006885750e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.600000000000000e+01 1.274435416467009e+06 -1.500092758517554e+06 6.860000830225297e+06 -7.080636749130788e+03 1.956752920231535e+03 1.739463610688385e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.700000000000000e+01 1.274293802822902e+06 -1.500053622723036e+06 6.860035618165446e+06 -7.080658758374102e+03 1.956806272284271e+03 1.739313213463921e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.800000000000000e+01 1.274152188739775e+06 -1.500014485861816e+06 6.860070403097345e+06 -7.080680764461217e+03 1.956859623770626e+03 1.739162814858571e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.900000000000000e+01 1.274010574217900e+06 -1.499975347933965e+06 6.860105185020934e+06 -7.080702767302279e+03 1.956912974505145e+03 1.739012415450964e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.000000000000000e+01 1.273868959257243e+06 -1.499936208939476e+06 6.860139963936220e+06 -7.080724766631418e+03 1.956966323891058e+03 1.738862017010504e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.100000000000000e+01 1.273727343857863e+06 -1.499897068878359e+06 6.860174739843188e+06 -7.080746762831512e+03 1.957019672871474e+03 1.738711616890618e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.200000000000000e+01 1.273585728019722e+06 -1.499857927750601e+06 6.860209512741847e+06 -7.080768755995578e+03 1.957073020993759e+03 1.738561215251779e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.300000000000000e+01 1.273444111743101e+06 -1.499818785556285e+06 6.860244282632134e+06 -7.080790745214775e+03 1.957126367880556e+03 1.738410816183417e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.400000000000000e+01 1.273302495027950e+06 -1.499779642295385e+06 6.860279049514055e+06 -7.080812732062238e+03 1.957179714703994e+03 1.738260411994894e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.500000000000000e+01 1.273160877874235e+06 -1.499740497967895e+06 6.860313813387623e+06 -7.080834715215557e+03 1.957233060587469e+03 1.738110009023058e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.600000000000000e+01 1.273019260282227e+06 -1.499701352573886e+06 6.860348574252777e+06 -7.080856695271610e+03 1.957286405376175e+03 1.737959605056797e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.700000000000000e+01 1.272877642251890e+06 -1.499662206113349e+06 6.860383332109516e+06 -7.080878671836687e+03 1.957339749450951e+03 1.737809201226220e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.800000000000000e+01 1.272736023783285e+06 -1.499623058586294e+06 6.860418086957834e+06 -7.080900645370960e+03 1.957393092651315e+03 1.737658795874667e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.900000000000000e+01 1.272594404876377e+06 -1.499583909992712e+06 6.860452838797735e+06 -7.080922615569670e+03 1.957446435402870e+03 1.737508389722554e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.000000000000000e+01 1.272452785531435e+06 -1.499544760332676e+06 6.860487587629161e+06 -7.080944582946368e+03 1.957499777522867e+03 1.737357980924733e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.100000000000000e+01 1.272311165748422e+06 -1.499505609606171e+06 6.860522333452112e+06 -7.080966546382045e+03 1.957553118189333e+03 1.737207574941565e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.200000000000000e+01 1.272169545527403e+06 -1.499466457813215e+06 6.860557076266579e+06 -7.080988506928743e+03 1.957606458182827e+03 1.737057166630337e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.300000000000000e+01 1.272027924868342e+06 -1.499427304953797e+06 6.860591816072573e+06 -7.081010464222955e+03 1.957659797616406e+03 1.736906757316205e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.400000000000000e+01 1.271886303771509e+06 -1.499388151027991e+06 6.860626552870025e+06 -7.081032418502842e+03 1.957713136856462e+03 1.736756345610511e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.500000000000000e+01 1.271744682236858e+06 -1.499348996035771e+06 6.860661286658949e+06 -7.081054369360214e+03 1.957766474515025e+03 1.736605934790309e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.600000000000000e+01 1.271603060264361e+06 -1.499309839977139e+06 6.860696017439351e+06 -7.081076316884521e+03 1.957819811612980e+03 1.736455523291423e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.700000000000000e+01 1.271461437854286e+06 -1.499270682852165e+06 6.860730745211167e+06 -7.081098260834540e+03 1.957873147481423e+03 1.736305112872417e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.800000000000000e+01 1.271319815006591e+06 -1.499231524660829e+06 6.860765469974408e+06 -7.081120201928088e+03 1.957926482889876e+03 1.736154699742408e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.900000000000000e+01 1.271178191721348e+06 -1.499192365403158e+06 6.860800191729057e+06 -7.081142140199980e+03 1.957979818152778e+03 1.736004283389589e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.000000000000000e+01 1.271036567998511e+06 -1.499153205079129e+06 6.860834910475126e+06 -7.081164074490711e+03 1.958033151526518e+03 1.735853870530139e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.100000000000000e+01 1.270894943838359e+06 -1.499114043688823e+06 6.860869626212548e+06 -7.081186005729794e+03 1.958086484887003e+03 1.735703455215250e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.200000000000000e+01 1.270753319240846e+06 -1.499074881232218e+06 6.860904338941332e+06 -7.081207934195103e+03 1.958139817365332e+03 1.735553037354915e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.300000000000000e+01 1.270611694205940e+06 -1.499035717709312e+06 6.860939048661492e+06 -7.081229858476938e+03 1.958193148354959e+03 1.735402623328838e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.400000000000000e+01 1.270470068733910e+06 -1.498996553120171e+06 6.860973755372959e+06 -7.081251780077787e+03 1.958246479121937e+03 1.735252205605265e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.500000000000000e+01 1.270328442824714e+06 -1.498957387464783e+06 6.861008459075743e+06 -7.081273698425473e+03 1.958299808949571e+03 1.735101787329593e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.600000000000000e+01 1.270186816478427e+06 -1.498918220743170e+06 6.861043159769831e+06 -7.081295613539393e+03 1.958353138021725e+03 1.734951368206597e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.700000000000000e+01 1.270045189694998e+06 -1.498879052955307e+06 6.861077857455232e+06 -7.081317525495271e+03 1.958406466772293e+03 1.734800947418952e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.800000000000000e+01 1.269903562474707e+06 -1.498839884101277e+06 6.861112552131880e+06 -7.081339433991086e+03 1.958459793951173e+03 1.734650527658395e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.900000000000000e+01 1.269761934817514e+06 -1.498800714181066e+06 6.861147243799785e+06 -7.081361339506097e+03 1.958513120937333e+03 1.734500105368344e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.000000000000000e+01 1.269620306723377e+06 -1.498761543194655e+06 6.861181932458958e+06 -7.081383241585024e+03 1.958566446941117e+03 1.734349683312390e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.100000000000000e+01 1.269478678192573e+06 -1.498722371142127e+06 6.861216618109332e+06 -7.081405140294772e+03 1.958619772003677e+03 1.734199261173164e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.200000000000000e+01 1.269337049225059e+06 -1.498683198023460e+06 6.861251300750919e+06 -7.081427035764758e+03 1.958673096051972e+03 1.734048838516909e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.300000000000000e+01 1.269195419820906e+06 -1.498644023838680e+06 6.861285980383703e+06 -7.081448928158401e+03 1.958726419705616e+03 1.733898413953553e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.400000000000000e+01 1.269053789980065e+06 -1.498604848587760e+06 6.861320657007693e+06 -7.081470817292929e+03 1.958779742437530e+03 1.733747988841390e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.500000000000000e+01 1.268912159702820e+06 -1.498565672270788e+06 6.861355330622824e+06 -7.081492703465158e+03 1.958833064989030e+03 1.733597561109542e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.600000000000000e+01 1.268770528989125e+06 -1.498526494887742e+06 6.861390001229109e+06 -7.081514586153334e+03 1.958886386179607e+03 1.733447134253107e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.700000000000000e+01 1.268628897839044e+06 -1.498487316438637e+06 6.861424668826527e+06 -7.081536465721433e+03 1.958939706691500e+03 1.733296706000968e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.800000000000000e+01 1.268487266252541e+06 -1.498448136923464e+06 6.861459333415092e+06 -7.081558341661736e+03 1.958993026274204e+03 1.733146278691989e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.900000000000000e+01 1.268345634229888e+06 -1.498408956342295e+06 6.861493994994740e+06 -7.081580214773953e+03 1.959046345204005e+03 1.732995848782110e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.000000000000000e+01 1.268204001771048e+06 -1.498369774695121e+06 6.861528653565477e+06 -7.081602084259704e+03 1.959099663131544e+03 1.732845419896818e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.100000000000000e+01 1.268062368875983e+06 -1.498330591981926e+06 6.861563309127316e+06 -7.081623950526329e+03 1.959152980120807e+03 1.732694990321718e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.200000000000000e+01 1.267920735544959e+06 -1.498291408202782e+06 6.861597961680189e+06 -7.081645813661064e+03 1.959206296742693e+03 1.732544559029733e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.300000000000000e+01 1.267779101777943e+06 -1.498252223357677e+06 6.861632611224107e+06 -7.081667673573832e+03 1.959259612434515e+03 1.732394127049477e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.400000000000000e+01 1.267637467574992e+06 -1.498213037446621e+06 6.861667257759058e+06 -7.081689530341293e+03 1.959312927104300e+03 1.732243694181371e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.500000000000000e+01 1.267495832936082e+06 -1.498173850469617e+06 6.861701901285047e+06 -7.081711383710837e+03 1.959366241441103e+03 1.732093260626029e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.600000000000000e+01 1.267354197861469e+06 -1.498134662426721e+06 6.861736541802010e+06 -7.081733233891951e+03 1.959419554677934e+03 1.731942826448721e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.700000000000000e+01 1.267212562351127e+06 -1.498095473317932e+06 6.861771179309961e+06 -7.081755080889679e+03 1.959472867110387e+03 1.731792391278981e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.800000000000000e+01 1.267070926405009e+06 -1.498056283143230e+06 6.861805813808907e+06 -7.081776924869973e+03 1.959526179387586e+03 1.731641953679318e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.900000000000000e+01 1.266929290023389e+06 -1.498017091902690e+06 6.861840445298782e+06 -7.081798765005372e+03 1.959579489791722e+03 1.731491519017142e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.000000000000000e+01 1.266787653206232e+06 -1.497977899596303e+06 6.861875073779596e+06 -7.081820602237897e+03 1.959632800145266e+03 1.731341081339701e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.100000000000000e+01 1.266646015953596e+06 -1.497938706224077e+06 6.861909699251332e+06 -7.081842436357881e+03 1.959686109416582e+03 1.731190642713635e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.200000000000000e+01 1.266504378265451e+06 -1.497899511786009e+06 6.861944321714007e+06 -7.081864266911400e+03 1.959739417955019e+03 1.731040204553203e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.300000000000000e+01 1.266362740142062e+06 -1.497860316282164e+06 6.861978941167548e+06 -7.081886094514724e+03 1.959792725962994e+03 1.730889764136124e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.400000000000000e+01 1.266221101583396e+06 -1.497821119712536e+06 6.862013557611970e+06 -7.081907918842317e+03 1.959846032645624e+03 1.730739323716051e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.500000000000000e+01 1.266079462589409e+06 -1.497781922077107e+06 6.862048171047280e+06 -7.081929739759476e+03 1.959899339066763e+03 1.730588882574353e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.600000000000000e+01 1.265937823160377e+06 -1.497742723375953e+06 6.862082781473414e+06 -7.081951557461028e+03 1.959952644538048e+03 1.730438440742323e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.700000000000000e+01 1.265796183296258e+06 -1.497703523609056e+06 6.862117388890382e+06 -7.081973371800826e+03 1.960005948942229e+03 1.730287998948021e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.800000000000000e+01 1.265654542997119e+06 -1.497664322776439e+06 6.862151993298169e+06 -7.081995183281879e+03 1.960059252782264e+03 1.730137554567828e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.900000000000000e+01 1.265512902262919e+06 -1.497625120878082e+06 6.862186594696783e+06 -7.082016991239991e+03 1.960112555900934e+03 1.729987110464841e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.000000000000000e+01 1.265371261093936e+06 -1.497585917914067e+06 6.862221193086161e+06 -7.082038795834719e+03 1.960165857888345e+03 1.729836666482483e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.100000000000000e+01 1.265229619490127e+06 -1.497546713884375e+06 6.862255788466314e+06 -7.082060597500227e+03 1.960219159522584e+03 1.729686219947508e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.200000000000000e+01 1.265087977451557e+06 -1.497507508789026e+06 6.862290380837224e+06 -7.082082395318664e+03 1.960272459499908e+03 1.729535776107057e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.300000000000000e+01 1.264946334978188e+06 -1.497468302628002e+06 6.862324970198901e+06 -7.082104190590510e+03 1.960325759987193e+03 1.729385327146735e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.400000000000000e+01 1.264804692070286e+06 -1.497429095401372e+06 6.862359556551283e+06 -7.082125982591944e+03 1.960379058995112e+03 1.729234878345364e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.500000000000000e+01 1.264663048727826e+06 -1.497389887109140e+06 6.862394139894377e+06 -7.082147771140044e+03 1.960432357382921e+03 1.729084429420842e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.600000000000000e+01 1.264521404950757e+06 -1.497350677751278e+06 6.862428720228193e+06 -7.082169556054824e+03 1.960485654480762e+03 1.728933981894523e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.700000000000000e+01 1.264379760739355e+06 -1.497311467327863e+06 6.862463297552668e+06 -7.082191338415921e+03 1.960538951518357e+03 1.728783529952193e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.800000000000000e+01 1.264238116093583e+06 -1.497272255838885e+06 6.862497871867812e+06 -7.082213117236932e+03 1.960592247365076e+03 1.728633078914438e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.900000000000000e+01 1.264096471013508e+06 -1.497233043284362e+06 6.862532443173607e+06 -7.082234892761926e+03 1.960645542606042e+03 1.728482627102186e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.000000000000000e+02 1.263954825499083e+06 -1.497193829664271e+06 6.862567011470065e+06 -7.082256664721045e+03 1.960698836423944e+03 1.728332176574967e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.010000000000000e+02 1.263813179550584e+06 -1.497154614978692e+06 6.862601576757121e+06 -7.082278434345064e+03 1.960752130527406e+03 1.728181720337588e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.020000000000000e+02 1.263671533167978e+06 -1.497115399227616e+06 6.862636139034781e+06 -7.082300200132802e+03 1.960805423188265e+03 1.728031266499469e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.030000000000000e+02 1.263529886351220e+06 -1.497076182411024e+06 6.862670698303061e+06 -7.082321962670688e+03 1.960858715173601e+03 1.727880811783453e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.040000000000000e+02 1.263388239100585e+06 -1.497036964528992e+06 6.862705254561895e+06 -7.082343722004905e+03 1.960912006379021e+03 1.727730356127161e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.050000000000000e+02 1.263246591416036e+06 -1.496997745581510e+06 6.862739807811285e+06 -7.082365478062042e+03 1.960965296714945e+03 1.727579899933326e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.060000000000000e+02 1.263104943297629e+06 -1.496958525568582e+06 6.862774358051228e+06 -7.082387230946268e+03 1.961018586178600e+03 1.727429442784757e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.070000000000000e+02 1.262963294745331e+06 -1.496919304490205e+06 6.862808905281724e+06 -7.082408980519485e+03 1.961071874909006e+03 1.727278985073721e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.080000000000000e+02 1.262821645759424e+06 -1.496880082346460e+06 6.862843449502712e+06 -7.082430726314864e+03 1.961125162366909e+03 1.727128529326122e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.090000000000000e+02 1.262679996339853e+06 -1.496840859137317e+06 6.862877990714204e+06 -7.082452469961952e+03 1.961178450101697e+03 1.726978067120744e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.100000000000000e+02 1.262538346486586e+06 -1.496801634862771e+06 6.862912528916206e+06 -7.082474209447031e+03 1.961231736159954e+03 1.726827608910547e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.110000000000000e+02 1.262396696199895e+06 -1.496762409522894e+06 6.862947064108655e+06 -7.082495946050101e+03 1.961285021754289e+03 1.726677148085449e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.120000000000000e+02 1.262255045479742e+06 -1.496723183117677e+06 6.862981596291561e+06 -7.082517679730568e+03 1.961338306937351e+03 1.726526684746261e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.130000000000000e+02 1.262113394326193e+06 -1.496683955647134e+06 6.863016125464908e+06 -7.082539409930389e+03 1.961391590752066e+03 1.726376222284996e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.140000000000000e+02 1.261971742739211e+06 -1.496644727111254e+06 6.863050651628704e+06 -7.082561136543350e+03 1.961444873968785e+03 1.726225760214800e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.150000000000000e+02 1.261830090719059e+06 -1.496605497510102e+06 6.863085174782890e+06 -7.082582860161658e+03 1.961498156366702e+03 1.726075296406127e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.160000000000000e+02 1.261688438265705e+06 -1.496566266843671e+06 6.863119694927470e+06 -7.082604580560283e+03 1.961551437963249e+03 1.725924831747176e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.170000000000000e+02 1.261546785379216e+06 -1.496527035111981e+06 6.863154212062431e+06 -7.082626297700375e+03 1.961604718840533e+03 1.725774366297206e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.180000000000000e+02 1.261405132059549e+06 -1.496487802315011e+06 6.863188726187783e+06 -7.082648011593342e+03 1.961657998792408e+03 1.725623900255425e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.190000000000000e+02 1.261263478306980e+06 -1.496448568452843e+06 6.863223237303461e+06 -7.082669722227110e+03 1.961711278129996e+03 1.725473433300399e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.200000000000000e+02 1.261121824121466e+06 -1.496409333525456e+06 6.863257745409475e+06 -7.082691429968057e+03 1.961764556828026e+03 1.725322963981265e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.210000000000000e+02 1.260980169502972e+06 -1.496370097532843e+06 6.863292250505836e+06 -7.082713133736045e+03 1.961817834320829e+03 1.725172497337207e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.220000000000000e+02 1.260838514451764e+06 -1.496330860475070e+06 6.863326752592475e+06 -7.082734834684118e+03 1.961871111127050e+03 1.725022028090344e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.230000000000000e+02 1.260696858967813e+06 -1.496291622352134e+06 6.863361251669405e+06 -7.082756532313548e+03 1.961924387153397e+03 1.724871558367602e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.240000000000000e+02 1.260555203051174e+06 -1.496252383164041e+06 6.863395747736613e+06 -7.082778226786490e+03 1.961977662257060e+03 1.724721087683493e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.250000000000000e+02 1.260413546701821e+06 -1.496213142910793e+06 6.863430240794106e+06 -7.082799917714420e+03 1.962030936877924e+03 1.724570617085125e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.260000000000000e+02 1.260271889920008e+06 -1.496173901592442e+06 6.863464730841818e+06 -7.082821605854760e+03 1.962084210542596e+03 1.724420144073511e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.270000000000000e+02 1.260130232705713e+06 -1.496134659208993e+06 6.863499217879761e+06 -7.082843290500750e+03 1.962137483640987e+03 1.724269671042175e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.280000000000000e+02 1.259988575058886e+06 -1.496095415760420e+06 6.863533701907943e+06 -7.082864971931578e+03 1.962190755614584e+03 1.724119197527433e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.290000000000000e+02 1.259846916979806e+06 -1.496056171246808e+06 6.863568182926304e+06 -7.082886650111792e+03 1.962244027016180e+03 1.723968723014143e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.300000000000000e+02 1.259705258468435e+06 -1.496016925668141e+06 6.863602660934849e+06 -7.082908325023592e+03 1.962297297555653e+03 1.723818247919947e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.310000000000000e+02 1.259563599524831e+06 -1.495977679024429e+06 6.863637135933564e+06 -7.082929996500288e+03 1.962350566694507e+03 1.723667773561073e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.320000000000000e+02 1.259421940148966e+06 -1.495938431315669e+06 6.863671607922456e+06 -7.082951665361724e+03 1.962403836329333e+03 1.723517294360100e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.330000000000000e+02 1.259280280341101e+06 -1.495899182541925e+06 6.863706076901467e+06 -7.082973330352719e+03 1.962457104487481e+03 1.723366817746563e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.340000000000000e+02 1.259138620101198e+06 -1.495859932703183e+06 6.863740542870603e+06 -7.082994992078637e+03 1.962510371116963e+03 1.723216341333476e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.350000000000000e+02 1.258996959429228e+06 -1.495820681799441e+06 6.863775005829871e+06 -7.083016651043484e+03 1.962563638365777e+03 1.723065860520191e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.360000000000000e+02 1.258855298325453e+06 -1.495781429830762e+06 6.863809465779211e+06 -7.083038306550586e+03 1.962616903904171e+03 1.722915380903648e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.370000000000000e+02 1.258713636789843e+06 -1.495742176797142e+06 6.863843922718630e+06 -7.083059958917406e+03 1.962670169229687e+03 1.722764899413401e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.380000000000000e+02 1.258571974822456e+06 -1.495702922698588e+06 6.863878376648115e+06 -7.083081607898433e+03 1.962723433285538e+03 1.722614418303465e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.390000000000000e+02 1.258430312423257e+06 -1.495663667535093e+06 6.863912827567673e+06 -7.083103253130765e+03 1.962776696157224e+03 1.722463938941534e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.400000000000000e+02 1.258288649592516e+06 -1.495624411306729e+06 6.863947275477242e+06 -7.083124895774053e+03 1.962829958993271e+03 1.722313455262495e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.410000000000000e+02 1.258146986330195e+06 -1.495585154013482e+06 6.863981720376831e+06 -7.083146535029170e+03 1.962883220669826e+03 1.722162971842312e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.420000000000000e+02 1.258005322636364e+06 -1.495545895655374e+06 6.864016162266424e+06 -7.083168171034293e+03 1.962936481703018e+03 1.722012487505825e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.430000000000000e+02 1.257863658510973e+06 -1.495506636232380e+06 6.864050601146031e+06 -7.083189804067145e+03 1.962989742365723e+03 1.721862000802466e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.440000000000000e+02 1.257721993954304e+06 -1.495467375744582e+06 6.864085037015590e+06 -7.083211433244048e+03 1.963043001373058e+03 1.721711516844754e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.450000000000000e+02 1.257580328966312e+06 -1.495428114191963e+06 6.864119469875108e+06 -7.083233059525935e+03 1.963096259915190e+03 1.721561030320300e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.460000000000000e+02 1.257438663546969e+06 -1.495388851574521e+06 6.864153899724594e+06 -7.083254682853590e+03 1.963149518203748e+03 1.721410541215898e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.470000000000000e+02 1.257296997696533e+06 -1.495349587892314e+06 6.864188326563985e+06 -7.083276302605626e+03 1.963202775342209e+03 1.721260053119047e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.480000000000000e+02 1.257155331414971e+06 -1.495310323145336e+06 6.864222750393290e+06 -7.083297918783775e+03 1.963256031120000e+03 1.721109566274632e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.490000000000000e+02 1.257013664702351e+06 -1.495271057333604e+06 6.864257171212494e+06 -7.083319532256590e+03 1.963309286587055e+03 1.720959075909680e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.500000000000000e+02 1.256871997558636e+06 -1.495231790457110e+06 6.864291589021611e+06 -7.083341142085642e+03 1.963362541280387e+03 1.720808586379693e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.510000000000000e+02 1.256730329984085e+06 -1.495192522515911e+06 6.864326003820568e+06 -7.083362748870910e+03 1.963415795092356e+03 1.720658095381770e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.520000000000000e+02 1.256588661978675e+06 -1.495153253510012e+06 6.864360415609383e+06 -7.083384352425511e+03 1.963469048099462e+03 1.720507603581891e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.530000000000000e+02 1.256446993542359e+06 -1.495113983439388e+06 6.864394824388061e+06 -7.083405952872324e+03 1.963522300554192e+03 1.720357110180272e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.540000000000000e+02 1.256305324675412e+06 -1.495074712304121e+06 6.864429230156538e+06 -7.083427549881492e+03 1.963575552135078e+03 1.720206616898105e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.550000000000000e+02 1.256163655377793e+06 -1.495035440104193e+06 6.864463632914825e+06 -7.083449143533328e+03 1.963628802532863e+03 1.720056123779504e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.560000000000000e+02 1.256021985649570e+06 -1.494996166839623e+06 6.864498032662906e+06 -7.083470734118826e+03 1.963682052459244e+03 1.719905628794251e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.570000000000000e+02 1.255880315490701e+06 -1.494956892510394e+06 6.864532429400789e+06 -7.083492321365866e+03 1.963735301595501e+03 1.719755133426495e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.580000000000000e+02 1.255738644901458e+06 -1.494917617116580e+06 6.864566823128414e+06 -7.083513905650900e+03 1.963788550049706e+03 1.719604636020327e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.590000000000000e+02 1.255596973881807e+06 -1.494878340658175e+06 6.864601213845787e+06 -7.083535485939020e+03 1.963841796863238e+03 1.719454141919162e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.600000000000000e+02 1.255455302431706e+06 -1.494839063135159e+06 6.864635601552921e+06 -7.083557063854827e+03 1.963895044085571e+03 1.719303642083602e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.610000000000000e+02 1.255313630551428e+06 -1.494799784547610e+06 6.864669986249748e+06 -7.083578638306923e+03 1.963948290306610e+03 1.719153142625959e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.620000000000000e+02 1.255171958240932e+06 -1.494760504895509e+06 6.864704367936278e+06 -7.083600209243563e+03 1.964001535095513e+03 1.719002644271683e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.630000000000000e+02 1.255030285500284e+06 -1.494721224178874e+06 6.864738746612498e+06 -7.083621777224162e+03 1.964054779599013e+03 1.718852143380000e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.640000000000000e+02 1.254888612329445e+06 -1.494681942397694e+06 6.864773122278419e+06 -7.083643341517491e+03 1.964108022805265e+03 1.718701644127963e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.650000000000000e+02 1.254746938728692e+06 -1.494642659552046e+06 6.864807494933970e+06 -7.083664903127052e+03 1.964161266081328e+03 1.718551140808383e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.660000000000000e+02 1.254605264697980e+06 -1.494603375641910e+06 6.864841864579169e+06 -7.083686461407092e+03 1.964214508090744e+03 1.718400637640080e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.670000000000000e+02 1.254463590237379e+06 -1.494564090667309e+06 6.864876231213996e+06 -7.083708016113393e+03 1.964267748945947e+03 1.718250135480147e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.680000000000000e+02 1.254321915346846e+06 -1.494524804628224e+06 6.864910594838463e+06 -7.083729567865837e+03 1.964320989611081e+03 1.718099630658975e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.690000000000000e+02 1.254180240026656e+06 -1.494485517524732e+06 6.864944955452503e+06 -7.083751116027724e+03 1.964374229035549e+03 1.717949127018187e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.700000000000000e+02 1.254038564276764e+06 -1.494446229356813e+06 6.864979313056125e+06 -7.083772661199650e+03 1.964427467689245e+03 1.717798621557386e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.710000000000000e+02 1.253896888097141e+06 -1.494406940124464e+06 6.865013667649345e+06 -7.083794203180881e+03 1.964480705934556e+03 1.717648114657612e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.720000000000000e+02 1.253755211488053e+06 -1.494367649827755e+06 6.865048019232092e+06 -7.083815741466831e+03 1.964533942736259e+03 1.717497609607052e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.730000000000000e+02 1.253613534449464e+06 -1.494328358466673e+06 6.865082367804380e+06 -7.083837276696088e+03 1.964587178864454e+03 1.717347102890914e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.740000000000000e+02 1.253471856981437e+06 -1.494289066041233e+06 6.865116713366190e+06 -7.083858809004419e+03 1.964640414668380e+03 1.717196593539322e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.750000000000000e+02 1.253330179083936e+06 -1.494249772551422e+06 6.865151055917535e+06 -7.083880338217562e+03 1.964693649879531e+03 1.717046082581131e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.760000000000000e+02 1.253188500757231e+06 -1.494210477997315e+06 6.865185395458348e+06 -7.083901863961857e+03 1.964746884105160e+03 1.716895572004474e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.770000000000000e+02 1.253046822001282e+06 -1.494171182378897e+06 6.865219731988643e+06 -7.083923386227572e+03 1.964800117028596e+03 1.716745062228457e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.780000000000000e+02 1.252905142816053e+06 -1.494131885696158e+06 6.865254065508426e+06 -7.083944905347381e+03 1.964853349511313e+03 1.716594550869903e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.790000000000000e+02 1.252763463201815e+06 -1.494092587949169e+06 6.865288396017633e+06 -7.083966420918483e+03 1.964906580833919e+03 1.716444040427199e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.800000000000000e+02 1.252621783158526e+06 -1.494053289137914e+06 6.865322723516273e+06 -7.083987933882649e+03 1.964959811957581e+03 1.716293525921877e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.810000000000000e+02 1.252480102686258e+06 -1.494013989262417e+06 6.865357048004335e+06 -7.084009442977567e+03 1.965013041609423e+03 1.716143014008724e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.820000000000000e+02 1.252338421784965e+06 -1.493974688322657e+06 6.865391369481824e+06 -7.084030949160932e+03 1.965066270805067e+03 1.715992499578805e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.830000000000000e+02 1.252196740454927e+06 -1.493935386318716e+06 6.865425687948676e+06 -7.084052452191354e+03 1.965119499477684e+03 1.715841983692996e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.840000000000000e+02 1.252055058696101e+06 -1.493896083250575e+06 6.865460003404906e+06 -7.084073951913686e+03 1.965172726990614e+03 1.715691467744955e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.850000000000000e+02 1.251913376508448e+06 -1.493856779118225e+06 6.865494315850519e+06 -7.084095448307715e+03 1.965225953989725e+03 1.715540951042814e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.860000000000000e+02 1.251771693892243e+06 -1.493817473921738e+06 6.865528625285448e+06 -7.084116941298659e+03 1.965279179874863e+03 1.715390434610180e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.870000000000000e+02 1.251630010847439e+06 -1.493778167661093e+06 6.865562931709709e+06 -7.084138431250392e+03 1.965332404998175e+03 1.715239916545386e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.880000000000000e+02 1.251488327374113e+06 -1.493738860336324e+06 6.865597235123286e+06 -7.084159918109814e+03 1.965385629689516e+03 1.715089396668571e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.890000000000000e+02 1.251346643472217e+06 -1.493699551947400e+06 6.865631535526184e+06 -7.084181401514576e+03 1.965438853455847e+03 1.714938877044548e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.900000000000000e+02 1.251204959142027e+06 -1.493660242494403e+06 6.865665832918343e+06 -7.084202881728082e+03 1.965492076331007e+03 1.714788356561515e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.910000000000000e+02 1.251063274383499e+06 -1.493620931977316e+06 6.865700127299769e+06 -7.084224358494449e+03 1.965545298087863e+03 1.714637836532889e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.920000000000000e+02 1.250921589196710e+06 -1.493581620396165e+06 6.865734418670454e+06 -7.084245832211092e+03 1.965598519455440e+03 1.714487314467562e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.930000000000000e+02 1.250779903581609e+06 -1.493542307750924e+06 6.865768707030401e+06 -7.084267302631671e+03 1.965651739972964e+03 1.714336791920288e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.940000000000000e+02 1.250638217538475e+06 -1.493502994041675e+06 6.865802992379547e+06 -7.084288770002937e+03 1.965704959860414e+03 1.714186267623106e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.950000000000000e+02 1.250496531067264e+06 -1.493463679268399e+06 6.865837274717905e+06 -7.084310233855479e+03 1.965758178430443e+03 1.714035744310891e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.960000000000000e+02 1.250354844167947e+06 -1.493424363431093e+06 6.865871554045480e+06 -7.084331694693778e+03 1.965811396849750e+03 1.713885218530701e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.970000000000000e+02 1.250213156840786e+06 -1.493385046529822e+06 6.865905830362210e+06 -7.084353151839146e+03 1.965864613821477e+03 1.713734694601141e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.980000000000000e+02 1.250071469085746e+06 -1.493345728564574e+06 6.865940103668104e+06 -7.084374606516487e+03 1.965917830825320e+03 1.713584165760431e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.990000000000000e+02 1.249929780902893e+06 -1.493306409535368e+06 6.865974373963151e+06 -7.084396057049646e+03 1.965971045913859e+03 1.713433641169155e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.000000000000000e+02 1.249788092292186e+06 -1.493267089442188e+06 6.866008641247355e+06 -7.084417504766653e+03 1.966024260943747e+03 1.713283113192464e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.010000000000000e+02 1.249646403253900e+06 -1.493227768285110e+06 6.866042905520655e+06 -7.084438949583670e+03 1.966077475410804e+03 1.713132582776386e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.020000000000000e+02 1.249504713787996e+06 -1.493188446064122e+06 6.866077166783057e+06 -7.084460390474984e+03 1.966130688408341e+03 1.712982055186271e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.030000000000000e+02 1.249363023894429e+06 -1.493149122779202e+06 6.866111425034577e+06 -7.084481828807558e+03 1.966183901260856e+03 1.712831523265213e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.040000000000000e+02 1.249221333573481e+06 -1.493109798430437e+06 6.866145680275146e+06 -7.084503263274780e+03 1.966237112531362e+03 1.712680994060108e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.050000000000000e+02 1.249079642825108e+06 -1.493070473017809e+06 6.866179932504772e+06 -7.084524694985242e+03 1.966290324113607e+03 1.712530460781242e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.060000000000000e+02 1.248937951649376e+06 -1.493031146541330e+06 6.866214181723448e+06 -7.084546123021233e+03 1.966343533575924e+03 1.712379930087696e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.070000000000000e+02 1.248796260046243e+06 -1.492991819000990e+06 6.866248427931176e+06 -7.084567548476818e+03 1.966396743711467e+03 1.712229394166907e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.080000000000000e+02 1.248654568015988e+06 -1.492952490396865e+06 6.866282671127896e+06 -7.084588970231312e+03 1.966449952288571e+03 1.712078860265583e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.090000000000000e+02 1.248512875558564e+06 -1.492913160728935e+06 6.866316911313611e+06 -7.084610388283580e+03 1.966503159243049e+03 1.711928328466314e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.100000000000000e+02 1.248371182673940e+06 -1.492873829997196e+06 6.866351148488343e+06 -7.084631803530600e+03 1.966556366444843e+03 1.711777792866883e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.110000000000000e+02 1.248229489362383e+06 -1.492834498201715e+06 6.866385382652015e+06 -7.084653216042927e+03 1.966609573101901e+03 1.711627254131021e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.120000000000000e+02 1.248087795623858e+06 -1.492795165342483e+06 6.866419613804646e+06 -7.084674624490992e+03 1.966662778157183e+03 1.711476718948093e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.130000000000000e+02 1.247946101458426e+06 -1.492755831419513e+06 6.866453841946214e+06 -7.084696030381549e+03 1.966715982992552e+03 1.711326179515827e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.140000000000000e+02 1.247804406866053e+06 -1.492716496432794e+06 6.866488067076734e+06 -7.084717432645923e+03 1.966769186799910e+03 1.711175641161610e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.150000000000000e+02 1.247662711847007e+06 -1.492677160382399e+06 6.866522289196140e+06 -7.084738831283036e+03 1.966822389582622e+03 1.711025103886289e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.160000000000000e+02 1.247521016401249e+06 -1.492637823268314e+06 6.866556508304442e+06 -7.084760227180131e+03 1.966875591525104e+03 1.710874563850941e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.170000000000000e+02 1.247379320528850e+06 -1.492598485090560e+06 6.866590724401622e+06 -7.084781619689470e+03 1.966928792993817e+03 1.710724023255503e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.180000000000000e+02 1.247237624229767e+06 -1.492559145849118e+06 6.866624937487694e+06 -7.084803009003641e+03 1.966981993649773e+03 1.710573481722425e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.190000000000000e+02 1.247095927504269e+06 -1.492519805544062e+06 6.866659147562590e+06 -7.084824395038273e+03 1.967035193405036e+03 1.710422939701574e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.200000000000000e+02 1.246954230352323e+06 -1.492480464175385e+06 6.866693354626324e+06 -7.084845777679287e+03 1.967088392223009e+03 1.710272397702372e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.210000000000000e+02 1.246812532773886e+06 -1.492441121743066e+06 6.866727558678905e+06 -7.084867157390543e+03 1.967141590666614e+03 1.710121853155388e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.220000000000000e+02 1.246670834769235e+06 -1.492401778247186e+06 6.866761759720265e+06 -7.084888533874961e+03 1.967194788255636e+03 1.709971307850060e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.230000000000000e+02 1.246529136338326e+06 -1.492362433687726e+06 6.866795957750416e+06 -7.084909906818840e+03 1.967247984594498e+03 1.709820763542439e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.240000000000000e+02 1.246387437481230e+06 -1.492323088064709e+06 6.866830152769343e+06 -7.084931276802115e+03 1.967301180616820e+03 1.709670216742748e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.250000000000000e+02 1.246245738197900e+06 -1.492283741378113e+06 6.866864344777054e+06 -7.084952643171083e+03 1.967354375644475e+03 1.709519670934527e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.260000000000000e+02 1.246104038488615e+06 -1.492244393628017e+06 6.866898533773489e+06 -7.084974006505808e+03 1.967407569686688e+03 1.709369123739850e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.270000000000000e+02 1.245962338353334e+06 -1.492205044814409e+06 6.866932719758655e+06 -7.084995366625285e+03 1.967460763111883e+03 1.709218575453640e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.280000000000000e+02 1.245820637792017e+06 -1.492165694937272e+06 6.866966902732562e+06 -7.085016723604910e+03 1.967513956004351e+03 1.709068025666512e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.290000000000000e+02 1.245678936804939e+06 -1.492126343996685e+06 6.867001082695145e+06 -7.085038077208913e+03 1.967567147769176e+03 1.708917476057309e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.300000000000000e+02 1.245537235392062e+06 -1.492086991992634e+06 6.867035259646415e+06 -7.085059427163718e+03 1.967620338610275e+03 1.708766927497553e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.310000000000000e+02 1.245395533553445e+06 -1.492047638925129e+06 6.867069433586357e+06 -7.085080774364125e+03 1.967673528617493e+03 1.708616376226048e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.320000000000000e+02 1.245253831289056e+06 -1.492008284794162e+06 6.867103604514977e+06 -7.085102118442564e+03 1.967726718688540e+03 1.708465822661520e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.330000000000000e+02 1.245112128599164e+06 -1.491968929599808e+06 6.867137772432219e+06 -7.085123459088161e+03 1.967779907254989e+03 1.708315269963013e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.340000000000000e+02 1.244970425483727e+06 -1.491929573342049e+06 6.867171937338084e+06 -7.085144796157368e+03 1.967833094611589e+03 1.708164718362080e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.350000000000000e+02 1.244828721942715e+06 -1.491890216020878e+06 6.867206099232586e+06 -7.085166130562619e+03 1.967886282095259e+03 1.708014162521020e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.360000000000000e+02 1.244687017976396e+06 -1.491850857636368e+06 6.867240258115663e+06 -7.085187461446100e+03 1.967939468409225e+03 1.707863607506060e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.370000000000000e+02 1.244545313584727e+06 -1.491811498188500e+06 6.867274413987318e+06 -7.085208789043747e+03 1.967992653908854e+03 1.707713051925372e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.380000000000000e+02 1.244403608767778e+06 -1.491772137677296e+06 6.867308566847542e+06 -7.085230113597075e+03 1.968045838724201e+03 1.707562494635446e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.390000000000000e+02 1.244261903525506e+06 -1.491732776102738e+06 6.867342716696344e+06 -7.085251434560423e+03 1.968099022370777e+03 1.707411938449804e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.400000000000000e+02 1.244120197858190e+06 -1.491693413464907e+06 6.867376863533658e+06 -7.085272752283776e+03 1.968152205269515e+03 1.707261381431172e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.410000000000000e+02 1.243978491765785e+06 -1.491654049763783e+06 6.867411007359494e+06 -7.085294066876718e+03 1.968205387639900e+03 1.707110822866980e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.420000000000000e+02 1.243836785248359e+06 -1.491614684999386e+06 6.867445148173838e+06 -7.085315378149295e+03 1.968258568819290e+03 1.706960264332625e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.430000000000000e+02 1.243695078305870e+06 -1.491575319171698e+06 6.867479285976699e+06 -7.085336686435552e+03 1.968311749756047e+03 1.706809703318889e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.440000000000000e+02 1.243553370938599e+06 -1.491535952280803e+06 6.867513420768013e+06 -7.085357991318746e+03 1.968364929647607e+03 1.706659142497130e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.450000000000000e+02 1.243411663146495e+06 -1.491496584326677e+06 6.867547552547788e+06 -7.085379292836245e+03 1.968418108450107e+03 1.706508581767756e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.460000000000000e+02 1.243269954929529e+06 -1.491457215309313e+06 6.867581681316040e+06 -7.085400591378260e+03 1.968471287078929e+03 1.706358018430987e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.470000000000000e+02 1.243128246287963e+06 -1.491417845228780e+06 6.867615807072696e+06 -7.085421886881324e+03 1.968524464802222e+03 1.706207453629038e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.480000000000000e+02 1.242986537221774e+06 -1.491378474085076e+06 6.867649929817772e+06 -7.085443178772736e+03 1.968577641626031e+03 1.706056889696379e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.490000000000000e+02 1.242844827731014e+06 -1.491339101878205e+06 6.867684049551250e+06 -7.085464467599062e+03 1.968630817792572e+03 1.705906324105796e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.500000000000000e+02 1.242703117815645e+06 -1.491299728608155e+06 6.867718166273141e+06 -7.085485752544844e+03 1.968683992193447e+03 1.705755761530444e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.510000000000000e+02 1.242561407475943e+06 -1.491260354275007e+06 6.867752279983382e+06 -7.085507034859486e+03 1.968737166686231e+03 1.705605194617920e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.520000000000000e+02 1.242419696711872e+06 -1.491220978878745e+06 6.867786390681980e+06 -7.085528313638879e+03 1.968790339982848e+03 1.705454628621161e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.530000000000000e+02 1.242277985523390e+06 -1.491181602419356e+06 6.867820498368949e+06 -7.085549589454347e+03 1.968843512967951e+03 1.705304060134856e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.540000000000000e+02 1.242136273910765e+06 -1.491142224896908e+06 6.867854603044221e+06 -7.085570861877810e+03 1.968896684976685e+03 1.705153491713047e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.550000000000000e+02 1.241994561873967e+06 -1.491102846311399e+06 6.867888704707805e+06 -7.085592131084575e+03 1.968949855963039e+03 1.705002922694182e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.560000000000000e+02 1.241852849413055e+06 -1.491063466662838e+06 6.867922803359689e+06 -7.085613396869117e+03 1.969003026097803e+03 1.704852353713081e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.570000000000000e+02 1.241711136527990e+06 -1.491024085951211e+06 6.867956898999882e+06 -7.085634659567357e+03 1.969056195570297e+03 1.704701783166386e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.580000000000000e+02 1.241569423219044e+06 -1.490984704176593e+06 6.867990991628319e+06 -7.085655919165120e+03 1.969109364592370e+03 1.704551210855906e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.590000000000000e+02 1.241427709486184e+06 -1.490945321338974e+06 6.868025081245009e+06 -7.085677175370063e+03 1.969162532335095e+03 1.704400638979748e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.600000000000000e+02 1.241285995329367e+06 -1.490905937438341e+06 6.868059167849966e+06 -7.085698428326795e+03 1.969215699726851e+03 1.704250065824244e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.610000000000000e+02 1.241144280748864e+06 -1.490866552474763e+06 6.868093251443120e+06 -7.085719677979256e+03 1.969268865951182e+03 1.704099492605592e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.620000000000000e+02 1.241002565744643e+06 -1.490827166448235e+06 6.868127332024487e+06 -7.085740924493294e+03 1.969322031529049e+03 1.703948918015175e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.630000000000000e+02 1.240860850316756e+06 -1.490787779358759e+06 6.868161409594043e+06 -7.085762167690438e+03 1.969375196248868e+03 1.703798343039414e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.640000000000000e+02 1.240719134465175e+06 -1.490748391206334e+06 6.868195484151809e+06 -7.085783407657703e+03 1.969428360121294e+03 1.703647767309197e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.650000000000000e+02 1.240577418190172e+06 -1.490709001991034e+06 6.868229555697714e+06 -7.085804644367245e+03 1.969481523399208e+03 1.703497190632770e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.660000000000000e+02 1.240435701491703e+06 -1.490669611712839e+06 6.868263624231768e+06 -7.085825878016863e+03 1.969534685832791e+03 1.703346612501947e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.670000000000000e+02 1.240293984369837e+06 -1.490630220371772e+06 6.868297689753958e+06 -7.085847108061473e+03 1.969587847246345e+03 1.703196035362023e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.680000000000000e+02 1.240152266824533e+06 -1.490590827967813e+06 6.868331752264293e+06 -7.085868335058982e+03 1.969641007946743e+03 1.703045456556583e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.690000000000000e+02 1.240010548856063e+06 -1.490551434501040e+06 6.868365811762708e+06 -7.085889558800237e+03 1.969694167912280e+03 1.702894876968581e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.700000000000000e+02 1.239868830464394e+06 -1.490512039971445e+06 6.868399868249214e+06 -7.085910779292451e+03 1.969747327019624e+03 1.702744296717662e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.710000000000000e+02 1.239727111649482e+06 -1.490472644379008e+06 6.868433921723822e+06 -7.085931996497831e+03 1.969800485551669e+03 1.702593715616415e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.720000000000000e+02 1.239585392411596e+06 -1.490433247723799e+06 6.868467972186465e+06 -7.085953210489160e+03 1.969853643052631e+03 1.702443133918087e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.730000000000000e+02 1.239443672750703e+06 -1.490393850005815e+06 6.868502019637153e+06 -7.085974421092321e+03 1.969906799599867e+03 1.702292552242765e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.740000000000000e+02 1.239301952666866e+06 -1.490354451225066e+06 6.868536064075873e+06 -7.085995628614706e+03 1.969959955432435e+03 1.702141969041253e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.750000000000000e+02 1.239160232160047e+06 -1.490315051381540e+06 6.868570105502635e+06 -7.086016832848433e+03 1.970013110694932e+03 1.701991384990519e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.760000000000000e+02 1.239018511230521e+06 -1.490275650475317e+06 6.868604143917374e+06 -7.086038034199079e+03 1.970066265500948e+03 1.701840798290171e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.770000000000000e+02 1.238876789878242e+06 -1.490236248506374e+06 6.868638179320098e+06 -7.086059231625008e+03 1.970119418611226e+03 1.701690214711155e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.780000000000000e+02 1.238735068103175e+06 -1.490196845474700e+06 6.868672211710815e+06 -7.086080426117109e+03 1.970172571485011e+03 1.701539628424239e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.790000000000000e+02 1.238593345905595e+06 -1.490157441380374e+06 6.868706241089470e+06 -7.086101617876002e+03 1.970225724066334e+03 1.701389038673871e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.800000000000000e+02 1.238451623285458e+06 -1.490118036223379e+06 6.868740267456065e+06 -7.086122805395212e+03 1.970278874567414e+03 1.701238453803332e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.810000000000000e+02 1.238309900242833e+06 -1.490078630003734e+06 6.868774290810589e+06 -7.086143990540858e+03 1.970332025365766e+03 1.701087863279844e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.820000000000000e+02 1.238168176777682e+06 -1.490039222721423e+06 6.868808311153047e+06 -7.086165172056955e+03 1.970385174812024e+03 1.700937274252382e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.830000000000000e+02 1.238026452890275e+06 -1.489999814376523e+06 6.868842328483379e+06 -7.086186350022835e+03 1.970438323312113e+03 1.700786685904349e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.840000000000000e+02 1.237884728580574e+06 -1.489960404969021e+06 6.868876342801591e+06 -7.086207525187306e+03 1.970491471587869e+03 1.700636094289131e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.850000000000000e+02 1.237743003848536e+06 -1.489920994498896e+06 6.868910354107699e+06 -7.086228696798044e+03 1.970544618487886e+03 1.700485503888395e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.860000000000000e+02 1.237601278694441e+06 -1.489881582966233e+06 6.868944362401637e+06 -7.086249865416626e+03 1.970597764744836e+03 1.700334911510161e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.870000000000000e+02 1.237459553118250e+06 -1.489842170371020e+06 6.868978367683408e+06 -7.086271030466010e+03 1.970650910387579e+03 1.700184319487299e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.880000000000000e+02 1.237317827120014e+06 -1.489802756713253e+06 6.869012369953005e+06 -7.086292192884272e+03 1.970704055463773e+03 1.700033723912089e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.890000000000000e+02 1.237176100699712e+06 -1.489763341992942e+06 6.869046369210434e+06 -7.086313351686011e+03 1.970757199352643e+03 1.699883129581220e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.900000000000000e+02 1.237034373857608e+06 -1.489723926210151e+06 6.869080365455633e+06 -7.086334507546299e+03 1.970810343126738e+03 1.699732532423471e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.910000000000000e+02 1.236892646593663e+06 -1.489684509364868e+06 6.869114358688608e+06 -7.086355659508961e+03 1.970863485025285e+03 1.699581938499119e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.920000000000000e+02 1.236750918907945e+06 -1.489645091457110e+06 6.869148348909350e+06 -7.086376808609674e+03 1.970916626604495e+03 1.699431341669484e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.930000000000000e+02 1.236609190800412e+06 -1.489605672486860e+06 6.869182336117865e+06 -7.086397954410320e+03 1.970969767409809e+03 1.699280744284374e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.940000000000000e+02 1.236467462271342e+06 -1.489566252454203e+06 6.869216320314089e+06 -7.086419096943444e+03 1.971022907580302e+03 1.699130146041462e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.950000000000000e+02 1.236325733320684e+06 -1.489526831359108e+06 6.869250301498032e+06 -7.086440236488479e+03 1.971076046789777e+03 1.698979546188797e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.960000000000000e+02 1.236184003948414e+06 -1.489487409201577e+06 6.869284279669704e+06 -7.086461372548024e+03 1.971129185168054e+03 1.698828946611685e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.970000000000000e+02 1.236042274154796e+06 -1.489447985981682e+06 6.869318254829041e+06 -7.086482505364940e+03 1.971182322870524e+03 1.698678346124207e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.980000000000000e+02 1.235900543939791e+06 -1.489408561699401e+06 6.869352226976052e+06 -7.086503634409455e+03 1.971235459139569e+03 1.698527747822178e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.990000000000000e+02 1.235758813303464e+06 -1.489369136354756e+06 6.869386196110724e+06 -7.086524760801962e+03 1.971288595003776e+03 1.698377145854788e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.000000000000000e+02 1.235617082245784e+06 -1.489329709947739e+06 6.869420162233067e+06 -7.086545884192383e+03 1.971341730662620e+03 1.698226541417503e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.010000000000000e+02 1.235475350767015e+06 -1.489290282478418e+06 6.869454125343015e+06 -7.086567004043995e+03 1.971394865037237e+03 1.698075938025148e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.020000000000000e+02 1.235333618867123e+06 -1.489250853946785e+06 6.869488085440577e+06 -7.086588120597085e+03 1.971447998768108e+03 1.697925333913090e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.030000000000000e+02 1.235191886546058e+06 -1.489211424352809e+06 6.869522042525767e+06 -7.086609234135867e+03 1.971501131784842e+03 1.697774727998666e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.040000000000000e+02 1.235050153804107e+06 -1.489171993696588e+06 6.869555996598517e+06 -7.086630344084278e+03 1.971554263469401e+03 1.697624123400000e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.050000000000000e+02 1.234908420641228e+06 -1.489132561978101e+06 6.869589947658837e+06 -7.086651450918252e+03 1.971607394705981e+03 1.697473517087320e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.060000000000000e+02 1.234766687057483e+06 -1.489093129197360e+06 6.869623895706713e+06 -7.086672554232097e+03 1.971660524670601e+03 1.697322911729083e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.070000000000000e+02 1.234624953052832e+06 -1.489053695354353e+06 6.869657840742157e+06 -7.086693655038848e+03 1.971713655086121e+03 1.697172301067645e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.080000000000000e+02 1.234483218627544e+06 -1.489014260449151e+06 6.869691782765101e+06 -7.086714751818331e+03 1.971766783439777e+03 1.697021694405472e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.090000000000000e+02 1.234341483781590e+06 -1.488974824481749e+06 6.869725721775558e+06 -7.086735845730436e+03 1.971819911250468e+03 1.696871085128469e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.100000000000000e+02 1.234199748514928e+06 -1.488935387452131e+06 6.869759657773537e+06 -7.086756936671026e+03 1.971873039100292e+03 1.696720472957039e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.110000000000000e+02 1.234058012827827e+06 -1.488895949360369e+06 6.869793590758970e+06 -7.086778023980649e+03 1.971926165469856e+03 1.696569862449498e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.120000000000000e+02 1.233916276720250e+06 -1.488856510206449e+06 6.869827520731875e+06 -7.086799108123082e+03 1.971979291173041e+03 1.696419250709551e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.130000000000000e+02 1.233774540192264e+06 -1.488817069990393e+06 6.869861447692228e+06 -7.086820188738165e+03 1.972032415389932e+03 1.696268640215446e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.140000000000000e+02 1.233632803243824e+06 -1.488777628712178e+06 6.869895371640045e+06 -7.086841266312737e+03 1.972085539615772e+03 1.696118027146906e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.150000000000000e+02 1.233491065875209e+06 -1.488738186371888e+06 6.869929292575261e+06 -7.086862341008944e+03 1.972138663127577e+03 1.695967411715304e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.160000000000000e+02 1.233349328086379e+06 -1.488698742969506e+06 6.869963210497886e+06 -7.086883411852648e+03 1.972191785174316e+03 1.695816798842016e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.170000000000000e+02 1.233207589877397e+06 -1.488659298505048e+06 6.869997125407903e+06 -7.086904479752050e+03 1.972244906738419e+03 1.695666183595628e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.180000000000000e+02 1.233065851248226e+06 -1.488619852978501e+06 6.870031037305324e+06 -7.086925544391649e+03 1.972298027609458e+03 1.695515567530120e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.190000000000000e+02 1.232924112199138e+06 -1.488580406389941e+06 6.870064946190082e+06 -7.086946605941706e+03 1.972351147820945e+03 1.695364949903879e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.200000000000000e+02 1.232782372730091e+06 -1.488540958739350e+06 6.870098852062191e+06 -7.086967663924876e+03 1.972404266935154e+03 1.695214333214206e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.210000000000000e+02 1.232640632841050e+06 -1.488501510026716e+06 6.870132754921656e+06 -7.086988718993075e+03 1.972457385444367e+03 1.695063714178732e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.220000000000000e+02 1.232498892532286e+06 -1.488462060252119e+06 6.870166654768420e+06 -7.087009770987344e+03 1.972510503550528e+03 1.694913093205762e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.230000000000000e+02 1.232357151803761e+06 -1.488422609415541e+06 6.870200551602484e+06 -7.087030818844602e+03 1.972563619826805e+03 1.694762476408748e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.240000000000000e+02 1.232215410655539e+06 -1.488383157516998e+06 6.870234445423841e+06 -7.087051864108639e+03 1.972616735650809e+03 1.694611855755004e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.250000000000000e+02 1.232073669087583e+06 -1.488343704556478e+06 6.870268336232494e+06 -7.087072906108824e+03 1.972669851303521e+03 1.694461233663623e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.260000000000000e+02 1.231931927100160e+06 -1.488304250534052e+06 6.870302224028384e+06 -7.087093944630346e+03 1.972722965426110e+03 1.694310612673285e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.270000000000000e+02 1.231790184693239e+06 -1.488264795449715e+06 6.870336108811521e+06 -7.087114980100630e+03 1.972776079009801e+03 1.694159989817091e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.280000000000000e+02 1.231648441866780e+06 -1.488225339303450e+06 6.870369990581910e+06 -7.087136012558848e+03 1.972829192278298e+03 1.694009364660988e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.290000000000000e+02 1.231506698621050e+06 -1.488185882095328e+06 6.870403869339492e+06 -7.087157041288516e+03 1.972882304222179e+03 1.693858741385588e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.300000000000000e+02 1.231364954956012e+06 -1.488146423825336e+06 6.870437745084275e+06 -7.087178067017638e+03 1.972935415373667e+03 1.693708116343839e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.310000000000000e+02 1.231223210871731e+06 -1.488106964493492e+06 6.870471617816241e+06 -7.087199089461892e+03 1.972988525805203e+03 1.693557490618859e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.320000000000000e+02 1.231081466368170e+06 -1.488067504099784e+06 6.870505487535404e+06 -7.087220108760885e+03 1.973041635608100e+03 1.693406863524061e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.330000000000000e+02 1.230939721445603e+06 -1.488028042644286e+06 6.870539354241703e+06 -7.087241124562725e+03 1.973094744273969e+03 1.693256237128953e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.340000000000000e+02 1.230797976103989e+06 -1.487988580126985e+06 6.870573217935140e+06 -7.087262137262807e+03 1.973147852248067e+03 1.693105609261680e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.350000000000000e+02 1.230656230343290e+06 -1.487949116547868e+06 6.870607078615730e+06 -7.087283146686520e+03 1.973200959611449e+03 1.692954980543045e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.360000000000000e+02 1.230514484163772e+06 -1.487909651907001e+06 6.870640936283406e+06 -7.087304152530624e+03 1.973254065613335e+03 1.692804353138119e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.370000000000000e+02 1.230372737565406e+06 -1.487870186204383e+06 6.870674790938182e+06 -7.087325155394426e+03 1.973307170963652e+03 1.692653723711270e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.380000000000000e+02 1.230230990548255e+06 -1.487830719440030e+06 6.870708642580038e+06 -7.087346155244659e+03 1.973360276001698e+03 1.692503091985748e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.390000000000000e+02 1.230089243112272e+06 -1.487791251613915e+06 6.870742491208986e+06 -7.087367152025623e+03 1.973413380418411e+03 1.692352458567530e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.400000000000000e+02 1.229947495257741e+06 -1.487751782726129e+06 6.870776336824964e+06 -7.087388145188557e+03 1.973466483723652e+03 1.692201826317106e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.410000000000000e+02 1.229805746984615e+06 -1.487712312776647e+06 6.870810179427982e+06 -7.087409135360575e+03 1.973519586408337e+03 1.692051192049870e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.420000000000000e+02 1.229663998292959e+06 -1.487672841765488e+06 6.870844019018018e+06 -7.087430122049912e+03 1.973572687782329e+03 1.691900558635566e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.430000000000000e+02 1.229522249182742e+06 -1.487633369692645e+06 6.870877855595093e+06 -7.087451105519165e+03 1.973625788881653e+03 1.691749923727810e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.440000000000000e+02 1.229380499654228e+06 -1.487593896558183e+06 6.870911689159134e+06 -7.087472085385856e+03 1.973678888554226e+03 1.691599290309591e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.450000000000000e+02 1.229238749707378e+06 -1.487554422362091e+06 6.870945519710155e+06 -7.087493062458785e+03 1.973731987490493e+03 1.691448654202156e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.460000000000000e+02 1.229096999342164e+06 -1.487514947104365e+06 6.870979347248164e+06 -7.087514036431137e+03 1.973785086575972e+03 1.691298015590662e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.470000000000000e+02 1.228955248558845e+06 -1.487475470785067e+06 6.871013171773100e+06 -7.087535006903357e+03 1.973838184096146e+03 1.691147378215413e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.480000000000000e+02 1.228813497357391e+06 -1.487435993404191e+06 6.871046993284971e+06 -7.087555974176460e+03 1.973891280907846e+03 1.690996739789083e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.490000000000000e+02 1.228671745737864e+06 -1.487396514961753e+06 6.871080811783760e+06 -7.087576938151396e+03 1.973944376937550e+03 1.690846100810149e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.500000000000000e+02 1.228529993700229e+06 -1.487357035457740e+06 6.871114627269480e+06 -7.087597898542203e+03 1.973997471856317e+03 1.690695462860585e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.510000000000000e+02 1.228388241244749e+06 -1.487317554892219e+06 6.871148439742067e+06 -7.087618856066627e+03 1.974050566255238e+03 1.690544822256245e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.520000000000000e+02 1.228246488371391e+06 -1.487278073265184e+06 6.871182249201528e+06 -7.087639810280712e+03 1.974103659942180e+03 1.690394181064137e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.530000000000000e+02 1.228104735080120e+06 -1.487238590576622e+06 6.871216055647876e+06 -7.087660761488423e+03 1.974156752817775e+03 1.690243538150489e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.540000000000000e+02 1.227962981371205e+06 -1.487199106826608e+06 6.871249859081045e+06 -7.087681709218592e+03 1.974209844939876e+03 1.690092895390095e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.550000000000000e+02 1.227821227244605e+06 -1.487159622015123e+06 6.871283659501044e+06 -7.087702653678417e+03 1.974262936162717e+03 1.689942252105498e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.560000000000000e+02 1.227679472700386e+06 -1.487120136142186e+06 6.871317456907864e+06 -7.087723594534461e+03 1.974316025825249e+03 1.689791610481309e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.570000000000000e+02 1.227537717738515e+06 -1.487080649207790e+06 6.871351251301507e+06 -7.087744532786896e+03 1.974369116209793e+03 1.689640963599080e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.580000000000000e+02 1.227395962359249e+06 -1.487041161211991e+06 6.871385042681912e+06 -7.087765467745120e+03 1.974422204921324e+03 1.689490317236149e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.590000000000000e+02 1.227254206562568e+06 -1.487001672154800e+06 6.871418831049093e+06 -7.087786399090552e+03 1.974475292843632e+03 1.689339671629337e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.600000000000000e+02 1.227112450348423e+06 -1.486962182036188e+06 6.871452616403054e+06 -7.087807327536133e+03 1.974528380277560e+03 1.689189023465735e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.610000000000000e+02 1.226970693717090e+06 -1.486922690856237e+06 6.871486398743735e+06 -7.087828252331818e+03 1.974581466629953e+03 1.689038376569004e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.620000000000000e+02 1.226828936668523e+06 -1.486883198614923e+06 6.871520178071143e+06 -7.087849174171000e+03 1.974634552087777e+03 1.688887727845690e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.630000000000000e+02 1.226687179202797e+06 -1.486843705312277e+06 6.871553954385265e+06 -7.087870092816433e+03 1.974687637160075e+03 1.688737077653849e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.640000000000000e+02 1.226545421319869e+06 -1.486804210948278e+06 6.871587727686111e+06 -7.087891007970815e+03 1.974740721044982e+03 1.688586428202308e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.650000000000000e+02 1.226403663020009e+06 -1.486764715522998e+06 6.871621497973613e+06 -7.087911920142143e+03 1.974793804320077e+03 1.688435776685463e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.660000000000000e+02 1.226261904303182e+06 -1.486725219036429e+06 6.871655265247788e+06 -7.087932828598632e+03 1.974846886469531e+03 1.688285126758912e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.670000000000000e+02 1.226120145169453e+06 -1.486685721488586e+06 6.871689029508616e+06 -7.087953734014191e+03 1.974899967741688e+03 1.688134475333359e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.680000000000000e+02 1.225978385618779e+06 -1.486646222879454e+06 6.871722790756109e+06 -7.087974636760772e+03 1.974953049285072e+03 1.687983819466040e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.690000000000000e+02 1.225836625651436e+06 -1.486606723209107e+06 6.871756548990202e+06 -7.087995535948713e+03 1.975006129507429e+03 1.687833164782289e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.700000000000000e+02 1.225694865267384e+06 -1.486567222477535e+06 6.871790304210907e+06 -7.088016431788674e+03 1.975059208588192e+03 1.687682510192005e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.710000000000000e+02 1.225553104466582e+06 -1.486527720684718e+06 6.871824056418228e+06 -7.088037323782937e+03 1.975112286566612e+03 1.687531857705945e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.720000000000000e+02 1.225411343249307e+06 -1.486488217830737e+06 6.871857805612110e+06 -7.088058213425278e+03 1.975165364607943e+03 1.687381199720417e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.730000000000000e+02 1.225269581615515e+06 -1.486448713915576e+06 6.871891551792556e+06 -7.088079099489843e+03 1.975218441352524e+03 1.687230542968834e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.740000000000000e+02 1.225127819565280e+06 -1.486409208939258e+06 6.871925294959554e+06 -7.088099982034485e+03 1.975271516795254e+03 1.687079887218682e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.750000000000000e+02 1.224986057098556e+06 -1.486369702901761e+06 6.871959035113111e+06 -7.088120861667015e+03 1.975324592493015e+03 1.686929228050137e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.760000000000000e+02 1.224844294215612e+06 -1.486330195803160e+06 6.871992772253168e+06 -7.088141738313375e+03 1.975377667148054e+03 1.686778567357353e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.770000000000000e+02 1.224702530916418e+06 -1.486290687643446e+06 6.872026506379732e+06 -7.088162611443590e+03 1.975430740657753e+03 1.686627907458950e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.780000000000000e+02 1.224560767200929e+06 -1.486251178422604e+06 6.872060237492810e+06 -7.088183481170186e+03 1.975483813633204e+03 1.686477247141487e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.790000000000000e+02 1.224419003069421e+06 -1.486211668140709e+06 6.872093965592345e+06 -7.088204347779716e+03 1.975536885551213e+03 1.686326585859588e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.800000000000000e+02 1.224277238521853e+06 -1.486172156797746e+06 6.872127690678341e+06 -7.088225210796396e+03 1.975589956386290e+03 1.686175925613918e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.810000000000000e+02 1.224135473558290e+06 -1.486132644393733e+06 6.872161412750784e+06 -7.088246070837001e+03 1.975643026789974e+03 1.686025263053681e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.820000000000000e+02 1.223993708178695e+06 -1.486093130928657e+06 6.872195131809689e+06 -7.088266927720111e+03 1.975696096324452e+03 1.685874599465776e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.830000000000000e+02 1.223851942383339e+06 -1.486053616402593e+06 6.872228847854985e+06 -7.088287781546227e+03 1.975749165736476e+03 1.685723933519256e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.840000000000000e+02 1.223710176172181e+06 -1.486014100815520e+06 6.872262560886687e+06 -7.088308631774103e+03 1.975802233272525e+03 1.685573269603178e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.850000000000000e+02 1.223568409545189e+06 -1.485974584167437e+06 6.872296270904804e+06 -7.088329478818060e+03 1.975855300626319e+03 1.685422603927282e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.860000000000000e+02 1.223426642502628e+06 -1.485935066458411e+06 6.872329977909271e+06 -7.088350322702361e+03 1.975908366982739e+03 1.685271937389592e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.870000000000000e+02 1.223284875044462e+06 -1.485895547688429e+06 6.872363681900092e+06 -7.088371163293139e+03 1.975961432474602e+03 1.685121270381815e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.880000000000000e+02 1.223143107170763e+06 -1.485856027857518e+06 6.872397382877263e+06 -7.088392000920876e+03 1.976014497695908e+03 1.684970600806944e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.890000000000000e+02 1.223001338881481e+06 -1.485816506965647e+06 6.872431080840792e+06 -7.088412834545544e+03 1.976067561207513e+03 1.684819934737274e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.900000000000000e+02 1.222859570176890e+06 -1.485776985012898e+06 6.872464775790607e+06 -7.088433665537855e+03 1.976120624605654e+03 1.684669264537914e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.910000000000000e+02 1.222717801056958e+06 -1.485737461999262e+06 6.872498467726725e+06 -7.088454493175343e+03 1.976173686849282e+03 1.684518594477930e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.920000000000000e+02 1.222576031521747e+06 -1.485697937924753e+06 6.872532156649129e+06 -7.088475316987253e+03 1.976226748000101e+03 1.684367926432777e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.930000000000000e+02 1.222434261571213e+06 -1.485658412789352e+06 6.872565842557833e+06 -7.088496138501006e+03 1.976279809011539e+03 1.684217252903664e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.940000000000000e+02 1.222292491205639e+06 -1.485618886593146e+06 6.872599525452765e+06 -7.088516956454234e+03 1.976332869350546e+03 1.684066579775325e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.950000000000000e+02 1.222150720424975e+06 -1.485579359336107e+06 6.872633205333940e+06 -7.088537771107703e+03 1.976385928437123e+03 1.683915906678568e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.960000000000000e+02 1.222008949229187e+06 -1.485539831018229e+06 6.872666882201368e+06 -7.088558582466932e+03 1.976438986761608e+03 1.683765232989224e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.970000000000000e+02 1.221867177618550e+06 -1.485500301639589e+06 6.872700556054982e+06 -7.088579390539740e+03 1.976492044501437e+03 1.683614558457223e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.980000000000000e+02 1.221725405593022e+06 -1.485460771200170e+06 6.872734226894798e+06 -7.088600195425643e+03 1.976545101224412e+03 1.683463883200206e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.990000000000000e+02 1.221583633152668e+06 -1.485421239699989e+06 6.872767894720796e+06 -7.088620997095959e+03 1.976598157049936e+03 1.683313207190607e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.000000000000000e+02 1.221441860297454e+06 -1.485381707139036e+06 6.872801559532986e+06 -7.088641795397181e+03 1.976651212370982e+03 1.683162530582741e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.010000000000000e+02 1.221300087027645e+06 -1.485342173517379e+06 6.872835221331309e+06 -7.088662590556421e+03 1.976704266707848e+03 1.683011853023475e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.020000000000000e+02 1.221158313343209e+06 -1.485302638835013e+06 6.872868880115769e+06 -7.088683382467394e+03 1.976757320111023e+03 1.682861174891628e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.030000000000000e+02 1.221016539244102e+06 -1.485263103091918e+06 6.872902535886378e+06 -7.088704171051678e+03 1.976810373116983e+03 1.682710495853972e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.040000000000000e+02 1.220874764730597e+06 -1.485223566288169e+06 6.872936188643072e+06 -7.088724956447587e+03 1.976863425009626e+03 1.682559816215822e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.050000000000000e+02 1.220732989802656e+06 -1.485184028423754e+06 6.872969838385861e+06 -7.088745738770193e+03 1.976916476251885e+03 1.682409134931364e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.060000000000000e+02 1.220591214460351e+06 -1.485144489498696e+06 6.873003485114732e+06 -7.088766517480376e+03 1.976969526504923e+03 1.682258454653490e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.070000000000000e+02 1.220449438703629e+06 -1.485104949512967e+06 6.873037128829693e+06 -7.088787293292176e+03 1.977022576190034e+03 1.682107771902090e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.080000000000000e+02 1.220307662532777e+06 -1.485065408466657e+06 6.873070769530683e+06 -7.088808065341973e+03 1.977075624694130e+03 1.681957091014009e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.090000000000000e+02 1.220165885947742e+06 -1.485025866359739e+06 6.873104407217707e+06 -7.088828834831057e+03 1.977128672931672e+03 1.681806405880463e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.100000000000000e+02 1.220024108948497e+06 -1.484986323192210e+06 6.873138041890778e+06 -7.088849600692593e+03 1.977181720125127e+03 1.681655721884191e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.110000000000000e+02 1.219882331535311e+06 -1.484946778964141e+06 6.873171673549833e+06 -7.088870363065161e+03 1.977234766060232e+03 1.681505038713703e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.120000000000000e+02 1.219740553708143e+06 -1.484907233675521e+06 6.873205302194878e+06 -7.088891122406898e+03 1.977287811689575e+03 1.681354353296727e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.130000000000000e+02 1.219598775467057e+06 -1.484867687326360e+06 6.873238927825904e+06 -7.088911878505769e+03 1.977340856030077e+03 1.681203667721494e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.140000000000000e+02 1.219456996812021e+06 -1.484828139916654e+06 6.873272550442914e+06 -7.088932631516516e+03 1.977393900236097e+03 1.681052979926647e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.150000000000000e+02 1.219315217743302e+06 -1.484788591446470e+06 6.873306170045852e+06 -7.088953381172407e+03 1.977446943488583e+03 1.680902292026381e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.160000000000000e+02 1.219173438260859e+06 -1.484749041915795e+06 6.873339786634720e+06 -7.088974127891091e+03 1.977499986220832e+03 1.680751601753497e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.170000000000000e+02 1.219031658364765e+06 -1.484709491324651e+06 6.873373400209510e+06 -7.088994871279980e+03 1.977553027757138e+03 1.680600911569060e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.180000000000000e+02 1.218889878054973e+06 -1.484669939673020e+06 6.873407010770227e+06 -7.089015610832810e+03 1.977606068201897e+03 1.680450223448036e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.190000000000000e+02 1.218748097331761e+06 -1.484630386960979e+06 6.873440618316810e+06 -7.089036347354116e+03 1.977659107903096e+03 1.680299533620794e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.200000000000000e+02 1.218606316195089e+06 -1.484590833188515e+06 6.873474222849268e+06 -7.089057080795754e+03 1.977712147004807e+03 1.680148842109875e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.210000000000000e+02 1.218464534644914e+06 -1.484551278355609e+06 6.873507824367612e+06 -7.089077811110975e+03 1.977765185613529e+03 1.679998148978291e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.220000000000000e+02 1.218322752681511e+06 -1.484511722462340e+06 6.873541422871775e+06 -7.089098538011353e+03 1.977818223147439e+03 1.679847456140126e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.230000000000000e+02 1.218180970304842e+06 -1.484472165508694e+06 6.873575018361771e+06 -7.089119261707646e+03 1.977871259748189e+03 1.679696762545489e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.240000000000000e+02 1.218039187514977e+06 -1.484432607494694e+06 6.873608610837585e+06 -7.089139982177055e+03 1.977924295751433e+03 1.679546067876110e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.250000000000000e+02 1.217897404311863e+06 -1.484393048420310e+06 6.873642200299221e+06 -7.089160699179670e+03 1.977977330535036e+03 1.679395373894786e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.260000000000000e+02 1.217755620695791e+06 -1.484353488285639e+06 6.873675786746623e+06 -7.089181413084401e+03 1.978030365073742e+03 1.679244677868564e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.270000000000000e+02 1.217613836666706e+06 -1.484313927090647e+06 6.873709370179797e+06 -7.089202124013203e+03 1.978083398433922e+03 1.679093980439301e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.280000000000000e+02 1.217472052224582e+06 -1.484274364835338e+06 6.873742950598752e+06 -7.089222831384131e+03 1.978136431482198e+03 1.678943282959595e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.290000000000000e+02 1.217330267369680e+06 -1.484234801519772e+06 6.873776528003425e+06 -7.089243535605325e+03 1.978189463133394e+03 1.678792585068556e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.300000000000000e+02 1.217188482101972e+06 -1.484195237143948e+06 6.873810102393829e+06 -7.089264236363900e+03 1.978242494220746e+03 1.678641887041462e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.310000000000000e+02 1.217046696421512e+06 -1.484155671707871e+06 6.873843673769946e+06 -7.089284934270274e+03 1.978295524530898e+03 1.678491186602435e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.320000000000000e+02 1.216904910328270e+06 -1.484116105211534e+06 6.873877242131786e+06 -7.089305628675503e+03 1.978348554225541e+03 1.678340486251140e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.330000000000000e+02 1.216763123822512e+06 -1.484076537655009e+06 6.873910807479287e+06 -7.089326319931111e+03 1.978401582756446e+03 1.678189785200779e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.340000000000000e+02 1.216621336904208e+06 -1.484036969038291e+06 6.873944369812456e+06 -7.089347007888873e+03 1.978454610534315e+03 1.678039083562101e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.350000000000000e+02 1.216479549573312e+06 -1.483997399361358e+06 6.873977929131305e+06 -7.089367692046090e+03 1.978507637350347e+03 1.677888383683957e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.360000000000000e+02 1.216337761830094e+06 -1.483957828624282e+06 6.874011485435772e+06 -7.089388374039143e+03 1.978560663914056e+03 1.677737677883732e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.370000000000000e+02 1.216195973674526e+06 -1.483918256827063e+06 6.874045038725866e+06 -7.089409052230346e+03 1.978613689619760e+03 1.677586973721466e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.380000000000000e+02 1.216054185106658e+06 -1.483878683969699e+06 6.874078589001566e+06 -7.089429727225879e+03 1.978666714099231e+03 1.677436269128822e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.390000000000000e+02 1.215912396126466e+06 -1.483839110052193e+06 6.874112136262892e+06 -7.089450398917310e+03 1.978719738044553e+03 1.677285563704178e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.400000000000000e+02 1.215770606734216e+06 -1.483799535074615e+06 6.874145680509774e+06 -7.089471067406825e+03 1.978772761149373e+03 1.677134857399790e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.410000000000000e+02 1.215628816929866e+06 -1.483759959036946e+06 6.874179221742220e+06 -7.089491732579889e+03 1.978825783423075e+03 1.676984150680832e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.420000000000000e+02 1.215487026713481e+06 -1.483720381939202e+06 6.874212759960225e+06 -7.089512394794378e+03 1.978878804898721e+03 1.676833442016656e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.430000000000000e+02 1.215345236085036e+06 -1.483680803781386e+06 6.874246295163788e+06 -7.089533053134684e+03 1.978931825333585e+03 1.676682735518662e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.440000000000000e+02 1.215203445044784e+06 -1.483641224563552e+06 6.874279827352852e+06 -7.089553708643596e+03 1.978984845160413e+03 1.676532026311595e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.450000000000000e+02 1.215061653592696e+06 -1.483601644285695e+06 6.874313356527423e+06 -7.089574361212042e+03 1.979037864472062e+03 1.676381314734586e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.460000000000000e+02 1.214919861728738e+06 -1.483562062947809e+06 6.874346882687514e+06 -7.089595009856961e+03 1.979090882386746e+03 1.676230605969308e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.470000000000000e+02 1.214778069453171e+06 -1.483522480549956e+06 6.874380405833059e+06 -7.089615655885267e+03 1.979143900291435e+03 1.676079892861965e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.480000000000000e+02 1.214636276765967e+06 -1.483482897092134e+06 6.874413925964070e+06 -7.089636298556485e+03 1.979196917115483e+03 1.675929179817082e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.490000000000000e+02 1.214494483667183e+06 -1.483443312574350e+06 6.874447443080531e+06 -7.089656937350614e+03 1.979249932203935e+03 1.675778469809461e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.500000000000000e+02 1.214352690156782e+06 -1.483403726996595e+06 6.874480957182451e+06 -7.089677573293591e+03 1.979302947413580e+03 1.675627756274226e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.510000000000000e+02 1.214210896235039e+06 -1.483364140358942e+06 6.874514468269768e+06 -7.089698206046301e+03 1.979355961613774e+03 1.675477042019036e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.520000000000000e+02 1.214069101901911e+06 -1.483324552661378e+06 6.874547976342491e+06 -7.089718835735874e+03 1.979408975161120e+03 1.675326326073948e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.530000000000000e+02 1.213927307157368e+06 -1.483284963903896e+06 6.874581481400629e+06 -7.089739461800805e+03 1.979461987525530e+03 1.675175611433255e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.540000000000000e+02 1.213785512001674e+06 -1.483245374086564e+06 6.874614983444123e+06 -7.089760084958247e+03 1.979514999674564e+03 1.675024893913816e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.550000000000000e+02 1.213643716434790e+06 -1.483205783209368e+06 6.874648482472976e+06 -7.089780704525005e+03 1.979568010439028e+03 1.674874177806551e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.560000000000000e+02 1.213501920456786e+06 -1.483166191272328e+06 6.874681978487181e+06 -7.089801321072979e+03 1.979621020650734e+03 1.674723459700722e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.570000000000000e+02 1.213360124067620e+06 -1.483126598275427e+06 6.874715471486741e+06 -7.089821934342747e+03 1.979674030016303e+03 1.674572741039876e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.580000000000000e+02 1.213218327267564e+06 -1.483087004218743e+06 6.874748961471592e+06 -7.089842544512945e+03 1.979727038737430e+03 1.674422020830110e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.590000000000000e+02 1.213076530056586e+06 -1.483047409102267e+06 6.874782448441751e+06 -7.089863151255077e+03 1.979780046624001e+03 1.674271300675845e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.600000000000000e+02 1.212934732434639e+06 -1.483007812925976e+06 6.874815932397224e+06 -7.089883754752116e+03 1.979833053665090e+03 1.674120579827747e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.610000000000000e+02 1.212792934401997e+06 -1.482968215689949e+06 6.874849413337946e+06 -7.089904355027835e+03 1.979886059822582e+03 1.673969858233766e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.620000000000000e+02 1.212651135958623e+06 -1.482928617394173e+06 6.874882891263928e+06 -7.089924952022471e+03 1.979939065275505e+03 1.673819135921934e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.630000000000000e+02 1.212509337104577e+06 -1.482889018038659e+06 6.874916366175157e+06 -7.089945545855831e+03 1.979992069598359e+03 1.673668412918351e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.640000000000000e+02 1.212367537839832e+06 -1.482849417623407e+06 6.874949838071640e+06 -7.089966136166442e+03 1.980045073403760e+03 1.673517689973883e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.650000000000000e+02 1.212225738164648e+06 -1.482809816148478e+06 6.874983306953314e+06 -7.089986723440241e+03 1.980098076376099e+03 1.673366965451391e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.660000000000000e+02 1.212083938078995e+06 -1.482770213613868e+06 6.875016772820191e+06 -7.090007307658762e+03 1.980151078637127e+03 1.673216239277157e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.670000000000000e+02 1.211942137582934e+06 -1.482730610019590e+06 6.875050235672255e+06 -7.090027888441544e+03 1.980204080019993e+03 1.673065513244942e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.680000000000000e+02 1.211800336676423e+06 -1.482691005365625e+06 6.875083695509514e+06 -7.090048465967151e+03 1.980257080526589e+03 1.672914786607396e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.690000000000000e+02 1.211658535359743e+06 -1.482651399652061e+06 6.875117152331907e+06 -7.090069039857892e+03 1.980310080048604e+03 1.672764061074959e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.700000000000000e+02 1.211516733632847e+06 -1.482611792878871e+06 6.875150606139448e+06 -7.090089611004036e+03 1.980363078764511e+03 1.672613332711166e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.710000000000000e+02 1.211374931495700e+06 -1.482572185046050e+06 6.875184056932137e+06 -7.090110179057308e+03 1.980416077484175e+03 1.672462601967618e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.720000000000000e+02 1.211233128948575e+06 -1.482532576153671e+06 6.875217504709916e+06 -7.090130743594477e+03 1.980469074796926e+03 1.672311872355926e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.730000000000000e+02 1.211091325991433e+06 -1.482492966201720e+06 6.875250949472796e+06 -7.090151304862043e+03 1.980522071403428e+03 1.672161141980520e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.740000000000000e+02 1.210949522624331e+06 -1.482453355190206e+06 6.875284391220761e+06 -7.090171862984001e+03 1.980575066832437e+03 1.672010410906714e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.750000000000000e+02 1.210807718847248e+06 -1.482413743119134e+06 6.875317829953819e+06 -7.090192417726056e+03 1.980628062018590e+03 1.671859678956373e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.760000000000000e+02 1.210665914660439e+06 -1.482374129988562e+06 6.875351265671908e+06 -7.090212969076360e+03 1.980681055962073e+03 1.671708947416341e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.770000000000000e+02 1.210524110063871e+06 -1.482334515798480e+06 6.875384698375041e+06 -7.090233517800914e+03 1.980734049510953e+03 1.671558212037620e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.780000000000000e+02 1.210382305057510e+06 -1.482294900548882e+06 6.875418128063219e+06 -7.090254062449946e+03 1.980787041691646e+03 1.671407480080828e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.790000000000000e+02 1.210240499641627e+06 -1.482255284239840e+06 6.875451554736390e+06 -7.090274604555143e+03 1.980840033967444e+03 1.671256743336458e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.800000000000000e+02 1.210098693816173e+06 -1.482215666871330e+06 6.875484978394557e+06 -7.090295143323695e+03 1.980893024835449e+03 1.671106006976676e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.810000000000000e+02 1.209956887581228e+06 -1.482176048443386e+06 6.875518399037706e+06 -7.090315678472164e+03 1.980946014741869e+03 1.670955271633669e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.820000000000000e+02 1.209815080936743e+06 -1.482136428955982e+06 6.875551816665848e+06 -7.090336210485957e+03 1.980999004173191e+03 1.670804534676933e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.830000000000000e+02 1.209673273882996e+06 -1.482096808409198e+06 6.875585231278920e+06 -7.090356739309225e+03 1.981051992660769e+03 1.670653796920064e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.840000000000000e+02 1.209531466419940e+06 -1.482057186803015e+06 6.875618642876930e+06 -7.090377264597996e+03 1.981104979831015e+03 1.670503060263562e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.850000000000000e+02 1.209389658547547e+06 -1.482017564137428e+06 6.875652051459886e+06 -7.090397786881392e+03 1.981157966840526e+03 1.670352321063277e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.860000000000000e+02 1.209247850266080e+06 -1.481977940412502e+06 6.875685457027730e+06 -7.090418306094160e+03 1.981210953082668e+03 1.670201580343074e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.870000000000000e+02 1.209106041575509e+06 -1.481938315628236e+06 6.875718859580469e+06 -7.090438822233445e+03 1.981263938698782e+03 1.670050837939533e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.880000000000000e+02 1.208964232475895e+06 -1.481898689784640e+06 6.875752259118089e+06 -7.090459334369375e+03 1.981316922462998e+03 1.669900099259653e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.890000000000000e+02 1.208822422967196e+06 -1.481859062881698e+06 6.875785655640598e+06 -7.090479843637633e+03 1.981369906355067e+03 1.669749357101924e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.900000000000000e+02 1.208680613049687e+06 -1.481819434919484e+06 6.875819049147936e+06 -7.090500349744176e+03 1.981422889183505e+03 1.669598614172139e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.910000000000000e+02 1.208538802723330e+06 -1.481779805897990e+06 6.875852439640108e+06 -7.090520852724557e+03 1.981475871410445e+03 1.669447869748675e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.920000000000000e+02 1.208396991988191e+06 -1.481740175817232e+06 6.875885827117102e+06 -7.090541352307149e+03 1.981528852546066e+03 1.669297125574819e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.930000000000000e+02 1.208255180844230e+06 -1.481700544677197e+06 6.875919211578933e+06 -7.090561848661549e+03 1.981581833049643e+03 1.669146380371885e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.940000000000000e+02 1.208113369291720e+06 -1.481660912477956e+06 6.875952593025526e+06 -7.090582342025923e+03 1.981634812979226e+03 1.668995633071381e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.950000000000000e+02 1.207971557330621e+06 -1.481621279219499e+06 6.875985971456904e+06 -7.090602831573274e+03 1.981687791500659e+03 1.668844888167681e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.960000000000000e+02 1.207829744960894e+06 -1.481581644901809e+06 6.876019346873065e+06 -7.090623318127861e+03 1.981740769556004e+03 1.668694141044085e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.970000000000000e+02 1.207687932182808e+06 -1.481542009524960e+06 6.876052719273954e+06 -7.090643801488389e+03 1.981793746777033e+03 1.668543392999361e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.980000000000000e+02 1.207546118996335e+06 -1.481502373088948e+06 6.876086088659576e+06 -7.090664282017205e+03 1.981846723882789e+03 1.668392641624831e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.990000000000000e+02 1.207404305401528e+06 -1.481462735593777e+06 6.876119455029920e+06 -7.090684758389531e+03 1.981899698731039e+03 1.668241895122876e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.000000000000000e+02 1.207262491398355e+06 -1.481423097039442e+06 6.876152818384996e+06 -7.090705232016933e+03 1.981952673602357e+03 1.668091144756214e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.010000000000000e+02 1.207120676987088e+06 -1.481383457426016e+06 6.876186178724735e+06 -7.090725702530009e+03 1.982005647769242e+03 1.667940392973300e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.020000000000000e+02 1.206978862167688e+06 -1.481343816753487e+06 6.876219536049150e+06 -7.090746169460867e+03 1.982058620696545e+03 1.667789642397124e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.030000000000000e+02 1.206837046940115e+06 -1.481304175021840e+06 6.876252890358253e+06 -7.090766633307542e+03 1.982111593194212e+03 1.667638889937458e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.040000000000000e+02 1.206695231304641e+06 -1.481264532231147e+06 6.876286241651978e+06 -7.090787093863593e+03 1.982164564814540e+03 1.667488137014267e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.050000000000000e+02 1.206553415261229e+06 -1.481224888381401e+06 6.876319589930340e+06 -7.090807551247438e+03 1.982217535534674e+03 1.667337383160061e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.060000000000000e+02 1.206411598809941e+06 -1.481185243472611e+06 6.876352935193317e+06 -7.090828005422379e+03 1.982270505331769e+03 1.667186628556877e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.070000000000000e+02 1.206269781950747e+06 -1.481145597504776e+06 6.876386277440921e+06 -7.090848456187604e+03 1.982323474774061e+03 1.667035873340170e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.080000000000000e+02 1.206127964683905e+06 -1.481105950477952e+06 6.876419616673092e+06 -7.090868903525658e+03 1.982376442711928e+03 1.666885119010935e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.090000000000000e+02 1.205986147009386e+06 -1.481066302392140e+06 6.876452952889834e+06 -7.090889348188087e+03 1.982429410400335e+03 1.666734360862142e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.100000000000000e+02 1.205844328927154e+06 -1.481026653247327e+06 6.876486286091167e+06 -7.090909788973712e+03 1.982482377094168e+03 1.666583604851440e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.110000000000000e+02 1.205702510437468e+06 -1.480987003043576e+06 6.876519616277017e+06 -7.090930227342207e+03 1.982535343430767e+03 1.666432844071222e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.120000000000000e+02 1.205560691540307e+06 -1.480947351780890e+06 6.876552943447397e+06 -7.090950661585193e+03 1.982588308287176e+03 1.666282087075087e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.130000000000000e+02 1.205418872235721e+06 -1.480907699459271e+06 6.876586267602297e+06 -7.090971093015517e+03 1.982641272566405e+03 1.666131327239822e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.140000000000000e+02 1.205277052523677e+06 -1.480868046078711e+06 6.876619588741721e+06 -7.090991521456098e+03 1.982694236367516e+03 1.665980565183939e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.150000000000000e+02 1.205135232404451e+06 -1.480828391639289e+06 6.876652906865605e+06 -7.091011946249931e+03 1.982747199288814e+03 1.665829804160415e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.160000000000000e+02 1.204993411877999e+06 -1.480788736140987e+06 6.876686221973968e+06 -7.091032367605329e+03 1.982800160773151e+03 1.665679043989060e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.170000000000000e+02 1.204851590944388e+06 -1.480749079583822e+06 6.876719534066785e+06 -7.091052786283099e+03 1.982853122210742e+03 1.665528279752079e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.180000000000000e+02 1.204709769603578e+06 -1.480709421967780e+06 6.876752843144073e+06 -7.091073201446407e+03 1.982906082538388e+03 1.665377516279415e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.190000000000000e+02 1.204567947855844e+06 -1.480669763292937e+06 6.876786149205762e+06 -7.091093613148630e+03 1.982959041765911e+03 1.665226753335464e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.200000000000000e+02 1.204426125701149e+06 -1.480630103559284e+06 6.876819452251869e+06 -7.091114021797306e+03 1.983012000436604e+03 1.665075988535713e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.210000000000000e+02 1.204284303139447e+06 -1.480590442766801e+06 6.876852752282400e+06 -7.091134427146685e+03 1.983064958454259e+03 1.664925223030273e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.220000000000000e+02 1.204142480171015e+06 -1.480550780915563e+06 6.876886049297290e+06 -7.091154829092550e+03 1.983117915398200e+03 1.664774457779575e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.230000000000000e+02 1.204000656795809e+06 -1.480511118005554e+06 6.876919343296554e+06 -7.091175228048754e+03 1.983170871494276e+03 1.664623690766801e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.240000000000000e+02 1.203858833013907e+06 -1.480471454036807e+06 6.876952634280172e+06 -7.091195623821549e+03 1.983223827256185e+03 1.664472922165358e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.250000000000000e+02 1.203717008825256e+06 -1.480431789009289e+06 6.876985922248158e+06 -7.091216016196284e+03 1.983276781861943e+03 1.664322153898489e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.260000000000000e+02 1.203575184230140e+06 -1.480392122923089e+06 6.877019207200447e+06 -7.091236405314869e+03 1.983329735850561e+03 1.664171384700207e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.270000000000000e+02 1.203433359228506e+06 -1.480352455778178e+06 6.877052489137047e+06 -7.091256791100112e+03 1.983382688588606e+03 1.664020615682798e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.280000000000000e+02 1.203291533820329e+06 -1.480312787574559e+06 6.877085768057969e+06 -7.091277173766386e+03 1.983435640699964e+03 1.663869845170174e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.290000000000000e+02 1.203149708005878e+06 -1.480273118312301e+06 6.877119043963152e+06 -7.091297553241240e+03 1.983488592566701e+03 1.663719072990599e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.300000000000000e+02 1.203007881785110e+06 -1.480233447991388e+06 6.877152316852606e+06 -7.091317929423146e+03 1.983541543094928e+03 1.663568300931928e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.310000000000000e+02 1.202866055158094e+06 -1.480193776611840e+06 6.877185586726313e+06 -7.091338302168636e+03 1.983594492780557e+03 1.663417528979244e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.320000000000000e+02 1.202724228124785e+06 -1.480154104173638e+06 6.877218853584286e+06 -7.091358671802710e+03 1.983647441783384e+03 1.663266755569203e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.330000000000000e+02 1.202582400685464e+06 -1.480114430676863e+06 6.877252117426459e+06 -7.091379038405204e+03 1.983700390128653e+03 1.663115980334935e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.340000000000000e+02 1.202440572840090e+06 -1.480074756121502e+06 6.877285378252843e+06 -7.091399401693753e+03 1.983753337731517e+03 1.662965204567570e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.350000000000000e+02 1.202298744588622e+06 -1.480035080507538e+06 6.877318636063448e+06 -7.091419761409898e+03 1.983806284233491e+03 1.662814429799221e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.360000000000000e+02 1.202156915931329e+06 -1.479995403835045e+06 6.877351890858213e+06 -7.091440118085954e+03 1.983859230003904e+03 1.662663653334415e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.370000000000000e+02 1.202015086868178e+06 -1.479955726104011e+06 6.877385142637144e+06 -7.091460471474421e+03 1.983912175052206e+03 1.662512876200742e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.380000000000000e+02 1.201873257399233e+06 -1.479916047314455e+06 6.877418391400228e+06 -7.091480821699079e+03 1.983965119040795e+03 1.662362098298930e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.390000000000000e+02 1.201731427524457e+06 -1.479876367466366e+06 6.877451637147476e+06 -7.091501168566458e+03 1.984018062482876e+03 1.662211319802211e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.400000000000000e+02 1.201589597244116e+06 -1.479836686559809e+06 6.877484879878824e+06 -7.091521512242634e+03 1.984071005145447e+03 1.662060540303201e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.410000000000000e+02 1.201447766558179e+06 -1.479797004594781e+06 6.877518119594280e+06 -7.091541852792680e+03 1.984123947102045e+03 1.661909759436713e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.420000000000000e+02 1.201305935466703e+06 -1.479757321571290e+06 6.877551356293831e+06 -7.091562189818776e+03 1.984176887746927e+03 1.661758979629627e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.430000000000000e+02 1.201164103969655e+06 -1.479717637489327e+06 6.877584589977489e+06 -7.091582523576404e+03 1.984229827744578e+03 1.661608198980160e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.440000000000000e+02 1.201022272067309e+06 -1.479677952348971e+06 6.877617820645189e+06 -7.091602854583827e+03 1.984282767504597e+03 1.661457414799057e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.450000000000000e+02 1.200880439759619e+06 -1.479638266150198e+06 6.877651048296938e+06 -7.091623181665923e+03 1.984335705593775e+03 1.661306633812815e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.460000000000000e+02 1.200738607046552e+06 -1.479598578893004e+06 6.877684272932751e+06 -7.091643506136981e+03 1.984388643792357e+03 1.661155848276668e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.470000000000000e+02 1.200596773928376e+06 -1.479558890577457e+06 6.877717494552561e+06 -7.091663826763275e+03 1.984441580343558e+03 1.661005065568205e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.480000000000000e+02 1.200454940405057e+06 -1.479519201203551e+06 6.877750713156378e+06 -7.091684144785307e+03 1.984494516718840e+03 1.660854278636471e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.490000000000000e+02 1.200313106476661e+06 -1.479479510771301e+06 6.877783928744189e+06 -7.091704458885366e+03 1.984547451579297e+03 1.660703494692448e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.500000000000000e+02 1.200171272143143e+06 -1.479439819280690e+06 6.877817141316006e+06 -7.091724770048590e+03 1.984600386260404e+03 1.660552707927506e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.510000000000000e+02 1.200029437404782e+06 -1.479400126731796e+06 6.877850350871760e+06 -7.091745078008488e+03 1.984653319801196e+03 1.660401920661197e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.520000000000000e+02 1.199887602261533e+06 -1.479360433124602e+06 6.877883557411465e+06 -7.091765382984039e+03 1.984706253172069e+03 1.660251130761259e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.530000000000000e+02 1.199745766713362e+06 -1.479320738459098e+06 6.877916760935130e+06 -7.091785684251364e+03 1.984759185086340e+03 1.660100342878559e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.540000000000000e+02 1.199603930760536e+06 -1.479281042735354e+06 6.877949961442691e+06 -7.091805982756577e+03 1.984812116730207e+03 1.659949551552472e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.550000000000000e+02 1.199462094403023e+06 -1.479241345953366e+06 6.877983158934160e+06 -7.091826277239583e+03 1.984865046496306e+03 1.659798764091127e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.560000000000000e+02 1.199320257640888e+06 -1.479201648113146e+06 6.878016353409519e+06 -7.091846568937728e+03 1.984917976225022e+03 1.659647972990984e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.570000000000000e+02 1.199178420474083e+06 -1.479161949214675e+06 6.878049544868784e+06 -7.091866857790405e+03 1.984970905800196e+03 1.659497178651299e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.580000000000000e+02 1.199036582902887e+06 -1.479122249258032e+06 6.878082733311884e+06 -7.091887142723565e+03 1.985023833256744e+03 1.659346388046170e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.590000000000000e+02 1.198894744927266e+06 -1.479082548243210e+06 6.878115918738835e+06 -7.091907424652854e+03 1.985076760567794e+03 1.659195594858098e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.600000000000000e+02 1.198752906547169e+06 -1.479042846170182e+06 6.878149101149643e+06 -7.091927703636211e+03 1.985129687460528e+03 1.659044799183411e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.610000000000000e+02 1.198611067762880e+06 -1.479003143039036e+06 6.878182280544247e+06 -7.091947978749150e+03 1.985182612686359e+03 1.658894006473730e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.620000000000000e+02 1.198469228574352e+06 -1.478963438849751e+06 6.878215456922657e+06 -7.091968250855277e+03 1.985235537144192e+03 1.658743211970733e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.630000000000000e+02 1.198327388981660e+06 -1.478923733602352e+06 6.878248630284857e+06 -7.091988519958331e+03 1.985288461453270e+03 1.658592414884534e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.640000000000000e+02 1.198185548984754e+06 -1.478884027296814e+06 6.878281800630856e+06 -7.092008785630513e+03 1.985341384639300e+03 1.658441618233838e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.650000000000000e+02 1.198043708583914e+06 -1.478844319933221e+06 6.878314967960593e+06 -7.092029048087217e+03 1.985394307050779e+03 1.658290820676181e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.660000000000000e+02 1.197901867779095e+06 -1.478804611511553e+06 6.878348132274078e+06 -7.092049307433184e+03 1.985447228872752e+03 1.658140021539043e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.670000000000000e+02 1.197760026570370e+06 -1.478764902031834e+06 6.878381293571296e+06 -7.092069563265838e+03 1.985500149319928e+03 1.657989223499769e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.680000000000000e+02 1.197618184957692e+06 -1.478725191494043e+06 6.878414451852256e+06 -7.092089815977092e+03 1.985553069275452e+03 1.657838423803595e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.690000000000000e+02 1.197476342941342e+06 -1.478685479898262e+06 6.878447607116896e+06 -7.092110065390127e+03 1.985605988539042e+03 1.657687623445688e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.700000000000000e+02 1.197334500521275e+06 -1.478645767244472e+06 6.878480759365225e+06 -7.092130311638059e+03 1.985658906844056e+03 1.657536822198587e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.710000000000000e+02 1.197192657697452e+06 -1.478606053532662e+06 6.878513908597252e+06 -7.092150554568084e+03 1.985711824450209e+03 1.657386020381369e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.720000000000000e+02 1.197050814470149e+06 -1.478566338762907e+06 6.878547054812917e+06 -7.092170793970658e+03 1.985764740856158e+03 1.657235219504317e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.730000000000000e+02 1.196908970839322e+06 -1.478526622935191e+06 6.878580198012226e+06 -7.092191030754459e+03 1.985817657089519e+03 1.657084414452358e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.740000000000000e+02 1.196767126805044e+06 -1.478486906049537e+06 6.878613338195169e+06 -7.092211263958320e+03 1.985870572279769e+03 1.656933610365227e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.750000000000000e+02 1.196625282367269e+06 -1.478447188105924e+06 6.878646475361752e+06 -7.092231493950891e+03 1.985923486484758e+03 1.656782805616949e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.760000000000000e+02 1.196483437526274e+06 -1.478407469104434e+06 6.878679609511915e+06 -7.092251720651588e+03 1.985976400143203e+03 1.656631999998245e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.770000000000000e+02 1.196341592282016e+06 -1.478367749045047e+06 6.878712740645662e+06 -7.092271943979160e+03 1.986029312440204e+03 1.656481194871566e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.780000000000000e+02 1.196199746634460e+06 -1.478328027927754e+06 6.878745868763011e+06 -7.092292164130954e+03 1.986082224637803e+03 1.656330387825386e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.790000000000000e+02 1.196057900583875e+06 -1.478288305752628e+06 6.878778993863896e+06 -7.092312381175327e+03 1.986135135538819e+03 1.656179580069750e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.800000000000000e+02 1.195916054130227e+06 -1.478248582519658e+06 6.878812115948320e+06 -7.092332594705538e+03 1.986188045599527e+03 1.656028772748906e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.810000000000000e+02 1.195774207273579e+06 -1.478208858228861e+06 6.878845235016278e+06 -7.092352805408992e+03 1.986240955243881e+03 1.655877962432839e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.820000000000000e+02 1.195632360013888e+06 -1.478169132880217e+06 6.878878351067773e+06 -7.092373012580066e+03 1.986293863970747e+03 1.655727152725080e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.830000000000000e+02 1.195490512351437e+06 -1.478129406473814e+06 6.878911464102748e+06 -7.092393216542122e+03 1.986346771836739e+03 1.655576342190890e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.840000000000000e+02 1.195348664286172e+06 -1.478089679009622e+06 6.878944574121210e+06 -7.092413413219735e+03 1.986399692004684e+03 1.655425531537809e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.850000000000000e+02 1.195206815834993e+06 -1.478049950492381e+06 6.878977681119218e+06 -7.092433615086817e+03 1.986452585424203e+03 1.655274717049241e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.860000000000000e+02 1.195064966964317e+06 -1.478010220912682e+06 6.879010785104608e+06 -7.092453808968115e+03 1.986505490642267e+03 1.655123906031879e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.870000000000000e+02 1.194923117691028e+06 -1.477970490275248e+06 6.879043886073444e+06 -7.092473999988998e+03 1.986558395082831e+03 1.654973092612643e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.880000000000000e+02 1.194781268015195e+06 -1.477930758580101e+06 6.879076984025709e+06 -7.092494187892893e+03 1.986611299081825e+03 1.654822277453022e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.890000000000000e+02 1.194639417936773e+06 -1.477891025827219e+06 6.879110078961411e+06 -7.092514372337583e+03 1.986664202174889e+03 1.654671462579247e+03 5.843119980400000e-03 -1.463452652500000e-03 -1.305863585000000e-03 2.216014341100000e-03 5.599026748599000e-04 1.693298060600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.900000000000000e+02 1.194497567456044e+06 -1.477851292016690e+06 6.879143170880490e+06 -7.092534553443007e+03 1.986717104167486e+03 1.654520647729122e+03 5.843372348300000e-03 -1.463755847700000e-03 -1.304845820700000e-03 2.216275207800000e-03 5.596441883900000e-04 1.692684078100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.910000000000000e+02 1.194355716572963e+06 -1.477811557148492e+06 6.879176259782954e+06 -7.092554731420516e+03 1.986770005520658e+03 1.654369831432596e+03 5.843372348300000e-03 -1.463755847700000e-03 -1.304845820700000e-03 2.216275207800000e-03 5.596441883900000e-04 1.692684078100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.920000000000000e+02 1.194213865287597e+06 -1.477771821222644e+06 6.879209345668790e+06 -7.092574906326668e+03 1.986822906262286e+03 1.654219013415699e+03 5.843372348300000e-03 -1.463755847700000e-03 -1.304845820700000e-03 2.216275207800000e-03 5.596441883900000e-04 1.692684078100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.930000000000000e+02 1.194072013599905e+06 -1.477732084239129e+06 6.879242428538009e+06 -7.092595078096005e+03 1.986875806621028e+03 1.654068193667823e+03 5.843372348300000e-03 -1.463755847700000e-03 -1.304845820700000e-03 2.216275207800000e-03 5.596441883900000e-04 1.692684078100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.940000000000000e+02 1.193930161510159e+06 -1.477692346198024e+06 6.879275508390543e+06 -7.092615067162664e+03 1.986928007461883e+03 1.653919007240659e+03 5.843372348300000e-03 -1.463755847700000e-03 -1.304845820700000e-03 2.216275207800000e-03 5.596441883900000e-04 1.692684078100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.950000000000000e+02 1.193788309021358e+06 -1.477652607113112e+06 6.879308585259177e+06 -7.092635052832774e+03 1.986980208072716e+03 1.653769820345853e+03 5.843372348300000e-03 -1.463755847700000e-03 -1.304845820700000e-03 2.216275207800000e-03 5.596441883900000e-04 1.692684078100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.960000000000000e+02 1.193646456128222e+06 -1.477612866982812e+06 6.879341659145116e+06 -7.092655214793847e+03 1.987033105827204e+03 1.653618999291373e+03 5.843372348300000e-03 -1.463755847700000e-03 -1.304845820700000e-03 2.216275207800000e-03 5.596441883900000e-04 1.692684078100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.970000000000000e+02 1.193504602833218e+06 -1.477573125794960e+06 6.879374730014327e+06 -7.092675373335015e+03 1.987086002361387e+03 1.653468178751800e+03 5.843372348300000e-03 -1.463755847700000e-03 -1.304845820700000e-03 2.216275207800000e-03 5.596441883900000e-04 1.692684078100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.980000000000000e+02 1.193362749136320e+06 -1.477533383549557e+06 6.879407797866827e+06 -7.092695528545115e+03 1.987138897935682e+03 1.653317358025505e+03 5.843372348300000e-03 -1.463755847700000e-03 -1.304845820700000e-03 2.216275207800000e-03 5.596441883900000e-04 1.692684078100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.990000000000000e+02 1.193220895037587e+06 -1.477493640246616e+06 6.879440862702593e+06 -7.092715680984283e+03 1.987191793056349e+03 1.653166534110759e+03 5.843372348300000e-03 -1.463755847700000e-03 -1.304845820700000e-03 2.216275207800000e-03 5.596441883900000e-04 1.692684078100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.000000000000000e+02 1.193079040536982e+06 -1.477453895886125e+06 6.879473924521643e+06 -7.092735829563644e+03 1.987244687215215e+03 1.653015712245662e+03 5.843624327500000e-03 -1.464058934800000e-03 -1.303827888900000e-03 2.216536085800000e-03 5.593855423500000e-04 1.692070550200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.010000000000000e+02 1.192937185634776e+06 -1.477414150468153e+06 6.879506983323910e+06 -7.092755975028739e+03 1.987297580228662e+03 1.652864889510787e+03 5.843624327500000e-03 -1.464058934800000e-03 -1.303827888900000e-03 2.216536085800000e-03 5.593855423500000e-04 1.692070550200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.020000000000000e+02 1.192795330330931e+06 -1.477374403992693e+06 6.879540039109405e+06 -7.092776117231386e+03 1.987350472573127e+03 1.652714065934406e+03 5.843624327500000e-03 -1.464058934800000e-03 -1.303827888900000e-03 2.216536085800000e-03 5.593855423500000e-04 1.692070550200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.030000000000000e+02 1.192653474625409e+06 -1.477334656459731e+06 6.879573091878136e+06 -7.092796256604550e+03 1.987403364737044e+03 1.652563239073322e+03 5.843624327500000e-03 -1.464058934800000e-03 -1.303827888900000e-03 2.216536085800000e-03 5.593855423500000e-04 1.692070550200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.040000000000000e+02 1.192511618518480e+06 -1.477294907869337e+06 6.879606141630040e+06 -7.092816286124287e+03 1.987455747434885e+03 1.652413500688704e+03 5.843624327500000e-03 -1.464058934800000e-03 -1.303827888900000e-03 2.216536085800000e-03 5.593855423500000e-04 1.692070550200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.050000000000000e+02 1.192369762002667e+06 -1.477255158228826e+06 6.879639188389143e+06 -7.092836312594422e+03 1.987508130144600e+03 1.652263759991947e+03 5.843624327500000e-03 -1.464058934800000e-03 -1.303827888900000e-03 2.216536085800000e-03 5.593855423500000e-04 1.692070550200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.060000000000000e+02 1.192227905077376e+06 -1.477215407538006e+06 6.879672232155557e+06 -7.092856442069403e+03 1.987561019264377e+03 1.652112932718282e+03 5.843624327500000e-03 -1.464058934800000e-03 -1.303827888900000e-03 2.216536085800000e-03 5.593855423500000e-04 1.692070550200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.070000000000000e+02 1.192086047750665e+06 -1.477175655789746e+06 6.879705272905149e+06 -7.092876567873995e+03 1.987613907517612e+03 1.651962106575865e+03 5.843624327500000e-03 -1.464058934800000e-03 -1.303827888900000e-03 2.216536085800000e-03 5.593855423500000e-04 1.692070550200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.080000000000000e+02 1.191944190022806e+06 -1.477135902984120e+06 6.879738310637856e+06 -7.092896690792270e+03 1.987666795229583e+03 1.651811277841025e+03 5.843624327500000e-03 -1.464058934800000e-03 -1.303827888900000e-03 2.216536085800000e-03 5.593855423500000e-04 1.692070550200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.090000000000000e+02 1.191802331893758e+06 -1.477096149121114e+06 6.879771345353690e+06 -7.092916810791313e+03 1.987719682399950e+03 1.651660446652853e+03 5.843624327500000e-03 -1.464058934800000e-03 -1.303827888900000e-03 2.216536085800000e-03 5.593855423500000e-04 1.692070550200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.100000000000000e+02 1.191660473363492e+06 -1.477056394200724e+06 6.879804377052659e+06 -7.092936927171952e+03 1.987772568580995e+03 1.651509616530492e+03 5.843875918200000e-03 -1.464361913800000e-03 -1.302809789700000e-03 2.216796975100000e-03 5.591267368100000e-04 1.691457476800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.110000000000000e+02 1.191518614432270e+06 -1.477016638223013e+06 6.879837405734701e+06 -7.092957040074558e+03 1.987825453319851e+03 1.651358787449645e+03 5.843875918200000e-03 -1.464361913800000e-03 -1.302809789700000e-03 2.216796975100000e-03 5.591267368100000e-04 1.691457476800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.120000000000000e+02 1.191376755100060e+06 -1.476976881187979e+06 6.879870431399825e+06 -7.092977149961280e+03 1.987878337970324e+03 1.651207955754731e+03 5.843875918200000e-03 -1.464361913800000e-03 -1.302809789700000e-03 2.216796975100000e-03 5.591267368100000e-04 1.691457476800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.130000000000000e+02 1.191234895366918e+06 -1.476937123095625e+06 6.879903454048016e+06 -7.092997256798082e+03 1.987931221646038e+03 1.651057122703006e+03 5.843875918200000e-03 -1.464361913800000e-03 -1.302809789700000e-03 2.216796975100000e-03 5.591267368100000e-04 1.691457476800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.140000000000000e+02 1.191093035232817e+06 -1.476897363945951e+06 6.879936473679288e+06 -7.093017234354178e+03 1.987983609872678e+03 1.650907443851574e+03 5.843875918200000e-03 -1.464361913800000e-03 -1.302809789700000e-03 2.216796975100000e-03 5.591267368100000e-04 1.691457476800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.150000000000000e+02 1.190951174668848e+06 -1.476857603739503e+06 6.879969490324145e+06 -7.093037208962101e+03 1.988035997844609e+03 1.650757762574306e+03 5.843875918200000e-03 -1.464361913800000e-03 -1.302809789700000e-03 2.216796975100000e-03 5.591267368100000e-04 1.691457476800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.160000000000000e+02 1.190809313681068e+06 -1.476817842478070e+06 6.880002503981118e+06 -7.093057305937453e+03 1.988088879188074e+03 1.650606928014252e+03 5.843875918200000e-03 -1.464361913800000e-03 -1.302809789700000e-03 2.216796975100000e-03 5.591267368100000e-04 1.691457476800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.170000000000000e+02 1.190667452292618e+06 -1.476778080159386e+06 6.880035514621100e+06 -7.093077399985947e+03 1.988141760010534e+03 1.650456091005859e+03 5.843875918200000e-03 -1.464361913800000e-03 -1.302809789700000e-03 2.216796975100000e-03 5.591267368100000e-04 1.691457476800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.180000000000000e+02 1.190525590503458e+06 -1.476738316783436e+06 6.880068522244101e+06 -7.093097490055703e+03 1.988194638947392e+03 1.650305257716770e+03 5.843875918200000e-03 -1.464361913800000e-03 -1.302809789700000e-03 2.216796975100000e-03 5.591267368100000e-04 1.691457476800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.190000000000000e+02 1.190383728313870e+06 -1.476698552350308e+06 6.880101526850057e+06 -7.093117577565313e+03 1.988247518307225e+03 1.650154419240152e+03 5.843875918200000e-03 -1.464361913800000e-03 -1.302809789700000e-03 2.216796975100000e-03 5.591267368100000e-04 1.691457476800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.200000000000000e+02 1.190241865723804e+06 -1.476658786859972e+06 6.880134528438978e+06 -7.093137661236211e+03 1.988300395955758e+03 1.650003583671709e+03 5.844127120500000e-03 -1.464664784900000e-03 -1.301791522800000e-03 2.217057875800000e-03 5.588677717800000e-04 1.690844857900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.210000000000000e+02 1.190100002733225e+06 -1.476619020312422e+06 6.880167527010876e+06 -7.093157742043853e+03 1.988353273089414e+03 1.649852745377603e+03 5.844127120500000e-03 -1.464664784900000e-03 -1.301791522800000e-03 2.217057875800000e-03 5.588677717800000e-04 1.690844857900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.220000000000000e+02 1.189958139342406e+06 -1.476579252707733e+06 6.880200522565683e+06 -7.093177819821036e+03 1.988406149880019e+03 1.649701904849141e+03 5.844127120500000e-03 -1.464664784900000e-03 -1.301791522800000e-03 2.217057875800000e-03 5.588677717800000e-04 1.690844857900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.230000000000000e+02 1.189816275551309e+06 -1.476539484045894e+06 6.880233515103415e+06 -7.093197893761556e+03 1.988459025084982e+03 1.649551067063191e+03 5.844127120500000e-03 -1.464664784900000e-03 -1.301791522800000e-03 2.217057875800000e-03 5.588677717800000e-04 1.690844857900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.240000000000000e+02 1.189674411360002e+06 -1.476499714326921e+06 6.880266504624054e+06 -7.093217786882585e+03 1.988511124491532e+03 1.649401955687781e+03 5.844127120500000e-03 -1.464664784900000e-03 -1.301791522800000e-03 2.217057875800000e-03 5.588677717800000e-04 1.690844857900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.250000000000000e+02 1.189532546785087e+06 -1.476459943570198e+06 6.880299491159130e+06 -7.093237676817483e+03 1.988563224236667e+03 1.649252842272275e+03 5.844127120500000e-03 -1.464664784900000e-03 -1.301791522800000e-03 2.217057875800000e-03 5.588677717800000e-04 1.690844857900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.260000000000000e+02 1.189390681834652e+06 -1.476420171778098e+06 6.880332474706687e+06 -7.093257741397745e+03 1.988616097438235e+03 1.649102000576323e+03 5.844127120500000e-03 -1.464664784900000e-03 -1.301791522800000e-03 2.217057875800000e-03 5.588677717800000e-04 1.690844857900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.270000000000000e+02 1.189248816484195e+06 -1.476380398928908e+06 6.880365455237110e+06 -7.093277802772741e+03 1.988668969666884e+03 1.648951158178586e+03 5.844127120500000e-03 -1.464664784900000e-03 -1.301791522800000e-03 2.217057875800000e-03 5.588677717800000e-04 1.690844857900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.280000000000000e+02 1.189106950733679e+06 -1.476340625022620e+06 6.880398432750410e+06 -7.093297860985699e+03 1.988721841581828e+03 1.648800314066107e+03 5.844127120500000e-03 -1.464664784900000e-03 -1.301791522800000e-03 2.217057875800000e-03 5.588677717800000e-04 1.690844857900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.290000000000000e+02 1.188965084583373e+06 -1.476300850059303e+06 6.880431407246524e+06 -7.093317915673738e+03 1.988774712034375e+03 1.648649471222290e+03 5.844127120500000e-03 -1.464664784900000e-03 -1.301791522800000e-03 2.217057875800000e-03 5.588677717800000e-04 1.690844857900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.300000000000000e+02 1.188823218033246e+06 -1.476261074038954e+06 6.880464378725461e+06 -7.093337967273903e+03 1.988827582049379e+03 1.648498626505348e+03 5.844377934600000e-03 -1.464967548000000e-03 -1.300773088800000e-03 2.217318787800000e-03 5.586086474800000e-04 1.690232693800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.310000000000000e+02 1.188681351083351e+06 -1.476221296961574e+06 6.880497347187206e+06 -7.093358015808896e+03 1.988880451230889e+03 1.648347780317324e+03 5.844377934600000e-03 -1.464967548000000e-03 -1.300773088800000e-03 2.217318787800000e-03 5.586086474800000e-04 1.690232693800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.320000000000000e+02 1.188539483733661e+06 -1.476181518827165e+06 6.880530312631771e+06 -7.093378060418077e+03 1.988933319032517e+03 1.648196936993806e+03 5.844377934600000e-03 -1.464967548000000e-03 -1.300773088800000e-03 2.217318787800000e-03 5.586086474800000e-04 1.690232693800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.330000000000000e+02 1.188397615984442e+06 -1.476141739635792e+06 6.880563275059091e+06 -7.093398102226017e+03 1.988986186590616e+03 1.648046090337834e+03 5.844377934600000e-03 -1.464967548000000e-03 -1.300773088800000e-03 2.217318787800000e-03 5.586086474800000e-04 1.690232693800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.340000000000000e+02 1.188255747835656e+06 -1.476101959387444e+06 6.880596234469179e+06 -7.093417999770304e+03 1.989038734269963e+03 1.647896242649935e+03 5.844377934600000e-03 -1.464967548000000e-03 -1.300773088800000e-03 2.217318787800000e-03 5.586086474800000e-04 1.690232693800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.350000000000000e+02 1.188113879281230e+06 -1.476062178085855e+06 6.880629190884133e+06 -7.093437894265680e+03 1.989091281531955e+03 1.647746393140609e+03 5.844377934600000e-03 -1.464967548000000e-03 -1.300773088800000e-03 2.217318787800000e-03 5.586086474800000e-04 1.690232693800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.360000000000000e+02 1.187972010328199e+06 -1.476022395733112e+06 6.880662144302266e+06 -7.093457926578040e+03 1.989144146897607e+03 1.647595543238496e+03 5.844377934600000e-03 -1.464967548000000e-03 -1.300773088800000e-03 2.217318787800000e-03 5.586086474800000e-04 1.690232693800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.370000000000000e+02 1.187830140975790e+06 -1.475982612323435e+06 6.880695094703122e+06 -7.093477955434372e+03 1.989197011318203e+03 1.647444693662646e+03 5.844377934600000e-03 -1.464967548000000e-03 -1.300773088800000e-03 2.217318787800000e-03 5.586086474800000e-04 1.690232693800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.380000000000000e+02 1.187688271224070e+06 -1.475942827856847e+06 6.880728042086688e+06 -7.093497981196644e+03 1.989249874498039e+03 1.647293843250966e+03 5.844377934600000e-03 -1.464967548000000e-03 -1.300773088800000e-03 2.217318787800000e-03 5.586086474800000e-04 1.690232693800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.390000000000000e+02 1.187546401073012e+06 -1.475903042333344e+06 6.880760986452970e+06 -7.093518003551139e+03 1.989302737310519e+03 1.647142992233217e+03 5.844377934600000e-03 -1.464967548000000e-03 -1.300773088800000e-03 2.217318787800000e-03 5.586086474800000e-04 1.690232693800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.400000000000000e+02 1.187404530522873e+06 -1.475863255752987e+06 6.880793927801909e+06 -7.093538022558195e+03 1.989355598984061e+03 1.646992141326036e+03 5.844628360700000e-03 -1.465270203300000e-03 -1.299754487400000e-03 2.217579711400000e-03 5.583493639000000e-04 1.689620984500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.410000000000000e+02 1.187262659573620e+06 -1.475823468115769e+06 6.880826866133513e+06 -7.093558038610468e+03 1.989408460312448e+03 1.646841287863355e+03 5.844628360700000e-03 -1.465270203300000e-03 -1.299754487400000e-03 2.217579711400000e-03 5.583493639000000e-04 1.689620984500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.420000000000000e+02 1.187120788225319e+06 -1.475783679421704e+06 6.880859801447768e+06 -7.093578051339829e+03 1.989461320362968e+03 1.646690434582302e+03 5.844628360700000e-03 -1.465270203300000e-03 -1.299754487400000e-03 2.217579711400000e-03 5.583493639000000e-04 1.689620984500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.430000000000000e+02 1.186978916477934e+06 -1.475743889670785e+06 6.880892733744682e+06 -7.093598060720586e+03 1.989514179868850e+03 1.646539580667659e+03 5.844628360700000e-03 -1.465270203300000e-03 -1.299754487400000e-03 2.217579711400000e-03 5.583493639000000e-04 1.689620984500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.440000000000000e+02 1.186837044331734e+06 -1.475704098863083e+06 6.880925663024195e+06 -7.093617858928052e+03 1.989566516004316e+03 1.646390267255315e+03 5.844628360700000e-03 -1.465270203300000e-03 -1.299754487400000e-03 2.217579711400000e-03 5.583493639000000e-04 1.689620984500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.450000000000000e+02 1.186695171782246e+06 -1.475664307006482e+06 6.880958589319171e+06 -7.093637654079603e+03 1.989618851847954e+03 1.646240952001215e+03 5.844628360700000e-03 -1.465270203300000e-03 -1.299754487400000e-03 2.217579711400000e-03 5.583493639000000e-04 1.689620984500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.460000000000000e+02 1.186553298836025e+06 -1.475624514102912e+06 6.880991512628021e+06 -7.093657653829358e+03 1.989671708916736e+03 1.646090095831700e+03 5.844628360700000e-03 -1.465270203300000e-03 -1.299754487400000e-03 2.217579711400000e-03 5.583493639000000e-04 1.689620984500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.470000000000000e+02 1.186411425491180e+06 -1.475584720142603e+06 6.881024432919423e+06 -7.093677650326626e+03 1.989724565120157e+03 1.645939239025223e+03 5.844628360700000e-03 -1.465270203300000e-03 -1.299754487400000e-03 2.217579711400000e-03 5.583493639000000e-04 1.689620984500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.480000000000000e+02 1.186269551747677e+06 -1.475544925125552e+06 6.881057350193393e+06 -7.093697643715077e+03 1.989777420781663e+03 1.645788380563848e+03 5.844628360700000e-03 -1.465270203300000e-03 -1.299754487400000e-03 2.217579711400000e-03 5.583493639000000e-04 1.689620984500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.490000000000000e+02 1.186127677605574e+06 -1.475505129051763e+06 6.881090264449913e+06 -7.093717633776714e+03 1.989830275177661e+03 1.645637522285740e+03 5.844628360700000e-03 -1.465270203300000e-03 -1.299754487400000e-03 2.217579711400000e-03 5.583493639000000e-04 1.689620984500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.500000000000000e+02 1.185985803064840e+06 -1.475465331921233e+06 6.881123175688991e+06 -7.093737620485035e+03 1.989883129140918e+03 1.645486663252852e+03 5.844878398900000e-03 -1.465572750900000e-03 -1.298735718600000e-03 2.217840646500000e-03 5.580899211100000e-04 1.689009730000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.510000000000000e+02 1.185843928125742e+06 -1.475425533734030e+06 6.881156083910568e+06 -7.093757603675901e+03 1.989935981721492e+03 1.645335805360924e+03 5.844878398900000e-03 -1.465572750900000e-03 -1.298735718600000e-03 2.217840646500000e-03 5.580899211100000e-04 1.689009730000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.520000000000000e+02 1.185702052788245e+06 -1.475385734490145e+06 6.881188989114652e+06 -7.093777584338734e+03 1.989988834052224e+03 1.645184942979196e+03 5.844878398900000e-03 -1.465572750900000e-03 -1.298735718600000e-03 2.217840646500000e-03 5.580899211100000e-04 1.689009730000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.530000000000000e+02 1.185560177052310e+06 -1.475345934189564e+06 6.881221891301249e+06 -7.093797561254954e+03 1.990041685620697e+03 1.645034081928472e+03 5.844878398900000e-03 -1.465572750900000e-03 -1.298735718600000e-03 2.217840646500000e-03 5.580899211100000e-04 1.689009730000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.540000000000000e+02 1.185418300918204e+06 -1.475306132832359e+06 6.881254790470306e+06 -7.093817477816738e+03 1.990093726139718e+03 1.644884485560754e+03 5.844878398900000e-03 -1.465572750900000e-03 -1.298735718600000e-03 2.217840646500000e-03 5.580899211100000e-04 1.689009730000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.550000000000000e+02 1.185276424378418e+06 -1.475266330432157e+06 6.881287686649170e+06 -7.093837390983756e+03 1.990145766547743e+03 1.644734888539121e+03 5.844878398900000e-03 -1.465572750900000e-03 -1.298735718600000e-03 2.217840646500000e-03 5.580899211100000e-04 1.689009730000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.560000000000000e+02 1.185134547429752e+06 -1.475226526987982e+06 6.881320579838559e+06 -7.093857358655167e+03 1.990198615933489e+03 1.644584023267198e+03 5.844878398900000e-03 -1.465572750900000e-03 -1.298735718600000e-03 2.217840646500000e-03 5.580899211100000e-04 1.689009730000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.570000000000000e+02 1.184992670082906e+06 -1.475186722487177e+06 6.881353470010409e+06 -7.093877322746180e+03 1.990251464093566e+03 1.644433159206086e+03 5.844878398900000e-03 -1.465572750900000e-03 -1.298735718600000e-03 2.217840646500000e-03 5.580899211100000e-04 1.689009730000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.580000000000000e+02 1.184850792338151e+06 -1.475146916929814e+06 6.881386357164655e+06 -7.093897283577304e+03 1.990304311377246e+03 1.644282294553479e+03 5.844878398900000e-03 -1.465572750900000e-03 -1.298735718600000e-03 2.217840646500000e-03 5.580899211100000e-04 1.689009730000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.590000000000000e+02 1.184708914195446e+06 -1.475107110315881e+06 6.881419241301308e+06 -7.093917240688434e+03 1.990357157362747e+03 1.644131431797241e+03 5.844878398900000e-03 -1.465572750900000e-03 -1.298735718600000e-03 2.217840646500000e-03 5.580899211100000e-04 1.689009730000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.600000000000000e+02 1.184567035654752e+06 -1.475067302645359e+06 6.881452122420379e+06 -7.093937195240071e+03 1.990410003286400e+03 1.643980564444606e+03 5.845128049400000e-03 -1.465875190800000e-03 -1.297716782500000e-03 2.218101593200000e-03 5.578303191900000e-04 1.688398930300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.610000000000000e+02 1.184425156716347e+06 -1.475027493918333e+06 6.881485000521799e+06 -7.093957146425413e+03 1.990462848488374e+03 1.643829696757015e+03 5.845128049400000e-03 -1.465875190800000e-03 -1.297716782500000e-03 2.218101593200000e-03 5.578303191900000e-04 1.688398930300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.620000000000000e+02 1.184283277380183e+06 -1.474987684134778e+06 6.881517875605586e+06 -7.093977094358907e+03 1.990515692364585e+03 1.643678829011434e+03 5.845128049400000e-03 -1.465875190800000e-03 -1.297716782500000e-03 2.218101593200000e-03 5.578303191900000e-04 1.688398930300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.630000000000000e+02 1.184141397646336e+06 -1.474947873294724e+06 6.881550747671719e+06 -7.093997038759655e+03 1.990568535526955e+03 1.643527961628822e+03 5.845128049400000e-03 -1.465875190800000e-03 -1.297716782500000e-03 2.218101593200000e-03 5.578303191900000e-04 1.688398930300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.640000000000000e+02 1.183999517514760e+06 -1.474908061398148e+06 6.881583616720213e+06 -7.094016807048719e+03 1.990620877367194e+03 1.643378460978216e+03 5.845128049400000e-03 -1.465875190800000e-03 -1.297716782500000e-03 2.218101593200000e-03 5.578303191900000e-04 1.688398930300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.650000000000000e+02 1.183857636964752e+06 -1.474868248447877e+06 6.881616482784133e+06 -7.094036572367624e+03 1.990673219077406e+03 1.643228957840969e+03 5.845128049400000e-03 -1.465875190800000e-03 -1.297716782500000e-03 2.218101593200000e-03 5.578303191900000e-04 1.688398930300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.660000000000000e+02 1.183715755993873e+06 -1.474828434443168e+06 6.881649345864016e+06 -7.094056506960743e+03 1.990726059631249e+03 1.643078089057808e+03 5.845128049400000e-03 -1.465875190800000e-03 -1.297716782500000e-03 2.218101593200000e-03 5.578303191900000e-04 1.688398930300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.670000000000000e+02 1.183573874625568e+06 -1.474788619382024e+06 6.881682205926188e+06 -7.094076438694391e+03 1.990778899612406e+03 1.642927217596824e+03 5.845128049400000e-03 -1.465875190800000e-03 -1.297716782500000e-03 2.218101593200000e-03 5.578303191900000e-04 1.688398930300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.680000000000000e+02 1.183431992859790e+06 -1.474748803264421e+06 6.881715062970659e+06 -7.094096367525854e+03 1.990831739442067e+03 1.642776343106561e+03 5.845128049400000e-03 -1.465875190800000e-03 -1.297716782500000e-03 2.218101593200000e-03 5.578303191900000e-04 1.688398930300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.690000000000000e+02 1.183290110696814e+06 -1.474708986090436e+06 6.881747916997369e+06 -7.094116292711421e+03 1.990884577982757e+03 1.642625470187919e+03 5.845128049400000e-03 -1.465875190800000e-03 -1.297716782500000e-03 2.218101593200000e-03 5.578303191900000e-04 1.688398930300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.700000000000000e+02 1.183148228136605e+06 -1.474669167860061e+06 6.881780768006325e+06 -7.094136214501899e+03 1.990937415300363e+03 1.642474597691409e+03 5.845377312500000e-03 -1.466177523200000e-03 -1.296697678800000e-03 2.218362551600000e-03 5.575705581300000e-04 1.687788585300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.710000000000000e+02 1.183006345179118e+06 -1.474629348573276e+06 6.881813615997537e+06 -7.094156132832724e+03 1.990990251914822e+03 1.642323725234387e+03 5.845377312500000e-03 -1.466177523200000e-03 -1.296697678800000e-03 2.218362551600000e-03 5.575705581300000e-04 1.687788585300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.720000000000000e+02 1.182864461824625e+06 -1.474589528230154e+06 6.881846460970942e+06 -7.094176048716100e+03 1.991043088452311e+03 1.642172847718562e+03 5.845377312500000e-03 -1.466177523200000e-03 -1.296697678800000e-03 2.218362551600000e-03 5.575705581300000e-04 1.687788585300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.730000000000000e+02 1.182722578073096e+06 -1.474549706830694e+06 6.881879302926554e+06 -7.094195960907418e+03 1.991095923676225e+03 1.642021972002780e+03 5.845377312500000e-03 -1.466177523200000e-03 -1.296697678800000e-03 2.218362551600000e-03 5.575705581300000e-04 1.687788585300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.740000000000000e+02 1.182580693924589e+06 -1.474509884374902e+06 6.881912141864353e+06 -7.094215649459984e+03 1.991148404334629e+03 1.641872480984931e+03 5.845377312500000e-03 -1.466177523200000e-03 -1.296697678800000e-03 2.218362551600000e-03 5.575705581300000e-04 1.687788585300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.750000000000000e+02 1.182438809395725e+06 -1.474470060873482e+06 6.881944977809172e+06 -7.094235335055621e+03 1.991200884869633e+03 1.641722987479516e+03 5.845377312500000e-03 -1.466177523200000e-03 -1.296697678800000e-03 2.218362551600000e-03 5.575705581300000e-04 1.687788585300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.760000000000000e+02 1.182296924491654e+06 -1.474430236327950e+06 6.881977810759763e+06 -7.094255237544078e+03 1.991253717685623e+03 1.641572109797894e+03 5.845377312500000e-03 -1.466177523200000e-03 -1.296697678800000e-03 2.218362551600000e-03 5.575705581300000e-04 1.687788585300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.770000000000000e+02 1.182155039190797e+06 -1.474390410726138e+06 6.882010640692505e+06 -7.094275136871582e+03 1.991306549589492e+03 1.641421231149077e+03 5.845377312500000e-03 -1.466177523200000e-03 -1.296697678800000e-03 2.218362551600000e-03 5.575705581300000e-04 1.687788585300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.780000000000000e+02 1.182013153493119e+06 -1.474350584068032e+06 6.882043467607400e+06 -7.094295032827951e+03 1.991359380916479e+03 1.641270352003352e+03 5.845377312500000e-03 -1.466177523200000e-03 -1.296697678800000e-03 2.218362551600000e-03 5.575705581300000e-04 1.687788585300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.790000000000000e+02 1.181871267398888e+06 -1.474310756353702e+06 6.882076291504393e+06 -7.094314925590280e+03 1.991412211234373e+03 1.641119472153985e+03 5.845377312500000e-03 -1.466177523200000e-03 -1.296697678800000e-03 2.218362551600000e-03 5.575705581300000e-04 1.687788585300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.800000000000000e+02 1.181729380908070e+06 -1.474270927583145e+06 6.882109112383492e+06 -7.094334815106903e+03 1.991465040763062e+03 1.640968591542585e+03 5.845626188100000e-03 -1.466479748000000e-03 -1.295678408100000e-03 2.218623521700000e-03 5.573106381500000e-04 1.687178695500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.810000000000000e+02 1.181587494020726e+06 -1.474231097756368e+06 6.882141930244680e+06 -7.094354701375313e+03 1.991517869412136e+03 1.640817710294294e+03 5.845626188100000e-03 -1.466479748000000e-03 -1.295678408100000e-03 2.218623521700000e-03 5.573106381500000e-04 1.687178695500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.820000000000000e+02 1.181445606736824e+06 -1.474191266873367e+06 6.882174745087972e+06 -7.094374584394406e+03 1.991570697380628e+03 1.640666828161781e+03 5.845626188100000e-03 -1.466479748000000e-03 -1.295678408100000e-03 2.218623521700000e-03 5.573106381500000e-04 1.687178695500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.830000000000000e+02 1.181303719056633e+06 -1.474151434934212e+06 6.882207556913299e+06 -7.094394463844908e+03 1.991623524124910e+03 1.640515947193258e+03 5.845626188100000e-03 -1.466479748000000e-03 -1.295678408100000e-03 2.218623521700000e-03 5.573106381500000e-04 1.687178695500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.840000000000000e+02 1.181161830980109e+06 -1.474111601938887e+06 6.882240365720675e+06 -7.094414248783765e+03 1.991675730218146e+03 1.640366239360806e+03 5.845626188100000e-03 -1.466479748000000e-03 -1.295678408100000e-03 2.218623521700000e-03 5.573106381500000e-04 1.687178695500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.850000000000000e+02 1.181019942506915e+06 -1.474071767899161e+06 6.882273171534164e+06 -7.094434030180087e+03 1.991727935949467e+03 1.640216531766147e+03 5.845626188100000e-03 -1.466479748000000e-03 -1.295678408100000e-03 2.218623521700000e-03 5.573106381500000e-04 1.687178695500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.860000000000000e+02 1.180878053630298e+06 -1.474031932812991e+06 6.882305974355315e+06 -7.094453900278987e+03 1.991780760494341e+03 1.640065646961383e+03 5.845626188100000e-03 -1.466479748000000e-03 -1.295678408100000e-03 2.218623521700000e-03 5.573106381500000e-04 1.687178695500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.870000000000000e+02 1.180736164357555e+06 -1.473992096670714e+06 6.882338774158471e+06 -7.094473767060639e+03 1.991833584561500e+03 1.639914761304685e+03 5.845626188100000e-03 -1.466479748000000e-03 -1.295678408100000e-03 2.218623521700000e-03 5.573106381500000e-04 1.687178695500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.880000000000000e+02 1.180594274688733e+06 -1.473952259472325e+06 6.882371570943621e+06 -7.094493630705751e+03 1.991886407512358e+03 1.639763874835214e+03 5.845626188100000e-03 -1.466479748000000e-03 -1.295678408100000e-03 2.218623521700000e-03 5.573106381500000e-04 1.687178695500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.890000000000000e+02 1.180452384623803e+06 -1.473912421217821e+06 6.882404364710766e+06 -7.094513491021979e+03 1.991939229726905e+03 1.639612987891040e+03 5.845626188100000e-03 -1.466479748000000e-03 -1.295678408100000e-03 2.218623521700000e-03 5.573106381500000e-04 1.687178695500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.900000000000000e+02 1.180310494163039e+06 -1.473872581907280e+06 6.882437155459853e+06 -7.094533347934465e+03 1.991992051104222e+03 1.639462100919165e+03 5.845874676600000e-03 -1.466781865300000e-03 -1.294658970000000e-03 2.218884503500000e-03 5.570505592499000e-04 1.686569260600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.910000000000000e+02 1.180168603306395e+06 -1.473832741540682e+06 6.882469943190886e+06 -7.094553201928814e+03 1.992044871849900e+03 1.639311211589417e+03 5.845874676600000e-03 -1.466781865300000e-03 -1.294658970000000e-03 2.218884503500000e-03 5.570505592499000e-04 1.686569260600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.920000000000000e+02 1.180026712053946e+06 -1.473792900118050e+06 6.882502727903855e+06 -7.094573052863905e+03 1.992097692028555e+03 1.639160320420933e+03 5.845874676600000e-03 -1.466781865300000e-03 -1.294658970000000e-03 2.218884503500000e-03 5.570505592499000e-04 1.686569260600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.930000000000000e+02 1.179884820405643e+06 -1.473753057639364e+06 6.882535509598764e+06 -7.094592899817258e+03 1.992150510822164e+03 1.639009432383162e+03 5.845874676600000e-03 -1.466781865300000e-03 -1.294658970000000e-03 2.218884503500000e-03 5.570505592499000e-04 1.686569260600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.940000000000000e+02 1.179742928361764e+06 -1.473713214104703e+06 6.882568288275555e+06 -7.094612572216355e+03 1.992202751361464e+03 1.638860006225462e+03 5.845874676600000e-03 -1.466781865300000e-03 -1.294658970000000e-03 2.218884503500000e-03 5.570505592499000e-04 1.686569260600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.950000000000000e+02 1.179601035923225e+06 -1.473673369524869e+06 6.882601063964128e+06 -7.094632241322854e+03 1.992254991707522e+03 1.638710579080931e+03 5.845874676600000e-03 -1.466781865300000e-03 -1.294658970000000e-03 2.218884503500000e-03 5.570505592499000e-04 1.686569260600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.960000000000000e+02 1.179459143084002e+06 -1.473633523898053e+06 6.882633836665856e+06 -7.094652078963358e+03 1.992307808414964e+03 1.638559686952208e+03 5.845874676600000e-03 -1.466781865300000e-03 -1.294658970000000e-03 2.218884503500000e-03 5.570505592499000e-04 1.686569260600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.970000000000000e+02 1.179317249849394e+06 -1.473593677215308e+06 6.882666606349423e+06 -7.094671913409785e+03 1.992360624145145e+03 1.638408794079698e+03 5.845874676600000e-03 -1.466781865300000e-03 -1.294658970000000e-03 2.218884503500000e-03 5.570505592499000e-04 1.686569260600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.980000000000000e+02 1.179175356219367e+06 -1.473553829476628e+06 6.882699373014836e+06 -7.094691744690930e+03 1.992413439428934e+03 1.638257899667086e+03 5.845874676600000e-03 -1.466781865300000e-03 -1.294658970000000e-03 2.218884503500000e-03 5.570505592499000e-04 1.686569260600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.990000000000000e+02 1.179033462193977e+06 -1.473513980682017e+06 6.882732136662082e+06 -7.094711572656909e+03 1.992466253350418e+03 1.638107005515532e+03 5.845874676600000e-03 -1.466781865300000e-03 -1.294658970000000e-03 2.218884503500000e-03 5.570505592499000e-04 1.686569260600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.000000000000000e+02 1.178891567773194e+06 -1.473474130831473e+06 6.882764897291173e+06 -7.094731397124459e+03 1.992519066718626e+03 1.637956111380528e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.010000000000000e+02 1.178749672957283e+06 -1.473434279925062e+06 6.882797654902044e+06 -7.094751218683250e+03 1.992571879489464e+03 1.637805214802525e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.020000000000000e+02 1.178607777746208e+06 -1.473394427962773e+06 6.882830409494706e+06 -7.094771036460456e+03 1.992624690508372e+03 1.637654320970489e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.030000000000000e+02 1.178465882139934e+06 -1.473354574944600e+06 6.882863161069166e+06 -7.094790851647454e+03 1.992677501827030e+03 1.637503422197431e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.040000000000000e+02 1.178323986138727e+06 -1.473314720870607e+06 6.882895909625364e+06 -7.094810663284411e+03 1.992730312097183e+03 1.637352524289736e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.050000000000000e+02 1.178182089742553e+06 -1.473274865740791e+06 6.882928655163312e+06 -7.094830471420784e+03 1.992783120943441e+03 1.637201627513447e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.060000000000000e+02 1.178040192951475e+06 -1.473235009555161e+06 6.882961397682992e+06 -7.094850276896226e+03 1.992835929650761e+03 1.637050726653588e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.070000000000000e+02 1.177898295765459e+06 -1.473195152313712e+06 6.882994137184417e+06 -7.094870078830367e+03 1.992888737446460e+03 1.636899826448451e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.080000000000000e+02 1.177756398184768e+06 -1.473155294016508e+06 6.883026873667520e+06 -7.094889877472756e+03 1.992941544296276e+03 1.636748925876607e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.090000000000000e+02 1.177614500209373e+06 -1.473115434663546e+06 6.883059607132314e+06 -7.094909672629883e+03 1.992994349969444e+03 1.636598026057467e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.100000000000000e+02 1.177472601839227e+06 -1.473075574254804e+06 6.883092337578806e+06 -7.094929464921986e+03 1.993047155431885e+03 1.636447123116024e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.110000000000000e+02 1.177330703074610e+06 -1.473035712790367e+06 6.883125065006940e+06 -7.094949253849098e+03 1.993099959811371e+03 1.636296220294782e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.120000000000000e+02 1.177188803915478e+06 -1.472995850270214e+06 6.883157789416718e+06 -7.094969039373193e+03 1.993152763221849e+03 1.636145317611579e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.130000000000000e+02 1.177046904361897e+06 -1.472955986694364e+06 6.883190510808132e+06 -7.094988821958133e+03 1.993205566286596e+03 1.635994412293392e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.140000000000000e+02 1.176905004413827e+06 -1.472916122062798e+06 6.883223229181187e+06 -7.095008601448762e+03 1.993258368593278e+03 1.635843505526451e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.150000000000000e+02 1.176763104071546e+06 -1.472876256375604e+06 6.883255944535822e+06 -7.095028377021159e+03 1.993311169461515e+03 1.635692601695129e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.160000000000000e+02 1.176621203335010e+06 -1.472836389632759e+06 6.883288656872050e+06 -7.095048149743319e+03 1.993363969750085e+03 1.635541695145906e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.170000000000000e+02 1.176479302204286e+06 -1.472796521834281e+06 6.883321366189850e+06 -7.095067919456915e+03 1.993416769672192e+03 1.635390786283663e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.180000000000000e+02 1.176337400679334e+06 -1.472756652980159e+06 6.883354072489240e+06 -7.095087685619415e+03 1.993469568484878e+03 1.635239878370924e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.190000000000000e+02 1.176195498760428e+06 -1.472716783070466e+06 6.883386775770151e+06 -7.095107448383171e+03 1.993522366218235e+03 1.635088970718831e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.200000000000000e+02 1.176053596447527e+06 -1.472676912105186e+06 6.883419476032598e+06 -7.095127207935205e+03 1.993575163123646e+03 1.634938062208626e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.210000000000000e+02 1.175911693740595e+06 -1.472637040084314e+06 6.883452173276585e+06 -7.095146964500225e+03 1.993627959565192e+03 1.634787151416698e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.220000000000000e+02 1.175769790639905e+06 -1.472597167007919e+06 6.883484867502055e+06 -7.095166717554812e+03 1.993680754873329e+03 1.634636241431792e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.230000000000000e+02 1.175627887145415e+06 -1.472557292875991e+06 6.883517558709012e+06 -7.095186467590632e+03 1.993733549812177e+03 1.634485329180242e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.240000000000000e+02 1.175485983257193e+06 -1.472517417688544e+06 6.883550246897451e+06 -7.095206214321325e+03 1.993786343619076e+03 1.634334416856362e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.250000000000000e+02 1.175344078975198e+06 -1.472477541445564e+06 6.883582932067371e+06 -7.095225957701591e+03 1.993839136720295e+03 1.634183504111601e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.260000000000000e+02 1.175202174299703e+06 -1.472437664147128e+06 6.883615614218717e+06 -7.095245697898239e+03 1.993891928973898e+03 1.634032590413328e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.270000000000000e+02 1.175060269230670e+06 -1.472397785793224e+06 6.883648293351495e+06 -7.095265434696039e+03 1.993944719986327e+03 1.633881677182928e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.280000000000000e+02 1.174918363768062e+06 -1.472357906383837e+06 6.883680969465718e+06 -7.095285168354274e+03 1.993997510926945e+03 1.633730761823150e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.290000000000000e+02 1.174776457912143e+06 -1.472318025919037e+06 6.883713642561318e+06 -7.095304898934465e+03 1.994050300767082e+03 1.633579845380008e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.300000000000000e+02 1.174634551662887e+06 -1.472278144398824e+06 6.883746312638312e+06 -7.095324625948512e+03 1.994103089608524e+03 1.633428929811945e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.310000000000000e+02 1.174492645020350e+06 -1.472238261823203e+06 6.883778979696682e+06 -7.095344350078536e+03 1.994155877871117e+03 1.633278011666338e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.320000000000000e+02 1.174350737984495e+06 -1.472198378192164e+06 6.883811643736438e+06 -7.095364070705085e+03 1.994208665400385e+03 1.633127093789951e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.330000000000000e+02 1.174208830555595e+06 -1.472158493505780e+06 6.883844304757518e+06 -7.095383788177579e+03 1.994261451863303e+03 1.632976175111941e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.340000000000000e+02 1.174066922733612e+06 -1.472118607764041e+06 6.883876962759930e+06 -7.095403502520391e+03 1.994314237704490e+03 1.632825254961634e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.350000000000000e+02 1.173925014518508e+06 -1.472078720966935e+06 6.883909617743685e+06 -7.095423213286575e+03 1.994367022513768e+03 1.632674335774316e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.360000000000000e+02 1.173783105910556e+06 -1.472038833114538e+06 6.883942269708722e+06 -7.095442920921085e+03 1.994419806739565e+03 1.632523415074528e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.370000000000000e+02 1.173641196909709e+06 -1.471998944206825e+06 6.883974918655051e+06 -7.095462625115500e+03 1.994472589557631e+03 1.632372495232632e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.380000000000000e+02 1.173499287516043e+06 -1.471959054243827e+06 6.884007564582654e+06 -7.095482326557837e+03 1.994525372468069e+03 1.632221571391737e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.390000000000000e+02 1.173357377729516e+06 -1.471919163225527e+06 6.884040207491547e+06 -7.095502024541464e+03 1.994578154058879e+03 1.632070648376151e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.400000000000000e+02 1.173215467550397e+06 -1.471879271151997e+06 6.884072847381661e+06 -7.095521719355984e+03 1.994630935112759e+03 1.631919723948521e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.410000000000000e+02 1.173073556978655e+06 -1.471839378023229e+06 6.884105484253010e+06 -7.095541410619525e+03 1.994683715090712e+03 1.631768800431133e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.420000000000000e+02 1.172931646014343e+06 -1.471799483839230e+06 6.884138118105576e+06 -7.095561098859343e+03 1.994736494064422e+03 1.631617875474855e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.430000000000000e+02 1.172789734657432e+06 -1.471759588599993e+06 6.884170748939374e+06 -7.095580783573946e+03 1.994789272532219e+03 1.631466950592161e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.440000000000000e+02 1.172647822908191e+06 -1.471719692305594e+06 6.884203376754340e+06 -7.095600465279962e+03 1.994842050079898e+03 1.631316024098313e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.450000000000000e+02 1.172505910766580e+06 -1.471679794956017e+06 6.884236001550483e+06 -7.095620143773805e+03 1.994894826831772e+03 1.631165096706727e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.460000000000000e+02 1.172363998232564e+06 -1.471639896551253e+06 6.884268623327809e+06 -7.095639818909970e+03 1.994947602834120e+03 1.631014168981760e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.470000000000000e+02 1.172222085306414e+06 -1.471599997091374e+06 6.884301242086262e+06 -7.095659490809438e+03 1.995000378146246e+03 1.630863240329447e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.480000000000000e+02 1.172080171988087e+06 -1.471560096576362e+06 6.884333857825847e+06 -7.095679159538992e+03 1.995053152406344e+03 1.630712310925134e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.490000000000000e+02 1.171938258277653e+06 -1.471520195006241e+06 6.884366470546555e+06 -7.095698825270033e+03 1.995105926329580e+03 1.630561379121668e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.500000000000000e+02 1.171796344175073e+06 -1.471480292380995e+06 6.884399080248388e+06 -7.095718487183870e+03 1.995158698551489e+03 1.630410450168908e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.510000000000000e+02 1.171654429680618e+06 -1.471440388700701e+06 6.884431686931292e+06 -7.095738146410812e+03 1.995211470926357e+03 1.630259516856092e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.520000000000000e+02 1.171512514794250e+06 -1.471400483965345e+06 6.884464290595273e+06 -7.095757802104819e+03 1.995264242107024e+03 1.630108584528668e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.530000000000000e+02 1.171370599515928e+06 -1.471360578174910e+06 6.884496891240338e+06 -7.095777454367607e+03 1.995317012111855e+03 1.629957652727649e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.540000000000000e+02 1.171228683845927e+06 -1.471320671329474e+06 6.884529488866430e+06 -7.095797103382651e+03 1.995369781491545e+03 1.629806719963562e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.550000000000000e+02 1.171086767784208e+06 -1.471280763429027e+06 6.884562083473558e+06 -7.095816749396244e+03 1.995422549993456e+03 1.629655785502732e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.560000000000000e+02 1.170944851330838e+06 -1.471240854473584e+06 6.884594675061703e+06 -7.095836392181402e+03 1.995475318101993e+03 1.629504849699786e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.570000000000000e+02 1.170802934485774e+06 -1.471200944463128e+06 6.884627263630881e+06 -7.095856031939820e+03 1.995528085602296e+03 1.629353911963790e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.580000000000000e+02 1.170661017249288e+06 -1.471161033397732e+06 6.884659849181024e+06 -7.095875667811098e+03 1.995580851417544e+03 1.629202977360555e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.590000000000000e+02 1.170519099621348e+06 -1.471121121277395e+06 6.884692431712147e+06 -7.095895300761185e+03 1.995633616760378e+03 1.629052040198271e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.600000000000000e+02 1.170377181601904e+06 -1.471081208102087e+06 6.884725011224256e+06 -7.095914930324097e+03 1.995686381087201e+03 1.628901103170114e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.610000000000000e+02 1.170235263191245e+06 -1.471041293871904e+06 6.884757587717290e+06 -7.095934556896452e+03 1.995739145148517e+03 1.628750163615605e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.620000000000000e+02 1.170093344389318e+06 -1.471001378586815e+06 6.884790161191260e+06 -7.095954180078510e+03 1.995791908202958e+03 1.628599224196911e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.630000000000000e+02 1.169951425196192e+06 -1.470961462246842e+06 6.884822731646148e+06 -7.095973800014471e+03 1.995844670238327e+03 1.628448284311047e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.640000000000000e+02 1.169809505611828e+06 -1.470921544851972e+06 6.884855299081969e+06 -7.095993416862913e+03 1.995897431846458e+03 1.628297342521002e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.650000000000000e+02 1.169667585636499e+06 -1.470881626402279e+06 6.884887863498657e+06 -7.096013030162281e+03 1.995950192083048e+03 1.628146402014698e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.660000000000000e+02 1.169525665270172e+06 -1.470841706897757e+06 6.884920424896223e+06 -7.096032640494779e+03 1.996002952111907e+03 1.627995458805575e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.670000000000000e+02 1.169383744512901e+06 -1.470801786338412e+06 6.884952983274654e+06 -7.096052247276172e+03 1.996055710646172e+03 1.627844517046658e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.680000000000000e+02 1.169241823364656e+06 -1.470761864724237e+06 6.884985538633960e+06 -7.096071850974531e+03 1.996108468868758e+03 1.627693573216231e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.690000000000000e+02 1.169099901825703e+06 -1.470721942055303e+06 6.885018090974076e+06 -7.096091451136113e+03 1.996161225618811e+03 1.627542630746888e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.700000000000000e+02 1.168957979896014e+06 -1.470682018331607e+06 6.885050640295011e+06 -7.096111048642037e+03 1.996213982519783e+03 1.627391683778844e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.710000000000000e+02 1.168816057575539e+06 -1.470642093553124e+06 6.885083186596778e+06 -7.096130642543312e+03 1.996266738183671e+03 1.627240738162290e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.720000000000000e+02 1.168674134864550e+06 -1.470602167719930e+06 6.885115729879315e+06 -7.096150233371010e+03 1.996319493312716e+03 1.627089790718308e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.730000000000000e+02 1.168532211763015e+06 -1.470562240832015e+06 6.885148270142631e+06 -7.096169820698313e+03 1.996372246925411e+03 1.626938844535868e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.740000000000000e+02 1.168390288271001e+06 -1.470522312889403e+06 6.885180807386709e+06 -7.096189404602183e+03 1.996424999792318e+03 1.626787898298941e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.750000000000000e+02 1.168248364388462e+06 -1.470482383892068e+06 6.885213341611561e+06 -7.096208985803790e+03 1.996477752721792e+03 1.626636947874651e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.760000000000000e+02 1.168106440115669e+06 -1.470442453840087e+06 6.885245872817126e+06 -7.096228563660948e+03 1.996530504313242e+03 1.626485997813991e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.770000000000000e+02 1.167964515452592e+06 -1.470402522733457e+06 6.885278401003414e+06 -7.096248138135429e+03 1.996583255069065e+03 1.626335047638530e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.780000000000000e+02 1.167822590399190e+06 -1.470362590572160e+06 6.885310926170432e+06 -7.096267709302374e+03 1.996636005021440e+03 1.626184096984250e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.790000000000000e+02 1.167680664955733e+06 -1.470322657356268e+06 6.885343448318120e+06 -7.096287276956648e+03 1.996688753753265e+03 1.626033147267032e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.800000000000000e+02 1.167538739122183e+06 -1.470282723085769e+06 6.885375967446486e+06 -7.096306841880143e+03 1.996741502663735e+03 1.625882193334627e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.810000000000000e+02 1.167396812898598e+06 -1.470242787760673e+06 6.885408483555520e+06 -7.096326403437156e+03 1.996794249819458e+03 1.625731240394822e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.820000000000000e+02 1.167254886284955e+06 -1.470202851380984e+06 6.885440996645225e+06 -7.096345961544783e+03 1.996846996789662e+03 1.625580286794803e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.830000000000000e+02 1.167112959281509e+06 -1.470162913946758e+06 6.885473506715544e+06 -7.096365516482929e+03 1.996899742607828e+03 1.625429332569012e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.840000000000000e+02 1.166971031888233e+06 -1.470122975457993e+06 6.885506013766487e+06 -7.096385068269531e+03 1.996952487446422e+03 1.625278377419417e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.850000000000000e+02 1.166829104105090e+06 -1.470083035914680e+06 6.885538517798059e+06 -7.096404616205245e+03 1.997005231238585e+03 1.625127424439289e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.860000000000000e+02 1.166687175932345e+06 -1.470043095316885e+06 6.885571018810201e+06 -7.096424161818878e+03 1.997057975338096e+03 1.624976465319251e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.870000000000000e+02 1.166545247369958e+06 -1.470003153664593e+06 6.885603516802927e+06 -7.096443703642789e+03 1.997110717660974e+03 1.624825509041358e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.880000000000000e+02 1.166403318418001e+06 -1.469963210957830e+06 6.885636011776215e+06 -7.096463242192886e+03 1.997163459176120e+03 1.624674552145518e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.890000000000000e+02 1.166261389076431e+06 -1.469923267196575e+06 6.885668503730082e+06 -7.096482777799790e+03 1.997216200408482e+03 1.624523592536435e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.900000000000000e+02 1.166119459345524e+06 -1.469883322380909e+06 6.885700992664458e+06 -7.096502309940194e+03 1.997268940603752e+03 1.624372633432123e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.910000000000000e+02 1.165977529225239e+06 -1.469843376510815e+06 6.885733478579363e+06 -7.096521838895953e+03 1.997321680079392e+03 1.624221673213087e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.920000000000000e+02 1.165835598715635e+06 -1.469803429586306e+06 6.885765961474772e+06 -7.096541364638747e+03 1.997374418468173e+03 1.624070712471903e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.930000000000000e+02 1.165693667816681e+06 -1.469763481607373e+06 6.885798441350699e+06 -7.096560887013229e+03 1.997427156299302e+03 1.623919751198668e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.940000000000000e+02 1.165551736528650e+06 -1.469723532574093e+06 6.885830918207086e+06 -7.096580406289158e+03 1.997479892959424e+03 1.623768789018863e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.950000000000000e+02 1.165409804851502e+06 -1.469683582486456e+06 6.885863392043936e+06 -7.096599922500725e+03 1.997532629568762e+03 1.623617824348442e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.960000000000000e+02 1.165267872785195e+06 -1.469643631344440e+06 6.885895862861264e+06 -7.096619434851058e+03 1.997585364617228e+03 1.623466862554663e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.970000000000000e+02 1.165125940330003e+06 -1.469603679148122e+06 6.885928330659005e+06 -7.096638944500554e+03 1.997638099074179e+03 1.623315897398732e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.980000000000000e+02 1.164984007485890e+06 -1.469563725897495e+06 6.885960795437171e+06 -7.096658450473693e+03 1.997690832736670e+03 1.623164933340920e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.990000000000000e+02 1.164842074252914e+06 -1.469523771592566e+06 6.885993257195746e+06 -7.096677953661865e+03 1.997743565447757e+03 1.623013966744366e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.000000000000000e+02 1.164700140631047e+06 -1.469483816233332e+06 6.886025715934741e+06 -7.096697453128229e+03 1.997796297532770e+03 1.622863001225948e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.010000000000000e+02 1.164558206620554e+06 -1.469443859819862e+06 6.886058171654093e+06 -7.096716949607670e+03 1.997849028626795e+03 1.622712034089133e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.020000000000000e+02 1.164416272221397e+06 -1.469403902352145e+06 6.886090624353812e+06 -7.096736442819059e+03 1.997901758927331e+03 1.622561066291162e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.030000000000000e+02 1.164274337433540e+06 -1.469363943830169e+06 6.886123074033909e+06 -7.096755932713113e+03 1.997954488710754e+03 1.622410097689580e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.040000000000000e+02 1.164132402257248e+06 -1.469323984254001e+06 6.886155520694320e+06 -7.096775419414180e+03 1.998007217411567e+03 1.622259128474626e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.050000000000000e+02 1.163990466692494e+06 -1.469284023623639e+06 6.886187964335057e+06 -7.096794902566327e+03 1.998059944905192e+03 1.622108160340045e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.060000000000000e+02 1.163848530739334e+06 -1.469244061939094e+06 6.886220404956103e+06 -7.096814382781558e+03 1.998112672029662e+03 1.621957189572757e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.070000000000000e+02 1.163706594397734e+06 -1.469204099200353e+06 6.886252842557470e+06 -7.096833860011899e+03 1.998165398734744e+03 1.621806216443448e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.080000000000000e+02 1.163564657667966e+06 -1.469164135407494e+06 6.886285277139095e+06 -7.096853333678911e+03 1.998218124275617e+03 1.621655244401592e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.090000000000000e+02 1.163422720549985e+06 -1.469124170560496e+06 6.886317708700988e+06 -7.096872804331801e+03 1.998270849034811e+03 1.621504270588835e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.100000000000000e+02 1.163280783043762e+06 -1.469084204659358e+06 6.886350137243158e+06 -7.096892271018186e+03 1.998323572421890e+03 1.621353299869284e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.110000000000000e+02 1.163138845149561e+06 -1.469044237704144e+06 6.886382562765543e+06 -7.096911735121816e+03 1.998376295697069e+03 1.621202324658693e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.120000000000000e+02 1.162996906867350e+06 -1.469004269694847e+06 6.886414985268156e+06 -7.096931195811465e+03 1.998429017875496e+03 1.621051349805750e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.130000000000000e+02 1.162854968197188e+06 -1.468964300631479e+06 6.886447404750980e+06 -7.096950653291624e+03 1.998481739245829e+03 1.620900374057944e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.140000000000000e+02 1.162713029139045e+06 -1.468924330514039e+06 6.886479821214024e+06 -7.096970107443000e+03 1.998534459907188e+03 1.620749397802295e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.150000000000000e+02 1.162571089693183e+06 -1.468884359342584e+06 6.886512234657229e+06 -7.096989558394281e+03 1.998587179699947e+03 1.620598420688992e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.160000000000000e+02 1.162429149859566e+06 -1.468844387117109e+06 6.886544645080602e+06 -7.097009006397700e+03 1.998639898993263e+03 1.620447441155372e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.170000000000000e+02 1.162287209638264e+06 -1.468804413837635e+06 6.886577052484131e+06 -7.097028450512444e+03 1.998692616908290e+03 1.620296464389614e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.180000000000000e+02 1.162145269029235e+06 -1.468764439504142e+06 6.886609456867823e+06 -7.097047892066371e+03 1.998745334450578e+03 1.620145483370706e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.190000000000000e+02 1.162003328032754e+06 -1.468724464116714e+06 6.886641858231616e+06 -7.097067329629544e+03 1.998798050759169e+03 1.619994505374835e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.200000000000000e+02 1.161861386648776e+06 -1.468684487675326e+06 6.886674256575526e+06 -7.097086764406980e+03 1.998850766244040e+03 1.619843524675848e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.210000000000000e+02 1.161719444877272e+06 -1.468644510179978e+06 6.886706651899553e+06 -7.097106196220568e+03 1.998903481886188e+03 1.619692540779828e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.220000000000000e+02 1.161577502718505e+06 -1.468604531630733e+06 6.886739044203646e+06 -7.097125624102549e+03 1.998956195733860e+03 1.619541560373975e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.230000000000000e+02 1.161435560172436e+06 -1.468564552027577e+06 6.886771433487805e+06 -7.097145049120172e+03 1.999008908670593e+03 1.619390577715937e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.240000000000000e+02 1.161293617239142e+06 -1.468524571370544e+06 6.886803819752019e+06 -7.097164470770050e+03 1.999061621207418e+03 1.619239594320727e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.250000000000000e+02 1.161151673918574e+06 -1.468484589659606e+06 6.886836202996301e+06 -7.097183889040717e+03 1.999114332865683e+03 1.619088610853830e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.260000000000000e+02 1.161009730211003e+06 -1.468444606894837e+06 6.886868583220584e+06 -7.097203304420824e+03 1.999167043562062e+03 1.618937625312836e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.270000000000000e+02 1.160867786116400e+06 -1.468404623076235e+06 6.886900960424884e+06 -7.097222716184721e+03 1.999219753543331e+03 1.618786640513131e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.280000000000000e+02 1.160725841634714e+06 -1.468364638203773e+06 6.886933334609207e+06 -7.097242125009459e+03 1.999272462965175e+03 1.618635653330806e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.290000000000000e+02 1.160583896766228e+06 -1.468324652277537e+06 6.886965705773489e+06 -7.097261530506151e+03 1.999325171194385e+03 1.618484666260277e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.300000000000000e+02 1.160441951510902e+06 -1.468284665297515e+06 6.886998073917743e+06 -7.097280932655242e+03 1.999377878834482e+03 1.618333678609091e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.310000000000000e+02 1.160300005868793e+06 -1.468244677263711e+06 6.887030439041952e+06 -7.097300331633983e+03 1.999430585451899e+03 1.618182690169984e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.320000000000000e+02 1.160158059839871e+06 -1.468204688176126e+06 6.887062801146130e+06 -7.097319727261649e+03 1.999483291554846e+03 1.618031701069062e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.330000000000000e+02 1.160016113424401e+06 -1.468164698034825e+06 6.887095160230212e+06 -7.097339119701742e+03 1.999535996654269e+03 1.617880711229925e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.340000000000000e+02 1.159874166622349e+06 -1.468124706839797e+06 6.887127516294207e+06 -7.097358508967445e+03 1.999588700678643e+03 1.617729720687756e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.350000000000000e+02 1.159732219433680e+06 -1.468084714591036e+06 6.887159869338129e+06 -7.097377894858349e+03 1.999641404323613e+03 1.617578729412290e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.360000000000000e+02 1.159590271858660e+06 -1.468044721288610e+06 6.887192219361912e+06 -7.097397277501592e+03 1.999694107144567e+03 1.617427737426977e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.370000000000000e+02 1.159448323897249e+06 -1.468004726932505e+06 6.887224566365567e+06 -7.097416657157442e+03 1.999746809004186e+03 1.617276743783799e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.380000000000000e+02 1.159306375549517e+06 -1.467964731522742e+06 6.887256910349079e+06 -7.097436033147839e+03 1.999799509814472e+03 1.617125751526995e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.390000000000000e+02 1.159164426815425e+06 -1.467924735059305e+06 6.887289251312463e+06 -7.097455405822836e+03 1.999852209587561e+03 1.616974759128220e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.400000000000000e+02 1.159022477695243e+06 -1.467884737542271e+06 6.887321589255651e+06 -7.097474775778343e+03 1.999904909520142e+03 1.616823762468402e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.410000000000000e+02 1.158880528188935e+06 -1.467844738971629e+06 6.887353924178652e+06 -7.097494142214114e+03 1.999957608032093e+03 1.616672767044051e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.420000000000000e+02 1.158738578296560e+06 -1.467804739347386e+06 6.887386256081457e+06 -7.097513505158323e+03 2.000010305264283e+03 1.616521772552243e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.430000000000000e+02 1.158596628018089e+06 -1.467764738669543e+06 6.887418584964072e+06 -7.097532865346341e+03 2.000063002797102e+03 1.616370773775023e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.440000000000000e+02 1.158454677353782e+06 -1.467724736938159e+06 6.887450910826435e+06 -7.097552222023381e+03 2.000115698851169e+03 1.616219776270953e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.450000000000000e+02 1.158312726303614e+06 -1.467684734153235e+06 6.887483233668560e+06 -7.097571575617834e+03 2.000168394356066e+03 1.616068776988434e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.460000000000000e+02 1.158170774867538e+06 -1.467644730314752e+06 6.887515553490454e+06 -7.097590925500447e+03 2.000221088503409e+03 1.615917779692239e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.470000000000000e+02 1.158028823045827e+06 -1.467604725422785e+06 6.887547870292054e+06 -7.097610272751500e+03 2.000273782481122e+03 1.615766778176672e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.480000000000000e+02 1.157886870838444e+06 -1.467564719477322e+06 6.887580184073372e+06 -7.097629616422962e+03 2.000326475378209e+03 1.615615777718227e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.490000000000000e+02 1.157744918245453e+06 -1.467524712478377e+06 6.887612494834391e+06 -7.097648956880861e+03 2.000379167284577e+03 1.615464776617495e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.500000000000000e+02 1.157602965266821e+06 -1.467484704425946e+06 6.887644802575125e+06 -7.097668294006262e+03 2.000431858780472e+03 1.615313774640314e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.510000000000000e+02 1.157461011902808e+06 -1.467444695320089e+06 6.887677107295510e+06 -7.097687627675974e+03 2.000484548633133e+03 1.615162773911048e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.520000000000000e+02 1.157319058153384e+06 -1.467404685160802e+06 6.887709408995554e+06 -7.097706958406638e+03 2.000537238114728e+03 1.615011770551724e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.530000000000000e+02 1.157177104018513e+06 -1.467364673948075e+06 6.887741707675268e+06 -7.097726286103179e+03 2.000589927444944e+03 1.614860764689616e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.540000000000000e+02 1.157035149498457e+06 -1.467324661681974e+06 6.887774003334590e+06 -7.097745610241520e+03 2.000642615406374e+03 1.614709760165144e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.550000000000000e+02 1.156893194593188e+06 -1.467284648362495e+06 6.887806295973533e+06 -7.097764931054754e+03 2.000695302359246e+03 1.614558755504483e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.560000000000000e+02 1.156751239302764e+06 -1.467244633989647e+06 6.887838585592078e+06 -7.097784248794545e+03 2.000747988509864e+03 1.614407749351552e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.570000000000000e+02 1.156609283627153e+06 -1.467204618563425e+06 6.887870872190235e+06 -7.097803563143969e+03 2.000800674198090e+03 1.614256742639661e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.580000000000000e+02 1.156467327566619e+06 -1.467164602083895e+06 6.887903155767947e+06 -7.097822874351173e+03 2.000853358810078e+03 1.614105735087032e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.590000000000000e+02 1.156325371121130e+06 -1.467124584551052e+06 6.887935436325220e+06 -7.097842182131494e+03 2.000906042525350e+03 1.613954727694738e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.600000000000000e+02 1.156183414290641e+06 -1.467084565964873e+06 6.887967713862065e+06 -7.097861486824410e+03 2.000958725511887e+03 1.613803718775414e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.610000000000000e+02 1.156041457075434e+06 -1.467044546325447e+06 6.887999988378420e+06 -7.097880788227025e+03 2.001011407928823e+03 1.613652709002143e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.620000000000000e+02 1.155899499475461e+06 -1.467004525632748e+06 6.888032259874293e+06 -7.097900086423234e+03 2.001064089236898e+03 1.613501698708324e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.630000000000000e+02 1.155757541490790e+06 -1.466964503886800e+06 6.888064528349672e+06 -7.097919381530962e+03 2.001116769883049e+03 1.613350686805377e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.640000000000000e+02 1.155615583121389e+06 -1.466924481087592e+06 6.888096793804567e+06 -7.097938673314033e+03 2.001169450094196e+03 1.613199674023115e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.650000000000000e+02 1.155473624367518e+06 -1.466884457235188e+06 6.888129056238916e+06 -7.097957961752099e+03 2.001222129035524e+03 1.613048661529013e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.660000000000000e+02 1.155331665229146e+06 -1.466844432329583e+06 6.888161315652727e+06 -7.097977246767222e+03 2.001274806940250e+03 1.612897649359624e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.670000000000000e+02 1.155189705706336e+06 -1.466804406370795e+06 6.888193572045989e+06 -7.097996528911309e+03 2.001327484363853e+03 1.612746634404511e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.680000000000000e+02 1.155047745799051e+06 -1.466764379358803e+06 6.888225825418706e+06 -7.098015807377094e+03 2.001380160811258e+03 1.612595620803049e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.690000000000000e+02 1.154905785507565e+06 -1.466724351293696e+06 6.888258075770823e+06 -7.098035082645968e+03 2.001432836377475e+03 1.612444606345781e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.700000000000000e+02 1.154763824831834e+06 -1.466684322175446e+06 6.888290323102347e+06 -7.098054355018588e+03 2.001485511313177e+03 1.612293589404697e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.710000000000000e+02 1.154621863771820e+06 -1.466644292004045e+06 6.888322567413287e+06 -7.098073623624239e+03 2.001538184995371e+03 1.612142574561198e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.720000000000000e+02 1.154479902327802e+06 -1.466604260779574e+06 6.888354808703584e+06 -7.098092889565255e+03 2.001590858855819e+03 1.611991555182743e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.730000000000000e+02 1.154337940499735e+06 -1.466564228502015e+06 6.888387046973242e+06 -7.098112152049214e+03 2.001643531078896e+03 1.611840537054728e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.740000000000000e+02 1.154195978287688e+06 -1.466524195171385e+06 6.888419282222252e+06 -7.098131411347105e+03 2.001696202930525e+03 1.611689517363896e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.750000000000000e+02 1.154054015691618e+06 -1.466484160787668e+06 6.888451514450624e+06 -7.098150667080283e+03 2.001748873563048e+03 1.611538498849809e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.760000000000000e+02 1.153912052711799e+06 -1.466444125350943e+06 6.888483743658295e+06 -7.098169919496677e+03 2.001801543193925e+03 1.611387480155827e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.770000000000000e+02 1.153770089348191e+06 -1.466404088861192e+06 6.888515969845271e+06 -7.098189169403227e+03 2.001854212761142e+03 1.611236456566412e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.780000000000000e+02 1.153628125600763e+06 -1.466364051318415e+06 6.888548193011566e+06 -7.098208415337289e+03 2.001906881147636e+03 1.611085435873772e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.790000000000000e+02 1.153486161469777e+06 -1.466324012722671e+06 6.888580413157120e+06 -7.098227658496669e+03 2.001959548666612e+03 1.610934412475030e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.800000000000000e+02 1.153344196955203e+06 -1.466283973073959e+06 6.888612630281937e+06 -7.098246898114313e+03 2.002012215472264e+03 1.610783389499210e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.810000000000000e+02 1.153202232057097e+06 -1.466243932372284e+06 6.888644844386009e+06 -7.098266134526841e+03 2.002064881452482e+03 1.610632365630604e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.820000000000000e+02 1.153060266775428e+06 -1.466203890617643e+06 6.888677055469342e+06 -7.098285367422382e+03 2.002117546039574e+03 1.610481342958453e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.830000000000000e+02 1.152918301110463e+06 -1.466163847810104e+06 6.888709263531875e+06 -7.098304597170632e+03 2.002170210106476e+03 1.610330318747346e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.840000000000000e+02 1.152776335062171e+06 -1.466123803949664e+06 6.888741468573619e+06 -7.098323824048268e+03 2.002222873687767e+03 1.610179291750894e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.850000000000000e+02 1.152634368630507e+06 -1.466083759036300e+06 6.888773670594580e+06 -7.098343047444816e+03 2.002275536310628e+03 1.610028265232075e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.860000000000000e+02 1.152492401815743e+06 -1.466043713070090e+06 6.888805869594701e+06 -7.098362267988367e+03 2.002328198872564e+03 1.609877235300422e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.870000000000000e+02 1.152350434617843e+06 -1.466003666051022e+06 6.888838065573991e+06 -7.098381484802942e+03 2.002380859527467e+03 1.609726208152501e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.880000000000000e+02 1.152208467036869e+06 -1.465963617979110e+06 6.888870258532435e+06 -7.098400698474421e+03 2.002433519712981e+03 1.609575179380900e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.890000000000000e+02 1.152066499072784e+06 -1.465923568854342e+06 6.888902448470039e+06 -7.098419908589471e+03 2.002486178719726e+03 1.609424151700571e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.900000000000000e+02 1.151924530725863e+06 -1.465883518676797e+06 6.888934635386746e+06 -7.098439115638200e+03 2.002538836931528e+03 1.609273122485116e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.910000000000000e+02 1.151782561996067e+06 -1.465843467446462e+06 6.888966819282565e+06 -7.098458319655712e+03 2.002591495008606e+03 1.609122090725613e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.920000000000000e+02 1.151640592883458e+06 -1.465803415163347e+06 6.888999000157482e+06 -7.098477520796010e+03 2.002644152394359e+03 1.608971056474159e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.930000000000000e+02 1.151498623387997e+06 -1.465763361827441e+06 6.889031178011506e+06 -7.098496718207307e+03 2.002696808383889e+03 1.608820024346148e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.940000000000000e+02 1.151356653509959e+06 -1.465723307438823e+06 6.889063352844576e+06 -7.098515911997051e+03 2.002749463549279e+03 1.608668993133390e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.950000000000000e+02 1.151214683249302e+06 -1.465683251997473e+06 6.889095524656703e+06 -7.098535103010653e+03 2.002802117625238e+03 1.608517959505814e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.960000000000000e+02 1.151072712605992e+06 -1.465643195503388e+06 6.889127693447893e+06 -7.098554290622275e+03 2.002854771495309e+03 1.608366925037128e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.970000000000000e+02 1.150930741580300e+06 -1.465603137956638e+06 6.889159859218087e+06 -7.098573475060336e+03 2.002907424220948e+03 1.608215889952047e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.980000000000000e+02 1.150788770172183e+06 -1.465563079357206e+06 6.889192021967294e+06 -7.098592656196160e+03 2.002960076250723e+03 1.608064854227981e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.990000000000000e+02 1.150646798381712e+06 -1.465523019705114e+06 6.889224181695500e+06 -7.098611834128731e+03 2.003012727288716e+03 1.607913817818589e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.000000000000000e+02 1.150504826208845e+06 -1.465482959000347e+06 6.889256338402716e+06 -7.098631008764046e+03 2.003065377775590e+03 1.607762780560665e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.010000000000000e+02 1.150362853653854e+06 -1.465442897242979e+06 6.889288492088879e+06 -7.098650180324877e+03 2.003118027458609e+03 1.607611741813409e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.020000000000000e+02 1.150220880716701e+06 -1.465402834432997e+06 6.889320642754000e+06 -7.098669348350033e+03 2.003170676029235e+03 1.607460703983143e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.030000000000000e+02 1.150078907397349e+06 -1.465362770570391e+06 6.889352790398086e+06 -7.098688513284057e+03 2.003223323813908e+03 1.607309664712715e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.040000000000000e+02 1.149936933696070e+06 -1.465322705655235e+06 6.889384935021076e+06 -7.098707674598457e+03 2.003275970545777e+03 1.607158626647639e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.050000000000000e+02 1.149794959612826e+06 -1.465282639687520e+06 6.889417076622985e+06 -7.098726833268335e+03 2.003328617353694e+03 1.607007584079786e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.060000000000000e+02 1.149652985147674e+06 -1.465242572667247e+06 6.889449215203795e+06 -7.098745988517927e+03 2.003381262512953e+03 1.606856542623837e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.070000000000000e+02 1.149511010300589e+06 -1.465202504594423e+06 6.889481350763513e+06 -7.098765140077104e+03 2.003433906927109e+03 1.606705502282138e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.080000000000000e+02 1.149369035071832e+06 -1.465162435469109e+06 6.889513483302080e+06 -7.098784289142095e+03 2.003486551348108e+03 1.606554456872071e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.090000000000000e+02 1.149227059461368e+06 -1.465122365291298e+06 6.889545612819510e+06 -7.098803434468175e+03 2.003539194023572e+03 1.606403414087102e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.100000000000000e+02 1.149085083469162e+06 -1.465082294060977e+06 6.889577739315802e+06 -7.098822576586557e+03 2.003591836292681e+03 1.606252369875542e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.110000000000000e+02 1.148943107095477e+06 -1.465042221778214e+06 6.889609862790904e+06 -7.098841715441738e+03 2.003644477589075e+03 1.606101325214901e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.120000000000000e+02 1.148801130340285e+06 -1.465002148443006e+06 6.889641983244827e+06 -7.098860851143153e+03 2.003697118127908e+03 1.605950279349116e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.130000000000000e+02 1.148659153203647e+06 -1.464962074055368e+06 6.889674100677550e+06 -7.098879983698770e+03 2.003749757915422e+03 1.605799232235229e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.140000000000000e+02 1.148517175685525e+06 -1.464921998615283e+06 6.889706215089086e+06 -7.098899112529238e+03 2.003802396553507e+03 1.605648186913570e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.150000000000000e+02 1.148375197786189e+06 -1.464881922122828e+06 6.889738326479372e+06 -7.098918238449295e+03 2.003855034595898e+03 1.605497139116591e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.160000000000000e+02 1.148233219505605e+06 -1.464841844577993e+06 6.889770434848418e+06 -7.098937361033806e+03 2.003907671945477e+03 1.605346090821765e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.170000000000000e+02 1.148091240843829e+06 -1.464801765980785e+06 6.889802540196214e+06 -7.098956480354129e+03 2.003960308103736e+03 1.605195042366633e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.180000000000000e+02 1.147949261800827e+06 -1.464761686331195e+06 6.889834642522763e+06 -7.098975596956177e+03 2.004012944171911e+03 1.605043989940783e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.190000000000000e+02 1.147807282376878e+06 -1.464721605629306e+06 6.889866741828009e+06 -7.098994709825454e+03 2.004065579081725e+03 1.604892939352842e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.200000000000000e+02 1.147665302571938e+06 -1.464681523875101e+06 6.889898838111960e+06 -7.099013819183754e+03 2.004118212615318e+03 1.604741889920653e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.210000000000000e+02 1.147523322385966e+06 -1.464641441068562e+06 6.889930931374624e+06 -7.099032925561261e+03 2.004170845953923e+03 1.604590837797399e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.220000000000000e+02 1.147381341819235e+06 -1.464601357209765e+06 6.889963021615941e+06 -7.099052028973232e+03 2.004223478605275e+03 1.604439783556573e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.230000000000000e+02 1.147239360871707e+06 -1.464561272298699e+06 6.889995108835923e+06 -7.099071128713154e+03 2.004276109949348e+03 1.604288731084049e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.240000000000000e+02 1.147097379543450e+06 -1.464521186335382e+06 6.890027193034556e+06 -7.099090225476718e+03 2.004328740417157e+03 1.604137676787086e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.250000000000000e+02 1.146955397834425e+06 -1.464481099319804e+06 6.890059274211841e+06 -7.099109318741850e+03 2.004381370614972e+03 1.603986622152052e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.260000000000000e+02 1.146813415744898e+06 -1.464441011252029e+06 6.890091352367725e+06 -7.099128408797130e+03 2.004433999267814e+03 1.603835567580773e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.270000000000000e+02 1.146671433274843e+06 -1.464400922132062e+06 6.890123427502217e+06 -7.099147495664527e+03 2.004486627644356e+03 1.603684511325830e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.280000000000000e+02 1.146529450424206e+06 -1.464360831959868e+06 6.890155499615325e+06 -7.099166579282492e+03 2.004539255134011e+03 1.603533454450422e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.290000000000000e+02 1.146387467193265e+06 -1.464320740735531e+06 6.890187568706987e+06 -7.099185659863365e+03 2.004591881768901e+03 1.603382395986694e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.300000000000000e+02 1.146245483581988e+06 -1.464280648459048e+06 6.890219634777215e+06 -7.099204737258237e+03 2.004644507962105e+03 1.603231336045848e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.310000000000000e+02 1.146103499590433e+06 -1.464240555130425e+06 6.890251697825993e+06 -7.099223810883291e+03 2.004697132569820e+03 1.603080278664139e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.320000000000000e+02 1.145961515218568e+06 -1.464200460749656e+06 6.890283757853332e+06 -7.099242881663846e+03 2.004749756889744e+03 1.602929218115360e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.330000000000000e+02 1.145819530466655e+06 -1.464160365316806e+06 6.890315814859171e+06 -7.099261949027259e+03 2.004802380284159e+03 1.602778157728024e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.340000000000000e+02 1.145677545334663e+06 -1.464120268831870e+06 6.890347868843516e+06 -7.099281013163795e+03 2.004855002787574e+03 1.602627096627207e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.350000000000000e+02 1.145535559822552e+06 -1.464080171294832e+06 6.890379919806382e+06 -7.099300073902265e+03 2.004907624245104e+03 1.602476035761792e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.360000000000000e+02 1.145393573930592e+06 -1.464040072705767e+06 6.890411967747704e+06 -7.099319131555254e+03 2.004960245119147e+03 1.602324973165250e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.370000000000000e+02 1.145251587658748e+06 -1.463999973064664e+06 6.890444012667493e+06 -7.099338186011320e+03 2.005012865519852e+03 1.602173909180030e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.380000000000000e+02 1.145109601007080e+06 -1.463959872371537e+06 6.890476054565737e+06 -7.099357237091283e+03 2.005065484333407e+03 1.602022846040109e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.390000000000000e+02 1.144967613975554e+06 -1.463919770626373e+06 6.890508093442438e+06 -7.099376284898285e+03 2.005118102900885e+03 1.601871781547190e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.400000000000000e+02 1.144825626564442e+06 -1.463879667829251e+06 6.890540129297545e+06 -7.099395329728716e+03 2.005170720526983e+03 1.601720715313725e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.410000000000000e+02 1.144683638773708e+06 -1.463839563980161e+06 6.890572162131062e+06 -7.099414370921762e+03 2.005223337283334e+03 1.601569650131254e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.420000000000000e+02 1.144541650603408e+06 -1.463799459079106e+06 6.890604191942974e+06 -7.099433409072532e+03 2.005275953167420e+03 1.601418583404951e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.430000000000000e+02 1.144399662053508e+06 -1.463759353126080e+06 6.890636218733293e+06 -7.099452443947282e+03 2.005328568243430e+03 1.601267516071626e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.440000000000000e+02 1.144257673124286e+06 -1.463719246121168e+06 6.890668242501957e+06 -7.099471475679583e+03 2.005381182905118e+03 1.601116447034240e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.450000000000000e+02 1.144115683815697e+06 -1.463679138064343e+06 6.890700263248978e+06 -7.099490504298436e+03 2.005433796367965e+03 1.600965377189400e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.460000000000000e+02 1.143973694127702e+06 -1.463639028955598e+06 6.890732280974360e+06 -7.099509529034864e+03 2.005486408868953e+03 1.600814309586954e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.470000000000000e+02 1.143831704060573e+06 -1.463598918795003e+06 6.890764295678047e+06 -7.099528550742065e+03 2.005539020521810e+03 1.600663240352001e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.480000000000000e+02 1.143689713614275e+06 -1.463558807582552e+06 6.890796307360050e+06 -7.099547569421551e+03 2.005591631417196e+03 1.600512169359321e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.490000000000000e+02 1.143547722788873e+06 -1.463518695318261e+06 6.890828316020349e+06 -7.099566584784940e+03 2.005644241782802e+03 1.600361097571505e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.500000000000000e+02 1.143405731584324e+06 -1.463478582002110e+06 6.890860321658956e+06 -7.099585597145793e+03 2.005696851536106e+03 1.600210023725950e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.510000000000000e+02 1.143263740000907e+06 -1.463438467634185e+06 6.890892324275815e+06 -7.099604606071755e+03 2.005749460037398e+03 1.600058950547067e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.520000000000000e+02 1.143121748038577e+06 -1.463398352214464e+06 6.890924323870927e+06 -7.099623611724539e+03 2.005802067753387e+03 1.599907876719032e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.530000000000000e+02 1.142979755697301e+06 -1.463358235742940e+06 6.890956320444304e+06 -7.099642613751386e+03 2.005854674343997e+03 1.599756804227959e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.540000000000000e+02 1.142837762977347e+06 -1.463318118219685e+06 6.890988313995889e+06 -7.099661613133994e+03 2.005907280962904e+03 1.599605727275995e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.550000000000000e+02 1.142695769878675e+06 -1.463277999644682e+06 6.891020304525692e+06 -7.099680609023984e+03 2.005959886216708e+03 1.599454651391324e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.560000000000000e+02 1.142553776401353e+06 -1.463237880017952e+06 6.891052292033692e+06 -7.099699601338581e+03 2.006012490257785e+03 1.599303576737343e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.570000000000000e+02 1.142411782545344e+06 -1.463197759339485e+06 6.891084276519906e+06 -7.099718590723222e+03 2.006065093881748e+03 1.599152499452681e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.580000000000000e+02 1.142269788310920e+06 -1.463157637609355e+06 6.891116257984268e+06 -7.099737576940264e+03 2.006117696942608e+03 1.599001420766821e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.590000000000000e+02 1.142127793698037e+06 -1.463117514827542e+06 6.891148236426791e+06 -7.099756559703036e+03 2.006170298746391e+03 1.598850342840266e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.600000000000000e+02 1.141985798706664e+06 -1.463077390994042e+06 6.891180211847481e+06 -7.099775539296123e+03 2.006222899961638e+03 1.598699263554897e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.610000000000000e+02 1.141843803337067e+06 -1.463037266108925e+06 6.891212184246279e+06 -7.099794515790028e+03 2.006275500599470e+03 1.598548182587497e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.620000000000000e+02 1.141701807589208e+06 -1.462997140172177e+06 6.891244153623195e+06 -7.099813488890278e+03 2.006328100146662e+03 1.598397101897076e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.630000000000000e+02 1.141559811463157e+06 -1.462957013183818e+06 6.891276119978215e+06 -7.099832458796753e+03 2.006380698797724e+03 1.598246020355042e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.640000000000000e+02 1.141417814958870e+06 -1.462916885143832e+06 6.891308083311345e+06 -7.099851425201353e+03 2.006433296554803e+03 1.598094939306738e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.650000000000000e+02 1.141275818076623e+06 -1.462876756052298e+06 6.891340043622532e+06 -7.099870388611424e+03 2.006485893548352e+03 1.597943856361623e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.660000000000000e+02 1.141133820816379e+06 -1.462836625909206e+06 6.891372000911778e+06 -7.099889348675545e+03 2.006538490005110e+03 1.597792772760873e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.670000000000000e+02 1.140991823178194e+06 -1.462796494714558e+06 6.891403955179070e+06 -7.099908305678334e+03 2.006591085580417e+03 1.597641687709484e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.680000000000000e+02 1.140849825162038e+06 -1.462756362468355e+06 6.891435906424424e+06 -7.099927259423413e+03 2.006643680355144e+03 1.597490601961099e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.690000000000000e+02 1.140707826768181e+06 -1.462716229170667e+06 6.891467854647771e+06 -7.099946209489541e+03 2.006696273816853e+03 1.597339518030413e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.700000000000000e+02 1.140565827996585e+06 -1.462676094821484e+06 6.891499799849126e+06 -7.099965156752948e+03 2.006748867016219e+03 1.597188430706792e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.710000000000000e+02 1.140423828847209e+06 -1.462635959420787e+06 6.891531742028492e+06 -7.099984100721947e+03 2.006801459397669e+03 1.597037342869535e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.720000000000000e+02 1.140281829320324e+06 -1.462595822968653e+06 6.891563681185816e+06 -7.100003041178861e+03 2.006854050473438e+03 1.596886256110351e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.730000000000000e+02 1.140139829415899e+06 -1.462555685465077e+06 6.891595617321106e+06 -7.100021978201906e+03 2.006906640737669e+03 1.596735169440428e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.740000000000000e+02 1.139997829133991e+06 -1.462515546910065e+06 6.891627550434344e+06 -7.100040912355508e+03 2.006959230337423e+03 1.596584080195164e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.750000000000000e+02 1.139855828474567e+06 -1.462475407303611e+06 6.891659480525540e+06 -7.100059843161285e+03 2.007011819310520e+03 1.596432990420095e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.760000000000000e+02 1.139713827437896e+06 -1.462435266645787e+06 6.891691407594638e+06 -7.100078771047328e+03 2.007064407800448e+03 1.596281898051895e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.770000000000000e+02 1.139571826023939e+06 -1.462395124936579e+06 6.891723331641642e+06 -7.100097695443269e+03 2.007116994792560e+03 1.596130806917761e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.780000000000000e+02 1.139429824232659e+06 -1.462354982175976e+06 6.891755252666566e+06 -7.100116616613040e+03 2.007169581711631e+03 1.595979713995758e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.790000000000000e+02 1.139287822064329e+06 -1.462314838364054e+06 6.891787170669345e+06 -7.100135534627289e+03 2.007222167460701e+03 1.595828620412761e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.800000000000000e+02 1.139145819518908e+06 -1.462274693500798e+06 6.891819085649990e+06 -7.100154449079601e+03 2.007274751863600e+03 1.595677528180806e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.810000000000000e+02 1.139003816596466e+06 -1.462234547586228e+06 6.891850997608489e+06 -7.100173360158291e+03 2.007327335465034e+03 1.595526435761476e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.820000000000000e+02 1.138861813296959e+06 -1.462194400620328e+06 6.891882906544847e+06 -7.100192268168872e+03 2.007379918740871e+03 1.595375341192112e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.830000000000000e+02 1.138719809620658e+06 -1.462154252603169e+06 6.891914812459012e+06 -7.100211173019997e+03 2.007432501111800e+03 1.595224245631879e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.840000000000000e+02 1.138577805567528e+06 -1.462114103534744e+06 6.891946715350986e+06 -7.100230074929883e+03 2.007485082904127e+03 1.595073147696286e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.850000000000000e+02 1.138435801137532e+06 -1.462073953415041e+06 6.891978615220780e+06 -7.100248973260220e+03 2.007537663561638e+03 1.594922050912807e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.860000000000000e+02 1.138293796330942e+06 -1.462033802244134e+06 6.892010512068331e+06 -7.100267868312095e+03 2.007590243542956e+03 1.594770953360433e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.870000000000000e+02 1.138151791147714e+06 -1.461993650022006e+06 6.892042405893653e+06 -7.100286760149897e+03 2.007642822529077e+03 1.594619855174948e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.880000000000000e+02 1.138009785587916e+06 -1.461953496748676e+06 6.892074296696731e+06 -7.100305648776579e+03 2.007695400574465e+03 1.594468756272037e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.890000000000000e+02 1.137867779651515e+06 -1.461913342424137e+06 6.892106184477570e+06 -7.100324534056865e+03 2.007747978146617e+03 1.594317656632043e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.900000000000000e+02 1.137725773338771e+06 -1.461873187048451e+06 6.892138069236117e+06 -7.100343416127969e+03 2.007800554740400e+03 1.594166556315440e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.910000000000000e+02 1.137583766649656e+06 -1.461833030621614e+06 6.892169950972375e+06 -7.100362294813029e+03 2.007853130316348e+03 1.594015456150010e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.920000000000000e+02 1.137441759584232e+06 -1.461792873143643e+06 6.892201829686333e+06 -7.100381170268482e+03 2.007905704911781e+03 1.593864355400612e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.930000000000000e+02 1.137299752142460e+06 -1.461752714614523e+06 6.892233705378002e+06 -7.100400042605576e+03 2.007958278983657e+03 1.593713252979572e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.940000000000000e+02 1.137157744324616e+06 -1.461712555034334e+06 6.892265578047317e+06 -7.100418911771035e+03 2.008010852627478e+03 1.593562148995106e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.950000000000000e+02 1.137015736130657e+06 -1.461672394403057e+06 6.892297447694292e+06 -7.100437777620492e+03 2.008063425075737e+03 1.593411045087747e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.960000000000000e+02 1.136873727560540e+06 -1.461632232720675e+06 6.892329314318933e+06 -7.100456640469051e+03 2.008115997090149e+03 1.593259938874868e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.970000000000000e+02 1.136731718614546e+06 -1.461592069987271e+06 6.892361177921182e+06 -7.100475499531040e+03 2.008168567485438e+03 1.593108835360899e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.980000000000000e+02 1.136589709292632e+06 -1.461551906202831e+06 6.892393038501042e+06 -7.100494355422059e+03 2.008221137355678e+03 1.592957730407868e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.990000000000000e+02 1.136447699594863e+06 -1.461511741367369e+06 6.892424896058506e+06 -7.100513208407904e+03 2.008273706632145e+03 1.592806622938667e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.000000000000000e+03 1.136305689521205e+06 -1.461471575480877e+06 6.892456750593584e+06 -7.100532057995404e+03 2.008326274990788e+03 1.592655515543927e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.001000000000000e+03 1.136163679071925e+06 -1.461431408543424e+06 6.892488602106210e+06 -7.100550904388015e+03 2.008378842831984e+03 1.592504406804575e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.002000000000000e+03 1.136021668246985e+06 -1.461391240554999e+06 6.892520450596400e+06 -7.100569747534208e+03 2.008431409427858e+03 1.592353297902687e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.003000000000000e+03 1.135879657046350e+06 -1.461351071515593e+06 6.892552296064156e+06 -7.100588587128133e+03 2.008483975281376e+03 1.592202189521267e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.004000000000000e+03 1.135737645470286e+06 -1.461310901425273e+06 6.892584138509423e+06 -7.100607423531319e+03 2.008536540195745e+03 1.592051080330981e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.005000000000000e+03 1.135595633518758e+06 -1.461270730284030e+06 6.892615977932209e+06 -7.100626257149865e+03 2.008589104753957e+03 1.591899967781659e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.006000000000000e+03 1.135453621191834e+06 -1.461230558091886e+06 6.892647814332501e+06 -7.100645087109127e+03 2.008641667881551e+03 1.591748857127395e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.007000000000000e+03 1.135311608489470e+06 -1.461190384848819e+06 6.892679647710304e+06 -7.100663913865585e+03 2.008694230673049e+03 1.591597744924787e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.008000000000000e+03 1.135169595411941e+06 -1.461150210554910e+06 6.892711478065562e+06 -7.100682737574509e+03 2.008746792537791e+03 1.591446631267364e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.009000000000000e+03 1.135027581959210e+06 -1.461110035210147e+06 6.892743305398284e+06 -7.100701557908949e+03 2.008799353508133e+03 1.591295517549446e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.010000000000000e+03 1.134885568131234e+06 -1.461069858814512e+06 6.892775129708478e+06 -7.100720374922164e+03 2.008851913739306e+03 1.591144403333059e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.011000000000000e+03 1.134743553928292e+06 -1.461029681368086e+06 6.892806950996086e+06 -7.100739188764755e+03 2.008904472939134e+03 1.590993288340312e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.012000000000000e+03 1.134601539350342e+06 -1.460989502870855e+06 6.892838769261112e+06 -7.100757999150469e+03 2.008957031301325e+03 1.590842173575043e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.013000000000000e+03 1.134459524397444e+06 -1.460949323322828e+06 6.892870584503546e+06 -7.100776806450359e+03 2.009009588945609e+03 1.590691057248535e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.014000000000000e+03 1.134317509069565e+06 -1.460909142723999e+06 6.892902396723399e+06 -7.100795610503377e+03 2.009062145849483e+03 1.590539940098333e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.015000000000000e+03 1.134175493366978e+06 -1.460868961074444e+06 6.892934205920607e+06 -7.100814411440014e+03 2.009114702063166e+03 1.590388821484436e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.016000000000000e+03 1.134033477289640e+06 -1.460828778374147e+06 6.892966012095181e+06 -7.100833208679419e+03 2.009167256929418e+03 1.590237704825935e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.017000000000000e+03 1.133891460837621e+06 -1.460788594623125e+06 6.892997815247107e+06 -7.100852003035792e+03 2.009219811132816e+03 1.590086585641598e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.018000000000000e+03 1.133749444010883e+06 -1.460748409821372e+06 6.893029615376393e+06 -7.100870794283987e+03 2.009272365345607e+03 1.589935464036810e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.019000000000000e+03 1.133607426809686e+06 -1.460708223968942e+06 6.893061412482983e+06 -7.100889582059684e+03 2.009324918169240e+03 1.589784343454175e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.020000000000000e+03 1.133465409234002e+06 -1.460668037065841e+06 6.893093206566883e+06 -7.100908366399602e+03 2.009377469336664e+03 1.589633224084159e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.021000000000000e+03 1.133323391283800e+06 -1.460627849112061e+06 6.893124997628103e+06 -7.100927147621007e+03 2.009430020670297e+03 1.589482102132604e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.022000000000000e+03 1.133181372959334e+06 -1.460587660107659e+06 6.893156785666581e+06 -7.100945925699956e+03 2.009482570856309e+03 1.589330979433701e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.023000000000000e+03 1.133039354260580e+06 -1.460547470052637e+06 6.893188570682328e+06 -7.100964700744308e+03 2.009535120830958e+03 1.589179854280160e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.024000000000000e+03 1.132897335187595e+06 -1.460507278947000e+06 6.893220352675329e+06 -7.100983472335306e+03 2.009587669296616e+03 1.589028730223203e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.025000000000000e+03 1.132755315740347e+06 -1.460467086790748e+06 6.893252131645594e+06 -7.101002240260865e+03 2.009640216855684e+03 1.588877607403779e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.026000000000000e+03 1.132613295919101e+06 -1.460426893583943e+06 6.893283907593064e+06 -7.101021005299479e+03 2.009692763888120e+03 1.588726481894678e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.027000000000000e+03 1.132471275723824e+06 -1.460386699326581e+06 6.893315680517747e+06 -7.101039767148240e+03 2.009745309788239e+03 1.588575355826782e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.028000000000000e+03 1.132329255154475e+06 -1.460346504018645e+06 6.893347450419651e+06 -7.101058525581951e+03 2.009797855449496e+03 1.588424229014865e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.029000000000000e+03 1.132187234211324e+06 -1.460306307660209e+06 6.893379217298721e+06 -7.101077280886276e+03 2.009850399860703e+03 1.588273101532984e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.030000000000000e+03 1.132045212894337e+06 -1.460266110251264e+06 6.893410981154962e+06 -7.101096032947766e+03 2.009902943518417e+03 1.588121973226613e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.031000000000000e+03 1.131903191203579e+06 -1.460225911791829e+06 6.893442741988357e+06 -7.101114781870404e+03 2.009955486614575e+03 1.587970843384750e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.032000000000000e+03 1.131761169139008e+06 -1.460185712281883e+06 6.893474499798921e+06 -7.101133527331362e+03 2.010008028698488e+03 1.587819714023205e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.033000000000000e+03 1.131619146700894e+06 -1.460145511721501e+06 6.893506254586595e+06 -7.101152269645473e+03 2.010060569931012e+03 1.587668583543274e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.034000000000000e+03 1.131477123889204e+06 -1.460105310110677e+06 6.893538006351383e+06 -7.101171008819052e+03 2.010113110449133e+03 1.587517451736467e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.035000000000000e+03 1.131335100703901e+06 -1.460065107449399e+06 6.893569755093296e+06 -7.101189744292479e+03 2.010165649694076e+03 1.587366321805176e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.036000000000000e+03 1.131193077145251e+06 -1.460024903737736e+06 6.893601500812273e+06 -7.101208476955710e+03 2.010218188652188e+03 1.587215188527752e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.037000000000000e+03 1.131051053213218e+06 -1.459984698975677e+06 6.893633243508327e+06 -7.101227206356801e+03 2.010270726787919e+03 1.587064054601430e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.038000000000000e+03 1.130909028907869e+06 -1.459944493163241e+06 6.893664983181442e+06 -7.101245932376724e+03 2.010323263954487e+03 1.586912920744452e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.039000000000000e+03 1.130767004229162e+06 -1.459904286300411e+06 6.893696719831626e+06 -7.101264654981634e+03 2.010375800064214e+03 1.586761787221896e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.040000000000000e+03 1.130624979177370e+06 -1.459864078387263e+06 6.893728453458820e+06 -7.101283374660466e+03 2.010428335698548e+03 1.586610651111551e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.041000000000000e+03 1.130482953752457e+06 -1.459823869423788e+06 6.893760184063032e+06 -7.101302090775534e+03 2.010480870186587e+03 1.586459516109543e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.042000000000000e+03 1.130340927954486e+06 -1.459783659410000e+06 6.893791911644251e+06 -7.101320803923919e+03 2.010533404131305e+03 1.586308378787973e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.043000000000000e+03 1.130198901783420e+06 -1.459743448345886e+06 6.893823636202485e+06 -7.101339513514380e+03 2.010585937006987e+03 1.586157242447462e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.044000000000000e+03 1.130056875239529e+06 -1.459703236231520e+06 6.893855357737673e+06 -7.101358220058010e+03 2.010638469044901e+03 1.586006104529140e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.045000000000000e+03 1.129914848322777e+06 -1.459663023066894e+06 6.893887076249825e+06 -7.101376923446697e+03 2.010691000756693e+03 1.585854964834337e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.046000000000000e+03 1.129772821033121e+06 -1.459622808851986e+06 6.893918791738949e+06 -7.101395623270950e+03 2.010743531072824e+03 1.585703826580859e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.047000000000000e+03 1.129630793370842e+06 -1.459582593586884e+06 6.893950504204988e+06 -7.101414319738366e+03 2.010796060536132e+03 1.585552688136894e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.048000000000000e+03 1.129488765335889e+06 -1.459542377271559e+06 6.893982213647947e+06 -7.101433013241435e+03 2.010848589290980e+03 1.585401547580261e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.049000000000000e+03 1.129346736928333e+06 -1.459502159906037e+06 6.894013920067817e+06 -7.101451703822535e+03 2.010901117619474e+03 1.585250404351030e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.050000000000000e+03 1.129204708148140e+06 -1.459461941490310e+06 6.894045623464603e+06 -7.101470390658784e+03 2.010953644778552e+03 1.585099263061274e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.051000000000000e+03 1.129062678995581e+06 -1.459421722024449e+06 6.894077323838246e+06 -7.101489074363328e+03 2.011006171258248e+03 1.584948120358471e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.052000000000000e+03 1.128920649470611e+06 -1.459381501508436e+06 6.894109021188759e+06 -7.101507754901889e+03 2.011058696785075e+03 1.584796976754975e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.053000000000000e+03 1.128778619573194e+06 -1.459341279942259e+06 6.894140715516144e+06 -7.101526432427315e+03 2.011111221968457e+03 1.584645830770907e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.054000000000000e+03 1.128636589303608e+06 -1.459301057326002e+06 6.894172406820348e+06 -7.101545106397140e+03 2.011163745918982e+03 1.584494685975683e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.055000000000000e+03 1.128494558661807e+06 -1.459260833659643e+06 6.894204095101377e+06 -7.101563776815649e+03 2.011216268781492e+03 1.584343542159592e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.056000000000000e+03 1.128352527647857e+06 -1.459220608943200e+06 6.894235780359219e+06 -7.101582444666782e+03 2.011268791223148e+03 1.584192394096770e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.057000000000000e+03 1.128210496261727e+06 -1.459180383176667e+06 6.894267462593880e+06 -7.101601108585095e+03 2.011321312462030e+03 1.584041248849454e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.058000000000000e+03 1.128068464503678e+06 -1.459140156360108e+06 6.894299141805302e+06 -7.101619769824072e+03 2.011373833550939e+03 1.583890099491094e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.059000000000000e+03 1.127926432373678e+06 -1.459099928493517e+06 6.894330817993496e+06 -7.101638427762578e+03 2.011426353366736e+03 1.583738950248916e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.060000000000000e+03 1.127784399871690e+06 -1.459059699576884e+06 6.894362491158470e+06 -7.101657081909233e+03 2.011478872249120e+03 1.583587802844605e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.061000000000000e+03 1.127642366997980e+06 -1.459019469610276e+06 6.894394161300160e+06 -7.101675733137729e+03 2.011531390377457e+03 1.583436653182004e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.062000000000000e+03 1.127500333752517e+06 -1.458979238593687e+06 6.894425828418579e+06 -7.101694381030141e+03 2.011583907433577e+03 1.583285503527889e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.063000000000000e+03 1.127358300135361e+06 -1.458939006527132e+06 6.894457492513712e+06 -7.101713025839405e+03 2.011636424259501e+03 1.583134351651189e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.064000000000000e+03 1.127216266146474e+06 -1.458898773410595e+06 6.894489153585573e+06 -7.101731667176922e+03 2.011688939823099e+03 1.582983200633882e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.065000000000000e+03 1.127074231786129e+06 -1.458858539244154e+06 6.894520811634094e+06 -7.101750305849074e+03 2.011741455192938e+03 1.582832045499074e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.066000000000000e+03 1.126932197054290e+06 -1.458818304027798e+06 6.894552466659292e+06 -7.101768940803469e+03 2.011793969314233e+03 1.582680892292738e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.067000000000000e+03 1.126790161951016e+06 -1.458778067761538e+06 6.894584118661149e+06 -7.101787572264482e+03 2.011846482080991e+03 1.582529740164105e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.068000000000000e+03 1.126648126476274e+06 -1.458737830445366e+06 6.894615767639674e+06 -7.101806200558620e+03 2.011898994429065e+03 1.582378586431843e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.069000000000000e+03 1.126506090630334e+06 -1.458697592079354e+06 6.894647413594807e+06 -7.101824825945920e+03 2.011951506144946e+03 1.582227430228513e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.070000000000000e+03 1.126364054413157e+06 -1.458657352663492e+06 6.894679056526560e+06 -7.101843448052743e+03 2.012004017123092e+03 1.582076273345438e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.071000000000000e+03 1.126222017824702e+06 -1.458617112197762e+06 6.894710696434939e+06 -7.101862066609813e+03 2.012056526978090e+03 1.581925117483584e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.072000000000000e+03 1.126079980865246e+06 -1.458576870682242e+06 6.894742333319885e+06 -7.101880682029085e+03 2.012109036138476e+03 1.581773960254222e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.073000000000000e+03 1.125937943534747e+06 -1.458536628116921e+06 6.894773967181410e+06 -7.101899294115295e+03 2.012161544186227e+03 1.581622803074296e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.074000000000000e+03 1.125795905833273e+06 -1.458496384501816e+06 6.894805598019497e+06 -7.101917903283126e+03 2.012214051729668e+03 1.581471643304120e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.075000000000000e+03 1.125653867760787e+06 -1.458456139836913e+06 6.894837225834155e+06 -7.101936508979833e+03 2.012266558353055e+03 1.581320483939013e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.076000000000000e+03 1.125511829317558e+06 -1.458415894122290e+06 6.894868850625325e+06 -7.101955111392564e+03 2.012319064405797e+03 1.581169323688500e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.077000000000000e+03 1.125369790503546e+06 -1.458375647357927e+06 6.894900472393017e+06 -7.101973710592034e+03 2.012371569362928e+03 1.581018162935030e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.078000000000000e+03 1.125227751318713e+06 -1.458335399543812e+06 6.894932091137241e+06 -7.101992306698857e+03 2.012424073709695e+03 1.580867000502045e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.079000000000000e+03 1.125085711763335e+06 -1.458295150680029e+06 6.894963706857934e+06 -7.102010899414616e+03 2.012476576959998e+03 1.580715838354021e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.080000000000000e+03 1.124943671837371e+06 -1.458254900766559e+06 6.894995319555109e+06 -7.102029488823980e+03 2.012529079675055e+03 1.580564675372798e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.081000000000000e+03 1.124801631540882e+06 -1.458214649803414e+06 6.895026929228750e+06 -7.102048074920664e+03 2.012581581059785e+03 1.580413512639883e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.082000000000000e+03 1.124659590873835e+06 -1.458174397790587e+06 6.895058535878866e+06 -7.102066657823295e+03 2.012634082073901e+03 1.580262348358313e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.083000000000000e+03 1.124517549836503e+06 -1.458134144728155e+06 6.895090139505398e+06 -7.102085237691237e+03 2.012686582241124e+03 1.580111182453666e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.084000000000000e+03 1.124375508428842e+06 -1.458093890616100e+06 6.895121740108355e+06 -7.102103813871804e+03 2.012739080946141e+03 1.579960018631387e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.085000000000000e+03 1.124233466650822e+06 -1.458053635454417e+06 6.895153337687746e+06 -7.102122386998908e+03 2.012791579673945e+03 1.579808852116196e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.086000000000000e+03 1.124091424502700e+06 -1.458013379243165e+06 6.895184932243510e+06 -7.102140957239935e+03 2.012844077579219e+03 1.579657683287110e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.087000000000000e+03 1.123949381984453e+06 -1.457973121982348e+06 6.895216523775658e+06 -7.102159523645812e+03 2.012896573901374e+03 1.579506517355964e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.088000000000000e+03 1.123807339096141e+06 -1.457932863671978e+06 6.895248112284176e+06 -7.102178087102748e+03 2.012949069714138e+03 1.579355348974136e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.089000000000000e+03 1.123665295837726e+06 -1.457892604312041e+06 6.895279697769075e+06 -7.102196647280271e+03 2.013001564941922e+03 1.579204179705339e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.090000000000000e+03 1.123523252209478e+06 -1.457852343902612e+06 6.895311280230288e+06 -7.102215204032696e+03 2.013054059081173e+03 1.579053010863036e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.091000000000000e+03 1.123381208211357e+06 -1.457812082443674e+06 6.895342859667836e+06 -7.102233757894550e+03 2.013106552661435e+03 1.578901839376508e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.092000000000000e+03 1.123239163843434e+06 -1.457771819935251e+06 6.895374436081694e+06 -7.102252308571397e+03 2.013159045811316e+03 1.578750666379221e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.093000000000000e+03 1.123097119105660e+06 -1.457731556377320e+06 6.895406009471879e+06 -7.102270855963686e+03 2.013211537672254e+03 1.578599493451550e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.094000000000000e+03 1.122955073998319e+06 -1.457691291769969e+06 6.895437579838323e+06 -7.102289399561455e+03 2.013264028235657e+03 1.578448322865458e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.095000000000000e+03 1.122813028521370e+06 -1.457651026113180e+06 6.895469147181045e+06 -7.102307940059095e+03 2.013316518397145e+03 1.578297150354904e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.096000000000000e+03 1.122670982674771e+06 -1.457610759406938e+06 6.895500711500049e+06 -7.102326477645884e+03 2.013369007965417e+03 1.578145975334418e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.097000000000000e+03 1.122528936458788e+06 -1.457570491651311e+06 6.895532272795273e+06 -7.102345011819911e+03 2.013421496251814e+03 1.577994800943062e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.098000000000000e+03 1.122386889873399e+06 -1.457530222846306e+06 6.895563831066733e+06 -7.102363542741426e+03 2.013473984154048e+03 1.577843625278600e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.099000000000000e+03 1.122244842918653e+06 -1.457489952991919e+06 6.895595386314406e+06 -7.102382070377029e+03 2.013526471051654e+03 1.577692449312993e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.100000000000000e+03 1.122102795594519e+06 -1.457449682088148e+06 6.895626938538311e+06 -7.102400594825230e+03 2.013578956869680e+03 1.577541272709024e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.101000000000000e+03 1.121960747901273e+06 -1.457409410135073e+06 6.895658487738383e+06 -7.102419115979699e+03 2.013631442269764e+03 1.577390095059421e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.102000000000000e+03 1.121818699838867e+06 -1.457369137132667e+06 6.895690033914629e+06 -7.102437633881721e+03 2.013683926627820e+03 1.577238917010048e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.103000000000000e+03 1.121676651407271e+06 -1.457328863080928e+06 6.895721577067064e+06 -7.102456148541402e+03 2.013736410132816e+03 1.577087738265085e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.104000000000000e+03 1.121534602606750e+06 -1.457288587979925e+06 6.895753117195626e+06 -7.102474659929115e+03 2.013788892998182e+03 1.576936558672363e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.105000000000000e+03 1.121392553437270e+06 -1.457248311829651e+06 6.895784654300321e+06 -7.102493167979143e+03 2.013841374608323e+03 1.576785379341528e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.106000000000000e+03 1.121250503898899e+06 -1.457208034630122e+06 6.895816188381138e+06 -7.102511672841768e+03 2.013893855793986e+03 1.576634198501833e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.107000000000000e+03 1.121108453991590e+06 -1.457167756381317e+06 6.895847719438089e+06 -7.102530174675232e+03 2.013946336207628e+03 1.576483015912735e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.108000000000000e+03 1.120966403715620e+06 -1.457127477083318e+06 6.895879247471107e+06 -7.102548673177830e+03 2.013998815938166e+03 1.576331832794762e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.109000000000000e+03 1.120824353070952e+06 -1.457087196736114e+06 6.895910772480208e+06 -7.102567167947692e+03 2.014051293815413e+03 1.576180652487717e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.110000000000000e+03 1.120682302057542e+06 -1.457046915339684e+06 6.895942294465397e+06 -7.102585660097325e+03 2.014103772194654e+03 1.576029466921963e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.111000000000000e+03 1.120540250675670e+06 -1.457006632894112e+06 6.895973813426617e+06 -7.102604148723412e+03 2.014156248999583e+03 1.575878282867871e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.112000000000000e+03 1.120398198925294e+06 -1.456966349399384e+06 6.896005329363879e+06 -7.102622634128782e+03 2.014208725324114e+03 1.575727097526542e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.113000000000000e+03 1.120256146806473e+06 -1.456926064855509e+06 6.896036842277162e+06 -7.102641116278372e+03 2.014261200491195e+03 1.575575911954097e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.114000000000000e+03 1.120114094319178e+06 -1.456885779262482e+06 6.896068352166481e+06 -7.102659595160150e+03 2.014313675037055e+03 1.575424725490765e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.115000000000000e+03 1.119972041463677e+06 -1.456845492620377e+06 6.896099859031778e+06 -7.102678070930232e+03 2.014366148931198e+03 1.575273537483643e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.116000000000000e+03 1.119829988239927e+06 -1.456805204929175e+06 6.896131362873056e+06 -7.102696543170180e+03 2.014418621552705e+03 1.575122350617375e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.117000000000000e+03 1.119687934648004e+06 -1.456764916188904e+06 6.896162863690306e+06 -7.102715012448910e+03 2.014471093790267e+03 1.574971161182508e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.118000000000000e+03 1.119545880687857e+06 -1.456724626399536e+06 6.896194361483535e+06 -7.102733478047348e+03 2.014523564549269e+03 1.574819973830096e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.119000000000000e+03 1.119403826359768e+06 -1.456684335561161e+06 6.896225856252686e+06 -7.102751940673341e+03 2.014576034988766e+03 1.574668783872952e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.120000000000000e+03 1.119261771663695e+06 -1.456644043673760e+06 6.896257347997762e+06 -7.102770400345426e+03 2.014628504865635e+03 1.574517591551822e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.121000000000000e+03 1.119119716599598e+06 -1.456603750737317e+06 6.896288836718779e+06 -7.102788856486241e+03 2.014680973567289e+03 1.574366400247619e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.122000000000000e+03 1.118977661167748e+06 -1.456563456751909e+06 6.896320322415674e+06 -7.102807309311741e+03 2.014733441570230e+03 1.574215208366615e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.123000000000000e+03 1.118835605368107e+06 -1.456523161717521e+06 6.896351805088459e+06 -7.102825758959262e+03 2.014785908558081e+03 1.574064015719651e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.124000000000000e+03 1.118693549200751e+06 -1.456482865634185e+06 6.896383284737116e+06 -7.102844205064554e+03 2.014838374341381e+03 1.573912824178367e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.125000000000000e+03 1.118551492665621e+06 -1.456442568501863e+06 6.896414761361657e+06 -7.102862648170370e+03 2.014890839760065e+03 1.573761630211394e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.126000000000000e+03 1.118409435763012e+06 -1.456402270320656e+06 6.896446234962022e+06 -7.102881087975325e+03 2.014943304499122e+03 1.573610435577915e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.127000000000000e+03 1.118267378492867e+06 -1.456361971090530e+06 6.896477705538222e+06 -7.102899524823320e+03 2.014995768341812e+03 1.573459239037517e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.128000000000000e+03 1.118125320855158e+06 -1.456321670811484e+06 6.896509173090260e+06 -7.102917957943201e+03 2.015048231254201e+03 1.573308044064443e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.129000000000000e+03 1.117983262850148e+06 -1.456281369483584e+06 6.896540637618085e+06 -7.102936388276108e+03 2.015100693322654e+03 1.573156846358511e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.130000000000000e+03 1.117841204477811e+06 -1.456241067106833e+06 6.896572099121700e+06 -7.102954815060096e+03 2.015153154860551e+03 1.573005648890540e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.131000000000000e+03 1.117699145738198e+06 -1.456200763681227e+06 6.896603557601092e+06 -7.102973238596970e+03 2.015205614935715e+03 1.572854451560866e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.132000000000000e+03 1.117557086631282e+06 -1.456160459206769e+06 6.896635013056273e+06 -7.102991658899260e+03 2.015258074662126e+03 1.572703252828854e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.133000000000000e+03 1.117415027157330e+06 -1.456120153683528e+06 6.896666465487181e+06 -7.103010076166577e+03 2.015310533630651e+03 1.572552052351651e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.134000000000000e+03 1.117272967316305e+06 -1.456079847111494e+06 6.896697914893826e+06 -7.103028490023653e+03 2.015362991592205e+03 1.572400852130957e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.135000000000000e+03 1.117130907108166e+06 -1.456039539490650e+06 6.896729361276218e+06 -7.103046900903417e+03 2.015415449183442e+03 1.572249649391328e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.136000000000000e+03 1.116988846533190e+06 -1.455999230821075e+06 6.896760804634295e+06 -7.103065307927781e+03 2.015467905198992e+03 1.572098449648051e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.137000000000000e+03 1.116846785591331e+06 -1.455958921102752e+06 6.896792244968070e+06 -7.103083711904207e+03 2.015520360370452e+03 1.571947248332203e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.138000000000000e+03 1.116704724282660e+06 -1.455918610335702e+06 6.896823682277525e+06 -7.103102112771542e+03 2.015572815036106e+03 1.571796045264444e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.139000000000000e+03 1.116562662607140e+06 -1.455878298519913e+06 6.896855116562671e+06 -7.103120510445679e+03 2.015625269290973e+03 1.571644840692095e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.140000000000000e+03 1.116420600565039e+06 -1.455837985655456e+06 6.896886547823450e+06 -7.103138904645963e+03 2.015677722075718e+03 1.571493637278104e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.141000000000000e+03 1.116278538156314e+06 -1.455797671742314e+06 6.896917976059870e+06 -7.103157295911056e+03 2.015730174425744e+03 1.571342431242598e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.142000000000000e+03 1.116136475381042e+06 -1.455757356780517e+06 6.896949401271915e+06 -7.103175683703609e+03 2.015782625799057e+03 1.571191225701426e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.143000000000000e+03 1.115994412239177e+06 -1.455717040770042e+06 6.896980823459599e+06 -7.103194068330073e+03 2.015835076276716e+03 1.571040019181864e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.144000000000000e+03 1.115852348730991e+06 -1.455676723710968e+06 6.897012242622859e+06 -7.103212449629690e+03 2.015887526057922e+03 1.570888812133925e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.145000000000000e+03 1.115710284856449e+06 -1.455636405603281e+06 6.897043658761705e+06 -7.103230827756858e+03 2.015939974837593e+03 1.570737604277229e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.146000000000000e+03 1.115568220615510e+06 -1.455596086446970e+06 6.897075071876146e+06 -7.103249202646729e+03 2.015992423430841e+03 1.570586394812127e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.147000000000000e+03 1.115426156008442e+06 -1.455555766242101e+06 6.897106481966121e+06 -7.103267574251945e+03 2.016044870393053e+03 1.570435185878692e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.148000000000000e+03 1.115284091035214e+06 -1.455515444988674e+06 6.897137889031645e+06 -7.103285942550126e+03 2.016097316973446e+03 1.570283975908456e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.149000000000000e+03 1.115142025695890e+06 -1.455475122686700e+06 6.897169293072698e+06 -7.103304307696665e+03 2.016149762334200e+03 1.570132765328013e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.150000000000000e+03 1.114999959990429e+06 -1.455434799336169e+06 6.897200694089291e+06 -7.103322669460240e+03 2.016202207321695e+03 1.569981554037609e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.151000000000000e+03 1.114857893919101e+06 -1.455394474937149e+06 6.897232092081363e+06 -7.103341027828359e+03 2.016254651164921e+03 1.569830343123059e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.152000000000000e+03 1.114715827481869e+06 -1.455354149489629e+06 6.897263487048928e+06 -7.103359383091193e+03 2.016307093774702e+03 1.569679131410370e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.153000000000000e+03 1.114573760678700e+06 -1.455313822993605e+06 6.897294878991989e+06 -7.103377735085851e+03 2.016359536258433e+03 1.569527918145732e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.154000000000000e+03 1.114431693509858e+06 -1.455273495449144e+06 6.897326267910494e+06 -7.103396083926466e+03 2.016411977622841e+03 1.569376704147603e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.155000000000000e+03 1.114289625975314e+06 -1.455233166856240e+06 6.897357653804447e+06 -7.103414429770195e+03 2.016464418702951e+03 1.569225487598952e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.156000000000000e+03 1.114147558075122e+06 -1.455192837214900e+06 6.897389036673833e+06 -7.103432771768374e+03 2.016516858150896e+03 1.569074274085865e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.157000000000000e+03 1.114005489809252e+06 -1.455152506525119e+06 6.897420416518665e+06 -7.103451110650683e+03 2.016569296986631e+03 1.568923058991332e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.158000000000000e+03 1.113863421177970e+06 -1.455112174786965e+06 6.897451793338883e+06 -7.103469446624093e+03 2.016621735337176e+03 1.568771841222082e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.159000000000000e+03 1.113721352181239e+06 -1.455071842000429e+06 6.897483167134493e+06 -7.103487779513392e+03 2.016674172793314e+03 1.568620622106341e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.160000000000000e+03 1.113579282819029e+06 -1.455031508165508e+06 6.897514537905509e+06 -7.103506108894633e+03 2.016726609721551e+03 1.568469403045096e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.161000000000000e+03 1.113437213091601e+06 -1.454991173282261e+06 6.897545905651866e+06 -7.103524434636979e+03 2.016779045084533e+03 1.568318186009950e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.162000000000000e+03 1.113295142998919e+06 -1.454950837350681e+06 6.897577270373575e+06 -7.103542757303461e+03 2.016831479621932e+03 1.568166967499837e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.163000000000000e+03 1.113153072541051e+06 -1.454910500370789e+06 6.897608632070626e+06 -7.103561077280386e+03 2.016883914103917e+03 1.568015744760080e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.164000000000000e+03 1.113011001717958e+06 -1.454870162342569e+06 6.897639990743027e+06 -7.103579393109007e+03 2.016936346898237e+03 1.567864526484303e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.165000000000000e+03 1.112868930529913e+06 -1.454829823266097e+06 6.897671346390717e+06 -7.103597706288083e+03 2.016988779423949e+03 1.567713304085175e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.166000000000000e+03 1.112726858976872e+06 -1.454789483141356e+06 6.897702699013705e+06 -7.103616016080109e+03 2.017041210967210e+03 1.567562081809300e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.167000000000000e+03 1.112584787058906e+06 -1.454749141968368e+06 6.897734048611977e+06 -7.103634322650832e+03 2.017093641560305e+03 1.567410858873788e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.168000000000000e+03 1.112442714775976e+06 -1.454708799747121e+06 6.897765395185541e+06 -7.103652625913222e+03 2.017146071463037e+03 1.567259635319347e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.169000000000000e+03 1.112300642128353e+06 -1.454668456477687e+06 6.897796738734342e+06 -7.103670925745720e+03 2.017198500573453e+03 1.567108411825331e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.170000000000000e+03 1.112158569115992e+06 -1.454628112160048e+06 6.897828079258385e+06 -7.103689222717452e+03 2.017250928742026e+03 1.566957186050608e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.171000000000000e+03 1.112016495738866e+06 -1.454587766794202e+06 6.897859416757682e+06 -7.103707516024849e+03 2.017303356260362e+03 1.566805961193057e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.172000000000000e+03 1.111874421997237e+06 -1.454547420380213e+06 6.897890751232171e+06 -7.103725806522442e+03 2.017355782622212e+03 1.566654734114378e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.173000000000000e+03 1.111732347891080e+06 -1.454507072918086e+06 6.897922082681865e+06 -7.103744093493997e+03 2.017408208634073e+03 1.566503506933192e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.174000000000000e+03 1.111590273420445e+06 -1.454466724407819e+06 6.897953411106747e+06 -7.103762377406240e+03 2.017460633707345e+03 1.566352278353121e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.175000000000000e+03 1.111448198585296e+06 -1.454426374849401e+06 6.897984736506826e+06 -7.103780657787371e+03 2.017513057577566e+03 1.566201050836310e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.176000000000000e+03 1.111306123385914e+06 -1.454386024242918e+06 6.898016058882044e+06 -7.103798934732078e+03 2.017565480519737e+03 1.566049823591661e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.177000000000000e+03 1.111164047822256e+06 -1.454345672588353e+06 6.898047378232410e+06 -7.103817208726306e+03 2.017617903035466e+03 1.565898593775621e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.178000000000000e+03 1.111021971894279e+06 -1.454305319885687e+06 6.898078694557936e+06 -7.103835479810799e+03 2.017670324940639e+03 1.565747361452241e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.179000000000000e+03 1.110879895602264e+06 -1.454264966135004e+06 6.898110007858557e+06 -7.103853747467961e+03 2.017722745859253e+03 1.565596129438553e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.180000000000000e+03 1.110737818946165e+06 -1.454224611336286e+06 6.898141318134284e+06 -7.103872011519004e+03 2.017775165798964e+03 1.565444898523795e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.181000000000000e+03 1.110595741926048e+06 -1.454184255489550e+06 6.898172625385106e+06 -7.103890272599752e+03 2.017827584689111e+03 1.565293665960724e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.182000000000000e+03 1.110453664541877e+06 -1.454143898594785e+06 6.898203929611029e+06 -7.103908530273013e+03 2.017880003153183e+03 1.565142432867694e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.183000000000000e+03 1.110311586793927e+06 -1.454103540652067e+06 6.898235230811997e+06 -7.103926784787423e+03 2.017932420697165e+03 1.564991198795487e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.184000000000000e+03 1.110169508682151e+06 -1.454063181661378e+06 6.898266528988016e+06 -7.103945036077288e+03 2.017984837113619e+03 1.564839964316045e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.185000000000000e+03 1.110027430206519e+06 -1.454022821622713e+06 6.898297824139095e+06 -7.103963284010171e+03 2.018037253139345e+03 1.564688729033386e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.186000000000000e+03 1.109885351367298e+06 -1.453982460536140e+06 6.898329116265179e+06 -7.103981528859451e+03 2.018089668421942e+03 1.564537492197442e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.187000000000000e+03 1.109743272164449e+06 -1.453942098401648e+06 6.898360405366274e+06 -7.103999770129134e+03 2.018142081996953e+03 1.564386257320760e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.188000000000000e+03 1.109601192598041e+06 -1.453901735219258e+06 6.898391691442364e+06 -7.104018008660566e+03 2.018194495685842e+03 1.564235018195961e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.189000000000000e+03 1.109459112668034e+06 -1.453861370988954e+06 6.898422974493462e+06 -7.104036243273370e+03 2.018246908060499e+03 1.564083782019780e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.190000000000000e+03 1.109317032374697e+06 -1.453821005710808e+06 6.898454254519509e+06 -7.104054475035452e+03 2.018299319584489e+03 1.563932543392621e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.191000000000000e+03 1.109174951717996e+06 -1.453780639384812e+06 6.898485531520513e+06 -7.104072703790544e+03 2.018351730910040e+03 1.563781302137725e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.192000000000000e+03 1.109032870697994e+06 -1.453740272010980e+06 6.898516805496459e+06 -7.104090929088373e+03 2.018404140689006e+03 1.563630062079643e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.193000000000000e+03 1.108890789314656e+06 -1.453699903589307e+06 6.898548076447356e+06 -7.104109150701057e+03 2.018456549788046e+03 1.563478823075286e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.194000000000000e+03 1.108748707568248e+06 -1.453659534119856e+06 6.898579344373146e+06 -7.104127369697444e+03 2.018508958604108e+03 1.563327579807516e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.195000000000000e+03 1.108606625458731e+06 -1.453619163602616e+06 6.898610609273839e+06 -7.104145585066518e+03 2.018561365731949e+03 1.563176338688708e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.196000000000000e+03 1.108464542986074e+06 -1.453578792037584e+06 6.898641871149443e+06 -7.104163797134145e+03 2.018613772240712e+03 1.563025096824654e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.197000000000000e+03 1.108322460150545e+06 -1.453538419424829e+06 6.898673129999899e+06 -7.104182006070492e+03 2.018666178364599e+03 1.562873853138745e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.198000000000000e+03 1.108180376952102e+06 -1.453498045764333e+06 6.898704385825216e+06 -7.104200211736407e+03 2.018718583404577e+03 1.562722609192972e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.199000000000000e+03 1.108038293390815e+06 -1.453457671056120e+06 6.898735638625382e+06 -7.104218414301671e+03 2.018770987411768e+03 1.562571364158344e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.200000000000000e+03 1.107896209466647e+06 -1.453417295300180e+06 6.898766888400403e+06 -7.104236613570014e+03 2.018823391249199e+03 1.562420117754117e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.201000000000000e+03 1.107754125179863e+06 -1.453376918496578e+06 6.898798135150220e+06 -7.104254809406663e+03 2.018875793402563e+03 1.562268872618973e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.202000000000000e+03 1.107612040530436e+06 -1.453336540645315e+06 6.898829378874848e+06 -7.104273002522204e+03 2.018928195893309e+03 1.562117622853038e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.203000000000000e+03 1.107469955518313e+06 -1.453296161746362e+06 6.898860619574291e+06 -7.104291191994296e+03 2.018980596714094e+03 1.561966375285958e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.204000000000000e+03 1.107327870143778e+06 -1.453255781799808e+06 6.898891857248488e+06 -7.104309377739157e+03 2.019032996332217e+03 1.561815129665848e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.205000000000000e+03 1.107185784406786e+06 -1.453215400805631e+06 6.898923091897452e+06 -7.104327560680821e+03 2.019085395697321e+03 1.561663880575703e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.206000000000000e+03 1.107043698307402e+06 -1.453175018763849e+06 6.898954323521165e+06 -7.104345740379786e+03 2.019137793926563e+03 1.561512631171624e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.207000000000000e+03 1.106901611845592e+06 -1.453134635674455e+06 6.898985552119645e+06 -7.104363916977249e+03 2.019190191804711e+03 1.561361379765400e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.208000000000000e+03 1.106759525021627e+06 -1.453094251537522e+06 6.899016777692823e+06 -7.104382090143274e+03 2.019242588616271e+03 1.561210128798011e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.209000000000000e+03 1.106617437835462e+06 -1.453053866353029e+06 6.899048000240711e+06 -7.104400259945640e+03 2.019294984313998e+03 1.561058878029475e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.210000000000000e+03 1.106475350287067e+06 -1.453013480120976e+06 6.899079219763323e+06 -7.104418426482370e+03 2.019347379315969e+03 1.560907626458150e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.211000000000000e+03 1.106333262376711e+06 -1.452973092841431e+06 6.899110436260594e+06 -7.104436590315809e+03 2.019399774227673e+03 1.560756370747653e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.212000000000000e+03 1.106191174104353e+06 -1.452932704514379e+06 6.899141649732536e+06 -7.104454750364798e+03 2.019452167428901e+03 1.560605117925663e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.213000000000000e+03 1.106049085470063e+06 -1.452892315139847e+06 6.899172860179136e+06 -7.104472907274900e+03 2.019504560142207e+03 1.560453863452638e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.214000000000000e+03 1.105906996473798e+06 -1.452851924717808e+06 6.899204067600401e+06 -7.104491060695264e+03 2.019556951438946e+03 1.560302610151935e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.215000000000000e+03 1.105764907115834e+06 -1.452811533248351e+06 6.899235271996272e+06 -7.104509211371096e+03 2.019609342922236e+03 1.560151352523196e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.216000000000000e+03 1.105622817396130e+06 -1.452771140731455e+06 6.899266473366760e+06 -7.104527358534832e+03 2.019661733086446e+03 1.560000096035822e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.217000000000000e+03 1.105480727314749e+06 -1.452730747167135e+06 6.899297671711846e+06 -7.104545502663283e+03 2.019714122452951e+03 1.559848837849082e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.218000000000000e+03 1.105338636871661e+06 -1.452690352555390e+06 6.899328867031545e+06 -7.104563643377189e+03 2.019766511319902e+03 1.559697579262951e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.219000000000000e+03 1.105196546067126e+06 -1.452649956896278e+06 6.899360059325799e+06 -7.104581780513114e+03 2.019818898633318e+03 1.559546322430421e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.220000000000000e+03 1.105054454901113e+06 -1.452609560189797e+06 6.899391248594613e+06 -7.104599914862734e+03 2.019871285454082e+03 1.559395062370228e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.221000000000000e+03 1.104912363373586e+06 -1.452569162435938e+06 6.899422434837998e+06 -7.104618045705736e+03 2.019923671680547e+03 1.559243802451643e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.222000000000000e+03 1.104770271484807e+06 -1.452528763634762e+06 6.899453618055894e+06 -7.104636173392645e+03 2.019976056759653e+03 1.559092541846533e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.223000000000000e+03 1.104628179234751e+06 -1.452488363786275e+06 6.899484798248312e+06 -7.104654297770167e+03 2.020028441210756e+03 1.558941280543313e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.224000000000000e+03 1.104486086623469e+06 -1.452447962890475e+06 6.899515975415234e+06 -7.104672418663805e+03 2.020080824197604e+03 1.558790020452342e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.225000000000000e+03 1.104343993650936e+06 -1.452407560947364e+06 6.899547149556673e+06 -7.104690536530692e+03 2.020133206946367e+03 1.558638757869023e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.226000000000000e+03 1.104201900317416e+06 -1.452367157957009e+06 6.899578320672571e+06 -7.104708651166782e+03 2.020185588925071e+03 1.558487494426108e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.227000000000000e+03 1.104059806622866e+06 -1.452326753919395e+06 6.899609488762933e+06 -7.104726762603945e+03 2.020237969791380e+03 1.558336230441921e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.228000000000000e+03 1.103917712567262e+06 -1.452286348834521e+06 6.899640653827771e+06 -7.104744870691417e+03 2.020290350118885e+03 1.558184965820369e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.229000000000000e+03 1.103775618150864e+06 -1.452245942702451e+06 6.899671815867025e+06 -7.104762975727304e+03 2.020342729757665e+03 1.558033699424458e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.230000000000000e+03 1.103633523373635e+06 -1.452205535523174e+06 6.899702974880704e+06 -7.104781077647311e+03 2.020395108590471e+03 1.557882431700832e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.231000000000000e+03 1.103491428235648e+06 -1.452165127296715e+06 6.899734130868794e+06 -7.104799175618754e+03 2.020447485682836e+03 1.557731167650844e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.232000000000000e+03 1.103349332736856e+06 -1.452124718023051e+06 6.899765283831306e+06 -7.104817270721375e+03 2.020499862742623e+03 1.557579900120431e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.233000000000000e+03 1.103207236877535e+06 -1.452084307702263e+06 6.899796433768179e+06 -7.104835362603154e+03 2.020552238693346e+03 1.557428632142841e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.234000000000000e+03 1.103065140657642e+06 -1.452043896334333e+06 6.899827580679424e+06 -7.104853451199987e+03 2.020604614035217e+03 1.557277363331397e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.235000000000000e+03 1.102923044077144e+06 -1.452003483919253e+06 6.899858724565051e+06 -7.104871537034355e+03 2.020656988840751e+03 1.557126091239728e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.236000000000000e+03 1.102780947136312e+06 -1.451963070457099e+06 6.899889865424997e+06 -7.104889618848531e+03 2.020709362213265e+03 1.556974822730938e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.237000000000000e+03 1.102638849835108e+06 -1.451922655947857e+06 6.899921003259272e+06 -7.104907697984737e+03 2.020761735289326e+03 1.556823550238088e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.238000000000000e+03 1.102496752173595e+06 -1.451882240391541e+06 6.899952138067865e+06 -7.104925773312049e+03 2.020814106825654e+03 1.556672280523201e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.239000000000000e+03 1.102354654151733e+06 -1.451841823788138e+06 6.899983269850784e+06 -7.104943845687963e+03 2.020866477958297e+03 1.556521008197863e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.240000000000000e+03 1.102212555769799e+06 -1.451801406137730e+06 6.900014398607966e+06 -7.104961914823743e+03 2.020918848039257e+03 1.556369735434860e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.241000000000000e+03 1.102070457027751e+06 -1.451760987440298e+06 6.900045524339426e+06 -7.104979980612782e+03 2.020971217726191e+03 1.556218461825690e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.242000000000000e+03 1.101928357925654e+06 -1.451720567695859e+06 6.900076647045149e+06 -7.104998043247369e+03 2.021023586167489e+03 1.556067187655423e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.243000000000000e+03 1.101786258463472e+06 -1.451680146904403e+06 6.900107766725144e+06 -7.105016102607762e+03 2.021075953936498e+03 1.555915912688384e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.244000000000000e+03 1.101644158641477e+06 -1.451639725066006e+06 6.900138883379350e+06 -7.105034158378057e+03 2.021128320652340e+03 1.555764638860232e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.245000000000000e+03 1.101502058459624e+06 -1.451599302180648e+06 6.900169997007778e+06 -7.105052211731426e+03 2.021180687060224e+03 1.555613359886347e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.246000000000000e+03 1.101359957917886e+06 -1.451558878248326e+06 6.900201107610435e+06 -7.105070261094397e+03 2.021233052378851e+03 1.555462083901181e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.247000000000000e+03 1.101217857016524e+06 -1.451518453269106e+06 6.900232215187266e+06 -7.105088307142679e+03 2.021285416499731e+03 1.555310808011634e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.248000000000000e+03 1.101075755755506e+06 -1.451478027242983e+06 6.900263319738276e+06 -7.105106350277705e+03 2.021337779885547e+03 1.555159529785942e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.249000000000000e+03 1.100933654134902e+06 -1.451437600169978e+06 6.900294421263456e+06 -7.105124390331084e+03 2.021390143377616e+03 1.555008248844503e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.250000000000000e+03 1.100791552154655e+06 -1.451397172050056e+06 6.900325519762813e+06 -7.105142427123019e+03 2.021442505327836e+03 1.554856968223744e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.251000000000000e+03 1.100649449815055e+06 -1.451356742883315e+06 6.900356615236282e+06 -7.105160460442468e+03 2.021494866458445e+03 1.554705687897764e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.252000000000000e+03 1.100507347116058e+06 -1.451316312669733e+06 6.900387707683880e+06 -7.105178490050692e+03 2.021547226283105e+03 1.554554409599334e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.253000000000000e+03 1.100365244057624e+06 -1.451275881409300e+06 6.900418797105614e+06 -7.105196516912646e+03 2.021599585642794e+03 1.554403127846958e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.254000000000000e+03 1.100223140640029e+06 -1.451235449102091e+06 6.900449883501424e+06 -7.105214540570470e+03 2.021651944735112e+03 1.554251844434533e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.255000000000000e+03 1.100081036863227e+06 -1.451195015748087e+06 6.900480966871320e+06 -7.105232561245453e+03 2.021704302653035e+03 1.554100559591807e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.256000000000000e+03 1.099938932727291e+06 -1.451154581347314e+06 6.900512047215288e+06 -7.105250578288141e+03 2.021756659706025e+03 1.553949275825283e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.257000000000000e+03 1.099796828232182e+06 -1.451114145899758e+06 6.900543124533338e+06 -7.105268591627230e+03 2.021809015400230e+03 1.553797994124818e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.258000000000000e+03 1.099654723378164e+06 -1.451073709405485e+06 6.900574198825410e+06 -7.105286602650138e+03 2.021861371188394e+03 1.553646706275143e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.259000000000000e+03 1.099512618165210e+06 -1.451033271864497e+06 6.900605270091514e+06 -7.105304609647003e+03 2.021913725474034e+03 1.553495422138857e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.260000000000000e+03 1.099370512593268e+06 -1.450992833276761e+06 6.900636338331657e+06 -7.105322614024509e+03 2.021966079374659e+03 1.553344133866326e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.261000000000000e+03 1.099228406662622e+06 -1.450952393642372e+06 6.900667403545781e+06 -7.105340614498862e+03 2.022018431866944e+03 1.553192848626994e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.262000000000000e+03 1.099086300373231e+06 -1.450911952961309e+06 6.900698465733899e+06 -7.105358612046285e+03 2.022070783909174e+03 1.553041560725024e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.263000000000000e+03 1.098944193725154e+06 -1.450871511233586e+06 6.900729524895993e+06 -7.105376606556232e+03 2.022123135062594e+03 1.552890271252058e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.264000000000000e+03 1.098802086718361e+06 -1.450831068459198e+06 6.900760581032074e+06 -7.105394597509256e+03 2.022175485741052e+03 1.552738981989129e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.265000000000000e+03 1.098659979353117e+06 -1.450790624638213e+06 6.900791634142081e+06 -7.105412585184145e+03 2.022227834958734e+03 1.552587693014461e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.266000000000000e+03 1.098517871629386e+06 -1.450750179770619e+06 6.900822684226025e+06 -7.105430569840473e+03 2.022280183937357e+03 1.552436401503543e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.267000000000000e+03 1.098375763547234e+06 -1.450709733856434e+06 6.900853731283893e+06 -7.105448551078514e+03 2.022332531290206e+03 1.552285111136378e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.268000000000000e+03 1.098233655106629e+06 -1.450669286895658e+06 6.900884775315690e+06 -7.105466529172976e+03 2.022384878715175e+03 1.552133818374829e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.269000000000000e+03 1.098091546307829e+06 -1.450628838888342e+06 6.900915816321363e+06 -7.105484503934444e+03 2.022437225027692e+03 1.551982525677387e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.270000000000000e+03 1.097949437150801e+06 -1.450588389834485e+06 6.900946854300919e+06 -7.105502475788810e+03 2.022489570644650e+03 1.551831230558389e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.271000000000000e+03 1.097807327635510e+06 -1.450547939734076e+06 6.900977889254365e+06 -7.105520444047979e+03 2.022541915194746e+03 1.551679936624505e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.272000000000000e+03 1.097665217762228e+06 -1.450507488587192e+06 6.901008921181644e+06 -7.105538408792577e+03 2.022594258499110e+03 1.551528643754967e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.273000000000000e+03 1.097523107530916e+06 -1.450467036393818e+06 6.901039950082766e+06 -7.105556370528570e+03 2.022646601441276e+03 1.551377348469863e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.274000000000000e+03 1.097380996941636e+06 -1.450426583153969e+06 6.901070975957715e+06 -7.105574329198791e+03 2.022698943639457e+03 1.551226051544202e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.275000000000000e+03 1.097238885994351e+06 -1.450386128867629e+06 6.901101998806502e+06 -7.105592284307615e+03 2.022751284701073e+03 1.551074755746520e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.276000000000000e+03 1.097096774689332e+06 -1.450345673534879e+06 6.901133018629068e+06 -7.105610236213703e+03 2.022803624783005e+03 1.550923459245973e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.277000000000000e+03 1.096954663026546e+06 -1.450305217155708e+06 6.901164035425420e+06 -7.105628185100462e+03 2.022855964626206e+03 1.550772160209936e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.278000000000000e+03 1.096812551005952e+06 -1.450264759730101e+06 6.901195049195570e+06 -7.105646130628279e+03 2.022908303280810e+03 1.550620861459083e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.279000000000000e+03 1.096670438627820e+06 -1.450224301258132e+06 6.901226059939455e+06 -7.105664072850812e+03 2.022960641199927e+03 1.550469562136921e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.280000000000000e+03 1.096528325892109e+06 -1.450183841739786e+06 6.901257067657090e+06 -7.105682011803548e+03 2.023012978400676e+03 1.550318262060013e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.281000000000000e+03 1.096386212798890e+06 -1.450143381175084e+06 6.901288072348460e+06 -7.105699947609810e+03 2.023065314515068e+03 1.550166961170699e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.282000000000000e+03 1.096244099348120e+06 -1.450102919564010e+06 6.901319074013568e+06 -7.105717880083841e+03 2.023117649943630e+03 1.550015659764364e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.283000000000000e+03 1.096101985540072e+06 -1.450062456906640e+06 6.901350072652362e+06 -7.105735809438525e+03 2.023169984756224e+03 1.549864356784803e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.284000000000000e+03 1.095959871374710e+06 -1.450021993202962e+06 6.901381068264851e+06 -7.105753735361599e+03 2.023222318137808e+03 1.549713054748289e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.285000000000000e+03 1.095817756851997e+06 -1.449981528452968e+06 6.901412060851038e+06 -7.105771658012951e+03 2.023274651265892e+03 1.549561751334883e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.286000000000000e+03 1.095675641972197e+06 -1.449941062656722e+06 6.901443050410872e+06 -7.105789577532424e+03 2.023326983233003e+03 1.549410447144354e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.287000000000000e+03 1.095533526735279e+06 -1.449900595814222e+06 6.901474036944357e+06 -7.105807493751386e+03 2.023379314450114e+03 1.549259142380695e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.288000000000000e+03 1.095391411141307e+06 -1.449860127925481e+06 6.901505020451481e+06 -7.105825406621675e+03 2.023431644601812e+03 1.549107837689827e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.289000000000000e+03 1.095249295190245e+06 -1.449819658990491e+06 6.901536000932251e+06 -7.105843316254853e+03 2.023483974519191e+03 1.548956531439271e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.290000000000000e+03 1.095107178882353e+06 -1.449779189009311e+06 6.901566978386613e+06 -7.105861222669860e+03 2.023536302797487e+03 1.548805225450878e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.291000000000000e+03 1.094965062217610e+06 -1.449738717981951e+06 6.901597952814570e+06 -7.105879125969272e+03 2.023588631091090e+03 1.548653917014285e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.292000000000000e+03 1.094822945196064e+06 -1.449698245908407e+06 6.901628924216114e+06 -7.105897025996070e+03 2.023640957938736e+03 1.548502608823664e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.293000000000000e+03 1.094680827786449e+06 -1.449657772779295e+06 6.901659892598178e+06 -7.105914922712097e+03 2.023693284212881e+03 1.548351299866604e+03 5.846122778100000e-03 -1.467083875400000e-03 -1.293639364700000e-03 2.219145497200000e-03 5.567903214999000e-04 1.685960280800000e-03</EPHEMLIST>\n\t\t</EPHEMLISTList>\n\t</EPH>\n\t<ATT>\n\t\t<SATID>WV02</SATID>\n\t\t<REVNUMBER>18779</REVNUMBER>\n\t\t<STRIPID>22D837</STRIPID>\n\t\t<TYPE>R</TYPE>\n\t\t<VERSION>A</VERSION>\n\t\t<GENERATIONTIME>2013-05-08T01:09:53.000000Z</GENERATIONTIME>\n\t\t<STARTTIME>2013-05-08T00:04:27.130007Z</STARTTIME>\n\t\t<NUMPOINTS>1293</NUMPOINTS>\n\t\t<TIMEINTERVAL>2.000000000000000e-02</TIMEINTERVAL>\n\t\t<ATTLISTList>\n\t\t\t<ATTLIST>1.000000000000000e+00 -4.027267439296881e-01 -8.881523195590507e-01 -1.864604342176037e-01 -1.192859315135362e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.000000000000000e+00 -4.027136620533962e-01 -8.881528758253654e-01 -1.865109186577010e-01 -1.192470241982438e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.000000000000000e+00 -4.027005789415716e-01 -8.881534282602828e-01 -1.865613974466594e-01 -1.192081229295210e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.000000000000000e+00 -4.026874945663511e-01 -8.881539768756495e-01 -1.866118705973635e-01 -1.191692277057990e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.000000000000000e+00 -4.026744089360972e-01 -8.881545216696661e-01 -1.866623381076094e-01 -1.191303385284023e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>6.000000000000000e+00 -4.026613220626673e-01 -8.881550626392133e-01 -1.867127999738239e-01 -1.190914553988458e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.000000000000000e+00 -4.026482339414921e-01 -8.881555997873659e-01 -1.867632561991198e-01 -1.190525783174968e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.000000000000000e+00 -4.026351445637084e-01 -8.881561331188063e-01 -1.868137067885659e-01 -1.190137072841897e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.000000000000000e+00 -4.026220539327056e-01 -8.881566626336090e-01 -1.868641517420022e-01 -1.189748422998803e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.000000000000000e+01 -4.026089620792330e-01 -8.881571883215373e-01 -1.869145910480378e-01 -1.189359833675610e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.100000000000000e+01 -4.025958689686872e-01 -8.881577101969736e-01 -1.869650247223083e-01 -1.188971304851510e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.200000000000000e+01 -4.025827746101222e-01 -8.881582282578570e-01 -1.870154527623290e-01 -1.188582836540270e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.300000000000000e+01 -4.025696790118208e-01 -8.881587425024137e-01 -1.870658751659988e-01 -1.188194428754390e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.400000000000000e+01 -4.025565821846804e-01 -8.881592529278897e-01 -1.871162919300806e-01 -1.187806081509050e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.500000000000000e+01 -4.025434841072482e-01 -8.881597595437069e-01 -1.871667030648028e-01 -1.187417794793161e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.600000000000000e+01 -4.025303847851486e-01 -8.881602623490972e-01 -1.872171085690895e-01 -1.187029568617939e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.700000000000000e+01 -4.025172842361700e-01 -8.881607613387050e-01 -1.872675084369439e-01 -1.186641403003003e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.800000000000000e+01 -4.025041824585675e-01 -8.881612565145390e-01 -1.873179026703159e-01 -1.186253297954088e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.900000000000000e+01 -4.024910794378186e-01 -8.881617478834081e-01 -1.873682912765851e-01 -1.185865253465243e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.000000000000000e+01 -4.024779751765712e-01 -8.881622354456646e-01 -1.874186742558971e-01 -1.185477269545454e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.100000000000000e+01 -4.024648697030479e-01 -8.881627191920267e-01 -1.874690515979205e-01 -1.185089346222893e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.200000000000000e+01 -4.024517629894076e-01 -8.881631991343196e-01 -1.875194233154884e-01 -1.184701483481608e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.300000000000000e+01 -4.024386550385857e-01 -8.881636752727865e-01 -1.875697894086292e-01 -1.184313681330798e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.400000000000000e+01 -4.024255458730103e-01 -8.881641476003249e-01 -1.876201498694542e-01 -1.183925939793609e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.500000000000000e+01 -4.024124354787389e-01 -8.881646161235349e-01 -1.876705047049059e-01 -1.183538258866587e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.600000000000000e+01 -4.023993238532035e-01 -8.881650808447200e-01 -1.877208539174594e-01 -1.183150638552698e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.700000000000000e+01 -4.023862110053668e-01 -8.881655417618530e-01 -1.877711975046777e-01 -1.182763078865677e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.800000000000000e+01 -4.023730969403909e-01 -8.881659988743382e-01 -1.878215354656805e-01 -1.182375579816424e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.900000000000000e+01 -4.023599816559769e-01 -8.881664521843767e-01 -1.878718678028337e-01 -1.181988141408103e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.000000000000000e+01 -4.023468651407886e-01 -8.881669016975849e-01 -1.879221945220055e-01 -1.181600763639158e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.100000000000000e+01 -4.023337474180514e-01 -8.881673474065607e-01 -1.879725156149915e-01 -1.181213446533401e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.200000000000000e+01 -4.023206284639580e-01 -8.881677893216153e-01 -1.880228310927581e-01 -1.180826190079860e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.300000000000000e+01 -4.023075083107885e-01 -8.881682274319294e-01 -1.880731409435324e-01 -1.180438994307785e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.400000000000000e+01 -4.022943869292966e-01 -8.881686617498604e-01 -1.881234451805001e-01 -1.180051859202078e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.500000000000000e+01 -4.022812643513184e-01 -8.881690922647704e-01 -1.881737437918813e-01 -1.179664784793796e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.600000000000000e+01 -4.022681405397399e-01 -8.881695189919633e-01 -1.882240367942640e-01 -1.179277771059737e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.700000000000000e+01 -4.022550155336130e-01 -8.881699419180856e-01 -1.882743241729244e-01 -1.178890818036435e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.800000000000000e+01 -4.022418893028022e-01 -8.881703610558211e-01 -1.883246059414656e-01 -1.178503925707347e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.900000000000000e+01 -4.022287618836716e-01 -8.881707763928297e-01 -1.883748820862687e-01 -1.178117094107012e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.000000000000000e+01 -4.022156332422342e-01 -8.881711879432342e-01 -1.884251526226333e-01 -1.177730323214527e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.100000000000000e+01 -4.022025034020816e-01 -8.881715956995018e-01 -1.884754175421580e-01 -1.177343613054764e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.200000000000000e+01 -4.021893723438820e-01 -8.881719996702474e-01 -1.885256768540261e-01 -1.176956963619301e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.300000000000000e+01 -4.021762400931442e-01 -8.881723998472164e-01 -1.885759305490577e-01 -1.176570374934489e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.400000000000000e+01 -4.021631066549108e-01 -8.881727962298436e-01 -1.886261786266208e-01 -1.176183847009038e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.500000000000000e+01 -4.021499719900345e-01 -8.881731888342024e-01 -1.886764211039111e-01 -1.175797379820132e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.600000000000000e+01 -4.021368361406757e-01 -8.881735776457731e-01 -1.887266579649626e-01 -1.175410973406801e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.700000000000000e+01 -4.021236990909380e-01 -8.881739626718679e-01 -1.887768892176805e-01 -1.175024627761810e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.800000000000000e+01 -4.021105608386102e-01 -8.881743439146615e-01 -1.888271148641936e-01 -1.174638342890424e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.900000000000000e+01 -4.020974213971673e-01 -8.881747213704237e-01 -1.888773349003033e-01 -1.174252118809166e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.000000000000000e+01 -4.020842807512288e-01 -8.881750950462824e-01 -1.889275493335047e-01 -1.173865955513254e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.100000000000000e+01 -4.020711389367526e-01 -8.881754649300422e-01 -1.889777581505710e-01 -1.173479853034997e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.200000000000000e+01 -4.020579959015708e-01 -8.881758310426675e-01 -1.890279613739797e-01 -1.173093811341483e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.300000000000000e+01 -4.020448516942900e-01 -8.881761933672183e-01 -1.890781589851625e-01 -1.172707830476804e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.400000000000000e+01 -4.020317062933849e-01 -8.881765519131187e-01 -1.891283509943057e-01 -1.172321910429349e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.500000000000000e+01 -4.020185596983447e-01 -8.881769066819033e-01 -1.891785374028447e-01 -1.171936051205656e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.600000000000000e+01 -4.020054119176291e-01 -8.881772576717265e-01 -1.892287182086271e-01 -1.171550252818433e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.700000000000000e+01 -4.019922629679046e-01 -8.881776048776630e-01 -1.892788934060992e-01 -1.171164515287415e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.800000000000000e+01 -4.019791128105394e-01 -8.881779483155664e-01 -1.893290630123995e-01 -1.170778838587785e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.900000000000000e+01 -4.019659614830895e-01 -8.881782879726562e-01 -1.893792270134760e-01 -1.170393222755294e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>6.000000000000000e+01 -4.019528089756279e-01 -8.881786238540053e-01 -1.894293854145949e-01 -1.170007667789260e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>6.100000000000000e+01 -4.019396552876975e-01 -8.881789559611127e-01 -1.894795382173622e-01 -1.169622173694149e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>6.200000000000000e+01 -4.019265004104931e-01 -8.881792842986280e-01 -1.895296854265826e-01 -1.169236740470117e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>6.300000000000000e+01 -4.019133443643187e-01 -8.881796088602533e-01 -1.895798270352943e-01 -1.168851368138994e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>6.400000000000000e+01 -4.019001871365831e-01 -8.881799296520617e-01 -1.896299630498408e-01 -1.168466056698020e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>6.500000000000000e+01 -4.018870287459388e-01 -8.881802466683678e-01 -1.896800934640634e-01 -1.168080806166373e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>6.600000000000000e+01 -4.018738691685298e-01 -8.881805599194769e-01 -1.897302182888793e-01 -1.167695616532588e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>6.700000000000000e+01 -4.018607084168568e-01 -8.881808694020247e-01 -1.897803375204998e-01 -1.167310487812505e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>6.800000000000000e+01 -4.018475465078526e-01 -8.881811751109858e-01 -1.898304511532763e-01 -1.166925420026109e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>6.900000000000000e+01 -4.018343834128254e-01 -8.881814770584683e-01 -1.898805592002761e-01 -1.166540413156053e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.000000000000000e+01 -4.018212191596565e-01 -8.881817752353310e-01 -1.899306616514059e-01 -1.166155467230780e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.100000000000000e+01 -4.018080537309623e-01 -8.881820696494452e-01 -1.899807585149474e-01 -1.165770582243750e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.200000000000000e+01 -4.017948871488531e-01 -8.881823602938265e-01 -1.900308497833469e-01 -1.165385758216882e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.300000000000000e+01 -4.017817193942506e-01 -8.881826471769800e-01 -1.900809354655703e-01 -1.165000995142305e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.400000000000000e+01 -4.017685504602619e-01 -8.881829303028285e-01 -1.901310155656997e-01 -1.164616293020863e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.500000000000000e+01 -4.017553803922946e-01 -8.881832096556483e-01 -1.901810900665478e-01 -1.164231651894645e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.600000000000000e+01 -4.017422091462555e-01 -8.881834852533279e-01 -1.902311589874105e-01 -1.163847071734267e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.700000000000000e+01 -4.017290367363601e-01 -8.881837570918630e-01 -1.902812223237481e-01 -1.163462552557624e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.800000000000000e+01 -4.017158631840956e-01 -8.881840251645178e-01 -1.903312800680771e-01 -1.163078094388306e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.900000000000000e+01 -4.017026884577590e-01 -8.881842894845234e-01 -1.903813322346614e-01 -1.162693697206462e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.000000000000000e+01 -4.016895125901792e-01 -8.881845500408841e-01 -1.904313788114246e-01 -1.162309361044495e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.100000000000000e+01 -4.016763355476454e-01 -8.881848068475917e-01 -1.904814198133092e-01 -1.161925085882363e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.200000000000000e+01 -4.016631573710543e-01 -8.881850598906217e-01 -1.905314552249767e-01 -1.161540871758771e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.300000000000000e+01 -4.016499780380644e-01 -8.881853091796857e-01 -1.905814850568912e-01 -1.161156718661113e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.400000000000000e+01 -4.016367975316888e-01 -8.881855547224974e-01 -1.906315093171506e-01 -1.160772626582998e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.500000000000000e+01 -4.016236159078390e-01 -8.881857964993947e-01 -1.906815279843486e-01 -1.160388595574911e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.600000000000000e+01 -4.016104331266946e-01 -8.881860345266507e-01 -1.907315410760184e-01 -1.160004625610569e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.700000000000000e+01 -4.015972491920367e-01 -8.881862688041801e-01 -1.907815485918515e-01 -1.159620716699779e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.800000000000000e+01 -4.015840641009562e-01 -8.881864993344031e-01 -1.908315505343103e-01 -1.159236868846419e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.900000000000000e+01 -4.015708778828714e-01 -8.881867261076081e-01 -1.908815468927202e-01 -1.158853082080359e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.000000000000000e+01 -4.015576905122606e-01 -8.881869491346958e-01 -1.909315376788178e-01 -1.158469356386398e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.100000000000000e+01 -4.015445020021549e-01 -8.881871684121071e-01 -1.909815228885565e-01 -1.158085691781595e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.200000000000000e+01 -4.015313123442040e-01 -8.881873839443045e-01 -1.910315025265980e-01 -1.157702088265559e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.300000000000000e+01 -4.015181215675691e-01 -8.881875957216739e-01 -1.910814765823811e-01 -1.157318545868009e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.400000000000000e+01 -4.015049296229770e-01 -8.881878037640287e-01 -1.911314450772282e-01 -1.156935064555059e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.500000000000000e+01 -4.014917365597605e-01 -8.881880080541832e-01 -1.911814079924314e-01 -1.156551644372249e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.600000000000000e+01 -4.014785423588237e-01 -8.881882086006370e-01 -1.912313653369273e-01 -1.156168285311452e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.700000000000000e+01 -4.014653470191014e-01 -8.881884054051070e-01 -1.912813171125592e-01 -1.155784987376577e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.800000000000000e+01 -4.014521505436405e-01 -8.881885984677803e-01 -1.913312633193180e-01 -1.155401750576851e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.900000000000000e+01 -4.014389529468947e-01 -8.881887877845591e-01 -1.913812039526558e-01 -1.155018574929789e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.000000000000000e+02 -4.014257542079462e-01 -8.881889733646239e-01 -1.914311390222362e-01 -1.154635460425770e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.010000000000000e+02 -4.014125543390807e-01 -8.881891552046803e-01 -1.914810685245137e-01 -1.154252407079201e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.020000000000000e+02 -4.013993533439639e-01 -8.881893333046831e-01 -1.915309924592314e-01 -1.153869414899798e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.030000000000000e+02 -4.013861512270414e-01 -8.881895076642944e-01 -1.915809108258177e-01 -1.153486483897907e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.040000000000000e+02 -4.013729479824224e-01 -8.881896782870392e-01 -1.916308236280611e-01 -1.153103614073617e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.050000000000000e+02 -4.013597436112711e-01 -8.881898451738107e-01 -1.916807308667132e-01 -1.152720805434666e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.060000000000000e+02 -4.013465381091941e-01 -8.881900083275813e-01 -1.917306325448281e-01 -1.152338057983713e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.070000000000000e+02 -4.013333314909921e-01 -8.881901677441271e-01 -1.917805286576607e-01 -1.151955371739265e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.080000000000000e+02 -4.013201237585616e-01 -8.881903234240511e-01 -1.918304192058612e-01 -1.151572746707557e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.090000000000000e+02 -4.013069148959373e-01 -8.881904753746709e-01 -1.918803041970807e-01 -1.151190182882780e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.100000000000000e+02 -4.012937049239611e-01 -8.881906235894970e-01 -1.919301836241445e-01 -1.150807680288238e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.110000000000000e+02 -4.012804938301074e-01 -8.881907680745404e-01 -1.919800574935086e-01 -1.150425238918741e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.120000000000000e+02 -4.012672816201453e-01 -8.881909088289653e-01 -1.920299258040699e-01 -1.150042858785661e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.130000000000000e+02 -4.012540682821928e-01 -8.881910458585504e-01 -1.920797885618934e-01 -1.149660539885674e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.140000000000000e+02 -4.012408538575550e-01 -8.881911791491329e-01 -1.921296457515756e-01 -1.149278282258376e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.150000000000000e+02 -4.012276383061659e-01 -8.881913087170498e-01 -1.921794973906512e-01 -1.148896085876680e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.160000000000000e+02 -4.012144216420102e-01 -8.881914345583840e-01 -1.922293434747114e-01 -1.148513950758481e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.170000000000000e+02 -4.012012038720654e-01 -8.881915566718407e-01 -1.922791840022331e-01 -1.148131876915423e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.180000000000000e+02 -4.011879849877875e-01 -8.881916750619493e-01 -1.923290189778709e-01 -1.147749864347510e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.190000000000000e+02 -4.011747650049226e-01 -8.881917897241178e-01 -1.923788483967041e-01 -1.147367913071982e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.200000000000000e+02 -4.011615439041579e-01 -8.881919006669124e-01 -1.924286722677149e-01 -1.146986023080247e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.210000000000000e+02 -4.011483217188427e-01 -8.881920078791563e-01 -1.924784905787184e-01 -1.146604194405673e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.220000000000000e+02 -4.011350984121338e-01 -8.881921113759718e-01 -1.925283033459306e-01 -1.146222427023588e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.230000000000000e+02 -4.011218740076078e-01 -8.881922111498455e-01 -1.925781105610959e-01 -1.145840720959569e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.240000000000000e+02 -4.011086484915237e-01 -8.881923072072478e-01 -1.926279122310150e-01 -1.145459076208736e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.250000000000000e+02 -4.010954219054205e-01 -8.881923995339339e-01 -1.926777083402248e-01 -1.145077492811058e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.260000000000000e+02 -4.010821941891435e-01 -8.881924881537597e-01 -1.927274989142896e-01 -1.144695970723148e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.270000000000000e+02 -4.010689653989028e-01 -8.881925730469822e-01 -1.927772839318593e-01 -1.144314509996729e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.280000000000000e+02 -4.010557354961934e-01 -8.881926542293552e-01 -1.928270634096076e-01 -1.143933110607765e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.290000000000000e+02 -4.010425045087908e-01 -8.881927316917790e-01 -1.928768373377964e-01 -1.143551772583177e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.300000000000000e+02 -4.010292724259478e-01 -8.881928054396043e-01 -1.929266057219558e-01 -1.143170495921127e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.310000000000000e+02 -4.010160392337204e-01 -8.881928754793731e-01 -1.929763685689583e-01 -1.142789280616495e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.320000000000000e+02 -4.010028049744911e-01 -8.881929417965286e-01 -1.930261258630226e-01 -1.142408126710042e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.330000000000000e+02 -4.009895696280835e-01 -8.881930043999383e-01 -1.930758776136507e-01 -1.142027034190285e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.340000000000000e+02 -4.009763331612689e-01 -8.881930633033729e-01 -1.931256238353787e-01 -1.141646003037260e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.350000000000000e+02 -4.009630956444293e-01 -8.881931184817871e-01 -1.931753645012107e-01 -1.141265033314293e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.360000000000000e+02 -4.009498570117707e-01 -8.881931699611358e-01 -1.932250996389244e-01 -1.140884124973157e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.370000000000000e+02 -4.009366173145448e-01 -8.881932177235407e-01 -1.932748292291974e-01 -1.140503278061832e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.380000000000000e+02 -4.009233765198576e-01 -8.881932617826406e-01 -1.933245532864895e-01 -1.140122492559898e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.390000000000000e+02 -4.009101346520834e-01 -8.881933021306256e-01 -1.933742718022525e-01 -1.139741768493730e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.400000000000000e+02 -4.008968917020479e-01 -8.881933387722390e-01 -1.934239847815687e-01 -1.139361105860609e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.410000000000000e+02 -4.008836476633173e-01 -8.881933717112099e-01 -1.934736922282285e-01 -1.138980504662078e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.420000000000000e+02 -4.008704025528298e-01 -8.881934009425103e-01 -1.935233941367308e-01 -1.138599964917848e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.430000000000000e+02 -4.008571563692528e-01 -8.881934264679593e-01 -1.935730905088250e-01 -1.138219486633597e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.440000000000000e+02 -4.008439091034222e-01 -8.881934482922939e-01 -1.936227813495851e-01 -1.137839069806572e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.450000000000000e+02 -4.008306607586209e-01 -8.881934664156035e-01 -1.936724666589109e-01 -1.137458714446156e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.460000000000000e+02 -4.008174113487005e-01 -8.881934808340208e-01 -1.937221464324782e-01 -1.137078420570278e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.470000000000000e+02 -4.008041608678904e-01 -8.881934915510111e-01 -1.937718206740012e-01 -1.136698188178940e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.480000000000000e+02 -4.007909093079552e-01 -8.881934985709764e-01 -1.938214893879870e-01 -1.136318017272188e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.490000000000000e+02 -4.007776566707920e-01 -8.881935018945192e-01 -1.938711525749540e-01 -1.135937907857577e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.500000000000000e+02 -4.007644029869222e-01 -8.881935015115320e-01 -1.939208102239189e-01 -1.135557859966587e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.510000000000000e+02 -4.007511482208065e-01 -8.881934974366221e-01 -1.939704623504897e-01 -1.135177873575045e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.520000000000000e+02 -4.007378923870603e-01 -8.881934896656362e-01 -1.940201089500399e-01 -1.134797948701507e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.530000000000000e+02 -4.007246354916668e-01 -8.881934781976514e-01 -1.940697500213930e-01 -1.134418085357557e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.540000000000000e+02 -4.007113775390317e-01 -8.881934630323219e-01 -1.941193855641962e-01 -1.134038283551418e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.550000000000000e+02 -4.006981185123227e-01 -8.881934441772641e-01 -1.941690155863832e-01 -1.133658543276110e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.560000000000000e+02 -4.006848584290577e-01 -8.881934216272332e-01 -1.942186400822374e-01 -1.133278864551897e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.570000000000000e+02 -4.006715972907454e-01 -8.881933953829818e-01 -1.942682590523707e-01 -1.132899247386723e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.580000000000000e+02 -4.006583350833580e-01 -8.881933654510601e-01 -1.943178725037851e-01 -1.132519691773787e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.590000000000000e+02 -4.006450718204642e-01 -8.881933318277064e-01 -1.943674804322794e-01 -1.132140197730841e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.600000000000000e+02 -4.006318075082920e-01 -8.881932945119067e-01 -1.944170828365827e-01 -1.131760765269673e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.610000000000000e+02 -4.006185421432057e-01 -8.881932535063213e-01 -1.944666797195500e-01 -1.131381394391946e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.620000000000000e+02 -4.006052757099758e-01 -8.881932088179634e-01 -1.945162710884656e-01 -1.131002085091913e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.630000000000000e+02 -4.005920082312323e-01 -8.881931604396764e-01 -1.945658569355827e-01 -1.130622837394059e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.640000000000000e+02 -4.005787397020048e-01 -8.881931083746349e-01 -1.946154372640962e-01 -1.130243651301015e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.650000000000000e+02 -4.005654701310539e-01 -8.881930526208603e-01 -1.946650120719187e-01 -1.129864526824570e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.660000000000000e+02 -4.005521994943607e-01 -8.881929931886527e-01 -1.947145813698321e-01 -1.129485463951748e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.670000000000000e+02 -4.005389278111939e-01 -8.881929300721124e-01 -1.947641451514342e-01 -1.129106462704307e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.680000000000000e+02 -4.005256550928096e-01 -8.881928632683431e-01 -1.948137034134544e-01 -1.128727523098163e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.690000000000000e+02 -4.005123813274289e-01 -8.881927927830490e-01 -1.948632561619874e-01 -1.128348645128275e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.700000000000000e+02 -4.004991065052609e-01 -8.881927186212047e-01 -1.949128034021411e-01 -1.127969828793280e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.710000000000000e+02 -4.004858306544326e-01 -8.881926407736045e-01 -1.949623451239312e-01 -1.127591074122935e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.720000000000000e+02 -4.004725537568165e-01 -8.881925592483247e-01 -1.950118813359751e-01 -1.127212381106966e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.730000000000000e+02 -4.004592758139925e-01 -8.881924740460874e-01 -1.950614120388541e-01 -1.126833749753330e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.740000000000000e+02 -4.004459968355371e-01 -8.881923851646181e-01 -1.951109372300332e-01 -1.126455180075882e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.750000000000000e+02 -4.004327168199942e-01 -8.881922926057737e-01 -1.951604569113024e-01 -1.126076672080090e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.760000000000000e+02 -4.004194357709473e-01 -8.881921963695106e-01 -1.952099710826389e-01 -1.125698225773504e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.770000000000000e+02 -4.004061536760208e-01 -8.881920964617674e-01 -1.952594797501730e-01 -1.125319841152589e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.780000000000000e+02 -4.003928705571771e-01 -8.881919928756444e-01 -1.953089829063847e-01 -1.124941518242098e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.790000000000000e+02 -4.003795864049733e-01 -8.881918856159675e-01 -1.953584805564289e-01 -1.124563257038845e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.800000000000000e+02 -4.003663012133157e-01 -8.881917746863252e-01 -1.954079727039366e-01 -1.124185057544454e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.810000000000000e+02 -4.003530149939504e-01 -8.881916600836320e-01 -1.954574593455143e-01 -1.123806919774574e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.820000000000000e+02 -4.003397277423600e-01 -8.881915418108871e-01 -1.955069404841660e-01 -1.123428843732130e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.830000000000000e+02 -4.003264394696271e-01 -8.881914198652421e-01 -1.955564161168914e-01 -1.123050829430861e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.840000000000000e+02 -4.003131501568439e-01 -8.881912942550740e-01 -1.956058862524072e-01 -1.122672876861776e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.850000000000000e+02 -4.002998598351688e-01 -8.881911649700471e-01 -1.956553508795534e-01 -1.122294986057300e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.860000000000000e+02 -4.002865684829825e-01 -8.881910320195353e-01 -1.957048100083127e-01 -1.121917157004117e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.870000000000000e+02 -4.002732760978194e-01 -8.881908954057681e-01 -1.957542636408698e-01 -1.121539389706823e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.880000000000000e+02 -4.002599826984616e-01 -8.881907551230310e-01 -1.958037117710467e-01 -1.121161684186916e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.890000000000000e+02 -4.002466882834805e-01 -8.881906111731663e-01 -1.958531544006193e-01 -1.120784040449867e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.900000000000000e+02 -4.002333928415042e-01 -8.881904635617156e-01 -1.959025915354971e-01 -1.120406458490802e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.910000000000000e+02 -4.002200963772951e-01 -8.881903122882079e-01 -1.959520231749992e-01 -1.120028938320302e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.920000000000000e+02 -4.002067989033973e-01 -8.881901573492588e-01 -1.960014493154251e-01 -1.119651479954720e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.930000000000000e+02 -4.001935004136291e-01 -8.881899987484853e-01 -1.960508699604337e-01 -1.119274083395558e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.940000000000000e+02 -4.001802009058117e-01 -8.881898364879931e-01 -1.961002851122871e-01 -1.118896748645558e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.950000000000000e+02 -4.001669003755686e-01 -8.881896705707241e-01 -1.961496947739262e-01 -1.118519475707695e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.960000000000000e+02 -4.001535988492752e-01 -8.881895009881325e-01 -1.961990989361111e-01 -1.118142264610544e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.970000000000000e+02 -4.001402963064723e-01 -8.881893277491513e-01 -1.962484976083445e-01 -1.117765115341634e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.980000000000000e+02 -4.001269927490025e-01 -8.881891508543990e-01 -1.962978907911032e-01 -1.117388027909103e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.990000000000000e+02 -4.001136881807090e-01 -8.881889703037400e-01 -1.963472784841360e-01 -1.117011002322078e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.000000000000000e+02 -4.001003826147481e-01 -8.881887860935672e-01 -1.963966606834432e-01 -1.116634038598152e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.010000000000000e+02 -4.000870760342614e-01 -8.881885982314663e-01 -1.964460373970944e-01 -1.116257136727798e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.020000000000000e+02 -4.000737684548324e-01 -8.881884067129229e-01 -1.964954086201305e-01 -1.115880296730637e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.030000000000000e+02 -4.000604598637504e-01 -8.881882115439887e-01 -1.965447743587865e-01 -1.115503518602654e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.040000000000000e+02 -4.000471502678912e-01 -8.881880127233847e-01 -1.965941346117391e-01 -1.115126802354123e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.050000000000000e+02 -4.000338396937662e-01 -8.881878102425167e-01 -1.966434893697127e-01 -1.114750148013851e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.060000000000000e+02 -4.000205280830855e-01 -8.881876041244480e-01 -1.966928386570231e-01 -1.114373555538929e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.070000000000000e+02 -4.000072155032842e-01 -8.881873943453042e-01 -1.967421824482180e-01 -1.113997024992447e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.080000000000000e+02 -3.999939019158310e-01 -8.881871809207598e-01 -1.967915207599251e-01 -1.113620556346649e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.090000000000000e+02 -3.999805873191558e-01 -8.881869638527035e-01 -1.968408535939683e-01 -1.113244149606798e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.100000000000000e+02 -3.999672717499990e-01 -8.881867431287235e-01 -1.968901809370395e-01 -1.112867804810314e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.110000000000000e+02 -3.999539551703868e-01 -8.881865187642826e-01 -1.969395028055352e-01 -1.112491521929851e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.120000000000000e+02 -3.999406376054903e-01 -8.881862907512870e-01 -1.969888191907190e-01 -1.112115300993132e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.130000000000000e+02 -3.999273190375959e-01 -8.881860590976465e-01 -1.970381301008542e-01 -1.111739141991159e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.140000000000000e+02 -3.999139994890356e-01 -8.881858237963273e-01 -1.970874355283297e-01 -1.111363044949290e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.150000000000000e+02 -3.999006789611957e-01 -8.881855848480991e-01 -1.971367354739957e-01 -1.110987009873236e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.160000000000000e+02 -3.998873574160470e-01 -8.881853422684558e-01 -1.971860299540628e-01 -1.110611036737527e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.170000000000000e+02 -3.998740349058309e-01 -8.881850960391976e-01 -1.972353189491867e-01 -1.110235125592062e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.180000000000000e+02 -3.998607114063271e-01 -8.881848461706647e-01 -1.972846024701286e-01 -1.109859276423005e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.190000000000000e+02 -3.998473869192974e-01 -8.881845926634845e-01 -1.973338805175874e-01 -1.109483489236354e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.200000000000000e+02 -3.998340614504416e-01 -8.881843355168304e-01 -1.973831530905199e-01 -1.109107764043483e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.210000000000000e+02 -3.998207350012798e-01 -8.881840747314367e-01 -1.974324201895321e-01 -1.108732100852243e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.220000000000000e+02 -3.998074075674466e-01 -8.881838103102159e-01 -1.974816818177384e-01 -1.108356499663445e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.230000000000000e+02 -3.997940791493050e-01 -8.881835422543320e-01 -1.975309379761988e-01 -1.107980960483958e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.240000000000000e+02 -3.997807497586855e-01 -8.881832705606666e-01 -1.975801886615198e-01 -1.107605483329654e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.250000000000000e+02 -3.997674194015488e-01 -8.881829952282960e-01 -1.976294338725587e-01 -1.107230068212152e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.260000000000000e+02 -3.997540880484010e-01 -8.881827162695052e-01 -1.976786736223248e-01 -1.106854715110966e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.270000000000000e+02 -3.997407557266106e-01 -8.881824336753834e-01 -1.977279079012425e-01 -1.106479424055826e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.280000000000000e+02 -3.997274224371223e-01 -8.881821474468786e-01 -1.977771367101454e-01 -1.106104195054089e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.290000000000000e+02 -3.997140881671729e-01 -8.881818575900321e-01 -1.978263600554496e-01 -1.105729028099424e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.300000000000000e+02 -3.997007529417532e-01 -8.881815640968229e-01 -1.978755779285245e-01 -1.105353923219583e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.310000000000000e+02 -3.996874167181199e-01 -8.881812669844841e-01 -1.979247903474532e-01 -1.104978880384132e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.320000000000000e+02 -3.996740795572739e-01 -8.881809662315641e-01 -1.979739972894414e-01 -1.104603899651427e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.330000000000000e+02 -3.996607414070126e-01 -8.881806618588117e-01 -1.980231987764151e-01 -1.104228980981596e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.340000000000000e+02 -3.996474022894155e-01 -8.881803538592904e-01 -1.980723948008918e-01 -1.103854124399934e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.350000000000000e+02 -3.996340622164756e-01 -8.881800422298258e-01 -1.981215853593599e-01 -1.103479329923180e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.360000000000000e+02 -3.996207211774467e-01 -8.881797269757049e-01 -1.981707704574362e-01 -1.103104597546679e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.370000000000000e+02 -3.996073791767645e-01 -8.881794080965707e-01 -1.982199500945794e-01 -1.102729927280737e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.380000000000000e+02 -3.995940362084828e-01 -8.881790855959307e-01 -1.982691242743912e-01 -1.102355319126122e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.390000000000000e+02 -3.995806922814515e-01 -8.881787594717819e-01 -1.983182929945960e-01 -1.101980773096907e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.400000000000000e+02 -3.995673473968585e-01 -8.881784297249604e-01 -1.983674562561190e-01 -1.101606289198577e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.410000000000000e+02 -3.995540015598410e-01 -8.881780963548475e-01 -1.984166140581450e-01 -1.101231867442048e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.420000000000000e+02 -3.995406547521992e-01 -8.881777593695167e-01 -1.984657664090841e-01 -1.100857507817599e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.430000000000000e+02 -3.995273069995705e-01 -8.881774187607073e-01 -1.985149133000730e-01 -1.100483210353660e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.440000000000000e+02 -3.995139582896404e-01 -8.881770745342871e-01 -1.985640547373363e-01 -1.100108975044163e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.450000000000000e+02 -3.995006086196615e-01 -8.881767266925746e-01 -1.986131907231524e-01 -1.099734801893274e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.460000000000000e+02 -3.994872580107789e-01 -8.881763752289842e-01 -1.986623212504269e-01 -1.099360690925600e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.470000000000000e+02 -3.994739064348775e-01 -8.881760201552706e-01 -1.987114463315781e-01 -1.098986642121522e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.480000000000000e+02 -3.994605539241805e-01 -8.881756614607198e-01 -1.987605659551693e-01 -1.098612655515154e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.490000000000000e+02 -3.994472004613606e-01 -8.881752991530767e-01 -1.988096801292594e-01 -1.098238731097474e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.500000000000000e+02 -3.994338460419187e-01 -8.881749332353109e-01 -1.988587888568113e-01 -1.097864868871110e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.510000000000000e+02 -3.994204906828771e-01 -8.881745637023563e-01 -1.989078921325422e-01 -1.097491068855126e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.520000000000000e+02 -3.994071343764757e-01 -8.881741905583970e-01 -1.989569899606938e-01 -1.097117331049355e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.530000000000000e+02 -3.993937771327477e-01 -8.881738138009878e-01 -1.990060823385357e-01 -1.096743655468914e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.540000000000000e+02 -3.993804189461510e-01 -8.881734334334692e-01 -1.990551692696280e-01 -1.096370042113498e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.550000000000000e+02 -3.993670598064277e-01 -8.881730494609544e-01 -1.991042507591875e-01 -1.095996490980752e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.560000000000000e+02 -3.993536997334354e-01 -8.881726618773319e-01 -1.991533268006998e-01 -1.095623002093578e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.570000000000000e+02 -3.993403387187927e-01 -8.881722706870161e-01 -1.992023973986466e-01 -1.095249575451248e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.580000000000000e+02 -3.993269767738732e-01 -8.881718758870449e-01 -1.992514625499646e-01 -1.094876211068002e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.590000000000000e+02 -3.993136138785801e-01 -8.881714774861946e-01 -1.993005222637175e-01 -1.094502908932991e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.600000000000000e+02 -3.993002500678052e-01 -8.881710754727612e-01 -1.993495765274528e-01 -1.094129669082796e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.610000000000000e+02 -3.992868853092601e-01 -8.881706698600434e-01 -1.993986253551901e-01 -1.093756491493991e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.620000000000000e+02 -3.992735196185007e-01 -8.881702606435379e-01 -1.994476687420425e-01 -1.093383376186471e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.630000000000000e+02 -3.992601529968600e-01 -8.881698478240332e-01 -1.994967066887503e-01 -1.093010323167188e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.640000000000000e+02 -3.992467854413441e-01 -8.881694314039340e-01 -1.995457391976830e-01 -1.092637332440015e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.650000000000000e+02 -3.992334169658929e-01 -8.881690113793222e-01 -1.995947662647790e-01 -1.092264404021443e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.660000000000000e+02 -3.992200475499232e-01 -8.881685877591512e-01 -1.996437878992807e-01 -1.091891537900125e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.670000000000000e+02 -3.992066772160844e-01 -8.881681605362716e-01 -1.996928040935987e-01 -1.091518734101451e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.680000000000000e+02 -3.991933059492870e-01 -8.881677297175904e-01 -1.997418148548261e-01 -1.091145992618817e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.690000000000000e+02 -3.991799337609579e-01 -8.881672953001244e-01 -1.997908201798859e-01 -1.090773313466541e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.700000000000000e+02 -3.991665606464065e-01 -8.881668572869085e-01 -1.998398200718079e-01 -1.090400696647011e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.710000000000000e+02 -3.991531866215006e-01 -8.881664156733242e-01 -1.998888145255947e-01 -1.090028142180460e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.720000000000000e+02 -3.991398116631246e-01 -8.881659704692471e-01 -1.999378035516560e-01 -1.089655650051237e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.730000000000000e+02 -3.991264357853020e-01 -8.881655216707438e-01 -1.999867871457149e-01 -1.089283220277962e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.740000000000000e+02 -3.991130589833546e-01 -8.881650692808379e-01 -2.000357653108560e-01 -1.088910852862336e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.750000000000000e+02 -3.990996812761242e-01 -8.881646132938040e-01 -2.000847380409266e-01 -1.088538547827195e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.760000000000000e+02 -3.990863026480060e-01 -8.881641537167194e-01 -2.001337053433997e-01 -1.088166305163372e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.770000000000000e+02 -3.990729231009212e-01 -8.881636905501558e-01 -2.001826672187219e-01 -1.087794124878981e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.780000000000000e+02 -3.990595426479037e-01 -8.881632237905490e-01 -2.002316236630079e-01 -1.087422006991817e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.790000000000000e+02 -3.990461612767980e-01 -8.881627534436911e-01 -2.002805746823818e-01 -1.087049951495689e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.800000000000000e+02 -3.990327789900687e-01 -8.881622795099511e-01 -2.003295202770786e-01 -1.086677958399176e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.810000000000000e+02 -3.990193957946027e-01 -8.881618019880463e-01 -2.003784604456731e-01 -1.086306027714039e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.820000000000000e+02 -3.990060116855660e-01 -8.881613208810605e-01 -2.004273951912446e-01 -1.085934159442487e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.830000000000000e+02 -3.989926266779616e-01 -8.881608361846798e-01 -2.004763245093336e-01 -1.085562353602024e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.840000000000000e+02 -3.989792407648986e-01 -8.881603479027529e-01 -2.005252484038212e-01 -1.085190610193062e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.850000000000000e+02 -3.989658539366757e-01 -8.881598560401737e-01 -2.005741668796792e-01 -1.084818929213541e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.860000000000000e+02 -3.989524661969081e-01 -8.881593605968632e-01 -2.006230799368827e-01 -1.084447310670998e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.870000000000000e+02 -3.989390775791584e-01 -8.881588615616218e-01 -2.006719875635652e-01 -1.084075754601240e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.880000000000000e+02 -3.989256880362067e-01 -8.881583589532921e-01 -2.007208897793605e-01 -1.083704260968672e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.890000000000000e+02 -3.989122975946099e-01 -8.881578527632786e-01 -2.007697865751294e-01 -1.083332829802948e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.900000000000000e+02 -3.988989062670315e-01 -8.881573429881386e-01 -2.008186779473302e-01 -1.082961461119570e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.910000000000000e+02 -3.988855140275682e-01 -8.881568296387888e-01 -2.008675639072328e-01 -1.082590154902231e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.920000000000000e+02 -3.988721208910789e-01 -8.881563127109795e-01 -2.009164444503148e-01 -1.082218911169694e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.930000000000000e+02 -3.988587268620690e-01 -8.881557922043185e-01 -2.009653195760197e-01 -1.081847729932327e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.940000000000000e+02 -3.988453319461346e-01 -8.881552681179899e-01 -2.010141892835567e-01 -1.081476611199424e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.950000000000000e+02 -3.988319361148444e-01 -8.881547404638472e-01 -2.010630535851668e-01 -1.081105554952399e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.960000000000000e+02 -3.988185394019973e-01 -8.881542092306054e-01 -2.011119124689112e-01 -1.080734561227362e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.970000000000000e+02 -3.988051418025805e-01 -8.881536744213918e-01 -2.011607659381211e-01 -1.080363630024285e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.980000000000000e+02 -3.987917433125233e-01 -8.881531360390025e-01 -2.012096139955712e-01 -1.079992761345989e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>2.990000000000000e+02 -3.987783439185213e-01 -8.881525940896574e-01 -2.012584566476833e-01 -1.079621955186460e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.000000000000000e+02 -3.987649436495413e-01 -8.881520485638699e-01 -2.013072938844047e-01 -1.079251211577615e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.010000000000000e+02 -3.987515424874932e-01 -8.881514994696271e-01 -2.013561257141391e-01 -1.078880530507875e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.020000000000000e+02 -3.987381404492090e-01 -8.881509468019533e-01 -2.014049521315482e-01 -1.078509911998476e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.030000000000000e+02 -3.987247375174070e-01 -8.881503905685521e-01 -2.014537731445301e-01 -1.078139356040564e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.040000000000000e+02 -3.987113336967013e-01 -8.881498307689700e-01 -2.015025887526751e-01 -1.077768862642544e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.050000000000000e+02 -3.986979290020879e-01 -8.881492673989134e-01 -2.015513989513595e-01 -1.077398431824054e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.060000000000000e+02 -3.986845234198358e-01 -8.881487004647594e-01 -2.016002037471636e-01 -1.077028063578666e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.070000000000000e+02 -3.986711169733983e-01 -8.881481299590707e-01 -2.016490031321876e-01 -1.076657757933512e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.080000000000000e+02 -3.986577096337435e-01 -8.881475558938969e-01 -2.016977971190660e-01 -1.076287514867246e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.090000000000000e+02 -3.986443014072901e-01 -8.881469782681319e-01 -2.017465857065012e-01 -1.075917334391905e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.100000000000000e+02 -3.986308923268293e-01 -8.881463970708691e-01 -2.017953688829802e-01 -1.075547216542923e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.110000000000000e+02 -3.986174823612487e-01 -8.881458123149292e-01 -2.018441466619375e-01 -1.075177161297078e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.120000000000000e+02 -3.986040715230434e-01 -8.881452239969481e-01 -2.018929190397244e-01 -1.074807168671811e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.130000000000000e+02 -3.985906597962182e-01 -8.881446321241389e-01 -2.019416860237882e-01 -1.074437238658605e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.140000000000000e+02 -3.985772472224351e-01 -8.881440366823019e-01 -2.019904475991899e-01 -1.074067371300830e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.150000000000000e+02 -3.985638337617907e-01 -8.881434376875205e-01 -2.020392037827575e-01 -1.073697566567370e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.160000000000000e+02 -3.985504194345357e-01 -8.881428351335479e-01 -2.020879545678424e-01 -1.073327824482580e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.170000000000000e+02 -3.985370042366623e-01 -8.881422290231441e-01 -2.021366999572499e-01 -1.072958145048576e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.180000000000000e+02 -3.985235881769948e-01 -8.881416193543075e-01 -2.021854399487567e-01 -1.072588528279566e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.190000000000000e+02 -3.985101712489636e-01 -8.881410061307365e-01 -2.022341745462834e-01 -1.072218974174033e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.200000000000000e+02 -3.984967534599925e-01 -8.881403893509497e-01 -2.022829037481496e-01 -1.071849482744946e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.210000000000000e+02 -3.984833347980301e-01 -8.881397690206989e-01 -2.023316275602049e-01 -1.071480053987905e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.220000000000000e+02 -3.984699152818039e-01 -8.881391451342857e-01 -2.023803459765879e-01 -1.071110687923932e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.230000000000000e+02 -3.984564949062327e-01 -8.881385176948731e-01 -2.024290590004539e-01 -1.070741384554844e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.240000000000000e+02 -3.984430736505766e-01 -8.881378867114301e-01 -2.024777666410680e-01 -1.070372143867790e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.250000000000000e+02 -3.984296515647939e-01 -8.881372521666819e-01 -2.025264688803195e-01 -1.070002965913725e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.260000000000000e+02 -3.984162286009565e-01 -8.881366140796806e-01 -2.025751657381007e-01 -1.069633850654153e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.270000000000000e+02 -3.984028047813991e-01 -8.881359724434067e-01 -2.026238572069735e-01 -1.069264798115358e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.280000000000000e+02 -3.983893801151698e-01 -8.881353272557758e-01 -2.026725432846348e-01 -1.068895808311773e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.290000000000000e+02 -3.983759545970577e-01 -8.881346785199775e-01 -2.027212239744742e-01 -1.068526881243060e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.300000000000000e+02 -3.983625282126521e-01 -8.881340262426353e-01 -2.027698992832424e-01 -1.068158016902635e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.310000000000000e+02 -3.983491009817174e-01 -8.881333704176787e-01 -2.028185692045631e-01 -1.067789215313854e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.320000000000000e+02 -3.983356729019608e-01 -8.881327110472321e-01 -2.028672337405109e-01 -1.067420476480991e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.330000000000000e+02 -3.983222439708378e-01 -8.881320481334939e-01 -2.029158928934433e-01 -1.067051800406068e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.340000000000000e+02 -3.983088141880246e-01 -8.881313816778570e-01 -2.029645466646739e-01 -1.066683187095111e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.350000000000000e+02 -3.982953835677591e-01 -8.881307116763091e-01 -2.030131950499017e-01 -1.066314636567227e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.360000000000000e+02 -3.982819520940500e-01 -8.881300381360390e-01 -2.030618380566677e-01 -1.065946148812360e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.370000000000000e+02 -3.982685197673524e-01 -8.881293610581481e-01 -2.031104756859837e-01 -1.065577723837217e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.380000000000000e+02 -3.982550866057685e-01 -8.881286804371851e-01 -2.031591079321242e-01 -1.065209361663709e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.390000000000000e+02 -3.982416525996861e-01 -8.881279962779876e-01 -2.032077347999814e-01 -1.064841062289517e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.400000000000000e+02 -3.982282177580369e-01 -8.881273085784938e-01 -2.032563562874901e-01 -1.064472825726965e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.410000000000000e+02 -3.982147820699808e-01 -8.881266173439967e-01 -2.033049724000137e-01 -1.064104651972606e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.420000000000000e+02 -3.982013455324760e-01 -8.881259225768888e-01 -2.033535831399717e-01 -1.063736541029317e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.430000000000000e+02 -3.981879081787379e-01 -8.881252242661173e-01 -2.034021884957648e-01 -1.063368492933344e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.440000000000000e+02 -3.981744699791568e-01 -8.881245224239187e-01 -2.034507884801666e-01 -1.063000507662285e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.450000000000000e+02 -3.981610309219518e-01 -8.881238170559321e-01 -2.034993830988951e-01 -1.062632585211789e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.460000000000000e+02 -3.981475910644313e-01 -8.881231081421683e-01 -2.035479723310874e-01 -1.062264725639881e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.470000000000000e+02 -3.981341503528046e-01 -8.881223957038316e-01 -2.035965561988128e-01 -1.061896928902284e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.480000000000000e+02 -3.981207088101999e-01 -8.881216797336111e-01 -2.036451346943603e-01 -1.061529195026167e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.490000000000000e+02 -3.981072664398515e-01 -8.881209602315699e-01 -2.036937078177356e-01 -1.061161524020077e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.500000000000000e+02 -3.980938232437343e-01 -8.881202371982445e-01 -2.037422755693672e-01 -1.060793915892091e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.510000000000000e+02 -3.980803792104824e-01 -8.881195106390988e-01 -2.037908379549964e-01 -1.060426370636202e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.520000000000000e+02 -3.980669343567321e-01 -8.881187805492313e-01 -2.038393949694161e-01 -1.060058888273751e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.530000000000000e+02 -3.980534886627525e-01 -8.881180469372267e-01 -2.038879466213939e-01 -1.059691468793137e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.540000000000000e+02 -3.980400421577638e-01 -8.881173097934980e-01 -2.039364929010762e-01 -1.059324112225115e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.550000000000000e+02 -3.980265948252056e-01 -8.881165691254527e-01 -2.039850338160110e-01 -1.058956818560956e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.560000000000000e+02 -3.980131466547874e-01 -8.881158249381677e-01 -2.040335693713972e-01 -1.058589587796913e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.570000000000000e+02 -3.979996976953681e-01 -8.881150772147930e-01 -2.040820995496615e-01 -1.058222419983622e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.580000000000000e+02 -3.979862478785634e-01 -8.881143259819314e-01 -2.041306243784282e-01 -1.057855315063242e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.590000000000000e+02 -3.979727972622621e-01 -8.881135712193863e-01 -2.041791438366625e-01 -1.057488273094621e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.600000000000000e+02 -3.979593458224221e-01 -8.881128129373366e-01 -2.042276579347767e-01 -1.057121294062185e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.610000000000000e+02 -3.979458935743317e-01 -8.881120511313623e-01 -2.042761666682779e-01 -1.056754377984098e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.620000000000000e+02 -3.979324404899181e-01 -8.881112858131344e-01 -2.043246700491179e-01 -1.056387524841073e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.630000000000000e+02 -3.979189866059125e-01 -8.881105169702962e-01 -2.043731680644567e-01 -1.056020734672129e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.640000000000000e+02 -3.979055319038046e-01 -8.881097446109738e-01 -2.044216607225774e-01 -1.055654007466681e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.650000000000000e+02 -3.978920763829453e-01 -8.881089687366537e-01 -2.044701480250992e-01 -1.055287343228376e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.660000000000000e+02 -3.978786200611550e-01 -8.881081893419953e-01 -2.045186299663763e-01 -1.054920741979723e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.670000000000000e+02 -3.978651629141228e-01 -8.881074064372658e-01 -2.045671065569714e-01 -1.054554203704119e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.680000000000000e+02 -3.978517049741043e-01 -8.881066200117761e-01 -2.046155777857099e-01 -1.054187728437262e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.690000000000000e+02 -3.978382462193835e-01 -8.881058300748180e-01 -2.046640436622824e-01 -1.053821316163567e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.700000000000000e+02 -3.978247866477102e-01 -8.881050366284883e-01 -2.047125041887328e-01 -1.053454966887212e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.710000000000000e+02 -3.978113262890041e-01 -8.881042396629639e-01 -2.047609593547884e-01 -1.053088680641805e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.720000000000000e+02 -3.977978651153463e-01 -8.881034391898336e-01 -2.048094091725096e-01 -1.052722457406046e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.730000000000000e+02 -3.977844031337124e-01 -8.881026352077745e-01 -2.048578536404075e-01 -1.052356297192551e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.740000000000000e+02 -3.977709403418838e-01 -8.881018277188649e-01 -2.049062927605759e-01 -1.051990200004846e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.750000000000000e+02 -3.977574767775341e-01 -8.881010167104100e-01 -2.049547265197849e-01 -1.051624165883697e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.760000000000000e+02 -3.977440123878554e-01 -8.881002022032158e-01 -2.050031549396062e-01 -1.051258194784939e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.770000000000000e+02 -3.977305471981926e-01 -8.880993841891541e-01 -2.050515780115260e-01 -1.050892286738020e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.780000000000000e+02 -3.977170812308789e-01 -8.880985626612146e-01 -2.050999957281888e-01 -1.050526441769680e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.790000000000000e+02 -3.977036144481095e-01 -8.880977376346415e-01 -2.051484081054176e-01 -1.050160659849435e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.800000000000000e+02 -3.976901468757384e-01 -8.880969091011202e-01 -2.051968151345105e-01 -1.049794941007251e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.810000000000000e+02 -3.976766785105021e-01 -8.880960770631129e-01 -2.052452168179603e-01 -1.049429285245689e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.820000000000000e+02 -3.976632093438648e-01 -8.880952415250418e-01 -2.052936131602101e-01 -1.049063692563119e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.830000000000000e+02 -3.976497394048033e-01 -8.880944024774159e-01 -2.053420041515588e-01 -1.048698162990419e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.840000000000000e+02 -3.976362686455988e-01 -8.880935599391671e-01 -2.053903898114144e-01 -1.048332696489890e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.850000000000000e+02 -3.976227971205101e-01 -8.880927138914617e-01 -2.054387701202375e-01 -1.047967293117695e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.860000000000000e+02 -3.976093247929366e-01 -8.880918643490934e-01 -2.054871450933715e-01 -1.047601952844340e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.870000000000000e+02 -3.975958516772344e-01 -8.880910113080044e-01 -2.055355147265158e-01 -1.047236675689260e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.880000000000000e+02 -3.975823777831002e-01 -8.880901547658576e-01 -2.055838790172143e-01 -1.046871461666935e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.890000000000000e+02 -3.975689031039613e-01 -8.880892947263452e-01 -2.056322379691568e-01 -1.046506310777526e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.900000000000000e+02 -3.975554276376895e-01 -8.880884311914938e-01 -2.056805915845220e-01 -1.046141223023269e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.910000000000000e+02 -3.975419513782280e-01 -8.880875641648036e-01 -2.057289398668002e-01 -1.045776198404759e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.920000000000000e+02 -3.975284743550555e-01 -8.880866936366130e-01 -2.057772828059927e-01 -1.045411236954778e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.930000000000000e+02 -3.975149965288640e-01 -8.880858196227306e-01 -2.058256204182675e-01 -1.045046338643188e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.940000000000000e+02 -3.975015179455716e-01 -8.880849421073974e-01 -2.058739526874866e-01 -1.044681503516645e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.950000000000000e+02 -3.974880385662702e-01 -8.880840611062715e-01 -2.059222796296599e-01 -1.044316731545358e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.960000000000000e+02 -3.974745584137002e-01 -8.880831766121933e-01 -2.059706012373013e-01 -1.043952022756558e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.970000000000000e+02 -3.974610774964542e-01 -8.880822886232191e-01 -2.060189175085044e-01 -1.043587377162405e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.980000000000000e+02 -3.974475957909823e-01 -8.880813971493217e-01 -2.060672284534197e-01 -1.043222794747266e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.990000000000000e+02 -3.974341133053065e-01 -8.880805021887809e-01 -2.061155340702319e-01 -1.042858275524087e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.000000000000000e+02 -3.974206300664671e-01 -8.880796037328466e-01 -2.061638343498260e-01 -1.042493819524142e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.010000000000000e+02 -3.974071460417970e-01 -8.880787017948427e-01 -2.062121293060040e-01 -1.042129426721307e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.020000000000000e+02 -3.973936612404806e-01 -8.880777963726258e-01 -2.062604189364479e-01 -1.041765097130273e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.030000000000000e+02 -3.973801756918794e-01 -8.880768874565873e-01 -2.063087032311645e-01 -1.041400830784512e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.040000000000000e+02 -3.973666893576012e-01 -8.880759750621670e-01 -2.063569822061269e-01 -1.041036627652522e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.050000000000000e+02 -3.973532022531959e-01 -8.880750591848661e-01 -2.064052558565969e-01 -1.040672487754924e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.060000000000000e+02 -3.973397143940063e-01 -8.880741398202563e-01 -2.064535241779807e-01 -1.040308411111501e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.070000000000000e+02 -3.973262257611286e-01 -8.880732169765849e-01 -2.065017871786455e-01 -1.039944397710841e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.080000000000000e+02 -3.973127363752932e-01 -8.880722906474174e-01 -2.065500448520746e-01 -1.039580447576411e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.090000000000000e+02 -3.972992462130800e-01 -8.880713608426707e-01 -2.065982972083483e-01 -1.039216560692567e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.100000000000000e+02 -3.972857552989987e-01 -8.880704275545314e-01 -2.066465442393299e-01 -1.038852737088311e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.110000000000000e+02 -3.972722636170393e-01 -8.880694907901550e-01 -2.066947859524666e-01 -1.038488976752884e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.120000000000000e+02 -3.972587711859239e-01 -8.880685505438697e-01 -2.067430223418248e-01 -1.038125279709918e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.130000000000000e+02 -3.972452779744458e-01 -8.880676068284625e-01 -2.067912534204953e-01 -1.037761645935767e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.140000000000000e+02 -3.972317840268451e-01 -8.880666596288248e-01 -2.068394791728563e-01 -1.037398075477903e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.150000000000000e+02 -3.972182893221805e-01 -8.880657089539332e-01 -2.068876996082234e-01 -1.037034568320938e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.160000000000000e+02 -3.972047938581895e-01 -8.880647548058762e-01 -2.069359147286325e-01 -1.036671124468907e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.170000000000000e+02 -3.971912976272206e-01 -8.880637971887276e-01 -2.069841245382251e-01 -1.036307743920118e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.180000000000000e+02 -3.971778006626568e-01 -8.880628360913947e-01 -2.070323290255116e-01 -1.035944426711973e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.190000000000000e+02 -3.971643029372960e-01 -8.880618715251668e-01 -2.070805282021754e-01 -1.035581172823161e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.200000000000000e+02 -3.971508044613310e-01 -8.880609034875262e-01 -2.071287220655263e-01 -1.035217982269367e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.210000000000000e+02 -3.971373052432027e-01 -8.880599319766023e-01 -2.071769106135407e-01 -1.034854855064655e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.220000000000000e+02 -3.971238052737470e-01 -8.880589569970135e-01 -2.072250938510557e-01 -1.034491791204581e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.230000000000000e+02 -3.971103045489445e-01 -8.880579785514958e-01 -2.072732717807703e-01 -1.034128790691504e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.240000000000000e+02 -3.970968030861409e-01 -8.880569966348797e-01 -2.073214443973485e-01 -1.033765853547173e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.250000000000000e+02 -3.970833008717875e-01 -8.880560112534233e-01 -2.073696117071004e-01 -1.033402979765014e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.260000000000000e+02 -3.970697979303666e-01 -8.880550223993062e-01 -2.074177737021139e-01 -1.033040169372160e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.270000000000000e+02 -3.970562942146995e-01 -8.880540300912148e-01 -2.074659304014329e-01 -1.032677422330399e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.280000000000000e+02 -3.970427897963283e-01 -8.880530343039572e-01 -2.075140817791410e-01 -1.032314738713136e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.290000000000000e+02 -3.970292846056566e-01 -8.880520350644820e-01 -2.075622278629509e-01 -1.031952118459036e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.300000000000000e+02 -3.970157786980711e-01 -8.880510323535696e-01 -2.076103686330707e-01 -1.031589561626351e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.310000000000000e+02 -3.970022720318831e-01 -8.880500261878660e-01 -2.076585041065152e-01 -1.031227068181284e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.320000000000000e+02 -3.969887646508357e-01 -8.880490165524554e-01 -2.077066342679077e-01 -1.030864638171170e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.330000000000000e+02 -3.969752565123745e-01 -8.880480034642891e-01 -2.077547591347082e-01 -1.030502271560026e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.340000000000000e+02 -3.969617476440506e-01 -8.880469869144341e-01 -2.078028786976685e-01 -1.030139968379936e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.350000000000000e+02 -3.969482380651077e-01 -8.880459668970277e-01 -2.078509929506885e-01 -1.029777728655201e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.360000000000000e+02 -3.969347277190199e-01 -8.880449434341802e-01 -2.078991019164999e-01 -1.029415552336573e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.370000000000000e+02 -3.969212166692365e-01 -8.880439165036970e-01 -2.079472055722904e-01 -1.029053439490080e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.380000000000000e+02 -3.969077048673709e-01 -8.880428861246927e-01 -2.079953039375848e-01 -1.028691390075459e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.390000000000000e+02 -3.968941923513618e-01 -8.880418522843985e-01 -2.080433969992204e-01 -1.028329404134668e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.400000000000000e+02 -3.968806791030413e-01 -8.880408149907509e-01 -2.080914847654215e-01 -1.027967481654656e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.410000000000000e+02 -3.968671651302134e-01 -8.880397742421127e-01 -2.081395672344135e-01 -1.027605622648911e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.420000000000000e+02 -3.968536504159349e-01 -8.880387300459802e-01 -2.081876444138301e-01 -1.027243827106821e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.430000000000000e+02 -3.968401350004894e-01 -8.880376823887197e-01 -2.082357162896347e-01 -1.026882095072636e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.440000000000000e+02 -3.968266188473425e-01 -8.880366312850493e-01 -2.082837828769793e-01 -1.026520426515868e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.450000000000000e+02 -3.968131019677203e-01 -8.880355767320663e-01 -2.083318441727979e-01 -1.026158821453237e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.460000000000000e+02 -3.967995843770827e-01 -8.880345187253067e-01 -2.083799001724309e-01 -1.025797279905498e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.470000000000000e+02 -3.967860660670386e-01 -8.880334572690922e-01 -2.084279508804029e-01 -1.025435801868814e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.480000000000000e+02 -3.967725470313746e-01 -8.880323923669613e-01 -2.084759963002306e-01 -1.025074387343359e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.490000000000000e+02 -3.967590272703796e-01 -8.880313240200426e-01 -2.085240364330378e-01 -1.024713036334833e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.500000000000000e+02 -3.967455068120124e-01 -8.880302522192571e-01 -2.085720712694557e-01 -1.024351748875899e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.510000000000000e+02 -3.967319856254131e-01 -8.880291769772211e-01 -2.086201008224771e-01 -1.023990524941315e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.520000000000000e+02 -3.967184637206789e-01 -8.880280982914490e-01 -2.086681250894669e-01 -1.023629364546760e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.530000000000000e+02 -3.967049411059618e-01 -8.880270161601731e-01 -2.087161440685250e-01 -1.023268267706067e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.540000000000000e+02 -3.966914177863310e-01 -8.880259305827448e-01 -2.087641577590998e-01 -1.022907234428171e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.550000000000000e+02 -3.966778937480712e-01 -8.880248415654679e-01 -2.088121661675295e-01 -1.022546264706082e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.560000000000000e+02 -3.966643689981605e-01 -8.880237491070021e-01 -2.088601692924192e-01 -1.022185358551852e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.570000000000000e+02 -3.966508435388114e-01 -8.880226532077712e-01 -2.089081671341066e-01 -1.021824515973664e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.580000000000000e+02 -3.966373173703330e-01 -8.880215538688820e-01 -2.089561596938321e-01 -1.021463736975900e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.590000000000000e+02 -3.966237905033248e-01 -8.880204510876636e-01 -2.090041469687778e-01 -1.021103021574746e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.600000000000000e+02 -3.966102629284252e-01 -8.880193448688115e-01 -2.090521289636389e-01 -1.020742369767335e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.610000000000000e+02 -3.965967346437053e-01 -8.880182352142574e-01 -2.091001056804964e-01 -1.020381781555904e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.620000000000000e+02 -3.965832056615470e-01 -8.880171221206713e-01 -2.091480771158630e-01 -1.020021256958347e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.630000000000000e+02 -3.965696759575199e-01 -8.880160055983017e-01 -2.091960432801590e-01 -1.019660795956695e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.640000000000000e+02 -3.965561455798540e-01 -8.880148856305918e-01 -2.092440041564192e-01 -1.019300398603149e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.650000000000000e+02 -3.965426144889608e-01 -8.880137622333674e-01 -2.092919597608844e-01 -1.018940064863909e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.660000000000000e+02 -3.965290826924049e-01 -8.880126354050759e-01 -2.093399100918798e-01 -1.018579794752249e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.670000000000000e+02 -3.965155502046575e-01 -8.880115051416106e-01 -2.093878551451985e-01 -1.018219588287435e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.680000000000000e+02 -3.965020170171595e-01 -8.880103714473681e-01 -2.094357949252270e-01 -1.017859445467314e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.690000000000000e+02 -3.964884831468123e-01 -8.880092343173299e-01 -2.094837294269718e-01 -1.017499366312169e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.700000000000000e+02 -3.964749485539926e-01 -8.880080937673517e-01 -2.095316586664840e-01 -1.017139350790015e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.710000000000000e+02 -3.964614132950124e-01 -8.880069497778984e-01 -2.095795826237860e-01 -1.016779398960960e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.720000000000000e+02 -3.964478773311534e-01 -8.880058023644690e-01 -2.096275013147715e-01 -1.016419510791884e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.730000000000000e+02 -3.964343406813136e-01 -8.880046515213299e-01 -2.096754147335142e-01 -1.016059686306987e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.740000000000000e+02 -3.964208033187816e-01 -8.880034972595632e-01 -2.097233228912687e-01 -1.015699925485959e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.750000000000000e+02 -3.964072652992071e-01 -8.880023395598808e-01 -2.097712257683234e-01 -1.015340228388358e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.760000000000000e+02 -3.963937265796940e-01 -8.880011784393197e-01 -2.098191233821272e-01 -1.014980594976987e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.770000000000000e+02 -3.963801871572645e-01 -8.880000139002128e-01 -2.098670157349627e-01 -1.014621025254989e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.780000000000000e+02 -3.963666470689737e-01 -8.879988459301321e-01 -2.099149028141030e-01 -1.014261519264084e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.790000000000000e+02 -3.963531062973119e-01 -8.879976745367495e-01 -2.099627846274686e-01 -1.013902076991469e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.800000000000000e+02 -3.963395648197475e-01 -8.879964997296080e-01 -2.100106611846724e-01 -1.013542698421439e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.810000000000000e+02 -3.963260226728166e-01 -8.879953214964644e-01 -2.100585324732495e-01 -1.013183383594584e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.820000000000000e+02 -3.963124798527599e-01 -8.879941398399401e-01 -2.101063984957787e-01 -1.012824132513322e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.830000000000000e+02 -3.962989363427879e-01 -8.879929547674389e-01 -2.101542592599032e-01 -1.012464945165484e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.840000000000000e+02 -3.962853921461922e-01 -8.879917662789816e-01 -2.102021147655560e-01 -1.012105821560259e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.850000000000000e+02 -3.962718472867091e-01 -8.879905743670514e-01 -2.102499650050161e-01 -1.011746761726601e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.860000000000000e+02 -3.962583017419044e-01 -8.879893790411324e-01 -2.102978099880364e-01 -1.011387765646876e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.870000000000000e+02 -3.962447555193550e-01 -8.879881802996645e-01 -2.103456497129472e-01 -1.011028833334409e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.880000000000000e+02 -3.962312086164205e-01 -8.879869781448475e-01 -2.103934841819648e-01 -1.010669964791994e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.890000000000000e+02 -3.962176610603134e-01 -8.879857725678846e-01 -2.104413133860742e-01 -1.010311160052003e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.900000000000000e+02 -3.962041128150442e-01 -8.879845635832523e-01 -2.104891373400926e-01 -1.009952419083609e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.910000000000000e+02 -3.961905639003966e-01 -8.879833511848921e-01 -2.105369560377855e-01 -1.009593741911977e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.920000000000000e+02 -3.961770143105010e-01 -8.879821353761919e-01 -2.105847694825754e-01 -1.009235128536761e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.930000000000000e+02 -3.961634640576664e-01 -8.879809161538482e-01 -2.106325776710272e-01 -1.008876578975901e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.940000000000000e+02 -3.961499131324813e-01 -8.879796935225399e-01 -2.106803806080098e-01 -1.008518093224296e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.950000000000000e+02 -3.961363615441878e-01 -8.879784674800933e-01 -2.107281782912355e-01 -1.008159671296917e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.960000000000000e+02 -3.961228092907333e-01 -8.879772380284957e-01 -2.107759707226377e-01 -1.007801313197766e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.970000000000000e+02 -3.961092563677830e-01 -8.879760051705546e-01 -2.108237579051862e-01 -1.007443018926654e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.980000000000000e+02 -3.960957027886530e-01 -8.879747689025947e-01 -2.108715398350733e-01 -1.007084788502516e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.990000000000000e+02 -3.960821485315253e-01 -8.879735292338780e-01 -2.109193165216739e-01 -1.006726621909462e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.000000000000000e+02 -3.960685936218325e-01 -8.879722861562646e-01 -2.109670879566561e-01 -1.006368519178223e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.010000000000000e+02 -3.960550380484328e-01 -8.879710396750680e-01 -2.110148541455300e-01 -1.006010480301969e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.020000000000000e+02 -3.960414818142318e-01 -8.879697897904484e-01 -2.110626150883761e-01 -1.005652505289514e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.030000000000000e+02 -3.960279249291494e-01 -8.879685364999808e-01 -2.111103707826580e-01 -1.005294594156510e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.040000000000000e+02 -3.960143673855930e-01 -8.879672798076705e-01 -2.111581212325587e-01 -1.004936746899572e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.050000000000000e+02 -3.960008091771527e-01 -8.879660197171073e-01 -2.112058664416337e-01 -1.004578963518415e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.060000000000000e+02 -3.959872503059127e-01 -8.879647562287446e-01 -2.112536064103298e-01 -1.004221244020383e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.070000000000000e+02 -3.959736908093545e-01 -8.879634893300075e-01 -2.113013411258368e-01 -1.003863588448059e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.080000000000000e+02 -3.959601306382026e-01 -8.879622190402504e-01 -2.113490706078757e-01 -1.003505996757325e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.090000000000000e+02 -3.959465698082926e-01 -8.879609453548689e-01 -2.113967948517053e-01 -1.003148468969598e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.100000000000000e+02 -3.959330083534352e-01 -8.879596682626409e-01 -2.114445138458910e-01 -1.002791005123922e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.110000000000000e+02 -3.959194462229693e-01 -8.879583877834270e-01 -2.114922276106576e-01 -1.002433605174742e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.120000000000000e+02 -3.959058834617111e-01 -8.879571039019530e-01 -2.115399361304728e-01 -1.002076269171871e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.130000000000000e+02 -3.958923200389411e-01 -8.879558166307491e-01 -2.115876394180040e-01 -1.001718997090547e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.140000000000000e+02 -3.958787559699038e-01 -8.879545259654297e-01 -2.116353374687366e-01 -1.001361788951649e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.150000000000000e+02 -3.958651912738153e-01 -8.879532319001253e-01 -2.116830302768655e-01 -1.001004644778016e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.160000000000000e+02 -3.958516259154862e-01 -8.879519344490174e-01 -2.117307178566537e-01 -1.000647564541101e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.170000000000000e+02 -3.958380599162246e-01 -8.879506336054799e-01 -2.117784002013931e-01 -1.000290548267097e-01 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.180000000000000e+02 -3.958244932756756e-01 -8.879493293708697e-01 -2.118260773123799e-01 -9.999335959616119e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.190000000000000e+02 -3.958109259923965e-01 -8.879480217469218e-01 -2.118737491914975e-01 -9.995767076272109e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.200000000000000e+02 -3.957973580693329e-01 -8.879467107337768e-01 -2.119214158388128e-01 -9.992198832727350e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.210000000000000e+02 -3.957837895167989e-01 -8.879453963288645e-01 -2.119690772516540e-01 -9.988631229142790e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.220000000000000e+02 -3.957702203228034e-01 -8.879440785378008e-01 -2.120167334358263e-01 -9.985064265440370e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.230000000000000e+02 -3.957566504757764e-01 -8.879427573660682e-01 -2.120643843967915e-01 -9.981497941565570e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.240000000000000e+02 -3.957430800103639e-01 -8.879414328021334e-01 -2.121120301228964e-01 -9.977932257912160e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.250000000000000e+02 -3.957295089027982e-01 -8.879401048559675e-01 -2.121596706241363e-01 -9.974367214305679e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.260000000000000e+02 -3.957159371703691e-01 -8.879387735224099e-01 -2.122073058954333e-01 -9.970802810956110e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.270000000000000e+02 -3.957023647901638e-01 -8.879374388111152e-01 -2.122549359464594e-01 -9.967239047697070e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.280000000000000e+02 -3.956887917793251e-01 -8.879361007169986e-01 -2.123025607720091e-01 -9.963675924756681e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.290000000000000e+02 -3.956752181599231e-01 -8.879347592331414e-01 -2.123501803652343e-01 -9.960113442392560e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.300000000000000e+02 -3.956616438898430e-01 -8.879334143762616e-01 -2.123977947429318e-01 -9.956551600248420e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.310000000000000e+02 -3.956480690001790e-01 -8.879320661361341e-01 -2.124454038947814e-01 -9.952990398683850e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.320000000000000e+02 -3.956344934812806e-01 -8.879307145175316e-01 -2.124930078255263e-01 -9.949429837662881e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.330000000000000e+02 -3.956209173309219e-01 -8.879293595224728e-01 -2.125406065373361e-01 -9.945869917203040e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.340000000000000e+02 -3.956073405619485e-01 -8.879280011474547e-01 -2.125882000266071e-01 -9.942310637490580e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.350000000000000e+02 -3.955937631736879e-01 -8.879266393939458e-01 -2.126357882947502e-01 -9.938751998578130e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.360000000000000e+02 -3.955801851543679e-01 -8.879252742674758e-01 -2.126833713474747e-01 -9.935194000388770e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.370000000000000e+02 -3.955666065191233e-01 -8.879239057636988e-01 -2.127309491803297e-01 -9.931636643131470e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.380000000000000e+02 -3.955530272471599e-01 -8.879225338914759e-01 -2.127785218022435e-01 -9.928079926652771e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.390000000000000e+02 -3.955394473731129e-01 -8.879211586392897e-01 -2.128260892015411e-01 -9.924523851355030e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.400000000000000e+02 -3.955258668784876e-01 -8.879197800151403e-01 -2.128736513864197e-01 -9.920968417094590e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.410000000000000e+02 -3.955122857640749e-01 -8.879183980199568e-01 -2.129212083577464e-01 -9.917413623938259e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.420000000000000e+02 -3.954987040258328e-01 -8.879170126564376e-01 -2.129687601182380e-01 -9.913859471898470e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.430000000000000e+02 -3.954851216804299e-01 -8.879156239196727e-01 -2.130163066628818e-01 -9.910305961199700e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.440000000000000e+02 -3.954715387186349e-01 -8.879142318142542e-01 -2.130638479964391e-01 -9.906753091789761e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.450000000000000e+02 -3.954579551423226e-01 -8.879128363407112e-01 -2.131113841193747e-01 -9.903200863746310e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.460000000000000e+02 -3.954443709596135e-01 -8.879114374972773e-01 -2.131589150298435e-01 -9.899649277209070e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.470000000000000e+02 -3.954307861611321e-01 -8.879100352885950e-01 -2.132064407326565e-01 -9.896098332124220e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.480000000000000e+02 -3.954172007452751e-01 -8.879086297164726e-01 -2.132539612295652e-01 -9.892548028534630e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.490000000000000e+02 -3.954036147259817e-01 -8.879072207769954e-01 -2.133014765166333e-01 -9.888998366631470e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.500000000000000e+02 -3.953900281096400e-01 -8.879058084690337e-01 -2.133489865926589e-01 -9.885449346537439e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.510000000000000e+02 -3.953764408691029e-01 -8.879043928037609e-01 -2.133964914690201e-01 -9.881900968021270e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.520000000000000e+02 -3.953628530366745e-01 -8.879029737705209e-01 -2.134439911349335e-01 -9.878353231463910e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.530000000000000e+02 -3.953492645959447e-01 -8.879015513765617e-01 -2.134914855976237e-01 -9.874806136760569e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.540000000000000e+02 -3.953356755487152e-01 -8.879001256224157e-01 -2.135389748577649e-01 -9.871259683968529e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.550000000000000e+02 -3.953220858938331e-01 -8.878986965097230e-01 -2.135864589169409e-01 -9.867713873134960e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.560000000000000e+02 -3.953084956462548e-01 -8.878972640341951e-01 -2.136339377708462e-01 -9.864168704461571e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.570000000000000e+02 -3.952949048052211e-01 -8.878958281973280e-01 -2.136814114209207e-01 -9.860624177999749e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.580000000000000e+02 -3.952813133433307e-01 -8.878943890103836e-01 -2.137288798786205e-01 -9.857080293514600e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.590000000000000e+02 -3.952677212991959e-01 -8.878929464603891e-01 -2.137763431308491e-01 -9.853537051451010e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.600000000000000e+02 -3.952541286585356e-01 -8.878915005538067e-01 -2.138238011840358e-01 -9.849994451724980e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.610000000000000e+02 -3.952405354176745e-01 -8.878900512931800e-01 -2.138712540408773e-01 -9.846452494338820e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.620000000000000e+02 -3.952269415701669e-01 -8.878885986820908e-01 -2.139187017049066e-01 -9.842911179286599e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.630000000000000e+02 -3.952133471444884e-01 -8.878871427112847e-01 -2.139661441668388e-01 -9.839370506905730e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.640000000000000e+02 -3.951997521218654e-01 -8.878856833888730e-01 -2.140135814347550e-01 -9.835830477066830e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.650000000000000e+02 -3.951861565069901e-01 -8.878842207143234e-01 -2.140610135082646e-01 -9.832291089856010e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.660000000000000e+02 -3.951725603034200e-01 -8.878827546875423e-01 -2.141084403872124e-01 -9.828752345367631e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.670000000000000e+02 -3.951589634994084e-01 -8.878812853140505e-01 -2.141558620771449e-01 -9.825214243535731e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.680000000000000e+02 -3.951453661138027e-01 -8.878798125881384e-01 -2.142032785722720e-01 -9.821676784608190e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.690000000000000e+02 -3.951317681484546e-01 -8.878783365103158e-01 -2.142506898732522e-01 -9.818139968642700e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.700000000000000e+02 -3.951181695852087e-01 -8.878768570884636e-01 -2.142980959879288e-01 -9.814603795515370e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.710000000000000e+02 -3.951045704451627e-01 -8.878753743160460e-01 -2.143454969096875e-01 -9.811068265496770e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.720000000000000e+02 -3.950909707185526e-01 -8.878738881978381e-01 -2.143928926434623e-01 -9.807533378527780e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.730000000000000e+02 -3.950773704021281e-01 -8.878723987362450e-01 -2.144402831916045e-01 -9.803999134634100e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.740000000000000e+02 -3.950637695111860e-01 -8.878709059268536e-01 -2.144876685497002e-01 -9.800465534021680e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.750000000000000e+02 -3.950501680290366e-01 -8.878694097770037e-01 -2.145350487250464e-01 -9.796932576580859e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.760000000000000e+02 -3.950365659807196e-01 -8.878679102786894e-01 -2.145824237097684e-01 -9.793400262602930e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.770000000000000e+02 -3.950229633354602e-01 -8.878664074444210e-01 -2.146297935163413e-01 -9.789868591836021e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.780000000000000e+02 -3.950093601397227e-01 -8.878649012583502e-01 -2.146771581288325e-01 -9.786337564807220e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.790000000000000e+02 -3.949957563373642e-01 -8.878633917422755e-01 -2.147245175692230e-01 -9.782807180988889e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.800000000000000e+02 -3.949821519722774e-01 -8.878618788812938e-01 -2.147718718225294e-01 -9.779277440882370e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.810000000000000e+02 -3.949685470264567e-01 -8.878603626832163e-01 -2.148192208965857e-01 -9.775748344357681e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.820000000000000e+02 -3.949549415176102e-01 -8.878588431427531e-01 -2.148665647860390e-01 -9.772219891652120e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.830000000000000e+02 -3.949413354314225e-01 -8.878573202663451e-01 -2.149139034974872e-01 -9.768692082659799e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.840000000000000e+02 -3.949277295811537e-01 -8.878557937567132e-01 -2.149612367334156e-01 -9.765164925669600e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.850000000000000e+02 -3.949141215373757e-01 -8.878542645068859e-01 -2.150085653871054e-01 -9.761638396026789e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.860000000000000e+02 -3.949005137477251e-01 -8.878527316193906e-01 -2.150558885611507e-01 -9.758112518793299e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.870000000000000e+02 -3.948869053694342e-01 -8.878511954049084e-01 -2.151032065661332e-01 -9.754587285372010e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.880000000000000e+02 -3.948732964327173e-01 -8.878496558535511e-01 -2.151505193921759e-01 -9.751062696120660e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.890000000000000e+02 -3.948596869368577e-01 -8.878481129667892e-01 -2.151978270406963e-01 -9.747538751090300e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.900000000000000e+02 -3.948460768675725e-01 -8.878465667510493e-01 -2.152451295182709e-01 -9.744015450174770e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.570000000000000e-11 2.300000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.910000000000000e+02 -3.948324662348099e-01 -8.878450172038874e-01 -2.152924268224025e-01 -9.740492793533111e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.890000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.560000000000000e-11 2.300000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.920000000000000e+02 -3.948188550377388e-01 -8.878434643268081e-01 -2.153397189546093e-01 -9.736970781208520e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.880000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.560000000000000e-11 2.300000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.930000000000000e+02 -3.948052432912457e-01 -8.878419081155561e-01 -2.153870059105863e-01 -9.733449413410360e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.880000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.560000000000000e-11 2.300000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.940000000000000e+02 -3.947916097520607e-01 -8.878403563647814e-01 -2.154342954779330e-01 -9.729928474228949e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.880000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.960000000000000e-12 6.560000000000000e-11 2.300000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.950000000000000e+02 -3.947779756891372e-01 -8.878388012720048e-01 -2.154815798595897e-01 -9.726408179740330e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.880000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.970000000000000e-12 6.560000000000000e-11 2.300000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.960000000000000e+02 -3.947643622604332e-01 -8.878372350768935e-01 -2.155288513047736e-01 -9.722888745313900e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.880000000000000e-11 2.290000000000000e-11 -1.060000000000000e-11 3.970000000000000e-12 6.560000000000000e-11 2.300000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.970000000000000e+02 -3.947507482648028e-01 -8.878356655588099e-01 -2.155761175851186e-01 -9.719369955429480e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.880000000000000e-11 2.290000000000000e-11 -1.070000000000000e-11 3.970000000000000e-12 6.560000000000000e-11 2.300000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.980000000000000e+02 -3.947371337100171e-01 -8.878340927161082e-01 -2.156233786989289e-01 -9.715851810223980e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.880000000000000e-11 2.290000000000000e-11 -1.070000000000000e-11 3.970000000000000e-12 6.560000000000000e-11 2.300000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.990000000000000e+02 -3.947235185887121e-01 -8.878325165526870e-01 -2.156706346501132e-01 -9.712334309673860e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.880000000000000e-11 2.290000000000000e-11 -1.070000000000000e-11 3.970000000000000e-12 6.560000000000000e-11 2.300000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.000000000000000e+02 -3.947099029395433e-01 -8.878309370555727e-01 -2.157178854256692e-01 -9.708817454230950e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.880000000000000e-11 2.290000000000000e-11 -1.070000000000000e-11 3.970000000000000e-12 6.560000000000000e-11 2.300000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.010000000000000e+02 -3.946962867140897e-01 -8.878293542437068e-01 -2.157651310446593e-01 -9.705301243440440e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.880000000000000e-11 2.290000000000000e-11 -1.070000000000000e-11 3.970000000000000e-12 6.560000000000000e-11 2.300000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.020000000000000e+02 -3.946823499809011e-01 -8.878279594003718e-01 -2.158126642824124e-01 -9.701675657252430e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.880000000000000e-11 2.290000000000000e-11 -1.070000000000000e-11 3.970000000000000e-12 6.560000000000000e-11 2.290000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.030000000000000e+02 -3.946687580050984e-01 -8.878263567109853e-01 -2.158598334296285e-01 -9.698177197672191e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.880000000000000e-11 2.290000000000000e-11 -1.070000000000000e-11 3.970000000000000e-12 6.550000000000001e-11 2.290000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.040000000000000e+02 -3.946551766975456e-01 -8.878247437499337e-01 -2.159070097269502e-01 -9.694678458804271e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.880000000000000e-11 2.290000000000000e-11 -1.070000000000000e-11 3.980000000000000e-12 6.550000000000001e-11 2.290000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.050000000000000e+02 -3.946415658964558e-01 -8.878231368317726e-01 -2.159542003511179e-01 -9.691179249035781e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.880000000000000e-11 2.290000000000000e-11 -1.070000000000000e-11 3.980000000000000e-12 6.550000000000001e-11 2.290000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.060000000000000e+02 -3.946279829293897e-01 -8.878215161885535e-01 -2.160013785416377e-01 -9.687680295019740e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.880000000000000e-11 2.290000000000000e-11 -1.070000000000000e-11 3.980000000000000e-12 6.550000000000001e-11 2.290000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.070000000000000e+02 -3.946143903932289e-01 -8.878198960135567e-01 -2.160485562698948e-01 -9.684181158338449e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.880000000000000e-11 2.290000000000000e-11 -1.070000000000000e-11 3.980000000000000e-12 6.550000000000001e-11 2.290000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.080000000000000e+02 -3.946007900480427e-01 -8.878182761984417e-01 -2.160957314703966e-01 -9.680681681453240e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.880000000000000e-11 2.290000000000000e-11 -1.070000000000000e-11 3.980000000000000e-12 6.550000000000001e-11 2.290000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.090000000000000e+02 -3.945871860384305e-01 -8.878166550633868e-01 -2.161429034512826e-01 -9.677181869729320e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.880000000000000e-11 2.290000000000000e-11 -1.070000000000000e-11 3.980000000000000e-12 6.550000000000001e-11 2.290000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.100000000000000e+02 -3.945735806731500e-01 -8.878150310616518e-01 -2.161900737028485e-01 -9.673681867895149e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.880000000000000e-11 2.290000000000000e-11 -1.070000000000000e-11 3.980000000000000e-12 6.550000000000001e-11 2.290000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.110000000000000e+02 -3.945599736217453e-01 -8.878134041792825e-01 -2.162372428636881e-01 -9.670181680771080e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.880000000000000e-11 2.290000000000000e-11 -1.070000000000000e-11 3.990000000000000e-12 6.550000000000001e-11 2.290000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.120000000000000e+02 -3.945463644623796e-01 -8.878117752055561e-01 -2.162844090096809e-01 -9.666681186018190e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.880000000000000e-11 2.290000000000000e-11 -1.070000000000000e-11 3.980000000000000e-12 6.550000000000001e-11 2.290000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.130000000000000e+02 -3.945327558805074e-01 -8.878101438768666e-01 -2.163315682238435e-01 -9.663180406306229e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.880000000000000e-11 2.290000000000000e-11 -1.070000000000000e-11 3.990000000000000e-12 6.550000000000001e-11 2.290000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.140000000000000e+02 -3.945191517614378e-01 -8.878085085147801e-01 -2.163787195004651e-01 -9.659679523429540e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.880000000000000e-11 2.290000000000000e-11 -1.070000000000000e-11 3.990000000000000e-12 6.550000000000001e-11 2.290000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.150000000000000e+02 -3.945055195472796e-01 -8.878068802075813e-01 -2.164258775678685e-01 -9.656178344350590e-02 1.240000000000000e-10 -4.660000000000000e-11 -1.750000000000000e-11 -3.880000000000000e-11 2.290000000000000e-11 -1.070000000000000e-11 3.990000000000000e-12 6.540000000000000e-11 2.290000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.160000000000000e+02 -3.944919150139117e-01 -8.878052377781224e-01 -2.164730244237135e-01 -9.652677586679560e-02 1.240000000000000e-10 -4.650000000000000e-11 -1.750000000000000e-11 -3.880000000000000e-11 2.290000000000000e-11 -1.070000000000000e-11 3.990000000000000e-12 6.540000000000000e-11 2.290000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.170000000000000e+02 -3.944783110324933e-01 -8.878035906706521e-01 -2.165201714135617e-01 -9.649177109106610e-02 1.240000000000000e-10 -4.650000000000000e-11 -1.750000000000000e-11 -3.870000000000000e-11 2.290000000000000e-11 -1.070000000000000e-11 3.990000000000000e-12 6.540000000000000e-11 2.290000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.180000000000000e+02 -3.944647128234999e-01 -8.878019370903709e-01 -2.165673161679326e-01 -9.645676960938281e-02 1.240000000000000e-10 -4.650000000000000e-11 -1.750000000000000e-11 -3.870000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 3.990000000000000e-12 6.540000000000000e-11 2.290000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.190000000000000e+02 -3.944511188784347e-01 -8.878002779432278e-01 -2.166144580265508e-01 -9.642177074365579e-02 1.240000000000000e-10 -4.650000000000000e-11 -1.750000000000000e-11 -3.870000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 3.990000000000000e-12 6.540000000000000e-11 2.290000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.200000000000000e+02 -3.944375243687384e-01 -8.877986151144197e-01 -2.166615984701109e-01 -9.638677356959230e-02 1.240000000000000e-10 -4.650000000000000e-11 -1.750000000000000e-11 -3.870000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 3.990000000000000e-12 6.540000000000000e-11 2.280000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.210000000000000e+02 -3.944239253699072e-01 -8.877969503770829e-01 -2.167087388055176e-01 -9.635177487865609e-02 1.240000000000000e-10 -4.650000000000000e-11 -1.750000000000000e-11 -3.870000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.000000000000000e-12 6.540000000000000e-11 2.280000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.220000000000000e+02 -3.944103180964659e-01 -8.877952854634394e-01 -2.167558803917884e-01 -9.631677114353300e-02 1.240000000000000e-10 -4.650000000000000e-11 -1.750000000000000e-11 -3.870000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 3.990000000000000e-12 6.540000000000000e-11 2.280000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.230000000000000e+02 -3.943967034863484e-01 -8.877936198704975e-01 -2.168030237112507e-01 -9.628176206322191e-02 1.240000000000000e-10 -4.650000000000000e-11 -1.750000000000000e-11 -3.870000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.000000000000000e-12 6.540000000000000e-11 2.280000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.240000000000000e+02 -3.943830891989468e-01 -8.877919506604814e-01 -2.168501662483792e-01 -9.624674900693100e-02 1.240000000000000e-10 -4.650000000000000e-11 -1.750000000000000e-11 -3.870000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.000000000000000e-12 6.540000000000000e-11 2.280000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.250000000000000e+02 -3.943694279885258e-01 -8.877902951690656e-01 -2.168973241885568e-01 -9.621172917825831e-02 1.240000000000000e-10 -4.650000000000000e-11 -1.750000000000000e-11 -3.870000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.000000000000000e-12 6.540000000000000e-11 2.280000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.260000000000000e+02 -3.943558130611288e-01 -8.877886188699506e-01 -2.169444634080569e-01 -9.617671603081430e-02 1.240000000000000e-10 -4.650000000000000e-11 -1.750000000000000e-11 -3.870000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.000000000000000e-12 6.540000000000000e-11 2.280000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.270000000000000e+02 -3.943421960155036e-01 -8.877869391947044e-01 -2.169916018995339e-01 -9.614170656922540e-02 1.240000000000000e-10 -4.650000000000000e-11 -1.750000000000000e-11 -3.870000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.000000000000000e-12 6.530000000000000e-11 2.280000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.280000000000000e+02 -3.943285817521864e-01 -8.877852542890430e-01 -2.170387381134185e-01 -9.610670131881251e-02 1.240000000000000e-10 -4.650000000000000e-11 -1.750000000000000e-11 -3.870000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.000000000000000e-12 6.530000000000000e-11 2.280000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.290000000000000e+02 -3.943149693423749e-01 -8.877835646885164e-01 -2.170858719075426e-01 -9.607169947291920e-02 1.240000000000000e-10 -4.650000000000000e-11 -1.750000000000000e-11 -3.870000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.000000000000000e-12 6.530000000000000e-11 2.280000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.300000000000000e+02 -3.943013558322121e-01 -8.877818719528154e-01 -2.171330031091319e-01 -9.603669913967200e-02 1.240000000000000e-10 -4.650000000000000e-11 -1.750000000000000e-11 -3.870000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.010000000000000e-12 6.530000000000000e-11 2.280000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.310000000000000e+02 -3.942877396084177e-01 -8.877801772802369e-01 -2.171801304555026e-01 -9.600169872500630e-02 1.240000000000000e-10 -4.650000000000000e-11 -1.750000000000000e-11 -3.870000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.010000000000000e-12 6.530000000000000e-11 2.280000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.320000000000000e+02 -3.942741171258544e-01 -8.877784834443897e-01 -2.172272496831421e-01 -9.596669679063460e-02 1.240000000000000e-10 -4.650000000000000e-11 -1.740000000000000e-11 -3.870000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.000000000000000e-12 6.530000000000000e-11 2.280000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.330000000000000e+02 -3.942604832275360e-01 -8.877767940829765e-01 -2.172743560657357e-01 -9.593169157875921e-02 1.240000000000000e-10 -4.650000000000000e-11 -1.740000000000000e-11 -3.870000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.010000000000000e-12 6.530000000000000e-11 2.280000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>6.340000000000000e+02 -3.942468388600229e-01 -8.877751085186597e-01 -2.173214509663357e-01 -9.589668239020380e-02 1.240000000000000e-10 -4.650000000000000e-11 -1.740000000000000e-11 -3.870000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.010000000000000e-12 6.530000000000000e-11 2.280000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>6.350000000000000e+02 -3.942331773549246e-01 -8.877734270333975e-01 -2.173685450335865e-01 -9.586166989991179e-02 1.240000000000000e-10 -4.650000000000000e-11 -1.740000000000000e-11 -3.870000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.010000000000000e-12 6.530000000000000e-11 2.280000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>6.360000000000000e+02 -3.942195277479963e-01 -8.877717374156057e-01 -2.174156312765785e-01 -9.582666364238340e-02 1.240000000000000e-10 -4.650000000000000e-11 -1.740000000000000e-11 -3.870000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.010000000000000e-12 6.530000000000000e-11 2.280000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>6.370000000000000e+02 -3.942058799440450e-01 -8.877700429953462e-01 -2.174627104351452e-01 -9.579167264320410e-02 1.240000000000000e-10 -4.650000000000000e-11 -1.740000000000000e-11 -3.870000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.010000000000000e-12 6.530000000000000e-11 2.270000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>6.380000000000000e+02 -3.941922360307469e-01 -8.877683433600602e-01 -2.175097784310150e-01 -9.575670142452210e-02 1.240000000000000e-10 -4.650000000000000e-11 -1.740000000000000e-11 -3.870000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.010000000000000e-12 6.530000000000000e-11 2.270000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>6.390000000000000e+02 -3.941785936310853e-01 -8.877666397098013e-01 -2.175568376075546e-01 -9.572174335848541e-02 1.240000000000000e-10 -4.650000000000000e-11 -1.740000000000000e-11 -3.870000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.010000000000000e-12 6.530000000000000e-11 2.270000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>6.400000000000000e+02 -3.941649495656590e-01 -8.877649332366386e-01 -2.176038928715814e-01 -9.568678935141310e-02 1.240000000000000e-10 -4.650000000000000e-11 -1.740000000000000e-11 -3.870000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.020000000000000e-12 6.530000000000000e-11 2.270000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>6.410000000000000e+02 -3.941513026078231e-01 -8.877632244114526e-01 -2.176509453300143e-01 -9.565183757821021e-02 1.240000000000000e-10 -4.650000000000000e-11 -1.740000000000000e-11 -3.870000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.020000000000000e-12 6.520000000000000e-11 2.270000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>6.420000000000000e+02 -3.941376514426198e-01 -8.877615144255054e-01 -2.176979918059203e-01 -9.561688963723181e-02 1.240000000000000e-10 -4.650000000000000e-11 -1.740000000000000e-11 -3.860000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.010000000000000e-12 6.520000000000000e-11 2.270000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>6.430000000000000e+02 -3.941239967407923e-01 -8.877598037782429e-01 -2.177450294800792e-01 -9.558194455753130e-02 1.240000000000000e-10 -4.650000000000000e-11 -1.740000000000000e-11 -3.860000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.020000000000000e-12 6.520000000000000e-11 2.270000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>6.440000000000000e+02 -3.941103413124032e-01 -8.877580908960665e-01 -2.177920600943729e-01 -9.554700141313430e-02 1.240000000000000e-10 -4.650000000000000e-11 -1.740000000000000e-11 -3.860000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.020000000000000e-12 6.520000000000000e-11 2.270000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>6.450000000000000e+02 -3.940966605888985e-01 -8.877563839696242e-01 -2.178390957349750e-01 -9.551205789440501e-02 1.240000000000000e-10 -4.650000000000000e-11 -1.740000000000000e-11 -3.860000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.020000000000000e-12 6.520000000000000e-11 2.270000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>6.460000000000000e+02 -3.940829972852836e-01 -8.877546674546850e-01 -2.178861194641167e-01 -9.547712086116540e-02 1.240000000000000e-10 -4.650000000000000e-11 -1.740000000000000e-11 -3.860000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.020000000000000e-12 6.520000000000000e-11 2.270000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>6.470000000000000e+02 -3.940693261709376e-01 -8.877529511543264e-01 -2.179331349271444e-01 -9.544219501244970e-02 1.240000000000000e-10 -4.650000000000000e-11 -1.740000000000000e-11 -3.860000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.020000000000000e-12 6.520000000000000e-11 2.270000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>6.480000000000000e+02 -3.940556478600271e-01 -8.877512351740444e-01 -2.179801386310627e-01 -9.540728483169190e-02 1.240000000000000e-10 -4.650000000000000e-11 -1.740000000000000e-11 -3.860000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.020000000000000e-12 6.520000000000000e-11 2.270000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>6.490000000000000e+02 -3.940419644857208e-01 -8.877495180887043e-01 -2.180271342718275e-01 -9.537238635329250e-02 1.240000000000000e-10 -4.650000000000000e-11 -1.740000000000000e-11 -3.860000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.020000000000000e-12 6.520000000000000e-11 2.270000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>6.500000000000000e+02 -3.940282779913121e-01 -8.877477983586937e-01 -2.180741271995218e-01 -9.533749366676610e-02 1.240000000000000e-10 -4.640000000000000e-11 -1.740000000000000e-11 -3.860000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.030000000000000e-12 6.520000000000000e-11 2.270000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>6.510000000000000e+02 -3.940145896690241e-01 -8.877460758239751e-01 -2.181211155202056e-01 -9.530260726394130e-02 1.240000000000000e-10 -4.640000000000000e-11 -1.740000000000000e-11 -3.860000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.030000000000000e-12 6.520000000000000e-11 2.270000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>6.520000000000000e+02 -3.940009032652036e-01 -8.877443496066352e-01 -2.181680912600897e-01 -9.526773810490780e-02 1.240000000000000e-10 -4.640000000000000e-11 -1.740000000000000e-11 -3.860000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.020000000000000e-12 6.520000000000000e-11 2.270000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>6.530000000000000e+02 -3.939872249498438e-01 -8.877426174343773e-01 -2.182150484985084e-01 -9.523289545044610e-02 1.240000000000000e-10 -4.640000000000000e-11 -1.740000000000000e-11 -3.860000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.030000000000000e-12 6.510000000000000e-11 2.260000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>6.540000000000000e+02 -3.939735583968070e-01 -8.877408777962016e-01 -2.182619893212187e-01 -9.519807346439010e-02 1.240000000000000e-10 -4.640000000000000e-11 -1.740000000000000e-11 -3.860000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.030000000000000e-12 6.510000000000000e-11 2.260000000000000e-11 7.020000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.550000000000000e+02 -3.939598313300549e-01 -8.877391566567324e-01 -2.183089464585011e-01 -9.516325411085820e-02 1.240000000000000e-10 -4.640000000000000e-11 -1.740000000000000e-11 -3.860000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.030000000000000e-12 6.510000000000000e-11 2.260000000000000e-11 7.020000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.560000000000000e+02 -3.939461637415422e-01 -8.877374095300161e-01 -2.183558801243501e-01 -9.512844689880780e-02 1.240000000000000e-10 -4.640000000000000e-11 -1.740000000000000e-11 -3.860000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.030000000000000e-12 6.510000000000000e-11 2.260000000000000e-11 7.020000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.570000000000000e+02 -3.939324896593083e-01 -8.877356601501674e-01 -2.184028145386372e-01 -9.509364800115290e-02 1.240000000000000e-10 -4.640000000000000e-11 -1.740000000000000e-11 -3.860000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.030000000000000e-12 6.510000000000000e-11 2.260000000000000e-11 7.020000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.580000000000000e+02 -3.939188175253961e-01 -8.877339051671742e-01 -2.184497456294533e-01 -9.505886308208911e-02 1.240000000000000e-10 -4.640000000000000e-11 -1.740000000000000e-11 -3.860000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.030000000000000e-12 6.510000000000000e-11 2.260000000000000e-11 7.020000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.590000000000000e+02 -3.939051488066582e-01 -8.877321441594453e-01 -2.184966725220125e-01 -9.502409203189791e-02 1.240000000000000e-10 -4.640000000000000e-11 -1.740000000000000e-11 -3.860000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.030000000000000e-12 6.510000000000000e-11 2.260000000000000e-11 7.020000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.600000000000000e+02 -3.938914799231302e-01 -8.877303791353316e-01 -2.185435963157596e-01 -9.498932841946550e-02 1.240000000000000e-10 -4.640000000000000e-11 -1.740000000000000e-11 -3.860000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.040000000000000e-12 6.510000000000000e-11 2.260000000000000e-11 7.020000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.610000000000000e+02 -3.938778104498089e-01 -8.877286105638122e-01 -2.185905170806928e-01 -9.495456947458210e-02 1.240000000000000e-10 -4.640000000000000e-11 -1.740000000000000e-11 -3.860000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.040000000000000e-12 6.510000000000000e-11 2.260000000000000e-11 7.020000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.620000000000000e+02 -3.938641425289499e-01 -8.877268371165796e-01 -2.186374336068378e-01 -9.491982152714140e-02 1.240000000000000e-10 -4.640000000000000e-11 -1.740000000000000e-11 -3.860000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.030000000000000e-12 6.510000000000000e-11 2.260000000000000e-11 7.020000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.630000000000000e+02 -3.938504783090960e-01 -8.877250580903010e-01 -2.186843424852885e-01 -9.488509011454350e-02 1.240000000000000e-10 -4.640000000000000e-11 -1.740000000000000e-11 -3.860000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.040000000000000e-12 6.510000000000000e-11 2.260000000000000e-11 7.020000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.640000000000000e+02 -3.938368187064578e-01 -8.877232738875659e-01 -2.187312423968820e-01 -9.485037073746599e-02 1.240000000000000e-10 -4.640000000000000e-11 -1.740000000000000e-11 -3.850000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.040000000000000e-12 6.510000000000000e-11 2.260000000000000e-11 7.020000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.650000000000000e+02 -3.938231369875085e-01 -8.877214942520248e-01 -2.187781460589365e-01 -9.481565389367430e-02 1.240000000000000e-10 -4.640000000000000e-11 -1.740000000000000e-11 -3.850000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.040000000000000e-12 6.510000000000000e-11 2.260000000000000e-11 7.020000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.660000000000000e+02 -3.938094823110673e-01 -8.877197001304137e-01 -2.188250401717033e-01 -9.478094447783310e-02 1.240000000000000e-10 -4.640000000000000e-11 -1.740000000000000e-11 -3.850000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.040000000000000e-12 6.500000000000000e-11 2.260000000000000e-11 7.020000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.670000000000000e+02 -3.937958331344645e-01 -8.877178982964564e-01 -2.188719343174360e-01 -9.474624645968460e-02 1.240000000000000e-10 -4.640000000000000e-11 -1.740000000000000e-11 -3.850000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.040000000000000e-12 6.500000000000000e-11 2.260000000000000e-11 7.020000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.680000000000000e+02 -3.937821934202399e-01 -8.877160875565027e-01 -2.189188240224989e-01 -9.471156490696900e-02 1.240000000000000e-10 -4.640000000000000e-11 -1.740000000000000e-11 -3.850000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.040000000000000e-12 6.500000000000000e-11 2.260000000000000e-11 7.020000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.690000000000000e+02 -3.937685594458526e-01 -8.877142704445194e-01 -2.189657077948190e-01 -9.467689502199930e-02 1.240000000000000e-10 -4.640000000000000e-11 -1.740000000000000e-11 -3.850000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.040000000000000e-12 6.500000000000000e-11 2.260000000000000e-11 7.020000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.700000000000000e+02 -3.937549259680896e-01 -8.877124494050967e-01 -2.190125882367071e-01 -9.464222969122420e-02 1.240000000000000e-10 -4.640000000000000e-11 -1.740000000000000e-11 -3.850000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.040000000000000e-12 6.500000000000000e-11 2.260000000000000e-11 7.020000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.710000000000000e+02 -3.937412921892173e-01 -8.877106246595523e-01 -2.190594664858322e-01 -9.460756753376320e-02 1.230000000000000e-10 -4.640000000000000e-11 -1.740000000000000e-11 -3.850000000000000e-11 2.280000000000000e-11 -1.070000000000000e-11 4.050000000000000e-12 6.500000000000000e-11 2.250000000000000e-11 7.020000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.720000000000000e+02 -3.937276571896078e-01 -8.877087964837571e-01 -2.191063411373671e-01 -9.457291304986860e-02 1.230000000000000e-10 -4.640000000000000e-11 -1.730000000000000e-11 -3.850000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.040000000000000e-12 6.500000000000000e-11 2.250000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.730000000000000e+02 -3.937140174506302e-01 -8.877069661498368e-01 -2.191532112032051e-01 -9.453827125170430e-02 1.230000000000000e-10 -4.640000000000000e-11 -1.730000000000000e-11 -3.850000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.050000000000000e-12 6.500000000000000e-11 2.250000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.740000000000000e+02 -3.937003727974159e-01 -8.877051337462190e-01 -2.192000774544087e-01 -9.450364026726391e-02 1.230000000000000e-10 -4.640000000000000e-11 -1.730000000000000e-11 -3.850000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.050000000000000e-12 6.500000000000000e-11 2.250000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.750000000000000e+02 -3.936867200164123e-01 -8.877033004483369e-01 -2.192469442884165e-01 -9.446901225291381e-02 1.230000000000000e-10 -4.640000000000000e-11 -1.730000000000000e-11 -3.850000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.050000000000000e-12 6.500000000000000e-11 2.250000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.760000000000000e+02 -3.936730782318080e-01 -8.877014592016341e-01 -2.192938072350114e-01 -9.443438417841230e-02 1.230000000000000e-10 -4.640000000000000e-11 -1.730000000000000e-11 -3.850000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.050000000000000e-12 6.500000000000000e-11 2.250000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.770000000000000e+02 -3.936594484975146e-01 -8.876996090822437e-01 -2.193406681890177e-01 -9.439975594385901e-02 1.230000000000000e-10 -4.640000000000000e-11 -1.730000000000000e-11 -3.850000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.050000000000000e-12 6.500000000000000e-11 2.250000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.780000000000000e+02 -3.936458359203035e-01 -8.876977474901698e-01 -2.193875277557625e-01 -9.436512930473130e-02 1.230000000000000e-10 -4.640000000000000e-11 -1.730000000000000e-11 -3.850000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.050000000000000e-12 6.490000000000000e-11 2.250000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.790000000000000e+02 -3.936322358330278e-01 -8.876958764469564e-01 -2.194343862543758e-01 -9.433050398109280e-02 1.230000000000000e-10 -4.640000000000000e-11 -1.730000000000000e-11 -3.850000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.050000000000000e-12 6.490000000000000e-11 2.250000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.800000000000000e+02 -3.936186397637153e-01 -8.876939999866088e-01 -2.194812429483322e-01 -9.429587908383040e-02 1.230000000000000e-10 -4.640000000000000e-11 -1.730000000000000e-11 -3.850000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.050000000000000e-12 6.490000000000000e-11 2.250000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.810000000000000e+02 -3.936050412136671e-01 -8.876921210536977e-01 -2.195280976434536e-01 -9.426125447617130e-02 1.230000000000000e-10 -4.640000000000000e-11 -1.730000000000000e-11 -3.850000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.060000000000000e-12 6.490000000000000e-11 2.250000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.820000000000000e+02 -3.935914360948665e-01 -8.876902417667513e-01 -2.195749485981157e-01 -9.422663133638090e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.850000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.050000000000000e-12 6.490000000000000e-11 2.250000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.830000000000000e+02 -3.935778250856853e-01 -8.876883625760279e-01 -2.196217919166809e-01 -9.419201167412400e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.850000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.050000000000000e-12 6.490000000000000e-11 2.250000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.840000000000000e+02 -3.935642126649999e-01 -8.876864816611517e-01 -2.196686267491377e-01 -9.415739592603931e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.850000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.060000000000000e-12 6.490000000000000e-11 2.250000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.850000000000000e+02 -3.935505542720109e-01 -8.876846144161590e-01 -2.197154736402965e-01 -9.412277728609730e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.850000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.060000000000000e-12 6.490000000000000e-11 2.250000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.860000000000000e+02 -3.935369351183261e-01 -8.876827291243740e-01 -2.197623052549167e-01 -9.408816238519380e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.850000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.060000000000000e-12 6.490000000000000e-11 2.250000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.870000000000000e+02 -3.935233088384094e-01 -8.876808425877781e-01 -2.198091402933781e-01 -9.405354297956101e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.060000000000000e-12 6.490000000000000e-11 2.240000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.880000000000000e+02 -3.935096778995325e-01 -8.876789540408075e-01 -2.198559785650376e-01 -9.401891640321010e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.060000000000000e-12 6.490000000000000e-11 2.240000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.890000000000000e+02 -3.934960432831996e-01 -8.876770632009848e-01 -2.199028183611546e-01 -9.398428519791090e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.060000000000000e-12 6.490000000000000e-11 2.240000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.900000000000000e+02 -3.934824060681740e-01 -8.876751695083341e-01 -2.199496582574249e-01 -9.394965346180570e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.060000000000000e-12 6.490000000000000e-11 2.240000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.910000000000000e+02 -3.934687690007687e-01 -8.876732719957047e-01 -2.199964960129500e-01 -9.391502407753211e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.060000000000000e-12 6.480000000000000e-11 2.240000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.920000000000000e+02 -3.934551350530007e-01 -8.876713698118266e-01 -2.200433276127249e-01 -9.388040205463230e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.060000000000000e-12 6.480000000000000e-11 2.240000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.930000000000000e+02 -3.934410723153237e-01 -8.876697348198740e-01 -2.200898492564427e-01 -9.384573913854410e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.060000000000000e-12 6.480000000000000e-11 2.240000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.940000000000000e+02 -3.934273929603703e-01 -8.876678524005523e-01 -2.201366239676956e-01 -9.381117775139131e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.060000000000000e-12 6.480000000000000e-11 2.240000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.950000000000000e+02 -3.934137131808862e-01 -8.876659667216724e-01 -2.201833935787320e-01 -9.377662287297120e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.480000000000000e-11 2.240000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.960000000000000e+02 -3.934000490821193e-01 -8.876640719016734e-01 -2.202301523044264e-01 -9.374207621498540e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.480000000000000e-11 2.240000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.970000000000000e+02 -3.933863845180333e-01 -8.876621738399645e-01 -2.202769059489076e-01 -9.370753606362350e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.480000000000000e-11 2.240000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.980000000000000e+02 -3.933727195117059e-01 -8.876602725292954e-01 -2.203236545050234e-01 -9.367300242189820e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.480000000000000e-11 2.240000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.990000000000000e+02 -3.933590540317007e-01 -8.876583679823196e-01 -2.203703979852617e-01 -9.363847528696670e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.480000000000000e-11 2.240000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.000000000000000e+02 -3.933453881253257e-01 -8.876564601829380e-01 -2.204171363737731e-01 -9.360395466442020e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.480000000000000e-11 2.240000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.010000000000000e+02 -3.933317217586818e-01 -8.876545491446853e-01 -2.204638696840473e-01 -9.356944055102510e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.480000000000000e-11 2.240000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.020000000000000e+02 -3.933180549300703e-01 -8.876526348693602e-01 -2.205105979178298e-01 -9.353493294715989e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.240000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.030000000000000e+02 -3.933043876654370e-01 -8.876507173486662e-01 -2.205573210669471e-01 -9.350043185614750e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.040000000000000e+02 -3.932907199592572e-01 -8.876487965857739e-01 -2.206040391346997e-01 -9.346593727777169e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.050000000000000e+02 -3.932770517930773e-01 -8.876468725886001e-01 -2.206507521288454e-01 -9.343144921062541e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.060000000000000e+02 -3.932633831782774e-01 -8.876449453541581e-01 -2.206974600464974e-01 -9.339696765641810e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.070000000000000e+02 -3.932497141306113e-01 -8.876430148778731e-01 -2.207441628831444e-01 -9.336249261739010e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.080000000000000e+02 -3.932360446355919e-01 -8.876410811661876e-01 -2.207908606452980e-01 -9.332802409236669e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.090000000000000e+02 -3.932223746947728e-01 -8.876391442197104e-01 -2.208375533335374e-01 -9.329356208207221e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.100000000000000e+02 -3.932087043175741e-01 -8.876372040361789e-01 -2.208842409456229e-01 -9.325910658807300e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.110000000000000e+02 -3.931950334940297e-01 -8.876352606203832e-01 -2.209309234864426e-01 -9.322465760967320e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.120000000000000e+02 -3.931813622323670e-01 -8.876333139704959e-01 -2.209776009541843e-01 -9.319021514831130e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.130000000000000e+02 -3.931676905354471e-01 -8.876313640866399e-01 -2.210242733490201e-01 -9.315577920478900e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.140000000000000e+02 -3.931540183945884e-01 -8.876294109731597e-01 -2.210709406751943e-01 -9.312134977873700e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.150000000000000e+02 -3.931403458264877e-01 -8.876274546251115e-01 -2.211176029280453e-01 -9.308692687230970e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.160000000000000e+02 -3.931266728107521e-01 -8.876254950511129e-01 -2.211642601160084e-01 -9.305251048388349e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.170000000000000e+02 -3.931129993667285e-01 -8.876235322452695e-01 -2.212109122333542e-01 -9.301810061602440e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.180000000000000e+02 -3.930993254926614e-01 -8.876215662093966e-01 -2.212575592818473e-01 -9.298369726910360e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.190000000000000e+02 -3.930856511823473e-01 -8.876195969469073e-01 -2.213042012650223e-01 -9.294930044282390e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.200000000000000e+02 -3.930719764375535e-01 -8.876176244583305e-01 -2.213508381833813e-01 -9.291491013793250e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.210000000000000e+02 -3.930583012629586e-01 -8.876156487431328e-01 -2.213974700363864e-01 -9.288052635548839e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.220000000000000e+02 -3.930446256589626e-01 -8.876136698023160e-01 -2.214440968252088e-01 -9.284614909590259e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.230000000000000e+02 -3.930309496331381e-01 -8.876116876342912e-01 -2.214907185482774e-01 -9.281177836054549e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.240000000000000e+02 -3.930172731685223e-01 -8.876097022464113e-01 -2.215373352128487e-01 -9.277741414808929e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.250000000000000e+02 -3.930035962876596e-01 -8.876077136316242e-01 -2.215839468120008e-01 -9.274305646151290e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.260000000000000e+02 -3.929899189758626e-01 -8.876057217964354e-01 -2.216305533522960e-01 -9.270870529960520e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.270000000000000e+02 -3.929762412286577e-01 -8.876037267436490e-01 -2.216771548364648e-01 -9.267436066244050e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.280000000000000e+02 -3.929625630846521e-01 -8.876017284603528e-01 -2.217237512518546e-01 -9.264002255472940e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.290000000000000e+02 -3.929488844955414e-01 -8.875997269653146e-01 -2.217703426170272e-01 -9.260569097164099e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.300000000000000e+02 -3.929352054941868e-01 -8.875977222477188e-01 -2.218169289213843e-01 -9.257136591726731e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.310000000000000e+02 -3.929215260621240e-01 -8.875957143154624e-01 -2.218635101727091e-01 -9.253704739011320e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.320000000000000e+02 -3.929078462281503e-01 -8.875937031592136e-01 -2.219100863618598e-01 -9.250273539383770e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.330000000000000e+02 -3.928941659588399e-01 -8.875916887923083e-01 -2.219566575020749e-01 -9.246842992520370e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.340000000000000e+02 -3.928804852736496e-01 -8.875896712088212e-01 -2.220032235875456e-01 -9.243413098686380e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.350000000000000e+02 -3.928668041803409e-01 -8.875876504070915e-01 -2.220497846166381e-01 -9.239983858021100e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.360000000000000e+02 -3.928531226749453e-01 -8.875856263897115e-01 -2.220963405920816e-01 -9.236555270518350e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.370000000000000e+02 -3.928394407390275e-01 -8.875835991645730e-01 -2.221428915215787e-01 -9.233127336034570e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.380000000000000e+02 -3.928257584018848e-01 -8.875815687221537e-01 -2.221894373958800e-01 -9.229700054935221e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.390000000000000e+02 -3.928120756411972e-01 -8.875795350717611e-01 -2.222359782240719e-01 -9.226273427034640e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.400000000000000e+02 -3.927983924765727e-01 -8.875774982073895e-01 -2.222825140004795e-01 -9.222847452581300e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.410000000000000e+02 -3.927847089064024e-01 -8.875754581307941e-01 -2.223290447268098e-01 -9.219422131613229e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.420000000000000e+02 -3.927710249053465e-01 -8.875734148523727e-01 -2.223755704132777e-01 -9.215997463905350e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.430000000000000e+02 -3.927573405247030e-01 -8.875713683545922e-01 -2.224220910427494e-01 -9.212573450068290e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.440000000000000e+02 -3.927436557180418e-01 -8.875693186555211e-01 -2.224686066330673e-01 -9.209150089635790e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.450000000000000e+02 -3.927299705033148e-01 -8.875672657497826e-01 -2.225151171789712e-01 -9.205727382857590e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.460000000000000e+02 -3.927162848917465e-01 -8.875652096344521e-01 -2.225616226775985e-01 -9.202305329910640e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.470000000000000e+02 -3.927025988801573e-01 -8.875631503118309e-01 -2.226081231313932e-01 -9.198883930797000e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.480000000000000e+02 -3.926889124497003e-01 -8.875610877899544e-01 -2.226546185481892e-01 -9.195463185367519e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.490000000000000e+02 -3.926752256236138e-01 -8.875590220615110e-01 -2.227011089209121e-01 -9.192043093923211e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.500000000000000e+02 -3.926615383880188e-01 -8.875569531327253e-01 -2.227475942556280e-01 -9.188623656368690e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.510000000000000e+02 -3.926478507631082e-01 -8.875548809973786e-01 -2.227940745464685e-01 -9.185204872959600e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.520000000000000e+02 -3.926341627373096e-01 -8.875528056608538e-01 -2.228405497986785e-01 -9.181786743625540e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.530000000000000e+02 -3.926204743067519e-01 -8.875507271257267e-01 -2.228870200147633e-01 -9.178369268379601e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.540000000000000e+02 -3.926067854866309e-01 -8.875486453876004e-01 -2.229334851906341e-01 -9.174952447423300e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.550000000000000e+02 -3.925930962528922e-01 -8.875465604564037e-01 -2.229799453359650e-01 -9.171536280550120e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.560000000000000e+02 -3.925794066408244e-01 -8.875444723204353e-01 -2.230264004394129e-01 -9.168120768192881e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.570000000000000e+02 -3.925657166305530e-01 -8.875423809881010e-01 -2.230728505091660e-01 -9.164705910190531e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.580000000000000e+02 -3.925520262233271e-01 -8.875402864600842e-01 -2.231192955460896e-01 -9.161291706592881e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.590000000000000e+02 -3.925383354199866e-01 -8.875381887372423e-01 -2.231657355510148e-01 -9.157878157464060e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.600000000000000e+02 -3.925246442234634e-01 -8.875360878196711e-01 -2.232121705240297e-01 -9.154465262891180e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.610000000000000e+02 -3.925109526458831e-01 -8.875339837040909e-01 -2.232586004621417e-01 -9.151053023042600e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.620000000000000e+02 -3.924972606776583e-01 -8.875318763951576e-01 -2.233050253698823e-01 -9.147641437868929e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.630000000000000e+02 -3.924835683111429e-01 -8.875297658968100e-01 -2.233514452511504e-01 -9.144230507335430e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.640000000000000e+02 -3.924698755647997e-01 -8.875276522034862e-01 -2.233978601005285e-01 -9.140820231698631e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.650000000000000e+02 -3.924561824234249e-01 -8.875255353218601e-01 -2.234442699247146e-01 -9.137410610828670e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.660000000000000e+02 -3.924424889071781e-01 -8.875234152457515e-01 -2.234906747176920e-01 -9.134001645000700e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.670000000000000e+02 -3.924287949925261e-01 -8.875212919848843e-01 -2.235370744889887e-01 -9.130593334006321e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.680000000000000e+02 -3.924151007068786e-01 -8.875191655304377e-01 -2.235834692300208e-01 -9.127185678200091e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.690000000000000e+02 -3.924014060249591e-01 -8.875170358927523e-01 -2.236298589510505e-01 -9.123778677341640e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.700000000000000e+02 -3.923877109705981e-01 -8.875149030643110e-01 -2.236762436447650e-01 -9.120372331746571e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.710000000000000e+02 -3.923740155362643e-01 -8.875127670490172e-01 -2.237226233149601e-01 -9.116966641387500e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.720000000000000e+02 -3.923603197243583e-01 -8.875106278471311e-01 -2.237689979620928e-01 -9.113561606326789e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.730000000000000e+02 -3.923466235161420e-01 -8.875084854666359e-01 -2.238153675939229e-01 -9.110157226413849e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.740000000000000e+02 -3.923329269425923e-01 -8.875063398974040e-01 -2.238617322006740e-01 -9.106753502036720e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.750000000000000e+02 -3.923192300001987e-01 -8.875041911418738e-01 -2.239080917847174e-01 -9.103350433211960e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.760000000000000e+02 -3.923055326636052e-01 -8.875020392104100e-01 -2.239544463563291e-01 -9.099948019697360e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.770000000000000e+02 -3.922918349583314e-01 -8.874998840948806e-01 -2.240007959076084e-01 -9.096546261827590e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.780000000000000e+02 -3.922781368825890e-01 -8.874977257970961e-01 -2.240471404403162e-01 -9.093145159637910e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.790000000000000e+02 -3.922644384302769e-01 -8.874955643204101e-01 -2.240934799579149e-01 -9.089744713097270e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.800000000000000e+02 -3.922507396207611e-01 -8.874933996589320e-01 -2.241398144546868e-01 -9.086344922473290e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.810000000000000e+02 -3.922370404046511e-01 -8.874912318317884e-01 -2.241861439492721e-01 -9.082945787271431e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.820000000000000e+02 -3.922233408574778e-01 -8.874890608126460e-01 -2.242324684161083e-01 -9.079547308376860e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.830000000000000e+02 -3.922096409214174e-01 -8.874868866236825e-01 -2.242787878769308e-01 -9.076149485189650e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.840000000000000e+02 -3.921959406041364e-01 -8.874847092632637e-01 -2.243251023301547e-01 -9.072752317848549e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.850000000000000e+02 -3.921822399429683e-01 -8.874825287189612e-01 -2.243714117637230e-01 -9.069355806819250e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.860000000000000e+02 -3.921685389131856e-01 -8.874803450009040e-01 -2.244177161876729e-01 -9.065959951865490e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.870000000000000e+02 -3.921548375055031e-01 -8.874781581136280e-01 -2.244640156064065e-01 -9.062564752939510e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.880000000000000e+02 -3.921411357350347e-01 -8.874759680527801e-01 -2.245103100157740e-01 -9.059170210256090e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.890000000000000e+02 -3.921274336075546e-01 -8.874737748174161e-01 -2.245565994148637e-01 -9.055776323933611e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.900000000000000e+02 -3.921137311198443e-01 -8.874715784098368e-01 -2.246028838061163e-01 -9.052383093972360e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.910000000000000e+02 -3.921000282711820e-01 -8.874693788314604e-01 -2.246491631909116e-01 -9.048990520418999e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.920000000000000e+02 -3.920863250477843e-01 -8.874671760884477e-01 -2.246954375752942e-01 -9.045598603169580e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.930000000000000e+02 -3.920726214829448e-01 -8.874649701698417e-01 -2.247417069486498e-01 -9.042207342646290e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.940000000000000e+02 -3.920589175351182e-01 -8.874627610918846e-01 -2.247879713269275e-01 -9.038816738425810e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.950000000000000e+02 -3.920452132532440e-01 -8.874605488379275e-01 -2.248342306940024e-01 -9.035426791103540e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.960000000000000e+02 -3.920315086159209e-01 -8.874583334169104e-01 -2.248804850585432e-01 -9.032037500497531e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.970000000000000e+02 -3.920178036019492e-01 -8.874561148376719e-01 -2.249267344293200e-01 -9.028648866408810e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.980000000000000e+02 -3.920040982581788e-01 -8.874538930843252e-01 -2.249729787909545e-01 -9.025260889410290e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.990000000000000e+02 -3.919903925284293e-01 -8.874516681784486e-01 -2.250192181644153e-01 -9.021873568928150e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.000000000000000e+02 -3.919766864809019e-01 -8.874494400963900e-01 -2.250654525268118e-01 -9.018486905772111e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.010000000000000e+02 -3.919629800589225e-01 -8.874472088598881e-01 -2.251116818993998e-01 -9.015100899350011e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.020000000000000e+02 -3.919492732880968e-01 -8.874449744607837e-01 -2.251579062742883e-01 -9.011715549999870e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.030000000000000e+02 -3.919355661844915e-01 -8.874427368943859e-01 -2.252041256469485e-01 -9.008330857954340e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.040000000000000e+02 -3.919218587168653e-01 -8.874404961731820e-01 -2.252503400296743e-01 -9.004946822902490e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.050000000000000e+02 -3.919081509007039e-01 -8.874382522926921e-01 -2.252965494181405e-01 -9.001563445070331e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.060000000000000e+02 -3.918944427398199e-01 -8.874360052526732e-01 -2.253427538121884e-01 -8.998180724548301e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.070000000000000e+02 -3.918807342356616e-01 -8.874337550537494e-01 -2.253889532124325e-01 -8.994798661406790e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.080000000000000e+02 -3.918670253885831e-01 -8.874315016969176e-01 -2.254351476200501e-01 -8.991417255685299e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.090000000000000e+02 -3.918533161856657e-01 -8.874292451880249e-01 -2.254813370407033e-01 -8.988036507294460e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.100000000000000e+02 -3.918396066552645e-01 -8.874269855179135e-01 -2.255275214655511e-01 -8.984656416603749e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.110000000000000e+02 -3.918258967764538e-01 -8.874247226953148e-01 -2.255737009032471e-01 -8.981276983416039e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.120000000000000e+02 -3.918121865532072e-01 -8.874224567199340e-01 -2.256198753535168e-01 -8.977898207829629e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.130000000000000e+02 -3.917984759878191e-01 -8.874201875920782e-01 -2.256660448167355e-01 -8.974520089918010e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.140000000000000e+02 -3.917847650924087e-01 -8.874179153084917e-01 -2.257122092897705e-01 -8.971142629870300e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.150000000000000e+02 -3.917710538535477e-01 -8.874156398751784e-01 -2.257583687786363e-01 -8.967765827572470e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.160000000000000e+02 -3.917573422744335e-01 -8.874133612921249e-01 -2.258045232833317e-01 -8.964389683114179e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.170000000000000e+02 -3.917436303699426e-01 -8.874110795550645e-01 -2.258506727998178e-01 -8.961014196709220e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.180000000000000e+02 -3.917299181109661e-01 -8.874087946757249e-01 -2.258968173394288e-01 -8.957639368086980e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.190000000000000e+02 -3.917162055407210e-01 -8.874065066395215e-01 -2.259429568883039e-01 -8.954265197765050e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.200000000000000e+02 -3.917024926105025e-01 -8.874042154653021e-01 -2.259890914646461e-01 -8.950891685253880e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.210000000000000e+02 -3.916887793749936e-01 -8.874019211343434e-01 -2.260352210504016e-01 -8.947518831218100e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.220000000000000e+02 -3.916750658028214e-01 -8.873996236591667e-01 -2.260813456578705e-01 -8.944146635342810e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.230000000000000e+02 -3.916613518741096e-01 -8.873973230481406e-01 -2.261274652951374e-01 -8.940775097459649e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.240000000000000e+02 -3.916476376409543e-01 -8.873950192834746e-01 -2.261735799451256e-01 -8.937404218198761e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.250000000000000e+02 -3.916339230836790e-01 -8.873927123734647e-01 -2.262196896158521e-01 -8.934033997394331e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.260000000000000e+02 -3.916202081719354e-01 -8.873904023302566e-01 -2.262657943192450e-01 -8.930664434741931e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.270000000000000e+02 -3.916064929586215e-01 -8.873880891357787e-01 -2.263118940378969e-01 -8.927295530887570e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.280000000000000e+02 -3.915927774134483e-01 -8.873857728021803e-01 -2.263579887835362e-01 -8.923927285546200e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.290000000000000e+02 -3.915790615310977e-01 -8.873834533325121e-01 -2.264040785593211e-01 -8.920559698693301e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.300000000000000e+02 -3.915653453405129e-01 -8.873811307174059e-01 -2.264501633562404e-01 -8.917192770707159e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.310000000000000e+02 -3.915516288133549e-01 -8.873788049682917e-01 -2.264962431853908e-01 -8.913826501317820e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.320000000000000e+02 -3.915379119834180e-01 -8.873764760740398e-01 -2.265423180360679e-01 -8.910460890958120e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.330000000000000e+02 -3.915241948206315e-01 -8.873741440466900e-01 -2.265883879200897e-01 -8.907095939325960e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.340000000000000e+02 -3.915104773220437e-01 -8.873718088884578e-01 -2.266344528396046e-01 -8.903731646441840e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.350000000000000e+02 -3.914967595309033e-01 -8.873694705847809e-01 -2.266805127806092e-01 -8.900368012845269e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.360000000000000e+02 -3.914830414211671e-01 -8.873671291462347e-01 -2.267265677535081e-01 -8.897005038279029e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.370000000000000e+02 -3.914693229730026e-01 -8.873647845811645e-01 -2.267726177663507e-01 -8.893642722573930e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.380000000000000e+02 -3.914556042217387e-01 -8.873624368778752e-01 -2.268186628079671e-01 -8.890281066174591e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.390000000000000e+02 -3.914418851491262e-01 -8.873600860441366e-01 -2.268647028858531e-01 -8.886920068929560e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.400000000000000e+02 -3.914281657756813e-01 -8.873577320736157e-01 -2.269107379941381e-01 -8.883559731104870e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.410000000000000e+02 -3.914144460772559e-01 -8.873553749762223e-01 -2.269567681423756e-01 -8.880200052482390e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.420000000000000e+02 -3.914007260594866e-01 -8.873530147510432e-01 -2.270027933297722e-01 -8.876841033173030e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.430000000000000e+02 -3.913870057521314e-01 -8.873506513884167e-01 -2.270488135470576e-01 -8.873482673565659e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.440000000000000e+02 -3.913732851195652e-01 -8.873482849023914e-01 -2.270948288079641e-01 -8.870124973294070e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.450000000000000e+02 -3.913595641799225e-01 -8.873459152875248e-01 -2.271408391072791e-01 -8.866767932616131e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.460000000000000e+02 -3.913458429337611e-01 -8.873435425447561e-01 -2.271868444459259e-01 -8.863411551591850e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.470000000000000e+02 -3.913321213738117e-01 -8.873411666778380e-01 -2.272328448277354e-01 -8.860055830174191e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.480000000000000e+02 -3.913183995140816e-01 -8.873387876828260e-01 -2.272788402489388e-01 -8.856700768574850e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.490000000000000e+02 -3.913046773388393e-01 -8.873364055665627e-01 -2.273248307161986e-01 -8.853346366663570e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.500000000000000e+02 -3.912909548815967e-01 -8.873340203180241e-01 -2.273708162189487e-01 -8.849992624872480e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.510000000000000e+02 -3.912772320953811e-01 -8.873316319553721e-01 -2.274167967748578e-01 -8.846639542705841e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.520000000000000e+02 -3.912635090085609e-01 -8.873292404694497e-01 -2.274627723751527e-01 -8.843287120537660e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.530000000000000e+02 -3.912497856372512e-01 -8.873268458555491e-01 -2.275087430153372e-01 -8.839935358603750e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.540000000000000e+02 -3.912360619578295e-01 -8.873244481233543e-01 -2.275547087049360e-01 -8.836584256671970e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.550000000000000e+02 -3.912223379741150e-01 -8.873220472726183e-01 -2.276006694437337e-01 -8.833233814838880e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.560000000000000e+02 -3.912086136820036e-01 -8.873196433059595e-01 -2.276466252343337e-01 -8.829884033105240e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.570000000000000e+02 -3.911948891155089e-01 -8.873172362121750e-01 -2.276925760660105e-01 -8.826534911909729e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.580000000000000e+02 -3.911811642341946e-01 -8.873148260070473e-01 -2.277385219541346e-01 -8.823186450829240e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.590000000000000e+02 -3.911674390631185e-01 -8.873124126826226e-01 -2.277844628910995e-01 -8.819838650201030e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.600000000000000e+02 -3.911537135915158e-01 -8.873099962439444e-01 -2.278303988817665e-01 -8.816491509956510e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.610000000000000e+02 -3.911399878388556e-01 -8.873075766850589e-01 -2.278763299206558e-01 -8.813145030351320e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.620000000000000e+02 -3.911262617773638e-01 -8.873051540171798e-01 -2.279222560185442e-01 -8.809799211123710e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.630000000000000e+02 -3.911125354211977e-01 -8.873027282362980e-01 -2.279681771716799e-01 -8.806454052481430e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.640000000000000e+02 -3.910988087947820e-01 -8.873002993346906e-01 -2.280140933726877e-01 -8.803109554755249e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.650000000000000e+02 -3.910850818630379e-01 -8.872978673261913e-01 -2.280600046350550e-01 -8.799765717581561e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.660000000000000e+02 -3.910713546417187e-01 -8.872954322062214e-01 -2.281059109544200e-01 -8.796422541192550e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.670000000000000e+02 -3.910576271252400e-01 -8.872929939779330e-01 -2.281518123338964e-01 -8.793080025571780e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.680000000000000e+02 -3.910438993382391e-01 -8.872905526335264e-01 -2.281977087660395e-01 -8.789738171052830e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.690000000000000e+02 -3.910301712585998e-01 -8.872881081821303e-01 -2.282436002598252e-01 -8.786396977418789e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.700000000000000e+02 -3.910164428814095e-01 -8.872856606266611e-01 -2.282894868180716e-01 -8.783056444666930e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.710000000000000e+02 -3.910027142292204e-01 -8.872832099600749e-01 -2.283353684340619e-01 -8.779716573107260e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.720000000000000e+02 -3.909889853042083e-01 -8.872807561826904e-01 -2.283812451083341e-01 -8.776377362799311e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.730000000000000e+02 -3.909752560714390e-01 -8.872782993083089e-01 -2.284271168541263e-01 -8.773038813398110e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.740000000000000e+02 -3.909615265728228e-01 -8.872758393228586e-01 -2.284729836580661e-01 -8.769700925428370e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.750000000000000e+02 -3.909477967930619e-01 -8.872733762330199e-01 -2.285188455265764e-01 -8.766363698768941e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.760000000000000e+02 -3.909340667286925e-01 -8.872709100411548e-01 -2.285647024621490e-01 -8.763027133414840e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.770000000000000e+02 -3.909203363766793e-01 -8.872684407494965e-01 -2.286105544669484e-01 -8.759691229384479e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.780000000000000e+02 -3.909066057711604e-01 -8.872659683468020e-01 -2.286564015302525e-01 -8.756355987120799e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.790000000000000e+02 -3.908928748591023e-01 -8.872634928534018e-01 -2.287022436717359e-01 -8.753021406052690e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.800000000000000e+02 -3.908791436917889e-01 -8.872610142518376e-01 -2.287480808747355e-01 -8.749687486819061e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.810000000000000e+02 -3.908654122460966e-01 -8.872585325516148e-01 -2.287939131484378e-01 -8.746354229202710e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.820000000000000e+02 -3.908516805154094e-01 -8.872560477562629e-01 -2.288397404962469e-01 -8.743021633180829e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.830000000000000e+02 -3.908379485185050e-01 -8.872535598600799e-01 -2.288855629129466e-01 -8.739689699002820e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.840000000000000e+02 -3.908242162421904e-01 -8.872510688689789e-01 -2.289313804042191e-01 -8.736358426570630e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.850000000000000e+02 -3.908104837009981e-01 -8.872485747788232e-01 -2.289771929661440e-01 -8.733027816103670e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.860000000000000e+02 -3.907967509001381e-01 -8.872460775888291e-01 -2.290230005982082e-01 -8.729697867696209e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.870000000000000e+02 -3.907830178081217e-01 -8.872435773115380e-01 -2.290688033124223e-01 -8.726368581040379e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.880000000000000e+02 -3.907692844566113e-01 -8.872410739365968e-01 -2.291146010989983e-01 -8.723039956545769e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.890000000000000e+02 -3.907555508384510e-01 -8.872385674677286e-01 -2.291603939615248e-01 -8.719711994183330e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.900000000000000e+02 -3.907418169438167e-01 -8.872360579095951e-01 -2.292061819046881e-01 -8.716384693874710e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.910000000000000e+02 -3.907280828010324e-01 -8.872335452530635e-01 -2.292519649198040e-01 -8.713058055997901e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.920000000000000e+02 -3.907143483775363e-01 -8.872310295110510e-01 -2.292977430193023e-01 -8.709732080225890e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.930000000000000e+02 -3.907006136912538e-01 -8.872285106781926e-01 -2.293435161980956e-01 -8.706406766817271e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.940000000000000e+02 -3.906868787624374e-01 -8.872259887482514e-01 -2.293892844504732e-01 -8.703082116039190e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.950000000000000e+02 -3.906731435322705e-01 -8.872234637436643e-01 -2.294350477978707e-01 -8.699758127268510e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.960000000000000e+02 -3.906594080765123e-01 -8.872209356381142e-01 -2.294808062152221e-01 -8.696434801428890e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.970000000000000e+02 -3.906456723413545e-01 -8.872184044521934e-01 -2.295265597224044e-01 -8.693112137935960e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.980000000000000e+02 -3.906319363550017e-01 -8.872158701768130e-01 -2.295723083107853e-01 -8.689790137167000e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.990000000000000e+02 -3.906182000996071e-01 -8.872133328195551e-01 -2.296180519876968e-01 -8.686468798963130e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.000000000000000e+02 -3.906044636010549e-01 -8.872107923721718e-01 -2.296637907453127e-01 -8.683148123675180e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.010000000000000e+02 -3.905907268363528e-01 -8.872082488440900e-01 -2.297095245928568e-01 -8.679828111072641e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.020000000000000e+02 -3.905769898189131e-01 -8.872057022315781e-01 -2.297552535268094e-01 -8.676508761362731e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.030000000000000e+02 -3.905632525389633e-01 -8.872031525393022e-01 -2.298009775516519e-01 -8.673190074485460e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.040000000000000e+02 -3.905495150155415e-01 -8.872005997614650e-01 -2.298466966621027e-01 -8.669872050694630e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.050000000000000e+02 -3.905357772444197e-01 -8.871980439007243e-01 -2.298924108607313e-01 -8.666554689994230e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.060000000000000e+02 -3.905220391938846e-01 -8.871954849696804e-01 -2.299381201596396e-01 -8.663237992064721e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.070000000000000e+02 -3.905083009204129e-01 -8.871929229490068e-01 -2.299838245404650e-01 -8.659921957610620e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.080000000000000e+02 -3.904945623903825e-01 -8.871903578519763e-01 -2.300295240160851e-01 -8.656606586278059e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.090000000000000e+02 -3.904808235975227e-01 -8.871877896819835e-01 -2.300752185897679e-01 -8.653291878047049e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.100000000000000e+02 -3.904670845721550e-01 -8.871852184291747e-01 -2.301209082521745e-01 -8.649977833320580e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.110000000000000e+02 -3.904533452931384e-01 -8.871826441023001e-01 -2.301665930118736e-01 -8.646664451888550e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.120000000000000e+02 -3.904396057647675e-01 -8.871800667009291e-01 -2.302122728684941e-01 -8.643351733853030e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.130000000000000e+02 -3.904258659877917e-01 -8.871774862259044e-01 -2.302579478229444e-01 -8.640039679269070e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.140000000000000e+02 -3.904121259783831e-01 -8.871749026724955e-01 -2.303036178707651e-01 -8.636728288376461e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.150000000000000e+02 -3.903983857157461e-01 -8.871723160493251e-01 -2.303492830203999e-01 -8.633417560968509e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.160000000000000e+02 -3.903846452206705e-01 -8.871697263499908e-01 -2.303949432658014e-01 -8.630107497338541e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.170000000000000e+02 -3.903709044678594e-01 -8.871671335847627e-01 -2.304405986168400e-01 -8.626798097239780e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.180000000000000e+02 -3.903571634761817e-01 -8.871645377479327e-01 -2.304862490681305e-01 -8.623489360943280e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.190000000000000e+02 -3.903434222567063e-01 -8.871619388365896e-01 -2.305318946171512e-01 -8.620181288611500e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.200000000000000e+02 -3.903296807880836e-01 -8.871593368595819e-01 -2.305775352723517e-01 -8.616873880049250e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.210000000000000e+02 -3.903159390936261e-01 -8.871567318095941e-01 -2.306231710268236e-01 -8.613567135579520e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.220000000000000e+02 -3.903021971514608e-01 -8.871541236956353e-01 -2.306688018893694e-01 -8.610261054982400e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.230000000000000e+02 -3.902884549751474e-01 -8.871515125139195e-01 -2.307144278564350e-01 -8.606955638467691e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.240000000000000e+02 -3.902747125452010e-01 -8.871488982726087e-01 -2.307600489358799e-01 -8.603650885855130e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.250000000000000e+02 -3.902609699192165e-01 -8.871462809519836e-01 -2.308056651090258e-01 -8.600346797866559e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.260000000000000e+02 -3.902472270249762e-01 -8.871436605792664e-01 -2.308512764019613e-01 -8.597043373696400e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.270000000000000e+02 -3.902334839185747e-01 -8.871410371352811e-01 -2.308968827965278e-01 -8.593740614049181e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.280000000000000e+02 -3.902197405773060e-01 -8.871384106293633e-01 -2.309424843016286e-01 -8.590438518713270e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.290000000000000e+02 -3.902059969913972e-01 -8.871357810661393e-01 -2.309880809218999e-01 -8.587137087608680e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.300000000000000e+02 -3.901922531886248e-01 -8.871331484366798e-01 -2.310336726489140e-01 -8.583836321111039e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.310000000000000e+02 -3.901785091522885e-01 -8.871305127481357e-01 -2.310792594895670e-01 -8.580536219072039e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.320000000000000e+02 -3.901647648883501e-01 -8.871278739994694e-01 -2.311248414429190e-01 -8.577236781613350e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.330000000000000e+02 -3.901510204019367e-01 -8.871252321899161e-01 -2.311704185084925e-01 -8.573938008828710e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.340000000000000e+02 -3.901372756846887e-01 -8.871225873236179e-01 -2.312159906902606e-01 -8.570639900672759e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.350000000000000e+02 -3.901235307404051e-01 -8.871199394003189e-01 -2.312615579880251e-01 -8.567342457241990e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.360000000000000e+02 -3.901097855727244e-01 -8.871172884197921e-01 -2.313071204018199e-01 -8.564045678612710e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.370000000000000e+02 -3.900960401938228e-01 -8.871146343787515e-01 -2.313526779285777e-01 -8.560749564979291e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.380000000000000e+02 -3.900822945653089e-01 -8.871119772921892e-01 -2.313982305826167e-01 -8.557454115939320e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.390000000000000e+02 -3.900685487418600e-01 -8.871093171414478e-01 -2.314437783463079e-01 -8.554159332183700e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.400000000000000e+02 -3.900548026765631e-01 -8.871066539445813e-01 -2.314893212370028e-01 -8.550865213197950e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.410000000000000e+02 -3.900410564111807e-01 -8.871039876876043e-01 -2.315348592415033e-01 -8.547571759522410e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.420000000000000e+02 -3.900273099126140e-01 -8.871013183835914e-01 -2.315803923723051e-01 -8.544278970816049e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.430000000000000e+02 -3.900135631979664e-01 -8.870986460274745e-01 -2.316259206246563e-01 -8.540986847330900e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.440000000000000e+02 -3.899998162780072e-01 -8.870959706164467e-01 -2.316714439961528e-01 -8.537695389226790e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.450000000000000e+02 -3.899860691171419e-01 -8.870932921644926e-01 -2.317169625000771e-01 -8.534404596138960e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.460000000000000e+02 -3.899723217706632e-01 -8.870906106527369e-01 -2.317624761186158e-01 -8.531114468767100e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.470000000000000e+02 -3.899585741958800e-01 -8.870879260977000e-01 -2.318079848676532e-01 -8.527825006644790e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.480000000000000e+02 -3.899448263976640e-01 -8.870852384987350e-01 -2.318534887466244e-01 -8.524536209880920e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.490000000000000e+02 -3.899310784034860e-01 -8.870825478470159e-01 -2.318989877472986e-01 -8.521248078843520e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.500000000000000e+02 -3.899173301927308e-01 -8.870798541511093e-01 -2.319444818778278e-01 -8.517960613342830e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.510000000000000e+02 -3.899035817624900e-01 -8.870771574131509e-01 -2.319899711404835e-01 -8.514673813378219e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.520000000000000e+02 -3.898898331252186e-01 -8.870744576297526e-01 -2.320354555321118e-01 -8.511387679147819e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.530000000000000e+02 -3.898760842868491e-01 -8.870717547998835e-01 -2.320809350517897e-01 -8.508102210773240e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.540000000000000e+02 -3.898623352435461e-01 -8.870690489260143e-01 -2.321264097021063e-01 -8.504817408243140e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.550000000000000e+02 -3.898485859826901e-01 -8.870663400138185e-01 -2.321718794884735e-01 -8.501533271461030e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.560000000000000e+02 -3.898348365166889e-01 -8.870636280599142e-01 -2.322173444078144e-01 -8.498249800618460e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.570000000000000e+02 -3.898210868450148e-01 -8.870609130656051e-01 -2.322628044614116e-01 -8.494966995761040e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.580000000000000e+02 -3.898073369756052e-01 -8.870581950291054e-01 -2.323082596478341e-01 -8.491684857015780e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.590000000000000e+02 -3.897935868949001e-01 -8.870554739564275e-01 -2.323537099728111e-01 -8.488403384274920e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.600000000000000e+02 -3.897798366173023e-01 -8.870527498434776e-01 -2.323991554325298e-01 -8.485122577759750e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.610000000000000e+02 -3.897660861401519e-01 -8.870500226923000e-01 -2.324445960291758e-01 -8.481842437472560e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.620000000000000e+02 -3.897523354583708e-01 -8.870472925058401e-01 -2.324900317655823e-01 -8.478562963405251e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.630000000000000e+02 -3.897385845701041e-01 -8.870445592858689e-01 -2.325354626435406e-01 -8.475284155581510e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.640000000000000e+02 -3.897248334939584e-01 -8.870418230267744e-01 -2.325808886578088e-01 -8.472006014272560e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.650000000000000e+02 -3.897110822076418e-01 -8.870390837376916e-01 -2.326263098172623e-01 -8.468728539248840e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.660000000000000e+02 -3.896973307422141e-01 -8.870363414085094e-01 -2.326717261124170e-01 -8.465451730928610e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.670000000000000e+02 -3.896835790670147e-01 -8.870335960514043e-01 -2.327171375548797e-01 -8.462175588995630e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.680000000000000e+02 -3.896698271977716e-01 -8.870308476618033e-01 -2.327625441403919e-01 -8.458900113687150e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.690000000000000e+02 -3.896560751366382e-01 -8.870280962400097e-01 -2.328079458694968e-01 -8.455625305062070e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.700000000000000e+02 -3.896423228811892e-01 -8.870253417880075e-01 -2.328533427441206e-01 -8.452351163143360e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.710000000000000e+02 -3.896285704357358e-01 -8.870225843053484e-01 -2.328987347638960e-01 -8.449077688033629e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.720000000000000e+02 -3.896148177919051e-01 -8.870198237961356e-01 -2.329441219329478e-01 -8.445804879667231e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.730000000000000e+02 -3.896010649681132e-01 -8.870170602548266e-01 -2.329895042461098e-01 -8.442532738313600e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.740000000000000e+02 -3.895873119395528e-01 -8.870142936914776e-01 -2.330348817129798e-01 -8.439261263724671e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.750000000000000e+02 -3.895735587361527e-01 -8.870115240963883e-01 -2.330802543244765e-01 -8.435990456306269e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.760000000000000e+02 -3.895598053406938e-01 -8.870087514768553e-01 -2.331256220877324e-01 -8.432720315887900e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.770000000000000e+02 -3.895460517416005e-01 -8.870059758381649e-01 -2.331709850077807e-01 -8.429450842383809e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.780000000000000e+02 -3.895322979880200e-01 -8.870031971636779e-01 -2.332163430690132e-01 -8.426182036428080e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.790000000000000e+02 -3.895185440280366e-01 -8.870004154732170e-01 -2.332616962903526e-01 -8.422913897438540e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.800000000000000e+02 -3.895047898779720e-01 -8.869976307619947e-01 -2.333070446673482e-01 -8.419646425660100e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.810000000000000e+02 -3.894910355521683e-01 -8.869948430259292e-01 -2.333523881962842e-01 -8.416379621308311e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.820000000000000e+02 -3.894772810552216e-01 -8.869920522644674e-01 -2.333977268766999e-01 -8.413113484489310e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.830000000000000e+02 -3.894635263674755e-01 -8.869892584857818e-01 -2.334430607165453e-01 -8.409848015003030e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.840000000000000e+02 -3.894497714918655e-01 -8.869864616899172e-01 -2.334883897159209e-01 -8.406583212935570e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.850000000000000e+02 -3.894360164410941e-01 -8.869836618733932e-01 -2.335337138716121e-01 -8.403319078489251e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.860000000000000e+02 -3.894222612191845e-01 -8.869808590358332e-01 -2.335790331835275e-01 -8.400055611745180e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.870000000000000e+02 -3.894085058091974e-01 -8.869780531844559e-01 -2.336243476585139e-01 -8.396792812553340e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.880000000000000e+02 -3.893947502142807e-01 -8.869752443192188e-01 -2.336696572966577e-01 -8.393530680996331e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.890000000000000e+02 -3.893809944638573e-01 -8.869724324306067e-01 -2.337149620890764e-01 -8.390269217475670e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.900000000000000e+02 -3.893672385284966e-01 -8.869696175303162e-01 -2.337602620470259e-01 -8.387008421674320e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.910000000000000e+02 -3.893534824174786e-01 -8.869667996161006e-01 -2.338055571684557e-01 -8.383748293753940e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.920000000000000e+02 -3.893397261244081e-01 -8.869639786913613e-01 -2.338508474566890e-01 -8.380488833683571e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.930000000000000e+02 -3.893259696641326e-01 -8.869611547518430e-01 -2.338961329077897e-01 -8.377230041691390e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.940000000000000e+02 -3.893122130448001e-01 -8.869583277956791e-01 -2.339414135202703e-01 -8.373971917907740e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.950000000000000e+02 -3.892984562414886e-01 -8.869554978329645e-01 -2.339866893036723e-01 -8.370714462086699e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.960000000000000e+02 -3.892846992709132e-01 -8.869526648587697e-01 -2.340319602534282e-01 -8.367457674478840e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.970000000000000e+02 -3.892709421262501e-01 -8.869498288766291e-01 -2.340772263731216e-01 -8.364201555035761e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.980000000000000e+02 -3.892571848217778e-01 -8.869469898824931e-01 -2.341224876590137e-01 -8.360946103979150e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.990000000000000e+02 -3.892434273401168e-01 -8.869441478837223e-01 -2.341677441181430e-01 -8.357691321146569e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.000000000000000e+03 -3.892296696960170e-01 -8.869413028760968e-01 -2.342129957466129e-01 -8.354437206765350e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.001000000000000e+03 -3.892159118964699e-01 -8.869384548581660e-01 -2.342582425433288e-01 -8.351183760952210e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.002000000000000e+03 -3.892021539130040e-01 -8.869356038413008e-01 -2.343034845190202e-01 -8.347930983417810e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.003000000000000e+03 -3.891883957863876e-01 -8.869327498118953e-01 -2.343487216609909e-01 -8.344678874700850e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.004000000000000e+03 -3.891746374880306e-01 -8.869298927813326e-01 -2.343939539801826e-01 -8.341427434492379e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.005000000000000e+03 -3.891608790214737e-01 -8.869270327494349e-01 -2.344391814764920e-01 -8.338176662885750e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.006000000000000e+03 -3.891471203899817e-01 -8.869241697161141e-01 -2.344844041499684e-01 -8.334926559964979e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.007000000000000e+03 -3.891333616169321e-01 -8.869213036740384e-01 -2.345296219938055e-01 -8.331677126061270e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.008000000000000e+03 -3.891196026680442e-01 -8.869184346366398e-01 -2.345748350208596e-01 -8.328428360796830e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.009000000000000e+03 -3.891058435643950e-01 -8.869155625974160e-01 -2.346200432251024e-01 -8.325180264475190e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.010000000000000e+03 -3.890920843107361e-01 -8.869126875557518e-01 -2.346652466060243e-01 -8.321932837204481e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.011000000000000e+03 -3.890783248863118e-01 -8.869098095202005e-01 -2.347104451719052e-01 -8.318686078768550e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.012000000000000e+03 -3.890645653170385e-01 -8.869069284825138e-01 -2.347556389150870e-01 -8.315439989529300e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.013000000000000e+03 -3.890508055878542e-01 -8.869040444492113e-01 -2.348008278418086e-01 -8.312194569351020e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.014000000000000e+03 -3.890370457078947e-01 -8.869011574180954e-01 -2.348460119500795e-01 -8.308949818394280e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.015000000000000e+03 -3.890232856727591e-01 -8.868982673918208e-01 -2.348911912426548e-01 -8.305705736639060e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.016000000000000e+03 -3.890095254874654e-01 -8.868953743696747e-01 -2.349363657189349e-01 -8.302462324196620e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.017000000000000e+03 -3.889957651366215e-01 -8.868924783582928e-01 -2.349815353852635e-01 -8.299219580926710e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.018000000000000e+03 -3.889820046638924e-01 -8.868895793430298e-01 -2.350267002280076e-01 -8.295977507405340e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.019000000000000e+03 -3.889682440289070e-01 -8.868866773395061e-01 -2.350718602620507e-01 -8.292736103179950e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.020000000000000e+03 -3.889544832186075e-01 -8.868837723535232e-01 -2.351170154928862e-01 -8.289495368143890e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.021000000000000e+03 -3.889407222966338e-01 -8.868808643632370e-01 -2.351621659001548e-01 -8.286255303114080e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.022000000000000e+03 -3.889269612068577e-01 -8.868779533899447e-01 -2.352073115040429e-01 -8.283015907447630e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.023000000000000e+03 -3.889131999855689e-01 -8.868750394216607e-01 -2.352524522934141e-01 -8.279777181632381e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.024000000000000e+03 -3.888994386000496e-01 -8.868721224712617e-01 -2.352975882804420e-01 -8.276539125318870e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.025000000000000e+03 -3.888856770901252e-01 -8.868692025254887e-01 -2.353427194528049e-01 -8.273301739037900e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.026000000000000e+03 -3.888719154288452e-01 -8.868662795951198e-01 -2.353878458208471e-01 -8.270065022497360e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.027000000000000e+03 -3.888581536075930e-01 -8.868633536843523e-01 -2.354329673885597e-01 -8.266828975643831e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.028000000000000e+03 -3.888443916798668e-01 -8.868604247750020e-01 -2.354780841390273e-01 -8.263593599173780e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.029000000000000e+03 -3.888306295852148e-01 -8.868574928899164e-01 -2.355231960938639e-01 -8.260358892390200e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.030000000000000e+03 -3.888168673530965e-01 -8.868545580195724e-01 -2.355683032442459e-01 -8.257124855699380e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.031000000000000e+03 -3.888031049869446e-01 -8.868516201638161e-01 -2.356134055901692e-01 -8.253891489187480e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.032000000000000e+03 -3.887893424861794e-01 -8.868486793239491e-01 -2.356585031329212e-01 -8.250658792898320e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.033000000000000e+03 -3.887755798407114e-01 -8.868457355046688e-01 -2.357035958771607e-01 -8.247426766742511e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.034000000000000e+03 -3.887618170571569e-01 -8.868427887046834e-01 -2.357486838217541e-01 -8.244195410850599e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.035000000000000e+03 -3.887480541437405e-01 -8.868398389221211e-01 -2.357937669650279e-01 -8.240964725372731e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.036000000000000e+03 -3.887342910939902e-01 -8.868368861603759e-01 -2.358388453104232e-01 -8.237734710263279e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.037000000000000e+03 -3.887205279109767e-01 -8.868339304194323e-01 -2.358839188579993e-01 -8.234505365609980e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.038000000000000e+03 -3.887067645958987e-01 -8.868309716999396e-01 -2.359289876085026e-01 -8.231276691471941e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.039000000000000e+03 -3.886930011477050e-01 -8.868280100033665e-01 -2.359740515633770e-01 -8.228048687886980e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.040000000000000e+03 -3.886792375649629e-01 -8.868250453312900e-01 -2.360191107243679e-01 -8.224821354870300e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.041000000000000e+03 -3.886654738554165e-01 -8.868220776820109e-01 -2.360641650899659e-01 -8.221594692566260e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.042000000000000e+03 -3.886517100124058e-01 -8.868191070590073e-01 -2.361092146635551e-01 -8.218368700938671e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.043000000000000e+03 -3.886379460474597e-01 -8.868161334592172e-01 -2.361542594423562e-01 -8.215143380177881e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.044000000000000e+03 -3.886241819423135e-01 -8.868131568902775e-01 -2.361992994337624e-01 -8.211918730094719e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.045000000000000e+03 -3.886104177267867e-01 -8.868101773425380e-01 -2.362443346288590e-01 -8.208694751101700e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.046000000000000e+03 -3.885966533778275e-01 -8.868071948253894e-01 -2.362893650364695e-01 -8.205471442969410e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.047000000000000e+03 -3.885828889084434e-01 -8.868042093352061e-01 -2.363343906534949e-01 -8.202248805888269e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.048000000000000e+03 -3.885691243033704e-01 -8.868012208785725e-01 -2.363794114861423e-01 -8.199026839723250e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.049000000000000e+03 -3.885553595735650e-01 -8.867982294526211e-01 -2.364244275318847e-01 -8.195805544651860e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.050000000000000e+03 -3.885415947342454e-01 -8.867952350529605e-01 -2.364694387867118e-01 -8.192584920909600e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.051000000000000e+03 -3.885278297727477e-01 -8.867922376852079e-01 -2.365144452561320e-01 -8.189364968374940e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.052000000000000e+03 -3.885140646797914e-01 -8.867892373537914e-01 -2.365594469443421e-01 -8.186145686985261e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.053000000000000e+03 -3.885002994745270e-01 -8.867862340529038e-01 -2.366044438460159e-01 -8.182927077024030e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.054000000000000e+03 -3.884865341495080e-01 -8.867832277862819e-01 -2.366494359649108e-01 -8.179709138432960e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.055000000000000e+03 -3.884727687118122e-01 -8.867802185524647e-01 -2.366944232997454e-01 -8.176491871348700e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.056000000000000e+03 -3.884590031353202e-01 -8.867772063619298e-01 -2.367394058604091e-01 -8.173275275497090e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.057000000000000e+03 -3.884452374647676e-01 -8.867741911996607e-01 -2.367843836330170e-01 -8.170059351473841e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.058000000000000e+03 -3.884314716755993e-01 -8.867711730755513e-01 -2.368293566270494e-01 -8.166844099011980e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.059000000000000e+03 -3.884177057545868e-01 -8.867681519954481e-01 -2.368743248480195e-01 -8.163629518000221e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.060000000000000e+03 -3.884039397459766e-01 -8.867651279445111e-01 -2.369192882822141e-01 -8.160415609028890e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.061000000000000e+03 -3.883901736082829e-01 -8.867621009387259e-01 -2.369642469447708e-01 -8.157202371623860e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.062000000000000e+03 -3.883764073523223e-01 -8.867590709752841e-01 -2.370092008331585e-01 -8.153989805967291e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.063000000000000e+03 -3.883626410017759e-01 -8.867560380467376e-01 -2.370541499406064e-01 -8.150777912392830e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.064000000000000e+03 -3.883488745340885e-01 -8.867530021622877e-01 -2.370990942757417e-01 -8.147566690675090e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.065000000000000e+03 -3.883351079510922e-01 -8.867499633223279e-01 -2.371440338392121e-01 -8.144356140868581e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.066000000000000e+03 -3.883213412674472e-01 -8.867469215226669e-01 -2.371889686272066e-01 -8.141146263202820e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.067000000000000e+03 -3.883075744664021e-01 -8.867438767704050e-01 -2.372338986464656e-01 -8.137937057517040e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.068000000000000e+03 -3.882938075715761e-01 -8.867408290581272e-01 -2.372788238901878e-01 -8.134728524150429e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.069000000000000e+03 -3.882800405593428e-01 -8.867377783953860e-01 -2.373237443675228e-01 -8.131520662845940e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.070000000000000e+03 -3.882662734474191e-01 -8.867347247768903e-01 -2.373686600736422e-01 -8.128313473870670e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.071000000000000e+03 -3.882525062350955e-01 -8.867316682039768e-01 -2.374135710098692e-01 -8.125106957266071e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.072000000000000e+03 -3.882387389184899e-01 -8.867286086790945e-01 -2.374584771787600e-01 -8.121901113016720e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.073000000000000e+03 -3.882249714911819e-01 -8.867255462056340e-01 -2.375033785835424e-01 -8.118695941093911e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.074000000000000e+03 -3.882112039571377e-01 -8.867224807832398e-01 -2.375482752240353e-01 -8.115491441590281e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.075000000000000e+03 -3.881974363306373e-01 -8.867194124078565e-01 -2.375931670965624e-01 -8.112287614731049e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.076000000000000e+03 -3.881836686172299e-01 -8.867163410785386e-01 -2.376380542005344e-01 -8.109084460616631e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.077000000000000e+03 -3.881699007904249e-01 -8.867132668058952e-01 -2.376829365458687e-01 -8.105881978971791e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.078000000000000e+03 -3.881561328656827e-01 -8.867101895854452e-01 -2.377278141284953e-01 -8.102680170036260e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.079000000000000e+03 -3.881423648394585e-01 -8.867071094195138e-01 -2.377726869508550e-01 -8.099479033798550e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.080000000000000e+03 -3.881285967326563e-01 -8.867040263016625e-01 -2.378175550070679e-01 -8.096278570565650e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.081000000000000e+03 -3.881148285112191e-01 -8.867009402452085e-01 -2.378624183096226e-01 -8.093078779962790e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.082000000000000e+03 -3.881010602117726e-01 -8.866978512380603e-01 -2.379072768474046e-01 -8.089879662490340e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.083000000000000e+03 -3.880872918048156e-01 -8.866947592918746e-01 -2.379521306314967e-01 -8.086681217817350e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.084000000000000e+03 -3.880735233015609e-01 -8.866916644036977e-01 -2.379969796592482e-01 -8.083483446131670e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.085000000000000e+03 -3.880597547322235e-01 -8.866885665637450e-01 -2.380418239216885e-01 -8.080286347855289e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.086000000000000e+03 -3.880459860504590e-01 -8.866854657897268e-01 -2.380866634354989e-01 -8.077089922449560e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.087000000000000e+03 -3.880322172781396e-01 -8.866823620748571e-01 -2.381314981944843e-01 -8.073894170233530e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.088000000000000e+03 -3.880184484126482e-01 -8.866792554211439e-01 -2.381763282006565e-01 -8.070699091218871e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.089000000000000e+03 -3.880046794705685e-01 -8.866761458237029e-01 -2.382211534495845e-01 -8.067504685659919e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.090000000000000e+03 -3.879909104387859e-01 -8.866730332882956e-01 -2.382659739468874e-01 -8.064310953426961e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.091000000000000e+03 -3.879771413108282e-01 -8.866699178183254e-01 -2.383107896957995e-01 -8.061117894489871e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.092000000000000e+03 -3.879633721102441e-01 -8.866667994063935e-01 -2.383556006896349e-01 -8.057925509183141e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.093000000000000e+03 -3.879496028055604e-01 -8.866636780648892e-01 -2.384004069399357e-01 -8.054733797167930e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.094000000000000e+03 -3.879358334266524e-01 -8.866605537841197e-01 -2.384452084380315e-01 -8.051542758845030e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.095000000000000e+03 -3.879220639740526e-01 -8.866574265649697e-01 -2.384900051848298e-01 -8.048352394270930e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.096000000000000e+03 -3.879082944292173e-01 -8.866542964151793e-01 -2.385347971875729e-01 -8.045162703266159e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.097000000000000e+03 -3.878945247913856e-01 -8.866511633360669e-01 -2.385795844477673e-01 -8.041973685853079e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.098000000000000e+03 -3.878807550920057e-01 -8.866480273174050e-01 -2.386243669560557e-01 -8.038785342470289e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.099000000000000e+03 -3.878669853063341e-01 -8.866448883691508e-01 -2.386691447217926e-01 -8.035597672855610e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.100000000000000e+03 -3.878532154262294e-01 -8.866417464953039e-01 -2.387139177487607e-01 -8.032410676957689e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.101000000000000e+03 -3.878394454879998e-01 -8.866386016838607e-01 -2.387586860261680e-01 -8.029224355257950e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.102000000000000e+03 -3.878256754624467e-01 -8.866354539463878e-01 -2.388034495647842e-01 -8.026038707444511e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.103000000000000e+03 -3.878119053582397e-01 -8.866323032808426e-01 -2.388482083628146e-01 -8.022853733674250e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.104000000000000e+03 -3.877981351873737e-01 -8.866291496839591e-01 -2.388929624175370e-01 -8.019669434127751e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.105000000000000e+03 -3.877843649272078e-01 -8.866259931649446e-01 -2.389377117375394e-01 -8.016485808573810e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.106000000000000e+03 -3.877705946067629e-01 -8.866228337144350e-01 -2.389824563143411e-01 -8.013302857415970e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.107000000000000e+03 -3.877568242023459e-01 -8.866196713420154e-01 -2.390271961568756e-01 -8.010120580409950e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.108000000000000e+03 -3.877430537361463e-01 -8.866165060407554e-01 -2.390719312590447e-01 -8.006938977862831e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.109000000000000e+03 -3.877292831803547e-01 -8.866133378217174e-01 -2.391166616311425e-01 -8.003758049478830e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.110000000000000e+03 -3.877155125760156e-01 -8.866101666712289e-01 -2.391613872606543e-01 -8.000577795817281e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.111000000000000e+03 -3.877017418840510e-01 -8.866069926043686e-01 -2.392061081617763e-01 -7.997398216424370e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.112000000000000e+03 -3.876879711363468e-01 -8.866038156107536e-01 -2.392508243250311e-01 -7.994219311745880e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.113000000000000e+03 -3.876742003057477e-01 -8.866006357011988e-01 -2.392955357605461e-01 -7.991041081487750e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.114000000000000e+03 -3.876604294175999e-01 -8.865974528676713e-01 -2.393402424610125e-01 -7.987863526014610e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.115000000000000e+03 -3.876466584623347e-01 -8.865942671146475e-01 -2.393849444308508e-01 -7.984686645239120e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.116000000000000e+03 -3.876328874374734e-01 -8.865910784440874e-01 -2.394296416719605e-01 -7.981510439179910e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.117000000000000e+03 -3.876191163503808e-01 -8.865878868544063e-01 -2.394743341830434e-01 -7.978334907972040e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.118000000000000e+03 -3.876053451949591e-01 -8.865846923488634e-01 -2.395190219671951e-01 -7.975160051589060e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.119000000000000e+03 -3.875915739824853e-01 -8.865814949244478e-01 -2.395637050219404e-01 -7.971985870203011e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.120000000000000e+03 -3.875778027019644e-01 -8.865782945861768e-01 -2.396083833519936e-01 -7.968812363726280e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.121000000000000e+03 -3.875640313604884e-01 -8.865750913325725e-01 -2.396530569560890e-01 -7.965639532296601e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.122000000000000e+03 -3.875502599675090e-01 -8.865718851612795e-01 -2.396977258323568e-01 -7.962467376063530e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.123000000000000e+03 -3.875364885019116e-01 -8.865686760809467e-01 -2.397423899888515e-01 -7.959295894812940e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.124000000000000e+03 -3.875227169772170e-01 -8.865654640877774e-01 -2.397870494222429e-01 -7.956125088756770e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.125000000000000e+03 -3.875089454001284e-01 -8.865622491804331e-01 -2.398317041313957e-01 -7.952954958028211e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.126000000000000e+03 -3.874951737749229e-01 -8.865590313584155e-01 -2.398763541161517e-01 -7.949785502712151e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.127000000000000e+03 -3.874814020729446e-01 -8.865558106330780e-01 -2.399209993870472e-01 -7.946616722499930e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.128000000000000e+03 -3.874676303381856e-01 -8.865525869896964e-01 -2.399656399306419e-01 -7.943448617990480e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.129000000000000e+03 -3.874538585208036e-01 -8.865493604471973e-01 -2.400102757646330e-01 -7.940281188592301e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.130000000000000e+03 -3.874400866796631e-01 -8.865461309855186e-01 -2.400549068706794e-01 -7.937114435090629e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.131000000000000e+03 -3.874263147567984e-01 -8.865428986265214e-01 -2.400995332690358e-01 -7.933948356803770e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.132000000000000e+03 -3.874125428017411e-01 -8.865396633534940e-01 -2.401441549444451e-01 -7.930782954400591e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.133000000000000e+03 -3.873987707855918e-01 -8.865364251778434e-01 -2.401887719076869e-01 -7.927618227550910e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.134000000000000e+03 -3.873849987198966e-01 -8.865331840964911e-01 -2.402333841560326e-01 -7.924454176448401e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.135000000000000e+03 -3.873712266086682e-01 -8.865299401090621e-01 -2.402779916892367e-01 -7.921290801192531e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.136000000000000e+03 -3.873574544501257e-01 -8.865266932172299e-01 -2.403225945091373e-01 -7.918128101792429e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.137000000000000e+03 -3.873436822307959e-01 -8.865234434268930e-01 -2.403671926212488e-01 -7.914966078128290e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.138000000000000e+03 -3.873299099700568e-01 -8.865201907321525e-01 -2.404117860203226e-01 -7.911804730486230e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.139000000000000e+03 -3.873161376778485e-01 -8.865169351305061e-01 -2.404563747041636e-01 -7.908644059040169e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.140000000000000e+03 -3.873023653242662e-01 -8.865136766337161e-01 -2.405009586838680e-01 -7.905484063446230e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.141000000000000e+03 -3.872885929248590e-01 -8.865104152372671e-01 -2.405455379553915e-01 -7.902324743948630e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.142000000000000e+03 -3.872748204875731e-01 -8.865071509393615e-01 -2.405901125172538e-01 -7.899166100690200e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.143000000000000e+03 -3.872610479990976e-01 -8.865038837458373e-01 -2.406346823749109e-01 -7.896008133552850e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.144000000000000e+03 -3.872472754783814e-01 -8.865006136509286e-01 -2.406792475233776e-01 -7.892850842805990e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.145000000000000e+03 -3.872335029038040e-01 -8.864973406634536e-01 -2.407238079708417e-01 -7.889694228226871e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.146000000000000e+03 -3.872197303161133e-01 -8.864940647698583e-01 -2.407683637049794e-01 -7.886538290376890e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.147000000000000e+03 -3.872059576548104e-01 -8.864907859928737e-01 -2.408129147469305e-01 -7.883383028526481e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.148000000000000e+03 -3.871921849774272e-01 -8.864875043129258e-01 -2.408574610788569e-01 -7.880228443448289e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.149000000000000e+03 -3.871784122386460e-01 -8.864842197473198e-01 -2.409020027167864e-01 -7.877074534615019e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.150000000000000e+03 -3.871646394902543e-01 -8.864809322785429e-01 -2.409465396447769e-01 -7.873921302727660e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.151000000000000e+03 -3.871508666995957e-01 -8.864776419193372e-01 -2.409910718748068e-01 -7.870768747406350e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.152000000000000e+03 -3.871370938467402e-01 -8.864743486779106e-01 -2.410355994144951e-01 -7.867616868448690e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.153000000000000e+03 -3.871233209910755e-01 -8.864710525340253e-01 -2.410801222454130e-01 -7.864465666651990e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.154000000000000e+03 -3.871095480827457e-01 -8.864677535065896e-01 -2.411246403851795e-01 -7.861315141419120e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.155000000000000e+03 -3.870957751504961e-01 -8.864644515863553e-01 -2.411691538254319e-01 -7.858165293161309e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.156000000000000e+03 -3.870820021846522e-01 -8.864611467778402e-01 -2.412136625704776e-01 -7.855016121799610e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.157000000000000e+03 -3.870682291889396e-01 -8.864578390807684e-01 -2.412581666201687e-01 -7.851867627429820e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.158000000000000e+03 -3.870544561577691e-01 -8.864545284981712e-01 -2.413026659775853e-01 -7.848719810012600e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.159000000000000e+03 -3.870406830840145e-01 -8.864512150336625e-01 -2.413471606461373e-01 -7.845572669506599e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.160000000000000e+03 -3.870269100093754e-01 -8.864478986733499e-01 -2.413916506132246e-01 -7.842426206487429e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.161000000000000e+03 -3.870131368962652e-01 -8.864445794317367e-01 -2.414361358924191e-01 -7.839280420511489e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.162000000000000e+03 -3.869993637456348e-01 -8.864412573095393e-01 -2.414806164844807e-01 -7.836135311639390e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.163000000000000e+03 -3.869855905700168e-01 -8.864379323033121e-01 -2.415250923864322e-01 -7.832990880072400e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.164000000000000e+03 -3.869718173826083e-01 -8.864346044093817e-01 -2.415695635950232e-01 -7.829847126026310e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.165000000000000e+03 -3.869580441600749e-01 -8.864312736371388e-01 -2.416140301191451e-01 -7.826704049236990e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.166000000000000e+03 -3.869442709144468e-01 -8.864279399833280e-01 -2.416584919559294e-01 -7.823561649905340e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.167000000000000e+03 -3.869304976383578e-01 -8.864246034516351e-01 -2.417029491089180e-01 -7.820419927980890e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.168000000000000e+03 -3.869167243492220e-01 -8.864212640368757e-01 -2.417474015734823e-01 -7.817278883732870e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.169000000000000e+03 -3.869029510503734e-01 -8.864179217388795e-01 -2.417918493497773e-01 -7.814138517234760e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.170000000000000e+03 -3.868891777029686e-01 -8.864145765726231e-01 -2.418362924515879e-01 -7.810998828042789e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.171000000000000e+03 -3.868754043674569e-01 -8.864112285174985e-01 -2.418807308602052e-01 -7.807859816972010e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.172000000000000e+03 -3.868616309725455e-01 -8.864078776000788e-01 -2.419251646001986e-01 -7.804721483149180e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.173000000000000e+03 -3.868478575964324e-01 -8.864045237933957e-01 -2.419695936470600e-01 -7.801583827615000e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.174000000000000e+03 -3.868340841867379e-01 -8.864011671172642e-01 -2.420140180190515e-01 -7.798446849747601e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.175000000000000e+03 -3.868203107600038e-01 -8.863978075668111e-01 -2.420584377118341e-01 -7.795310549805480e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.176000000000000e+03 -3.868065373237049e-01 -8.863944451403807e-01 -2.421028527242091e-01 -7.792174927914500e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.177000000000000e+03 -3.867927638726654e-01 -8.863910798408816e-01 -2.421472630589404e-01 -7.789039984057540e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.178000000000000e+03 -3.867789903971939e-01 -8.863877116728400e-01 -2.421916687202648e-01 -7.785905718159940e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.179000000000000e+03 -3.867652169115039e-01 -8.863843406321849e-01 -2.422360697047818e-01 -7.782772130433240e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.180000000000000e+03 -3.867514434271731e-01 -8.863809667158219e-01 -2.422804660097815e-01 -7.779639221073351e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.181000000000000e+03 -3.867376699049251e-01 -8.863775899388642e-01 -2.423248576492191e-01 -7.776506989623130e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.182000000000000e+03 -3.867238963986474e-01 -8.863742102830603e-01 -2.423692446065694e-01 -7.773375436816859e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.183000000000000e+03 -3.867101228727764e-01 -8.863708277621702e-01 -2.424136268946870e-01 -7.770244562232780e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.184000000000000e+03 -3.866963493227800e-01 -8.863674423788698e-01 -2.424580045161198e-01 -7.767114365861520e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.185000000000000e+03 -3.866825757898461e-01 -8.863640541194574e-01 -2.425023774584976e-01 -7.763984848276230e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.186000000000000e+03 -3.866688022432417e-01 -8.863606629959614e-01 -2.425467457330918e-01 -7.760856009116300e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.187000000000000e+03 -3.866550286699281e-01 -8.863572690141025e-01 -2.425911093452238e-01 -7.757727848263769e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.188000000000000e+03 -3.866412551024776e-01 -8.863538721632557e-01 -2.426354682853971e-01 -7.754600366176451e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.189000000000000e+03 -3.866274815471321e-01 -8.863504724422363e-01 -2.426798225526481e-01 -7.751473562982550e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.190000000000000e+03 -3.866137079630756e-01 -8.863470698666805e-01 -2.427241721615251e-01 -7.748347438192039e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.191000000000000e+03 -3.865999343891290e-01 -8.863436644237366e-01 -2.427685171004429e-01 -7.745221992348721e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.192000000000000e+03 -3.865861607925873e-01 -8.863402561261545e-01 -2.428128573811857e-01 -7.742097225077429e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.193000000000000e+03 -3.865723872259497e-01 -8.863368449561857e-01 -2.428571929877185e-01 -7.738973137097130e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.194000000000000e+03 -3.865586136453653e-01 -8.863334309305498e-01 -2.429015239355688e-01 -7.735849727878480e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.195000000000000e+03 -3.865448400482670e-01 -8.863300140512147e-01 -2.429458502266388e-01 -7.732726997436780e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.196000000000000e+03 -3.865310664638856e-01 -8.863265943087634e-01 -2.429901718524793e-01 -7.729604946193960e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.197000000000000e+03 -3.865172928934666e-01 -8.863231717037675e-01 -2.430344888139274e-01 -7.726483574196900e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.198000000000000e+03 -3.865035193149788e-01 -8.863197462451624e-01 -2.430788011192223e-01 -7.723362881212040e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.199000000000000e+03 -3.864897457216147e-01 -8.863163179364226e-01 -2.431231087717036e-01 -7.720242867194410e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.200000000000000e+03 -3.864759721638658e-01 -8.863128867605208e-01 -2.431674117560119e-01 -7.717123532838741e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.201000000000000e+03 -3.864621985832823e-01 -8.863094527393964e-01 -2.432117100924019e-01 -7.714004877427280e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.202000000000000e+03 -3.864484250288468e-01 -8.863060158565625e-01 -2.432560037660098e-01 -7.710886901635609e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.203000000000000e+03 -3.864346514662005e-01 -8.863025761253653e-01 -2.433002927890764e-01 -7.707769605071740e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.204000000000000e+03 -3.864208779217084e-01 -8.862991335373827e-01 -2.433445771542700e-01 -7.704652988104220e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.205000000000000e+03 -3.864071043844287e-01 -8.862956880975776e-01 -2.433888568662151e-01 -7.701537050641040e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.206000000000000e+03 -3.863933308416743e-01 -8.862922398115262e-01 -2.434331319301584e-01 -7.698421792561630e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.207000000000000e+03 -3.863795573208058e-01 -8.862887886704821e-01 -2.434774023382774e-01 -7.695307214265169e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.208000000000000e+03 -3.863657838101351e-01 -8.862853346796427e-01 -2.435216680956087e-01 -7.692193315632380e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.209000000000000e+03 -3.863520103044515e-01 -8.862818778419179e-01 -2.435659292049113e-01 -7.689080096644429e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.210000000000000e+03 -3.863382368173886e-01 -8.862784181534736e-01 -2.436101856628249e-01 -7.685967557524470e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.211000000000000e+03 -3.863244633437523e-01 -8.862749556171823e-01 -2.436544374722750e-01 -7.682855698236460e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.212000000000000e+03 -3.863106898756409e-01 -8.862714902369156e-01 -2.436986846368925e-01 -7.679744518726840e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.213000000000000e+03 -3.862969164303757e-01 -8.862680220075098e-01 -2.437429271521799e-01 -7.676634019260510e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.214000000000000e+03 -3.862831429881144e-01 -8.862645509371080e-01 -2.437871650256410e-01 -7.673524199630320e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.215000000000000e+03 -3.862693695771706e-01 -8.862610770165925e-01 -2.438313982493295e-01 -7.670415060231101e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.216000000000000e+03 -3.862555961764507e-01 -8.862576002545532e-01 -2.438756268311535e-01 -7.667306600839430e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.217000000000000e+03 -3.862418227820451e-01 -8.862541206534212e-01 -2.439198507735018e-01 -7.664198821447060e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.218000000000000e+03 -3.862280494301035e-01 -8.862506382013079e-01 -2.439640700657223e-01 -7.661091722567540e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.219000000000000e+03 -3.862142760842587e-01 -8.862471529122338e-01 -2.440082847208404e-01 -7.657985303763050e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.220000000000000e+03 -3.862005027461322e-01 -8.862436647866605e-01 -2.440524947393945e-01 -7.654879565102200e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.221000000000000e+03 -3.861867294540692e-01 -8.862401738119148e-01 -2.440967001100266e-01 -7.651774507127310e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.222000000000000e+03 -3.861729561638979e-01 -8.862366800048065e-01 -2.441409008482832e-01 -7.648670129299370e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.223000000000000e+03 -3.861591829083851e-01 -8.862331833546566e-01 -2.441850969446163e-01 -7.645566432088800e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.224000000000000e+03 -3.861454096614914e-01 -8.862296838718099e-01 -2.442292884085797e-01 -7.642463415201750e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.225000000000000e+03 -3.861316364516568e-01 -8.862261815471361e-01 -2.442734752320307e-01 -7.639361079053129e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.226000000000000e+03 -3.861178632680000e-01 -8.862226763855350e-01 -2.443176574197283e-01 -7.636259423533030e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.227000000000000e+03 -3.861040900943251e-01 -8.862191683938395e-01 -2.443618349779778e-01 -7.633158448480031e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.228000000000000e+03 -3.860903169656533e-01 -8.862156575605665e-01 -2.444060078965124e-01 -7.630058154394360e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.229000000000000e+03 -3.860765438587078e-01 -8.862121438950475e-01 -2.444501761840985e-01 -7.626958541005791e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.230000000000000e+03 -3.860627707728700e-01 -8.862086273985433e-01 -2.444943398419992e-01 -7.623859608354031e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.231000000000000e+03 -3.860489977161949e-01 -8.862051080692025e-01 -2.445384988687309e-01 -7.620761356585130e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.232000000000000e+03 -3.860352247020683e-01 -8.862015859032789e-01 -2.445826532610303e-01 -7.617663785920240e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.233000000000000e+03 -3.860214517041496e-01 -8.861980609111966e-01 -2.446268030286468e-01 -7.614566896048740e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.234000000000000e+03 -3.860076787491487e-01 -8.861945330844448e-01 -2.446709481640114e-01 -7.611470687364240e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.235000000000000e+03 -3.859939058105731e-01 -8.861910024335339e-01 -2.447150886767480e-01 -7.608375159571300e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.236000000000000e+03 -3.859801329229628e-01 -8.861874689471216e-01 -2.447592245569327e-01 -7.605280313147759e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.237000000000000e+03 -3.859663600590411e-01 -8.861839326359973e-01 -2.448033558144398e-01 -7.602186147787859e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.238000000000000e+03 -3.859525872306426e-01 -8.861803934969572e-01 -2.448474824465666e-01 -7.599092663686920e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.239000000000000e+03 -3.859388144387756e-01 -8.861768515306779e-01 -2.448916044540506e-01 -7.595999860905719e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.240000000000000e+03 -3.859250416723868e-01 -8.861733067421157e-01 -2.449357218416932e-01 -7.592907739331051e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.241000000000000e+03 -3.859112689676373e-01 -8.861697591193826e-01 -2.449798345988876e-01 -7.589816299479930e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.242000000000000e+03 -3.858974962763878e-01 -8.861662086807099e-01 -2.450239427422868e-01 -7.586725540769371e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.243000000000000e+03 -3.858837236318336e-01 -8.861626554152704e-01 -2.450680462622425e-01 -7.583635463677880e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.244000000000000e+03 -3.858699510363452e-01 -8.861590993232199e-01 -2.451121451592249e-01 -7.580546068266630e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.245000000000000e+03 -3.858561784551367e-01 -8.861555404180265e-01 -2.451562394455125e-01 -7.577457354131199e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.246000000000000e+03 -3.858424059464323e-01 -8.861519786799185e-01 -2.452003291033956e-01 -7.574369322075890e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.247000000000000e+03 -3.858286334666869e-01 -8.861484141254601e-01 -2.452444141481453e-01 -7.571281971564980e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.248000000000000e+03 -3.858148610137188e-01 -8.861448467564650e-01 -2.452884945815236e-01 -7.568195302617410e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.249000000000000e+03 -3.858010886354066e-01 -8.861412765568499e-01 -2.453325703892238e-01 -7.565109315897910e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.250000000000000e+03 -3.857873162701278e-01 -8.861377035496673e-01 -2.453766415921581e-01 -7.562024010652189e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.251000000000000e+03 -3.857735439629559e-01 -8.861341277198145e-01 -2.454207081770403e-01 -7.558939387496991e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.252000000000000e+03 -3.857597717071487e-01 -8.861305490707342e-01 -2.454647701471042e-01 -7.555855446392150e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.253000000000000e+03 -3.857459994842883e-01 -8.861269676100402e-01 -2.455088275093398e-01 -7.552772187145200e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.254000000000000e+03 -3.857322273306618e-01 -8.861233833257703e-01 -2.455528802532990e-01 -7.549689610259190e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.255000000000000e+03 -3.857184551939853e-01 -8.861197962376354e-01 -2.455969283968683e-01 -7.546607715100050e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.256000000000000e+03 -3.857046831267531e-01 -8.861162063279047e-01 -2.456409719242730e-01 -7.543526502393810e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.257000000000000e+03 -3.856909111120990e-01 -8.861126136036366e-01 -2.456850108420021e-01 -7.540445971968091e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.258000000000000e+03 -3.856771391338684e-01 -8.861090180716007e-01 -2.457290451564809e-01 -7.537366123642210e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.259000000000000e+03 -3.856633672222960e-01 -8.861054197220297e-01 -2.457730748590477e-01 -7.534286957858090e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.260000000000000e+03 -3.856495953453065e-01 -8.861018185674123e-01 -2.458170999610745e-01 -7.531208474244480e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.261000000000000e+03 -3.856358235335227e-01 -8.860982145978100e-01 -2.458611204539478e-01 -7.528130673231261e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.262000000000000e+03 -3.856220517730100e-01 -8.860946078192310e-01 -2.459051363432070e-01 -7.525053554683850e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.263000000000000e+03 -3.856082800516110e-01 -8.860909982370370e-01 -2.459491476338730e-01 -7.521977118484870e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.264000000000000e+03 -3.855945084188642e-01 -8.860873858345680e-01 -2.459931543110926e-01 -7.518901365329360e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.265000000000000e+03 -3.855807368155756e-01 -8.860837706339604e-01 -2.460371563951090e-01 -7.515826294473330e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.266000000000000e+03 -3.855669652814110e-01 -8.860801526220800e-01 -2.460811538742422e-01 -7.512751906482910e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.267000000000000e+03 -3.855531937792088e-01 -8.860765318132153e-01 -2.461251467615383e-01 -7.509678200913250e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.268000000000000e+03 -3.855394223688156e-01 -8.860729081870268e-01 -2.461691350388464e-01 -7.506605178594999e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.269000000000000e+03 -3.855256510096622e-01 -8.860692817589975e-01 -2.462131187204177e-01 -7.503532839027249e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.270000000000000e+03 -3.855118796960481e-01 -8.860656525321912e-01 -2.462570978091383e-01 -7.500461182182420e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.271000000000000e+03 -3.854981084526659e-01 -8.860620204988209e-01 -2.463010722981447e-01 -7.497390208431190e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.272000000000000e+03 -3.854843372676327e-01 -8.860583856641249e-01 -2.463450421924778e-01 -7.494319917647850e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.273000000000000e+03 -3.854705661511952e-01 -8.860547480254737e-01 -2.463890074899101e-01 -7.491250310014000e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.274000000000000e+03 -3.854567950905946e-01 -8.860511075884394e-01 -2.464329681956473e-01 -7.488181385403760e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.275000000000000e+03 -3.854430240983146e-01 -8.860474643495929e-01 -2.464769243067447e-01 -7.485113144028080e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.276000000000000e+03 -3.854292531610252e-01 -8.860438183146879e-01 -2.465208758287029e-01 -7.482045585741930e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.277000000000000e+03 -3.854154823015568e-01 -8.860401694766020e-01 -2.465648227552643e-01 -7.478978710892149e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.278000000000000e+03 -3.854017114985971e-01 -8.860365178439700e-01 -2.466087650943143e-01 -7.475912519246081e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.279000000000000e+03 -3.853879407697956e-01 -8.860328634114857e-01 -2.466527028414273e-01 -7.472847011065460e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.280000000000000e+03 -3.853741701146308e-01 -8.860292061803622e-01 -2.466966359978285e-01 -7.469782186390660e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.281000000000000e+03 -3.853603995103744e-01 -8.860255461597263e-01 -2.467405645719083e-01 -7.466718044964160e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.282000000000000e+03 -3.853466289864398e-01 -8.860218833401069e-01 -2.467844885553069e-01 -7.463654587219840e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.283000000000000e+03 -3.853328585341779e-01 -8.860182177255835e-01 -2.468284079520209e-01 -7.460591813073830e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.284000000000000e+03 -3.853190881366500e-01 -8.860145493232261e-01 -2.468723227685263e-01 -7.457529722350251e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.285000000000000e+03 -3.853053178373680e-01 -8.860108781185332e-01 -2.469162329919597e-01 -7.454468315668880e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.286000000000000e+03 -3.852915475887287e-01 -8.860072041294830e-01 -2.469601386387746e-01 -7.451407592432931e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.287000000000000e+03 -3.852777774196045e-01 -8.860035273467975e-01 -2.470040397007927e-01 -7.448347553069490e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.288000000000000e+03 -3.852640073196510e-01 -8.859998477751818e-01 -2.470479361824345e-01 -7.445288197483610e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.289000000000000e+03 -3.852502373198832e-01 -8.859961654045938e-01 -2.470918280748435e-01 -7.442229526131119e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.290000000000000e+03 -3.852364673577955e-01 -8.859924802583251e-01 -2.471357153992212e-01 -7.439171538217849e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.291000000000000e+03 -3.852226975013419e-01 -8.859887923131553e-01 -2.471795981349091e-01 -7.436114234686650e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.292000000000000e+03 -3.852089276958823e-01 -8.859851015895903e-01 -2.472234763004753e-01 -7.433057614858200e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.293000000000000e+03 -3.851951579826117e-01 -8.859814080737390e-01 -2.472673498838913e-01 -7.430001679557589e-02 1.230000000000000e-10 -4.630000000000000e-11 -1.730000000000000e-11 -3.840000000000000e-11 2.280000000000000e-11 -1.080000000000000e-11 4.070000000000000e-12 6.469999999999999e-11 2.230000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t</ATTLISTList>\n\t</ATT>\n\t<TIL>\n\t\t<BANDID>P</BANDID>\n\t\t<NUMTILES>1</NUMTILES>\n\t\t<TILESIZEX>35180</TILESIZEX>\n\t\t<TILESIZEY>19872</TILESIZEY>\n\t\t<TILEUNITS>Pixels</TILEUNITS>\n\t\t<TILEOVERLAP>0</TILEOVERLAP>\n\t\t<TILE>\n\t\t\t<FILENAME>13MAY08000439-P1BS-500063426010_01_P001.NTF</FILENAME>\n\t\t\t<ULCOLOFFSET>0</ULCOLOFFSET>\n\t\t\t<ULROWOFFSET>0</ULROWOFFSET>\n\t\t\t<URCOLOFFSET>35839</URCOLOFFSET>\n\t\t\t<URROWOFFSET>0</URROWOFFSET>\n\t\t\t<LRCOLOFFSET>35839</LRCOLOFFSET>\n\t\t\t<LRROWOFFSET>20479</LRROWOFFSET>\n\t\t\t<LLCOLOFFSET>0</LLCOLOFFSET>\n\t\t\t<LLROWOFFSET>20479</LLROWOFFSET>\n\t\t\t<ULLON>-3.808772277000000e+01</ULLON>\n\t\t\t<ULLAT>7.253032611000000e+01</ULLAT>\n\t\t\t<URLON>-3.875234323000000e+01</URLON>\n\t\t\t<URLAT>7.256520433999999e+01</URLAT>\n\t\t\t<LRLON>-3.875435021000000e+01</LRLON>\n\t\t\t<LRLAT>7.266925209999999e+01</LRLAT>\n\t\t\t<LLLON>-3.808531310000000e+01</LLLON>\n\t\t\t<LLLAT>7.263491770000000e+01</LLLAT>\n\t\t</TILE>\n\t</TIL>\n\t<GEO>\n\t\t<EFFECTIVETIME>2009-10-08T00:00:00.000000Z</EFFECTIVETIME>\n\t\t<MODELGENERATIONTIME>2010-10-26T00:00:00.000000Z</MODELGENERATIONTIME>\n\t\t<SATID>WV02</SATID>\n\t\t<GEOMODELLEVEL>LV1B</GEOMODELLEVEL>\n\t\t<PRINCIPAL_DISTANCE>\n\t\t\t<GENERATIONTIME>2010-01-28T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<PD>1.324613900000000e+04</PD>\n\t\t</PRINCIPAL_DISTANCE>\n\t\t<OPTICAL_DISTORTION>\n\t\t\t<GENERATIONTIME>2009-09-10T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<POLYORDER>-1</POLYORDER>\n\t\t\t<ALISTList/>\n\t\t\t<BLISTList/>\n\t\t</OPTICAL_DISTORTION>\n\t\t<PERSPECTIVE_CENTER>\n\t\t\t<GENERATIONTIME>2009-09-10T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<CX>0.000000000000000e+00</CX>\n\t\t\t<CY>0.000000000000000e+00</CY>\n\t\t\t<CZ>0.000000000000000e+00</CZ>\n\t\t</PERSPECTIVE_CENTER>\n\t\t<CAMERA_ATTITUDE>\n\t\t\t<GENERATIONTIME>2009-09-10T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<QCS1>0.000000000000000e+00</QCS1>\n\t\t\t<QCS2>0.000000000000000e+00</QCS2>\n\t\t\t<QCS3>0.000000000000000e+00</QCS3>\n\t\t\t<QCS4>1.000000000000000e+00</QCS4>\n\t\t</CAMERA_ATTITUDE>\n\t\t<DETECTOR_MOUNTING>\n\t\t\t<GENERATIONTIME>2010-10-26T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<BAND_P>\n\t\t\t\t<BANDID>P</BANDID>\n\t\t\t\t<DETECTOR_ARRAY>\n\t\t\t\t\t<DETARRID>1</DETARRID>\n\t\t\t\t\t<DETORIGINX>-2.590000000000001e-01</DETORIGINX>\n\t\t\t\t\t<DETORIGINY>1.407276907149051e+02</DETORIGINY>\n\t\t\t\t\t<DETROTANGLE>0.000000000000000e+00</DETROTANGLE>\n\t\t\t\t\t<DETPITCH>8.000000000000000e-03</DETPITCH>\n\t\t\t\t</DETECTOR_ARRAY>\n\t\t\t</BAND_P>\n\t\t</DETECTOR_MOUNTING>\n\t</GEO>\n\t<STE>\n\t\t<NUMPAIR>1</NUMPAIR>\n\t\t<STEREO_PAIR>\n\t\t\t<FIRSTID>13MAY08000330-P1BS-500063426010_01_P001.NTF</FIRSTID>\n\t\t\t<SECONDID>13MAY08000439-P1BS-500063426010_01_P001.NTF</SECONDID>\n\t\t\t<OVERLAP>7.120000000000000e-01</OVERLAP>\n\t\t\t<ULLAT>7.265003600000000e+01</ULLAT>\n\t\t\t<ULLON>-3.869039600000000e+01</ULLON>\n\t\t\t<LRLAT>7.255045800000001e+01</LRLAT>\n\t\t\t<LRLON>-3.814754700000000e+01</LRLON>\n\t\t\t<B_CONV>3.433000000000000e+01</B_CONV>\n\t\t\t<E_CONV>3.426000000000000e+01</E_CONV>\n\t\t\t<B_ASYM>1.228000000000000e+01</B_ASYM>\n\t\t\t<E_ASYM>1.203000000000000e+01</E_ASYM>\n\t\t\t<B_BIE>6.745000000000000e+01</B_BIE>\n\t\t\t<E_BIE>6.731000000000000e+01</E_BIE>\n\t\t</STEREO_PAIR>\n\t</STE>\n\t<RPB>\n\t\t<SATID>WV02</SATID>\n\t\t<BANDID>P</BANDID>\n\t\t<SPECID>RPC00B</SPECID>\n\t\t<IMAGE>\n\t\t\t<ERRBIAS>2.419000000000000e+01</ERRBIAS>\n\t\t\t<ERRRAND>1.500000000000000e-01</ERRRAND>\n\t\t\t<LINEOFFSET>9935</LINEOFFSET>\n\t\t\t<SAMPOFFSET>17589</SAMPOFFSET>\n\t\t\t<LATOFFSET>7.259970000000000e+01</LATOFFSET>\n\t\t\t<LONGOFFSET>-3.841950000000000e+01</LONGOFFSET>\n\t\t\t<HEIGHTOFFSET>3221</HEIGHTOFFSET>\n\t\t\t<LINESCALE>9936</LINESCALE>\n\t\t\t<SAMPSCALE>17590</SAMPSCALE>\n\t\t\t<LATSCALE>7.130000000000000e-02</LATSCALE>\n\t\t\t<LONGSCALE>3.431000000000000e-01</LONGSCALE>\n\t\t\t<HEIGHTSCALE>501</HEIGHTSCALE>\n\t\t\t<LINENUMCOEFList>\n\t\t\t\t<LINENUMCOEF>-1.107826000000000e-02 3.420182000000000e-01 1.366879000000000e+00 -2.673451000000000e-02 -6.132816000000000e-05 3.339176000000000e-05 -7.303779000000000e-05 6.004070000000000e-03 8.119375000000000e-03 -1.943749000000000e-07 -5.473371000000000e-06 1.445925000000000e-05 1.170466000000000e-04 1.874589000000000e-05 1.026924000000000e-04 2.935656000000000e-04 7.471646000000000e-05 -2.096176000000000e-06 -8.255169000000000e-06 -1.457227000000000e-06</LINENUMCOEF>\n\t\t\t</LINENUMCOEFList>\n\t\t\t<LINEDENCOEFList>\n\t\t\t\t<LINEDENCOEF>1.000000000000000e+00 1.820225000000000e-03 4.032678000000000e-03 -2.076640000000000e-04 -2.151065000000000e-04 2.819511000000000e-06 1.756303000000000e-05 2.170781000000000e-05 -3.076939000000000e-04 5.438657000000000e-05 -7.973293000000000e-06 3.103029000000000e-06 2.029332000000000e-04 2.825207000000000e-07 4.405522000000000e-05 2.711539000000000e-04 1.942066000000000e-07 -9.152733000000000e-07 -1.613173000000000e-05 -1.764464000000000e-08</LINEDENCOEF>\n\t\t\t</LINEDENCOEFList>\n\t\t\t<SAMPNUMCOEFList>\n\t\t\t\t<SAMPNUMCOEF>-6.796355000000000e-03 -1.028228000000000e+00 8.356806000000000e-04 -2.489602000000000e-02 2.242856000000000e-03 -1.510772000000000e-04 -1.526411000000000e-04 7.032998000000000e-03 -8.498941000000000e-05 -2.678723000000000e-06 -2.723608000000000e-06 -2.139012000000000e-05 8.668095000000000e-05 1.173796000000000e-05 2.892548000000000e-06 1.879455000000000e-04 1.817154000000000e-07 1.571815000000000e-06 -1.300044000000000e-05 2.849163000000000e-07</SAMPNUMCOEF>\n\t\t\t</SAMPNUMCOEFList>\n\t\t\t<SAMPDENCOEFList>\n\t\t\t\t<SAMPDENCOEF>1.000000000000000e+00 2.372991000000000e-04 2.307716000000000e-03 -3.246404000000000e-04 1.267303000000000e-05 2.264450000000000e-06 -1.427508000000000e-06 3.833940000000000e-06 8.095254000000000e-05 -1.146802000000000e-05 -1.555893000000000e-07 2.544143000000000e-07 2.599317000000000e-06 -7.712746000000000e-08 1.394671000000000e-06 -2.119406000000000e-08 -4.704185000000000e-08 -4.984005000000000e-08 -7.978696000000000e-08 0.000000000000000e+00</SAMPDENCOEF>\n\t\t\t</SAMPDENCOEFList>\n\t\t</IMAGE>\n\t</RPB>\n</isd>\n"
  },
  {
    "path": "src/asp/Core/AffineEpipolar.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Core/AffineEpipolar.h>\n#include <asp/Core/OpenCVUtils.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/InterestPointMatching.h>  // Slow-to-compile header\n#include <asp/Core/IpMatchingAlgs.h>         // Lightweight header\n#include <vw/Math/Vector.h>\n#include <vw/Math/Matrix.h>\n#include <vw/Math/RANSAC.h>\n#include <vw/Math/LinearAlgebra.h>\n#include <vw/InterestPoint/InterestPoint.h>\n#include <vw/Core/Stopwatch.h>\n#include <vw/Math/Transform.h>\n\n#include <opencv2/calib3d.hpp>\n\n#include <vector>\n\nusing namespace vw;\nusing namespace vw::math;\n\nnamespace asp {\n\n  // Solves for Affine Fundamental Matrix as per instructions in\n  // Multiple View Geometry. Outlier elimination happens later. \n  Matrix<double>\n  linear_affine_fundamental_matrix(std::vector<ip::InterestPoint> const& ip1,\n                                   std::vector<ip::InterestPoint> const& ip2) {\n\n    // (i) Compute the centroid of X and delta X\n    Matrix<double> delta_x(ip1.size(), 4);\n    Vector4 mean_x;\n    for (size_t i = 0; i < ip1.size(); i++) {\n      delta_x(i, 0) = ip2[i].x;\n      delta_x(i, 1) = ip2[i].y;\n      delta_x(i, 2) = ip1[i].x;\n      delta_x(i, 3) = ip1[i].y;\n      mean_x += select_row(delta_x, i) / double(ip1.size());\n    }\n    \n    for (size_t i = 0; i < ip1.size(); i++) \n      select_row(delta_x,i) -= mean_x;\n\n    Matrix<double> U, VT;\n    Vector<double> S;\n    svd(transpose(delta_x), U, S, VT);\n    Vector<double> N = select_col(U, 3);\n    double e = -transpose(N) * mean_x;\n    Matrix<double> f(3,3);\n    f(0,2) = N(0);\n    f(1,2) = N(1);\n    f(2,2) = e;\n    f(2,0) = N(2);\n    f(2,1) = N(3);\n\n    return f;\n  }\n\n  void solve_y_scaling(std::vector<ip::InterestPoint> const & ip1,\n                       std::vector<ip::InterestPoint> const & ip2,\n                       Matrix<double>                       & affine_left,\n                       Matrix<double>                       & affine_right) {\n    \n    Matrix<double> a(ip1.size(), 2);\n    Vector<double> b(ip1.size());\n    \n    for (size_t i = 0; i < ip1.size(); i++) {\n      select_row(a, i) = subvector(affine_right*Vector3(ip2[i].x, ip2[i].y, 1), 1, 2);\n      b[i]             = (affine_left*Vector3(ip1[i].x, ip1[i].y, 1))(1);\n    }\n\n    Vector<double> scaling = least_squares(a, b);\n    submatrix(affine_right,0,0,2,2) *= scaling[0];\n    affine_right(1,2) = scaling[1];\n  }\n  \n  void solve_x_shear(std::vector<ip::InterestPoint> const & ip1,\n                     std::vector<ip::InterestPoint> const & ip2,\n                     Matrix<double>                       & affine_left,\n                     Matrix<double>                       & affine_right) {\n    \n    Matrix<double> a(ip1.size(), 3);\n    Vector<double> b(ip1.size());\n    \n    for (size_t i = 0; i < ip1.size(); i++) {\n      select_row(a, i) = affine_right * Vector3(ip2[i].x, ip2[i].y, 1);\n      b[i] = (affine_left * Vector3(ip1[i].x, ip1[i].y, 1))(0);\n    }\n\n    Vector<double> shear = least_squares(a, b);\n    Matrix<double> interm = math::identity_matrix<3>();\n    interm(0, 1) = -shear[1] / 2.0;\n    affine_left = interm * affine_left;\n    interm = math::identity_matrix<3>();\n    interm(0, 0) = shear[0];\n    interm(0, 1) = shear[1] / 2.0;\n    interm(0, 2) = shear[2];\n    affine_right = interm * affine_right;\n  }\n\n  // A functor which returns the best fit left and right 3x3 matrices\n  // for epipolar alignment. Store them as a single 3x7 matrix.  The\n  // last column will have the upper-right corner of the intersections\n  // of the domains of the left and right images with the resulting\n  // transformed applied to them.\n\n  struct BestFitEpipolarAlignment {\n\n    Vector2i m_ldims, m_rdims;\n    bool m_crop_to_shared_area;\n    \n    BestFitEpipolarAlignment(Vector2i const& left_image_dims,\n                             Vector2i const& right_image_dims,\n                             bool crop_to_shared_area):\n      m_ldims(left_image_dims), m_rdims(right_image_dims),\n      m_crop_to_shared_area(crop_to_shared_area) {}\n\n    typedef vw::Matrix<double, 3, 7> result_type;\n\n    /// The fundamental matrix needs 8 points.\n    // TODO(oalexan1): Should a bigger minimum be used for robustness?\n    template <class InterestPointT>\n    size_t min_elements_needed_for_fit(InterestPointT const& /*example*/) const {\n      return 8;\n    }\n  \n    /// This function can match points in any container that supports\n    /// the size() and operator[] methods. The container is usually a\n    /// vw::Vector<>, but you could substitute other classes here as\n    /// well.\n    template <class InterestPointT>\n    vw::Matrix<double> operator()(std::vector<InterestPointT> const& ip1,\n                                  std::vector<InterestPointT> const& ip2,\n                                  vw::Matrix<double> const& /*seed_input*/\n                                  = vw::Matrix<double>() ) const {\n    \n      // check consistency\n      VW_ASSERT( ip1.size() == ip2.size(),\n                 vw::ArgumentErr() << \"Cannot compute fundamental matrix. \"\n                 << \"ip1 and ip2 are not the same size.\" );\n      VW_ASSERT( !ip1.empty() && ip1.size() >= min_elements_needed_for_fit(ip1[0]),\n                 vw::ArgumentErr() << \"Cannot compute fundamental matrix. \"\n                 << \"Need at at least 8 points, but got: \" << ip1.size() << \".\\n\");\n\n      // Compute the affine fundamental matrix\n      Matrix<double> fund = linear_affine_fundamental_matrix(ip1, ip2);\n\n      // Solve for rotation matrices\n      double Hl = sqrt(fund(2, 0)*fund(2, 0) + fund(2, 1)*fund(2, 1));\n      double Hr = sqrt(fund(0, 2)*fund(0, 2) + fund(1, 2)*fund(1, 2));\n\n      Vector2 epipole(-fund(2, 1), fund(2, 0)), epipole_prime(-fund(1, 2), fund(0, 2));\n\n      if (epipole.x() < 0)\n        epipole = -epipole;\n      if (epipole_prime.x() < 0)\n        epipole_prime = -epipole_prime;\n      epipole.y() = -epipole.y();\n      epipole_prime.y() = -epipole_prime.y();\n\n      Matrix<double> left_matrix  = math::identity_matrix<3>();\n      Matrix<double> right_matrix = math::identity_matrix<3>();\n    \n      left_matrix(0, 0)  = epipole[0]/Hl;\n      left_matrix(0, 1)  = -epipole[1]/Hl;\n      left_matrix(1, 0)  = epipole[1]/Hl;\n      left_matrix(1, 1)  = epipole[0]/Hl;\n      right_matrix(0, 0) = epipole_prime[0]/Hr;\n      right_matrix(0, 1) = -epipole_prime[1]/Hr;\n      right_matrix(1, 0) = epipole_prime[1]/Hr;\n      right_matrix(1, 1) = epipole_prime[0]/Hr;\n\n      // Solve for ideal scaling and translation\n      solve_y_scaling(ip1, ip2, left_matrix, right_matrix);\n\n      // Solve for ideal shear, scale, and translation of X axis\n      solve_x_shear(ip1, ip2, left_matrix, right_matrix);\n\n      // Work out the ideal render size\n      BBox2i left_bbox, right_bbox;\n      left_bbox.grow(subvector(left_matrix * Vector3(0,            0,           1), 0, 2));\n      left_bbox.grow(subvector(left_matrix * Vector3(m_ldims.x(),  0,           1), 0, 2));\n      left_bbox.grow(subvector(left_matrix * Vector3(m_ldims.x(),  m_ldims.y(), 1), 0, 2));\n      left_bbox.grow(subvector(left_matrix * Vector3(0,            m_ldims.y(), 1), 0, 2));\n      right_bbox.grow(subvector(right_matrix * Vector3(0,            0,           1), 0, 2));\n      right_bbox.grow(subvector(right_matrix * Vector3(m_rdims.x(),  0,           1), 0, 2));\n      right_bbox.grow(subvector(right_matrix * Vector3(m_rdims.x(),  m_rdims.y(), 1), 0, 2));\n      right_bbox.grow(subvector(right_matrix * Vector3(0,            m_rdims.y(), 1), 0, 2));\n\n      // TODO(oalexan1): There is room for improvement below,\n      // but the attempts tried below (commented out) need\n      // a lot more testing. Also, the current outlier filtering\n      // is apparently not foolproof yet.\n      \n      // Ensure that the transforms map the interest points to points\n      // with positive x and y, we will need that when later the\n      // transformed images are computed.\n      if (m_crop_to_shared_area) \n        left_bbox.crop(right_bbox);\n      \n      // Note how we subtract left_bbox.min() from both left_matrix\n      // and right_matrix.  By subtracting the same thing we\n      // maintain the property that a row in the left image is\n      // matched to the same row in the right image after the\n      // left_matrix and right_matrix transforms are applied.\n      left_matrix (0, 2) -= left_bbox.min().x();\n      left_matrix (1, 2) -= left_bbox.min().y();\n      right_matrix(0, 2) -= left_bbox.min().x();\n      right_matrix(1, 2) -= left_bbox.min().y();\n      \n      // Concatenate these into the answer\n      result_type T;\n      submatrix(T, 0, 0, 3, 3) = left_matrix;\n      submatrix(T, 0, 3, 3, 3) = right_matrix;\n      \n      // Implicit in the logic below is the fact that left_bbox should now also\n      // have left_bbox.min() subtracted from it, after which it becomes the\n      // box with lower-left corner being (0, 0) and upper-right corner\n      // being (left_bbox.width(), left_bbox.height()) which is\n      // what we save here as the upper bound after the transform.\n      T(0, 6) = left_bbox.width();\n      T(1, 6) = left_bbox.height();\n\n      return T;\n    }\n  };\n\n  // Find the absolute difference of the y components of the given\n  // interest point pair after applying to those points the given\n  // epipolar alignment matrices. If these matrices are correct,\n  // and the interest point pair is not an outlier, this\n  // absolute difference should be close to 0.\n  struct EpipolarAlignmentError {\n    template <class TransformT, class InterestPointT>\n    double operator() (TransformT const& T,\n                       InterestPointT const& ip1,\n                       InterestPointT const& ip2) const {\n\n      Matrix<double> left_matrix  = submatrix(T, 0, 0, 3, 3);\n      Matrix<double> right_matrix = submatrix(T, 0, 3, 3, 3);\n\n      Vector3 L = left_matrix  * Vector3(ip1.x, ip1.y, 1);\n      Vector3 R = right_matrix * Vector3(ip2.x, ip2.y, 1);\n      double diff = L[1] - R[1];\n      return std::abs(diff);\n    }\n  };\n\n  // Helper function to instantiate a RANSAC class object and immediately call it\n  template <class ContainerT1, class ContainerT2, class FittingFuncT, class ErrorFuncT>\n  typename FittingFuncT::result_type ransac(std::vector<ContainerT1> const& p1,\n                                            std::vector<ContainerT2> const& p2,\n                                            FittingFuncT             const& fitting_func,\n                                            ErrorFuncT               const& error_func,\n                                            int     num_iterations,\n                                            double  inlier_threshold,\n                                            int     min_num_output_inliers,\n                                            bool    reduce_min_num_output_inliers_if_no_fit = false\n                                            ) {\n    RandomSampleConsensus<FittingFuncT, ErrorFuncT>\n      ransac_instance(fitting_func,\n                      error_func,\n                      num_iterations,\n                      inlier_threshold,\n                      min_num_output_inliers,\n                      reduce_min_num_output_inliers_if_no_fit\n                      );\n    return ransac_instance(p1,p2);\n  }\n    \n  // Main function that other parts of ASP should use\n  Vector2i affine_epipolar_rectification(Vector2i const& left_image_dims,\n                                         Vector2i const& right_image_dims,\n                                         double inlier_threshold,\n                                         int num_ransac_iterations,\n                                         std::vector<ip::InterestPoint> const& ip1,\n                                         std::vector<ip::InterestPoint> const& ip2,\n                                         bool crop_to_shared_area,\n                                         Matrix<double>& left_matrix,\n                                         Matrix<double>& right_matrix,\n                                         // optionally return the inliers\n                                         std::vector<size_t> * inliers_ptr) {\n  \n    int  min_num_output_inliers = ip1.size() / 2;\n    bool reduce_min_num_output_inliers_if_no_fit = true;\n\n    vw::Matrix<double> T;\n    Stopwatch sw;\n    sw.start();\n\n    vw_out() << \"Computing the epipolar rectification \"\n             << \"using RANSAC with \" << num_ransac_iterations\n             << \" iterations and inlier threshold \" << inlier_threshold << \".\\n\";\n\n    // If RANSAC fails, it will throw an exception\n    BestFitEpipolarAlignment func(left_image_dims, right_image_dims, crop_to_shared_area);\n    EpipolarAlignmentError error_metric;\n    std::vector<size_t> inlier_indices;\n    RandomSampleConsensus<BestFitEpipolarAlignment, EpipolarAlignmentError> \n      ransac(func, error_metric,\n             num_ransac_iterations, inlier_threshold,\n             min_num_output_inliers, reduce_min_num_output_inliers_if_no_fit);\n    try {\n      T = ransac(ip1, ip2);\n    } catch (std::exception const& e) {\n      vw_throw(ArgumentErr() << \"Failed compute the epipolar rectification.\\n\"\n               << \"Check if your left and right images are similar enough. \"\n               << \"Consider deleting the output directory and restarting with \"\n               << \"a larger --ip-per-tile value.\\n\"\n               << \"RANSAC error: \" << e.what() << \"\\n\");\n    }\n    inlier_indices = ransac.inlier_indices(T, ip1, ip2);\n\n    vw_out() << \"Found \" << inlier_indices.size() << \" / \" << ip1.size() << \" inliers.\\n\";\n\n    sw.stop();\n    vw_out() << \"Elapsed time in computing rectification matrices: \"\n             << sw.elapsed_seconds() << \" seconds.\\n\";\n\n    // Extract the matrices and the cropped transformed box from the computed transform\n    left_matrix  = submatrix(T, 0, 0, 3, 3);\n    right_matrix = submatrix(T, 0, 3, 3, 3);\n    Vector2i trans_crop_box(T(0, 6), T(1, 6));\n\n    // Find the maximum error for inliers\n    double max_err = 0.0;\n    for (size_t it = 0; it < inlier_indices.size(); it++) {\n      int i = inlier_indices[it];\n      max_err = std::max(max_err, error_metric(T, ip1[i], ip2[i]));\n    }\n        \n    vw_out() << \"Maximum absolute difference of y components of \"\n             << \"aligned inlier interest points is \"\n             << max_err << \" pixels.\" << std::endl;\n\n    // This needs more testing\n    if (false && !crop_to_shared_area) {\n      // The bounds of the transforms have been a bit too generous. Tighten them to the bounding\n      // box of the IP.\n      // TODO(oalexan1): Remove outliers here!\n      \n      // Apply local alignment to inlier ip and estimate the search range\n      vw::HomographyTransform left_local_trans (left_matrix);\n      vw::HomographyTransform right_local_trans(right_matrix);\n      \n      // Find the transformed IP\n      std::vector<vw::ip::InterestPoint> left_trans_local_ip;\n      std::vector<vw::ip::InterestPoint> right_trans_local_ip;\n\n      for (size_t it = 0; it < inlier_indices.size(); it++) {\n        int i = inlier_indices[it];\n        Vector2 left_pt (ip1[i].x, ip1[i].y);\n        Vector2 right_pt(ip2[i].x, ip2[i].y);\n        \n        left_pt  = left_local_trans.forward(left_pt);\n        right_pt = right_local_trans.forward(right_pt);\n        \n        // First copy all the data from the input ip, then apply the transform\n        left_trans_local_ip.push_back(ip1[i]);\n        right_trans_local_ip.push_back(ip2[i]);\n        left_trans_local_ip.back().x  = left_pt.x();\n        left_trans_local_ip.back().y  = left_pt.y();\n        right_trans_local_ip.back().x = right_pt.x();\n        right_trans_local_ip.back().y = right_pt.y();\n      }\n\n      // Filter outliers\n      Vector2 params = stereo_settings().outlier_removal_params;\n      bool quiet = false;\n      if (params[0] < 100.0)\n        asp::filter_ip_by_disparity(params[0], params[1], quiet,\n                                    left_trans_local_ip, right_trans_local_ip); \n      \n      vw::BBox2i left_bbox, right_bbox;\n      for (size_t i = 0; i < left_trans_local_ip.size(); i++) {\n\n        Vector2 left_pt (left_trans_local_ip[i].x, left_trans_local_ip[i].y);\n        Vector2 right_pt(right_trans_local_ip[i].x, right_trans_local_ip[i].y);\n        \n        left_bbox.grow(left_pt);\n        right_bbox.grow(right_pt);\n      }\n\n      // TODO(oalexan1): Run a large scale test to see if this is necessary.\n      left_bbox.expand(50);\n      right_bbox.expand(50);\n      \n      // The way the transforms were created, there is no good reason\n      // for transformed ip to have negative values.\n      left_bbox.min().x() = std::max(left_bbox.min().x(), 0);\n      left_bbox.min().y() = std::max(left_bbox.min().y(), 0);\n      right_bbox.min().x() = std::max(right_bbox.min().x(), 0);\n      right_bbox.min().y() = std::max(right_bbox.min().y(), 0);\n      \n      // Adjust the domains of the transforms to the bounding boxes of\n      // the interest points.\n      left_matrix (0, 2) -= left_bbox.min().x();\n      left_matrix (1, 2) -= left_bbox.min().y();\n      right_matrix(0, 2) -= right_bbox.min().x();\n      right_matrix(1, 2) -= right_bbox.min().y();\n\n      trans_crop_box[0] = std::max(left_bbox.width(), right_bbox.width());\n      trans_crop_box[1] = std::max(left_bbox.height(), right_bbox.height());\n    }\n    \n    // Optionally return the inliers\n    if (inliers_ptr != NULL)\n      *inliers_ptr = inlier_indices;\n    \n    return trans_crop_box;\n  }\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Core/AffineEpipolar.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n#ifndef __ASP_CORE_AFFINEEPIPOLAR_H__\n#define __ASP_CORE_AFFINEEPIPOLAR_H__\n\n#include <vw/Math/Vector.h>\n#include <vw/Math/Matrix.h>\n\nnamespace vw {\n  namespace ip {\n    struct InterestPoint;\n  }\n}\n\nnamespace asp {\n\n  // Takes matched interest points and returns ideal rectifcation\n  // transforms in left_matrix and right_matrix. This function returns\n  // the ideal image size. (It reduces the image sizes to only the\n  // intersect of the two images.)\n  vw::Vector2i affine_epipolar_rectification(vw::Vector2i const& left_size,\n                                             vw::Vector2i const& right_size,\n                                             double inlier_threshold,\n                                             int num_ransac_iterations,\n                                             std::vector<vw::ip::InterestPoint> const& left,\n                                             std::vector<vw::ip::InterestPoint> const& right,\n                                             bool crop_to_shared_area,\n                                             vw::Matrix<double>& left_matrix,\n                                             vw::Matrix<double>& right_matrix,\n                                             // optionally return the inliers\n                                             std::vector<size_t> * inliers_ptr = NULL);\n}\n\n#endif//__ASP_CORE_AFFINEEPIPOLAR_H__\n"
  },
  {
    "path": "src/asp/Core/AlignmentUtils.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file AlignmentUtils.cc\n\n#include <asp/Core/AlignmentUtils.h>\n#include <vw/FileIO/MatrixIO.h>\n#include <boost/filesystem.hpp>\n\nnamespace fs = boost::filesystem;\n\nnamespace asp {\n\nstd::string leftAlignFile(std::string const& out_prefix) {\n  return out_prefix + \"-align-L.txt\";\n}\n\nstd::string rightAlignFile(std::string const& out_prefix) {\n  return out_prefix + \"-align-R.txt\"; \n}\n\n// These are kept for backward compatibility and will be removed\n// in the future.\n\nstd::string leftAlignExrFile(std::string const& out_prefix) {\n  return out_prefix + \"-align-L.exr\";\n}\n\nstd::string rightAlignExrFile(std::string const& out_prefix) {\n  return out_prefix + \"-align-R.exr\"; \n}\n\n// Read the left or right alignment matrix from the file  \nvw::Matrix<double> alignmentMatrix(std::string const& out_prefix,\n                                   std::string const& alignment_method,\n                                   std::string const& side) {\n \n  std::string align_file, align_file_exr;\n  if (side == \"left\") {\n    align_file = leftAlignFile(out_prefix);\n    align_file_exr = leftAlignExrFile(out_prefix);\n  } else if (side == \"right\") {\n    align_file = rightAlignFile(out_prefix);\n    align_file_exr = rightAlignExrFile(out_prefix);\n  } else {\n    vw::vw_throw(vw::ArgumentErr() << \"Invalid side: \" << side << \"\\n\");\n  }\n  \n  // Initalize with the identity matrix      \n  vw::Matrix<double> align_matrix = vw::math::identity_matrix<3>();\n\n  if (alignment_method == \"homography\" ||\n      alignment_method == \"affineepipolar\" ||\n      alignment_method == \"local_epipolar\") {\n    if (fs::exists(align_file)) // read alignment matrix from text file\n      vw::read_matrix_as_txt(align_file, align_matrix);\n    else if (fs::exists(align_file_exr)) // read exr, for backward compatibility\n      vw::read_matrix(align_matrix, align_file_exr);\n    else\n      vw::vw_throw(vw::IOErr() << \"Could not read alignment matrix from: \"\n                 << align_file << \" or \" << align_file_exr << \"\\n\");\n    \n  }\n\n  return align_matrix;\n}\n\n} // namespace asp\n"
  },
  {
    "path": "src/asp/Core/AlignmentUtils.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file AlignmentUtils.h\n\n#ifndef __ALIGNMENT_UTILS_H__\n#define __ALIGNMENT_UTILS_H__\n\n#include <vw/Math/BBox.h>\n#include <vw/Math/Matrix.h>\n\nnamespace asp {\n  \n  std::string leftAlignFile(std::string const& out_prefix);\n  std::string rightAlignFile(std::string const& out_prefix);\n\n  // These are kept for backward compatibility and will be removed\n  // in the future.\n  std::string leftAlignExrFile(std::string const& out_prefix);\n  std::string rightAlignExrFile(std::string const& out_prefix);\n \n // Read the left or right alignment matrix from the file  \n vw::Matrix<double> alignmentMatrix(std::string const& out_prefix,\n                                    std::string const& alignment_method,\n                                    std::string const& side);\n\n} // end namespace asp\n\n#endif // __ALIGNMENT_UTILS_H__"
  },
  {
    "path": "src/asp/Core/AspLog.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Core/AspLog.h>\n#include <asp/asp_date_config.h>\n#include <asp/asp_config.h>\n\n#include <vw/Core/Log.h>\n#include <vw/Core/System.h>\n#include <vw/Core/Exception.h>\n#include <vw/FileIO/FileUtils.h>\n\n#include <boost/date_time/posix_time/posix_time.hpp>\n#include <boost/filesystem/operations.hpp>\n#include <boost/filesystem/path.hpp>\n#include <boost/shared_ptr.hpp>\n\n#include <sstream>\n#include <fstream>\n#include <unistd.h>\n\nnamespace fs = boost::filesystem;\n\nstd::string asp::current_posix_time_string() {\n  return boost::posix_time::to_simple_string(boost::posix_time::second_clock::local_time());\n}\n\nvoid asp::run_cmd_app_to_file(std::string cmd, std::string file){\n  std::string full_cmd;\n  full_cmd = \"echo '\" + cmd + \"' >> \" + file; // echo the command to run\n  int code = system(full_cmd.c_str());\n  full_cmd = cmd + \" >> \" + file + \" 2>&1\";\n  code = system(full_cmd.c_str());\n  full_cmd = \"echo '' >> \" + file; // append a newline\n  code = system(full_cmd.c_str());\n}\n\nstd::string asp::extract_prog_name(std::string const& prog_str){\n\n  // Get program name without path and leading 'lt-'.\n  std::string prog_name = fs::path(prog_str).stem().string();\n  std::string pref = \"lt-\";\n  size_t lp = pref.size();\n  if (prog_name.size() >= lp && prog_name.substr(0, lp) == pref)\n    prog_name = prog_name.substr(lp, prog_name.size() - lp);\n\n  return prog_name;\n}\n\nvoid asp::log_to_file(int argc, char *argv[],\n                      std::string stereo_default_filename,\n                      std::string out_prefix){\n\n  // Log some system info to a file, then copy the vw log\n  // info to that file as well.\n\n  if (out_prefix == \"\")\n    vw::vw_throw(vw::ArgumentErr() << \"Output prefix was not set.\\n\");\n\n  // Create the output directory if not present\n  vw::create_out_dir(out_prefix);\n\n  std::string prog_name = extract_prog_name(argv[0]);\n\n  // Create the log file and open it in write mode\n  std::ostringstream os;\n  int pid = getpid();\n  std::string timestamp =\n      boost::posix_time::to_iso_string(boost::posix_time::second_clock::local_time());\n  std::string clean_timestamp = timestamp.substr(4, 9); // Trim off the year\n  clean_timestamp.replace(4, 1, 1, '-'); // Replace T with -\n  clean_timestamp.insert (2, 1,    '-'); // Insert - between month and day\n  os << out_prefix << \"-log-\" << prog_name << \"-\"\n     << clean_timestamp << \"-\" << pid << \".txt\";\n  std::string log_file = os.str();\n  vw::vw_out() << \"Writing log: \" << log_file << std::endl;\n  std::ofstream lg(log_file.c_str());\n\n  // Write the version\n  lg << \"ASP \" << ASP_VERSION << \"\\n\";\n\n#if defined(ASP_COMMIT_ID)\n    lg << \"Build ID: \" << ASP_COMMIT_ID << \"\\n\";\n#endif\n#if defined(ASP_BUILD_DATE)\n    lg << \"Build date: \" << ASP_BUILD_DATE << \"\\n\";\n#endif\n\n    lg << \"\\n\"; // leave some separation\n\n    // Write the program name and its arguments\n    for (int s = 0; s < argc; s++) {\n      std::string token = std::string(argv[s]);\n      // Skip adding empty spaces\n      if (token == \" \")\n        continue;\n      // Use quotes if there are spaces\n      if (token.find(\" \") != std::string::npos || token.find(\"\\t\") != std::string::npos)\n        token = '\"' + token + '\"';\n      lg << token + \" \";\n    }\n\n  lg << std::endl << std::endl;\n\n  // Must ensure to close the file handle before further appending to\n  // it below.\n  lg.close();\n\n  // System calls. Not all will succeed on all machines.\n  asp::run_cmd_app_to_file(\"uname -a\", log_file);\n  if (fs::exists(\"/proc/meminfo\"))\n    asp::run_cmd_app_to_file(\"cat /proc/meminfo 2>/dev/null | grep MemTotal\", log_file);\n  if (fs::exists(\"/proc/cpuinfo\"))\n    asp::run_cmd_app_to_file(\"cat /proc/cpuinfo 2>/dev/null | tail -n 25\", log_file);\n\n  // The line below is for MacOSX\n  asp::run_cmd_app_to_file(\"sysctl -a hw 2>/dev/null | grep -E \\\"ncpu|byteorder|memsize|cpufamily|cachesize|mmx|sse|machine|model\\\" | grep -v ipv6\", log_file);\n  if (stereo_default_filename != \"\" && fs::exists(stereo_default_filename)) {\n    std::string cmd = \"cat \" + stereo_default_filename + \" 2>/dev/null\";\n    asp::run_cmd_app_to_file(cmd, log_file);\n  }\n\n  // Save the current .vwrc\n  char * home_ptr = getenv(\"HOME\");\n  if (home_ptr) {\n    std::string home = home_ptr;\n    std::string vwrc = home + \"/.vwrc\";\n    if (fs::exists(vwrc)) {\n      std::string cmd = \"cat \" + vwrc + \" 2>/dev/null\";\n      asp::run_cmd_app_to_file(cmd, log_file);\n    }\n  }\n\n  // Copy all the info going to the console to log_file as well,\n  // except the progress bar.\n  boost::shared_ptr<vw::LogInstance> current_log(new vw::LogInstance(log_file));\n  current_log->rule_set() = vw::vw_log().console_log().rule_set();\n  current_log->rule_set().add_rule(0, \"*.progress\");\n  vw::vw_log().add(current_log);\n}\n"
  },
  {
    "path": "src/asp/Core/AspLog.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file AspLog.h\n///\n/// Logging utilities for ASP tools (no boost::program_options dependency).\n\n#ifndef __ASP_CORE_ASP_LOG_H__\n#define __ASP_CORE_ASP_LOG_H__\n\n#include <string>\n\nnamespace asp {\n\n  /// Print time function\n  std::string current_posix_time_string();\n\n  /// Run a system command and append the output to a given file\n  void run_cmd_app_to_file(std::string cmd, std::string file);\n\n  /// Get program name without path and leading 'lt-'.\n  std::string extract_prog_name(std::string const& prog_str);\n\n  /// Write logs to a file\n  void log_to_file(int argc, char *argv[],\n                   std::string stereo_default_filename,\n                   std::string output_prefix);\n\n} // end namespace asp\n\n#endif // __ASP_CORE_ASP_LOG_H__\n"
  },
  {
    "path": "src/asp/Core/AspProgramOptions.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/AspProgramOptions.h>\n#include <asp/Core/AspLog.h>\n#include <asp/Core/EnvUtils.h>\n#include <asp/Core/FileUtils.h>\n#include <asp/asp_date_config.h>\n#include <asp/asp_config.h> // defines ASP_HAVE_PKG_ISIS\n\n#include <vw/vw_date_config.h>\n#include <vw/Core/Log.h>\n#include <vw/Core/System.h>\n#include <vw/Math/BBox.h>\n#include <vw/FileIO/DiskImageResource.h>\n#include <vw/FileIO/FileUtils.h>\n#include <vw/FileIO/FileTypes.h>\n\n#include <boost/algorithm/string.hpp>\n#include <boost/date_time/posix_time/posix_time.hpp>\n#include <boost/filesystem/operations.hpp>\n#include <boost/filesystem/path.hpp>\n#include <boost/lexical_cast.hpp>\n#include <boost/program_options.hpp>\n#include <boost/algorithm/string/replace.hpp>\n\n#include <map>\n#include <sstream>\n#include <string>\n#include <vector>\n#include <unistd.h>\n\nusing namespace vw;\nnamespace po = boost::program_options;\nnamespace fs = boost::filesystem;\n\n// User should only put the arguments to their application in the\n// usage_comment argument. We'll finish filling in the repeated information.\npo::variables_map\nasp::check_command_line(int argc, char *argv[], vw::GdalWriteOptions& opt,\n                        po::options_description const& public_options,\n                        po::options_description const& all_public_options,\n                        po::options_description const& positional_options,\n                        po::positional_options_description const& positional_desc,\n                        std::string & usage_comment,\n                        bool allow_unregistered,\n                        std::vector<std::string> & unregistered) {\n\n  unregistered.clear();\n\n  // Ensure that opt gets all needed fields from vw::GdalWriteOptionsDescription().\n  // This is needed not only for stereo, but for all tools using vw::GdalWriteOptions.\n  asp::stereo_settings().initialize(opt);\n\n  // Finish filling in the usage_comment.\n  std::ostringstream ostr;\n  ostr << \"Usage: \" << argv[0] << \" \" << usage_comment << \"\\n\\n\";\n  ostr << \"  [ASP \" << ASP_VERSION << \"]\\n\";\n#if defined(ASP_BUILD_DATE)\n  ostr << \"  Build date: \" << ASP_BUILD_DATE << \"\\n\";\n#endif\n  ostr << \"\\n\";\n  \n  usage_comment = ostr.str();\n\n  // Set a handful of of env vars for ISIS, GDAL, PROJ\n  asp::set_asp_env_vars();\n  \n  // We distinguish between all_public_options, which is all the\n  // options we must parse, even if we don't need some of them, and\n  // public_options, which are the options specifically used by the\n  // current tool, and for which we also print the help message.\n  po::variables_map vm;\n  try {\n    po::options_description all_options;\n    all_options.add(all_public_options).add(positional_options);\n\n    if (allow_unregistered) {\n      po::parsed_options parsed = \n        po::command_line_parser(argc, argv).options(all_options).allow_unregistered()\n         .style(po::command_line_style::unix_style).run();\n      unregistered = collect_unrecognized(parsed.options, po::include_positional);\n      po::store(parsed, vm);\n    } else {\n      po::parsed_options parsed = \n        po::command_line_parser(argc, argv).options(all_options).positional(positional_desc)\n         .style(po::command_line_style::unix_style).run();\n      po::store(parsed, vm);\n    }\n\n    po::notify(vm);\n  } catch (po::error const& e) {\n    vw::vw_throw(vw::ArgumentErr() << \"Error parsing input:\\n\"\n                  << e.what() << \"\\n\" << usage_comment << public_options);\n  }\n\n  // We really don't want to use BIGTIFF unless we have to. It's\n  // hard to find viewers for bigtiff.\n  if (vm.count(\"no-bigtiff\")) {\n    opt.gdal_options[\"BIGTIFF\"] = \"NO\";\n  } else {\n    opt.gdal_options[\"BIGTIFF\"] = \"IF_SAFER\";\n  }\n\n  if (vm.count(\"help\")) {\n    vw::vw_out() << usage_comment << public_options << \"\\n\";\n    exit(0);\n  }\n\n  if (vm.count(\"version\")) {\n    std::ostringstream ostr;\n    ostr << ASP_PACKAGE_STRING  << \"\\n\";\n#if defined(ASP_COMMIT_ID)\n    ostr << \"  Build ID: \" << ASP_COMMIT_ID << \"\\n\";\n#endif\n#if defined(ASP_BUILD_DATE)\n    ostr << \"  Build date: \" << ASP_BUILD_DATE << \"\\n\";\n#endif\n    ostr << \"\\nBuilt against:\\n  \" << VW_PACKAGE_STRING << \"\\n\";\n#if defined(VW_COMMIT_ID)\n    ostr << \"    Build ID: \" << VW_COMMIT_ID << \"\\n\";\n#endif\n#if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1\n    ostr << \"  USGS ISIS \" << ASP_ISIS_VERSION << \"\\n\";\n#endif\n    ostr << \"  Boost C++ Libraries \" << ASP_BOOST_VERSION << \"\\n\";\n    ostr << \"  GDAL \" << GDAL_RELEASE_NAME << \" | \" << GDAL_RELEASE_DATE << \"\\n\";\n    vw::vw_out() << ostr.str() << \"\\n\";\n    exit(0);\n  }\n\n  opt.setVwSettingsFromOpt();\n  \n  return vm;\n}\n\nnamespace boost {\nnamespace program_options {\n\n  // Custom value semantics, these explain how many tokens should be ingested.\n  \n  // 2 values\n  typed_2_value<vw::Vector2i>*\n  value(vw::Vector2i* v) {\n    typed_2_value<vw::Vector2i>* r =\n      new typed_2_value<vw::Vector2i>(v);\n    return r;\n  }\n  typed_2_value<vw::Vector2>*\n  value(vw::Vector2* v) {\n    typed_2_value<vw::Vector2>* r =\n      new typed_2_value<vw::Vector2>(v);\n    return r;\n  }\n\n  // 3 values\n  typed_3_value<vw::Vector3i>*\n  value(vw::Vector3i* v) {\n    typed_3_value<vw::Vector3i>* r =\n      new typed_3_value<vw::Vector3i>(v);\n    return r;\n  }\n  typed_3_value<vw::Vector3>*\n  value(vw::Vector3* v) {\n    typed_3_value<vw::Vector3>* r =\n      new typed_3_value<vw::Vector3>(v);\n    return r;\n  }\n\n  // 4 values\n  typed_4_value<vw::BBox2i>*\n  value(vw::BBox2i* v) {\n    typed_4_value<vw::BBox2i>* r =\n      new typed_4_value<vw::BBox2i>(v);\n    return r;\n  }\n  typed_4_value<vw::BBox2>*\n  value(vw::BBox2* v) {\n    typed_4_value<vw::BBox2>* r =\n      new typed_4_value<vw::BBox2>(v);\n    return r;\n  }\n\n  // 6 values\n  typed_6_value<vw::BBox3>*\n  value(vw::BBox3* v) {\n    typed_6_value<vw::BBox3>* r =\n      new typed_6_value<vw::BBox3>(v);\n    return r;\n  }\n\n  // Custom validators which describe how text is turned into values\n\n  // Validator for Vector2i\n  template <>\n  void validate(boost::any& v,\n                 const std::vector<std::string>& values,\n                 vw::Vector2i*, long) {\n    validators::check_first_occurrence(v);\n\n    // Concatenate and then split again, so that the user can mix\n    // comma and space delimited values.\n    std::string joined = boost::algorithm::join(values, \" \");\n    std::vector<std::string> cvalues;\n    boost::split(cvalues, joined, is_any_of(\", \"), boost::token_compress_on);\n\n    if (cvalues.size() != 2)\n      boost::throw_exception(invalid_syntax(invalid_syntax::missing_parameter));\n\n    try {\n      Vector2i output(boost::lexical_cast<int32>(cvalues[0]),\n                       boost::lexical_cast<int32>(cvalues[1]));\n      v = output;\n    } catch (boost::bad_lexical_cast const& e) {\n      boost::throw_exception(validation_error(validation_error::invalid_option_value));\n    }\n  }\n\n  // Validator for Vector2\n  template <>\n  void validate(boost::any& v,\n                 const std::vector<std::string>& values,\n                 vw::Vector2*, long) {\n    validators::check_first_occurrence(v);\n\n    // Concatenate and then split again, so that the user can mix\n    // comma and space delimited values.\n    std::string joined = boost::algorithm::join(values, \" \");\n    std::vector<std::string> cvalues;\n    boost::split(cvalues, joined, is_any_of(\", \"), boost::token_compress_on);\n\n    if (cvalues.size() != 2)\n      boost::throw_exception(invalid_syntax(invalid_syntax::missing_parameter));\n\n    try {\n      Vector2 output(boost::lexical_cast<double>(cvalues[0]),\n                      boost::lexical_cast<double>(cvalues[1]));\n      v = output;\n    } catch (boost::bad_lexical_cast const& e) {\n      boost::throw_exception(validation_error(validation_error::invalid_option_value));\n    }\n  }\n\n  // Validator for Vector3i\n  template <>\n  void validate(boost::any& v,\n                 const std::vector<std::string>& values,\n                 vw::Vector3i*, long) {\n    validators::check_first_occurrence(v);\n\n    // Concatenate and then split again, so that the user can mix\n    // comma and space delimited values.\n    std::string joined = boost::algorithm::join(values, \" \");\n    std::vector<std::string> cvalues;\n    boost::split(cvalues, joined, is_any_of(\", \"), boost::token_compress_on);\n\n    if (cvalues.size() != 3)\n      boost::throw_exception(invalid_syntax(invalid_syntax::missing_parameter));\n\n    try {\n      Vector3i output(boost::lexical_cast<int32>(cvalues[0]),\n                      boost::lexical_cast<int32>(cvalues[1]),\n                      boost::lexical_cast<int32>(cvalues[2]));\n      v = output;\n    } catch (boost::bad_lexical_cast const& e) {\n      boost::throw_exception(validation_error(validation_error::invalid_option_value));\n    }\n  }\n\n  // Validator for Vector3\n  template <>\n  void validate(boost::any& v,\n                const std::vector<std::string>& values,\n                vw::Vector3*, long) {\n    validators::check_first_occurrence(v);\n\n    // Concatenate and then split again, so that the user can mix\n    // comma and space delimited values.\n    std::string joined = boost::algorithm::join(values, \" \");\n    std::vector<std::string> cvalues;\n    boost::split(cvalues, joined, is_any_of(\", \"), boost::token_compress_on);\n\n    if (cvalues.size() != 3)\n      boost::throw_exception(invalid_syntax(invalid_syntax::missing_parameter));\n\n    try {\n      Vector3 output(boost::lexical_cast<double>(cvalues[0]),\n                     boost::lexical_cast<double>(cvalues[1]),\n                     boost::lexical_cast<double>(cvalues[2]));\n\n      v = output;\n    } catch (boost::bad_lexical_cast const& e) {\n      boost::throw_exception(validation_error(validation_error::invalid_option_value));\n    }\n  }\n\n  // Validator for BBox2i\n  template <>\n  void validate(boost::any& v,\n                 const std::vector<std::string>& values,\n                 vw::BBox2i*, long) {\n    validators::check_first_occurrence(v);\n\n    // Concatenate and then split again, so that the user can mix\n    // comma and space delimited values.\n    std::string joined = boost::algorithm::join(values, \" \");\n    std::vector<std::string> cvalues;\n    boost::split(cvalues, joined, is_any_of(\", \"), boost::token_compress_on);\n\n    if (cvalues.size() != 4)\n      boost::throw_exception(invalid_syntax(invalid_syntax::missing_parameter));\n\n    try {\n      BBox2i output(Vector2i(boost::lexical_cast<int32>(cvalues[0]),\n                              boost::lexical_cast<int32>(cvalues[1])),\n                    Vector2i(boost::lexical_cast<int32>(cvalues[2]),\n                              boost::lexical_cast<int32>(cvalues[3])));\n      v = output;\n    } catch (boost::bad_lexical_cast const& e) {\n      boost::throw_exception(validation_error(validation_error::invalid_option_value));\n    }\n  }\n\n  // Validator for BBox2\n  template <>\n  void validate(boost::any& v,\n                 const std::vector<std::string>& values,\n                 vw::BBox2*, long) {\n    validators::check_first_occurrence(v);\n\n    // Concatenate and then split again, so that the user can mix\n    // comma and space delimited values.\n    std::string joined = boost::algorithm::join(values, \" \");\n    std::vector<std::string> cvalues;\n    boost::split(cvalues, joined, is_any_of(\", \"), boost::token_compress_on);\n\n    if (cvalues.size() != 4)\n      boost::throw_exception(invalid_syntax(invalid_syntax::missing_parameter));\n\n    try {\n      BBox2 output(Vector2(boost::lexical_cast<double>(cvalues[0]),\n                            boost::lexical_cast<double>(cvalues[1])),\n                   Vector2(boost::lexical_cast<double>(cvalues[2]),\n                            boost::lexical_cast<double>(cvalues[3])));\n      v = output;\n    } catch (boost::bad_lexical_cast const& e) {\n      boost::throw_exception(validation_error(validation_error::invalid_option_value));\n    }\n  }\n\n  // Validator for BBox3\n  template <>\n  void validate(boost::any& v,\n                 const std::vector<std::string>& values,\n                 vw::BBox3*, long) {\n    validators::check_first_occurrence(v);\n\n    // Concatenate and then split again, so that the user can mix\n    // comma and space delimited values.\n    std::string joined = boost::algorithm::join(values, \" \");\n    std::vector<std::string> cvalues;\n    boost::split(cvalues, joined, is_any_of(\", \"), boost::token_compress_on);\n\n    if (cvalues.size() != 6)\n      boost::throw_exception(invalid_syntax(invalid_syntax::missing_parameter));\n\n    try {\n      BBox3 output(Vector3(boost::lexical_cast<double>(cvalues[0]),\n                            boost::lexical_cast<double>(cvalues[1]),\n                            boost::lexical_cast<double>(cvalues[2])),\n                   Vector3(boost::lexical_cast<double>(cvalues[3]),\n                            boost::lexical_cast<double>(cvalues[4]),\n                            boost::lexical_cast<double>(cvalues[5])));\n      v = output;\n    } catch (boost::bad_lexical_cast const& e) {\n      boost::throw_exception(validation_error(validation_error::invalid_option_value));\n    }\n  }\n\n}}\n"
  },
  {
    "path": "src/asp/Core/AspProgramOptions.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file AspProgramOptions.h\n///\n\n#ifndef __ASP_CORE_PROGRAM_OPTIONS_H__\n#define __ASP_CORE_PROGRAM_OPTIONS_H__\n\n// These header files must be here as they define a lot of macros\n// used in many tools, such as ASP_HAVE_PKG_ISIS.\n#include <vw/vw_config.h> // must come before asp_config.h, defines VW_BOOST_VERSION\n#include <asp/asp_config.h>\n\n#include <vw/Core/StringUtils.h>\n#include <vw/Image/ImageIO.h>\n#include <vw/FileIO/DiskImageResourceGDAL.h>\n#include <vw/FileIO/DiskImageView.h>\n#include <vw/FileIO/GdalWriteOptionsDesc.h>\n#include <vw/Math/Vector.h>\n#include <vw/Image/ImageViewRef.h>\n#include <vw/Cartography/GeoReference.h>\n#include <vw/Cartography/GeoReferenceUtils.h>\n\n#include <boost/program_options.hpp>\n#include <boost/filesystem/path.hpp>\n#include <boost/shared_ptr.hpp>\n\n#include <map>\n#include <string>\n#include <bitset>\n\nnamespace vw {\n  struct GdalWriteOptions;\n}\n\nnamespace asp {\n\n  class ASPGlobalOptions; // forward declaration\n\n  boost::program_options::variables_map\n  check_command_line(int argc, char *argv[], vw::GdalWriteOptions& opt,\n                     boost::program_options::options_description const& public_options,\n                     boost::program_options::options_description const& all_public_options,\n                     boost::program_options::options_description const& positional_options,\n                     boost::program_options::positional_options_description\n                     const& positional_desc,\n                     std::string & usage_comment,\n                     bool allow_unregistered, std::vector<std::string> & unregistered);\n\n} // end namespace asp\n\n// Custom Boost Program Options validators for VW/ASP types\nnamespace boost {\nnamespace program_options {\n\n  // Custom value semantics, these explain how many tokens should be ingested.\n\n  // 2 params\n  template <class T, class charT = char>\n  class typed_2_value : public typed_value<T,charT> {\n  public:\n    typed_2_value(T* store_to) : typed_value<T,charT>(store_to) {\n      this->multitoken();\n    }\n\n    unsigned min_tokens() const { return 2; }\n    unsigned max_tokens() const { return 2; }\n  };\n\n  // 3 params\n  template <class T, class charT = char>\n  class typed_3_value : public typed_value<T,charT> {\n  public:\n    typed_3_value(T* store_to) : typed_value<T,charT>(store_to) {\n      this->multitoken();\n    }\n\n    unsigned min_tokens() const { return 3; }\n    unsigned max_tokens() const { return 3; }\n  };\n\n  // 4 params\n  template <class T, class charT = char>\n  class typed_4_value : public typed_value<T,charT> {\n  public:\n    typed_4_value(T* store_to) : typed_value<T,charT>(store_to) {\n      this->multitoken();\n    }\n\n    unsigned min_tokens() const { return 4; }\n    unsigned max_tokens() const { return 4; }\n  };\n\n  // 6 params  \n  template <class T, class charT = char>\n  class typed_6_value : public typed_value<T,charT> {\n  public:\n    typed_6_value(T* store_to) : typed_value<T,charT>(store_to) {\n      this->multitoken();\n    }\n\n    unsigned min_tokens() const { return 6; }\n    unsigned max_tokens() const { return 6; }\n  };\n\n  typed_2_value<vw::Vector2i>* value(vw::Vector2i* v);\n  typed_2_value<vw::Vector2>*  value(vw::Vector2* v);\n  typed_3_value<vw::Vector3i>* value(vw::Vector3i* v);\n  typed_3_value<vw::Vector3>*  value(vw::Vector3* v);\n  typed_4_value<vw::BBox2i>*   value(vw::BBox2i* v);\n  typed_4_value<vw::BBox2>*    value(vw::BBox2* v);\n  typed_6_value<vw::BBox3>*    value(vw::BBox3* v);\n\n  // Custom validators which describe how text is turned into a value\n  // 2 params\n  template <>\n  void validate(boost::any& v,\n                 const std::vector<std::string>& values,\n                 vw::Vector2i*, long);\n  template <>\n  void validate(boost::any& v,\n                 const std::vector<std::string>& values,\n                 vw::Vector2*, long);\n  // 3 params\n  template <>\n  void validate(boost::any& v,\n                 const std::vector<std::string>& values,\n                 vw::Vector3i*, long);\n  template <>\n  void validate(boost::any& v,\n                 const std::vector<std::string>& values,\n                 vw::Vector3*, long);\n  // 4 params\n  template <>\n  void validate(boost::any& v,\n                 const std::vector<std::string>& values,\n                 vw::BBox2i*, long);\n  template <>\n  void validate(boost::any& v,\n                 const std::vector<std::string>& values,\n                 vw::BBox2*, long);\n  // 6 params\n  template <>\n  void validate(boost::any& v,\n                 const std::vector<std::string>& values,\n                 vw::BBox3*, long);\n\n} // end namespace program_options\n} // end namespace boost\n\n#endif//__ASP_CORE_PROGRAM_OPTIONS_H__\n"
  },
  {
    "path": "src/asp/Core/AspStringUtils.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// Low-level string utilities.\n\n// TODO(oalexan1): Move more logic here from Common.cc which is too big.\n\n#include <asp/Core/AspStringUtils.h>\n#include <vw/Core/Exception.h>\n\n#include <boost/algorithm/string.hpp>\n\n#include <iostream>\n#include <fstream>\n\nnamespace asp {\n\n// Given the string dgmaprpc, extract the parts 'dg' and 'rpc'.\nvoid parseCamTypes(std::string const& session_name,\n                   // Outputs\n                   std::string & tri_cam_type, \n                   std::string & mapproj_cam_type) {\n\n  std::string sep = \"map\";\n  std::size_t it = session_name.find(sep);\n  if (it == std::string::npos) \n      vw::vw_throw(vw::ArgumentErr() << \"Could not find the string \\\"\" << sep << \"\\\" in the session name: \\\"\" << session_name << \"\\\".\\n\");\n\n  tri_cam_type = session_name.substr(0, it);\n\n  it += sep.size();\n  mapproj_cam_type = session_name.substr(it, session_name.size());\n} \n\n// Given a file having keys like \"run:\", followed by values, extract\n// the keys and values in a map from keys to vectors of strings.\nvoid parseKeysVals(std::string const& file, \n                   std::map<std::string, std::vector<std::string>> & keys_vals) {\n\n  std::ifstream ifs(file.c_str());\n  if (!ifs.good()) \n    vw::vw_throw(vw::ArgumentErr() << \"Could not open file: \" << file << \"\\n\");\n\n  // Wipe the output map\n  keys_vals.clear();\n  \n  // Read the file line by line\n  std::string line;\n  while (getline(ifs, line)) {\n    boost::trim(line);\n    if (line.empty()) continue;\n    if (line[0] == '#') continue; // Skip comments\n\n    // Split the line into key and value\n    std::vector<std::string> parts;\n    boost::split(parts, line, boost::is_any_of(\" \\t\"), boost::token_compress_on);\n\n    if (parts.empty())\n      continue;\n\n    // Add the key and value to the map\n    std::string key = parts[0];\n    parts.erase(parts.begin());\n    keys_vals[key] = parts;\n  }\n  \n}\n\n/// Parse 'VAR1=VAL1 VAR2=VAL2' into a map. Note that we append to the map,\n/// so it may have some items there beforehand.\n// TODO(oalexan1): This will fail if VAL1 has equal signs.\nvoid parse_append_metadata(std::string const& metadata,\n                           std::map<std::string, std::string> & keywords) {\n  \n  std::istringstream is(metadata);\n  std::string meta, var, val;\n  while (is >> meta){\n    \n    // TODO(oalexan1): Replace only first equal, to allow for equal signs in values.\n    boost::replace_all(meta, \"=\", \" \");  // replace equal with space\n    std::istringstream is2(meta);\n    if (!(is2 >> var >> val)) \n      vw::vw_throw(vw::ArgumentErr() << \"Could not parse: \" << meta << \"\\n\");\n    keywords[var] = val;\n  }\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Core/AspStringUtils.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file AspStringUtils.h\n/// Low-level string utilities.\n\n#ifndef __ASP_CORE_ASP_STRING_UTILS_H__\n#define __ASP_CORE_ASP_STRING_UTILS_H__\n\n#include <string>\n#include <map>\n#include <vector>\n\nnamespace asp {\n\n// Given the string dgmaprpc, extract the parts 'dg' and 'rpc'.\nvoid parseCamTypes(std::string const& session_name,\n                   // Outputs\n                   std::string & tri_cam_type, \n                   std::string & mapproj_cam_type);\n\n// Given a file having keys like \"run:\", and values like what follows, extract\n// the keys and values in a map from keys to vectors of strings.\nvoid parseKeysVals(std::string const& file, \n                   std::map<std::string, std::vector<std::string>> & keys_vals);\n\n// Parse 'VAR1=VAL1 VAR2=VAL2' into a map. Note that we append to the map,\n// so it may have some items there beforehand.\nvoid parse_append_metadata(std::string const& metadata,\n                            std::map<std::string, std::string> & keywords);\n\n} // end namespace asp\n\n\n#endif //__ASP_CORE_ASP_STRING_UTILS_H__\n"
  },
  {
    "path": "src/asp/Core/AsterProc.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Core/AsterProc.h>\n#include <asp/Core/FileUtils.h>\n\n#include <vw/Cartography/GeoReference.h>\n#include <vw/Image/ImageViewRef.h>\n#include <vw/Cartography/Datum.h>\n#include <vw/Math/Vector.h>\n#include <vw/Math/Matrix.h>\n#include <vw/Core/StringUtils.h>\n#include <vw/FileIO/DiskImageView.h>\n#include <vw/FileIO/DiskImageResourceGDAL.h>\n#include <vw/Cartography/GeoReferenceUtils.h>\n\n#include <boost/filesystem.hpp>\n#include <gdal_priv.h>\n\n#include <fstream>\n#include <iomanip>\n#include <cmath>\n\nnamespace fs = boost::filesystem;\n\nnamespace asp {\n\nnamespace {\n\n// Internal helper functions for HDF extraction\n\n// Find a subdataset by pattern matching in the HDF metadata.\nstd::string findSubdataset(char** subdatasets, std::string const& pattern) {\n  for (int i = 0; subdatasets[i] != NULL; i++) {\n    std::string line(subdatasets[i]);\n    if (line.find(\"_NAME=\") != std::string::npos &&\n        line.find(pattern) != std::string::npos) {\n      // Extract the subdataset path after the \"=\"\n      std::size_t pos = line.find(\"=\");\n      return line.substr(pos + 1);\n    }\n  }\n  return \"\";  // Not found\n}\n\n// Extract a single ASTER band image from HDF subdatasets to a TIF file.\nvoid extractBandImage(char** subdatasets,\n                      std::string const& band_name,\n                      std::string const& tmp_dir) {\n\n  // Find the ImageData subdataset for this band\n  std::string search_pattern = band_name + \":ImageData\";\n  std::string band_subdataset = findSubdataset(subdatasets, search_pattern);\n\n  if (band_subdataset.empty())\n    vw::vw_throw(vw::ArgumentErr() << \"Could not find \" << band_name\n                                   << \" in the HDF file.\\n\");\n\n  // Open the subdataset\n  GDALDataset* band_ds = (GDALDataset*)GDALOpen(band_subdataset.c_str(), GA_ReadOnly);\n  if (!band_ds)\n    vw::vw_throw(vw::ArgumentErr() << \"Failed to open \" << band_name << \" subdataset.\\n\");\n\n  // Write to output TIF\n  std::string out_file = tmp_dir + \"/AST_L1A_\" + band_name + \".ImageData.tif\";\n  vw::vw_out() << \"Extracting \" << band_name << \" to: \" << out_file << \"\\n\";\n\n  GDALDriver* gtiff_driver = GetGDALDriverManager()->GetDriverByName(\"GTiff\");\n  GDALDataset* out_ds = gtiff_driver->CreateCopy(out_file.c_str(), band_ds,\n                                                  FALSE, NULL, NULL, NULL);\n  if (!out_ds)\n    vw::vw_throw(vw::ArgumentErr() << \"Failed to write \" << band_name << \" to TIF.\\n\");\n\n  GDALClose(out_ds);\n  GDALClose(band_ds);\n}\n\n// Extract metadata array from HDF subdataset to text file.\n// Writes 3D arrays as space-separated values per line.\nvoid extractMetadataArray(char** subdatasets,\n                          std::string const& band_name,\n                          std::string const& metadata_type,\n                          std::string const& tmp_dir) {\n\n  // Find the metadata subdataset\n  std::string search_pattern = band_name + \":\" + metadata_type;\n  std::string subdataset_path = findSubdataset(subdatasets, search_pattern);\n\n  if (subdataset_path.empty())\n    vw::vw_throw(vw::ArgumentErr() << \"Could not find \" << search_pattern\n                           << \" in the HDF file.\\n\");\n\n  // Open the subdataset\n  GDALDataset* ds = (GDALDataset*)GDALOpen(subdataset_path.c_str(), GA_ReadOnly);\n  if (!ds)\n    vw::vw_throw(vw::ArgumentErr() << \"Failed to open \" << search_pattern\n                                   << \" subdataset.\\n\");\n\n  // Get dimensions\n  int cols = ds->GetRasterXSize();\n  int rows = ds->GetRasterYSize();\n  int bands = ds->GetRasterCount();\n\n  // Read data from all bands\n  std::vector<double> data(rows * cols * bands);\n  for (int band = 1; band <= bands; band++) {\n    GDALRasterBand* raster_band = ds->GetRasterBand(band);\n\n    CPLErr err = raster_band->RasterIO(GF_Read, 0, 0, cols, rows,\n                                       data.data() + (band - 1) * rows * cols,\n                                       cols, rows, GDT_Float64, 0, 0);\n    if (err != CE_None)\n      vw::vw_throw(vw::ArgumentErr() << \"Failed to read \" << search_pattern\n                                     << \" data.\\n\");\n  }\n\n  GDALClose(ds);\n\n  // Write to text file\n  std::string out_file = tmp_dir + \"/AST_L1A_\" + band_name + \".\" + metadata_type + \".txt\";\n\n  std::ofstream ofs(out_file);\n  if (!ofs)\n    vw::vw_throw(vw::ArgumentErr() << \"Failed to open output file: \" << out_file << \"\\n\");\n\n  // Set high precision for output\n  ofs << std::setprecision(17);\n\n  // Handle different array structures:\n  // - If bands == 1 (like SatellitePosition [12x3x1]): rows=time, cols=XYZ\n  //   Write: time1: X Y Z \\n time2: X Y Z \\n ...\n  // - If bands > 1 (like SightVector [11x3x16]): rows=spatial, cols=XYZ, bands=time\n  //   Write in time blocks, each with spatial rows of XYZ values\n\n  if (bands == 1) {\n    // Simple format: each row (time) has all columns (XYZ) on one line\n    for (int row = 0; row < rows; row++) {\n      for (int col = 0; col < cols; col++) {\n        int idx = row * cols + col;\n        ofs << data[idx];\n        if (col < cols - 1)\n          ofs << \" \";\n      }\n      ofs << \"\\n\";\n    }\n  } else {\n    // Complex format: write data grouped by band (time step)\n    // For each time step (band), write all spatial rows with XYZ columns\n    for (int band = 1; band <= bands; band++) {\n      int band_offset = (band - 1) * rows * cols;\n      for (int row = 0; row < rows; row++) {\n        for (int col = 0; col < cols; col++) {\n          int idx = band_offset + row * cols + col;\n          ofs << data[idx];\n          if (col < cols - 1)\n            ofs << \" \";\n        }\n        ofs << \"\\n\";\n      }\n      // Add blank line between time steps (except after last one)\n      if (band < bands)\n        ofs << \"\\n\";\n    }\n  }\n\n  ofs.close();\n}\n\n// Compute latitude and longitude for lattice points from orbital geometry. V004\n// HDF format does not include Lat/Lon datasets - they must be computed from\n// SatellitePosition, SatelliteVelocity, and SightVector using ray-ellipsoid\n// intersection.\nvoid computeLatLonLattice(char** subdatasets,\n                          std::string const& band_name,\n                          std::string const& tmp_dir) {\n\n  // Find required subdatasets\n  std::string pos_path = findSubdataset(subdatasets, band_name + \":SatellitePosition\");\n  std::string vel_path = findSubdataset(subdatasets, band_name + \":SatelliteVelocity\");\n  std::string sight_vec_path = findSubdataset(subdatasets, band_name + \":SightVector\");\n\n  if (pos_path.empty() || vel_path.empty() || sight_vec_path.empty())\n    vw::vw_throw(vw::ArgumentErr() << \"Missing required geometry datasets for \"\n                                   << band_name << \"\\n\");\n\n  // Open datasets\n  GDALDataset* pos_ds = (GDALDataset*)GDALOpen(pos_path.c_str(), GA_ReadOnly);\n  GDALDataset* vel_ds = (GDALDataset*)GDALOpen(vel_path.c_str(), GA_ReadOnly);\n  GDALDataset* sight_ds = (GDALDataset*)GDALOpen(sight_vec_path.c_str(), GA_ReadOnly);\n\n  if (!pos_ds || !vel_ds || !sight_ds)\n    vw::vw_throw(vw::ArgumentErr() << \"Failed to open geometry subdatasets for \"\n                                   << band_name << \"\\n\");\n\n  // Get dimensions\n  // SightVector has shape: RasterCount=time_steps, YSize=lattice_cols, XSize=3 (XYZ)\n  int num_time_steps = sight_ds->GetRasterCount();\n  int num_lattice_cols = sight_ds->GetRasterYSize();\n\n  // Read all data\n  std::vector<double> sat_pos_data(pos_ds->GetRasterXSize() * pos_ds->GetRasterYSize());\n  std::vector<double> sat_vel_data(vel_ds->GetRasterXSize() * vel_ds->GetRasterYSize());\n  std::vector<double> sight_vec_data(sight_ds->GetRasterXSize() *\n                                      sight_ds->GetRasterYSize() *\n                                      sight_ds->GetRasterCount());\n\n  CPLErr err = pos_ds->GetRasterBand(1)->RasterIO(GF_Read, 0, 0,\n                                                   pos_ds->GetRasterXSize(),\n                                                   pos_ds->GetRasterYSize(),\n                                                   sat_pos_data.data(),\n                                                   pos_ds->GetRasterXSize(),\n                                                   pos_ds->GetRasterYSize(),\n                                                   GDT_Float64, 0, 0);\n  if (err != CE_None)\n    vw::vw_throw(vw::IOErr() << \"Failed to read satellite position data.\\n\");\n\n  err = vel_ds->GetRasterBand(1)->RasterIO(GF_Read, 0, 0,\n                                           vel_ds->GetRasterXSize(),\n                                           vel_ds->GetRasterYSize(),\n                                           sat_vel_data.data(),\n                                           vel_ds->GetRasterXSize(),\n                                           vel_ds->GetRasterYSize(),\n                                           GDT_Float64, 0, 0);\n  if (err != CE_None)\n    vw::vw_throw(vw::IOErr() << \"Failed to read satellite velocity data.\\n\");\n\n  for (int band = 1; band <= num_time_steps; band++) {\n    err = sight_ds->GetRasterBand(band)->RasterIO(GF_Read, 0, 0, 3, num_lattice_cols,\n                                                   sight_vec_data.data() +\n                                                     (band - 1) * num_lattice_cols * 3,\n                                                   3, num_lattice_cols,\n                                                   GDT_Float64, 0, 0);\n    if (err != CE_None)\n      vw::vw_throw(vw::IOErr() << \"Failed to read sight vector data for band \"\n                               << band << \".\\n\");\n  }\n\n  GDALClose(pos_ds);\n  GDALClose(vel_ds);\n  GDALClose(sight_ds);\n\n  // Compute lat/lon for each lattice point using WGS84 datum\n  vw::cartography::Datum wgs84;\n  wgs84.set_well_known_datum(\"WGS84\");\n\n  std::vector<double> lat_lattice(num_time_steps * num_lattice_cols);\n  std::vector<double> lon_lattice(num_time_steps * num_lattice_cols);\n\n  // For each time step\n  for (int t = 0; t < num_time_steps; t++) {\n    // Get satellite position and velocity for this time step as vectors\n    vw::Vector3 sat_pos(sat_pos_data[t * 3 + 0],\n                        sat_pos_data[t * 3 + 1],\n                        sat_pos_data[t * 3 + 2]);\n    vw::Vector3 sat_vel(sat_vel_data[t * 3 + 0],\n                        sat_vel_data[t * 3 + 1],\n                        sat_vel_data[t * 3 + 2]);\n\n    // Build orbital frame rotation matrix using VW vector utilities\n    // z_orb = -normalized(sat_pos) [geocentric nadir direction]\n    vw::Vector3 z_orb = -normalize(sat_pos);\n\n    // orbit_normal = sat_pos x sat_vel\n    vw::Vector3 orbit_normal = cross_prod(sat_pos, sat_vel);\n\n    // y_orb = -normalized(orbit_normal) [cross-track direction]\n    vw::Vector3 y_orb = -normalize(orbit_normal);\n\n    // x_orb = y_orb x z_orb [along-track direction]\n    vw::Vector3 x_orb = cross_prod(y_orb, z_orb);\n\n    // Build rotation matrix R = [x_orb | y_orb | z_orb]\n    vw::Matrix<double,3,3> R_orb_to_ecef;\n    select_col(R_orb_to_ecef, 0) = x_orb;\n    select_col(R_orb_to_ecef, 1) = y_orb;\n    select_col(R_orb_to_ecef, 2) = z_orb;\n\n    // For each lattice column\n    for (int c = 0; c < num_lattice_cols; c++) {\n      // Get sight vector in orbital frame\n      int idx = t * num_lattice_cols * 3 + c * 3;\n      vw::Vector3 sv_orb(sight_vec_data[idx + 0],\n                         sight_vec_data[idx + 1],\n                         sight_vec_data[idx + 2]);\n\n      // Check for zero vector\n      if (norm_2(sv_orb) < 1e-10) {\n        lat_lattice[t * num_lattice_cols + c] = 0.0;\n        lon_lattice[t * num_lattice_cols + c] = 0.0;\n        continue;\n      }\n\n      // Transform sight vector from orbital frame to ECEF\n      vw::Vector3 sv_ecef = R_orb_to_ecef * sv_orb;\n\n      // Ray-datum intersection using VW's proven implementation\n      vw::Vector3 ground_pt = vw::cartography::datum_intersection(wgs84, sat_pos, sv_ecef);\n\n      // Check for failed intersection (returns zero vector)\n      if (ground_pt == vw::Vector3()) {\n        lat_lattice[t * num_lattice_cols + c] = 0.0;\n        lon_lattice[t * num_lattice_cols + c] = 0.0;\n        continue;\n      }\n\n      // Convert ECEF ground point to geocentric lat/lon\n      // NOTE: We intentionally use geocentric (not geodetic) coordinates here\n      // to match the V003 format convention. The conversion from geocentric to\n      // geodetic happens later in aster2asp.cc for both V003 and V004 data,\n      // ensuring consistent downstream processing.\n      double p = std::sqrt(ground_pt.x() * ground_pt.x() +\n                          ground_pt.y() * ground_pt.y());\n      lon_lattice[t * num_lattice_cols + c] \n        = std::atan2(ground_pt.y(), ground_pt.x()) * 180.0 / M_PI;\n      lat_lattice[t * num_lattice_cols + c] = std::atan2(ground_pt.z(), p) * 180.0 / M_PI;\n    }\n  }\n\n  // Write latitude file\n  std::string lat_file = tmp_dir + \"/AST_L1A_\" + band_name + \".Latitude.txt\";\n  vw::vw_out() << \"Writing: \" << lat_file << \"\\n\";\n  std::ofstream lat_ofs(lat_file);\n  if (!lat_ofs)\n    vw::vw_throw(vw::ArgumentErr() << \"Failed to open output file: \" << lat_file << \"\\n\");\n\n  lat_ofs << std::setprecision(17);\n  for (int t = 0; t < num_time_steps; t++) {\n    for (int c = 0; c < num_lattice_cols; c++) {\n      lat_ofs << lat_lattice[t * num_lattice_cols + c];\n      if (c < num_lattice_cols - 1)\n        lat_ofs << \" \";\n    }\n    lat_ofs << \"\\n\";\n  }\n  lat_ofs.close();\n\n  // Write longitude file\n  std::string lon_file = tmp_dir + \"/AST_L1A_\" + band_name + \".Longitude.txt\";\n  vw::vw_out() << \"Writing: \" << lon_file << \"\\n\";\n  std::ofstream lon_ofs(lon_file);\n  if (!lon_ofs)\n    vw::vw_throw(vw::ArgumentErr() << \"Failed to open output file: \" << lon_file << \"\\n\");\n\n  lon_ofs << std::setprecision(17);\n  for (int t = 0; t < num_time_steps; t++) {\n    for (int c = 0; c < num_lattice_cols; c++) {\n      lon_ofs << lon_lattice[t * num_lattice_cols + c];\n      if (c < num_lattice_cols - 1)\n        lon_ofs << \" \";\n    }\n    lon_ofs << \"\\n\";\n  }\n  lon_ofs.close();\n}\n\n// Internal implementation detail for radiometric corrections\nclass RadioCorrectView: public vw::ImageViewBase<RadioCorrectView> {\n  vw::DiskImageView<float> m_img;\n  std::vector<vw::Vector3> const &m_corr;\n  bool m_has_nodata;\n  double m_nodata;\n\npublic:\n  RadioCorrectView(vw::DiskImageView<float> const &img,\n                   std::vector<vw::Vector3> const &corr,\n                   bool has_nodata, double nodata):\n  m_img(img), m_corr(corr), m_has_nodata(has_nodata), m_nodata(nodata) {}\n\n  typedef float pixel_type;\n  typedef float result_type;\n  typedef vw::ProceduralPixelAccessor<RadioCorrectView> pixel_accessor;\n\n  inline vw::int32 cols() const { return m_img.cols(); }\n  inline vw::int32 rows() const { return m_img.rows(); }\n  inline vw::int32 planes() const { return 1; }\n\n  inline pixel_accessor origin() const { return pixel_accessor(*this, 0, 0); }\n\n  inline pixel_type operator()(double /*i*/, double /*j*/, vw::int32 /*p*/ = 0) const {\n    vw::vw_throw(vw::NoImplErr()\n             << \"RadioCorrectView::operator()(...) is not implemented\");\n    return pixel_type();\n  }\n\n  typedef vw::CropView<vw::ImageView<pixel_type>> prerasterize_type;\n  inline prerasterize_type prerasterize(vw::BBox2i const &bbox) const {\n    vw::ImageView<float> input_tile = vw::crop(m_img, bbox);\n    vw::ImageView<float> tile(bbox.width(), bbox.height());\n    for (std::int64_t col = bbox.min().x(); col < bbox.max().x(); col++) {\n      vw::Vector3 C = m_corr[col];\n      for (std::int64_t row = bbox.min().y(); row < bbox.max().y(); row++) {\n        float val = input_tile(col - bbox.min().x(), row - bbox.min().y());\n        if (m_has_nodata && val == m_nodata)\n          tile(col - bbox.min().x(), row - bbox.min().y()) = val;\n        else\n          tile(col - bbox.min().x(), row - bbox.min().y()) =\n              C[1] * val / C[2] + C[0];\n      }\n    }\n    return prerasterize_type(tile, -bbox.min().x(), -bbox.min().y(), cols(), rows());\n  }\n\n  template <class DestT>\n  inline void rasterize(DestT const &dest, vw::BBox2i bbox) const {\n    vw::rasterize(prerasterize(bbox), dest, bbox);\n  }\n};\n\n// Helper function to create RadioCorrectView\nRadioCorrectView radioCorrect(vw::DiskImageView<float> const &img,\n                               std::vector<vw::Vector3> const &corr,\n                               bool has_nodata, double nodata) {\n  return RadioCorrectView(img, corr, has_nodata, nodata);\n}\n\n} // anonymous namespace\n\n// Public API functions\n\n// Generate a temporary directory for HDF extraction. If the output_prefix has a parent\n// path (e.g., \"run/out\"), create \"run/tmp\". Otherwise, create a unique directory.\n// Otherwise, if it has no parent path (e.g., just \"out\"), we must create a\n// unique directory in the current directory to avoid conflicts when multiple\n// instances run.\nstd::string genTmpDir(std::string const &output_prefix) {\n  fs::path prefix_path(output_prefix);\n  std::string tmp_dir;\n\n  if (prefix_path.has_parent_path()) {\n    // output_prefix is like \"run/out\", make tmp dir \"run/tmp\"\n    tmp_dir = prefix_path.parent_path().string() + \"/tmp\";\n  } else {\n    // output_prefix is just \"out\", make tmp dir unique like \"tmp_aster_12345\"\n    // Use process ID to ensure uniqueness\n    tmp_dir = \"tmp_aster_\" + vw::num_to_str(getpid());\n  }\n\n  fs::create_directories(tmp_dir);\n  return tmp_dir;\n}\n\n// Extract data from HDF file to temporary directory.\nvoid extractHdfData(std::string const& hdf_file, std::string const& hdfOutDir) {\n  // Open HDF file with GDAL\n  GDALAllRegister();\n  GDALDataset* hdf_ds = (GDALDataset*)GDALOpen(hdf_file.c_str(), GA_ReadOnly);\n  if (!hdf_ds)\n    vw::vw_throw(vw::ArgumentErr() << \"Failed to open HDF file: \" << hdf_file << \"\\n\");\n\n  // Get subdatasets\n  char** subdatasets = hdf_ds->GetMetadata(\"SUBDATASETS\");\n  if (!subdatasets)\n    vw::vw_throw(vw::ArgumentErr() << \"No subdatasets found in HDF file.\\n\");\n\n  // In the HDF4_EOS format, each VNIR band has its own subdatasets:\n  // VNIR_Band3N:ImageData, VNIR_Band3N:SatellitePosition, etc.\n  // VNIR_Band3B:ImageData, VNIR_Band3B:SatellitePosition, etc.\n\n  // Extract both band images\n  extractBandImage(subdatasets, \"VNIR_Band3N\", hdfOutDir);\n  extractBandImage(subdatasets, \"VNIR_Band3B\", hdfOutDir);\n\n  // Extract satellite position metadata for both bands\n  extractMetadataArray(subdatasets, \"VNIR_Band3N\", \"SatellitePosition\", hdfOutDir);\n  extractMetadataArray(subdatasets, \"VNIR_Band3B\", \"SatellitePosition\", hdfOutDir);\n\n  // Extract sight vector metadata for both bands\n  extractMetadataArray(subdatasets, \"VNIR_Band3N\", \"SightVector\", hdfOutDir);\n  extractMetadataArray(subdatasets, \"VNIR_Band3B\", \"SightVector\", hdfOutDir);\n\n  // Extract lattice point metadata for both bands\n  extractMetadataArray(subdatasets, \"VNIR_Band3N\", \"LatticePoint\", hdfOutDir);\n  extractMetadataArray(subdatasets, \"VNIR_Band3B\", \"LatticePoint\", hdfOutDir);\n\n  // Extract radiometric correction table for both bands\n  extractMetadataArray(subdatasets, \"VNIR_Band3N\", \"RadiometricCorrTable\", hdfOutDir);\n  extractMetadataArray(subdatasets, \"VNIR_Band3B\", \"RadiometricCorrTable\", hdfOutDir);\n\n  // Compute latitude/longitude from orbital geometry\n  // V004 HDF does not include these as subdatasets - they must be computed from\n  // SatellitePosition, SatelliteVelocity, and SightVector\n  computeLatLonLattice(subdatasets, \"VNIR_Band3N\", hdfOutDir);\n  computeLatLonLattice(subdatasets, \"VNIR_Band3B\", hdfOutDir);\n\n  GDALClose(hdf_ds);\n}\n\n// ASTER L1A images come with radiometric corrections appended, but not applied.\n// There is one correction per image column.\nvoid applyRadiometricCorrections(std::string const& input_image,\n                                 std::string const& corr_table,\n                                 std::string const& out_image,\n                                 vw::GdalWriteOptions const& opt) {\n\n  // Extract the corrections\n  std::vector<vw::Vector3> corr;\n  asp::read_3d_points(corr_table, corr);\n\n  vw::DiskImageView<float> input_img(input_image);\n\n  // Sanity check\n  if (input_img.cols() != int(corr.size()))\n    vw::vw_throw(vw::ArgumentErr() << \"Expecting as many corrections in \" << corr_table\n                                   << \" as image columns in \" << input_image << \"\\n\");\n\n  // Read nodata value from the image\n  boost::shared_ptr<vw::DiskImageResource> img_rsrc(\n      new vw::DiskImageResourceGDAL(input_image));\n  bool has_nodata = img_rsrc->has_nodata_read();\n  double nodata = has_nodata ? img_rsrc->nodata_read() :\n                  -std::numeric_limits<float>::max();\n\n  // No georef, this being L1A imagery\n  vw::cartography::GeoReference georef;\n  bool has_georef = vw::cartography::read_georeference(georef, input_image);\n  if (has_georef)\n    vw::vw_throw(vw::ArgumentErr()\n                 << \"ASTER L1A images are not supposed to be georeferenced.\\n\");\n\n  // Apply radiometric corrections and write output\n  vw::vw_out() << \"Writing: \" << out_image << std::endl;\n  vw::TerminalProgressCallback tpc(\"asp\", \"\\t-->: \");\n  vw::ImageViewRef<float> corrected_img = radioCorrect(input_img, corr, has_nodata, nodata);\n  vw::cartography::block_write_gdal_image(out_image, corrected_img, has_georef,\n                                          georef, has_nodata, nodata, opt, tpc);\n}\n\n} // namespace asp\n"
  },
  {
    "path": "src/asp/Core/AsterProc.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file AsterProc.h\n///\n/// Utilities for processing ASTER Level 1A data, including HDF extraction\n/// and radiometric corrections. See aster2asp for usage and references.\n\n#ifndef __ASP_CORE_ASTERPROC_H__\n#define __ASP_CORE_ASTERPROC_H__\n\n#include <string>\n\n// Forward declarations\nnamespace vw {\n  class GdalWriteOptions;\n}\n\nnamespace asp {\n\n// Generate a temporary directory for HDF extraction\nstd::string genTmpDir(std::string const& output_prefix);\n\n// Extract data from HDF file to temporary directory\nvoid extractHdfData(std::string const& hdf_file, std::string const& hdfOutDir);\n\n// Apply radiometric corrections to ASTER imagery\nvoid applyRadiometricCorrections(std::string const& input_image,\n                                 std::string const& corr_table,\n                                 std::string const& out_image,\n                                 vw::GdalWriteOptions const& opt);\n\n} // namespace asp\n\n#endif // __ASP_CORE_ASTERPROC_H__\n"
  },
  {
    "path": "src/asp/Core/BaBaseOptions.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file BaBaseOptions.h\n///\n/// Base options structure shared by bundle_adjust, jitter_solve, and rig_calibrator.\n\n#ifndef __ASP_CORE_BA_BASE_OPTIONS_H__\n#define __ASP_CORE_BA_BASE_OPTIONS_H__\n\n#include <asp/Core/Bathymetry.h>\n#include <vw/FileIO/GdalWriteOptions.h>\n#include <vw/Math/Vector.h>\n#include <vw/Math/BBox.h>\n#include <vw/Camera/CameraModel.h>\n#include <vw/Cartography/Datum.h>\n\n#include <string>\n#include <vector>\n#include <set>\n#include <map>\n\nnamespace asp {\n\n// This must be const or else there's a crash\nconst std::string UNSPECIFIED_DATUM = \"unspecified_datum\";\n\n/// These are the different camera modes that bundle_adjust supports.\nenum BACameraType {BaCameraType_Pinhole    = 0,\n                   BaCameraType_OpticalBar = 1,\n                   BaCameraType_CSM        = 2,\n                   BaCameraType_Other      = 3};\n\n// Options shared by bundle_adjust, jitter_solve, and rig_calibrator\nstruct BaBaseOptions: public vw::GdalWriteOptions {\n  std::string out_prefix, stereo_session, input_prefix, match_files_prefix,\n    clean_match_files_prefix, heights_from_dem, reference_terrain, mapproj_dem, weight_image,\n    isis_cnet, nvm, nvm_no_shift, output_cnet_type,\n    image_list, camera_list, mapprojected_data_list,\n    fixed_image_list_str, camera_position_uncertainty_str;\n  int overlap_limit, min_matches, max_pairwise_matches, num_iterations,\n    ip_edge_buffer_percent, max_num_reference_points, num_passes;\n  std::set<std::pair<std::string, std::string>> overlap_list;\n  std::string overlap_list_file, auto_overlap_params, datum_str, proj_str,\n    csv_format_str, csv_srs, csv_proj4_str, disparity_list, stereo_prefix_list;\n  bool have_overlap_list, propagate_errors, match_first_to_last, single_threaded_cameras,\n    update_isis_cubes_with_csm_state, save_adjusted_rpc, fix_gcp_xyz, use_llh_error,\n    save_cnet_as_gcp;\n  double forced_triangulation_distance, min_triangulation_angle, max_triangulation_angle,\n    max_init_reproj_error, robust_threshold, parameter_tolerance;\n  double heights_from_dem_uncertainty, reference_terrain_weight,\n    reference_terrain_uncertainty, reference_terrain_robust_threshold,\n    heights_from_dem_robust_threshold, camera_weight, rotation_weight,\n    camera_position_weight, camera_position_robust_threshold,\n    tri_weight, tri_robust_threshold, camera_position_uncertainty_power,\n    max_disp_error, max_gcp_reproj_err;\n  std::vector<vw::Vector2> camera_position_uncertainty;\n  vw::Vector<double, 4> remove_outliers_params;\n  BACameraType camera_type;\n  std::vector<std::string> image_files, camera_files, gcp_files;\n  std::vector<vw::CamPtr> camera_models;\n  std::map<std::pair<int, int>, std::string> match_files;\n  vw::cartography::Datum datum;\n  vw::BBox2 proj_win; // Limit input triangulated points to this projwin\n  double horizontal_stddev;\n  vw::Vector<double> horizontal_stddev_vec; // may come from cameras or user\n  vw::BathyData bathy_data;\n\n  BaBaseOptions():\n   forced_triangulation_distance(-1),\n   min_triangulation_angle(0.01), camera_position_weight(0.0),\n   camera_position_robust_threshold(0.0), camera_weight(-1.0),\n   rotation_weight(0.0), tri_weight(0.1), tri_robust_threshold(0.1),\n   robust_threshold(0.5), min_matches(0),\n   num_iterations(0), num_passes(0),\n   overlap_limit(0), have_overlap_list(false), propagate_errors(false),\n   match_first_to_last(false), single_threaded_cameras(false),\n   update_isis_cubes_with_csm_state(false),\n   fix_gcp_xyz(false), use_llh_error(false), save_cnet_as_gcp(false),\n   max_gcp_reproj_err(-1.0),\n   camera_type(BaCameraType_Other), max_num_reference_points(-1),\n   datum(vw::cartography::Datum(asp::UNSPECIFIED_DATUM,\n                                \"User Specified Spheroid\",\n                                \"Reference Meridian\", 1, 1, 0)) {}\n};\n\n} // namespace asp\n\n#endif // __ASP_CORE_BA_BASE_OPTIONS_H__\n"
  },
  {
    "path": "src/asp/Core/BaseCameraUtils.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Core/BaseCameraUtils.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/ImageUtils.h>\n\n#include <vw/Core/Exception.h>\n#include <vw/Core/Log.h>\n\n#include <boost/filesystem.hpp>\n#include <string>\n\nnamespace fs = boost::filesystem;\n\nnamespace asp {\n\nusing namespace vw;\n\n// Convert dir1/image1.cub or dir1/image1.xml to out-prefix-image1.adjust\nstd::string bundle_adjust_file_name(std::string const& prefix,\n                                    std::string const& input_img,\n                                    std::string const& input_cam) {\n\n  // Create the adjusted camera file name from the original camera filename,\n  // unless it is empty, and then use the image file name.\n  std::string file = input_cam;\n  if (file == \"\")\n    file = input_img;\n\n  // Find the basename using boost\n  file = fs::path(file).filename().string();\n\n  // Find the last dot in the file name. If not found, set it to the length of\n  // the string.\n  size_t dot = file.rfind(\".\");\n  if (dot == std::string::npos)\n    dot = file.size();\n  // Find the substring until the dot\n  file = file.substr(0, dot);\n  \n  return prefix + \"-\" + file + \".adjust\";\n}\n\n// If we have adjusted camera models, load them. The adjustment may be in the\n// rotation matrix, camera center, or pixel offset. Otherwise return unadjusted\n// cameras.\nvw::CamPtr load_adjusted_model(vw::CamPtr cam,\n                               std::string const& image_file,\n                               std::string const& camera_file,\n                               std::string const& ba_prefix,\n                               vw::Vector2 const& pixel_offset) {\n\n  // Any tool using adjusted camera models must pre-populate the\n  // prefix at which to find them.\n  if (ba_prefix == \"\" && pixel_offset == vw::Vector2())\n    return cam; // Return the unadjusted cameras if there is no adjustment\n\n  Vector3 position_correction;\n  Quat pose_correction;\n\n  // These must start initialized. Note that we may have a pixel\n  // offset passed in from outside, or a pixel offset and scale\n  // that we read from an adjust file. We will throw an error\n  // below if both scenarios happen.\n  Vector2 local_pixel_offset = pixel_offset;\n  double local_scale = 1.0;\n\n  // Ensure these vectors are populated even when there are no corrections to read,\n  // as we may still have pixel offset.\n  position_correction = Vector3();\n  pose_correction = Quat(math::identity_matrix<3>());\n\n  if (ba_prefix != \"\") { // If a bundle adjustment file was specified\n\n    // Get full BA file path\n    std::string adjust_file \n      = asp::bundle_adjust_file_name(ba_prefix, image_file, camera_file);\n\n    // This is a fix for when what is passed in is a mapprojected image. Need to\n    // peek and find the raw image and camera file names in the provided image\n    // geoheader.\n    if (!boost::filesystem::exists(adjust_file)) {\n      std::string adj_key, img_file_key, cam_type_key, cam_file_key, dem_file_key;\n      std::string adj_prefix_raw, image_file_raw, cam_type, cam_file_raw, dem_file;\n      asp::read_mapproj_header(image_file, adj_key, img_file_key, cam_type_key, \n                               cam_file_key, dem_file_key,\n                               adj_prefix_raw, image_file_raw, cam_type,\n                               cam_file_raw, dem_file);\n      if (image_file_raw != \"\")\n        adjust_file = asp::bundle_adjust_file_name(ba_prefix, image_file_raw, \n                                                    cam_file_raw);\n    }\n\n    if (!boost::filesystem::exists(adjust_file))\n      vw_throw(InputErr() << \"Missing adjusted camera model: \" << adjust_file << \".\\n\");\n\n    vw_out() << \"Using adjusted camera model: \" << adjust_file << std::endl;\n    asp::read_adjustments(adjust_file, position_correction, pose_correction,\n\t\t\t  local_pixel_offset, local_scale); // these will change\n\n    if (local_pixel_offset != Vector2() || local_scale != 1.0) {\n      // We read a custom scale and pixel offset passed by the user. But then\n      // the pixel offset passed in by the caller is not valid. Instead of\n      // sorting things out simply refuse to allow this scenario.\n      if (pixel_offset != Vector2()) {\n        vw_throw(InputErr() << \"Cannot use crop win functionality with custom \"\n                 << \"scale and pixel offset in .adjust files.\\n\");\n      }\n    }else{\n      // In this case we have local_pixel_offset == (0, 0) local_scale == 1.0.\n      // So use the pixel_offset passed in by the caller. Scale will stay at 1.0.\n      local_pixel_offset = pixel_offset;\n    }\n\n  } // End case for parsing bundle adjustment file\n\n  // Create the adjusted camera model object with the info we loaded\n  return vw::CamPtr\n             (new vw::camera::AdjustedCameraModel(cam, position_correction,\n                                                 pose_correction, local_pixel_offset,\n                                                 local_scale));\n}\n\n// Read adjustments\n// TODO(oalexan1): Integrate with the VW function for that\nvoid read_adjustments(std::string const& filename,\n                      vw::Vector3      & position_correction,\n                      Quat             & pose_correction,\n                      Vector2          & pixel_offset,\n                      double           & scale) {\n\n  // Initialize the outputs\n  pixel_offset = Vector2();\n  scale = 1.0;\n  \n  Vector3 pos;\n  Vector4 q_buf;\n  std::ifstream istr(filename.c_str());\n\n  // Read the adjustments\n  if (!(istr >> pos[0] >> pos[1] >> pos[2] \n             >> q_buf[0] >> q_buf[1] >> q_buf[2] >> q_buf[3])) \n    vw::vw_throw(vw::ArgumentErr() << \"Failed to read adjustments from: \" \n                 << filename << \".\\n\");\n\n  // The adjustments may have an offset and a scale\n  double a, b, c;\n  if (istr >> a >> b >> c){\n    pixel_offset = Vector2(a, b);\n    scale = c;\n  }\n  \n  position_correction = pos;\n  pose_correction = Quat(q_buf);\n}\n\nvoid write_adjustments(std::string const& filename,\n                       Vector3 const& position_correction,\n                       Quat const& pose_correction) {\n  std::ofstream ostr(filename.c_str());\n  ostr.precision(17);\n  ostr << position_correction[0] << \" \" << position_correction[1] << \" \"\n       << position_correction[2] << \"\\n\";\n  ostr << pose_correction.w() << \" \" << pose_correction.x() << \" \"\n       << pose_correction.y() << \" \" << pose_correction.z() << \" \" << \"\\n\";\n  ostr.close();\n}\n\n// Return the camera pixel offset, if having --left-image-crop-win and same for right.\nvw::Vector2 camera_pixel_offset(bool isMapProjected,\n                                std::string const& left_image_file,\n                                std::string const& right_image_file,\n                                std::string const& curr_image_file) {\n  // For map-projected images we don't apply a pixel offset.\n  // When we need to do stereo on cropped images, we just\n  // crop the images together with their georeferences.\n  if (isMapProjected)\n    return Vector2(0, 0);\n\n  bool crop_left  = (stereo_settings().left_image_crop_win  != BBox2i(0, 0, 0, 0));\n  bool crop_right = (stereo_settings().right_image_crop_win != BBox2i(0, 0, 0, 0));\n  if (!crop_left && !crop_right)\n    return Vector2(0, 0); // No offset needed\n    \n  vw::Vector2 left_pixel_offset(0, 0), right_pixel_offset(0, 0);\n  if (crop_left) left_pixel_offset  = stereo_settings().left_image_crop_win.min();\n  if (crop_right) right_pixel_offset = stereo_settings().right_image_crop_win.min();\n  \n  if (curr_image_file == left_image_file)\n    return left_pixel_offset;\n  else if (curr_image_file == right_image_file)\n    return right_pixel_offset;\n  else\n    // If the image files were not specified, no offset and no error.\n    if ((left_image_file != \"\") || (right_image_file != \"\"))\n      vw_throw(ArgumentErr() \n               << \"Supplied image file does not match left or right image file.\");\n\n  return Vector2(0, 0);\n}\n\n} //end namespace asp\n"
  },
  {
    "path": "src/asp/Core/BaseCameraUtils.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Low-level camera utilities\n\n#ifndef __CORE_BASE_CAMERA_UTILS_H__\n#define __CORE_BASE_CAMERA_UTILS_H__\n\n#include <vw/Camera/CameraModel.h>\n\nnamespace asp {\n\n// Create the adjusted camera file name from the original camera filename,\n// unless it is empty, and then use the image file name.\n// - Convert dir1/image1.cub to out-prefix-image1.adjust\nstd::string bundle_adjust_file_name(std::string const& prefix, \n                                    std::string const& input_img,\n                                    std::string const& input_cam);\n\n// Read an .adjust file\nvoid read_adjustments(std::string const& filename,\n                      vw::Vector3      & position_correction,\n                      vw::Quat         & pose_correction,\n                      vw::Vector2      & pixel_offset, \n                      double           & scale);\n\n/// Write global adjustments\n// TODO(oalexan1): This should be unified with analogous logic in VW\nvoid write_adjustments(std::string const& filename,\n                        vw::Vector3 const& position_correction,\n                        vw::Quat    const& pose_correction);\n\n// If we have adjusted camera models, load them. The adjustment may be in the\n// rotation matrix, camera center, or pixel offset. Otherwise return unadjusted\n// cameras.\nvw::CamPtr load_adjusted_model(vw::CamPtr cam,\n                               std::string const& image_file,\n                               std::string const& camera_file,\n                               std::string const& ba_prefix,\n                               vw::Vector2 const& pixel_offset);\n\n// If both left-image-crop-win and right-image-crop win are specified,\n// we crop the images to these boxes, and hence the need to keep\n// the upper-left corners of the crop windows to handle the cameras correctly.\nvw::Vector2 camera_pixel_offset(bool isMapProjected,\n                                std::string const& left_image_file,\n                                std::string const& right_image_file,\n                                std::string const& curr_image_file);\n\n\n} //end namespace asp\n\n#endif//__CORE_BASE_CAMERA_UTILS_H__\n"
  },
  {
    "path": "src/asp/Core/BathyPlaneCalc.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Core/BathyPlaneCalc.h>\n#include <asp/Core/PointUtils.h>\n\n#include <vw/FileIO/DiskImageUtils.h>\n#include <vw/Cartography/BathyStereoModel.h>\n#include <vw/Cartography/shapeFile.h>\n#include <vw/Math/RANSAC.h>\n#include <vw/Cartography/CameraBBox.h>\n#include <vw/Core/ThreadPool.h>\n#include <vw/Math/RandomSet.h>\n#include <vw/FileIO/FileUtils.h>\n\n#include <Eigen/Dense>\n\n#include <random>\n#include <algorithm>\n#include <iterator>\n#include <iostream>\n#include <vector>\n\nnamespace asp {\n\n// Given a set of polygons stored in dPoly, create a single polygon with all those vertices\nvoid formSinglePoly(vw::geometry::dPoly const& inPoly,\n                    vw::geometry::dPoly & outPoly) {\n\n  int num_pts = inPoly.get_totalNumVerts();\n  const double * xv = inPoly.get_xv();\n  const double * yv = inPoly.get_yv();\n\n  bool isPolyClosed = true;\n  std::string layer = \"\";\n  std::string poly_color = \"green\";\n  outPoly.setPolygon(num_pts, xv, yv, isPolyClosed, poly_color, layer);\n}\n\n// Add a polygon made up of just one point to given set of polygons.\n// Later that set will be saved as a shapefile made up of points.\nvoid addPointToPoly(vw::geometry::dPoly & poly, vw::Vector2 const& p) {\n  std::vector<double> vx, vy;\n  vx.push_back(p.x());\n  vy.push_back(p.y());\n  bool isPolyClosed = true;\n  std::string poly_color = \"green\";\n  std::string layer = \"\";\n  poly.appendPolygon(vx.size(), vw::geometry::vecPtr(vx), vw::geometry::vecPtr(vy),\n                     isPolyClosed, poly_color, layer);\n}\n\n// Add a point to the ecef_vec, llh_vec, and shape_xy_vec if it is valid\nvoid addPoint(vw::cartography::GeoReference const& dem_georef,\n              vw::ImageViewRef<vw::PixelMask<float>> const& interp_dem,\n              vw::Vector2 const& lonlat,\n              vw::Vector2 const& shape_xy,\n              // Append\n              std::vector<Eigen::Vector3d> & ecef_vec,\n              std::vector<vw::Vector3> & llh_vec,\n              std::vector<vw::Vector2> & shape_xy_vec) {\n\n  // Convert to DEM pixel\n  vw::Vector2 pix = dem_georef.lonlat_to_pixel(lonlat);\n  if (!vw::bounding_box(interp_dem).contains(pix))\n    return;\n\n  vw::PixelMask<float> h = interp_dem(pix.x(), pix.y());\n\n  if (!is_valid(h))\n    return;\n\n  vw::Vector3 llh;\n  llh[0] = lonlat[0];\n  llh[1] = lonlat[1];\n  llh[2] = h.child();\n\n  vw::Vector3 ecef = dem_georef.datum().geodetic_to_cartesian(llh);\n  Eigen::Vector3d eigen_ecef;\n  for (size_t coord = 0; coord < 3; coord++)\n    eigen_ecef[coord] = ecef[coord];\n\n  ecef_vec.push_back(eigen_ecef);\n  shape_xy_vec.push_back(shape_xy);\n  llh_vec.push_back(llh);\n}\n\n// Estimate the projection and convert llh_vec to projected coordinates\nvoid find_projection(// Inputs\n                     vw::cartography::GeoReference const& dem_georef,\n                     std::vector<vw::Vector3> const& llh_vec,\n                     // Outputs\n                     double & proj_lat, double & proj_lon,\n                     vw::cartography::GeoReference & stereographic_georef,\n                     std::vector<Eigen::Vector3d> & proj_vec) {\n\n  // Must have positive number of points\n  if (llh_vec.size() == 0)\n    vw::vw_throw(vw::ArgumentErr() << \"Cannot find projection with zero input points.\\n\");\n\n  // Initialize the outputs\n  proj_lat = -1.0;\n  proj_lon = -1.0;\n  proj_vec.clear();\n\n  // Find the mean water height\n  vw::Vector3 mean_llh;\n  for (size_t it = 0; it < llh_vec.size(); it++)\n    mean_llh += llh_vec[it];\n\n  mean_llh /= llh_vec.size();\n\n  stereographic_georef.set_datum(dem_georef.datum());\n  double scale = 1.0;\n  proj_lat = mean_llh[1];\n  proj_lon = mean_llh[0];\n  stereographic_georef.set_stereographic(proj_lat, proj_lon, scale);\n\n  // Convert the points to projected coordinates with this georeference\n  for (size_t it = 0; it < llh_vec.size(); it++) {\n    vw::Vector3 point = stereographic_georef.geodetic_to_point(llh_vec[it]);\n\n    Eigen::Vector3d eigen_point;\n    for (size_t coord = 0; coord < 3; coord++)\n      eigen_point[coord] = point[coord];\n\n    proj_vec.push_back(eigen_point);\n  }\n}\n\n// A function that will find the mean of a std::vector<vw::Vector2> mid_pts\nvw::Vector2 meanOfPoints(std::vector<vw::Vector2> const& points) {\n\n  // Check that must have at least one input\n  if (points.size() == 0)\n    vw::vw_throw(vw::ArgumentErr() << \"Cannot find mean of zero input points.\\n\");\n    \n  vw::Vector2 mean_point(0.0, 0.0);\n  for (size_t it = 0; it < points.size(); it++)\n    mean_point += points[it];\n    \n  mean_point /= points.size();\n  return mean_point;\n}\n\n// Attempts to find the sub-pixel boundary interface for a specific pixel.\n// Returns true if a boundary point was calculated, false otherwise.\nbool calcSubpixBdPoint(vw::ImageViewRef<float> const& mask, \n                       float mask_thresh, int col, int row, \n                       vw::Vector2 & pix) {\n\n  std::vector<vw::Vector2> mid_pts;\n  \n  // The four neighbors\n  const int col_vals[4] = {-1, 0, 0, 1};\n  const int row_vals[4] = {0, -1, 1, 0};\n\n  for (int it = 0; it < 4; it++) {\n    int icol = col + col_vals[it];\n    int irow = row + row_vals[it];\n\n    // Check image bounds\n    if (icol < 0 || irow < 0 || icol >= mask.cols() || irow >= mask.rows())\n      continue;\n\n    // Check if neighbor is on the other side of threshold\n    if (mask(icol, irow) <= mask_thresh)\n      mid_pts.push_back(vw::Vector2(0.5 * (col + icol), 0.5 * (row + irow)));\n  }\n\n  if (mid_pts.empty())\n    return false;\n\n  pix = meanOfPoints(mid_pts);\n  return true;\n}\n\n// This is not used for now, it could be used to make the logic\n// of processing mask boundary points multi-threaded.\nclass MaskBoundaryTask: public vw::Task, private boost::noncopyable {\n  vw::BBox2i m_bbox; // Region of image we're working in\n\n  vw::ImageViewRef<float> m_mask;\n  float m_mask_nodata_val;\n  vw::CamPtr m_camera_model;\n  vw::cartography::GeoReference m_shape_georef;\n  vw::cartography::GeoReference m_dem_georef;\n  vw::ImageViewRef<vw::PixelMask<float>> m_masked_dem;\n\n  // Note how all of these are aliases\n  vw::Mutex                    & m_mutex;\n  std::vector<Eigen::Vector3d> & m_ecef_vec;\n  std::vector<vw::Vector3>     & m_llh_vec;\n  std::vector<vw::Vector2>     & m_shape_xy_vec;\n\npublic:\n  MaskBoundaryTask(vw::BBox2i bbox,\n                   vw::ImageViewRef<float> mask,\n                   float mask_nodata_val,\n                   vw::CamPtr camera_model,\n                   vw::cartography::GeoReference   const & shape_georef,\n                   vw::cartography::GeoReference   const & dem_georef,\n                   vw::ImageViewRef<vw::PixelMask<float>>  masked_dem,\n                   vw::Mutex                             & mutex,\n                   std::vector<Eigen::Vector3d>          & ecef_vec,\n                   std::vector<vw::Vector3>              & llh_vec,\n                   std::vector<vw::Vector2>              & shape_xy_vec):\n    m_bbox(bbox), m_mask(mask), m_mask_nodata_val(mask_nodata_val),\n    m_camera_model(camera_model), m_shape_georef(shape_georef),\n    m_dem_georef(dem_georef), m_masked_dem(masked_dem),\n    m_mutex(mutex), m_ecef_vec(ecef_vec),\n    m_llh_vec(llh_vec), m_shape_xy_vec(shape_xy_vec) {}\n\n  void operator()() {\n\n    // Grow the box by 1 pixel as we need to look at the immediate neighbors\n    vw::BBox2i extra_box = m_bbox;\n    extra_box.expand(1);\n    extra_box.crop(vw::bounding_box(m_mask));\n\n    // Make a local copy of the tile\n    vw::ImageView<float> mask_tile = vw::crop(m_mask, extra_box);\n\n    for (int col = 0; col < mask_tile.cols(); col++) {\n      for (int row = 0; row < mask_tile.rows(); row++) {\n\n        // Look at pixels above threshold which have neighbors <= threshold\n        if (mask_tile(col, row) <= m_mask_nodata_val)\n          continue;\n        \n        // Estimate the sub-pixel boundary point\n        vw::Vector2 local_pix;  \n        if (!calcSubpixBdPoint(mask_tile, m_mask_nodata_val, col, row, local_pix))\n          continue;\n\n        // Create the pixel in the full image coordinates\n        vw::Vector2 pix = local_pix + extra_box.min();\n\n        // Only work on pixels in the current box (earlier had a\n        // bigger box to be able to examine neighbors).\n        if (!m_bbox.contains(pix))\n          continue;\n\n        // The ray going to the ground\n        // Here we assume that the camera model is thread-safe, which is\n        // true for all cameras except ISIS, and this code will be used\n        // on Earth only.\n        vw::Vector3 cam_ctr = m_camera_model->camera_center(pix);\n        vw::Vector3 cam_dir = m_camera_model->pixel_to_vector(pix);\n\n        // Intersect the ray going from the given camera pixel with a DEM.\n        bool treat_nodata_as_zero = false;\n        bool has_intersection = false;\n        double height_error_tol = 0.001; // in meters\n        double max_abs_tol = 1e-14;\n        double max_rel_tol = 1e-14;\n        int num_max_iter = 100;\n        vw::Vector3 xyz_guess(0, 0, 0);\n        vw::Vector3 xyz = vw::cartography::camera_pixel_to_dem_xyz\n          (cam_ctr, cam_dir, m_masked_dem,\n           m_dem_georef, treat_nodata_as_zero,\n           has_intersection, height_error_tol, max_abs_tol, max_rel_tol,\n           num_max_iter, xyz_guess);\n\n        if (!has_intersection)\n          continue;\n\n        vw::Vector3 llh = m_dem_georef.datum().cartesian_to_geodetic(xyz);\n\n        Eigen::Vector3d eigen_xyz;\n        for (size_t coord = 0; coord < 3; coord++)\n          eigen_xyz[coord] = xyz[coord];\n\n        // TODO(oalexan1): This is fragile due to the 360 degree\n        // uncertainty in latitude\n        vw::Vector2 shape_xy = m_shape_georef.lonlat_to_point(vw::Vector2(llh[0], llh[1]));\n\n        {\n          // Need to make sure to lock the shared resource\n          vw::Mutex::Lock lock(m_mutex);\n          m_ecef_vec.push_back(eigen_xyz);\n          m_shape_xy_vec.push_back(shape_xy);\n          m_llh_vec.push_back(llh);\n        }\n      }\n\n    }\n\n  }\n\n};\n\n// Sample the mask boundary (points where the points in the mask have neighbors\n// not in the mask), shoot points from there onto the DEM, and return the\n// obtained points.\nvoid sampleMaskBd(vw::ImageViewRef<float> mask,\n                  float mask_nodata_val,\n                  vw::CamPtr camera_model,\n                  vw::cartography::GeoReference const& shape_georef,\n                  vw::cartography::GeoReference const& dem_georef,\n                  vw::ImageViewRef<vw::PixelMask<float>> masked_dem,\n                  int num_samples,\n                  std::vector<Eigen::Vector3d> & ecef_vec,\n                  std::vector<vw::Vector3> & llh_vec,\n                  std::vector<vw::Vector2> & shape_xy_vec) {\n\n  // num_samples must be positive\n  if (num_samples <= 0)\n    vw::vw_throw(vw::ArgumentErr() << \"The value of --num-samples must be positive.\\n\");\n\n  // We assume the WGS_1984 datum in the shape. For the DEM we checked already.\n  if (shape_georef.datum().name() != \"WGS_1984\")\n    vw::vw_throw(vw::ArgumentErr() << \"The input shape must be relative to the \"\n                 << \"WGS_1984 datum.\\n\" << \"Got: \" << dem_georef.datum().name() << \".\\n\");\n\n  // Ensure that the outputs are initialized\n  ecef_vec.clear();\n  llh_vec.clear();\n  shape_xy_vec.clear();\n\n#if 0\n\n  // For some reason parallel processing is slower than serial processing.\n  // Likely it is because the DEM is shared. Need extra heuristics to cut\n  // that one as appropriate for each task.\n  \n  // TODO(oalexan1): Must review now that the lock issue got fixed\n\n  // Subdivide the box for parallel processing\n  int block_size = vw::vw_settings().default_tile_size();\n  FifoWorkQueue queue(vw_settings().default_num_threads());\n  std::vector<BBox2i> bboxes = subdivide_bbox(mask, block_size, block_size);\n\n  for (size_t it = 0; it < bboxes.size(); it++) {\n    std::cout << \"Box is \" << bboxes[it] << \"\\n\";\n  }\n\n  Mutex mutex;\n  for (size_t it = 0; it < bboxes.size(); it++) {\n    boost::shared_ptr<MaskBoundaryTask>\n      task(new MaskBoundaryTask(bboxes[it],  mask, mask_nodata_val, camera_model,\n                                shape_georef, dem_georef, masked_dem, mutex,\n                                ecef_vec, llh_vec, shape_xy_vec));\n    queue.add_task(task);\n  }\n\n  queue.join_all();\n\n#else\n\n  // Let the mask boundary be the mask pixels whose value is above threshold and\n  // which border pixels whose values is not above threshold.\n\n  vw::vw_out() << \"Processing points at mask boundary.\\n\";\n  vw::TerminalProgressCallback tpc(\"asp\", \"\\t--> \");\n  double inc_amount = 1.0 / mask.cols();\n  tpc.report_progress(0);\n\n  for (int col = 0; col < mask.cols(); col++) {\n    for (int row = 0; row < mask.rows(); row++) {\n\n      // Look at pixels above threshold which have neighbors <= threshold\n      if (mask(col, row) <= mask_nodata_val)\n        continue;\n\n      // Estimate the location of the interface  \n      vw::Vector2 pix;\n      if (!calcSubpixBdPoint(mask, mask_nodata_val, col, row, pix))\n        continue;\n        \n      // The ray going to the ground\n      vw::Vector3 cam_ctr = camera_model->camera_center(pix);\n      vw::Vector3 cam_dir = camera_model->pixel_to_vector(pix);\n\n      // Intersect the ray going from the given camera pixel with a DEM.\n      bool treat_nodata_as_zero = false;\n      bool has_intersection = false;\n      double height_error_tol = 0.001; // in meters\n      double max_abs_tol = 1e-14;\n      double max_rel_tol = 1e-14;\n      int num_max_iter = 100;\n      vw::Vector3 xyz_guess(0, 0, 0);\n      vw::Vector3 xyz = vw::cartography::camera_pixel_to_dem_xyz\n        (cam_ctr, cam_dir, masked_dem,\n         dem_georef, treat_nodata_as_zero,\n         has_intersection, height_error_tol, max_abs_tol, max_rel_tol,\n         num_max_iter, xyz_guess);\n\n      if (!has_intersection)\n        continue;\n\n      vw::Vector3 llh = dem_georef.datum().cartesian_to_geodetic(xyz);\n\n      Eigen::Vector3d eigen_xyz;\n      for (size_t coord = 0; coord < 3; coord++)\n        eigen_xyz[coord] = xyz[coord];\n\n      vw::Vector2 shape_xy = shape_georef.lonlat_to_point(vw::Vector2(llh[0], llh[1]));\n\n      ecef_vec.push_back(eigen_xyz);\n      shape_xy_vec.push_back(shape_xy);\n      llh_vec.push_back(llh);\n    }\n\n    tpc.report_incremental_progress(inc_amount);\n  }\n\n  tpc.report_finished();\n\n#endif\n\n  int num_pts = ecef_vec.size();\n  if (num_pts > num_samples) {\n    vw::vw_out() << \"Found \" << num_pts << \" samples at mask boundary, points but only \"\n             << num_samples << \" samples are desired. Picking a random subset \"\n             << \"of this size.\\n\";\n\n    // Select a subset\n    std::vector<int> w;\n    vw::math::pick_random_indices_in_range(num_pts, num_samples, w);\n    std::vector<Eigen::Vector3d> big_ecef_vec     = ecef_vec;     ecef_vec.clear();\n    std::vector<vw::Vector3>     big_llh_vec       = llh_vec;       llh_vec.clear();\n    std::vector<vw::Vector2>     big_shape_xy_vec = shape_xy_vec; shape_xy_vec.clear();\n    for (size_t it = 0; it < w.size(); it++) {\n      int random_index = w[it];\n      ecef_vec.push_back(big_ecef_vec[random_index]);\n      llh_vec.push_back(big_llh_vec[random_index]);\n      shape_xy_vec.push_back(big_shape_xy_vec[random_index]);\n    }\n  }\n\n  return;\n}\n\n// Find the mask boundary (points where the points in the mask have\n// neighbors not in the mask), and look up the height in the DEM.\nvoid sampleOrthoMaskBd(std::string const& mask_file,\n                       vw::cartography::GeoReference const& mask_georef,\n                       vw::cartography::GeoReference const& dem_georef,\n                       vw::ImageViewRef<vw::PixelMask<float>> interp_dem,\n                       int num_samples,\n                       std::vector<Eigen::Vector3d> & ecef_vec,\n                       std::vector<vw::Vector3> & llh_vec,\n                       std::vector<vw::Vector2> & shape_xy_vec) {\n\n  // We assume the WGS_1984 datum in the mask. For the DEM we checked already.\n  if (mask_georef.datum().name() != \"WGS_1984\")\n    vw::vw_throw(vw::ArgumentErr() << \"The input mask must be relative to the \"\n                 << \"WGS_1984 datum.\\n\" << \"Got: \" << dem_georef.datum().name() << \".\\n\");\n\n  // Use read_bathy_mask() which invalidates both nodata and non-positive\n  // pixels. Then apply_mask() converts to a plain float image with 0 for\n  // water, so the existing threshold logic works with threshold = 0.\n  vw::vw_out() << \"Reading the ortho mask: \" << mask_file << \"\\n\";\n  float mask_thresh = 0.0f;\n  {\n    float file_nodata = -std::numeric_limits<float>::max();\n    if (vw::read_nodata_val(mask_file, file_nodata))\n      vw::vw_out() << \"Read ortho mask nodata value: \" << file_nodata << \".\\n\";\n  }\n  auto masked_mask = vw::read_bathy_mask(mask_file, mask_thresh);\n  auto mask = vw::apply_mask(masked_mask, 0.0f);\n  mask_thresh = 0.0f;\n  vw::vw_out() << \"Non-positive or nodata pixels are classified as water.\\n\";\n\n  // num_samples must be positive\n  if (num_samples <= 0)\n    vw::vw_throw(vw::ArgumentErr() << \"The value of --num-samples must be positive.\\n\");\n\n  // Ensure that the outputs are initialized\n  ecef_vec.clear();\n  llh_vec.clear();\n  shape_xy_vec.clear();\n\n  vw::vw_out() << \"Processing points at ortho mask boundary.\\n\";\n  vw::TerminalProgressCallback tpc(\"asp\", \"\\t--> \");\n  double inc_amount = 1.0 / mask.cols();\n  tpc.report_progress(0);\n\n  for (int col = 0; col < mask.cols(); col++) {\n    for (int row = 0; row < mask.rows(); row++) {\n\n      // Look at pixels above threshold which have neighbors <= threshold\n      if (mask(col, row) <= mask_thresh)\n        continue;\n      \n      // Estimate the location of the interface  \n      vw::Vector2 pix;\n      if (!calcSubpixBdPoint(mask, mask_thresh, col, row, pix))\n        continue;\n      \n      vw::Vector2 shape_xy = mask_georef.pixel_to_point(pix);\n      vw::Vector2 lonlat = mask_georef.point_to_lonlat(shape_xy);\n\n      addPoint(dem_georef, interp_dem, lonlat, shape_xy,\n               ecef_vec, llh_vec, shape_xy_vec);\n    }\n\n    tpc.report_incremental_progress(inc_amount);\n  }\n\n  tpc.report_finished();\n\n  int num_pts = ecef_vec.size();\n  if (num_pts > num_samples) {\n    vw::vw_out() << \"Found \" << num_pts << \" samples at mask boundary, points but only \"\n             << num_samples << \" samples are desired. Picking a random subset \"\n             << \"of this size.\\n\";\n\n    // Select a subset\n    std::vector<int> w;\n    vw::math::pick_random_indices_in_range(num_pts, num_samples, w);\n    std::vector<Eigen::Vector3d> big_ecef_vec     = ecef_vec;     ecef_vec.clear();\n    std::vector<vw::Vector3>     big_llh_vec      = llh_vec;      llh_vec.clear();\n    std::vector<vw::Vector2>     big_shape_xy_vec = shape_xy_vec; shape_xy_vec.clear();\n    for (size_t it = 0; it < w.size(); it++) {\n      int random_index = w[it];\n      ecef_vec.push_back(big_ecef_vec[random_index]);\n      llh_vec.push_back(big_llh_vec[random_index]);\n      shape_xy_vec.push_back(big_shape_xy_vec[random_index]);\n    }\n  }\n\n  return;\n}\n\n// Compute the 3D locations at the shape corners based on interpolating\n// into the DEM and converting to ECEF and to local projected\n// stereographic coordinates.\n// Compute the stereographic georeference with the projection center \n// being the mean lon and lat, and make the 3D locations in reference \n// to this projection.\nvoid find_points_at_shape_corners(std::vector<vw::geometry::dPoly> const& polyVec,\n                                  vw::cartography::GeoReference const& shape_georef,\n                                  vw::cartography::GeoReference const& dem_georef,\n                                  vw::ImageViewRef<vw::PixelMask<float>> interp_dem,\n                                  std::vector<Eigen::Vector3d> & ecef_vec,\n                                  std::vector<vw::Vector3> & llh_vec,\n                                  std::vector<vw::Vector2> & shape_xy_vec) {\n\n  // Ensure that the outputs are initialized\n  ecef_vec.clear();\n  llh_vec.clear();\n  shape_xy_vec.clear();\n\n  int total_num_pts = 0;\n\n  for (size_t p = 0; p < polyVec.size(); p++) {\n    vw::geometry::dPoly const& poly = polyVec[p];\n\n    const double * xv       = poly.get_xv();\n    const double * yv       = poly.get_yv();\n    const int    * numVerts = poly.get_numVerts();\n    int numPolys            = poly.get_numPolys();\n\n    int start = 0;\n    for (int pIter = 0; pIter < numPolys; pIter++) {\n\n      if (pIter > 0) start += numVerts[pIter - 1];\n\n      int numV = numVerts[pIter];\n      for (int vIter = 0; vIter < numV; vIter++) {\n\n        total_num_pts++;\n\n        vw::Vector2 shape_xy(xv[start + vIter], yv[start + vIter]);\n\n        // Convert from projected coordinates to lonlat\n        vw::Vector2 lonlat = shape_georef.point_to_lonlat(shape_xy);\n\n        addPoint(dem_georef, interp_dem, lonlat, shape_xy,\n                 ecef_vec, llh_vec, shape_xy_vec);\n      }\n    }\n  }\n\n  vw::vw_out() << \"Read \" << total_num_pts << \" vertices, with \" << llh_vec.size()\n            << \" of them having a valid DEM height value.\"  << \"\\n\";\n}\n\n// Read a set of measurements in CSV format, to use later to fit the water surface\nvoid find_points_from_meas_csv(std::string const& water_height_measurements,\n                               std::string const& csv_format_str,\n                               vw::cartography::GeoReference const& shape_georef,\n                               // Outputs\n                               std::vector<Eigen::Vector3d> & ecef_vec,\n                               std::vector<vw::Vector3> & llh_vec,\n                               std::vector<vw::Vector2> & shape_xy_vec) {\n  // Wipe the outputs\n  ecef_vec.clear();\n  llh_vec.clear();\n  shape_xy_vec.clear();\n\n  // Read the CSV file\n  asp::CsvConv csv_conv;\n  std::string csv_srs = \"\"; // not needed\n  try {\n    csv_conv.parse_csv_format(csv_format_str, csv_srs);\n  } catch (...) {\n    // Give a more specific error message\n    vw::vw_throw(vw::ArgumentErr() << \"Could not parse --csv-format. Was given: \"\n             << csv_format_str << \".\\n\");\n  }\n  std::list<asp::CsvConv::CsvRecord> pos_records;\n  csv_conv.read_csv_file(water_height_measurements, pos_records);\n\n  // Create llh and vertices\n  for (auto iter = pos_records.begin(); iter != pos_records.end(); iter++) {\n    vw::Vector3 llh = csv_conv.csv_to_geodetic(*iter, shape_georef);\n    llh_vec.push_back(llh);\n    vw::Vector2 shape_xy = shape_georef.lonlat_to_point(vw::Vector2(llh[0], llh[1]));\n    shape_xy_vec.push_back(shape_xy);\n\n    vw::Vector3 ecef = shape_georef.datum().geodetic_to_cartesian(llh);\n    Eigen::Vector3d eigen_ecef;\n    for (size_t coord = 0; coord < 3; coord++)\n      eigen_ecef[coord] = ecef[coord];\n    ecef_vec.push_back(eigen_ecef);\n  }\n\n  return;\n}\n\n// Read a set of lon-lat measurements in CSV format, then interpolate into the DEM\n// with bilinear interpolation to find the height.\nvoid find_points_from_lon_lat_csv(std::string const& lon_lat_measurements,\n                                  std::string const& csv_format_str,\n                                  vw::cartography::GeoReference const& shape_georef,\n                                  vw::cartography::GeoReference const& dem_georef,\n                                  vw::ImageViewRef<vw::PixelMask<float>> interp_dem,\n                                  // Outputs\n                                  std::vector<Eigen::Vector3d> & ecef_vec,\n                                  std::vector<vw::Vector3> & llh_vec,\n                                  std::vector<vw::Vector2> & shape_xy_vec) {\n\n  // Wipe the outputs\n  ecef_vec.clear();\n  llh_vec.clear();\n  shape_xy_vec.clear();\n\n  // Read the CSV file\n  asp::CsvConv csv_conv;\n  std::string csv_srs = \"\"; // not needed\n  try {\n    int min_num_fields = 2; // only lon and lat are needed\n    csv_conv.parse_csv_format(csv_format_str, csv_srs, min_num_fields);\n  } catch (...) {\n    // Give a more specific error message\n    vw::vw_throw(vw::ArgumentErr() << \"Could not parse --csv-format. Was given: \"\n             << csv_format_str << \".\\n\");\n  }\n  std::list<asp::CsvConv::CsvRecord> pos_records;\n  csv_conv.read_csv_file(lon_lat_measurements, pos_records);\n\n  // Create llh and vertices\n  int total_num_pts = 0;\n  for (auto iter = pos_records.begin(); iter != pos_records.end(); iter++) {\n    total_num_pts++;\n    vw::Vector2 lonlat = csv_conv.csv_to_lonlat(*iter, shape_georef);\n    vw::Vector2 shape_xy = shape_georef.lonlat_to_point(lonlat);\n    addPoint(dem_georef, interp_dem, lonlat, shape_xy,\n             ecef_vec, llh_vec, shape_xy_vec);\n  }\n\n  vw::vw_out() << \"Read \" << total_num_pts << \" vertices from CSV, with \" << llh_vec.size()\n            << \" of them having a valid DEM height value.\"  << \"\\n\";\n\n  return;\n}\n\n// Save the points as a shapefile\nvoid saveShape(std::vector<Eigen::Vector3d> const& ecef_vec,\n               std::string const& mask_boundary_shapefile) {\n\n  vw::cartography::GeoReference llh_georef; // create a new explicit longlat WGS84 georef\n  llh_georef.set_geographic();\n  vw::cartography::Datum datum(\"WGS_1984\");\n  llh_georef.set_datum(datum);\n  vw::geometry::dPoly samplePoly;\n  for (size_t ptIter = 0; ptIter < ecef_vec.size(); ptIter++) {\n    vw::Vector3 xyz; // convert Eigen:Vector3 to vw::Vector3\n    for (int c = 0; c < 3; c++) xyz[c] = ecef_vec[ptIter][c];\n    vw::Vector3 llh = llh_georef.datum().cartesian_to_geodetic(xyz);\n    addPointToPoly(samplePoly, vw::math::subvector(llh, 0, 2));\n  }\n\n  std::vector<vw::geometry::dPoly> samplePolyVec;\n  samplePolyVec.push_back(samplePoly);\n  vw::vw_out() << \"Writing shapefile of samples at mask boundary: \"\n           << mask_boundary_shapefile << \"\\n\";\n  bool has_llh_georef = true;\n  vw::geometry::write_shapefile(mask_boundary_shapefile, has_llh_georef, llh_georef,\n                                samplePolyVec);\n}\n\n// Best fit plane without outlier removal. The input points are in 3D coordinates.\n// In practice the points are in a local projected coordinate system, but the \n// math works without this assumption.\nstd::pair<Eigen::Vector3d, Eigen::Vector3d>\nbest_plane_from_points(const std::vector<Eigen::Vector3d> & c) {\n\n  // Copy coordinates to a matrix in Eigen format\n  size_t num_points = c.size();\n  Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic > coord(3, num_points);\n  for (size_t i = 0; i < num_points; i++)\n    coord.col(i) = c[i];\n\n  // calculate centroid\n  Eigen::Vector3d centroid(coord.row(0).mean(), coord.row(1).mean(), coord.row(2).mean());\n\n  // subtract centroid\n  for (size_t i = 0; i < 3; i++)\n    coord.row(i).array() -= centroid(i);\n\n  // We only need the left-singular matrix here\n  // http://math.stackexchange.com/questions/99299/best-fitting-plane-given-a-set-of-points\n  auto svd = coord.jacobiSvd(Eigen::ComputeThinU | Eigen::ComputeThinV);\n  Eigen::Vector3d plane_normal = svd.matrixU().rightCols<1>();\n  return std::make_pair(centroid, plane_normal);\n}\n\n// A functor which returns the best fit plane a*x + b*y + c*z + d = 0\n// as the vector (a, b, c, d) with a*a + b*b + c*c = 1 to be used\n// with RANSAC to remove outliers.\nstruct BestFitPlaneFunctor {\n\n  BestFitPlaneFunctor() {}\n\n  typedef vw::Matrix<double, 1, 4> result_type;\n\n  /// A best fit plane requires pairs of data points to make a fit.\n  template <class ContainerT>\n  size_t min_elements_needed_for_fit(ContainerT const& /*example*/) const { return 3; }\n\n  /// This function can match points in any container that supports\n  /// the size() and operator[] methods.  The container is usually a\n  /// vw::Vector<>, but you could substitute other classes here as\n  /// well.\n  template <class ContainerT>\n  vw::Matrix<double> operator()(std::vector<ContainerT> const& p1,\n                                std::vector<ContainerT> const& p2,\n                                vw::Matrix<double> const& /*seed_input*/\n                                = vw::Matrix<double>()) const {\n\n    // check consistency\n    VW_ASSERT(p1.size() == p2.size(),\n               vw::ArgumentErr() << \"Cannot compute best fit plane. \"\n               << \"p1 and p2 are not the same size.\");\n    VW_ASSERT(!p1.empty() && p1.size() >= min_elements_needed_for_fit(p1[0]),\n               vw::ArgumentErr() << \"Cannot compute best fit plane. \"\n               << \"Insufficient data.\\n\");\n\n    std::pair<Eigen::Vector3d, Eigen::Vector3d> plane = best_plane_from_points(p1);\n\n    Eigen::Vector3d & centroid = plane.first;\n    Eigen::Vector3d & normal = plane.second;\n\n    vw::Matrix<double> result(1, 4);\n    for (int col = 0; col < 3; col++)\n      result(0, col) = normal[col];\n\n    result(0, 3) = -normal.dot(centroid);\n\n    // Make the z coefficient positive, which will make the normal\n    // point \"up\" in the projected coordinate system.\n    if (result(0, 2) < 0) {\n      for (int col = 0; col < 4; col++)\n        result(0, col) *= -1.0;\n    }\n\n    return result;\n  }\n};\n\n// Given a 1x4 matrix named 'plane', with values (a, b, c, d),\n// determining the plane a * x + b * y + c * z + d = 0, find the\n// distance to this plane from a given point.\ntemplate<class Vec3>\ndouble dist_to_plane(vw::Matrix<double, 1, 4> const& plane, Vec3 const& point) {\n\n  double ans = 0.0;\n  for (unsigned col = 0; col < 3; col++) {\n      ans += plane(0, col) * point[col];\n  }\n  ans += plane(0, 3);\n\n  return std::abs(ans);\n}\n\n// The value p2 is needed by the interface but we don't use it\nstruct BestFitPlaneErrorMetric {\n  template <class RelationT, class ContainerT>\n  double operator()(RelationT const& plane, ContainerT const& p1, ContainerT const& p2) const {\n    return dist_to_plane(plane, p1);\n  }\n};\n\n// Calculate a few properties of the plane fitted to the given points and print them out\nvoid calcPlaneProperties(std::vector<Eigen::Vector3d> const& proj_vec,\n                         std::vector<size_t> const& inlier_indices,\n                         vw::cartography::GeoReference & dem_georef,\n                         vw::Matrix<double> const& plane) {\n\n  double max_error = - 1.0, max_inlier_error = -1.0;\n  for (size_t it = 0; it < proj_vec.size(); it++)\n    max_error = std::max(max_error, dist_to_plane(plane, proj_vec[it]));\n\n  // Do estimates for the mean height and angle of the plane\n  vw::Vector3 mean_point(0, 0, 0);\n  double mean_height = 0.0;\n  int num = 0;\n  for (size_t it = 0; it < inlier_indices.size(); it++) {\n    Eigen::Vector3d p = proj_vec[inlier_indices[it]];\n    vw::Vector3 point(p[0], p[1], p[2]);\n    max_inlier_error = std::max(max_inlier_error, dist_to_plane(plane, point));\n\n    // the point is in the stereographic projection\n    mean_height += point[2];\n\n    num++;\n  }\n\n  mean_height /= num;\n\n  vw::vw_out() << \"Max distance to the plane (meters): \" << max_error << \"\\n\";\n  vw::vw_out() << \"Max inlier distance to the plane (meters): \" << max_inlier_error << \"\\n\";\n  vw::vw_out() << \"Mean plane height above datum (meters): \" << mean_height << \"\\n\";\n}\n\n// Save the bathy plane and the projection parameters if needed\nvoid saveBathyPlane(double proj_lat, double proj_lon,\n                    vw::Matrix<double> const& plane, std::string const& plane_file) {\n\n  vw::vw_out() << \"Writing: \" << plane_file << \"\\n\";\n  vw::create_out_dir(plane_file);\n  std::ofstream bp(plane_file.c_str());\n  bp.precision(17);\n  for (int col = 0; col < plane.cols(); col++) {\n    bp << plane(0, col);\n    if (col < plane.cols() - 1)\n      bp << \" \";\n    else\n      bp << \"\\n\";\n  }\n  bp << \"# Latitude and longitude of the local stereographic projection with the WGS_1984 datum:\\n\";\n  bp << proj_lat << \" \" << proj_lon << \"\\n\";\n  bp.close();\n}\n\n// Given a DEM surface and a planar surface (with potentially some\n// inclination) subtract from each DEM height the height at that\n// plane. The height of the plane is obtained by considering the\n// current DEM grid point, and another point at same lon-lat but with\n// a height 100 meters less, converting these to the given projection, \n// tracing a ray through them, seeing where it intersects the plane, \n// converting that point to geodetic, and taking the height difference.\nclass DemMinusPlaneView: public vw::ImageViewBase<DemMinusPlaneView>{\n  vw::ImageViewRef<float> m_dem;\n  vw::cartography::GeoReference m_dem_georef;\n  vw::Matrix<double> m_plane;\n  double m_dem_nodata_val;\n  vw::cartography::GeoReference m_stereographic_georef;\n\n  typedef float PixelT;\n\npublic:\n  DemMinusPlaneView(vw::ImageViewRef<float> const& dem,\n                    vw::cartography::GeoReference const& dem_georef,\n                    vw::Matrix<double> const& plane,\n                    double dem_nodata_val,\n                    vw::cartography::GeoReference const& stereographic_georef):\n    m_dem(dem), m_dem_georef(dem_georef), m_plane(plane),\n    m_dem_nodata_val(dem_nodata_val),\n    m_stereographic_georef(stereographic_georef) {}\n\n  typedef PixelT pixel_type;\n  typedef PixelT result_type;\n  typedef vw::ProceduralPixelAccessor<DemMinusPlaneView> pixel_accessor;\n\n  inline vw::int32 cols() const { return m_dem.cols(); }\n  inline vw::int32 rows() const { return m_dem.rows(); }\n  inline vw::int32 planes() const { return 1; }\n\n  inline pixel_accessor origin() const { return pixel_accessor(*this, 0, 0); }\n\n  inline pixel_type operator()(double/*i*/, double/*j*/, vw::int32/*p*/ = 0) const {\n    vw::vw_throw(vw::NoImplErr() << \"DemMinusPlaneView::operator()(...) is not implemented\");\n    return pixel_type();\n  }\n\n  typedef vw::CropView< vw::ImageView<pixel_type> > prerasterize_type;\n\n  inline prerasterize_type prerasterize(vw::BBox2i const& bbox) const {\n\n    // Bring this portion in memory\n    vw::ImageView<result_type> cropped_dem = vw::crop(m_dem, bbox);\n\n    vw::ImageView<result_type> tile(bbox.width(), bbox.height());\n\n    for (int col = 0; col < bbox.width(); col++) {\n      for (int row = 0; row < bbox.height(); row++) {\n\n        // Handle the case when the DEM is not valid\n        if (cropped_dem(col, row) == m_dem_nodata_val) {\n          tile(col, row) = m_dem_nodata_val;\n          continue;\n        }\n\n        vw::Vector2 pix(col + bbox.min().x(), row + bbox.min().y());\n        vw::Vector2 lon_lat = m_dem_georef.pixel_to_lonlat(pix);\n\n        vw::Vector3 llh;\n        vw::math::subvector(llh, 0, 2) = lon_lat;\n        llh[2] = cropped_dem(col, row);\n\n        // Find the DEM point in local projection or ECEF.\n        // Find another point on the same ray.\n        vw::Vector3 point1, point2;\n\n        point1 = m_stereographic_georef.geodetic_to_point(llh);\n        llh[2] -= 100.0;\n        point2 = m_stereographic_georef.geodetic_to_point(llh);\n\n        // The ray is P = point1 + t * (point2 - point1), where t is real.\n        // The plane is a*x + b*y + c*z + d = 0, where plane = (a, b, c, d).\n        // Then, dot(P, plane_normal) + plane_intercept = 0.\n        // Use that to find t.\n        vw::Vector3 plane_normal(m_plane(0, 0), m_plane(0, 1), m_plane(0, 2));\n        double plane_intercept = m_plane(0, 3);\n\n        double t = -(vw::math::dot_prod(point1, plane_normal) + plane_intercept) /\n          vw::math::dot_prod(point2 - point1, plane_normal);\n\n        vw::Vector3 P = point1 + t * (point2 - point1);\n\n        // Go back to llh\n        llh = m_stereographic_georef.point_to_geodetic(P);\n\n        tile(col, row) = cropped_dem(col, row) - llh[2];\n      }\n    }\n\n    return prerasterize_type(tile, -bbox.min().x(), -bbox.min().y(),\n                             cols(), rows());\n  }\n\n  template <class DestT>\n  inline void rasterize(DestT const& dest, vw::BBox2i bbox) const {\n    vw::rasterize(prerasterize(bbox), dest, bbox);\n  }\n};\n\nvw::ImageViewRef<float> \ndemMinusPlane(vw::ImageViewRef<float> const& dem,\n              vw::cartography::GeoReference const& dem_georef,\n              vw::Matrix<double> plane,\n              double dem_nodata_val,\n              vw::cartography::GeoReference const& stereographic_georef) {\n  return DemMinusPlaneView(dem, dem_georef, plane, dem_nodata_val,\n                           stereographic_georef);\n}\n\n// Use RANSAC to find the best plane\nvoid calcBathyPlane(int num_ransac_iterations,\n                    double inlier_threshold,\n                    std::vector<Eigen::Vector3d> const& proj_vec,\n                    vw::Matrix<double> & plane,\n                    std::vector<size_t> & inlier_indices) {\n\n  std::vector<Eigen::Vector3d> dummy_vec(proj_vec.size()); // Required by the interface\n  int min_num_output_inliers = std::max(proj_vec.size()/2, size_t(3));\n  bool reduce_min_num_output_inliers_if_no_fit = true;\n  vw::vw_out() << \"Starting RANSAC.\\n\";\n  try {\n    // Must first create the functor and metric, then pass these to ransac. If\n    // created as inline arguments to ransac, these may go go out\n    // of scope prematurely, which will result in incorrect behavior.\n    BestFitPlaneFunctor func;\n    BestFitPlaneErrorMetric error_metric;\n    vw::math::RandomSampleConsensus<BestFitPlaneFunctor, BestFitPlaneErrorMetric>\n      ransac(func, error_metric, num_ransac_iterations, inlier_threshold,\n             min_num_output_inliers, reduce_min_num_output_inliers_if_no_fit);\n    plane = ransac(proj_vec, dummy_vec);\n    inlier_indices = ransac.inlier_indices(plane, proj_vec, dummy_vec);\n  } catch (const vw::math::RANSACErr& e) {\n    vw::vw_out() << \"RANSAC failed: \" << e.what() << \"\\n\";\n  }\n  vw::vw_out() << \"Found \" << inlier_indices.size() << \" / \" << proj_vec.size()\n               << \" inliers.\\n\";\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Core/BathyPlaneCalc.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file BathyPlaneCalc.h\n\n#ifndef __ASP_CORE_BATHYPLANECALC_H__\n#define __ASP_CORE_BATHYPLANECALC_H__\n\n#include <vw/Math/Vector.h>\n#include <vw/Math/Matrix.h>\n#include <vw/Image/ImageViewRef.h>\n#include <vw/Image/PixelMask.h>\n#include <vw/Cartography/GeoReference.h>\n#include <vw/Geometry/dPoly.h>\n#include <vw/Camera/CameraModel.h>\n\n#include <Eigen/Dense>\n\n#include <vector>\n#include <string>\n\nnamespace asp {\n\n// Given a set of polygons stored in dPoly, create a single polygon with all those vertices\nvoid formSinglePoly(vw::geometry::dPoly const& inPoly,\n                    vw::geometry::dPoly & outPoly);\n\n// Add a polygon made up of just one point to given set of polygons.\n// Later that set will be saved as a shapefile made up of points.\nvoid addPointToPoly(vw::geometry::dPoly & poly, vw::Vector2 const& p);\n\n// Add a point to the ecef_vec, llh_vec, and shape_xy_vec if it is valid\nvoid addPoint(vw::cartography::GeoReference const& dem_georef,\n              vw::ImageViewRef<vw::PixelMask<float>> const& interp_dem,\n              vw::Vector2 const& lonlat,\n              vw::Vector2 const& shape_xy,\n              // Append\n              std::vector<Eigen::Vector3d> & ecef_vec,\n              std::vector<vw::Vector3> & llh_vec,\n              std::vector<vw::Vector2> & shape_xy_vec);\n\n// Estimate the projection and convert llh_vec to projected coordinates\nvoid find_projection(// Inputs\n                     vw::cartography::GeoReference const& dem_georef,\n                     std::vector<vw::Vector3> const& llh_vec,\n                     // Outputs\n                     double & proj_lat, double & proj_lon,\n                     vw::cartography::GeoReference & stereographic_georef,\n                     std::vector<Eigen::Vector3d> & proj_vec);\n\n// Sample the mask boundary (points where the points in the mask have neighbors\n// not in the mask), shoot points from there onto the DEM, and return the\n// obtained points.\nvoid sampleMaskBd(vw::ImageViewRef<float> mask,\n                  float mask_nodata_val,\n                  vw::CamPtr camera_model,\n                  vw::cartography::GeoReference const& shape_georef,\n                  vw::cartography::GeoReference const& dem_georef,\n                  vw::ImageViewRef<vw::PixelMask<float>> masked_dem,\n                  int num_samples,\n                  std::vector<Eigen::Vector3d> & ecef_vec,\n                  std::vector<vw::Vector3> & llh_vec,\n                  std::vector<vw::Vector2> & shape_xy_vec);\n\n// Find the mask boundary (points where the points in the mask have\n// neighbors not in the mask), and look up the height in the DEM.\nvoid sampleOrthoMaskBd(std::string const& mask_file,\n                       vw::cartography::GeoReference const& mask_georef,\n                       vw::cartography::GeoReference const& dem_georef,\n                       vw::ImageViewRef<vw::PixelMask<float>> interp_dem,\n                       int num_samples,\n                       std::vector<Eigen::Vector3d> & ecef_vec,\n                       std::vector<vw::Vector3> & llh_vec,\n                       std::vector<vw::Vector2> & shape_xy_vec);\n\n// Compute the 3D locations at the shape corners based on interpolating\n// into the DEM and converting to ECEF and to local projected\n// stereographic coordinates.\n// Compute the stereographic georeference with the projection center \n// being the mean lon and lat, and make the 3D locations in reference \n// to this projection.\nvoid find_points_at_shape_corners(std::vector<vw::geometry::dPoly> const& polyVec,\n                                  vw::cartography::GeoReference const& shape_georef,\n                                  vw::cartography::GeoReference const& dem_georef,\n                                  vw::ImageViewRef<vw::PixelMask<float>> interp_dem,\n                                  std::vector<Eigen::Vector3d> & ecef_vec,\n                                  std::vector<vw::Vector3> & llh_vec,\n                                  std::vector<vw::Vector2> & shape_xy_vec);\n\n// Read a set of measurements in CSV format, to use later to fit the water surface\nvoid find_points_from_meas_csv(std::string const& water_height_measurements,\n                               std::string const& csv_format_str,\n                               vw::cartography::GeoReference const& shape_georef,\n                               // Outputs\n                               std::vector<Eigen::Vector3d> & ecef_vec,\n                               std::vector<vw::Vector3> & llh_vec,\n                               std::vector<vw::Vector2> & shape_xy_vec);\n\n// Read a set of lon-lat measurements in CSV format, then interpolate into the DEM\n// with bilinear interpolation to find the height.\nvoid find_points_from_lon_lat_csv(std::string const& lon_lat_measurements,\n                                  std::string const& csv_format_str,\n                                  vw::cartography::GeoReference const& shape_georef,\n                                  vw::cartography::GeoReference const& dem_georef,\n                                  vw::ImageViewRef<vw::PixelMask<float>> interp_dem,\n                                  // Outputs\n                                  std::vector<Eigen::Vector3d> & ecef_vec,\n                                  std::vector<vw::Vector3> & llh_vec,\n                                  std::vector<vw::Vector2> & shape_xy_vec);\n\n// Save the points as a shapefile\nvoid saveShape(std::vector<Eigen::Vector3d> const& ecef_vec,\n               std::string const& mask_boundary_shapefile);\n\n// Calculate a few properties of the plane fitted to the given points and print them out\nvoid calcPlaneProperties(std::vector<Eigen::Vector3d> const& proj_vec,\n                         std::vector<size_t> const& inlier_indices,\n                         vw::cartography::GeoReference & dem_georef,\n                         vw::Matrix<double> const& plane);\n\n// Save the bathy plane and the projection parameters if needed\nvoid saveBathyPlane(double proj_lat, double proj_lon,\n                    vw::Matrix<double> const& plane, std::string const& plane_file);\n\nvw::ImageViewRef<float> demMinusPlane(vw::ImageViewRef<float> const& dem,\n                                      vw::cartography::GeoReference const& dem_georef,\n                                      vw::Matrix<double> plane,\n                                      double dem_nodata_val,\n                                      vw::cartography::GeoReference const& stereographic_georef);\n\n// Use RANSAC to find the best plane\nvoid calcBathyPlane(int num_ransac_iterations,\n                    double inlier_threshold,\n                    std::vector<Eigen::Vector3d> const& proj_vec,\n                    vw::Matrix<double> & plane,\n                    std::vector<size_t> & inlier_indices);\n\n} // end namespace asp\n\n#endif // __ASP_CORE_BATHYPLANECALC_H__"
  },
  {
    "path": "src/asp/Core/Bathymetry.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Core/Bathymetry.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/FileUtils.h>\n#include <vw/Camera/CameraModel.h>\n#include <vw/Cartography/BathyStereoModel.h>\n#include <vw/Core/Exception.h>\n#include <vw/Math/LevenbergMarquardt.h>\n#include <vw/Image/ImageViewRef.h>\n#include <vw/Image/PixelMask.h>\n#include <vw/Image/MaskViews.h>\n#include <vw/FileIO/DiskImageView.h>\n#include <vw/FileIO/DiskImageUtils.h>\n\nnamespace asp {\n\n// Helper function to read bathy planes from either a direct string or a list file.\n// Returns space-separated string of plane files suitable for vw::readBathyPlanes().\nstd::string readBathyPlanesStrOrList(std::string const& bathy_plane_files,\n                                     std::string const& bathy_plane_list) {\n\n  bool have_plane_files = (bathy_plane_files != \"\");\n  bool have_plane_list = (bathy_plane_list != \"\");\n  \n  if (have_plane_files && have_plane_list)\n    vw::vw_throw(vw::ArgumentErr() \n             << \"Cannot specify both --bathy-plane and --bathy-plane-list.\\n\");\n\n  std::string planes_to_load;\n  if (have_plane_list) {\n    std::vector<std::string> plane_files;\n    asp::read_list(bathy_plane_list, plane_files);\n    \n    // Join vector into space-separated string\n    for (size_t i = 0; i < plane_files.size(); i++) {\n      if (i > 0)\n        planes_to_load += \" \";\n      planes_to_load += plane_files[i];\n    }\n  } else {\n    planes_to_load = bathy_plane_files;\n  }\n  \n  return planes_to_load;\n}\n\n// Read all bathy data\nvoid readBathyData(int num_images,\n                   std::string const& bathy_mask_list,\n                   std::string const& bathy_plane_files,\n                   std::string const& bathy_plane_list,\n                   float refraction_index,\n                   vw::BathyData & bathy_data) {\n\n  std::vector<std::string> bathy_mask_files;\n  if (bathy_mask_list != \"\")\n    asp::read_list(bathy_mask_list, bathy_mask_files);\n\n  if (int(bathy_mask_files.size()) != num_images)\n    vw::vw_throw(vw::ArgumentErr() << \"The number of bathy masks must agree with \"\n             << \"the number of images.\\n\");\n\n  std::string planes_to_load = readBathyPlanesStrOrList(bathy_plane_files, \n                                                        bathy_plane_list);\n  vw::readBathyPlanes(planes_to_load, num_images, bathy_data.bathy_planes);\n  vw::read_bathy_masks(bathy_mask_files, bathy_data.bathy_masks);\n  bathy_data.refraction_index = refraction_index;\n\n  // Validate consistency\n  validateBathyData(bathy_data, num_images);\n}\n\n// For stereo will use left and right bathy masks. For bundle adjustment and\n// jitter_solve will use a list of masks. Only checks if bathy settings strings\n// are non-empty. Full consistency validation (all-or-nothing, sizes,\n// refraction_index) is done by validateBathyData() which is called\n// automatically in readBathyData().\nbool doBathy(asp::StereoSettings const& stereo_settings) {\n  return (stereo_settings.left_bathy_mask  != \"\" ||\n          stereo_settings.right_bathy_mask != \"\" ||\n          stereo_settings.bathy_mask_list  != \"\");\n}\n\n// Validate loaded bathymetry data for internal consistency.\n// This is a data consistency validator that checks the loaded BathyData structure\n// for all-or-nothing configuration and size consistency.\n// Called after readBathyData() loads masks and planes into BathyData.\n// Used by: bundle_adjust, jitter_solve.\nvoid validateBathyData(vw::BathyData const& bathy_data, int num_images) {\n\n  bool has_planes = !bathy_data.bathy_planes.empty();\n  bool has_masks  = !bathy_data.bathy_masks.empty();\n  bool has_refr   = (bathy_data.refraction_index > 1.0);\n\n  // All or nothing\n  if (has_planes || has_masks || has_refr) {\n    if (!has_planes)\n      vw::vw_throw(vw::ArgumentErr()\n                   << \"Bathy masks/refraction set but no planes.\\n\");\n    if (!has_masks)\n      vw::vw_throw(vw::ArgumentErr()\n                   << \"Bathy planes/refraction set but no masks.\\n\");\n    if (!has_refr)\n      vw::vw_throw(vw::ArgumentErr()\n                   << \"Bathy planes/masks set but refraction_index <= 1.0.\\n\");\n\n    // Size checks\n    if (bathy_data.bathy_planes.size() != (size_t)num_images)\n      vw::vw_throw(vw::ArgumentErr()\n                   << \"Bathy planes count does not match number of images.\\n\");\n    if (bathy_data.bathy_masks.size() != (size_t)num_images)\n      vw::vw_throw(vw::ArgumentErr()\n                   << \"Bathy masks count does not match number of images.\\n\");\n  }\n}\n\n// Lightweight check. The fully checking is done on loading.\nbool hasBathy(vw::BathyData const& bathy_data) {\n  return !bathy_data.bathy_planes.empty();\n}\n\n// Validate bathymetry policy and tool compatibility.\n// This is a policy/compatibility validator that checks command-line options\n// against tool-specific constraints before loading any data.\n// Checks: tool compatibility (ISIS, alignment methods), option presence, and basic values.\n// Called early by: stereo, bundle_adjust, jitter_solve.\nvoid bathyChecks(std::string const& session_name,\n                 asp::StereoSettings const& stereo_settings,\n                 int num_images) {\n\n  if (doBathy(stereo_settings)) {\n    // If only the topo cloud needs computing, will use only the info from the\n    // left and right bathy masks, so does not need the refraction index and\n    // the bathy plane.\n    if (stereo_settings.output_cloud_type != \"topo\") {\n\n      if (stereo_settings.refraction_index <= 1.0)\n        vw::vw_throw(vw::ArgumentErr() << \"The water index of refraction to be used in \"\n                  << \"bathymetry correction must be bigger than 1.\\n\");\n\n      if (stereo_settings.bathy_plane == \"\" && stereo_settings.bathy_plane_list == \"\")\n        vw::vw_throw(vw::ArgumentErr() \n                  << \"Either --bathy-plane or --bathy-plane-list must be specified.\\n\");\n\n      // Check mutual exclusion\n      if (stereo_settings.bathy_plane != \"\" && stereo_settings.bathy_plane_list != \"\")\n        vw::vw_throw(vw::ArgumentErr() \n                  << \"Cannot specify both --bathy-plane and --bathy-plane-list.\\n\");\n\n      // Sanity check reading the bathy plane\n      std::string planes_to_check = readBathyPlanesStrOrList(stereo_settings.bathy_plane,\n                                                             stereo_settings.bathy_plane_list);\n      std::vector<vw::BathyPlane> bathy_plane_vec;\n      vw::readBathyPlanes(planes_to_check, num_images, bathy_plane_vec);\n    }\n\n    if (session_name.find(\"isis\") != std::string::npos)\n      vw::vw_throw(vw::ArgumentErr()\n                   << \"Bathymetry correction does not work with ISIS cameras.\\n\");\n\n    if (stereo_settings.alignment_method != \"homography\"     &&\n        stereo_settings.alignment_method != \"affineepipolar\" &&\n        stereo_settings.alignment_method != \"local_epipolar\" &&\n        stereo_settings.alignment_method != \"none\")\n      vw::vw_throw(vw::ArgumentErr()\n          << \"Bathymetry correction only works with alignment methods \"\n          << \"homography, affineepipolar, local_epipolar, and none.\\n\");\n\n    if (stereo_settings.propagate_errors)\n      vw::vw_throw(vw::ArgumentErr() << \"Error propagation is not implemented when \"\n                << \"bathymetry is modeled.\\n\");\n  }\n\n  // Ensure that either both or none of these settings are specified\n  if ((stereo_settings.refraction_index > 1.0 ||\n       stereo_settings.bathy_plane != \"\" ||\n       stereo_settings.bathy_plane_list != \"\") &&\n      !doBathy(stereo_settings))\n    vw::vw_throw(vw::ArgumentErr()\n          << \"When bathymetry correction is not on, it is not necessary to \"\n          << \"specify the water refraction index or the bathy plane.\\n\");\n\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Core/Bathymetry.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n/// \\file Bathymetry.h\n///\n\n#ifndef __ASP_CORE_BATHYMETRY_H__\n#define __ASP_CORE_BATHYMETRY_H__\n\n#include <vw/Math/Vector.h>\n#include <vw/Stereo/StereoModel.h>\n#include <vw/Cartography/BathyStereoModel.h>\n#include <vw/Cartography/GeoReference.h>\n#include <vw/Image/ImageViewRef.h>\n#include <vw/Image/PixelMask.h>\n\nnamespace asp {\n\nclass StereoSettings;\n\n// Check that all settings are consistent for doing or not doing bathymetry correction\nvoid bathyChecks(std::string const& session_name,\n                 asp::StereoSettings const& stereo_settings,\n                 int num_images);\n\n// If to apply bathy correction\nbool doBathy(asp::StereoSettings const& stereo_settings);\n\n// Helper function to read bathy planes from either a direct string or a list file.\n// Returns space-separated string of plane files suitable for vw::readBathyPlanes().\nstd::string readBathyPlanesStrOrList(std::string const& bathy_plane_files,\n                                     std::string const& bathy_plane_list);\n\n// Read all bathy data\nvoid readBathyData(int num_images,\n                   std::string const& bathy_mask_list,\n                   std::string const& bathy_plane_files,\n                   std::string const& bathy_plane_list,\n                   float refraction_index,\n                   vw::BathyData & bathy_data);\n\n// Validate loaded bathy data for internal consistency. Checks that either all\n// bathy components are present or none are, and that sizes match num_images.\n// Call after readBathyData().\nvoid validateBathyData(vw::BathyData const& bathy_data, int num_images);\n\n// Check if bathymetry correction should be applied. Returns true if bathy data\n// is loaded and valid. Note: Full validation is done at load time by\n// validateBathyData().\nbool hasBathy(vw::BathyData const& bathy_data);\n\n} // end namespace asp\n\n#endif //__ASP_CORE_BATHYMETRY_H__\n"
  },
  {
    "path": "src/asp/Core/BitChecker.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Core/BitChecker.h>\n#include <vw/Core/Exception.h>\n\nvoid asp::BitChecker::check_argument(vw::uint8 arg) {\n  // Turn on the arg'th bit in m_checksum\n  m_checksum.set(arg);\n}\n\nasp::BitChecker::BitChecker(vw::uint8 num_arguments): m_checksum(0) {\n  VW_ASSERT(num_arguments != 0,\n             vw::ArgumentErr() << \"There must be at least one thing you read.\\n\");\n  VW_ASSERT(num_arguments <= 32,\n             vw::ArgumentErr() << \"You can only have up to 32 checks.\\n\");\n\n  // Turn on the first num_arguments bits in m_good\n  m_good.reset();\n  m_checksum.reset();\n  for (vw::uint8 i = 0; i < num_arguments; i++)\n    m_good.set(i);\n}\n\nbool asp::BitChecker::is_good() const {\n  // Make sure all expected bits in m_checksum have been turned on.\n  return (m_good == m_checksum);\n}\n"
  },
  {
    "path": "src/asp/Core/BitChecker.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file BitChecker.h\n///\n\n#ifndef __ASP_CORE_BIT_CHECKER_H__\n#define __ASP_CORE_BIT_CHECKER_H__\n\n#include <vw/Core/FundamentalTypes.h>\n\n#include <bitset>\n\nnamespace asp {\n\n  // TODO: Replace with something else!\n  /// Convenience class for setting flags and later on\n  ///  making sure that we set all of them.\n  /// - Designed to be inherited from.\n  class BitChecker {\n    std::bitset<32> m_checksum; ///< Store current bits\n    std::bitset<32> m_good;     ///< Store target bits\n\n  protected:\n    /// Used to check off that one of the arguments has been read.\n    void check_argument(vw::uint8 arg);\n\n  public:\n    /// Pass in the number of expected arguments, max 32\n    BitChecker(vw::uint8 num_arguments);\n\n    bool is_good() const; ///< Return true if all arguments have been checked.\n  }; // End class BitChecker\n\n} // end namespace asp\n\n#endif//__ASP_CORE_BIT_CHECKER_H__\n"
  },
  {
    "path": "src/asp/Core/BundleAdjustUtils.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file BundleAdjustUtils.cc\n///\n\n#include <asp/Core/BaseCameraUtils.h>\n#include <asp/Core/BundleAdjustUtils.h>\n#include <asp/Core/GCP.h>\n#include <asp/Core/ImageUtils.h>\n#include <asp/Camera/BaParams.h>\n\n#include <vw/Core/Log.h>\n#include <vw/Camera/CameraModel.h>\n#include <vw/BundleAdjustment/ControlNetwork.h>\n#include <vw/Stereo/StereoModel.h>\n#include <vw/Cartography/GeoReference.h>\n#include <vw/FileIO/DiskImageView.h>\n#include <vw/Cartography/CameraBBox.h>\n#include <vw/BundleAdjustment/CameraRelation.h>\n#include <vw/InterestPoint/MatcherIO.h>\n#include <vw/Core/Stopwatch.h>\n#include <vw/Image/Interpolation.h>\n#include <vw/Image/ImageChannels.h>\n#include <vw/Image/PixelTypeInfo.h>\n#include <vw/Cartography/shapeFile.h>\n\n#include <string>\n\nusing namespace vw;\nusing namespace vw::camera;\nusing namespace vw::stereo;\nusing namespace vw::ba;\n\nnamespace fs = boost::filesystem;\n\nnamespace asp {\n\n// See the .h file for documentation\nvoid camera_footprint(std::string const& dem_file,\n                      std::string const& image_file,\n                      vw::CamPtr  const& camera_model,\n                      std::string const& out_prefix,\n                      // Outputs\n                      vw::geometry::dPoly & footprint,\n                      vw::BBox2 & footprint_bbox) {\n\n  vw_out() << \"Computing ground footprint bounding box of: \" + image_file << std::endl;\n\n  // Initialize outputs\n  footprint = vw::geometry::dPoly();\n  footprint_bbox = vw::BBox2();\n\n  std::string stem = fs::path(image_file).stem().string();\n  std::string box_path = out_prefix + '-' + stem + \"-bbox.txt\";\n  if (fs::exists(box_path)) {\n    double min_x, min_y, max_x, max_y;\n    std::ifstream ifs(box_path);\n    if (ifs >> min_x >> min_y >> max_x >> max_y) {\n      footprint_bbox.min() = vw::Vector2(min_x, min_y);\n      footprint_bbox.max() = vw::Vector2(max_x, max_y);\n      vw_out() << \"Read cached ground footprint bbox from: \" << box_path << \":\\n\"\n               << footprint_bbox << \"\\n\";\n      return;\n    }\n  }\n\n  // Read the DEM and supporting data\n  vw::cartography::GeoReference dem_georef;\n  DiskImageView<float> dem_disk_image(dem_file);\n  ImageViewRef<PixelMask<float>> dem;\n  boost::shared_ptr<DiskImageResource> dem_rsrc(DiskImageResourcePtr(dem_file));\n  if (dem_rsrc->has_nodata_read())\n    dem = create_mask(dem_disk_image, dem_rsrc->nodata_read());\n  else\n    dem = pixel_cast<PixelMask<float>>(dem_disk_image); // all pixels are valid\n\n  bool has_georef = vw::cartography::read_georeference(dem_georef, dem_file);\n  if (!has_georef)\n    vw_throw(ArgumentErr() << \"There is no georeference information in: \"\n              << dem_file << \".\\n\");\n\n  try {\n    DiskImageView<float> img(image_file);\n    bool quick = false;     // Do a thorough job\n    float mean_gsd = 0.0;\n    int num_samples = 100; // should be enough\n    std::vector<Vector3> coords;\n    footprint_bbox\n      = vw::cartography::camera_bbox(dem, dem_georef, dem_georef,\n                                     camera_model, img.cols(), img.rows(),\n                                     mean_gsd, quick, &coords, num_samples);\n\n   // Convert the coordinates from ECEF to points in the DEM projection \n   for (size_t i = 0;  i < coords.size(); i++) {\n     coords[i] = dem_georef.datum().cartesian_to_geodetic(coords[i]);\n     coords[i] = dem_georef.geodetic_to_point(coords[i]);\n   }\n\n   // Compute the convex hull of the projected coordinates, for easier\n   // intersection operations later\n   vw::geometry::convexHull(coords, footprint);\n\n  } catch (std::exception const& e) {\n    vw_throw(ArgumentErr() << e.what() << \"\\n\"\n              << \"Failed to compute the footprint of camera image: \" << image_file\n              << \" onto DEM: \" << dem_file << \".\\n\");\n  }\n\n  vw_out() << \"Writing: \" << box_path << \"\\n\";\n  std::ofstream ofs(box_path.c_str());\n  ofs.precision(17);\n  ofs << footprint_bbox.min().x() << \" \" <<  footprint_bbox.min().y() << \" \"\n      << footprint_bbox.max().x() << \" \" <<  footprint_bbox.max().y() << \"\\n\";\n  ofs.close();\n}\n\n// See the .h file for the documentation.\nvoid buildOverlapList(std::string const& out_prefix,\n                      std::string const& dem_file,\n                      double pct_for_overlap,\n                      int overlap_limit,\n                      bool match_first_to_last,\n                      std::vector<std::string> const& image_files,\n                      std::vector<vw::CamPtr>  const& camera_models,\n                      std::set<std::pair<std::string, std::string>> &\n                      overlap_list) {\n\n  // Wipe the output\n  overlap_list.clear();\n\n  // Sanity check\n  if (image_files.size() != camera_models.size())\n    vw_throw(ArgumentErr() << \"Expecting as many images as cameras.\\n\");\n\n  int num_images = image_files.size();\n  std::vector<vw::BBox2> boxes(num_images);\n  std::vector<vw::geometry::dPoly> footprints(num_images);\n  for (int it = 0; it < num_images; it++) {\n    // By this stage the camera bboxes are already computed and cached,\n    // they just need to be loaded.\n    asp::camera_footprint(dem_file, image_files[it], camera_models[it], out_prefix,\n                          footprints[it], boxes[it]);\n\n    // Expand the box by the given factor\n    expand_box_by_pct(boxes[it], pct_for_overlap);\n  }\n\n  // See which boxes overlap. While this is an O(N^2) computation, likely N is\n  // at most a thousand or two, which should be manageable. A 2D tree of box\n  // corners could be used, and two boxes would then overlap if corners from one\n  // box are contained in a second box. That would be a O(N * log(N)) lookup. If\n  // match_first_to_last is true, need to look past num_images, so wrap around\n  // and look at earlier images.\n  // TODO(oalexan1): Use a tree structure.\n  for (int it1 = 0; it1 < num_images; it1++) {\n    int num_added = 0;\n\n    int end2 = num_images;\n    if (match_first_to_last)\n      end2 = num_images + overlap_limit;\n\n    for (int it2 = it1 + 1; it2 < end2; it2++) {\n\n      // Wrap around if needed\n      int local_it2 = it2 % num_images;\n\n      BBox2 box = boxes[it1]; // deep copy\n      box.crop(boxes[local_it2]);\n      if (!box.empty() && num_added < overlap_limit) {\n        auto pair1 = std::make_pair(image_files[it1], image_files[local_it2]);\n        auto pair2 = std::make_pair(image_files[local_it2], image_files[it1]);\n\n        if (overlap_list.find(pair1) != overlap_list.end() ||\n            overlap_list.find(pair2) != overlap_list.end())\n          continue; // already added\n\n        // Can't have matches to itself\n        if (it1 == local_it2)\n          continue;\n\n        // Add the pair with first index less than the second\n        std::pair<std::string, std::string> pair;\n        if (it1 < local_it2)\n          pair = std::make_pair(image_files[it1], image_files[local_it2]);\n        else\n          pair = std::make_pair(image_files[local_it2], image_files[it1]);\n        overlap_list.insert(pair);\n\n        num_added++;\n      }\n\n      // Stop when added enough\n      if (num_added >= overlap_limit)\n        break;\n    }\n  }\n\n  return;\n}\n\n/// Ensure that the basename (without extension) of all images, camera files, or\n/// adjustment names are different. Later these will be used for match files,\n/// and we want match files corresponding to different images to be different.\nvoid check_for_duplicates(std::vector<std::string> const& image_files,\n                               std::vector<std::string> const& camera_files,\n                               std::string const& out_prefix) {\n\n  if (image_files.size() != camera_files.size())\n    vw_throw(vw::ArgumentErr() << \"Expecting as many images as cameras.\\n\");\n\n  std::set<std::string> img_set, cam_set, adj_set;\n  for (size_t i = 0; i < camera_files.size(); i++) {\n    std::string img = vw::ip::strip_path(\"\", image_files[i]);\n    std::string cam = vw::ip::strip_path(\"\", camera_files[i]);\n    std::string ba_name = asp::bundle_adjust_file_name(out_prefix,\n                                                       image_files[i], camera_files[i]);\n    std::string adj_base = vw::ip::strip_path(out_prefix, ba_name);\n\n    if (img_set.find(img) != img_set.end())\n      vw_throw(vw::ArgumentErr() << \"Found duplicate image: \" << img << \"\\n\");\n\n    if (cam != \"\" && cam_set.find(cam) != cam_set.end())\n      vw_throw(vw::ArgumentErr() << \"Found duplicate camera: \" << cam << \"\\n\");\n\n    if (adj_set.find(adj_base) != adj_set.end())\n      vw_throw(vw::ArgumentErr() << \"Found duplicate adjustment name: \" << adj_base << \"\\n\");\n\n    img_set.insert(img);\n    if (cam != \"\")\n      cam_set.insert(cam); // camera file can be empty\n    adj_set.insert(adj_base);\n\n  }\n}\n\n// Given an xyz point in ECEF coordinates, update its height above datum by\n// interpolating into a DEM. The input must already be prepared for\n// interpolation. The user must check the return status.\nbool updatePointHeightFromDem(vw::cartography::GeoReference const& dem_georef,\n                              vw::ImageViewRef<PixelMask<double>> const& interp_dem,\n                              // Output\n                              vw::Vector3 & xyz) {\n\n  // Points at planet center are outliers\n  if (xyz == Vector3(0, 0, 0))\n    return false;\n\n  Vector3 llh = dem_georef.datum().cartesian_to_geodetic(xyz);\n  Vector2 ll  = subvector(llh, 0, 2);\n  Vector2 pix = dem_georef.lonlat_to_pixel(ll);\n  if (!interp_dem.pixel_in_bounds(pix)) {\n    xyz = Vector3(0, 0, 0);\n    return false;\n  }\n\n  PixelMask<double> height = interp_dem(pix[0], pix[1]);\n  if (!is_valid(height)) {\n    xyz = Vector3(0, 0, 0);\n    return false;\n  }\n\n  llh[2] = height.child();\n\n  // NaN check\n  if (llh[2] != llh[2]) {\n    xyz = Vector3(0, 0, 0);\n    return false;\n  }\n\n  // Overwrite the input\n  xyz = dem_georef.datum().geodetic_to_cartesian(llh);\n\n  return true;\n}\n\n// Shoot rays from all matching interest points. Intersect those with a DEM. Find\n// their average. Project it vertically onto the DEM. Invalid or uncomputable\n// xyz are set to the zero vector.\n// TODO(oalexan1): This code can be slow, but using multiple threads makes it\n// even slower, likely because of having to share the masked_dem image. To speed\n// it up one could break the loop over features into several parts. Each would\n// load and have its own masked_dem image. Even then there may be some global\n// cache for all images, which would slow things down.\n// There is a function with the same name and logic for rig_calibrator.\nvoid updateTriPtsFromDem(vw::ba::ControlNetwork const& cnet,\n                         std::set<int> const& outliers,\n                         std::vector<vw::CamPtr> const& camera_models,\n                         vw::cartography::GeoReference const& dem_georef,\n                         vw::ImageViewRef<vw::PixelMask<double>> const& masked_dem,\n                         // Output\n                         std::vector<vw::Vector3> & dem_xyz_vec) {\n\n  // Put this note as this part can take a long time\n  vw::vw_out() << \"Updating triangulated points with DEM height.\\n\";\n\n  int num_tri_points = cnet.size();\n  dem_xyz_vec.resize(num_tri_points, vw::Vector3(0, 0, 0));\n\n  // Project vertically onto the DEM. This needs interpolation into the DEM\n  vw::PixelMask<double> invalid_val;\n  vw::ImageViewRef<vw::PixelMask<double>> interp_dem\n   = vw::interpolate(masked_dem, vw::BilinearInterpolation(),\n                     vw::ValueEdgeExtension<vw::PixelMask<float>>(invalid_val));\n\n  // Prepare for measuring progress and elapsed time\n  vw::TerminalProgressCallback tpc(\"asp\", \"\\t--> \");\n  double inc_amount = 1.0 / std::max(1, num_tri_points);\n  tpc.report_progress(0);\n  vw::Stopwatch sw;\n  sw.start();\n\n  for (int ipt = 0; ipt < num_tri_points; ipt++) {\n\n    tpc.report_incremental_progress(inc_amount);\n\n    if (cnet[ipt].type() == vw::ba::ControlPoint::GroundControlPoint)\n      continue; // GCP do not get modified\n\n    if (outliers.find(ipt) != outliers.end())\n      continue; // Skip outliers\n\n    // The initial triangulated point\n    Vector3 xyz_guess = cnet[ipt].position();\n\n    // Points at planet center are outliers. This check is likely redundant,\n    // but good to have.\n    if (xyz_guess == Vector3(0, 0, 0))\n      continue;\n\n    Vector3 accumulated_xyz(0,0,0);\n    int num_intersections = 0;\n\n    for (size_t m = 0; m < cnet[ipt].size(); m++) {\n\n      // The observed value for the projection of point with index ipt into\n      // the camera with index icam.\n      Vector2 observation = cnet[ipt][m].position();\n\n      // Intersect ray with DEM\n      bool treat_nodata_as_zero = false;\n      bool has_intersection = false;\n      double height_error_tol = 0.001; // 1 mm should be enough\n      double max_abs_tol      = 1e-14; // abs cost fun change b/w iterations\n      double max_rel_tol      = 1e-14;\n      int num_max_iter        = 25;   // Using many iterations can be very slow\n      int icam = cnet[ipt][m].image_id();\n      Vector3 dem_xyz = vw::cartography::camera_pixel_to_dem_xyz\n        (camera_models[icam]->camera_center(observation),\n         camera_models[icam]->pixel_to_vector(observation),\n         vw::pixel_cast<vw::PixelMask<float>>(masked_dem),\n         dem_georef, treat_nodata_as_zero, has_intersection,\n         height_error_tol, max_abs_tol, max_rel_tol, num_max_iter, xyz_guess);\n\n      if (!has_intersection)\n        continue;\n\n      accumulated_xyz += dem_xyz;\n      num_intersections++;\n    }\n\n    // Average the successful intersections.\n    if (num_intersections > 0)\n      dem_xyz_vec[ipt] = accumulated_xyz / double(num_intersections);\n    else\n      dem_xyz_vec[ipt] = Vector3();\n\n    if (dem_xyz_vec[ipt] == Vector3())\n      continue; // Skip invalid points\n\n    Vector3 observation = dem_xyz_vec[ipt];\n    if (updatePointHeightFromDem(dem_georef, interp_dem, observation))\n      dem_xyz_vec[ipt] = observation;\n\n  } // end iterating over points\n\n  tpc.report_finished();\n\n  sw.stop();\n  vw::vw_out() << \"Elapsed time in updating triangulated points from DEM: \"\n               << sw.elapsed_seconds() << \" seconds.\\n\";\n\n  return;\n}\n\n// Flag outliers by reprojection error with input cameras. This assumes that\n// the input cameras are pretty accurate.\nvoid flag_initial_outliers(vw::ba::ControlNetwork const& cnet,\n                           asp::CRN const& crn,\n                           std::vector<vw::CamPtr> const& camera_models,\n                           double max_init_reproj_error,\n                           // Output\n                           std::set<int> & outliers) {\n  // Wipe the output\n  outliers.clear();\n\n  int num_cameras = camera_models.size();\n  int num_tri_points = cnet.size();\n\n  for (int icam = 0; icam < (int)crn.size(); icam++) {\n\n    for (auto fiter = crn[icam].begin(); fiter != crn[icam].end(); fiter++) {\n\n      // The index of the triangulated point\n      int ipt = (**fiter).m_point_id;\n\n      VW_ASSERT(icam < num_cameras, ArgumentErr()\n                  << \"Out of bounds in the number of cameras.\");\n      VW_ASSERT(ipt < num_tri_points, ArgumentErr()\n                  << \"Out of bounds in the number of points.\");\n\n      if (outliers.find(ipt) != outliers.end()) {\n        // Is an outlier\n        continue;\n      }\n\n      // The observed value for the projection of point with index ipt into\n      // the camera with index icam.\n      Vector2 observation = (**fiter).m_location;\n\n      Vector3 const& tri_point = cnet[ipt].position(); // alias\n\n      // Flag outliers produced when building or triangulating the control network\n      if (cnet[ipt].ignore()) {\n        outliers.insert(ipt);\n        continue;\n      }\n\n      if (tri_point == Vector3(0, 0, 0)) {\n        // Points at planet center are outliers\n        outliers.insert(ipt);\n        continue;\n      }\n\n      vw::Vector2 pix;\n      try {\n        pix = camera_models[icam]->point_to_pixel(tri_point);\n        bool is_good = (norm_2(pix - observation) <= max_init_reproj_error);\n\n        if (cnet[ipt].type() == ControlPoint::GroundControlPoint)\n          is_good = true; // GCP are not filtered with max_init_reproj_error\n\n        if (!is_good) { // this checks for NaN too\n          outliers.insert(ipt);\n          continue;\n        }\n      } catch (...) {\n        outliers.insert(ipt);\n        continue;\n      }\n    }\n\n  } // end iterating over cameras\n\n  return;\n}\n\n// Manufacture a CSM state file from an adjust file\nstd::string csmStateFile(std::string const& adjustFile) {\n\n  std::string csmFile = adjustFile;\n\n  // If the suffix we want to add is already present, remove it first\n  std::string suff = \".adjusted_state\";\n  auto it = csmFile.find(suff);\n  if (it != std::string::npos)\n    csmFile.replace(it, suff.size(), \"\");\n\n  csmFile = boost::filesystem::path(csmFile).replace_extension(suff + \".json\").string();\n\n  return csmFile;\n}\n\n// Manufacture an RPC state file from an adjust file. Use the .xml extension\n// for the output file.\nstd::string rpcAdjustedFile(std::string const& adjustFile) {\n\n  std::string rpcFile = adjustFile;\n\n  // If the suffix we want to add is already present, remove it first\n  std::string suff = \".adjusted_rpc\";\n  auto it = rpcFile.find(suff);\n  if (it != std::string::npos)\n    rpcFile.replace(it, suff.size(), \"\");\n\n  rpcFile = boost::filesystem::path(rpcFile).replace_extension(suff + \".xml\").string();\n  return rpcFile;\n}\n\n// Put the triangulated points in a vector. Update the cnet from the DEM,\n// if we have one.\nvoid formTriVec(std::vector<vw::Vector3> const& dem_xyz_vec,\n                bool have_dem,\n                double heights_from_dem_uncertainty,\n                // Outputs\n                vw::ba::ControlNetwork & cnet,\n                std::vector<double>    & orig_tri_points_vec,\n                std::vector<double>    & tri_points_vec) {\n\n  int num_tri_points = cnet.size();\n  if (num_tri_points == 0)\n    vw::vw_throw(ArgumentErr() << \"No triangulated ground points were found.\\n\");\n\n  orig_tri_points_vec.resize(num_tri_points*NUM_XYZ_PARAMS, 0.0);\n  tri_points_vec.resize(num_tri_points*NUM_XYZ_PARAMS, 0.0);\n\n  for (int ipt = 0; ipt < num_tri_points; ipt++) {\n    // We overwrite the triangulated point when we have an input DEM.\n    // It is instructive to examine the pointmap residual file to see\n    // what effect that has on residuals.  This point will likely try\n    // to move back somewhat to its triangulated position during\n    // optimization, depending on the strength of the weight which\n    // tries to keep it back in place.\n    Vector3 tri_point = cnet[ipt].position();\n\n    // The original triangulated point, before the override or optimization\n    for (int q = 0; q < NUM_XYZ_PARAMS; q++)\n      orig_tri_points_vec[ipt*NUM_XYZ_PARAMS + q] = tri_point[q];\n\n    bool is_gcp = (cnet[ipt].type() == vw::ba::ControlPoint::GroundControlPoint);\n\n    if (have_dem && dem_xyz_vec.at(ipt) != Vector3(0, 0, 0) && !is_gcp) {\n      tri_point = dem_xyz_vec.at(ipt);\n\n      // Update in the cnet too\n      cnet[ipt].set_position(Vector3(tri_point[0], tri_point[1], tri_point[2]));\n\n      // Ensure we can track it later\n      cnet[ipt].set_type(vw::ba::ControlPoint::PointFromDem);\n\n      // Set the uncertainty to the DEM uncertainty\n      double s = heights_from_dem_uncertainty;\n      if (s > 0)\n        cnet[ipt].set_sigma(Vector3(s, s, s));\n    }\n\n    for (int q = 0; q < NUM_XYZ_PARAMS; q++)\n      tri_points_vec[ipt*NUM_XYZ_PARAMS + q] = tri_point[q];\n  }\n  return;\n}\n\n// A function to do a moving average. The input vector can have nan where there \n// are no values. Have an option to to do this average only if needed to fill in.\n// TODO(oalexan1): If the logic in residualsPerRow() and supporting functionality\n// here is not useful, it may need to be wiped.\nvoid movingAverage(std::vector<double> & vec, int window_size, bool fill_only,\n                   bool & changed) {\n\n  changed = false;\n  int n = vec.size();\n\n  // Window must be odd and positive\n  if (window_size <= 0 || window_size % 2 == 0)\n    vw::vw_throw(vw::ArgumentErr()\n                 << \"Expecting a positive odd number for the moving average window size.\\n\");\n\n  int half_len = window_size / 2;\n\n  // Make a copy of the input\n  std::vector<double> vec_copy = vec; // deep copy\n\n  double nan = std::numeric_limits<double>::quiet_NaN();\n  for (int i = 0; i < n; i++) {\n\n    if (fill_only && !std::isnan(vec[i]))\n      continue; // no need to change this value\n\n    changed = true;\n\n    // Iterate over the window\n    double sum = 0.0, count = 0.0;\n    for (int win = -half_len; win <= half_len; win++) {\n      int ind = i + win;\n      if (ind < 0 || ind >= n)\n        continue; // out of bounds\n      if (std::isnan(vec_copy[ind]))\n        continue; // skip nan\n      sum += vec_copy[ind];\n      count++;\n    }\n    if (count > 0)\n      vec[i] = sum / count;\n    else\n      vec[i] = nan;\n  }\n\n  return;\n}\n\n// A function to strip all leading nan from vector. Do it in place.\nvoid stripLeadingNan(std::vector<double> & vec) {\n\n  int n = vec.size();\n  int first_good = 0;\n  for (int i = 0; i < n; i++) {\n    if (!std::isnan(vec[i])) {\n      first_good = i;\n      break;\n    }\n  }\n\n  if (first_good > 0) {\n    // Shift the vector\n    for (int i = first_good; i < n; i++)\n      vec[i - first_good] = vec[i];\n    // Resize\n    vec.resize(n - first_good);\n  }\n\n  return;\n}\n\n// Strip trailing nan from vector. Do it in place.\nvoid stripTrailingNan(std::vector<double> & vec) {\n\n  int n = vec.size();\n  int last_good = n - 1;\n  for (int i = n - 1; i >= 0; i--) {\n    if (!std::isnan(vec[i])) {\n      last_good = i;\n      break;\n    }\n  }\n\n  if (last_good < n - 1) {\n    // Resize\n    vec.resize(last_good + 1);\n  }\n\n  return;\n}\n\n// Average all y pixel residuals per row then fill in from neighbors. This is\n// useful for producing a jitter residual per image row, from which one may try\n// to study its power spectrum and dominant frequencies.\nvoid residualsPerRow(vw::ba::ControlNetwork const& cnet,\n                     asp::CRN const& crn,\n                     std::set<int> const& outliers,\n                     std::vector<std::string> const& image_files,\n                     std::vector<vw::CamPtr> const& camera_models,\n                     // Output\n                     std::vector<std::vector<double>> & residuals) {\n\n  int numImages = image_files.size();\n\n  // Sanity check\n  if ((int)camera_models.size() != numImages || (int)crn.size() != numImages)\n    vw_throw(ArgumentErr()\n            << \"Number of imgages, of cameras, and control network sizes do not match.\\n\");\n\n  // Wipe the output\n  residuals.clear();\n  residuals.resize(numImages);\n\n  for (int icam = 0; icam < (int)crn.size(); icam++) {\n\n    vw::Vector2 dims = vw::file_image_size(image_files[icam]);\n    int numLines = dims[1];\n    residuals[icam].resize(numLines, 0.0);\n\n    std::vector<double> count(numLines, 0.0);\n    double nan = std::numeric_limits<double>::quiet_NaN();\n\n    for (auto const& feature_ptr: crn[icam]) {\n\n      // The index of the 3D point\n      int ipt = feature_ptr->m_point_id;\n\n      if (cnet[ipt].type() == vw::ba::ControlPoint::GroundControlPoint)\n        continue; // Skip GCP\n\n      if (outliers.find(ipt) != outliers.end())\n        continue; // Skip outliers\n\n      // The observed value for the projection of point with index ipt into\n      // the camera with index icam.\n      Vector2 observation = feature_ptr->m_location;\n\n      // Ideally this point projects back to the pixel observation, so use the\n      // triangulated position as initial guess.\n      Vector3 xyz = cnet[ipt].position();\n\n      if (xyz == Vector3(0, 0, 0))\n        continue; // Skip outliers\n\n      // Project into the camera\n      vw::Vector2 pix = camera_models[icam]->point_to_pixel(xyz);\n\n      // Image row\n      int row = round(observation[1]);\n      if (row < 0 || row > numLines - 1)\n        continue; // out of bounds\n\n      // Accumulate the residual\n      residuals[icam][row] += (pix[1] - observation[1]);\n      count[row] += 1.0;\n    } // end loop over features\n\n    // Average the residuals. Put naN where there is no data\n    for (int row = 0; row < numLines; row++) {\n      if (count[row] > 0)\n        residuals[icam][row] /= count[row];\n      else\n        residuals[icam][row] = nan;\n    }\n\n    // Do a moving average with a length of 11\n    bool fill_only = false;\n    bool changed = false;\n    int window_size = 11;\n    movingAverage(residuals[icam], window_size, fill_only, changed);\n\n    // Strip leading and trailing nan. There can be plenty because of\n    // lack of features there.\n    stripLeadingNan(residuals[icam]);\n    stripTrailingNan(residuals[icam]);\n\n    // Now continue doing this only to fill in missing values\n    fill_only = true;\n    int attempts = 0;\n    while (changed) {\n      movingAverage(residuals[icam], window_size, fill_only, changed);\n      attempts++;\n      // Throw an error after 10 attempts\n      if (attempts > 10) {\n        vw::vw_out() << \"No luck after attempts: \" << icam << \" \" << attempts << \"\\n\";\n        break;\n      }\n    }\n\n  } // end loop over cameras\n\n  return;\n} // end function residualsPerRow\n\n// Save the control network in GCP format using optimized positions from\n// param_storage, filtering outliers. For GCP, use the original position\n// from the cnet. For other points, use the optimized position from\n// param_storage. Includes GCP. For bundle_adjust.\nvoid saveCnetAsGcp(vw::ba::ControlNetwork const& cnet,\n                   asp::BaParams const& param_storage,\n                   vw::cartography::Datum const& datum,\n                   std::vector<std::string> const& image_files,\n                   std::string const& filename) {\n\n  std::vector<asp::Gcp> gcp_vec;\n  for (int ipt = 0; ipt < (int)cnet.size(); ipt++) {\n    if (param_storage.get_point_outlier(ipt))\n      continue;\n    asp::Gcp gcp;\n    gcp.cp = cnet[ipt];\n    bool is_gcp =\n      (cnet[ipt].type() == vw::ba::ControlPoint::GroundControlPoint);\n    vw::Vector3 xyz = is_gcp ? cnet[ipt].position()\n                             : param_storage.get_point(ipt);\n    gcp.llh = datum.cartesian_to_geodetic(xyz);\n    gcp.sigma = cnet[ipt].sigma();\n    gcp_vec.push_back(gcp);\n  }\n\n  vw::cartography::GeoReference georef(datum);\n  bool ignore_pixel_sigma = false;\n  asp::writeGcp(filename, georef, gcp_vec, image_files, ignore_pixel_sigma);\n}\n\n// Save the control network in GCP format using optimized positions from\n// tri_points_vec, filtering outliers. For GCP, use the original position\n// from the cnet. For other points, use the optimized position from\n// tri_points_vec. Includes GCP. For jitter_solve.\nvoid saveCnetAsGcp(vw::ba::ControlNetwork const& cnet,\n                   std::vector<double> const& tri_points_vec,\n                   std::set<int> const& outliers,\n                   vw::cartography::Datum const& datum,\n                   std::vector<std::string> const& image_files,\n                   std::string const& filename) {\n\n  int num_points = (int)cnet.size();\n  if ((int)tri_points_vec.size() < num_points * NUM_XYZ_PARAMS)\n    vw_throw(ArgumentErr()\n             << \"saveCnetAsGcp: tri_points_vec too small for cnet.\\n\");\n\n  std::vector<asp::Gcp> gcp_vec;\n  for (int ipt = 0; ipt < num_points; ipt++) {\n    if (outliers.find(ipt) != outliers.end())\n      continue;\n    asp::Gcp gcp;\n    gcp.cp = cnet[ipt];\n    bool is_gcp =\n      (cnet[ipt].type() == vw::ba::ControlPoint::GroundControlPoint);\n    vw::Vector3 xyz;\n    if (is_gcp) {\n      xyz = cnet[ipt].position();\n    } else {\n      for (int k = 0; k < NUM_XYZ_PARAMS; k++)\n        xyz[k] = tri_points_vec[ipt * NUM_XYZ_PARAMS + k];\n    }\n    gcp.llh = datum.cartesian_to_geodetic(xyz);\n    gcp.sigma = cnet[ipt].sigma();\n    gcp_vec.push_back(gcp);\n  }\n\n  vw::cartography::GeoReference georef(datum);\n  bool ignore_pixel_sigma = false;\n  asp::writeGcp(filename, georef, gcp_vec, image_files, ignore_pixel_sigma);\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Core/BundleAdjustUtils.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file BundleAdjustUtils.h\n///\n\n#ifndef __BUNDLE_ADJUST_UTILS_H__\n#define __BUNDLE_ADJUST_UTILS_H__\n\n#include <vw/Math/Vector.h>\n#include <vw/Math/Quaternion.h>\n#include <vw/Math/BBox.h>\n#include <vw/Camera/CameraModel.h>\n#include <vw/BundleAdjustment/CameraRelation.h>\n\n#include <map>\n#include <set>\n#include <string>\n#include <vector>\n\n#include <boost/smart_ptr/shared_ptr.hpp>\n\n// Forward declarations\nnamespace vw {\n\n  namespace cartography {\n    class Datum;\n    class GeoReference;\n  }\n\n  namespace geometry {\n    class dPoly;\n  }\n  \n  template<typename PixelT>\n  class ImageViewRef;\n\n  template<typename PixelT>\n  class PixelMask;\n}\n\nnamespace asp {\n\nclass BaParams;\n\nconst int NUM_XYZ_PARAMS  = 3;\nconst int NUM_QUAT_PARAMS = 4;\nconst int PIXEL_SIZE      = 2;\n\ntypedef vw::ba::CameraRelationNetwork<vw::ba::JFeature> CRN;\n  \n// Compute the camera footprint polygon shape and its bounding box. Used a\n// cached result if available. Cache the current result if computed.\nvoid camera_footprint(std::string const& dem_file,\n                      std::string const& image_file,\n                      vw::CamPtr  const& camera_model,\n                      std::string const& out_prefix,\n                      // Outputs\n                      vw::geometry::dPoly & footprint,\n                      vw::BBox2 & footprint_bbox);\n\n// Determine which camera images overlap by finding the lon-lat\n// bounding boxes of their footprints given the specified DEM, expand\n// them by a given percentage, and see if those intersect. A higher\n// percentage should be used when there is more uncertainty in input\n// camera poses. Specify as: 'dem.tif 15'.\nvoid buildOverlapList(std::string const& out_prefix,\n                      std::string const& dem_file,\n                      double pct_for_overlap,\n                      int overlap_limit,\n                      bool match_first_to_last,\n                      std::vector<std::string> const& image_files,\n                      std::vector<vw::CamPtr> const& camera_models,\n                      std::set<std::pair<std::string, std::string>> & overlap_list);\n\n/// Ensure that no images, camera files, or adjustment names are duplicate.\n/// That will cause the output files to overwrite each other!\nvoid check_for_duplicates(std::vector<std::string> const& image_files,\n                          std::vector<std::string> const& camera_files,\n                          std::string const& out_prefix);\n\n// Shoot rays from all matching interest points. Intersect those with a DEM. Find\n// their average. Project it vertically onto the DEM. Invalid or uncomputable\n// xyz are set to the zero vector.\nvoid updateTriPtsFromDem(vw::ba::ControlNetwork const& cnet,\n                         std::set<int> const& outliers,\n                         std::vector<vw::CamPtr> const& camera_models,\n                         vw::cartography::GeoReference const& dem_georef,\n                         vw::ImageViewRef<vw::PixelMask<double>> const& masked_dem,\n                         // Output\n                         std::vector<vw::Vector3> & dem_xyz_vec);\n\n// Given an xyz point in ECEF coordinates, update its height above datum by\n// interpolating into a DEM. The input must already be prepared for\n// interpolation. The user must check the return status.\nbool updatePointHeightFromDem(vw::cartography::GeoReference const& dem_georef,\n                              vw::ImageViewRef<vw::PixelMask<double>> const& interp_dem,\n                              // Output\n                              vw::Vector3 & xyz);\n\n// Flag outliers by reprojection error with input cameras. This assumes that\n// the input cameras are pretty accurate.\nvoid flag_initial_outliers(vw::ba::ControlNetwork const& cnet,\n                            asp::CRN const& crn,\n                            std::vector<vw::CamPtr> const& camera_models,\n                            double max_init_reproj_error,\n                            // Output\n                            std::set<int> & outliers);\n\n// Manufacture a CSM state file from an adjust file\nstd::string csmStateFile(std::string const& adjustFile);\n\n// Manufacture an RPC state file from an adjust file\nstd::string rpcAdjustedFile(std::string const& adjustFile);\n\n// Put the triangulated points in a vector. Update the cnet from the DEM,\n// if we have one. Set the sigma for DEM-constrained points.\nvoid formTriVec(std::vector<vw::Vector3> const& dem_xyz_vec,\n                bool have_dem,\n                double heights_from_dem_uncertainty,\n                // Outputs\n                vw::ba::ControlNetwork & cnet,\n                std::vector<double>    & orig_tri_points_vec,\n                std::vector<double>    & tri_points_vec);\n\n// Average all y pixel residuals per row then fill in from neighbors \nvoid residualsPerRow(vw::ba::ControlNetwork const& cnet,\n                     asp::CRN const& crn,\n                     std::set<int> const& outliers,\n                     std::vector<std::string> const& image_files,\n                     std::vector<vw::CamPtr> const& camera_models,\n                     // Output\n                     std::vector<std::vector<double>> & residuals);\n\n\n// Save the control network in GCP format using optimized positions from\n// param_storage, filtering outliers. Includes GCP. For bundle_adjust.\nvoid saveCnetAsGcp(vw::ba::ControlNetwork const& cnet,\n                   asp::BaParams const& param_storage,\n                   vw::cartography::Datum const& datum,\n                   std::vector<std::string> const& image_files,\n                   std::string const& filename);\n\n// Save the control network in GCP format using optimized positions from\n// tri_points_vec, filtering outliers. Includes GCP. For jitter_solve.\nvoid saveCnetAsGcp(vw::ba::ControlNetwork const& cnet,\n                   std::vector<double> const& tri_points_vec,\n                   std::set<int> const& outliers,\n                   vw::cartography::Datum const& datum,\n                   std::vector<std::string> const& image_files,\n                   std::string const& filename);\n\n} // end namespace asp\n\n#endif // __BUNDLE_ADJUST_UTILS_H__\n"
  },
  {
    "path": "src/asp/Core/CMakeLists.txt",
    "content": "# Use wrapper function at this level to avoid code duplication\nadd_library_wrapper(AspCore \"${ASP_CORE_SRC_FILES}\" \"${ASP_CORE_TEST_FILES}\" \"${ASP_CORE_LIB_DEPENDENCIES}\")\n"
  },
  {
    "path": "src/asp/Core/CamPoseUtils.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Very low-level functions used in sat_sim.cc and jitter_solve.cc. \n\n#include <asp/Core/CamPoseUtils.h>\n#include <vw/Cartography/GeoReference.h>\n#include <vw/Cartography/GeoReferenceBaseUtils.h>\n#include <vw/Cartography/GeoReferenceUtils.h>\n\nusing namespace vw::cartography;\n\nnamespace asp {\n\n// A small number to help convert directions from being in projected space to\n// ECEF (the transform between these is nonlinear). Do not use a small value,\n// as in ECEF these will be large numbers and we may have precision issues.\n// The value 0.01 was tested well. Measured in meters.\ndouble satSimDelta() { \n  return 0.01;\n}\n\n// Assemble the cam2world matrix from the along track, across track, and down vectors\n// Note how we swap the first two columns and flip one sign. We went the along\n// direction to be the camera y direction\nvoid assembleCam2WorldMatrix(vw::Vector3 const& along, \n                             vw::Vector3 const& across, \n                             vw::Vector3 const& down,\n                             // Output\n                             vw::Matrix3x3 & cam2world) {\n\n  for (int row = 0; row < 3; row++) {\n    cam2world(row, 0) = along[row];\n    cam2world(row, 1) = across[row];\n    cam2world(row, 2) = down[row];\n  }\n return;\n}\n\n// Given two end points in projected coordinates determining a satellite \n// trajectory, find the along and across vectors in projected coordinates.\nvoid calcProjAlongAcross(vw::Vector3 const& first_proj,\n                         vw::Vector3 const& last_proj,\n                         vw::Vector3      & proj_along,\n                         vw::Vector3      & proj_across) {\n\n  proj_along = last_proj - first_proj;\n  \n  // Sanity check. \n  if (proj_along == vw::Vector3())\n    vw::vw_throw(vw::ArgumentErr()\n       << \"The first and last camera positions are the same. It is not possible find the camera orientation. Specify at the very least two positions that are close but distinct.\\n\");\n\n  // Normalize\n  proj_along = proj_along / norm_2(proj_along);\n  \n  // Find the across-track direction, parallel to the ground, in projected coords\n  proj_across = vw::math::cross_prod(proj_along, vw::Vector3(0, 0, 1));\n  proj_across = proj_across / norm_2(proj_across);\n}\n\n// Make these vectors have norm 1, and make across perpendicular to along\nvoid normalizeOrthogonalizeAlongAcross(vw::Vector3 & along, vw::Vector3 & across) {\n    \n  // Normalize\n  along = along / norm_2(along);\n  across = across / norm_2(across);\n\n  // Ensure that across is perpendicular to along\n  across = across - dot_prod(along, across) * along;\n\n  // Normalize again\n  across = across / norm_2(across);\n}\n\n// Find normalized along and across directions in ECEF given these values in\n// projected coordinates. Use centered difference to compute the along and\n// across track points This achieves higher quality results.\nvoid calcEcefAlongAcross(vw::cartography::GeoReference const& dem_georef,\n                         double delta,\n                         vw::Vector3 const& proj_along,\n                         vw::Vector3 const& proj_across,\n                         vw::Vector3 const& proj_pt,\n                         // Outputs\n                         vw::Vector3 & along,\n                         vw::Vector3 & across) {\n\n  // Check if proj_along and proj_across are perpendicular and have norm 1\n  double dot = dot_prod(proj_along, proj_across);\n  if (std::abs(dot) > 1e-6) \n    vw::vw_throw(vw::ArgumentErr()\n      << \"calcEcefAlongAcross: proj_along and proj_across are not perpendicular.\\n\");\n  if (std::abs(norm_2(proj_along)  - 1.0) > 1e-6 || \n      std::abs(norm_2(proj_across) - 1.0) > 1e-6) \n    vw::vw_throw(vw::ArgumentErr()\n      << \"calcEcefAlongAcross: either proj_along or proj_across does not have norm 1.\\n\");\n\n  vw::Vector3 L1 = proj_pt - delta * proj_along; // along track point\n  vw::Vector3 C1 = proj_pt - delta * proj_across; // across track point\n  vw::Vector3 L2 = proj_pt + delta * proj_along; // along track point\n  vw::Vector3 C2 = proj_pt + delta * proj_across; // across track point\n\n  // Convert to cartesian\n  L1 = vw::cartography::projToEcef(dem_georef, L1);\n  C1 = vw::cartography::projToEcef(dem_georef, C1);\n  L2 = vw::cartography::projToEcef(dem_georef, L2);\n  C2 = vw::cartography::projToEcef(dem_georef, C2);\n\n  // Create the along track and across track vectors\n  along  = L2 - L1;\n  across = C2 - C1;\n\n  // Make these vector have norm 1, and make across perpendicular to along\n  asp::normalizeOrthogonalizeAlongAcross(along, across);\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Core/CamPoseUtils.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file CamPoseUtils.h\n\n// Very low-level functions used in sat_sim.cc and jitter_solve.cc. \n\n#ifndef __ASP_CORE_CAM_POSE_UTILS_H__\n#define __ASP_CORE_CAM_POSE_UTILS_H__\n\n#include <vw/Math/Vector.h>\n#include <vw/Math/Matrix.h>\n\nnamespace vw { namespace cartography {\n  class GeoReference;\n}}\n\nnamespace asp {\n\n// A small number to help convert directions from being in projected space to\n// ECEF (the transform between these is nonlinear). Do not use a small value,\n// as in ECEF these will be large numbers and we may have precision issues.\n// The value 0.01 was tested well. Measured in meters.\ndouble satSimDelta();\n\n// Assemble the cam2world matrix from the along track, across track, and down vectors\n// Note how we swap the first two columns and flip one sign. We went the along\n// direction to be the camera y direction\nvoid assembleCam2WorldMatrix(vw::Vector3 const& along, \n                            vw::Vector3 const& across, \n                            vw::Vector3 const& down,\n                            // Output\n                            vw::Matrix3x3 & cam2world);\n\n// Make these vectors have norm 1, and make across perpendicular to along\nvoid normalizeOrthogonalizeAlongAcross(vw::Vector3 & along, vw::Vector3 & across);\n\n// Given two end points in projected coordinates determining a satellite \n// trajectory, find the along and across vectors in projected coordinates.\nvoid calcProjAlongAcross(vw::Vector3 const& first_proj,\n                         vw::Vector3 const& last_proj,\n                         vw::Vector3      & proj_along,\n                         vw::Vector3      & proj_across);\n\n// Find normalized along and across directions in ECEF given these values in\n// projected coordinates. Use centered difference to compute the along and\n// across track points This achieves higher quality results.\nvoid calcEcefAlongAcross(vw::cartography::GeoReference const& dem_georef,\n                         double delta,\n                         vw::Vector3 const& proj_along,\n                         vw::Vector3 const& proj_across,\n                         vw::Vector3 const& proj_pt,\n                         // Outputs\n                         vw::Vector3 & along,\n                         vw::Vector3 & across);\n\n} // end namespace asp\n\n#endif//__ASP_CORE_CAM_POSE_UTILS_H__\n"
  },
  {
    "path": "src/asp/Core/CameraTransforms.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file CameraTransforms.cc\n\n#include <asp/Core/CameraTransforms.h>\n\n#include <Eigen/Dense>\n#include <Eigen/Geometry>\n\nnamespace asp {\n\n// Return the matrix of rotation in the xy plane, from camera to satellite body\nvw::Matrix3x3 rotationXY() {\n\n  vw::Matrix3x3 T;\n  // Set all elements to zero\n  for (int row = 0; row < 3; row++)\n    for (int col = 0; col < 3; col++)\n      T(row, col) = 0.0;\n  \n  T(0, 1) = -1;\n  T(1, 0) = 1;\n  T(2, 2) = 1;\n\n  return T;\n}\n\n// A function to convert a 3x3 VW matrix to Eigen\nEigen::Matrix3d vwToEigenMat(vw::Matrix3x3 const& m) {\n  Eigen::Matrix3d result;\n  for (int r = 0; r < 3; r++)\n    for (int c = 0; c < 3; c++)\n      result(r, c) = m(r, c);\n  return result;\n}\n\n// Convert an Eigen 3x3 matrix to a VW 3x3 matrix\nvw::Matrix3x3 eigenToVwMat(Eigen::Matrix3d const& m) {\n  vw::Matrix3x3 result;\n  for (int r = 0; r < 3; r++)\n    for (int c = 0; c < 3; c++)\n      result(r, c) = m(r, c);\n  return result;\n}\n\n// A function to go from a VW matrix to a quaternion, represented\n// as four values, x, y, z, w. Care with the order of values. It is not\n// w, x, y, z as in the Eigen convention.\nvoid matrixToQuaternion(vw::Matrix3x3 const& R, \n                         // Outputs\n                         double & x, double & y, double & z, double & w) {\n\n    // Convert to Eigen3\n    Eigen::Matrix3d M = vwToEigenMat(R);\n    // Convert to quaternion\n    Eigen::Quaterniond q(M);\n    // Convert to x, y, z, w\n    x = q.x(); y = q.y(); z = q.z(); w = q.w();\n}\n\n// A function to convert a quaternion given by 4 numbers to a VW matrix. It is\n// very important to note that were we assume the order of the quaternion\n// numbers is (x, y, z, w) and not (w, x, y, z).\nvw::Matrix3x3 quaternionToMatrix(double const* q) {\n  Eigen::Quaterniond eq;\n  eq.x() = q[0];\n  eq.y() = q[1];\n  eq.z() = q[2];\n  eq.w() = q[3];\n  // Normalize it\n  eq.normalize();\n  Eigen::Matrix3d m = eq.toRotationMatrix();\n\n  // Convert to vw::Matrix3x3\n  return eigenToVwMat(m);\n}\n\n// Find the roll-pitch-yaw rotation in ZYX order. The inputs are in\n// degrees.\nvw::Matrix3x3 rollPitchYaw(double roll, double pitch, double yaw) {\n\n    // Factor to convert from degrees to radians\n    const double DEG_TO_RAD = M_PI/180.0;\n\n    Eigen::AngleAxisd rollAngle (DEG_TO_RAD * roll,  Eigen::Vector3d::UnitX());\n    Eigen::AngleAxisd pitchAngle(DEG_TO_RAD * pitch, Eigen::Vector3d::UnitY());\n    Eigen::AngleAxisd yawAngle  (DEG_TO_RAD * yaw,   Eigen::Vector3d::UnitZ());\n\n    // Multiply these returning an Eigen Matrix3d\n    Eigen::Quaterniond q = yawAngle * pitchAngle * rollAngle;\n\n    // Convert to Eigen3\n    Eigen::Matrix3d M = q.matrix();\n\n    // Convert to vw::Matrix3x3\n    vw::Matrix3x3 R = eigenToVwMat(M);\n    \n    return R;\n}\n    \n// Given a matrix obtained by multiplying roll, pitch, and yaw rotations, by applying\n// then in this order from right to left, find the roll, pitch, and yaw angles in degrees.\n// This can return 180 +/- x, if x was the original angle, so it is not a true inverse.\nvoid rollPitchYawFromRotationMatrix(vw::Matrix3x3 const& R, \n  // Outputs\n  double & roll, double & pitch, double & yaw) {\n\n    // Convert to Eigen3 and then find the Euler angles in radians\n    Eigen::Matrix3d M = vwToEigenMat(R);\n    Eigen::Vector3d euler = M.eulerAngles(2, 1, 0);\n\n    // Convert to degrees\n    roll  = euler[2]*180.0/M_PI;\n    pitch = euler[1]*180.0/M_PI;\n    yaw   = euler[0]*180.0/M_PI;\n}\n\n} //end namespace asp\n\n"
  },
  {
    "path": "src/asp/Core/CameraTransforms.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#ifndef __CORE_CAMERA_TRANSFORMS_H__\n#define __CORE_CAMERA_TRANSFORMS_H__\n#include <vw/Math/Matrix.h>\n\n// TODO(oalexan1): Rename this to EigenCameraTransforms.h. \n\n// Do not include Eigen headers here, as that will slow down the compilation.\n\n// A set of routines for handling camera transformations. It is best to not\n// include here any Eigen headers, as that will slow down the compilation.\n\nnamespace asp {\n\n// Return the matrix of rotation in the xy plane, from camera to satellite body\nvw::Matrix3x3 rotationXY();\n\n// Find the roll-pitch-yaw rotation in ZYX order. The inputs are in\n// degrees.\nvw::Matrix3x3 rollPitchYaw(double roll, double pitch, double yaw);\n\n// A function to go from a VW matrix to a quaternion, represented\n// as four values, x, y, z, w. Care with the order of values. It is not\n// w, x, y, z as in the Eigen convention.\nvoid matrixToQuaternion(vw::Matrix3x3 const& R, \n                         // Outputs\n                         double & x, double & y, double & z, double & w);\n\n// Given a matrix obtained by multiplying roll, pitch, and yaw rotations, by applying\n// then in this order from right to left, find the roll, pitch, and yaw angles in degrees.\n// This can return 180 +/- x, if x was the original angle, so it is not a true inverse.\nvoid rollPitchYawFromRotationMatrix(vw::Matrix3x3 const& R, \n  // Outputs\n  double & roll, double & pitch, double & yaw);\n\n// A function to convert a quaternion given by 4 numbers in x, y, z, w order \n// to a VW matrix.\nvw::Matrix3x3 quaternionToMatrix(double const* q);\n\n} //end namespace asp\n\n#endif//__CORE_CAMERA_TRANSFORMS_H__\n"
  },
  {
    "path": "src/asp/Core/CartographyUtils.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Core/CartographyUtils.h>\n\n#include <vw/Cartography/Utm.h>\n\n#include <cmath>\n\nnamespace asp {\n\n// Auto-compute a local projection. It is assumed that the datum is known.\n// For Earth, use UTM or polar stereographic. For other datums, use\n// local stereographic.\nvoid setAutoProj(double lat, double lon,\n                 vw::cartography::GeoReference & output_georef) {\n\n  vw::cartography::Datum datum = output_georef.datum();\n  if (datum.name().find(\"WGS_1984\") != std::string::npos) {\n\n    vw::cartography::Datum user_datum = output_georef.datum();\n    if (lat > 84)\n      output_georef.set_proj4_projection_str(\"+proj=stere +lat_0=90 +lat_ts=70 +lon_0=-45 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs\");\n    else if (lat < -80)\n      output_georef.set_proj4_projection_str(\"+proj=stere +lat_0=-90 +lat_ts=-70 +lon_0=0 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs\");\n    else\n     output_georef.set_UTM(vw::cartography::getUTMZone(lat, lon));\n\n  } else {\n    output_georef.set_stereographic(lat, lon, 1, 0, 0);\n  }\n\n  return;\n}\n\n// Snap the coordinates of a BBox2 to a grid spacing. Use floor for min\n// and ceil for max, so the box always covers at least the original extent.\nvoid snapBBox2ToGrid(vw::BBox2 &bbox, double spacing) {\n  bbox.min() = spacing * floor(bbox.min() / spacing);\n  bbox.max() = spacing * ceil(bbox.max() / spacing);\n}\n\n// Same as above but for BBox3. The z component is also snapped.\nvoid snapBBox3ToGrid(vw::BBox3 &bbox, double spacing) {\n  bbox.min() = spacing * floor(bbox.min() / spacing);\n  bbox.max() = spacing * ceil(bbox.max() / spacing);\n}\n\n} //end namespace asp\n"
  },
  {
    "path": "src/asp/Core/CartographyUtils.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#ifndef __CORE_CARTOGRAPHY_UTILS_H__\n#define __CORE_CARTOGRAPHY_UTILS_H__\n\n#include <vw/Cartography/GeoReference.h>\n#include <vw/Math/BBox.h>\n\n#include <string>\n\nnamespace asp {\n\n// Auto-compute a local projection. It is assumed that the datum is known.\n// For Earth, use UTM or polar stereographic. For other datums, use\n// local stereographic.\nvoid setAutoProj(double lat, double lon,\n                 vw::cartography::GeoReference & output_georef);\n\n// Snap a BBox2 to a grid: floor on min, ceil on max. This ensures the box\n// covers at least the original extent with corners at integer multiples of\n// the grid spacing.\nvoid snapBBox2ToGrid(vw::BBox2 &bbox, double spacing);\n\n// Same as snapBBox2ToGrid but for BBox3. The z component is also snapped.\nvoid snapBBox3ToGrid(vw::BBox3 &bbox, double spacing);\n\n} //end namespace asp\n\n#endif // __CORE_CARTOGRAPHY_UTILS_H__\n"
  },
  {
    "path": "src/asp/Core/DataLoader.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file DataLoader.cc\n///\n\n#include <asp/Core/DataLoader.h>\n#include <asp/Core/EigenUtils.h>\n#include <asp/Core/PointUtils.h>\n\nusing namespace vw;\n\nnamespace asp {\n\nvoid load_csv_or_dem(std::string const& csv_format_str, std::string const& csv_srs_str,\n                     std::string const& reference_terrain,\n                     int max_num_reference_points,\n                     vw::cartography::GeoReference & geo, // may change\n                     // Outputs\n                     std::vector<vw::Vector3> & ref_data) {\n  \n  // Wipe the output\n  ref_data.clear();\n  \n  asp::CsvConv csv_conv;\n  csv_conv.parse_csv_format(csv_format_str, csv_srs_str);\n  csv_conv.parse_georef(geo);\n  \n  vw::BBox2 lonlat_box; // not used\n  bool      calc_shift = false;\n  Vector3   shift; // must be set to 0\n  bool      is_lola_rdr_format;\n  double    mean_longitude;\n  bool      verbose = true;\n  Eigen::MatrixXd data;\n  \n  // Read the reference terrain\n  vw_out() << \"Loading at most \" << max_num_reference_points << \" points from \"\n           << reference_terrain << std::endl;\n  std::string file_type = asp::get_cloud_type(reference_terrain);\n  if (file_type == \"DEM\") \n    asp::load_dem(reference_terrain,  \n                  max_num_reference_points, lonlat_box,  \n                  calc_shift, shift, verbose, data);\n  \n  else if (file_type == \"CSV\")\n    asp::load_csv(reference_terrain,  max_num_reference_points,\n                  lonlat_box, calc_shift, shift, geo,  \n                    csv_conv, is_lola_rdr_format, mean_longitude, verbose,  \n                  data);\n  else\n    vw_throw(ArgumentErr() << \"Unsupported file: \" << reference_terrain << \" of type \"\n             << file_type << \".\\n\");\n\n  int num_cols = data.cols();\n  ref_data.clear();\n  for (int data_col = 0; data_col < num_cols; data_col++) {\n    vw::Vector3 reference_xyz;\n\n    for (int row = 0; row < asp::DIM; row++)\n      reference_xyz[row] = data(row, data_col);\n\n    ref_data.push_back(reference_xyz);\n  }\n  \n}\n  \n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Core/DataLoader.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file DataLoader.h\n///\n\n// Keep here some logic for handling data which depends on Eigen\n// to speed up compilation of bundle_adjust.\n\n#ifndef __ASP_CORE_DATA_LOADER_H__\n#define __ASP_CORE_DATA_LOADER_H__\n\n#include <vector>\n#include <string>\n#include <vw/Math/Vector.h>\n\nnamespace vw {\n  namespace cartography {\n    class GeoReference;\n  }\n}\n\nnamespace asp {\nvoid load_csv_or_dem(std::string const& csv_format_str, std::string const& csv_srs,\n                     std::string const& reference_terrain,\n                     int max_num_reference_points,\n                     vw::cartography::GeoReference & geo, // may change\n                     // Outputs\n                     std::vector<vw::Vector3> & ref_data);\n}\n\n#endif // __ASP_CORE_DATA_LOADER_H__\n"
  },
  {
    "path": "src/asp/Core/DemDisparity.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// \\file DEMDisparity.cc\n\n// Estimate the low-resolution disparity based on cameras and a DEM.\n\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/DemDisparity.h>\n\n#include <vw/Image/ImageView.h>\n#include <vw/Image/Transform.h>\n#include <vw/Image/MaskViews.h>\n#include <vw/FileIO/DiskImageView.h>\n#include <vw/Camera/CameraModel.h>\n#include <vw/Cartography/CameraBBox.h>\n#include <vw/Cartography/GeoReferenceUtils.h>\n#include <vw/Stereo/DisparityMap.h>\n#include <vw/FileIO/MatrixIO.h>\n#include <vw/Cartography/Map2CamTrans.h>\n#include <vw/Core/Stopwatch.h>\n#include <vw/Image/AlgorithmFunctions.h>\n\n#include <boost/filesystem/operations.hpp>\n#include <boost/smart_ptr/shared_ptr.hpp>\nnamespace fs = boost::filesystem;\n\nusing namespace vw;\nusing namespace vw::cartography;\n\nnamespace asp {\n\n// Take a low-res pixel. Make it full res. Undo the transform. Intersect with the DEM.\n// Return true on success. This is used twice. It is templated so that it can be called\n// for both ImageViewRef and ImageView.\ntemplate <class DEMImageT>\ninline bool \nlowResPixToDemXyz(Vector2 const& left_lowres_pix,\n                  vw::Vector2f const& downsample_scale,\n                  vw::TransformPtr tx_left,\n                  vw::CamPtr left_camera_model,\n                  double dem_error, GeoReference const& dem_georef,\n                  DEMImageT & dem,\n                  double height_guess,\n                  // Outputs\n                  vw::Vector3 & left_camera_vec, Vector3 & prev_xyz, Vector3 & xyz) {\n  \n  // Calc the full-res pixel  \n  Vector2 left_fullres_pix = elem_quot(left_lowres_pix, downsample_scale);\n  left_fullres_pix = tx_left->reverse(left_fullres_pix);\n  \n  bool has_intersection = false;\n  Vector3 left_camera_ctr;\n  try {\n    left_camera_ctr = left_camera_model->camera_center(left_fullres_pix);\n    left_camera_vec = left_camera_model->pixel_to_vector(left_fullres_pix);\n  } catch (...) {\n    return false;\n  }\n  \n  double height_error_tol = 1e-3; // abs height error\n  double max_abs_tol      = 1e-14; // abs cost function change\n  double max_rel_tol      = 1e-14; // rel cost function change\n  int    num_max_iter     = 50;\n  bool   treat_nodata_as_zero = false;\n  xyz = camera_pixel_to_dem_xyz(left_camera_ctr, left_camera_vec,\n                                dem, dem_georef,\n                                treat_nodata_as_zero,\n                                has_intersection,\n                                height_error_tol, max_abs_tol,\n                                max_rel_tol, num_max_iter,\n                                prev_xyz, height_guess);\n  if (!has_intersection || xyz == Vector3()) \n    return false;\n  \n  // Update the previous guess  \n  prev_xyz = xyz;\n  \n  return true;\n}\n\ntypedef ImageViewRef<PixelGray<float>> ImgRefT;\n\nclass DemDisparity: public ImageViewBase<DemDisparity> {\n  ImgRefT           m_left_image;\n  double            m_dem_error;\n  GeoReference      m_dem_georef;\n  ImageViewRef<PixelMask<float>> m_dem;\n  Vector2f          m_downsample_scale;\n  vw::TransformPtr  m_tx_left, m_tx_right;\n  boost::shared_ptr<camera::CameraModel> m_left_camera_model;\n  boost::shared_ptr<camera::CameraModel> m_right_camera_model;\n  int               m_pixel_sample;\n  ImageView<PixelMask<Vector2f>> & m_disp_spread;\n  double m_height_guess;\n\npublic:\n\nDemDisparity(ImgRefT const& left_image,\n              double dem_error, GeoReference dem_georef,\n              ImageViewRef<PixelMask<float>> const& dem,\n              Vector2f const& downsample_scale,\n              vw::TransformPtr tx_left, vw::TransformPtr tx_right, \n              boost::shared_ptr<camera::CameraModel> left_camera_model,\n              boost::shared_ptr<camera::CameraModel> right_camera_model,\n              int pixel_sample, ImageView<PixelMask<Vector2f>> & disp_spread):\n    m_left_image(left_image.impl()),\n    m_dem_error(dem_error),\n    m_dem_georef(dem_georef),\n    m_dem(dem),\n    m_downsample_scale(downsample_scale),\n    m_tx_left(tx_left), m_tx_right(tx_right),\n    m_left_camera_model(left_camera_model),\n    m_right_camera_model(right_camera_model),\n    m_pixel_sample(pixel_sample),\n    m_disp_spread(disp_spread) {\n\n  // This can speed up and make more reliable the intersection of rays with the DEM\n  m_height_guess = vw::cartography::demHeightGuess(m_dem);\n}\n\n// ImageView interface\ntypedef PixelMask<Vector2f> pixel_type;\ntypedef pixel_type result_type;\ntypedef ProceduralPixelAccessor<DemDisparity> pixel_accessor;\n\ninline int32 cols  () const { return m_left_image.cols(); }\ninline int32 rows  () const { return m_left_image.rows(); }\ninline int32 planes() const { return 1; }\n\ninline pixel_accessor origin() const { return pixel_accessor(*this, 0, 0); }\n\ninline pixel_type operator()(double /*i*/, double /*j*/, int32 /*p*/ = 0) const {\n  vw_throw(NoImplErr() << \"DemDisparity::operator()(...) is not implemented.\\n\");\n  return pixel_type();\n}\n\ntypedef CropView<ImageView<pixel_type>> prerasterize_type;\ninline prerasterize_type prerasterize(BBox2i const& bbox) const {\n  \n  prerasterize_type lowres_disparity \n    = prerasterize_type(ImageView<pixel_type>(bbox.width(), bbox.height()),\n                        -bbox.min().x(), -bbox.min().y(), cols(), rows());\n\n  for (int row = bbox.min().y(); row < bbox.max().y(); row++) {\n    for (int col = bbox.min().x(); col < bbox.max().x(); col++) {\n      lowres_disparity(col, row) = PixelMask<Vector2f>();\n      lowres_disparity(col, row).invalidate();\n      m_disp_spread(col, row) = PixelMask<Vector2f>();\n      m_disp_spread(col, row).invalidate();\n    }\n  }\n\n  // Sample the box on the diagonal and perimeter  \n  std::vector<vw::Vector2> points;\n  vw::cartography::sample_int_box(bbox, points);\n\n  // Make local copies of Map2Camp transforms, as those are not thread-safe\n  vw::TransformPtr local_tx_left;\n  if (dynamic_cast<Map2CamTrans*>(m_tx_left.get()) != NULL) {\n    local_tx_left = vw::cartography::mapproj_trans_copy(m_tx_left);\n\n    // Do not cache the transform portion for this tile. That is good when lots\n    // of points are queried from the tile. Here we need a low-resolution\n    // subset, and caching greatly slows things down.\n#if 0\n    vw::BBox2 full_res_box;\n    for (int i = 0; i < points.size(); i++) {\n      vw::Vector2 low_res_pix = points[i];\n      vw::Vector2 full_res_pix = elem_quot(low_res_pix, m_downsample_scale);\n      full_res_box.grow(full_res_pix);\n    }\n    full_res_box.expand(1); // just in case\n    local_tx_left->reverse_bbox(full_res_box); // This will cache what is needed\n#endif\n    \n  } else {\n    local_tx_left = m_tx_left;\n  }\n\n  // For the right transform we won't use the \"reverse\" function, so no need for caching.\n  vw::TransformPtr local_tx_right;\n  if (dynamic_cast<Map2CamTrans*>(m_tx_right.get()) != NULL)\n    local_tx_right = vw::cartography::mapproj_trans_copy(m_tx_right);\n  else\n    local_tx_right = m_tx_right;\n  \n  // Find the pixel values on a small set of points of the diagonals of\n  // the current tile.\n  // TODO(oalexan1): Use here instead the points computed earlier.\n  // But this would be a lot of points.\n  std::vector<Vector2> diagonals;\n  int wid = bbox.width() - 1, hgt = bbox.height() - 1;\n  int dim = std::max(1, std::max(wid, hgt)/10);\n  for (int i = 0; i <= dim; i++)\n    diagonals.push_back(bbox.min() + Vector2(double(i)*wid/dim, double(i)*hgt/dim));\n  for (int i = 0; i <= dim; i++)\n    diagonals.push_back(bbox.min() + Vector2(double(i)*wid/dim, hgt - double(i)*hgt/dim));\n\n  // Estimate the DEM region we expect to use and crop it into an\n  // ImageView. This will make the algorithm much faster than\n  // accessing individual DEM pixels from disk.\n  BBox2i dem_box;\n  Vector3 prev_xyz; // for storing ray-to-dem intersection from the previous iteration\n  for (unsigned k = 0; k < diagonals.size(); k++) {\n\n    Vector2 left_lowres_pix = diagonals[k];\n    vw::Vector3 left_camera_vec, xyz;\n    bool success = lowResPixToDemXyz(left_lowres_pix, m_downsample_scale, local_tx_left, \n                                     m_left_camera_model, m_dem_error, m_dem_georef, \n                                     m_dem, m_height_guess, \n                                     left_camera_vec, prev_xyz, xyz); // outputs\n    \n    if (!success) \n      continue;\n\n    Vector3 llh = m_dem_georef.datum().cartesian_to_geodetic(xyz);\n    Vector2 pix = round(m_dem_georef.lonlat_to_pixel(subvector(llh, 0, 2)));\n    dem_box.grow(pix);\n  }\n\n  // Expand the DEM box just in case as the above calculation is\n  // not fool-proof if the DEM has a lot of no-data regions.\n  int expand = std::max(100, (int)(0.1*std::max(dem_box.width(), dem_box.height())));\n  dem_box.expand(expand);\n  dem_box.crop(bounding_box(m_dem));\n\n  // Crop the georef, read the DEM region in memory\n  GeoReference georef_crop = crop(m_dem_georef, dem_box);\n  ImageView<PixelMask<float>> dem_crop = crop(m_dem, dem_box);\n\n  // Compute the DEM disparity. Use one in every 'm_pixel_sample' pixels.\n  for (int row = bbox.min().y(); row < bbox.max().y(); row++) {\n\n    if (row % m_pixel_sample != 0) \n      continue;\n\n    // Must wipe the previous guess since we are now too far from it\n    prev_xyz = Vector3();\n\n    for (int col = bbox.min().x(); col < bbox.max().x(); col++) {\n      if (col % m_pixel_sample != 0) \n        continue;\n\n      Vector2 left_lowres_pix = Vector2(col, row);\n      \n      vw::Vector3 left_camera_vec, xyz;\n      bool success = lowResPixToDemXyz(left_lowres_pix, m_downsample_scale, local_tx_left, \n                                       m_left_camera_model, m_dem_error, georef_crop, \n                                       dem_crop, m_height_guess, \n                                       left_camera_vec, prev_xyz, xyz); // outputs\n      if (!success) \n        continue;\n\n      // Since our DEM is only known approximately, the true\n      // intersection point of the ray coming from the left camera\n      // with the DEM could be anywhere within m_dem_error from\n      // xyz. Use that to get an estimate of the disparity\n      // error.\n\n      ImageView<PixelMask<Vector2>> curr_disp(3, 1);\n      double bias[] = {-1.0, 1.0, 0.0};\n      int success_arr[] = {0, 0, 0};\n\n      for (int k = 0; k < curr_disp.cols(); k++) {\n\n        curr_disp(k, 0).invalidate();\n        Vector2 right_fullres_pix;\n        try {\n          // TODO(oalexan1): Should the off-nadir angle affect the bias?\n          vw::Vector3 biased_xyz = xyz + bias[k] * m_dem_error * left_camera_vec;\n          // Raw camera pixel\n          right_fullres_pix = m_right_camera_model->point_to_pixel(biased_xyz);\n          // Transformed (mapprojected) camera pixel\n          right_fullres_pix = local_tx_right->forward(right_fullres_pix);\n        } catch (...) {\n          continue;\n        }\n\n        Vector2 right_lowres_pix = elem_prod(right_fullres_pix, m_downsample_scale);\n        curr_disp(k, 0) = right_lowres_pix - left_lowres_pix;\n        curr_disp(k, 0).validate();\n        success_arr[k] = 1;\n\n        // If the disparities at the endpoints of the range were successful,\n        // don't bother with the middle estimate.\n        if (k == 1 && success_arr[0] && success_arr[1]) break;\n      }\n\n      // Continue if none of the disparities were successful\n      if (!success_arr[0] && !success_arr[1] && !success_arr[2]) \n        continue;\n        \n      // Accumulate the values for which there is success\n      BBox2f search_range;\n      for (int k = 0; k < curr_disp.cols(); k++) {\n        if (success_arr[k] && is_valid(curr_disp(k, 0))) \n          search_range.grow(curr_disp(k, 0).child());\n      }\n\n      // These quantities are kept as float, as they can be tiny for large images      \n      lowres_disparity(col, row) = (search_range.min() + search_range.max())/2.0;\n      lowres_disparity(col, row).validate();\n      // Divide by 2 here as later we will expand by this value in both directions\n      m_disp_spread(col, row) = (search_range.max() - search_range.min())/2.0;\n      m_disp_spread(col, row).validate();\n    }\n  }\n\n  return lowres_disparity;\n}\n\ntemplate <class DestT>\ninline void rasterize(DestT const& dest, BBox2i bbox) const {\n  vw::rasterize(prerasterize(bbox), dest, bbox);\n}\n\n}; // End class DemDisparity\n\nvoid produce_dem_disparity(ASPGlobalOptions & opt,\n                            vw::TransformPtr tx_left, vw::TransformPtr tx_right,\n                            boost::shared_ptr<camera::CameraModel> left_camera_model,\n                            boost::shared_ptr<camera::CameraModel> right_camera_model,\n                            std::string const& session_name) {\n\n  if (stereo_settings().is_search_defined())\n    vw_out(WarningMessage) << \"Computing low-resolution disparity from DEM. \"\n                            << \"Will ignore corr-search value: \"\n                            << stereo_settings().search_range << \".\\n\";\n\n  // Skip pixels to speed things up, particularly for ISIS and DG.\n  int pixel_sample = asp::stereo_settings().disparity_estimation_sample_rate;\n  pixel_sample = std::max(1, pixel_sample);\n  vw::vw_out() << \"Low-res disparity estimation sample rate: \" << pixel_sample << \"\\n\";\n\n  DiskImageView<PixelGray<float>> left_image(opt.out_prefix+\"-L.tif\");\n  DiskImageView<PixelGray<float>> left_image_sub(opt.out_prefix+\"-L_sub.tif\");\n\n  // The DEM to use to estimate the disparity\n  std::string dem_file = stereo_settings().disparity_estimation_dem;\n  if (dem_file == \"\")\n    vw::vw_throw(vw::ArgumentErr() << \"dem_disparity: No value was provided for \"\n              << \"disparity-estimation-dem.\\n\");\n  double dem_error = stereo_settings().disparity_estimation_dem_error;\n  if (dem_error < 0.0)\n    vw::vw_throw(vw::ArgumentErr() << \"dem_disparity: Invalid value for \"\n              << \"disparity-estimation-dem-error: \" << dem_error << \".\\n\");\n\n  GeoReference dem_georef;\n  bool has_georef = cartography::read_georeference(dem_georef, dem_file);\n  if (!has_georef)\n    vw::vw_throw(vw::ArgumentErr() << \"There is no georeference information in: \"\n                    << dem_file << \".\\n\");\n\n  // Create a masked DEM, by using the no-data value, if present\n  DiskImageView<float> dem_disk_image(dem_file);\n  ImageViewRef<PixelMask<float>> dem = pixel_cast<PixelMask<float>>(dem_disk_image);\n  boost::shared_ptr<DiskImageResource> rsrc(DiskImageResourcePtr(dem_file));\n  if (rsrc->has_nodata_read()) {\n    double nodata_value = rsrc->nodata_read();\n    if (!std::isnan(nodata_value))\n      dem = create_mask(dem_disk_image, nodata_value);\n  }\n\n  Vector2f downsample_scale(float(left_image_sub.cols()) / float(left_image.cols()),\n                            float(left_image_sub.rows()) / float(left_image.rows()));\n\n  // Smaller tiles is better, as then more threads can run at once\n  Vector2 orig_tile_size = opt.raster_tile_size;\n  opt.raster_tile_size = Vector2i(64, 64);\n\n  // This image is small enough that we can keep it in memory. It will be created\n  // alongside the low-res disparity image.\n  ImageView<PixelMask<Vector2f>> disp_spread(left_image_sub.cols(), left_image_sub.rows());\n\n  vw::Stopwatch sw;\n  sw.start();\n  \n  // Compute and write the low-resolution disparity\n  ImageViewRef<PixelMask<Vector2f>> lowres_disparity\n    = DemDisparity(left_image_sub, dem_error, dem_georef, dem, downsample_scale,\n                   tx_left, tx_right, left_camera_model, right_camera_model,\n                   pixel_sample, disp_spread);\n  std::string disparity_file = opt.out_prefix + \"-D_sub.tif\";\n  vw_out() << \"Writing low-resolution disparity: \" << disparity_file << \"\\n\";\n  auto tpc1 = TerminalProgressCallback(\"asp\", \"\\t--> Low-resolution disparity:\");\n  if (session_name.find(\"isis\") != std::string::npos) {\n    // ISIS does not support multi-threading\n    auto drsrc = vw::cartography::build_gdal_rsrc(disparity_file, lowres_disparity, opt);\n    vw::write_image(*drsrc, lowres_disparity, tpc1);\n  } else {\n    vw::cartography::block_write_gdal_image(disparity_file, lowres_disparity, opt, tpc1);\n  }\n\n  // The disparity spread is in memory by now, so can be written with multiple threads \n  std::string disp_spread_file = opt.out_prefix + \"-D_sub_spread.tif\";\n  vw_out() << \"Writing low-resolution disparity spread: \" << disp_spread_file << \"\\n\";\n  auto tpc2 = TerminalProgressCallback(\"asp\", \"\\t--> Low-resolution disparity spread:\");\n  vw::cartography::block_write_gdal_image(disp_spread_file, disp_spread, opt, tpc2);\n  \n  sw.stop();\n  vw_out() << \"Low-res disparity elapsed time: \" << sw.elapsed_seconds() << \" s.\\n\";\n  \n  // Go back to the original tile size\n  opt.raster_tile_size = orig_tile_size;\n  \n  return;\n} // end produce_dem_disparity()\n  \n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Core/DemDisparity.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n/// \\file DEMDisparity.h\n///\n\n#ifndef __DEM_DISPARITY_H__\n#define __DEM_DISPARITY_H__\n\n#include <boost/smart_ptr/shared_ptr.hpp>\n\n#include <vw/Math/Transform.h>\n\n// Forward declaration\nnamespace asp {\n  struct ASPGlobalOptions;\n}\nnamespace vw {\n  namespace camera {\n    class CameraModel;\n  }\n}\n\n\nnamespace asp {\n\n  /// Use a DEM to get the low-res disparity\n  void produce_dem_disparity(ASPGlobalOptions & opt,\n                             vw::TransformPtr tx_left,\n                             vw::TransformPtr tx_right,\n                             boost::shared_ptr<vw::camera::CameraModel> left_camera_model,\n                             boost::shared_ptr<vw::camera::CameraModel> right_camera_model,\n                             std::string const& session_name);\n\n}\n\n#endif\n"
  },
  {
    "path": "src/asp/Core/DemMosaic.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Core/DemMosaic.h>\n#include <asp/Core/GdalUtils.h>\n\n#include <vw/FileIO/DiskImageView.h>\n#include <vw/FileIO/DiskImageResourceGDAL.h>\n#include <vw/Image/Filter.h>\n#include <vw/Image/Manipulation.h>\n#include <vw/Cartography/GeoReference.h>\n#include <vw/Core/ProgressCallback.h>\n#include <boost/math/special_functions/erf.hpp>\n\n#include <sstream>\n\n// Low-level functions for DEM mosaicking\n\nnamespace asp {\n\n// Blur the weights. To try to make the weights not drop much at the\n// boundary, expand the weights with zero, blur, crop back to the\n// original region.\n// It is highly important to note that blurring can increase the weights\n// at the boundary, even with the extension done above. Erosion before\n// blurring does not help with that, as for weights with complicated\n// boundary erosion can wipe things in a non-uniform way leaving\n// huge holes. To get smooth weights, if really desired one should\n// use the weights-exponent option.\nvoid blurWeights(vw::ImageView<double> & weights, double sigma) {\n\n  if (sigma <= 0)\n    return;\n\n  int half_kernel = vw::compute_kernel_size(sigma)/2;\n  int extra = half_kernel + 1; // to guarantee we stay zero at boundary\n\n  int cols = weights.cols(), rows = weights.rows();\n\n  vw::ImageView<double> extra_wts(cols + 2*extra, rows + 2*extra);\n  vw::fill(extra_wts, 0);\n  for (int col = 0; col < cols; col++) {\n    for (int row = 0; row < rows; row++) {\n      if (weights(col,row) > 0)\n        extra_wts(col + extra, row + extra) = weights(col, row);\n      else\n        extra_wts(col + extra, row + extra) = 0;\n    }\n  }\n\n  vw::ImageView<double> blurred_wts = vw::gaussian_filter(extra_wts, sigma);\n\n  // Copy back. The weights must not grow. In particular, where the\n  // original weights were zero, the new weights must also be zero, as\n  // at those points there is no DEM data.\n  for (int col = 0; col < cols; col++) {\n    for (int row = 0; row < rows; row++) {\n      if (weights(col, row) > 0) {\n        weights(col, row) = blurred_wts(col + extra, row + extra);\n      }\n      //weights(col, row) = std::min(weights(col, row), blurred_wts(col + extra, row + extra));\n    }\n  }\n\n}\n\nvoid applyExternalWeights(std::string const& weight_file,\n                          double min_weight, bool invert_weights,\n                          vw::BBox2i const& in_box,\n                          vw::ImageView<double>& local_wts) {\n\n  vw::DiskImageResourceGDAL rsrc(weight_file);\n  vw::DiskImageView<double> disk_weight(rsrc);\n  vw::ImageView<double> external_weight = vw::crop(disk_weight, in_box);\n\n  // Must have the same size as the local weights\n  if (local_wts.cols() != external_weight.cols() ||\n      local_wts.rows() != external_weight.rows())\n    vw::vw_throw(vw::ArgumentErr() << \"The external weights must have the same size as the DEM.\\n\");\n\n  // Read the no-data value. Any no-data weights will be ignored.\n  double weight_nodata = -std::numeric_limits<double>::max();\n  if (rsrc.has_nodata_read())\n    weight_nodata = rsrc.nodata_read();\n\n  // Limit from below\n  if (min_weight > 0) {\n    for (int col = 0; col < external_weight.cols(); col++) {\n      for (int row = 0; row < external_weight.rows(); row++) {\n        bool good = (external_weight(col, row) != weight_nodata);\n        if (!good)\n          continue;\n        external_weight(col, row)\n        = std::max(external_weight(col, row), min_weight);\n      }\n    }\n  }\n\n  // See if to invert the weight\n  if (invert_weights) {\n    for (int col = 0; col < external_weight.cols(); col++) {\n      for (int row = 0; row < external_weight.rows(); row++) {\n        bool good = (external_weight(col, row) != weight_nodata);\n        if (!good)\n          continue;\n        if (external_weight(col, row) > 0)\n        external_weight(col, row) = 1.0 / external_weight(col, row);\n      }\n    }\n  }\n\n  // Multiply the local weights by the external weights\n  for (int col = 0; col < local_wts.cols(); col++) {\n    for (int row = 0; row < local_wts.rows(); row++) {\n        bool good = (external_weight(col, row) != weight_nodata);\n        if (!good)\n          continue;\n      local_wts(col, row) *= external_weight(col, row);\n    }\n  }\n\n  return;\n}\n\n// Compute a weight that is zero, then rises, plateaus, and then falls.\n// hCenterLine contains the center column at each row/col\n// hMaxDistArray contains the width of the column at each row/col\n// TODO(oalexan1): Move this to VW, and see about overwriting \n// the other weight functions. The other one uses normalization, which is bad.\ndouble computePlateauedWeights(vw::Vector2 const& pix, bool horizontal,\n                               std::vector<double> const& centers,\n                               std::vector<double> const& widths,\n                               double max_weight_val) {\n\n  int primary_axis = 0, secondary_axis = 1; // Vertical\n  if (horizontal) {\n    primary_axis   = 1;\n    secondary_axis = 0;\n  }\n\n  // We round below, to avoid issues when we are within numerical value\n  // to an integer value for row/col.\n  // To do: Need to do interpolation here.\n\n  int pos = (int)round(pix[primary_axis]); // The row or column\n  if (pos < 0 || pos >= (int)widths.size() || pos >= (int)centers.size())\n    return 0;\n\n  double max_dist = widths[pos]/2.0; // Half column width\n  double center   = centers[pos];\n  double dist     = fabs(pix[secondary_axis]-center); // Pixel distance from center column\n\n  if (max_dist <= 0 || dist < 0)\n    return 0;\n\n  // We want to make sure the weight is positive (even if small) at\n  // the first/last valid pixel.\n  double tol = 1e-8*max_dist;\n\n  // The weight is not normalized. This is a bugfix. Normalized weights result\n  // in higher weights in narrow regions, which is not what we want.\n  double weight = std::max(0.0, max_dist - dist + tol);\n  weight = std::min(max_weight_val, weight);\n\n  return weight;\n}\n\n// Compute centerline weights using plateaued weight function (not normalized,\n// unlike VW's version). Distinguishes interior holes from border pixels and\n// assigns them different values for DEM mosaicking.\nvoid centerlineWeightsWithHoles(vw::ImageView<vw::PixelMask<double>> const& img,\n                                vw::ImageView<double> & weights,\n                                double max_weight_val) {\n  \n  int numRows = img.rows();\n  int numCols = img.cols();\n\n  // Arrays to be returned out of this function\n  std::vector<double> hCenterLine  (numRows, 0);\n  std::vector<double> hMaxDistArray(numRows, 0);\n  std::vector<double> vCenterLine  (numCols, 0);\n  std::vector<double> vMaxDistArray(numCols, 0);\n\n  std::vector<int> minValInRow(numRows, 0);\n  std::vector<int> maxValInRow(numRows, 0);\n  std::vector<int> minValInCol(numCols, 0);\n  std::vector<int> maxValInCol(numCols, 0);\n\n  for (int k = 0; k < numRows; k++) {\n    minValInRow[k] = numCols;\n    maxValInRow[k] = 0;\n  }\n  for (int col = 0; col < numCols; col++) {\n    minValInCol[col] = numRows;\n    maxValInCol[col] = 0;\n  }\n\n  // Note that we do just a single pass through the image to compute\n  // both the horizontal and vertical min/max values.\n  for (int row = 0 ; row < numRows; row++) {\n    for (int col = 0; col < numCols; col++) {\n\n      if (!is_valid(img(col,row))) continue;\n\n      // Record the first and last valid column in each row\n      if (col < minValInRow[row]) minValInRow[row] = col;\n      if (col > maxValInRow[row]) maxValInRow[row] = col;\n\n      // Record the first and last valid row in each column\n      if (row < minValInCol[col]) minValInCol[col] = row;\n      if (row > maxValInCol[col]) maxValInCol[col] = row;\n    }\n  }\n\n  // For each row, record central column and the column width\n  for (int row = 0; row < numRows; row++) {\n    hCenterLine   [row] = (minValInRow[row] + maxValInRow[row])/2.0;\n    hMaxDistArray [row] =  maxValInRow[row] - minValInRow[row];\n    if (hMaxDistArray[row] < 0)\n      hMaxDistArray[row]=0;\n  }\n\n  // For each row, record central column and the column width\n  for (int col = 0 ; col < numCols; col++) {\n    vCenterLine   [col] = (minValInCol[col] + maxValInCol[col])/2.0;\n    vMaxDistArray [col] =  maxValInCol[col] - minValInCol[col];\n    if (vMaxDistArray[col] < 0)\n      vMaxDistArray[col]=0;\n  }\n\n  // Process the entire image\n  vw::BBox2i output_bbox = vw::bounding_box(img);\n\n  // Compute the weighting for each pixel in the image\n  weights.set_size(output_bbox.width(), output_bbox.height());\n  vw::fill(weights, 0);\n\n  for (int row = output_bbox.min().y(); row < output_bbox.max().y(); row++) {\n    for (int col = output_bbox.min().x(); col < output_bbox.max().x(); col++) {\n      bool inner_row = ((row >= minValInCol[col]) && (row <= maxValInCol[col]));\n      bool inner_col = ((col >= minValInRow[row]) && (col <= maxValInRow[row]));\n      bool inner_pixel = inner_row && inner_col;\n      vw::Vector2 pix(col, row);\n      double new_weight = 0; // Invalid pixels usually get zero weight\n      if (is_valid(img(col,row))) {\n        double weight_h = computePlateauedWeights(pix, true,  hCenterLine, hMaxDistArray,\n                                                   max_weight_val);\n        double weight_v = computePlateauedWeights(pix, false, vCenterLine, vMaxDistArray,\n                                                   max_weight_val);\n        new_weight = weight_h*weight_v;\n      } else { \n        // Invalid pixel\n        new_weight = 0;\n      }\n      weights(col-output_bbox.min().x(), row-output_bbox.min().y()) = new_weight;\n    }\n  }\n}\n\n// Smooth step function using error function. Returns 0 at x=0, M at x=M,\n// with smooth S-curve transition. Higher L gives flatter ends and steeper middle.\ndouble erfSmoothStep(double x, double M, double L) {\n  if (x <= 0) return 0;\n  if (x >= M) return M;\n  return 0.5*M*(1 + boost::math::erf (0.5*sqrt(M_PI) * (2*x*L/M - L)));\n}\n\n// Convert a projected-space bounding box to pixel coordinates with snapping.\n// Transforms all 4 corners, rounds near-integer values (within tol) to integers,\n// then floors/ceils to ensure integer pixel boundaries.\nvw::BBox2 pointToPixelBboxSnapped(vw::cartography::GeoReference const& georef,\n                                  vw::BBox2 const& point_bbox, double tol) {\n\n  vw::BBox2 pix_box;\n  vw::Vector2 corners[] = {point_bbox.min(), point_bbox.max(),\n                           vw::Vector2(point_bbox.min().x(), point_bbox.max().y()),\n                           vw::Vector2(point_bbox.max().x(), point_bbox.min().y())};\n  for (int i = 0; i < 4; i++)\n    pix_box.grow(georef.point_to_pixel(corners[i]));\n\n  // Round values that are likely due to numerical error\n  if (norm_2(pix_box.min() - round(pix_box.min())) < tol)\n    pix_box.min() = round(pix_box.min());\n  if (norm_2(pix_box.max() - round(pix_box.max())) < tol)\n    pix_box.max() = round(pix_box.max());\n\n  // Grow the box until the corners are integer\n  pix_box.min() = floor(pix_box.min());\n  pix_box.max() = ceil (pix_box.max());\n\n  return pix_box;\n}\n\n// Read a georeference from a file and throw if not found.\nvw::cartography::GeoReference readGeorefOrThrow(std::string const& file) {\n  vw::cartography::GeoReference geo;\n  bool is_good = vw::cartography::read_georeference(geo, file);\n  if (!is_good)\n    vw::vw_throw(vw::ArgumentErr() << \"No georeference found in \" << file << \".\\n\");\n  return geo;\n}\n\n// A helper function to do interpolation. Will not interpolate when\n// exactly on the grid. This does not interpolate when the weight is 0,\n// as that suggests the DEM is no-data there. \n// TODO(oalexan1): This is awkward. Better use a masked DEM throughout.\nDoubleGrayA interpDem(double x, double y,\n                      vw::ImageView<DoubleGrayA> const& dem,\n                      vw::ImageViewRef<DoubleGrayA> const& interp_dem,\n                      double tol,\n                      bool propagate_nodata) {\n\n  DoubleGrayA pval;\n\n  // Round to nearest integer location\n  int i0 = round(x), j0 = round(y);\n  if ((fabs(x-i0) < tol) && (fabs(y-j0) < tol) &&\n      ((i0 >= 0) && (i0 <= dem.cols()-1) &&\n        (j0 >= 0) && (j0 <= dem.rows()-1))) {\n\n    // A lot of care is needed here. We are at an integer\n    // pixel, save for numerical error. Just borrow pixel's\n    // value, and don't interpolate. Interpolation can result\n    // in invalid pixels if the current pixel is valid but its\n    // neighbors are not. It can also make it appear is if the\n    // current indices are out of bounds while in fact they\n    // are barely so.\n    pval = dem(i0, j0);\n\n  } else { // We are not right on an integer pixel and we need to interpolate\n\n    // Below must use x <= cols()-1 as x is double\n    bool is_good = ((x >= 0) && (x <= dem.cols()-1) &&\n        (y >= 0) && (y <= dem.rows()-1));\n    if (!is_good) {\n      pval.a() = 0; // Flag as nodata\n      return pval; // Outside the loaded DEM bounds, skip to the next pixel\n    }\n\n    // If we have weights of 0, that means there are invalid pixels, so skip this point.\n    int i0 = (int)floor(x), j0 = (int)floor(y);\n    int i1 = (int)ceil(x),  j1 = (int)ceil(y);\n    bool nodata = ((dem(i0, j0).a() == 0) || (dem(i1, j0).a() == 0) ||\n                   (dem(i0, j1).a() == 0) || (dem(i1, j1).a() == 0));\n    bool border = ((dem(i0, j0).a() <  0) || (dem(i1, j0).a() <  0) ||\n                   (dem(i0, j1).a() <  0) || (dem(i1, j1).a() <  0));\n\n    if (nodata || border) {\n      pval.v() = 0;\n      pval.a() = -1; // Flag as border\n\n      if (propagate_nodata && !border)\n        pval.a() = 0; // Flag as nodata\n\n    } else\n      pval = interp_dem(x, y); // Things checked out, do the interpolation.\n  }\n\n  return pval;\n}\n\n// Pixel and weight manipulation utilities\n\nvoid invalidateByThreshold(double threshold, double nodata_value,\n                           vw::ImageView<DoubleGrayA> & dem) {\n  for (int col = 0; col < dem.cols(); col++) {\n    for (int row = 0; row < dem.rows(); row++) {\n      if (dem(col, row)[0] <= threshold)\n        dem(col, row)[0] = nodata_value;\n    }\n  }\n}\n\nvoid invalidateNaN(double nodata_value,\n                   vw::ImageView<DoubleGrayA> & dem) {\n  for (int col = 0; col < dem.cols(); col++) {\n    for (int row = 0; row < dem.rows(); row++) {\n      if (std::isnan(dem(col, row)[0]))\n        dem(col, row)[0] = nodata_value;\n    }\n  }\n}\n\nvoid setNoDataByWeight(double out_nodata_value,\n                       vw::ImageView<double> & tile,\n                       vw::ImageView<double> & weight) {\n  for (int col = 0; col < weight.cols(); col++) {\n    for (int row = 0; row < weight.rows(); row++) {\n      if (weight(col, row) <= 0)\n        tile(col, row) = out_nodata_value;\n    }\n  }\n}\n\nvoid clampWeights(double bias, vw::ImageView<double> & weight) {\n  for (int col = 0; col < weight.cols(); col++) {\n    for (int row = 0; row < weight.rows(); row++) {\n      weight(col, row) = std::min(weight(col, row), double(bias));\n    }\n  }\n}\n\nvoid raiseToPower(double exponent, vw::ImageView<double> & weight) {\n  for (int col = 0; col < weight.cols(); col++) {\n    for (int row = 0; row < weight.rows(); row++) {\n      weight(col, row) = pow(weight(col, row), exponent);\n    }\n  }\n}\n\nvoid setWeightsAsAlphaChannel(vw::ImageView<double> const& weights,\n                              vw::ImageView<DoubleGrayA>& dem) {\n  for (int col = 0; col < dem.cols(); col++) {\n    for (int row = 0; row < dem.rows(); row++) {\n      dem(col, row).a() = weights(col, row);\n    }\n  }\n}\n\nvoid divideByWeight(vw::ImageView<double> & tile,\n                    vw::ImageView<double> const& weights) {\n  for (int c = 0; c < tile.cols(); c++) {\n    for (int r = 0; r < tile.rows(); r++) {\n      if (weights(c, r) > 0)\n        tile(c, r) /= weights(c, r);\n    }\n  }\n}\n\nvoid demMosaicDatumCheck(std::vector<vw::cartography::GeoReference> const& georefs,\n                         vw::cartography::GeoReference const& out_georef) {\n  double out_major_axis = out_georef.datum().semi_major_axis();\n  double out_minor_axis = out_georef.datum().semi_minor_axis();\n  for (int i = 0; i < (int)georefs.size(); i++) {\n    double this_major_axis = georefs[i].datum().semi_major_axis();\n    double this_minor_axis = georefs[i].datum().semi_minor_axis();\n    if (std::abs(this_major_axis - out_major_axis) > 0.1 ||\n        std::abs(this_minor_axis - out_minor_axis) > 0.1 ||\n        georefs[i].datum().meridian_offset() != out_georef.datum().meridian_offset()) {\n      vw::vw_throw(vw::NoImplErr() << \"Mosaicking of DEMs with differing datum radii \"\n               << \" or meridian offsets is not implemented. Datums encountered:\\n\"\n               << georefs[i].datum() << \"\\n\"\n               <<  out_georef.datum() << \"\\n\");\n    }\n    if (georefs[i].datum().name() != out_georef.datum().name() &&\n        this_major_axis == out_major_axis &&\n        this_minor_axis == out_minor_axis &&\n        georefs[i].datum().meridian_offset() == out_georef.datum().meridian_offset()) {\n      vw::vw_out(vw::WarningMessage)\n        << \"Found DEMs with the same radii and meridian offsets, \"\n        << \"but different names: \"\n        << georefs[i].datum().name() << \" and \"\n        << out_georef.datum().name() << \"\\n\";\n    }\n  }\n}\n\nvoid accumWeightedTiles(double out_nodata_value,\n                        int save_dem_weight,\n                        int dem_index,\n                        vw::ImageView<double> const& tile_clip,\n                        vw::ImageView<double> const& weight_clip,\n                        // Outputs\n                        vw::ImageView<double> & tile,\n                        vw::ImageView<double> & weights,\n                        vw::ImageView<double> & saved_weight) {\n\n  for (int col = 0; col < weight_clip.cols(); col++) {\n    for (int row = 0; row < weight_clip.rows(); row++) {\n\n      double wt = weight_clip(col, row);\n      if (wt <= 0)\n        continue; // nothing to do\n\n      // Initialize the tile\n      if (tile(col, row) == out_nodata_value)\n        tile(col, row) = 0;\n\n      tile(col, row)    += wt*tile_clip(col, row);\n      weights(col, row) += wt;\n\n      if (dem_index == save_dem_weight)\n        saved_weight(col, row) = wt;\n    }\n  }\n}\n\nvoid computeWeightedAverage(int save_dem_weight,\n                            vw::ImageView<double> & tile,\n                            vw::ImageView<double> & weights,\n                            vw::ImageView<double> & saved_weight) {\n\n  for (int col = 0; col < tile.cols(); col++) {\n    for (int row = 0; row < weights.rows(); row++) {\n      if (weights(col, row) > 0)\n        tile(col, row) /= weights(col, row);\n\n      if (save_dem_weight >= 0 && weights(col, row) > 0)\n        saved_weight(col, row) /= weights(col, row);\n    }\n  }\n}\n\nvoid saveTileWeight(int dem_iter, vw::BBox2i const& bbox,\n                    vw::ImageView<double> const& local_wts,\n                    vw::cartography::GeoReference const& georef) {\n\n  std::ostringstream os;\n  os << \"weights_\" << dem_iter << \"_\" << bbox.min().x() << \"_\" << bbox.min().y()\n     << \".tif\";\n  vw::vw_out() << \"Writing: \" << os.str() << \"\\n\";\n  bool has_georef = true, has_nodata = true;\n  vw::cartography::block_write_gdal_image(os.str(), local_wts,\n             has_georef, georef,\n             has_nodata, -100,\n             vw::GdalWriteOptions(),\n             vw::TerminalProgressCallback(\"asp\", \"\"));\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Core/DemMosaic.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file DemMosaic.h\n/// Utility functions for dem_mosaic\n\n#ifndef __ASP_CORE_DEM_MOSAIC_H__\n#define __ASP_CORE_DEM_MOSAIC_H__\n\n#include <vw/Image/ImageView.h>\n#include <vw/Image/ImageViewRef.h>\n#include <vw/Image/PixelTypes.h>\n#include <vw/Image/Algorithms.h>\n#include <vw/Math/Vector.h>\n#include <vw/Math/BBox.h>\n\n// Forward declarations\nnamespace vw {\n  namespace cartography {\n    class GeoReference;\n  }\n}\n\nnamespace asp {\n\nvoid blurWeights(vw::ImageView<double> & weights, double sigma);\n\nvoid applyExternalWeights(std::string const& weight_file,\n                          double min_weight, bool invert_weights,\n                          vw::BBox2i const& in_box,\n                          vw::ImageView<double>& local_wts);\n\ndouble computePlateauedWeights(vw::Vector2 const& pix, bool horizontal,\n                               std::vector<double> const& centers,\n                               std::vector<double> const& widths,\n                               double max_weight_val);\n\n// Compute centerline weights using plateaued weight function. Distinguishes\n// between interior holes (assigned hole_fill_value) and border pixels (-1).\nvoid centerlineWeightsWithHoles(vw::ImageView<vw::PixelMask<double>> const& img,\n                                vw::ImageView<double> & weights,\n                                double max_weight_val);\n\ndouble erfSmoothStep(double x, double M, double L);\n\n// Convert a projected-space bounding box to pixel coordinates with snapping.\n// Transforms all 4 corners, rounds near-integer values (within tol) to integers,\n// then floors/ceils to ensure integer pixel boundaries.\nvw::BBox2 pointToPixelBboxSnapped(vw::cartography::GeoReference const& georef,\n                                  vw::BBox2 const& point_bbox, double tol);\n\n// Read a georeference from a file and throw if not found.\nvw::cartography::GeoReference readGeorefOrThrow(std::string const& file);\n\ntypedef vw::PixelGrayA<double> DoubleGrayA;\nDoubleGrayA interpDem(double x, double y,\n                      vw::ImageView<DoubleGrayA> const& dem,\n                      vw::ImageViewRef<DoubleGrayA> const& interp_dem,\n                      double tol,\n                      bool propagate_nodata);\n\n// Pixel and weight manipulation utilities\nvoid invalidateByThreshold(double threshold, double nodata_value,\n                           vw::ImageView<DoubleGrayA> & dem);\n\nvoid invalidateNaN(double nodata_value,\n                   vw::ImageView<DoubleGrayA> & dem);\n\nvoid setNoDataByWeight(double out_nodata_value,\n                       vw::ImageView<double> & tile,\n                       vw::ImageView<double> & weight);\n\nvoid clampWeights(double bias, vw::ImageView<double> & weight);\n\nvoid raiseToPower(double exponent, vw::ImageView<double> & weight);\n\nvoid setWeightsAsAlphaChannel(vw::ImageView<double> const& weights,\n                              vw::ImageView<DoubleGrayA>& dem);\n\n// Tile processing utilities\nvoid divideByWeight(vw::ImageView<double> & tile,\n                    vw::ImageView<double> const& weights);\n\nvoid demMosaicDatumCheck(std::vector<vw::cartography::GeoReference> const& georefs,\n                         vw::cartography::GeoReference const& out_georef);\n\nvoid accumWeightedTiles(double out_nodata_value,\n                        int save_dem_weight,\n                        int dem_index,\n                        vw::ImageView<double> const& tile_clip,\n                        vw::ImageView<double> const& weight_clip,\n                        // Outputs\n                        vw::ImageView<double> & tile,\n                        vw::ImageView<double> & weights,\n                        vw::ImageView<double> & saved_weight);\n\nvoid computeWeightedAverage(int save_dem_weight,\n                            vw::ImageView<double> & tile,\n                            vw::ImageView<double> & weights,\n                            vw::ImageView<double> & saved_weight);\n\nvoid saveTileWeight(int dem_iter, vw::BBox2i const& bbox,\n                    vw::ImageView<double> const& local_wts,\n                    vw::cartography::GeoReference const& georef);\n\n} // end namespace asp\n\n#endif //__ASP_CORE_DEM_MOSAIC_H__\n"
  },
  {
    "path": "src/asp/Core/DemMosaicOptions.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file DemMosaicOptions.h\n/// Options structure for dem_mosaic\n\n#ifndef __ASP_CORE_DEM_MOSAIC_OPTIONS_H__\n#define __ASP_CORE_DEM_MOSAIC_OPTIONS_H__\n\n#include <vw/FileIO/GdalWriteOptions.h>\n#include <vw/Math/BBox.h>\n\n#include <string>\n#include <vector>\n#include <set>\n#include <limits>\n\nnamespace asp {\n\nstruct DemMosaicOptions: vw::GdalWriteOptions {\n  std::string dem_list, out_prefix, target_srs_string,\n    output_type, tile_list_str, weight_list, dem_list_file;\n  std::vector<std::string> dem_files, weight_files;\n  double tr, geo_tile_size;\n  bool   has_out_nodata, force_projwin;\n  double out_nodata_value;\n  int    tile_size, tile_index, erode_len, priority_blending_len,\n         extra_crop_len, hole_fill_len, block_size, save_dem_weight,\n         fill_num_passes;\n  double weights_exp, weights_blur_sigma, dem_blur_sigma;\n  double nodata_threshold, fill_search_radius, fill_power, fill_percent, min_weight;\n  bool   first, last, min, max, block_max, mean, stddev, median, nmad,\n    count, tap, gdal_tap, save_index_map, use_centerline_weights,\n    propagate_nodata, no_border_blend, invert_weights;\n  std::set<int> tile_list;\n  vw::BBox2 projwin;\n\n  DemMosaicOptions(): tr(0), geo_tile_size(0), has_out_nodata(false), force_projwin(false),\n             tile_index(-1), erode_len(0), priority_blending_len(0), extra_crop_len(0),\n             hole_fill_len(0), block_size(0), save_dem_weight(-1),\n             fill_search_radius(0), fill_power(0), fill_percent(0), fill_num_passes(0),\n             weights_exp(0), weights_blur_sigma(0.0), dem_blur_sigma(0.0),\n             nodata_threshold(std::numeric_limits<double>::quiet_NaN()),\n             first(false), last(false), min(false), max(false), block_max(false),\n             mean(false), stddev(false), median(false), nmad(false),\n             count(false), save_index_map(false), tap(false), gdal_tap(false),\n             use_centerline_weights(false),\n             projwin(vw::BBox2()),\n             invert_weights(false) {}\n};\n\n// Return the number of no-blending options selected\ninline int numNoBlendOptions(DemMosaicOptions const& opt) {\n  return int(opt.first) + int(opt.last) + int(opt.min) + int(opt.max)\n    + int(opt.mean) + int(opt.stddev) + int(opt.median)\n    + int(opt.nmad) + int(opt.count) + int(opt.block_max);\n}\n\n} // end namespace asp\n\n#endif //__ASP_CORE_DEM_MOSAIC_OPTIONS_H__\n"
  },
  {
    "path": "src/asp/Core/DemMosaicParse.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file DemMosaicParse.cc\n/// Parse and validate dem_mosaic options\n\n#include <asp/Core/DemMosaicParse.h>\n#include <asp/Core/AspProgramOptions.h>\n#include <asp/Core/AspLog.h>\n#include <asp/Core/FileUtils.h>\n\n#include <vw/FileIO/GdalWriteOptionsDesc.h>\n#include <vw/FileIO/FileUtils.h>\n\n#include <cmath>\n\n#include <boost/program_options.hpp>\n#include <boost/filesystem.hpp>\n\nnamespace po = boost::program_options;\nnamespace fs = boost::filesystem;\n\nnamespace asp {\n\nvoid handleDemMosaicArgs(int argc, char *argv[], asp::DemMosaicOptions& opt) {\n\n  double nan = std::numeric_limits<double>::quiet_NaN();\n\n  po::options_description general_options(\"Options\");\n  general_options.add_options()\n  (\"dem-list,l\", po::value<std::string>(&opt.dem_list),\n    \"A text file listing the DEM files to mosaic, one per line.\")\n  (\"output-prefix,o\", po::value(&opt.out_prefix),\n    \"Specify the output prefix. One or more tiles will be written with this prefix. \"\n    \"Alternatively, an exact output file can be specified, with a .tif extension.\")\n  (\"tile-size\", po::value<int>(&opt.tile_size)->default_value(1000000),\n    \"The maximum size of output DEM tile files to write, in pixels.\")\n  (\"tile-index\", po::value<int>(&opt.tile_index),\n    \"The index of the tile to save (starting from zero). When this program is invoked, \"\n    \"it will print out how many tiles are there. Default: save all tiles.\")\n  (\"tile-list\", po::value(&opt.tile_list_str)->default_value(\"\"),\n    \"List of tile indices (in quotes) to save. A tile index starts from 0.\")\n  (\"priority-blending-length\",\n    po::value<int>(&opt.priority_blending_len)->default_value(0),\n    \"If positive, keep unmodified values from the earliest available DEM except a band \"\n    \"this wide measured in pixels inward of its boundary where blending with subsequent \"\n    \"DEMs will happen.\")\n  (\"no-border-blend\", po::bool_switch(&opt.no_border_blend)->default_value(false),\n    \"Only apply blending around holes, don't blend at image borders. Not compatible with \"\n    \"centerline weights.\")\n  (\"tr\", po::value(&opt.tr),\n    \"Output grid size, that is, the DEM resolution in target georeferenced units per \"\n    \"pixel. Default: use the same resolution as the first DEM to be mosaicked.\")\n  (\"t_srs\", po::value(&opt.target_srs_string)->default_value(\"\"),\n    \"Specify the output projection as a GDAL projection string (WKT, GeoJSON, or PROJ). \"\n    \"If not provided, use the one from the first DEM to be mosaicked.\")\n  (\"t_projwin\", po::value(&opt.projwin),\n    \"Limit the mosaic to this region, with the corners given in georeferenced \"\n    \"coordinates (xmin ymin xmax ymax). Max is exclusive. See the --gdal-tap and --tap \"\n    \"options if desired to apply addition adjustments to this extent.\")\n  (\"gdal-tap\", po::bool_switch(&opt.gdal_tap)->default_value(false),\n    \"Ensure that the output mosaic bounds (as printed by gdalinfo) are integer multiples \"\n    \"of the grid size (as set with --tr). When --t_projwin is set and its entries are \"\n    \"integer multiples of the grid size, that precise extent will be produced on output. \"\n    \"This functions as the GDAL -tap option.\")\n  (\"tap\", po::bool_switch(&opt.tap)->default_value(false),\n    \"Let the output grid be at integer multiples of the grid size (like the default \"\n    \"behavior of point2dem and mapproject. Then the mosaic extent is biased by an \"\n    \"additional half a pixel. If this option is not set, the input grids determine the \"\n    \"output grid. See also --gdal-tap.\")\n  (\"first\", po::bool_switch(&opt.first)->default_value(false),\n    \"Keep the first encountered DEM value (in the input order).\")\n  (\"last\", po::bool_switch(&opt.last)->default_value(false),\n    \"Keep the last encountered DEM value (in the input order).\")\n  (\"min\", po::bool_switch(&opt.min)->default_value(false),\n    \"Keep the smallest encountered DEM value.\")\n  (\"max\", po::bool_switch(&opt.max)->default_value(false),\n    \"Keep the largest encountered DEM value.\")\n  (\"mean\", po::bool_switch(&opt.mean)->default_value(false),\n    \"Find the mean DEM value.\")\n  (\"stddev\", po::bool_switch(&opt.stddev)->default_value(false),\n    \"Find the standard deviation of the DEM values.\")\n  (\"median\", po::bool_switch(&opt.median)->default_value(false),\n    \"Find the median DEM value (this can be memory-intensive, fewer threads are \"\n    \"suggested).\")\n  (\"nmad\", po::bool_switch(&opt.nmad)->default_value(false),\n    \"Find the normalized median absolute deviation DEM value (this can be \"\n    \"memory-intensive, fewer threads are suggested).\")\n  (\"count\", po::bool_switch(&opt.count)->default_value(false),\n    \"Each pixel is set to the number of valid DEM heights at that pixel.\")\n  (\"weight-list\", po::value<std::string>(&opt.weight_list),\n    \"A text file having a list of external weight files to use in blending, one per \"\n    \"line. These are multiplied by the internal weights to ensure seamless blending. The \"\n    \"weights must be in one-to-one correspondence with the DEMs to be mosaicked.\")\n  (\"invert-weights\", po::bool_switch(&opt.invert_weights)->default_value(false),\n    \"Use 1/weight instead of weight in blending, with --weight-list.\")\n  (\"min-weight\", po::value<double>(&opt.min_weight)->default_value(0.0),\n    \"Limit from below with this value the weights provided with --weight-list.\")\n  (\"hole-fill-length\", po::value(&opt.hole_fill_len)->default_value(0),\n    \"Maximum dimensions of a hole in the DEM to fill, in pixels. See also \"\n    \"--fill-search-radius.\")\n  (\"fill-search-radius\", po::value(&opt.fill_search_radius)->default_value(0.0),\n    \"Fill an invalid pixel with a weighted average of pixel values within this radius in \"\n    \"pixels. The weight is 1/(factor * dist^power + 1), where the distance is measured \"\n    \"in pixels. See an example in the doc. See also --fill-power, --fill-percent and \"\n    \"--fill-num-passes.\")\n  (\"fill-power\", po::value(&opt.fill_power)->default_value(8.0),\n    \"Power exponent to use when filling nodata values with --fill-search-radius.\")\n  (\"fill-percent\", po::value(&opt.fill_percent)->default_value(10.0),\n    \"Fill an invalid pixel using weighted values of neighbors only if the percentage of \"\n    \"valid pixels within the radius given by --fill-search-radius is at least this\")\n  (\"fill-num-passes\", po::value(&opt.fill_num_passes)->default_value(0),\n    \"Fill invalid values using --fill-search-radius this many times.\")\n  (\"erode-length\", po::value<int>(&opt.erode_len)->default_value(0),\n    \"Erode the DEM by this many pixels at boundary.\")\n  (\"block-max\", po::bool_switch(&opt.block_max)->default_value(false),\n    \"For each block of size --block-size, keep the DEM with the largest sum of values in \"\n    \"the block.\")\n  (\"georef-tile-size\", po::value<double>(&opt.geo_tile_size),\n    \"Set the tile size in georeferenced (projected) units (e.g., degrees or meters).\")\n  (\"output-nodata-value\", po::value<double>(&opt.out_nodata_value),\n    \"No-data value to use on output. Default: use the one from the first DEM to be \"\n    \"mosaicked.\")\n  (\"ot\", po::value(&opt.output_type)->default_value(\"Float32\"),\n    \"Output data type. Supported types: Byte, UInt16, Int16, UInt32, Int32, Float32. If \"\n    \"the output type is a kind of integer, values are rounded and then clamped to the \"\n    \"limits of that type.\")\n  (\"weights-blur-sigma\", po::value<double>(&opt.weights_blur_sigma)->default_value(5.0),\n    \"The standard deviation of the Gaussian used to blur the weights. Higher value \"\n    \"results in smoother weights and blending. Set to 0 to not use blurring.\")\n  (\"weights-exponent\", po::value<double>(&opt.weights_exp)->default_value(2.0),\n    \"The weights used to blend the DEMs should increase away from the boundary as a \"\n    \"power with this exponent. Higher values will result in smoother but faster-growing \"\n    \"weights.\")\n  (\"use-centerline-weights\",\n    po::bool_switch(&opt.use_centerline_weights)->default_value(false),\n    \"Compute weights based on a DEM centerline algorithm. Produces smoother weights if \"\n    \"the input DEMs don't have holes or complicated boundary.\")\n  (\"dem-blur-sigma\", po::value<double>(&opt.dem_blur_sigma)->default_value(0.0),\n    \"Blur the DEM using a Gaussian with this value of sigma. A larger value will blur \"\n    \"more. Default: No blur.\")\n  (\"nodata-threshold\",\n    po::value(&opt.nodata_threshold)->default_value(nan),\n    \"Values no larger than this number will be interpreted as no-data.\")\n  (\"propagate-nodata\", po::bool_switch(&opt.propagate_nodata)->default_value(false),\n    \"Set a pixel to nodata if any input DEM is also nodata at that location.\")\n  (\"extra-crop-length\", po::value<int>(&opt.extra_crop_len)->default_value(200),\n    \"Crop the DEMs this far from the current tile (measured in pixels) before blending \"\n    \"them (a small value may result in artifacts). This value also helps determine how \"\n    \"to plateau the blending weights inwards, away from the DEM boundary.\")\n  (\"block-size\", po::value<int>(&opt.block_size)->default_value(0),\n    \"Process the mosaic with this value of the block size. A large value can result in \"\n    \"increased memory usage. Later, the mosaic will be saved with blocks given by \"\n    \"--tif-tile-size. This is an advanced internal parameter.\")\n  (\"save-dem-weight\", po::value<int>(&opt.save_dem_weight),\n    \"Save the weight image that tracks how much the input DEM with given index \"\n    \"contributed to the output mosaic at each pixel (smallest index is 0).\")\n  (\"force-projwin\", po::bool_switch(&opt.force_projwin)->default_value(false),\n    \"Make the output mosaic fill precisely the specified projwin, by padding it if \"\n    \"necessary and aligning the output grid to the region.\")\n  (\"save-index-map\", po::bool_switch(&opt.save_index_map)->default_value(false),\n    \"For each output pixel, save the index of the input DEM it came from (applicable \"\n    \"only for --first, --last, --min, --max, --median, and --nmad). A text file with the \"\n    \"index assigned to each input DEM is saved as well.\")\n  (\"dem-list-file\", po::value<std::string>(&opt.dem_list_file),\n    \"Alias for --dem-list, kept for backward compatibility.\")\n  ;\n\n  // Use in GdalWriteOptions '--tif-tile-size' rather than '--tile-size', to not conflict\n  // with the '--tile-size' definition used by this tool.\n  bool adjust_tile_size_opt = true;\n  general_options.add(vw::GdalWriteOptionsDescription(opt, adjust_tile_size_opt));\n\n  // The input DEM files are either specified as positional arguments or in a list,\n  // via --dem-list.  \n  po::options_description positional(\"\");\n  positional.add_options()\n    (\"dem-files\", po::value<std::vector<std::string>>(), \"Input DEM files\");\n  po::positional_options_description positional_desc;\n  positional_desc.add(\"dem-files\", -1);\n\n  std::string usage(\"[options] <dem files or -l dem_list.txt> -o output.tif\");\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line(argc, argv, opt, general_options, general_options,\n                            positional, positional_desc, usage,\n                            allow_unregistered, unregistered);\n\n  opt.dem_files.clear();\n  if (vm.count(\"dem-files\") != 0)\n    opt.dem_files = vm[\"dem-files\"].as<std::vector<std::string>>();\n\n  // Error checking\n  if (opt.out_prefix == \"\")\n    vw::vw_throw(vw::ArgumentErr() << \"No output prefix was specified.\\n\"\n                           << usage << general_options);\n  if (opt.num_threads == 0)\n    vw::vw_throw(vw::ArgumentErr() << \"The number of threads must be set and positive.\\n\"\n                           << usage << general_options);\n  if (opt.erode_len < 0)\n    vw::vw_throw(vw::ArgumentErr() << \"The erode length must not be negative.\\n\"\n                           << usage << general_options);\n  if (opt.extra_crop_len < 0)\n    vw::vw_throw(vw::ArgumentErr() << \"The blending length must not be negative.\\n\"\n                           << usage << general_options);\n  if (opt.hole_fill_len < 0)\n    vw::vw_throw(vw::ArgumentErr() << \"The hole fill length must not be negative.\\n\"\n                           << usage << general_options);\n  if (opt.fill_search_radius < 0.0)\n    vw::vw_throw(vw::ArgumentErr() << \"The fill search radius must be non-negative.\\n\"\n                           << usage << general_options);\n  if (opt.fill_power < 0.0)\n    vw::vw_throw(vw::ArgumentErr() << \"The fill factor must be non-negative.\\n\"\n                           << usage << general_options);\n    if (opt.fill_percent <= 0.0 || opt.fill_percent > 100.0)\n    vw::vw_throw(vw::ArgumentErr() << \"The fill percent must be in the range (0, 100].\\n\"\n                           << usage << general_options);\n  if (opt.fill_num_passes < 0)\n    vw::vw_throw(vw::ArgumentErr() << \"The number of fill passes must not be negative.\\n\"\n                           << usage << general_options);\n  if (opt.tile_size <= 0)\n    vw::vw_throw(vw::ArgumentErr() << \"The size of a tile in pixels must be positive.\\n\"\n                           << usage << general_options);\n  if (opt.priority_blending_len < 0)\n    vw::vw_throw(vw::ArgumentErr() << \"The priority blending length must not be negative.\\n\"\n                           << usage << general_options);\n\n  // This is a bug fix. The user by mistake passed in an empty projection string.\n  if (!vm[\"t_srs\"].defaulted() && opt.target_srs_string.empty())\n    vw::vw_throw(vw::ArgumentErr()\n             << \"The value of --t_srs is empty. Then it must not be set at all.\\n\");\n\n  // If priority blending is used, need to adjust extra_crop_len accordingly\n  opt.extra_crop_len = std::max(opt.extra_crop_len, 3*opt.priority_blending_len);\n\n  // Make sure no more than one of these options is enabled.\n  int noblend = numNoBlendOptions(opt);\n  if (noblend > 1)\n    vw::vw_throw(vw::ArgumentErr() << \"At most one of the options --first, --last, \"\n         << \"--min, --max, -mean, --stddev, --median, --nmad, --count can be specified.\\n\"\n         << usage << general_options);\n\n  if (opt.geo_tile_size < 0)\n    vw::vw_throw(vw::ArgumentErr()\n             << \"The size of a tile in georeferenced units must not be negative.\\n\"\n             << usage << general_options);\n\n  if (noblend && opt.priority_blending_len > 0) {\n    vw::vw_throw(vw::ArgumentErr()\n       << \"Priority blending cannot happen if any of the statistics DEMs are computed.\\n\"\n       << usage << general_options);\n  }\n\n  if (opt.priority_blending_len > 0 && opt.weights_exp == 2) {\n    vw::vw_out() << \"Increasing --weights-exponent to 3 for smoother blending.\\n\";\n    opt.weights_exp = 3;\n  }\n\n  if (noblend && !opt.first && !opt.last && !opt.min && !opt.max && !opt.mean\n      && opt.save_dem_weight >= 0) {\n    vw::vw_throw(vw::ArgumentErr() << \"Cannot save the weights unless blending is on or one of \"\n                           << \"--first, --last, --min, --max, --mean is invoked.\\n\"\n                           << usage << general_options);\n  }\n\n  if (opt.save_index_map && !opt.first && !opt.last &&\n                            !opt.min && !opt.max && !opt.median && !opt.nmad)\n    vw::vw_throw(vw::ArgumentErr() << \"Cannot save an index map unless one of \"\n                           << \"--first, --last, --min, --max, --median, --nmad is invoked.\\n\"\n                           << usage << general_options);\n\n  if (opt.save_dem_weight >= 0 && opt.save_index_map)\n    vw::vw_throw(vw::ArgumentErr()\n       << \"Cannot save both the index map and the DEM weights at the same time.\\n\"\n       << usage << general_options);\n\n  // For compatibility with the GDAL tools, allow the min and max to be reversed.\n  if (opt.projwin != vw::BBox2()) {\n    if (opt.projwin.min().x() > opt.projwin.max().x())\n      std::swap(opt.projwin.min().x(), opt.projwin.max().x());\n    if (opt.projwin.min().y() > opt.projwin.max().y())\n      std::swap(opt.projwin.min().y(), opt.projwin.max().y());\n  }\n\n  if (opt.weights_blur_sigma < 0.0)\n    vw::vw_throw(vw::ArgumentErr() << \"The value --weights-blur-sigma must be non-negative.\\n\"\n             << usage << general_options);\n\n  if (opt.dem_blur_sigma < 0.0)\n    vw::vw_throw(vw::ArgumentErr() << \"The value --dem-blur-sigma must be non-negative.\\n\"\n             << usage << general_options);\n\n  if (opt.weights_exp <= 0)\n    vw::vw_throw(vw::ArgumentErr() << \"The weights exponent must be positive.\\n\"\n             << usage << general_options);\n\n  if (opt.priority_blending_len > 0 && opt.use_centerline_weights)\n    vw::vw_throw(vw::ArgumentErr()\n             << \"The --priority-blending-length and --use-centerline-weights options \"\n             << \"cannot be used together, as the latter expects no holes in the DEM, \"\n             << \"but the priority blending length works by internally hollowing out \"\n             << \"the non-priority DEMs before blending.\\n\");\n\n  // Cannot have both --dem-list and --dem-list-file. The latter is for backward\n  // compatibility.\n  if (opt.dem_list != \"\" && opt.dem_list_file != \"\")\n    vw::vw_throw(vw::ArgumentErr() << \"Cannot have both --dem-list and --dem-list-file.\\n\");\n  if (opt.dem_list_file != \"\") {\n    opt.dem_list = opt.dem_list_file;\n    opt.dem_list_file = \"\";\n  }\n\n  // Read the DEMs\n  if (opt.dem_list != \"\") { // Get them from a list\n\n    if (!opt.dem_files.empty()) {\n      // Concatenate all the options into a single string\n      std::string extra_list = \"\";\n      for (size_t s = 0; s < opt.dem_files.size(); s++)\n        extra_list += opt.dem_files[s];\n      vw::vw_throw(vw::ArgumentErr()\n                   << \"The DEMs were specified via a list. There were however \"\n                   << \"extraneous files or options passed in: \" << extra_list << \".\\n\");\n    }\n\n    asp::read_list(opt.dem_list, opt.dem_files);\n    if (opt.dem_files.empty())\n      vw::vw_throw(vw::ArgumentErr() << \"No DEM files to mosaic.\\n\");\n\n  } else {  // Get them from the command line\n    if (opt.dem_files.empty())\n      vw::vw_throw(vw::ArgumentErr() << \"No input DEMs were specified.\\n\");\n  }\n\n  if (int(opt.dem_files.size()) <= opt.save_dem_weight)\n    vw::vw_throw(vw::ArgumentErr()\n             << \"Cannot save weights for given index as it is out of bounds.\\n\");\n\n  // When too many things should be done at the same time it is tricky\n  // to have them work correctly. So prohibit that. Let the user run\n  // one operation at a time.\n  int num_ops = (opt.dem_blur_sigma > 0) + (opt.hole_fill_len > 0) +\n                (opt.fill_search_radius > 0) + (opt.erode_len > 0);\n  if (num_ops > 1)\n    vw::vw_throw(vw::ArgumentErr() << \"Cannot fill holes (based on size or search radius), blur, \"\n                           << \"and erode the input DEM at the same time.\\n\");\n\n  if (num_ops > 0 &&\n      (opt.target_srs_string != \"\" || opt.tr > 0 || opt.dem_files.size() > 1 ||\n       opt.priority_blending_len > 0))\n    vw::vw_throw(vw::ArgumentErr() << \"Cannot fill holes (based on size or search radius), \"\n       << \"blur, or erode, if there is more than one input DEM, or reprojection, \"\n       << \"or priority blending is desired. These operations should be done \"\n       << \"one at a time as there may be issues due to the fact each input DEM has \"\n       << \"its own grid size and also the order of operations.\\n\");\n\n  if (opt.priority_blending_len > 0 &&\n      (opt.tap || opt.gdal_tap ||  opt.force_projwin || !opt.projwin.empty() ||\n       !opt.weight_list.empty() || opt.invert_weights || opt.min_weight > 0 ||\n       opt.propagate_nodata))\n    vw::vw_throw(vw::ArgumentErr()\n             << \"The option --priority-blending-length should not be mixed with other \"\n             << \"options. Do each operation individually.\\n\");\n\n  if (opt.tap && opt.gdal_tap)\n    vw::vw_throw(vw::ArgumentErr()\n           << \"The options --tap and --gdal-tap cannot be used together.\\n\");\n\n  // print warning usign vw warning message\n  if (opt.fill_search_radius > 30)\n    vw::vw_out(vw::WarningMessage) << \"The fill search radius is large. \"\n                               << \"This may result in slow execution time.\\n\";\n\n  // Create the output directory\n  vw::create_out_dir(opt.out_prefix);\n\n  // Turn on logging to file\n  asp::log_to_file(argc, argv, \"\", opt.out_prefix);\n\n  if (!vm.count(\"output-nodata-value\")) {\n    // Set a default out_nodata_value, but remember that this is\n    // set internally, not by the user.\n    opt.has_out_nodata = false;\n    opt.out_nodata_value = -std::numeric_limits<float>::max();\n  } else {\n    opt.has_out_nodata = true;\n  }\n\n  // Cast this to float. All our nodata are float.\n  opt.nodata_threshold = float(opt.nodata_threshold);\n\n  if (!std::isnan(opt.nodata_threshold) && noblend)\n    vw::vw_throw(vw::ArgumentErr()\n      << \"The option --nodata-threshold cannot be used together with \"\n      << \"some other invoked options.\\n\");\n\n  // Parse the list of tiles to save. First replace commas and semicolons by a space.\n  std::replace(opt.tile_list_str.begin(), opt.tile_list_str.end(), ',', ' ');\n  std::replace(opt.tile_list_str.begin(), opt.tile_list_str.end(), ';', ' ');\n  opt.tile_list.clear();\n  std::istringstream os(opt.tile_list_str);\n  int val;\n  while (os >> val)\n    opt.tile_list.insert(val);\n\n  // The block size must be a multiple of 16. Handle this early.\n  if (opt.block_size % 16 != 0)\n    vw::vw_throw(vw::ArgumentErr() << \"The block size must be a multiple of 16.\\n\");\n\n  // Handle the option --weight-list.\n  if (opt.weight_list != \"\") {\n\n    if (noblend || opt.priority_blending_len > 0 ||\n        !std::isnan(opt.nodata_threshold))\n      vw::vw_throw(vw::ArgumentErr()\n                << \"Cannot do anything except regular blending with the option \"\n                << \"--weight-list.\\n\");\n\n    asp::read_list(opt.weight_list, opt.weight_files);\n\n    // Must have the same number of weights as DEMs\n    if (opt.weight_files.size() != opt.dem_files.size())\n      vw::vw_throw(vw::ArgumentErr() << \"The number of weights in the file \" << opt.weight_list\n                             << \" must match the number of DEMs.\\n\");\n\n    // Read each DEM temporarily and each weight to get their sizes and georefs. Those\n    // must agree.\n    for (int dem_iter = 0; dem_iter < (int)opt.dem_files.size(); dem_iter++) {\n      vw::DiskImageView<double> dem(opt.dem_files[dem_iter]);\n      vw::DiskImageView<double> weight(opt.weight_files[dem_iter]);\n\n      // Check cols and rows\n      if (dem.cols() != weight.cols() || dem.rows() != weight.rows())\n        vw::vw_throw(vw::ArgumentErr() << \"The DEM \" << opt.dem_files[dem_iter] << \" and its weight \"\n                 << opt.weight_files[dem_iter] << \" have different dimensions.\\n\");\n\n      vw::cartography::GeoReference dem_georef, weight_georef;\n      bool has_dem_georef\n        = vw::cartography::read_georeference(dem_georef, opt.dem_files[dem_iter]);\n      bool has_weight_georef\n      = vw::cartography::read_georeference(weight_georef, opt.weight_files[dem_iter]);\n      if (!has_dem_georef)\n        vw::vw_throw(vw::ArgumentErr() << \"The DEM \" << opt.dem_files[dem_iter]\n                 << \" has no georeference.\\n\");\n      if (!has_weight_georef)\n        vw::vw_throw(vw::ArgumentErr() << \"The weight \" << opt.weight_files[dem_iter]\n                 << \" has no georeference.\\n\");\n\n      // Must have the same wkt string\n      if (dem_georef.get_wkt() != weight_georef.get_wkt())\n        vw::vw_throw(vw::ArgumentErr() << \"The DEM \" << opt.dem_files[dem_iter]\n                 << \" and its weight \" << opt.weight_files[dem_iter]\n                 << \" have different georeferences.\\n\");\n    } // end for each DEM\n  } // end if weight list\n} // End function handleDemMosaicArgs\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Core/DemMosaicParse.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file DemMosaicParse.h\n/// Parse and validate dem_mosaic options\n\n#ifndef __ASP_CORE_DEM_MOSAIC_PARSE_H__\n#define __ASP_CORE_DEM_MOSAIC_PARSE_H__\n\n#include <asp/Core/DemMosaicOptions.h>\n\nnamespace asp {\n\n// Process the dem_mosaic options and sanity checks\nvoid handleDemMosaicArgs(int argc, char *argv[], asp::DemMosaicOptions& opt);\n\n} // end namespace asp\n\n#endif // __ASP_CORE_DEM_MOSAIC_PARSE_H__\n"
  },
  {
    "path": "src/asp/Core/DemUtils.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Core/DemUtils.h>\n#include <vw/FileIO/DiskImageIO.h>\n#include <vw/FileIO/DiskImageView.h>\n#include <vw/FileIO/GdalWriteOptions.h>\n#include <vw/Cartography/CameraBBox.h>\n#include <vw/Cartography/GeoReferenceUtils.h>\n#include <vw/Cartography/PointImageManipulation.h>\n#include <vw/Cartography/GeoTransform.h>\n#include <vw/Image/Filter.h>\n#include <vw/Math/Functors.h>\n\nnamespace fs = boost::filesystem;\n\nnamespace asp {\n\n// Given an image pixel, trace a ray to the ground and find the intersection.\nvoid queryPixel(std::string const& dem_file, vw::CamPtr camera_model,\n                vw::Vector2 const& query_pixel) {\n\n  // The DEM file must be provided\n  if (dem_file.empty())\n    vw::vw_throw(vw::ArgumentErr()\n                 << \"The DEM file must be provided to be able to query a pixel.\\n\");\n    \n  // Read the georef. It must exist.\n  vw::cartography::GeoReference dem_georef;\n  bool has_georef = vw::cartography::read_georeference(dem_georef, dem_file);\n  if (!has_georef)\n    vw::vw_throw(vw::ArgumentErr() << \"The DEM file must have a georeference.\\n\");\n  \n  // Read the no-data\n  double nodata_val = -std::numeric_limits<float>::max(); // note we use a float nodata\n  vw::read_nodata_val(dem_file, nodata_val); // ignore the success status\n\n  // Create the masked DEM\n  vw::ImageViewRef<vw::PixelMask<float>> masked_dem\n    = vw::create_mask(vw::DiskImageView<float>(dem_file), nodata_val);\n  \n  vw::Vector3 cam_ctr = camera_model->camera_center(query_pixel);\n  vw::Vector3 cam_dir = camera_model->pixel_to_vector(query_pixel);\n  double height_guess = vw::cartography::demHeightGuess(masked_dem);\n\n  // Intersect the ray going from the given camera pixel with a DEM\n  // Use xyz_guess as initial guess and overwrite it with the new value\n  bool treat_nodata_as_zero = false;\n  bool has_intersection = false;\n  double dem_height_error_tol = 1e-3; // 1 mm\n  double max_abs_tol = std::min(dem_height_error_tol, 1e-14);\n  double max_rel_tol = max_abs_tol;\n  int num_max_iter = 100;\n  vw::Vector3 xyz_guess(0, 0, 0);\n  vw::Vector3 xyz = vw::cartography::camera_pixel_to_dem_xyz\n    (cam_ctr, cam_dir, masked_dem,\n      dem_georef, treat_nodata_as_zero,\n      has_intersection, dem_height_error_tol, \n      max_abs_tol, max_rel_tol, \n      num_max_iter, xyz_guess, height_guess);\n  \n  double nan = std::numeric_limits<double>::quiet_NaN();\n  vw::Vector3 llh(nan, nan, nan);\n  vw::Vector2 dem_pix(nan, nan);\n  if (has_intersection) {\n    llh = dem_georef.datum().cartesian_to_geodetic(xyz);\n    dem_pix = dem_georef.lonlat_to_pixel(vw::Vector2(llh[0], llh[1]));\n  }\n  vw::vw_out() << std::setprecision(17)\n                << \"DEM intersection point (lon, lat, height): \" \n                << llh[0] << ' ' << llh[1] << ' ' << llh[2] << \"\\n\"\n                << \"DEM intersection pixel (column, row, height): \" \n                << dem_pix[0] << ' ' << dem_pix[1] << ' ' << llh[2] << \"\\n\";\n\n}\n\n// Prepare a DEM file that encompasses a given image and with a given height.\nvoid setupDem(vw::ImageViewRef<float> img,\n              vw::cartography::GeoReference const& image_georef,\n              std::string const& tag, \n              std::string const& out_prefix, \n              double dem_height,\n              // Outputs\n              std::string & dem_path,\n              double & dem_nodata,\n              vw::cartography::GeoReference & dem_georef,\n              vw::ImageView<double> & dem) {\n\n  dem_path = out_prefix + \"-\" + tag + \"-ortho-dem.tif\";\n  dem_nodata = -1e+6;\n  \n  // projection box\n  vw::BBox2 img_bbox = vw::bounding_box(img);\n  vw::BBox2 img_proj_box = image_georef.pixel_to_point_bbox(img_bbox);\n  \n  // Number of pixels and grid size of the DEM. The DEM need not be big. Its\n  // has constant height anyway. \n  dem_georef = image_georef;\n  double num = 100.0;\n  double proj_width = img_proj_box.width();\n  double proj_height = img_proj_box.height();\n  double tr = std::max(proj_width/num, proj_height/num);\n  \n  // Set up the transform\n  vw::Matrix3x3 T = dem_georef.transform();\n  if (T(0,0) <= 0.0 || T(1, 1) >= 0.0) \n    vw::vw_throw(vw::ArgumentErr() \n                 << \"Nonstandard orthoimage encountered. The \"\n                 << \"pixel size must be positive in x and negative in y.\");\n  T(0, 0) = tr; \n  T(1, 1) = -tr;\n  dem_georef.set_transform(T);\n\n  // The DEM box will be a bit bigger to ensure it fully covers the image\n  double s = 5.0;\n  vw::BBox2 dem_proj_box = img_proj_box;\n  dem_proj_box.min() = tr * (floor(dem_proj_box.min()/tr) - vw::Vector2(s, s));\n  dem_proj_box.max() = tr * (ceil(dem_proj_box.max()/tr) + vw::Vector2(s, s));\n  \n  // This crop will make the upper-left DEM pixel agree with dem_proj_box, and\n  // also ensure that the pixel interpretation (PixelAsArea or PixelAsPoint)\n  // is respected.\n  vw::Vector2 pix1 = dem_georef.point_to_pixel(dem_proj_box.min());\n  vw::Vector2 pix2 = dem_georef.point_to_pixel(dem_proj_box.max());\n  vw::BBox2 dem_pix_box;\n  dem_pix_box.grow(pix1);\n  dem_pix_box.grow(pix2);\n  dem_georef = vw::cartography::crop(dem_georef, dem_pix_box);\n\n  // Recompute the corner pixels after the crop\n  pix1 = dem_georef.point_to_pixel(dem_proj_box.min());\n  pix2 = dem_georef.point_to_pixel(dem_proj_box.max());\n  dem_pix_box = vw::BBox2();\n  dem_pix_box.grow(pix1);\n  dem_pix_box.grow(pix2);\n  \n  // Create the DEM with given corner pixels and set all values to the given\n  // height\n  dem = vw::ImageView<double>(dem_pix_box.width(), dem_pix_box.height());\n  for (int col = 0; col < dem.cols(); col++) {\n    for (int row = 0; row < dem.rows(); row++) {\n      dem(col, row) = dem_height;\n    }\n  }\n\n  // Sanity check\n  dem_proj_box = dem_georef.pixel_to_point_bbox(vw::bounding_box(dem));\n  if (!dem_proj_box.contains(img_proj_box)) \n    vw::vw_throw(vw::ArgumentErr() << \"The DEM box does not fully cover the image box.\");\n}\n\n// Prepare a DEM file that encompasses a given image and with a given height,\n// or reuse the one already available if agrees with what is intended.\nvoid setupOrCheckDem(vw::GdalWriteOptions const& options,\n                     vw::ImageViewRef<float> img,\n                     vw::cartography::GeoReference const& image_georef,\n                     std::string const& tag, \n                     std::string const& out_prefix, \n                     double dem_height,\n                     // Outputs\n                     std::string & dem_path) {\n  \n  // Using a DEM in double precision is better than float, as otherwise heights\n  // such as 20.1 are not saved accurately enough as floats (stray digits show\n  // up at the end).\n  vw::ImageView<double> dem;\n  double dem_nodata = -std::numeric_limits<float>::max(); // will change\n  vw::cartography::GeoReference dem_georef;\n\n  // Set it up, but don't write to to disk yet                     \n  setupDem(img, image_georef, tag, out_prefix, dem_height,\n            dem_path, dem_nodata, dem_georef, dem);\n\n  // See how it agrees with what is on disk\n  bool good_already = false;\n  if (fs::exists(dem_path)) {\n\n    vw::DiskImageView<double> disk_dem(dem_path);\n    vw::cartography::GeoReference disk_dem_georef;\n    bool has_georef = read_georeference(disk_dem_georef, dem_path);\n    \n    bool has_same_values = true;\n    for (int col = 0; col < disk_dem.cols(); col++) {\n      for (int row = 0; row < disk_dem.rows(); row++) {\n        if (std::abs(disk_dem(col, row) - dem_height) > 1e-6) {\n          has_same_values = false;\n          break;\n        }\n      }\n      if (!has_same_values) break;\n    } \n    \n    if (has_georef && has_same_values && \n        dem_georef.get_wkt() == disk_dem_georef.get_wkt())\n      good_already = true;\n      \n    // The DEM on disk should not be smaller in extent than the one we want to\n    // write. It is not clear if when tiles are run in parallel the images\n    // are cropped, but in that case the DEM on disk could be bigger, and we\n    // don't want to overwrite the DEM in parallel.\n    vw::BBox2 disk_box = vw::bounding_box(disk_dem);\n    vw::BBox2 disk_proj_box = disk_dem_georef.pixel_to_point_bbox(disk_box);\n    vw::BBox2 curr_bbox = vw::bounding_box(dem);\n    vw::BBox2 curr_proj_box = dem_georef.pixel_to_point_bbox(curr_bbox);\n    if (!disk_proj_box.contains(curr_proj_box))\n      good_already = false;\n  }\n\n  if (!good_already) {\n    vw::vw_out() << \"Writing mapprojection DEM for \" << tag << \" image: \" << dem_path << \"\\n\";\n    bool has_georef = true, has_nodata = true;\n    vw::TerminalProgressCallback tpc(\"asp\", \": \");\n    vw::cartography::block_write_gdal_image(dem_path, dem, has_georef, dem_georef,\n                                            has_nodata, dem_nodata, options, tpc);\n  } else {\n    vw::vw_out() << \"Mapprojection DEM for \" << tag << \" image: \" \n      << dem_path << \"\\n\";\n  }\n}\n\n// Function to convert a masked geodetic vector to a masked altitude vector.\n// This returns the 3rd component of the input vector while taking into\n// account the mask.\nclass MGeodeticToMAltitude: public vw::ReturnFixedType<vw::PixelMask<double>> {\npublic:\n  vw::PixelMask<double> operator()(vw::PixelMask<vw::Vector3> const& v) const {\n    if (!vw::is_valid(v))\n      return vw::PixelMask<double>();\n\n    return vw::PixelMask<double>(v.child()[2]);\n  }\n};\n\n// Function to mask NaN pixels \nclass MaskNaN: public vw::ReturnFixedType<vw::PixelMask<double>> {\npublic:\n  vw::PixelMask<double> operator()(vw::PixelMask<double> const& v) const {\n    if (!vw::is_valid(v) || std::isnan(v.child()))\n      return vw::PixelMask<double>();\n\n    return v;\n  }\n};\n\n// Given two DEMs, warp the second one to the first one's georef, and crop\n// to a pixel box in first DEM's coordinates.\nvw::ImageViewRef<vw::PixelMask<double>> \n  warpCrop(vw::ImageViewRef<double> dem2, \n           double dem2_nodata,\n           vw::cartography::GeoReference const& dem2_georef,\n           vw::cartography::GeoReference const& dem1_georef,\n           vw::BBox2i const& dem1_crop_box,\n           std::string const& interp_type) {\n  \n  if (dem1_crop_box.empty()) \n    vw::vw_throw(vw::ArgumentErr() << \"The two DEMs do not have a common area.\\n\");\n  \n  auto masked_dem2 = vw::create_mask(dem2, dem2_nodata);\n  \n  // Prepare the image for applying the geotransform\n  // TODO(oalexan1): Why go from elevations to geodetic and then back?\n  auto dem2_geo = vw::cartography::dem_to_geodetic(masked_dem2, dem2_georef);\n  auto dem2_alt = vw::per_pixel_filter(dem2_geo, MGeodeticToMAltitude());\n  auto ext = vw::ValueEdgeExtension<vw::PixelMask<double>>(vw::PixelMask<double>());\n  \n  vw::ImageViewRef<vw::PixelMask<double>> warped_dem2;\n  if (interp_type == \"bilinear\") \n    warped_dem2 = vw::cartography::geo_transform(dem2_alt, dem2_georef, dem1_georef, ext,\n                                                 vw::BilinearInterpolation());\n  else if (interp_type == \"bicubic\") \n    warped_dem2 = vw::cartography::geo_transform(dem2_alt, dem2_georef, dem1_georef, ext,\n                                                 vw::BicubicInterpolation());\n  else \n    vw::vw_throw(vw::ArgumentErr() << \"Unknown interpolation type: \" << interp_type << \".\\n\");\n  \n  vw::ImageViewRef<vw::PixelMask<double>> dem2_trans \n    = vw::per_pixel_filter(vw::crop(warped_dem2, dem1_crop_box), MaskNaN());\n  \n  return dem2_trans;\n}\n\n// Given a DEM, estimate the median grid size in x and in y in meters.\n// Given that the DEM heights are in meters as well, having these grid sizes\n// will make it possible to handle heights and grids in same units.\nvoid calcGsd(vw::ImageViewRef<double> const& dem,\n             vw::cartography::GeoReference const& geo, double nodata_val,\n             int sample_col_rate, int sample_row_rate,\n             double & gridx, double & gridy) {\n\n  // Initialize the outputs\n  gridx = 0; gridy = 0;\n\n  // Estimate the median height\n  std::vector<double> heights;\n  for (int col = 0; col < dem.cols(); col += sample_col_rate) {\n    for (int row = 0; row < dem.rows(); row += sample_row_rate) {\n      double h = dem(col, row);\n      if (h == nodata_val) continue;\n      heights.push_back(h);\n    }\n  }\n  double median_height = 0.0;\n  int len = heights.size();\n  if (len > 0) {\n    std::sort(heights.begin(), heights.end());\n    median_height = 0.5*(heights[(len-1)/2] + heights[len/2]);\n  }\n\n  // Find the grid sizes by estimating the Euclidean distances\n  // between points of a DEM at constant height.\n  std::vector<double> gridx_vec, gridy_vec;\n  for (int col = 0; col < dem.cols() - 1; col += sample_col_rate) {\n    for (int row = 0; row < dem.rows() - 1; row += sample_row_rate) {\n\n      // The xyz position at the center grid point\n      vw::Vector2 lonlat = geo.pixel_to_lonlat(vw::Vector2(col, row));\n      vw::Vector3 lonlat3 = vw::Vector3(lonlat(0), lonlat(1), median_height);\n      vw::Vector3 base = geo.datum().geodetic_to_cartesian(lonlat3);\n\n      // The xyz position at the right grid point\n      lonlat = geo.pixel_to_lonlat(vw::Vector2(col+1, row));\n      lonlat3 = vw::Vector3(lonlat(0), lonlat(1), median_height);\n      vw::Vector3 right = geo.datum().geodetic_to_cartesian(lonlat3);\n\n      // The xyz position at the bottom grid point\n      lonlat = geo.pixel_to_lonlat(vw::Vector2(col, row+1));\n      lonlat3 = vw::Vector3(lonlat(0), lonlat(1), median_height);\n      vw::Vector3 bottom = geo.datum().geodetic_to_cartesian(lonlat3);\n\n      gridx_vec.push_back(vw::math::norm_2(right-base));\n      gridy_vec.push_back(vw::math::norm_2(bottom-base));\n    }\n  }\n\n  // Median grid size\n  if (!gridx_vec.empty()) \n    gridx = vw::math::destructive_median(gridx_vec);\n  if (!gridy_vec.empty()) \n    gridy = vw::math::destructive_median(gridy_vec);\n  \n  return;\n}\n\n} //end namespace asp\n"
  },
  {
    "path": "src/asp/Core/DemUtils.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#ifndef __CORE_DEM_UTILS_H__\n#define __CORE_DEM_UTILS_H__\n\n#include <vw/Image/ImageViewRef.h>\n#include <vw/Image/PixelMask.h>\n#include <vw/Camera/CameraModel.h>\n\n#include <fstream>\n#include <iostream>\n#include <string>\n\n// Forward declarations\nnamespace vw {\n  namespace cartography {\n    class GeoReference;\n  }\n  class GdalWriteOptions;\n}\n\nnamespace asp {\n\n// Given an image pixel, trace a ray to the ground and find the intersection.\nvoid queryPixel(std::string const& dem_file, vw::CamPtr camera_model,\n                vw::Vector2 const& query_pixel);\n\n\n// Prepare a DEM file that encompasses a given image and with a given height,\n// or reuse the one already available if agrees with what is intended.\nvoid setupOrCheckDem(vw::GdalWriteOptions const& options,\n                     vw::ImageViewRef<float> img,\n                     vw::cartography::GeoReference const& image_georef,\n                     std::string const& tag, \n                     std::string const& out_prefix, \n                     double dem_height,\n                     // Outputs\n                     std::string & dem_path);\n\n// Given two DEMs, warp the second one to the first one's georef, and crop\n// to a pixel box in first DEM's coordinates.\nvw::ImageViewRef<vw::PixelMask<double>> \n  warpCrop(vw::ImageViewRef<double> dem2, \n           double dem2_nodata,\n           vw::cartography::GeoReference const& dem2_georef,\n           vw::cartography::GeoReference const& dem1_georef,\n           vw::BBox2i const& dem1_crop_box,\n           std::string const& interp_type);\n\n// Estimate the GSD of a DEM in meters\nvoid calcGsd(vw::ImageViewRef<double> const& dem,\n             vw::cartography::GeoReference const& geo, double nodata_val,\n             int sample_col_rate, int sample_row_rate,\n             double & gridx, double & gridy);\n\n} //end namespace asp\n\n#endif//__CORE_DEM_UTILS_H__\n\n"
  },
  {
    "path": "src/asp/Core/DisparityProcessing.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/DisparityProcessing.h>\n#include <vw/Cartography/GeoReferenceUtils.h>\n\n#include <vw/Math/Statistics.h>\n#include <vw/Math/Transform.h>\n#include <vw/Stereo/StereoModel.h>\n#include <vw/FileIO/MatrixIO.h>\n#include <vw/Stereo/StereoView.h>\n#include <vw/Core/Stopwatch.h>\n#include <vw/Cartography/Map2CamTrans.h>\n#include <vw/InterestPoint/InterestPoint.h>\n#include <vw/InterestPoint/MatcherIO.h>\n#include <vw/Math/NewtonRaphson.h>\n\nusing namespace vw;\nusing namespace vw::cartography;\n\nnamespace asp {\n  \n/// Load the D_sub file fully in memory\nbool load_D_sub(std::string const& d_sub_file,\n                ImageView<PixelMask<Vector2f>> & sub_disp) {\n\n  if (!boost::filesystem::exists(d_sub_file))\n    return false;\n  \n  // Check the data type of the file.\n  boost::shared_ptr<DiskImageResource> rsrc(DiskImageResourcePtr(d_sub_file));\n  ChannelTypeEnum disp_data_type = rsrc->channel_type();\n  \n  if (disp_data_type == VW_CHANNEL_INT32) // Cast the integer file to float\n    sub_disp = copy(pixel_cast<PixelMask<Vector2f>>(DiskImageView<PixelMask<Vector2i>>(d_sub_file)));\n  else // File on disk is float\n    sub_disp = copy(DiskImageView<PixelMask<Vector2f>>(d_sub_file));\n  return true;\n}\n\n// Load the low-res disparity and the scale needed to convert it to full-res\nvoid load_D_sub_and_scale(std::string                           const & out_prefix, \n                          std::string                           const & d_sub_file, \n                          vw::ImageView<vw::PixelMask<vw::Vector2f>>  & sub_disp,\n                          vw::Vector2                                 & upsample_scale) {\n  \n  DiskImageView<float> L(out_prefix + \"-L.tif\");\n  \n  if (!load_D_sub(d_sub_file, sub_disp)) {\n    std::string msg = \"Could not read low-res disparity: \" + d_sub_file + \". \" \n     + \"Check your run. See if --skip-low-res-disparity-comp is on.\";\n    vw_throw(ArgumentErr() << msg << \"\\n\");\n  }\n\n  upsample_scale = Vector2(double(L.cols()) / double(sub_disp.cols()),\n                           double(L.rows()) / double(sub_disp.rows()));\n}\n\n// Filter D_sub. All alignment methods are supported.\nvoid filter_D_sub(ASPGlobalOptions const& opt,\n                  vw::TransformPtr tx_left, vw::TransformPtr tx_right,\n                  boost::shared_ptr<vw::camera::CameraModel> left_camera_model, \n                  boost::shared_ptr<vw::camera::CameraModel> right_camera_model,\n                  vw::cartography::Datum const& datum,\n                  std::string const& d_sub_file,\n                  Vector2 const& outlier_removal_params) {\n  \n  if (outlier_removal_params[0] >= 100.0)\n    return; // The user chose to skip outlier filtering\n  \n  vw_out() << \"Filtering outliers in D_sub based on --outlier-removal-params.\\n\";\n\n  double pct = outlier_removal_params[0];\n  double factor = outlier_removal_params[1];\n  double pct_fraction = 1.0 - pct/100.0;\n\n  vw::ImageView<vw::PixelMask<vw::Vector2f>> sub_disp;\n  vw::Vector2 upsample_scale;\n  asp::load_D_sub_and_scale(opt.out_prefix, d_sub_file, sub_disp, upsample_scale);\n\n  // Will save the sub PC file, since we compute these anyway\n  // for the purpose of filtering.\n  vw::ImageView<vw::Vector<double, 4>> sub_pc(sub_disp.cols(), sub_disp.rows());\n  for (int col = 0; col < sub_pc.cols(); col++) {\n    for (int row = 0; row < sub_pc.rows(); row++) {\n      for (int coord = 0; coord < 4; coord++) {\n        sub_pc(col, row)[coord] = 0;\n      }\n    }\n  }\n  \n  // Find the disparity values in x and y\n  std::vector<double> dx, dy;\n  for (int col = 0; col < sub_disp.cols(); col++) {\n    for (int row = 0; row < sub_disp.rows(); row++) {\n      vw::PixelMask<vw::Vector2f> disp = sub_disp(col, row);\n      \n      if (!is_valid(disp)) \n        continue;\n      \n      Vector2 left_pix(col, row);\n      Vector2 right_pix = left_pix + disp.child();\n\n      double diffX = right_pix.x() - left_pix.x();\n      double diffY = right_pix.y() - left_pix.y();\n      dx.push_back(diffX);\n      dy.push_back(diffY);\n    }\n  }\n  \n  // This can happen on occasion with very bad data. Just skip the filtering.\n  if (dx.empty()) {\n    vw::vw_out(vw::WarningMessage) << \"Filtering did not succeed, skipping.\\n\";\n    return;\n  }\n\n  // Find the outlier brackets based on values in x and y\n  double bx = -1.0, ex = -1.0;\n  vw::math::find_outlier_brackets(dx, pct_fraction, factor, bx, ex);\n  vw_out() <<\"Inlier range based on x coordinate of disparity: \" << bx << ' ' << ex <<\".\\n\";\n\n  double by = -1.0, ey = -1.0;\n  vw::math::find_outlier_brackets(dy, pct_fraction, factor, by, ey);\n  vw_out() <<\"Inlier range based on y coordinate of disparity: \" << by << ' ' << ey <<\".\\n\";\n\n  int count = 0;\n  for (int col = 0; col < sub_disp.cols(); col++) {\n    for (int row = 0; row < sub_disp.rows(); row++) {\n      vw::PixelMask<vw::Vector2f> disp = sub_disp(col, row);\n      \n      if (!is_valid(disp)) \n        continue;\n      \n      Vector2 left_pix(col, row);\n      Vector2 right_pix = left_pix + disp.child();\n\n      double diffX = right_pix.x() - left_pix.x();\n      double diffY = right_pix.y() - left_pix.y();\n\n      if (diffX < bx || diffX > ex || diffY < by || diffY > ey) {\n        sub_disp(col, row).invalidate();\n        count++;\n      }\n    }\n  }\n  vw_out() << \"Number (and fraction) of removed outliers by disparity values in x and y: \"\n           << count << \" (\" << double(count)/(sub_disp.cols() * sub_disp.rows()) << \").\\n\";\n  \n  // Set up the stereo model for doing triangulation\n  double angle_tol = vw::stereo::StereoModel\n    ::robust_1_minus_cos(stereo_settings().min_triangulation_angle*M_PI/180);\n  stereo::StereoModel model(left_camera_model.get(), right_camera_model.get(),\n                            angle_tol);\n\n  float HIGH_ERROR = std::numeric_limits<float>::max();\n  ImageView<float> tri_err(sub_disp.cols(), sub_disp.rows());\n  ImageView<float> height(sub_disp.cols(), sub_disp.rows());\n\n  for (int col = 0; col < sub_disp.cols(); col++) {\n    for (int row = 0; row < sub_disp.rows(); row++) {\n      vw::PixelMask<vw::Vector2f> disp = sub_disp(col, row);\n      \n      if (!is_valid(disp)) {\n        tri_err(col, row) = HIGH_ERROR;\n        height(col, row) = HIGH_ERROR;\n        continue;\n      }\n      \n      Vector2 left_pix(col, row);\n      Vector2 right_pix = left_pix + disp.child();\n\n      // Scale to full resolution\n      left_pix  = elem_prod(left_pix, upsample_scale);\n      right_pix = elem_prod(right_pix, upsample_scale);\n\n      // Undo the alignment transform\n      left_pix = tx_left->reverse(left_pix);\n      right_pix = tx_right->reverse(right_pix);\n\n      double err;\n      Vector3 xyz;\n      try {\n        xyz = model(left_pix, right_pix, err);\n      } catch (...) {\n        xyz = Vector3();\n      }\n      \n      // The call returns the zero error and zero xyz to indicate a\n      // failed ray intersection so replace it in those cases with a\n      // very high error.\n      if (err == 0 || xyz == Vector3()) {\n        tri_err(col, row) = HIGH_ERROR;\n        height(col, row) = HIGH_ERROR;\n        continue;\n      }\n        \n      tri_err(col, row) = err;\n\n      // Save the triangulated point\n      Vector<double, 4> P;\n      subvector(P, 0, 3) = xyz;\n      P[3] = err;\n      sub_pc(col, row) = P;\n      \n      Vector3 llh = datum.cartesian_to_geodetic(xyz);\n      height(col, row) = llh[2];\n    }\n  }\n\n  // Put the valid heights in a vector\n  std::vector<double> vals;\n  // Careful below to avoid integer overflow\n  vals.reserve(std::int64_t(sub_disp.cols()) * std::int64_t(sub_disp.rows()));\n  vals.clear();\n  for (int col = 0; col < sub_disp.cols(); col++) {\n    for (int row = 0; row < sub_disp.rows(); row++) {\n      if (height(col, row) >= HIGH_ERROR) continue; // already invalid\n      vals.push_back(height(col, row));\n    }\n  }\n\n  // Print a warning if no valid points were found. Maybe the cameras\n  // are too similar.\n  if (vals.empty()) {\n    vw::vw_out(vw::WarningMessage) << \"No valid points found during triangulation. \"\n     << \"Skipping any further outlier removal. Check the stereo convergence \"\n     << \"angle or consider reducing the value of --min-triangulation-angle.\\n\";\n     return;\n  }\n  \n  // Find the outlier brackets\n  double b = -1.0, e = -1.0;\n  vw::math::find_outlier_brackets(vals, pct_fraction, factor, b, e);\n  vw_out() <<\"Height above datum inlier range: \" << b << ' ' << e <<\".\\n\";\n\n  // Apply the outlier threshold\n  count = 0;\n  for (int col = 0; col < sub_disp.cols(); col++) {\n    for (int row = 0; row < sub_disp.rows(); row++) {\n      if (height(col, row) >= HIGH_ERROR) continue; // already invalid\n      if (height(col, row) < b || height(col, row) > e) {\n        height(col, row)  = HIGH_ERROR;\n        tri_err(col, row) = HIGH_ERROR;\n        count++;\n      }\n    }\n  }\n  vw_out() << \"Number (and fraction) of removed outliers by the height check: \"\n           << count << \" (\" << double(count)/(sub_disp.cols() * sub_disp.rows()) << \").\\n\";\n    \n  // Put the tri errors in a vector\n  vals.clear();\n  for (int col = 0; col < sub_disp.cols(); col++) {\n    for (int row = 0; row < sub_disp.rows(); row++) {\n      if (tri_err(col, row) >= HIGH_ERROR) continue; // already invalid\n      vals.push_back(tri_err(col, row));\n    }\n  }\n\n  // Find the outlier brackets. Since the triangulation errors, unlike\n  // the heights, are usually rather uniform, adjust pct from 95 to\n  // 90.\n  double pct2 = std::max((90.0/95.0) * outlier_removal_params[0], 0.5);\n  double pct_fraction2 = 1.0 - pct2/100.0;\n  // Show some lenience below as due to jitter some errors could be somewhat bigger\n  double factor2 = 2.0 * factor;\n  b = -1.0;\n  e = -1.0;\n  vw::math::find_outlier_brackets(vals, pct_fraction2, factor2, b, e);\n  vw_out() <<\"Triangulation error inlier range: \" << b << ' ' << e <<\".\\n\";\n    \n  // Apply the outlier threshold\n  count = 0;\n  for (int col = 0; col < sub_disp.cols(); col++) {\n    for (int row = 0; row < sub_disp.rows(); row++) {\n      if (tri_err(col, row) >= HIGH_ERROR) continue; // already invalid\n      // We will ignore b, as the triangulation errors are non-negative.\n      if (tri_err(col, row) > e) {\n        height(col, row) = HIGH_ERROR;\n        tri_err(col, row) = HIGH_ERROR;\n        count++;\n      }\n    }\n  }\n  vw_out() << \"Number (and fraction) of removed outliers by the triangulation error check: \"\n           << count << \" (\" << double(count)/(sub_disp.cols() * sub_disp.rows()) << \").\\n\";\n\n  // TODO(oalexan1): Filter by user-given height range and max tri error.\n    \n  // Invalidate the D_sub entries that are outliers\n  for (int col = 0; col < sub_disp.cols(); col++) {\n    for (int row = 0; row < sub_disp.rows(); row++) {\n      if (tri_err(col, row) >= HIGH_ERROR || height(col, row) >= HIGH_ERROR) {\n        sub_disp(col, row).invalidate();\n\n        // Invalidate the point in the cloud\n        subvector(sub_pc(col, row), 0, 3) = Vector3(0.0, 0.0, 0.0);\n        sub_pc(col, row)[3] = 0.0;\n      }\n    }\n  }\n\n  // See how many valid disparity pixels are left\n  int num_valid = 0;\n  for (int col = 0; col < sub_disp.cols(); col++) {\n    for (int row = 0; row < sub_disp.rows(); row++) {\n      if (is_valid(sub_disp(col, row)))\n        num_valid++;\n    }\n  }\n  \n  // If no luck, print a warning and return\n  if (num_valid == 0) {\n    vw::vw_out(vw::WarningMessage) << \"No valid disparity values left after filtering. \"\n        << \"Skipping this step.\\n\";\n    return;\n  }\n\n  vw_out() << \"Writing filtered D_sub: \" << d_sub_file << std::endl;\n  block_write_gdal_image(d_sub_file, sub_disp, opt,\n                         TerminalProgressCallback(\"asp\",\"\\t D_sub: \"));\n\n  std::string pc_sub_file = opt.out_prefix + \"-PC_sub.tif\";\n  vw_out() << \"Writing triangulated point cloud based on D_sub: \" << pc_sub_file << std::endl;\n  block_write_gdal_image(pc_sub_file, sub_pc, opt,\n                         TerminalProgressCallback(\"asp\",\"\\t PC_sub: \"));\n  \n} \n\n// Filter D_sub by reducing its spread around the median. Return the count of\n// removed pixels.\nint dispSpreadFilter(vw::ImageView<vw::PixelMask<vw::Vector2f>> & sub_disp,\n                     double max_disp_spread,\n                     vw::Vector2 const& upsample_scale) {\n  \n  if (max_disp_spread <= 0.0)\n    return 0;\n  \n  vw_out() << \"Filtering outliers in D_sub based on --max-disp-spread.\\n\";\n  \n  std::vector<double> dx, dy;\n  for (int col = 0; col < sub_disp.cols(); col++) {\n    for (int row = 0; row < sub_disp.rows(); row++) {\n      vw::PixelMask<vw::Vector2f> disp = sub_disp(col, row);\n      \n      if (!is_valid(disp)) \n        continue;\n      \n      Vector2 left_pix(col, row);\n      Vector2 right_pix = left_pix + disp.child();\n\n      // Scale to full resolution\n      left_pix  = elem_prod(left_pix, upsample_scale);\n      right_pix = elem_prod(right_pix, upsample_scale);\n\n      double diffX = right_pix.x() - left_pix.x();\n      double diffY = right_pix.y() - left_pix.y();\n      dx.push_back(diffX);\n      dy.push_back(diffY);\n    }\n  }\n  \n  // Do not throw an error, as sometimes the disparity is empty because\n  // some other filtering may have removed all points in degenerate cases.\n  // Just continue with the run and hope for the best.\n  if (dx.empty()) {\n    vw::vw_out(vw::WarningMessage) << \"Empty disparity. Will not continue with filtering.\\n\";\n    return 0;\n  }\n  \n  std::sort(dx.begin(), dx.end());\n  std::sort(dy.begin(), dy.end());\n  double mid_x = dx[dx.size()/2]; // median\n  double mid_y = dy[dy.size()/2];\n  double half = max_disp_spread / 2.0;\n  \n  BBox2 spread_box(mid_x - half, mid_y - half, max_disp_spread, max_disp_spread);\n  \n  // Wipe offending disparities\n  int count = 0;\n  for (int col = 0; col < sub_disp.cols(); col++) {\n    for (int row = 0; row < sub_disp.rows(); row++) {\n      vw::PixelMask<vw::Vector2f> disp = sub_disp(col, row);\n      \n      if (!is_valid(disp)) \n        continue;\n      \n      Vector2 left_pix(col, row);\n      Vector2 right_pix = left_pix + disp.child();\n\n      // Scale to full resolution\n      left_pix  = elem_prod(left_pix, upsample_scale);\n      right_pix = elem_prod(right_pix, upsample_scale);\n\n      double diffX = right_pix.x() - left_pix.x();\n      double diffY = right_pix.y() - left_pix.y();\n\n      Vector2 d(diffX, diffY);\n      if (!spread_box.contains(d)) {\n        count++;\n        sub_disp(col, row).invalidate();\n      }\n    }\n  }\n\n  return count;\n}\n\n// Filter D_sub by reducing its spread around the median. Read from disk, filter,\n// and write back to disk.\nvoid dispSpreadFilterIO(ASPGlobalOptions const& opt, std::string const& d_sub_file,\n                        double max_disp_spread) {\n  \n  if (max_disp_spread <= 0.0)\n    return;\n  \n  vw::ImageView<vw::PixelMask<vw::Vector2f>> sub_disp;\n  vw::Vector2 upsample_scale;\n  asp::load_D_sub_and_scale(opt.out_prefix, d_sub_file, sub_disp, upsample_scale);\n\n  int filteredCount = dispSpreadFilter(sub_disp, max_disp_spread, upsample_scale);\n  double ratio = double(filteredCount) / (sub_disp.cols() * sub_disp.rows());\n  vw_out() << \"Number (and fraction) of removed outliers by the disp spread check: \"\n           << filteredCount << \" (\" << ratio << \").\\n\";\n    \n  vw_out() << \"Writing filtered D_sub: \" << d_sub_file << std::endl;\n  block_write_gdal_image(d_sub_file, sub_disp, opt,\n                         TerminalProgressCallback(\"asp\",\"\\t D_sub: \"));\n} \n\n// Compute an unaligned disparity image from the input disparity image\n// and the image transforms.\n// Note that the output image size is not the same as the input disparity image.\nclass UnalignDisparityView: public ImageViewBase<UnalignDisparityView>{\n  \n  DispImageType    const& m_disparity;\n  vw::TransformPtr const& m_left_transform;\n  vw::TransformPtr const& m_right_transform;\n\n  ASPGlobalOptions const& m_opt;\n  int m_num_cols, m_num_rows;\n  bool m_is_map_projected;\n  std::map <std::pair<int, int>, Vector2> m_unaligned_trans;\npublic:\n  UnalignDisparityView(bool is_map_projected,\n                       DispImageType    const& disparity,\n                       vw::TransformPtr const& left_transform,\n                       vw::TransformPtr const& right_transform,\n                       ASPGlobalOptions const& opt):\n    m_is_map_projected(is_map_projected), \n    m_disparity(disparity), m_left_transform(left_transform), \n    m_right_transform(right_transform), m_opt(opt),\n    m_num_cols(0), m_num_rows(0) {\n\n    // Compute the output image size\n    \n    if (!m_is_map_projected) {\n      // The left image passed as input is the original\n      // unprojected/unaligned one, hence use its size.\n      std::string left_file  = m_opt.in_file1;\n      DiskImageView<float> left_img(left_file);\n      m_num_cols = left_img.cols();\n      m_num_rows = left_img.rows();\n    } else {\n      // Map projected, need to check all the pixel coordinates.\n      // This is going to be slow for large images!\n      BBox2i img_box;\n\n      // Use sampling as this operation is very slow.\n      int sample_len = 10;\n      int num_min_samples = 100;\n      int col_sample = std::max(1, std::min(sample_len, m_disparity.cols()/num_min_samples));\n      int row_sample = std::max(1, std::min(sample_len, m_disparity.rows()/num_min_samples));\n\n      vw_out() << \"\\nEstimating the unaligned disparity dimensions.\\n\";\n      vw::TerminalProgressCallback tpc(\"asp\", \"\\t--> \");\n      double inc_amount = col_sample / std::max(double(m_disparity.cols()), 1.0);\n      tpc.report_progress(0);\n\n      for (int col = 0; col < m_disparity.cols(); col++) {\n\n        // Ensure that the last column is picked\n        if (col % col_sample != 0 && col != m_disparity.cols() - 1) \n          continue;\n\n            for (int row = 0; row < m_disparity.rows(); row++) {\n          \n          // Ensure that the last row is picked\n          if (row % row_sample != 0 && row != m_disparity.rows() - 1) \n            continue;\n\n          // This is quite important to avoid an incorrectly computed img_box.\n          typename DispImageType::pixel_type dpix = m_disparity(col, row);\n          if (!is_valid(dpix))\n            continue;\n\n          // Unalign the left pixel\n          Vector2 left_pix;\n          try {\n            left_pix  = m_left_transform->reverse(Vector2(col, row));\n          } catch (...) {\n            continue;\n          }\n          img_box.grow(left_pix);\n\n          // Save this lookup map for the future\n          m_unaligned_trans[std::make_pair(col, row)] = left_pix;\n        }\n\n        tpc.report_incremental_progress(inc_amount);\n      }\n      tpc.report_finished();\n\n      // Grow the box to account for the fact that we did a sub-sampling\n      // and may have missed some points.\n      Vector2 diff = img_box.max() - img_box.min();\n      if (!img_box.empty()) {\n        img_box.grow(img_box.min() - 0.1*diff);\n        img_box.grow(img_box.max() + 0.1*diff);\n      }\n        \n      m_num_cols = img_box.max().x();\n      m_num_rows = img_box.max().y();\n\n      vw_out() << \"Dimensions are: \" << m_num_cols << ' ' << m_num_rows << \".\\n\";\n    } // Done computing the input image size\n    \n  } // End constructor\n\n  // ImageView interface\n  typedef PixelMask<Vector2f>                          pixel_type;\n  typedef pixel_type                                   result_type;\n  typedef ProceduralPixelAccessor<UnalignDisparityView> pixel_accessor;\n\n  inline int32 cols  () const { return m_num_cols; }\n  inline int32 rows  () const { return m_num_rows; }\n  inline int32 planes() const { return 1; }\n\n  inline pixel_accessor origin() const { return pixel_accessor(*this, 0, 0); }\n\n  inline pixel_type operator()(double /*i*/, double /*j*/, int32 /*p*/ = 0) const {\n    vw_throw(vw::NoImplErr() << \"UnalignDisparityView::operator()(...) is not implemented\");\n    return pixel_type();\n  }\n\n  typedef CropView<ImageView<pixel_type> > prerasterize_type;\n  inline prerasterize_type prerasterize(BBox2i const& bbox) const {\n\n    vw::TransformPtr local_left_transform;\n    vw::TransformPtr local_right_transform;\n\n    // For map-projected images the transforms are not thread-safe,\n    // hence need to make a copy of them.\n    if (!m_is_map_projected) {\n      local_left_transform = m_left_transform;\n      local_right_transform = m_right_transform;\n    }else{\n      local_left_transform = vw::cartography::mapproj_trans_copy(m_left_transform);\n      local_right_transform = vw::cartography::mapproj_trans_copy(m_right_transform);\n    }\n\n    // We will do some averaging\n    int KERNEL_SIZE = 1;\n    \n    BBox2i curr_bbox = bbox;\n    curr_bbox.expand(2*KERNEL_SIZE);\n    curr_bbox.crop(BBox2i(0, 0, cols(), rows()));\n    \n    // Initialize the unaligned disparity values for this tile.\n    ImageView<pixel_type> unaligned_disp(curr_bbox.width(), curr_bbox.height());\n    ImageView<int> count(curr_bbox.width(), curr_bbox.height());\n    for (int col = 0; col < curr_bbox.width(); col++) {\n      for (int row = 0; row < curr_bbox.height(); row++) {\n        unaligned_disp(col, row) = pixel_type();\n        unaligned_disp(col, row).invalidate();\n        count(col, row) = 0;\n      }\n    }\n    \n    // Find the bounding box of pixels we will need from the disparity image.\n    // For mapprojected images the forward() function is not always accurate,\n    // and it is also very slow, hence avoid it.\n    BBox2i disp_bbox;\n    if (!m_is_map_projected) {\n      BBox2i full_disp_bbox = bounding_box(m_disparity);\n      for (int col = 0; col < unaligned_disp.cols(); col++) {\n        for (int row = 0; row < unaligned_disp.rows(); row++) {\n      \n          // Get the pixel coordinate in the output image (left unaligned pixel),\n          // Then get the pixel coordinate in the left input image.\n          Vector2 output_pixel(col + curr_bbox.min()[0], row + curr_bbox.min()[1]);\n          Vector2 left_aligned_pixel;\n          try {\n            left_aligned_pixel = local_left_transform->forward(output_pixel);\n          } catch(...) {\n            // This can fail since we may apply it to pixels outside of range\n            continue;\n          }\n          if (!full_disp_bbox.contains(left_aligned_pixel)) \n            continue;\n          disp_bbox.grow(left_aligned_pixel);\n        }\n      }\n    }else{\n      for (int col = 0; col < m_disparity.cols(); col++) {\n        for (int row = 0; row < m_disparity.rows(); row++) {\n      \n          std::pair<int, int> pix = std::make_pair(col, row);\n          auto it = m_unaligned_trans.find(pix);\n          if (it == m_unaligned_trans.end())\n            continue;\n\n          Vector2 rev = it->second;\n          if (curr_bbox.contains(rev)) {\n            disp_bbox.grow(Vector2(col, row));\n          }\n        }\n      }\n\n      // Grow the box to account for the fact that we did a sub-sampling\n      // and may have missed some points.\n      Vector2 diff = disp_bbox.max() - disp_bbox.min();\n      if (!disp_bbox.empty()) {\n        disp_bbox.grow(disp_bbox.min() - 0.1*diff);\n        disp_bbox.grow(disp_bbox.max() + 0.1*diff);\n      }\n      \n    }\n    \n    // Expand to take into account the sampling to be used below\n    disp_bbox.expand(2*KERNEL_SIZE);\n\n    // Crop to its maximum extent\n    disp_bbox.crop(bounding_box(m_disparity));\n\n    // Rasterize the section of the disparity image that we need for this tile\n    typedef typename DispImageType::pixel_type DispPixelT;\n    ImageView<DispPixelT> disp = crop(m_disparity, disp_bbox);\n\n    for (int col = 0; col < disp.cols(); col++) {\n      for (int row = 0; row < disp.rows(); row++) {\n    \n    DispPixelT dpix = disp(col, row);\n    if (!is_valid(dpix))\n      continue;\n\n    // Go from position in the cropped disparity to the\n    // position in the full disparity.\n    int ucol = col + disp_bbox.min().x();\n    int urow = row + disp_bbox.min().y();\n    \n    // De-warp left and right pixels to be in the camera coordinate system\n    Vector2 left_pix, right_pix;\n    try{\n      left_pix  = local_left_transform->reverse (Vector2(ucol, urow));\n      right_pix = local_right_transform->reverse(Vector2(ucol, urow)\n                                                     + stereo::DispHelper(dpix));\n    } catch(...) {\n      continue;\n    }\n    Vector2 dir = right_pix - left_pix; // disparity value\n    \n    // This averaging is useful in filling tiny holes and avoiding staircasing.\n    // TODO: Use some weights. The closer contribution should have more weight.\n    for (int icol = -KERNEL_SIZE; icol <= KERNEL_SIZE; icol++) {\n      for (int irow = -KERNEL_SIZE; irow <= KERNEL_SIZE; irow++) {\n        int lcol = round(left_pix[0]) + icol;\n        int lrow = round(left_pix[1]) + irow;\n        \n        // shift to be in the domain of the cropped image\n        lcol -= curr_bbox.min()[0];\n        lrow -= curr_bbox.min()[1];\n        if (lcol < 0 || lcol >= curr_bbox.width())  continue;\n        if (lrow < 0 || lrow >= curr_bbox.height()) continue;\n        if (!is_valid(unaligned_disp(lcol, lrow)))\n          unaligned_disp(lcol, lrow).validate();\n        unaligned_disp(lcol, lrow).child() += dir;\n        count(lcol, lrow)++;\n      }\n    }\n    \n      }\n    }\n    \n    for (int col = 0; col < unaligned_disp.cols(); col++) {\n      for (int row = 0; row < unaligned_disp.rows(); row++) {\n    if (count(col, row) == 0)\n      unaligned_disp(col, row).invalidate();\n    else\n      unaligned_disp(col, row) /= double(count(col, row));\n      }\n    }\n    \n    // Use the crop trick to fake that the support region is the same size as\n    // the entire image.\n    return prerasterize_type(unaligned_disp, -curr_bbox.min().x(), \n                             -curr_bbox.min().y(), cols(), rows());\n  }\n  \n  template <class DestT>\n  inline void rasterize(DestT const& dest, BBox2i bbox) const {\n    vw::rasterize(prerasterize(bbox), dest, bbox);\n  }\n}; // End class UnalignDisparityView\n\n// Take a given disparity and make it between the original unaligned images\nvoid unalign_disparity(bool is_map_projected,\n                       DispImageType    const& disparity,\n                       vw::TransformPtr const& left_trans,\n                       vw::TransformPtr const& right_trans,\n                       ASPGlobalOptions const& opt,\n                       std::string      const& disp_file) {\n  Stopwatch sw;\n  sw.start();\n\n  cartography::GeoReference left_georef;\n  bool   has_left_georef = false;\n  bool   has_nodata      = false;\n  double nodata          = -32768.0;\n  vw_out() << \"Unaligning the disparity.\\n\";\n  vw_out() << \"Writing: \" << disp_file << \"\\n\";\n  vw::cartography::block_write_gdal_image\n    (disp_file, \n     UnalignDisparityView(is_map_projected, disparity, left_trans, right_trans, opt),\n     has_left_georef, left_georef,\n     has_nodata, nodata, opt,\n     TerminalProgressCallback(\"asp\", \"\\t--> Undist disp:\"));\n  \n  sw.stop();\n  vw_out() << \"Unaligning disparity elapsed time: \" << sw.elapsed_seconds() << \" s.\\n\";\n  \n}\n\n// A class whose operator() takes as input a pixel in the left aligned image,\n// and returns a pixel in the right aligned image, via interpolation into the\n// disparity. It supports internal sampling to speed up the computation\n// of its inverse via Newton-Raphson.\nstruct DispMap {\n  DispImageType m_disp;\n  vw::ImageViewRef<vw::PixelMask<vw::Vector<float, 2>>> m_interp_disp;\n  \n  // Sampled inverse map. Has one value per patch, so it is coarse.\n  // It is used to find an initial guess for the inverse.\n  vw::ImageView<vw::Vector2> m_inv_map;\n  int m_map_row_bin_len, m_map_col_bin_len;\n  \n  // Extent of values of operator(). It is the size of the right raw image.\n  vw::BBox2i m_map_val_box; \n  \n  typedef typename DispImageType::pixel_type DispPixelT;\n\n  // Constructor\n  DispMap(DispImageType const& disp): m_disp(disp) {\n    \n    DispPixelT invalid_disp; invalid_disp.invalidate();\n    vw::ValueEdgeExtension<DispPixelT> invalid_ext(invalid_disp);\n    m_interp_disp = interpolate(disp, vw::BilinearInterpolation(), invalid_ext);\n    \n    mapSetup();\n  }\n  \n  int cols() const {\n    return m_disp.cols();\n  } \n  \n  int rows() const {\n    return m_disp.rows();\n  }\n  \n  // The map that we want to invert: it maps aligned left pixels to unaligned\n  // (raw) right pixels.  \n  // This will throw an exception if it cannot compute the right pixel.\n  vw::Vector2 operator()(vw::Vector2 const& trans_left_pix) const {\n    \n    // Interpolated disparity\n    DispPixelT dpix = m_interp_disp(trans_left_pix[0], trans_left_pix[1]);\n    if (!is_valid(dpix))\n      vw::vw_throw(vw::ArgumentErr() << \"Invalid disparity encountered.\\n\");\n    \n    vw::Vector2 trans_right_pix = trans_left_pix + stereo::DispHelper(dpix);\n\n    // Need to catch this before it goes to GDAL as it does not play nice with NaN.\n    if (trans_right_pix != trans_right_pix)\n      vw::vw_throw(vw::ArgumentErr() << \"NaN encountered.\\n\");\n    \n    return trans_right_pix;\n  }\n  \n  // Find the bounding box of map values, that is, of operator(). Then find an\n  // approximate tabulated inverse map.\n  // TODO(oalexan1): This could be made generic and moved out. Expose the table\n  // size. It can be empty if not desired.\n  void mapSetup() {\n    \n    // A table that for a right pixel gives an estimate for the left pixel that\n    // maps to it. Its size cannot be big as this is slow. Init as NaN.\n    m_inv_map.set_size(100, 100);\n    double nan = std::numeric_limits<double>::quiet_NaN();\n    for (int col = 0; col < m_inv_map.cols(); col++) {\n      for (int row = 0; row < m_inv_map.rows(); row++) {\n        m_inv_map(col, row) = vw::Vector2(nan, nan);\n      }\n    }\n\n    // Cache the values of operator() as we wil need them twice. Init as NaN.\n    vw::ImageView<vw::Vector2> fwd_map_cache(m_inv_map.cols(), m_inv_map.rows());\n    for (int col = 0; col < m_inv_map.cols(); col++) {\n      for (int row = 0; row < m_inv_map.rows(); row++) {\n        fwd_map_cache(col, row) = vw::Vector2(nan, nan);\n      }\n    }\n\n    int col_step = std::max(1, int(m_disp.cols() / m_inv_map.cols()));\n    int row_step = std::max(1, int(m_disp.rows() / m_inv_map.rows()));\n\n    // Estimate the bounding box of map values    \n    m_map_val_box = vw::BBox2i();\n    vw_out() << \"Sampling the disparity.\\n\";\n    vw::Stopwatch sw;\n    sw.start();\n    vw::TerminalProgressCallback tpc(\"asp\", \"\\t--> \");\n    double inc_amount = 1.0 / (m_disp.cols() / double(col_step));\n    tpc.report_progress(0);\n    for (int col = 0; col < m_disp.cols(); col += col_step) {\n      for (int row = 0; row < m_disp.rows(); row += row_step) {\n        try {\n          vw::Vector2 map_val = operator()(vw::Vector2(col, row));\n          m_map_val_box.grow(map_val);\n          \n          // Cache the values\n          int col_sub = col / col_step;\n          int row_sub = row / row_step;\n          if (col_sub < 0 || col_sub >= m_inv_map.cols() ||\n              row_sub < 0 || row_sub >= m_inv_map.rows())\n            continue;\n          fwd_map_cache(col_sub, row_sub) = map_val;\n        } catch(...) {\n          continue;\n        }\n      }\n      tpc.report_incremental_progress(inc_amount);\n    }\n    tpc.report_finished();\n    sw.stop();\n    vw::vw_out() << \"Sampling elapsed time: \" << sw.elapsed_seconds() << \" s.\\n\";\n    \n    // The box must be non-empty\n    if (m_map_val_box.empty())\n      vw::vw_throw(vw::ArgumentErr() << \"Empty bounding box of function values.\\n\");\n      \n    // Tabulate the inverse map.\n    m_map_col_bin_len = std::max(m_map_val_box.width()  / m_inv_map.cols(), 1);\n    m_map_row_bin_len = std::max(m_map_val_box.height() / m_inv_map.rows(), 1);\n    for (int col = 0; col < m_disp.cols(); col += col_step) {\n      for (int row = 0; row < m_disp.rows(); row += row_step) {\n        try {\n          vw::Vector2 map_input(col, row);\n          \n          int col_sub = col / col_step;\n          int row_sub = row / row_step;\n          if (col_sub < 0 || col_sub >= m_inv_map.cols() ||\n              row_sub < 0 || row_sub >= m_inv_map.rows())\n            continue;\n          vw::Vector2 map_val = fwd_map_cache(col_sub, row_sub);\n          \n          // Must not be nan\n          if (std::isnan(map_val[0]) || std::isnan(map_val[1]))\n            continue;\n            \n          // Find the bin\n          vw::Vector2i bin = findBin(map_val);\n          m_inv_map(bin[0], bin[1]) = map_input;\n        } catch(...) {\n          continue;\n        }    \n      }\n    }\n\n    return;\n  }\n  \n  // Find the bin.\n  // TODO(oalexan1): Make notation more general. Use X for input space, \n  // Y for output space. Remove the \"right\" and \"disp\" from the names.\n  vw::Vector2i findBin(vw::Vector2 const& right_pix) const {\n    \n    int bin_col = round((right_pix[0] - m_map_val_box.min().x()) / double(m_map_col_bin_len));\n    int bin_row = round((right_pix[1] - m_map_val_box.min().y()) / double(m_map_row_bin_len));\n    \n    if (bin_col < 0)\n      bin_col = 0;\n    if (bin_row < 0)\n      bin_row = 0;\n    if (bin_col >= m_inv_map.cols())\n      bin_col = m_inv_map.cols() - 1;\n    if (bin_row >= m_inv_map.rows())\n      bin_row = m_inv_map.rows() - 1;\n      \n    return vw::Vector2(bin_col, bin_row);\n  }\n\n  // The approximate inverse based on tabulated values. It can return nan.\n  vw::Vector2 approxInverse(vw::Vector2 const& right_pix) const {\n    \n    vw::Vector2i bin = findBin(right_pix);\n    \n    // Find the closest non-nan value, starting at the current bin and expanding\n    double nan = std::numeric_limits<double>::quiet_NaN();\n    vw::Vector2 val(nan, nan);\n    int max_dist = 3; // how far to look\n    for (int dist = 0; dist <= max_dist; dist++) {\n      for (int col = bin[0] - dist; col <= bin[0] + dist; col++) {\n        for (int row = bin[1] - dist; row <= bin[1] + dist; row++) {\n          if (col < 0 || col >= m_inv_map.cols() ||\n              row < 0 || row >= m_inv_map.rows())\n            continue;\n          val = m_inv_map(col, row);\n          if (!std::isnan(val[0]) && !std::isnan(val[1]))\n            return val;\n        }\n      }\n    }\n    \n    // This will return nan if no valid value was found\n    return val;  \n  }\n};\n\n// Auxiliary function to compute matches from disparity. A multiplier\n// bigger than 1 will be passed in if too few matches are found.\nvoid noTripletsMatches(ASPGlobalOptions const& opt,\n                       DispImageType    const& disp,\n                       vw::TransformPtr const& left_trans,\n                       vw::TransformPtr const& right_trans,\n                       int max_num_matches, \n                       double multiplier, \n                       // Output\n                       std::vector<vw::ip::InterestPoint> & left_ip, \n                       std::vector<vw::ip::InterestPoint> & right_ip) {\n\n  // Clear the outputs\n  left_ip.clear();\n  right_ip.clear();\n\n  // Use doubles to avoid integer overflow\n  double num_pixels = double(disp.cols()) * double(disp.rows());\n  double den = std::min(double(max_num_matches), num_pixels) * multiplier;\n  double bin_len = sqrt(num_pixels/den);\n  bin_len = std::max(1.0, bin_len);\n\n  int lenx = round(disp.cols()/bin_len); lenx = std::max(1, lenx);\n  int leny = round(disp.rows()/bin_len); leny = std::max(1, leny);\n\n  // Iterate over bins.\n\n  vw_out() << \"Computing interest point matches based on disparity.\\n\";\n  vw::TerminalProgressCallback tpc(\"asp\", \"\\t--> \");\n  double inc_amount = 1.0 / double(lenx);\n  tpc.report_progress(0);\n\n  for (int binx = 0; binx < lenx; binx++) {\n\n    // Pick the disparity at the center of the bin\n    int posx = round((binx+0.5)*bin_len);\n\n    for (int biny = 0; biny < leny; biny++) {\n\n      int posy = round((biny+0.5)*bin_len);\n\n      if (posx >= disp.cols() || posy >= disp.rows()) \n        continue;\n        \n      // Not interpolating into disparity here as we are at an integer pixel.  \n      typedef typename DispImageType::pixel_type DispPixelT;\n      DispPixelT dpix = disp(posx, posy);\n      if (!is_valid(dpix))\n        continue;\n\n      // De-warp left and right pixels to be in the camera coordinate system\n      Vector2 left_pix  = left_trans->reverse (Vector2(posx, posy));\n      Vector2 right_pix = right_trans->reverse(Vector2(posx, posy) \n                                                + stereo::DispHelper(dpix));\n\n      left_ip.push_back(ip::InterestPoint(left_pix.x(), left_pix.y()));\n      right_ip.push_back(ip::InterestPoint(right_pix.x(), right_pix.y()));\n    }\n\n    tpc.report_incremental_progress(inc_amount);\n  }\n  tpc.report_finished();\n  \n  vw_out() << \"Computed \" << left_ip.size() << \" matches.\\n\";\n}\n  \n// Create ip with left_ip being at integer multiple of bin size in the left\n// raw image. Then do the same for right_ip in right raw image. This way\n// there is a symmetry and predictable location for ip. So if three images\n// overlap, a feature can often be seen in many of them whether a given\n// image is left in some pairs or right in some others.\n// TODO(oalexan1): Break this up into two parts: l-r and r-l.\nvoid tripletsMatches(ASPGlobalOptions const& opt,\n                     DispMap          const& dmap,\n                     std::string      const& left_raw_image,\n                     std::string      const& right_raw_image, \n                     vw::TransformPtr const& left_trans,\n                     vw::TransformPtr const& right_trans,\n                     int max_num_matches,\n                     bool append,\n                     // Output\n                     std::vector<vw::ip::InterestPoint> & left_ip, \n                     std::vector<vw::ip::InterestPoint> & right_ip) {\n  \n  if (!append) {\n    // Clear the outputs\n    left_ip.clear();\n    right_ip.clear();\n  }\n\n  // Turn off caching for Map2CamTrans. When the samples are far apart the\n  // caching does not help, and only introduces extra overhead.\n  vw::cartography::Map2CamTrans* left_map2cam = \n    dynamic_cast<vw::cartography::Map2CamTrans*>(left_trans.get());\n  if (left_map2cam != NULL)\n    left_map2cam->set_use_cache(false);\n  vw::cartography::Map2CamTrans* right_map2cam = \n    dynamic_cast<vw::cartography::Map2CamTrans*>(right_trans.get());\n  if (right_map2cam != NULL)\n    right_map2cam->set_use_cache(false);\n\n  // Quantities for inverting the disparity with the Newton-Raphson method. The\n  // step size is a bit large as the disparity may not be smooth.\n  double step = 3.0; // 3 pixels\n  double tol = 0.1; // 0.1 pixels\n  \n  // Load the left and right unaligned image \n  DiskImageView<float> left_img(left_raw_image);\n  DiskImageView<float> right_img(right_raw_image);\n  \n  // Start with the left\n  vw::Stopwatch sw1;\n  sw1.start();\n  {\n    // Use doubles to avoid integer overflow\n    double num_pixels = double(left_img.cols()) * double(left_img.rows());\n    // Multiply by 0.5 as this should yield only half of the total\n    double den = 0.5 * std::min(double(max_num_matches), num_pixels);\n    double bin_len = round(sqrt(num_pixels/den));\n    bin_len = std::max(1.0, bin_len);\n    int lenx = round(left_img.cols()/bin_len); lenx = std::max(1, lenx);\n    int leny = round(left_img.rows()/bin_len); leny = std::max(1, leny);\n    int lr_count = 0;\n\n    vw::TerminalProgressCallback tpc(\"asp\", \"\\t--> \");\n    double inc_amount = 1.0 / double(lenx + 1.0);\n    vw_out() << \"Finding left-to-right matches based on disparity.\\n\";\n    tpc.report_progress(0);\n\n    for (int binx = 0; binx <= lenx; binx++) {\n\n      int posx = binx*bin_len; // integer multiple of bin length\n\n      for (int biny = 0; biny <= leny; biny++) {\n\n        int posy = biny * bin_len; // integer multiple of bin length\n\n        if (posx >= left_img.cols() || posy >= left_img.rows()) \n          continue;\n\n        // Raw and trans left image pixel    \n        Vector2 left_pix(posx, posy);\n        Vector2 trans_left_pix;\n        try {\n          trans_left_pix = left_trans->forward(left_pix);\n        } catch(...) {\n          continue;\n        }\n        \n        if (trans_left_pix[0] < 0 || trans_left_pix[0] >= dmap.cols()) \n          continue;\n        if (trans_left_pix[1] < 0 || trans_left_pix[1] >= dmap.rows()) \n          continue;\n        \n        // TODO(oalexan1): For triplet code, the two cases must be merged\n        // into a single function, as very little differs.\n        vw::Vector2 trans_right_pix;\n        try {\n          trans_right_pix = dmap(trans_left_pix);\n        } catch(...) {\n          continue;\n        }\n        // Skip nan\n        if (std::isnan(trans_right_pix[0]) || std::isnan(trans_right_pix[1]))\n          continue;\n        \n        // Right raw (unaligned) pixel  \n        vw::Vector2 right_pix = right_trans->reverse(trans_right_pix);\n        \n        // Must fit within image box\n        if (right_pix[0] < 0 || right_pix[0] > right_img.cols() - 1) continue;\n        if (right_pix[1] < 0 || right_pix[1] > right_img.rows() - 1) continue;\n        \n        // Store the match pair\n        ip::InterestPoint lip(left_pix.x(), left_pix.y());\n        ip::InterestPoint rip(right_pix.x(), right_pix.y());\n        left_ip.push_back(lip); \n        right_ip.push_back(rip);\n        lr_count++;\n      }\n      \n      tpc.report_incremental_progress(inc_amount);\n    }\n    tpc.report_finished();\n    vw::vw_out() << \"Found \" << lr_count << \" left-to-right matches.\\n\";\n  }\n  sw1.stop();\n  vw_out() << \"Left-to-right matches elapsed time: \" << sw1.elapsed_seconds() << \" s.\\n\";\n  \n  // Now create ip in predictable locations for the right image. Need to \n  // invert the disparity with a solver.\n  vw::Stopwatch sw2;\n  sw2.start();\n  {\n    double num_pixels = double(right_img.cols()) * double(right_img.rows());\n    // Multiply by 0.5 as this should yield only half of the total\n    double den = 0.5 * std::min(double(max_num_matches), num_pixels);\n    double bin_len = round(sqrt(num_pixels/den));\n    bin_len = std::max(1.0, bin_len);\n    int lenx = round(right_img.cols()/bin_len); lenx = std::max(1, lenx);\n    int leny = round(right_img.rows()/bin_len); leny = std::max(1, leny);\n    int rl_count = 0;\n\n    vw_out() << \"Finding right-to-left matches based on disparity.\\n\";\n      \n    vw::TerminalProgressCallback tpc(\"asp\", \"\\t--> \");\n    double inc_amount = 1.0 / double(lenx + 1.0);\n    tpc.report_progress(0);\n\n    for (int binx = 0; binx <= lenx; binx++) {\n\n      int posx = binx * bin_len; // integer multiple of bin length\n\n      for (int biny = 0; biny <= leny; biny++) {\n\n        int posy = biny*bin_len; // integer multiple of bin length\n\n        if (posx >= right_img.cols() || posy >= right_img.rows()) \n          continue;\n        \n        // Raw and trans right image pixel  \n        Vector2 right_pix(posx, posy);  \n        vw::Vector2 trans_right_pix;\n        try {\n          trans_right_pix = right_trans->forward(right_pix);\n        } catch(...) {\n          continue;\n        }\n        \n        // Find the left aligned pixel that maps to this right pixel.\n        // Skip if nan.\n        vw::Vector2 left_guess = dmap.approxInverse(trans_right_pix);\n        if (std::isnan(left_guess[0]) || std::isnan(left_guess[1]))\n          continue;\n        \n        // Refine the guess with Newton-Raphson\n        vw::math::NewtonRaphson nr(dmap);\n        vw::Vector2 trans_left_pix = nr.solve(left_guess, trans_right_pix, step, tol);\n        if (std::isnan(trans_left_pix[0]) || std::isnan(trans_left_pix[1]))\n          continue;\n          \n        // Check if the solution is good enough\n        vw::Vector2 check_right_pix;\n        try {\n          check_right_pix = dmap(trans_left_pix);\n          if (norm_2(check_right_pix - trans_right_pix) > tol)\n            continue;\n        } catch(...) {\n          continue;\n        }\n        \n        // Left raw (unaligned) pixel\n        vw::Vector2 left_pix = left_trans->reverse(trans_left_pix);\n        \n        // Must be in left raw image bounds\n        if (left_pix[0] < 0 || left_pix[0] > left_img.cols() - 1) continue;\n        if (left_pix[1] < 0 || left_pix[1] > left_img.rows() - 1) continue;\n        \n        // Store the match pair\n        vw::ip::InterestPoint lip(left_pix.x(), left_pix.y());\n        vw::ip::InterestPoint rip(right_pix.x(), right_pix.y());\n        left_ip.push_back(lip); \n        right_ip.push_back(rip);\n        rl_count++;\n      }\n      tpc.report_incremental_progress(inc_amount);\n    }\n    tpc.report_finished();\n    vw::vw_out() << \"Found \" << rl_count << \" right-to-left matches.\\n\";\n  } // end considering right-to-left matches\n  sw2.stop();\n  vw::vw_out() << \"Right-to-left matches elapsed time: \" << sw2.elapsed_seconds() << \" s.\\n\";\n\n  vw_out() << \"Computed \" << left_ip.size() << \" total matches.\\n\";\n  \n  // TODO(oalexan1): How to ensure a lot more triplets are kept?\n}\n\n/// Bin the disparities, and from each bin get a disparity value.\n/// This will create a correspondence from the left to right image,\n/// which we save in the match format.\n/// When gen_triplets is true, and there are many overlapping images,\n/// try hard to have many IP with the property that each such IP is seen\n/// in more than two images. This helps with bundle adjustment.\nvoid matchesFromDisp(ASPGlobalOptions const& opt,\n                     DispImageType    const& disp,\n                     std::string      const& left_raw_image,\n                     std::string      const& right_raw_image,\n                     vw::TransformPtr const& left_trans,\n                     vw::TransformPtr const& right_trans,\n                     std::string      const& match_file,\n                     int max_num_matches,\n                     bool gen_triplets, bool is_map_projected,\n                     bool matches_as_txt) {\n\n  std::vector<vw::ip::InterestPoint> left_ip, right_ip;\n  \n  if (gen_triplets) {\n    \n    // Construct the DispMap object. This will do some sampling that will take time.\n    DispMap dmap(disp);\n    \n    // Try to get more matches than expected. All image pairs need to use the\n    // same logic consistently, that is why this is not dynamically adjusted\n    // for the current image pair.\n    double factor = 1.3;\n    int num_matches_extra = factor * max_num_matches;\n    vw::vw_out() << \"Internally multiplying the number of matches by \" << factor\n      << \" to compensate for their usually less than expected number.\\n\";\n    bool append = false;\n    tripletsMatches(opt, dmap, left_raw_image, right_raw_image,\n                    left_trans, right_trans, num_matches_extra, append, \n                    left_ip, right_ip);\n    \n    // If not enough matches, add more. Must compare with the original expected\n    // number of matches. Do not remove the existing matches, as the goal is to\n    // get matches in the same locations for another image pair sharing an image\n    // with this one.\n    if (left_ip.size() < 0.9 * max_num_matches) {\n      vw::vw_out(vw::WarningMessage)\n        << \"The number of matches is way less than expected. Will add more matches. \"\n        << \"The additional ones will not result in triplets. To ensure that, \"\n        << \"rerun this step for all image pairs with a larger requested number \"\n        << \"of matches.\\n\";\n        \n      // This number was carefully chosen to get a good number of matches,\n      // taking into account the ratio between what we exepcted and what we got\n      // before.\n      double ratio = std::max(0.01, double(left_ip.size())/double(num_matches_extra));\n      int num_matches_extra2 = round((max_num_matches - left_ip.size())/ratio);\n      \n      // Ensure we do not pass the same number as before as that would duplicate\n      // the matches.\n      double ratio2 = num_matches_extra2 / double(num_matches_extra);\n      if (std::abs(ratio2 - 1.0) < 0.1)\n        num_matches_extra2 *= 1.1;\n      append = true;\n      tripletsMatches(opt, dmap, left_raw_image, right_raw_image,\n                      left_trans, right_trans, num_matches_extra2, append, \n                      left_ip, right_ip);\n    }\n  \n  } else {\n    \n    // First try naively to get the requested number of matches.\n    double multiplier = 1.0;\n    noTripletsMatches(opt, disp, left_trans, right_trans, max_num_matches, \n                      multiplier, left_ip, right_ip);\n    \n    // If too few matches are found, try again with a larger multiplier,\n    // replacing the earlier matches.\n    double ratio = double(left_ip.size())/double(max_num_matches);\n    ratio = std::max(0.01, ratio);\n    if (ratio < 0.9) {\n      vw_out() << \"The number of matches is way less than requested. \"\n               << \"Trying again.\\n\";\n      multiplier = 1.0/ratio;\n      noTripletsMatches(opt, disp, left_trans, right_trans, max_num_matches, \n                        multiplier, left_ip, right_ip);\n    }\n  }\n  \n  vw_out() << \"Writing: \" << match_file << \"\\n\";\n  ip::write_match_file(match_file, left_ip, right_ip, matches_as_txt);\n}\n  \n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Core/DisparityProcessing.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n#ifndef __ASP_CORE_DISPARITY_PROCESSING_H__\n#define __ASP_CORE_DISPARITY_PROCESSING_H__\n\n#include <vw/Image/ImageView.h>\n#include <vw/Image/ImageViewRef.h>\n#include <vw/Camera/CameraModel.h>\n#include <vw/Math/Transform.h>\n#include <vw/Cartography/Datum.h>\n\nnamespace asp {\n\n  typedef vw::ImageViewRef<vw::PixelMask<vw::Vector2f>> DispImageType;\n\n  // Forward declarations\n  class ASPGlobalOptions;\n\n  /// Load the D_sub file in a consistent format.\n  /// - Returns false if the file does not exist.\n  bool load_D_sub(std::string const& d_sub_file,\n                  vw::ImageView<vw::PixelMask<vw::Vector2f>> & sub_disp);\n\n  \n  // Load the low-res disparity and the scale needed to convert it to full-res\n  void load_D_sub_and_scale(std::string                          const & out_prefix, \n                            std::string                          const & d_sub_file, \n                            vw::ImageView<vw::PixelMask<vw::Vector2f>> & sub_disp,\n                            vw::Vector2                                & upsample_scale);\n  \n  // Filter D_sub. All alignment methods are supported.\n  void filter_D_sub(ASPGlobalOptions const& opt,\n                    vw::TransformPtr tx_left, vw::TransformPtr tx_right,\n                    boost::shared_ptr<vw::camera::CameraModel> left_camera_model, \n                    boost::shared_ptr<vw::camera::CameraModel> right_camera_model,\n                    vw::cartography::Datum const& datum,\n                    std::string const& d_sub_file,\n                    vw::Vector2 const& outlier_removal_params);\n  \n  // Filter D_sub by reducing its spread around the median. Return the count of\n  // removed pixels.\n  int dispSpreadFilter(vw::ImageView<vw::PixelMask<vw::Vector2f>> & sub_disp,\n                      double max_disp_spread,\n                      vw::Vector2 const& upsample_scale);\n  \n  // Filter D_sub by reducing its spread around the median. Read from disk,\n  // filter, write back to disk.\n  void dispSpreadFilterIO(ASPGlobalOptions const& opt, std::string const& d_sub_file,\n                          double max_disp_spread);\n  \n  // Take a given disparity and make it between the original unaligned images\n  void unalign_disparity(bool is_map_projected,\n                         DispImageType    const& disparity,\n                         vw::TransformPtr const& left_trans,\n                         vw::TransformPtr const& right_trans,\n                         ASPGlobalOptions const& opt,\n                         std::string      const& disp_file);\n\n  /// Bin the disparities, and from each bin get a disparity value.\n  /// This will create a correspondence from the left to right image,\n  /// which we save in the match format.\n  /// When gen_triplets is true, and there are many overlapping images,\n  /// try hard to have many IP with the property that each such IP is seen\n  /// in more than two images. This helps with bundle adjustment.\n  void matchesFromDisp(ASPGlobalOptions const& opt,\n                       DispImageType    const& disp,\n                       std::string const& left_raw_image,\n                       std::string const& right_raw_image,\n                       vw::TransformPtr const& left_trans,\n                       vw::TransformPtr const& right_trans,\n                       std::string      const& match_file,\n                       int max_num_matches,\n                       bool gen_triplets, bool is_map_projected,\n                       bool matches_as_txt);\n  \n} // End namespace asp\n\n#endif//__ASP_CORE_DISPARITY_PROCESSING_H__\n"
  },
  {
    "path": "src/asp/Core/EigenTransformUtils.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n/// \\file EigenTransformUtils.cc\n///\n\n#include <asp/Core/EigenTransformUtils.h>\n\nnamespace asp {\n\n// Calculate an affine transform given position and quaternions (in order x, y, z, w).\nEigen::Affine3d calcTransform(double x, double y, double z,\n                              double qx, double qy, double qz, double qw) {\n\n  Eigen::Vector3d ET(x, y, z);\n  Eigen::Quaterniond q(qw, qx, qy, qz);\n  Eigen::Matrix3d ER = q.toRotationMatrix();\n  \n  Eigen::Matrix4d E;\n  E.setIdentity();\n  E.block<3,3>(0,0) = ER;\n  E.block<3,1>(0,3) = ET;\n  \n  Eigen::Affine3d cam_to_world;\n  cam_to_world.matrix() = E;\n  \n  return cam_to_world;\n} \n\n}\n"
  },
  {
    "path": "src/asp/Core/EigenTransformUtils.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#ifndef __CORE_EIGEN_TRANSFORM_UTILS_H__\n#define __CORE_EIGEN_TRANSFORM_UTILS_H__\n\n#include <Eigen/Dense>\n#include <Eigen/Geometry>\n\n// Very low level transform utilities\nnamespace asp {\n\n// Calculate an affine transform given position and quaternions (in order x, y, z, w).\nEigen::Affine3d calcTransform(double x, double y, double z,\n                              double qx, double qy, double qz, double qw);\n\n} //end namespace asp\n\n#endif//__CORE_EIGEN_TRANSFORM_UTILS_H__\n"
  },
  {
    "path": "src/asp/Core/EigenUtils.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n/// \\file EigenUtils.cc\n///\n\n#include <asp/Core/PointUtils.h>\n#include <asp/Core/EigenUtils.h>\n#include <asp/Core/PointCloudRead.h>\n#include <vw/Cartography/PointImageManipulation.h>\n#include <vw/FileIO/DiskImageUtils.h>\n\nusing namespace vw;\nusing namespace vw::cartography;\n\nnamespace asp {\n\nvw::Vector3 cartesian_to_geodetic_adj(vw::cartography::GeoReference const&\n                                      geo, vw::Vector3 xyz){\n\n  // cartesian_to_geodetic() returns longitude between -180 and 180.\n  // Sometimes this is 360 degrees less than what desired,\n  // so here we do an adjustment.\n  // To do: This may not be perfectly fool-proof.\n  vw::Vector3 G  = geo.datum().cartesian_to_geodetic(xyz);\n  vw::Vector2 ll = geo.pixel_to_lonlat(vw::Vector2(0, 0));\n  G(0) += 360*round((ll[0] - G(0))/360.0);\n  return G;\n}\n\nvoid null_check(const char* token, std::string const& line){\n  if (token == NULL)\n    vw_throw( vw::IOErr() << \"Failed to read line: \" << line << \"\\n\" );\n}\n\n// Out of the elements 0, 1,..., n - 1, pick m unique\n// random elements and sort them in increasing order.\n// TODO(oalexan1): See the newly added pick_random_subset() function in VW,\n// but note that that one does not sort the elements.  \nvoid pick_at_most_m_unique_elems_from_n_elems(std::int64_t m, std::int64_t n,\n                                              std::vector<std::int64_t>& elems){\n\n  elems.clear();\n\n  if (m < 1 || n < 1) return;\n  if (m > n) m = n;\n\n  std::vector<std::int64_t> all(n);\n  for (std::int64_t i = 0; i < n; i++) all[i] = i;\n\n  // Swap a randomly selected element from index 0 to j with the one\n  // at index j. Then decrement j. Done after m elements are\n  // processed.\n  for (std::int64_t j = n-1; j >= n-m; j--){\n    std::int64_t r = rand()%(j+1); // 0 <= r <= j\n    std::swap(all[r], all[j]);\n  }\n\n  elems.resize(m);\n  for (std::int64_t i = 0; i < m; i++) elems[i] = all[n-m+i];\n  std::sort(elems.begin(), elems.end());\n\n}\n\n// Return at most m random points out of the input point cloud.\nvoid random_pc_subsample(std::int64_t m, Eigen::MatrixXd& points){\n\n  std::int64_t n = points.cols();\n  std::vector<std::int64_t> elems;\n  pick_at_most_m_unique_elems_from_n_elems(m, n, elems);\n  m = elems.size();\n\n  for (std::int64_t col = 0; col < m; col++){\n    for (std::int64_t row = 0; row < DIM; row++)\n      points(row, col) = points(row, elems[col]);\n  }\n  points.conservativeResize(Eigen::NoChange, m);\n}\n\nstd::int64_t load_csv_aux(std::string const& file_name, std::int64_t num_points_to_load,\n                          vw::BBox2 const& lonlat_box,\n                          bool calc_shift, vw::Vector3 & shift,\n                          vw::cartography::GeoReference const& geo, CsvConv const& csv_conv,\n                          bool & is_lola_rdr_format, double & median_longitude,\n                          bool verbose, Eigen::MatrixXd & data) {\n\n  // Note: The input CsvConv object is responsible for parsing out the\n  //       type of information contained in the CSV file.\n\n  is_lola_rdr_format = false;\n\n  std::int64_t num_total_points = csv_file_size(file_name);\n\n  std::string sep_str = csv_separator();\n  const char* sep = sep_str.c_str();\n\n  const std::int64_t bufSize = 1024;\n  char temp[bufSize];\n  std::ifstream file( file_name.c_str() );\n  if (!file)\n    vw_throw(vw::IOErr() << \"Unable to open file: \" << file_name << \"\\n\");\n\n  // We will randomly pick or not a point with probability load_ratio\n  double load_ratio = (double)num_points_to_load/std::max(1.0, (double)num_total_points);\n\n  data.conservativeResize(DIM+1, std::min(num_points_to_load, num_total_points));\n\n  // Peek at the first valid line and see how many elements it has\n  std::string line;\n  while ( getline(file, line, '\\n') ) {\n    if (is_valid_csv_line(line))\n      break;\n  }\n\n  file.clear(); file.seekg(0, std::ios_base::beg); // go back to start of file\n  strncpy(temp, line.c_str(), bufSize);\n  const char* token = strtok (temp, sep);\n  std::int64_t numTokens = 0;\n  while (token != NULL){\n    numTokens++;\n    token = strtok (NULL, sep);\n  }\n  if (numTokens < 3)\n    vw::vw_throw(vw::IOErr() << \"Expecting at least three fields on each \"\n                          << \"line of file: \" << file_name << \"\\n\");\n\n  // This is a fatal error\n  if (!csv_conv.is_configured())\n    vw::vw_throw(vw::ArgumentErr() << \"Must set option --csv-format.\\n\");\n\n  // TODO(oalexan1): We parse these guessed file types manually but we should\n  // use a CsvConv object to do it!\n\n  if (is_lola_rdr_format && geo.datum().semi_major_axis() != geo.datum().semi_minor_axis() ){\n    vw_throw( vw::ArgumentErr() << \"The CSV file was detected to be in the\"\n              << \" LOLA RDR format, yet the datum semi-axes are not equal \"\n              << \"as expected for the Moon.\\n\" );\n  }\n\n  bool shift_was_calc = false;\n  bool is_first_line  = true;\n  std::int64_t points_count = 0;\n  std::vector<double> longitudes;\n  line = \"\";\n  while (getline(file, line, '\\n')) {\n\n    if (!is_first_line && !line.empty() && line[0] == '#' && verbose) {\n      vw::vw_out() << \"Ignoring line starting with comment: \" << line << std::endl;\n      continue;\n    }\n    \n    if (points_count >= num_points_to_load)\n      break;\n\n    if (!is_valid_csv_line(line))\n      continue;\n\n    // Randomly skip a percentage of points\n    double r = (double)std::rand()/(double)RAND_MAX;\n    if (r > load_ratio)\n      continue;\n\n    // We went with C-style file reading instead of C++ in this instance\n    // because we found it to be significantly faster on large files.\n\n    vw::Vector3 xyz;\n    double lon = 0.0, lat = 0.0;\n\n    if (csv_conv.is_configured()){\n\n      // Parse custom CSV file with given format string\n      bool success;\n      CsvConv::CsvRecord vals = csv_conv.parse_csv_line(is_first_line, success, line);\n      if (!success)\n        continue;\n\n      xyz = csv_conv.csv_to_cartesian(vals, geo);\n\n      // Decide if the point is in the box. Also save for the future\n      // the longitude of the point, we'll use it to compute the mean longitude.\n      vw::Vector2 lonlat = csv_conv.csv_to_lonlat(vals, geo);\n      lon = lonlat[0]; // Needed for mean calculation below\n      lat = lonlat[1];\n\n      // TODO: We really need a lonlat bbox function that handles wraparound!!!!!!\n      // Skip points outside the given box\n      if (!lonlat_box.empty() && !lonlat_box.contains(lonlat)\n                              && !lonlat_box.contains(lonlat+vw::Vector2(360,0))\n                              && !lonlat_box.contains(lonlat-vw::Vector2(360,0))) {\n        continue;\n      }\n\n    } else if (!is_lola_rdr_format) {\n\n      // lat,lon,height format\n      double height;\n\n      strncpy(temp, line.c_str(), bufSize);\n      const char* token = strtok(temp, sep); null_check(token, line);\n      std::int64_t ret = sscanf(token, \"%lg\", &lat);\n\n      token = strtok(NULL, sep); null_check(token, line);\n      ret += sscanf(token, \"%lg\", &lon);\n\n      token = strtok(NULL, sep); null_check(token, line);\n      ret += sscanf(token, \"%lg\", &height);\n\n      // Be prepared for the fact that the first line may be the header.\n      if (ret != 3){\n        if (!is_first_line){\n          vw_throw( vw::IOErr() << \"Failed to read line: \" << line << \"\\n\" );\n        }else{\n          is_first_line = false;\n          continue;\n        }\n      }\n      is_first_line = false;\n\n      // Skip points outside the given box\n      if (!lonlat_box.empty() && !lonlat_box.contains(vw::Vector2(lon, lat)))\n        continue;\n\n      vw::Vector3 llh( lon, lat, height );\n      xyz = geo.datum().geodetic_to_cartesian( llh );\n      if ( xyz == vw::Vector3() || !(xyz == xyz) ) continue; // invalid and NaN check\n\n    }else{\n\n      // Load a RDR_*PointPerRow_csv_table.csv file used for LOLA. Code\n      // copied from Ara Nefian's lidar2dem tool.\n      // We will ignore lines which do not start with year (or a value that\n      // cannot be converted into an integer greater than zero, specifically).\n\n      std::int64_t year, month, day, hour, min;\n      double lat, rad, sec, is_invalid;\n\n      strncpy(temp, line.c_str(), bufSize);\n      const char* token = strtok(temp, sep); null_check(token, line);\n\n      std::int64_t ret = sscanf(token, \"%lld-%lld-%lldT%lld:%lld:%lg\", &year, &month, &day, &hour,\n                       &min, &sec);\n      if( year <= 0 )\n        continue;\n\n      token = strtok(NULL, sep); null_check(token, line);\n      ret += sscanf(token, \"%lg\", &lon);\n\n      token = strtok(NULL, sep); null_check(token, line);\n      ret += sscanf(token, \"%lg\", &lat);\n      token = strtok(NULL, sep); null_check(token, line);\n      ret += sscanf(token, \"%lg\", &rad);\n      rad *= 1000; // km to m\n\n      // Scan 7 more fields, until we get to the is_invalid flag.\n      for (std::int64_t i = 0; i < 7; i++)\n        token = strtok(NULL, sep); null_check(token, line);\n      ret += sscanf(token, \"%lg\", &is_invalid);\n\n      // Be prepared for the fact that the first line may be the header.\n      if (ret != 10){\n        if (!is_first_line){\n          vw_throw( vw::IOErr() << \"Failed to read line: \" << line << \"\\n\" );\n        }else{\n          is_first_line = false;\n          continue;\n        }\n      }\n      is_first_line = false;\n\n      if (is_invalid)\n        continue;\n\n      // Skip points outside the given box\n      if (!lonlat_box.empty() && !lonlat_box.contains(vw::Vector2(lon, lat)))\n        continue;\n\n      vw::Vector3 lonlatrad( lon, lat, 0 );\n\n      xyz = geo.datum().geodetic_to_cartesian( lonlatrad );\n      if ( xyz == vw::Vector3() || !(xyz == xyz) )\n        continue; // invalid and NaN check\n\n      // Adjust the point so that it is at the right distance from\n      // planet center.\n      xyz = rad*(xyz/norm_2(xyz));\n    }\n\n    if (calc_shift && !shift_was_calc){\n      shift = xyz;\n      shift_was_calc = true;\n    }\n\n    for (std::int64_t row = 0; row < DIM; row++)\n      data(row, points_count) = xyz[row] - shift[row];\n    data(DIM, points_count) = 1;\n\n    points_count++;\n    longitudes.push_back(lon);\n\n    // Throw an error if the lon and lat are not within bounds.\n    // Note that we allow some slack for lon, perhaps the point\n    // cloud is say from 350 to 370 degrees.\n    if (std::abs(lat) > 90.0)\n      vw_throw(vw::ArgumentErr() << \"Invalid latitude value: \"\n               << lat << \" in \" << file_name << \"\\n\");\n    if (lon < -360.0 || lon > 2*360.0)\n      vw_throw(vw::ArgumentErr() << \"Invalid longitude value: \"\n               << lon << \" in \" << file_name << \"\\n\");\n  }\n  data.conservativeResize(Eigen::NoChange, points_count);\n\n  median_longitude = 0.0;\n  std::sort(longitudes.begin(), longitudes.end());\n  if (longitudes.size() > 0) \n    median_longitude = longitudes[longitudes.size()/2];\n\n  return num_total_points;\n}\n\n// Load a csv file\nvoid load_csv(std::string const& file_name,\n                 std::int64_t num_points_to_load,\n                 vw::BBox2 const& lonlat_box,\n                 bool calc_shift,\n                 vw::Vector3 & shift,\n                 vw::cartography::GeoReference const& geo,\n                 CsvConv const& csv_conv,\n                 bool & is_lola_rdr_format,\n                 double & median_longitude,\n                 bool verbose,\n                 Eigen::MatrixXd & data){\n\n  std::int64_t num_total_points = load_csv_aux(file_name, num_points_to_load,\n                                      lonlat_box,\n                                      calc_shift, shift,\n                                      geo, csv_conv, is_lola_rdr_format,\n                                      median_longitude, verbose, data);\n  \n  std::int64_t num_loaded_points = data.cols();\n  if (!lonlat_box.empty()                    &&\n      num_loaded_points < num_points_to_load &&\n      num_loaded_points < num_total_points){\n    // We loaded too few points. Just load them all, as CSV files are\n    // not too large, we will drop extraneous points later.\n    load_csv_aux(file_name, num_total_points, lonlat_box,\n                 calc_shift, shift,\n                 geo, csv_conv, is_lola_rdr_format,\n                 median_longitude,\n                 false, // Skip repeating same messages\n                 data);\n  }\n  \n  return;\n}\n\n// Load a DEM\ntemplate<typename DemPixelType>\nvoid load_dem_pixel_type(std::string const& file_name,\n                         std::int64_t num_points_to_load, vw::BBox2 const& lonlat_box,\n                         bool calc_shift, vw::Vector3 & shift,\n                         bool verbose, Eigen::MatrixXd & data){\n  \n  data.conservativeResize(DIM+1, num_points_to_load);\n\n  vw::cartography::GeoReference dem_geo;\n  bool has_georef = vw::cartography::read_georeference( dem_geo, file_name );\n  if (!has_georef)\n    vw_throw(vw::ArgumentErr() << \"DEM: \" << file_name\n                               << \" does not have a georeference.\\n\");\n\n  vw::DiskImageView<DemPixelType> dem(file_name);\n  DemPixelType nodata = std::numeric_limits<DemPixelType>::quiet_NaN();\n  {\n    boost::shared_ptr<vw::DiskImageResource> dem_rsrc( new vw::DiskImageResourceGDAL(file_name) );\n    if (dem_rsrc->has_nodata_read())\n      nodata = dem_rsrc->nodata_read();\n  }\n  \n  // Load only points within lonlat_box\n  vw::BBox2i pix_box;\n  if (!lonlat_box.empty()){\n    // Need a lot of catch statements, as lonlat_to_pixel() can throw things\n    try { pix_box.grow(dem_geo.lonlat_to_pixel(lonlat_box.min())); } catch(...){}\n    try { pix_box.grow(dem_geo.lonlat_to_pixel(lonlat_box.max())); } catch(...){}\n    try {\n      pix_box.grow(dem_geo.lonlat_to_pixel(vw::Vector2(lonlat_box.min().x(),\n                                                       lonlat_box.max().y())));\n    }catch(...){}\n    try{\n      pix_box.grow(dem_geo.lonlat_to_pixel(vw::Vector2(lonlat_box.max().x(),\n                                                       lonlat_box.min().y())));\n    }catch(...){}\n    pix_box.expand(1); // to counteract casting to int\n    pix_box.crop(bounding_box(dem));\n  }\n  if (pix_box.empty())\n    pix_box = bounding_box(dem);\n\n  // We will randomly pick or not a point with probability load_ratio.\n  // Use int64_t to avoid integer overflow\n  std::int64_t num_points = std::int64_t(pix_box.width()) * std::int64_t(pix_box.height());\n  double load_ratio = (double)num_points_to_load/std::max(1.0, (double)num_points);\n\n  bool shift_was_calc = false;\n  std::int64_t points_count = 0;\n\n  vw::TerminalProgressCallback tpc(\"asp\", \"\\t--> \");\n  double inc_amount = 1.0 / double(pix_box.width() );\n  if (verbose)\n    tpc.report_progress(0);\n\n  for (std::int64_t i = pix_box.min().x(); i < pix_box.max().x(); i++ ) {\n\n    for (std::int64_t j = pix_box.min().y(); j < pix_box.max().y(); j++ ) {\n      if (points_count >= num_points_to_load)\n        break;\n\n      double r = (double)std::rand()/(double)RAND_MAX;\n      if (r > load_ratio)\n        continue;\n\n      DemPixelType h = dem(i, j);\n      if ( h == nodata || std::isnan(h) || std::isinf(h) )\n        continue;\n      \n      vw::Vector2 lonlat = dem_geo.pixel_to_lonlat( vw::Vector2(i,j) );\n\n      // Skip points outside the given box\n      if (!lonlat_box.empty() && !lonlat_box.contains(lonlat))\n        continue;\n\n      vw::Vector3 llh( lonlat.x(), lonlat.y(), h );\n      vw::Vector3 xyz = dem_geo.datum().geodetic_to_cartesian( llh );\n      if ( xyz == vw::Vector3() || !(xyz == xyz) )\n        continue; // invalid and NaN check\n\n      if (calc_shift && !shift_was_calc){\n        shift = xyz;\n        shift_was_calc = true;\n      }\n\n      for (std::int64_t row = 0; row < DIM; row++)\n        data(row, points_count) = xyz[row] - shift[row];\n      data(DIM, points_count) = 1; // Extend to be a homogenous coordinate\n\n      points_count++;\n    } // end y loop\n\n    if (verbose)\n      tpc.report_incremental_progress( inc_amount );\n  } // end x loop\n  if (verbose)\n    tpc.report_finished();\n\n  data.conservativeResize(Eigen::NoChange, points_count);\n\n}\n\n// Load a DEM\nvoid load_dem(std::string const& file_name,\n              std::int64_t num_points_to_load, vw::BBox2 const& lonlat_box,\n              bool calc_shift, vw::Vector3 & shift,\n              bool verbose, Eigen::MatrixXd & data){\n\n  boost::shared_ptr<vw::DiskImageResource> dem_rsrc( new vw::DiskImageResourceGDAL(file_name) );\n  vw::ImageFormat image_fmt = dem_rsrc->format();\n  if (image_fmt.channel_type == vw::VW_CHANNEL_FLOAT64) {\n    // We could have loaded this DEM as float, the difference in the\n    // final transform is very minor if we do so, but it is better to\n    // use the full input accuracy.\n    load_dem_pixel_type<double>(file_name,  \n                                num_points_to_load, lonlat_box,  \n                                calc_shift, shift,  \n                                verbose, data);\n  }else{\n    load_dem_pixel_type<float>(file_name,  \n                               num_points_to_load, lonlat_box,  \n                               calc_shift, shift,  \n                               verbose, data);\n  }\n}\n\nvw::int64 load_pc_aux(std::string const& file_name,\n                      std::int64_t num_points_to_load,\n                      vw::BBox2 const& lonlat_box,\n                      bool calc_shift,\n                      vw::Vector3 & shift,\n                      vw::cartography::GeoReference const& geo,\n                      bool verbose, Eigen::MatrixXd & data){\n\n  data.conservativeResize(DIM+1, num_points_to_load);\n\n  // To do: Is it faster to to do for_each?\n  vw::ImageViewRef<vw::Vector3> point_cloud = read_asp_point_cloud_3(file_name);\n\n  // We will randomly pick or not a point with probability load_ratio\n  // Use std::int64_t to avoid integer overflow.\n  vw::int64 num_total_points = std::int64_t(point_cloud.cols()) * std::int64_t(point_cloud.rows());\n  double load_ratio = (double)num_points_to_load/std::max(1.0, (double)num_total_points);\n\n  bool shift_was_calc = false;\n  vw::int64 points_count = 0;\n\n  vw::TerminalProgressCallback tpc(\"asp\", \"\\t--> \");\n  double inc_amount = 1.0 / double(point_cloud.rows() );\n  if (verbose) tpc.report_progress(0);\n\n  for (std::int64_t j = 0; j < point_cloud.rows(); j++ ) {\n\n    for ( std::int64_t i = 0; i < point_cloud.cols(); i++ ) {\n\n      if (points_count >= num_points_to_load)\n        break;\n\n      double r = (double)std::rand()/(double)RAND_MAX;\n      if (r > load_ratio)\n        continue;\n\n      vw::Vector3 xyz = point_cloud(i, j);\n      if ( xyz == vw::Vector3() || !(xyz == xyz) )\n        continue; // invalid and NaN check\n\n      if (calc_shift && !shift_was_calc){\n        shift = xyz;\n        shift_was_calc = true;\n      }\n\n      // Skip points outside the given box\n      if (!lonlat_box.empty()){\n        vw::Vector3 llh = geo.datum().cartesian_to_geodetic(xyz);\n        if ( !lonlat_box.contains(subvector(llh, 0, 2)))\n          continue;\n      }\n\n      for (std::int64_t row = 0; row < DIM; row++)\n        data(row, points_count) = xyz[row] - shift[row];\n      data(DIM, points_count) = 1;\n\n      points_count++;\n    }\n    if (verbose) tpc.report_incremental_progress( inc_amount );\n  }\n  if (verbose) tpc.report_finished();\n\n  data.conservativeResize(Eigen::NoChange, points_count);\n\n  return num_total_points;\n}\n\nvoid load_pc(std::string const& file_name,\n             std::int64_t num_points_to_load,\n             vw::BBox2 const& lonlat_box,\n             bool calc_shift,\n             vw::Vector3 & shift,\n             vw::cartography::GeoReference const& geo,\n             bool verbose, Eigen::MatrixXd & data){\n\n  vw::int64 num_total_points = load_pc_aux(file_name, num_points_to_load,\n                                          lonlat_box, calc_shift, shift,\n                                          geo, verbose, data);\n\n  std::int64_t num_loaded_points = data.cols();\n  if (!lonlat_box.empty()                    &&\n      num_loaded_points < num_points_to_load &&\n      num_loaded_points < num_total_points){\n\n    // We loaded too few points. Try harder. Need some care here as to not run\n    // out of memory.\n    num_points_to_load = std::max(4*num_points_to_load, std::int64_t(10000000));\n    if (verbose)\n      vw::vw_out() << \"Too few points were loaded. Trying again.\" << std::endl;\n    load_pc_aux(file_name, num_points_to_load, lonlat_box,\n                calc_shift, shift, geo, verbose, data);\n  }\n\n}\n\n// Find the best-fitting plane to a set of points. It will throw an\n// error if called with less than 3 points.\nvoid bestFitPlane(const std::vector<Eigen::Vector3d>& points, Eigen::Vector3d& centroid,\n                  Eigen::Vector3d& plane_normal) {\n  \n  std::int64_t num_points = points.size();\n  if (num_points < std::int64_t(3)) \n    vw_throw( ArgumentErr() << \"Need 3 points to fit a plane.\\n\");\n\n  // Copy coordinates to  matrix in Eigen format\n  Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> coord(3, num_points);\n\n  for (std::int64_t i = 0; i < num_points; i++) coord.col(i) = points[i];\n\n  // calculate centroid\n  centroid = Eigen::Vector3d(coord.row(0).mean(), coord.row(1).mean(), coord.row(2).mean());\n\n  // subtract centroid\n  for (std::int64_t it = 0; it < 3; it++)\n    coord.row(it).array() -= centroid(it);\n\n  // We only need the left-singular matrix here\n  // https://math.stackexchange.com/questions/99299/best-fitting-plane-given-a-set-of-points\n  auto svd = coord.jacobiSvd(Eigen::ComputeThinU | Eigen::ComputeThinV);\n\n  plane_normal = svd.matrixU().rightCols<1>();\n}\n  \n// Compute a rigid transform between n point correspondences.\n// There exists another version of this using vw matrices\n// in VisionWorkbench called find_3D_transform().  \nvoid computeRigidTransform(const std::vector<Eigen::Vector3d>& src,\n                           const std::vector<Eigen::Vector3d>& dst,\n                           Eigen::Matrix3d & rot, Eigen::Vector3d & trans){\n\n  // Initialize the outputs\n  rot   = Eigen::Matrix3d::Zero(3, 3);\n  trans = Eigen::Vector3d::Zero(3, 1);\n    \n  assert(src.size() == dst.size());\n  std::int64_t pairSize = src.size();\n  Eigen::Vector3d center_src(0, 0, 0), center_dst(0, 0, 0);\n  for (std::int64_t i=0; i<pairSize; ++i){\n    center_src += src[i];\n    center_dst += dst[i];\n  }\n  center_src /= (double)pairSize;\n  center_dst /= (double)pairSize;\n  \n  Eigen::MatrixXd S(pairSize, 3), D(pairSize, 3);\n  for (std::int64_t i=0; i<pairSize; ++i){\n    for (std::int64_t j=0; j<3; ++j)\n      S(i, j) = src[i][j] - center_src[j];\n    for (std::int64_t j=0; j<3; ++j)\n      D(i, j) = dst[i][j] - center_dst[j];\n  }\n  Eigen::MatrixXd Dt = D.transpose();\n  Eigen::Matrix3d H = Dt*S;\n  Eigen::Matrix3d W, U, V;\n  \n  Eigen::JacobiSVD<Eigen::MatrixXd> svd;\n  Eigen::MatrixXd H_(3, 3);\n  for (std::int64_t i=0; i<3; ++i) for (std::int64_t j=0; j<3; ++j) H_(i, j) = H(i, j);\n  svd.compute(H_, Eigen::ComputeThinU | Eigen::ComputeThinV );\n  if (!svd.computeU() || !svd.computeV()) {\n    // Nothing to do, return the identity transform\n    return;\n  }\n\n  Eigen::Matrix3d Vt = svd.matrixV().transpose();\n\n  rot   = svd.matrixU()*Vt;\n  trans = center_dst - rot*center_src;\t\n}\n\n/// Read a 4x4 rotation + translation + scale transform from disk.\nvoid read_transform(Eigen::MatrixXd & T, std::string const& transFile){\n\n  T = Eigen::MatrixXd::Zero(4, 4);\n    \n  vw::vw_out() << \"Reading: \" << transFile << std::endl;\n  std::ifstream is(transFile.c_str());\n  for (std::int64_t row = 0; row < T.rows(); row++){\n    for (std::int64_t col = 0; col < T.cols(); col++){\n      double a;\n      if (! (is >> a) )\n        vw_throw( vw::IOErr() << \"Failed to read initial transform from: \"\n                  << transFile << \"\\n\" );\n      T(row, col) = a;\n    }\n  }\n  \n  if (T(3, 3) != 1) {\n    vw_throw( vw::ArgumentErr()\n              << \"The transform must have a 1 in the lower-right corner.\\n\");\n  }\n  \n}\n\n/// Write a 4x4 rotation + translation + scale transform to disk.\nvoid write_transform(Eigen::MatrixXd const& T, std::string const& transFile){\n  if (T(3, 3) != 1) {\n    vw_throw( vw::ArgumentErr()\n              << \"The initial transform must have a 1 in the lower-right corner.\\n\");\n  }\n\n  std::ofstream tf(transFile.c_str());\n  tf.precision(17);\n  tf << T << \"\\n\";\n  tf.close();\n}\n  \n// Apply a rotation + translation transform to a vector3\nvw::Vector3 apply_transform_to_vec(Eigen::MatrixXd const& transform,\n                                   vw::Vector3 const& p){\n  Eigen::Vector4d P;\n  for (size_t it = 0; it < 3; it++) P[it] = p[it];\n  P[3] = 1;\n  P = transform * P;\n  vw::Vector3 q;\n  for (size_t it = 0; it < 3; it++) q[it] = P[it];\n  return q;\n}\n\n}\n"
  },
  {
    "path": "src/asp/Core/EigenUtils.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#ifndef __CORE_EIGEN_UTILS_H__\n#define __CORE_EIGEN_UTILS_H__\n#include <vw/Cartography/Datum.h>\n#include <vw/Cartography/GeoReference.h>\n\n#include <Eigen/Dense>\n\n#include <fstream>\n#include <iostream>\n#include <sstream>\n#include <string>\n\n// A set of routines kept here because they use Eigen, and a set of routine\n// auxiliary to the routines using Eigen. \nnamespace asp {\n\nclass CsvConv; // Forward declaration\n  \n// Note: Just changing 3 to 2 below won't be enough to make the code\n// work with 2D point clouds. There are some Vector3's all over the place.\nconst int DIM = 3;\n\n// Return at most m random points out of the input point cloud.\nvoid random_pc_subsample(std::int64_t m, Eigen::MatrixXd& points);\n  \n// Load a csv file, perhaps sub-sampling it along the way\nvoid load_csv(std::string const& file_name,\n              std::int64_t num_points_to_load,\n              vw::BBox2 const& lonlat_box,\n              bool calc_shift,\n              vw::Vector3 & shift,\n              vw::cartography::GeoReference const& geo,\n              asp::CsvConv const& csv_conv,\n              bool & is_lola_rdr_format,\n              double & median_longitude, bool verbose,\n              Eigen::MatrixXd & data);\n  \n// Load a DEM, perhaps subsampling it along the way\nvoid load_dem(std::string const& file_name,\n              std::int64_t num_points_to_load, vw::BBox2 const& lonlat_box,\n              bool calc_shift, vw::Vector3 & shift, bool verbose, \n              Eigen::MatrixXd & data);\n\n// Load an ASP point cloud, perhaps subsampling it along the way  \nvoid load_pc(std::string const& file_name,\n             std::int64_t num_points_to_load,\n             vw::BBox2 const& lonlat_box,\n             bool calc_shift,\n             vw::Vector3 & shift,\n             vw::cartography::GeoReference const& geo,\n             bool verbose, Eigen::MatrixXd & data);\n\n// Find the best-fitting plane to a set of points. It will throw an\n// error if called with less than 3 points.\nvoid bestFitPlane(const std::vector<Eigen::Vector3d>& points, Eigen::Vector3d& centroid,\n                  Eigen::Vector3d& plane_normal);\n\n  // Compute a rigid transform between n point correspondences.\n// There exists another version of this using vw matrices\n// in VisionWorkbench called find_3D_transform().  \nvoid computeRigidTransform(const std::vector<Eigen::Vector3d>& src,\n                           const std::vector<Eigen::Vector3d>& dst,\n                           Eigen::Matrix3d & rot, Eigen::Vector3d & trans);\n\n/// Read a 4x4 rotation + translation + scale transform from disk.\nvoid read_transform(Eigen::MatrixXd & T, std::string const& transFile);\n\n/// Write a 4x4 rotation + translation + scale transform to disk.\nvoid write_transform(Eigen::MatrixXd const& T, std::string const& transFile);\n\n// Apply a rotation + translation transform to a Vector3\nvw::Vector3 apply_transform_to_vec(Eigen::MatrixXd const& T, vw::Vector3 const& p);\n\n} //end namespace asp\n\n#endif//__CORE_EIGEN_UTILS_H__\n"
  },
  {
    "path": "src/asp/Core/EnvUtils.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Core/EnvUtils.h>\n#include <vw/Core/Exception.h>\n\n#include <vw/vw_config.h> // must come before asp_config.h, defines VW_BOOST_VERSION\n#include <asp/asp_config.h> // defines ASP_HAVE_PKG_ISIS\n\n#include <boost/filesystem.hpp>\n#include <boost/dll.hpp>\n\n#include <cstdlib>\n#include <iostream>\n#include <unistd.h>\n\nnamespace fs = boost::filesystem;\n\nnamespace asp {\n\n// Set an env var and check for success. Use the setenv() function,\n// which is not problematic, as putenv().\nvoid setEnvVar(std::string const& var, std::string const& val) {\n  \n  bool overwrite = true;\n   if (setenv(var.c_str(), val.c_str(), overwrite) != 0)\n    vw::vw_throw(vw::ArgumentErr() << \"Failed to set environment variable: \" << var\n              << \" to value: \" << val << \".\\n\");\n}\n\n// A function to set the environmental variables ISISROOT, QT_PLUGIN_PATH,\n// GDAL_DATA, and PROJ_LIB. In packaged build mode, set these with the help of\n// the base directory of the distribution. These are needed especially for the\n// conda build, when the ASP executables don't have a wrapper around them. For\n// the tarball build, some of this logic is duplicated in the script in\n// BinaryBuilder/dist-add/libexec/libexec-funcs.sh which is then called by the\n// wrapper.\nvoid set_asp_env_vars() {\n    \n  // Find the path to the base of the package and see if it works.\n  std::string base_dir = boost::dll::program_location().parent_path().parent_path().string();\n\n#if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1\n  // Set ISISROOT and check for IsisPreferences\n  if (!fs::exists(base_dir + \"/IsisPreferences\")) {\n    base_dir = ASP_DEPS_DIR; // This is defined at compile time\n    if (!fs::exists(base_dir + \"/IsisPreferences\")) {\n      // If nothing works, try the ASP_DEPS_DIR env variable\n      char * ptr = getenv(\"ASP_DEPS_DIR\");\n      if (ptr) \n        base_dir = ptr;\n      if (ptr == NULL || !fs::exists(base_dir + \"/IsisPreferences\")) {\n        vw::vw_throw(vw::ArgumentErr() << \"Cannot find the directory having IsisPreferences. \"\n                     << \"Try setting it as the environmental variable ASP_DEPS_DIR.\");\n      }\n    }\n  }\n  asp::setEnvVar(\"ISISROOT\", base_dir);\n  if (!fs::exists(std::string(getenv(\"ISISROOT\")) + \"/IsisPreferences\")) \n    vw::vw_throw(vw::ArgumentErr() << \"Cannot find IsisPreferences in \"\n                 << getenv(\"ISISROOT\"));\n#endif // ASP_HAVE_PKG_ISIS\n  \n  // Set QT_PLUGIN_PATH as the path to /plugins\n  asp::setEnvVar(\"QT_PLUGIN_PATH\", base_dir + \"/plugins\");\n  if (!fs::exists(std::string(getenv(\"QT_PLUGIN_PATH\")))) {\n    base_dir = ASP_DEPS_DIR; // This is defined at compile time\n    asp::setEnvVar(\"QT_PLUGIN_PATH\", base_dir + \"/plugins\");\n  }\n  if (!fs::exists(std::string(getenv(\"QT_PLUGIN_PATH\"))))\n    vw::vw_throw(vw::ArgumentErr() << \"Cannot find Qt plugins in \" \n                 << getenv(\"QT_PLUGIN_PATH\"));\n\n  // Set GDAL_DATA and check for share/gdal\n  asp::setEnvVar(\"GDAL_DATA\", base_dir + \"/share/gdal\");  \n  if (!fs::exists(std::string(getenv(\"GDAL_DATA\")))) \n    vw::vw_throw(vw::ArgumentErr() << \"Cannot find GDAL data in \"\n                 << getenv(\"GDAL_DATA\"));\n\n  // Set GDAL_DRIVER_PATH and check for share/gdal. There are two locations, because\n  // BinaryBuilder moves the plugins from lib/gdalplugins to lib.\n  // TODO(oalexan1): Figure out why this happens.\n  asp::setEnvVar(\"GDAL_DRIVER_PATH\", base_dir + \"/lib/gdalplugins:\" + base_dir + \"/lib\");  \n  \n  // Older proj api\n  // Set PROJ_LIB and check for share/proj\n  asp::setEnvVar(\"PROJ_LIB\", base_dir + \"/share/proj\");\n  if (!fs::exists(std::string(getenv(\"PROJ_LIB\")))) \n    vw::vw_throw(vw::ArgumentErr() << \"Cannot find PROJ data in \"\n                 << getenv(\"PROJ_LIB\"));\n\n  // Newer proj api\n  // Set PROJ_DATA and check for share/proj\n  asp::setEnvVar(\"PROJ_DATA\", base_dir + \"/share/proj\");\n  if (!fs::exists(std::string(getenv(\"PROJ_DATA\")))) \n    vw::vw_throw(vw::ArgumentErr() << \"Cannot find PROJ data in \"\n                 << getenv(\"PROJ_DATA\"));\n\n  // Force the US English locale as long as ASP is running to avoid\n  // ISIS choking on a decimal separator which shows up as a comma for \n  // some reason.\n  asp::setEnvVar(\"LC_ALL\", \"en_US.UTF-8\");  \n  asp::setEnvVar(\"LANG\", \"en_US.UTF-8\");\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Core/EnvUtils.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#ifndef __CORE_ENV_UTILS_H__\n#define __CORE_ENV_UTILS_H__\n\n#include <string>\n\nnamespace asp {\n\n// Set an env var and check for success. Use the setenv() function,\n// which is not problematic, as putenv().\nvoid setEnvVar(std::string const& var, std::string const& val);\n\n// Set some env vars needed by all ASP programs. See the .cc for details.\nvoid set_asp_env_vars();\n\n} //end namespace asp\n\n#endif//__CORE_ENV_UTILS_H__\n\n"
  },
  {
    "path": "src/asp/Core/FileUtils.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Core/FileUtils.h>\n\n#include <vw/FileIO/FileTypes.h>\n#include <vw/FileIO/FileUtils.h>\n#include <vw/Cartography/GeoReference.h>\n#include <vw/Core/Log.h>\n\n#include <boost/filesystem/path.hpp>\n#include <boost/filesystem/operations.hpp>\n#include <boost/algorithm/string/case_conv.hpp>\n#include <boost/algorithm/string/predicate.hpp>\n#include <boost/algorithm/string/replace.hpp>\n\n#include <fstream>\n#include <sstream>\n\nnamespace fs = boost::filesystem;\n\nnamespace asp {\n\n  // Return true if the first file exists and is newer than all of the other files.\n  bool first_is_newer(std::string              const& test_file, \n                      std::vector<std::string> const& other_files) {\n    if (!boost::filesystem::exists(test_file))\n      return false;\n    std::time_t test_time = boost::filesystem::last_write_time(test_file);\n    for (size_t i = 0; i < other_files.size(); i++) {\n      if (other_files[i] == \"\") // Ignore blank files that were passed in.\n        continue;\n      if (!boost::filesystem::exists(other_files[i]))\n        return false;\n      std::time_t t = boost::filesystem::last_write_time(other_files[i]);\n      if (test_time < t)\n        return false;\n    }\n    return true;\n  }\n\n  bool first_is_newer(std::string const& test_file, std::string const& f1) {\n    std::vector<std::string> vec(1);\n    vec[0] = f1;\n    return first_is_newer(test_file, vec);\n  }\n  bool first_is_newer(std::string const& test_file, \n                      std::string const& f1, std::string const& f2) {\n    std::vector<std::string> vec(2);\n    vec[0] = f1;  vec[1] = f2;\n    return first_is_newer(test_file, vec);\n  }\n  bool first_is_newer(std::string const& test_file, \n                      std::string const& f1, std::string const& f2,\n                      std::string const& f3, std::string const& f4) {\n    std::vector<std::string> vec(4);\n    vec[0] = f1;  vec[1] = f2;\n    vec[2] = f2;  vec[3] = f4;\n    return first_is_newer(test_file, vec);\n  }\n\n  // Read a vector of doubles from a file\n  void read_vec(std::string const& filename, std::vector<double> & vals) {\n    vals.clear();\n    std::ifstream ifs(filename.c_str());\n    if (!ifs.good()) \n      vw::vw_throw(vw::ArgumentErr() << \"Could not open file: \" << filename);\n    \n    double val;\n    while (ifs >> val)\n      vals.push_back(val);\n    ifs.close();\n  }\n\n  void read_2d_points(std::string const& file, std::vector<vw::Vector2> & points) {\n\n    std::ifstream ifs(file.c_str());\n    if (!ifs.good())\n      vw::vw_throw(vw::ArgumentErr() << \"Could not open file for reading: \" << file << \"\\n\");\n  \n    double a, b;\n    points.clear();\n    while (ifs >> a >> b){\n      vw::Vector2 p(a, b);\n      points.push_back(p);\n    }\n  }\n\n  void read_3d_points(std::string const& file,\n                      std::vector<vw::Vector3> & points) {\n\n    std::ifstream ifs(file.c_str());\n    if (!ifs.good())\n      vw::vw_throw(vw::ArgumentErr() << \"Could not open file for reading: \" << file << \"\\n\");\n\n    double a, b, c;\n    points.clear();\n    while (ifs >> a >> b >> c) {\n      vw::Vector3 p(a, b, c);\n      points.push_back(p);\n    }\n  }\n\n// Write a vector of strings from a file, one per line.\nvoid write_list(std::string const& file, std::vector<std::string> const & list) {\n  std::ofstream fh(file.c_str());\n  for (size_t i = 0; i < list.size(); i++)\n    fh << list[i] << std::endl;\n  fh.close();\n}\n\n// Read a vector of strings from a file, with spaces and newlines acting as separators.\n// Throw an exception if the list is empty.\nvoid read_list(std::string const& file, std::vector<std::string> & list) {\n  list.clear();\n  std::ifstream fh(file);\n  std::string val;\n  while (fh >> val)\n    list.push_back(val);\n\n  if (list.empty())\n    vw::vw_throw(vw::ArgumentErr() << \"Could not read any entries from: \" << file << \".\\n\");\n\n  fh.close();\n}\n\n// Read the target name (planet name) from the plain text portion of an ISIS cub\n// file or from a CSM file. Will return \"UNKNOWN\" if the target name cannot be\n// found.\nstd::string read_target_name(std::string const& filename) {\n\n  std::string target = \"UNKNOWN\";\n  \n  std::ifstream handle;\n  handle.open(filename.c_str());\n  if (handle.fail())\n    return target; // No luck\n  \n  std::string line;\n  int count = 0;\n  while (getline(handle, line, '\\n')) {\n    if (line == \"End\") \n      return target; // No luck, reached the end of the text part of the cub\n\n    // If the input file is a .tif rather than a .cub, it could have several\n    // GB and not have this info anyway, so exist early.\n    count++;\n    if (count > 1000)\n      break;\n    \n    // Find the line having TargetName\n    boost::to_lower(line);\n    if (line.find(\"targetname\") == std::string::npos) \n      continue;\n\n    // Replace the equal sign with a space and read the second\n    // non-space entry from this line\n    boost::replace_all(line, \"=\", \" \");\n    std::istringstream iss(line);\n    std::string val;\n    if (! (iss >> val >> target)) \n      continue;\n\n    // Wipe any commas, quotes, or spaces (this is for CSM files)\n    boost::replace_all(target, \",\", \"\");\n    boost::replace_all(target, \"\\\"\", \"\");\n    boost::replace_all(target, \" \", \"\");\n    \n    boost::to_upper(target);\n    \n    // If empty, return UNKNOWN\n    if (target == \"\")\n       target = \"UNKNOWN\";\n    \n    // Found a target, no need to go on   \n    return target;\n  }\n  \n  return target;\n}\n\n// Given a vector of files, with each file being an image, camera,\n// or a text file having images or cameras, return the list of\n// all found images and cameras. This is a local auxiliary \n// function not exposed in the header file.\nvoid readImagesCamsOrLists(std::vector<std::string> const & in,\n                           std::vector<std::string>       & out) {\n\n  // Wipe the output\n  out.clear();\n\n  for (size_t i = 0; i < in.size(); i++) {\n\n    if (vw::has_image_extension(in[i]) || vw::has_cam_extension(in[i])) {\n    \n      // Simply append the image or camera to the list\n      out.push_back(in[i]);\n      \n    } else {\n\n      // Read the list, append all entries from it\n      std::string ext = vw::get_extension(in[i]);\n      if (ext == \".txt\") {\n\n        std::vector<std::string> list;\n        asp::read_list(in[i], list);\n        for (size_t j = 0; j < list.size(); j++) \n            out.push_back(list[j]);\n            \n      } else if (boost::iends_with(in[i], \".adjust\")) {\n        vw::vw_throw(vw::ArgumentErr() << \"The file \" << in[i] << \" is an adjustment. \"\n                  << \"Use the original cameras and the option \"\n                  << \"--bundle-adjust-prefix.\\n\");\n      } else {\n        vw::vw_throw(vw::ArgumentErr() << \"Unknown file type passed on input: \"\n          << in[i] << \".\\n\");\n      }\n    }\n  }\n\n  return;\n} \n\n// Given a list of images/cameras and/or lists of such things, put the images\n// and the cameras in separate vectors.\nvoid separate_images_from_cameras(std::vector<std::string> const& inputs,\n                                  std::vector<std::string>      & images,\n                                  std::vector<std::string>      & cameras,\n                                  bool ensure_equal_sizes) {\n\n  // There are N images and possibly N camera paths.\n  // There are several situations:\n  // 1. img1.cub ... imgN.cub for ISIS with non-proj images\n  // 2. img1.tif ... imgN.tif img1.cub ... imgN.cub for ISIS with proj images\n  // 3. img1.tif ... imgN.tif for RPC with embedded RPC in the tif files \n  // 4. img1.tif ... imgN.tif cam1 .... camN for all other cases.\n\n  // Consider the case when some of the inputs are lists of images/cameras\n  std::vector<std::string> inputs2;\n  readImagesCamsOrLists(inputs, inputs2);\n\n  // Check that all files exist\n  for (size_t i = 0; i < inputs2.size(); i++) {\n    if (!fs::exists(inputs2[i])) {\n      vw::vw_throw(vw::ArgumentErr() << \"Cannot find the file: \" << inputs2[i] << \".\\n\");\n      return;\n    }\n  }\n  \n  // Images and cameras may be interleaved. Separate them.\n  images.clear();\n  cameras.clear();\n  for (size_t i = 0; i < inputs2.size(); i++) {\n    if (vw::has_image_extension(inputs2[i]))\n      images.push_back(inputs2[i]);\n    else if (vw::has_cam_extension(inputs2[i]))\n      cameras.push_back(inputs2[i]);\n    else if (boost::iends_with(inputs2[i], \".adjust\"))\n      vw::vw_throw(vw::ArgumentErr() << \"The file \" << inputs2[i] << \" is an adjustment. \"\n                << \"Use the original cameras and the option \"\n                << \"--bundle-adjust-prefix.\\n\");  \n    else \n      vw::vw_throw(vw::ArgumentErr() << \"Unknown file type passed on input: \"\n                << inputs2[i] << \".\\n\");\n  }\n\n  // Then concatenate them again, but with the images first and the cameras\n  // second.\n  inputs2.clear();\n  for (size_t i = 0; i < images.size(); i++)  \n    inputs2.push_back(images[i]);\n  for (size_t i = 0; i < cameras.size(); i++) \n    inputs2.push_back(cameras[i]);\n  images.clear();\n  cameras.clear();\n\n  // See if we have cub files and/or camera files (.cub files are also cameras)  \n  bool has_cub    = false;\n  bool has_nocub  = false;\n  bool has_cam    = false;\n  for (size_t i = 0; i < inputs2.size(); i++) {\n    std::string ext = vw::get_extension(inputs2[i]);\n    if (ext == \".cub\")\n      has_cub   = true;\n    if (ext != \".cub\")\n      has_nocub = true;\n    if (vw::has_cam_extension(inputs2[i]))\n      has_cam   = true;\n  }\n  \n  // Let the first half of the data be images, and the second half be cameras.\n  // Unless we have only .cub files, when all the data are images.\n  // Special case: if all are .cub and we have an even number >= 4, check if\n  // the first half are map-projected (have georef). This handles cam2map\n  // asp_map output where map-projected .cub + camera .cub are all .cub.\n  bool all_cub_mapproj = false;\n  if (has_cub && !has_nocub && inputs2.size() >= 4 && inputs2.size() % 2 == 0) {\n    int half = inputs2.size() / 2;\n    bool first_half_has_georef = true;\n    for (int i = 0; i < half; i++) {\n      vw::cartography::GeoReference georef;\n      bool has_geo = false;\n      try {\n        has_geo = vw::cartography::read_georeference(georef, inputs2[i]);\n      } catch (...) {}\n      if (!has_geo) {\n        first_half_has_georef = false;\n        break;\n      }\n    }\n    if (first_half_has_georef) {\n      all_cub_mapproj = true;\n      vw::vw_out() << \"Detected map-projected .cub inputs with camera .cub files.\\n\";\n    }\n  }\n  if (((has_cub && !has_nocub) && !all_cub_mapproj) || (!has_cam)) {\n    // Only cubes (non-mapprojected), or only non-cameras, cases 1 and 3 above\n    for (size_t i = 0; i < inputs2.size(); i++)\n      images.push_back(inputs2[i]);\n  } else {\n    // Images and cameras (cameras could be cubes)\n    if (inputs2.size() % 2 != 0)\n      vw::vw_throw(vw::ArgumentErr() << \"Expecting as many images as cameras.\\n\");\n    \n    int half = inputs2.size()/2;\n    for (int i = 0;    i < half;   i++) images.push_back(inputs2[i]);\n    for (int i = half; i < 2*half; i++) cameras.push_back(inputs2[i]);\n  }\n  \n  // Verification for images\n  for (size_t i = 0; i < images.size(); i++) {\n    if (!vw::has_image_extension(images[i])) {\n      vw::vw_throw(vw::ArgumentErr() \n                   << \"Expecting an image, got: \" << images[i] << \".\\n\");\n    }\n  }\n\n  // Verification for cameras\n  for (size_t i = 0; i < cameras.size(); i++) {\n    if (!vw::has_cam_extension(cameras[i])) {\n      vw::vw_throw(vw::ArgumentErr() \n                   << \"Expecting a camera, got: \" << cameras[i] << \".\\n\");\n    }\n  }\n\n  if (images.size() != cameras.size() && !cameras.empty()) {\n    vw::vw_throw(vw::ArgumentErr() \n                 << \"Expecting the number of images and cameras to agree.\\n\");\n  }\n\n  if (ensure_equal_sizes) {\n    while (cameras.size() < images.size())\n      cameras.push_back(\"\");\n  }\n\n  return;\n}\n\n// Parse a matrix of fixed-size vectors from a stream. Each line has vec_size\n// doubles. Empty lines (or lines starting with a space) separate matrix rows.\nvoid read_matrix_from_stream(std::string const& source, std::istream & str,\n                             int vec_size,\n                             // Output\n                             std::vector<std::vector<std::vector<double>>> & mat) {\n  mat.clear();\n  bool first_row = true;\n  int num_cols = 0;\n  std::vector<std::vector<double>> row;\n  char line[2048];\n  while (str.getline(line, 2048)) {\n    // An empty line or one starting with a space is a separator\n    if ((line[0] == '\\0' || line[0] == ' ') && !row.empty()) {\n      if (first_row) {\n        num_cols = row.size();\n        first_row = false;\n      }\n      if (num_cols != int(row.size()))\n        vw::vw_throw(vw::ArgumentErr()\n                     << \"Failed parsing a matrix from: \" << source\n                     << \". Not all rows have the same size.\\n\");\n      mat.push_back(row);\n      row.clear();\n      continue;\n    }\n    if (line[0] == '\\0' || line[0] == ' ')\n      continue;\n    // Read elements\n    std::istringstream is(line);\n    std::vector<double> v(vec_size, 0.0);\n    for (int p = 0; p < vec_size; p++) {\n      if (!(is >> v[p]))\n        vw::vw_throw(vw::ArgumentErr()\n                     << \"Failed parsing \" << vec_size\n                     << \" elements from line \" << std::string(line)\n                     << \" in file \" << source << \"\\n\");\n    }\n    row.push_back(v);\n  }\n  // Last row\n  if (!row.empty())\n    mat.push_back(row);\n}\n\n// Convert a raw double matrix to a matrix of Vector2\nvoid convertToVec2(std::vector<std::vector<std::vector<double>>> const& raw,\n                   std::vector<std::vector<vw::Vector2>> & mat) {\n  mat.resize(raw.size());\n  for (size_t r = 0; r < raw.size(); r++) {\n    mat[r].resize(raw[r].size());\n    for (size_t c = 0; c < raw[r].size(); c++)\n      mat[r][c] = vw::Vector2(raw[r][c][0], raw[r][c][1]);\n  }\n}\n\n// Convert a raw double matrix to a matrix of Vector3\nvoid convertToVec3(std::vector<std::vector<std::vector<double>>> const& raw,\n                   std::vector<std::vector<vw::Vector3>> & mat) {\n  mat.resize(raw.size());\n  for (size_t r = 0; r < raw.size(); r++) {\n    mat[r].resize(raw[r].size());\n    for (size_t c = 0; c < raw[r].size(); c++)\n      mat[r][c] = vw::Vector3(raw[r][c][0], raw[r][c][1], raw[r][c][2]);\n  }\n}\n\nvoid read_matrix_from_file(std::string const& file,\n                           std::vector<std::vector<vw::Vector2>> & mat) {\n  std::ifstream ifs(file.c_str());\n  std::vector<std::vector<std::vector<double>>> raw;\n  read_matrix_from_stream(file, ifs, 2, raw);\n  convertToVec2(raw, mat);\n}\n\nvoid read_matrix_from_file(std::string const& file,\n                           std::vector<std::vector<vw::Vector3>> & mat) {\n  std::ifstream ifs(file.c_str());\n  std::vector<std::vector<std::vector<double>>> raw;\n  read_matrix_from_stream(file, ifs, 3, raw);\n  convertToVec3(raw, mat);\n}\n\nvoid read_matrix_from_string(std::string const& str,\n                             std::vector<std::vector<vw::Vector2>> & mat) {\n  std::istringstream iss(str);\n  std::vector<std::vector<std::vector<double>>> raw;\n  read_matrix_from_stream(str, iss, 2, raw);\n  convertToVec2(raw, mat);\n}\n\nvoid read_matrix_from_string(std::string const& str,\n                             std::vector<std::vector<vw::Vector3>> & mat) {\n  std::istringstream iss(str);\n  std::vector<std::vector<std::vector<double>>> raw;\n  read_matrix_from_stream(str, iss, 3, raw);\n  convertToVec3(raw, mat);\n}\n\n// Create symlinks to the input images for skip_image_normalization mode.\n// The symlinks are relative to the output directory.\nvoid createSymLinks(std::string const& left_input_file,\n                    std::string const& right_input_file,\n                    std::string const& out_prefix,\n                    std::string      & left_output_file,\n                    std::string      & right_output_file) {\n\n  namespace fs = boost::filesystem;\n\n  left_output_file  = out_prefix + \"-L.tif\";\n  right_output_file = out_prefix + \"-R.tif\";\n\n  if (!fs::exists(left_output_file)) {\n    fs::path out_dir = fs::path(out_prefix).parent_path();\n    fs::path left_rel = out_dir.empty() ? fs::path(left_input_file) :\n                        vw::make_file_relative_to_dir(fs::path(left_input_file), out_dir);\n    fs::create_symlink(left_rel, left_output_file);\n    vw::vw_out() << \"Created symlink: \" << left_output_file << \" -> \" << left_rel << \"\\n\";\n  }\n\n  if (!fs::exists(right_output_file)) {\n    fs::path out_dir = fs::path(out_prefix).parent_path();\n    fs::path right_rel = out_dir.empty() ? fs::path(right_input_file) :\n                         vw::make_file_relative_to_dir(fs::path(right_input_file), out_dir);\n    fs::create_symlink(right_rel, right_output_file);\n    vw::vw_out() << \"Created symlink: \" << right_output_file << \" -> \" << right_rel << \"\\n\";\n  }\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Core/FileUtils.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#ifndef __CORE_FILE_UTILS_H__\n#define __CORE_FILE_UTILS_H__\n\n#include <string>\n#include <vector>\n\n#include <vw/Math/Vector.h>\n\nnamespace asp {\n\n  /// Return true if the first file exists and is newer than all of the other files.\n  /// - Also returns false if any files are missing.\n  /// - If a blank \"\" file is passed in it is ignored.\n  bool first_is_newer(std::string              const& test_file, \n                      std::vector<std::string> const& other_files);\n  // Convenience wrappers.\n  bool first_is_newer(std::string const& test_file, std::string const& f1);\n  bool first_is_newer(std::string const& test_file, \n                      std::string const& f1, std::string const& f2);\n  bool first_is_newer(std::string const& test_file, \n                      std::string const& f1, std::string const& f2,\n                      std::string const& f3, std::string const& f4);\n\n  /// Read a vector of doubles from a file  \n  void read_vec(std::string const& filename, std::vector<double> & vals);\n\n  void read_2d_points(std::string const& file, std::vector<vw::Vector2> & points);\n  void read_3d_points(std::string const& file, std::vector<vw::Vector3> & points);\n\n  /// Write a vector of strings from a file, one per line.\n  void write_list(std::string const& file, std::vector<std::string> const & list);\n\n  /// Read a vector of strings from a file, with spaces and newlines acting as separators.\n  /// Throw an exception if the list is empty.\n  void read_list(std::string const& file, std::vector<std::string> & list);\n  \n  /// Read the target name (planet name) from the plain text portion of an ISIS cub file\n  std::string read_target_name(std::string const& filename);\n\n  // Given a vector of files, with each file being an image, camera,\n  // or a text file having images or cameras, return the list of\n  // all found images and cameras. This is a local auxiliary \n  // function not exposed in the header file.\n  void readImagesCamsOrLists(std::vector<std::string> const & in,\n                            std::vector<std::string>       & out);\n\n  /// Given a list of images/cameras and/or lists of such things, put the images\n  /// and the cameras in separate vectors.\nvoid separate_images_from_cameras(std::vector<std::string> const& inputs,\n                                  std::vector<std::string>      & images,\n                                  std::vector<std::string>      & cameras,\n                                  bool ensure_equal_sizes);\n\n  // Read a matrix of vectors from a file or string. Each line has n elements\n  // (2 for Vector2, 3 for Vector3). Empty lines separate matrix rows.\n  void read_matrix_from_file(std::string const& file,\n                             std::vector<std::vector<vw::Vector2>> & mat);\n  void read_matrix_from_file(std::string const& file,\n                             std::vector<std::vector<vw::Vector3>> & mat);\n  void read_matrix_from_string(std::string const& str,\n                               std::vector<std::vector<vw::Vector2>> & mat);\n  void read_matrix_from_string(std::string const& str,\n                               std::vector<std::vector<vw::Vector3>> & mat);\n\n// Create symlinks to the input images for skip_image_normalization mode.\n// The symlinks are relative to the output directory.\nvoid createSymLinks(std::string const& left_input_file,\n                    std::string const& right_input_file,\n                    std::string const& out_prefix,\n                    std::string      & left_output_file,\n                    std::string      & right_output_file);\n\n} //end namespace asp\n\n#endif//__CORE_FILE_UTILS_H__\n"
  },
  {
    "path": "src/asp/Core/GCP.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Core/ImageUtils.h>\n#include <asp/Core/MatchList.h>\n#include <asp/Core/GCP.h>\n\n#include <vw/FileIO/DiskImageView.h>\n#include <vw/Image/Interpolation.h>\n#include <vw/Cartography/GeoReference.h>\n#include <vw/FileIO/FileUtils.h>\n\nnamespace asp {\n\n// Write GCP to a file. If ignore_pixel_sigma is true, or if a measure's\n// pixel sigma is non-positive, use a pixel sigma of 1.\nvoid writeGcp(std::string const& gcpFile,\n              vw::cartography::GeoReference const& geo,\n              std::vector<Gcp> const& gcp_vec,\n              std::vector<std::string> const& image_files,\n              bool ignore_pixel_sigma) {\n\n  vw::vw_out() << \"Writing: \" << gcpFile << \"\\n\";\n  std::ofstream ofs(gcpFile.c_str());\n  ofs.precision(17); // full precision\n\n  // It is important to keep track of the datum and projection, because the\n  // elevations are relative to it\n  ofs << \"# WKT: \" << geo.get_wkt() << \"\\n\";\n  ofs << \"# id lat lon height_above_datum sigma_x sigma_y sigma_z image_name \"\n      << \"pixel_x pixel_y sigma_x sigma_y, etc.\\n\";\n\n  // Iterate over the gcp_vec\n  for (size_t gcp_id = 0; gcp_id < gcp_vec.size(); gcp_id++) {\n\n    auto const& gcp   = gcp_vec[gcp_id]; // alias\n    auto const& cp    = gcp.cp; // alias\n    auto const& llh   = gcp.llh; // alias\n    auto const& sigma = gcp.sigma; // alias\n\n    // Write the id, lat, lon, height, sigmas\n    ofs << gcp_id << \" \" << llh.y() << \" \" << llh.x() << \" \" << llh.z() << \" \"\n        << sigma[0] << \" \" << sigma[1] << \" \" << sigma[2] << \" \";\n\n    for (int im = 0; im < cp.size(); im++) {\n      auto const& cm = cp[im]; // measure\n\n      // Use the measure's pixel sigma, or fall back to 1\n      double col_sigma = 1.0, row_sigma = 1.0;\n      if (!ignore_pixel_sigma) {\n        vw::Vector2 ms = cm.sigma();\n        if (ms[0] > 0) col_sigma = ms[0];\n        if (ms[1] > 0) row_sigma = ms[1];\n      }\n\n      ofs << image_files[cm.image_id()] << \" \"\n          << cm.position()[0] << \" \" << cm.position()[1] << \" \"\n          << col_sigma << \" \" << row_sigma;\n\n      // Have a space between measures, except after the last one\n      if (im < int(cp.size()) - 1)\n        ofs << \" \";\n    }\n    ofs << \"\\n\";\n  }\n\n  ofs.close();\n}\n\n// Produce and write a GCP file. Can throw exceptions. TODO(oalexan1): Consider\n// moving this to WV, together with the logic for reading GCPs. Support reading\n// and writing a georef, not a datum. TODO(oalexan1): Add the GUI option\n// --gcp-srs. The default should be WGS84 with stereographic projection at\n// lon=0, lat=0 unless there exists a DEM, when the default should be the\n// long-lat projection for that DEM. --gcp-srs can be used with rig_calibrator\n// for local Cartesian coordinates.\nvoid genWriteGcp(std::vector<std::string> const& image_files,\n                 std::string const& gcp_file,\n                 std::string const& dem_file,\n                 asp::MatchList const& matchlist,\n                 double xyz_sigma) {\n  \n  // Must have at lest two images to write a GCP file\n  if (image_files.size() < 2)\n    vw::vw_throw(vw::ArgumentErr() << \"At least two images are needed to write a GCP file.\\n\");\n  \n  // Load a georeference to use for the GCPs from the last image\n  vw::cartography::GeoReference image_georef;\n  const size_t georef_index = image_files.size() - 1;\n  const std::string image_georef_file = image_files[georef_index];\n  bool has_georef = vw::cartography::read_georeference(image_georef, image_georef_file);\n  if (!has_georef)\n    vw::vw_throw(vw::ArgumentErr() << \"Could not load a valid georeference to use for \"\n                 << \"ground control points in file: \" << image_georef_file << \".\\n\");\n\n  // Init the DEM to use for height interpolation\n  vw::ImageViewRef<vw::PixelMask<double>> interp_dem;\n  vw::cartography::GeoReference dem_georef;\n  asp::create_interp_dem(dem_file, dem_georef, interp_dem);\n  vw::BBox2 dem_bbox = vw::bounding_box(interp_dem);\n\n  // A basic sanity check. The orthoimage and DEM datums should be similar.\n  double tol = 1.0; // 1 m\n  auto const& img_d = image_georef.datum();\n  auto const& dem_d = dem_georef.datum();\n  // Throw if the datums are too different\n  if (img_d.semi_major_axis() - dem_d.semi_major_axis() > tol ||\n      img_d.semi_minor_axis() - dem_d.semi_minor_axis() > tol)\n    vw::vw_throw(vw::ArgumentErr() << \"The orthoimage and DEM datums differ by more than \"\n             << tol << \" meters. This is not supported.\\n\");\n    \n  // Populate the GCPs\n  std::vector<asp::Gcp> gcp_vec;\n  size_t num_pts_skipped = 0;\n  const size_t num_ips = matchlist.getNumPoints();\n  for (size_t p = 0; p < num_ips; p++) { // Loop through IPs\n    \n    // Compute the GDC coordinate of the point\n    vw::ip::InterestPoint ip = matchlist.getPoint(georef_index, p);\n    vw::Vector2 lonlat    = image_georef.pixel_to_lonlat(vw::Vector2(ip.x, ip.y));\n    vw::Vector2 dem_pixel = dem_georef.lonlat_to_pixel(lonlat);\n    vw::PixelMask<float> height = interp_dem(dem_pixel[0], dem_pixel[1])[0];\n    \n    // Bounding box check.\n    if ((!dem_bbox.contains(dem_pixel)) || (!vw::is_valid(height))) {\n      vw::vw_out() << \"Warning: Skipped IP # \" << p\n               << \" because it does not fall on the DEM.\\n\";\n      num_pts_skipped++;\n      continue; // Skip locations which do not fall on the DEM\n    }\n\n    asp::Gcp gcp;\n    gcp.llh = vw::Vector3(lonlat[0], lonlat[1], height[0]);\n    gcp.sigma = vw::Vector3(xyz_sigma, xyz_sigma, xyz_sigma);\n\n    // The last image is the reference image, so we skip it when saving GCPs\n    size_t num_images = image_files.size();\n    size_t num_images_to_save = num_images - 1; \n    for (size_t i = 0; i < num_images_to_save; i++) {\n      // Add this IP to the current line\n      vw::ip::InterestPoint ip = matchlist.getPoint(i, p);\n      vw::ba::ControlMeasure cm;\n      cm.set_image_id(i);\n      cm.set_position(vw::Vector2(ip.x, ip.y));\n      cm.set_sigma(vw::Vector2(1, 1));\n      gcp.cp.add_measure(cm);\n    }\n    gcp_vec.push_back(gcp);\n  }\n  \n  // Write the GCPs to file. Use pixel sigma of 1. TODO(oalexan1): Revisit.\n  bool ignore_pixel_sigma = true;\n  asp::writeGcp(gcp_file, image_georef, gcp_vec, image_files, ignore_pixel_sigma);\n\n  return;\n}\n\n} // namespace asp\n"
  },
  {
    "path": "src/asp/Core/GCP.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file GCP.h\n///\n/// GCP logic\n///\n#ifndef __ASP_CORE_GCP_H__\n#define __ASP_CORE_GCP_H__\n\n#include <vw/BundleAdjustment/ControlNetwork.h>\n\n#include <string>\n#include <vector>\n\nnamespace asp { \n  class MatchList;\n\n  // A structure for storing a GCP\n  struct Gcp {\n    vw::ba::ControlPoint cp;\n    vw::Vector3 llh;\n    vw::Vector3 sigma;\n  };\n\n  // Write GCP to a file. If ignore_pixel_sigma is true, or if a measure's\n  // pixel sigma is non-positive, use a pixel sigma of 1.\n  void writeGcp(std::string const& gcpFile,\n                vw::cartography::GeoReference const& geo,\n                std::vector<Gcp> const& gcp_vec,\n                std::vector<std::string> const& image_files,\n                bool ignore_pixel_sigma);\n\n  // Produce and write a GCP file. Can throw exceptions.\n  void genWriteGcp(std::vector<std::string> const& image_files,\n                   std::string const& gcp_file,\n                   std::string const& dem_file,\n                   asp::MatchList const& matchlist,\n                   double xyz_sigma);\n\n} // namespace asp\n\n#endif  // __ASP_CORE_GCP_H__\n"
  },
  {
    "path": "src/asp/Core/GdalUtils.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2024, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file GdalUtils.cc\n///\n\n#include <asp/Core/GdalUtils.h>\n\nusing namespace vw;\nusing namespace vw::cartography;\n\n// Unless user-specified, compute the rounding error for a given\n// planet (a point on whose surface is given by 'shift'). Return an\n// inverse power of 2, 1/2^10 for Earth and proportionally less for\n// smaller bodies.\ndouble asp::get_rounding_error(vw::Vector3 const& shift, double rounding_error) {\n\n  // Do nothing if the user specified it.\n  if (rounding_error > 0.0) return rounding_error;\n\n  double len = norm_2(shift);\n  VW_ASSERT(len > 0,  vw::ArgumentErr()\n            << \"Expecting positive length in get_rounding_error().\");\n  rounding_error = 1.5e-10*len;\n    rounding_error = pow(2.0, round(log(rounding_error)/log(2.0)));\n    return rounding_error;\n}\n"
  },
  {
    "path": "src/asp/Core/GdalUtils.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file GdalUtils.h\n\n// Utilities for writing images\n\n#ifndef __ASP_CORE_GDAL_UTILS_H__\n#define __ASP_CORE_GDAL_UTILS_H__\n\n#include <vw/Cartography/GeoReferenceUtils.h>\n#include <vw/FileIO/DiskImageUtils.h>\n#include <vw/Core/StringUtils.h>\n\n#include <map>\n\nnamespace asp {\n\n/// String we use in ASP written point cloud files to indicate that an offset\n///  has been subtracted out from the points.\n// Note: We use this constant in the python code as well\nconst std::string ASP_POINT_OFFSET_TAG_STR = \"POINT_OFFSET\";\n\n// Specialized functions for reading/writing images with a shift.\n// The shift is meant to bring the pixel values closer to origin,\n// with goal of saving the pixels as float instead of double.\n\n/// Subtract a given shift from first 3 components of given vector image.\n/// Skip pixels for which the first 3 components are (0, 0, 0).\ntemplate <class VecT>\nstruct SubtractShift: public vw::ReturnFixedType<VecT> {\n  vw::Vector3 m_shift;\n  SubtractShift(vw::Vector3 const& shift):m_shift(shift){}\n  VecT operator() (VecT const& pt) const {\n    VecT lpt = pt;\n    int len = std::min(3, (int)lpt.size());\n    if (subvector(lpt, 0, len) != subvector(vw::Vector3(), 0, len))\n      subvector(lpt, 0, len) -= subvector(m_shift, 0, len);\n    return lpt;\n  }\n};\ntemplate <class ImageT>\nvw::UnaryPerPixelView<ImageT, SubtractShift<typename ImageT::pixel_type>>\ninline subtract_shift(vw::ImageViewBase<ImageT> const& image,\n                      vw::Vector3 const& shift) {\n  return vw::UnaryPerPixelView<ImageT, SubtractShift<typename ImageT::pixel_type>>\n    (image.impl(), SubtractShift<typename ImageT::pixel_type>(shift));\n}\n\n// Compile-intensive via read_channels (12 instantiations).\n// Prefer the wrappers in PointCloudRead.h.\ntemplate<int m>\nvw::ImageViewRef<vw::Vector<double, m>> read_asp_point_cloud(std::string const& filename) {\n\n  vw::Vector3 shift;\n  std::string shift_str;\n  boost::shared_ptr<vw::DiskImageResource> rsrc\n    (new vw::DiskImageResourceGDAL(filename));\n  bool success = vw::cartography::read_header_string(*rsrc.get(),\n                                                     asp::ASP_POINT_OFFSET_TAG_STR,\n                                                     shift_str);\n  if (success)\n    shift = vw::str_to_vec<vw::Vector3>(shift_str);\n\n  // Read the first m channels\n  vw::ImageViewRef<vw::Vector<double, m>> out_image \n    = vw::read_channels<m, double>(filename, 0);\n\n  // Add the shift back to the first several channels.\n  if (shift != vw::Vector3())\n    out_image = subtract_shift(out_image, -shift);\n\n  return out_image;\n}\n\n/// Don't round pixels in point2dem for bodies of radius smaller than\n/// this in meters. Do it though in stereo_tri, see get_rounding_error().\nconst double MIN_RADIUS_FOR_ROUNDING = 1e+6; // 1000 km\n\n/// Unless user-specified, compute the rounding error for a given\n/// planet (a point on whose surface is given by 'shift'). Return an\n/// inverse power of 2, 1/2^10 for Earth and proportionally less for smaller bodies.\ndouble get_rounding_error(vw::Vector3 const& shift, double rounding_error);\n\n/// Round pixels in given image to multiple of given rounding_error.\ntemplate <class VecT>\nstruct RoundImagePixels: public vw::ReturnFixedType<VecT> {\n  double m_rounding_error;\n  RoundImagePixels(double rounding_error):m_rounding_error(rounding_error){\n    VW_ASSERT(m_rounding_error > 0.0,\n                vw::ArgumentErr() << \"Rounding error must be positive.\");\n  }\n  VecT operator() (VecT const& pt) const {\n    return m_rounding_error*round(pt/m_rounding_error);\n  }\n};\ntemplate <class ImageT>\nvw::UnaryPerPixelView<ImageT, RoundImagePixels<typename ImageT::pixel_type> >\ninline round_image_pixels(vw::ImageViewBase<ImageT> const& image,\n                        double rounding_error) {\n  return vw::UnaryPerPixelView<ImageT, RoundImagePixels<typename ImageT::pixel_type> >\n    (image.impl(), RoundImagePixels<typename ImageT::pixel_type>(rounding_error));\n}\n\n// Save with temporarily big blocks if this helps with efficiency, such as if \n// the blocks need internal padding taken into account.\ntemplate <class ImageT>\nvoid saveWithTempBigBlocks(int bigBlockSize,\n                           const std::string &filename,\n                           vw::ImageViewBase<ImageT> const& img,\n                           bool hasGeoref,\n                           vw::cartography::GeoReference const& georef,\n                           bool hasNodata, double nodata,\n                           vw::GdalWriteOptions const& opt,\n                           vw::ProgressCallback const& tpc) {\n\n  // Check if block size needs changing\n  vw::Vector2 origBlockSize = opt.raster_tile_size;\n  vw::Vector2 newBlockSize = vw::Vector2(bigBlockSize, bigBlockSize);\n  \n  // If block size matches, just write once with original options\n  if (newBlockSize == origBlockSize) {\n    block_write_gdal_image(filename, img, hasGeoref, georef, hasNodata, nodata,\n                           opt, tpc);\n    return;\n  }\n  \n  // Block size differs - write temp with big blocks, then rewrite with correct blocks\n  vw::GdalWriteOptions localOpt = opt;\n  localOpt.raster_tile_size = newBlockSize;\n  localOpt.cog = false;  // Disable COG for temporary write\n  block_write_gdal_image(filename, img, hasGeoref, georef, hasNodata, nodata,\n                         localOpt, tpc);\n\n  std::string tmpFile\n    = boost::filesystem::path(filename).replace_extension(\".tmp.tif\").string();\n  boost::filesystem::rename(filename, tmpFile);\n  vw::DiskImageView<typename ImageT::pixel_type> tmpImg(tmpFile);\n  localOpt.raster_tile_size = origBlockSize;\n  localOpt.cog = opt.cog;  // Restore COG setting for final write\n  vw::vw_out() << \"Re-writing with blocks of size: \"\n               << localOpt.raster_tile_size[0] << \" x \"\n               << localOpt.raster_tile_size[1] << \".\\n\";\n  vw::cartography::block_write_gdal_image(filename, tmpImg, hasGeoref, georef,\n                                          hasNodata, nodata, localOpt, tpc);\n  boost::filesystem::remove(tmpFile);\n  return;\n}\n\n/// Block write image while subtracting a given value from all pixels\n/// and casting the result to float, while rounding to nearest mm.\ntemplate <class ImageT>\nvoid block_write_approx_gdal_image(const std::string &filename,\n                                   vw::Vector3 const& shift,\n                                   double rounding_error,\n                                   vw::ImageViewBase<ImageT> const& image,\n                                   bool has_georef,\n                                   vw::cartography::GeoReference const& georef,\n                                   bool has_nodata, double nodata,\n                                   vw::GdalWriteOptions const& opt,\n                                   vw::ProgressCallback const& progress_callback\n                                    = vw::ProgressCallback::dummy_instance(),\n                                   std::map<std::string, std::string> const& keywords =\n                                   std::map<std::string, std::string>()) {\n\n  if (norm_2(shift) > 0) {\n\n    // Add the point shift to keywords\n    std::map<std::string, std::string> local_keywords = keywords;\n    local_keywords[ASP_POINT_OFFSET_TAG_STR] = vw::vec_to_str(shift);\n\n    block_write_gdal_image(filename,\n                            vw::channel_cast<float>\n                            (round_image_pixels(subtract_shift(image.impl(), shift),\n                                                get_rounding_error(shift, rounding_error))),\n                            has_georef, georef, has_nodata, nodata,\n                            opt, progress_callback, local_keywords);\n\n  }else{\n    block_write_gdal_image(filename, image, has_georef, georef,\n                            has_nodata, nodata, opt,\n                            progress_callback, keywords);\n  }\n\n}\n\n/// Single-threaded write image while subtracting a given value from\n/// all pixels and casting the result to float.\ntemplate <class ImageT>\nvoid write_approx_gdal_image(const std::string &filename,\n                              vw::Vector3 const& shift,\n                              double rounding_error,\n                              vw::ImageViewBase<ImageT> const& image,\n                              bool has_georef,\n                              vw::cartography::GeoReference const& georef,\n                              bool has_nodata, double nodata,\n                              vw::GdalWriteOptions const& opt,\n                              vw::ProgressCallback const& progress_callback\n                              = vw::ProgressCallback::dummy_instance(),\n                              std::map<std::string, std::string> const& keywords =\n                              std::map<std::string, std::string>()) {\n\n  if (norm_2(shift) > 0){\n    // Add the point shift to keywords\n    std::map<std::string, std::string> local_keywords = keywords;\n    local_keywords[ASP_POINT_OFFSET_TAG_STR] = vw::vec_to_str(shift);\n    write_gdal_image(filename,\n                      vw::channel_cast<float>\n                      (round_image_pixels(subtract_shift(image.impl(), shift),\n                                          get_rounding_error(shift, rounding_error))),\n                      has_georef, georef, has_nodata, nodata,\n                      opt, progress_callback, local_keywords);\n  }else{\n    write_gdal_image(filename, image, has_georef, georef,\n                      has_nodata, nodata, opt, progress_callback, keywords);\n  }\n}\n\n} // End namespace asp\n\n#endif//__ASP_CORE_GDAL_UTILS_H__\n"
  },
  {
    "path": "src/asp/Core/ImageNormalization.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Core/ImageNormalization.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/InterestPointMatching.h>\n#include <asp/Core/ImageUtils.h>\n\n#include <vw/FileIO/DiskImageResource.h>\n#include <vw/Core/Log.h>\n#include <vw/Image/Algorithms.h>\n#include <vw/FileIO/DiskImageUtils.h>\n\n#include <boost/filesystem.hpp>\n\n#include <limits>\n\nusing namespace vw;\nnamespace fs = boost::filesystem;\n\nnamespace asp {\n  \n/// Returns the correct nodata value from the input images or the input options.\n/// The user_nodata value overrides the image no-data values if it is not NaN.\nvoid get_nodata_values(boost::shared_ptr<vw::DiskImageResource> left_rsrc,\n                       boost::shared_ptr<vw::DiskImageResource> right_rsrc,\n                       float user_nodata,\n                       float & left_nodata_value,\n                       float & right_nodata_value){\n  \n  // The no-data value read from options overrides the value present in the image files.\n  left_nodata_value  = std::numeric_limits<float>::quiet_NaN();\n  right_nodata_value = std::numeric_limits<float>::quiet_NaN();\n  if (left_rsrc->has_nodata_read ()) left_nodata_value  = left_rsrc->nodata_read();\n  if (right_rsrc->has_nodata_read()) right_nodata_value = right_rsrc->nodata_read();\n  \n  if (!std::isnan(user_nodata)) {\n    \n    if (user_nodata < left_nodata_value)\n      vw_out(WarningMessage) \n        << \"It appears that the user-supplied no-data value is less than \"\n        << \"the no-data value of left image. This may not be what was \"\n        << \"intended.\\n\";\n    if (user_nodata < right_nodata_value)\n      vw_out(WarningMessage) \n        << \"It appears that the user-supplied no-data value is less than \"\n        << \"the no-data value of right image. This may not be what was \"\n        << \"intended.\\n\";\n\n    left_nodata_value  = user_nodata;\n    right_nodata_value = user_nodata;\n  }\n\n  return;\n}\n\n// For OpenCV image detectors some things are a bit different. Used in a few places.\nbool openCvDetectMethod() {\n  return (asp::stereo_settings().ip_detect_method != DETECT_IP_METHOD_INTEGRAL);\n}\n\n// If it is allowed to exceed the min and max values when normalizing images.\n// TODO(oalexan1): This now returns false. This must be switched to true, and\n// must integrate the logic for ISIS cub files where it is always true.\nbool doNotExceedMinMax() {\n  return false;\n}\n\n// Calculate the min and max for all images to normalize, while respecting\n// given options.\nvoid calcImageSeqMinMax(bool force_use_entire_range,\n                        bool individually_normalize,\n                        bool use_percentile_stretch,\n                        bool do_not_exceed_min_max,\n                        std::vector<vw::Vector<float>> const& image_stats,\n                        // Outputs\n                        std::vector<double> & min_vals,\n                        std::vector<double> & max_vals) {\n\n  // TODO(oalexan1): Find global min and max in either case\n  // and do not exceed these in either case. There's nothing\n  // to gain by exceeding those for all images.\n  \n  // Some of these will need a global min and max\n  double global_min = std::numeric_limits<double>::max();\n  double global_max = -std::numeric_limits<double>::min();\n  min_vals.resize(image_stats.size(), global_min);\n  max_vals.resize(image_stats.size(), global_max);\n  \n  // Iterate through the images\n  bool warning_printed = false;\n  for (size_t i = 0; i < image_stats.size(); i++) {\n    \n    // Sanity check\n    if (image_stats[i].size() != 6)\n      vw::vw_throw(vw::ArgumentErr() \n        << \"Expecting an image stats vector of size 6 in normalize_images().\\n\");\n    \n    if (force_use_entire_range) { \n                                \n      if (individually_normalize) {\n        // Use min and max values for each image\n        min_vals[i] = image_stats[i][0];\n        max_vals[i] = image_stats[i][1];\n      } else { \n        // Normalize all using the same min and max\n        global_min = std::min(global_min, (double)image_stats[i][0]);\n        global_max = std::max(global_max, (double)image_stats[i][1]);\n      }\n\n    } else { \n            \n      // Don't force the entire range\n      if (use_percentile_stretch) {\n        // Percentile stretch\n        min_vals[i] = image_stats[i][4];\n        max_vals[i] = image_stats[i][5];\n      } else {\n        // Two standard deviation stretch\n        \n        // Standard deviation must be positive\n        if (image_stats[i][3] == 0) {\n          // This can happen if the image is completely blank. It is better to\n          // give a warning than fail.\n          vw::vw_out(vw::WarningMessage)  \n            << \"The image stats do not have a positive stddev. \"\n            << \"Try using the option --force-use-entire-range.\\n\";\n        }\n        \n        // This is an important check for when images come from different\n        // sensors and have vastly different standard deviations.\n        if (!individually_normalize && i > 0 && !warning_printed) {\n          double min_std = std::min(image_stats[i][3], image_stats[i-1][3]);\n          double max_std = std::max(image_stats[i][3], image_stats[i-1][3]);\n          double std_ratio = min_std / std::max(max_std, 1e-10);\n          \n          if (std_ratio < 0.2) {\n            vw::vw_out(vw::WarningMessage) \n              << \"The standard deviations of some images are very different. \"\n              << \"Consider using the option --individually-normalize.\\n\";\n            warning_printed = true;\n          }\n        }\n        \n        // Use mean  +/- 2 standard deviations. This is done in a few places in ASP.\n        min_vals[i] = image_stats[i][2] - 2*image_stats[i][3];\n        max_vals[i] = image_stats[i][2] + 2*image_stats[i][3];\n      }\n      \n      if (!individually_normalize) {\n        // Normalize all using the same min and max\n        global_min = std::min(global_min, min_vals[i]);\n        global_max = std::max(global_max, max_vals[i]);\n      }\n      \n    } // end if (!force_use_entire_range)\n  } // end for loop\n\n  if (!individually_normalize) {\n    // All get the same global min and max. \n    for (size_t i = 0; i < image_stats.size(); i++) {\n      min_vals[i] = global_min;\n      max_vals[i] = global_max;\n    }\n  } \n    \n  if (do_not_exceed_min_max) {\n    // This is important for ISIS which may have special pixels beyond the min and max\n    for (size_t i = 0; i < image_stats.size(); i++) {\n      min_vals[i] = std::max(min_vals[i], (double)image_stats[i][0]);\n      max_vals[i] = std::min(max_vals[i], (double)image_stats[i][1]);\n    }    \n  }\n  \n  return;\n}\n\n/// Normalize the intensity of two images based on input statistics\nvoid normalize_images(bool force_use_entire_range,\n                      bool individually_normalize,\n                      bool use_percentile_stretch,\n                      bool do_not_exceed_min_max,\n                      vw::Vector<float> const& left_stats,\n                      vw::Vector<float> const& right_stats,\n                      vw::ImageViewRef<vw::PixelMask<float>> & left_img,\n                      vw::ImageViewRef<vw::PixelMask<float>> & right_img) {\n\n  // Get the min and max values for the two images  \n  std::vector<double> min_vals, max_vals;\n  std::vector<vw::Vector<float>> image_stats = {left_stats, right_stats};\n  calcImageSeqMinMax(force_use_entire_range, individually_normalize,\n                     use_percentile_stretch, do_not_exceed_min_max,\n                     image_stats,\n                     // Outputs\n                     min_vals, max_vals);\n  \n  if (individually_normalize > 0)\n    vw::vw_out() << \"\\t--> Individually normalize images.\\n\";\n  else // Normalize using the same stats\n    vw::vw_out() << \"\\t--> Normalize images globally.\\n\";\n  \n  vw::vw_out() << \"Left image value bounds: [\" \n                 << min_vals[0] << \" \" << max_vals[0] << \"]\\n\";\n  vw::vw_out() << \"Right image value bounds: [\" \n                 << min_vals[1] << \" \" << max_vals[1] << \"]\\n\";\n  \n  left_img = normalize(left_img, min_vals[0], max_vals[0], 0.0, 1.0);\n  right_img = normalize(right_img, min_vals[1], max_vals[1], 0.0, 1.0);\n\n  return;\n}\n\n// Normalize a single image to [0, 1] using mean and stddev-derived bounds.\n// Do not exceed the min and max values present in the image stats. This may \n// need to be the default.\nvoid normalizeImage(std::string const& image_file,\n                    vw::ImageViewRef<vw::PixelMask<float>> & image) {\n\n  // Read the nodata value\n  float nodata_val = -32768.0; \n  vw::read_nodata_val(image_file, nodata_val);\n\n  // Open the file and apply the mask\n  image = vw::create_mask(vw::DiskImageView<float>(image_file), nodata_val);\n\n  // Gather stats\n  std::string prefix = \"\";\n  bool reuse_cache = false;\n  vw::Vector6f stats = asp::gather_stats(image, prefix, image_file, reuse_cache);\n  \n  // Use mean +/- 2 standard deviations. This is done in a few places in ASP.\n  float mean = stats[2];\n  float stddev = stats[3];\n  double min_val = std::max(stats[0], mean - 2*stddev);\n  double max_val = std::min(stats[1], mean + 2*stddev);\n  \n  image = normalize(image, min_val, max_val, 0.0, 1.0);\n}\n   \n// This is called by parallel_bundle_adjust just once to accumulate all stats that\n// were done by individual processes.\nvoid calcNormalizationBounds(std::string const& out_prefix, \n                             std::vector<std::string> const& image_files,\n                             std::string const& boundsFile) { \n\n  int num_images = image_files.size();\n\n  std::vector<vw::Vector<float>> image_stats(num_images); \n  // Assign the images which this instance should compute statistics for.\n  for (int i = 0; i < num_images; i++) {\n\n    std::string image_path = image_files[i];\n    std::string stats_path \n      = out_prefix + '-' + fs::path(image_path).stem().string() + \"-stats.tif\";\n    \n    // Read the stats\n    vw::read_vector(image_stats[i], stats_path);\n  \n    // Sanity check\n    if (image_stats[i].size() != 6)\n      vw::vw_throw(vw::ArgumentErr() \n        << \"Expecting an image stats vector of size 6.\\n\");\n  }\n\n  std::vector<double> min_vals, max_vals;\n  asp::calcImageSeqMinMax(asp::stereo_settings().force_use_entire_range, \n                          asp::stereo_settings().individually_normalize,\n                          asp::openCvDetectMethod(),\n                          asp::doNotExceedMinMax(),\n                          image_stats,\n                          // Outputs\n                          min_vals, max_vals);\n\n  vw::vw_out() << \"Writing: \" << boundsFile << \"\\n\";\n  std::ofstream out(boundsFile.c_str());\n  out.precision(17);\n  for (int i = 0; i < num_images; i++)\n    out << image_files[i] << \" \" << min_vals[i] << \" \" << max_vals[i] << \"\\n\";\n  \n} // end function calcNormalizationBounds()\n\n// Read normalization bounds into std::map\nvoid readNormalizationBounds(std::string const& boundsFile,\n                             std::vector<std::string> const& image_files,\n                             std::map<std::string, vw::Vector2> & bounds_map) {\n\n  std::ifstream in(boundsFile.c_str());\n  if (!in) {\n    vw::vw_throw(vw::IOErr() << \"Unable to open normalization bounds file: \" \n      << boundsFile << \"\\n\");\n  }\n  \n  std::string image_file;\n  double min_val, max_val;\n  while (in >> image_file >> min_val >> max_val) {\n    vw::Vector2 bounds(min_val, max_val);\n    bounds_map[image_file] = bounds;\n  }\n  \n  // Check that data for all images was read\n  for (size_t i = 0; i < image_files.size(); i++) {\n    std::string image_file = image_files[i];\n    if (bounds_map.find(image_file) == bounds_map.end()) {\n      vw::vw_throw(vw::IOErr() << \"Normalization bounds not found for image: \" \n        << image_file << \"\\n\");\n    }\n  }\n  \n} // end function readNormalizationBounds()\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Core/ImageNormalization.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file ImageNormalization.h\n///\n\n#ifndef __IMAGE_NORMALIZATION_H__\n#define __IMAGE_NORMALIZATION_H__\n\n#include <vw/Image/ImageViewRef.h>\n\n#include <boost/shared_ptr.hpp>\n\n#include <map>\n\nnamespace vw {\n  class DiskImageResource;\n}\n\nnamespace asp {\n\ntypedef vw::Vector<vw::float32,6> Vector6f;\n\n/// Returns the correct nodata value from the input images or the input options.\n/// The user_nodata value overrides the image no-data values if it is not NaN.\nvoid get_nodata_values(boost::shared_ptr<vw::DiskImageResource> left_rsrc,\n                       boost::shared_ptr<vw::DiskImageResource> right_rsrc,\n                       float user_nodata,\n                       float & left_nodata_value,\n                       float & right_nodata_value);\n\n// For OpenCV image detectors some things are a bit different. Used in a few places.\nbool openCvDetectMethod();\n\n// If it is allowed to exceed the min and max values when normalizing images.\n// TODO(oalexan1): This now returns false. This must be switched to true, and\n// must integrate the logic for ISIS cub files where it is always true.\nbool doNotExceedMinMax();\n\n// Calculate the min and max for all images to normalize, while respecting\n// given options.\nvoid calcImageSeqMinMax(bool force_use_entire_range,\n                        bool individually_normalize,\n                        bool use_percentile_stretch,\n                        bool do_not_exceed_min_max,\n                        std::vector<vw::Vector<float>> const& image_stats,\n                        // Outputs\n                        std::vector<double> & min_vals,\n                        std::vector<double> & max_vals);\n\n/// Normalize the intensity of two images based on input statistics\nvoid normalize_images(bool force_use_entire_range,\n                      bool individually_normalize,\n                      bool use_percentile_stretch,\n                      bool do_not_exceed_min_max,\n                      vw::Vector<float> const& left_stats,\n                      vw::Vector<float> const& right_stats,\n                      vw::ImageViewRef<vw::PixelMask<float>> & left_img,\n                      vw::ImageViewRef<vw::PixelMask<float>> & right_img);\n\n// Normalize a single image to [0, 1] using mean and stddev-derived bounds.\n// Do not exceed the min and max values present in the image stats. This may \n// need to be the default.\nvoid normalizeImage(std::string const& image_file,\n                    vw::ImageViewRef<vw::PixelMask<float>> & image);\n\n// This is called by parallel_bundle_adjust just once to accumulate all stats that\n// were done by individual processes.\nvoid calcNormalizationBounds(std::string const& out_prefix, \n                             std::vector<std::string> const& image_files,\n                             std::string const& boundsFile); \n\n// Read normalization bounds into std::map\nvoid readNormalizationBounds(std::string const& boundsFile,\n                             std::vector<std::string> const& image_files,\n                             std::map<std::string, vw::Vector2> & bounds_map);\n\n} // end namespace asp\n\n#endif // __IMAGE_NORMALIZATION_H__\n"
  },
  {
    "path": "src/asp/Core/ImageUtils.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Core/ImageUtils.h>\n#include <asp/Core/FileUtils.h>\n\n#include <vw/FileIO/DiskImageResourceGDAL.h>\n#include <vw/Cartography/GeoReference.h>\n#include <vw/FileIO/DiskImageUtils.h>\n#include <vw/Image/Interpolation.h>\n#include <vw/Image/Statistics.h>\n#include <vw/Math/Statistics.h>\n#include <vw/FileIO/MatrixIO.h>\n\n#include <boost/filesystem.hpp>\n\n#include <gdal_priv.h>\n#include <nlohmann/json.hpp>\n\nusing namespace vw;\n\nnamespace fs = boost::filesystem;\n\nnamespace asp {\n\n/// Load an input image, georef, and nodata value\nvoid load_image(std::string const& image_file,\n                vw::ImageViewRef<double> & image, double & nodata,\n                bool & has_georef, vw::cartography::GeoReference & georef) {\n  \n  // Ensure the output variables are initialized\n  nodata = -std::numeric_limits<double>::max();\n  has_georef = false;\n\n  image = vw::load_image_as_double(image_file);\n\n  // Read nodata-value from disk\n  DiskImageResourceGDAL in_rsrc(image_file);\n  bool has_nodata = in_rsrc.has_nodata_read();\n  if (has_nodata) {\n    nodata = in_rsrc.nodata_read();\n    //vw_out() << \"Read no-data value for image \" << image_file << \": \" << nodata << \".\\n\";\n  } else {\n    nodata = vw::get_default_nodata(in_rsrc.channel_type());\n  }\n  \n  has_georef = vw::cartography::read_georeference(georef, image_file);\n}\n\n/// Create a masked DEM\nvoid create_masked_dem(std::string const& dem_file,\n                       vw::cartography::GeoReference & dem_georef,\n                       vw::ImageViewRef<vw::PixelMask<double>> & masked_dem) {\n  \n  vw_out() << \"Loading DEM: \" << dem_file << \"\\n\";\n\n  // Read the no-data\n  double nodata_val = -std::numeric_limits<float>::max(); // note we use a float nodata\n  if (vw::read_nodata_val(dem_file, nodata_val))\n    vw_out() << \"Found DEM nodata value: \" << nodata_val << \"\\n\";\n\n  // Create the interpolated DEM. Values out of bounds will be invalid.\n  vw::PixelMask<double> invalid_val;\n  invalid_val[0] = nodata_val;\n  invalid_val.invalidate();\n  masked_dem = create_mask(DiskImageView<double>(dem_file), nodata_val);\n\n  // Read the georef. It must exist.\n  bool is_good = vw::cartography::read_georeference(dem_georef, dem_file);\n  if (!is_good) {\n    vw_throw(ArgumentErr() << \"Error: Cannot read a georeference from DEM: \"\n             << dem_file << \".\\n\");\n  }\n}\n\n/// Create a DEM ready to use for interpolation\nvoid create_interp_dem(std::string const& dem_file,\n                       vw::cartography::GeoReference & dem_georef,\n                       ImageViewRef<PixelMask<double>> & interp_dem) {\n  \n  vw::ImageViewRef<vw::PixelMask<double>> masked_dem;\n  asp::create_masked_dem(dem_file, dem_georef, masked_dem);\n\n  vw::PixelMask<double> invalid_val;\n  interp_dem = interpolate(masked_dem, BilinearInterpolation(), \n                           vw::ValueEdgeExtension<vw::PixelMask<float>>(invalid_val));\n\n}\n\n/// Take an interest point from a map projected image and convert it\n/// to the corresponding IP in the original non-map-projected image.\n/// - Return false if the pixel could not be converted.\nbool projected_ip_to_raw_ip(vw::ip::InterestPoint &P,\n                            vw::ImageViewRef<vw::PixelMask<double>> const& interp_dem,\n                            vw::CamPtr camera_model,\n                            vw::cartography::GeoReference const& georef,\n                            vw::cartography::GeoReference const& dem_georef) {\n\n  // Get IP coordinate in the DEM\n  Vector2 pix(P.x, P.y);\n  Vector2 ll      = georef.pixel_to_lonlat(pix);\n  Vector2 dem_pix = dem_georef.lonlat_to_pixel(ll);\n  if (!interp_dem.pixel_in_bounds(dem_pix))\n    return false;\n  // Load the elevation from the DEM\n  PixelMask<double> dem_val = interp_dem(dem_pix[0], dem_pix[1]);\n  if (!is_valid(dem_val))\n    return false;\n  Vector3 llh(ll[0], ll[1], dem_val.child());\n  Vector3 xyz = dem_georef.datum().geodetic_to_cartesian(llh);\n\n  // Project into the camera\n  Vector2 cam_pix;\n  try {\n   cam_pix = camera_model->point_to_pixel(xyz);\n  } catch(...) {\n    return false; // Don't update the point.\n  }\n  P.x  = cam_pix.x();\n  P.y  = cam_pix.y();\n  P.ix = P.x;\n  P.iy = P.y;\n  return true;\n}\n\n// For ISIS .cub files from cam2map asp_map, the metadata is in the PVL\n// AspMapproject group, not in GDAL metadata tags. Read it via the\n// json:ISIS3 metadata domain.\nvoid read_cam2map_pvl(std::string const& map_file,\n                      std::string const& adj_key,\n                      std::string const& img_file_key,\n                      std::string const& cam_type_key,\n                      std::string const& cam_file_key,\n                      std::string const& dem_file_key,\n                      // Outputs\n                      std::string & adj_prefix,\n                      std::string & image_file, std::string & cam_type,\n                      std::string & cam_file, std::string & dem_file) {\n\n  GDALAllRegister();\n  GDALDataset *ds = (GDALDataset*)GDALOpen(map_file.c_str(), GA_ReadOnly);\n  if (!ds)\n    return;\n\n  char **md = ds->GetMetadata(\"json:ISIS3\");\n  if (md && md[0]) {\n    try {\n      auto j = nlohmann::json::parse(md[0]);\n      auto aspGrp = j.value(\"IsisCube\", nlohmann::json::object())\n                     .value(\"AspMapproject\", nlohmann::json::object());\n      if (!aspGrp.empty()) {\n        adj_prefix = aspGrp.value(adj_key, \"\");\n        image_file = aspGrp.value(img_file_key, \"\");\n        cam_type   = aspGrp.value(cam_type_key, \"\");\n        cam_file   = aspGrp.value(cam_file_key, \"\");\n        dem_file   = aspGrp.value(dem_file_key, \"\");\n      }\n    } catch (...) {}\n  }\n  GDALClose(ds);\n}\n\n// Read keywords that describe how the images were map-projected.\nvoid read_mapproj_header(std::string const& map_file,\n                         // Outputs\n                         std::string & adj_key, std::string & img_file_key,\n                         std::string & cam_type_key, std::string & cam_file_key,\n                         std::string & dem_file_key,\n                         std::string & adj_prefix,\n                         std::string & image_file, std::string & cam_type,\n                         std::string & cam_file, std::string & dem_file) {\n\n  // Initialize all outputs to empty\n  adj_prefix = \"\";\n  image_file = \"\";\n  cam_type   = \"\";\n  cam_file   = \"\";\n  dem_file   = \"\";\n\n  boost::shared_ptr<vw::DiskImageResource> rsrc(new vw::DiskImageResourceGDAL(map_file));\n  adj_key      = \"BUNDLE_ADJUST_PREFIX\";\n  img_file_key = \"INPUT_IMAGE_FILE\";\n  cam_type_key = \"CAMERA_MODEL_TYPE\",\n  cam_file_key = \"CAMERA_FILE\";\n  dem_file_key = \"DEM_FILE\";\n\n  vw::cartography::read_header_string(*rsrc.get(), adj_key,      adj_prefix);\n  vw::cartography::read_header_string(*rsrc.get(), img_file_key, image_file);\n  vw::cartography::read_header_string(*rsrc.get(), cam_type_key, cam_type);\n  vw::cartography::read_header_string(*rsrc.get(), cam_file_key, cam_file);\n  vw::cartography::read_header_string(*rsrc.get(), dem_file_key, dem_file);\n\n  // Fall back to reading cam2map asp_map PVL metadata from .cub files.\n  if (dem_file.empty())\n    read_cam2map_pvl(map_file, adj_key, img_file_key, cam_type_key,\n                     cam_file_key, dem_file_key, adj_prefix, image_file,\n                     cam_type, cam_file, dem_file);\n\n  // This is important. When writing, have to write something, so use NONE,\n  // but on reading, if the string is NONE, make it empty.\n  if (adj_prefix == \"NONE\")\n    adj_prefix = \"\";\n}\n\n/// Function to apply a functor to each pixel of an input image.\n/// Traverse the image row by row.\ntemplate <class ViewT, class FuncT>\nvoid for_each_pixel_rowwise(const vw::ImageViewBase<ViewT> &view_, FuncT &func,\n  vw::TerminalProgressCallback const& progress) {\n\n  const ViewT& view = view_.impl();\n  typedef typename ViewT::pixel_accessor pixel_accessor;\n  pixel_accessor plane_acc = view.origin();\n\n  for (int32 plane = view.planes(); plane; plane--) { // Loop through planes\n\n    pixel_accessor row_acc = plane_acc;\n    for (int32 row = 0; row<view.rows(); row++) { // Loop through rows\n      progress.report_fractional_progress(row, view.rows());\n      pixel_accessor col_acc = row_acc;\n      for (int32 col = view.cols(); col; col--) { // Loop along the row\n        func(*col_acc);  // Apply the functor to this pixel value\n        col_acc.next_col();\n      }\n      row_acc.next_row();\n    }\n    plane_acc.next_plane();\n  }\n  progress.report_finished();\n}\n\n/// Function to apply a functor to each pixel of an input image.\n/// Traverse the image column by column.\ntemplate <class ViewT, class FuncT>\nvoid for_each_pixel_columnwise(const vw::ImageViewBase<ViewT> &view_, FuncT &func,\n  vw::TerminalProgressCallback const& progress) {\n\n  const ViewT& view = view_.impl();\n  typedef typename ViewT::pixel_accessor pixel_accessor;\n  pixel_accessor plane_acc = view.origin();\n\n  for (int32 plane = view.planes(); plane; plane--) { // Loop through planes\n\n    pixel_accessor col_acc = plane_acc;\n    for (int32 col = 0; col < view.cols(); col++) { // Loop through cols\n      progress.report_fractional_progress(col, view.cols());\n      pixel_accessor row_acc = col_acc;\n      for (int32 row = view.rows(); row; row--) { // Loop along cols\n        func(*row_acc);  // Apply the functor to this pixel value\n        row_acc.next_row();\n      }\n      col_acc.next_col();\n    }\n    plane_acc.next_plane();\n  }\n  progress.report_finished();\n\n  return;\n}\n\n// Compute the min, max, mean, and standard deviation of an image object and\n// write them to a log. If prefix and image_path is set, will cache the results\n// to a file. For efficiency, the image must be traversed either rowwise or\n// columnwise, depending on how it is stored on disk.\n// TODO(oalexan1): This function must take into account ISIS special\n// pixels from StereoSessionIsis::preprocessing_hook(). Then, must eliminate\n// that function in favor of a single preprocessing_hook() in the base class.\nvw::Vector<vw::float32,6>\ngather_stats(vw::ImageViewRef<vw::PixelMask<float>> image,\n             std::string const& out_prefix,\n             std::string const& image_path,\n             bool force_reuse_cache,\n             bool adjust_min_max_with_std) {\n  \n  vw_out() << \"Computing statistics for \" + image_path << \"\\n\";\n\n  Vector6f result;\n  const bool use_cache = ((out_prefix != \"\") && (image_path != \"\"));\n  std::string stats_file = \"\";\n  if (use_cache) {\n    if (image_path.find(out_prefix) == 0) {\n      // If the image is, for example, run/run-L.tif,\n      // then stats_file = run/run-L-stats.tif.\n      stats_file = fs::path(image_path).replace_extension(\"\").string() + \"-stats.tif\";\n    } else {\n      // If the image is left_image.tif,\n      // then stats_file = run/run-left_image-stats.tif\n      stats_file = out_prefix + '-' + fs::path(image_path).stem().string() + \"-stats.tif\";\n    }\n  }\n\n  // Check if this stats file was computed after any image modifications.\n  if ((use_cache && asp::first_is_newer(stats_file, image_path)) ||\n      (force_reuse_cache && fs::exists(stats_file))) {\n    vw_out() << \"\\tReading statistics from file \" + stats_file << \"\\n\";\n    Vector<float32> stats;\n    read_vector(stats, stats_file); // Just fetch the stats from the file on disk.\n    result = stats;\n\n  } else { // Compute the results\n\n    // Read the resource and determine the block structure on disk. Use a boost shared ptr.\n    vw::Vector2i block_size;\n    {\n      boost::shared_ptr<DiskImageResource> rsrc (DiskImageResourcePtr(image_path));\n      block_size  = rsrc->block_read_size();\n    }\n    // Print a warning that processing can be slow if any of the block size\n    // coords are bigger than 5120 pixels.\n    if (block_size[0] > 5120 || block_size[1] > 5120) {\n      vw_out(WarningMessage) << \"Image \" << image_path\n        << \" has block sizes of dimensions \" << block_size[0] << \" x \" << block_size[1]\n        << \" (as shown by gdalinfo). This can make processing slow. Consider converting \"\n        << \"it to tile format, using the command:\\n\"\n        << \"gdal_translate -co TILED=yes -co BLOCKXSIZE=256 -co BLOCKYSIZE=256 \"\n        << \"input.tif output.tif\\n\";\n    }\n\n    // Compute statistics at a reduced resolution\n    const float TARGET_NUM_PIXELS = 1000000;\n    float num_pixels = float(image.cols())*float(image.rows());\n    int   stat_scale = int(ceil(sqrt(num_pixels / TARGET_NUM_PIXELS)));\n\n    vw_out() << \"Using downsample scale: \" << stat_scale << \"\\n\";\n\n    ChannelAccumulator<vw::math::CDFAccumulator<float> > accumulator;\n    vw::TerminalProgressCallback tp(\"asp\",\"\\tstats: \");\n    if (block_size[0] >= block_size[1]) // Rows are long, so go row by row\n     for_each_pixel_rowwise(subsample(edge_extend(image, ConstantEdgeExtension()),\n                               stat_scale), accumulator, tp);\n    else // Columns are long, so go column by column\n     for_each_pixel_columnwise(subsample(edge_extend(image, ConstantEdgeExtension()),\n                                  stat_scale), accumulator, tp);\n\n    result[0] = accumulator.quantile(0); // Min\n    result[1] = accumulator.quantile(1); // Max\n    result[2] = accumulator.approximate_mean();\n    result[3] = accumulator.approximate_stddev();\n    result[4] = accumulator.quantile(0.02); // Percentile values\n    result[5] = accumulator.quantile(0.98);\n\n    // Adjust lo/hi to be within 2 standard deviations of the mean, but do not\n    // exceed min and max. Thi is needed for ISIS which has special pixels. May\n    // become the default eventually or all uses as there is no point in\n    // normalizing to a range that is much wider than the actual pixel values.\n    if (adjust_min_max_with_std) {\n      vw_out() << \"\\t--> Adjusting hi and lo to -+2 sigmas around mean.\\n\";\n      float lo   = result[0];\n      float hi   = result[1];\n      float mean = result[2];\n      float std  = result[3];\n      if (lo < mean - 2*std)\n        lo = mean - 2*std;\n      if (hi > mean + 2*std)\n        hi = mean + 2*std;\n      result[0] = lo;\n      result[1] = hi;\n    }\n\n    // Cache the results to disk\n    if (use_cache) {\n      vw_out() << \"\\tWriting stats file: \" << stats_file << \"\\n\";\n      Vector<float32> stats = result;  // cast\n      write_vector(stats_file, stats);\n    }\n\n  } // Done computing the results\n\n  vw_out() << \"\\tlo: \" << result[0] << \" hi: \" << result[1]\n           << \" mean: \" << result[2] << \" std_dev: \" << result[3] << \"\\n\";\n\n  return result;\n} // end function gather_stats\n\n// Checks if the given image file has an 8-bit channels\nbool hasByteChannels(const std::string& image_path) {\n\n  boost::shared_ptr<vw::DiskImageResource> rsrc = vw::DiskImageResourcePtr(image_path);\n  auto pixel_format = rsrc->pixel_format();\n  auto channel_type = rsrc->channel_type();\n  return (channel_type == vw::VW_CHANNEL_UINT8) && \n         (pixel_format == vw::VW_PIXEL_GRAY   ||\n          pixel_format == vw::VW_PIXEL_RGB    ||\n          pixel_format == vw::VW_PIXEL_RGBA   ||\n          pixel_format == vw::VW_PIXEL_GRAYA);\n}\n\n// Expand a box by a given percentage (typically pct is between 0 and 100)\nvoid expand_box_by_pct(vw::BBox2 & box, double pct) {\n  \n  // Check the pct is non-negative\n  if (pct < 0.0) \n    vw_throw(ArgumentErr() << \"Invalid percentage when expanding a box: \" \n              << pct << \".\\n\");\n    \n  double factor = pct / 100.0;\n  double half_extra_x = 0.5 * box.width()  * factor;\n  double half_extra_y = 0.5 * box.height() * factor;\n  box.min() -= Vector2(half_extra_x, half_extra_y);\n  box.max() += Vector2(half_extra_x, half_extra_y);\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Core/ImageUtils.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file ImageUtils.h\n/// Utility functions for handling images\n\n#ifndef __ASP_CORE_IMAGE_UTILS_H__\n#define __ASP_CORE_IMAGE_UTILS_H__\n\n#include <vw/Image/ImageViewRef.h>\n#include <vw/Camera/CameraModel.h>\n#include <vw/InterestPoint/InterestPoint.h>\n\nnamespace vw {\n  namespace cartography {\n    class GeoReference;\n  }\n}\n\nnamespace asp {\n\n/// Load an input image, georef, and nodata value\nvoid load_image(std::string const& image_file,\n                vw::ImageViewRef<double> & image, double & nodata,\n                bool & has_georef, vw::cartography::GeoReference & georef);\n\n/// Create a masked DEM\nvoid create_masked_dem(std::string const& dem_file,\n                       vw::cartography::GeoReference & dem_georef,\n                       vw::ImageViewRef<vw::PixelMask<double>> & masked_dem);\n\n/// Create a DEM ready to use for interpolation\nvoid create_interp_dem(std::string const& dem_file,\n                        vw::cartography::GeoReference & dem_georef,\n                        vw::ImageViewRef<vw::PixelMask<double>> & interp_dem);\n\n/// Take an interest point from a map projected image and convert it\n/// to the corresponding IP in the original non-map-projected image.\n/// - Return false if the pixel could not be converted.\nbool projected_ip_to_raw_ip(vw::ip::InterestPoint &P,\n                            vw::ImageViewRef<vw::PixelMask<double>> const& interp_dem,\n                            vw::CamPtr camera_model,\n                            vw::cartography::GeoReference const& georef,\n                            vw::cartography::GeoReference const& dem_georef);\n\n// Read keywords that describe how the images were map-projected.\nvoid read_mapproj_header(std::string const& map_file,\n                         // Outputs\n                         std::string & adj_key, std::string & img_file_key,\n                         std::string & cam_type_key, std::string & cam_file_key, \n                         std::string & dem_file_key,\n                         std::string & adj_prefix,\n                         std::string & image_file, std::string & cam_type,\n                         std::string & cam_file, std::string & dem_file);\n\n// Compute the min, max, mean, and standard deviation of an image object and\n// write them to a file. If prefix and image_path is set, will cache the results\n// to a file.\nvw::Vector<vw::float32,6>\ngather_stats(vw::ImageViewRef<vw::PixelMask<float>> image,\n             std::string const& out_prefix,\n             std::string const& image_path,\n             bool force_reuse_cache = false,\n             bool adjust_min_max_with_std = false);\n\n// Checks if the given image file has an 8-bit channels\nbool hasByteChannels(const std::string& image_path);\n\n// Expand a box by a given percentage (typically pct is between 0 and 100)\nvoid expand_box_by_pct(vw::BBox2 & box, double pct);\n\n} // end namespace asp\n\n#endif//__ASP_CORE_IMAGE_UTILS_H__\n"
  },
  {
    "path": "src/asp/Core/InterestPointMatching.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2024, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Core/InterestPointMatching.h>\n#include <asp/Core/StereoSettings.h>\n\n#include <vw/InterestPoint/IntegralDetector.h>\n#include <vw/InterestPoint/InterestPointUtils.h>\n#include <vw/InterestPoint/OpenCvDetector.h>\n#include <vw/InterestPoint/Matcher.h>\n#include <vw/InterestPoint/MatcherIO.h>\n#include <vw/Math/GaussianClustering.h>\n#include <vw/Math/RANSAC.h>\n#include <vw/Image/MaskViews.h>\n#include <vw/Cartography/CameraBBox.h>\n#include <vw/Stereo/StereoModel.h>\n#include <vw/Mosaic/ImageComposite.h>\n#include <vw/Image/AlgorithmFunctions.h>\n#include <vw/Core/Stopwatch.h>\n#include <vw/Math/Geometry.h>\n#include <vw/FileIO/FileUtils.h>\n\n#include <boost/smart_ptr/shared_ptr.hpp>\n#include <boost/foreach.hpp>\n\n#include <cmath>\n#include <set>\n\n// Some of the implementation is in InterestPointMatching2.cc\n\nusing namespace vw;\n\nnamespace fs = boost::filesystem;\nnamespace asp {\n\n// Detect interest points. Use a cached ip file if available and if the\n// use_cached_ip flag is set. This is not meant to be used directly. Use\n// ip_matching() or homography_ip_matching(). The caller is responsible for\n// checking if this cached file is not older than the input image. \nvoid detect_ip(vw::ip::InterestPointList& ip,\n               vw::ImageViewRef<float> const& image,\n               int ip_per_image, int ip_per_tile, \n               std::string const vwip_file, \n               double nodata, \n               bool use_cached_ip) {\n  if (use_cached_ip && fs::exists(vwip_file)) {\n\n    // Sanity check for when the vwip need to be redone     \n    if ((asp::stereo_settings().left_image_crop_win  != BBox2i(0, 0, 0, 0) ||\n         asp::stereo_settings().right_image_crop_win != BBox2i(0, 0, 0, 0)) ||\n         !asp::stereo_settings().skip_rough_homography) \n      vw::vw_throw(vw::ArgumentErr() \n                   << \"Cannot use cached ip with --left-image-crop-win, \"\n                   << \"--right-image-crop-win, or --skip-rough-homography.\\n\");\n    \n    vw::vw_out() << \"\\t    Loading cached interest points file: \" << vwip_file << \"\\n\";\n    ip = vw::ip::read_binary_ip_file_list(vwip_file);\n    return;\n  }\n  \n  vw::Stopwatch sw1;\n  sw1.start();\n\n  ip.clear();\n\n  // Automatically determine how many ip we need. Can be overridden below\n  // either by --ip-per-image or --ip-per-tile (the latter takes priority).\n  double tile_size = 1024.0;\n  vw::BBox2i box = vw::bounding_box(image.impl());\n  double number_tiles = (box.width() / tile_size) * (box.height() / tile_size);\n  \n  // Must have not have both ip per image and ip per tile set\n  if (ip_per_image > 0 && ip_per_tile > 0)\n    vw::vw_throw(vw::ArgumentErr()\n      << \"Cannot set both --ip-per-image and --ip-per-tile.\\n\");\n  \n  if (ip_per_tile == 0) {\n    // Create ip_per_tile from ip_per_image\n\n    if (ip_per_image == 0)\n      ip_per_image = 5000; // default\n\n    ip_per_tile = double(ip_per_image) / number_tiles;\n    if (ip_per_tile > 5000) ip_per_tile = 5000;\n    if (ip_per_tile < 50) ip_per_tile = 50;\n  }\n\n  vw::vw_out() << \"\\t    Using \" << ip_per_tile << \" interest points per tile (1024^2 px).\\n\";\n\n  const bool has_nodata = !std::isnan(nodata);\n\n  // Load the detection method from stereo_settings.\n  // - This relies on a direct match in the enum integer value.\n  DetectIpMethod detect_method\n    = static_cast<DetectIpMethod>(stereo_settings().ip_detect_method);\n\n  // Detect interest points.\n  // - Due to templated types we need to duplicate a bunch of code here\n  if (detect_method == DETECT_IP_METHOD_INTEGRAL) {\n    // Zack's custom detector\n    int num_scales = stereo_settings().num_scales;\n    if (num_scales <= 0)\n      num_scales = vw::ip::IntegralAutoGainDetector::IP_DEFAULT_SCALES;\n    else\n      vw::vw_out() << \"\\t    Using \" << num_scales\n        << \" scales in OBALoG interest point detection.\\n\";\n\n    vw::ip::IntegralAutoGainDetector detector(ip_per_tile, num_scales);\n\n    // This detector can't handle a mask so if there is nodata just set those pixels to zero.\n\n    vw::vw_out() << \"\\t    Detecting IP\\n\";\n    if (!has_nodata)\n      ip = detect_interest_points(pixel_cast<float>(image.impl()), detector, ip_per_tile);\n    else\n      ip = detect_interest_points(pixel_cast<float>(apply_mask(create_mask(image.impl(),nodata))), detector, ip_per_tile);\n  } else {\n\n    // Initialize the OpenCV detector.  Conveniently we can just pass in the type argument.\n    // - If VW was not build with OpenCV, this call will just throw an exception.\n    vw::ip::OpenCvIpDetectorType cv_method = vw::ip::OPENCV_IP_DETECTOR_TYPE_SIFT;\n    if (detect_method == DETECT_IP_METHOD_ORB)\n      cv_method = vw::ip::OPENCV_IP_DETECTOR_TYPE_ORB;\n\n    // The opencv detector only works if the inputs are normalized, so do it here if it was not done before.\n    // - If the images are already normalized most of the data will be in the 0-1 range.\n    // - This normalize option will normalize PER-TILE which has different results than\n    //   the whole-image normalization that ASP normally uses.\n    bool opencv_normalize = stereo_settings().skip_image_normalization;\n    if (stereo_settings().ip_normalize_tiles)\n      opencv_normalize = true;\n    if (opencv_normalize)\n      vw::vw_out() << \"\\t    Using per-tile image normalization for interest points detection...\\n\";\n\n    bool build_opencv_descriptors = true;\n    vw::ip::OpenCvInterestPointDetector detector(cv_method, opencv_normalize, build_opencv_descriptors, ip_per_tile);\n\n    // These detectors do accept a mask so use one if applicable.\n\n    vw::vw_out() << \"\\t    Detecting IP\\n\";\n    if (!has_nodata)\n      ip = detect_interest_points(pixel_cast<float>(image.impl()), detector, ip_per_tile);\n    else\n      ip = detect_interest_points(pixel_cast<float>(create_mask(image.impl(),nodata)), detector, ip_per_tile);\n  } // End OpenCV case\n\n  sw1.stop();\n  vw::vw_out(vw::DebugMessage,\"asp\") << \"Detect interest points elapsed time: \"\n                                     << sw1.elapsed_seconds() << \" s.\" << std::endl;\n  \n  if (!std::isnan(nodata)) {\n    vw::vw_out() << \"\\t    Removing IP near nodata with radius \"\n             << stereo_settings().ip_nodata_radius << std::endl;\n    remove_ip_near_nodata(image.impl(), nodata, ip, stereo_settings().ip_nodata_radius);\n  }\n\n  // For the two OpenCV options we already built the descriptors, so\n  // only do this for the integral method.\n  if (detect_method == DETECT_IP_METHOD_INTEGRAL) {\n    vw::Stopwatch sw2;\n    sw2.start();\n    vw::vw_out() << \"\\t    Building descriptors\" << std::endl;\n    vw::ip::SGradDescriptorGenerator descriptor;\n    if (!has_nodata)\n      describe_interest_points(image.impl(), descriptor, ip);\n    else\n      describe_interest_points(apply_mask(create_mask(image.impl(),nodata)), descriptor, ip);\n    sw2.stop();\n    vw::vw_out(vw::DebugMessage,\"asp\") << \"Building descriptors elapsed time: \"\n                                       << sw2.elapsed_seconds() << \" s.\" << std::endl;\n  }\n\n  vw::vw_out() << \"\\t    Number of interest points: \" << ip.size() << std::endl;\n\n  // If a file path was provided, record the IP (before matching) to disk.\n  if (vwip_file != \"\") {\n    vw::vw_out() << \"\\t    Writing interest points: \" << vwip_file << \"\\n\";\n    vw::ip::write_binary_ip_file(vwip_file, ip);\n  }\n\n  return;\n}\n\n// Detect IP in a pair of images and apply rudimentary filtering.\n// Returns false if either image ended up with zero IP.\nbool detect_ip_pair(vw::ip::InterestPointList& ip1,\n                    vw::ip::InterestPointList& ip2,\n                    vw::ImageViewRef<float> const& image1,\n                    vw::ImageViewRef<float> const& image2,\n                    int ip_per_image, int ip_per_tile,\n                    std::string const left_vwip_file,\n                    std::string const right_vwip_file,\n                    double nodata1, double nodata2,\n                    bool use_cached_ip) {\n\n  vw::Stopwatch sw1;\n  sw1.start();\n\n  // Detect interest points in the two images\n  vw::vw_out() << \"\\t    Looking for interest points in left image.\\n\";\n  detect_ip(ip1, vw::pixel_cast<float>(image1), \n            ip_per_image, ip_per_tile, left_vwip_file, \n            nodata1, use_cached_ip);\n  vw::vw_out() << \"\\t    Looking for interest points in right image.\\n\";\n  detect_ip(ip2, vw::pixel_cast<float>(image2), \n            ip_per_image, ip_per_tile, right_vwip_file,\n            nodata2, use_cached_ip);\n\n  if (stereo_settings().ip_debug_images) {\n    vw::vw_out() << \"\\t    Writing detected IP debug images. \" << std::endl;\n    write_ip_debug_image(\"ASP_IP_detect_debug1.tif\", image1, ip1, !std::isnan(nodata1), nodata1);\n    write_ip_debug_image(\"ASP_IP_detect_debug2.tif\", image2, ip2, !std::isnan(nodata2), nodata2);\n  }\n\n  side_ip_filtering(ip1, ip2, bounding_box(image1), bounding_box(image2));\n\n  sw1.stop();\n  vw::vw_out() << \"Elapsed time in ip detection: \" << sw1.elapsed_seconds() << \" s.\\n\";\n\n  return ((ip1.size() > 0) && (ip2.size() > 0));\n}\n\n/// Detect interest points and use a simple matching technique.\n/// This is not meant to be used directly. Use ip_matching().\nvoid detect_match_ip(std::vector<vw::ip::InterestPoint>& matched_ip1,\n                     std::vector<vw::ip::InterestPoint>& matched_ip2,\n                     vw::ImageViewRef<float> const& image1,\n                     vw::ImageViewRef<float> const& image2,\n                     int ip_per_tile, size_t number_of_jobs,\n                     std::string const left_vwip_file,\n                     std::string const right_vwip_file,\n                     bool use_cached_ip,\n                     double nodata1,\n                     double nodata2,\n                     std::string const& match_file) {\n\n  // Detect interest points in the two images\n  vw::ip::InterestPointList ip1, ip2;\n  detect_ip_pair(ip1, ip2, image1, image2, \n                 asp::stereo_settings().ip_per_image, ip_per_tile,\n                 left_vwip_file, right_vwip_file, nodata1, nodata2,\n                 use_cached_ip);\n\n  // Match the ip and save the match file. No epipolar constraint\n  // is used in this mode.\n  match_ip_no_datum(ip1, ip2, image1, image2, number_of_jobs, \n                    matched_ip1, matched_ip2, match_file); // outputs\n\n} // End function detect_match_ip\n\nvoid check_homography_matrix(Matrix<double> const& H,\n                             int left_size, int right_size, int num_inliers) {\n\n  // Ensure H has at least 2 rows and 2 columns\n  if (H.rows() < 2 || H.cols() < 2)\n    vw::vw_throw(ArgumentErr() << \"InterestPointMatching: Homography matrix is too small.\\n\");\n    return;\n\n  // Sanity checks. If these fail, most likely the two images are too different\n  // for stereo to succeed.\n  if (num_inliers < std::min(left_size, right_size)/2) {\n    vw_out(WarningMessage) << \"InterestPointMatching: The number of inliers is less \"\n                           << \"than 1/2 of the number of points. The inputs may be invalid.\\n\";\n  }\n\n  double det = fabs(H(0, 0)*H(1, 1) - H(0, 1)*H(1, 0));\n  if (det <= 0.1 || det >= 10.0) {\n    vw_out(WarningMessage) << \"InterestPointMatching: The determinant of the 2x2 submatrix \"\n                           << \"of the homography matrix \" << H << \" is \" << det << \". \"\n                           << \"There could be a large scale discrepancy among the input images \"\n                           << \"or the inputs may be an invalid stereo pair.\\n\";\n  }\n}\n\n// Find a rough homography that maps right to left using the camera\n// and datum information.  More precisely, take a set of pixels in\n// the left camera image, project them onto the ground and back\n// project them into the right camera image. Then to the\n// reverse. This will help find a rough correspondence between\n// the pixels in the two camera images.\nMatrix<double>\nrough_homography_fit(camera::CameraModel* cam1,\n                     camera::CameraModel* cam2,\n                     BBox2i const& box1, BBox2i const& box2,\n                     cartography::Datum const& datum) {\n\n  vw::Stopwatch sw;\n  sw.start();\n\n  // Bounce several points off the datum and fit an affine.\n  std::vector<Vector3> left_points, right_points;\n  int num = 100;\n  left_points.reserve(2*num*num);\n  right_points.reserve(2*num*num);\n\n  // Report progress, as this may be slow\n  TerminalProgressCallback tpc(\"\", \"\\tRough homography--> \");\n  tpc.report_progress(0);\n  double inc_amount = 1.0 / double(num) / double(num);\n\n  for (int i = 0; i < num; i++) {\n    for (int j = 0; j < num; j++) {\n      try {\n        Vector2 l(double(box1.width()  - 1) * i / (num-1.0),\n                   double(box1.height() - 1) * j / (num-1.0));\n\n        Vector3 intersection = cartography::datum_intersection(datum, cam1, l);\n        if (intersection == Vector3())\n          continue;\n\n        Vector2 r = cam2->point_to_pixel(intersection);\n\n        if (box2.contains(r)) {\n          left_points.push_back(Vector3(l[0],l[1],1));\n          right_points.push_back(Vector3(r[0],r[1],1));\n        }\n      } catch (...) {}\n\n      try {\n        Vector2 r(double(box2.width()  - 1) * i / (num-1.0),\n                  double(box2.height() - 1) * j / (num-1.0));\n\n        Vector3 intersection = cartography::datum_intersection(datum, cam2, r);\n        if (intersection == Vector3())\n          continue;\n\n        Vector2 l = cam1->point_to_pixel(intersection);\n\n        if (box1.contains(l)) {\n          left_points.push_back(Vector3(l[0],l[1],1));\n          right_points.push_back(Vector3(r[0],r[1],1));\n        }\n      } catch (...) {}\n      tpc.report_incremental_progress(inc_amount);\n    }\n  }\n  tpc.report_finished();\n\n  // At most 5000 points should be enough for rough homography as it is a simple transform.\n  vw::ip::pick_pair_subset(left_points, right_points, 5000);\n\n  vw_out() << \"Projected \" << left_points.size()\n           << \" rays for rough homography.\\n\";\n\n  if (left_points.empty() || right_points.empty())\n    vw_throw(ArgumentErr() << \"InterestPointMatching: rough_homography_fit failed to generate points! Examine your images, or consider using the options --skip-rough-homography and --no-datum.\\n\");\n\n  // The --ip-inlier-factor is 0.2 by default in stereo and bundle_adjust. \n  // This results in inlier_th = 0.1 * diagonal. May be too high for large images,\n  // but the rough homography is well-behaved, since it uses cameras, and not\n  // interest points, so it should be fine.\n  double thresh_factor = stereo_settings().ip_inlier_factor;\n  double inlier_th = norm_2(Vector2(box1.width(), box1.height())) * (0.5 * thresh_factor);\n  inlier_th = std::max(inlier_th, 30.0); // don't allow it to be too small\n\n  int min_inliers = left_points.size()/2;\n  bool reduce_num_if_no_fit = true;\n\n  // Using 1000 iterations is excessive here given that the these produced\n  // interest points are not too noisy. This also takes a long time.\n  int num_iter = stereo_settings().ip_num_ransac_iterations/10 + 50; // about 150\n\n  vw_out() << \"\\t    Rough homography inlier threshold: \" << inlier_th << \"\\n\";\n\n  // Use RANSAC to determine a good homography transform between the images\n  vw_out() << \"Estimating rough homography using RANSAC with \"\n    << num_iter << \" iterations.\\n\";\n  typedef math::HomographyFittingFunctor hfit_func;\n  math::RandomSampleConsensus<hfit_func, math::InterestPointErrorMetric>\n    ransac(hfit_func(), math::InterestPointErrorMetric(),\n           num_iter, inlier_th, min_inliers, reduce_num_if_no_fit);\n\n  Matrix<double> H = ransac(right_points, left_points);\n  std::vector<size_t> indices = ransac.inlier_indices(H, right_points, left_points);\n  check_homography_matrix(H, left_points.size(), right_points.size(), indices.size());\n  vw_out() << \"Number of inliers: \" << indices.size() << \".\\n\";\n\n  sw.stop();\n  vw_out() << \"Rough homography fit elapsed time: \" << sw.elapsed_seconds() << \" s.\\n\";\n\n  return H;\n}\n\n// Filter ip with homography. This is a wrapper around RANSAC.\nvoid filter_ip_homog(std::vector<vw::ip::InterestPoint> const& ip1_in,\n                     std::vector<vw::ip::InterestPoint> const& ip2_in,\n                     double inlier_th,\n                     // Outputs\n                     vw::Matrix<double> & H,\n                     std::vector<size_t> & indices) {\n\n  // Initialize the outputs. Ensure H is a valid matrix, in case ransac fails.\n  H = vw::math::identity_matrix<3>();\n  H.set_identity();\n  indices.clear();\n\n  vw::vw_out() << \"\\t    Filtering interest point matches using homography.\\n\";\n  try {\n\n    auto ransac_ip1 = iplist_to_vectorlist(ip1_in);\n    auto ransac_ip2 = iplist_to_vectorlist(ip2_in);\n\n    int min_inliers = ransac_ip1.size()/2;\n    bool reduce_num_if_no_fit = true;\n\n    vw_out() << \"\\t    Homography ip filter inlier threshold: \" << inlier_th << \"\\n\";\n    vw_out() << \"\\t    RANSAC iterations:                     \"\n             << stereo_settings().ip_num_ransac_iterations << \"\\n\";\n\n    typedef math::RandomSampleConsensus<math::HomographyFittingFunctor,\n      math::InterestPointErrorMetric> RansacT;\n    RansacT ransac(math::HomographyFittingFunctor(),\n                   math::InterestPointErrorMetric(),\n                   stereo_settings().ip_num_ransac_iterations,\n                   inlier_th,\n                   min_inliers, reduce_num_if_no_fit);\n    H = ransac(ransac_ip2, ransac_ip1); // 2 then 1 is used here for legacy reasons\n    indices = ransac.inlier_indices(H, ransac_ip2, ransac_ip1);\n    vw::vw_out() << \"Homography matrix:\\n\" << H << \"\\n\";\n    vw_out() << \"Number of inliers: \" << indices.size() << \".\\n\";\n    check_homography_matrix(H, ransac_ip1.size(), ransac_ip2.size(), indices.size());\n    \n  } catch (const math::RANSACErr& e) {\n    vw_out() << \"RANSAC failed: \" << e.what() << \"\\n\";\n    return;\n  }\n\n}\n\n// Compute the homography matrix (in right_matrix). The left matrix\n// will have a translation corresponding to a crop.\nVector2i homography_rectification(bool adjust_left_image_size,\n                                  bool tight_inlier_threshold,\n                                  Vector2i const& left_size,\n                                  Vector2i const& right_size,\n                                  std::vector<ip::InterestPoint> const& left_ip,\n                                  std::vector<ip::InterestPoint> const& right_ip,\n                                  vw::Matrix<double>& left_matrix,\n                                  vw::Matrix<double>& right_matrix) {\n\n  // This number is 1/15 by default in stereo, and 0.2 in bundle_adjust. The\n  // latter is more tolerant of outliers, but for stereo this can result in a\n  // huge search range for disparity, which is not good.\n\n  // TODO(oalexan1): This number can be too large for large images. Maybe need\n  // to use the square root of the diagonal of the image size. Also, in some\n  // related places a constant factor is used, like 30. Need to make that\n  // uniform.\n  double thresh_factor = stereo_settings().ip_inlier_factor;\n  double inlier_th = norm_2(Vector2(left_size.x(),left_size.y())) * (0.5*thresh_factor);\n\n  // When determining matches per tile, a loose threshold can result in inaccurate\n  // determination of the homography. We'd rather have it accurate here and throw\n  // away some good matches than the other way around. Later these matches will\n  // be replaced with matches per tile once the homography transform is found.\n  if (tight_inlier_threshold) {\n    inlier_th = std::min(0.05*norm_2(Vector2(left_size.x(),left_size.y())), inlier_th);\n    inlier_th = std::min(inlier_th, 200.0);\n    inlier_th = std::max(inlier_th, 50.0);\n  }\n\n  Matrix<double> H = vw::math::identity_matrix<3>();\n  std::vector<size_t> indices;\n  filter_ip_homog(left_ip, right_ip, inlier_th,\n                  H, indices); // outputs\n\n  // TODO(oalexan1): A percentile-based filter may help here, after finding\n  // the inliers. It should be based on estimating H * right - left.\n  // That because the inlier threshold is kind of arbitrary.\n  // If outliers are found, need to recompute H based on inliers, which is quick.\n  check_homography_matrix(H, left_ip.size(), right_ip.size(), indices.size());\n\n  // Set right to a homography that has been refined just to our inliers.\n  // May be adjusted with a translation below.\n  // TODO(oalexan1): It is not clear if adjusting a homography transform's\n  // translation coefficients is the right way of applying a translation to it,\n  // because it has a denominator too.\n  left_matrix  = vw::math::identity_matrix<3>();\n  right_matrix = H;\n\n  // Work out the ideal render size\n  BBox2i output_bbox, right_bbox;\n  output_bbox.grow(Vector2i(0, 0));\n  output_bbox.grow(Vector2i(left_size.x(), 0));\n  output_bbox.grow(Vector2i(0, left_size.y()));\n  output_bbox.grow(left_size);\n\n  if (adjust_left_image_size) {\n    // Crop the left and right images to the shared region. This is\n    // done for efficiency.  It may not be always desirable though,\n    // as in this case we lose the one-to-one correspondence between\n    // original input left image pixels and output disparity/point\n    // cloud pixels.\n    Vector3 temp = right_matrix*Vector3(0,0,1);\n    temp /= temp.z();\n    right_bbox.grow(subvector(temp,0,2));\n    temp = right_matrix*Vector3(right_size.x(),0,1);\n    temp /= temp.z();\n    right_bbox.grow(subvector(temp,0,2));\n    temp = right_matrix*Vector3(0,right_size.y(),1);\n    temp /= temp.z();\n    right_bbox.grow(subvector(temp,0,2));\n    temp = right_matrix*Vector3(right_size.x(),right_size.y(),1);\n    temp /= temp.z();\n    right_bbox.grow(subvector(temp,0,2));\n\n    output_bbox.crop(right_bbox);\n\n    //  Move the ideal render size to be aligned up with origin\n    left_matrix (0,2) -= output_bbox.min().x();\n    right_matrix(0,2) -= output_bbox.min().x();\n    left_matrix (1,2) -= output_bbox.min().y();\n    right_matrix(1,2) -= output_bbox.min().y();\n  }\n\n  return Vector2i(output_bbox.width(), output_bbox.height());\n}\n\n/// Remove points in/out of a bounding box depending on \"remove_outside\".\n/// - Returns the number of points removed.\nsize_t remove_ip_bbox(vw::BBox2i const& roi, vw::ip::InterestPointList & ip_list,\n                      bool remove_outside) {\n  // Loop through all the points\n  size_t num_removed = 0;\n  vw::ip::InterestPointList::iterator ip;\n  for (ip = ip_list.begin(); ip != ip_list.end(); ++ip) {\n\n    if (roi.contains(vw::Vector2i(ip->ix,ip->iy)) xor remove_outside) {\n      ip = ip_list.erase(ip);\n      ++num_removed;\n      --ip;\n    }\n  }\n  return num_removed;\n} // End function remove_ip_bbox\n\nvoid side_ip_filtering(vw::ip::InterestPointList& ip1,\n                       vw::ip::InterestPointList& ip2,\n                       vw::BBox2i const& bbox1, vw::BBox2i const& bbox2) {\n\n  // Filter out IP from the opposite sides of the two images.\n  // - Would be better to just pass an ROI into the IP detector!\n  if (stereo_settings().ip_edge_buffer_percent <= 0)\n    return;\n\n  // Figure out removal bboxes\n  double percent  = static_cast<double>(stereo_settings().ip_edge_buffer_percent)/100.0;\n  int   width_left  = floor(static_cast<double>(bbox1.width()) * percent);\n  int   width_right = floor(static_cast<double>(bbox2.width()) * percent);\n  BBox2 bbox_left (width_left, 0, bbox1.width()-width_left,  bbox1.height());\n  BBox2 bbox_right(0,          0, bbox2.width()-width_right, bbox2.height());\n  bool  remove_outside = true;\n\n  // Remove the points\n  size_t num_removed_left  = remove_ip_bbox(bbox_left,  ip1, remove_outside);\n  size_t num_removed_right = remove_ip_bbox(bbox_right, ip2, remove_outside);\n  vw_out() << \"Removed: \" << num_removed_left << \" points from the left side of the left image and \"\n           << num_removed_right << \" points from the right side of the right image.\\n\";\n} // End side IP filtering\n\nbool tri_ip_filtering(std::vector<ip::InterestPoint> const& matched_ip1,\n                  std::vector<ip::InterestPoint> const& matched_ip2,\n                  vw::camera::CameraModel* cam1,\n                  vw::camera::CameraModel* cam2,\n                  std::list<size_t>& valid_indices) {\n  typedef std::vector<double> ArrayT;\n  ArrayT error_samples(valid_indices.size());\n\n  // Create the 'error' samples. Which are triangulation error and distance to sphere.\n  double angle_tol = vw::stereo::StereoModel::robust_1_minus_cos(stereo_settings().min_triangulation_angle*M_PI/180);\n\n  stereo::StereoModel model(cam1, cam2, angle_tol);\n  size_t count = 0;\n  const double HIGH_ERROR = 9999999;\n  BOOST_FOREACH(size_t i, valid_indices) {\n    model(Vector2(matched_ip1[i].x, matched_ip1[i].y),\n           Vector2(matched_ip2[i].x, matched_ip2[i].y), error_samples[count]);\n    // The call returns exactly zero error to indicate a failed ray intersection\n    //  so replace it in those cases with a very high error\n    if (error_samples[count] == 0)\n      error_samples[count] = HIGH_ERROR;\n    count++;\n  }\n  VW_ASSERT(count == valid_indices.size(),\n            vw::MathErr() << \"Error: tri_ip_filtering: count indices not aligned.\");\n\n  typedef std::vector<std::pair<Vector<double>, Vector<double> > > ClusterT;\n  const size_t NUM_CLUSTERS = 2;\n  ClusterT error_clusters = gaussian_clustering<ArrayT>(error_samples.begin(),\n      error_samples.end(), NUM_CLUSTERS);\n\n  // The best triangulation error is the one that has the smallest\n  // standard deviations. They are focused on the tight pack of\n  // inliers. Bring the smaller std-dev cluster to the front as it\n  // is what we are interested in.OB\n  if ((error_clusters.front().second[0] > error_clusters.back().second[0]) &&\n      (error_clusters.back().second[0] != std::numeric_limits<double>::epsilon()))\n    std::swap(error_clusters[0], error_clusters[1]);\n\n  // Determine if we just wrote nothing but outliers (the variance\n  // on triangulation is too high).\n  if (error_clusters.front().second[0] > 1e6) {\n\n    vw_out() << \"\\t    Unable to find inlier cluster, keeping best 70% of points.\\n\";\n\n    // Instead of failing, take our best guess at which points are inliers\n    // - Sort the error, then find an approximate percentile.\n    const double CUTOFF_PERCENTILE = 0.7;\n    std::vector<double> sorted_error(error_samples);\n    std::sort(sorted_error.begin(), sorted_error.end());\n    size_t last_good_index = static_cast<double>(sorted_error.size()) * CUTOFF_PERCENTILE;\n    double cutoff_value = 0;\n    if (last_good_index < sorted_error.size())\n      cutoff_value = sorted_error[last_good_index];\n    // The maximum triangulation error still applies!\n    if ((asp::stereo_settings().ip_triangulation_max_error > 0) &&\n        (cutoff_value > asp::stereo_settings().ip_triangulation_max_error))\n      cutoff_value = asp::stereo_settings().ip_triangulation_max_error;\n\n    // Treat all points below the new cutoff_value as inliers\n    std::list<size_t> filtered_indices;\n    size_t c=0;\n    for (auto i = valid_indices.begin(); i != valid_indices.end(); i++) {\n        if (error_samples[c] < cutoff_value)\n          filtered_indices.push_back(*i);\n        c++;\n      }\n    valid_indices = filtered_indices;\n    return (!valid_indices.empty());\n  } // End of \"nothing but outliers\" case\n\n  vw_out() << \"\\t    Inlier cluster:\\n\"\n           << \"\\t      Triangulation error: \" << error_clusters.front().first[0]\n           << \" +- \" << sqrt(error_clusters.front().second[0]) << \" meters\\n\";\n\n  // Record indices of points that match our clustering result\n  const double escalar1 = 1.0 / sqrt(2.0 * M_PI * error_clusters.front().second[0]); // outside exp of normal eq\n  const double escalar2 = 1.0 / sqrt(2.0 * M_PI * error_clusters.back().second[0]);\n  const double escalar3 = 1.0 / (2 * error_clusters.front().second[0]); // inside exp of normal eq\n  const double escalar4 = 1.0 / (2 * error_clusters.back().second[0]);\n  size_t error_idx        = 0;\n  size_t prior_valid_size = valid_indices.size();\n  size_t outlier_count    = 0;\n  for (std::list<size_t>::iterator i = valid_indices.begin(); i != valid_indices.end(); i++) {\n    double err_diff_front = error_samples[error_idx]-error_clusters.front().first[0];\n    double err_diff_back  = error_samples[error_idx]-error_clusters.back ().first[0];\n\n    if (!((escalar1 * exp((-err_diff_front * err_diff_front) * escalar3)) >\n           (escalar2 * exp((-err_diff_back  * err_diff_back) * escalar4)) ||\n           error_samples[error_idx] < error_clusters.front().first[0]) ||\n         ((asp::stereo_settings().ip_triangulation_max_error > 0) &&\n           (error_samples[error_idx] > asp::stereo_settings().ip_triangulation_max_error))) {\n      // It's an outlier!\n      //vw_out() << \"Removing error_samples[\"<< error_idx <<\"] = \" << error_samples[error_idx] << std::endl;\n      i = valid_indices.erase(i);\n      i--; // For loop is going to increment this back up\n      ++outlier_count;\n    }\n    error_idx++;\n  }\n  VW_ASSERT(prior_valid_size == error_idx,\n            vw::MathErr() << \"tri_ip_filtering: Programmer error. Indices don't \"\n            << \"seem to be aligned.\");\n\n  vw_out() << \"\\t      Removed \" << outlier_count << \" points in triangulation filtering.\\n\";\n  return (!valid_indices.empty());\n}\n\nbool stddev_ip_filtering(std::vector<vw::ip::InterestPoint> const& ip1,\n                         std::vector<vw::ip::InterestPoint> const& ip2,\n                         std::list<size_t>& valid_indices) {\n  const int NUM_STD_FILTER = 4;\n  // 4 stddev filtering. Deletes any disparity measurement that is 4\n  // stddev away from the measurements of it's local neighbors. We\n  // kill off worse offender one at a time until everyone is compliant.\n  bool deleted_something = false;\n  size_t num_deleted = 0;\n  do {\n    deleted_something = false;\n    Matrix<float> locations1(valid_indices.size(), 2);\n    size_t count = 0;\n    std::vector<size_t > reverse_lookup  (valid_indices.size());\n    std::vector<Vector2> disparity_vector(valid_indices.size());\n    BOOST_FOREACH(size_t index, valid_indices) {\n      locations1(count, 0) = ip1[index].x;\n      locations1(count, 1) = ip1[index].y;\n      reverse_lookup  [count] = index;\n      disparity_vector[count] = Vector2(ip2[index].x,ip2[index].y) -\n        Vector2(ip1[index].x,ip1[index].y);\n      count++;\n    }\n    math::FLANNTree<float> tree1(asp::stereo_settings().flann_method);\n    tree1.load_match_data(locations1, vw::math::FLANN_DistType_L2);\n\n    std::pair<double,size_t> worse_index;\n    worse_index.first = 0;\n    for (size_t i = 0; i < valid_indices.size(); i++) {\n      Vector<int> indices;\n      Vector<double> distance;\n      const int NUM_INDICES_TO_GET = 11;\n      tree1.knn_search(select_row(locations1, i),\n                       indices, distance, NUM_INDICES_TO_GET);\n\n      // Bugfix: If there are too few inputs, in rare occasions\n      // some of the outputs are invalid. Not always. Could not\n      // figure this out in reasonable time, the logic is somewhere\n      // deep inside FLANN. Just discard the bad results.\n      std::vector<int> good_indices;\n      for (size_t j = 0; j < indices.size(); j++) {\n        if ((indices[j] < 0) || (indices[j] >= (int)disparity_vector.size()))\n          continue;\n        good_indices.push_back(indices[j]);\n      }\n\n      // Make an average of the disparities around us and not our own measurement\n      Vector2 sum;\n      for (size_t j = 1; j < good_indices.size(); j++) {\n        sum += disparity_vector[good_indices[j]];\n      }\n      sum = normalize(sum);\n\n      // Project all disparities along the new gradient\n      Vector<double> projections(good_indices.size());\n      for (size_t j = 0; j < good_indices.size(); j++) {\n        projections[j] = dot_prod(disparity_vector[good_indices[j]], sum);\n      }\n      double mean   = 0;\n      double stddev = 0;\n      for (size_t j = 1; j < good_indices.size(); j++) {\n        mean += projections[j];\n        stddev += projections[j]*projections[j];\n      }\n      mean /= good_indices.size() - 1;\n      stddev = sqrt(stddev / (good_indices.size() - 1) - mean*mean);\n\n      double std_distance = fabs(projections[0]-mean)/stddev;\n      if (std_distance > worse_index.first) {\n        worse_index.first = std_distance;\n        worse_index.second = i;\n      }\n    } // End loop through valid indices\n    if (worse_index.first > NUM_STD_FILTER) {\n      std::list<size_t>::iterator it = valid_indices.begin();\n      std::advance(it, worse_index.second);\n      valid_indices.erase(it);\n      deleted_something = true;\n      ++num_deleted;\n    }\n    // If we ended up deleting everything, just quit here and return 0.\n    if (valid_indices.empty())\n      return 0;\n  } while (deleted_something);\n\n  vw_out() << \"\\t      Removed \" << num_deleted << \" points in stddev filtering.\\n\";\n  return valid_indices.size();\n}\n\nsize_t filter_ip_by_lonlat_and_elevation(vw::TransformPtr         tx_left,\n                                         vw::TransformPtr         tx_right,\n                                         vw::camera::CameraModel* left_camera_model,\n                                         vw::camera::CameraModel* right_camera_model,\n                                         vw::cartography::Datum        const& datum,\n                                         std::vector<vw::ip::InterestPoint> const& ip1_in,\n                                         std::vector<vw::ip::InterestPoint> const& ip2_in,\n                                         vw::Vector2 const & elevation_limit,\n                                         vw::BBox2   const & lon_lat_limit,\n                                         std::vector<vw::ip::InterestPoint> & ip1_out,\n                                         std::vector<vw::ip::InterestPoint> & ip2_out) {\n\n  // Handle case where the elevation or lonlat range are not set\n  const size_t num_ip = ip1_in.size();\n  if (elevation_limit[1] <= elevation_limit[0] && lon_lat_limit.empty()) {\n    ip1_out = ip1_in;\n    ip2_out = ip2_in;\n    return num_ip;\n  }\n\n  if (elevation_limit[0] < elevation_limit[1])\n    vw_out() << \"\\t    * Applying elevation restriction. Height range: \" << elevation_limit[0]\n             << \" to \" << elevation_limit[1] << \".\\n\";\n\n  if (!lon_lat_limit.empty())\n    vw_out() << \"\\t    * Applying lon-lat restriction: \" << lon_lat_limit.min()\n             << \" to \" << lon_lat_limit.max() << \".\\n\";\n\n  // Init output vectors\n  ip1_out.clear();\n  ip2_out.clear();\n  ip1_out.reserve(num_ip);\n  ip2_out.reserve(num_ip);\n\n  // Set up stereo model\n  double angle_tolerance = vw::stereo::StereoModel::robust_1_minus_cos\n    (stereo_settings().min_triangulation_angle*M_PI/180);\n  vw::stereo::StereoModel model(left_camera_model, right_camera_model,\n                                angle_tolerance);\n\n  // This function can be called with both unaligned and aligned interest points\n  bool aligned_ip = (tx_left.get() != NULL && tx_right != NULL);\n\n  // For each interest point, compute the height and only keep it if the height falls within\n  // the specified range.\n  for (size_t i = 0; i < num_ip; i++) {\n\n    // We must not both apply a transform and a scale at the same time\n    // as these are meant to do the same thing in different circumstances.\n    Vector2 p1 = Vector2(ip1_in[i].x, ip1_in[i].y);\n    Vector2 p2 = Vector2(ip2_in[i].x, ip2_in[i].y);\n\n    if (aligned_ip) {\n      // Unalign\n      p1 = tx_left->reverse (p1);\n      p2 = tx_right->reverse(p2);\n    }\n\n    // Triangulate\n    double err = -1.0;\n    Vector3 xyz(0.0, 0.0, 0.0);\n    try {\n      xyz = model(p1, p2, err);\n    } catch(...) {\n      xyz = Vector3();\n    }\n\n    if (err <= 0.0 || xyz == Vector3()) {\n      // Triangulation failed\n      continue;\n    }\n\n    Vector3 llh = datum.cartesian_to_geodetic(xyz);\n    if ((elevation_limit[0] < elevation_limit[1]) &&\n         ((llh[2] < elevation_limit[0]) || (llh[2] > elevation_limit[1]))) {\n      // vw_out() << \"Removing IP diff: \" << p2 - p1 << \" with llh \" << llh << std::endl;\n      continue;\n    }\n\n    Vector2 lon_lat = subvector(llh, 0, 2);\n    if ((!lon_lat_limit.empty()) && (!lon_lat_limit.contains(lon_lat))) {\n      continue;\n    }\n\n    // vw_out() << \"Keeping IP diff: \" << p2 - p1 << \" with llh \" << llh << std::endl;\n    ip1_out.push_back(ip1_in[i]);\n    ip2_out.push_back(ip2_in[i]);\n  }\n  vw_out() << \"\\t    * Removed \" << ip1_in.size() - ip1_out.size()\n           << \" ip using elevation/lonlat filtering.\\n\";\n\n  return ip1_out.size();\n} // End filter_ip_by_elevation\n\n// Filter ip by triangulation error and height range.\n// This assumes the interest points are for the original images, without alignment\n// or mapprojection.\n// TODO(oalexan1): Add here the ability to reverse the alignment\nvoid filter_ip_using_cameras(std::vector<vw::ip::InterestPoint> & ip1,\n                             std::vector<vw::ip::InterestPoint> & ip2,\n                             vw::camera::CameraModel const * cam1,\n                             vw::camera::CameraModel const * cam2,\n                             vw::cartography::Datum  const & datum,\n                             double pct, double factor) {\n\n  std::vector<double> tri_errors(ip1.size()), heights(ip1.size());\n\n  // Compute the triangulation errors\n  double angle_tol = vw::stereo::StereoModel\n    ::robust_1_minus_cos(stereo_settings().min_triangulation_angle*M_PI/180);\n  stereo::StereoModel model(cam1, cam2, angle_tol);\n  double HIGH_ERROR = std::numeric_limits<double>::max();\n  for (size_t i = 0; i < ip1.size(); i++) {\n    Vector3 xyz;\n    try {\n      xyz = model(Vector2(ip1[i].x, ip1[i].y), Vector2(ip2[i].x, ip2[i].y),\n                  tri_errors[i]);\n    } catch(...) {\n      xyz = Vector3();\n    }\n\n    // The call returns the zero tri error and zero xyz to indicate a\n    // failed ray intersection so replace it in those cases with a\n    // very high error.\n    if (tri_errors[i] == 0 || xyz == Vector3()) {\n      tri_errors[i]  = HIGH_ERROR;\n      heights[i] = HIGH_ERROR;\n      continue;\n    }\n\n    // Find the height above datum\n    Vector3 llh = datum.cartesian_to_geodetic(xyz);\n    heights[i] = llh[2];\n  }\n\n  // Put the valid heights in a vector\n  std::vector<double> vals;\n  vals.reserve(ip1.size());\n  vals.clear();\n  for (size_t i = 0; i < ip1.size(); i++) {\n    if (heights[i] >= HIGH_ERROR) continue;\n    vals.push_back(heights[i]);\n  }\n\n  // Find the outlier brackets\n  double pct_fraction = 1.0 - pct/100.0;\n  double b = -1.0, e = -1.0;\n  vw::math::find_outlier_brackets(vals, pct_fraction, factor, b, e);\n\n  // Apply the outlier threshold\n  int count = 0;\n  for (size_t i = 0; i < ip1.size(); i++) {\n    if (heights[i] >= HIGH_ERROR) continue;\n    if (heights[i] < b || heights[i] > e) {\n      heights[i] = HIGH_ERROR;\n      count++;\n    }\n  }\n  vw_out() << \"Number (and fraction) of removed outliers by the height check: \"\n           << count << \" (\" << double(count)/ip1.size() << \").\\n\";\n\n  // Find the valid tri errors. Make use of the fact that we already filtered by height.\n  vals.clear();\n  for (size_t i = 0; i < ip1.size(); i++) {\n    if (tri_errors[i] >= HIGH_ERROR || heights[i] >= HIGH_ERROR) // already invalid\n      continue;\n    vals.push_back(tri_errors[i]);\n  }\n\n  // Find the outlier brackets. Since the triangulation errors, unlike\n  // the heights, are usually rather uniform, adjust pct from 95 to\n  // 75.\n  double pct2 = (75.0/95.0) * pct;\n  double pct_fraction2 = 1.0 - pct2/100.0;\n  // Show some lenience below as due to jitter some errors could be somewhat bigger\n  double factor2 = 2.0 * factor;\n  b = -1.0; e = -1.0;\n  vw::math::find_outlier_brackets(vals, pct_fraction2, factor2, b, e);\n\n  // Apply the outlier threshold\n  count = 0;\n  for (size_t i = 0; i < ip1.size(); i++) {\n    if (heights[i] >= HIGH_ERROR || tri_errors[i] >= HIGH_ERROR) continue; // already invalid\n    // We will ignore b, as the triangulation errors are non-negative.\n    if (tri_errors[i] > e) {\n      tri_errors[i] = HIGH_ERROR;\n      count++;\n    }\n  }\n\n  vw_out() << \"Number (and fraction) of removed outliers by the triangulation error check: \"\n           << count << \" (\" << double(count)/ip1.size() << \").\\n\";\n\n  // Copy the outliers in place\n  count = 0;\n  for (size_t i = 0; i < ip1.size(); i++) {\n    if (tri_errors[i] >= HIGH_ERROR || heights[i] >= HIGH_ERROR)\n      continue;\n\n    ip1[count] = ip1[i];\n    ip2[count] = ip2[i];\n    count++;\n  }\n\n  ip1.resize(count);\n  ip2.resize(count);\n}\n\n// Filter IP using a given DEM and max height difference.  Assume that\n// the interest points have alignment applied to them (either via a\n// transform or from mapprojection).\nvoid ip_filter_using_dem(std::string              const & ip_filter_using_dem,\n                         vw::TransformPtr                 tx_left,\n                         vw::TransformPtr                 tx_right,\n                         boost::shared_ptr<vw::camera::CameraModel> left_camera_model,\n                         boost::shared_ptr<vw::camera::CameraModel> right_camera_model,\n                         std::vector<vw::ip::InterestPoint> & left_aligned_ip,\n                         std::vector<vw::ip::InterestPoint> & right_aligned_ip) {\n\n  vw_out() << \"Filtering interest point matches with --ip-filter-using-dem.\\n\";\n\n  std::string dem_file;\n  double max_height_diff = -1.0;\n  std::istringstream is(ip_filter_using_dem);\n  if (!(is >> dem_file >> max_height_diff))\n    vw_throw(ArgumentErr() << \"Could not parse correctly option --ip-filter-using-dem.\\n\");\n\n  if (max_height_diff <= 0.0)\n    vw_throw(ArgumentErr() << \"Positive height diff value expected in --ip-filter-using-dem.\\n\");\n\n  // Read the DEM and supporting data\n  vw::cartography::GeoReference dem_georef;\n  DiskImageView<float> dem_disk_image(dem_file);\n  ImageViewRef<PixelMask<float>> dem;\n  boost::shared_ptr<DiskImageResource> dem_rsrc(DiskImageResourcePtr(dem_file));\n  if (dem_rsrc->has_nodata_read())\n    dem = create_mask(dem_disk_image, dem_rsrc->nodata_read());\n  else\n    dem = pixel_cast<PixelMask<float>>(dem_disk_image); // all pixels are valid\n\n  bool has_georef = vw::cartography::read_georeference(dem_georef, dem_file);\n  if (!has_georef)\n    vw_throw(ArgumentErr() << \"There is no georeference information in: \"\n             << dem_file << \".\\n\");\n\n  // An invalid pixel value used for edge extension\n  PixelMask<float> nodata_pix(0); nodata_pix.invalidate();\n  ValueEdgeExtension<PixelMask<float>> nodata_ext(nodata_pix);\n\n  // Set up for interpolation. Out-of-range pixels are declared to be invalid.\n  ImageViewRef<PixelMask<float>> interp_dem\n    = interpolate(dem, BilinearInterpolation(), nodata_ext);\n\n  // Set up the stereo model for doing triangulation\n  double angle_tol = vw::stereo::StereoModel\n    ::robust_1_minus_cos(stereo_settings().min_triangulation_angle*M_PI/180);\n  stereo::StereoModel model(left_camera_model.get(), right_camera_model.get(),\n                            angle_tol);\n\n  std::set<int> invalid_indices;\n  for (size_t it = 0; it < left_aligned_ip.size(); it++) {\n\n    // Undo the alignment or mapprojection\n    Vector2 left_pix  = tx_left->reverse (Vector2(left_aligned_ip[it].x,  left_aligned_ip[it].y));\n    Vector2 right_pix = tx_right->reverse(Vector2(right_aligned_ip[it].x, right_aligned_ip[it].y));\n\n    // Triangulate\n    double err = -1.0;\n    Vector3 xyz(0.0, 0.0, 0.0);\n    try {\n      xyz = model(left_pix, right_pix, err);\n    } catch(...) {\n      xyz = Vector3();\n    }\n\n    if (err <= 0.0 || xyz == Vector3()) {\n      invalid_indices.insert(it);\n      continue;\n    }\n\n    Vector3 llh = dem_georef.datum().cartesian_to_geodetic(xyz);\n\n    // This was tested to give correct results with the DEM\n    // having its longitude in both [-180, 0] and [180, 360].\n    Vector2 pix = dem_georef.lonlat_to_pixel(Vector2(llh[0], llh[1]));\n\n    PixelMask<float> dem_val = interp_dem(pix.x(), pix.y());\n\n    if (!is_valid(dem_val) || std::abs(dem_val.child() - llh[2]) > max_height_diff)\n      invalid_indices.insert(it);\n  }\n\n  int num_total   = left_aligned_ip.size();\n  int num_invalid = invalid_indices.size();\n  int num_valid   = num_total - num_invalid;\n  vw_out() << \"Removed \" << num_invalid << \" interest points out of \" << num_total << \" (\"\n           << 100.0 * double(num_invalid) / num_total << \" pct).\\n\";\n\n  // Copy back only the valid pixels in-place\n  int good_it = 0;\n  for (int it = 0; it < num_total; it++) {\n    if (invalid_indices.find(it) != invalid_indices.end())\n      continue;\n\n    left_aligned_ip[good_it]  = left_aligned_ip[it];\n    right_aligned_ip[good_it] = right_aligned_ip[it];\n    good_it++;\n  }\n\n  if (good_it != num_valid)\n    vw_throw(ArgumentErr() << \"Book-keeping failure in ip filtering using DEM.\\n\");\n\n  left_aligned_ip.resize(num_valid);\n  right_aligned_ip.resize(num_valid);\n\n  return;\n}\n\n// Estimate the search range by finding the median disparity and\n// creating a box of given dimensions around it. This assumes aligned\n// interest points. Note that this box may be an overestimate,\n// so it should be intersected with a previously existing box.\nvw::BBox2 search_range_using_spread(double max_disp_spread,\n                                    std::vector<vw::ip::InterestPoint> const& left_ip,\n                                    std::vector<vw::ip::InterestPoint> const& right_ip) {\n    std::vector<double> dx, dy;\n\n    for (size_t i = 0; i < left_ip.size(); i++) {\n    double diffX = right_ip[i].x - left_ip[i].x;\n    double diffY = right_ip[i].y - left_ip[i].y;\n    dx.push_back(diffX);\n    dy.push_back(diffY);\n  }\n  if (dx.empty())\n    vw_throw(vw::ArgumentErr() << \"No interest points left.\");\n\n  std::sort(dx.begin(), dx.end());\n  std::sort(dy.begin(), dy.end());\n  double mid_x = dx[dx.size()/2]; // median\n  double mid_y = dy[dy.size()/2];\n\n  double half = max_disp_spread / 2.0;\n  vw::BBox2 spread_box(mid_x - half, mid_y - half, max_disp_spread, max_disp_spread);\n\n  return spread_box;\n}\n\n// Create interest points from valid D_sub values and make them full scale\n// (while still having potentially a global alignment applied to them).\nvoid aligned_ip_from_D_sub(vw::ImageViewRef<vw::PixelMask<vw::Vector2f>> const & sub_disp,\n                           vw::Vector2                                   const & upsample_scale,\n                           std::vector<vw::ip::InterestPoint>                  & left_ip,\n                           std::vector<vw::ip::InterestPoint>                  & right_ip) {\n\n  left_ip.clear();\n  right_ip.clear();\n\n  for (int col = 0; col < sub_disp.cols(); col++) {\n    for (int row = 0; row < sub_disp.rows(); row++) {\n      vw::PixelMask<vw::Vector2f> disp = sub_disp(col, row);\n\n      if (!is_valid(disp)) continue;\n\n      Vector2 left_pix(col, row);\n      Vector2 right_pix = left_pix + disp.child();\n\n      left_pix  = elem_prod(left_pix, upsample_scale);\n      right_pix = elem_prod(right_pix, upsample_scale);\n\n      vw::ip::InterestPoint left, right;\n      left.x  = left_pix.x();   left.y = left_pix.y();\n      right.x = right_pix.x(); right.y = right_pix.y();\n\n      left_ip.push_back(left);\n      right_ip.push_back(right);\n    }\n  }\n}\n\n// Do IP matching, return, the best translation+scale fitting functor.\nvw::Matrix<double> translation_ip_matching(vw::ImageView<vw::PixelGray<float>> const& image1,\n                                           vw::ImageView<vw::PixelGray<float>> const& image2,\n                                           int ip_per_tile,\n                                           std::string const  left_vwip_file,\n                                           std::string const  right_vwip_file,\n                                           double nodata1, double nodata2) {\n\n  using namespace vw;\n\n  std::vector<ip::InterestPoint> matched_ip1, matched_ip2;\n  size_t number_of_jobs = 1;\n  bool use_cached_ip = false;\n  detect_match_ip(matched_ip1, matched_ip2,\n                  vw::pixel_cast<float>(image1),\n                  vw::pixel_cast<float>(image2),\n                  ip_per_tile, number_of_jobs,\n                  left_vwip_file, right_vwip_file, \n                  use_cached_ip,\n                  nodata1, nodata2);\n\n  std::vector<Vector3> ransac_ip1 = iplist_to_vectorlist(matched_ip1);\n  std::vector<Vector3> ransac_ip2 = iplist_to_vectorlist(matched_ip2);\n  vw_out(DebugMessage,\"asp\") << \"\\t--> Removed \"\n                             << matched_ip1.size() - ransac_ip1.size()\n                             << \" duplicate matches.\\n\";\n\n  Matrix<double> T;\n  std::vector<size_t> indices;\n  try {\n\n    vw::math::RandomSampleConsensus<vw::math::TranslationScaleFittingFunctor, vw::math::InterestPointErrorMetric>\n      ransac(vw::math::TranslationScaleFittingFunctor(),\n             vw::math::InterestPointErrorMetric(),\n             stereo_settings().ip_num_ransac_iterations,\n             10, ransac_ip1.size()/2, true);\n    T = ransac(ransac_ip2, ransac_ip1);\n    indices = ransac.inlier_indices(T, ransac_ip2, ransac_ip1);\n  } catch (...) {\n    vw_out(WarningMessage,\"console\") << \"Automatic Alignment Failed! Proceed with caution...\\n\";\n    T = vw::math::identity_matrix<3>();\n  }\n\n  { // Keeping only inliers\n    std::vector<ip::InterestPoint> inlier_ip1, inlier_ip2;\n    for (size_t i = 0; i < indices.size(); i++) {\n      inlier_ip1.push_back(matched_ip1[indices[i]]);\n      inlier_ip2.push_back(matched_ip2[indices[i]]);\n    }\n    matched_ip1 = inlier_ip1;\n    matched_ip2 = inlier_ip2;\n  }\n\n  return T;\n}\n\n// Homography IP matching\n// This applies only the homography constraint. Not the best.\n// Can optionally restrict the matching to given image bounding boxes,\n// which can result in big efficiency gains.\nbool homography_ip_matching(vw::ImageViewRef<float> const& image1,\n                            vw::ImageViewRef<float> const& image2,\n                            int ip_per_tile,\n                            int inlier_threshold,\n                            std::string const& match_filename,\n                            size_t number_of_jobs,\n                            std::string const  left_vwip_file,\n                            std::string const  right_vwip_file,\n                            bool use_cached_ip,\n                            double nodata1, double nodata2,\n                            vw::BBox2i const& bbox1,\n                            vw::BBox2i const& bbox2) {\n\n  vw_out() << \"\\t--> Matching interest points using homography.\\n\";\n  // See if to restrict cropping to smaller regions\n  vw::ImageViewRef<float> local_image1 = image1;\n  vw::ImageViewRef<float> local_image2 = image2;\n  vw::BBox2i local_bbox1 = bbox1;\n  vw::BBox2i local_bbox2 = bbox2;\n  bool crop = (!bbox1.empty() && !bbox2.empty());\n  if (crop) {\n    local_bbox1.crop(bounding_box(image1));\n    local_bbox2.crop(bounding_box(image2));\n    local_image1 = vw::crop(image1, local_bbox1);\n    local_image2 = vw::crop(image2, local_bbox2);\n    use_cached_ip = false; // cannot use cached ip when cropping\n  }\n\n  std::vector<ip::InterestPoint> matched_ip1, matched_ip2;\n  detect_match_ip(matched_ip1, matched_ip2,\n                  local_image1, local_image2,\n                  ip_per_tile, number_of_jobs,\n                  left_vwip_file, right_vwip_file,\n                  use_cached_ip,\n                  nodata1, nodata2);\n  if (matched_ip1.size() == 0 || matched_ip2.size() == 0)\n    return false;\n\n  // If we cropped, must shift the interest points back to the original image coordinates\n  if (crop) {\n    for (size_t i = 0; i < matched_ip1.size(); i++) {\n      matched_ip1[i].x += local_bbox1.min().x();\n      matched_ip1[i].y += local_bbox1.min().y();\n    }\n    for (size_t i = 0; i < matched_ip2.size(); i++) {\n      matched_ip2[i].x += local_bbox2.min().x();\n      matched_ip2[i].y += local_bbox2.min().y();\n    }\n  }\n\n  // Filter the interest points using a homography constraint\n  Stopwatch sw;\n  sw.start();\n  Matrix<double> H = vw::math::identity_matrix<3>();\n  std::vector<size_t> indices;\n  filter_ip_homog(matched_ip1, matched_ip2, inlier_threshold,\n                  H, indices); // outputs\n  sw.stop();\n  vw_out() << \"Filtering time: \" << sw.elapsed_seconds() << \" seconds.\\n\";\n  int num_left = indices.size();\n  if (num_left == 0)\n    return false;\n\n  // Form the filtered interest points\n  std::vector<ip::InterestPoint> final_ip1(num_left), final_ip2(num_left);\n  for (size_t i = 0; i < num_left; i++) {\n    final_ip1[i] = matched_ip1[indices[i]];\n    final_ip2[i] = matched_ip2[indices[i]];\n  }\n    \n  if (stereo_settings().ip_debug_images) {\n    vw_out() << \"\\t    Writing post-homography IP match debug image.\\n\";\n    write_match_image(\"InterestPointMatching__ip_matching_debug2.tif\",\n                      image1, image2, final_ip1, final_ip2);\n  }\n\n  vw_out() << \"\\t    * Writing match file: \" << match_filename << \"\\n\";\n  bool matches_as_txt = stereo_settings().matches_as_txt;\n  ip::write_match_file(match_filename, final_ip1, final_ip2, matches_as_txt);\n\n  return true;\n}\n\n// Detect interest points. Return also the rough homography that aligns the right image\n// to the left.\nbool detect_ip_aligned_pair(vw::camera::CameraModel* cam1,\n                            vw::camera::CameraModel* cam2,\n                            vw::ImageViewRef<float> const& image1,\n                            vw::ImageViewRef<float> const& image2,\n                            int ip_per_per_image,\n                            int ip_per_tile,\n                            vw::cartography::Datum const& datum,\n                            std::string const left_vwip_file,\n                            double nodata1, double nodata2,\n                            // Outputs\n                            vw::ip::InterestPointList& ip1,\n                            vw::ip::InterestPointList& ip2,\n                            vw::Matrix<double> & rough_homography) {\n\n  BBox2i box1 = bounding_box(image1), box2 = bounding_box(image2);\n\n  try {\n    // Homography is defined in the original camera coordinates\n    rough_homography = rough_homography_fit(cam1, cam2, box1, box2, datum);\n  } catch(...) {\n    vw_out() << \"Rough homography fit failed, trying with identity transform. \" << std::endl;\n    rough_homography.set_identity(3);\n  }\n\n  // Remove the main translation and solve for BBox that fits the\n  // image. If we used the translation from the solved homography with\n  // poorly position cameras, the right image might be moved out of frame.\n  rough_homography(0,2) = rough_homography(1,2) = 0;\n  vw_out() << \"Aligning right to left for interest points capture using rough homography: \"\n\t   << rough_homography << std::endl;\n\n  // Find the image of the right image bounding box after applying the rough homography\n  HomographyTransform rough_trans(rough_homography);\n  BBox2i trans_box2 = rough_trans.forward_bbox(box2);\n\n  // Check to see if this rough homography works\n  VW_ASSERT(box1.intersects(trans_box2),\n     LogicErr() << \"The rough homography alignment based on datum and camera \"\n        << \"geometry shows that input images do not overlap at all. Unable to proceed. \"\n        << \"Examine your images, or consider using the option --skip-rough-homography.\\n\");\n\n  // Adjust the homography transform so that the right image bounding box has\n  // (0, 0) as the minimum. We will count on this below and outside of this\n  // function. See Transform.h for definition of homography transform.\n  for (int i = 0; i < 3; i++) {\n    for (int j = 0; j < 2; j++) {\n      rough_homography(j, i) -= trans_box2.min()[j] * rough_homography(2, i);\n    }\n  }\n\n  // Update these after the adjustment to the homography transform\n  rough_trans = HomographyTransform(rough_homography);\n  trans_box2 = rough_trans.forward_bbox(box2);\n\n  // Detect interest points for the left and (transformed) right image.\n  // - It is important that we use NearestPixelInterpolation in the\n  //   next step. Using anything else will interpolate nodata values\n  //   and stop them from being masked out.\n  // TODO(oalexan1): Would it be better to pass masked images and use interpolation?\n  // TODO(oalexan1): Likely bilinear interpolation is better for the IP detection.\n  auto ext = ValueEdgeExtension<float>(std::isnan(nodata2) ? 0 : nodata2);\n  std::string right_vwip_file = \"\"; // Don't record IP from transformed images\n  bool use_cached_ip = false;\n  if (!detect_ip_pair(ip1, ip2, image1,\n                      crop(transform(image2, rough_trans, ext,\n                                     NearestPixelInterpolation()), trans_box2),\n                      ip_per_per_image, ip_per_tile, left_vwip_file, right_vwip_file,\n                      nodata1, nodata2, use_cached_ip)) {\n    vw_out() << \"Unable to detect interest points.\" << std::endl;\n    return false;\n  }\n\n  // Undo the rough homography transform for the interest points\n  ip::InterestPointList::iterator ip_it;\n  for (ip_it = ip2.begin(); ip_it != ip2.end(); ip_it++) {\n    Vector2 pt(ip_it->x, ip_it->y);\n    pt = rough_trans.reverse(pt);\n    ip_it->ix = ip_it->x = pt.x();\n    ip_it->iy = ip_it->y = pt.y();\n  }\n\n  return true;\n} // End function detect_ip_aligned_pair\n\n\n// A debug routine to save images with matches on top of them.\nvoid write_match_image(std::string const& out_file_name,\n                       vw::ImageViewRef<float> const& image1,\n                       vw::ImageViewRef<float> const& image2,\n                       std::vector<vw::ip::InterestPoint> const& matched_ip1,\n                       std::vector<vw::ip::InterestPoint> const& matched_ip2) {\n\n  // Skip image pairs with no matches.\n  if (matched_ip1.empty())\n    return;\n\n  // Work out the scaling to produce the subsampled images. These\n  // values are choosen just allow a reasonable rendering time.\n  float sub_scale  = sqrt(1500.0 * 1500.0 / float(image1.impl().cols() * image1.impl().rows()));\n  sub_scale += sqrt(1500.0 * 1500.0 / float(image2.impl().cols() * image2.impl().rows()));\n  sub_scale /= 2;\n  //if (sub_scale > 1)\n  sub_scale = 1;\n\n  vw::mosaic::ImageComposite<vw::PixelRGB<vw::uint8>> composite;\n  //composite.insert(vw::pixel_cast_rescale<vw::PixelRGB<vw::uint8> >(resample(normalize(image1), sub_scale)), 0, 0);\n  //composite.insert(vw::pixel_cast_rescale<vw::PixelRGB<vw::uint8> >(resample(normalize(image2), sub_scale)), vw::int32(image1.impl().cols() * sub_scale), 0);\n  composite.insert(vw::pixel_cast_rescale<vw::PixelRGB<vw::uint8> >(image1), 0, 0);\n  composite.insert(vw::pixel_cast_rescale<vw::PixelRGB<vw::uint8> >(image2), vw::int32(image1.impl().cols() * sub_scale), 0);\n  composite.set_draft_mode(true);\n  composite.prepare();\n\n  // Rasterize the composite so that we can draw on it.\n  vw::ImageView<vw::PixelRGB<vw::uint8>> comp = composite;\n\n  // Draw a red line between matching interest points\n  for (size_t k = 0; k < matched_ip1.size(); k++) {\n    vw::Vector2f start(matched_ip1[k].x, matched_ip1[k].y);\n    vw::Vector2f end(matched_ip2[k].x+image1.impl().cols(), matched_ip2[k].y);\n    start *= sub_scale;\n    end   *= sub_scale;\n    float inc_amt = 1/norm_2(end-start);\n    for (float r=0; r<1.0; r+=inc_amt) {\n      int i = (int)(0.5 + start.x() + r*(end.x()-start.x()));\n      int j = (int)(0.5 + start.y() + r*(end.y()-start.y()));\n      if (i >=0 && j >=0 && i < comp.cols() && j < comp.rows())\n        comp(i,j) = vw::PixelRGB<vw::uint8>(255, 0, 0);\n    }\n  }\n\n  vw::vw_out() << \"Writing: \" << out_file_name << std::endl;\n  boost::shared_ptr<vw::DiskImageResource> rsrc(vw::DiskImageResource::create(out_file_name, comp.format()));\n  vw::block_write_image(*rsrc, comp, vw::TerminalProgressCallback(\"\", \"\"));\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Core/InterestPointMatching.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#ifndef __ASP_CORE_INTEREST_POINT_MATCHING_H__\n#define __ASP_CORE_INTEREST_POINT_MATCHING_H__\n\n#include <vw/Image/ImageView.h>\n#include <vw/Image/ImageViewRef.h>\n#include <vw/Camera/CameraModel.h>\n#include <vw/InterestPoint/InterestPoint.h>\n#include <vw/Cartography/Datum.h>\n#include <vw/Math/Transform.h>\n\nnamespace asp {\n\n// Debug utility to write out a matches on top of the images\nvoid write_match_image(std::string const& out_file_name,\n                       vw::ImageViewRef<float> const& image1,\n                       vw::ImageViewRef<float> const& image2,\n                       std::vector<vw::ip::InterestPoint> const& matched_ip1,\n                       std::vector<vw::ip::InterestPoint> const& matched_ip2);\n\n  // Calls ip matching assuming a datum. We may or not apply a homography to\n  // make right image like left image. This is useful so that both images have\n  // similar scale and similar affine qualities.\n  // - Only the left image will use an IP file since the right image is\n  //   modified.\n  bool match_ip_with_datum(bool single_threaded_camera,\n                             bool use_rough_homography,\n                             vw::camera::CameraModel* cam1,\n                             vw::camera::CameraModel* cam2,\n                             vw::ImageViewRef<float> const& image1,\n                             vw::ImageViewRef<float> const& image2,\n                             int ip_per_tile,\n                             vw::cartography::Datum const& datum,\n                             std::string const& match_filename,\n                             size_t number_of_jobs,\n                             double epipolar_threshold,\n                             double uniqueness_threshold,\n                             std::string const left_vwip_file =\"\",\n                             std::string const right_vwip_file =\"\",\n                             double nodata1 = std::numeric_limits<double>::quiet_NaN(),\n                             double nodata2 = std::numeric_limits<double>::quiet_NaN());\n\n  // Do IP matching, return, the best translation+scale fitting functor.\n  vw::Matrix<double>\n    translation_ip_matching(vw::ImageView<vw::PixelGray<float>> const& image1,\n                            vw::ImageView<vw::PixelGray<float>> const& image2,\n                            int ip_per_tile,\n                            std::string const left_vwip_file =\"\",\n                            std::string const right_vwip_file=\"\",\n                            double nodata1 = std::numeric_limits<double>::quiet_NaN(),\n                            double nodata2 = std::numeric_limits<double>::quiet_NaN());\n\n  //-------------------------------------------------------------------------------------------\n  // These are IP filtering functions.\n\n  /// Optionally remove pixels from the opposite sides of the images.\n  /// - This is a very simple filter for the left/right image common case.\n  void side_ip_filtering(vw::ip::InterestPointList& ip1,\n                         vw::ip::InterestPointList& ip2,\n                         vw::BBox2i const& bbox1, vw::BBox2i const& bbox2);\n\n  /// IP matching that uses clustering on triangulation error to\n  /// determine inliers.  Check output this filter can fail.\n  ///\n  /// Input and output is the valid indices. Valid indices must have\n  /// something to start with.\n  bool tri_ip_filtering(std::vector<vw::ip::InterestPoint> const& ip1,\n                        std::vector<vw::ip::InterestPoint> const& ip2,\n                        vw::camera::CameraModel* cam1,\n                        vw::camera::CameraModel* cam2,\n                        std::list<size_t>& valid_indices);\n\n  /// 4 stddev filtering. Deletes any disparity measurement that is 4\n  /// stddev away from the measurements of it's local neighbors. We\n  /// kill off worse offender one at a time until everyone is compliant.\n  bool stddev_ip_filtering(std::vector<vw::ip::InterestPoint> const& ip1,\n          std::vector<vw::ip::InterestPoint> const& ip2,\n          std::list<size_t>& valid_indices);\n\n\n  // Filter IP by ensuring that the triangulated IP are in the given lon-lat-height box\n  size_t filter_ip_by_lonlat_and_elevation(vw::TransformPtr         tx_left,\n                                           vw::TransformPtr         tx_right,\n                                           vw::camera::CameraModel* left_camera_model,\n                                           vw::camera::CameraModel* right_camera_model,\n                                           vw::cartography::Datum const& datum,\n                                           std::vector<vw::ip::InterestPoint> const& ip1_in,\n                                           std::vector<vw::ip::InterestPoint> const& ip2_in,\n                                           vw::Vector2 const & elevation_limit,\n                                           vw::BBox2   const & lon_lat_limit,\n                                           std::vector<vw::ip::InterestPoint> & ip1_out,\n                                           std::vector<vw::ip::InterestPoint> & ip2_out);\n\n  // Filter ip by triangulation error, reprojection error, and height range\n  void filter_ip_using_cameras(std::vector<vw::ip::InterestPoint> & ip1,\n                               std::vector<vw::ip::InterestPoint> & ip2,\n                               vw::camera::CameraModel const* cam1,\n                               vw::camera::CameraModel const* cam2,\n                               vw::cartography::Datum  const& datum,\n                               double pct, double factor);\n\n  // Filter IP using a given DEM and max height difference.  Assume that\n  // the interest points have alignment applied to them (either via a\n  // transform or from mapprojection).\n  void ip_filter_using_dem(std::string              const & ip_filter_using_dem,\n                           vw::TransformPtr                 tx_left,\n                           vw::TransformPtr                 tx_right,\n                           boost::shared_ptr<vw::camera::CameraModel> left_camera_model,\n                           boost::shared_ptr<vw::camera::CameraModel> right_camera_model,\n                           std::vector<vw::ip::InterestPoint> & left_aligned_ip,\n                           std::vector<vw::ip::InterestPoint> & right_aligned_ip);\n\n  // Estimate the search range by finding the median disparity and\n  // creating a box of given dimensions around it. This assumes aligned\n  // interest points.\n  vw::BBox2 search_range_using_spread(double max_disp_spread,\n                                     std::vector<vw::ip::InterestPoint> const& left_ip,\n                                     std::vector<vw::ip::InterestPoint> const& right_ip);\n\n  //-----------------------------------------------------------------------------\n  // Miscellaneous IP functions\n\n  /// Find a rough homography that maps right to left using the camera\n  /// and datum information.\n  /// - This intersects rays with the datum, then projects them into the other camera.\n  vw::Matrix<double>\n  rough_homography_fit(vw::camera::CameraModel* cam1,\n            vw::camera::CameraModel* cam2,\n            vw::BBox2i const& box1, vw::BBox2i const& box2,\n            vw::cartography::Datum const& datum);\n\n  /// Homography rectification that aligns the right image to the left\n  /// image via a homography transform. It returns a vector2i of the\n  /// ideal cropping size to use for the left and right image. The left\n  /// transform is actually just a translation that sets origin to the\n  /// shared corner of left and right.\n  vw::Vector2i\n  homography_rectification(bool adjust_left_image_size,\n                           bool tight_inlier_threshold,\n          vw::Vector2i const& left_size,\n          vw::Vector2i const& right_size,\n          std::vector<vw::ip::InterestPoint> const& left_ip,\n          std::vector<vw::ip::InterestPoint> const& right_ip,\n          vw::Matrix<double>& left_matrix,\n          vw::Matrix<double>& right_matrix);\n\n  // Create interest points from valid D_sub values and make them full scale\n  // (while still having potentially a global alignment applied to them).\n  void aligned_ip_from_D_sub(\n    vw::ImageViewRef<vw::PixelMask<vw::Vector2f>> const & sub_disp,\n    vw::Vector2                                   const & upsample_scale,\n    std::vector<vw::ip::InterestPoint>                  & left_ip,\n    std::vector<vw::ip::InterestPoint>                  & right_ip);\n\n  // Homography IP matching\n  // This applies only the homography constraint. Not the best.\n  // Can optionally restrict the matching to given image bounding boxes,\n  // which can result in big efficiency gains.\n  bool homography_ip_matching(vw::ImageViewRef<float> const& image1,\n                              vw::ImageViewRef<float> const& image2,\n                              int ip_per_tile,\n                              int inlier_threshold,\n                              std::string const& match_filename,\n                              size_t number_of_jobs,\n                              std::string const  left_vwip_file,\n                              std::string const  right_vwip_file,\n                              bool use_cached_ip,\n                              double nodata1, double nodata2,\n                              vw::BBox2i const& bbox1 = vw::BBox2i(),\n                              vw::BBox2i const& bbox2 = vw::BBox2i());\n\n// Match the ip and save the match file. No epipolar constraint\n// is used in this mode.\nvoid match_ip_no_datum(vw::ip::InterestPointList const& ip1,\n                   vw::ip::InterestPointList const& ip2,\n                   vw::ImageViewRef<float> const& image1,\n                   vw::ImageViewRef<float> const& image2,\n                   size_t number_of_jobs,\n                   // Outputs\n                   std::vector<vw::ip::InterestPoint>& matched_ip1,\n                   std::vector<vw::ip::InterestPoint>& matched_ip2,\n                   std::string const& match_file);\n\n  // Choose the method used for IP matching\n  enum DetectIpMethod {DETECT_IP_METHOD_INTEGRAL = 0,\n                       DETECT_IP_METHOD_SIFT     = 1,\n                       DETECT_IP_METHOD_ORB      = 2};\n\n/// Detect interest points\n/// This is not meant to be used directly. Use ip_matching().\nvoid detect_ip(vw::ip::InterestPointList& ip,\n               vw::ImageViewRef<float> const& image,\n               int ip_per_image, int ip_per_tile, std::string const vwip_file, \n               double nodata, bool use_cached_ip);\n\n// Detect IP in a pair of images and apply rudimentary filtering.\n// Returns false if either image ended up with zero IP.\nbool detect_ip_pair(vw::ip::InterestPointList& ip1,\n                    vw::ip::InterestPointList& ip2,\n                    vw::ImageViewRef<float> const& image1,\n                    vw::ImageViewRef<float> const& image2,\n                    int ip_per_image, int ip_per_tile,\n                    std::string const left_vwip_file,\n                    std::string const right_vwip_file,\n                    double nodata1, double nodata2,\n                    bool use_cached_ip);\n\n// Detect interest points. Return also the rough homography that aligns the right image\n// to the left.\nbool detect_ip_aligned_pair(vw::camera::CameraModel* cam1,\n                            vw::camera::CameraModel* cam2,\n                            vw::ImageViewRef<float> const& image1,\n                            vw::ImageViewRef<float> const& image2,\n                            int ip_per_image, int ip_per_tile,\n                            vw::cartography::Datum const& datum,\n                            std::string const left_vwip_file,\n                            double nodata1, double nodata2,\n                            // Outputs\n                            vw::ip::InterestPointList& ip1,\n                            vw::ip::InterestPointList& ip2,\n                            vw::Matrix<double> &rough_homography);\n\n/// Detect interest points and use a simple matching technique.\n/// This is not meant to be used directly. Use ip_matching().\nvoid detect_match_ip(std::vector<vw::ip::InterestPoint>& matched_ip1,\n                     std::vector<vw::ip::InterestPoint>& matched_ip2,\n                     vw::ImageViewRef<float> const& image1,\n                     vw::ImageViewRef<float> const& image2,\n                     int ip_per_tile, size_t number_of_jobs,\n                     std::string const left_vwip_file =\"\",\n                     std::string const right_vwip_file=\"\",\n                     bool use_cached_ip = false,\n                     double nodata1 = std::numeric_limits<double>::quiet_NaN(),\n                     double nodata2 = std::numeric_limits<double>::quiet_NaN(),\n                     std::string const& match_file = \"\");\n\n// A debug routine to save images with matches on top of them.\nvoid write_match_image(std::string const& out_file_name,\n                       vw::ImageViewRef<float> const& image1,\n                       vw::ImageViewRef<float> const& image2,\n                       std::vector<vw::ip::InterestPoint> const& matched_ip1,\n                       std::vector<vw::ip::InterestPoint> const& matched_ip2);\n\n} // End namespace asp\n\n#endif//__ASP_CORE_INTEREST_POINT_MATCHING_H__\n"
  },
  {
    "path": "src/asp/Core/InterestPointMatching2.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Core/InterestPointMatching.h>\n#include <asp/Core/StereoSettings.h>\n\n#include <vw/Math/GaussianClustering.h>\n#include <vw/Math/RANSAC.h>\n#include <vw/Cartography/CameraBBox.h>\n#include <vw/Stereo/StereoModel.h>\n#include <vw/Mosaic/ImageComposite.h>\n#include <vw/Image/AlgorithmFunctions.h>\n#include <vw/InterestPoint/MatcherIO.h>\n#include <vw/InterestPoint/Matcher.h>\n#include <vw/Math/RandomSet.h> // TODO(oalexan1): Rm this when moving the random subset code\n#include <vw/Core/Stopwatch.h>\n#include <vw/FileIO/FileUtils.h>\n\n#include <set>\n\n// Move some code here from InterestPointMatching.cc, as that one is slow to compile.\n// The logic here is mostly for matching, and not for ip detection or filtering.\n\nusing namespace vw;\n\nnamespace asp {\n\nint g_ip_num_errors = 0;\nMutex g_ip_mutex;\n  \n/// Takes interest points and then finds the nearest 10 matches\n/// according to their IP descriptors. It then\n/// filters them by whom are closest to the epipolar line via a\n/// threshold. The first 2 are then selected to be a match if\n/// their descriptor distance is sufficiently far apart.\n// TODO(oalexan1): Move this to VW as low-level? \n// VW has the related class InterestPointMatcher.\nclass EpipolarLinePointMatcher {\n  bool   m_single_threaded_camera;\n  double m_uniqueness_threshold, m_epipolar_threshold;\n  vw::cartography::Datum m_datum;\n\npublic:\n  /// Constructor.\n  EpipolarLinePointMatcher(bool single_threaded_camera,\n          double uniqueness_threshold, double inlier_threshold,\n          vw::cartography::Datum const& datum);\n\n  /// This only returns the indices\n  /// - ip_detect_method must match the method used to obtain the interest points\n  void operator()(vw::ip::InterestPointList const& ip1,\n      vw::ip::InterestPointList const& ip2,\n      DetectIpMethod  ip_detect_method,\n      size_t          number_of_jobs,\n      vw::camera::CameraModel        * cam1,\n      vw::camera::CameraModel        * cam2,\n      std::vector<size_t>            & output_indices) const;\n\n  /// Work out an epipolar line from interest point. Returns the\n  /// coefficients for the following line equation: ax + by + c = 0\n  static vw::Vector3 epipolar_line(vw::Vector2            const& feature,\n            vw::cartography::Datum const& datum,\n            vw::camera::CameraModel     * cam_ip,\n            vw::camera::CameraModel     * cam_obj,\n            bool                        & success);\n\n  /// Calculate distance between a line of equation ax + by + c = 0\n  static double distance_point_line(vw::Vector3 const& line, vw::Vector2 const& point);\n\n  friend class EpipolarLineMatchTask;\n};\n\nEpipolarLinePointMatcher::EpipolarLinePointMatcher(bool   single_threaded_camera,\n                                                   double uniqueness_threshold,\n                                                   double epipolar_threshold,\n                                                   vw::cartography::Datum const& datum):\n  m_single_threaded_camera(single_threaded_camera), m_uniqueness_threshold(uniqueness_threshold),\n  m_epipolar_threshold(epipolar_threshold), m_datum(datum) {\n  // Detect some problems before they result in strange math errors\n  if (epipolar_threshold < 1)\n    vw_throw(ArgumentErr() << \"EpipolarLinePointMatcher: epipolar threshold is < 1.\\n\");\n  if (uniqueness_threshold < 0.1)\n    vw_throw(ArgumentErr() << \"EpipolarLinePointMatcher: uniqueness threshold is < 0.1.\\n\");\n  if (uniqueness_threshold > 0.99)\n    vw_throw(ArgumentErr() << \"EpipolarLinePointMatcher: uniqueness threshold is > 0.99.\\n\");\n}\n  \nVector3 EpipolarLinePointMatcher::epipolar_line(Vector2 const& feature,\n                                                cartography::Datum const& datum,\n                                                camera::CameraModel* cam_ip,\n                                                camera::CameraModel* cam_obj,\n                                                bool & success) {\n  success = true;\n\n  // Watch out for errors thrown when projecting into the camera\n  try {\n\n    // Intersect the interest point pixel with the datum\n    Vector3 p0 = cartography::datum_intersection(datum, cam_ip, feature);\n\n    if (p0 == Vector3()) { // No intersection\n      success = false;\n      return Vector3();\n    }\n\n    Vector3 p1  = p0 + 10*cam_ip->pixel_to_vector(feature); // Extend the point below the datum\n    Vector2 ep0 = cam_obj->point_to_pixel(p0); // Project the intersection and extension into the other camera\n    Vector2 ep1 = cam_obj->point_to_pixel(p1);\n    Matrix<double> matrix( 2, 3 );\n    select_col( matrix, 2 ) = Vector2(1,1);\n    matrix(0,0) = ep0.x();\n    matrix(0,1) = ep0.y();\n    matrix(1,0) = ep1.x();\n    matrix(1,1) = ep1.y();\n\n    if (matrix != matrix) { // Got back NaN values. Can't proceed.\n      success = false;\n      return Vector3();\n    }\n\n    // If the input matrix is bad this can result in some weird errors!\n    Matrix<double> nsp = nullspace(matrix);\n    if (nsp.cols() <= 0 || nsp.rows() <= 0){ // Failed to find the nullspace\n      success = false;\n      return Vector3();\n    }\n\n    return select_col(nsp,0);\n\n  } catch (std::exception const& e) {\n    // Turn this off, it can be verbose\n    // Mutex::Lock lock(g_ip_mutex);\n    // g_ip_num_errors++;\n    // if (g_ip_num_errors < 100) {\n    //  vw_out(ErrorMessage) << e.what() << std::endl;\n    // }else if (g_ip_num_errors == 100) {\n    //  vw_out() << \"Will print no more error messages about failing to find epipolar line.\\n\";\n    // }\n  }\n\n  success = false;\n  return Vector3();\n}\n\n// TODO(oalexan1): Use std::abs() instead of fabs(). May change the result.\ndouble EpipolarLinePointMatcher::distance_point_line(Vector3 const& line,\n                                                     Vector2 const& point) {\n  return fabs(line.x() * point.x() + line.y() * point.y() + line.z() ) /\n    norm_2(subvector(line, 0, 2));\n}\n\n// Local class definition\nclass EpipolarLineMatchTask: public Task, private boost::noncopyable {\n  typedef ip::InterestPointList::const_iterator IPListIter;\n  bool                            m_single_threaded_camera;\n  bool                            m_use_uchar_tree;\n  math::FLANNTree<float>        & m_tree_float;\n  math::FLANNTree<unsigned char>& m_tree_uchar;\n  IPListIter                      m_start, m_end;\n  ip::InterestPointList const&    m_ip_other;\n  camera::CameraModel            *m_cam1, *m_cam2;\n  EpipolarLinePointMatcher const& m_matcher;\n  Mutex&                          m_camera_mutex;\n  std::vector<size_t>::iterator   m_output;\npublic:\n  EpipolarLineMatchTask(bool single_threaded_camera,\n                        bool use_uchar_tree,\n                        math::FLANNTree<float>        & tree_float,\n                        math::FLANNTree<unsigned char>& tree_uchar,\n                        ip::InterestPointList::const_iterator start,\n                        ip::InterestPointList::const_iterator end,\n                        ip::InterestPointList const& ip2,\n                        vw::camera::CameraModel* cam1,\n                        vw::camera::CameraModel* cam2,\n                        EpipolarLinePointMatcher const& matcher,\n                        Mutex& camera_mutex,\n                        std::vector<size_t>::iterator output):\n    m_single_threaded_camera(single_threaded_camera),\n    m_use_uchar_tree(use_uchar_tree), m_tree_float(tree_float), m_tree_uchar(tree_uchar),\n    m_start(start), m_end(end), m_ip_other(ip2),\n    m_cam1(cam1), m_cam2(cam2),\n    m_matcher( matcher), m_camera_mutex(camera_mutex), m_output(output) {}\n\n  void operator()() {\n\n    const size_t NUM_MATCHES_TO_FIND = 10;\n    Vector<int> indices(NUM_MATCHES_TO_FIND);\n    Vector<double> distances(NUM_MATCHES_TO_FIND);\n\n    for (IPListIter ip = m_start; ip != m_end; ip++) {\n      Vector2 ip_org_coord = Vector2(ip->x, ip->y);\n      Vector3 line_eq;\n\n      // Find the equation that describes the epipolar line\n      bool found_epipolar = false;\n      if (m_single_threaded_camera) {\n        // ISIS camera is single-threaded\n        Mutex::Lock lock(m_camera_mutex);\n        line_eq = m_matcher.epipolar_line( ip_org_coord, m_matcher.m_datum, \n          m_cam1, m_cam2, found_epipolar);\n      }else{\n        line_eq = m_matcher.epipolar_line( ip_org_coord, m_matcher.m_datum, \n          m_cam1, m_cam2, found_epipolar);\n      }\n\n      if (!found_epipolar) {\n        *m_output++ = (size_t)(-1); // Failed to find a match, return a flag!\n        continue; // Skip to the next IP\n      }\n\n      // Use FLANN tree to find the N nearest neighbors according to the IP region descriptor?\n      std::vector<std::pair<float,int> > kept_indices;\n      kept_indices.reserve(NUM_MATCHES_TO_FIND);\n\n      // Call the correct FLANN tree for the matching type\n      size_t num_matches_valid = 0;\n      if (m_use_uchar_tree) {\n        vw::Vector<unsigned char> uchar_descriptor(ip->descriptor.size());\n        for (size_t i=0; i<ip->descriptor.size(); i++)\n          uchar_descriptor[i] = static_cast<unsigned char>(ip->descriptor[i]);\n        num_matches_valid = m_tree_uchar.knn_search(uchar_descriptor, indices, distances, \n                                                    NUM_MATCHES_TO_FIND);\n      } else {\n        num_matches_valid = m_tree_float.knn_search(ip->descriptor, indices, distances, \n                                                    NUM_MATCHES_TO_FIND);\n      }\n\n      if (num_matches_valid < 1) {\n        *m_output++ = (size_t)(-1); // Failed to find a match, return a flag!\n        continue; // Skip to the next IP\n      }\n\n      //vw_out() << \"For descriptor: \" << ip->descriptor << std::endl;\n      //vw_out() << num_matches_valid << \" Best match distances: \" << distances << std::endl;\n      //vw_out() << \"Indices: \" << indices << std::endl;\n\n      // Loop through the N \"nearest\" points and keep only the ones within\n      //   m_matcher.m_epipolar_threshold pixel distance from the epipolar line\n      const double EPIPOLAR_BAND_EXPANSION = 200;\n      double small_epipolar_threshold = m_matcher.m_epipolar_threshold;\n      double large_epipolar_threshold = small_epipolar_threshold + EPIPOLAR_BAND_EXPANSION;\n      for ( size_t i = 0; i < num_matches_valid; i++ ) {\n        auto ip2_it = m_ip_other.begin();\n        std::advance( ip2_it, indices[i] );\n\n        if (found_epipolar){\n          Vector2 ip2_org_coord = Vector2( ip2_it->x, ip2_it->y );\n          double  line_distance = m_matcher.distance_point_line( line_eq, ip2_org_coord );\n          if (line_distance < large_epipolar_threshold) {\n            if (line_distance < small_epipolar_threshold)\n              kept_indices.push_back(std::pair<float,int>(distances[i], indices[i]));\n            else // In between thresholds\n              kept_indices.push_back(std::pair<float,int>(distances[i], -1));\n          }\n          else {\n            Vector2 ip1_coord(ip->x, ip->y);\n            //double normDist = norm_2(ip1_coord - ip2_org_coord);\n            //vw_out() << \"Discarding match between \" << ip1_coord << \" and \" << ip2_org_coord\n            //        << \" because distance is \" << line_distance << \" and threshold is \"\n            //        << m_matcher.m_epipolar_threshold << \" norm dist = \" << normDist<<\"\\n\";\n          }\n        }\n      } // End loop for match pruning\n\n        // If we only found one match or the first descriptor match is much better than the second\n      if (((kept_indices.size() > 2)     &&\n            (kept_indices[0].second >= 0) &&\n            (kept_indices[0].first < m_matcher.m_uniqueness_threshold * kept_indices[1].first))\n           || (kept_indices.size() == 1)) {\n        *m_output++ = kept_indices[0].second; // Return the first of the matches we found\n        //vw_out() << \"Kept distance: \" << kept_indices[0].first << std::endl;\n      } else { // No matches or no clear winner\n        *m_output++ = (size_t)(-1); // Failed to find a match, return a flag!\n      }\n    } // End loop through IP\n  } // End function operator()\n\n}; // End class EpipolarLineMatchTask -------------------\n\nvoid EpipolarLinePointMatcher::operator()(ip::InterestPointList const& ip1,\n                                          ip::InterestPointList const& ip2,\n                                          DetectIpMethod  ip_detect_method,\n                                          size_t          number_of_jobs,\n                                          camera::CameraModel        * cam1,\n                                          camera::CameraModel        * cam2,\n                                          std::vector<size_t>        & output_indices) const {\n  typedef ip::InterestPointList::const_iterator IPListIter;\n\n  Timer total_time(\"Total elapsed time\", DebugMessage, \"interest_point\");\n  size_t ip1_size = ip1.size(), ip2_size = ip2.size();\n\n  output_indices.clear();\n  if (!ip1_size || !ip2_size) {\n    vw_out(InfoMessage,\"interest_point\") << \"KD-Tree: no points to match, exiting\\n\";\n    return;\n  }\n\n  // Build the output indices\n  output_indices.resize(ip1_size);\n\n  // Set up FLANNTree objects of all the different types we may need.\n  math::FLANNTree<float>         kd_float(asp::stereo_settings().flann_method);\n  math::FLANNTree<unsigned char> kd_uchar(asp::stereo_settings().flann_method);\n\n  Matrix<float>         ip2_matrix_float;\n  Matrix<unsigned char> ip2_matrix_uchar;\n\n  // Pack the IP descriptors into a matrix and feed it to the chosen FLANNTree object\n  const bool use_uchar_FLANN = (ip_detect_method == DETECT_IP_METHOD_ORB);\n  if (use_uchar_FLANN) {\n    ip_list_to_matrix(ip2, ip2_matrix_uchar);\n    kd_uchar.load_match_data(ip2_matrix_uchar, vw::math::FLANN_DistType_Hamming);\n  }else {\n    ip_list_to_matrix(ip2, ip2_matrix_float);\n    kd_float.load_match_data(ip2_matrix_float,  vw::math::FLANN_DistType_L2);\n  }\n\n  vw_out(InfoMessage,\"interest_point\") << \"FLANN-Tree created. Searching...\\n\";\n\n  FifoWorkQueue matching_queue; // Create a thread pool object\n  Mutex camera_mutex;\n\n  // Robustness fix\n  if (ip1_size < number_of_jobs)\n    number_of_jobs = ip1_size;\n\n  // Get input and output iterators\n  IPListIter start_it = ip1.begin();\n  std::vector<size_t>::iterator output_it = output_indices.begin();\n\n  for (size_t i = 0; i < number_of_jobs - 1; i++) {\n    // Update iterators and launch the job.\n    IPListIter end_it = start_it;\n    std::advance(end_it, ip1_size / number_of_jobs);\n    boost::shared_ptr<Task>\n      match_task(new EpipolarLineMatchTask(m_single_threaded_camera,\n                                           use_uchar_FLANN, kd_float, kd_uchar,\n                                           start_it, end_it,\n                                           ip2, cam1, cam2, *this,\n                                           camera_mutex, output_it));\n    matching_queue.add_task( match_task );\n    start_it = end_it;\n    std::advance(output_it, ip1_size / number_of_jobs);\n  }\n  // Launch the last job.\n  // TODO(oalexan1): Integrate this into the above loop.\n  boost::shared_ptr<Task>\n    match_task(new EpipolarLineMatchTask(m_single_threaded_camera,\n                                         use_uchar_FLANN, kd_float, kd_uchar,\n                                         start_it, ip1.end(),\n                                         ip2, cam1, cam2, *this,\n                                         camera_mutex, output_it));\n  matching_queue.add_task(match_task);\n  matching_queue.join_all(); // Wait for all the jobs to finish.\n}\n\n// End class EpipolarLinePointMatcher\n//---------------------------------------------------------------------------------------\n\n// Match a set of interest points. This can be invoked for all interest points\n// in the image, then multiple threads are used, for for partial subsets,\n// when this should be called with a single thread, as multiple such calls\n// may be running in parallel.\nvoid epipolar_ip_matching_task(bool single_threaded_camera,\n        DetectIpMethod detect_method, \n        int number_of_jobs,\n        double epipolar_threshold,\n        double uniqueness_threshold,\n        vw::cartography::Datum const& datum,\n        bool quiet,\n        vw::camera::CameraModel* cam1,\n        vw::camera::CameraModel* cam2,\n        vw::ip::InterestPointList const& ip1,\n        vw::ip::InterestPointList const& ip2,\n        // Outputs\n        std::vector<vw::ip::InterestPoint>& matched_ip1,\n        std::vector<vw::ip::InterestPoint>& matched_ip2) {\n\n  std::vector<size_t> forward_match, backward_match;\n  EpipolarLinePointMatcher matcher(single_threaded_camera,\n\t\t\t\t   uniqueness_threshold, epipolar_threshold, datum);\n\n  if (!quiet)           \n    vw_out() << \"\\t    Matching forward\" << std::endl;\n  \n  matcher(ip1, ip2, detect_method, number_of_jobs, cam1, cam2, forward_match); \n\n  if (!quiet) {\n    vw_out() << \"\\t    ---> Obtained \" << forward_match.size() << \" matches.\" << std::endl;\n    vw_out() << \"\\t    Matching backward\" << std::endl;\n  }\n\n  matcher(ip2, ip1, detect_method, number_of_jobs, cam2, cam1, backward_match);\n  \n  if (!quiet)\n    vw_out() << \"\\t    ---> Obtained \" << backward_match.size() << \" matches.\" << std::endl;\n\n  // Perform circle consistency check\n  size_t valid_count = 0;\n  const size_t NULL_INDEX = (size_t)(-1);\n  for (size_t i = 0; i < forward_match.size(); i++) {\n    if (forward_match[i] != NULL_INDEX) {\n      if (backward_match[forward_match[i]] != i) {\n        forward_match[i] = NULL_INDEX;\n      } else {\n        valid_count++;\n      }\n    }\n  }\n\n  // Produce listing of valid indices that agree with forward and backward matching\n  matched_ip1.reserve(valid_count); // Get our allocations out of the way.\n  matched_ip2.reserve(valid_count);\n\n  auto ip1_it = ip1.begin(), ip2_it = ip2.begin();\n  for (size_t i = 0; i < forward_match.size(); i++) {\n    if (forward_match[i] != NULL_INDEX) {\n      matched_ip1.push_back(*ip1_it);\n      ip2_it = ip2.begin();\n      std::advance(ip2_it, forward_match[i]);\n      matched_ip2.push_back(*ip2_it);\n    }\n    ip1_it++;\n  }\n\n  return;\n}\n\n// Given a value x, find all n such that x is in the interval \n// [n*tile_size - extra, (n+1)*tile_size + extra]. We assume\n// that extra is at most half of tile size, so there are at most \n// 3 such indices.\nvoid tile_extra_indices(double x, int tile_size, int extra, std::vector<int> & indices) {\n\n  // This check should not be reached as the input parameters are validated.\n  if (extra > tile_size/2 || extra < 0)\n    vw_throw(ArgumentErr() << \"tile_indices: extra is too large or too small.\\n\");\n\n  // wipe the output\n  indices.clear();\n\n  int n = (int)floor(x / double(tile_size));\n  // iterate in -1, 0, 1\n  for (int i = -1; i <= 1; i++) {\n    int m = n + i;\n    if (m*tile_size - extra <= x && x <= (m+1)*tile_size + extra) {\n      indices.push_back(m);\n    }\n  }\n\n  return;\n}\n\n// Divide the left image and right aligned image into corresponding tiles. Find\n// the vector interest points in each left tile, and the corresponding one in\n// each right tile. These per-tile vectors will later be matched. The returned\n// interest points do not have alignment applied to them, that is only used\n// during processing. The division into tiles is virtual, as no actual tiles get\n// created. TODO(oalexan1): Tiles on the right and bottom edges may be small. We\n// do not take that into account. This may result in interest points there be\n// too dense.\nvoid group_ip_in_tiles(std::vector<vw::ip::InterestPoint> const& ip1_copy,\n                       std::vector<vw::ip::InterestPoint> const& ip2_copy,\n                       vw::Matrix<double> align_matrix,\n                       // Outputs\n                       std::map<std::pair<int, int>, std::vector<vw::ip::InterestPoint>> & ip1_vec,\n                       std::map<std::pair<int, int>, std::vector<vw::ip::InterestPoint>> & ip2_vec) {\n\n  // Wipe the output vectors\n  ip1_vec.clear();\n  ip2_vec.clear();\n\n  HomographyTransform align_trans(align_matrix);\n\n  // We will have tiles overlap, to ensure no interest points\n  // fall between the cracks. That may happen if alignment is not perfect.\n  Vector2i params = asp::stereo_settings().matches_per_tile_params;\n  vw_out() << \"Tile size used in matching: \" << params[0] << \"\\n\";\n  vw_out() << \"Expanded tile size:         \" << params[1] << \"\\n\";\n  \n  int tile_size = params[0];\n  int extra = (params[1] - params[0])/2;\n\n  // Map each ip to a box. \n  for (int i = 0; i < (int)ip1_copy.size(); i++) {\n    auto & ip = ip1_copy[i];\n    vw::Vector2 pt(ip.x, ip.y);\n    // Doing floor on purpose, so ip in [0, tile_size]^2 go to first box\n    int cx = floor(pt[0]/double(tile_size));\n    int cy = floor(pt[1]/double(tile_size));\n    auto p = std::make_pair(cx, cy);\n    ip1_vec[p].push_back(ip1_copy[i]);\n  }\n  // Repeat for ip2. First bring to image1 coordinates\n  for (int i = 0; i < (int)ip2_copy.size(); i++) {\n    auto & ip = ip2_copy[i];\n\n    // Bring to left image coordinates\n    vw::Vector2 pt(ip.x, ip.y); \n    pt = align_trans.forward(pt);\n\n    // Find all tiles of size tile_size with padding of extra on each side to\n    // which this belongs. For example, assume for the moment that tiles are in\n    // 1D. Then, the value 3 * tile_size - 0.8 * extra will belong to both tile\n    // 3 and tile 2. Value 3 * tile_size + 0.7 * extra will belong to both tile\n    // 3 and tile 4.\n    std::vector<int> x_indices, y_indices;\n    tile_extra_indices(pt[0], tile_size, extra, x_indices);\n    tile_extra_indices(pt[1], tile_size, extra, y_indices);\n    for (int cx : x_indices) {\n      for (int cy : y_indices) {\n        auto p = std::make_pair(cx, cy);\n        ip2_vec[p].push_back(ip2_copy[i]);\n      }\n    }\n  }\n\n  return;\n}\n\nvoid append_new_matches(\n          // Inputs\n          std::vector<vw::ip::InterestPoint> const& local_matched_ip1,\n          std::vector<vw::ip::InterestPoint> const& local_matched_ip2,\n          // Outputs (append)\n          std::set<std::pair<float, float>> & seen1,\n          std::set<std::pair<float, float>> & seen2,\n          std::vector<vw::ip::InterestPoint> & matched_ip1,\n          std::vector<vw::ip::InterestPoint> & matched_ip2) {\n\n  for (int i = 0; i < (int)local_matched_ip1.size(); i++) {\n    auto & ip1 = local_matched_ip1[i];\n    auto & ip2 = local_matched_ip2[i];\n    auto p1 = std::make_pair(ip1.x, ip1.y);\n    auto p2 = std::make_pair(ip2.x, ip2.y);\n    if (seen1.find(p1) == seen1.end() && seen2.find(p2) == seen2.end()) {\n      matched_ip1.push_back(ip1);\n      matched_ip2.push_back(ip2);\n      seen1.insert(p1);\n      seen2.insert(p2);\n    }\n  }\n  return;\n}\n\n// TODO(oalexan1): Move this function out of here.\n// TODO(oalexan1): Call this function in ControlNetworkLoader.cc\nvoid pick_subset(int max_pairwise_matches, \n  std::vector<ip::InterestPoint> & ip1, \n  std::vector<ip::InterestPoint> & ip2) {\n\n  std::vector<int> subset;\n  vw::math::pick_random_indices_in_range(ip1.size(), max_pairwise_matches, subset);\n  std::sort(subset.begin(), subset.end()); // sort the indices; not strictly necessary\n\n  std::vector<ip::InterestPoint> ip1_full, ip2_full;\n  ip1_full.swap(ip1);\n  ip2_full.swap(ip2);\n\n  ip1.resize(max_pairwise_matches);\n  ip2.resize(max_pairwise_matches);\n  for (size_t it = 0; it < subset.size(); it++) {\n    ip1[it] = ip1_full[subset[it]];\n    ip2[it] = ip2_full[subset[it]];\n  }\n}\n\n// Match ip without a datum, cameras, epipolar lines.\nvoid match_ip_no_datum(std::vector<vw::ip::InterestPoint> const& ip1_copy,\n                       std::vector<vw::ip::InterestPoint> const& ip2_copy,\n                       DetectIpMethod detect_method, double uniqueness_threshold, \n                       bool quiet,\n                       // Outputs\n                       std::vector<vw::ip::InterestPoint>& matched_ip1,\n                       std::vector<vw::ip::InterestPoint>& matched_ip2) {\n\n  // TODO: Should probably unify the ip::InterestPointMatcher class\n  // with the EpipolarLinePointMatcher class!\n  if (detect_method != DETECT_IP_METHOD_ORB) {\n    // For all L2Norm distance metrics\n    vw::ip::InterestPointMatcher<vw::ip::L2NormMetric,ip::NullConstraint> \n      matcher(asp::stereo_settings().flann_method, uniqueness_threshold);\n    matcher(ip1_copy, ip2_copy, matched_ip1, matched_ip2,\n\t    TerminalProgressCallback(\"asp\", \"\\t   Matching: \"), quiet);\n  } else {\n    // For Hamming distance metrics\n    vw::ip::InterestPointMatcher<ip::HammingMetric,ip::NullConstraint> \n      matcher(asp::stereo_settings().flann_method, uniqueness_threshold);\n    matcher(ip1_copy, ip2_copy, matched_ip1, matched_ip2,\n\t    TerminalProgressCallback(\"asp\", \"\\t   Matching: \"), quiet);\n  }\n\n  return;\n}\n\n// Local class definition\nclass MatchPerTileTask: public Task, private boost::noncopyable {\n\n  int m_start_tile, m_num_tiles_per_job;\n  bool m_have_datum, m_single_threaded_camera;\n  DetectIpMethod m_detect_method;\n  std::map<std::pair<int, int>, std::vector<vw::ip::InterestPoint>> const& m_ip1_vec;\n  std::map<std::pair<int, int>, std::vector<vw::ip::InterestPoint>> const& m_ip2_vec;\n  vw::camera::CameraModel* m_cam1;\n  vw::camera::CameraModel* m_cam2;\n  vw::cartography::Datum const& m_datum;\n  double m_epipolar_threshold;\n  double m_uniqueness_threshold;\n  vw::Matrix<double> const& m_align_matrix;\n  int m_matches_per_tile;\n  // Outputs\n  std::set<std::pair<float, float>> & m_seen1;\n  std::set<std::pair<float, float>> & m_seen2;\n  std::vector<vw::ip::InterestPoint> & m_matched_ip1;\n  std::vector<vw::ip::InterestPoint> & m_matched_ip2;\n  Mutex& m_match_mutex;\n\npublic:\n  MatchPerTileTask(int start_tile, int num_tiles_per_job,\n                   bool have_datum, \n                   bool single_threaded_camera,\n                   DetectIpMethod detect_method,\n                   std::map<std::pair<int, int>, std::vector<vw::ip::InterestPoint>> \n                   const& ip1_vec,\n                   std::map<std::pair<int, int>, std::vector<vw::ip::InterestPoint>> \n                   const& ip2_vec,\n                   vw::camera::CameraModel* cam1,\n                   vw::camera::CameraModel* cam2,\n                   vw::cartography::Datum const& datum,\n                   double epipolar_threshold,\n                   double uniqueness_threshold,\n                   vw::Matrix<double> const& align_matrix,\n                   int matches_per_tile,\n                   // Outputs\n                   std::set<std::pair<float, float>> & seen1, \n                   std::set<std::pair<float, float>> & seen2, \n                   std::vector<vw::ip::InterestPoint> & matched_ip1,\n                   std::vector<vw::ip::InterestPoint> & matched_ip2,\n                   Mutex& match_mutex):\n    m_start_tile(start_tile), \n    m_num_tiles_per_job(num_tiles_per_job),\n    m_have_datum(have_datum),\n    m_single_threaded_camera(single_threaded_camera),\n    m_detect_method(detect_method),\n    m_ip1_vec(ip1_vec), m_ip2_vec(ip2_vec),\n    m_cam1(cam1), m_cam2(cam2), m_datum(datum),\n    m_epipolar_threshold(epipolar_threshold),\n    m_uniqueness_threshold(uniqueness_threshold),\n    m_align_matrix(align_matrix),\n    m_matches_per_tile(matches_per_tile),\n    m_seen1(seen1), m_seen2(seen2),\n    m_matched_ip1(matched_ip1), m_matched_ip2(matched_ip2),\n    m_match_mutex(match_mutex) {}\n\n  void operator()() {\n  \n    bool quiet = true;\n\n    // Do the tiles within the range [m_start_tile, m_start_tile + m_num_tiles_per_job)\n    int tile_id = -1;\n    for (auto it1 = m_ip1_vec.begin(); it1 != m_ip1_vec.end(); it1++) {\n\n      // Do only the tiles within desired range\n      tile_id++;\n      if (tile_id < m_start_tile) continue;\n      if (tile_id >= m_start_tile + m_num_tiles_per_job) break;\n\n      // Find the corresponding set of ip in ip1_vec and ip2_vec\n      auto key = it1->first;\n      auto it2 = m_ip2_vec.find(key);\n      if (it2 == m_ip2_vec.end()) \n        continue; // no matches in this tile\n\n      std::vector<vw::ip::InterestPoint> const & tile_ip1 = it1->second; // alias\n      std::vector<vw::ip::InterestPoint> const & tile_ip2 = it2->second; // alias\n\n      std::vector<vw::ip::InterestPoint> local_matched_ip1, local_matched_ip2;\n      try {\n        if (m_have_datum) {\n          // Copy from std::vector<vw::ip::InterestPoint> to vw::ip::InterestPointList\n          // TODO(oalexan1): Avoid this copy\n          vw::ip::InterestPointList ip1_list, ip2_list;\n          for (size_t i = 0; i < tile_ip1.size(); i++)\n              ip1_list.push_back(tile_ip1[i]);\n          for (size_t i = 0; i < tile_ip2.size(); i++)\n              ip2_list.push_back(tile_ip2[i]);\n          int local_number_of_jobs = 1;\n          if (m_single_threaded_camera) {\n            // ISIS camera is single-threaded, prevent a crash\n            Mutex::Lock lock(m_match_mutex);\n            epipolar_ip_matching_task(m_single_threaded_camera, m_detect_method, \n              local_number_of_jobs, m_epipolar_threshold, m_uniqueness_threshold, \n              m_datum, quiet, m_cam1, m_cam2, ip1_list, ip2_list,\n              local_matched_ip1, local_matched_ip2); // outputs\n          } else {\n            // Multi-threaded camera\n            epipolar_ip_matching_task(m_single_threaded_camera, m_detect_method, \n              local_number_of_jobs, m_epipolar_threshold, m_uniqueness_threshold, \n              m_datum, quiet, m_cam1, m_cam2, ip1_list, ip2_list,\n              local_matched_ip1, local_matched_ip2); // outputs\n          }\n        \n        } else {\n          match_ip_no_datum(tile_ip1, tile_ip2, m_detect_method, m_uniqueness_threshold, \n            quiet, local_matched_ip1, local_matched_ip2); // outputs\n        }\n      } catch(...) {\n        // This need not succeed\n        return;\n      }\n\n      // Remove some ip if too many\n      if (local_matched_ip1.size() > m_matches_per_tile)\n      pick_subset(m_matches_per_tile, local_matched_ip1, local_matched_ip2);\n\n      {\n        // Update the global output variables\n        Mutex::Lock lock(m_match_mutex);\n        append_new_matches(local_matched_ip1, local_matched_ip2,\n          m_seen1, m_seen2, m_matched_ip1, m_matched_ip2); // append here\n      }\n  }\n\n    return;\n  } // End function operator()\n\n}; // End class MatchPerTileTask\n\n// Do interest point matching per tile, with and without having a datum. The\n// alignment matrix is used to bring the interest points in image2 to image1\n// coordinates. Use stereo_settings().matches_per_tile_params.\nvoid matches_per_tile(bool have_datum, \n                      bool single_threaded_camera,\n                      DetectIpMethod detect_method,\n                      std::vector<vw::ip::InterestPoint> const& ip1_copy, \n                      std::vector<vw::ip::InterestPoint> const& ip2_copy,\n                      vw::camera::CameraModel* cam1,\n                      vw::camera::CameraModel* cam2,\n                      vw::cartography::Datum const& datum,\n                      size_t number_of_jobs,\n                      double epipolar_threshold,\n                      double uniqueness_threshold,\n                      vw::Matrix<double> const& align_matrix,\n                      // Outputs\n                      std::vector<vw::ip::InterestPoint>& matched_ip1,\n                      std::vector<vw::ip::InterestPoint>& matched_ip2) {\n  \n  // Wipe the prior matches\n  matched_ip1.clear(); \n  matched_ip2.clear();\n\n  // TODO(oalexan1): Add multi-threading here.\n  bool quiet = true;\n  std::map<std::pair<int, int>, std::vector<vw::ip::InterestPoint>> ip1_vec, ip2_vec;\n  group_ip_in_tiles(ip1_copy, ip2_copy, align_matrix, \n      ip1_vec, ip2_vec); // outputs\n\n  // Adjust the number of jobs\n  int num_tiles = ip1_vec.size();\n  if (num_tiles < number_of_jobs) \n    number_of_jobs = num_tiles;\n\n  // The number of tiles per job\n  int num_tiles_per_job = ceil(double(num_tiles) / number_of_jobs);\n  if (num_tiles_per_job == 0) \n    num_tiles_per_job = 1;\n  int start_tile = 0;\n\n   // To help find unique matches\n  std::set<std::pair<float, float>> seen1, seen2;\n\n  // Iterate over each set of ip in ip1_vec\n  FifoWorkQueue matching_queue; // Create a thread pool object\n  Mutex match_mutex;\n  for (size_t i = 0; i < number_of_jobs; i++) {\n    boost::shared_ptr<Task> match_task(new \n    MatchPerTileTask(start_tile, num_tiles_per_job,\n                     have_datum, single_threaded_camera, \n                     detect_method, ip1_vec, ip2_vec, cam1, cam2, datum, \n                     epipolar_threshold, uniqueness_threshold, align_matrix,\n                     asp::stereo_settings().matches_per_tile,\n                     seen1, seen2, matched_ip1, matched_ip2, match_mutex));\n    matching_queue.add_task(match_task);\n    start_tile += num_tiles_per_job; // for the next job\n\n  } // end iterating over sets of ip\n\n  matching_queue.join_all(); // Wait for all jobs to finish\n\n  return;\n} // end if matches per tile\n\n// TODO(oalexan1): Break up this function as it is too long.\nbool epipolar_ip_matching(bool single_threaded_camera,\n        vw::ip::InterestPointList const& ip1,\n        vw::ip::InterestPointList const& ip2,\n        vw::camera::CameraModel* cam1,\n        vw::camera::CameraModel* cam2,\n        vw::ImageViewRef<float> const& image1,\n        vw::ImageViewRef<float> const& image2,\n        vw::cartography::Datum const& datum,\n        size_t number_of_jobs,\n        double epipolar_threshold,\n        double uniqueness_threshold,\n        double nodata1, double nodata2,\n        bool match_per_tile, \n        vw::Matrix<double> const& align_matrix, // used only if match_per_tile is true \n        // Outputs\n        std::vector<vw::ip::InterestPoint>& matched_ip1,\n        std::vector<vw::ip::InterestPoint>& matched_ip2) {\n  \n  matched_ip1.clear();\n  matched_ip2.clear();\n\n  // TODO(oalexan1): Avoid this copy\n  std::vector<vw::ip::InterestPoint> ip1_copy, ip2_copy;\n  ip1_copy.reserve(ip1.size());\n  ip2_copy.reserve(ip2.size());\n  std::copy(ip1.begin(), ip1.end(), std::back_inserter(ip1_copy));\n  std::copy(ip2.begin(), ip2.end(), std::back_inserter(ip2_copy));\n\n  // Match interest points forward/backward .. constraining on epipolar line\n  DetectIpMethod detect_method \n    = static_cast<DetectIpMethod>(stereo_settings().ip_detect_method);\n\n  // Sanity check\n  if (match_per_tile && asp::stereo_settings().matches_per_tile <= 0)\n  vw::vw_throw(vw::ArgumentErr()\n    << \"epipolar_ip_matching: matches_per_tile must be positive.\\n\");\n\n  if (!match_per_tile) {\n    vw_out() << \"\\t--> Matching interest points using the epipolar line.\" << std::endl;\n    vw_out() << \"\\t    Uniqueness threshold: \" << uniqueness_threshold << \"\\n\";\n    vw_out() << \"\\t    Epipolar threshold:   \" << epipolar_threshold   << \"\\n\";\n  } else {\n    // This will be printed on the second pass\n    vw_out() << \"\\t--> Performing matching per tile.\\n\";\n  }\n  \n  // Do matching\n  if (!match_per_tile) {\n    bool quiet = false; // has to be true if many such jobs exist\n    epipolar_ip_matching_task(single_threaded_camera, detect_method, \n          number_of_jobs, epipolar_threshold, uniqueness_threshold, \n          datum, quiet, cam1, cam2, ip1, ip2,\n          matched_ip1, matched_ip2); // outputs\n  } else {\n    bool have_datum = true;\n    matches_per_tile(have_datum, single_threaded_camera, detect_method,\n                     ip1_copy, ip2_copy, cam1, cam2, datum,\n                     number_of_jobs, epipolar_threshold, uniqueness_threshold,\n                     align_matrix, \n                     matched_ip1, matched_ip2); // outputs\n  }\n\n  vw_out() << \"\\t    Matched \" << matched_ip1.size() << \" points.\" << std::endl;\n\n  if (matched_ip1.empty())\n    return false;\n\n  // Write out debug image\n  if (stereo_settings().ip_debug_images) {\n    vw_out() << \"\\t    Writing IP match debug image prior to geometric filtering.\\n\";\n    write_match_image(\"InterestPointMatching__ip_matching_debug.tif\",\n                      image1, image2, matched_ip1, matched_ip2);\n  }\n\n  // TODO(oalexan1): All the filtering logic below must be in a separate function\n  // that will be called here.\n\n  // Apply filtering of IP by a selection of assumptions. Low\n  // triangulation error, agreement with klt tracking, and local\n  // neighbors are the same neighbors in both images.\n  std::list<size_t> good_indices;\n  for (size_t i = 0; i < matched_ip1.size(); i++)\n    good_indices.push_back(i);\n  \n  if (!stereo_settings().disable_tri_filtering) {\n    if (!tri_ip_filtering(matched_ip1, matched_ip2,\n\t\t\t  cam1, cam2, good_indices)){\n      vw_out() << \"No interest points left after triangulation filtering.\" << std::endl;\n      return false;\n    }\n  }\n  if (!stddev_ip_filtering(matched_ip1, matched_ip2, good_indices)) {\n    vw_out() << \"No interest points left after stddev filtering.\" << std::endl;\n    return false;\n  }\n\n  // Record new list that contains only the inliers.\n  vw_out() << \"\\t    Reduced matches to \" << good_indices.size() << \"\\n\";\n  std::vector<ip::InterestPoint> buffer(good_indices.size());\n\n  // Subselect and copy ip1\n  size_t w_index = 0;\n  BOOST_FOREACH(size_t index, good_indices) {\n    Vector2 l(matched_ip1[index].x, matched_ip1[index].y);\n    matched_ip1[index].ix = matched_ip1[index].x = l.x();\n    matched_ip1[index].iy = matched_ip1[index].y = l.y();\n    buffer[w_index] = matched_ip1[index];\n    w_index++;\n  }\n  matched_ip1 = buffer;\n\n  // Subselect and copy ip2\n  w_index = 0;\n  BOOST_FOREACH(size_t index, good_indices) {\n    Vector2 r(matched_ip2[index].x, matched_ip2[index].y);\n    matched_ip2[index].ix = matched_ip2[index].x = r.x();\n    matched_ip2[index].iy = matched_ip2[index].y = r.y();\n    buffer[w_index] = matched_ip2[index];\n    w_index++;\n  }\n  matched_ip2 = buffer;\n\n  // The interest points are not aligned here, so there's no need to align them\n  vw::TransformPtr tx1(NULL);\n  vw::TransformPtr tx2(NULL);\n    \n  // If options are set, filter by elevation.\n  if (stereo_settings().elevation_limit[0] < stereo_settings().elevation_limit[1] ||\n      !stereo_settings().lon_lat_limit.empty()) {\n\n    std::vector<ip::InterestPoint> matched_ip1_out, matched_ip2_out;\n    filter_ip_by_lonlat_and_elevation(tx1, tx2,\n                                      cam1, cam2,\n                                      datum,  matched_ip1, matched_ip2,\n                                      stereo_settings().elevation_limit,  \n                                      stereo_settings().lon_lat_limit,  \n                                      matched_ip1_out, matched_ip2_out);\n    matched_ip1 = matched_ip1_out;\n    matched_ip2 = matched_ip2_out;\n  } // End elevation filtering\n\n  if (stereo_settings().ip_debug_images) {\n    vw_out() << \"\\t    Writing IP match debug image after geometric filtering.\\n\";\n    write_match_image(\"InterestPointMatching__ip_matching_debug2.tif\",\n                      image1, image2, matched_ip1, matched_ip2);\n  }\n\n  return true;\n} // End function epipolar_ip_matching\n\n// See the .h file for documentation.\nbool match_ip_with_datum(bool single_threaded_camera,\n                         bool use_rough_homography,\n                         vw::camera::CameraModel* cam1,\n                         vw::camera::CameraModel* cam2,\n                         vw::ImageViewRef<float> const& image1,\n                         vw::ImageViewRef<float> const& image2,\n                         int ip_per_tile,\n                         vw::cartography::Datum const& datum,\n                         std::string const& match_filename,\n                         size_t number_of_jobs,\n                         double epipolar_threshold,\n                         double uniqueness_threshold,\n                         std::string const left_file_path,\n                         std::string const right_file_path,\n                         double nodata1,\n                         double nodata2) {\n\n  bool matches_as_txt = stereo_settings().matches_as_txt;\n\n  if (use_rough_homography)\n    vw_out() << \"\\t    Using rough homography.\\n\";\n  else\n    vw_out() << \"\\t    Skipping rough homography.\\n\";\n\n  // This call aligns the right image to the left image then detects IPs in the two images.\n  // Undo the alignment transform in the ip before returning, and return the transform.\n  vw::ip::InterestPointList ip1, ip2;\n  vw::Matrix<double> rough_homography = vw::math::identity_matrix<3>();\n  bool use_cached_ip = false;\n  if (use_rough_homography) \n    detect_ip_aligned_pair(cam1, cam2, image1, image2,\n                           asp::stereo_settings().ip_per_image, ip_per_tile, \n                           datum, left_file_path, nodata1, nodata2,\n                           ip1, ip2, rough_homography); // Outputs\n  else\n     detect_ip_pair(ip1, ip2, image1, image2,\n                    asp::stereo_settings().ip_per_image, ip_per_tile, \n                    left_file_path, right_file_path,\n                    nodata1, nodata2, use_cached_ip);\n\n  // Match the detected IPs which are in the original image coordinates.\n  std::vector<ip::InterestPoint> matched_ip1, matched_ip2;\n  bool match_per_tile = false;\n  vw::Matrix<double> align_matrix = vw::math::identity_matrix<3>();\n  vw::Stopwatch sw2;\n  sw2.start();\n  bool inlier = epipolar_ip_matching(single_threaded_camera, ip1, ip2, cam1, cam2, \n                                     image1, image2,  datum, number_of_jobs, \n                                     epipolar_threshold, uniqueness_threshold, \n                                     nodata1, nodata2,\n                                     match_per_tile, align_matrix, \n                                     matched_ip1, matched_ip2); // Outputs\n  sw2.stop();\n  vw_out() << \"Elapsed time in ip matching: \" << sw2.elapsed_seconds() << \" s.\\n\";\n\n  if (!inlier)\n    return false;\n\n  // Use the interest points that we found to compute an aligning homography\n  // transform for the two images. This is always needed when finding matches\n  // per tile or with rough homography.\n  bool adjust_left_image_size = false, tight_inlier_threshold = false;\n  Matrix<double> matrix1 = vw::math::identity_matrix<3>();\n  Matrix<double> matrix2 = vw::math::identity_matrix<3>();\n  if (use_rough_homography || asp::stereo_settings().matches_per_tile > 0) {\n    vw_out() << \"\\t    Computing homography transform.\\n\";\n    vw::Stopwatch sw3;\n    sw3.start();\n    bool tight_inlier_threshold = (asp::stereo_settings().matches_per_tile > 0);\n    homography_rectification(adjust_left_image_size, tight_inlier_threshold,\n\t\t\t   image1.get_size(), image2.get_size(),\n\t\t\t   matched_ip1, matched_ip2, matrix1, matrix2);\n    sw3.stop();\n    vw_out() << \"Elapsed time in homography computation: \" << sw3.elapsed_seconds() << \" s.\\n\";\n  }\n  if (use_rough_homography && \n      sum(abs(submatrix(rough_homography,0,0,2,2) - submatrix(matrix2,0,0,2,2))) > 4) {\n    vw_out() << \"Homography transform has largely different scale and skew \"\n             << \"compared with the rough homography. Homography transform is \" \n\t           << matrix2 << \". Examine your images, or consider using the option \"\n             << \"--skip-rough-homography.\\n\";\n    //return false;\n  }\n\n  // Second pass if doing matches per tile\n  if (asp::stereo_settings().matches_per_tile > 0) {\n    // We will use the homography matrix from left to right ip, stored in matrix2.\n    // It is expected that matrix1 is the identity matrix.\n    if (matrix1 != vw::math::identity_matrix<3>())\n      vw::vw_throw( ArgumentErr() << \"Expecting identity matrix for left image alignment.\\n\");\n\n    match_per_tile = true;\n    align_matrix = matrix2; // use the homography matrix\n    vw::Stopwatch sw4;\n    sw4.start();\n    bool inlier =\n      epipolar_ip_matching(single_threaded_camera,\n        ip1, ip2, cam1, cam2, image1, image2, \n        datum, number_of_jobs, epipolar_threshold, uniqueness_threshold,\n        nodata1, nodata2,\n        match_per_tile, align_matrix,\n        matched_ip1, matched_ip2); // Outputs\n    sw4.stop();\n    vw_out() << \"Elapsed time in ip matching when using tiles: \" \n      << sw4.elapsed_seconds() << \" s.\\n\";\n\n    if (!inlier)\n      return false;\n  }\n\n  // Write the matches to disk\n  vw_out() << \"\\t    * Writing match file: \" << match_filename << \"\\n\";\n  ip::write_match_file(match_filename, matched_ip1, matched_ip2, matches_as_txt);\n  return inlier;\n}\n\n// Match the ip and save the match file. No datum or epipolar constraint\n// is used in this mode.\nvoid match_ip_no_datum(vw::ip::InterestPointList const& ip1,\n                       vw::ip::InterestPointList const& ip2,\n                       vw::ImageViewRef<float> const& image1,\n                       vw::ImageViewRef<float> const& image2,\n                       size_t number_of_jobs,\n                       // Outputs\n                       std::vector<vw::ip::InterestPoint>& matched_ip1,\n                       std::vector<vw::ip::InterestPoint>& matched_ip2,\n                       std::string const& match_file) {\n\n  matched_ip1.clear(); \n  matched_ip2.clear();\n\n  std::vector<vw::ip::InterestPoint> ip1_copy, ip2_copy;\n  ip1_copy.reserve(ip1.size());\n  ip2_copy.reserve(ip2.size());\n  std::copy(ip1.begin(), ip1.end(), std::back_inserter(ip1_copy));\n  std::copy(ip2.begin(), ip2.end(), std::back_inserter(ip2_copy));\n\n  DetectIpMethod detect_method \n    = static_cast<DetectIpMethod>(stereo_settings().ip_detect_method);\n\n  // Best point must be closer than the next best point\n  double uniqueness_threshold = stereo_settings().ip_uniqueness_thresh;\n  vw_out() << \"\\t--> Uniqueness threshold: \" << uniqueness_threshold << \"\\n\";\n\n  bool quiet = false;\n  vw::Stopwatch sw1;\n  sw1.start();\n  match_ip_no_datum(ip1_copy, ip2_copy, detect_method, uniqueness_threshold, quiet,\n                    matched_ip1, matched_ip2); // outputs\n  sw1.stop();\n  vw_out() << \"Elapsed time in ip matching: \" << sw1.elapsed_seconds() << \" s.\\n\";\n\n  // Remove ip duplicates. Complexity is O(n log n).\n  vw::ip::remove_duplicates(matched_ip1, matched_ip2);\n\n  if (asp::stereo_settings().matches_per_tile != 0) {\n\n    // Use the interest points that we found to compute an aligning\n    // homography transform for the two images.\n    vw_out() << \"\\t    Computing homography transform.\\n\";\n    bool adjust_left_image_size = false;\n    bool tight_inlier_threshold = true; // this is necessary for large images\n    Matrix<double> matrix1, matrix2;\n    vw::Stopwatch sw2;\n    sw2.start();\n    homography_rectification(adjust_left_image_size, tight_inlier_threshold,\n                             image1.get_size(), image2.get_size(),\n                             matched_ip1, matched_ip2, matrix1, matrix2);\n    sw2.stop();\n    vw_out() << \"Elapsed time in homography computation: \" << sw2.elapsed_seconds() << \" s.\\n\";\n\n    // We will use the homography matrix from left to right ip, stored in matrix2.\n    // It is expected that matrix1 is the identity matrix.\n    if (matrix1 != vw::math::identity_matrix<3>())\n      vw::vw_throw( ArgumentErr() << \"Expecting identity matrix for left image alignment.\\n\");\n    vw::Matrix<double> align_matrix = matrix2; \n\n    // Initialize some quantities that won't be used but are part of the API.\n    bool have_datum = false, single_threaded_camera = false;\n    double epipolar_threshold = -1, nodata1 = -1, nodata2 = -1;\n    vw::camera::CameraModel *cam1 = NULL, *cam2 = NULL;\n    vw::cartography::Datum datum;\n    vw::Stopwatch sw3;\n    sw3.start();\n    vw_out() << \"\\t    Performing matching per tile.\\n\";\n    matches_per_tile(have_datum, single_threaded_camera, detect_method,\n                     ip1_copy, ip2_copy, cam1, cam2, datum,\n                     number_of_jobs, epipolar_threshold, uniqueness_threshold,\n                     align_matrix, \n                     matched_ip1, matched_ip2); // outputs\n    sw3.stop();\n    vw_out() << \"Elapsed time in ip matching when using tiles: \" \n      << sw3.elapsed_seconds() << \" s.\\n\";\n  }\n\n  vw_out() << \"\\t    Matched points: \" << matched_ip1.size() << std::endl;\n\n  if (stereo_settings().ip_debug_images) {\n    vw_out() << \"\\t    Writing IP initial match debug image.\\n\";\n    // Cast to float to make this compile\n    ImageViewRef<float> im1 = vw::pixel_cast<float>(image1);\n    ImageViewRef<float> im2 = vw::pixel_cast<float>(image2);\n    write_match_image(\"InterestPointMatching__ip_matching_debug.tif\",\n                      im1, im2, matched_ip1, matched_ip2);\n  }\n\n  // Save ip\n  if (match_file != \"\") {\n    // Create the output directory\n    vw::create_out_dir(match_file);\n    vw_out() << \"Writing: \" << match_file << std::endl;\n    bool matches_as_txt = stereo_settings().matches_as_txt;\n    vw::ip::write_match_file(match_file, matched_ip1, matched_ip2, matches_as_txt);\n  }\n\n  return;\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Core/IpMatchingAlgs.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Core/InterestPointMatching.h>\n#include <asp/Core/IpMatchingAlgs.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/FileUtils.h>\n\n#include <vw/InterestPoint/InterestPoint.h>\n#include <vw/InterestPoint/MatcherIO.h>\n#include <vw/Camera/CameraModel.h>\n#include <vw/BundleAdjustment/ControlNetwork.h>\n#include <vw/FileIO/DiskImageView.h>\n#include <vw/Math/Statistics.h>\n\n#include <boost/filesystem.hpp>\n\nusing namespace vw;\nnamespace fs = boost::filesystem;\n\nnamespace asp {\n\n// Find the match file taking into account --match-files-prefix and\n// --clean-match-files-prefix.\nstd::string stereoMatchFile(std::string const& left_cropped_file,\n                            std::string const& right_cropped_file,\n                            std::string const& out_prefix,\n                            bool matches_as_txt) {\n\n  // Define the file name containing IP match information.\n  bool crop_left  = (stereo_settings().left_image_crop_win  != BBox2i(0, 0, 0, 0));\n  bool crop_right = (stereo_settings().right_image_crop_win != BBox2i(0, 0, 0, 0));\n\n  // See if can use an externally provided match file\n  std::string match_filename;\n  if (!crop_left && !crop_right)\n    match_filename\n      = asp::matchFileMultiPrefix(stereo_settings().clean_match_files_prefix,\n                                  stereo_settings().match_files_prefix,\n                                  out_prefix, left_cropped_file, right_cropped_file,\n                                  matches_as_txt);\n\n  // If the user wants to use an external match file, it better exist\n  bool external_matches = (!stereo_settings().clean_match_files_prefix.empty() ||\n                           !stereo_settings().match_files_prefix.empty());\n  if (external_matches && !boost::filesystem::exists(match_filename))\n    vw_throw(ArgumentErr() << \"Missing IP file: \" << match_filename);\n\n  // Fall back to creating one if no luck\n  if (match_filename == \"\" || !boost::filesystem::exists(match_filename))\n      match_filename = vw::ip::match_filename(out_prefix, left_cropped_file, right_cropped_file,\n                                              matches_as_txt);\n\n  return match_filename;\n}\n\n// Compute ip between L.tif and R.tif produced by stereo.\nvoid compute_ip_LR(std::string const & out_prefix) {\n  \n  const std::string left_aligned_image_file  = out_prefix + \"-L.tif\";\n  const std::string right_aligned_image_file = out_prefix + \"-R.tif\";\n  \n  // The L-R match file. TODO(oalexan1): May need to consider the\n  // --match-files-prefix and --clean-match-files-prefix options.\n  // For that, need to integrate with the logic for finding the match file\n  // for non-mapprojected images. So this function should be called from\n  // StereoSession::preprocessing_hook() where we know left_cropped_file, etc.\n  // Must then also test with ISIS mapprojected images.\n  bool matches_as_txt = stereo_settings().matches_as_txt;\n  std::string match_filename = vw::ip::match_filename(out_prefix, \"L.tif\", \"R.tif\",\n                                                      matches_as_txt);\n\n  // Make sure the match file is newer than these files\n  std::vector<std::string> ref_list;\n  ref_list.push_back(left_aligned_image_file);\n  ref_list.push_back(right_aligned_image_file);\n\n  bool crop_left  = (asp::stereo_settings().left_image_crop_win  != BBox2i(0, 0, 0, 0));\n  bool crop_right = (asp::stereo_settings().right_image_crop_win != BBox2i(0, 0, 0, 0));\n  bool rebuild = (!first_is_newer(match_filename, ref_list) || crop_left || crop_right);\n  if (!crop_left && !crop_right &&\n      (asp::stereo_settings().force_reuse_match_files ||\n       asp::stereo_settings().clean_match_files_prefix != \"\" ||\n       asp::stereo_settings().match_files_prefix != \"\"))\n    rebuild = false; // Do not rebuild with externally provided match files\n    \n  if (fs::exists(match_filename) && !rebuild) {\n    vw_out() << \"Cached IP match file found: \" << match_filename << std::endl;\n    return;\n  }\n\n  vw_out() << \"Computing interest points matches.\\n\";\n  \n  // Load the images\n  boost::shared_ptr<DiskImageResource> \n    left_rsrc(DiskImageResourcePtr(left_aligned_image_file)),\n    right_rsrc(DiskImageResourcePtr(right_aligned_image_file));\n\n  std::string left_ip_filename  = ip::ip_filename(out_prefix, left_aligned_image_file);\n  std::string right_ip_filename = ip::ip_filename(out_prefix, right_aligned_image_file);\n\n  // Read the no-data values written to disk previously when\n  // the normalized left and right sub-images were created.\n  float left_nodata_value  = std::numeric_limits<float>::quiet_NaN();\n  float right_nodata_value = std::numeric_limits<float>::quiet_NaN();\n  if (left_rsrc->has_nodata_read ()) left_nodata_value  = left_rsrc->nodata_read ();\n  if (right_rsrc->has_nodata_read()) right_nodata_value = right_rsrc->nodata_read();\n  \n  // These images can be big, so use ImageViewRef\n  ImageViewRef<float> left_image  = DiskImageView<float>(left_rsrc);\n  ImageViewRef<float> right_image = DiskImageView<float>(right_rsrc);\n\n  // Mask the nodata\n  ImageViewRef<PixelMask<float>> left_masked_image\n    = create_mask(left_image, left_nodata_value);\n  ImageViewRef<PixelMask<float>> right_masked_image\n    = create_mask(right_image, right_nodata_value);\n  \n  // Read the masks\n  std::string left_mask_file  = out_prefix + \"-lMask.tif\";\n  std::string right_mask_file = out_prefix + \"-rMask.tif\";\n  ImageViewRef<PixelMask<uint8>> left_mask \n    = create_mask(DiskImageView<uint8>(left_mask_file), 0);\n  ImageViewRef<PixelMask<uint8>> right_mask\n    = create_mask(DiskImageView<uint8>(right_mask_file), 0);\n   \n  // The logic further down cannot handle NaN, so fix that\n  if (std::isnan(left_nodata_value)) \n    left_nodata_value = -std::numeric_limits<float>::max();\n  if (std::isnan(right_nodata_value))\n    right_nodata_value = -std::numeric_limits<float>::max();\n    \n  // It is important to apply the masks so that not to find interest points\n  // in areas where the images are invalid.\n  left_masked_image = intersect_mask(left_masked_image, left_mask);\n  right_masked_image = intersect_mask(right_masked_image, right_mask);\n  left_image = apply_mask(left_masked_image, left_nodata_value);\n  right_image = apply_mask(right_masked_image, right_nodata_value);\n  \n  // No interest point operations have been performed before\n  vw_out() << \"\\t    * Detecting interest points.\\n\";\n\n  // TODO: Depending on alignment method, we can tailor the IP filtering strategy.\n  double thresh_factor = asp::stereo_settings().ip_inlier_factor;\n  \n  // This range is extra large to handle elevation differences. That can \n  // be an issue with mapprojected images.\n  // TODO(oalexan1): Must use everywhere a single choice of parameters\n  // for ip matching with homography.\n  const int inlier_threshold = 1000.0 * thresh_factor; // 200 by default\n  size_t number_of_jobs = 1;\n  bool use_cached_ip = false;\n  bool success = asp::homography_ip_matching(left_image, right_image,\n                                             asp::stereo_settings().ip_per_tile,\n                                             inlier_threshold, match_filename,\n                                             number_of_jobs,\n                                             left_ip_filename, right_ip_filename,\n                                             use_cached_ip,\n                                             left_nodata_value, right_nodata_value);\n\n  if (!success)\n    vw_throw(ArgumentErr() << \"Could not find interest points.\\n\");\n\n  return;\n}\n\n// Outlier removal based on the disparity of interest points.\n// Points with x or y disparity not within the 100-'pct' to 'pct'\n// percentile interval expanded by 'factor' will be removed as\n// outliers. Overwrite the ip in place.\nvoid filter_ip_by_disparity(double pct,    // for example, 90.0\n                            double factor, // for example, 3.0\n                            bool quiet,    // if not to print a lot of text\n                            std::vector<vw::ip::InterestPoint> & left_ip,\n                            std::vector<vw::ip::InterestPoint> & right_ip){\n\n  double pct_fraction = 1.0 - pct/100.0;\n  double bx, ex, by, ey;\n  std::vector<double> dispx, dispy;\n  for (size_t it = 0; it < left_ip.size(); it++) {\n    dispx.push_back(right_ip[it].x - left_ip[it].x);\n    dispy.push_back(right_ip[it].y - left_ip[it].y);\n  }\n  vw::math::find_outlier_brackets(dispx, pct_fraction, factor, bx, ex);\n  vw::math::find_outlier_brackets(dispy, pct_fraction, factor, by, ey);\n    \n  //vw_out() << \"Outlier statistics by disparity in x: b = \" << bx << \", e = \" << ex << \".\\n\";\n  //vw_out() << \"Outlier statistics by disparity in y: b = \" << by << \", e = \" << ey << \".\\n\";\n    \n  // Remove the bad ip \n  size_t good_it = 0;\n  for (size_t it = 0; it < left_ip.size(); it++) {\n    if (dispx[it] < bx || dispx[it] > ex) continue;\n    if (dispy[it] < by || dispy[it] > ey) continue;\n    left_ip [good_it] = left_ip[it];\n    right_ip[good_it] = right_ip[it];\n    good_it++;\n  }\n\n  if (!quiet)\n    vw_out() << \"Removed \" << left_ip.size() - good_it\n             << \" outliers based on percentiles of differences of interest \"\n             << \"points with --outlier-removal-params.\\n\";\n  \n  left_ip.resize(good_it);\n  right_ip.resize(good_it);\n\n  return;\n}\n\ndouble calc_ip_coverage_fraction(std::vector<ip::InterestPoint> const& ip,\n                                 vw::Vector2i const& image_size, int tile_size,\n                                 int min_ip_per_tile) {\n\n  if (tile_size < 1)\n    vw_throw(LogicErr() << \"calc_ip_coverage_fraction: tile size is \" << tile_size);\n\n  // Generate a grid of ROIs covering the entire image\n  BBox2i full_bbox(Vector2i(0,0), image_size);\n  bool include_partials = false;\n  std::vector<BBox2i> rois;\n  rois = subdivide_bbox(full_bbox, tile_size, tile_size, include_partials);\n  const size_t num_rois = rois.size();\n  if (num_rois == 0)\n    return 0; // Cannot have any coverage in the degenerate case!\n    \n  // Pack all IP into a list for speed\n  std::list<Vector2i> ip_list;\n  for (size_t i=0; i<ip.size(); ++i) {\n    ip_list.push_back(Vector2i(ip[i].x, ip[i].y));\n  }\n    \n  size_t num_filled_rois = 0;\n  for (size_t i=0; i<num_rois; ++i) { // Loop through ROIs\n    int ip_in_roi = 0;\n      \n    // Check if each point is in this ROI\n    std::list<Vector2i>::iterator iter;\n    for (iter=ip_list.begin(); iter!=ip_list.end(); ++iter) {\n        \n      // If the IP is in the ROI, remove it from the IP list so it\n      // does not get searched again.\n      if (rois[i].contains(*iter)) {\n        iter = ip_list.erase(iter);\n        ++ip_in_roi;\n        --iter;\n      }\n    } // End IP loop\n    if (ip_in_roi > min_ip_per_tile)\n      ++num_filled_rois;\n  }// End ROI loop\n\n  return static_cast<double>(num_filled_rois) / static_cast<double>(num_rois);\n}\n  \n/// Apply alignment transform to ip. Not to be used with mapprojected images.\nvoid align_ip(vw::TransformPtr const& tx_left,\n              vw::TransformPtr const& tx_right,\n              std::vector<vw::ip::InterestPoint> & ip_left,\n              std::vector<vw::ip::InterestPoint> & ip_right) {\n\n  // Loop through all the IP we found\n  for (size_t i = 0; i < ip_left.size(); i++) {\n    // Apply the alignment transforms to the recorded IP\n    Vector2 l = tx_left->forward (Vector2(ip_left [i].x,  ip_left [i].y));\n    Vector2 r = tx_right->forward(Vector2(ip_right[i].x,  ip_right[i].y));\n\n    ip_left [i].x = l[0];\n    ip_left [i].y = l[1];\n    ip_left [i].ix = l[0];\n    ip_left [i].iy = l[1];\n    \n    ip_right[i].x = r[0];\n    ip_right[i].y = r[1];\n    ip_right[i].ix = r[0];\n    ip_right[i].iy = r[1];\n  }\n\n  return;\n} // End align_ip\n\n// Undo the alignment of interest points. If tx_left and tx_right are null,\n// that will mean there is no alignment to undo.\nvoid unalign_ip(vw::TransformPtr tx_left,\n               vw::TransformPtr  tx_right,\n               std::vector<vw::ip::InterestPoint> const& ip1_in,\n               std::vector<vw::ip::InterestPoint> const& ip2_in,\n               std::vector<vw::ip::InterestPoint> & ip1_out,\n               std::vector<vw::ip::InterestPoint> & ip2_out) {\n\n  // Init the output vectors\n  ip1_out.clear();\n  ip2_out.clear();\n  int num_ip = ip1_in.size();\n  ip1_out.reserve(num_ip);\n  ip2_out.reserve(num_ip);\n\n  if (int(tx_left.get() != NULL) + int(tx_right != NULL) == 1)\n    vw_throw(ArgumentErr() << \"Either both or none of the transforms must be set.\\n\");\n\n  // This function can be called with both unaligned and aligned interest points\n  bool aligned_ip = (tx_left.get() != NULL && tx_right != NULL);\n\n  for (size_t i = 0; i < num_ip; i++) {\n\n    // We must not both apply a transform and a scale at the same time\n    // as these are meant to do the same thing in different circumstances.\n    Vector2 p1 = Vector2(ip1_in[i].x, ip1_in[i].y);\n    Vector2 p2 = Vector2(ip2_in[i].x, ip2_in[i].y);\n    \n    if (aligned_ip) {\n      // Unalign\n      p1 = tx_left->reverse (p1);\n      p2 = tx_right->reverse(p2);\n    }\n    \n    // First push the original ip\n    ip1_out.push_back(ip1_in[i]);\n    ip2_out.push_back(ip2_in[i]);\n    \n    // Then adjust x and y\n    ip1_out.back().x = p1[0];\n    ip1_out.back().y = p1[1];\n    ip2_out.back().x = p2[0];\n    ip2_out.back().y = p2[1];\n    \n    // Same for ix and iy, for consistency\n    ip1_out.back().ix = p1[0];\n    ip1_out.back().iy = p1[1];\n    ip2_out.back().ix = p2[0];\n    ip2_out.back().iy = p2[1];\n  }\n  \n  // ip_in and ip_out must have same size.\n  if (ip1_in.size() != ip1_out.size())\n    vw_throw(ArgumentErr() << \"Aligned and unaligned interest points have different sizes.\\n\");\n    \n  return;\n}\n\n// Heuristics for match file prefix\nstd::string matchMultiPrefix(std::string const& clean_match_files_prefix,\n                             std::string const& match_files_prefix,\n                             std::string const& out_prefix) {\n  \n  if (clean_match_files_prefix != \"\")\n    return clean_match_files_prefix;\n  else if (match_files_prefix != \"\")\n    return match_files_prefix;\n  return out_prefix; \n}\n  \n// Heuristics for where to load the match file from  \nstd::string matchFileMultiPrefix(std::string const& clean_match_files_prefix,\n                                 std::string const& match_files_prefix,\n                                 std::string const& out_prefix,\n                                 std::string const& image1_path,\n                                 std::string const& image2_path,\n                                 bool matches_as_txt) {\n\n  std::string curr_prefix = asp::matchMultiPrefix(clean_match_files_prefix,\n                                                  match_files_prefix,\n                                                  out_prefix);\n\n  if (clean_match_files_prefix != \"\")\n    return vw::ip::clean_match_filename(curr_prefix, image1_path, image2_path, matches_as_txt);\n\n  return vw::ip::match_filename(curr_prefix, image1_path, image2_path, matches_as_txt);\n}\n\n/// The unwarped disparity file name\nstd::string unwarped_disp_file(std::string const& prefix, std::string const& left_image,\n                               std::string const& right_image, bool matches_as_txt) {\n\n  std::string match_file = vw::ip::match_filename(prefix, left_image, right_image,\n                                                  matches_as_txt);\n\n  std::string disp_file = boost::filesystem::path(match_file).replace_extension(\"\").string();\n  return disp_file + \"-unaligned-D.tif\";\n}\n  \n// Find and sort the convergence angles for given cameras and interest points\nvoid convergence_angles(vw::camera::CameraModel const * left_cam,\n                        vw::camera::CameraModel const * right_cam,\n                        std::vector<vw::ip::InterestPoint> const& left_ip,\n                        std::vector<vw::ip::InterestPoint> const& right_ip,\n                        std::vector<double> & sorted_angles) {\n\n  int num_ip = left_ip.size();\n  sorted_angles.clear();\n  for (int ip_it = 0; ip_it < num_ip; ip_it++) {\n    Vector2 lip(left_ip[ip_it].x,  left_ip[ip_it].y);\n    Vector2 rip(right_ip[ip_it].x, right_ip[ip_it].y);\n    double angle = 0.0;\n    try {\n      angle = (180.0 / M_PI) * acos(dot_prod(left_cam->pixel_to_vector(lip),\n                                             right_cam->pixel_to_vector(rip)));\n    } catch(...) {\n      // Projection into camera may not always succeed\n      continue;\n    }\n      \n    if (std::isnan(angle)) \n      continue;\n      \n    sorted_angles.push_back(angle);\n  }\n  \n  std::sort(sorted_angles.begin(), sorted_angles.end());\n}\n\n// Find all match files stored on disk having this prefix. This is much faster\n// than trying to see if any combination of images results in a match file.\nvoid listExistingMatchFiles(std::string const& prefix,\n                            bool matches_as_txt,\n                            std::set<std::string> & existing_files) {\n\n  existing_files.clear();\n  fs::path dirName = fs::path(\".\");\n  try {\n    dirName = fs::path(prefix).parent_path();\n  } catch(...) {}\n  \n  // This is a fix for an output prefix which is of the form \"run\" rather than\n  // \"run/run\".\n  bool add_dot = false;\n  if (dirName.string() == \"\") {\n    dirName = fs::path(\".\");\n    add_dot = true;\n  }\n  \n  std::string ext;\n  if (matches_as_txt)\n    ext = \".txt\";\n  else\n    ext = \".match\";\n   \n  // Iterate over all files in the directory\n  for (auto i = fs::directory_iterator(dirName); i != fs::directory_iterator(); i++) {\n    \n    if (fs::is_directory(i->path())) // skip dirs\n      continue;\n    std::string filename = i->path().string();\n    if (filename.find(ext) == std::string::npos) // keep only match files\n      continue;\n      \n    if (add_dot && filename.size() >= 2 && filename[0] == '.' && filename[1] == '/' &&\n        filename.find(prefix) != 0) {\n      // Had to temporarily replace prefix*.match with ./prefix*.match so\n      // boost can list the current directory. Remove the dot (and slash) now.\n      filename = filename.substr(2, filename.size()-2);\n    }\n      \n    existing_files.insert(filename);\n  }\n}\n\n// Given a pair of indices, return all the matches between them.\nvoid matchesForPair(vw::ba::ControlNetwork const& cnet,\n                    int left_cid, int right_cid,\n                    std::vector<vw::ip::InterestPoint> & left_ip,\n                    std::vector<vw::ip::InterestPoint> & right_ip) {\n\n  // Wipe the outputs\n  left_ip.clear();\n  right_ip.clear();\n  \n  // Iterate over all control points in cnet\n  for (int ipt = 0; ipt < cnet.size(); ipt++) {\n    \n    // Iterate over all measures for the current control point \n    bool has_left = false, has_right = false;\n    vw::ip::InterestPoint lip, rip;\n    for (auto m = cnet[ipt].begin(); m != cnet[ipt].end(); m++) {\n      int cid = m->image_id();\n      \n      if (cid == left_cid) {\n        has_left = true;\n        lip.x = m->position()[0];\n        lip.y = m->position()[1];\n      } else if (cid == right_cid) {\n        has_right = true;\n        rip.x = m->position()[0];\n        rip.y = m->position()[1];\n      }\n    }\n    \n    if (has_left && has_right) {\n      left_ip.push_back(lip);\n      right_ip.push_back(rip);\n    }\n  }\n  \n  return;\n}\n\n// Make a list of all of the image pairs to find matches for. When prior matches\n// are used, they can be in any order.\nvoid determineImagePairs(// Inputs\n                         int overlap_limit,\n                         bool match_first_to_last,\n                         bool external_matches,\n                         std::vector<std::string> const& image_files,\n                         // if having optional preexisting camera positions\n                         bool got_est_cam_positions,\n                         // Optional filter distance, set to -1 if not used\n                         double position_filter_dist,\n                         // Estimated camera positions, set to empty if missing\n                         std::vector<vw::Vector3> const& estimated_camera_gcc,\n                         // Optional preexisting list\n                         bool have_overlap_list,\n                         std::set<std::pair<std::string, std::string>> const&\n                         overlap_list,\n                         // Output\n                         std::vector<std::pair<int,int>> & all_pairs) {\n\n  // Wipe the output\n  all_pairs.clear();\n\n  // Need this to avoid repetitions\n  std::set<std::pair<int, int>> local_set;\n  \n  int num_images = image_files.size();\n  for (int i0 = 0; i0 < num_images; i0++){\n\n    for (int j0 = i0 + 1; j0 <= i0 + overlap_limit; j0++){\n\n      // Make copies of i and j which we can modify\n      int i = i0, j = j0;\n\n      if (j >= num_images) {\n        \n        if (!match_first_to_last)\n          continue; // out of bounds\n\n        j = j % num_images; // wrap around\n\n        if (i == j) \n          continue; // can't have matches to itself\n\n        if (i > j) \n          std::swap(i, j);\n      }\n      \n      // Apply the overlap list if manually specified. Otherwise every\n      // image pair i, j as above will be matched.\n      if (have_overlap_list) {\n        auto pair1 = std::make_pair(image_files[i], image_files[j]);\n        auto pair2 = std::make_pair(image_files[j], image_files[i]);\n        if (overlap_list.find(pair1) == overlap_list.end() &&\n            overlap_list.find(pair2) == overlap_list.end())\n          continue;\n      }\n\n      // If this option is set, don't try to match cameras that are too far apart.\n      if (got_est_cam_positions && (position_filter_dist > 0)) {\n        Vector3 this_pos  = estimated_camera_gcc[i];\n        Vector3 other_pos = estimated_camera_gcc[j];\n        if ((this_pos  != Vector3(0,0,0)) && // If both positions are known\n            (other_pos != Vector3(0,0,0)) && // and they are too far apart\n            (norm_2(this_pos - other_pos) > position_filter_dist)) {\n          vw_out() << \"Skipping position: \" << this_pos << \" and \"\n                   << other_pos << \" with distance \" << norm_2(this_pos - other_pos)\n                   << std::endl;\n          continue; // Skip this image pair\n        }\n      }\n\n      local_set.insert(std::make_pair(i,j));\n    }\n  }\n\n  if (external_matches) {\n    // Accept matches in reverse order\n    auto local_set_in = local_set;\n    for (auto it = local_set_in.begin(); it != local_set_in.end(); it++)\n      local_set.insert(std::make_pair(it->second, it->first));\n  }\n  \n  // The pairs without repetition\n  for (auto it = local_set.begin(); it != local_set.end(); it++)\n    all_pairs.push_back(*it);\n}\n\n// Find interest point matches by loading them from files for a given set of images.\nvoid findMatchFiles(// Inputs\n                    int overlap_limit,\n                    bool match_first_to_last,\n                    std::vector<std::string> const& image_files,\n                    std::string const& clean_match_files_prefix,\n                    std::string const& match_files_prefix,\n                    std::string const& out_prefix,\n                    bool matches_as_txt,\n                    // Outputs\n                    std::map<std::pair<int, int>, std::string> & match_files) {\n\n  // Clear the output\n  match_files.clear();\n  \n  // Make a list of all the image pairs to find matches for.\n  bool external_matches = true;\n  bool got_est_cam_positions = false;\n  double position_filter_dist = -1.0;\n  std::vector<vw::Vector3> estimated_camera_gcc;\n  bool have_overlap_list = false;\n  std::set<std::pair<std::string, std::string>> overlap_list;\n  std::vector<std::pair<int,int>> all_pairs;\n  asp::determineImagePairs(overlap_limit, match_first_to_last, external_matches,\n                           image_files, got_est_cam_positions, position_filter_dist,\n                           estimated_camera_gcc, have_overlap_list, overlap_list,\n                           all_pairs); // output\n\n  // List existing match files. This can take a while.\n  vw_out() << \"Computing the list of existing match files.\\n\";\n  std::string prefix = asp::matchMultiPrefix(clean_match_files_prefix,\n                                             match_files_prefix,\n                                             out_prefix);\n  std::set<std::string> existing_files;\n  asp::listExistingMatchFiles(prefix, matches_as_txt, existing_files);\n\n  // Load match files\n  for (size_t k = 0; k < all_pairs.size(); k++) {\n    int i = all_pairs[k].first;\n    int j = all_pairs[k].second;\n    std::string const& image1_path  = image_files[i];  // alias\n    std::string const& image2_path  = image_files[j];  // alias\n    // Load match files from a different source\n    std::string match_file\n      = asp::matchFileMultiPrefix(clean_match_files_prefix, match_files_prefix,\n                                  out_prefix, image1_path, image2_path, matches_as_txt);\n    // The external match file does not exist, don't try to load it\n    if (existing_files.find(match_file) == existing_files.end())\n      continue;\n    match_files[std::make_pair(i, j)] = match_file;\n  }\n}\n \n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Core/IpMatchingAlgs.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// This header file is to be very light-weight and only include\n// definitions of high-level interest point matching algorithms, and\n// no template-based logic. Those should go in\n// InterestPointMatching.h, which will be included in\n// IpMatchingAlgs.cc. The goal is to include in most places this\n// lightweight header rather than InterestPointMatching.h.\n\n// TODO(oalexan1): Move here more algorithms.\n\n#ifndef __ASP_CORE_IP_MATCHING_ALGS_H__\n#define __ASP_CORE_IP_MATCHING_ALGS_H__\n\n#include <vw/Math/Transform.h> // defines vw::TransformPtr\n\n#include <map>\n#include <set>\n#include <vector>\n\nnamespace vw {\n  namespace ip {\n    class InterestPoint;\n  }\n  namespace ba {\n    class ControlNetwork;\n  }\n\n  namespace camera {\n    class CameraModel;\n  }\n}\n\nnamespace asp {\n\n// Find the match file taking into account --match-files-prefix and\n// --clean-match-files-prefix.\nstd::string stereoMatchFile(std::string const& left_cropped_file,\n                            std::string const& right_cropped_file,\n                            std::string const& out_prefix,\n                            bool matches_as_txt);\n\n// Compute ip between L.tif and R.tif produced by stereo.\nvoid compute_ip_LR(std::string const & out_prefix);\n\n// Outlier removal based on the disparity of interest points.\n// Points with x or y disparity not within the 100-'pct' to 'pct'\n// percentile interval expanded by 'factor' will be removed as\n// outliers. Overwrite the ip in place.\nvoid filter_ip_by_disparity(double pct,    // for example, 90.0\n                            double factor, // for example, 3.0\n                            bool quiet,    // if not to print a lot of text\n                            std::vector<vw::ip::InterestPoint> & left_ip,\n                            std::vector<vw::ip::InterestPoint> & right_ip);\n  \n// Estimate the \"spread\" of IP coverage in an image.\n// - Returns a value between 0 and 1.\n// - Breaks the image into tiles and checks how many tiles have at least N IP.\ndouble calc_ip_coverage_fraction(std::vector<vw::ip::InterestPoint> const& ip,\n                                 vw::Vector2i const& image_size, int tile_size=1024,\n                                 int min_ip_per_tile=2);\n  \n/// Apply alignment transform to ip. Not to be used with mapprojected images.\nvoid align_ip(vw::TransformPtr const& tx_left,\n              vw::TransformPtr const& tx_right,\n              std::vector<vw::ip::InterestPoint> & ip_left,\n              std::vector<vw::ip::InterestPoint> & ip_right);\n\n// Undo the alignment of interest points. If tx_left and tx_right are null,\n// that will mean there is no alignment to undo.\nvoid unalign_ip(vw::TransformPtr tx_left,\n               vw::TransformPtr  tx_right,\n               std::vector<vw::ip::InterestPoint> const& ip1_in,\n               std::vector<vw::ip::InterestPoint> const& ip2_in,\n               std::vector<vw::ip::InterestPoint> & ip1_out,\n               std::vector<vw::ip::InterestPoint> & ip2_out);\n\n// Heuristics for match file prefix\nstd::string matchMultiPrefix(std::string const& clean_match_files_prefix,\n                             std::string const& match_files_prefix,\n                             std::string const& out_prefix);\n  \n// Heuristics for where to load the match file from\nstd::string matchFileMultiPrefix(std::string const& clean_match_files_prefix,\n                                 std::string const& match_files_prefix,\n                                 std::string const& out_prefix,\n                                 std::string const& image1_path,\n                                 std::string const& image2_path,\n                                 bool matches_as_txt);\n\n/// The unwarped disparity file name.\nstd::string unwarped_disp_file(std::string const& prefix, std::string const& left_image,\n                               std::string const& right_image, bool matches_as_txt);\n\n// Find and sort the convergence angles for given cameras and interest points\nvoid convergence_angles(vw::camera::CameraModel const * left_cam,\n                        vw::camera::CameraModel const * right_cam,\n                        std::vector<vw::ip::InterestPoint> const& left_ip,\n                        std::vector<vw::ip::InterestPoint> const& right_ip,\n                        std::vector<double> & sorted_angles);\n\n// Find all match files stored on disk having this prefix\nvoid listExistingMatchFiles(std::string const& prefix,\n                            bool matches_as_txt,\n                            std::set<std::string> & existing_files);\n\n// Given a pair of indices, return all the matches between them.\nvoid matchesForPair(vw::ba::ControlNetwork const& cnet,\n                    int left_cid, int right_cid,\n                    std::vector<vw::ip::InterestPoint> & left_ip,\n                    std::vector<vw::ip::InterestPoint> & right_ip);\n\n// Find interest point matches by loading them from files for a given set of images.\nvoid findMatchFiles(// Inputs\n                    int overlap_limit,\n                    bool match_first_to_last,\n                    std::vector<std::string> const& image_files,\n                    std::string const& clean_match_files_prefix,\n                    std::string const& match_files_prefix,\n                    std::string const& out_prefix,\n                    bool matches_as_txt,\n                    // Outputs\n                    std::map<std::pair<int, int>, std::string> & match_files);\n  \n// Make a list of all of the image pairs to find matches for\nvoid determineImagePairs(// Inputs\n                         int overlap_limit,\n                         bool match_first_to_last,\n                         bool external_matches,\n                         std::vector<std::string> const& image_files,\n                         // if having optional preexisting camera positions\n                         bool got_est_cam_positions,\n                         // Optional filter distance, set to -1 if not used\n                         double position_filter_dist,\n                         // Estimated camera positions, set to empty if missing\n                         std::vector<vw::Vector3> const& estimated_camera_gcc,\n                         // Optional preexisting list\n                         bool have_overlap_list,\n                         std::set<std::pair<std::string, std::string>> const& overlap_list,\n                         // Output\n                         std::vector<std::pair<int,int>> & all_pairs);\n\n} // End namespace asp\n\n#endif//__ASP_CORE_IP_MATCHING_ALGS_H__\n"
  },
  {
    "path": "src/asp/Core/LocalAlignment.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2024, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n/// \\file LocalAlignment.cc\n///\n\n#include <asp/Core/LocalAlignment.h>\n#include <asp/Core/ImageNormalization.h>\n#include <asp/Core/ImageUtils.h>\n#include <asp/Core/AffineEpipolar.h>\n#include <asp/Core/InterestPointMatching.h>\n#include <asp/Core/IpMatchingAlgs.h>\n#include <asp/Core/OpenCVUtils.h>\n#include <asp/Core/DisparityProcessing.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/ImageNormalization.h>\n#include <asp/Core/AlignmentUtils.h>\n#include <asp/Core/FileUtils.h>\n\n#include <vw/Math/Transform.h>\n#include <vw/Image/Transform.h>\n#include <vw/Image/PixelMask.h>\n#include <vw/Image/Interpolation.h>\n#include <vw/Image/Algorithms.h>\n#include <vw/InterestPoint/InterestPointUtils.h>\n#include <vw/InterestPoint/MatcherIO.h>\n#include <vw/FileIO/MatrixIO.h>\n#include <vw/Cartography/GeoReferenceUtils.h>\n#include <vw/FileIO/DiskImageUtils.h>\n\n#include <opencv2/calib3d/calib3d.hpp>\n#include <opencv2/imgcodecs.hpp>\n\n#include <boost/filesystem.hpp>\n#include <boost/dll.hpp>\n#include <boost/algorithm/string.hpp>\n#include <limits>\n#include <cctype>\n\nusing namespace vw;\nnamespace fs = boost::filesystem;\n\nnamespace asp {\n\n  // Grow a box to a square size.\n  vw::BBox2i grow_box_to_square(vw::BBox2i const& box, int max_size) {\n    int width = box.width();\n    int height = box.height();\n\n    int diffx = std::max(max_size - width, 0);\n    int diffy = std::max(max_size - height, 0);\n\n    BBox2i out_box = box;\n    out_box.min() -= Vector2(diffx/2, diffy/2);\n    out_box.max() += Vector2((diffx + 1)/2, (diffy + 1)/2); // +1 to handle the case of odd dims\n\n    return out_box;\n  }\n\n  // Grow bbox to square while not exceeding given box\n  vw::BBox2i grow_box_to_square_with_constraint(vw::BBox2i const& box, int max_size,\n                                                vw::BBox2i const& max_box) {\n\n    BBox2i out_box = box;\n    for (int attempt = 0; attempt < 10; attempt++) {\n      int width  = box.width();\n      int height = box.height();\n      BBox2i prev_box = out_box;\n      out_box = grow_box_to_square(out_box, max_size);\n\n      // Ensure we do not exceed the image bounds\n      out_box.crop(max_box);\n\n      // TODO(oalexan1): Here need find the bounding box of the valid\n      // data and if necessary grow box to make the bounding box of\n      // the valid data be as wide and tall as a full tile. As it is,\n      // the box could be big but a good chunk of it could be covering\n      // an area with no data.\n\n      // Stop when the box stops growing\n      if (out_box == prev_box)\n        break;\n    }\n\n    return out_box;\n  }\n\n  // Estimate the region in the right image corresponding\n  // to left_trans_crop_win based on ip in the current box and\n  // also by creating ip from D_sub. If cannot find enough such ip,\n  // expand the box a little. Don't try too hard though, as then we\n  // end up with too many outliers which can't be filtered easily.\n  void estimate_right_trans_crop_win(ASPGlobalOptions        const & opt,\n                                     std::string             const & left_unaligned_file,\n                                     std::string             const & right_unaligned_file,\n                                     vw::HomographyTransform const & left_global_trans,\n                                     vw::HomographyTransform const & right_global_trans,\n                                     ImageViewRef<PixelGray<float>>  right_globally_aligned_image,\n                                     int                             max_tile_size,\n                                     double                          right_extra_factor,\n                                     BBox2i                  const & left_trans_crop_win,\n                                     BBox2i                        & right_trans_crop_win) {\n\n    bool matches_as_txt = stereo_settings().matches_as_txt;\n\n    vw_out() << \"\\t--> Reading unaligned interest points.\\n\";\n    std::vector<vw::ip::InterestPoint> left_unaligned_ip, right_unaligned_ip;\n    std::string match_filename = vw::ip::match_filename(opt.out_prefix,\n                                                        left_unaligned_file,\n                                                        right_unaligned_file,\n                                                        matches_as_txt);\n    if (!fs::exists(match_filename))\n      vw_throw(ArgumentErr() << \"Missing IP file: \" << match_filename);\n\n    vw_out() << \"\\t    * Loading match file: \" << match_filename << \"\\n\";\n    vw::ip::read_match_file(match_filename, left_unaligned_ip, right_unaligned_ip, \n                            matches_as_txt);\n\n    right_trans_crop_win = BBox2i(); // wipe the output\n    size_t min_num_ip = 20;\n    BBox2i ip_crop_win = left_trans_crop_win;\n    int win_size = std::max(left_trans_crop_win.width(), left_trans_crop_win.height());\n\n    for (int pass = 0; pass < 2; pass++) {\n\n      std::vector<vw::ip::InterestPoint> left_trans_ip, right_trans_ip;\n\n      // Read the ip from D_sub and scale them\n      //vw_out() << \"Creating IP from D_sub.\\n\";\n      std::vector<vw::ip::InterestPoint> left_ip_from_dsub, right_ip_from_dsub;\n      if (stereo_settings().seed_mode > 0) {\n        vw::ImageView<vw::PixelMask<vw::Vector2f>> sub_disp;\n        vw::Vector2 upsample_scale;\n        std::string d_sub_file = opt.out_prefix + \"-D_sub.tif\";\n        asp::load_D_sub_and_scale(opt.out_prefix, d_sub_file, sub_disp, upsample_scale);\n        asp::aligned_ip_from_D_sub(sub_disp, upsample_scale,\n                                   left_ip_from_dsub, right_ip_from_dsub);\n      }\n\n      // Append the ip from D_sub which are in the box\n      int num_ip_from_d_sub = 0;\n      for (size_t i = 0; i < left_ip_from_dsub.size(); i++) {\n        Vector2 left_pt(left_ip_from_dsub[i].x, left_ip_from_dsub[i].y);\n        if (!ip_crop_win.contains(left_pt))\n          continue;\n\n        // Grow the right box\n        Vector2 right_pt(right_ip_from_dsub[i].x, right_ip_from_dsub[i].y);\n        right_trans_crop_win.grow(right_pt);\n\n        left_trans_ip.push_back(left_ip_from_dsub[i]);\n        right_trans_ip.push_back(right_ip_from_dsub[i]);\n        num_ip_from_d_sub++;\n      }\n\n      // Append the regular ip which are in the box\n      int num_global_ip_in_tile = 0;\n      for (size_t i = 0; i < left_unaligned_ip.size(); i++) {\n        Vector2 left_pt (left_unaligned_ip [i].x, left_unaligned_ip [i].y);\n        Vector2 right_pt(right_unaligned_ip[i].x, right_unaligned_ip[i].y);\n\n        left_pt  = left_global_trans.forward(left_pt);\n        right_pt = right_global_trans.forward(right_pt);\n\n        if (!ip_crop_win.contains(left_pt))\n          continue;\n\n        right_trans_crop_win.grow(right_pt);\n\n        // Apply the alignment transforms to these ip\n        left_trans_ip.push_back(left_unaligned_ip[i]);\n        right_trans_ip.push_back(right_unaligned_ip[i]);\n        left_trans_ip.back().x  = left_pt.x();\n        left_trans_ip.back().y  = left_pt.y();\n        right_trans_ip.back().x = right_pt.x();\n        right_trans_ip.back().y = right_pt.y();\n        num_global_ip_in_tile++;\n      }\n\n      // TODO(oalexan1): if the right box is way too big, so if there\n      // are outliers, it needs to be shrank by finding the median of\n      // of the ip and shrinking the box around it.\n\n      if (stereo_settings().local_alignment_debug) {\n        std::cout << \"Attempt: \" << pass << std::endl;\n        std::cout << \"Num ip from D_sub: \" << num_ip_from_d_sub << std::endl;\n        std::cout << \"Num global ip in tile: \" << num_global_ip_in_tile << std::endl;\n        std::cout << \"Left trans crop win \" << left_trans_crop_win << std::endl;\n        std::cout << \"Right trans crop win \" << right_trans_crop_win << std::endl;\n      }\n\n      // This is a bugfix, sometimes the right tile is under-estimated\n      // if there are not enough ip. Make the box bigger as sometimes\n      // it is not accurately determined based on input ip or\n      // disparity. After ip are found, filtered, and local alignment\n      // is applied, the aligned tiles will be shrunk (as I recall)\n      // before running correlation.\n      // TODO(oalexan1): Filter out outliers by median and bound before growing!\n      // TODO(oalexan1): Allow the right box to be bigger than left box,\n      // perhaps by a factor of 1.5.\n      right_trans_crop_win = grow_box_to_square_with_constraint\n        (right_trans_crop_win, right_extra_factor * max_tile_size,\n         vw::bounding_box(right_globally_aligned_image));\n\n      if (stereo_settings().local_alignment_debug) {\n        std::cout << \"Grown right trans crop win \" << right_trans_crop_win << std::endl;\n        std::string out_match_filename\n          = vw::ip::match_filename(opt.out_prefix + \"-tile\", \"L.tif\", \"R.tif\", matches_as_txt);\n        vw_out() << \"Writing match file: \" << out_match_filename << \"\\n\";\n        vw::ip::write_match_file(out_match_filename, left_trans_ip, right_trans_ip, \n                                 matches_as_txt);\n      }\n\n      if (left_trans_ip.size() >= min_num_ip)\n        break;\n\n      // After each pass, grow the box a bit\n      ip_crop_win.expand(win_size/5);\n    }\n\n    // Round up\n    right_trans_crop_win.expand(1);\n    right_trans_crop_win.crop(bounding_box(right_globally_aligned_image));\n  }\n\n  // Unalign the ip, filter them using the cameras, align them back,\n  // and return the inlier ip.\n  void filter_local_ip_using_cameras(ASPGlobalOptions             const & opt,\n                                     Vector2                      const & outlier_removal_params,\n                                     vw::HomographyTransform      const & left_global_trans,\n                                     vw::HomographyTransform      const & right_global_trans,\n                                     BBox2i                       const & left_trans_crop_win,\n                                     BBox2i                       const & right_trans_crop_win,\n                                     vw::camera::CameraModel      const * left_camera_model,\n                                     vw::camera::CameraModel      const * right_camera_model,\n                                     vw::cartography::Datum       const & datum,\n                                     // These get modified\n                                     std::vector<vw::ip::InterestPoint> & left_local_ip,\n                                     std::vector<vw::ip::InterestPoint> & right_local_ip,\n                                     std::vector<size_t>                & ip_inlier_indices) {\n\n    bool matches_as_txt = stereo_settings().matches_as_txt;\n\n    // Convert ip to original unaligned and uncropped coordinates\n    std::vector<vw::ip::InterestPoint> left_global_ip;\n    std::vector<vw::ip::InterestPoint> right_global_ip;\n\n    for (size_t it = 0; it < ip_inlier_indices.size(); it++) {\n      int i = ip_inlier_indices[it];\n\n      Vector2 left_pt (left_local_ip [i].x, left_local_ip [i].y);\n      Vector2 right_pt(right_local_ip[i].x, right_local_ip[i].y);\n\n      left_pt  = left_global_trans.reverse (left_pt  + left_trans_crop_win.min());\n      right_pt = right_global_trans.reverse(right_pt + right_trans_crop_win.min());\n\n      // First copy all the data from the input ip, then apply the transform\n      left_global_ip.push_back(left_local_ip[i]);\n      right_global_ip.push_back(right_local_ip[i]);\n      left_global_ip.back().x  = left_pt.x();\n      left_global_ip.back().y  = left_pt.y();\n      right_global_ip.back().x = right_pt.x();\n      right_global_ip.back().y = right_pt.y();\n    }\n\n    if (stereo_settings().local_alignment_debug) {\n      std::string unaligned_match_filename \n        = vw::ip::match_filename(opt.out_prefix + \"-cropped-noalign-ip\",\n                                 opt.in_file1, opt.in_file2, matches_as_txt);\n      vw_out() << \"Writing match file: \" << unaligned_match_filename << \"\\n\";\n      vw::ip::write_match_file(unaligned_match_filename, left_global_ip, right_global_ip,\n                               matches_as_txt);\n    }\n\n    filter_ip_using_cameras(left_global_ip, right_global_ip,\n                            left_camera_model, right_camera_model, datum,\n                            outlier_removal_params[0], outlier_removal_params[1]);\n\n    // Transform back to tile coordinates\n    left_local_ip.clear();\n    right_local_ip.clear();\n    ip_inlier_indices.clear();\n    for (size_t i = 0; i < left_global_ip.size(); i++) {\n\n      Vector2 left_pt (left_global_ip [i].x, left_global_ip [i].y);\n      Vector2 right_pt(right_global_ip[i].x, right_global_ip[i].y);\n\n      left_pt  = left_global_trans.forward(left_pt)   - left_trans_crop_win.min();\n      right_pt = right_global_trans.forward(right_pt) - right_trans_crop_win.min();\n\n      // First copy all the data from the input ip, then apply the transform\n      left_local_ip.push_back(left_global_ip[i]);\n      right_local_ip.push_back(right_global_ip[i]);\n      left_local_ip.back().x  = left_pt.x();\n      left_local_ip.back().y  = left_pt.y();\n      right_local_ip.back().x = right_pt.x();\n      right_local_ip.back().y = right_pt.y();\n\n      ip_inlier_indices.push_back(i);\n    } // end loop over ip\n  }\n\n  // Apply transforms to ip\n  void apply_transforms_to_ip(std::vector<vw::ip::InterestPoint> const & left_input_ip,\n                              std::vector<vw::ip::InterestPoint> const & right_input_ip,\n                              std::vector<size_t>                const & ip_inlier_indices,\n                              vw::Matrix<double>                 const & left_trans_mat,\n                              vw::Matrix<double>                 const & right_trans_mat,\n                              // Outputs\n                              std::vector<vw::ip::InterestPoint>       & left_trans_ip,\n                              std::vector<vw::ip::InterestPoint>       & right_trans_ip) {\n\n    // Wipe the outputs\n    left_trans_ip.reserve(ip_inlier_indices.size());\n    right_trans_ip.reserve(ip_inlier_indices.size());\n    left_trans_ip.clear();\n    right_trans_ip.clear();\n\n    vw::HomographyTransform left_trans (left_trans_mat);\n    vw::HomographyTransform right_trans(right_trans_mat);\n    for (size_t it = 0; it < ip_inlier_indices.size(); it++) {\n      int i = ip_inlier_indices[it];\n      Vector2 left_pt (left_input_ip [i].x, left_input_ip [i].y);\n      Vector2 right_pt(right_input_ip[i].x, right_input_ip[i].y);\n\n      left_pt  = left_trans.forward(left_pt);\n      right_pt = right_trans.forward(right_pt);\n\n      // First copy all the data from the input ip, then apply the transform\n      left_trans_ip.push_back(left_input_ip[i]);\n      right_trans_ip.push_back(right_input_ip[i]);\n      left_trans_ip.back().x  = left_pt.x();\n      left_trans_ip.back().y  = left_pt.y();\n      right_trans_ip.back().x = right_pt.x();\n      right_trans_ip.back().y = right_pt.y();\n    }\n\n  }\n\n  // Algorithm to perform local alignment. Approach:\n  //  - Given the global interest points and the left crop window, find\n  //    the right crop window.\n  //  - Crop the globally aligned images to these crop windows and find\n  //    the interest points for the crops\n  //  - Use the interest points to find the local alignment\n  //  - Apply the composition of the global and local alignment to the\n  //    original unaligned images to find the locally aligned images\n  //  - Save the locally aligned images to disk\n  //  - Estimate the search range for the locally aligned images\n  void local_alignment(// Inputs\n                       ASPGlobalOptions        const & opt,\n                       std::string             const & alg_name,\n                       std::string             const & session_name,\n                       int                             max_tile_size,\n                       double                          left_extra_factor,\n                       double                          right_extra_factor,\n                       vw::BBox2i              const & tile_crop_win,\n                       bool                            write_nodata,\n                       vw::camera::CameraModel const * left_camera_model,\n                       vw::camera::CameraModel const * right_camera_model,\n                       vw::cartography::Datum  const & datum,\n                       // Outputs\n                       vw::BBox2i                    & left_trans_crop_win,\n                       vw::BBox2i                    & right_trans_crop_win,\n                       vw::Matrix<double>            & left_local_mat,\n                       vw::Matrix<double>            & right_local_mat,\n                       std::string                   & left_aligned_file,\n                       std::string                   & right_aligned_file,\n                       int                           & min_disp,\n                       int                           & max_disp) {\n\n    bool matches_as_txt = stereo_settings().matches_as_txt;\n\n    // Read the unaligned images\n    std::string left_unaligned_file = opt.in_file1;\n    std::string right_unaligned_file = opt.in_file2;\n\n    // TODO(oalexan1): Not sure if parallel_stereo won't strip the\n    // crop win information.\n    bool crop_left  = (stereo_settings().left_image_crop_win  != BBox2i(0, 0, 0, 0));\n    bool crop_right = (stereo_settings().right_image_crop_win != BBox2i(0, 0, 0, 0));\n    if (crop_left)\n      left_unaligned_file = opt.out_prefix + \"-L-cropped.tif\";\n    if (crop_right)\n      right_unaligned_file = opt.out_prefix + \"-R-cropped.tif\";\n\n    // Read the globally aligned images and alignment transforms\n\n    std::string left_globally_aligned_file = opt.out_prefix + \"-L.tif\";\n    std::string right_globally_aligned_file = opt.out_prefix + \"-R.tif\";\n    boost::shared_ptr<DiskImageResource>\n      left_rsrc (vw::DiskImageResourcePtr(left_globally_aligned_file)),\n      right_rsrc(vw::DiskImageResourcePtr(right_globally_aligned_file));\n\n    float left_nodata_value  = std::numeric_limits<float>::quiet_NaN();\n    float right_nodata_value = std::numeric_limits<float>::quiet_NaN();\n    if (left_rsrc->has_nodata_read())\n      left_nodata_value  = left_rsrc->nodata_read();\n    if (right_rsrc->has_nodata_read())\n      right_nodata_value = right_rsrc->nodata_read();\n\n    // Note that we do not create masked images using nodata values.\n    DiskImageView<PixelGray<float>> left_globally_aligned_image(left_rsrc),\n      right_globally_aligned_image(right_rsrc);\n\n    // At image edges, the tile we work with can be a sliver which can\n    // cause issues. Grow it to a square tile, then crop it to the\n    // image bounding box (which may make it non-square again, so\n    // repeat this a few times during which the box grows\n    // bigger).\n    left_trans_crop_win = grow_box_to_square_with_constraint\n      (tile_crop_win, left_extra_factor * max_tile_size,\n       vw::bounding_box(left_globally_aligned_image));\n\n    if (stereo_settings().local_alignment_debug)\n      std::cout << \"Grown left trans crop win \" << left_trans_crop_win << std::endl;\n\n    vw::Matrix<double> left_global_mat\n       = asp::alignmentMatrix(opt.out_prefix, asp::stereo_settings().alignment_method,\n                              \"left\");\n    vw::Matrix<double> right_global_mat\n       = asp::alignmentMatrix(opt.out_prefix, asp::stereo_settings().alignment_method,\n                              \"right\");\n    vw::HomographyTransform left_global_trans(left_global_mat);\n    vw::HomographyTransform right_global_trans(right_global_mat);\n\n    // Estimate the region in the right image corresponding\n    // to left_trans_crop_win based on ip in the current box and\n    // also by creating ip from D_sub.\n    estimate_right_trans_crop_win(opt, left_unaligned_file, right_unaligned_file,\n                                  left_global_trans, right_global_trans,\n                                  right_globally_aligned_image,\n                                  max_tile_size, right_extra_factor, left_trans_crop_win,\n                                  // Output\n                                  right_trans_crop_win);\n\n    // TODO(oalexan1): May want to increase here the number of ip per image,\n    // from the default of 5000 in InterestPointMatching.cc.\n    // But do not introduce hard-coded values.\n\n    // Redo ip matching in the current tile. It should be more accurate after alignment\n    // and cropping.\n    std::vector<vw::ip::InterestPoint> left_local_ip, right_local_ip;\n    size_t number_of_jobs = 1;\n    bool use_cached_ip = false;\n    detect_match_ip(left_local_ip, right_local_ip,\n                    vw::pixel_cast<float>(crop(left_globally_aligned_image,\n                                               left_trans_crop_win)),\n                    vw::pixel_cast<float>(crop(right_globally_aligned_image,\n                                               right_trans_crop_win)),\n                    stereo_settings().ip_per_tile, number_of_jobs,\n                    \"\", \"\", use_cached_ip, // no saving or caching of ip\n                    left_nodata_value, right_nodata_value,\n                    \"\"); // do not save any match file to disk\n\n    if (stereo_settings().local_alignment_debug) {\n      // These clips have global but not local alignment\n      vw::cartography::GeoReference georef;\n      bool has_georef = false, has_nodata = true;\n      float nan_nodata = std::numeric_limits<float>::quiet_NaN();\n\n      std::string left_crop = opt.out_prefix + \"-\" + \"left-crop.tif\";\n      vw_out() << \"\\t--> Writing: \" << left_crop << \"\\n\";\n      block_write_gdal_image(left_crop, crop(left_globally_aligned_image,\n                                             left_trans_crop_win),\n                             has_georef, georef,\n                             has_nodata, left_nodata_value, opt,\n                             TerminalProgressCallback(\"asp\",\"\\t  Left:  \"));\n\n      std::string right_crop = opt.out_prefix + \"-\" + \"right-crop.tif\";\n      vw_out() << \"\\t--> Writing: \" << right_crop << \"\\n\";\n      block_write_gdal_image(right_crop, crop(right_globally_aligned_image,\n                                             right_trans_crop_win),\n                             has_georef, georef,\n                             has_nodata, right_nodata_value, opt,\n                             TerminalProgressCallback(\"asp\",\"\\t  Right:  \"));\n\n      std::string local_match_filename \n        = vw::ip::match_filename(opt.out_prefix, left_crop, right_crop, matches_as_txt);\n      vw_out() << \"Writing match file: \" << local_match_filename << \"\\n\";\n      vw::ip::write_match_file(local_match_filename, left_local_ip, right_local_ip,\n                               matches_as_txt);\n    }\n\n    // The matrices which take care of the crop to the current tile\n    Matrix<double> left_crop_mat  = math::identity_matrix<3>();\n    Matrix<double> right_crop_mat = math::identity_matrix<3>();\n\n    left_crop_mat (0, 2) = -left_trans_crop_win.min().x();\n    left_crop_mat (1, 2) = -left_trans_crop_win.min().y();\n    right_crop_mat(0, 2) = -right_trans_crop_win.min().x();\n    right_crop_mat(1, 2) = -right_trans_crop_win.min().y();\n\n    // Find the local alignment\n    // TODO(oalexan1): May want to do do an initial affine epipolar alignment\n    // based on d_sub and preexisting match points, with a bigger outlier factor,\n    // then do an initial rectification, then redo it as below.\n    std::vector<size_t> ip_inlier_indices;\n    bool crop_to_shared_area = false;\n    Vector2i local_trans_aligned_size =\n      affine_epipolar_rectification(left_trans_crop_win.size(), right_trans_crop_win.size(),\n                                    stereo_settings().local_alignment_threshold,\n                                    stereo_settings().alignment_num_ransac_iterations,\n                                    left_local_ip, right_local_ip,\n                                    crop_to_shared_area,\n                                    left_local_mat, right_local_mat, &ip_inlier_indices);\n\n    // Combination of global alignment, crop to current tile, and local alignment\n    Matrix<double> combined_left_mat  = left_local_mat * left_crop_mat * left_global_mat;\n    Matrix<double> combined_right_mat = right_local_mat * right_crop_mat * right_global_mat;\n\n    // Apply the combined transforms to the original unscaled and\n    // unaligned images, then scale them too.\n    float left_unaligned_nodata_value = -32768.0;\n    float right_unaligned_nodata_value = -32768.0;\n    {\n      // Retrieve nodata values and let the handles go out of scope\n      // right away.  For this to work, the ISIS type must be\n      // registered with the DiskImageResource class. This happens in\n      // \"stereo.cc\", so these calls will create DiskImageResourceIsis\n      // objects.\n      boost::shared_ptr<DiskImageResource>\n        left_unaligned_rsrc (DiskImageResourcePtr(left_unaligned_file)),\n        right_unaligned_rsrc(DiskImageResourcePtr(right_unaligned_file));\n      asp::get_nodata_values(left_unaligned_rsrc, right_unaligned_rsrc,\n                             asp::stereo_settings().nodata_value,\n                             left_unaligned_nodata_value, right_unaligned_nodata_value);\n    }\n\n    // Input images\n    ImageViewRef<float> left_unaligned_image = DiskImageView<float>(left_unaligned_file);\n    ImageViewRef<float> right_unaligned_image = DiskImageView<float>(right_unaligned_file);\n\n    // Set up image masks. If the user provided a custom no-data value, values\n    // no more than that are masked.\n    float user_nodata = asp::stereo_settings().nodata_value;\n    ImageViewRef<PixelMask<float>> left_masked_image, right_masked_image;\n    if (!std::isnan(user_nodata)) {\n      left_masked_image\n        = create_mask_less_or_equal(left_unaligned_image, user_nodata);\n      right_masked_image\n        = create_mask_less_or_equal(right_unaligned_image, user_nodata);\n    } else {\n      left_masked_image\n        = create_mask(left_unaligned_image, left_unaligned_nodata_value);\n      right_masked_image\n        = create_mask(right_unaligned_image, right_unaligned_nodata_value);\n    }\n\n    // By now the stats should be cached, but need to respect the API\n    Vector6f left_stats  = gather_stats(left_masked_image,\n                                        opt.out_prefix, left_unaligned_file,\n                                        asp::stereo_settings().force_reuse_match_files);\n    Vector6f right_stats = gather_stats(right_masked_image,\n                                        opt.out_prefix, right_unaligned_file,\n                                        asp::stereo_settings().force_reuse_match_files);\n\n    PixelMask<float> nodata_mask = PixelMask<float>(); // invalid value for a PixelMask\n\n    // Apply the combined transform to original left and right images,\n    // rather than to already transformed images. This way we avoid\n    // double interpolation.\n    ImageViewRef<PixelMask<float>> left_aligned_image\n      = vw::transform(left_masked_image,\n                  HomographyTransform(combined_left_mat),\n                  local_trans_aligned_size.x(), local_trans_aligned_size.y(),\n                  ValueEdgeExtension<PixelMask<float>>(nodata_mask),\n                  BilinearInterpolation());\n\n    ImageViewRef<PixelMask<float>> right_aligned_image\n      = vw::transform(right_masked_image,\n                  HomographyTransform(combined_right_mat),\n                  local_trans_aligned_size.x(), local_trans_aligned_size.y(),\n                  ValueEdgeExtension<PixelMask<float>>(nodata_mask),\n                  BilinearInterpolation());\n\n    // This is a bugfix. Things can go out-of-whack when there are clouds.\n    // Note that the determinant being 0.15 means that the scale ratio\n    // among the two images is sqrt(0.15) = 0.38.\n    double det_left = vw::math::det(combined_left_mat);\n    double det_right = vw::math::det(combined_right_mat);\n    if (det_left < 0.15 || det_right < 0.15)\n      vw_throw(vw::ArgumentErr() << \"Expecting the determinants of local alignment \"\n               << \"transforms to not be too different from 1. Got the values: \"\n               << det_left << \", \" << det_right << \".\\n\");\n    if (det_left < 0.25 || det_right < 0.25)\n      vw_out() << \"Warning: the determinants of the local alignment transforms \"\n               << \"are too different from 1. Got the  \"\n               << det_left << ' ' << det_right << \".\\n\";\n\n    // Normalize the locally aligned images\n    bool use_percentile_stretch = false;\n    bool do_not_exceed_min_max = (session_name == \"isis\" ||\n                                  session_name == \"isismapisis\");\n    asp::normalize_images(stereo_settings().force_use_entire_range,\n                          stereo_settings().individually_normalize,\n                          use_percentile_stretch,\n                          do_not_exceed_min_max,\n                          left_stats, right_stats,\n                          left_aligned_image, right_aligned_image);\n\n    // The S2P MGM algorithm needs NaN data\n    float nan_nodata = std::numeric_limits<float>::quiet_NaN();\n\n    // Fully form the image clips in memory. Otherwise, if something\n    // goes wrong, there's an abort in block_write_gdal_image\n    // somewhere, instead of exceptions being propagated\n    // gracefully. It could not be found in reasonable time where the\n    // abort was happening.\n\n    ImageView<float> left_trans_clip\n      = apply_mask(left_aligned_image, nan_nodata);\n    ImageView<float> right_trans_clip\n      = apply_mask(crop\n                   (edge_extend(right_aligned_image,\n                                ValueEdgeExtension<PixelMask<float>>(nodata_mask)),\n                    bounding_box(left_aligned_image)), // note the left bounding box\n                   nan_nodata);\n\n    if (alg_name == \"msmw\" || alg_name == \"msmw2\") {\n      // msmw does not like nan\n      left_trans_clip = apply_mask(create_mask(left_trans_clip, 0), 0);\n      right_trans_clip = apply_mask(create_mask(right_trans_clip, 0), 0);\n    }\n\n    // Write the locally aligned images to disk\n    vw::cartography::GeoReference georef;\n    bool has_georef = false, has_aligned_nodata = write_nodata;\n    std::string left_tile = \"left-aligned-tile.tif\";\n    std::string right_tile = \"right-aligned-tile.tif\";\n    left_aligned_file = opt.out_prefix + \"-\" + left_tile;\n    vw_out() << \"\\t--> Writing: \" << left_aligned_file << \"\\n\";\n    block_write_gdal_image(left_aligned_file, left_trans_clip,\n                           has_georef, georef,\n                           has_aligned_nodata, nan_nodata, opt,\n                           TerminalProgressCallback(\"asp\",\"\\t  Left:  \"));\n    right_aligned_file = opt.out_prefix + \"-\" + right_tile;\n    vw_out() << \"\\t--> Writing: \" << right_aligned_file << \"\\n\";\n    block_write_gdal_image(right_aligned_file,\n                           right_trans_clip,\n                           has_georef, georef,\n                           has_aligned_nodata, nan_nodata, opt,\n                           TerminalProgressCallback(\"asp\",\"\\t  Right:  \"));\n\n    Vector2 outlier_removal_params = stereo_settings().outlier_removal_params;\n\n    // Filter outliers using cameras among the ip in the tile which have the global alignment\n    // applied to them.\n    if (outlier_removal_params[0] < 100.0)\n      filter_local_ip_using_cameras(opt, outlier_removal_params,\n                                    left_global_trans, right_global_trans,\n                                    left_trans_crop_win, right_trans_crop_win,\n                                    left_camera_model, right_camera_model, datum,\n                                    // These get modified\n                                    left_local_ip, right_local_ip, ip_inlier_indices);\n\n    // Apply the local alignment transform to ip in the tile\n    std::vector<vw::ip::InterestPoint> left_trans_local_ip;\n    std::vector<vw::ip::InterestPoint> right_trans_local_ip;\n    apply_transforms_to_ip(left_local_ip, right_local_ip, ip_inlier_indices,\n                           left_local_mat, right_local_mat,\n                           // Outputs\n                           left_trans_local_ip, right_trans_local_ip);\n\n    // Filter outliers among locally aligned ip, this can reduce the search range\n    bool quiet = false;\n    if (outlier_removal_params[0] < 100.0)\n      asp::filter_ip_by_disparity(outlier_removal_params[0], outlier_removal_params[1], quiet,\n                                  left_trans_local_ip, right_trans_local_ip);\n\n    //  Find the disparity search range\n    BBox2 disp_range;\n    for (size_t it = 0; it < left_trans_local_ip.size(); it++) {\n      Vector2 left_pt (left_trans_local_ip [it].x, left_trans_local_ip [it].y);\n      Vector2 right_pt(right_trans_local_ip[it].x, right_trans_local_ip[it].y);\n      disp_range.grow(right_pt - left_pt);\n    }\n\n    if (stereo_settings().local_alignment_debug) {\n      std::string local_aligned_match_filename\n        = vw::ip::match_filename(opt.out_prefix, left_tile, right_tile, matches_as_txt);\n      vw_out() << \"Writing match file: \" << local_aligned_match_filename << \"\\n\";\n      vw::ip::write_match_file(local_aligned_match_filename, left_trans_local_ip,\n                               right_trans_local_ip, matches_as_txt);\n    }\n\n    // Expand the disparity search range a bit\n    double disp_width = disp_range.width();\n    double disp_extra = disp_width * stereo_settings().disparity_range_expansion_percent / 100.0;\n\n    min_disp = floor(disp_range.min().x() - disp_extra/2.0);\n    max_disp = ceil(disp_range.max().x()  + disp_extra/2.0);\n\n    // TODO(oalexan1): Make this into a function.\n    if (stereo_settings().max_disp_spread > 0) {\n\n      vw_out() << \"Min and max disparities before invoking the --max-disp-spread option: \"\n               << min_disp << ' ' << max_disp << \".\\n\";\n\n      std::vector<double> diff;\n      for (size_t it = 0; it < left_trans_local_ip.size(); it++)\n        diff.push_back(right_trans_local_ip[it].x - left_trans_local_ip[it].x);\n\n      if (diff.empty())\n        vw_throw(ArgumentErr() << \"No interest points left.\");\n\n      std::sort(diff.begin(), diff.end());\n      double mid_x = diff[diff.size()/2]; // median\n\n      double len = stereo_settings().max_disp_spread;\n      double half = len / 2.0;\n      min_disp = std::max(min_disp, (int)floor(mid_x - half));\n      max_disp = std::min(max_disp, (int)ceil (mid_x + half));\n\n      // The resulting range of disparities will be printed later.\n    }\n\n    // TODO(oalexan1): If just small slivers of valid data\n    // are left in the tiles without the padding, this tile better\n    // be skipped.\n    return;\n  }\n\n#if 0\n  // This is some experimental code which may still have some uses.\n\n  // Tweak the alignment transforms and their bounds.\n\n  BBox2i new_left_win, new_right_win;\n\n  for (size_t it = 0; it < ip_inlier_indices.size(); it++) {\n    int i = ip_inlier_indices[it];\n    Vector2 left_pt = Vector2(left_local_ip [i].x,  left_local_ip [i].y)\n      + left_trans_crop_win.min();\n    Vector2 right_pt = Vector2(right_local_ip [i].x, right_local_ip [i].y)\n      + right_trans_crop_win.min();\n    new_left_win.grow(left_pt);\n    new_right_win.grow(right_pt);\n  }\n\n  std::cout << \"old new left \" << left_trans_crop_win << ' ' << new_left_win << std::endl;\n  std::cout << \"old new right \" << right_trans_crop_win << ' ' << new_right_win << std::endl;\n\n  // Apply local alignment to inlier ip and estimate the search range\n  {\n    vw::HomographyTransform left_local_trans (left_local_mat);\n    vw::HomographyTransform right_local_trans(right_local_mat);\n    int i = 0;\n    Vector2 left_pt = Vector2(left_local_ip [i].x,  left_local_ip [i].y);\n    std::cout << \"mapped before left \" << left_local_trans.forward(left_pt) << std::endl;\n    Vector2 right_pt = Vector2(right_local_ip [i].x,  right_local_ip [i].y);\n    std::cout << \"mapped before right \" << right_local_trans.forward(right_pt) << std::endl;\n  }\n\n  // Adjust the transforms given the new windows\n  std::cout << \"left mat is \" << left_local_mat << std::endl;\n  Vector3 left_shift(new_left_win.min().x() - left_trans_crop_win.min().x(),\n                     new_left_win.min().y() - left_trans_crop_win.min().y(),\n                     0.0);\n  std::cout << \"left shift is \" << left_shift << std::endl;\n  left_shift = left_local_mat * left_shift;\n  std::cout << \"after left shift: \" << left_shift << std::endl;\n  left_local_mat(0, 2) += left_shift[0];\n  left_local_mat(1, 2) += left_shift[1];\n  std::cout << \"left mat after \" << left_local_mat << std::endl;\n\n  std::cout << \"right mat is \" << right_local_mat << std::endl;\n  Vector3 right_shift(new_right_win.min().x() - right_trans_crop_win.min().x(),\n                      new_right_win.min().y() - right_trans_crop_win.min().y(),\n                      0.0);\n  std::cout << \"right shift is \" << right_shift << std::endl;\n  right_shift = right_local_mat * right_shift;\n  std::cout << \"after right shift: \" << right_shift << std::endl;\n  right_local_mat(0, 2) += right_shift[0];\n  right_local_mat(1, 2) += right_shift[1];\n  std::cout << \"right mat after \" << right_local_mat << std::endl;\n\n  // Adjust the ip\n  for (size_t i = 0; i < left_local_ip.size(); i++) {\n    left_local_ip [i].x -= (new_left_win.min().x() - left_trans_crop_win.min().x());\n    left_local_ip [i].y -= (new_left_win.min().y() - left_trans_crop_win.min().y());\n  }\n  for (size_t i = 0; i < right_local_ip.size(); i++) {\n    right_local_ip [i].x -= (new_right_win.min().x() - right_trans_crop_win.min().x());\n    right_local_ip [i].y -= (new_right_win.min().y() - right_trans_crop_win.min().y());\n  }\n\n  // Update the crop wins\n  left_trans_crop_win = new_left_win;\n  right_trans_crop_win = new_right_win;\n\n  {\n    vw::HomographyTransform left_local_trans (left_local_mat);\n    vw::HomographyTransform right_local_trans(right_local_mat);\n    int i = 0;\n    Vector2 left_pt = Vector2(left_local_ip [i].x,  left_local_ip [i].y);\n    std::cout << \"mapped after left \" << left_local_trans.forward(left_pt) << std::endl;\n    Vector2 right_pt = Vector2(right_local_ip [i].x,  right_local_ip [i].y);\n    std::cout << \"mapped after right \" << right_local_trans.forward(right_pt) << std::endl;\n\n\n    // Find the trans box\n    BBox2i trans_box;\n\n    for (size_t it = 0; it < ip_inlier_indices.size(); it++) {\n      int i = ip_inlier_indices[it];\n\n      Vector2 left_pt (left_local_ip [i].x, left_local_ip [i].y);\n      Vector2 right_pt(right_local_ip[i].x, right_local_ip[i].y);\n\n      left_pt  = left_local_trans.forward(left_pt);\n      right_pt = right_local_trans.forward(right_pt);\n\n      trans_box.grow(left_pt);\n      trans_box.grow(right_pt);\n    }\n\n    // Make it just a tiny bit bigger, may improve behavior, perhaps.\n    // TODO(oalexan1): What if the ip do not cover fully the image tiles\n    // and hence we now leave valuable real estate out?\n    trans_box.expand(5);\n\n    std::cout << \"trans box is \" << trans_box << std::endl;\n\n    // adjust the trans box\n\n    left_local_mat (0, 2) -= trans_box.min().x();\n    left_local_mat (1, 2) -= trans_box.min().y();\n    right_local_mat(0, 2) -= trans_box.min().x();\n    right_local_mat(1, 2) -= trans_box.min().y();\n\n    std::cout << \"tran dims before \" << local_trans_aligned_size << std::endl;\n    local_trans_aligned_size = trans_box.size();\n    std::cout << \"tran dims after \" << local_trans_aligned_size << std::endl;\n  }\n#endif\n\n  // TODO(oalexan1): if left pix or right pix is invalid in the image,\n  // the disparity must be invalid! Test with OpenCV SGBM, libelas, and mgm!\n  // Also implement for unalign_2d_disparity.\n\n  // Do the same for unalign_2d_disparity.\n  // Go from 1D disparity of images with affine epipolar alignment to the 2D\n  // disparity by undoing the transforms that applied this alignment.\n  void unalign_1d_disparity(// Inputs\n                            vw::ImageViewRef<float> aligned_disp_1d,\n                            vw::BBox2i const& left_crop_win,\n                            vw::BBox2i const& right_crop_win,\n                            vw::math::Matrix<double> const& left_align_mat,\n                            vw::math::Matrix<double> const& right_align_mat,\n                            // Output\n                            vw::ImageView<vw::PixelMask<vw::Vector2f>> & unaligned_disp_2d) {\n\n    vw::HomographyTransform left_align_trans (left_align_mat);\n    vw::HomographyTransform right_align_trans(right_align_mat);\n\n    float nan_nodata = std::numeric_limits<float>::quiet_NaN(); // NaN value\n    PixelMask<float> nodata_mask = PixelMask<float>(); // invalid value for a PixelMask\n\n    ImageViewRef<PixelMask<float>> masked_aligned_disp_1d\n      = create_mask(aligned_disp_1d, nan_nodata);\n\n    // TODO(oalexan1): Here bilinear interpolation is used. This will\n    // make the holes a little bigger where there is no data. Need\n    // to figure out if it is desired to fill holes.\n    ImageViewRef<PixelMask<float>> interp_aligned_disp_1d\n      = interpolate(masked_aligned_disp_1d, BilinearInterpolation(),\n                    ValueEdgeExtension<PixelMask<float>>(nodata_mask));\n\n    unaligned_disp_2d.set_size(left_crop_win.width(), left_crop_win.height());\n\n    for (int col = 0; col < unaligned_disp_2d.cols(); col++) {\n      for (int row = 0; row < unaligned_disp_2d.rows(); row++) {\n        Vector2 left_pix(col, row);\n        Vector2 left_trans_pix = left_align_trans.forward(left_pix);\n        PixelMask<float> interp_disp\n          = interp_aligned_disp_1d(left_trans_pix.x(), left_trans_pix.y());\n\n        if (!is_valid(interp_disp)) {\n          unaligned_disp_2d(col, row) = PixelMask<Vector2f>();\n          unaligned_disp_2d(col, row).invalidate();\n          continue;\n        }\n\n        // Since the disparity is 1D, the y value (row) is the same\n        // as for the input.\n        Vector2 right_trans_pix(left_trans_pix.x() + interp_disp.child(), left_trans_pix.y());\n\n        // Undo the transform\n        Vector2 right_pix = right_align_trans.reverse(right_trans_pix);\n\n        // Un-transformed disparity\n        Vector2 disp_pix = right_pix - left_pix;\n\n        // Adjust for the fact that the two tiles before alignment\n        // were crops from larger images\n        disp_pix += (right_crop_win.min() - left_crop_win.min());\n\n        unaligned_disp_2d(col, row).child() = Vector2f(disp_pix.x(), disp_pix.y());\n        unaligned_disp_2d(col, row).validate();\n      }\n    }\n\n  }\n\n  // Go from 2D disparity of images with affine epipolar alignment to the 2D\n  // disparity by undoing the transforms that applied this alignment.\n  void unalign_2d_disparity(// Inputs\n                            vw::ImageView<vw::PixelMask<vw::Vector2f>> const& aligned_disp_2d,\n                            vw::BBox2i const& left_crop_win,\n                            vw::BBox2i const& right_crop_win,\n                            vw::math::Matrix<double> const& left_align_mat,\n                            vw::math::Matrix<double> const& right_align_mat,\n                            // Output\n                            vw::ImageView<vw::PixelMask<vw::Vector2f>> & unaligned_disp_2d) {\n\n    vw::HomographyTransform left_align_trans (left_align_mat);\n    vw::HomographyTransform right_align_trans(right_align_mat);\n\n    PixelMask<vw::Vector2f> nodata_pix;\n    nodata_pix.invalidate();\n\n    // TODO(oalexan1): Here bilinear interpolation is used. This will\n    // make the holes a little bigger where there is no data. Need\n    // to figure out if it is desired to fill holes.\n    ImageViewRef<vw::PixelMask<vw::Vector2f>> interp_aligned_disp_2d\n      = interpolate(aligned_disp_2d, BilinearInterpolation(),\n                    ValueEdgeExtension<PixelMask<vw::Vector2f>>(nodata_pix));\n\n    unaligned_disp_2d.set_size(left_crop_win.width(), left_crop_win.height());\n\n    for (int col = 0; col < unaligned_disp_2d.cols(); col++) {\n      for (int row = 0; row < unaligned_disp_2d.rows(); row++) {\n        Vector2 left_pix(col, row);\n        Vector2 left_trans_pix = left_align_trans.forward(left_pix);\n        PixelMask<vw::Vector2f> interp_disp\n          = interp_aligned_disp_2d(left_trans_pix.x(), left_trans_pix.y());\n\n        if (!is_valid(interp_disp)) {\n          unaligned_disp_2d(col, row) = PixelMask<Vector2f>();\n          unaligned_disp_2d(col, row).invalidate();\n          continue;\n        }\n\n        // Do the math with doubles rather than with floats, so cast\n        // Vector2f to Vector2.\n        Vector2 right_trans_pix = left_trans_pix + Vector2(interp_disp.child());\n\n        // Undo the transform\n        Vector2 right_pix = right_align_trans.reverse(right_trans_pix);\n\n        // Un-transformed disparity\n        Vector2 disp_pix = right_pix - left_pix;\n\n        // Adjust for the fact that the two tiles before alignment\n        // were crops from larger images\n        disp_pix += (right_crop_win.min() - left_crop_win.min());\n\n        unaligned_disp_2d(col, row).child() = Vector2f(disp_pix.x(), disp_pix.y());\n        unaligned_disp_2d(col, row).validate();\n      }\n    }\n\n  }\n\n  // Given an image in one-to-one correspondence with an aligned left image,\n  // find its corresponding version for the unaligned left image.\n  // disparity by undoing the transforms that applied this alignment.\n  void unalign_masked_image(// Inputs\n                            vw::ImageView<vw::PixelMask<float>> const& aligned_image,\n                            vw::BBox2i const& left_crop_win,\n                            vw::math::Matrix<double> const& left_align_mat,\n                            // Output\n                            vw::ImageView<vw::PixelMask<float>> & unaligned_image) {\n\n    vw::HomographyTransform left_align_trans(left_align_mat);\n\n    PixelMask<float> nodata_pix;\n    nodata_pix.invalidate();\n\n    // TODO(oalexan1): Here bilinear interpolation is used. This will\n    // make the holes a little bigger where there is no data. Need\n    // to figure out if it is desired to fill holes.\n    ImageViewRef<vw::PixelMask<float>> interp_aligned_image\n      = interpolate(aligned_image, BilinearInterpolation(),\n                    ValueEdgeExtension<PixelMask<float>>(nodata_pix));\n\n    unaligned_image.set_size(left_crop_win.width(), left_crop_win.height());\n    for (int col = 0; col < unaligned_image.cols(); col++) {\n      for (int row = 0; row < unaligned_image.rows(); row++) {\n        Vector2 left_pix(col, row);\n        Vector2 left_trans_pix = left_align_trans.forward(left_pix);\n        PixelMask<float> interp_val\n          = interp_aligned_image(left_trans_pix.x(), left_trans_pix.y());\n\n        unaligned_image(col, row) = interp_val;\n      }\n    }\n  }\n\n  // Read the list of external stereo programs (plugins) and extract\n  // the path to each such plugin and its library dependencies.\n  void parse_plugins_list(std::map<std::string, std::string> & plugins,\n                          std::map<std::string, std::string> & plugin_libs) {\n\n    // Wipe the outputs\n    plugins.clear();\n    plugin_libs.clear();\n\n    // The plugins are stored in ISISROOT as they are installed with conda.\n    // Needed env variables, including ISISROOT, are set in stereo_corr.\n\n    // But note that the plugin list is in the ASP install dir, and\n    // not in ISISROOT. This only makes a difference in dev mode.\n\n    char * isis_root = getenv(\"ISISROOT\");\n    if (isis_root == NULL)\n      vw_throw(vw::ArgumentErr() << \"The variable ISISROOT was not set.\\n\");\n\n    // Get the path to the plugins from the path of the ASP stereo_corr\n    // executable asking for it.\n    std::string base_path\n      = boost::dll::program_location().parent_path().parent_path().string();\n    std::string plugin_list = base_path + \"/plugins/stereo\" + \"/plugin_list.txt\";\n\n    std::ifstream handle;\n    handle.open(plugin_list.c_str());\n    if (handle.fail())\n      vw_throw(vw::IOErr() << \"Unable to open file \\\"\" << plugin_list << \"\\\"\");\n    vw::vw_out() << \"Reading plugin list: \" << plugin_list << \"\\n\";\n    \n    std::string line;\n    while (getline(handle, line, '\\n')) {\n\n      if (line.size() == 0 || line[0] == '#')\n        continue; // skip comment and empty line\n\n      std::string plugin_name, plugin_path, plugin_lib;\n      std::istringstream is(line);\n\n      // Extract the plugin name and path\n      if (!(is >> plugin_name >> plugin_path))\n        continue;\n\n      // Make the plugin name lower-case, but not the rest of the values\n      boost::to_lower(plugin_name);\n      \n      // Make plugin_path absolute, if need be\n      if (plugin_path.size() > 0 && plugin_path[0] != '/')\n        plugin_path = std::string(isis_root) + \"/\" + plugin_path;\n\n      // Read the user-set library path\n      is >> plugin_lib;\n      if (plugin_lib != \"\")\n        plugin_lib += \":\";\n      \n      // Append the isis lib path  \n      plugin_lib += std::string(isis_root) + \"/lib\";\n\n      // Split by colon in case there are multiple libraries\n      std::vector<std::string> plugin_libs_vec;\n      boost::split(plugin_libs_vec, plugin_lib, boost::is_any_of(\":\"));\n\n      // Make each relative path into an absolute path\n      for (size_t it = 0; it < plugin_libs_vec.size(); it++) {\n        if (plugin_libs_vec[it].size() > 0 && plugin_libs_vec[it][0] != '/')\n          plugin_libs_vec[it] = std::string(isis_root) + \"/\" + plugin_libs_vec[it];\n      }\n      \n      // Concatenate back\n      plugin_lib = boost::algorithm::join(plugin_libs_vec, \":\");\n             \n      plugins[plugin_name]     = plugin_path;\n      plugin_libs[plugin_name] = plugin_lib;\n    }\n\n    return;\n  }\n\n  // Given a string like \"mgm -O 8 -s vfit\", separate the name,\n  // which is the first word, from the options, which is the rest.\n  void parse_stereo_alg_name_and_opts(std::string const& stereo_alg,\n                                      std::string      & alg_name,\n                                      std::string      & alg_opts) {\n\n    std::istringstream iss(stereo_alg);\n    if (!(iss >> alg_name))\n      vw_throw(vw::ArgumentErr() << \"Cannot parse the stereo algorithm from string: \"\n               << stereo_alg << \".\\n\");\n\n    alg_opts = \"\";\n    std::string val;\n    while (iss >> val)\n      alg_opts += val + \" \";\n\n    // Make the algorithm name lower-case, but not the options\n    boost::to_lower(alg_name);\n  }\n\n  // Return true for an option name, which is a dash followed by a non-integer\n  bool is_option_name(std::string const& val) {\n    return (val.size() >= 2 && val[0] == '-' && (val[1] < '0' || val[1] > '9'));\n  }\n\n  // Return true if looking at a string having an equal sign\n  bool is_env_var_and_val(std::string const& val) {\n    for (size_t it = 0; it < val.size(); it++)\n      if (val[it] == '=')\n        return true;\n\n    return false;\n  }\n\n  // Remove spaces at the end\n  void rm_trailing_whitespace(std::string & val) {\n    while (val.size() > 0 && (val.back() == ' ' || val.back() == '\\t'))\n      val.pop_back();\n  }\n\n  // From A=b extract A as the name, and b as he value\n  void get_env_var_name_and_val(std::string const& in,\n                                std::string & name,\n                                std::string & val) {\n\n    name = \"\";\n    val = \"\";\n\n    bool found_equal = false;\n\n    for (size_t it = 0; it < in.size(); it++) {\n      if (in[it] == '=') {\n        found_equal = true;\n        continue;\n      }\n\n      if (!found_equal)\n        name += in[it];\n      else\n        val += in[it];\n    }\n\n    if (name == \"\" || val == \"\")\n      vw_throw(vw::ArgumentErr() << \"Could not extract name and value from string: \"\n               << in << \".\\n\");\n  }\n\n  // Put option-value pairs in a string. Respect the order given by pos_to_opt.\n  std::string concatenate_optons(std::map<std::string, std::string> const& opt_map,\n                                 std::map<int, std::string> const& pos_to_opt,\n                                 std::string const& sep) {\n\n    std::string out;\n    for (auto it = pos_to_opt.begin(); it != pos_to_opt.end(); it++) {\n\n      std::string const& opt = it->second; // alias\n\n      auto it2 = opt_map.find(opt);\n      if (it2 == opt_map.end())\n        continue;\n\n      out += it2->first + sep + it2->second + \" \";\n    }\n\n    rm_trailing_whitespace(out);\n    return out;\n  }\n\n  // Given an input string having algorithm options, like \"-v 4\", and\n  // environmental variables, like \"VAL=5\", possibly with repetitions,\n  // so VAL=5 and VAL=6 can both be present, separate the two kinds\n  // and remove the repetitions by keeping the values later in the\n  // string. Do not allow any input character except letters, numbers,\n  // space, period, underscore, plus, minus, and equal signs, for\n  // security purposes.\n  void extract_opts_and_env_vars(std::string const& input_str,\n                                 std::string & options,\n                                 std::map<std::string, std::string> & option_map,\n                                 std::string & env_vars,\n                                 std::map<std::string, std::string> & env_vars_map) {\n\n    options = \"\";\n    env_vars = \"\";\n    option_map.clear();\n    env_vars_map.clear();\n\n    // Input validation\n    for (size_t it = 0; it < input_str.size(); it++) {\n\n      if (std::isalnum(input_str[it]) || input_str[it] == ' ' || input_str[it] == '\\t' ||\n          input_str[it] == '_' || input_str[it] == '+' || input_str[it] == '-' ||\n          input_str[it] == '=' || input_str[it] == '.')\n        continue;\n\n      vw_throw(vw::ArgumentErr() << \"Only the alphanumeric and ' ', '_', '-', '+', '=', '.' \"\n               << \"characters are allowed as part of the stereo options. Got: \"\n               << input_str[it] << \".\\n\");\n    }\n\n    // Tokenize the inputs\n    std::vector<std::string> tokens;\n    std::istringstream iss(input_str);\n    std::string val;\n    while (iss >> val)\n      tokens.push_back(val);\n\n    // Ensure that the order is the same as in the input If\n    // an item shows up twice in the input, keep the position of the\n    // first occurrence.\n    std::map<std::string, int> opt_to_pos;\n    std::map<int, std::string> pos_to_opt;\n\n    for (size_t it = 0; it < tokens.size(); it++) {\n\n      std::string const& token = tokens[it];\n\n      if (is_env_var_and_val(token)) {\n\n        // Is an env variable, A=b, like for MGM\n        std::string name, val;\n        get_env_var_name_and_val(token, name, val);\n        env_vars_map[name] = val;\n\n        if (opt_to_pos.find(name) == opt_to_pos.end()) {\n          // First time it is encountered\n          opt_to_pos[name] = it;\n          pos_to_opt[it] = name;\n        }\n\n      } else {\n\n        // Must be an option, like -v 3.\n        if (!is_option_name(token))\n          vw_throw(vw::ArgumentErr() << \"Expecting an option, so something starting \"\n                   << \"with a dash. Got: \" << token << \".\\n\");\n\n        if (opt_to_pos.find(token) == opt_to_pos.end()) {\n          // First time it is encountered\n          opt_to_pos[token] = it;\n          pos_to_opt[it] = token;\n        }\n\n        // All the tokens that follow and which are not options or env\n        // vars must be values for this option\n        std::string val = \"\";\n        for (size_t it2 = it + 1; it2 < tokens.size(); it2++) {\n\n          if (is_option_name(tokens[it2]) || is_env_var_and_val(tokens[it2])) {\n\n            // This token is not a value, so have to stop this inner\n            // loop. Note how we modify the counter 'it' of the outer\n            // loop so we revisit tokens[it2] in that loop.\n            it = it2 - 1;\n            break;\n          }\n\n          // Concatenate all the values\n          val += tokens[it2] + \" \";\n\n          // Note how we modify the outer loop counter 'it'. It will\n          // be incremented further as soon as we go to the outer\n          // loop, so that loop will not examine tokens[it2] with which\n          // we just dealt. Without this line one runs into a bug if\n          // it2 is tokens.size() - 1 as the modification of 'it'\n          // further up does not kick in.\n          it = it2;\n        }\n\n        rm_trailing_whitespace(val);\n\n        if (!val.empty())\n          option_map[token] = val;\n        else\n          option_map[token] = \"1\"; // if an option has no value treat it as a boolean\n      }\n    }\n\n    // Now that the repeated options have been collapsed, put these back in strings\n    options  = concatenate_optons(option_map, pos_to_opt, \" \");\n    env_vars = concatenate_optons(env_vars_map, pos_to_opt, \"=\");\n  }\n\n  // Call the OpenCV BM or SGBM algorithm\n  void call_opencv_bm_or_sgbm(std::string const& left_file,\n                              std::string const& right_file,\n                              std::string const& mode, // bm or a flavor of sgbm\n                              int block_size,\n                              int min_disp,\n                              int max_disp,\n                              int prefilter_cap,\n                              int uniqueness_ratio,\n                              int speckle_size,\n                              int speckle_range,\n                              int disp12_diff,\n                              int texture_thresh,      // only for BM\n                              int P1,                  // only for SGBM\n                              int P2,                  // only for SGBM\n                              ASPGlobalOptions const& opt,\n                              std::string const& disparity_file,\n                              // Output\n                              vw::ImageView<float> & out_disp) {\n\n    DiskImageView<float> left(left_file);\n    DiskImageView<float> right(right_file);\n\n    cv::Mat left_cv, right_cv;\n    asp::formScaledByteCVImage(left, left_cv);\n    asp::formScaledByteCVImage(right, right_cv);\n\n    // Create the bm and sgbm objects. Their parameters will be overwritten later.\n    cv::Ptr<cv::StereoBM> bm = cv::StereoBM::create(16, 9);\n    cv::Ptr<cv::StereoSGBM> sgbm = cv::StereoSGBM::create(0, 16, 3);\n\n    if (block_size < 1 || block_size % 2 != 1)\n      vw_throw(ArgumentErr() << \"The block size must be positive and odd.\\n\");\n\n    int num_disp = (int) 16 * ceil((max_disp - min_disp) / 16.0);\n\n    // Set BM parameters\n    bm->setBlockSize(block_size);\n    bm->setMinDisparity(min_disp);\n    bm->setNumDisparities(num_disp);\n    bm->setTextureThreshold(texture_thresh);\n    bm->setPreFilterCap(prefilter_cap);\n    bm->setUniquenessRatio(uniqueness_ratio);\n    bm->setSpeckleWindowSize(speckle_size);\n    bm->setSpeckleRange(speckle_range);\n    bm->setDisp12MaxDiff(disp12_diff);\n\n    // Set SGBM parameters\n\n    int cn = 1; // Number of channels\n    sgbm->setBlockSize(block_size);\n    sgbm->setMinDisparity(min_disp);\n    sgbm->setNumDisparities(num_disp);\n    sgbm->setP1(P1*cn*block_size*block_size);\n    sgbm->setP2(P2*cn*block_size*block_size);\n    sgbm->setPreFilterCap(prefilter_cap);\n    sgbm->setUniquenessRatio(uniqueness_ratio);\n    sgbm->setSpeckleWindowSize(speckle_size);\n    sgbm->setSpeckleRange(speckle_range);\n    sgbm->setDisp12MaxDiff(disp12_diff);\n\n    vw_out() << \"Running OpenCV correlation with \"\n             << \"-mode \" << mode << \" \"\n             << \"-block_size \" << block_size << \" \"\n             << \"-P1 \" << P1 << \" \"\n             << \"-P2 \" << P2 << \" \"\n             << \"-prefilter_cap \" << prefilter_cap << \" \"\n             << \"-uniqueness_ratio \" << uniqueness_ratio << \" \"\n             << \"-speckle_size \" << speckle_size << \" \"\n             << \"-speckle_range \" << speckle_range << \" \"\n             << \"-disp12_diff \" << disp12_diff << \" \"\n             << \"--texture_thresh \" << texture_thresh << std::endl;\n\n    if (mode == \"bm\") {\n      // Nothing to do here\n    } else if (mode == \"hh\") {\n      sgbm->setMode(cv::StereoSGBM::MODE_HH);\n    } else if (mode == \"sgbm\") {\n      sgbm->setMode(cv::StereoSGBM::MODE_SGBM);\n    } else if (mode == \"3way\") {\n      sgbm->setMode(cv::StereoSGBM::MODE_SGBM_3WAY);\n    } else {\n      vw_throw(ArgumentErr() << \"Unknown OpenCV stereo mode: \" << mode << \".\\n\");\n    }\n\n    // Expand the image with padding, or else OpenCV crops the output\n    // disparity, oddly enough. Idea copied from S2P in sgbm.cpp.\n    // Copyright (c) 2012-2024, Gabriele Facciolo\n    // This program is free software: you can use, modify and/or redistribute it\n    // under the terms of the simplified BSD License. You should have received a\n    // copy of this license along this program. If not, see\n    // <http://www.opensource.org/licenses/bsd-license.html>.\n    float nan = std::numeric_limits<float>::quiet_NaN();\n    int pad1  = std::max(max_disp, 0), pad2 = std::max(-min_disp, 0);\n    cv::Mat left_cv_extra(left_cv.rows, left_cv.cols + pad1 + pad2, left_cv.type(),\n                          cv::Scalar(nan));\n    cv::Mat right_cv_extra(right_cv.rows, right_cv.cols + pad1 + pad2, right_cv.type(),\n                           cv::Scalar(nan));\n    asp::cvInsertBlock(left_cv, pad1, 0, left_cv_extra);\n    asp::cvInsertBlock(right_cv, pad1, 0, right_cv_extra);\n\n    cv::Mat disp, disp_extra;\n\n    // Do the correlation\n    if (mode == \"bm\") {\n      bm->compute(left_cv_extra, right_cv_extra, disp_extra);\n    } else if (mode == \"hh\" || mode == \"sgbm\" || mode == \"3way\") {\n      sgbm->compute(left_cv_extra, right_cv_extra, disp_extra);\n    }\n\n    // Crop the disparity to remove the padding\n    disp = disp_extra(cv::Range::all(), cv::Range(pad1, pad1 + left_cv.cols));\n\n    // Copy to ASP's format and handle no-data\n    vw::ImageView<float> asp_disp;\n    asp_disp.set_size(disp.cols, disp.rows);\n    for (int row = 0; row < disp.rows; row++) {\n      for (int col = 0; col < disp.cols; col++) {\n        if (disp.at<int16_t>(row, col) == -16*(-min_disp+1)) {\n          // Convert from the OpenCV no-data value to NaN\n          asp_disp(col, row) = nan;\n        } else {\n          // sgbm output disparity map is a 16-bit signed single-channel\n          // image of the same size as the input image. It contains\n          // disparity values scaled by 16. So, to get the floating-point\n          // disparity map, you need to divide each disp element by 16.\n          asp_disp(col, row) = -((float) disp.at<int16_t>(row, col)) / 16.0;\n        }\n\n        // Where the input image is nan, make the disparity nan too,\n        // removing some sgbm artifacts\n        if (std::isnan(left(col, row)))\n          asp_disp(col, row) = nan;\n      }\n    }\n\n    // Write the disparity to disk\n    vw::cartography::GeoReference georef;\n    bool   has_georef = false;\n    bool   has_nodata = true;\n    vw_out() << \"Writing: \" << disparity_file << \"\\n\";\n    vw::cartography::block_write_gdal_image(disparity_file, asp_disp,\n                                            has_georef, georef,\n                                            has_nodata, nan, opt,\n                                            TerminalProgressCallback\n                                            (\"asp\", \"\\t--> Disparity :\"));\n\n\n    // Assign the disparity to the output variable (this should not do a copy).\n    out_disp = asp_disp;\n  }\n\n} // namespace asp\n"
  },
  {
    "path": "src/asp/Core/LocalAlignment.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n/// \\file LocalAlignment.h\n///\n\n#ifndef __LOCAL_ALIGNMENT_H__\n#define __LOCAL_ALIGNMENT_H__\n\n#include <vw/Math/BBox.h>\n#include <vw/Math/Matrix.h>\n#include <vw/Image/ImageViewRef.h>\n\n#include <map>\n\n// Forward declarations\nnamespace vw {\n  namespace camera {\n    class CameraModel;\n  }\n  namespace cartography {\n    class Datum;\n  }\n}\n\nnamespace asp {\n\n  // Algorithm to perform local alignment. Approach:\n  //  - Given the global interest points and the left crop window, find\n  //    the right crop window.\n  //  - Crop the globally aligned images to these crop windows and find\n  //    the interest points for the crops\n  //  - Use the interest points to find the local alignment\n  //  - Apply the composition of the global and local alignment to the\n  //    original unaligned images to find the locally aligned images\n  //  - Save the locally aligned images to disk\n  //  - Estimate the search range for the locally aligned images\n\n  class ASPGlobalOptions; // forward declaration\n  \n  void local_alignment(// Inputs\n                       ASPGlobalOptions const & opt,\n                       std::string             const & alg_name,\n                       std::string      const & session_name,\n                       int                      max_tile_size,\n                       double                          left_extra_factor,\n                       double                          right_extra_factor,\n                       vw::BBox2i       const & tile_crop_win,\n                       bool                     write_nodata,\n                       vw::camera::CameraModel const * left_camera_model,\n                       vw::camera::CameraModel const * right_camera_model,\n                       vw::cartography::Datum  const & datum,\n                       // Outputs\n                       vw::BBox2i         & left_trans_crop_win,\n                       vw::BBox2i         & right_trans_crop_win,\n                       vw::Matrix<double> & left_local_mat,\n                       vw::Matrix<double> & right_local_mat,\n                       std::string        & left_aligned_file,\n                       std::string        & right_aligned_file,\n                       int                & min_disp,\n                       int                & max_disp); \n  \n  // Go from 1D disparity of images with affine epipolar alignment to the 2D\n  // disparity by undoing the transforms that applied this alignment.\n  void unalign_1d_disparity(// Inputs\n                            vw::ImageViewRef<float> aligned_disp_1d, \n                            vw::BBox2i const& left_crop_win, \n                            vw::BBox2i const& right_crop_win,\n                            vw::math::Matrix<double> const& left_align_mat,\n                            vw::math::Matrix<double> const& right_align_mat,\n                            // Output\n                            vw::ImageView<vw::PixelMask<vw::Vector2f>> & unaligned_disp_2d);\n  \n  // Go from 2D disparity of images with affine epipolar alignment to the 2D\n  // disparity by undoing the transforms that applied this alignment.\n  void unalign_2d_disparity(// Inputs\n                            vw::ImageView<vw::PixelMask<vw::Vector2f>> const& aligned_disp_2d,\n                            vw::BBox2i const& left_crop_win, \n                            vw::BBox2i const& right_crop_win,\n                            vw::math::Matrix<double> const& left_align_mat,\n                            vw::math::Matrix<double> const& right_align_mat,\n                            // Output\n                            vw::ImageView<vw::PixelMask<vw::Vector2f>> & unaligned_disp_2d);\n\n  // Given an image in one-to-one correspondence with an aligned left image,\n  // find its corresponding version for the unaligned left image.\n  // disparity by undoing the transforms that applied this alignment.\n  void unalign_masked_image(// Inputs\n                            vw::ImageView<vw::PixelMask<float>> const& aligned_image,\n                            vw::BBox2i const& left_crop_win, \n                            vw::math::Matrix<double> const& left_align_mat,\n                            // Output\n                            vw::ImageView<vw::PixelMask<float>> & unaligned_image);\n  \n  vw::BBox2i grow_box_to_square(vw::BBox2i const& box, int max_size);\n  \n  // Read the list of external stereo programs (plugins) and extract\n  // the path to each such plugin and its library dependencies.\n  void parse_plugins_list(std::map<std::string, std::string> & plugins,\n                          std::map<std::string, std::string> & plugin_libs);\n\n  // Given a string like \"mgm -O 8 -s vfit\", separate the name,\n  // which is the first word, from the options, which is the rest.\n  void parse_stereo_alg_name_and_opts(std::string const& stereo_alg,\n                                      std::string      & alg_name,\n                                      std::string      & alg_opts);\n\n  // Given an input string having algorithm options, like \"-v 4\", and\n  // environmental variables, like \"VAL=5\", possibly with repetitions,\n  // so VAL=5 and VAL=6 can both be present, separate the two kinds\n  // and remove the repetitions by keeping the values later in the\n  // string. Do not allow any input character except letters, numbers,\n  // space, period, underscore, plus, minus, and equal signs, for\n  // security purposes.\n  void extract_opts_and_env_vars(std::string const& input_str,\n                                 std::string & options,\n                                 std::map<std::string, std::string> & option_map,\n                                 std::string & env_vars,\n                                 std::map<std::string, std::string> & env_vars_map);\n\n  // Call the OpenCV BM or SGBM algorithm\n  void call_opencv_bm_or_sgbm(std::string const& left_file,\n                              std::string const& right_file,\n                              std::string const& mode, // bm or a flavor of sgbm \n                              int block_size,\n                              int min_disp,\n                              int max_disp,\n                              int prefilter_cap, \n                              int uniqueness_ratio, \n                              int speckle_size, \n                              int speckle_range, \n                              int disp12_diff, \n                              int texture_thresh,      // only for BM\n                              int P1,                  // only for SGBM\n                              int P2,                  // only for SGBM\n                              ASPGlobalOptions const& opt,\n                              std::string const& disparity_file,\n                              // Output\n                              vw::ImageView<float> & out_disp);\n  \n} // end namespace asp\n\n#endif // __LOCAL_ALIGNMENT_H__\n"
  },
  {
    "path": "src/asp/Core/Macros.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n/// \\file Macros.h\n///\n\n#ifndef __ASP_CORE_MACROS_H__\n#define __ASP_CORE_MACROS_H__\n\n#define ASP_STANDARD_CATCHES                                   \\\n  catch (const vw::ArgumentErr& e) {                           \\\n    vw::vw_out() << \"\\n\\nERROR: \" << e.what() << \"\\n\\n\";       \\\n    return 1;                                                  \\\n  } catch (const vw::Exception& e) {                           \\\n    std::cerr << \"\\n\\nERROR: \" << e.what() << \"\\n\\n\";          \\\n    return 1;                                                  \\\n  } catch (const std::bad_alloc& e) {                          \\\n    std::cerr << \"\\n\\nERROR: Ran out of memory!\\n\\n\";          \\\n    return 1;                                                  \\\n  } catch (const std::exception& e) {                          \\\n    std::cerr << \"\\n\\nERROR: \" << e.what() << \"\\n\\n\";          \\\n    return 1;                                                  \\\n  }\n\n#endif//__ASP_CORE_MACROS_H__\n"
  },
  {
    "path": "src/asp/Core/MatchList.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n#include <string>\n#include <vector>\n#include <vw/BundleAdjustment/CameraRelation.h>\n#include <vw/BundleAdjustment/ControlNetworkLoader.h>\n#include <vw/InterestPoint/MatcherIO.h>\n#include <asp/Core/MatchList.h>\n\nusing namespace vw;\n\nnamespace asp {\n\nvoid MatchList::throwIfNoPoint(size_t image, size_t point) const {\n  if ((image >= m_matches.size()) || (point >= m_matches[image].size()))\n    vw_throw(ArgumentErr() << \"IP \" << image << \", \" << point << \" does not exist!\\n\");\n}\n\nvoid MatchList::resize(size_t num_images) {\n  m_matches.resize(num_images);\n  m_valid_matches.resize(num_images);\n}\n\nbool MatchList::addPoint(size_t image, vw::ip::InterestPoint const &pt, bool valid) {\n\n  if (image >= m_matches.size())\n    return false;\n  \n  // We will start with an interest point in the left-most image,\n  // and add matches to it in the other images.\n  // At any time, an image to the left must have no fewer ip than\n  // images on the right. Upon saving, all images must\n  // have the same number of interest points.\n  size_t curr_pts = m_matches[image].size(); // # Pts from current image\n  bool is_good = true;\n  for (size_t i = 0; i < image; i++) { // Look through lower-id images\n    if (m_matches[i].size() < curr_pts+1) {\n      is_good = false;\n    }\n  }\n  // Check all higher-id images, they should have the same # Pts as this one.\n  for (size_t i = image+1; i < m_matches.size(); i++) {\n    if (m_matches[i].size() > curr_pts) {\n      is_good = false;\n    }\n  }\n\n  if (!is_good)\n    return false;\n\n  m_matches[image].push_back(pt);\n  m_valid_matches[image].push_back(true);\n  return true;\n}\n\nsize_t MatchList::getNumImages() const {\n  return m_matches.size();\n}\n\nsize_t MatchList::getNumPoints(size_t image) const {\n  if (m_matches.empty())\n    return 0;\n  return m_matches[image].size();\n}\n\nvw::ip::InterestPoint const& MatchList::getPoint(size_t image, size_t point) const {\n  throwIfNoPoint(image, point);\n  return m_matches[image][point];\n}\n\nvw::Vector2 MatchList::getPointCoord(size_t image, size_t point) const {\n  throwIfNoPoint(image, point);\n  return vw::Vector2(m_matches[image][point].x, m_matches[image][point].y);\n}\n\nbool MatchList::pointExists(size_t image, size_t point) const {\n  return ((image < m_matches.size()) && (point < m_matches[image].size()));\n}\n\nbool MatchList::isPointValid(size_t image, size_t point) const {\n  throwIfNoPoint(image, point);\n  return m_valid_matches[image][point];\n}\n\nvoid MatchList::setPointValid(size_t image, size_t point, bool newValue) {\n  throwIfNoPoint(image, point);\n  m_valid_matches[image][point] = newValue;\n}\n\nvoid MatchList::setPointPosition(size_t image, size_t point, float x, float y) {\n  throwIfNoPoint(image, point);\n  m_matches[image][point].x = x;\n  m_matches[image][point].y = y;\n}\n\nint MatchList::findNearestMatchPoint(size_t image, vw::Vector2 P, double distLimit) const {\n  if (image >= m_matches.size())\n    return -1;\n\n  double min_dist  = std::numeric_limits<double>::max();\n  if (distLimit > 0)\n    min_dist = distLimit;\n  int    min_index = -1;\n  std::vector<vw::ip::InterestPoint> const& ip = m_matches[image]; // alias\n  for (size_t ip_iter = 0; ip_iter < ip.size(); ip_iter++) {\n    Vector2 Q(ip[ip_iter].x, ip[ip_iter].y);\n    double curr_dist = norm_2(Q-P);\n    if (curr_dist < min_dist) {\n      min_dist  = curr_dist;\n      min_index = ip_iter;\n    }\n  }\n  return min_index;\n}\n\nvoid MatchList::deletePointsForImage(size_t image) {\n  if (image >= m_matches.size())\n    vw_throw(ArgumentErr() << \"Image \" << image << \" does not exist!\\n\");\n\n  m_matches.erase      (m_matches.begin()       + image);\n  m_valid_matches.erase(m_valid_matches.begin() + image);\n}\n\nbool MatchList::deletePointAcrossImages(size_t point) {\n\n  // Sanity checks\n  if (point >= getNumPoints())\n    vw::vw_throw(ArgumentErr() << \"Requested point for deletion does not exist!\");\n  \n  for (size_t i = 0; i < m_matches.size(); i++) {\n    if (m_matches[0].size() != m_matches[i].size()) {\n      vw_throw(vw::ArgumentErr()\n               << \"Cannot delete matches. Must have the same number of \"\n               << \"matches in each image.\\n\");\n    }\n  }\n\n  for (size_t vec_iter = 0; vec_iter < m_matches.size(); vec_iter++) {\n    m_matches[vec_iter].erase(m_matches[vec_iter].begin() + point);\n    m_valid_matches[vec_iter].erase(m_valid_matches[vec_iter].begin() + point);\n  }\n  return true;\n}\n\nbool MatchList::allPointsValid() const {\n  if (m_valid_matches.size() != m_matches.size())\n    vw_throw(LogicErr() << \"Valid matches out of sync with matches!\\n\");\n  \n  for (size_t i = 0; i < m_matches.size(); i++) {\n    if (m_matches[0].size() != m_matches[i].size())\n      return false;\n    for (size_t j = 0; j < m_valid_matches[i].size(); j++) {\n      if (!m_valid_matches[i][j])\n        return false;\n    }\n  }\n  \n  return true;\n}\n\nbool MatchList::loadPointsFromGCPs(std::string const gcpPath,\n                                   std::vector<std::string> const& imageNames) {\n  using namespace vw::ba;\n  if (getNumPoints() > 0) // Can't double-load points!\n    return false;\n\n  // Reset and resize\n  *this = MatchList();\n  int num_images = imageNames.size();\n  this->resize(num_images);\n\n  ControlNetwork cnet(\"gcp\");\n  cnet.get_image_list() = imageNames;\n  std::vector<std::string> gcp_files;\n  gcp_files.push_back(gcpPath);\n  // The actual datum does not matter here as the GCP will not be edited or processed\n  bool skip_datum_check = true;\n  vw::cartography::Datum datum; \n  try {\n    add_ground_control_points(cnet, gcp_files, datum, skip_datum_check);\n  } catch (...) {\n    // Do not complain if the GCP file does not exist. Maybe we want to create it.\n    return true;\n  }\n  \n  CameraRelationNetwork<JFeature> crn;\n  crn.from_cnet(cnet);\n\n  typedef CameraNode<JFeature>::iterator crn_iter;\n  if (crn.size() != num_images && crn.size() != 0)\n    vw_throw(ArgumentErr()\n             << \"The number of images in the control network does not \"\n             << \"agree with the number of images to view.\\n\");\n\n  // Load in all of the points\n  for (size_t icam = 0; icam < crn.size(); icam++) {\n    for (auto fiter = crn[icam].begin(); fiter != crn[icam].end(); fiter++) {\n      Vector2 observation = (**fiter).m_location;\n      vw::ip::InterestPoint ip(observation.x(), observation.y());\n      m_matches[icam].push_back(ip);\n      m_valid_matches[icam].push_back(true);\n    }\n  }\n\n  // If any of the sizes do not match, reset everything!\n  for (size_t icam = 0; icam < crn.size(); icam++) {\n    if (m_matches[0].size() != m_matches[icam].size()) {\n      *this = MatchList(); // reset\n      resize(num_images); // use the correct size\n      vw::vw_throw(ArgumentErr()\n               << \"Each GCP must be represented as a pixel in each image.\\n\");\n    }\n  }\n\n  return true;\n}\n\nbool MatchList::loadPointsFromVwip(std::vector<std::string> const& vwipFiles,\n                                   std::vector<std::string> const& imageNames) {\n\n  using namespace vw::ba;\n\n  if (getNumPoints() > 0) // Can't double-load points!\n    return false;\n\n  // Reset and resize\n  *this = MatchList(); \n  size_t num_images = imageNames.size();\n  this->resize(num_images);\n\n  // Load in all of the points\n  for (size_t i = 0; i < num_images; ++i) {\n    //std::vector<InterestPoint> ip;\n    m_matches[i] = vw::ip::read_binary_ip_file(vwipFiles[i]);\n    // Keep the valid matches synced up\n    size_t num_pts = m_matches[i].size();\n    m_valid_matches[i].resize(num_pts);\n    for (size_t j=0; j<num_pts; ++j)\n       m_valid_matches[i][j] = true;\n  }\n  \n  return true;\n}\n\nvoid MatchList::setIpValid(size_t image) {\n  if (image >= getNumImages())\n    return;\n  const size_t num_ip = m_matches[image].size();\n  \n  m_valid_matches[image].resize(num_ip);\n  for (size_t i=0; i<num_ip; ++i)\n    m_valid_matches[image][i] = true;\n}\n\n// Populate the match files and leftIndices vectors\nvoid populateMatchFiles(std::vector<std::string> const& image_files,\n                        std::string const& output_prefix,\n                        std::string const& first_match_file,\n                        bool matches_as_txt,\n                        // Outputs\n                        std::vector<std::string> & matchFiles,\n                        std::vector<size_t> & leftIndices,\n                        bool & matchfiles_found) {\n\n  int num_images = image_files.size();\n\n  // Populate the outputs\n  matchFiles.resize(num_images-1);\n  leftIndices.resize(num_images-1);\n  matchfiles_found = true; // if we fail, will be set to false\n  \n  std::string trial_match = \"\";\n  int leftIndex = 0;\n  std::vector<vw::ip::InterestPoint> left, right; // local variables\n  for (size_t i = 1; i < image_files.size(); i++) {\n\n    // Handle user-provided match file for two images\n    if ((first_match_file != \"\") && (image_files.size() == 2)) {\n      matchFiles [0] = first_match_file;\n      leftIndices[0] = 0;\n      break;\n    }\n\n    // Look for the match file in the default location, and if it\n    // does not appear prompt the user or a path.\n\n    // Look in default location 1, match from previous file to this file.\n    try {\n      trial_match = vw::ip::match_filename(output_prefix, image_files[i-1],\n                                           image_files[i], matches_as_txt);\n      leftIndex = i - 1;\n      vw::ip::read_match_file(trial_match, left, right, matches_as_txt);\n      vw::vw_out() << \"Read \" << left.size() << \" matches from \" << trial_match << \"\\n\";\n\n    } catch(...) {\n      // Look in default location 2, match from first file to this file.\n      try {\n        trial_match = vw::ip::match_filename(output_prefix, image_files[0],\n                                             image_files[i], matches_as_txt);\n        leftIndex = 0;\n        vw::ip::read_match_file(trial_match, left, right, matches_as_txt);\n        vw::vw_out() << \"Read \" << left.size() << \" matches from \" << trial_match << \"\\n\";\n\n      } catch(...) {\n        // Default locations failed, Start with a blank match file.\n        trial_match = vw::ip::match_filename(output_prefix, image_files[i-1],\n                                             image_files[i], matches_as_txt);\n        matchfiles_found = false;\n        leftIndex = i-1;\n      }\n    }\n    \n    matchFiles [i-1] = trial_match;\n    leftIndices[i-1] = leftIndex;\n  } // End loop looking for match files\n} \n\n// Populate from two vectors of interest point matches\nvoid MatchList::populateFromIpPair(std::vector<vw::ip::InterestPoint> const& ip1,\n                                   std::vector<vw::ip::InterestPoint> const& ip2) {\n  if (ip1.size() != ip2.size())\n    vw_throw(ArgumentErr() << \"The two interest point vectors must have the same size.\\n\");\n\n  // Reset and resize\n  *this = MatchList();\n  resize(2);\n\n  m_matches[0] = ip1;\n  m_matches[1] = ip2;\n  setIpValid(0);\n  setIpValid(1);\n}\n\nbool MatchList::loadPointsFromMatchFiles(std::vector<std::string> const& matchFiles,\n                                         std::vector<size_t> const& leftIndices,\n                                         bool matches_as_txt) {\n\n  // Count IP as in the same location if x and y are at least this close.\n  const float ALLOWED_POS_DIFF = 0.5;\n  \n  // Can't double-load points!\n  if ((getNumPoints() > 0) || (matchFiles.empty()))\n    return false;\n\n  const size_t num_images = matchFiles.size() + 1;\n  // Make sure we have the right number of match files\n  if ((matchFiles.size() != leftIndices.size()))\n    return false;\n\n  resize(0); // wipe first\n  resize(num_images);\n\n  // Loop through all of the matches\n  size_t num_ip = 0;\n  for (size_t i = 1; i < num_images; i++) {\n    std::string match_file = matchFiles [i-1];\n    size_t      j         = leftIndices[i-1];\n    \n    // Initialize all matches as invalid\n    m_matches      [i].resize(num_ip);\n    m_valid_matches[i].resize(num_ip);\n    for (size_t v = 0; v < num_ip; v++) {\n      m_matches      [i][v].x = v*10;  // TODO: Better way to spread these IP?\n      m_matches      [i][v].y = v*10;\n      m_valid_matches[i][v] = false;\n    }\n\n    std::vector<vw::ip::InterestPoint> left, right;\n    try {\n      vw_out() << \"Reading match file: \" << match_file << \"\\n\";\n      ip::read_match_file(match_file, left, right, matches_as_txt);\n      vw::vw_out() << \"Read \" << left.size() << \" matches.\\n\";\n    } catch(...) {\n      vw_out() << \"IP load failed, leaving default invalid IP\\n\";\n      continue;\n    }\n    if (i == 1) { // The first case is easy\n      m_matches[0] = left;\n      m_matches[1] = right;\n      setIpValid(0);\n      setIpValid(1);\n      num_ip = left.size(); // The first image sets the number of IP\n      continue;\n    }\n\n    // For other cases, we need to isolate the same IP in the left image.\n    // Loop through the ip in the \"left\" image\n    size_t count = 0;\n    for (size_t pnew=0; pnew<left.size(); ++pnew) {\n\n      // Look through the ip we already have for that image\n      //  and see if any of them are at the same location\n      for (size_t pold=0; pold<num_ip; ++pold) {\n\n        float dx = fabs(left[pnew].x - m_matches[j][pold].x);\n        float dy = fabs(left[pnew].y - m_matches[j][pold].y);\n        if ((dx < ALLOWED_POS_DIFF) && (dy < ALLOWED_POS_DIFF))\n        {\n          // If we found a match, record it and move on to the next point.\n          // - Note that we match left[] but we record right[]\n          m_matches      [i][pold] = right[pnew];\n          m_valid_matches[i][pold] = true;\n          ++count;\n          break;\n        }\n      } // End loop through m_matches[j]\n      \n      if (count == num_ip)\n        break; // This means we matched all of the IP in the existing image!\n      \n    }  // End loop through left\n    // Any points that did not match are left with their original value.\n  }\n  return true;\n}\n\nbool MatchList::savePointsToDisk(std::string const& prefix,\n                                 std::vector<std::string> const& imageNames,\n                                 std::string const& match_file,\n                                 bool matches_as_txt) const {\n  if (!allPointsValid() || (imageNames.size() != m_matches.size()))\n    vw::vw_throw(vw::ArgumentErr()\n                 << \"Cannot write match files, not all points are valid.\\n\");\n\n  const size_t num_image_files = imageNames.size();\n\n  bool success = true;\n  for (size_t i = 0; i < num_image_files; i++) {\n\n    // Save both i to j matches and j to i matches if there are more than two images.\n    // This is useful for SfS, though it is a bit of a hack.\n    size_t beg = i + 1;\n    if (num_image_files > 2) \n      beg = 0;\n\n    for (size_t j = beg; j < num_image_files; j++) {\n\n      if (i == j)\n        continue; // don't save i <-> i matches\n\n      std::string output_path = vw::ip::match_filename(prefix,\n                                                       imageNames[i], imageNames[j],\n                                                       matches_as_txt);\n      if ((num_image_files == 2) && (match_file != \"\"))\n        output_path = match_file;\n      try {\n        vw_out() << \"Writing: \" << output_path << \"\\n\";\n        ip::write_match_file(output_path, m_matches[i], m_matches[j], matches_as_txt);\n      } catch(...) {\n        vw::vw_throw(vw::ArgumentErr() << \"Failed to save match file: \"\n                     << output_path << \".\\n\");\n      }\n    }\n  }\n  return success;\n}\n\n} // namespace asp\n"
  },
  {
    "path": "src/asp/Core/MatchList.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n/// \\file MatchList.h\n///\n/// Interest point matching logic. Used in the GUI.\n///\n#ifndef __ASP_CORE_MATCHLIST_H__\n#define __ASP_CORE_MATCHLIST_H__\n\n// Vision Workbench\n#include <vw/Math/BBox.h>\n#include <vw/Math/Vector.h>\n#include <vw/InterestPoint/InterestPoint.h>\n\n#include <string>\n#include <vector>\n#include <list>\n#include <set>\n\nnamespace asp { \n\n  /// Helper class to keep track of all the matching interest points\n  /// - Each image must have the same number of interest points\n  ///   but in some situations some of the points can be flagged as invalid.\n  \n  // Populate the match files and leftIndices vectors\n  void populateMatchFiles(std::vector<std::string> const& image_files,\n                          std::string const& output_prefix,\n                          std::string const& first_match_file,\n                          bool matches_as_txt,\n                          // Outputs\n                          std::vector<std::string> & matchFiles,\n                          std::vector<size_t> & leftIndices,\n                          bool & matchfiles_found);\n  \n  class MatchList {\n  public:\n    /// Clear all exiting points and set up for a new image count.\n    void resize(size_t num_images);\n\n    /// Add a single point to the list.\n    /// - Points must be added in order, low index to high index.\n    /// - Returns false if the point could not be added.\n    bool addPoint(size_t image, vw::ip::InterestPoint const &pt, bool valid=true);\n\n    /// Return the number of images.\n    size_t getNumImages() const;\n\n    /// Return the number of points (usually but not always the same in each image).\n    size_t getNumPoints(size_t image=0) const;\n\n    /// Get a handle to a specific IP.\n    vw::ip::InterestPoint const& getPoint(size_t image, size_t point) const;\n\n    /// Returns the x/y coordinate of a point.\n    vw::Vector2 getPointCoord(size_t image, size_t point) const;\n\n    /// Return true if the point exists (valid or invalid)\n    bool pointExists(size_t image, size_t point) const;\n\n    /// Return true if a point is valid.\n    bool isPointValid(size_t image, size_t point) const;\n\n    /// Set the validity of a point.\n    void setPointValid(size_t image, size_t point, bool newValue=true);\n\n    /// Change the position of an interest point.\n    void setPointPosition(size_t image, size_t point, float x, float y);\n\n    /// Return the index of the nearest match point to the given pixel.\n    /// - Returns -1 if no match was found.\n    /// - If distLimit is set, return -1 if best match distance is over the limit.\n    int findNearestMatchPoint(size_t image, vw::Vector2 P, double distLimit) const;\n\n    /// Delete all IP for an image.\n    void deletePointsForImage(size_t image);\n\n    /// Delete the same IP in each image.\n    bool deletePointAcrossImages(size_t point);\n\n    /// Returns true if all points are valid and none are missing.\n    bool allPointsValid() const;\n\n    /// Try to load all of the points from match files on disk.\n    /// - The match files correspond to files 0 < i < N and leftIndices\n    ///   contains the index of the other file they match to (0 or i-1).\n    /// - Any points that cannot be loaded will be flagged as invalid.\n    /// - Return the number of points loaded, or -1 for failure.\n    bool loadPointsFromMatchFiles(std::vector<std::string> const& matchFiles,\n                                  std::vector<size_t>      const& leftIndices,\n                                  bool matches_as_txt);\n\n    /// Try to load the interest points from a GCP file.\n    bool loadPointsFromGCPs(std::string const gcpPath,\n                            std::vector<std::string> const& imageNames);\n\n    /// Try to load the interest points from vwip files.\n    bool loadPointsFromVwip(std::vector<std::string> const& vwipFiles,\n                            std::vector<std::string> const& imageNames);\n    \n    // Populate from two vectors of interest point matches\n    void populateFromIpPair(std::vector<vw::ip::InterestPoint> const& ip1,\n                            std::vector<vw::ip::InterestPoint> const& ip2);\n    \n    /// Write all points out using a given prefix.\n    bool savePointsToDisk(std::string const& prefix,\n                          std::vector<std::string> const& imageNames,\n                          std::string const& match_file,\n                          bool matches_as_txt) const;\n\n  private:\n\n    /// Throw an exception if the specified point does not exist.\n    void throwIfNoPoint(size_t image, size_t point) const;\n\n    /// Set all IP for the image as valid.\n    void setIpValid(size_t image);\n\n    /// A set of interest points for each input image\n    /// - There is always one set of matched interest points shared among all images.\n    /// - The only way the counts can differ is if the user is in the process of manually\n    ///   adding an interest point to the images.\n    /// - The length of the outer vector is equal to the number of MainWidget objects\n    std::vector<std::vector<vw::ip::InterestPoint>> m_matches;\n    /// Stay synced with m_matches, set to false if that match is not \n    std::vector<std::vector<bool>> m_valid_matches;\n\n  }; // End class MatchList\n\n} // namespace asp\n\n#endif  // __ASP_CORE_MATCHLIST_H__\n"
  },
  {
    "path": "src/asp/Core/Nvm.cc",
    "content": "/* Copyright (c) 2021, United States Government, as represented by the\n * Administrator of the National Aeronautics and Space Administration.\n *\n * All rights reserved.\n *\n * The \"ISAAC - Integrated System for Autonomous and Adaptive Caretaking\n * platform\" software is licensed under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n#include <asp/Core/Nvm.h>\n\n#include <vw/Core/Exception.h>\n#include <vw/Core/Log.h>\n#include <vw/FileIO/FileUtils.h>\n#include <vw/BundleAdjustment/ControlNetwork.h>\n\n#include <boost/filesystem.hpp>\n\n#include <iostream>\n#include <fstream>\n\nnamespace fs = boost::filesystem;\n\nnamespace asp {\n\n// Reads the NVM control network format. This function does not apply\n// the optical offsets. Use instead the function that does.\nvoid readNvm(std::string               const & input_filename,\n             std::vector<Eigen::Matrix2Xd>   & cid_to_keypoint_map,\n             std::vector<std::string>        & cid_to_filename,\n             std::vector<std::map<int, int>> & pid_to_cid_fid,\n             std::vector<Eigen::Vector3d>    & pid_to_xyz,\n             std::vector<Eigen::Affine3d>    & world_to_cam,\n             std::vector<double>             & focal_lengths) {\n\n  vw::vw_out() << \"Reading: \" << input_filename << \"\\n\";\n  std::ifstream f(input_filename, std::ios::in);\n  std::string token;\n  std::getline(f, token);\n  \n  // Assert that we start with our NVM token\n  if (token.compare(0, 6, \"NVM_V3\") != 0) {\n    vw::vw_throw(vw::ArgumentErr() << \"File doesn't start with NVM token.\");\n  }\n\n  // Read the number of cameras\n  ptrdiff_t number_of_cid;\n  f >> number_of_cid;\n  if (number_of_cid < 1)\n    vw::vw_throw(vw::ArgumentErr() << \"NVM file is missing cameras.\");\n\n  // Resize all our structures to support the number of cameras we now expect\n  cid_to_keypoint_map.resize(number_of_cid);\n  cid_to_filename.resize(number_of_cid);\n  world_to_cam.resize(number_of_cid);\n  focal_lengths.resize(number_of_cid);\n  for (ptrdiff_t cid = 0; cid < number_of_cid; cid++) {\n    // Clear keypoints from map. We'll read these in shortly\n    cid_to_keypoint_map.at(cid).resize(Eigen::NoChange_t(), 2);\n\n    // Read the line that contains camera information\n    std::string image_name; \n    double focal, dist1, dist2;\n    Eigen::Quaterniond q;\n    Eigen::Vector3d c;\n    f >> image_name >> focal;\n    f >> q.w() >> q.x() >> q.y() >> q.z();\n    f >> c[0] >> c[1] >> c[2] >> dist1 >> dist2;\n    cid_to_filename.at(cid) = image_name;\n    focal_lengths.at(cid) = focal;\n\n    // Solve for t, which is part of the affine transform\n    Eigen::Matrix3d r = q.matrix();\n    world_to_cam.at(cid).linear() = r;\n    world_to_cam.at(cid).translation() = -r * c;\n  }\n\n  // Read the number of points\n  ptrdiff_t number_of_pid;\n  f >> number_of_pid;\n  if (number_of_pid < 1)\n    vw::vw_throw(vw::ArgumentErr() << \"The NVM file has no triangulated points.\");\n\n  // Read the point\n  pid_to_cid_fid.resize(number_of_pid);\n  pid_to_xyz.resize(number_of_pid);\n  Eigen::Vector3d xyz;\n  Eigen::Vector3i color;\n  Eigen::Vector2d pt;\n  ptrdiff_t cid, fid;\n  for (ptrdiff_t pid = 0; pid < number_of_pid; pid++) {\n    pid_to_cid_fid.at(pid).clear();\n\n    ptrdiff_t number_of_measures;\n    f >> xyz[0] >> xyz[1] >> xyz[2] >>\n      color[0] >> color[1] >> color[2] >> number_of_measures;\n    pid_to_xyz.at(pid) = xyz;\n    for (ptrdiff_t m = 0; m < number_of_measures; m++) {\n\n      f >> cid >> fid >> pt[0] >> pt[1];\n      pid_to_cid_fid.at(pid)[cid] = fid;\n\n      if (cid_to_keypoint_map.at(cid).cols() <= fid)\n        cid_to_keypoint_map.at(cid).conservativeResize(Eigen::NoChange_t(), fid + 1);\n      \n      cid_to_keypoint_map.at(cid).col(fid) = pt;\n    }\n\n    if (!f.good())\n      vw::vw_throw(vw::ArgumentErr() << \"Unable to read file: \" << input_filename);\n  }\n}\n\n// A function to create the offsets filename from the nvm filename\nstd::string offsetsFilename(std::string const& nvm_filename) {\n  int file_len = nvm_filename.size(); // cast to int to make subtraction safe\n  // The length must be at least 5, as it must end with .nvm\n  if (file_len < 5) \n    vw::vw_throw(vw::ArgumentErr() << \"Invalid nvm filename: \" << nvm_filename << \".\\n\");\n  return nvm_filename.substr(0, std::max(file_len - 4, 0)) + \"_offsets.txt\";\n}\n\n// A function to read nvm offsets (optical center per image). On each line there\n// must be the image name, then the optical center column, then row. Read into\n// an std::map, with the key being the image name, and the value being vector2\n// of the optical center. Interest point matches are shifted relative to this.\nvoid readNvmOffsets(std::string const& offset_path,\n                    std::map<std::string, Eigen::Vector2d> & offsets) {\n\n  // Wipe the output\n  offsets.clear();\n  \n  std::ifstream offset_fh(offset_path.c_str());\n  if (!offset_fh.good())\n    vw::vw_throw(vw::ArgumentErr() << \"Cannot find optical offsets file: \"\n                 << offset_path << \".\\n\");\n  \n  vw::vw_out() << \"Reading optical centers: \" << offset_path << std::endl;\n  \n  std::string name;\n  double x, y;\n  while (offset_fh >> name >> x >> y) {\n    // Check for repeated entries\n    if (offsets.find(name) != offsets.end())\n      vw::vw_throw(vw::ArgumentErr() << \"Repeated optical center entry for image: \"\n                   << name << \".\\n\");\n    offsets[name] = Eigen::Vector2d(x, y);\n  }\n}\n\n// Write the optical center offsets to a file. The format is the image name,\n// then the optical center column, then row. \nvoid writeNvmOffsets(std::string const& offset_path,\n                     std::map<std::string, Eigen::Vector2d> const& offsets) {\n\n  std::ofstream offset_fh(offset_path.c_str());\n  offset_fh.precision(17); // double precision\n  \n  if (!offset_fh.good())\n    vw::vw_throw(vw::ArgumentErr() << \"Cannot write optical offsets file: \"\n                 << offset_path << \".\\n\");\n  \n  vw::vw_out() << \"Writing optical centers: \" << offset_path << std::endl;\n  for (auto it = offsets.begin(); it != offsets.end(); it++)\n    offset_fh << it->first << ' ' << it->second[0] << ' ' << it->second[1] << std::endl;\n}\n\n// Write an nvm file. Note that a single focal length is assumed and no distortion.\n// Those are ignored, and only camera poses, matches, and keypoints are used.\n// It is assumed that the interest points are shifted relative to the optical center.\n// Write the optical center separately.\nvoid writeNvm(std::vector<Eigen::Matrix2Xd> const& cid_to_keypoint_map,\n              std::vector<std::string> const& cid_to_filename,\n              std::vector<double> const& focal_lengths,\n              std::vector<std::map<int, int>> const& pid_to_cid_fid,\n              std::vector<Eigen::Vector3d> const& pid_to_xyz,\n              std::vector<Eigen::Affine3d> const& world_to_cam,\n              std::map<std::string, Eigen::Vector2d> const& optical_centers,\n              std::string const& output_filename) {\n\n  // Ensure that the output directory having this file exists\n  vw::create_out_dir(output_filename);\n\n  vw::vw_out() << \"Writing: \" << output_filename << std::endl;\n  \n  std::fstream f(output_filename, std::ios::out);\n  f.precision(17); // double precision\n  f << \"NVM_V3\\n\";\n\n  if (cid_to_filename.size() != cid_to_keypoint_map.size())\n    vw::vw_throw(vw::ArgumentErr() << \"Unequal number of filenames and keypoints.\");\n  if (pid_to_cid_fid.size() != pid_to_xyz.size())\n    vw::vw_throw(vw::ArgumentErr() \n                 << \"Unequal number of pid_to_cid_fid and xyz measurements.\");\n  if (cid_to_filename.size() != world_to_cam.size())\n    vw::vw_throw(vw::ArgumentErr() << \"Unequal number of filename and camera transforms.\");\n  \n  // Write camera information\n  f << cid_to_filename.size() << std::endl;\n  for (size_t cid = 0; cid < cid_to_filename.size(); cid++) {\n\n    // World-to-camera rotation quaternion\n    Eigen::Quaterniond q(world_to_cam[cid].rotation());\n\n    // Camera center in world coordinates\n    Eigen::Vector3d t(world_to_cam[cid].translation());\n    Eigen::Vector3d camera_center =\n      -world_to_cam[cid].rotation().inverse() * t;\n\n    double focal_length = 1.0;\n    if (!focal_lengths.empty())\n      focal_length = focal_lengths[cid];\n\n    f << cid_to_filename[cid] << \" \" << focal_length\n      << \" \" << q.w() << \" \" << q.x() << \" \" << q.y() << \" \" << q.z() << \" \"\n      << camera_center[0] << \" \" << camera_center[1] << \" \"\n      << camera_center[2] << \" \" << \"0 0\\n\"; // zero distortion, not used\n  }\n\n  // Write the number of points\n  f << pid_to_cid_fid.size() << std::endl;\n\n  for (size_t pid = 0; pid < pid_to_cid_fid.size(); pid++) {\n    f << pid_to_xyz[pid][0] << \" \" << pid_to_xyz[pid][1] << \" \"\n      << pid_to_xyz[pid][2] << \" 0 0 0 \"\n      << pid_to_cid_fid[pid].size();\n\n    if (pid_to_cid_fid[pid].size() <= 1)\n      vw::vw_throw(vw::ArgumentErr() << \"PID \" << pid << \" has \"\n                   << pid_to_cid_fid[pid].size() << \" measurements.\");\n    \n    for (std::map<int, int>::const_iterator it = pid_to_cid_fid[pid].begin();\n         it != pid_to_cid_fid[pid].end(); it++) {\n    \n      auto cid = it->first;\n      auto fid = it->second;\n    \n      // Find the offset for this image\n      Eigen::Vector2d offset = Eigen::Vector2d::Zero();\n      if (!optical_centers.empty()) {\n        auto map_it = optical_centers.find(cid_to_filename[cid]);\n        if (map_it == optical_centers.end()) {\n          vw::vw_throw(vw::ArgumentErr() << \"Cannot find optical offset for image \"\n                      << cid_to_filename[cid] << \"\\n\");\n        }\n        offset = map_it->second;\n      }\n      \n      // Write with the offset subtracted\n      f << \" \" << cid << \" \" << fid << \" \"\n        << cid_to_keypoint_map[it->first].col(it->second)[0] - offset[0] << \" \"\n        << cid_to_keypoint_map[it->first].col(it->second)[1] - offset[1];\n    }\n    f << std::endl;\n  }\n\n  // Close the file\n  f.flush();\n  f.close();\n  \n  if (!optical_centers.empty()) {\n    // Write the optical center offsets\n    std::string offset_path = offsetsFilename(output_filename);\n    writeNvmOffsets(offset_path, optical_centers);\n  }\n}\n\n// Write an nvm file. Keypoints are written as-is, and maybe shifted or not\n// relative to the optical center. No focal length info is known, so it is set\n// to 1.0.\nvoid writeNvm(std::vector<Eigen::Matrix2Xd> const& cid_to_keypoint_map,\n              std::vector<std::string> const& cid_to_filename,\n              std::vector<std::map<int, int>> const& pid_to_cid_fid,\n              std::vector<Eigen::Vector3d> const& pid_to_xyz,\n              std::vector<Eigen::Affine3d> const& world_to_cam,\n              std::string const& output_filename) {\n\n  // Part of the API\n  std::vector<double> focal_lengths;\n  std::map<std::string, Eigen::Vector2d> const optical_centers;\n  \n  writeNvm(cid_to_keypoint_map, cid_to_filename, focal_lengths,\n           pid_to_cid_fid, pid_to_xyz, world_to_cam, optical_centers,\n           output_filename);\n}\n\n// Given a map from current cid to new cid, apply this map to the nvm. This can\n// extract a submap and/or reorder data.\nvoid remapNvm(std::map<int, int>                  const& cid2cid,\n                // Outputs\n                std::vector<Eigen::Matrix2Xd>          & cid_to_keypoint_map,\n                std::vector<std::string>               & cid_to_filename,\n                std::vector<std::map<int, int>>        & pid_to_cid_fid,\n                std::vector<Eigen::Vector3d>           & pid_to_xyz,\n                std::vector<Eigen::Affine3d>           & world_to_cam,\n                std::vector<double>                    & focal_lengths,\n                std::map<std::string, Eigen::Vector2d> & optical_centers) {\n\n  // cid2d must be non-empty\n  if (cid2cid.empty())\n    vw::vw_throw(vw::ArgumentErr() \n                 << \"Cannot reorder a control network with an empty map.\");\n    \n  // Find the min and max value in the map\n  int min_out_cid = cid2cid.begin()->second;\n  int max_out_cid = cid2cid.begin()->second;\n  for (auto const& p : cid2cid) {\n    min_out_cid = std::min(min_out_cid, p.second);\n    max_out_cid = std::max(max_out_cid, p.second);\n  }\n\n  // Min cid must be non-negative\n  if (min_out_cid < 0)\n    vw::vw_throw(vw::ArgumentErr()\n                 << \"Cannot reorder a control network with negative cids.\");\n  \n  // Check that all values in cid2cid are unique\n  std::set<int> values;\n  for (auto const& p : cid2cid) {\n    if (values.find(p.second) != values.end())\n      vw::vw_throw(vw::ArgumentErr()\n                    << \"Cannot reorder a control network with repeated cids.\");\n    values.insert(p.second);\n  }\n  \n  // Allocate space for the output  \n  int num_out = max_out_cid + 1;\n  std::vector<Eigen::Matrix2Xd>   cid_to_keypoint_map_out(num_out);\n  std::vector<std::string>        cid_to_filename_out(num_out);\n  std::vector<Eigen::Affine3d>    world_to_cam_out(num_out);\n  std::vector<double>             focal_lengths_out(num_out);\n  std::vector<std::map<int, int>> pid_to_cid_fid_out;\n  std::vector<Eigen::Vector3d>    pid_to_xyz_out;\n  std::map<std::string, Eigen::Vector2d> optical_centers_out;\n  \n  for (size_t cid = 0; cid < cid_to_filename.size(); cid++) {\n    auto it = cid2cid.find(cid);\n    if (it == cid2cid.end()) \n      continue;\n    size_t new_cid = it->second;\n    cid_to_keypoint_map_out[new_cid] = cid_to_keypoint_map[cid];\n    cid_to_filename_out[new_cid]     = cid_to_filename[cid];\n    world_to_cam_out[new_cid]        = world_to_cam[cid];\n    focal_lengths_out[new_cid]       = focal_lengths[cid];\n    \n    if (!optical_centers.empty()) {\n      auto it2 = optical_centers.find(cid_to_filename[cid]);\n      if (it2 != optical_centers.end())\n        optical_centers_out[cid_to_filename[cid]] = it2->second;\n    }\n  }              \n  \n  // Create new pid_to_cid_fid and pid_to_xyz.\n  for (size_t pid = 0; pid < pid_to_cid_fid.size(); pid++) {\n    auto const& cid_fid = pid_to_cid_fid[pid];  // alias\n    std::map<int, int> cid_fid_out;\n    for (auto it = cid_fid.begin(); it != cid_fid.end(); it++) {\n      int cid = it->first;\n      auto cid2cid_it = cid2cid.find(cid);\n      if (cid2cid_it == cid2cid.end()) \n        continue;  // not an image we want to keep\n      int new_cid = cid2cid_it->second;  \n      cid_fid_out[new_cid] = it->second; // fid does not change\n    }\n    \n    if (cid_fid_out.size() <= 1) \n      continue;  // tracks must have size at least 2\n    \n    pid_to_cid_fid_out.push_back(cid_fid_out);\n    pid_to_xyz_out.push_back(pid_to_xyz[pid]);\n  }\n\n  // Copy the output to the input\n  cid_to_keypoint_map = cid_to_keypoint_map_out;\n  cid_to_filename     = cid_to_filename_out;\n  world_to_cam        = world_to_cam_out;\n  focal_lengths       = focal_lengths_out;\n  pid_to_cid_fid      = pid_to_cid_fid_out;\n  pid_to_xyz          = pid_to_xyz_out;\n  optical_centers     = optical_centers_out;\n}\n\n// Extract a submap in-place.\nvoid ExtractSubmap(std::vector<std::string> const& images_to_keep,\n                   asp::nvmData & nvm) {\n\n  // Sanity check. The images to keep must exist in the original map.\n  std::map<std::string, int> image2cid;\n  for (size_t cid = 0; cid < nvm.cid_to_filename.size(); cid++)\n    image2cid[nvm.cid_to_filename[cid]] = cid;\n  for (size_t cid = 0; cid < images_to_keep.size(); cid++) {\n    if (image2cid.find(images_to_keep[cid]) == image2cid.end())\n      vw::vw_out(vw::WarningMessage)\n        << \"Warning: Could not find in the input map the image: \"\n        << images_to_keep[cid] << \"\\n\";\n  }\n\n  // To extract the submap-in place, it is simpler to reorder the images\n  // to extract to be in the same order as in the map. Keep those in\n  // local vector 'keep'.\n  std::vector<std::string> keep;\n  {\n    std::set<std::string> keep_set;\n    for (size_t cid = 0; cid < images_to_keep.size(); cid++)\n      keep_set.insert(images_to_keep[cid]);\n    for (size_t cid = 0; cid < nvm.cid_to_filename.size(); cid++) {\n      if (keep_set.find(nvm.cid_to_filename[cid]) != keep_set.end())\n        keep.push_back(nvm.cid_to_filename[cid]);\n    }\n  }\n\n  // Map each image we keep to its index\n  std::map<std::string, int> keep2cid;\n  for (size_t cid = 0; cid < keep.size(); cid++)\n    keep2cid[keep[cid]] = cid;\n\n  // The map from the old cid to the new cid\n  std::map<int, int> cid2cid;\n  for (size_t cid = 0; cid < nvm.cid_to_filename.size(); cid++) {\n    auto it = keep2cid.find(nvm.cid_to_filename[cid]);\n    if (it == keep2cid.end()) continue;  // current image is not in the final submap\n    cid2cid[cid] = it->second;\n  }\n\n  // Sanity checks. All the kept images must be represented in cid2cid,\n  // and the values in cid2cid must be consecutive.\n  if (cid2cid.size() != keep.size() || cid2cid.empty())\n    vw::vw_throw(vw::ArgumentErr() \n                 << \"Cannot extract a submap. Check your inputs. Maybe some images \"\n                 << \"are duplicated or none are in the map.\");\n  for (auto it = cid2cid.begin(); it != cid2cid.end(); it++) {\n    auto it2 = it; it2++;\n    if (it2 == cid2cid.end()) continue;\n    if (it->second + 1 != it2->second || cid2cid.begin()->second != 0 )\n      vw::vw_throw(vw::ArgumentErr()\n                   << \"Cannot extract a submap. Check if the images \"\n                   << \"you want to keep are in the same order as in the original map.\");\n  }\n\n  // Remap the nvm\n  asp::remapNvm(cid2cid, nvm.cid_to_keypoint_map, nvm.cid_to_filename,\n                nvm.pid_to_cid_fid, nvm.pid_to_xyz, nvm.world_to_cam,\n                nvm.focal_lengths, nvm.optical_centers);\n  \n  vw::vw_out() << \"Number of images in the extracted map: \" \n    << nvm.cid_to_filename.size() << \"\\n\";\n  vw::vw_out() << \"Number of tracks in the extracted map: \" \n    << nvm.pid_to_cid_fid.size() << \"\\n\";\n\n  return;\n}\n\n// Reads the NVM control network format. If a filename having extension\n// _offset.txt instead of .nvm exists, read from it the optical center offsets\n// and apply them.\nvoid readNvm(std::string                       const& input_filename,\n             bool                                     nvm_no_shift,\n             std::vector<Eigen::Matrix2Xd>          & cid_to_keypoint_map,\n             std::vector<std::string>               & cid_to_filename,\n             std::vector<std::map<int, int>>        & pid_to_cid_fid,\n             std::vector<Eigen::Vector3d>           & pid_to_xyz,\n             std::vector<Eigen::Affine3d>           & world_to_cam,\n             std::vector<double>                    & focal_lengths,\n             std::map<std::string, Eigen::Vector2d> & offsets) {\n\n  // Read the offsets (optical centers) to apply to the interest points,\n  // if applicable.\n  std::string offset_path = offsetsFilename(input_filename);\n  std::ifstream offset_fh(offset_path.c_str());\n  \n  bool have_offsets = false;\n  offsets.clear();\n  \n  if (nvm_no_shift) {\n    have_offsets = false;\n    if (offset_fh.good()) \n      vw::vw_out() << \"Ignoring the optical center offsets from: \" << offset_path\n                   << std::endl;\n  } else {\n    if (!offset_fh.good())\n      vw::vw_throw(vw::ArgumentErr() << \"Cannot find optical offsets file: \"\n                   << offset_path << \"\\n\");\n    \n    readNvmOffsets(offset_path, offsets);  \n    have_offsets = true;\n  }\n  \n  // Read the nvm as is, without applying any offsets\n  asp::readNvm(input_filename, cid_to_keypoint_map, cid_to_filename,\n               pid_to_cid_fid, pid_to_xyz, world_to_cam, focal_lengths);\n\n  // If no offsets, use zero offsets\n  if (nvm_no_shift) {\n    for (ptrdiff_t cid = 0; cid < cid_to_filename.size(); cid++)\n      offsets[cid_to_filename.at(cid)] = Eigen::Vector2d(0, 0);\n  }\n \n  // If we have the offsets, apply them to the interest points\n  if (have_offsets) {\n    for (ptrdiff_t cid = 0; cid < cid_to_filename.size(); cid++) {\n      std::string name = cid_to_filename.at(cid);\n      auto off_it = offsets.find(name);\n      if (off_it == offsets.end())\n        vw::vw_throw(vw::ArgumentErr() << \"Cannot find optical offset for image: \"\n                      << name << \"\\n\");\n      Eigen::Vector2d offset = off_it->second;\n      for (ptrdiff_t fid = 0; fid < cid_to_keypoint_map.at(cid).cols(); fid++) {\n        cid_to_keypoint_map.at(cid).col(fid) += offset;\n      }\n    }\n  } // end applying offsets\n  \n}\n\n// A wrapper to carry fewer things around\nvoid readNvm(std::string const& input_filename, \n             bool nvm_no_shift,\n             asp::nvmData & nvm) {\n  readNvm(input_filename,\n          nvm_no_shift,\n          nvm.cid_to_keypoint_map,\n          nvm.cid_to_filename,\n          nvm.pid_to_cid_fid,\n          nvm.pid_to_xyz,\n          nvm.world_to_cam,\n          nvm.focal_lengths,\n          nvm.optical_centers);\n}\n\n// A wrapper for writing an nvm file\nvoid writeNvm(asp::nvmData const& nvm, std::string const& output_filename) {\n  writeNvm(nvm.cid_to_keypoint_map,\n          nvm.cid_to_filename,\n          nvm.focal_lengths,\n          nvm.pid_to_cid_fid,\n          nvm.pid_to_xyz,\n          nvm.world_to_cam,\n          nvm.optical_centers,\n          output_filename);\n}\n\n// Convert nvm to cnet\nvoid nvmToCnet(asp::nvmData const& nvm, \n               // Outputs\n               vw::ba::ControlNetwork                 & cnet,\n               std::map<std::string, Eigen::Vector2d> & offsets,\n               std::vector<Eigen::Affine3d>           & world_to_cam) {\n\n  // Wipe the output\n  cnet = vw::ba::ControlNetwork(\"ASP_control_network\");\n\n  // Add the images\n  for (size_t cid = 0; cid < nvm.cid_to_filename.size(); cid++)\n    cnet.add_image_name(nvm.cid_to_filename[cid]);\n\n  // Add the points\n  for (size_t pid = 0; pid < nvm.pid_to_cid_fid.size(); pid++) {\n    vw::ba::ControlPoint cp;\n    Eigen::Vector3d const& P = nvm.pid_to_xyz[pid];\n    cp.set_position(vw::Vector3(P[0], P[1], P[2]));\n    cp.set_type(vw::ba::ControlPoint::TiePoint); // this is the default\n\n    for (const auto& cid_fid: nvm.pid_to_cid_fid[pid]) {\n      int cid = cid_fid.first;\n      int fid = cid_fid.second;\n      double x = nvm.cid_to_keypoint_map[cid].col(fid)[0];\n      double y = nvm.cid_to_keypoint_map[cid].col(fid)[1];\n      double sigma = 1.0;\n      cp.add_measure(vw::ba::ControlMeasure(x, y, sigma, sigma, cid));\n    }\n   \n    cnet.add_control_point(cp);\n  }\n  \n  offsets = nvm.optical_centers;\n  world_to_cam = nvm.world_to_cam;\n}\n\n// Create an nvm from a cnet. There is no shift in the interest points. That is\n// applied only on loading and saving. Optionally, updated triangulated points\n// and outlier flags can be passed in.\nvoid cnetToNvm(vw::ba::ControlNetwork                 const& cnet,\n               std::map<std::string, Eigen::Vector2d> const& offsets,\n               std::vector<Eigen::Affine3d>           const& world_to_cam,\n               // Output\n               asp::nvmData & nvm,\n               // Optional updated triangulated points and outlier flags\n               std::vector<Eigen::Vector3d> const& tri_vec,\n               std::set<int> const& outliers) {\n               \n  // Sanity check\n  if (offsets.size() != world_to_cam.size())\n    vw::vw_throw(vw::ArgumentErr() << \"cnetToNvm: Mismatch in offsets and world_to_cam.\\n\");\n  if (cnet.get_image_list().size() != world_to_cam.size())\n    vw::vw_throw(vw::ArgumentErr() << \"cnetToNvm: Mismatch in cnet and world_to_cam.\\n\");  \n  \n  // If tri_vec is not empty, must have the same size as the cnet\n  int num_points = cnet.size();\n  if (!tri_vec.empty() && (int)tri_vec.size() != num_points)\n    vw::vw_throw(vw::ArgumentErr() << \"cnetToNvm: Mismatch in tri_vec and cnet.\\n\");\n    \n  // Wipe the output \n  nvm = asp::nvmData();\n\n  nvm.cid_to_filename = cnet.get_image_list();\n  nvm.focal_lengths.resize(nvm.cid_to_filename.size(), 1.0); // dummy focal length\n  nvm.world_to_cam = world_to_cam;\n  nvm.optical_centers = offsets;\n\n  // Allocate storage only for the inliers \n  int num_inliers = num_points - outliers.size();\n  nvm.pid_to_xyz.resize(num_inliers);\n  nvm.pid_to_cid_fid.resize(num_inliers);\n  \n  // Copy the triangulated points\n  int inlier_count = 0;\n  for (int pid = 0; pid < num_points; pid++) {\n    \n    // Skip outliers\n    if (outliers.find(pid) != outliers.end())\n      continue;\n      \n    if (tri_vec.empty()) {\n      vw::Vector3 P = cnet[pid].position();\n      nvm.pid_to_xyz[inlier_count] = Eigen::Vector3d(P[0], P[1], P[2]);\n    } else {\n      nvm.pid_to_xyz[inlier_count] = tri_vec[pid];\n    }\n    inlier_count++;\n    \n    // Sanity check\n    if (inlier_count > num_points)\n      vw::vw_throw(vw::ArgumentErr() << \"cnetToNvm: Book-keeping failure inlier count.\\n\");\n  }\n\n  // Iterate through the control points and get the feature matches\n  // Put all interest points per image in a map, so later we can\n  // give them an id.\n  int num_images = nvm.cid_to_filename.size();\n  typedef std::pair<double, double> Pair; // 2D point with comparison operator\n  std::vector<std::map<Pair, int>> keypoint_map(num_images);\n  for (int pid = 0; pid < num_points; pid++) {\n    \n    // Skip outliers\n    if (outliers.find(pid) != outliers.end())\n      continue;\n      \n    vw::ba::ControlPoint const& cp = cnet[pid];\n    // Iterate through the measures\n    for (int m = 0; m < cp.size(); m++) {\n      vw::ba::ControlMeasure const& cm = cp[m];\n      int cid = cm.image_id();\n      vw::Vector2 pix = cm.position();\n      \n      // Add to the keypoint map\n      Pair key = std::make_pair(pix[0], pix[1]);\n      // If the key is not in the map, add it with an id that is the current size of the map\n      if (keypoint_map[cid].find(key) == keypoint_map[cid].end())\n        keypoint_map[cid][key] = keypoint_map[cid].size();\n    }\n  }\n\n  // Now fill in the keypoint map\n  nvm.cid_to_keypoint_map.resize(nvm.cid_to_filename.size());\n  for (int cid = 0; cid < num_images; cid++)\n    nvm.cid_to_keypoint_map[cid].resize(2, keypoint_map[cid].size());\n  \n  inlier_count = 0;   \n  for (int pid = 0; pid < num_points; pid++) {\n    vw::ba::ControlPoint const& cp = cnet[pid];\n    \n    // Skip outliers\n    if (outliers.find(pid) != outliers.end())\n      continue;\n\n    // Iterate through the measures\n    for (int m = 0; m < cp.size(); m++) {\n      vw::ba::ControlMeasure const& cm = cp[m];\n      int cid = cm.image_id();\n      vw::Vector2 pix = cm.position();\n      Pair key = std::make_pair(pix[0], pix[1]);\n      // The key is guaranteed to be in the map\n      auto it = keypoint_map[cid].find(key);\n      if (it == keypoint_map[cid].end())\n         vw::vw_throw(vw::ArgumentErr() << \"cnetToNvm: Unexpected key not found.\\n\");\n      int fid = it->second;  \n      nvm.pid_to_cid_fid[inlier_count][cid] = fid;\n      nvm.cid_to_keypoint_map[cid].col(fid) = Eigen::Vector2d(pix[0], pix[1]);\n    }\n    inlier_count++;\n  }  \n\n  return;\n}\n\n// Reorder the nvm to agree with a given image list\nvoid remapNvm(std::vector<std::string> const& image_files,\n              asp::nvmData & nvm) {\n\n  if (image_files.size() != nvm.cid_to_filename.size())\n    vw::vw_throw(vw::ArgumentErr() \n                  << \"The nvm and input images do not have the same files.\\n\");\n\n  // Find the cid for each image in the nvm file\n  std::map<std::string, int> nvm_file2cid;\n  for (size_t i = 0; i < nvm.cid_to_filename.size(); i++)\n    nvm_file2cid[nvm.cid_to_filename[i]] = i;\n  // Same for the image files\n  std::map<std::string, int> image_file2cid;\n  for (size_t i = 0; i < image_files.size(); i++)\n    image_file2cid[image_files[i]] = i;\n\n  // These must have the same size\n  if (nvm_file2cid.size() != image_file2cid.size())\n    vw::vw_throw(vw::ArgumentErr() \n                  << \"The nvm and input images do not have the same files.\\n\");\n    \n  // Create cid2cid map that will help reorder then nvm to agree with the \n  // image files\n  std::map<int, int> cid2cid;\n  for (size_t i = 0; i < image_files.size(); i++) {\n    std::string image_file = image_files[i];\n    if (nvm_file2cid.find(image_file) == nvm_file2cid.end())\n      vw::vw_throw(vw::ArgumentErr() << \"Cannot find image: \" << image_file\n                    << \" in the nvm.\\n\");\n    cid2cid[nvm_file2cid[image_file]] = i;\n  }  \n\n  // Remap the nvm\n  asp::remapNvm(cid2cid, nvm.cid_to_keypoint_map, nvm.cid_to_filename,\n                nvm.pid_to_cid_fid, nvm.pid_to_xyz, nvm.world_to_cam,\n                nvm.focal_lengths, nvm.optical_centers);\n}\n\n// Read an NVM file into the VisionWorkbench control network format. The flag\n// nvm_no_shift, if true, means that the interest points are not shifted\n// relative to the optical center, so can be read as is.\nvoid readNvmAsCnet(std::string const& input_filename, \n                   std::vector<std::string> const& image_files,\n                   bool nvm_no_shift,\n                   vw::ba::ControlNetwork & cnet,\n                   std::vector<Eigen::Affine3d> & world_to_cam,\n                   std::map<std::string, Eigen::Vector2d> & optical_offsets) {\n\n  // Read the NVM file\n  asp::nvmData nvm;\n  asp::readNvm(input_filename, nvm_no_shift, nvm);\n\n  // Must ensure the nvm image list agrees with the input image list\n  if (!image_files.empty()) \n    remapNvm(image_files, nvm);\n  \n  // Convert to a control network\n  asp::nvmToCnet(nvm, cnet, optical_offsets, world_to_cam);\n}\n\n// Write a cnet to an NVM file. On writing, the feature matches from the cnet will be\n// shifted relative to the optical center. The optical center offsets are saved\n// to a separate file.\nvoid writeCnetAsNvm(vw::ba::ControlNetwork const& cnet,\n                    std::map<std::string, Eigen::Vector2d> const& optical_offsets,\n                    std::vector<Eigen::Affine3d> const& world_to_cam,\n                    std::string const& output_filename) {\n\n  // Convert to an nvm\n  asp::nvmData nvm;\n  asp::cnetToNvm(cnet, optical_offsets, world_to_cam, nvm);\n\n  // Write the nvm\n  asp::writeNvm(nvm, output_filename);\n}\n  \n}  // end namespace asp\n"
  },
  {
    "path": "src/asp/Core/Nvm.h",
    "content": "/* Copyright (c) 2021, United States Government, as represented by the\n * Administrator of the National Aeronautics and Space Administration.\n *\n * All rights reserved.\n *\n * The \"ISAAC - Integrated System for Autonomous and Adaptive Caretaking\n * platform\" software is licensed under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n// Logic for nvm files and the sfm solution\n#ifndef ASP_CORE_NVM_H_\n#define ASP_CORE_NVM_H_\n\n#include <Eigen/Core>\n#include <Eigen/Geometry>\n\n#include <vector>\n#include <map>\n#include <set>\n\nnamespace vw {\n  namespace ba {\n    class ControlNetwork;\n  }\n}\n\nnamespace asp {\n\nstruct nvmData {\n  std::vector<Eigen::Matrix2Xd>    cid_to_keypoint_map;\n  std::vector<std::string>         cid_to_filename;\n  std::vector<std::map<int, int>>  pid_to_cid_fid;\n  std::vector<Eigen::Vector3d>     pid_to_xyz;\n  std::vector<Eigen::Affine3d>     world_to_cam;\n  std::vector<double>              focal_lengths;\n  // Interest points in the nvm file are shifted relative to optical centers\n  std::map<std::string, Eigen::Vector2d> optical_centers;\n};\n\n// Reads the NVM control network format. This function does not apply\n// the optical offsets. Use instead the function that does.\nvoid readNvm(std::string               const & input_filename,\n             std::vector<Eigen::Matrix2Xd>   & cid_to_keypoint_map,\n             std::vector<std::string>        & cid_to_filename,\n             std::vector<std::map<int, int>> & pid_to_cid_fid,\n             std::vector<Eigen::Vector3d>    & pid_to_xyz,\n             std::vector<Eigen::Affine3d>    & world_to_cam,\n             std::vector<double>             & focal_lengths);\n\n// A function to create the offsets filename from the nvm filename\nstd::string offsetsFilename(std::string const& nvm_filename);\n\n// A function to read nvm offsets (optical center per image). On each line there\n// must be the image name, then the optical center column, then row. Read into\n// an std::map, with the key being the image name, and the value being vector2\n// of the optical center. Interest point matches are shifted relative to this.\nvoid readNvmOffsets(std::string const& offset_path,\n                    std::map<std::string, Eigen::Vector2d> & offsets);\n  \n// Write the optical center offsets to a file. The format is the image name,\n// then the optical center column, then row. \nvoid writeNvmOffsets(std::string const& offset_path,\n                     std::map<std::string, Eigen::Vector2d> const& offsets);\n  \n// Write an NVM file. Subtract from the interest points the given offset.\n// The offsets are saved in a separate file.\nvoid writeNvm(asp::nvmData const& nvm, std::string const& output_filename);\n\n// Write an nvm file. Keypoints are written as-is, and maybe shifted or not\n// relative to the optical center. No focal length info is known, so it is set\n// to 1.0.\nvoid writeNvm(std::vector<Eigen::Matrix2Xd> const& cid_to_keypoint_map,\n              std::vector<std::string> const& cid_to_filename,\n              std::vector<std::map<int, int>> const& pid_to_cid_fid,\n              std::vector<Eigen::Vector3d> const& pid_to_xyz,\n              std::vector<Eigen::Affine3d> const& world_to_cam,\n              std::string const& output_filename);\n\n// Given a map from current cid to new cid, apply this map to the nvm. This can\n// extract a submap and/or reorder data.\nvoid remapNvm(std::map<int, int>                const& cid2cid,\n              // Outputs\n              std::vector<Eigen::Matrix2Xd>          & cid_to_keypoint_map,\n              std::vector<std::string>               & cid_to_filename,\n              std::vector<std::map<int, int>>        & pid_to_cid_fid,\n              std::vector<Eigen::Vector3d>           & pid_to_xyz,\n              std::vector<Eigen::Affine3d>           & world_to_cam,\n              std::vector<double>                    & focal_lengths,\n              std::map<std::string, Eigen::Vector2d> & optical_centers);\n\n// Extract a submap in-place from an nvm object.\nvoid ExtractSubmap(std::vector<std::string> const& images_to_keep,\n                    asp::nvmData & nvm);\n  \n// Read an NVM file. Any offset is applied upon reading.\nvoid readNvm(std::string const& input_filename, bool nvm_no_shift, asp::nvmData & nvm);\n\n// Read an NVM file into the VisionWorkbench control network format. The flag\n// nvm_no_shift, if true, means that the interest points are not shifted\n// relative to the optical center, so can be read as is.\nvoid readNvmAsCnet(std::string const& input_filename, \n                   std::vector<std::string> const& image_files,\n                   bool nvm_no_shift,\n                   // Outputs\n                   vw::ba::ControlNetwork & cnet,\n                   std::vector<Eigen::Affine3d> & world_to_cam,\n                   std::map<std::string, Eigen::Vector2d> & offsets);\n\n// Create an nvm from a cnet. There is no shift in the interest points. That is\n// applied only on loading and saving. Optionally, updated triangulated points\n// and outlier flags can be passed in.\nvoid cnetToNvm(vw::ba::ControlNetwork                 const& cnet,\n               std::map<std::string, Eigen::Vector2d> const& offsets,\n               std::vector<Eigen::Affine3d>           const& world_to_cam,\n               // Output\n               asp::nvmData & nvm,\n               // Optional updated triangulated points and outlier flags\n               std::vector<Eigen::Vector3d> const& tri_vec = std::vector<Eigen::Vector3d>(),\n               std::set<int> const& outliers = std::set<int>());\n  \n// Convert nvm to cnet\nvoid nvmToCnet(asp::nvmData const& nvm, \n               // Outputs\n               vw::ba::ControlNetwork                 & cnet,\n               std::map<std::string, Eigen::Vector2d> & offsets,\n               std::vector<Eigen::Affine3d>           & world_to_cam);\n\n// Write a cnet to an NVM file. On writing, the feature matches from the cnet will be\n// shifted relative to the optical center. The optical center offsets are saved\n// to a separate file.\nvoid writeCnetAsNvm(vw::ba::ControlNetwork const& cnet,\n                    std::map<std::string, Eigen::Vector2d> const& optical_offsets,\n                    std::vector<Eigen::Affine3d> const& world_to_cam,\n                    std::string const& output_filename);\n  \n  \n}  // end namespace asp\n\n#endif  // ASP_CORE_NVM_H_\n"
  },
  {
    "path": "src/asp/Core/OpenCVUtils.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n#include <asp/Core/OpenCVUtils.h>\n\n#include <vw/Core/Exception.h>\n\n#include <Eigen/Core>\n#include <opencv2/core/eigen.hpp>\n\n#include <iostream>\n\nnamespace asp {\n\n  // Return the OpenCV matrix type as a string\n  std::string cvMatType(cv::Mat const& M) {\n\n    int inttype = M.type();\n\n    std::string r, a;\n    \n    uchar depth = inttype & CV_MAT_DEPTH_MASK;\n    uchar chans = 1 + (inttype >> CV_CN_SHIFT);\n\n    switch (depth) {\n    case CV_8U:  r = \"8U\"; break;\n    case CV_8S:  r = \"8S\"; break;\n    case CV_16U: r = \"16U\"; break;\n    case CV_16S: r = \"16S\"; break;\n    case CV_32S: r = \"32S\"; break;\n    case CV_32F: r = \"32F\"; break;\n    case CV_64F: r = \"64F\"; break;\n    default:     r = \"User\"; break;\n    }   \n    r += \"C\";\n    r += (chans+'0');\n\n    return r;\n  }\n\n  // Convert a matrix from OpenCV to the VisionWorkbench matrix type.\n  // Implemented only for double precision matrix (should be easy to\n  // extend also for single precision and various integer types).\n  vw::Matrix<double> cvMatToVwMat(cv::Mat const& M) {\n\n    std::string matType = asp::cvMatType(M);\n    if (matType != \"64FC1\") {\n      vw::vw_throw(vw::NoImplErr() << \"cvMatToVwMat() implemented only for \"\n                   << \"double-precision OpenCV matrices (64FC1). Got: \" << matType);\n      \n    }\n    \n    Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> EM;\n    cv::cv2eigen(M, EM);\n\n    vw::Matrix<double> VM(EM.rows(), EM.cols());\n\n    for (int row = 0; row < EM.rows(); row++) {\n      for (int col = 0; col < EM.cols(); col++) {\n        VM(row, col) = EM(row, col);\n      }\n    }\n\n    return VM;\n  }\n  \n\n  // Scale an image from [0, 1] to [0, 255], round, and clamp.\n  // NaN values are not affected.\n  void formScaledByteCVImage(vw::ImageViewRef<float> in, cv::Mat & out) {\n    \n    out = cv::Mat(in.rows(), in.cols(), CV_8UC1, cv::Scalar(0));\n\n    // Note how we read from in(col, row) but write to out(row, col)\n    \n    for (int row = 0; row < in.rows(); row++) {\n      for (int col = 0; col < in.cols(); col++) {\n        int val = round(255.0 * in(col, row));\n        if (val < 0) \n          val = 0;\n        if (val > 255)\n          val = 255;\n      \n        out.at<uint8_t>(row, col) = val;\n      }\n    }\n\n    return;\n  }\n\n  // Scale a masked image from [0, 1] to [0, 255], round, and clamp.\n  // Invalid values get set to 0 in the output. Masking likely casts NaN\n  // to invalid data so they end up being set to 0.\n  void maskedToScaledByteCvImage(vw::ImageViewRef<vw::PixelMask<float>> in, cv::Mat & out) {\n    vw::ImageViewRef<float> img = vw::apply_mask(in, 0.0f);\n    formScaledByteCVImage(img, out);\n  }\n\n  // Insert an image as a block at a desired location in a bigger image\n  void cvInsertBlock(cv::Mat const& input_image, int extra_x,\n                     int extra_y, cv::Mat& output_image) {\n    input_image.copyTo(output_image(cv::Range(extra_y, extra_y + input_image.rows),\n                                    cv::Range(extra_x, extra_x + input_image.cols)));\n  }\n  \n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Core/OpenCVUtils.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n/// \\file OpenCVUtils.h\n///\n\n#ifndef __ASP_CORE_OPENCVUTILS_H__\n#define __ASP_CORE_OPENCVUTILS_H__\n\n#include <string>\n\n#include <vw/Math/Matrix.h>\n#include <vw/Image/ImageViewRef.h>\n#include <opencv2/core.hpp>\n\nnamespace asp {\n  \n  // Return the OpenCV matrix type as a string\n  std::string cvMatType(cv::Mat const& M);\n  \n  // Convert a matrix from OpenCV to the VisionWorkbench matrix type.\n  // Implemented only for double precision matrix.\n  vw::Matrix<double> cvMatToVwMat(cv::Mat const& M);\n  \n  // Scale an image from [0, 1] to [0, 255], round, and clamp.\n  // NaN values are not affected.\n  void formScaledByteCVImage(vw::ImageViewRef<float> in, cv::Mat & out);\n  \n  // Scale a masked image from [0, 1] to [0, 255], round, and clamp.\n  // Invalid values get set to 0 in the output. Masking likely casts NaN\n  // to invalid data so they end up being set to 0.\n  void maskedToScaledByteCvImage(vw::ImageViewRef<vw::PixelMask<float>> in, cv::Mat & out);\n\n  // Insert an image as a block at a desired location in a bigger image\n  void cvInsertBlock(cv::Mat const& input_image, int extra_x,\n                     int extra_y, cv::Mat& output_image);\n}\n\n#endif //__ASP_CORE_OPENCVUTILS_H__\n"
  },
  {
    "path": "src/asp/Core/OrthoRasterizer.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file OrthoRasterizer.cc\n///\n/// Given a point image and corresponding texture, this class\n/// resamples the point cloud on a regular grid over the [x,y] plane\n/// of the point image; producing an evenly sampled ortho-image with\n/// interpolated z values.\n\n#include <asp/Core/OrthoRasterizer.h>\n#include <asp/Core/CartographyUtils.h>\n#include <asp/Core/PointUtils.h>\n\n#include <vw/Image/ImageChannels.h>\n#include <vw/Image/ImageView.h>\n#include <vw/Image/ImageViewRef.h>\n#include <vw/Image/Manipulation.h>\n#include <vw/Image/Algorithms.h>\n#include <vw/Image/BlockRasterize.h>\n#include <vw/Image/Filter.h>\n#include <vw/Image/InpaintView.h>\n#include <vw/Core/ThreadPool.h>\n#include <vw/Math/Vector.h>\n#include <vw/Math/BBox.h>\n#include <vw/Math/Statistics.h>\n\n#include <boost/foreach.hpp>\n#include <cmath>\n#include <valarray>\n\nnamespace asp{\n\n  using namespace vw;\n\n  class compare_bboxes { // simple comparison function\n  public:\n    bool operator()(const BBox2i A, const BBox2i B) const {\n      return (A.min().x() < B.min().x());\n    }\n  };\n\n  void dump_image(std::string const& prefix, BBox2i const& box,\n                  ImageViewRef<Vector3> const& I) {\n\n    //Crop the image to the given box and save to a file.\n\n    std::ostringstream os;\n    os << prefix << \"_\" << box.min().x() << \"_\" << box.min().y()\n       << \" \" << box.width() << \" \" << box.height() << \".csv\";\n    std::string file = os.str();\n    vw_out() << \"Writing: \" << file << std::endl;\n    std::ofstream of(file.c_str());\n    of.precision(18);\n\n    BBox2i lbox = box;\n    lbox.crop(bounding_box(I));\n    ImageView<Vector3> crop_img = crop(I, lbox);\n    for (int col = 0; col < crop_img.cols(); col++) {\n      for (int row = 0; row < crop_img.rows(); row++) {\n        Vector3 p = crop_img(col, row);\n        if (std::isnan(p.z())) continue;\n        of << p.x() << ' ' << p.y()  << ' ' << p.z() << std::endl;\n      }\n    }\n    of.close();\n  }\n\n  // Task to parallelize the generation of bounding boxes for each block.\n  class SubBlockBoundaryTask: public Task, private boost::noncopyable {\n    ImageViewRef<Vector3> m_view;\n    int    m_sub_block_size;\n    BBox2i m_image_bbox;\n    BBox3& m_global_bbox;\n    std::vector<BBoxPair>& m_point_image_boundaries;\n    ImageViewRef<double> const& m_error_image;\n    double m_estim_max_error;   // used for outlier removal by tri error based on percentage\n    vw::BBox3 m_estim_proj_box; // used for outlier removal in the bounding box computation\n    std::vector<double> & m_errors_hist;\n    double m_max_valid_triangulation_error; // used for outlier removal based on user thresh\n    Mutex& m_mutex;\n    const ProgressCallback& m_progress;\n    float m_inc_amt;\n\n    // This is growing a bbox of points in point projection and Z\n    // values which are altitude.\n    struct GrowBBoxAccumulator {\n      BBox3 bbox;\n      void operator()(Vector3 const& v) {\n        if (!std::isnan(v.z()))\n          bbox.grow(v);\n      }\n    };\n\n    struct ErrorHistAccumulator{\n      std::vector<double> & m_hist;\n      double m_max_val;\n      ErrorHistAccumulator(std::vector<double>& hist, double max_val):\n        m_hist(hist), m_max_val(max_val) {}\n      void operator()(double err) {\n        if (err == 0) return; // null errors come from invalid pixels\n        int len = m_hist.size();\n        int k = round((len-1)*std::min(err, m_max_val)/m_max_val);\n        if (k >= 0 && k < len && m_max_val > 0) {\n          // This is a bugfix for an observed situation when err is NaN.\n          // In that case the rounding returns a negative integer.\n          m_hist[k]++;\n        }\n      }\n    };\n\n  public:\n    SubBlockBoundaryTask(ImageViewRef<Vector3> const& view,\n                         int sub_block_size,\n                         BBox2i const& image_bbox,\n                         BBox3       & global_bbox,\n                         std::vector<BBoxPair>& boundaries,\n                         ImageViewRef<double> const& error_image,\n                         double estim_max_error,\n                         vw::BBox3 const& estim_proj_box,\n                         std::vector<double> & errors_hist,\n                         double max_valid_triangulation_error,\n                         Mutex& mutex, const ProgressCallback& progress, float inc_amt) :\n      m_view(view.impl()), m_sub_block_size(sub_block_size),\n      m_image_bbox(image_bbox),\n      m_global_bbox(global_bbox), m_point_image_boundaries(boundaries),\n      m_error_image(error_image), m_estim_max_error(estim_max_error),\n      m_estim_proj_box(estim_proj_box),\n      m_errors_hist(errors_hist), m_max_valid_triangulation_error(max_valid_triangulation_error),\n      m_mutex(mutex), m_progress(progress), m_inc_amt(inc_amt) {}\n\n    void operator()() {\n      ImageView<Vector3> local_image = crop(m_view, m_image_bbox);\n\n      bool remove_outliers_with_pct = (!m_errors_hist.empty());\n      ImageView<double> local_error;\n      if (remove_outliers_with_pct || m_max_valid_triangulation_error > 0.0)\n        local_error = crop(m_error_image, m_image_bbox);\n\n      // Further subdivide into boundaries so that prerasterize will\n      // only query what it needs.\n      std::vector<BBox2i> blocks = subdivide_bbox(m_image_bbox, m_sub_block_size,\n                                                  m_sub_block_size);\n      BBox3 local_union;\n      std::list<BBoxPair> solutions;\n      std::vector<double> local_hist(m_errors_hist.size(), 0);\n      bool nonempty_estim_proj_box = (!m_estim_proj_box.empty());\n\n      for (size_t i = 0; i < blocks.size(); i++) {\n        BBox3 pts_bdbox;\n        ImageView<Vector3> local_image2 = crop(local_image, blocks[i] - m_image_bbox.min());\n\n        // See if to filter by user-provided m_max_valid_triangulation_error.\n        // Otherwise try to make use of m_estim_max_error if it was found.\n        // If this is not provided we will later estimate and use such a value automatically\n        // when doing the gridding.\n        ImageView<double> local_error2;\n        if (m_max_valid_triangulation_error > 0 || m_estim_max_error > 0)\n          local_error2 = crop(local_error, blocks[i] - m_image_bbox.min());\n\n        for (int col = 0; col < local_image2.cols(); col++) {\n          for (int row = 0; row < local_image2.rows(); row++) {\n\n            // Skip invalid points\n            if (std::isnan(local_image2(col, row).z()))\n              continue;\n\n            // Skip outliers, points not in the estimated bounding box\n            if (nonempty_estim_proj_box &&\n                !m_estim_proj_box.contains(local_image2(col, row))) {\n              continue;\n            }\n\n            if (m_max_valid_triangulation_error > 0) {\n              if (local_error2(col, row) > m_max_valid_triangulation_error)\n                continue;\n            } else if (m_estim_max_error > 0) {\n              if (local_error2(col, row) > m_estim_max_error)\n                continue;\n            }\n            pts_bdbox.grow(local_image2(col, row));\n          }\n        }\n\n        if (pts_bdbox.min().x() <= pts_bdbox.max().x() &&\n            pts_bdbox.min().y() <= pts_bdbox.max().y()) {\n\n          // If the length is 0 along some dimension, grow it by a small amount\n          // as otherwise this data point will not be included in the bounding box.\n          for (int i = 0; i < 3; i++) {\n            if (std::isinf(pts_bdbox.min()[i]) || std::isinf(pts_bdbox.max()[i]))\n              continue;\n            if (pts_bdbox.min()[i] == pts_bdbox.max()[i])\n              pts_bdbox.max()[i] = \n                std::nextafter(pts_bdbox.max()[i], \n                               std::numeric_limits<double>::max());\n          }\n\n          local_union.grow(pts_bdbox);\n          solutions.push_back(std::make_pair(pts_bdbox, blocks[i]));\n        }\n\n        if (remove_outliers_with_pct) {\n          ErrorHistAccumulator error_accum(local_hist, m_estim_max_error);\n          for_each_pixel(crop(local_error, blocks[i] - m_image_bbox.min()),\n                         error_accum);\n        }\n      }\n\n      // Append to the global list of boxes and expand the point cloud\n      // bounding box.\n      if (local_union != BBox3()) {\n        Mutex::Lock lock(m_mutex);\n        for (std::list<BBoxPair>::const_iterator it = solutions.begin();\n              it != solutions.end(); it++) {\n          m_point_image_boundaries.push_back(*it);\n        }\n\n        m_global_bbox.grow(local_union);\n\n        if (remove_outliers_with_pct)\n          for (int i = 0; i < (int)m_errors_hist.size(); i++)\n            m_errors_hist[i] += local_hist[i];\n\n        m_progress.report_incremental_progress(m_inc_amt);\n      }\n    }\n  }; // End function operator()\n\n  void remove_outliers(ImageView<Vector3> & image, ImageViewRef<double> const& errors,\n                       double error_cutoff, BBox2i const& box) {\n\n    // Mask as NaN points above triangulation error\n    if (error_cutoff < 0)\n      return; // nothing to do\n\n    double nan = std::numeric_limits<double>::quiet_NaN();\n    ImageView<float> error_copy = crop(errors, box);\n\n    VW_ASSERT(image.cols() == error_copy.cols() &&\n              image.rows() == error_copy.rows(),\n              ArgumentErr() << \"Size mis-match in remove_outliers().\");\n\n    for (int col = 0; col < image.cols(); col++) {\n      for (int row = 0; row < image.rows(); row++) {\n        if (error_copy(col, row) > error_cutoff) {\n          image(col, row).z() = nan;\n        }\n      }\n    }\n\n  }\n\n  void filter_by_median(ImageView<Vector3> & image, Vector2 const& median_filter_params) {\n\n    // If the point cloud height at the current point differs by more\n    // than the given threshold from the median of heights in the\n    // window of given size centered at the point, remove it as an outlier.\n\n    int    half   = median_filter_params[0]/2; // half window size\n    double thresh = median_filter_params[1];\n    if (half <= 0 || thresh <= 0)\n      return;\n\n    int nc = image.cols(), nr = image.rows(); // shorten\n    double nan = std::numeric_limits<double>::quiet_NaN();\n\n    ImageView<Vector3> image_out = copy(image);\n\n    for (int col = 0; col < image.cols(); col++) {\n      for (int row = 0; row < image.rows(); row++) {\n\n        if (std::isnan(image(col, row).z()))\n          continue;\n\n        std::vector<double> vals;\n        for (int c = std::max(col-half, 0); c <= std::min(col+half, nc-1); c++) {\n          for (int r = std::max(row-half, 0); r <= std::min(row+half, nr-1); r++) {\n            if (std::isnan(image(c, r).z()))\n              continue;\n            vals.push_back(image(c, r).z());\n          }\n        }\n        double median = vw::math::destructive_median(vals);\n        if (fabs(median - image(col, row).z()) > thresh) {\n          image_out(col, row).z() = nan;\n        }\n      }\n    }\n\n    image = copy(image_out);\n  }\n\n  // TODO: This function should live somewhere else!\n  // Erode this many pixels around invalid pixels\n  void erode_image(ImageView<Vector3> & image, int erode_len) {\n\n    if (erode_len <= 0) // No erode, we are finished!\n      return;\n\n    int    nc      = image.cols(),\n           nr      = image.rows(); // shorten\n    double nan     = std::numeric_limits<double>::quiet_NaN();\n    int    max_col = nc - 1;\n    int    max_row = nr - 1;\n\n    // Create a buffer to modify and a pointer to allow easy\n    //  swapping of which image we are writing to.\n    // - The first write is to the input image, so we don't have to do extra copies with one pass.\n    ImageView<Vector3>  buffer = copy(image);\n    ImageView<Vector3>* read_ptr  = &buffer;\n    ImageView<Vector3>* write_ptr = &image;\n    ImageView<Vector3>* temp_ptr = 0;\n\n    // One pass per erode length\n    for (int pass = 0; pass < erode_len; pass++) {\n\n      // Loop through the entire image\n      for (int col = 0; col < nc; col++) {\n        int start_col = std::max(col-1, 0);\n        int stop_col  = std::min(col+1, max_col);\n        for (int row = 0; row < nr; row++) {\n          int start_row = std::max(row-1, 0);\n          int stop_row  = std::min(row+1, max_row);\n\n          // Loop through bounds checked border 1 region around this pixel\n          for (int c = start_col; c <= stop_col; c++) {\n            for (int r = start_row; r <= stop_row; r++) {\n              // If any of these pixels are bad, throw out this pixel\n              if (std::isnan(read_ptr->operator()(c, r).z()))\n                write_ptr->operator()(col, row).z() = nan;\n            }\n          } // End inner erode double loop\n\n        }\n      } // End double loop through image pixels\n\n      // Swap the read and write buffer pointers for the next pass\n      // - No need to make copies each time, the nan regions will just keep expanding.\n      temp_ptr  = write_ptr;\n      write_ptr = read_ptr;\n      read_ptr  = temp_ptr;\n\n    } // end passes\n\n    // If we had an even number of erode passes, the last write was to the temp\n    //  buffer and we need to copy it back to the input image.\n    if ((erode_len % 2) == 0)\n      image = copy(buffer);\n  }\n\n  // Given a histogram as a vector of counts, based on binning values\n  // in the interval [0, max_val] with n bins, find a given percentile\n  // error. Here, pct is in [0, 100].\n  double percentile_error(std::vector<double> const& hist, double max_val, double pct) {\n\n    double pct_ratio = pct / 100.0;\n\n    // Total number of counts in the histogram\n    int hist_size = hist.size();\n    vw::int64 num_errors = 0;\n    for (int s = 0; s < hist_size; s++)\n      num_errors += hist[s];\n\n    // The index so that the number of counts up to index is the fraction pct/100.0\n    // of the total number of counts.\n\n    int cutoff_index = 0;\n    vw::int64 sum = 0; // to protect against overflow when adding many numbers\n    for (int s = 0; s < hist_size; s++) {\n      sum += hist[s];\n      if (sum >= pct_ratio * num_errors) {\n        cutoff_index = s;\n        break;\n      }\n    }\n\n    return max_val * cutoff_index / double(hist_size);\n  }\n\n  OrthoRasterizerView::OrthoRasterizerView\n  (ImageViewRef<Vector3> point_image, ImageViewRef<double> texture,\n   double search_radius_factor, double sigma_factor, int pc_tile_size,\n   vw::BBox2 const& projwin, bool gdal_tap,\n   OutlierRemovalMethod outlier_removal_method,\n   Vector2 const& remove_outliers_params,\n   ImageViewRef<double> const& error_image,\n   double estim_max_error, vw::BBox3 const& estim_proj_box,\n   double max_valid_triangulation_error,\n   Vector2 median_filter_params, int erode_len, bool has_las_or_csv,\n   std::string const& filter,\n   double default_grid_size_multiplier,\n   std::int64_t * num_invalid_pixels, vw::Mutex *count_mutex,\n   const ProgressCallback& progress):\n    // Ensure all members are initiated, even if to temporary values\n    m_point_image(point_image), m_texture(ImageView<float>(1,1)),\n    m_bbox(BBox3()), m_snapped_bbox(BBox3()), m_spacing(0.0), m_default_spacing(0.0),\n    m_default_spacing_x(0.0), m_default_spacing_y(0.0),\n    m_search_radius_factor(search_radius_factor),\n    m_sigma_factor(sigma_factor),\n    m_default_value(0),\n    m_min_z_as_default(true), m_use_alpha(false),\n    m_block_size(pc_tile_size),\n    m_projwin(projwin), m_gdal_tap(gdal_tap),\n    m_error_image(error_image), m_error_cutoff(-1.0),\n    m_median_filter_params(median_filter_params), m_erode_len(erode_len),\n    m_default_grid_size_multiplier(default_grid_size_multiplier),\n    m_num_invalid_pixels(num_invalid_pixels),\n    m_count_mutex(count_mutex) {\n\n    *m_num_invalid_pixels = 0; // Init counter\n    set_texture(channel_cast<float>(channels_to_planes(texture.impl())));\n\n    // Convert the filter from string to enum, to speed up checking against it later\n    m_percentile = -1; // ensure it is initialized\n    if (filter      == \"weighted_average\") m_filter = asp::f_weighted_average;\n    else if (filter == \"min\") m_filter = asp::f_min;\n    else if (filter == \"max\") m_filter = asp::f_max;\n    else if (filter == \"mean\") m_filter = asp::f_mean;\n    else if (filter == \"median\") m_filter = asp::f_median;\n    else if (filter == \"stddev\") m_filter = asp::f_stddev;\n    else if (filter == \"count\") m_filter = asp::f_count;\n    else if (filter == \"nmad\") m_filter = asp::f_nmad;\n    else if (sscanf (filter.c_str(), \"%lf-pct\", &m_percentile) == 1)\n      m_filter = asp::f_percentile;\n    else\n    vw_throw(ArgumentErr() << \"OrthoRasterize: unknown filter: \" << filter << \".\\n\");\n\n    //dump_image(\"img\", BBox2(0, 0, 3000, 3000), point_image);\n\n    // Compute the bounding box that encompasses tiles within the image\n    //\n    // They're used for querying what part of the image we need\n    VW_OUT(DebugMessage,\"asp\") << \"Computing raster bounding box.\\n\";\n\n    int num_bins = 1024;\n    std::vector<double> errors_hist;\n    if (outlier_removal_method != NO_OUTLIER_REMOVAL_METHOD) {\n      // Need to compute the histogram of all errors in the error image\n      errors_hist = std::vector<double>(num_bins, 0.0);\n    }\n\n    // Subdivide each block into smaller chunks. Note: small chunks\n    // greatly increase the memory usage and run-time for very large\n    // images (because they are very many). As such, make the chunks\n    // bigger for bigger images.\n    // Creating each task also has overhead from copying the\n    // georeferences.\n    // TODO(oalexan1): Check how big these are. Maybe\n    // they should be as many tasks as there are threads or 2x that.\n    double s = 10000.0;\n    int sub_block_size\n      = int(double(point_image.cols())*double(point_image.rows())/(s*s));\n    sub_block_size = std::max(1, sub_block_size);\n    sub_block_size = int(round(pow(2.0, floor(log(sub_block_size)/log(2.0)))));\n    sub_block_size = std::max(16, sub_block_size);\n    sub_block_size = std::min(ASP_MAX_SUBBLOCK_SIZE, sub_block_size);\n    std::vector<BBox2i> blocks = subdivide_bbox(m_point_image, m_block_size, m_block_size);\n\n    // Find the bounding box of each subblock, stored in\n    // m_point_image_boundaries, together with other info by\n    // searching through the image.\n    FifoWorkQueue queue(vw_settings().default_num_threads());\n    typedef SubBlockBoundaryTask task_type;\n    Mutex mutex;\n    float inc_amt = 1.0 / float(blocks.size());\n    for (size_t i = 0; i < blocks.size(); i++) {\n      boost::shared_ptr<task_type>\n        task(new task_type(m_point_image, sub_block_size, blocks[i],\n                           m_bbox, m_point_image_boundaries,\n                           error_image, estim_max_error, estim_proj_box, errors_hist,\n                           max_valid_triangulation_error,\n                           mutex, progress, inc_amt));\n      queue.add_task(task);\n    }\n    queue.join_all();\n    progress.report_finished();\n\n    if (m_bbox.empty())\n      vw_throw(ArgumentErr() << \"OrthoRasterize: Input point cloud is empty!\\n\");\n\n    // Override with user's projwin, if specified\n    if (m_projwin != BBox2()) {\n      subvector(m_bbox.min(), 0, 2) = m_projwin.min();\n      subvector(m_bbox.max(), 0, 2) = m_projwin.max();\n    }\n\n    VW_OUT(DebugMessage,\"asp\") << \"Point cloud boundary is \" << m_bbox << \"\\n\";\n\n    if (outlier_removal_method != NO_OUTLIER_REMOVAL_METHOD) {\n\n      // Per user request, find some error percentiles to print.\n      std::map<double, double> percentiles = {{25.0, 0.0}, {50.0, 0.0}, {75.0, 0.0},\n                                              // The user-percentile\n                                              {remove_outliers_params[0], 0.0}};\n\n      for (auto it = percentiles.begin(); it != percentiles.end(); it++)\n        percentiles[it->first] = percentile_error(errors_hist, estim_max_error,\n                                                  it->first);\n\n      vw::int64 num_samples = 0; // to protect against overflow when adding many numbers\n      for (int s = 0; s < errors_hist.size(); s++)\n        num_samples += errors_hist[s];\n\n      // Find the outlier cutoff from the histogram of all errors.\n      // The cutoff is the outlier factor times the percentile of the errors.\n      double user_percentile = percentiles[remove_outliers_params[0]];\n\n      vw_out() << \"Collected a sample of \" << num_samples << \" positive triangulation errors.\\n\";\n      vw_out() << \"Error percentiles: \"\n               << \"Q1 (25%): \" << percentiles[25.0] << \", \"\n               << \"Q2 (50%): \" << percentiles[50.0] << \", \"\n               << \"Q3 (75%): \" << percentiles[75.0] << \".\"\n               << std::endl;\n\n      // Multiply by the outlier factor\n      if (outlier_removal_method == PERCENTILE_OUTLIER_METHOD) {\n        double factor = remove_outliers_params[1];       // e.g., 3.0\n        m_error_cutoff = factor * user_percentile;\n        vw_out() << \"Computing triangulation error cutoff based on --remove-outliers-params.\\n\";\n      } else if (outlier_removal_method == TUKEY_OUTLIER_METHOD) {\n        vw_out() << \"Using as outlier cutoff the Tukey formula Q3 + 1.5*(Q3 - Q1).\" << std::endl;\n        m_error_cutoff = percentiles[75.0] + 1.5*(percentiles[75.0] - percentiles[25.0]);\n      } else {\n        vw_throw(ArgumentErr() << \"Unexpected choice for outlier removal method.\\n\");\n      }\n\n      vw_out() << \"Triangulation error cutoff is \" << m_error_cutoff\n               << \" meters.\\n\";\n\n    } else if (max_valid_triangulation_error > 0.0) {\n      m_error_cutoff = max_valid_triangulation_error;\n      vw_out() << \"Manual triangulation error cutoff is \" << m_error_cutoff\n               << \" meters.\\n\";\n    }\n\n    // Find the width and height of the median point cloud pixel in\n    // projected coordinates. For las or csv files, this approach\n    // does not work.\n    int len = m_point_image_boundaries.size();\n    if (!has_las_or_csv) {\n      // This vectors can be large, so don't keep them for too long\n      std::vector<double> vx, vy;\n      vx.reserve(len); vx.clear();\n      vy.reserve(len); vy.clear();\n      BOOST_FOREACH(BBoxPair const& boundary, m_point_image_boundaries) {\n        if (boundary.first.empty())\n          continue;\n        vx.push_back(boundary.first.width() /sub_block_size);\n        vy.push_back(boundary.first.height()/sub_block_size);\n      }\n      std::sort(vx.begin(), vx.end());\n      std::sort(vy.begin(), vy.end());\n\n      if (len > 0) {\n        // Get the median\n        // TODO(oalexan1): This is not robust. For lro nac, vertical resolution\n        // and horizontal resolution differ by a factor of 4, e.g.,\n        // 0.5 m and 2 m. The median can be one of the two, which is\n        // wrong.  This code should be an average of the values in the\n        // [25%, 75%] range.\n        // TODO(oalexan1): Integrate with the logic for mapproject.\n        // https://github.com/NeoGeographyToolkit/StereoPipeline/issues/173\n        m_default_spacing_x = vx[(int)(0.5*len)];\n        m_default_spacing_y = vy[(int)(0.5*len)];\n      }\n    }\n\n    return;\n  } // End OrthoRasterizerView Constructor\n\n  void OrthoRasterizerView::set_texture(ImageViewRef<float> texture) {\n    VW_ASSERT(texture.cols() == m_point_image.cols() &&\n              texture.rows() == m_point_image.rows(),\n    ArgumentErr() << \"Orthorasterizer: set_texture() failed.\"\n                  << \" Texture dimensions must match point image dimensions.\");\n    m_texture = texture;\n  }\n\n  // This is kind of like part 2 of the constructor\n  // - This function finalizes the spacing and generates a spacing-snapped BBox.\n  void OrthoRasterizerView::initialize_spacing(const double spacing) {\n\n    // This must happen after the bounding box was computed, but before setting\n    // the spacing. We choose the coarsest of the two spacings\n    m_default_spacing = std::max(m_default_spacing_x, m_default_spacing_y);\n    \n    if (spacing > 0 && m_default_spacing > 0 && spacing < m_default_spacing) {\n      if (spacing < 0.001 * m_default_spacing)\n        vw::vw_throw(vw::ArgumentErr() \n          << \"The user-provided grid size (--tr) is so small that likely it is in degrees, \"\n          << \"while meters are expected.\\n\");\n        // For a lesser discrepancy, just print a warning.\n        vw_out(vw::WarningMessage) \n          << \"The user-provided grid size (--tr) is \" << spacing << \", \"\n          << \"which is smaller than the auto-estimated grid size of \" \n          << m_default_spacing << \". Likely the DEM will not be accurate.\\n\";\n    }\n        \n    // Set the sampling rate (i.e. spacing between pixels)\n    this->set_spacing(spacing);\n    VW_OUT(DebugMessage,\"asp\") << \"Pixel spacing is \" << m_spacing << \" pnt/px\\n\";\n\n    // We will snap the box so that its corners are integer multiples\n    // of the grid size. This ensures that any two DEMs\n    // with the same grid size and overlapping grids have those\n    // grids match perfectly.\n    m_snapped_bbox = m_bbox;\n\n    // If the user wants to use m_search_radius_factor to do filling,\n    // expand the box to allow the DEM to grow.\n    if (m_search_radius_factor > 0)\n      m_snapped_bbox.expand(spacing*m_search_radius_factor);\n\n    asp::snapBBox3ToGrid(m_snapped_bbox, m_spacing);\n\n    // Override with user's projwin, if specified\n    if (m_projwin != BBox2()) {\n      subvector(m_snapped_bbox.min(), 0, 2) = m_projwin.min();\n      subvector(m_snapped_bbox.max(), 0, 2) = m_projwin.max();\n\n      if (!m_gdal_tap) {\n        // The proj win takes into account that each pixel's physical size is\n        // m_spacing. So it is biased by half a pixel outwards from the snapped\n        // box. Compensate for that here.\n        m_snapped_bbox.min() += Vector3(m_spacing/2.0, m_spacing/2.0, 0);\n        m_snapped_bbox.max() -= Vector3(m_spacing/2.0, m_spacing/2.0, 0);\n      }\n      asp::snapBBox3ToGrid(m_snapped_bbox, m_spacing);\n    }\n\n  } // End function initialize_spacing()\n\n  // Function to convert pixel coordinates to the point domain\n  BBox3 OrthoRasterizerView::pixel_to_point_bbox(BBox2 const& inbox) const {\n    BBox3 outbox = m_snapped_bbox;\n    \n    // Adjust for --gdal-tap\n    double d = 0.0;\n    if (m_gdal_tap)\n      d = m_spacing/2.0;\n      \n    outbox.min().x() = m_snapped_bbox.min().x() + ((double(inbox.min().x()))\n                                                   * m_spacing) + d;\n    outbox.max().x() = m_snapped_bbox.min().x() + ((double(inbox.max().x()))\n                                                   * m_spacing) + d;\n    outbox.min().y() = m_snapped_bbox.min().y() + ((double(rows() - inbox.max().y()))\n                                                   * m_spacing) + d;\n    outbox.max().y() = m_snapped_bbox.min().y() + ((double(rows() - inbox.min().y()))\n                                                   * m_spacing) + d;\n    return outbox;\n  }\n\n  /// \\cond INTERNAL\n  OrthoRasterizerView::prerasterize_type\n  OrthoRasterizerView::prerasterize(BBox2i const& bbox) const {\n\n    BBox2i outbox = bbox;\n\n    // bugfix, ensure we see enough beyond current tile\n    outbox.expand((int)ceil(std::max(m_search_radius_factor, 5.0)));\n\n    // Used to find which points to add are within range\n    BBox3 local_3d_bbox = pixel_to_point_bbox(outbox);\n\n    ImageView<double> d_buffer, weights;\n\n    // Given a DEM grid point, search for cloud points within the\n    // circular region of radius equal to grid size. As such, a\n    // given cloud point may contribute to multiple DEM points, but\n    // with different weights (set by Gaussian). We make this radius\n    // no smaller than the default DEM spacing. Search radius can be\n    // over-ridden by user.\n    double search_radius;\n    if (m_search_radius_factor <= 0.0)\n      search_radius = std::max(m_spacing, m_default_spacing);\n    else\n      search_radius = m_spacing*m_search_radius_factor;\n    asp::Point2Grid point2grid(outbox.width(),\n                               outbox.height(),\n                               d_buffer, weights,\n                               local_3d_bbox.min().x(),\n                               local_3d_bbox.min().y(),\n                               m_spacing, m_default_spacing,\n                               search_radius, m_sigma_factor,\n                               m_filter, m_percentile);\n\n    // Set up the default color value\n    double min_val = 0.0;\n    if (m_use_alpha) {\n      // use this dummy value to denote transparency\n      min_val = std::numeric_limits<float>::min();\n    } else if (m_min_z_as_default) {\n      min_val = m_snapped_bbox.min().z();\n    } else {\n      min_val = m_default_value;\n    }\n\n    point2grid.Clear(min_val);\n\n    // For each block in the DEM space intersecting local_3d_bbox,\n    // find the corresponding blocks in the point cloud space.  We\n    // use here a map since we'd like to group together the point\n    // cloud blocks which fall within the same 256 x 256 tile, to do\n    // their union instead of them individually, for reasons of speed.\n    typedef std::map<BBox2i, BBox2i, compare_bboxes> BlockMapType;\n    typedef BlockMapType::iterator MapIterType;\n    BlockMapType blocks_map;\n    BOOST_FOREACH(BBoxPair const& boundary, m_point_image_boundaries) {\n      if (! local_3d_bbox.intersects(boundary.first))\n        continue;\n\n      BBox2i pc_block = boundary.second;\n\n      BBox2i snapped_block;\n      snapped_block.min() = m_block_size*floor(pc_block.min()/double(m_block_size));\n      snapped_block.max() = m_block_size*ceil(pc_block.max()/double(m_block_size));\n      MapIterType it = blocks_map.find(snapped_block);\n      if (it != blocks_map.end()) {\n        (it->second).grow(pc_block);\n      } else {\n        blocks_map.insert(std::pair<BBox2, BBox2>(snapped_block, pc_block));\n      }\n\n    }\n\n    if (blocks_map.empty()) {\n      // TODO: Don't include these pixels in the total?\n      { // Lock and update the total number of invalid pixels in this tile.\n        vw::Mutex::Lock lock(*m_count_mutex);\n        // Care here, convert to int64_t before multiplication, to avoid\n        // int32 overflow.\n        (*m_num_invalid_pixels) += std::int64_t(bbox.width())*std::int64_t(bbox.height());\n      }\n\n      return prerasterize_type(d_buffer, BBox2i(-outbox.min().x(), -outbox.min().y(), \n                                                cols(), rows()));\n    }\n\n    for (MapIterType it = blocks_map.begin(); it != blocks_map.end(); it++) {\n\n      BBox2i block = it->second;\n\n      block.crop(vw::bounding_box(m_point_image));\n\n      // Pull a copy of the input image in memory.  Expand the image\n      // to be able to see a bit beyond when filling holes.\n      BBox2i biased_block = block;\n      int bias = m_median_filter_params[0]/2 + m_erode_len;\n      biased_block.expand(bias);\n      biased_block.crop(vw::bounding_box(m_point_image));\n      ImageView<Vector3> point_copy = crop(m_point_image, biased_block);\n\n      remove_outliers(point_copy, m_error_image, m_error_cutoff, biased_block);\n      filter_by_median(point_copy, m_median_filter_params);\n      erode_image(point_copy, m_erode_len);\n\n      // Crop back to the area of interest\n      point_copy = crop(point_copy, block - biased_block.min());\n\n      ImageView<float> texture_copy = crop(m_texture, block);\n\n      typedef ImageView<Vector3>::pixel_accessor PointAcc;\n      PointAcc row_acc = point_copy.origin();\n      for (int32 row = 0; row < point_copy.rows(); row++) {\n        PointAcc point_ul = row_acc;\n\n        for (int32 col = 0; col < point_copy.cols(); col++) {\n\n          if (!std::isnan(point_copy(col, row).z()) &&\n                local_3d_bbox.contains(point_copy(col, row))) {\n            point2grid.AddPoint(point_copy(col, row).x(),\n                                point_copy(col, row).y(),\n                                texture_copy(col,  row));\n          }\n          point_ul.next_col();\n        } // End column loop\n        row_acc.next_row();\n      } // End row loop\n\n    }\n\n    point2grid.normalize();\n\n    // The software renderer returns an image which will render\n    // upside down in most image formats, so we correct that here.\n    // We also introduce transparent pixels into the result where necessary.\n    // TODO: Here can do flipping in place.\n    ImageView<PixelGray<float>> result;\n    result = flip_vertical(d_buffer);\n\n    // Loop through result here and count up how many pixels have been\n    // changed from the default value.\n    std::int64_t num_unset = 0;\n    for (int r = 0; r < result.rows(); r++) {\n      for (int c = 0; c < result.cols(); c++) {\n\n        Vector2i pix = Vector2(c, r) + outbox.min();\n        if (bbox.contains(pix)) {\n          //  Ignore the pixels in the temporary extension of bbox.\n          if (result(c,r) == min_val)\n            ++num_unset;\n        }\n      }\n    }\n    { // Lock and update the total number of invalid pixels in this tile.\n      vw::Mutex::Lock lock(*m_count_mutex);\n      (*m_num_invalid_pixels) += num_unset;\n    }\n\n    return prerasterize_type(result, BBox2i(-outbox.min().x(), -outbox.min().y(), \n                                            cols(), rows()));\n  }\n\n// When m_gdal_tap is true, the behavior subtly changes in a few places in a consistent way.\nint OrthoRasterizerView::cols() const {\n  double ratio = std::abs(m_snapped_bbox.max().x() - m_snapped_bbox.min().x()) / m_spacing;\n  return (int)round(ratio) + int(!m_gdal_tap);\n}\n\nint OrthoRasterizerView::rows() const {\n  double ratio = std::abs(m_snapped_bbox.max().y() - m_snapped_bbox.min().y()) / m_spacing;\n  return (int)round(ratio) + int(!m_gdal_tap);\n}\n\nint OrthoRasterizerView::planes() const {\n  return 1;\n}\n  \n// Return the affine georeferencing transform.\nvw::Matrix<double,3,3> OrthoRasterizerView::geo_transform() {\n  vw::Matrix<double,3,3> geo_transform;\n  geo_transform.set_identity();\n  geo_transform(0,0) = m_spacing;\n  geo_transform(1,1) = -m_spacing;\n  geo_transform(0,2) = m_snapped_bbox.min().x();\n  geo_transform(1,2) = m_snapped_bbox.max().y();\n  return geo_transform;\n}\n\nOrthoRasterizerView::pixel_accessor OrthoRasterizerView::origin() const {\n  return pixel_accessor(*this);\n}\n\nOrthoRasterizerView::result_type\nOrthoRasterizerView::operator()(int /*i*/, int /*j*/, int /*p*/) const {\n  vw::vw_throw(vw::NoImplErr()\n               << \"OrthoRasterizerView::operator()(double i, double j, int p) \"\n               << \"has not been implemented.\");\n  return pixel_type();\n}\n\nvoid OrthoRasterizerView::set_use_alpha(bool val) { m_use_alpha = val; }\nvoid OrthoRasterizerView::set_use_min_z_as_default(bool val) { m_min_z_as_default = val; }\nvoid OrthoRasterizerView::set_default_value(double val) { m_default_value = val; }\n\ndouble OrthoRasterizerView::default_value() {\n  if (m_min_z_as_default)\n    return m_bbox.min().z();\n  return m_default_value;\n}\n\n// If the DEM spacing is set to zero, we compute a DEM with\n// approximately the same pixel dimensions as the input image.\n// Note, however, that this could lead to a loss in DEM\n// resolution if the DEM is rotated from the orientation of the\n// original image.\nvoid OrthoRasterizerView::set_spacing(double val) {\n  if (val == 0.0)\n    m_spacing = m_default_spacing * m_default_grid_size_multiplier;\n  else\n    m_spacing = val;\n}\n\ndouble OrthoRasterizerView::spacing() const { return m_spacing; }\n\n// Convert the hole fill length from output image pixels to point cloud pixels.\nint OrthoRasterizerView::pc_hole_fill_len(int hole_fill_len) {\n  if (hole_fill_len == 0)\n    return 0;\n  VW_ASSERT(m_spacing > 0 && m_default_spacing > 0,\n            ArgumentErr() << \"Expecting positive DEM spacing.\");\n  return (int)round((m_spacing / m_default_spacing) * hole_fill_len);\n}\n\nBBox3 OrthoRasterizerView::bounding_box() const { return m_snapped_bbox; }\n\nImageViewRef<Vector3> OrthoRasterizerView::get_point_image() {\n  return m_point_image;\n}\n\nvoid OrthoRasterizerView::set_point_image(ImageViewRef<Vector3> point_image) {\n  m_point_image = point_image;\n}\n\n} // namespace asp\n"
  },
  {
    "path": "src/asp/Core/OrthoRasterizer.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file OrthoRasterizer.h\n///\n/// Given a point image and corresponding texture, this class\n/// bins and averages the point cloud on a regular grid over the [x,y]\n/// plane of the point image; producing an evenly sampled ortho-image\n/// with interpolated z values.\n\n#ifndef __ASP_CORE_ORTHORASTERIZER_H__\n#define __ASP_CORE_ORTHORASTERIZER_H__\n\n#include <asp/Core/Point2Grid.h>\n\n#include <vw/Core/Thread.h>\n#include <vw/Image/ImageView.h>\n#include <vw/Image/ImageViewRef.h>\n#include <vw/Math/BBox.h>\n#include <vw/Math/Matrix.h>\n#include <vw/Math/Vector.h>\n\nnamespace asp{\n\n  enum OutlierRemovalMethod {NO_OUTLIER_REMOVAL_METHOD, PERCENTILE_OUTLIER_METHOD,\n                             TUKEY_OUTLIER_METHOD};\n\n  typedef std::pair<vw::BBox3, vw::BBox2i> BBoxPair;\n\n  /// Given a point image and corresponding texture, this class\n  /// bins and averages the point cloud on a regular grid over the [x,y]\n  /// plane of the point image; producing an evenly sampled ortho-image\n  /// with interpolated z values.\n  class OrthoRasterizerView: public vw::ImageViewBase<OrthoRasterizerView> {\n    vw::ImageViewRef<vw::Vector3> m_point_image;\n    vw::ImageViewRef<float>   m_texture;\n    vw::BBox3  m_bbox, m_snapped_bbox; // bounding box of point cloud\n    double  m_spacing;         // point cloud units (usually m or deg) per pixel\n    double  m_default_spacing; // if user did not specify spacing\n    double  m_default_spacing_x;\n    double  m_default_spacing_y;\n    double  m_search_radius_factor;\n    double  m_sigma_factor;\n    double  m_default_value;\n    bool    m_min_z_as_default;\n    bool    m_use_alpha;\n    int     m_block_size;\n    vw::BBox2 m_projwin;\n    vw::ImageViewRef<double> const& m_error_image;\n    double m_error_cutoff;\n    vw::Vector2 m_median_filter_params;\n    int m_erode_len;\n    asp::FilterType m_filter;\n    double m_percentile;\n    double m_default_grid_size_multiplier;\n    std::int64_t * m_num_invalid_pixels; ///< Keep a count of nodata output pixels, needs to be pointer due to VW weirdness.\n    vw::Mutex  *m_count_mutex;        ///< A lock for m_num_invalid_pixels, needs to be pointer due to C++ weirdness.\n\n    // We could use a quad tree here but this should be a good enough improvement.\n    std::vector<BBoxPair> m_point_image_boundaries;\n    // These boundaries describe a point cloud 3D boundaries and then\n    // their location in the the point cloud image. These boxes are\n    // overlapping in the pc image X/Y domain to insure that\n    // everything is triangulated.\n\n    // Function to convert pixel coordinates to the point domain\n    vw::BBox3 pixel_to_point_bbox(vw::BBox2 const& px) const;\n\n  public:\n    typedef vw::PixelGray<float> pixel_type;\n    typedef const vw::PixelGray<float> result_type;\n    typedef vw::ProceduralPixelAccessor<OrthoRasterizerView> pixel_accessor;\n    bool m_gdal_tap;\n\n    /// Constructor. Must call initialize_spacing before using the object!!!\n    OrthoRasterizerView(vw::ImageViewRef<vw::Vector3> point_image,\n                        vw::ImageViewRef<double > texture,\n                        double  search_radius_factor,\n                        double  sigma_factor,\n                        int     pc_tile_size,\n                        vw::BBox2 const& projwin,\n                        bool gdal_tap,\n                        OutlierRemovalMethod outlier_removal_method,\n                        vw::Vector2 const& remove_outliers_params,\n                        vw::ImageViewRef<double> const& error_image,\n                        double  estim_max_error,\n                        vw::BBox3 const& estim_proj_box,\n                        double  max_valid_triangulation_error,\n                        vw::Vector2 median_filter_params,\n                        int     erode_len,\n                        bool    has_las_or_csv,\n                        std::string const& filter,\n                        double  default_grid_size_multiplier,\n                        std::int64_t * num_invalid_pixels,\n                        vw::Mutex *count_mutex,\n                        const vw::ProgressCallback& progress);\n\n    /// This must be called before the object can be used!\n    void initialize_spacing(double spacing=0.0);\n\n    /// You can change the texture after the class has been\n    /// initialized. The texture must be ImageViewRef<float> with the same\n    /// dimensions as the point image. Callers must apply\n    /// channel_cast<float>(channels_to_planes(...)) before calling this.\n    void set_texture(vw::ImageViewRef<float> texture);\n\n    int cols() const;\n    int rows() const;\n    int planes() const;\n\n    pixel_accessor origin() const;\n    result_type operator()(int /*i*/, int /*j*/, int /*p*/=0) const;\n\n    /// \\cond INTERNAL\n    typedef vw::CropView<vw::ImageView<pixel_type> > prerasterize_type;\n    prerasterize_type prerasterize(vw::BBox2i const& bbox) const;\n\n    template <class DestT>\n    inline void rasterize(DestT const& dest, vw::BBox2i const& bbox) const {\n      vw::rasterize(prerasterize(bbox), dest, bbox);\n    }\n    /// \\endcond\n\n    void set_use_alpha(bool val);\n    void set_use_min_z_as_default(bool val);\n    void set_default_value(double val);\n    double default_value();\n    void set_spacing(double val);\n    double spacing() const;\n    int pc_hole_fill_len(int hole_fill_len);\n    vw::BBox3 bounding_box() const;\n    vw::Matrix<double,3,3> geo_transform();\n    vw::ImageViewRef<vw::Vector3> get_point_image();\n    void set_point_image(vw::ImageViewRef<vw::Vector3> point_image);\n\n  };\n\n} // namespace asp\n\n#endif\n"
  },
  {
    "path": "src/asp/Core/OutlierProcessing.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Core/OutlierProcessing.h>\n\n#include <vw/Image/Statistics.h>\n#include <vw/Math/Statistics.h>\n#include <vw/Core/Stopwatch.h>\n\n#include <cmath>\nusing namespace vw;\n\nnamespace asp {\n\n// Estimate a bounding box without outliers. Note that individual percentage factors\n// are used in x, y, and z. These are supposed to around 0.75 or so. The outlier factor is 3.0\n// or so.\nvoid estimate_inliers_bbox(double pct_factor_x, double pct_factor_y, double pct_factor_z,\n                           double outlier_factor,\n                           std::vector<double> const& x_vals,\n                           std::vector<double> const& y_vals,\n                           std::vector<double> const& z_vals,\n                           vw::BBox3 & inliers_bbox) {\n  \n  // Initialize the output\n  inliers_bbox = BBox3();\n\n  double bx, ex, by, ey, bz, ez;\n  if (!vw::math::find_outlier_brackets(x_vals, pct_factor_x, outlier_factor, bx, ex))\n    return;\n  if (!vw::math::find_outlier_brackets(y_vals, pct_factor_y, outlier_factor, by, ey))\n    return;\n  if (!vw::math::find_outlier_brackets(z_vals, pct_factor_z, outlier_factor, bz, ez))\n    return;\n\n  // NaN values will result in an error further down\n  if (ex != ex || ey != ey || ez != ez)\n    return;  \n\n  // Need to compute the next double because the VW bounding box is\n  // exclusive at the top.\n  ex = std::nextafter(ex, std::numeric_limits<double>::max());\n  ey = std::nextafter(ey, std::numeric_limits<double>::max());\n  ez = std::nextafter(ez, std::numeric_limits<double>::max());\n\n  inliers_bbox.grow(Vector3(bx, by, bz));\n  inliers_bbox.grow(Vector3(ex, ey, ez));\n}\n\n// Get a generous estimate of the bounding box of the current set\n// while excluding outliers\nvoid estimate_points_bdbox(vw::ImageViewRef<vw::Vector3> const& proj_points,\n                           vw::ImageViewRef<double> const& error_image,\n                           vw::Vector2 const& remove_outliers_params,\n                           double estim_max_error,\n                           vw::BBox3 & inliers_bbox) {\n\n  // TODO(oalexan1): Here it may help to do several passes. First throw out the worst\n  // outliers, then estimate the box from the remaining points, etc.\n  \n  std::vector<double> x_vals, y_vals, z_vals;\n  for (int col = 0; col < proj_points.cols(); col++){\n    for (int row = 0; row < proj_points.rows(); row++){\n\n      // Avoid points marked as not valid\n      Vector3 P = proj_points(col, row);\n      if (P != P)\n        continue;\n\n      // Make use of the estimated error, if available\n      if (estim_max_error > 0 && error_image(col, row) > estim_max_error) \n        continue;\n\n      x_vals.push_back(P.x());\n      y_vals.push_back(P.y());\n      z_vals.push_back(P.z());\n    }\n  }\n\n  double pct_factor     = remove_outliers_params[0]/100.0; // e.g., 0.75\n  double outlier_factor = remove_outliers_params[1];       // e.g., 3.0.\n\n  // Make these more generous, as we want to throw out only the worst\n  // outliers. Note that we are even more generous in z, to avoid cutting\n  // of isolated mountain peaks. This is a bugfix.\n  double pct_factor_x = (1.0 + pct_factor)/2.0; // e.g., 0.875 \n  double pct_factor_y = (1.0 + pct_factor)/2.0; // e.g., 0.875 \n  double pct_factor_z = (3.0 + pct_factor)/4.0; // e.g., 0.9375\n\n  // Double this factor, now it will equal 6.  With a small factor, if\n  // the domain of the DEM is a rectangle rotated by 45 degrees, it\n  // may cut off corners.\n  outlier_factor *= 2.0;\n\n  // Call auxiliary function to do the estimation\n  estimate_inliers_bbox(pct_factor_x, pct_factor_y, pct_factor_z, outlier_factor, \n                        x_vals, y_vals, z_vals, inliers_bbox);\n  \n  return;\n}\n\n// A class to pick some samples to estimate the range of values\n// of a given dataset\nclass ErrorRangeEstimAccum: public ReturnFixedType<void> {\n  typedef double accum_type;\n  std::vector<accum_type> m_vals;\npublic:\n  typedef accum_type value_type;\n  \n  ErrorRangeEstimAccum() { m_vals.clear(); }\n  \n  void operator()( accum_type const& value ) {\n    // Don't add zero errors, those most likely came from invalid points\n    if (value > 0)\n      m_vals.push_back(value);\n  }\n  \n  int size(){\n    return m_vals.size();\n  }\n  \n  value_type value(Vector2 const& remove_outliers_params){\n    VW_ASSERT(!m_vals.empty(), ArgumentErr() << \"ErrorRangeEstimAccum: no valid samples\");\n    \n    // How to pick a representative value for maximum error?  The\n    // maximum error itself may be no good, as it could be very\n    // huge, and then sampling the range of errors will be distorted\n    // by that.  The solution adopted here: Find a percentile of the\n    // range of errors, mulitply it by the outlier factor, and\n    // multiply by another factor to ensure we don't underestimate\n    // the maximum. This value may end up being larger than the\n    // largest error, but at least it is is not grossly huge\n    // if just a few of the errors are very large.\n    std::sort(m_vals.begin(), m_vals.end());\n    int    len    = m_vals.size();\n    double pct    = remove_outliers_params[0]/100.0; // e.g., 0.75\n    double factor = remove_outliers_params[1];\n    int    k      = std::min(len - 1, (int)(pct*len));\n    \n    // Care here with empty sets\n      if (k >= 0) \n        return m_vals[k]*factor*4.0;\n      \n      return 0;\n  }\n  \n};\n  \n// Sample the image and get generous estimates (but without outliers)\n// of the maximum triangulation error and of the 3D box containing the\n// projected points. These will be tightened later.\ndouble estim_max_tri_error_and_proj_box(vw::ImageViewRef<vw::Vector3> const& proj_points,\n                                        vw::ImageViewRef<double> const& error_image,\n                                        vw::Vector2 const& remove_outliers_params,\n                                        vw::BBox3 & estim_proj_box) {\n\n  // Initialize the outputs\n  double estim_max_error = 0.0;\n  estim_proj_box = BBox3();\n  \n  if (error_image.rows() > 0 && error_image.cols() > 0 && \n      (error_image.cols() != proj_points.cols() || \n      error_image.rows() != proj_points.rows())) \n      vw_throw(ArgumentErr() \n                << \"The error image and point image must have the same size.\");\n\n  // Start with a 256 (2^8) by 256 sampling of the cloud\n  bool success = true;\n  for (int attempt = 8; attempt <= 18; attempt++) {\n    \n    double sample = (1 << attempt);\n    int32 subsample_amt = int32(norm_2(Vector2(proj_points.cols(), \n                                               proj_points.rows()))/sample);\n    \n    if (subsample_amt < 1)\n      subsample_amt = 1;\n    \n    PixelAccumulator<asp::ErrorRangeEstimAccum> error_accum;\n    if (error_image.cols() > 0 && error_image.rows() > 0) {\n      //Stopwatch sw2;\n      //sw2.start();\n      for_each_pixel(subsample(error_image, subsample_amt),\n                    error_accum,\n                    TerminalProgressCallback\n                    (\"asp\",\"Bounding box and triangulation error range estimation: \") );\n      if (error_accum.size() > 0) \n        estim_max_error = error_accum.value(remove_outliers_params);\n      else\n        success = false;\n        \n      //sw2.stop();\n      //vw_out(DebugMessage,\"asp\") << \"Elapsed time: \" << sw2.elapsed_seconds() << std::endl;\n    }\n\n    asp::estimate_points_bdbox(subsample(proj_points, subsample_amt),\n                               subsample(error_image, subsample_amt),\n                               remove_outliers_params,  estim_max_error,\n                               estim_proj_box);\n\n    if (estim_proj_box.empty()) \n      success = false;\n    \n    if (success || subsample_amt == 1) \n      break;\n      \n    vw_out() << \"DEM extent estimation failed. Check if your cloud is valid. \"\n             << \"Trying again with finer sampling.\\n\";\n  }\n  \n  return estim_max_error;\n}\n  \n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Core/OutlierProcessing.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#ifndef __ASP_CORE_OUTLIER_PROCESSING_H__\n#define __ASP_CORE_OUTLIER_PROCESSING_H__\n\n// Utilities for handling outliers\n\n#include <vw/Image/ImageViewRef.h>\n\n#include <vector>\n\nnamespace asp {\n\n// Estimate a bounding box without outliers. Note that individual percentage factors\n// are used in x, y, and z. These are supposed to around 0.75 or so. The outlier factor is 3.0\n// or so.\nvoid estimate_inliers_bbox(double pct_factor_x, double pct_factor_y, double pct_factor_z,\n                          double outlier_factor,\n                          std::vector<double> const& x_vals,\n                          std::vector<double> const& y_vals,\n                          std::vector<double> const& z_vals,\n                          vw::BBox3 & inliers_bbox);\n  \n// Sample the image and get generous estimates (but without outliers)\n// of the maximum triangulation error and of the 3D box containing the\n// projected points. These will be tightened later.\ndouble estim_max_tri_error_and_proj_box(vw::ImageViewRef<vw::Vector3> const& proj_points,\n                                        vw::ImageViewRef<double> const& error_image,\n                                        vw::Vector2 const& remove_outliers_params,\n                                        vw::BBox3 & estim_proj_box);\n  \n} // End namespace asp\n\n#endif//__ASP_CORE_OUTLIER_PROCESSING_H__\n"
  },
  {
    "path": "src/asp/Core/PdalUtils.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// TODO(oalexan1): Move all LAS logic to here from PointUtils.cc, \n// as that file is too big and very slow to compile.\n\n// References:\n// https://www.asprs.org/wp-content/uploads/2019/07/LAS_1_4_r15.pdf\n// https://pdal.io/en/2.7.2/project/docs.html\n// https://github.com/PDAL/PDAL/blob/master/pdal/Dimension.json\n\n/// \\file PdalUtils.cc\n///\n\n#include <asp/Core/PdalUtils.h>\n#include <asp/Core/PointUtils.h>\n#include <asp/Core/EigenUtils.h>\n\n#include <vw/Cartography/GeoReference.h>\n#include <vw/Core/ProgressCallback.h>\n\n#include <io/CopcReader.hpp>\n#include <io/LasHeader.hpp>\n#include <io/LasReader.hpp>\n#include <io/LasWriter.hpp>\n#include <pdal/Filter.hpp>\n#include <pdal/Options.hpp>\n#include <pdal/PointTable.hpp>\n#include <pdal/PointView.hpp>\n#include <pdal/Reader.hpp>\n#include <pdal/SpatialReference.hpp>\n#include <pdal/StageFactory.hpp>\n#include <pdal/Streamable.hpp>\n#include <pdal/util/ProgramArgs.hpp>\n\n#include <cmath>\nnamespace pdal {\n    \n// A class to produce a point cloud point-by-point, rather than\n// having it all in memory at the same time. It will be streamed to\n// disk. See the GDALReader in PDAL class for how to add more fields\n// and read from disk.\nclass PDAL_DLL StreamedCloud: public Reader, public Streamable {\n  \npublic:\n  std::string getName() const;\n  StreamedCloud(bool has_georef, \n                vw::ImageViewRef<vw::Vector3> point_image,\n                vw::ImageViewRef<double> error_image,\n                vw::ImageViewRef<float> intensity,\n                vw::ImageViewRef<double> horizontal_stddev,\n                vw::ImageViewRef<double> vertical_stddev,                \n                bool save_triangulation_error,\n                double max_valid_triangulation_error);\n  ~StreamedCloud();\n\nprivate:\n  virtual void initialize();\n  virtual void addDimensions(PointLayoutPtr layout);\n  virtual void ready(PointTableRef table);\n  virtual point_count_t read(PointViewPtr view, point_count_t num);\n  virtual void done(PointTableRef table);\n  virtual bool processOne(PointRef& point);\n  virtual void addArgs(ProgramArgs& args);\n\n  bool m_has_georef;\n  vw::ImageViewRef<vw::Vector3> m_point_image;\n  vw::ImageViewRef<double> m_error_image;\n  vw::ImageViewRef<float> m_intensity;\n  vw::ImageViewRef<double> m_horizontal_stddev;\n  vw::ImageViewRef<double> m_vertical_stddev;\n  bool m_save_triangulation_error;\n  double m_max_valid_triangulation_error;\n\n  // These are of type uint64_t\n  point_count_t m_col_count, m_row_count, m_cols, m_rows;\n  point_count_t m_count, m_size, m_num_valid_points, m_num_saved_points;\n\n  vw::TerminalProgressCallback m_tpc;\n};\n    \nstd::string StreamedCloud::getName() const {\n  return \"Ames Stereo Pipeline point cloud\";\n}\n\nStreamedCloud::StreamedCloud(bool has_georef,\n                             vw::ImageViewRef<vw::Vector3> point_image,\n                             vw::ImageViewRef<double> error_image,\n                             vw::ImageViewRef<float> intensity,\n                             vw::ImageViewRef<double> horizontal_stddev,\n                             vw::ImageViewRef<double> vertical_stddev,\n                             bool save_triangulation_error,\n                             double max_valid_triangulation_error):\n  m_has_georef(has_georef),\n  m_point_image(point_image), m_error_image(error_image), m_intensity(intensity),\n  m_horizontal_stddev(horizontal_stddev), m_vertical_stddev(vertical_stddev),\n  m_save_triangulation_error(save_triangulation_error),\n  m_max_valid_triangulation_error(max_valid_triangulation_error),\n  m_col_count(0), m_row_count(0),\n  m_cols(m_point_image.cols()), m_rows(m_point_image.rows()),\n  m_size(m_cols * m_rows), // careful here to avoid integer overflow\n  m_count(0), m_num_valid_points(0), m_num_saved_points(0),\n  m_tpc(vw::TerminalProgressCallback(\"asp\", \"\\t--> \")) {}\n\nStreamedCloud::~StreamedCloud() {}\n\nvoid StreamedCloud::initialize() {}\n\n// Set the cloud dimensions.\nvoid StreamedCloud::addDimensions(PointLayoutPtr layout) {\n  layout->registerDim(pdal::Dimension::Id::X);\n  layout->registerDim(pdal::Dimension::Id::Y);\n  layout->registerDim(pdal::Dimension::Id::Z);\n  \n  // Co-opt the W dimension for the intensity\n  if (m_intensity.cols() != 0 || m_intensity.rows() != 0)\n    layout->registerDim(pdal::Dimension::Id::W); // intensity  \n\n  // Co-opt the TextureU dimension for the triangulation error\n  if (m_save_triangulation_error)\n    layout->registerDim(pdal::Dimension::Id::TextureU);\n\n  // Co-opt the TextureV and TextureW dimensions for the horizontal and vertical stddev\n  if (m_horizontal_stddev.cols() != 0 || m_horizontal_stddev.rows() != 0)\n    layout->registerDim(pdal::Dimension::Id::TextureV); // horizontal stddev\n  if (m_vertical_stddev.cols() != 0 || m_vertical_stddev.rows() != 0)\n    layout->registerDim(pdal::Dimension::Id::TextureW); // vertical stddev    \n}\n\nvoid StreamedCloud::addArgs(ProgramArgs& args) {\n}\n\nvoid StreamedCloud::ready(PointTableRef table) {\n  m_count = 0;\n}\n\n// This function is used when a point cloud is formed fully in memory.\n// Not applicable here.\npoint_count_t StreamedCloud::read(PointViewPtr view, point_count_t numPts) {\n  throw pdal_error(\"The read() function must not be called in streaming mode.\");\n  return -1;\n}\n\n// Create one point at a time. Will ask for a point till the counter\n// reaches m_size.\nbool StreamedCloud::processOne(PointRef& point) {\n  \n  // Keep on going through the input cloud until a valid point\n  // is found or until we run out of points.\n  \n  bool save_intensity = (m_intensity.cols() != 0 || m_intensity.rows() != 0);\n  bool save_horizontal_stddev = (m_horizontal_stddev.cols() != 0 ||\n                                 m_horizontal_stddev.rows() != 0);\n  bool save_vertical_stddev = (m_vertical_stddev.cols() != 0 ||\n                               m_vertical_stddev.rows() != 0);\n  \n  while (1) {\n    \n    // Break the loop if no more points are available\n    if (m_count >= m_size)\n        return false; \n\n    // Note how we access in col, row order, per ASP conventions\n    vw::Vector3 xyz = m_point_image(m_col_count, m_row_count);\n    \n    // Skip no-data points and point above the max valid triangulation error\n    bool valid_xyz = ((!m_has_georef && xyz != vw::Vector3()) ||\n                    (m_has_georef  && !std::isnan(xyz.z())));\n    bool valid_tri_err = (m_max_valid_triangulation_error <= 0 ||\n                    m_error_image(m_col_count, m_row_count) <= \n                    m_max_valid_triangulation_error);\n\n    if (valid_xyz)\n      m_num_valid_points++;\n\n    if (valid_xyz && valid_tri_err) {\n      \n      point.setField(Dimension::Id::X, xyz[0]);\n      point.setField(Dimension::Id::Y, xyz[1]);\n      point.setField(Dimension::Id::Z, xyz[2]);\n      m_num_saved_points++;\n      \n      // Save the intensity as a double\n      if (save_intensity)\n        point.setField(Dimension::Id::W, m_intensity(m_col_count, m_row_count));\n        \n      // Save the triangulation error as a double\n      if (m_save_triangulation_error)\n        point.setField(Dimension::Id::TextureU, m_error_image(m_col_count, m_row_count));\n        \n      // Save the horizontal and vertical stddev as doubles\n      if (save_horizontal_stddev)\n        point.setField(Dimension::Id::TextureV, m_horizontal_stddev(m_col_count, m_row_count));\n      if (save_vertical_stddev)\n        point.setField(Dimension::Id::TextureW, m_vertical_stddev(m_col_count, m_row_count));\n    }\n\n    // Adjust the counters whether the point is good or not\n    m_col_count++;\n    if (m_col_count >= m_cols) {\n      m_col_count = 0;\n      m_row_count++;\n      m_tpc.report_fractional_progress(m_row_count, m_rows);\n    }\n    m_count++;\n    \n    // Break the loop if a good point was found\n    if (valid_xyz && valid_tri_err)\n      return true;\n  } // end while loop\n  \n  // This should not be reached\n  return false;\n}\n\nvoid StreamedCloud::done(PointTableRef table) {\n  m_tpc.report_finished();\n  \n  vw::vw_out () << \"Wrote: \" << m_num_saved_points << \" points.\" << std::endl;\n  if (m_max_valid_triangulation_error > 0.0) {\n    point_count_t num_excluded = m_num_valid_points - m_num_saved_points;\n    double percent = 100.0 * double(num_excluded)/double(m_num_valid_points);\n    percent = round(percent * 100.0)/100.0; // don't keep too many digits\n    vw::vw_out() << \"Excluded based on triangulation error: \" << num_excluded \n                 << \" points (\" << percent << \"%).\" << std::endl;\n  }\n  \n} // End function done\n\n// A class to read a point cloud from a file point by point, without\n// loading it fully in memory. The points are printed to the screen.\n// This can be used as a template for other readers, such as the \n// LasLoader class.\nclass PDAL_DLL StreamProcessor: public Writer, public Streamable {\n\npublic:\n  std::string getName() const;\n  StreamProcessor();\n  ~StreamProcessor();\n\nprivate:\n\n  virtual void addArgs(ProgramArgs& args);\n  virtual void initialize();\n  virtual void writeView(const PointViewPtr view);\n  virtual bool processOne(PointRef& point);\n  virtual void done(PointTableRef table);\n\n  StreamProcessor& operator=(const StreamProcessor&) = delete;\n  StreamProcessor(const StreamProcessor&) = delete;\n  StreamProcessor(const StreamProcessor&&) = delete;\n};\n\nstd::string StreamProcessor::getName() const { return \"StreamProcessor\"; }\n\nStreamProcessor::StreamProcessor() {}\n\nStreamProcessor::~StreamProcessor() {}\n\nvoid StreamProcessor::addArgs(ProgramArgs& args){}\n\nvoid StreamProcessor::initialize(){}\n\n// This will be called for each point in the cloud.\nbool StreamProcessor::processOne(PointRef& point) {\n  // Print the point coordinates\n  std::cout << \"Process point: \" \n            << point.getFieldAs<double>(Dimension::Id::X) <<  \", \" \n            << point.getFieldAs<double>(Dimension::Id::Y) << \", \" \n            << point.getFieldAs<double>(Dimension::Id::Z) << std::endl;\n  return true;  \n}\n\nvoid StreamProcessor::done(PointTableRef table) {\n}\n\nvoid StreamProcessor::writeView(const PointViewPtr view) {\n  throw pdal_error(\"The writeView() function must not be called in streaming mode.\");\n}\n\n} // end namespace pdal\n\nnamespace asp {\n\nbool georef_from_las(std::string const& las_file,\n                     vw::cartography::GeoReference & georef) {\n  \n  pdal::Options read_options;\n  read_options.add(\"filename\", las_file);\n\n  pdal::LasReader reader;\n  reader.setOptions(read_options);\n  pdal::QuickInfo qi = reader.preview();\n\n  std::string wkt = qi.m_srs.getWKT();\n  if (wkt.empty()) \n    return false;\n  \n  georef.set_wkt(wkt);\n  \n  return true;\n}\n\n// Read the number of points in the LAS file. For COPC files, we usually\n// care not for this, but for the number of points in a region.\nstd::int64_t las_file_size(std::string const& las_file) {\n  \n  pdal::Options read_options;\n  read_options.add(\"filename\", las_file);\n\n  pdal::LasReader reader;\n  reader.setOptions(read_options);\n  pdal::QuickInfo qi = reader.preview();\n\n  return qi.m_pointCount;\n}\n\n// Check if a file is in the LAS COPC format\nbool isCopc(std::string const& file) {\n\n  bool is_copc = false;\n  \n  if (!asp::is_las(file))\n    return false;\n    \n  try {\n    pdal::Options options;\n    options.add(\"filename\", file);\n\n    pdal::CopcReader reader;\n    reader.setOptions(options);\n    pdal::QuickInfo qi(reader.preview());\n    is_copc = qi.valid();\n  } catch (pdal::pdal_error const& e) {\n    is_copc = false;\n  }\n\n  return is_copc;\n} \n\n// Save a point cloud and triangulation error to the LAS format.\nvoid write_las(bool has_georef, vw::cartography::GeoReference const& georef,\n               vw::ImageViewRef<vw::Vector3> point_image,\n               vw::ImageViewRef<double> error_image,\n               vw::ImageViewRef<float> intensity,\n               vw::ImageViewRef<double> horizontal_stddev,\n               vw::ImageViewRef<double> vertical_stddev,\n               vw::Vector3 const& offset, vw::Vector3 const& scale,\n               bool compressed, bool save_triangulation_error,\n               double max_valid_triangulation_error,\n               std::string const& out_prefix) {\n\n  // The point image and error image must have the same dimensions\n  if ((error_image.cols() != 0 || error_image.rows() != 0) &&\n      (point_image.cols() != error_image.cols() ||\n      point_image.rows() != error_image.rows()))\n    vw::vw_throw(vw::ArgumentErr() \n                  << \"Expecting the point cloud image and the error image \"\n                  << \"to have the same dimensions.\\n\");\n\n  // If the intensity image is present, it must have the same dimensions\n  // as the point image.\n  if ((intensity.cols() != 0 || intensity.rows() != 0) &&\n      (point_image.cols() != intensity.cols() ||\n      point_image.rows() != intensity.rows()))\n    vw::vw_throw(vw::ArgumentErr() \n                  << \"Expecting the point cloud image and the intensity image (L.tif) \"\n                  << \"to have the same dimensions.\\n\");\n    \n  // Sanity checks for horizontal and vertical stddev images\n  if ((horizontal_stddev.cols() != 0 || horizontal_stddev.rows() != 0) &&\n      (point_image.cols() != horizontal_stddev.cols() ||\n      point_image.rows() != horizontal_stddev.rows()))\n    vw::vw_throw(vw::ArgumentErr() \n                  << \"Expecting the point cloud image and the horizontal stddev image \"\n                  << \"to have the same dimensions.\\n\");\n  if ((vertical_stddev.cols() != 0 || vertical_stddev.rows() != 0) &&\n      (point_image.cols() != vertical_stddev.cols() ||\n      point_image.rows() != vertical_stddev.rows()))\n    vw::vw_throw(vw::ArgumentErr() \n                  << \"Expecting the point cloud image and the vertical stddev image \"\n                  << \"to have the same dimensions.\\n\");\n      \n  // Streamed cloud structure\n  pdal::StreamedCloud stream_cloud(has_georef, point_image, error_image, intensity,\n                                   horizontal_stddev, vertical_stddev,\n                                   save_triangulation_error,\n                                   max_valid_triangulation_error);\n\n  // buf_size is the number of points that will be\n  // processed and kept in this table at the same time. \n  // A somewhat bigger value may result in some efficiencies.\n  int buf_size = 1000;\n  pdal::FixedPointTable t(buf_size);\n  stream_cloud.prepare(t);\n\n  // Set the output filename. The writer will compress the las file if the .laz\n  // extension is used.\n  std::string lasFile;\n  if (compressed)\n    lasFile = out_prefix + \".laz\";\n  else\n    lasFile = out_prefix + \".las\";\n  vw::vw_out() << \"Writing LAS file: \" << lasFile + \"\\n\";\n\n  pdal::Options write_options;\n  write_options.add(\"filename\", lasFile);\n  write_options.add(\"offset_x\", offset[0]);\n  write_options.add(\"offset_y\", offset[1]);\n  write_options.add(\"offset_z\", offset[2]);\n  write_options.add(\"scale_x\",  scale[0]);\n  write_options.add(\"scale_y\",  scale[1]);\n  write_options.add(\"scale_z\",  scale[2]);\n  \n  // LAS 1.4 instead of default LAS 1.2 is needed for advanced fields\n  if (save_triangulation_error || \n      intensity.cols() != 0 || intensity.rows() != 0 ||\n      horizontal_stddev.cols() != 0 || horizontal_stddev.rows() != 0 ||\n      vertical_stddev.cols() != 0 || vertical_stddev.rows() != 0) {\n    write_options.add(\"minor_version\", 4); \n    write_options.add(\"extra_dims\", \"all\");\n  }\n\n  if (has_georef)\n    write_options.add(\"a_srs\", georef.get_wkt());\n\n  pdal::LasWriter writer;\n  writer.setOptions(write_options);\n  writer.setInput(stream_cloud);\n  writer.prepare(t);\n  writer.execute(t);\n}\n\n// Read a LAS cloud and return a subset of it. This inherits from pdal::Writer\n// because it is a processing class. It brings in the data via a pdal::Reader\n// handle that is set when an instance of this is configured.\nclass PDAL_DLL LasProcessor: public pdal::Writer, public pdal::Streamable {\n\npublic:\n  LasProcessor(std::string const& file_name, std::int64_t num_points_to_load,\n              vw::BBox2 const& lonlat_box,\n              vw::cartography::GeoReference const& input_georef,\n              bool verbose, bool calc_shift,\n              std::int64_t num_total_points, \n              // Outputs\n              vw::Vector3 & shift, \n              Eigen::MatrixXd & data):\n  m_file_name(file_name),\n  m_num_points_to_load(num_points_to_load),\n  m_lonlat_box(lonlat_box),\n  m_input_georef(input_georef),\n  m_verbose(verbose),\n  m_calc_shift(calc_shift),\n  m_tpc(vw::TerminalProgressCallback(\"asp\", \"\\t--> \")),\n  m_num_total_points(num_total_points), \n  // Outputs\n  m_shift(shift), m_data(data) {\n    \n    m_data.conservativeResize(asp::DIM + 1, m_num_points_to_load);\n    m_has_las_georef = asp::georef_from_las(m_file_name, m_las_georef);\n    m_shift_was_calc = false;\n    m_points_count = 0;\n    \n    // We will randomly pick or not a point with probability load_ratio\n    m_load_ratio = (double)m_num_points_to_load/std::max(1.0, (double)m_num_total_points);\n\n    std::int64_t hundred = 100;\n    m_spacing = std::max(m_num_total_points/hundred, std::int64_t(1));\n    m_inc_amount = 1.0 / hundred;\n    if (m_verbose) \n      m_tpc.report_progress(0);\n  }\n  \n  ~LasProcessor() {}\n\n  virtual std::string getName() const { return \"sample streamer\"; }\n\nprivate:\n\n  std::string m_file_name;\n  std::int64_t m_num_points_to_load;\n  vw::BBox2 m_lonlat_box;\n  vw::cartography::GeoReference m_input_georef;\n  bool m_verbose;\n  bool m_calc_shift;\n  bool m_has_las_georef;\n  vw::cartography::GeoReference m_las_georef;\n  double m_load_ratio;\n  bool m_shift_was_calc;\n  std::int64_t m_points_count;\n  vw::TerminalProgressCallback m_tpc;\n  std::int64_t m_spacing;\n  double m_inc_amount;\n  std::int64_t m_num_total_points;\n  \n  // Aliases, to be returned to the caller\n  vw::Vector3 & m_shift;\n  Eigen::MatrixXd & m_data;\n  \n  virtual void addArgs(pdal::ProgramArgs& args) {}\n  virtual void initialize() {}\n\n  // This will be called for each point in the cloud.\n  virtual bool processOne(pdal::PointRef& point) {\n\n    if (m_points_count >= m_num_points_to_load)\n      return false; // done with reading points\n\n    // try next time is above the load ratio\n    double r = (double)std::rand()/(double)RAND_MAX;\n    if (r > m_load_ratio)\n      return true;\n    \n    // Current point\n    vw::Vector3 xyz(point.getFieldAs<double>(pdal::Dimension::Id::X),\n                    point.getFieldAs<double>(pdal::Dimension::Id::Y),\n                    point.getFieldAs<double>(pdal::Dimension::Id::Z));\n    \n    if (m_has_las_georef) {\n      // This is a projected point, convert to cartesian\n      vw::Vector2 ll = m_las_georef.point_to_lonlat(subvector(xyz, 0, 2));\n      xyz = m_las_georef.datum().geodetic_to_cartesian(vw::Vector3(ll[0], ll[1], xyz[2]));\n    }\n    \n    if (m_calc_shift && !m_shift_was_calc) {\n      m_shift = xyz;\n      m_shift_was_calc = true;\n    }\n    \n    // Skip points outside the given box. Here we use the input georef.\n    // It is assumed that if the box is non-empty then this georef is valid.\n    if (!m_lonlat_box.empty()) {\n      vw::Vector3 llh = m_input_georef.datum().cartesian_to_geodetic(xyz);\n      if (!m_lonlat_box.contains(subvector(llh, 0, 2)))\n        return true;\n    }\n    \n    // Save this point\n    for (int row = 0; row < asp::DIM; row++)\n      m_data(row, m_points_count) = xyz[row] - m_shift[row];\n    m_data(asp::DIM, m_points_count) = 1; // last field\n\n    if (m_verbose && m_points_count % m_spacing == 0) \n      m_tpc.report_incremental_progress(m_inc_amount);\n\n    m_points_count++;\n    \n    return true;  \n  }\n\n  virtual void writeView(const pdal::PointViewPtr view) {\n    throw pdal::pdal_error(\"The writeView() function must not be called in streaming mode.\");\n  }\n\n  // To be called after all the points are read.\n  virtual void done(pdal::PointTableRef table) {\n    m_data.conservativeResize(Eigen::NoChange, m_points_count);\n\n    if (m_verbose) \n      m_tpc.report_finished();\n  }\n  \n  LasProcessor& operator=(const LasProcessor&) = delete;\n  LasProcessor(const LasProcessor&) = delete;\n  LasProcessor(const LasProcessor&&) = delete;\n};\n\n// A filter to apply a transform to a cloud. Each point is processed in\n// streaming mode, without loading the entire point cloud into memory. May\n// adjust the scale and offset in the header of the output file.\n      \nclass PDAL_DLL TransformFilter: public pdal::Filter, public pdal::Streamable {\n\npublic:\n\n  std::string getName() const {\n      return \"transform_filter\";\n  }\n\n  TransformFilter(std::int64_t num_total_points, \n                  bool has_georef, \n                  vw::cartography::GeoReference const& georef,\n                  Eigen::MatrixXd const& T): \n        m_has_georef(has_georef), m_georef(georef), m_T(T), \n        m_tpc(vw::TerminalProgressCallback(\"asp\", \"\\t--> \")) {\n    \n    int hundred = 100;\n    m_spacing = std::max(num_total_points/hundred, std::int64_t(1));\n    m_inc_amount = 1.0 / double(hundred);\n    m_count = 0;\n  }\n\n  ~TransformFilter() {}\n\nprivate:\n\n  // Apply a transform to each point\n  virtual bool processOne(pdal::PointRef& point) {\n    \n    // Initial point\n    vw::Vector3 P(point.getFieldAs<double>(pdal::Dimension::Id::X),\n                  point.getFieldAs<double>(pdal::Dimension::Id::Y),\n                  point.getFieldAs<double>(pdal::Dimension::Id::Z));\n    \n    if (m_has_georef) {\n      // This is a projected point, convert to cartesian\n      vw::Vector2 ll = m_georef.point_to_lonlat(subvector(P, 0, 2));\n      P = m_georef.datum().geodetic_to_cartesian(vw::Vector3(ll[0], ll[1], P[2]));\n    }\n    \n    // Apply the transform\n    P = asp::apply_transform_to_vec(m_T, P);\n    \n    if (m_has_georef) {\n      // Go back to projected space\n      vw::Vector3 llh = m_georef.datum().cartesian_to_geodetic(P);\n      subvector(P, 0, 2) = m_georef.lonlat_to_point(subvector(llh, 0, 2));\n      P[2] = llh[2];\n    }\n    \n    // Put the point back\n    point.setField(pdal::Dimension::Id::X, P[0]);\n    point.setField(pdal::Dimension::Id::Y, P[1]);\n    point.setField(pdal::Dimension::Id::Z, P[2]);\n\n    // Update the progress and the counter\n    if (m_count % m_spacing == 0) \n      m_tpc.report_incremental_progress(m_inc_amount);\n    m_count++;  \n    \n    return true;\n  }\n  \n  virtual void done(pdal::PointTableRef table) {\n    m_tpc.report_finished();\n  }\n    \n  bool m_has_georef;\n  vw::cartography::GeoReference m_georef;\n  Eigen::MatrixXd m_T;\n  std::int64_t m_spacing;\n  double m_inc_amount;\n  std::int64_t m_count;\n  vw::TerminalProgressCallback m_tpc;\n  \n};\n\n// Set up a reader for a LAS or COPC file \nvoid setupLasOrCopcReader(std::string const& in_file,\n                          vw::BBox2 const& copc_win, bool copc_read_all,\n                          boost::shared_ptr<pdal::Reader>& pdal_reader,\n                          pdal::Options& read_options,\n                          std::int64_t & num_total_points) {\n\n  read_options.add(\"filename\", in_file);\n\n  if (asp::isCopc(in_file)) {\n    \n    // Set the input point cloud. COPC is a streaming format, and need to fetch\n    // the data in a box.\n    pdal_reader.reset(new pdal::CopcReader());\n    if (copc_win == vw::BBox2() && !copc_read_all)\n      vw::vw_throw(vw::ArgumentErr() \n         << \"Detected COPC file: \" << in_file << \".\\n\"\n         << \"Set either the copc-win or copc-read-all option (the precise names \"\n         << \"depends the invoked tool).\\n\");\n    if (!copc_read_all) {\n      pdal::BOX2D bounds(copc_win.min().x(), copc_win.min().y(),\n                         copc_win.max().x(), copc_win.max().y());\n      read_options.add(\"bounds\", bounds);\n    }\n    \n  } else {\n    pdal_reader.reset(new pdal::LasReader());\n  }\n  pdal_reader->setOptions(read_options);\n  \n  // Note: For COPC files, the number of total points in the desired region\n  // is a very rough estimate, and can be off by up to a factor of 10.\n  \n  // These are necessary to avoid a segfault in PDAL. It is not clear if it is\n  // important to \"execute\" over a large table, or what exactly it is doing.\n  pdal::PointTable table;\n  pdal_reader->prepare(table);\n  const auto set(pdal_reader->execute(table));\n  \n  pdal::QuickInfo qi(pdal_reader->preview());\n  num_total_points = qi.m_pointCount;\n}\n\n// This is a helper function. Use instead load_las(). This function attempts to\n// load a given number of points but does no no checks on how many are loaded.\n// This returns the total number of points in the file, not the number of loaded \n// points.\nstd::int64_t load_las_aux(std::string const& file_name,\n                          std::int64_t num_points_to_load,\n                          vw::BBox2 const& lonlat_box,\n                          vw::cartography::GeoReference const& geo,\n                          bool verbose,\n                          vw::BBox2 const& copc_win, bool copc_read_all,\n                          bool calc_shift,\n                          // Outputs\n                          vw::Vector3 & shift,\n                          Eigen::MatrixXd & data) {\n  \n  // Set the input point cloud    \n  boost::shared_ptr<pdal::Reader> pdal_reader;\n  pdal::Options read_options;\n  std::int64_t num_total_points = 0; // will change\n  setupLasOrCopcReader(file_name, copc_win, copc_read_all,\n                       pdal_reader, read_options, num_total_points);\n\n  // buf_size is the number of points that will be processed and kept in this\n  // table at the same time. A somewhat bigger value may result in some\n  // efficiencies.\n  int buf_size = 100;\n  pdal::FixedPointTable t(buf_size);\n  pdal_reader->prepare(t);\n\n  // Read the data\n  asp::LasProcessor las_proc(file_name, num_points_to_load, lonlat_box, geo,\n                             verbose, calc_shift, num_total_points, \n                             // Outputs\n                             shift, data);\n  pdal::Options proc_options;\n  proc_options.add(\"filename\", file_name);\n  las_proc.setOptions(proc_options);\n  las_proc.setInput(*pdal_reader);\n  las_proc.prepare(t);\n  las_proc.execute(t);\n\n  return num_total_points;\n}\n\n// Try to load at least this many points from the LAS file. \n// TODO(oalexan1): This function should reduce the number of points\n// if they are too many.\nvoid load_las(std::string const& file_name,\n              std::int64_t num_points_to_load,\n              vw::BBox2 const& lonlat_box,\n              vw::BBox2 const& copc_win, bool copc_read_all,\n              bool calc_shift,\n              vw::Vector3 & shift,\n              vw::cartography::GeoReference const& geo,\n              bool verbose, Eigen::MatrixXd & data) {\n\n  std::int64_t num_total_points \n    = load_las_aux(file_name, num_points_to_load, lonlat_box, geo, verbose, \n                   copc_win, copc_read_all,\n                   calc_shift, \n                   shift, data); // outputs\n\n  int num_loaded_points = data.cols();\n  if (!lonlat_box.empty()                    &&\n      num_loaded_points < num_points_to_load &&\n      num_loaded_points < num_total_points) {\n\n    // We loaded too few points. Try harder. Need some care here as to not run\n    // out of memory.\n    num_points_to_load = std::max(4*num_points_to_load, std::int64_t(10000000));\n    if (verbose)\n      vw::vw_out() << \"Too few points were loaded. Trying again.\" << std::endl;\n    load_las_aux(file_name, num_points_to_load, lonlat_box, geo, verbose,\n                 copc_win, copc_read_all,\n                 calc_shift,\n                 shift, data); // outputs\n  }\n\n}\n\n// Apply a given transform to a LAS file and save it.\nvoid apply_transform_to_las(std::string const& input_file,\n                            std::string const& output_file,\n                            vw::BBox2 const& copc_win, bool copc_read_all,\n                            Eigen::MatrixXd const& T) {\n\n  // Set the input point cloud    \n  boost::shared_ptr<pdal::Reader> pdal_reader;\n  pdal::Options read_options;\n  std::int64_t num_total_points = 0; // will change\n  setupLasOrCopcReader(input_file, copc_win, copc_read_all,\n                       pdal_reader, read_options, num_total_points);\n  \n  // buf_size is the number of points that will be\n  // processed and kept in this table at the same time. \n  // A somewhat bigger value may result in some efficiencies.\n  int buf_size = 100;\n  pdal::FixedPointTable t(buf_size);\n  pdal_reader->prepare(t); \n  \n  // Get the scale and offset. Must be run after the table is prepared.\n  vw::Vector3 offset, scale;\n  pdal::CopcReader *copc_reader = dynamic_cast<pdal::CopcReader*>(pdal_reader.get());\n  pdal::LasReader *las_reader = dynamic_cast<pdal::LasReader*>(pdal_reader.get());\n  if (copc_reader != NULL) {\n  \n    pdal::QuickInfo qi(copc_reader->preview());\n    pdal::BOX3D bounds = qi.m_bounds;\n  \n    // The offset is the center point\n    offset = vw::Vector3((bounds.minx + bounds.maxx)/2.0,\n                         (bounds.miny + bounds.maxy)/2.0,\n                         (bounds.minz + bounds.maxz)/2.0);\n    \n    // Let the scale be about 1 mm. Ensure it won't result in integer overflow,\n    // with a margin.\n    double max_len = std::max(bounds.maxx - bounds.minx, \n                              bounds.maxy - bounds.miny);\n    max_len = std::max(max_len, bounds.maxz - bounds.minz);\n    double s = std::max(1e-3, max_len / 1e+9);\n    scale = vw::Vector3(s, s, s);\n  \n  } else if (las_reader != NULL) {\n  \n    pdal::LasHeader const& header = las_reader->header();\n    offset = vw::Vector3(header.offsetX(), header.offsetY(), header.offsetZ());\n    scale  = vw::Vector3(header.scaleX(),  header.scaleY(),  header.scaleZ());\n  } else {\n    vw::vw_throw(vw::IOErr() << \"Unknown LAS file type: \" << input_file);\n  }\n  \n  vw::cartography::GeoReference las_georef;\n  bool has_georef = asp::georef_from_las(input_file, las_georef);\n\n  // Set up the filter\n  asp::TransformFilter transform_filter(num_total_points, has_georef, las_georef, T);\n  transform_filter.setInput(*pdal_reader);\n  transform_filter.prepare(t);\n\n  // If the data is in ECEF, apply the same transform to the offset and scale as\n  // to the data. This way the internal representation of the data changes very\n  // little, and the data is still well-normalized.\n  if (!has_georef) {\n    offset = asp::apply_transform_to_vec(T, offset);\n    scale = asp::apply_transform_to_vec(T, scale);\n  }\n    \n  // Set up the output file\n  pdal::Options write_options;\n  write_options.add(\"filename\", output_file);\n  \n  // Set up the scale and offset for the output\n  write_options.add(\"offset_x\", offset[0]);\n  write_options.add(\"offset_y\", offset[1]);\n  write_options.add(\"offset_z\", offset[2]);\n  write_options.add(\"scale_x\",  scale[0]);\n  write_options.add(\"scale_y\",  scale[1]);\n  write_options.add(\"scale_z\",  scale[2]);\n  \n  // Write the output file\n  pdal::LasWriter writer;\n  writer.setOptions(write_options);\n  writer.setInput(transform_filter);\n  writer.prepare(t);\n  writer.execute(t);\n}\n\n} // End namespace asp\n"
  },
  {
    "path": "src/asp/Core/PdalUtils.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file PdalUtils.h\n///\n\n// Utility functions that use PDAL\n\n#ifndef __ASP_CORE_PDAL_UTILS_H__\n#define __ASP_CORE_PDAL_UTILS_H__\n\n#include <vw/Image/ImageViewRef.h>\n#include <vw/Math/Vector.h>\n#include <vw/Math/BBox.h>\n\n#include <Eigen/Dense>\n\n#include <string>\n\n// Forward declaration of georef\nnamespace vw { \n  namespace cartography {\n    class GeoReference;\n  }\n}\n\nnamespace pdal {\n  class Reader;\n  class Options;\n}\n\nnamespace asp {\n\n// Read the number of points in the LAS file. For COPC files, we usually\n// care not for this, but for the number of points in a region.\nstd::int64_t las_file_size(std::string const& las_file);\n\n// Read the georef from the las file and return true if the georef exists\nbool georef_from_las(std::string const& las_file,\n                    vw::cartography::GeoReference & georef);\n\n// Check if a file is in the LAS COPC format\nbool isCopc(std::string const& file);\n\n// Save a point cloud and triangulation error to the LAS format.\nvoid write_las(bool has_georef, vw::cartography::GeoReference const& georef,\n               vw::ImageViewRef<vw::Vector3> point_image,\n               vw::ImageViewRef<double> error_image,\n               vw::ImageViewRef<float> intensity,\n               vw::ImageViewRef<double> horizontal_stddev,\n               vw::ImageViewRef<double> vertical_stddev,\n               vw::Vector3 const& offset,  vw::Vector3 const& scale,\n               bool compressed, bool save_triangulation_error,\n               double max_valid_triangulation_error,\n               std::string const& out_prefix);\n\n// Try to load at least this many points from the LAS file. \n// TODO(oalexan1): This function should reduce the number of points\n// if they are too many.\nvoid load_las(std::string const& file_name,\n              std::int64_t num_points_to_load,\n              vw::BBox2 const& lonlat_box,\n              vw::BBox2 const& copc_win, bool copc_read_all,\n              bool calc_shift,\n              vw::Vector3 & shift,\n              vw::cartography::GeoReference const& geo,\n              bool verbose, Eigen::MatrixXd & data);\n\n// Apply a given transform to a LAS file and save it.\nvoid apply_transform_to_las(std::string const& input_file,\n                            std::string const& output_file,\n                            vw::BBox2 const& copc_win, bool copc_read_all,\n                            Eigen::MatrixXd const& T);\n\n// Set up a reader for a LAS or COPC file \nvoid setupLasOrCopcReader(std::string const& in_file,\n                          vw::BBox2 const& copc_win, bool copc_read_all,\n                          boost::shared_ptr<pdal::Reader>& pdal_reader,\n                          pdal::Options& read_options,\n                          std::int64_t & num_total_points);\n\n} // End namespace asp\n\n#endif\n"
  },
  {
    "path": "src/asp/Core/PhotometricOutlier.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n/// \\file PhotometricOutlier.cc\n///\n/// Warning: This code was written with only the Apollo Metric data in mind\n\n#include <asp/Core/PhotometricOutlier.h>\n\n#include <vw/Image/AlgorithmFunctions.h>\n#include <vw/Image/Grassfire.h>\n#include <vw/Image/Algorithms.h>\n#include <vw/Image/Filter.h>\n#include <vw/Image/Convolution.h>\n#include <vw/Image/EdgeExtension.h>\n#include <vw/Image/Manipulation.h>\n#include <vw/Image/MaskViews.h>\n#include <vw/Image/Transform.h>\n#include <vw/FileIO/DiskImageView.h>\n#include <vw/FileIO/DiskCacheImageView.h>\n#include <vw/Cartography/GeoReferenceUtils.h>\n#include <vw/Stereo/DisparityMap.h>\n\nnamespace fs = boost::filesystem;\n\nusing namespace vw;\nusing namespace asp;\n\nvoid asp::photometric_outlier_rejection(vw::GdalWriteOptions const& opt,\n                                        std::string const& prefix,\n                                        std::string const& input_disparity,\n                                        std::string & output_disparity,\n                                        int kernel_size) {\n  // Projecting right into perspective of left\n  DiskImageView<PixelGray<float>> right_disk_image(prefix+\"-R.tif\");\n  DiskImageView<PixelMask<Vector2f>> disparity_disk_image( input_disparity );\n  stereo::DisparityTransform trans( disparity_disk_image );\n\n  std::string cache_dir = \"/tmp\"; // modify here to use a different cache dir if needed\n  if (!fs::is_directory(cache_dir)) {\n    vw_out() << \"\\nCreating cache directory: \" << cache_dir << std::endl;\n    fs::create_directories(cache_dir);\n  }\n\n  DiskCacheImageView<PixelGray<float>>\n    right_proj( transform( right_disk_image, trans, ZeroEdgeExtension()),\n                \"tif\", TerminalProgressCallback(\"asp\",\"Projecting R:\"), cache_dir);\n\n  // Differencing Left and Projected Right\n  ImageViewRef<PixelMask<PixelGray<float32>>> right_mask =\n    create_mask(right_proj);\n  DiskImageView<PixelGray<float32>> left_image(prefix+\"-L.tif\");\n  DiskCacheImageView<PixelGray<float>>\n    diff( abs(apply_mask(copy_mask(left_image,right_mask))-right_proj),\n          \"tif\", TerminalProgressCallback(\"asp\",\"\\tDifference:\"),\n          cache_dir);\n  ChannelAccumulator<math::CDFAccumulator<float32>> cdf;\n  cdf.resize(8000,2001);\n  for_each_pixel(diff, cdf);\n  float thresh = cdf.quantile(0.99985); // Pulling out last bin of CDF\n  vw_out() << \"\\t  Using threshold: \" << thresh << \"\\n\";\n\n  // Thresholding image and dilating\n  ImageView<PixelGray<float>> dust =\n    threshold(apply_mask(copy_mask(diff,right_mask)),thresh,1.0,0.0);\n  ImageView<PixelGray<float>> grass;\n  grassfire(dust,grass);\n  dust = gaussian_filter(grass,kernel_size/3);\n\n  ImageViewRef<PixelMask<Vector2f>> cleaned_disparity =\n    intersect_mask(disparity_disk_image,\n                   intersect_mask(create_mask(threshold(dust,kernel_size,0.0,1.0)),right_mask));\n\n  vw::cartography::block_write_gdal_image(prefix + \"-FDust.tif\",\n                          cleaned_disparity, opt,\n                          TerminalProgressCallback(\"asp\", \"Dust Removal:\") );\n}\n"
  },
  {
    "path": "src/asp/Core/PhotometricOutlier.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n/// \\file PhotometricOutlier.h\n///\n/// Warning: This code was written with only the Apollo Metric data in mind\n\n#ifndef __STEREO_CORE_PHOTOMETRIC_OUTLIER_H__\n#define __STEREO_CORE_PHOTOMETRIC_OUTLIER_H__\n\n#include <string>\n\n// Forward declaration\nnamespace vw{\n  struct GdalWriteOptions;\n}\n\nnamespace asp {\n  void photometric_outlier_rejection(vw::GdalWriteOptions const& opt,\n                                      std::string const& prefix,\n                                      std::string const& input_disparity,\n                                      std::string & output_disparity,\n                                      int kernel_size);\n}\n\n#endif //__STEREO_CORE_PHOTOMETRIC_OUTLIER_H__\n"
  },
  {
    "path": "src/asp/Core/Point2Grid.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <vw/Core/Exception.h>\n#include <vw/Core/FundamentalTypes.h>\n#include <asp/Core/Point2Grid.h>\n#include <vw/Math/Functors.h>\n\n#include <iostream>\n#include <cmath>\n#include <cstddef>\n\nnamespace asp {\n\n// ===========================================================================\n// Class Member Functions\n// ===========================================================================\n\nPoint2Grid::Point2Grid(int width, int height,\n                       vw::ImageView<double> & buffer, vw::ImageView<double> & weights,\n                       double x0, double y0, double grid_size, double min_spacing,\n                       double radius, double sigma_factor,\n                       FilterType filter, double percentile):\n  m_width(width), m_height(height),\n  m_buffer(buffer), m_weights(weights),\n  m_x0(x0), m_y0(y0), m_grid_size(grid_size),\n  m_radius(radius), m_filter(filter), m_percentile(percentile) {\n\n  if (m_grid_size <= 0)\n    vw::vw_throw(vw::ArgumentErr() << \"Point2Grid: Grid size must be > 0.\\n\");\n  if (m_radius <= 0)\n    vw::vw_throw(vw::ArgumentErr() << \"Point2Grid: Search radius must be > 0.\\n\");\n\n  if (m_filter == f_percentile && (m_percentile < 0 || m_percentile > 100.0))\n    vw::vw_throw(vw::ArgumentErr() << \"Point2Grid: Expecting the percentile in the range 0.0 to 100.0.\\n\");\n\n  // Stop here if we don't need to create gaussian weights\n  if (m_filter != f_weighted_average)\n    return;\n\n  // By the time we reached the distance 'spacing' from the origin, we\n  // want the Gaussian exp(-sigma*x^2) to decay to given value.  Note\n  // that the user may choose to make the grid size very small, but we\n  // put a limit to how small 'spacing' gets, that is, how large sigma\n  // gets, to ensure that the DEM stays smooth.\n  double spacing = std::max(grid_size, min_spacing);\n  double val = 0.25;\n  double sigma = -std::log(val)/spacing/spacing;\n\n  // Override this if passed from outside\n  if (sigma_factor > 0)\n    sigma = sigma_factor/spacing/spacing;\n\n  // Sample the gaussian for speed\n  int num_samples = 1000;\n  m_dx = m_radius/(num_samples - 1.0);\n  m_sampled_gauss.resize(num_samples);\n  for (int k = 0; k < num_samples; k++) {\n    double dist = k*m_dx;\n    m_sampled_gauss[k] = std::exp(-sigma*dist*dist);\n  }\n\n}\n\nvoid Point2Grid::Clear(const float value) {\n  m_buffer.set_size (m_width, m_height);\n  m_weights.set_size (m_width, m_height);\n  for (int c = 0; c < m_buffer.cols(); c++) {\n    for (int r = 0; r < m_buffer.rows(); r++) {\n      m_buffer (c, r) = value; // usually this is the no-data value\n      m_weights(c, r) = 0.0;\n    }\n  }\n\n  // For these we need to keep all values (in fact, for stddev we could get away with less,\n  // but it is not worth trying so hard).\n  if (m_filter == f_median || m_filter == f_stddev ||\n      m_filter == f_nmad   || m_filter == f_percentile) {\n    m_vals.set_size(m_width, m_height);\n  }\n\n}\n\nvoid Point2Grid::AddPoint(double x, double y, double z) {\n\n  int minx = std::max((int)std::ceil((x - m_radius - m_x0)/m_grid_size), 0);\n  int miny = std::max((int)std::ceil((y - m_radius - m_y0)/m_grid_size), 0);\n\n  int maxx = std::min((int)std::floor((x + m_radius - m_x0)/m_grid_size), m_buffer.cols() - 1);\n  int maxy = std::min((int)std::floor((y + m_radius - m_y0)/m_grid_size), m_buffer.rows() - 1);\n\n  // Add the contribution of current point to all grid points within radius\n  for (int ix = minx; ix <= maxx; ix++) {\n    for (int iy = miny; iy <= maxy; iy++) {\n\n      double gx   = m_x0 + ix*m_grid_size;\n      double gy   = m_y0 + iy*m_grid_size;\n      double dist = std::sqrt((x-gx)*(x-gx) + (y-gy)*(y-gy));\n      if (dist > m_radius) continue;\n\n      if (m_filter == f_weighted_average) {\n        double wt = m_sampled_gauss[(int)std::round(dist/m_dx)];\n        if (wt <= 0)\n          continue;\n        if (m_weights(ix, iy) == 0)\n          m_buffer(ix, iy) = 0.0; // set to 0 before incrementing below\n        m_buffer(ix, iy)  += z*wt;\n        m_weights(ix, iy) += wt;\n\n      } else if (m_filter == f_mean) {\n        if (m_weights(ix, iy) == 0)\n          m_buffer(ix, iy) = 0.0; // set to 0 before incrementing below\n        m_buffer(ix, iy)  += z;\n        m_weights(ix, iy) += 1;\n\n      } else if (m_filter == f_min) {\n        if (m_weights(ix, iy) == 0) {\n          m_buffer(ix, iy)  = z; // first time we set the value\n          m_weights(ix, iy) = 1; // mark the fact that the buffer was initialized\n        } else\n          m_buffer(ix, iy) = std::min(m_buffer(ix, iy), z);\n\n      } else if (m_filter == f_max) {\n        if (m_weights(ix, iy) == 0) {\n          m_buffer(ix, iy)  = z; // first time we set the value\n          m_weights(ix, iy) = 1; // mark the fact that the buffer was initialized\n        } else\n          m_buffer(ix, iy) = std::max(m_buffer(ix, iy), z);\n\n      } else if (m_filter == f_count) {\n        if (m_weights(ix, iy) == 0) {\n          m_weights(ix, iy) = 1; // mark the fact that the buffer was initialized\n        } else\n          m_weights(ix, iy) += 1;\n\n      } else if (m_filter == f_stddev || m_filter == f_median ||\n                m_filter == f_nmad   || m_filter == f_percentile) {\n        m_vals(ix, iy).push_back(z); // not strictly needed for stddev\n      }\n\n    }\n\n  }\n}\n\nvoid Point2Grid::normalize() {\n  for (int c = 0; c < m_buffer.cols(); c++) {\n    for (int r = 0; r < m_buffer.rows(); r++) {\n\n      if (m_filter == f_weighted_average || m_filter == f_mean) {\n        if (m_weights(c, r) > 0)\n          m_buffer (c, r) /= m_weights(c, r);\n\n      } else if (m_filter == f_count)\n        m_buffer(c, r) = m_weights(c, r); // hence instead of no-data we will have always 0\n\n      else if (m_filter == f_stddev) {\n        if (m_vals(c, r).empty())\n          continue; // nothing to compute\n        vw::math::StdDevAccumulator<double> V;\n        for (std::size_t it = 0; it < m_vals(c, r).size(); it++)\n          V(m_vals(c, r)[it]);\n        m_buffer(c, r) = V.value();\n      } else if (m_filter == f_median) {\n        if (m_vals(c, r).empty())\n          continue; // nothing to compute\n        vw::math::MedianAccumulator<double> V;\n        for (std::size_t it = 0; it < m_vals(c, r).size(); it++)\n          V(m_vals(c, r)[it]);\n        m_buffer(c, r) = V.value();\n      } else if (m_filter == f_nmad) {\n        if (m_vals(c, r).empty())\n          continue; // nothing to compute\n        m_buffer(c, r) = vw::math::destructive_nmad(m_vals(c, r));\n      } else if (m_filter == f_percentile) {\n        if (m_vals(c, r).empty())\n          continue; // nothing to compute\n        m_buffer(c, r) = vw::math::destructive_percentile(m_vals(c, r), m_percentile);\n      }\n\n    }\n  }\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Core/Point2Grid.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n/// \\file Point2Grid.h\n///\n\n#ifndef __VW_POINT2GRID_H__\n#define __VW_POINT2GRID_H__\n\n#include <vw/Image/ImageView.h>\n\nnamespace asp {\n\n  // The type of filter to apply to points within a circular bin.\n  enum FilterType {f_weighted_average, f_min, f_max, f_mean, f_median, f_stddev, f_count,\n                   f_nmad, f_percentile};\n\n  /// Given a set of xyz points, create an xy grid. For every node in the\n  /// grid, combine all points within given radius of the grid point and\n  /// calculate a single z value at the grid point.\n  class Point2Grid {\n\n  public:\n    Point2Grid(int width, int height,\n               vw::ImageView<double> & buffer, vw::ImageView<double> & weights,\n               double x0, double y0,\n               double grid_size, double min_spacing, double radius,\n               double sigma_factor,\n               FilterType filter, double percentile);\n    ~Point2Grid(){}\n    void Clear    (const float val);\n    void AddPoint (double x, double y, double z);\n    void normalize();\n\n  private:\n    int m_width, m_height; // DEM dimensions\n    vw::ImageView<double> & m_buffer;\n    vw::ImageView<double> & m_weights;\n    vw::ImageView< std::vector<double> > m_vals; // when need to keep all individual values\n    double     m_x0, m_y0; // lower-left corner\n    double     m_grid_size;  // spacing between output DEM pixels\n    double     m_radius;   // how far to search for cloud points\n    double     m_dx;       // spacing between samples\n    std::vector<double> m_sampled_gauss;\n    FilterType m_filter;\n    double     m_percentile; // The actual value of the percentile to use if in that mode\n\n  };\n\n}\n\n#endif  // __VW_POINT2GRID_H__\n"
  },
  {
    "path": "src/asp/Core/PointCloudAlignment.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Utilities used in cloud alignment that make use of PDAL. \n\n/// \\file PointCloudAlignment.cc\n\n#include <asp/Core/PointCloudAlignment.h>\n#include <asp/Core/PdalUtils.h>\n#include <asp/Core/EigenUtils.h>\n\n#include <vw/Cartography/GeoReference.h>\n\n// PDAL includes\n#include <io/LasReader.hpp>\n#include <pdal/Streamable.hpp>\n#include <pdal/PointView.hpp>\n#include <pdal/util/ProgramArgs.hpp>\n#include <pdal/Filter.hpp>\n#include <pdal/Streamable.hpp>\n#include <io/LasWriter.hpp>\n#include <io/LasHeader.hpp>\n#include <pdal/Options.hpp>\n\nnamespace asp {\n\n// Read a LAS cloud and return a subset of it. This inherits from pdal::Writer\n// because it is a processing class. It brings in the data via a pdal::Reader\n// handle that is set when an instance of this is configured.\nclass PDAL_DLL LasProcessor: public pdal::Writer, public pdal::Streamable {\n\npublic:\n  LasProcessor(std::string const& file_name, std::int64_t num_points_to_load,\n              vw::BBox2 const& lonlat_box,\n              vw::cartography::GeoReference const& input_georef,\n              bool verbose, bool calc_shift,\n              // Outputs\n              std::int64_t & num_total_points, vw::Vector3 & shift, \n              Eigen::MatrixXd & data):\n  m_file_name(file_name),\n  m_num_points_to_load(num_points_to_load),\n  m_lonlat_box(lonlat_box),\n  m_input_georef(input_georef),\n  m_verbose(verbose),\n  m_calc_shift(calc_shift),\n  m_tpc(vw::TerminalProgressCallback(\"asp\", \"\\t--> \")),\n  // Outputs\n  m_num_total_points(num_total_points), m_shift(shift), m_data(data) {\n    \n    m_data.conservativeResize(asp::DIM + 1, m_num_points_to_load);\n    m_has_las_georef = asp::georef_from_las(m_file_name, m_las_georef);\n    m_shift_was_calc = false;\n    m_points_count = 0;\n    \n    // We will randomly pick or not a point with probability load_ratio\n    m_num_total_points = asp::las_file_size(m_file_name);\n    m_load_ratio = (double)m_num_points_to_load/std::max(1.0, (double)m_num_total_points);\n\n    std::int64_t hundred = 100;\n    m_spacing = std::max(m_num_total_points/hundred, std::int64_t(1));\n    m_inc_amount = 1.0 / hundred;\n    if (m_verbose) \n      m_tpc.report_progress(0);\n  }\n  \n  ~LasProcessor() {}\n\n  virtual std::string getName() const { return \"sample streamer\"; }\n\nprivate:\n\n  std::string m_file_name;\n  std::int64_t m_num_points_to_load;\n  vw::BBox2 m_lonlat_box;\n  vw::cartography::GeoReference m_input_georef;\n  bool m_verbose;\n  bool m_calc_shift;\n  bool m_has_las_georef;\n  vw::cartography::GeoReference m_las_georef;\n  double m_load_ratio;\n  bool m_shift_was_calc;\n  std::int64_t m_points_count;\n  vw::TerminalProgressCallback m_tpc;\n  std::int64_t m_spacing;\n  double m_inc_amount;\n  \n  // Aliases, to be returned to the caller\n  std::int64_t & m_num_total_points;\n  vw::Vector3 & m_shift;\n  Eigen::MatrixXd & m_data;\n  \n  virtual void addArgs(pdal::ProgramArgs& args) {}\n  virtual void initialize() {}\n\n  // This will be called for each point in the cloud.\n  virtual bool processOne(pdal::PointRef& point) {\n\n    if (m_points_count >= m_num_points_to_load)\n      return false; // done with reading points\n\n    // try next time is above the load ratio\n    double r = (double)std::rand()/(double)RAND_MAX;\n    if (r > m_load_ratio)\n      return true;\n    \n    // Current point\n    vw::Vector3 xyz(point.getFieldAs<double>(pdal::Dimension::Id::X),\n                    point.getFieldAs<double>(pdal::Dimension::Id::Y),\n                    point.getFieldAs<double>(pdal::Dimension::Id::Z));\n    \n    if (m_has_las_georef) {\n      // This is a projected point, convert to cartesian\n      vw::Vector2 ll = m_las_georef.point_to_lonlat(subvector(xyz, 0, 2));\n      xyz = m_las_georef.datum().geodetic_to_cartesian(vw::Vector3(ll[0], ll[1], xyz[2]));\n    }\n    \n    if (m_calc_shift && !m_shift_was_calc) {\n      m_shift = xyz;\n      m_shift_was_calc = true;\n    }\n    \n    // Skip points outside the given box. Here we use the input georef.\n    // It is assumed that if the box is non-empty then this georef is valid.\n    if (!m_lonlat_box.empty()) {\n      vw::Vector3 llh = m_input_georef.datum().cartesian_to_geodetic(xyz);\n      if (!m_lonlat_box.contains(subvector(llh, 0, 2)))\n        return true;\n    }\n    \n    // Save this point\n    for (int row = 0; row < asp::DIM; row++)\n      m_data(row, m_points_count) = xyz[row] - m_shift[row];\n    m_data(asp::DIM, m_points_count) = 1; // last field\n\n    if (m_verbose && m_points_count % m_spacing == 0) \n      m_tpc.report_incremental_progress(m_inc_amount);\n\n    m_points_count++;\n    \n    return true;  \n  }\n\n  virtual void writeView(const pdal::PointViewPtr view) {\n    throw pdal::pdal_error(\"The writeView() function must not be called in streaming mode.\");\n  }\n\n  // To be called after all the points are read.\n  virtual void done(pdal::PointTableRef table) {\n    m_data.conservativeResize(Eigen::NoChange, m_points_count);\n\n    if (m_verbose) \n      m_tpc.report_finished();\n  }\n  \n  LasProcessor& operator=(const LasProcessor&) = delete;\n  LasProcessor(const LasProcessor&) = delete;\n  LasProcessor(const LasProcessor&&) = delete;\n};\n\n// A filter to apply a transform to a cloud. Each point is processed in\n// streaming mode, without loading the entire point cloud into memory. May\n// adjust the scale and offset in the header of the output file.\n      \nclass PDAL_DLL TransformFilter: public pdal::Filter, public pdal::Streamable {\n\npublic:\n\n  std::string getName() const {\n      return \"transform_filter\";\n  }\n\n  TransformFilter(std::int64_t num_total_points, \n                  bool has_georef, \n                  vw::cartography::GeoReference const& georef,\n                  Eigen::MatrixXd const& T): \n        m_has_georef(has_georef), m_georef(georef), m_T(T), \n        m_tpc(vw::TerminalProgressCallback(\"asp\", \"\\t--> \")) {\n    \n    int hundred = 100;\n    m_spacing = std::max(num_total_points/hundred, std::int64_t(1));\n    m_inc_amount = 1.0 / double(hundred);\n    m_count = 0;\n  }\n\n  ~TransformFilter() {}\n\nprivate:\n\n  // Apply a transform to each point\n  virtual bool processOne(pdal::PointRef& point) {\n    \n    // Initial point\n    vw::Vector3 P(point.getFieldAs<double>(pdal::Dimension::Id::X),\n                  point.getFieldAs<double>(pdal::Dimension::Id::Y),\n                  point.getFieldAs<double>(pdal::Dimension::Id::Z));\n    \n    if (m_has_georef) {\n      // This is a projected point, convert to cartesian\n      vw::Vector2 ll = m_georef.point_to_lonlat(subvector(P, 0, 2));\n      P = m_georef.datum().geodetic_to_cartesian(vw::Vector3(ll[0], ll[1], P[2]));\n    }\n    \n    // Apply the transform\n    P = asp::apply_transform_to_vec(m_T, P);\n    \n    if (m_has_georef) {\n      // Go back to projected space\n      vw::Vector3 llh = m_georef.datum().cartesian_to_geodetic(P);\n      subvector(P, 0, 2) = m_georef.lonlat_to_point(subvector(llh, 0, 2));\n      P[2] = llh[2];\n    }\n    \n    // Put the point back\n    point.setField(pdal::Dimension::Id::X, P[0]);\n    point.setField(pdal::Dimension::Id::Y, P[1]);\n    point.setField(pdal::Dimension::Id::Z, P[2]);\n\n    // Update the progress and the counter\n    if (m_count % m_spacing == 0) \n      m_tpc.report_incremental_progress(m_inc_amount);\n    m_count++;  \n    \n    return true;\n  }\n  \n  virtual void done(pdal::PointTableRef table) {\n    m_tpc.report_finished();\n  }\n    \n  bool m_has_georef;\n  vw::cartography::GeoReference m_georef;\n  Eigen::MatrixXd m_T;\n  std::int64_t m_spacing;\n  double m_inc_amount;\n  std::int64_t m_count;\n  vw::TerminalProgressCallback m_tpc;\n  \n};\n\n// This is a helper function. Use instead load_las(). This\n// function attempts to load a given number of points but does no no checks on\n// how many are loaded.\nstd::int64_t load_las_aux(std::string const& file_name,\n                          std::int64_t num_points_to_load,\n                          vw::BBox2 const& lonlat_box,\n                          vw::cartography::GeoReference const& geo,\n                          bool verbose,\n                          bool calc_shift,\n                          // Outputs\n                          vw::Vector3 & shift,\n                          Eigen::MatrixXd & data) {\n  \n  // Set the input point cloud    \n  pdal::Options read_options;\n  read_options.add(\"filename\", file_name);\n  pdal::LasReader pdal_reader;\n  pdal_reader.setOptions(read_options);\n\n  // buf_size is the number of points that will be processed and kept in this\n  // table at the same time. A somewhat bigger value may result in some\n  // efficiencies.\n  int buf_size = 100;\n  pdal::FixedPointTable t(buf_size);\n  pdal_reader.prepare(t);\n\n  // Read the data\n  std::int64_t num_total_points = 0;\n  asp::LasProcessor las_proc(file_name, num_points_to_load, lonlat_box, geo,\n                             verbose, calc_shift, \n                             // Outputs\n                             num_total_points, shift, data);\n  pdal::Options proc_options;\n  las_proc.setOptions(proc_options);\n  las_proc.setInput(pdal_reader);\n  las_proc.prepare(t);\n  las_proc.execute(t);\n\n  return num_total_points;\n}\n\n// Apply a given transform to a LAS file and save it.\nvoid apply_transform_to_las(std::string const& input_file,\n                            std::string const& output_file,\n                            Eigen::MatrixXd const& T) {\n\n  // buf_size is the number of points that will be\n  // processed and kept in this table at the same time. \n  // A somewhat bigger value may result in some efficiencies.\n  int buf_size = 500;\n  pdal::FixedPointTable t(buf_size);\n\n  // Set the input point cloud    \n  pdal::Options read_options;\n  read_options.add(\"filename\", input_file);\n  pdal::LasReader reader;\n  reader.setOptions(read_options);\n  reader.prepare(t); \n    \n  // Get the scale and offset from the input cloud header\n  // Must be run after the table is prepared\n  const pdal::LasHeader & header = reader.header();\n  vw::Vector3 offset(header.offsetX(), header.offsetY(), header.offsetZ());\n  vw::Vector3 scale (header.scaleX(),  header.scaleY(),  header.scaleZ());\n\n  std::int64_t num_total_points = asp::las_file_size(input_file);\n  vw::cartography::GeoReference las_georef;\n  bool has_georef = asp::georef_from_las(input_file, las_georef);\n\n  // Set up the filter\n  asp::TransformFilter transform_filter(num_total_points, has_georef, las_georef, T);\n  transform_filter.setInput(reader);\n  transform_filter.prepare(t);\n\n  // If the data is in ECEF, apply the same transform to the offset and scale as\n  // to the data. This way the internal representation of the data changes very\n  // little, and the data is still well-normalized.\n  if (!has_georef) {\n    offset = asp::apply_transform_to_vec(T, offset);\n    scale = asp::apply_transform_to_vec(T, scale);\n  }\n    \n  // Set up the output file\n  pdal::Options write_options;\n  write_options.add(\"filename\", output_file);\n  \n  // Set up the scale and offset for the output\n  write_options.add(\"offset_x\", offset[0]);\n  write_options.add(\"offset_y\", offset[1]);\n  write_options.add(\"offset_z\", offset[2]);\n  write_options.add(\"scale_x\",  scale[0]);\n  write_options.add(\"scale_y\",  scale[1]);\n  write_options.add(\"scale_z\",  scale[2]);\n  \n  // Write the output file\n  pdal::LasWriter writer;\n  writer.setOptions(write_options);\n  writer.setInput(transform_filter);\n  writer.prepare(t);\n  writer.execute(t);\n}\n\n} // end namespace asp"
  },
  {
    "path": "src/asp/Core/PointCloudAlignment.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file PointCloudAlignment.h\n///\n\n// Utilities used in cloud alignment that make use of PDAL. \n\n#ifndef __ASP_CORE_POINT_CLOUD_ALIGNMENT_H__\n#define __ASP_CORE_POINT_CLOUD_ALIGNMENT_H__\n\n#include <Eigen/Dense>\n\n#include <vw/Math/Vector.h>\n#include <vw/Math/BBox.h>\n\n#include <string>\n#include <vector>\n\nnamespace vw {\n  \n  class GdalWriteOptions;\n  namespace cartography {\n    class GeoReference;\n  }\n}\n\nnamespace asp {\n \n// This is a helper function. Use instead load_las(). This\n// function attempts to load a given number of points but does no no checks on\n// how many are loaded.\nstd::int64_t load_las_aux(std::string const& file_name,\n                          std::int64_t num_points_to_load,\n                          vw::BBox2 const& lonlat_box,\n                          vw::cartography::GeoReference const& geo,\n                          bool verbose,\n                          bool calc_shift,\n                          // Outputs\n                          vw::Vector3 & shift,\n                          Eigen::MatrixXd & data);\n\n// Apply a given transform to a LAS file and save it.\nvoid apply_transform_to_las(std::string const& input_file,\n                            std::string const& output_file,\n                            Eigen::MatrixXd const& T);\n\n} // End namespace asp\n\n#endif // __ASP_CORE_POINT_CLOUD_ALIGNMENT_H__\n"
  },
  {
    "path": "src/asp/Core/PointCloudProcessing.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Process point clouds. This makes use of PDAL and ASP's CSV logic.\n\n/// \\file PointCloudProcessing.cc\n#include <asp/Core/PointCloudProcessing.h>\n#include <asp/Core/PointUtils.h>\n#include <asp/Core/PdalUtils.h>\n\n#include <vw/Cartography/Chipper.h>\n\n#include <pdal/PointView.hpp>\n#include <pdal/PointTable.hpp>\n#include <pdal/Options.hpp>\n#include <pdal/StageFactory.hpp>\n#include <pdal/Streamable.hpp>\n#include <pdal/Reader.hpp>\n#include <io/LasHeader.hpp>\n#include <io/CopcReader.hpp>\n#include <io/LasReader.hpp>\n#include <io/LasWriter.hpp>\n#include <pdal/SpatialReference.hpp>\n#include <pdal/SrsBounds.hpp>\n\n// Read through las points in streaming fashion. When a given amount is collected,\n// write a chip to disk.\nnamespace asp {\n\nclass PDAL_DLL ChipMaker: public pdal::Writer, public pdal::Streamable {\n\npublic:\n\nstd::string getName() const { return \"chip maker\"; }\n\n  // Go through a LAS file and write to disk spatially organized tiles.\n  // Also converts along the way from projected coordinates (if applicable)\n  // to ECEF.\n  // tile_len is big, but chip_size is small.\n  ChipMaker(std::int64_t tile_len, std::int64_t chip_size,\n            bool has_georef, vw::cartography::GeoReference const& georef,\n            vw::GdalWriteOptions & opt, // will change\n            std::string const& out_prefix,\n            std::vector<std::string> & out_files):\n    m_tile_len(tile_len), m_chip_size(chip_size),\n    m_has_georef(has_georef), m_georef(georef), m_opt(opt),\n    m_out_prefix(out_prefix), m_out_files(out_files),\n    m_tile_count(0), m_buf(vw::PointBuffer()) {\n      \n      // This is a bugfix for the LAS file not having the georef transform. It\n      // has only the projection. This results in all kind of warnings. Ensure a\n      // proper fictitious transform to make the warnings go away.\n      vw::Matrix<double,3,3> trans = m_georef.transform();\n      if (trans(1, 1) > 0) {\n        double small = 1e-8;\n        trans(0, 0) = small;\n        trans(1, 1) = -small;\n        m_georef.set_transform(trans);\n      }\n    }\n\n~ChipMaker() {}\n\nprivate:\n\n  std::int64_t m_tile_len;\n  std::int64_t m_chip_size;\n  bool m_has_georef;\n  vw::cartography::GeoReference m_georef;\n  vw::GdalWriteOptions & m_opt;\n  std::string m_out_prefix; // output files will start with this prefix\n  std::vector<std::string> & m_out_files; // alias, used for output\n  std::int64_t m_tile_count;\n  vw::PointBuffer m_buf;\n\n  // Call this when the buffer is full or when we are done reading.\n  // Organize the points in small chips, with points in each chip\n  // being spatially close together. Then write each chip to disk.\n  void processBuf() {\n\n    if (m_buf.empty())\n      return;\n\n    // Make the chips\n    vw::ImageView<vw::Vector3> Img;\n    vw::Chipper(m_buf, m_chip_size, m_has_georef, m_georef,\n                m_tile_len, m_tile_len, Img);\n\n    // Create a file of the form tile with index m_tile_count\n    std::ostringstream os;\n    os << m_out_prefix << \"-\" << m_tile_count << \".tif\";\n    std::string out_file = os.str();\n    m_out_files.push_back(out_file);\n\n    vw::vw_out() << \"Writing temporary file: \" << out_file << \"\\n\";\n    bool has_nodata = false;\n    double nodata = -std::numeric_limits<double>::max();\n    vw::TerminalProgressCallback tpc(\"asp\", \"\\t--> \");\n    vw::GdalWriteOptions local_opt = m_opt;\n    local_opt.cog = false;  // Do not use COG with temporary files\n    vw::cartography::block_write_gdal_image(out_file, Img, m_has_georef, m_georef,\n                                            has_nodata, nodata, local_opt, tpc);\n\n    // Wipe the buf when done and increment the tile count\n    m_buf.clear();\n    m_tile_count++;\n  }\n\n  // This will be called for each point in the cloud.\n  virtual bool processOne(pdal::PointRef& point) {\n\n    // Current point\n    vw::Vector3 pt(point.getFieldAs<double>(pdal::Dimension::Id::X),\n                   point.getFieldAs<double>(pdal::Dimension::Id::Y),\n                   point.getFieldAs<double>(pdal::Dimension::Id::Z));\n    m_buf.push_back(pt);\n    // If the buffer is full, process it\n    std::int64_t max_num_pts_to_read = m_tile_len * m_tile_len;\n    if (m_buf.size() >= max_num_pts_to_read)\n      processBuf();\n\n    return true;\n  }\n\n  // To be called after all the points are read.\n  virtual void done(pdal::PointTableRef table) {\n    // Process the rest of the points\n    processBuf();\n  }\n\n  // Part of the API, not used here.\n  virtual void writeView(const pdal::PointViewPtr view) {\n    throw pdal::pdal_error(\"The writeView() function must not be called in streaming mode.\");\n  }\n  virtual void addArgs(pdal::ProgramArgs& args) {}\n  virtual void initialize() {}\n  ChipMaker& operator=(const ChipMaker&) = delete;\n  ChipMaker(const ChipMaker&) = delete;\n  ChipMaker(const ChipMaker&&) = delete;\n\n};\n\nclass CsvReader: public BaseReader {\n  std::string  m_csv_file;\n  asp::CsvConv m_csv_conv;\n  bool         m_is_first_line;\n  bool         m_has_valid_point;\n  vw::Vector3  m_curr_point;\n  std::ifstream * m_ifs;\n\npublic:\n\n  CsvReader(std::string const & csv_file,\n            asp::CsvConv const& csv_conv,\n            vw::cartography::GeoReference const& georef):\n      m_csv_file(csv_file), m_csv_conv(csv_conv),\n      m_is_first_line(true), m_has_valid_point(false) {\n\n    // We will convert from projected space to xyz, unless points\n    // are already in this format.\n    m_has_georef = (m_csv_conv.format != asp::CsvConv::XYZ);\n\n    m_georef      = georef;\n    m_num_points  = asp::csv_file_size(m_csv_file);\n\n    m_ifs = new std::ifstream (m_csv_file.c_str());\n    if (!*m_ifs)\n      vw::vw_throw(vw::IOErr() << \"Unable to open file: \" << m_csv_file << \"\\n\");\n\n    VW_ASSERT(m_csv_conv.csv_format_str != \"\",\n              vw::ArgumentErr() << \"CsvReader: The CSV format was not specified.\\n\");\n  }\n\n  virtual bool ReadNextPoint() {\n\n    std::string line;\n    asp::CsvConv::CsvRecord vals;\n\n    // Keep on reading, until a valid point is hit or the end of the file\n    // is reached.\n    while (1) {\n      m_has_valid_point = static_cast<bool>(getline(*m_ifs, line, '\\n'));\n      if (!m_has_valid_point)\n        return m_has_valid_point; // reached end of file\n\n      vals = m_csv_conv.parse_csv_line(m_is_first_line, m_has_valid_point, line);\n\n      // Will return projected point and height or xyz. We really\n      // prefer projected points, as then the chipper will have an\n      // easier time grouping spatially points close together, as it\n      // operates the first two coordinates.\n      bool return_point_height = true;\n      try {\n        m_curr_point\n          = m_csv_conv.csv_to_cartesian_or_point_height(vals, m_georef, return_point_height);\n      } catch (...) {\n        // This is a bug fix. Skip points out of bounds.\n        continue;\n      }\n\n      // Found a valid point\n      if (m_has_valid_point)\n        break;\n    }\n\n    return m_has_valid_point;\n  }\n\n  virtual vw::Vector3 GetPoint() {\n    return m_curr_point;\n  }\n\n  virtual ~CsvReader() {\n    delete m_ifs;\n    m_ifs = NULL;\n  }\n\n}; // End class CsvReader\n\n// Read unordered points from a Tif image. They will be organized into chips.\nclass TifReader: public BaseReader {\n  vw::ImageViewRef<vw::Vector3> m_img;\n  bool m_has_valid_point;\n  vw::Vector3 m_curr_point;\n  std::vector<vw::BBox2i> m_blocks;\n  vw::ImageView<vw::Vector3> m_block_img;\n  // Use int64_t to avoid overflow\n  std::int64_t m_block_count;\n  std::int64_t m_block_len;\n  std::int64_t m_point_count_in_block;\n  std::int64_t m_total_point_count;\n\npublic:\n\n  TifReader(std::string const & tif_file):\n    m_has_valid_point(false), m_block_count(0), m_point_count_in_block(0), m_block_len(0),\n    m_total_point_count(0) {\n\n    // Must ensure there are at least 3 channels in the image\n    {\n      vw::DiskImageResourceGDAL rsrc(tif_file);\n      int num_channels = rsrc.channels();\n      if (num_channels < 3)\n        vw::vw_throw(vw::ArgumentErr() << \"TifReader: Expecting at least 3 channels \"\n                  << \"in the image.\\n\");\n    }\n\n    // Read the first 3 channels\n    std::vector<std::string> tif_files;\n    tif_files.push_back(tif_file);\n    m_img = asp::form_point_cloud_composite<vw::Vector3>(tif_files, ASP_MAX_SUBBLOCK_SIZE);\n\n    // Compute the number of points in the image. To avoid integer overflow,\n    // cast first to int64_t.\n    m_num_points = std::int64_t(m_img.cols()) * std::int64_t(m_img.rows());\n\n    // Reading points one by one is very inefficient. We will read them in blocks.\n    int block_size = 1024;\n    m_blocks = vw::subdivide_bbox(vw::bounding_box(m_img), block_size, block_size);\n  }\n\n  virtual bool ReadNextPoint() {\n\n    if (m_total_point_count >= m_num_points) {\n      // No more points to read\n      m_curr_point = vw::Vector3();\n      m_has_valid_point = false;\n      return m_has_valid_point;\n    }\n\n    if (m_block_img.cols() == 0 || m_point_count_in_block >= m_block_len) {\n\n      // Sanity checks\n      if (m_block_count >= (int64_t)m_blocks.size())\n        vw::vw_throw(vw::ArgumentErr() << \"TifReader: Unexpected end of file.\\n\");\n\n      // Read the next block\n      vw::BBox2i block = m_blocks[m_block_count];\n\n      // The block must be contained within the bounding box and be non-empty\n      if (block.empty() || !vw::bounding_box(m_img).contains(block))\n        vw::vw_throw(vw::ArgumentErr() << \"TifReader: Invalid block.\\n\");\n\n      m_block_img = crop(m_img, block);\n      m_block_len = std::int64_t(block.width()) * std::int64_t(block.height());\n      m_point_count_in_block = 0;\n      m_block_count++;\n    }\n\n    // Find the row and column of the current point\n    int col = m_point_count_in_block % m_block_img.cols();\n    int row = m_point_count_in_block / m_block_img.cols();\n\n    // Get the element\n    m_curr_point = m_block_img(col, row);\n\n    // Set the zero point to nan. Usually a scanner uses this value\n    // if it cannot get a valid reading.\n    if (m_curr_point == vw::Vector3()) {\n      double nan = std::numeric_limits<double>::quiet_NaN();\n      m_curr_point = vw::Vector3(nan, nan, nan);\n    }\n\n    // Increment the counters\n    m_point_count_in_block++;\n    m_total_point_count++;\n\n    m_has_valid_point = true;\n    return m_has_valid_point;\n  }\n\n  virtual vw::Vector3 GetPoint() {\n    return m_curr_point;\n  }\n\n  virtual ~TifReader() {\n  }\n\n}; // End class TifReader\n\n// TODO(oalexan1): Consider using PDAL for PCD files too.\nvoid PcdReader::read_header() {\n  // Open the file as text\n  std::ifstream handle;\n  handle.open(m_pcd_file.c_str());\n  if (handle.fail()) {\n    vw_throw(vw::IOErr() << \"Unable to open file \\\"\" << m_pcd_file << \"\\\"\");\n  }\n  // Start checking all of the header elements\n  bool valid = true;\n  std::string line, dummy, value;\n  std::getline(handle, line);\n  while (line[0] == '#') // Skip initial comment lines\n    std::getline(handle, line);\n  // Check the header version - we only support one kind for now.\n  boost::to_lower(line);\n  if (line.find(\"version 0.7\") == std::string::npos) {\n    vw::vw_out() << \"Error: Unsupported PCD file version: \" << line << \"\\n\";\n    valid = false;\n  }\n  // Verify the fields\n  std::getline(handle, line);\n  boost::to_lower(line);\n  if (line.find(\"fields x y z\") == std::string::npos) {\n    vw::vw_out() << \"Error: Unsupported PCD fields: \" << line << \"\\n\";\n    valid = false;\n  }\n  // Get some other information, no checking here...\n  handle >> dummy >> m_size_bytes;\n  std::getline(handle, line); // Go to the next line\n  if ((m_size_bytes != 4) && (m_size_bytes != 8)) {\n    vw::vw_out() << \"Error: Unsupported byte size: \" << m_size_bytes << \"\\n\";\n    valid = false;\n  }\n  handle >> dummy >> m_type;\n  std::getline(handle, line); // Go to the next line\n  if (m_type == 'F')\n    m_type = 'f';\n  if (m_type != 'f') {\n    vw::vw_out() << \"Error: Currently only Float type PCD files are supported.\\n\";\n    valid = false;\n  }\n\n  // Get size info\n  int width, height, count;\n  handle >> dummy >> count;\n  std::getline(handle, line); // Go to the next line\n  if (count != 1) {\n    vw::vw_out() << \"Error: Unsupported PCD count: \" << count << \"\\n\";\n    valid = false;\n  }\n  handle >> dummy >> width >> dummy >> height;\n  std::getline(handle, line); // Skip viewpoint line\n  std::getline(handle, line);\n  handle >> dummy >> m_num_points;\n  if (m_num_points != (static_cast<size_t>(width*height))) {\n    vw::vw_out() << \"Error: PCD point count error!\\n\";\n    valid = false;\n  }\n  // Get the type of file, ascii or binary\n  handle >> dummy >> value;\n  boost::to_lower(value);\n  m_binary_format = (value != \"ascii\");\n\n  if (handle.fail()) {\n    vw::vw_out() << \"Error: PCD read error!\\n\";\n    valid = false;\n  }\n\n  m_header_length_bytes = handle.tellg();\n\n  // Stop reading the header file\n  handle.close();\n  if (!valid)\n    vw::vw_throw(vw::ArgumentErr() << \"Fatal error reading PCD file: \" << m_pcd_file);\n}\n\nPcdReader::PcdReader(std::string const & pcd_file)\n  : m_pcd_file(pcd_file), m_has_valid_point(false) {\n\n  // For now PCD files are required to be in XYZ GCC format.\n  m_has_georef = false;\n\n  read_header();\n\n  // Open the file for data reading in the proper format then skip past the header\n  if (m_binary_format)\n    m_ifs = new std::ifstream (m_pcd_file.c_str(), std::ios_base::binary);\n  else\n    m_ifs = new std::ifstream (m_pcd_file.c_str());\n\n  m_ifs->seekg(m_header_length_bytes);\n}\n\nbool PcdReader::ReadNextPoint() {\n\n  // Check if there is more data\n  if (!m_ifs->good()) {\n    m_has_valid_point = false;\n    return false;\n  }\n\n  if (m_binary_format) {\n\n    if (m_size_bytes == 4) { // -> float\n      float x, y, z;\n      m_ifs->read(reinterpret_cast<char*>(&x), m_size_bytes);\n      m_ifs->read(reinterpret_cast<char*>(&y), m_size_bytes);\n      m_ifs->read(reinterpret_cast<char*>(&z), m_size_bytes);\n      m_curr_point = vw::Vector3(x, y, z);\n    } else { // 8 bytes -> double\n      double x, y, z;\n      m_ifs->read(reinterpret_cast<char*>(&x), m_size_bytes);\n      m_ifs->read(reinterpret_cast<char*>(&y), m_size_bytes);\n      m_ifs->read(reinterpret_cast<char*>(&z), m_size_bytes);\n      m_curr_point = vw::Vector3(x, y, z);\n    }\n\n  } else { // Text format\n\n    // Read in the next point\n    double x, y, z;\n    (*m_ifs) >> x >> y >> z;\n    m_curr_point = vw::Vector3(x, y, z);\n  }\n\n  // Make sure the reads succeeded\n  if (m_ifs->fail()) {\n    m_has_valid_point = false;\n    return false;\n  }\n\n  return true;\n}\n\nvw::Vector3 PcdReader::GetPoint() {\n  return m_curr_point;\n}\n\nPcdReader::~PcdReader() {\n  delete m_ifs;\n  m_ifs = NULL;\n}\n\nstd::int64_t pcd_file_size(std::string const& file) {\n  PcdReader reader(file);\n  return reader.m_num_points;\n}\n\n/// Create a Tif file from a point cloud. The file will be created block by\n/// block, when it needs to be written to disk. In each block the points will\n/// be organized into chips by location. It is important that the writer\n/// invoking this image be single-threaded, as we read from the cloud file\n/// sequentially. The LAS file is handled separately, as PDAL does not have a\n/// function for getting a point. The point cloud is in CSV or PCL format,\n/// with PCL not tested yet.\nclass CloudToTif: public vw::ImageViewBase<CloudToTif> {\n\n  typedef vw::Vector3 PixelT;\n\n  asp::BaseReader * m_reader;\n  int m_rows, m_cols; // These are pixel sizes, not tile counts.\n  int m_block_size;\n\npublic:\n\n  typedef PixelT pixel_type;\n  typedef PixelT result_type;\n  typedef vw::ProceduralPixelAccessor<CloudToTif> pixel_accessor;\n\n  CloudToTif(asp::BaseReader * reader, int image_rows,\n                int image_cols, int block_size):\n    m_reader(reader), m_rows(image_rows), m_cols(image_cols),\n    m_block_size(block_size) {}\n\n  inline vw::int32 cols  () const { return m_cols; }\n  inline vw::int32 rows  () const { return m_rows; }\n  inline vw::int32 planes() const { return 1; }\n\n  inline pixel_accessor origin() const { return pixel_accessor(*this); }\n\n  inline result_type operator()(size_t i, size_t j, size_t p=0) const {\n    vw::vw_throw(vw::NoImplErr()\n                 << \"CloudToTif::operator(...) has not been implemented.\\n\");\n    return result_type();\n  }\n\n  typedef vw::CropView<vw::ImageView<PixelT>> prerasterize_type;\n  inline prerasterize_type prerasterize(vw::BBox2i const& bbox) const {\n\n    // Read a chunk of the las file, and store it in the current tile.\n\n    std::int64_t num_cols = bbox.width();\n    std::int64_t num_rows = bbox.height();\n\n    VW_ASSERT((num_rows % m_block_size == 0) && (num_cols % m_block_size == 0),\n              vw::ArgumentErr() << \"CloudToTif: Expecting the number of rows and columns \"\n                            << \"to be a multiple of the block size.\\n\");\n\n    // Read the specified number of points from the file\n    std::int64_t max_num_pts_to_read = num_cols * num_rows;\n    std::int64_t count = 0;\n    vw::PointBuffer in;\n    while (m_reader->ReadNextPoint()) {\n      in.push_back(m_reader->GetPoint());\n      count++;\n      if (count >= max_num_pts_to_read)\n        break;\n    }\n\n    // Take the points just read, and put them in groups by spatial\n    // location, so that later point2dem does not need to read every\n    // input point when writing a given tile, but only certain groups.\n    vw::ImageView<vw::Vector3> Img;\n    vw::Chipper(in, m_block_size, m_reader->m_has_georef, m_reader->m_georef,\n            num_cols, num_rows, Img);\n\n    VW_ASSERT(num_cols == Img.cols() && num_rows == Img.rows(),\n              vw::ArgumentErr() << \"CloudToTif: Size mis-match.\\n\");\n\n    return crop(Img, -bbox.min().x(), -bbox.min().y(), cols(), rows());\n  }\n\n  template <class DestT>\n  inline void rasterize(DestT const& dest, vw::BBox2i const& bbox) const {\n    vw::rasterize(prerasterize(bbox), dest, bbox);\n  }\n\n}; // End class CloudToTif\n\n// We will fetch a chunk of the las file of area ASP_POINT_CLOUD_TILE_LEN x\n// ASP_POINT_CLOUD_TILE_LEN, split it into bins of spatially close points, and write\n// it to disk as a tile in a vector tif image. The bigger the tile\n// size, the more likely the binning will be more efficient. But big\n// tiles use a lot of memory. Each tile will be partitioned in chips\n// of size block_size x block_size, which is always 128, consistent\n// with what point2dem later uses.\nvoid las_or_csv_to_tif(std::string const& in_file,\n                       std::string const& out_prefix,\n                       int num_rows, int block_size,\n                       vw::BBox2 const& copc_win, bool copc_read_all,\n                       vw::GdalWriteOptions & opt, // will change\n                       vw::cartography::GeoReference const& csv_georef,\n                       asp::CsvConv const& csv_conv,\n                       std::vector<std::string> & out_files) {\n\n  // Wipe the output\n  out_files.clear();\n\n  // To do: Study performance for large files when this number changes\n  vw::Vector2i tile_size(ASP_POINT_CLOUD_TILE_LEN, ASP_POINT_CLOUD_TILE_LEN);\n\n  // Temporarily change the raster tile size\n  vw::Vector2 original_tile_size = opt.raster_tile_size;\n  opt.raster_tile_size = tile_size;\n\n  boost::shared_ptr<asp::BaseReader> reader_ptr;\n  if (asp::is_csv(in_file)) // CSV\n    reader_ptr = boost::shared_ptr<asp::CsvReader>\n      (new asp::CsvReader(in_file, csv_conv, csv_georef));\n  else if (asp::is_pcd(in_file)) // PCD\n    reader_ptr = boost::shared_ptr<asp::PcdReader>(new asp::PcdReader(in_file));\n  else if (asp::is_tif(in_file))\n    reader_ptr = boost::shared_ptr<asp::TifReader>(new asp::TifReader(in_file));\n  else if (asp::is_las(in_file))\n     reader_ptr = boost::shared_ptr<asp::BaseReader>(); // see below for las\n  else\n    vw::vw_throw(vw::ArgumentErr() << \"Unknown file type: \" << in_file << \"\\n\");\n\n  // LAS files have a totally different interface, so have to be handled separately.\n  if (asp::is_las(in_file)) { // LAS\n                             \n    // Set up the reader\n    boost::shared_ptr<pdal::Reader> pdal_reader;\n    pdal::Options read_options;\n    std::int64_t num_total_points = 0; // will change\n    asp::setupLasOrCopcReader(in_file, copc_win, copc_read_all,\n                              pdal_reader, read_options, num_total_points);\n    // buf_size is the number of points that will be processed and kept in this\n    // table at the same time. A somewhat bigger value may result in some\n    // efficiencies.\n    vw::vw_out() << \"Breaking up the LAS file into spatially-organized files.\\n\";\n    int buf_size = 100;\n    pdal::FixedPointTable t(buf_size);\n    pdal_reader->prepare(t);\n    vw::cartography::GeoReference las_georef;\n    bool has_georef = asp::georef_from_las(in_file, las_georef);\n    asp::ChipMaker writer(ASP_POINT_CLOUD_TILE_LEN, block_size, has_georef, las_georef,\n                          opt, out_prefix, out_files);\n    pdal::Options write_options;\n    // The option below will be needed when upgrading PDAL. For now it fails.\n    write_options.add(\"filename\", in_file); // not used, part of API\n    writer.setOptions(write_options);\n    writer.setInput(*pdal_reader);\n    writer.prepare(t);\n    writer.execute(t);\n\n  } else { // CSV or PCD\n\n    // Compute the dimensions of the temporary image we are about to create. \n    std::int64_t num_points = reader_ptr->m_num_points;\n    int num_row_tiles  = std::max(1, (int)ceil(double(num_rows)/ASP_POINT_CLOUD_TILE_LEN));\n    int image_rows     = ASP_POINT_CLOUD_TILE_LEN * num_row_tiles;\n    int points_per_row = (int)ceil(double(num_points)/image_rows);\n    int num_col_tiles  = (int)ceil(double(points_per_row)/ASP_POINT_CLOUD_TILE_LEN);\n    num_col_tiles      = std::max(1, num_col_tiles);\n    int image_cols     = ASP_POINT_CLOUD_TILE_LEN * num_col_tiles;\n\n    // For small CSV files, an image of dimensions ASP_POINT_CLOUD_TILE_LEN is\n    // way too large and gridding is slow rather than instant. We will make the\n    // size smaller while respecting all assumptions.\n    if (num_points < ASP_POINT_CLOUD_TILE_LEN * ASP_POINT_CLOUD_TILE_LEN) {\n      // Ensure multiple of block size\n      int len = ceil(sqrt(num_points * 1.0) / block_size) * block_size;\n      len = std::max(len, 1);\n      len = std::min(len, ASP_POINT_CLOUD_TILE_LEN);\n      image_rows = len;\n      image_cols = len;\n    }\n\n    // Create the image. This will also separate it into chips, with each\n    // chip having points that are spatially close together.\n    vw::ImageViewRef<vw::Vector3> Img\n      = asp::CloudToTif(reader_ptr.get(), image_rows, image_cols, block_size);\n    // Must use a thread only, as we read the input file serially\n    std::string out_file = out_prefix + \".tif\";\n    vw::vw_out() << \"Writing spatially ordered data: \" << out_file << \"\\n\";\n    auto tpc = vw::TerminalProgressCallback(\"asp\", \"\\t--> \");\n    vw::GdalWriteOptions local_opt = opt;\n    local_opt.cog = false;  // Do not use COG with temporary files\n    vw::cartography::write_gdal_image(out_file, Img, local_opt, tpc);\n    out_files.push_back(out_file);\n  }\n\n  // Restore the original tile size\n  opt.raster_tile_size = original_tile_size;\n\n  return;\n}\n\n/// Builds a GeoReference from the first cloud having a georeference in the list\nbool georef_from_pc_files(std::vector<std::string> const& files,\n                          vw::cartography::GeoReference & georef) {\n\n  // Initialize\n  georef = vw::cartography::GeoReference();\n\n  for (int i = 0; i < (int)files.size(); i++) {\n    vw::cartography::GeoReference local_georef;\n\n    // Sometimes ASP PC files can have georef, written there by stereo\n    try {\n      if (!is_las(files[i]) && read_georeference(local_georef, files[i])) {\n        georef = local_georef;\n        return true;\n      }\n    } catch(...) {}\n\n    // Sometimes las files can have georef\n    if (is_las(files[i]) && asp::georef_from_las(files[i], local_georef)) {\n      georef = local_georef;\n      return true;\n    }\n  }\n\n  return false;\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Core/PointCloudProcessing.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file PointCloudProcessing.h\n///\n\n// Process point clouds. This makes use of PDAL and ASP's csv logic.\n\n#ifndef __ASP_CORE_POINT_CLOUD_PROCESSING_H__\n#define __ASP_CORE_POINT_CLOUD_PROCESSING_H__\n\n#include <vw/Math/BBox.h>\n\n#include <string>\n#include <vector>\n\nnamespace vw {\n  \n  class GdalWriteOptions;\n  namespace cartography {\n    class GeoReference;\n  }\n}\nnamespace asp {\n  \n  class CsvConv;\n  \n  // Builds a GeoReference from the first cloud having a georeference in the list\n  bool georef_from_pc_files(std::vector<std::string> const& files,\n\t\t\t    vw::cartography::GeoReference & georef);\n\n  /// Fetch a chunk of the las file of area ASP_POINT_CLOUD_TILE_LEN x ASP_POINT_CLOUD_TILE_LEN ,\n  /// split it into bins of spatially close points, and write\n  /// it to disk as a tile in a vector tif image.\n  void las_or_csv_to_tif(std::string const& in_file,\n                         std::string const& out_prefix,\n                         int num_rows, int block_size,\n                         vw::BBox2 const& copc_win, bool copc_read_all,\n                         vw::GdalWriteOptions & opt, // will change\n                         vw::cartography::GeoReference const& csv_georef,\n                         asp::CsvConv const& csv_conv,\n                         std::vector<std::string> & out_files);\n  \n} // End namespace asp\n\n#endif // __ASP_CORE_POINT_CLOUD_PROCESSING_H__\n"
  },
  {
    "path": "src/asp/Core/PointCloudRead.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file PointCloudRead.cc\n///\n/// Pre-compiled wrappers for read_asp_point_cloud<N>. The template\n/// version in GdalUtils.h calls read_channels<N, double> which\n/// instantiates DiskImageView for Vector<double, M> with M=1..12,\n/// costing ~30s of compile time per caller. Keeping the instantiations\n/// here confines that cost to one compilation unit.\n\n#include <asp/Core/PointCloudRead.h>\n#include <asp/Core/GdalUtils.h>\n\nnamespace asp {\n\nvw::ImageViewRef<vw::Vector<double, 3>>\nread_asp_point_cloud_3(std::string const& filename) {\n  return read_asp_point_cloud<3>(filename);\n}\n\nvw::ImageViewRef<vw::Vector<double, 4>>\nread_asp_point_cloud_4(std::string const& filename) {\n  return read_asp_point_cloud<4>(filename);\n}\n\nvw::ImageViewRef<vw::Vector<double, 6>>\nread_asp_point_cloud_6(std::string const& filename) {\n  return read_asp_point_cloud<6>(filename);\n}\n\n} // namespace asp\n"
  },
  {
    "path": "src/asp/Core/PointCloudRead.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file PointCloudRead.h\n///\n/// Pre-compiled wrappers for read_asp_point_cloud<N> to avoid\n/// instantiating the 12-type template ladder in every caller.\n\n#ifndef __ASP_CORE_POINT_CLOUD_READ_H__\n#define __ASP_CORE_POINT_CLOUD_READ_H__\n\n#include <vw/Image/ImageViewRef.h>\n#include <vw/Math/Vector.h>\n#include <string>\n\nnamespace asp {\n\n// Non-template wrappers for reading ASP point clouds with 3, 4, or 6\n// channels. These handle the shift-offset logic and call pre-compiled\n// channel readers, avoiding the 12-type template ladder.\nvw::ImageViewRef<vw::Vector<double, 3>>\nread_asp_point_cloud_3(std::string const& filename);\nvw::ImageViewRef<vw::Vector<double, 4>>\nread_asp_point_cloud_4(std::string const& filename);\nvw::ImageViewRef<vw::Vector<double, 6>>\nread_asp_point_cloud_6(std::string const& filename);\n\n} // namespace asp\n\n#endif\n"
  },
  {
    "path": "src/asp/Core/PointToDem.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2024, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Core/PointToDem.h>\n#include <asp/Core/PointUtils.h>\n#include <asp/Core/PointCloudProcessing.h>\n#include <asp/Core/PdalUtils.h>\n#include <asp/Core/CartographyUtils.h>\n#include <vw/FileIO/DiskImageUtils.h>\n\n#include <vw/Image/AntiAliasing.h>\n#include <vw/Image/Filter.h>\n#include <vw/Image/InpaintView.h>\n\n#include <pdal/PDALUtils.hpp>\n#include <boost/filesystem.hpp>\n\nnamespace fs = boost::filesystem;\n\nusing namespace vw;\nnamespace asp {\n\nDemOptions::DemOptions():\n  nodata_value(-std::numeric_limits<float>::max()),\n  semi_major(0), semi_minor(0),\n  dem_hole_fill_len(0), ortho_hole_fill_len(0), ortho_hole_fill_extra_len(0),\n  remove_outliers_with_pct(true), use_tukey_outlier_removal(false),\n  max_valid_triangulation_error(0),\n  erode_len(0), search_radius_factor(0), sigma_factor(0),\n  default_grid_size_multiplier(1.0),\n  has_las_or_csv_or_pcd(false), max_output_size(9999999, 9999999),\n  auto_proj_center(false), input_is_projected(false) {}\n\n// The files will be input point clouds, and if opt.do_ortho is\n// true, also texture files. If texture files are present, there\n// must be one for each point cloud, and each cloud must have the\n// same dimensions as its texture file.\nvoid parse_input_clouds_textures(std::vector<std::string> const& files,\n                                 DemOptions& opt) {\n\n  int num = files.size();\n  if (num == 0)\n    vw_throw(ArgumentErr() << \"Missing input point clouds.\\n\");\n\n  // Ensure there were no unrecognized options\n  for (int i = 0; i < num; i++) {\n    if (!files[i].empty() && files[i][0] == '-') {\n      vw_throw(ArgumentErr() << \"Unrecognized option: \" << files[i] << \".\\n\");\n    }\n  }\n\n  // Ensure that files exist\n  for (int i = 0; i < num; i++) {\n    if (asp::is_las(files[i]) && pdal::Utils::isRemote(files[i]))\n      continue; // This is a remote file, so we don't check existence\n    if (!fs::exists(files[i]))\n      vw_throw(ArgumentErr() << \"File does not exist: \" << files[i] << \".\\n\");\n  }\n\n  if (opt.do_ortho) {\n    if (num <= 1)\n      vw_throw(ArgumentErr() << \"Missing input texture files.\\n\");\n    if (num%2 != 0)\n      vw_throw(ArgumentErr()\n                << \"There must be as many texture files as input point clouds.\\n\");\n  }\n\n  // Separate the input point clouds from the textures\n  opt.pointcloud_files.clear(); opt.texture_files.clear();\n  for (int i = 0; i < num; i++) {\n    if (asp::is_las_or_csv_or_pcd(files[i]) || get_num_channels(files[i]) >= 3)\n      opt.pointcloud_files.push_back(files[i]);\n    else\n      opt.texture_files.push_back(files[i]);\n  }\n\n  if (opt.pointcloud_files.empty())\n    vw_throw(ArgumentErr() << \"No valid point cloud files were provided.\\n\");\n\n  if (!opt.do_ortho && !opt.texture_files.empty())\n    vw_throw(ArgumentErr() << \"No ortho image was requested, yet texture files were passed as inputs.\\n\");\n\n  // Must have this check here before we start assuming all input files\n  // are tif.\n  opt.has_las_or_csv_or_pcd = false;\n  for (int i = 0; i < (int)files.size(); i++)\n    opt.has_las_or_csv_or_pcd = (opt.has_las_or_csv_or_pcd ||\n                                 opt.input_is_projected ||\n                                 asp::is_las_or_csv_or_pcd(files[i]));\n  if (opt.has_las_or_csv_or_pcd && opt.do_ortho)\n    vw_throw(ArgumentErr()\n             << \"Cannot create orthoimages unless the inputs are PC.tif files.\\n\");\n\n  if (opt.do_ortho) {\n\n    if (opt.pointcloud_files.size() != opt.texture_files.size())\n      vw_throw(ArgumentErr() << \"There must be as many input point clouds \"\n                              << \"as texture files to be able to create orthoimages.\\n\");\n\n    for (int i = 0; i < (int)opt.pointcloud_files.size(); i++) {\n      // Here we ignore that a point cloud file may have many channels.\n      // We just want to verify that the cloud file and texture file\n      // have the same number of rows and columns.\n      DiskImageView<float> cloud(opt.pointcloud_files[i]);\n      DiskImageView<float> texture(opt.texture_files[i]);\n      if (cloud.cols() != texture.cols() || cloud.rows() != texture.rows())\n        vw_throw(ArgumentErr() << \"Point cloud \" << opt.pointcloud_files[i]\n                                << \" and texture file \" << opt.texture_files[i]\n                                << \" do not have the same dimensions.\\n\");\n    }\n  }\n\n  return;\n}\n\n// Convert any LAS, CSV, PCD, or unorganized TIF files to ASP tif files. We do\n// some binning to make the spatial data more localized, to improve performance.\n// We will later wipe these temporary tif files.\nvoid chip_convert_to_tif(DemOptions const& opt,\n                         asp::CsvConv const& csv_conv,\n                         vw::cartography::GeoReference const& csv_georef,\n                         // Outputs\n                         std::vector<std::string> & pc_files, \n                         std::vector<std::string> & conv_files) {\n\n  if (!opt.has_las_or_csv_or_pcd)\n    return;\n\n  Stopwatch sw;\n  sw.start();\n\n  // Error checking for CSV\n  int num_files = pc_files.size();\n  for (int i = 0; i < num_files; i++) {\n    if (!asp::is_csv(pc_files[i]))\n      continue;\n    if (opt.csv_format_str == \"\")\n      vw_throw(ArgumentErr() \n               << \"CSV files were passed in, but the option --csv-format was not set.\\n\");\n  }\n\n  // There are situations in which some files will already be tif, and\n  // others will be LAS or CSV. When we convert the latter to tif,\n  // we'd like to be able to match the number of rows of the existing\n  // tif files, so later when we concatenate all these files from left\n  // to right for the purpose of creating the DEM, we waste little space.\n  std::int64_t num_rows = 0;\n  for (int i = 0; i < num_files; i++) {\n    if (asp::is_las_or_csv_or_pcd(pc_files[i]))\n      continue;\n    DiskImageView<float> img(pc_files[i]);\n    // Record the max number of rows across all input tifs\n    num_rows = std::max(num_rows, std::int64_t(img.rows()));\n  }\n\n  // No tif files exist. Find a reasonable value for the number of rows.\n  if (num_rows == 0) {\n    std::int64_t max_num_pts = 0;\n    for (int i = 0; i < num_files; i++) {\n      std::string file = pc_files[i];\n      if (asp::is_las(file))\n        max_num_pts = std::max(max_num_pts, asp::las_file_size(file));\n      if (asp::is_csv(file))\n        max_num_pts = std::max(max_num_pts, asp::csv_file_size(file));\n      // Note: PCD support needs to be tested!\n      if (asp::is_pcd(file))\n        max_num_pts = std::max(max_num_pts, asp::pcd_file_size(file));\n      // No need to check for other cases: at least one file must be las or csv or pcd!\n    }\n    num_rows = std::max(std::int64_t(1), (std::int64_t)ceil(sqrt(double(max_num_pts))));\n  }\n\n  // This is very important. For efficiency later, we don't want to\n  // create blocks smaller than what OrthoImageView will use later.\n  int block_size = ASP_MAX_SUBBLOCK_SIZE;\n\n  // For csv and las files, create temporary tif files. In those files\n  // we'll have the points binned so that nearby points have nearby\n  // indices.  This is key to fast rasterization later.\n  std::vector<std::string> all_out_files;\n  for (int i = 0; i < num_files; i++) {\n\n    if (!asp::is_las_or_csv_or_pcd(pc_files[i]) && !opt.input_is_projected) {\n      // Skip organized tif files\n      all_out_files.push_back(pc_files[i]);\n      continue;\n    }\n\n    std::string in_file = pc_files[i];\n    vw::vw_out() << \"Processing file: \" << in_file << \"\\n\";\n    std::string stem = fs::path(in_file).stem().string();\n    std::string suffix;\n    if (opt.out_prefix.find(stem) != std::string::npos)\n      suffix = \"\";\n    else\n      suffix = \"-\" + stem;\n    std::string file_prefix = opt.out_prefix + \"-tmp\" + suffix;\n\n    // Perform the actual conversion to a tif file\n    std::vector<std::string> out_files;\n    vw::GdalWriteOptions l_opt = opt; // Copy the write options\n    asp::las_or_csv_to_tif(in_file, file_prefix, num_rows, block_size,\n                           opt.copc_win, opt.copc_read_all,\n                           l_opt, csv_georef, csv_conv, out_files);\n\n    // Keep track of all produced files, and separately of conv_files.\n    std::copy(out_files.begin(), out_files.end(), std::back_inserter(all_out_files));\n    std::copy(out_files.begin(), out_files.end(), std::back_inserter(conv_files));\n  }\n\n  // Update the list of all files\n  pc_files = all_out_files;\n\n  sw.stop();\n  vw_out(DebugMessage,\"asp\") << \"LAS or CSV to TIF conversion time: \"\n                             << sw.elapsed_seconds() << \" seconds.\\n\";\n\n}\n\n// Set the projection based on options. By now opt.proj_lon and opt.proj_lat\n// should have been set. \nvoid setProjection(DemOptions const& opt, cartography::GeoReference & output_georef) {\n  \n  // Can set a projection either via a string or via options\n  if (!opt.target_srs_string.empty() && opt.target_srs_string != \"auto\")\n    vw::vw_throw(ArgumentErr()\n                << \"Using a projection with --t_srs precludes settting it in other ways.\");\n  \n  // Shorten notation\n  double lon = opt.proj_lon, lat = opt.proj_lat, s = opt.proj_scale;\n  double e = opt.false_easting, n = opt.false_northing;\n\n  switch (opt.projection) {\n    case SINUSOIDAL:           \n      output_georef.set_sinusoidal(lon, e, n); \n      break;\n    case MERCATOR:             \n      output_georef.set_mercator(lat, lon, s, e, n); \n      break;\n    case TRANSVERSEMERCATOR:   \n      output_georef.set_transverse_mercator(lat, lon, s, e, n); \n      break;\n    case ORTHOGRAPHIC:         \n      output_georef.set_orthographic(lat, lon, e, n); \n      break;\n    case STEREOGRAPHIC:        \n      output_georef.set_stereographic(lat, lon, s, e, n); \n      break;\n    case OSTEREOGRAPHIC:       \n      output_georef.set_oblique_stereographic(lat, lon, s, e, n); \n      break;\n    case GNOMONIC:             \n      output_georef.set_gnomonic(lat, lon, s, e, n); \n      break;\n    case LAMBERTAZIMUTHAL:     \n      output_georef.set_lambert_azimuthal(lat, lon, e, n); \n      break;\n    case UTM:                  \n      output_georef.set_UTM(opt.utm_zone); \n      break;\n    case GEOGRAPHIC:           \n      output_georef.set_geographic(); \n      break;\n    case AUTO_DETERMINED:   \n      setAutoProj(lat, lon, output_georef);\n      break;\n    default:\n      // Throw an error if the projection is not set\n      vw::vw_throw(ArgumentErr() << \"No projection was set.\\n\");\n  }\n  \n  return;\n} \n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Core/PointToDem.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2024, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file PointToDem.h\n/// Utility functions for point2dem\n\n#ifndef __ASP_CORE_POINT_TO_DEM_H__\n#define __ASP_CORE_POINT_TO_DEM_H__\n\n#include <vw/FileIO/GdalWriteOptions.h>\n#include <asp/Core/OrthoRasterizer.h>\n\nnamespace vw {\n  namespace cartography {\n    class Datum;\n    class GeoReference;\n  }\n}\n\nnamespace asp {\n\nclass CsvConv;\n\n// This is a list of types the user can specify for output with a dedicated\n// command line flag.\nenum ProjectionType {\n  SINUSOIDAL,\n  MERCATOR,\n  TRANSVERSEMERCATOR,\n  ORTHOGRAPHIC,\n  STEREOGRAPHIC,\n  OSTEREOGRAPHIC,\n  GNOMONIC,\n  LAMBERTAZIMUTHAL,\n  UTM,\n  GEOGRAPHIC,\n  AUTO_DETERMINED\n};\n\nstruct DemOptions: vw::GdalWriteOptions {\n  // Input\n  std::vector<std::string> pointcloud_files, texture_files;\n\n  // Settings\n  std::vector<double> dem_spacing;\n  float       nodata_value;\n  double      semi_major, semi_minor;\n  std::string reference_spheroid, datum;\n  double      proj_lat, proj_lon, proj_scale, false_easting, false_northing;\n  double      lon_offset, lat_offset, height_offset;\n  size_t      utm_zone;\n  ProjectionType projection;\n  bool        has_alpha, do_normalize, do_ortho, do_error, propagate_errors, no_dem,\n              scalar_error;\n  double      rounding_error;\n  std::string target_srs_string;\n  vw::BBox2   target_projwin, copc_win;\n  int         dem_hole_fill_len, ortho_hole_fill_len, ortho_hole_fill_extra_len;\n  bool        remove_outliers_with_pct, use_tukey_outlier_removal;\n  vw::Vector2 remove_outliers_params;\n  double      max_valid_triangulation_error;\n  vw::Vector2 median_filter_params;\n  int         erode_len;\n  std::string csv_format_str, csv_srs, filter;\n  std::string csv_proj4_str; // for backward compatibility\n  double      search_radius_factor, sigma_factor, default_grid_size_multiplier;\n  bool        has_las_or_csv_or_pcd, auto_proj_center, copc_read_all;\n  vw::Vector2i max_output_size;\n  bool        input_is_projected, gdal_tap;\n  \n  // Output\n  std::string out_prefix, output_file_type;\n\n  // Constructor\n  DemOptions();\n};\n\nvoid parse_input_clouds_textures(std::vector<std::string> const& files,\n                                 DemOptions& opt);\n\n// Convert any LAS or CSV files to ASP tif files. We do some binning to make the\n// spatial data more localized, to improve performance. We will later wipe these\n// temporary tif files.\nvoid chip_convert_to_tif(DemOptions const& opt,\n                         asp::CsvConv const& csv_conv,\n                         vw::cartography::GeoReference const& csv_georef,\n                         std::vector<std::string> & pc_files, \n                         std::vector<std::string> & conv_files);\n\n// Rasterize a DEM\nvoid rasterize_cloud(asp::OrthoRasterizerView& rasterizer,\n                     DemOptions& opt,\n                     vw::cartography::GeoReference& georef,\n                     std::int64_t * num_invalid_pixels);\n\n// Set the projection based on options. By now opt.proj_lon and opt.proj_lat\n// should have been set. \nvoid setProjection(DemOptions const& opt, vw::cartography::GeoReference & output_georef);\n\n} // end namespace asp\n\n#endif//__ASP_CORE_POINT_TO_DEM_H__\n"
  },
  {
    "path": "src/asp/Core/PointToDem2.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Core/PointToDem.h>\n#include <asp/Core/PointUtils.h>\n#include <asp/Core/GdalUtils.h>\n\n#include <vw/Image/AntiAliasing.h>\n#include <vw/Image/FillHoles.h>\n#include <vw/Image/Filter.h>\n#include <vw/Image/InpaintView.h>\n\n#include <boost/filesystem.hpp>\n\n#include <cmath>\n\nnamespace fs = boost::filesystem;\n\n// Moved here some logic from PointToDem.cc to speed up compilation.\n\nusing namespace vw;\n\nnamespace asp {\n\n// Write an image to disk while handling some common options.\ntemplate<class ImageT>\nvoid save_image(DemOptions & opt, ImageT img, vw::cartography::GeoReference const& georef,\n                int hole_fill_len, std::string const& imgName) {\n\n  // When hole-filling is used, we need to look hole_fill_len beyond\n  // the current block.  If the block size is 256, and hole fill len\n  // is big, like 512 or 1024, we end up processing a huge block\n  // only to save a small center block.  For that reason, save\n  // temporarily with big blocks, and then re-save with small blocks.\n  if (hole_fill_len > 512)\n    vw_out(WarningMessage) << \"Detected large hole-fill length. \"\n                            << \"Memory usage and run-time may go up.\\n\";\n\n  int block_size = nextpow2(2.0*hole_fill_len);\n  block_size = std::max(256, block_size);\n\n  // Append a tag if desired to compute the min, max, etc. Later on, in OrthoRasterizer\n  // we do a full validation of opt.filter.\n  std::string tag = \"\";\n  if (opt.filter != \"weighted_average\")\n    tag = \"-\" + opt.filter;\n\n  std::string output_file = opt.out_prefix + tag + \"-\" + imgName\n    + \".\" + opt.output_file_type;\n  vw_out() << \"Writing: \" << output_file << \"\\n\";\n  TerminalProgressCallback tpc(\"asp\", imgName + \": \");\n  bool has_georef = true, has_nodata = true;\n  if (opt.output_file_type == \"tif\")\n    asp::saveWithTempBigBlocks(block_size, output_file, img,\n                               has_georef, georef,\n                               has_nodata, opt.nodata_value, opt, tpc);\n  else\n    vw::cartography::write_gdal_image(output_file, img, georef, opt, tpc);\n} // End function save_image\n\n// Round pixels in given image to multiple of given scale.\n// Don't round nodata values.\ntemplate <class PixelT>\nstruct RoundImagePixelsSkipNoData: public vw::ReturnFixedType<PixelT> {\n\n  double m_scale, m_nodata;\n\n  RoundImagePixelsSkipNoData(double scale, double nodata):\n  m_scale(scale), m_nodata(nodata) {}\n\n  PixelT operator() (PixelT const& pt) const {\n\n    // We will pass in m_scale = 0 if we don't want rounding to happen.\n    if (m_scale <= 0)\n      return pt;\n\n    // Skip given pixel if any channels are nodata\n    int num_channels = PixelNumChannels<PixelT>::value;\n    typedef typename CompoundChannelType<PixelT>::type channel_type;\n    for (int c = 0; c < num_channels; c++) {\n      if ((double)compound_select_channel<channel_type const&>(pt,c) == m_nodata)\n        return pt;\n    }\n\n    return PixelT(m_scale*round(channel_cast<double>(pt)/m_scale));\n  }\n\n};\n\n// If the third component of a vector is NaN, mask that vector as invalid\ntemplate<class VectorT>\nstruct NaN2Mask: public ReturnFixedType<PixelMask<VectorT>> {\n  NaN2Mask() {}\n  PixelMask<VectorT> operator() (VectorT const& vec) const {\n    if (std::isnan(vec.z()))\n      return PixelMask<VectorT>(); // invalid\n    else\n      return PixelMask<VectorT>(vec); // valid\n  }\n};\n\n// Reverse the operation of NaN2Mask\ntemplate<class VectorT>\nstruct Mask2NaN: public ReturnFixedType<VectorT> {\n  Mask2NaN() {}\n  VectorT operator() (PixelMask<VectorT> const& pvec) const {\n    if (!is_valid(pvec))\n      return VectorT(0, 0, std::numeric_limits<typename VectorT::value_type>::quiet_NaN());\n    else\n      return pvec.child();\n  }\n};\n\n// If the third component of a vector is NaN, assign to it the given no-data value\nstruct NaN2NoData: public ReturnFixedType<Vector3> {\n  NaN2NoData(float nodata_val):m_nodata_val(nodata_val) {}\n  float m_nodata_val;\n  Vector3 operator() (Vector3 const& vec) const {\n    if (std::isnan(vec.z()))\n      return Vector3(m_nodata_val, m_nodata_val, m_nodata_val); // invalid\n    else\n      return vec; // valid\n  }\n};\n\n// Take a given point xyz and the error at that point. Convert the\n// error to the NED (North-East-Down) coordinate system.\nstruct ErrorToNED: public ReturnFixedType<Vector3> {\n  vw::cartography::GeoReference m_georef;\n  ErrorToNED(vw::cartography::GeoReference const& georef):m_georef(georef) {}\n\n  Vector3 operator() (Vector6 const& pt) const {\n\n    Vector3 xyz = subvector(pt, 0, 3);\n    if (xyz == Vector3()) return Vector3();\n\n    Vector3   err     = subvector(pt, 3, 3);\n    Vector3   llh     = m_georef.datum().cartesian_to_geodetic(xyz);\n    Matrix3x3 M       = m_georef.datum().lonlat_to_ned_matrix(llh);\n    Vector3   ned_err = inverse(M)*err;\n    return ned_err;\n  }\n};\ntemplate <class ImageT>\nUnaryPerPixelView<ImageT, ErrorToNED>\ninline error_to_NED(ImageViewBase<ImageT> const& image,\n                    vw::cartography::GeoReference const& georef) {\n  return UnaryPerPixelView<ImageT, ErrorToNED>(image.impl(), ErrorToNED(georef));\n}\n\ntemplate <class ImageT>\nvw::UnaryPerPixelView<ImageT, RoundImagePixelsSkipNoData<typename ImageT::pixel_type>>\ninline round_image_pixels_skip_nodata(vw::ImageViewBase<ImageT> const& image,\n                                      double scale, double nodata) {\n  return vw::UnaryPerPixelView<ImageT, RoundImagePixelsSkipNoData<typename ImageT::pixel_type>>\n    (image.impl(), RoundImagePixelsSkipNoData<typename ImageT::pixel_type>(scale, nodata));\n}\n\n// A class for combining the three channels of errors and finding their absolute\n// values.\nclass CombinedAbsView: public ImageViewBase<CombinedAbsView> {\n  double m_nodata_value;\n  ImageViewRef<PixelGray<float>> m_image1;\n  ImageViewRef<PixelGray<float>> m_image2;\n  ImageViewRef<PixelGray<float>> m_image3;\n\npublic:\n\n  typedef Vector3f pixel_type;\n  typedef const Vector3f result_type;\n  typedef ProceduralPixelAccessor<CombinedAbsView> pixel_accessor;\n\n  CombinedAbsView(double nodata_value,\n                  ImageViewRef<PixelGray<float>> image1,\n                  ImageViewRef<PixelGray<float>> image2,\n                  ImageViewRef<PixelGray<float>> image3):\n    m_nodata_value(nodata_value),\n    m_image1(image1),\n    m_image2(image2),\n    m_image3(image3) {}\n\n  inline int32 cols  () const { return m_image1.cols(); }\n  inline int32 rows  () const { return m_image1.rows(); }\n  inline int32 planes() const { return 1; }\n\n  inline pixel_accessor origin() const { return pixel_accessor(*this); }\n\n  inline result_type operator()(size_t i, size_t j, size_t p=0) const {\n\n    Vector3f error(m_image1(i, j), m_image2(i, j), m_image3(i, j));\n\n    if (error[0] == m_nodata_value || error[1] == m_nodata_value ||\n        error[2] == m_nodata_value) {\n      return Vector3f(m_nodata_value, m_nodata_value, m_nodata_value);\n    }\n\n    return Vector3f(std::abs(error[0]), std::abs(error[1]), std::abs(error[2]));\n  }\n\n  typedef CombinedAbsView prerasterize_type;\n  inline prerasterize_type prerasterize(BBox2i const& bbox) const {\n    return prerasterize_type(m_nodata_value,\n                             m_image1.prerasterize(bbox),\n                             m_image2.prerasterize(bbox),\n                             m_image3.prerasterize(bbox));\n  }\n  template <class DestT>\n  inline void rasterize(DestT const& dest, BBox2i const& bbox) const {\n    vw::rasterize(prerasterize(bbox), dest, bbox);\n  }\n};\nCombinedAbsView combine_abs_channels(double nodata_value,\n                                     ImageViewRef<PixelGray<float>> image1,\n                                     ImageViewRef<PixelGray<float>> image2,\n                                     ImageViewRef<PixelGray<float>> image3) {\n  VW_ASSERT(image1.cols() == image2.cols() &&\n            image2.cols() == image3.cols() &&\n            image1.rows() == image2.rows() &&\n            image2.rows() == image3.rows(),\n            ArgumentErr() << \"Expecting the error channels to have the same size.\");\n\n  return CombinedAbsView(nodata_value, image1, image2, image3);\n}\n\n// Save the DEM\nvoid save_dem(DemOptions & opt,\n              vw::cartography::GeoReference const& georef,\n              asp::OrthoRasterizerView& rasterizer,\n              Vector2 const& tile_size,\n              std::int64_t * num_invalid_pixels) {\n\n  // The value stored in num_invalid_pixels will get updated as the DEM is being\n  // written to disk. That because OrthoRasterizerView has a pointer to it.\n  // This must be reset before each use.\n  // TODO(oalexan1): This logic is confusing. Better have two member functions that\n  // first reset and later get this number.\n  *num_invalid_pixels = 0;\n\n  // We use the existing texture channel, which is the height.\n  Stopwatch sw2;\n  sw2.start();\n  ImageViewRef<PixelGray<float>> dem\n    = asp::round_image_pixels_skip_nodata(rasterizer.impl(), opt.rounding_error,\n                                          opt.nodata_value);\n\n  int hole_fill_len = opt.dem_hole_fill_len;\n  if (hole_fill_len > 0) {\n    // Note that we first cache the tiles of the rasterized DEM, and\n    // fill holes later. This greatly improves the performance.\n    dem = apply_mask\n      (vw::fill_holes_grass(create_mask\n                              (block_cache(dem, tile_size, opt.num_threads),\n                              opt.nodata_value),\n                              hole_fill_len),\n        opt.nodata_value);\n  }\n\n  // Stop the program if it is going to create too large a DEM, this will\n  // cause a crash.\n  Vector2i dem_size = bounding_box(dem).size();\n  vw_out()<< \"Creating output file that is \" << dem_size << \" px.\\n\";\n  if ((dem_size[0] > opt.max_output_size[0]) || (dem_size[1] > opt.max_output_size[1]))\n    vw_throw(ArgumentErr()\n              << \"Requested DEM size is too large, max allowed output size is \"\n              << opt.max_output_size << \" pixels.\\n\");\n\n  asp::save_image(opt, dem, georef, hole_fill_len, \"DEM\");\n  sw2.stop();\n  vw_out(DebugMessage,\"asp\") << \"DEM render time: \" << sw2.elapsed_seconds() << \".\\n\";\n\n  // num_invalid_pixels was updated as the DEM was written.\n  double num_invalid_pixelsD = *num_invalid_pixels;\n\n  // Below we convert to double first and multiply later, to avoid\n  // 32-bit integer overflow.\n  double num_total_pixels = double(dem_size[0]) * double(dem_size[1]);\n\n  double invalid_ratio = num_invalid_pixelsD / num_total_pixels;\n  vw_out() << \"Percentage of valid pixels: \"\n            << 100.0*(1.0 - invalid_ratio) << \"%\\n\";\n\n  // Wipe after use. This will reset the counter in OrthoRasterizerView.\n  *num_invalid_pixels = 0;\n}\n\n// Save the intersection error\nvoid save_intersection_error(DemOptions & opt,\n                             bool has_stddev,\n                             vw::cartography::GeoReference const& georef,\n                             Vector2 const& tile_size,\n                             asp::OrthoRasterizerView& rasterizer) {\n\n  int hole_fill_len = 0;\n  int num_channels = asp::num_channels(opt.pointcloud_files);\n\n  if (num_channels == 4 || (num_channels == 6 && has_stddev) || opt.scalar_error) {\n    // The error is a scalar (4 channels or 6 channels but last two are stddev),\n    // or we want to find the norm of the error.\n    ImageViewRef<double> error_channel = asp::point_cloud_error_image(opt.pointcloud_files);\n    rasterizer.set_texture(channel_cast<float>(channels_to_planes(error_channel)));\n    save_image(opt, asp::round_image_pixels_skip_nodata(rasterizer.impl(),\n                                                        opt.rounding_error,\n                                                        opt.nodata_value),\n                georef, hole_fill_len, \"IntersectionErr\");\n  } else if (num_channels == 6) {\n    // The error is a 3D vector. Convert it to NED coordinate system, and rasterize it.\n    ImageViewRef<Vector6> point_disk_image = asp::form_point_cloud_composite<Vector6>\n      (opt.pointcloud_files, ASP_MAX_SUBBLOCK_SIZE);\n    ImageViewRef<Vector3> ned_err = asp::error_to_NED(point_disk_image, georef);\n    std::vector<ImageViewRef<PixelGray<float>>>  rasterized(3);\n    for (int ch_index = 0; ch_index < 3; ch_index++) {\n      ImageViewRef<double> ch = select_channel(ned_err, ch_index);\n      rasterizer.set_texture(channel_cast<float>(channels_to_planes(ch)));\n      rasterized[ch_index] =\n        block_cache(rasterizer.impl(), tile_size, opt.num_threads);\n    }\n    auto err_vec = asp::combine_abs_channels(opt.nodata_value, rasterized[0],\n                                            rasterized[1], rasterized[2]);\n    save_image(opt, asp::round_image_pixels_skip_nodata(err_vec,\n                              opt.rounding_error, opt.nodata_value),\n                georef, hole_fill_len, \"IntersectionErr\");\n  } else {\n    // Note: We don't throw. We still would like to write the\n    // DRG (later) even if we can't write the error image.\n    vw_out() << \"The point cloud files must have an equal number of channels which \"\n              << \"must be 4 or 6 to be able to process the intersection error.\\n\";\n  }\n\n}\n\n// Save horizontal and vertical stddev\nvoid save_stddev(DemOptions & opt,\n                 vw::cartography::GeoReference const& georef,\n                 asp::OrthoRasterizerView& rasterizer) {\n\n  int num_channels = asp::num_channels(opt.pointcloud_files);\n\n  double rounding_error = 0.0;\n  vw_out() << \"Not rounding propagated errors (option: --rounding-error) to avoid \"\n            << \"introducing step artifacts.\\n\";\n\n  // Note: We don't throw here. We still would like to write the\n  // DRG (later) even if we can't write the stddev.\n  if (num_channels != 6) {\n    vw_out() << \"The input point cloud(s) must have 6 channels to be able to \"\n              << \"grid the horizontal and vertical stddev.\\n\";\n  } else {\n    int hole_fill_len = 0;\n    ImageViewRef<Vector6> point_disk_image = asp::form_point_cloud_composite<Vector6>\n      (opt.pointcloud_files, ASP_MAX_SUBBLOCK_SIZE);\n\n    ImageViewRef<double> horizontal_stddev_channel = select_channel(point_disk_image, 4);\n    rasterizer.set_texture(channel_cast<float>(channels_to_planes(horizontal_stddev_channel)));\n    save_image(opt, asp::round_image_pixels_skip_nodata(rasterizer.impl(),\n                                                        rounding_error, // local value\n                                                        opt.nodata_value),\n                georef, hole_fill_len, \"HorizontalStdDev\");\n\n    ImageViewRef<double> vertical_stddev_channel = select_channel(point_disk_image, 5);\n    rasterizer.set_texture(channel_cast<float>(channels_to_planes(vertical_stddev_channel)));\n    save_image(opt, asp::round_image_pixels_skip_nodata(rasterizer.impl(),\n                                                        rounding_error, // local value\n                                                        opt.nodata_value),\n                georef, hole_fill_len, \"VerticalStdDev\");\n  }\n\n}\n\n// Save the orthoimage. The texture comes form L.tif instead of the heights.\nvoid save_ortho(DemOptions & opt,\n                vw::cartography::GeoReference const& georef,\n                asp::OrthoRasterizerView& rasterizer) {\n\n  Stopwatch sw3;\n  sw3.start();\n\n  // Set the texture channel\n  ImageViewRef<PixelGray<float>> texture\n    = asp::form_point_cloud_composite<PixelGray<float>>\n    (opt.texture_files, ASP_MAX_SUBBLOCK_SIZE);\n  rasterizer.set_texture(channel_cast<float>(channels_to_planes(texture)));\n\n  if (opt.ortho_hole_fill_len > 0) {\n\n    // Need to convert the hole fill length from output image pixels\n    // to input point cloud pixels as we will fill holes in the cloud\n    // itself.\n    int hole_fill_len = rasterizer.pc_hole_fill_len(opt.ortho_hole_fill_len);\n\n    // Fetch a reference to the current point image\n    ImageViewRef<Vector3> point_image = rasterizer.get_point_image();\n\n    // Mask the NaNs\n    ImageViewRef<PixelMask<Vector3>> point_image_mask\n      = per_pixel_filter(point_image, asp::NaN2Mask<Vector3>());\n\n    // If to grow the cloud a bit, to help hole-filling later. This should\n    // not be large as it creates artifacts. The main work better\n    // be done by grassfire later.\n    if (opt.ortho_hole_fill_extra_len > 0) {\n      int hole_fill_mode = 2;\n      int hole_fill_num_smooth_iter = 3;\n      int hole_fill_extra_len\n        = rasterizer.pc_hole_fill_len(opt.ortho_hole_fill_extra_len);\n      point_image_mask = vw::fill_holes(point_image_mask, hole_fill_mode,\n                                        hole_fill_num_smooth_iter,\n                                        hole_fill_extra_len);\n\n      // Use big tiles, to reduce the overhead\n      // of expanding each tile by hole size.\n      int big_block_size = nextpow2(2.0*hole_fill_extra_len);\n      big_block_size = std::max(256, big_block_size);\n\n      // Cache each hole-filled point cloud tile as likely we will\n      // need it again in the future when rasterizing a different\n      // portion of the output ortho image.\n      point_image_mask = block_cache(point_image_mask,\n                                      vw::Vector2(big_block_size, big_block_size),\n                                      opt.num_threads);\n    }\n\n    // Fill the holes\n    point_image_mask =vw::fill_holes_grass(point_image_mask, hole_fill_len);\n\n    // back to NaNs\n    point_image = per_pixel_filter(point_image_mask, asp::Mask2NaN<Vector3>());\n\n    // When filling holes, use big tiles, to reduce the overhead\n    // of expanding each tile by hole size.\n    int big_block_size = nextpow2(2.0*hole_fill_len);\n    big_block_size = std::max(256, big_block_size);\n\n    // Cache each hole-filled point cloud tile as likely we will\n    // need it again in the future when rasterizing a different\n    // portion of the output ortho image.\n    point_image = block_cache(point_image,\n                              vw::Vector2(big_block_size, big_block_size),\n                              opt.num_threads);\n\n    // Pass to the rasterizer the point image with the holes filled\n    rasterizer.set_point_image(point_image);\n  }\n\n  asp::save_image(opt, rasterizer.impl(), georef,\n                  0, // no need for a buffer here, as we cache hole-filled tiles\n                  \"DRG\");\n  sw3.stop();\n  vw_out(DebugMessage,\"asp\") << \"DRG render time: \" << sw3.elapsed_seconds() << \"\\n\";\n}\n\n// Rasterize a DEM, and perhaps the error image, orthoimage, stddev, etc.\n// This may be called several times, with different grid sizes.\nvoid rasterize_cloud(asp::OrthoRasterizerView& rasterizer,\n                     DemOptions& opt,\n                     vw::cartography::GeoReference& georef,\n                     std::int64_t * num_invalid_pixels) {\n\n  vw_out() << \"\\tStarting DEM rasterization\\n\";\n  vw_out() << \"\\t--> DEM spacing: \" <<     rasterizer.spacing() << \" pt/px\\n\";\n  vw_out() << \"\\t             or: \" << 1.0/rasterizer.spacing() << \" px/pt\\n\";\n\n  // TODO: Maybe put a warning or check here if the size is too big\n\n  // The affine transform. If the user specified --t_projwin, the transform\n  // already incorporated that.\n  georef.set_transform(rasterizer.geo_transform());\n\n  // Fix have pixel offset required if pixel_interpretation is\n  // PixelAsArea. We could have done that earlier, but it makes\n  // the above easier to not think about it.\n  if (georef.pixel_interpretation() == vw::cartography::GeoReference::PixelAsArea &&\n      !rasterizer.m_gdal_tap) {\n    Matrix3x3 transform = georef.transform();\n    transform(0,2) -= 0.5 * transform(0,0);\n    transform(1,2) -= 0.5 * transform(1,1);\n    georef.set_transform(transform);\n  }\n\n  // Do not round the DEM heights for small bodies\n  if (georef.datum().semi_major_axis() <= asp::MIN_RADIUS_FOR_ROUNDING ||\n      georef.datum().semi_minor_axis() <= asp::MIN_RADIUS_FOR_ROUNDING) {\n    opt.rounding_error = 0.0;\n  }\n\n  Vector2 tile_size(vw_settings().default_tile_size(),\n                    vw_settings().default_tile_size());\n\n  // Write out the DEM. We've set the texture to be the height.\n  // This must happen before we set the texture to something else.\n  if (!opt.no_dem)\n     save_dem(opt, georef, rasterizer, tile_size, num_invalid_pixels);\n\n  // If the point cloud has propagated stddev affects how we write the error image.\n  bool has_stddev = asp::has_stddev(opt.pointcloud_files);\n\n  // Write triangulation error image if requested\n  if (opt.do_error)\n    save_intersection_error(opt, has_stddev, georef, tile_size, rasterizer);\n\n  if (opt.propagate_errors && !has_stddev) {\n    // Do not throw an error. Go on and save at least the intersection\n    // error and orthoimage.\n    vw_out() << \"Cannot grid the horizontal and vertical stddev as the point \"\n             << \"cloud file is not in the expected format.\\n\";\n    opt.propagate_errors = false;\n  }\n\n  if (opt.propagate_errors)\n    save_stddev(opt, georef, rasterizer);\n\n  // Write out a normalized version of the DEM, if requested (for debugging).\n  // Here the DEM is read back and written normalized to a new file.\n  if (opt.do_normalize) {\n    int hole_fill_len = 0;\n    DiskImageView<PixelGray<float>> dem_image(opt.out_prefix + \"-DEM.\" + opt.output_file_type);\n    asp::save_image(opt, apply_mask(channel_cast<uint8>\n                                    (normalize(create_mask(dem_image, opt.nodata_value),\n                                               rasterizer.bounding_box().min().z(),\n                                               rasterizer.bounding_box().max().z(),\n                                               0, 255))),\n                    georef, hole_fill_len, \"DEM-normalized\");\n  }\n\n  // Write DRG if the user requested and provided a texture file.\n  // This must be at the end, as we may be messing with the point\n  // image in irreversible ways.\n  if (opt.do_ortho)\n   save_ortho(opt, georef, rasterizer);\n\n} // End rasterize_cloud\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Core/PointUtils.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2024, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file PointUtils.cc\n///\n\n#include <asp/Core/PointUtils.h>\n#include <asp/Core/PointCloudRead.h>\n#include <vw/Core/Stopwatch.h>\n#include <vw/FileIO/DiskImageUtils.h>\n#include <vw/Mosaic/ImageComposite.h>\n#include <vw/Geometry/geomUtils.h>\n\n#include <cmath>\n\nusing namespace vw;\nusing namespace vw::cartography;\n\n//------------------------------------------------------------------------------------------\n// Class CsvConv functions\n\nstd::string asp::CsvConv::write_header_string(std::string const delimiter) const{\n  std::stringstream s;\n  std::map<int, std::string>::const_iterator it;\n  for (it = this->col2name.begin(); it != this->col2name.end(); it++)\n    s << it->second << delimiter;\n  return s.str();\n}\n\n// This is a complete list of all supported column names, it must be kept up to date.\nint asp::CsvConv::get_sorted_index_for_name(std::string const& name) {\n  if (name == \"file\")               return 3; // The string goes in a different location\n  if (name == \"lon\")                return 0;\n  if (name == \"lat\")                return 1;\n  if (name == \"radius_m\")           return 2;\n  if (name == \"radius_km\")          return 2;\n  if (name == \"x\")                  return 0;\n  if (name == \"y\")                  return 1;\n  if (name == \"z\")                  return 2;\n  if (name == \"pixel_x\")            return 0;\n  if (name == \"pixel_y\")            return 1;\n  if (name == \"pixel_val\")          return 2;\n  if (name == \"easting\")            return 0;\n  if (name == \"northing\")           return 1;\n  if (name == \"height_above_datum\") return 2;\n\n  vw_throw(ArgumentErr() << \"Unsupported column name: \" << name);\n}\n\n// Parse the CSV format string and build the data structure which\n// will enable to convert from CSV to Cartesian and vice-versa.\n// The user specifies 3 fields that determine the coordinate.\n// If min_num_fields 2, autocomplete the third value to 0.\nvoid asp::CsvConv::parse_csv_format(std::string const& csv_format_str,\n                                    std::string const& csv_srs,\n                                    int min_num_fields) {\n\n  // This guards against the case where the user specifies a proj string\n  // only having the string D_MARS, with no spheroid or axes.\n  std::string csv_srs_lc = boost::to_lower_copy(csv_srs); // lowercase\n  if ((csv_srs_lc.find(\"d_moon\") != std::string::npos ||\n       csv_srs_lc.find(\"d_mars\") != std::string::npos) &&\n      csv_srs_lc.find(\"spheroid\") == std::string::npos) {\n    vw_throw(ArgumentErr() << \"D_MOON and D_MARS are not official projection strings. \"\n                           << \"The PROJ string is: \" << csv_srs << \".\\n\");\n  }\n\n  *this = asp::CsvConv(); // Reset this object to the default state\n\n  this->csv_format_str = csv_format_str; // Record inputs\n  this->csv_srs  = csv_srs;\n\n  std::string local = csv_format_str; // Make lowercase\n  boost::algorithm::to_lower(local);\n\n  if (local == \"\") // No format string passed in\n    return;\n\n  boost::replace_all(local, \":\", \" \"); // Convert to space-delimited\n  boost::replace_all(local, \",\", \" \");\n  std::istringstream is(local);\n\n  // The case of utm: \"utm:23N 1:x 2:y 3:height_above_datum\". Parse\n  // the initial bit to get utm_zone and utm_north, leave the rest\n  // alone.\n  std::string str;\n  is >> str;\n  if (str == \"utm\") {\n    is >> str;\n    asp::parse_utm_str(str, this->utm_zone, this->utm_north);\n  } else {\n    // Go back to the original string\n    is.clear();\n    is.str(local);\n  }\n\n  int col;\n  std::string name;\n  while (is.good()) {\n    // Grab the next two elements\n    if (! (is >> col >> name))\n      vw_throw(ArgumentErr() << \"Could not parse: '\" << csv_format_str << \"'\\n\");\n\n    // Convert to zero-based indexing and error check\n    col--;\n    if (col < 0 || this->col2name.count(col))\n      vw_throw(ArgumentErr() << \"Illegal column index in: '\" << csv_format_str << \"'\\n\");\n\n    // Store in the lookup maps\n    this->name2col[name] = col;\n    this->col2name[col]  = name;\n  }\n  this->num_fields = this->name2col.size();\n  const int MAX_NUM_FIELDS = 4; // Location and a file\n  if ((this->num_fields < min_num_fields) || (this->num_fields > MAX_NUM_FIELDS))\n    vw_throw(ArgumentErr() << \"Invalid number of column indices in: '\" << csv_format_str << \"'\\n\");\n  if (min_num_fields < 2)\n    vw::vw_throw(vw::ArgumentErr() << \"Expecting at least two fields in the csv format.\\n\");\n\n  // Sort the names into a pre-specified order.\n  std::vector<std::string> sorted_names(this->num_fields);\n  for (auto it = this->name2col.begin(); it != this->name2col.end(); it++) {\n    int index = get_sorted_index_for_name(it->first);\n    sorted_names[index] = it->first;\n    if (it->first != \"file\") // Only the point data goes into a vector, not the filename\n      this->col2sort[it->second] = index;\n  }\n\n  // If only two fields are set, auto-complete the third. Values for that field\n  // will be set to 0. This makes it convenient to use many of the functions\n  // expecting 3 fields.\n  if (this->num_fields == 2 && sorted_names.size() == 2) {\n    if (sorted_names[0] == \"x\" && sorted_names[1] == \"y\")\n      sorted_names.push_back(\"z\");\n    else if (sorted_names[0] == \"lon\" && sorted_names[1] == \"lat\")\n      sorted_names.push_back(\"height_above_datum\");\n    else if (sorted_names[0] == \"easting\"  && sorted_names[1] == \"northing\")\n      sorted_names.push_back(\"height_above_datum\");\n    else if (sorted_names[0] == \"pixel_x\" && sorted_names[1] == \"pixel_y\")\n      sorted_names.push_back(\"pixel_val\");\n    else\n      sorted_names.push_back(\"not_found\"); // will trigger a failure below\n  }\n\n  // From the input strings, determine which set type applies to this file.\n  if (sorted_names[0] == \"x\" &&\n      sorted_names[1] == \"y\" &&\n      sorted_names[2] == \"z\") {\n    this->format = XYZ;\n  } else if (sorted_names[0] == \"lon\" &&\n            sorted_names[1] == \"lat\" &&\n            sorted_names[2] == \"radius_m\") {\n    this->format = LAT_LON_RADIUS_M;\n  } else if (sorted_names[0] == \"lon\" &&\n            sorted_names[1] == \"lat\" &&\n            sorted_names[2] == \"radius_km\") {\n    this->format = LAT_LON_RADIUS_KM;\n  } else if (sorted_names[0] == \"lon\" &&\n            sorted_names[1] == \"lat\" &&\n            sorted_names[2] == \"height_above_datum\") {\n    this->format = HEIGHT_LAT_LON;\n  } else if (sorted_names[0] == \"easting\"  &&\n            sorted_names[1] == \"northing\" &&\n            sorted_names[2] == \"height_above_datum\") {\n    this->format = EASTING_HEIGHT_NORTHING;\n  } else if (sorted_names[0] == \"pixel_x\" &&\n             sorted_names[1] == \"pixel_y\" &&\n             sorted_names[2] == \"pixel_val\") {\n    this->format = PIXEL_XYVAL;\n  } else {\n    vw_throw(ArgumentErr() << \"Cannot understand the csv format string: \"\n                            << csv_format_str << \".\\n\");\n  }\n}\n\n// If the user passed in a csv file containing easting, northing, height\n// above datum, and either a utm zone or a custom PROJ string,\n// pass that info into the georeference for the purpose of converting\n// later from easting and northing to lon and lat.\n// TODO(oalexan1): This is fragile. It can quietly default to WGS84.\nbool asp::CsvConv::parse_georef(vw::cartography::GeoReference & georef) const {\n\n  bool success = false;\n  if (this->utm_zone >= 0) { // UTM case, for Earth only\n    try{\n      georef.set_UTM(this->utm_zone, this->utm_north);\n      success = true;\n    } catch (const std::exception& e) {\n      vw_throw(ArgumentErr() << \"Detected error: \" << e.what()\n                             << \"\\nPlease check if you are using an Earth datum.\\n\");\n    }\n  } else if (this->csv_srs != \"\") { // Not UTM, with PROJ string\n    bool have_user_datum = false;\n    Datum user_datum;\n    vw::cartography::set_srs_string(this->csv_srs, have_user_datum, user_datum, georef);\n    success = true;\n  }\n\n  if (this->format == EASTING_HEIGHT_NORTHING && !georef.is_projected())\n      vw::vw_throw(vw::ArgumentErr() << \"When a CSV file has Easting and Northing, \"\n                   \"must set --csv-srs, and it must use projected coordinates, \"\n                   \"not longitude-latitude.\\n\");\n\n  return success;\n}\n\nasp::CsvConv::CsvRecord asp::CsvConv::parse_csv_line(bool & is_first_line, bool & success,\n                                                     std::string const& line) const {\n  // Parse a CSV file line in given format\n  success = true;\n\n  // Copy the input line into a temporary buffer\n  const int bufSize = 2048;\n  char temp[bufSize];\n  strncpy(temp, line.c_str(), bufSize);\n\n  std::string sep = asp::csv_separator();\n\n  int col_index = -1; // The current column we are reading\n  int num_floats_read = 0;\n  int num_values_read = 0;\n\n  CsvRecord values;\n\n  // Quietly ignore empty lines, lines with spaces only, and lines starting with comments\n  if (line.empty() || line[0] == '#' || hasSpacesOnly(line)) {\n    success = false;\n    is_first_line = false;\n    return values;\n  }\n\n  char * ptr = temp;\n  while (1) {\n\n    col_index++; // Increment the column counter\n    const char* token = strtok(ptr, sep.c_str());  // Split line on separator char\n    ptr = NULL; // After the first call, strtok expects a null pointer as input.\n    if (token == NULL) break; // no more tokens\n    if (num_values_read >= this->num_fields) break; // read enough values\n\n    // Check if this is one of the columns we need to read\n    if (this->col2name.find(col_index) == this->col2name.end())\n      continue;\n\n    if (this->col2name.at(col_index) == \"file\") // This is a string input\n      values.file = token;\n    else {\n      // Parse the floating point value from the token\n      double val;\n      int flag = sscanf(token, \"%lg\", &val);\n      if (flag == 0) { // Handle parsing failure\n        success = false;\n        break;\n      }\n      values.point_data[num_floats_read] = val;\n      num_floats_read++;\n    }\n    num_values_read++;\n\n  } // End loop through columns\n\n  // Check if enough values were read and for NaN values\n  if (num_values_read != this->num_fields || values.point_data != values.point_data)\n    success = false;\n\n  if (!success) {\n    if (!is_first_line) {\n      // Not the header\n      vw_out () << \"Failed to read line: \" << line << \"\\n\";\n    }\n  }\n\n  is_first_line = false;\n  return values;\n}\n\n// Search for \"color = red\" and find \"red\". Return false on failure.\n// Can handle uppercase strings, also \"color=red\" and \"color red\".\nbool parse_color(std::string const& line, std::string & color) {\n\n  color = \"\"; // reset the output\n  if (line.empty() || line[0] == '#')\n    return false;\n\n  std::string line_lc = boost::to_lower_copy(line); // make lowercase\n\n  size_t pos = line_lc.find(\"color\");\n  if (pos == std::string::npos)\n    return false;\n\n  pos += 5; // go past the color\n\n  // Skip past spaces and equal sign\n  while (pos < line_lc.size() && (line_lc[pos] < 'a' || line_lc[pos] > 'z'))\n    pos++;\n\n  if (pos >= line_lc.size())\n    return false; // no color was set\n\n  line_lc = line_lc.substr(pos);\n\n  // Return the first token. This is useful if there are spaces and other things\n  // afterward.\n  std::istringstream iss(line_lc);\n  std::string token;\n  if (iss >> token) {\n    color = token;\n    return true;\n  }\n\n  return false;\n}\n\nsize_t asp::CsvConv::read_csv_file(std::string const & file_path,\n\t\t\t\t   std::list<CsvRecord> & output_list) const {\n\n  // Clear output object\n  output_list.clear();\n\n  // Open input file\n  std::ifstream file(file_path.c_str());\n  if (!file)\n    vw_throw(vw::IOErr() << \"Unable to open file \\\"\" << file_path << \"\\\"\");\n\n  // Read through all the lines of the input file, parse each line, and build the output list.\n  bool success;\n  bool first_line = true; // TODO(oalexan1): Wipe this variable.\n  std::string line = \"\";\n\n  while (std::getline(file, line, '\\n')) {\n\n    CsvRecord new_record = asp::CsvConv::parse_csv_line(first_line, success, line);\n    if (success)\n      output_list.push_back(new_record);\n\n    first_line = false;\n  }\n\n  file.close();\n\n  return output_list.size();\n}\n\n// Reads an entire CSV file having polygons. Individual\n// polygons are separated by a newline or some other unexpected text.\nsize_t asp::CsvConv::read_poly_file(std::string    const & file_path,\n                                    std::list<CsvRecord> & output_list,\n                                    std::vector<int>         & contiguous_blocks,\n                                    std::vector<std::string> & colors,\n                                    std::vector<vw::geometry::anno> & annotations) const {\n\n  // Clear output object\n  output_list.clear();\n  annotations.clear();\n  \n  std::string color = \"green\"; // some default\n  if (colors.size() > 0) {\n    color = colors[0]; // use as default color what is passed from outside\n    colors.clear(); // so we can keep on pushing for each polygon\n  }\n\n  contiguous_blocks.clear();\n  contiguous_blocks.push_back(0);\n\n  // Open the input file\n  std::ifstream file(file_path.c_str());\n  if (!file)\n    vw_throw(vw::IOErr() << \"Unable to open file \\\"\" << file_path << \"\\\"\");\n\n  // Read through all the lines of the input file, parse each line, and build\n  // the output list. We ignore failed lines and lines having colors, and use\n  // them as separators between polygons.\n  bool success = false;\n  bool first_line = true; // TODO(oalexan1): Rename this to: quiet_on_failure.\n  std::string line = \"\";\n  vw::geometry::anno annotation;\n\n  while (std::getline(file, line, '\\n')) {\n    \n    // Parse colors\n    std::string local_color;\n    if (parse_color(line, local_color)) {\n      color = local_color;\n      while (colors.size() < contiguous_blocks.size())\n        colors.push_back(color); // catch up on colors\n    }\n\n    // Search for annotations\n    bool found_anno = false;\n    if (line.find(\"anno \") == 0 && vw::geometry::searchForAnnotation(line, annotation)) {\n      annotations.push_back(annotation);\n      found_anno = true;\n      success = false;\n    }\n    \n    CsvRecord new_record;\n    if (!found_anno) \n      new_record = asp::CsvConv::parse_csv_line(first_line, success, line);\n    first_line = true; // Because for now the api changes this var. To fix at some point.\n\n    if (success && !found_anno) {\n      output_list.push_back(new_record);\n      // This is a bugfix. If we are just starting a block, and there were some\n      // invalid lines before, and some were colors, let the color of this\n      // block be the last collected color\n      if (contiguous_blocks.size() > 0 &&\n        contiguous_blocks.back() == 0 && colors.size() == contiguous_blocks.size()) {\n        colors.back() = color;\n      }\n      // add an element to the last block\n      contiguous_blocks.back()++;\n    } else if (!found_anno) {\n      // An annotation does not force a new block\n      if (contiguous_blocks.back() > 0) {\n        contiguous_blocks.push_back(0); // Add a new block\n        while (colors.size() < contiguous_blocks.size())\n          colors.push_back(color); // catch up on colors\n      }\n    }\n  }\n\n  // This is needed in case no colors were found\n  while (colors.size() < contiguous_blocks.size())\n    colors.push_back(color);\n\n  // Wipe all blocks of length 0. Likely there is only one at the end.\n  std::vector<int> & v = contiguous_blocks; // alias\n  v.erase(std::remove(v.begin(), v.end(), 0), v.end());\n  if (colors.size() > contiguous_blocks.size())\n    colors.resize(contiguous_blocks.size());\n\n  file.close();\n\n  return output_list.size();\n}\n\nvw::Vector3 asp::CsvConv::sort_parsed_vector3(CsvRecord const& csv) const {\n  Vector3 ordered_csv;\n  int count = 0;\n  const int NUM_POINT_PARAMS = 3;\n  for (auto it = this->col2sort.begin(); it != this->col2sort.end(); it++) {\n    if (it->second < NUM_POINT_PARAMS) // Don't include elements past the first three\n      ordered_csv[it->second] = csv.point_data[count];\n    count++;\n  }\n  return ordered_csv;\n}\n\nvw::Vector3 asp::CsvConv::unsort_vector3(vw::Vector3 const& csv) const {\n  Vector3 csv2;\n  int count = 0;\n  const int NUM_POINT_PARAMS = 3;\n  for (std::map<int, int>::const_iterator it = this->col2sort.begin(); it != this->col2sort.end(); it++) {\n    if (it->second < NUM_POINT_PARAMS) { // Don't include elements past the first three\n      csv2[count] = csv[it->second];\n      count++;\n    }\n  }\n  return csv2;\n}\n\n// There is a lot of repeated code for the next three functions in order to\n// improve the speed of parsing points by doing the minimum number of conversions.\n\n// Return either xyz or a projected point. Note that the flag return_point_height\n// is not necessarily respected.\nVector3 asp::CsvConv::csv_to_cartesian_or_point_height(CsvRecord const& csv,\n                                                       GeoReference const& geo,\n                                                       bool return_point_height) const{\n\n  Vector3 ordered_csv = sort_parsed_vector3(csv);\n\n  // If the format is XYZ, there is a good chance we don't even have a reference.\n  // So we cannot return a point_height. We need things this way for the chipper,\n  // but this is quite confusing.\n  if (this->format == XYZ)\n    return ordered_csv; // already as xyz\n\n  // Convert from CSV to Cartesian. Later we may convert to point_height format,\n  // which, due to the projection in the georeference, may not be the same\n  // as the input CSV format. E.g., input CSV may be lon, lat, height,\n  // but the output of this function may be easting, northing, height.\n\n  Vector3 xyz;\n  if (this->format == EASTING_HEIGHT_NORTHING) {\n\n  Vector3 point_height = Vector3(ordered_csv[0], ordered_csv[1], ordered_csv[2]);\n  Vector2 ll  = geo.point_to_lonlat(Vector2(point_height[0], point_height[1]));\n  Vector3 llh = Vector3(ll[0], ll[1], point_height[2]); // now lon, lat, height\n  xyz = geo.datum().geodetic_to_cartesian(llh);\n\n  } else if (this->format == HEIGHT_LAT_LON) {\n\n    xyz = geo.datum().geodetic_to_cartesian(ordered_csv);\n\n  } else { // Handle asp::LAT_LON_RADIUS_M and asp::LAT_LON_RADIUS_KM\n\n    if (this->format == LAT_LON_RADIUS_KM)\n      ordered_csv[2] *= 1000.0; // now lon, lat, radius_m\n\n    Vector3 tmp = ordered_csv; tmp[2] = 0; // now lon, lat, 0\n    xyz = geo.datum().geodetic_to_cartesian(tmp);\n\n    // Update the radius\n    xyz = ordered_csv[2]*(xyz/norm_2(xyz));\n\n  }\n\n  if (return_point_height)\n    return geo.geodetic_to_point(geo.datum().cartesian_to_geodetic(xyz));\n\n  return xyz;\n}\n\nvw::Vector3 asp::CsvConv::csv_to_cartesian(CsvRecord const& csv,\n                                           vw::cartography::GeoReference const& geo) const {\n  Vector3 ordered_csv = sort_parsed_vector3(csv);\n\n  Vector3 xyz;\n  if (this->format == XYZ) {\n    return ordered_csv; // already as xyz\n\n  } else if (this->format == EASTING_HEIGHT_NORTHING) {\n    Vector3 point_height = Vector3(ordered_csv[0], ordered_csv[1], ordered_csv[2]);\n    Vector2 ll           = geo.point_to_lonlat(Vector2(point_height[0], point_height[1]));\n    Vector3 llh          = Vector3(ll[0], ll[1], point_height[2]); // now lon, lat, height\n    xyz = geo.datum().geodetic_to_cartesian(llh);\n\n  } else if (this->format == HEIGHT_LAT_LON) {\n    xyz = geo.datum().geodetic_to_cartesian(ordered_csv);\n\n  } else { // Handle asp::LAT_LON_RADIUS_M and asp::LAT_LON_RADIUS_KM\n    if (this->format == LAT_LON_RADIUS_KM)\n      ordered_csv[2] *= 1000.0; // now lon, lat, radius_m\n\n    Vector3 tmp = ordered_csv; tmp[2] = 0; // now lon, lat, 0\n    xyz = geo.datum().geodetic_to_cartesian(tmp);\n\n    // Update the radius\n    xyz = ordered_csv[2]*(xyz/norm_2(xyz));\n  }\n  return xyz;\n}\n\n// Returns Vector3(lon, lat, height_above_datum)\nvw::Vector3 asp::CsvConv::csv_to_geodetic(CsvRecord const& csv,\n                                          vw::cartography::GeoReference const& geo) const {\n  Vector3 ordered_csv = sort_parsed_vector3(csv);\n  Vector3 llh;\n\n  if (this->format == XYZ) {\n    llh = geo.datum().cartesian_to_geodetic(ordered_csv);\n\n  } else if (this->format == EASTING_HEIGHT_NORTHING) {\n    Vector3 point_height = Vector3(ordered_csv[0], ordered_csv[1], ordered_csv[2]);\n    Vector2 ll           = geo.point_to_lonlat(Vector2(point_height[0], point_height[1]));\n    llh = Vector3(ll[0], ll[1], point_height[2]); // now lon, lat, height\n\n  } else if (this->format == HEIGHT_LAT_LON) {\n    return ordered_csv;\n\n  } else { // Handle asp::LAT_LON_RADIUS_M and asp::LAT_LON_RADIUS_KM\n    if (this->format == LAT_LON_RADIUS_KM)\n      ordered_csv[2] *= 1000.0; // now lon, lat, radius_m\n\n    Vector3 tmp = ordered_csv; tmp[2] = 0; // now lon, lat, 0\n    Vector3 xyz = geo.datum().geodetic_to_cartesian(tmp);\n\n    // Update the radius\n    xyz = ordered_csv[2]*(xyz/norm_2(xyz));\n    llh = geo.datum().cartesian_to_geodetic(xyz);\n  }\n  return llh;\n}\n\nvw::Vector2 asp::CsvConv::csv_to_lonlat(CsvRecord const& csv,\n                                        vw::cartography::GeoReference const& geo) const {\n  Vector3 ordered_csv = sort_parsed_vector3(csv);\n\n  if (this->format == XYZ) {\n    Vector3 llh = geo.datum().cartesian_to_geodetic(ordered_csv);\n    return Vector2(llh[0], llh[1]);\n  } else if (this->format == EASTING_HEIGHT_NORTHING) {\n    return geo.point_to_lonlat(Vector2(ordered_csv[0], ordered_csv[1]));\n  } else if (this->format == HEIGHT_LAT_LON) {\n    return Vector2(ordered_csv[0], ordered_csv[1]);\n  } else { // Handle asp::LAT_LON_RADIUS_M and asp::LAT_LON_RADIUS_KM\n    return Vector2(ordered_csv[0], ordered_csv[1]);\n  }\n\n}\n\nVector3 asp::CsvConv::cartesian_to_csv(Vector3 const& xyz,\n                                       GeoReference const& geo,\n                                       double mean_longitude) const {\n  Vector3 csv;\n  if (this->format == XYZ) {\n    csv = xyz; // order is x, y, z\n\n  } else { // format != XYZ, convert to the csv format.\n\n    // Must assert here that the datum was specified.\n\n    Vector3 llh = geo.datum().cartesian_to_geodetic(xyz);   // lon-lat-height\n    llh[0] += 360.0*round((mean_longitude - llh[0])/360.0); // 360 deg adjust\n\n    if (this->format == EASTING_HEIGHT_NORTHING) {\n\n      // go from lon, lat to easting, northing\n      Vector2 en = geo.lonlat_to_point(Vector2(llh[0], llh[1]));\n      csv = Vector3(en[0], en[1], llh[2]); // order is easting, northing, height\n\n    } else if (this->format == HEIGHT_LAT_LON) {\n      csv = llh;\n\n    } else {\n      // Handle asp::LAT_LON_RADIUS_M and asp::LAT_LON_RADIUS_KM\n\n      llh[2] = norm_2(xyz); // order is lon, lat, radius_m\n\n      if (this->format == LAT_LON_RADIUS_KM) {\n        llh[2] /= 1000.0; // order is lon, lat, radius_km\n      }\n      csv = llh;\n    }\n  }\n  // Now the csv vector contains the sorted values for our format\n\n  // Now we have the csv fields, but they are in the order\n  // corresponding to the sorted column names. Need to put them\n  // in the same order as they were in the file originally.\n  return unsort_vector3(csv);\n}\n\n// End class CsvConv functions\n\nbool asp::is_tif (std::string const& file) {\n  std::string lfile = boost::to_lower_copy(file);\n  return (boost::iends_with(lfile, \".tif\")  || boost::iends_with(lfile, \".ntf\"));\n}\n\nbool asp::is_las(std::string const& file) {\n  std::string lfile = boost::to_lower_copy(file);\n  return (boost::iends_with(lfile, \".las\")  || boost::iends_with(lfile, \".laz\"));\n}\n\nbool asp::is_csv(std::string const& file) {\n  std::string lfile = boost::to_lower_copy(file);\n  return (boost::iends_with(lfile, \".csv\")  || boost::iends_with(lfile, \".txt\"));\n}\n\nbool asp::is_pcd(std::string const& file) {\n  std::string lfile = boost::to_lower_copy(file);\n  return boost::iends_with(lfile, \".pcd\");\n}\n\nbool asp::is_las_or_csv_or_pcd(std::string const& file) {\n  return asp::is_las(file) || is_csv(file);\n}\n\nbool asp::read_user_datum(double semi_major, double semi_minor,\n                          std::string const& reference_spheroid,\n                          cartography::Datum& datum) {\n  // Select a cartographic datum. There are several hard coded datums\n  // that can be used here, or the user can specify their own.\n  if (reference_spheroid != \"\") {\n    datum.set_well_known_datum(reference_spheroid);\n  } else if (semi_major == 6378137 &&\n             std::abs(semi_minor - 6356752.3142451793) < 1e-6) {\n    datum.set_well_known_datum(\"WGS84\");\n  } else if (semi_major > 0 && semi_minor > 0) {\n    datum = cartography::Datum(\"User Specified Datum\",\n                               \"User Specified Spheroid\",\n                               \"Reference Meridian\",\n                               semi_major, semi_minor, 0.0);\n  } else {\n    return false;\n  }\n  vw_out() << \"\\t--> Re-referencing altitude values using datum: \"\n           << datum.name() << \".\\n\";\n  vw_out() << \"\\t    Axes [\" << datum.semi_major_axis() << \" \"\n           << datum.semi_minor_axis() << \"] meters.\\n\";\n  return true;\n}\n\nvoid asp::parse_utm_str(std::string const& utm, int & zone, bool & north) {\n\n  // Parse the string 58N\n\n  // Initialize\n  zone = -1; north = false;\n\n  std::string a, b;\n  for (int s = 0; s < (int)utm.size(); s++) {\n    if (utm[s] >= '0' && utm[s] <= '9') {\n      a += utm[s];\n    } else {\n      b = utm[s];\n      break;\n    }\n  }\n\n  if (a == \"\" || b == \"\")\n    vw_throw(ArgumentErr() << \"Could not parse UTM string: '\" << utm << \"'\\n\");\n\n  zone = atoi(a.c_str());\n  if (b == \"n\" || b == \"N\") {\n    north = true;\n  } else if (b == \"s\" || b == \"S\") {\n    north = false;\n  } else\n    vw_throw(ArgumentErr() << \"Could not parse UTM string: '\" << utm << \"'\\n\");\n}\n\nbool asp::hasSpacesOnly(std::string const& str) {\n  bool only_spaces = true;\n  for (size_t it = 0; it < str.size(); it++) {\n    if (str[it] != ' ' && str[it] != '\\n' && str[it] != '\\t') {\n      only_spaces = false;\n      break;\n    }\n  }\n  return only_spaces;\n}\n\nbool asp::is_valid_csv_line(std::string const& line) {\n  // A valid line is not empty and does not start with '#' and does not have spaces only.\n\n  bool only_spaces = hasSpacesOnly(line);\n\n  return (!only_spaces) && (!line.empty()) && (line[0] != '#');\n}\n\nstd::int64_t asp::csv_file_size(std::string const& file) {\n\n  std::ifstream fh(file.c_str());\n  if (!fh)\n    vw_throw(vw::IOErr() << \"Unable to open file \\\"\" << file << \"\\\"\");\n\n  std::int64_t num_total_points = 0;\n  std::string line;\n  while (getline(fh, line, '\\n')) {\n    if (!asp::is_valid_csv_line(line)) continue;\n    num_total_points++;\n  }\n\n  return num_total_points;\n}\n\n// Peek at the first valid line in a file to find how many columns it has\nint asp::fileNumCols(std::string const& file) {\n\n  const int bufSize = 2048;\n  char buffer[bufSize];\n\n  std::string sep = asp::csv_separator();\n\n  int num = 0;\n  std::ifstream fh(file.c_str());\n\n  std::string line;\n  while (getline(fh, line, '\\n')) {\n    if (!asp::is_valid_csv_line(line)) continue;\n\n    // Copy the input line into a buffer that can be modified\n    strncpy(buffer, line.c_str(), bufSize);\n    char * ptr = buffer;\n\n    // Inspect the tokens\n    while (1) {\n\n      const char* token = strtok(ptr, sep.c_str());  // Split line on seperator char\n      ptr = NULL; // After the first call, strtok expects a null pointer as input.\n\n      if (token == NULL)\n        break; // no more tokens\n\n      // Parse the floating point value from the token\n      double val;\n      int flag = sscanf(token, \"%lg\", &val);\n      if (flag == 0) // Handle parsing failure\n        break;\n\n      num++;\n    }\n\n    break; // done finding a good line\n  }\n\n  return num;\n}\n\n// Erases a file suffix if one exists and returns the base string\nstd::string asp::prefix_from_pointcloud_filename(std::string const& filename) {\n  std::string result = filename;\n\n  // First case: filenames that match <prefix>-PC.<suffix>\n  int index = result.rfind(\"-PC.\");\n  if (index != -1) {\n    result.erase(index, result.size());\n    return result;\n  }\n\n  // Second case: filenames that match <prefix>.<suffix>\n  index = result.rfind(\".\");\n  if (index != -1) {\n    result.erase(index, result.size());\n    return result;\n  }\n\n  // No match\n  return result;\n}\n\n// Compute bounding box of the given cloud. If is_geodetic is false,\n// that means a cloud of raw xyz cartesian values, then Vector3()\n// signifies no-data. If is_geodetic is true, no-data is suggested\n// by having the z component of the point be NaN.\nvw::BBox3 asp::pointcloud_bbox(vw::ImageViewRef<vw::Vector3> const& point_image,\n                               bool is_geodetic) {\n\n  vw::BBox3 result;\n  vw::vw_out() << \"Computing the point cloud bounding box.\\n\";\n  vw::TerminalProgressCallback progress_bar(\"asp\", \"\\t--> \");\n\n  for (int row=0; row < point_image.rows(); ++row) {\n    progress_bar.report_fractional_progress(row, point_image.rows());\n    for (int col=0; col < point_image.cols(); ++col) {\n      vw::Vector3 pt = point_image(col, row);\n      if ((!is_geodetic && pt != vw::Vector3()) ||\n           (is_geodetic  &&  !std::isnan(pt.z())))\n        result.grow(pt);\n    }\n  }\n  progress_bar.report_finished();\n\n  return result;\n}\n\n// Determine if we should be using a longitude range between\n// [-180, 180] or [0,360]. The former is used, unless the latter\n// results in a tighter range of longitudes, such as when crossing\n// the international date line.\nvw::BBox2 asp::estim_lonlat_box(vw::ImageViewRef<vw::Vector3> const& point_image,\n                                vw::cartography::Datum const& datum) {\n\n  Stopwatch sw;\n  sw.start();\n\n  // Do two attempts. Need this heuristic, because for small clouds, especially\n  // created from CSV files, this can fail.\n  vw::BBox2 ll_box, shifted_ll_box;\n  for (int attempt = 0; attempt < 2; attempt++) {\n\n    int32 subsample_amt = int32(norm_2(Vector2(point_image.cols(), point_image.rows()))/32.0);\n    if (attempt == 1) {\n      // For CSV, which can be small\n      if (point_image.cols() <= ASP_POINT_CLOUD_TILE_LEN &&\n          point_image.rows() <= ASP_POINT_CLOUD_TILE_LEN) {\n        subsample_amt = 1;\n      } else if (point_image.cols() <= 10 * ASP_POINT_CLOUD_TILE_LEN &&\n                 point_image.rows() <= 10 * ASP_POINT_CLOUD_TILE_LEN) {\n         // Still a rather small cloud\n        subsample_amt = int32(norm_2(Vector2(point_image.cols(), point_image.rows()))/8.0);\n      } else {\n        // Very big clouds\n        subsample_amt = int32(norm_2(Vector2(point_image.cols(), point_image.rows()))/16.0);\n      }\n    }\n\n    if (subsample_amt < 1)\n      subsample_amt = 1;\n\n    ImageViewRef<Vector3> sub_image = subsample(point_image, subsample_amt);\n\n    for (int32 col = 0; col < sub_image.cols(); col++) {\n      for (int32 row = 0; row < sub_image.rows(); row++) {\n        auto pix = sub_image(col, row);\n        if (pix == Vector3())\n          continue;\n\n        // Longitude range is [-180, 180]\n        vw::Vector3 llh = datum.cartesian_to_geodetic(pix);\n        ll_box.grow(Vector2(llh[0], llh[1]));\n\n        // Create the shifted box\n        llh[0] += 360;\n        if (llh[0] >= 360)\n          llh[0] -= 360;\n        shifted_ll_box.grow(Vector2(llh[0], llh[1]));\n      }\n    }\n\n    // Stop at the first attempt if we have a non-empty box\n    if (!ll_box.empty())\n      break;\n  }\n\n  if (ll_box.empty()) {\n    // Empty box. The use the [-180, 180] range.\n    ll_box = vw::BBox2(-0.1, -0.1, 0.2, 0.2);\n    return ll_box;\n  }\n\n  // See which has narrower range. Account for numerical error.\n  if (ll_box.width() > shifted_ll_box.width() + 1e-10)\n    ll_box = shifted_ll_box;\n\n  sw.stop();\n  vw_out(DebugMessage,\"asp\") << \"Statistics time: \" << sw.elapsed_seconds() << std::endl;\n\n  return ll_box;\n}\n\n// Find the median longitude and latitude for a subset of the point cloud\nvoid asp::median_lon_lat(vw::ImageViewRef<vw::Vector3> const& point_image,\n                         vw::cartography::GeoReference const& georef,\n                         double & lon, double & lat) {\n\n  vw_out() << \"Estimating the median longitude and latitude for the cloud.\\n\";\n\n  // Initialize the outputs\n  lon = 0.0; lat = 0.0;\n\n  // Try to subsample with these amounts\n  std::vector<double> sub = {32.0, 16.0};\n\n  Stopwatch sw;\n  sw.start();\n\n  // Iterate over sub\n  bool success = false;\n  for (size_t s = 0; s < sub.size(); s++) {\n\n    int32 subsample_amt = int32(norm_2(Vector2(point_image.cols(),\n                                               point_image.rows()))/sub[s]);\n    if (subsample_amt < 1)\n      subsample_amt = 1;\n\n    ImageViewRef<Vector3> sub_image = subsample(point_image, subsample_amt);\n\n    // Accumulate valid values\n    std::vector<double> lons, lats;\n    for (int32 col = 0; col < sub_image.cols(); col++) {\n      for (int32 row = 0; row < sub_image.rows(); row++) {\n        Vector3 ecef = sub_image(col, row);\n        if (ecef == Vector3())\n          continue;\n        Vector3 llh = georef.datum().cartesian_to_geodetic(ecef);\n        lons.push_back(llh[0]);\n        lats.push_back(llh[1]);\n      }\n    }\n    if (lons.empty() || lats.empty())\n      continue;\n\n    lon = vw::math::destructive_median(lons);\n    lat = vw::math::destructive_median(lats);\n    success = true;\n    break;\n  }\n\n  if (!success)\n    vw_throw(ArgumentErr() << \"Could not find a valid median longitude and latitude. \"\n             << \"Check if your cloud is empty.\\n\");\n\n  sw.stop();\n  vw_out(DebugMessage,\"asp\") << \"Median longitude and latitude elapsed time: \"\n                             << sw.elapsed_seconds() << std::endl;\n}\n\n/// Analyze a file name to determine the file type\nstd::string asp::get_cloud_type(std::string const& file_name) {\n\n  if (asp::is_csv(file_name))\n    return \"CSV\";\n  if (asp::is_las(file_name))\n    return \"LAS\";\n\n  // Note that any tif, ntf, and cub file with one channel with georeference be\n  // interpreted as a DEM.\n  int nc = vw::get_num_channels(file_name);\n\n  vw::cartography::GeoReference geo;\n  bool has_georef = vw::cartography::read_georeference(geo, file_name);\n\n  if (nc == 1 && has_georef)\n    return \"DEM\";\n  if (nc >= 3)\n    return \"PC\";\n  vw_throw(vw::ArgumentErr() << \"File: \" << file_name\n                         << \" is neither a point cloud nor a DEM.\\n\");\n}\n\n// Find the number of channels in the point clouds.\n// If the point clouds have inconsistent number of channels,\n// return the minimum of 3 and the minimum number of channels.\n// This will be used to flag that we cannot reliable extract the\n// error channels, which start at channel 4.\nint asp::num_channels(std::vector<std::string> const& pc_files) {\n\n  VW_ASSERT(pc_files.size() >= 1,\n             ArgumentErr() << \"Expecting at least one point cloud file.\\n\");\n\n  int num_channels0 = get_num_channels(pc_files[0]);\n  int min_num_channels = num_channels0;\n  for (int i = 1; i < (int)pc_files.size(); i++) {\n    int num_channels = get_num_channels(pc_files[i]);\n    min_num_channels = std::min(min_num_channels, num_channels);\n    if (num_channels != num_channels0)\n      min_num_channels = std::min(min_num_channels, 3);\n  }\n  return min_num_channels;\n}\n\n// See if all the input point cloud files have stddev values\nbool asp::has_stddev(std::vector<std::string> const& pc_files) {\n\n  VW_ASSERT(pc_files.size() >= 1,\n            ArgumentErr() << \"Expecting at least one point cloud file.\\n\");\n\n  bool has_sd = true;\n  for (size_t i = 0; i < pc_files.size(); i++) {\n\n    std::string val;\n    boost::shared_ptr<vw::DiskImageResource> rsrc(new vw::DiskImageResourceGDAL(pc_files[i]));\n\n    std::string adj_key = \"BAND5\";\n    vw::cartography::read_header_string(*rsrc.get(), adj_key, val);\n    if (val != \"HorizontalStdDev\")\n      has_sd = false;\n\n    adj_key = \"BAND6\";\n    vw::cartography::read_header_string(*rsrc.get(), adj_key, val);\n    if (val != \"VerticalStdDev\")\n      has_sd = false;\n  }\n\n  if (has_sd && asp::num_channels(pc_files) < 6)\n    has_sd = false;\n\n  return has_sd;\n}\n\n// Get a handle to the error image given a set of point clouds with 4 or 6 bands\nvw::ImageViewRef<double> asp::point_cloud_error_image\n  (std::vector<std::string> const& pointcloud_files) {\n\n  ImageViewRef<double> error_image;\n  int num_channels = asp::num_channels(pointcloud_files);\n  bool has_sd = asp::has_stddev(pointcloud_files);\n\n  if (num_channels == 4 || (num_channels == 6 && has_sd)) {\n    // The error is a scalar (4 channels or 6 channels but last two are stddev values)\n    error_image = asp::error_norm<4>(pointcloud_files);\n  } else if (num_channels == 6) {\n    error_image = asp::error_norm<6>(pointcloud_files);\n  } else {\n    // Return an empty image\n    ImageView<double> image;\n    image.set_size(0, 0);\n    error_image = image;\n  }\n\n  return error_image;\n}\n\n// Read a single image file as a point cloud or texture, depending on PixelT.\n// For PixelGray<float>, just read the file directly. For vector types, use\n// the pre-compiled read_asp_point_cloud wrappers to avoid template bloat.\nnamespace {\ntemplate<class PixelT>\ntypename boost::enable_if<boost::is_same<PixelT, PixelGray<float>>,\n                          ImageViewRef<PixelT>>::type\nread_point_cloud_compatible_file(std::string const& file) {\n  return DiskImageView<PixelT>(file);\n}\ntemplate<class PixelT>\ntypename boost::disable_if<boost::is_same<PixelT, PixelGray<float>>,\n                           ImageViewRef<PixelT>>::type\nread_point_cloud_compatible_file(std::string const& file) {\n  constexpr int N = vw::math::VectorSize<PixelT>::value;\n  if constexpr (N == 3)\n    return asp::read_asp_point_cloud_3(file);\n  else if constexpr (N == 4)\n    return asp::read_asp_point_cloud_4(file);\n  else if constexpr (N == 6)\n    return asp::read_asp_point_cloud_6(file);\n  else\n    vw::vw_throw(vw::ArgumentErr() << \"Unsupported number of channels: \" << N << \"\\n\");\n}\n} // end anonymous namespace\n\n// Read given files and form an image composite.\ntemplate<class PixelT>\nImageViewRef<PixelT>\nasp::form_point_cloud_composite(std::vector<std::string> const& files,\n                                int spacing) {\n  VW_ASSERT(files.size() >= 1, ArgumentErr() << \"Expecting at least one file.\\n\");\n\n  vw::mosaic::ImageComposite<PixelT> composite_image;\n  composite_image.set_draft_mode(true);\n\n  for (int i = 0; i < (int)files.size(); i++) {\n    ImageViewRef<PixelT> I = read_point_cloud_compatible_file<PixelT>(files[i]);\n\n    // Stack images side by side, transposing wide ones\n    if (files.size() > 1 && I.rows() < I.cols())\n      I = transpose(I);\n\n    int start = composite_image.cols();\n    if (i > 0)\n      start = spacing * (int)ceil(double(start) / spacing) + spacing;\n\n    composite_image.insert(I, start, 0);\n  }\n\n  return composite_image;\n}\n\n// Explicit instantiations of form_point_cloud_composite\ntemplate ImageViewRef<PixelGray<float>>\nasp::form_point_cloud_composite<PixelGray<float>>(std::vector<std::string> const&, int);\ntemplate ImageViewRef<Vector3>\nasp::form_point_cloud_composite<Vector3>(std::vector<std::string> const&, int);\ntemplate ImageViewRef<Vector4>\nasp::form_point_cloud_composite<Vector4>(std::vector<std::string> const&, int);\ntemplate ImageViewRef<Vector6>\nasp::form_point_cloud_composite<Vector6>(std::vector<std::string> const&, int);\n\n// Read the error channels from the point clouds, and take their norm\ntemplate<int num_ch>\nImageViewRef<double>\nasp::error_norm(std::vector<std::string> const& pc_files) {\n  VW_ASSERT(pc_files.size() >= 1, ArgumentErr() << \"Expecting at least one file.\\n\");\n\n  const int beg_ech = 3;\n  const int num_ech = num_ch - beg_ech;\n  ImageViewRef<Vector<double, num_ch>> point_disk_image\n    = asp::form_point_cloud_composite<Vector<double, num_ch>>\n      (pc_files, ASP_MAX_SUBBLOCK_SIZE);\n  ImageViewRef<Vector<double, num_ech>> error_channels\n    = select_channels<num_ech, num_ch, double>(point_disk_image, beg_ech);\n\n  return per_pixel_filter(error_channels, asp::VectorNorm<Vector<double, num_ech>>());\n}\n\n// Explicit instantiations of error_norm\ntemplate ImageViewRef<double> asp::error_norm<4>(std::vector<std::string> const&);\ntemplate ImageViewRef<double> asp::error_norm<6>(std::vector<std::string> const&);\n"
  },
  {
    "path": "src/asp/Core/PointUtils.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file PointUtils.h\n\n// Utilities for handling point cloud files (las, PC.tif, csv).\n\n#ifndef __ASP_CORE_POINT_UTILS_H__\n#define __ASP_CORE_POINT_UTILS_H__\n\n#include <vw/Core/Functors.h>\n#include <vw/Image/PerPixelViews.h>\n#include <vw/Math/Vector.h>\n#include <vw/Math/Matrix.h>\n#include <vw/Image/ImageViewRef.h>\n#include <vw/Cartography/GeoReferenceUtils.h>\n#include <vw/Core/StringUtils.h>\n\n#include <map>\n#include <string>\n\nnamespace vw{\n  namespace cartography {\n    class Datum;\n    class GeoReference;\n  }\n  namespace geometry {\n    class anno;\n  }\n}\n\nconst int ASP_POINT_CLOUD_TILE_LEN = 2048;\nconst int ASP_MAX_SUBBLOCK_SIZE = 128;\n\nnamespace asp {\n\n  class BaseOptions;\n\n  /// A Data structure which converts from CSV to Cartesian and vice-versa.\n  // TODO(oalexan1): There is no enforcement that the georeference has actually\n  // been populated before it gets used. Fixing this will be quite some work\n  // given the many places this is used.\n  class CsvConv {\n\n  public: // Definitions\n\n    /// Any valid input file must contain one of these sets of fields\n    /// - Note that the data is not stored in this order internally.\n    enum CsvFormat{\n      XYZ, HEIGHT_LAT_LON, LAT_LON_RADIUS_M,\n      LAT_LON_RADIUS_KM, EASTING_HEIGHT_NORTHING, PIXEL_XYVAL};\n\n    /// Object used to store the data parsed from a CSV line.\n    struct CsvRecord{\n      vw::Vector3 point_data;\n      std::string file;\n    };\n\n  public: // Functions\n\n    /// Default Constructor, the object is not ready to use.\n    CsvConv() : format(XYZ), utm_zone(-1), utm_north(false), num_fields(0) {}\n\n    bool      is_configured() const {return csv_format_str != \"\";}\n    CsvFormat get_format   () const {return format;}\n\n    /// Writes out a header string containing each of the extracted column names\n    /// in the order they were specified.\n    std::string write_header_string(std::string const delimiter = \", \") const;\n\n    /// Initialize using a pair of CSV format strings\n    void parse_csv_format(std::string const& csv_format_str,\n                          std::string const& csv_srs,\n                          int min_num_fields = 3);\n\n    /// If the user passed in a csv file containing easting, northing, height\n    /// above datum, and either a utm zone or a custom proj4 string,\n    /// pass that info into the georeference for the purpose of converting\n    /// later from easting and northing to lon and lat.\n    bool parse_georef(vw::cartography::GeoReference & georef) const;\n\n    /// Extract values we care about from a csv string and pack them in a vector.\n    /// - This extracts the values in the same order they appear in the file.\n    /// - Use one of the conversion functions to get coordinates from this vector.\n    CsvRecord parse_csv_line(bool & is_first_line, bool & success,\n                              std::string const& line) const;\n\n    /// Reads an entire CSV file and stores a record for each line.\n    /// - Intended for use with smaller files.\n    size_t read_csv_file(std::string const    & file_path,\n                         std::list<CsvRecord> & output_list) const;\n      \n    /// Reads an entire CSV file having polygons. Individual\n    /// polygons are separated by a newline or some other unexpected text.\n    size_t read_poly_file(std::string     const   & file_path,\n                          std::list<CsvRecord>     & output_list,\n                          std::vector<int>         & contiguous_blocks,\n                          std::vector<std::string> & colors,\n                          std::vector<vw::geometry::anno> & annotations) const;\n      \n    /// Convert values read from a csv file using parse_csv_line (in\n    /// the same order they appear in the file) to a Cartesian\n    /// point. If return_point_height is true, and the csv point is\n    /// not in xyz format, return instead the projected point and\n    /// height above datum.\n    vw::Vector3 csv_to_cartesian_or_point_height(CsvRecord const& csv,\n                                                 vw::cartography::GeoReference const& geo,\n                                                 bool return_point_height) const;\n\n    /// Convert values read from a csv file using parse_csv_line to a Cartesian point.\n    vw::Vector3 csv_to_cartesian(CsvRecord const& csv,\n                                 vw::cartography::GeoReference const& geo) const;\n\n    /// Convert values read from a csv file using parse_csv_line to a lon/lat/height point.\n    vw::Vector3 csv_to_geodetic(CsvRecord const& csv,\n                                vw::cartography::GeoReference const& geo) const;\n\n    /// Convert values read from a csv file using parse_csv_line to a lon/lat point.\n    vw::Vector2 csv_to_lonlat(CsvRecord const& csv,\n                              vw::cartography::GeoReference const& geo) const;\n\n    /// Extracts the file name read from the csv line, or \"\" if it was not present.\n    std::string file_from_csv(CsvRecord const& csv) const {return csv.file;}\n\n    /// Re-order an xyz point so the values appear in the format and order they\n    /// did in the csv file. This function does nothing about all the fields we\n    /// ignored when we read the file.\n    vw::Vector3 cartesian_to_csv(vw::Vector3 const& xyz,\n                                 vw::cartography::GeoReference const& geo,\n                                 double mean_longitude) const;\n\n    /// Converts the point data vector from the order the fields appeared in the file\n    ///  to the order according to the \"format\" member variable.\n    vw::Vector3 sort_parsed_vector3(CsvRecord const& v) const;\n\n    /// Performs the reverse of sort_parsed_vector3, putting the values in the\n    /// order that they originally appeared in the file (ignores the file\n    /// field).\n    vw::Vector3 unsort_vector3(vw::Vector3 const& v) const;\n\n  private: // Variables\n    std::map<std::string,int>  name2col; ///< Target names -> Column index in input csv\n    std::map<int, std::string> col2name; ///< Target column in input csv -> Name\n    std::map<int, int>         col2sort; ///< Which input columns went in which vector indices (numbers only)\n\n    std::string csv_format_str;\n    std::string csv_srs;\n    CsvFormat   format;\n    int         utm_zone;\n    bool        utm_north;\n    int         num_fields; ///< The number of elements to extract from each CSV line\n    \n    friend class CsvReader;\n\n  private: // Functions\n\n    /// This function hard-codes the location in the parsed vector where each\n    ///  column type will go.\n    static int get_sorted_index_for_name(std::string const& name);\n\n  }; // End class CsvConv\n\n  bool is_tif(std::string const& file); ///< Return true if this is a TIF file\n  bool is_las(std::string const& file); ///< Return true if this is a LAS file\n  bool is_csv(std::string const& file); ///< Return true if this is a CSV file\n  bool is_pcd(std::string const& file); ///< Return true if this is a PCD file\n  bool is_las_or_csv_or_pcd(std::string const& file);\n\n  /// Builds a datum object out of the input arguments\n  bool read_user_datum(double semi_major, double semi_minor,\n                       std::string const& reference_spheroid,\n                       vw::cartography::Datum& datum );\n\n  /// Parse a UTM string such as \"58N\"\n  void parse_utm_str(std::string const& utm, int & zone, bool & north);\n\n  /// CSV separator\n  inline std::string csv_separator() { return \", \\t\"; }\n\n  /// Need this for pc_align and point2dem\n  inline std::string csv_opt_caption() {\n    return \"Specify the format of input CSV files as a list of entries column_index:column_type (indices start from 1). Examples: '1:x 2:y 3:z', '2:file 5:lon 6:lat 7:radius_m', '3:lat 2:lon 1:height_above_datum 5:file', '1:easting 2:northing 3:height_above_datum' (need to set --csv-srs). Can also use radius_km for column_type.\";\n  }\n\n  /// A valid line is not empty and does not start with '#'.\n  bool is_valid_csv_line(std::string const& line);\n\n  /// If a line has spaces only\n  bool hasSpacesOnly(std::string const& str);\n  \n  /// Returns the number of points contained in a CSV file\n  std::int64_t csv_file_size(std::string const& file);\n\n  /// Returns the number of points contained in a PCD file\n  std::int64_t pcd_file_size(std::string const& file);\n\n  // Peek at the first valid line in a file to find how many columns it has\n  int fileNumCols(std::string const& file);\n  \n  /// Erases a file suffix if one exists and returns the base string\n  std::string prefix_from_pointcloud_filename(std::string const& filename);\n\n  /// Read a point cloud file in the format written by ASP.\n  /// Given a point cloud with n channels, return the first m channels.\n  /// We must have 1 <= m <= n <= 6.\n  /// If the image was written by subtracting a shift, put that shift back.\n  template<int m>\n  vw::ImageViewRef<vw::Vector<double, m>> read_asp_point_cloud(std::string const& filename);\n\n  /// Read multiple image files and pack them into a single patchwork tiled image.\n  /// Relies on the vw::mosaic::ImageComposite class. Explicit instantiations\n  /// are in PointUtils.cc for PixelGray<float>, Vector3, Vector4, Vector6.\n  template<class PixelT>\n  vw::ImageViewRef<PixelT>\n  form_point_cloud_composite(std::vector<std::string> const& files, int spacing = 0);\n\n  // Apply an offset to the points in the PointImage\n  class PointOffsetFunc : public vw::UnaryReturnSameType {\n    vw::Vector3 m_offset;\n\n  public:\n    PointOffsetFunc(vw::Vector3 const& offset) : m_offset(offset) {}\n\n    template <class T>\n    T operator()(T const& p) const {\n      if (p == T()) return p; // Zero points are invalid. This is buggy.\n      return p + m_offset;\n    }\n  }; // End class PointOffsetFunc\n\n  template <class ImageT>\n  vw::UnaryPerPixelView<ImageT, PointOffsetFunc>\n  inline point_image_offset( vw::ImageViewBase<ImageT> const& image, vw::Vector3 const& offset) {\n    return vw::UnaryPerPixelView<ImageT,PointOffsetFunc>( image.impl(), PointOffsetFunc(offset));\n  }\n\n  // TODO: Move center lon functions and use consistently.\n\n  // Center Longitudes\n  class CenterLongitudeFunc : public vw::UnaryReturnSameType {\n    double center;\n  public:\n    CenterLongitudeFunc(double c = 0) : center(c) {}\n\n    vw::Vector3 operator()( vw::Vector3 const& v ) const {\n      if ( v[0] < center - 180 )\n        return (*this)(v + vw::Vector3(360,0,0));\n      else if ( v[0] > center + 180 )\n        return (*this)(v - vw::Vector3(360,0,0));\n      return v;\n    }\n  }; // End class CenterLongitudeFunc\n\n  template <class ImageT>\n  vw::UnaryPerPixelView<ImageT, CenterLongitudeFunc>\n  inline recenter_longitude( vw::ImageViewBase<ImageT> const& image, double center ) {\n    return vw::UnaryPerPixelView<ImageT, CenterLongitudeFunc>(image.impl(),\n                                                              CenterLongitudeFunc(center));\n  }\n\n  /// ImageView operation that applies a transform matrix to every point in the image.\n  class PointTransFunc : public vw::ReturnFixedType<vw::Vector3> {\n    vw::Matrix3x3 m_trans;\n  public:\n    PointTransFunc(vw::Matrix3x3 const& trans) : m_trans(trans) {}\n    vw::Vector3 operator() (vw::Vector3 const& pt) const { return m_trans*pt; }\n  };\n\n  template <class ImageT>\n  vw::UnaryPerPixelView<ImageT, PointTransFunc>\n  inline point_transform( vw::ImageViewBase<ImageT> const& image,\n                          vw::Matrix3x3 const& t ) {\n    return vw::UnaryPerPixelView<ImageT, PointTransFunc>(image.impl(),\n                                                         PointTransFunc(t));\n  }\n\n  /// Compute bounding box of the given cloud. If is_geodetic is false,\n  /// that means a cloud of raw xyz cartesian values, then Vector3()\n  /// signifies no-data. If is_geodetic is true, no-data is suggested\n  /// by having the z component of the point be NaN.\n  vw::BBox3 pointcloud_bbox(vw::ImageViewRef<vw::Vector3> const& point_image,\n                            bool is_geodetic);\n\n\n  // Class to read points from CSV one point at a\n  // time. Now that LAS support is via PDAL, this need\n  // not imitate the old LAS reader in libLAS.\n  class BaseReader {\n  public:\n    std::int64_t m_num_points;\n    bool         m_has_georef; // if the dataset has a georeference\n    vw::cartography::GeoReference m_georef;\n    \n    virtual bool        ReadNextPoint() = 0;\n    virtual vw::Vector3 GetPoint() = 0;\n    virtual ~BaseReader() {}\n  };\n \n // In the header file for the test, the others would ideally also have a test.\n /// Reader for .pcd files created by the PCL library.\n /// - Supports ascii and binary, but only three element GCC data.\n /// - This class needs to be tested before it is used!!!!\n class PcdReader: public BaseReader{\n  private:\n    std::string  m_pcd_file;\n    bool         m_has_valid_point;\n    bool         m_binary_format;\n    int          m_size_bytes;\n    char         m_type;\n    size_t       m_header_length_bytes;\n    vw::Vector3  m_curr_point;\n    std::ifstream * m_ifs;\n    \n    /// Read the text header of the PCD file\n    void read_header();\n    \n  public:\n    PcdReader(std::string const & pcd_file);\n    virtual bool ReadNextPoint();\n    virtual vw::Vector3 GetPoint();\n    virtual ~PcdReader();\n  }; // End class PcdReader\n\n\n// Determine if we should be using a longitude range between\n// [-180, 180] or [0,360]. The former is used, unless the latter\n// results in a tighter range of longitudes, such as when crossing\n// the international date line.\nvw::BBox2 estim_lonlat_box(vw::ImageViewRef<vw::Vector3> const& point_image, \n                           vw::cartography::Datum const& datum);\n\n// Find the median longitude and latitude for a subset of the point cloud\nvoid median_lon_lat(vw::ImageViewRef<vw::Vector3> const& point_image,\n                    vw::cartography::GeoReference const& georef,\n                    double & lon, double & lat);\n\nstd::string get_cloud_type(std::string const& file_name);\n  \n// Find the number of channels in the point clouds.\n// If the point clouds have inconsistent number of channels,\n// return the minimum of 3 and the minimum number of channels.\n// This will be used to flag that we cannot reliable extract the\n// error channels, which start at channel 4.\nint num_channels(std::vector<std::string> const& pc_files);\n\n// See if all the input point cloud files have stddev values\nbool has_stddev(std::vector<std::string> const& pc_files);\n    \n// Per pixel operator returning the norm of a vector  \ntemplate<class VectorT>\nstruct VectorNorm: public vw::ReturnFixedType<double> {\n  VectorNorm() {}\n  double operator() (VectorT const& vec) const {\n    return norm_2(vec);\n  }\n};\n  \n// Read the error channels from the point clouds, and take their norm.\n// Explicit instantiations are in PointUtils.cc for num_ch = 4 and 6.\ntemplate<int num_ch>\nvw::ImageViewRef<double> error_norm(std::vector<std::string> const& pc_files);\n\n// Get a handle to the error image given a set of point clouds with 4 or 6 bands\nvw::ImageViewRef<double> \npoint_cloud_error_image(std::vector<std::string> const& pointcloud_files);\n\n} // End namespace asp\n\n#endif\n"
  },
  {
    "path": "src/asp/Core/ProjectiveCamApprox.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file ProjectiveCamApprox.cc\n\n// Approximate a camera model with a projective transform\n\n#include <asp/Core/ProjectiveCamApprox.h>\n\n#include <Eigen/Dense>\n\nnamespace asp {\n\n// Compute the best-fitting projective transform that maps a set of 3D ground points\n// to 2D image points. See also: applyProjTrans().\nvoid calcProjTrans(std::vector<vw::Vector2> const& imagePts,\n                   std::vector<vw::Vector3> const& groundPts,\n                   std::vector<double> & transformCoeffs) {\n  \n  if (imagePts.size() != groundPts.size()) \n    vw::vw_throw(vw::ArgumentErr() \n       << \"The number of inputs and outputs must agree.\\n\");\n  \n  int numPts = imagePts.size();\n  if (numPts < 8)\n    vw::vw_throw(vw::ArgumentErr() \n      << \"At least 8 points are needed to fit a 3D-to-2D projective transform.\\n\");\n\n  int numMatRows = 2 * numPts; // there exist x and y coords for each point\n  int numMatCols = 14; // Number of variables in the projective transform\n  \n  Eigen::MatrixXd M = Eigen::MatrixXd::Zero(numMatRows, numMatCols);\n  Eigen::VectorXd b = Eigen::VectorXd::Zero(numMatRows);\n  \n  for (int it = 0; it < numPts; it++) {\n\n    double x = groundPts[it].x(), y = groundPts[it].y(), z = groundPts[it].z();\n    double col = imagePts[it].x(), row = imagePts[it].y();\n\n    // If the solution coefficients are u0, u1, ..., must have:\n \n    // (u0 + u1 * x + u2 * y + u3  * z) / (1 + u4  * x + u5  * y + u6  * z) = col\n    // (u7 + u8 * x + u9 * y + u10 * z) / (1 + u11 * x + u12 * y + u13 * z) = row\n\n    // Multiply by the denominators. Get a linear regression in the coefficients.\n    \n    M.row(2 * it + 0) << 1, x, y, z, -x * col, -y * col, -z * col, 0, 0, 0, 0, 0, 0, 0;\n    M.row(2 * it + 1) << 0, 0, 0, 0, 0, 0, 0, 1, x, y, z, -x * row, -y * row, -z * row;\n\n    b[2 * it + 0] = col;\n    b[2 * it + 1] = row;\n  }\n\n  // Solve the over-determined system, per:\n  // https://eigen.tuxfamily.org/dox/group__LeastSquares.html\n  Eigen::VectorXd u = M.colPivHouseholderQr().solve(b);\n\n  // Copy back the result to a standard vector (to avoid using Eigen too much as\n  // that is slow to compile).\n  transformCoeffs.resize(numMatCols);\n  for (int it = 0; it < numMatCols; it++)\n    transformCoeffs[it] = u[it];\n  return;\n} \n\n// Apply a projective transform to a ground point and compute the image pixel\nvw::Vector2 applyProjTrans(vw::Vector3 const& xyz,\n                           std::vector<double> const& transformCoeffs) {\n\n  std::vector<double> const& u = transformCoeffs; // alias\n  \n  // See the projective transform formula in calcProjTrans().\n  double x = xyz.x(), y = xyz.y(), z = xyz.z();\n  double col_den = 1 + u[4]  * x + u[5]  * y + u[6]  * z;\n  double row_den = 1 + u[11] * x + u[12] * y + u[13] * z;\n  \n  // It is quite unusual for the denominator to be zero, as the ground point is\n  // normally in front of the camera. In that case better return something large\n  // rather than Inf.\n  if (col_den == 0)\n    col_den = 1e-8;\n  if (row_den == 0)\n    row_den = 1e-8;\n    \n  double col = (u[0] + u[1] * x + u[2] * y + u[3]  * z) / col_den;\n  double row = (u[7] + u[8] * x + u[9] * y + u[10] * z) / row_den;\n\n  return vw::Vector2(col, row);\n}\n\n} // End namespace asp\n"
  },
  {
    "path": "src/asp/Core/ProjectiveCamApprox.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file ProjectiveCamApprox.h\n\n// Approximate a camera model with a projective transform\n\n#ifndef __ASP_CORE_PROJECTIVE_CAM_APPROX_H__\n#define __ASP_CORE_PROJECTIVE_CAM_APPROX_H__\n\n#include <vw/Math/Vector.h>\n\nnamespace asp {\n\n// Compute the best-fitting projective transform that maps a set of 3D ground points\n// to 2D image points. See also: applyProjTrans().\nvoid calcProjTrans(std::vector<vw::Vector2> const& imagePts,\n                   std::vector<vw::Vector3> const& groundPts,\n                   std::vector<double> & transformCoeffs);\n\n// Apply a projective transform to a ground point and compute the image pixel\nvw::Vector2 applyProjTrans(vw::Vector3 const& xyz,\n                           std::vector<double> const& transformCoeffs);\n\n} // End namespace asp\n\n#endif // __ASP_CORE_PROJECTIVE_CAM_APPROX_H__\n\n"
  },
  {
    "path": "src/asp/Core/ReportUtils.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file ReportUtils.cc\n///\n\n// Utilities for reading report files\n\n#include <asp/Core/ReportUtils.h>\n#include <vw/Core/Exception.h>\n#include <vw/Core/Log.h>\n#include <boost/algorithm/string/replace.hpp>\n#include <boost/algorithm/string/case_conv.hpp>\n\nnamespace asp {\n\n// See the header for the function description.\nvoid readReportFile(std::string const& report_file,\n                    std::set<std::string> const& str_col_names,\n                    std::set<std::string> const& num_col_names,\n                    // Outputs\n                    std::map<std::string, std::vector<std::string>> & str_map,\n                    std::map<std::string, std::vector<double>> & num_map) {\n\n  // Open the file for reading, and throw an error if it fails\n  vw::vw_out() << \"Reading: \" << report_file << \"\\n\";\n  std::ifstream file(report_file.c_str());\n  if (!file.is_open())\n    vw::vw_throw(vw::ArgumentErr() << \"Failed to open file: \" << report_file << \"\\n\");\n\n  // Wipe the outputs\n  str_map.clear();\n  num_map.clear();\n  \n  // Read the header\n  std::string header;\n  std::getline(file, header);\n  // Make lowercase\n  boost::to_lower(header);\n  // Replace all pound signs and commas with spaces\n  boost::replace_all(header, \"#\", \" \");\n  boost::replace_all(header, \",\", \" \");\n  // Split the header into tokens\n  std::istringstream is(header);\n  std::vector<std::string> colNames;  \n  std::string val;\n  while (is >> val)\n    colNames.push_back(val);\n    \n  // Parse each line\n  std::string line;\n  while (std::getline(file, line)) {\n\n    // Replace all commas with spaces\n    boost::replace_all(line, \",\", \" \");\n    // Split the line into tokens\n    std::istringstream is(line);\n    std::vector<std::string> tokens;\n    while (is >> val)\n      tokens.push_back(val);\n      \n    // Skip empty lines\n    if (tokens.empty()) \n      continue;\n    // Skip lines starting with a pound sign\n    if (tokens[0][0] == '#') \n      continue;\n      \n    // Must have as many tokens as columns\n    if (tokens.size() != colNames.size()) \n      vw::vw_throw(vw::ArgumentErr() << \"Line has \" << tokens.size() << \" values. \"\n                   << \"Expected: \" << colNames.size() << \"\\n\");\n      \n    // Iterate over tokens. If the token is a string, add it to the string map.\n    // If it is a number, add it to the number map.\n    for (size_t i = 0; i < tokens.size(); i++) {\n      // check if colNames[i] is in str_col_names \n      if (str_col_names.find(colNames[i]) != str_col_names.end()) {\n        \n        str_map[colNames[i]].push_back(tokens[i]);\n        \n      } else if (num_col_names.find(colNames[i]) != num_col_names.end()) {\n        \n        // Must be a number. Add it to the number map. Do a simple sanity check.\n        auto const& t = tokens[i];\n        if (!isdigit(t[0]) && t[0] != '-' && t[0] != '.')\n          vw::vw_throw(vw::ArgumentErr() << \"Expected a number, got: \" << t << \"\\n\");\n        num_map[colNames[i]].push_back(atof(t.c_str()));\n      }\n    }\n  }  \n  \n  // Check each desired column is present in the file\n  for (std::string const& col: str_col_names) {\n    if (str_map.find(col) == str_map.end())\n      vw::vw_throw(vw::ArgumentErr() << \"Column \" << col << \" not found in: \"\n                    << report_file << \"\\n\");\n  }\n  for (std::string const& col: num_col_names) {\n    if (num_map.find(col) == num_map.end())\n      vw::vw_throw(vw::ArgumentErr() << \"Column \" << col << \" not found in: \"\n                    << report_file << \"\\n\");\n  }\n  \n  // All columns must have the same size\n  size_t num_rows = str_map.begin()->second.size();\n  for (auto const& p: str_map) {\n    if (p.second.size() != num_rows)\n      vw::vw_throw(vw::ArgumentErr() << \"Column \" << p.first << \" has \" << p.second.size()\n                    << \" rows, expected: \" << num_rows << \"\\n\");\n  }\n  for (auto const& p: num_map) {\n    if (p.second.size() != num_rows)\n      vw::vw_throw(vw::ArgumentErr() << \"Column \" << p.first << \" has \" << p.second.size()\n                    << \" rows, expected: \" << num_rows << \"\\n\");\n  }\n}\n    \n} // end namespace asp\n\n"
  },
  {
    "path": "src/asp/Core/ReportUtils.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file ReportUtils.h\n///\n\n// Utilities for reading report files\n\n#ifndef __ASP_CORE_REPORT_UTILS_H__\n#define __ASP_CORE_REPORT_UTILS_H__\n\n#include <string>\n#include <vector>\n#include <map>\n#include <set>\n#include <iostream>\n#include <fstream>\n\nnamespace asp {\n\n// Given a report file with the first line being a header having column names,\n// read it into a map. The keys will be the column names, the values will be\n// vectors of strings or doubles. The desired names of columns and their types\n// are passed in as arguments.\nvoid readReportFile(std::string const& report_file,\n                    std::set<std::string> const& str_col_names,\n                    std::set<std::string> const& num_col_names,\n                    // Outputs\n                    std::map<std::string, std::vector<std::string>> & str_map,\n                    std::map<std::string, std::vector<double>> & num_map);\n                    \n  \n} // End namespace asp\n\n#endif\n"
  },
  {
    "path": "src/asp/Core/StereoSettings.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file StereoSettings.cc\n///\n#include <fstream>\n\n#include <vw/Core/RunOnce.h>\n#include <vw/Core/Log.h>\n\n#include <asp/Core/AspProgramOptions.h>\n#include <asp/Core/AspLog.h>\n#include <asp/Core/StereoSettingsDesc.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/PointUtils.h>\n\n#include <boost/algorithm/string.hpp>\n#include <boost/program_options.hpp>\n\nnamespace po = boost::program_options;\nusing namespace vw;\n\nconst double g_nan_val = std::numeric_limits<double>::quiet_NaN();\n\n// Create a single instance of the StereoSettings\n// ---------------------------------------------------\nnamespace {\n  vw::RunOnce stereo_settings_once = VW_RUNONCE_INIT;\n  boost::shared_ptr<asp::StereoSettings> stereo_settings_ptr;\n  void init_stereo_settings() {\n    stereo_settings_ptr = boost::shared_ptr<asp::StereoSettings>(new asp::StereoSettings());\n  }\n}\n\nnamespace asp {\n\nStereoSettings& stereo_settings() {\n  stereo_settings_once.run(init_stereo_settings);\n\n  // Ensure StereoSettings are initialized\n  if (!(*stereo_settings_ptr).initialized_stereo_settings) {\n    // This call must happen first, otherwise we get into infinite\n    // recursion.\n    stereo_settings_ptr->initialized_stereo_settings = true;\n\n    // Initialize the members of StereoSettings().\n    vw::GdalWriteOptions opt;\n    stereo_settings_ptr->initialize(opt);\n  }\n\n  return *stereo_settings_ptr;\n}\n\nvoid StereoSettings::initialize(vw::GdalWriteOptions & opt) {\n  // This is a bug fix. Ensure that all members of this class as\n  // well as opt itself are always initialized before using them,\n  // whether in stereo, other ASP applications, or the unit\n  // tests. What is going on below is the following. The call to\n  // generate_config_file_options() specifies what the values of the\n  // class members should be, then we parse and initialize them when\n  // po::store is invoked. Note that we don't override any of the\n  // options from the command line (that's done much later), hence\n  // below we use empty command line options.\n\n  po::options_description l_opts(\"\");\n  l_opts.add(asp::generate_config_file_options(opt));\n      po::variables_map l_vm;\n  try {\n    int l_argc = 1; const char* l_argv[] = {\"\"};\n      po::store(po::command_line_parser(l_argc, l_argv).options(l_opts).style(po::command_line_style::unix_style).run(), l_vm);\n      po::notify(l_vm);\n  } catch (po::error const& e) {\n    vw::vw_throw(vw::ArgumentErr() << \"Error parsing input:\\n\"\n                  << e.what() << \"\\n\" << l_opts);\n  }\n}\n\nStereoSettings::StereoSettings() {\n\n  // This var will turn to true once all stereo settings were parsed\n  // and all the members of this class are initialized.\n  initialized_stereo_settings = false;\n\n  default_corr_timeout = 900; // in seconds\n\n  nodata_value = g_nan_val;\n}\n\n// Define our options that are available\n// ----------------------------------------------------------\nPreProcessingDescription::PreProcessingDescription():\n  po::options_description(\"Preprocessing options\") {\n\n  StereoSettings& global = stereo_settings();\n\n  (*this).add_options()\n    (\"alignment-method\", po::value(&global.alignment_method)->default_value(\"affineepipolar\"),\n      \"Alignment for input images. [affineepipolar, local_epipolar, homography, epipolar, none]\")\n    (\"left-image-crop-win\",\n     po::value(&global.left_image_crop_win)->default_value(BBox2i(0, 0, 0, 0), \"xoff yoff xsize ysize\"),\n      \"Do stereo in a region of the left image. Default: use the entire image. \"\n      \"This option forces redoing all the pre-processing steps if a run is resumed. \"\n      \"The region be created by stereo_gui. See also right-image-crop-win and \"\n      \"proj-win.\")\n    (\"right-image-crop-win\",\n     po::value(&global.right_image_crop_win)->default_value(BBox2i(0, 0, 0, 0), \n                                                            \"xoff yoff xsize ysize\"),\n      \"When combined with left-image-crop-win, do stereo in given subregions of \"\n      \"left and right images. The crop windows can be determined using stereo_gui. \"\n      \"See also proj-win.\")\n    (\"proj-win\",\n     po::value(&global.proj_win)->default_value(BBox2i(0, 0, 0, 0), \"minx miny maxx maxy\"),\n     \"Limit stereo to this projection window for input mapprojected images. This \"\n     \"option forces redoing all the pre-processing steps in a resumed run. \"\n     \"Available in build 2026-01 or later. See also left-image-crop-win and \"\n     \"right-image-crop-win.\")\n    (\"force-use-entire-range\", po::bool_switch(&global.force_use_entire_range)->default_value(false)->implicit_value(true),\n      \"Normalize images based on the global min and max values from both images. Don't use this option if you are using normalized cross correlation.\")\n    (\"individually-normalize\", po::bool_switch(&global.individually_normalize)->default_value(false)->implicit_value(true),\n      \"Individually normalize the input images between 0.0-1.0 using +- 2.5 sigmas about their mean values.\")\n    (\"ip-per-tile\", po::value(&global.ip_per_tile)->default_value(0),\n      \"How many interest points to detect in each 1024^2 image tile (default: automatic determination). This is before matching. Not all interest points will have a match. See also --matches-per-tile.\")\n    (\"ip-per-image\", po::value(&global.ip_per_image)->default_value(0),\n      \"How many interest points to detect in each image, before matching (default: automatic determination). Can set either this or --ip-per-tile.\")\n    (\"matches-per-tile\", po::value(&global.matches_per_tile)->default_value(0),\n      \"How many interest point matches to compute in each image tile (of size \"\n      \"normally 1024^2 pixels). Use a value of --ip-per-tile a few times larger \"\n      \"than this. See also --matches-per-tile-params.\")\n    (\"ip-detect-method\", po::value(&global.ip_detect_method)->default_value(0),\n      \"Interest point detection algorithm (0: Integral OBALoG (default), 1: OpenCV SIFT, 2: OpenCV ORB.\")\n    (\"epipolar-threshold\", po::value(&global.epipolar_threshold)->default_value(-1),\n      \"Maximum distance from the epipolar line to search for IP matches. Default: automatic calculation.\")\n    (\"ip-edge-buffer\", po::value(&global.ip_edge_buffer_percent)->default_value(0),\n      \"Remove IP within this percentage from the outer edges of an image pair (integer percent).\")\n    (\"normalize-ip-tiles\", po::bool_switch(&global.ip_normalize_tiles)->default_value(false)->implicit_value(true),\n      \"Individually normalize tiles used for IP detection.\")\n    (\"dem\", po::value(&global.dem)->default_value(\"\"),\n      \"Input DEM for processing map-projected images. Can be used instead of \"\n      \"specifying the DEM as the last positional argument.\")\n    (\"matches-as-txt\",\n     po::bool_switch(&global.matches_as_txt)->default_value(false)->implicit_value(true),\n      \"Read and write match files as plain text instead of binary.\")\n    (\"ip-inlier-factor\", po::value(&global.ip_inlier_factor)->default_value(0.2),\n      \"A higher factor will result in more interest points, but perhaps also more outliers, \"\n      \"and a bigger search range.\")\n    (\"ip-uniqueness-threshold\", po::value(&global.ip_uniqueness_thresh)->default_value(0.8),\n      \"Min percentage distance between closest and second closest IP descriptors, a larger value allows more IP matches.\")\n    (\"ip-nodata-radius\", po::value(&global.ip_nodata_radius)->default_value(4),\n      \"Remove IP near nodata with this radius, in pixels.\")\n    (\"ip-triangulation-max-error\", po::value(&global.ip_triangulation_max_error)->default_value(-1),\n      \"When matching IP, filter out any pairs with a triangulation error higher than this.\")\n    (\"ip-num-ransac-iterations\", po::value(&global.ip_num_ransac_iterations)->default_value(1000),\n      \"How many RANSAC iterations to do in interest point matching.\")\n    (\"disable-tri-ip-filter\", po::bool_switch(&global.disable_tri_filtering)->default_value(false)->implicit_value(true),\n      \"Turn off the tri-ip filtering step.\")\n    (\"ip-debug-images\", po::bool_switch(&global.ip_debug_images)->default_value(false)->implicit_value(true),\n      \"Write debug images to disk when detecting and matching interest points.\")\n    (\"num-obalog-scales\", po::value(&global.num_scales)->default_value(-1),\n      \"How many scales to use if detecting interest points with OBALoG. If not specified, 8 will be used. More can help for images with high frequency artifacts.\")\n    (\"nodata-value\", po::value(&global.nodata_value)->default_value(g_nan_val),\n      \"Pixels with values less than or equal to this number are treated as no-data. This overrides the no-data values from input images.\")\n    (\"stddev-mask-kernel\", po::value(&global.nodata_stddev_kernel)->default_value(-1),\n      \"Size of kernel to be used in standard deviation filtering of input images. Must be > 1 and odd to be enabled. To be used with --stddev-mask-thresh.\")\n    (\"stddev-mask-thresh\", po::value(&global.nodata_stddev_thresh)->default_value(0.5),\n      \"Mask out pixels from input images where the local standard deviation score is less than this value. If set < 0, debug files (*stddev_filter_output.tif) will be written containing the filter output instead of masking out pixels.To be used with --stddev-mask-kernel.\")\n    (\"skip-rough-homography\", po::bool_switch(&global.skip_rough_homography)->default_value(false)->implicit_value(true),\n      \"Skip the step of performing datum-based rough homography if it fails.\")\n    (\"no-datum\", po::bool_switch(&global.no_datum)->default_value(false)->implicit_value(true),\n      \"Do not assume a reliable datum exists, such as for potato-shaped bodies.\")\n    (\"skip-image-normalization\", po::bool_switch(&global.skip_image_normalization)->default_value(false)->implicit_value(true),\n      \"Skip the step of normalizing the values of input images and removing nodata-pixels. Create instead symbolic links to original images. This is a speedup option for mapprojected input images with no alignment.\")\n    (\"force-reuse-match-files\", po::bool_switch(&global.force_reuse_match_files)->default_value(false)->implicit_value(true),\n      \"Force reusing the match files even if older than the images or cameras.\")\n    (\"part-of-multiview-run\", po::bool_switch(&global.part_of_multiview_run)->default_value(false)->implicit_value(true),\n      \"If the current run is part of a larger multiview run.\")\n    (\"global-alignment-threshold\", po::value(&global.global_alignment_threshold)->default_value(10),\n      \"Maximum distance from inlier interest point matches to the epipolar line when calculating the global affine epipolar alignment.\")\n    (\"local-alignment-threshold\", po::value(&global.local_alignment_threshold)->default_value(2),\n      \"Maximum distance from inlier interest point matches to the epipolar line when calculating the local affine epipolar alignment.\")\n    (\"alignment-num-ransac-iterations\", \n     po::value(&global.alignment_num_ransac_iterations)->default_value(1000),\n      \"How many RANSAC iterations to use for global or local epipolar alignment.\")\n    (\"outlier-removal-params\", po::value(&global.outlier_removal_params)->default_value(Vector2(95.0, 3.0), \"pct factor\"),\n      \"Outlier removal params (percentage and factor) to be used in filtering interest points and the disparity with the box-and-whisker algorithm. Set the percentage to 100 to turn this off.\")\n    (\"matches-per-tile-params\", \n     po::value(&global.matches_per_tile_params)->default_value(Vector2(1024, 1280), \"1024 1280\"),\n      \"To be used with --matches-per-tile. The first value is the image tile \"\n      \"size for both images. A larger second value allows each right tile to \"\n      \"further expand to this size, resulting in the tiles overlapping. This may be \"\n      \"needed if the homography alignment between these images is not great, as \"\n      \"this transform is used to pair up left and right image tiles.\")\n    (\"datum\", po::value(&global.datum)->default_value(\"\"),\n      \"Set the planet datum. Options: WGS_1984, D_MOON (1,737,400 meters), \"\n      \"D_MARS (3,396,190 meters), MOLA (3,396,000 meters), NAD83, WGS72, and NAD27. \"\n      \"Also accepted: Earth (=WGS_1984), Mars (=D_MARS), Moon (=D_MOON). If not set, \"\n      \"will be auto-guessed based on camera centers (for Earth, Mars, and Moon).\")\n    (\"match-files-prefix\",\n     po::value(&global.match_files_prefix)->default_value(\"\"),\n      \"Use the match file from this prefix. Normally contains match files \"\n      \"created with bundle_adjust or parallel_stereo.\")\n    (\"clean-match-files-prefix\",\n     po::value(&global.clean_match_files_prefix)->default_value(\"\"),\n      \"Use as input the *-clean.match file from this prefix (this had the \"\n      \"outliers filtered out).\")\n    (\"band\", po::value(&global.band)->default_value(-1),\n      \"Use this band (channel) from input images if more than one. The band count starts \"\n      \"from 1. If not set and more than one band is present, use the first band and print a \"\n      \"warning.\")\n    (\"flann-method\", po::value(&global.flann_method)->default_value(\"auto\"),\n      \"Choose the FLANN method for matching interest points. Options: 'kmeans': slower but \"\n      \"deterministic, 'kdtree': faster (up to 6x) but not deterministic (starting with \"\n      \"FLANN 1.9.2). The default ('auto') is to use 'kmeans' for 25,000 features or less \"\n      \"and 'kdtree' otherwise. This does not apply to ORB feature matching.\")\n    (\"left-image-clip\", po::value(&global.left_image_clip)->default_value(\"\"),\n      \"If --left-image-crop-win is used, replaced the left image cropped to that window with this clip.\")\n    (\"right-image-clip\", po::value(&global.right_image_clip)->default_value(\"\"),\n      \"If --right-image-crop-win is used, replaced the right image cropped to that window with this clip.\")\n    (\"accept-provided-mapproj-dem\",\n      po::bool_switch(&global.accept_provided_mapproj_dem)->default_value(false)->implicit_value(true),\n      \"Accept the DEM provided on the command line as the one mapprojection was done with, \"\n      \"even if it disagrees with the DEM recorded in the geoheaders of input images.\")\n    (\"allow-different-mapproject-gsd\",\n      po::bool_switch(&global.allow_different_mapproject_gsd)->default_value(false)->implicit_value(true),\n      \"Allow the left and right mapprojected images to have different GSD. This is \"\n      \"for backward compatibility, and is not recommended.\")\n    (\"ortho-heights\",\n      po::value(&global.ortho_heights)->default_value(Vector2(g_nan_val, g_nan_val),\n      \"nan nan\"),\n      \"It is assumed that the left and right input images have been mapprojected onto \"\n      \"surfaces with the provided heights above a datum. The datum is read from the \"\n      \"image geoheaders.\")\n    (\"output-prefix-override\",\n     po::value(&global.output_prefix_override)->default_value(\"\"),\n      \"Override the output prefix with this value. Needed during parallel stereo.\")\n\n    // For bathymetry correction\n    (\"left-bathy-mask\", po::value(&global.left_bathy_mask),\n      \"Mask to use for the left image when doing bathymetry. Pixels classified as \"\n      \"water must have non-positive value or be no-data in the mask, while land \"\n      \"pixels must have positive value.\")\n    (\"right-bathy-mask\", po::value(&global.right_bathy_mask),\n      \"Mask to use for the right image when doing bathymetry. See also \"\n      \"left-bathy-mask.\")\n    (\"bathy-plane\", po::value(&global.bathy_plane),\n      \"Path to a file containing a plane approximating the water surface, for \"\n      \"bathymetry correction with underwater terrain. This corrects camera rays passing \"\n      \"through water using Snell's law. If there is one plane per image, use \"\n      \"--bathy-plane-list. Use together with --refraction-index.\")\n    (\"bathy-plane-list\", po::value(&global.bathy_plane_list)->default_value(\"\"),\n      \"Path to a file containing a list of bathy plane files for bathymetry correction, \"\n      \"if more than one. Set one plane file per line. Must specify one plane per input \"\n      \"image, in the same order. Use with --refraction-index.\")\n    (\"refraction-index\", po::value(&global.refraction_index)->default_value(0),\n      \"The index of refraction of water to be used in bathymetry correction. \"\n      \"Must be specified and bigger than 1. This index can be computed with \"\n      \"the refr_index program.\")\n    (\"output-cloud-type\", po::value(&global.output_cloud_type)->default_value(\"all\"),\n      \"When bathymetry correction is used, return only the triangulated cloud of points where the bathymetry correction was applied (option: 'bathy'), where it was not applied (option: 'topo'), or the full cloud (option: 'all'). The default is 'all'.\")\n    (\"stop-after-stats\",\n      po::bool_switch(&global.stop_after_stats)->default_value(false)->implicit_value(true),\n      \"Stop after computing stereo statistics. Needed for stereo_dist.\")\n    (\"stereo-dist-mode\",\n      po::bool_switch(&global.stereo_dist_mode)->default_value(false)->implicit_value(true),\n     \"In this mode (distributed stereo processing) reuse the stats, expand the left crop \"\n     \"win by padding, auto-compute the right crop win, and skip stereo convergence angle \"\n     \"calculation.\")\n    ;\n}\n\nCorrelationDescription::CorrelationDescription():\n  po::options_description(\"Correlation options\") {\n\n  StereoSettings& global = stereo_settings();\n  (*this).add_options()\n    (\"prefilter-mode\", po::value(&global.pre_filter_mode)->default_value(2),\n      \"Filter used to prepare images before performing correlation. Used only with the \"\n      \"asp_bm algorithm. Options: 0 (none), 1 (subtracted mean), 2 (LoG).\")\n    (\"prefilter-kernel-width\", po::value(&global.slogW)->default_value(1.5),\n      \"Sigma value for Gaussian kernel used with prefilter modes 1 and 2.\")\n    (\"corr-seed-mode\", po::value(&global.seed_mode)->default_value(1),\n      \"Correlation seed strategy. [0 None, 1 Use low-res disparity from stereo, 2 Use low-res disparity from provided DEM (see disparity-estimation-dem), 3 Use low-res disparity produced by sparse_disp (in development)]\")\n    (\"min-num-ip\", po::value(&global.min_num_ip)->default_value(20),\n      \"The minimum number of interest points which must be found to estimate the search range.\")\n    (\"corr-sub-seed-percent\", po::value(&global.seed_percent_pad)->default_value(0.25),\n      \"Expand the search range by this factor when computing the low-resolution disparity.\")\n    (\"disparity-range-expansion-percent\", po::value(&global.disparity_range_expansion_percent)->default_value(20.0),\n      \"Expand the disparity range estimated from interest points by this percentage before computing the stereo correlation with local epipolar alignment.\")\n    (\"cost-mode\", po::value(&global.cost_mode)->default_value(2),\n      \"Correlation cost metric. [0 Absolute, 1 Squared, 2 Normalized Cross Correlation, 3 Census Transform (SGM only), 4 Ternary Census Transform (SGM only)]\")\n    (\"xcorr-threshold\", po::value(&global.xcorr_threshold)->default_value(2.0),\n      \"L-R vs R-L agreement threshold in pixels.\")\n    (\"min-xcorr-level\", po::value(&global.min_xcorr_level)->default_value(0),\n      \"Minimum level to run xcorr check on (SGM only).\")\n    (\"save-left-right-disparity-difference\",\n      po::bool_switch(&global.save_lr_disp_diff)->default_value(false)->implicit_value(true),\n      \"Save the discrepancy between left-to-right and right-to-left disparities. See the doc for more info.\")\n\n    (\"corr-kernel\", po::value(&global.corr_kernel)->default_value(Vector2i(21,21),\"21 21\"),\n      \"Kernel size used for integer correlator.\")\n    (\"corr-search\", po::value(&global.search_range)->default_value(BBox2(0,0,0,0), \"auto\"),\n    \"Disparity search range. Will be used to find low-resolution disparity. Specify in format: hmin vmin hmax vmax. The doc has more info.\")\n    (\"max-disp-spread\", po::value(&global.max_disp_spread)->default_value(-1.0),\n      \"If positive, limit the spread of the disparity to this value (horizontally and vertically, centered at the median value). Do not specify together with --corr-search-limit.\")\n\n    (\"corr-search-limit\",\n      po::value(&global.corr_search_limit)->default_value(BBox2(0,0,0,0), \"auto\"),\n      \"Limit the automatically computed disparity search range to these bounds, specified as: hmin vmin hmax vmax. See also --max-disp-spread.\")\n    (\"ip-filter-using-dem\", po::value(&global.ip_filter_using_dem)->default_value(\"\"),\n      \"Filter as outliers interest point matches whose triangulated height differs by more than given value from the height at the same location for the given DEM. All heights are in meters.  Specify as: '<dem file> <height diff>. Example: 'dem.tif 50.0'.\")\n    (\"elevation-limit\", po::value(&global.elevation_limit)->default_value(Vector2(0,0), \"auto\"),\n      \"Limit on expected elevation range: Specify as two values: min max.\")\n    // Note that we count later on the default for lon_lat_limit being BBox2(0,0,0,0).\n    (\"lon-lat-limit\", po::value(&global.lon_lat_limit)->default_value(BBox2(0,0,0,0), \"auto\"),\n      \"Limit the triangulated interest points to this longitude-latitude range. The format is: lon_min lat_min lon_max lat_max.\")\n    (\"corr-max-levels\", po::value(&global.corr_max_levels)->default_value(5),\n      \"Max pyramid levels to process when using the integer correlator. (0 is just a single level).\")\n    // TODO: These parameters are used here, but are only set as filter options.\n    //(\"rm-min-matches\", po::value(&global.rm_min_matches)->default_value(60),\n    //  \"Minimum number of pixels to be matched to keep sample (for filter mode 2).\")\n    //(\"rm-threshold\", po::value(&global.rm_threshold)->default_value(3),\n    // \"Maximum distance between samples to be considered still matched (for filter mode 2).\")\n    (\"rm-quantile-percentile\",\n      po::value(&global.rm_quantile_percentile)->default_value(0.85),\n      \"Filter out pixels in D_sub where disparity > multiple*quantile.\")\n    (\"rm-quantile-multiple\", po::value(&global.rm_quantile_multiple)->default_value(-1),\n    \"Filter out pixels in D_sub where disparity > multiple*quantile. Set to a positive \"\n    \"value to enable.\")\n    (\"skip-low-res-disparity-comp\",\n      po::bool_switch(&global.skip_low_res_disparity_comp)->default_value(false)->implicit_value(true),\n    \"Skip the low-resolution disparity computation. This option is invoked from \"\n    \"parallel_stereo.\")\n    (\"compute-low-res-disparity-only\", po::bool_switch(&global.compute_low_res_disparity_only)->default_value(false)->implicit_value(true),\n    \"Compute only the low-resolution disparity, skip the full-resolution disparity \"\n    \"computation.\")\n    (\"disparity-estimation-dem\",\n      po::value(&global.disparity_estimation_dem)->default_value(\"\"),\n      \"The DEM to use in estimating the low-resolution disparity \"\n      \"(when corr-seed-mode is 2).\")\n    (\"disparity-estimation-dem-error\",\n      po::value(&global.disparity_estimation_dem_error)->default_value(0.0),\n      \"Error, or uncertainty, in meters, of the disparity estimation DEM.\")\n    (\"disparity-estimation-sample-rate\",\n      po::value(&global.disparity_estimation_sample_rate)->default_value(1),\n      \"Use one out of this many samples along each row and column, \"\n      \"for ---corr-seed-mode 2.\")\n    (\"corr-timeout\",\n      po::value(&global.corr_timeout)->default_value(global.default_corr_timeout),\n      \"Correlation timeout for an image tile, in seconds.\")\n    (\"stereo-algorithm\",\n      po::value(&global.stereo_algorithm)->default_value(\"asp_bm\"),\n      \"Stereo algorithm to use. Options: asp_bm, asp_sgm, asp_mgm, asp_final_mgm, mgm (original author implementation), opencv_sgbm, libelas, msmw, msmw2, and opencv_bm.\")\n    (\"corr-blob-filter\", po::value(&global.corr_blob_filter_area)->default_value(0),\n      \"Filter blobs this size or less in correlation pyramid step.\")\n    (\"corr-tile-size\", po::value(&global.corr_tile_size_ovr)->default_value(ASPGlobalOptions::corr_tile_size()),\n      \"Override the default tile size used for processing.\")\n    (\"sgm-collar-size\", po::value(&global.sgm_collar_size)->default_value(512),\n      \"Extend SGM calculation to this distance to increase accuracy at tile borders.\")\n    (\"sgm-search-buffer\", po::value(&global.sgm_search_buffer)->default_value(Vector2i(4,4),\"4 4\"),\n      \"Search range expansion for SGM down stereo pyramid levels.  Smaller values are faster, but greater change of blunders.\")\n    (\"corr-memory-limit-mb\", po::value(&global.corr_memory_limit_mb)->default_value(5*1024),\n      \"Keep correlation memory usage (per tile) close to this limit.  Important for SGM/MGM.\")\n    (\"correlator-mode\", po::bool_switch(&global.correlator_mode)->default_value(false)->implicit_value(true),\n      \"Function as an image correlator only (including with subpixel refinement). Assume no cameras, aligned input images, and stop before triangulation, so at filtered disparity.\")\n\n    (\"stereo-debug\", po::bool_switch(&global.stereo_debug)->default_value(false)->implicit_value(true),\n      \"Write stereo debug images and output.\")\n  (\"local-alignment-debug\", po::bool_switch(&global.local_alignment_debug)->default_value(false)->implicit_value(true),\n    \"Save the results of more intermediate steps when doing local alignment.\");\n\n   po::options_description backwards_compat_options(\"Aliased backwards compatibility options\");\n\n  // Do not add default values here. They may override the values set\n  // earlier for these variables.\n  backwards_compat_options.add_options()\n    (\"h-kernel\", po::value(&global.corr_kernel[0]), \"Correlation kernel width.\")\n    (\"v-kernel\", po::value(&global.corr_kernel[1]), \"Correlation kernel height.\")\n    (\"h-corr-min\", po::value(&global.search_range.min()[0]), \"Correlation window size min x.\")\n    (\"h-corr-max\", po::value(&global.search_range.max()[0]), \"Correlation window size max x.\")\n    (\"v-corr-min\", po::value(&global.search_range.min()[1]), \"Correlation window size min y.\")\n    (\"v-corr-max\", po::value(&global.search_range.max()[1]), \"Correlation window size max y.\");\n  (*this).add(backwards_compat_options);\n}\n\nSubpixelDescription::SubpixelDescription(): po::options_description(\"Subpixel options\") {\n\n  StereoSettings& global = stereo_settings();\n  (*this).add_options()\n    (\"subpixel-mode\", po::value(&global.subpixel_mode)->default_value(1),\n      \"Subpixel algorithm. [0 None, 1 Parabola, 2 Bayes EM, 3 Affine, \"\n      \"4 Phase Correlation 5 LK, 7 SGM None 8 SGM Linear, 9 SGM Poly4, \"\n      \"10 SGM Cos, 11 SGM Parabola 12 SGM Blend]\")\n    (\"subpix-from-blend\", po::bool_switch(&global.subpix_from_blend)->default_value(false)->implicit_value(true),\n      \"For the input to subpixel, use the -B.tif file instead of the -D.tif file.\")\n    (\"subpixel-kernel\", po::value(&global.subpixel_kernel)->default_value(Vector2i(35,35), \"35 35\"),\n      \"Kernel size used for subpixel method.\")\n    (\"disable-h-subpixel\", po::bool_switch(&global.disable_h_subpixel)->default_value(false)->implicit_value(true),\n      \"Disable calculation of subpixel in horizontal direction.\")\n    (\"disable-v-subpixel\", po::bool_switch(&global.disable_v_subpixel)->default_value(false)->implicit_value(true),\n      \"Disable calculation of subpixel in vertical direction.\")\n    (\"subpixel-max-levels\", po::value(&global.subpixel_max_levels)->default_value(2),\n      \"Max pyramid levels to process when using the BayesEM refinement. (0 is just a single level).\")\n    (\"phase-subpixel-accuracy\", po::value(&global.phase_subpixel_accuracy)->default_value(20),\n      \"Accuracy to use for mode 4 phase subpixel.  Resolution is 1/this.  Larger values take more time.\");\n\n\n  po::options_description backwards_compat_options(\"Aliased backwards compatibility options\");\n  backwards_compat_options.add_options()\n    (\"subpixel-h-kernel\", po::value(&global.subpixel_kernel[0]), \"Subpixel kernel width.\")\n    (\"subpixel-v-kernel\", po::value(&global.subpixel_kernel[1]), \"Subpixel kernel height.\");\n  (*this).add(backwards_compat_options);\n}\n\nFilteringDescription::FilteringDescription(): po::options_description(\"Filtering options\") {\n  StereoSettings& global = stereo_settings();\n  (*this).add_options()\n    (\"filter-mode\", po::value(&global.filter_mode)->default_value(1),\n      \"Disparity filter mode. [0 None, 1 Use mean difference to neighbors (invalidates fewer pixels), 2 Use thresholds (invalidates more pixels)]\")\n    (\"rm-half-kernel\", po::value(&global.rm_half_kernel)->default_value(Vector2i(5,5), \"5 5\"),\n      \"Low confidence pixel removal kernel (half sized).\")\n    (\"max-mean-diff\", po::value(&global.max_mean_diff)->default_value(3),\n      \"Maximum difference between current pixel disparity and mean disparity of neighbors to still keep current disparity (for filter mode 1).\")\n    (\"rm-min-matches\", po::value(&global.rm_min_matches)->default_value(60),\n      \"Minimum number of pixels to be matched to keep sample (for filter mode 2).\")\n    (\"rm-threshold\", po::value(&global.rm_threshold)->default_value(3),\n      \"Maximum distance between samples to be considered still matched (for filter mode 2).\")\n    (\"rm-cleanup-passes\", po::value(&global.rm_cleanup_passes)->default_value(1),\n      \"Number of passes for cleanup during the post-processing phase.\")\n    (\"enable-fill-holes\", po::bool_switch(&global.enable_fill_holes)->default_value(false)->implicit_value(true),\n      \"Enable filling of holes in disparity using an inpainting method. Obsolete. It is suggested to use instead point2dem's analogous functionality.\")\n    (\"disable-fill-holes\", po::bool_switch(&global.disable_fill_holes)->default_value(false)->implicit_value(true),\n      \"Disable filling of holes using an inpainting method. Ignored and obsolete. To be removed in future versions of the software.\")\n    (\"fill-holes-max-size\", po::value(&global.fill_hole_max_size)->default_value(100000),\n      \"Holes with no more pixels than this number should be filled in.\")\n    (\"edge-buffer-size\", po::value(&global.edge_buffer_size)->default_value(-1),\n      \"Crop to be applied around image borders during filtering. If not set, and \"\n      \"subpixel-mode is between 1 and 6 (inclusive), use the max of two subpixel-kernel \"\n      \"values. Otherwise set to 5.\")\n    (\"erode-max-size\", po::value(&global.erode_max_size)->default_value(0),\n      \"Isolated blobs with no more pixels than this number should be removed.\")\n    (\"median-filter-size\", po::value(&global.median_filter_size)->default_value(0),\n      \"Filter subpixel results with a median filter of this size. Can only be used with texture smoothing.\")\n    (\"texture-smooth-size\", po::value(&global.disp_smooth_size)->default_value(0),\n      \"Kernel size to perform texture aware disparity smoothing with. Can only be used with median smoothing.\")\n    (\"texture-smooth-scale\", po::value(&global.disp_smooth_texture)->default_value(0.15),\n      \"Scaling factor for texture smoothing.  Larger is more smoothing.\")\n    (\"gotcha-disparity-refinement\", po::bool_switch(&global.gotcha_disparity_refinement)->default_value(false)->implicit_value(true),\n      \"Turn on the experimental Gotcha disparity refinement. It refines and overwrites F.tif. See the option 'casp-go-param-file' for customizing its behavior.\")\n    (\"casp-go-param-file\", po::value(&global.casp_go_param_file)->default_value(\"\"),\n      \"The parameter file to use with Gotcha (and in the future other CASP-GO functionality) when invoking the 'gotcha-disparity-refinement' option. The default is to use the file 'share/CASP-GO_params.xml' shipped with ASP.\")\n    ;\n\n  po::options_description backwards_compat_options(\"Aliased backwards compatibility options\");\n  // Do not add default values here. They may override the values set\n  // earlier for these variables.\n  backwards_compat_options.add_options()\n    (\"rm-h-half-kern\", po::value(&global.rm_half_kernel[0]), \"Filter kernel half width.\")\n    (\"rm-v-half-kern\", po::value(&global.rm_half_kernel[1]), \"Filter kernel half height.\");\n  (*this).add(backwards_compat_options);\n}\n\nTriangulationDescription::TriangulationDescription():\n  po::options_description(\"Triangulation options\") {\n\n  StereoSettings& global = stereo_settings();\n  (*this).add_options()\n    (\"universe-center\", po::value(&global.universe_center)->default_value(\"None\"),\n      \"Center from which to measure the universe radius for the purpose of removing outliers. [Camera, Zero (planet center), None]\")\n    (\"near-universe-radius\", po::value(&global.near_universe_radius)->default_value(0.0),\n      \"Radius of inner boundary of universe in meters (remove points with radius smaller than that).\")\n    (\"far-universe-radius\", po::value(&global.far_universe_radius)->default_value(0.0),\n      \"Radius of outer boundary of universe in meters (remove points with radius larger than that).\")\n    (\"min-triangulation-angle\", po::value(&global.min_triangulation_angle)->default_value(-1.0),\n      \"The minimum angle, in degrees, at which rays must meet at a triangulated point to accept this point as valid. It must be positive. The internal default is somewhat less than 1 degree.\")\n  (\"max-valid-triangulation-error\",\n    po::value(&global.max_valid_triangulation_error)->default_value(0),\n      \"If positive, points with triangulation error larger than this will be removed from the cloud. Measured in meters.\")\n    (\"bundle-adjust-prefix\", po::value(&global.bundle_adjust_prefix),\n      \"Use the camera adjustments obtained by previously running bundle_adjust with this output prefix.\")\n    (\"propagate-errors\", po::bool_switch(&global.propagate_errors)->default_value(false)->implicit_value(true),\n      \"Propagate the errors from the input cameras to the triangulated point cloud.\")\n    (\"horizontal-stddev\",\n     po::value(&global.horizontal_stddev)->default_value(Vector2(0, 0), \"0 0\"),\n     \"If positive, propagate these left and right camera horizontal ground plane stddev through triangulation. To be used with --propagate-errors.\")\n\n    (\"position-covariance-factor\", po::value(&global.position_covariance_factor)->default_value(1.0),\n      \"Multiply the satellite position covariances by this number before propagating them to the triangulated point cloud. Applicable only to Maxar(DigitalGlobe) linescan cameras.\")\n    (\"orientation-covariance-factor\", po::value(&global.orientation_covariance_factor)->default_value(1.0),\n      \"Multiply the satellite quaternion covariances by this number before propagating them to the triangulated point cloud. Applicable only to Maxar(DigitalGlobe) linescan cameras.\")\n\n    (\"unalign-disparity\", po::bool_switch(&global.unalign_disparity)->default_value(false)->implicit_value(true),\n      \"Take the computed disparity, and compute the disparity between unaligned images.\")\n    (\"num-matches-from-disparity\", po::value(&global.num_matches_from_disparity)->default_value(0), \"Create a match file with this many points uniformly sampled from the stereo disparity. The matches are between original images (that is, before any alignment or map-projection). See also num-matches-from-disp-triplets.\")\n    (\"num-matches-from-disp-triplets\", po::value(&global.num_matches_from_disp_triplets)->default_value(0),\n      \"Create a match file with this many points uniformly sampled from the stereo \"\n      \"disparity, while making sure that if there are more than two images, a set of ground \"\n      \"features are represented by matches in at least three of them. See the documentation \"\n      \"for more info.\")\n    (\"point-cloud-rounding-error\",\n      po::value(&global.point_cloud_rounding_error)->default_value(0.0),\n      \"How much to round the output point cloud values, in meters (more rounding means less precision but potentially smaller size on disk). The inverse of a power of 2 is suggested. Default: 1/2^10 for Earth and proportionally less for smaller bodies, unless error propagation happens, when it is set by default to 1e-8 meters, to avoid introducing step artifacts in these errors.\")\n    (\"save-double-precision-point-cloud\", po::bool_switch(&global.save_double_precision_point_cloud)->default_value(false)->implicit_value(true),\n      \"Save the final point cloud in double precision rather than bringing the points closer to origin and saving as float (marginally more precision at twice the storage).\")\n\n    (\"compute-point-cloud-center-only\", po::bool_switch(&global.compute_point_cloud_center_only)->default_value(false)->implicit_value(true),\n      \"Only compute the center of triangulated point cloud and exit.\")\n    (\"skip-point-cloud-center-comp\", po::bool_switch(&global.skip_point_cloud_center_comp)->default_value(false)->implicit_value(true),\n      \"Skip the computation of the point cloud center. This option is invoked from parallel_stereo.\")\n    (\"compute-error-vector\", po::bool_switch(&global.compute_error_vector)->default_value(false)->implicit_value(true),\n      \"Compute the triangulation error vector, not just its length.\")\n    (\"enable-atmospheric-refraction-correction\",\n      po::bool_switch(&global.enable_atmospheric_refraction_correction)->default_value(false)->implicit_value(true),\n      \"Enable atmospheric refraction correction for Pleiades linescan cameras. By default, \"\n      \"such a correction is enabled only for WorldView linescan cameras.\")\n    (\"enable-velocity-aberration-correction\",\n      po::bool_switch(&global.enable_velocity_aberration_correction)->default_value(false)->implicit_value(true),\n      \"Enable velocity aberration correction for Pleiades linescan cameras. By default, \"\n      \"such a correction is enabled only for WorldView linescan cameras.\")\n    ;\n}\n\nGUIDescription::GUIDescription(): po::options_description(\"GUI options\") {\n  StereoSettings& global = stereo_settings();\n  (*this).add_options()\n    (\"grid-cols\", po::value(&global.grid_cols)->default_value(std::numeric_limits<int>::max()),\n      \"Display images as tiles on a grid with this many columns. Default: Use one row.\")\n    (\"window-size\", po::value(&global.window_size)->default_value(Vector2i(1200,800),\"1200 800\"),\n      \"The width and height of the GUI window in pixels.\")\n    (\"single-window,w\", po::bool_switch(&global.single_window)->default_value(false)->implicit_value(true),\n      \"Show all images in the same window (with a dialog to choose among them) rather than next to each other.\")\n    (\"view-several-side-by-side\", po::bool_switch(&global.view_several_side_by_side)->default_value(false)->implicit_value(true),\n      \"View several images side-by-side, with a dialog to choose which images to show.\")\n    (\"use-georef,g\", po::bool_switch(&global.use_georef)->default_value(false)->implicit_value(true),\n      \"Plot the images in the projected coordinate system given by the georeference of the images.\")\n    (\"hillshade\", po::bool_switch(&global.hillshade)->default_value(false)->implicit_value(true),\n      \"Interpret the input images as DEMs and hillshade them.\")\n\n    (\"hillshade-azimuth\", po::value(&global.hillshade_azimuth)->default_value(300),\n      \"The azimuth value when showing hillshaded images.\")\n    (\"hillshade-elevation\", po::value(&global.hillshade_elevation)->default_value(20),\n      \"The elevation value when showing hillshaded images.\")\n    (\"lowest-resolution-subimage-num-pixels\", po::value(&global.lowest_resolution_subimage_num_pixels)->default_value(-1),\n      \"When building a pyramid of lower-resolution versions of an image, the coarsest image will have no more than this many pixels. If not set, it will internally default to 1000 x 1000. This is increased to 10000 x 10000 when loading .nvm files or with the --preview option.\")\n    (\"view-matches\", po::bool_switch(&global.view_matches)->default_value(false)->implicit_value(true),\n      \"Locate and display the interest point matches for a stereo pair.\")\n    (\"match-file\", po::value(&global.match_file)->default_value(\"\"),\n      \"Display this match file instead of looking one up based on existing conventions (implies --view-matches).\")\n    (\"gcp-file\", po::value(&global.gcp_file)->default_value(\"\"),\n      \"Display the GCP pixel coordinates for this GCP file (implies --view-matches).\")\n    (\"gcp-sigma\", po::value(&global.gcp_sigma)->default_value(1.0),\n      \"The sigma (uncertainty, in meters) to use for the GCPs. A smaller sigma suggests \"\n      \"a more accurate GCP. See also option --fix-gcp-xyz in bundle adjustment.\")\n    (\"dem-file\", po::value(&global.dem_file)->default_value(\"\"),\n      \"Use this DEM when creating GCP from images.\")\n      (\"hide-all\", po::bool_switch(&global.hide_all)->default_value(false)->implicit_value(true),\n      \"Start with all images turned off (if all images are in the same window, useful with a large number of images).\")\n    (\"delete-temporary-files-on-exit\", po::bool_switch(&global.delete_temporary_files_on_exit)->default_value(false)->implicit_value(true),\n      \"Delete any subsampled and other files created by the GUI when exiting.\")\n    (\"create-image-pyramids-only\", po::bool_switch(&global.create_image_pyramids_only)->default_value(false)->implicit_value(true),\n      \"Without starting the GUI, build multi-resolution pyramids for the inputs, to be able to load them fast later.\")\n    (\"pairwise-matches\", po::bool_switch(&global.pairwise_matches)->default_value(false)->implicit_value(true), \"Show images side-by-side. If just two of them are selected, load their corresponding match file, determined by the output prefix. Also accessible from the menu.\")\n    (\"pairwise-clean-matches\", po::bool_switch(&global.pairwise_clean_matches)->default_value(false)->implicit_value(true), \"Same as --pairwise-matches, but use *-clean.match files.\")\n    (\"nvm\", po::value(&global.nvm)->default_value(\"\"),\n      \"Load this .nvm file having interest point matches. See also --nvm-no-shift. \"\n      \"The rig_calibrator program can create such files. This option implies \"\n      \"--pairwise-matches, --preview, and a larger value of \"\n      \"--lowest-resolution-subimage-num-pixels.\")\n    (\"nvm-no-shift\", po::bool_switch(&global.nvm_no_shift)->default_value(false)->implicit_value(true),\n      \"Assume that the image features in the input nvm file were saved without \"\n      \"being shifted to be relative to the optical center of the camera.\")\n    (\"isis-cnet\", po::value(&global.isis_cnet)->default_value(\"\"),\n      \"Load a control network having interest point matches from this binary file \"\n      \"in the ISIS jigsaw format. See also --nvm.\")\n    (\"zoom-proj-win\", po::value(&global.zoom_proj_win)->default_value(BBox2(0,0,0,0), \"\"),\n      \"Zoom to this proj win on startup. It is assumed that the images are georeferenced. Also accessible from the View menu. This implies --zoom-all-to-same-region.\")\n    (\"zoom-all-to-same-region\",\n     po::bool_switch(&global.zoom_all_to_same_region)->default_value(false)->implicit_value(true),\n     \"Zoom all images to same region. Also accessible from the View menu.\")\n    (\"csv-format\", po::value(&global.csv_format_str)->default_value(\"\"), asp::csv_opt_caption().c_str())\n    (\"csv-srs\", po::value(&global.csv_srs)->default_value(\"\"), \"The PROJ or WKT string to use to interpret the entries in a CSV file. If not specified, try to use the --datum option.\")\n    (\"csv-datum\", po::value(&global.csv_datum)->default_value(\"\"), \"The datum to use when plotting a CSV file.\")\n    (\"preview\", po::bool_switch(&global.preview)->default_value(false)->implicit_value(true),\n      \"Load and display the images one at a time. The 'n' and 'p' keys can be used to cycle through them.\")\n    (\"min\", po::value(&global.min)->default_value(g_nan_val),\n      \"Value corresponding to 'coldest' color in the color map, when \"\n      \"using --colorize or --colorbar, and plotting CSV data. Also used \"\n      \"to manually set the minimum value in grayscale images. If not set, \"\n      \"use the dataset minimum for color images, and estimate the minimum \"\n      \"for grayscale images.\")\n    (\"max\", po::value(&global.max)->default_value(g_nan_val),\n      \"Value corresponding to the 'hottest' color in the color map, when \"\n      \"using --colorize or --colorbar, and plotting CSV data. Also used \"\n      \"to manually set the maximum value in grayscale images. If not set, \"\n      \"use the dataset maximum for color images, and estimate the maximum \"\n      \"for grayscale images.\")\n    (\"plot-point-radius\", po::value(&global.plot_point_radius)->default_value(2),\n      \"When plotting points from CSV files, let each point be drawn as a filled ball with this radius, in pixels.\")\n    (\"font-size\", po::value(&global.font_size)->default_value(9),\n      \"Set the font size.\")\n    (\"no-georef\",\n      po::bool_switch(&global.no_georef)->default_value(false)->implicit_value(true),\n      \"Do not use georeference information when displaying the data, even when it exists.\")\n      ;\n}\n\n// Options for stereo_parse\nParseDescription::ParseDescription(): po::options_description(\"stereo_parse options\") {\n  StereoSettings& global = stereo_settings();\n  (*this).add_options()\n  (\"parallel-tile-size\",\n    po::value(&global.parallel_tile_size)->default_value(Vector2i(0,0),\"0 0\"),\n    \"Create tiles with these dimensions that are needed for parallel_stereo. Skip the \"\n    \"tiles that, after being padded, do not contain valid disparities.\")\n  (\"stereo-dist-tile-params\",\n    po::value(&global.stereo_dist_tile_params)->default_value(Vector2i(0,0),\"0 0\"),\n    \"Create the list of tiles with padding, in left image pixel units, that cover the \"\n    \"region of overlap of left and right mapprojected images. Specify as two positive \"\n    \"integers, having the tile size and padding, without quotes. Square tiles are \"\n    \"assumed. The tile size is without taking into account the padding. For use with the \"\n    \"stereo_dist distributed processing program. The list will be written to <output \"\n    \"prefix>-distTileList.txt.\")\n  (\"tile-at-location\", po::value(&global.tile_at_loc)->default_value(\"\"),\n    \"Find the tile in the current parallel_stereo run which generated the DEM portion \"\n    \"having this lon-lat-height location. Specify as a string in quotes: 'lon lat \"\n    \"height'. Use this option with stereo_parse and the rest of options used in \"\n    \"parallel_stereo, including cameras, output prefix, etc. (except for those needed for \"\n    \"tiling and parallelization). This does not work with mapprojected images.\")\n  ;\n}\n\n// Options for parallel_stereo. These are not used by the stereo\n// executables, but accept them quietly so that when stereo_gui or\n// stereo_parse is invoked with a parallel_stereo command it would\n// not fail. Later, if parallel_stereo is invoked from stereo_gui,\n// these will be passed on.\nParallelDescription::ParallelDescription(): po::options_description(\"parallel_stereo options\") {\n  StereoSettings& global = stereo_settings();\n  (*this).add_options()\n    (\"nodes-list\", po::value(&global.nodes_list)->default_value(\"\"),\n      \"The list of computing nodes, one per line. If not provided, run on the local machine.\")\n    (\"ssh\", po::value(&global.ssh)->default_value(\"\"),\n      \"Specify the path to an alternate version of the ssh tool to use.\")\n    (\"processes\", po::value(&global.processes)->default_value(-1),\n      \"The number of processes to use per node.\")\n    (\"threads-multiprocess\", po::value(&global.threads_multi)->default_value(-1),\n      \"The number of threads to use per process when running multiple processes.\")\n    (\"threads-singleprocess\",po::value(&global.threads_single)->default_value(-1),\n      \"The number of threads to use when running a single process (stereo_pprc and stereo_fltr).\")\n    (\"entry-point,e\", po::value(&global.entry_point)->default_value(0),\n      \"Stereo Pipeline entry point (an integer from 0-5).\")\n    (\"stop-point\", po::value(&global.stop_point)->default_value(6),\n      \"Stereo Pipeline stop point (an integer from 1-6). Stop before this step.\")\n    (\"job-size-w\", po::value(&global.job_size_w)->default_value(2048),\n      \"Pixel width of input image tile for a single process.\")\n    (\"job-size-h\", po::value(&global.job_size_h)->default_value(2048),\n      \"Pixel height of input image tile for a single process.\")\n    (\"sparse-disp-options\", po::value(&global.sparse_disp_options)->default_value(\"\"),\n      \"Options to pass directly to sparse_disp. Use quotes around this string.\")\n    (\"prev-run-prefix\", po::value(&global.prev_run_prefix)->default_value(\"\"),\n      \"Start at the triangulation stage while reusing the data from this prefix.\")\n    (\"parallel-options\", po::value(&global.parallel_options)->default_value(\"\"),\n      \"Options to pass directly to GNU Parallel. Use quotes around this string.\");\n}\n\nUndocOptsDescription::UndocOptsDescription():\n  po::options_description(\"Undocumented options\") {\n  StereoSettings& global = stereo_settings();\n  (*this).add_options()\n    (\"trans-crop-win\", po::value(&global.trans_crop_win)->default_value(BBox2i(0, 0, 0, 0), \"xoff yoff xsize ysize\"), \"Left image crop window in respect to L.tif. This is an internal option. [default: use the entire image].\")\n    (\"attach-georeference-to-lowres-disparity\", po::bool_switch(&global.attach_georeference_to_lowres_disparity)->default_value(false)->implicit_value(true),\n      \"If input images are georeferenced, make D_sub and D_sub_spread georeferenced.\");\n}\n\n// This handles options which are not in stereo_settings(), but\n// rather in 'opt'. So they are not config options set in\n// stereo.default but only command-line options.\nvoid addAspGlobalOptions(boost::program_options::options_description & description,\n                          ASPGlobalOptions & opt) {\n  description.add_options()\n    (\"session-type,t\", po::value(&opt.stereo_session),\n      \"Select the stereo session type to use for processing. \"\n      \"Usually the program can select this automatically by the file extension, \"\n      \"except for XML cameras. See the doc for options.\")\n    (\"stereo-file,s\", po::value(&opt.stereo_default_filename)->default_value(\"./stereo.default\"),\n      \"Explicitly specify the stereo.default file to use.\");\n}\n\npo::options_description generate_config_file_options(vw::GdalWriteOptions& opt) {\n\n  po::options_description cfg_options;\n  cfg_options.add(vw::GdalWriteOptionsDescription(opt));\n  cfg_options.add(PreProcessingDescription());\n  cfg_options.add(CorrelationDescription());\n  cfg_options.add(SubpixelDescription());\n  cfg_options.add(FilteringDescription());\n  cfg_options.add(TriangulationDescription());\n  cfg_options.add(GUIDescription());\n  cfg_options.add(ParseDescription());\n  cfg_options.add(ParallelDescription());\n  cfg_options.add(UndocOptsDescription());\n\n  return cfg_options;\n}\n\n// TODO(oalexan1): More settings from validateStereoOptions() that only need\n// stereo_settings() should be validated here.\nvoid StereoSettings::validate() {\n  using namespace boost::algorithm;\n\n  to_lower(alignment_method);\n  trim(alignment_method);\n  VW_ASSERT(alignment_method == \"none\"       || alignment_method == \"homography\" ||\n              alignment_method == \"epipolar\" || alignment_method == \"affineepipolar\" ||\n              alignment_method == \"local_epipolar\",\n              ArgumentErr() << \"\\\"\" <<  alignment_method\n              << \"\\\" is not a valid option for alignment-method.\");\n\n  to_lower(universe_center);\n  trim(universe_center);\n  VW_ASSERT(universe_center == \"camera\" || universe_center == \"zero\" ||\n              universe_center == \"none\",\n              ArgumentErr() << \"\\\"\" << universe_center\n              << \"\\\" is not a valid option for universe_center.\");\n\n  // Must have not have both ip per image and ip per tile set\n  if (asp::stereo_settings().ip_per_image > 0 &&\n      asp::stereo_settings().ip_per_tile > 0)\n    vw::vw_throw(vw::ArgumentErr()\n      << \"Cannot set both --ip-per-image and --ip-per-tile.\\n\");\n}\n\nvoid StereoSettings::write_copy(int argc, char *argv[],\n                                std::string const& input_file,\n                                std::string const& output_file) const {\n\n  std::ifstream in(input_file.c_str());\n  std::ofstream out(output_file.c_str());\n\n  // Write some log information\n  out << \"# ASP stereo configuration copy\" << \"\\n\";\n  out << \"# \" << current_posix_time_string() << \"\\n\";\n  out << \"# > \";\n  for (int i = 0; i < argc; i++) {\n    if (i)\n      out << \" \";\n    out << std::string(argv[i]);\n  }\n  out << \"\\n\\n\";\n\n  out << in.rdbuf();\n  in.close();\n  out.close();\n}\n\nbool StereoSettings::is_search_defined() const {\n  return !(search_range.min() == Vector2() && search_range.max() == Vector2());\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Core/StereoSettings.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file StereoSettings.h\n/// This a class with minimal dependencies having stereo setings that is\n/// included in many places. \n\n#ifndef __ASP_CORE_STEREO_SETTINGS_H__\n#define __ASP_CORE_STEREO_SETTINGS_H__\n\n#include <vw/FileIO/GdalWriteOptions.h>\n\nnamespace asp {\n\n  class StereoSession; // Forward declaration\n\n  /// 'Global scoped' variables\n  struct ASPGlobalOptions: vw::GdalWriteOptions {\n    // Input\n    std::string in_file1, in_file2, cam_file1, cam_file2, input_dem,\n    extra_argument1, extra_argument2, extra_argument3;\n\n    // Settings\n    std::string stereo_session, stereo_default_filename;\n    boost::shared_ptr<asp::StereoSession> session; // Used to extract cameras\n    // Output\n    std::string out_prefix;\n\n    // Constants\n    static int corr_tile_size() { return 1024; } // Tile size for correlation\n    static int rfne_tile_size() { return 256;  } // Tile size for refinement\n    static int tri_tile_size() { return 256;  } // Tile size for tri/point cloud\n  };\n\n  /// Structure holding variables\n  class StereoSettings {\n  public:\n    StereoSettings();\n    void initialize(vw::GdalWriteOptions& opt);\n    void validate();\n    void write_copy(int argc, char *argv[],\n                    std::string const& input_file,\n                    std::string const& output_file) const;\n    bool is_search_defined() const;\n\n    // ----------------\n    // Public variables\n    // ----------------\n\n    // Preprocessing options\n    std::string alignment_method;           /// Valid options are: [Homography, Epipolar, None]\n\n    // Note: Below we use BBox2 rather than BBox2i to not choke on float inputs.\n    // Do stereo in given regions only.\n    vw::BBox2 left_image_crop_win;\n    vw::BBox2 right_image_crop_win;\n    vw::BBox2 proj_win;  // Limit stereo to this projwin (for mapprojected images only)\n\n    // Data for use with bathymetry\n    std::string left_bathy_mask, right_bathy_mask, bathy_mask_list;\n    std::string bathy_plane, bathy_plane_list, output_cloud_type;\n    double refraction_index;\n\n    bool   force_use_entire_range;          /// Use entire dynamic range of image\n    bool   individually_normalize;          /// If > 1, normalize the images\n                                            ///         individually with their\n                                            ///         own hi's and lo's\n    int   ip_per_tile;                      ///< How many ip to find in each 1024^2 tile\n    int   ip_per_image;                     ///< How many ip to find in each image\n    int   matches_per_tile;                 ///< How many ip matches to find in each 1024^2 tile\n    int   ip_detect_method;                 ///< Method used for matching interest points\n                                            /// 0 = Zack's integral Obalog method\n                                            /// 1 = OpenCV SIFT method\n                                            /// 2 = OpenCV ORB method\n    double epipolar_threshold;              /// Max distance from epipolar line to search for IP matches.\n    double ip_inlier_factor;                /// General scaling factor for IP finding, a larger value allows more IPs to match.\n    double ip_uniqueness_thresh;            /// Min percentage distance between closest and second closest IP descriptors.\n    double ip_nodata_radius;                /// Remove IP near nodata with this radius, in pixels.\n    double ip_triangulation_max_error;      ///< Remove IP matches with triangulation error higher than this.\n    int    ip_num_ransac_iterations;        ///< How many ransac iterations to do in ip matching.\n    bool   disable_tri_filtering;           ///< Turn of tri-ip filtering.\n\n    int num_scales;                         /// How many scales to use if detecting interest points with OBALoG. If not specified, 8 will be used.\n    int    ip_edge_buffer_percent;          ///< When detecting IP, throw out points within this many % of pixels\n                                            ///  of the left/right edges of the images being matched.\n    bool   ip_normalize_tiles;              ///< Individually normalize tiles for IP detection.\n    std::string dem;                        ///< Input DEM for map-projected images\n    bool   matches_as_txt;                  ///< Read and write match files as plain text\n    bool   ip_debug_images;                 ///< Write debug interest point images.\n\n    double nodata_value;                    ///< Pixels with values less than or equal to this number are treated as no-data.\n                                            //  This overrides the nodata values from input images.\n    double nodata_stddev_thresh;            ///\n    int    nodata_stddev_kernel;            ///< Kernel size of the nodata stddev calculation\n    bool   skip_rough_homography;           ///< Use this if datum-based rough homography fails.\n    bool   no_datum;                        ///< Do not assume a reliable datum exists\n    bool   skip_image_normalization;        ///< Skip the step of normalizing the values of input images and removing nodata-pixels. Create instead symbolic links to original images.\n    bool   force_reuse_match_files;         ///< Force reusing the match files even if older than the images or cameras\n    bool   part_of_multiview_run;           ///< If this run is part of a larger multiview run\n    std::string datum;                      ///< The datum to use with RPC camera models\n    std::string match_files_prefix, clean_match_files_prefix; // Load matches from here\n    std::string left_image_clip, right_image_clip;\n    double global_alignment_threshold;        /// Max distance from the epipolar line when doing global affine epipolar alignment\n    double local_alignment_threshold;         /// Max distance from the epipolar line when doing local affine epipolar alignment\n    int    alignment_num_ransac_iterations;   ///< How many ransac iterations to do in global or local epipolar alignment transform computation\n    vw::Vector2 outlier_removal_params;\n    vw::Vector2i matches_per_tile_params;\n    int band;\n    bool allow_different_mapproject_gsd;\n    vw::Vector2 ortho_heights;\n    std::string output_prefix_override; // override the output prefix with this \n    std::string flann_method; // The method to use for FLANN matching\n\n    bool accept_provided_mapproj_dem;\n    bool stop_after_stats;   // Stop after computing stereo stats\n    bool stereo_dist_mode;   // Distributed stereo mode\n\n    // Correlation options\n    float slogW;                      ///< Preprocessing filter width\n    vw::uint16 pre_filter_mode;       // 0 = None\n                                      // 1 = Gaussian Blur\n                                      // 2 = Log Filter\n\n    vw::uint16  seed_mode;            // 0 = None, use global search for each tile\n                                      // 1 = Use low-res disparity from stereo\n                                      // 2 = Use low-res disparity from provided DEM\n                                      //     (see disparity-estimation-dem)\n                                      // 3 = Use low-res disparity produced by sparse_disp\n                                      //     (in development)\n\n    int   min_num_ip;                 ///< Minimum number of IP's needed for search range estimation.\n\n    float seed_percent_pad;           ///< Pad amount towards the IP found\n    float disparity_range_expansion_percent; ///< Expand the estimated disparity range by this percentage before computing the stereo correlation with local alignment\n\n    vw::uint16 cost_mode;             // 0 = absolute difference\n                                      // 1 = squared difference\n                                      // 2 = normalized cross correlation\n                                      // 3 = census transform\n                                      // 3 = ternary census transform\n    float        xcorr_threshold;     // L-R vs R-L agreement threshold in pixels\n    int          min_xcorr_level;     // Min level to perform xcorr check at, if specified.\n    bool         save_lr_disp_diff;   // Save the L-R and R-L disparity difference\n    vw::Vector2i corr_kernel;         // Correlation kernel\n    vw::BBox2    search_range;        // Correlation search range\n    vw::BBox2    corr_search_limit;   // Correlation search range limit\n    std::string  ip_filter_using_dem; // Filter using given DEM and height difference\n    vw::Vector2  elevation_limit;     // Expected range of elevation to limit results to.\n    vw::BBox2    lon_lat_limit;       // Limit the triangulated interest points to this lonlat range\n\n    int corr_max_levels;     // Max pyramid levels to process. 0 hits only once.\n    double max_disp_spread;    // Max disparity spread\n    bool compute_low_res_disparity_only;      // Skip the full-resolution disparity computation\n    bool skip_low_res_disparity_comp;\n    std::string disparity_estimation_dem;     // DEM to use in estimating the low-resolution disparity\n    double disparity_estimation_dem_error; // Error (in meters) of the disparity estimation DEM\n    int disparity_estimation_sample_rate;\n    int    corr_timeout;              // Correlation timeout for a tile, in seconds\n    int default_corr_timeout;         // Will be used to adjust corr_timeout\n    std::string stereo_algorithm;     // See StereoSettings.cc for the possible values.\n    int    corr_blob_filter_area;     // Use blob filtering in pyramidal correlation\n    int    corr_tile_size_ovr;        // Override the default tile size used for processing.\n    int    sgm_collar_size;           // Extra tile padding used for SGM calculation.\n    vw::Vector2i sgm_search_buffer;   // Search padding in SGM around previous pyramid level disparity value.\n    size_t corr_memory_limit_mb;      // Correlation memory limit, only important for SGM/MGM.\n    bool   correlator_mode;           // Use the correlation logic only (including subpixel rfne).\n    bool   stereo_debug;              // Write stereo debug images and messages\n    bool   local_alignment_debug;     // Debug local alignment\n\n    // Subpixel options\n\n    bool subpix_from_blend;           // Read from -B.tif instead of -D.tif\n\n    vw::uint16 subpixel_mode;         // 0 = none\n                                      // 1 = parabola fitting\n                                      // 2 = affine, bayes weighting\n                                      // 3 = affine\n                                      // 4 = Lucas-Kanade\n                                      // 5 = affine, bayes EM weighting\n    vw::Vector2i subpixel_kernel;     // Subpixel correlation kernel\n    bool disable_h_subpixel, disable_v_subpixel;\n    vw::uint16 subpixel_max_levels;   // Max pyramid levels to process. 0 hits only once.\n    vw::uint16 phase_subpixel_accuracy;  // Phase subpixel is accurate to 1/this pixels\n\n    // Filtering options\n    int filter_mode;                  // Which filter mode to use\n    vw::Vector2i rm_half_kernel;      // Low confidence pixel removal kernel size\n    int    max_mean_diff;             // Max mean diff between pixel and neighbors\n    int    rm_min_matches;            // Min # of pxl to be matched to keep pxl\n    double rm_threshold;              // rm_threshold < disp[n]-disp[m] reject pxl\n    double rm_quantile_percentile;    // For quantile based filtering, reject low-res correlation\n    double rm_quantile_multiple;      //   values >  multiple * quantile.\n    int    rm_cleanup_passes;         // Number of times to perform cleanup\n                                      // in the post-processing phase\n    int  erode_max_size;              // Max island size in pixels that it'll remove\n    bool enable_fill_holes;           // If to enable hole-filling\n    bool disable_fill_holes;          // This obsolete parameter is ignored\n    int  fill_hole_max_size;          // Maximum hole size in pixels that we'll attempt to fill\n    int   edge_buffer_size;           // Size of region filtered out of image edges.\n    int   median_filter_size;         // Filter subpixel results with median filter of this size\n    int   disp_smooth_size;           // Adaptive disparity smoothing size\n    double disp_smooth_texture;        // Adaptive disparity smoothing max texture value\n    bool  gotcha_disparity_refinement;\n    std::string casp_go_param_file;\n\n    // Triangulation options\n    std::string universe_center;      // Center for the radius clipping\n    float  near_universe_radius;      // Radius of the universe in meters\n    float  far_universe_radius;       // Radius of the universe in meters\n    std::string bundle_adjust_prefix; // Use the camera adjustments obtained by previously running bundle_adjust with the output prefix specified here.\n\n    // Pull this many matches from the stereo disparity\n    int num_matches_from_disparity, num_matches_from_disp_triplets;\n\n    // Error propagation options\n    bool propagate_errors;\n    vw::Vector2 horizontal_stddev;\n    double position_covariance_factor, orientation_covariance_factor;\n\n    bool compute_error_vector;              // Compute the triangulation error vector, not just its length\n\n    double min_triangulation_angle;           // min angle for valid triangulation\n    double max_valid_triangulation_error;\n    bool   save_double_precision_point_cloud; // Save final point cloud in double precision rather than bringing the points closer to origin and saving as float (marginally more precision at 2x the storage).\n    double point_cloud_rounding_error;        // How much to round the output point cloud values\n    bool   compute_point_cloud_center_only;   // Only compute the center of triangulated point cloud and exit.\n    bool   skip_point_cloud_center_comp;\n    bool   unalign_disparity;                 // Compute disparity between unaligned images\n    bool enable_atmospheric_refraction_correction;\n    bool enable_velocity_aberration_correction;\n    // stereo_gui options\n    int grid_cols;\n    vw::Vector2i window_size; // The size of the GUI window\n    bool single_window;\n    bool use_georef;\n    bool hillshade;\n    int lowest_resolution_subimage_num_pixels;\n    double hillshade_azimuth, hillshade_elevation, gcp_sigma;\n    bool view_matches, view_several_side_by_side, preview;\n    std::string match_file, gcp_file, dem_file, csv_datum, csv_format_str, csv_srs, nvm, isis_cnet;\n    bool delete_temporary_files_on_exit;\n    bool create_image_pyramids_only, hide_all, nvm_no_shift;\n    bool pairwise_matches, pairwise_clean_matches, no_georef, zoom_all_to_same_region;\n    std::vector<std::string> vwip_files;\n    vw::BBox2 zoom_proj_win;\n    double min, max;\n    int plot_point_radius, font_size;\n\n    // stereo_parse options\n    std::string tile_at_loc;\n    vw::Vector2i parallel_tile_size;\n    vw::Vector2i stereo_dist_tile_params;\n\n    // Options for parallel_stereo. These are not used, but accept\n    // them quietly so that when stereo_gui or stereo_parse is invoked\n    // with a parallel_stereo command it would not fail.\n    std::string nodes_list, ssh, sparse_disp_options, parallel_options, prev_run_prefix;\n    int threads_multi, threads_single, processes, entry_point, stop_point, job_size_h, job_size_w;\n\n    // Undocumented options. We don't want these exposed to the user.\n    vw::BBox2i trans_crop_win;        // Left image crop window in respect to L.tif.\n    bool attach_georeference_to_lowres_disparity;\n\n    // Internal variable, to ensure we always initialize this class before using it\n    bool initialized_stereo_settings;\n  };\n\n  /// Return the singleton instance of the stereo setting structure.\n  /// The stereo settings struct is created the first time this method\n  /// is invoked.  You must *always* access the stereo settings through this function.\n  StereoSettings& stereo_settings();\n}\n\n#endif //__ASP_CORE_STEREO_SETTINGS_H__\n"
  },
  {
    "path": "src/asp/Core/StereoSettingsDesc.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file StereoOptionsDesc.h\n\n/// Logic for stereo settings descriptions. This uses heavily boost program\n/// options.\n\n#ifndef __ASP_CORE_STEREO_OPTIONS_DESC_H__\n#define __ASP_CORE_STEREO_OPTIONS_DESC_H__\n\n#include <boost/program_options.hpp>\n#include <vw/FileIO/GdalWriteOptions.h>\n\nnamespace asp {\n\n  // Program options for each executable/step\n  struct PreProcessingDescription: public boost::program_options::options_description {\n    PreProcessingDescription();\n  };\n  struct CorrelationDescription: public boost::program_options::options_description {\n    CorrelationDescription();\n  };\n  struct SubpixelDescription: public boost::program_options::options_description {\n    SubpixelDescription();\n  };\n  struct FilteringDescription: public boost::program_options::options_description {\n    FilteringDescription();\n  };\n  struct TriangulationDescription: public boost::program_options::options_description {\n    TriangulationDescription();\n  };\n  struct GUIDescription: public boost::program_options::options_description {\n    GUIDescription();\n  };\n  struct ParseDescription: public boost::program_options::options_description {\n    ParseDescription();\n  };\n  struct ParallelDescription: public boost::program_options::options_description {\n    ParallelDescription();\n  };\n  struct UndocOptsDescription: public boost::program_options::options_description {\n    UndocOptsDescription();\n  };\n\n  boost::program_options::options_description\n  generate_config_file_options(vw::GdalWriteOptions& opt);\n\n  // This handles options which are not in stereo_settings(), but\n  // rather in 'opt'. So they are not config options set in\n  // stereo.default but only command-line options.\n  void addAspGlobalOptions(boost::program_options::options_description & description,\n                           ASPGlobalOptions & opt);\n\n\n}\n\n#endif//__ASP_CORE_STEREO_OPTIONS_DESC_H__\n"
  },
  {
    "path": "src/asp/Core/StereoSettingsParse.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file StereoSettingsParse.cc\n/// \n\n#include <asp/Core/StereoSettingsParse.h>\n\n#include <vw/Core/Log.h>\n\n#include <boost/program_options.hpp>\n#include <boost/algorithm/string.hpp>\n\n#include <fstream>\n#include <set>\n\nnamespace po = boost::program_options;\n\nnamespace asp {\n\n/// Custom readers for Boost program options\nclass asp_config_file_iterator: public boost::program_options::detail::common_config_file_iterator {\n  boost::shared_ptr<std::basic_istream<char> > is;\nprivate:\n  bool getline(std::string& s); // Used to precondition string before reading\npublic:\n  asp_config_file_iterator() {\n    found_eof();\n  }\n\n  // Creates a config file parser for the specified stream.\n  asp_config_file_iterator(std::basic_istream<char>& is,\n                            const std::set<std::string>& allowed_options,\n                            bool allow_unregistered = false);\n};\n\nbool asp_config_file_iterator::getline(std::string& s) {\n  std::string ws;\n\n  if (!std::getline(*is, ws, '\\n'))\n    return false;\n\n  // Remove any comments that might be one the line\n  size_t n = ws.find('#');\n  if (n != std::string::npos)\n    ws = ws.substr(0, n);\n\n  // Wipe any whitespace on either end\n  boost::trim(ws);\n\n  // Handle empty lines. Just pass them on through.\n  if (ws.empty()) {\n    s = ws;\n    return true;\n  }\n\n  // If there is not an equal sign, the first space is turned to\n  // equal, or it is just appended. Also, use lowercase for the key.\n  n = ws.find('=');\n  if (n  == std::string::npos) {\n    n = ws.find(' ');\n\n    if (n == std::string::npos) {\n      ws += \"=\";\n      boost::to_lower(ws);\n    } else {\n      ws[n] = '=';\n      std::string lowered_key = boost::to_lower_copy(ws.substr(0,n));\n      ws.replace(0, n, lowered_key);\n    }\n  } else {\n    std::string lowered_key = boost::to_lower_copy(ws.substr(0,n));\n    ws.replace(0, n, lowered_key);\n  }\n  s = ws;\n  return true;\n}\n\nasp_config_file_iterator::asp_config_file_iterator(\n  std::basic_istream<char>& is,\n  const std::set<std::string>& allowed_options,\n  bool allow_unregistered):\n    po::detail::common_config_file_iterator(allowed_options, allow_unregistered) {\n\n  this->is.reset(&is, po::detail::null_deleter());\n  get();\n}\n\n// Parse the ASP stereo config file, such as stereo.default, from an open handle.\npo::basic_parsed_options<char>\nparse_asp_config_file(std::basic_istream<char>& is, const po::options_description& desc,\n                      bool allow_unregistered) {\n\n  std::set<std::string> allowed_options;\n  auto & options = desc.options();\n  for (size_t i = 0; i < options.size(); ++i) {\n    const po::option_description& d = *options[i];\n\n    if (d.long_name().empty())\n      boost::throw_exception(po::error(\"long name required for config file\"));\n\n    allowed_options.insert(d.long_name());\n  }\n\n  // Parser return char strings\n  po::parsed_options parsed(&desc);\n  std::copy(asp_config_file_iterator(is, allowed_options, allow_unregistered),\n            asp_config_file_iterator(),\n            std::back_inserter(parsed.options));\n\n  // Convert char strings into desired type\n  return po::basic_parsed_options<char>(parsed);\n}\n\n// Parse the ASP stereo config file, such as stereo.default.\npo::basic_parsed_options<char>\nparse_asp_config_file(bool print_warning, std::string const& filename,\n                      const po::options_description& desc, bool allow_unregistered) {\n\n  std::basic_ifstream<char> strm(filename.c_str());\n  if (print_warning) {\n    if (!strm)\n      vw::vw_out() << \"Stereo file \" << filename << \" could not be found. \"\n                << \"Will use default settings and command line options only.\\n\";\n    else\n      vw::vw_out() << \"Loading stereo file: \" << filename << \"\\n\";\n  }\n\n  return parse_asp_config_file(strm, desc, allow_unregistered);\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Core/StereoSettingsParse.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file StereoSettingsParse.h\n/// Logic for parsing stereo config files.\n\n#ifndef __ASP_CORE_STEREO_SETTINGS_PARSE_H__\n#define __ASP_CORE_STEREO_SETTINGS_PARSE_H__\n\n#include <boost/program_options.hpp>\n#include <boost/program_options/detail/config_file.hpp>\n\nnamespace asp {\n\n  /// Custom parsers for ASP's stereo.default files\n  boost::program_options::basic_parsed_options<char>\n  parse_asp_config_file(std::basic_istream<char>&,\n                        const boost::program_options::options_description&,\n                        bool allow_unregistered = false);\n\n  boost::program_options::basic_parsed_options<char>\n  parse_asp_config_file(bool print_warning,\n                        std::string const&,\n                        const boost::program_options::options_description&,\n                        bool allow_unregistered = false);\n\n}\n\n#endif//__ASP_CORE_STEREO_SETTINGS_PARSE_H__\n"
  },
  {
    "path": "src/asp/Core/StereoTiling.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file StereoTiling.cc\n///\n\n#include <asp/Core/StereoTiling.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/DisparityProcessing.h>\n\n#include <vw/Cartography/GeoTransform.h>\n#include <vw/Cartography/GeoReferenceUtils.h>\n#include <vw/Cartography/shapeFile.h>\n\n#include <fstream>\n\nnamespace asp {\n\n// Append a tile to a given set of polygons\nvoid appendTileToPoly(int beg_x, int beg_y, int curr_tile_x, int curr_tile_y,\n                      bool is_map_projected,\n                      vw::cartography::GeoReference const& georef,\n                      vw::geometry::dPoly & poly,\n                      std::vector<int> & tile_id_vec,\n                      size_t tile_id) {\n\n  std::vector<double> x = {double(beg_x), double(beg_x + curr_tile_x),\n                           double(beg_x + curr_tile_x), double(beg_x)};\n  std::vector<double> y = {double(beg_y), double(beg_y),\n                           double(beg_y + curr_tile_y), double(beg_y + curr_tile_y)};\n\n  if (is_map_projected) {\n    // If the images are mapprojected, overwrite x and y with projected coordinates\n    std::vector<double> proj_x, proj_y;\n    for (size_t i = 0; i < x.size(); i++) {\n      vw::Vector2 pix_pt(x[i], y[i]);\n      vw::Vector2 proj_pt = georef.pixel_to_point(pix_pt);\n      proj_x.push_back(proj_pt[0]);\n      proj_y.push_back(proj_pt[1]);\n    }\n    x = proj_x;\n    y = proj_y;\n  } else {\n    // Only flip in y, to have the shapefiles agree with the images\n    for (size_t i = 0; i < x.size(); i++)\n      y[i] = -y[i];\n  }\n\n  // Follow the dPoly API\n  bool isPolyClosed = true;\n  std::string color = \"green\", layer = \"\";\n  poly.appendPolygon(x.size(), vw::geometry::vecPtr(x), vw::geometry::vecPtr(y),\n                     isPolyClosed, color, layer);\n\n  // This will be needed for QGIS\n  tile_id_vec.push_back(tile_id);\n}\n\n// Produce the list of tiles for parallel_stereo. If D_sub is available, write\n// only those tiles for which D_sub has valid values. Also save a shape file\n// with the tiles and the tile index for each tile, to be read in QGIS for\n// visualization.\nvoid produceTiles(bool is_map_projected,\n                  std::string const& output_prefix,\n                  vw::Vector2 const& trans_left_image_size,\n                  vw::Vector2i const& parallel_tile_size,\n                  int sgm_collar_size) {\n\n  if (trans_left_image_size == vw::Vector2(0, 0))\n      vw::vw_throw(vw::ArgumentErr() << \"Cannot produce tiles without a valid L.tif.\\n\");\n\n  // This georeference has at least the datum\n  vw::cartography::GeoReference georef;\n  // If is mapprojected, read the georef from L.tif, as that is what is used for tiling.\n  // This should handle correctly --left-image-crop-win as well.\n  if (is_map_projected) {\n    std::string left_image_file = output_prefix + \"-L.tif\";\n    bool has_georef = vw::cartography::read_georeference(georef, left_image_file);\n    if (!has_georef)\n      vw::vw_throw(vw::ArgumentErr() << \"L.tif has no georeference, cannot produce tiles.\\n\");\n  }\n  \n  // Will store here the tile structure for visualization. The API requires\n  // a vector of dPoly.\n  std::vector<vw::geometry::dPoly> polyVec(1);\n  vw::geometry::dPoly & poly = polyVec[0]; // alias\n  std::vector<int> tile_id_vec;\n  std::string fieldId = \"tile_id\"; // Will be used on reading in stereo_gui as well\n\n  // We check for valid D_sub only if seed_mode is not 0 and not part of a multiview\n  // run, as that one is tricky to get right, given that each pair run has its own D_sub.\n  bool have_D_sub = false;\n  std::string d_sub_file = output_prefix + \"-D_sub.tif\";\n  vw::ImageView<vw::PixelMask<vw::Vector2f>> sub_disp;\n  vw::Vector2 up_scale(0, 0);\n  bool is_multiview = stereo_settings().part_of_multiview_run;\n  if (stereo_settings().seed_mode != 0 && !is_multiview) {\n    have_D_sub = true; \n    try {\n      asp::load_D_sub_and_scale(output_prefix, d_sub_file, sub_disp, up_scale);\n    } catch (...) {\n      // Keep on going if we cannot load D_sub. In that case we cannot exclude\n      // the tiles with no data.\n      have_D_sub = false;\n    }\n  }\n\n  int tile_x = parallel_tile_size[0];\n  int tile_y = parallel_tile_size[1];\n  int tiles_nx = int(std::ceil(double(trans_left_image_size[0]) / tile_x));\n  int tiles_ny = int(std::ceil(double(trans_left_image_size[1]) / tile_y));\n\n  // Open the file for writing\n  std::string dirList = output_prefix + \"-dirList.txt\";\n  std::ofstream ofs(dirList.c_str()); \n\n  // Go over all tiles\n  size_t tile_id = 0;\n  for (int iy = 0; iy < tiles_ny; iy++) {\n    for (int ix = 0; ix < tiles_nx; ix++) {\n      \n      // Adjust for the tiles at the boundary\n      int curr_tile_x = tile_x;\n      int curr_tile_y = tile_y;\n      if (ix == tiles_nx - 1)\n        curr_tile_x = std::max(int(trans_left_image_size[0]) - ix * tile_x, 0);\n      if (iy == tiles_ny - 1)\n        curr_tile_y = std::max(int(trans_left_image_size[1]) - iy * tile_y, 0);\n        \n      int beg_x = ix * tile_x;\n      int beg_y = iy * tile_y;\n      \n      bool has_valid_vals = true;\n      if (have_D_sub) {\n        has_valid_vals = false;\n        int min_sub_x = std::floor((beg_x - sgm_collar_size) / up_scale[0]);\n        int min_sub_y = std::floor((beg_y - sgm_collar_size) / up_scale[1]);\n        int max_sub_x = std::ceil((beg_x + curr_tile_x + sgm_collar_size) / up_scale[0]);\n        int max_sub_y = std::ceil((beg_y + curr_tile_y + sgm_collar_size) / up_scale[1]);\n        \n        min_sub_x = std::max(min_sub_x, 0);\n        min_sub_y = std::max(min_sub_y, 0);\n        max_sub_x = std::min(max_sub_x, sub_disp.cols() - 1);\n        max_sub_y = std::min(max_sub_y, sub_disp.rows() - 1);\n      \n        for (int y = min_sub_y; y <= max_sub_y; y++) {\n          for (int x = min_sub_x; x <= max_sub_x; x++) {\n            if (is_valid(sub_disp(x, y))) {\n              has_valid_vals = true;\n              break;\n            }\n          }\n          if (has_valid_vals) \n            break;\n        } \n      }\n      \n      if (has_valid_vals) {\n        // Save the tile\n        ofs << output_prefix << \"-\" << beg_x << \"_\" << beg_y << \"_\" \n            << curr_tile_x << \"_\" << curr_tile_y << \"\\n\";\n            \n        // Append the tile to the shape file structure\n        appendTileToPoly(beg_x, beg_y, curr_tile_x, curr_tile_y,\n                         is_map_projected, georef, poly, tile_id_vec, tile_id);\n        tile_id++;\n      }\n    }\n  }\n  ofs.close();\n\n  // Save the shape file and qml file. Will save a georef only if the images are\n  // mapprojected. In that case the shapefile can be overlaid on top of L.tif.\n  std::string shapeFile = output_prefix + \"-tiles.shp\";\n  vw::vw_out() << \"Writing shape file: \" << shapeFile << \"\\n\";\n  vw::geometry::write_shapefile(shapeFile, is_map_projected, georef, polyVec,\n                                fieldId, tile_id_vec);\n  std::string qmlFile = output_prefix + \"-tiles.qml\"; // must match shapefile name\n  vw::vw_out() << \"Writing qml file: \" << qmlFile << \"\\n\";\n  vw::geometry::writeQml(qmlFile, fieldId);\n}\n\n// Produce the list of tiles covering the overlap region of two mapprojected images,\n// for use with stereo_dist. Write as a text file. Write a shapefile for visualization.\nvoid produceDistTileList(std::string const& in_file1,\n                         std::string const& in_file2,\n                         std::string const& output_prefix,\n                         vw::Vector2i const& stereo_dist_tile_params) {\n\n  int tile_size = stereo_dist_tile_params[0];\n  int tile_padding = stereo_dist_tile_params[1];\n\n  if (tile_size <= 0 || tile_padding <= 0)\n    vw::vw_throw(vw::ArgumentErr() << \"Tile size and padding must be positive.\\n\");\n\n  // Read georefs from both images\n  vw::cartography::GeoReference georef1, georef2;\n  bool has_georef1 = vw::cartography::read_georeference(georef1, in_file1);\n  bool has_georef2 = vw::cartography::read_georeference(georef2, in_file2);\n  if (!has_georef1)\n    vw::vw_throw(vw::ArgumentErr() << \"Missing georeference in: \" << in_file1 << \"\\n\");\n  if (!has_georef2)\n    vw::vw_throw(vw::ArgumentErr() << \"Missing georeference in: \" << in_file2 << \"\\n\");\n\n  // Form bounding boxes in pixel coordinates\n  vw::Vector2 dims1 = vw::file_image_size(in_file1);\n  vw::Vector2 dims2 = vw::file_image_size(in_file2);\n  vw::BBox2i bbox1_pix(0, 0, dims1[0], dims1[1]);\n  vw::BBox2i bbox2_pix(0, 0, dims2[0], dims2[1]);\n\n  // Form projected bounding box for image1 in its own projected coordinates\n  vw::BBox2 bbox1_proj = georef1.pixel_to_point_bbox(bbox1_pix);\n\n  // Form bounding box for image2 in image1's projected coordinates\n  // GeoTransform converts from source (georef2) to destination (georef1)\n  vw::cartography::GeoTransform geo_trans(georef2, georef1);\n  vw::BBox2 bbox2_in_proj1 = geo_trans.pixel_to_point_bbox(bbox2_pix);\n\n  // Find intersection in projected coordinates\n  vw::BBox2 intersection_proj = bbox1_proj;\n  intersection_proj.crop(bbox2_in_proj1);\n  if (intersection_proj.empty())\n    vw::vw_throw(vw::ArgumentErr() << \"The two images do not overlap.\\n\");\n\n  // Further limit by --proj-win if set\n  vw::BBox2 proj_win = asp::stereo_settings().proj_win;\n  if (proj_win != vw::BBox2(0, 0, 0, 0)) {\n    // Swap min and max if need be\n    if (proj_win.min().y() > proj_win.max().y())\n      std::swap(proj_win.min().y(), proj_win.max().y());\n    if (proj_win.min().x() > proj_win.max().x())\n      std::swap(proj_win.min().x(), proj_win.max().x());\n    intersection_proj.crop(proj_win);\n    if (intersection_proj.empty())\n      vw::vw_throw(vw::ArgumentErr()\n                    << \"The --proj-win does not overlap the images.\\n\");\n  }\n\n  // Convert intersection to image1's pixel coordinates\n  vw::BBox2i intersection_pix = georef1.point_to_pixel_bbox(intersection_proj);\n  intersection_pix.expand(1);\n  // Crop to image1's pixel box, just in case\n  intersection_pix.crop(bbox1_pix);\n\n  // Calculate number of tiles\n  int width = intersection_pix.width();\n  int height = intersection_pix.height();\n  int tiles_nx = (int)std::ceil((double)width / tile_size);\n  int tiles_ny = (int)std::ceil((double)height / tile_size);\n\n  // Open output file\n  std::string tile_list_file = output_prefix + \"-distTileList.txt\";\n  std::ofstream ofs(tile_list_file.c_str());\n  if (!ofs.good())\n    vw::vw_throw(vw::ArgumentErr() << \"Cannot open for writing: \" << tile_list_file << \"\\n\");\n\n  vw::vw_out() << \"Writing tile list: \" << tile_list_file << \"\\n\";\n  vw::vw_out() << \"Intersection region: \" << intersection_pix << \"\\n\";\n  vw::vw_out() << \"Tile size: \" << tile_size << \", padding: \" << tile_padding << \"\\n\";\n\n  // Prepare shapefile structure\n  std::vector<vw::geometry::dPoly> polyVec(1);\n  vw::geometry::dPoly& poly = polyVec[0];\n  std::vector<int> tile_id_vec;\n  std::string fieldId = \"tile_id\";\n\n  // Generate tiles covering the intersection region\n  int num_tiles = 0;\n  for (int iy = 0; iy < tiles_ny; iy++) {\n    for (int ix = 0; ix < tiles_nx; ix++) {\n\n      // Tile position and size (without padding)\n      int tile_x = intersection_pix.min().x() + ix * tile_size;\n      int tile_y = intersection_pix.min().y() + iy * tile_size;\n      int tile_w = std::min(tile_size, intersection_pix.max().x() - tile_x);\n      int tile_h = std::min(tile_size, intersection_pix.max().y() - tile_y);\n\n      // Write: tile_x tile_y tile_w tile_h tile_padding\n      ofs << tile_x << \" \" << tile_y << \" \" << tile_w << \" \" << tile_h << \" \" << tile_padding << \"\\n\";\n\n      // Convert tile corners to projected coordinates for shapefile\n      std::vector<double> px(4), py(4);\n      vw::Vector2 pt;\n      pt = georef1.pixel_to_point(vw::Vector2(tile_x, tile_y));\n      px[0] = pt[0]; py[0] = pt[1];\n      pt = georef1.pixel_to_point(vw::Vector2(tile_x + tile_w, tile_y));\n      px[1] = pt[0]; py[1] = pt[1];\n      pt = georef1.pixel_to_point(vw::Vector2(tile_x + tile_w, tile_y + tile_h));\n      px[2] = pt[0]; py[2] = pt[1];\n      pt = georef1.pixel_to_point(vw::Vector2(tile_x, tile_y + tile_h));\n      px[3] = pt[0]; py[3] = pt[1];\n\n      // Append polygon\n      bool isPolyClosed = true;\n      std::string color = \"green\", layer = \"\";\n      poly.appendPolygon(px.size(), vw::geometry::vecPtr(px), vw::geometry::vecPtr(py),\n                         isPolyClosed, color, layer);\n      tile_id_vec.push_back(num_tiles);\n\n      num_tiles++;\n    }\n  }\n\n  ofs.close();\n  vw::vw_out() << \"Wrote \" << num_tiles << \" tiles.\\n\";\n\n  // Write shapefile and qml file (for QGIS)\n  std::string shapeFile = output_prefix + \"-distTileList.shp\";\n  vw::vw_out() << \"Writing shape file: \" << shapeFile << \"\\n\";\n  bool is_map_projected = true; // These are mapprojected images\n  vw::geometry::write_shapefile(shapeFile, is_map_projected, georef1, polyVec,\n                                fieldId, tile_id_vec);\n  std::string qmlFile = output_prefix + \"-distTileList.qml\";\n  vw::vw_out() << \"Writing qml file: \" << qmlFile << \"\\n\";\n  vw::geometry::writeQml(qmlFile, fieldId);\n}\n\n// Handle the crop windows for distributed stereo mode. Here the left crop\n// window is expanded by the collar size and the right crop window is\n// auto-computed.\nvoid handleDistCropWins(std::string const& left_image,\n                        std::string const& right_image,\n                        int collar_size,\n                        // Outputs\n                        vw::BBox2 & left_crop_win,\n                        vw::BBox2 & right_crop_win) {\n\n  // Sanity checks\n  if (left_crop_win.width() <= 0 || left_crop_win.height() <= 0)\n    vw::vw_throw(vw::ArgumentErr() << \"In distributed stereo mode the left crop window \"\n              << \"must have positive width and height.\\n\");\n  if (collar_size <= 0)\n    vw::vw_throw(vw::ArgumentErr() << \"In distributed stereo mode --sgm-collar-size \"\n              << \"must be positive.\\n\");\n  if (right_crop_win != vw::BBox2(0, 0, 0, 0))\n    vw::vw_throw(vw::ArgumentErr() << \"In distributed stereo mode the right crop window \"\n              << \"must not be set, as it will be auto-computed.\\n\");\n\n  // Read georefs from both images\n  vw::cartography::GeoReference left_georef, right_georef;\n  bool has_left_georef = vw::cartography::read_georeference(left_georef, left_image);\n  bool has_right_georef = vw::cartography::read_georeference(right_georef, right_image);\n  if (!has_left_georef)\n    vw::vw_throw(vw::ArgumentErr() << \"Missing georeference in: \" << left_image << \"\\n\");\n  if (!has_right_georef)\n    vw::vw_throw(vw::ArgumentErr() << \"Missing georeference in: \" << right_image << \"\\n\");\n\n  // Get left image bbox\n  vw::Vector2 left_dims = vw::file_image_size(left_image);\n  vw::BBox2 left_bbox(0, 0, left_dims[0], left_dims[1]);\n  // Expand left crop win by collar size\n  left_crop_win.expand(collar_size);\n  // Crop to left image bbox\n  left_crop_win.crop(left_bbox);\n\n  // Use geo transform to convert left crop win (pixels) to right image pixels\n  // GeoTransform::forward_bbox converts pixel bbox from source to destination\n  vw::cartography::GeoTransform geo_trans(left_georef, right_georef);\n  right_crop_win = geo_trans.forward_bbox(left_crop_win);\n\n  // Crop to right image bbox\n  vw::Vector2 right_dims = vw::file_image_size(right_image);\n  vw::BBox2 right_bbox(0, 0, right_dims[0], right_dims[1]);\n  right_crop_win.crop(right_bbox);\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Core/StereoTiling.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file StereoTiling.h\n///\n\n#ifndef __ASP_CORE_STEREO_TILING_H__\n#define __ASP_CORE_STEREO_TILING_H__\n\n#include <string>\n#include <vw/Math/BBox.h>\n#include <vw/Math/Vector.h>\n\nnamespace asp {\n\n// Produce the list of tiles for parallel_stereo. If D_sub is available, write\n// only those tiles for which D_sub has valid values. Also save a shape file\n// with the tiles and the tile index for each tile, to be read in QGIS for\n// visualization.\nvoid produceTiles(bool is_map_projected,\n                  std::string const& output_prefix,\n                  vw::Vector2 const& trans_left_image_size,\n                  vw::Vector2i const& parallel_tile_size,\n                  int sgm_collar_size);\n\n// Produce the list of tiles covering the overlap region of two mapprojected images,\n// for use with stereo_dist. Write as a text file and a shapefile for visualization.\nvoid produceDistTileList(std::string const& in_file1,\n                         std::string const& in_file2,\n                         std::string const& output_prefix,\n                         vw::Vector2i const& stereo_dist_tile_params);\n\n// Handle the crop windows for distributed stereo mode. Here the left crop\n// window is expanded by the collar size and the right crop window is\n// auto-computed.\nvoid handleDistCropWins(std::string const& left_image,\n                        std::string const& right_image,\n                        int collar_size,\n                        // Outputs\n                        vw::BBox2 & left_crop_win,\n                        vw::BBox2 & right_crop_win);\n\n} // end namespace asp\n\n#endif // __ASP_CORE_STEREO_TILING_H__\n"
  },
  {
    "path": "src/asp/Core/ThreadedEdgeMask.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <vw/Core/System.h>\n#include <vw/Core/ThreadPool.h>\n#include <vw/Image/MaskViews.h>\n#include <boost/foreach.hpp>\n\n#ifndef __ASP_CORE_THREADEDEDGEMASK_H__\n#define __ASP_CORE_THREADEDEDGEMASK_H__\n\nnamespace asp {\n\n  /// Quick way to check which pixels are inside the valid input mask??\n  template <class ViewT>\n  class ThreadedEdgeMaskView: public vw::ImageViewBase<ThreadedEdgeMaskView<ViewT>> {\n\n    ViewT m_view;\n\n    typedef boost::shared_array<vw::int32> SharedArray;\n    SharedArray m_left, m_right, m_top, m_bottom;\n\n    // Determines if a single pixel is valid.\n    inline bool valid(vw::int32 i, vw::int32 j) const {\n      if (i > m_left[j] && i < m_right[j] && j > m_top[i] && j < m_bottom[i])\n        return true;\n      else\n        return false;\n    }\n\n    // Task that checks individual blocks for edges\n    class EdgeMaskTask: public vw::Task, private boost::noncopyable {\n      ViewT m_view;\n      typename ViewT::pixel_type m_mask_value;\n      vw::BBox2i m_bbox;   // Region of image we're working in\n      typedef std::vector<vw::int32> Array;\n      typedef boost::shared_array<vw::int32> SharedArray;\n      SharedArray g_left, g_right, g_top, g_bottom;\n      Array       m_left, m_right, m_top, m_bottom;\n      // This how much we increment after we test a pixel. Set to 1 if\n      // every pixel is to be tested.\n      const vw::int32 STEP_SIZE;\n    public:\n      EdgeMaskTask(ViewT const& view,\n                   typename ViewT::pixel_type mask_value,\n                   vw::int32 search_step,\n                   vw::BBox2i bbox, SharedArray left, SharedArray right,\n                   SharedArray top, SharedArray bottom):\n        m_view(view), m_mask_value(mask_value), m_bbox(bbox), \n        g_left(left), g_right(right), g_top(top), g_bottom(bottom), \n        m_left(m_bbox.height()), m_right(m_bbox.height()), \n        m_top(m_bbox.width()), m_bottom(m_bbox.width()), STEP_SIZE(search_step) {\n          \n        std::fill(m_left.begin  (), m_left.end  (), -1);\n        std::fill(m_right.begin (), m_right.end (), -1);\n        std::fill(m_top.begin   (), m_top.end   (), -1);\n        std::fill(m_bottom.begin(), m_bottom.end(), -1);\n      }\n\n      void operator()() {\n\n        // Rasterizing local tile\n        vw::ImageView<typename ViewT::pixel_type> copy(crop(m_view, m_bbox));\n\n        { // Detecting Edges\n          // Search left and right side\n          for (int j = 0; j < copy.rows(); ++j) { // Loop up through the rows in the local tile\n            int i = 0;\n            while (i < copy.cols() && copy(i,j) == m_mask_value) // Move from left to right in row by STEP_SIZE\n              i += STEP_SIZE;                                      //    until we hit an invalid pixel\n            if (i > 0) i -= STEP_SIZE;                           // Walk back one step if we are not at col 0\n            while (i < copy.cols() && copy(i,j) == m_mask_value) // Now do the same thing but in steps of 1\n              ++i;\n            if (i > 0) --i;\n            // Early exit condition if entire row was nodata\n            if (i == copy.cols() -1)\n              continue; // We're keeping left and right as -1\n            m_left[j] = i;                                         // Now we have the left-most valid column in the row\n\n            i = copy.cols() - 1;                                   // Do the same thing going right to left\n            while (i >= 0 && copy(i,j) == m_mask_value)\n              i -= STEP_SIZE;\n            if (i < copy.cols() - 1)\n              i += STEP_SIZE;\n            while (i >= 0 && copy(i,j) == m_mask_value)\n              --i;\n            if (i < copy.cols() - 1)\n              ++i;\n            m_right[j] = i;\n          }\n                                                                   // Now find the first valid rows from the bottom\n          for (int i = 0; i < copy.cols(); ++i) {\n            int j = 0;\n            while (j < copy.rows() && copy(i,j) == m_mask_value)\n              j += STEP_SIZE;\n            if (j > 0)\n              j -= STEP_SIZE;\n            while (j < copy.rows() && copy(i,j) == m_mask_value)\n              ++j;\n            if (j > 0)\n              --j;\n            // Early exit condition if entire column was nodata\n            if (j == copy.rows() - 1)\n              continue; // We're keeping top and bottom as -1\n            m_top[i] = j;\n\n            j = copy.rows()-1;                                     // And the first valid rows from the top\n            while (j >= 0 && copy(i,j) == m_mask_value)\n              j -= STEP_SIZE;\n            if (j < copy.rows()-1)\n              j += STEP_SIZE;\n            while (j >= 0 && copy(i,j) == m_mask_value)\n              --j;\n            if (j < copy.rows()-1)\n              ++j;\n            m_bottom[i] = j;\n          }\n        }\n\n        { // Merging result back into global perspective\n          int l = 0;\n          for (int j = m_bbox.min()[1];                      // Loop through rows\n                j < m_bbox.max()[1]; j++) {\n            if (m_left[l] == -1) {                            // Skip rows with no pixels\n              l++; continue;\n            }\n            g_left[j] = std::min(m_left[l] + m_bbox.min()[0],  // Add in the bounding box column\n                                  g_left[j]);\n            g_right[j] = std::max(m_right[l] + m_bbox.min()[0],\n                                   g_right[j]);\n            l++;\n          }\n\n          l = 0;\n          for (int i = m_bbox.min()[0];                       // Loop through columns\n                i < m_bbox.max()[0]; i++) {\n            if (m_top[l] == -1) {                              // Skip columns with no pixels\n              l++; continue;\n            }\n            g_top[i] = std::min(m_top[l] + m_bbox.min()[1],     // Add in the bounding box row\n                                 g_top[i]);\n            g_bottom[i] = std::max(m_bottom[l] + m_bbox.min()[1],\n                                    g_bottom[i]);\n            l++;\n          }\n        }\n      }\n    };\n\n    // Specialized deep copy constructor (private)\n    template <class OViewT>\n    ThreadedEdgeMaskView(ViewT const& view,\n                          ThreadedEdgeMaskView<OViewT> const& other,\n                          vw::BBox2i const& box):\n      m_view(view), m_left(new vw::int32[box.height()]), m_right(new vw::int32[box.height()]),\n      m_top(new vw::int32[box.width()]), m_bottom(new vw::int32[box.width()]) {\n      \n      // Copy only sections that we need\n      std::copy(other.m_left.get()+box.min()[1],\n                 other.m_left.get()+box.max()[1], m_left.get());\n      std::copy(other.m_right.get()+box.min()[1],\n                 other.m_right.get()+box.max()[1], m_right.get());\n      std::copy(other.m_top.get()+box.min()[0],\n                 other.m_top.get()+box.max()[0], m_top.get());\n      std::copy(other.m_bottom.get()+box.min()[0],\n                 other.m_bottom.get()+box.max()[0], m_bottom.get());\n\n      // Modify to new coordinate system\n      std::for_each(m_left.get(), m_left.get()+box.height(),\n                     vw::ArgValInPlaceSumFunctor<vw::int32>(-box.min()[0]));\n      std::for_each(m_right.get(), m_right.get()+box.height(),\n                     vw::ArgValInPlaceSumFunctor<vw::int32>(-box.min()[0]));\n      std::for_each(m_top.get(), m_top.get()+box.width(),\n                     vw::ArgValInPlaceSumFunctor<vw::int32>(-box.min()[1]));\n      std::for_each(m_bottom.get(), m_bottom.get()+box.width(),\n                     vw::ArgValInPlaceSumFunctor<vw::int32>(-box.min()[1]));\n    }\n\n  public:\n\n    typedef typename ViewT::pixel_type orig_pixel_type;\n    typedef typename boost::remove_cv<typename boost::remove_reference<orig_pixel_type>::type>::type unmasked_pixel_type;\n    typedef vw::PixelMask<unmasked_pixel_type> pixel_type;\n    typedef vw::PixelMask<unmasked_pixel_type> result_type;\n    typedef vw::ProceduralPixelAccessor<ThreadedEdgeMaskView> pixel_accessor;\n\n    ThreadedEdgeMaskView(ViewT const& view,\n                          unmasked_pixel_type const& mask_value,\n                          vw::int32 mask_buffer = 0,\n                          vw::int32 block_size = vw::vw_settings().default_tile_size()):\n      m_view(view), m_left(new vw::int32[view.rows()]), m_right(new vw::int32[view.rows()]),\n      m_top(new vw::int32[view.cols()]), m_bottom(new vw::int32[view.cols()]) {\n\n      std::fill(m_left.get(),   m_left.get  ()+view.rows(), view.cols());\n      std::fill(m_right.get(),  m_right.get ()+view.rows(), 0);\n      std::fill(m_top.get(),    m_top.get   ()+view.cols(), view.rows());\n      std::fill(m_bottom.get(), m_bottom.get()+view.cols(), 0);\n\n      // Calculating edges in parallel\n      vw::FifoWorkQueue queue(vw::vw_settings().default_num_threads());\n      std::vector<vw::BBox2i> bboxes = subdivide_bbox(m_view, block_size, block_size);\n\n      // Figure out an ideal search step size. Smaller means we're\n      // more likely to catch small features. Bigger step size means\n      // will move a lot faster.\n      int search_step = vw::math::norm_2(vw::Vector2i(m_view.cols(),m_view.rows())) / 500;\n      if (search_step < 1)\n        search_step = 1;\n      if (search_step > 10) \n        search_step = 10;\n      vw::vw_out(vw::DebugMessage, \"threadededgemask\") << \"Setting search step to \"\n                                               << search_step << std::endl;\n                                              \n      // Find the outermost valid pixel coming in from each line/direction.\n      BOOST_FOREACH(vw::BBox2i const& box, bboxes) {\n        vw::vw_out(vw::DebugMessage, \"threadededgemask\") \n          << \"Created EdgeMaskTask for \" << box << std::endl;\n        boost::shared_ptr<EdgeMaskTask> \n          task(new EdgeMaskTask(m_view, mask_value, search_step, box, \n                                m_left, m_right, m_top, m_bottom));\n        queue.add_task(task);\n      }\n      queue.join_all(); // Wait for all tasks to complete\n\n      // Erode the valid area by mask_buffer size on each side.\n      std::for_each(m_left.get(), m_left.get()+view.rows(),\n                     vw::ArgValInPlaceSumFunctor<vw::int32>(mask_buffer));\n      std::for_each(m_right.get(), m_right.get()+view.rows(),\n                     vw::ArgValInPlaceDifferenceFunctor<vw::int32>(mask_buffer));\n      std::for_each(m_top.get(), m_top.get()+view.cols(),\n                     vw::ArgValInPlaceSumFunctor<vw::int32>(mask_buffer));\n      std::for_each(m_bottom.get(), m_bottom.get()+view.cols(),\n                     vw::ArgValInPlaceDifferenceFunctor<vw::int32>(mask_buffer));\n    }\n\n    inline vw::int32 cols  () const { return m_view.cols  (); }\n    inline vw::int32 rows  () const { return m_view.rows  (); }\n    inline vw::int32 planes() const { return m_view.planes(); }\n\n    inline pixel_accessor origin() const { return pixel_accessor(*this); }\n\n    inline result_type operator()(vw::int32 i, vw::int32 j, vw::int32 p=0) const {\n      if (this->valid(i,j))\n        return pixel_type(m_view(i,j,p));\n      else\n        return pixel_type();\n    }\n\n    vw::BBox2i active_area() const {\n      return vw::BBox2i(vw::Vector2i(*std::min_element(&m_left  [0], &m_left  [rows()])+1,\n                                      *std::min_element(&m_top   [0], &m_top   [cols()])+1),\n                         vw::Vector2i(*std::max_element(&m_right [0], &m_right [rows()]),\n                                      *std::max_element(&m_bottom[0], &m_bottom[cols()])));\n    }\n\n    typedef vw::CropView<ThreadedEdgeMaskView<vw::CropView<typename ViewT::prerasterize_type>>> prerasterize_type;\n    inline prerasterize_type prerasterize(vw::BBox2i const& bbox) const {\n      // We are deep copying a small section of ThreadedEdgeMaskView\n      // and then uncropping back to original coordinates.\n      typedef ThreadedEdgeMaskView<vw::CropView<typename ViewT::prerasterize_type>> inner_type;\n      return vw::crop(inner_type(vw::crop(m_view.prerasterize(bbox),bbox),\n                                  *this, bbox),\n                      -bbox.min()[0], -bbox.min()[1],\n                      this->cols(), this->rows());\n    }\n\n    template <class DestT> inline void rasterize(DestT const& dest, vw::BBox2i const& bbox) const {\n      vw::rasterize(prerasterize(bbox), dest, bbox);\n    }\n\n    // Friend other types of threaded edge mask\n    template <class OViewT>\n    friend class ThreadedEdgeMaskView;\n  };\n\n  template <class ViewT>\n  ThreadedEdgeMaskView<ViewT> threaded_edge_mask(vw::ImageViewBase<ViewT> const& v,\n                                                 typename ViewT::pixel_type value,\n                                                 vw::int32 mask_buffer = 0,\n                                                 vw::int32 block_size\n                                                 = vw::vw_settings().default_tile_size()) {\n    return ThreadedEdgeMaskView<ViewT>(v.impl(), value, mask_buffer, block_size);\n  }\n}\n\nnamespace vw {\n  template <class ViewT>\n  struct IsMultiplyAccessible<asp::ThreadedEdgeMaskView<ViewT>>: public true_type {};\n}\n\n#endif//__ASP_CORE_THREADEDEDGEMASK_H__\n"
  },
  {
    "path": "src/asp/Core/tests/TestAspProgramOptions.cxx",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n#include <test/Helpers.h>\n#include <asp/Core/AspProgramOptions.h>\n\nusing namespace vw;\nusing namespace asp;\n\nTEST( Common, separate_images_from_cameras_rpb ) {\n\n  std::vector<std::string> inputs, images, cameras;\n  bool ensure_equal_sizes = true;\n\n  inputs.push_back(\"1220996672.27391028_sc00110_c1_PAN.tiff\");\n  inputs.push_back(\"1220996702.11131644_sc00110_c1_PAN.tiff\");\n  inputs.push_back(\"1220996672.27391028_sc00110_c1_PAN.RPB\");\n  inputs.push_back(\"1220996702.11131644_sc00110_c1_PAN.RPB\");\n\n  EXPECT_NO_THROW(separate_images_from_cameras(inputs, images, cameras, ensure_equal_sizes));\n  EXPECT_EQ(2, images.size ());\n  EXPECT_EQ(2, cameras.size());\n}\n\nTEST( Common, StereoMultiCmdCheck ) {\n\n  // Init a georef, the numbers are pretty arbitrary, it just must be valid\n  cartography::GeoReference georef;\n  georef.set_geographic();\n  georef.set_proj4_projection_str(\"+proj=longlat +a=3396190 +b=3396190 +no_defs \");\n  georef.set_well_known_geogcs(\"D_MARS\");\n  Matrix3x3 affine;\n  affine(0,0) = 0.01; // 100 pix/degree\n  affine(1,1) = -0.01; // 100 pix/degree\n  affine(2,2) = 1;\n  affine(0,2) = 30;   // 30 deg east\n  affine(1,2) = -35;  // 35 deg south\n  georef.set_transform(affine);\n\n  // For the test below to pass, the files must be present.\n  ImageView<float> dem(100, 100);\n  double nodata = -1000;\n  bool has_nodata = true, has_georef = true;\n  TerminalProgressCallback tpc(\"asp\", \": \");\n  vw::GdalWriteOptions opt;\n\n  vw::cartography::block_write_gdal_image(\"img1.tif\", dem, has_georef, georef, has_nodata, nodata, opt, tpc);\n  vw::cartography::block_write_gdal_image(\"img2.tif\", dem, has_georef, georef, has_nodata, nodata, opt, tpc);\n  vw::cartography::block_write_gdal_image(\"img3.tif\", dem, has_georef, georef, has_nodata, nodata, opt, tpc);\n  vw::cartography::block_write_gdal_image(\"img4.tif\", dem, has_georef, georef, has_nodata, nodata, opt, tpc);\n  vw::cartography::block_write_gdal_image(\"img1.cub\", dem, has_georef, georef, has_nodata, nodata, opt, tpc);\n  vw::cartography::block_write_gdal_image(\"img2.cub\", dem, has_georef, georef, has_nodata, nodata, opt, tpc);\n  vw::cartography::block_write_gdal_image(\"dem.tif\", dem, has_georef, georef, has_nodata, nodata, opt, tpc);\n\n  std::ofstream ofs1(\"img1.xml\"); ofs1 << \"test\" << std::endl; ofs1.close();\n  std::ofstream ofs2(\"img2.xml\"); ofs2 << \"test\" << std::endl; ofs2.close();\n\n  std::vector<std::string> files;\n  files.push_back(\"img1.tif\");\n  files.push_back(\"img2.tif\");\n  files.push_back(\"img1.xml\");\n  files.push_back(\"img2.xml\");\n  files.push_back(\"run/run\");\n\n  std::vector<std::string> image_paths, camera_paths;\n  std::string prefix, dem_path;\n  parseStereoFiles(files, image_paths, camera_paths, prefix, dem_path);\n  EXPECT_EQ(2, image_paths.size ());\n  EXPECT_EQ(2, camera_paths.size());\n  EXPECT_EQ(\"img1.tif\", image_paths [0]);\n  EXPECT_EQ(\"img2.tif\", image_paths [1]);\n  EXPECT_EQ(\"img1.xml\", camera_paths[0]);\n  EXPECT_EQ(\"img2.xml\", camera_paths[1]);\n  EXPECT_EQ(\"run/run\" , prefix );\n  EXPECT_EQ(\"\",         dem_path);\n\n  // ----\n\n  files.clear();\n  files.push_back(\"img1.cub\");\n  files.push_back(\"img2.cub\");\n  files.push_back(\"run/run\");\n\n  parseStereoFiles(files, image_paths, camera_paths, prefix, dem_path);\n  EXPECT_EQ(2, image_paths.size ());\n  EXPECT_EQ(0, camera_paths.size());\n  EXPECT_EQ(\"img1.cub\", image_paths [0]);\n  EXPECT_EQ(\"img2.cub\", image_paths [1]);\n  EXPECT_EQ(\"run/run\" , prefix);\n  EXPECT_EQ(\"\",         dem_path);\n\n  // ----\n  files.clear();\n  files.push_back(\"img1.tif\");\n  files.push_back(\"img2.tif\");\n  files.push_back(\"img1.cub\");\n  files.push_back(\"img2.cub\");\n  files.push_back(\"run/run\");\n  files.push_back(\"dem.tif\");\n\n  parseStereoFiles(files, image_paths, camera_paths, prefix, dem_path);\n  EXPECT_EQ(2, image_paths.size ());\n  EXPECT_EQ(2, camera_paths.size());\n  EXPECT_EQ(\"img1.tif\", image_paths [0]);\n  EXPECT_EQ(\"img2.tif\", image_paths [1]);\n  EXPECT_EQ(\"img1.cub\", camera_paths[0]);\n  EXPECT_EQ(\"img2.cub\", camera_paths[1]);\n  EXPECT_EQ(\"run/run\",  prefix);\n  EXPECT_EQ(\"dem.tif\",  dem_path);\n\n  // ----\n  files.clear();\n  files.push_back(\"img1.tif\");\n  files.push_back(\"img2.tif\");\n  files.push_back(\"img3.tif\");\n  files.push_back(\"img4.tif\");\n  files.push_back(\"run/run\");\n  files.push_back(\"dem.tif\");\n\n  parseStereoFiles(files, image_paths, camera_paths, prefix, dem_path);\n  EXPECT_EQ(4, image_paths.size());\n  EXPECT_EQ(0, camera_paths.size());\n  EXPECT_EQ(\"img1.tif\", image_paths [0]);\n  EXPECT_EQ(\"img2.tif\", image_paths [1]);\n  EXPECT_EQ(\"img3.tif\", image_paths [2]);\n  EXPECT_EQ(\"img4.tif\", image_paths [3]);\n  EXPECT_EQ(\"run/run\" , prefix);\n  EXPECT_EQ(\"dem.tif\" , dem_path);\n\n} // End test StereoMultiCmdCheck\n"
  },
  {
    "path": "src/asp/Core/tests/TestIntegralAutoGainDetector.cxx",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <test/Helpers.h>\n#include <vw/Math/Functors.h>\n#include <vw/Math/Vector.h>\n#include <vw/Image/ImageView.h>\n#include <vw/Image/ImageMath.h>\n#include <vw/Image/ImageViewRef.h>\n#include <vw/InterestPoint/IntegralDetector.h>\n#include <vw/InterestPoint/InterestPoint.h>\n\n#include <boost/foreach.hpp>\n#include <boost/random/normal_distribution.hpp>\n\nusing namespace vw;\nusing namespace vw::ip;\n\nTEST( IntegralAutoGainDetector, VerifyMaxima ) {\n\n  ImageView<float> test_image(101,101);\n\n  const float SIGMA = 3;\n\n  // Drawing a DoG signal\n  Vector2i location, center(50,50);\n  for ( ; location.y() < test_image.rows(); location.y()++ ) {\n    for ( location.x() = 0; location.x() < test_image.cols(); location.x()++ ) {\n      float distance = norm_2( Vector2f(location - center) );\n      test_image( location.x(), location.y() ) =\n        40 * (\n              1/(2*M_PI*SIGMA*SIGMA)*exp(-pow(distance,2)/(2*SIGMA*SIGMA)) -\n              1/(2*M_PI*4*SIGMA*SIGMA)*exp(-pow(distance,2)/(2*4*SIGMA*SIGMA))\n              ) + 0.5;\n    }\n  }\n\n  // Detect interest points\n  IntegralAutoGainDetector detector;\n  ip::InterestPointList list = detector.process_image( test_image );\n\n  // On 32-bit Linux the answer is different\n#if __GNUC__\n#if __x86_64__ || __ppc64__\n  EXPECT_EQ( list.size(), 9 ); // Digitization error\n#else\n  EXPECT_EQ( list.size(), 13 ); // Digitization error\n#endif\n#endif\n\n  // Find the best IP\n  const ip::InterestPoint* best_ip = &list.front();\n  float best_ip_value = list.begin()->interest;\n  BOOST_FOREACH( ip::InterestPoint const& ip, list ) {\n    if ( ip.interest > best_ip_value ) {\n      best_ip_value = ip.interest;\n      best_ip = &ip;\n    }\n  }\n\n  // The best IP is the one centered on the circle feature we\n  // drew. There are more due to digitization errors and float point\n  // errors in the the integral image.\n  EXPECT_EQ( best_ip->x, 50 );\n  EXPECT_EQ( best_ip->y, 50 );\n  EXPECT_EQ( best_ip->scale, 1.875 );\n\n  // This is odd ... but I'm just verifying the impl calls the same\n  // code. This was a bug that elluded me for a very long time.\n  ASSERT_EQ( typeid(detector),\n             typeid(detector.impl()) );\n}\n"
  },
  {
    "path": "src/asp/Core/tests/TestInterestPointMatching.cxx",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n#include <test/Helpers.h>\n#include <asp/Core/InterestPointMatching.h>\n#include <vw/Camera/PinholeModel.h>\n#include <vw/Camera/LensDistortion.h>\n#include <vw/Cartography/CameraBBox.h>\n\nusing namespace vw;\nusing namespace asp;\n\nTEST( InterestPointMatching, DatumIntersection ) {\n\n  // Make a synthetic camera (Parameters selected to mimic a DG like camera)\n  camera::PinholeModel model( Vector3(-414653.934175,-2305310.05912,-6759174.5439),\n                              Quat(-0.0794638597818,-0.0396316037899,-0.40945443655,-0.907998840691).rotation_matrix(),\n                              1.65e6, 1.65e6, 17500, 17500,\n                              Vector3(1,0,0), Vector3(0,1,0), Vector3(0,0,1));\n\n  // Project back a forth against a flattened sphere\n  cartography::Datum datum(\"WGS84\");\n  for ( size_t i = 0; i < 35000; i+= 2000 ) {\n    for ( size_t j = 0; j < 35000; j+= 2000 ) {\n      Vector2 meas( i, j );\n\n      Vector3 pos = cartography::datum_intersection( datum, &model, meas );\n      Vector3 geo = datum.cartesian_to_geodetic( pos );\n\n      // Verify that the geodetic height is zero (we are on the sphere).\n      EXPECT_NEAR( 0, geo.z(), 1e-3 );\n\n      Vector2 ret = model.point_to_pixel( pos );\n      EXPECT_VECTOR_NEAR( meas, ret, 1e-3 );\n    }\n  }\n\n  // Project back and forth against a true sphere\n  datum.set_semi_minor_axis( datum.semi_major_axis() );\n  for ( size_t i = 0; i < 35000; i+= 2000 ) {\n    for ( size_t j = 0; j < 35000; j+= 2000 ) {\n      Vector2 meas( i, j );\n\n      Vector3 pos = cartography::datum_intersection( datum, &model, meas );\n      Vector3 geo = datum.cartesian_to_geodetic( pos );\n\n      // Verify that the geodetic height is zero (we are on the sphere).\n      EXPECT_NEAR( 0, geo.z(), 1e-3 );\n\n      Vector2 ret = model.point_to_pixel( pos );\n      EXPECT_VECTOR_NEAR( meas, ret, 1e-3 );\n    }\n  }\n\n}\n"
  },
  {
    "path": "src/asp/Core/tests/TestPointUtils.cxx",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n#include <test/Helpers.h>\n#include <asp/Core/PointUtils.h>\n\nusing namespace vw;\nusing namespace asp;\n\nTEST( PointUtils, CsvConv ) {\n  \n  // Needed for the Lola tests below.\n  vw::cartography::GeoReference geo;\n  geo.set_well_known_geogcs(\"D_MOON\");\n  \n  // Check format parsing\n  CsvConv conv;\n  conv.parse_csv_format(\"2:file 5:lon 6:lat 7:height_above_datum\", \"\");\n  EXPECT_TRUE(conv.is_configured());\n  \n  // Check line reading\n  bool is_first_line = false;\n  bool success = false;\n  std::string line = \"1, name.jpg, 3, 4, 5, 6, 7, 8, 9\";\n  CsvConv::CsvRecord vals = conv.parse_csv_line(is_first_line, success, line);\n  EXPECT_EQ(\"name.jpg\", conv.file_from_csv(vals));\n  Vector3 point = conv.csv_to_geodetic(vals, geo);\n  EXPECT_EQ(5, vals.point_data[0]);\n  EXPECT_EQ(6, vals.point_data[1]);\n  EXPECT_EQ(7, vals.point_data[2]);\n\n  // Check format parsing\n  conv.parse_csv_format(\"1:file 8:y 4:x 2:z\", \"\");\n  EXPECT_TRUE(conv.is_configured());\n  \n  // Check line reading\n  line = \"name.tif, 2, 3, 4, 5, 6, 7, 8, 9\";\n  vals = conv.parse_csv_line(is_first_line, success, line);\n  EXPECT_EQ(\"name.tif\", conv.file_from_csv(vals));\n  point = conv.csv_to_cartesian(vals, geo);\n  EXPECT_EQ(4, point[0]); // x\n  EXPECT_EQ(8, point[1]); // y\n  EXPECT_EQ(2, point[2]); // z\n  \n  // Check the unsort function\n  const double mean_lon = 45; // Should not affect test\n  point = conv.cartesian_to_csv(point, geo, mean_lon);\n  EXPECT_EQ(2, point[0]); // z\n  EXPECT_EQ(4, point[1]); // x\n  EXPECT_EQ(8, point[2]); // y\n  \n  \n  // Check format parsing\n  conv.parse_csv_format(\"1:file 12:lat 13:lon 14:height_above_datum\", \"\");\n  EXPECT_TRUE(conv.is_configured());   \n    \n  // Check line reading\n  line = \"2009_10_20_0778        778    228373.34782  -17.79782     2782345.669     -147696.005     1521956.201       10263.249      0.441      1.973    191.403    -75.22419715    -98.31170774       10263.249 740\";\n  vals = conv.parse_csv_line(is_first_line, success, line);\n  EXPECT_EQ(\"2009_10_20_0778\", conv.file_from_csv(vals));\n  point = conv.csv_to_geodetic(vals, geo);\n  EXPECT_EQ(-98.31170774,  point[0]); // lon\n  EXPECT_EQ(-75.22419715,  point[1]); // lat\n  EXPECT_EQ(10263.249,     point[2]); // height\n  \n\n  // Check format parsing\n  conv.parse_csv_format(\"1:height_above_datum 3:lon 2:lat\", \"\");\n  EXPECT_TRUE(conv.is_configured());   \n\n\n  // Check line reading\n  line = \"658.4780\t69.3737799999999964,\t310.0611559999999827,\t\"; // Formatting is pretty bad here!\n  vals = conv.parse_csv_line(is_first_line, success, line);\n  EXPECT_EQ(\"\", conv.file_from_csv(vals));\n  point = conv.csv_to_geodetic(vals, geo);\n  EXPECT_EQ(310.0611559999999827, point[0]); // lon\n  EXPECT_EQ(69.3737799999999964,  point[1]); // lat\n  EXPECT_EQ(658.4780,             point[2]); // height\n\n\n  // Check format parsing\n  conv.parse_csv_format(\"4:lat 2:lon 3:radius_km\", \"\");\n  EXPECT_TRUE(conv.is_configured());   \n\n  // There is some loss of precision in the radius to height conversion!\n  const double delta = 0.0001;\n\n  // Check line reading\n  line = \"2009-09-06T05:50:31.41569740\t3.7773769\t1735.898125\t27.4985349\t\"; // Formatting is pretty bad here\n  vals = conv.parse_csv_line(is_first_line, success, line);\n  EXPECT_EQ(\"\", conv.file_from_csv(vals));\n  point = conv.csv_to_geodetic(vals, geo);\n  EXPECT_NEAR(3.77738,    point[0], delta); // lon\n  EXPECT_NEAR(27.4985,    point[1], delta); // lat\n  EXPECT_NEAR(-1501.8749, point[2], delta); // height\n\n\n\n  // Check format parsing\n  conv.parse_csv_format(\"3:lat 2:radius_m 4:lon\", \"\");\n  EXPECT_TRUE(conv.is_configured());   \n\n  // Check line reading\n  line = \"2009-09-06T05:50:31.41569740\t1735898.125\t27.4985349\t3.7773769\t\"; // Formatting is pretty bad here!\n  vals = conv.parse_csv_line(is_first_line, success, line);\n  EXPECT_EQ(\"\", conv.file_from_csv(vals));\n  point = conv.csv_to_geodetic(vals, geo);\n  EXPECT_NEAR(3.77738,    point[0], delta); // lon\n  EXPECT_NEAR(27.4985,    point[1], delta); // lat\n  EXPECT_NEAR(-1501.8749, point[2], delta); // height\n  \n}\n\n// Open up an ascii style PCD file and make sure we can read all of the values from it.\nTEST( PointUtils, PcdReader ) {\n\n  asp::PcdReader reader(\"sample_ascii.pcd\");\n\n  std::vector<vw::Vector3> values;\n  values.push_back(Vector3(17.799999, -181.40001, 584.96973));\n  values.push_back(Vector3(14.56,     -145.12001, 467.97577));\n  values.push_back(Vector3(15.663157, -152.7579,  492.60608));\n  values.push_back(Vector3(17.882353, -170.72942, 550.55975));\n  values.push_back(Vector3(18.258823, -170.72942, 550.55975));\n  values.push_back(Vector3(18.635294, -170.72942, 550.55975));\n  values.push_back(Vector3(23.085714, -207.3143,  668.5368 ));\n  values.push_back(Vector3(27.466667, -241.86668, 779.95966));\n  values.push_back(Vector3(18.97143,  -206.85715, 668.5368 ));\n\n  for (size_t i=0; i<values.size(); ++i) {  \n    EXPECT_TRUE(reader.ReadNextPoint());\n    EXPECT_VECTOR_NEAR( reader.GetPoint(), values[i], 1e-16 );\n  }\n  EXPECT_FALSE(reader.ReadNextPoint());\n\n}\n\n\n"
  },
  {
    "path": "src/asp/Core/tests/TestThreadedEdgeMask.cxx",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n#include <test/Helpers.h>\n#include <vw/Math/BBox.h>\n#include <vw/Image/AlgorithmFunctions.h>\n#include <vw/Image/ImageView.h>\n#include <vw/Image/Manipulation.h>\n#include <asp/Core/ThreadedEdgeMask.h>\n\n#include <algorithm>\n#include <vector>\n\nusing namespace vw;\nusing namespace asp;\n\nTEST( ThreadedEdgeMask, active_area ) {\n  ImageView<uint8> input(10,10);\n  fill(input,0);\n  fill(crop(input,2,2,3,3),255);\n\n  EXPECT_EQ( BBox2i(2,2,3,3),\n             threaded_edge_mask(input,0).active_area() );\n  EXPECT_EQ( BBox2i(3,3,1,1),\n             threaded_edge_mask(input,0,1).active_area() );\n\n  ImageView<uint8> output = threaded_edge_mask(input,0);\n  EXPECT_EQ( input, output );\n\n  input.set_size(5,5);\n  fill(input,0);\n  fill(crop(input,1,1,3,3),255);\n\n  EXPECT_EQ( BBox2i(1,1,3,3),\n             threaded_edge_mask(input,0).active_area() );\n  EXPECT_EQ( BBox2i(2,2,1,1),\n             threaded_edge_mask(input,0,1).active_area() );\n\n  output = threaded_edge_mask(input,0);\n  EXPECT_EQ( input, output );\n}\n"
  },
  {
    "path": "src/asp/Core/tests/sample_ascii.pcd",
    "content": "# .PCD v0.7 - Point Cloud Data file format\nVERSION 0.7\nFIELDS x y z\nSIZE 4 4 4\nTYPE F F F\nCOUNT 1 1 1\nWIDTH 3715044\nHEIGHT 1\nVIEWPOINT 0 0 0 1 0 0 0\nPOINTS 3715044\nDATA ascii\n17.799999 -181.40001 584.96973\n14.56 -145.12001 467.97577\n15.663157 -152.7579 492.60608\n17.882353 -170.72942 550.55975\n18.258823 -170.72942 550.55975\n18.635294 -170.72942 550.55975\n23.085714 -207.3143 668.5368\n27.466667 -241.86668 779.95966\n18.97143 -206.85715 668.5368\n\n"
  },
  {
    "path": "src/asp/GUI/AppData.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2024, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// \\file AppData.cc\n// \n// Data structures for the GUI\n// \n\n#include <asp/GUI/AppData.h>\n#include <asp/GUI/GuiArgs.h>\n#include <asp/GUI/GuiUtilities.h>\n#include <asp/Core/StereoSettings.h>\n\nnamespace asp {\n\n// Empty constructor\nAppData::AppData(): use_georef(false),\n                    display_mode(asp::REGULAR_VIEW) {}\n                     \n// Set up the gui data\nAppData::AppData(vw::GdalWriteOptions const& opt_in,\n                 bool use_georef_in,\n                 std::vector<std::map<std::string, std::string>> const& properties,\n                 std::vector<std::string> const& image_files_in): \n  opt(opt_in), use_georef(use_georef_in), image_files(image_files_in) {\n\n  display_mode \n    = asp::stereo_settings().hillshade?asp::HILLSHADED_VIEW:asp::REGULAR_VIEW;\n\n  if (!stereo_settings().zoom_proj_win.empty())\n    use_georef = true;\n  \n  size_t num_images = image_files.size();\n  images.resize(num_images);\n\n  std::vector<int> propertyIndices;\n  asp::lookupPropertyIndices(properties, image_files, propertyIndices);\n\n  // Read the images. If there is a delay, we read only the georef, deferring\n  // for later loading the image pixels.\n  bool delay = asp::stereo_settings().preview;\n  bool has_georef = true;\n  for (size_t i = 0; i < num_images; i++) {\n    images[i].read(image_files[i], opt, asp::REGULAR_VIEW,\n                   properties[propertyIndices[i]], delay);\n    \n    // Above we read the image in regular mode. If plan to display hillshade,\n    // for now set the flag for that, and the hillshaded image will be created\n    // and set later. (Something more straightforward could be done.)\n    images[i].m_display_mode = display_mode;\n    has_georef = has_georef && images[i].has_georef;\n  }\n\n  // Use georef if all images have it. This may be turned off later if it is desired\n  // to show matches.\n  if (has_georef)\n    use_georef = true;\n\n  // It is tricky to set up a layout for georeferenced images if they are loaded\n  // one or a few at a time.\n  if (delay) \n    use_georef = false;\n  \n  // If the user explicitly asked to not use georef, do not use it on startup\n  if (asp::stereo_settings().no_georef) {\n    use_georef = false; \n    // Further control of georef is from the gui menu\n    asp::stereo_settings().no_georef = false; \n  }\n\n  // Create the coordinate transforms\n  world2image.resize(num_images);\n  image2world.resize(num_images);\n  if (use_georef) {\n    for (int i = 0; i < num_images; i++) {  \n      world2image[i]\n        = vw::cartography::GeoTransform(images[BASE_IMAGE_ID].georef,\n                                        images[i].georef);\n      image2world[i]\n        = vw::cartography::GeoTransform(images[i].georef,\n                                        images[BASE_IMAGE_ID].georef);\n    }\n  }\n  \n}\n\n// If we use georef, the world is in projected point units of the\n// first image, with y replaced with -y, to keep the y axis downward,\n// for consistency with how images are plotted.  Convert a world box\n// to a pixel box for the given image.\nvw::Vector2 AppData::world2image_trans(vw::Vector2 const& P, int imageIndex) const{\n  bool poly_or_xyz = images[imageIndex].isPolyOrCsv();\n\n  if (poly_or_xyz) {\n    // Poly or points. There is no pixel concept in that case.\n    if (!use_georef)\n      return flip_in_y(P);\n    return world2image[imageIndex].point_to_point(flip_in_y(P));\n  }\n\n  // Image\n  if (!use_georef)\n    return P;\n  return world2image[imageIndex].point_to_pixel(flip_in_y(P));\n}\n\nvw::BBox2 AppData::world2image_trans(vw::BBox2 const& R, int imageIndex) const {\n\n  bool poly_or_xyz = images[imageIndex].isPolyOrCsv();\n\n  if (R.empty())\n    return R;\n  if (images.empty())\n    return R;\n\n  if (poly_or_xyz) {\n    // Poly or points. There is no pixel concept in that case.\n    if (!use_georef)\n      return flip_in_y(R);\n    return world2image[imageIndex].point_to_point_bbox(flip_in_y(R));\n  }\n\n  // Image\n  if (!use_georef)\n    return R;\n  return world2image[imageIndex].point_to_pixel_bbox(flip_in_y(R));\n}\n\n// The reverse of world2image_trans()\nvw::Vector2 AppData::image2world_trans(vw::Vector2 const& P, int imageIndex) const {\n\n  bool poly_or_xyz = images[imageIndex].isPolyOrCsv();\n\n  if (poly_or_xyz) {\n    if (!use_georef)\n      return flip_in_y(P);\n\n    return flip_in_y(image2world[imageIndex].point_to_point(P));\n  }\n\n  if (!use_georef)\n    return P;\n  return flip_in_y(image2world[imageIndex].pixel_to_point(P));\n}\n\n// The reverse of world2image_trans()\nvw::BBox2 AppData::image2world_trans(vw::BBox2 const& R, int imageIndex) const {\n\n  if (R.empty()) return R;\n  if (images.empty()) return R;\n\n  bool poly_or_xyz = images[imageIndex].isPolyOrCsv();\n\n  // Consider the case when the current layer is a polygon.\n  // TODO(oalexan1): What if a layer has both an image and a polygon?\n\n  if (poly_or_xyz) {\n    if (!use_georef)\n      return flip_in_y(R);\n    return flip_in_y(image2world[imageIndex].point_to_point_bbox(R));\n  }\n\n  if (!use_georef)\n    return R;\n  return flip_in_y(image2world[imageIndex].pixel_to_point_bbox(R));\n}\n\n// Convert from world coordinates to projected coordinates in given geospatial\n// projection\nvw::Vector2 AppData::world2proj(vw::Vector2 P, int imageIndex) const {\n  if (!use_georef)\n      return flip_in_y(P);\n  return world2image[imageIndex].point_to_point(flip_in_y(P)); \n}\n\n// The reverse of world2proj\nvw::Vector2 AppData::proj2world(vw::Vector2 P, int imageIndex) const {\n  if (!use_georef)\n    return flip_in_y(P);\n  return flip_in_y(image2world[imageIndex].point_to_point(P));\n}\n\n} // namespace asp\n"
  },
  {
    "path": "src/asp/GUI/AppData.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2024, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n// \\file AppData.h\n// \n// Data structures for the GUI\n// \n#ifndef __ASP_GUI_APP_DATA_H__\n#define __ASP_GUI_APP_DATA_H__\n\n// Standard library includes\n#include <string>\n#include <vector>\n\n// Vision Workbench includes\n#include <vw/Cartography/GeoTransform.h> // For vw::cartography::GeoTransform\n\n// ASP includes\n#include <asp/GUI/ImageData.h>\n\nnamespace asp { // User requested namespace 'asp'\n\n// See MainWidget.h for what this id does\nconst int BASE_IMAGE_ID = 0;\n\nstruct AppData {\n\n    AppData();\n    AppData(vw::GdalWriteOptions const& opt, \n            bool use_georef,\n            std::vector<std::map<std::string, std::string>> const& properties,\n            std::vector<std::string>const& image_files);\n\n  // Convert pixels for current image into world coordinates, and vice versa\n  vw::Vector2 world2image_trans(vw::Vector2 const& P, int imageIndex) const;\n  vw::Vector2 image2world_trans(vw::Vector2 const& P, int imageIndex) const;\n  vw::BBox2 world2image_trans(vw::BBox2 const& R, int imageIndex) const;\n  vw::BBox2 image2world_trans(vw::BBox2 const& R, int imageIndex) const;\n    \n  // Convert from world coordinates to projected coordinates in given geospatial\n  // projection, and vice versa\n  vw::Vector2 world2proj(vw::Vector2 const P, int imageIndex) const;\n  vw::Vector2 proj2world(vw::Vector2 const P, int imageIndex) const;\n    \n  vw::GdalWriteOptions        opt;\n  bool                        use_georef;\n  asp::DisplayMode            display_mode;\n  std::vector<std::string>    image_files;\n  std::vector<asp::imageData> images;\n  std::vector<vw::cartography::GeoTransform> world2image;\n  std::vector<vw::cartography::GeoTransform> image2world;\n};\n\n} // namespace asp\n\n#endif  // __ASP_GUI_APP_DATA_H__\n"
  },
  {
    "path": "src/asp/GUI/CMakeLists.txt",
    "content": "# Use wrapper function at this level to avoid code duplication\nadd_library_wrapper(AspGUI \"${ASP_GUI_SRC_FILES}\" \"${ASP_GUI_TEST_FILES}\" \"${ASP_GUI_LIB_DEPENDENCIES}\")\n\n# Need this for QT to work.\nset_target_properties(AspGUI PROPERTIES AUTOMOC TRUE)\n"
  },
  {
    "path": "src/asp/GUI/ChooseFilesDlg.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/GUI/ChooseFilesDlg.h>\n#include <asp/GUI/GuiBase.h>\n#include <asp/Core/StereoSettings.h>\n#include <vw/Core/Log.h>\n\n#include <QWidget>\n#include <QHeaderView>\n#include <QVBoxLayout>\n#include <QScrollBar>\n\n#include <set>\n\nnamespace asp {\n\nusing namespace vw;\n\n// Allow the user to choose which files to hide/show in the GUI.\n// User's choice will be processed by MainWidget::showFilesChosenByUser().\nChooseFilesDlg::ChooseFilesDlg(QWidget * parent):\n  QWidget(parent){\n\n  setWindowModality(Qt::ApplicationModal);\n  \n  int spacing = 0;\n  \n  QVBoxLayout * vBoxLayout = new QVBoxLayout(this);\n  vBoxLayout->setSpacing(spacing);\n  vBoxLayout->setAlignment(Qt::AlignLeft);\n  \n  // The layout having the file names. It will be filled in\n  // dynamically later.\n  m_filesTable = new QTableWidget();\n  \n  //m_filesTable->horizontalHeader()->hide();\n  m_filesTable->verticalHeader()->hide();\n    \n  vBoxLayout->addWidget(m_filesTable);\n  \n  return;\n}\n  \nChooseFilesDlg::~ChooseFilesDlg(){}\n\nvoid ChooseFilesDlg::chooseFiles(const std::vector<std::string> & image_files) {\n\n  // See the top of this file for documentation.\n\n  int numFiles = image_files.size();\n  int numCols = 2;\n  m_filesTable->setRowCount(numFiles);\n  m_filesTable->setColumnCount(numCols);\n\n  for (int fileIter = 0; fileIter < numFiles; fileIter++){\n\n    // Checkbox\n    QTableWidgetItem *item = new QTableWidgetItem(1);\n    item->data(Qt::CheckStateRole);\n    if (!asp::stereo_settings().hide_all)\n      item->setCheckState(Qt::Checked);\n    else\n      item->setCheckState(Qt::Unchecked);\n      \n    m_filesTable->setItem(fileIter, 0, item);\n\n    // Set the filename in the table\n    std::string fileName = image_files[fileIter];\n    item = new QTableWidgetItem(fileName.c_str());\n    item->setFlags(Qt::NoItemFlags);\n    item->setForeground(QColor::fromRgb(0, 0, 0));\n    m_filesTable->setItem(fileIter, numCols - 1, item);\n\n    // To be able to quickly look up an image\n    image_to_row[fileName] = fileIter;\n  }\n\n  QStringList rowNamesList;\n  for (int fileIter = 0; fileIter < numFiles; fileIter++) rowNamesList << \"\";\n  m_filesTable->setVerticalHeaderLabels(rowNamesList);\n\n  QStringList colNamesList;\n  for (int colIter = 0; colIter < numCols; colIter++) colNamesList << \"\";\n  m_filesTable->setHorizontalHeaderLabels(colNamesList);\n  QTableWidgetItem * hs = m_filesTable->horizontalHeaderItem(0);\n  hs->setBackground(QBrush(QColor(\"lightgray\")));\n\n  m_filesTable->setSelectionMode(QTableWidget::ExtendedSelection);\n  std::string style = std::string(\"QTableWidget::indicator:unchecked \")\n    + \"{background-color:white; border: 1px solid black;}; \" +\n    \"selection-background-color: rgba(128, 128, 128, 40);\";\n\n  m_filesTable->setSelectionMode(QTableWidget::NoSelection);\n  m_filesTable->setStyleSheet(style.c_str());\n  \n  // Horizontal header caption\n  QTableWidgetItem *item = new QTableWidgetItem(\"Hide/show all\");\n  item->setFlags(Qt::NoItemFlags);\n  item->setForeground(QColor::fromRgb(0, 0, 0));\n  m_filesTable->setHorizontalHeaderItem(1, item);\n  \n  m_filesTable->resizeColumnsToContents();\n  m_filesTable->resizeRowsToContents();\n\n  // The processing of user's choice happens in MainWidget::showFilesChosenByUser()\n\n  return;\n}\n\n// Quickly find in what table row the current image is  \nint ChooseFilesDlg::imageRow(std::string const& image) const {\n  auto it = image_to_row.find(image);\n  if (it == image_to_row.end()) {\n    popUp(\"Cannot find image in table.\");\n    return 0;\n  }\n  return it->second;\n}\n  \n// Check if the given image is hidden (not shown) based on the table checkbox  \nbool ChooseFilesDlg::isHidden(std::string const& image) const {\n\n  int row = imageRow(image);\n  QTableWidgetItem *item = m_filesTable->item(row, 0);\n  // TODO(oalexan1): Use below a function called image(int id).\n  // There are more places like that.\n  std::string curr_image = (m_filesTable->item(row, 1)->data(0)).toString().toStdString();\n  if (image == curr_image)\n    return (item->checkState() == Qt::Unchecked);\n  return false;\n}\n\n// Hide the given image  \nvoid ChooseFilesDlg::hide(std::string const& image) {\n  int image_id = imageRow(image);\n  ChooseFilesDlg::hide(image_id);\n}\nvoid ChooseFilesDlg::hide(int image_id) {\n  QTableWidgetItem *item = m_filesTable->item(image_id, 0);\n  item->setCheckState(Qt::Unchecked);\n}\n\n// Show the given image by turning on the checkbox in the table\nvoid ChooseFilesDlg::unhide(std::string const& image) {\n  int image_id = imageRow(image);\n  ChooseFilesDlg::unhide(image_id);\n}\nvoid ChooseFilesDlg::unhide(int image_id) {\n  QTableWidgetItem *item = m_filesTable->item(image_id, 0);\n  item->setCheckState(Qt::Checked);\n}\n\n// Show this many of the first several input images\nvoid ChooseFilesDlg::setNumImagesToShow(int num) {\n\n  int rows = m_filesTable->rowCount();\n  for (int row = 0; row < std::min(num, rows); row++) {\n    QTableWidgetItem *item = m_filesTable->item(row, 0);\n    item->setCheckState(Qt::Checked);\n  }\n  for (int row = num; row < rows; row++) {\n    QTableWidgetItem *item = m_filesTable->item(row, 0);\n    item->setCheckState(Qt::Unchecked);\n  }\n}\n  \n// Show all images\nvoid ChooseFilesDlg::showAllImages() {\n  int rows = m_filesTable->rowCount();\n  for (int row = 0; row < rows; row++) {\n    QTableWidgetItem *item = m_filesTable->item(row, 0);\n    item->setCheckState(Qt::Checked);\n  }\n}\n\n// Number of images being shown\nint ChooseFilesDlg::numShown() {\n  int num = 0;\n  int rows = m_filesTable->rowCount();\n  for (int row = 0; row < rows; row++) {\n    QTableWidgetItem *item = m_filesTable->item(row, 0);\n    num += (item->checkState() == Qt::Checked);\n  }\n\n  return num;\n}\n\n// If some images are shown, hide all. Else, show all.\nvoid ChooseFilesDlg::hideShowAll() {\n\n  int rows = m_filesTable->rowCount();\n\n  // See if all files are hidden\n  bool allOff = true;\n  for (int rowIter = 0; rowIter < rows; rowIter++){\n    QTableWidgetItem *item = m_filesTable->item(rowIter, 0);\n    if (item->checkState() == Qt::Checked){\n      allOff = false;\n    }\n  }\n  \n  // If all files are hidden, we will show all. Else hide all.\n  for (int rowIter = 0; rowIter < rows; rowIter++){\n    QTableWidgetItem *item = m_filesTable->item(rowIter, 0);\n    // TODO(oalexan1): Use below a function called image(int id).\n    std::string fileName = (m_filesTable->item(rowIter, 1)->data(0)).toString().toStdString();\n    if (allOff)\n      item->setCheckState(Qt::Checked);\n    else\n      item->setCheckState(Qt::Unchecked);\n  }\n\n  // Force the horizontal scrollbar in the table to go left, so one can see\n  // the checkboxes.\n  QScrollBar * hScrollBar = m_filesTable->horizontalScrollBar();\n  hScrollBar->triggerAction(QScrollBar::SliderToMinimum);\n}\n\nvoid ChooseFilesDlg::viewOtherImage(int delta) {\n  if (delta != -1 && delta != 1) \n    return;\n  \n  int rows = m_filesTable->rowCount();\n  \n  if (rows == 0) \n    return;\n  \n  // First see how many images have a checkbox now, so are being shown\n  std::set<int> shown;\n  for (int rowIter = 0; rowIter < rows; rowIter++) {\n    QTableWidgetItem *item = m_filesTable->item(rowIter, 0);\n    if (item->checkState() == Qt::Checked)\n      shown.insert(rowIter);\n  }\n  \n  // If no images are being shown or more than one, show the first\n  int shownRow = 0;\n  if (shown.size() == 1) {\n    // Else show the next or previous image. Note how we add 'rows'\n    // before we find the remainder, as delta could be negative.\n    shownRow = *shown.begin();\n    shownRow = (shownRow + delta + rows) % rows;\n  }\n  \n  // Show the next/previous one, and hide the rest \n  for (int rowIter = 0; rowIter < rows; rowIter++){\n    QTableWidgetItem *item = m_filesTable->item(rowIter, 0);\n    if (rowIter == shownRow)\n      item->setCheckState(Qt::Checked);\n    else\n      item->setCheckState(Qt::Unchecked);\n  }\n  \n  // Print count and image file (count starts from 1)\n  // TODO(oalexan1): Implement a function called image(int id) to avoid this\n  // lengthy text. It can be used in other places too.\n  std::string fileName = (m_filesTable->item(shownRow, 1)->data(0)).toString().toStdString();\n  vw_out() << \"Image: \" << shownRow + 1  << ' ' << fileName << \"\\n\";\n}\n  \nvoid ChooseFilesDlg::keyPressEvent(QKeyEvent *event) {\n  // std::cout << \"Key was pressed \" << event->key() << std::endl;\n}\n\n} // namespace asp\n"
  },
  {
    "path": "src/asp/GUI/ChooseFilesDlg.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n// \\file ChooseFilesDlg.h\n// \n// A dialog for user to choose which files to show.\n// \n#ifndef __STEREO_GUI_CHOOSE_FILES_DLG_H__\n#define __STEREO_GUI_CHOOSE_FILES_DLG_H__\n\n// Qt\n#include <QWidget>\n#include <QTableWidget>\n\n#include <map>\n#include <string>\n\nnamespace asp {\n\n  class imageData;\n  \n  // Class to create a file list on the left side of the window\n  class ChooseFilesDlg: public QWidget{\n    Q_OBJECT\n\n  public:\n    ChooseFilesDlg(QWidget * parent);\n    ~ChooseFilesDlg();\n    void chooseFiles(const std::vector<std::string> & image_files);\n\n    QTableWidget * getFilesTable(){ return m_filesTable; }\n    static QString selectFilesTag(){ return \"\"; }\n\n    // Check if the given image is hidden (not shown) based on the table checkbox  \n    bool isHidden(std::string const& image) const;\n    // Hide the given image  \n    void hide(std::string const& image);\n    void hide(int image_id);\n    // Show the given image  \n    void unhide(std::string const& image);\n    void unhide(int image_id);\n\n    // Show this many of the first several input images\n    void setNumImagesToShow(int num);\n    \n    // Show all images\n    void showAllImages();\n\n    // Number of images being shown\n    int numShown(); \n\n    // If some images are shown, hide all. Else, show all.\n    void hideShowAll();\n\n    void viewOtherImage(int delta);\n    \n  private:\n    int imageRow(std::string const& image) const;\n    QTableWidget * m_filesTable;\n    void keyPressEvent(QKeyEvent *event);\n    std::map<std::string, int> image_to_row;\n  };\n  \n} // namespace asp\n\n#endif  // __STEREO_GUI_CHOOSE_FILES_DLG_H__\n"
  },
  {
    "path": "src/asp/GUI/DiskImagePyramidMultiChannel.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2024, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/GUI/DiskImagePyramidMultiChannel.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/asp_config.h>\n\n#if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1\n#include <asp/IsisIO/DiskImageResourceIsis.h>\n#endif\n\n#include <vw/Core/Stopwatch.h>\n#include <vw/Image/Colormap.h>\n#include <QtWidgets>\n\n#include <cmath>\n#include <string>\n#include <vector>\n\nusing namespace vw;\n\nnamespace asp {\n\nvw::RunOnce temporary_files_once = VW_RUNONCE_INIT;\nboost::shared_ptr<TemporaryFiles> temporary_files_ptr;\nvoid init_temporary_files() {\n  temporary_files_ptr = boost::shared_ptr<TemporaryFiles>(new TemporaryFiles());\n}\n\nTemporaryFiles& temporary_files() {\n  temporary_files_once.run(init_temporary_files);\n  return *temporary_files_ptr;\n}\n\n// Form a QImage to show on screen from a single-channel double image.\n// Scale pixel values to [0, 255] and handle nodata. If colormap is not null,\n// apply it to produce colorized output instead of grayscale.\nvoid formQimageFloat(bool highlight_nodata, double nodata_val,\n                     float valid_min, float valid_max,\n                     vw::Vector2 const& approx_bounds,\n                     ImageView<double> const& clip,\n                     vw::Colormap const* colormap,\n                     QImage & qimg) {\n\n  double min_val = approx_bounds[0];\n  double max_val = approx_bounds[1];\n  bool has_valid_range = !std::isnan(valid_min) && !std::isnan(valid_max);\n\n  qimg = QImage(clip.cols(), clip.rows(), QImage::Format_ARGB32_Premultiplied);\n\n  #pragma omp parallel for\n  for (int col = 0; col < clip.cols(); col++) {\n    for (int row = 0; row < clip.rows(); row++) {\n\n      double val = clip(col, row);\n      bool is_nodata = (val == nodata_val) || std::isnan(val);\n      if (!is_nodata && has_valid_range)\n        is_nodata = (val < valid_min) || (val > valid_max);\n      if (is_nodata) {\n        if (!highlight_nodata)\n          qimg.setPixel(col, row, QColor(0, 0, 0, 0).rgba());\n        else\n          qimg.setPixel(col, row, qRgb(255, 0, 0));\n        continue;\n      }\n\n      double v = clip(col, row);\n      double s = (std::max(v, min_val) - min_val) / (max_val - min_val);\n      s = std::min(std::max(0.0, s), 1.0);\n\n      if (colormap != nullptr) {\n        vw::PixelRGB<vw::uint8> c = (*colormap)(s).child();\n        qimg.setPixel(col, row, QColor(c[0], c[1], c[2], 255).rgba());\n      } else {\n        int gray = round(255.0 * s);\n        qimg.setPixel(col, row, QColor(gray, gray, gray, 255).rgba());\n      }\n    }\n  }\n}\n\n// Form a QImage from a two-channel uint8 image (grayscale + mask).\nvoid formQimageGrayAlpha(ImageView<Vector<vw::uint8, 2>> const& clip,\n                         QImage & qimg) {\n\n  qimg = QImage(clip.cols(), clip.rows(), QImage::Format_ARGB32_Premultiplied);\n  #pragma omp parallel for\n  for (int col = 0; col < clip.cols(); col++) {\n    for (int row = 0; row < clip.rows(); row++) {\n      Vector<vw::uint8, 2> v = clip(col, row);\n      if (v[1] > 0 && v == v) // need the latter for NaN\n        qimg.setPixel(col, row, QColor(v[0], v[0], v[0], 255).rgba());\n      else\n        qimg.setPixel(col, row, QColor(0, 0, 0, 0).rgba());\n    }\n  }\n}\n\n// Form a QImage from a 3 or 4 channel uint8 image (RGB or RGBA).\ntemplate<class PixelT>\nvoid formQimageRGB(ImageView<PixelT> const& clip, QImage & qimg) {\n\n  qimg = QImage(clip.cols(), clip.rows(), QImage::Format_ARGB32_Premultiplied);\n\n  #pragma omp parallel for\n  for (int col = 0; col < clip.cols(); col++) {\n    for (int row = 0; row < clip.rows(); row++) {\n      PixelT v = clip(col, row);\n      if (v != v) // NaN, set to transparent\n        qimg.setPixel(col, row, QColor(0, 0, 0, 0).rgba());\n      else if (v.size() == 3)\n        qimg.setPixel(col, row, QColor(v[0], v[1], v[2], 255).rgba());\n      else if (v.size() > 3)\n        qimg.setPixel(col, row, QColor(v[0], v[1], v[2], 255*(v[3] > 0)).rgba());\n      else\n        qimg.setPixel(col, row, QColor(v[0], v[0], v[0], 255).rgba());\n    }\n  }\n}\n\nDiskImagePyramidMultiChannel::\nDiskImagePyramidMultiChannel(std::string const& image_file,\n                             vw::GdalWriteOptions const& opt,\n                             int top_image_max_pix, int subsample):\n  m_opt(opt), m_num_channels(0), m_rows(0), m_cols(0), m_type(UNINIT),\n  m_valid_min(std::numeric_limits<float>::quiet_NaN()),\n  m_valid_max(std::numeric_limits<float>::quiet_NaN()) {\n\n  if (image_file == \"\")\n    return;\n\n  int & lowres_size = asp::stereo_settings().lowest_resolution_subimage_num_pixels; // alias\n  if (lowres_size <= 0) // bug fix, longer term need to improve the workflow\n    lowres_size = LOWRES_SIZE_DEFAULT;\n\n  boost::shared_ptr<DiskImageResource> image_rsrc\n    = vw::DiskImageResourcePtr(image_file);\n  ImageFormat image_fmt = image_rsrc->format();\n\n  // Redirect to the correctly typed function to perform the actual map projection.\n  // - Must correspond to the type of the input image.\n  // Instantiate the correct DiskImagePyramid then record information including\n  //  the list of temporary files it created.\n  try {\n    m_num_channels = get_num_channels(image_file);\n\n    if (m_num_channels > 1 && image_fmt.channel_type != VW_CHANNEL_UINT8) {\n      vw_out() << \"File \" << image_file << \" has more than one band, and the \"\n               << \"bands are not unsigned int. Reading only the first band in \"\n               << \"double precision.\\n\";\n    }\n\n    // For ISIS .cub files, get the valid pixel range so the pyramid\n    // masks special pixels (LIS, LRS, HIS, HRS) during subsampling.\n    float valid_min = std::numeric_limits<float>::quiet_NaN();\n    float valid_max = std::numeric_limits<float>::quiet_NaN();\n#if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1\n    if (boost::filesystem::path(image_file).extension() == \".cub\") {\n      try {\n        vw::DiskImageResourceIsis isis_rsrc(image_file);\n        valid_min = isis_rsrc.valid_minimum();\n        valid_max = isis_rsrc.valid_maximum();\n      } catch (...) {}\n    }\n#endif\n    m_valid_min = valid_min;\n    m_valid_max = valid_max;\n\n    if (m_num_channels == 1 || image_fmt.channel_type != VW_CHANNEL_UINT8) {\n      // Single channel image with float pixels.\n\n      m_img_ch1_float =\n        vw::mosaic::DiskImagePyramid<float>(image_file, m_opt, lowres_size,\n                                            2, valid_min, valid_max);\n      m_rows = m_img_ch1_float.rows();\n      m_cols = m_img_ch1_float.cols();\n      m_type = CH1_FLOAT;\n      temporary_files().files.insert(m_img_ch1_float.get_temporary_files().begin(),\n                                     m_img_ch1_float.get_temporary_files().end());\n    } else if (m_num_channels == 2) {\n      // uint8 image with an alpha channel.\n      m_img_ch2_uint8 = vw::mosaic::DiskImagePyramid<Vector<vw::uint8, 2>>\n        (image_file, m_opt, lowres_size);\n      m_num_channels = 2; // we read only 1 channel\n      m_rows = m_img_ch2_uint8.rows();\n      m_cols = m_img_ch2_uint8.cols();\n      m_type = CH2_UINT8;\n      temporary_files().files.insert(m_img_ch2_uint8.get_temporary_files().begin(),\n                                     m_img_ch2_uint8.get_temporary_files().end());\n    } else if (m_num_channels == 3) {\n      // RGB image with three uint8 channels.\n      m_img_ch3_uint8 = vw::mosaic::DiskImagePyramid<Vector<vw::uint8, 3>>\n        (image_file, m_opt, lowres_size);\n      m_num_channels = 3;\n      m_rows = m_img_ch3_uint8.rows();\n      m_cols = m_img_ch3_uint8.cols();\n      m_type = CH3_UINT8;\n      temporary_files().files.insert(m_img_ch3_uint8.get_temporary_files().begin(),\n                                     m_img_ch3_uint8.get_temporary_files().end());\n    } else if (m_num_channels == 4) {\n      // RGB image with three uint8 channels and an alpha channel\n      m_img_ch4_uint8 = vw::mosaic::DiskImagePyramid<Vector<vw::uint8, 4>>\n        (image_file, m_opt, lowres_size);\n      m_num_channels = 4;\n      m_rows = m_img_ch4_uint8.rows();\n      m_cols = m_img_ch4_uint8.cols();\n      m_type = CH4_UINT8;\n      temporary_files().files.insert(m_img_ch4_uint8.get_temporary_files().begin(),\n                                     m_img_ch4_uint8.get_temporary_files().end());\n    } else {\n      vw_throw(ArgumentErr() << \"Unsupported image with \" << m_num_channels\n               << \" bands.\\n\");\n    }\n  } catch (const Exception& e) {\n    // Do not invoke popUp() here, since this function can be called without a GUI.\n      vw_throw(ArgumentErr() << e.what());\n      return;\n  }\n}\n\ndouble DiskImagePyramidMultiChannel::get_nodata_val() const {\n\n  // Extract the clip, then convert it from VW format to QImage format.\n  if (m_type == CH1_FLOAT) {\n    return m_img_ch1_float.get_nodata_val();\n  } else if (m_type == CH2_UINT8) {\n    return m_img_ch2_uint8.get_nodata_val();\n  } else if (m_type == CH3_UINT8) {\n    return m_img_ch3_uint8.get_nodata_val();\n  } else if (m_type == CH4_UINT8) {\n    return m_img_ch4_uint8.get_nodata_val();\n  } else {\n    vw_throw(ArgumentErr() << \"Unsupported image with \" << m_num_channels << \" bands\\n\");\n  }\n}\n\nvoid DiskImagePyramidMultiChannel::get_image_clip(double scale_in,\n                  vw::BBox2i region_in,\n                  bool highlight_nodata,\n                  vw::Colormap const* colormap,\n                  vw::Vector2 const& bounds_override,\n                  QImage & qimg, double & scale_out,\n                  vw::BBox2i & region_out) const {\n\n  vw::Vector2 approx_bounds;\n\n  // Extract the clip, then convert it from VW format to QImage format.\n  if (m_type == CH1_FLOAT) {\n\n    //Stopwatch sw0;\n    //sw0.start();\n    if (bounds_override[0] < bounds_override[1]) {\n      // Use the caller-provided bounds (joint min/max or user --min/--max)\n      approx_bounds = bounds_override;\n    } else if (asp::stereo_settings().min < asp::stereo_settings().max) {\n      // If the min and max are set, not NaN, and first is less than the second\n      approx_bounds = vw::Vector2(asp::stereo_settings().min,\n                                  asp::stereo_settings().max);\n    } else {\n      // Normally these are auto-estimated rather well, except for images with\n      // most data being very small, like in shadow.\n      approx_bounds = m_img_ch1_float.approx_bounds();\n    }\n\n    // Ensure the bounds are always distinct\n    if (approx_bounds[0] >= approx_bounds[1] &&\n        approx_bounds[1] > -std::numeric_limits<double>::max())\n      approx_bounds[0] = approx_bounds[1] - 1.0;\n\n    //sw0.stop();\n    //vw_out() << \"Render time sw0 (seconds): \" << sw0.elapsed_seconds() << std::endl;\n\n    ImageView<float> clip;\n    //Stopwatch sw1;\n    //sw1.start();\n    m_img_ch1_float.get_image_clip(scale_in, region_in, clip, scale_out, region_out);\n    //sw1.stop();\n    //vw_out() << \"Render time sw1 (seconds): \" << sw1.elapsed_seconds() << std::endl;\n\n    //Stopwatch sw2;\n    //sw2.start();\n    formQimageFloat(highlight_nodata, m_img_ch1_float.get_nodata_val(),\n                    m_valid_min, m_valid_max,\n                    approx_bounds, clip, colormap, qimg);\n    //sw2.stop();\n    //vw_out() << \"Render time sw2 (seconds): \" << sw2.elapsed_seconds() << std::endl;\n  } else if (m_type == CH2_UINT8) {\n\n    ImageView<Vector<vw::uint8, 2>> clip;\n    //Stopwatch sw4;\n    //sw4.start();\n    m_img_ch2_uint8.get_image_clip(scale_in, region_in, clip,\n                                 scale_out, region_out);\n    //sw4.stop();\n    //vw_out() << \"Render time sw4 (seconds): \" << sw4.elapsed_seconds() << std::endl;\n\n    //Stopwatch sw5;\n    //sw5.start();\n    formQimageGrayAlpha(clip, qimg);\n    //sw5.stop();\n    //vw_out() << \"Render time sw5 (seconds): \" << sw5.elapsed_seconds() << std::endl;\n\n  } else if (m_type == CH3_UINT8) {\n    ImageView<Vector<vw::uint8, 3>> clip;\n    //Stopwatch sw6;\n    //sw6.start();\n    m_img_ch3_uint8.get_image_clip(scale_in, region_in, clip,\n                                 scale_out, region_out);\n    //sw6.stop();\n    //vw_out() << \"Render time sw6 (seconds): \" << sw6.elapsed_seconds() << std::endl;\n\n    //Stopwatch sw7;\n    //sw7.start();\n    formQimageRGB(clip, qimg);\n    //sw7.stop();\n    //vw_out() << \"Render time sw7 (seconds): \" << sw7.elapsed_seconds() << std::endl;\n\n  } else if (m_type == CH4_UINT8) {\n    //Stopwatch sw8;\n    //sw8.start();\n    ImageView<Vector<vw::uint8, 4>> clip;\n    m_img_ch4_uint8.get_image_clip(scale_in, region_in, clip,\n          scale_out, region_out);\n    //sw8.stop();\n    //vw_out() << \"Render time sw8 (seconds): \" << sw8.elapsed_seconds() << std::endl;\n\n    //Stopwatch sw9;\n    //sw9.start();\n    formQimageRGB(clip, qimg);\n    //sw9.stop();\n    //vw_out() << \"Render time sw9 (seconds): \" << sw9.elapsed_seconds() << std::endl;\n  } else {\n    vw_throw(ArgumentErr() << \"Unsupported image with \" << m_num_channels << \" bands\\n\");\n  }\n}\n\nstd::string DiskImagePyramidMultiChannel::get_value_as_str(int32 x, int32 y) const {\n\n  // Below we cast from Vector<uint8> to Vector<double>, as the former\n  // refuses to print well.\n  std::ostringstream os;\n  if (m_type == CH1_FLOAT) {\n    os << m_img_ch1_float.bottom()(x, y, 0);\n  } else if (m_type == CH2_UINT8) {\n    os << Vector2(m_img_ch2_uint8.bottom()(x, y, 0));\n  } else if (m_type == CH3_UINT8) {\n    os << Vector3(m_img_ch3_uint8.bottom()(x, y, 0));\n  } else if (m_type == CH4_UINT8) {\n    os << Vector4(m_img_ch4_uint8.bottom()(x, y, 0));\n  } else {\n    vw_throw(ArgumentErr() << \"Unsupported image with \" << m_num_channels << \" bands\\n\");\n  }\n\n  return os.str();\n}\n\ndouble DiskImagePyramidMultiChannel::get_value_as_double(int32 x, int32 y) const {\n  if (m_type == CH1_FLOAT) {\n    return m_img_ch1_float.bottom()(x, y, 0);\n  } else if (m_type == CH2_UINT8) {\n    return m_img_ch2_uint8.bottom()(x, y, 0)[0];\n  } else {\n    vw_throw(ArgumentErr() << \"Unsupported image with \" << m_num_channels << \" bands\\n\");\n  }\n  return 0;\n}\n\n} // namespace asp\n"
  },
  {
    "path": "src/asp/GUI/DiskImagePyramidMultiChannel.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2024, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n// \\file DiskImagePyramidMultiChannel.h\n// \n// Functions for managing multi-channel images and converting\n// them to QImage.\n// \n#ifndef __STEREO_GUI_DISK_IMAGE_PYRAMID_MULTICHANNEL_H__\n#define __STEREO_GUI_DISK_IMAGE_PYRAMID_MULTICHANNEL_H__\n\n#include <asp/GUI/GuiBase.h>\n#include <asp/GUI/GuiConstants.h>\n\n#include <vw/Core/Thread.h>\n#include <vw/Core/Log.h>\n#include <vw/Image/ImageViewRef.h>\n#include <vw/Image/ImageView.h>\n#include <vw/Math/BBox.h>\n#include <vw/Math/Vector.h>\n#include <vw/Mosaic/DiskImagePyramid.h>\n#include <vw/Core/RunOnce.h>\n#include <vw/Core/Stopwatch.h>\n\n#include <boost/filesystem/path.hpp>\n#include <boost/filesystem.hpp>\n#include <boost/mpl/or.hpp>\n#include <boost/foreach.hpp> // Must be before Qt headers\n#include <omp.h>\n\n#include <QWidget>\n\n#include <string>\n#include <vector>\n#include <list>\n#include <set>\n\nnamespace vw {\n  class Colormap;\n}\n\nnamespace asp {\n\n  // The kinds of images we support\n  enum ImgType {UNINIT, CH1_FLOAT, CH2_UINT8, CH3_UINT8, CH4_UINT8};\n\n  // A global structure to hold all the temporary files we have created\n  struct TemporaryFiles {\n    std::set<std::string> files;\n  };\n  // Access the global list of temporary files\n  TemporaryFiles& temporary_files();\n\n  // An image class that supports 1 to 3 channels.  We use\n  // DiskImagePyramid<float> to be able to use some of the\n  // pre-defined member functions for an image class. This class\n  // is not a perfect solution, but there seem to be no easy way\n  // in ASP to handle images with variable numbers of channels.\n  // TODO: Add the case when multi-channel images also have float or double pixels\n  struct DiskImagePyramidMultiChannel {\n    vw::GdalWriteOptions m_opt;\n    vw::mosaic::DiskImagePyramid<float>                m_img_ch1_float;\n    vw::mosaic::DiskImagePyramid<vw::Vector<vw::uint8, 2>> m_img_ch2_uint8;\n    vw::mosaic::DiskImagePyramid<vw::Vector<vw::uint8, 3>> m_img_ch3_uint8;\n    vw::mosaic::DiskImagePyramid<vw::Vector<vw::uint8, 4>> m_img_ch4_uint8;\n    int m_num_channels;\n    int m_rows, m_cols;\n    ImgType m_type; // keeps track of which of the above images we use\n    float m_valid_min; // ISIS valid pixel range (NaN if not applicable)\n    float m_valid_max;\n\n    // Constructor\n    DiskImagePyramidMultiChannel(std::string const& image_file = \"\",\n                                 vw::GdalWriteOptions const&\n                                 opt = vw::GdalWriteOptions(),\n                                 int top_image_max_pix = TOP_IMAGE_MAX_PIX,\n                                 int subsample = PYRAMID_SUBSAMPLE);\n\n    // This function will return a QImage to be shown on screen.\n    // How we create it, depends on the type of image we want to display.\n    void get_image_clip(double scale_in, vw::BBox2i region_in,\n                        bool highlight_nodata,\n                        vw::Colormap const* colormap,\n                        vw::Vector2 const& bounds_override,\n                        QImage & qimg, double & scale_out,\n                        vw::BBox2i & region_out) const;\n    double get_nodata_val() const;\n\n    vw::int32 cols  () const { return m_cols;  }\n    vw::int32 rows  () const { return m_rows;  }\n    vw::int32 planes() const { return m_num_channels; }\n\n    // Return the element at this location (at the lowest level) cast to double.\n    // - Only works for single channel pyramids!\n    double get_value_as_double(vw::int32 x, vw::int32 y) const;\n\n    // Return value as string\n    std::string get_value_as_str(vw::int32 x, vw::int32 y) const;\n  };\n\n} // namespace asp\n\n#endif  // __STEREO_GUI_DISK_IMAGE_PYRAMID_MULTICHANNEL_H__\n"
  },
  {
    "path": "src/asp/GUI/EventWidget.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  https://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// \\file EventWidget.cc\n//\n// Member functions of MainWidget that handle mouse, keyboard,\n// and other input events.\n\n#include <asp/GUI/MainWidget.h>\n#include <asp/GUI/GuiConstants.h>\n#include <asp/GUI/GuiGeom.h>\n#include <asp/GUI/ChooseFilesDlg.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/GUI/WidgetMenuMgr.h>\n\n#include <vw/Geometry/geomUtils.h>\n\n#include <QtGui>\n#include <QtWidgets>\n\nusing namespace vw;\n\nnamespace asp {\n\n// All functions here are member functions of MainWidget, but are moved\n// to this file to reduce the size of MainWidget.cc.\n\nvoid MainWidget::mousePressEvent(QMouseEvent *event) {\n\n  // For rubberband\n  m_mousePrsX  = event->pos().x();\n  m_mousePrsY  = event->pos().y();\n  m_rubberBand = m_emptyRubberBand;\n\n  m_curr_pixel_pos = QPoint2Vec(QPoint(m_mousePrsX, m_mousePrsY)); // Record where we clicked\n  updateCurrentMousePosition();\n\n  // Need this for panning\n  m_last_view = m_current_view;\n\n  // Check if the user is holding down the crop window key.\n  m_cropWinMode = ((event->buttons  () & Qt::LeftButton) &&\n                    (event->modifiers() & Qt::ControlModifier));\n\n  m_match_mgr.m_editMatchPointVecIndex = -1; // Keep this initialized\n\n  // If the user is currently editing match points\n  if (!m_polyEditMode && m_wid_menu_mgr->m_moveMatchPoint->isChecked()\n      && !m_cropWinMode && asp::stereo_settings().view_matches) {\n\n    m_match_mgr.m_editingMatches = true;\n\n    Vector2 P = screen2world(Vector2(m_mousePrsX, m_mousePrsY));\n    P = app_data.world2image_trans(P, m_base_image_id);\n\n    // Find the match point we want to move\n    double dist_limit = MATCH_POINT_DISTANCE_LIMIT;\n    m_match_mgr.m_editMatchPointVecIndex\n      = m_match_mgr.m_matchlist.findNearestMatchPoint(m_beg_image_id, P, dist_limit);\n\n    if (asp::stereo_settings().view_matches) {\n      // Update IP draw color\n      // Will keep the zoom level\n      emit updateMatchesSignal();\n    } else {\n      // Will reset the layout before continuing with matches\n      asp::stereo_settings().view_matches = true;\n      emit toggleViewMatchesSignal();\n    }\n  } // End match point update case\n\n  // If the user is currently editing polygons\n  if (m_polyEditMode && m_wid_menu_mgr->m_moveVertex->isChecked() && !m_cropWinMode) {\n\n    Vector2 P = screen2world(Vector2(m_mousePrsX, m_mousePrsY));\n    m_world_box.grow(P); // to not cut when plotting later\n\n    // Find the vertex we want to move\n    asp::PolySearchResult sr;\n    asp::findClosestPolyVertex(P.x(), P.y(), app_data,\n                               m_beg_image_id, m_end_image_id, sr);\n    m_editClipIndex           = sr.clipIndex;\n    m_editPolyVecIndex        = sr.polyVecIndex;\n    m_editIndexInCurrPoly     = sr.polyIndexInCurrPoly;\n    m_editVertIndexInCurrPoly = sr.vertIndexInCurrPoly;\n\n    // This will redraw just the polygons, not the pixmap\n    update();\n\n    // The action will continue in mouseMoveEvent()\n\n  } // End polygon update case\n\n} // End function mousePressEvent()\n\nvoid MainWidget::mouseMoveEvent(QMouseEvent *event) {\n\n  QPoint Q = event->pos();\n  int mouseMoveX = Q.x(), mouseMoveY = Q.y();\n\n  m_curr_pixel_pos = QPoint2Vec(Q);\n  updateCurrentMousePosition();\n\n  if (!(event->buttons() & Qt::LeftButton))\n    return;\n\n  // The mouse is pressed and moving\n  m_cropWinMode = ((event->buttons  () & Qt::LeftButton) &&\n                   (event->modifiers() & Qt::ControlModifier));\n\n  if (handleMatchPointMove(mouseMoveX, mouseMoveY))\n    return;\n  if (handlePolyVertexMove(mouseMoveX, mouseMoveY))\n    return;\n  handleRubberBandDrag(mouseMoveX, mouseMoveY);\n} // End function mouseMoveEvent()\n\n// Handle match point dragging during mouse move\nbool MainWidget::handleMatchPointMove(int mouseMoveX, int mouseMoveY) {\n\n  if (m_polyEditMode || !m_wid_menu_mgr->m_moveMatchPoint->isChecked() ||\n      m_cropWinMode)\n    return false;\n\n  m_match_mgr.m_editingMatches = true;\n\n  // Error checking\n  if ((m_beg_image_id < 0) || (m_match_mgr.m_editMatchPointVecIndex < 0) ||\n        (!m_match_mgr.m_matchlist.pointExists(m_beg_image_id,\n          m_match_mgr.m_editMatchPointVecIndex)))\n    return true;\n\n  Vector2 P = screen2world(Vector2(mouseMoveX, mouseMoveY));\n  P = app_data.world2image_trans(P, m_base_image_id);\n\n  // Update the IP location\n  m_match_mgr.m_matchlist.setPointPosition(m_beg_image_id,\n    m_match_mgr.m_editMatchPointVecIndex, P.x(), P.y());\n\n  if (asp::stereo_settings().view_matches) {\n    // Update IP draw color\n    // Will keep the zoom level\n    emit updateMatchesSignal();\n  } else {\n    // Will reset the layout before continuing with matches\n    asp::stereo_settings().view_matches = true;\n    emit toggleViewMatchesSignal();\n  }\n  return true;\n}\n\n// Handle polygon vertex dragging during mouse move\nbool MainWidget::handlePolyVertexMove(int mouseMoveX, int mouseMoveY) {\n\n  if (!m_polyEditMode || !m_wid_menu_mgr->m_moveVertex->isChecked() ||\n      m_cropWinMode)\n    return false;\n\n  // If moving vertices\n  if (m_editClipIndex < 0 ||\n      m_editPolyVecIndex        < 0 ||\n      m_editIndexInCurrPoly     < 0 ||\n      m_editVertIndexInCurrPoly < 0)\n    return true;\n\n  Vector2 P = screen2world(Vector2(mouseMoveX, mouseMoveY));\n\n  m_world_box.grow(P); // to not cut when plotting later\n  P = app_data.world2proj(P, m_editClipIndex); // projected units\n  app_data.images[m_editClipIndex].polyVec[m_editPolyVecIndex]\n    .changeVertexValue(m_editIndexInCurrPoly,\n                       m_editVertIndexInCurrPoly, P.x(), P.y());\n  // This will redraw just the polygons, not the pixmap\n  update();\n  return true;\n}\n\n// Handle rubberband rectangle dragging during mouse move\nvoid MainWidget::handleRubberBandDrag(int mouseMoveX, int mouseMoveY) {\n\n  // Standard Qt rubberband trick. This is highly confusing.  The\n  // explanation for what is going on is the following.  We need to\n  // wipe the old rubberband, and draw a new one.  Hence just the\n  // perimeters of these two rectangles need to be re-painted,\n  // nothing else changes. The first updateRubberBand() call below\n  // schedules that the perimeter of the current rubberband be\n  // repainted, but the actual repainting, and this is the key, WILL\n  // HAPPEN LATER! Then we change m_rubberBand to the new value,\n  // then we schedule the repaint event on the new rubberband.\n  // Continued below.\n  updateRubberBand(m_rubberBand);\n  m_rubberBand = QRect(std::min(m_mousePrsX, mouseMoveX),\n                        std::min(m_mousePrsY, mouseMoveY),\n                        std::abs(mouseMoveX - m_mousePrsX),\n                        std::abs(mouseMoveY - m_mousePrsY));\n  updateRubberBand(m_rubberBand);\n  // Only now, a single call to MainWidget::PaintEvent() happens,\n  // even though it appears from above that two calls could happen\n  // since we requested two updates. This call updates the perimeter\n  // of the old rubberband, in effect wiping it, since the region\n  // occupied by the old rubberband is scheduled to be repainted,\n  // but the rubberband itself is already changed.  It also updates\n  // the perimeter of the new rubberband, and as can be seen in\n  // MainWidget::PaintEvent() the effect is to draw the rubberband.\n\n  if (m_cropWinMode && !m_allowMultipleSelections) {\n    // If there is on screen already a crop window, wipe it, as\n    // we are now in the process of creating a new one.\n    QRect R = bbox2qrect(world2screen(m_stereoCropWin));\n    updateRubberBand(R);\n    m_stereoCropWin = BBox2();\n    R = bbox2qrect(world2screen(m_stereoCropWin));\n    updateRubberBand(R);\n  }\n}\n\n// The action to take when a user releases the mouse close to where it was pressed\nvoid MainWidget::handlePixelClick(int mouseRelX, int mouseRelY) {\n\n  // Threshold mode: early return\n  if (m_threshold.calcMode) {\n    handleThresholdClick(mouseRelX, mouseRelY);\n    return;\n  }\n\n  Vector2 p = screen2world(Vector2(mouseRelX, mouseRelY));\n  if (!m_profile.mode && !m_polyEditMode) {\n    QPainter paint;\n    paint.begin(&m_pixmap);\n    QPoint Q(mouseRelX, mouseRelY);\n    paint.setPen(QColor(\"red\"));\n    paint.drawEllipse(Q, 2, 2); // Draw the point, and make it a little larger\n    paint.end();  // Make sure to end the painting session\n  }\n\n  bool can_profile = m_profile.mode;\n\n  // Print pixel coordinates and image value.\n  for (int j = m_beg_image_id; j < m_end_image_id; j++) {\n\n    int it = m_filesOrder[j];\n\n    // Don't show files the user wants hidden\n    std::string fileName = app_data.images[it].name;\n    if (m_chooseFiles && m_chooseFiles->isHidden(fileName))\n      continue;\n\n    std::string val = \"none\";\n    Vector2 q = app_data.world2image_trans(p, it);\n\n    int col = floor(q[0]), row = floor(q[1]);\n\n    if (col >= 0 && row >= 0 && col < app_data.images[it].img().cols() &&\n        row < app_data.images[it].img().rows())\n      val = app_data.images[it].img().get_value_as_str(col, row);\n\n    vw_out() << \"Pixel and value: \" << app_data.images[it].name << \" (\"\n              << col << \", \" << row << \") \" << val << \"\\n\";\n\n    update();\n\n    if (m_profile.mode) {\n\n      // Sanity checks\n      if (m_end_image_id - m_beg_image_id != 1) {\n        popUp(\"A profile can be shown only when a single image is present.\");\n        can_profile = false;\n      }\n      int num_channels = app_data.images[it].img().planes();\n      if (num_channels != 1) {\n        popUp(\"A profile can be shown only when the image has a single channel.\");\n        can_profile = false;\n      }\n\n      if (!can_profile) {\n        MainWidget::setProfileMode(can_profile);\n        return;\n      }\n\n    } // End if m_profile.mode\n\n  } // end iterating over images\n\n  if (can_profile) {\n    // Save the current point the user clicked onto in the\n    // world coordinate system.\n    m_profile.x.push_back(p.x());\n    m_profile.y.push_back(p.y());\n\n    // PaintEvent() will be called, which will call\n    // plotProfilePolyLine() to show the polygonal line.\n\n    // Now show the profile.\n    MainWidget::plotProfile(app_data.images, m_profile.x, m_profile.y);\n\n    // TODO(oalexan1): Why is this buried in the short distance check?\n  } else if (m_polyEditMode) {\n    handlePolyEditClick(mouseRelX, mouseRelY);\n  }\n}\n\n// Handle poly edit mode click: move or add vertex\nvoid MainWidget::handlePolyEditClick(int mouseRelX, int mouseRelY) {\n\n  if (m_wid_menu_mgr->m_moveVertex->isChecked() && !m_cropWinMode) {\n    // Move vertex\n\n    if (m_editPolyVecIndex        < 0 ||\n        m_editIndexInCurrPoly     < 0 ||\n        m_editVertIndexInCurrPoly < 0)\n      return;\n\n    Vector2 P = screen2world(Vector2(mouseRelX, mouseRelY));\n    m_world_box.grow(P); // to not cut when plotting later\n    P = app_data.world2proj(P, m_polyLayerIndex); // projected units\n    app_data.images[m_polyLayerIndex].polyVec[m_editPolyVecIndex]\n      .changeVertexValue(m_editIndexInCurrPoly, m_editVertIndexInCurrPoly,\n                          P.x(), P.y());\n\n    // These are no longer needed for the time being\n    m_editPolyVecIndex        = -1;\n    m_editIndexInCurrPoly     = -1;\n    m_editVertIndexInCurrPoly = -1;\n\n    // This will redraw just the polygons, not the pixmap\n    update();\n    return;\n  }\n\n  // Add vertex\n  addPolyVert(mouseRelX, mouseRelY);\n}\n\n// Handle threshold mode pixel click\nvoid MainWidget::handleThresholdClick(int mouseRelX, int mouseRelY) {\n\n  // Image threshold mode. If we released the mouse where we\n  // pressed it, that means we want the current pixel value\n  // to be the threshold if larger than the existing threshold.\n  if (m_end_image_id - m_beg_image_id != 1) {\n    popUp(\"Must have just one image in each window to do \"\n          \"image threshold detection.\");\n    m_threshold.calcMode = false;\n    refreshPixmap();\n    return;\n  }\n\n  if (app_data.images[m_beg_image_id].img().planes() != 1) {\n    popUp(\"Thresholding makes sense only for single-channel images.\");\n    m_threshold.calcMode = false;\n    return;\n  }\n\n  if (app_data.use_georef) {\n    popUp(\"Thresholding is not supported when using georeference \"\n          \"information to show images.\");\n    m_threshold.calcMode = false;\n    return;\n  }\n\n  Vector2 p = screen2world(Vector2(mouseRelX, mouseRelY));\n  Vector2 q = app_data.world2image_trans(p, m_beg_image_id);\n\n  int col = round(q[0]), row = round(q[1]);\n  vw_out() << \"Clicked on pixel: \" << col << ' ' << row << std::endl;\n\n  if (col >= 0 && row >= 0 &&\n      col < app_data.images[m_beg_image_id].img().cols() &&\n      row < app_data.images[m_beg_image_id].img().rows()) {\n    double val = app_data.images[m_beg_image_id].img().get_value_as_double(\n      col, row);\n    m_threshold.value = std::max(m_threshold.value, val);\n  }\n\n  vw_out() << \"Image threshold for \"\n            << app_data.images[m_beg_image_id].name\n            << \": \" << m_threshold.value << std::endl;\n}\n\n// Handle crop win in mouse release event\nvoid MainWidget::handleCropWin() {\n\n  // If now we allow multiple selected regions, but we did not allow at\n  // the time the crop win was formed, save the crop win before it\n  // will be overwritten.\n  if (m_allowMultipleSelections && !m_stereoCropWin.empty()) {\n    if (m_selectionRectangles.empty() ||\n        m_selectionRectangles.back() != m_stereoCropWin) {\n      m_selectionRectangles.push_back(m_stereoCropWin);\n    }\n  }\n\n  // User selects the region to use for stereo.  Convert it to world\n  // coordinates, and round to integer.  If we use georeferences,\n  // the crop win is in projected units for the first image,\n  // so we must convert to pixels.\n  m_stereoCropWin = screen2world(qrect2bbox(m_rubberBand));\n\n  if (m_allowMultipleSelections && !m_stereoCropWin.empty())\n    m_selectionRectangles.push_back(m_stereoCropWin);\n\n  for (int j = m_beg_image_id; j < m_end_image_id; j++) {\n\n    int image_it = m_filesOrder[j];\n\n    // Don't show files the user wants hidden\n    std::string fileName = app_data.images[image_it].name;\n    if (m_chooseFiles && m_chooseFiles->isHidden(fileName))\n      continue;\n\n    BBox2 image_box = app_data.world2image_trans(m_stereoCropWin, image_it);\n    vw_out() << std::setprecision(8)\n              << \"src win for    \" << app_data.images[image_it].name << \": \"\n              << round(image_box.min().x()) << ' ' << round(image_box.min().y()) << ' '\n              << round(image_box.width())   << ' ' << round(image_box.height())  << std::endl;\n\n    if (app_data.images[image_it].has_georef) {\n      Vector2 proj_min, proj_max;\n      // Convert pixels to projected coordinates\n      BBox2 point_box;\n      if (app_data.images[image_it].isPolyOrCsv())\n        point_box = image_box;\n      else\n        point_box = app_data.images[image_it].georef.pixel_to_point_bbox(image_box);\n\n      proj_min = point_box.min();\n      proj_max = point_box.max();\n      // Below we flip in y to make gdal happy\n      vw_out() << std::setprecision(17)\n                << \"proj win for   \"\n                << app_data.images[image_it].name << \": \"\n                << proj_min.x() << ' ' << proj_max.y() << ' '\n                << proj_max.x() << ' ' << proj_min.y() << std::endl;\n\n      Vector2 lonlat_min, lonlat_max;\n      BBox2 lonlat_box = app_data.images[image_it].georef.point_to_lonlat_bbox(point_box);\n\n      lonlat_min = lonlat_box.min();\n      lonlat_max = lonlat_box.max();\n      // Again, miny and maxy are flipped on purpose\n      vw_out() << std::setprecision(17)\n                << \"lonlat win for \"\n                << app_data.images[image_it].name << \": \"\n                << lonlat_min.x() << ' ' << lonlat_max.y() << ' '\n                << lonlat_max.x() << ' ' << lonlat_min.y() << std::endl;\n    }\n  }\n\n  // Wipe the rubberband, no longer needed.\n  updateRubberBand(m_rubberBand);\n  m_rubberBand = m_emptyRubberBand;\n  updateRubberBand(m_rubberBand);\n\n  // Draw the crop window. This may not be precisely the rubberband\n  // since there is some loss of precision in conversion from\n  // Qrect to BBox2 and back. Note actually that we are not drawing\n  // here, we are scheduling this area to be updated, the drawing\n  // has to happen (with precisely this formula) in PaintEvent().\n  QRect R = bbox2qrect(world2screen(m_stereoCropWin));\n  updateRubberBand(R);\n\n  return;\n}\n\n// Zoom in or out after the user releases the mouse, depending on\n// the rubberband direction\nvoid MainWidget::zoomInOut(int mouseRelX, int mouseRelY) {\n\n  // Wipe the rubberband\n  updateRubberBand(m_rubberBand);\n  m_rubberBand = m_emptyRubberBand;\n  updateRubberBand(m_rubberBand);\n\n  m_can_emit_zoom_all_signal = true;\n\n  if (mouseRelX > m_mousePrsX && mouseRelY > m_mousePrsY) {\n\n    // Dragging the mouse from upper-left to lower-right zooms in\n\n    // The window selected with the mouse in world coordinates\n    Vector2 A = screen2world(Vector2(m_mousePrsX, m_mousePrsY));\n    Vector2 B = screen2world(Vector2(mouseRelX, mouseRelY));\n    BBox2 view = BBox2(A, B);\n\n    // Zoom to this window. Don't zoom so much that the view box\n    // ends up having size 0 to numerical precision.\n    if (!view.empty()) {\n      double ratio = double(m_window_width) / double(m_window_height);\n      m_current_view = vw::geometry::expandBoxToRatio(view, ratio);\n    }\n\n    // Must redraw the entire image\n    refreshPixmap();\n\n  } else if (mouseRelX < m_mousePrsX && mouseRelY < m_mousePrsY) {\n    // Dragging the mouse in reverse zooms out\n    double scale = 0.8;\n    zoom(scale);\n  }\n\n}\n\n// If a point was being moved, reset the ID and color. Points that are moved\n// are also set to valid.\nvoid MainWidget::adjustForEditMatchPoint() {\n  m_match_mgr.m_matchlist.setPointValid(m_beg_image_id, m_match_mgr.m_editMatchPointVecIndex, true);\n  m_match_mgr.m_editMatchPointVecIndex = -1;\n\n  if (asp::stereo_settings().view_matches) {\n    // Update IP draw color\n    // Will keep the zoom level\n    emit updateMatchesSignal();\n  } else {\n    // Will reset the layout before continuing with matches\n    asp::stereo_settings().view_matches = true;\n    emit toggleViewMatchesSignal();\n  }\n}\n\n// Handle mouse release events\nvoid MainWidget::mouseReleaseEvent(QMouseEvent *event) {\n\n  QPoint mouse_rel_pos = event->pos();\n  int mouseRelX = mouse_rel_pos.x();\n  int mouseRelY = mouse_rel_pos.y();\n\n  // Ctrl + left mouse button triggers crop window mode\n  if ((event->buttons() & Qt::LeftButton) &&\n      (event->modifiers() & Qt::ControlModifier)) {\n    m_cropWinMode = true;\n  }\n\n  if (app_data.images.empty())\n    return;\n\n  // If a point was being moved, reset the ID and color. Points that are moved\n  // are also set to valid.\n  if (m_match_mgr.m_editMatchPointVecIndex >= 0)\n    adjustForEditMatchPoint();\n\n  // If the mouse was released close to where it was pressed\n  if (std::abs(m_mousePrsX - mouseRelX) < m_pixelTol &&\n      std::abs(m_mousePrsY - mouseRelY) < m_pixelTol) {\n    handlePixelClick(mouseRelX, mouseRelY);\n    return;\n  }\n\n  // Do not zoom or do other funny stuff if we are moving IP or vertices\n  if (!m_polyEditMode && m_wid_menu_mgr->m_moveMatchPoint->isChecked() && !m_cropWinMode)\n    return;\n\n  if (m_polyEditMode && m_wid_menu_mgr->m_moveVertex->isChecked() && !m_cropWinMode)\n    return;\n\n  if (event->buttons() & Qt::RightButton) {\n    // Drag the image along the mouse movement\n    m_current_view -= (screen2world(QPoint2Vec(mouse_rel_pos)) -\n                        screen2world(QPoint2Vec(QPoint(m_mousePrsX, m_mousePrsY))));\n    refreshPixmap(); // will call paintEvent()\n    return;\n  }\n  if (m_cropWinMode) {\n    handleCropWin();\n    return;\n  }\n\n  if (Qt::LeftButton) {\n    zoomInOut(mouseRelX, mouseRelY);\n    return;\n  }\n\n  // At this stage the user is supposed to release the control key, so\n  // we are no longer in crop win mode, even if we were so far.\n  m_cropWinMode = false;\n\n  return;\n} // End mouseReleaseEvent()\n\nvoid MainWidget::mouseDoubleClickEvent(QMouseEvent *event) {\n  m_curr_pixel_pos = QPoint2Vec(event->pos());\n  updateCurrentMousePosition();\n}\n\nvoid MainWidget::wheelEvent(QWheelEvent *event) {\n  int num_degrees = event->angleDelta().y() / 8;\n  double num_ticks = double(num_degrees) / 360;\n\n  // Accumulate ticks\n  m_accumulatedZoomTicks += num_ticks;\n\n  // Merge all mouse wheel movements within this time frame. This prevents many\n  // incremental zoom actions.\n  m_zoomTimer->start(250);\n\n  m_curr_pixel_pos = QPointF2Vec(event->position());\n  updateCurrentMousePosition();\n}\n\nvoid MainWidget::enterEvent(QEvent *event) {\n}\n\nvoid MainWidget::leaveEvent(QEvent */*event*/) {\n}\n\nvoid MainWidget::keyPressEvent(QKeyEvent *event) {\n\n  // Save these before we modify the box\n  double width  = m_current_view.width();\n  double height = m_current_view.height();\n\n  double factor = 0.2;  // We will pan by moving by 20%.\n  switch (event->key()) {\n\n    // Pan\n  case Qt::Key_Left: // Pan left\n    m_current_view.min().x() -= width*factor;\n    m_current_view.max().x() -= width*factor;\n    m_can_emit_zoom_all_signal = true;\n    refreshPixmap();\n    break;\n  case Qt::Key_Right: // Pan right\n    m_current_view.min().x() += width*factor;\n    m_current_view.max().x() += width*factor;\n    m_can_emit_zoom_all_signal = true;\n    refreshPixmap();\n    break;\n  case Qt::Key_Up: // Pan up\n    m_current_view.min().y() -= height*factor;\n    m_current_view.max().y() -= height*factor;\n    m_can_emit_zoom_all_signal = true;\n    refreshPixmap();\n    break;\n  case Qt::Key_Down: // Pan down\n    m_current_view.min().y() += height*factor;\n    m_current_view.max().y() += height*factor;\n    m_can_emit_zoom_all_signal = true;\n    refreshPixmap();\n    break;\n\n  default:\n    QWidget::keyPressEvent(event);\n  }\n}\n\n// Apply the zoom after a delay to accumulate mouse wheel events\nvoid MainWidget::handleZoomTimeout() {\n\n  if (m_accumulatedZoomTicks == 0.0)\n    return;\n\n  // Multiply by 2.0 to make zooming more responsive\n  double mag = std::abs(2.0 * m_accumulatedZoomTicks);\n\n  double scale = 1;\n  if (m_accumulatedZoomTicks > 0)\n    scale = 1 + mag;\n  else if (m_accumulatedZoomTicks < 0)\n    scale = std::max(1 - mag, 0.5);\n\n  zoom(scale);\n\n  // Reset accumulated ticks after applying zoom\n  m_accumulatedZoomTicks = 0.0;\n}\n\nvoid MainWidget::contextMenuEvent(QContextMenuEvent *event) {\n\n  int x = event->x(), y = event->y();\n  m_mousePrsX = x;\n  m_mousePrsY = y;\n\n  m_wid_menu_mgr->setupContextMenu(this);\n\n  m_wid_menu_mgr->m_contextMenu->popup(mapToGlobal(QPoint(x,y)));\n  return;\n}\n\n} // namespace asp\n"
  },
  {
    "path": "src/asp/GUI/GuiArgs.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// \\file GuiArgs.cc\n// \n\n#include <asp/GUI/GuiArgs.h>\n#include <asp/GUI/ImageData.h>\n#include <asp/GUI/GuiUtilities.h>\n\n#include <vw/FileIO/FileTypes.h>\n#include <vw/FileIO/DiskImageView.h>\n\n#include <cstring>\n\nnamespace asp {\n\n// TODO(oalexan1): If the same file is repeated, will the book-keeping fail?\n// See the .h for more details.\nvoid preprocessArgs(int &argc, char** argv,\n                    std::vector<std::map<std::string, std::string>> & properties) {\n\n  // Defaults\n  std::string curr_style = \"default\";\n  std::string curr_color = \"default\";\n  std::string curr_colormap = \"binary-red-blue\";\n  std::string colorbar = \"0\";\n  std::string colorize = \"0\";\n\n  // Track whether an image appeared after a colorization option was set\n  bool image_after_color_opt = true;\n\n  // One set of properties for each argument. That to make sure that a filename\n  // can show up twice with different properties\n  int out_it = 1;\n  properties.resize(argc);\n  for (int it = 1; it < argc; it++) { // skip program name, so start from 1\n\n    if (std::string(argv[it]) == \"--style\") {\n      if (it == argc - 1)\n        continue; // There is nothing else\n\n      it++;\n      curr_style = argv[it]; // copy the style value, and move past it\n      continue;\n    }\n\n    if (std::string(argv[it]) == \"--color\") {\n      if (it == argc - 1)\n        continue; // There is nothing else\n\n      it++;\n      curr_color = argv[it]; // copy the color value, and move past it\n      continue;\n    }\n\n    if (std::string(argv[it]) == \"--colormap-style\") {\n      if (it == argc - 1)\n        continue; // There is nothing else\n\n      it++;\n      curr_colormap = argv[it]; // copy the color value, and move past it\n      image_after_color_opt = false;\n      continue;\n    }\n\n    // Sticky boolean flags with no value\n    if (std::string(argv[it]) == \"--colorbar\") {\n      colorbar = \"1\";\n      colorize = \"1\"; // --colorbar implies --colorize\n      image_after_color_opt = false;\n      continue;\n    }\n    if (std::string(argv[it]) == \"--no-colorbar\") {\n      colorbar = \"0\";\n      continue;\n    }\n    if (std::string(argv[it]) == \"--colorize\") {\n      colorize = \"1\";\n      image_after_color_opt = false;\n      continue;\n    }\n    if (std::string(argv[it]) == \"--no-colorize\") {\n      colorize = \"0\";\n      continue;\n    }\n\n    // If this argument does not start with a dash, so is not an\n    // option, assign to it the properties so far\n    if (argv[it][0] != '-') {\n      properties[it][\"name\"] = argv[it];\n      properties[it][\"style\"] = curr_style;\n      properties[it][\"color\"] = curr_color;\n      properties[it][\"colormap\"] = curr_colormap;\n      properties[it][\"colorbar\"] = colorbar;\n      properties[it][\"colorize\"] = colorize;\n      image_after_color_opt = true;\n    }\n\n    // Shift arguments left, which will wipe what we processed above\n    argv[out_it] = argv[it]; // this copies pointer addresses\n    out_it++;\n  }\n\n  // Warn if colorization options were set after all images\n  if (!image_after_color_opt)\n    vw::vw_out(vw::WarningMessage)\n      << \"Colorization options (--colormap-style, --colorize, --colorbar) \"\n      << \"were set after the last image, so they will not apply. \"\n      << \"Move them before the images they should affect, as they only \"\n      << \"apply to subsequent images.\\n\";\n\n  // Update the number of remaining arguments\n  argc = out_it;\n\n  return;\n}\n\nvoid lookupPropertyIndices(std::vector<std::map<std::string, std::string>> const&\n                           properties,\n                           std::vector<std::string> const& images,\n                           std::vector<int> & propertyIndices) {\n\n  propertyIndices.clear();\n\n  size_t start_p = 0;\n  for (size_t i = 0; i < images.size(); i++) {\n\n    for (size_t p_it = start_p; p_it < properties.size(); p_it++) {\n      auto key_ptr = properties[p_it].find(\"name\");\n      if (key_ptr == properties[p_it].end())\n        continue;\n      if (key_ptr->second == images[i]) {\n        start_p = p_it; // Found the right index for the property for the current file\n        break; \n      }\n    }\n\n    if (start_p >= properties.size()) {\n      if (properties.empty()) \n        vw::vw_throw(vw::ArgumentErr() << \"No image properties were found.\\n\");\n\n      // For the nvm case, to not go out of bounds\n      start_p = properties.size() - 1; \n    }\n    propertyIndices.push_back(start_p);\n\n    start_p++; // next time start the search after the entry just identified\n  }\n  \n}\n\n// Keep only image files, shape files, and csv files\nvoid filterImages(std::vector<std::string> & image_files) {\n\n  // Form a local copy\n  std::vector<std::string> local_files;\n \n  local_files.clear();\n  for (size_t i = 0; i < image_files.size(); i++) {\n    bool is_image = true;\n    try {\n      vw::DiskImageView<double> img(image_files[i]);\n    } catch(...) {\n      is_image = false;\n    }\n    \n    // Accept shape files and csv files alongside images\n    if (!is_image &&\n        !vw::has_shp_extension(image_files[i]) &&\n        !asp::hasCsv(image_files[i]))\n      continue;\n\n    local_files.push_back(image_files[i]);\n  }\n  \n  // Overwrite the input files\n  image_files = local_files;\n}\n\n// Remove option and vals\nvoid rmOptionVals(int argc, char ** argv, std::string const& opt, int num_vals) {\n  // Wipe say --left-image-crop-win 0 0 100 100, that is, an option\n  // with 4 values.\n  for (int i = 0; i < argc; i++) {\n    if (std::string(argv[i]) != opt)\n      continue;\n    \n    for (int j = i; j < i + num_vals + 1; j++) {\n      if (j >= argc) break;\n      // To avoid problems with empty strings, set the string to space instead\n      if (strlen(argv[j]) > 0) {\n        argv[j][0] = ' ';\n        argv[j][1] = '\\0';\n      }\n    }\n  }\n}\n\n} // namespace asp"
  },
  {
    "path": "src/asp/GUI/GuiArgs.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2024, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// \\file GuiArgs.h\n// \n\n#ifndef __ASP_GUI_GUI_ARGS_H__\n#define __ASP_GUI_GUI_ARGS_H__\n\n#include <string>\n#include <vector>\n#include <map>\n\n#include <vw/FileIO/GdalIO.h>\n#include <asp/GUI/GuiUtilities.h>\n\nnamespace asp {\n\n// Given an input string as:\n// stereo_gui --style line --color red --colormap-style inferno file1.txt \\\n//   --color green file2.txt\n// extract each style, color, and colormap. Any of these apply for any following\n// files, till modified by another such option. The default style and color\n// are \"default\". Later, these will be either read from the files\n// themselves, or otherwise set to \"line\" and \"green\". Then modify the\n// args to remove these options, as the boost parser cannot parse\n// repeated options.\nvoid preprocessArgs(int &argc, char** argv,\n                    std::vector<std::map<std::string, std::string>> & properties);\n\n// Given a vector of properties, with each property having a\n// potentially non-unique image name as an attribute and other\n// attributes as well, and a list of images, find the index of the\n// property for that image. Such logic is necessary because the same\n// image may show up twice, but with different properties each\n// time. So, the first occurrence of an image is matched to the first\n// occurrence of a property with that name, and so on. Also, there may\n// be properties for entities which are no longer in the list of\n// images.\nvoid lookupPropertyIndices(std::vector<std::map<std::string, std::string>> const&\n                           properties,\n                           std::vector<std::string> const& images,\n                           std::vector<int> & propertyIndices);\n\n// Filter the input files, keeping only the valid images, shape files, and csv files\nvoid filterImages(std::vector<std::string> & image_files);\n\n// Remove option and vals\nvoid rmOptionVals(int argc, char ** argv, std::string const& opt, int num_vals);\n\n} // namespace asp\n\n#endif  // __ASP_GUI_GUI_ARGS_H__\n"
  },
  {
    "path": "src/asp/GUI/GuiBase.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/GUI/GuiBase.h>\n#include <QtWidgets>\n#include <string>\n\nnamespace asp {\n\nvoid popUp(std::string const& msg){\n  QMessageBox msgBox;\n  msgBox.setText(msg.c_str());\n  msgBox.exec();\n  return;\n}\n\n} // namespace asp\n"
  },
  {
    "path": "src/asp/GUI/GuiBase.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n// \\file GuiBase.h\n// \n// Very low-level Qt functions\n// \n#ifndef __STEREO_GUI_GUI_BASE_H__\n#define __STEREO_GUI_GUI_BASE_H__\n\n#include <string>\n\nnamespace asp {\n\n  void popUp(std::string const& msg);\n  \n} // namespace asp\n\n#endif  // __STEREO_GUI_GUI_BASE_H__\n"
  },
  {
    "path": "src/asp/GUI/GuiConstants.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// \\file GuiConstants.h\n// \n// Magic numbers used across stereo_gui, centralized in one place.\n\n#ifndef __STEREO_GUI_CONSTANTS_H__\n#define __STEREO_GUI_CONSTANTS_H__\n\nnamespace asp {\n\n// Max pixels in top pyramid level for image loading\nconst int TOP_IMAGE_MAX_PIX = 1000 * 1000;\n\n// Default lowest-resolution subimage size\nconst int LOWRES_SIZE_DEFAULT = 1000 * 1000;\n\n// Lowest-resolution subimage size when in preview (delay) mode\nconst int LOWRES_SIZE_PREVIEW = 8000 * 8000;\n\n// Pyramid subsample factor for image loading in load()\nconst int LOAD_SUBSAMPLE = 4;\n\n// Default pyramid subsample factor for DiskImagePyramidMultiChannel\nconst int PYRAMID_SUBSAMPLE = 2;\n\n// Max screen distance (pixels) for match point pick/delete\nconst double MATCH_POINT_DISTANCE_LIMIT = 70.0;\n\n} // namespace asp\n\n#endif // __STEREO_GUI_CONSTANTS_H__\n"
  },
  {
    "path": "src/asp/GUI/GuiGeom.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2024, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/GUI/GuiGeom.h>\n#include <vw/Core/Log.h>\n#include <vw/Geometry/geomUtils.h>\n#include <vw/Cartography/shapeFile.h>\n#include <ogrsf_frmts.h>\n\nnamespace asp {\n\nvoid findClosestPolyVertex(double world_x0, double world_y0,\n                           asp::AppData const& app_data,\n                           int beg_image_id, int end_image_id,\n                           PolySearchResult & result) {\n  result = PolySearchResult();\n  result.minX = world_x0;\n  result.minY = world_y0;\n\n  vw::Vector2 world_P(world_x0, world_y0);\n\n  for (int clipIter = beg_image_id; clipIter < end_image_id; clipIter++) {\n\n    // Convert from world coordinates to given clip coordinates\n    vw::Vector2 clip_P = app_data.world2proj(world_P, clipIter);\n\n    PolySearchResult local;\n    findClosestPolyVertex(clip_P.x(), clip_P.y(),\n                          app_data.images[clipIter].polyVec, local);\n\n    // Unless the polygon is empty, convert back to world\n    // coordinates, and see if the current distance is smaller than\n    // the previous one.\n    if (local.polyVecIndex >= 0 && local.polyIndexInCurrPoly >= 0 &&\n        local.vertIndexInCurrPoly >= 0) {\n\n      vw::Vector2 closest_P = app_data.proj2world(\n        vw::Vector2(local.minX, local.minY), clipIter);\n      local.minDist = norm_2(closest_P - world_P);\n\n      if (local.minDist <= result.minDist) {\n        result = local;\n        result.clipIndex = clipIter;\n        result.minX = closest_P.x();\n        result.minY = closest_P.y();\n      }\n    }\n  }\n}\n\n// Find the closest point in a given vector of polygons to a given point.\nvoid findClosestPolyVertex(double x0, double y0,\n                           std::vector<vw::geometry::dPoly> const& polyVec,\n                           PolySearchResult & result) {\n  result = PolySearchResult();\n  result.minX = x0;\n  result.minY = y0;\n\n  for (int s = 0; s < (int)polyVec.size(); s++) {\n\n    double minX0 = 0, minY0 = 0, minDist0 = 0;\n    int polyIndex = -1, vertIndex = -1;\n    polyVec[s].findClosestPolyVertex(x0, y0,\n                                     polyIndex, vertIndex,\n                                     minX0, minY0, minDist0);\n\n    if (minDist0 <= result.minDist) {\n      result.polyVecIndex = s;\n      result.polyIndexInCurrPoly = polyIndex;\n      result.vertIndexInCurrPoly = vertIndex;\n      result.minDist = minDist0;\n      result.minX = minX0;\n      result.minY = minY0;\n    }\n  }\n}\n\nvoid findClosestPolyEdge(double world_x0, double world_y0,\n                         asp::AppData const& app_data,\n                         int beg_image_id, int end_image_id,\n                         PolySearchResult & result) {\n  result = PolySearchResult();\n  result.minX = world_x0;\n  result.minY = world_y0;\n\n  vw::Vector2 world_P(world_x0, world_y0);\n\n  for (int clipIter = beg_image_id; clipIter < end_image_id; clipIter++) {\n\n    // Convert from world coordinates to given clip coordinates\n    vw::Vector2 clip_P = app_data.world2proj(world_P, clipIter);\n\n    PolySearchResult local;\n    asp::findClosestPolyEdge(clip_P.x(), clip_P.y(),\n                             app_data.images[clipIter].polyVec, local);\n\n    // Unless the polygon is empty, convert back to world\n    // coordinates, and see if the current distance is smaller than\n    // the previous one.\n    if (local.polyVecIndex >= 0 && local.polyIndexInCurrPoly >= 0 &&\n        local.vertIndexInCurrPoly >= 0) {\n\n      vw::Vector2 closest_P = app_data.proj2world(\n        vw::Vector2(local.minX, local.minY), clipIter);\n      local.minDist = norm_2(closest_P - world_P);\n\n      if (local.minDist <= result.minDist) {\n        result = local;\n        result.clipIndex = clipIter;\n        result.minX = closest_P.x();\n        result.minY = closest_P.y();\n      }\n    }\n  }\n}\n\n// Find the closest edge in a given vector of polygons to a given point.\nvoid findClosestPolyEdge(double x0, double y0,\n                         std::vector<vw::geometry::dPoly> const& polyVec,\n                         PolySearchResult & result) {\n  result = PolySearchResult();\n  result.minX = x0;\n  result.minY = y0;\n\n  for (int s = 0; s < (int)polyVec.size(); s++) {\n\n    double minX0 = 0, minY0 = 0, minDist0 = 0;\n    int polyIndex = -1, vertIndex = -1;\n    polyVec[s].findClosestPolyEdge(x0, y0,\n                                   polyIndex, vertIndex,\n                                   minX0, minY0, minDist0);\n\n    if (minDist0 <= result.minDist) {\n      result.polyVecIndex = s;\n      result.polyIndexInCurrPoly = polyIndex;\n      result.vertIndexInCurrPoly = vertIndex;\n      result.minDist = minDist0;\n      result.minX = minX0;\n      result.minY = minY0;\n    }\n  }\n}\n\n// Assemble the polygon structure\nvoid formPoly(std::string              const& override_color,\n              std::vector<int>         const& contiguous_blocks,\n              std::vector<std::string> const& colors,\n              std::vector<vw::geometry::anno> const& annotations,\n              std::vector<vw::Vector3> const& vertices,\n              std::vector<vw::geometry::dPoly> & polyVec) {\n\n  // Wipe the output\n  polyVec.clear();\n  polyVec.resize(1);\n\n  if (colors.size() != contiguous_blocks.size()) \n    vw::vw_throw(vw::ArgumentErr() << \"There must be as many polygons as colors for them.\\n\");\n  \n  size_t vertexCount = 0;\n  for (size_t polyIt = 0; polyIt < contiguous_blocks.size(); polyIt++) {\n    \n    std::vector<double> x, y;\n    for (int vertexIt = 0; vertexIt < contiguous_blocks[polyIt]; vertexIt++) {\n      \n      if (vertexCount >= vertices.size())\n        vw::vw_throw(vw::ArgumentErr() << \"Book-keeping error in reading polygons.\\n\");\n      \n      x.push_back(vertices[vertexCount].x());\n      y.push_back(vertices[vertexCount].y());\n      vertexCount++;\n    }\n    \n    std::string curr_color = colors[polyIt]; // use color from file if it exists\n    \n    // The command line color overrides what is in the file\n    if (override_color != \"default\" && override_color != \"\")\n      curr_color = override_color;\n    \n    bool isPolyClosed = true;\n    std::string layer;\n    polyVec[0].appendPolygon(x.size(),\n                             vw::geometry::vecPtr(x), vw::geometry::vecPtr(y),\n                             isPolyClosed, curr_color, layer);\n  }\n  polyVec[0].set_annotations(annotations);\n  \n  if (vertexCount != vertices.size()) \n    vw::vw_throw(vw::ArgumentErr() \n                 << \"The number of read vertices is not what is expected.\\n\");\n  \n  return;\n}\n\nvoid mergePolys(asp::AppData & app_data, int beg_image_id, int end_image_id, int outIndex) {\n\n  std::vector<vw::geometry::dPoly> polyVec;\n\n  try {\n    // We will infer these from existing polygons\n    std::string poly_color, layer_str;\n\n    // We must first organize all those user-drawn curves into meaningful polygons.\n    // This can flip orientations and order of polygons.\n    std::vector<OGRGeometry*> ogr_polys;\n\n    for (int clipIt = beg_image_id; clipIt < end_image_id; clipIt++) {\n\n      auto & polyVec = app_data.images[clipIt].polyVec;\n      for (size_t vecIter = 0; vecIter < polyVec.size(); vecIter++) {\n\n        if (poly_color == \"\") {\n          std::vector<std::string> colors = polyVec[vecIter].get_colors();\n          if (!colors.empty())\n            poly_color = colors[0];\n        }\n\n        if (layer_str == \"\") {\n          std::vector<std::string> layers = polyVec[vecIter].get_layers();\n          if (!layers.empty())\n            layer_str = layers[0];\n        }\n\n        // Make a copy of the polygons\n        vw::geometry::dPoly poly = polyVec[vecIter];\n\n        double * xv         = poly.get_xv();\n        double * yv         = poly.get_yv();\n        const int* numVerts = poly.get_numVerts();\n        int numPolys        = poly.get_numPolys();\n        int  totalNumVerts  = poly.get_totalNumVerts();\n\n        // Convert from the coordinate system of each layer\n        // to the one of the output layer\n        for (int vIter = 0; vIter < totalNumVerts; vIter++) {\n          vw::Vector2 P = app_data.proj2world(vw::Vector2(xv[vIter], yv[vIter]), clipIt);\n          P = app_data.world2proj(P, outIndex);\n          xv[vIter] = P.x();\n          yv[vIter] = P.y();\n        }\n\n        // Iterate over polygon rings in the given polygon set\n        int startPos = 0;\n        for (int pIter = 0; pIter < numPolys; pIter++) {\n\n          if (pIter > 0) startPos += numVerts[pIter - 1];\n          int numCurrPolyVerts = numVerts[pIter];\n\n          OGRLinearRing R;\n          vw::geometry::toOGR(xv, yv, startPos, numCurrPolyVerts, R);\n\n          OGRPolygon * P = new OGRPolygon; // the parent manages the allocation\n          if (P->addRing(&R) != OGRERR_NONE)\n            vw_throw(vw::ArgumentErr() << \"Failed add ring to polygon.\\n\");\n\n          ogr_polys.push_back(P);\n        }\n\n      }\n    }\n\n    vw::geometry::mergeOGRPolygons(poly_color, layer_str, ogr_polys, polyVec);\n    \n  } catch(std::exception &e) {\n    vw::vw_out() << \"OGR failed at \" << e.what() << std::endl;\n  }\n\n  // Wipe all existing polygons and replace with this one\n  for (int clipIt = beg_image_id; clipIt < end_image_id; clipIt++)\n    app_data.images[clipIt].polyVec.clear();\n\n  app_data.images[outIndex].polyVec = polyVec;\n}\n\n// Delete vertices in a given box\nvoid deleteVerticesInBox(asp::AppData & app_data, vw::BBox2 const& box,\n                         int beg_image_id, int end_image_id) {\n\n  for (int clipIt = beg_image_id; clipIt < end_image_id; clipIt++) {\n\n    for (size_t layerIt = 0; layerIt < app_data.images[clipIt].polyVec.size(); layerIt++) {\n\n      vw::geometry::dPoly & poly     = app_data.images[clipIt].polyVec[layerIt]; // alias\n      int                   numPolys = poly.get_numPolys();\n      const int           * numVerts = poly.get_numVerts();\n      const double        * xv       = poly.get_xv();\n      const double        * yv       = poly.get_yv();\n      std::vector<std::string>   colors   = poly.get_colors();\n      std::vector<std::string>   layers   = poly.get_layers();\n\n      vw::geometry::dPoly poly_out;\n      int start = 0;\n      for (int polyIter = 0; polyIter < numPolys; polyIter++) {\n\n        if (polyIter > 0) start += numVerts[polyIter - 1];\n        int pSize = numVerts[polyIter];\n\n        std::vector<double> out_xv, out_yv;\n        for (int vIter = 0; vIter < pSize; vIter++) {\n          double  x = xv[start + vIter];\n          double  y = yv[start + vIter];\n          vw::Vector2 P = app_data.proj2world(vw::Vector2(x, y), clipIt);\n\n          // This vertex will be deleted\n          if (box.contains(P))\n            continue;\n\n          out_xv.push_back(x);\n          out_yv.push_back(y);\n        }\n\n        bool isPolyClosed = true;\n        poly_out.appendPolygon(out_xv.size(),\n                               vw::geometry::vecPtr(out_xv),\n                               vw::geometry::vecPtr(out_yv),\n                               isPolyClosed, colors[polyIter], layers[polyIter]);\n      }\n\n      // Overwrite the polygon\n      app_data.images[clipIt].polyVec[layerIt] = poly_out;\n    }\n  }\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/GUI/GuiGeom.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2024, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#ifndef __ASP_GUI_GUI_GEOM_H__\n#define __ASP_GUI_GUI_GEOM_H__\n\n#include <asp/GUI/AppData.h>\n#include <vw/Geometry/dPoly.h>\n#include <limits>\n#include <vector>\n\nnamespace asp {\n\n// Result of searching for the closest polygon vertex or edge\nstruct PolySearchResult {\n  int clipIndex = -1;\n  int polyVecIndex = -1;\n  int polyIndexInCurrPoly = -1;\n  int vertIndexInCurrPoly = -1;\n  double minX = 0;\n  double minY = 0;\n  double minDist = std::numeric_limits<double>::max();\n};\n\nvoid findClosestPolyVertex(double world_x0, double world_y0,\n                           asp::AppData const& app_data,\n                           int beg_image_id, int end_image_id,\n                           PolySearchResult & result);\n\n// Find the closest point in a given vector of polygons to a given point.\nvoid findClosestPolyVertex(double x0, double y0,\n                           std::vector<vw::geometry::dPoly> const& polyVec,\n                           PolySearchResult & result);\n\n// Find the closest edge in a given set of polygons to a given point.\nvoid findClosestPolyEdge(double world_x0, double world_y0,\n                         asp::AppData const& app_data,\n                         int beg_image_id, int end_image_id,\n                         PolySearchResult & result);\n\n// Merge some polygons and save them in app_data.images[outIndex]\nvoid mergePolys(asp::AppData & app_data, int beg_image_id, int end_image_id, int outIndex);\n\n// Delete vertices in a given box\nvoid deleteVerticesInBox(asp::AppData & app_data, vw::BBox2 const& box,\n                         int beg_image_id, int end_image_id);\n\n// Assemble the polygon structure\nvoid formPoly(std::string              const& override_color,\n              std::vector<int>         const& contiguous_blocks,\n              std::vector<std::string> const& colors,\n              std::vector<vw::geometry::anno> const& annotations,\n              std::vector<vw::Vector3> const& vertices,\n              std::vector<vw::geometry::dPoly> & polyVec);\n\n// Find the closest edge in a given vector of polygons to a given point.\nvoid findClosestPolyEdge(double x0, double y0,\n                         std::vector<vw::geometry::dPoly> const& polyVec,\n                         PolySearchResult & result);\n}\n#endif // __ASP_GUI_GUI_GEOM_H__\n"
  },
  {
    "path": "src/asp/GUI/GuiUtilities.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// TODO(oalexan1): This is very slow to compile. Need to figure out\n// why. Could be the bundle adjustment logic. Or contouring, or\n// shapefile logic, or DiskImagePyramid read from GuiUtilities.h.\n// These may need to be moved to separate files.\n\n#include <asp/GUI/GuiUtilities.h>\n#include <asp/GUI/DiskImagePyramidMultiChannel.h>\n#include <asp/GUI/GuiGeom.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/PointUtils.h>\n\n#include <vw/Image/Algorithms.h>\n#include <vw/Cartography/GeoTransform.h>\n#include <vw/Cartography/Hillshade.h>\n#include <vw/Core/RunOnce.h>\n#include <vw/BundleAdjustment/ControlNetworkLoader.h>\n#include <vw/InterestPoint/MatcherIO.h>\n#include <vw/Geometry/dPoly.h>\n#include <vw/Cartography/shapeFile.h>\n#include <vw/Core/Stopwatch.h>\n#include <vw/FileIO/FileTypes.h>\n\n#include <QPolygon>\n#include <QtGui>\n#include <QtWidgets>\n#include <ogrsf_frmts.h>\n\n// For contours\n#include <opencv2/imgproc.hpp>\n\n#include <string>\n#include <vector>\n\nusing namespace vw;\nusing namespace vw::geometry;\n\nnamespace asp {\n\nbool isPolyZeroDim(const QPolygon & pa){\n  \n  int numPts = pa.size();\n  for (int s = 1; s < numPts; s++){\n    if (pa[0] != pa[s]) return false;\n  }\n  \n  return true;\n}\n  \nbool getStringFromGui(QWidget * parent,\n                      std::string title, std::string description,\n                      std::string inputStr,\n                      std::string & outputStr){ // output\n  outputStr = \"\";\n\n  bool ok = false;\n  QString text = QInputDialog::getText(parent, title.c_str(), description.c_str(),\n                                       QLineEdit::Normal, inputStr.c_str(),\n                                       &ok);\n\n  if (ok) outputStr = text.toStdString();\n\n  return ok;\n}\n\nbool supplyOutputPrefixIfNeeded(QWidget * parent, std::string & output_prefix){\n\n  if (output_prefix != \"\") return true;\n\n  std::string caption = \"Enter the output prefix to use for the interest point match file.\";\n  bool ans = getStringFromGui(parent, caption, caption, \"\", output_prefix);\n\n  if (ans)\n    vw::create_out_dir(output_prefix);\n\n  return ans;\n}\n\nstd::string fileDialog(std::string title, std::string start_folder){\n\n  std::string fileName = QFileDialog::getOpenFileName(0,\n                                      title.c_str(),\n                                      start_folder.c_str()).toStdString();\n\n  return fileName;\n}\n\nQRect bbox2qrect(BBox2 const& B){\n  // Need some care here, an empty BBox2 can have its corners\n  // as the largest double, which can cause overflow.\n  if (B.empty()) \n    return QRect();\n  return QRect(round(B.min().x()), round(B.min().y()),\n               round(B.width()), round(B.height()));\n}\n\nbool write_hillshade(vw::GdalWriteOptions const& opt,\n                     bool have_gui,\n                     double azimuth, double elevation,\n                     std::string const& input_file,\n                     std::string      & output_file) {\n\n  // Sanity check: Must have a georeference\n  cartography::GeoReference georef;\n  bool has_georef = vw::cartography::read_georeference(georef, input_file);\n  if (!has_georef) {\n    popUp(\"No georeference present in: \" + input_file + \".\");\n    return false;\n  }\n\n  double scale       = 0.0;\n  double blur_sigma  = std::numeric_limits<double>::quiet_NaN();\n  double nodata_val  = std::numeric_limits<double>::quiet_NaN();\n  vw::read_nodata_val(input_file, nodata_val);\n  std::ostringstream oss;\n  oss << \"_hillshade_a\" << azimuth << \"_e\" << elevation << \".tif\"; \n  std::string suffix = oss.str();\n\n  output_file = vw::mosaic::filename_from_suffix1(input_file, suffix);\n  bool align_light_to_georef = false;\n  try {\n    DiskImageView<float> input(input_file);\n    // TODO(oalexan1): Factor out repeated logic below.\n    try {\n      bool will_write = vw::mosaic::overwrite_if_no_good(input_file, output_file,\n                                             input.cols(), input.rows());\n      if (will_write) {\n        vw_out() << \"Writing: \" << output_file << \"\\n\";\n        vw::cartography::do_multitype_hillshade(input_file, output_file, azimuth, elevation, scale,\n                                                nodata_val, blur_sigma, align_light_to_georef, opt);\n      }\n    } catch(...) {\n      // Failed to write, presumably because we have no write access.\n      // Write the file in the current dir.\n      vw_out() << \"Failed to write: \" << output_file << \"\\n\";\n      output_file = vw::mosaic::filename_from_suffix2(input_file, suffix);\n      bool will_write = vw::mosaic::overwrite_if_no_good(input_file, output_file,\n                                             input.cols(), input.rows());\n      if (will_write) {\n        vw_out() << \"Writing: \" << output_file << \"\\n\";\n        vw::cartography::do_multitype_hillshade(input_file,  output_file,\n                                                azimuth, elevation, scale,\n                                                nodata_val, blur_sigma,\n                                                align_light_to_georef, opt);\n      }\n    }\n  } catch (const Exception& e) {\n    if (!have_gui) \n      vw_out() << e.what() << \"\\n\";\n    else\n      popUp(e.what());\n    return false;\n  }\n  \n  return true;\n}\n\n// TODO(oalexan1): The 0.5 bias may be the wrong thing to do. Need to test\n// more overlaying an image which is above threshold in a rectangular region\n// and below it outside that region\nvoid contour_image(DiskImagePyramidMultiChannel const& img,\n                   vw::cartography::GeoReference const & georef,\n                   double threshold,\n                   std::vector<vw::geometry::dPoly> & polyVec) {\n  \n  std::vector<std::vector<cv::Point>> contours;\n  std::vector<cv::Vec4i> hierarchy;\n\n  // Create the OpenCV matrix. We will have issues for huge images.\n  cv::Mat cv_img = cv::Mat::zeros(img.cols(), img.rows(), CV_8UC1);\n  \n  // Form the binary image. Values above threshold become 1, and less\n  // than equal to the threshold become 0.\n  long long int num_pixels_above_thresh = 0;\n  for (int col = 0; col < img.cols(); col++) {\n    for (int row = 0; row < img.rows(); row++) {\n      uchar val = (std::max(img.get_value_as_double(col, row), threshold) - threshold > 0);\n      cv_img.at<uchar>(col, row) = val;\n      if (val > 0) \n        num_pixels_above_thresh++;\n    }    \n  }\n\n  // Add the contour to the list of polygons to display\n  polyVec.clear();\n  polyVec.resize(1);\n  vw::geometry::dPoly & poly = polyVec[0]; // alias\n\n  if (num_pixels_above_thresh == 0) \n    return; // Return early, nothing to do\n  \n  // Find the contour\n  cv::findContours(cv_img, contours, hierarchy, cv::RETR_TREE, cv::CHAIN_APPROX_SIMPLE);\n\n  // Copy the polygon for export\n  for (size_t k = 0; k < contours.size(); k++) {\n\n    if (contours[k].empty()) \n      continue;\n\n    // Copy from float to double\n    std::vector<double> xv(contours[k].size()), yv(contours[k].size());\n    for (size_t vIter = 0; vIter < contours[k].size(); vIter++) {\n\n      // We would like the contour to go through the center of the\n      // pixels not through their upper-left corners. Hence add 0.5.\n      double bias = 0.5;\n      \n      // Note how we flip x and y, because in our GUI the first\n      // coordinate is the column.\n      Vector2 S(contours[k][vIter].y + bias, contours[k][vIter].x + bias);\n\n      // The GUI expects the contours to be in georeferenced coordinates\n      S = georef.pixel_to_point(S);\n      \n      xv[vIter] = S.x();\n      yv[vIter] = S.y();\n    }\n    \n    bool isPolyClosed = true;\n    std::string color = \"green\";\n    std::string layer = \"0\";\n    poly.appendPolygon(contours[k].size(), &xv[0], &yv[0],  \n                       isPolyClosed, color, layer);\n  }\n}\n\n// This will tweak the georeference so that point_to_pixel() is the identity.\nbool read_georef_from_shapefile(vw::cartography::GeoReference & georef,\n                                std::string const& file){\n\n  if (!vw::has_shp_extension(file))\n    vw_throw(ArgumentErr() << \"Expecting a shapefile as input, got: \" << file << \".\\n\");\n  \n  bool has_georef = false; // will change\n  std::vector<vw::geometry::dPoly> polyVec;\n  std::string poly_color;\n  read_shapefile(file, poly_color, has_georef, georef, polyVec);\n  \n  return has_georef;\n}\n  \nbool read_georef_from_image_or_shapefile(vw::cartography::GeoReference & georef,\n                                         std::string const& file){\n\n  if (vw::has_shp_extension(file)) \n    return read_georef_from_shapefile(georef, file);\n  \n  return vw::cartography::read_georeference(georef, file);\n}\nvw::Vector2 QPoint2Vec(QPoint const& qpt) {\n  return vw::Vector2(qpt.x(), qpt.y());\n}\n\nvw::Vector2 QPointF2Vec(QPointF const& qpt) {\n  return vw::Vector2(qpt.x(), qpt.y());\n}\n\nQPoint Vec2QPoint(vw::Vector2 const& V) {\n  return QPoint(round(V.x()), round(V.y()));\n}\n\nvw::Vector2 flip_in_y(vw::Vector2 const& P) {\n  return vw::Vector2(P.x(), -P.y());\n}\n\nvw::BBox2 flip_in_y(vw::BBox2 const& B) {\n  vw::BBox2 R = B;\n  R.min().y() = -B.max().y();\n  R.max().y() = -B.min().y();\n  return R;\n}\n\nvw::BBox2 qrect2bbox(QRect const& R) {\n  return vw::BBox2(vw::Vector2(R.left(), R.top()),\n                   vw::Vector2(R.right(), R.bottom()));\n}\n\nPointList::PointList(vw::Vector3 const& color): m_color(color) {}\n\nPointList::PointList(std::list<vw::Vector2> const& points,\n                     vw::Vector3 const& color):\n  m_color(color) {\n  this->push_back(points);\n}\n\nstd::list<vw::Vector2> const& PointList::points() const {\n  return m_points;\n}\n\nvw::Vector3 PointList::color() const {\n  return m_color;\n}\n\nvoid PointList::push_back(vw::Vector2 pt) {\n  m_points.push_back(pt);\n}\n\nvoid PointList::push_back(std::list<vw::Vector2> pts) {\n  std::list<vw::Vector2>::iterator iter  = pts.begin();\n  while (iter != pts.end()) {\n    m_points.push_back(*iter);\n    ++iter;\n  }\n}\n\n// Given an image and an input file name, modify the filename using a suffix.\n// Write the image to that filename. If that fails, create instead the filename\n// in the current directory. Return the name of the output file.\nstd::string write_in_orig_or_curr_dir(vw::GdalWriteOptions const& opt,\n                                      vw::ImageViewRef<double> & image,\n                                      std::string const& input_file,\n                                      std::string const& suffix,\n                                      bool has_georef,\n                                      vw::cartography::GeoReference const& georef,\n                                      bool has_nodata,\n                                      double nodata_val) {\n\n  std::string output_file\n    = vw::mosaic::filename_from_suffix1(input_file, suffix);\n  vw::TerminalProgressCallback tpc(\"asp\", \": \");\n  vw::vw_out() << \"Writing: \" << output_file << \"\\n\";\n  try {\n    vw::cartography::block_write_gdal_image(output_file, image,\n                                            has_georef, georef,\n                                            has_nodata, nodata_val,\n                                            opt, tpc);\n  } catch(...) {\n    // Failed to write, presumably because we have no write access.\n    // Write the file in the current dir.\n    vw::vw_out() << \"Failed to write: \" << output_file << \"\\n\";\n    output_file = vw::mosaic::filename_from_suffix2(input_file, suffix);\n    vw::vw_out() << \"Writing: \" << output_file << \"\\n\";\n    vw::cartography::block_write_gdal_image(output_file, image,\n                                            has_georef, georef,\n                                            has_nodata, nodata_val,\n                                            opt, tpc);\n  }\n  return output_file;\n}\n\n// See if we are in the mode where the images are displayed side-by-side with a\n// dialog to choose which ones to display.\nbool sideBySideWithDialog() {\n  return (asp::stereo_settings().pairwise_matches       ||\n          asp::stereo_settings().pairwise_clean_matches ||\n          asp::stereo_settings().view_several_side_by_side);\n}\n\nbool previewOrSideBySideWithDialog() {\n  return asp::stereo_settings().preview || sideBySideWithDialog();\n}\n  \n// Turn off any such side-by-side logic\nvoid setNoSideBySideWithDialog() {\n  asp::stereo_settings().pairwise_matches          = false;\n  asp::stereo_settings().pairwise_clean_matches    = false;\n  asp::stereo_settings().view_several_side_by_side = false;\n}\n\n  \n} // namespace asp\n"
  },
  {
    "path": "src/asp/GUI/GuiUtilities.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// \\file GuiUtilities.h\n// \n// Low-level GUI logic\n// \n#ifndef __STEREO_GUI_GUI_UTILITIES_H__\n#define __STEREO_GUI_GUI_UTILITIES_H__\n\n// Fforward declaration\nnamespace asp { \n  class DiskImagePyramidMultiChannel; \n}\n\n// Vision Workbench\n#include <vw/Core/Thread.h>\n#include <vw/Core/Log.h>\n#include <vw/Image/ImageViewRef.h>\n#include <vw/Image/ImageView.h>\n#include <vw/FileIO/DiskImageView.h>\n#include <vw/FileIO/DiskImageUtils.h>\n#include <vw/Math/BBox.h>\n#include <vw/Math/Vector.h>\n#include <vw/Cartography/GeoReference.h>\n#include <vw/Cartography/GeoReferenceUtils.h>\n#include <vw/InterestPoint/InterestPoint.h>\n#include <vw/Geometry/dPoly.h>\n#include <vw/Image/AntiAliasing.h>\n\n#include <boost/filesystem/path.hpp>\n#include <boost/filesystem.hpp>\n#include <boost/foreach.hpp> // Must be before Qt headers\n#include <boost/mpl/or.hpp>\n#include <omp.h>\n\n#include <QWidget>\n#include <QPoint>\n\n#include <string>\n#include <vector>\n#include <list>\n#include <set>\n\nclass QMouseEvent;\nclass QWheelEvent;\nclass QPoint;\nclass QResizeEvent;\nclass QTableWidget;\nclass QContextMenuEvent;\nclass QMenu;\nclass QPolygon;\n\nnamespace asp {\n\n  bool isPolyZeroDim(const QPolygon & pa);\n\n  bool getStringFromGui(QWidget * parent,\n\t\t\tstd::string title, std::string description,\n\t\t\tstd::string inputStr,\n\t\t\tstd::string & outputStr);\n\n  bool supplyOutputPrefixIfNeeded(QWidget * parent, std::string & output_prefix);\n\n  // Pop-up a window to have the user select a file\n  std::string fileDialog(std::string title, std::string start_folder=\"\");\n\n  // Flip a point and a box in y\n  vw::Vector2 flip_in_y(vw::Vector2 const& P);\n  vw::BBox2 flip_in_y(vw::BBox2 const& B);\n\n  // Convert a QRect object to a BBox2 object.\n  vw::BBox2 qrect2bbox(QRect const& R);\n\n  // Convert a BBox2 object to a QRect object.\n  QRect bbox2qrect(vw::BBox2 const& B);\n\n  // Save a hillshaded file\n  bool write_hillshade(vw::GdalWriteOptions const& opt,\n                       bool have_gui,\n                       double azimuth, double elevation,\n                       std::string const& input_file,\n                       std::string      & output_file);\n\n  // Given an image, and an input file name, modify the filename using\n  // a prefix. Write the image to that filename. If that fails, create\n  // instead the filename in the current directory. Return the name\n  // of the output file.\n  std::string write_in_orig_or_curr_dir(vw::GdalWriteOptions const& opt,\n                                        vw::ImageViewRef<double> & image,\n                                        std::string const& input_file,\n                                        std::string const& suffix,\n                                        bool has_georef,\n                                        vw::cartography::GeoReference const & georef,\n                                        bool has_nodata,\n                                        double nodata_val);\n\n  \n  // This will tweak the georeference so that point_to_pixel() is the identity.\n  bool read_georef_from_shapefile(vw::cartography::GeoReference & georef,\n\t\t\t\t  std::string const& file);\n  \n  bool read_georef_from_image_or_shapefile(vw::cartography::GeoReference & georef,\n\t\t\t\t\t   std::string const& file);\n\n  // Create contours from given image\n  void contour_image(DiskImagePyramidMultiChannel const& img,\n                     vw::cartography::GeoReference const & georef,\n                     double threshold,\n                     std::vector<vw::geometry::dPoly> & polyVec);\n  \n  // QT conversion functions\n  vw::Vector2 QPoint2Vec(QPoint      const& qpt);\n  vw::Vector2 QPointF2Vec(QPointF    const& qpt);\n  QPoint      Vec2QPoint(vw::Vector2 const& V  );\n\n  // A simple class for keeping track of crosshair locations and colors.\n  // - Contains a list of points and the color applied to them.\n  class PointList {\n    std::list<vw::Vector2> m_points;\n    vw::Vector3 m_color;\n  public:\n    PointList(vw::Vector3 const& color);\n    PointList(std::list<vw::Vector2> const& points, vw::Vector3 const& color);\n\n    std::list<vw::Vector2> const& points() const;\n    vw::Vector3 color() const;\n\n    void push_back(vw::Vector2 pt);\n    void push_back(std::list<vw::Vector2> pts);\n  };\n\n  // For each pairs if image indices, store the match file and interest points.\n  // Load these on-demand, and once loaded, keep them in memory.\n  struct pairwiseMatchList {\n    std::map<std::pair<int, int>, std::string> match_files;\n    std::map<std::pair<int, int>, std::pair<std::vector<vw::ip::InterestPoint>, std::vector<vw::ip::InterestPoint>>> matches;\n\n    // We will copy here only the ip that need to be shown for the moment\n    std::vector<std::vector<vw::ip::InterestPoint>> ip_to_show;\n  };\n\n// See if we are in the mode where the images are displayed side-by-side with a\n// dialog to choose which ones to display.\nbool sideBySideWithDialog();\nbool previewOrSideBySideWithDialog();\nvoid setNoSideBySideWithDialog(); // turn off such logic\n\n} // namespace asp\n\n#endif  // __STEREO_GUI_GUI_UTILITIES_H__\n"
  },
  {
    "path": "src/asp/GUI/ImageData.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// \\file ImageData.cc\n// \n// Implementation of the imageData class\n\n#include <asp/GUI/ImageData.h>\n#include <asp/GUI/GuiBase.h>\n#include <asp/GUI/GuiConstants.h>\n#include <asp/GUI/GuiGeom.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/PointUtils.h>\n\n#include <vw/Cartography/GeoReferenceUtils.h>\n#include <vw/Cartography/shapeFile.h>\n#include <vw/FileIO/FileTypes.h>\n#include <vw/Math/Statistics.h>\n\n#include <boost/filesystem.hpp>\n#include <boost/algorithm/string/trim.hpp>\n\n#include <fstream>\n#include <sstream>\n#include <string>\n#include <vector>\n\nusing namespace vw;\nusing namespace vw::geometry;\n\nnamespace asp {\n\nnamespace fs = boost::filesystem;\n\n// Return true if the extension is .csv or .txt\n// TODO(oalexan1): Move this to Common.cc\nbool hasCsv(std::string const& fileName) {\n  std::string ext = vw::get_extension(fileName);\n  if (ext == \".csv\" || ext == \".txt\")\n    return true;\n\n  return false;\n}\n\n// Read datum from a csv file, such as a pointmap file saved by bundle_adjust.\nbool read_datum_from_csv(std::string const& file, vw::cartography::Datum & datum) {\n\n  int count = 0;\n  std::ifstream fh(file);\n    std::string line;\n    while (getline(fh, line, '\\n')) {\n\n      // If the datum was not found early on, give up\n      count++;\n      if (count > 10)\n        return false;\n\n      if (vw::cartography::read_datum_from_str(line, datum))\n        return true;\n\n    }\n  return false;\n}\n\n// Given one or more of --csv-format-str, --csv-srs, and datum, extract\n// the needed metadata.\nvoid read_csv_metadata(std::string              const& csv_file,\n                       std::string              const& csv_format,\n                       bool                            isPoly,\n                       asp::CsvConv                  & csv_conv,\n                       bool                          & has_pixel_vals,\n                       bool                          & has_georef,\n                       vw::cartography::GeoReference & georef) {\n\n  if (!fs::exists(csv_file)) {\n    popUp(\"Could not load file: \" + csv_file);\n    return;\n  }\n\n  // Each file has its own csv format. Will be overriden if specified by the user\n  // via --csv-format-str.\n  std::string local_csv_format_str;\n\n  bool guessed_lola = (csv_file.find(\"RDR\") != std::string::npos &&\n                       csv_file.find(\"PointPerRow\") != std::string::npos);\n\n  if (csv_format != \"\") {\n    local_csv_format_str = csv_format;\n  } else {\n    // For the pointmap and match_offsets files the csv format is known, read it from\n    // the file if not specified the user.  Same for anchor_points files written by\n    // jitter_solve.\n    if (csv_file.find(\"pointmap\") != std::string::npos       || // bundle_adjust\n        csv_file.find(\"match_offsets\") != std::string::npos  || // bundle_adjust\n        csv_file.find(\"anchor_points\") != std::string::npos  || // jitter_solve\n        csv_file.find(\"ref_terrain\") != std::string::npos    || // jitter_solve\n        csv_file.find(\"beg_errors.csv\") != std::string::npos || // pc_align\n        csv_file.find(\"end_errors.csv\") != std::string::npos)   // pc_align\n      local_csv_format_str = \"1:lon, 2:lat, 4:height_above_datum\";\n\n    // For the diff.csv files produced by geodiff the csv format is known, read it from\n    // the file if not specified the user.\n    if (csv_file.find(\"-diff.csv\") != std::string::npos) // geodiff\n      local_csv_format_str = \"1:lon, 2:lat, 3:height_above_datum\";\n\n    // LOLA\n    if (local_csv_format_str == \"\" && guessed_lola)\n      local_csv_format_str = \"2:lon, 3:lat, 4:radius_km\";\n  }\n\n  // For polygons, can assume that first coordinate is x and second is y\n  if (isPoly && local_csv_format_str.empty())\n    local_csv_format_str = \"1:x, 2:y\";\n\n  if (asp::stereo_settings().csv_srs != \"\")\n    vw_out() << \"Using projection: \" << asp::stereo_settings().csv_srs << \"\\n\";\n\n  try {\n    int min_num_fields = 3;\n    if (isPoly)\n      min_num_fields = 2; // only x and y coordinates may exist\n    csv_conv.parse_csv_format(local_csv_format_str,\n                              asp::stereo_settings().csv_srs,\n                              min_num_fields);\n  } catch (...) {\n    // Give a more specific error message\n    popUp(\"Could not parse the csv format. Check or specify --csv-format.\\n\");\n    exit(0); // This is fatal, can't do anything without the format\n  }\n\n  // For the x, y, z format we will just plot pixel x, pixel y, and value (z).\n  // No georeference can be used.\n  asp::CsvConv::CsvFormat fmt = csv_conv.get_format();\n  if (fmt == asp::CsvConv::XYZ || fmt == asp::CsvConv::PIXEL_XYVAL)\n    has_georef = false;\n  else\n    has_georef = true;\n\n  has_pixel_vals = (fmt == asp::CsvConv::PIXEL_XYVAL);\n\n  if (local_csv_format_str == \"\") {\n    popUp(\"The option --csv-format-str must be specified.\");\n    exit(0); // this is fatal\n    return;\n  }\n  vw_out() << \"Using CSV format: \" << local_csv_format_str << \"\\n\";\n\n  // Handle the datum\n  bool has_datum = false;\n\n  // For a pointmap file, anchor points, or a -diff.csv file, read the\n  // datum from the file. The --csv-datum option, if set, will\n  // override this.\n  bool known_csv = (csv_file.find(\"pointmap\") != std::string::npos       ||\n                    csv_file.find(\"anchor_points\") != std::string::npos  ||\n                    csv_file.find(\"match_offsets\") != std::string::npos  ||\n                    csv_file.find(\"beg_errors.csv\") != std::string::npos ||\n                    csv_file.find(\"end_errors.csv\") != std::string::npos ||\n                    csv_file.find(\"-diff.csv\") != std::string::npos ||\n                    asp::hasCsv(csv_file));\n\n  if (known_csv) {\n    vw::cartography::Datum datum;\n    if (read_datum_from_csv(csv_file, datum)) {\n      georef.set_datum(datum);\n      has_datum = true;\n    }\n  }\n\n  // Parse the datum and populate the georef\n  csv_conv.parse_georef(georef);\n  if (asp::stereo_settings().csv_datum != \"\") {\n    vw::cartography::Datum datum(asp::stereo_settings().csv_datum);\n    georef.set_datum(datum);\n    has_datum = true;\n  }\n\n  if (!has_datum && guessed_lola) {\n    vw::vw_out() << \"Guessing the datum for LOLA.\\n\";\n    vw::cartography::Datum datum(\"D_MOON\");\n    georef.set_datum(datum);\n    has_datum = true;\n  }\n\n  if (has_georef) {\n    if (!has_datum) {\n      popUp(\"Must specify --csv-datum.\");\n      vw_throw(ArgumentErr() << \"Missing --csv-datum.\\n\");\n      return;\n    }\n  }\n\n  if (has_datum)\n    vw::vw_out() << \"Using datum: \" << georef.datum() << \"\\n\";\n\n  return;\n}\n\nvoid imageData::read(std::string const& name_in, vw::GdalWriteOptions const& opt,\n                     DisplayMode display_mode,\n                     std::map<std::string, std::string> const& properties,\n                     bool delay_loading) {\n\n  m_variants[display_mode].name = name_in;\n  if (display_mode == REGULAR_VIEW)\n    name = name_in;\n\n  // TODO(oalexan1): There is no need to make the color a class member,\n  // as it is already stored in individual polygons\n  color = \"default\";\n  style = \"default\";\n  colormap = \"binary-red-blue\";\n  colorize = false;\n  colorbar = false;\n\n  m_opt = opt;\n  m_display_mode = display_mode;\n\n  // Properties passed on the command line; they take precedence\n  for (auto it = properties.begin(); it != properties.end(); it++) {\n    if (it->first == \"color\")\n      color = it->second; // copy the poly/line/points color\n    if (it->first == \"style\")\n      style = it->second; // copy the style (poly, line, points)\n    if (it->first == \"colormap\")\n      colormap = it->second; // copy the colormap style (e.g., binary-red-blue)\n    if (it->first == \"colorize\")\n      colorize = atof(it->second.c_str());\n    if (it->first == \"colorbar\")\n      colorbar = atof(it->second.c_str());\n  }\n\n  // These must be set once we know the name and the style\n  m_isPoly = imageData::isPolyInternal(name, style);\n  m_isCsv = imageData::isCsvInternal(name, style);\n\n  // When there are many images, we may prefer to load them on demand\n  if (!delay_loading)\n    load();\n}\n\n// A few small local functions\nnamespace {\n\n// Given a line of the form:\n// # key value1 value2 and so on\n// Read the key in one string, and the values in another string.\nvoid readEntryVal(std::string line, std::string & key, std::string & val) {\n\n  // Initialize the outputs\n  key = \"\";\n  val = \"\";\n\n  // Skip empty lines or those not starting with a pound sign\n  if (line.empty() || line[0] != '#')\n    return;\n\n  // Eliminate the pound sign\n  line = line.substr(1, line.size()-1);\n\n  std::istringstream is(line);\n  is >> key;\n  val = \"\";\n  std::string token;\n  while (is >> token) {\n    val += token + \" \";\n  }\n  boost::algorithm::trim(val);\n}\n\n// Open a file and extract the values for: WKT:, csv-format:, style:\nvoid parseCsvHeader(std::string const& file, std::string & wkt,\n                    std::string & csv_format, std::string & style) {\n\n  wkt = \"\";\n  csv_format = \"\";\n  style = \"\";\n\n  std::ifstream fh(file.c_str());\n\n  // Read line by line. Stop when a line no longer starts with a pound sign.\n  std::string line;\n  while (getline(fh, line, '\\n')) {\n\n    // skip empty lines\n    if (line.empty())\n      continue;\n\n    // Stop if the pound sign is not the first character\n    if (line[0] != '#')\n      break;\n\n    std::string key, val;\n    readEntryVal(line, key, val);\n\n    if (key == \"WKT:\")\n      wkt = val;\n    if (key == \"csv-format:\")\n      csv_format = val;\n    if (key == \"style:\")\n      style = val;\n  }\n}\n\n} // end local namespace\n\n// Load the image is not loaded so far\nvoid imageData::load() {\n\n  // Loaded data need not be reloaded\n  auto& variant = m_variants[m_display_mode];\n  if (variant.loaded)\n    return;\n  vw_out() << \"Reading: \" << variant.name << \"\\n\";\n  variant.loaded = true;\n\n  std::string default_poly_color = \"green\"; // default, will be overwritten later\n\n  if (vw::has_shp_extension(name)) {\n    // Read a shape file\n    std::string poly_color = default_poly_color;\n    if (color != \"default\" && color != \"\")\n      poly_color = color;\n    std::string fieldId = \"tile_id\"; // For reading tile geom written by stereo_parse\n    read_shapefile(name, poly_color, has_georef, georef, polyVec, fieldId);\n\n    double xll = -1.0, yll = -1.0, xur = -1.0, yur = -1.0;\n    shapefile_bdbox(polyVec,\n                    xll, yll, xur, yur); // outputs\n\n    image_bbox.min() = Vector2(xll, yll);\n    image_bbox.max() = Vector2(xur, yur);\n\n  } else if (asp::hasCsv(name)) {\n\n    // Open a file and extract the values for: WKT:, csv-format:, style:\n    std::string local_wkt, local_csv_format, local_style;\n    parseCsvHeader(name, local_wkt, local_csv_format, local_style);\n\n    // The style from the file overrides the style from the command line\n    if (local_style != \"\")\n      style = local_style;\n\n    bool isPoly = (style == \"poly\" || style == \"fpoly\" || style == \"line\");\n    asp::CsvConv csv_conv;\n    bool has_pixel_vals = false; // may change later\n    has_georef = true; // this may change later\n\n    // Read poly or csv\n    if (isPoly && local_style != \"\") {\n      // The polygon file has all the data\n      int numCols = 2; // only x and y coordinates may exist\n      csv_conv.parse_csv_format(local_csv_format, local_wkt, numCols);\n      has_georef = (local_wkt != \"\");\n      if (has_georef)\n        georef.set_wkt(local_wkt);\n      has_pixel_vals = (csv_conv.get_format() == asp::CsvConv::PIXEL_XYVAL);\n    } else {\n      // Use options specified on the command line\n      int numCols = asp::fileNumCols(name);\n      read_csv_metadata(name, asp::stereo_settings().csv_format_str,\n                        isPoly, csv_conv, has_pixel_vals, has_georef, georef);\n    }\n\n    std::vector<int> contiguous_blocks;\n    std::vector<std::string> colors;\n    std::vector<vw::geometry::anno> annotations;\n    colors.push_back(default_poly_color); // to provide a default color for the reader\n\n    // Read the file\n    std::list<asp::CsvConv::CsvRecord> pos_records;\n    if (!isPoly)\n      csv_conv.read_csv_file(name, pos_records);\n    else\n      csv_conv.read_poly_file(name, pos_records, contiguous_blocks, colors, annotations);\n\n    scattered_data.clear(); // note that this is a member variable\n    vw::BBox3 bounds;\n    for (auto iter = pos_records.begin(); iter != pos_records.end(); iter++) {\n      Vector3 val = csv_conv.sort_parsed_vector3(*iter);\n\n      // For pixel values the y axis will go down\n      if (has_pixel_vals)\n        val[1] *= -1.0;\n\n      scattered_data.push_back(val);\n      bounds.grow(val);\n    }\n    image_bbox.min() = subvector(bounds.min(), 0, 2);\n    image_bbox.max() = subvector(bounds.max(), 0, 2);\n    val_range[0] = bounds.min()[2];\n    val_range[1] = bounds.max()[2];\n\n    if (isPoly) {\n      asp::formPoly(color, contiguous_blocks, colors, annotations, scattered_data, polyVec);\n      scattered_data.clear(); // the data is now in the poly structure\n    }\n\n  }else{\n    // Read an image\n    int top_image_max_pix = TOP_IMAGE_MAX_PIX;\n    int subsample = LOAD_SUBSAMPLE;\n    has_georef = vw::cartography::read_georeference(georef, name);\n    variant.image = DiskImagePyramidMultiChannel(variant.name, m_opt,\n                                                 top_image_max_pix, subsample);\n    image_bbox = BBox2(0, 0, variant.image.cols(), variant.image.rows());\n  }\n}\n\n// Save the polygons to a plain text file. This must be in sync\n// with the logic for reading it.\nvoid imageData::writePoly(std::string const& polyFile) {\n\n  // Put all the polygons into a single poly structure\n  vw::geometry::dPoly poly;\n  for (size_t polyIter = 0; polyIter < this->polyVec.size(); polyIter++)\n    poly.appendPolygons(this->polyVec[polyIter]);\n\n  bool has_geo = this->has_georef;\n  vw::cartography::GeoReference const& geo = this->georef;\n\n  vw_out() << \"Writing: \" << polyFile << \"\\n\";\n\n  std::ofstream out(polyFile.c_str());\n  if (!out.is_open())\n    vw::vw_throw(vw::IOErr() << \"Could not open: \" << polyFile << \"\\n\");\n\n  // Save to the file all properties that are needed on reading it back\n  if (has_geo) {\n    out << \"# WKT: \" << geo.get_wkt() << \"\\n\";\n    if (geo.is_projected())\n      out << \"# csv-format: 1:easting,2:northing\\n\";\n    else\n      out << \"# csv-format: 1:lon,2:lat\\n\";\n  } else {\n    out << \"# WKT:\\n\"; // no georef\n    out << \"# csv-format: 1:x,2:y\\n\";\n  }\n  out << \"# style: poly\\n\";\n\n  std::string defaultColor = \"green\"; // only to be used if individual colors are missing\n  bool emptyLineAsSeparator = true; // Don't want to use a \"NEXT\" statement as separator\n  poly.writePoly(out, defaultColor, emptyLineAsSeparator);\n}\n\n// The two functions below are very slow if used per pixel, so we cache their\n// values in member variables. Never call these directly.\nbool imageData::isPolyInternal(std::string const& name, std::string const& style) const {\n  return (vw::has_shp_extension(name) ||\n          (asp::hasCsv(name) &&\n           (style == \"poly\" || style == \"fpoly\" || style == \"line\")));\n}\nbool imageData::isCsvInternal(std::string const& name, std::string const& style) const {\n  return asp::hasCsv(name) && !imageData::isPolyInternal(name, style);\n}\n\n// Find the min and max values, ignoring outliers. We look only\n// at the last component of each point, as that has the intensity,\n// while the previous two have the position.\nvoid findRobustBounds(std::vector<vw::Vector3> const& scattered_data,\n  double & min_val, double & max_val) {\n\n  std::vector<double> vals;\n  for (size_t pt_it = 0; pt_it < scattered_data.size(); pt_it++)\n    vals.push_back(scattered_data[pt_it][2]);\n\n  double beg_inlier = -1, end_inlier = -1, pct_fraction = 0.25, factor = 3.0;\n  vw::math::find_outlier_brackets(vals, pct_fraction, factor, beg_inlier, end_inlier);\n  min_val = end_inlier;\n  max_val = beg_inlier;\n\n  for (size_t it = 0; it < vals.size(); it++) {\n    if (vals[it] < beg_inlier || vals[it] > end_inlier)\n      continue;\n    min_val = std::min(min_val, vals[it]);\n    max_val = std::max(max_val, vals[it]);\n  }\n}\n\n// Compute joint min/max across all images in the given range.\n// Uses --min/--max if set, otherwise unions CSV findRobustBounds\n// and raster approx_bounds.\nvw::Vector2 calcJointBounds(std::vector<imageData> const& images,\n                            int begIdx, int endIdx) {\n\n  if (stereo_settings().min < stereo_settings().max)\n    return vw::Vector2(stereo_settings().min,\n                       stereo_settings().max);\n\n  vw::Vector2 bounds(std::numeric_limits<double>::max(),\n                     -std::numeric_limits<double>::max());\n  for (int i = begIdx; i < endIdx; i++) {\n    if (images[i].m_isPoly)\n      continue;\n    if (images[i].m_isCsv) {\n      if (!images[i].scattered_data.empty()) {\n        double lo = 0.0, hi = 0.0;\n        findRobustBounds(images[i].scattered_data, lo, hi);\n        bounds[0] = std::min(bounds[0], lo);\n        bounds[1] = std::max(bounds[1], hi);\n      }\n      continue;\n    }\n    auto const& img = images[i].currentImg();\n    if (img.m_type != CH1_FLOAT)\n      continue;\n    vw::Vector2 ab = img.m_img_ch1_float.approx_bounds();\n    bounds[0] = std::min(bounds[0], ab[0]);\n    bounds[1] = std::max(bounds[1], ab[1]);\n  }\n  return bounds;\n}\n\n} // namespace asp\n"
  },
  {
    "path": "src/asp/GUI/ImageData.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// \\file ImageData.h\n// \n// A class to keep all data associated with an image file\n\n#ifndef __STEREO_GUI_IMAGE_DATA_H__\n#define __STEREO_GUI_IMAGE_DATA_H__\n\n// ASP\n#include <asp/GUI/DiskImagePyramidMultiChannel.h>\n\n// VW\n#include <vw/Math/BBox.h>\n#include <vw/Math/Vector.h>\n#include <vw/Cartography/GeoReference.h>\n#include <vw/FileIO/DiskImageUtils.h>\n#include <vw/Geometry/dPoly.h>\n\n#include <string>\n#include <vector>\n#include <map>\n\nnamespace asp {\n\n  enum DisplayMode {REGULAR_VIEW, HILLSHADED_VIEW, COLORIZED_VIEW,\n                    HILLSHADE_COLORIZED_VIEW,\n                    THRESHOLDED_VIEW};\n\n  // Return true if the extension is .csv or .txt\n  bool hasCsv(std::string const& fileName);\n\n  // An image pyramid and its loaded state for a given display mode\n  struct ImageVariant {\n    std::string name;\n    DiskImagePyramidMultiChannel image;\n    bool loaded = false;\n  };\n\n  // A class to keep all data associated with an image file\n  class imageData {\n  public:\n    std::string      name; // primary filename (REGULAR_VIEW)\n    vw::GdalWriteOptions m_opt;\n    bool             has_georef;\n    vw::cartography::GeoReference georef;\n    vw::BBox2        image_bbox;\n    vw::Vector2      val_range;\n    // There are several display modes. The one being shown is\n    // determined by m_display_mode. Store the corresponding\n    // image pyramid and loaded state in m_variants.\n    DisplayMode m_display_mode;\n    std::map<DisplayMode, ImageVariant> m_variants;\n\n    // Image pyramid for the regular (default) display mode\n    DiskImagePyramidMultiChannel& img() {\n      return m_variants[REGULAR_VIEW].image;\n    }\n    DiskImagePyramidMultiChannel const& img() const {\n      return m_variants.at(REGULAR_VIEW).image;\n    }\n\n    // Image pyramid for the current display mode\n    DiskImagePyramidMultiChannel& currentImg() {\n      return m_variants[m_display_mode].image;\n    }\n    DiskImagePyramidMultiChannel const& currentImg() const {\n      return m_variants.at(m_display_mode).image;\n    }\n\n    std::vector<vw::geometry::dPoly> polyVec; // a shapefile\n    std::string color; // poly color\n    std::string style; // plotting style\n    std::string colormap; // colormap style\n    bool colorize; // if a given image must be colorized\n    bool colorbar; // if a colorbar should be shown\n\n    // Scattered data to be plotted at (x, y) location with z giving\n    // the intensity. May be colorized.\n    std::vector<vw::Vector3> scattered_data;\n\n    imageData(): m_display_mode(REGULAR_VIEW), has_georef(false),\n                 m_isPoly(false), m_isCsv(false),\n                 colorize(false), colorbar(false) {}\n\n    // Read an image from disk and set the other variables.\n    void read(std::string const& image, vw::GdalWriteOptions const& opt,\n              DisplayMode display_mode = REGULAR_VIEW,\n              std::map<std::string, std::string> const& properties =\n              std::map<std::string, std::string>(), bool delay_loading = false);\n\n    // The actual loading happens here\n    void load();\n\n    // Save the polygons to a plain text file\n    void writePoly(std::string const& polyFile);\n\n    bool m_isPoly, m_isCsv;\n    bool isPolyOrCsv() const { return m_isPoly || m_isCsv; }\n\nprivate:\n    // These are very slow if used per pixel, so we cache their results in\n    // member variables. Never call these directly.\n    bool isPolyInternal(std::string const& name, std::string const& style) const;\n    bool isCsvInternal(std::string const& name, std::string const& style) const;\n\n  };\n\n// Find the min and max values of scattered data, ignoring outliers.\n// Looks at the third component (intensity) of each point.\nvoid findRobustBounds(std::vector<vw::Vector3> const& scattered_data,\n                      double & min_val, double & max_val);\n\n// Compute joint min/max across all images in the given range\nvw::Vector2 calcJointBounds(std::vector<asp::imageData> const& images,\n                            int begIdx, int endIdx);\n\n} // namespace asp\n\n#endif  // __STEREO_GUI_IMAGE_DATA_H__\n"
  },
  {
    "path": "src/asp/GUI/MainWidget.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2024, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  https://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// \\file MainWidget.cc\n// \n// TODO(oalexan1): Each layer must have just a dPoly, rather\n// than a vector of them.\n// TODO: Test with empty images and images having just one pixel.\n\n#include <asp/GUI/MainWidget.h>\n#include <asp/GUI/GuiConstants.h>\n#include <asp/GUI/GuiGeom.h>\n#include <asp/GUI/ChooseFilesDlg.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/GUI/WidgetMenuMgr.h>\n\n#include <vw/Math/EulerAngles.h>\n#include <vw/Image/Algorithms.h>\n#include <vw/Core/RunOnce.h>\n#include <vw/Cartography/GeoReferenceUtils.h>\n#include <vw/Cartography/GeoTransform.h>\n#include <vw/Cartography/shapeFile.h>\n#include <vw/Geometry/geomUtils.h>\n#include <vw/Core/Stopwatch.h>\n#include <vw/Image/Manipulation.h>\n#include <vw/Image/Statistics.h>\n#include <vw/Image/Colormap.h> // colormaps supported by ASP\n\n#include <qwt_point_data.h>\n#include <QtGui>\n#include <QtWidgets>\n#include <QMenu>\n\n#include <string>\n#include <vector>\n#include <memory>\n\nusing namespace vw;\n\nnamespace asp {\n\nMainWidget::MainWidget(QWidget *parent,\n                       vw::GdalWriteOptions const& opt,\n                       int beg_image_id, int end_image_id, int base_image_id,\n                       asp::AppData & app_data, // alias\n                       std::string & output_prefix,     // will be aliased\n                       asp::MatchPointMgr & match_mgr,\n                       ChooseFilesDlg * chooseFiles,\n                       bool & allowMultipleSelections):\n    QwtScaleWidget(parent),\n    WidgetBase(beg_image_id, end_image_id, base_image_id, app_data),\n    m_opt(opt), m_chooseFiles(chooseFiles),\n    m_output_prefix(output_prefix), // alias\n    m_match_mgr(match_mgr),\n    m_allowMultipleSelections(allowMultipleSelections),\n    m_can_emit_zoom_all_signal(false),\n    m_polyEditMode(false), m_polyLayerIndex(beg_image_id),\n    m_pixelTol(6), m_backgroundColor(QColor(\"black\")),\n    m_lineWidth(2), m_polyColor(\"green\"),\n    m_firstPaintEvent(false),\n    m_emptyRubberBand(QRect(0,0,0,0)), m_rubberBand(QRect(0,0,0,0)),\n    m_cropWinMode(false),\n    m_mousePrsX(0), m_mousePrsY(0),\n    m_zoomTimer(new QTimer(this)), m_accumulatedZoomTicks(0.0) { \n\n  connect(m_zoomTimer, &QTimer::timeout, this, &MainWidget::handleZoomTimeout);\n  m_zoomTimer->setSingleShot(true); // Ensure it only fires once per debounce period\n\n  installEventFilter(this);\n  this->setMouseTracking(true);\n\n  // Set the size policy that the widget can grow or shrink and still\n  // be useful.\n  this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);\n  this->setFocusPolicy(Qt::ClickFocus);\n\n  // Read the images. Find the box that will contain all of them.\n  // If we use georef, that box is in projected point units\n  // of the first image.\n  // Also set up the image GeoReference transforms for each image\n  // in both directions.\n  int num_images = app_data.images.size();\n  m_filesOrder.resize(num_images);\n\n  // Each image can be hillshaded independently of the other ones\n  m_hillshade.azimuth   = asp::stereo_settings().hillshade_azimuth;\n  m_hillshade.elevation = asp::stereo_settings().hillshade_elevation;\n\n  // Image threshold (struct defaults handle initialization)\n\n  MainWidget::maybeGenHillshade();\n\n  // Set data per image\n  for (int i = 0; i < num_images; i++) {\n\n    m_filesOrder[i] = i; // start by keeping the order of files being read\n\n    bool in_range = (m_beg_image_id <= i && i < m_end_image_id);\n    if (!in_range)\n      continue;\n\n    // Don't load the files the user wants hidden in preview mode\n    // This won't play nice with georefs or with images\n    // with different sizes, or likely with polygons.\n    bool delay = !asp::stereo_settings().nvm.empty() || asp::stereo_settings().preview;\n    if (m_chooseFiles && m_chooseFiles->isHidden(app_data.images[i].name) && delay)\n      continue;\n\n    // Load if not loaded so far\n    app_data.images[i].load();\n\n    if (app_data.use_georef && !app_data.images[i].has_georef) {\n      popUp(\"No georeference present in: \" + app_data.images[i].name + \".\");\n      vw_throw(ArgumentErr() << \"Missing georeference.\\n\");\n    }\n\n    // Grow the world box to fit all the images\n    BBox2 B = app_data.image2world_trans(app_data.images[i].image_bbox, i);\n    m_world_box.grow(B);\n\n    // The first existing vector layer in the current widget becomes\n    // the one we draw on.  Otherwise we keep m_polyLayerIndex at\n    // m_beg_image_id so we store any new polygons in\n    // app_data.images[m_beg_image_id].\n    if (app_data.images[i].m_isPoly && m_polyLayerIndex == m_beg_image_id)\n      m_polyLayerIndex = i;\n\n  } // end iterating over the images\n\n  if (!asp::stereo_settings().zoom_proj_win.empty()) {\n    // Zoom to desired win. Later, once we know the window\n    // size, this region's dimensions will be adjusted to have\n    // correct aspect ratio.\n    BBox2 proj_win = asp::stereo_settings().zoom_proj_win, image_box;\n    if (app_data.images[m_base_image_id].isPolyOrCsv())\n      image_box = proj_win;\n    else\n      image_box = app_data.images[m_base_image_id].georef.point_to_pixel_bbox(proj_win);\n\n    m_current_view = app_data.image2world_trans(image_box, m_base_image_id);\n  }\n\n  // To do: Warn the user if some images have georef while others don't.\n\n  // Choose which files to hide/show in the GUI. In previewOrSideBySideWithDialog()\n  // mode, see MainWindow() for alternative functionality which requires\n  // redrawing the layout.\n  if (m_chooseFiles && !previewOrSideBySideWithDialog()) {\n    // When the user clicks on a table entry, say by modifying a\n    // checkbox, update the display.\n    QObject::connect(m_chooseFiles->getFilesTable(), SIGNAL(cellClicked(int, int)),\n                      this, SLOT(showFilesChosenByUser(int, int)));\n\n    m_chooseFiles->getFilesTable()->setContextMenuPolicy(Qt::CustomContextMenu);\n    QObject::connect(m_chooseFiles->getFilesTable(),\n                     SIGNAL(customContextMenuRequested(QPoint)),\n                     this, SLOT(customMenuRequested(QPoint)));\n  }\n\n  if (m_chooseFiles && !sideBySideWithDialog()) {\n    // When the user clicks on the table header on top to show or hide all\n    // When sideBySideWithDialog() is on, do not let every widget trigger this,\n    // it will be done instead from the parent window.\n    QObject::connect(m_chooseFiles->getFilesTable()->horizontalHeader(),\n                      SIGNAL(sectionClicked(int)), this, SLOT(hideShowAll_widgetVersion()));\n  }\n  \n  // Initialize the menu manager\n  m_wid_menu_mgr = std::unique_ptr<WidgetMenuMgr>(new WidgetMenuMgr(this));\n} // End constructor\n\nMainWidget::~MainWidget() {\n}\n\nbool MainWidget::eventFilter(QObject *obj, QEvent *E) {\n  return QWidget::eventFilter(obj, E);\n}\n\n// What will happen when the user right-clicks on the table\n// listing the files.\nvoid MainWidget::customMenuRequested(QPoint pos) {\n\n  // Process user's choice from m_chooseFiles.\n  if (!m_chooseFiles)\n    return;\n\n  QTableWidget * filesTable = m_chooseFiles->getFilesTable();\n\n  // Determine which row of the table the user clicked on\n  QModelIndex tablePos = filesTable->indexAt(pos);\n  int imageIndex = tablePos.row();\n\n  // Form the menu, passing the image index explicitly\n  QMenu *menu = m_wid_menu_mgr->formCustomMenu(this, imageIndex);\n\n  menu->exec(filesTable->mapToGlobal(pos));\n}\n\nvoid MainWidget::showFilesChosenByUser(int rowClicked, int columnClicked) {\n\n  // Process user's choice from m_chooseFiles.\n  if (!m_chooseFiles)\n    return;\n\n  QTableWidget * filesTable = m_chooseFiles->getFilesTable();\n\n  // If we did not click on the checkbox, but on the image name,\n  // make it checked\n  if (columnClicked > 0) {\n    QTableWidgetItem *item = filesTable->item(rowClicked, 0);\n    item->setCheckState(Qt::Checked);\n  }\n\n  // If we just checked a certain image, it will be shown on top of the other ones.\n  QTableWidgetItem *item = filesTable->item(rowClicked, 0);\n  if (item->checkState() == Qt::Checked) {\n    bringImageOnTop(rowClicked);\n  }\n\n  // If we clicked on the image name, zoom to it.\n  if (columnClicked > 0) {\n    // I could not use this functionality from a double click event.\n    MainWidget::zoomToImageInTableCell(rowClicked, columnClicked);\n  } else {\n    refreshPixmap();\n  }\n\n  return;\n}\n\nvoid MainWidget::zoomToImageInTableCell(int rowClicked, int columnClicked) {\n  zoomToImage(rowClicked);\n}\n\nvoid MainWidget::hideShowAll_widgetVersion() {\n\n  if (sideBySideWithDialog()) {\n    // The function hideShowAll_windowVersion() will be called, as\n    // the layout and all widgets need to be recreated.\n    return;\n  }\n\n  // Process user's choice from m_chooseFiles.\n  if (!m_chooseFiles)\n    return;\n\n  m_chooseFiles->hideShowAll();\n\n  // In either case, reset the order in which the images are displayed\n  int num_images = app_data.images.size();\n  m_filesOrder.resize(num_images);\n  for (int i = 0; i < num_images; i++)\n    m_filesOrder[i] = i;\n\n  refreshPixmap();\n}\n\nvw::BBox2 MainWidget::worldBox() const {\n  return m_world_box;\n}\n\nvoid MainWidget::setWorldBox(vw::BBox2 const& world_box) {\n  m_world_box = world_box;\n}\n\n// Zoom to show each image fully.\nvoid MainWidget::sizeToFit() {\n\n  double aspect = double(m_window_width) / m_window_height;\n  m_current_view = vw::geometry::expandBoxToRatio(m_world_box, aspect);\n\n  // If this is the first time we draw the image, so right when\n  // we started, invoke update() which will invoke paintEvent().\n  // That one will not only call refreshPixmap() but will\n  // also mark that it did so. This is a bit confusing, but it is\n  // necessary since otherwise Qt will first call this function,\n  // invoking refreshPixmap(), then will call update() one more time\n  // invoking needlessly refreshPixmap() again, which is expensive.\n  if (m_firstPaintEvent) {\n    update();\n  } else {\n    refreshPixmap();\n  }\n}\n\nvoid MainWidget::viewUnthreshImages() {\n  for (int image_iter = m_beg_image_id; image_iter < m_end_image_id; image_iter++)\n    app_data.images[image_iter].m_display_mode = REGULAR_VIEW;\n\n  refreshPixmap();\n}\n\n// The region that is currently viewable, in the first image pixel domain\nBBox2 MainWidget::firstImagePixelBox() const{\n\n  if (app_data.images.size() == 0) {\n    // Must never happen\n    vw_out() << \"Did not expect no images!\";\n    vw_throw(ArgumentErr() << \"Did not expect no images.\\n\");\n  }\n  return app_data.world2image_trans(m_current_view, m_beg_image_id);\n}\n\n// The current image box in world coordinates\nBBox2 MainWidget::firstImageWorldBox(BBox2 const& image_box) const{\n  if (app_data.images.size() == 0) {\n    // Must never happen\n    vw_out() << \"Did not expect no images!\";\n    vw_throw(ArgumentErr() << \"Did not expect no images.\\n\");\n  }\n  return app_data.image2world_trans(image_box, m_beg_image_id);\n}\n\nvoid MainWidget::viewThreshImages(bool refresh_pixmap) {\n\n  int num_non_poly_images = 0;\n  int num_images = app_data.images.size();\n  for (int image_iter = m_beg_image_id; image_iter < m_end_image_id; image_iter++) {\n    if (!app_data.images[image_iter].m_isPoly && !app_data.images[image_iter].m_isCsv)\n      num_non_poly_images++;\n  }\n\n  if (num_non_poly_images > 1) {\n    if (std::isnan(asp::stereo_settings().nodata_value))\n      popUp(\"Must have just one image in each window to view thresholded images.\");\n    else\n      popUp(\"Must have just one image in each window to use the nodata option.\");\n\n    for (int image_iter = m_beg_image_id; image_iter < m_end_image_id; image_iter++)\n      app_data.images[image_iter].m_display_mode = REGULAR_VIEW;\n\n    refreshPixmap();\n    return;\n  }\n\n  // Create the thresholded images and save them to disk. We have to do it each\n  // time as perhaps the image threshold changed.\n  for (int image_iter = m_beg_image_id; image_iter < m_end_image_id; image_iter++) {\n    std::string input_file = app_data.images[image_iter].name;\n\n    if (app_data.images[image_iter].isPolyOrCsv())\n      continue;\n\n    double nodata_val = -std::numeric_limits<double>::max();\n    vw::read_nodata_val(input_file, nodata_val);\n\n    // Do not use max(nodata_val, thresh) as sometimes nodata_val can be larger than data\n    nodata_val = m_threshold.value;\n    int num_channels = app_data.images[image_iter].img().planes();\n\n    if (num_channels != 1) {\n      popUp(\"Thresholding makes sense only for single-channel images.\");\n      app_data.images[image_iter].m_display_mode = REGULAR_VIEW;\n      return;\n    }\n\n    app_data.images[image_iter].m_display_mode = THRESHOLDED_VIEW;\n    ImageViewRef<double> thresh_image\n      = apply_mask(create_mask_less_or_equal(DiskImageView<double>(input_file),\n                                              nodata_val), nodata_val);\n\n    // TODO(oalexan1): Need to do something like in write_hillshade()\n    // so that we don't have to always re-write the thresholded image.\n    std::string suffix = \"_thresh.tif\";\n    bool has_nodata = true;\n    std::string thresholded_file\n      = write_in_orig_or_curr_dir(m_opt,\n                                  thresh_image, input_file, suffix,\n                                  app_data.images[image_iter].has_georef,\n                                  app_data.images[image_iter].georef,\n                                  has_nodata, nodata_val);\n\n    // Read it back right away\n    app_data.images[image_iter].m_variants[THRESHOLDED_VIEW].loaded = false; // force reload\n    app_data.images[image_iter].read(thresholded_file, m_opt, THRESHOLDED_VIEW);\n    temporary_files().files.insert(thresholded_file);\n  }\n\n  // We may not want to refresh the pixmap right away if we are going to\n  // update the GUI anyway in proper time\n  if (refresh_pixmap)\n    refreshPixmap();\n}\n\nvoid MainWidget::maybeGenHillshade() {\n\n  int num_images = app_data.images.size();\n\n  // Create the hillshaded images and save them to disk. We have to do\n  // it each time as perhaps the hillshade parameters changed.\n  for (int image_iter = m_beg_image_id; image_iter < m_end_image_id; image_iter++) {\n\n    if (app_data.images[image_iter].m_display_mode != HILLSHADED_VIEW)\n      continue;\n\n    if (app_data.images[image_iter].name.find(\"_CMAP.tif\") != std::string::npos) {\n      app_data.images[image_iter].m_display_mode = REGULAR_VIEW;\n      continue; // silently ignore colormap images\n    }\n\n    // Cannot hillshade a polygon or xyz data\n    if (app_data.images[image_iter].isPolyOrCsv()) {\n      app_data.images[image_iter].m_display_mode = REGULAR_VIEW;\n      continue;\n    }\n\n    if (!app_data.images[image_iter].has_georef) {\n      popUp(\"Hill-shading requires georeferenced images.\");\n      app_data.images[image_iter].m_display_mode = REGULAR_VIEW;\n      return;\n    }\n\n    std::string input_file = app_data.images[image_iter].name;\n    int num_channels = app_data.images[image_iter].img().planes();\n    if (num_channels != 1) {\n      // Turn off hillshade mode for all images which don't support it,\n      // or else this error will keep on coming up\n      for (int iter2 = 0; iter2 < num_images; iter2++) {\n        int num_channels2 = app_data.images[iter2].img().planes();\n        if (num_channels2 != 1) {\n          // TODO(oalexan1): Do we need a lock here?\n          app_data.images[iter2].m_display_mode = REGULAR_VIEW;\n        }\n      }\n\n      // TODO(oalexan1): This warning still shows up many times\n      // the images are side-by-side\n      popUp(\"Hill-shading makes sense only for single-channel images.\");\n      continue;\n    }\n\n    // Save the hillshaded images to disk (unless it already exists)\n    std::string hillshaded_file;\n    bool have_gui = true;\n    bool success = write_hillshade(m_opt,\n                                    have_gui,\n                                    m_hillshade.azimuth,\n                                    m_hillshade.elevation,\n                                    input_file, hillshaded_file);\n\n    if (!success) {\n      app_data.images[image_iter].m_display_mode = REGULAR_VIEW;\n      return;\n    }\n\n    app_data.images[image_iter].read(hillshaded_file, m_opt, HILLSHADED_VIEW);\n    temporary_files().files.insert(hillshaded_file);\n  }\n}\n\n// Allow the user to select multiple windows.\nvoid MainWidget::allowMultipleSelections() {\n  m_allowMultipleSelections = !m_allowMultipleSelections;\n  m_wid_menu_mgr->m_allowMultipleSelections_action->setChecked(m_allowMultipleSelections);\n  if (!m_allowMultipleSelections) {\n    m_selectionRectangles.clear();\n    refreshPixmap();\n  }\n}\n\n// This is reached with right-click from the list of images on the left\nvoid MainWidget::toggleHillshadeFromImageList(int imageIndex) {\n  if (app_data.images[imageIndex].m_display_mode == HILLSHADED_VIEW)\n    app_data.images[imageIndex].m_display_mode = REGULAR_VIEW;\n  else\n    app_data.images[imageIndex].m_display_mode = HILLSHADED_VIEW;\n\n  // We will assume if the user wants to see the hillshade\n  // status of this image change, he'll also want it on top.\n  bringImageOnTop(imageIndex);\n\n  refreshHillshade();\n}\n\n// This is reached with right-click from the image itself\nvoid MainWidget::toggleHillshadeImageRightClick() {\n  for (int image_iter = m_beg_image_id; image_iter < m_end_image_id; image_iter++) {\n    if (app_data.images[image_iter].m_display_mode == HILLSHADED_VIEW)\n      app_data.images[image_iter].m_display_mode = REGULAR_VIEW;\n    else if (app_data.images[image_iter].m_display_mode != HILLSHADED_VIEW)\n      app_data.images[image_iter].m_display_mode = HILLSHADED_VIEW;\n  }\n\n  refreshHillshade();\n}\n\nvoid MainWidget::refreshHillshade() {\n  m_threshold.calcMode = false;\n  MainWidget::maybeGenHillshade();\n\n  refreshPixmap();\n}\n\nvoid MainWidget::zoomToImage(int imageIndex) {\n\n  // We will assume if the user wants to zoom to this image,\n  // it should be on top.\n  bringImageOnTop(imageIndex);\n\n  // Set the view window to be the region encompassing the image\n  BBox2 world_box = app_data.image2world_trans(\n    app_data.images[imageIndex].image_bbox, imageIndex);\n  double aspect = double(m_window_width) / m_window_height;\n  m_current_view = vw::geometry::expandBoxToRatio(world_box, aspect);\n\n  // Redraw in the computed window\n  refreshPixmap();\n}\n\nvoid MainWidget::bringImageOnTopSlot(int imageIndex) {\n  bringImageOnTop(imageIndex);\n  refreshPixmap();\n}\n\nvoid MainWidget::pushImageToBottomSlot(int imageIndex) {\n  pushImageToBottom(imageIndex);\n  refreshPixmap();\n}\n\nvoid MainWidget::viewHillshadedImages(bool hillshade_mode) {\n  MainWidget::setHillshadeMode(hillshade_mode);\n  refreshHillshade();\n}\n\n// Each image can be hillshaded independently of the others\nvoid MainWidget::setHillshadeMode(bool hillshade_mode) {\n  for (int image_iter = m_beg_image_id; image_iter < m_end_image_id; image_iter++) {\n    if (hillshade_mode)\n      app_data.images[image_iter].m_display_mode = HILLSHADED_VIEW;\n    else\n      app_data.images[image_iter].m_display_mode = REGULAR_VIEW;\n  }\n\n}\n\n// Ensure the current image is displayed. Note that this on its own\n// does not refresh the view as refreshPixmap() is not called.\nvoid MainWidget::showImage(std::string const& image_name) {\n\n  if (!m_chooseFiles)\n    return;\n\n  m_chooseFiles->unhide(image_name);\n}\n\n// The image with the given index will be on top when shown.\nvoid MainWidget::bringImageOnTop(int image_index) {\n  auto it = std::find(m_filesOrder.begin(), m_filesOrder.end(), image_index);\n  if (it != m_filesOrder.end()) {\n    m_filesOrder.erase(it);\n    m_filesOrder.push_back(image_index); // show last, so on top\n  }\n\n  // The image should be visible\n  MainWidget::showImage(app_data.images[image_index].name);\n}\n\n// The image with the given index will be on top when shown.\nvoid MainWidget::pushImageToBottom(int image_index) {\n  auto it = std::find(m_filesOrder.begin(), m_filesOrder.end(), image_index);\n  if (it != m_filesOrder.end()) {\n    m_filesOrder.erase(it);\n    m_filesOrder.insert(m_filesOrder.begin(), image_index); // show first, so at the bottom\n  }\n\n  // The image should be visible\n  MainWidget::showImage(app_data.images[image_index].name);\n}\n\n// Convert the crop window to original pixel coordinates from\n// pixel coordinates on the screen.\n// TODO: Make screen2world() do it, to take an input a QRect (or BBox2)\n// and return as output the converted box.\nbool MainWidget::get_crop_win(QRect & win) {\n\n  // This pop-up will be shown when the user attempts to run stereo from\n  // the gui.\n  if (m_end_image_id - m_beg_image_id != 1) {\n    popUp(\"Must have just one image in each window to be able to select \"\n          \"regions for stereo.\");\n    m_cropWinMode = false;\n    m_rubberBand = m_emptyRubberBand;\n    m_stereoCropWin = BBox2();\n    refreshPixmap();\n    return false;\n  }\n\n  if (m_stereoCropWin.empty()) {\n    popUp(\"No valid region for stereo is present. Regions can be selected \"\n          \"with Control-Mouse in each image.\");\n    return false;\n  }\n\n  win = bbox2qrect(app_data.world2image_trans(m_stereoCropWin, m_beg_image_id));\n  return true;\n}\n\nvoid MainWidget::zoom(double scale) {\n\n  updateCurrentMousePosition();\n  scale = std::max(1e-8, scale);\n  vw::BBox2 current_view = (m_current_view - m_curr_world_pos) / scale + m_curr_world_pos;\n\n  if (!current_view.empty()) {\n    // Check to make sure we haven't hit our zoom limits.\n    m_current_view = current_view;\n    m_can_emit_zoom_all_signal = true;\n    refreshPixmap();\n  }\n}\n\nvoid MainWidget::resizeEvent(QResizeEvent*) {\n  QRect v = this->geometry();\n  m_window_width  = std::max(v.width(), 1);\n  m_window_height = std::max(v.height(), 1);\n\n  // If we already have a view, keep it but adjust it a bit if the\n  // window aspect ratio changed as result of resizing. The\n  // corresponding pixel box will be computed automatically.\n  double ratio = double(m_window_width) / double(m_window_height);\n  if (m_current_view.empty())\n    m_current_view = vw::geometry::expandBoxToRatio(m_world_box, ratio);\n  else\n    m_current_view = vw::geometry::expandBoxToRatio(m_current_view, ratio);\n\n  if (m_firstPaintEvent) {\n    // Avoid calling refreshPixmap() in this case, as resizeEvent()\n    // will be followed anyway by paintEvent(), will call\n    // refreshPixmap(). Otherwise work gets duplicated which affects\n    // rendering speed.\n    return;\n  }\n\n  // This is necessary, otherwise the image won't be redrawn\n  refreshPixmap();\n\n  return;\n}\n\n// Transform an image taking into account the georeference.\nvoid MainWidget::renderGeoreferencedImage(double scale_out,\n                                          int image_index,\n                                          QPainter* paint,\n                                          bool has_csv,\n                                          QImage const& sourceImage,\n                                          BBox2i const& screen_box,\n                                          BBox2i const& region_out,\n                                          ImageView<int> & drawn_already) {\n\n  // Create a QImage object to store the transformed image\n  QImage transformedImage = QImage(screen_box.width(), screen_box.height(),\n                                   QImage::Format_ARGB32_Premultiplied);\n  \n  // TODO(oalexan1): Cache the last 10 images to not recompute them all the time\n  // when toggling images on and off.\n  \n  // The world2image call can be very expensive. Tabulate it with sampling,\n  // and then invoke it using bicubic interpolation.\n  // This is a speedup.\n  // TODO(oalexan1): Factor out this logic.\n  // TODO(oalexan1): This should happen just once per given screen box. So toggling an\n  // image on and off should not require recomputing this.\n  int rate = 5;\n  int cols = screen_box.max().x()/rate + 2 + vw::BicubicInterpolation::pixel_buffer;\n  int rows = screen_box.max().y()/rate + 2 + vw::BicubicInterpolation::pixel_buffer;\n  ImageView<Vector2> screen2world_cache(cols, rows);\n  bool can_cache = true;\n  #pragma omp parallel for\n  for (int col = 0; col < cols; col++) {\n    for (int row = 0; row < rows; row++) {\n      Vector2 screen_pt(col*rate, row*rate);\n      Vector2 world_pt = screen2world(screen_pt);\n      Vector2 p;\n      try {\n        p = app_data.world2image_trans(world_pt, image_index);\n      } catch (...) {\n        // Something went wrong, the results won't be reliable\n        #pragma omp critical\n        can_cache = false;\n      }\n      screen2world_cache(col, row) = p;\n    }\n  }\n  \n  // Create bicubic interpolator\n  ImageViewRef<Vector2> screen2world_cache_interp\n    = interpolate(screen2world_cache, BicubicInterpolation(), ConstantEdgeExtension());\n\n  // Initialize all pixels to transparent\n  for (int col = 0; col < transformedImage.width(); col++) {\n    for (int row = 0; row < transformedImage.height(); row++) {\n      transformedImage.setPixel(col, row, QColor(0, 0, 0, 0).rgba());\n    }\n  }\n\n  #pragma omp parallel for\n  for (int x = screen_box.min().x(); x < screen_box.max().x(); x++) {\n    for (int y = screen_box.min().y(); y < screen_box.max().y(); y++) {\n\n      // Skip pixels that were already drawn. Cannot handle csv files.\n      if (drawn_already(x, y) != 0 && !has_csv)\n        continue;\n\n      // p is in pixel coordinates of image i\n      Vector2 p;\n      if (can_cache) {\n        double col = double(x)/double(rate);\n        double row = double(y)/double(rate);\n        p = screen2world_cache_interp(col, row);\n      } else {\n        // Convert from a pixel as seen on screen to the world coordinate system\n        Vector2 world_pt = screen2world(Vector2(x, y));\n\n        try {\n          p = app_data.world2image_trans(world_pt, image_index);\n        } catch (const std::exception& e) {\n          continue;\n        }\n      }\n\n      // Convert to scaled image pixels and snap to integer value\n      p = floor(p/scale_out);\n\n      int px = p.x() - region_out.min().x();\n      int py = p.y() - region_out.min().y();\n      if (px < 0 || py < 0 || px >= sourceImage.width() || py >= sourceImage.height())\n        continue;\n\n      // If the pixel is black or transparent, skip it\n      QColor color = sourceImage.pixel(px, py);\n      if (color == QColorConstants::Transparent || color.alpha() == 0)\n        continue;\n      if (color.red() == 0 && color.green() == 0 && color.blue() == 0)\n        continue;\n\n      transformedImage.setPixel(x-screen_box.min().x(),\n                                y-screen_box.min().y(),\n                                color.rgba());\n\n      // Flag this as drawn. No need to protect this with a lock.\n      // TODO(oalexan1): Account here for hasCsv, as then this\n      // logic does not work.\n      if (!has_csv)\n        drawn_already(x, y) = 1;\n    }\n  }\n\n  // Send the QImage object to the painter\n  QRect rect(screen_box.min().x(), screen_box.min().y(),\n             screen_box.width(), screen_box.height());\n  paint->drawImage(rect, transformedImage);\n}\n\n// Build a colormap from a colormap style string. Falls back to\n// \"binary-red-blue\" if the style is not recognized.\nvw::Colormap buildColormap(std::string const& colormap_style) {\n  std::map<float, vw::Vector3u> lut_map;\n  try {\n    vw::parseColorStyle(colormap_style, lut_map);\n  } catch (...) {\n    vw::parseColorStyle(\"binary-red-blue\", lut_map);\n  }\n  return vw::Colormap(lut_map);\n}\n\n// Draw the images on the screen\nvoid MainWidget::drawImage(QPainter* paint) {\n\n  // Sometimes we arrive here prematurely, before the window geometry was\n  // determined. Then, there is nothing to do.\n\n  if (m_current_view.empty()) return;\n\n  // See where it fits on the screen\n  BBox2i full_screen_box;\n  full_screen_box.grow(floor(world2screen(m_current_view.min())));\n  full_screen_box.grow(ceil(world2screen(m_current_view.max())));\n\n  // Keep track of which pixels were drawn. Initialize with zeros.\n  ImageView<int> drawn_already;\n  if (app_data.use_georef) {\n    drawn_already.set_size(full_screen_box.max().x(), full_screen_box.max().y());\n    for (int col = 0; col < drawn_already.cols(); col++) {\n      for (int row = 0; row < drawn_already.rows(); row++) {\n        drawn_already(col, row) = 0;\n      }\n    }\n  }\n\n  // Stopwatch sw1;\n  // sw1.start();\n\n  // When using georeferenced images we will draw the last image to be drawn\n  // first, so that we skip the pixels from other images that are covered by it.\n  // This is a speedup. Needs to be implemented also without a georef and when\n  // there exist csv files (which will be tricky).\n  std::vector<int> draw_order;\n  bool has_csv = false;\n  for (int j = m_beg_image_id; j < m_end_image_id; j++) {\n    int i = m_filesOrder[j]; // image index\n\n    // Don't show files the user wants hidden\n    if (m_chooseFiles && m_chooseFiles->isHidden(app_data.images[i].name))\n      continue;\n\n    draw_order.push_back(i);\n    \n    if (app_data.images[i].m_isCsv)\n      has_csv = true;\n  }\n  if (app_data.use_georef && !has_csv)\n    std::reverse(draw_order.begin(), draw_order.end());\n  \n  // For --colorize, compute joint min/max across all images in this widget\n  vw::Vector2 joint_bounds(std::numeric_limits<double>::max(),\n                           -std::numeric_limits<double>::max());\n  bool any_colorize = false;\n  for (int i = m_beg_image_id; i < m_end_image_id; i++)\n    any_colorize = any_colorize || app_data.images[i].colorize;\n  if (any_colorize)\n    joint_bounds = calcJointBounds(app_data.images,\n                                   m_beg_image_id, m_end_image_id);\n\n  // Draw the images\n  // TODO(oalexan1): Must use a single QImage, that will be updated as we go\n  // over images and scattered points in csv.\n  for (size_t j = 0; j < draw_order.size(); j++) {\n\n    int i = draw_order[j]; // image index\n\n    // Load if not loaded so far\n    app_data.images[i].load();\n\n    if (app_data.images[i].m_isPoly)\n      continue; // those will be always drawn on top of images, to be done later\n\n    // TODO(oalexan1): Must draw this onto a QImage and then draw the QImage\n    // Onto the same QImage will draw the imgaes.\n    //QImage image;\n    //QPainter local_painter(&image); \n    // later pass this to the widget painter.\n    // Maybe should replace m_pixmap with QImage.\n    if (app_data.images[i].m_isCsv) {\n      MainWidget::drawScatteredData(paint, i, joint_bounds);\n      continue; // there is no image, so no point going on\n    }\n\n    // The portion of the image in the current view.\n    BBox2 curr_world_box = m_current_view;\n    BBox2 B = app_data.image2world_trans(app_data.images[i].image_bbox, i);\n    curr_world_box.crop(B);\n\n    // This is a bugfix for the case when the world boxes\n    // of images do not overlap.\n    if (curr_world_box.empty())\n      continue;\n\n    // See where it fits on the screen\n    BBox2i screen_box;\n    screen_box.grow(floor(world2screen(curr_world_box.min())));\n    screen_box.grow(ceil(world2screen(curr_world_box.max())));\n\n    // Ensure the screen box is never empty\n    if (screen_box.min().x() >= screen_box.max().x())\n      screen_box.max().x() = screen_box.min().x() + 1;\n    if (screen_box.min().y() >= screen_box.max().y())\n      screen_box.max().y() = screen_box.min().y() + 1;\n\n    // If all screen pixels are drawn already based on images that should be\n    // on top of this one, no need to draw this image.\n    if (app_data.use_georef) {\n      bool all_drawn = true;\n      #pragma omp parallel for\n      for (int x = screen_box.min().x(); x < screen_box.max().x(); x++) {\n        for (int y = screen_box.min().y(); y < screen_box.max().y(); y++) {\n          if (drawn_already(x, y) == 0) {\n            #pragma omp critical\n            all_drawn = false;\n            break;\n          }\n        }\n      }\n      if (all_drawn)\n       continue; // cannot break as the next image may use a different screen box\n    }\n\n    // Go from world coordinates to pixels in the current image.\n    BBox2 image_box = app_data.world2image_trans(curr_world_box, i);\n\n    // Grow a bit to integer, as otherwise strange things happen\n    // when zooming in too close\n    image_box.min() = floor(image_box.min());\n    image_box.max() = ceil(image_box.max());\n\n    // Since the image portion contained in image_box could be huge, but the\n    // screen area small, render a sub-sampled version of the image for speed.\n    // Increase the scale a little. This will make the image a little blurrier\n    // but will be faster to render.\n    double scale = sqrt((1.0*image_box.width()) * image_box.height())/\n      std::max(1.0, sqrt((1.0*screen_box.width()) * screen_box.height()));\n    scale *= 1.3;\n    \n    double scale_out = 1.0; // will be modified by get_image_clip()\n    BBox2i region_out;\n    bool highlight_nodata = (app_data.images[i].m_display_mode == THRESHOLDED_VIEW);\n    if (!std::isnan(asp::stereo_settings().nodata_value)) {\n      // When the user specifies --nodata-value, we will show\n      // nodata pixels as transparent.\n      highlight_nodata = false;\n    }\n\n    // Build a colormap if this image has colorize set\n    vw::Colormap const* colormap_ptr = nullptr;\n    vw::Colormap colormap_obj = buildColormap(\"binary-red-blue\");\n    if (app_data.images[i].colorize && !app_data.images[i].colormap.empty()) {\n      colormap_obj = buildColormap(app_data.images[i].colormap);\n      colormap_ptr = &colormap_obj;\n    }\n\n    QImage qimg;\n    app_data.images[i].currentImg().get_image_clip(scale, image_box,\n                                                   highlight_nodata,\n                                                   colormap_ptr,\n                                                   joint_bounds,\n                                                   qimg, scale_out,\n                                                   region_out);\n\n    // Draw on image screen\n    Stopwatch sw4;\n    sw4.start();\n    if (!app_data.use_georef) {\n      // This is a regular image, no georeference, just pass it to the Qt painter\n      QRect rect(screen_box.min().x(), screen_box.min().y(),\n                  screen_box.width(), screen_box.height());\n      paint->drawImage(rect, qimg);\n    } else {\n      MainWidget::renderGeoreferencedImage(scale_out, i, paint, has_csv, qimg,\n                                           screen_box, region_out, drawn_already);\n    }\n\n  } // End loop through input images\n\n  // sw1.stop();\n  // vw_out() << \"Render time (seconds): \" << sw1.elapsed_seconds() << \"\\n\";\n\n  return;\n} // End function drawImage()\n\n// Draw irregular xyz data to be plotted at (x, y) location with z giving\n// the intensity. May be colorized.\n// TODO(oalexan1): There is a bug now. Need to record the screen pixels\n// at which drawScatteredData() was called, and then not draw over them.\n// See the caller of this function.\n// It sounds like your problem would be best solved by rendering the widget to a\n// pixmap (within the paint event), and then drawing that pixmap to the screen\n// in the paint event. This way, you can draw the scattered data to the pixmap,\n// and it will be preserved across paint events.\n// https://stackoverflow.com/questions/13058669/how-to-obtain-the-frame-buffer-from-within-qwidgets-paintevent\nvoid MainWidget::drawScatteredData(QPainter* paint, int image_index,\n                                   vw::Vector2 const& bounds_override) {\n\n  int r = asp::stereo_settings().plot_point_radius;\n\n  // Use caller-provided joint bounds when valid, otherwise compute locally\n  double min_val = 0.0, max_val = 0.0; // will change\n  if (bounds_override[0] < bounds_override[1]) {\n    min_val = bounds_override[0];\n    max_val = bounds_override[1];\n  } else if (asp::stereo_settings().min < asp::stereo_settings().max) {\n    min_val = asp::stereo_settings().min;\n    max_val = asp::stereo_settings().max;\n  } else {\n    findRobustBounds(app_data.images[image_index].scattered_data,\n                     min_val, max_val);\n  }\n\n  vw::Colormap colormap = buildColormap(app_data.images[image_index].colormap);\n\n  for (size_t pt_it = 0; pt_it < app_data.images[image_index].scattered_data.size(); pt_it++) {\n    auto const& P = app_data.images[image_index].scattered_data[pt_it];\n\n    vw::Vector2 world_P = app_data.proj2world(subvector(P, 0, 2), image_index);\n    Vector2 screen_P = world2screen(world_P);\n    QPoint Q(screen_P.x(), screen_P.y());\n\n    // Scale the intensity to [0, 1]\n    double s = (P[2] - min_val) / (max_val - min_val);\n    if (max_val <= min_val)\n      s = 0.0; // degenerate case\n    if (s > 1.0)\n      s = 1.0;\n    if (s < 0.0)\n      s = 0.0;\n\n    QColor c;\n    if (app_data.images[image_index].colorize) {\n      // Get the color from the colormap\n      PixelRGB<uint8> v = colormap(s).child();\n      c = QColor(v[0], v[1], v[2]);\n    } else {\n      // Grayscale color\n      s = round(255.0 * s);\n      c = QColor(s, s, s);\n    }\n\n    // Draw the ball\n    paint->setPen(QPen(c));\n    paint->setBrush(QBrush(c));\n    paint->drawEllipse(Q, r, r);\n  }\n\n  return;\n}\n\nvoid MainWidget::updateCurrentMousePosition() {\n  m_curr_world_pos = screen2world(m_curr_pixel_pos);\n}\n\nvw::BBox2 MainWidget::current_view() const {\n  return m_current_view;\n}\n\nvoid MainWidget::zoomToRegion(vw::BBox2 const& region) {\n  if (region.empty()) {\n    popUp(\"Cannot zoom to empty region.\");\n    return;\n  }\n  double ratio = double(m_window_width) / double(m_window_height);\n  m_current_view = vw::geometry::expandBoxToRatio(region, ratio);\n  refreshPixmap();\n}\n\n// --------------------------------------------------------------\n//             MainWidget Event Handlers\n// --------------------------------------------------------------\n\nvoid MainWidget::refreshPixmap() {\n  // This is an expensive function. It will completely redraw\n  // what is on the screen. For that reason, don't draw directly on\n  // the screen, but rather into m_pixmap, which we use as a cache.\n  // If just tiny redrawings are necessary, such as updating the\n  // rubberband, simply pull the view from this cache,\n  // and update the rubberband on top of it. This technique\n  // is a well-known design pattern in Qt.\n  if (asp::stereo_settings().zoom_all_to_same_region && m_can_emit_zoom_all_signal) {\n    m_can_emit_zoom_all_signal = false;\n    emit zoomAllToSameRegionSignal(m_beg_image_id);\n    // Now we call the parent, which will set the zoom window,\n    // and call back here for all widgets.\n    return;\n  }\n\n  m_pixmap = QPixmap(size());\n  m_pixmap.fill(m_backgroundColor);\n  QPainter paint;\n  paint.begin(&m_pixmap);\n  MainWidget::drawImage(&paint);\n  paint.end();  // Make sure to end the painting session\n\n  // Invokes MainWidget::PaintEvent(). This will draw the pixmap on the screen,\n  // and draw the rubberband, interest points, etc. on top of it.\n  update();\n  return;\n}\n\nvoid MainWidget::paintEvent(QPaintEvent * /* event */) {\n\n  if (m_firstPaintEvent) {\n    // This will be called the very first time the display is\n    // initialized. We will paint into the pixmap, and\n    // then display the pixmap on the screen.\n    m_firstPaintEvent = false;\n    refreshPixmap();\n  }\n\n  // Note that we draw from the cached pixmap, instead of redrawing\n  // the image from scratch.\n  QPainter paint(this);\n  paint.drawPixmap(0, 0, m_pixmap);\n\n  QColor      rubberBandColor = QColor(\"yellow\");\n  QColor      cropWinColor    = QColor(\"red\");\n  std::string polyColorStr    = m_polyColor;\n  QColor      polyColor       = QColor(polyColorStr.c_str());\n\n  // We will color the rubberband in the crop win color if we are\n  // in crop win mode.\n  if (m_cropWinMode)\n    paint.setPen(cropWinColor);\n  else\n    paint.setPen(rubberBandColor);\n\n  // Draw the rubberband. We adjust by subtracting 1 from right and\n  // bottom corner below to be consistent with updateRubberBand(), as\n  // rect.bottom() is rect.top() + rect.height()-1.\n  paint.drawRect(m_rubberBand.normalized().adjusted(0, 0, -1, -1));\n\n  // Draw the stereo crop window.  Note that the stereo crop window\n  // may exist independently of whether the rubber band exists.\n  if (!m_stereoCropWin.empty()) {\n    // TODO(oalexan1): Is this logic redundant given the block below?\n    QRect R = bbox2qrect(world2screen(m_stereoCropWin));\n    paint.setPen(cropWinColor);\n    paint.drawRect(R.normalized().adjusted(0, 0, -1, -1));\n  }\n\n  // If we allow multiple selection windows\n  for (size_t win = 0; win < m_selectionRectangles.size(); win++) {\n    QRect R = bbox2qrect(world2screen(m_selectionRectangles[win]));\n    paint.setPen(cropWinColor);\n    paint.drawRect(R.normalized().adjusted(0, 0, -1, -1));\n\n    // Bugfix for when the selection rectangle is too small to be seen\n    // by the user.  We draw a small circle.\n    if (R.width() < 2 && R.height() < 2) {\n      paint.setPen(cropWinColor);\n      paint.setBrush(cropWinColor);\n      // Find Qrect upper-left-corner\n      int x0 = R.x() + R.width()/2;\n      int y0 = R.y() + R.height()/2;\n      int len = 2;\n      paint.drawEllipse(x0, y0, 2*len, 2*len);\n    }\n  }\n\n  // TODO(oalexan1): All the logic below must be in its own function,\n  // called for example plotPolygons().\n  // When deleting vertices need to use a georef as well.\n\n  bool plotPoints    = false, plotEdges = true, plotFilled = false;\n  int  drawVertIndex = 0;\n  bool isPolyClosed  = false;\n  std::string layer  = \"\";\n\n  // Plot the polygonal line which we are profiling\n  if (m_profile.mode) {\n    vw::geometry::dPoly poly;\n    poly.appendPolygon(m_profile.x.size(),\n                        vw::geometry::vecPtr(m_profile.x),\n                        vw::geometry::vecPtr(m_profile.y),\n                        isPolyClosed, polyColorStr, layer);\n    bool showIndices = false;\n    MainWidget::plotPoly(plotPoints, plotEdges, plotFilled, showIndices,\n                          m_lineWidth, drawVertIndex, polyColor, paint,\n                          poly);\n  }\n\n  // TODO(oalexan1): Should the persistent polygons be drawn\n  // as part of the drawImage() call? That will be a lot more efficient\n  // than being redrawn any time the mouse moves, etc. But then how to handle\n  // polygons being edited?\n  \n  MainWidget::plotPolys(paint);\n  \n  // Call another function to handle drawing the interest points\n  // This drawing is expensive as it happens every time paintEvent()\n  // is called, which is is countless times when the mouse is\n  // dragged, for example.  But such a high refresh rate may be\n  // necessary for editing interest point matches and polygons.\n  // Something clever is needed, such as putting polygons and interest\n  // points which are not modified in refreshPixmap() which is called rarely,\n  // and here putting only the actively modified elements. For now,\n  // editing of ip is not allowed for viewing pairwise matches, so those\n  // ip are drawn in refreshPixmap()\n  if (asp::stereo_settings().view_matches ||\n      asp::stereo_settings().pairwise_matches ||\n      asp::stereo_settings().pairwise_clean_matches) {\n    if (m_end_image_id - m_beg_image_id > 1) {\n      asp::stereo_settings().view_matches = false;\n      popUp(\"Images must be side-by-side to view/edit matches.\");\n      emit toggleViewMatchesSignal();\n    } else {\n      m_match_mgr.drawInterestPoints(&paint, this, m_beg_image_id, m_base_image_id, \n                                     m_window_width, m_window_height);\n    }\n  }\n\n} // end paint event\n\n// Call paintEvent() on the edges of the rubberband.\n// Use a margin wider than 1 pixel to account for HiDPI/Retina displays\n// where devicePixelRatio > 1.\nvoid MainWidget::updateRubberBand(QRect & R) {\n  QRect rect = R.normalized();\n  if (rect.width() > 0 || rect.height() > 0) {\n    int w = devicePixelRatio() + 1;\n    update(rect.left() - w, rect.top() - w, rect.width() + 2*w, w*2);\n    update(rect.left() - w, rect.top() - w, w*2, rect.height() + 2*w);\n    update(rect.left() - w, rect.bottom() - w, rect.width() + 2*w, w*2);\n    update(rect.right() - w, rect.top() - w, w*2, rect.height() + 2*w);\n  }\n}\n\n// Convert a length in pixels to a length in world coordinates\ndouble MainWidget::pixelToWorldDist(double pd) {\n\n  Vector2 p = screen2world(Vector2(0, 0));\n  Vector2 q = screen2world(Vector2(pd, 0));\n\n  return norm_2(p-q);\n}\n\nvoid MainWidget::viewMatches() {\n  // Complain if there are multiple images and matches was turned on\n  if ((m_end_image_id - m_beg_image_id != 1) && asp::stereo_settings().view_matches) {\n    asp::stereo_settings().view_matches = false;\n    popUp(\"Must have the images side-by-side to view/edit interest point matches.\");\n    emit toggleViewMatchesSignal();\n    return;\n  }\n  \n  update(); // redraw matches on top of existing images\n}\n\nvoid MainWidget::addMatchPoint() {\n\n  if (m_beg_image_id >= static_cast<int>(m_match_mgr.m_matchlist.getNumImages())) {\n    popUp(\"Number of existing matches is corrupted. Cannot add matches.\");\n    return;\n  }\n\n  if (m_end_image_id - m_beg_image_id != 1) {\n    asp::stereo_settings().view_matches = false;\n    popUp(\"Must have the images side-by-side to view/edit interest point matches.\");\n    emit toggleViewMatchesSignal();\n    return;\n  }\n\n  if (!asp::stereo_settings().view_matches) {\n    popUp(\"Must turn on viewing matches from the menu to add interest point matches.\");\n    emit toggleViewMatchesSignal();\n    return;\n  }\n  \n  m_match_mgr.m_editingMatches = true;\n\n  // Convert mouse coords to world coords then image coords.\n  Vector2 world_coord    = screen2world(Vector2(m_mousePrsX, m_mousePrsY));\n  Vector2 P              = app_data.world2image_trans(world_coord, m_base_image_id);\n\n  // Try to add the new IP.\n  bool is_good = m_match_mgr.m_matchlist.addPoint(m_beg_image_id, ip::InterestPoint(P.x(), P.y()));\n\n  if (!is_good) {\n    popUp(std::string(\"Add matches by adding a point in the left-most \")\n          + \"image and corresponding matches in the other images left to right. \"\n          + \"Cannot add this match.\");\n    return;\n  }\n\n  // Must refresh the matches in all the images, not just this one.\n  // Will keep the zoom level.\n  emit updateMatchesSignal();\n}\n\n// We cannot delete match points unless all images have the same number of them.\nvoid MainWidget::deleteMatchPoint() {\n\n  if (m_end_image_id - m_beg_image_id != 1) {\n    popUp(\"Must have just one image in each window to delete interest point matches.\");\n    return;\n  }\n\n  if (!asp::stereo_settings().view_matches) {\n    popUp(\"Must turn on viewing matches from the menu to delete interest point matches.\");\n    emit toggleViewMatchesSignal();\n    return;\n  }\n\n  if (m_match_mgr.m_matchlist.getNumPoints() == 0) {\n    popUp(\"No matches to delete.\");\n    return;\n  }\n\n  // Find the closest match to this point.\n  Vector2 P = screen2world(Vector2(m_mousePrsX, m_mousePrsY));\n  P = app_data.world2image_trans(P, m_base_image_id);\n  double dist_limit = MATCH_POINT_DISTANCE_LIMIT;\n  int min_index = m_match_mgr.m_matchlist.findNearestMatchPoint(m_beg_image_id, P, dist_limit);\n\n  if (min_index < 0) {\n    popUp(\"Did not find a nearby match to delete.\");\n    return;\n  }\n\n  m_match_mgr.m_editingMatches = true;\n  bool result = false;\n  try {\n    result = m_match_mgr.m_matchlist.deletePointAcrossImages(min_index);\n  } catch (std::exception const& e) {\n    popUp(e.what());\n    return;\n  }\n\n  if (result) {\n    // Must refresh the matches in all the images, not just this one\n    if (asp::stereo_settings().view_matches) {\n      // Will keep the zoom level\n      emit updateMatchesSignal();\n    } else {\n      // Will reset the layout before continuing with matches\n      asp::stereo_settings().view_matches = true;\n      emit toggleViewMatchesSignal();\n    }\n  }\n}\n\n// Delete the selections that contain the current point\nvoid MainWidget::deleteSelection() {\n\n  Vector2 P = screen2world(Vector2(m_mousePrsX, m_mousePrsY));\n\n  // The main crop win\n  if (m_stereoCropWin.contains(P)) {\n    QRect R = bbox2qrect(world2screen(m_stereoCropWin));\n    updateRubberBand(R); // mark that later we should redraw this polygonal line\n    m_stereoCropWin = BBox2();\n  }\n\n  std::vector<BBox2> curr_rects;\n  for (size_t it = 0; it < m_selectionRectangles.size(); it++) {\n    if (!m_selectionRectangles[it].contains(P)) {\n      curr_rects.push_back(m_selectionRectangles[it]);\n    } else {\n      QRect R = bbox2qrect(world2screen(m_selectionRectangles[it]));\n      updateRubberBand(R); // mark that later we should redraw this polygonal line\n    }\n  }\n  m_selectionRectangles = curr_rects;\n\n  return;\n}\n\n// Hide images not intersecting given selected region\nvoid MainWidget::hideImagesNotInRegion() {\n\n  if (!m_chooseFiles)\n    return;\n\n  if (m_stereoCropWin.empty()) {\n    popUp(\"Must select a region with Control-Mouse before invoking this.\");\n    return;\n  }\n\n  for (int j = m_beg_image_id; j < m_end_image_id; j++) {\n\n    int image_it = m_filesOrder[j];\n    std::string fileName = app_data.images[image_it].name;\n    BBox2i image_box = app_data.world2image_trans(m_stereoCropWin, image_it);\n    image_box.crop(BBox2(0, 0, app_data.images[image_it].img().cols(),\n                          app_data.images[image_it].img().rows()));\n\n    if (image_box.empty())\n      m_chooseFiles->hide(fileName);\n    else\n    m_chooseFiles->unhide(fileName);\n  }\n\n  refreshPixmap();\n\n  return;\n}\n\n// Show the current image threshold, and allow the user to change it.\nvoid MainWidget::setThreshold() {\n\n  std::ostringstream oss;\n  oss.precision(17);\n  oss << m_threshold.value;\n  std::string imageThresh = oss.str();\n  bool ans = getStringFromGui(this,\n      \"Image threshold\",\n      \"Image threshold\",\n      imageThresh,\n      imageThresh);\n  if (!ans)\n    return;\n\n  double thresh = atof(imageThresh.c_str());\n  MainWidget::setThreshold(thresh);\n}\n\nvoid MainWidget::setThreshold(double thresh) {\n\n  int non_poly_image = 0;\n  int num_non_poly_images = 0;\n  for (int image_iter = m_beg_image_id; image_iter < m_end_image_id; image_iter++) {\n    if (!app_data.images[image_iter].m_isPoly && !app_data.images[image_iter].m_isCsv)\n      num_non_poly_images++;\n    non_poly_image = image_iter;\n  }\n\n  if (num_non_poly_images > 1) {\n    if (std::isnan(asp::stereo_settings().nodata_value))\n      popUp(\"Must have just one image in each window to set the image threshold.\");\n    else\n      popUp(\"Must have just one image in each window to use the nodata value option.\");\n    return;\n  }\n\n  m_threshold.value = thresh;\n  vw_out() << \"Image threshold for \" << app_data.images[non_poly_image].name\n      << \": \" << m_threshold.value << std::endl;\n}\n\n// TODO(oalexan1): Each image must know its threshold\ndouble MainWidget::getThreshold() const {\n  return m_threshold.value;\n}\n\n// Set the azimuth and elevation for hillshaded images\nvoid MainWidget::setHillshadeParams() {\n\n  std::ostringstream oss;\n  oss.precision(17);\n  oss << m_hillshade.azimuth\n      << \" \"\n      << m_hillshade.elevation << std::endl;\n\n  std::string azimuthElevation = oss.str();\n  bool ans = getStringFromGui(this,\n      \"Hillshade azimuth and elevation\",\n      \"Hillshade azimuth and elevation\",\n      azimuthElevation,\n      azimuthElevation);\n  if (!ans)\n    return;\n\n  std::istringstream iss(azimuthElevation);\n  double a, e;\n  if (! (iss >> a >> e)) {\n    popUp(\"Could not read the hillshade azimuth and elevation values.\");\n    return;\n  }\n  m_hillshade.azimuth = a;\n  m_hillshade.elevation = e;\n\n  MainWidget::maybeGenHillshade();\n  refreshPixmap();\n\n  vw_out() << \"Hillshade azimuth and elevation for \" << app_data.images[m_beg_image_id].name\n           << \": \" << m_hillshade.azimuth << ' ' << m_hillshade.elevation << \"\\n\";\n}\n\n// Save the current view to a file\nvoid MainWidget::saveScreenshot() {\n\n  QString fileName =\n    QFileDialog::getSaveFileName(this, tr(\"Save screenshot\"),\n                                    \"./screenshot.bmp\", tr(\"(*.bmp *.xpm)\"));\n  if (fileName.toStdString() == \"\")\n    return;\n\n  QImageWriter writer(fileName);\n  if (!writer.write(m_pixmap.toImage())) {\n    popUp(writer.errorString().toStdString());\n  }\n\n}\n\nvoid MainWidget::setCropWin(vw::BBox2 const& stereoCropWin) {\n  m_stereoCropWin = stereoCropWin;\n}\n\n} // namespace asp\n"
  },
  {
    "path": "src/asp/GUI/MainWidget.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2024, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// \\file MainWidget.h\n// \n// A widget showing images and vector data\n// \n#ifndef __STEREO_GUI_MAIN_WIDGET_H__\n#define __STEREO_GUI_MAIN_WIDGET_H__\n\n// ASP\n#include <asp/Core/MatchList.h>\n#include <asp/GUI/GuiUtilities.h>\n#include <asp/GUI/WidgetBase.h>\n\n#include <asp/GUI/MatchPointMgr.h>\n\n// Vision Workbench\n#include <vw/Core/Thread.h>\n#include <vw/Core/Log.h>\n#include <vw/Image/Colormap.h>\n#include <vw/Image/ImageResource.h>\n#include <vw/Image/ImageViewRef.h>\n#include <vw/Image/ImageView.h>\n#include <vw/Math/BBox.h>\n#include <vw/Math/Vector.h>\n#include <vw/Cartography/GeoReference.h>\n#include <vw/Cartography/GeoTransform.h>\n#include <vw/InterestPoint/InterestPoint.h>\n#include <vw/Geometry/dPoly.h>\n\n#include <boost/filesystem/path.hpp>\n#include <boost/filesystem.hpp>\n#include <boost/shared_ptr.hpp>\n#include <boost/mpl/or.hpp>\n\n// Qt\n#include <QWidget>\n#include <QPoint>\n#include <QTimer>\n\n// Qwt\n#include <qwt_plot.h>\n#include <qwt_plot_curve.h>\n#include <qwt_point_data.h>\n#include <qwt_series_data.h>\n#include <qwt_scale_widget.h>\n\n#include <string>\n#include <vector>\n#include <list>\n#include <memory>\n\nclass QMouseEvent;\nclass QWheelEvent;\nclass QPoint;\nclass QResizeEvent;\nclass QTableWidget;\nclass QTableWidgetItem;\nclass QContextMenuEvent;\nclass QStylePainter;\n\nnamespace asp {\n\n// Forward declarations\nclass ChooseFilesDlg;\nclass WidgetMenuMgr;\n\n// This class handles user interaction with the a single image pane.\nclass MainWidget: public QwtScaleWidget, public WidgetBase {\n  Q_OBJECT\n\npublic:\n\n  // Constructors/Destructor\n  MainWidget(QWidget *parent,\n              vw::GdalWriteOptions const& opt,\n              int beg_image_id, int end_image_id, int base_image_id,\n              asp::AppData & app_data,\n              std::string & output_prefix,     // will be aliased\n              asp::MatchPointMgr & match_mgr,\n              ChooseFilesDlg * chooseFiles,\n              bool & allowMultipleSelections); // alias\n\n  virtual ~MainWidget();\n\n  bool get_crop_win(QRect & win);\n\n  // Set a default size for this widget.  This is usually overridden\n  // by parent views.\n  virtual QSize sizeHint () const { return QSize(500,500); }\n\n  // Image Manipulation Methods\n  void zoom       (double scale);\n  void viewMatches();\n  void setEditingMatches(bool editingMatches) { m_match_mgr.m_editingMatches = editingMatches; }\n  bool getEditingMatches() const { return m_match_mgr.m_editingMatches; }\n  void setThreshMode(bool turnOn) { m_threshold.calcMode = turnOn; }\n  void plotProfile(std::vector<imageData> const& images,\n                    std::vector<double> const& profileX,\n                    std::vector<double> const& profileY);\n\n  void drawOneVertex(int x0, int y0, QColor color, int lineWidth,\n                      int drawVertIndex, QPainter &paint);\n\n  void plotPolys(QPainter & paint);\n\n  void plotPoly(bool plotPoints, bool plotEdges,\n                bool plotFilled, bool showIndices, int lineWidth,\n                int drawVertIndex, // 0 is a good choice here\n                QColor const& color,\n                QPainter &paint,\n                vw::geometry::dPoly currPoly); // Make a local copy on purpose\n\n  //void plotProfilePolyLine(QStylePainter & paint,\n  void plotProfilePolyLine(QPainter & paint,\n                            std::vector<double> const& profileX,\n                            std::vector<double> const& profileY);\n\n  void   setThreshold(double thresh); // Set the image threshold\n  double getThreshold() const;            // Get the image threshold\n\n  void   setLineWidth(int lineWidth); // Set the line width for polygons\n  int  getLineWidth() const; // Get the line width for polygons\n\n  void   setPolyColor(std::string const& polyColor); // Set the color of polygons\n  std::string getPolyColor() const; // Get the color of polygons\n\n  vw::BBox2 current_view() const;\n  void  zoomToRegion (vw::BBox2 const& region);\n  void  setHillshadeMode(bool hillshade_mode);\n  vw::BBox2 firstImagePixelBox() const;\n  vw::BBox2 firstImageWorldBox(vw::BBox2 const& image_box) const;\n  void setWorldBox(vw::BBox2 const& world_box);\n  vw::BBox2 worldBox() const;\n  void keyPressEvent(QKeyEvent   *event);\n  void setCropWin(vw::BBox2 const& stereoCropWin);\n\n  bool & m_allowMultipleSelections; // alias, controlled from MainWindow for all widgets\n  bool m_polyEditMode;\nsignals:\n  void toggleViewMatchesSignal    ();\n  void recreateLayoutSignal       ();\n  void updateMatchesSignal        (); // this one will do less work and keep the zoom level\n  void uncheckProfileModeCheckbox ();\n  void uncheckPolyEditModeCheckbox();\n  void zoomAllToSameRegionSignal  (int);\n\npublic slots:\n  void sizeToFit();\n  void showFilesChosenByUser (int rowClicked, int columnClicked);\n  void zoomToImageInTableCell(int rowClicked, int columnClicked);\n  void hideShowAll_widgetVersion();\n  void customMenuRequested(QPoint pos);\n  void viewUnthreshImages();\n  void viewThreshImages  (bool refresh_pixmap);\n  void viewHillshadedImages(bool hillshade_mode);\n\n  void addMatchPoint          (); // Add a new interest point (from right click menu)\n  void deleteMatchPoint       (); // Delete an interest point (from right click menu)\n  void setThreshold           (); // Set change image threshold (from right click menu)\n  void setHillshadeParams     (); // Set the azimuth and elevation for hillshaded images.\n  void toggleHillshadeImageRightClick(); // Turn on/off hillshading on right-click on image\n  void toggleHillshadeFromImageList(int imageIndex); // Toggle hillshade by right-click on image list\n  void refreshHillshade       (); // Update the display if the state of hillshading changed.\n  void bringImageOnTopSlot    (int imageIndex); // Show this image on top of other images.\n  void pushImageToBottomSlot  (int imageIndex); // Show all other images on top of this\n  void zoomToImage            (int imageIndex); // Zoom to have this image in full view.\n  void changePolyColor        (int imageIndex); // Change the color of given set of polygons\n  void allowMultipleSelections(); // Allow the user to select multiple regions\n  void deleteSelection        (); // Delete an area selected with the mouse at current point\n  void hideImagesNotInRegion  (); // Hide images not intersecting a given region\n  void saveVectorLayerAsShapeFile(); // Save polygons in current layer as shapefile\n  void saveVectorLayerAsTextFile(); // Save polygons in current layer as a text file\n  bool contourImage           (); // Contour an image at a specified threshold\n  void setProfileMode (bool profile_mode); // Turn on and off the 1D profile tool\n  void setPolyEditMode(bool polyEditMode, bool refresh); // Turn on and off the vector layer drawing\n  void deleteVertex           (); // Delete a vertex from a vector layer\n  void deleteVertices         (); // Delete poly vertices in selected region\n  void insertVertex           (); // Insert an intermediate vertex at right-click\n  void mergePolys             (); // Merge existing polygons\n  void saveScreenshot         (); // Save a screenshot of the current imagery\n\n  void refreshPixmap(); // Draw the image\n  \nprotected:\n\n  // Setup\n  bool eventFilter(QObject *obj, QEvent *E);\n  void resizeEvent(QResizeEvent*);\n\n  // Event handlers\n  void paintEvent           (QPaintEvent *event);\n  void mousePressEvent      (QMouseEvent *event);\n  void mouseReleaseEvent    (QMouseEvent *event);\n  void mouseMoveEvent       (QMouseEvent *event);\n  void mouseDoubleClickEvent(QMouseEvent *event);\n  void wheelEvent           (QWheelEvent *event);\n  void enterEvent           (QEvent      *event);\n  void leaveEvent           (QEvent      *event);\n  void contextMenuEvent     (QContextMenuEvent *event);\n\nprivate slots:\n  void handleZoomTimeout(); // Slot for the zoom timer\n\nprivate:\n\n  class ProfilePlotter : public QwtPlot {\n  public:\n    ProfilePlotter(MainWidget * parent): QwtPlot(NULL),\n                                          m_parent(parent) {}\n    ~ProfilePlotter() {}\n\n  private:\n    void closeEvent(QCloseEvent *) {\n      // Signal to the parent that the window got closed.\n      // Turn off profiling.\n      bool profile_mode = false;\n      m_parent->setProfileMode(profile_mode);\n    }\n\n    MainWidget * m_parent;\n  };\n\n  vw::GdalWriteOptions m_opt;\n\n  // Handle to parent GUI panel used to select which of the multiple \"owned\"\n  // images should be currently displayed.\n  // - Null if there is only one image.\n  ChooseFilesDlg  *     m_chooseFiles;\n  std::vector<int>      m_filesOrder;     // The order the images are drawn in.\n\n  std::string & m_output_prefix; // alias\n  // Hillshade parameters\n  struct HillshadeSettings {\n    double azimuth = 0.0;\n    double elevation = 0.0;\n  };\n  HillshadeSettings m_hillshade;\n\n  asp::MatchPointMgr & m_match_mgr;\n\n  bool  m_firstPaintEvent;\n  QRect m_emptyRubberBand;\n  QRect m_rubberBand;\n  vw::BBox2 m_stereoCropWin;\n\n  std::vector<vw::BBox2> m_selectionRectangles;\n\n  // If we are selecting a crop win to do stereo in\n  bool m_cropWinMode;\n\n  // Profile tool state\n  struct ProfileState {\n    bool mode = false;\n    std::vector<double> x, y; // indices in the image to profile\n    std::vector<double> valsX, valsY; // index and pixel value\n    ProfilePlotter *plot = nullptr;   // the profile window\n  };\n  ProfileState m_profile;\n\n  // Use double buffering: draw to a pixmap first, refresh it only\n  // if really necessary, and display it when paintEvent is called.\n  QPixmap m_pixmap;\n\n  // Default color when polys are created from scratch\n  std::string m_polyColor;\n\n  std::map<int, std::string> m_perImagePolyColor;\n  int m_lineWidth;\n\n  // Mouse position\n  vw::Vector2 m_curr_pixel_pos, m_curr_world_pos;\n\n  // Mouse press  position\n  int m_mousePrsX,  m_mousePrsY;\n\n  // Right-click context menu\n  std::unique_ptr<WidgetMenuMgr> m_wid_menu_mgr;\n\n  // Threshold state\n  struct ThresholdState {\n    double value = -std::numeric_limits<double>::max();\n    bool calcMode = false;\n  };\n  ThresholdState m_threshold;\n\n  bool   m_can_emit_zoom_all_signal;\n\n  // Drawing is driven by QPaintEvent, which calls out to drawImage()\n  void drawImage(QPainter* paint);\n  // Draw irregular xyz data to be plotted at (x, y) location with z giving\n  // the intensity. May be colorized.\n  void drawScatteredData(QPainter* paint, int image_index,\n                         vw::Vector2 const& bounds_override);\n\n  // Zoom debouncing\n  QTimer *m_zoomTimer; // Owned by Qt's parent-child mechanism\n  double m_accumulatedZoomTicks;\n\nprivate:\n\n  // Helper functions for event handlers\n  void handlePixelClick(int mouseRelX, int mouseRelY);\n  void handleCropWin();\n  void zoomInOut(int mouseRelX, int mouseRelY);\n  void adjustForEditMatchPoint();\n  bool handleMatchPointMove(int mouseMoveX, int mouseMoveY);\n  bool handlePolyVertexMove(int mouseMoveX, int mouseMoveY);\n  void handleRubberBandDrag(int mouseMoveX, int mouseMoveY);\n  void handleThresholdClick(int mouseRelX, int mouseRelY);\n  void handlePolyEditClick(int mouseRelX, int mouseRelY);\n\n  void renderGeoreferencedImage(double scale_out, \n                                int image_index,\n                                QPainter* paint, \n                                bool has_csv,\n                                QImage const& sourceImage,\n                                vw::BBox2i const& screen_box, \n                                vw::BBox2i const& region_out,\n                                vw::ImageView<int> & screen_image);\n                              \n  void updateCurrentMousePosition();\n  void updateRubberBand(QRect & R);\n  void maybeGenHillshade();\n  void showImage        (std::string const& image_name);\n  void bringImageOnTop  (int image_index);\n  void pushImageToBottom(int image_index);\n\n  void updateFilesToHide();\n\n  // For polygon drawing\n  int         m_polyLayerIndex; // which of the current images owns the poly vector layer\n  vw::Vector2 m_startPix; // The first poly vertex being drawn in world coords\n  std::vector<double> m_currPolyX, m_currPolyY;\n  int         m_editClipIndex, m_editPolyVecIndex, m_editIndexInCurrPoly, m_editVertIndexInCurrPoly;\n\n  // Points closer than this are in some situations considered equal\n  int m_pixelTol;\n\n  QColor m_backgroundColor;\n\n  double pixelToWorldDist(double pd);\n  void   appendToPolyVec (vw::geometry::dPoly const& P);\n  void   addPolyVert     (double px, double py);\n\n};\n\n// Build a colormap from a style string, with fallback\nvw::Colormap buildColormap(std::string const& colormap_style);\n\n} // namespace asp\n\n#endif  // __STEREO_GUI_MAIN_WIDGET_H__\n"
  },
  {
    "path": "src/asp/GUI/MainWindow.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// \\file MainWindow.cc\n// \n// The stereo_gui main window class.\n// \n#include <QtGui>\n#include <QtWidgets>\n#include <asp/GUI/MainWindow.h>\n#include <asp/GUI/AppData.h>\n#include <asp/GUI/GuiConstants.h>\n#include <asp/GUI/GuiArgs.h>\n#include <asp/GUI/MainWidget.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/GUI/ChooseFilesDlg.h>\n#include <asp/Core/GCP.h>\n#include <asp/Core/Nvm.h>\n#include <asp/Core/IpMatchingAlgs.h>\n#include <asp/Camera/BundleAdjustIsis.h>\n\n#include <vw/vw_config.h>\n#include <vw/Core/CmdUtils.h>\n#include <vw/Image/MaskViews.h>\n#include <vw/FileIO/DiskImageView.h>\n#include <vw/FileIO/DiskImageResource.h>\n#include <vw/Image/Statistics.h>\n#include <vw/Image/PixelMask.h>\n#include <vw/InterestPoint/InterestPoint.h>\n#include <vw/InterestPoint/MatcherIO.h>\n#include <vw/FileIO/FileTypes.h>\n\n#include <boost/filesystem/path.hpp>\n\n#include <vw/Image/Colormap.h>\n\n#include <qwt_color_map.h>\n#include <qwt_scale_widget.h>\n#include <qwt_scale_engine.h>\n#include <qwt_scale_draw.h>\n#include <qwt_interval.h>\n\n#include <set>\n#include <sstream>\n\nusing namespace asp;\nusing namespace vw;\n\nnamespace fs = boost::filesystem;\n\n// Need this class to manage what happens when keys are pressed while\n// the ChooseFilesDlg table is in focus. Do not let it accept key\n// strokes, which just end up editing the table entries, but rather\n// pass them to the main program event filter.\nclass chooseFilesFilterDelegate: public QStyledItemDelegate {\npublic:\n  chooseFilesFilterDelegate(QObject *filter, QObject *parent = 0):\n    QStyledItemDelegate(parent), filter(filter) {}\n\n  virtual QWidget *createEditor(QWidget *parent,\n                                const QStyleOptionViewItem &option,\n                                const QModelIndex &index) const {\n    QWidget *editor = QStyledItemDelegate::createEditor(parent, option, index);\n    editor->installEventFilter(filter);\n    return editor;\n  }\n  \nprivate:\n  QObject *filter;\n};\n\nbool MainWindow::sanityChecks(int num_images) {\n  \n  if (num_images <= 0) {\n    popUp(\"No valid images to display.\");\n    return false;\n  }\n\n  if (stereo_settings().dem_file == \"\" && stereo_settings().gcp_file != \"\" && \n      !fs::exists(stereo_settings().gcp_file)) {\n    popUp(\"The GCP file does not exist. If desired to create it, please specify --dem-file.\");\n    return false;\n  }\n  \n  if (stereo_settings().gcp_sigma <= 0) {\n    popUp(\"The GCP sigma must be positive.\");\n    return false;\n  }\n  \n  // The dem file must exist if not empty. Must also have a georef.\n  if (stereo_settings().dem_file != \"\") {\n    try {\n      DiskImageView<float> dem(stereo_settings().dem_file);\n    } catch (...) {\n      popUp(\"The DEM file does not exist or is not a valid image file.\");\n      return false;\n    }\n    vw::cartography::GeoReference georef;\n    bool has_georef = vw::cartography::read_georeference(georef, stereo_settings().dem_file);\n    if (!has_georef) {\n      popUp(\"The DEM file does not have a georeference. Please provide one.\");\n      return false;\n    }\n  }\n                    \n  // This is for the workflow of creating GCP from a DEM and images\n  bool gcp_exists = !stereo_settings().gcp_file.empty() && \n                    fs::exists(stereo_settings().gcp_file);\n  if (gcp_exists && stereo_settings().dem_file != \"\") {\n    popUp(\"A DEM file and GCP file were specified. Then, the GCP file passed in \"\n          \"must not exist, since it is supposed to be created based on the DEM.\");\n    return false;\n  }\n  \n  if (int(!stereo_settings().match_file.empty()) +\n      int(!stereo_settings().vwip_files.empty()) +\n      int(gcp_exists) > 1) {\n    // We make an exception for the non-existing GCP file, per the above\n    popUp(\"Cannot load at the same time more than one of: matches, GCP, or .vwip files.\");\n    return false;\n  }\n\n  m_saved_gcp_and_ip = true;\n  if (MainWindow::creatingGcp()) \n    m_saved_gcp_and_ip = false; // will need to save GCP and IP files\n   \n  // If a gcp file was passed in, we will interpret those as matches\n  if (stereo_settings().gcp_file != \"\")\n    asp::stereo_settings().view_matches = true;\n\n  // If .vwip files were passed in, we will interpret those as matches.\n  if (!stereo_settings().vwip_files.empty()) {\n    asp::stereo_settings().view_matches = true;\n    if (app_data.image_files.size() != stereo_settings().vwip_files.size()) {\n      popUp(\"There must be as many .vwip files as images.\");\n      return false;\n    }    \n  }\n  \n  // If a match file was explicitly specified, use it.\n  if (stereo_settings().match_file != \"\") {\n    if (app_data.image_files.size() != 2) {\n      popUp(\"The --match-file option only works with two valid input images.\");\n      return false;\n    }\n    asp::stereo_settings().view_matches = true;\n  }\n\n  int num =\n    int(asp::stereo_settings().view_matches) +\n    int(asp::stereo_settings().pairwise_matches) +\n    int(asp::stereo_settings().pairwise_clean_matches);\n  if (num > 1) {\n    popUp(\"Conflicting options for viewing match files were specified.\");\n    return false;\n  }\n\n  // Cannot show matches when viewing as georeferenced images\n  if (num > 0)\n    app_data.use_georef = false;\n\n  if (num > 0 && !stereo_settings().zoom_proj_win.empty()) {\n    popUp(\"Cannot zoom to proj win when showing matches.\");\n    return false;\n  }\n  \n  // Need at least two images to view matches, but make an exception for vwip files\n  if (num_images <= 1 && stereo_settings().vwip_files.empty() &&\n      (asp::stereo_settings().view_matches ||\n       asp::stereo_settings().pairwise_matches ||\n       asp::stereo_settings().pairwise_clean_matches)\n      && stereo_settings().gcp_file.empty()) {\n    popUp(\"Cannot view matches if there is at most one image.\");\n    return false;\n  }\n\n  if (asp::stereo_settings().plot_point_radius <= 0) {\n    popUp(\"The value --plot-point-radius must be positive.\");\n    return false;\n  }\n\n  if (asp::stereo_settings().preview && sideBySideWithDialog()) {\n    popUp(\"Cannot have both the preview mode and side-by-side images.\");\n    return false;\n  }\n  \n  if (asp::stereo_settings().no_georef && asp::stereo_settings().use_georef) {\n    popUp(\"Cannot have both the no-georef and use-georef options.\");\n    return false;\n  }\n\n  return true;\n}\n\nMainWindow::MainWindow(vw::GdalWriteOptions const& opt,\n                       std::vector<std::string> const& images,\n                       std::string& output_prefix,\n                       int grid_cols,\n                       vw::Vector2i const& window_size,\n                       bool single_window,\n                       bool use_georef,\n                       std::vector<std::map<std::string, std::string>> const& properties,\n                       int argc,  char ** argv):\n  m_opt(opt),\n  m_output_prefix(output_prefix), m_widRatio(0.3), m_chooseFiles(NULL),\n  m_grid_cols(grid_cols),\n  m_allowMultipleSelections(false),\n  m_argc(argc), m_argv(argv),\n  m_show_two_images_when_side_by_side_with_dialog(true),\n  m_cursor_count(0),\n  m_saved_gcp_and_ip(true),\n  m_match_mgr(app_data) { // Initialize m_match_mgr with app_data\n  // Window size\n  resize(window_size[0], window_size[1]);\n\n  // Window title\n  std::string window_title = \"Stereo GUI\";\n  this->setWindowTitle(window_title.c_str());\n\n  // The images and other data\n  std::vector<std::string> local_images = images; // may change later\n  std::vector<Eigen::Affine3d> world_to_cam;\n  std::map<std::string, Eigen::Vector2d> optical_offsets;\n\n  // When loading an NVM file, will assume we want to inspect pairwise\n  // matches. Also set the images from the NVM file.  It is assumed\n  // that the interest points to be loaded are not shifted relative to\n  // the optical center. Analogous logic happens for ISIS cnet files.\n  if (!asp::stereo_settings().nvm.empty() && !asp::stereo_settings().isis_cnet.empty()) {\n    popUp(\"Cannot load both an ISIS cnet and an NVM file.\");\n    exit(1);\n  }\n  if (!asp::stereo_settings().nvm.empty()) {\n    asp::stereo_settings().pairwise_matches = true;\n    vw_out() << \"Reading NVM file: \" << asp::stereo_settings().nvm << \"\\n\";\n    try {\n       asp::readNvmAsCnet(asp::stereo_settings().nvm, std::vector<std::string>(),\n                          asp::stereo_settings().nvm_no_shift,\n                          m_match_mgr.m_cnet, world_to_cam, optical_offsets);\n    } catch (const std::exception& e) {\n      popUp(e.what());\n      exit(1);\n    }\n    if (!local_images.empty())\n      popUp(\"Will ignore the images passed in and will use the nvm file only.\");\n    local_images = m_match_mgr.m_cnet.get_image_list(); // overwrite local_images\n  }\n  if (!asp::stereo_settings().isis_cnet.empty()) {\n    asp::stereo_settings().pairwise_matches = true;\n    vw::vw_out() << \"Reading ISIS control network: \" \n                 << asp::stereo_settings().isis_cnet << \"\\n\";\n    \n    try {\n      asp::IsisCnetData isisCnetData; // Part of the API, unused here\n      asp::loadIsisCnet(asp::stereo_settings().isis_cnet, local_images,\n                        m_match_mgr.m_cnet, isisCnetData); // outputs\n    } catch (const std::exception& e) {\n      popUp(e.what());\n      exit(1);\n    }\n  }\n\n  // Collect only the valid images\n  asp::filterImages(local_images);\n  \n  // Set the default lowest resolution subimage size. Use a shorthand below.\n  // Must happen before images are loaded.\n  int & lowres_size = asp::stereo_settings().lowest_resolution_subimage_num_pixels;\n  bool delay = asp::stereo_settings().preview;\n  if (lowres_size <= 0) {\n    if (delay) {\n      // To avoid creating many small subimages. But then the displaying is slow.\n      lowres_size = LOWRES_SIZE_PREVIEW;\n    } else {\n      lowres_size = LOWRES_SIZE_DEFAULT;\n    }\n  }\n  \n  // All the data is stored and shared via with object\n  app_data = asp::AppData(opt, use_georef, properties, local_images);\n  \n  // Ensure the inputs are reasonable\n  int num_images = app_data.images.size();\n  if (!MainWindow::sanityChecks(num_images))\n    forceQuit();\n\n  // For being able to choose which files to show/hide\n  m_chooseFiles = new ChooseFilesDlg(this);\n  m_chooseFiles->chooseFiles(app_data.image_files);\n  // See note at chooseFilesFilterDelegate\n  m_chooseFiles->getFilesTable()->setItemDelegate(new chooseFilesFilterDelegate(this));\n  m_chooseFiles->getFilesTable()->installEventFilter(this);\n  \n  QObject::connect(m_chooseFiles->getFilesTable(), SIGNAL(cellClicked(int, int)),\n                   this, SLOT(perhapsCreateLayout(int, int)));\n\n  QObject::connect(m_chooseFiles->getFilesTable()->horizontalHeader(),\n                   SIGNAL(sectionClicked(int)), this, SLOT(hideShowAll_windowVersion()));\n\n  m_match_mgr.init(num_images);\n\n  // By default, show the images in one row\n  if (m_grid_cols <= 0)\n    m_grid_cols = std::numeric_limits<int>::max();\n\n  // If no custom view mode, this is the default\n  m_view_type = VIEW_SIDE_BY_SIDE;\n\n  // Preview mode normally implies a single window.\n  if (asp::stereo_settings().preview && !sideBySideWithDialog()) \n    single_window = true;\n  \n  if (m_grid_cols > 0 && m_grid_cols < int(num_images) && !sideBySideWithDialog())\n    m_view_type = VIEW_AS_TILES_ON_GRID;\n  \n  if (single_window && !sideBySideWithDialog())\n    m_view_type = VIEW_IN_SINGLE_WINDOW;\n\n  m_view_type_old = m_view_type; // initialize this\n  \n  // Set up the basic layout of the window and its menus\n  m_win_menu_mgr.init(this);\n\n  // Must happen after menus are created\n  createLayout();\n}\n\n// Wrap a widget in a horizontal layout with a colorbar on the right.\n// Returns the wrapper widget, or the original widget if bounds are invalid.\n// The colormap style is taken from the first image in the range.\nQWidget* createColorbarLayout(QWidget* widget,\n                              double min_val, double max_val,\n                              std::string const& colormap_style) {\n\n  if (min_val >= max_val)\n    return widget;\n\n  // Parse the colormap\n  std::map<float, vw::Vector3u> lut_map;\n  vw::parseColorStyle(colormap_style, lut_map);\n\n  // Build a QwtLinearColorMap from the LUT\n  auto firstC = lut_map.begin()->second;\n  auto lastC = lut_map.rbegin()->second;\n  QwtLinearColorMap *cmap =\n    new QwtLinearColorMap(QColor(firstC[0], firstC[1], firstC[2]),\n                          QColor(lastC[0], lastC[1], lastC[2]));\n  for (auto it = lut_map.begin(); it != lut_map.end(); it++) {\n    if (it->first == 0.0 || it->first == 1.0)\n      continue;\n    auto const& c = it->second;\n    cmap->addColorStop(it->first, QColor(c[0], c[1], c[2]));\n  }\n\n  // Create the colorbar widget\n  QwtScaleWidget *colorbar =\n    new QwtScaleWidget(QwtScaleDraw::RightScale);\n  QwtInterval interval(min_val, max_val);\n  colorbar->setColorBarEnabled(true);\n  colorbar->setColorBarWidth(30);\n  colorbar->setColorMap(interval, cmap);\n  QwtLinearScaleEngine engine;\n  colorbar->setScaleDiv(\n    engine.divideScale(min_val, max_val, 8, 5));\n\n  // Wrap in a horizontal layout\n  QWidget *wrapper = new QWidget();\n  QHBoxLayout *hbox = new QHBoxLayout(wrapper);\n  hbox->setContentsMargins(0, 0, 0, 0);\n  hbox->setSpacing(0);\n  hbox->addWidget(widget, 1);\n  hbox->addWidget(colorbar, 0);\n\n  return wrapper;\n}\n\n// Create a new central widget. Qt is smart enough to de-allocate\n// the previous widget and all of its children.\nvoid MainWindow::createLayout() {\n\n  MainWindow::updateViewMenuEntries();\n\n  // We must cleanup the previous profiles before wiping the existing\n  // widgets. There must be a better way of doing it.\n  for (size_t wit = 0; wit < m_widgets.size(); wit++) {\n    bool profile_mode = false;\n    if (m_widgets[wit]) \n      m_widgets[wit]->setProfileMode(profile_mode);\n  }\n\n  QWidget * centralWidget = new QWidget(this);\n  setCentralWidget(centralWidget);\n\n  QSplitter * splitter = new QSplitter(centralWidget);\n\n  // Wipe the widgets from the array. Qt will automatically delete\n  // the widgets when the time is right.\n  m_widgets.clear();\n\n  // Note that the menus persist even when the layout changes\n\n  // Show all images if switching to side-by-side view without a dialog\n  if ((asp::stereo_settings().zoom_all_to_same_region ||\n       m_view_type == VIEW_SIDE_BY_SIDE ||\n       m_view_type == VIEW_AS_TILES_ON_GRID) && !sideBySideWithDialog())\n    m_chooseFiles->showAllImages();\n  \n  // Set up the dialog for choosing files\n  m_chooseFiles->setMaximumSize(int(m_widRatio*size().width()), size().height());\n\n  if (asp::stereo_settings().preview && !sideBySideWithDialog()) {\n    // Show only the first image, unless it was decided somewhere else\n    // another one image is to be shown.\n    if (m_chooseFiles && m_chooseFiles->numShown() != 1) \n      m_chooseFiles->setNumImagesToShow(1);\n  }\n  \n  // When showing matches or other ways of showing images side-by-side,\n  // automatically change the layout\n  if (sideBySideWithDialog() || asp::stereo_settings().view_matches) {\n    m_view_type = VIEW_SIDE_BY_SIDE;\n    if (sideBySideWithDialog() && m_show_two_images_when_side_by_side_with_dialog) {\n      // This must be triggered only when the tool starts or when switched\n      // into sideBySideWithDialog() mode from the menu. Later the use\n      // can change the number of images shown.\n      m_chooseFiles->setNumImagesToShow(2);\n      m_show_two_images_when_side_by_side_with_dialog = false;\n    }\n  }\n\n  splitter->addWidget(m_chooseFiles);\n\n  bool do_colorize = false;\n  for (size_t i = 0; i < app_data.images.size(); i++)\n    do_colorize = do_colorize || app_data.images[i].colorize ||\n                  app_data.images[i].colorbar;\n  bool delay = !asp::stereo_settings().nvm.empty()       ||\n               !asp::stereo_settings().isis_cnet.empty() ||\n                asp::stereo_settings().preview;\n  if (delay && do_colorize) {\n    popUp(\"Cannot colorize images when using the preview mode or when \"\n          \"loading an NVM or ISIS cnet file.\");\n    // This is hard to get right\n    do_colorize = false;\n  }\n  // See if to show it. In a side-by-side view it is normally not needed\n  size_t num_images = app_data.images.size();\n  bool showChooseFiles = ((m_view_type == VIEW_IN_SINGLE_WINDOW || sideBySideWithDialog()) &&\n                          num_images > 1);\n  m_chooseFiles->setVisible(showChooseFiles);\n\n  if (m_view_type == VIEW_IN_SINGLE_WINDOW) {\n    // Pass all images to a single MainWidget object.\n    int beg_image_id = 0, end_image_id = app_data.images.size();\n    MainWidget * widget = new MainWidget(centralWidget,\n                                m_opt,\n                                beg_image_id, end_image_id, BASE_IMAGE_ID, app_data, \n                                m_output_prefix,\n                                m_match_mgr,\n                                m_chooseFiles,\n                                m_allowMultipleSelections);\n    // Tell the widget if the poly edit mode and hillshade mode is on or not\n    bool refresh = false; // Do not refresh prematurely\n    widget->setPolyEditMode(m_win_menu_mgr.m_polyEditMode_action->isChecked(), refresh);\n    m_widgets.push_back(widget);\n  } else {\n    // Each MainWidget object gets passed a single image\n    for (size_t i = 0; i < app_data.images.size(); i++) {\n\n      // Do not create hidden widgets, that really slows down the display when there\n      // are many of them, but just a handful are needed.\n      bool isHidden = (sideBySideWithDialog() && m_chooseFiles &&\n                       m_chooseFiles->isHidden(app_data.images[i].name));\n      if (isHidden) \n        continue;\n\n      int beg_image_id = i, end_image_id = i + 1;\n\n      MainWidget * widget\n        = new MainWidget(centralWidget,\n                         m_opt,\n                         beg_image_id, end_image_id,\n                         BASE_IMAGE_ID, app_data,\n                         m_output_prefix,\n                         m_match_mgr,\n                         m_chooseFiles,\n                         m_allowMultipleSelections);\n      m_widgets.push_back(widget);\n    }\n  }\n\n  // Once all widgets zoom to same proj win, turn this off\n  asp::stereo_settings().zoom_proj_win = BBox2();\n\n  // Put the images in a grid\n  int num_widgets = m_widgets.size();\n  QGridLayout *grid = new QGridLayout(centralWidget);\n\n  // By default, show the images side-by-side\n  int grid_cols = std::numeric_limits<int>::max();\n  if (m_view_type == VIEW_AS_TILES_ON_GRID) \n    grid_cols = m_grid_cols;\n  \n  for (int i = 0; i < num_widgets; i++) {\n\n    if (m_widgets[i] == NULL)\n      continue;\n      \n    // Add the current widget\n    int row = i / grid_cols;\n    int col = i % grid_cols;\n\n    // When --colorbar is set, wrap MainWidget + colorbar in a container\n    QWidget* wid = m_widgets[i];\n    int begIdx = m_widgets[i] ? m_widgets[i]->m_beg_image_id : 0;\n    int endIdx = m_widgets[i] ? m_widgets[i]->m_end_image_id : 0;\n    if (m_widgets[i] && app_data.images[begIdx].colorbar) {\n      vw::Vector2 bounds = calcJointBounds(app_data.images,\n                                           begIdx, endIdx);\n      wid = createColorbarLayout(m_widgets[i],\n                                 bounds[0], bounds[1],\n                                 app_data.images[begIdx].colormap);\n    }\n    grid->addWidget(wid, row, col);\n\n    if (!m_widgets[i])\n      continue; // Only MainWidget type can be used below\n\n    // Intercept this widget's request to view (or refresh) the matches in all\n    // the widgets, not just this one's.\n    connect(m_widgets[i], SIGNAL(toggleViewMatchesSignal()),\n            this, SLOT(toggleViewMatches()));\n    connect(m_widgets[i], SIGNAL(updateMatchesSignal()),\n            this, SLOT(viewMatches()));\n    connect(m_widgets[i], SIGNAL(uncheckProfileModeCheckbox()),\n            this, SLOT(uncheckProfileModeCheckbox()));\n    connect(m_widgets[i], SIGNAL(uncheckPolyEditModeCheckbox()),\n            this, SLOT(uncheckPolyEditModeCheckbox()));\n    connect(m_widgets[i], SIGNAL(zoomAllToSameRegionSignal(int)),\n            this, SLOT(zoomAllToSameRegionAction(int)));\n    connect(m_widgets[i], SIGNAL(recreateLayoutSignal()),\n            this, SLOT(createLayout()));\n  }\n\n  QWidget *container = new QWidget(centralWidget);\n  container->setLayout(grid);\n  splitter->addWidget(container);\n\n  // Set new layout\n  QGridLayout *layout = new QGridLayout(centralWidget);\n  layout->addWidget(splitter, 0, 0);\n  centralWidget->setLayout(layout);\n\n  if (asp::stereo_settings().view_matches)\n    MainWindow::viewMatches();\n\n  if (asp::stereo_settings().pairwise_matches || asp::stereo_settings().pairwise_clean_matches) \n    MainWindow::viewPairwiseMatchesOrCleanMatches();\n\n  double nodata_value = stereo_settings().nodata_value;\n  if (!std::isnan(nodata_value)) {\n    for (size_t i = 0; i < m_widgets.size(); i++) {\n      if (!m_widgets[i])\n        continue;\n      m_widgets[i]->setThreshold(nodata_value);\n      bool refresh_pixmap = false; // Prepare everything but don't redraw yet\n      m_widgets[i]->viewThreshImages(refresh_pixmap);\n    }\n  }\n\n  // Refresh the menu checkboxes\n  auto& wm = m_win_menu_mgr;\n  wm.m_viewSingleWindow_action\n    ->setChecked(m_view_type == VIEW_IN_SINGLE_WINDOW);\n  wm.m_viewAllSideBySide_action\n    ->setChecked(m_view_type == VIEW_SIDE_BY_SIDE &&\n                 !asp::stereo_settings().view_several_side_by_side);\n  wm.m_viewSeveralSideBySide_action\n    ->setChecked(asp::stereo_settings().view_several_side_by_side);\n  wm.m_viewAsTiles_action\n    ->setChecked(m_view_type == VIEW_AS_TILES_ON_GRID);\n  MainWindow::updateDisplayModeMenuEntries();\n  wm.m_viewGeoreferencedImages_action\n    ->setChecked(app_data.use_georef);\n  wm.m_overlayGeoreferencedImages_action\n    ->setChecked(app_data.use_georef &&\n                 (m_view_type == VIEW_IN_SINGLE_WINDOW));\n  wm.m_zoomAllToSameRegion_action\n    ->setChecked(asp::stereo_settings().zoom_all_to_same_region);\n\n  if (m_widgets.size() == 2                   &&\n      num_images == 2                         &&\n      asp::stereo_settings().left_image_crop_win  != BBox2() &&\n      asp::stereo_settings().right_image_crop_win != BBox2()) {\n    // Draw crop windows passed as arguments\n    if (m_widgets[0])\n      m_widgets[0]->setCropWin(stereo_settings().left_image_crop_win);\n    if (m_widgets[1])\n      m_widgets[1]->setCropWin(stereo_settings().right_image_crop_win);\n    // Do this just once, on startup\n    asp::stereo_settings().left_image_crop_win  = BBox2();\n    asp::stereo_settings().right_image_crop_win = BBox2();\n  }\n  \n  if (asp::stereo_settings().zoom_all_to_same_region) {\n    // See where the earlier viewable region ended up in the current world\n    // coordinate system. A lot of things could have changed since then.\n    BBox2 world_box;\n    for (size_t i = 0; i < m_widgets.size(); i++) {\n      if (m_widgets[i]) {\n        vw::BBox2 region = m_widgets[i]->worldBox();\n        world_box.grow(region);\n      }\n    }\n    // Let this be the world box in all images. Later, during resizeEvent(), the\n    // sizeToFit() function will be called which will use this box.\n    for (size_t i = 0; i < m_widgets.size(); i++) {\n      if (m_widgets[i])\n        m_widgets[i]->setWorldBox(world_box);\n    }\n  }\n  \n  return;\n}\n\n// In previewOrSideBySideWithDialog mode, checking/unchecking images has to result\n// in redisplay of selected ones.\nvoid MainWindow::perhapsCreateLayout(int row, int col) {\n\n  if (m_chooseFiles && asp::stereo_settings().preview) {\n    // If clicked on a cell, must show this image, and hide the rest\n    int rows = m_chooseFiles->getFilesTable()->rowCount();\n    for (int row_it = 0; row_it < rows; row_it++) {\n      if (row_it == row) \n        m_chooseFiles->unhide(row_it);\n      else\n        m_chooseFiles->hide(row_it);\n    }\n  }\n    \n  if (previewOrSideBySideWithDialog())\n    createLayout();\n}\n\n// When in sideBySideWithDialog mode, hide or show all images. Otherwise\n// this function does nothing, and hideShowAll_widgetVersion() gets called.\nvoid MainWindow::hideShowAll_windowVersion() {\n  if (!sideBySideWithDialog()) {\n    // The function hideShowAll_widgetVersion will be called, which\n    // does not need to recreate the layout.\n    return;\n  }\n  \n  if (m_chooseFiles) \n    m_chooseFiles->hideShowAll();\n  \n  // This ensures we don't override how many images are shown\n  m_show_two_images_when_side_by_side_with_dialog = false;\n  createLayout();\n}\n\nvoid MainWindow::resizeEvent(QResizeEvent *) {\n  if (m_chooseFiles)\n    m_chooseFiles->setMaximumSize(int(m_widRatio*size().width()), size().height());\n}\n\nvoid MainWindow::closeEvent(QCloseEvent *) {\n  forceQuit();\n}\n\nbool MainWindow::editingMatches() const {\n  // See if in the middle of editing of matches\n  bool editing_matches = false;\n  for (size_t i = 0; i < m_widgets.size(); i++) {\n    if (m_widgets[i] != NULL && m_widgets[i]->getEditingMatches()) \n      editing_matches = true;\n  }\n  return editing_matches;\n}\n\n// We can create GCP when --gcp-file and --dem-file got specified,\n// and the GCP file does not exist yet.\nbool MainWindow::creatingGcp() const {\n return (stereo_settings().dem_file != \"\" && \n         stereo_settings().gcp_file != \"\" && \n         !fs::exists(asp::stereo_settings().gcp_file));\n}\n\nvoid MainWindow::forceQuit() {\n\n  // See if in the middle of creating GCP\n  bool force_quit = false;\n  if (!m_saved_gcp_and_ip) {\n    QMessageBox::StandardButton reply;\n    reply = QMessageBox::question(this, \"Quit\",\n                                  \"GCP and IP matches were not saved. Quit?\",\n                                  QMessageBox::Yes|QMessageBox::No);\n    if (reply != QMessageBox::Yes) \n      return;\n\n    // If we want to quit without saving GCP, will not pop up the dialog again\n    force_quit = true;\n  }\n  \n  // See if in the middle of editing of matches with unsaved matches\n  if (!force_quit && MainWindow::editingMatches()) {\n    QMessageBox::StandardButton reply;\n    reply = QMessageBox::question(this, \"Quit\",\n                                  \"Interest point matches were not saved. Quit?\",\n                                  QMessageBox::Yes|QMessageBox::No);\n    if (reply != QMessageBox::Yes)\n      return;\n  }\n  \n  if (asp::stereo_settings().delete_temporary_files_on_exit) {\n    std::set<std::string> & tmp_files = asp::temporary_files().files;\n    for (auto it = tmp_files.begin(); it != tmp_files.end() ; it++) {\n      std::string file = *it;\n      if (fs::exists(file)) {\n        vw_out() << \"Deleting: \" << file << std::endl;\n        fs::remove(file);\n      }\n    }\n  }\n\n  exit(0); // A fix for an older buggy version of Qt\n}\n\n// Zoom in/out of each image so that it fits fully within its allocated display area.\n// If we zoom all images to same region, zoom all to the union of display areas.\nvoid MainWindow::sizeToFit() {\n\n  if (asp::stereo_settings().zoom_all_to_same_region) {\n\n    BBox2 big_region; \n    for (size_t i = 0; i < m_widgets.size(); i++) {\n      if (!m_widgets[i])\n        continue;\n\n      vw::BBox2 region = m_widgets[i]->worldBox();\n      big_region.grow(region);\n    }\n\n    for (size_t i = 0; i < m_widgets.size(); i++) {\n      if (!m_widgets[i])\n        continue;\n      m_widgets[i]->zoomToRegion(big_region);\n    }\n\n  }else{\n    // Full view for each individual image\n    for (size_t i = 0; i < m_widgets.size(); i++) {\n      if (m_widgets[i])\n        m_widgets[i]->sizeToFit();\n    }\n  }\n\n}\n\nvoid MainWindow::zoomIn() {\n  for (size_t i = 0; i < m_widgets.size(); i++)\n    if (m_widgets[i])\n      m_widgets[i]->zoom(1.0/0.75);\n}\n\nvoid MainWindow::zoomOut() {\n  for (size_t i = 0; i < m_widgets.size(); i++)\n    if (m_widgets[i])\n      m_widgets[i]->zoom(0.75);\n}\n\nvoid MainWindow::viewSingleWindow() {\n\n  bool single_window = m_win_menu_mgr.m_viewSingleWindow_action->isChecked();\n\n  if (single_window) {\n\n    if (m_view_type != VIEW_IN_SINGLE_WINDOW)\n      m_view_type_old = m_view_type; // back this up\n    \n    m_view_type = VIEW_IN_SINGLE_WINDOW;\n\n    // Since we will view all in single window, can't select images with matches\n    asp::stereo_settings().view_matches = false;\n    setNoSideBySideWithDialog();\n    MainWindow::updateViewMenuEntries();\n\n    // Turn off zooming all images to same region if all are in the same window\n    if (asp::stereo_settings().zoom_all_to_same_region) {\n      asp::stereo_settings().zoom_all_to_same_region = false;\n      setZoomAllToSameRegionAux(asp::stereo_settings().zoom_all_to_same_region);\n    }\n\n  }else{\n    if (m_view_type_old != VIEW_IN_SINGLE_WINDOW)\n      m_view_type = m_view_type_old; // restore this\n    else{\n      // nothing to restore to. Default to side by side.\n      m_view_type = VIEW_SIDE_BY_SIDE;\n    }\n  }\n\n  createLayout();\n}\n\nvoid MainWindow::viewAllSideBySide() {\n  m_view_type = VIEW_SIDE_BY_SIDE;\n  asp::stereo_settings().preview = false;\n  setNoSideBySideWithDialog();\n  createLayout();\n}\n\nvoid MainWindow::viewSeveralSideBySide() {\n  m_view_type = VIEW_SIDE_BY_SIDE;\n  asp::stereo_settings().preview = false;\n  asp::stereo_settings().view_several_side_by_side = true;\n  m_show_two_images_when_side_by_side_with_dialog = true; // start with 2 \n  createLayout();\n}\n\nvoid MainWindow::viewAsTiles() {\n\n  if (!m_win_menu_mgr.m_viewAsTiles_action->isChecked()) {\n    if (m_view_type_old != VIEW_AS_TILES_ON_GRID)\n      m_view_type = m_view_type_old; // restore this\n    else\n      m_view_type = VIEW_SIDE_BY_SIDE;\n\n    asp::stereo_settings().preview = false;\n    setNoSideBySideWithDialog();\n    \n    createLayout();\n    return;\n  }\n  \n  std::string gridColsStr;\n  bool ans = getStringFromGui(this,\n                              \"Number of columns in the grid\",\n                              \"Number of columns in the grid\",\n                              \"\",\n                              gridColsStr);\n  if (!ans)\n    return;\n\n  m_grid_cols     = std::max(atoi(gridColsStr.c_str()), 1);\n  m_view_type_old = m_view_type; // back this up\n  m_view_type     = VIEW_AS_TILES_ON_GRID;\n\n  // When viewing as tile we cannot show matches\n  asp::stereo_settings().view_matches = false;\n  asp::stereo_settings().preview = false;\n  setNoSideBySideWithDialog();\n  MainWindow::updateViewMenuEntries();\n  \n  createLayout();\n}\n\nvoid MainWindow::zoomToProjWin() {\n  std::string projWinStr;\n  bool ans = getStringFromGui(this,\n                              \"Enter proj win (4 values)\",\n                              \"Enter proj win (4 values)\",\n                              \"\",\n                              projWinStr);\n  if (!ans)\n    return;\n\n  std::istringstream is(projWinStr);\n  double a, b, c, d;\n  if (!(is >> a >> b >> c >> d)) {\n    popUp(\"Four float values expected.\");\n    return;\n  }\n\n  if (!m_widgets[BASE_IMAGE_ID]) {\n    popUp(\"Unexpected missing widget.\");\n    return;\n  }\n\n  if (!app_data.use_georef) {\n    popUp(\"Turn on viewing georeferenced images to zoom to given proj win.\");\n    return;\n  }\n  \n  // This takes care of the fact that the order of corners can be reversed\n  BBox2 proj_win;\n  proj_win.grow(Vector2(a, b));\n  proj_win.grow(Vector2(c, d));\n\n  BBox2 image_box;\n  if (app_data.images[BASE_IMAGE_ID].isPolyOrCsv())\n    image_box = proj_win;\n  else\n    image_box = app_data.images[BASE_IMAGE_ID].georef.point_to_pixel_bbox(proj_win);\n\n  BBox2 world_box = app_data.image2world_trans(image_box, BASE_IMAGE_ID);\n  for (size_t i = 0; i < m_widgets.size(); i++) {\n    if (!m_widgets[i])\n      continue;\n    m_widgets[i]->zoomToRegion(world_box);\n  }\n  \n}\n\n// Update the checkboxes for the matches menu entries based on stereo_settings()\n// values.\nvoid MainWindow::updateViewMenuEntries() {\n  auto& wm = m_win_menu_mgr;\n  wm.m_viewMatches_action\n    ->setChecked(asp::stereo_settings().view_matches);\n  wm.m_viewPairwiseCleanMatches_action\n    ->setChecked(asp::stereo_settings().pairwise_clean_matches);\n  wm.m_viewPairwiseMatches_action\n    ->setChecked(asp::stereo_settings().pairwise_matches);\n  wm.m_viewSeveralSideBySide_action\n    ->setChecked(asp::stereo_settings().view_several_side_by_side);\n}\n\n// Update checkboxes for viewing thresholded and hillshaded images\nvoid MainWindow::updateDisplayModeMenuEntries() {\n  auto& wm = m_win_menu_mgr;\n  wm.m_viewThreshImages_action\n    ->setChecked(app_data.display_mode == THRESHOLDED_VIEW);\n  wm.m_viewHillshadedImages_action\n    ->setChecked(app_data.display_mode == HILLSHADED_VIEW);\n}\n\nvoid MainWindow::viewMatchesFromMenu() {\n  // Record user's intent\n  asp::stereo_settings().view_matches = m_win_menu_mgr.m_viewMatches_action->isChecked();\n  \n  toggleViewMatches();\n}\n\n// The value of asp::stereo_settings().view_matches must be set before\n// calling this. It will be invoked as result of user clicking on the\n// menu or adding/deleting match points.\nvoid MainWindow::toggleViewMatches() {\n  asp::stereo_settings().pairwise_matches = false;\n  asp::stereo_settings().pairwise_clean_matches = false;\n  asp::stereo_settings().preview = false;\n  MainWindow::updateViewMenuEntries();\n  m_show_two_images_when_side_by_side_with_dialog = false;\n  m_chooseFiles->showAllImages();\n  MainWindow::createLayout(); // This will call viewMatches() after a GUI reorg\n}\n\n// Show or hide matches depending on the value of m_viewMatches. We\n// assume first ip in first image manages first ip in all other\n// images. We allow ip without matches in other images, that can be\n// useful, but not before saving, when their numbers must agree for\n// all images.\nvoid MainWindow::viewMatches() {\n  \n  // Record user's intent\n  asp::stereo_settings().view_matches = m_win_menu_mgr.m_viewMatches_action->isChecked();\n  asp::stereo_settings().preview = false;\n  \n  // Turn off the other ways of viewing matches\n  if (asp::stereo_settings().view_matches) {\n    asp::stereo_settings().pairwise_matches = false;\n    asp::stereo_settings().pairwise_clean_matches = false;\n    asp::stereo_settings().preview = false;\n    MainWindow::updateViewMenuEntries();\n  }\n  \n  // If started editing matches do not load them from disk\n  if (MainWindow::editingMatches())\n    m_match_mgr.m_matches_exist = true;\n\n  // TODO(oalexan1): Improve match loading when done this way, it is\n  // rather ad hoc.  Maybe just switch to pairwise matches each time\n  // there's more than two images.\n  \n  // We will load the matches just once, as we later will add/delete\n  // matches manually.\n  if (!m_match_mgr.m_matches_exist && asp::stereo_settings().view_matches) {\n\n    // We will try to load matches\n    m_match_mgr.m_matches_exist = true;\n    \n    size_t num_images = app_data.image_files.size();\n    bool gcp_exists = !stereo_settings().gcp_file.empty() && \n                      fs::exists(stereo_settings().gcp_file);\n\n    if (gcp_exists) {\n      \n      // Load GCP. If the GCP file was specified but does not exist, we will\n      // try to load the matches instead, which later will be used to make the\n      // gcp.\n      try {\n        m_match_mgr.m_matchlist.loadPointsFromGCPs(stereo_settings().gcp_file, app_data.image_files);\n      } catch (std::exception const& e) {\n        popUp(e.what());\n        return;\n      }\n\n    } else if (!stereo_settings().vwip_files.empty()) {\n      // Try to read matches from vwip files\n      m_match_mgr.m_matchlist.loadPointsFromVwip(stereo_settings().vwip_files, app_data.image_files);\n    } else {\n        \n      // If no match file was specified by now, ask the user for the output prefix.\n      if (stereo_settings().match_file == \"\") {\n        if (!supplyOutputPrefixIfNeeded(this, m_output_prefix))\n          return;\n      }\n      \n      // Load matches\n      std::vector<std::string> matchFiles;\n      std::vector<size_t> leftIndices;\n      bool matchfiles_found = false;\n      asp::populateMatchFiles(app_data.image_files, m_output_prefix,\n                              stereo_settings().match_file,\n                              stereo_settings().matches_as_txt,\n                              matchFiles, leftIndices, matchfiles_found);      \n      if (matchfiles_found)\n        m_match_mgr.m_matchlist.loadPointsFromMatchFiles(matchFiles, leftIndices,\n                                                         stereo_settings().matches_as_txt);\n    }\n\n  } // End case where we tried to load the matches\n\n  // Set all the matches to be visible.\n  for (size_t i = 0; i < m_widgets.size(); i++) {\n    if (m_widgets[i])\n      m_widgets[i]->viewMatches();\n  }\n  \n  return;\n}\n\nvoid MainWindow::viewPairwiseMatchesSlot() {\n  // Record user's intent\n  asp::stereo_settings().pairwise_matches\n    = m_win_menu_mgr.m_viewPairwiseMatches_action->isChecked();\n\n  if (asp::stereo_settings().pairwise_matches)\n    m_show_two_images_when_side_by_side_with_dialog = true;\n  \n  // Turn off the other ways of viewing matches\n  asp::stereo_settings().view_matches = false;\n  asp::stereo_settings().pairwise_clean_matches = false;\n  MainWindow::updateViewMenuEntries();\n\n  // Must always recreate the layout as this option can totally change the interface\n  createLayout();\n}\n\nvoid MainWindow::viewPairwiseCleanMatchesSlot() {\n  // Record user's intent\n  asp::stereo_settings().pairwise_clean_matches\n    = m_win_menu_mgr.m_viewPairwiseCleanMatches_action->isChecked();\n\n  if (asp::stereo_settings().pairwise_clean_matches)\n    m_show_two_images_when_side_by_side_with_dialog = true;\n  \n  // Turn off the other ways of viewing matches\n  asp::stereo_settings().view_matches = false;\n  asp::stereo_settings().pairwise_matches = false;\n  MainWindow::updateViewMenuEntries();\n\n  // Must always recreate the layout as this option can totally change the interface\n  createLayout();\n}\n\n// These two modes will be handled together as they are very\n// similar.\nvoid MainWindow::viewPairwiseMatchesOrCleanMatches() {\n\n  MainWindow::updateViewMenuEntries();\n\n  if (!asp::stereo_settings().pairwise_matches &&\n      !asp::stereo_settings().pairwise_clean_matches) {\n    return;\n  }\n\n  if (app_data.use_georef) {\n    popUp(\"To view matches, turn off viewing the images as georeferenced.\");\n    asp::stereo_settings().pairwise_matches = false;\n    asp::stereo_settings().pairwise_clean_matches = false;\n    MainWindow::updateViewMenuEntries();\n    createLayout();\n    return;\n  }\n  \n  if (asp::stereo_settings().pairwise_matches && \n      asp::stereo_settings().pairwise_clean_matches) {\n    popUp(\"Cannot show both pairwise matches and pairwise clean matches at the same time.\");\n    asp::stereo_settings().pairwise_matches = false;\n    asp::stereo_settings().pairwise_clean_matches = false;\n    MainWindow::updateViewMenuEntries();\n    createLayout();\n    return;\n  }\n\n  if (m_output_prefix == \"\" && \n      stereo_settings().nvm.empty() && \n      stereo_settings().isis_cnet.empty()) {\n    popUp(\"Cannot show pairwise (clean) matches, as the output prefix was not set.\");\n    asp::stereo_settings().pairwise_matches = false;\n    asp::stereo_settings().pairwise_clean_matches = false;\n    MainWindow::updateViewMenuEntries();\n    createLayout();\n    return;\n  }\n\n  // See which images are seen\n  std::vector<int> seen_indices;\n  for (size_t it = 0; it < app_data.images.size(); it++) {\n    if (!m_chooseFiles->isHidden(app_data.images[it].name)) {\n      seen_indices.push_back(it);\n    }\n  }\n  // Only show matches if precisely two images are currently displayed\n  if (seen_indices.size() != 2) {\n    // Ensure no stray matches from before are shown\n    m_match_mgr.m_pairwiseMatches.ip_to_show.clear();\n    m_match_mgr.m_pairwiseCleanMatches.ip_to_show.clear();\n    return;\n  }\n  \n  int left_index = seen_indices[0], right_index = seen_indices[1];\n  m_match_mgr.loadPairwiseMatches(left_index, right_index, m_output_prefix);\n  \n  // Call viewMatches() in each widget. That widgets already knows about m_match_mgr.\n  // The controls for what kind of matches to show are in asp::stereo_settings().\n  for (size_t i = 0; i < m_widgets.size(); i++) {\n    if (m_widgets[i])\n      m_widgets[i]->viewMatches();\n  }\n  \n}\n\nvoid MainWindow::saveMatches() {\n\n  if (stereo_settings().match_file == \"\") {\n    if (!supplyOutputPrefixIfNeeded(this, m_output_prefix))\n      return;\n  }\n\n  try {\n    m_match_mgr.m_matchlist.savePointsToDisk(m_output_prefix, app_data.image_files,\n                                             stereo_settings().match_file,\n                                             stereo_settings().matches_as_txt);\n  } catch (std::exception const& e) {\n    popUp(e.what());\n    return;\n  }\n    \n  m_match_mgr.m_matches_exist = true;\n\n  // If creating GCP, and matches are not saved yet, that means GCP were not saved \n  // either\n  if (MainWindow::creatingGcp() && MainWindow::editingMatches())\n    m_saved_gcp_and_ip = false;\n\n  // matches got saved, no more editing for now\n  for (size_t i = 0; i < m_widgets.size(); i++) {\n    if (m_widgets[i] != NULL) \n      m_widgets[i]->setEditingMatches(false);\n  }\n}\n\nvoid MainWindow::writeGroundControlPoints() {\n\n  if (!m_match_mgr.m_matchlist.allPointsValid()) {\n    popUp(\"Cannot save GCP, at least one point is missing or not valid.\");\n    return;\n  }\n  \n  m_match_mgr.m_matches_exist = true;\n\n  const size_t num_images = app_data.image_files.size();\n  const size_t num_ips    = m_match_mgr.m_matchlist.getNumPoints();\n  // Don't record pixels from the last image, which is used for reference\n  const size_t num_images_to_save = num_images - 1; \n\n  vw_out() << \"Saving GCP with \" << num_images << \" images and \" << num_ips << \" ips.\\n\";\n\n  if (num_images != m_match_mgr.m_matchlist.getNumImages())\n    return popUp(\"Cannot save matches. Image and match vectors are unequal!\");\n  if (num_ips < 1)\n    return popUp(\"Cannot save matches. No matches have been created.\");\n\n  // Prompt the user for a DEM path unless specified via --dem-file.\n  if (stereo_settings().dem_file == \"\") {\n    try {\n      stereo_settings().dem_file = \n        QFileDialog::getOpenFileName(0,\n                                     \"Select DEM to use for point elevations\",\n                                     m_output_prefix.c_str()).toStdString();\n    } catch(...) {\n      return popUp(\"Error selecting the DEM path.\");\n    }\n  }\n\n  if (stereo_settings().dem_file == \"\") \n    return; // Likely the user did not choose a file, so cancel the save.\n  \n  // Have a DEM file, need to save GCP, and did not save it yet\n  m_saved_gcp_and_ip = false;\n  \n  // Prompt the user for the desired output path unless specified in --gcp-file.\n  if (stereo_settings().gcp_file == \"\") {\n    try {\n      std::string default_path = m_output_prefix + \"/ground_control_points.gcp\";\n      if (m_output_prefix.empty()) // Default to current dir if prefix not set\n\t      default_path = \"ground_control_points.gcp\";\n      stereo_settings().gcp_file = QFileDialog::getSaveFileName(0,\n\t\t\t\t\t       \"Select a path to save the GCP file to\",\n\t\t\t\t\t       default_path.c_str()).toStdString();\n    }catch(...) {\n      return popUp(\"Error selecting the output path.\");\n    }\n  }\n\n  // Must save the matches. This is helpful in case\n  // want to resume creating GCP.\n  MainWindow::saveMatches();\n\n  try {\n    asp::genWriteGcp(app_data.image_files, stereo_settings().gcp_file, \n                     stereo_settings().dem_file, m_match_mgr.m_matchlist, \n                     asp::stereo_settings().gcp_sigma);\n    m_saved_gcp_and_ip = true;\n  } catch (std::exception const& e) {\n    popUp(e.what());\n    return;\n  }\n  \n}\n\nvoid MainWindow::addDelMatches() {\n  popUp(\"Right-click on images to add/delete interest point matches.\");\n  return;\n}\n\nvoid MainWindow::run_stereo_or_parallel_stereo(std::string const& cmd) {\n\n  if (m_widgets.size() < 2) {\n    // Note: We allow three images, as the third may be the DEM\n    QMessageBox::about(this, tr(\"Error\"),\n                       tr(\"Need to have two images side-by-side to run stereo.\"));\n    return;\n  }\n\n  // Output prefix must be non-empty\n  if (m_output_prefix.empty()) {\n    QMessageBox::about(this, tr(\"Error\"),\n                       tr(\"The output prefix must be passed in, together with the images, \"\n                          \"cameras, and stereo options, to be able to run stereo.\"));\n    return;\n  }\n  \n  // There is no need for a pop-up on failure here, as there will be one\n  // in get_crop_win() if the crop windows are not set.\n  QRect left_win, right_win;\n  if ((!m_widgets[0] || !m_widgets[0]->get_crop_win(left_win)) ||\n      (!m_widgets[1] || !m_widgets[1]->get_crop_win(right_win))) \n    return;\n\n  int left_x  = left_win.x();\n  int left_y  = left_win.y();\n  int left_wx = left_win.width();\n  int left_wy = left_win.height();\n\n  int right_x = right_win.x();\n  int right_y = right_win.y();\n  int right_wx = right_win.width();\n  int right_wy = right_win.height();\n\n  std::string run_cmd = vw::program_path(cmd, m_argv[0]);\n\n  // Wipe pre-existing left-image-crop-win and right-image-crop-win\n  asp::rmOptionVals(m_argc, m_argv, \"--left-image-crop-win\", 4);\n  asp::rmOptionVals(m_argc, m_argv, \"--right-image-crop-win\", 4);\n\n  // Wipe the stereo_gui --window-size option and some others that are no\n  // use for stereo.\n  asp::rmOptionVals(m_argc, m_argv, \"--window-size\", 2);\n  asp::rmOptionVals(m_argc, m_argv, \"--font-size\", 1);\n  asp::rmOptionVals(m_argc, m_argv, \"--lowest-resolution-subimage-num-pixels\", 1);\n\n  // Form the command to run\n  for (int i = 1; i < m_argc; i++) {\n    std::string token = std::string(m_argv[i]);\n    // Skip adding empty spaces we may have introduced with asp::rmOptionVals().\n    if (token == \" \")\n      continue;\n    // Use quotes if there are spaces\n    if (token.find(\" \") != std::string::npos || token.find(\"\\t\") != std::string::npos) \n      token = '\"' + token + '\"';\n    \n    run_cmd += \" \" + token;\n  }\n  \n  // Add crop win options\n  std::ostringstream os;\n  os << \" --left-image-crop-win \" << left_x << \" \" << left_y << \" \"\n     << left_wx << \" \" << left_wy;\n  os << \" --right-image-crop-win \" << right_x << \" \" << right_y << \" \"\n     << right_wx << \" \" << right_wy;\n  run_cmd += os.str();\n\n  // Run the command\n  vw_out() << \"Running: \" << run_cmd << std::endl;\n  system(run_cmd.c_str());\n  QMessageBox::about(this, tr(\"stereo_gui\"), tr(\"Done running stereo\"));\n}\n\nvoid MainWindow::save_screenshot() {\n  QMessageBox::about(this, tr(\"Info\"), tr(\"To save a screenshot, right-click on an image.\"));\n  return;\n}\n\nvoid MainWindow::select_region() {\n  QMessageBox::about(this, tr(\"Info\"), tr(\"Use Control-Left Mouse to select a region. Its bounds will be printed in a terminal. Stereo can be run on selected regions.\"));\n  return;\n}\n\nvoid MainWindow::change_cursor() {\n  m_cursor_count = (m_cursor_count + 1) % 3;\n  if (m_cursor_count == 0) {\n    setCursor(Qt::PointingHandCursor);\n  } else if (m_cursor_count == 1) {\n    setCursor(Qt::UpArrowCursor);\n  }  else{\n    setCursor(Qt::ArrowCursor);\n  }\n}\n\nvoid MainWindow::run_stereo() {\n  MainWindow::run_stereo_or_parallel_stereo(\"stereo\");\n}\n\nvoid MainWindow::run_parallel_stereo() {\n  MainWindow::run_stereo_or_parallel_stereo(\"parallel_stereo\");\n}\n\n// Toggle on or of the tool for detecting a threshold in images\nvoid MainWindow::thresholdCalc() {\n  bool on = m_win_menu_mgr.m_thresholdCalc_action->isChecked();\n  for (size_t i = 0; i < m_widgets.size(); i++) {\n    if (m_widgets[i])\n      m_widgets[i]->setThreshMode(on);\n  }\n}\n\nvoid MainWindow::viewThreshImages() {\n  if (m_win_menu_mgr.m_viewThreshImages_action->isChecked())\n    app_data.display_mode = THRESHOLDED_VIEW;\n  else\n    app_data.display_mode = REGULAR_VIEW;\n  \n  MainWindow::updateDisplayModeMenuEntries();\n\n  for (size_t i = 0; i < m_widgets.size(); i++) {\n    if (!m_widgets[i])\n      continue;\n    bool refresh_pixmap = true;\n    if (app_data.display_mode == THRESHOLDED_VIEW) \n      m_widgets[i]->viewThreshImages(refresh_pixmap);\n    else\n      m_widgets[i]->viewUnthreshImages();\n  }\n}\n\nvoid MainWindow::contourImages() {\n  \n  for (size_t i = 0; i < m_widgets.size(); i++) {\n    if (!m_widgets[i] ||\n        m_widgets[i]->getThreshold() == -std::numeric_limits<double>::max()) {\n      popUp(\"Set the threshold via the Threshold menu before finding the contour.\");\n      return;\n    }\n  }\n  \n  for (size_t i = 0; i < m_widgets.size(); i++) {\n    // If we fail at one of the contouring operations, presumably a\n    // pop-up will be shown, and then it is not worth continuing,\n    // which may just result in more pop-ups.\n    if (!m_widgets[i]->contourImage()) \n      return;\n  }\n}\n\nvoid MainWindow::saveVectorLayerAsShapeFile() {\n  if (m_widgets.size() > 1) {\n    popUp(\"More than one pane exists. Use the right-click menu of the desired pane instead.\");\n    return;\n  }\n\n  if (m_widgets.size() == 1 && m_widgets[0]) \n    m_widgets[0]->saveVectorLayerAsShapeFile();\n}\n\nvoid MainWindow::saveVectorLayerAsTextFile() {\n  if (m_widgets.size() > 1) {\n    popUp(\"More than one pane exists. Use the right-click menu of the desired pane instead.\");\n    return;\n  }\n\n  if (m_widgets.size() == 1 && m_widgets[0]) \n    m_widgets[0]->saveVectorLayerAsTextFile();\n}\n\nvoid MainWindow::thresholdGetSet() {\n\n  std::ostringstream oss;\n  oss.precision(18);\n  \n  for (size_t i = 0; i < m_widgets.size(); i++) {\n    if (m_widgets[i])\n      oss << m_widgets[i]->getThreshold() << \" \";\n  }\n  std::string thresh = oss.str();\n  bool ans = getStringFromGui(this,\n                              \"Image thresholds\",\n                              \"Image thresholds\",\n                              thresh, thresh);\n  if (!ans)\n    return;\n\n  std::istringstream iss(thresh.c_str());\n  std::vector<double> thresholds;\n  double val;\n  while (iss >> val)\n    thresholds.push_back(val);\n\n  if (thresholds.size() != m_widgets.size()) {\n    popUp(\"There must be as many thresholds as images.\");\n    return;\n  }\n  \n  for (size_t i = 0; i < m_widgets.size(); i++) {\n    if (m_widgets[i])\n      m_widgets[i]->setThreshold(thresholds[i]);\n  }\n  \n  // Turn off viewing thresholded images when the threshold is set. The user can\n  // turn this back on, and then the thresholded image will be recomputed and\n  // displayed.\n  app_data.display_mode = REGULAR_VIEW;\n  MainWindow::updateDisplayModeMenuEntries();\n  MainWindow::viewThreshImages();\n}\n\nvoid MainWindow::setLineWidth() {\n\n  std::ostringstream oss;\n  for (size_t i = 0; i < m_widgets.size(); i++) {\n    if (m_widgets[i]) {\n      oss << m_widgets[i]->getLineWidth();\n      // All widgets will have the same line width\n      break;\n    }\n  }\n  \n  std::string lineWidthStr = oss.str();\n  bool ans = getStringFromGui(this,\n                              \"Polygonal line width\",\n                              \"Polygonal line width\",\n                              lineWidthStr, lineWidthStr);\n  if (!ans)\n    return;\n\n  int lineWidth = atoi(lineWidthStr.c_str());\n\n  if (lineWidth <= 0) {\n    popUp(\"The line width must be a positive integer.\");\n    return;\n  }\n  \n  for (size_t i = 0; i < m_widgets.size(); i++) {\n    if (m_widgets[i])\n      m_widgets[i]->setLineWidth(lineWidth);\n  }\n  \n}\n\nvoid MainWindow::setPolyColor() {\n\n  std::string polyColor;\n  for (size_t i = 0; i < m_widgets.size(); i++) {\n    if (m_widgets[i]) {\n      polyColor = m_widgets[i]->getPolyColor();\n      // All widgets will have the same poly color\n      break;\n    }\n  }\n  \n  bool ans = getStringFromGui(this,\n                              \"Polygonal line color\",\n                              \"Polygonal line color\",\n                              polyColor, polyColor);\n  if (!ans)\n    return;\n\n  if (polyColor == \"\") {\n    popUp(\"The polygonal line color must be set.\");\n    return;\n  }\n  \n  for (size_t i = 0; i < m_widgets.size(); i++) {\n    if (m_widgets[i])\n      m_widgets[i]->setPolyColor(polyColor);\n  }\n  \n}\n\nvoid MainWindow::viewHillshadedImages() {\n  bool hillshade = m_win_menu_mgr.m_viewHillshadedImages_action->isChecked();\n  app_data.display_mode = hillshade ? HILLSHADED_VIEW : REGULAR_VIEW;\n  MainWindow::updateDisplayModeMenuEntries();\n  \n  for (size_t i = 0; i < m_widgets.size(); i++) {\n    if (m_widgets[i])\n      m_widgets[i]->viewHillshadedImages(app_data.display_mode == HILLSHADED_VIEW);\n  }\n}\n\n// Pass to the widget the desire to zoom all images to the same region\n// or its cancellation\nvoid MainWindow::setZoomAllToSameRegionAux(bool do_zoom) {\n  m_win_menu_mgr.m_zoomAllToSameRegion_action->setChecked(do_zoom);\n}\n\n// Pass to the widget the desire to zoom all images to the same region\n// or its cancellation\nvoid MainWindow::setZoomAllToSameRegion() {\n  \n  asp::stereo_settings().zoom_all_to_same_region\n    = m_win_menu_mgr.m_zoomAllToSameRegion_action->isChecked();\n  setZoomAllToSameRegionAux(asp::stereo_settings().zoom_all_to_same_region);\n\n  if (!asp::stereo_settings().zoom_all_to_same_region)\n    return; // nothing to do\n\n  // If zooming to same region, windows better not be on top of each other\n  if (m_view_type == VIEW_IN_SINGLE_WINDOW) {\n    if (m_view_type_old != VIEW_IN_SINGLE_WINDOW)\n      m_view_type = m_view_type_old; // restore this\n    else\n      m_view_type = VIEW_SIDE_BY_SIDE;\n  }\n\n  // If all images are georeferenced, it makes perfect sense to turn\n  // on georeferencing when zooming. The user can later turn it off\n  // from the menu if so desired.\n  bool has_georef = true;\n  for (size_t i = 0; i < app_data.image_files.size(); i++) {\n    has_georef = has_georef && app_data.images[i].has_georef;\n  }\n\n  if (has_georef && !app_data.use_georef) {\n    app_data.use_georef = true;\n    m_win_menu_mgr.m_viewGeoreferencedImages_action->setChecked(app_data.use_georef);\n    viewGeoreferencedImages(); // This will invoke createLayout() too.\n  }else{\n    createLayout();\n  }\n\n}\n\n// Zoom all widgets to the same region which comes from widget with given id.\n// There is no need to re-create any layouts now, as nothing changes\n// except the fact that we zoom.\nvoid MainWindow::zoomAllToSameRegionAction(int widget_id) {\n  int num_widgets = m_widgets.size();\n  if (widget_id < 0 || widget_id >= num_widgets) {\n    popUp(\"Invalid widget id.\");\n    return;\n  }\n\n  if (!m_widgets[widget_id]) return;\n\n  vw::BBox2 region = m_widgets[widget_id]->current_view();\n  for (size_t i = 0; i < m_widgets.size(); i++) {\n    if (m_widgets[i]) {\n      m_widgets[i]->zoomToRegion(region);\n    }\n  }\n  \n}\n\n// View next or previous image\nvoid MainWindow::viewOtherImage(int delta) {\n  \n  if (!m_chooseFiles) {\n    popUp(\"The file chooser is not on.\");\n    return;\n  }\n\n  if (m_view_type != VIEW_IN_SINGLE_WINDOW && !previewOrSideBySideWithDialog()) {\n    popUp(\"Viewing the next/prev image requires that all images be in the same window or side-by-side with a dialog.\");\n    return;\n  }\n\n  m_chooseFiles->viewOtherImage(delta);\n\n  if (m_view_type == VIEW_IN_SINGLE_WINDOW && !previewOrSideBySideWithDialog() && \n      m_widgets.size() == 1 && m_widgets[0])\n    m_widgets[0]->refreshPixmap();\n  else if (previewOrSideBySideWithDialog())\n    createLayout();\n  \n  return;\n}\n\nvoid MainWindow::viewNextImage() {\n  MainWindow::viewOtherImage(1); \n}\n\nvoid MainWindow::viewPrevImage() {\n  MainWindow::viewOtherImage(-1); \n}\n\nvoid MainWindow::uncheckProfileModeCheckbox() {\n  m_win_menu_mgr.m_profileMode_action->setChecked(false);\n  return;\n}\n\nvoid MainWindow::profileMode() {\n  bool profile_mode = m_win_menu_mgr.m_profileMode_action->isChecked();\n  if (profile_mode && m_widgets.size() != 1) {\n    popUp(\"A profile can be shown only when a single image is present.\");\n    uncheckProfileModeCheckbox();\n    return;\n  }\n  \n  for (size_t i = 0; i < m_widgets.size(); i++) {\n    if (m_widgets[i])\n      m_widgets[i]->setProfileMode(profile_mode);\n  }\n}\n\nvoid MainWindow::uncheckPolyEditModeCheckbox() {\n  m_win_menu_mgr.m_polyEditMode_action->setChecked(false);\n  return;\n}\n\nvoid MainWindow::polyEditMode() {\n  bool polyEditMode = m_win_menu_mgr.m_polyEditMode_action->isChecked();\n\n  if (polyEditMode) {\n    // Turn on vector layer editing\n    \n    if (!app_data.use_georef) {\n      bool has_georef = true;\n      for (size_t i = 0; i < app_data.images.size(); i++)\n        has_georef = has_georef && app_data.images[i].has_georef;\n\n      if (has_georef) {\n        app_data.use_georef = true;\n        // If georeference information exists, draw polygons in that mode,\n        // and any newly-created polygons will inherit the georeference.\n        popUp(\"To edit polygons, the data will be overlaid in one window using georeferences.\");\n        app_data.use_georef = true;\n        m_win_menu_mgr.m_viewGeoreferencedImages_action->setChecked(app_data.use_georef);\n        m_win_menu_mgr.m_overlayGeoreferencedImages_action\n          ->setChecked(app_data.use_georef);\n        overlayGeoreferencedImages();\n        return;\n      }\n    }\n  }\n  \n  // We arrive here if no GUI overhaul happens. Simply notify the\n  // widgets to turn on or off the editing of polygons.\n  bool refresh = true;\n  for (size_t i = 0; i < m_widgets.size(); i++) {\n    if (m_widgets[i])\n      m_widgets[i]->setPolyEditMode(polyEditMode, refresh);\n  }\n\n  return;\n}\n\nvoid MainWindow::viewGeoreferencedImages() {\n  app_data.use_georef = m_win_menu_mgr.m_viewGeoreferencedImages_action->isChecked();\n  if (app_data.use_georef) {\n\n    // Will show in single window with georef. Must first check if all images have georef.\n    for (size_t i = 0; i < app_data.image_files.size(); i++) {\n      if (!app_data.images[i].has_georef) {\n        popUp(\"Cannot view georeferenced images, as there is no georeference in: \"\n              + app_data.image_files[i]);\n        app_data.use_georef = false;\n        m_win_menu_mgr.m_viewGeoreferencedImages_action->setChecked(app_data.use_georef);\n        m_win_menu_mgr.m_overlayGeoreferencedImages_action\n          ->setChecked(app_data.use_georef);\n        return;\n      }\n    }\n  }\n\n  createLayout();\n}\n\nvoid MainWindow::overlayGeoreferencedImages() {\n  app_data.use_georef = m_win_menu_mgr.m_overlayGeoreferencedImages_action->isChecked();\n\n  if (app_data.use_georef) {\n\n    // Will show in single window with georef. Must first check if all images have georef.\n    for (size_t i = 0; i < app_data.image_files.size(); i++) {\n      if (!app_data.images[i].has_georef) {\n        popUp(\"Cannot overlay, as there is no georeference in: \" + app_data.image_files[i]);\n        app_data.use_georef = false;\n        m_win_menu_mgr.m_viewGeoreferencedImages_action->setChecked(app_data.use_georef);\n        m_win_menu_mgr.m_overlayGeoreferencedImages_action\n          ->setChecked(app_data.use_georef);\n        return;\n      }\n    }\n\n    if (m_view_type != VIEW_IN_SINGLE_WINDOW) m_view_type_old = m_view_type; // back this up\n    m_view_type = VIEW_IN_SINGLE_WINDOW;\n\n    // Turn off zooming all images to same region if all are in the same window\n    if (asp::stereo_settings().zoom_all_to_same_region) {\n      asp::stereo_settings().zoom_all_to_same_region = false;\n      setZoomAllToSameRegionAux(asp::stereo_settings().zoom_all_to_same_region);\n    }\n    \n  }else{\n    if (m_view_type_old != VIEW_IN_SINGLE_WINDOW) m_view_type = m_view_type_old; // restore this\n    else m_view_type = VIEW_SIDE_BY_SIDE; \n  }\n\n  createLayout();\n}\n\nvoid MainWindow::about() {\n  std::ostringstream about_text;\n  about_text << \"<h3>stereo_gui</h3>\"\n             << \"<p>NASA Ames Research Center. \"\n             << \"See the manual for documentation.</p>\";\n  QMessageBox::about(this, tr(\"About stereo_gui\"),\n                     tr(about_text.str().c_str()));\n\n}\n\nbool MainWindow::eventFilter(QObject *obj, QEvent *event) {\n\n#if 0\n  // Logic which for now does nothing but may be useful one day\n  if (event->type() == QEvent::KeyPress) {\n    QKeyEvent *key_event = static_cast<QKeyEvent*>(event);\n    if (int(key_event->key()) == 67) {\n      // do something\n    }\n  }\n#endif\n  \n  return QMainWindow::eventFilter(obj, event);\n}\n\nvoid MainWindow::keyPressEvent(QKeyEvent *event) {\n  // Redirect to some widget. This is a fix for panning not working\n  // unless one clicks on the image first.\n  for (size_t wit = 0; wit < m_widgets.size(); wit++) {\n    if (m_widgets[wit]) {\n      m_widgets[wit]->keyPressEvent(event);\n      break;\n    }\n  }\n  \n}\n"
  },
  {
    "path": "src/asp/GUI/MainWindow.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// \\file MainWindow.h\n// \n// \n#ifndef __STEREO_GUI_MAINWINDOW_H__\n#define __STEREO_GUI_MAINWINDOW_H__\n\n#include <asp/Core/MatchList.h>\n#include <asp/GUI/GuiUtilities.h>\n#include <asp/GUI/AppData.h>\n#include <asp/GUI/MatchPointMgr.h>\n#include <asp/GUI/WindowMenuMgr.h>\n\n#include <vw/Math/Vector.h>\n#include <vw/InterestPoint/InterestPoint.h>\n#include <vw/BundleAdjustment/ControlNetwork.h>\n#include <vw/Cartography/GeoTransform.h>\n\n#include <QMainWindow>\n\n#include <string>\n#include <vector>\n\n// Forward declarations\nclass QAction;\nclass QLabel;\nclass QTabWidget;\nclass QSplitter;\n\nnamespace asp {\n\nenum ViewType {VIEW_SIDE_BY_SIDE, VIEW_IN_SINGLE_WINDOW, VIEW_AS_TILES_ON_GRID};\n\nclass MainWidget;\nclass ChooseFilesDlg;\n\n// This class handles the menus at the top bar and other application level details.\nclass MainWindow : public QMainWindow {\n  Q_OBJECT\n\npublic:\n  MainWindow(vw::GdalWriteOptions const& opt,\n              std::vector<std::string> const& images,\n              std::string& output_prefix, // non-const, so we can change it\n              int grid_cols,\n              vw::Vector2i const& window_size, bool single_window,\n              bool use_georef,\n              std::vector<std::map<std::string, std::string>> const& properties,\n              int argc, char ** argv);\n  virtual ~MainWindow() {}\n\nprivate slots:\n  void forceQuit                  (); // Ensure the program shuts down.\n  void sizeToFit                  ();\n  void zoomIn                     ();\n  void zoomOut                    ();\n  void viewSingleWindow           ();\n  void viewAllSideBySide          ();\n  void viewSeveralSideBySide      ();\n  void viewAsTiles                ();\n  void zoomToProjWin              ();\n  void viewMatchesFromMenu();\n  void toggleViewMatches          ();\n  void zoomAllToSameRegionAction(int widget_id);\n  void viewMatches();\n  void viewPairwiseMatchesSlot();\n  void viewPairwiseCleanMatchesSlot();\n  void addDelMatches              ();\n  void saveMatches                ();\n  void writeGroundControlPoints   (); // Write a ground control point file for bundle_adjust\n  void save_screenshot            ();\n  void select_region              ();\n  void change_cursor              ();\n  void run_stereo                 ();\n  void run_parallel_stereo        ();\n  void thresholdCalc              ();\n  void thresholdGetSet            ();\n  void setPolyColor               ();\n  void setLineWidth               ();\n  void viewThreshImages           ();\n  void contourImages              ();\n  void saveVectorLayerAsShapeFile ();\n  void saveVectorLayerAsTextFile  ();\n  void viewHillshadedImages       ();\n  void viewGeoreferencedImages    ();\n  void overlayGeoreferencedImages ();\n  void setZoomAllToSameRegion     ();\n  void setZoomAllToSameRegionAux(bool do_zoom);\n  void viewNextImage              ();\n  void viewPrevImage              ();\n  void viewOtherImage(int delta);\n\n  void profileMode                ();\n  void polyEditMode               ();\n  void uncheckProfileModeCheckbox ();\n  void uncheckPolyEditModeCheckbox();\n  void about                      ();\n\nprotected:\n  void keyPressEvent(QKeyEvent *event);\n  bool eventFilter(QObject *obj, QEvent *e);\n\nprivate slots:\n  void perhapsCreateLayout(int row, int col); \n  void hideShowAll_windowVersion(); \n  void createLayout();\n\nprivate:\n\n  void run_stereo_or_parallel_stereo(std::string const& cmd);\n\n  // Go through m_matches and retain only IPs detected in the first image.\n  // - If require_all is set, only keep IPs detected in all images.\n  size_t consolidate_matches(bool require_all = true);\n\n\n  // Event handlers\n  void resizeEvent(QResizeEvent *);\n  void closeEvent (QCloseEvent  *);\n\n  // See if in the middle of editing matches\n  bool editingMatches() const;\n\n  bool creatingGcp() const;\n  \n  void updateViewMenuEntries();\n  void updateDisplayModeMenuEntries();\n  \n  bool sanityChecks(int num_images);\n\n  void viewPairwiseMatchesOrCleanMatches();\n  \n  vw::GdalWriteOptions m_opt;\n  std::string               m_output_prefix;\n  double                    m_widRatio;    // ratio of sidebar to entire win wid\n  std::vector<MainWidget*>  m_widgets;     // one of these for each separate image pane.\n  ChooseFilesDlg *          m_chooseFiles; // left sidebar for selecting files\n\n  WindowMenuMgr m_win_menu_mgr;\n  friend struct WindowMenuMgr;\n\n  ViewType m_view_type, m_view_type_old;\n  int      m_grid_cols, m_grid_cols_old;\n  bool     m_allowMultipleSelections;\n  int      m_argc;\n  char **  m_argv;\n  \n  asp::MatchPointMgr m_match_mgr;\n\n  int m_cursor_count;\n\n  // This will be set to true each time we enter the mode when images\n  // are shown side-by-side with a dialog. The user can later choose\n  // to show any number.\n  bool m_show_two_images_when_side_by_side_with_dialog;\n  \n  bool m_saved_gcp_and_ip;\n\n  // Application data shared among all widgets\n  asp::AppData app_data;\n};\n\n} // namespace asp\n\n#endif // __STEREO_GUI_MAINWINDOW_H__\n"
  },
  {
    "path": "src/asp/GUI/MatchPointMgr.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2024, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/GUI/MatchPointMgr.h>\n#include <asp/GUI/MainWidget.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/IpMatchingAlgs.h>\n\n#include <vw/Math/Vector.h>\n#include <vw/InterestPoint/MatcherIO.h>\n\n#include <QtGui>\n#include <QPainter>\n\nusing namespace vw;\n\nnamespace asp {\n\nvoid MatchPointMgr::drawInterestPoints(QPainter* paint,\n                                       MainWidget* main_widget,\n                                       int beg_image_id,\n                                       int base_image_id,\n                                       int window_width,\n                                       int window_height) {\n\n  // Highlight colors for various actions\n  QColor ipColor              = QColor(255,  0,  0); // Red\n  QColor ipInvalidColor       = QColor(255,163, 26); // Orange\n  QColor ipAddHighlightColor  = QColor(64,255,  0); // Green\n  QColor ipMoveHighlightColor = QColor(255,  0,255); // Magenta\n\n  paint->setBrush(Qt::NoBrush);\n\n  // If this point is currently being edited by the user, highlight it.\n  // - Here we check to see if it has not been placed in all images yet.\n  bool highlight_last = false;\n  if (asp::stereo_settings().view_matches) {\n    int lastImage = int(m_matchlist.getNumImages()) - 1;\n    highlight_last\n      = (m_matchlist.getNumPoints(beg_image_id) > m_matchlist.getNumPoints(lastImage));\n  }\n\n  std::vector<Vector2> ip_vec;\n  if (asp::stereo_settings().view_matches) {\n    for (size_t ip_iter = 0; ip_iter < m_matchlist.getNumPoints(beg_image_id); ip_iter++) {\n      // Generate the pixel coord of the point\n      Vector2 pt = m_matchlist.getPointCoord(beg_image_id, ip_iter);\n      ip_vec.push_back(pt);\n    }\n  } else if (asp::stereo_settings().pairwise_matches &&\n              beg_image_id < m_pairwiseMatches.ip_to_show.size()) {\n    // Had to check if ip_to_show was initialized by now\n    auto & ip_in_vec = m_pairwiseMatches.ip_to_show[beg_image_id]; // alias\n    for (size_t ip_iter = 0; ip_iter < ip_in_vec.size(); ip_iter++) {\n      ip_vec.push_back(Vector2(ip_in_vec[ip_iter].x, ip_in_vec[ip_iter].y));\n    }\n  }\n  else if (asp::stereo_settings().pairwise_clean_matches &&\n              beg_image_id < m_pairwiseCleanMatches.ip_to_show.size()) {\n    // Had to check if ip_to_show was initialized by now\n    auto & ip_in_vec = m_pairwiseCleanMatches.ip_to_show[beg_image_id]; // alias\n    for (size_t ip_iter = 0; ip_iter < ip_in_vec.size(); ip_iter++) {\n      ip_vec.push_back(Vector2(ip_in_vec[ip_iter].x, ip_in_vec[ip_iter].y));\n    }\n  }\n\n  // Iterate over interest points\n  for (size_t ip_iter = 0; ip_iter < ip_vec.size(); ip_iter++) {\n    // Generate the pixel coord of the point\n    Vector2 pt    = ip_vec[ip_iter];\n    Vector2 world = m_app_data.image2world_trans(pt, base_image_id); // Use m_app_data\n    Vector2 P     = main_widget->world2screen(world); // Use main_widget->world2screen\n\n    // Do not draw points that are outside the viewing area\n    if (P.x() < 0 || P.x() > window_width ||\n        P.y() < 0 || P.y() > window_height) {\n      continue;\n    }\n\n    paint->setPen(ipColor); // The default IP color\n    paint->setBrush(ipColor); // make the point filled\n\n    if (asp::stereo_settings().view_matches) {\n      // Some special handling for when we add matches\n      if (!m_matchlist.isPointValid(beg_image_id, ip_iter)) {\n        paint->setPen(ipInvalidColor);\n        paint->setBrush(ipInvalidColor);\n      }\n\n      // Highlighting the last point\n      if (highlight_last && (ip_iter == m_matchlist.getNumPoints(beg_image_id)-1)) {\n        paint->setPen(ipAddHighlightColor);\n        paint->setBrush(ipAddHighlightColor);\n      }\n\n      if (static_cast<int>(ip_iter) == m_editMatchPointVecIndex) {\n        paint->setPen(ipMoveHighlightColor);\n        paint->setBrush(ipMoveHighlightColor);\n      }\n    }\n\n    QPoint Q(P.x(), P.y());\n    paint->drawEllipse(Q, 2, 2); // Draw the point\n\n  } // End loop through points\n} // End function drawInterestPoints\n\nvoid MatchPointMgr::loadPairwiseMatches(int left_index, int right_index,\n                                        std::string const& output_prefix) {\n\n  bool matches_as_txt = asp::stereo_settings().matches_as_txt;\n  \n  pairwiseMatchList * pairwiseMatches = NULL;\n  std::string match_file;\n  auto index_pair = std::make_pair(left_index, right_index);\n  \n  if (asp::stereo_settings().pairwise_matches) {\n    \n    pairwiseMatches = &m_pairwiseMatches;\n    if (!asp::stereo_settings().nvm.empty() ||\n        !asp::stereo_settings().isis_cnet.empty()) {\n      // Load from nvm or isis cnet\n      match_file = \"placeholder.match\";\n      pairwiseMatches->match_files[index_pair] = match_file; // flag it as loaded\n\n      // Where we want these loaded \n      auto & left_ip = pairwiseMatches->matches[index_pair].first;   // alias\n      auto & right_ip = pairwiseMatches->matches[index_pair].second; // alias\n\n      if (left_ip.empty() && right_ip.empty())\n        asp::matchesForPair(m_cnet, left_index, right_index, left_ip, right_ip);\n      \n    } else if (pairwiseMatches->match_files.find(index_pair) ==\n               pairwiseMatches->match_files.end()) {\n      // Load pairwise matches\n      match_file = vw::ip::match_filename(output_prefix,\n                                          m_app_data.images[left_index].name,\n                                          m_app_data.images[right_index].name,\n                                          matches_as_txt);\n    }\n  } else {\n    // Load pairwise clean matches\n    pairwiseMatches = &m_pairwiseCleanMatches;\n    if (pairwiseMatches->match_files.find(index_pair) == \n        pairwiseMatches->match_files.end()) {\n      match_file = vw::ip::clean_match_filename(output_prefix,\n                                                m_app_data.images[left_index].name,\n                                                m_app_data.images[right_index].name,\n                                                matches_as_txt);\n    }\n  }\n  \n  // Ensure the ip per image are always empty but initialized. This will ensure that\n  // later in MainWidget::viewMatches() we plot the intended matches.\n  if (pairwiseMatches) {\n    pairwiseMatches->ip_to_show.clear();\n    pairwiseMatches->ip_to_show.resize(m_app_data.images.size());\n  }\n  \n  // Where we want these loaded \n  auto & left_ip = pairwiseMatches->matches[index_pair].first; // alias\n  auto & right_ip = pairwiseMatches->matches[index_pair].second; // alias\n  \n  // If the file was not loaded before, load it. Note that matches from an nvm file\n  // are loaded by now.\n  if (pairwiseMatches->match_files.find(index_pair) == pairwiseMatches->match_files.end()) {\n    // Flag it as loaded\n    pairwiseMatches->match_files[index_pair] = match_file;\n    try {\n      // Load it\n      vw_out() << \"Loading match file: \" << match_file << \"\\n\";\n      vw::ip::read_match_file(match_file, left_ip, right_ip, matches_as_txt);\n      vw_out() << \"Read: \" << left_ip.size() << \" matches.\\n\";\n    } catch (...) {\n      // Having this pop-up for a large number of images is annoying\n      vw_out() << \"Cannot find the match file with given images and output prefix.\\n\";\n      return;\n    }\n  }\n  \n  // These will be read when interest points are drawn\n  pairwiseMatches->ip_to_show[left_index] = left_ip;\n  pairwiseMatches->ip_to_show[right_index] = right_ip;\n}\n\n} // End namespace asp"
  },
  {
    "path": "src/asp/GUI/MatchPointMgr.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2024, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#ifndef __ASP_GUI_MATCH_POINT_MGR_H__\n#define __ASP_GUI_MATCH_POINT_MGR_H__\n\n// ASP\n#include <asp/Core/MatchList.h>\n#include <asp/GUI/GuiUtilities.h>\n\n// Vision Workbench\n#include <vw/InterestPoint/InterestPoint.h> // For pairwiseMatchList\n#include <vw/BundleAdjustment/ControlNetwork.h> // For ControlNetwork\n\n// Standard\n#include <string>\n#include <vector>\n#include <memory>\n\nclass QPainter;\nnamespace asp {\n\n// Forward declarations\nclass AppData;\nclass MainWidget;\n\n// Structures to keep track of all interest point matches.\nclass MatchPointMgr {\npublic:\n  MatchPointMgr(asp::AppData & app_data): // Constructor now takes AppData\n    m_matches_exist(false),\n    m_cnet(\"ASP_control_network\"),\n    m_editMatchPointVecIndex(-1),\n    m_editingMatches(false),\n    m_app_data(app_data) {} // Initialize m_app_data\n\n  void init(int num_images) {\n    m_matchlist.resize(num_images);\n  }\n\n  void drawInterestPoints(QPainter* paint,\n                          MainWidget* main_widget, // New argument\n                          int beg_image_id, int base_image_id,\n                          int window_width, int window_height);\n\n  void loadPairwiseMatches(int left_index, int right_index,\n                           std::string const& output_prefix);\n\n  // Member variables\n  bool     m_matches_exist;\n  asp::MatchList    m_matchlist;\n  pairwiseMatchList m_pairwiseMatches;\n  pairwiseMatchList m_pairwiseCleanMatches;\n  vw::ba::ControlNetwork m_cnet;\n  int m_editMatchPointVecIndex; // Point being edited\n  bool m_editingMatches;        // If we are in the middle of editing match points\n  asp::AppData & m_app_data;   // Reference to AppData\n\n}; // End class MatchPointMgr\n\n} // End namespace asp\n\n#endif // __ASP_GUI_MATCH_POINT_MGR_H__"
  },
  {
    "path": "src/asp/GUI/PolyWidget.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2024, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  https://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// \\file PolyWidget.cc\n// \n// Member functions of MainWidget that have to do with polygons.\n\n#include <asp/GUI/WidgetMenuMgr.h>\n\n#include <asp/GUI/MainWidget.h>\n#include <asp/GUI/GuiGeom.h>\n#include <asp/GUI/ChooseFilesDlg.h>\n#include <asp/Core/StereoSettings.h>\n\n#include <vw/Cartography/shapeFile.h>\n#include <vw/Math/Vector.h>\n\n#include <qwt_point_data.h>\n#include <QtGui>\n#include <QtWidgets>\n#include <QMenu>\n#include <string>\n#include <vector>\n\nnamespace asp {\n\n// All functions here are member functions of MainWidget, but are moved\n// to this file to reduce the size of MainWidget.cc.\n\n// Change the color of given layer of polygons\nvoid MainWidget::changePolyColor(int imageIndex) {\n  std::string polyColor;\n  bool ans = getStringFromGui(this,\n                              \"Polygonal line color\",\n                              \"Polygonal line color\",\n                              polyColor, polyColor);\n  if (!ans)\n    return;\n\n  if (polyColor == \"\") {\n    popUp(\"The polygonal line color must be set.\");\n    return;\n  }\n\n  // We will assume the user wants to see this on top\n  m_perImagePolyColor[imageIndex] = polyColor;\n  bringImageOnTop(imageIndex);\n\n  // Redraw everything, which will change the color\n  refreshPixmap();\n}\n\nvoid MainWidget::setPolyEditMode(bool polyEditMode, bool refresh) {\n  m_polyEditMode = polyEditMode;\n\n  // Turn off moving vertices any time we turn on or off poly editing\n  m_wid_menu_mgr->m_moveVertex->setChecked(false);\n  m_wid_menu_mgr->m_showIndices->setChecked(false);\n\n  if (!m_polyEditMode) {\n    // Clean up any unfinished polygon\n    // Need to put here pop-up asking to save\n    m_currPolyX.clear();\n    m_currPolyY.clear();\n\n    // Call back to the main window and tell it to uncheck the polyEditMode checkbox\n    // mode checkbox.\n    emit uncheckPolyEditModeCheckbox();\n    return;\n  } else {\n    setProfileMode(false);\n  }\n\n  // On occasions we don't want to force a refresh prematurely, the\n  // GUI will take care of it when the layout is created\n  if (refresh)\n    refreshPixmap();\n}\n\n// TODO(oalexan1): Move out this non-gui function.\nvoid MainWidget::appendToPolyVec(vw::geometry::dPoly const& P) {\n\n  // Append the new polygon to the list of polygons. If we have several\n  // clips already, append it to the last clip. If we have no clips,\n  // create a new clip.\n  if (app_data.images[m_polyLayerIndex].polyVec.size() == 0) {\n    app_data.images[m_polyLayerIndex].polyVec.push_back(P);\n  } else {\n    app_data.images[m_polyLayerIndex].polyVec.back().appendPolygons(P);\n  }\n\n  return;\n}\n\n// Add a point to the polygon being drawn or stop drawing and append\n// the drawn polygon to the list of polygons. This polygon is in the\n// world coordinate system. When we append it, we will convert it to\n// points in the desired geodetic projection.\nvoid MainWidget::addPolyVert(double px, double py) {\n\n  vw::Vector2 S(px, py); // current point in screen pixels\n  int pSize = m_currPolyX.size();\n\n  // This is a bugfix. Before starting drawing, update\n  // m_polyLayerIndex to point to a currently visible layer,\n  // otherwise it looks as if polygons are invisible.\n  if (pSize == 0 && m_chooseFiles && \n      m_chooseFiles->isHidden(app_data.images[m_polyLayerIndex].name)) {\n    for (int j = m_beg_image_id; j < m_end_image_id; j++) {\n      int i = m_filesOrder[j]; // image index\n\n      if (m_chooseFiles && m_chooseFiles->isHidden(app_data.images[i].name))\n        continue;\n      m_polyLayerIndex = i; // not hidden\n    }\n  }\n\n  // Starting point in this polygon. It is absolutely essential that we\n  // keep it in world units. Otherwise, if we zoom while the polygon\n  // is being drawn, we will not be able to close it properly.\n  if (pSize == 0)\n    m_startPix = screen2world(S);\n\n  if (pSize <= 0 || vw::math::norm_2(world2screen(m_startPix) - S) > m_pixelTol) {\n\n    // We did not arrive yet at the starting point of the polygon being\n    // drawn. Add the current point.\n\n    S = screen2world(S);                    // world coordinates\n    m_world_box.grow(S); // to not cut when plotting later\n    S = app_data.world2proj(S, m_polyLayerIndex); // projected units\n\n    m_currPolyX.push_back(S.x());\n    m_currPolyY.push_back(S.y());\n    pSize = m_currPolyX.size();\n\n    // This will call paintEvent which will draw the current poly line\n    update();\n\n    return;\n  }\n\n  // Form the newly finished polygon\n  vw::geometry::dPoly poly;\n  poly.reset();\n  bool isPolyClosed = true;\n  std::string color = app_data.images[m_polyLayerIndex].color;\n  if (color == \"default\")\n    color = m_polyColor; // if no color was set from the command line\n\n  // If the user set a custom color\n  auto color_it = m_perImagePolyColor.find(m_polyLayerIndex);\n  if (color_it != m_perImagePolyColor.end()) {\n    color = color_it->second;\n    app_data.images[m_polyLayerIndex].color = color; // save for the future\n  }\n  std::string layer = \"\";\n  poly.appendPolygon(pSize,\n      vw::geometry::vecPtr(m_currPolyX), vw::geometry::vecPtr(m_currPolyY),\n                  isPolyClosed, color, layer);\n  appendToPolyVec(poly);\n  m_currPolyX.clear();\n  m_currPolyY.clear();\n\n  update(); // redraw the just polygons, not the underlying images\n  //refreshPixmap();\n\n  return;\n}\n\n// Delete a vertex closest to where the user clicked.\n// TODO(oalexan1): This will fail when different polygons have\n// different georeferences.\nvoid MainWidget::deleteVertex() {\n\n  vw::Vector2 P = screen2world(vw::Vector2(m_mousePrsX, m_mousePrsY));\n\n  asp::PolySearchResult sr;\n  asp::findClosestPolyVertex(P.x(), P.y(), app_data,\n                             m_beg_image_id, m_end_image_id, sr);\n\n  if (sr.clipIndex           < 0 ||\n      sr.polyVecIndex        < 0 ||\n      sr.polyIndexInCurrPoly < 0 ||\n      sr.vertIndexInCurrPoly < 0)\n    return;\n\n  app_data.images[sr.clipIndex].polyVec[sr.polyVecIndex].eraseVertex\n    (sr.polyIndexInCurrPoly, sr.vertIndexInCurrPoly);\n\n  // This will redraw just the polygons, not the pixmap\n  update();\n\n  return;\n}\n\n// TODO(oalexan1): Move out this non-gui function.\nvoid MainWidget::deleteVertices() {\n\n  if (m_stereoCropWin.empty()) {\n    popUp(\"No region is selected.\");\n    return;\n  }\n\n  asp::deleteVerticesInBox(app_data, m_stereoCropWin, m_beg_image_id, m_end_image_id);\n  \n  // The selection has done its job, wipe it now\n  m_stereoCropWin = vw::BBox2();\n\n  // This will redraw just the polygons, not the pixmap\n  update();\n}\n\n// Insert intermediate vertex where the mouse right-clicks.\n// TODO(oalexan1): This will fail when different polygons have\n// different georeferences.\n// TODO(oalexan1): Move out this non-gui function.\nvoid MainWidget::insertVertex() {\n\n  vw::Vector2 P = screen2world(vw::Vector2(m_mousePrsX, m_mousePrsY));\n  m_world_box.grow(P); // to not cut when plotting later\n\n  // If there is absolutely no polygon, start by creating one\n  // with just one point.\n  bool allEmpty = true;\n  for (size_t clipIt = m_beg_image_id; clipIt < m_end_image_id; clipIt++) {\n    if (app_data.images[clipIt].polyVec.size() > 0 &&\n        app_data.images[clipIt].polyVec[0].get_totalNumVerts() > 0) {\n      allEmpty = false;\n      break;\n    }\n  }\n\n  if (allEmpty) {\n    addPolyVert(m_mousePrsX, m_mousePrsY); // init the polygon\n    addPolyVert(m_mousePrsX, m_mousePrsY); // declare the polygon finished\n    return;\n  }\n\n  // The location of the point to be inserted looks more reasonable\n  // when one searches for closest edge, not vertex.\n  asp::PolySearchResult sr;\n  asp::findClosestPolyEdge(P.x(), P.y(), app_data,\n                           m_beg_image_id, m_end_image_id, sr);\n\n  if (sr.clipIndex           < 0 ||\n      sr.polyVecIndex        < 0 ||\n      sr.polyIndexInCurrPoly < 0 ||\n      sr.vertIndexInCurrPoly < 0) return;\n\n  // Convert to coordinates of the desired clip\n  P = app_data.world2proj(P, sr.clipIndex);\n\n  // Need +1 below as we insert AFTER current vertex\n  app_data.images[sr.clipIndex].polyVec[sr.polyVecIndex].insertVertex(\n    sr.polyIndexInCurrPoly, sr.vertIndexInCurrPoly + 1, P.x(), P.y());\n\n  // This will redraw just the polygons, not the pixmap\n  update();\n\n  return;\n}\n\n// Merge existing polygons\nvoid MainWidget::mergePolys() {\n  asp::mergePolys(app_data, m_beg_image_id, m_end_image_id, m_polyLayerIndex);\n}\n// Save the currently created vector layer\nvoid MainWidget::saveVectorLayerAsShapeFile() {\n\n  if (m_polyLayerIndex < m_beg_image_id || m_polyLayerIndex >= m_end_image_id) {\n    popUp(\"Images are inconsistent. Cannot save vector layer.\");\n    return;\n  }\n\n  std::string shapeFile = app_data.images[m_polyLayerIndex].name;\n  shapeFile =  boost::filesystem::path(shapeFile).replace_extension(\".shp\").string();\n  QString qShapeFile = QFileDialog::getSaveFileName(this,\n                                                  tr(\"Save shapefile\"), shapeFile.c_str(),\n                                                  tr(\"(*.shp)\"));\n  shapeFile = qShapeFile.toStdString();\n  if (shapeFile == \"\")\n    return;\n\n  bool has_geo = app_data.images[m_polyLayerIndex].has_georef;\n  vw::cartography::GeoReference const& geo = app_data.images[m_polyLayerIndex].georef;\n\n  // Save only polygons in the given layer. Polygons in other layers\n  // can have individual georeferences.\n  vw::vw_out() << \"Writing: \" << shapeFile << \"\\n\";\n  vw::geometry::write_shapefile(shapeFile, has_geo, geo, \n                                app_data.images[m_polyLayerIndex].polyVec);\n}\n\n// Save the currently created vector layer. Its index is m_polyLayerIndex.\n// Other layers are not saved. They may have their own georeferences.\nvoid MainWidget::saveVectorLayerAsTextFile() {\n\n  if (m_polyLayerIndex < m_beg_image_id || m_polyLayerIndex >= m_end_image_id) {\n    popUp(\"Images are inconsistent. Cannot save vector layer.\");\n    return;\n  }\n\n  std::string textFile = app_data.images[m_polyLayerIndex].name;\n  textFile =  boost::filesystem::path(textFile).replace_extension(\".txt\").string();\n  QString qtextFile = QFileDialog::getSaveFileName(this,\n                                                  tr(\"Save text file\"), textFile.c_str(),\n                                                  tr(\"(*.txt)\"));\n  textFile = qtextFile.toStdString();\n  if (textFile == \"\")\n    return;\n\n  app_data.images[m_polyLayerIndex].writePoly(textFile);\n}\n// Contour the current image\nbool MainWidget::contourImage() {\n\n  int non_poly_image = -1;\n  int num_non_poly_images = 0;\n  for (int image_iter = m_beg_image_id; image_iter < m_end_image_id; image_iter++) {\n    if (!app_data.images[image_iter].m_isPoly && !app_data.images[image_iter].m_isCsv)\n      num_non_poly_images++;\n    non_poly_image = image_iter;\n  }\n\n  if (num_non_poly_images > 1) {\n    popUp(\"Must have just one image in window to contour an image.\");\n    return false;\n  }\n\n  if (non_poly_image < 0)\n    return true; // Will quietly skip this\n\n  m_polyLayerIndex = non_poly_image;\n\n  int num_channels = app_data.images[m_polyLayerIndex].img().planes();\n  if (num_channels > 1) {\n    popUp(\"Contouring images makes sense only for single-channel images.\");\n    return false;\n  }\n\n  if (num_channels == 1)\n    asp::contour_image(app_data.images[m_polyLayerIndex].img(),\n                       app_data.images[m_polyLayerIndex].georef,\n                       m_threshold.value, \n                       app_data.images[m_polyLayerIndex].polyVec);\n\n  // This will call paintEvent which will draw the contour\n  update();\n\n  return true;\n}\n\nvoid MainWidget::drawOneVertex(int x0, int y0, QColor color, int lineWidth,\n                               int drawVertIndex, QPainter &paint) {\n\n  // Draw a vertex as a small shape (a circle, rectangle, triangle)\n\n  // Use variable size shapes to distinguish better points on top of\n  // each other\n  int len = 2*(drawVertIndex+1);\n  len = std::min(len, 8); // limit how big this can get\n\n  paint.setPen(QPen(color, lineWidth));\n\n  int numTypes = 4;\n  if (drawVertIndex < 0) {\n\n    // This will be reached only for the case when a polygon\n    // is so small that it collapses into a point.\n    len = lineWidth;\n    paint.setBrush(color);\n    paint.drawRect(x0 - len, y0 - len, 2*len, 2*len);\n\n  } else if (drawVertIndex%numTypes == 0) {\n\n    // Draw a small empty ellipse\n    paint.setBrush(Qt::NoBrush);\n    paint.drawEllipse(x0 - len, y0 - len, 2*len, 2*len);\n\n  } else if (drawVertIndex%numTypes == 1) {\n\n    // Draw an empty square\n    paint.setBrush(Qt::NoBrush);\n    paint.drawRect(x0 - len, y0 - len, 2*len, 2*len);\n\n  } else if (drawVertIndex%numTypes == 2) {\n\n    // Draw an empty triangle\n    paint.setBrush(Qt::NoBrush);\n    paint.drawLine(x0 - len, y0 - len, x0 + len, y0 - len);\n    paint.drawLine(x0 - len, y0 - len, x0 + 0,   y0 + len);\n    paint.drawLine(x0 + len, y0 - len, x0 + 0,   y0 + len);\n\n  } else {\n\n    // Draw an empty reversed triangle\n    paint.setBrush(Qt::NoBrush);\n    paint.drawLine(x0 - len, y0 + len, x0 + len, y0 + len);\n    paint.drawLine(x0 - len, y0 + len, x0 + 0,   y0 - len);\n    paint.drawLine(x0 + len, y0 + len, x0 + 0,   y0 - len);\n\n  }\n\n  return;\n}\n\nvoid MainWidget::plotPoly(bool plotPoints, bool plotEdges,\n                          bool plotFilled, bool showIndices,\n                          int lineWidth,\n                          int drawVertIndex, // 0 is a good choice here\n                          QColor const& color,\n                          QPainter & paint,\n                          // Make a local copy of the poly on purpose\n                          vw::geometry::dPoly currPoly) {\n\n  using namespace vw::geometry;\n\n  if (m_world_box.empty())\n    return;\n\n  // The box in world coordinates\n  double x_min = m_world_box.min().x();\n  double y_min = m_world_box.min().y();\n  double x_max = m_world_box.max().x();\n  double y_max = m_world_box.max().y();\n\n  double screen_min_x = 0, screen_min_y = 0;\n\n  // When polys are filled, plot largest polys first\n  if (plotFilled) {\n    // What on screen looks counter-clockwise, internally is clockwise,\n    // because the screen y axis is in fact pointing down.\n    // We need to reverse the orientation for the logic below to work properly\n    //currPoly.reverse();\n    //currPoly.sortBySizeAndMaybeAddBigContainingRect(x_min,  y_min, x_max, y_max);\n    //currPoly.reverse();\n  }\n\n  // Clip the polygon a bit beyond the viewing window, as to not see\n  // the edges where the cut took place. It is a bit tricky to\n  // decide how much the extra should be.\n  double tol = 1e-12;\n  double pixelSize = std::max(m_world_box.width()/m_window_width,\n                              m_world_box.height()/m_window_height);\n\n  double extra  = 2*pixelSize*lineWidth;\n  double extraX = extra + tol * std::max(std::abs(x_min), std::abs(x_max));\n  double extraY = extra + tol * std::max(std::abs(y_min), std::abs(y_max));\n\n  // Will try to use the color from polygons if they exist. Otherwise\n  // use the default color.\n  QColor local_color = color;\n\n  dPoly clippedPoly;\n  currPoly.clipPoly(x_min - extraX, y_min - extraY, x_max + extraX, y_max + extraY,\n                    clippedPoly); // output\n\n  std::vector<vw::geometry::anno> annotations;\n  if (showIndices) {\n    clippedPoly.compVertIndexAnno();\n    clippedPoly.get_vertIndexAnno(annotations);\n  } else {\n    // Copy regular annotations from the file\n    clippedPoly.get_annotations(annotations);\n  }\n\n  const double * xv       = clippedPoly.get_xv();\n  const double * yv       = clippedPoly.get_yv();\n  const int    * numVerts = clippedPoly.get_numVerts();\n  int numPolys            = clippedPoly.get_numPolys();\n\n  // Aliases\n  const std::vector<char> & isPolyClosed = clippedPoly.get_isPolyClosed();\n  const std::vector<std::string> & colors = clippedPoly.get_colors(); // we ignore these\n\n  int start = 0;\n  for (int pIter = 0; pIter < numPolys; pIter++) {\n\n    if (pIter > 0) start += numVerts[pIter - 1];\n    int pSize = numVerts[pIter];\n    // Use the corresponding color if it exists and is valid\n    if (colors.size() > pIter) {\n      QColor curr_color = QColor(colors[pIter].c_str());\n      if (curr_color.isValid())\n        local_color = curr_color;\n    }\n\n    // Determine the orientation of polygons\n    double signedArea = 0.0;\n    if (plotFilled && isPolyClosed[pIter]) {\n      bool counter_cc = true;\n      signedArea = signedPolyArea(pSize, xv + start, yv + start, counter_cc);\n    }\n\n    QPolygon pa(pSize);\n    for (int vIter = 0; vIter < pSize; vIter++) {\n\n      vw::Vector2 P = world2screen(vw::Vector2(xv[start + vIter], yv[start + vIter]));\n      pa[vIter] = QPoint(P.x(), P.y());\n\n      // Qt's built in points are too small. Instead of drawing a point\n      // draw a small shape.\n      int tol = 4; // This is a bug fix for missing points. I don't understand\n      //           // why this is necessary and why the number 4 is right.\n      if (plotPoints                                                                 &&\n          P.x() > screen_min_x - tol && P.x() < screen_min_x + m_window_width  + tol &&\n          P.y() > screen_min_y - tol && P.y() < screen_min_y + m_window_height + tol) {\n        drawOneVertex(P.x(), P.y(), local_color, lineWidth, drawVertIndex, paint);\n      }\n    }\n\n    if (pa.size() <= 0) continue;\n\n    if (plotEdges) {\n\n      if (plotFilled && isPolyClosed[pIter]) {\n        // Notice that we fill clockwise polygons, those with\n        // negative area. That because on screen they in fact\n        // appear counter-clockwise, since the screen y axis is\n        // always down, and because the ESRI shapefile format\n        // expects an outer polygon to be clockwise.\n        if (signedArea < 0.0)  paint.setBrush(local_color);\n        else                   paint.setBrush(m_backgroundColor);\n        paint.setPen(Qt::NoPen);\n      } else {\n        paint.setBrush(Qt::NoBrush);\n        paint.setPen(QPen(local_color, lineWidth));\n      }\n\n      if (isPolyZeroDim(pa)) {\n        // Treat the case of polygons which are made up of just one point\n        int l_drawVertIndex = -1;\n        drawOneVertex(pa[0].x(), pa[0].y(), local_color, lineWidth, l_drawVertIndex,\n                      paint);\n      } else if (isPolyClosed[pIter]) {\n\n        if (plotFilled) {\n          paint.drawPolygon(pa);\n        } else {\n          // In some versions of Qt, drawPolygon is buggy when not\n          // called to fill polygons. Don't use it, just draw the\n          // edges one by one.\n          int n = pa.size();\n          for (int k = 0; k < n; k++) {\n            QPolygon pb;\n            int x0, y0; pa.point(k, &x0, &y0);       pb << QPoint(x0, y0);\n            int x1, y1; pa.point((k+1)%n, &x1, &y1); pb << QPoint(x1, y1);\n            paint.drawPolyline(pb);\n          }\n        }\n      } else {\n        paint.drawPolyline(pa); // don't join the last vertex to the first\n      }\n    }\n  }\n\n  // Plot the annotations\n  int numAnno = annotations.size();\n  for (int aIter = 0; aIter < numAnno; aIter++) {\n    const anno & A = annotations[aIter]; // alias\n    // Avoid points close to boundary, as were we clipped artificially\n    if (! (A.x >= x_min && A.x <= x_max && A.y >= y_min && A.y <= y_max)) continue;\n    vw::Vector2 P = world2screen(vw::Vector2(A.x, A.y));\n    paint.setPen(QPen(QColor(\"gold\"), lineWidth));\n    paint.drawText(P.x(), P.y(), (A.label).c_str());\n  } // End plotting annotations\n\n  return;\n}\n\n// TODO(oalexan1): Should the persistent polygons be drawn\n// as part of the drawImage() call? That will be a lot more efficient\n// than being redrawn any time the mouse moves, etc. How about polygons\n// actively being edited?\nvoid MainWidget::plotPolys(QPainter & paint) {\n\n  // Loop through the input images. Plot the polygons. Note how we\n  // add one more fake image at the end to take care of the polygon\n  // we are in the middle of drawing. This extra fake image is a hackish thing\n  for (int j = m_beg_image_id; j < m_end_image_id + 1; j++) { // use + 1, per above\n\n    bool currDrawnPoly = (j == m_end_image_id); // last poly is the currently drawn one\n\n    int image_it = m_polyLayerIndex; // for currently drawn poly\n    if (!currDrawnPoly) {\n      image_it = m_filesOrder[j]; // for the other polys\n\n      // Don't show files the user wants hidden\n      std::string fileName = app_data.images[image_it].name;\n      if (m_chooseFiles && m_chooseFiles->isHidden(fileName))\n        continue;\n    }\n\n    // See if to use a custom color for this polygon, specified by the user from the gui\n    auto color_it = m_perImagePolyColor.find(image_it);\n    if (!currDrawnPoly && color_it != m_perImagePolyColor.end()) {\n      std::string color = color_it->second; \n      app_data.images[image_it].color = color; // save for the future\n      for (auto& poly: app_data.images[image_it].polyVec)\n        poly.set_color(color);\n    }\n\n    // Let polyVec be the polygons for the current image, or,\n    // at the end, the polygon we are in the middle of drawing\n    // TODO(oalexan1): How to avoid a deep copy?\n    std::vector<vw::geometry::dPoly> polyVec;\n    if (!currDrawnPoly) {\n      polyVec = app_data.images[image_it].polyVec; // deep copy\n    } else {\n      if (m_currPolyX.empty() || !m_polyEditMode)\n        continue;\n\n      vw::geometry::dPoly poly;\n      poly.reset();\n      bool isPolyClosed = false; // because we are in the middle of drawing it\n      std::string layer = \"\";\n      poly.appendPolygon(m_currPolyX.size(),\n                          vw::geometry::vecPtr(m_currPolyX),\n                          vw::geometry::vecPtr(m_currPolyY),\n                          isPolyClosed, m_polyColor, layer);\n      polyVec.push_back(poly);\n    }\n\n    // Plot the polygon being drawn now, and pre-existing polygons\n    for (size_t polyIter = 0; polyIter < polyVec.size(); polyIter++) {\n\n      vw::geometry::dPoly poly = polyVec[polyIter]; // make a deep copy\n      \n      if (poly.get_totalNumVerts() == 0)\n        continue;\n\n      // Convert to world units\n      int            numVerts  = poly.get_totalNumVerts();\n      double *             xv  = poly.get_xv();\n      double *             yv  = poly.get_yv();\n      for (int vIter = 0; vIter < numVerts; vIter++) {\n        vw::Vector2 P = app_data.proj2world(vw::Vector2(xv[vIter], yv[vIter]), image_it);\n        xv[vIter] = P.x();\n        yv[vIter] = P.y();\n      }\n\n      // Convert annotations to world units\n      std::vector<vw::geometry::anno> annotations;\n      poly.get_annotations(annotations);\n      for (size_t aIter = 0; aIter < annotations.size(); aIter++) {\n        vw::geometry::anno & A = annotations[aIter]; // alias\n        vw::Vector2 P = app_data.proj2world(vw::Vector2(A.x, A.y), image_it);\n        A.x = P.x();\n        A.y = P.y();\n      }\n      poly.set_annotations(annotations);\n      \n      int drawVertIndex = 0;\n      bool plotPoints = false, plotEdges = true, plotFilled = false;\n      if (m_polyEditMode && m_wid_menu_mgr->m_moveVertex->isChecked()) {\n        drawVertIndex = 1; // to draw a little square at each movable vertex\n        plotPoints = true;\n      } else {\n        drawVertIndex = 0;\n        plotPoints = false;\n      }\n\n      // Note: We plot below the whole set of polygons in 'poly'. We pass in\n      // the first color in the first poly to respect this API. In that function\n      // we will iterate over polygons and plot each with its own color.\n      // At some point need to revisit if plotPoly() actually needs a color\n      // as an argument or it can always be read from 'poly' itself.\n      const std::vector<std::string> & colors = poly.get_colors();\n      MainWidget::plotPoly(plotPoints, plotEdges, m_wid_menu_mgr->m_showPolysFilled->isChecked(),\n                            m_wid_menu_mgr->m_showIndices->isChecked(), m_lineWidth, drawVertIndex,\n                            QColor(colors[0].c_str()), paint, poly);\n\n      // Show a small square at the first vertex of the in-progress polygon\n      // so the user can see where to click to close it\n      if (currDrawnPoly && !m_currPolyX.empty()) {\n        vw::Vector2 S = world2screen(m_startPix);\n        drawOneVertex(S.x(), S.y(), QColor(m_polyColor.c_str()),\n                      m_lineWidth, 1, paint);\n      }\n    }\n  } // end iterating over polygons for all images\n}\n\n// Go to the pixel locations on screen, and draw the polygonal line.\n// This is robust to zooming in the middle of profiling.\n// TODO: This will function badly when zooming.\nvoid MainWidget::plotProfilePolyLine(QPainter & paint,\n                                     std::vector<double> const& profileX,\n                                     std::vector<double> const& profileY) {\n\n  if (profileX.empty()) return;\n\n  paint.setPen(QColor(\"red\"));\n  std::vector<QPoint> profilePixels;\n  for (size_t it = 0; it < profileX.size(); it++) {\n    vw::Vector2 P = world2screen(vw::Vector2(profileX[it], profileY[it]));\n    QPoint Q(P.x(), P.y());\n    paint.drawEllipse(Q, 2, 2); // Draw the point, and make it a little large\n    profilePixels.push_back(Q);\n  }\n  paint.drawPolyline(&profilePixels[0], profilePixels.size());\n}\n\nvoid MainWidget::setPolyColor(std::string const& polyColor) {\n  m_polyColor = polyColor;\n\n  // When the color is set from the top menu rather than right-clicking\n  // on an individual layer in the table on the left, it applies to all polygons\n  for (int image_iter = m_beg_image_id; image_iter < m_end_image_id; image_iter++)\n    m_perImagePolyColor[image_iter] = polyColor;\n\n  refreshPixmap();\n}\n\nstd::string MainWidget::getPolyColor() const {\n  return m_polyColor;\n}\n\nvoid MainWidget::setLineWidth(int lineWidth) {\n  m_lineWidth = lineWidth;\n  update();\n}\n\nint MainWidget::getLineWidth() const {\n  return m_lineWidth;\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/GUI/ProfileWidget.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2024, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  https://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// \\file ProfileWidget.cc\n// \n// Member functions of MainWidget that have to do with profing.\n\n#include <asp/GUI/MainWidget.h>\n#include <asp/GUI/GuiGeom.h>\n\n#include <QtGui>\n#include <QtWidgets>\n\nnamespace asp {\n  \n// We assume the user picked n points in the image.\n// Draw n-1 segments in between them. Plot the obtained profile.\nvoid MainWidget::plotProfile(std::vector<imageData> const& images,\n                              // indices in the image to profile\n                              std::vector<double> const& profileX,\n                              std::vector<double> const& profileY) {\n\n  if (images.empty()) return; // nothing to do\n\n  // Create the profile window\n  if (m_profile.plot == NULL)\n    m_profile.plot = new ProfilePlotter(this);\n\n  int imgInd = m_beg_image_id; // just one image is present\n  double nodata_val = images[imgInd].img().get_nodata_val();\n\n  m_profile.valsX.clear(); m_profile.valsY.clear();\n  int count = 0;\n\n  int num_pts = profileX.size();\n  for (int pt_iter = 0; pt_iter < num_pts; pt_iter++) {\n\n    // Nothing to do if we are at the last point, unless\n    // there is only one point.\n    if (num_pts > 1 && pt_iter == num_pts - 1) continue;\n\n   vw::Vector2 pt(profileX[pt_iter], profileY[pt_iter]);\n   vw::Vector2 begP = app_data.world2image_trans(pt, imgInd);\n\n    vw::Vector2 endP;\n    if (num_pts == 1) {\n      endP = begP; // only one point is present\n    } else {\n      vw::Vector2 pt(profileX[pt_iter+1], profileY[pt_iter+1]);\n      endP = app_data.world2image_trans(pt, imgInd);\n    }\n\n    int begX = begP.x(),   begY = begP.y();\n    int endX = endP.x(),   endY = endP.y();\n    int seg_len = std::abs(begX - endX) + std::abs(begY - endY);\n    if (seg_len == 0) seg_len = 1; // ensure it is never empty\n    for (int p = 0; p <= seg_len; p++) {\n      double t = double(p)/seg_len;\n      int x = round(begX + t*(endX - begX));\n      int y = round(begY + t*(endY - begY));\n      bool is_in = (x >= 0 && x <= images[imgInd].img().cols()-1 &&\n                    y >= 0 && y <= images[imgInd].img().rows()-1);\n      if (!is_in)\n        continue;\n\n      double pixel_val = images[imgInd].img().get_value_as_double(x, y);\n\n      // TODO: Deal with this NAN\n      if (pixel_val == nodata_val)\n        pixel_val = std::numeric_limits<double>::quiet_NaN();\n      m_profile.valsX.push_back(count);\n      m_profile.valsY.push_back(pixel_val);\n      count++;\n    }\n\n  }\n\n  if (num_pts == 1) {\n    // Just one point, really\n    m_profile.valsX.resize(1);\n    m_profile.valsY.resize(1);\n  }\n\n  // Wipe whatever was there before\n  m_profile.plot->detachItems();\n\n  QwtPlotCurve * curve = new QwtPlotCurve(\"1D Profile\");\n  m_profile.plot->setFixedWidth(300);\n  m_profile.plot->setWindowTitle(\"1D Profile\");\n\n  if (!m_profile.valsX.empty()) {\n\n    double min_x = *std::min_element(m_profile.valsX.begin(), m_profile.valsX.end());\n    double max_x = *std::max_element(m_profile.valsX.begin(), m_profile.valsX.end());\n    double min_y = *std::min_element(m_profile.valsY.begin(), m_profile.valsY.end());\n    double max_y = *std::max_element(m_profile.valsY.begin(), m_profile.valsY.end());\n\n    // Ensure the window is always valid\n    double small = 0.1;\n    if (min_x == max_x) {\n      min_x -= small; max_x += small;\n    }\n    if (min_y == max_y) {\n      min_y -= small; max_y += small;\n    }\n\n    // Plot a point as a fat dot\n    if (num_pts == 1) {\n      curve->setStyle(QwtPlotCurve::Dots);\n    }\n\n    curve->setData(new QwtCPointerData<double>(&m_profile.valsX[0], &m_profile.valsY[0], m_profile.valsX.size()));\n    curve->setPen(* new QPen(Qt::red));\n    curve->attach(m_profile.plot);\n\n    double delta = 0.1;  // expand a bit right to see more x and y labels\n    double widx = max_x - min_x;\n    double widy = max_y - min_y;\n    m_profile.plot->setAxisScale(QwtPlot::xBottom, min_x - delta*widx, max_x + delta*widx);\n    m_profile.plot->setAxisScale(QwtPlot::yLeft,   min_y - delta*widy, max_y + delta*widy);\n  }\n\n  // Finally, refresh the plot\n  m_profile.plot->replot();\n  m_profile.plot->show();\n}\n\nvoid MainWidget::setProfileMode(bool profile_mode) {\n  m_profile.mode = profile_mode;\n\n  if (!m_profile.mode) {\n    // Clean up any profiling related info\n    m_profile.x.clear();\n    m_profile.y.clear();\n\n    // Close the window.\n    if (m_profile.plot != NULL) {\n      m_profile.plot->close();\n      m_profile.plot->deleteLater();\n      delete m_profile.plot;\n      m_profile.plot = NULL;\n    }\n\n    // Call back to the main window and tell it to uncheck the profile\n    // mode checkbox.\n    emit uncheckProfileModeCheckbox();\n    return;\n  } else {\n\n    bool refresh = true;\n    setPolyEditMode(false, refresh);\n\n    // Load the data if not loaded already\n    for (size_t it = 0; it < app_data.images.size(); it++)\n      app_data.images[it].load();\n\n    // Show the profile window\n    MainWidget::plotProfile(app_data.images, m_profile.x, m_profile.y);\n  }\n\n  refreshPixmap();\n}\n  \n} // end namespace asp\n"
  },
  {
    "path": "src/asp/GUI/WidgetBase.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  https://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// \\file WidgetBase.cc\n\n#include <asp/GUI/WidgetBase.h>\n\nnamespace vw { namespace cartography {\n  class GeoTransform;\n}}\n\nnamespace asp {\n\nWidgetBase::WidgetBase(int beg_image_id, int end_image_id, int base_image_id,\n                       asp::AppData & data):\n    m_beg_image_id(beg_image_id),\n    m_end_image_id(end_image_id),\n    app_data(data),\n    m_base_image_id(base_image_id), \n    m_world_box(vw::BBox2()), m_border_factor(0.95) {\n}\n\n// Convert a position in the world coordinate system to a pixel\n// position as seen on screen (the screen origin is the\n// visible upper-left corner of the widget).\nvw::Vector2 WidgetBase::world2screen(vw::Vector2 const& p) const {\n\n  double x = m_window_width*((p.x() - m_current_view.min().x())\n                              / m_current_view.width());\n  double y = m_window_height*((p.y() - m_current_view.min().y())\n                              / m_current_view.height());\n\n  // Create an empty border margin, to make it easier to zoom\n  // by allowing the zoom window to slightly exceed the visible image\n  // area (that inability was such a nuisance).\n  x = m_border_factor*(x - m_window_width /2.0) + m_window_width /2.0;\n  y = m_border_factor*(y - m_window_height/2.0) + m_window_height/2.0;\n\n  return vw::Vector2(x, y);\n}\n\n// Convert a pixel on the screen to world coordinates.\n// See app_data.world2image_trans() for the definition.\nvw::Vector2 WidgetBase::screen2world(vw::Vector2 const& p) const {\n\n  // First undo the empty border margin\n  double x = p.x(), y = p.y();\n  x = (x - m_window_width /2.0)/m_border_factor + m_window_width /2.0;\n  y = (y - m_window_height/2.0)/m_border_factor + m_window_height/2.0;\n\n  // Scale to world coordinates\n  x = m_current_view.min().x() + (m_current_view.width () * x / m_window_width);\n  y = m_current_view.min().y() + (m_current_view.height() * y / m_window_height);\n\n  return vw::Vector2(x, y);\n}\n\nvw::BBox2 WidgetBase::screen2world(vw::BBox2 const& R) const {\n  if (R.empty()) return R;\n  vw::Vector2 A = screen2world(R.min());\n  vw::Vector2 B = screen2world(R.max());\n  return vw::BBox2(A, B);\n}\n\nvw::BBox2 WidgetBase::world2screen(vw::BBox2 const& R) const {\n  if (R.empty()) return R;\n  vw::Vector2 A = world2screen(R.min());\n  vw::Vector2 B = world2screen(R.max());\n  return vw::BBox2(A, B);\n}\n\n} // namespace asp\n"
  },
  {
    "path": "src/asp/GUI/WidgetBase.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// \\file WidgetBase.h\n// \n// This has logic that is used in MainWidget.\n// \n#ifndef __STEREO_GUI_WIDGET_BASE_H__\n#define __STEREO_GUI_WIDGET_BASE_H__\n\n#include <QObject> // to avoid errors about boost and Qobject\n\n// ASP\n#include <asp/GUI/GuiUtilities.h>\n#include <asp/GUI/AppData.h>\n\n// Vision Workbench\n#include <vw/Math/BBox.h>\n#include <vw/Math/Vector.h>\n#include <vw/Cartography/GeoReference.h>\n#include <vw/Cartography/GeoTransform.h>\n\n#include <string>\n#include <vector>\n#include <list>\n#include <set>\n\nnamespace asp {\n\nclass WidgetBase {\n\npublic:\n\n  // Constructors/Destructor\n  WidgetBase(int beg_image_id, int end_image_id, int base_image_id, asp::AppData & data);\n  \n  virtual ~WidgetBase(){}\n\n  // The box which contains fully all images in the current widget,\n  // in world coordinates.\n  vw::BBox2 m_world_box;\n\n  // The box in world coordinates which has the current view and\n  // last view.  This is normally smaller than m_world_box.\n  vw::BBox2 m_current_view, m_last_view;\n\n  // Dimensions and stats\n  int m_window_width;  // the width  of the plotting window in screen pixels\n  int m_window_height; // the height of the plotting window in screen pixels\n\n  // Shrink the image to be shown on screen by this factor\n  // (typically 0.90 to 0.95) to create an extra empty margin at a widget's\n  // border, to make it easier to zoom.\n  double m_border_factor;\n\n  int m_beg_image_id;  // The id of the first image among images in this widget\n  int m_end_image_id;  // The id of the image past the last image among images\n\n  // The index of the image on top of which the rest are overlaid.\n  // We will render in this image's pixel or projected domain. This\n  // only becomes important if using georeference, and the images\n  // have different projections.\n  int m_base_image_id;\n\n  // A reference to the shared application data\n  asp::AppData & app_data;\n\n  vw::Vector2 world2screen(vw::Vector2 const&  p) const;\n  vw::Vector2 screen2world(vw::Vector2 const&  p) const;\n  vw::BBox2 world2screen(vw::BBox2 const& R) const;\n  vw::BBox2 screen2world(vw::BBox2 const& R) const;\n}; // End class WidgetBase\n\n\n} // namespace asp\n\n#endif  // __STEREO_GUI_WIDGET_BASE_H__\n"
  },
  {
    "path": "src/asp/GUI/WidgetMenuMgr.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// \\file WidgetMenuMgr.cc\n//\n// Handles right-click context menu creation and management for MainWidget.\n//\n#include <asp/GUI/WidgetMenuMgr.h>\n#include <asp/GUI/MainWidget.h>\n#include <asp/GUI/GuiUtilities.h>\n\nnamespace asp {\n\n// Right-click context menu\nWidgetMenuMgr::WidgetMenuMgr(MainWidget* wid) {\n\n  m_contextMenu = new QMenu(wid);\n\n  // Polygon editing mode, they will be visible only when editing happens\n  m_insertVertex   = m_contextMenu->addAction(\"Insert vertex\");\n  m_deleteVertex   = m_contextMenu->addAction(\"Delete vertex\");\n  m_deleteVertices = m_contextMenu->addAction(\"Delete vertices in selected region\");\n  m_moveVertex     = m_contextMenu->addAction(\"Move vertices\");\n  m_moveVertex->setCheckable(true);\n  m_moveVertex->setChecked(false);\n\n  m_showPolysFilled = m_contextMenu->addAction(\"Show polygons filled\");\n  m_showPolysFilled->setCheckable(true);\n  m_showPolysFilled->setChecked(false);\n\n  m_showIndices = m_contextMenu->addAction(\"Show vertex indices\");\n  m_showIndices->setCheckable(true);\n  m_showIndices->setChecked(false);\n\n  m_mergePolys = m_contextMenu->addAction(\"Merge polygons\");\n\n  // Other options\n  m_addMatchPoint      = m_contextMenu->addAction(\"Add match point\");\n  m_deleteMatchPoint   = m_contextMenu->addAction(\"Delete match point\");\n  m_moveMatchPoint     = m_contextMenu->addAction(\"Move match point\");\n  m_moveMatchPoint->setCheckable(true);\n  m_moveMatchPoint->setChecked(false);\n  m_toggleHillshadeImageRightClick  = m_contextMenu->addAction(\"Toggle hillshaded display\");\n  m_setHillshadeParams = m_contextMenu->addAction(\"View/set hillshade azimuth and elevation\");\n  m_saveVectorLayerAsShapeFile = m_contextMenu->addAction(\"Save vector layer as shape file\");\n  m_saveVectorLayerAsTextFile = m_contextMenu->addAction(\"Save vector layer as text file\");\n\n  m_saveScreenshot     = m_contextMenu->addAction(\"Save screenshot\");\n  m_setThreshold       = m_contextMenu->addAction(\"View/set threshold\");\n  m_allowMultipleSelections_action\n    = m_contextMenu->addAction(\"Allow multiple selected regions\");\n  m_allowMultipleSelections_action->setCheckable(true);\n  m_allowMultipleSelections_action->setChecked(wid->m_allowMultipleSelections);\n\n  m_deleteSelection = m_contextMenu->addAction(\"Delete selected regions around this point\");\n  m_hideImagesNotInRegion\n    = m_contextMenu->addAction(\"Hide images not intersecting selected region\");\n\n  // Connect signals to slots in the wid\n  QObject::connect(m_addMatchPoint, SIGNAL(triggered()),\n                   wid, SLOT(addMatchPoint()));\n  QObject::connect(m_deleteMatchPoint, SIGNAL(triggered()),\n                   wid, SLOT(deleteMatchPoint()));\n  QObject::connect(m_toggleHillshadeImageRightClick, SIGNAL(triggered()),\n                   wid, SLOT(toggleHillshadeImageRightClick()));\n  QObject::connect(m_setHillshadeParams, SIGNAL(triggered()),\n                   wid, SLOT(setHillshadeParams()));\n  QObject::connect(m_setThreshold, SIGNAL(triggered()),\n                   wid, SLOT(setThreshold()));\n  QObject::connect(m_saveScreenshot, SIGNAL(triggered()),\n                   wid, SLOT(saveScreenshot()));\n  QObject::connect(m_allowMultipleSelections_action, SIGNAL(triggered()),\n                   wid, SLOT(allowMultipleSelections()));\n  QObject::connect(m_deleteSelection, SIGNAL(triggered()),\n                   wid, SLOT(deleteSelection()));\n  QObject::connect(m_hideImagesNotInRegion, SIGNAL(triggered()),\n                   wid, SLOT(hideImagesNotInRegion()));\n  QObject::connect(m_saveVectorLayerAsShapeFile, SIGNAL(triggered()),\n                   wid, SLOT(saveVectorLayerAsShapeFile()));\n  QObject::connect(m_saveVectorLayerAsTextFile, SIGNAL(triggered()),\n                   wid, SLOT(saveVectorLayerAsTextFile()));\n  QObject::connect(m_deleteVertex, SIGNAL(triggered()),\n                   wid, SLOT(deleteVertex()));\n  QObject::connect(m_deleteVertices, SIGNAL(triggered()),\n                   wid, SLOT(deleteVertices()));\n  QObject::connect(m_insertVertex, SIGNAL(triggered()),\n                   wid, SLOT(insertVertex()));\n  QObject::connect(m_mergePolys, SIGNAL(triggered()),\n                   wid, SLOT(mergePolys()));\n}\n\nvoid WidgetMenuMgr::setupContextMenu(MainWidget* wid) {\n\n  // If in poly edit mode, turn on these items.\n  m_deleteVertex->setVisible(wid->m_polyEditMode);\n  m_deleteVertices->setVisible(wid->m_polyEditMode);\n  m_insertVertex->setVisible(wid->m_polyEditMode);\n  m_moveVertex->setVisible(wid->m_polyEditMode);\n  m_showIndices->setVisible(wid->m_polyEditMode);\n  m_showPolysFilled->setVisible(wid->m_polyEditMode);\n\n  // Add the saving polygon option even when not editing\n  m_saveVectorLayerAsShapeFile->setVisible(true);\n  m_saveVectorLayerAsTextFile->setVisible(true);\n\n  m_mergePolys->setVisible(wid->m_polyEditMode);\n\n  // Refresh this from the variable, before popping up the menu\n  m_allowMultipleSelections_action->setChecked(wid->m_allowMultipleSelections);\n\n  // Turn on these items if we are NOT in poly edit mode. Also turn some off\n  // in sideBySideWithDialog() mode, as then we draw the interest points\n  // only with refreshPixmap(), which is rare, so user's editing\n  // choices won't be reflected in the GUI.\n  m_addMatchPoint->setVisible(!wid->m_polyEditMode && !sideBySideWithDialog());\n  m_deleteMatchPoint->setVisible(!wid->m_polyEditMode && !sideBySideWithDialog());\n  m_moveMatchPoint->setVisible(!wid->m_polyEditMode && !sideBySideWithDialog());\n  m_toggleHillshadeImageRightClick->setVisible(!wid->m_polyEditMode);\n  m_setHillshadeParams->setVisible(!wid->m_polyEditMode);\n  m_setThreshold->setVisible(!wid->m_polyEditMode);\n  m_allowMultipleSelections_action->setVisible(!wid->m_polyEditMode);\n  m_deleteSelection->setVisible(!sideBySideWithDialog());\n  m_hideImagesNotInRegion->setVisible(!sideBySideWithDialog());\n\n  m_saveScreenshot->setVisible(true); // always visible\n}\n\nQMenu* WidgetMenuMgr::formCustomMenu(MainWidget* wid,\n                               int imageIndex) {\n\n  m_customMenu = new QMenu(wid);\n\n  m_toggleHillshadeFromImageList =\n    m_customMenu->addAction(\"Toggle hillshade display\");\n  QObject::connect(m_toggleHillshadeFromImageList, &QAction::triggered,\n    [wid, imageIndex]() {\n      wid->toggleHillshadeFromImageList(imageIndex);\n    });\n\n  if (!sideBySideWithDialog()) {\n    // Do not offer these options when the images are side-by-side,\n    // as that will just mess up with their order.\n\n    m_bringImageOnTopFromTable =\n      m_customMenu->addAction(\"Bring image on top\");\n    QObject::connect(m_bringImageOnTopFromTable, &QAction::triggered,\n      [wid, imageIndex]() {\n        wid->bringImageOnTopSlot(imageIndex);\n      });\n\n    m_pushImageToBottomFromTable =\n      m_customMenu->addAction(\"Push image to bottom\");\n    QObject::connect(m_pushImageToBottomFromTable, &QAction::triggered,\n      [wid, imageIndex]() {\n        wid->pushImageToBottomSlot(imageIndex);\n      });\n  }\n\n  m_zoomToImageFromTable = m_customMenu->addAction(\"Zoom to image\");\n  QObject::connect(m_zoomToImageFromTable, &QAction::triggered,\n    [wid, imageIndex]() {\n      wid->zoomToImage(imageIndex);\n    });\n\n  // If having polygons, make it possible to change their colors\n  bool hasPoly = false;\n  for (int image_iter = wid->m_beg_image_id;\n       image_iter < wid->m_end_image_id; image_iter++) {\n    if (wid->app_data.images[image_iter].m_isPoly)\n      hasPoly = true;\n  }\n  if (hasPoly) {\n    m_changePolyColor =\n      m_customMenu->addAction(\"Change colors of polygons\");\n    QObject::connect(m_changePolyColor, &QAction::triggered,\n      [wid, imageIndex]() {\n        wid->changePolyColor(imageIndex);\n      });\n  }\n\n  return m_customMenu;\n}\n} // End namespace asp\n"
  },
  {
    "path": "src/asp/GUI/WidgetMenuMgr.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// \\file WidgetMenuMgr.h\n//\n// Handles right-click context menu creation and management for MainWidget.\n//\n#ifndef __STEREO_GUI_WIDGET_MENU_MGR_H__\n#define __STEREO_GUI_WIDGET_MENU_MGR_H__\n\n// Qt\n#include <QMenu>\n#include <QAction>\n#include <QObject>\n\nnamespace asp {\n\nclass MainWidget; // Forward declaration\n\n// Right-click context menu for MainWidget\nstruct WidgetMenuMgr {\n\n  // Constructor to create and connect menu actions\n  WidgetMenuMgr(MainWidget* wid);\n  QMenu* formCustomMenu(MainWidget* wid, int imageIndex);\n  void setupContextMenu(MainWidget* wid);\n\n  // Right-click context menu\n  QMenu  * m_contextMenu;\n  QMenu  * m_customMenu;\n  QAction* m_addMatchPoint;\n  QAction* m_deleteMatchPoint;\n  QAction* m_moveMatchPoint;\n  QAction* m_toggleHillshadeImageRightClick;\n  QAction* m_setThreshold;\n  QAction* m_setHillshadeParams;\n  QAction* m_saveScreenshot;\n  QAction* m_toggleHillshadeFromImageList;\n  QAction* m_zoomToImageFromTable;\n  QAction* m_bringImageOnTopFromTable;\n  QAction* m_pushImageToBottomFromTable;\n  QAction* m_changePolyColor;\n  QAction* m_allowMultipleSelections_action;\n  QAction* m_deleteSelection;\n  QAction* m_hideImagesNotInRegion;\n  QAction* m_saveVectorLayerAsShapeFile;\n  QAction* m_saveVectorLayerAsTextFile;\n  QAction* m_deleteVertex;\n  QAction* m_deleteVertices;\n  QAction* m_insertVertex;\n  QAction* m_moveVertex;\n  QAction* m_showIndices;\n  QAction* m_mergePolys;\n  QAction* m_showPolysFilled;\n\n}; // End struct WidgetMenuMgr\n\n} // End namespace asp\n\n#endif  // __STEREO_GUI_WIDGET_MENU_MGR_H__\n"
  },
  {
    "path": "src/asp/GUI/WindowMenuMgr.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// \\file WindowMenuMgr.cc\n//\n// Handles menu bar creation and management for MainWindow.\n//\n#include <asp/GUI/WindowMenuMgr.h>\n#include <asp/GUI/MainWindow.h>\n#include <asp/Core/StereoSettings.h>\n\n#include <QMenuBar>\n\nnamespace asp {\n\nvoid WindowMenuMgr::init(MainWindow* win) {\n\n  QMenuBar* menu = win->menuBar();\n\n  // Exit or Quit\n  m_exit_action = new QAction(QObject::tr(\"Exit\"), win);\n  m_exit_action->setShortcut(QObject::tr(\"Q\"));\n  m_exit_action->setStatusTip(QObject::tr(\"Exit the application\"));\n  QObject::connect(m_exit_action, SIGNAL(triggered()), win, SLOT(forceQuit()));\n\n  // Save screenshot\n  m_save_screenshot_action = new QAction(QObject::tr(\"Save screenshot\"), win);\n  m_save_screenshot_action->setStatusTip(QObject::tr(\"Save screenshot\"));\n  QObject::connect(m_save_screenshot_action, SIGNAL(triggered()),\n                   win, SLOT(save_screenshot()));\n\n  // Select region\n  m_select_region_action = new QAction(QObject::tr(\"Select region\"), win);\n  m_select_region_action->setStatusTip(QObject::tr(\"Select rectangular region\"));\n  QObject::connect(m_select_region_action, SIGNAL(triggered()),\n                   win, SLOT(select_region()));\n\n  // Change cursor shape (a workaround for Qt not setting the cursor correctly in vnc)\n  m_change_cursor_action = new QAction(QObject::tr(\"Change cursor shape\"), win);\n  m_change_cursor_action->setStatusTip(QObject::tr(\"Change cursor shape\"));\n  QObject::connect(m_change_cursor_action, SIGNAL(triggered()),\n                   win, SLOT(change_cursor()));\n  m_change_cursor_action->setShortcut(QObject::tr(\"C\"));\n\n  // Run parallel_stereo\n  m_run_parallel_stereo_action = new QAction(QObject::tr(\"Run parallel_stereo\"), win);\n  m_run_parallel_stereo_action->setStatusTip(QObject::tr(\"Run parallel_stereo on selected clips\"));\n  QObject::connect(m_run_parallel_stereo_action, SIGNAL(triggered()),\n                   win, SLOT(run_parallel_stereo()));\n  m_run_parallel_stereo_action->setShortcut(QObject::tr(\"R\"));\n\n  // Run stereo\n  m_run_stereo_action = new QAction(QObject::tr(\"Run stereo\"), win);\n  m_run_stereo_action->setStatusTip(QObject::tr(\"Run stereo on selected clips\"));\n  QObject::connect(m_run_stereo_action, SIGNAL(triggered()),\n                   win, SLOT(run_stereo()));\n\n  // Zoom to full view\n  m_sizeToFit_action = new QAction(QObject::tr(\"Zoom to full view\"), win);\n  m_sizeToFit_action->setStatusTip(QObject::tr(\"Change the view to encompass the images\"));\n  QObject::connect(m_sizeToFit_action, SIGNAL(triggered()),\n                   win, SLOT(sizeToFit()));\n  m_sizeToFit_action->setShortcut(QObject::tr(\"F\"));\n\n  // Zoom in and out\n  m_zoomIn_action = new QAction(QObject::tr(\"Zoom in\"), win);\n  m_zoomIn_action->setStatusTip(QObject::tr(\"Zoom in\"));\n  m_zoomIn_action->setShortcuts({QKeySequence(Qt::Key_Equal),\n                                 QKeySequence(Qt::Key_Plus)});\n  QObject::connect(m_zoomIn_action, SIGNAL(triggered()),\n                   win, SLOT(zoomIn()));\n\n  m_zoomOut_action = new QAction(QObject::tr(\"Zoom out\"), win);\n  m_zoomOut_action->setStatusTip(QObject::tr(\"Zoom out\"));\n  m_zoomOut_action->setShortcuts({QKeySequence(Qt::Key_Minus),\n                                  QKeySequence(Qt::Key_Underscore)});\n  QObject::connect(m_zoomOut_action, SIGNAL(triggered()),\n                   win, SLOT(zoomOut()));\n\n  m_viewSingleWindow_action = new QAction(QObject::tr(\"Single window\"), win);\n  m_viewSingleWindow_action->setStatusTip(QObject::tr(\"View images in a single window\"));\n  m_viewSingleWindow_action->setCheckable(true);\n  m_viewSingleWindow_action->setChecked(win->m_view_type == VIEW_IN_SINGLE_WINDOW);\n  m_viewSingleWindow_action->setShortcut(QObject::tr(\"W\"));\n  QObject::connect(m_viewSingleWindow_action, SIGNAL(triggered()),\n                   win, SLOT(viewSingleWindow()));\n\n  m_viewAllSideBySide_action = new QAction(QObject::tr(\"All side-by-side\"), win);\n  m_viewAllSideBySide_action->setStatusTip(QObject::tr(\"View all images side-by-side\"));\n  m_viewAllSideBySide_action->setCheckable(true);\n  m_viewAllSideBySide_action->setChecked(win->m_view_type == VIEW_SIDE_BY_SIDE &&\n                                         !sideBySideWithDialog());\n  m_viewAllSideBySide_action->setShortcut(QObject::tr(\"S\"));\n  QObject::connect(m_viewAllSideBySide_action, SIGNAL(triggered()),\n                   win, SLOT(viewAllSideBySide()));\n\n  m_viewSeveralSideBySide_action = new QAction(QObject::tr(\"Several side-by-side\"), win);\n  m_viewSeveralSideBySide_action->setStatusTip(QObject::tr(\"View several images side-by-side\"));\n  m_viewSeveralSideBySide_action->setCheckable(true);\n  m_viewSeveralSideBySide_action->setChecked(\n    asp::stereo_settings().view_several_side_by_side);\n  QObject::connect(m_viewSeveralSideBySide_action, SIGNAL(triggered()),\n                   win, SLOT(viewSeveralSideBySide()));\n\n  m_viewAsTiles_action = new QAction(QObject::tr(\"As tiles on grid\"), win);\n  m_viewAsTiles_action->setStatusTip(QObject::tr(\"View images as tiles on grid\"));\n  m_viewAsTiles_action->setCheckable(true);\n  m_viewAsTiles_action->setChecked(win->m_view_type == VIEW_AS_TILES_ON_GRID);\n  m_viewAsTiles_action->setShortcut(QObject::tr(\"T\"));\n  QObject::connect(m_viewAsTiles_action, SIGNAL(triggered()),\n                   win, SLOT(viewAsTiles()));\n\n  // View hillshaded images\n  m_viewHillshadedImages_action = new QAction(QObject::tr(\"Hillshaded images\"), win);\n  m_viewHillshadedImages_action->setStatusTip(QObject::tr(\"View hillshaded images\"));\n  m_viewHillshadedImages_action->setCheckable(true);\n  m_viewHillshadedImages_action->setChecked(\n    win->app_data.display_mode == HILLSHADED_VIEW);\n  m_viewHillshadedImages_action->setShortcut(QObject::tr(\"H\"));\n  QObject::connect(m_viewHillshadedImages_action, SIGNAL(triggered()),\n                   win, SLOT(viewHillshadedImages()));\n\n  // View as georeferenced\n  m_viewGeoreferencedImages_action =\n    new QAction(QObject::tr(\"View as georeferenced images\"), win);\n  m_viewGeoreferencedImages_action->setStatusTip(\n    QObject::tr(\"View as georeferenced images\"));\n  m_viewGeoreferencedImages_action->setCheckable(true);\n  m_viewGeoreferencedImages_action->setChecked(win->app_data.use_georef);\n  m_viewGeoreferencedImages_action->setShortcut(QObject::tr(\"G\"));\n  QObject::connect(m_viewGeoreferencedImages_action, SIGNAL(triggered()),\n                   win, SLOT(viewGeoreferencedImages()));\n\n  // View overlaid georeferenced images\n  m_overlayGeoreferencedImages_action =\n    new QAction(QObject::tr(\"Overlay georeferenced images\"), win);\n  m_overlayGeoreferencedImages_action->setStatusTip(\n    QObject::tr(\"Overlay georeferenced images\"));\n  m_overlayGeoreferencedImages_action->setCheckable(true);\n  m_overlayGeoreferencedImages_action->setChecked(\n    win->app_data.use_georef &&\n    (win->m_view_type == VIEW_IN_SINGLE_WINDOW));\n  m_overlayGeoreferencedImages_action->setShortcut(QObject::tr(\"O\"));\n  QObject::connect(m_overlayGeoreferencedImages_action, SIGNAL(triggered()),\n                   win, SLOT(overlayGeoreferencedImages()));\n\n  // Zoom all images to same region\n  m_zoomAllToSameRegion_action =\n    new QAction(QObject::tr(\"Zoom all images to same region\"), win);\n  m_zoomAllToSameRegion_action->setStatusTip(\n    QObject::tr(\"Zoom all images to same region\"));\n  m_zoomAllToSameRegion_action->setCheckable(true);\n  m_zoomAllToSameRegion_action->setChecked(\n    asp::stereo_settings().zoom_all_to_same_region);\n  m_zoomAllToSameRegion_action->setShortcut(QObject::tr(\"Z\"));\n  QObject::connect(m_zoomAllToSameRegion_action, SIGNAL(triggered()),\n                   win, SLOT(setZoomAllToSameRegion()));\n\n  // View next image\n  m_viewNextImage_action = new QAction(QObject::tr(\"View next image\"), win);\n  m_viewNextImage_action->setStatusTip(QObject::tr(\"View next image\"));\n  m_viewNextImage_action->setCheckable(false);\n  m_viewNextImage_action->setShortcut(QObject::tr(\"N\"));\n  QObject::connect(m_viewNextImage_action, SIGNAL(triggered()),\n                   win, SLOT(viewNextImage()));\n\n  // View prev image\n  m_viewPrevImage_action = new QAction(QObject::tr(\"View previous image\"), win);\n  m_viewPrevImage_action->setStatusTip(QObject::tr(\"View previous image\"));\n  m_viewPrevImage_action->setCheckable(false);\n  m_viewPrevImage_action->setShortcut(QObject::tr(\"P\"));\n  QObject::connect(m_viewPrevImage_action, SIGNAL(triggered()),\n                   win, SLOT(viewPrevImage()));\n\n  m_zoomToProjWin_action = new QAction(QObject::tr(\"Zoom to proj win\"), win);\n  m_zoomToProjWin_action->setStatusTip(QObject::tr(\"Zoom to proj win\"));\n  m_zoomToProjWin_action->setCheckable(false);\n  QObject::connect(m_zoomToProjWin_action, SIGNAL(triggered()),\n                   win, SLOT(zoomToProjWin()));\n\n  // IP matches\n  m_viewMatches_action = new QAction(QObject::tr(\"View IP matches\"), win);\n  m_viewMatches_action->setStatusTip(QObject::tr(\"View IP matches\"));\n  m_viewMatches_action->setCheckable(true);\n  m_viewMatches_action->setChecked(asp::stereo_settings().view_matches);\n  QObject::connect(m_viewMatches_action, SIGNAL(triggered()),\n                   win, SLOT(viewMatchesFromMenu()));\n\n  m_viewPairwiseMatches_action =\n    new QAction(QObject::tr(\"View pairwise IP matches\"), win);\n  m_viewPairwiseMatches_action->setStatusTip(QObject::tr(\"View pairwise IP matches\"));\n  m_viewPairwiseMatches_action->setCheckable(true);\n  m_viewPairwiseMatches_action->setChecked(\n    asp::stereo_settings().pairwise_matches);\n  QObject::connect(m_viewPairwiseMatches_action, SIGNAL(triggered()),\n                   win, SLOT(viewPairwiseMatchesSlot()));\n\n  m_viewPairwiseCleanMatches_action =\n    new QAction(QObject::tr(\"View pairwise clean IP matches\"), win);\n  m_viewPairwiseCleanMatches_action->setStatusTip(\n    QObject::tr(\"View pairwise clean IP matches\"));\n  m_viewPairwiseCleanMatches_action->setCheckable(true);\n  m_viewPairwiseCleanMatches_action->setChecked(\n    asp::stereo_settings().pairwise_clean_matches);\n  QObject::connect(m_viewPairwiseCleanMatches_action, SIGNAL(triggered()),\n                   win, SLOT(viewPairwiseCleanMatchesSlot()));\n\n  m_addDelMatches_action = new QAction(QObject::tr(\"Add/delete IP matches\"), win);\n  m_addDelMatches_action->setStatusTip(QObject::tr(\"Add/delete interest point matches\"));\n  QObject::connect(m_addDelMatches_action, SIGNAL(triggered()),\n                   win, SLOT(addDelMatches()));\n\n  m_saveMatches_action = new QAction(QObject::tr(\"Save IP matches\"), win);\n  m_saveMatches_action->setStatusTip(QObject::tr(\"Save interest point matches\"));\n  QObject::connect(m_saveMatches_action, SIGNAL(triggered()),\n                   win, SLOT(saveMatches()));\n\n  m_writeGcp_action =\n    new QAction(QObject::tr(\"Save GCP and IP matches\"), win);\n  m_writeGcp_action->setStatusTip(\n    QObject::tr(\"Save interest point matches as GCP for bundle_adjust\"));\n  QObject::connect(m_writeGcp_action, SIGNAL(triggered()),\n                   win, SLOT(writeGroundControlPoints()));\n\n  // Threshold calculation by clicking on pixels and setting the threshold\n  // as the largest determined pixel value\n  m_thresholdCalc_action = new QAction(QObject::tr(\"Threshold detection\"), win);\n  m_thresholdCalc_action->setStatusTip(QObject::tr(\"Threshold detection\"));\n  m_thresholdCalc_action->setCheckable(true);\n  QObject::connect(m_thresholdCalc_action, SIGNAL(triggered()),\n                   win, SLOT(thresholdCalc()));\n\n  // Thresholded image visualization\n  m_viewThreshImages_action =\n    new QAction(QObject::tr(\"View thresholded images\"), win);\n  m_viewThreshImages_action->setStatusTip(QObject::tr(\"View thresholded images\"));\n  m_viewThreshImages_action->setCheckable(true);\n  m_viewThreshImages_action->setChecked(\n    win->app_data.display_mode == THRESHOLDED_VIEW);\n  QObject::connect(m_viewThreshImages_action, SIGNAL(triggered()),\n                   win, SLOT(viewThreshImages()));\n\n  // View/set image threshold\n  m_thresholdGetSet_action = new QAction(QObject::tr(\"View/set thresholds\"), win);\n  m_thresholdGetSet_action->setStatusTip(QObject::tr(\"View/set thresholds\"));\n  QObject::connect(m_thresholdGetSet_action, SIGNAL(triggered()),\n                   win, SLOT(thresholdGetSet()));\n\n  // 1D profile mode\n  m_profileMode_action = new QAction(QObject::tr(\"1D profile mode\"), win);\n  m_profileMode_action->setStatusTip(QObject::tr(\"Profile mode\"));\n  m_profileMode_action->setCheckable(true);\n  m_profileMode_action->setChecked(false);\n  QObject::connect(m_profileMode_action, SIGNAL(triggered()),\n                   win, SLOT(profileMode()));\n\n  // Polygon edit mode\n  m_polyEditMode_action = new QAction(QObject::tr(\"Polygon edit mode\"), win);\n  m_polyEditMode_action->setStatusTip(QObject::tr(\"Polygon edit mode\"));\n  m_polyEditMode_action->setCheckable(true);\n  m_polyEditMode_action->setChecked(false);\n  QObject::connect(m_polyEditMode_action, SIGNAL(triggered()),\n                   win, SLOT(polyEditMode()));\n\n  // Set line width\n  m_setLineWidth_action = new QAction(QObject::tr(\"Set line width\"), win);\n  m_setLineWidth_action->setStatusTip(QObject::tr(\"Set line width\"));\n  QObject::connect(m_setLineWidth_action, SIGNAL(triggered()),\n                   win, SLOT(setLineWidth()));\n\n  // Set color of polygons\n  m_setPolyColor_action = new QAction(QObject::tr(\"Set color of polygons\"), win);\n  m_setPolyColor_action->setStatusTip(QObject::tr(\"Set color of polygons\"));\n  QObject::connect(m_setPolyColor_action, SIGNAL(triggered()),\n                   win, SLOT(setPolyColor()));\n\n  // Contour image\n  m_contourImages_action =\n    new QAction(QObject::tr(\"Find contour at threshold\"), win);\n  m_contourImages_action->setStatusTip(QObject::tr(\"Find contour at threshold\"));\n  QObject::connect(m_contourImages_action, SIGNAL(triggered()),\n                   win, SLOT(contourImages()));\n\n  // Save vector layer as shape file\n  m_saveVectorLayerAsShapeFile_action =\n    new QAction(QObject::tr(\"Save vector layer as shapefile\"), win);\n  m_saveVectorLayerAsShapeFile_action->setStatusTip(\n    QObject::tr(\"Save vector layer as shapefile\"));\n  QObject::connect(m_saveVectorLayerAsShapeFile_action, SIGNAL(triggered()),\n                   win, SLOT(saveVectorLayerAsShapeFile()));\n\n  // Save vector layer as text file\n  m_saveVectorLayerAsTextFile_action =\n    new QAction(QObject::tr(\"Save vector layer as text file\"), win);\n  m_saveVectorLayerAsTextFile_action->setStatusTip(\n    QObject::tr(\"Save vector layer as text file\"));\n  QObject::connect(m_saveVectorLayerAsTextFile_action, SIGNAL(triggered()),\n                   win, SLOT(saveVectorLayerAsTextFile()));\n\n  // The About box\n  m_about_action = new QAction(QObject::tr(\"About stereo_gui\"), win);\n  m_about_action->setStatusTip(QObject::tr(\"Show the stereo_gui about box\"));\n  QObject::connect(m_about_action, SIGNAL(triggered()),\n                   win, SLOT(about()));\n\n  // File menu\n  m_file_menu = menu->addMenu(QObject::tr(\"&File\"));\n  m_file_menu->addAction(m_save_screenshot_action);\n  m_file_menu->addAction(m_select_region_action);\n  m_file_menu->addAction(m_change_cursor_action);\n  m_file_menu->addAction(m_exit_action);\n\n  // Run menu\n  m_file_menu = menu->addMenu(QObject::tr(\"&Run\"));\n  m_file_menu->addAction(m_run_parallel_stereo_action);\n  m_file_menu->addAction(m_run_stereo_action);\n\n  // View menu\n  m_view_menu = menu->addMenu(QObject::tr(\"&View\"));\n  m_view_menu->addAction(m_sizeToFit_action);\n  m_view_menu->addAction(m_zoomIn_action);\n  m_view_menu->addAction(m_zoomOut_action);\n  m_view_menu->addAction(m_viewSingleWindow_action);\n  m_view_menu->addAction(m_viewAllSideBySide_action);\n  m_view_menu->addAction(m_viewSeveralSideBySide_action);\n  m_view_menu->addAction(m_viewAsTiles_action);\n  m_view_menu->addAction(m_viewHillshadedImages_action);\n  m_view_menu->addAction(m_viewGeoreferencedImages_action);\n  m_view_menu->addAction(m_overlayGeoreferencedImages_action);\n  m_view_menu->addAction(m_zoomAllToSameRegion_action);\n  m_view_menu->addAction(m_viewNextImage_action);\n  m_view_menu->addAction(m_viewPrevImage_action);\n  m_view_menu->addAction(m_zoomToProjWin_action);\n\n  // Matches menu\n  m_matches_menu = menu->addMenu(QObject::tr(\"&IP matches\"));\n  m_matches_menu->addAction(m_viewMatches_action);\n  m_matches_menu->addAction(m_viewPairwiseMatches_action);\n  m_matches_menu->addAction(m_viewPairwiseCleanMatches_action);\n  m_matches_menu->addAction(m_addDelMatches_action);\n  m_matches_menu->addAction(m_saveMatches_action);\n  m_matches_menu->addAction(m_writeGcp_action);\n\n  // Threshold menu\n  m_threshold_menu = menu->addMenu(QObject::tr(\"&Threshold\"));\n  m_threshold_menu->addAction(m_thresholdCalc_action);\n  m_threshold_menu->addAction(m_viewThreshImages_action);\n  m_threshold_menu->addAction(m_thresholdGetSet_action);\n\n  // Profile menu\n  m_profile_menu = menu->addMenu(QObject::tr(\"Profile\"));\n  m_profile_menu->addAction(m_profileMode_action);\n\n  // Vector layer menu\n  m_vector_layer_menu = menu->addMenu(QObject::tr(\"Vector layer\"));\n  m_vector_layer_menu->addAction(m_polyEditMode_action);\n  m_vector_layer_menu->addAction(m_setLineWidth_action);\n  m_vector_layer_menu->addAction(m_setPolyColor_action);\n  m_vector_layer_menu->addAction(m_contourImages_action);\n  m_vector_layer_menu->addAction(m_saveVectorLayerAsShapeFile_action);\n  m_vector_layer_menu->addAction(m_saveVectorLayerAsTextFile_action);\n\n  // Help menu\n  m_help_menu = menu->addMenu(QObject::tr(\"&Help\"));\n  m_help_menu->addAction(m_about_action);\n}\n\n} // End namespace asp\n"
  },
  {
    "path": "src/asp/GUI/WindowMenuMgr.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// \\file WindowMenuMgr.h\n//\n// Handles menu bar creation and management for MainWindow.\n//\n#ifndef __STEREO_GUI_WINDOW_MENU_MGR_H__\n#define __STEREO_GUI_WINDOW_MENU_MGR_H__\n\n// Qt\n#include <QMenu>\n#include <QAction>\n\nnamespace asp {\n\nclass MainWindow; // Forward declaration\n\n// Menu bar for MainWindow\nstruct WindowMenuMgr {\n\n  WindowMenuMgr() = default;\n\n  // Build the menu bar and connect signals to MainWindow slots\n  void init(MainWindow* win);\n\n  // Menus\n  QMenu *m_file_menu;\n  QMenu *m_view_menu;\n  QMenu *m_matches_menu;\n  QMenu *m_threshold_menu;\n  QMenu *m_profile_menu;\n  QMenu *m_vector_layer_menu;\n  QMenu *m_help_menu;\n\n  // Actions\n  QAction *m_about_action;\n  QAction *m_thresholdCalc_action;\n  QAction *m_thresholdGetSet_action;\n  QAction *m_setLineWidth_action;\n  QAction *m_setPolyColor_action;\n  QAction *m_sizeToFit_action;\n  QAction *m_zoomIn_action;\n  QAction *m_zoomOut_action;\n  QAction *m_viewSingleWindow_action;\n  QAction *m_viewAllSideBySide_action;\n  QAction *m_viewSeveralSideBySide_action;\n  QAction *m_viewAsTiles_action;\n  QAction *m_zoomToProjWin_action;\n  QAction *m_viewHillshadedImages_action;\n  QAction *m_viewGeoreferencedImages_action;\n  QAction *m_overlayGeoreferencedImages_action;\n  QAction *m_viewThreshImages_action;\n  QAction *m_contourImages_action;\n  QAction *m_saveVectorLayerAsShapeFile_action;\n  QAction *m_saveVectorLayerAsTextFile_action;\n  QAction *m_zoomAllToSameRegion_action;\n  QAction *m_viewNextImage_action;\n  QAction *m_viewPrevImage_action;\n  QAction *m_viewMatches_action;\n  QAction *m_viewPairwiseMatches_action;\n  QAction *m_viewPairwiseCleanMatches_action;\n  QAction *m_addDelMatches_action;\n  QAction *m_saveMatches_action;\n  QAction *m_writeGcp_action;\n  QAction *m_save_screenshot_action;\n  QAction *m_select_region_action;\n  QAction *m_change_cursor_action;\n  QAction *m_run_stereo_action;\n  QAction *m_run_parallel_stereo_action;\n  QAction *m_exit_action;\n  QAction *m_profileMode_action;\n  QAction *m_polyEditMode_action;\n\n}; // End struct WindowMenuMgr\n\n} // End namespace asp\n\n#endif  // __STEREO_GUI_WINDOW_MENU_MGR_H__\n"
  },
  {
    "path": "src/asp/GenerateConfig.cmake",
    "content": "# This file generates asp_config.h and asp_version_config.h from\n# asp_config.h.in and asp_version_config.h.in.\n\ninclude(CheckIncludeFiles)\ninclude(CheckSymbolExists)\ninclude(CheckFunctionExists)\ninclude(CheckTypeSize)\ninclude(CheckCXXSymbolExists)\ninclude(CheckCXXSourceCompiles)\n\n\n# TODO: How much of this do we need?\n\n###########################################################################\n\n# Check if certain include files are present\n# - Define to 1 if present, blank otherwise.\n#CHECK_INCLUDE_FILES(ext/stdio_filebuf.h VW_HAVE_EXT_STDIO_FILEBUF_H) # TODO\n#CHECK_INCLUDE_FILES(fenv.h              VW_HAVE_FENV_H)\nCHECK_INCLUDE_FILES(inttypes.h          ASP_HAVE_INTTYPES_H)\n#CHECK_INCLUDE_FILES(memory.h            VW_HAVE_MEMORY_H)\nCHECK_INCLUDE_FILES(pwd.h               ASP_HAVE_PWD_H)\n#CHECK_INCLUDE_FILES(stdint.h            VW_HAVE_STDINT_H)\n#CHECK_INCLUDE_FILES(stdlib.h            VW_HAVE_STDLIB_H)\n#CHECK_INCLUDE_FILES(strings.h           VW_HAVE_STRINGS_H)\n#CHECK_INCLUDE_FILES(string.h            VW_HAVE_STRING_H)\n#CHECK_INCLUDE_FILES(sys/stat.h          VW_HAVE_SYS_STAT_H)\n#CHECK_INCLUDE_FILES(sys/types.h         VW_HAVE_SYS_TYPES_H)\nCHECK_INCLUDE_FILES(dlfcn.h             ASP_HAVE_DLFCN_H)\n#CHECK_INCLUDE_FILES(unistd.h            VW_HAVE_UNISTD_H)\n\n# Ignore, only used by plate.\n# Define to 1 if you have the ANSI C header files. \n#define VW_STDC_HEADERS @STDC_HEADERS@\n\n\n###########################################################################\n# Check if certain compiler features are available\n\nset(emptyIncludeList )\n\nCHECK_CXX_SOURCE_COMPILES(\"void testFunc() __attribute__((deprecated));         void testFunc(){}   int main(){return 0;}\" ASP_COMPILER_HAS_ATTRIBUTE_DEPRECATED)\nCHECK_CXX_SOURCE_COMPILES(\"void testFunc() __attribute__((noreturn));           void testFunc(){}   int main(){return 0;}\" ASP_COMPILER_HAS_ATTRIBUTE_NORETURN)\n#CHECK_CXX_SOURCE_COMPILES(\"void testFunc() __attribute__((warn_unused_result)); void testFunc(){}   int main(){return 0;}\" VW_COMPILER_HAS_ATTRIBUTE_WARN_UNUSED_RESULT)\n\n\n# Check for some supported functions (could probably streamline ssize_t check)\n#check_cxx_symbol_exists(exp2            cmath                  VW_HAVE_EXP2)\n#check_cxx_symbol_exists(fabsl           cmath                  VW_HAVE_FABSL)\n#check_cxx_symbol_exists(feenableexcept  \"fenv.h\"               VW_HAVE_FEENABLEEXCEPT)\ncheck_cxx_symbol_exists(getpid          \"unistd.h;sys/types.h\" ASP_HAVE_GETPID)\ncheck_cxx_symbol_exists(getpwuid        \"pwd.h;sys/types.h\"    ASP_HAVE_GETPWUID)\n#check_cxx_symbol_exists(llabs           \"stdlib.h\"             VW_HAVE_LLABS)\n#check_cxx_symbol_exists(log2            cmath                  VW_HAVE_LOG2)\n#check_cxx_symbol_exists(mkstemps        \"stdlib.h\"             VW_HAVE_MKSTEMPS)\n#check_cxx_symbol_exists(tgamma          cmath                  VW_HAVE_TGAMMA)\n#CHECK_CXX_SOURCE_COMPILES(\"\n#                          #include <sys/types.h>\n#                          int main(){ssize_t a=2; return a;}\" VW_HAVE_SSIZET)\n\n\n###########################################################################\n# Determine which libraries we can build\n\n# If we made it to here we can build these modules\nset(ASP_HAVE_PKG_CORE 1)\nset(ASP_HAVE_PKG_CAMERA 1)\nset(ASP_HAVE_PKG_SESSIONS 1)\nset(ASP_HAVE_PKG_GUI 1)\nset(ASP_HAVE_PKG_TOOLS 1)\n\n#######################################################################\n# Finished setting up variables, now call the function to paste them into a file\n\n# Each value like \"@VAR@ is replaced by the CMake variable of the same name\n# The generated file modification time is not updated unless its content actually changed,\n# which prevents needless compilation.\nmessage(\"Generating config file: ${CMAKE_BINARY_DIR}/src/asp/asp_config.h\")\nconfigure_file(${CMAKE_SOURCE_DIR}/src/asp/asp_config.h.in ${CMAKE_BINARY_DIR}/src/asp/asp_config.h)\n\n# This file's data changes often so keep it separate to avoid recompilation.\nmessage(\"Generating config file: ${CMAKE_BINARY_DIR}/src/asp/asp_date_config.h\")\nconfigure_file(${CMAKE_SOURCE_DIR}/src/asp/asp_date_config.h.in ${CMAKE_BINARY_DIR}/src/asp/asp_date_config.h)\n"
  },
  {
    "path": "src/asp/Gotcha/ALSC.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Gotcha/ALSC.h>\n\nusing namespace std;\nusing namespace cv;\n\nnamespace gotcha {\n\nALSC::ALSC() {}\n\nALSC::ALSC(Mat imgL, Mat imgR, CALSCParam paramALSC){\n    m_imgL = imgL;  // soft data copy\n    m_imgR = imgR;\n\n    m_paramALSC = paramALSC; // hard copy\n\n    nMaxIter = m_paramALSC.m_nMaxIter;\n    nPatchRadius = m_paramALSC.m_nPatch;\n    fDisplacementThr = m_paramALSC.m_fDriftThr;\n    fAffineThr = m_paramALSC.m_fAffThr;\n    fEigenThr = m_paramALSC.m_fEigThr;\n    bNeedW = m_paramALSC.m_bWeighting;\n\n    nParam = 0;\n    if (m_paramALSC.m_bIntOffset) nParam = 7;\n    else nParam = 6;\n\n    nRowPatch = 2 * nPatchRadius + 1;\n    nColPatch = 2 * nPatchRadius + 1;\n\n    matPatchL = Eigen::MatrixXf(nRowPatch,nColPatch);\n    matPatchR = Eigen::MatrixXf(nRowPatch,nColPatch);\n    matC = Eigen::Matrix2f();\n\n    // prepare buffers for a normal equation, Ax = B\n    nSystemMatrixRows = nRowPatch*nColPatch; //4 * nRadius * nRadius + 1 + 4 * nRadius;\n    emA = Eigen::MatrixXf(nSystemMatrixRows,nParam);\n    emB = Eigen::VectorXf(nSystemMatrixRows);\n\n    pfGx.resize(nRowPatch);\n    for (int i = 0; i < nRowPatch; i++) {\n        pfGx[i].resize(nColPatch);\n    }\n\n    pfGy.resize(nRowPatch);\n    for (int i = 0; i < nRowPatch; i++) {\n        pfGy[i].resize(nColPatch);\n    }\n\n}\n\nbool ALSC::isIntersecting(Rect rectA, Rect rectB){\n    bool bRes = false;\n\n    Rect rectInter;\n    rectInter = rectA & rectB;\n    if (rectInter.area() > 0) bRes = true;\n    else bRes = false;\n\n    return bRes;\n}\n\nbool ALSC::doMatching(Point2f ptStartL, Point2f ptStartR, CTiePt& tp, const float* pfAffStart){\n    /////////////////////////////////\n    // set ALSC processing parameters\n    /////////////////////////////////\n\n    //QElapsedTimer timer;\n    //timer.restart();\n\n    // define the size of the input images\n    Rect_<float> rectL = Rect(0, 0, m_imgL.cols, m_imgL.rows);\n    Rect_<float> rectR = Rect(0, 0, m_imgR.cols, m_imgR.rows); // But I presume they (i.e., imgage L and R) are the same size\n\n    // define the size of an initial patch, i.e., (2*nRadius+1) by (2*nRadius+1)\n    Rect_<float> rectPatchL(ptStartL.x - nPatchRadius, ptStartL.y - nPatchRadius, nColPatch, nRowPatch);\n    Rect_<float> rectPatchR(ptStartR.x - nPatchRadius, ptStartR.y - nPatchRadius, nColPatch, nRowPatch);\n\n    // checking the validity of the size of an initial patch\n    if (!rectL.contains(ptStartL) || !rectR.contains(ptStartR) ||\n        !isIntersecting(rectL, rectPatchL) || !isIntersecting(rectR, rectPatchR))\n        return false; // don't stop processing as thre might be more tiepoints in the queue\n\n    // set an initial affine transform\n    float pfAffine[4] = {0, 0, 0, 0}; // these are actually parameters for dA not A\n\n    distortPatch(m_imgL, ptStartL, (float*) pfAffine, matPatchL); // simple image cropping in this case\n\n    if (pfAffStart != NULL){\n        pfAffine[0] = pfAffStart[0];\n        pfAffine[1] = pfAffStart[1];\n        pfAffine[2] = pfAffStart[2];\n        pfAffine[3] = pfAffStart[3];\n        ptStartR.x += pfAffStart[4];\n        ptStartR.y += pfAffStart[5];\n    }\n\n    distortPatch(m_imgR, ptStartR, (float*) pfAffine, matPatchR);\n\n    Point2f ptOffset(0.f, 0.f);\n\n    ///////////////////////////////////////////////////////////////////\n    // initilise temporary variables for ALSC\n    ///////////////////////////////////////////////////////////////////\n    // initilise updated right boundary\n    Point2f pptUpdatedBoundary[4];\n    pptUpdatedBoundary[0] = Point2f(rectPatchR.x, rectPatchR.y);\n    pptUpdatedBoundary[1] = Point2f(rectPatchR.x, rectPatchR.y+rectPatchR.height);\n    pptUpdatedBoundary[2] = Point2f(rectPatchR.x+rectPatchR.width, rectPatchR.y+rectPatchR.height);\n    pptUpdatedBoundary[3] = Point2f(rectPatchR.x+rectPatchR.width, rectPatchR.y);\n    Point2f ptUpdatedR(ptStartR);\n\n    bool bNeed2Stop = false;\n    double dEigenVal = 1E20; //Double.MAX_VALUE;// 0.d;\n\n    float fIntOffOld = 0.f;  //intensity offset only used when m_paramALSC.m_bIntOffset\n    float fIntOffNew = 0.f;\n\n    Point2f ptBestR(0,0);\n    double dBestEig = 1E20;\n    float pfAffBest[4]={0,0,0,0};\n\n    ///////////////////////////////////////////////////////////////////\n    // starting ALSC operation for a single tiepoint\n    ///////////////////////////////////////////////////////////////////\n\n    for (int j = 0; j < nMaxIter; j++) {\n        getGradientX(matPatchR);\n        getGradientY(matPatchR);\n\n        // make a system matrix A for LMS\n        int count = 0;\n        for (int y = 0; y < nRowPatch; y++) {\n\n            int yOffset = y - nPatchRadius;\n\n            for (int x = 0; x < nColPatch; x++) {\n\n                int xOffset = x - nPatchRadius;\n\n                float fVal = pfGx[y][x];\n                emA(count,0) = fVal;\n                emA(count,1) = fVal * xOffset;\n                emA(count,2) = fVal * yOffset;\n\n                fVal = pfGy[y][x];\n                emA(count,3) = fVal;\n                emA(count,4) = fVal * xOffset;\n                emA(count,5) = fVal * yOffset;\n\n                if (nParam == 7) {\n                    emA(count,6)  = 1;\n                }\n\n                emB(count) = matPatchL(y, x) - matPatchR(y, x);\n                count++;\n            }\n        }\n\n        // get LMS solution\n        Eigen::VectorXf emS(nParam);\n        Eigen::MatrixXf emAS(nParam,nParam);\n\n        /* Don't explicitly calculate the inverse!  Use Cholesky decomposition instead. */\n        Eigen::MatrixXf emAT = emA.transpose();\n        emAS = (emAT*emA);\n        emS = emAS.llt().solve(emAT*emB);\n\n        if (m_paramALSC.m_bIntOffset)\n            fIntOffNew = emS(6);\n\n        // error computation\n        Eigen::VectorXf emErrors(nSystemMatrixRows);\n        emErrors = (emA * emS) - emB;\n\n        // Compute the standard deviation of residual errors\n        double dTotElelement = nSystemMatrixRows; //nRowPatch *nColPatch; //2 * nRadius + 1; //dTotElelement *= dTotElelement;\n\n        double dErrorSum = emErrors.squaredNorm();\n        double dSTDResidual = dErrorSum / (dTotElelement - nParam);\n\n        // rms of residual error\n        double dResidual = 0.f;\n        dResidual = sqrt(dErrorSum / (double) nSystemMatrixRows);\n\n        // maximum eigenvalue of shift covariance matrix\n        float a = emAS(0, 0);\n        float b = emAS(3, 0);\n        float d = emAS(3, 3);\n\n        /*\n        float pdC[2][2] = {{a, b}, {b, d}};\n        Mat matD(2, 2, CV_32FC1, pdC);\n        SVD svdb(matD.inv());\n        */\n\n        matC(0,0) = d;\n        matC(0,1) = -b;\n        matC(1,0) = -b;\n        matC(1,1) = a;\n\n        matC *= (1.0/(a*d-b*b));\n\n        Eigen::JacobiSVD<Eigen::Matrix2f> svd(matC);\n        //cout << svd.singularValues()(0) << \" \" << svdb.w.at<float>(0) << endl;\n        //assert(svd.singularValues()(0) == svdb.w.at<float>(0));\n\n        dEigenVal = svd.singularValues()(0);\n        //dEigenVal = svdb.w.at<float>(0,0); // maximum eigenvalues\n        dEigenVal *= 10000.0f * dSTDResidual; // scaling\n\n        //////////////////////////////////////////////////////////////\n        // check the validity of solution\n        //////////////////////////////////////////////////////////////\n        float x = emS(0);\n        float y = emS(3);\n        float dist = sqrt(x * x + y * y);\n\n        if (dist > fDisplacementThr)\n            bNeed2Stop = true;\n        if (std::abs(emS(1)) > fAffineThr || std::isnan(emS(1)))\n            bNeed2Stop = true;\n        if (std::abs(emS(2)) > fAffineThr || std::isnan(emS(2)))\n            bNeed2Stop = true;\n        if (std::abs(emS(4)) > fAffineThr || std::isnan(emS(4)))\n            bNeed2Stop = true;\n        if (std::abs(emS(5)) > fAffineThr || std::isnan(emS(5)))\n            bNeed2Stop = true;\n        if (bNeed2Stop){\n            break;\n        }\n\n        //////////////////////////////////////////////////////////////\n        // update parameters\n        //////////////////////////////////////////////////////////////\n        pfAffine[0] = emS(1);\n        pfAffine[1] = emS(2);\n        pfAffine[2] = emS(4);\n        pfAffine[3] = emS(5);\n\n        ptOffset.x = x;\n        ptOffset.y = y;\n\n        ptUpdatedR.x += ptOffset.x;\n        ptUpdatedR.y += ptOffset.y;\n\n        if (dEigenVal < fEigenThr){\n            if (dBestEig > dEigenVal){\n                dBestEig = dEigenVal;\n                ptBestR = ptUpdatedR;\n                for (int m = 0; m < 4; m++)\n                    pfAffBest[m] = pfAffine[m];\n            }\n        }\n\n        // get distorted ROI and patch\n        distortPatch(m_imgR, ptUpdatedR, (float*)pfAffine, matPatchR, (Point2f*)pptUpdatedBoundary);\n\n        fIntOffOld = fIntOffNew;\n\n    } // the end of single iteration of a ALSC process\n\n    ///////////////////////////////////////////////////////////////////\n    // the end of single ALSC operation on a tiepoint\n    ///////////////////////////////////////////////////////////////////\n    if (dBestEig > fEigenThr && !bNeed2Stop) bNeed2Stop = true;\n    if (std::isnan(dEigenVal)) bNeed2Stop = true;\n\n    // collect results\n    if (!bNeed2Stop){\n        // CRefinedTP tp;\n        tp.m_ptL = ptStartL;\n        tp.m_ptR = ptBestR; //ptUpdatedR;\n//        tp.m_fSimVal = dEigenVal/m_paramALSC.m_fEigThr; // normlise score, the smaller is the better\n        tp.m_fSimVal = dBestEig; //dEigenVal;\n        for (int i = 0; i < 4; i++)\n            tp.m_pfAffine[i] = pfAffBest[i]; //pfAffine[i];\n        tp.m_ptOffset = ptBestR - ptStartR;  //ptUpdatedR - ptStartR;\n        if (pfAffStart != NULL){\n            tp.m_ptOffset.x += pfAffStart[4];\n            tp.m_ptOffset.y += pfAffStart[5];\n        }\n        //m_pvecRefTP.push_back(tp);\n    }\n\n    return (!bNeed2Stop);\n}\n\nvoid ALSC::getGradientX(Eigen::Ref<Eigen::MatrixXf> matSrc) {\n\n    int nW = matSrc.cols();\n    int nH = matSrc.rows();\n\n    for (int y = 1; y < nH - 1; y++) {\n        for (int x = 1; x < nW - 1; x++) {\n            pfGx.at(y).at(x) = matSrc(y, x+1) - matSrc(y, x);\n        }\n    }\n\n    return;\n}\n\nvoid ALSC::getGradientY(Eigen::Ref<Eigen::MatrixXf> matSrc) {\n\n    int nW = matSrc.cols();\n    int nH = matSrc.rows();\n\n    for (int y = 1; y < nH - 1; y++) {\n        for (int x = 1; x < nW - 1; x++) {\n            pfGy.at(y).at(x) = matSrc(y+1, x) - matSrc(y, x);\n        }\n    }\n\n    return;\n}\n\nvoid ALSC::affineTransform(double x, double y, const Point2f ptCentre, const float *pfAff, double *dNewX, double *dNewY){\n    double dOffsetX, dOffsetY;\n\n    dOffsetX = x * pfAff[0] + y * pfAff[1];\n    dOffsetY = x * pfAff[2] + y * pfAff[3];\n\n    *dNewX = ptCentre.x + x + dOffsetX;\n    *dNewY = ptCentre.y + y + dOffsetY;\n\n    return;\n}\n\nvoid ALSC::distortPatch(const Mat& matImg, const Point2f ptCentre, const float* pfAff, Eigen::Ref<Eigen::MatrixXf> matImgPatch, Point2f* pptUpdated) {\n\n    double dNewX = 0, dNewY = 0;\n\n    int nW = matImgPatch.cols();\n    int nH = matImgPatch.rows();\n    int i = 0, j = 0;\n\n    int initX = -nW / 2;\n    int initY = -nH / 2;\n\n    if(pptUpdated != NULL){\n        pptUpdated[0] = Point2f(0,0);\n        pptUpdated[1] = Point2f(0,0);\n        pptUpdated[2] = Point2f(0,0);\n        pptUpdated[3] = Point2f(0,0);\n    }\n\n    /* Case when we're just cropping an image, don't waste time doing interpolation */\n    if(pfAff[0] == 0 && pfAff[1] == 0 && pfAff[2] == 0 && pfAff[3] == 0){\n        for (j = 0; j < nH; j++) {\n                for (i = 0; i < nW; i++) {\n                    dNewX = ptCentre.x + initX + i;\n                    dNewY = ptCentre.y + initY + j;\n\n                    if(dNewX < 0 || dNewY < 0 || dNewX > matImg.cols || dNewY > matImg.rows)\n                        matImgPatch(j,i) = 0.0;\n                    else{\n                        matImgPatch(j,i) = matImg.at<unsigned char>(dNewY, dNewX);\n                    }\n                }\n        }\n\n        if(pptUpdated != NULL){\n            pptUpdated[0] = Point2f(ptCentre.x + initX, ptCentre.y + initY);\n            pptUpdated[1] = Point2f(ptCentre.x + initX, ptCentre.y + initY + nH-1);\n            pptUpdated[2] = Point2f(ptCentre.x + initX + nW-1, 0);\n            pptUpdated[3] = Point2f(ptCentre.x + initX + nW-1, ptCentre.y + initY + nH-1);\n        }\n    }else{\n        /* Otherwise interpolate */\n        for (j = 0; j < nH; j++) {\n                for (i = 0; i < nW; i++) {\n                    /* Perform the affine transform on the points */\n                    affineTransform(initX+i, initY+j, ptCentre, pfAff, &dNewX, &dNewY);\n\n                    /* Interpolate from the image */\n                    matImgPatch(j,i) = interpolate(dNewX, dNewY, matImg);\n\n                    /* Check if we're at one of the patch corners and store into the boundary array if needed */\n                    if(i == 0){\n                        if(j == 0){\n                            if (pptUpdated != NULL) pptUpdated[0] = Point2f(dNewX, dNewY);\n                        }else if(j == nH-1){\n                            if (pptUpdated != NULL) pptUpdated[1] = Point2f(dNewX, dNewY);\n                        }\n                    }else if(i == nW-1 && j == 0){\n                        if (pptUpdated != NULL) pptUpdated[3] = Point2f(dNewX, dNewY);\n                    }\n                }\n            }\n            if (pptUpdated != NULL) pptUpdated[2] = Point2f(dNewX, dNewY);\n    }\n\n    return;\n}\n\nfloat ALSC::interpolate(double dNewX, double dNewY, const Mat &matImg){\n    int x1, x2, y2, y1;\n    float val1, val2, val3, val4;\n    float fPixelVal = 0.0;\n    double x,y;\n\n    val1 = val2 = val3 = val4 = 0.0;\n\n    x1 = (int) floor(dNewX);\n    x2 = (int) ceil(dNewX);\n    y2 = (int) ceil(dNewY);\n    y1 = (int) floor(dNewY);\n\n    if(x1 < 0 || y1 < 0 || x2 >= matImg.cols || y2 >= matImg.rows)\n        return 0.0;\n\n    if (x1 == x2 && y1 == y2){ // when dNewX and dNewY are both integer -> happy case no interpolation is required\n        fPixelVal = matImg.at<unsigned char>(y1, x1);\n    }\n    else if (x1 == x2 && y1 != y2){ // dNewX is integer but dNewY is not. 1D interpolation is required (not bidirectional interpolation)\n        val1 = matImg.at<unsigned char>(y1, x1);\n        val2 = matImg.at<unsigned char>(y2, x1);\n\n        fPixelVal = (val2 - val1) * (dNewY - y1) + val1;\n    }\n    else if (x1 != x2 && y1 == y2){\n        val1 = matImg.at<unsigned char>(y1, x1);\n        val2 = matImg.at<unsigned char>(y1, x2);\n\n        fPixelVal = (val2 - val1) * (dNewX - x1) + val1;\n    }\n    else{ // bidirectional interpolation\n            x = dNewX;\n            y = dNewY;\n\n            val1 = matImg.at<unsigned char>(y1, x1);\n            val2 = matImg.at<unsigned char>(y1, x2);\n            val3 = matImg.at<unsigned char>(y2, x1);\n            val4 = matImg.at<unsigned char>(y2, x2);\n\n            fPixelVal = (val1 * (x2 - x) * (y2 - y)\n                         + val2 * (x - x1) * (y2 - y)\n                         + val3 * (x2 - x) * (y - y1)\n                         + val4 * (x - x1) * (y - y1));\n    }\n\n    return fPixelVal;\n}\n\nfloat ALSCU16::interpolate(double dNewX, double dNewY, const Mat &matImg){\n    int x1, x2, y2, y1;\n    float val1, val2, val3, val4;\n    float fPixelVal = 0.0;\n    double x,y;\n\n    val1 = val2 = val3 = val4 = 0.0;\n\n    x1 = (int) floor(dNewX);\n    x2 = (int) ceil(dNewX);\n    y2 = (int) ceil(dNewY);\n    y1 = (int) floor(dNewY);\n\n    if(x1 < 0 || y1 < 0 || x2 >= matImg.cols || y2 >= matImg.rows)\n        return 0.0;\n\n    if (x1 == x2 && y1 == y2){ // when dNewX and dNewY are both integer -> happy case no interpolation is required\n        fPixelVal = matImg.at<unsigned short>(y1, x1);\n    }\n    else if (x1 == x2 && y1 != y2){ // dNewX is integer but dNewY is not. 1D interpolation is required (not bidirectional interpolation)\n        val1 = matImg.at<unsigned short>(y1, x1);\n        val2 = matImg.at<unsigned short>(y2, x1);\n\n        fPixelVal = (val2 - val1) * (dNewY - y1) / (y2 - y1) + val1;\n    }\n    else if (x1 != x2 && y1 == y2){\n        val1 = matImg.at<unsigned short>(y1, x1);\n        val2 = matImg.at<unsigned short>(y1, x2);\n\n        fPixelVal = (val2 - val1) * (dNewX - x1) / (x2 - x1) + val1;\n    }\n    else{ // bidirectional interpolation\n        x = dNewX;\n        y = dNewY;\n\n        val1 = matImg.at<unsigned short>(y1, x1);\n        val2 = matImg.at<unsigned short>(y1, x2);\n        val3 = matImg.at<unsigned short>(y2, x1);\n        val4 = matImg.at<unsigned short>(y2, x2);\n\n        fPixelVal = (val1 * (x2 - x) * (y2 - y) / (x2 - x1) / (y2 - y1)\n                     + val2 * (x - x1) * (y2 - y) / (x2 - x1) / (y2 - y1)\n                     + val3 * (x2 - x) * (y - y1) / (x2 - x1) / (y2 - y1)\n                     + val4 * (x - x1) * (y - y1) / (x2 - x1) / (y2 - y1));\n    }\n\n    return fPixelVal;\n}\n\nfloat ALSCF32::interpolate(double dNewX, double dNewY, const Mat &matImg){\n    int x1, x2, y2, y1;\n    float val1, val2, val3, val4;\n    float fPixelVal = 0.0;\n    double x,y;\n\n    val1 = val2 = val3 = val4 = 0.0;\n\n    x1 = (int) floor(dNewX);\n    x2 = (int) ceil(dNewX);\n    y2 = (int) ceil(dNewY);\n    y1 = (int) floor(dNewY);\n\n    if(x1 < 0 || y1 < 0 || x2 >= matImg.cols || y2 >= matImg.rows)\n        return 0.0;\n\n    if (x1 == x2 && y1 == y2){ // when dNewX and dNewY are both integer -> happy case no interpolation is required\n        fPixelVal = matImg.at<float>(y1, x1);\n    }\n    else if (x1 == x2 && y1 != y2){ // dNewX is integer but dNewY is not. 1D interpolation is required (not bidirectional interpolation)\n        val1 = matImg.at<float>(y1, x1);\n        val2 = matImg.at<float>(y2, x1);\n\n        fPixelVal = (val2 - val1) * (dNewY - y1) / (y2 - y1) + val1;\n    }\n    else if (x1 != x2 && y1 == y2){\n        val1 = matImg.at<float>(y1, x1);\n        val2 = matImg.at<float>(y1, x2);\n\n        fPixelVal = (val2 - val1) * (dNewX - x1) / (x2 - x1) + val1;\n    }\n    else{ // bidirectional interpolation\n        x = dNewX;\n        y = dNewY;\n\n        val1 = matImg.at<float>(y1, x1);\n        val2 = matImg.at<float>(y1, x2);\n        val3 = matImg.at<float>(y2, x1);\n        val4 = matImg.at<float>(y2, x2);\n\n        fPixelVal = (val1 * (x2 - x) * (y2 - y) / (x2 - x1) / (y2 - y1)\n                     + val2 * (x - x1) * (y2 - y) / (x2 - x1) / (y2 - y1)\n                     + val3 * (x2 - x) * (y - y1) / (x2 - x1) / (y2 - y1)\n                     + val4 * (x - x1) * (y - y1) / (x2 - x1) / (y2 - y1));\n    }\n\n    return fPixelVal;\n}\n\n// this function for the feature refinement\nvoid ALSC::performALSC(const vector<CTiePt> *pvecTpts, const float* pfAffStart){\n\n    //////////////////////////////////////////////////\n    // Start processing for each seed point\n    //////////////////////////////////////////////////\n    int nLength = pvecTpts->size();\n    m_pvecRefTP.clear();   // clear result buffer\n    m_vecPassList.clear(); // clear pass index\n    for (int i = 0; i < nLength; i++) {\n        // get a seed point\n        Point2f ptStartL, ptStartR;\n        ptStartL = pvecTpts->at(i).m_ptL;\n        ptStartR = pvecTpts->at(i).m_ptR;\n\n        CTiePt tp;\n\n        // If the point is matched, update the result list\n        if(doMatching (ptStartL, ptStartR, tp, pfAffStart)){\n            m_pvecRefTP.push_back(tp); // collect results\n            m_vecPassList.push_back(i);\n        }\n\n    } // end of operation for all seed points\n}\n\n} // end namespace gotcha\n"
  },
  {
    "path": "src/asp/Gotcha/ALSC.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#ifndef ASP_GOTCHA_ALSC_H\n#define ASP_GOTCHA_ALSC_H\n\n#include <asp/Gotcha/CALSCParam.h>\n#include <asp/Gotcha/CTiePt.h>\n\n#include <opencv2/opencv.hpp>\n#include <opencv2/highgui/highgui.hpp>\n\n#include <Eigen/Dense>\n#include <Eigen/SVD>\n\n#include <iostream>\n#include <math.h>\n#include <fstream>\n#include <vector>\n\nnamespace gotcha {\n\nclass ALSC {\npublic:\n    ALSC();\n    ALSC(cv::Mat imgL, cv::Mat imgR, CALSCParam paramALSC);\n\n    void performALSC(const std::vector<CTiePt>* pvecTpts , const float* pfAffStart = NULL);   // Nb. it is normally used for TC refinement (i.e., verification)\n                                                                                         // pfAffStart might be needed if ALSC resumes from the previous TP results\n    void getRefinedTps(std::vector<CTiePt>& vecRefTP) const {vecRefTP = m_pvecRefTP;}\n    const std::vector<CTiePt>* getRefinedTps() {return &m_pvecRefTP;} // the result which passes the ALSC test\n    std::vector<int> getPassList() {return m_vecPassList;}\n\n    enum{NO_ERR, OB_ERR};\n\nprivate:\n    bool isIntersecting(cv::Rect rectA, cv::Rect rectB);\n    void getGradientX(Eigen::Ref<Eigen::MatrixXf> matSrc);\n    void getGradientY(Eigen::Ref<Eigen::MatrixXf> matSrc);\n    void distortPatch(const cv::Mat& matImg, const cv::Point2f ptCentre, const float* pfAff, Eigen::Ref<Eigen::MatrixXf> matImgPatch, cv::Point2f* pptUpdated = NULL);\n    bool doMatching(cv::Point2f ptStartL, cv::Point2f ptStartR, CTiePt& tp, const float* pfAffInt = NULL);\n    void affineTransform(double x, double y, const cv::Point2f ptCentre, const float *pfAff, double *dNewX, double *dNewY);\n    float interpolate(double dNewX, double dNewY, const cv::Mat &matImg);\n\nprivate:\n    // inputs\n    cv::Mat m_imgL;\n    cv::Mat m_imgR;\n    CALSCParam m_paramALSC;\n    cv::Mat m_imgR_resize;\n\n    int nMaxIter;\n    int nPatchRadius;\n    float fDisplacementThr;\n    float fAffineThr;\n    float fEigenThr;\n    bool bNeedW;\n\n    int nRowPatch;\n    int nColPatch;\n    int nSystemMatrixRows;\n\n    std::vector<std::vector<float> > pfGx;\n    std::vector<std::vector<float> > pfGy;\n\n    Eigen::MatrixXf matPatchL;\n    Eigen::MatrixXf matPatchR;\n\n    Eigen::Matrix2f matC;\n\n    Eigen::MatrixXf emA;\n    Eigen::VectorXf emB;\n\n    int nParam;\n\n    // outputs:\n    std::vector<CTiePt> m_pvecRefTP;\n    std::vector<int> m_vecPassList; // index list which passes ALSC test\n};\n\nclass ALSCU16 : public ALSC\n{\n    float interpolate(double dNewX, double dNewY, const cv::Mat &matImg);\n};\n\nclass ALSCF32 : public ALSC\n{\n    float interpolate(double dNewX, double dNewY, const cv::Mat &matImg);\n};\n\n} // end namespace gotcha\n\n#endif // ASP_GOTCHA_ALSC_H\n"
  },
  {
    "path": "src/asp/Gotcha/CALSCParam.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#ifndef ASP_GOTCHA_CALSCPARAM_H\n#define ASP_GOTCHA_CALSCPARAM_H\n\nnamespace gotcha {\n  \nclass CALSCParam {\n\npublic:\n    CALSCParam():m_nMaxIter(10),m_nPatch(30),m_fEigThr(150.f),m_fAffThr(1.5f),m_fDriftThr(0.8f),\n                 m_bWeighting(false),m_bIntOffset(true){}\n\n    // matching param\n    int m_nMaxIter; // the max num of iterations\n    int m_nPatch;   // the size of a matching patch\n    float m_fEigThr;\n    float m_fAffThr;\n    float m_fDriftThr;\n    bool m_bWeighting;\n    bool m_bIntOffset;\n};\n\n} // end namespace gotcha\n\n#endif // ASP_GOTCHA_CALSCPARAM_H\n\n"
  },
  {
    "path": "src/asp/Gotcha/CASP-GO_params.xml",
    "content": "<?xml version=\"1.0\"?>\n<opencv_storage>\n\n<processParam>\n<nThreads>8</nThreads>\n</processParam>\n\n<sGotchaParam>\n<nNeiType>3</nNeiType>\n<nALSCIteration>8</nALSCIteration>\n<fMaxEigenValue>150</fMaxEigenValue>\n<nALSCKernel>30</nALSCKernel>\n<nGrowNeighbour>8</nGrowNeighbour>\n<fAff>1.5</fAff>\n<fDrift>0.8</fDrift>\n<bWeight>0</bWeight>\n<bIntOffset>1</bIntOffset>\n</sGotchaParam>\n\n<MLParam>\n<nMLKernel>25</nMLKernel>\n<nMLIter>3</nMLIter>\n</MLParam>\n\n<ORSParam>\n<fMaxDiff>1.5</fMaxDiff>\n<nPercentDiff>60</nPercentDiff>\n<nDiffKernel>21</nDiffKernel>\n<fPatchThreshold>7.5</fPatchThreshold>\n<nPercentReject>25</nPercentReject>\n<nErode>0</nErode>\n</ORSParam>\n\n<coKrigingParam>\n<nNeighbourLimit>21</nNeighbourLimit>\n<nDistLimit>500</nDistLimit>\n<fSpatialResRatio>1.0</fSpatialResRatio>\n</coKrigingParam>\n\n<MSASURFParam>\n<nMinHessian>400</nMinHessian>\n<nOctave>8</nOctave>\n<nEdgeThreshold>10</nEdgeThreshold>\n<fMatchCoeff>0.6</fMatchCoeff>\n<nLayer>3</nLayer>\n</MSASURFParam>\n\n</opencv_storage>\n"
  },
  {
    "path": "src/asp/Gotcha/CBatchProc.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Gotcha/CBatchProc.h>\n#include <asp/Gotcha/CDensifyParam.h>\n#include <asp/Gotcha/CDensify.h>\n\n#include <boost/filesystem.hpp>\n\nnamespace fs = boost::filesystem;\nusing namespace vw;\nusing namespace cv;\nusing namespace std;\n\nnamespace gotcha {\n  \n// Convert a float image from ASP format to an OpenCV float image\n// and vice-versa. Note that ASP stores an image as col, row.\n  \nvoid aspMatToCvMat(vw::ImageView<float> const& in, cv::Mat & out) {\n  out = cv::Mat::zeros(in.rows(), in.cols(), CV_32F);\n  for (int row = 0; row < out.rows; row++) {\n    for (int col = 0; col < out.cols; col++) {\n      out.at<float>(row, col) = in(col, row);\n    }\n  }\n}\n\nvoid cvMatToAspMat(cv::Mat const& in, vw::ImageView<float> & out) {\n  out.set_size(in.cols, in.rows); \n  for (int row = 0; row < in.rows; row++) {\n    for (int col = 0; col < in.cols; col++) {\n      out(col, row) = in.at<float>(row, col);\n    }\n  }\n}\n  \nCBatchProc::CBatchProc(std::string          const & strMetaFile,\n                       vw::ImageView<float> const & imgL,\n                       vw::ImageView<float> const & imgR, \n                       vw::ImageView<float> const & input_dispX,\n                       vw::ImageView<float> const & input_dispY) {\n\n  // Sanity checks\n  if (bounding_box(imgL)        != bounding_box(imgR) ||\n      bounding_box(input_dispX) != bounding_box(imgR) ||\n      bounding_box(input_dispY) != bounding_box(imgR)) \n    vw_throw(ArgumentErr() << \"Not all inputs have the same dimensions.\");\n  \n  // initialize\n  m_strMetaFile = strMetaFile;\n  \n#if 0\n  m_strImgL = strLeftImagePath;\n  m_strImgR = strRightImagePath;\n  m_strDispX = strDisparityX;\n  m_strDispY = strDisparityY;\n  m_strOutPath = strOutputPrefix;\n#endif\n  \n  // Convert the inputs to cv::Mat, which is what Gotcha prefers\n  aspMatToCvMat(imgL, m_imgL);\n  aspMatToCvMat(imgR, m_imgR);\n  aspMatToCvMat(input_dispX, m_input_dispX);\n  aspMatToCvMat(input_dispY, m_input_dispY);\n  \n  if (!validateProjParam()){\n    std::cerr << \"ERROR: The project input files cannot be validated\" << std::endl;\n    exit(1);\n  }\n  if (!validateProjInputs()){\n    std::cerr << \"ERROR: The project input files not in correct format\" << std::endl;\n    exit(1);\n  }\n}\n\nCBatchProc::~CBatchProc() {\n}\n\nbool CBatchProc::validateProjParam() {\n  bool bRes = true;\n\n#if 0\n  // image file existence\n  if (!fs::exists(m_strImgL)){\n    std::cerr << \"ERROR: Left image file does not exist.\" << std::endl;\n    bRes = false;\n  }\n\n  if (!fs::exists(m_strImgR)){\n    std::cerr << \"ERROR: Right image file does not exist.\" << std::endl;\n    bRes = false;\n  }\n\n  // These are passed in-memory now\n  if (!fs::exists(m_strDispX)){\n    std::cerr << \"Gotcha on given disparity map. ERROR: X disparity file does not exist.\" << std::endl;\n    bRes = false;\n  }\n\n  if (!fs::exists(m_strDispY)){\n    std::cerr << \"Gotcha on given disparity map. ERROR: Y disparity file does not exist.\" << std::endl;\n    bRes = false;\n  }\n#endif\n  \n  return bRes;\n}\n\nbool CBatchProc::validateProjInputs() {\n  bool bRes = true;\n\n  //m_input_dispX = imread(m_strDispX, CV_LOAD_IMAGE_ANYDEPTH);\n  //m_input_dispY = imread(m_strDispY, CV_LOAD_IMAGE_ANYDEPTH);\n  if ((m_input_dispX.depth()!=2 && m_input_dispX.depth()!=5)|| (m_input_dispY.depth()!=2 && m_input_dispY.depth()!=5)){\n    bRes = false;\n    std::cerr << \"Gotcha on given disparity map. ERROR: Input x/y disparity map not in 16bit unsigned integer or 32bit floating point\" << std::endl;\n  }\n  if (m_input_dispX.channels()!=1 || m_input_dispY.channels()!=1){\n    bRes = false;\n    std::cerr << \"Gotcha on given disparity map. ERROR: Please take single channel image as input x/y disparity map\" << std::endl;\n  }\n\n  //std::cout << \"Generating bad pixel/gap mask file.\" << std::endl;\n  generateMask();\n\n  //std::cout << \"Reading mask: \" << m_strMask << std::endl;\n  //Mat Mask = imread(m_strMask, CV_LOAD_IMAGE_ANYDEPTH);\n  if (m_Mask.depth()!=0 || m_Mask.channels()!=1){\n    bRes = false;\n    std::cerr << \"ERROR: Input mask file not in 8 bit single channel unsigned int format\" << std::endl;\n  }\n  return bRes;\n}\n\nvoid CBatchProc::doBatchProcessing(vw::ImageView<float> & output_dispX,\n                                   vw::ImageView<float> & output_dispY) {\n\n  //std::cout << \"Starting processing now...\" << std::endl\n  //     << \"================================\" << std::endl << std::endl;\n\n  std::vector<CTiePt> vecTPs;\n  generateTPFile(vecTPs);\n  refinement(vecTPs, output_dispX, output_dispY);\n\n  //std::cout << \"Process completed\" << std::endl;\n  //std::cout << std::endl;\n  //std::cout << \"================================\" << std::endl << std::endl;\n}\n\nvoid CBatchProc::generateMask() {\n  // These are kept in memory now, no need to read them from disk\n#if 0\n  string strMask = \"-GM.tif\";\n  m_strMask = m_strOutPath + strMask;\n  m_input_dispX = imread(m_strDispX, CV_LOAD_IMAGE_ANYDEPTH);\n  m_input_dispY = imread(m_strDispY, CV_LOAD_IMAGE_ANYDEPTH);\n#endif\n  \n  m_Mask = Mat::zeros(m_input_dispX.size(), CV_8UC1);\n\n  if (m_input_dispX.depth()==2 && m_input_dispY.depth()==2){\n    for (int i=0; i<m_Mask.rows; i++){\n      for (int j=0; j<m_Mask.cols; j++){\n        if (m_input_dispX.at<ushort>(i,j)==65535 || m_input_dispY.at<ushort>(i,j)==65535)\n          m_Mask.at<uchar>(i,j)=1;\n      }\n    }\n\n    //std::cout << \"Writing mask: \" << m_strMask << std::endl;\n    //imwrite(m_strMask, Mask);\n  }\n\n  else if (m_input_dispX.depth()==5 && m_input_dispY.depth()==5){\n    int numBadpixel = 0;\n    for (int i=0; i<m_Mask.rows; i++){\n      for (int j=0; j<m_Mask.cols; j++){\n        if (m_input_dispX.at<float>(i,j)==0.0) { //Nodata value of ASP disparity is 0.\n          m_Mask.at<uchar>(i,j)=1;\n          numBadpixel+=1;\n        }\n      }\n    }\n    //std::cout << \"GAP Pixels masked: \" << numBadpixel << std::endl;\n    //std::cout << \"Writing mask: \" << m_strMask << std::endl;\n    //imwrite(m_strMask, Mask);\n  }\n\n}\n\nvoid CBatchProc::generateTPFile(std::vector<CTiePt> & vecTPs) {\n\n  // Wipe the output\n  vecTPs.clear();\n\n  cv::Mat dispX, dispY;\n\n  m_input_dispX.copyTo(dispX);\n  m_input_dispY.copyTo(dispY);\n\n  // Turn this logic off, as the data is kept in memory\n#if 0\n  dispX = imread(m_strDispX, CV_LOAD_IMAGE_ANYDEPTH);\n  dispY = imread(m_strDispY, CV_LOAD_IMAGE_ANYDEPTH);\n  std::cout << \"Reading mask: \" << m_strMask << std::endl;\n  Mat Mask = imread(m_strMask, CV_LOAD_IMAGE_ANYDEPTH);\n  Mask.convertTo(Mask, CV_8UC1);\n#endif\n  \n  //string strTPFile = \"-TP.txt\";\n  //m_strTPFile = m_strOutPath + strTPFile;\n\n  if (dispX.depth()==2 && dispY.depth()==2){\n    dispX.convertTo(dispX, CV_16UC1);\n    dispY.convertTo(dispY, CV_16UC1);\n    for (int i=0; i<dispX.rows; i++){\n      for (int j=0; j<dispX.cols; j++){\n        if (m_Mask.at<uchar>(i,j)==1){\n          dispX.at<ushort>(i,j)=65535;\n          dispY.at<ushort>(i,j)=65535;\n        }\n      }\n    }\n  }\n\n  else if (dispX.depth()==5 && dispY.depth()==5){\n    dispX.convertTo(dispX, CV_32FC1);\n    dispY.convertTo(dispY, CV_32FC1);\n    for (int i=0; i<dispX.rows; i++){\n      for (int j=0; j<dispX.cols; j++){\n        if (m_Mask.at<uchar>(i,j)==1){\n          dispX.at<float>(i,j)= 0.0;\n          dispY.at<float>(i,j)= 0.0;\n        }\n      }\n    }\n  }\n\n\n  if (dispX.depth()==2 && dispY.depth()==2){\n    Mat dispX_tmp(dispX.size(),CV_16UC1);\n    Mat dispY_tmp(dispY.size(),CV_16UC1);\n    dispX.copyTo(dispX_tmp);\n    dispY.copyTo(dispY_tmp);\n    for (int i=1; i<dispX.rows-1; i++){\n      for (int j=1; j<dispX.cols-1; j++){\n        if (dispX.at<ushort>(i-1,j-1)!=65535 && dispX.at<ushort>(i-1,j)!=65535 && dispX.at<ushort>(i-1,j+1)!=65535 && dispX.at<ushort>(i,j-1)!=65535 &&\n            dispX.at<ushort>(i,j+1)!=65535 && dispX.at<ushort>(i+1,j-1)!=65535 && dispX.at<ushort>(i+1,j)!=65535 && dispX.at<ushort>(i+1,j+1)!=65535 &&\n            dispY.at<ushort>(i-1,j-1)!=65535 && dispY.at<ushort>(i-1,j)!=65535 && dispY.at<ushort>(i-1,j+1)!=65535 && dispY.at<ushort>(i,j-1)!=65535 &&\n            dispY.at<ushort>(i,j+1)!=65535 && dispY.at<ushort>(i+1,j-1)!=65535 && dispY.at<ushort>(i+1,j)!=65535 && dispY.at<ushort>(i+1,j+1)!=65535){\n          dispX_tmp.at<ushort>(i,j)=65535;\n          dispY_tmp.at<ushort>(i,j)=65535;\n        }\n      }\n    }\n    dispX_tmp.copyTo(dispX);\n    dispY_tmp.copyTo(dispY);\n  }\n\n  else if (dispX.depth()==5 && dispY.depth()==5){\n    Mat dispX_tmp(dispX.size(),CV_32FC1);\n    Mat dispY_tmp(dispY.size(),CV_32FC1);\n    Mat dispX_tmp2(dispX.size(),CV_32FC1);\n    Mat dispY_tmp2(dispY.size(),CV_32FC1);\n\n    // Only leave the gap border pixels to speed-up the process.\n    // Should be cancelled if use sGotcha\n\n    dispX.copyTo(dispX_tmp);\n    dispY.copyTo(dispY_tmp);\n    for (int i=1; i<dispX.rows-1; i++){\n      for (int j=1; j<dispX.cols-1; j++){\n        if (dispX.at<float>(i-1,j-1)!=0.0 && dispX.at<float>(i-1,j)!=0.0 && dispX.at<float>(i-1,j+1)!=0.0 && dispX.at<float>(i,j-1)!=0.0 &&\n            dispX.at<float>(i,j+1)!=0.0 && dispX.at<float>(i+1,j-1)!=0.0 && dispX.at<float>(i+1,j)!=0.0 && dispX.at<float>(i+1,j+1)!=0.0 &&\n            dispY.at<float>(i-1,j-1)!=0.0 && dispY.at<float>(i-1,j)!=0.0 && dispY.at<float>(i-1,j+1)!=0.0 && dispY.at<float>(i,j-1)!=0.0 &&\n            dispY.at<float>(i,j+1)!=0.0 && dispY.at<float>(i+1,j-1)!=0.0 && dispY.at<float>(i+1,j)!=0.0 && dispY.at<float>(i+1,j+1)!=0.0){\n          dispX_tmp.at<float>(i,j)= 0.0;\n          dispY_tmp.at<float>(i,j)= 0.0;\n        }\n      }\n    }\n\n    dispX_tmp.copyTo(dispX_tmp2);\n    dispY_tmp.copyTo(dispY_tmp2);\n\n    for (int i=1; i<dispX.rows-1; i++){\n      for (int j=1; j<dispX.cols-1; j++){\n        if (dispX.at<float>(i,j)!=0.0 && dispX_tmp.at<float>(i,j) ==0.0 &&\n            (dispX_tmp.at<float>(i-1,j-1)!=0.0 || dispX_tmp.at<float>(i-1,j)!=0.0 ||\n             dispX_tmp.at<float>(i-1,j+1)!=0.0 || dispX_tmp.at<float>(i,j-1)!=0.0 ||\n             dispX_tmp.at<float>(i,j+1)!=0.0 || dispX_tmp.at<float>(i+1,j-1)!=0.0 ||\n             dispX_tmp.at<float>(i+1,j)!=0.0 || dispX_tmp.at<float>(i+1,j+1)!=0.0 ) ){\n\n          dispX_tmp2.at<float>(i,j) = dispX.at<float>(i,j);\n          dispY_tmp2.at<float>(i,j) = dispY.at<float>(i,j);\n        }\n\n      }\n    }\n\n    //double the TPs\n    dispX_tmp2.copyTo(dispX);\n    dispY_tmp2.copyTo(dispY);\n  }\n\n\n  if (dispX.depth()==2 && dispY.depth()==2){\n    dispX.convertTo(dispX, CV_16UC1);\n    dispY.convertTo(dispY, CV_16UC1);\n    vector<ushort> Lx, Ly;\n    vector<float> Rx, Ry;\n    for (int i=0; i<dispX.rows; i++){\n      for (int j=0; j<dispX.cols; j++){\n        if(dispX.at<ushort>(i,j)!=65535 && dispY.at<ushort>(i,j)!=65535){\n          unsigned short lx, ly;\n          float rx, ry;\n          lx = j;\n          ly = i;\n          rx = j + (dispX.at<ushort>(i,j)-16384)/16.;\n          ry = i + (dispY.at<ushort>(i,j)-16384)/16.;\n          Lx.push_back(lx);\n          Ly.push_back(ly);\n          Rx.push_back(rx);\n          Ry.push_back(ry);\n        }\n      }\n    }\n\n#if 1\n    // Keep the TP in memory, not on disk, this way one can run multiple threads\n    // doing Gotcha.\n    int nLen = Lx.size();\n    vecTPs.resize(nLen);\n    for (int i = 0 ; i < nLen; i++){\n      unsigned short lx, ly;\n      float rx, ry;\n      lx = Lx.at(i);\n      ly = Ly.at(i);\n      rx = Rx.at(i);\n      ry = Ry.at(i);\n      \n      CTiePt tp;\n      tp.m_ptL.x = lx;\n      tp.m_ptL.y = ly;\n      tp.m_ptR.x = rx;\n      tp.m_ptR.y = ry;\n      tp.m_fSimVal = 0.5;\n      vecTPs[i] = tp;\n    }\n#else\n    ofstream sfTP;\n    std::cout << \"Writing: \" << m_strTPFile << std::endl;\n    sfTP.open(m_strTPFile.c_str());\n    sfTP.precision(10);\n    int nLen = Lx.size();\n    int nEle = 5;\n    if (sfTP.is_open()){\n      sfTP << nLen << \" \" << nEle << std::endl;\n      for (int i = 0 ; i < nLen ;i++){\n        unsigned short lx, ly;\n        float rx, ry;\n        lx = Lx.at(i);\n        ly = Ly.at(i);\n        rx = Rx.at(i);\n        ry = Ry.at(i);\n        sfTP << lx << \" \" << ly << \" \"\n             << rx << \" \" << ry << \" \"\n             << 0.5 << \" \" << std::endl;\n      }\n      sfTP.close();\n    }\n    else {\n      std::cout << \"ERROR: Can not convert X/Y disparity map to TP file. \"\n           << \"Please check the directory for storing Gotcha results is writable.\"\n           << std::endl;\n    }\n#endif\n    \n  } else if (dispX.depth()==5 && dispY.depth()==5){\n    dispX.convertTo(dispX, CV_32FC1);\n    dispY.convertTo(dispY, CV_32FC1);\n    vector<ushort> Lx, Ly;\n    vector<float> Rx, Ry;\n    for (int i=0; i<dispX.rows; i++){\n      for (int j=0; j<dispX.cols; j++){\n        if(dispX.at<float>(i,j)!= 0.0 && dispY.at<float>(i,j)!=0.0){\n\n          //nodata should be -3.40282346639e+038, but ASP disparity map uses 0 as nodata\n          unsigned short lx, ly;\n          float rx, ry;\n          lx = j;\n          ly = i;\n          rx = j + dispX.at<float>(i,j);\n          ry = i + dispY.at<float>(i,j);\n          Lx.push_back(lx);\n          Ly.push_back(ly);\n          Rx.push_back(rx);\n          Ry.push_back(ry);\n        }\n      }\n    }\n\n#if 1\n    // Keep the TP in memory, not on disk, this way one can run multiple threads\n    // doing Gotcha.\n    int nLen = Lx.size();\n    vecTPs.resize(nLen);\n    for (int i = 0 ; i < nLen; i++){\n      unsigned short lx, ly;\n      float rx, ry;\n      lx = Lx.at(i);\n      ly = Ly.at(i);\n      rx = Rx.at(i);\n      ry = Ry.at(i);\n      \n      CTiePt tp;\n      tp.m_ptL.x = lx;\n      tp.m_ptL.y = ly;\n      tp.m_ptR.x = rx;\n      tp.m_ptR.y = ry;\n      tp.m_fSimVal = 0.5;\n      vecTPs[i] = tp;\n    }\n#else\n    ofstream sfTP;\n    sfTP.open(m_strTPFile.c_str());\n    std::cout << \"Writing: \" << m_strTPFile << std::endl;\n    sfTP.precision(10);\n    int nLen = Lx.size();\n    int nEle = 5;\n    if (sfTP.is_open()){\n      sfTP << nLen << \" \" << nEle << std::endl;\n      for (int i = 0 ; i < nLen ;i++){\n        unsigned short lx, ly;\n        float rx, ry;\n        lx = Lx.at(i);\n        ly = Ly.at(i);\n        rx = Rx.at(i);\n        ry = Ry.at(i);\n        sfTP << lx << \" \" << ly << \" \"\n             << rx << \" \" << ry << \" \"\n             << 0.5 << \" \" << std::endl;\n      }\n      sfTP.close();\n    } else {\n      std::cout << \"ERROR: Can not convert X/Y disparity map to TP file. \"\n           << \"Please check the directory for storing Gotcha results is writable.\" << std::endl;\n    }\n#endif\n  }\n  \n}\n\nvoid CBatchProc::refinement(std::vector<CTiePt> const& vecTPs,\n                            vw::ImageView<float> & output_dispX,\n                            vw::ImageView<float> & output_dispY) {\n  //std::cout << \"Gotcha densification based on existing disparity map:\" << std::endl;\n  FileStorage fs(m_strMetaFile, FileStorage::READ);\n  FileNode tl = fs[\"sGotchaParam\"];\n\n  // read GOTCHA param\n  CDensifyParam paramDense;\n  paramDense.m_nProcType = 0;\n  paramDense.m_paramGotcha.m_fDiffCoef = 0.05;\n  paramDense.m_paramGotcha.m_fDiffThr = 0.1;\n  paramDense.m_paramGotcha.m_nDiffIter = 5;\n  //paramDense.m_paramGotcha.m_nMinTile = (int)tl[\"nMinTile\"];\n  //Mat matDummy = imread(m_strImgL, CV_LOAD_IMAGE_ANYDEPTH);\n  paramDense.m_paramGotcha.m_nMinTile = m_imgL.cols + m_imgL.rows;\n  paramDense.m_paramGotcha.m_nNeiType = (int)tl[\"nNeiType\"];\n\n  paramDense.m_paramGotcha.m_paramALSC.m_bIntOffset = (int)tl[\"bIntOffset\"];\n  paramDense.m_paramGotcha.m_paramALSC.m_bWeighting = (int)tl[\"bWeight\"];\n  paramDense.m_paramGotcha.m_paramALSC.m_fAffThr = (float)tl[\"fAff\"];\n  paramDense.m_paramGotcha.m_paramALSC.m_fDriftThr = (float)tl[\"fDrift\"];\n  paramDense.m_paramGotcha.m_paramALSC.m_fEigThr = (float)tl[\"fMaxEigenValue\"];\n  paramDense.m_paramGotcha.m_paramALSC.m_nMaxIter = (int)tl[\"nALSCIteration\"];\n  paramDense.m_paramGotcha.m_paramALSC.m_nPatch = (int)tl[\"nALSCKernel\"];\n\n#if 0\n  string strBase = m_strOutPath;\n  string strTPFile = \"-TP.txt\";\n  paramDense.m_strTPFile = strBase + strTPFile;\n  paramDense.m_paramGotcha.m_strMask = m_strMask;\n  string strUpdatedDispX = \"-c1_refined.txt\";\n  paramDense.m_strUpdatedDispX = strBase + strUpdatedDispX;\n  string strUpdatedDispY = \"-c2_refined.txt\";\n  paramDense.m_strUpdatedDispY = strBase + strUpdatedDispY;\n  string strUpdatedDispSim = \"-uncertainty.txt\";\n  paramDense.m_strUpdatedDispSim = strBase + strUpdatedDispSim;\n\n  paramDense.m_strImgL = m_strImgL;\n  paramDense.m_strImgR = m_strImgR;\n  paramDense.m_strOutPath = m_strOutPath;\n  paramDense.m_strDispX = m_strDispX;\n  paramDense.m_strDispY = m_strDispY;\n  paramDense.m_Mask = m_Mask;\n#endif\n  \n  CDensify densify(paramDense, vecTPs, m_imgL, m_imgR, m_input_dispX, m_input_dispY, m_Mask);\n  //std::cout << \"CASP-GO INFO: performing Gotcha densification\" << std::endl;\n\n  cv::Mat cv_output_dispX, cv_output_dispY;\n  int nErrCode = densify.performDensitification(cv_output_dispX, cv_output_dispY);\n  if (nErrCode != CDensifyParam::NO_ERR){\n    std::cerr << \"Warning: Processing error on densifying operation (ERROR CODE: \" << nErrCode << \" )\" << std::endl;\n  }\n\n  // Export the data to ASP\n  cvMatToAspMat(cv_output_dispX, output_dispX);\n  cvMatToAspMat(cv_output_dispY, output_dispY);\n}\n\nPoint3f CBatchProc::rotate(Point3f ptIn, Mat matQ, bool bInverse){\n  // this believe matQ is a unit vector\n  Point3f ptRes;\n\n  float p[4] = {0, ptIn.x, ptIn.y, ptIn.z};\n  float q[4];\n  float q_inv[4];\n  // get quaternion vector\n  for(int i = 0; i < 4; i++) {\n    q[i] = matQ.at<float>(i,0);\n    q_inv[i] = -1 * matQ.at<float>(i,0);\n  }\n  q_inv[0] = -1 * q_inv[0]; // q = [w x y z] and q^-1 = [w -x -y -z]\n\n  // compute rotation\n  // [0 v'] = q[0 v]q^-1\n  float pfTemp[4] = {0.f,};\n  float pfTemp2[4] = {0.f,};\n  if (bInverse){\n    quaternionMultiplication(q_inv, p, pfTemp);\n    quaternionMultiplication(pfTemp, q, pfTemp2);\n  }\n  else{\n    quaternionMultiplication(q, p, pfTemp);\n    quaternionMultiplication(pfTemp, q_inv, pfTemp2);\n  }\n\n  ptRes.x = pfTemp2[1];\n  ptRes.y = pfTemp2[2];\n  ptRes.z = pfTemp2[3];\n\n  return ptRes;\n}\n\nvoid CBatchProc::quaternionMultiplication(const float* p, const float* q, float* pfOut){\n  // compute p*q = pfOut\n  //    x =  q1.x * q2.w + q1.y * q2.z - q1.z * q2.y + q1.w * q2.x;\n  //    y = -q1.x * q2.z + q1.y * q2.w + q1.z * q2.x + q1.w * q2.y;\n  //    z =  q1.x * q2.y - q1.y * q2.x + q1.z * q2.w + q1.w * q2.z;\n  //    w = -q1.x * q2.x - q1.y * q2.y - q1.z * q2.z + q1.w * q2.w;\n  // float a = p[0], b = p[1], c = p[2], d =p[3];\n  pfOut[0] = p[0]*q[0] - (p[1]*q[1]+p[2]*q[2]+p[3]*q[3]); // w1*w2-v1.v2;\n  pfOut[1] = p[1]*q[0] + p[2]*q[3] - p[3]*q[2] + p[0]*q[1];\n  pfOut[2] = -1*p[1]*q[3] + p[2]*q[0] + p[3]*q[1] + p[0]*q[2];\n  pfOut[3] = p[1]*q[2] - p[2]*q[1] + p[3]*q[0] + p[0]*q[3];\n}\n\n} // end namespace gotcha\n"
  },
  {
    "path": "src/asp/Gotcha/CBatchProc.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#ifndef ASP_GOTCHA_CBATCHPROC_H\n#define ASP_GOTCHA_CBATCHPROC_H\n\n#include <vw/Image/ImageView.h>\n#include <vw/Image/ImageViewRef.h>\n#include <vw/Image/Manipulation.h>\n#include <vw/Image/ImageChannels.h>\n\n#include <opencv2/opencv.hpp>\n#include <opencv2/highgui/highgui.hpp>\n#include <opencv2/imgproc/imgproc.hpp>\n\n#include <asp/Gotcha/CTiePt.h>\n\n#include <iostream>\n#include <fstream>\n#include <stdio.h>\n#include <stdlib.h>\n\nnamespace gotcha {\n\nclass CBatchProc {\npublic:\n  CBatchProc(std::string          const & strMetaFile,\n             vw::ImageView<float> const & imgL,\n             vw::ImageView<float> const & imgR, \n             vw::ImageView<float> const & input_dispX,\n             vw::ImageView<float> const & input_dispY);\n\n  ~CBatchProc();\n  \n  void doBatchProcessing(vw::ImageView<float> & output_dispX,\n                         vw::ImageView<float> & output_dispY);\n  \nprivate:\n    void setProjParameter();\n    bool validateProjParam();\n    bool validateProjInputs();\n    void generateMask();\n    void generateTPFile(std::vector<CTiePt> & vecTPs);\n\n    cv::Point3f rotate(cv::Point3f ptIn, cv::Mat matQ, bool bInverse);\n    void quaternionMultiplication(const float* p, const float* q, float* pfOut);\n\nprotected:\n    // processing\n  void refinement(std::vector<CTiePt> const& vecTPs,\n                  vw::ImageView<float> & output_dispX,\n                  vw::ImageView<float> & output_dispY);\n\nprotected:\n  std::string m_strMetaFile;   // file path to the Metadata file\n#if 0\n  std::string m_strImgL;\n  std::string m_strImgR;\n  std::string m_strDispX;\n  std::string m_strDispY;\n  string m_strMask;\n  std::string m_strTPFile;\n  std::string m_strOutPath;    // a user-supplied file path for the output directory\n#endif\n  \n  cv::Mat m_imgL, m_imgR;\n  cv::Mat m_input_dispX, m_input_dispY;\n  cv::Mat m_Mask;\n};\n\n// Apply Gotcha refinement to each padded tile\nclass GotchaPerBlockView: public vw::ImageViewBase<GotchaPerBlockView>{\n  vw::ImageViewRef<vw::PixelMask<vw::Vector2f>> m_input_disp;\n  vw::ImageViewRef<float> m_left_img, m_right_img;\n  int m_padding;\n  std::string m_casp_go_param_file;\n  \n  typedef vw::PixelMask<vw::Vector2f> PixelT;\n\npublic:\n  GotchaPerBlockView(vw::ImageViewRef<vw::PixelMask<vw::Vector2f>> input_disp,\n                     vw::ImageViewRef<float> left_img,\n                     vw::ImageViewRef<float> right_img,\n                     int padding, std::string const& casp_go_param_file):\n    m_input_disp(input_disp), m_left_img(left_img), m_right_img(right_img),\n    m_padding(padding), m_casp_go_param_file(casp_go_param_file){}\n  \n  typedef PixelT pixel_type;\n  typedef PixelT result_type;\n  typedef vw::ProceduralPixelAccessor<GotchaPerBlockView> pixel_accessor;\n\n  inline vw::int32 cols() const { return m_input_disp.cols(); }\n  inline vw::int32 rows() const { return m_input_disp.rows(); }\n  inline vw::int32 planes() const { return 1; }\n\n  inline pixel_accessor origin() const { return pixel_accessor( *this, 0, 0 ); }\n\n  inline pixel_type operator()( double/*i*/, double/*j*/, vw::int32/*p*/ = 0 ) const {\n    vw::vw_throw(vw::NoImplErr() << \"GotchaPerBlockView::operator()(...) is not implemented\");\n    return pixel_type();\n  }\n\n  typedef vw::CropView<vw::ImageView<pixel_type>> prerasterize_type;\n  inline prerasterize_type prerasterize(vw::BBox2i const& bbox) const {\n\n    // Need to see a bit more of the input image to avoid tiling artifacts\n    vw::BBox2i biased_box = bbox;\n    biased_box.expand(m_padding);\n    biased_box.crop(bounding_box(m_input_disp));\n\n    // Run Gotcha on the expanded and cropped tile.\n    // TODO(oalexan1): Verify that it assumes a value of 0 for invalid disparities\n    vw::ImageView<result_type> cropped_disp = crop(m_input_disp, biased_box);\n    vw::ImageView<float> output_dispX, output_dispY;\n    CBatchProc batchProc(m_casp_go_param_file,\n                         crop(m_left_img, biased_box), \n                         crop(m_right_img, biased_box), \n                         vw::select_channel(cropped_disp, 0),\n                         vw::select_channel(cropped_disp, 1));\n    batchProc.doBatchProcessing(output_dispX, output_dispY);\n    \n    // Integrate back the processed bands.\n    vw::select_channel(cropped_disp, 0) = output_dispX;\n    vw::select_channel(cropped_disp, 1) = output_dispY;\n\n    return prerasterize_type(cropped_disp, -biased_box.min().x(), -biased_box.min().y(),\n                             cols(), rows());\n  }\n  \n  template <class DestT>\n  inline void rasterize(DestT const& dest, vw::BBox2i bbox) const {\n    vw::rasterize(prerasterize(bbox), dest, bbox);\n  }\n};\n\nGotchaPerBlockView gotcha_refine(vw::ImageViewRef<vw::PixelMask<vw::Vector2f>> input_disp,\n                                 vw::ImageViewRef<float> left_img,\n                                 vw::ImageViewRef<float> right_img,\n                                 int padding, std::string const& casp_go_param_file){\n  return GotchaPerBlockView(input_disp, left_img, right_img, padding, casp_go_param_file);\n}\n\n} // end namespace gotcha\n\n#endif // ASP_GOTCHA_CBATCHPROC_H\n"
  },
  {
    "path": "src/asp/Gotcha/CDensify.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Gotcha/CDensify.h>\n#include <asp/Gotcha/ALSC.h>\n\n#include <fstream>\n#include <iostream>\n#include <cmath>\n\nusing namespace std;\nusing namespace cv;\n\nnamespace gotcha {\n\nCDensify::CDensify(){}\n\nCDensify::CDensify(CDensifyParam paramDense, std::vector<CTiePt> const& vecTPs,\n                   cv::Mat imgL, cv::Mat imgR,\n                   cv::Mat input_dispX, cv::Mat input_dispY, cv::Mat Mask){\n  setParameters(paramDense, vecTPs, imgL, imgR, input_dispX, input_dispY, Mask);\n}\n\nvoid CDensify::setParameters(CDensifyParam paramDense, std::vector<CTiePt> const& vecTPs,\n                             cv::Mat imgL, cv::Mat imgR,\n                             cv::Mat input_dispX, cv::Mat input_dispY, cv::Mat Mask){\n  m_paramDense  = paramDense;\n  m_vecTPs      = vecTPs;\n  m_imgL        = imgL;\n  m_imgR        = imgR;\n  m_input_dispX = input_dispX;\n  m_input_dispY = input_dispY;\n  m_Mask        = Mask;\n  \n  // loadImages();\n  // m_nCount = 0;\n  // cout << m_paramDense.m_paramGotcha.m_paramALSC.m_fEigThr<< endl;\n}\n\n\n#if 0\nvoid CDensify::loadImages(){\n  string strImgL, strImgR;\n  // get input images\n  strImgL = m_paramDense.m_strImgL;\n  strImgR = m_paramDense.m_strImgR;\n  setImages(strImgL, strImgR);\n}\n#endif\n\n#if 0\nbool CDensify::loadTPForDensification(string strTPFile){    \n    bool bRes = true;\n    bRes = loadTP(strTPFile);\n    return bRes;\n}\n#endif\n\nint CDensify::performDensitification(cv::Mat & output_dispX, cv::Mat & output_dispY){\n\n    ///////////////////////////////////////////\n    // validate the input images\n    ///////////////////////////////////////////\n    if ( m_imgL.data == NULL || m_imgR.data == NULL)\n        return CDensifyParam::FILE_IO_ERR;\n\n#if 0\n    // TP are now kept in memory the whole time, so no need to load them\n    if (!loadTPForDensification(m_paramDense.m_strTPFile))\n        return CDensifyParam::FILE_IO_ERR;\n#endif\n    \n    if(m_paramDense.m_nProcType == CDensifyParam::GOTCHA){\n        double start = getTickCount();\n        // Generate integer-float seed points (nb. feature detection only gives float-float seed points)\n        // Also, this is necessary to keep the original seed data, as initial ALSC will remove some seeds if selected.\n\n        //Function below run initial ALSC on disparity based TPs. If use, need to change:\n        //1. doGotcha(m_imgL, m_imgR, vecSeedTemp, m_paramDense.m_paramGotcha, m_vectpAdded)\n        //2. m_vectpAdded.insert(m_vectpAdded.end(), vecSeedTemp.begin(), vecSeedTemp.end());\n        //3. need some change in doPGotcha\n        //IMARS still need initial ALSC\n        vector<CTiePt> vecSeedTemp = getIntToFloatSeed(m_vecTPs);\n        m_vecTPs.clear();\n        for (int j = 0; j < (int)vecSeedTemp.size(); j++){\n            CTiePt tpTemp = vecSeedTemp.at(j);\n            m_vecTPs.push_back(tpTemp);\n        }\n        //IMARS still need initial ALSC\n\n\n\n        //cout << \"CASP-GO INFO: starting Gotcha\" << endl;\n        if (!doGotcha(m_imgL, m_imgR, m_vecTPs, m_paramDense.m_paramGotcha, m_vectpAdded))\n            return CDensifyParam::GOTCHA_ERR;\n        // remove TP with large y disparity\n        // nb. sometimes large y disparity can be produced even from a rectified pair\n\n        double dYLimit = 100;\n        vector<CTiePt>::iterator iter;\n        for (iter = m_vectpAdded.begin(); iter < m_vectpAdded.end(); ){\n            double dy = iter->m_ptL.y - iter->m_ptR.y;\n            dy = sqrt(dy*dy);\n            if (dy > dYLimit)\n                m_vectpAdded.erase(iter);\n            else\n                iter++;\n        }\n\n        m_vectpAdded.insert(m_vectpAdded.end(), m_vecTPs.begin(), m_vecTPs.end());\n\n        double end = getTickCount();\n        procTime = (end - start)/getTickFrequency();\n\n        //cout << \"CASP-GO INFO: making data products\" << endl;\n\n        makeDataProducts();\n\n        if (!saveResult(output_dispX, output_dispY))\n            return CDensifyParam::FILE_IO_ERR;\n\n        // Do not save the log, this is hard to manage with multiple instances\n        // running in parallel.\n        //if (!saveLog())\n        //    return CDensifyParam::FILE_IO_ERR;\n\n    }\n    else if (m_paramDense.m_nProcType == CDensifyParam::P_GOTCHA){\n        double start = getTickCount();\n        if (!doPGotcha(m_paramDense.m_paramGotcha.m_nNeiType))\n            return CDensifyParam::P_GOTCHA_ERR;\n        // remove TP with large y disparity\n\n        double dYLimit = 100; //IMARS\n        vector<CTiePt>::iterator iter;\n        for (iter = m_vectpAdded.begin(); iter < m_vectpAdded.end(); ){\n            double dy = iter->m_ptL.y - iter->m_ptR.y;\n            dy = sqrt(dy*dy);\n            if (dy > dYLimit)\n                m_vectpAdded.erase(iter);\n            else\n                iter++;\n        }\n\n        m_vectpAdded.insert(m_vectpAdded.end(), m_vecTPs.begin(), m_vecTPs.end());\n\n        double end = getTickCount();\n        procTime = (end - start)/getTickFrequency();\n        makeDataProducts();\n\n        if (!saveResult(output_dispX, output_dispY))\n            return CDensifyParam::FILE_IO_ERR;\n\n        // Do not save the log, this is hard to manage with multiple instances\n        // running in parallel.\n        //if (!saveLog())\n        //    return CDensifyParam::FILE_IO_ERR;\n    }\n\n    return CDensifyParam::NO_ERR;\n}\n\nvector<CTiePt> CDensify::getIntToFloatSeed(vector<CTiePt>& vecTPSrc) {\n    vector<CTiePt> vecRes;\n\n    int nLen =  vecTPSrc.size();\n    for (int i = 0; i < nLen; i++){\n        //get four neighbours\n        CTiePt tp = vecTPSrc.at(i);\n        Point2f ptL = tp.m_ptL;\n        Point2f ptR = tp.m_ptR;\n        float dX = 0, dY = 0; // xy offset to make integer seed\n\n        dX = floor(ptL.x) - ptL.x;\n        dY = floor(ptL.y) - ptL.y;\n        if (dX == 0 && dY == 0){\n            vecRes.push_back(tp);\n            continue;\n        }\n\n        Point2f ptDelta(dX,dY);\n        Point2f ptIntL = ptL + ptDelta; // ptIntL may be in float if ptL is came from the Rectified coordinate\n        Point2f ptIntR = ptR + ptDelta;\n\n        /////////////////////////////////////////////////////\n        // collect 4 integer seed and validate\n        /////////////////////////////////////////////////////\n        CTiePt tpTemp = tp;\n        vector<CTiePt> vectpSeeds;\n        // pt1 (top-left)\n        tpTemp.m_ptL = ptIntL;\n        tpTemp.m_ptR = ptIntR;\n        vectpSeeds.push_back(tpTemp);\n        // pt2 (top-right)\n        tpTemp.m_ptL = ptIntL + Point2f(1, 0);\n        tpTemp.m_ptR = ptIntR + Point2f(1, 0);\n        vectpSeeds.push_back(tpTemp);\n\n        // pt3 (bottom-left)\n        tpTemp.m_ptL = ptIntL + Point2f(0, 1);\n        tpTemp.m_ptR = ptIntR + Point2f(0, 1);\n        vectpSeeds.push_back(tpTemp);\n\n        // pt 4 (bottom-right)    \n        tpTemp.m_ptL = ptIntL + Point2f(1, 1);\n        tpTemp.m_ptR = ptIntR + Point2f(1, 1);\n        vectpSeeds.push_back(tpTemp);\n\n        //apply ALSC to collect as new seed\n        ALSC alsc(m_imgL, m_imgR,  m_paramDense.m_paramGotcha.m_paramALSC);\n        alsc.performALSC(&vectpSeeds);\n        vectpSeeds.clear();\n        alsc.getRefinedTps(vectpSeeds); // hard-copy\n\n        for (int j = 0; j < (int)vectpSeeds.size(); j++){\n            CTiePt tpRef = vectpSeeds.at(j);\n            if (tpRef.m_fSimVal != CTiePt::NOT_DEF){\n                vecRes.push_back(tpRef);\n            }\n        }\n    }\n\n    return vecRes;\n}\n\nbool CDensify::saveProjLog(string strFile){\n\n  return true;\n#if 0\n  std::cout << \"Writing log \" << strFile << std::endl;\n  bool bRes = false;\n  ofstream sfLog;\n  sfLog.open(strFile.c_str(), ios::app | ios::out);\n  string strProcType = getProcType();\n  \n  if (sfLog.is_open()){\n    sfLog << \"<Project I/O>\" << endl;\n    sfLog << \"Input left image path: \" << m_paramDense.m_strImgL << endl;\n    sfLog << \"Input right image path: \" << m_paramDense.m_strImgR << endl;\n    sfLog << \"Processing type: \" << strProcType << endl;\n    \n    sfLog << \"Input x disparity map path: \" << m_paramDense.m_strDispX << endl;\n    sfLog << \"Input y disparity map path: \" << m_paramDense.m_strDispY << endl;\n    sfLog << \"Output tie-point file (from disparity) path: \" << m_paramDense.m_strTPFile << endl;\n    sfLog << \"Input/output mask file path: \" << m_paramDense.m_paramGotcha.m_strMask << endl;\n    sfLog << \"Output x disparity map path: \" << m_paramDense.m_strUpdatedDispX << endl;\n    sfLog << \"Output y disparity map path: \" << m_paramDense.m_strUpdatedDispY << endl;\n    sfLog << endl;\n    sfLog.close();\n    bRes = true;\n  }\n  else\n    return bRes = false;\n  \n  return bRes;\n#endif\n  \n}\n\nbool CDensify::saveLog(){\n  return true;\n#if 0\n  string FILE_LOG = \"-GLog.txt\";\n\n  string strFile = m_paramDense.m_strOutPath + FILE_LOG;\n  bool bRes = false;\n  \n  // save parameter log\n  //bRes = saveProjLog(strFile);\n  bRes = saveGOTCHAParam(m_paramDense.m_paramGotcha, strFile);\n  bRes = bRes && saveALSCParam(m_paramDense.m_paramGotcha.m_paramALSC, strFile);\n  // save result log\n  bRes = bRes && saveResLog(strFile);\n  \n  return bRes;\n#endif\n}\n\nbool CDensify::saveResLog(string strFile){\n  return true;\n#if 0\n    bool bRes = false;\n    int nNumFinalTPs = nNumSeedTPs+m_vectpAdded.size();\n    ofstream sfLog;\n    sfLog.open(strFile.c_str(), ios::app | ios::out);\n\n    if (sfLog.is_open()){\n        sfLog << \"<Processing results>\" << endl;\n        sfLog << \"Processing method: \" << m_paramDense.getProcessingType() << endl;\n        sfLog << \"Total number of seed TPs: \" << nNumSeedTPs << endl;\n        sfLog << \"Total number of final TPs: \" << nNumFinalTPs << endl;\n        sfLog << \"Total processing time(sec): \" << procTime << endl;\n        sfLog << endl;\n        sfLog << endl;\n        sfLog.close();\n        bRes = true;\n    }\n    else\n        return bRes = false;\n\n    return bRes;\n#endif\n}\n\nvoid CDensify::makeDataProducts(){\n\n    // prepare output data product from the list of densified tiepoints    \n    // make output products (disparity map x,y and sim)\n    int nW = m_imgL.cols;\n    int nH = m_imgL.rows;\n\n    // clear&initialise output buffers\n    m_matDisMapX = Mat::ones(nH, nW, CV_32FC1)*0.0;\n    m_matDisMapY = Mat::ones(nH, nW, CV_32FC1)*0.0;\n    m_matDisMapSim = Mat::ones(nH, nW, CV_32FC1)*-1;\n\n    // fill the disparity map\n    int nLen = m_vectpAdded.size();\n    for (int i = 0 ; i < nLen; i++){\n        CTiePt tp = m_vectpAdded.at(i);\n        Point2f ptL = tp.m_ptL;\n        Point2f ptR = tp.m_ptR;\n        float fSim = tp.m_fSimVal;\n\n        int x = (int) ptL.x;\n        int y = (int) ptL.y;\n        Rect_<int> rect(0,0,nW,nH);\n        if (rect.contains(Point2i(x,y))) {\n            m_matDisMapX.at<float>(y,x) = ptR.x - x;\n            m_matDisMapY.at<float>(y,x) = ptR.y - y;\n            m_matDisMapSim.at<float>(y,x) = fSim;\n        }\n    }        \n}\n\n\nbool CDensify::saveResult(cv::Mat & output_dispX, cv::Mat & output_dispY){\n\n    bool bRes = true;\n\n    //string strFile = m_paramDense.m_strTPFile;\n    //bRes = saveTP(m_vectpAdded, strFile);\n    \n    //cout << \"Writing results...\" << endl;\n\n    output_dispX = Mat::ones(m_matDisMapX.size(), CV_32FC1)*0.0;\n    output_dispY = Mat::ones(m_matDisMapY.size(), CV_32FC1)*0.0;\n\n    for (int i =0; i<output_dispX.rows; i++){\n        for (int j=0; j<output_dispX.cols; j++){\n            if (m_matDisMapX.at<float>(i,j)!= 0.0){ //-3.40282346639e+038\n                float disp = m_matDisMapX.at<float>(i,j);\n                output_dispX.at<float>(i,j)=disp;\n            }\n        }\n    }\n\n    for (int i =0; i<output_dispY.rows; i++){\n        for (int j=0; j<output_dispY.cols; j++){\n            if (m_matDisMapY.at<float>(i,j)!= 0.0){\n                float disp = m_matDisMapY.at<float>(i,j);\n                output_dispY.at<float>(i,j)=disp;\n            }\n        }\n    }\n\n    //Mat m_input_dispX = imread(m_paramDense.m_strDispX, CV_LOAD_IMAGE_ANYDEPTH);\n    //Mat m_input_dispY = imread(m_paramDense.m_strDispY, CV_LOAD_IMAGE_ANYDEPTH);\n    //std::cout << \"Reading mask: \" << m_paramDense.m_strMask << std::endl;\n    //Mat Mask = imread(m_paramDense.m_strMask, CV_LOAD_IMAGE_ANYDEPTH);\n    //Mask.convertTo(Mask, CV_8UC1);\n    nNumSeedTPs = 0;\n\n    if (m_input_dispX.depth()==2 && m_input_dispY.depth()==2){\n        for (int i=0; i<m_input_dispX.rows; i++){\n            for (int j=0; j<m_input_dispX.cols; j++){\n                if (m_Mask.at<uchar>(i,j)==1){\n                    m_input_dispX.at<ushort>(i,j)=65535;\n                    m_input_dispY.at<ushort>(i,j)=65535;\n                }\n            }\n        }\n    }\n    else if (m_input_dispX.depth()==5 && m_input_dispY.depth()==5){\n        for (int i=0; i<m_input_dispX.rows; i++){\n            for (int j=0; j<m_input_dispX.cols; j++){\n                if (m_Mask.at<uchar>(i,j)==1){\n                    m_input_dispX.at<float>(i,j)= 0.0;\n                    m_input_dispY.at<float>(i,j)= 0.0;\n                }\n            }\n        }\n    }\n\n    if (m_input_dispX.depth()==2 && m_input_dispY.depth()==2){\n        for (int i=0; i<m_input_dispX.rows; i++){\n            for (int j=0; j<m_input_dispX.cols; j++){\n                if (m_input_dispX.at<ushort>(i,j)!=65535 && m_input_dispY.at<ushort>(i,j)!=65535)\n                    nNumSeedTPs+=1;\n            }\n        }\n    }\n    else if (m_input_dispX.depth()==5 && m_input_dispY.depth()==5){\n        for (int i=0; i<m_input_dispX.rows; i++){\n            for (int j=0; j<m_input_dispX.cols; j++){\n                if (m_input_dispX.at<float>(i,j)!= 0.0 && m_input_dispY.at<float>(i,j)!= 0.0)\n                    nNumSeedTPs+=1;\n            }\n        }\n    }\n\n\n    //Recover values of original disp map\n    if (m_input_dispX.depth()==2 && m_input_dispY.depth()==2){\n        for (int i =0; i<output_dispX.rows; i++){\n            for (int j=0; j<output_dispX.cols; j++){\n                if (m_input_dispX.at<ushort>(i,j)!=65535)\n                    output_dispX.at<ushort>(i,j)=m_input_dispX.at<ushort>(i,j);\n                if (m_input_dispY.at<ushort>(i,j)!=65535)\n                    output_dispY.at<ushort>(i,j)=m_input_dispY.at<ushort>(i,j);\n            }\n        }\n    }\n    else if (m_input_dispX.depth()==5 && m_input_dispY.depth()==5){\n        for (int i =0; i<output_dispX.rows; i++){\n            for (int j=0; j<output_dispX.cols; j++){\n                if (m_input_dispX.at<float>(i,j)!= 0.0){  //IMARS\n                    float disp = m_input_dispX.at<float>(i,j); //IMARS\n                    output_dispX.at<float>(i,j)=disp; //IMARS\n                }\n                if (m_input_dispY.at<float>(i,j)!= 0.0){  //IMARS\n                    float disp = m_input_dispY.at<float>(i,j);  //IMARS\n                    output_dispY.at<float>(i,j)=disp; //IMARS\n                }\n            }\n        }\n    }\n    //Cancelled in IMARS, since using sGotcha, we have whole map.\n\n#if 0\n    // The outputs are now passed out rather than saved to disk\n    \n    string strFileC1 = m_paramDense.m_strUpdatedDispX;\n    bRes = bRes && saveMatrix(output_dispX, strFileC1);\n    //imwrite(strFile, output_dispX);\n    string strFileC2 = m_paramDense.m_strUpdatedDispY;\n    bRes = bRes && saveMatrix(output_dispY, strFileC2);\n    //imwrite(strFile, output_dispY);\n\n    // Do not write this file as it is not used. If needed, such a\n    // file must be written for every tile ASP processes.\n    string strFileC3 = m_paramDense.m_strUpdatedDispSim;\n    std::cout << \"Saving matrix: \" << strFileC3 << std::endl;\n    bRes = bRes && saveMatrix(m_matDisMapSim, strFileC3);\n\n    string strC1Tiff = \"-c1_refined.tif\";\n    string strC2Tiff = \"-c2_refined.tif\";\n    string strC3Tiff = \"-uncertainty.tif\";\n    \n    string strFileC1Tiff = m_paramDense.m_strOutPath + strC1Tiff;\n    string strFileC2Tiff = m_paramDense.m_strOutPath + strC2Tiff;\n    string strFileC3Tiff = m_paramDense.m_strOutPath + strC3Tiff;\n    \n    ostringstream strCmdGdalConversionC1;\n    strCmdGdalConversionC1 << \"gdal_translate \" << strFileC1 << \" -of GTiff \" << strFileC1Tiff;\n    std::cout << strCmdGdalConversionC1.str() << std::endl;\n    system(strCmdGdalConversionC1.str().c_str());\n\n    ostringstream strCmdGdalConversionC2;\n    strCmdGdalConversionC2 << \"gdal_translate \" << strFileC2 << \" -of GTiff \" << strFileC2Tiff;\n    std::cout << strCmdGdalConversionC2.str() << std::endl;\n    system(strCmdGdalConversionC2.str().c_str());\n\n    ostringstream strCmdGdalConversionC3;\n    strCmdGdalConversionC3 << \"gdal_translate \" << strFileC3 << \" -of GTiff \" << strFileC3Tiff;\n    std::cout << strCmdGdalConversionC3.str() << std::endl;\n    system(strCmdGdalConversionC3.str().c_str());\n#endif\n    \n    return bRes;\n}\n\nvoid CDensify::getNeighbour(const CTiePt tp, vector<CTiePt>& vecNeiTp, const int nNeiType, const Mat& matSim){\n    //\n    Point2f ptLeft = tp.m_ptL;\n    Point2f ptRight = tp.m_ptR;\n\n    if (nNeiType == CGOTCHAParam::NEI_DIFF){\n        getDisffusedNei(vecNeiTp, tp, matSim);\n    }\n    /*if(nNeiType == CGOTCHAParam::NEI_X || nNeiType == CGOTCHAParam::NEI_Y || nNeiType == CGOTCHAParam::NEI_4 || nNeiType == CGOTCHAParam::NEI_8)*/\n    else {\n        if (nNeiType == CGOTCHAParam::NEI_4  || nNeiType == CGOTCHAParam::NEI_Y || nNeiType == CGOTCHAParam::NEI_8){\n            CTiePt tp2;\n            tp2.m_ptL = ptLeft + Point2f(0,1);\n            tp2.m_ptR = ptRight + Point2f(0,1);\n            vecNeiTp.push_back(tp2);\n            tp2.m_ptL = ptLeft + Point2f(0,-1);\n            tp2.m_ptR = ptRight + Point2f(0,-1);\n            vecNeiTp.push_back(tp2);\n        }\n\n        if (nNeiType == CGOTCHAParam::NEI_X || nNeiType == CGOTCHAParam::NEI_4 || nNeiType == CGOTCHAParam::NEI_8){\n\n            CTiePt tp;\n            tp.m_ptL = ptLeft + Point2f(1,0);\n            tp.m_ptR = ptRight + Point2f(1,0);\n            vecNeiTp.push_back(tp);\n            tp.m_ptL = ptLeft + Point2f(-1,0);\n            tp.m_ptR = ptRight + Point2f(-1,0);\n            vecNeiTp.push_back(tp);\n        }\n\n        if (nNeiType == CGOTCHAParam::NEI_8){\n            CTiePt tp8;\n            tp8.m_ptL = ptLeft + Point2f(-1,-1);\n            tp8.m_ptR = ptRight + Point2f(-1,-1);\n            vecNeiTp.push_back(tp8);\n            tp8.m_ptL = ptLeft + Point2f(1,1);\n            tp8.m_ptR = ptRight + Point2f(1,1);\n            vecNeiTp.push_back(tp8);\n            tp8.m_ptL = ptLeft + Point2f(-1,1);\n            tp8.m_ptR = ptRight + Point2f(-1,1);\n            vecNeiTp.push_back(tp8);\n            tp8.m_ptL = ptLeft + Point2f(1,-1);\n            tp8.m_ptR = ptRight + Point2f(1,-1);\n            vecNeiTp.push_back(tp8);\n        }\n    }\n}\n\nvoid CDensify::getDisffusedNei(vector<CTiePt>& vecNeiTp, const CTiePt tp, const Mat& matSim){\n    // estimate the growth\n    // make a diffusion map\n    int nSzDiff = m_paramDense.m_paramGotcha.m_paramALSC.m_nPatch;//12\n    double pdDiffMap[nSzDiff*2+1][nSzDiff*2+1];\n    int nW = m_imgL.cols;//m_imgL.getMaxX()+1;//m_imgL.getWidth();\n    int nH = m_imgL.rows;//m_imgL.getMaxY()+1;//m_imgL.getHeight();\n    Rect rectRegion(0,0,nW, nH);\n\n    Point2f ptLeft = tp.m_ptL;\n    Point2f ptRight = tp.m_ptR;\n    for (int j = -nSzDiff ; j < nSzDiff + 1; j++){\n        for (int i = -nSzDiff ; i < nSzDiff + 1; i++){\n            double val = 0.f;\n            int nX = (int)floor(ptLeft.x+i);\n            int nY = (int)floor(ptLeft.y+j);\n            if (rectRegion.contains(Point(nX, nY)) &&\n                matSim.at<float>(nY, nX) > 0){\n                // assume sim value has been already normalised\n                val = 1.f - matSim.at<float>(nY, nX);// /m_paramDense.m_paramGotcha.m_paramALSC.m_fEigThr;\n            }\n            pdDiffMap[j+nSzDiff][i+nSzDiff] = val;\n        }\n    }\n\n    // heat diffusion equation\n    double dAlpha = m_paramDense.m_paramGotcha.m_fDiffCoef;// 0.05; // diffusion coefficient\n    double dThr = m_paramDense.m_paramGotcha.m_fDiffThr;// 0.1;\n    int nIter = m_paramDense.m_paramGotcha.m_nDiffIter;// 5;\n\n    int nRow = nSzDiff*2+1;\n    int nCol = nSzDiff*2+1;\n    double pdDiffMapNext[nRow][nCol];\n    double pdDiffMapCurrnet[nRow][nCol];\n\n    for(int j = 0 ; j < nRow; j++){\n        for(int i = 0; i < nCol; i++){\n            pdDiffMapCurrnet[j][i] = pdDiffMap[j][i];\n            pdDiffMapNext[j][i] = 0;\n        }\n    }\n\n    // define neighbours\n    for (int k = 0 ; k < nIter; k++){\n        // get diffused\n        double pdTemp[nRow][nCol];\n        for (int j = 1; j < nRow-1; j++){\n            for (int i = 1; i < nCol-1; i++){\n                pdDiffMapNext[j][i] = pdDiffMapCurrnet[j][i] + dAlpha *\n                                      (pdDiffMapCurrnet[j+1][i] + pdDiffMapCurrnet[j][i+1] +\n                                       pdDiffMapCurrnet[j-1][i] + pdDiffMapCurrnet[j][i-1] - 4*pdDiffMapCurrnet[j][i]);\n                pdTemp[j][i] = pdDiffMapNext[j][i];\n            }\n        }\n        for(int j = 1 ; j < nRow-1; j++){\n            for(int i = 1; i < nCol-1; i++){\n                pdDiffMapCurrnet[j][i] = pdTemp[j][i];\n            }\n        }\n    }\n\n    int count = 0;\n\n    for (int j = 1; j < nRow-1; j++){\n        for (int i = 1; i < nCol-1; i++){\n            if (pdDiffMapNext[j][i] > dThr) { //&& (i != nSzDiff && j != nSzDiff)){ // add as a neighbour\n                if (i == nSzDiff && j == nSzDiff) continue;\n                CTiePt tpNei;\n                tpNei.m_ptL.x = ptLeft.x + i - nSzDiff;\n                tpNei.m_ptL.y = ptLeft.y + j - nSzDiff;\n                tpNei.m_ptR.x = ptRight.x + i - nSzDiff;\n                tpNei.m_ptR.y = ptRight.y + j - nSzDiff;\n\n                vecNeiTp.push_back(tpNei);\n\n                count++;\n            }\n        }\n    }\n            // add minimum num of neighbours\n            CTiePt tp2;\n            tp2.m_ptL = ptLeft + Point2f(0,1);\n            tp2.m_ptR = ptRight + Point2f(0,1);\n            if (!isHavingTP(vecNeiTp, tp2))\n                vecNeiTp.push_back(tp2);\n\n            tp2.m_ptL = ptLeft + Point2f(0,-1);\n            tp2.m_ptR = ptRight + Point2f(0,-1);\n            if (!isHavingTP(vecNeiTp, tp2))\n                vecNeiTp.push_back(tp2);\n\n            //CTiePt tp3;\n            tp2.m_ptL = ptLeft + Point2f(1,0);\n            tp2.m_ptR = ptRight + Point2f(1,0);\n            if (!isHavingTP(vecNeiTp, tp2))\n                vecNeiTp.push_back(tp2);\n\n            tp2.m_ptL = ptLeft + Point2f(-1,0);\n            tp2.m_ptR = ptRight + Point2f(-1,0);\n            if (!isHavingTP(vecNeiTp, tp2))\n                vecNeiTp.push_back(tp2);\n}\n\nbool CDensify::isHavingTP(vector<CTiePt>& vecNeiTp, CTiePt tp){\n    bool bRes = false;\n    int nLen = vecNeiTp.size();\n    for (int i = 0; i < nLen; i++){\n        if (vecNeiTp.at(i) == tp){\n            bRes = true;\n            break;\n        }\n    }\n    return bRes;\n}\n\nvoid CDensify::removeOutsideImage(vector<CTiePt>& vecNeiTp, const Rect_<float> rectTileL, const Rect_<float> rectImgR){\n    vector<CTiePt>::iterator iter;\n\n    for (iter = vecNeiTp.begin(); iter < vecNeiTp.end(); ){\n\n        if (!rectTileL.contains(iter->m_ptL) || !rectImgR.contains(iter->m_ptR))\n            vecNeiTp.erase(iter);\n       else\n            iter++;\n    }\n\n}\n\nvoid CDensify::removePtInLUT(vector<CTiePt>& vecNeiTp, const vector<bool>& pLUT, const int nWidth){\n    vector<CTiePt>::iterator iter;\n\n    for (iter = vecNeiTp.begin(); iter < vecNeiTp.end(); ){        \n        int nX = (int)floor(iter->m_ptL.x);\n        int nY = (int)floor(iter->m_ptL.y);\n        //int nIdx = nY * m_imgL.cols + nX;\n        int nIdx = nY * nWidth + nX;\n\n        if (pLUT[nIdx])\n            vecNeiTp.erase(iter);\n        else\n            iter++;\n    }\n}\n\nvoid CDensify::makeTiles(vector< Rect_<float> >& vecRectTiles, int nMin){\n\n    vector< Rect_<float> >::iterator iter;\n    for (iter = vecRectTiles.begin(); iter < vecRectTiles.end(); ){\n        Rect_<float> rectParent = *iter;\n        if (rectParent.width/2 > nMin && rectParent.height/2 > nMin){\n            vecRectTiles.erase(iter);\n            vector< Rect_<float> > vecChild;\n            breakIntoSubRect(rectParent, vecChild);\n            vecRectTiles.insert(vecRectTiles.end(), vecChild.begin(),  vecChild.end());\n            iter = vecRectTiles.begin();\n        }\n        else\n            iter++;\n    }\n}\n\nvoid CDensify::breakIntoSubRect(Rect_<float> rectParent, vector< Rect_<float> >& vecRes){\n\n    float fHalfW = rectParent.width/2.f;\n    float fHalfH = rectParent.height/2.f;\n\n    Point2f ptTopLeft[4];\n    ptTopLeft[0] = Point2f(rectParent.x, rectParent.y);\n    ptTopLeft[1] = Point2f(rectParent.x+fHalfW, rectParent.y);\n    ptTopLeft[2] = Point2f(rectParent.x, rectParent.y+fHalfH);\n    ptTopLeft[3] = Point2f(rectParent.x+fHalfW, rectParent.y+fHalfH);\n\n    Size sz(fHalfW, fHalfH);\n    Rect_<float> rect(ptTopLeft[0], sz);\n    vecRes.push_back(rect);\n\n    sz = Size(rectParent.x+rectParent.width - ptTopLeft[1].x, fHalfH);\n    rect = Rect(ptTopLeft[1], sz);\n    vecRes.push_back(rect);\n\n    sz = Size(fHalfW, rectParent.y+rectParent.height - ptTopLeft[2].y);\n    rect = Rect(ptTopLeft[2], sz);\n    vecRes.push_back(rect);\n\n    sz = Size(rectParent.x+rectParent.width - ptTopLeft[3].x, rectParent.y+rectParent.height - ptTopLeft[3].y);\n    rect = Rect(ptTopLeft[3], sz);\n    vecRes.push_back(rect);\n\n}\n\n\nbool CDensify::doGotcha(const Mat& matImgL, const Mat& matImgR, vector<CTiePt>& vectpSeeds,\n                        const CGOTCHAParam& paramGotcha, vector<CTiePt>& vectpAdded){\n\n\n    bool bRes = true;\n    ////////////////////////////////////////////\n    // parameter preparation\n    // cout << \"CASP-GO INFO: initialisaing similarity map\" << endl;\n    Mat matSimMap = Mat::ones(matImgL.rows, matImgL.cols, CV_32FC1); // 2D similarity map for diffusion\n    matSimMap = matSimMap*-1;\n\n    // cout << \"DEBUG: matImgL has statistics: rows \" << matImgL.rows << \"; cols: \" << matImgL.cols << \"; channels: \" << matImgL.channels() << \"; bitdepth code: \" << matImgL.depth() << endl;\n\n    Size szImgL(matImgL.cols, matImgL.rows);\n    // cout << \"CASP-GO INFO: initialising pixel LUT\" << endl;\n\n    // IMARS bool pLUT[szImgL.area()]; // if true it indicates the pixel has already processed\n    vector<bool> pLUT; //IMARS\n\n    // initialise\n    for (int i = 0; i< szImgL.area(); i++){\n        bool bpLUT = false; //IMARS\n        pLUT.push_back(bpLUT); //IMARS\n    } //IMARS\n\n    vector< Rect_<float> > vecRectTiles;\n    vecRectTiles.push_back(Rect(0., 0., matImgL.cols, matImgL.rows));\n\n    // cout << \"CASP-GO INFO: Making tiles\" << endl;\n    makeTiles(vecRectTiles, paramGotcha.m_nMinTile);\n\n    if (paramGotcha.m_bNeedInitALSC){\n        // cout << \"CASP-GO INFO: Running initial ALSC refinement\" << endl;\n        ALSC alsc(matImgL, matImgR, paramGotcha.m_paramALSC);\n        alsc.performALSC(&vectpSeeds);\n        vectpSeeds.clear();\n        alsc.getRefinedTps(vectpSeeds); // hard-copy\n    }\n\n    // cout << \"CASP-GO INFO: initialise similarity map with seed points\" << endl;\n    // initialise sim map with seedpoitns\n    for (int i = 0; i < (int)vectpSeeds.size(); i++){\n        int nX =  (int)floor(vectpSeeds.at(i).m_ptL.x);\n        int nY =  (int)floor(vectpSeeds.at(i).m_ptL.y);\n        matSimMap.at<float>(nY, nX) = vectpSeeds.at(i).m_fSimVal;\n\n        int nIdx = nY*szImgL.width + nX;\n        pLUT[nIdx] = true;\n\n        //cout << \"DEBUG: pLUT change successfully to \" << pLUT[nIdx] << endl;\n    }\n\n    // cout << \"CASP-GO INFO: apply mask to remove area that no densification is required.\" << endl;\n    // apply mask, remove area where no densification is required\n    //std::cout << \"Reading mask: \" << paramGotcha.m_strMask << std::endl;\n    //Mat Mask = imread(paramGotcha.m_strMask, CV_LOAD_IMAGE_ANYDEPTH);\n    for (int i=0; i<m_Mask.rows; i++){\n        for (int j=0; j<m_Mask.cols; j++){\n            if (m_Mask.at<uchar>(i,j)==0){\n                int nIdx = i*m_Mask.cols + j;\n                pLUT[nIdx] = true;\n                //cout << \"DEBUG: pLUT change successfully to \" << pLUT[nIdx] << endl;\n            }\n        }\n    }\n\n    /////////////////////////\n    vectpAdded.clear();\n    //cout << \"CASP-GO INFO: Desifying disparity... ...\" << endl;\n\n    for (int i = 0 ; i < (int)vecRectTiles.size(); i++){\n          vector<CTiePt> vecRes;\n          bRes = bRes && doTileGotcha(matImgL, matImgR, vectpSeeds, paramGotcha, vecRes, vecRectTiles.at(i), matSimMap, pLUT);\n          // collect result\n          vectpAdded.insert(vectpAdded.end(), vecRes.begin(), vecRes.end());\n\n          // debug\n          //cout << \"Tile \" << i << \" has been processed: \" << vecRes.size() << \" points are added\" << endl;\n    }\n\n    return bRes;\n}\n\n\nbool CDensify::doTileGotcha(const Mat& matImgL, const Mat& matImgR, const\n                            vector<CTiePt>& vectpSeeds,\n                            const CGOTCHAParam& paramGotcha, vector<CTiePt>& vectpAdded,\n                            const Rect_<float> rectTileL, Mat& matSimMap, vector<bool>& pLUT){\n\n    vector<CTiePt> vectpSeedTPs; //= vectpSeeds;                // need this hard copy for sorting\n\n    Size szImgL(matImgL.cols, matImgL.rows);\n    Rect_<float> rectImgR (0, 0, matImgR.cols, matImgR.rows);\n    vectpAdded.clear(); //clear output tp list\n\n    // set indicator buffer\n    for (int i = 0 ; i < (int)vectpSeeds.size(); i++){\n        CTiePt tp = vectpSeeds.at(i);\n\n        if (rectTileL.contains(tp.m_ptL)){\n            vectpSeedTPs.push_back(tp);\n        }\n\n    }\n    //std::cout << \"Reading mask: \" << paramGotcha.m_strMask << std::endl;\n    //Mat Mask = imread(paramGotcha.m_strMask, CV_LOAD_IMAGE_ANYDEPTH);\n    Mat imgL = matImgL;\n    Mat imgR = matImgR;\n    imgL.convertTo(imgL, CV_8UC1);\n    imgR.convertTo(imgR, CV_8UC1);\n\n    unsigned int nGapSize = 0;\n    for (int i=0; i<m_Mask.rows; i++){\n        for (int j=0; j< m_Mask.cols; j++){\n          if (m_Mask.at<uchar>(i,j)==1 &&\n              imgL.at<uchar>(i,j)!=0 &&imgR.at<uchar>(i,j)!=0)\n                nGapSize+=1;\n        }\n    }\n\n    //sort(vectpSeedTPs.begin(), vectpSeedTPs.end(), compareTP); // sorted in ascending order\n    /////////////////////////////////////////////////////////////////////\n    // stereo region growing\n    //int nCount = 0; // for debug\n#if 0\n      // Hide the verbose messages\n      cout << \"[--------------------]  0% OF THE GAP AREA HAS BEEN DENSIFIED\\r\" << std::flush;\n#endif\n      \n    while (vectpSeedTPs.size() > 0) {\n        // get a point from seed\n        CTiePt tp = vectpSeedTPs.at(0);\n\n//        mvectpAdded.push_back(tp);\n        vectpSeedTPs.erase(vectpSeedTPs.begin());\n        vector<CTiePt> vecNeiTp;        \n        getNeighbour(tp, vecNeiTp, paramGotcha.m_nNeiType, matSimMap);\n        removeOutsideImage(vecNeiTp, rectTileL, rectImgR);\n        removePtInLUT(vecNeiTp, pLUT, matImgL.cols);\n\n        //ALSC\n        if ((int)vecNeiTp.size() > 0){            \n            // get affine data from a seed\n            float pfData[6] = {0, 0, 0, 0, 0, 0};\n            for (int k = 0; k < 4; k++)\n                pfData[k] = tp.m_pfAffine[k];\n            pfData[4] = tp.m_ptOffset.x;\n            pfData[5] = tp.m_ptOffset.y;\n\n            ALSC alsc(matImgL, matImgR, paramGotcha.m_paramALSC);\n\n            alsc.performALSC(&vecNeiTp, (float*) pfData);\n            const vector<CTiePt>* pvecRefTPtemp = alsc.getRefinedTps();\n\n            int nLen = pvecRefTPtemp->size();\n            if( nLen > 0){\n                // append survived neighbours to the seed point list and the seed LUT\n                // vector<CRefinedTP>::iterator iterNei;\n                for (int i = 0 ; i < nLen; i++){\n                    CTiePt tpNei = pvecRefTPtemp->at(i);\n\n                    int nXnei = (int)floor(tpNei.m_ptL.x);\n                    int nYnei = (int)floor(tpNei.m_ptL.y);\n                    int nIdxNei = nYnei*szImgL.width + nXnei;\n\n                    matSimMap.at<float>(nYnei,nXnei) = tpNei.m_fSimVal;                    \n                    pLUT[nIdxNei] = true;\n\n                    vectpSeedTPs.push_back(tpNei);\n                    vectpAdded.push_back(tpNei);\n                }\n\n                //sort(vectpSeedTPs.begin(), vectpSeedTPs.end(), compareTP);\n            } \n        }\n#if 0\n        // Hide the verbose messages\n        if (vectpAdded.size()>0){\n        if (vectpAdded.size() >= (nGapSize)/20 && vectpAdded.size() < 2*(nGapSize)/20)\n            cout << \"[*-------------------]  5% OF THE GAP AREA HAS BEEN DENSIFIED\\r\" << std::flush;\n        else if (vectpAdded.size() >= 2*(nGapSize)/20 && vectpAdded.size() < 3*(nGapSize)/20)\n            cout << \"[**------------------] 10% OF THE GAP AREA HAS BEEN DENSIFIED\\r\" << std::flush;\n        else if (vectpAdded.size() >= 3*(nGapSize)/20 && vectpAdded.size() < 4*(nGapSize)/20)\n            cout << \"[***-----------------] 15% OF THE GAP AREA HAS BEEN DENSIFIED\\r\" << std::flush;\n        else if (vectpAdded.size() >= 4*(nGapSize)/20 && vectpAdded.size() < 5*(nGapSize)/20)\n            cout << \"[****----------------] 20% OF THE GAP AREA HAS BEEN DENSIFIED\\r\" << std::flush;\n        else if (vectpAdded.size() >= 5*(nGapSize)/20 && vectpAdded.size() < 6*(nGapSize)/20)\n            cout << \"[*****---------------] 25% OF THE GAP AREA HAS BEEN DENSIFIED\\r\" << std::flush;\n        else if (vectpAdded.size() >= 6*(nGapSize)/20 && vectpAdded.size() < 7*(nGapSize)/20)\n            cout << \"[******--------------] 30% OF THE GAP AREA HAS BEEN DENSIFIED\\r\" << std::flush;\n        else if (vectpAdded.size() >= 7*(nGapSize)/20 && vectpAdded.size() < 8*(nGapSize)/20)\n            cout << \"[*******-------------] 35% OF THE GAP AREA HAS BEEN DENSIFIED\\r\" << std::flush;\n        else if (vectpAdded.size() >= 8*(nGapSize)/20 && vectpAdded.size() < 9*(nGapSize)/20)\n            cout << \"[********------------] 40% OF THE GAP AREA HAS BEEN DENSIFIED\\r\" << std::flush;\n        else if (vectpAdded.size() >= 9*(nGapSize)/20 && vectpAdded.size() < 10*(nGapSize)/20)\n            cout << \"[*********-----------] 45% OF THE GAP AREA HAS BEEN DENSIFIED\\r\" << std::flush;\n        else if (vectpAdded.size() >= 10*(nGapSize)/20 && vectpAdded.size() < 11*(nGapSize)/20)\n            cout << \"[**********----------] 50% OF THE GAP AREA HAS BEEN DENSIFIED\\r\" << std::flush;\n        else if (vectpAdded.size() >= 11*(nGapSize)/20 && vectpAdded.size() < 12*(nGapSize)/20)\n            cout << \"[***********---------] 55% OF THE GAP AREA HAS BEEN DENSIFIED\\r\" << std::flush;\n        else if (vectpAdded.size() >= 12*(nGapSize)/20 && vectpAdded.size() < 13*(nGapSize)/20)\n            cout << \"[************--------] 60% OF THE GAP AREA HAS BEEN DENSIFIED\\r\" << std::flush;\n        else if (vectpAdded.size() >= 13*(nGapSize)/20 && vectpAdded.size() < 14*(nGapSize)/20)\n            cout << \"[*************-------] 65% OF THE GAP AREA HAS BEEN DENSIFIED\\r\" << std::flush;\n        else if (vectpAdded.size() >= 14*(nGapSize)/20 && vectpAdded.size() < 15*(nGapSize)/20)\n            cout << \"[**************------] 70% OF THE GAP AREA HAS BEEN DENSIFIED\\r\" << std::flush;\n        else if (vectpAdded.size() >= 15*(nGapSize)/20 && vectpAdded.size() < 16*(nGapSize)/20)\n            cout << \"[***************-----] 75% OF THE GAP AREA HAS BEEN DENSIFIED\\r\" << std::flush;\n        else if (vectpAdded.size() >= 16*(nGapSize)/20 && vectpAdded.size() < 17*(nGapSize)/20)\n            cout << \"[****************----] 80% OF THE GAP AREA HAS BEEN DENSIFIED\\r\" << std::flush;\n        else if (vectpAdded.size() >= 17*(nGapSize)/20 && vectpAdded.size() < 18*(nGapSize)/20)\n            cout << \"[*****************---] 85% OF THE GAP AREA HAS BEEN DENSIFIED\\r\" << std::flush;\n        else if (vectpAdded.size() >= 18*(nGapSize)/20 && vectpAdded.size() < 19*(nGapSize)/20)\n            cout << \"[******************--] 90% OF THE GAP AREA HAS BEEN DENSIFIED\\r\" << std::flush;\n        else if (vectpAdded.size() >= 19*(nGapSize)/20 && vectpAdded.size() < 20*(nGapSize)/20)\n            cout << \"[*******************-] 95% OF THE GAP AREA HAS BEEN DENSIFIED\\r\" << std::flush;\n        else if (vectpAdded.size() == nGapSize)\n          cout << \"[********************]100% OF THE GAP AREA HAS BEEN DENSIFIED\";\n        }\n#endif\n    }\n#if 0\n    cout << endl;\n#endif\n    \n    return true;\n}\n\nbool CDensify::doPGotcha(int nNeiType){\n\n    // pyramid construction\n    int nTotLev = getTotPyramidLev(m_paramDense.m_paramGotcha.m_paramALSC.m_nPatch);\n    vector<Mat> vecImgPyL;\n    vector<Mat> vecImgPyR;\n    buildPyramid(m_imgL, vecImgPyL, nTotLev);\n    buildPyramid(m_imgR, vecImgPyR, nTotLev);\n\n    vector<CTiePt> vecOrgSeedClone = getIntToFloatSeed(m_vecTPs);\n    if (m_paramDense.m_paramGotcha.m_bNeedInitALSC){\n        ALSC alsc(m_imgL, m_imgR, m_paramDense.m_paramGotcha.m_paramALSC);\n        alsc.performALSC(&vecOrgSeedClone);\n        vecOrgSeedClone.clear();\n        alsc.getRefinedTps(vecOrgSeedClone); // hard-copy\n    }\n\n    CGOTCHAParam paramG = m_paramDense.m_paramGotcha;\n    paramG.m_nNeiType = nNeiType;\n    paramG.m_bNeedInitALSC = true;\n\n    float fTempLim = m_paramDense.m_paramGotcha.m_paramALSC.m_fEigThr;\n    int nTempSz = m_paramDense.m_paramGotcha.m_paramALSC.m_nPatch;\n    float fMinRate = 0.3f;\n    float fMinRatePatch = 0.5f;\n\n    vector<CTiePt> vecAddedTemp; // addition from previous level\n    bool bRes = true;\n    for (int i = nTotLev-1; i >= 0; i--){\n\n        // prepare new processing param at level i\n        paramG.m_paramALSC.m_nPatch = (int)(nTempSz * (1.f - fMinRatePatch * i/(nTotLev-1)));\n        paramG.m_paramALSC.m_fEigThr = fTempLim * (1.f + fMinRate * i/(nTotLev-1));\n\n        // prepare seed for current level\n        vector<CTiePt> vecSeedTemp;\n        float fDenom = pow(2.f, i);\n        int nLen = vecOrgSeedClone.size();\n        for (int j = 0; j < nLen; j++){\n            CTiePt tp;\n            tp = vecOrgSeedClone.at(j);\n            tp.m_ptL.x = tp.m_ptL.x / fDenom;\n            tp.m_ptL.y = tp.m_ptL.y / fDenom;\n            tp.m_ptR.x = tp.m_ptR.x / fDenom;\n            tp.m_ptR.y = tp.m_ptR.y / fDenom;\n            for (int k = 0; k < 4 ; k++)\n                tp.m_pfAffine[k] = 0.;\n            tp.m_ptOffset.x = tp.m_ptOffset.x / fDenom;\n            tp.m_ptOffset.y = tp.m_ptOffset.y / fDenom;\n            vecSeedTemp.push_back(tp);\n        }\n\n        // added point propagated points\n        nLen = vecAddedTemp.size();\n        for (int j = 0; j < nLen; j++){\n            vecAddedTemp.at(j).m_ptL.x *= 2.f;\n            vecAddedTemp.at(j).m_ptL.y *= 2.f;\n            vecAddedTemp.at(j).m_ptR.x *= 2.f;\n            vecAddedTemp.at(j).m_ptR.y *= 2.f;\n            for (int k = 0; k < 4 ; k++)\n                vecAddedTemp.at(j).m_pfAffine[k] = 0.;\n            vecAddedTemp.at(j).m_ptOffset.x *= 2.f;\n            vecAddedTemp.at(j).m_ptOffset.y *= 2.f;\n        }\n\n        if (nLen > 0){\n            ALSC alsc(vecImgPyL.at(i), vecImgPyR.at(i), paramG.m_paramALSC);\n            alsc.performALSC(&vecAddedTemp);\n            vecAddedTemp.clear();\n            alsc.getRefinedTps(vecAddedTemp); // hard-copy\n        }\n\n        vector<CTiePt> seedIn;\n        seedIn.insert(seedIn.end(), vecSeedTemp.begin(), vecSeedTemp.end() );\n        seedIn.insert(seedIn.end(), vecAddedTemp.begin(), vecAddedTemp.end());\n        vecSeedTemp.clear();\n\n        // debug\n        //cout << \"# seed pts at the \" << i << \" level\" << \": \" << seedIn.size() << endl;\n\n        vector<CTiePt> vecResTemp;\n        bRes = bRes && doGotcha(vecImgPyL.at(i), vecImgPyR.at(i), seedIn, paramG, vecResTemp);\n        vecAddedTemp.insert(vecAddedTemp.end(), vecResTemp.begin(), vecResTemp.end());\n\n        // debug\n        // cout << \"# added pts at the \" << i << \" level\" << \": \" << vecResTemp.size() << endl;\n    }\n\n    m_vectpAdded.clear();\n    m_vectpAdded.insert(m_vectpAdded.end(), vecOrgSeedClone.begin(), vecOrgSeedClone.end());\n//    m_vectpAdded.insert(m_vectpAdded.end(), m_vecTPs.begin(), m_vecTPs.end());\n    m_vectpAdded.insert(m_vectpAdded.end(), vecAddedTemp.begin(), vecAddedTemp.end());\n\n    return bRes;\n}\n\nint CDensify::getTotPyramidLev(int nszPatch) {\n    int nRes = 0;\n\n    Size szImgL(m_imgL.cols, m_imgL.rows);\n    Size szImgR(m_imgR.cols, m_imgR.rows);\n    int nW = 0, nH = 0;\n\n    // get smallest size of width\n    nW = min(szImgL.width, szImgR.width);\n    nH = min(szImgL.height, szImgR.height);\n\n    int nMinSz = 4*(nszPatch * 2 + 1);\n    Size szMin(nMinSz,nMinSz);\n\n    // estimate the minimum of the largest levels\n    while(nW > szMin.width || nH > szMin.height){\n        nW /= 2;\n        nH /= 2;\n        nRes++;\n    }\n\n    return nRes;\n}\n\n} // end namespace gotcha\n"
  },
  {
    "path": "src/asp/Gotcha/CDensify.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#ifndef ASP_GOTCHA_CDENSIFY_H\n#define ASP_GOTCHA_CDENSIFY_H\n\n#include <asp/Gotcha/CProcBlock.h>\n#include <asp/Gotcha/CDensifyParam.h>\n\n#include <opencv2/opencv.hpp>\n#include <opencv2/highgui/highgui.hpp>\n#include <opencv2/imgproc/imgproc.hpp>\n#include <opencv2/calib3d/calib3d.hpp>\n\n#include <fstream>\n#include <iostream>\n#include <ostream>\n#include <stdio.h>\n#include <stdlib.h>\n#include <termios.h>\n\nnamespace gotcha {\n\nclass CDensify: public CProcBlock {\npublic:\n  CDensify();\n  CDensify(CDensifyParam paramDense, std::vector<CTiePt> const& vecTPs,\n           cv::Mat imgL, cv::Mat imgR,\n           cv::Mat input_dispX, cv::Mat input_dispY, cv::Mat Mask);\n\n  void setParameters(CDensifyParam paramDense, std::vector<CTiePt> const& vecTPs,\n                     cv::Mat imgL, cv::Mat imgR,\n                     cv::Mat input_dispX, cv::Mat input_dispY, cv::Mat Mask);\n  \n    int performDensitification(cv::Mat & output_dispX, cv::Mat & cv_output_dispY);\n    int getNumTotTps() const {return m_vectpAdded.size();}\n    static bool compareTP(CTiePt tpX, CTiePt tpY){\n        return (tpX.m_fSimVal < tpY.m_fSimVal);\n    }\n\n    std::string getProcType(){\n        return \"GOTCHA_FROM_DISP\";\n    }\nprivate:\n    //void loadImages();\n    std::vector<CTiePt> getIntToFloatSeed(std::vector<CTiePt>& vecTPSrc); // get integer Seed point pairs from a float seed point pair\n    bool doGotcha(const cv::Mat& matImgL, const cv::Mat& matImgR, std::vector<CTiePt>& vectpSeeds,\n                  const CGOTCHAParam& paramGotcha, std::vector<CTiePt>& vectpAdded);\n    bool doTileGotcha(const cv::Mat& matImgL, const cv::Mat& matImgR, const std::vector<CTiePt>& vectpSeeds,\n                      const CGOTCHAParam& paramGotcha, std::vector<CTiePt>& mvectpAdded,\n                      const cv::Rect_<float> rectTileL, cv::Mat& matSimMap, std::vector<bool>& pLUT); //IMARS\n    void removePtInLUT(std::vector<CTiePt>& vecNeiTp, const std::vector<bool>& pLUT, const int nWidth); //IMARS\n    void removeOutsideImage(std::vector<CTiePt>& vecNeiTp, const cv::Rect_<float> rectTileL, const cv::Rect_<float> rectImgR);\n    void getNeighbour(const CTiePt tp, std::vector<CTiePt>& vecNeiTp, const int nNeiType, const cv::Mat& matSim);\n    void getDisffusedNei(std::vector<CTiePt>& vecNeiTp, const CTiePt tp, const cv::Mat& matSim);\n    void breakIntoSubRect(cv::Rect_<float> rectParent, std::vector< cv::Rect_<float> >& vecRes);\n    void makeTiles(std::vector< cv::Rect_<float> >& vecRectTiles, int nMin);\n    bool isHavingTP(std::vector<CTiePt>& vecNeiTp, CTiePt tp); // used in diffused neighbour\n    bool doPGotcha(int nNeiType);\n    int getTotPyramidLev(int nszPatch);\n    void makeDataProducts();\n    bool saveResult(cv::Mat & output_dispX, cv::Mat & cv_output_dispY);\n    bool saveProjLog (std::string strFile);\n    bool saveLog();\n    bool saveResLog(std::string strFile);\n    bool loadTPForDensification(std::string strTPFile);\n\nprivate:\n  // inputs\n  CDensifyParam m_paramDense;\n  cv::Mat m_imgL, m_imgR;\n  cv::Mat m_input_dispX, m_input_dispY;\n  cv::Mat m_Mask;\n  std::vector<CTiePt> m_vecTPs;\n  \n  // outputs\n  std::vector<CTiePt> m_vectpAdded; // final tp result (i.e. seed tps + newly added tps)\n  // Disparity maps:\n  // the disparity of a point p_i at x,y in the left image is stored at\n  // (x, y) in the disparity maps, e.g., (m_matDisMapX and m_matDisMapY).\n  // For example, the position of the corresponding point p'_i in the right image can be defined as\n  // (x+x_dist, y+y_dist), where 'xdist' and 'ydist' are value at (x,y) in m_matDisMapX and m_matDisMapY, respectively.\n  // When disparity values are not known, the vaule of the disparity map is set to zero.\n  cv::Mat m_matDisMapX;\n  cv::Mat m_matDisMapY;\n  cv::Mat m_matDisMapSim; // matching score map: smaller score is better score and -1 indicate unknown\n  \n  cv::Mat m_matHL;        // used when the rectified images are used\n  cv::Mat m_matHR;\n  int nNumSeedTPs;\n  double procTime;\n};\n\n} // end namespace gotcha\n\n#endif // ASP_GOTCHA_CDENSIFY_H\n"
  },
  {
    "path": "src/asp/Gotcha/CDensifyParam.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#ifndef ASP_GOTCHA_CDENSIFYPARAM_H\n#define ASP_GOTCHA_CDENSIFYPARAM_H\n\n#include <asp/Gotcha/CGOTCHAParam.h>\n#include <opencv2/opencv.hpp>\n#include <string>\n\nnamespace gotcha {\n\nclass CDensifyParam {\n\npublic:\n  CDensifyParam(): m_nProcType(GOTCHA){}\n  int m_nProcType;     // growing method\n#if 0\n  std::string m_strImgL;\n  std::string m_strImgR;\n  std::string m_strOutPath;\n  std::string m_strTPFile;\n  std::string m_strDispX;\n  std::string m_strDispY;\n  std::string m_strUpdatedDispX;\n  std::string m_strUpdatedDispY;\n  std::string m_strUpdatedDispSim;\n#endif\n  \n  std::string getProcessingType(){\n    if (m_nProcType == GOTCHA) return \"GOTCHA\";\n    else if (m_nProcType == P_GOTCHA) return \"P_GOTCHA\";\n    return \"UNKNOWN\";\n  }\n  \n  CGOTCHAParam m_paramGotcha;\n  \n  enum {GOTCHA, P_GOTCHA};\n  enum {NO_ERR, FILE_IO_ERR, GOTCHA_ERR, LINE_GOTCHA_ERR, P_GOTCHA_ERR};\n};\n\n} // end namespace gotcha\n\n#endif // ASP_GOTCHA_CDENSIFYPARAM_H\n"
  },
  {
    "path": "src/asp/Gotcha/CGOTCHAParam.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#ifndef ASP_GOTCHA_CGOTCHAPARAM_H\n#define ASP_GOTCHA_CGOTCHAPARAM_H\n\n#include <string>\n#include <asp/Gotcha/CALSCParam.h>\n\nnamespace gotcha {\n\nclass CGOTCHAParam {\n\npublic:\n    CGOTCHAParam():m_nNeiType(NEI_4),m_fDiffCoef(0.05),m_fDiffThr(0.1),m_nDiffIter(5), m_bNeedInitALSC(true){ m_nMinTile = 1000000000;}\n\n    std::string getNeiType(){if (m_nNeiType == NEI_X) return \"NEI_X\";\n                        else if (m_nNeiType == NEI_Y) return \"NEI_Y\";\n                        else if (m_nNeiType == NEI_4) return \"NEI_4\";\n                        else if (m_nNeiType == NEI_8) return \"NEI_8\";\n                        else if (m_nNeiType == NEI_DIFF) return \"NEI_Difussion\";\n                        else return \"UNKNOWN\";}\n\n    int m_nNeiType;\n    int m_nMinTile;\n    float m_fDiffCoef;\n    float m_fDiffThr;\n    int m_nDiffIter;\n\n    //std::string m_strMask;\n\n    CALSCParam m_paramALSC;\n    bool m_bNeedInitALSC; // set true if initial alsc on seed points are required\n\n    enum {NEI_X, NEI_Y, NEI_4, NEI_8, NEI_DIFF};\n};\n\n} // end namespace gotcha\n\n#endif // ASP_GOTCHA_CGOTCHAPARAM_H\n"
  },
  {
    "path": "src/asp/Gotcha/CMakeLists.txt",
    "content": "# Use wrapper function at this level to avoid code duplication\nadd_library_wrapper(AspGotcha \"${ASP_GOTCHA_SRC_FILES}\" \"${ASP_GOTCHA_TEST_FILES}\" \"${ASP_GOTCHA_LIB_DEPENDENCIES}\")\n"
  },
  {
    "path": "src/asp/Gotcha/CProcBlock.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Gotcha/CProcBlock.h>\n\nusing namespace std;\nusing namespace cv;\n\nnamespace gotcha {\n\nCProcBlock::CProcBlock(){}\n\n// Images are passed in memory now\n#if 0\nvoid CProcBlock::setImages(string strImgL, string strImgR, bool bGrey){\n  \n    // read image as a grey -> vital for alsc and gotcha\n    if (bGrey){\n        m_imgL = imread(strImgL, CV_LOAD_IMAGE_ANYDEPTH); //IMARS\n        m_imgR = imread(strImgR, CV_LOAD_IMAGE_ANYDEPTH); //IMARS\n    }\n    else{\n        m_imgL = imread(strImgL, 1);\n        m_imgR = imread(strImgR, 1);\n    }\n}\n#endif\n\nbool CProcBlock::saveTP(const vector<CTiePt>& vecTPs, const string strFile){\n\n    ofstream sfTP;\n    sfTP.open(strFile.c_str());\n\n    int nLen = vecTPs.size();\n    int nEle = 11;\n\n    if (sfTP.is_open()){\n        // header\n        sfTP << nLen << \" \" << nEle << endl;\n        // data\n        for (int i = 0 ; i < nLen ;i++){\n            CTiePt tp = vecTPs.at(i);\n            sfTP << tp.m_ptL.x << \" \"<< tp.m_ptL.y << \" \"\n                 << tp.m_ptR.x << \" \"<< tp.m_ptR.y << \" \"\n                 << tp.m_fSimVal << \" \"<< tp.m_pfAffine[0] << \" \"\n                 << tp.m_pfAffine[1] << \" \"<< tp.m_pfAffine[2] << \" \"\n                 << tp.m_pfAffine[3] << \" \" << tp.m_ptOffset.x << \" \"\n                 << tp.m_ptOffset.y << endl;\n\n        }\n        sfTP.close();\n    }\n    else\n        return false;\n\n    return true;\n}\n\n#if 0\nbool CProcBlock::loadTP(const string strFile){\n  std::cout << \"Reading \" << strFile << std::endl;\n    ifstream sfTPFile;\n    sfTPFile.open(strFile.c_str());\n\n    m_vecTPs.clear();\n    //m_vecRefTPs.clear();\n    int nTotLen = 0;\n    if (sfTPFile.is_open()){\n          // total num of TPs (i.e., lines)\n        int nElement; // total num of elements in a TP\n        sfTPFile >> nTotLen >> nElement;\n\n        for (int i = 0 ; i < nTotLen; i++){\n            CTiePt tp;\n            sfTPFile >> tp.m_ptL.x >> tp.m_ptL.y >> tp.m_ptR.x >> tp.m_ptR.y >> tp.m_fSimVal;\n\n            if (nElement > 5){\n                float fDummy;\n                for (int k  = 0 ; k < 6; k++) sfTPFile >> fDummy;\n            }\n\n            if (nElement > 11){                \n                float fDummy;\n                double dDummy;\n                for (int k  = 0 ; k < 6; k++) sfTPFile >> fDummy;\n                for (int k  = 0 ; k < 8; k++) sfTPFile >> dDummy;\n            }\n\n            m_vecTPs.push_back(tp);\n        }\n\n        sfTPFile.close();\n    }\n    else\n        return false;\n\n    if (nTotLen < 8) {\n        //cerr << \"TP should be more than 8 pts\" << endl;\n        return false;\n    }\n\n    return true;\n}\n#endif\n\nbool CProcBlock::saveMatrix(const Mat& matData, const string strFile){\n\n    ofstream sfOut;\n    sfOut.open(strFile.c_str());\n\n    if (sfOut.is_open()){\n\n        sfOut << \"ncols \" << matData.cols << endl;\n        sfOut << \"nrows \" << matData.rows << endl;\n        sfOut << \"xllcorner 0\" << endl;\n        sfOut << \"yllcorner 0\" << endl;\n        sfOut << \"cellsize 1\" << endl;\n\n        for (int i = 0; i < matData.rows; i++){\n            for (int j = 0; j < matData.cols; j++){\n                if (matData.depth() == CV_32F)\n                    sfOut << matData.at<float>(i,j) << \" \";\n                else if (matData.depth() == CV_64F)\n                    sfOut << matData.at<double>(i,j) << \" \";\n                else if (matData.depth() == CV_8U)\n                    sfOut << matData.at<uchar>(i,j) << \" \";\n            }\n            sfOut << endl;\n        }\n        sfOut.close();\n    }\n    else\n        return false;\n\n    return true;\n}\n\n#if 0\nbool CProcBlock::loadMatrix(Mat &matData, const string strFile, bool bDoublePrecision){\n    if (bDoublePrecision){\n        ifstream sfIn;\n        sfIn.open(strFile.c_str());\n\n        if (sfIn.is_open()){\n            int nRow;\n            int nCol;\n            sfIn >> nRow >> nCol;\n\n            matData = Mat::zeros(nRow, nCol, CV_64F);\n\n            for (int i = 0; i < matData.rows; i++){\n                for (int j = 0; j < matData.cols; j++){\n                    sfIn >> matData.at<double>(i,j);\n                }\n            }\n            sfIn.close();\n        }\n        else\n            return false;\n\n        return true;\n    }\n    else{\n        return loadMatrix(matData, strFile);\n    }\n}\n\nbool CProcBlock::loadMatrix(Mat &matData, const string strFile){\n\n    ifstream sfIn;\n    sfIn.open(strFile.c_str());\n\n    if (sfIn.is_open()){\n        int nRow;\n        int nCol;\n        sfIn >> nRow >> nCol;\n\n        matData = Mat::zeros(nRow, nCol, CV_32F);\n\n        for (int i = 0; i < matData.rows; i++){\n            for (int j = 0; j < matData.cols; j++){\n                sfIn >> matData.at<float>(i,j);\n            }\n        }\n        sfIn.close();\n    }\n    else\n        return false;\n\n    return true;\n}\n\nbool CProcBlock::loadMatrix(string strFile){\n    ifstream sfIn;\n    sfIn.open(strFile.c_str());\n\n    if (sfIn.is_open()){\n        int nRow;\n        int nCol;\n        sfIn >> nRow >> nCol;\n\n        m_dispX = Mat::zeros(nRow, nCol, CV_32F);\n\n        for (int i = 0; i < m_dispX.rows; i++){\n            for (int j = 0; j < m_dispX.cols; j++){\n                sfIn >> m_dispX.at<float>(i,j);\n            }\n        }\n        sfIn.close();\n    }\n    else\n        return false;\n\n    return true;\n\n}\n#endif\n\nbool CProcBlock::saveALSCParam(const CALSCParam& paramALSC, const string strOut){\n    ofstream sfLog;\n    sfLog.open(strOut.c_str(), ios::app | ios::out);\n\n    if (sfLog.is_open()){\n\n        sfLog << \"<ALSC parameters>\" << endl;\n        sfLog << \"The size of a matching patch: \" << paramALSC.m_nPatch << endl;\n        sfLog << \"Maximum eigenval: \" << paramALSC.m_fEigThr << endl;\n        sfLog << \"Maximum iteration: \" << paramALSC.m_nMaxIter << endl;\n        sfLog << \"Affine distortion limit: \" << paramALSC.m_fAffThr << endl;\n        sfLog << \"Translation limit: \" << paramALSC.m_fDriftThr << endl;\n        sfLog << \"Use intensity offset parameter: \" << paramALSC.m_bIntOffset << endl;\n        sfLog << \"Use weighting coefficients: \" << paramALSC.m_bWeighting << endl;\n        sfLog << endl;\n\n        sfLog.close();\n    }\n    else\n        return false;\n\n    return true;\n}\n\nbool CProcBlock::saveGOTCHAParam(CGOTCHAParam& paramGOTCHA, const string strOut){\n    ofstream sfLog;\n    sfLog.open(strOut.c_str(), ios::app | ios::out);\n\n    if (sfLog.is_open()){\n\n        sfLog << \"<GOTCHA parameters>\" << endl;\n        sfLog << \"Neighbour type: \" << paramGOTCHA.getNeiType()<< endl;\n        sfLog << \"Diffusion iteration: \" << paramGOTCHA.m_nDiffIter << endl;\n        sfLog << \"Diffusion threshold: \" << paramGOTCHA.m_fDiffThr << endl;\n        sfLog << \"Diffusion coefficient: \" << paramGOTCHA.m_fDiffCoef << endl;\n        //sfLog << \"Minimum image tile size: \" <<  paramGOTCHA.m_nMinTile << endl;\n        sfLog << \"Need initial ALSC on seed TPs: \" << paramGOTCHA.m_bNeedInitALSC << endl;\n        sfLog << endl;\n\n        sfLog.close();\n    }\n    else\n        return false;\n\n    return true;\n}\n\n} // end namespace gotcha\n  \n"
  },
  {
    "path": "src/asp/Gotcha/CProcBlock.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#ifndef ASP_GOTCHA_CPROCBLOCK_H\n#define ASP_GOTCHA_CPROCBLOCK_H\n\n#include <asp/Gotcha/CTiePt.h>\n#include <asp/Gotcha/CALSCParam.h>\n#include <asp/Gotcha/CGOTCHAParam.h>\n\n\n#include <opencv2/opencv.hpp>\n#include <opencv2/highgui/highgui.hpp>\n#include <opencv2/imgproc/imgproc.hpp>\n\n#include <fstream>\n#include <string>\n#include <time.h>\n#include <iostream>\n#include <stdio.h>\n#include <stdlib.h>\n\nnamespace gotcha {\n\nclass CProcBlock{\npublic:\n  CProcBlock();\n  \n  // assume matrix has float data type\n  //static bool loadMatrix(cv::Mat& matData, const std::string strFile); \n  \nprotected:\n  // file I/O\n  //bool loadMatrix(cv::Mat &matData, const std::string strFile, bool bDoublePrecision);\n  //bool loadMatrix(std::string strFile);\n  //void setImages(std::string strImgL, std::string strImgR, bool bGrey = true);\n  //bool loadTP(const std::string strFile);\n  bool saveTP(const std::vector<CTiePt>& vecTPs, const std::string strFile);\n  bool saveMatrix(const cv::Mat& matData, const std::string strFile);  // assume matrix is in float or double data type\n  bool saveALSCParam(const CALSCParam& paramALSC, const std::string strOut);\n  bool saveGOTCHAParam(CGOTCHAParam& paramGOTCHA, const std::string strOut);\n\nprotected:\n  //cv::Mat m_dispX;\n};\n\n} // end namespace gotcha\n  \n#endif // ASP_GOTCHA_CPROCBLOCK_H\n"
  },
  {
    "path": "src/asp/Gotcha/CTiePt.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#ifndef ASP_GOTCHA_CTIEPT_H\n#define ASP_GOTCHA_CTIEPT_H\n\n#include <opencv2/opencv.hpp>\n\nnamespace gotcha {\n  \nclass CTiePt {\n\npublic:\n    CTiePt():m_fSimVal(NOT_DEF){m_pfAffine[0] = 0; m_pfAffine [1] = 0;\n                                m_pfAffine[2] = 0; m_pfAffine [3] = 0;}\n\n  cv::Point2f m_ptL;      // left xy position\n  cv::Point2f m_ptR;      // right xy position\n  float m_fSimVal;        // matching similarity (score) from 0 to 1.0, othewise it is not defined\n  \n  float m_pfAffine [4];\n  cv::Point2f m_ptOffset;\n  \n  enum {NOT_DEF = -1};\n  \n  bool operator==(const CTiePt& x){\n    if ((this->m_ptL == x.m_ptL) && (this->m_ptR == x.m_ptR))\n      return true;\n    else return false;\n  }\n};\n\n} // end namespace gotcha\n\n#endif // ASP_GOTCHA_CTIEPT_H\n"
  },
  {
    "path": "src/asp/Gotcha/README.txt",
    "content": "This directory contains the source code for the CASP-GO Gotcha\ndisparity refinement algorithm, originally from:\n\n  https://github.com/mssl-imaging/CASP-GO/tree/master/src/DispRefine\n\nIt was incorporated into ASP under NASA proposal 19-PDART19_2-0094.\n\nAuthor: Yu Tao\n \nCopyright (c) 2016-2019, Imaging Group, Mullard Space Science\nLaboratory, University College London. All rights reserved.\n"
  },
  {
    "path": "src/asp/IceBridge/CMakeLists.txt",
    "content": "\n# IceBridge\n\nadd_executable(correct_icebridge_l3_dem correct_icebridge_l3_dem.cc)\ntarget_link_libraries(correct_icebridge_l3_dem AspCore AspSessions)\ninstall(TARGETS correct_icebridge_l3_dem DESTINATION bin)\n\nadd_executable(nav2cam nav2cam.cc)\ntarget_link_libraries(nav2cam AspCore AspSessions)\ninstall(TARGETS nav2cam DESTINATION bin)\n\nadd_executable(ortho2pinhole ortho2pinhole.cc)\ntarget_link_libraries(ortho2pinhole AspSessions)\ninstall(TARGETS ortho2pinhole DESTINATION bin)\n\nadd_executable(orbitviz_pinhole orbitviz_pinhole.cc)\ntarget_link_libraries(orbitviz_pinhole AspSessions)\ninstall(TARGETS orbitviz_pinhole DESTINATION bin)\n\n# Install all of the python files.\nset(PYTHON_TOOLS icebridge_kmz_to_csv.py extract_icebridge_ATM_points.py lvis2kml.py)\n\nforeach(p ${PYTHON_TOOLS})\n  INSTALL(FILES ${p}\n          PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_EXECUTE GROUP_READ WORLD_EXECUTE\n          DESTINATION bin)\nendforeach()\n"
  },
  {
    "path": "src/asp/IceBridge/README.txt",
    "content": "This document describes how to process IceBridge images to create DEMs\nthat are aligned to the LIDAR ground reference.\n\n1. Data location\n\nThe data is available from\n\nhttps://nsidc.org/data/icebridge/data_summaries.html#camera\n\nincluding camera information, raw imagery, orthorectified imagery,\nLIDAR point clouds, and pre-existing DEMs for some of the flights.\n\nFlight paths can be visualized here:\n\nhttps://asapdata.arc.nasa.gov/dms/missions.html\n\n2. Data fetching preliminaries\n\nTo be able to fetch any data, one should create an account with NSIDC,\nand then set up bulk downloading by following the instructions at\n\nhttps://nsidc.org/support/faq/what-options-are-available-bulk-downloading-data-https-earthdata-login-enabled\n\nFor some flights, the camera (and hence its calibration file) changed\nin mid-flight, detailed info about this is available at\n\nhttps://nsidc.org/data/IODCC0/versions/1\n\nin the \"User Guide\" tab. The camera calibration files can be fetched\nrecursively using the command:\n\nwget -e robots=off --load-cookies ~/.urs_cookies --save-cookies ~/.urs_cookies --keep-session-cookies --no-check-certificate --auth-no-challenge=on --no-parent -r -l 10 https://n5eil01u.ecs.nsidc.org/ICEBRIDGE/IODCC0.001/\n\nThese files are in the PDF format, and can be converted to the .tsai\nformat used by ASP using the script\n\nStereoPipeline/src/asp/IceBridge/process_calibration_file.py \n\nThe complete list of cameras for all flights is in camera_lookup.txt\nwhich is parsed automatically by full_processing_script.py,\nhandling cameras that changed in mid-flight (in directory \nStereoPipeline/src/asp/IceBridge).\n\n3. Data fetching and archiving\n\nThe images can be fetched via the tool:\n\nStereoPipeline/src/asp/IceBridge/full_processing_script.py \n\n(see inside this tool for an example usage).\n\nTo only fetch, validate, and do some conversions, use the option:\n\n  --stop-after-fetch\n\nTo control which files are fetched and later processed use:\n\n --start-frame and --stop-frame \n\nThese params do not apply to the lidar files. If you want to limit the\nnumber of those, you can specify a small --max-num-to-fetch (note this will\nlimit the number of all types of files). \n  \n4. Peculiar cases. \n\nSee the notes at special_cases.txt about some things to be aware of. \n\n5. Working the archived data\n\nThe fetched data are stored on lou, at \n\n/u/oalexan1/projects/data/icebridge\n\nThe DEMs that were used to create the orthoimages and which we use to\ncreate the camera models are in the reference_dems/ subdirectory.\n\nTo archive data to lou after fetching, use:\n\n  --tar-and-wipe\n\nTo start with an existing lou archive, use:\n\n  --start-with-lou-archive\n\nThese assume user name is oalexan1 for reasons too long to describe. \n\nThe tool will attempt to update the dataset once fetched and\nuntarred. If necessary, it can be pushed back to lou afterwards as\ndescribed above.\n\nAlternatively, to bring data back to pfe for processing, connect to\nlou and run from the data directory a command similar to:\n\ntar xfv AN_20091026.tar -C /nobackupnfs2/your/work/dir\n\nIt is suggested you re-run the the fetch command once you unpack it,\nas some datasets that were fetched earlier may be less checked for\nvalidity and may be missing some data.\n\n"
  },
  {
    "path": "src/asp/IceBridge/archive_functions.py",
    "content": "#!/usr/bin/env python\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n# Contains functions to store/retrieve data from outside a run folder\n\nimport os, sys, optparse, datetime, time, subprocess, logging, multiprocessing\nimport re, shutil, time, getpass, glob\n\nimport os.path as P\n\n# The path to the ASP python files and tools\nbasepath      = os.path.dirname(os.path.realpath(__file__)) # won't change, unlike syspath\npythonpath    = os.path.abspath(basepath + '/../Python')     # for dev ASP\nlibexecpath   = os.path.abspath(basepath + '/../libexec')    # for packaged ASP\nicebridgepath = os.path.abspath(basepath + '/../IceBridge')  # IceBridge tools\n\n# Prepend to Python path\nsys.path.insert(0, basepath)\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\nsys.path.insert(0, icebridgepath)\n\nimport icebridge_common, archive_functions\nimport asp_system_utils\n\n#asp_system_utils.verify_python_version_is_supported()\n\n# Prepend to system PATH\nos.environ[\"PATH\"] = basepath       + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = pythonpath     + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = libexecpath    + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = icebridgepath  + os.pathsep + os.environ[\"PATH\"]\n\nREMOTE_INPUT_FOLDER     = 'lfe:/u/oalexan1/projects/data/icebridge'\n\ndef robust_shiftc(cmd, logger, attempts = 120):\n    '''Try to fetch/submit with shiftc for at least 2 hours, with attempts every minute.\n    We worked hard for many hours to produce a run, and we should not let\n    a temporary problem with the server nullify our work.'''\n    sleep_time = 60\n\n    for attempt in range(attempts):\n\n        if attempt > 0:\n            logger.info(\"Trying attempt: \" + str(attempt+1) + \" out of \" + str(attempts))\n            \n        logger.info(cmd)\n        status = os.system(cmd)\n        if status == 0:\n            return\n        \n        if attempt == attempts - 1:\n            raise Exception('Failed to copy data after ' + str(attempts) + ' attempts.')\n        else:\n            attempt += 1 \n            logger.info(\"Will try shiftc again after sleeping for \" + str(sleep_time) + \\\n                        \" seconds.\")\n            time.sleep(sleep_time)\n\n    \ndef stripHost(val):\n    # Replace lfe:/path with /path\n    m = re.match(\"^.*?:\\s*(.*?)$\", val)\n    if m:\n        return m.group(1)\n    else:\n        return val\n\ndef get_remote_output_folder(user):\n    '''Get the folder containing DEMs for given user.'''\n    if user == 'smcmich1':\n        return 'lfe:/u/smcmich1/icebridge/output'\n    elif user == 'oalexan1':\n        return 'lfe:/u/oalexan1/projects/data/icebridge/output'\n    else:\n        raise Exception(\"Unknown user: \" + user)\n    \ndef get_remote_ortho_folder(user):\n    '''Get the folder containing orthos for given user.'''\n    if user == 'smcmich1':\n        return 'lfe:/u/smcmich1/icebridge/ortho'\n    elif user == 'oalexan1':\n        return 'lfe:/u/oalexan1/projects/data/icebridge/ortho'\n    else:\n        raise Exception(\"Unknown user: \" + user)\n\nREMOTE_CAMERA_FOLDER_SCOTT = 'lfe:/u/smcmich1/icebridge/camera'\nREMOTE_CAMERA_FOLDER_OLEG  = 'lfe:/u/oalexan1/projects/data/icebridge/camera'\n   \nif icebridge_common.getUser() == 'smcmich1':\n    REMOTE_CAMERA_FOLDER    = REMOTE_CAMERA_FOLDER_SCOTT\n    REMOTE_ALIGN_CAM_FOLDER = 'lfe:/u/smcmich1/icebridge/aligned_cameras'\n    REMOTE_ORTHO_FOLDER     = 'lfe:/u/smcmich1/icebridge/ortho'\n    REMOTE_SUMMARY_FOLDER   = 'lfe:/u/smcmich1/icebridge/summaries'\n    REMOTE_LABEL_FOLDER     = 'lfe:/u/smcmich1/icebridge/labels'\n    LUNOKHOD                = 'lunokhod2'\n    L_SUMMARY_FOLDER        = LUNOKHOD + ':/home/smcmich1/data/icebridge_summaries'\nelif icebridge_common.getUser() == 'oalexan1':\n    REMOTE_CAMERA_FOLDER    = REMOTE_CAMERA_FOLDER_OLEG\n    REMOTE_ALIGN_CAM_FOLDER = 'lfe:/u/oalexan1/projects/data/icebridge/aligned_cameras'\n    REMOTE_SUMMARY_FOLDER   = 'lfe:/u/oalexan1/projects/data/icebridge/summaries'\n    REMOTE_LABEL_FOLDER     = 'lfe:/u/oalexan1/projects/data/icebridge/labels'\n    LUNOKHOD                = 'lunokhod1'\n    L_SUMMARY_FOLDER        = LUNOKHOD + ':/home/oalexan1/projects/data/icebridge/summaries'\n\nREMOTE_OUTPUT_FOLDER = get_remote_output_folder(icebridge_common.getUser())\nREMOTE_ORTHO_FOLDER  = get_remote_ortho_folder(icebridge_common.getUser())\n\ndef retrieveRunData(run, unpackFolder, useTar, forceTapeFetch, skipTapeCameraFetch, logger):\n    '''Retrieve the data for the specified run from Lfe.'''\n\n    logger.info('Retrieving data for run ' + str(run))\n\n    fileName = run.getInputTarName()\n\n    unpackDir = os.path.join(unpackFolder, os.path.splitext(fileName)[0])\n    jpegDir = os.path.join(unpackDir, os.path.basename(run.getJpegFolder()))\n    if os.path.exists(jpegDir) and os.path.isdir(jpegDir) and (not forceTapeFetch):\n        logger.info(\"Won't fetch from lfe, as we already have: \" + jpegDir)\n        return\n\n    lfePath  = os.path.join(REMOTE_INPUT_FOLDER, fileName)\n\n    # Retrieve a preprocessed set of camera files if we have it\n    # - Do this first as sometimes we only have the camera files.\n    if not skipTapeCameraFetch:\n        fetchCameraFolder(run, logger)\n    else:\n        logger.info(\"Skip fetching cameras from tape.\")\n\n    # I have had bad luck with shift to fetch. So in the worst case try tar.\n\n    tar_cmd = 'ssh lfe \"cd ' + os.path.dirname(stripHost(lfePath)) + \"; tar xfv \" + \\\n              os.path.basename(lfePath) + \" -C \" + os.path.realpath(unpackFolder) + '\"'\n    shift_cmd = 'shiftc --wait -d -r --verify --extract-tar ' + lfePath + ' ' + unpackFolder\n    \n    if useTar:\n        # If to use tar right away\n        robust_shiftc(tar_cmd, logger, attempts = 1)\n    else:\n        try:\n            # If shiftc does not work, fall back to tar.\n            # Don't try too hard on fetching.\n            robust_shiftc(shift_cmd, logger, attempts = 10)\n        except Exception as e:\n            robust_shiftc(tar_cmd, logger, attempts = 1)\n\n\ndef fetchProcessedByType(run, unpackFolder, logger, dataType):\n    '''Fetch from lfe the latest archive of processed DEMs or orthos by modification time.\n    For now we ignore the timestamp.'''\n    \n    logger.info('Fetching processed ' + dataType + ' data for ' + str(run))\n\n    # Fetch the latest file by modification time as returned by 'ls'. \n    # A given file can be either in Scott's or Oleg's archive. \n    # It can be in both, and it can be multiple instances.\n    # Need to list all and fetch the latest.\n    if dataType == 'DEM':\n        fileName = run.getOutputTarName(useWildCard = True)\n        lfePaths = os.path.join(stripHost(get_remote_output_folder('oalexan1')), fileName) + \" \" + \\\n                   os.path.join(stripHost(get_remote_output_folder('smcmich1')), fileName)\n    elif dataType == 'ORTHO':\n        fileName = run.getOrthoTarName(useWildCard = True)\n        lfePaths = os.path.join(stripHost(get_remote_ortho_folder('oalexan1')), fileName) + \" \" + \\\n                   os.path.join(stripHost(get_remote_ortho_folder('smcmich1')), fileName)\n    else:\n        raise Exception(\"Unknown data type: \" + dataType)\n\n    # Get the list \n    cmd = 'ssh lfe \"ls -altd ' + lfePaths + '\"'\n    logger.info(cmd)\n    (out, err, status) = asp_system_utils.executeCommand(cmd, outputPath = None, \n                                                         suppressOutput = True, redo = True,\n                                                         noThrow = True)\n\n    # Parse the answer and keep the latest. \n    out = out.strip()\n    vals = out.split('\\n')\n    for val in vals:\n        logger.info(\"Found: \" + val)\n    lfePath = \"\"\n    for val in vals:\n        if len(val) >= 1 and val[0] == 'l':\n            continue # this is a symlink\n        arr = val.split()\n        lfePath = arr[-1]\n        break # found what we needed\n\n    if lfePath == \"\":\n        logger.info(\"Could not locate: \" + fileName)\n        return False\n\n    cmd = 'shiftc --wait -d -r --verify --extract-tar ' + 'lfe:' + lfePath + ' ' + unpackFolder  \n    logger.info(cmd)\n    status = os.system(cmd)\n    \n    # Try tar if shift failed\n    if status != 0:\n        logger.info('Did not sucessfully fetch archived processed data of type: ' + dataType)\n        logger.info('Will try with tar.''')\n\n        tar_cmd = 'ssh lfe \"cd ' + os.path.dirname(lfePath) + \"; tar xfv \" + \\\n                  os.path.basename(lfePath) + \" -C \" + os.path.realpath(unpackFolder) + '\"'\n        \n        logger.info(tar_cmd)\n        status = os.system(tar_cmd)\n        if status != 0:\n            logger.info('Failed using tar as well.')\n            \n            return False\n\n    return True\n\ndef fetchCameraFolder(run, logger):\n    '''Fetch a camera folder from the archive if it exists.  Returns\n    True if we got the file. If more than one, return the latest by\n    modification time.'''\n    \n    logger.info('Fetching camera folder for ' + str(run))\n    \n    # Tar up the camera files and send them at the same time using the shiftc command\n    cameraFolder = run.getCameraFolder()\n    fileName     = run.getCameraTarName()\n\n    # There could be multiple camera folders, fetch the latest by modification time.\n    strippedName = fileName\n    m = re.match('^(.*?)\\.tar', strippedName)\n    if m:\n        strippedName = m.group(1)\n    m = re.match('^(.*?)' + run.suffix, strippedName)\n    if m:\n        strippedName = m.group(1)\n\n    # Look for the tarred camera files in each remote folder\n    # - TODO: This may not get the latest if cameras are in each folder!\n    found_rcf = ''\n    for rcf in [REMOTE_CAMERA_FOLDER_OLEG, REMOTE_CAMERA_FOLDER_SCOTT]:\n\n        cmd = 'ssh lfe \"ls -dt ' + stripHost(rcf) + '/' + strippedName + '*.tar\"'\n        logger.info(cmd)\n        (out, err, status) = asp_system_utils.executeCommand(cmd, outputPath = None, \n                                                             suppressOutput = True, redo = True,\n                                                             noThrow = True)\n        out  = out.strip()\n        vals = out.split()\n        if len(vals) >= 1:\n            # Pick the first one, which is the newest\n            out = vals[0]\n        if out != '':\n            found_rcf = rcf\n            break\n    if found_rcf == '':\n        logger.info('Did not find camera file for run.')\n        return False\n\n    fileName = os.path.basename(out)\n    lfePath  = os.path.join(found_rcf, fileName)\n    cmd = 'shiftc --wait -d -r --extract-tar ' + lfePath + ' .'  \n\n    # Don't try too hard below, if failed first time that means there are no cameras\n    # to fetch\n    logger.info(cmd)\n    status = os.system(cmd)\n    if status != 0:\n        logger.info('Did not find camera file for run.')\n        return False\n    else:\n        logger.info('Finished retrieving cameras from lfe.')\n        return True\n\ndef packAndSendCameraFolder(run, logger):\n    '''Archive the camera folder for later use'''\n    \n    logger.info('Archiving camera folder for run ' + str(run))\n\n    # Tar up the camera files and send them at the same time using the shiftc command\n    cameraFolder = run.getCameraFolder()\n    fileName     = run.getCameraTarName()\n    lfePath      = os.path.join(REMOTE_CAMERA_FOLDER, fileName)\n\n    # First remove any existing tar file. Use 2>/dev/null to not print\n    # NASA's \"You have no expecation of privacy.\"\n    cmd      = \"ssh lfe 'rm -f \" + stripHost(lfePath) + \"' 2>/dev/null\"\n    logger.info(cmd)\n    os.system(cmd)\n\n    # Do the new file. Save the projection bounds, we will need that for later\n    # as that file is very time consuming to create.\n    cwd = os.getcwd()\n    os.chdir(run.parentFolder)\n    \n    runFolder = str(run)\n    cmd = 'shiftc --wait -d -r --include=\\'^.*?(' + \\\n          os.path.basename(icebridge_common.projectionBoundsFile(runFolder)) + \\\n          '|' + icebridge_common.validFilesPrefix() + '.*|' + \\\n          os.path.basename(cameraFolder) + '.*?\\.tsai)$\\' --create-tar ' + runFolder + \\\n          ' ' + lfePath\n    \n    robust_shiftc(cmd, logger)\n\n    logger.info(\"Finished archiving cameras.\")\n    \n    os.chdir(cwd)\n    \n    # Test if this is reversible\n    #fetchCameraFolder(run, logger)\n    \ndef packAndSendAlignedCameras(run, logger):\n    '''Archive the pc_align-ed cameras for later use'''\n    \n    logger.info('Archiving aligned cameras for run ' + str(run))\n    cwd = os.getcwd()\n    os.chdir(run.parentFolder)\n    \n    runFolder = str(run)   \n    fileName = run.getAlignedCameraTarName()\n    lfePath  = os.path.join(REMOTE_ALIGN_CAM_FOLDER, fileName)\n    \n    # First remove any existing tar file\n    cmd      = \"ssh lfe 'rm -f \" + stripHost(lfePath) + \"' 2>/dev/null\"\n    logger.info(cmd)\n    os.system(cmd)\n\n    # Create a new archive\n    cmd = 'shiftc --wait -d -r --include=\\'^.*?' + icebridge_common.alignedBundleStr() + \\\n          '.*?\\.tsai$\\' --create-tar ' + runFolder + \\\n    ' ' + lfePath\n\n    robust_shiftc(cmd, logger)\n\n    os.chdir(cwd)\n    logger.info('Finished sending aligned cameras to lfe.')\n\ndef packAndSendOrthos(run, logger):\n    '''Archive the created ortho images.'''\n\n    logger.info('Archiving ortho images for run ' + str(run))\n\n    cwd = os.getcwd()\n    os.chdir(run.parentFolder)\n    \n    runFolder = str(run)\n    fileName = run.getOrthoTarName()\n    lfePath  = os.path.join(REMOTE_ORTHO_FOLDER, fileName)\n\n    # First remove any existing tar file\n    cmd      = \"ssh lfe 'rm -f \" + stripHost(lfePath) + \"' 2>/dev/null\"\n    logger.info(cmd)\n    os.system(cmd)\n\n    # Create a new archive\n    cmd = 'shiftc --wait -d -r --include=\\'^.*?' + icebridge_common.orthoFileName() + \\\n          '$\\' --create-tar ' + runFolder + ' ' + lfePath\n    robust_shiftc(cmd, logger)\n\n    os.chdir(cwd)\n    logger.info('Finished sending ortho images to lfe.')\n\ndef packAndSendSummaryFolder(run, folder, logger, backupToL2=False):\n    '''Archive the summary folder in case we want to look at it later'''\n    \n    logger.info('Archiving summary folder for run ' + str(run))\n    \n    cwd = os.getcwd()\n    os.chdir(run.parentFolder)\n\n    fileName = run.getSummaryTarName()\n\n    # Create a local tar file.\n\n    # Turn this approach off, new approach below.\n    # - Some fiddling to make the packed folders convenient\n    cmd = 'tar -chf '+ fileName +' -C '+ folder +'/.. ' + os.path.basename(folder)\n    logger.info(cmd)\n    (out, err, status) = asp_system_utils.executeCommand(cmd, outputPath = None, \n                                                         suppressOutput = True, redo = True,\n                                                         noThrow = True)\n    # This tends to print a very verbose message\n    ans = out + '\\n' + err\n    vals = ans.split('\\n')\n    if len(vals) < 10:\n        logger.info(ans)\n    else:\n        vals = vals[0:10]\n        logger.info(\"\\n\".join(vals))\n        logger.info(\"Above output truncated.\")\n\n    # Use shiftc to create a local copy, and we want to include log files too\n    #runFolder = str(run)\n    #sumName = os.path.basename(run.getSummaryFolder())\n    #cmd = 'shiftc --wait -d -r --dereference --include=\\'^.*?('  \\\n    #      + icebridge_common.logFilePrefix() + '|' \\\n    #      + runFolder + '/' + sumName        + '|' \\\n    #      + icebridge_common.manager_log_prefix()  \\\n    #      + ')\\' --create-tar ' + runFolder        \\\n    #      +  ' ' + fileName\n    \n    #logger.info(cmd)\n    #os.system(cmd)\n    \n    # Delete any existing copy of the file on lfe\n    lfePath  = os.path.join(REMOTE_SUMMARY_FOLDER, fileName)\n    cmd      = \"ssh lfe 'rm -f \" + stripHost(lfePath) + \"' 2>/dev/null\"\n    logger.info(cmd)\n    os.system(cmd)\n\n    # Send the file to lfe using shiftc\n    cmd = 'shiftc --wait -d -r ' + fileName + ' ' + lfePath\n    robust_shiftc(cmd, logger)\n\n    logger.info('Finished sending summary to lfe.')\n\n    if backupToL2:\n        # Wipe the copy on lunokhod\n        l2Path   = os.path.join(L_SUMMARY_FOLDER, fileName)\n        cmd      = \"ssh \" + LUNOKHOD + \"  'rm -f \"+ stripHost(l2Path) +\"' 2>/dev/null\"\n        logger.info(cmd)\n        os.system(cmd)\n\n        # Make target directory on lunokhod\n        cmd = \"ssh  \" + LUNOKHOD + \" 'mkdir -p \" + os.path.dirname(stripHost(l2Path)) + \\\n              \"' 2>/dev/null\"\n        logger.info(cmd)\n        os.system(cmd)\n\n        # Send a copy of the file to Lunokhod for convenience\n        cmd = 'scp ' + fileName + ' ' + l2Path + ' 2>/dev/null'\n        logger.info(cmd)\n        os.system(cmd)\n\n    # Clean up the local tar file\n    cmd = 'rm -f ' + fileName\n    logger.info(cmd)\n    os.system(cmd)\n\n    os.chdir(cwd)\n\ndef packAndSendCompletedRun(run, logger):\n    '''Assembles and compresses the deliverable parts of the run'''\n    \n    logger.info('Getting ready to pack up run ' + str(run))\n    \n    cwd = os.getcwd()\n    os.chdir(run.parentFolder)\n    \n    runFolder = str(run)\n\n    # Use symlinks to assemble a fake file structure to tar up\n    assemblyFolder = run.getAssemblyFolder()\n    batchFolders   = run.getBatchFolderList()\n    os.system('mkdir -p ' + assemblyFolder)\n\n    # Wipe any dead symlinks, as maybe this is not the first time the assembly is made\n    pattern = os.path.join(assemblyFolder, '*')\n    currFiles = glob.glob(pattern)\n    for filename in currFiles:\n        if not os.path.exists(os.path.realpath(filename)):\n            logger.info(\"Will wipe dead link: \" + filename)\n            os.system(\"rm -f \" + filename)\n            \n    # For each batch folder, start adding links to files that we want in the tarball\n    for batch in batchFolders:\n        # Skip folders where we did not produce final output\n        finalDemFile = os.path.join(batch, icebridge_common.blendFileName())\n        if not os.path.exists(finalDemFile):\n            continue\n        \n        # Need to change the name of these files when they go in the output folder\n        (startFrame, stopFrame) = icebridge_common.getFrameRangeFromBatchFolder(batch)\n        # We respect the convention below in push_to_nsidc.py.\n        prefix = ('F_%05d_%05d' % (startFrame, stopFrame))\n        prefix = os.path.join(assemblyFolder, prefix)\n        target = prefix + '_DEM.tif'\n        try:\n            if os.path.exists(target):\n                os.system(\"rm -f \" + target) # to wipe whatever was there\n            os.symlink(finalDemFile, target)\n        except Exception as e:\n            logger.info(str(e) + \" when doing: ln -s \" + finalDemFile + \" \" + target)\n    \n    # Tar up the assembled files and send them at the same time using the shiftc command\n    # - No need to use a compression algorithm here\n    fileName = run.getOutputTarName()\n    lfePath  = os.path.join(REMOTE_OUTPUT_FOLDER, fileName)\n\n    logger.info('Sending run to lfe...')\n\n    cmd = \"ssh lfe 'rm -f \" + stripHost(lfePath) + \"' 2>/dev/null\"\n\n    logger.info(cmd)\n    os.system(cmd)\n\n    cmd = 'shiftc --wait -d -r --dereference --create-tar ' + \\\n          os.path.join(runFolder, os.path.basename(assemblyFolder)) + ' ' + lfePath\n\n    # Command to transfer the files as they are in the batch dirs without symlink\n    #cmd = 'shiftc --wait -d -r --include=\\'^.*?' + icebridge_common.blendFileName() + \\\n    #      '$\\' --create-tar ' + runFolder + \\\n    #      ' ' + lfePath\n\n    try:\n        robust_shiftc(cmd, logger)\n    except Exception as e:\n        logger.info(str(e))\n        raise Exception('Failed to pack/send results for run ' + str(run) + \\\n                    '. Maybe not all sym links are valid.')\n    \n    os.chdir(cwd)\n    \n    logger.info('Finished sending run to lfe.')\n\ndef packAndSendLabels(run, logger):\n    '''Archive the labeled images generated by the 3rd party tool.'''\n    \n    # Archive everything stored in the 'labeled' and 'label_ortho' folders.\n    \n    logger.info('Archiving labled images for run ' + str(run))\n    cwd = os.getcwd()\n    os.chdir(run.parentFolder)\n    \n    runFolder = str(run)\n    relLabelFolder = os.path.join(runFolder, os.path.basename(run.getLabelFolder())) \n    relOrthoFolder = os.path.join(runFolder, os.path.basename(run.getLabelOrthoFolder()))\n\n    # Remove any .xml files\n    cmd = 'rm ' + run.getLabelFolder() + '/*.xml'\n    print(cmd)\n    os.system(cmd)\n    cmd = 'rm ' + run.getLabelOrthoFolder() + '/*.xml'\n    print(cmd)\n    os.system(cmd)\n\n    fileName = run.getLabelTarName()\n    lfePath  = os.path.join(REMOTE_LABEL_FOLDER, fileName)\n    \n    # First remove any existing tar file\n    cmd = \"ssh lfe 'rm -f \" + stripHost(lfePath) + \"' 2>/dev/null\"\n    logger.info(cmd)\n    os.system(cmd)\n\n    # Create a new archive\n    cmd = ('shiftc --wait -d -r --create-tar ' + relLabelFolder\n           +' '+ relOrthoFolder  +' '+ lfePath)\n    robust_shiftc(cmd, logger)\n\n    os.chdir(cwd)\n\n    logger.info('Finished sending labels to lfe.')\n\n\n\n    \n    \n"
  },
  {
    "path": "src/asp/IceBridge/blend_dems.py",
    "content": "#!/usr/bin/env python\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n# For each DEM, blend it, within its footprint, with neighboring DEMs.\n# That is to say, make several mosaics. First the DEM alone. Then\n# blended with the one on the right. Then also with the one on the\n# left. Then with second on the right. Then with second on the left.\n# Keep the result with the lowest mean error to lidar.\n\n# It creates files of the form:\n# processed/batch_2489_2490_2/out-blend-DEM.tif \n# processed/batch_2489_2490_2/out-blend-DEM-diff.csv\n\n# Operate in the range [startFrame, stopFrame) so does not include the\n# last one.\n\n# See usage below.\n\n# TODO: Find a better way of picking DEMs to blend. For example,\n# include only those which decrease the mean error. Then compare\n# if this approach gives lower error than the current way\n# which keeps on adding DEMs left and right. \n\nimport os, sys, argparse, datetime, time, subprocess, logging, multiprocessing, re, glob\nimport traceback\nimport os.path as P\n\n# The path to the ASP python files and tools\nbasepath      = os.path.dirname(os.path.realpath(__file__))  # won't change, unlike syspath\npythonpath    = os.path.abspath(basepath + '/../Python')     # for dev ASP\nlibexecpath   = os.path.abspath(basepath + '/../libexec')    # for packaged ASP\nbinpath       = os.path.abspath(basepath + '/../bin')        # for packaged ASP\nicebridgepath = os.path.abspath(basepath + '/../IceBridge')  # IceBridge tools\ntoolspath     = os.path.abspath(basepath + '/../Tools')      # ASP Tools\n\n# Prepend to Python path\nsys.path.insert(0, basepath)\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\nsys.path.insert(0, icebridgepath)\n\nimport icebridge_common\nimport asp_system_utils, asp_alg_utils, asp_geo_utils\n\nasp_system_utils.verify_python_version_is_supported()\n\n# Prepend to system PATH\nos.environ[\"PATH\"] = basepath       + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = pythonpath     + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = libexecpath    + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = icebridgepath  + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = toolspath      + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = binpath        + os.pathsep + os.environ[\"PATH\"]\n\ndef getMeanDemDiff(dems, outputPrefix):\n    '''Get the mean distance between the input DEMs to the main DEM.'''\n\n    mainDem   = dems[0]\n    meanDiff  = 0.0\n    meanCount = 0.0\n    for i in range(1,len(dems)):\n        thisDem = dems[i]\n        if not thisDem:\n            continue\n            \n        diffPrefix = outputPrefix + '_' + str(i)\n        diffPath   = diffPrefix + '-diff.tif'\n        cmd = ('geodiff --absolute %s %s -o %s' % (mainDem, thisDem, diffPrefix))\n        print(cmd)\n        asp_system_utils.executeCommand(cmd, diffPath, True, False)\n\n        try:\n            # Read in and examine the results\n            results = icebridge_common.readGeodiffOutput(diffPath)\n            print(\"Found inter-DEM diff \" + str(i) + \" = \" + str(results['Mean']))\n            meanDiff = meanDiff + results['Mean']\n            meanCount = meanCount + 1.0\n        except:\n           print('No overlap with DEM ' + thisDem)\n        \n    if meanCount < 1: # Handle degenerate cases\n        return 0\n\n    meanDiff = meanDiff / meanCount\n    print('Mean of DEM diffs = ' + str(meanDiff))\n    return meanDiff\n\ndef runBlend(frame, processFolder, lidarFile, fireballDEM, options,\n             threadText, redo, suppressOutput):\n\n    WEIGHT_EXP = 1.3\n\n    # This will run as multiple processes. Hence have to catch all exceptions.\n    try:\n        \n        demFile, batchFolder = icebridge_common.frameToFile(frame, icebridge_common.alignFileName(),\n                                                            processFolder, options.bundleLength)\n        lidarCsvFormatString = icebridge_common.getLidarCsvFormat(lidarFile)\n\n        if demFile == \"\":\n            print(\"Could not find DEM for frame: \" + str(frame))\n            return\n\n        # The names for the final results\n        finalOutputPrefix = os.path.join(batchFolder, 'out-blend-DEM')\n        finalBlend        = finalOutputPrefix + '.tif'\n        finalDiff         = finalOutputPrefix + \"-diff.csv\"\n\n        fireballOutputPrefix = os.path.join(batchFolder, 'out-blend-fb-footprint')\n        fireballBlendOutput  = fireballOutputPrefix + '-tile-0.tif'\n        finalFireballOutput  = fireballOutputPrefix + '-DEM.tif'\n        fireballDiffPath     = fireballOutputPrefix + \"-diff.csv\"\n\n        # This is turned off for now. Find the diff between neighboring\n        # aligned DEMs before blending.\n        prevDemFile, prevBatchFolder = \\\n                     icebridge_common.frameToFile(frame-1,\n                                                  icebridge_common.alignFileName(),\n                                                  processFolder, options.bundleLength)\n        prevDiffPrefix = os.path.join(batchFolder, 'out-prev')\n        prevDiffFile   = prevDiffPrefix + '-diff.tif'\n        if options.computeDiffToPrev and redo and os.path.exists(prevDiffFile):\n            os.system(\"rm -f \" + prevDiffFile)\n        if os.path.exists(prevDemFile) and os.path.exists(demFile):\n            if os.path.exists(prevDiffFile):\n                print(\"File exists: \" + prevDiffFile)\n            else:\n                cmd = ('geodiff --absolute %s %s -o %s' % \n                       (prevDemFile, demFile, prevDiffPrefix))\n                print(cmd)\n                asp_system_utils.executeCommand(cmd, prevDiffFile, suppressOutput, redo)\n        \n        if not redo:\n            set1Exists = False\n            if (os.path.exists(finalBlend) and os.path.exists(finalDiff)):\n                print(\"Files exist: \" + finalBlend + \" \" + finalDiff + \".\")\n                set1Exists = True\n                \n            set2Exists = True\n            if fireballDEM != \"\":\n                if (os.path.exists(finalFireballOutput) and os.path.exists(fireballDiffPath)):\n                    print(\"Files exist: \" + finalFireballOutput + \" \" + fireballDiffPath + \".\")\n                    set2Exists = True\n                else:\n                    set2Exists = False\n\n            if set1Exists and set2Exists:\n                return\n\n        # We will blend the dems with frame offsets within frameOffsets[0:index]\n        filesToWipe = []\n        bestMean    = 1.0e+100\n        bestBlend   = ''\n        bestVals    = ''\n        bestDiff    = ''\n        \n        # Look at frames with these offsets when blending\n        frameOffsets = [0, 1, -1, 2, -2]\n\n        for index in range(len(frameOffsets)):\n\n            # Find all the DEMs up to the current index\n            dems = []\n            currDemFile = \"\"\n            for val in range(0, index+1):\n                offset = frameOffsets[val]\n                currDemFile, currBatchFolder = \\\n                             icebridge_common.frameToFile(frame + offset,\n                                                          icebridge_common.alignFileName(),\n                                                          processFolder, options.bundleLength)\n                if currDemFile == \"\":\n                    continue\n                dems.append(currDemFile)\n\n            if currDemFile == \"\":\n                # The last DEM was not present. Hence this iteration will add nothing new.\n                continue\n\n            # Compute the mean distance between the DEMs\n            # TODO: Make sure this gets cleaned up!\n            meanWorkPrefix = os.path.join(batchFolder, 'bd')\n            meanDiff       = getMeanDemDiff(dems, meanWorkPrefix)\n            \n            # If the mean error between DEMs is creater than this,\n            #  use a less aggressive blending method.\n            MEAN_DIFF_BLEND_THRESHOLD = 1.0\n\n            demString    = \" \".join(dems)\n            outputPrefix = os.path.join(batchFolder, 'out-blend-' + str(index))\n\n            # Blend DEMs together using dem_mosaic\n            demString = \" \".join(demFiles)\n            cmd = ('dem_mosaic --weights-exponent %f %s %s -o %s' \n                   % (WEIGHT_EXP, demString, threadText, outputPrefix))\n            if meanDiff > MEAN_DIFF_BLEND_THRESHOLD:\n                cmd += ' --propagate-nodata  --use-centerline-weights '\n            print(cmd)\n\n            # Execute the blend command.\n            # - Sometimes there is junk left from a previous interrupted run. So if we\n            # got so far, recreate all files.\n            localRedo = True\n            print(cmd)\n            asp_system_utils.executeCommand(cmd, blendOutput, suppressOutput, localRedo)\n            filesToWipe.append(blendOutput)\n            \n            diffPath = outputPrefix + \"-diff.csv\"\n            filesToWipe.append(diffPath)\n            \n            # Compute post-blending error to lidar\n            cmd = ('geodiff --absolute --csv-format %s %s %s -o %s' % \n                   (lidarCsvFormatString, blendOutput, lidarFile, outputPrefix))\n            print(cmd)\n            asp_system_utils.executeCommand(cmd, diffPath, suppressOutput, redo)\n                \n            # Read in and examine the results\n            try:\n                results = icebridge_common.readGeodiffOutput(diffPath)\n                print(\"Current mean error to lidar is \" + str(results['Mean']))\n\n                if  bestMean > float(results['Mean']):\n                    bestMean  = float(results['Mean'])\n                    bestBlend = blendOutput\n                    bestVals  = demString\n                    bestDiff  = diffPath\n            except Exception as e:\n                pass\n            \n            logFiles = glob.glob(outputPrefix + \"*\" + \"-log-\" + \"*\")\n            filesToWipe += logFiles\n        \n        # Update the filenames of the output files\n        print(\"Best mean error to lidar is \" + str(bestMean) + \" when blending \" + bestVals)\n        cmd = \"mv \" + bestBlend + \" \" + finalBlend\n        print(cmd)\n        asp_system_utils.executeCommand(cmd, finalBlend, suppressOutput, redo)\n        \n        cmd = \"mv \" + bestDiff   + \" \" + finalDiff\n        print(cmd)\n        asp_system_utils.executeCommand(cmd, finalDiff, suppressOutput, redo)\n        \n        # Generate a thumbnail of the final DEM\n        hillOutput = finalOutputPrefix+'_HILLSHADE.tif'\n        cmd = 'hillshade ' + finalBlend +' -o ' + hillOutput\n        asp_system_utils.executeCommand(cmd, hillOutput, suppressOutput, redo)\n\n        # Generate a low resolution compressed thumbnail of the hillshade for debugging\n        thumbOutput = finalOutputPrefix + '_HILLSHADE_browse.tif'\n        cmd = 'gdal_translate '+hillOutput+' '+thumbOutput+' -of GTiff -outsize 40% 40% -b 1 -co \"COMPRESS=JPEG\"'\n        asp_system_utils.executeCommand(cmd, thumbOutput, suppressOutput, redo)\n        os.system(\"rm -f \" + hillOutput) # Remove this file to keep down the file count\n\n        # Do another blend, to this DEM's footprint, but not using it\n        if fireballDEM != \"\":\n            \n            # Find all the DEMs\n            dems = []\n            for val in range(0, len(frameOffsets)):\n                offset = frameOffsets[val]\n                currDemFile, currBatchFolder = \\\n                             icebridge_common.frameToFile(frame + offset,\n                                                          icebridge_common.alignFileName(),\n                                                          processFolder, options.bundleLength)\n                if currDemFile == \"\":\n                    continue\n                dems.append(currDemFile)\n                \n            demString = \" \".join(dems)\n            cmd = ('dem_mosaic --weights-exponent %f %s %s -o %s' \n                   % (WEIGHT_EXP, demString, threadText, fireballOutputPrefix))\n            \n            #filesToWipe.append(fireballBlendOutput)\n\n            print(cmd)\n\n            # Sometimes there is junk left from a previous interrupted run. So if we\n            # got so far, recreate all files.\n            localRedo = True\n            asp_system_utils.executeCommand(cmd, fireballBlendOutput, suppressOutput, localRedo)\n\n            #filesToWipe.append(fireballDiffPath)\n\n            cmd = ('geodiff --absolute --csv-format %s %s %s -o %s' % \n                   (lidarCsvFormatString, fireballBlendOutput, lidarFile, fireballOutputPrefix))\n            print(cmd)\n            asp_system_utils.executeCommand(cmd, fireballDiffPath, suppressOutput, redo)\n\n            # Read in and examine the results\n            try:\n                results = icebridge_common.readGeodiffOutput(fireballDiffPath)\n                print(\"Mean error to lidar in fireball footprint is \" + str(results['Mean']))\n                \n                cmd = \"mv \" + fireballBlendOutput   + \" \" + finalFireballOutput\n                print(cmd)\n                asp_system_utils.executeCommand(cmd, finalFireballOutput, suppressOutput, redo)\n            except Exception as e:\n                pass\n            \n            # Generate a thumbnail of the final DEM\n            #hillOutput = fireballOutputPrefix+'_HILLSHADE.tif'\n            #cmd = 'hillshade ' + finalFireballOutput +' -o ' + hillOutput\n            #print(cmd)\n            #asp_system_utils.executeCommand(cmd, hillOutput, suppressOutput, redo)\n\n            ## Generate a low resolution compressed thumbnail of the hillshade for debugging\n            #thumbOutput = fireballOutputPrefix + '_HILLSHADE_browse.tif'\n            #cmd = 'gdal_translate '+hillOutput+' '+thumbOutput+' -of GTiff -outsize 40% 40% -b 1 -co \"COMPRESS=JPEG\"'\n            #asp_system_utils.executeCommand(cmd, thumbOutput, suppressOutput, redo)\n            #os.system(\"rm -f \" + hillOutput) # Remove this file to keep down the file count\n            \n            logFiles = glob.glob(fireballOutputPrefix + \"*\" + \"-log-\" + \"*\")\n            filesToWipe += logFiles\n\n        # Done with dealing with the fireball footprint\n        \n        # Clean up extra files\n        for fileName in filesToWipe:\n            if os.path.exists(fileName):\n                print(\"Removing: \" + fileName)\n                os.system(\"rm -f \" + fileName)\n        # TODO: Handle this cleanup better!\n        os.system('rm -f ' + meanWorkPrefix + '*')\n                \n    except Exception as e:\n        print('Blending failed!\\n' + str(e) + \". \" + str(traceback.print_exc()))\n            \n    sys.stdout.flush()\n         \ndef main(argsIn):\n\n    try:\n        # Sample usage:\n        # python ~/projects/StereoPipeline/src/asp/IceBridge/blend_dems.py --site GR   \\\n        #   --yyyymmdd 20120315 --start-frame 2490 --stop-frame 2491 --bundle-length 2 \\\n        #   --num-threads 8 --num-processes 10\n        usage = '''blend_dems.py <options>'''\n                      \n        parser = argparse.ArgumentParser(usage=usage)\n\n        # Run selection\n        parser.add_argument(\"--yyyymmdd\",  dest=\"yyyymmdd\", required=True,\n                          help=\"Specify the year, month, and day in one YYYYMMDD string.\")\n        parser.add_argument(\"--site\",  dest=\"site\", required=True,\n                          help=\"Name of the location of the images (AN, GR, or AL)\")\n\n        parser.add_argument(\"--output-folder\",  dest=\"outputFolder\", default=None,\n                          help=\"Name of the output folder. If not specified, \" + \\\n                          \"use something like AN_YYYYMMDD.\")\n\n        # Processing options\n        parser.add_argument('--bundle-length', dest='bundleLength', default=2,\n                          type=int, help=\"The number of images to bundle adjust and process \" + \\\n                          \"in a single batch.\")\n\n        parser.add_argument('--start-frame', dest='startFrame', type=int,\n                          default=icebridge_common.getSmallestFrame(),\n                          help=\"Frame to start with.  Leave this and stop-frame blank to \" + \\\n                          \"process all frames.\")\n        parser.add_argument('--stop-frame', dest='stopFrame', type=int,\n                          default=icebridge_common.getLargestFrame(),\n                          help='Frame to stop on. This frame will also be processed.')\n\n        parser.add_argument(\"--processing-subfolder\",  dest=\"processingSubfolder\", default=None,\n                          help=\"Specify a subfolder name where the processing outputs will go. \"+\\\n                            \"The default is no additional folder.\")\n\n        parser.add_argument(\"--compute-diff-to-prev-dem\", action=\"store_true\",\n                            dest=\"computeDiffToPrev\", default=False,\n                            help=\"Compute the absolute difference between the current DEM \" +\n                            \"and the one before it.\")\n\n        parser.add_argument(\"--blend-to-fireball-footprint\", action=\"store_true\",\n                            dest=\"blendToFireball\", default=False,\n                            help=\"Create additional blended DEMs having the same \" + \\\n                            \"footprint as Fireball DEMs.\")\n\n        # Performance options  \n        parser.add_argument('--num-processes', dest='numProcesses', default=1,\n                          type=int, help='The number of simultaneous processes to run.')\n        parser.add_argument('--num-threads', dest='numThreads', default=8,\n                          type=int, help='The number of threads per process.')\n        options = parser.parse_args(argsIn)\n\n    except argparse.ArgumentError as msg:\n        parser.error(msg)\n        \n    icebridge_common.switchWorkDir()\n    \n    os.system(\"ulimit -c 0\") # disable core dumps\n    os.system(\"rm -f core.*\") # these keep on popping up\n    os.system(\"umask 022\")   # enforce files be readable by others\n    \n    if len(options.yyyymmdd) != 8 and len(options.yyyymmdd) != 9:\n        # Make an exception for 20100422a\n        raise Exception(\"The --yyyymmdd field must have length 8 or 9.\")\n\n    if options.outputFolder is None:\n        options.outputFolder = icebridge_common.outputFolder(options.site, options.yyyymmdd)\n        \n    os.system('mkdir -p ' + options.outputFolder)\n    logLevel = logging.INFO # Make this an option??\n    logger   = icebridge_common.setUpLogger(options.outputFolder, logLevel,\n                                            'icebridge_blend_log')\n\n    (out, err, status) = asp_system_utils.executeCommand(['uname', '-a'],\n                                                         suppressOutput = True)\n    logger.info(\"Running on machine: \" + out)\n    logger.info(str(argsIn))\n    \n    processFolder = os.path.join(options.outputFolder, 'processed')\n    \n    # Handle subfolder option.  This is useful for comparing results with different parameters!\n    if options.processingSubfolder:\n        processFolder = os.path.join(processFolder, options.processingSubfolder)\n        logger.info('Reading from processing subfolder: ' + options.processingSubfolder)\n\n    orthoFolder    = icebridge_common.getOrthoFolder(options.outputFolder)\n    orthoIndexPath = icebridge_common.csvIndexFile(orthoFolder)\n    if not os.path.exists(orthoIndexPath):\n        raise Exception(\"Error: Missing ortho index file: \" + orthoIndexPath + \".\")\n    (orthoFrameDict, orthoUrlDict) = icebridge_common.readIndexFile(orthoIndexPath)\n    \n    if options.blendToFireball:\n        fireballFrameDict = icebridge_common.getCorrectedFireballDems(options.outputFolder)\n        \n    lidarFolder = icebridge_common.getLidarFolder(options.outputFolder)\n    \n    threadText = ''\n    if options.numThreads:\n        threadText = '--threads ' + str(options.numThreads)\n    \n    redo = False\n    suppressOutput = True\n    taskHandles    = []\n    if options.numProcesses > 1:    \n        pool = multiprocessing.Pool(options.numProcesses)\n\n    # Bound the frames\n    sortedFrames = sorted(orthoFrameDict.keys())\n    if len(sortedFrames) > 0:\n        if options.startFrame < sortedFrames[0]:\n            options.startFrame = sortedFrames[0]\n        if options.stopFrame > sortedFrames[-1] + 1:\n            options.stopFrame = sortedFrames[-1] + 1\n    else:\n        # No ortho files, that means nothing to do\n        options.startFrame = 0\n        options.stopFrame  = 0 \n\n    for frame in range(options.startFrame, options.stopFrame):\n\n        if not frame in orthoFrameDict:\n            logger.info(\"Error: Missing ortho file for frame: \" + str(frame) + \".\")\n            continue\n        \n        orthoFile = orthoFrameDict[frame]\n        try:\n            lidarFile = icebridge_common.findMatchingLidarFile(orthoFile, lidarFolder)\n        except: # Skip if no lidar file matches this frame\n            continue\n\n        fireballDEM = \"\"\n        if options.blendToFireball:\n            if frame in fireballFrameDict:\n                fireballDEM = fireballFrameDict[frame]\n            else:\n                logger.info(\"No fireball DEM for frame: \" + str(frame))\n            \n        args = (frame, processFolder, lidarFile, fireballDEM, options, threadText,\n                redo, suppressOutput)\n\n        # Run things sequentially if only one process, to make it easy to debug\n        if options.numProcesses > 1:\n            taskHandles.append(pool.apply_async(runBlend, args))\n        else:\n            runBlend(*args)\n        \n    if options.numProcesses > 1:\n        icebridge_common.waitForTaskCompletionOrKeypress(taskHandles, logger, interactive = False, \n                                                         quitKey='q', sleepTime=20)\n        icebridge_common.stopTaskPool(pool)\n    \n# Run main function if file used from shell\nif __name__ == \"__main__\":\n    sys.exit(main(sys.argv[1:]))\n\n\n"
  },
  {
    "path": "src/asp/IceBridge/camera_lookup.txt",
    "content": "# Camera used for each flight, based on https://nsidc.org/data/IODCC0/\n# in the \"User Guide\" tab.\n\n# Fall 2009, Antarctic\n\nAN 20091016 IODCC0_20091020_AN_NASA_DMS01_opt.pdf\nAN 20091018 IODCC0_20091020_AN_NASA_DMS01_opt.pdf\nAN 20091020 IODCC0_20091020_AN_NASA_DMS01_opt.pdf\nAN 20091021 IODCC0_20091020_AN_NASA_DMS01_opt.pdf\nAN 20091024 IODCC0_20091020_AN_NASA_DMS01_opt.pdf\nAN 20091025 IODCC0_20091020_AN_NASA_DMS01_opt.pdf\nAN 20091027 IODCC0_20091020_AN_NASA_DMS01_opt.pdf\nAN 20091028 IODCC0_20091020_AN_NASA_DMS01_opt.pdf\nAN 20091029 IODCC0_20091020_AN_NASA_DMS01_opt.pdf\nAN 20091030 IODCC0_20091020_AN_NASA_DMS01_opt.pdf\nAN 20091031 IODCC0_20091020_AN_NASA_DMS01_opt.pdf\nAN 20091102 IODCC0_20091020_AN_NASA_DMS01_opt.pdf\nAN 20091103 IODCC0_20091020_AN_NASA_DMS01_opt.pdf\nAN 20091104 IODCC0_20091020_AN_NASA_DMS01_opt.pdf\nAN 20091105 IODCC0_20091020_AN_NASA_DMS01_opt.pdf\nAN 20091107 IODCC0_20091020_AN_NASA_DMS01_opt.pdf\nAN 20091109 IODCC0_20091020_AN_NASA_DMS01_opt.pdf\nAN 20091112 IODCC0_20091020_AN_NASA_DMS01_opt.pdf\nAN 20091115 IODCC0_20091020_AN_NASA_DMS01_opt.pdf\nAN 20091116 IODCC0_20091020_AN_NASA_DMS01_opt.pdf\nAN 20091118 IODCC0_20091020_AN_NASA_DMS01_opt.pdf\nAN 20091208 IODCC0_20091020_AN_NASA_DMS01_opt.pdf\n\n# Spring 2010, Arctic\n\nGR 20100317 IODCC0_2010_GR_NASA_DMS02.pdf\nGR 20100322 IODCC0_2010_GR_NASA_DMS02.pdf\nGR 20100323 IODCC0_2010_GR_NASA_DMS02.pdf\nGR 20100324 IODCC0_2010_GR_NASA_DMS02.pdf\nGR 20100326 IODCC0_2010_GR_NASA_DMS02.pdf\nGR 20100329 IODCC0_2010_GR_NASA_DMS02.pdf\nGR 20100330 IODCC0_2010_GR_NASA_DMS02.pdf\nGR 20100402 IODCC0_2010_GR_NASA_DMS02.pdf\nGR 20100405 IODCC0_2010_GR_NASA_DMS02.pdf\nGR 20100409 IODCC0_2010_GR_NASA_DMS02.pdf\nGR 20100412 IODCC0_2010_GR_NASA_DMS02.pdf\nGR 20100413 IODCC0_2010_GR_NASA_DMS02.pdf\nGR 20100414 IODCC0_2010_GR_NASA_DMS02.pdf\nGR 20100419 IODCC0_2010_GR_NASA_DMS02.pdf\nGR 20100420 IODCC0_2010_GR_NASA_DMS02.pdf\nGR 20100421 IODCC0_2010_GR_NASA_DMS02.pdf\nGR 20100422 IODCC0_2010_GR_NASA_DMS02.pdf # two flights actually\nGR 20100423 IODCC0_2010_GR_NASA_DMS02.pdf\nGR 20100430 IODCC0_2010_GR_NASA_DMS02.pdf\nGR 20100507 IODCC0_2010_GR_NASA_DMS02.pdf\nGR 20100508 IODCC0_2010_GR_NASA_DMS02.pdf\nGR 20100510 IODCC0_2010_GR_NASA_DMS02.pdf\nGR 20100512 IODCC0_2010_GR_NASA_DMS02.pdf\nGR 20100513 IODCC0_2010_GR_NASA_DMS02.pdf\nGR 20100514 IODCC0_2010_GR_NASA_DMS02.pdf\nGR 20100515 IODCC0_2010_GR_NASA_DMS02.pdf\nGR 20100517 IODCC0_2010_GR_NASA_DMS02.pdf\nGR 20100519 IODCC0_2010_GR_NASA_DMS02.pdf\nGR 20100520 IODCC0_2010_GR_NASA_DMS02.pdf\nGR 20100521 IODCC0_2010_GR_NASA_DMS02.pdf\nGR 20100525 IODCC0_2010_GR_NASA_DMS02.pdf\nGR 20100526 IODCC0_2010_GR_NASA_DMS02.pdf\n\n# Fall 2010, Antarctic\n\nAN 20101016 IODCC0_2010_AN_NASA_DMS01.pdf # Flight 10/16/2010 all \n\n# Two cameras for this flight\nAN 20101026 IODCC0_2010_AN_NASA_DMS02_opt.pdf\nAN 20101026 IODCC0_2010_AN_NASA_DMS01.pdf Flight 10/26/2010 frames 00040-11982 \n  \nAN 20101028 IODCC0_2010_AN_NASA_DMS02_opt.pdf\nAN 20101030 IODCC0_2010_AN_NASA_DMS02_opt.pdf\nAN 20101104 IODCC0_2010_AN_NASA_DMS02_opt.pdf\nAN 20101105 IODCC0_2010_AN_NASA_DMS02_opt.pdf\nAN 20101106 IODCC0_2010_AN_NASA_DMS02_opt.pdf\nAN 20101110 IODCC0_2010_AN_NASA_DMS02_opt.pdf\nAN 20101113 IODCC0_2010_AN_NASA_DMS02_opt.pdf\nAN 20101119 IODCC0_2010_AN_NASA_DMS02_opt.pdf\nAN 20101120 IODCC0_2010_AN_NASA_DMS02_opt.pdf\n\n# Spring 2011, Arctic\n\nGR 20110309 IODCC0_2011_GR_NASA_DMS03_opt.pdf\nGR 20110316 IODCC0_2011_GR_NASA_DMS03_opt.pdf\nGR 20110317 IODCC0_2011_GR_NASA_DMS03_opt.pdf\nGR 20110318 IODCC0_2011_GR_NASA_DMS03_opt.pdf\nGR 20110322 IODCC0_2011_GR_NASA_DMS03_opt.pdf\nGR 20110323 IODCC0_2011_GR_NASA_DMS03_opt.pdf\nGR 20110325 IODCC0_2011_GR_NASA_DMS03_opt.pdf\nGR 20110326 IODCC0_2011_GR_NASA_DMS03_opt.pdf\nGR 20110328 IODCC0_2011_GR_NASA_DMS03_opt.pdf\nGR 20110329 IODCC0_2011_GR_NASA_DMS03_opt.pdf\nGR 20110331 IODCC0_2011_GR_NASA_DMS03_opt.pdf\nGR 20110406 IODCC0_2011_GR_NASA_DMS03_opt.pdf\nGR 20110407 IODCC0_2011_GR_NASA_DMS03_opt.pdf\nGR 20110408 IODCC0_2011_GR_NASA_DMS03_opt.pdf\nGR 20110411 IODCC0_2011_GR_NASA_DMS03_opt.pdf\nGR 20110412 IODCC0_2011_GR_NASA_DMS03_opt.pdf\nGR 20110413 IODCC0_2011_GR_NASA_DMS03_opt.pdf\nGR 20110414 IODCC0_2011_GR_NASA_DMS03_opt.pdf\nGR 20110415 IODCC0_2011_GR_NASA_DMS03_opt.pdf\nGR 20110416 IODCC0_2011_GR_NASA_DMS03_opt.pdf\nGR 20110418 IODCC0_2011_GR_NASA_DMS03_opt.pdf\nGR 20110419 IODCC0_2011_GR_NASA_DMS03_opt.pdf\nGR 20110422 IODCC0_2011_GR_NASA_DMS03_opt.pdf\nGR 20110423 IODCC0_2011_GR_NASA_DMS03_opt.pdf\nGR 20110425 IODCC0_2011_GR_NASA_DMS03_opt.pdf\nGR 20110426 IODCC0_2011_GR_NASA_DMS03_opt.pdf\nGR 20110428 IODCC0_2011_GR_NASA_DMS03_opt.pdf\nGR 20110429 IODCC0_2011_GR_NASA_DMS03_opt.pdf\nGR 20110502 IODCC0_2011_GR_NASA_DMS03_opt.pdf\nGR 20110504 IODCC0_2011_GR_NASA_DMS03_opt.pdf\nGR 20110505 IODCC0_2011_GR_NASA_DMS03_opt.pdf\nGR 20110506 IODCC0_2011_GR_NASA_DMS03_opt.pdf\nGR 20110507 IODCC0_2011_GR_NASA_DMS03_opt.pdf\nGR 20110509 IODCC0_2011_GR_NASA_DMS03_opt.pdf\nGR 20110510 IODCC0_2011_GR_NASA_DMS03_opt.pdf\nGR 20110511 IODCC0_2011_GR_NASA_DMS03_opt.pdf\nGR 20110512 IODCC0_2011_GR_NASA_DMS03_opt.pdf\nGR 20110513 IODCC0_2011_GR_NASA_DMS03_opt.pdf\n\n# Flight with two cameras\nGR 20110516 IODCC0_2011_GR_NASA_DMS03_opt.pdf\nGR 20110516 IODCC0_2011_GR_NASA_DMS04.pdf Flight 5/16/2011 frames 10338-10931 \n\nGR 20110519 IODCC0_2011_GR_NASA_DMS03_opt.pdf\n \n# Fall 2011, Antarctic\t\n\nAN 20111004 IODCC0_2011_AN_NASA_DMS04_opt.pdf\nAN 20111009 IODCC0_2011_AN_NASA_DMS04_opt.pdf\nAN 20111010 IODCC0_2011_AN_NASA_DMS04_opt.pdf\nAN 20111012 IODCC0_2011_AN_NASA_DMS04_opt.pdf\nAN 20111013 IODCC0_2011_AN_NASA_DMS04_opt.pdf\nAN 20111014 IODCC0_2011_AN_NASA_DMS04_opt.pdf\nAN 20111017 IODCC0_2011_AN_NASA_DMS04_opt.pdf\nAN 20111018 IODCC0_2011_AN_NASA_DMS04_opt.pdf\nAN 20111020 IODCC0_2011_AN_NASA_DMS04_opt.pdf\nAN 20111021 IODCC0_2011_AN_NASA_DMS04_opt.pdf\nAN 20111023 IODCC0_2011_AN_NASA_DMS04_opt.pdf\nAN 20111024 IODCC0_2011_AN_NASA_DMS04_opt.pdf\nAN 20111025 IODCC0_2011_AN_NASA_DMS04_opt.pdf\nAN 20111026 IODCC0_2011_AN_NASA_DMS04_opt.pdf\nAN 20111029 IODCC0_2011_AN_NASA_DMS04_opt.pdf\nAN 20111030 IODCC0_2011_AN_NASA_DMS04_opt.pdf\n\nAN 20111103 IODCC0_2011_AN_NASA_DMS05_opt.pdf\n\nAN 20111104 IODCC0_2011_AN_NASA_DMS04_opt.pdf\n\n# Flights 11/07/2011 thru 11/17/2011\nAN 20111107 IODCC0_2011_AN_NASA_DMS05_opt.pdf\nAN 20111109 IODCC0_2011_AN_NASA_DMS05_opt.pdf\nAN 20111111 IODCC0_2011_AN_NASA_DMS05_opt.pdf\nAN 20111112 IODCC0_2011_AN_NASA_DMS05_opt.pdf\nAN 20111113 IODCC0_2011_AN_NASA_DMS05_opt.pdf\nAN 20111114 IODCC0_2011_AN_NASA_DMS05_opt.pdf\nAN 20111116 IODCC0_2011_AN_NASA_DMS05_opt.pdf\nAN 20111117 IODCC0_2011_AN_NASA_DMS05_opt.pdf\n\n# Flight with two cameras\nAN 20111119 IODCC0_2011_AN_NASA_DMS04_opt.pdf\nAN 20111119 IODCC0_2011_AN_NASA_DMS05_opt.pdf Flight 11/19/2011 frames 00011-12762\nAN 20111119 IODCC0_2011_AN_NASA_DMS05_opt.pdf Flight 11/19/2011 frames 14330-14388 \n\n# Spring 2012, Arctic\n\n# Flights 3/6/2012 thru 4/4/2012\nGR 20120306 IODCC0_2012_GR_NASA_DMS06_opt.pdf\nGR 20120314 IODCC0_2012_GR_NASA_DMS06_opt.pdf\nGR 20120315 IODCC0_20120315_GR_NASA_DMS06_opt.pdf\nGR 20120316 IODCC0_20120315_GR_NASA_DMS06_opt.pdf\nGR 20120317 IODCC0_20120315_GR_NASA_DMS06_opt.pdf\nGR 20120319 IODCC0_2012_GR_NASA_DMS06_opt.pdf\nGR 20120321 IODCC0_2012_GR_NASA_DMS06_opt.pdf\nGR 20120322 IODCC0_2012_GR_NASA_DMS06_opt.pdf\nGR 20120323 IODCC0_2012_GR_NASA_DMS06_opt.pdf\nGR 20120326 IODCC0_2012_GR_NASA_DMS06_opt.pdf\nGR 20120327 IODCC0_2012_GR_NASA_DMS06_opt.pdf\nGR 20120328 IODCC0_2012_GR_NASA_DMS06_opt.pdf\nGR 20120329 IODCC0_2012_GR_NASA_DMS06_opt.pdf\nGR 20120330 IODCC0_2012_GR_NASA_DMS06_opt.pdf\nGR 20120402 IODCC0_2012_GR_NASA_DMS06_opt.pdf\nGR 20120404 IODCC0_2012_GR_NASA_DMS06_opt.pdf\n\n# Flights 4/10/2012 thru 5/17/2012\nGR 20120410 IODCC0_2012_GR_NASA_DMS08_opt.pdf\nGR 20120411 IODCC0_2012_GR_NASA_DMS08_opt.pdf\nGR 20120412 IODCC0_2012_GR_NASA_DMS08_opt.pdf\nGR 20120413 IODCC0_2012_GR_NASA_DMS08_opt.pdf\nGR 20120414 IODCC0_2012_GR_NASA_DMS08_opt.pdf\nGR 20120416 IODCC0_2012_GR_NASA_DMS08_opt.pdf\nGR 20120417 IODCC0_2012_GR_NASA_DMS08_opt.pdf\nGR 20120418 IODCC0_2012_GR_NASA_DMS08_opt.pdf\nGR 20120419 IODCC0_2012_GR_NASA_DMS08_opt.pdf\nGR 20120420 IODCC0_2012_GR_NASA_DMS08_opt.pdf\nGR 20120421 IODCC0_2012_GR_NASA_DMS08_opt.pdf \nGR 20120423 IODCC0_2012_GR_NASA_DMS08_opt.pdf \nGR 20120425 IODCC0_2012_GR_NASA_DMS08_opt.pdf \nGR 20120428 IODCC0_2012_GR_NASA_DMS08_opt.pdf\nGR 20120429 IODCC0_2012_GR_NASA_DMS08_opt.pdf\nGR 20120430 IODCC0_2012_GR_NASA_DMS08_opt.pdf\nGR 20120502 IODCC0_2012_GR_NASA_DMS08_opt.pdf\nGR 20120503 IODCC0_2012_GR_NASA_DMS08_opt.pdf\nGR 20120504 IODCC0_2012_GR_NASA_DMS08_opt.pdf\nGR 20120507 IODCC0_2012_GR_NASA_DMS08_opt.pdf\nGR 20120508 IODCC0_2012_GR_NASA_DMS08_opt.pdf\nGR 20120509 IODCC0_2012_GR_NASA_DMS08_opt.pdf\nGR 20120510 IODCC0_2012_GR_NASA_DMS08_opt.pdf\nGR 20120511 IODCC0_2012_GR_NASA_DMS08_opt.pdf\nGR 20120514 IODCC0_2012_GR_NASA_DMS08_opt.pdf\nGR 20120515 IODCC0_2012_GR_NASA_DMS08_opt.pdf\nGR 20120516 IODCC0_2012_GR_NASA_DMS08_opt.pdf\nGR 20120517 IODCC0_2012_GR_NASA_DMS08_opt.pdf\n\n# Fall 2012, Antarctic\n \nAN 20121003 IODCC0_2012_AN_NASA_DMS07_opt.pdf\nAN 20121012 IODCC0_2012_AN_NASA_DMS07_opt.pdf\nAN 20121013 IODCC0_2012_AN_NASA_DMS07_opt.pdf\nAN 20121015 IODCC0_2012_AN_NASA_DMS07_opt.pdf\nAN 20121016 IODCC0_2012_AN_NASA_DMS07_opt.pdf\nAN 20121018 IODCC0_2012_AN_NASA_DMS07_opt.pdf\nAN 20121019 IODCC0_2012_AN_NASA_DMS07_opt.pdf\nAN 20121022 IODCC0_2012_AN_NASA_DMS07_opt.pdf\nAN 20121023 IODCC0_2012_AN_NASA_DMS07_opt.pdf\nAN 20121025 IODCC0_2012_AN_NASA_DMS07_opt.pdf\nAN 20121027 IODCC0_2012_AN_NASA_DMS07_opt.pdf\nAN 20121028 IODCC0_2012_AN_NASA_DMS07_opt.pdf\nAN 20121101 IODCC0_2012_AN_NASA_DMS07_opt.pdf\nAN 20121102 IODCC0_2012_AN_NASA_DMS07_opt.pdf\nAN 20121104 IODCC0_2012_AN_NASA_DMS07_opt.pdf\nAN 20121106 IODCC0_2012_AN_NASA_DMS07_opt.pdf\t\n\n# Flight with two cameras \nAN 20121107 IODCC0_2012_AN_NASA_DMS07_opt.pdf\nAN 20121107 IODCC0_2012_AN_NASA_DMS09.pdf Flight 11/07/2012 frames 13920-17415\n\n# Spring 2013, Arctic\n\nGR 20130314 IODCC0_2013_GR_NASA_DMS10_opt.pdf\nGR 20130320 IODCC0_2013_GR_NASA_DMS10_opt.pdf\nGR 20130321 IODCC0_2013_GR_NASA_DMS10_opt.pdf\nGR 20130322 IODCC0_2013_GR_NASA_DMS10_opt.pdf\nGR 20130323 IODCC0_2013_GR_NASA_DMS10_opt.pdf\nGR 20130324 IODCC0_2013_GR_NASA_DMS10_opt.pdf\nGR 20130326 IODCC0_2013_GR_NASA_DMS10_opt.pdf\nGR 20130327 IODCC0_2013_GR_NASA_DMS10_opt.pdf\nGR 20130328 IODCC0_2013_GR_NASA_DMS10_opt.pdf\nGR 20130402 IODCC0_2013_GR_NASA_DMS10_opt.pdf\nGR 20130404 IODCC0_2013_GR_NASA_DMS10_opt.pdf\nGR 20130405 IODCC0_2013_GR_NASA_DMS10_opt.pdf\nGR 20130406 IODCC0_2013_GR_NASA_DMS10_opt.pdf\nGR 20130408 IODCC0_2013_GR_NASA_DMS10_opt.pdf\nGR 20130409 IODCC0_2013_GR_NASA_DMS10_opt.pdf\nGR 20130410 IODCC0_2013_GR_NASA_DMS10_opt.pdf\nGR 20130411 IODCC0_2013_GR_NASA_DMS10_opt.pdf\nGR 20130412 IODCC0_2013_GR_NASA_DMS10_opt.pdf\nGR 20130415 IODCC0_2013_GR_NASA_DMS10_opt.pdf\nGR 20130418 IODCC0_2013_GR_NASA_DMS10_opt.pdf\nGR 20130419 IODCC0_2013_GR_NASA_DMS10_opt.pdf\nGR 20130420 IODCC0_2013_GR_NASA_DMS10_opt.pdf\nGR 20130422 IODCC0_2013_GR_NASA_DMS10_opt.pdf\nGR 20130423 IODCC0_2013_GR_NASA_DMS10_opt.pdf\nGR 20130424 IODCC0_2013_GR_NASA_DMS10_opt.pdf\nGR 20130425 IODCC0_2013_GR_NASA_DMS10_opt.pdf\nGR 20130426 IODCC0_2013_GR_NASA_DMS10_opt.pdf\n\n# Fall 2013, Antarctic\n\nAN 20131108 IODCC0_20131127_AN_NASA_DMS12_opt.pdf\nAN 20131118 IODCC0_20131127_AN_NASA_DMS12_opt.pdf\nAN 20131119 IODCC0_20131127_AN_NASA_DMS12_opt.pdf\nAN 20131120 IODCC0_20131127_AN_NASA_DMS12_opt.pdf\nAN 20131125 IODCC0_20131127_AN_NASA_DMS12_opt.pdf\n\n# Flight with two cameras\nAN 20131126 IODCC0_20131127_AN_NASA_DMS12_opt.pdf\nAN 20131126 IODCC0_2013_AN_NASA_DMS11.pdf Flight 11/26/2013 frames 10551-16024\n\nAN 20131127 IODCC0_20131127_AN_NASA_DMS12_opt.pdf\n\n# Spring 2014, Arctic\n\nGR 20140306 IODCC0_2014_GR_NASA_DMS13_opt.pdf\nGR 20140310 IODCC0_2014_GR_NASA_DMS13_opt.pdf\nGR 20140312 IODCC0_2014_GR_NASA_DMS13_opt.pdf\nGR 20140313 IODCC0_2014_GR_NASA_DMS13_opt.pdf\nGR 20140314 IODCC0_2014_GR_NASA_DMS13_opt.pdf\nGR 20140315 IODCC0_2014_GR_NASA_DMS13_opt.pdf\nGR 20140317 IODCC0_2014_GR_NASA_DMS13_opt.pdf\nGR 20140318 IODCC0_2014_GR_NASA_DMS13_opt.pdf\nGR 20140319 IODCC0_2014_GR_NASA_DMS13_opt.pdf\nGR 20140321 IODCC0_2014_GR_NASA_DMS13_opt.pdf\nGR 20140324 IODCC0_2014_GR_NASA_DMS13_opt.pdf\nGR 20140325 IODCC0_2014_GR_NASA_DMS13_opt.pdf\nGR 20140326 IODCC0_2014_GR_NASA_DMS13_opt.pdf\nGR 20140328 IODCC0_2014_GR_NASA_DMS13_opt.pdf\nGR 20140331 IODCC0_2014_GR_NASA_DMS13_opt.pdf\nGR 20140401 IODCC0_2014_GR_NASA_DMS13_opt.pdf\nGR 20140403 IODCC0_2014_GR_NASA_DMS13_opt.pdf\nGR 20140404 IODCC0_2014_GR_NASA_DMS13_opt.pdf\nGR 20140405 IODCC0_2014_GR_NASA_DMS13_opt.pdf\nGR 20140407 IODCC0_2014_GR_NASA_DMS13_opt.pdf\nGR 20140408 IODCC0_2014_GR_NASA_DMS13_opt.pdf\nGR 20140409 IODCC0_2014_GR_NASA_DMS13_opt.pdf\nGR 20140410 IODCC0_2014_GR_NASA_DMS13_opt.pdf\nGR 20140412 IODCC0_2014_GR_NASA_DMS13_opt.pdf\nGR 20140414 IODCC0_2014_GR_NASA_DMS13_opt.pdf\nGR 20140415 IODCC0_2014_GR_NASA_DMS13_opt.pdf\nGR 20140416 IODCC0_2014_GR_NASA_DMS13_opt.pdf\nGR 20140419 IODCC0_2014_GR_NASA_DMS13_opt.pdf\nGR 20140421 IODCC0_2014_GR_NASA_DMS13_opt.pdf\nGR 20140423 IODCC0_2014_GR_NASA_DMS13_opt.pdf\n\n# Flight with two cameras\nGR 20140424 IODCC0_2014_GR_NASA_DMS13_opt.pdf\nGR 20140424 IODCC0_2014_GR_NASA_DMS14.pdf Flight 4/24/2014 frames 19842-20330\n \nGR 20140426 IODCC0_2014_GR_NASA_DMS13_opt.pdf\nGR 20140428 IODCC0_2014_GR_NASA_DMS13_opt.pdf\nGR 20140429 IODCC0_2014_GR_NASA_DMS13_opt.pdf\nGR 20140430 IODCC0_2014_GR_NASA_DMS13_opt.pdf\nGR 20140501 IODCC0_2014_GR_NASA_DMS13_opt.pdf\nGR 20140502 IODCC0_2014_GR_NASA_DMS13_opt.pdf\nGR 20140505 IODCC0_2014_GR_NASA_DMS13_opt.pdf\nGR 20140506 IODCC0_2014_GR_NASA_DMS13_opt.pdf\nGR 20140507 IODCC0_2014_GR_NASA_DMS13_opt.pdf\nGR 20140508 IODCC0_2014_GR_NASA_DMS13_opt.pdf\nGR 20140509 IODCC0_2014_GR_NASA_DMS13_opt.pdf\nGR 20140512 IODCC0_2014_GR_NASA_DMS13_opt.pdf\nGR 20140514 IODCC0_2014_GR_NASA_DMS13_opt.pdf\nGR 20140515 IODCC0_2014_GR_NASA_DMS13_opt.pdf\nGR 20140516 IODCC0_2014_GR_NASA_DMS13_opt.pdf\nGR 20140519 IODCC0_2014_GR_NASA_DMS13_opt.pdf\nGR 20140520 IODCC0_2014_GR_NASA_DMS13_opt.pdf\nGR 20140521 IODCC0_2014_GR_NASA_DMS13_opt.pdf\n\n# Fall 2014, Antarctic\n\nAN 20141008 IODCC0_2014_AN_NASA_DMS17_opt.pdf\nAN 20141016 IODCC0_2014_AN_NASA_DMS17_opt.pdf\nAN 20141018 IODCC0_2014_AN_NASA_DMS17_opt.pdf\nAN 20141020 IODCC0_2014_AN_NASA_DMS17_opt.pdf\nAN 20141023 IODCC0_2014_AN_NASA_DMS17_opt.pdf\nAN 20141025 IODCC0_2014_AN_NASA_DMS17_opt.pdf\nAN 20141026 IODCC0_2014_AN_NASA_DMS17_opt.pdf\nAN 20141028 IODCC0_2014_AN_NASA_DMS17_opt.pdf\nAN 20141029 IODCC0_2014_AN_NASA_DMS17_opt.pdf\nAN 20141102 IODCC0_2014_AN_NASA_DMS17_opt.pdf\nAN 20141103 IODCC0_2014_AN_NASA_DMS17_opt.pdf\nAN 20141105 IODCC0_2014_AN_NASA_DMS17_opt.pdf\nAN 20141106 IODCC0_2014_AN_NASA_DMS17_opt.pdf\nAN 20141107 IODCC0_2014_AN_NASA_DMS17_opt.pdf\nAN 20141108 IODCC0_2014_AN_NASA_DMS17_opt.pdf\n\nAN 20141110 IODCC0_2014_AN_NASA_DMS18_opt.pdf Flight 11/10/2014  all\n\nAN 20141111 IODCC0_2014_AN_NASA_DMS17_opt.pdf\nAN 20141113 IODCC0_2014_AN_NASA_DMS17_opt.pdf\nAN 20141114 IODCC0_2014_AN_NASA_DMS17_opt.pdf\nAN 20141115 IODCC0_2014_AN_NASA_DMS17_opt.pdf\nAN 20141116 IODCC0_2014_AN_NASA_DMS17_opt.pdf\nAN 20141121 IODCC0_2014_AN_NASA_DMS17_opt.pdf\nAN 20141122 IODCC0_2014_AN_NASA_DMS17_opt.pdf\n\n# Spring 2015, Arctic\n\nGR 20150313 IODCC0_20150408_GR_NASA_DMS19_opt.pdf\t\nGR 20150319 IODCC0_20150408_GR_NASA_DMS19_opt.pdf\t\n\n# Flight with two cameras\nGR 20150324 IODCC0_20150408_GR_NASA_DMS19_opt.pdf\t\nGR 20150324 IODCC0_2015_GR_NASA_DMS18.pdf Flight 3/24/2015 frames 08239-14656\n\nGR 20150325 IODCC0_20150408_GR_NASA_DMS19_opt.pdf\t\nGR 20150326 IODCC0_20150408_GR_NASA_DMS19_opt.pdf\t\nGR 20150327 IODCC0_20150408_GR_NASA_DMS19_opt.pdf\t\nGR 20150329 IODCC0_20150408_GR_NASA_DMS19_opt.pdf\t\nGR 20150330 IODCC0_20150408_GR_NASA_DMS19_opt.pdf\t\nGR 20150401 IODCC0_20150408_GR_NASA_DMS19_opt.pdf\t\nGR 20150403 IODCC0_20150408_GR_NASA_DMS19_opt.pdf\t\nGR 20150408 IODCC0_20150408_GR_NASA_DMS19_opt.pdf\t\nGR 20150409 IODCC0_20150408_GR_NASA_DMS19_opt.pdf\t\nGR 20150410 IODCC0_20150408_GR_NASA_DMS19_opt.pdf\t\nGR 20150411 IODCC0_20150408_GR_NASA_DMS19_opt.pdf\t\nGR 20150413 IODCC0_20150408_GR_NASA_DMS19_opt.pdf\t\n\n# Flight with two cameras\nGR 20150414 IODCC0_20150408_GR_NASA_DMS19_opt.pdf\t\nGR 20150414 IODCC0_2015_GR_NASA_DMS18.pdf Flight 4/14/2015 frames 00749-22182\n\nGR 20150417 IODCC0_20150408_GR_NASA_DMS19_opt.pdf\t\n\n# Flight with two cameras\nGR 20150418 IODCC0_20150408_GR_NASA_DMS19_opt.pdf\t\nGR 20150418 IODCC0_2015_GR_NASA_DMS18.pdf Flight 4/18/2015 frames 17050-17089\n\nGR 20150420 IODCC0_20150408_GR_NASA_DMS19_opt.pdf\t\nGR 20150421 IODCC0_20150408_GR_NASA_DMS19_opt.pdf\t\nGR 20150422 IODCC0_20150408_GR_NASA_DMS19_opt.pdf\t\n\n# Flight with two cameras\nGR 20150423 IODCC0_20150408_GR_NASA_DMS19_opt.pdf\t\nGR 20150423 IODCC0_2015_GR_NASA_DMS18.pdf Flight 4/23/2015 frames 11709-25232\n\nGR 20150424 IODCC0_20150408_GR_NASA_DMS19_opt.pdf\t\nGR 20150425 IODCC0_20150408_GR_NASA_DMS19_opt.pdf\t\nGR 20150427 IODCC0_20150408_GR_NASA_DMS19_opt.pdf\t\nGR 20150428 IODCC0_20150408_GR_NASA_DMS19_opt.pdf\t\nGR 20150430 IODCC0_20150408_GR_NASA_DMS19_opt.pdf\t\nGR 20150501 IODCC0_20150408_GR_NASA_DMS19_opt.pdf\t\nGR 20150505 IODCC0_20150408_GR_NASA_DMS19_opt.pdf\t\nGR 20150506 IODCC0_20150408_GR_NASA_DMS19_opt.pdf\t\nGR 20150507 IODCC0_20150408_GR_NASA_DMS19_opt.pdf\t\nGR 20150508 IODCC0_20150408_GR_NASA_DMS19_opt.pdf\t\nGR 20150511 IODCC0_20150408_GR_NASA_DMS19_opt.pdf\t\nGR 20150512 IODCC0_20150408_GR_NASA_DMS19_opt.pdf\t\nGR 20150515 IODCC0_20150408_GR_NASA_DMS19_opt.pdf\t\nGR 20150521 IODCC0_20150408_GR_NASA_DMS19_opt.pdf\t\nGR 20150522 IODCC0_20150408_GR_NASA_DMS19_opt.pdf\t\n\n# Fall 2015, Antarctic\t\nAN 20150910 IODCC0_2015_AN_NASA_DMS16_rot.pdf\nAN 20150911 IODCC0_2015_AN_NASA_DMS16_rot.pdf\nAN 20150917 IODCC0_2015_AN_NASA_DMS16_rot.pdf\nAN 20150922 IODCC0_2015_AN_NASA_DMS16_rot.pdf\nAN 20150924 IODCC0_2015_AN_NASA_DMS16_rot.pdf\n\nAN 20150926 IODCC0_2015_AN_NASA_DMS16_rot.pdf \nAN 20150926 IODCC0_2015_AN_NASA_DMS15_rot.pdf Flight 9/26/2015 frames 02114-02857\n\nAN 20150929 IODCC0_2015_AN_NASA_DMS16_rot.pdf\nAN 20151001 IODCC0_2015_AN_NASA_DMS16_rot.pdf\nAN 20151003 IODCC0_2015_AN_NASA_DMS16_rot.pdf\nAN 20151005 IODCC0_2015_AN_NASA_DMS16_rot.pdf\nAN 20151007 IODCC0_2015_AN_NASA_DMS16_rot.pdf\nAN 20151010 IODCC0_2015_AN_NASA_DMS16_rot.pdf\nAN 20151012 IODCC0_2015_AN_NASA_DMS16_rot.pdf\nAN 20151014 IODCC0_2015_AN_NASA_DMS16_rot.pdf\nAN 20151017 IODCC0_2015_AN_NASA_DMS16_rot.pdf\nAN 20151020 IODCC0_2015_AN_NASA_DMS16_rot.pdf\nAN 20151022 IODCC0_2015_AN_NASA_DMS16_rot.pdf\n\nAN 20151025 IODCC0_2015_AN_NASA_DMS16_rot.pdf\nAN 20151025 IODCC0_2015_AN_NASA_DMS15_rot.pdf Flight 10/25/2015 frames 01369-03289\n\nAN 20151027 IODCC0_2015_AN_NASA_DMS16_rot.pdf\nAN 20151029 IODCC0_2015_AN_NASA_DMS16_rot.pdf\nAN 20151031 IODCC0_2015_AN_NASA_DMS16_rot.pdf\nAN 20151101 IODCC0_2015_AN_NASA_DMS16_rot.pdf\n\n# Fall 2015, Arctic\n\nGR 20150915 IODCC0_2015_GR_NASA_DMS20_rot.pdf\nGR 20150923 IODCC0_2015_GR_NASA_DMS20_rot.pdf\nGR 20150924 IODCC0_2015_GR_NASA_DMS20_rot.pdf\nGR 20150925 IODCC0_2015_GR_NASA_DMS20_rot.pdf\nGR 20150928 IODCC0_2015_GR_NASA_DMS20_rot.pdf\nGR 20150930 IODCC0_2015_GR_NASA_DMS20_rot.pdf\nGR 20151005 IODCC0_2015_GR_NASA_DMS20_rot.pdf\nGR 20151006 IODCC0_2015_GR_NASA_DMS20_rot.pdf\nGR 20151008 IODCC0_2015_GR_NASA_DMS20_rot.pdf\nGR 20151009 IODCC0_2015_GR_NASA_DMS20_rot.pdf\nGR 20151013 IODCC0_2015_GR_NASA_DMS20_rot.pdf\nGR 20151018 IODCC0_2015_GR_NASA_DMS20_rot.pdf\nGR 20151019 IODCC0_2015_GR_NASA_DMS20_rot.pdf\nGR 20151020 IODCC0_2015_GR_NASA_DMS20_rot.pdf\nGR 20151021 IODCC0_2015_GR_NASA_DMS20_rot.pdf\nGR 20151022 IODCC0_2015_GR_NASA_DMS20_rot.pdf\n\n# Spring 2016, Arctic\nGR 20160322 IODCC0_2016_GR_NASA_DMS21_opt.pdf\nGR 20160412 IODCC0_2016_GR_NASA_DMS21_opt.pdf\nGR 20160419 IODCC0_2016_GR_NASA_DMS21_opt.pdf\nGR 20160420 IODCC0_2016_GR_NASA_DMS21_opt.pdf\nGR 20160421 IODCC0_2016_GR_NASA_DMS21_opt.pdf\nGR 20160429 IODCC0_2016_GR_NASA_DMS21_opt.pdf\nGR 20160503 IODCC0_2016_GR_NASA_DMS21_opt.pdf\nGR 20160504 IODCC0_2016_GR_NASA_DMS21_opt.pdf\nGR 20160509 IODCC0_2016_GR_NASA_DMS21_opt.pdf\nGR 20160510 IODCC0_2016_GR_NASA_DMS21_opt.pdf\nGR 20160511 IODCC0_2016_GR_NASA_DMS21_opt.pdf\nGR 20160512 IODCC0_2016_GR_NASA_DMS21_opt.pdf\nGR 20160513 IODCC0_2016_GR_NASA_DMS21_opt.pdf\nGR 20160514 IODCC0_2016_GR_NASA_DMS21_opt.pdf\nGR 20160516 IODCC0_2016_GR_NASA_DMS21_opt.pdf\nGR 20160517 IODCC0_2016_GR_NASA_DMS21_opt.pdf\nGR 20160518 IODCC0_2016_GR_NASA_DMS21_opt.pdf\nGR 20160519 IODCC0_2016_GR_NASA_DMS21_opt.pdf\n\n# Summer 2016 Alaska\nGR 20160629 IODCC0_2016_GR_NASA_DMS15_rot.pdf\nGR 20160713 IODCC0_2016_GR_NASA_DMS15_rot.pdf\nGR 20160714 IODCC0_2016_GR_NASA_DMS15_rot.pdf\nGR 20160715 IODCC0_2016_GR_NASA_DMS15_rot.pdf\nGR 20160719 IODCC0_2016_GR_NASA_DMS15_rot.pdf\nGR 20160720 IODCC0_2016_GR_NASA_DMS15_rot.pdf\nGR 20160721 IODCC0_2016_GR_NASA_DMS15_rot.pdf\n\n# Fall 2016, Antarctic\n\nAN 20161005 IODCC0_2016_AN_NASA_DMS22.pdf\nAN 20161014 IODCC0_2016_AN_NASA_DMS22.pdf\n\n# Flight with two cameras\nAN 20161015 IODCC0_2016_AN_NASA_DMS22.pdf\nAN 20161015 IODCC0_2016_AN_NASA_DMS23.pdf Flight 10/15/2016 frames 00006-00939 only\n\nAN 20161017 IODCC0_2016_AN_NASA_DMS22.pdf\nAN 20161020 IODCC0_2016_AN_NASA_DMS22.pdf\nAN 20161022 IODCC0_2016_AN_NASA_DMS22.pdf\nAN 20161024 IODCC0_2016_AN_NASA_DMS22.pdf\nAN 20161025 IODCC0_2016_AN_NASA_DMS22.pdf\nAN 20161026 IODCC0_2016_AN_NASA_DMS22.pdf\nAN 20161027 IODCC0_2016_AN_NASA_DMS22.pdf\nAN 20161028 IODCC0_2016_AN_NASA_DMS22.pdf\nAN 20161031 IODCC0_2016_AN_NASA_DMS22.pdf\nAN 20161102 IODCC0_2016_AN_NASA_DMS22.pdf\nAN 20161103 IODCC0_2016_AN_NASA_DMS22.pdf\nAN 20161104 IODCC0_2016_AN_NASA_DMS22.pdf\nAN 20161105 IODCC0_2016_AN_NASA_DMS22.pdf\nAN 20161107 IODCC0_2016_AN_NASA_DMS22.pdf\nAN 20161109 IODCC0_2016_AN_NASA_DMS22.pdf\nAN 20161110 IODCC0_2016_AN_NASA_DMS22.pdf\nAN 20161111 IODCC0_2016_AN_NASA_DMS22.pdf\nAN 20161112 IODCC0_2016_AN_NASA_DMS22.pdf\nAN 20161114 IODCC0_2016_AN_NASA_DMS22.pdf\nAN 20161115 IODCC0_2016_AN_NASA_DMS22.pdf\nAN 20161117 IODCC0_2016_AN_NASA_DMS22.pdf\nAN 20161118 IODCC0_2016_AN_NASA_DMS22.pdf\n\n# Spring 2017, Arctic\n\nGR 20170226 IODCC0_2017_GR_NASA_DMS25_opt.pdf \nGR 20170227 IODCC0_2017_GR_NASA_DMS25_opt.pdf\n\nGR 20170309 IODCC0_2017_GR_NASA_DMS24_opt.pdf\n\nGR 20170310 IODCC0_2017_GR_NASA_DMS25_opt.pdf\nGR 20170311 IODCC0_2017_GR_NASA_DMS25_opt.pdf\nGR 20170312 IODCC0_2017_GR_NASA_DMS25_opt.pdf\n\nGR 20170314 IODCC0_2017_GR_NASA_DMS25_opt.pdf frames 10-7561\nGR 20170314 IODCC0_2017_GR_NASA_DMS24_opt.pdf frames 7600-12920\n\nGR 20170320 IODCC0_2017_GR_NASA_DMS25_opt.pdf\nGR 20170322 IODCC0_2017_GR_NASA_DMS25_opt.pdf\nGR 20170323 IODCC0_2017_GR_NASA_DMS25_opt.pdf\nGR 20170324 IODCC0_2017_GR_NASA_DMS25_opt.pdf\nGR 20170327 IODCC0_2017_GR_NASA_DMS25_opt.pdf\nGR 20170328 IODCC0_2017_GR_NASA_DMS25_opt.pdf\nGR 20170329 IODCC0_2017_GR_NASA_DMS25_opt.pdf\nGR 20170330 IODCC0_2017_GR_NASA_DMS25_opt.pdf\nGR 20170331 IODCC0_2017_GR_NASA_DMS25_opt.pdf\nGR 20170403 IODCC0_2017_GR_NASA_DMS25_opt.pdf\nGR 20170405 IODCC0_2017_GR_NASA_DMS25_opt.pdf\nGR 20170406 IODCC0_2017_GR_NASA_DMS25_opt.pdf\nGR 20170407 IODCC0_2017_GR_NASA_DMS25_opt.pdf\n\nGR 20170410 IODCC0_2017_GR_NASA_DMS25_opt.pdf frames 6-7039\nGR 20170410 IODCC0_2017_GR_NASA_DMS24_opt.pdf frames 7040-15139\n\nGR 20170411 IODCC0_2017_GR_NASA_DMS24_opt.pdf\nGR 20170412 IODCC0_2017_GR_NASA_DMS24_opt.pdf\nGR 20170413 IODCC0_2017_GR_NASA_DMS24_opt.pdf\nGR 20170414 IODCC0_2017_GR_NASA_DMS24_opt.pdf\nGR 20170417 IODCC0_2017_GR_NASA_DMS24_opt.pdf\nGR 20170419 IODCC0_2017_GR_NASA_DMS24_opt.pdf\nGR 20170421 IODCC0_2017_GR_NASA_DMS24_opt.pdf\nGR 20170422 IODCC0_2017_GR_NASA_DMS24_opt.pdf\nGR 20170424 IODCC0_2017_GR_NASA_DMS24_opt.pdf\nGR 20170426 IODCC0_2017_GR_NASA_DMS24_opt.pdf\nGR 20170428 IODCC0_2017_GR_NASA_DMS24_opt.pdf\nGR 20170429 IODCC0_2017_GR_NASA_DMS24_opt.pdf\nGR 20170501 IODCC0_2017_GR_NASA_DMS24_opt.pdf\nGR 20170502 IODCC0_2017_GR_NASA_DMS24_opt.pdf\nGR 20170503 IODCC0_2017_GR_NASA_DMS24_opt.pdf\nGR 20170505 IODCC0_2017_GR_NASA_DMS24_opt.pdf\nGR 20170506 IODCC0_2017_GR_NASA_DMS24_opt.pdf\nGR 20170508 IODCC0_2017_GR_NASA_DMS24_opt.pdf\nGR 20170510 IODCC0_2017_GR_NASA_DMS24_opt.pdf\nGR 20170511 IODCC0_2017_GR_NASA_DMS24_opt.pdf\nGR 20170512 IODCC0_2017_GR_NASA_DMS24_opt.pdf\n\n# Summer 2017, Arctic\t\n\nGR 20170710 IODCC0_2017_GR_NASA_DMS26_rot.pdf\nGR 20170717 IODCC0_2017_GR_NASA_DMS26_rot.pdf\nGR 20170718 IODCC0_2017_GR_NASA_DMS26_rot.pdf\nGR 20170719 IODCC0_2017_GR_NASA_DMS26_rot.pdf\nGR 20170724 IODCC0_2017_GR_NASA_DMS26_rot.pdf\n\nGR 20170725 IODCC0_2017_GR_NASA_DMS26_rot.pdf frames 0006-2390\nGR 20170725 IODCC0_2017_GR_NASA_DMS22_rot.pdf frames 2391-7471\n\n# Fall 20017, Antarctic\n\nAN 20171029 IODCC0_20171029_AN_NASA_DMS27_opt.pdf\nAN 20171031 IODCC0_20171029_AN_NASA_DMS27_opt.pdf\nAN 20171103 IODCC0_20171029_AN_NASA_DMS27_opt.pdf\nAN 20171104 IODCC0_20171029_AN_NASA_DMS27_opt.pdf\nAN 20171112 IODCC0_20171029_AN_NASA_DMS27_opt.pdf\nAN 20171114 IODCC0_20171029_AN_NASA_DMS27_opt.pdf\nAN 20171116 IODCC0_20171029_AN_NASA_DMS27_opt.pdf\nAN 20171116 IODCC0_2017_AN_NASA_DMS22.pdf frames 0240-2626\nAN 20171121 IODCC0_20171029_AN_NASA_DMS27_opt.pdf\nAN 20171122 IODCC0_20171029_AN_NASA_DMS27_opt.pdf\nAN 20171124 IODCC0_20171029_AN_NASA_DMS27_opt.pdf\nAN 20171125 IODCC0_20171029_AN_NASA_DMS27_opt.pdf\nAN 20171129 IODCC0_20171029_AN_NASA_DMS27_opt.pdf\n\nSee also special_cases.txt\n\n"
  },
  {
    "path": "src/asp/IceBridge/camera_models_from_nav.py",
    "content": "#!/usr/bin/env python\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n# Compile a list of all the dates with data available\n\nimport os, sys, optparse, subprocess, logging\n\n# The path to the ASP python files\nbasepath    = os.path.abspath(sys.path[0])\npythonpath  = os.path.abspath(basepath + '/../Python')     # for dev ASP\nlibexecpath = os.path.abspath(basepath + '/../libexec')    # for packaged ASP\nsys.path.insert(0, basepath) # prepend to Python path\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\n\nimport asp_system_utils, asp_file_utils, icebridge_common\nasp_system_utils.verify_python_version_is_supported()\n\n# Prepend to system PATH\nos.environ[\"PATH\"] = libexecpath + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = basepath    + os.pathsep + os.environ[\"PATH\"]\n\n#------------------------------------------------------------------------------\n\n# TODO: Fetch the input nav file in the main fetch script\n\ndef main(argsIn):\n\n    # Command line parsing\n\n    try:\n        usage  = \"usage: camera_models_from_nav.py <image_folder> <ortho_folder> <cal_folder> <nav_folder> <output_folder> [options]\"\n                      \n        parser = optparse.OptionParser(usage=usage)\n\n        parser.add_option('--start-frame', dest='startFrame', default=-1,\n                          type='int', help='The frame number to start processing with.')\n        parser.add_option('--stop-frame', dest='stopFrame', default=999999,\n                          type='int', help='The frame number to finish processing with.')        \n        parser.add_option(\"--input-calibration-camera\",  dest=\"inputCalCamera\", default=\"\",\n                          help=\"Use this input calibrated camera.\")\n        parser.add_option('--camera-mounting', dest='cameraMounting',  default=0, type='int',\n            help='0=right-forwards, 1=left-forwards, 2=top-forwards, 3=bottom-forwards.')\n        (options, args) = parser.parse_args(argsIn)\n\n        if len(args) < 5:\n            print ('Error: Missing arguments.')\n            print (usage)\n            return -1\n\n        imageFolder  = os.path.abspath(args[0])\n        orthoFolder  = os.path.abspath(args[1])\n        calFolder    = os.path.abspath(args[2])\n        navFolder    = os.path.abspath(args[3])\n        outputFolder = os.path.abspath(args[4])\n\n    except optparse.OptionError as msg:\n        raise Usage(msg)\n\n\n    runDir = os.path.dirname(orthoFolder)\n    os.system(\"mkdir -p \" + runDir)\n    \n    logLevel = logging.INFO # Make this an option??\n    logger   = icebridge_common.setUpLogger(runDir, logLevel,\n                                            'camera_models_from_nav_log')\n    if not os.path.exists(orthoFolder):\n        logger.error('Ortho folder ' + orthoFolder + ' does not exist!')\n        return -1\n\n    # Find the nav file\n    # - There should only be one or two nav files per flight.\n    fileList = os.listdir(navFolder)\n    fileList = [x for x in fileList if '.out' in x]\n    if len(fileList) == 0:\n        logger.error('No nav files in: ' + navFolder)\n        return -1\n\n    navPath = os.path.join(navFolder, fileList[0])\n    parsedNavPath = navPath.replace('.out', '.txt')\n\n    if not asp_file_utils.fileIsNonZero(navPath):\n        logger.error('Nav file ' + navPath + ' is invalid!')\n        return -1\n\n    # Create the output file only if it is empty or does not exist\n    isNonEmpty = asp_file_utils.fileIsNonZero(parsedNavPath)\n\n    if not isNonEmpty:\n        # Initialize the output file as being empty\n        logger.info(\"Create empty file: \" + parsedNavPath)\n        open(parsedNavPath, 'w').close()\n        \n    # Append to the output parsed nav file\n    for fileName in fileList:\n        # Convert the nav file from binary to text    \n        navPath = os.path.join(navFolder, fileName)\n\n        with open(navPath, 'r') as f:\n            try:\n                text = f.readline()\n                if 'HTML' in text:\n                    # Sometimes the server is down, and instead of the binary nav file\n                    # we are given an html file with an error message.\n                    logger.info(\"Have invalid nav file: \" + navPath)\n                    return -1 # Die in this case!\n            except UnicodeDecodeError as e:\n                # Got a binary file, that means likely we are good\n                pass\n\n        cmd = asp_system_utils.which('sbet2txt.pl') + ' -q ' + navPath + ' >> ' + parsedNavPath\n        logger.info(cmd)\n        if not isNonEmpty:\n            os.system(cmd)\n\n    cameraPath = options.inputCalCamera\n    if cameraPath == \"\":\n        # No input camera file provided, look one up. It does not matter much,\n        # as later ortho2pinhole will insert the correct intrinsics.\n        goodFile = False\n        fileList = os.listdir(calFolder)\n        fileList = [x for x in fileList if (('.tsai' in x) and ('~' not in x))]\n        if not fileList:\n            logger.error('Unable to find any camera files in ' + calFolder)\n            return -1\n        for fileName in fileList:\n            cameraPath = os.path.join(calFolder, fileName)\n            #  Check if this path is valid\n            with open(cameraPath, 'r') as f:\n                for line in f:\n                    if 'fu' in line:\n                        goodFile = True\n                        break\n            if goodFile:\n                break\n            \n    # Get the ortho list\n    orthoFiles = icebridge_common.getTifs(orthoFolder)\n    logger.info('Found ' + str(len(orthoFiles)) + ' ortho files.')\n\n    # Look up the frame numbers for each ortho file\n    infoDict = {}\n    for ortho in orthoFiles:\n        if ('gray' in ortho) or ('sub' in ortho):\n            continue\n        frame = icebridge_common.getFrameNumberFromFilename(ortho)\n        if frame < options.startFrame or frame > options.stopFrame:\n            continue\n        infoDict[frame] = [ortho, '']\n\n    # Get the image file list\n    try:\n        imageFiles = icebridge_common.getTifs(imageFolder)\n    except Exception as e:\n        raise Exception(\"Cannot continue with nav generation, will resume later when images are created. This is not a fatal error. \" + str(e))\n    \n    logger.info('Found ' + str(len(imageFiles)) + ' image files.')\n\n    # Update the second part of each dictionary object\n    for image in imageFiles:\n        if ('gray' in image) or ('sub' in image):\n            continue\n        frame = icebridge_common.getFrameNumberFromFilename(image)\n        if frame < options.startFrame or frame > options.stopFrame:\n            continue\n        if frame not in infoDict:\n            logger.info('Image missing ortho file: ' +image)\n            # don't throw here, that will mess the whole batch, we will recover\n            # the missing one later.\n            continue \n        infoDict[frame][1] = image\n\n    os.system('mkdir -p ' + outputFolder)\n    orthoListFile = os.path.join(outputFolder, 'ortho_file_list_' + \n                                 str(options.startFrame) + \"_\" + \n                                 str(options.stopFrame) + '.csv')\n\n    # Open the output file for writing\n    logger.info(\"Writing: \" + orthoListFile)\n    with open(orthoListFile, 'w') as outputFile:\n\n        # Loop through frames in order\n        for key in sorted(infoDict):\n        \n            # Write the ortho name and the output camera name to the file\n            (ortho, image) = infoDict[key]\n            if not image:\n                #raise Exception('Ortho missing image file: ' +ortho)\n                continue\n            camera = image.replace('.tif', '.tsai')\n            outputFile.write(ortho +', ' + camera + '\\n')\n\n    # Check if we already have all of the output camera files.\n    haveAllFiles = True\n    with open(orthoListFile, 'r') as inputFile:\n        for line in inputFile:\n            parts   = line.split(',')\n            camPath = os.path.join(outputFolder, parts[1].strip())\n            if not asp_file_utils.fileIsNonZero(camPath):\n                logger.info('Missing file -> ' + camPath)\n                haveAllFiles = False\n                break\n\n\n    # Call the C++ tool to generate a camera model for each ortho file\n    if not haveAllFiles:\n        cmd = ('nav2cam --input-cam %s --nav-file %s --cam-list %s --output-folder %s --camera-mounting %d' \n               % (cameraPath, parsedNavPath, orthoListFile, outputFolder, options.cameraMounting))\n        logger.info(cmd)\n        os.system(cmd)\n    else:\n        logger.info(\"All nav files were already generated.\")\n\n      \n    # Generate a kml file for the nav camera files\n    kmlPath = os.path.join(outputFolder, 'nav_cameras.kml')\n\n    # This is a hack. If we are invoked from a Pleiades node, do not\n    # create this kml file, as nodes will just overwrite each other.\n    # This job may happen anyway earlier or later when on the head node.\n    if not 'PBS_NODEFILE' in os.environ:\n        try:\n            tempPath = os.path.join(outputFolder, 'list.txt')\n            logger.info('Generating nav camera kml file: ' + kmlPath)\n            os.system('ls ' + outputFolder + '/*.tsai > ' + tempPath)\n            orbitviz_pinhole = asp_system_utils.which('orbitviz_pinhole')\n            cmd = orbitviz_pinhole + ' --hide-labels -o ' + kmlPath + ' --input-list ' + tempPath\n            logger.info(cmd)\n            asp_system_utils.executeCommand(cmd, kmlPath, suppressOutput=True, redo=False)\n            os.remove(tempPath)\n        except Exception as e:\n            logger.info(\"Warning: \" + str(e))\n        \n    logger.info('Finished generating camera models from nav!')\n    \n    return 0\n\n\nif __name__ == \"__main__\":\n    sys.exit(main(sys.argv[1:]))\n\n\n\n"
  },
  {
    "path": "src/asp/IceBridge/correct_icebridge_l3_dem.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <vw/FileIO/DiskImageResource.h>\n#include <vw/FileIO/DiskImageView.h>\n#include <vw/Cartography/GeoReferenceUtils.h>\n#include <boost/program_options.hpp>\n\n/**\n  A simple tool to fix the Icebridge L3 dems located here: http://nsidc.org/data/iodms3\n  \n  The files are missing a tag indicating that they are type float and are incorrectly\n  read as type uint32.  They are also missing the projection information.  This tool\n  just rewrites the file so that this information is added.\n*/\n\nusing namespace vw;\nusing namespace vw::cartography;\n\nnamespace po = boost::program_options;\nnamespace fs = boost::filesystem;\n\nusing namespace vw::cartography;\nint main( int argc, char *argv[] ) {\n\n  // Simple input parsing\n  if (argc < 4) {\n    vw_out() << \"Usage: <input path> <output path> <Pole: North=1, South=0>\\n\"; \n    return -1;\n  }\n  std::string input_path  = argv[1];\n  std::string output_path = argv[2];\n  int pole = atoi(argv[3]);  // Specify which polar projection to use\n\n  // Load the existing georeference info, then add the projection info.\n  DiskImageResourceGDAL in_rsrc(input_path);\n  GeoReference georef;\n  bool has_georef = read_georeference(georef, in_rsrc);\n  if (!has_georef) {\n    vw_throw( ArgumentErr() << \"Could not read the georeference from: \" << input_path  \n\t      << \". Check if the corresponding .tfw file is present.\\n\");\n  }\n  \n  //vw_out() << \"Georef = \" << georef << std::endl;\n  if (pole) // EPSG:3413\n    georef.set_proj4_projection_str(\"+proj=stere +lat_0=90 +lon_0=-45 +lat_ts=70 +ellps=WGS84 +datum=WGS84 +units=m\");\n  else // EPSG:3031\n    georef.set_proj4_projection_str(\"+proj=stere +lat_0=-90 +lon_0=0 +lat_ts=-71 +ellps=WGS84 +datum=WGS84 +units=m\");\n  //vw_out() << \"Output Georef = \" << georef << std::endl;\n\n  // Set nodata if it is not already set.  This should be constant across files.\n  double nodata_val = -32767; // Somehow -32767 is hard-coded in those files.\n  if ( in_rsrc.has_nodata_read() ) {\n    nodata_val = in_rsrc.nodata_read();\n    vw_out() << \"\\tFound input nodata value: \" << nodata_val << std::endl;\n  }\n  \n  // Rasterize the input data using the incorrect uint32 type.\n  DiskImageView<uint32> input_dem(in_rsrc); \n  ImageView<uint32>     data_in = input_dem;\n  \n  // Make a float casted copy of the image data.\n  ImageView<float> data_out(data_in.cols(), data_in.rows());\n  size_t num_bytes = data_in.cols()*data_in.rows()*sizeof(float);\n  memcpy(data_out.data(), data_in.data(), num_bytes);\n\n  // Write the output file.  \n  GdalWriteOptions opt;\n  vw_out() << \"Writing: \" << output_path << std::endl;\n  block_write_gdal_image(output_path, data_out, true, georef, true, nodata_val, opt,\n                         TerminalProgressCallback(\"vw\",\"\"));\n           \n  return 0;\n}\n"
  },
  {
    "path": "src/asp/IceBridge/extract_icebridge_ATM_points.py",
    "content": "#!/usr/bin/env python\n\nimport sys, os, argparse\n\n# The path to the ASP qi2txt file\nbasepath    = os.path.abspath(sys.path[0])\npythonpath  = os.path.abspath(basepath + '/../Python')  # for dev ASP\nlibexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP\nsys.path.insert(0, basepath) # prepend to path\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\n\nos.environ[\"PATH\"] = libexecpath + os.pathsep + os.environ[\"PATH\"]\n\nimport sys\nimport os, glob, re, shutil, subprocess, string, time, errno, optparse, math\n\nimport asp_system_utils, asp_cmd_utils\nasp_system_utils.verify_python_version_is_supported()\n\n# Prepend to system PATH\nos.environ[\"PATH\"] = libexecpath + os.pathsep + os.environ[\"PATH\"]\n\ndef extract_qi_points(inputPath):\n    '''Extract data from a n Icebridge qi file.\n       Use this ASP format code to read: --csv-format 1:lat,2:lon,3:height_above_datum '''\n\n    # Extract the data from the name\n    name       = os.path.basename(inputPath)\n    start      = name.find('_')\n    stop       = name.rfind('_')\n    dateString = name[start+1:stop]\n    year       = int(dateString[0:4])\n    month      = int(dateString[4:6])\n    \n    # Check if the file is little endian\n    endianFlag = ' -L '\n    if (year < 2010) or ((year == 2010) and (month < 10)):\n        endianFlag = ' ' # Earlier dates are big endian, later dates are little endian.\n\n    outputPath = inputPath.replace('.qi', '.csv')\n\n    lookInLibexec = True\n    execPath = asp_system_utils.which('qi2txt', lookInLibexec)\n    cmd = execPath + ' -S' + endianFlag + inputPath + ' > ' + outputPath\n    print(cmd)\n    os.system(cmd)  \n    if os.path.exists(outputPath):\n        print ('Wrote file: ' + outputPath)\n    else:\n        print ('Failed to write file ' + outputPath + '!!!')\n\ndef extract_hdf5_points(inputPath):\n    '''Extract data from an Icebridge hdf5 file.\n       Use this ASP format code to read: --csv-format 1:lat,2:lon,3:height_above_datum '''\n\n    outputPath = inputPath.replace('.h5', '.csv')\n\n    tempLat = inputPath + '_lat.txt'\n    tempLon = inputPath + '_lon.txt'\n    tempAlt = inputPath + '_alt.txt'\n\n    lookInLibexec = True\n    execPath = asp_system_utils.which('h5dump', lookInLibexec)\n    \n    # Extract the three values of interest one at a time\n    cmd = execPath + ' -o '+tempLat+' -m \"%.7f\" --noindex  -w 20 --dataset=latitude  ' + \\\n          inputPath + ' >/dev/null'\n    print(cmd)\n    os.system(cmd)\n    cmd = execPath + ' -o '+tempLon+' -m \"%.7f\" --noindex  -w 20 --dataset=longitude ' + \\\n          inputPath + ' >/dev/null'\n    print(cmd)\n    os.system(cmd)\n    cmd = execPath + ' -o '+tempAlt+' -m \"%.7f\" --noindex  -w 20 --dataset=elevation ' + \\\n          inputPath + ' >/dev/null'\n    print(cmd)\n    os.system(cmd)\n    \n    # Merge the three one column files into a single three column file\n    execPath = asp_system_utils.which('paste', lookInLibexec)\n    cmd = execPath + ' ' + tempLat + ' ' + tempLon + ' ' + tempAlt + ' > ' + outputPath\n    print(cmd)\n    os.system(cmd)\n    \n    if os.path.exists(tempLat): os.remove(tempLat)\n    if os.path.exists(tempLon): os.remove(tempLon)\n    if os.path.exists(tempAlt): os.remove(tempAlt)\n    \n    # Remove any trailing commas in lines and strip all lines without commas.\n    cmd = \"sed -i 's/,$//;/,/!d' \" + outputPath\n    print(cmd)\n    os.system(cmd)\n    \n    if os.path.exists(outputPath):\n        print('Wrote: ' + outputPath)\n    else:\n        print('Failed to write: ' + outputPath)\n\ndef main(argsIn):\n\n    # Use parser that ignores unknown options\n    usage  = \"usage: \" + os.path.basename(__file__) + \" <input cloud>\"\n    parser = argparse.ArgumentParser(usage=usage, epilog=\"\")\n\n    (options, args) = parser.parse_known_args(argsIn)\n\n    if len(args) < 1:\n        parser.print_help()\n        parser.error(\"Missing input ATM cloud.\\n\" );\n        \n    # Get the input file and figure out the converter to use\n    inputPath = args[0]\n    \n    ext = os.path.splitext(inputPath)[1]\n\n    if ext == '.h5':\n        extract_hdf5_points(inputPath)\n        return 0\n    if ext == '.qi':\n        extract_qi_points(inputPath)\n        return 0\n        \n    print ('Did not recognize input file type!')\n    return -1\n    \nif __name__ == \"__main__\":\n    sys.exit(main(sys.argv[1:]))\n"
  },
  {
    "path": "src/asp/IceBridge/fetch_icebridge_data.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n'''\nTool for downloading IceBridge data\n'''\n\nimport sys, os, re, subprocess, optparse, logging\nimport icebridge_common\n\nlogging.info('DEBUG')\nlogger = logging.getLogger(__name__)\n\n# The path to the ASP python files\nbasepath    = os.path.abspath(sys.path[0])\npythonpath  = os.path.abspath(basepath + '/../Python')  # for dev ASP\nlibexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP\nsys.path.insert(0, basepath) # prepend to Python path\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\n\nimport asp_system_utils\n\nasp_system_utils.verify_python_version_is_supported()\n\n# Prepend to system PATH\nos.environ[\"PATH\"] = libexecpath + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = basepath    + os.pathsep + os.environ[\"PATH\"]\n\n#------------------------------------------------------------------------------\n\n# Constants\nLIDAR_TYPES = ['atm1', 'atm2', 'lvis']\nMAX_IN_ONE_CALL = 100 # when fetching in batches\n\ndef validateNavOrWipe(filename, logger):\n    '''If a nav file is not valid, wipe it.'''\n    \n    if not os.path.exists(filename):\n        return False\n\n    try:\n        f = open(filename)\n        line = f.readline()\n        m = re.match(\"^.*?DOCTYPE\\s+HTML\", line)\n        if m:\n            logger.info(\"Bad nav data, will wipe: \" + filename)\n            os.system(\"rm -f \" + filename)\n            return False\n    except UnicodeDecodeError as e:\n         # If it cannot be decoded, the file is likely in binary, hence valid\n         return True\n         \n    return True\n\ndef checkFound(filename):\n    '''Check if an HTML file has the 404 Not Found message.'''\n    \n    if not os.path.exists(filename):\n        return False\n\n    with open(filename, 'r') as f:\n        for line in f:\n            m = re.match(\"<title>404 Not Found\", line)\n            if m:\n                return False\n    return True\n\ndef checkIfUrlExists(url, baseCurlCmd):\n    '''Return true if the given IceBrige folder URL is valid. This\n    functionality, if done right, times out, likely to pecularities of\n    the NSIDC server. Hence, do a hack. Fetch the file first, and\n    check for whether it was found or not.'''\n\n    path = url.replace('/','_') # a temporary path\n    curlCmd = baseCurlCmd + ' ' + url + ' > ' + path\n    p = subprocess.Popen(curlCmd, shell=True, universal_newlines=True)\n    os.waitpid(p.pid, 0)\n\n    found = checkFound(path)\n\n    wipeCmd = \"rm -f \" + path\n    os.system(wipeCmd)\n\n    return found\n\ndef makeYearFolder(year, site):\n    '''Generate part of the URL.  Only used for images.'''\n    return str(year) + '_' + site + '_NASA'\n\ndef makeDateFolder(year, month, day, ext, fileType):\n    '''Generate part of the URL.'''\n\n    if fileType == 'jpeg':\n        datePart = ('%02d%02d%04d%s') % (month, day, year, ext)\n        return datePart +'_raw'\n    else: # Used for all other cases\n        datePart = ('%04d.%02d.%02d%s') % (year, month, day, ext)\n        return datePart\n\ndef hasGoodLat(latitude, isSouth):\n    '''Return true if latitude and isSouth parameters match.'''\n    if (isSouth and latitude < 0) or ( (not isSouth) and latitude > 0 ):\n        return True\n    return False\n\ndef fetchAndParseIndexFileAux(isSouth, separateByLat, dayVal,\n                              baseCurlCmd, folderUrl, path, fileType):\n    '''Retrieve the index file for a folder of data and create\n    a parsed version of it that contains frame number / filename pairs.'''\n\n    # Download the html file\n    curlCmd = baseCurlCmd + ' ' + folderUrl + ' > ' + path\n    logger.info(curlCmd)\n    p = subprocess.Popen(curlCmd, shell=True, universal_newlines=True)\n    os.waitpid(p.pid, 0)\n\n    # Find all the file names in the index file and\n    #  dump them to a new index file\n    logger.info('Extracting file name list from index.html file...')\n    with open(path, 'r') as f:\n        indexText = f.read()\n\n    # Must wipe this html file. We fetch it too often in different\n    # contexts.  If not wiped, the code fails to work in some\n    # very rare but real situations.\n    if os.path.exists(path):\n        os.remove(path)\n    \n    # Extract just the file names\n    fileList = [] # ensure initialization\n    if fileType == 'jpeg':\n        fileList = re.findall(\">[0-9_]*.JPG\", indexText, re.IGNORECASE)\n    if fileType == 'ortho':\n        fileList = re.findall(\">DMS\\w*.tif<\", indexText, re.IGNORECASE) \n    if fileType == 'fireball':\n        # Fireball DEMs\n        fileList = re.findall(\">IODMS\\w*DEM.tif\", indexText, re.IGNORECASE)\n    if fileType == 'lvis':\n        fileList = re.findall(\">ILVIS\\w+.TXT\", indexText, re.IGNORECASE)\n    if fileType == 'atm1':\n        fileList = re.findall(\">ILATM1B[0-9_]*.ATM4\\w+.qi\", indexText, re.IGNORECASE)\n        #                      >ILATM1B_20111018_145455.ATM4BT4.qi\n        #   or                 >ILATM1B_20091016_165112.atm4cT3.qi\n    if fileType == 'atm2':\n        # Match ILATM1B_20160713_195419.ATM5BT5.h5 \n        fileList = re.findall(\">ILATM1B[0-9_]*.ATM\\w+.h5\", indexText, re.IGNORECASE)\n\n    # Get rid of '>' and '<'\n    for fileIter in range(len(fileList)):\n        fileList[fileIter] = fileList[fileIter].replace(\">\", \"\")\n        fileList[fileIter] = fileList[fileIter].replace(\"<\", \"\")\n\n    # Some runs, eg, https://n5eil01u.ecs.nsidc.org/ICEBRIDGE/IODMS1B.001/2015.09.24\n    # have files for both GR and AN, with same frame number. Those need to be separated\n    # by latitude. This is a problem only with orthoimages.\n    badXmls = set()\n    outputFolder = os.path.dirname(path)\n    if separateByLat:\n        allFilesToFetch = []\n        allUrlsToFetch  = []\n        for filename in fileList:\n            xmlFile  = icebridge_common.xmlFile(filename)\n            url      = os.path.join(folderUrl, xmlFile)\n            outputPath = os.path.join(outputFolder, xmlFile)\n            allFilesToFetch.append(outputPath)\n            allUrlsToFetch.append(url)\n            \n        dryRun = False\n        icebridge_common.fetchFilesInBatches(baseCurlCmd, MAX_IN_ONE_CALL,\n                                             dryRun, outputFolder,\n                                             allFilesToFetch, allUrlsToFetch,\n                                             logger)\n\n        # Mark the bad ones\n        for xmlFile in allFilesToFetch:\n            latitude = icebridge_common.parseLatitude(xmlFile)\n            isGood = hasGoodLat(latitude, isSouth)\n            if not isGood:\n                badXmls.add(xmlFile)\n                \n    elif (fileType == 'ortho' or fileType == 'fireball'):\n        # Sometimes there is a large gap in the timestamp. That means orthoimages \n        # from previous day are spilling over. If dayVal is 0, we must ignore\n        # the spillover images. If dayVal is 1, we must keep the spillover images\n        # and igore the others.\n        list1 = []\n        list2 = []\n        isBigGap = False\n        prevStamp = -1\n        for filename in fileList:\n            [imageDateString, imageTimeString] = icebridge_common.parseTimeStamps(filename)\n            currStamp = float(imageTimeString)/1000000.0 # hours\n            if prevStamp < 0:\n                list1.append(filename)\n                prevStamp = currStamp\n                continue\n            \n            # Note that once isBigGap becomes true, it stays true\n            # even when the gap gets small again\n            if currStamp - prevStamp >= 6: # six hour gap is a lot\n                isBigGap = True\n            if not isBigGap:\n                list1.append(filename)\n            else:\n                list2.append(filename)\n\n            prevStamp = currStamp # for next iteration\n\n        if isBigGap:\n           if dayVal == 0:\n               fileList = list2[:] # current day\n           else:\n               fileList = list1[:] # spillover from prev day\n\n    # For each entry that matched the regex, record: the frame number and the file name.\n    frameDict = {}\n    urlDict   = {}\n    badFiles = []\n    for filename in fileList:\n\n        if len(badXmls) > 0:\n            xmlFile  = os.path.join(outputFolder, icebridge_common.xmlFile(filename))\n            if xmlFile in badXmls:\n                continue\n            \n        frame = icebridge_common.getFrameNumberFromFilename(filename)\n        if frame in frameDict.keys():\n            \n            # The same frame must not occur twice.\n            if fileType not in LIDAR_TYPES:\n                logger.error(\"Error: Found two file names with same frame number: \" + \\\n                             frameDict[frame] + \" and \" + filename)\n                badFiles.append(filename)\n                badFiles.append(frameDict[frame])\n                            \n        # note that folderUrl can vary among orthoimages, as sometimes\n        # some of them are in a folder for the next day.\n        frameDict[frame] = filename\n        urlDict[frame]   = folderUrl\n        \n    # Wipe them all, to be sorted later\n    for badFile in badFiles:\n        if os.path.exists(badFile):\n            logger.info(\"Deleting: \" + badFile)\n            os.remove(badFile)\n        xmlFile  = icebridge_common.xmlFile(badFile)\n        if os.path.exists(xmlFile):\n            logger.info(\"Deleting: \" + xmlFile)\n            os.remove(xmlFile)\n\n    if len(badFiles) > 0:\n        raise Exception(\"Found files with same frame number\")\n    \n    return (frameDict, urlDict)\n\n# These exist both in AN and GR, all mixed up, and have to separate by lat\ndef isInSeparateByLatTable(yyyymmdd):\n    ''''''\n    return yyyymmdd in ['20150923', '20150924', '20151004', '20151005',\n                        '20151019', '20151020', '20151021', '20151022'];\n    \ndef twoFlightsInOneDay(site, yyyymmdd):\n    '''Return true if there are two flights in one day.'''\n    \n    # For this day, there are GR_20100422a and GR_20100422b\n    if site == 'GR' and yyyymmdd == '20100422':\n        return True\n\n    # For this day, there are GR_20170725a and GR_20170725b\n    if site == 'GR' and yyyymmdd == '20170725':\n        return True\n    \n    return False\n\ndef getFolderUrl(yyyymmdd, year, month, day,\n                 dayInc, # if to add one to the day\n                 site, fileType):\n    '''Get full URL to the location where the files are kept.'''\n\n    # Note that yyyymmdd can equal 20100422a.\n    ext = ''\n    if len(yyyymmdd) == 9:\n        ext = yyyymmdd[8]\n\n    if fileType == 'nav':\n        # This is the simplest, usually one file per flight.\n        base = 'https://n5eil01u.ecs.nsidc.org/ICEBRIDGE_FTP/IPAPP1B_GPSInsCorrected_v01'\n        yearFolder = makeYearFolder(year, site)\n        folderUrl  = os.path.join(base, yearFolder)\n        return folderUrl\n\n    if fileType == 'jpeg':\n\n        # If yyyymmdd is 20100422, put a or b depending on dayVal\n        if twoFlightsInOneDay(site, yyyymmdd):\n            if dayInc == 0:\n                ext = 'a'\n            else:\n                ext = 'b'\n            dayInc = 0\n            \n        #base = 'https://n5eil01u.ecs.nsidc.org/ICEBRIDGE_FTP/IODMS0_DMSraw_v01'\n        base = 'https://daacdata.apps.nsidc.org/pub/DATASETS/ICEBRIDGE/IODMS0_DMSraw_v01'\n        \n        yearFolder = makeYearFolder(year, site)\n        dateFolder = makeDateFolder(year, month, day + dayInc, ext, fileType)\n        folderUrl  = os.path.join(base, yearFolder, dateFolder)\n        return folderUrl\n    \n    # The other types share more formatting\n    if twoFlightsInOneDay(site, yyyymmdd):\n        dayInc = 0 # for this particular day, one should not look at the next day\n        \n    if fileType == 'ortho':\n        base = 'https://n5eil01u.ecs.nsidc.org/ICEBRIDGE/IODMS1B.001'       \n    elif fileType == 'fireball':\n        base = 'https://n5eil01u.ecs.nsidc.org/ICEBRIDGE/IODMS3.001'\n    elif fileType == 'atm1':\n        base = 'https://n5eil01u.ecs.nsidc.org/ICEBRIDGE/ILATM1B.001/'\n    elif fileType == 'atm2':\n        base = 'https://n5eil01u.ecs.nsidc.org/ICEBRIDGE/ILATM1B.002/'\n    elif fileType == 'lvis':\n        base = 'https://n5eil01u.ecs.nsidc.org/ICEBRIDGE/ILVIS2.001/'\n    else:\n        raise(\"Unknown type: \" + fileType)\n    \n    dateFolder = makeDateFolder(year, month, day + dayInc, ext, fileType)\n    folderUrl  = os.path.join(base, dateFolder)\n    \n    return folderUrl\n\n\ndef fetchAndParseIndexFile(options, isSouth, baseCurlCmd, outputFolder):\n    '''Create a list of all files that must be fetched unless done already.'''\n\n    # For AN 20091112, etc, some of the ortho images are stored at the\n    # beginning of the next day's flight. Need to sort this out, and\n    # it is tricky. More comments within the code. \n    fetchNextDay = True\n    \n    separateByLat = (options.type == 'ortho' and isInSeparateByLatTable(options.yyyymmdd))\n    if separateByLat:\n        # Here we won't fetch the next day, we will just separate by latitude within\n        # a given day\n        fetchNextDay = False\n\n    orthoOrFireball = ( (options.type == 'ortho') or (options.type == 'fireball') )\n\n    if fetchNextDay:\n        # Normally we fetch for next day only for ortho or fireball. However,\n        # for one single special flight, we do it for jpeg too, as then\n        # the jpegs are also split. \n       if orthoOrFireball or \\\n          ((options.type == 'jpeg') and twoFlightsInOneDay(options.site, options.yyyymmdd)):\n           fetchNextDay = True\n       else:\n           fetchNextDay = False\n           \n    # If we need to parse the next flight day as well, as expected in some runs,\n    # we will fetch two html files, but create a single index out of them.\n    dayVals = [0]\n    if fetchNextDay:\n        dayVals.append(1)\n\n    indexPath       = icebridge_common.htmlIndexFile(outputFolder)\n    \n    currIndexPath   = indexPath\n    parsedIndexPath = icebridge_common.csvIndexFile(outputFolder)\n\n    if options.refetchIndex:\n        os.system('rm -f ' + indexPath)\n        os.system('rm -f ' + parsedIndexPath)\n\n    if icebridge_common.fileNonEmpty(parsedIndexPath):\n        logger.info('Already have the index file ' + parsedIndexPath + ', keeping it.')\n        return parsedIndexPath\n    \n    frameDict  = {}\n    urlDict    = {}\n\n    # We need the list of jpeg frames. Sometimes when fetching ortho images,\n    # and we have to fetch from the next day, don't fetch unless\n    # in the jpeg index.\n    if len(dayVals) > 1 and options.type != 'jpeg':\n        jpegFolder = icebridge_common.getJpegFolder(os.path.dirname(outputFolder))\n        jpegIndexPath = icebridge_common.csvIndexFile(jpegFolder)\n        (jpegFrameDict, jpegUrlDict) = icebridge_common.readIndexFile(jpegIndexPath)\n\n    orthoStamp = {}\n    if options.type == 'fireball':\n        # This is a bugfix. Ensure that the fireball DEM has not just\n        # the same frame number, but also same timestamp as the ortho.\n        orthoFolder = icebridge_common.getOrthoFolder(os.path.dirname(outputFolder))\n        orthoIndexPath = icebridge_common.csvIndexFile(orthoFolder)\n        (orthoFrameDict, orthoUrlDict) = icebridge_common.readIndexFile(orthoIndexPath)\n        for frame in sorted(orthoFrameDict.keys()):\n            filename = orthoFrameDict[frame]\n            [imageDateString, imageTimeString] = icebridge_common.parseTimeStamps(filename)\n            orthoStamp[frame] = imageTimeString\n            \n    for dayVal in dayVals:\n\n        if len(dayVals) > 1:\n            currIndexPath = indexPath + '.day' + str(dayVal)\n            if options.refetchIndex:\n                os.system('rm -f ' + currIndexPath)\n            \n        # Find folderUrl which contains all of the files\n        if options.type in LIDAR_TYPES:\n            options.allFrames = True # For lidar, always get all the frames!\n            \n            # For lidar, the data can come from one of three sources.\n            # Unfortunately sometimes there is more than one source, and then\n            # we need to pick by latitude.\n            folderUrls = []\n            lidar_types = []\n            for lidar in LIDAR_TYPES:\n                folderUrl = getFolderUrl(options.yyyymmdd, options.year, options.month,\n                                         options.day, dayVal, # note here the dayVal\n                                         options.site, lidar)\n                logger.info('Checking lidar URL: ' + folderUrl)\n                if checkIfUrlExists(folderUrl, baseCurlCmd):\n                    logger.info('Found match with lidar type: ' + lidar)\n                    folderUrls.append(folderUrl)\n                    lidar_types.append(lidar)\n\n            if len(folderUrls) == 0:\n                logger.info('WARNING: Could not find any lidar data for the given date!')\n\n            elif len(folderUrls) == 1:\n                # Unique solution\n                folderUrl = folderUrls[0]\n                options.type = lidar_types[0]\n\n            elif len(folderUrls) >= 2:\n                # Multiple solutions. Pick the good one by latitude.\n                logger.info(\"Multiples URLs to search: \" + \" \".join(folderUrls))\n                count = -1\n                isGood = False\n                for folderUrl in folderUrls:\n                    count += 1\n                    (localFrameDict, localUrlDict) = \\\n                                     fetchAndParseIndexFileAux(isSouth,\n                                                               separateByLat, dayVal,\n                                                               baseCurlCmd, folderUrl,\n                                                               currIndexPath,\n                                                               lidar_types[count])\n                    for frame in sorted(localFrameDict.keys()):\n                        filename = localFrameDict[frame]\n                        xmlFile  = icebridge_common.xmlFile(filename)\n                        url      = os.path.join(folderUrl, xmlFile)\n                                        \n                        # Download the file\n                        curlCmd = baseCurlCmd + ' ' + url + ' > ' + xmlFile\n                        logger.info(curlCmd)\n                        p = subprocess.Popen(curlCmd, shell=True, universal_newlines=True)\n                        os.waitpid(p.pid, 0)\n                        \n                        latitude = icebridge_common.parseLatitude(xmlFile)\n                        if os.path.exists(xmlFile): os.remove(xmlFile)\n\n                        if hasGoodLat(latitude, isSouth):\n                            isGood = True\n                            options.type = lidar_types[count]\n                            logger.info(\"Good latitude \" + str(latitude) + \", will use \" +\n                                        folderUrl + \" of type \" + lidar_types[count])\n                        else:\n                            logger.info(\"Bad latitude \" + str(latitude) + \", will not use \" +\n                                        folderUrl + \" of type \" + lidar_types[count])\n                            \n                        # Stop at first file no matter what\n                        break\n\n                    if isGood:\n                        break\n\n                if not isGood:\n                    if options.type in LIDAR_TYPES and options.ignoreMissingLidar:\n                        logger.info(\"No lidar. None of these URLs are good: \" +\n                                    \" \".join(folderUrls))\n                    else:\n                        raise Exception(\"None of these URLs are good: \" +\n                                        \" \".join(folderUrls))\n                    \n        else: # Other cases are simpler\n            folderUrl = getFolderUrl(options.yyyymmdd, options.year, options.month,\n                                     options.day, dayVal, # note here the dayVal\n                                     options.site, options.type)\n\n        logger.info('Fetching from URL: ' + folderUrl)\n        (localFrameDict, localUrlDict) = \\\n                         fetchAndParseIndexFileAux(isSouth,\n                                                   separateByLat, dayVal,\n                                                   baseCurlCmd, folderUrl,\n                                                   currIndexPath, options.type)\n\n        # Append to the main index\n        for frame in sorted(localFrameDict.keys()):\n\n            if options.type == 'fireball':\n                # This is a bugfix. Ensure that the fireball DEM has not just\n                # the same frame number, but also same timestamp as the ortho.\n                # Otherwise we may accidentally getting one from next day.\n                [imageDateString, imageTimeString] = \\\n                                  icebridge_common.parseTimeStamps(localFrameDict[frame])\n                if frame not in orthoStamp:\n                    #logger.info(\"Missing ortho for fireball: \" + localFrameDict[frame])\n                    continue\n                if abs(int(imageTimeString) - int(orthoStamp[frame])) > 1000:\n                    # Apparently a tolerance is needed. Use 10 seconds, so the number 1000.\n                    #logger.info(\"Will not use fireball DEM whose timestamp differs from ortho.\")\n                    #logger.info(\"Fireball is: \" + localFrameDict[frame])\n                    #logger.info(\"Ortho is:    \" + orthoFrameDict[frame])\n                    continue\n                \n            # Fetch from next day, unless already have a value. And don't fetch\n            # frames not in the jpeg index.\n            if len(dayVals) > 1 and options.type != 'jpeg':\n                if not frame in jpegFrameDict.keys(): continue\n                if frame in frameDict.keys(): continue\n                \n            frameDict[frame] = localFrameDict[frame]\n            urlDict[frame]   = localUrlDict[frame]\n        \n    # Write the combined index file\n    icebridge_common.writeIndexFile(parsedIndexPath, frameDict, urlDict)\n            \n    return parsedIndexPath\n\ndef lidarFilesInRange(lidarDict, lidarFolder, startFrame, stopFrame):\n    '''Fetch only lidar files for the given frame range. Do that as follows.\n       For each ortho frame in [startFrame, stopFrame], find the lidar\n       file with the closest timestamp. Collect them all.\n       Add the two neighboring ones, to help with finding lidar pairs later.'''\n    \n    lidarList = []\n    for frame in sorted(lidarDict.keys()):\n        lidarList.append(lidarDict[frame])\n\n\n\n    # If we requested all frames, also get all the lidar files.\n    if ((startFrame == icebridge_common.getSmallestFrame()) and\n        (stopFrame  == icebridge_common.getLargestFrame() )    ):\n\n        minLidarIndex = 0\n        maxLidarIndex = len(lidarList)-1\n\n    else:\n\n        minLidarIndex = len(lidarList)\n        maxLidarIndex = 0\n\n        # Build up a list of lidar files that match the requested input frames\n        orthoFolder    = icebridge_common.getOrthoFolder(os.path.dirname(lidarFolder))\n        orthoIndexPath = icebridge_common.csvIndexFile(orthoFolder)\n        (orthoFrameDict, orthoUrlDict) = icebridge_common.readIndexFile(orthoIndexPath)\n        for frame in sorted(orthoFrameDict.keys()):\n            if ((frame < startFrame) or (frame > stopFrame) ): continue\n            orthoFrame = orthoFrameDict[frame]\n            try:\n                matchingLidar = icebridge_common.findMatchingLidarFileFromList(orthoFrame, lidarList)\n            except:\n                # Some image files don't have a matching lidar file, just keep going.\n                continue\n\n            for index in range(len(lidarList)):\n                if lidarList[index] == matchingLidar:\n                    if minLidarIndex > index:\n                        minLidarIndex = index\n                    if maxLidarIndex < index:\n                        maxLidarIndex = index\n\n        # We will fetch neighboring lidar files as well\n        if minLidarIndex > 0:\n            minLidarIndex = minLidarIndex -1\n        if maxLidarIndex + 1 < len(lidarList):\n            maxLidarIndex = maxLidarIndex + 1\n\n    lidarsToFetch = set()\n    if lidarList:\n        for index in range(minLidarIndex, maxLidarIndex+1): # Fetch only the requested lidar files.\n            lidarsToFetch.add(lidarList[index])\n\n    return lidarsToFetch\n\ndef fetchNavData(options, outputFolder):\n    '''Fetch all the nav data for a flight.'''\n\n    success = False\n\n    # The storage convention for these is very easy!\n    # - A few dates have two files instead of one.\n    folderUrl = getFolderUrl(options.yyyymmdd, options.year, options.month,\n                             options.day, False,\n                             options.site, options.type)\n    filename  = 'sbet_' + options.yyyymmdd + '.out'\n    filenameA = 'sbet_' + options.yyyymmdd + 'a.out'\n    filenameB = 'sbet_' + options.yyyymmdd + 'b.out'\n    \n    # Check which urls are accurate for this file\n    # This is not robust enough, as it can return good status even when the data is missing.\n    # So comment it out. Rather fetch all files and check them later.\n    #url = folderUrl + filename\n    #if checkIfUrlExists(url):\n    #    fileList = [filename]\n    #else:\n    #    fileList = [filenameA, filenameB]\n    fileList = [filename, filenameA, filenameB]\n    \n    if options.refetchNav:\n        cmd = \"rm -f \" + os.path.join(outputFolder, \"sbet_*\")\n        print(cmd)\n        os.system(cmd)\n     \n    # Download the files    \n    for f in fileList:\n        url        = os.path.join(folderUrl, f)\n        outputPath = os.path.join(outputFolder, f)\n        # TODO: How to handle refetch?\n        if validateNavOrWipe(outputPath, logger):\n            success = True\n            continue\n\n        # This times out, so avoid it\n        #if not checkIfUrlExists(url):\n        #    continue\n        \n        ans = icebridge_common.fetchFile(url, outputPath)\n        if not ans:\n            logger.info(\"Bad url: \" + url)\n            continue\n        \n        if validateNavOrWipe(outputPath, logger):\n            success = True\n            \n    if success:\n        return 0\n    \n    return 1\n\ndef doFetch(options, outputFolder):\n    '''The main fetch function.\n       Returns the number of failures.'''\n    \n    # Verify that required files exist\n    home = os.path.expanduser(\"~\")\n    if not (os.path.exists(home+'/.netrc') and os.path.exists(home+'/.urs_cookies')):\n        logger.error('Missing a required authentication file!  See instructions here:\\n' +\n                     '    https://nsidc.org/support/faq/what-options-are-available-bulk-' +\n                     'downloading-data-https-earthdata-login-enabled')\n        return -1\n    \n    curlPath = asp_system_utils.which(\"curl\")\n    curlOpts    = ' -n -L '\n    cookiePaths = ' -b ~/.urs_cookies -c ~/.urs_cookies '\n    baseCurlCmd = curlPath + curlOpts + cookiePaths\n\n    logger.info('Creating output folder: ' + outputFolder)\n    os.system('mkdir -p ' + outputFolder)  \n\n    isSouth = (options.site == 'AN')\n    \n    if options.type == 'nav': # Nav fetching is much less complicated\n        return fetchNavData(options, outputFolder)\n    \n    parsedIndexPath = fetchAndParseIndexFile(options, isSouth, baseCurlCmd, outputFolder)\n    if not icebridge_common.fileNonEmpty(parsedIndexPath):\n        # Some dirs are weird, both images, fireball dems, and ortho.\n        # Just accept whatever there is, but with a warning.\n        logger.info('Warning: Missing index file: ' + parsedIndexPath)\n\n    # Store file information in a dictionary\n    # - Keep track of the earliest and latest frame\n    logger.info('Reading file list from ' + parsedIndexPath)\n    try:\n        (frameDict, urlDict) = icebridge_common.readIndexFile(parsedIndexPath)\n    except:\n        # We probably ran into old format index file. Must refetch.\n        logger.info('Could not read index file. Try again.')\n        options.refetchIndex = True\n        parsedIndexPath = fetchAndParseIndexFile(options, isSouth, baseCurlCmd, outputFolder)\n        (frameDict, urlDict) = icebridge_common.readIndexFile(parsedIndexPath)\n\n    if options.stopAfterIndexFetch:\n        return 0\n    \n    isLidar = (options.type in LIDAR_TYPES)\n\n    allFrames  = sorted(frameDict.keys())\n    \n    if not isLidar:\n        # The lidar frames use a totally different numbering than the image/ortho/dem frames\n        firstFrame = icebridge_common.getLargestFrame()    # start big\n        lastFrame  = icebridge_common.getSmallestFrame()   # start small\n        for frameNumber in allFrames:\n            if frameNumber < firstFrame:\n                firstFrame = frameNumber\n            if frameNumber > lastFrame:\n                lastFrame = frameNumber\n\n        if options.allFrames:\n            options.startFrame = firstFrame\n            options.stopFrame  = lastFrame\n\n    if isLidar:\n        # Based on image frames, determine which lidar frames to fetch.\n        if options.ignoreMissingLidar and len(frameDict.keys()) == 0:\n            # Nothing we can do if this run has no lidar and we are told to continue\n            logger.info(\"Warning: missing lidar, but continuing.\")\n            lidarsToFetch = set()\n        else:\n            lidarsToFetch = lidarFilesInRange(frameDict, outputFolder,\n                                              options.startFrame, options.stopFrame)\n        \n    # There is always a chance that not all requested frames are available.\n    # That is particularly true for Fireball DEMs. Instead of failing,\n    # just download what is present and give a warning. \n    if options.startFrame not in frameDict and not isLidar:\n        logger.info(\"Warning: Frame \" + str(options.startFrame) +\n                    \" is not found in this flight.\")\n                    \n    if options.stopFrame and (options.stopFrame not in frameDict) and not isLidar:\n        logger.info(\"Warning: Frame \" + str(options.stopFrame) +\n                    \" is not found in this flight.\")\n\n    allFilesToFetch = [] # Files that we will fetch, relative to the current dir. \n    allUrlsToFetch  = [] # Full url of each file.\n    \n    # Loop through all found frames within the provided range\n    currentFileCount = 0\n    lastFrame = \"\"\n    if len(allFrames) > 0:\n        lastFrame = allFrames[len(allFrames)-1]\n\n    hasTfw = (options.type == 'fireball')\n    hasXml = ( isLidar or (options.type == 'ortho') or hasTfw )\n    numFetched = 0\n    skipCount  = 0\n    for frame in allFrames:\n\n        # Skip frame outside of range\n        if isLidar:\n            if frameDict[frame] not in lidarsToFetch:\n                continue\n        else:       \n            if ((frame < options.startFrame) or (frame > options.stopFrame) ):\n                continue\n                \n        # Handle the frame skip option\n        if options.frameSkip > 0: \n            if skipCount < options.frameSkip:\n                skipCount += 1\n                continue\n            skipCount = 0\n\n        filename = frameDict[frame]\n        \n        # Some files have an associated xml file. Fireball DEMs also have a tfw file.\n        currFilesToFetch = [filename]\n        if hasXml: \n            currFilesToFetch.append(icebridge_common.xmlFile(filename))\n        if hasTfw: \n            currFilesToFetch.append(icebridge_common.tfwFile(filename))\n\n        for filename in currFilesToFetch:    \n            url        = os.path.join(urlDict[frame], filename)\n            outputPath = os.path.join(outputFolder, filename)\n            allFilesToFetch.append(outputPath)\n            allUrlsToFetch.append(url)\n\n    # Restrict lidar fetch amount according to the parameter\n    if (isLidar and options.maxNumLidarToFetch > 0 and \n           len(allFilesToFetch) > options.maxNumLidarToFetch):\n\n        # Ensure an even number, to fetch both the lidar file and its xml\n        if options.maxNumLidarToFetch % 2 == 1:\n            options.maxNumLidarToFetch += 1\n        \n        allFilesToFetch = allFilesToFetch[0:options.maxNumLidarToFetch]\n        allUrlsToFetch  = allUrlsToFetch [0:options.maxNumLidarToFetch]\n                \n    icebridge_common.fetchFilesInBatches(baseCurlCmd, MAX_IN_ONE_CALL, options.dryRun,\n                                         outputFolder,\n                                         allFilesToFetch, allUrlsToFetch, logger)\n\n    # Fetch from disk the set of already validated files, if any\n    validFilesList = icebridge_common.validFilesList(os.path.dirname(outputFolder),\n                                                     options.startFrame, options.stopFrame)\n    validFilesSet = set()\n    validFilesSet = icebridge_common.updateValidFilesListFromDisk(validFilesList, validFilesSet)\n    numInitialValidFiles = len(validFilesSet)\n    \n    # Verify that all files were fetched and are in good shape\n    failedFiles = []\n    for outputPath in allFilesToFetch:\n\n        if options.skipValidate:\n            continue\n        \n        if not icebridge_common.fileNonEmpty(outputPath):\n            logger.info('Missing file: ' + outputPath)\n            failedFiles.append(outputPath)\n            continue\n\n        if icebridge_common.hasImageExtension(outputPath):\n            if False:\n                # This check is just so slow. Turn it off for now.\n                # This will impact only the validation of jpegs,\n                # as the other files can be validated via the checksum.\n                # Jpegs will be validated when converting them to 1 band images\n                if outputPath in validFilesSet and os.path.exists(outputPath):\n                    #logger.info('Previously validated: ' + outputPath)   # verbose\n                    continue\n                else:\n                    if not icebridge_common.isValidImage(outputPath):\n                        logger.info('Found an invalid image. Will wipe it: ' + outputPath)\n                        if os.path.exists(outputPath): os.remove(outputPath)\n                        failedFiles.append(outputPath)\n                        continue\n                    else:\n                        logger.info('Valid image: ' + outputPath)\n                        validFilesSet.add(outputPath) # mark it as validated\n\n        # Sanity check: XML files must have the right latitude.\n        if icebridge_common.fileExtension(outputPath) == '.xml':\n            if outputPath in validFilesSet and os.path.exists(outputPath):\n                #logger.info('Previously validated: ' + outputPath) #verbose\n                continue\n            else:\n                if os.path.exists(outputPath):\n                    try:\n                        latitude = icebridge_common.parseLatitude(outputPath)\n                        logger.info('Valid file: ' + outputPath)\n                        validFilesSet.add(outputPath) # mark it as validated\n                    except:\n                        # Corrupted file\n                        logger.info(\"Failed to parse latitude, will wipe: \" + outputPath)\n                        if os.path.exists(outputPath): os.remove(outputPath)\n                        failedFiles.append(outputPath)\n\n                    # On a second thought, don't wipe files with wrong latitude, as\n                    # next time we run fetch we will have to fetch them again.\n                    # Hopefully they will be ignored.\n                    #isGood = hasGoodLat(latitude, isSouth)\n                    #if not isGood:\n                    #    logger.info(\"Wiping XML file \" + outputPath + \" with bad latitude \" + \\\n                    #                str(latitude))\n                    #    os.remove(outputPath)\n                    #    imageFile = icebridge_common.xmlToImage(outputPath)\n                    #    if os.path.exists(imageFile):\n                    #        logger.info(\"Wiping TIF file \" + imageFile + \" with bad latitude \" + \\\n                    #                    str(latitude))\n                    #        os.remove(imageFile)\n                    \n        # Verify the chcksum    \n        if hasXml and len(outputPath) >= 4 and outputPath[-4:] != '.xml' \\\n               and outputPath[-4:] != '.tfw':\n            if outputPath in validFilesSet and os.path.exists(outputPath):\n                #logger.info('Previously validated: ' + outputPath) # verbose\n                continue\n            else:\n                isGood = icebridge_common.hasValidChkSum(outputPath, logger)\n                if not isGood:\n                    xmlFile = icebridge_common.xmlFile(outputPath)\n                    logger.info('Found invalid data. Will wipe: ' + outputPath + ' ' + xmlFile)\n                    if os.path.exists(outputPath): os.remove(outputPath)\n                    if os.path.exists(xmlFile):    os.remove(xmlFile)\n                    failedFiles.append(outputPath)\n                    failedFiles.append(xmlFile)\n                    continue\n                else:\n                    logger.info('Valid file: ' + outputPath)\n                    validFilesSet.add(outputPath)\n\n        if hasTfw and icebridge_common.fileExtension(outputPath) == '.tfw':\n            if outputPath in validFilesSet and os.path.exists(outputPath):\n                #logger.info('Previously validated: ' + outputPath)\n                continue\n            else:\n                isGood = icebridge_common.isValidTfw(outputPath, logger)\n                if not isGood:\n                    xmlFile = icebridge_common.xmlFile(outputPath)\n                    logger.info('Found invalid tfw. Will wipe: ' + outputPath + ' ' + xmlFile)\n                    if os.path.exists(outputPath): os.remove(outputPath)\n                    if os.path.exists(xmlFile):    os.remove(xmlFile)\n                    failedFiles.append(outputPath)\n                    failedFiles.append(xmlFile)\n                    continue\n                else:\n                    logger.info('Valid tfw file: ' + outputPath)\n                    validFilesSet.add(outputPath)\n\n    # Write to disk the list of validated files, but only if new\n    # validations happened.  First re-read that list, in case a\n    # different process modified it in the meantime, such as if two\n    # managers are running at the same time.\n    numFinalValidFiles = len(validFilesSet)\n    if numInitialValidFiles != numFinalValidFiles:\n        validFilesSet = \\\n                      icebridge_common.updateValidFilesListFromDisk(validFilesList, validFilesSet)\n        icebridge_common.writeValidFilesList(validFilesList, validFilesSet)\n\n    numFailed = len(failedFiles)\n    if numFailed > 0:\n        logger.info(\"Number of files that could not be processed: \" + str(numFailed))\n        \n    return numFailed\n\ndef main(argsIn):\n\n    # Command line parsing\n    try:\n        usage  = \"usage: fetch_icebridge_data.py [options] output_folder\"\n        parser = optparse.OptionParser(usage=usage)\n\n        parser.add_option(\"--year\",  dest=\"year\", type='int', default=None,\n                          help=\"Number of processes to use (default program tries to choose best)\")\n        parser.add_option(\"--month\",  dest=\"month\", type='int', default=None,\n                          help=\"Number of processes to use (default program tries to choose best)\")\n        parser.add_option(\"--day\",  dest=\"day\", type='int', default=None,\n                          help=\"Number of processes to use (default program tries to choose best)\")\n        parser.add_option(\"--yyyymmdd\",  dest=\"yyyymmdd\", default=None,\n                          help=\"Specify the year, month, and day in one YYYYMMDD string.\")\n        parser.add_option(\"--site\",  dest=\"site\", default=None,\n                          help=\"Name of the location of the images (AN or GR)\")\n        parser.add_option(\"--start-frame\",  dest=\"startFrame\", type='int', \n                          default=icebridge_common.getSmallestFrame(),\n                          help=\"Frame number or start of frame sequence\")\n        parser.add_option(\"--stop-frame\",  dest=\"stopFrame\", type='int', \n                          default=icebridge_common.getLargestFrame(),\n                          help=\"End of frame sequence to download.\")\n        parser.add_option(\"--all-frames\", action=\"store_true\", dest=\"allFrames\", \n                          default=False,\n                          help=\"Fetch all frames for this flight.\")\n        parser.add_option(\"--skip-validate\", action=\"store_true\", dest=\"skipValidate\",\n                          default=False,\n                          help=\"Skip input data validation.\")\n        parser.add_option(\"--ignore-missing-lidar\", action=\"store_true\", dest=\"ignoreMissingLidar\",\n                          default=False,\n                          help=\"Keep going if the lidar is missing.\")\n        parser.add_option(\"--frame-skip\",  dest=\"frameSkip\", type='int', default=0,\n                          help=\"Skip this many frames between downloads.\")\n        parser.add_option(\"--dry-run\", action=\"store_true\", dest=\"dryRun\",\n                          default=False,\n                          help=\"Just print the image/ortho/fireball download commands.\")\n        parser.add_option(\"--refetch-index\", action=\"store_true\", dest=\"refetchIndex\",\n                          default=False,\n                          help=\"Force refetch of the index file.\")\n        parser.add_option(\"--refetch-nav\", action=\"store_true\", dest=\"refetchNav\",\n                          default=False,\n                          help=\"Force refetch of the nav file.\")\n        parser.add_option(\"--stop-after-index-fetch\", action=\"store_true\",\n                          dest=\"stopAfterIndexFetch\", default=False,\n                          help=\"Stop after fetching the indices.\")\n        parser.add_option('--max-num-lidar-to-fetch', dest='maxNumLidarToFetch', default=-1,\n                          type='int', help='The maximum number of lidar files to fetch. ' + \\\n                          'This is used in debugging.')\n\n        # This call handles all the parallel_mapproject specific options.\n        (options, args) = parser.parse_args(argsIn)\n\n        if len(args) != 1:\n            logger.info('Error: Missing output folder.\\n' + usage)\n            return -1\n        outputFolder = os.path.abspath(args[0])\n\n        # TODO: Restore \"type\" input parameter so that outside users who do not use\n        #       our folder convention can use this tool.\n        options.type = icebridge_common.folderToType(outputFolder)\n        if options.type == 'lidar':\n            options.type = LIDAR_TYPES[0]\n        print ('Detected type: ' + options.type)\n            \n        # Handle unified date option\n        if options.yyyymmdd:\n            options.year  = int(options.yyyymmdd[0:4])\n            options.month = int(options.yyyymmdd[4:6])\n            options.day   = int(options.yyyymmdd[6:8])\n\n        if not options.stopFrame:\n            options.stopFrame = options.startFrame\n        \n        # Error checking\n        if (not options.year) or (not options.month) or (not options.day):\n            logger.error('Error: year, month, and day must be provided.\\n' + usage)\n            return -1\n        \n        # Ortho and Fireball DEM files don't need this information to find them.\n        if (options.type == 'jpeg') and not (options.site == 'AN' or options.site == 'GR'):\n            logger.error('Error, site must be AN or GR for images.\\n' + usage)\n            return -1\n\n        KNOWN_TYPES = ['jpeg', 'ortho', 'fireball', 'nav'] + LIDAR_TYPES\n        if not (options.type.lower() in KNOWN_TYPES):\n            logger.error('Error, type must be image, ortho, fireball, or a lidar type.\\n' + usage)\n            return -1\n\n    except optparse.OptionError as msg:\n        raise Exception(msg)\n\n    # Make several attempts. Stop if there is no progress.\n    numPrevFailed = -1\n    numFailed = -1\n    for attempt in range(10):\n        numFailed = doFetch(options, outputFolder)\n        \n        if numFailed == 0:\n            return 0      # Success\n\n        if numFailed == numPrevFailed:\n            logger.info(\"No progress in attempt %d\" % (attempt+1))\n            return -1\n\n        # Try again\n        logger.info(\"Failed to fetch all in attempt %d, will try again.\\n\" % (attempt+1))\n        numPrevFailed = numFailed\n\n    return -1 # We should not come all the way to here\n\nif __name__ == \"__main__\":\n    sys.exit(main(sys.argv[1:]))\n\n\n"
  },
  {
    "path": "src/asp/IceBridge/fetcher_script.py",
    "content": "#!/usr/bin/env python\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n# Fetch all the data for a run and run conversions.\n# See sample usage below.\n\nimport os, sys, optparse, datetime, time, subprocess, logging, multiprocessing, re, shutil, time\nimport os.path as P\n\n# The path to the ASP python files and tools\nbasepath      = os.path.dirname(os.path.realpath(__file__))  # won't change, unlike syspath\npythonpath    = os.path.abspath(basepath + '/../Python')     # for dev ASP\nlibexecpath   = os.path.abspath(basepath + '/../libexec')    # for packaged ASP\nbinpath       = os.path.abspath(basepath + '/../bin')        # for packaged ASP\nicebridgepath = os.path.abspath(basepath + '/../IceBridge')  # IceBridge tools\ntoolspath     = os.path.abspath(basepath + '/../Tools')      # ASP Tools\n\n# Prepend to Python path\nsys.path.insert(0, basepath)\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\nsys.path.insert(0, icebridgepath)\n\nimport asp_system_utils, asp_alg_utils, asp_geo_utils\nimport icebridge_common, full_processing_script\n\nasp_system_utils.verify_python_version_is_supported()\n\n# Prepend to system PATH\nos.environ[\"PATH\"] = basepath       + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = pythonpath     + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = libexecpath    + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = icebridgepath  + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = toolspath      + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = binpath        + os.pathsep + os.environ[\"PATH\"]\n\n#louUser = 'oalexan1' # all data is stored under this user name\nlouUser = 'smcmich1'\n\ng_start_time = -1\ng_stop_time  = -1\n\ndef start_time():\n    global g_start_time, g_stop_time\n    g_start_time = time.time()\n    \ndef stop_time(job, logger):\n    global g_start_time, g_stop_time\n    g_stop_time = time.time()\n    wall_s = float(g_stop_time - g_start_time)/3600.0\n    logger.info( (\"Elapsed time for %s is %g hours.\" % (job, wall_s) ) )\n\ndef workDirs():\n    '''When fetching data, return the paths where it is stored temporarily on pfe,\n    and for archival, on lou.'''\n    currDir = os.getcwd()\n    m = re.match(\"^.*?/\" + louUser + \"/(.*?)$\", currDir)\n    if not m:\n        raise Exception(\"Could not match %s in %s \" % (louUser, currDir))\n    pfePath = '/nobackupp7/' + louUser + '/' + m.group(1) # path on pfe\n    lfePath = '/u/'            + louUser + '/' + m.group(1) # path on lfe\n    \n    return (pfePath, lfePath)\n    \ndef tarAndWipe(options, logger):\n    '''Connect to lou from where we can see the files, then tar and wipe the current run.'''\n\n    logger.info(\"All files were fetched and checks passed. \" +\n                \"Will tar to lou and optionally wipe the dir.\")\n\n    # Per https://www.nas.nasa.gov/hecc/support/kb/using-\n    # shift-for-local-transfers-and-tar-operations_512.html\n    # one can tar and push to lfe at the same time if\n    # connecting to lfe first, from where one can see the pfe\n    # filesystem. Avoid though using the suggested shift\n    # command. It may be faster, but it detaches and is hard\n    # to manage. Note: To untar and transfer in one step, one\n    # should as well go to lfe first.\n\n    #(pfePath, lfePath) = workDirs()\n    pfePath = '/nobackup/smcmich1/icebridge/data'\n    lfePath = '/u/smcmich1/icebridge/inputs'\n    \n#    print lfePath\n#    logger.info(options.outputFolder)\n#    raise Exception('eouoeu')\n\n    lfeCmd = 'cd ' + pfePath + '; tar cfv ' + lfePath + '/' + \\\n             options.outputFolder + '.tar ' + options.outputFolder\n\n    start_time()\n\n    cmd = 'ssh ' + louUser + '@lfe \"' + lfeCmd + '\"'\n    logger.info(cmd)\n    p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, universal_newlines=True)\n    output, error = p.communicate()\n    if p.returncode != 0:\n        raise Exception('Failed to tar and copy to lfe.')\n    else:\n        logger.info('Success tarring and copying to lfe.')\n\n    if options.outputFolder == \"\" or options.outputFolder[0] == '.':\n        raise Exception('Output folder is not as expected. ' +\n                        'Not deleting anything just in case.')\n\n    # Do this here, before the wiping\n    stop_time(\"tar_and_wipe\", logger)\n\n    if options.wipe:\n        logger.info('Will wipe: ' + options.outputFolder)\n        try:\n            shutil.rmtree(options.outputFolder)\n        except Exception as e:\n            # TODO: Can't wipe it as still logging there\n            print(\"Failed to wipe \" + options.outputFolder)\n\n    return 0\n\ndef startWithLouArchive(options, logger):\n    '''Connect to lou, and untar a given archive on pfe.'''\n\n    (pfePath, lfePath) = workDirs()\n\n    # See tarAndWipe() for the logic of how one can work with pfe and lfe\n    tarFile = options.outputFolder + '.tar'\n    lfeCmd = 'cd ' + lfePath + '; tar xfv ' + lfePath + '/' + tarFile + \\\n             ' -C ' + pfePath\n\n    cmd = 'ssh ' + louUser + '@lfe \"' + lfeCmd + '\"'\n    logger.info(cmd)\n    os.system(cmd)\n    #p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, universal_newlines=True)\n    #output, error = p.communicate()\n    #if p.returncode != 0:\n    #    # Don't fail, just continue\n    #    logger.info('Failed to untar lfe archive: ' + tarFile)\n    #    #raise Exception('Failed to untar lfe archive: ' + options.outputFolder + '.tar')\n    #else:\n    #    logger.info('Success untarring lfe archive.')\n\n    return 0\n\ndef main(argsIn):\n\n    try:\n        # Sample usage:\n        # python fetcher_script.py \\\n        #  --yyyymmdd 20091016 --site AN --start-frame 350 --stop-frame 353 --skip-validate\n        # An output folder will be crated automatically (with a name like\n        # AN_20091016), or its name can be specified via the --output-folder\n        # option.\n        usage = '''usage: fetcher_script.py <options>'''\n                      \n        parser = optparse.OptionParser(usage=usage)\n\n        # Run selection\n        parser.add_option(\"--yyyymmdd\",  dest=\"yyyymmdd\", default=None,\n                          help=\"Specify the year, month, and day in one YYYYMMDD string.\")\n        parser.add_option(\"--site\",  dest=\"site\", default=None,\n                          help=\"Name of the location of the images (AN, GR, or AL)\")\n\n        parser.add_option(\"--camera-calibration-folder\",  dest=\"inputCalFolder\", default=None,\n                          help=\"The folder containing camera calibration.\")\n\n        parser.add_option(\"--reference-dem-folder\",  dest=\"refDemFolder\", default=None,\n                          help=\"The folder containing DEMs that created orthoimages.\")\n        \n        # Python treats numbers starting with 0 as being in octal rather than decimal.\n        # Ridiculous. So read them as strings and convert to int. \n        parser.add_option('--start-frame', dest='startFrameStr', default=None,\n                          help=\"Frame to start with.  Leave this and stop-frame blank to \" + \\\n                          \"process all frames.\")\n        parser.add_option('--stop-frame', dest='stopFrameStr', default=None,\n                          help='Frame to stop on.')\n        parser.add_option('--max-num-lidar-to-fetch', dest='maxNumLidarToFetch', default=100000000,\n                          type='int', help='The maximum number of lidar files to fetch. ' + \\\n                          'This is used in debugging.')\n        parser.add_option(\"--skip-validate\", action=\"store_true\", dest=\"skipValidate\",\n                          default=False,\n                          help=\"Skip input data validation.\")\n        parser.add_option(\"--ignore-missing-lidar\", action=\"store_true\", dest=\"ignoreMissingLidar\",\n                          default=False,\n                          help=\"Keep going if the lidar is missing.\")\n        parser.add_option(\"--no-lidar-convert\", action=\"store_true\", dest=\"noLidarConvert\",\n                          default=False,\n                          help=\"Skip lidar files in the conversion step.\")\n\n        parser.add_option(\"--no-nav\", action=\"store_true\", dest=\"noNav\",\n                          default=False,\n                          help=\"Skip dealing with raw nav data.\")\n        parser.add_option(\"--skip-processing\", action=\"store_true\", dest=\"skipProcessing\",\n                          default=False,\n                          help=\"Skip fetch, validate, and convert. Assume all data is ready.\")\n\n        parser.add_option(\"--refetch-index\", action=\"store_true\", dest=\"refetchIndex\",\n                          default=False,\n                          help=\"Force refetch of the index file.\")\n        parser.add_option(\"--stop-after-index-fetch\", action=\"store_true\",\n                          dest=\"stopAfterIndexFetch\", default=False,\n                          help=\"Stop after fetching the indices.\")\n\n        parser.add_option(\"--tar\", action=\"store_true\", dest=\"tar\", default=False,\n                          help=\"After fetching all data and performing all conversions and \" + \\\n                          \"validations, make a tarball on lou.  Only valid on Pleiades!\")\n        parser.add_option(\"--wipe\", action=\"store_true\", dest=\"wipe\", default=False,\n                          help=\"After making a tarball with --tar, wipe the directory. \")\n        parser.add_option(\"--start-with-lou-archive\", action=\"store_true\",\n                          dest=\"startWithLouArchive\", default=False,\n                          help=\"Untar an existing archive from lou, then continue.\")\n                          \n        (options, args) = parser.parse_args(argsIn)\n\n    except optparse.OptionError as msg:\n        raise Usage(msg)\n\n    if options.yyyymmdd is None or options.site is None:\n        print(\"The flight date and site must be specified.\")\n        return -1\n\n    options.outputFolder = icebridge_common.outputFolder(options.site, options.yyyymmdd)\n    os.system('mkdir -p ' + options.outputFolder)\n    \n    logLevel = logging.INFO\n    logger   = icebridge_common.setUpLogger(options.outputFolder, logLevel,\n                                            'icebridge_fetcher_log')\n\n    # Explicitely go from strings to integers, per earlier note.\n    if options.startFrameStr is not None:\n        startFrame = int(options.startFrameStr)\n    else:\n        startFrame = icebridge_common.getSmallestFrame()\n    if options.stopFrameStr is not None:\n        stopFrame  = int(options.stopFrameStr)\n    else:\n        stopFrame = icebridge_common.getLargestFrame()\n\n    # Unarchive, then continue with fetching\n    if options.startWithLouArchive:\n        start_time()\n        startWithLouArchive(options, logger)\n        stop_time(\"fetch_from_lou\", logger)\n\n    cmd = (('--yyyymmdd %s --site %s --start-frame %d --stop-frame %d ' +\n            '--max-num-lidar-to-fetch %d --stop-after-convert --no-ortho-convert --refetch')\n           % (options.yyyymmdd, options.site, startFrame, stopFrame,\n              options.maxNumLidarToFetch))\n    if options.refetchIndex:\n        cmd += ' --refetch-index' # this was not right in older fetched runs\n    if options.stopAfterIndexFetch:\n        cmd += ' --stop-after-index-fetch' \n    if options.skipValidate:\n        cmd += ' --skip-validate'\n    if options.ignoreMissingLidar:\n        cmd += ' --ignore-missing-lidar'\n    if options.noLidarConvert:\n        cmd += ' --no-lidar-convert'\n    if options.noNav:\n        cmd += ' --no-nav'\n    if options.inputCalFolder is not None:\n        cmd += ' --camera-calibration-folder ' + options.inputCalFolder\n\n    if options.refDemFolder is not None:\n        cmd += ' --reference-dem-folder ' + options.refDemFolder\n\n    if not options.skipProcessing:\n\n        # Refetch all nav stuff, as it was unreliable in the past\n        navFolder = icebridge_common.getNavFolder(options.outputFolder)\n        navCameraFolder = icebridge_common.getNavCameraFolder(options.outputFolder)\n        if os.path.exists(navFolder):\n            logger.info(\"Wiping: \" + navFolder)\n            os.system('rm -rfv ' + navFolder)\n        if os.path.exists(navCameraFolder):\n            logger.info(\"Wiping: \" + navCameraFolder)\n            os.system('rm -rfv ' + navCameraFolder)\n\n        # Wipe processed lidar, as sometimes errors crept in.\n        logger.info(\"Wiping processed lidar:\")\n        lidarFolder = icebridge_common.getLidarFolder(options.outputFolder)\n        if os.path.exists(lidarFolder):\n            os.system('rm -fv ' + lidarFolder + '/*csv')\n        pairedFolder = icebridge_common.getPairedLidarFolder(lidarFolder)\n        if os.path.exists(pairedFolder):\n            os.system('rm -rfv ' + pairedFolder)\n        \n        logger.info(\"full_processing_script.py \" + cmd)\n        start_time()\n        if full_processing_script.main(cmd.split()) < 0:\n            return -1\n        stop_time(\"fetch_validate\", logger)\n\n    # Archive after fetching\n    if options.tar:\n        tarAndWipe(options, logger)\n\n# Run main function if file used from shell\nif __name__ == \"__main__\":\n    sys.exit(main(sys.argv[1:]))\n\n"
  },
  {
    "path": "src/asp/IceBridge/full_processing_script.py",
    "content": "#!/usr/bin/env python\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n# Fetch all the data for a run and then process all the data.\n# See sample usage below.\n\nimport os, sys, argparse, datetime, time, subprocess, logging, multiprocessing, re, shutil, time\nimport os.path as P\nimport glob\n\n# The path to the ASP python files and tools\nbasepath      = os.path.dirname(os.path.realpath(__file__))  # won't change, unlike syspath\npythonpath    = os.path.abspath(basepath + '/../Python')     # for dev ASP\nlibexecpath   = os.path.abspath(basepath + '/../libexec')    # for packaged ASP\nbinpath       = os.path.abspath(basepath + '/../bin')        # for packaged ASP\nicebridgepath = os.path.abspath(basepath + '/../IceBridge')  # IceBridge tools\ntoolspath     = os.path.abspath(basepath + '/../Tools')      # ASP Tools\n\n# Prepend to Python path\nsys.path.insert(0, basepath)\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\nsys.path.insert(0, icebridgepath)\n\nimport icebridge_common, fetch_icebridge_data, process_icebridge_run, extract_icebridge_ATM_points\nimport input_conversions\nimport asp_system_utils, asp_alg_utils, asp_geo_utils\n\nasp_system_utils.verify_python_version_is_supported()\n\n# Prepend to system PATH\nos.environ[\"PATH\"] = basepath       + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = pythonpath     + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = libexecpath    + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = icebridgepath  + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = toolspath      + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = binpath        + os.pathsep + os.environ[\"PATH\"]\n\n\ndef fetchAllRunData(options, startFrame, stopFrame, \n                    jpegFolder, orthoFolder, fireballFolder, lidarFolder, navFolder):\n    '''Download all data needed to process a run'''\n    \n    logger = logging.getLogger(__name__)\n    logger.info('Downloading data for the run...')\n\n    baseCommand = (('--yyyymmdd %s --site %s --start-frame %d --stop-frame %d')\n                   % (options.yyyymmdd, options.site, startFrame, stopFrame))\n\n    if options.maxNumLidarToFetch is not None and options.maxNumLidarToFetch >= 0:\n        baseCommand += ' --max-num-lidar-to-fetch ' + str(options.maxNumLidarToFetch)\n\n    if options.refetchIndex:\n        baseCommand += ' --refetch-index' # this was not right in older fetched runs\n    if options.refetchNav:\n        baseCommand += ' --refetch-nav' # sometimes this was corrupted\n        \n        \n    if options.stopAfterIndexFetch:\n        baseCommand += ' --stop-after-index-fetch' \n    if options.skipValidate:\n        baseCommand += ' --skip-validate'\n    if options.ignoreMissingLidar:\n        baseCommand += ' --ignore-missing-lidar'\n    if options.dryRun:\n        baseCommand += ' --dry-run'\n\n    jpegCommand      = baseCommand + ' ' + jpegFolder\n    orthoCommand     = baseCommand + ' ' + orthoFolder\n    fireballCommand  = baseCommand + ' ' + fireballFolder\n    lidarCommand     = baseCommand + ' ' + lidarFolder\n    navCommand       = baseCommand + ' ' + navFolder\n    \n    # Try to do all the downloads one after another\n    # - On a failure the error message should already be printed.\n    # - The fetching tool will not redownload existing data.\n    if fetch_icebridge_data.main(jpegCommand.split()) < 0:\n        return -1\n    if fetch_icebridge_data.main(orthoCommand.split()) < 0:\n        return -1\n    if fetch_icebridge_data.main(fireballCommand.split()) < 0:\n        logger.info('Fireball DEM data is optional, continuing run.')\n    if not options.noNavFetch:\n        if fetch_icebridge_data.main(navCommand.split()) < 0:\n            return -1\n    # Skip the lidar fetch if the user requested no lidar files\n    if (options.maxNumLidarToFetch is None) or (options.maxNumLidarToFetch > 0):\n        if fetch_icebridge_data.main(lidarCommand.split()) < 0:\n            return -1\n\n    # jpeg and ortho indices must be consistent\n    if not options.skipValidate:\n        logger.info(\"Check for consistency between raw and ortho images.\")\n        jpegIndex  = icebridge_common.csvIndexFile(jpegFolder)\n        orthoIndex = icebridge_common.csvIndexFile(orthoFolder)\n        \n        (jpegFrameDict, jpegUrlDict)   = icebridge_common.readIndexFile(jpegIndex)\n        (orthoFrameDict, orthoUrlDict) = icebridge_common.readIndexFile(orthoIndex)\n        \n        for jpegFrame in jpegFrameDict.keys():\n            \n            if jpegFrame < startFrame or jpegFrame > stopFrame:\n                continue\n            \n            if jpegFrame not in orthoFrameDict.keys():\n                logger.info(\"Found jpeg frame missing from ortho: \" + str(jpegFrame))\n                #raise Exception (\"Found jpeg frame missing from ortho:\" + str(jpegFrame))\n\n        for orthoFrame in orthoFrameDict.keys():\n\n            if orthoFrame < startFrame or orthoFrame > stopFrame:\n                continue\n            \n            if orthoFrame not in jpegFrameDict.keys():\n                # This can happen, don't die because of it\n                logger.info(\"Found ortho frame missing from jpeg: \" + str(orthoFrame))\n                #raise Exception (\"Found ortho frame missing from jpeg:\" + str(orthoFrame))\n\n    # TODO: Wipe any ortho and jpeg images not in the index, or at least warn about it.\n    \n    return 0\n\ndef validateOrthosAndFireball(options, fileType, logger):\n    '''Validate ortho and fireball files within the current frame range. This\n    is expected to be in called in parallel for smaller chunks. Lidar files\n    will be validated serially. Jpegs get validated when converted to tif.\n    Return True if all is good.'''\n\n    badFiles = False\n    logger.info(\"Validating files of type: \" + fileType)\n    \n    if fileType   == 'ortho':\n        dataFolder = icebridge_common.getOrthoFolder(options.outputFolder)\n    elif fileType == 'fireball':\n        dataFolder = icebridge_common.getFireballFolder(options.outputFolder)\n    else:\n        raise Exception(\"Unknown file type: \" + fileType)\n\n    indexPath = icebridge_common.csvIndexFile(dataFolder)\n    if not os.path.exists(indexPath):\n        # The issue of what to do when the index does not exist should\n        # have been settled by now.\n        return (not badFiles)\n\n    # Fetch from disk the set of already validated files, if any\n    validFilesList = icebridge_common.validFilesList(options.outputFolder,\n                                                     options.startFrame, options.stopFrame)\n    validFilesSet = set()\n    validFilesSet = icebridge_common.updateValidFilesListFromDisk(validFilesList, validFilesSet)\n    numInitialValidFiles = len(validFilesSet)\n    \n    (frameDict, urlDict) = icebridge_common.readIndexFile(indexPath, prependFolder = True)\n    for frame in frameDict.keys():\n\n        if frame < options.startFrame or frame > options.stopFrame:\n            continue\n\n        outputPath = frameDict[frame]\n        xmlFile = icebridge_common.xmlFile(outputPath)\n\n        if outputPath in validFilesSet and os.path.exists(outputPath) and \\\n            xmlFile in validFilesSet and os.path.exists(xmlFile):\n            #logger.info('Previously validated: ' + outputPath + ' ' + xmlFile)\n            continue\n        else:\n            isGood = icebridge_common.hasValidChkSum(outputPath, logger)\n            if not isGood:\n                logger.info('Found invalid data. Will wipe: ' + outputPath + ' ' + xmlFile)\n                os.system('rm -f ' + outputPath) # will not throw\n                os.system('rm -f ' + xmlFile) # will not throw\n                badFiles = True\n            else:\n                logger.info('Valid file: ' + outputPath)\n                validFilesSet.add(outputPath)\n                validFilesSet.add(xmlFile)\n            \n        if fileType != 'fireball':\n            continue\n\n        # Also validate tfw\n        tfwFile = icebridge_common.tfwFile(outputPath)\n        xmlFile = icebridge_common.xmlFile(tfwFile)\n        if tfwFile in validFilesSet and os.path.exists(tfwFile) and \\\n            xmlFile in validFilesSet and os.path.exists(xmlFile):\n            #logger.info('Previously validated: ' + tfwFile + ' ' + xmlFile)\n            continue\n        else:\n            isGood = icebridge_common.isValidTfw(tfwFile, logger)\n            if not isGood:\n                logger.info('Found invalid tfw. Will wipe: ' + tfwFile + ' ' + xmlFile)\n                os.system('rm -f ' + tfwFile) # will not throw\n                os.system('rm -f ' + xmlFile) # will not throw\n                badFiles = True\n            else:\n                logger.info('Valid tfw file: ' + tfwFile)\n                validFilesSet.add(tfwFile)\n                validFilesSet.add(xmlFile)\n        \n    # Write to disk the list of validated files, but only if new\n    # validations happened.  First re-read that list, in case a\n    # different process modified it in the meantime, such as if two\n    # managers are running at the same time.\n    numFinalValidFiles = len(validFilesSet)\n    if numInitialValidFiles != numFinalValidFiles:\n        validFilesSet = \\\n                      icebridge_common.updateValidFilesListFromDisk(validFilesList, validFilesSet)\n        icebridge_common.writeValidFilesList(validFilesList, validFilesSet)\n\n    return (not badFiles)\n    \ndef runFetchConvert(options, isSouth, cameraFolder, imageFolder, jpegFolder, orthoFolder,\n                    fireballFolder, corrFireballFolder, lidarFolder, processedFolder,\n                    navFolder, navCameraFolder, refDemPath, logger):\n    '''Fetch and/or convert. Return 0 on success.'''\n\n    if options.noFetch:\n        logger.info('Skipping fetch.')\n    else:\n        # Call data fetch routine and check the result\n        fetchResult = fetchAllRunData(options, options.startFrame, options.stopFrame,\n                                      jpegFolder, orthoFolder, fireballFolder, lidarFolder,\n                                      navFolder)\n        if fetchResult < 0:\n            logger.error(\"Fetching failed!\") \n            return -1\n\n        # This step is slow, so run it here as part of fetching and save its result\n        # We certainly don't want it to throw any exception at this stage.\n        try:\n            forceAllFramesInRange = True\n            availableFrames = []\n            (autoStereoInterval, breaks) = \\\n                                 process_icebridge_run.getImageSpacing(orthoFolder, availableFrames,\n                                                                       options.startFrame,\n                                                                       options.stopFrame,\n                                                                       options.maxOverlapRatio,\n                                                                       forceAllFramesInRange)\n        except Exception as e:\n            pass\n        \n    if options.stopAfterFetch or options.dryRun:\n        logger.info('Fetching complete, finished!')\n        return 0\n\n    # Keep track of how we are doing\n    isGood = True\n    \n    if options.noConvert:        \n        logger.info('Skipping convert.')\n    else:\n\n        # When files fail in these conversion functions we log the error and keep going\n\n        if not options.skipFastConvert:\n\n            if not options.skipValidate:\n                # Validate orthos and dems for this frame range.\n                ans = validateOrthosAndFireball(options, 'ortho', logger)\n                isGood = (isGood and ans)\n                ans = validateOrthosAndFireball(options, 'fireball', logger)\n                isGood = (isGood and ans)\n            \n            # Run non-ortho conversions without any multiprocessing (they are pretty fast)\n            # TODO: May be worth doing the faster functions with multiprocessing in the future\n\n            if not options.noLidarConvert:\n                ans = input_conversions.convertLidarDataToCsv(lidarFolder,\n                                                              options.startFrame, options.stopFrame,\n                                                              options.skipValidate,\n                                                              logger)\n                isGood = (isGood and ans)\n                \n                ans = input_conversions.pairLidarFiles(lidarFolder, options.skipValidate, logger)\n                isGood = (isGood and ans)\n                \n            ans = input_conversions.correctFireballDems(fireballFolder, corrFireballFolder,\n                                                        options.startFrame, options.stopFrame,\n                                                        (not isSouth), options.skipValidate,\n                                                        logger)\n            isGood = (isGood and ans)\n\n            ans = input_conversions.convertJpegs(jpegFolder, imageFolder, \n                                                 options.startFrame, options.stopFrame,\n                                                 options.skipValidate, options.cameraMounting,\n                                                 logger)\n            isGood = (isGood and ans)\n            \n        if not options.noNavFetch:\n            # Single process call to parse the nav files.\n            input_conversions.getCameraModelsFromNav(imageFolder, orthoFolder, \n                                                     options.inputCalFolder,\n                                                     options.inputCalCamera,\n                                                     options.cameraLookupFile,\n                                                     navFolder, navCameraFolder,\n                                                     options.yyyymmdd, options.site, \n                                                     options.startFrame, options.stopFrame,\n                                                     options.cameraMounting,\n                                                     logger)\n        else:\n            navCameraFolder = \"\"\n            options.simpleCameras = False\n\n        if not options.noOrthoConvert:\n            # Multi-process call to convert ortho images\n            input_conversions.getCameraModelsFromOrtho(imageFolder, orthoFolder,\n                                                       options.inputCalFolder,\n                                                       options.inputCalCamera,\n                                                       options.cameraLookupFile,\n                                                       options.noNavFetch,\n                                                       navCameraFolder,\n                                                       options.yyyymmdd, options.site, \n                                                       refDemPath, cameraFolder, \n                                                       options.simpleCameras,\n                                                       options.startFrame, options.stopFrame,\n                                                       options.framesFile,\n                                                       options.numOrthoProcesses, options.numThreads,\n                                                       logger)\n\n\n    os.system(\"rm -f core.*\") # these keep on popping up\n    \n    if isGood:\n        return 0\n\n    return -1\n    \ndef processTheRun(options, imageFolder, cameraFolder, lidarFolder, orthoFolder,\n                  fireballFolder, processedFolder, isSouth, refDemPath):\n    \n    '''Do all the run processing'''\n\n    # Some care is taken with the --stereo-arguments argument to make sure it is passed correctly.\n    processCommand = (('%s %s %s %s --bundle-length %d --fireball-folder %s ' +\n                       '--ortho-folder %s --num-processes %d --num-threads %d ' +\n                       '--reference-dem %s --max-overlap-ratio %g')\n                      % (imageFolder, cameraFolder, lidarFolder, processedFolder,\n                         options.bundleLength, fireballFolder, orthoFolder, options.numProcesses,\n                         options.numThreads, refDemPath, options.maxOverlapRatio))\n    if isSouth:\n        processCommand += ' --south'\n    if options.startFrame:\n        processCommand += ' --start-frame ' + str(options.startFrame)\n    if options.stopFrame:\n        processCommand += ' --stop-frame ' + str(options.stopFrame)\n    if options.logBatches:\n        processCommand += ' --log-batches'\n    if options.cleanup:\n        processCommand += ' --cleanup'\n    if options.manyip:\n        processCommand += ' --many-ip'\n        \n    processCommand += ' --stereo-arguments '\n\n    logger = logging.getLogger(__name__)\n    logger.info('Process command: process_icebridge_run ' +\n                processCommand + options.stereoArgs.strip())\n    args = processCommand.split()\n    args += (options.stereoArgs.strip(),) # Make sure this is properly passed\n    process_icebridge_run.main(args)\n\ndef solveIntrinsics_Part1(options, jpegFolder, cameraFolder, navCameraFolder, processedFolder,\n                          logger):\n    '''Some preliminary work before solving for intrinsics. Here we\n    look up the default calibration file, and generate an RPC\n    approximation of its distortion model with polynomials of degree\n    4. We will then create cameras and stereo DEMs using this initial\n    camera file with RPC distortion.'''\n\n    # Sanity checks\n    if options.startFrame == icebridge_common.getSmallestFrame() or \\\n       options.stopFrame == icebridge_common.getLargestFrame():\n        raise Exception(\"When solving for intrinsics, must specify a frame range.\")\n    if options.bundleLength != 2:\n        raise Exception(\"When solving for intrinsics, we assume bundle length of 2.\")\n    if (options.stopFrame - options.startFrame) % 2 == 0:\n        raise Exception(\"When solving for intrinsics, must have an even number of frames, \" +\n                        \" so stopFrame - startFrame must be odd.\")\n    if options.processingSubfolder:\n        raise Exception(\"Processing subfolder not supported when solving for intrinsics.\")\n\n    # Generate extra data we will use later to float intrinsics\n    options.stereoArgs += \"  --num-matches-from-disp-triplets 10000 --unalign-disparity \" #  --enable-fill-holes \"\n\n    # Create separate directories for cameras and processed data,\n    # as these will be distinct than what we will finally be\n    # using to do the full run.\n    suff = \"_camgen\"\n    cameraFolder    += suff\n    navCameraFolder += suff\n    processedFolder += suff\n\n    # Get the input calibration file\n    defaultCalibFile = \"\"\n    for frame in range(options.startFrame, options.stopFrame+1):\n        currCalibFile = input_conversions.getCalibrationFileForFrame(options.cameraLookupFile,\n                                                                     options.inputCalFolder,\n                                                                     frame, options.yyyymmdd,\n                                                                     options.site, logger)\n        if defaultCalibFile == \"\":\n            defaultCalibFile = currCalibFile\n\n        if defaultCalibFile != currCalibFile:\n            # This is important, the calibration file must be unique\n            raise Exception(\"Found two distinct calibration files: \" + defaultCalibFile + \\\n                            \" and \" + currCalibFile)\n\n    logger.info(\"Default calibration file: \" + defaultCalibFile)\n    if options.inputCalCamera != \"\":\n        defaultCalibFile = options.inputCalCamera\n        logger.info(\"Using instead the user-provided: \" + defaultCalibFile)\n\n    # Find the first image in the range\n    jpegIndex  = icebridge_common.csvIndexFile(jpegFolder)\n    (jpegFrameDict, jpegUrlDict)   = icebridge_common.readIndexFile(jpegIndex,\n                                                                    prependFolder = True)\n    if options.startFrame not in jpegFrameDict.keys():\n        raise Exception(\"Could not find jpeg image for frame: \" + options.startFrame)\n    firstImage = jpegFrameDict[options.startFrame]\n\n    # Create the RPC file before optimization\n    rpcCalibFile = os.path.join(processedFolder, os.path.basename(defaultCalibFile))\n    rpcCalibFile = rpcCalibFile.replace(\".tsai\", \"_INIT_RPC.tsai\")\n    logger.info(\"Will approximate camera model \" + defaultCalibFile + \" with \" + \\\n                options.outputModelType + \" model \" + rpcCalibFile)\n    if not os.path.exists(defaultCalibFile):\n        raise Exception('Cannot find file: ' + defaultCalibFile)\n    \n    os.system(\"mkdir -p \" + os.path.dirname(rpcCalibFile))\n    cmd = \"convert_pinhole_model --input-file \" + firstImage + ' --camera-file '   +  \\\n          defaultCalibFile + ' --output-type ' + options.outputModelType           +  \\\n          ' --sample-spacing 50 -o ' + rpcCalibFile\n    logger.info(cmd)\n    os.system(cmd)\n\n    # Use this one from now on\n    options.inputCalCamera = rpcCalibFile\n\n    # Return the modified values\n    return (options, cameraFolder, navCameraFolder, processedFolder)\n    \ndef solveIntrinsics_Part2(options, imageFolder, cameraFolder, lidarFolder, orthoFolder,\n                         processedFolder, isSouth, logger):\n    \n    '''Create a camera model with optimized intrinsics. By now we\n    processed a bunch of images and created bundle-adjusted and\n    pc_aligned cameras and DEMs while using a camera model with\n    distortion implemented using RPC coefficients which was obtained\n    from the photometrics model. We now use the obtained cameras as\n    inputs to a bundle adjust problem where we will optimize the\n    intrinsics, including the distortion RPC coefficients, using the\n    lidar as an external constraint, and many dense IP pairs and\n    triplets (no quadruplets yet, even if 4 images overlap).'''\n\n    # Get a list of all the input files\n    imageCameraPairs = icebridge_common.getImageCameraPairs(imageFolder, cameraFolder, \n                                                            options.startFrame, options.stopFrame,\n                                                            logger)\n    \n    # The paired lidar file for the first image should be huge enough to contain\n    # all images.\n    lidarFile = icebridge_common.findMatchingLidarFile(imageCameraPairs[0][0], lidarFolder)\n    logger.info('Found matching lidar file ' + lidarFile)\n    lidarCsvFormatString = icebridge_common.getLidarCsvFormat(lidarFile)\n\n    numFiles = len(imageCameraPairs)\n    if numFiles < 2:\n        raise Exception('Failed to find any image camera pairs!')\n    if numFiles % 2 != 0:\n        raise Exception(\"When solving for intrinsics, must have an even number of frames to use.\")\n\n\n    # Collect pc_align-ed cameras, unaligned disparities, and dense match files\n    images = []\n    cameras = []\n    for it in range(numFiles/2):\n        begFrame = options.startFrame + 2*it\n        endFrame = begFrame + 1\n        batchFolderName  = icebridge_common.batchFolderName(begFrame, endFrame, options.bundleLength)\n        thisOutputFolder = os.path.join(processedFolder, batchFolderName)\n        \n        # Find all the cameras after bundle adjustment and pc_align.\n        pattern = icebridge_common.getAlignedBundlePrefix(thisOutputFolder) + '*.tsai'\n        alignedCameras = glob.glob(pattern)\n        if len(alignedCameras) != options.bundleLength:\n            raise Exception(\"Expected \" + str(options.bundleLength) + \" cameras, here's what \" +\n                            \" was obtained instead: \" + \" \".join(alignedCameras))\n        img0 = \"\"; cam0 = \"\"; img1 = \"\"; cam1 = \"\"\n        for cam in alignedCameras:\n            frame = icebridge_common.getFrameNumberFromFilename(cam)\n            if begFrame == frame:\n                img0 = imageCameraPairs[2*it][0]\n                cam0 = cam\n            if endFrame == frame:\n                img1 = imageCameraPairs[2*it+1][0]\n                cam1 = cam\n        images.append(img0);  images.append(img1)\n        cameras.append(cam0); cameras.append(cam1)\n\n    # Match files and disp files\n    dispFiles = []\n    matchFiles = []\n    for it in range(numFiles-1):\n        begFrame = options.startFrame + it\n        endFrame = begFrame + 1\n        batchFolderName  = icebridge_common.batchFolderName(begFrame, endFrame, options.bundleLength)\n        thisOutputFolder = os.path.join(processedFolder, batchFolderName)\n        stereoFolder = os.path.join(thisOutputFolder, 'stereo_pair_'+str(0))\n        DISP_PREFIX = \"disp-\"\n        currMatchFiles = glob.glob(os.path.join(stereoFolder, '*' + DISP_PREFIX + '*.match'))\n        if len(currMatchFiles) != 1:\n            raise Exception(\"Expecting a single dense match file in \" + stereoFolder)\n        matchFiles.append(currMatchFiles[0])\n\n        currDispFiles = glob.glob(os.path.join(stereoFolder, '*unaligned-D.tif'))\n        if len(currDispFiles) != 1:\n            raise Exception(\"Expecting a single unaligned disparity file in \" + stereoFolder)\n        dispFiles.append(currDispFiles[0])\n\n    # Create output directory for bundle adjustment and copy there the match files\n    baDir = os.path.join(processedFolder, \"bundle_intrinsics\")\n    baPrefix = os.path.join(baDir, \"out\")\n    os.system(\"mkdir -p \" + baDir)\n    for matchFile in matchFiles:\n        dstFile = os.path.basename(matchFile)\n        dstFile = dstFile.replace(DISP_PREFIX, '')\n        dstFile = os.path.join(baDir, dstFile)\n        cmd = \"cp -f \" + matchFile + \" \" + dstFile\n        logger.info(cmd)\n        os.system(cmd)\n\n    # The bundle adjustment\n    solveIntr = \"\"\n    if not options.skipSolvingIntrinsics:\n        solveIntr = \" --solve-intrinsics \"\n        \n    cmd = \"bundle_adjust \" + \" \".join(images) + \" \" +  \" \".join(cameras) + \\\n            ' --reference-terrain ' + lidarFile + \\\n            ' --disparity-list \"' + \" \".join(dispFiles) + '\"' + \\\n            ' --datum wgs84 -t nadirpinhole --inline-adjustments --robust-threshold 2' + \\\n            ' --camera-weight 0  --csv-format ' + lidarCsvFormatString + \\\n            ' --overlap-limit 1 --max-disp-error 50 --max-iterations 100 ' + \\\n            solveIntr + ' --parameter-tolerance 1e-12 -o ' + baPrefix\n    logger.info(cmd)\n    os.system(cmd)\n\n    # Generate DEMs of residuals before and after optimization\n    projString = icebridge_common.getEpsgCode(isSouth, asString=True)\n    for val in ['initial', 'final']:\n        cmd = 'point2dem --t_srs ' + projString + ' --tr 2'    + \\\n              ' --csv-format 1:lon,2:lat,4:height_above_datum' + \\\n              ' ' + baPrefix + '-' + val + '_residuals_.csv'\n        logger.info(cmd)\n        os.system(cmd)\n        cmd = 'point2dem --t_srs ' + projString + ' --tr 2'    + \\\n              ' --csv-format 1:lon,2:lat,4:height_above_datum' + \\\n              ' ' + baPrefix + '-' + val +'_residuals_reference_terrain.txt'\n        logger.info(cmd)\n        os.system(cmd)\n\n    # Look at the latest written tsai file, that will be the optimized distortion file.\n    # Force the initial rotation and translation to be the identity, this is\n    # expected by ortho2pinhole.\n    outFiles = filter(os.path.isfile, glob.glob(baPrefix + '*.tsai'))\n    outFiles.sort(key=lambda x: os.path.getmtime(x))\n    optFile = outFiles[-1]\n    logger.info(\"Reading optimized file: \" + optFile)\n    with open(optFile, 'r') as f:\n        lines = f.readlines()\n    for it in range(len(lines)):\n        lines[it] = lines[it].strip()\n        if re.match(\"^C\\s*=\\s*\", lines[it]):\n            lines[it] = \"C = 0 0 0\"\n        if re.match(\"^R\\s*=\\s*\", lines[it]):\n            lines[it] = \"R = 1 0 0 0 1 0 0 0 1\"\n\n    # Write the final desired optimized RPC file\n    logger.info(\"Writing final optimized file: \" + options.outputCalCamera)\n    # Below is a bugfix, must take full path to find the dir, otherwise it may fail.\n    os.system(\"mkdir -p \" + os.path.dirname(os.path.abspath(options.outputCalCamera)))\n    with open(options.outputCalCamera, 'w') as f:\n        for line in lines:\n            f.write(line + \"\\n\")\n        \ndef main(argsIn):\n\n    try:\n        # Sample usage:\n        # python full_processing_script.py \\\n        #  --yyyymmdd 20091016 --site AN --num-processes 1 --num-threads 12 --bundle-length 12 \\\n        #  --start-frame 350 --stop-frame 353 --skip-validate \\\n        # --camera-calibration-folder camera_calib  \\\n        # --reference-dem-folder ref_dem_folder\n        # An output folder will be crated automatically (with a name like\n        # AN_20091016), or its name can be specified via the --output-folder\n        # option.\n        usage = '''full_processing_script.py <options>'''\n                      \n        parser = argparse.ArgumentParser(usage=usage)\n\n        # Run selection\n        parser.add_argument(\"--yyyymmdd\",  dest=\"yyyymmdd\", required=True,\n                          help=\"Specify the year, month, and day in one YYYYMMDD string.\")\n        parser.add_argument(\"--site\",  dest=\"site\", required=True,\n                          help=\"Name of the location of the images (AN, GR, or AL)\")\n\n        parser.add_argument(\"--output-folder\",  dest=\"outputFolder\", default=None,\n                          help=\"Name of the output folder. If not specified, \" + \\\n                          \"use something like AN_YYYYMMDD.\")\n\n        parser.add_argument(\"--camera-lookup-file\",  dest=\"cameraLookupFile\", default=None,\n                          help=\"The file to use to find which camera was used for which \"  + \\\n                          \"flight. By default it is in the same directory as this script \" + \\\n                          \"and named camera_lookup.txt.\")\n        \n        # Processing options\n        parser.add_argument('--bundle-length', dest='bundleLength', default=2,\n                          type=int, help=\"The number of images to bundle adjust and process \" + \\\n                          \"in a single batch.\")\n        # TODO: Compute this automatically??\n        parser.add_argument('--overlap-limit', dest='overlapLimit', default=2,\n                          type=int, help=\"The number of images to treat as overlapping for \" + \\\n                          \"bundle adjustment.\")\n        \n        parser.add_argument('--max-overlap-ratio', dest='maxOverlapRatio', default=0.85,\n                          type=float, help='The maximum ratio of overlap between images to be accepted as part of a stereo pair. When floating intrinsics, this will be set to 1, to not upset some bookkeeping.')\n        \n        parser.add_argument('--stereo-arguments', dest='stereoArgs',\n                            # set --min-xcorr-level 0 to do the left-to-right \n                            # and right-to-left consistency check at the lowest level.\n                            default='--stereo-algorithm 2 --min-xcorr-level 0',\n                            help='Extra arguments to pass to stereo.')\n\n        parser.add_argument('--start-frame', dest='startFrame', type=int,\n                          default=icebridge_common.getSmallestFrame(),\n                          help=\"Frame to start with.  Leave this and stop-frame blank to \" + \\\n                          \"process all frames.\")\n        parser.add_argument('--stop-frame', dest='stopFrame', type=int,\n                          default=icebridge_common.getLargestFrame(),\n                          help='Frame to stop on.')\n        parser.add_argument('--frames-file', dest='framesFile', default=\"\",\n                            help='Specific frames to run ortho2pinhole on within this frame range.')\n\n        parser.add_argument('--max-num-lidar-to-fetch', dest='maxNumLidarToFetch', default=None,\n                          type=int, help=\"The maximum number of lidar files to fetch. \" + \\\n                          \"This is used in debugging.\")\n        \n        parser.add_argument(\"--camera-calibration-folder\",  dest=\"inputCalFolder\", default=None,\n                          help=\"The folder containing camera calibration.\")\n\n        parser.add_argument(\"--input-calibration-camera\",  dest=\"inputCalCamera\", default=\"\",\n                            help=\"Instead of looking up the calibrated camera in the calibration folder, use this one.\")\n        \n        parser.add_argument(\"--output-calibration-camera\",  dest=\"outputCalCamera\", default=\"\",\n                            help=\"If specified, float the intrinsics and write the optimized model here.\")\n\n        parser.add_argument(\"--output-model-type\",  dest=\"outputModelType\", default=\"RPC\",\n                            help=\"Generate a distortion model of type RPC, RPC5, or RPC6.\")\n\n        parser.add_argument(\"--skip-solving-intrinsics\", action=\"store_true\",\n                            dest=\"skipSolvingIntrinsics\", default=False,\n                            help=\"When jointly solving for all extrinsics and intrinsics, \" + \\\n                            \"keep the intrinsics fixed.\")\n        \n        parser.add_argument(\"--reference-dem-folder\",  dest=\"refDemFolder\", default=None,\n                          help=\"The folder containing DEMs that created orthoimages.\")\n\n        parser.add_argument(\"--processing-subfolder\",  dest=\"processingSubfolder\", default=None,\n                          help=\"Specify a subfolder name where the processing outputs will go. \" + \\\n                          \"fault is no additional folder\")\n                          \n        parser.add_argument(\"--simple-cameras\", action=\"store_true\", dest=\"simpleCameras\", default=False,\n                          help=\"Don't use orthoimages to refine the camera models.\")\n\n        # This option is only needed when generating camera models from the nav files.\n        parser.add_argument('--camera-mounting', default=0, dest='cameraMounting', type=int,\n              help='0=right-forwards, 1=left-forwards, 2=top-forwards, 3=bottom-forwards.')\n\n        # Performance options  \n        parser.add_argument('--num-processes', dest='numProcesses', default=1,\n                          type=int, help='The number of simultaneous processes to run.')\n        parser.add_argument('--num-ortho-processes', dest='numOrthoProcesses', default=-1,\n                          type=int, help='The number of simultaneous ortho processes to run.')\n        parser.add_argument('--num-threads', dest='numThreads', default=8,\n                          type=int, help='The number of threads per process.')\n\n        # Action control\n        parser.add_argument(\"--skip-fetch\", action=\"store_true\", dest=\"noFetch\", default=False,\n                          help=\"Skip data fetching.\")\n        parser.add_argument(\"--skip-convert\", action=\"store_true\", dest=\"noConvert\", default=False,\n                          help=\"Skip data conversion.\")\n        parser.add_argument(\"--stop-after-fetch\", action=\"store_true\", dest=\"stopAfterFetch\",\n                          default=False,\n                          help=\"Stop program after data fetching.\")\n        parser.add_argument(\"--stop-after-convert\", action=\"store_true\", dest=\"stopAfterConvert\",\n                          default=False,\n                          help=\"Stop program after data conversion.\")\n        parser.add_argument(\"--skip-validate\", action=\"store_true\", dest=\"skipValidate\",\n                            default=False,\n                            help=\"Skip input data validation.\")\n        parser.add_argument(\"--ignore-missing-lidar\", action=\"store_true\", dest=\"ignoreMissingLidar\",\n                            default=False,\n                            help=\"Keep going if the lidar is missing.\")\n        parser.add_argument(\"--log-batches\", action=\"store_true\", dest=\"logBatches\", default=False,\n                          help=\"Log the required batch commands without running them.\")\n        parser.add_argument('--cleanup', action='store_true', default=False, dest='cleanup',  \n                          help='If the final result is produced delete intermediate files.')\n        parser.add_argument('--many-ip', action='store_true', default=False, dest='manyip',  \n                          help='If to use a lot of IP in bundle adjustment from the beginning.')\n        parser.add_argument(\"--dry-run\", action=\"store_true\", dest=\"dryRun\", default=False,\n                          help=\"Set up the input directories but do not fetch/process any imagery.\")\n\n        parser.add_argument(\"--refetch\", action=\"store_true\", dest=\"reFetch\", default=False,\n                          help=\"Try fetching again if some files turned out invalid \" + \\\n                          \"during conversions.\")\n        parser.add_argument(\"--refetch-index\", action=\"store_true\", dest=\"refetchIndex\",\n                          default=False,\n                          help=\"Force refetch of the index file.\")\n        parser.add_argument(\"--refetch-nav\", action=\"store_true\", dest=\"refetchNav\",\n                          default=False,\n                          help=\"Force refetch of the nav file.\")\n        parser.add_argument(\"--stop-after-index-fetch\", action=\"store_true\",\n                          dest=\"stopAfterIndexFetch\", default=False,\n                          help=\"Stop after fetching the indices.\")\n\n        parser.add_argument(\"--no-nav\", action=\"store_true\", dest=\"noNavFetch\",\n                            default=False, help=\"Don't fetch or convert the nav data.\")\n                       \n        parser.add_argument(\"--no-lidar-convert\", action=\"store_true\", dest=\"noLidarConvert\",\n                          default=False,\n                          help=\"Skip lidar files in the conversion step.\")\n        parser.add_argument(\"--no-ortho-convert\", action=\"store_true\", dest=\"noOrthoConvert\",\n                          default=False,\n                          help=\"Skip generating camera models in the conversion step.\")\n        parser.add_argument(\"--skip-fast-conversions\", action=\"store_true\", dest=\"skipFastConvert\",\n                          default=False,\n                          help=\"Skips all non-ortho conversions.\")\n                          \n        options = parser.parse_args(argsIn)\n\n    except argparse.ArgumentError as msg:\n        parser.error(msg)\n\n    icebridge_common.switchWorkDir()\n    \n    if options.numOrthoProcesses < 0:\n        options.numOrthoProcesses = options.numProcesses\n        \n    isSouth = icebridge_common.checkSite(options.site)\n\n    # Turned off elevation limits here since they are being set from LIDAR data.\n    ## Add the site based elevation limits to the stereoArgs option\n    #altLimits = icebridge_common.getElevationLimits(options.site)\n    #options.stereoArgs = (' %s --elevation-limit %f %f ' \n    #                      % (options.stereoArgs, altLimits[0], altLimits[1]))\n    options.stereoArgs = (' %s ' % (options.stereoArgs))\n\n    if options.cameraLookupFile is None:\n        options.cameraLookupFile = P.join(basepath, 'camera_lookup.txt')\n    if not os.path.isfile(options.cameraLookupFile):\n        raise Exception(\"Can't find camera file: \" + options.cameraLookupFile)\n        \n    if len(options.yyyymmdd) != 8 and len(options.yyyymmdd) != 9:\n        # Make an exception for 20100422a\n        raise Exception(\"The --yyyymmdd field must have length 8 or 9.\")\n\n    if options.outputFolder is None:\n        options.outputFolder = icebridge_common.outputFolder(options.site, options.yyyymmdd)\n\n    if options.stopAfterIndexFetch:\n        options.stopAfterFetch = True\n        \n    os.system('mkdir -p ' + options.outputFolder)\n    logLevel = logging.INFO # Record everything\n    logger   = icebridge_common.setUpLogger(options.outputFolder, logLevel,\n                                            'icebridge_processing_log_frames_' + \\\n                                            str(options.startFrame) + \"_\" + str(options.stopFrame))\n\n    # Make sure we later know what we were doing\n    logger.info(\"full_processing_script.py \" + \" \".join(argsIn)) \n                \n    (out, err, status) = asp_system_utils.executeCommand(['uname', '-a'],\n                                                         suppressOutput = True)\n    logger.info(\"Running on machine: \" + out)\n    logger.info(\"Work dir is \" + os.getcwd())\n\n    os.system(\"ulimit -c 0\") # disable core dumps\n    os.system(\"umask 022\")   # enforce files be readable by others\n    \n    # Perform some input checks and initializations\n    # These are not needed unless cameras are initialized \n    if options.inputCalFolder is None or not os.path.exists(options.inputCalFolder):\n        raise Exception(\"Missing camera calibration folder.\")\n    if options.refDemFolder is None or not os.path.exists(options.refDemFolder):\n        raise Exception(\"Missing reference DEM folder.\")\n    \n    refDemName = icebridge_common.getReferenceDemName(options.site)\n    refDemPath = os.path.join(options.refDemFolder, refDemName)\n    if not os.path.exists(refDemPath):\n        raise Exception(\"Missing reference DEM: \" + refDemPath)\n    \n    # TODO: CLEAN UP!!!\n    # Set up the output folders\n    cameraFolder       = icebridge_common.getCameraFolder(options.outputFolder)\n    imageFolder        = icebridge_common.getImageFolder(options.outputFolder)\n    jpegFolder         = icebridge_common.getJpegFolder(options.outputFolder)\n    orthoFolder        = icebridge_common.getOrthoFolder(options.outputFolder)\n    fireballFolder     = icebridge_common.getFireballFolder(options.outputFolder)\n    corrFireballFolder = icebridge_common.getCorrFireballFolder(options.outputFolder)\n    lidarFolder        = icebridge_common.getLidarFolder(options.outputFolder)\n    navFolder          = icebridge_common.getNavFolder(options.outputFolder)\n    navCameraFolder    = icebridge_common.getNavCameraFolder(options.outputFolder)\n    processedFolder    = icebridge_common.getProcessedFolder(options.outputFolder)\n\n    if options.outputCalCamera != \"\":\n        if options.maxOverlapRatio < 1:\n            raise Exception (\"For optimizing intrinsics, must set --max-overlap-ratio to 1, \" + \\\n                             \"to always use consecutive frames.\")\n            \n        # Prepare to solve for intrinsics. Note that this modifies some things along the way.\n        (options, cameraFolder, navCameraFolder, processedFolder) = \\\n                  solveIntrinsics_Part1(options, jpegFolder, cameraFolder, navCameraFolder,\n                                        processedFolder, logger)\n        \n    # Handle subfolder option.  This is useful for comparing results with different parameters!\n    if options.processingSubfolder:\n        processedFolder = os.path.join(processedFolder, options.processingSubfolder)\n        logger.info('Will write to processing subfolder: ' + options.processingSubfolder)\n       \n    # If something failed in the first attempt either in fetch or in\n    # convert, we will wipe bad files, and try to refetch/re-convert.\n    numAttempts = 1\n    if options.reFetch and (not options.noFetch):\n        numAttempts = 2\n    \n    for attempt in range(numAttempts):\n        if numAttempts > 1:\n            logger.info(\"Fetch/convert attempt: \" + str(attempt+1))\n        ans = runFetchConvert(options, isSouth, cameraFolder, imageFolder, jpegFolder, orthoFolder,\n                              fireballFolder, corrFireballFolder, lidarFolder, processedFolder,\n                              navFolder, navCameraFolder, refDemPath, logger)\n        if ans == 0:\n            break\n        \n    if options.stopAfterFetch or options.dryRun or options.stopAfterConvert:\n        logger.info('Fetch/convert finished!')\n        return 0\n\n       \n    # Call the processing routine\n    processTheRun(options, imageFolder, cameraFolder, lidarFolder, orthoFolder,\n                  corrFireballFolder, processedFolder,\n                  isSouth, refDemPath)\n   \n    if options.outputCalCamera != \"\":\n        # Finish solving for intrinscs. \n        solveIntrinsics_Part2(options, imageFolder, cameraFolder, lidarFolder, orthoFolder,\n                              processedFolder, isSouth, logger)\n        \n# Run main function if file used from shell\nif __name__ == \"__main__\":\n    sys.exit(main(sys.argv[1:]))\n\n\n"
  },
  {
    "path": "src/asp/IceBridge/gen_ortho.py",
    "content": "#!/usr/bin/env python\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n# For a given frame, blend the two DEMs containing that frame, and one\n# more to the left and to the right to ensure we have enough coverage,\n# and then mapproject onto this obtained DEM the current image\n# and current bundle-adjusted and aligned camera.\n\n# It creates a file of the form:\n# processed/batch_2489_2490_2/out-ortho.tif\n\n# The resolution is auto-determined per each image.\n\n# Operate in the range [startFrame, stopFrame) so does not include the\n# last one.\n\n# See usage below.\n\nimport os, sys, argparse, datetime, time, subprocess, logging, multiprocessing, re, glob\nimport traceback\nimport os.path as P\n\n# The path to the ASP python files and tools\nbasepath      = os.path.dirname(os.path.realpath(__file__))  # won't change, unlike syspath\npythonpath    = os.path.abspath(basepath + '/../Python')     # for dev ASP\nlibexecpath   = os.path.abspath(basepath + '/../libexec')    # for packaged ASP\nbinpath       = os.path.abspath(basepath + '/../bin')        # for packaged ASP\nicebridgepath = os.path.abspath(basepath + '/../IceBridge')  # IceBridge tools\ntoolspath     = os.path.abspath(basepath + '/../Tools')      # ASP Tools\n\n# Prepend to Python path\nsys.path.insert(0, basepath)\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\nsys.path.insert(0, icebridgepath)\n\nimport icebridge_common\nimport asp_system_utils, asp_alg_utils, asp_geo_utils\n\nasp_system_utils.verify_python_version_is_supported()\n\n# Prepend to system PATH\nos.environ[\"PATH\"] = basepath       + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = pythonpath     + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = libexecpath    + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = icebridgepath  + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = toolspath      + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = binpath        + os.pathsep + os.environ[\"PATH\"]\n\n\ndef createRotatedCameraFile(cameraIn, cameraOut, cameraMounting):\n    '''Create a copy of the input camera model which accounts for a 90 degree\n       rotation of the corresponding image.'''\n\n    # Usually the input camera file is fine\n    if cameraMounting < 2:\n        return cameraIn\n\n    # Read in the camera file\n    cameraLinesIn  = []\n    cameraLinesOut = []\n    with open(cameraIn, 'r') as f:\n        for line in f:\n            cameraLinesIn.append(line.strip())\n    cameraLinesOut.append(cameraLinesIn[0]) # VERSION\n    cameraLinesOut.append(cameraLinesIn[2].replace('v','u')) # fu = fv\n    cameraLinesOut.append(cameraLinesIn[1].replace('u','v')) # fv = fu\n    cameraLinesOut.append(cameraLinesIn[4].replace('v','u')) # cu = cv\n    cameraLinesOut.append(cameraLinesIn[3].replace('u','v')) # cv = cu\n    cameraLinesOut.append(cameraLinesIn[5]) # u_direction\n    cameraLinesOut.append(cameraLinesIn[6]) # v_direction\n    cameraLinesOut.append(cameraLinesIn[7]) # w_direction\n    cameraLinesOut.append(cameraLinesIn[8]) # C\n    cameraLinesOut.append('dummy') # R\n    R = [float(x) for x in cameraLinesIn[9].strip().split()[2:]]\n    cameraLinesOut.append(cameraLinesIn[10]) # pitch\n    cameraLinesOut.append(cameraLinesIn[11]) # distortion type\n    cameraLinesOut.append('dummy') # xp\n    cameraLinesOut.append('dummy') # yp\n    for i in range(14,len(cameraLinesIn)):\n        cameraLinesOut.append(cameraLinesIn[i]) # copy the remaining values (k, p, b) unchanged.\n\n    rNew = R[:]\n\n    xpIn = float(cameraLinesIn[12].strip().split()[2]) # Extract input xp, yp\n    ypIn = float(cameraLinesIn[13].strip().split()[2])\n    \n    if cameraMounting == 2: # Rotate the camera 90 degrees clockwise\n        # x = y, y = -x\n        rNew[0] = R[1] # x = y\n        rNew[3] = R[4]\n        rNew[6] = R[7]\n        rNew[1] = -1.0*R[0] # y = -x\n        rNew[4] = -1.0*R[3]\n        rNew[7] = -1.0*R[6]\n        \n        xpOut = -1.0*ypIn\n        ypOut = xpIn\n    \n    if cameraMounting == 3: # Rotate the camera 90 degrees counter-clockwise.\n        rNew[0] = -1.0*R[1] # x = -y\n        rNew[3] = -1.0*R[4]\n        rNew[6] = -1.0*R[7]\n        rNew[1] = R[0] # y = x\n        rNew[4] = R[3]\n        rNew[7] = R[6]\n\n        xpOut = ypIn\n        ypOut = -1.0*xpIn\n\n    # Repack the rotated values\n    cameraLinesOut[ 9] = 'R = ' + ' '.join([str(x) for x in rNew])\n    cameraLinesOut[12] = 'xp = ' + str(xpOut)\n    cameraLinesOut[13] = 'yp = ' + str(ypOut)\n\n    with open(cameraOut, 'w') as f:\n        for line in cameraLinesOut:\n            f.write(line + '\\n')\n\n    return cameraOut\n\ndef runOrtho(frame, processFolder, imageFile, bundleLength, cameraMounting,\n             threadText, redo, suppressOutput):\n\n    os.system(\"ulimit -c 0\") # disable core dumps\n    os.system(\"rm -f core.*\") # these keep on popping up\n    os.system(\"umask 022\")   # enforce files be readable by others\n\n    # This will run as multiple processes. Hence have to catch all exceptions:\n    projBounds = ()\n    try:\n\n        # Retrieve the aligned camera file\n        alignCamFile, batchFolder = \\\n                      icebridge_common.frameToFile(frame,\n                                                   icebridge_common.alignedBundleStr() + \n                                                   '*' + str(frame) + '.tsai',\n                                                   processFolder, bundleLength)\n\n        if alignCamFile == \"\":\n            print(\"Could not find aligned camera for frame: \" + str(frame))\n            return\n\n        # To ensure we mapproject the image fully, mosaic the several DEMs\n        # around it. Keep the closest 5. Try to grab more first to account\n        # for skipped frames.\n        frameOffsets = [0, 1, -1, 2, -2, -3, 3, -4, 4]\n        dems = []\n        for offset in frameOffsets:\n            # Find the DEM file for the desired frame\n            demFile, batchFolder = icebridge_common.frameToFile(frame + offset,\n                                                                icebridge_common.blendFileName(),\n                                                                processFolder, bundleLength)\n            # If the central DEM is missing, we are out of luck\n            if offset == 0 and demFile == \"\":\n                print(\"Could not find blended DEM for frame: \" + str(frame + offset))\n                return\n\n            if offset == 0:\n                demGeoInfo = asp_geo_utils.getImageGeoInfo(demFile, getStats=False)\n                projBounds = demGeoInfo['projection_bounds'] # minX maxX minY maxY\n                \n            if demFile == \"\":\n                # Missing DEM\n                continue\n\n            if len(dems) >= 5:\n                break # too many already\n            \n            dems.append(demFile)\n            \n        demList = \" \".join(dems)\n\n        # Call this one more time, to get the current batch folder\n        currDemFile, batchFolder = icebridge_common.frameToFile(frame,\n                                                                icebridge_common.blendFileName(),\n                                                                processFolder, bundleLength)\n\n        # The names for the final results\n        finalOrtho        = os.path.join(batchFolder, icebridge_common.orthoFileName())\n        finalOrthoPreview = os.path.join(batchFolder, icebridge_common.orthoPreviewFileName())\n        \n        if (not redo) and os.path.exists(finalOrtho):\n            print(\"File exists: \" + finalOrtho + \".\")\n        else:\n\n            filesToWipe = []\n\n            # If the center dem spans say 1 km, there's no way the\n            # ortho can span more than 5 km, unless something is\n            # seriously out of whack, such as alignment failing for\n            # some neighbours. In the best case, if the center dem is\n            # 1 km by 1 km, the obtained ortho will likely be 1.4 km\n            # by 1 km, as an image extends beyond its stereo dem with\n            # a neighbor.\n            factor = float(2.0)\n            projWinStr = \"\"\n            if len(projBounds) >= 4:\n                # projBounds is in the format minX maxX minY maxY\n                widX = float(projBounds[1]) - float(projBounds[0])\n                widY = float(projBounds[3]) - float(projBounds[2])\n                projBounds = ( \n                    float(projBounds[0]) - factor*widX, # minX\n                    float(projBounds[1]) + factor*widX, # maxX\n                    float(projBounds[2]) - factor*widY, # minY\n                    float(projBounds[3]) + factor*widY  # maxY\n                    ) \n                projWinStr = (\"--t_projwin %f %f %f %f\" % \\\n                              (projBounds[0], projBounds[2], projBounds[1], projBounds[3]))\n                \n            # See if we have a pre-existing DEM to use as footprint\n            mosaicPrefix = os.path.join(batchFolder, 'out-temp-mosaic')\n            mosaicOutput = mosaicPrefix + '-tile-0.tif'\n            cmd = ('dem_mosaic --hole-fill-length 500 %s %s %s -o %s' \n                   % (demList, threadText, projWinStr, mosaicPrefix))\n            filesToWipe.append(mosaicOutput) # no longer needed\n\n            # Generate the DEM mosaic\n            print(cmd)\n            localRedo = True # The file below should not exist unless there was a crash\n            asp_system_utils.executeCommand(cmd, mosaicOutput, suppressOutput, localRedo)\n\n            # Borow some pixels from the footprint DEM,just to grow a bit the real estate\n            finalFootprintDEM = os.path.join(batchFolder,\n                                             icebridge_common.footprintFileName())\n            if os.path.exists(finalFootprintDEM):\n                mosaicPrefix2 = os.path.join(batchFolder, 'out-temp-mosaic2')\n                mosaicOutput2 = mosaicPrefix2 + '-tile-0.tif'\n                cmd = ('dem_mosaic --priority-blending-length 50 %s %s %s %s -o %s' \n                       % (mosaicOutput, finalFootprintDEM, threadText, projWinStr, mosaicPrefix2))\n                \n                print(cmd)\n                localRedo = True # The file below should not exist unless there was a crash\n                asp_system_utils.executeCommand(cmd, mosaicOutput2, suppressOutput, localRedo,\n                                                noThrow = True)\n                if os.path.exists(mosaicOutput2):\n                    cmd = \"mv -f \" + mosaicOutput2 + \" \" + mosaicOutput\n                    print(cmd) \n                    os.system(cmd)\n                \n            # TODO: Look at more aggressive hole-filling. But need a testcase.\n            \n            filesToWipe += glob.glob(mosaicPrefix + '*' + '-log-' + '*')\n\n            # First mapproject to create a tif image with 4 channels.\n            # Then pull 3 channels and compress them as jpeg, while keeping the\n            # image a geotiff.\n\n            tempOrtho = os.path.join(batchFolder, icebridge_common.orthoFileName() + \"_tmp.tif\")\n\n            # There is no need for this file to exist unless it is stray junk\n            if os.path.exists(tempOrtho):\n                os.remove(tempOrtho)\n\n            # If needed, generate a temporary camera file to correct a mounting rotation.\n            # - When the camera mount is rotated 90 degrees stereo is run on a corrected version\n            #   but ortho needs to work on the original uncorrected jpeg image.\n            tempCamFile = alignCamFile + '_temp_rot.tsai'\n            tempCamFile = createRotatedCameraFile(alignCamFile, tempCamFile, cameraMounting)\n            # Run mapproject. The grid size is auto-determined.\n            cmd = ('mapproject --no-geoheader-info %s %s %s %s %s' \n                   % (mosaicOutput, imageFile, tempCamFile, tempOrtho, threadText))\n            print(cmd)\n            asp_system_utils.executeCommand(cmd, tempOrtho, suppressOutput, redo)\n            # Set temporary files to be cleaned up\n            filesToWipe.append(tempOrtho)\n            if tempCamFile != alignCamFile:\n                filesToWipe.append(tempCamFile)\n\n            # This makes the images smaller than Rose's by a factor of about 4,\n            # even though both types are jpeg compressed. Rose's images filtered\n            # through this command also get compressed by a factor of 4.\n            # I conclude that the jpeg compression used by Rose was not as\n            # aggressive as the one used in gdal_translate, but there is no\n            # apparent knob to control that. \n            cmd = \"gdal_translate -b 1 -b 2 -b 3 -co compress=jpeg \" + tempOrtho + \" \" + finalOrtho\n            print(cmd)\n            asp_system_utils.executeCommand(cmd, finalOrtho, suppressOutput, redo)\n            \n            # Clean up extra files\n            for fileName in filesToWipe:\n                if os.path.exists(fileName):\n                    print(\"Removing: \" + fileName)\n                    os.remove(fileName)\n\n        if (not redo) and os.path.exists(finalOrthoPreview):\n            print(\"File exists: \" + finalOrthoPreview + \".\")\n        else:\n            cmd = 'gdal_translate -scale -outsize 25% 25% -of jpeg ' + finalOrtho + \\\n                  ' ' + finalOrthoPreview \n            print(cmd)\n            asp_system_utils.executeCommand(cmd, finalOrthoPreview, suppressOutput, redo)\n            \n    except Exception as e:\n        print('Ortho creation failed!\\n' + str(e) + \". \" + str(traceback.print_exc()))\n\n    os.system(\"rm -f core.*\") # these keep on popping up\n\n    # To ensure we print promptly what we did so far\n    sys.stdout.flush()\n         \ndef main(argsIn):\n\n    try:\n        # Sample usage:\n        # python ~/projects/StereoPipeline/src/asp/IceBridge/gen_ortho.py --site GR   \\\n        #   --yyyymmdd 20120315 --start-frame 2490 --stop-frame 2491 --bundle-length 2 \\\n        #   --num-threads 8 --num-processes 3. \n        usage = '''gen_ortho.py <options>'''\n                      \n        parser = argparse.ArgumentParser(usage=usage)\n\n        # Run selection\n        parser.add_argument(\"--yyyymmdd\",  dest=\"yyyymmdd\", required=True,\n                          help=\"Specify the year, month, and day in one YYYYMMDD string.\")\n        parser.add_argument(\"--site\",  dest=\"site\", required=True,\n                          help=\"Name of the location of the images (AN, GR, or AL)\")\n\n        parser.add_argument(\"--output-folder\",  dest=\"outputFolder\", default=None,\n                          help=\"Name of the output folder. If not specified, \" + \\\n                          \"use something like AN_YYYYMMDD.\")\n\n        # Processing options\n        parser.add_argument('--bundle-length', dest='bundleLength', default=2,\n                          type=int, help=\"The number of images to bundle adjust and process \" + \\\n                          \"in a single batch.\")\n\n        parser.add_argument('--start-frame', dest='startFrame', type=int,\n                          default=icebridge_common.getSmallestFrame(),\n                          help=\"Frame to start with.  Leave this and stop-frame blank to \" + \\\n                          \"process all frames.\")\n        parser.add_argument('--stop-frame', dest='stopFrame', type=int,\n                          default=icebridge_common.getLargestFrame(),\n                          help='Frame to stop on. This frame will also be processed.')\n                          \n        parser.add_argument('--camera-mounting', dest='cameraMounting',  default=0, type=int,\n            help='0=right-forwards, 1=left-forwards, 2=top-forwards, 3=bottom-forwards.')\n\n        parser.add_argument(\"--processing-subfolder\",  dest=\"processingSubfolder\", default=None,\n                          help=\"Specify a subfolder name where the processing outputs will go. \"+\\\n                            \"The default is no additional folder.\")\n\n        # Performance options  \n        parser.add_argument('--num-processes', dest='numProcesses', default=1,\n                          type=int, help='The number of simultaneous processes to run.')\n        parser.add_argument('--num-threads', dest='numThreads', default=8,\n                          type=int, help='The number of threads per process.')\n        options = parser.parse_args(argsIn)\n\n    except argparse.ArgumentError as msg:\n        parser.error(msg)\n        \n    icebridge_common.switchWorkDir()\n    \n    if len(options.yyyymmdd) != 8 and len(options.yyyymmdd) != 9:\n        # Make an exception for 20100422a\n        raise Exception(\"The --yyyymmdd field must have length 8 or 9.\")\n\n    if options.outputFolder is None:\n        options.outputFolder = icebridge_common.outputFolder(options.site, options.yyyymmdd)\n        \n    os.system('mkdir -p ' + options.outputFolder)\n    logLevel = logging.INFO # Make this an option??\n    logger   = icebridge_common.setUpLogger(options.outputFolder, logLevel,\n                                            'icebridge_ortho_log')\n\n    (out, err, status) = asp_system_utils.executeCommand(['uname', '-a'],\n                                                         suppressOutput = True)\n    logger.info(\"Running on machine: \" + out)\n    \n    processFolder = os.path.join(options.outputFolder, 'processed')\n    \n    # Handle subfolder option.  This is useful for comparing results with different parameters!\n    if options.processingSubfolder:\n        processFolder = os.path.join(processFolder, options.processingSubfolder)\n        logger.info('Reading from processing subfolder: ' + options.processingSubfolder)\n\n    jpegFolder    = icebridge_common.getJpegFolder(options.outputFolder)\n    jpegIndexPath = icebridge_common.csvIndexFile(jpegFolder)\n    if not os.path.exists(jpegIndexPath):\n        raise Exception(\"Error: Missing jpeg index file: \" + jpegIndexPath + \".\")\n    (jpegFrameDict, jpegUrlDict) = icebridge_common.readIndexFile(jpegIndexPath,\n                                                                  prependFolder = True)\n    \n    threadText = ''\n    if options.numThreads:\n        threadText = '--threads ' + str(options.numThreads)\n    \n    redo = False\n    suppressOutput = True\n    taskHandles  = []\n    if options.numProcesses > 1:    \n        pool = multiprocessing.Pool(options.numProcesses)\n\n    # Bound the frames\n    sortedFrames = sorted(jpegFrameDict.keys())\n    if len(sortedFrames) > 0:\n        if options.startFrame < sortedFrames[0]:\n            options.startFrame = sortedFrames[0]\n        if options.stopFrame > sortedFrames[-1] + 1:\n            options.stopFrame = sortedFrames[-1] + 1\n    else:\n        # No jpeg files, that means nothing to do\n        options.startFrame = 0\n        options.stopFrame  = 0 \n\n    for frame in range(options.startFrame, options.stopFrame):\n\n        if not frame in jpegFrameDict:\n            logger.info(\"Error: Missing jpeg file for frame: \" + str(frame) + \".\")\n            continue\n\n        # Find the right image\n        currImage = jpegFrameDict[frame]\n\n        args = (frame, processFolder, currImage, options.bundleLength, \n                options.cameraMounting, threadText, redo, suppressOutput)\n\n        # Run things sequentially if only one process, to make it easy to debug\n        if options.numProcesses > 1:\n            taskHandles.append(pool.apply_async(runOrtho, args))\n        else:\n            runOrtho(*args)\n        \n    if options.numProcesses > 1:\n        icebridge_common.waitForTaskCompletionOrKeypress(taskHandles, logger, interactive = False, \n                                                         quitKey='q', sleepTime=20)\n        icebridge_common.stopTaskPool(pool)\n    \n# Run main function if file used from shell\nif __name__ == \"__main__\":\n    sys.exit(main(sys.argv[1:]))\n\n\n"
  },
  {
    "path": "src/asp/IceBridge/generate_fake_camera_models.py",
    "content": "#!/usr/bin/env python\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n# Simple script to generate fake camera files for selected images.\n# - The NSIDC upload script just requires camera file names to get the timestamp.\n\nimport os, sys, argparse, datetime, time\nimport traceback, fetch_icebridge_data, icebridge_common\n\n# The path to the ASP python files and tools\nbasepath      = os.path.dirname(os.path.realpath(__file__))  # won't change, unlike syspath\npythonpath    = os.path.abspath(basepath + '/../Python')     # for dev ASP\nlibexecpath   = os.path.abspath(basepath + '/../libexec')    # for packaged ASP\nbinpath       = os.path.abspath(basepath + '/../bin')        # for packaged ASP\nicebridgepath = os.path.abspath(basepath + '/../IceBridge')  # IceBridge tools\ntoolspath     = os.path.abspath(basepath + '/../Tools')      # ASP Tools\n\n# Prepend to Python path\nsys.path.insert(0, basepath)\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\nsys.path.insert(0, icebridgepath)\n\nimport icebridge_common\nimport asp_system_utils, asp_alg_utils, asp_geo_utils\n\nasp_system_utils.verify_python_version_is_supported()\n\n# Prepend to system PATH\nos.environ[\"PATH\"] = basepath       + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = pythonpath     + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = libexecpath    + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = icebridgepath  + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = toolspath      + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = binpath        + os.pathsep + os.environ[\"PATH\"]\n\n\ndef main(argsIn):\n\n    try:\n        usage = '''generate_fake_camera_models.py <options>'''\n\n        parser = argparse.ArgumentParser(usage=usage)\n\n        parser.add_argument(\"--yyyymmdd\",  dest=\"yyyymmdd\", required=True,\n                          help=\"Specify the year, month, and day in one YYYYMMDD string.\")\n        parser.add_argument(\"--site\",  dest=\"site\", required=True,\n                          help=\"Name of the location of the images (AN, GR, or AL)\")\n\n        parser.add_argument(\"--work-folder\",  dest=\"workFolder\", default=None,\n                          help=\"Temporary download folder.\")\n\n        parser.add_argument(\"--output-folder\",  dest=\"outputFolder\", default=None,\n                          help=\"Name of the output folder. If not specified, \" + \\\n                          \"use something like AN_YYYYMMDD.\")\n\n        parser.add_argument('--start-frame', dest='startFrame', type=int,\n                          default=icebridge_common.getSmallestFrame(),\n                          help=\"Frame to start with.  Leave this and stop-frame blank to \" + \\\n                          \"process all frames.\")\n        parser.add_argument('--stop-frame', dest='stopFrame', type=int,\n                          default=icebridge_common.getLargestFrame(),\n                          help='Frame to stop on. This frame will also be processed.')\n\n        options = parser.parse_args(argsIn)\n\n    except argparse.ArgumentError as msg:\n        parser.error(msg)\n\n    # Fetch the jpeg files for missing camera files\n    fetch_options       = options\n    fetch_options.type  = 'jpeg'\n    fetch_options.year  = int(options.yyyymmdd[0:4])\n    fetch_options.month = int(options.yyyymmdd[4:6])\n    fetch_options.day   = int(options.yyyymmdd[6:8])\n    fetch_options.skipValidate       = True\n    fetch_options.ignoreMissingLidar = True\n    fetch_options.maxNumLidarToFetch = 0\n    fetch_options.refetchIndex = False\n    fetch_options.refetchNav = False\n    fetch_options.stopAfterIndexFetch = False\n    fetch_options.dryRun = False\n    fetch_options.allFrames = False\n    fetch_options.frameSkip = 0\n    fetch_icebridge_data.doFetch(fetch_options, options.workFolder)\n\n    if not os.path.exists(options.outputFolder):\n        os.makedirs(options.outputFolder)\n\n    # For each jpeg file, generate an empty file with the correct file name.\n\n    inputFiles = os.listdir(options.workFolder)\n    for f in inputFiles:\n        if os.path.splitext(f)[1] != '.JPG':\n            continue\n        inputPath = os.path.join(options.workFolder, f)\n        print inputPath\n\n        # Get image info\n        frame = icebridge_common.getFrameNumberFromFilename(inputPath)\n\n        (datestr, timestr) = icebridge_common.getJpegDateTime(inputPath)\n\n        # Pick output name\n        outputName = icebridge_common.formFilePrefix(datestr, timestr, frame) + '.tsai'\n        outputPath = os.path.join(options.outputFolder, outputName)\n\n        cmd = 'touch ' + outputPath\n        print cmd\n        os.system(cmd)\n\n# Run main function if file used from shell\nif __name__ == \"__main__\":\n    sys.exit(main(sys.argv[1:]))\n"
  },
  {
    "path": "src/asp/IceBridge/generate_flight_summary.py",
    "content": "#!/usr/bin/env python\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n# Top level program to process all of the Icebridge data.\n# - This program is not sophisticated enough to handle everything and will need to be\n#   superceded by another script.\n\nimport os, sys, optparse, datetime, time, subprocess, logging, multiprocessing\nimport re, shutil, time, getpass, argparse\n\nimport os.path as P\n\n# The path to the ASP python files and tools\nbasepath      = os.path.dirname(os.path.realpath(__file__)) # won't change, unlike syspath\npythonpath    = os.path.abspath(basepath + '/../Python')     # for dev ASP\nlibexecpath   = os.path.abspath(basepath + '/../libexec')    # for packaged ASP\nicebridgepath = os.path.abspath(basepath + '/../IceBridge')  # IceBridge tools\n\n# Prepend to Python path\nsys.path.insert(0, basepath)\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\nsys.path.insert(0, icebridgepath)\n\nimport icebridge_common, pbs_functions, archive_functions, run_helper, lvis2kml\nimport process_icebridge_batch\nimport asp_system_utils, asp_geo_utils, asp_image_utils\n\nasp_system_utils.verify_python_version_is_supported()\n\n# Prepend to system PATH\nos.environ[\"PATH\"] = basepath       + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = pythonpath     + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = libexecpath    + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = icebridgepath  + os.pathsep + os.environ[\"PATH\"]\n\n# TODO: Move this function!\ndef getLastLog(logPrefix):\n    '''Return the path to the latest log file matching a prefix'''\n    \n    # Get all the files in the folder containing the prefix\n    folder   = os.path.dirname(logPrefix)\n    logFiles = os.listdir(folder)\n    logFiles = [os.path.join(folder, x) for x in logFiles]\n    logFiles = [x for x in logFiles if logPrefix in x]\n\n    # No matches found!\n    if not logFiles:\n        return None\n    \n    # Go through the remaining files and find the one with the latest modify time\n    # - Assumes the modify time is a good replacement for the stamp in the file name.\n    latestFile = logFiles[0]\n    latestTime = os.path.getmtime(latestFile)\n    for log in logFiles:\n        thisTime = os.path.getmtime(log)\n        if thisTime > latestTime:\n            latestTime = thisTime\n            latestFile = log\n\n    return latestFile\n    \n    \n\ndef getFailureCause(batchFolder):\n    '''Try to figure out the reason that a DEM failed'''\n    \n    # Define a list of failure reasons and text descriptions\n    UNKNOWN       = -1\n    SUCCESS       = 0\n    FAIL_FILE_MISSING = 1\n    FAIL_CAMERA_MISSING = 2\n    FAIL_LIDAR_DEM_TOO_LARGE = 3\n    FAIL_LIDAR    = 4\n    FAIL_BUNDLE   = 5\n    FAIL_STEREO_NO_POINTS = 6\n    FAIL_STEREO   = 7\n    FAIL_STEREO_POINT2DEM = 8\n    FAIL_PC_ALIGN = 9\n    FAIL_FRACTION_VALID = 10\n    FAIL_NO_LIDAR_DEM_OVERLAP = 11\n    FAIL_TINY_DEM = 12\n    FAIL_NO_LIDAR_MATCH = 13\n    FAIL_CAMERA_GSD = 14\n\n    \n    errorSummaries = {} # Human readable error codes\n    errorSummaries[UNKNOWN      ] = 'Unknown failure'\n    errorSummaries[SUCCESS      ] = 'Success'\n    errorSummaries[FAIL_FILE_MISSING] = 'Missing argument file'\n    errorSummaries[FAIL_CAMERA_MISSING] = 'Failed to generate camera file'\n    #errorSummaries[FAIL_LIDAR_DEM_TOO_LARGE] = 'LIDAR DEM would be too large'\n    errorSummaries[FAIL_LIDAR   ] = 'Failed to generate lidar DEM'\n    errorSummaries[FAIL_BUNDLE  ] = 'Bundle adjust failed'\n    errorSummaries[FAIL_STEREO_NO_POINTS] = 'Generated empty stereo point cloud'\n    errorSummaries[FAIL_STEREO  ] = 'Stereo failed'\n    errorSummaries[FAIL_STEREO_POINT2DEM] = 'Other stereo point2dem failure'\n    errorSummaries[FAIL_PC_ALIGN] = 'pc_align failed'\n    errorSummaries[FAIL_FRACTION_VALID] = 'Too few valid pixels'\n    errorSummaries[FAIL_NO_LIDAR_DEM_OVERLAP] = 'No lidar-DEM overlap'\n    errorSummaries[FAIL_TINY_DEM] = 'Generated DEM is too small'\n    errorSummaries[FAIL_NO_LIDAR_MATCH] = 'Failed to find matching lidar file for image'\n    errorSummaries[FAIL_CAMERA_GSD] = 'Error computing camera GSD in process_icebridge_batch'\n\n    \n    errorLogText = {} # Text in the log file that indicates an error occurred\n    errorLogText[SUCCESS      ] = 'Finished script process_icebridge_batch!'\n    errorLogText[FAIL_FILE_MISSING] = 'Arg parsing error: Input file'\n    errorLogText[FAIL_CAMERA_MISSING] = 'Not enough input pairs exist to continue, quitting!'\n    #errorLogText[FAIL_LIDAR_DEM_TOO_LARGE] = 'Requested DEM size is too large'\n    errorLogText[FAIL_LIDAR   ] = 'Failed to generate lidar DEM to estimate height range!'\n    errorLogText[FAIL_BUNDLE  ] = 'Bundle adjustment failed!'\n    errorLogText[FAIL_STEREO_NO_POINTS] = 'OrthoRasterize: Input point cloud is empty!'\n    errorLogText[FAIL_STEREO  ] = 'Stereo call failed!'\n    errorLogText[FAIL_STEREO_POINT2DEM] = 'point2dem call on stereo pair failed!'\n    errorLogText[FAIL_PC_ALIGN] = 'Unable to align image at max displacement!'\n    errorLogText[FAIL_FRACTION_VALID] = 'Required DEM pixel fraction is'\n    errorLogText[FAIL_NO_LIDAR_DEM_OVERLAP] = 'No overlap between lidar DEM and stereo DEM'\n    errorLogText[FAIL_TINY_DEM] = 'is less than minumum size'\n    errorLogText[FAIL_NO_LIDAR_MATCH] = 'Failed to find matching lidar file for image'\n    errorLogText[FAIL_CAMERA_GSD] = 'Failed to compute GSD for any camera'\n\n    \n\n    foundError = UNKNOWN\n\n    logPrefix = os.path.join(batchFolder, icebridge_common.logFilePrefix())\n    latestLog = getLastLog(logPrefix)\n    if not latestLog:\n        print(\"Cannot find log matching: \" + logPrefix)\n        return (foundError, errorSummaries[foundError])\n    \n    # Search for errors in chronological order\n    logText = ''\n    with open(latestLog, 'r') as log:\n        logText = log.read()\n    \n    for code in errorLogText.iterkeys():\n        if code in (UNKNOWN, SUCCESS): #Skip these codes\n            continue\n\n        if errorLogText[code] in logText:\n            foundError = code\n            break # Stop at the first error we find\n       \n    return (foundError, errorSummaries[foundError])\n      \n\ndef generateFlightSummary(run, options):\n    '''Generate a folder containing handy debugging files including output thumbnails'''\n    \n    # Copy logs to the output folder\n    print 'Copying log files...'\n    badImageFolder  = os.path.join(options.outputFolder, 'badImages')\n    runFolder       = run.getFolder()\n    procFolder      = run.getProcessFolder()\n    navCameraFolder = run.getNavCameraFolder()\n    os.system('mkdir -p ' + options.outputFolder)\n    os.system('mkdir -p ' + badImageFolder)\n    \n    packedErrorLog = os.path.join(runFolder, 'packedErrors.log')\n    if os.path.exists(packedErrorLog):\n        try:\n            shutil.copy(packedErrorLog, options.outputFolder)\n        except Exception as e:\n            # In case it complains about copying a file onto itself\n            print(\"Warning: \" + str(e))\n            \n    if not options.skipKml:\n        # Copy the input camera kml file\n        camerasInKmlPath = os.path.join(procFolder, 'cameras_in.kml')\n        try:\n            shutil.copy(camerasInKmlPath, options.outputFolder)\n        except Exception as e:\n            # In case it complains about copying a file onto itself\n            print(\"Warning: \" + str(e))\n\n        # Copy the input camera kml file\n        navCamerasKmlPath = os.path.join(navCameraFolder, 'nav_cameras.kml')\n        try:\n            shutil.copy(navCamerasKmlPath, options.outputFolder)\n        except Exception as e:\n            # In case it complains about copying a file onto itself\n            print(\"Warning: \" + str(e))\n        \n        # Create a merged version of all the bundle adjusted camera files\n        # - The tool currently includes cameras more than once if they appear\n        #   in multiple bundles.\n        print 'Merging output camera kml files...'\n        cmd = \"find \"+procFolder+\" -name cameras_out.kml\"\n        p = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE, shell=False,\n                             universal_newlines=True)\n        textOutput, err = p.communicate()\n        camKmlFiles = textOutput.replace('\\n', ' ')\n\n        # Write the list of files to process to disk. Otherwise, if we just\n        # pass the full list on the command line, it may be too big\n        # and the call will fail.\n        kmlList = os.path.join(options.outputFolder, 'kml_list.txt')\n        print(\"Writing: \" + kmlList)\n        with open(kmlList, 'w') as f:\n            for filename in sorted(camKmlFiles.split()):\n                filename = filename.strip()\n                if filename == \"\":\n                    continue\n                f.write(filename + \"\\n\")\n                \n        outputKml = os.path.join(options.outputFolder, 'cameras_out.kml')\n        scriptPath = icebridge_common.fullPath('merge_orbitviz.py')\n        cmd = 'python ' + scriptPath + ' ' + outputKml + ' -list ' + kmlList\n        print(cmd)\n        os.system(cmd)\n        \n        # Generate lidar kml files\n        print(\"Generating lidar kml files\")\n        LIDAR_POINT_SKIP = 1527\n        lidarFiles = run.getLidarList(prependFolder=True)\n        lidarOutputFolder = os.path.join(options.outputFolder, 'lidar')\n        os.system('mkdir -p ' + lidarOutputFolder)\n        for f in lidarFiles:\n            inputPath = os.path.splitext(f)[0] + '.csv'\n            outputPath = os.path.join(lidarOutputFolder, os.path.basename(f)+'.kml')\n            args = [inputPath, outputPath, '--skip', str(LIDAR_POINT_SKIP), '--color', 'red']\n            if not os.path.exists(outputPath): # Don't recreate these files\n                print(\"Generating: \" + outputPath) # This can be very slow, so print what is going on\n                try:\n                    lvis2kml.main(args)\n                except Exception as e:\n                    # Do not let this make our life miserable\n                    print(\"Problem: \" + str(e))\n       \n    # Collect per-batch information\n    batchInfoPath   = os.path.join(options.outputFolder, 'batchInfoSummary.csv')\n    failedBatchPath = os.path.join(options.outputFolder, 'failedBatchList.csv')\n    print(\"Writing statistics to: \" + batchInfoPath)\n    print(\"Writing failures to: \" + failedBatchPath)\n    batchInfoLog = open(batchInfoPath, 'w')\n    failureLog   = open(failedBatchPath, 'w')\n\n    # Write the header for the batch log file\n    batchInfoLog.write('# startFrame, stopFrame, centerLon, centerLat, meanAlt, ' +\n                       'meanLidarDiff, meanInterDiff, meanFireDiff, meanFireLidarDiff, ' +\n                       'percentValid, meanBlendDiff, meanBlendDiffInFireballFootprint, ' + \\\n                       'corrSearchWid, corrMem(GB), corrElapsedTime(minutes)\\n')\n    failureLog.write('# startFrame, stopFrame, errorCode, errorText\\n')\n\n    demList = run.getOutputFileList(icebridge_common.blendFileName())\n    for (dem, frames) in demList:\n\n        demFolder = os.path.dirname(dem)\n\n        # Handle frame range option\n        if (frames[0] < options.startFrame):\n            continue\n        if (frames[1] > options.stopFrame):\n            break\n\n        # Progress indication\n        if frames[0] % 100 == 0:\n            print(\"Frame: \" + str(frames[0]))\n            batchInfoLog.flush() # for instant gratification\n            failureLog.flush()\n\n        # Read in blend results which are not part of the consolidated stats file\n        blendDiffPath = os.path.join(demFolder, 'out-blend-DEM-diff.csv')\n        try:\n            blendDiffResults = icebridge_common.readGeodiffOutput(blendDiffPath)\n        except:\n            blendDiffResults = {'Mean':-999}\n\n        # Read in blend results which are not part of the consolidated stats file\n        # for the blend done in the fireball footprint\n        fireballBlendDiffPath = os.path.join(demFolder, 'out-blend-fb-footprint-diff.csv')\n\n        try:\n            fireballBlendDiffResults = icebridge_common.readGeodiffOutput(fireballBlendDiffPath)\n        except:\n            fireballBlendDiffResults = {'Mean':-999}\n\n        runStatsFile = os.path.join(demFolder, icebridge_common.getRunStatsFile())\n        statsLine = icebridge_common.readStats(runStatsFile)\n        \n        # All of the other results should be in a consolidated stats file\n        consolidatedStatsPath = os.path.join(demFolder, 'out-consolidated_stats.txt')\n\n        if not os.path.exists(consolidatedStatsPath):\n            # Stats file not present, recreate it.\n\n            print 'Recreating missing stats file: ' + consolidatedStatsPath\n\n            # Get paths to the files of interest\n            # This logic must be sync-ed up with cleanBatch().\n            lidarDiffPath     = os.path.join(demFolder, 'out-diff.csv')\n            interDiffPath     = os.path.join(demFolder, 'out_inter_diff_summary.csv')\n            fireDiffPath      = os.path.join(demFolder, 'out_fireball_diff_summary.csv')\n            fireLidarDiffPath = os.path.join(demFolder, 'out_fireLidar_diff_summary.csv')\n            fractionValidPath = os.path.join(demFolder, 'valid_pixel_fraction.txt')\n            process_icebridge_batch.consolidateStats(lidarDiffPath, interDiffPath, fireDiffPath,\n                                                     fireLidarDiffPath, dem,\n                                                     consolidatedStatsPath,\n                                                     fractionValidPath, None, options.skipGeo)\n        # Now the consolidated file should always be present\n\n        with open(consolidatedStatsPath, 'r') as f:\n            statsText = f.read()\n\n        # Write info to summary file\n        try:\n            batchInfoLog.write('%d, %d, %s, %f, %f, %s\\n' % \n                               (frames[0], frames[1], statsText,\n                                blendDiffResults['Mean'], fireballBlendDiffResults['Mean'],\n                                statsLine))\n        except:\n            # Bugfix for corrupted data\n            print(\"Problem parsing frame: \" + str(frames[0]))\n                \n        # Keep a list of batches that did not generate an output DEM\n        parts = statsText.split(',')\n        if len(parts) <= 2:\n            print(\"Cannot parse \" + consolidatedStatsPath + \", skipping.\")\n        else:\n            if (float(parts[0]) == 0) and (float(parts[1]) == 0) and (float(parts[2]) == -999):\n\n                if os.path.exists(dem):\n                    # Handle the case where the statistics are bad for some reason\n                    errorCode = 0\n                    errorText = 'Success but statistics are bad'\n                else: # A real failure, figure out the cause\n                    batchFolder = os.path.dirname(dem)\n                    (errorCode, errorText) = getFailureCause(batchFolder)\n                    #print str((errorCode, errorText))\n                #if errorCode < 0: # Debug code for unknown errors\n                    #print str((errorCode, errorText))\n                    #print statsText\n                    #print batchFolder\n                    #raise Exception('DEBUG')\n                failureLog.write('%d, %d, %d, %s\\n' %  (frames[0], frames[1], errorCode, errorText))\n\n        # Make a link to the DEM thumbnail file in our summary folder\n        hillshadePath = os.path.join(demFolder, 'out-blend-DEM_HILLSHADE_browse.tif')\n        if os.path.exists(hillshadePath):\n            thumbName = ('dem_%05d_%05d_browse.tif' % (frames[0], frames[1]))\n            thumbPath = os.path.join(options.outputFolder, thumbName)\n            icebridge_common.makeSymLink(hillshadePath, thumbPath, verbose=False)\n        else:\n            # If the DEM thumbnail does not exist, look for the input frame thumbnail.\n            inPath    = os.path.join(demFolder, 'first_image_browse.tif')\n            thumbName = ('input_%05d_browse.tif' % (frames[0]))\n            thumbPath = os.path.join(badImageFolder, thumbName)\n            if os.path.exists(inPath):\n                icebridge_common.makeSymLink(inPath, thumbPath, verbose=False)                \n\n        # Make a link to the ortho thumbnail file in our summary folder\n        orthoPath = os.path.join(demFolder,  icebridge_common.orthoPreviewFileName())\n        if os.path.exists(orthoPath):\n            thumbName = ('ortho_%05d_%05d_browse.jpg' % (frames[0], frames[1]))\n            thumbPath = os.path.join(options.outputFolder, thumbName)\n            icebridge_common.makeSymLink(orthoPath, thumbPath, verbose=False)\n\n    # End loop through expected DEMs and writing log files\n    batchInfoLog.close()\n    failureLog.close()\n    \n    print 'Finished generating flight summary in folder: ' + options.outputFolder\n    print(\"Wrote: \" + batchInfoPath)\n    print(\"Wrote: \" + failedBatchPath)\n\n# The parent folder is where the runs AN_... and GR_..., etc., are\n# stored. Usually it is the current directory.\ndef main(argsIn):\n    '''Parse arguments and call the processing function'''\n\n    try:\n        # Sample usage:\n        # python generate_flight_summary.py --yyyymmdd 20091016 --site AN \n        usage = '''generate_flight_summary.py <options>'''\n                      \n        parser = argparse.ArgumentParser(usage=usage)\n\n        parser.add_argument(\"--yyyymmdd\",  dest=\"yyyymmdd\", required=True,\n                          help=\"Specify the year, month, and day in one YYYYMMDD string.\")\n        \n        parser.add_argument(\"--site\",  dest=\"site\", required=True,\n                          help=\"Name of the location of the images (AN, GR, or AL).\")\n\n        parser.add_argument(\"--output-folder\",  dest=\"outputFolder\", default=None,\n                          help=\"Name of the output folder. If not specified, \" + \\\n                          \"use something like AN_YYYYMMDD.\")\n\n        parser.add_argument(\"--parent-folder\",  dest=\"parentFolder\", default=os.getcwd(),\n                            help=\"The folder having all the runs.\")\n\n        parser.add_argument(\"--skip-kml-gen\", action=\"store_true\", dest=\"skipKml\", default=False, \n                            help=\"Skip combining kml files.\")\n\n        parser.add_argument(\"--skip-geo-center\", action=\"store_true\", dest=\"skipGeo\", default=False, \n                            help=\"Skip computing the center of the tile, which is slow.\")\n        \n        parser.add_argument('--start-frame', dest='startFrame', type=int,\n                          default=icebridge_common.getSmallestFrame(),\n                          help=\"Frame to start with.  Leave this and stop-frame blank to \" + \\\n                          \"process all frames.\")\n        parser.add_argument('--stop-frame', dest='stopFrame', type=int,\n                          default=icebridge_common.getLargestFrame(),\n                          help='Frame to stop on.')\n\n        options = parser.parse_args(argsIn)\n        \n    except argparse.ArgumentError as msg:\n        parser.error(msg)\n        \n    if options.outputFolder is None:\n        options.outputFolder = icebridge_common.outputFolder(options.site, options.yyyymmdd)\n\n    run = run_helper.RunHelper(options.site, options.yyyymmdd, options.parentFolder)\n    \n    generateFlightSummary(run, options)\n    \n    return 0\n\n# Run main function if file used from shell\nif __name__ == \"__main__\":\n    sys.exit(main(sys.argv[1:]))\n"
  },
  {
    "path": "src/asp/IceBridge/get_date_list.py",
    "content": "#!/usr/bin/env python\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n# Compile a list of all the dates with data available\n\nimport os, sys, optparse, datetime, subprocess, re\n\n\n# The path to the ASP python files\nbasepath    = os.path.abspath(sys.path[0])\npythonpath  = os.path.abspath(basepath + '/../Python')     # for dev ASP\nlibexecpath = os.path.abspath(basepath + '/../libexec')    # for packaged ASP\nsys.path.insert(0, basepath) # prepend to Python path\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\n\nimport asp_system_utils, asp_alg_utils, asp_geo_utils, icebridge_common\nasp_system_utils.verify_python_version_is_supported()\n\n# Prepend to system PATH\nos.environ[\"PATH\"] = libexecpath + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = basepath    + os.pathsep + os.environ[\"PATH\"]\n\n#------------------------------------------------------------------------------\n\n# Constants\n\ndef fetchAndParseIndexFile(folderUrl, path, parsedPath, fileType):\n    '''Retrieve the index file for a folder of data and create\n    a parsed version of it that contains frame number / filename pairs.'''\n\n    # Set up the command\n    cookiePaths = ' -b ~/.urs_cookies -c ~/.urs_cookies '\n    curlOpts    = ' -n -L '\n    cmd = 'curl ' + cookiePaths + curlOpts + folderUrl + ' > ' + path\n\n    # Download the file\n    print cmd\n    p = subprocess.Popen(cmd, shell=True, universal_newlines=True)\n    os.waitpid(p.pid, 0)\n    \n    # Find all the file names in the index file and\n    #  dump them to a new index file\n    print 'Extracting file name list from index.html file...'\n    with open(path, 'r') as f:\n        indexText = f.read()\n    \n    # Extract just the file names\n    if fileType == 'image':\n        fileList = re.findall(\">[0-9_]*.JPG\", indexText)\n    \n    # For each entry that matched the regex, record: the \"frame\" number, the file name.\n    with open(parsedPath, 'w') as f:\n        for x in fileList:\n            if fileType == 'image':\n                f.write(x[12:17] +', '+ x[1:] + '\\n')\n\ndef main(argsIn):\n\n    # Command line parsing\n    try:\n        usage  = \"usage: get_date_list.py output_path\"\n        parser = optparse.OptionParser(usage=usage)\n\n        # This call handles all the parallel_mapproject specific options.\n        (options, args) = parser.parse_args(argsIn)\n\n        if len(args) != 1:\n            print 'Error: Missing output path.'\n            print usage\n            return -1\n        outputPath = os.path.abspath(args[0])\n\n    except optparse.OptionError as msg:\n        raise Exception(msg)\n\n    # TODO: Move into a common function!\n    # Verify that required files exist\n    home = os.path.expanduser(\"~\")\n    if not (os.path.exists(home+'/.netrc') and os.path.exists(home+'/.urs_cookies')):\n        print 'Missing a required authentication file!  See instructions here:'\n        print '    https://nsidc.org/support/faq/what-options-are-available-bulk-downloading-data-https-earthdata-login-enabled'\n        return -1\n    \n    topIndexPath  = outputPath + '_top.csv'\n    tempIndexPath = outputPath + '_temp.csv'\n\n    # Get the top level index\n    TOP_URL = 'https://n5eil01u.ecs.nsidc.org/ICEBRIDGE_FTP/IODMS0_DMSraw_v01/'\n    print 'Fetching top level index from: ' + TOP_URL\n    icebridge_common.fetchFile(TOP_URL, topIndexPath)\n    \n    with open(topIndexPath, 'r') as f:\n        topText = f.read()\n    \n    # Find all the sub folders in this file\n    matches     = re.findall(\">[0-9_ANGR]*_NASA\", topText)\n    missionList = [x[1:] for x in matches]\n    \n    allDates = []\n    \n    # Loop through the sub folders\n    for mission in missionList:\n        missionUrl = TOP_URL + mission\n        print 'Checking mission at: ' + missionUrl\n        icebridge_common.fetchFile(missionUrl, tempIndexPath)\n\n        site = mission[5:7]\n\n        with open(tempIndexPath, 'r') as f:\n            missionText = f.read()\n        \n        matches  = re.findall(\">[0-9]*_raw\", missionText)\n        dateList = [x[1:] for x in matches]\n        \n        for date in dateList:\n            yyyymmdd = date[4:8] + date[0:4]\n            allDates.append( (yyyymmdd, site) )\n\n    with open(outputPath, 'w') as f:\n        for date in allDates:\n            f.write(date[0] +', '+ date[1] +'\\n')\n\n    print 'Wrote out ' + str(len(allDates)) + ' dates to file.'\n    print 'Finished!'\n\n    # Clean up\n    os.remove(topIndexPath)\n    os.remove(tempIndexPath)\n\nif __name__ == \"__main__\":\n    sys.exit(main(sys.argv[1:]))\n\n\n\n"
  },
  {
    "path": "src/asp/IceBridge/icebridge_common.py",
    "content": "#!/usr/bin/env python\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n# Icebridge utility functions\n\nimport os, sys, datetime, time, subprocess, logging, re, hashlib, string\nimport psutil, errno, getpass, glob\n\n# The path to the ASP python files\nbasepath    = os.path.abspath(sys.path[0])\npythonpath  = os.path.abspath(basepath + '/../IceBridge')  # for dev ASP\npythonpath  = os.path.abspath(basepath + '/../Python')     # for dev ASP\nlibexecpath = os.path.abspath(basepath + '/../libexec')    # for packaged ASP\nsys.path.insert(0, basepath) # prepend to Python path\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\n\nimport asp_system_utils, asp_alg_utils, asp_geo_utils, asp_image_utils, asp_file_utils\nasp_system_utils.verify_python_version_is_supported()\n\ndef switchWorkDir():\n    '''A work directory must be set before running a qsub job, and here\n    we switch to it.'''\n    workDir = \"\" \n    if 'OIB_WORK_DIR' in os.environ:\n        workDir = os.environ['OIB_WORK_DIR']\n        if os.path.isdir(workDir):\n            os.chdir(workDir)\n        else:\n            raise Exception(\"Work directory does not exist: \" + workDir)\n\ndef getUser():\n    '''Return the current user name.'''\n    return getpass.getuser()\n\ndef fullPath(script):\n    '''The full path to a script on the icebridge folder.'''\n    basepath = os.path.dirname(os.path.realpath(__file__))\n    return os.path.join(basepath, script)\n\ndef outputFolder(site, yyyymmdd):\n    '''The output folder name.'''\n    return site + '_' + yyyymmdd\n\ndef makeSymLink(oldFile, newFile, verbose=True):\n    '''Safely create a symlink'''\n\n    oldPath = os.path.abspath(oldFile)\n    try:\n        asp_system_utils.mkdir_p(os.path.dirname(newFile))\n        if verbose:\n            print(\"ln -s \" + oldPath + \" \" + newFile)\n        os.symlink(oldPath, newFile)\n    except OSError as e:\n        if e.errno == errno.EEXIST:\n            os.remove(newFile)\n            os.symlink(oldPath, newFile)\n    \n\ndef getSmallestFrame():\n    '''Return the smallest possible frame number.'''\n    return 0\n\ndef getLargestFrame():\n    '''Return the largest possible frame number.'''\n    return 99999999 # 100 million should be enough\n\ndef fileExtension(filename):\n    '''Convenience function to get the file extension.'''\n    return os.path.splitext(filename)[1]\n\ndef hasImageExtension(filename):\n    '''Return true if the file is a recognized image extension.'''\n    extension = fileExtension(filename).lower()\n    validExtensions = ['.tif', '.jpg', '.jpeg', '.ntf']\n    if extension in validExtensions:\n        return True\n    return False\n\ndef getRunStatsFile():\n    return 'runStats.txt'\n\ndef getCameraFolder(outputFolder):\n    return os.path.join(outputFolder, 'camera')\n\ndef getImageFolder(outputFolder):\n    return os.path.join(outputFolder, 'image')\n\ndef getJpegFolder(outputFolder):\n    return os.path.join(outputFolder, 'jpeg')\n\ndef getOrthoFolder(outputFolder):\n    return os.path.join(outputFolder, 'ortho')\n\ndef getFireballFolder(outputFolder):\n    return os.path.join(outputFolder, 'fireball')\n\ndef getCorrFireballFolder(outputFolder):\n    return os.path.join(outputFolder, 'corr_fireball')\n\ndef getLidarFolder(outputFolder):\n    return os.path.join(outputFolder, 'lidar')\n\ndef getProcessedFolder(outputFolder):\n    return os.path.join(outputFolder, 'processed')\n\ndef getPairedLidarFolder(lidarFolder):\n    return  os.path.join(lidarFolder, 'paired')\n\ndef getNavFolder(outputFolder):\n    return  os.path.join(outputFolder, 'nav')\n\ndef getNavCameraFolder(outputFolder):\n    return  os.path.join(outputFolder, 'nav_camera')\n\ndef getLabelFolder(outputFolder):\n    return os.path.join(outputFolder, 'labeled')\n\ndef getLabelOrthoFolder(outputFolder):\n    return os.path.join(outputFolder, 'label_ortho')\n\ndef getConvertedLidarIndexFile(lidarFolder):\n    return os.path.join(lidarFolder, 'converted_lidar_index.csv')\n\ndef getPairedIndexFile(pairedFolder):\n    return os.path.join(pairedFolder, 'paired_lidar_index.csv')\n\ndef folderToType(folder):\n    '''If input is myRun/ortho, return \"ortho\". Same for \"fireball\", \"lidar\", etc.'''\n    return os.path.basename(folder)\n\ndef htmlIndexFile(folder):\n    '''Return the html index file for this folder (if appropriate)'''\n    return os.path.join(folder, folderToType(folder) + \"_index.html\")\n    \ndef csvIndexFile(folder):\n    '''Return the clean csv version of the html index file for this folder (if appropriate) '''\n    return htmlIndexFile(folder) + \".csv\"\n\ndef getJpegDateTime(filepath):\n    '''Get the date and time from a raw jpeg file.'''\n    \n    # TODO: For some files it is probably in the name.\n    \n    # Use this tool to extract the metadata\n    cmd      = [asp_system_utils.which('gdalinfo'), filepath]\n    p        = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True)\n    out, err = p.communicate()\n    \n    lines = out.split('\\n')\n\n    for line in lines:\n        if 'EXIF_DateTimeOriginal' not in line:\n            continue\n        parts = line.replace('=',' ').split()\n        dateString = parts[1].strip().replace(':','')\n        timeString = parts[2].strip().replace(':','')\n        \n        return (dateString, timeString)\n\n    raise Exception('Failed to read date/time from file: ' + filepath)\n\ndef getPixelSize(filepath):\n    '''Get the pixel size from a GeoTiff'''\n    \n    cmd      = [asp_system_utils.which('gdalinfo'), filepath]\n    p        = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True)\n    out, err = p.communicate()\n    \n    lines = out.split('\\n')\n    for line in lines:\n        m = re.match(\"^.*?Pixel\\s+Size\\s*=\\s*\\((.*?)\\s*,\", line)\n        if m:\n            return float(m.group(1))\n\n    # If nothing works\n    return -1.0\n\ndef jpegToImageFile(jpegFile, orthoFile):\n    '''Given AN_20121107/jpeg/2012_11_08_17415.JPG and DMS_1381721_17415_20121108_00303910.tif\n    create AN_20121107/image/DMS_20121108_003039_17415.tif.\n    This can throw an exception.'''\n    \n    jpegFolder  = os.path.dirname(jpegFile)\n    imageFolder = getImageFolder(os.path.dirname(jpegFolder))\n\n    if not os.path.exists(jpegFolder):\n        raise Exception(\"Missing \" + jpegFolder)\n    if not os.path.exists(imageFolder):\n        raise Exception(\"Missing \" + imageFolder)\n    if not os.path.exists(jpegFile):\n        raise Exception(\"Missing \" + jpegFile)\n    \n    frame = getFrameNumberFromFilename(jpegFile)\n\n    # This was the original implementation, but it can give wrong results\n    # when the jpeg has incorrect time.\n    #(dateString, timeString) = getJpegDateTime(jpegFile)\n    \n    [dateString, timeString] = parseTimeStamps(orthoFile)\n    outputName = formFilePrefix(dateString, timeString, frame) + \".tif\"\n    outputPath = os.path.join(imageFolder, outputName)\n\n    return outputPath\n\ndef makeJpegFileName(run, frame):\n    '''Generate a file name like: 2016_07_19_00015.JPG'''\n    return ('%s_%05d.JPG' % (run.yyyy_mm_dd(), frame))\n\ndef makeLabelFileName(run, frame):\n    '''Generate a file name like: 2016_07_19_00015_classified.tif'''\n    return ('%s_%05d_classified.tif' % (run.yyyy_mm_dd(), frame))\n\ndef makeLabelOrthoFileName(run, frame):\n    '''Generate a file name like: 2016_07_19_00015_classified_ortho.tif'''\n    return ('%s_%05d_classified_ortho.tif' % (run.yyyy_mm_dd(), frame))\n\ndef projectionBoundsFile(folder):\n    return os.path.join(folder, 'projection_bounds.csv')\n\ndef readProjectionBounds(indexFile):\n    '''Read projection bunds for each ortho image.'''\n    bounds = {}\n\n    # Nothing to \n    if not os.path.exists(indexFile):\n        return bounds\n    \n    with open(indexFile, 'r') as f:\n        for line in f:\n            parts = line.strip().split(',')\n\n            for v in range(len(parts)):\n                parts[v] = parts[v].strip()\n                if parts[v] != \"\":\n                    parts[v] = float(parts[v].strip())\n            \n            if len(parts) != 6:\n                # Maybe when we wrote it last time we got interrupted.\n                # Note that the last value is just an empty space.\n                continue\n                \n            frame = int(parts[0])\n            bounds[frame] = (parts[1], parts[2], parts[3], parts[4])\n    return bounds\n\ndef writeProjectionBounds(indexFile, bounds):\n    '''Write projection bounds for all images.'''\n    with open(indexFile, 'w') as f:\n        for frame in sorted(bounds.keys()):\n            a,b,c,d = bounds[frame]\n            vals = [frame, a, b, c, d]\n            for val in vals:\n                f.write(str(val) + ', ')\n            f.write('\\n')\n\ndef readLinesInSet(fileName):\n    '''Read the lines from a file as elements in a set, while stripping all leading\n    and trailing spaces.'''\n\n    filesSet = set()\n    if not os.path.exists(fileName):\n        return filesSet\n\n    with open(fileName, 'r') as f:\n        for line in f:\n            line = line.strip()\n            filesSet.add(line)\n            \n    return filesSet\n\ndef logFilePrefix():\n    return 'icebridge_batch_log'\n\ndef validFilesPrefix():\n    '''This one is used in multiple places.'''\n    return 'valid_files'\n\ndef manager_log_prefix():\n    return 'pleiades_manager_log'\n\ndef validFilesList(folder, startFrame, stopFrame):\n    '''File containing the list of fetched files that were validated.\n    for the given range. Need the range so that when we validate in\n    parallel, we do not overwrite the same file. Later these validation\n    files will be merged.'''\n    \n    prefix = validFilesPrefix() + '_' + str(startFrame) + '_' + str(stopFrame) + '.csv'\n    return os.path.join(folder, prefix)\n\ndef updateValidFilesListFromDisk(filesList, filesSet):\n    '''Update the current set of valid files with any new info from disk.'''\n\n    # Nothing to \n    if not os.path.exists(filesList):\n        return filesSet\n\n    print(\"Reading: \" + filesList)\n    with open(filesList, 'r') as f:\n        for line in f:\n            line = line.strip()\n            filesSet.add(line)\n            \n    return filesSet\n\ndef writeValidFilesList(filesList, filesSet):\n    '''Write the list of valid files to disk.'''\n    print(\"Writing: \" + filesList)\n    with open(filesList, 'w') as f:\n        for filename in sorted(filesSet):\n            f.write(filename + '\\n')\n\ndef readIndexFile(parsedIndexPath, prependFolder = False):\n    '''Read an index file having frame number, filename, and url it came from.'''\n    frameDict  = {}\n    urlDict    = {}\n    with open(parsedIndexPath, 'r') as f:\n        for line in f:\n            parts = line.strip().split(',')\n            if len(parts) < 3:\n                # Odd index file\n                raise Exception(\"Invalid index file: \" + parsedIndexPath)\n            \n            frameNumber = int(parts[0])\n            frameDict[frameNumber] = parts[1].strip()\n\n            if prependFolder:\n                frameDict[frameNumber] = os.path.join(os.path.dirname(parsedIndexPath),\n                                                      frameDict[frameNumber])\n            urlDict[frameNumber] = parts[2].strip()\n\n    return (frameDict, urlDict)\n\ndef writeIndexFile(indexPath, frameDict, urlDict):\n    '''Write an index file, optionally with urls.'''\n    with open(indexPath, 'w') as f:\n        for frame in sorted(frameDict.keys()):\n            frameName = frameDict[frame]\n            urlName = \"\"\n            if frame in urlDict:\n                urlName = urlDict[frame]\n                \n            f.write(str(frame) + ', ' + frameName + ', ' + urlName + '\\n')\n\ndef isValidImage(filename):\n    '''Check that an image file is not corrupted in some way. This check is not enough.'''\n    \n    if not os.path.exists(filename):\n        return False\n    \n    # Must always wipe .aux.xml. Always. Otherwise, if this function is called first time\n    # it may return False, but if called second time it may return True.\n    auxFile = filename + '.aux.xml'\n    if os.path.exists(auxFile):\n        os.remove(auxFile)\n        \n    gdalinfoPath = asp_system_utils.which(\"gdalinfo\")\n    cmd = gdalinfoPath + ' -stats ' + filename\n    \n    if os.path.exists(auxFile):\n        os.remove(auxFile)\n        \n    p = subprocess.Popen(cmd.split(\" \"), stdout=subprocess.PIPE, stderr=subprocess.PIPE,\n                          universal_newlines=True)\n    output, error = p.communicate()\n    if p.returncode != 0:\n        return False\n    \n    if error is not None:\n        output += error\n\n    m = re.match(\"^.*?(Block\\s+failed|Premature\\s+end)\", output,\n                 re.IGNORECASE|re.MULTILINE|re.DOTALL)\n    if m:\n        return False\n    \n    return True\n\ndef isDEM(filename):\n    '''Return true if a file is a recognized DEM.'''\n    if 'crop' in filename or 'CMAP' in filename: return False # ignore some stray files\n    return (len(filename) >= 8 and filename[-8:] == '_DEM.tif')\n\ndef isLidar(filename):\n    '''Return true if the file is an input (not converted) lidar format'''\n    extension = fileExtension(filename)\n    return (extension == '.qi') or (extension == '.hdf5') or \\\n           (extension == '.h5') or (extension == '.TXT')\n\ndef isValidLidarCSV(filename):\n    '''Check that a lidar csv file is valid. It must have at least threee entries on one line.'''\n\n    if not os.path.exists(filename):\n        return False\n\n    with open(filename, \"r\") as ins:\n        array = []\n        for line in ins:\n\n            # This will help with lines which only have spaces\n            line = line.strip()\n            \n            # Skip empty lines\n            if len(line) == 0:\n                continue\n\n            # Skip lines starting with spaces followed by #\n            m = re.match(\"^\\s*\\#\", line)\n            if m:\n                continue\n\n            line = line.replace(',',  ' ')\n            line = line.replace('\\t', ' ')\n\n            vals = line.split(' ')\n            num = 0\n            for val in vals:\n                if len(val) == 0:\n                    continue\n                num += 1\n\n            if num >= 3:\n                return True\n            else:\n                return False\n\n    return False\n\ndef getLidarCsvFormat(filename):\n    '''Returns the ASP CSV format string to use for a lidar file'''\n    extension = fileExtension(filename)\n    if extension == '.TXT': # LVIS\n        return '5:lat,4:lon,6:height_above_datum'\n    return '1:lat,2:lon,3:height_above_datum' # ATM\n    \ndef getCameraGsdAndBounds(imagePath, cameraPath, logger, referenceDem=None, projString=\"\"):\n    '''Compute the GSD and bounding box of a single camera.\n       Use the DEM is provided, otherwise use the datum.'''\n    \n    # Run GSD tool\n    tool = asp_system_utils.which('camera_footprint')\n    cmd = ('%s --quick --datum wgs84 -t nadirpinhole %s %s' %\n            (tool, imagePath, cameraPath))\n    if referenceDem:\n        cmd += ' --dem-file ' + referenceDem\n    cmd = cmd.split()\n    if projString:\n        cmd.append('--t_srs',)\n        cmd.append(projString)\n    logger.info(\" \".join(cmd))\n    p = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True)\n    textOutput, err = p.communicate()\n    logger.info(textOutput)\n    \n    # Extract the gsd from the output text\n    m = re.findall(r\"Computed mean gsd: (\\d+\\.*[0-9e\\-]*)\", textOutput)\n    if len(m) != 1: # An unknown error occurred, move on.\n        raise Exception('Unable to compute GSD for file: ' + cameraPath)\n    gsd = float(m[0])\n\n    # Extract the bounding box from the output text\n    print(textOutput)\n    m = re.findall(\n          r\"Min: \\(([0-9e\\-\\.\\+]*), ([0-9e\\-\\.\\+]*)\\) width: ([0-9e\\-\\.\\+]*) height: ([0-9e\\-\\.\\+]*)\",\n          textOutput)\n    if (len(m) != 1) and (len(m[0]) != 4): # An unknown error occurred, move on.\n        raise Exception('Unable to compute GSD for file: ' + cameraPath)    \n    bounds = [float(x) for x in m[0]]\n\n    return (gsd, bounds)\n\ndef getGsdFromMapproject(imagePath, cameraPath, logger, lidarDem, referenceDem):\n    '''Compute the GSD by quering mapproject.'''\n\n    # Try to compute the gsd first from the lidar dem, and if that fails,\n    # from the reference dem.\n    gsd = -1\n    for dem in [lidarDem, referenceDem]:\n        tmpOutFile = cameraPath + \".tmp.tif\"\n        tool = asp_system_utils.which('mapproject')\n        cmd = ('%s %s %s %s %s --query-projection' %\n               (tool, dem, imagePath, cameraPath, tmpOutFile))\n        cmd = cmd.split()\n        logger.info(\" \".join(cmd))\n        p = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True)\n        textOutput, err = p.communicate()\n        logger.info(textOutput)\n        \n        # Extract the gsd from the output text\n        m = re.findall(r\"Output pixel size:\\s*(.*?)\\n\", textOutput)\n        if len(m) == 1: \n            gsd = float(m[0])\n            break\n\n    if gsd == -1:\n        raise Exception('Unable to compute GSD for file: ' + cameraPath)\n    \n    os.system(\"rm -f \" + tmpOutFile)\n    \n    return gsd\n\ndef getCorrectedFireballDems(outputFolder):\n    '''Get a dictionary of the corrected fireball DEMs, with path prepended to them.'''\n    fireballFolder     = getFireballFolder(outputFolder)\n    corrFireballFolder = getCorrFireballFolder(outputFolder)\n    fireballIndexPath  = csvIndexFile(fireballFolder)\n    if not os.path.exists(fireballIndexPath):\n        raise Exception(\"Error: Missing fireball index file: \" + fireballIndexPath + \".\")\n    (fireballFrameDict, fireballUrlDict) = \\\n                        readIndexFile(fireballIndexPath, prependFolder = True)\n\n    orthoFolder     = getOrthoFolder(outputFolder)\n    orthoIndexPath  = csvIndexFile(orthoFolder)\n    if not os.path.exists(orthoIndexPath):\n        raise Exception(\"Error: Missing ortho index file: \" + orthoIndexPath + \".\")\n    (orthoFrameDict, orthoUrlDict) = \\\n                        readIndexFile(orthoIndexPath, prependFolder = True)\n    \n    correctedFireballFrameDict  = {}\n\n    for frame in fireballFrameDict.keys():\n\n        fireballDem = fireballFrameDict[frame]\n        \n        # Get the corrected one\n        corrDem = os.path.join(corrFireballFolder, os.path.basename(fireballDem))\n\n        # This is a bugfix. Sometimes fireball DEMs for one flight\n        # actually are for the next flight. All this sorry story is\n        # because sometimes flights extend beyond midnight, and the\n        # book-keeping gets confused. This was fixed for orthos.  Here, if\n        # a DEM has a different date than the ortho, ignore it.\n        if frame not in orthoFrameDict:\n            continue\n        [orthoDateString, orthoTimeString] = parseTimeStamps(orthoFrameDict[frame])\n        [fireballDateString, fireballTimeString] = parseTimeStamps(fireballDem)\n        if orthoDateString != fireballDateString:\n            continue\n        \n        correctedFireballFrameDict[frame] = corrDem\n\n    return correctedFireballFrameDict\n    \ndef getCameraGsdAndBoundsRetry(imagePath, cameraPath, logger, referenceDem, projString=\"\"):\n    '''As getCameraGsd, but retry with the datum if the DEM fails.'''\n\n    try:\n        # Compute GSD using the DEM\n        # - Only need the projection string when not using a DEM\n        results = getCameraGsdAndBounds(imagePath, cameraPath, logger, referenceDem)\n    except:\n        # If that failed, try intersecting with the datum.\n        logger.info('DEM intersection failed, trying with datum...')\n        results = getCameraGsdAndBounds(imagePath, cameraPath, logger, None, projString)\n     \n    return results\n\ndef getImageCameraPairs(imageFolder, cameraFolder, startFrame, stopFrame, logger):\n    '''Return a list of paired image/camera files.'''\n\n    # TODO: This is not robust. Need to create an index of all images rather than\n    # reading whatever is in that directory.\n    \n    # Get a list of all the input files\n    allImageFiles  = getTifs(imageFolder)\n    allCameraFiles = getByExtension(cameraFolder, '.tsai')\n    allImageFiles.sort() # Put in order so the frames line up\n    allCameraFiles.sort()\n\n    # Keep only the images and cameras within the given range\n    imageFiles  = []\n    imageFrames = []\n    for image in allImageFiles:\n        frame = getFrameNumberFromFilename(image)\n        if not ( (frame >= startFrame) and (frame <= stopFrame) ):\n            continue\n        imageFiles.append(image)\n        imageFrames.append(frame)\n        \n    cameraFiles  = []\n    cameraFrames = []\n    for camera in allCameraFiles:\n        frame = getFrameNumberFromFilename(camera)\n        if not ( (frame >= startFrame) and (frame <= stopFrame) ):\n            continue\n        cameraFiles.append(camera)\n        cameraFrames.append(frame)\n\n    # Remove files without a matching pair\n    goodImages  = []\n    goodCameras = []\n    for frame in imageFrames:\n        goodImages.append(frame in cameraFrames)\n    for frame in cameraFrames:\n        goodCameras.append(frame in imageFrames)\n    \n    imageFiles  = [p[0] for p in zip(imageFiles,  goodImages ) if p[1]]\n    cameraFiles = [p[0] for p in zip(cameraFiles, goodCameras) if p[1]]\n    \n    logger.info('Of %d input images in range, using %d with camera files.' \n                % (len(goodImages), len(imageFiles)))\n\n    if len(imageFiles) < 2:\n        logger.error('Not enough input pairs exist to continue, quitting!')\n        return []\n\n    # Get full paths\n    imageFiles  = [os.path.join(imageFolder, f) for f in imageFiles ]\n    cameraFiles = [os.path.join(cameraFolder,f) for f in cameraFiles]\n\n    numFiles = len(imageFiles)\n    if (len(cameraFiles) != numFiles):\n        logger.error('process_icebridge_run.py: counted ' + str(len(imageFiles)) + \\\n                     ' image files.\\n' +\n                     'and ' + str(len(cameraFiles)) + ' camera files.\\n'+\n                     'Error: Number of image files and number of camera files must match!')\n        return []\n        \n    imageCameraPairs = zip(imageFiles, cameraFiles)\n    return imageCameraPairs\n\ndef batchFolderPrefix():\n    '''The name of the batch folder starts like this.'''\n    return \"batch_\"\n\ndef batchFolderName(startFrame, stopFrame, bundleLength):\n    '''The name of the folder containing processed data for given frames.'''\n    return ('%s%05d_%05d_%d' % (batchFolderPrefix(), startFrame, stopFrame, bundleLength))\n\ndef frameToFile(frame, suffix, processFolder, bundleLength):\n    '''For a given frame, find the corresponding file in the batch\n    folder with given suffix.'''\n    \n    # We count here on the convention for writing batch folders\n    prefix = ('%s%05d_*_%d' % (batchFolderPrefix(), frame, bundleLength))   \n    batchFolderGlob = os.path.join(processFolder,\n                                   prefix + '/*' + suffix)\n\n    matches = glob.glob(batchFolderGlob)\n\n    if len(matches) == 0:\n        #print(\"Error: No matches for: \" + batchFolderGlob + \". Will skip this frame.\")\n        return \"\", \"\"\n        \n    if len(matches) > 1:\n        # This I believe is an artifact of running the entire flight twice,\n        # with different value for --start-frame each time.\n        # For now, just take whatever is there, at some point this needs to be sorted out.\n        print(\"Warning: Found more than one answer matching glob:\" + batchFolderGlob)\n        print(\"Values are: \" + \" \".join(matches))\n        #return \"\", \"\"\n\n    return matches[0], os.path.dirname(matches[0])\n\ndef findInvalidFrames(validFilesSet, outputFolder, fileType):\n    '''Out of the files of a given type, find the ones that are not in\n    the given set of valid images.'''\n\n    if fileType   == 'ortho':\n        dataFolder = getOrthoFolder(outputFolder)\n    elif fileType == 'jpeg':\n        dataFolder = getJpegFolder(outputFolder)\n    else:\n        raise Exception(\"Unknown file type: \" + fileType)\n\n    # To be able to study which files are in which set, make all paths consistenty\n    # absolute\n    localOutputFolder = os.path.basename(outputFolder)\n    localFileSet = set()\n    for fileName in validFilesSet:\n        fileName = os.path.abspath(fileName)\n\n        # Correct for wrong path to folder (fragile)\n        #m = re.match(\"^.*?\" + localOutputFolder + \"/(.*?)$\", fileName)\n        #if not m: continue\n        #fileName = os.path.abspath(os.path.join(outputFolder, m.group(1)))\n        localFileSet.add(fileName)\n\n    indexPath = csvIndexFile(dataFolder)\n    if not os.path.exists(indexPath):\n        raise Exception(\"Missing file: \" + indexPath)\n    (frameDict, urlDict) = readIndexFile(indexPath, prependFolder = True)\n    badFrameDict = {}\n\n    for frame in frameDict.keys():\n        fileName = os.path.abspath(frameDict[frame])\n\n        # Correct for wrong path to folder (fragile)\n        #m = re.match(\"^.*?\" + localOutputFolder + \"/(.*?)$\", fileName)\n        #if not m: continue\n        #fileName = os.path.abspath(os.path.join(outputFolder, m.group(1)))\n        if fileName not in localFileSet:\n            badFrameDict[frame] = fileName\n    \n    return badFrameDict\n\ndef orthoListToRerun(validFilesSet, outputFolder, startFrame, stopFrame):\n    '''See for which files we need to redo ortho2pinhole.'''\n    invalidJpegs  = findInvalidFrames(validFilesSet, outputFolder, 'jpeg')\n    invalidOrthos = findInvalidFrames(validFilesSet, outputFolder, 'ortho')\n\n    trackedFrames = set()\n    orthoList = os.path.join(outputFolder, 'orthosToRerun.txt')\n    with open(orthoList, 'w') as f:\n        for frame in sorted(invalidJpegs.keys() + invalidOrthos.keys()):\n            if frame in trackedFrames: continue # we already saw this\n            if int(frame) < startFrame or int(frame) > stopFrame: continue\n            trackedFrames.add(frame)\n            f.write(str(frame) + '\\n')\n\n    return (orthoList, len(trackedFrames))\n    \ndef getBatchFolderFromBatchLine(line):\n    '''Returns something like /path/to/AN_20111012/processed/batch_125_126_2.'''\n    # Extract just the desired folder name    \n    m = re.match('^.*?\\s([^\\s]*?' + batchFolderPrefix() +'\\d+_\\d+_\\d+)', line)\n    if m:\n        return m.group(1)\n    return \"\"\n\ndef getFrameRangeFromBatchFolder(folder):\n    '''Returns (startFrame, endFrame) for a batch folder.'''\n    '''This is also used to parse a command in a batch file.'''\n    # Extract just the desired folder name    \n    m = re.match('^.*?' + batchFolderPrefix() + '([0-9]+)_([0-9]+)', folder)\n    if not m:\n        raise Exception('Failed to find batch frames in folder: ' + folder)\n    return (int(m.group(1)), int(m.group(2)))\n\ndef xmlFile(filename):\n    '''Return the matching xml file path for the input file.'''\n    \n    if (len(filename) >= 8 and filename[-7:-4] == 'DEM'): # DEM.tif and DEM.tfw\n        #file_DEM.tif and file_DEM.tfw becomes file.xml\n        return filename[:-8] + '.xml'\n    \n    # For other types\n    return filename + '.xml'\n\ndef xmlToImage(filename):\n    if fileExtension(filename) != '.xml':\n        raise Exception(\"Not an XML file: \" + filename)\n    return filename[:-4]\n    \ndef tfwFile(filename):\n    '''Return the matching tfw file path for the input file.'''\n    return filename[:-4] + '.tfw'\n\n\ndef isFloat(value):\n    '''Return true if the input value can be converted to a float.'''\n    try:\n      float(value)\n      return True\n    except:\n      return False\n\ndef hasValidChkSum(filename, logger):\n    '''Some files have an xml file containing the chksum. If so, varify\n       its validity. This applies to orthoimages, DEMs, and tfw files.'''\n\n    #isTfw = (fileExtension(filename) == '.tfw')\n    \n    if not os.path.exists(filename):\n        logger.info(\"File does not exist: \" + filename)\n        return False\n\n    baseFile = os.path.basename(filename)\n    \n    xml_file = xmlFile(filename)\n    if not os.path.exists(xml_file):\n        logger.info(\"File does not exist: \" + xml_file)\n        return False\n    \n    expectedChksum = ''\n    chkSumCount = 0\n    currFile = ''\n    with open(xml_file, \"r\") as xf:\n        for line in xf:\n\n            # There can be multiple files\n            m = re.match(\"^.*?\\<DistributedFileName\\>(.*?)\\<\", line, re.IGNORECASE)\n            if m:\n                currFile = m.group(1)\n                \n            # Encompass both kinds of checksum\n            m = re.match(\"^.*?\\<Checksum\\>(\\w+)(\\||\\<)\", line, re.IGNORECASE)\n            if m:\n                chkSumCount += 1\n\n                # There can be multiple checksums. The file can give a hint:\n                if currFile != '':\n                    if currFile == baseFile:\n                        expectedChksum = m.group(1)\n                else:\n                    # Just pick the first chksum\n                    if chkSumCount == 1:\n                        expectedChksum = m.group(1)\n                    \n    actualChksum = hashlib.md5(open(filename,'rb').read()).hexdigest()\n\n    if actualChksum != expectedChksum or actualChksum == '' or expectedChksum == '':\n        logger.info(\"Computed chksum: \" + str(actualChksum) + \" in \" + filename)\n        logger.info(\"Expected chksum: \" + str(expectedChksum) + \" in \" + filename)\n        \n        return False\n    \n    return True\n\ndef isValidTfw(filename, logger):\n    '''This file must have 6 lines of floats and a valid chksum.'''\n    \n    if fileExtension(filename) != '.tfw':\n        return False\n\n    if not hasValidChkSum(filename, logger):\n        return False\n    \n    count = 0\n    with open(filename, \"r\") as xf:\n        for line in xf:\n            line = line.strip()\n            if isFloat(line):\n                count += 1\n    return (count >= 6)\n\ndef parseLatitude(filename):\n    '''Find the <PointLatitude> value in the given file.'''\n\n    if not os.path.exists(filename):\n        raise Exception(\"Could not find file: \" + filename)\n\n    latitude = None\n    with open(filename, \"r\") as xf:\n        for line in xf:\n            m = re.match(\"^.*?\\<PointLatitude\\>(.*?)\\<\", line, re.IGNORECASE)\n            if m:\n                latitude = float(m.group(1))\n                break\n\n    if latitude is None:\n        raise Exception(\"Could not parse positive or negative latitude from: \" + filename)\n\n    return latitude\n\ndef getCameraFileName(imageFileName):\n    '''Get the camera file name we associate with an input image file.'''\n    return imageFileName.replace('.tif', '.tsai')\n\n# This function works for raw images, camera tsai files, orthoimages,\n# DEMs, lvis, OSSP label files, atm1, and atm2 files.\ndef getFrameNumberFromFilename(filename):\n\n    # Match 2009_10_16_<several digits>.JPG\n    m = re.match(\"^.*?\\d+\\_\\d+\\_\\d+\\_(\\d+)\\.JPG\", filename, re.IGNORECASE)\n    if m: return int(m.group(1))\n\n    # Match DMS_20111012_145559_00156.tif or .tsai (created by our python scripts)\n    m = re.match(\"^.*?DMS\\_\\d+\\_\\d+\\_(\\d+)\\.(tif|tsai)\", filename, re.IGNORECASE)\n    if m: return int(m.group(1))\n    \n    # Match DMS_1000109_03939_20091016_23310503_V02.tif (fetched from NSIDC)\n    m = re.match(\"^.*?DMS\\_\\d+\\_(\\d+)\\w+\\.tif\", filename, re.IGNORECASE)\n    if m: return int(m.group(1))\n\n    # Match IODMS3_20111018_14295436_00347_DEM.tif\n    m = re.match(\"^.*?IODMS[a-zA-Z0-9]*?\\_\\d+\\_\\d+\\_(\\d+)\\w+DEM\\.tif\", filename, re.IGNORECASE)\n    if m: return int(m.group(1))\n    \n    # Match ILVIS2_AQ2015_0929_R1605_060226.TXT\n    m = re.match(\"^.*?ILVIS.*?_(\\d+)(.TXT)\", filename, re.IGNORECASE)\n    if m: return int(m.group(1))\n\n    # Match ILATM1B_20091016_193033.atm4cT3.qi\n    # or    ILATM1B_20160713_195419.ATM5BT5.h5\n    m = re.match(\"^.*?ILATM\\w+\\_\\d+\\_(\\d+)\\.\\w+\\.(h5|qi)\", filename, re.IGNORECASE)\n    if m: return int(m.group(1))\n\n    # Match 2016_07_19_00008_classified.tif or .h5\n    m = re.match(\"^.*?\\d+\\_\\d+\\_\\d+\\_(\\d+)_classified\\.[h5|tif]\", filename, re.IGNORECASE)\n    if m: return int(m.group(1))\n\n    raise Exception('Could not parse: ' + filename)\n\ndef getTifs(folder, prependFolder=False):\n    '''Get tif files in given directory, ignoring _sub files.\n    This returns the files without sorting.'''\n    files = []\n    for f in os.listdir(folder):\n\n        # Skip non-image files and sub-images\n        ext = os.path.splitext(f)[1]\n        if (ext != '.tif') or ('_sub' in f) or ('pct.tif' in f) or ('_hillshade_' in f):\n            continue\n        if prependFolder:\n            files.append(os.path.join(folder, f))\n        else:\n            files.append(f)\n\n    return files\n\ndef getJpegs(folder):\n    # TODO: This function should not be used as it is not robust.\n    # Rather, look up the index, and read only files listed there.\n    '''Get jpeg files in given directory. This returns the files\n    without sorting or the folder name prepended to them.'''\n\n    files = []\n    for f in os.listdir(folder):\n\n        ext = os.path.splitext(f)[1]\n        if ext != '.JPG':\n            continue\n        files.append(f)\n\n    return files\n\ndef getByExtension(folder, ext):\n    # TODO: This function should not be used as it is not robust.\n    # Rather, look up the index, and read only files listed there.\n    '''Get files with given extension. This returns the files without\n    sorting or the folder name prepended to them.'''\n    files = []\n    for f in os.listdir(folder):\n\n        curr_ext = os.path.splitext(f)[1]\n        if ext != curr_ext:\n            continue\n        files.append(f)\n        \n    return files\n\ndef getDems(folder):\n    # TODO: This function should not be used as it is not robust.\n    # Rather, look up the index, and read only files listed there.\n    '''Get DEM files. This returns the files without sorting or the\n    folder name prepended to them.'''\n    files = []\n    for f in os.listdir(folder):\n\n        if not isDEM(f):\n            continue\n        files.append(f)\n\n    return files\n\ndef getLidar(folder):\n    # TODO: This function should not be used as it is not robust.\n    # Rather, look up the index, and read only files listed there.\n    '''Get LIDAR files. This returns the files without sorting or the\n    folder name prepended to them.'''\n\n    files = []\n    for f in os.listdir(folder):\n        if not isLidar(f):\n            continue\n        files.append(f)\n\n    return files\n\ndef getMatchingFrames(inputFiles, candidateFiles):\n    '''Given a list of input files and candidate files,\n       returns a list of candidate files having the same\n       frame numbers as the input files in the same order.\n       An entry will be 'None' if there is no matching frame.'''\n       \n    # Init output structure\n    numFiles   = len(inputFiles)\n    outputList = []\n    for i in range(0,numFiles):\n        outputList.append(None)\n    numMatched = 0\n    \n    # Loop through all the candidate files\n    for c in candidateFiles:\n        candidateFrame = getFrameNumberFromFilename(c)\n        # Compare them to each of the input files\n        for i in range(0,numFiles):\n            if outputList[i]: # Skip matched files\n                continue\n            inputFrame = getFrameNumberFromFilename(inputFiles[i])\n            if inputFrame == candidateFrame: # If the frames match, record the file\n                outputList[i] = c\n                numMatched += 1\n                if numMatched == numFiles: # Quit once all files are matched\n                    return outputList\n    return outputList\n            \n\ndef parseDateTimeStrings(dateString, timeString, useTimeFix, returnMinAndSecOnly):\n    '''Parse strings in the format 20110323_17433900.'''\n\n    MILLISECOND_TO_MICROSECOND = 10000\n    \n    year    = int(dateString[0:4])\n    month   = int(dateString[4:6])\n    day     = int(dateString[6:8])\n    hour    = int(timeString[0:2])\n    minute  = int(timeString[2:4])\n    second  = int(timeString[4:6])\n\n    if returnMinAndSecOnly:\n        return (minute, second)\n    \n    if useTimeFix: # Some files number the minutes and seconds from 1-60!\n        minute  = minute - 1\n        second  = second - 1\n    usecond = 0\n    if len(timeString) > 6:\n        usecond = int(timeString[6:8]) * MILLISECOND_TO_MICROSECOND\n    \n    try:\n        result = datetime.datetime(year, month, day, hour, minute, second, usecond)\n        return result\n    except Exception as e:\n        raise Exception('Caught exception processing dateString: ' \n                        + dateString +', timeString: ' + timeString\n                        +'\\n with values: ' + str((year, month, day, hour, minute, second, usecond))\n                        +'\\n' + str(e))\n\ndef secondsSinceMidnightToHHMMSS(secondsSinceMidnight):\n    '''Convert from integer number to HHMMSS string.'''\n\n    hours, remainder = divmod(secondsSinceMidnight, 3600)\n    minutes, seconds = divmod(remainder, 60)\n    \n    return ('%02d%02d%02d' % (hours, minutes, seconds))\n\n\ndef formFilePrefix(dateString, timeString, frame):\n    '''Form a file with given numbers. This is used in more than one place.'''\n    \n    if len(timeString) > 6:\n        timeString = timeString[0:6] # dump the fractions of a second\n\n    return ('DMS_%s_%s_%05d') % (dateString, timeString, frame)\n\ndef parseParts(fileName):\n    '''This function parses pieces of a file. It is very related\n    to formFilePrefix(), parseTimeStamps(), and getFrameNumberFromFilename()'''\n    \n    m = re.match(\"^(.*?)DMS_(\\d+)_(\\d+)_(\\d+)(\\..*?)$\", fileName)\n    if not m:\n        return [\"\", \"\", \"\", \"\", \"\"]\n    \n    return [m.group(1), m.group(2), m.group(3), m.group(4), m.group(5)]\n    \ndef parseTimeStamps(fileName):\n    '''Pull two six or eight digit values from the given file name\n       as the time and date stamps.'''\n\n    # Start by handling ILVIS2_AQ2011_1012_R1203_049752.TXT\n    # Format is ILVIS1B_LOYYYY_MMDD_RYYMM_nnnnnn.xxx\n    # where nnnnnn is number of seconds since UTC midnight of the day the data collection started\n    # per http://nsidc.org/data/ilvis1b/versions/1 and\n    #     https://nsidc.org/data/ilvis1b\n    m = re.match(\"^.*?ILVIS\\d\\_[A-Z][A-Z](\\d\\d\\d\\d)\\_(\\d\\d\\d\\d)\\_.*?\\_(\\d+)\\.TXT\",\n                 fileName, re.IGNORECASE)\n    if m:\n        lidarDateString = m.group(1) + m.group(2)\n        secondsInDay    = int(m.group(3))\n        lidarTimeString = secondsSinceMidnightToHHMMSS(secondsInDay)\n        return [lidarDateString, lidarTimeString]\n\n    fileName = os.path.basename(fileName)\n\n    # Now look at something like: DMS_1100106_11985_20101026_19113275.tif\n    \n    m = re.match(\"^DMS\\_(\\d+)_(\\d+)_(\\d+)_(\\d+)\\.tif\", fileName, re.IGNORECASE)\n    if m:\n        # The format is: a value, frame number, yyyymmdd, hhmmssss\n        dateString = m.group(3)\n        timeString = m.group(4)\n        return [dateString, timeString]\n    \n    # This is somewhat fragile older code andling other cases\n    \n    fileName = fileName.replace('.', '_')\n    fileName = fileName.replace('-', '_')\n    parts    = fileName.split('_')\n\n    imageDateString = \"\"\n    imageTimeString = \"\"\n\n    for part in parts:\n\n        if len(part) != 6 and len(part) != 8:\n            continue\n        \n        if len(part) == 6:\n            if part < '000000' or part > '999999':\n                continue\n\n        if len(part) == 8:\n            if part < '00000000' or part > '99999999':\n                continue\n\n        if imageDateString == \"\" and len(part) == 8:\n            # The date must always be 8 digits (YYYYMMDD)\n            imageDateString = part\n            continue\n\n        if imageTimeString == \"\":\n            # The time can be hhmmss or hhmmssff (ff = hundreds of seconds)\n            imageTimeString = part\n            continue\n            \n    if imageDateString == \"\":\n        return []\n\n    if imageTimeString == \"\":\n        return []\n\n    return [imageDateString, imageTimeString]\n\ndef lidarFiles(lidarFolder):\n    '''Find lidar files in given folder that are plain text, so either\n    .TXT or .csv converted from ATM, etc. Note that the folder name is\n    not prepended to the file names.'''\n    \n    # All files in the folder\n    allFiles = os.listdir(lidarFolder)\n\n    # See based on existing files if we are dealing with LVIS\n    isLVIS = False\n    for f in allFiles:\n        m = re.match(\"^.*?ILVIS.*?\\d+\\.TXT\", f, re.IGNORECASE)\n        if m:\n            isLVIS = True\n            \n    # Get just the files we converted to csv format or plain text LVIS files\n    lidarFiles = []    \n    for f in allFiles:\n        extension = os.path.splitext(f)[1]\n        if 'html.csv' in f:\n            continue # skip index.html.csv\n        if (not isLVIS and extension == '.csv') or (isLVIS and extension == '.TXT'):\n           lidarFiles.append(f)\n    lidarFiles.sort()\n\n    lidarExt = '.csv'\n    if isLVIS:\n        lidarExt = '.TXT'\n\n    return (lidarFiles, lidarExt, isLVIS)\n\ndef alignFileName():\n    '''The name of a generated aligned DEM.'''\n    return 'out-align-DEM.tif'\n\ndef blendFileName():\n    '''The name of a generated blended DEM.'''\n    return 'out-blend-DEM.tif'\n\ndef orthoFileName():\n    '''The name of a generated ortho file.'''\n    return 'out-ortho.tif'\n\ndef footprintFileName():\n    '''The name of a generated footprint DEM.'''\n    return 'out-trans-footprint-DEM.tif'\n\ndef orthoPreviewFileName():\n    '''The name of a generated ortho preview file.'''\n    return 'out-ortho-PREVIEW.jpg'\n\ndef getAlignPrefix(outputFolder):\n    return  os.path.join(outputFolder, 'align/out')\n\ndef getBundlePrefix(outputFolder):\n    '''The name of the prefix for the bundle-adjusted cameras.'''\n    return  os.path.join(outputFolder, 'bundle/out')\n\ndef alignedBundleStr():\n    '''The name of the prefix (sans folder) for the generated\n    bundle-adjusted and pc_aligned camera files.'''\n    return 'aligned_bundle/out'\n\ndef getAlignedBundlePrefix(outputFolder):\n    '''The name of the prefix for the bundle-adjusted cameras.'''\n    return  os.path.join(outputFolder, alignedBundleStr())\n\ndef lidar_pair_prefix():\n    return 'LIDAR_PAIR_'\n\ndef findMatchingLidarFile(imageFile, lidarFolder):\n    '''Given an image file, find the best lidar file to use for alignment.'''\n    \n    # Look in the paired lidar folder, not the original lidar folder.\n    pairedFolder    = getPairedLidarFolder(lidarFolder)\n    pairedLidarFile = getPairedIndexFile(pairedFolder)\n    if not os.path.exists(pairedLidarFile):\n        raise Exception(\"Missing file: \" + pairedLidarFile)\n    (lidarDict, dummyUrlDict) = readIndexFile(pairedLidarFile, prependFolder = True)\n    lidarFilesIn = sorted(lidarDict.values())\n    lidarFiles = []\n\n    # Verify that all the expected lidar files are there!\n    for f in lidarFilesIn:\n        if os.path.exists(f):\n            lidarFiles.append(f)\n        else:\n            print ('WARNING: Expected paired lidar file ' + f + ' does not exist!')\n    \n    if len(lidarFiles) <= 0:\n        raise Exception(\"Empty directory of pairs in \" + pairedFolder)\n\n    return findMatchingLidarFileFromList(imageFile, lidarFiles)\n\ndef findMatchingLidarFileFromList(imageFile, lidarFiles):\n    '''Find the best matching lidar file from a list.'''\n    \n    vals = parseTimeStamps(imageFile)\n    if len(vals) < 2:\n        raise Exception('Failed to parse the date and time from: ' + imageFile)\n    useTimeFix = False\n    returnMinAndSecOnly = False\n    imageDateTime = parseDateTimeStrings(vals[0], vals[1], useTimeFix, returnMinAndSecOnly)\n    \n    #print 'INPUT = ' + str(imageDateTime)\n    \n    # Search for the matching file in the lidar folder.\n    # - We are looking for the closest lidar time that starts BEFORE the image time.\n    # - It is possible for an image to span lidar files, we will address that if we need to!\n    bestTimeDelta = datetime.timedelta.max\n    bestLidarFile = 'NA'\n    zeroDelta     = datetime.timedelta()\n\n    # First see if we need correction for sometimes seconds going from 1 to 60.\n    minMinSec = 60\n    maxMinSec = 0\n    for lidarPath in lidarFiles:\n\n        vals = parseTimeStamps(lidarPath)\n        if len(vals) < 2:\n          continue # ignore bad files\n\n        useTimeFix = False\n        returnMinAndSecOnly = True\n        (minute, second) = parseDateTimeStrings(vals[0], vals[1], useTimeFix, returnMinAndSecOnly)\n        if second < minMinSec: minMinSec = second\n        if second > maxMinSec: maxMinSec = second\n        if minute < minMinSec: minMinSec = minute\n        if minute > maxMinSec: maxMinSec = minute\n\n    if minMinSec <= 0 and maxMinSec >= 60:\n        raise Exception(\"The minute/second range goes from  \" + str(minMinSec) +\n                        \" to \" + str(maxMinSec))\n\n    useTimeFix = False\n    if maxMinSec >= 60:\n        useTimeFix = True\n        #print 'Using lidar time fix!'\n\n    for lidarPath in lidarFiles:\n\n        vals = parseTimeStamps(lidarPath)\n        if len(vals) < 2:\n            continue # ignore bad files\n\n        try:\n            returnMinAndSecOnly = False\n            lidarDateTime = parseDateTimeStrings(vals[0], vals[1], useTimeFix, returnMinAndSecOnly)\n            #lidarDateTime = lidarDateTime + datetime.timedelta(hours=2, minutes=3, seconds=42) # Manual hack for flights with bad lidar times!\n        except Exception as e:\n            raise Exception('Failed to parse datetime for lidar file: ' + lidarPath + '\\n' +\n                            'Error is: ' + str(e))\n\n        #print 'THIS = ' + str(lidarDateTime)\n\n        # Compare time to the image time\n        timeDelta = abs(imageDateTime - lidarDateTime)\n        #print 'DELTA = ' + str(timeDelta)\n        # Select the closest lidar time\n        # - Since we are using the paired files, the file time is in the middle \n        #   of the (large) file so being close to the middle should make sure the DEM\n        #   is fully covered by LIDAR data.\n        if timeDelta < bestTimeDelta:\n            bestLidarFile = lidarPath\n            bestTimeDelta = timeDelta\n\n    # Normal spacing seems to be 6.5 minutes but this must vary by flight.\n    MAX_DELTA = datetime.timedelta(minutes=15)\n    if (bestLidarFile == 'NA') or (bestTimeDelta > MAX_DELTA):\n        errorMessage = 'Failed to find matching lidar file for image ' + imageFile\n        if bestLidarFile:\n            errorMessage += '\\n--> Nearest lidar file was '+ bestLidarFile +' with delta ' + str(bestTimeDelta)\n        raise Exception(errorMessage)\n\n    #print bestLidarFile\n    #print bestTimeDelta\n\n    return bestLidarFile\n\ndef fileNonEmpty(path):\n    '''Make sure file exists and is non-empty.'''\n    return os.path.exists(path) and (os.path.getsize(path) > 0)\n\ndef fetchFile(url, outputPath):\n    '''Retrieve one file using curl.  Return True on success.'''\n\n    # Set up the command\n    cookiePaths = ' -b ~/.urs_cookies -c ~/.urs_cookies '\n    curlOpts    = ' -n -L '\n    cmd = 'curl ' + cookiePaths + curlOpts + url + ' > ' + outputPath\n\n    # Download the file\n    print (cmd)\n    p = subprocess.Popen(cmd, shell=True, universal_newlines=True)\n    os.waitpid(p.pid, 0)\n    \n    return os.path.exists(outputPath)\n\ndef partitionArray(arr, wid):\n    '''Partition one array into sub-arrays, each of length at most wid.''' \n    out = []\n    cur = []\n    start = 0\n    while (start < len(arr)):\n        \n        if len(cur) < wid:\n            cur.append(arr[start])\n        else:\n            out.append(cur[:])\n            cur = [arr[start]]\n        start += 1\n\n    # Append the leftover elements\n    if len(cur) > 0:\n        out.append(cur[:])\n        \n    return out\n    \n# It is faster to invoke one curl command for multiple files.\n# Do not fetch files that already exist. Note that we expect\n# that each file looks like outputFolder/name.<ext>,\n# and each url looks like https://.../name.<ext>.\ndef fetchFilesInBatches(baseCurlCmd, batchSize, dryRun, outputFolder, files, urls, logger):\n    '''Fetch a list of files in batches using curl.'''\n\n    curlCmd = baseCurlCmd\n    numFiles = len(files)\n\n    if numFiles != len(urls):\n        raise Exception(\"Expecting as many files as urls.\")\n    \n    currentFileCount = 0\n    for fileIter in range(numFiles):\n        \n        if not fileNonEmpty(files[fileIter]):\n            # Add to the command\n            curlCmd += ' -O ' + urls[fileIter]\n            currentFileCount += 1 # Number of files in the current download command\n\n        # Download the indicated files when we hit the limit or run out of files\n        if ( (currentFileCount >= batchSize) or (fileIter == numFiles - 1) ) and \\\n               currentFileCount > 0:\n            logger.info(curlCmd)\n            if not dryRun:\n                logger.info(\"Saving the data in \" + outputFolder)\n                p = subprocess.Popen(curlCmd, cwd=outputFolder, shell=True, universal_newlines=True)\n                os.waitpid(p.pid, 0)\n                \n            # Start command fresh for the next file\n            currentFileCount = 0\n            curlCmd = baseCurlCmd\n    \n# This block of code is just to get a non-blocking keyboard check!\nimport signal\nclass AlarmException(Exception):\n    pass\ndef alarmHandler(signum, frame):\n    raise AlarmException\ndef nonBlockingRawInput(prompt='', timeout=20):\n    '''Return a key if pressed or an empty string otherwise.\n       Waits for timeout, non-blocking.'''\n    signal.signal(signal.SIGALRM, alarmHandler)\n    signal.alarm(timeout)\n    try:\n        text = raw_input(prompt)\n        signal.alarm(0)\n        return text\n    except AlarmException:\n        pass # Timeout\n    signal.signal(signal.SIGALRM, signal.SIG_IGN)\n    return ''\n        \ndef waitForTaskCompletionOrKeypress(taskHandles, logger = None, interactive=True, quitKey='q',\n                                    sleepTime=20):\n    '''Block in this function until the user presses a key or all tasks complete.'''\n\n    # Wait for all the tasks to complete\n    notReady = len(taskHandles)\n    while notReady > 0:\n\n        if interactive:\n            # Wait and see if the user presses a key\n            msg = 'Waiting on ' + str(notReady) + ' process(es), press '+str(quitKey)+'<Enter> to abort...\\n'\n            keypress = nonBlockingRawInput(prompt=msg, timeout=sleepTime)\n            if keypress == quitKey:\n                logger_print(logger, 'Recieved quit command!')\n                break\n        else:\n            logger_print(logger, \"Waiting on \" + str(notReady) + ' incomplete tasks.')\n            time.sleep(sleepTime)\n            \n        # As long as we have this process waiting, keep track of our resource consumption.\n        cpuPercentUsage = psutil.cpu_percent()\n        memInfo         = psutil.virtual_memory()\n        memUsed         = memInfo[0] - memInfo[1]\n        memPercentUsage = float(memUsed) / float(memInfo[0])\n\n        usageMessage = ('CPU percent usage = %f, Memory percent usage = %f' \n                        % (cpuPercentUsage, memPercentUsage))\n        logger_print(logger, usageMessage)\n            \n        # Otherwise count up the tasks we are still waiting on.\n        notReady = 0\n        for task in taskHandles:\n            if not task.ready():\n                notReady += 1\n    return\n\ndef stopTaskPool(pool):\n    '''Stop remaining tasks and kill the pool.'''\n\n    PROCESS_POOL_KILL_TIMEOUT = 3\n    pool.close()\n    time.sleep(PROCESS_POOL_KILL_TIMEOUT)\n    pool.terminate()\n    pool.join()\n\n\ndef setUpLogger(outputFolder, logLevel, logPathPrefix):\n    '''Set up the root logger so all called files will write to the same output file.'''\n\n    # Generate a timestamped log file in the output folder\n    timestamp = datetime.datetime.now().strftime('%Y%m%d_%H%M%S')\n    logName   = logPathPrefix +'_'+ timestamp + '.txt'\n    logPath   = os.path.join(outputFolder, logName)\n    \n    logger = logging.getLogger()    # Call with no argument to configure the root logger.\n    logger.setLevel(level=logLevel)\n    logger.propagate = False # This is a unique logger, don't copy messages to parent modules.\n    \n    # Make sure we have exacly one stream handler to mirror logging to console.\n    hasStreamHandler = False\n    for h in logger.handlers:\n        if 'StreamHandler' in str(h):\n            hasStreamHandler = True\n    if not hasStreamHandler:\n        logger.addHandler(logging.StreamHandler())\n    \n    fileHandler = logging.FileHandler(logPath)\n    formatter   = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')\n    fileHandler.setFormatter(formatter)\n    logger.addHandler(fileHandler)\n\n    logger = logging.getLogger(__name__) # We configured root, but continue logging with the normal name.    \n    \n    return logger\n\ndef logger_print(logger, msg):\n    '''Print to logger, if present. This helps keeps all messages in sync.'''\n    if logger is not None:\n        logger.info(msg)\n    else:\n        print(msg)\n\n# TODO: Rename to isSouth.\ndef checkSite(site):\n    '''Verify the site is legal and return True if it is in the southern hemisphere.'''\n    possibleSites = ['AN', 'GR', 'AL']\n    if site not in possibleSites:\n        raise Exception(\"Site must be either AN, GR, or AL.\")\n    isSouth = (site == 'AN')\n    return isSouth\n\ndef getElevationLimits(site):\n    '''Return the min and max elevation expected at a given site'''\n    # Would it work better to compute this on a per-flight or per-DEM basis?\n    if site == 'AN':\n        return (-50, 4500)\n    if site == 'GR':\n        return (-50, 3500)\n    if site == 'AL':\n        return (-50, 3500)\n\ndef getEpsgCode(isSouth, asString=True):\n    '''Return EPSG code for a location.  See notes in getProjString.'''\n    code = 3413\n    if isSouth:\n        code = 3031\n    if asString:\n        return 'EPSG:' + str(code)\n    return code\n\ndef getProjString(isSouth, addQuotes=False):\n    '''Return the correct proj string for the pole.  Surrounding quotes are optional'''\n    # EPSG 3413 - WGS 84 / NSIDC Sea Ice Polar Stereographic North\n    #PROJ_STRING_NORTH = '+proj=stere +lat_0=90 +lat_ts=70 +lon_0=-45 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs'\n    # EPSG 3031 - WGS 84 / Antarctic Polar Stereographic\n    #PROJ_STRING_SOUTH = '+proj=stere +lat_0=-90 +lat_ts=-71 +lon_0=0 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs'\n    s = getEpsgCode(isSouth, asString=True)\n    if addQuotes:\n        return '\"'+s+'\"'\n    else:\n        return s \n\n\ndef getReferenceDemName(site):\n    '''Returns the DEM name to use for a given location'''\n\n    # Note: The AN and GR DEMs match our projection system for those sites.\n\n    if site == 'AN':\n        #return 'krigged_dem_nsidc_ndv0_fill.tif' # Higher resolution\n        return 'ramp200dem_wgs_v2.tif' # Used to produce the orthos - EPSG 3031\n    if site == 'GR':\n        #return 'gimpdem_90m_v1.1.tif' # Higher resolution\n        return 'NSIDC_Grn1km_wgs84_elev.tif' # Used to produce the orthos - EPSG 3413\n    if site == 'AL':\n        # Supposedly these were produced with the SRTM map but that map\n        #  does not seem to actually include Alaska.  This may mean the NED\n        #  map (60 meter) was used but this would require tile handling logic\n        #  so for now we will try to use this single 300m DEM.\n        return 'akdem300m.tif'\n        # Proj string: '+proj=aea +lat_1=55 +lat_2=65 +lat_0=50 +lon_0=-154 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs '\n\ndef readStats(inputPath):\n    '''Read some info about a run. Do a little parsing.'''\n\n    if os.path.exists(inputPath):\n        with open(inputPath, 'r') as f:\n            for line in f:\n                if line == \"\":\n                    continue\n                line = line.strip()\n                vals = line.split(\",\")\n                if len(vals) != 3:\n                    continue\n                \n                # Convert time to a float value representing minutes.\n                # Pre-pad with zeros for missing fields.\n                time_arr = [\"0\", \"0\", \"0\"] + vals[2].split(\":\")\n                minutes = float(time_arr[-1])/60.0 + float(time_arr[-2]) + 60.0*float(time_arr[-3])\n                minutes = round(10*minutes)/10\n                vals[2] = \" \" + str(minutes)\n\n                # Rm too many zeros\n                vals[1] = \" \" + str( round(float(vals[1])*10)/10.0 )\n                \n                line = \",\".join(vals)\n                return line\n            \n    return \"-1, -1, -1\"\n\ndef readGeodiffOutput(inputPath):\n    '''Read in the header from a geodiff output csv file.\n       Returns a dictionary containing 'Max', 'Min', 'Mean', and 'StdDev'. '''\n\n    if not os.path.exists(inputPath):\n        raise Exception('geodiff output file ' + inputPath + ' does not exist!')\n\n    # Pack the results into a dictionary\n    keywords = ['Max', 'Min', 'Mean', 'StdDev']\n    results = {}\n\n    ext = os.path.splitext(inputPath)[1]\n    if ext == '.csv':\n        numHeaderLines = 0\n        with open(inputPath, 'r') as f:\n            for line in f:\n                if '#' not in line: # Quit when we go past the comment lines\n                    break\n                numHeaderLines = numHeaderLines + 1\n                for word in keywords: # Look for the four values\n                    if word in line:\n                        parts = line.split(':') # Extract the number\n                        if len(parts) != 2:\n                            raise Exception('Error parsing geodiff line:\\n' + line)\n                        results[word] = float(parts[1])\n                        break # Go on to the next line in the file\n        # For CSV files, include a count of the number of points compared.   \n        numLines = asp_file_utils.getFileLineCount(inputPath) - numHeaderLines\n        results['NumDiffs'] = numLines\n    else: # Handle .tif files\n        stats = asp_image_utils.getImageStats(inputPath)[0]\n        results['Min'   ] = stats[0]\n        results['Max'   ] = stats[1]\n        results['Mean'  ] = stats[2]\n        results['StdDev'] = stats[3]\n        \n    return results\n\ndef isBatchValid(batchFolder):\n    '''Returns true if the given batch has produced a good output DEM.'''\n\n    # The maximum allowed distance between our DEM and the lidar file.\n    MAX_LIDAR_DEM_DIFF_METERS = 5\n\n    try:\n        diffPath = os.path.join(batchFolder, 'out-diff.csv')\n        results  = readGeodiffOutput(diffPath)\n        \n        return (results['MEAN'] <= MAX_LIDAR_DEM_DIFF_METERS)\n    except:\n        return False\n\ndef gsdToDemRes(gsd):\n    '''The DEM resolution is 4x the GSD.'''\n    GSD_RESOLUTION_MULTIPLIER = 4.0\n    return gsd * GSD_RESOLUTION_MULTIPLIER\n\n# For debugging functions\n#if __name__ == \"__main__\":\n#    print (getFrameRangeFromBatchFolder('/home/test/batch_234_1425/'))\n\n"
  },
  {
    "path": "src/asp/IceBridge/icebridge_kmz_to_csv.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n'''\nExtracts the frame event positions from an Icebridge KMZ file and\nwrites them out as a bundle_adjust compatible .csv file.  Currently\nthese files are available at this website: \nhttp://asapdata.arc.nasa.gov/dms/missions.html\n'''\n\nimport sys, os\nimport shutil, string, errno, optparse, glob\n\n# The path to the ASP python files\nbasepath    = os.path.abspath(sys.path[0])\npythonpath  = os.path.abspath(basepath + '/../Python')  # for dev ASP\nlibexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP\nsys.path.insert(0, basepath) # prepend to Python path\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\n\nimport asp_system_utils\nasp_system_utils.verify_python_version_is_supported()\n\n\ndef convert(inputPath, outputPath):\n    '''Converts the input KML file to a CSV file'''\n\n    fIn  = open(inputPath,  'r')\n    fOut = open(outputPath, 'w')\n    \n    fOut.write('# ID, longitude, latitude, elevation\\n')\n    for line in fIn:\n    \n        if '<dd>Frame ID:' in line:\n            start    = line.find(':')\n            stop     = line.rfind(';')            \n            idString = line[start+2:stop]\n            \n        if '<coordinates>' in line:\n            # Extract the coordinate from the string\n            start = line.find('>')\n            stop  = line.rfind('<')\n            s     = line[start+1:stop]\n            parts = s.split(',')\n            longitude = parts[0]\n            latitude  = parts[1]\n            elevation = parts[2]\n    \n            fOut.write('%s, %s, %s, %s\\n' % (idString, longitude, latitude, elevation))\n            idString = None\n        \n    fIn.close()\n    fOut.close()    \n\ndef unpackKmz(inputPath):\n    '''Extracts the KML file from the KMZ file'''\n    \n    # Unzip the KMZ file silently\n    cmd = 'unzip -q -o ' + inputPath\n    #print cmd\n    os.system(cmd)\n    \n    # Return path to the KML file\n    folder    = os.path.dirname(inputPath)\n    unzipPath = os.path.join(folder, 'doc.kml')\n    if not os.path.exists(unzipPath):\n        raise Exception('Failed to unzip KML data!')\n    return unzipPath\n\ndef main(inputPath, outputPath):\n    '''Does all the work!'''\n\n    kmlPath = unpackKmz(inputPath)\n    convert(kmlPath, outputPath)\n\nif __name__ == \"__main__\":\n\n    # Handle input parameters\n    if len(sys.argv) != 3:\n        print('Wrong number of input arguments provided.')\n        print('Usage: icebridge_kmz_to_csv <input kmz file> <output csv file>')\n    else:\n        sys.exit(main(sys.argv[1], sys.argv[2]))\n    \n        \n        \n        \n        \n        \n\n\n"
  },
  {
    "path": "src/asp/IceBridge/input_conversions.py",
    "content": "#!/usr/bin/env python\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n# Fetch all the data for a run and then process all the data.\n# See sample usage below.\n\nimport os, sys, optparse, datetime, time, subprocess, logging, multiprocessing, re, shutil, time\nimport os.path as P\n\n# The path to the ASP python files and tools\nbasepath      = os.path.dirname(os.path.realpath(__file__)) # won't change, unlike syspath\npythonpath    = os.path.abspath(basepath + '/../Python')     # for dev ASP\nlibexecpath   = os.path.abspath(basepath + '/../libexec')    # for packaged ASP\nicebridgepath = os.path.abspath(basepath + '/../IceBridge')  # IceBridge tools\n\n# Prepend to Python path\nsys.path.insert(0, basepath)\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\nsys.path.insert(0, icebridgepath)\n\nimport icebridge_common, fetch_icebridge_data, process_icebridge_run\nimport extract_icebridge_ATM_points, camera_models_from_nav\nimport asp_system_utils, asp_alg_utils, asp_geo_utils\n\nasp_system_utils.verify_python_version_is_supported()\n\ndef convertJpegs(jpegFolder, imageFolder, startFrame, stopFrame, skipValidate,\n                 cameraMounting, logger):\n    '''Convert jpeg images from RGB to single channel.\n       Returns false if any files failed.'''\n\n    badFiles = False\n    \n    logger.info('Converting input images to grayscale...')\n\n    os.system('mkdir -p ' + imageFolder)\n\n    # Loop through all the input images\n\n    jpegIndexPath = icebridge_common.csvIndexFile(jpegFolder)\n    if not os.path.exists(jpegIndexPath):\n        raise Exception(\"Error: Missing jpeg index file: \" + jpegIndexPath + \".\")\n    (jpegFrameDict, jpegUrlDict) = icebridge_common.readIndexFile(jpegIndexPath,\n                                                                  prependFolder = True)\n    \n    # Need the orthos to get the timestamp\n    orthoFolder = icebridge_common.getOrthoFolder(os.path.dirname(jpegFolder))\n    orthoIndexPath = icebridge_common.csvIndexFile(orthoFolder)\n    if not os.path.exists(orthoIndexPath):\n        raise Exception(\"Error: Missing ortho index file: \" + orthoIndexPath + \".\")\n    (orthoFrameDict, orthoUrlDict) = icebridge_common.readIndexFile(orthoIndexPath,\n                                                                  prependFolder = True)\n    \n    if not skipValidate:\n        validFilesList = icebridge_common.validFilesList(os.path.dirname(jpegFolder),\n                                                         startFrame, stopFrame)\n        validFilesSet = set()\n        validFilesSet = icebridge_common.updateValidFilesListFromDisk(validFilesList, validFilesSet)\n        numInitialValidFiles = len(validFilesSet)\n        \n    # Fast check for missing images. This is fragile, as maybe it gets\n    # the wrong file with a similar name, but an honest check is very slow.\n    imageFiles = icebridge_common.getTifs(imageFolder, prependFolder = True)\n    imageFrameDict = {}\n    for imageFile in imageFiles:\n        frame = icebridge_common.getFrameNumberFromFilename(imageFile)\n        if frame < startFrame or frame > stopFrame: continue\n        imageFrameDict[frame] = imageFile\n        \n    for frame in sorted(jpegFrameDict.keys()):\n\n        inputPath = jpegFrameDict[frame]\n        \n        # Only deal with frames in range\n        if not ( (frame >= startFrame) and (frame <= stopFrame) ):\n            continue\n\n        if frame in imageFrameDict.keys() and skipValidate:\n            # Fast, hackish check\n            continue\n\n        if frame not in orthoFrameDict:\n            logger.info(\"Error: Could not find ortho image for jpeg frame: \" + str(frame))\n            # Don't want to throw here. Just ignore the missing ortho\n            continue\n        \n        # Make sure the timestamp and frame number are in the output file name\n        try:\n            outputPath = icebridge_common.jpegToImageFile(inputPath, orthoFrameDict[frame])\n        except Exception as e:\n            logger.info(str(e))\n            logger.info(\"Removing bad file: \" + inputPath)\n            os.system('rm -f ' + inputPath) # will not throw\n            badFiles = True\n            continue\n        \n        # Skip existing valid files\n        if skipValidate:\n            if os.path.exists(outputPath):\n                logger.info(\"File exists, skipping: \" + outputPath)\n                continue\n        else:\n            if outputPath in validFilesSet and os.path.exists(outputPath):\n                #logger.info('Previously validated: ' + outputPath) # very verbose\n                validFilesSet.add(inputPath) # Must have this\n                continue\n            \n            if icebridge_common.isValidImage(outputPath):\n                #logger.info(\"File exists and is valid, skipping: \" + outputPath) # verbose\n                if not skipValidate:\n                    # Mark both the input and the output as validated\n                    validFilesSet.add(inputPath) \n                    validFilesSet.add(outputPath)\n                continue\n        \n        # Use ImageMagick tool to convert from RGB to grayscale\n        # - Some image orientations are rotated to make stereo processing easier.\n        rotateString = ''\n        if cameraMounting == 2: # Flight direction towards top of image\n            rotateString = '-rotate 90 '\n        if cameraMounting == 3: # Flight direction towards bottom of image\n            rotateString = '-rotate -90 '\n        cmd = ('%s %s -colorspace Gray %s%s') % \\\n              (asp_system_utils.which('convert'), inputPath, rotateString, outputPath)\n        logger.info(cmd)\n\n        # Run command and fetch its output\n        p = subprocess.Popen(cmd.split(\" \"), stdout=subprocess.PIPE, stderr=subprocess.PIPE,\n                             universal_newlines=True)\n        output, error = p.communicate()\n        if p.returncode != 0:\n            badFiles = True\n            logger.error(\"Command failed.\")\n            logger.error(\"Wiping bad files: \" + inputPath + \" and \" + outputPath + '\\n'\n                         + output)\n            os.system('rm -f ' + inputPath) # will not throw\n            os.system('rm -f ' + outputPath) # will not throw\n\n        if not os.path.exists(outputPath):\n            badFiles = True\n            logger.error('Failed to convert jpeg file: ' + inputPath)\n            logger.error(\"Wiping bad files: \" + inputPath + \" and \" + outputPath + '\\n'\n                         + output)\n            os.system('rm -f ' + inputPath) # will not throw\n            os.system('rm -f ' + outputPath) # will not throw\n\n        # Check for corrupted files\n        if error is not None:\n            output += error\n        m = re.match(\"^.*?premature\\s+end\", output, re.IGNORECASE|re.MULTILINE|re.DOTALL)\n        if m:\n            badFiles = True\n            logger.error(\"Wiping bad files: \" + inputPath + \" and \" + outputPath + '\\n'\n                         + output)\n            os.system('rm -f ' + inputPath) # will not throw\n            os.system('rm -f ' + outputPath) # will not throw\n\n    if not skipValidate:\n        # Write to disk the list of validated files, but only if new\n        # validations happened.  First re-read that list, in case a\n        # different process modified it in the meantime, such as if two\n        # managers are running at the same time.\n        numFinalValidFiles = len(validFilesSet)\n        if numInitialValidFiles != numFinalValidFiles:\n            validFilesSet = icebridge_common.updateValidFilesListFromDisk(validFilesList,\n                                                                          validFilesSet)\n            icebridge_common.writeValidFilesList(validFilesList, validFilesSet)\n            \n    if badFiles:\n        logger.error(\"Converstion of JPEGs failed. If any files were corrupted, \" +\n                     \"they were removed, and need to be re-fetched.\")\n    \n    return (not badFiles)\n            \ndef correctFireballDems(fireballFolder, corrFireballFolder, startFrame, stopFrame, isNorth,\n                        skipValidate, logger):\n    '''Fix the header problem in Fireball DEMs'''\n\n    logger.info('Correcting Fireball DEMs ...')\n\n    # Read the existing DEMs\n    fireballIndexPath = icebridge_common.csvIndexFile(fireballFolder)\n    if not os.path.exists(fireballIndexPath):\n        raise Exception(\"Error: Missing fireball index file: \" + fireballIndexPath + \".\")\n        \n    (fireballFrameDict, fireballUrlDict) = \\\n                        icebridge_common.readIndexFile(fireballIndexPath, prependFolder = True)\n    \n    if not skipValidate:\n        validFilesList = icebridge_common.validFilesList(os.path.dirname(fireballFolder),\n                                                         startFrame, stopFrame)\n        validFilesSet = set()\n        validFilesSet = icebridge_common.updateValidFilesListFromDisk(validFilesList, validFilesSet)\n        numInitialValidFiles = len(validFilesSet)\n\n    # Loop through all the input images\n    os.system('mkdir -p ' + corrFireballFolder)\n    badFiles = False\n    for frame in sorted(fireballFrameDict.keys()):\n\n        # Skip if outside the frame range\n        if not ( (frame >= startFrame) and (frame <= stopFrame) ):\n            continue\n\n        inputPath = fireballFrameDict[frame]\n        if not icebridge_common.isDEM(inputPath):\n            continue\n\n        outputPath = os.path.join(corrFireballFolder, os.path.basename(inputPath))\n\n        # Skip existing valid files\n        if skipValidate:\n            if os.path.exists(outputPath):\n                logger.info(\"File exists, skipping: \" + outputPath)\n                continue\n        else:\n            if outputPath in validFilesSet and os.path.exists(outputPath):\n                #logger.info('Previously validated: ' + outputPath) # very vebose\n                continue\n            \n            if icebridge_common.isValidImage(outputPath):\n                #logger.info(\"File exists and is valid, skipping: \" + outputPath)\n                validFilesSet.add(outputPath) # mark it as validated\n                continue\n        \n        # Run the correction script\n        execPath = asp_system_utils.which('correct_icebridge_l3_dem')\n        cmd = (('%s %s %s %d') %\n               (execPath, inputPath, outputPath, isNorth))\n        logger.info(cmd)\n        # TODO: Run this as a subprocess and check the return code\n        os.system(cmd)\n        \n        # Check if the output file is good\n        if not icebridge_common.isValidImage(outputPath):\n            logger.error('Failed to convert dem file, wiping: ' + inputPath + ' ' + outputPath)\n            os.system('rm -f ' + inputPath) # will not throw\n            os.system('rm -f ' + outputPath) # will not throw\n            badFiles = True\n        else:\n            if not skipValidate:\n                validFilesSet.add(outputPath) # mark it as validated\n            \n    if not skipValidate:\n        # Write to disk the list of validated files, but only if new\n        # validations happened.  First re-read that list, in case a\n        # different process modified it in the meantime, such as if two\n        # managers are running at the same time.\n        numFinalValidFiles = len(validFilesSet)\n        if numInitialValidFiles != numFinalValidFiles:\n            validFilesSet = icebridge_common.updateValidFilesListFromDisk(validFilesList,\n                                                                          validFilesSet)\n            icebridge_common.writeValidFilesList(validFilesList, validFilesSet)\n\n    return (not badFiles)\n            \ndef getCalibrationFileForFrame(cameraLoopkupFile, inputCalFolder, frame, yyyymmdd, site, logger):\n    '''Return the camera model file to be used with a given input frame.'''\n\n    # To manually force a certain camera file, use this spot!\n    #name = 'IODCC0_2015_GR_NASA_DMS20.tsai'\n    #return os.path.join(inputCalFolder, name)\n\n    camera = ''\n    \n    # Iterate through lines in lookup file\n    with open(cameraLoopkupFile, \"r\") as cf:\n        for line in cf:\n\n            # Split line into parts and match site/date entries\n            line = line.strip()\n            vals = re.split('\\s+', line)\n            if len(vals) < 3:\n                continue\n            if vals[0] != site or vals[1] != yyyymmdd:\n                continue\n            \n            curr_camera = vals[2]\n            if curr_camera == \"\":\n                raise Exception('Found an empty camera for day and site: ' + yyyymmdd + ' ' + site)\n                \n            # There is one default camera, and possible a backup camera for a range\n            # of frames\n            # - Currently these are on separate lines\n            m = re.match(\"^.*?frames\\s+(\\d+)-(\\d+)\", line)\n            if not m:\n                # The default camera, it is always before the backup one in the list.\n                # So this map must not be populated yet with this key.\n                camera = curr_camera\n            else:\n                # The backup camera for a range\n                startRange = int(m.group(1))\n                stopRange  = int(m.group(2))\n                if (frame >= startRange) and (frame <= stopRange):\n                    camera = curr_camera\n\n            # TODO: Modify file format so each flight has all info on a single line!\n            #break # Each frame will match only one line\n\n    if camera == \"\":\n        logger.error('Failed to parse the camera.')\n        raise Exception('Failed to parse the camera.')\n\n    # Switch the extension to .tsai\n    camera = camera[:-4] + '.tsai'\n\n    return os.path.join(inputCalFolder, camera)\n\ndef cameraFromOrthoWrapper(inputPath, orthoPath, inputCamFile, estimatedCameraPath, \n                           outputCamFile, refDemPath, simpleCamera, numThreads):\n    '''Generate a camera model from a single ortho file'''\n\n    # Make multiple calls with different options until we get one that works well\n    IP_METHOD    = [1, 0, 2, 1, 1, 2, 0] # IP method\n    FORCE_SIMPLE = [0, 0, 0, 0, 0, 0, 1] # If all else fails use simple mode\n    LOCAL_NORM   = [False, False, False, False, True, True, False] # If true, image tiles are individually normalized with method 1 and 2\n    IP_PER_TILE  = [0, 0, 0, 1024, 0, 0, 0]\n    numAttempts = len(IP_METHOD)\n   \n    MIN_IP     = 15  # Require more IP to make sure we don't get bogus camera models\n    DESIRED_IP = 200 # If we don't hit this number, try other methods before taking the best one.\n\n    # The max distance in meters the ortho2pinhole solution is allowed to move from the input\n    #  navigation estimate.\n    MAX_TRANSLATION = 7\n\n    bestIpCount = 0\n    tempFilePath  = outputCamFile + '_temp' # Used to hold the current best result\n    matchPath     = outputCamFile + '.match' # Used to hold the match file if it exists\n    tempMatchPath = matchPath + '_temp'\n\n    os.system(\"ulimit -c 0\")  # disable core dumps\n    os.system(\"rm -f core.*\") # these keep on popping up\n    os.system(\"umask 022\")    # enforce files be readable by others\n\n    numPoints = 0 # must be initialized\n    for i in range(0,numAttempts):\n\n        # Get parameters for this attempt\n        ipMethod  = IP_METHOD[i]\n        localNorm = LOCAL_NORM[i]\n    \n        if FORCE_SIMPLE[i]: # Always turn this on for the final attempt!\n            simpleCamera = True\n\n        # Call ortho2pinhole command\n        ortho2pinhole = asp_system_utils.which(\"ortho2pinhole\")\n        cmd = (('%s %s %s %s %s --reference-dem %s --crop-reference-dem --threads %d ' \\\n                '--ip-detect-method %d --minimum-ip %d --max-translation %f') \n                % (ortho2pinhole, inputPath, orthoPath, inputCamFile, outputCamFile, \n                   refDemPath, numThreads, ipMethod, MIN_IP, MAX_TRANSLATION) )\n        if localNorm:\n            cmd += ' --skip-image-normalization'\n        if estimatedCameraPath is not None:\n            cmd += ' --camera-estimate ' + estimatedCameraPath\n        if simpleCamera:\n            cmd += ' --short-circuit'\n        if IP_PER_TILE[i] > 0:\n            cmd += ' --ip-per-tile ' + str(IP_PER_TILE[i])\n\n        # Use a print statement as the logger fails from multiple processes\n        print(cmd)\n\n        os.system('rm -f ' + matchPath) # Needs to be gone\n        p = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE, universal_newlines=True)\n        textOutput, err = p.communicate()\n        p.wait()\n        print(textOutput)\n\n        if not os.path.exists(outputCamFile): # Keep trying if no output file produced\n            continue\n\n        if simpleCamera:\n            break # Never need more than one attempt with simpleCamera!\n\n        # Check the number of IP used\n        m = re.findall(r\"Using (\\d+) points to create the camera model.\", textOutput)\n        if len(m) != 1: # An unknown error occurred, move on.\n            continue\n        numPoints = int(m[0])\n        if numPoints >= DESIRED_IP: # Got a lot of points, quit\n            break\n        if numPoints > bestIpCount: # Got some points but not many, try other options \n            bestIpCount = numPoints #  to see if we can beat this result.\n            shutil.move(outputCamFile, tempFilePath)\n            \n            if os.path.exists(matchPath):\n                shutil.move(matchPath, tempMatchPath)\n\n    if (not simpleCamera) and (numPoints < DESIRED_IP): # If we never got the desired # of points\n        shutil.move(tempFilePath, outputCamFile) # Use the camera file with the most points found\n        if os.path.exists(tempMatchPath):\n            shutil.move(tempMatchPath, matchPath)\n        print ('Best number of ortho points = ' + str(bestIpCount))\n    else:\n        print ('Best number of ortho points = ' + str(numPoints))\n    \n    os.system('rm -f ' + tempFilePath ) # Clean up these files\n    os.system('rm -f ' + tempMatchPath)\n    os.system(\"rm -f core.*\") # these keep on popping up\n    os.system(\"rm -f \" + outputCamFile + \"*-log-*\") # wipe logs\n              \n    if not os.path.exists(outputCamFile):\n        # This function is getting called from a pool, so just log the failure.\n        print('Failed to convert ortho file: ' + orthoPath)\n\n    # I saw this being recommended, to dump all print statements in the current task\n    sys.stdout.flush()\n\ndef getCameraModelsFromOrtho(imageFolder, orthoFolder,\n                             inputCalFolder, inputCalCamera,\n                             cameraLookupFile, \n                             noNav, \n                             navCameraFolder,\n                             yyyymmdd, site,\n                             refDemPath, cameraFolder,\n                             simpleCameras,\n                             startFrame, stopFrame,\n                             framesFile,\n                             numProcesses, numThreads, logger):\n    '''Generate camera models from the ortho files.\n       Returns false if any files were not generated.'''\n\n    logger.info('Generating camera models from ortho images...')\n    \n    imageFiles    = icebridge_common.getTifs(imageFolder)\n    orthoFiles    = icebridge_common.getTifs(orthoFolder)\n    if navCameraFolder != \"\":\n        estimateFiles = icebridge_common.getByExtension(navCameraFolder, '.tsai')\n    else:\n        estimateFiles = []\n\n    # See if to process frames from file\n    filesSet = set()\n    if framesFile != \"\":\n        filesSet = icebridge_common.readLinesInSet(framesFile)\n\n    # Make a dictionary of ortho files by frame\n    # - The orthoFiles list contains _gray.tif as well as the original\n    #   images.  Prefer the gray versions because it saves a bit of time\n    #   in the ortho2pinhole process.\n    orthoFrames = {}\n    for f in orthoFiles:\n\n        frame = icebridge_common.getFrameNumberFromFilename(f)\n\n        if not ( (frame >= startFrame) and (frame <= stopFrame) ):\n            continue\n        if (framesFile != \"\") and (str(frame) not in filesSet):\n            continue\n\n        # Record this file if it is the first of this frame or\n        #  if it is the gray version of this frame.\n        if (frame not in orthoFrames) or ('_gray.tif' in f):\n            orthoFrames[frame] = f\n\n    # Make a dictionary of estimated camera files by frame\n    estimatedFrames = {}\n    for f in estimateFiles:\n        frame = icebridge_common.getFrameNumberFromFilename(f)\n        \n        if not ( (frame >= startFrame) and (frame <= stopFrame) ):\n            continue\n        if (framesFile != \"\") and (str(frame) not in filesSet):\n            continue\n\n        estimatedFrames[frame] = f\n\n    imageFiles.sort()\n\n    logger.info('Starting ortho processing pool with ' + str(numProcesses) + ' processes.')\n    pool = multiprocessing.Pool(numProcesses)\n\n    # Loop through all input images\n    taskHandles = []\n    outputFiles = []\n    for imageFile in imageFiles:\n\n        # Skip non-image files (including _sub images made by stereo_gui)\n        # TODO: Use a function here from icebridge_common. Also replace\n        # all similar locations.\n        ext = os.path.splitext(imageFile)[1]\n        if (ext != '.tif') or ('_sub' in imageFile) or ('pct.tif' in imageFile):\n            continue\n\n        # Get associated orthofile\n        frame = icebridge_common.getFrameNumberFromFilename(imageFile)\n\n        if not ( (frame >= startFrame) and (frame <= stopFrame) ):\n            continue\n        if (framesFile != \"\") and (str(frame) not in filesSet):\n            continue\n\n        if not frame in orthoFrames.keys():\n            continue\n\n        # Find the estimated camera file to use with this ortho frame.        \n        orthoFile = orthoFrames[frame]\n        try:\n            estimatedCameraFile = estimatedFrames[frame]\n            estimatedCameraPath = os.path.join(navCameraFolder, estimatedCameraFile)\n        except:\n            # For now treat this as an error, a missing nav file suggests\n            #  that something is going wrong with the flight!\n            if not noNav:\n                logger.error('Missing nav estimated camera for frame ' + str(frame))\n                continue\n            else:\n                estimatedCameraFile = None\n                estimatedCameraPath = None\n            #estimatedCameraFile = None\n            #estimatedCameraPath = None\n        \n        # Check output file\n        inputPath = os.path.join(imageFolder, imageFile)\n        orthoPath = os.path.join(orthoFolder, orthoFile)\n        \n        outputCamFile = os.path.join(cameraFolder,\n                                     icebridge_common.getCameraFileName(imageFile))\n        outputFiles.append(outputCamFile)\n        if os.path.exists(outputCamFile):\n            logger.info(\"File exists, skipping: \" + outputCamFile)\n            os.system(\"rm -f \" + outputCamFile + \"*-log-*\") # wipe logs\n            continue\n\n        # Determine which input camera file will be used for this frame\n        if inputCalCamera == \"\":\n            inputCamFile = getCalibrationFileForFrame(cameraLookupFile, inputCalFolder,\n                                                      frame, yyyymmdd, site, logger)\n        else:\n            # This logic will force to use a given camera rather than\n            # looking it up. This is not the usual way of doing things.\n            inputCamFile = inputCalCamera\n            if not os.path.exists(inputCalCamera):\n                raise Exception(\"Could not find: \" + inputCalCamera)\n\n        orthoArgs = (inputPath, orthoPath, inputCamFile,\n                     estimatedCameraPath, outputCamFile,\n                     refDemPath, simpleCameras, numThreads)\n\n        if numProcesses > 1:\n            # Add ortho2pinhole command to the task pool\n            taskHandles.append(pool.apply_async(cameraFromOrthoWrapper, orthoArgs))\n        else:\n            # Single process, more logging info this way\n            cameraFromOrthoWrapper(*orthoArgs)\n\n    # Wait for all the tasks to complete\n    logger.info('Finished adding ' + str(len(taskHandles)) + ' tasks to the pool.')\n    icebridge_common.waitForTaskCompletionOrKeypress(taskHandles, logger, interactive=False,\n                                                     quitKey='q')\n\n    # All tasks should be finished\n    icebridge_common.stopTaskPool(pool)\n    logger.info('Finished ortho processing.')\n\n    # Run a check to see if we got all the output files\n    for f in outputFiles:\n        if not os.path.exists(f):\n            return False\n    return True\n\ndef getCameraModelsFromNav(imageFolder, orthoFolder, \n                           inputCalFolder, inputCalCamera,\n                           cameraLookupFile, \n                           navFolder, navCameraFolder,\n                           yyyymmdd, site,\n                           startFrame, stopFrame, cameraMounting,\n                           logger):\n    '''Given the folder containing navigation files, generate an\n       estimated camera model for each file.'''\n   \n    # Note: Currently these output files DO NOT contain accurate intrinsic parameters!\n\n    logger.info(\"Get camera models from nav.\")\n\n    # All the work is done by the separate file.\n    cmd = [imageFolder, orthoFolder, inputCalFolder, navFolder, navCameraFolder,\n           '--start-frame', str(startFrame), \n           '--stop-frame',  str(stopFrame)]\n\n    # Pick an input calibration file to use. The exact one is not essential here,\n    # things will be refined later.\n    if inputCalCamera == \"\":\n        inputCalCamera = getCalibrationFileForFrame(cameraLookupFile, inputCalFolder,\n                                                    startFrame, yyyymmdd, site, logger)\n\n    if inputCalCamera != \"\" and os.path.exists(inputCalCamera):\n        cmd += ['--input-calibration-camera', inputCalCamera]\n        \n    # Only one alternate orientation (180 degree flipped) is handled here.\n    # - The two 90 degree flips are handled by rotating the input images!\n    if cameraMounting == 1:\n        cmd += ['--camera-mounting', str(cameraMounting)]\n\n    logger.info(\"camera_models_from_nav.py \" + \" \".join(cmd))\n\n    if (camera_models_from_nav.main(cmd) < 0):\n        raise Exception('Error generating camera models from nav!')\n\ndef convertLidarDataToCsv(lidarFolder, startFrame, stopFrame, \n                          skipValidate, logger):\n    '''Make sure all lidar data is available in a readable text format.\n       Returns false if any files failed to convert.'''\n\n    logger.info('Converting LIDAR files...')\n\n    lidarIndexPath = icebridge_common.csvIndexFile(lidarFolder)\n    (frameDict, urlDict) = icebridge_common.readIndexFile(lidarIndexPath)\n\n    if not skipValidate:\n        validFilesList = icebridge_common.validFilesList(os.path.dirname(lidarFolder),\n                                                         startFrame, stopFrame)\n        validFilesSet = set()\n        validFilesSet = icebridge_common.updateValidFilesListFromDisk(validFilesList, validFilesSet)\n        numInitialValidFiles = len(validFilesSet)\n\n    convDict = {}\n    \n    # Loop through all files in the folder\n    badFiles = False\n    for frame in sorted(frameDict.keys()):\n\n        f = frameDict[frame]\n        extension = icebridge_common.fileExtension(f)\n        \n        # Only interested in a few file types\n        if (extension != '.qi') and (extension != '.hdf5') and (extension != '.h5'):\n            convDict[frame] = f # these are already in plain text\n            continue\n\n        convDict[frame] = os.path.splitext(f)[0] + '.csv'\n        outputPath = os.path.join(lidarFolder, convDict[frame])\n\n        # Handle paths\n        fullPath = os.path.join(lidarFolder, f)\n        if not os.path.exists(fullPath):\n            logger.info(\"Cannot convert missing file: \" + fullPath)\n            continue\n\n        # If the input is invalid, wipe both it, its xml, and the output\n        # Hopefully there will be a subsquent fetch step where it will get\n        # refetched.\n        if not icebridge_common.hasValidChkSum(fullPath, logger):\n            logger.info(\"Will wipe invalid file: \" + fullPath)\n            xmlFile = icebridge_common.xmlFile(fullPath)\n            os.system('rm -f ' + fullPath) # will not throw\n            os.system('rm -f ' + xmlFile) # will not throw\n            os.system('rm -f ' + outputPath) # will not throw\n            badFiles = True\n            continue\n\n        # Skip existing valid files\n        if skipValidate:\n            if os.path.exists(outputPath):\n                logger.info(\"File exists, skipping: \" + outputPath)\n                continue\n        else:\n            if outputPath in validFilesSet and os.path.exists(outputPath):\n                #logger.info('Previously validated: ' + outputPath) # verbose\n                continue\n            if icebridge_common.isValidLidarCSV(outputPath):\n                #logger.info(\"File exists and is valid, skipping: \" + outputPath)\n                continue\n        \n        # Call the conversion\n        logger.info(\"Process \" + fullPath)\n        extract_icebridge_ATM_points.main([fullPath])\n        \n        # Check the result\n        if not icebridge_common.isValidLidarCSV(outputPath):\n            logger.error('Failed to parse LIDAR file, will wipe: ' + outputPath)\n            os.system('rm -f ' + outputPath) # will not throw            \n            badFiles = True\n        else:\n            if not skipValidate:\n                validFilesSet.add(outputPath) # mark it as validated\n            \n    convLidarFile = icebridge_common.getConvertedLidarIndexFile(lidarFolder)\n\n    willWriteConvFile = False\n    if not os.path.exists(convLidarFile):\n        willWriteConvFile = True\n    else: \n        # Bugfix: Sometimes the written converted file has the wrong size, maybe\n        # something got interrupted earlier.\n        (lidarDictIn, dummyUrlDict) = icebridge_common.readIndexFile(convLidarFile)\n        if lidarDictIn != convDict:\n            willWriteConvFile = True\n            \n    if willWriteConvFile:\n        logger.info(\"Writing: \" + convLidarFile)\n        icebridge_common.writeIndexFile(convLidarFile, convDict, {})\n        \n    if not skipValidate:\n        # Write to disk the list of validated files, but only if new\n        # validations happened.  First re-read that list, in case a\n        # different process modified it in the meantime, such as if two\n        # managers are running at the same time.\n        numFinalValidFiles = len(validFilesSet)\n        if numInitialValidFiles != numFinalValidFiles:\n            validFilesSet = icebridge_common.updateValidFilesListFromDisk(validFilesList,\n                                                                          validFilesSet)\n            icebridge_common.writeValidFilesList(validFilesList, validFilesSet)\n\n    return (not badFiles)\n\ndef pairLidarFiles(lidarFolder, skipValidate, logger):\n    '''For each pair of lidar files generate a double size point cloud.\n       We can use these later since they do not have any gaps between adjacent files.'''\n    \n    logger.info('Generating lidar pairs...')\n\n    # Create the output folder\n    pairedFolder = icebridge_common.getPairedLidarFolder(lidarFolder)\n    os.system('mkdir -p ' + pairedFolder)\n\n    convLidarFile = icebridge_common.getConvertedLidarIndexFile(lidarFolder)\n    if not os.path.exists(convLidarFile):\n        raise Exception(\"Missing file: \" + convLidarFile)\n\n    (lidarDict, dummyUrlDict) = icebridge_common.readIndexFile(convLidarFile)\n    lidarExt = ''\n    for frame in lidarDict:\n        lidarExt = icebridge_common.fileExtension(lidarDict[frame])\n\n    numLidarFiles = len(lidarDict.keys())\n\n    pairedDict = {}\n    \n    # Loop through all pairs of csv files in the folder    \n    badFiles = False\n    lidarKeys = sorted(lidarDict.keys())\n    for i in range(len(lidarKeys)-1):\n        \n        thisFile = lidarDict[lidarKeys[i  ]]\n        nextFile = lidarDict[lidarKeys[i+1]]\n\n        date2, time2 = icebridge_common.parseTimeStamps(nextFile)\n        \n        # Record the name with the second file\n        # - More useful because the time for the second file represents the middle of the file.\n        outputName = icebridge_common.lidar_pair_prefix() + date2 +'_'+ time2 + lidarExt\n\n        pairedDict[lidarKeys[i]] = outputName\n        \n        # Handle paths\n        path1      = os.path.join(lidarFolder, thisFile)\n        path2      = os.path.join(lidarFolder, nextFile)\n        outputPath = os.path.join(pairedFolder, outputName)\n\n        if not os.path.exists(path1) or not os.path.exists(path2):\n            logger.info(\"Cannot create \" + outputPath + \" as we are missing its inputs\")\n            # If the inputs are missing, but the output is there, most likely it is corrupt.\n            # Wipe it. Hopefully a subsequent fetch and convert step will bring it back.\n            if os.path.exists(outputPath):\n                logger.info(\"Wiping: \" + outputPath)\n                os.system('rm -f ' + outputPath) # will not throw\n                badFiles = True\n            continue\n        \n        # Skip existing valid files\n        if skipValidate:\n            if os.path.exists(outputPath):\n                logger.info(\"File exists, skipping: \" + outputPath)\n                continue\n        else:\n            if icebridge_common.isValidLidarCSV(outputPath):\n                #logger.info(\"File exists and is valid, skipping: \" + outputPath)\n                continue\n\n        # Concatenate the two files\n        cmd1 = 'cat ' + path1 + ' > ' + outputPath\n        cmd2 = 'tail -n +2 -q ' + path2 + ' >> ' + outputPath\n        logger.info(cmd1)\n        p        = subprocess.Popen(cmd1, stdout=subprocess.PIPE, shell=True,\n                                    universal_newlines=True)\n        out, err = p.communicate()\n        logger.info(cmd2)\n        p        = subprocess.Popen(cmd2, stdout=subprocess.PIPE, shell=True,\n                                    universal_newlines=True)\n        out, err = p.communicate()\n\n        if not icebridge_common.isValidLidarCSV(outputPath):\n            logger.error('Failed to generate merged LIDAR file, will wipe: ' + outputPath)\n            os.system('rm -f ' + outputPath) # will not throw\n            badFiles = True\n\n    pairedLidarFile = icebridge_common.getPairedIndexFile(pairedFolder)\n    \n    willWritePairedFile = False\n    if not os.path.exists(pairedLidarFile):\n        willWritePairedFile = True\n    else: \n        # Bugfix: Sometimes the written converted file has the wrong size, maybe\n        # something got interrupted earlier.\n        (lidarDictIn, dummyUrlDict) = icebridge_common.readIndexFile(pairedLidarFile)\n        if lidarDictIn != pairedDict:\n            willWritePairedFile = True\n    \n    if willWritePairedFile:\n        logger.info(\"Writing: \" + pairedLidarFile)\n        icebridge_common.writeIndexFile(pairedLidarFile, pairedDict, {})\n\n    return (not badFiles)\n\n\n"
  },
  {
    "path": "src/asp/IceBridge/label_images.py",
    "content": "#!/usr/bin/env python\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n# Wrapper Script for the OSSP machine learning based labelling tool.\n\nimport os, sys, argparse, datetime, time, subprocess, logging, multiprocessing, re, glob\nimport traceback\nimport os.path as P\n\n# The path to the ASP python files and tools\nbasepath      = os.path.dirname(os.path.realpath(__file__))  # won't change, unlike syspath\npythonpath    = os.path.abspath(basepath + '/../Python')     # for dev ASP\nlibexecpath   = os.path.abspath(basepath + '/../libexec')    # for packaged ASP\nbinpath       = os.path.abspath(basepath + '/../bin')        # for packaged ASP\nicebridgepath = os.path.abspath(basepath + '/../IceBridge')  # IceBridge tools\ntoolspath     = os.path.abspath(basepath + '/../Tools')      # ASP Tools\n\n# Prepend to Python path\nsys.path.insert(0, basepath)\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\nsys.path.insert(0, icebridgepath)\n\nimport icebridge_common, run_helper\nimport asp_system_utils, asp_alg_utils, asp_geo_utils\n\nasp_system_utils.verify_python_version_is_supported()\n\n# Prepend to system PATH\nos.environ[\"PATH\"] = basepath       + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = pythonpath     + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = libexecpath    + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = icebridgepath  + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = toolspath      + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = binpath        + os.pathsep + os.environ[\"PATH\"]\n\n\n\ndef get_camera(cameraFolder, frame):\n    '''Get the label file and the camera file for a given frame'''\n\n    # Get a list of all the input files\n#    allImageFiles  = icebridge_common.getTifs(labelFolder)\n    allCameraFiles = icebridge_common.getByExtension(cameraFolder, '.tsai')\n\n    # Keep only the images and cameras within the given range\n#    imageFile = None\n#    for image in allImageFiles:\n#        thisFrame = icebridge_common.getFrameNumberFromFilename(image)\n#        if thisFrame != frame:\n#            continue\n#        imageFile = os.path.join(labelFolder, image)\n#        break\n\n    cameraFile = None\n    for camera in allCameraFiles:\n        thisFrame = icebridge_common.getFrameNumberFromFilename(camera)\n        if thisFrame != frame:\n            continue\n        cameraFile = os.path.join(cameraFolder, camera)\n        break\n\n    return cameraFile\n\n\n\ndef label_images(outputFolder, frameNum, trainingPath, site, yyyymmdd, numThreads):\n    '''Apply the labeling algorithm to a single image, then map project the result.'''\n\n    print 'Running label for frame: ' + str(frameNum)\n\n    # Get required paths\n    inputFolder  = icebridge_common.getJpegFolder      (outputFolder)\n    cameraFolder = icebridge_common.getCameraFolder    (outputFolder)\n    labelFolder  = icebridge_common.getLabelFolder     (outputFolder)\n    orthoFolder  = icebridge_common.getLabelOrthoFolder(outputFolder)\n\n    # Hardcoded paths!!!\n    toolPath     = 'python ~/repo/OSSP/ossp_process.py'\n    refDemFolder = '/nobackup/smcmich1/icebridge/reference_dems/'\n\n    # Run the label tool\n    NO_SPLITTING = 1 # Plenty of RAM to load these images\n    ONE_PROCESS  = 1\n\n    # Figure out the label path\n    run       = run_helper.RunHelper(site, yyyymmdd)\n    labelName = icebridge_common.makeLabelFileName(run, frameNum)\n    labelPath = os.path.join(labelFolder, labelName)\n\n    #cmd = ('%s %s --output_dir %s --min_frame %d --max_frame %d srgb %s --splits %d --parallel %d' % \n    #       (toolPath, inputFolder, labelFolder, frameNum, frameNum, trainingPath, NO_SPLITTING, ONE_PROCESS))\n    cmd = ('time %s %s --output_dir %s --min_frame %d --max_frame %d srgb %s' %\n           (toolPath, inputFolder, labelFolder, frameNum, frameNum, trainingPath))\n    print cmd\n    if icebridge_common.isValidImage(labelPath):\n        print 'Skipping completed file: ' + labelPath\n    else:\n        os.system(cmd)\n\n    # Also generate the map projected version of the image\n\n    # Figure out the camera and output path\n    cameraPath  = get_camera(cameraFolder, frameNum)\n    fname       = os.path.basename(labelPath).replace('classified', 'classified_ortho')\n    mapProjPath = os.path.join(orthoFolder, fname)\n\n    if not icebridge_common.isValidImage(labelPath):\n        print 'ERROR: Failed to generate label file: ' + labelPath\n        return\n\n    # Set map projection parameters\n    toolPath = 'mapproject'\n    isSouth  = (site == 'AN')\n    srs      = projString = icebridge_common.getEpsgCode(isSouth, asString=True)\n    demPath  = 'WGS84' # Map project on to a flat surface, elevation zero.\n    #demPath  = os.path.join(refDemFolder, icebridge_common.getReferenceDemName(site)) # The NSIDC ortho DEM\n\n    # Mapproject\n    cmd = ('time %s %s %s %s %s -t nadirpinhole --t_srs %s --threads %d --num-processes 1 --ot Byte --nearest-neighbor' %\n           (toolPath, demPath, labelPath, cameraPath, mapProjPath, srs, numThreads))\n    print cmd\n    if icebridge_common.isValidImage(mapProjPath):\n        print 'Skipping existing file: ' + mapProjPath\n    else:\n        os.system(cmd)  \n\n    if not os.path.exists(mapProjPath):\n        print 'ERROR: Failed to generate map projected label file: ' + mapProjPath\n        return\n\ndef main(argsIn):\n\n    try:\n        usage = '''label_images.py <options>'''\n\n        parser = argparse.ArgumentParser(usage=usage)\n\n        parser.add_argument(\"--yyyymmdd\",  dest=\"yyyymmdd\", required=True,\n                          help=\"Specify the year, month, and day in one YYYYMMDD string.\")\n        parser.add_argument(\"--site\",  dest=\"site\", required=True,\n                          help=\"Name of the location of the images (AN, GR, or AL)\")\n\n        parser.add_argument(\"--output-folder\",  dest=\"outputFolder\", default=None,\n                          help=\"Name of the output folder. If not specified, \" + \\\n                          \"use something like AN_YYYYMMDD.\")\n\n        parser.add_argument('--start-frame', dest='startFrame', type=int,\n                          default=icebridge_common.getSmallestFrame(),\n                          help=\"Frame to start with.  Leave this and stop-frame blank to \" + \\\n                          \"process all frames.\")\n        parser.add_argument('--stop-frame', dest='stopFrame', type=int,\n                          default=icebridge_common.getLargestFrame(),\n                          help='Frame to stop on. This frame will also be processed.')\n\n        parser.add_argument(\"--training\",  dest=\"trainingPath\", required=True,\n                          help=\"Path to the training file.\")\n\n        parser.add_argument('--num-processes', dest='numProcesses', default=8,\n                          type=int, help='The number of simultaneous processes to run.')\n        parser.add_argument('--num-threads', dest='numThreads', default=1,\n                          type=int, help='Used for mapproject.')\n\n        options = parser.parse_args(argsIn)\n\n    except argparse.ArgumentError as msg:\n        parser.error(msg)\n\n    if not os.path.exists(options.trainingPath):\n        print 'Error: Input training file ' + options.trainingPath + ' does not exist!'\n        return -1\n\n    # TODO: Everything should use the RunHelper class for this!\n    if options.outputFolder is None:\n        options.outputFolder = icebridge_common.outputFolder(options.site, options.yyyymmdd)\n\n\n    # Set up a processing tool to handle the frames, this will be more efficient\n    #  than using the built-in mulithreading support.\n    pool = multiprocessing.Pool(options.numProcesses)\n    taskHandles = []\n\n    for i in range(options.startFrame, options.stopFrame+1):\n\n        # Run on a single frame with one thread.\n        #label_images(options.outputFolder, i, options.trainingPath, options.site, options.yyyymmdd,  options.numThreads)\n        taskHandles.append(pool.apply_async(label_images, (options.outputFolder, \n                                                           i, options.trainingPath, options.site,\n                                                           options.yyyymmdd, options.numThreads)))\n\n    # Wait for all the tasks to complete\n    print('Finished adding ' + str(len(taskHandles)) + ' tasks to the pool.')\n    icebridge_common.waitForTaskCompletionOrKeypress(taskHandles, interactive=False)\n\n    # All tasks should be finished, clean up the processing pool\n    icebridge_common.stopTaskPool(pool)\n    print('Jobs finished.')\n\n\n# Run main function if file used from shell\nif __name__ == \"__main__\":\n    sys.exit(main(sys.argv[1:]))\n\n\n"
  },
  {
    "path": "src/asp/IceBridge/lvis2kml.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\nimport sys, os, optparse, sys, string, simplekml\n\n'''\nConvert an LVIS lidar data or XML file into a Google Earth compatible KML format.\nThe raw data produces points, the XML files produce bounding regions.\n'''\n\ndef readPositions(positionFilePath):\n    '''Read in the LVIS data'''\n\n    if not os.path.exists(positionFilePath):\n        raise Exception('File ' + positionFilePath + ' is missing!')\n\n    # Is this a border file or a raw data file?\n    isBorderFile = ('.xml' in positionFilePath)\n    \n    isLvisFile = ('.TXT' in positionFilePath)\n    \n    f = open(positionFilePath, 'r')\n    \n    pointList = []\n    lon = 0 # Only used for border files\n    for line in f:\n\n        if isBorderFile:\n            if not (('PointLongitude' in line) or ('PointLatitude' in line)):\n                continue\n            \n            # Find the number\n            start = line.find('>')+1\n            stop  = line.rfind('<')\n            num   = float(line[start:stop])\n            \n            # Record pairs with no elevation\n            if 'PointLongitude' in line:\n                lon = num\n            if 'PointLatitude' in line:\n                thisPoint = (lon, num)\n                pointList.append(thisPoint)\n\n        else: # Lidar point files (possibly converted to CSV by another tool)\n                \n            if '#' in line: # Skip lines containing the comment symbol\n                continue\n          \n            strings = line.replace(',','').split()\n            \n            # Record lot/lat/alt triples\n            if isLvisFile:\n                if len(strings) < 6:\n                    continue\n                lon    = float(strings[3])\n                lat    = float(strings[4])\n                height = float(strings[5])\n            else: # ATM lidar\n                if len(strings) < 3:\n                    continue\n                lon    = float(strings[1])\n                lat    = float(strings[0])\n                height = float(strings[2])                \n            thisPoint = (lon, lat, height)\n            pointList.append(thisPoint)\n        \n    f.close()\n    return pointList\n\n\ndef generatePointKml(pointList, outputPath, pointSkip, name, color):\n    \"\"\"Generates a KML plot for the input points\"\"\"\n        \n    # Initialize kml document\n    kml = simplekml.Kml()\n    kml.document.name = name\n    kml.hint = 'target=earth'\n    \n    ALT = 2\n    \n    # Compute the min and max point values\n    minHeight = pointList[0][ALT]\n    maxHeight = minHeight\n    for p in pointList:\n        if p[ALT] < minHeight:\n            minHeight = p[ALT]\n        if p[ALT] > maxHeight:\n            maxHeight = p[ALT]\n    heightRange = maxHeight - minHeight\n    \n    # Plot each point\n    counter = 0\n    for i in range (0, len(pointList), int(pointSkip)):\n    \n        (lon, lat, height) = pointList[i]\n        point = kml.newpoint(name=str(counter), coords=[(lon, lat, height)],\n                              altitudemode= simplekml.AltitudeMode.relativetoground)\n\n        point.extrude = 0\n        counter       = counter + 1\n        \n        point.style.labelstyle.scale    = 0\n        point.style.iconstyle.scale     = 0.6\n        point.style.iconstyle.icon.href = 'http://maps.google.com/mapfiles/kml/shapes/open-diamond.png'\n        \n        # Generate a color based on the error value:  white (low error) <--> red (high error)\n        thisHeight = pointList[i][ALT]\n        colorVal = int(255.0 - 255.0*(thisHeight - minHeight)/heightRange)\n        if (colorVal < 0):\n            colorVal = 0\n        if color == 'blue':\n            point.style.iconstyle.color   = simplekml.Color.rgb(colorVal,colorVal,255,255)\n        elif color == 'green':\n            point.style.iconstyle.color   = simplekml.Color.rgb(colorVal,255,colorVal,255)\n        else: # red\n            point.style.iconstyle.color   = simplekml.Color.rgb(255,colorVal,colorVal,255)\n    \n    \n    # Save kml document\n    kml.save(outputPath)\n    return counter\n    \n\ndef generateBorderKml(pointList, outputPath, name, color):\n    \"\"\"Generates a KML plot of a point border\"\"\"\n    \n    # Initialize kml document\n    kml = simplekml.Kml()\n    kml.document.name = name\n    kml.hint = 'target=earth'\n\n    # Make a polygon with the provided borders    \n    poly = kml.newpolygon()\n    poly.outerboundaryis.coords = pointList\n    poly.outerboundaryis.coords = pointList\n    \n    # Set style\n    if color == 'blue':\n        poly.style.linestyle.color = simplekml.Color.blue\n    elif color == 'green':\n        poly.style.linestyle.color = simplekml.Color.green\n    else: # red\n        poly.style.linestyle.color = simplekml.Color.red\n\n    # Save kml document\n    kml.save(outputPath)\n    return len(pointList)\n\n\n#--------------------------------------------------------------------------------------------\n    \ndef main(argsIn):\n    \n    try:\n        usage = \"usage: lvis2kml [options] <inputPath> [outputPath]\\n\" \n        parser = optparse.OptionParser(usage=usage)\n        parser.set_defaults(skip=1)\n        parser.set_defaults(name=None)\n        parser.set_defaults(color='red')\n        parser.add_option(\"--skip\",  dest=\"skip\",  help=\"Plot only every N'th point (default 1)\")\n        parser.add_option(\"--name\",  dest=\"name\",  help=\"KML name\")\n        parser.add_option(\"--color\", dest=\"color\", help=\"Draw in red, blue, or green\")\n        (options, args) = parser.parse_args(argsIn)\n\n    except optparse.OptionError as msg:\n        raise Exception(msg)\n\n    if len(args) < 1:\n        print('Missing required input path.')\n        print(usage)\n        return -1\n\n    # If output path is not specified, just append .kml to the input path.\n    inputPath = args[0]\n    if len(args) > 1:\n        outputPath = args[1]\n    else:\n        outputPath = inputPath + '.kml'\n        \n    if not options.name:\n        options.name = os.path.basename(inputPath)\n        \n    print(\"Beginning processing.\")\n\n    pointList = readPositions(inputPath)\n    print('Loaded ' + str(len(pointList)) +' points.')\n    \n    if '.xml' in inputPath: # Plot a border polygon\n        generateBorderKml(pointList, outputPath, options.name, options.color)\n    else: # Plot individual points\n        generatePointKml(pointList, outputPath, options.skip, options.name, options.color)\n\n    print(\"Finished.\")\n    return 0\n\nif __name__ == \"__main__\":\n    sys.exit(main(sys.argv[1:]))\n\n    \n"
  },
  {
    "path": "src/asp/IceBridge/merge_orbitviz.py",
    "content": "#!/usr/bin/env python\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n# Merge multiple output files from orbitviz\n\nimport os, sys, optparse, datetime, time, subprocess, logging, multiprocessing, re, shutil, time\nimport os.path as P\n\n# The path to the ASP python files and tools\nbasepath      = os.path.dirname(os.path.realpath(__file__))  # won't change, unlike syspath\npythonpath    = os.path.abspath(basepath + '/../Python')     # for dev ASP\nlibexecpath   = os.path.abspath(basepath + '/../libexec')    # for packaged ASP\nbinpath       = os.path.abspath(basepath + '/../bin')        # for packaged ASP\ntoolspath     = os.path.abspath(basepath + '/../Tools')      # ASP Tools\n\n# Prepend to Python path\nsys.path.insert(0, basepath)\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\n\n\n# Prepend to system PATH\nos.environ[\"PATH\"] = basepath       + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = pythonpath     + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = libexecpath    + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = toolspath      + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = binpath        + os.pathsep + os.environ[\"PATH\"]\n\n\ndef main(args):\n\n    # Parse input arguments\n    \n    if len(args) == 2:\n        # If only one input file was provided, just copy it to the output file.\n        shutil.copyfile(args[1], args[0])\n        return 0\n    \n    if len(args) < 3:\n        print 'usage: merge_orbitviz.py <output_file> <input_file_1> <input_file_2> ...'\n        return -1\n\n    outputPath = os.path.abspath(args[0])\n    if args[1] == '-list':\n        # Read from list, this is beneficial if the files are too many\n        inputPaths = []\n        with open(args[2], 'r') as inputFile:\n            for line in inputFile:\n                line = line.strip()\n                inputPaths.append(line)\n    else:\n        inputPaths = [os.path.abspath(x) for x in args[1:]]\n\n    if not inputPaths:\n        print 'Error: No input files detected!'\n        return -1\n\n    # Open the output file\n    with open(outputPath, 'w') as outputFile:\n        # Copy most of the input file, stopping at the document close tags\n        with open(inputPaths[0], 'r') as inputFile:\n            for line in inputFile:\n                if '</Document>' in line:\n                    break\n                outputFile.write(line+'\\n')\n                \n        # Copy only the camera positions from the other files\n        for inputPath in inputPaths[1:]:\n            copying = False\n            with open(inputPath, 'r') as inputFile:\n                for line in inputFile:\n                    if '<Placemark>' in line: # Start copying these lines\n                        copying = True\n                    if copying:\n                        outputFile.write(line+'\\n')\n                    if '</Placemark>' in line: # Stop copying these lines\n                        copying = False\n        \n        # Close off the output file\n        outputFile.write('</Document>\\n</kml>')\n\n    print 'Finished writing ' + outputPath\n\n# Run main function if file used from shell\nif __name__ == \"__main__\":\n    sys.exit(main(sys.argv[1:]))\n\n\n"
  },
  {
    "path": "src/asp/IceBridge/multi_flight_label_runner.py",
    "content": "#!/usr/bin/env python\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n# Program to generate labels for multiple flights, one after the other.\n\nimport os, sys, argparse, datetime, time, subprocess, logging, multiprocessing\nimport re, shutil, glob\n\nimport os.path as P\n\n# The path to the ASP python files and tools\nbasepath      = os.path.dirname(os.path.realpath(__file__)) # won't change, unlike syspath\npythonpath    = os.path.abspath(basepath + '/../Python')     # for dev ASP\nlibexecpath   = os.path.abspath(basepath + '/../libexec')    # for packaged ASP\nicebridgepath = os.path.abspath(basepath + '/../IceBridge')  # IceBridge tools\n\n# Prepend to Python path\nsys.path.insert(0, basepath)\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\nsys.path.insert(0, icebridgepath)\n\nimport icebridge_common, run_helper\n\nasp_system_utils.verify_python_version_is_supported()\n\n# Prepend to system PATH\nos.environ[\"PATH\"] = basepath       + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = pythonpath     + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = libexecpath    + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = icebridgepath  + os.pathsep + os.environ[\"PATH\"]\n\n#=========================================================================\n# Functions\n\n\ndef updateLogFile(path, run):\n    '''Add an run to the log file if it is not already there'''\n    if checkLogFile(date):\n        return\n\n    with open(path, 'a') as f:\n        f.write(run.name() + '\\n')\n\ndef checkLogFile(path, run):\n    '''Return true if the date is in the file'''\n    run_name = run.name()\n    with open(path, 'r') as f:\n        for line in f:\n            if run_name in line:\n              return True\n    return False\n\n\n#=========================================================================\n# Main\n\ndef main(argsIn):\n\n    # Parse the input arguments\n    if len(argsIn) < 2:\n        print 'Usage: multi_flight_runner <input_flight_list> <finished_flight_list>'\n        return 0\n\n    inputFlightLog  = argsIn[0]\n    outputFlightLog = argsIn[1]\n\n    # Stop processing early if we build up too many flights!\n    MAX_RUNS_RETAINED = 3\n\n    runsRetained = []\n    runsDeleted  = []\n    with open(inputFlightLog, 'r') as inLog:\n\n        for line in inLog:\n\n            # Make run object and check if we already did this run\n            parts = line.split('_')\n            run   = RunHelper(parts[0], parts[1])\n\n            if checkLogFile(outputFlightLog, run):\n                print 'Skipping already completed run: ' + str(run)\n                continue\n\n            print 'Going to process run: ' + str(run)\n\n            runFolder = os.path.join('/nobackup/smcmich1/icebridge/', str(run))\n\n            # Set up the processing command\n            # - This will generate all the labels for the current flight and then wipe everything\n            #   if all of the label files were generated.\n\n            TOOL_PATH = 'python ~/repo/StereoPipeline/src/asp/IceBridge/pleiades_manager.py'\n\n            cmd = TOOL_PATH + '  --base-dir  /nobackup/smcmich1/icebridge/ --node-type san --camera-calibration-folder /nobackup/smcmich1/icebridge/calib_files/ --reference-dem-folder /nobackup/smcmich1/icebridge/reference_dems/ --bundle-length 2 --simple-cameras --skip-archive-cameras  --skip-archive-aligned-cameras  --skip-archive-orthos  --skip-archive-summary  --skip-archive-run --skip-ortho-gen --skip-check-outputs --skip-report  --skip-process --skip-blend --skip-convert  --skip-validate --generate-labels   --archive-labels --wipe-all'\n\n            cmd += ' --site ' + run.site + ' --yyyymmdd ' + run.yyyymmdd\n\n            print cmd\n            os.system(cmd)\n\n            # Whether or not we succeeded, log that we processed the flight.\n            updateLogFile(outputFlightLog, run)\n\n            if not os.path.exists(runFolder):\n                print 'Run successful, deleted!'\n                runsDeleted.append(run.name())\n            else:\n                print 'Run failed, retained!''\n                runsRetained.append(run.name())\n\n            if len(runsRetained) >= MAX_RUNS_RETAINED:\n                print 'Too many flights failed, quitting now!' \n                break\n\n\n    numRuns = len(runsRetained) + len(runsDeleted)\n    print '---=== Finished processing ' + str(numRuns) + ' flights! ===---'\n\n\n    # Send an email with a record of the runs we processed\n\n    emailAddress = getEmailAddress(icebridge_common.getUser())\n    print(\"Sending email to: \" + emailAddress)\n    subject = 'Finished running batch flight labelling script!'\n    body    = '\\nThe following runs were retained (some files missing):'\n    for r in runsRetained:\n        body += r + '\\n'\n    body    = '\\nThe following runs were deleted (all files created):'\n    for r in runsDeleted:\n        body += r + '\\n'\n\n    sendEmail(emailAddress, subject, body)\n\n\n\n\n\n# Run main function if file used from shell\nif __name__ == \"__main__\":\nsys.exit(main(sys.argv[1:]))\n\n\n\n"
  },
  {
    "path": "src/asp/IceBridge/multi_process_command_runner.py",
    "content": "#!/usr/bin/env python\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\nimport os, sys, argparse, multiprocessing\n\n# The path to the ASP python files\nbasepath    = os.path.abspath(sys.path[0])\npythonpath  = os.path.abspath(basepath + '/../Python')  # for dev ASP\nlibexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP\nicebridgepath = os.path.abspath(basepath + '/../IceBridge')  # IceBridge tools\ntoolspath = os.path.abspath(basepath + '/../Tools')  # ASP Tools\nsys.path.insert(0, basepath) # prepend to Python path\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\nsys.path.insert(0, icebridgepath)\nsys.path.insert(0, libexecpath)\nsys.path.insert(0, toolspath)\n\nimport icebridge_common\nimport asp_system_utils, asp_alg_utils, asp_geo_utils\nasp_system_utils.verify_python_version_is_supported()\n\n# Prepend to system PATH\nos.environ[\"PATH\"] = libexecpath + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = toolspath   + os.pathsep + os.environ[\"PATH\"]\n\n'''Simple tool to run commands in parallel from an input file.\n   First argument is the input file containing the commands to run.\n   Second argument is the number of parallel processes to use.\n   Third argument (optional) is the starting line.\n   Fourth argument (optional) is the stopping line (not processed).'''\n\ndef runCommand(command):\n    '''Run one of the commands from the file'''\n    print(command)\n    os.system(command)  \n\ndef main(argsIn):\n\n    try:\n        usage = '''usage: multi_process_command_runner.py ...'''\n                      \n        parser = argparse.ArgumentParser(usage=usage)\n\n        # Data selection options\n        parser.add_argument('--start-frame', dest='startFrame', type=int,\n                            default=icebridge_common.getSmallestFrame(),\n                            help=\"Frame to start with.  Leave this and stop-frame blank to \" + \\\n                            \"process all frames.  Set both to -1 to blindly run all commands.\")\n        \n        parser.add_argument('--stop-frame', dest='stopFrame', type=int,\n                            default=icebridge_common.getLargestFrame(),\n                            help='Frame to stop on. This last one will not be processed.')\n\n        parser.add_argument('--num-processes', dest='numProcesses', type=int,\n                            default=-1,\n                            help='How many processes to start at the same time.')\n\n        parser.add_argument(\"--command-file-path\",  dest=\"commandFilePath\", default=None,\n                          help=\"The file from where to read the commands to process.\")\n        \n        parser.add_argument(\"--force-redo-these-frames\",  dest=\"redoFrameList\", default=\"\",\n                          help=\"For each frame in this file (stored one per line) within the current frame range, delete the batch folder and redo the batch.\")\n\n        options = parser.parse_args(argsIn)\n        \n    except argparse.ArgumentError as msg:\n        parser.error(msg)\n\n    icebridge_common.switchWorkDir()\n    \n    os.system(\"ulimit -c 0\") # disable core dumps\n    os.system(\"umask 022\")   # enforce files be readable by others\n    \n    if not os.path.exists(options.commandFilePath):\n        print('Error: File ' + options.commandFilePath + ' does not exist!')\n        return -1\n\n    # TODO: Write to a log?\n\n    print('Starting processing pool with ' + str(options.numProcesses) +' processes.')\n    pool = multiprocessing.Pool(options.numProcesses)\n    taskHandles = []\n\n    framesToDo = set()\n    if options.redoFrameList != \"\" and os.path.exists(options.redoFrameList):\n        with open(options.redoFrameList, 'r') as f:\n            text = f.read()\n        for line in text.split('\\n'):\n            line = line.strip()\n            if line == \"\":\n                continue\n            framesToDo.add(int(line))\n\n    # Open the file and loop through all the lines\n    # - Count the lines as we go so we only process the desired lines\n    print('Opening command file ' + options.commandFilePath)\n    text = ''\n    with open(options.commandFilePath, 'r') as f:\n        text = f.read()\n    \n    for line in text.split('\\n'):\n        \n        if line == \"\":\n            continue\n\n        # If the frame range is turned off, just run the commands as-is.\n        if (options.startFrame < 0 and options.stopFrame < 0):\n            # Add the command to the task pool\n            taskHandles.append(pool.apply_async(runCommand, (line,)))\n            continue\n        \n        (begFrame, endFrame) = icebridge_common.getFrameRangeFromBatchFolder(line)\n        \n        # Check line indices\n        if begFrame >= options.startFrame and begFrame < options.stopFrame:\n\n            if options.redoFrameList != \"\":\n                if begFrame in framesToDo:\n                    folderName = icebridge_common.getBatchFolderFromBatchLine(line)\n                    if os.path.exists(folderName):\n                        print(\"will wipe \" + folderName)\n                        cmd = \"rm -rf \" + folderName\n                        print(cmd)\n                        try:\n                            os.system(cmd)\n                        except Exception as e:\n                            pass\n                    else:\n                        print(\"Could not find \" + folderName)\n                else:\n                    print(\"Will skip frame: \" + str(begFrame))\n                    continue\n\n            # Add the command to the task pool\n            taskHandles.append(pool.apply_async(runCommand, (line,)))\n\n    # Wait for all the tasks to complete\n    print('Finished adding ' + str(len(taskHandles)) + ' tasks to the pool.')\n    icebridge_common.waitForTaskCompletionOrKeypress(taskHandles, interactive=False)\n\n    # All tasks should be finished, clean up the processing pool\n    icebridge_common.stopTaskPool(pool)\n    print('Jobs finished.')\n\n# Run main function if called from shell\nif __name__ == \"__main__\":\n    sys.exit(main(sys.argv[1:]))\n"
  },
  {
    "path": "src/asp/IceBridge/nav2cam.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n/// \\file nav2cam.cc\n///\n\n// Start with an IceBridge nav file, from https://nsidc.org/data/IPAPP1B/versions/1,\n// for example, sbet_20111012.out. See the User Guide there for more info.\n\n// Convert the nav file to text using the Perl reader\n// from http://nsidc.org/data/docs/daac/icebridge/ipapp1b/index.html\n// The obtained text file, with a name like sbet_20111012.txt, will have\n// the format:\n//\n// GPS seconds since start of the week, latitude (degrees), longitude  (degrees),\n// Altitude (meters, above WGS84), x velocity, y velocity, z velocity,\n// roll (radians), pitch (radians), heading (radians), etc. These\n// are relative to the camera center, with the camera looking down.\n// \n// In addition to that nav file in text format, take an input a raw\n// image, for example, 2011_10_12_09765.JPG, the corresponding L1B\n// orthoimage_path, DMS_1281706_09765_20111012_18060740.tif.  in the format\n// DMS_fffffff_FFFFF_YYYYMMDD_HHmmsshh.tif, where hh is hundreds of a\n// second, and the time is GPS time (not UTC!).\n//\n// Convert this time stamp into GPS seconds, and look-up and\n// interpolate the camera position/orientation in the sbet nav\n// file. Combine with the camera intrinsics tsai file passed on input,\n// and write down the camera intrinsics + extrinsics tsai file.\n\n#include <asp/Core/Macros.h>\n#include <asp/Core/AspProgramOptions.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/PointUtils.h>\n\n#include <vw/Math/Vector.h>\n#include <vw/Math/Matrix.h>\n#include <vw/Camera/PinholeModel.h>\n#include <vw/Math/PositionInterp.h>\n\n#include <ctime>\n#include <stdlib.h>\n\n// Turn off warnings from eigen\n#if defined(__GNUC__) || defined(__GNUG__)\n#define LOCAL_GCC_VERSION (__GNUC__ * 10000                    \\\n                           + __GNUC_MINOR__ * 100              \\\n                           + __GNUC_PATCHLEVEL__)\n#if LOCAL_GCC_VERSION >= 40600\n#pragma GCC diagnostic push\n#endif\n#if LOCAL_GCC_VERSION >= 40202\n#pragma GCC diagnostic ignored \"-Wunused-local-typedefs\"\n#endif\n#endif\n\n#if defined(__GNUC__) || defined(__GNUG__)\n#if LOCAL_GCC_VERSION >= 40600\n#pragma GCC diagnostic pop\n#endif\n#undef LOCAL_GCC_VERSION\n#endif\n\n\nnamespace po = boost::program_options;\nnamespace fs = boost::filesystem;\n\nusing namespace vw;\nusing namespace vw::camera;\nusing namespace vw::cartography;\nusing namespace vw::math;\n\n// From DMS_1281706_09765_20111012_18060740.tif\n// extract the date 2011/10/12 and time 18:06:07.40.\n// Then find how many seconds elapsed since the beginning of the week.\ndouble gps_seconds(std::string const& orthoimage_path){\n\n  std::string label = \"DMS\";\n  std::size_t it = orthoimage_path.find(label);\n  if (it == std::string::npos) \n    vw_throw( ArgumentErr() << \"Could not find the text \" << label << \" in \" << orthoimage_path << \"\\n\" );\n\n  it += 18;\n\n  std::string date = orthoimage_path.substr(it, 8);\n  std::string time = orthoimage_path.substr(it+9, 8);\n\n  std::string year_str = date.substr(0, 4);\n  std::string month_str = date.substr(4, 2);\n  std::string day_str = date.substr(6, 2);\n  int year  = atoi(year_str.c_str());\n  int month = atoi(month_str.c_str());\n  int day   = atoi(day_str.c_str());\n\n  std::string hour_str = time.substr(0, 2);\n  std::string min_str = time.substr(2, 2);\n  std::string sec_str = time.substr(4, 2);\n  std::string fsec_str = time.substr(6, 2);\n  int hour  = atoi(hour_str.c_str());\n  int min   = atoi(min_str.c_str());\n  int sec   = atoi(sec_str.c_str());\n  int fsec  = atoi(fsec_str.c_str()); // first two digit of fractional part of second\n\n  std::tm time_in = {sec, min, hour, // second, minute, hour\n                     day,            // 1-based day\n                     month-1,        // 0-based month\n                     year - 1900};     // year since 1900\n\n  std::time_t time_val = std::mktime( & time_in );\n\n  // the return value from localtime is a static global - do not call\n  // this function from more than one thread!\n  std::tm const *time_out = std::localtime(&time_val);\n\n  uint64 weekday = time_out->tm_wday; // Sunday is 0\n  uint64 all_seconds = weekday*24*3600 + (uint64)hour*3600 + (uint64)min*60 + (uint64)sec;\n  double final_time  = static_cast<double>(all_seconds) + static_cast<double>(fsec)/100.0;\n\n  return final_time; \n}\n\n/// Extract the parameters from a line of the nav file\nvoid scan_line(std::string const& line,\n               double& seconds, double& lat, double& lon, double& alt,\n               double& roll, double& pitch, double& heading){\n  double xv, yv, zv;\n  if (sscanf(line.c_str(), \"%lf %lf %lf %lf %lf %lf %lf %lf %lf %lf\",\n             &seconds, &lat, &lon, &alt, &xv, &yv, &zv, &roll, &pitch, &heading) != 10) \n    vw_throw( ArgumentErr() << \"Could not scan 10 values from line: \" << line << \"\\n\" );\n}\n\n/// Rotate about X (forward)\nMatrix3x3 get_rotation_matrix_roll(double roll) {\n  Matrix3x3 M;\n  M(0,0) = 1.0;         M(0,1) = 0.0;           M(0,2) = 0.0;\n  M(1,0) = 0.0;         M(1,1) = cos(roll);     M(1,2) = -sin(roll);\n  M(2,0) = 0.0;         M(2,1) = sin(roll);     M(2,2) = cos(roll); \n  return M;\n}\n/// Rotate about Y (right)\nMatrix3x3 get_rotation_matrix_pitch(double pitch) {\n  Matrix3x3 M;\n  M(0,0) = cos(pitch);  M(0,1) = 0.0;           M(0,2) = sin(pitch);\n  M(1,0) = 0.0;         M(1,1) = 1.0;           M(1,2) = 0.0;\n  M(2,0) = -sin(pitch); M(2,1) = 0.0;           M(2,2) = cos(pitch);\n  return M;\n}\n/// Rotate about Z (down)\nMatrix3x3 get_rotation_matrix_yaw(double yaw) {\n  Matrix3x3 M;\n  M(0,0) = cos(yaw);    M(0,1) = -sin(yaw);     M(0,2) = 0.0;\n  M(1,0) = sin(yaw);    M(1,1) = cos(yaw);      M(1,2) = 0.0;\n  M(2,0) = 0.0;         M(2,1) = 0.0;           M(2,2) = 1.0; \n  return M;\n}\n\n// TODO: It is not clear what the right order should be! \nMatrix3x3 get_look_rotation_matrix(double yaw, double pitch, double roll, int rot_order) {\n\n  // These calculations are copied from the SPOT 123-4-58 Geometry Handbook (GAEL-P135-DOC-001)\n  Matrix3x3 Mp = get_rotation_matrix_pitch(pitch);\n  Matrix3x3 Mr = get_rotation_matrix_roll (roll );\n  Matrix3x3 My = get_rotation_matrix_yaw  (yaw  ); \n\n  if (rot_order == 1) return Mp*Mr*My;\n  if (rot_order == 2) return Mp*My*Mr;\n  if (rot_order == 3) return My*Mp*Mr;\n  if (rot_order == 4) return My*Mr*Mp;\n  if (rot_order == 5) return Mr*Mp*My;\n  if (rot_order == 6) return Mr*My*Mp;\n  \n  Matrix3x3 out = Mp*Mr*My;\n  return out;\n  \n}\n\n/// Generate the pose and position from nav information\nvoid parse_camera_pose(std::string const& line, Vector3 & xyz, Quat & look, Quat & ned,\n                       double& lon, double& lat, double& alt,\n                       double &roll, double &pitch, double &heading,\n                       int rot_order){\n\n  // Parse the line of text\n  double seconds;\n  scan_line(line, seconds, lat, lon, alt, roll, pitch, heading);\n  \n  // Get cartesian coordinates - this is easy.\n  Datum datum_wgs84(\"WGS84\");\n  xyz = datum_wgs84.geodetic_to_cartesian(Vector3(lon, lat, alt));\n\n  // Generate the NED frame at this location.\n  // - This is relative to the GCC coordinate frame.\n  ned = Quat(datum_wgs84.lonlat_to_ned_matrix(Vector3(lon, lat, alt)));\n\n  // Get the local rotation matrix at this coordinate.\n  look = Quat(get_look_rotation_matrix(-heading, -pitch, -roll, rot_order));\n}\n            \nstruct Options : public vw::GdalWriteOptions {\n  std::string nav_file, input_cam, output_folder;\n  std::vector<std::string> image_files, camera_files;\n  bool detect_offset;\n  int  camera_mounting;\n  double time_offset;\n};\n\nvoid handle_arguments( int argc, char *argv[], Options& opt ) {\n  std::string cam_list_path;\n  po::options_description general_options(\"\");\n  general_options.add_options()\n    (\"input-cam\",      po::value(&opt.input_cam)->default_value(\"\"), \n                       \"The input camera file from where to read the intrinsics.\")\n    (\"nav-file\",       po::value(&opt.nav_file)->default_value(\"\"), \"The nav file, in text format.\")\n    (\"time-offset\",    po::value(&opt.time_offset)->default_value(0.0),\n                       \"Time offset to be added to the navigation file timestamps.\")\n    (\"output-folder\",  po::value(&opt.output_folder)->default_value(\"\"), \n                       \"Output folder where the camera files are written.\")\n    // TODO: Remove secret option to pass in negative values to change how rotations are applied!\n    (\"camera-mounting\"  ,  po::value(&opt.camera_mounting)->default_value(0),\n        \"0 = right-forwards, 1=left-forwards, 2=top-forwards, 3=bottom-forwards.\")\n    (\"detect-offset\",  po::bool_switch(&opt.detect_offset)->default_value(false)->implicit_value(true),\n        \"Instead of generating camera files, estimate time offset to the provided camera files.\")\n    (\"cam-list\",       po::value(&cam_list_path)->default_value(\"\"), \n                       \"A sorted list of input ortho and camera files.\");\n  \n  general_options.add( vw::GdalWriteOptionsDescription(opt) );\n  \n  po::options_description positional(\"\");\n  \n  po::positional_options_description positional_desc;\n  \n  std::string usage(\"[options]\");\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line(argc, argv, opt, general_options, general_options,\n                            positional, positional_desc, usage,\n                            allow_unregistered, unregistered);\n\n  // Check mandatory inputs  \n  if ( opt.nav_file.empty() )\n    vw_throw( ArgumentErr() << \"Missing input nav file.\\n\" << usage << general_options );\n\n  if ( opt.input_cam.empty() )\n    vw_throw( ArgumentErr() << \"Missing input pinhole camera.\\n\" << usage << general_options );\n\n  if ( cam_list_path.empty() )\n    vw_throw( ArgumentErr() << \"Missing input file list file.\\n\" << usage << general_options );\n\n  if ( !cam_list_path.empty() ) {\n    // Load all the names from the camera list file into opt.image_files\n    vw_out() << \"Reading input files from \" << cam_list_path << \"...\\n\";\n    std::ifstream input_stream(cam_list_path.c_str());\n    std::string line;\n    while (getline(input_stream, line)){ // Loop through lines in the file\n      // The line should be in the form \"orthoFile, cameraFile\"\n      size_t comma       = line.find(\",\");\n      std::string ortho  = line.substr(0, comma);\n      std::string camera = line.substr(comma+2);\n      boost::trim(ortho);\n      boost::trim(camera);\n      opt.image_files.push_back(ortho);\n      opt.camera_files.push_back(camera);\n    }\n    input_stream.close();\n    vw_out() << \"Read \" << opt.image_files.size() << \" files from \" << cam_list_path << std::endl;\n  }\n\n\n\n}\n\n\n\n/**\n  Class which loads an Icebridge nav file in chunks and provides an interpolator\n   for each chunk.\n*/\nclass ScrollingNavInterpolator {\npublic:\n\n  // TODO: Is the rotation interpolation method ok?  It is the only\n  //       method implemented in VW with sparse time values!\n  typedef vw::LagrangianInterpolationVarTime PosInterpType;\n  typedef vw::LagrangianInterpolationVarTime RotInterpType;\n\n  // Open the file\n  ScrollingNavInterpolator(std::string const& path, Datum const& datum_in)\n    : m_datum(datum_in) {\n    m_input_stream.open(path.c_str());\n    \n    // Load the nav file in chunks of this size\n    const size_t INTERPOLATE_CHUNK_LENGTH  = 10000;\n    const size_t INTERPOLATE_CHUNK_OVERLAP = 1000; // Overlap between chunks\n    m_chunk_length  = INTERPOLATE_CHUNK_LENGTH;\n    m_chunk_overlap = INTERPOLATE_CHUNK_OVERLAP;\n    \n    // Init vectors to a fixed size\n    m_time_vector.resize(INTERPOLATE_CHUNK_LENGTH);\n    m_loc_vector.resize (INTERPOLATE_CHUNK_LENGTH);\n    m_rot_vector.resize (INTERPOLATE_CHUNK_LENGTH);\n    \n    m_first_chunk = true;\n  }\n  \n  ~ScrollingNavInterpolator() {\n    m_input_stream.close();\n  }\n\n  /// Set up the next interpolator\n  /// - Returns false if the end of the file was reached\n  bool load_next_chunk(boost::shared_ptr<PosInterpType> &pos_interpolator_ptr,\n                       boost::shared_ptr<PosInterpType> &rot_interpolator_ptr) {\n\n    if (m_input_stream.bad())\n      return false;\n  \n    size_t index = 0;\n    \n    if (!m_first_chunk) {\n      // Copy N values from the end of the vectors to the beginning\n      const size_t end_index = m_chunk_length - m_chunk_overlap;\n      for (index=0; index<m_chunk_overlap; ++index) {\n        m_time_vector[index] = m_time_vector[end_index+index];\n        m_loc_vector [index] = m_loc_vector [end_index+index];\n        m_rot_vector [index] = m_rot_vector [end_index+index];\n      }\n    }\n    else\n      m_first_chunk = false;\n    \n    // Populate rest of the vectors by reading from the file\n    double  time;\n    Vector3 loc, angles;\n    while (read_next_line(time, loc, angles)){\n      m_time_vector[index] = time;\n      m_loc_vector [index] = loc;\n      m_rot_vector [index] = angles;\n      ++index;\n      if (index == m_chunk_length)\n        break;\n    }\n    \n    // If we hit the end of the file just return false, hopefully no camera\n    //  data is right at the end of the file!\n    if (index < m_chunk_length)\n      return false;\n  \n    // Set up the interpolator\n    const int INTERP_RADIUS = 4;  \n    pos_interpolator_ptr = boost::shared_ptr<PosInterpType>(\n          new PosInterpType(m_loc_vector, m_time_vector, INTERP_RADIUS));\n    rot_interpolator_ptr = boost::shared_ptr<RotInterpType>(\n          new RotInterpType(m_rot_vector, m_time_vector, INTERP_RADIUS));\n              \n    return true;\n  }\n  \n  /// Return the time boundaries of the current interpolator\n  void get_time_boundaries(double &start, double &end) const {\n    start = m_time_vector.front();\n    end   = m_time_vector.back ();\n  }\n\n  /// Load a target location vector.\n  void set_target_locs(std::vector<Vector3> const& target_locs) {\n    m_target_loc_vector = target_locs;\n    m_target_distance_vector.resize(m_target_loc_vector.size());\n    m_target_time_vector.resize    (m_target_loc_vector.size());\n    for (size_t i=0; i<m_target_distance_vector.size(); ++i) {\n      m_target_distance_vector[i] = 999999999;\n      m_target_time_vector    [i] = -1;\n    }\n  }\n  /// Get target location vector closest times.\n  void get_target_times(std::vector<double> &target_time_vector,\n                        std::vector<double> &target_distance_vector) const {\n    target_time_vector     = m_target_time_vector;\n    target_distance_vector = m_target_distance_vector;\n  }\n\nprivate:\n\n  bool                 m_first_chunk;\n  const Datum          m_datum;\n  std::vector<double > m_time_vector;\n  std::vector<Vector3> m_loc_vector;\n  std::vector<Vector3> m_rot_vector;\n  size_t               m_chunk_length;\n  size_t               m_chunk_overlap;\n  std::ifstream        m_input_stream;\n  \n  /// Search for these locations in the entire file!\n  std::vector<Vector3> m_target_loc_vector;\n  std::vector<double > m_target_distance_vector;\n  std::vector<double > m_target_time_vector;\n\n\n  /// Read and parse the next line in the file\n  bool read_next_line(double &time, Vector3& loc, Vector3& rot) {\n    // Try to read the line\n    std::string line;\n    if (!getline(m_input_stream, line))\n      return false;\n\n    // Parse the line\n    double lat, lon, alt, roll, pitch, heading;\n    scan_line(line, time, lat, lon, alt, roll, pitch, heading);\n    Vector3 llh(lon, lat, alt);\n    loc = m_datum.geodetic_to_cartesian(llh);\n    rot[0] = roll;\n    rot[1] = pitch;\n    rot[2] = heading;\n    \n    // Compare this position to target locations if they exist.\n    if (!m_target_loc_vector.empty())\n      update_target_locs(loc, time);\n    \n    return true;\n  }\n  \n  /// Check if this location is the best match to any target locations.\n  void update_target_locs(Vector3 loc, double time) {\n    // For each target, record the time and distance if this is the best match.\n    for (size_t i=0; i<m_target_loc_vector.size(); ++i) {\n      double distance = norm_2(loc - m_target_loc_vector[i]);\n      if (distance < m_target_distance_vector[i]) {\n        m_target_distance_vector[i] = distance;\n        m_target_time_vector    [i] = time;\n      }\n    } // End loop through targets\n  }\n\n}; // End class ScrollingNavInterpolator\n\n\n/// Pretty-print a rotation matrix.\nvoid print_matrix(Matrix3x3 const& m) {\n  for (int r=0; r<3; ++r){\n    for (int c=0; c<3; ++c){\n      std::cout << m(r,c) << \" \";\n    }\n    std::cout << std::endl;\n  }\n}\n\n\n/// Helper function to write out the camera model once we have the position and pose.\n/// - This also adds the important row-direction flip from the camera to the image.\nvoid write_output_camera(Vector3 const& center, Matrix3x3 const& pose,\n                         std::string const& input_cam, \n                         std::string const& output_camera) {\n                         \n  // Load the reference pinhole model, update it, and write it out to disk.\n  PinholeModel camera_model(input_cam);\n  camera_model.set_camera_center(center);\n  camera_model.set_camera_pose(pose);\n  //vw_out() << \"Writing: \" << output_camera << std::endl;\n  \n  /*\n  TODO: The camera model does not handle this properly!!!\n  // The image is vertically flipped compared to the camera coordinate system\n  //  so negate the appropriate camera parameter here to account for that.\n  Vector3 u_vec, v_vec, w_vec;\n  camera_model.coordinate_frame(u_vec, v_vec, w_vec);\n  camera_model.set_coordinate_frame(u_vec, -1.0*v_vec, w_vec);\n  */\n  /*\n  Matrix3x3 pose_flip(pose); // As a workaround, negate the Y axis!\n  pose_flip(0,1) *= -1;\n  pose_flip(1,1) *= -1;\n  pose_flip(2,1) *= -1;\n  camera_model.set_camera_pose(pose_flip);\n  */\n  camera_model.write(output_camera);\n}\n\n// ================================================================================\n\nint main(int argc, char* argv[]) {\n\n  Options opt;\n  try {\n    handle_arguments(argc, argv, opt);\n\n    Datum datum_wgs84(\"WGS84\");\n\n    // Set the time zone for the program (used inside the gps_seconds function) to UTC\n    //  time so our time conversions work properly.\n    // TODO: Should this be always be the same?\n    const std::string TZ_UTC = \"TZ=UTC\";\n    vw_out() << \"Setting time zone: \" << TZ_UTC << std::endl;\n    char* temp = (char*)TZ_UTC.c_str();\n    putenv(temp);\n\n\n    // Print progress every N files\n    const size_t PRINT_INTERVAL = 200;\n  \n    const boost::filesystem::path output_dir(opt.output_folder);\n  \n    // Initialize the nav interpolator\n    std::cout << \"Opening input stream: \" << opt.nav_file << std::endl;\n    ScrollingNavInterpolator interpLoader(opt.nav_file, datum_wgs84);\n\n    // Load target camera positions if desired\n    std::vector<Vector3> target_locations;\n    std::vector<double > target_times;\n    if (opt.detect_offset) {\n      std::cout << \"Reading target locations...\\n\";\n      const size_t num_targets = opt.camera_files.size();\n      target_locations.reserve(num_targets);\n      target_times.reserve    (num_targets);\n      for (size_t i=0; i<num_targets; ++i) {\n        try {\n          boost::filesystem::path camera_file(opt.camera_files[i]);\n          boost::filesystem::path camera_path = output_dir / camera_file;\n          PinholeModel model(camera_path.string());\n          target_locations.push_back(model.camera_center());\n          target_times.push_back    (gps_seconds(opt.image_files[i]));\n        } catch(...) {\n        } // Just skip cameras that we can't read in.\n      }\n      interpLoader.set_target_locs(target_locations);\n      std::cout << \"Done loading \" << target_locations.size() << \" target locations.\\n\";\n    } // End target loading condition\n\n    boost::shared_ptr<ScrollingNavInterpolator::PosInterpType> pos_interpolator_ptr;\n    boost::shared_ptr<ScrollingNavInterpolator::RotInterpType> rot_interpolator_ptr;\n    double start, end;\n  \n    const double POSE_TIME_DELTA     = 0.1; // Look this far ahead/behind to determine direction\n    const double CHUNK_TIME_BOUNDARY = 1.0; // Require this much interpolation time\n    size_t file_index = 0;\n    const size_t num_files = opt.image_files.size();\n\n    // Keep loading chunks until the nav data catches up with the images\n    double ortho_time=0;\n    while (interpLoader.load_next_chunk(pos_interpolator_ptr, rot_interpolator_ptr)) {\n\n      // Get the time boundaries of the current chunk\n      interpLoader.get_time_boundaries(start, end);  \n\n      // When detecting offsets all we want to do is loop through the nav file.\n      if (opt.detect_offset)\n        continue;\n\n      // Loop through ortho files until we need to advance the nav chunk\n      while (file_index < num_files) {\n\n        // Get the next input and output paths\n        std::string             orthoimage_path = opt.image_files [file_index];\n        boost::filesystem::path camera_file(opt.camera_files[file_index]);\n        boost::filesystem::path output_camera_path = output_dir / camera_file;\n      \n        // Get time for this frame\n        if (ortho_time == 0) {\n          ortho_time = gps_seconds(orthoimage_path) - opt.time_offset;\n          //vw_out() << orthoimage_path << \" -> gps_time = \" << ortho_time << std::endl;\n        }\n\n        // If this ortho is too far ahead in time, move on to the next nav chunk.\n        if (ortho_time > end - CHUNK_TIME_BOUNDARY)\n          break; // Don't advance file_index\n\n        // If this ortho is too early in time, move on to the next ortho file.\n        if (ortho_time < start + CHUNK_TIME_BOUNDARY) {\n          vw_out() << \"Too early to interpolate position for file \" << orthoimage_path << std::endl;\n          ++file_index;\n          ortho_time = 0;\n          continue;\n        }\n\n        // Try to interpolate this ortho position\n        Vector3 gcc_interp, rot_interp;\n        try{\n          gcc_interp = pos_interpolator_ptr->operator()(ortho_time);\n          rot_interp = rot_interpolator_ptr->operator()(ortho_time);\n        } catch(...){\n          vw_out() << \"Failed to interpolate position for file \" << orthoimage_path << std::endl;\n          ++file_index;\n          ortho_time = 0;\n          continue;\n        }\n        Vector3 llh_interp = datum_wgs84.cartesian_to_geodetic(gcc_interp);\n      \n        double roll    = rot_interp[0];\n        double pitch   = rot_interp[1];\n        //double heading = rot_interp[2];\n        //vw_out() << \"For file \" << orthoimage_path << \" computed LLH \" << llh_interp << std::endl;\n        //vw_out() << \"Roll    = \" << roll    <<\" = \"<< roll*180/3.14159<< std::endl;\n        //vw_out() << \"Pitch   = \" << pitch   <<\" = \"<< pitch*180/3.14159<< std::endl;\n        //vw_out() << \"Heading = \" << heading << std::endl;\n\n        // Now estimate the rotation information\n\n        /*\n          For some reason the heading interpolated from the navigation data is about 30 degrees\n          off from what is expected by looking at the flight path.  The roll and pitch values are\n          consistent with what is stored in the Icebridge-provided ortho files (the heading is not \n          provided).  What has proven to work the best so far is to estimate the camera pose \n          including the heading just by using the flight path, and then to apply the pitch and roll\n          to that matrix.  The best order to apply the pitch and roll has been determined by seeing \n          which one map-projects closest to the lidar data.\n        */\n      \n        // Get a point ahead of and behind the frame location\n        Vector3 gcc_interp_forward  = pos_interpolator_ptr->operator()(ortho_time+POSE_TIME_DELTA);\n        Vector3 gcc_interp_backward = pos_interpolator_ptr->operator()(ortho_time-POSE_TIME_DELTA);\n      \n        if (gcc_interp_forward == gcc_interp_backward) {\n          vw_out() << \"Failed to estimate pose for file \" << orthoimage_path << std::endl;\n          ++file_index;\n          ortho_time = 0;\n          continue;\n        }\n      \n        // From these points get two flight direction vectors and take the mean.\n        Vector3 dir1 = gcc_interp_forward - gcc_interp;\n        Vector3 dir2 = gcc_interp - gcc_interp_backward;\n        Vector3 xDir = (dir1 + dir2) / 2.0;\n     \n        // The Z vector is straight down from the camera to the ground.\n        Vector3 llh_ground = llh_interp;\n        llh_ground[2] = 0;\n        Vector3 gcc_ground = datum_wgs84.geodetic_to_cartesian(llh_ground);\n        Vector3 zDir = gcc_ground - gcc_interp;\n      \n        // Normalize the vectors\n        xDir = xDir / norm_2(xDir);\n        zDir = zDir / norm_2(zDir);\n      \n        // The Y vector is the cross product of the two established vectors\n        Vector3 yDir = cross_prod(zDir, xDir);\n\n        // Hack to allow testing of whether rotation is applied before axis change.\n        // - The rotations appear to take affect BEFORE the camera mounting (ie they are aircraft rotations)\n        // - Once we are satisfied this is always true, remove the option not to do this.\n        if (opt.camera_mounting > 0) {\n          Matrix3x3 rotation_matrix_gcc(xDir[0], yDir[0], zDir[0],\n                                        xDir[1], yDir[1], zDir[1],\n                                        xDir[2], yDir[2], zDir[2]);\n          Matrix3x3 M_roll  = get_rotation_matrix_roll (roll);\n          Matrix3x3 M_pitch = get_rotation_matrix_pitch(pitch);\n          Matrix3x3 M       = rotation_matrix_gcc*M_pitch*M_roll; // Pre-apply rotation.\n          xDir  = Vector3(M(0,0), M(1,0), M(2,0)); // Restore axes\n          yDir  = Vector3(M(0,1), M(1,1), M(2,1));\n          zDir  = Vector3(M(0,2), M(1,2), M(2,2));\n          roll  = 0; // Set to zero so that these rotations are not applied twice\n          pitch = 0;\n        }\n\n        // Account for the camera mounting direction relative to aircraft motion.\n        Vector3 vTemp;\n        switch(abs(opt.camera_mounting)) {\n        case 1: // Left forwards\n          xDir = xDir * -1.0;\n          yDir = yDir * -1.0;\n          break;\n        case 2: // Top forwards\n          vTemp = xDir;\n          xDir = -1.0*yDir;\n          yDir = vTemp;\n          break;\n        case 3: // Bottom forwards\n          vTemp = xDir;\n          xDir = yDir;\n          yDir = -1.0*vTemp;\n          break;\n        default: break; // Right forwards, the default.\n        }\n      \n        // Pack into a rotation matrix\n        Matrix3x3 rotation_matrix_gcc(xDir[0], yDir[0], zDir[0],\n                                      xDir[1], yDir[1], zDir[1],\n                                      xDir[2], yDir[2], zDir[2]);\n      \n        // TODO: ENU or NED?\n        //Matrix3x3 ned_matrix = datum_wgs84.lonlat_to_ned_matrix(llh_interp);\n        //Matrix3x3 enu_matrix(ned_matrix(0,1), ned_matrix(0,0), -ned_matrix(0,2),\n        //                     ned_matrix(1,1), ned_matrix(1,0), -ned_matrix(1,2),\n        //                     ned_matrix(2,1), ned_matrix(2,0), -ned_matrix(2,2));\n\n        //Vector3 north(ned_matrix(0,0), ned_matrix(1,0), ned_matrix(2,0));\n        //double angle = acos(dot_prod(xDir, north) / (norm_2(north)*norm_2(xDir)));\n      \n        // TODO: Clean all this up once we are satisfied with it!\n        Matrix3x3 M_roll  = get_rotation_matrix_roll (roll);\n        Matrix3x3 M_pitch = get_rotation_matrix_pitch(pitch);\n\n        // Without documentation it is very difficult to determine\n        // which of these rotation orders is correct!\n        // - Could be neither since the yaw rotation is already baked in.\n        //Matrix3x3 M1 = M_pitch*M_roll*rotation_matrix_gcc; // <-- off\n        //Matrix3x3 M2 = M_roll*M_pitch*rotation_matrix_gcc; // <-- off\n        Matrix3x3 M3 = rotation_matrix_gcc*M_pitch*M_roll; // <-- Best\n        //Matrix3x3 M4 = rotation_matrix_gcc*M_roll*M_pitch; // <-- Ok\n      \n        write_output_camera(gcc_interp, M3,\n                            opt.input_cam, output_camera_path.string());\n\n        // Update progress\n        if (file_index % PRINT_INTERVAL == 0)\n          vw_out() << file_index << \" files processed.\\n\";\n\n        ++file_index;\n        ortho_time = 0;\n\n      } // End loop through ortho files\n    \n    } // End loop through nav batches\n  \n    vw_out() << \"Finished looping through the nav file.\\n\";\n    /*\n    \n    // TODO: The camera position needs to be interpolated from the several nearest lines!\n    \n    Vector3 xyz;\n    Quat rot, look, ned;\n    \n    // Try out different rotation orders\n    for (int rot_order = 5; rot_order <= 5; rot_order++) {\n    \n    // Process the navigation information from this line\n    parse_camera_pose(curr_line, xyz, look, ned, \n    lon, lat, alt, roll, pitch, heading, rot_order);\n\n    vw_out() << \"Got GCC coord: \" << xyz << std::endl;\n\n    // This is highly confusing, but apparently we need to keep\n    // the original longitude when computing the ned matrix that\n    // transforms from the coordinate system with orgin at the\n    // center of the Earth to the North-East-Down coordinate\n    // system that was obtained from the starting image, rather\n    // than modifying it as we move over new points over the Earth surface.\n    if (lon0 == BIG_NUMBER){\n    // First value for these variables.\n    lon0 = lon;\n    }\n    //ned = Quat(datum_wgs84.lonlat_to_ned_matrix(Vector3(lon0, lat, alt)));\n\n    Quat rotation_matrix_gcc = inverse(ned)*inverse(look);\n      \n    // Update the input pinhole model and write it out to disk.\n    input_pinhole_model.set_camera_center(xyz);\n    input_pinhole_model.set_camera_pose(rotation_matrix_gcc);\n    vw_out() << \"Writing: \" << output_camera_path << std::endl;\n    input_pinhole_model.write(output_camera_path);\n      \n    } // End rot_order loop\n  \n    // Update progress\n    if (i % PRINT_INTERVAL == 0)\n    vw_out() << i << \" files completed.\\n\";\n    \n    } // End loop through input files\n  \n    */\n  \n    if (opt.detect_offset) {\n      std::cout << \"Getting target results...\\n\";\n      // Compute the mean difference between the target camera time and the matched time\n      //  and print the results.\n      std::vector<double> matched_times, best_distances;\n      interpLoader.get_target_times(matched_times, best_distances);\n      const size_t num_targets = target_times.size();\n      double mean_offset = 0, mean_dist = 0;\n      for (size_t i=0; i<num_targets; ++i) {\n        double diff = matched_times[i] - target_times[i];\n        mean_offset += diff;\n        mean_dist   += best_distances[i];\n        std::cout << \"Offset: \" << diff << \", dist = \" << best_distances[i]\n                  << \", time = \" << matched_times[i] << std::endl;\n      }\n      mean_offset /= static_cast<double>(num_targets);\n      mean_dist   /= static_cast<double>(num_targets);\n      std::cout << \"Computed mean nav time offset: \" << mean_offset << std::endl;\n      std::cout << \"Computed mean nav distance   : \" << mean_dist   << std::endl;\n    }\n  \n  } ASP_STANDARD_CATCHES;\n\n  return 0;\n}\n  \n"
  },
  {
    "path": "src/asp/IceBridge/orbitviz_pinhole.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n/// \\file orbitviz.cc\n///\n\n// This is as scaled-down version of orbitviz that only operates on pinhole files\n\n/************************************************************************\n *     File: orbitviz.cc\n ************************************************************************/\n#include <vw/FileIO/KML.h>\n#include <vw/FileIO/FileUtils.h>\n#include <vw/Camera/PinholeModel.h>\n\n#include <iomanip>\n\n#include <boost/algorithm/string.hpp>\n#include <boost/program_options.hpp>\n#include <boost/filesystem/path.hpp>\n#include <boost/filesystem/operations.hpp>\n#include <boost/filesystem/fstream.hpp>\n\n#include <asp/Core/AspProgramOptions.h>\n#include <asp/Core/Macros.h>\n\nusing namespace vw;\nusing namespace vw::camera;\nusing namespace vw::cartography;\nnamespace po = boost::program_options;\nnamespace fs = boost::filesystem;\n\nstruct Options : public vw::GdalWriteOptions {\n  Options() {}\n  // Input\n  std::vector<std::string> input_files;\n  std::string path_to_outside_model, input_list;\n\n  // Settings\n  bool write_csv, hide_labels;\n  double model_scale; ///< Size scaling applied to 3D models\n\n  // Output\n  std::string out_file;\n};\n\n\n\nvoid handle_arguments( int argc, char *argv[], Options& opt ) {\n  po::options_description general_options(\"\");\n  general_options.add_options()\n    (\"output,o\",                po::value(&opt.out_file)->default_value(\"orbit.kml\"),\n          \"The output kml file that will be written\")\n    (\"input-list\", po::value(&opt.input_list)->default_value(\"\"),\n          \"File containing list of input files\")\n    (\"use-path-to-dae-model,u\", po::value(&opt.path_to_outside_model),\n          \"Instead of using an icon to mark a camera, use a 3D model with extension .dae\")\n    (\"hide-labels\",             po::bool_switch(&opt.hide_labels)->default_value(false)->implicit_value(true),\n          \"Hide image names unless the camera is highlighted.\")\n    // The KML class applies a model scale of 3000 * this value.\n    (\"model-scale\",             po::value(&opt.model_scale)->default_value(1.0/30.0),\n          \"Scale factor applied to 3D model size.\")\n    (\"write-csv\", po::bool_switch(&opt.write_csv)->default_value(false),\n     \"Write a csv file with the orbital data.\");\n  general_options.add( vw::GdalWriteOptionsDescription(opt) );\n\n  po::options_description positional(\"\");\n  positional.add_options()\n    (\"input-files\", po::value(&opt.input_files) );\n\n  po::positional_options_description positional_desc;\n  positional_desc.add(\"input-files\", -1);\n\n  std::string usage(\"[options] <input cameras>\\n\");\n\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line( argc, argv, opt, general_options, general_options,\n                             positional, positional_desc, usage,\n                             allow_unregistered, unregistered );\n \n if (opt.input_list != \"\") {\n   std::ifstream handle(opt.input_list.c_str());\n   std::string line;\n   size_t count = 0;\n   while (getline(handle, line)){\n     opt.input_files.push_back(line);\n     ++count;\n   }\n   handle.close();\n   vw_out() << \"Read in \" << count << \" camera files from \" << opt.input_list << std::endl;\n }\n \n if (opt.input_files.empty())\n  vw_throw( ArgumentErr() << \"No input files provided!\\n\" );\n  \n}\n\nint main(int argc, char* argv[]) {\n\n  Options opt;\n  try {\n    handle_arguments( argc, argv, opt );\n\n    size_t num_cameras = opt.input_files.size();\n\n    // Prepare output directory\n    vw::create_out_dir(opt.out_file);\n  \n    // Create the KML file.\n    KMLFile kml( opt.out_file, \"orbitviz\" );\n\n    // Style listing\n    if ( opt.path_to_outside_model.empty() ) {\n      // Placemark Style\n      kml.append_style( \"plane\", \"\", 1.2,\n                        \"http://maps.google.com/mapfiles/kml/shapes/airports.png\", \n                        opt.hide_labels);\n      kml.append_style( \"plane_highlight\", \"\", 1.4,\n                        \"http://maps.google.com/mapfiles/kml/shapes/airports.png\");\n      kml.append_stylemap( \"camera_placemark\", \"plane\",\n                           \"plane_highlight\" );\n    }\n\n    // Load up the datum\n    cartography::Datum datum(\"WGS84\");\n\n    std::string csv_file = fs::path(opt.out_file).replace_extension(\"csv\").string();\n    std::ofstream csv_handle;\n    if ( opt.write_csv ) {\n      csv_handle.open(csv_file.c_str());\n  \n      if ( !csv_handle.is_open() )\n        vw_throw( IOErr() << \"Unable to open output file.\\n\" );\n    }\n  \n    Vector2 camera_pixel(0, 0);\n\n    // Building Camera Models and then writing to KML\n    std::vector<Vector3> camera_positions(num_cameras);\n    for (size_t i=0; i < num_cameras; i++) {\n      // Load this input file\n      PinholeModel current_camera(opt.input_files[i]);\n\n      if ( opt.write_csv ) {\n        csv_handle << opt.input_files[i] << \", \";\n\n        Vector3 xyz = current_camera.camera_center(camera_pixel);\n        csv_handle << std::setprecision(12);\n        csv_handle << xyz[0] << \", \"\n                   << xyz[1] << \", \" << xyz[2] << \"\\n\";\n      } // End csv write condition\n    \n      // Compute and record the GDC coordinates\n      Vector3 lon_lat_alt\n        = datum.cartesian_to_geodetic(current_camera.camera_center(camera_pixel));\n      camera_positions[i] = lon_lat_alt;\n\n      // Adding placemarks\n      std::string display_name = strip_directory(opt.input_files[i]);\n      if (!opt.path_to_outside_model.empty()) {\n        kml.append_model( opt.path_to_outside_model,\n                          lon_lat_alt.x(), lon_lat_alt.y(),\n                          inverse(current_camera.camera_pose(camera_pixel)),\n                          display_name, \"\",\n                          lon_lat_alt[2], opt.model_scale );\n      } else {\n        kml.append_placemark( lon_lat_alt.x(), lon_lat_alt.y(),\n                              display_name, \"\", \"camera_placemark\",\n                              lon_lat_alt[2], true );\n      }\n    \n    } // End loop through cameras\n\n    // Put the Writing: messages here, so that they show up after all other info.\n    vw_out() << \"Writing: \" << opt.out_file << std::endl; \n    kml.close_kml();\n\n    if (opt.write_csv){\n      vw_out() << \"Writing: \" << csv_file << std::endl;\n      csv_handle.close();\n    }\n    \n  } ASP_STANDARD_CATCHES;\n\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/IceBridge/ortho2pinhole.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2024, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file ortho2pinhole.cc\n///\n\n// Given a raw image and a map-projected version of it (an ortho\n// image), use that to find the camera position and orientation from\n// which the image was acquired. If no DEM is provided via\n// opt.reference_dem, we assume for now that the image is mapprojected\n// onto the datum. Save on output a gcp file, that may be used to further\n// refine the camera using bundle_adjust.\n#include <asp/Sessions/StereoSession.h>\n#include <asp/Sessions/StereoSessionFactory.h>\n#include <asp/Core/Macros.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/PointUtils.h>\n#include <asp/Core/InterestPointMatching.h>\n#include <asp/Core/ImageNormalization.h>\n#include <asp/Core/AspProgramOptions.h>\n#include <asp/Core/AspLog.h>\n#include <asp/Core/ImageUtils.h>\n\n#include <vw/Image/ImageTransform.h>\n#include <vw/InterestPoint/MatcherIO.h>\n#include <vw/Camera/PinholeModel.h>\n#include <vw/Cartography/GeoTransform.h>\n#include <vw/Math/Geometry.h>\n#include <vw/Core/Stopwatch.h>\n#include <vw/FileIO/FileUtils.h>\n\n#include <boost/core/null_deleter.hpp>\n\n// Turn off warnings from eigen\n#if defined(__GNUC__) || defined(__GNUG__)\n#define LOCAL_GCC_VERSION (__GNUC__ * 10000                    \\\n                           + __GNUC_MINOR__ * 100              \\\n                           + __GNUC_PATCHLEVEL__)\n#if LOCAL_GCC_VERSION >= 40600\n#pragma GCC diagnostic push\n#endif\n#if LOCAL_GCC_VERSION >= 40202\n#pragma GCC diagnostic ignored \"-Wunused-local-typedefs\"\n#endif\n#endif\n\n#include <ceres/ceres.h>\n#include <ceres/loss_function.h>\n\n#if defined(__GNUC__) || defined(__GNUG__)\n#if LOCAL_GCC_VERSION >= 40600\n#pragma GCC diagnostic pop\n#endif\n#undef LOCAL_GCC_VERSION\n#endif\n\nnamespace po = boost::program_options;\nnamespace fs = boost::filesystem;\n\nusing namespace vw;\nusing namespace vw::camera;\n\nstruct Options : public vw::GdalWriteOptions {\n  std::string raw_image, ortho_image, input_cam, output_cam, reference_dem, camera_estimate;\n  double camera_height, orthoimage_height, ip_inlier_factor, max_translation;\n  int    ip_per_tile, ip_detect_method, min_ip;\n  bool   individually_normalize, keep_match_file, write_gcp_file, skip_image_normalization,\n    show_error, short_circuit, crop_reference_dem;\n\n  // Make sure all values are initialized, even though they will be\n  // over-written later.\n  Options(): camera_height(-1), orthoimage_height(0), ip_per_tile(0),\n             ip_detect_method(0), individually_normalize(false), keep_match_file(false) {}\n};\n\n/// Record a set of IP results as ground control points\n// TODO(oalexan1): Use asp::writeGcp() instead of inline GCP writing.\nvoid write_gcp_file(Options const& opt,\n                    std::vector<Vector3> const& llh_pts,\n                    std::vector<Vector2> const& pixels) {\n\n  // Save a gcp file, later bundle_adjust can use it to improve upon this camera model\n  std::string gcp_file = opt.output_cam + \".gcp\";\n  vw_out() << \"Writing: \" << gcp_file << std::endl;\n  std::ofstream output_handle(gcp_file.c_str());\n  for (size_t pt_iter = 0; pt_iter < pixels.size(); pt_iter++) { // Loop through IPs\n\n    Vector3 llh = llh_pts[pt_iter];\n    Vector2 pix = pixels[pt_iter];\n\n    // The ground control point ID\n    output_handle << pt_iter;\n\n    // Lat, lon, height\n    output_handle << \", \" << llh[1] << \", \" << llh[0] << \", \" << llh[2];\n\n    // Sigma values\n    output_handle << \", \" << 1 << \", \" << 1 << \", \" << 1;\n\n    // Pixel value\n    output_handle << \", \" <<  opt.raw_image;\n    output_handle << \", \" << pix.x() << \", \" << pix.y(); // IP location in image\n    output_handle << \", \" << 1 << \", \" << 1; // Sigma values\n    output_handle << std::endl; // Finish the line\n\n  } // End loop through IPs\n  output_handle.close();\n\n} // End write_gcp_file\n\n\n\n/// Read the camera height above ground from the ortho file, unless it was user-specified.\ndouble get_cam_height_estimate(Options const& opt) {\n  double cam_height = opt.camera_height;\n  if (cam_height < 0) {\n    const std::string alt_key = \"Altitude\";\n    std::string alt_str;\n    boost::shared_ptr<vw::DiskImageResource> rsrc(new vw::DiskImageResourceGDAL(opt.ortho_image));\n    vw::cartography::read_header_string(*rsrc.get(), alt_key, alt_str);\n    if (alt_str == \"\")\n      vw_throw(ArgumentErr() << \"Cannot find the 'Altitude' metadata in the image: \"\n                              << opt.ortho_image\n                  << \". It should then be specified on the command line as --camera-height.\\n\");\n\n    cam_height = atof(alt_str.c_str());\n  }\n  return cam_height;\n}\n\n\n\n// Unpack six parameters into a translation and rotation\nvoid unpack_parameters(Vector<double> const &C,\n                       Vector3   &translation,\n                       Matrix3x3 &rotation) {\n  translation = Vector3(C[3], C[4], C[5]);\n  Vector3 angles(C[0], C[1], C[2]);\n  rotation = axis_angle_to_matrix(angles);\n}\n\n/// Find the camera model that best explains the DEM pixel observations\nclass OtpSolveLMA : public vw::math::LeastSquaresModelBase<OtpSolveLMA> {\n\n  // TODO: Normalize!\n  /// The normalized values are in the -1 to 1 range.\n  std::vector<vw::Vector3> const& m_gcc_coords;\n  std::vector<vw::Vector2> const& m_pixel_coords;\n  boost::shared_ptr<CameraModel> m_camera_model;\n  mutable size_t m_iter_count;\n\npublic:\n\n\n  typedef vw::Vector<double> result_type;   // normalized pixels\n  typedef result_type        domain_type;   // Camera parameters: x,y,z,\n  typedef vw::Matrix<double> jacobian_type;\n\n  /// Instantiate the solver with a set of GCC <--> Pixel pairs.\n  OtpSolveLMA(std::vector<vw::Vector3> const& gcc_coords,\n              std::vector<vw::Vector2> const& pixel_coords,\n              boost::shared_ptr<CameraModel> camera_model):\n    m_gcc_coords(gcc_coords),\n    m_pixel_coords(pixel_coords),\n    m_camera_model(camera_model), m_iter_count(0) {\n    std::cout << \"Init model with \" << m_gcc_coords.size() << \" points.\\n\";\n  }\n\n  /// Given a set of RPC coefficients, compute the projected pixels.\n  inline result_type operator()(domain_type const& C) const {\n\n\n    // Set up the camera with the proposed rotation/translation\n    Vector3 translation;\n    Quat    rotation;\n    //unpack_parameters(C, translation, rotation);\n    translation = Vector3(C[3], C[4], C[5]);\n    Vector3 angles(C[0], C[1], C[2]);\n    rotation = axis_angle_to_quaternion(angles);\n\n    //std::cout << \"Testing translation: \" << translation << std::endl;\n    //std::cout << \"Testing rotation: \" << rotation << std::endl;\n\n    AdjustedCameraModel adj_cam(m_camera_model, translation, rotation);\n\n    // Compute the error scores\n    const double NO_VIEW_ERROR = 999;\n    const size_t result_size = m_gcc_coords.size() * 2;\n    result_type result;\n    result.set_size(result_size);\n    double mean_error = 0;\n    int missedPixelCount = 0;\n    for (size_t i=0; i<m_gcc_coords.size(); ++i) {\n      try{\n        Vector2 pixel = adj_cam.point_to_pixel(m_gcc_coords[i]);\n        //std::cout << pixel << \" vs \" << m_pixel_coords[i] << std::endl;\n        result[2*i  ] = pixel[0];\n        result[2*i+1] = pixel[1];\n        mean_error += (fabs(pixel[0] - m_pixel_coords[i][0]) + fabs(pixel[1] - m_pixel_coords[i][1]))/2.0;\n      } catch(vw::camera::PointToPixelErr) {\n        result[2*i  ] = NO_VIEW_ERROR;\n        result[2*i+1] = NO_VIEW_ERROR;\n        ++missedPixelCount;\n      }\n    }\n\n    //std::cout << \"Iter \" << m_iter_count << \" -> mean error = \" << mean_error/m_gcc_coords.size() << std::endl;\n    //std::cout << \"Missed pixel count = \" << missedPixelCount << std::endl;\n    ++m_iter_count;\n\n    return result;\n  }\n\n}; // End class OtpSolveLMA\n\n\n/// Solve for a camera translation/rotation based on pixel/gcc coordinate pairs.\nint solve_for_cam_adjust(boost::shared_ptr<PinholeModel> camera_model,\n                         std::vector<Vector2> const& pixel_coords,\n                         std::vector<Vector3> const& gcc_coords,\n                         vw::Vector3         & translation,\n                         vw::Matrix3x3       & rotation,\n                         double              & norm_error) {\n\n  // Set up the optimizer model\n  OtpSolveLMA lma_model(gcc_coords, pixel_coords, camera_model);\n\n  int status;\n\n  // Use the L-M solver to optimize the camera position.\n  const double abs_tolerance  = 1e-24;\n  const double rel_tolerance  = 1e-24;\n  const int    max_iterations = 2000;\n\n  // Set up with identity transform\n  const size_t NUM_PARAMS = 6;\n  Vector<double> seed_params(NUM_PARAMS);\n  for (size_t i=0; i<NUM_PARAMS; ++i)\n    seed_params[i] = 0.0;\n\n  // Pack the target pixel observations\n  const size_t num_observations = pixel_coords.size()*2;\n  Vector<double> packed_observations(num_observations);\n  for (size_t i=0; i<pixel_coords.size(); ++i) {\n    packed_observations[2*i  ] = pixel_coords[i][0];\n    packed_observations[2*i+1] = pixel_coords[i][1];\n  }\n\n  // Run the observation\n  Vector<double> final_params;\n  final_params = math::levenberg_marquardt(lma_model, seed_params, packed_observations,\n                                            status, abs_tolerance, rel_tolerance,\n                                            max_iterations);\n\n  if (status < 1) { // This means the solver failed to converge!\n    VW_OUT(DebugMessage, \"asp\") << \"ortho2pinhole: WARNING --> Levenberg-Marquardt solver status = \"\n                                << status << std::endl;\n  }\n\n  // Otherwise the solver converged, compute the final error number.\n  Vector<double> final_projected = lma_model(final_params);\n  Vector<double> final_error     = lma_model.difference(final_projected, packed_observations);\n  norm_error = norm_2(final_error);\n\n  unpack_parameters(final_params, translation, rotation);\n\n  return status;\n}\n\n\n\n\n\n/// Load the DEM and adjust some options depending on DEM statistics.\nvoid load_reference_dem(Options &opt, boost::shared_ptr<DiskImageResource> const& rsrc_ortho,\n                        vw::cartography::GeoReference const& ortho_georef,\n                        ImageViewRef< PixelMask<float> > &dem,\n                        vw::cartography::GeoReference &dem_georef,\n                        bool &elevation_change_present) {\n\n  // Set up the DEM if it was provided.\n  float dem_nodata = -std::numeric_limits<float>::max();\n\n  bool is_good = vw::cartography::read_georeference(dem_georef, opt.reference_dem);\n  if (!is_good) {\n    vw_throw(ArgumentErr() << \"Error: Cannot read georeference from: \"\n                           << opt.reference_dem << \".\\n\");\n  }\n\n  {\n    // Read the no-data\n    DiskImageResourceGDAL rsrc(opt.reference_dem);\n    if (rsrc.has_nodata_read()) dem_nodata = rsrc.nodata_read();\n  }\n\n\n  bool crop_is_success = false;\n  if (opt.crop_reference_dem) {\n\n    // Crop the DEM to a small area and read fully into memory\n\n    DiskImageView<float> tmp_ortho(rsrc_ortho);\n    BBox2 ortho_bbox = bounding_box(tmp_ortho);\n\n    DiskImageView<float> tmp_dem(opt.reference_dem);\n    BBox2 dem_bbox = bounding_box(tmp_dem);\n\n    // The GeoTransform will hide the messy details of conversions\n    vw::cartography::GeoTransform geotrans(dem_georef, ortho_georef, dem_bbox, ortho_bbox);\n\n    // Get the ortho bbox in the DEM pixel domain\n    BBox2 crop_box = geotrans.reverse_bbox(ortho_bbox);\n    if (crop_box.empty()) {\n      // This should not happen, but go figure, as the DEM could be very coarse\n      ortho_bbox.expand(10000);\n      crop_box = geotrans.reverse_bbox(ortho_bbox);\n    }\n\n    if (!crop_box.empty() && crop_box.width() < 5000 && crop_box.height() < 5000) {\n      // It may be empty for a very coarse DEM maybe\n\n      crop_box.expand(200); // TODO: Need to think more here\n      crop_box.crop(dem_bbox);\n\n      if (!crop_box.empty()) {\n        ImageView<float> cropped_dem = crop(DiskImageView<float>(opt.reference_dem), crop_box);\n        dem = create_mask(cropped_dem, dem_nodata);\n        dem_georef = crop(dem_georef, crop_box);\n        crop_is_success = true;\n      }\n    }\n\n    vw_out() << \"DEM bounding box: \" << bounding_box(dem) << std::endl;\n  }\n\n  // Default behavior\n  if (!crop_is_success)\n    dem = create_mask(DiskImageView<float>(opt.reference_dem), dem_nodata);\n\n\n  // Get an estimate of the elevation range in the input image\n  const int HEIGHT_SKIP = 500; // The DEM is very low resolution\n\n  InterpolationView<EdgeExtensionView< ImageViewRef< PixelMask<float> >,\n                                       ConstantEdgeExtension >,\n                    BilinearInterpolation> interp_dem =\n      interpolate(dem, BilinearInterpolation(), ConstantEdgeExtension());\n  double max_height = -9999, min_height = 9999999, mean_height=0.0, num_heights = 0;\n  for (int r=0; r<rsrc_ortho->rows(); r+=HEIGHT_SKIP) {\n    for (int c=0; c<rsrc_ortho->cols(); c+=HEIGHT_SKIP) {\n      // Ortho pixel to DEM pixel\n      Vector2 ortho_pix(c, r);\n      Vector2 ll      = ortho_georef.pixel_to_lonlat(ortho_pix);\n      Vector2 dem_pix = dem_georef.lonlat_to_pixel(ll);\n      double x = dem_pix.x(), y = dem_pix.y();\n      if (0 <= x && x <= dem.cols() - 1 && 0 <= y && y <= dem.rows() - 1) {\n        PixelMask<float> dem_val = interp_dem(x, y);\n        if (is_valid(dem_val)) {\n          // Accumulate the valid height range\n          double height = dem_val.child();\n          mean_height += height;\n          num_heights += 1.0;\n          if (height < min_height) min_height = height;\n          if (height > max_height) max_height = height;\n        }\n      } // End boundary check\n    } // End col loop\n  } // End row loop\n\n  if (num_heights < 1.0) {\n    vw_out() << \"No intersection found with the reference DEM!\\n\";\n    return; // No information can be gained in this case.\n  }\n\n  mean_height = mean_height / num_heights;\n\n  // Set a flag if we detect there is a significant amount of elevation change in the image\n  const double ELEVATION_CHANGE_THRESHOLD = 40; // Meters\n  double elevation_change = max_height - min_height;\n  vw_out() << \"Estimated elevation change of \" << elevation_change << std::endl;\n  if (elevation_change > ELEVATION_CHANGE_THRESHOLD)\n    elevation_change_present = true;\n\n  // If the user did not specify an orthoimage height, use the statistics we computed\n  //  to get an estimate.\n  if (opt.orthoimage_height == 0.0) {\n    opt.orthoimage_height = mean_height;\n    vw_out() << \"Estimated orthoimage height to be \" << opt.orthoimage_height << std::endl;\n  }\n\n} // End load_reference_dem\n\nvoid load_camera_and_find_ip(Options const& opt,\n                             boost::shared_ptr<DiskImageResource> const& rsrc_raw,\n                             boost::shared_ptr<DiskImageResource> const& rsrc_ortho,\n                             std::string const& match_filename,\n                             boost::shared_ptr<CameraModel> &cam) {\n\n  std::string out_prefix = \"tmp-prefix\";\n  std::string stereo_session = \"pinhole\";\n  float nodata1, nodata2;\n  asp::SessionPtr session(asp::StereoSessionFactory::create(stereo_session, opt,\n                                                       opt.raw_image, opt.ortho_image,\n                                                       opt.input_cam, opt.input_cam,\n                                                       out_prefix));\n  asp::get_nodata_values(rsrc_raw, rsrc_ortho, asp::stereo_settings().nodata_value,\n                         nodata1, nodata2);\n\n  cam = session->camera_model(opt.raw_image, opt.input_cam);\n\n  // Skip IP finding if the match file exists since the code will re-use it anyways.\n  if (boost::filesystem::exists(match_filename)) {\n    vw_out() << \"Using existing match filename \" << match_filename << std::endl;\n    return;\n  }\n\n  try {\n    // IP matching may not succeed for all pairs\n\n    // Get masked views of the images to get statistics from\n    DiskImageView<float> image1_view(rsrc_raw), image2_view(rsrc_ortho);\n    ImageViewRef<PixelMask<float>> masked_image1 = create_mask(image1_view, nodata1);\n    ImageViewRef<PixelMask<float>> masked_image2 = create_mask(image2_view, nodata2);\n    vw::Vector<vw::float32,6> image1_stats\n      = asp::gather_stats(masked_image1, \"\", opt.raw_image);\n    vw::Vector<vw::float32,6> image2_stats\n      = asp::gather_stats(masked_image2, \"\", opt.ortho_image);\n\n    session->ip_matching(opt.raw_image, opt.ortho_image,\n                         Vector2(masked_image1.cols(), masked_image1.rows()),\n                         image1_stats, image2_stats,\n                         nodata1, nodata2, cam.get(), cam.get(),\n                         match_filename, \"\", \"\");\n  } catch (const std::exception& e) {\n    vw_throw(ArgumentErr()\n              << \"Could not find interest points between images \"\n              << opt.raw_image << \" and \" << opt.ortho_image << \"\\n\" << e.what() << \"\\n\");\n  } //End try/catch\n\n} // End load_camera_and_find_ip\n\n\n/// Copy pertinent information from the nav camera estimate to the\n///  pinhole camera model so that we keep the intrinsic parameters.\nvoid update_pinhole_from_nav_estimate(vw::camera::PinholeModel *pcam,\n                                      vw::camera::PinholeModel const& nav_camera) {\n  // Copy the camera position\n  pcam->set_camera_center(nav_camera.camera_center());\n\n  // Copy the camera orientation, being careful to avoid undiagnosed quaternion/matrix issue.\n  pcam->set_camera_pose(nav_camera.get_rotation_matrix());\n\n  // Copy the camera<->image transform which nav2cam uses to flip the vertical axis.\n  // -> This is not currently happening because our camera model is not properly\n  //    handling those parameters!  For now we are messing with the pose instead.\n  Vector3 u_vec, v_vec, w_vec;\n  nav_camera.coordinate_frame(u_vec, v_vec, w_vec);\n  pcam->set_coordinate_frame(u_vec, v_vec, w_vec);\n}\n\n/// Generate the estimated camera using a 3D affine transform or load in from a file.\n/// - pcam is the input camera model.\nvoid get_estimated_camera_position(Options const& opt,\n                                   bool have_dem_points,\n                                   vw::camera::PinholeModel *pcam,\n                                   std::vector<Vector3> const& raw_flat_xyz,\n                                   std::vector<Vector3> const& ortho_flat_xyz) {\n\n  // Use a simple solution to get an initial estimate.\n\n  // Pack the in/out point pairs into two matrices.\n  int num_pts = raw_flat_xyz.size();\n  vw_out() << \"Using \" << num_pts << \" points to create the camera model.\\n\";\n  vw::Matrix<double> points_in(3, num_pts), points_out(3, num_pts);\n  typedef vw::math::MatrixCol<vw::Matrix<double> > ColView;\n  for (int pt_iter = 0; pt_iter < num_pts; pt_iter++) {\n    ColView colIn (points_in,  pt_iter);\n    ColView colOut(points_out, pt_iter);\n    colIn  = raw_flat_xyz  [pt_iter];\n    colOut = ortho_flat_xyz[pt_iter];\n  }\n\n  // Call function to compute a 3D affine transform between the two point sets\n  // - This is always between the nadir facing camera over flat terrain and the\n  //   ortho at the estimated constant elevation.\n  // - The ortho elevation needs to be flat so that the \"plane\" of the camera points\n  //   does not tilt away from the correct position trying to align to 3D terrain.\n  vw::Matrix3x3 rotation;\n  vw::Vector3   translation;\n  double        scale;\n  vw::math::find_3D_transform(points_in, points_out, rotation, translation, scale);\n\n  vw_out() << \"Determined camera extrinsics from orthoimage: \" << std::endl;\n  vw_out() << \"scale: \" << scale << std::endl;\n\n  // Apply the transform to the camera.\n  pcam->apply_transform(rotation, translation, scale);\n\n  std::cout << \"Est affine camera:\\n\" << *pcam << std::endl;\n\n  if (opt.camera_estimate != \"\") {\n    // Load the estimated camera\n    PinholeModel est_cam(opt.camera_estimate);\n    std::cout << \"est_cam = \\n\" << est_cam << std::endl;\n\n    // If our solution moved too far from the estimated camera, use\n    // the estimated position/pose instead.\n    double dist = norm_2(pcam->camera_center() - est_cam.camera_center());\n    vw_out() << \"Flat affine estimate is \" << dist\n             << \" meters from the input camera estimate.\\n\";\n    if (dist > opt.max_translation) {\n      update_pinhole_from_nav_estimate(pcam, est_cam);\n      vw_out() << \"Flat affine estimate difference limit is \" << opt.max_translation\n               << \", using input estimate instead\\n\";\n    }\n  } // End have camera estimate case\n\n\n} // End load_estimated_camera\n\n/// Use IPs from the ortho image and DEM to optimize the camera with a Lev-Mar solver.\n/// - Returns norm_error of the chosen solution.\ndouble refine_camera_with_dem_pts(Options const& opt,\n                                  vw::cartography::GeoReference const& dem_georef,\n                                  bool use_extra_caution,\n                                  std::vector<Vector3> const& ortho_dem_xyz,\n                                  std::vector<Vector2> const& raw_pixels2,\n                                  vw::camera::PinholeModel *pcam) {\n\n  int num_pts = ortho_dem_xyz.size();\n\n  // Try multiple solver attempts with varying camera heights\n  const double TARGET_ERROR = 1000; // Error can be quite low but incorrect results tend to be very large\n  const double HEIGHT_STEP = 50;\n  const int    NUM_SEARCH_STEPS = 6;\n\n  // Set up the search elevation offsets\n  // - Only use additional offsets if we don't have an estimated camera file.\n  std::vector<double> height_offsets;\n  height_offsets.push_back(0);\n  if (opt.camera_estimate == \"\") {\n    for (int i=1; i<=NUM_SEARCH_STEPS; ++i) {\n      height_offsets.push_back(i*HEIGHT_STEP);\n      height_offsets.push_back(-1*i*HEIGHT_STEP);\n    }\n  }\n\n  const size_t max_attempts = height_offsets.size();\n\n  size_t attempt_count = 0;\n  vw::Matrix3x3 rotation, best_rotation;\n  vw::Vector3   translation, best_translation, best_gcc;\n  double norm_error = 99999999999;\n  double best_error = norm_error;\n\n  // Record starting position\n  Vector3 initial_center_gcc = pcam->camera_center(Vector2(0,0));\n  Vector3 initial_center_llh = dem_georef.datum().cartesian_to_geodetic(initial_center_gcc);\n\n  while (attempt_count < max_attempts) {\n\n    // Set the camera position\n    double new_height = initial_center_llh[2] + height_offsets[attempt_count];\n    Vector3 new_llh = initial_center_llh;\n    new_llh[2] = new_height;\n    Vector3 new_gcc = dem_georef.datum().geodetic_to_cartesian(new_llh);\n    pcam->set_camera_center(new_gcc);\n\n    vw_out() << \"Running LM solver attempt \" << attempt_count << \" with starting elevation: \" << new_height << std::endl;\n\n    // Refine our initial estimate of the camera position using an LM solver with the camera model.\n    int status = solve_for_cam_adjust(boost::shared_ptr<PinholeModel>\n                                      (pcam, boost::null_deleter()),\n                                      raw_pixels2, ortho_dem_xyz,\n                                      translation, rotation, norm_error);\n\n    attempt_count += 1;\n\n    vw_out() << \"LM solver status: \" << status << std::endl;\n    if (status < 1) {\n      vw_out() << \"LM solver failed!\\n\";\n      continue; // Move on to the next attempt\n    }\n\n    // Success case\n    vw_out() << \"Success: LM solver error = \" << norm_error << std::endl;\n\n    // Keep track of our best solution\n    if (norm_error < best_error) {\n        best_rotation    = rotation;\n        best_translation = translation;\n        best_error       = norm_error;\n        best_gcc         = new_gcc;\n    }\n\n    // If the error was very good, stop trying new solutions.\n    if ((norm_error < TARGET_ERROR) && !use_extra_caution)\n      break;\n\n  } // End solver attempt loop\n\n  vw_out() << \"Best LM solver error  = \" << best_error << std::endl;\n\n  // TODO: Make a function for this?\n  // Apply the transform to the camera.\n  Quat rot_q(best_rotation);\n  pcam->set_camera_center(best_gcc); // Make sure the adjustment applies to the right center location\n  AdjustedCameraModel adj_cam(boost::shared_ptr<PinholeModel>(pcam, boost::null_deleter()),\n                              best_translation, rot_q);\n  Quat    pose   = adj_cam.camera_pose(Vector2());\n  Vector3 center = adj_cam.camera_center(Vector2());\n  pcam->set_camera_pose(pose); // TODO: There may be a problem here!\n  pcam->set_camera_center(center);\n\n  if (opt.show_error) { // Print error in pixels for each IP\n    for (int i=0; i<num_pts; ++i) {\n      Vector2 pixel = pcam->point_to_pixel(ortho_dem_xyz[i]);\n      double diff = norm_2(pixel - raw_pixels2[i]);\n      std::cout << \"Error \" << i << \" = \" << diff << std::endl;\n    }\n  }\n\n  return best_error;\n\n} // End function refine_camera_with_dem_pts\n\n\n// Primary task-solving function.\nvoid ortho2pinhole(Options & opt) {\n\n  // Input image handles\n  boost::shared_ptr<DiskImageResource>\n    rsrc_raw(vw::DiskImageResourcePtr(opt.raw_image)),\n    rsrc_ortho(vw::DiskImageResourcePtr(opt.ortho_image));\n  if ((rsrc_raw->channels() > 1) || (rsrc_ortho->channels() > 1))\n    vw_throw(ArgumentErr() << \"Error: Input images can only have a single channel!\\n\\n\");\n\n  // Load GeoRef from the ortho image\n  vw::cartography::GeoReference ortho_georef;\n  bool is_good = vw::cartography::read_georeference(ortho_georef, opt.ortho_image);\n  if (!is_good) {\n    vw_throw(ArgumentErr() << \"Error: Cannot read georeference from: \"\n                           << opt.ortho_image << \".\\n\");\n  }\n\n  // Set up the DEM if it was provided.\n  ImageViewRef< PixelMask<float> > dem;\n  vw::cartography::GeoReference dem_georef;\n  bool has_ref_dem = (opt.reference_dem != \"\");\n  bool elevation_change_present = false;\n  if (has_ref_dem) {\n    load_reference_dem(opt, rsrc_ortho, ortho_georef, dem, dem_georef, elevation_change_present);\n  }\n\n\n  // When significant elevation change is present, the homography IP filter is not\n  //  accurate and we need to compensate by relaxing our inlier threshold.\n  const double ELEVATION_INLIER_SCALE = 10;\n  if (elevation_change_present) {\n    // TODO: Decouple threshold from other params!\n    asp::stereo_settings().epipolar_threshold = 150*asp::stereo_settings().ip_inlier_factor * ELEVATION_INLIER_SCALE;\n    //asp::stereo_settings().ip_inlier_factor *= ELEVATION_INLIER_SCALE;\n\n    vw_out() << \"Due to elevation change, increasing ip_inlier_factor to \"\n             << asp::stereo_settings().ip_inlier_factor << std::endl;\n  }\n\n  // Load camera and find IP\n  std::string match_filename = opt.output_cam + \".match\";\n  boost::shared_ptr<CameraModel> cam;\n  load_camera_and_find_ip(opt, rsrc_raw, rsrc_ortho, match_filename, cam);\n\n  // The ortho image file must have the height of the camera above the ground.\n  // This can be over-written from the command line.\n  double cam_height = get_cam_height_estimate(opt);\n  vw_out() << \"Using estimated cam height: \" << cam_height << std::endl;\n\n  std::vector<vw::ip::InterestPoint> raw_ip, ortho_ip;\n  ip::read_binary_match_file(match_filename, raw_ip, ortho_ip);\n  vw::camera::PinholeModel *pcam = dynamic_cast<vw::camera::PinholeModel*>(cam.get());\n  if (pcam == NULL) {\n    vw_throw(ArgumentErr() << \"Expecting a pinhole camera model.\\n\");\n  }\n\n  if (!(pcam->camera_pose() == Quaternion<double>(1, 0, 0, 0))) {\n    // We like to start with a camera pointing along the z axis. That makes life easy.\n    vw_throw(ArgumentErr() << \"Expecting the input camera to have identity rotation.\\n\");\n  }\n\n  /*\n  // There is a vertical flip in the camera/image relationship not included in the camera files!\n  TODO: The camera model is not handling this parameter!!!!!!!\n  Vector3 u_vec, v_vec, w_vec;\n  pcam->coordinate_frame(u_vec, v_vec, w_vec);\n  pcam->set_coordinate_frame(u_vec, -1.0*v_vec, w_vec);\n  */\n\n\n  // Find pairs of points. First point is in the camera coordinate system,\n  // second in the ground coordinate system. This will allow us to transform\n  // the camera to the latter system.\n  // We use two versions of ground points. In one we assume constant height,\n  // in the second we pull the heights from a DEM. If there are enough\n  // of the latter kind of points, we use those.\n  // - The \"2\" variables go with the \"ortho_dem\" variables.\n  std::vector<Vector3> raw_flat_xyz,  ortho_flat_xyz, ortho_flat_llh;\n  std::vector<Vector3> raw_flat_xyz2, ortho_dem_xyz,  ortho_dem_llh;\n  std::vector<Vector2> raw_pixels, raw_pixels2;\n\n  // Estimate the relative camera height from the terrain\n  // - Make sure the camera always has some room to intersect rays!\n  bool use_extra_caution = false;\n  const double MIN_CAM_HEIGHT = 100;\n  double relative_cam_height = cam_height - opt.orthoimage_height;\n  if (relative_cam_height < MIN_CAM_HEIGHT) {\n    vw_out() << \"WARNING: Estimated camera height is too close to the estimated ortho height!\\n\"\n             << \"Forcing the relative camera height to be \" << MIN_CAM_HEIGHT << std::endl;\n    relative_cam_height = MIN_CAM_HEIGHT;\n    use_extra_caution   = true;\n  } else\n    vw_out() << \"Relative cam height = \" << relative_cam_height << std::endl;\n\n  for (size_t ip_iter = 0; ip_iter < raw_ip.size(); ip_iter++) {\n    try {\n      // Get ray from the raw image pixel\n      Vector2 raw_pix(raw_ip[ip_iter].x, raw_ip[ip_iter].y);\n      Vector3 ctr = pcam->camera_center  (raw_pix);\n      Vector3 dir = pcam->pixel_to_vector(raw_pix);\n\n      // We assume the ground is flat. Intersect rays going from camera\n      // with the plane z = cam_height - orthoimage_height.\n      Vector3 point_in = ctr + (relative_cam_height/dir[2])*dir;\n\n      // Get lonlat location for this IP IP.\n      Vector2 ortho_pix(ortho_ip[ip_iter].x, ortho_ip[ip_iter].y);\n      Vector2 ll = ortho_georef.pixel_to_lonlat(ortho_pix);\n\n      // Use given assumed height of orthoimage above the datum.\n      Vector3 llh(ll[0], ll[1], opt.orthoimage_height);\n      Vector3 point_out = ortho_georef.datum().geodetic_to_cartesian(llh);\n\n      raw_flat_xyz.push_back(point_in);\n      ortho_flat_xyz.push_back(point_out);\n      ortho_flat_llh.push_back(llh);\n      raw_pixels.push_back(raw_pix);\n\n      if (!has_ref_dem)\n        continue;\n\n      // Now let's see if the DEM is any good\n\n      PixelMask<float> dem_val;\n      dem_val.invalidate();\n      Vector2 dem_pix = dem_georef.lonlat_to_pixel(ll);\n      double x = dem_pix.x(), y = dem_pix.y();\n      // Is this pixel contained in the DEM?\n      if (0 <= x && x <= dem.cols() - 1 && 0 <= y && y <= dem.rows() - 1) {\n        InterpolationView<EdgeExtensionView< ImageViewRef< PixelMask<float> >,\n                                             ConstantEdgeExtension >,\n                          BilinearInterpolation> interp_dem =\n            interpolate(dem, BilinearInterpolation(), ConstantEdgeExtension());\n        dem_val = interp_dem(x, y);\n        if (is_valid(dem_val)) {\n          Vector3 llh(ll[0], ll[1], dem_val.child());\n          Vector3 point_out = dem_georef.datum().geodetic_to_cartesian(llh);\n          raw_flat_xyz2.push_back(point_in);\n          ortho_dem_xyz.push_back(point_out);\n          ortho_dem_llh.push_back(llh);\n          raw_pixels2.push_back(raw_pix);\n        }\n      } // end considering the reference DEM\n\n    } catch(...) {} // Ignore any points which trigger a camera exception\n  }\n\n  // See if enough points were found\n  const int num_ip_found     = static_cast<int>(raw_pixels.size());\n  const int num_dem_ip_found = static_cast<int>(ortho_dem_xyz.size());\n  if (num_ip_found < opt.min_ip) {\n    if (!opt.keep_match_file) {\n      vw_out() << \"Removing: \" << match_filename << std::endl;\n      boost::filesystem::remove(match_filename);\n    }\n\n    // If we have the estimated model use that, better than nothing.\n    if (opt.camera_estimate != \"\") {\n      PinholeModel est_cam(opt.camera_estimate);\n      update_pinhole_from_nav_estimate(pcam, est_cam);\n    }\n    vw_throw(ArgumentErr() << \"Error: Only found \" << num_ip_found << \" interest points, quitting.\\n\");\n  }\n\n  // See if enough points on the DEM were found\n  bool use_dem_points = false;\n  if (has_ref_dem) {\n    const int MIN_NUM_DEM_POINTS = 8;\n\n    if ((num_ip_found > num_dem_ip_found) && (num_dem_ip_found < MIN_NUM_DEM_POINTS)) {\n      vw_out() << \"Less than \" << MIN_NUM_DEM_POINTS\n               << \" interest points were on the DEM. Igorning the DEM \"\n               << \"and using the constant height: \" << opt.orthoimage_height << \"\\n\";\n    } else { // Use the DEM points\n      use_dem_points = true;\n    }\n  }\n\n  // Get our best estimate of the camera position\n  // - This will be from an affine transform between points or\n  //   just be loaded from an input file.\n  get_estimated_camera_position(opt, use_dem_points, pcam, raw_flat_xyz, ortho_flat_xyz);\n\n  Vector3 gcc_cam_est = pcam->camera_center();\n  Vector3 llh_cam_est = ortho_georef.datum().cartesian_to_geodetic(gcc_cam_est);\n  vw_out() << \"Non-DEM camera center located at \" << llh_cam_est << std::endl;\n\n  if (use_dem_points) {\n\n    // Use a Lev-Mar solver to refine the camera points using the DEM.\n    double refine_error = refine_camera_with_dem_pts(opt, dem_georef, use_extra_caution,\n                                                     ortho_dem_xyz, raw_pixels2, pcam);\n\n    Vector3 llh_cam_dem = ortho_georef.datum().cartesian_to_geodetic(pcam->camera_center());\n    vw_out() << \"DEM enhanced camera center located at \" << llh_cam_dem << std::endl;\n\n    // If an estimate was provided and the DEM optimization moved us too far away from that estimate,\n    //  revert back to the input estimate.  Also revert if the error was too high.\n    const double MAX_REFINE_ERROR = 4000;\n    if (opt.camera_estimate != \"\") {\n      bool revert_camera = false;\n      if (refine_error > MAX_REFINE_ERROR) {\n        vw_out() << \"Refinement error is too high, reverting to input camera estimate.\\n\";\n        revert_camera = true;\n      } else {\n        double dist = norm_2(pcam->camera_center() - gcc_cam_est);\n        vw_out() << \"Camera distance from estimate is \" << dist << std::endl;\n        if (dist > opt.max_translation) {\n          vw_out() << \"Camera solution is too far from the input estimate, reverting to estimate.\\n\";\n          revert_camera = true;\n        }\n      }\n      if (revert_camera) { // Use estimated camera with input camera intrinsics\n        PinholeModel est_cam(opt.camera_estimate);\n        update_pinhole_from_nav_estimate(pcam, est_cam);\n      }\n    }\n\n  } // End of second pass DEM handling case\n\n  vw_out() << \"Writing: \" << opt.output_cam << std::endl;\n  pcam->write(opt.output_cam);\n\n  // Save a gcp file in case we want to use it for something later.\n  if (opt.write_gcp_file) {\n    if (use_dem_points) {\n      write_gcp_file(opt, ortho_dem_llh, raw_pixels2);\n    } else {\n      write_gcp_file(opt, ortho_flat_llh, raw_pixels);\n    }\n  }\n\n  if (!opt.keep_match_file) {\n    vw_out() << \"Removing: \" << match_filename << std::endl;\n    boost::filesystem::remove(match_filename);\n  }\n}\n\n/// If an rgb input image was passed in, convert to a temporary grayscale\n///  image and work on that instead.\n/// - This is useful for the Icebridge case.\nstd::string handle_rgb_input(std::string const& input_path, Options const& opt) {\n\n  boost::shared_ptr<DiskImageResource> rsrc(vw::DiskImageResourcePtr(input_path));\n  if (rsrc->channels() != 3)\n    return input_path; // Nothing to do in this case\n\n  vw_out() << \"Assuming input image is RGB format...\\n\";\n  std::string gray_path = input_path + \"_gray.tif\";\n\n  // Read the misc header strings from the file so we can propogate them\n  // to the output file.\n  std::map<std::string, std::string> keywords;\n  vw::cartography::read_header_strings(*rsrc.get(), keywords);\n\n  vw::cartography::GeoReference georef;\n  bool   has_georef = vw::cartography::read_georeference(georef, input_path);\n  bool   has_nodata = true;\n  double nodata     = 0.0;\n  block_write_gdal_image(gray_path,\n                         weighted_rgb_to_gray(DiskImageView<PixelRGB<uint8> >(input_path)),\n                         has_georef, georef,\n                         has_nodata, nodata, opt,\n                         ProgressCallback::dummy_instance(), keywords);\n  return gray_path;\n\n}\n\nvoid handle_arguments(int argc, char *argv[], Options& opt) {\n  po::options_description general_options(\"\");\n  general_options.add_options()\n    (\"camera-estimate\",   po::value(&opt.camera_estimate)->default_value(\"\"),\n     \"An estimated camera model used for location and pose estimate only.\")\n    (\"max-translation\",   po::value(&opt.max_translation)->default_value(10.0),\n     \"The maximum distance the camera solution is allowed to move from camera-estimate.\")\n    (\"camera-height\",   po::value(&opt.camera_height)->default_value(-1.0),\n     \"The approximate height above the datum, in meters, at which the camera should be. If not specified, it will be read from the orthoimage metadata.\")\n    (\"orthoimage-height\",   po::value(&opt.orthoimage_height)->default_value(0.0),\n     \"The approximate height above the datum, in meters, at which the orthoimage is positioned. We assume flat ground. See also --reference-dem.\")\n    (\"reference-dem\",             po::value(&opt.reference_dem)->default_value(\"\"),\n     \"If provided, extract from this DEM the heights above the ground rather than assuming the value in --orthoimage-height.\")\n    (\"ip-per-tile\",             po::value(&opt.ip_per_tile)->default_value(0),\n     \"How many interest points to detect in each 1024^2 image tile (default: automatic determination).\")\n    (\"ip-detect-method\",po::value(&opt.ip_detect_method)->default_value(1),\n     \"Interest point detection algorithm (0: Integral OBALoG, 1: OpenCV SIFT (default), 2: OpenCV ORB.\")\n    (\"minimum-ip\",             po::value(&opt.min_ip)->default_value(5),\n     \"Don't create a camera model if fewer than this many interest point matches were found.\")\n    (\"ip-inlier-factor\",   po::value(&opt.ip_inlier_factor)->default_value(0.2),\n     \"Interest points inlier factor.\")\n    (\"individually-normalize\",   po::bool_switch(&opt.individually_normalize)->default_value(false)->implicit_value(true),\n     \"Individually normalize the input images instead of using common values.\")\n    (\"skip-image-normalization\", po::bool_switch(&opt.skip_image_normalization)->default_value(false)->implicit_value(true),\n     \"Skip the step of normalizing the values of input images.\")\n    (\"short-circuit\",   po::bool_switch(&opt.short_circuit)->default_value(false)->implicit_value(true),\n     \"No processing, just copy input intrinsic parameters to camera-estimate and write out.\")\n    (\"show-error\",   po::bool_switch(&opt.show_error)->default_value(false)->implicit_value(true),\n     \"Print point error.\")\n    (\"keep-match-file\",   po::bool_switch(&opt.keep_match_file)->default_value(false)->implicit_value(true),\n     \"Don't delete the .match file after running.\")\n    (\"write-gcp-file\",   po::bool_switch(&opt.write_gcp_file)->default_value(false)->implicit_value(true),\n     \"Write a bundle_adjust compatible gcp file.\")\n    (\"crop-reference-dem\", po::bool_switch(&opt.crop_reference_dem)->default_value(false)->implicit_value(true),\n     \"Crop the reference DEM to a generous area to make it faster to load.\");\n\n  general_options.add(vw::GdalWriteOptionsDescription(opt));\n\n  po::options_description positional(\"\");\n  positional.add_options()\n    (\"raw-image\",  po::value(&opt.raw_image))\n    (\"orthoimage\", po::value(&opt.ortho_image))\n    (\"input-cam\",  po::value(&opt.input_cam))\n    (\"output-cam\", po::value(&opt.output_cam));\n\n  po::positional_options_description positional_desc;\n  positional_desc.add(\"raw-image\",  1);\n  positional_desc.add(\"orthoimage\", 1);\n  positional_desc.add(\"input-cam\",  1);\n  positional_desc.add(\"output-cam\", 1);\n\n  std::string usage(\"<raw image> <ortho image> <input pinhole cam> <output pinhole cam> [options]\");\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line(argc, argv, opt, general_options, general_options,\n                            positional, positional_desc, usage,\n                            allow_unregistered, unregistered);\n\n  // Copy the IP settings to the global stereo_settings() object\n  asp::stereo_settings().ip_detect_method         = opt.ip_detect_method;\n  asp::stereo_settings().individually_normalize   = opt.individually_normalize;\n  asp::stereo_settings().skip_image_normalization = opt.skip_image_normalization;\n  asp::stereo_settings().ip_inlier_factor         = opt.ip_inlier_factor;\n  asp::stereo_settings().ip_per_tile              = opt.ip_per_tile;\n\n  if (opt.raw_image.empty())\n    vw_throw(ArgumentErr() << \"Missing input raw image.\\n\" << usage << general_options);\n\n  if (opt.ortho_image.empty())\n    vw_throw(ArgumentErr() << \"Missing input ortho image.\\n\" << usage << general_options);\n\n  if (opt.input_cam.empty())\n    vw_throw(ArgumentErr() << \"Missing input pinhole camera.\\n\" << usage << general_options);\n\n  if (opt.output_cam.empty())\n    vw_throw(ArgumentErr() << \"Missing output pinhole camera.\\n\" << usage << general_options);\n\n  if (opt.camera_estimate != \"\") {\n    if (!boost::filesystem::exists(opt.camera_estimate)) {\n      vw_throw(ArgumentErr() << \"Estimated camera file \" << opt.camera_estimate << \" does not exist!\\n\");\n    }\n  }\n\n  if (opt.short_circuit && opt.camera_estimate == \"\")\n    vw_throw(ArgumentErr() << \"Estimated camera file is required with the short-circuit option.\\n\");\n\n  // Create the output directory\n  vw::create_out_dir(opt.output_cam);\n\n  // Turn on logging to file\n  asp::log_to_file(argc, argv, \"\", opt.output_cam);\n}\n\n// ================================================================================\n\nint main(int argc, char* argv[]) {\n\n  Options opt;\n  try {\n    handle_arguments(argc, argv, opt);\n\n    if (opt.short_circuit) {\n      vw_out() << \"Creating camera without using ortho image.\\n\";\n\n      // Load input camera files\n      vw_out() << \"Loading: \" << opt.input_cam << std::endl;\n      PinholeModel input_cam(opt.input_cam);\n      vw_out() << \"Loading: \" << opt.camera_estimate << std::endl;\n      PinholeModel est_cam(opt.camera_estimate);\n\n      // Copy camera position and pose from estimate camera to input camera\n      input_cam.set_camera_center(est_cam.camera_center());\n      input_cam.set_camera_pose  (est_cam.camera_pose  ());\n\n      // Write to output camera\n      vw_out() << \"Writing: \" << opt.output_cam << std::endl;\n      input_cam.write(opt.output_cam);\n      return 0;\n    }\n\n    opt.raw_image   = handle_rgb_input(opt.raw_image,   opt);\n    opt.ortho_image = handle_rgb_input(opt.ortho_image, opt);\n\n    ortho2pinhole(opt);\n  } ASP_STANDARD_CATCHES;\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/IceBridge/pbs_functions.py",
    "content": "import os, sys, argparse, datetime, time, subprocess, logging, multiprocessing\nimport re, shutil, platform\n\nimport os.path as P\n\n# The path to the ASP python files and tools\nbasepath      = os.path.dirname(os.path.realpath(__file__)) # won't change, unlike syspath\npythonpath    = os.path.abspath(basepath + '/../Python')     # for dev ASP\nlibexecpath   = os.path.abspath(basepath + '/../libexec')    # for packaged ASP\nicebridgepath = os.path.abspath(basepath + '/../IceBridge')  # IceBridge tools\n\n# Prepend to Python path\nsys.path.insert(0, basepath)\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\nsys.path.insert(0, icebridgepath)\n\nimport icebridge_common, pbs_functions, archive_functions, run_helper\nimport asp_system_utils\n\nasp_system_utils.verify_python_version_is_supported()\n\n# Prepend to system PATH\nos.environ[\"PATH\"] = basepath       + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = pythonpath     + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = libexecpath    + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = icebridgepath  + os.pathsep + os.environ[\"PATH\"]\n\n'''Contains functions for working with the PBS job system on the Pleiades supercomputer'''\n\n# Constants\nMAX_PBS_NAME_LENGTH = 15\n\n# Wait this many seconds between checking for job completion\nSLEEP_TIME = 60\n\ndef cleanJobID(jobID):\n    '''Remove the part after the dot, when the input looks like 149691.pbspl233b.'''\n\n    jobID = jobID.strip()\n    m = re.match('^(.*?)\\.', jobID)\n    if m:\n        return m.group(1)\n    else:\n        return jobID\n    \ndef getActiveJobs(user):\n    '''Returns a list of the currently active jobs and their status'''\n\n    # Run qstat command to get a list of all active jobs by this user\n    cmd = ['qstat', '-u', user]\n\n    (textOutput, err, status) = \\\n          asp_system_utils.executeCommand(cmd,\n                                          outputPath=None, \n                                          suppressOutput = True,\n                                          redo=True, \n                                          noThrow=True, \n                                          numAttempts = 1000,\n                                          sleepTime = 60\n                                          )\n    \n    lines = textOutput.split('\\n')\n    \n    # Strip header lines\n    NUM_HEADER_LINES = 3\n    JOBID_INDEX      = 0\n    NAME_INDEX       = 3\n    STATUS_INDEX     = 7\n    if len(lines) <= NUM_HEADER_LINES:\n        return []\n    lines = lines[NUM_HEADER_LINES:]\n\n    # Pick out all the job names and put them in a list\n    jobs = []\n    for line in lines:\n        parts = line.split()\n        if len(parts) < STATUS_INDEX:\n            continue\n        jobID   = cleanJobID(parts[JOBID_INDEX])\n        jobName = parts[NAME_INDEX]\n        status  = parts[STATUS_INDEX]\n        jobs.append((jobID, jobName, status))\n    return jobs\n    \ndef getNumCores(nodeType):\n    '''Return the number of cores available for a given node type'''\n\n    if nodeType == 'wes': # Merope\n        return 12\n    if nodeType == 'san':\n        return 16\n    if nodeType == 'ivy':\n        return 20\n    if nodeType == 'has':\n        return 24\n    if nodeType == 'bro':\n        return 28\n    raise Exception('Unrecognized node type: ' + nodeType)\n\n\ndef submitJob(jobName, queueName, maxHours, logger, minutesInDevelQueue,\n              groupId, nodeType, commandPath, args, logPrefix, priority=None,\n              pythonPath='/u/oalexan1/.local/lib/python2.7/site-packages'):\n    '''Submits a job to the PBS system.\n    Any such job must invoke icebridge_common.switchWorkDir().'''\n    \n    if len(queueName) > MAX_PBS_NAME_LENGTH:\n        raise Exception('Job name \"'+queueName+'\" exceeds the maximum length of ' + str(MAX_PBS_NAME_LENGTH))\n    \n    numCpus = getNumCores(nodeType) # Cores or CPUs?\n    \n    hourString = '\"'+str(maxHours)+':00:00\"'\n\n    # We must create and execute a shell script, to be able to explicitely\n    # direct the output and error to files, without counting\n    # on PBS to manage that, as that one overfloes.\n    # All our outputs and errors will go to the \"verbose\" files,\n    # while PBS will write its summaries, etc, to the other files.\n    shellScriptPath   = logPrefix + '_script.sh'\n    verboseOutputPath = logPrefix + '_verbose_output.log'\n    verboseErrorsPath = logPrefix + '_verbose_errors.log'\n    outputPath        = logPrefix + '_output.log'\n    errorsPath        = logPrefix + '_errors.log'\n    \n    workDir = os.getcwd()\n\n    numAttempts = 1000\n    \n    # For debugging\n    if minutesInDevelQueue > 0:\n      queueName = 'devel'\n      hourString = '00:' + str(minutesInDevelQueue).zfill(2) + ':00'\n      #numAttempts = 1 # For some reason qsub errors out in the devel queue\n      \n    # The \"-m eb\" option sends the user an email when the process begins and when it ends.\n    # The -r n ensures the job does not restart if it runs out of memory.\n\n    # Debug the environment\n    #for v in os.environ.keys():\n    #  logger.info(\"env is \" + v + '=' + str(os.environ[v]))\n\n    # We empty PYTHONSTARTUP and LD_LIBRARY_PATH so that python can function\n    # properly on the nodes. \n    priorityString = ''\n    if priority:\n        priorityString = ' -p ' + str(priority) + ' '\n\n    # Generate the shell command\n    shellCommand = ( \"%s %s > %s 2> %s\\n\" % (commandPath, args,\n                                                 verboseOutputPath, verboseErrorsPath) )\n    with open(shellScriptPath, 'w') as f:\n        f.write(\"#!/bin/bash\\n\")\n        f.write(shellCommand)\n    # Make it executable\n    os.system(\"chmod a+rx \" + shellScriptPath)\n\n    # Run it\n    pbsCommand = ('qsub -r y -q %s -N %s %s -l walltime=%s -W group_list=%s -j oe -e %s -o %s -S /bin/bash -V -C %s -l select=1:ncpus=%d:model=%s  -- /usr/bin/env OIB_WORK_DIR=%s PYTHONPATH=%s PYTHONSTARTUP=\"\" LD_LIBRARY_PATH=\"\" %s' % \n               (queueName, jobName, priorityString, hourString, groupId, errorsPath, outputPath, workDir, numCpus, nodeType, workDir, pythonPath, shellScriptPath))\n#~/repo/python_env/lib/python2.7/site-packages/\n#/u/oalexan1/.local/lib/python2.7/site-packages\n\n    logger.info(pbsCommand)\n    outputPath = None\n    suppressOutput = True\n    redo = True\n    noThrow = True\n    (out, err, status) = \\\n          asp_system_utils.executeCommand(pbsCommand, outputPath, \n                                          suppressOutput, redo, \n                                          noThrow, numAttempts, SLEEP_TIME)\n\n    if status != 0:\n        logger.info(out)\n        logger.info(err)\n        logger.info(\"Status is: \" + str(status))\n        jobID = ''\n    else:\n        jobID = cleanJobID(out)\n\n    logger.info(\"Submitted job named \" + str(jobName) + \" with id \" + str(jobID))\n    \n    return jobID\n    \ndef waitForJobCompletion(jobIDs, logger, name=None):\n  '''Sleep until all of the submitted jobs containing the provided job prefix have completed'''\n  \n  postfix = '.'\n  if name:\n      postfix = ' from flight ' + name + '.'\n  logger.info(\"Began waiting on \" + str(len(jobIDs)) + \" job(s)\" + postfix)\n  \n  jobsRunning = []\n  user = icebridge_common.getUser()\n  stillWorking = True\n  while stillWorking:\n    \n    time.sleep(SLEEP_TIME)\n    stillWorking = False\n    \n    # Look through the list for jobs with the run's date in the name        \n    allJobs = getActiveJobs(user)\n    \n    numActiveJobs = 0\n    for (jobID, jobName, status) in allJobs:\n      if jobID in jobIDs:\n        numActiveJobs += 1\n        # Matching job found so we keep waiting\n        stillWorking = True\n        # Print a message if this is the first time we saw the job as running\n        if (status == 'R') and (jobID not in jobsRunning):\n          jobsRunning.append(jobID)\n          logger.info('Started running job named ' + str(jobName) + ' with id ' + str(jobID))\n          \n    logger.info(\"Waiting on \" + str(numActiveJobs) + \" jobs\" + postfix)\n\n"
  },
  {
    "path": "src/asp/IceBridge/pleiades_job_runner.sh",
    "content": "#!/bin/bash\n\n# Simple shell script for running command line calls\n\necho $PATH\n\n# Grab the only input argument\nTOOL=$1\nCOMMAND=$2\n\necho $TOOL\necho $COMMAND\n\n# TODO: Verify that the log file goes to the correct place\n\n# Call the function\n$TOOL $COMMAND\n\n\n\n\n"
  },
  {
    "path": "src/asp/IceBridge/pleiades_manager.py",
    "content": "#!/usr/bin/env python\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n# Top level program to process all of the Icebridge data.\n# - This program is not sophisticated enough to handle everything and will need to be\n#   superceded by another script.\n\nimport os, sys, argparse, datetime, time, subprocess, logging, multiprocessing\nimport re, shutil, glob\n\nimport os.path as P\n\n# The path to the ASP python files and tools\nbasepath      = os.path.dirname(os.path.realpath(__file__)) # won't change, unlike syspath\npythonpath    = os.path.abspath(basepath + '/../Python')     # for dev ASP\nlibexecpath   = os.path.abspath(basepath + '/../libexec')    # for packaged ASP\nicebridgepath = os.path.abspath(basepath + '/../IceBridge')  # IceBridge tools\n\n# Prepend to Python path\nsys.path.insert(0, basepath)\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\nsys.path.insert(0, icebridgepath)\n\nimport icebridge_common, pbs_functions, archive_functions, run_helper\nimport asp_system_utils, generate_flight_summary\n\nasp_system_utils.verify_python_version_is_supported()\n\n# Prepend to system PATH\nos.environ[\"PATH\"] = basepath       + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = pythonpath     + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = libexecpath    + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = icebridgepath  + os.pathsep + os.environ[\"PATH\"]\n\n#=========================================================================\n# Parameters\n\n# Constants used in this file\n\nCAMGEN_PBS_QUEUE   = 'normal'\nBATCH_PBS_QUEUE    = 'normal'\nBLEND_PBS_QUEUE    = 'normal'\nORTHOGEN_PBS_QUEUE = 'normal'\nLABEL_PBS_QUEUE = 'normal'\n\nGROUP_ID = 's2022'\n\ng_start_time = -1\ng_stop_time  = -1\n\ndef start_time():\n    global g_start_time, g_stop_time\n    g_start_time = time.time()\n    \ndef stop_time(job, logger):\n    global g_start_time, g_stop_time\n    g_stop_time = time.time()\n    wall_s = float(g_stop_time - g_start_time)/3600.0\n    logger.info( (\"Elapsed time for %s is %g hours.\" % (job, wall_s) ) )\n\n\nPFE_NODES = ['san', 'ivy', 'has', 'bro']\n\n#=========================================================================\n\n# 'wes' = Westmere = 12 cores/24 processors, 48 GB mem, SBU 1.0, Launch from mfe1 only!\n# 'san' = Sandy bridge = 16 cores,  32 GB mem, SBU 1.82\n# 'ivy' = Ivy bridge   = 20 cores,  64 GB mem, SBU 2.52\n# 'has' = Haswell      = 24 cores, 128 GB mem, SBU 3.34\n# 'bro' = Broadwell    = 28 cores, 128 GB mem, SBU 4.04\n\ndef getParallelParams(nodeType, task):\n    '''Return (numProcesses, numThreads, tasksPerJob, maxHours) for running a certain task on a certain node type'''\n\n    # Define additional combinations and edit as needed.\n\n    if task == 'camgen':\n        if nodeType == 'san': return (8,  4, 300, 8)\n        if nodeType == 'ivy': return (10, 3, 400, 8)\n        if nodeType == 'bro': return (14, 4, 500, 8)\n        if nodeType == 'wes': return (8,  4, 150, 8) # more jobs will go faster\n    \n    if task == 'dem':\n        if nodeType == 'san': return (2, 8, 70,  8)\n        if nodeType == 'ivy': return (4, 8, 80,  8)\n        if nodeType == 'bro': return (6, 8, 100, 8)\n        if nodeType == 'wes': return (3, 8, 50,  12)\n    \n    if task == 'blend':\n        if nodeType == 'san': return (8,  3, 1200, 6)\n        if nodeType == 'ivy': return (10, 3, 1000, 6)\n        if nodeType == 'bro': return (14, 4, 1400, 6) # 200 seems to finish in 10 minutes\n        if nodeType == 'wes': return (8,  3,  300, 8) # use more nodes so less jobs per node  \n    \n    if task == 'orthogen':\n        if nodeType == 'san': return (8,  4, 350, 8)\n        if nodeType == 'ivy': return (10, 2, 400, 8)\n        if nodeType == 'bro': return (14, 4, 500, 8)\n        if nodeType == 'wes': return (8,  4, 200, 8)\n\n    if task == 'label':\n        if nodeType == 'san': return (8,  4, 200, 8)\n        if nodeType == 'ivy': return (6,  4, 100, 8)\n        if nodeType == 'bro': return (12, 3, 150, 8)\n        if nodeType == 'wes': return (3,  1, 35, 8)\n\n\n    raise Exception('No params defined for node type ' + nodeType + ', task = ' + task)\n\n#=========================================================================\n\ndef getLabelTrainingPath(userName):\n    '''Path to the OSSP label training file'''\n\n    if userName == 'smcmich1':\n        #return '/u/smcmich1/repo/OSSP/training_datasets/icebridge_v3_training_data.h5'\n        return '/u/smcmich1/repo/OSSP/training_datasets/icebridge_v5_training_data.h5'\n    if userName == 'oalexan1':\n        raise Exception('Need to set the label training path!')\n\ndef getEmailAddress(userName):\n    '''Return the email address to use for a user'''\n    \n    if userName == 'smcmich1':\n        return 'scott.mcmichael@gmail.com'\n    if userName == 'oalexan1':\n        return 'oleg.alexandrov@nasa.gov'\n\ndef sendEmail(address, subject, body):\n    '''Send a simple email from the command line'''\n    # Remove any quotes, as that confuses the command line.\n    subject = subject.replace(\"\\\"\", \"\")\n    body    = body.replace(\"\\\"\", \"\")\n    try:\n        cmd = 'mail -s \"' + subject + '\" ' + address + ' <<< \"' + body + '\"'\n        #print(cmd) # too verbose to print\n        os.system(cmd)\n    except Exception as e:\n        print(\"Could not send mail.\")\n        \n#---------------------------------------------------------------------\n\ndef readRunList(path, options):\n    '''Reads a list of runs in this format: GR 20110411.\n       Output is a list of (site, yyyymmdd) pairs.'''\n\n    runList = []\n    with open(path, 'r') as f:\n        for line in f:\n            if line[0] == '#': # Skip comments\n                continue\n            parts = line.split() # Site, yyyymmdd\n            # Set up a class object to help manage the run\n            runList.append(run_helper.RunHelper(parts[0], parts[1], options.unpackDir))\n    return runList\n\ndef addToRunList(path, run):\n    '''Append a run to a list file'''\n    with open(path, 'a') as f:\n        f.write(path[0]+' '+path[1]+'\\n')\n    \ndef getRunsToProcess(allRuns, skipRuns, doneRuns):\n    '''Go through the run lists to get the list of runs that\n       should be processed.'''\n       \n    runList = []\n    for run in allRuns:\n        if (run in skipRuns) or (run in doneRuns):\n            continue\n        runList.append(run)\n    return runList\n\n#---------------------------------------------------------------------\n\n\ndef runFetch(run, options, logger):\n    '''Fetch all the data for a run if it is not already available'''\n\n    logger.info(\"Checking all data is present.\")\n\n    # Check if already done\n    allIsFetched = False\n    if options.skipCheckInputs:\n        allIsFetched = True\n    else:\n        try:\n            # Note that the check below is incomplete, it does not check for Fireball\n            allIsFetched = run.allSourceDataFetched(options.noNavFetch)\n        except Exception as e:\n            allIsFetched = False\n            logger.warning('Caught error checking fetch status.\\n'\n                       + str(e))\n\n    # Fetch the archive from lfe, only in the case the directory is not present\n    if not options.skipTapeFetch:\n        try:\n            archive_functions.retrieveRunData(run, options.unpackDir, options.useTar,\n                                              options.forceTapeFetch, options.skipTapeCameraFetch,\n                                              logger)\n        except Exception as e:\n            pass # return gracefully\n\n    pythonPath = asp_system_utils.which('python')\n    \n    # Fetch whatever is missing directly from NSIDC, and force to have the indices\n    # regenerated in this case. Hopefully just a few files are missing.\n    # - This is likely to have to fetch the large nav data file(s).\n    # Note that we do all conversions as well, sans camera generation. But hopefully the run is clean and all\n    # has been done by now. \n    if not options.noRefetch:\n        logger.info(\"Fetch from NSIDC.\")\n        cmd = (pythonPath + ' ' + icebridge_common.fullPath('full_processing_script.py') + ' --camera-calibration-folder %s --reference-dem-folder %s --site %s --yyyymmdd %s --output-folder %s --refetch --stop-after-fetch --start-frame %d --stop-frame %d' % (options.inputCalFolder, options.refDemFolder, run.site, run.yyyymmdd, run.getFolder(), options.startFrame, options.stopFrame))\n\n        if options.noNavFetch:\n            cmd += ' --no-nav'\n        if options.simpleCameras:\n            cmd += ' --simple-cameras'\n        if options.manyip:\n            cmd += ' --many-ip'\n        if options.cameraMounting:\n            cmd += ' --camera-mount ' + str(options.cameraMounting)\n            \n        if options.inputCalCamera != \"\":\n            cmd += ' --input-calibration-camera ' + options.inputCalCamera\n            \n        if options.skipValidate or options.parallelValidate:\n            # We will do validation in parallel later\n            cmd += ' --skip-validate'\n\n        if not options.noRefetchIndex:\n            cmd += ' --refetch-index'\n            \n        if options.refetchNav:\n            cmd += ' --refetch-nav'\n            \n        logger.info(cmd)\n        os.system(cmd)\n\n    # Rename to the newest convention of computing the timestamp.\n    # This must happen after all is fetched from tape and we\n    # refreshed the indices from NSIDC.\n    run.massRename(options.startFrame, options.stopFrame, logger)\n    \n    # Many of the archived input lidar files have problems, correct them here.\n    # - Remove blank lines and remove trailing commas.\n    # - Would be nice if this step was faster.\n    #cmd = 'find '+run.getLidarFolder()+''' -name \"*.csv\" -exec sed -i 's/,$//;/,/!d' {} \\;'''\n    #print cmd\n    #os.system(cmd)\n    \n    # Don't need to check results, they should be cleaned out in conversion call.\n    run.setFlag('fetch_complete')\n\ndef runConversion(run, options, conversionAttempt, logger):\n    '''Run the conversion tasks for this run on the supercomputer nodes.\n       This will also run through the fetch step to make sure we have everything we need.\n       Note: This function calls itself!'''\n\n    # Check if already done. If we want to validate in parallel, we must still\n    # go through this step, though hopefully it will be very fast then.\n    # TODO: Can have a check if all files have been validated (jpeg, ortho, image, etc),\n    # and then, if all cameras are also present, this step can be skipped.\n    try:\n        if run.conversionIsFinished(options.startFrame, options.stopFrame)   and \\\n           run.checkForImages(options.startFrame, options.stopFrame, logger) and \\\n           (not options.parallelValidate):\n            logger.info('Conversion is already complete.')\n            return\n    except Exception as e:\n        logger.warning('Caught error checking conversion status, re-running conversion.\\n' + str(e))\n        \n    logger.info('Converting data for run ' + str(run))\n\n    # Run just the nav data --> estimated camera conversion on the PFE machine.\n    # - This is single threaded and may take a while but is primarily IO driven.\n    # - We can't start the slower ortho2pinhole processes until this is finished.\n    # - If all of the camera files already exist this call will finish up very quickly.\n    if not options.noNavFetch:\n        logger.info(\"Generating estimated camera files from the navigation files.\")\n        pythonPath = asp_system_utils.which('python')\n        cmd = (pythonPath + ' ' + icebridge_common.fullPath('full_processing_script.py') + ' --camera-calibration-folder %s --reference-dem-folder %s --site %s --yyyymmdd %s --output-folder %s --skip-fetch --stop-after-convert --no-lidar-convert --no-ortho-convert --skip-fast-conversions --start-frame %d --stop-frame %d' % (options.inputCalFolder, options.refDemFolder, run.site, run.yyyymmdd, run.getFolder(), options.startFrame, options.stopFrame))\n    \n        if options.simpleCameras:\n            cmd += ' --simple-cameras'\n        else: # Nav is probably bad, use ortho2pinhole only.\n            cmd += ' --no-nav'\n        if options.skipValidate or options.parallelValidate:\n            cmd += ' --skip-validate'\n        if options.cameraMounting:\n            cmd += ' --camera-mount ' + str(options.cameraMounting)\n        if options.inputCalCamera != \"\":\n            cmd += ' --input-calibration-camera ' + options.inputCalCamera\n            \n        logger.info(cmd)\n        os.system(cmd)    \n        logger.info(\"Finished generating estimated camera files from nav.\")\n    \n    # Retrieve parallel processing parameters\n    (numProcesses, numThreads, tasksPerJob, maxHours) = getParallelParams(options.nodeType, 'camgen')\n    \n    # Split the conversions across multiple nodes using frame ranges\n    # - The first job submitted will be the only one that converts the lidar data.\n    # We will also run validation in parallel.\n    numFrames    = options.stopFrame - options.startFrame + 1\n    numCamgenJobs = numFrames / tasksPerJob\n    if numCamgenJobs < 1:\n        numCamgenJobs = 1\n        \n    outputFolder = run.getFolder()\n\n    scriptPath = icebridge_common.fullPath('full_processing_script.py')\n    args       = (' --skip-fetch --camera-calibration-folder %s --reference-dem-folder %s --site %s --yyyymmdd %s --stop-after-convert --num-threads %d --num-processes %d --output-folder %s' \n                  % ( options.inputCalFolder, options.refDemFolder, run.site, run.yyyymmdd, numThreads, numProcesses, outputFolder))\n    if options.noNavFetch:\n        args += ' --no-nav'\n    if options.simpleCameras:       # This option greatly decreases the conversion run time\n        args += ' --simple-cameras' \n    else: # Nav is probably bad, use ortho2pinhole only.\n        args += ' --no-nav'\n    if options.manyip:\n        args += ' --many-ip'\n    if options.noOrthoConvert:\n        args += ' --no-ortho-convert'\n    if options.cameraMounting:\n        args += ' --camera-mount ' + str(options.cameraMounting)\n\n    if options.inputCalCamera != \"\":\n        args += ' --input-calibration-camera ' + options.inputCalCamera\n\n    baseName = run.shortName() # SITE + YYMMDD = 8 chars, leaves seven for frame digits.\n\n    # Get the location to store the logs    \n    pbsLogFolder = run.getPbsLogFolder()\n    os.system('mkdir -p ' + pbsLogFolder)\n\n    # Submit all the jobs\n    currentFrame = options.startFrame\n    jobIDs = []\n    for i in range(0, numCamgenJobs):\n        jobName    = ('%s%06d%s' % ('C', currentFrame, baseName) ) # C for camera\n        startFrame = currentFrame\n        stopFrame  = currentFrame+tasksPerJob-1\n        if (i == numCamgenJobs - 1):\n            stopFrame = options.stopFrame # Make sure nothing is lost at the end\n\n        thisArgs = (args + ' --start-frame ' + str(startFrame)\n                         + ' --stop-frame  ' + str(stopFrame ) )\n        if i != 0: # Only the first job will convert lidar files\n            thisArgs += ' --no-lidar-convert'\n\n        logPrefix = os.path.join(pbsLogFolder, 'convert_' + jobName)\n        pythonPath = asp_system_utils.which('python')\n        logger.info('Submitting camera generation job: ' + scriptPath + ' ' + thisArgs)\n        jobID = pbs_functions.submitJob(jobName, CAMGEN_PBS_QUEUE, maxHours, logger,\n                                        options.minutesInDevelQueue,\n                                        GROUP_ID,\n                                        options.nodeType, pythonPath,\n                                        scriptPath + \" \" + thisArgs, logPrefix)\n        jobIDs.append(jobID)\n        currentFrame += tasksPerJob\n\n    # Wait for conversions to finish\n    pbs_functions.waitForJobCompletion(jobIDs, logger)\n\n    if options.parallelValidate:\n\n        # Consolidate various validation files done in parallel, to make the subsequent\n        # step faster.\n        validFilesList = icebridge_common.validFilesList(outputFolder,\n                                                         options.startFrame, options.stopFrame)\n        validFilesSet = set()\n        validFilesSet = icebridge_common.updateValidFilesListFromDisk(validFilesList, validFilesSet)\n        allValidFiles = glob.glob(os.path.join(outputFolder,\n                                               icebridge_common.validFilesPrefix() + '*'))\n        for fileName in allValidFiles:\n            validFilesSet = icebridge_common.updateValidFilesListFromDisk(fileName, validFilesSet)\n        icebridge_common.writeValidFilesList(validFilesList, validFilesSet)\n\n        # Now we will refetch and reprocess all files that were not\n        # valid so far. Hopefully not too many. This must be on a head\n        # node to be able to access the network. We don't do any orthoconvert\n        # here as that one is too time-consuming\n        logger.info(\"Refetch and process any invalid files.\")\n        pythonPath = asp_system_utils.which('python')\n        cmd = (pythonPath + ' ' + icebridge_common.fullPath('full_processing_script.py') + ' --refetch --camera-calibration-folder %s --reference-dem-folder %s --site %s --yyyymmdd %s --output-folder %s --stop-after-convert --no-ortho-convert --start-frame %d --stop-frame %d --num-threads %d --num-processes %d' % (options.inputCalFolder, options.refDemFolder, run.site, run.yyyymmdd, run.getFolder(), options.startFrame, options.stopFrame, numThreads, numProcesses))\n        if options.noNavFetch:\n            cmd += ' --no-nav'\n        if options.simpleCameras:\n            cmd += ' --simple-cameras'\n        if options.manyip:\n            cmd += ' --many-ip'\n        if options.noOrthoConvert:\n            cmd += ' --no-ortho-convert'\n        if options.cameraMounting:\n            cmd += ' --camera-mount ' + str(options.cameraMounting)\n        if options.inputCalCamera != \"\":\n            cmd += ' --input-calibration-camera ' + options.inputCalCamera\n            \n        logger.info(cmd)\n        os.system(cmd)\n\n        # See if there are any new files for which we need to run ortho2pinhole on some node\n        logger.info(\"See for which files to redo ortho.\")\n        (orthoList, numFrames) = \\\n                    icebridge_common.orthoListToRerun(validFilesSet, outputFolder,\n                                                      options.startFrame, options.stopFrame)\n        \n        logger.info(\"Number of cameras to regenerate using ortho2pinhole: \" + str(numFrames))\n        if numFrames > 0:\n            if numFrames > tasksPerJob and conversionAttempt == 0:\n                # Too many frames, just rerun all jobs\n                conversionAttempt = 1\n                logger.info(\"Re-running conversion with many nodes.\")\n                runConversion(run, options, conversionAttempt, logger)\n                return\n            \n            logger.info(\"Re-running conversion with one node.\")\n            cmd = (icebridge_common.fullPath('full_processing_script.py') + ' --skip-fetch --skip-validate --skip-fast-conversions --stop-after-convert --camera-calibration-folder %s --reference-dem-folder %s --site %s --yyyymmdd %s --output-folder %s --start-frame %d --stop-frame %d --num-threads %d --num-processes %d --frames-file %s' % (options.inputCalFolder, options.refDemFolder, run.site, run.yyyymmdd, run.getFolder(), options.startFrame, options.stopFrame, numThreads, numProcesses, orthoList))\n            if options.noNavFetch:\n                cmd += ' --no-nav'\n            if options.simpleCameras:\n                cmd += ' --simple-cameras'\n            if options.manyip:\n                cmd += ' --many-ip'\n            if options.noOrthoConvert:\n                cmd += ' --no-ortho-convert'\n            if options.cameraMounting:\n                cmd += ' --camera-mount ' + str(options.cameraMounting)\n            if options.inputCalCamera != \"\":\n                cmd += ' --input-calibration-camera ' + options.inputCalCamera\n\n            #logger.info(cmd)\n            jobIDs = []\n            jobName    = ('%s%06d%s' % ('C', 0, baseName) ) # C for camera\n            logPrefix = os.path.join(pbsLogFolder, 'convert_' + jobName)\n            logger.info('Submitting camera generation job: ' + cmd)\n            pythonPath = asp_system_utils.which('python')\n            jobID = pbs_functions.submitJob(jobName, CAMGEN_PBS_QUEUE, maxHours, logger,\n                                            options.minutesInDevelQueue,\n                                            GROUP_ID,\n                                            options.nodeType, pythonPath,\n                                            cmd, logPrefix)\n            jobIDs.append(jobID)\n            \n            # Wait for conversions to finish\n            pbs_functions.waitForJobCompletion(jobIDs, logger, baseName)\n\n        logger.info(\"Finished refetching and reprocessing.\")\n\n    # Check the results\n    # - If we didn't get everything keep going and process as much as we can.\n    success = False\n    try:\n        success = run.conversionIsFinished(options.startFrame, options.stopFrame, verbose = True)\n    except Exception as e:\n        logger.warning('Caught error checking conversion status.\\n' + str(e))\n\n    if not success:\n        #raise Exception('Failed to convert run ' + str(run))\n        logger.warning('Could not fully convert run ' + str(run))\n\n    run.setFlag('conversion_complete')\n\ndef generateBatchList(run, options, listPath, logger):\n    '''Generate a list of all the processing batches required for a run'''\n\n    logger.info(\"Generate batch list: \" + listPath)\n    \n    refDemName = icebridge_common.getReferenceDemName(run.site)\n    refDemPath = os.path.join(options.refDemFolder, refDemName)\n\n    # Retrieve parallel processing parameters\n    (numProcesses, numThreads, tasksPerJob, maxHours) = getParallelParams(options.nodeType, 'dem')\n\n    # No actual processing is being done here so it can run on the PFE\n    # - No start/stop frames here, always generate the full list so it is stable.\n    pythonPath = asp_system_utils.which('python')\n    scriptPath = icebridge_common.fullPath('full_processing_script.py')\n    cmd       = ('%s %s --camera-calibration-folder %s --reference-dem-folder %s --site %s --yyyymmdd %s --skip-fetch --skip-convert --num-threads %d --num-processes %d --output-folder %s --bundle-length %d --log-batches ' \n                  % (pythonPath, scriptPath, options.inputCalFolder, options.refDemFolder, run.site, run.yyyymmdd, numThreads, numProcesses, run.getFolder(), options.bundleLength))\n\n    # For full runs we must cleanup, as otherwise we'll run out of space\n    if not options.skipCleanup:\n        cmd += ' --cleanup'\n\n    if options.noNavFetch:\n        cmd += ' --no-nav'\n    if options.simpleCameras:\n        cmd += ' --simple-cameras'\n    if options.manyip:\n        cmd += ' --many-ip'\n    if options.cameraMounting:\n        cmd += ' --camera-mount ' + str(options.cameraMounting)\n    if options.inputCalCamera != \"\":\n        cmd += ' --input-calibration-camera ' + options.inputCalCamera\n        \n# TODO: Find out what takes so long here!\n# - Also fix the logging!\n\n    logger.info(cmd)\n    os.system(cmd)\n\n\ndef getOutputFolderFromBatchCommand(batchCommand):\n    '''Extract the output folder from a line in the batch file'''\n    m = re.match('^.*?--output-folder\\s+(.*?)\\s', batchCommand)\n    if not m:\n        raise Exception('Failed to extract output folder from: ' + batchCommand)\n    return m.group(1)\n\n# TODO: Share code with the other function\ndef filterBatchJobFile(run, batchListPath, logger):\n    '''Make a copy of the batch list file which only contains incomplete batches.'''\n    \n    runFolder = run.getFolder()\n    \n    newBatchPath = batchListPath + '_onlyFailed.txt'\n\n    # Make sure each batch produced the aligned DEM file\n    #batchOutputName = 'out-blend-DEM.tif'\n    batchOutputName = 'out-align-DEM.tif'\n    #batchOutputName = 'out-ortho.tif'\n    \n    fIn = open(batchListPath, 'r')\n    fOut = open(newBatchPath, 'w')\n    for line in fIn:\n        outputFolder = getOutputFolderFromBatchCommand(line)\n        targetPath   = os.path.join(outputFolder, batchOutputName)\n        if not os.path.exists(targetPath):\n            fOut.write(line)\n    fIn.close()\n    fOut.close()\n\n    return newBatchPath\n    \ndef submitBatchJobs(run, options, batchListPath, logger):\n    '''Read all the batch jobs required for a run and distribute them across job submissions.\n       Returns the common string in the job names.'''\n\n    if not os.path.exists(batchListPath):\n        logger.error('Failed to generate batch list file: ' + batchListPath)\n        raise Exception('Failed to generate batch list file: ' + batchListPath)\n\n    # Retrieve parallel processing parameters\n    (numProcesses, numThreads, tasksPerJob, maxHours) = getParallelParams(options.nodeType, 'dem')\n\n    # Read the batch list\n    logger.info(\"Reading batch list: \" + batchListPath)\n    batchLines = []\n    with open(batchListPath, 'r') as f:\n        text = f.read()\n        batchLines = text.split('\\n')\n\n    # Find all lines in the batch list in range\n    framesInRange = []\n    for line in batchLines:\n        if line == \"\":\n            continue\n        (begFrame, endFrame) = icebridge_common.getFrameRangeFromBatchFolder(line)\n        if begFrame >= options.startFrame and begFrame < options.stopFrame:\n            framesInRange.append(begFrame)\n\n    frameGroups  = icebridge_common.partitionArray(framesInRange, tasksPerJob)\n    numBatches   = len(framesInRange)\n    numBatchJobs = len(frameGroups)\n    \n    logger.info( (\"Num batches: %d, tasks per job: %d, number of jobs: %d\" %\n                  (numBatches, tasksPerJob, numBatchJobs) ) )\n\n    baseName = run.shortName() # SITE + YYMMDD = 8 chars, leaves seven for frame digits.\n\n    # Call the tool which just executes commands from a file\n    scriptPath = icebridge_common.fullPath('multi_process_command_runner.py')\n\n    outputFolder = run.getFolder()\n    pbsLogFolder = run.getPbsLogFolder()\n\n    jobIDs = []\n    for group in frameGroups:\n        if len(group) == 0:\n            continue\n        firstFrame = group[0]\n        lastFrame  = group[-1] + 1 # go one beyond\n        jobName    = ('%s%06d%s' % ('D', firstFrame, baseName) ) # D for DEM\n\n        # Specify the range of lines in the file we want this node to execute\n        args = ('--command-file-path %s --start-frame %d --stop-frame %d --num-processes %d' % \\\n                (batchListPath, firstFrame, lastFrame, numProcesses))\n\n        if options.redoFrameList != \"\":\n            args += ' --force-redo-these-frames ' + options.redoFrameList\n        \n        logPrefix = os.path.join(pbsLogFolder, 'batch_' + jobName)\n        logger.info('Submitting DEM creation job: ' + scriptPath + ' ' + args)\n        pythonPath = asp_system_utils.which('python')\n        jobID = pbs_functions.submitJob(jobName, BATCH_PBS_QUEUE, maxHours, logger,\n                                        options.minutesInDevelQueue,\n                                        GROUP_ID,\n                                        options.nodeType, pythonPath,\n                                        scriptPath + ' ' + args, logPrefix)\n        jobIDs.append(jobID)\n\n    # Waiting on these jobs happens outside this function\n    return (baseName, jobIDs)\n\ndef launchJobs(run, mode, options, logger):\n    '''Run a blend, ortho gen, or label job.'''\n    \n    # TODO: Also merge with the logic for creating a camera file.\n    \n    logger.info('Running task ' + mode + ' for run ' + str(run))\n    \n    # Retrieve parallel processing parameters\n    (numProcesses, numThreads, tasksPerJob, maxHours) = getParallelParams(options.nodeType, mode)\n    \n    # Split the jobs across multiple nodes using frame ranges\n    numFrames = options.stopFrame - options.startFrame + 1\n    numJobs   = numFrames / tasksPerJob\n    if numJobs < 1:\n        numJobs = 1\n        \n    logger.info( (\"Num frames: %d, tasks per job: %d, number of %s jobs: %d\" %\n                  (numFrames, tasksPerJob, mode, numJobs) ) )\n    \n    outputFolder = run.getFolder()\n\n    scriptPath = \"\"\n    extraArgs  = \"\"\n    jobTag     = \"\"\n    priority   = 5\n    if mode == 'orthogen':\n        scriptPath = icebridge_common.fullPath('gen_ortho.py')\n        queueName  = ORTHOGEN_PBS_QUEUE\n        jobTag     = 'O'\n        extraArgs  = ' --bundle-length ' + str(options.bundleLength) + \\\n                     ' --camera-mounting ' + str(options.cameraMounting)\n    elif mode == 'blend':\n        scriptPath = icebridge_common.fullPath('blend_dems.py')\n        queueName  = BLEND_PBS_QUEUE\n        jobTag     = 'B'\n        extraArgs  = ' --blend-to-fireball-footprint --bundle-length ' + str(options.bundleLength)\n        if options.computeDiffToPrev:\n            extraArgs += ' --compute-diff-to-prev-dem'\n    elif mode == 'label':\n        scriptPath = icebridge_common.fullPath('label_images.py')\n        queueName  = LABEL_PBS_QUEUE\n        jobTag     = 'L'\n        priority   = 0 # Make these slightly lower priority than the other jobs.\n                       # May need to experiment with these numbers.\n        extraArgs  = ' --training ' + getLabelTrainingPath(icebridge_common.getUser())\n    else:\n        raise Exception(\"Unknown mode: \" + mode)\n    args = (('--site %s --yyyymmdd %s --num-threads %d --num-processes %d ' + \\\n            '--output-folder %s %s ') \n            % (run.site, run.yyyymmdd, numThreads, numProcesses, outputFolder, extraArgs))\n    \n    baseName = run.shortName() # SITE + YYMMDD = 8 chars, leaves seven for frame digits.\n\n    # Get the location to store the logs    \n    pbsLogFolder = run.getPbsLogFolder()\n\n    # Submit all the jobs\n    jobNames = []\n    jobIDs   = []\n    currentFrame = options.startFrame\n    for i in range(0, numJobs):\n        jobName    = ('%s%06d%s' % (jobTag, currentFrame, baseName) ) # 'B'lend or 'O'rtho\n        startFrame = currentFrame\n        stopFrame  = currentFrame+tasksPerJob # Last frame passed to the tool is not processed\n        if (i == numJobs - 1):\n            stopFrame = options.stopFrame # Make sure nothing is lost at the end\n        thisArgs = (args + ' --start-frame ' + str(startFrame) + ' --stop-frame ' + str(stopFrame) )\n        logPrefix = os.path.join(pbsLogFolder, mode + '_' + jobName)\n        logger.info('Submitting job: ' + scriptPath +  ' ' + thisArgs)\n        pythonPath = asp_system_utils.which('python')\n        jobID = pbs_functions.submitJob(jobName, queueName, maxHours, logger,\n                                        options.minutesInDevelQueue, GROUP_ID,\n                                        options.nodeType, pythonPath,\n                                        scriptPath + ' ' + thisArgs, logPrefix, priority, pythonPath)\n\n        jobNames.append(jobName)\n        jobIDs.append(jobID)\n        currentFrame += tasksPerJob\n\n    return (baseName, jobNames, jobIDs)\n\ndef checkResultsForType(run, options, batchListPath, batchOutputName, logger):\n    '''Check how many of the specified file type we produced'''\n\n    numNominal  = 0\n    numProduced = 0\n\n    (minFrame, maxFrame) = run.getFrameRange()\n\n    with open(batchListPath, 'r') as f:\n        for line in f:\n\n            outputFolder = getOutputFolderFromBatchCommand(line)\n            (begFrame, endFrame) = icebridge_common.getFrameRangeFromBatchFolder(outputFolder)\n\n            if begFrame < options.startFrame:\n                continue\n            if begFrame >= options.stopFrame:\n                continue\n            \n            if begFrame >= maxFrame:\n                # This is necessary. For the last valid frame, there is never a DEM.\n                continue\n            \n            targetPath  = os.path.join(outputFolder, batchOutputName)\n            numNominal += 1\n            if os.path.exists(targetPath):\n                numProduced += 1\n            else:\n                logger.info('Did not find: ' + targetPath)\n                if not os.path.exists(outputFolder):\n                    logger.error('Check output folder position in batch log file!')\n\n    return (numNominal, numProduced)\n\ndef checkLabelResults(run, options, logger):\n    '''Get a count of the label files produced in a frame range.'''\n    numNominal  = 0\n    numProduced = 0\n    numOrtho    = 0\n\n    (minFrame, maxFrame) = run.getFrameRange()\n\n    labelFolder = run.getLabelFolder()\n    orthoFolder = run.getOrthoFolder()\n    jpegFolder  = run.getJpegFolder()\n\n    for frame in range(minFrame, maxFrame+1):\n        labelFile  = icebridge_common.makeLabelFileName     (run, frame)\n        orthoFile  = icebridge_common.makeLabelOrthoFileName(run, frame)\n        jpegFile   = icebridge_common.makeJpegFileName      (run, frame)\n        labelPath = os.path.join(labelFolder, labelFile)\n        orthoPath = os.path.join(orthoFolder, orthoFile)\n        jpegPath  = os.path.join(jpegFolder,  jpegFile )\n\n        numNominal += 1\n        if os.path.exists(labelPath):\n            numProduced += 1\n\n            if os.path.exists(orthoPath): # Won't exist if the label doesn't\n                numOrtho += 1\n            else:\n                logger.info('Did not find: ' + orthoPath)\n        else:\n            if os.path.exists(jpegPath):\n                logger.info('Did not find: ' + labelPath)\n            else:\n                logger.info('Jpeg missing for file: ' + labelPath)\n\n    return (numNominal, numProduced, numOrtho)\n\n\ndef checkResults(run, options, logger, batchListPath):\n    \n    logger.info(\"Checking the results.\")\n\n    # TODO: Some existing functionlity below can be integrated better.\n    \n    runFolder = run.getFolder()\n    \n    packedErrorLog = os.path.join(runFolder, 'packedErrors.log')\n    with open(packedErrorLog, 'w') as errorLog:\n    \n        # Look for errors in the log files\n        # TODO: These log files should be in the batch folders now!\n        pbsLogFolder = run.getPbsLogFolder()\n        logFileList = os.listdir(pbsLogFolder)\n        logFileList = [os.path.join(pbsLogFolder, x) for x in logFileList]\n        errorCount = 0\n        errorWords = ['but crn has', 'LD_PRELOAD cannot be preloaded'] # TODO: Add more!\n        for log in logFileList:\n            with open(log, 'r') as f:\n                for line in f:\n                    hasError = False\n                    for word in errorWords:\n                        if word in line:\n                            hasError = True\n                    # Count up the errors and copy them to the packed error log.\n                    if hasError:\n                        errorLog.write(line)\n                        errorCount += 1\n    logger.info('Counted ' + str(errorCount) + ' errors in log files!')\n\n    # Produced DEMs\n    (numNominalDems, numProducedDems) = checkResultsForType(run, options,\n                                                            batchListPath,\n                                                            icebridge_common.blendFileName(),\n                                                            logger)\n    \n    # Produced orthos\n    (numNominalOrthos, numProducedOrthos) = checkResultsForType(run, options,\n                                                                batchListPath,\n                                                                icebridge_common.orthoFileName(),\n                                                                logger)\n\n    # Produced labels\n    (numNominalLabels, numProducedLabels, numLabelOrthos) = checkLabelResults(run, options, logger)\n\n\n    resultText = \"\"\n    resultText += ('Created %d out of %d output DEMs. ' % \n                   (numProducedDems, numNominalDems))\n    resultText += ('Created %d out of %d output ortho images. ' % \n                   (numProducedOrthos, numNominalOrthos))\n    resultText += ('Created %d out of %d output label files. ' %\n                   (numProducedLabels, numNominalLabels))\n    resultText += ('Created %d out of %d output label ortho files. ' %\n                   (numLabelOrthos, numNominalLabels))\n    resultText += ('Detected %d errors. ' % \n                   (errorCount))\n\n    # Load index of fireball DEMs for comparison\n    fireballDems = {}\n    try:\n        allFireballDems = icebridge_common.getCorrectedFireballDems(run.getFolder())\n        for frame in allFireballDems.keys():\n            if frame < options.startFrame or frame >= options.stopFrame:\n                continue\n            fireballDems[frame] = allFireballDems[frame]\n    except Exception as e:\n        # No fireball\n        logger.info(str(e))\n\n    numFireballDems = len(fireballDems.keys())\n    \n    alignedDems = run.existingFilesDict(icebridge_common.alignFileName(),\n                                        options.startFrame, options.stopFrame)\n    numAlignedDems = len(alignedDems.keys())\n    \n    blendedDems = run.existingFilesDict(icebridge_common.blendFileName(),\n                                        options.startFrame, options.stopFrame)\n    numBlendedDems = len(blendedDems.keys())\n    \n    orthos = run.existingFilesDict(icebridge_common.orthoFileName(),\n                                   options.startFrame, options.stopFrame)\n    numOrthos = len(orthos.keys())\n\n    numMissingBlended = 0\n    for frame in sorted(alignedDems.keys()):\n        if frame not in blendedDems.keys():\n            logger.info(\"Found aligned DEM but no blended DEM for frame: \" + str(frame))\n            numMissingBlended += 1\n\n    numMissingOrthos = 0\n    for frame in sorted(blendedDems.keys()):\n        if frame not in orthos.keys():\n            logger.info(\"Found blended DEM but no ortho for frame: \" + str(frame))\n            numMissingOrthos += 1\n\n    numMissingAligned = 0\n    for frame in sorted(fireballDems.keys()):\n        if not frame in blendedDems.keys():\n            logger.info(\"Found fireball DEM but no blended DEM for frame: \" + str(frame))\n            numMissingAligned += 1\n\n    vals = [\"Number of aligned DEMs: \" + str(numAlignedDems),\n            \"Number of blended DEMs: \" + str(numBlendedDems),\n            \"Number of ortho images: \" + str(numOrthos),\n            \"Number of fireball DEMs: \" + str(numFireballDems),\n            \"Aligned DEMs without blended DEMs: \" + str(numMissingBlended),\n            \"Blended DEMs without ortho images: \" + str(numMissingOrthos),\n            \"Fireball DEMs with no corresponding blended DEM: \" + str(numMissingAligned)\n            ]\n    \n    resultText += \"\\n\" + \"\\n\".join(vals)\n\n    logger.info(resultText)\n    \n    labelsWereSuccess = (numProducedLabels == numNominalLabels)\n\n    runWasSuccess = False\n    if (numProducedDems == numNominalDems) and \\\n           (numProducedOrthos == numNominalOrthos) and \\\n           (errorCount == 0):\n        runWasSuccess =  True\n\n    if options.generateLabels: # Labels are probably run by themselves.\n        runWasSuccess = labelsWereSuccess\n        \n    return (runWasSuccess, resultText)\n\ndef checkRequiredTools():\n    '''Verify that we have all the tools we will be calling during the script.'''\n\n    scripts = ['full_processing_script.py',\n               'multi_process_command_runner.py',\n               'merge_orbitviz.py',\n               'process_icebridge_run.py',\n               'process_icebridge_batch.py',\n               'lvis2kml.py', 'blend_dems.py', 'gen_ortho.py']\n    tools  = ['ortho2pinhole', 'camera_footprint', 'bundle_adjust',\n              'stereo', 'point2dem', 'mapproject']\n    \n    for tool in tools:\n        asp_system_utils.checkIfToolExists(tool)\n\n    for script in scripts:\n        if not os.path.exists(icebridge_common.fullPath(script)):\n            raise Exception(\"Could not find: \" + script)\n\ndef main(argsIn):\n\n    try:\n        usage = '''usage: pleiades_manager.py <options> '''\n        parser = argparse.ArgumentParser(usage=usage)\n\n        parser.add_argument(\"--base-dir\",  dest=\"baseDir\", default=os.getcwd(),\n                            help=\"Where all the inputs and outputs are stored.\")\n\n        parser.add_argument(\"--unpack-dir\",  dest=\"unpackDir\", default=None,\n                            help=\"Where to unpack the data.\")\n\n        parser.add_argument(\"--yyyymmdd\",  dest=\"yyyymmdd\", default=None,\n                            help=\"Specify the year, month, and day in one YYYYMMDD string.\")\n\n        parser.add_argument(\"--site\",  dest=\"site\", required=True,\n                            help=\"Name of the location of the images (AN, GR, or AL)\")\n\n        parser.add_argument(\"--node-type\",  dest=\"nodeType\", default='ivy',\n                            help=\"Node type to use (wes[mfe], san, ivy, has, bro)\")\n\n        # Debug option\n        parser.add_argument('--minutes-in-devel-queue', dest='minutesInDevelQueue', type=int,\n                            default=0,\n                            help=\"If positive, submit to the devel queue for this many minutes.\")\n\n        parser.add_argument('--start-frame', dest='startFrame', type=int,\n                            default=icebridge_common.getSmallestFrame(),\n                            help=\"Frame to start with.  Leave this and stop-frame blank to \" + \\\n                            \"process all frames.\")\n\n        parser.add_argument('--stop-frame', dest='stopFrame', type=int,\n                            default=icebridge_common.getLargestFrame(),\n                            help='Frame to stop on.')\n\n        parser.add_argument(\"--camera-calibration-folder\",  dest=\"inputCalFolder\", default=None,\n                          help=\"The folder containing camera calibration.\")\n        parser.add_argument(\"--input-calibration-camera\",  dest=\"inputCalCamera\", default=\"\",\n                            help=\"Instead of looking up the calibrated camera in the calibration folder, use this one.\")\n        \n        parser.add_argument(\"--reference-dem-folder\",  dest=\"refDemFolder\", default=None,\n                          help=\"The folder containing DEMs that created orthoimages.\")\n\n        parser.add_argument('--bundle-length', dest='bundleLength', default=2,\n                          type=int, help=\"The number of images to bundle adjust and process in a single batch.\")\n\n        parser.add_argument(\"--recompute-batch-file\", action=\"store_true\", \n                            dest=\"recomputeBatches\", default=False, \n                            help=\"Recompute an existing batch file.\")\n\n        parser.add_argument(\"--no-refetch\", action=\"store_true\", \n                            dest=\"noRefetch\", default=False, \n                            help=\"Do not attempt to refetch from NSIDC.\")\n        \n        parser.add_argument(\"--no-refetch-index\", action=\"store_true\", \n                            dest=\"noRefetchIndex\", default=False, \n                            help=\"Do not refetch the index from NSIDC.\")\n \n        parser.add_argument(\"--refetch-nav\", action=\"store_true\", \n                            dest=\"refetchNav\", default=False, \n                            help=\"Force refetch the nav data.\")\n\n        parser.add_argument(\"--skip-check-inputs\", action=\"store_true\", \n                            dest=\"skipCheckInputs\", default=False, \n                            help=\"Skip checking if files exist. This can be very slow for many files.\")\n\n        parser.add_argument(\"--skip-completed-batches\", action=\"store_true\", \n                            dest=\"failedBatchesOnly\", default=False, \n                            help=\"Don't reprocess completed batches.\")\n\n        parser.add_argument(\"--force-redo-these-frames\",  dest=\"redoFrameList\", default=\"\",\n                          help=\"For each frame in this file (stored one per line) within the current frame range, delete the batch folder and redo the batch (only applies to batch processing).\")\n\n        parser.add_argument(\"--use-tar\", action=\"store_true\", dest=\"useTar\", default=False, \n                            help=\"Fetch from lfe using tar instead of shift.\")\n\n        parser.add_argument(\"--skip-fetch\", action=\"store_true\", dest=\"skipFetch\", default=False, \n                            help=\"Don't fetch.\")\n\n        parser.add_argument(\"--skip-tape-fetch\", action=\"store_true\", dest=\"skipTapeFetch\", default=False, \n                            help=\"Don't fetch from tape, go directly to NSIDC. With this, one must not skip the convert step, as then subsequent steps will fail.\")\n        \n        parser.add_argument(\"--force-tape-fetch\", action=\"store_true\", dest=\"forceTapeFetch\", default=False, \n                            help=\"Fetch from tape even if a partial run directory is alrady present.\")\n        parser.add_argument(\"--skip-fetch-camera-from-tape\", action=\"store_true\", dest=\"skipTapeCameraFetch\", default=False, \n                            help=\"Don't fetch any archived cameras, create them from scratch.\")\n\n        parser.add_argument(\"--skip-convert\", action=\"store_true\", dest=\"skipConvert\",\n                            default=False, \n                            help=\"Don't convert.\")\n\n        parser.add_argument(\"--skip-archive-cameras\", action=\"store_true\",\n                            dest=\"skipArchiveCameras\", default=False,\n                            help=\"Skip archiving the cameras.\")\n\n        parser.add_argument(\"--skip-batch-gen\", action=\"store_true\",\n                            dest=\"skipBatchGen\", default=False,\n                            help=\"Skip generating batches.\")\n        \n        parser.add_argument(\"--skip-process\", action=\"store_true\",\n                            dest=\"skipProcess\", default=False, \n                            help=\"Don't process the batches.\")\n        \n        parser.add_argument(\"--skip-blend\", action=\"store_true\", dest=\"skipBlend\", default=False, \n                            help=\"Skip blending.\")\n\n        parser.add_argument(\"--skip-ortho-gen\", action=\"store_true\", dest=\"skipOrthoGen\",\n                            default=False, help=\"Skip ortho image generation.\")\n\n        parser.add_argument(\"--skip-check-outputs\", action=\"store_true\", dest=\"skipCheckOutputs\",\n                            default=False, \n                            help=\"Skip checking the outputs.\")\n\n        parser.add_argument(\"--skip-report\", action=\"store_true\", dest=\"skipReport\",\n                            default=False, \n                            help=\"Skip invoking the flight summary tool.\")\n\n        parser.add_argument(\"--skip-kml\", action=\"store_true\", dest=\"skipKml\", default=False, \n                            help=\"Skip kml gen when doing a flight summary report.\")\n\n        parser.add_argument(\"--skip-archive-aligned-cameras\", action=\"store_true\",\n                            dest=\"skipArchiveAlignedCameras\", default=False,\n                            help=\"Skip archiving the aligned cameras.\")\n\n        parser.add_argument(\"--skip-archive-orthos\", action=\"store_true\",\n                            dest=\"skipArchiveOrthos\", default=False,\n                            help=\"Skip archiving the generated ortho images.\")\n\n        parser.add_argument(\"--skip-archive-summary\", action=\"store_true\",\n                            dest=\"skipArchiveSummary\", default=False,\n                            help=\"Skip archiving the summary.\")\n\n        parser.add_argument(\"--skip-archive-run\", action=\"store_true\",\n                            dest=\"skipArchiveRun\", default=False,\n                            help=\"Skip archiving the DEMs.\")\n\n        parser.add_argument(\"--skip-cleanup\", action=\"store_true\",\n                            dest=\"skipCleanup\", default=False, \n                            help=\"Don't cleanup extra files from a run.\")\n\n        parser.add_argument(\"--skip-email\", action=\"store_true\", \n                            dest=\"skipEmail\", default=False, \n                            help=\"Don't send email.\")\n\n        parser.add_argument(\"--no-nav\", action=\"store_true\", dest=\"noNavFetch\",\n                            default=False, help=\"Don't fetch or convert the nav data.\")\n\n        parser.add_argument('--many-ip', action='store_true', default=False, dest='manyip',  \n                          help='If to use a lot of IP in bundle adjustment from the beginning.')\n\n        parser.add_argument(\"--no-ortho-convert\", action=\"store_true\", dest=\"noOrthoConvert\",\n                          default=False,\n                          help=\"Skip generating camera models in the conversion step.\")\n\n        parser.add_argument(\"--simple-cameras\", action=\"store_true\", dest=\"simpleCameras\",\n                            default=False, help=\"Don't use ortho images to refine camera models.\")\n\n        parser.add_argument(\"--camera-mounting\", dest=\"cameraMounting\", default=0, \n              help='0=right-forwards, 1=left-forwards, 2=top-forwards, 3=bottom-forwards.')\n        \n        parser.add_argument(\"--skip-validate\", action=\"store_true\", dest=\"skipValidate\",\n                            default=False, help=\"Don't validate the input data.\")\n\n        parser.add_argument(\"--compute-diff-to-prev-dem\", action=\"store_true\",\n                            dest=\"computeDiffToPrev\", default=False,\n                            help=\"Compute the absolute difference between the current DEM \" + \\\n                            \"and the one before it when blending.\")\n\n        parser.add_argument(\"--no-parallel-validate\", action=\"store_false\", dest=\"parallelValidate\",\n                            default=True, help=\"Validate in parallel, during conversion.\")\n\n        parser.add_argument(\"--wipe-processed\", action=\"store_true\", dest=\"wipeProcessed\",\n                            default=False,\n                            help=\"Wipe the processed folder.\")\n\n        parser.add_argument(\"--wipe-all\", action=\"store_true\", dest=\"wipeAll\", default=False,\n                            help=\"Wipe completely the directory, including the inputs.\")\n\n        parser.add_argument(\"--generate-labels\", action=\"store_true\",\n                            dest=\"generateLabels\", default=False,\n                            help=\"Run python label creation script on input jpegs.  Only for sea ice flights!\")\n\n        parser.add_argument(\"--archive-labels\", action=\"store_true\",\n                            dest=\"archiveLabels\", default=False,\n                            help=\"Archive the results from --generate-labels.\")\n                          \n        options = parser.parse_args(argsIn)\n\n    except argparse.ArgumentError as msg:\n        parser.error(msg)\n\n\n    # Check if we are on the right machine\n    (host, err, status) = asp_system_utils.executeCommand(['uname', '-n'],\n                                                         suppressOutput = True)\n    host = host.strip()\n    if 'pfe' in host and options.nodeType not in PFE_NODES:\n        raise Exception(\"From machine \" + host + \" can only launch on: \" + \" \".join(PFE_NODES)) \n    if 'mfe' in host and options.nodeType != 'wes':\n        raise Exception(\"From machine \" + host + \" can only launch on: wes\")\n\n    if options.unpackDir is None:\n        options.unpackDir = os.path.join(options.baseDir, 'data')\n\n    run = run_helper.RunHelper(options.site, options.yyyymmdd, options.unpackDir)\n\n    # Set up logging in the run directory\n    options.logFolder = os.path.join(run.getFolder(), 'manager_logs')\n    os.system('mkdir -p ' + options.logFolder)\n    logLevel = logging.INFO\n    logger   = icebridge_common.setUpLogger(options.logFolder, logLevel,\n                                            icebridge_common.manager_log_prefix())\n    logger.info(\"Logging in: \" + options.logFolder)\n        \n    os.system('mkdir -p ' + options.unpackDir)\n    \n    \n    summaryFolder = run.getSummaryFolder()\n    \n    checkRequiredTools() # Make sure all the needed tools can be found before we start\n\n    logger.info(\"Disabling core dumps.\") # these just take a lot of room\n    os.system(\"ulimit -c 0\")\n    os.system(\"umask 022\") # enforce files be readable by others\n\n    # See how many hours we used so far. I think this counter gets updated once a day.\n    (out, err, status) = asp_system_utils.executeCommand(\"acct_ytd\", outputPath = None, \n                                                         suppressOutput = True, redo = True,\n                                                         noThrow = True)\n    logger.info(\"Hours used so far:\\n\" + out + '\\n' + err)\n  \n    if True:\n\n        # WARNING: Below we tweak options.startFrame and options.stopFrame.\n        # If a loop over runs is implemeneted, things will break!\n\n        if not options.skipFetch:\n            # Obtain the data for a run if it is not already done\n            start_time()\n            runFetch(run, options, logger)       \n            stop_time(\"fetch\", logger)\n\n        # This must happen after fetch, otherwise fetch gets confused.\n        # Get the location to store the logs    \n        pbsLogFolder = run.getPbsLogFolder()\n        logger.info(\"Storing logs in: \" + pbsLogFolder)\n        os.system('mkdir -p ' + pbsLogFolder)\n\n        # Narrow the frame range. Note that if we really are at the last\n        # existing frame, we increment 1, to make sure we never miss anything.\n\n        (minFrame, maxFrame) = run.getFrameRange()\n        if options.startFrame < minFrame:\n            options.startFrame = minFrame\n        if options.stopFrame >= maxFrame:\n            options.stopFrame = maxFrame + 1 # see above\n        logger.info('Detected frame range: ' + str((options.startFrame, options.stopFrame)))\n\n        if not options.skipConvert:\n            # Run initial camera generation\n            start_time()\n            conversionAttempt = 0\n            runConversion(run, options, conversionAttempt, logger)\n            stop_time(\"convert\", logger)\n\n        # I see no reason to exit early\n        #if options.skipProcess and options.skipBlend and options.skipReport and \\\n        #       (not options.recomputeBatches) and options.skipArchiveCameras:\n        #    logger.info('Quitting early.')\n        #    return 0\n\n        fullBatchListPath = os.path.join(run.getProcessFolder(), 'batch_commands_log.txt')\n        batchListPath = fullBatchListPath\n\n        if not options.skipBatchGen:\n            start_time()\n            if os.path.exists(fullBatchListPath) and not options.recomputeBatches:\n                logger.info('Re-using existing batch list file.')\n            else:\n                # Run command to generate the list of batch jobs for this run\n                logger.info('Fetching batch list for run ' + str(run))\n                generateBatchList(run, options, fullBatchListPath, logger)\n\n            if options.failedBatchesOnly:\n                logger.info('Assembling batch file with only failed batches...')\n                batchListPath = filterBatchJobFile(run, batchListPath, logger)\n            stop_time(\"batch gen\", logger)\n\n        if not options.skipProcess:\n            start_time()\n            # Divide up batches into jobs and submit them to machines.\n            logger.info('Submitting jobs for run ' + str(run))\n            (baseName, jobIDs) = submitBatchJobs(run, options, batchListPath, logger)\n\n            # Wait for all the jobs to finish\n            logger.info('Waiting for job completion of run ' + str(run))\n\n            pbs_functions.waitForJobCompletion(jobIDs, logger, baseName)\n            logger.info('All jobs finished for run '+str(run))\n            stop_time(\"dem creation\", logger)\n\n        labelJobNames = None\n        if options.generateLabels:\n            (baseName, labelJobNames, labelJobIds) = launchJobs(run, 'label', options, logger)\n            ## Go ahead and launch the other jobs while these are in the queue\n            # Not running in parallel anymore, so just wait here.\n            pbs_functions.waitForJobCompletion(labelJobIds, logger, baseName)\n\n        if not options.skipBlend:\n            start_time()\n            (baseName, jobNames, jobIDs) = launchJobs(run, 'blend', options, logger)\n            pbs_functions.waitForJobCompletion(jobIDs, logger, baseName)\n            stop_time(\"blend\", logger)\n\n        if not options.skipOrthoGen:\n            start_time()\n            (baseName, jobNames, jobIDs) = launchJobs(run, 'orthogen', options, logger)\n            pbs_functions.waitForJobCompletion(jobIDs, logger, baseName)\n            stop_time(\"orthogen\", logger)\n\n        #if labelJobNames: # Now wait for any label jobs to finish.\n        #    pbs_functions.waitForJobCompletion(labelJobIds, logger, baseName)\n\n        runWasSuccess = True\n        resultText = 'Summary skipped'\n        if not options.skipCheckOutputs:\n            start_time()\n            # Generate a simple report of the results\n            (runWasSuccess, resultText) = checkResults(run, options, logger, fullBatchListPath)\n            stop_time(\"check outputs\", logger)\n            \n        if not options.skipReport:\n            start_time()\n            # Generate a summary folder and send a copy to Lou\n            os.system('mkdir -p ' + summaryFolder)\n            genCmd = ['--yyyymmdd', run.yyyymmdd, '--site', run.site, \n                      '--output-folder', summaryFolder, '--parent-folder', run.parentFolder]\n\n            if ((options.startFrame != icebridge_common.getSmallestFrame()) and\n                (options.stopFrame  != icebridge_common.getLargestFrame() ) ):\n                genCmd += ['--start-frame', str(options.startFrame),\n                           '--stop-frame',  str(options.stopFrame )]\n            if options.skipKml:\n                genCmd += ['--skip-kml']\n                \n            logger.info(\"Running generate_flight_summary.py \" + \" \".join(genCmd))\n            try:\n                generate_flight_summary.main(genCmd)\n            except Exception as e:\n                # Do not let this one ruin the day, if anything we can run it later\n                logger.info(str(e))\n            stop_time(\"report\", logger)\n            \n        # Pack up camera folder and store it for later.\n        if not options.skipArchiveCameras:\n            start_time()\n            try:\n                archive_functions.packAndSendCameraFolder(run, logger)\n            except Exception as e:\n                print 'Caught exception sending camera folder'\n                logger.exception(e)\n            stop_time(\"archive cameras\", logger)\n\n        # Pack up the aligned cameras and store them for later\n        if not options.skipArchiveAlignedCameras:\n            start_time()\n            try:\n                archive_functions.packAndSendAlignedCameras(run, logger)\n            except Exception as e:\n                print 'Caught exception sending aligned cameras'\n                logger.exception(e)\n            stop_time(\"archive aligned cameras\", logger)\n\n\n        # Archive the DEMs\n        if not options.skipArchiveRun:\n            start_time()\n            archive_functions.packAndSendCompletedRun(run, logger)\n            stop_time(\"archive dems\", logger)\n            \n        # Pack up the generated ortho images and store them for later\n        if not options.skipArchiveOrthos:\n            start_time()\n            try:\n                archive_functions.packAndSendOrthos(run, logger)\n            except Exception as e:\n                print 'Caught exception sending ortho images.'\n                logger.exception(e)\n            stop_time(\"archive orthos\", logger)\n\n        # Archive the label files\n        if options.archiveLabels:\n            start_time()\n            archive_functions.packAndSendLabels(run, logger)\n            stop_time(\"archive labels\", logger)\n\n        # send summary and logs to lunokhod and lfe.\n        # This must be towards the end, as it saves the log of this\n        # script as well.\n        if not options.skipArchiveSummary:\n            start_time()\n            archive_functions.packAndSendSummaryFolder(run, summaryFolder, logger)\n            stop_time(\"archive summary\", logger)\n            \n        if not options.skipEmail:\n            emailAddress = getEmailAddress(icebridge_common.getUser())\n            logger.info(\"Sending email to: \" + emailAddress)\n            if runWasSuccess:\n                sendEmail(emailAddress, 'OIB run passed - ' + str(run), resultText)\n            else:\n                sendEmail(emailAddress, '\"OIB run failed - ' + str(run), resultText)\n\n        if options.wipeProcessed:\n            processedFolder = run.getProcessFolder()\n            logger.info(\"Will delete: \" + processedFolder)\n            os.system(\"rm -rf \" + processedFolder)\n            \n        if options.wipeAll and runWasSuccess:\n            outFolder = run.getFolder()\n            logger.info(\"Will delete: \" + outFolder)\n            os.system(\"rm -rf \" + outFolder)\n            \n        #raise Exception('DEBUG - END LOOP')\n        logger.info('==== pleiades_manager script has finished for run: ' + str(run) + ' ====')\n\n\n# Run main function if file used from shell\nif __name__ == \"__main__\":\n    sys.exit(main(sys.argv[1:]))\n"
  },
  {
    "path": "src/asp/IceBridge/process_calibration_file.py",
    "content": "#!/usr/bin/env python\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n# Given a calibration file in pdf format from\n# https://nsidc.org/data/IODCC0/\n# convert it to the tsai format that can be used by ASP.\n# Usage:  python ~/projects/StereoPipeline/src/asp/IceBridge/process_calibration_file.py file.pdf\n\nimport os, sys, optparse, subprocess, re\n\n# The path to the ASP python files\nbasepath    = os.path.abspath(sys.path[0])\npythonpath  = os.path.abspath(basepath + '/../IceBridge')  # for dev ASP\npythonpath  = os.path.abspath(basepath + '/../Python')     # for dev ASP\nlibexecpath = os.path.abspath(basepath + '/../libexec')    # for packaged ASP\nsys.path.insert(0, basepath) # prepend to Python path\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\n\nimport asp_system_utils, asp_alg_utils, asp_geo_utils\nasp_system_utils.verify_python_version_is_supported()\n\n# Prepend to system PATH\nos.environ[\"PATH\"] = libexecpath + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = basepath    + os.pathsep + os.environ[\"PATH\"]\n\ndef main(argsIn):\n\n    try:\n        usage = '''usage: process_calibration_file.py file.pdf'''\n                      \n        parser = optparse.OptionParser(usage=usage)\n        (options, args) = parser.parse_args(argsIn)\n    except optparse.OptionError as msg:\n        raise Usage(msg)\n\n\n    if len(args) != 1:\n        raise Exception(usage)\n    \n    # The input is a pdf file\n    inFile = args[0]\n    base, ext = os.path.splitext(inFile)\n    if ext != \".pdf\":\n        raise Exception(\"The input file must be in pdf format.\")\n    if not os.path.isfile(inFile):\n        raise Exception(\"Missing input file: \" + inFile + \".\")\n\n    # Convert from pdf to text\n    pdfToTextExec = asp_system_utils.which(\"pdftotext\")\n    cmd = pdfToTextExec + ' ' + inFile \n    print(cmd)\n    p = subprocess.Popen(cmd, shell=True, universal_newlines=True)\n    os.waitpid(p.pid, 0)\n    \n    txtFile = base + '.txt'\n    if not os.path.isfile(txtFile):\n        raise Exception(\"Missing file: \" + txtFile + \".\")\n\n    tsaiFile = base + '.tsai'\n    \n    # Read the lines\n    lines = []\n    fin = open(txtFile, 'r')\n    while True:\n        line = fin.readline()\n        if not line: break\n        line = line.strip()\n        if line == \"\":\n            continue\n        lines.append(line)\n    fin.close()\n    \n    width, height, f, xp, yp, pitch_x, pitch_y, k1, k2, k3, p1, p2, b1, b2 = \\\n           (-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)\n\n    # Strip the mm\n    count = 0\n    for line in lines:\n        while True:\n            m = re.match(\"^(.*?\\d)mm(.*?)$\", line)\n            if not m:\n                break\n            line = m.group(1) + m.group(2)\n            lines[count] = line\n        count += 1\n        #print(\"line is \", line)\n     \n    # Parse the lines\n    count = 0\n    for line in lines:\n\n        m = re.match(\"^.*?Resolution\\s*=\\s*(\\d+)\\s*x\\s*(\\d+)\", line) \n        if m and width == -1 and height == -1:\n            width = m.group(1)\n            height = m.group(2)\n\n        m = re.match(\"^.*?Pixel width\\s*=\\s*(.*?),\\s*Pixel height\\s*=\\s*(.*?)\\s*$\", line)\n        if m and pitch_x == -1 and pitch_y == -1:\n            pitch_x = m.group(1)\n            pitch_y = m.group(2)\n            if pitch_x != pitch_y:\n            \traise Exception (\"Expecting pixel width and height to be same.\")\n\n        m = re.match(\".*?c\\s*=\", line)\n        if m and f == -1:\n            f = lines[count+3]\n            \n        m = re.match(\".*?xp\\s*=\", line)\n        if m and  xp == -1:\n            xp = lines[count+1]\n            \n        m = re.match(\".*?yp\\s*=\", line)\n        if m and  yp == -1:\n            yp = lines[count+1]\n        \n        m = re.match(\".*?K1\\s*=\\s*(.*?)\\s*$\", line)\n        if m and  k1 == -1:\n            k1 = m.group(1)\n            \n        m = re.match(\".*?K2\\s*=\\s*(.*?)\\s*$\", line)\n        if m and  k2 == -1:\n            k2 = m.group(1)\n\n        m = re.match(\".*?K3\\s*=\\s*(.*?)\\s*$\", line)\n        if m and  k3 == -1:\n            k3 = m.group(1)\n\n        m = re.match(\".*?P1\\s*=\\s*(.*?)\\s*$\", line)\n        if m and  p1 == -1:\n            p1 = m.group(1)\n\n        m = re.match(\".*?P2\\s*=\\s*(.*?)\\s*$\", line)\n        if m and  p2 == -1:\n            p2 = m.group(1)\n\n        m = re.match(\".*?B1\\s*=\\s*(.*?)\\s*$\", line)\n        if m and  b1 == -1:\n            b1 = m.group(1)\n\n        m = re.match(\".*?B2\\s*=\\s*(.*?)\\s*$\", line)\n        if m and  b2 == -1:\n            b2 = m.group(1)\n\n        count += 1\n        \n    cu = float(width)  * float(pitch_x) / 2.0\n    cv = float(height) * float(pitch_y) / 2.0\n\n    print (\"Writing: \" + tsaiFile)\n    fout = open(tsaiFile, 'w')\n    fout.write(\"VERSION_3\\n\")\n    fout.write(\"fu = \" + f + \"\\n\")\n    fout.write(\"fv = \" + f + \"\\n\")\n    fout.write(\"cu = \" + repr(cu) + \"\\n\")\n    fout.write(\"cv = \" + repr(cv) + \"\\n\")\n    fout.write(\"u_direction = 1  0  0\\n\")\n    fout.write(\"v_direction = 0  1  0\\n\")\n    fout.write(\"w_direction = 0  0  1\\n\")\n    fout.write(\"C = 0 0 0\\n\")\n    fout.write(\"R = 1 0 0 0 1 0 0 0 1\\n\")\n    fout.write(\"pitch = \" + pitch_x + \"\\n\")\n    fout.write(\"Photometrix\\n\")\n    fout.write(\"xp = \" + xp + \"\\n\")\n    fout.write(\"yp = \" + yp + \"\\n\")\n    fout.write(\"k1 = \" + k1 + \"\\n\")\n    fout.write(\"k2 = \" + k2 + \"\\n\")\n    fout.write(\"k3 = \" + k3 + \"\\n\")\n    fout.write(\"p1 = \" + p1 + \"\\n\")\n    fout.write(\"p2 = \" + p2 + \"\\n\")\n    fout.write(\"b1 = \" + b1 + \"\\n\")\n    fout.write(\"b2 = \" + b2 + \"\\n\")\n    fout.close()\n    \n    # Run main function if file used from shell\nif __name__ == \"__main__\":\n    sys.exit(main(sys.argv[1:]))\n\n\n"
  },
  {
    "path": "src/asp/IceBridge/process_icebridge_batch.py",
    "content": "#!/usr/bin/env python\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n# Run bundle adjustment, stereo, generate DEMs, merge dems, perform alignment, etc,\n# for a series of icebridge images\n\nimport os, sys, optparse, datetime, logging, multiprocessing, glob, re, shutil\n\n# The path to the ASP python files\nbasepath      = os.path.dirname(os.path.realpath(__file__))  # won't change, unlike syspath\npythonpath    = os.path.abspath(basepath + '/../Python')     # for dev ASP\nlibexecpath   = os.path.abspath(basepath + '/../libexec')    # for packaged ASP\nbinpath       = os.path.abspath(basepath + '/../bin')        # for packaged ASP\nicebridgepath = os.path.abspath(basepath + '/../IceBridge')  # IceBridge tools\ntoolspath     = os.path.abspath(basepath + '/../Tools')      # ASP Tools\nsys.path.insert(0, basepath) # prepend to Python path\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\nsys.path.insert(0, icebridgepath)\nsys.path.insert(0, libexecpath)\nsys.path.insert(0, toolspath)\n\nimport icebridge_common\nimport asp_system_utils, asp_alg_utils, asp_geo_utils, asp_image_utils, asp_file_utils\nasp_system_utils.verify_python_version_is_supported()\n\n# Prepend to system PATH\nos.environ[\"PATH\"] = libexecpath + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = toolspath   + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = binpath     + os.pathsep + os.environ[\"PATH\"]\n\n# TODO: For the footprint DEM, implement some functions like:\n# getFootprintPrefix() to avoid replicate the '-footprint-' string all\n# over the place.\n\ndef formImageCameraString(inputPairs):\n    '''Generate [images] [cameras] string from a list of input pairs.'''\n    imagesAndCams = \"\"\n    images        = \"\"\n    cameras       = \"\"\n    for (image, camera) in inputPairs: \n        images  += image;  images  += \" \"\n        cameras += camera; cameras += \" \"\n    imagesAndCams = images + cameras\n    return imagesAndCams\n\ndef makeDemAndCheckError(options, projString, pointCloud, \n                          lidarFile, lidarCsvFormatString,\n                          threadText, logger):\n    '''Make a DEM from a point cloud and compute the geodiff results with lidar.'''\n\n    suppressOutput = True\n    redo = True\n\n    # Generate a DEM file from the point cloud\n    cmd = ('point2dem --tr %lf --t_srs %s %s %s' \n           % (options.demResolution, projString, pointCloud, threadText))\n    icebridge_common.logger_print(logger, cmd)\n    demPath = pointCloud.replace('.tif', '-DEM.tif')\n    asp_system_utils.executeCommand(cmd, demPath, suppressOutput, redo)\n    \n    # Run geodiff with lidar and read in the results\n    diffPrefix = pointCloud\n    diffPath   = diffPrefix + '-diff.csv'\n    cmd = ('geodiff --absolute --csv-format %s %s %s -o %s' %\n           (lidarCsvFormatString, demPath, lidarFile, diffPrefix))\n    icebridge_common.logger_print(logger, cmd)\n    (out, err, status) = asp_system_utils.executeCommand(cmd, diffPath, suppressOutput, redo)\n    icebridge_common.logger_print(logger, out + '\\n' + err)\n    \n    results = icebridge_common.readGeodiffOutput(diffPath)\n    \n    return (demPath, diffPath, results)\n\n# TODO: May not need this function!\ndef getOverlapAmount(dem1, dem2, logger):\n    '''Count the number of overlapping pixels in two DEMs'''\n    \n    # Generate a DEM file from the point cloud\n    mosaicPrefix = os.path.join(os.path.dirname(dem1), 'overlapTemp')\n    mosaicOutput = mosaicPrefix + '-tile-0-count.tif'\n    cmd = ('dem_mosaic --count %s %s -o %s' % (dem1, dem2, mosaicPrefix))\n    icebridge_common.logger_print(logger, cmd)\n    asp_system_utils.executeCommand(cmd, mosaicOutput, True, True)\n\n    # Count up the '2' values\n\n    # Need to be 8 bit for ImageMagick\n    u8Mosaic = mosaicPrefix + '-u8_count.tif'\n    cmd = ('gdal_translate -ot byte %s %s' % (mosaicOutput, u8Mosaic))\n    icebridge_common.logger_print(logger, cmd)\n    asp_system_utils.executeCommand(cmd, u8Mosaic, True, True)\n    \n    # Now count the overlapping pixels\n    cmd = ('convert ' + u8Mosaic + \n           ' -fill black +opaque \"gray(2)\" -fill white -opaque \"gray(2)\" ' +\n           '-format \"%[fx:w*h*mean]\" info:')\n    icebridge_common.logger_print(logger, cmd)\n    (out, err, status) = asp_system_utils.executeCommand(cmd, u8Mosaic, True, True)    \n    if status != 0:\n        raise Exception('Failed to compute overlap amount!')\n    count = int(out.strip())\n    \n    # Clean up\n    os.remove(mosaicOutput)\n    os.remove(u8Mosaic)\n    \n    return count\n\n\ndef robustPcAlign(options, outputPrefix, lidarFile, lidarDemPath, \n                  demPath, finalAlignedDEM, \n                  projString, lidarCsvFormatString, threadText, logger):\n    '''Try pc_align with increasing max displacements until we it completes\n       with enough lidar points used in the comparison'''\n\n    # Displacements are still since an initial vertical shift is applied\n    DISPLACEMENTS        = [2, 5, 10, 25, 50\n                            #, 50, 100, 200\n                            ] # TODO: Increase these numbers for land flights!\n    ERR_HEADER_SIZE      = 3\n    IDEAL_LIDAR_DIST     = 0.1  # Quit aligning if we get under this error\n    MIN_DIST_IMPROVEMENT = 0.25 # Pct improvement in error to accept a larger max-disp\n    MIN_NUM_DIFFS        = 100  # Can't trust results with fewer diffs.\n\n    lidarCsvFormatString = icebridge_common.getLidarCsvFormat(lidarFile)\n    \n    alignPrefix   = icebridge_common.getAlignPrefix(options.outputFolder)\n    \n    pcAlignFolder = os.path.dirname(alignPrefix)\n    endErrorPath  = alignPrefix + '-end_errors.csv'\n    transformPath = alignPrefix + '-transform.txt'\n    invTransPath  = alignPrefix + '-inverse-transform.txt' # needed for ortho gen\n    alignedPC     = alignPrefix +'-trans_reference.tif'\n    alignedDem    = alignedPC.replace('-trans_reference.tif', '-trans_reference-DEM.tif')\n    lidarDiffPath = outputPrefix + \"-diff.csv\"\n\n    # Check if the file is already there\n    if ( os.path.exists(alignedDem) or os.path.exists(finalAlignedDEM) ) \\\n           and os.path.exists(lidarDiffPath):\n        results = icebridge_common.readGeodiffOutput(lidarDiffPath)\n        logger.info(\"Outputs of pc_align already exist.\")\n        return alignedDem, lidarDiffPath, results['Mean']\n\n    # Estimate an initial vertical shift between our DEM and the lidar data.\n    try:\n        diffPrefix = os.path.join(options.outputFolder, 'out')\n        diffOutput = diffPrefix + '-diff.tif'\n        cmd = ('geodiff %s %s -o %s' % (demPath, lidarDemPath, diffPrefix))\n        icebridge_common.logger_print(logger, cmd)\n        (out, err, status) = asp_system_utils.executeCommand(cmd, diffOutput, True, True)\n        icebridge_common.logger_print(logger, out + '\\n' + err)\n        diffInfo = asp_image_utils.getImageStats(diffOutput)\n        meanDiff = -1.0 * diffInfo[0][2] # This adjustment is made in the down direction.\n        os.system('rm -rf ' + diffOutput) # Go ahead and clean this up now\n        logger.info('Vertical diff estimate from lidar = ' + str(meanDiff))\n    except:\n        raise Exception('No overlap between lidar DEM and stereo DEM!')\n\n\n    bestMeanDiff  = -1\n    bestMaxDisp   = -1\n    bestNumDiffs  = -1\n    bestTransPath    = os.path.join(pcAlignFolder, 'best_transform.txt')\n    bestInvTransPath = os.path.join(pcAlignFolder, 'best_inverse_transform.txt')\n    bestDemPath      = os.path.join(pcAlignFolder, 'best_dem.tif')\n    bestDiffPath   = os.path.join(pcAlignFolder, 'best_diff.csv')\n\n    # Done computing the desired point count, now align our DEM.\n    resultsDict = {}\n    for maxDisp in DISPLACEMENTS:\n               \n        # Call pc_align\n        alignOptions = ( ('--max-displacement %f --csv-format %s ' +\n                          '--save-inv-transformed-reference-points ' + \n                          '--initial-ned-translation \"0 0 %f\"') % \n                         (maxDisp, lidarCsvFormatString, meanDiff))\n        cmd = ('pc_align %s %s %s -o %s %s' %\n               (alignOptions, demPath, lidarFile, alignPrefix, threadText))\n        try:\n            # Redo must be true here\n            icebridge_common.logger_print(logger, cmd)\n            (out, err, status) = asp_system_utils.executeCommand(cmd, alignedPC, True, True)\n            icebridge_common.logger_print(logger, out + '\\n' + err)\n            \n            # Get diff stats for this attempt\n            (thisDem, thisLidarDiffPath, results) = \\\n                makeDemAndCheckError(options, projString, alignedPC, \n                                     lidarFile, lidarCsvFormatString,\n                                     threadText, logger)\n            transformPath = thisDem.replace('trans_reference-DEM.tif', 'transform.txt')\n            invTransPath  = thisDem.replace('trans_reference-DEM.tif', 'inverse-transform.txt')\n            \n            #numDiffs = getOverlapAmount(thisDem, lidarDemPath, logger)\n        except: \n            icebridge_common.logger_print(logger, 'Alignment failed, trying next displacement.')\n            continue # Try the next displacement\n\n        #shutil.copyfile(thisDem, str(maxDisp) + '_dem.tif') # DEBUG\n        \n        # Keep track of the best displacement result, requiring a minimum\n        #  improvement in the mean error to accept a higher-displacement result.\n        # - Also don't accept results with less lidar points covered because that is \n        #   a sign that the DEM has been tilted away from the LIDAR path.\n        thisDiff = results['Mean']\n        numDiffs = results['NumDiffs']\n        percent_improvement = (bestMeanDiff - thisDiff) / bestMeanDiff\n        icebridge_common.logger_print(logger, '\\nDiff results for max displacement ' \n                                               + str(maxDisp) + ' = ' + str(results)\n                                               + ', num diffs = ' \n                                               + str(numDiffs)\n                                               + ', improvement ratio = ' \n                                               + str(percent_improvement))\n        resultsDict[str(maxDisp)] = results\n        if ((numDiffs > MIN_NUM_DIFFS) and\n             ( (bestMeanDiff < 0) or \n               (thisDiff < IDEAL_LIDAR_DIST) or\n               ((percent_improvement >= MIN_DIST_IMPROVEMENT) and\n                (numDiffs >= bestNumDiffs)) )\n           ):\n            icebridge_common.logger_print(logger, \n                    'Accepting pc_align result for displacement ' + str(maxDisp))\n            bestMeanDiff = thisDiff\n            bestMaxDisp  = maxDisp\n            bestNumDiffs = numDiffs\n            shutil.move(thisDem,       bestDemPath  )\n            shutil.move(transformPath, bestTransPath)\n            shutil.move(invTransPath,  bestInvTransPath)\n            shutil.move(thisLidarDiffPath, bestDiffPath)\n            \n            if thisDiff < IDEAL_LIDAR_DIST:\n                break # No need to check more displacements if this result is great\n\n    if bestMeanDiff < 0:\n        raise Exception('Unable to align image at max displacement!')\n\n    # Move the best result into the default file locations.\n    icebridge_common.logger_print(logger, 'Best mean diff is ' + str(bestMeanDiff) \n                                  +' with --max-displacement = ' + str(bestMaxDisp)\n                                  +' and num diffs = ' + str(bestNumDiffs))\n\n    logger.info(resultsDict)\n    shutil.move(bestDemPath,   alignedDem)\n\n    transformPath = alignPrefix + '-transform.txt'\n    invTransPath  = alignPrefix + '-inverse-transform.txt' # needed for ortho gen\n    logger.info(\"mv \" + bestTransPath + \" \" + transformPath)\n    logger.info(\"mv \" + bestInvTransPath + \" \" + invTransPath)\n    if bestTransPath != transformPath and os.path.exists(bestTransPath):\n        shutil.move(bestTransPath, transformPath)\n    if bestInvTransPath != invTransPath and os.path.exists(bestInvTransPath):\n        shutil.move(bestInvTransPath, invTransPath)\n\n    shutil.move(bestDiffPath,  lidarDiffPath)\n    results = icebridge_common.readGeodiffOutput(lidarDiffPath)\n\n    # Apply the same transform to the footprint DEM. This one is used in blending later.\n    finalFootprintDEM = os.path.join(options.outputFolder,\n                                     icebridge_common.footprintFileName())\n    if os.path.exists(finalFootprintDEM):\n        logger.info(\"File exists: \" + finalFootprintDEM)\n    else:\n        alignOptions = ( ('--max-displacement -1 --csv-format %s ' +   \\\n                          '--save-inv-transformed-reference-points') % \\\n                            (lidarCsvFormatString))\n        alignPrefixFoot = alignPrefix + '-footprint'\n        footDemPath = demPath.replace(\"DEM.tif\", \"footprint-DEM.tif\")\n        cmd = ('pc_align --num-iterations 0 --initial-transform %s %s %s %s -o %s %s' %\n               (transformPath, alignOptions, footDemPath, lidarFile, alignPrefixFoot, threadText))\n        alignedFootPC = alignPrefixFoot + '-trans_reference.tif'\n        try:\n            logger.info(cmd) # to make it go to the log, not just on screen\n            asp_system_utils.executeCommand(cmd, alignedFootPC, False, True)\n            if os.path.exists(footDemPath):\n                os.remove(footDemPath) # No longer needed\n        except: \n            pass\n\n        try:\n            # POINT2DEM on the aligned PC file\n            cmd = (('point2dem --search-radius-factor 5 --dem-hole-fill-len 500 ' +\n                    '--tr %lf --t_srs %s %s %s') \n                   % (options.demResolution, projString, alignedFootPC, threadText))\n            alignedFootDEM = alignPrefixFoot + '-trans_reference-DEM.tif'\n            logger.info(cmd) # to make it go to the log, not just on screen\n            asp_system_utils.executeCommand(cmd, alignedFootDEM, False, True)\n        except: \n            pass\n\n        # Move it out of the align directory\n        if os.path.exists(alignedFootDEM):\n            if os.path.exists(finalFootprintDEM):\n                os.remove(finalFootprintDEM)\n            logger.info(\"Renaming \" + alignedFootDEM + \" to \" + finalFootprintDEM)\n            os.rename(alignedFootDEM, finalFootprintDEM)\n        else:\n            logger.info(\"File does not exist: \" + alignedFootDEM)\n            \n        # Wipe all auxilliary footprint files\n        for filename in glob.glob(alignPrefix + '-footprint-*'):\n            logger.info(\"Removing: \" + filename)\n            os.remove(filename)\n        \n    return alignedDem, lidarDiffPath, results['Mean']\n\n\ndef blurImage(inputPath, outputPath, suppressOutput, redo):\n    '''Create a blurred copy of an image'''\n\n    # Blurring the input image can help reduce the negative impact of jpeg artifacts.\n    # - The 6x3 option applies a significant amount of blur but it is still not enough\n    #   to clean up all the jpeg artifacts!\n    cmd = 'convert ' +inputPath+' -compress LZW -blur 6x3 '+outputPath\n    asp_system_utils.executeCommand(cmd, outputPath, suppressOutput, redo)\n\n\ndef robustBundleAdjust(options, inputPairs,\n                       suppressOutput, redo,\n                       threadText, heightLimitString, logger):\n    '''Perform bundle adjustment with multiple retries in case things fail.\n       Returns inputPairs with the updated camera models swapped in.'''\n\n    # - Bundle adjust all of the input images in the batch at the same time.\n    # - An overlap number less than 2 is prone to very bad bundle adjust results so\n    #   don't use less than that.  If there is really only enough overlap for one we\n    #   will have to examine the results very carefully!\n    MIN_BA_OVERLAP       = 2\n    TRANSLATION_WEIGHT   = 4.0\n    ROBUST_THRESHOLD     = 2.0\n    OVERLAP_EXPONENT     = 0\n    MIN_IP_MATCHES       = 22\n    # The cropping below does not work with rotated images!\n    #SIDE_IP_CROP_PERCENT = 20 # Remove IP in 20% of the sides of the images \n    SIDE_IP_CROP_PERCENT = 1 # Remove IP in 20% of the sides of the images\n    bundlePrefix   = icebridge_common.getBundlePrefix(options.outputFolder)\n    baOverlapLimit = options.stereoImageInterval + 3\n    if baOverlapLimit < MIN_BA_OVERLAP:\n        baOverlapLimit = MIN_BA_OVERLAP\n\n    # Try many attempts until one works\n    # - Blurring can help with artifacts.\n    # - Many IP can also help, but risks getting false matches and is slower.\n    ipMethod    = [1,   0,   2,     1,   0,   2,     1,    0,      1,    0,    2,     1   ]\n    ipPerTile   = [500, 500, 500,   500, 500, 500,   500,  500,    2000, 2000, 2000,  2000]\n    useBlur     = [0,   0,   0,     1,   1,   1,     0,    0,      0,    0,    0,     0   ]\n    epipolarT   = [450, 450, 450,   450, 450, 450,   2000, 2000,   450,  450,  450,   2000]\n    normIpTiles = [0,   0,   0,     0,   0,   0,     1,    1,      0,    0,    0,     1   ]\n\n    if options.manyip:\n        # When using many IP, ip-method 0 gives more ip\n        ipMethod[0] = 0\n        ipMethod[1] = 1\n        SIDE_IP_CROP_PERCENT = 0\n        for v in range(len(ipPerTile)):\n            ipPerTile[v] = 2000\n        \n    # This is the rough percentage of the image that we want to have interest points in.\n    MIN_IP_COVERAGE = 0.70\n\n    if (len(ipMethod) != len(ipPerTile)) or (len(ipMethod) != len(useBlur)) or \\\n           (len(ipMethod) != len(epipolarT)):\n        raise Exception(\"Book-keeping error in robust bundle adjustment.\")\n\n    imageCameraString = formImageCameraString(inputPairs)\n\n    # Fill inputPairs with output camera names\n    for pair in inputPairs:\n        pair[1] = bundlePrefix +'-'+ os.path.basename(pair[1])\n   \n    # Generate a new string with the blurred image files paths\n    # - Don't actually generate blurred files unless they are needed\n    # - Blurred images will be deleted when the final batch cleanup function is called.\n    blurredImageCameraString = imageCameraString\n    blurPairs = []\n    i = 0\n    for pair in inputPairs:\n        imagePath   = pair[0]\n        blurredPath = bundlePrefix + '_' + str(i)+ '_blurred.tif'\n        blurredImageCameraString = blurredImageCameraString.replace(imagePath, blurredPath)\n        blurPairs.append((imagePath, blurredPath))\n        i = i + 1\n\n    outputCamera = inputPairs[0][1]\n\n    # Loop through all our parameter settings, quit as soon as one works.\n    bestNumIpPreElevation = 0\n    bestCmd = ''\n    bestCmdSuccess = False\n    success = False\n    successWithoutCoverage = False\n    for attempt in range(len(ipPerTile)):\n               \n        argString = imageCameraString\n        if useBlur[attempt]: # Make sure blurred images are created\n            for pair in blurPairs:\n                blurImage(pair[0], pair[1], False, False)\n            argString = blurredImageCameraString                     \n\n        # If using many ip, stop using the elevation restriction earlier\n        currHeightLimitString = heightLimitString\n        if options.manyip and attempt > len(ipPerTile)/2:\n            currHeightLimitString = \"\"\n        \n        cmd = (('bundle_adjust %s -o %s %s %s --datum wgs84 ' +\n                '--approximate-pinhole-intrinsics ' +\n                # '--rotation-weight 400 ' + # this may be needed for some flights\n                '--translation-weight %0.16g -t nadirpinhole --skip-rough-homography ' +\n                '--inline-adjustments --overlap-limit %d --robust-threshold %0.16g ' +\n                '--ip-detect-method %d --ip-per-tile %d --min-matches %d ' + \n                '--overlap-exponent %0.16g --epipolar-threshold %d ' +\n                '--ip-side-filter-percent %d ')\n               % (argString, bundlePrefix, threadText, currHeightLimitString, \n                  TRANSLATION_WEIGHT, baOverlapLimit, ROBUST_THRESHOLD, ipMethod[attempt],\n                  ipPerTile[attempt], MIN_IP_MATCHES, OVERLAP_EXPONENT,\n                  epipolarT[attempt], SIDE_IP_CROP_PERCENT))\n\n        # This helps in cases where there is a small dark object (like a stream) that prevents\n        #  large snow areas from being processed well.  Can lead to false IP.\n        if normIpTiles[attempt]:\n            cmd += ' --normalize-ip-tiles'\n\n        if options.solve_intr:\n            cmd += ' --solve-intrinsics'            \n            \n        # Disabling triangulation error filtering up front and then applying it post bundle adjust\n        #  works well but it is currently only supported in bundle_adjust for two cameras at once!\n        if len(inputPairs) == 2:\n            cmd += ' --disable-tri-ip-filter --num-passes 3 '   + \\\n                   '--remove-outliers-params 75.0,3.0,2.0,3.0 ' + \\\n                   '--outlier-removal-params 90.0 3.0 '\n    \n        # Run the BA command and log errors\n        logger.info(cmd) # to make it go to the log, not just on screen\n        icebridge_common.logger_print(logger, cmd)\n        (out, err, status) = asp_system_utils.executeCommand(cmd, outputCamera, True, redo,\n                                                             noThrow=True)\n        logger.info(out + '\\n' + err)\n        \n        if status == 0: # Record if we had a success before coverage was checked\n            successWithoutCoverage = True\n        thisSuccessWithoutCoverage = (status == 0)\n        \n        if status == 0:\n            # Check to see if we got the desired amount of coverage.\n            # - TODO: How to do this with >2 cameras?\n            m = re.findall(r\"IP coverage fraction after cleaning = ([0-9e\\-\\.\\+]*)\", out)\n            if len(m) == 0: # Handle case where no IP were removed for high residual.\n                m = re.findall(r\"IP coverage fraction = ([0-9e\\-\\.\\+]*)\", out)\n            if len(m) > 0: # If this text is available...\n                ipCoveragePercentage = float(m[-1]) # Use the last instance of this text.\n                logger.info('Read coverage percentage: ' + str(ipCoveragePercentage))\n                if ipCoveragePercentage < MIN_IP_COVERAGE:\n                    logger.info('Coverage percentage is less than required amount: ' \n                                + str(MIN_IP_COVERAGE) + ', trying more IP options to get more coverage.')\n                    status = -1\n                \n        if status == 0:\n            logger.info(\"Bundle adjustment succeded on attempt \" + str(attempt))\n            success = True\n            break\n\n        # Keep track of the best number of IP before elevation filtering.\n        m = re.findall(r\"Reduced matches to (\\d+)\", out)\n        if len(m) == 1: # If this text is available...\n            numIpPreElevation = int(m[0])\n            # Mostly want to save a successful command but use numIpPreElevation as a tiebreaker.\n            if ((numIpPreElevation > bestNumIpPreElevation) and not (bestCmdSuccess and not thisSuccessWithoutCoverage)) \\\n               or (thisSuccessWithoutCoverage and not bestCmdSuccess):\n                bestNumIpPreElevation = numIpPreElevation\n                bestCmd = cmd\n                bestCmdSuccess = thisSuccessWithoutCoverage\n    \n        # Try again. Carefully wipe only relevant files\n        logger.info(\"Trying bundle adjustment again.\")\n        for f in glob.glob(bundlePrefix + '*'):\n            if 'blurred.tif' in f: # Don't wipe these files\n                continue\n            logger.info(\"Wipe: \" + f)\n            os.remove(f)\n\n    # End bundle adjust attempts\n\n    # If we failed, retry the best attempt\n    if not success:\n        \n        # If we never succeeded even before coverage checking, lift the elevation restriction.\n        # - This increases the risk of bad IP's being used but it is better than failing.\n        if successWithoutCoverage:\n            logger.info(\"Retrying bundle_adjust without coverage check\")\n            cmd = bestCmd\n        else:\n            logger.info(\"Retrying bundle_adjust without coverage check or elevation restriction\")\n            cmd = bestCmd.replace(heightLimitString, '')\n\n        icebridge_common.logger_print(logger, cmd)\n        (out, err, status) = asp_system_utils.executeCommand(cmd, outputCamera, True, redo,\n                                                             noThrow=True)\n        logger.info(out + '\\n' + err)\n        if status == 0:\n            logger.info(\"Bundle adjustment succeded on repeat attempt.\")\n            success = True\n\n    if not success:\n        raise Exception('Bundle adjustment failed!\\n')\n\n    # Return image/camera pairs with the camera files replaced with the bundle_adjust output files.\n    # - Also return if we used blurred input images or not\n    return inputPairs\n\ndef applyTransformToCameras(options, inputPairs, suppressOutput, redo,\n                            threadText, heightLimitString, logger):\n    '''Create cameras with the pc_align transform applied to them,\n    # so that we can later generate ortho images.'''\n\n    imagesAndCams = formImageCameraString(inputPairs)\n\n    alignPrefix         = icebridge_common.getAlignPrefix(options.outputFolder)\n    bundlePrefix        = icebridge_common.getBundlePrefix(options.outputFolder)\n    alignedBundlePrefix = icebridge_common.getAlignedBundlePrefix(options.outputFolder)\n\n    outputCamera = inputPairs[0][1].replace(bundlePrefix, alignedBundlePrefix)\n\n    if os.path.exists(outputCamera):\n        logger.info(\"Transformed cameras already exist.\")\n        return\n    \n    initialTransform = alignPrefix + '-inverse-transform.txt'\n    if not os.path.exists(initialTransform):\n        raise Exception(\"Cannot locate pc_align transform: \" + initialTransform)\n\n    # We will run bundle adjustment with 0 iterations. Hence use whatever match files\n    # we had before\n    matchFiles = glob.glob(bundlePrefix + '*.match')\n    for matchFile in matchFiles:\n        newMatchFile = matchFile.replace(bundlePrefix, alignedBundlePrefix)\n        icebridge_common.makeSymLink(matchFile, newMatchFile)\n\n    cmd = (('bundle_adjust %s -o %s %s --datum wgs84 ' +\n            '-t nadirpinhole --skip-rough-homography '+\n            '--inline-adjustments --min-matches 0  --max-iterations 0 --ip-per-tile 1000 ' + \n            ' --initial-transform %s')\n           % (imagesAndCams, alignedBundlePrefix, threadText,\n              initialTransform))\n\n    # Run the BA command and log errors\n    logger.info(\"Applying pc_align transform to cameras.\")\n    logger.info(cmd) # to make it go to the log, not just on screen\n    (out, err, status) = asp_system_utils.executeCommand(cmd, outputCamera, True, redo,\n                                                         noThrow=True)\n    logger.info(out + '\\n' + err)\n\n    # Since input cameras start with out- and output prefix starts with out-, the output\n    # cameras will start with out-out-. Fix this.\n    for camera in glob.glob(alignedBundlePrefix + '*.tsai'):\n        cameraOut = camera.replace(alignedBundlePrefix + '-out', alignedBundlePrefix)\n        if camera != cameraOut and os.path.exists(camera) and (not os.path.exists(cameraOut)):\n            cmd = 'mv ' + camera + ' ' + cameraOut\n            logger.info(cmd)\n            os.system(cmd)\n\n\ndef getMatchFiles(options, origInputPairs, index):\n    '''Get the path of the match file generated by bundle_adjust for\n       a given image pair, and the path to where that match file\n       could be copied to the stereo folder in order to be used.'''\n\n    # TODO: These definitions are repeated elsewhere\n    bundlePrefix     = icebridge_common.getBundlePrefix(options.outputFolder)\n    thisOutputFolder = os.path.join(options.outputFolder, 'stereo_pair_'+str(index))\n    thisPairPrefix   = os.path.join(thisOutputFolder,     'out')\n    \n    # Saturate the pair index at the end of the list.\n    # - This serves to handle the case where bundle_adjust was called with a\n    #   truncated input image list in a one-DEM multiple-image case.\n    pairIndex = index + options.stereoImageInterval\n    if pairIndex >= len(origInputPairs):\n        pairIndex = len(origInputPairs) - 1\n\n    leftImageName  = os.path.basename(origInputPairs[index    ][0])\n    rightImageName = os.path.basename(origInputPairs[pairIndex][0])\n    normalMatchPath = ('%s-%s__%s.match' % \n                       (bundlePrefix, leftImageName.replace('.tif',''), \n                                      rightImageName.replace('.tif','')))\n    blurMatchPath = ('%s-out_%d_blurred__out_%d_blurred.match' % \n                     (bundlePrefix, index, pairIndex))\n    outputMatchPath = ('%s-%s__%s.match' % \n                       (thisPairPrefix, leftImageName.replace('.tif',''), \n                                        rightImageName.replace('.tif','')))\n\n    if os.path.exists(normalMatchPath):\n        inputMatchPath = normalMatchPath\n    else:\n        if os.path.exists(blurMatchPath):\n            inputMatchPath = blurMatchPath\n        else:\n            # Match files may not exist if the bundle adjust dir got cleaned up\n            return (\"\", \"\")\n        #raise Exception('Unable to find bundle_adjust match file ' + str(index))\n\n    return (inputMatchPath, outputMatchPath)\n\ndef consolidateGeodiffResults(inputFiles, outputPath=None):\n    '''Create a summary file of multiple geodiff csv output files'''\n\n    if len(inputFiles) == 0: # No input files, do nothing.\n        return None\n\n    # Take the max/min of min/max and the mean of mean and stddev\n    keywords = ['Max', 'Min', 'Mean', 'StdDev']\n    mergedResult = {'Max':-999999.0, 'Min':999999.0, 'Mean':0.0, 'StdDev':0.0}\n    for path in inputFiles:\n        results = icebridge_common.readGeodiffOutput(path)\n        if results['Max'] > mergedResult['Max']:\n            mergedResult['Max'] = results['Max']\n        if results['Min'] < mergedResult['Min']:\n            mergedResult['Min'] = results['Min']\n        mergedResult['Mean'  ] += results['Mean'  ]\n        mergedResult['StdDev'] += results['StdDev']\n    mergedResult['Mean'  ] = mergedResult['Mean'  ] / float(len(inputFiles))\n    mergedResult['StdDev'] = mergedResult['StdDev'] / float(len(inputFiles))\n    \n    if not outputPath:\n        return mergedResult\n    \n    # If an output path was provided, write out the values in a similar to geodiff format.\n    with open(outputPath, 'w') as f:\n        f.write('# Max difference:       '+str(mergedResult['Max'   ])+'\\n')\n        f.write('# Min difference:       '+str(mergedResult['Min'   ])+'\\n')\n        f.write('# Mean difference:      '+str(mergedResult['Mean'  ])+'\\n')\n        f.write('# StdDev of difference: '+str(mergedResult['StdDev'])+'\\n')\n\n    # Delete all the input diff files to reduce file bloat if we wrote the output file\n    if os.path.exists(outputPath): \n        for f in inputFiles:\n            os.system('rm -f ' + f)\n    \n    return mergedResult\n\n\ndef consolidateStats(lidarDiffPath, interDiffPath, fireDiffPath, fireLidarDiffPath,  \n                     demPath, outputPath, fractionValidPath, logger, skipGeo = False):\n    '''Consolidate statistics into a single file'''\n\n    # Read in the diff results            \n    try:\n        lidarDiffResults = icebridge_common.readGeodiffOutput(lidarDiffPath)\n    except:\n        lidarDiffResults = {'Mean':-999}\n    try:\n        interDiffResults = icebridge_common.readGeodiffOutput(interDiffPath)\n    except:\n        interDiffResults = {'Mean':-999}\n    try:\n        fireDiffResults  = icebridge_common.readGeodiffOutput(fireDiffPath)\n    except:\n        fireDiffResults  = {'Mean':-999}\n    try:\n        fireLidarDiffResults = icebridge_common.readGeodiffOutput(fireLidarDiffPath)\n    except:\n        fireLidarDiffResults = {'Mean':-999}\n    try:\n        with open(fractionValidPath, 'r') as f:\n            fractionValid = float(f.read())\n    except:\n        fractionValid = -1\n\n    # Get DEM stats\n    success = True\n    if skipGeo:\n        success = False\n    else:\n        try:\n            geoInfo = asp_geo_utils.getImageGeoInfo(demPath, getStats=False)\n            stats   = asp_image_utils.getImageStats(demPath)[0]\n            meanAlt = stats[2]\n            centerX, centerY = geoInfo['projection_center']\n            \n            # Convert from projected coordinates to lonlat coordinates            \n            isSouth    = ('+lat_0=-90' in geoInfo['proj_string'])\n            projString = icebridge_common.getEpsgCode(isSouth, asString=True)\n            PROJ_STR_WGS84 = 'EPSG:4326'\n            (centerLon, centerLat) = asp_geo_utils.convertCoordinate(projString, PROJ_STR_WGS84, centerX, centerY)\n        except Exception as e:\n            pass\n            # Print nothing, comes out too verbose\n            #if logger:\n            #    #logger.exception('Caught exception getting DEM center coordinates:\\n' + str(e))\n            #    #logger.info(\"Not fatal, will continue.\") # for clarity in the log use this line\n            #else:\n            #    #print 'Could not compute DEM center coordinates.'\n            success = False\n\n    if not success:\n        centerLon = 0\n        centerLat = 0\n        meanAlt   = -999\n\n    # Write info to summary file        \n    with open(outputPath, 'w') as f:\n        f.write('%f, %f, %f, %f, %f, %f, %f, %f' % \n                 (centerLon, centerLat, meanAlt, \n                  lidarDiffResults['Mean'], interDiffResults    ['Mean'],\n                  fireDiffResults ['Mean'], fireLidarDiffResults['Mean'], fractionValid))\n\n\ndef readConsolidatedStatsFile(consolidatedStatsPath):\n    '''Read the contents of the stats file'''\n\n    if not os.path.exists(consolidatedStatsPath):\n        raise Exception('Consolidated stats file missing: ' + consolidatedStatsPath)\n    with open(consolidatedStatsPath, 'r') as f:\n        statsText = f.read()\n    parts = split(statsText)\n    return [float(x) for x in parts]\n    \n\n\ndef lidarCsvToDem(lidarFile, projBounds, projString, outputFolder, threadText, \n                  redo, logger):\n    '''Generate a DEM from a lidar file in the given region (plus a buffer)'''\n\n    LIDAR_DEM_RESOLUTION     = 5 # TODO: Vary this\n    LIDAR_PROJ_BUFFER_METERS = 100\n\n    lidarCsvFormatString = icebridge_common.getLidarCsvFormat(lidarFile)\n\n    # Buffer out the input bounds\n    minX = projBounds[0] - LIDAR_PROJ_BUFFER_METERS # Expand the bounds a bit\n    minY = projBounds[1] - LIDAR_PROJ_BUFFER_METERS\n    maxX = projBounds[2] + LIDAR_PROJ_BUFFER_METERS\n    maxY = projBounds[3] + LIDAR_PROJ_BUFFER_METERS\n\n    # Generate a DEM from the lidar point cloud in this region        \n    lidarDemPrefix = os.path.join(outputFolder, 'cropped_lidar')\n    # Add --search-radius-factor 5 to help with mapproject later\n    # when estimating the gsd.\n    cmd = ('point2dem --search-radius-factor 5 --max-output-size 10000 10000 --t_projwin %f %f %f %f --tr %lf --t_srs %s %s %s --csv-format %s -o %s' \n           % (minX, minY, maxX, maxY,\n              LIDAR_DEM_RESOLUTION, projString, lidarFile, threadText, \n              lidarCsvFormatString, lidarDemPrefix))\n    lidarDemOutput = lidarDemPrefix+'-DEM.tif'\n    icebridge_common.logger_print(logger, cmd)\n    (out, err, status) = asp_system_utils.executeCommand(cmd, lidarDemOutput,\n                                                         True, redo, noThrow=True)\n    logger.info(out + '\\n' + err)\n    if status != 0:\n        raise Exception('Did not generate any lidar DEM!')\n    \n    return lidarDemOutput\n\ndef cropGdalImage(projBounds, inputPath, outputPath, logger):\n    '''Crop out a section of an image'''\n\n    PROJ_BUFFER_METERS = 100\n    minX = projBounds[0] - PROJ_BUFFER_METERS # Expand the bounds a bit\n    minY = projBounds[1] - PROJ_BUFFER_METERS\n    maxX = projBounds[2] + PROJ_BUFFER_METERS\n    maxY = projBounds[3] + PROJ_BUFFER_METERS\n\n    cmd = ('gdal_translate %s %s -projwin %f %f %f %f' \n           % (inputPath, outputPath, minX, maxY, maxX, minY))\n    logger.info(cmd)\n    asp_system_utils.executeCommand(cmd, outputPath, True, False)\n\ndef estimateHeightRange(projBounds, projString, lidarFile, options, threadText, \n                        suppressOutput, redo, logger):\n    '''Estimate the valid height range in a region based on input height info.\n       Also generates the lidar DEM.'''\n        \n    # Expand the estimate by this much in either direction\n    # - If the input cameras are good then this can be fairly small, at least for flat\n    #   regions.  Bad cameras are much farther off.\n    HEIGHT_BUFFER = 20\n    \n    # Create a lidar DEM at the region\n    lidarDemPath = lidarCsvToDem(lidarFile, projBounds, projString, \n                                 options.outputFolder, threadText, \n                                 redo, logger)\n    \n    # Get the min and max height of the lidar file\n    try:\n        lidarMin, lidarMax, lidarMean, lidarStd = asp_image_utils.getImageStats(lidarDemPath)[0]\n        logger.info('Found lidar height min = %f, max = %f' % (lidarMin, lidarMax))\n    except:\n        raise Exception('Failed to generate lidar DEM to estimate height range!')\n\n    minHeight = lidarMin\n    maxHeight = lidarMax\n\n    # Get the min/max height in the reference DEM region\n    # - The lidar field is narrower than the image so sometimes it can miss terrain features\n    #   that show up in the lower resolution DEM.\n    try:\n        demCropPath = os.path.join(options.outputFolder, 'cropped_ref_dem.tif')\n        cropGdalImage(projBounds, options.referenceDem, demCropPath, logger)\n        refDemMin, refDemMax, refDemMean, refDemStd = asp_image_utils.getImageStats(demCropPath)[0]\n        logger.info('Found ref DEM height min = %f, max = %f' % (refDemMin, refDemMax))\n        \n        if refDemMin < minHeight:\n            minHeight = refDemMin\n        if refDemMax > maxHeight:\n            maxHeight = refDemMax\n            \n    except:\n        logger.warning('Error generating reference DEM height estimate for ')\n\n    minHeight = minHeight - HEIGHT_BUFFER\n    maxHeight = maxHeight + HEIGHT_BUFFER\n    \n    # Generate the height string\n    s = '--elevation-limit ' + str(minHeight) +' '+ str(maxHeight)\n    return (s, lidarDemPath)\n    \n\ndef getWidthAndMemUsageFromStereoOutput(outputText, errorText):\n    '''Parse the output from running stereo and return the search range width and\n       the memory usage in GB.'''\n\n    successParsintStats = False\n    corrSearchWidth = -1\n    memUsage        = -1\n    elapsed         = \"-1\"\n    out             = outputText + \"\\n\" + errorText\n    for line in out.split('\\n'):\n        m = re.match(\"^.*?Search\\s+Range:.*?Min:.*?width:\\s*(\\d+)\", line, re.IGNORECASE)\n        if m:\n            corrSearchWidth = float(m.group(1))\n            successParsintStats = True\n        m = re.match(\"^.*?elapsed=(.*?)\\s+mem=(\\d.*?)\\s+.*?time_stereo_corr\", line, re.IGNORECASE)\n        if m:\n            elapsed = m.group(1)\n            memUsage = float(m.group(2))\n            memUsage = float(round(memUsage/100000.0))/10.0 # convert to GB\n            successParsintStats = True\n            \n    return (corrSearchWidth, memUsage, elapsed, successParsintStats)\n\ndef createDem(i, options, inputPairs, prefixes, demFiles, projString,\n              heightLimitString, threadText, matchFilePair,\n              suppressOutput, redo, logger=None):\n    '''Create a DEM from a pair of images'''\n\n    # Since we use epipolar alignment our images should be aligned at least this well.\n    VERTICAL_SEARCH_LIMIT = 10\n    TIMEOUT = 40*60 # Do not let any process take more than this time in seconds\n\n    # Get the appropriate image to use as a stereo pair    \n    pairIndex = i + options.stereoImageInterval\n\n    thisPairPrefix = prefixes[i]\n    argString      = ('%s %s %s %s ' % (inputPairs[i][0],  inputPairs[pairIndex][0], \n                                        inputPairs[i][1],  inputPairs[pairIndex][1]))\n\n    # - This epipolar threshold is post camera model based alignment so it can be quite restrictive.\n    # - Note that the base level memory usage ignoring the SGM buffers is about 2 GB so this memory\n    #   usage is in addition to that.\n    minIpString = '--min-num-ip 40'\n    stereoCmd = (('stereo %s %s %s %s -t nadirpinhole --alignment-method epipolar ' +\n                  '--skip-rough-homography --corr-blob-filter 50 --corr-seed-mode 0 ' +\n                  '--outlier-removal-params 90.0 3.0 --epipolar-threshold 10 %s ') %\n                 (argString, thisPairPrefix, threadText, heightLimitString, minIpString))\n    searchLimitString = (' --corr-search-limit -9999 -' + str(VERTICAL_SEARCH_LIMIT) +\n                         ' 9999 ' + str(VERTICAL_SEARCH_LIMIT) )\n    if '--stereo-algorithm 0' not in options.stereoArgs:\n        correlationArgString = (' --xcorr-threshold 2 --corr-kernel 7 7 ' \n                                + ' --corr-tile-size 9000 --cost-mode 4 --sgm-search-buffer 4 2 '\n                                + searchLimitString + ' --corr-memory-limit-mb 6000 '\n                                + options.stereoArgs\n                               )\n        #+ ' --corr-blob-filter 100')\n        filterArgString = (' --rm-cleanup-passes 0 --median-filter-size 5 ' +\n                           ' --texture-smooth-size 17 --texture-smooth-scale 0.14 ')\n    else:\n        correlationArgString = options.stereoArgs\n        filterArgString = ''\n         \n    stereoCmd += correlationArgString\n    stereoCmd += filterArgString\n    stereoCmd += ' --check-mem-usage'\n\n    # Call and check status\n    triOutput = thisPairPrefix + '-PC.tif'\n        \n    icebridge_common.logger_print(logger, stereoCmd)\n    if (not options.manyip) or (matchFilePair[0] == \"\"):\n        (out, err, status) = asp_system_utils.executeCommand(stereoCmd, triOutput,\n                                                             suppressOutput, redo, noThrow=True,\n                                                             timeout = TIMEOUT)\n    else:\n        # Jump directly to using the ip from bundle_adjust\n        (out, err, status) = (\"\", \"\", -1)\n        \n    if status != 0:\n        # If stereo failed, try it again with the .match file that was created by bundle_adjust.\n\n        if not options.manyip:\n            icebridge_common.logger_print(logger, 'First stereo attempt failed, will copy .match file from bundle_adjust and retry.')\n        else:\n            icebridge_common.logger_print(logger, 'Copy right away .match file from bundle_adjust and retry.')\n        \n        # Clear any existing .match file then link in the new one.\n        cmd = 'rm -f ' + thisPairPrefix + '*.match'\n        icebridge_common.logger_print(logger, cmd)\n        os.system(cmd)\n        if matchFilePair[0] == \"\":\n            # This can happen if the bundle adjust directory got cleaned up. Nothing we can do.\n            raise Exception(\"No usable match files. Stereo call failed.\")\n        \n        icebridge_common.makeSymLink(matchFilePair[0], matchFilePair[1])\n        if not os.path.exists(matchFilePair[1]):\n            raise Exception('Failed to create .match file symlink: ' + matchFilePair[1])\n            \n        # With the .match file copied we can retry with the same parameters.\n        # - Remove some filtering steps we don't need.\n        # - Exception is the height limit string, which we can remove if using existing IP.\n        stereoCmd = stereoCmd.replace(minIpString, '--min-num-ip 10')\n        m = re.match(\"^\\s*$\", heightLimitString)\n        if not m: # This is a bugfix, check for empty heightLimitString\n            stereoCmd = stereoCmd.replace(heightLimitString, ' ')\n        icebridge_common.logger_print(logger, stereoCmd)\n        os.system('rm -f ' + triOutput) # In case the output cloud exists but is bad\n        (out, err, status) = asp_system_utils.executeCommand(stereoCmd, triOutput, suppressOutput, \n                                                             redo, noThrow=True, timeout = TIMEOUT)\n        if status != 0:\n            # If we fail again give up.\n            icebridge_common.logger_print(logger, out + '\\n' + err)\n            raise Exception('Stereo call failed!')\n\n    # Extract the search range width and memory usage from the output text.\n    (corrSearchWidth, memUsage, elapsed, gotMemStats)  = \\\n                      getWidthAndMemUsageFromStereoOutput(out, err)\n\n    icebridge_common.logger_print(logger, (\"Corr search width: %d mem usage: %f GB elapsed: %s\" %\n                                          (corrSearchWidth, memUsage, elapsed) ) )\n\n    if i == 0 and gotMemStats:\n        # If we could not parse the data, write nothing. Maybe this time\n        # we are rerunning things, and did not actually do any work.\n        filePath = os.path.join(os.path.dirname(os.path.dirname(thisPairPrefix)),\n                                icebridge_common.getRunStatsFile())\n        icebridge_common.logger_print(logger, \"Writing: \" + filePath)\n        with open(filePath, 'w') as f:\n            f.write( (\"%d, %f, %s\\n\") % (corrSearchWidth, memUsage, elapsed) )\n        \n    # point2dem on the result of ASP\n    # - The size limit is to prevent bad point clouds from creating giant DEM files which\n    #   cause the processing node to crash.\n    cmd = (('point2dem ' + ' --errorimage ' +\n            # '--max-valid-triangulation-error 10 ' + # useful when studying distortion\n            '--max-output-size 10000 10000 --dem-spacing %lf --t_srs %s %s %s')\n           % (options.demResolution, projString, triOutput, threadText))\n    p2dOutput = demFiles[i]\n    icebridge_common.logger_print(logger, cmd)\n    (out, err, status) =  asp_system_utils.executeCommand(cmd, p2dOutput, suppressOutput,\n                                                          redo, noThrow=True)\n    if status != 0:\n        icebridge_common.logger_print(logger, out + '\\n' + err)\n        raise Exception('point2dem call on stereo pair failed!')\n\n    # Require a certain percentage of valid output pixels to go forwards with this DEM\n    # - This calculation currently does not work well but anything under this is probably bad.\n    # TODO: This validity fraction is NOT ACCURATE and needs to be improved!\n    MIN_FRACTION_VALID_PIXELS = 0.10 \n    percentageFlagFile = os.path.join(options.outputFolder, 'valid_pixel_fraction.txt')\n    fractionValid = 1.0;\n\n    # Try to parse the output text for the percentage or read it from disk if we already logged it.\n    m = re.findall(r\"Percentage of valid pixels = ([0-9e\\-\\.\\+]+)\", out)\n    if len(m) == 1:\n        fractionValid = float(m[0])\n        icebridge_common.logger_print(logger, 'Valid DEM pixel fraction = ' + str(fractionValid))\n        with open(percentageFlagFile, 'w') as f: # Log the percentage to disk\n            f.write(str(fractionValid))\n    else:\n        try: # Read the percentage from disk\n            with open(percentageFlagFile, 'r') as f:\n                fractionValid = float(f.read())\n        except:\n            icebridge_common.logger_print(logger, 'Unable to read dem percentage fraction from file ' + percentageFlagFile)\n\n           \n    icebridge_common.logger_print(logger, 'Detected valid pixel fraction = ' + str(fractionValid))\n    if fractionValid < MIN_FRACTION_VALID_PIXELS:\n        raise Exception('Required DEM pixel fraction is ' + str(MIN_FRACTION_VALID_PIXELS) +\n                        ', got instead ' + str(fractionValid) + ' aborting processing on this DEM.')\n\n    # If the output DEM is too small then something is probably wrong.\n    MIN_DEM_SIZE_PIXELS = 200\n    (width, height) = asp_image_utils.getImageSize(p2dOutput)\n    if (width < MIN_DEM_SIZE_PIXELS) or (height < MIN_DEM_SIZE_PIXELS):\n        raise Exception('DEM size (' + str(width) + ', ' + str(height) +\n                        ') is less than minumum size ' + str(MIN_DEM_SIZE_PIXELS))\n\n    # The DEM with larger footprint, not filtered out as agressively. We use\n    # the valid pixels in this DEM's footprint as a template where to blend.\n    p2dFoot = thisPairPrefix + '-footprint'\n    cmd = ( ('point2dem --max-output-size 10000 10000 --tr %lf --t_srs %s %s %s ' +\n             ' --remove-outliers-params 75 12 -o %s ')\n           % (options.demResolution, projString, triOutput, threadText, p2dFoot))\n    p2dFoot = p2dFoot + '-DEM.tif'\n    icebridge_common.logger_print(logger, cmd)\n    (out, err, status) = asp_system_utils.executeCommand(cmd, p2dFoot, suppressOutput, redo,\n                                                          noThrow=True)\n    if status != 0:\n        icebridge_common.logger_print(logger, out + '\\n' + err)\n        raise Exception('point2dem call on stereo pair failed!')\n\ndef cleanBatch(batchFolder, alignPrefix, stereoPrefixes,\n               interDiffPaths, fireballDiffPaths):\n    '''Clean up all non-output files to conserve space.\n       Setting smallFiles will remove additional low size files.'''\n\n    smallFiles = True\n\n    # Delete all of the stereo folders\n    for s in stereoPrefixes:\n        if smallFiles:\n            folder = os.path.dirname(s)\n            os.system('rm -rf ' + folder)\n        else:\n            os.system('rm -rf ' + s + '*.tif')\n    \n    if smallFiles:\n        # Delete bundle_adjust folder. Note that will also wipe the cameras.\n        os.system('rm -rf ' + os.path.dirname(icebridge_common.getBundlePrefix(batchFolder)))\n        \n        # Clean out the pc_align folder\n        alignFiles = ['-beg_errors.csv', '-end_errors.csv', '-iterationInfo.csv',\n                      '-trans_reference.tif', '-transform.txt', '-inverse-transform.txt'] \n\n        for currFile in alignFiles:\n            os.system('rm -f ' + alignPrefix + currFile)\n\n        logFiles = glob.glob(alignPrefix + '*-log-*')\n        for logFile in logFiles:\n            os.system('rm -f ' + logFile)\n\n        # Wipe all footprint files except the final result\n        footprintFiles = glob.glob(alignPrefix + '*footprint*')\n        for footprintFile in footprintFiles:\n            if not footprintFile.endswith('out-footprint-trans_reference-DEM.tif'):\n                os.system('rm -f ' + footprintFile)\n\n    # Delete the diff images\n    for f in (interDiffPaths + fireballDiffPaths):\n        os.system('rm -f ' + f)\n\n    # Delete dangling link.\n    os.system('rm -f ' + os.path.join(batchFolder, 'out-DEM.tif'))\n\n    # Delete lidar_crop files\n    lidar_crop_glob = os.path.join(batchFolder, '*cropped_lidar*')\n    for filename in glob.glob(lidar_crop_glob):\n        os.system('rm -f ' + filename)\n\n    # Delete the cropped DEM path\n    demCropPath = os.path.join(batchFolder, 'cropped_ref_dem.tif')\n    os.system('rm -f ' + demCropPath)\n\n    # Wipe the pc_aligned bundle directory except for the final results\n    alignedBundlePrefix = icebridge_common.getAlignedBundlePrefix(batchFolder)\n    for filename in glob.glob(alignedBundlePrefix + '*'):\n        if not filename.endswith('.tsai'):\n            os.system('rm -f ' + filename)\n\n    # Wipe the entire align directory, we moved out of it everything by now\n    os.system('rm -rf ' + os.path.dirname(alignPrefix))\n    \n    # Repeating the logic from generate_flight_summary.py.\n    consolidatedStatsPath = os.path.join(batchFolder, 'out-consolidated_stats.txt')\n    if os.path.exists(consolidatedStatsPath):\n        # Then we don't need the individual files\n        lidarDiffPath      = os.path.join(batchFolder, 'out-diff.csv')\n        interDiffPath      = os.path.join(batchFolder, 'out_inter_diff_summary.csv')\n        fireDiffPath       = os.path.join(batchFolder, 'out_fireball_diff_summary.csv')\n        fireLidarDiffPath  = os.path.join(batchFolder, 'out_fireLidar_diff_summary.csv')\n        percentageFlagFile = os.path.join(batchFolder, 'valid_pixel_fraction.txt')\n        for filename in [lidarDiffPath, interDiffPath, fireDiffPath, fireLidarDiffPath, percentageFlagFile]:\n            os.system('rm -f ' + filename)\n    # Wipe any aux.xml\n    for filename in glob.glob(os.path.join(batchFolder, '*aux.xml')):\n        os.system('rm -f ' + filename)\n    \ndef main(argsIn):\n    '''Handle arguments then call doWork function'''\n\n    try:\n        usage = '''usage: process_icebridge_batch <imageA> <imageB> [imageC ...] <cameraA> <cameraB> [cameraC ...]'''\n        \n        parser = optparse.OptionParser(usage=usage)\n\n        # Data options\n        parser.add_option('--south', action='store_true', default=False, dest='isSouth',  \n                          help='MUST be set if the images are in the southern hemisphere.')\n                          \n        parser.add_option('--lidar-folder', default=None, dest='lidarFolder',  \n                          help='Use pc-align to match the closest lidar file.')\n\n        parser.add_option('--output-folder', default=None, dest='outputFolder',  \n                          help='The folder used for output.')\n\n        parser.add_option('--reference-dem', default=None, dest='referenceDem',  \n                          help='Low resolution DEM used for certain checks.')\n                          \n        parser.add_option('--fireball-folder', default=None, dest='fireballFolder',\n                          help='Folder containing fireball DEMs.')\n\n        # Processing options\n        parser.add_option('--max-displacement', dest='maxDisplacement', default=20,\n                          type='float', help='Max displacement value passed to pc_align.')\n\n        parser.add_option('--solve-intrinsics', action='store_true', default=False,\n                          dest='solve_intr',  \n                          help='If to float the intrinsics params.')\n\n        parser.add_option('--stereo-arguments', dest='stereoArgs', default='',\n                          help='Additional argument string to be passed to the stereo command.')\n                          \n        parser.add_option('--stereo-image-interval', dest='stereoImageInterval', default=1,\n                          type='int', help='Advance this many frames to get the stereo pair. ' + \\\n                          ' Also sets bundle adjust overlap limit.')\n\n        # Output options\n        parser.add_option('--dem-resolution', dest='demResolution', default=0.4,\n                          type='float', help='Generate output DEMs at this resolution.')\n\n        parser.add_option('--cleanup', action='store_true', default=False, dest='cleanup',  \n                          help='If the final result is produced delete intermediate files.')\n\n        parser.add_option('--many-ip', action='store_true', default=False, dest='manyip',  \n                          help='If to use a lot of IP in bundle adjustment from the beginning.')\n        \n        # Performance options\n        parser.add_option('--num-threads', dest='numThreads', default=None,\n                          type='int', help='The number of threads to use for processing.')\n\n        (options, args) = parser.parse_args(argsIn)\n\n        # Check argument count\n        numArgs    = len(args)\n        numCameras = (numArgs) / 2\n        if ( (2*numCameras - numArgs) != 0) or (numCameras < 2):\n            print(\"Expecting as many images as cameras. Got: \" + \" \".join(args))\n            print (usage)\n            return 0\n\n    except optparse.OptionError as msg:\n        raise Usage(msg)\n\n    # Start up the logger, output will go in the output folder.\n    #logger = logging.getLogger(__name__)\n    logLevel = logging.INFO # Make this an option??\n    asp_system_utils.mkdir_p(options.outputFolder)\n    logger = icebridge_common.setUpLogger(options.outputFolder, logLevel,\n                                          icebridge_common.logFilePrefix())\n\n    logger.info('Input arguments: ' + str(argsIn))\n\n    # Run the rest of the code and log any unhandled exceptions.\n    try:\n        doWork(options, args, logger)\n        return 0 # Success!\n        \n    except Exception as e:\n        logger.exception(e) # Failed to generate output file\n        \n        try: # When we failed to generate the output DEM, \n             #  generate a thumbnail of the first input image to help diagnose problems.\n            thumbOutput = os.path.join(options.outputFolder, 'first_image_browse.tif')\n            cmd = 'gdal_translate '+args[0]+' '+thumbOutput+' -of GTiff -outsize 40% 40% -b 1 -co \"COMPRESS=JPEG\"'\n            asp_system_utils.executeCommand(cmd, thumbOutput, True, False)\n            logger.info('Created browse image ' + thumbOutput)\n        except:\n            logger.exception('Failed to generate debug input image thumbnail.')\n        \n        return -1 # Failure!\n    \n\ndef doWork(options, args, logger):\n    '''Do all of the processing.'''\n\n    os.system(\"ulimit -c 0\")  # disable core dumps\n    os.system(\"rm -f core.*\") # these keep on popping up\n    os.system(\"umask 022\")    # enforce files be readable by others\n\n    numArgs       = len(args)\n    numCameras    = (numArgs) / 2\n    numStereoRuns = numCameras - options.stereoImageInterval\n\n    # Verify all input files exist\n    for i in range(0,numArgs):\n        if not os.path.exists(args[i]):\n            logger.error('Arg parsing error: Input file '+ args[i] +' does not exist!')\n            return 0\n\n    # Parse input files\n    inputPairs   = []\n    for i in range(0, numCameras):\n        image  = args[i]\n        camera = args[i + numCameras]\n        inputPairs.append([image, camera])\n    imageCameraString = ' '.join(args)\n\n    projString = icebridge_common.getProjString(options.isSouth, addQuotes=False)\n\n    suppressOutput = False\n    redo           = False\n\n    logger.info('Starting processing...')\n\n\n    threadText = ''\n    if options.numThreads:\n        threadText = ' --threads ' + str(options.numThreads) +' '\n\n    # If a lidar folder was specified, find the best lidar file.\n    lidarFile = None\n    if options.lidarFolder:\n        logger.info('Searching for matching lidar file...')\n        lidarFile = icebridge_common.findMatchingLidarFile(inputPairs[0][0], options.lidarFolder)\n        logger.info('Found matching lidar file ' + lidarFile)\n        lidarCsvFormatString = icebridge_common.getLidarCsvFormat(lidarFile)\n\n    outputPrefix  = os.path.join(options.outputFolder, 'out')\n\n    # Check the last output products from this script.  If they exist,\n    #  quit now so we don't regenerate intermediate products.\n    consolidatedStatsPath = outputPrefix + '-consolidated_stats.txt'\n    finalAlignedDEM        = outputPrefix + '-align-DEM.tif'\n\n    try: # If the consolidated stats file exists but is incomplete, remove it so that we go ahead with processing.\n        stats = readConsolidatedStatsFile(consolidatedStatsPath)\n        if (stats[0] == 0) or (stats[1] == 0) or (stats[2] == -999):\n            os.remove(consolidatedStatsPath)\n    except:\n        pass\n\n    if ( os.path.exists(consolidatedStatsPath) and \n         os.path.exists(finalAlignedDEM) and not redo ):\n        logger.info('Final output files already exists: ' + finalAlignedDEM +\n                    ' and ' + consolidatedStatsPath + '. Quitting script early.')\n    \n        # Include the same normal completion message\n        logger.info('Finished script process_icebridge_batch!') \n        return\n    \n    # Find the mean GSD and the bounds. Note that later we don't actually use\n    # this resolution, rather we compute it automatically with point2dem. \n    heightLimitString = ''\n    lidarDemPath      = None # Path to a DEM created from lidar data.\n    if options.referenceDem:\n        #MAX_OVERSAMPLING = 3.0\n        computedGsd = options.demResolution\n        meanGsd     = 0\n        totalBounds = [99999999, 99999999, -99999999, -999999999] # minX, minY, maxX, maxY\n        for i in range(0,numCameras):\n            try:\n                # Compute the native GSD of the first input camera\n                computedGsd, bounds = icebridge_common.getCameraGsdAndBoundsRetry(\n                                          inputPairs[i][0], inputPairs[i][1], logger, \n                                          options.referenceDem, projString)\n                meanGsd += computedGsd\n                # Accumulate the bounding box\n                minX = bounds[0]\n                minY = bounds[1]\n                maxX = minX + bounds[2]\n                maxY = minY + bounds[3]\n                if totalBounds[0] > minX: totalBounds[0] = minX\n                if totalBounds[1] > minY: totalBounds[1] = minY\n                if totalBounds[2] < maxX: totalBounds[2] = maxX\n                if totalBounds[3] < maxY: totalBounds[3] = maxY\n            except:\n                logger.warning('Failed to compute GSD for camera: ' + inputPairs[0][1])\n        meanGsd = meanGsd / numCameras                \n        # Check that the output GSD is not set too much lower than the native resolution\n        #print 'GSD = ' + str(meanGsd)\n        #print 'TotalBounds = ' + str(totalBounds)\n        #if options.demResolution < (meanGsd*MAX_OVERSAMPLING):\n        #    logger.warning('Specified resolution ' + str(options.demResolution) + \n        #                   ' is too fine for camera with computed GSD ' + str(meanGsd) +\n        #                   '.  Switching to native GSD.)')\n        #    options.demResolution = meanGsd*MAX_OVERSAMPLING\n        # Undersampling is not as dangerous, just print a warning.\n        #if options.demResolution > 5*meanGsd:\n        #    logger.warning('Specified resolution ' + str(options.demResolution) + \n        #                   ' is much larger than computed GSD ' + str(meanGsd))\n\n        # Use variable GSD, depending on the frame only.\n        options.demResolution = icebridge_common.gsdToDemRes(meanGsd)\n\n        if lidarFile:\n            # Compute a good height limit from the reference DEM\n            # - Can try generating lonlat bounds in the future, but maybe better\n            #   to keep these in projected coordinate space.\n            (heightLimitString, lidarDemPath) = estimateHeightRange(totalBounds,\n                                                                    projString, lidarFile,\n                                                                    options, threadText, \n                                                                    suppressOutput, redo, logger)\n        #if options.manyip:\n        #    heightLimitString = \"\" # Turn it off\n        \n        # Recompute mean gsd based on quering mapproject\n        meanGsd = 0\n        numVals = 0\n        for i in range(0,numCameras):\n            try:\n                # Compute the native GSD of the first input camera\n                computedGsd = \\\n                            icebridge_common.getGsdFromMapproject(inputPairs[i][0],\n                                                                  inputPairs[i][1], logger, \n                                                                  lidarDemPath,\n                                                                  options.referenceDem)\n                meanGsd += computedGsd\n                numVals += 1\n            except:\n                logger.warning('Failed to compute GSD for camera: ' + inputPairs[0][1])\n     \n        if numVals == 0:\n            raise Exception('Failed to compute GSD for any camera!')\n        meanGsd = meanGsd / numVals            \n        options.demResolution = icebridge_common.gsdToDemRes(meanGsd)\n\n        logger.info('DEM resolution ' + str(options.demResolution))\n        \n    # BUNDLE_ADJUST\n    origInputPairs = inputPairs # All input pairs, non-blurred or otherwise altered.\n    \n    # For now at least only pass into bundle adjust the images which will be used in stereo.\n    # - This lets use use some BA tools which are currently only supported for two images.\n    if numStereoRuns == 1:\n        prunedInputPairs = [inputPairs[0], inputPairs[-1]]\n    else: # Bundle on all input images\n        prunedInputPairs = inputPairs\n    inputPairs = robustBundleAdjust(options, prunedInputPairs,\n                                    suppressOutput, redo,\n                                    threadText, heightLimitString, logger)\n\n    # Record the best match file generated by bundle_adjust for each output pair\n    #  and where it can be copied for stereo to re-use it.\n    baMatchFiles = []\n    for i in range(0,len(prunedInputPairs)-1):\n        (inputMatch, outputMatch) = getMatchFiles(options, prunedInputPairs, i)\n        baMatchFiles.append( (inputMatch, outputMatch))\n\n    # Generate a map of post-bundle camera positions\n    orbitvizAfter = os.path.join(options.outputFolder, 'cameras_out.kml')\n    vizString  = ''\n    for (image, camera) in inputPairs: \n        vizString += camera + ' '\n    cmd = ('orbitviz_pinhole --hide-labels -o ' +orbitvizAfter + ' '+ vizString)\n    logger.info(cmd) # to make it go to the log, not just on screen\n    asp_system_utils.executeCommand(cmd, orbitvizAfter, suppressOutput, redo)\n\n    # STEREO\n    \n    # Call stereo separately on each pair of cameras and create a DEM\n\n    # Check if we have all of the stereo output files\n    prefixes              = []\n    demFiles              = []\n    fireLidarDiffCsvPaths = []                      \n\n    # Load index of fireball DEMs for comparison\n    if options.fireballFolder:\n        fireballFrameDict = icebridge_common.getCorrectedFireballDems\\\n                            (os.path.dirname(options.fireballFolder))\n        matchingFireballDems = []\n        \n    atLeastOneDemMissing = False\n    for i in range(0, numStereoRuns):\n        thisOutputFolder = os.path.join(options.outputFolder, 'stereo_pair_'+str(i))\n        thisPairPrefix   = os.path.join(thisOutputFolder,     'out')\n        prefixes.append(thisPairPrefix)\n        p2dOutput = thisPairPrefix + '-DEM.tif'\n        demFiles.append(p2dOutput)\n        if not os.path.exists(p2dOutput):\n            atLeastOneDemMissing = True\n\n        # Diff with fireball early, in case our run fails\n        currCam = inputPairs[i][1]\n        frame   = icebridge_common.getFrameNumberFromFilename(currCam)\n        if frame not in fireballFrameDict.keys():\n            matchingFireballDems.append(None) # Store flag object\n            continue\n        fireball = fireballFrameDict[frame]\n        matchingFireballDems.append(fireball)\n        if lidarFile:                           \n            prefix  = outputPrefix + '_fireball_lidar_' + str(i)\n            csvPath = prefix + \"-diff.csv\"\n            cmd = ('geodiff --absolute --csv-format %s %s %s -o %s' % \n                   (lidarCsvFormatString, fireball, lidarFile, prefix))\n            logger.info(cmd) # to make it go to the log, not just on screen\n            asp_system_utils.executeCommand(cmd, csvPath, suppressOutput, redo)\n            fireLidarDiffCsvPaths.append(csvPath)\n        \n    # Process the batch serially (but we will start multiple such batches in parallel).\n    for i in range(0, numStereoRuns):\n        createDem(i, options, origInputPairs, prefixes, demFiles,\n                  projString, heightLimitString, threadText,\n                  baMatchFiles[i], suppressOutput, redo, logger)\n        \n    # If we had to create at least one DEM, need to redo all the post-DEM creation steps\n    if atLeastOneDemMissing:\n        redo = True\n\n    logger.info('Finished running all stereo instances.')\n    \n    numDems = len(demFiles)\n\n    # Check the elevation disparities between the DEMs.  High discrepancy\n    # usually means there was an alignment error.\n    interDiffSummaryPath  = outputPrefix + '_inter_diff_summary.csv'\n    interDiffPaths        = []\n    \n    for i in range(1,numDems):\n        try:\n            # Call geodiff\n            prefix   = outputPrefix + '_inter_dem_' + str(i)\n            diffPath = prefix + \"-diff.tif\"\n            cmd = ('geodiff --absolute %s %s -o %s' % (demFiles[0], demFiles[i], prefix))\n            logger.info(cmd) # to make it go to the log, not just on screen\n            asp_system_utils.executeCommand(cmd, diffPath, suppressOutput, redo)\n            \n            # Read in and examine the results\n            results = icebridge_common.readGeodiffOutput(diffPath)\n            interDiffPaths.append(diffPath)\n        except:\n            pass # Files with no overlap will fail here\n            #logger.warning('Difference between dem ' + demFiles[0] + \\\n            # ' and dem ' + demFiles[i] + ' failed!')\n\n    # Can do interdiff only if there is more than one DEM\n    if numDems > 1:\n        consolidateGeodiffResults(interDiffPaths, interDiffSummaryPath)\n    else:\n        logger.info(\"Only one stereo pair is present, cannot create: \" + interDiffSummaryPath)\n        \n    # DEM_MOSAIC\n    allDemPath = outputPrefix + '-DEM.tif'\n    if numDems == 1:\n        # If there are only two files just skip this step\n        icebridge_common.makeSymLink(demFiles[0], allDemPath)\n\n        # For the footprint. We implemented this only for batch size of 2.\n        demFoot = demFiles[0].replace(\"DEM.tif\", \"footprint-DEM.tif\")\n        if os.path.exists(demFoot):\n            allDemFoot = allDemPath.replace(\"DEM.tif\", \"footprint-DEM.tif\")\n            logger.info(\"ln -s \" + demFoot + \" \" + allDemFoot)\n            icebridge_common.makeSymLink(demFoot, allDemFoot)\n        else:\n            logger.info(\"File does not exist: \" + demFoot)\n            \n    else:\n        demString = ' '.join(demFiles)\n        # Only the default blend method produces good results but the DEMs must not be too \n        #  far off for it to work.\n        print (projString)\n        cmd = ('dem_mosaic %s --tr %lf --t_srs %s %s -o %s' \n               % (demString, options.demResolution, projString, threadText, outputPrefix))\n        print (cmd)\n        mosaicOutput = outputPrefix + '-tile-0.tif'\n        logger.info(cmd) # to make it go to the log, not just on screen\n        asp_system_utils.executeCommand(cmd, mosaicOutput, suppressOutput, redo)\n        # TODO: Updated fractionValid in this case\n        \n        # Create a symlink to the mosaic file with a better name\n        icebridge_common.makeSymLink(mosaicOutput, allDemPath)\n\n    # More comparisons with Fireball DEMs if available\n    fireballDiffPaths     = []\n    if options.fireballFolder:\n        fireballDiffSummaryPath  =  outputPrefix + '_fireball_diff_summary.csv'\n        fireLidarDiffSummaryPath =  outputPrefix + '_fireLidar_diff_summary.csv'\n    \n        # Loop through matches\n        # - Each fireball DEM is compared to our final output DEM as without the pc_align step\n        #   the errors will be high and won't mean much.\n        for i in range(0,numDems):\n            dem = demFiles[i]\n            fireball = matchingFireballDems[i]\n            if not fireball: # Skip missing fireball file (will be 'None')\n                continue\n            #try:\n            prefix  = outputPrefix + '_fireball_' + str(i)\n            diffPath = prefix + \"-diff.tif\"\n            cmd = ('geodiff --absolute %s %s -o %s' % (allDemPath, fireball, prefix))\n            logger.info(cmd)\n            try:\n                asp_system_utils.executeCommand(cmd, diffPath, suppressOutput, redo)\n            except Exception as e:\n                # This is necessary, sometimes the fireball DEM is wrong\n                logger.info('Caught exception doing diff to fireball: ' + str(e))\n                logger.info(\"Not fatal, will continue.\") # for clarity in the log, use this line\n                continue\n            \n            results = icebridge_common.readGeodiffOutput(diffPath)\n            fireballDiffPaths.append(diffPath)\n    \n    \n            #except:\n            #    logger.warning('Difference between dem ' + demFiles[0] + ' and fireball failed!')\n        consolidateGeodiffResults(fireballDiffPaths,     fireballDiffSummaryPath )\n        consolidateGeodiffResults(fireLidarDiffCsvPaths, fireLidarDiffSummaryPath)\n\n    lidarDiffPath = ''\n    if lidarFile:\n        # PC_ALIGN\n\n        # - Use function to call with increasing max distance limits\n        alignedDem, lidarDiffPath, meanErr = \\\n                    robustPcAlign(options, outputPrefix,\n                                  lidarFile, lidarDemPath, allDemPath, finalAlignedDEM,\n                                  projString, lidarCsvFormatString, \n                                  threadText, logger)\n        \n        # Move the aligned DEM to the main directory, to have one file less\n        if os.path.exists(alignedDem):\n            logger.info(\"Moving \" + alignedDem + \" to \" + finalAlignedDEM)\n            if os.path.exists(finalAlignedDEM):\n                os.remove(finalAlignedDEM)\n            os.rename(alignedDem, finalAlignedDEM)\n        allDemPath = finalAlignedDEM\n\n        # Create pc-aligned bundle-adjusted cameras\n        applyTransformToCameras(options, inputPairs, suppressOutput, redo,\n                                threadText, heightLimitString, logger)\n                                \n    # Consolidate statistics into a one line summary file\n    percentageFlagFile = os.path.join(options.outputFolder, 'valid_pixel_fraction.txt')\n    consolidateStats(lidarDiffPath, interDiffSummaryPath, \n                     fireballDiffSummaryPath, fireLidarDiffSummaryPath,  \n                     allDemPath, consolidatedStatsPath, percentageFlagFile, logger)\n\n    if options.cleanup and os.path.exists(finalAlignedDEM):\n        # Delete large files that we don't need going forwards.\n        alignPrefix = icebridge_common.getAlignPrefix(options.outputFolder)\n        cleanBatch(options.outputFolder,\n                   alignPrefix, prefixes, interDiffPaths, fireballDiffPaths)\n\n    logger.info('Finished script process_icebridge_batch!')\n\n\n# Run main function if file used from shell\nif __name__ == \"__main__\":\n    sys.exit(main(sys.argv[1:]))\n\n"
  },
  {
    "path": "src/asp/IceBridge/process_icebridge_run.py",
    "content": "#!/usr/bin/env python\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n# Process an entire run of icebrige images. Multiple runs will be started in parallel.\n\n# All the image, camera, and lidar files must have date and time stamps,\n# like the orthoimages and the Fireball DEMs. As such, raw image\n# files must be renamed to be similar to the ortho image files.\n# No other files must be present in those directries.\n# Image files must be single-channel, so use for example gdal_translate -b 1.\n\nimport os, sys, optparse, datetime, multiprocessing, time, logging, subprocess, re\nimport traceback\n\n# We must import this explicitly, it is not imported by the top-level\n# multiprocessing module.\nimport multiprocessing.pool\n\n# The path to the ASP python files\nbasepath    = os.path.abspath(sys.path[0])\npythonpath  = os.path.abspath(basepath + '/../Python')  # for dev ASP\nlibexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP\nicebridgepath = os.path.abspath(basepath + '/../IceBridge')  # IceBridge tools\ntoolspath = os.path.abspath(basepath + '/../Tools')  # ASP Tools\nsys.path.insert(0, basepath) # prepend to Python path\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\nsys.path.insert(0, icebridgepath)\nsys.path.insert(0, libexecpath)\nsys.path.insert(0, toolspath)\n\nimport icebridge_common, process_icebridge_batch\nimport asp_system_utils, asp_alg_utils, asp_geo_utils\nasp_system_utils.verify_python_version_is_supported()\n\n# TODO: Fix the logging!\nlogging.info('DEBUG')\nlogger = logging.getLogger(__name__)\n\n# Prepend to system PATH\nos.environ[\"PATH\"] = libexecpath + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = toolspath   + os.pathsep + os.environ[\"PATH\"]\n\n# This is the file name in the output folder where batch commands will\n#  be written to with the --log-batches option.\nBATCH_COMMAND_LOG_FILE = 'batch_commands_log.txt'\n\ndef processBatch(imageCameraPairs, lidarFolder, referenceDem, skipInterval,\n                 outputFolder, extraOptions, outputResolution, stereoArgs,\n                 batchNum, batchLogPath=''):\n    '''Processes a batch of images at once'''\n\n    suppressOutput = False\n    redo           = False\n\n    argString = ''\n    for pair in imageCameraPairs:\n        argString += pair[0] + ' '\n    for pair in imageCameraPairs:\n        argString += pair[1] + ' '\n\n    # Just set the options and call the pair python tool.\n    # We can try out bundle adjustment for intrinsic parameters here.\n    cmd = ('--lidar-folder %s --reference-dem %s --stereo-image-interval %d --dem-resolution %f' \\\n           ' --output-folder %s %s %s --stereo-arguments ' \n           % (lidarFolder, referenceDem, skipInterval, outputResolution,\n              outputFolder, argString, extraOptions))\n        \n    if batchLogPath:\n        # With this option we just log the commands to a text file\n        # - Setting this option limits to one process so there will be only one \n        #   simultaneous file writer.\n        with open(batchLogPath, 'a') as f:\n            f.write('python ' + icebridge_common.fullPath('process_icebridge_batch.py') + ' ' + \\\n                    cmd +'\"'+ stereoArgs +'\"\\n')\n        return\n    \n    try:\n        args = cmd.split()\n        args += (stereoArgs.strip(),) # Make sure this is properly passed\n        process_icebridge_batch.main(args)\n    except Exception as e:\n        logger.error('Batch processing failed!\\n' + str(e) +\n                     traceback.print_exc())\n\ndef getImageSpacing(orthoFolder, availableFrames, startFrame, stopFrame,\n                    maxOverlapRatio, forceAllFramesInRange):\n    '''Find a good image stereo spacing interval that gives us a good\n       balance between coverage and baseline width.\n       Also detect all frames where this is a large break after the current frame.'''\n\n    logger.info('Computing optimal image stereo interval...')\n\n    ## With very few cameras this is the only possible way to process them\n    #if len(availableFrames) < 3 and not forceAllFramesInRange:\n    #    return ([], {}) # No skip, no breaks\n\n    # Retrieve a list of the ortho files\n    orthoIndexPath = icebridge_common.csvIndexFile(orthoFolder)\n    if not os.path.exists(orthoIndexPath):\n        raise Exception(\"Error: Missing ortho index file: \" + orthoIndexPath + \".\")\n    (orthoFrameDict, orthoUrlDict) = icebridge_common.readIndexFile(orthoIndexPath,\n                                                                    prependFolder = True)\n\n    # From the dictionary create a sorted list of ortho files in the frame range\n    breaks     = []\n    largeSkips = {}\n    orthoFiles = []\n    for frame in sorted(orthoFrameDict.keys()):\n\n        # Only process frames within the range\n        if not ( (frame >= startFrame) and (frame <= stopFrame) ):\n            continue\n\n        orthoPath = orthoFrameDict[frame]\n        frame     = icebridge_common.getFrameNumberFromFilename(orthoPath)\n        \n        if not forceAllFramesInRange:\n            if frame not in availableFrames: # Skip frames we did not compute a camera for\n                continue\n        \n        orthoFiles.append(orthoPath)\n        \n    orthoFiles.sort()\n    numOrthos = len(orthoFiles)\n\n    # First load whatever boxes are there\n    projectionIndexFile = icebridge_common.projectionBoundsFile(os.path.dirname(orthoFolder))\n    logger.info(\"Reading: \" + projectionIndexFile)\n    boundsDict = icebridge_common.readProjectionBounds(projectionIndexFile)\n    \n    # Get the bounding box and frame number of each ortho image\n    logger.info('Loading bounding boxes...')\n    frames = []\n    updatedBounds = False # will be true if some computation got done\n    count = 0\n    for i in range(0, numOrthos):\n\n        # This can be slow, so add a progress dialong\n        count = count + 1\n        if (count - 1) % 1000 == 0:\n            logger.info('Progress: ' + str(count) + '/' + str(numOrthos))\n\n        thisFrame    = icebridge_common.getFrameNumberFromFilename(orthoFiles[i])\n        if thisFrame not in boundsDict:\n            imageGeoInfo   = asp_geo_utils.getImageGeoInfo(orthoFiles[i], getStats=False)\n            thisBox        = imageGeoInfo['projection_bounds']\n            boundsDict[thisFrame] = thisBox\n            updatedBounds = True\n            \n        frames.append(thisFrame)\n\n    # Read this file again, in case some other process modified it in the meantime.\n    # This won't happen in production mode, but can during testing with partial sequences.\n    boundsDictRecent = icebridge_common.readProjectionBounds(projectionIndexFile)\n    for frame in sorted(boundsDictRecent.keys()):\n        if not frame in boundsDict.keys():\n            boundsDict[frame] = boundsDictRecent[frame]\n            updatedBounds = True\n\n    # Save the bounds. There is always the danger that two processes will\n    # do that at the same time, but this is rare, as hopefully we get here\n    # only once from the manager. It is not a big loss if this file gets messed up.\n    if updatedBounds:\n        logger.info(\"Writing: \" + projectionIndexFile)\n        icebridge_common.writeProjectionBounds(projectionIndexFile, boundsDict)\n        \n    # Since we are only comparing the image bounding boxes, not their exact corners,\n    #  these ratios are only estimates.\n    MAX_RATIO   = maxOverlapRatio # = 0.85    # Increase skip until we get below this...\n    MIN_RATIO   = 0.75    # ... but don't go below this value!\n    NOTRY_RATIO = 0.0001  # Don't bother with overlap amounts less than this (small on purpose)\n\n    def getBboxArea(bbox):\n        '''Return the area of a bounding box in form of (minX, maxX, minY, maxY)'''\n        width  = bbox[1] - bbox[0]\n        height = bbox[3] - bbox[2]\n        if (width < 0) or (height < 0):\n            return 0\n        return width*height\n\n    # Iterate over the frames and find the best stereo frame for each    \n    for i in range(0, numOrthos-1):\n    \n        thisFrame = frames[i]\n        thisBox   = boundsDict[thisFrame]\n        thisArea  = getBboxArea(thisBox)\n        interval  = 1\n        \n        while(True):\n            \n            # Compute intersection area between this and next image\n\n            nextFrame = frames[i+interval]\n            nextBox   = boundsDict[nextFrame]\n            intersect = [max(thisBox[0], nextBox[0]), # Min X\n                         min(thisBox[1], nextBox[1]), # Max X\n                         max(thisBox[2], nextBox[2]), # Min Y\n                         min(thisBox[3], nextBox[3])] # Max Y\n            area      = getBboxArea(intersect)\n            ratio = 0\n            if area > 0:\n                ratio = area / thisArea\n            \n            if interval == 1: # Cases for the smallest interval...\n                if ratio < NOTRY_RATIO:\n                    breaks.append(thisFrame) # No match for this frame\n                    logger.info('Detected large break after frame ' + str(thisFrame))\n                    break\n                if ratio < MIN_RATIO:\n                    break # No reason to try increasing skip amounts for this frame\n            else: # interval > 1\n                if ratio < MIN_RATIO: # Went too small, walk back the interval.\n                    interval = interval - 1\n                    break\n                    \n            if ratio > MAX_RATIO: # Too much overlap, increase interval\n                interval = interval + 1\n            else: # Overlap is fine, keep this interval.\n                break\n\n            # Handle the case where we go past the end of frames looking for a match.\n            if i+interval >= len(frames):\n                interval = interval - 1\n                break\n        \n        if interval > 1: # Only record larger than normal intervals.\n            largeSkips[thisFrame] = interval\n\n    logger.info('Detected ' + str(len(breaks)) + ' breaks in image coverage.')\n    logger.info('Detected ' + str(len(largeSkips)) + ' images with interval > 1.')\n\n    return (breaks, largeSkips)\n\ndef list_median(lst):\n    sortedLst = sorted(lst)\n    lstLen = len(lst)\n    index = (lstLen - 1) // 2\n    \n    if (lstLen % 2):\n        return sortedLst[index]\n    else:\n        return (sortedLst[index] + sortedLst[index + 1])/2.0\n    \ndef getRunMedianGsd(imageCameraPairs, referenceDem, isSouth, frameSkip=1):\n    '''Compute the mean GSD of the images across the run'''\n\n    logger.info('Computing mean input image GSD...')\n\n    projString = icebridge_common.getProjString(isSouth)\n\n    # Iterate through the input pairs\n    numPairs  = len(imageCameraPairs)\n    #medianGsd   = 0.0\n    #numChecks = 0.0\n    gsdVals = []\n    for i in range(0, numPairs, frameSkip):\n        pair = imageCameraPairs[i]\n        \n        # Average in the GSD for each file we can process\n        gsd, bounds = icebridge_common.getCameraGsdAndBoundsRetry(pair[0], pair[1], logger, referenceDem, projString)\n        # TODO Move on to the next file on failure\n\n        gsdVals.append(gsd)\n        #medianGsd   += gsd\n        #numChecks += 1.0\n\n    #medianGsd = medianGsd / numChecks\n    medianGsd = list_median(gsdVals)\n    \n    logger.info('Computed input image mean GSD: ' + str(medianGsd))\n    return medianGsd\n\nclass NoDaemonProcess(multiprocessing.Process):\n    # make 'daemon' attribute always return False\n    def _get_daemon(self):\n        return False\n    def _set_daemon(self, value):\n        pass\n    daemon = property(_get_daemon, _set_daemon)\n\n# A pool that allows each process to have its own pool of subprocesses.\n# This should be used with care.\nclass NonDaemonPool(multiprocessing.pool.Pool):\n    Process = NoDaemonProcess\n\n\ndef main(argsIn):\n\n    try:\n        usage = '''usage: process_icebridge_run.py <image_folder> <camera_folder>\n                      <lidar_folder> <output_folder>'''\n                      \n        parser = optparse.OptionParser(usage=usage)\n\n        # Data selection optios\n        parser.add_option('--start-frame', dest='startFrame', default=-1,\n                          type='int', help='The frame number to start processing with.')\n        parser.add_option('--stop-frame', dest='stopFrame', default=-1,\n                          type='int', help='The frame number to finish processing with.')        \n        parser.add_option('--south', action='store_true', default=False, dest='isSouth',  \n                          help='MUST be set if the images are in the southern hemisphere.')\n\n        # Processing options\n        parser.add_option('--stereo-arguments', dest='stereoArgs', default='',\n                          help='Additional argument string to be passed to the stereo command.')\n\n        parser.add_option('--bundle-length', dest='bundleLength', default=2,\n                          type='int', help='Number of images to bundle adjust and process at once.')\n        parser.add_option('--image-stereo-interval', dest='imageStereoInterval', default=None,\n                          type='int', help='Advance this many frames to get the stereo pair.  Default is auto-calculate')\n\n        parser.add_option('--max-overlap-ratio', dest='maxOverlapRatio', default=0.85,\n                          type='float', help='The maximum ratio of overlap between images to be accepted as part of a stereo pair.')\n\n        parser.add_option('--solve-intrinsics', action='store_true', default=False,\n                          dest='solve_intr',  \n                          help='If to float the intrinsics params.')\n\n        #parser.add_option('--dem-resolution', dest='demResolution', default=0.4,\n        #                  type='float', help='Generate output DEMs at this resolution.')\n\n        parser.add_option('--max-displacement', dest='maxDisplacement', default=20,\n                          type='float', help='Max displacement value passed to pc_align.')\n\n\n        # Performance options\n        parser.add_option('--num-processes', dest='numProcesses', default=1,\n                          type='int', help='The number of simultaneous processes to run.')\n        parser.add_option('--num-threads', dest='numThreads', default=None,\n                          type='int', help='The number threads to use per process.')\n\n        # Action options\n        parser.add_option('--interactive', action='store_true', default=False, dest='interactive',  \n                          help='If to wait on user input to terminate the jobs.')\n        parser.add_option('--log-batches', action='store_true', default=False, dest='logBatches',  \n                          help=\"Just log the batch commands to a file.\")\n        parser.add_option('--cleanup', action='store_true', default=False, dest='cleanup',  \n                          help='If the final result is produced delete intermediate files.')\n        parser.add_option('--many-ip', action='store_true', default=False, dest='manyip',  \n                          help='If to use a lot of IP in bundle adjustment from the beginning.')\n        parser.add_option('--dry-run', action='store_true', default=False, dest='dryRun',  \n                          help=\"Print but don't launch the processing jobs.\")\n\n        parser.add_option('--ortho-folder', dest='orthoFolder', default=None,\n                          help='Use ortho files to adjust processing to the image spacing.')\n        parser.add_option('--fireball-folder', dest='fireballFolder', default=None,\n                          help='Location of fireball DEMs for comparison.')\n\n        parser.add_option('--reference-dem', dest='referenceDem', default=None,\n                          help='Reference DEM used to calculate the expected GSD.')\n\n        (options, args) = parser.parse_args(argsIn)\n\n        if len(args) < 4:\n            print(usage)\n            return 0\n\n        imageFolder  = args[0]\n        cameraFolder = args[1]\n        lidarFolder  = args[2]\n        outputFolder = args[3]\n\n    except optparse.OptionError as msg:\n        raise Usage(msg)\n\n    os.system(\"ulimit -c 0\") # disable core dumps\n    os.system(\"umask 022\")   # enforce files be readable by others\n    \n    # Check the inputs\n    for f in [imageFolder, cameraFolder, lidarFolder]:\n        if not os.path.exists(f):\n            logger.error('Input folder '+ f +' does not exist!')\n            return 0\n\n    asp_system_utils.mkdir_p(outputFolder)\n\n    suppressOutput = False\n    redo           = False\n\n    logger.info('\\nStarting processing...')\n    \n    # Get a list of all the input files\n    imageCameraPairs = icebridge_common.getImageCameraPairs(imageFolder, cameraFolder, \n                                                            options.startFrame, options.stopFrame,\n                                                            logger)\n    numFiles = len(list(imageCameraPairs))\n    if numFiles < 2:\n        raise Exception('Failed to find any image camera pairs!')\n    \n    # Check that the files are properly aligned\n    lastFrame = -1\n    availableFrames = []\n    for (image, camera) in imageCameraPairs:\n        frameNumber = icebridge_common.getFrameNumberFromFilename(image)\n        availableFrames.append(frameNumber)\n        if (icebridge_common.getFrameNumberFromFilename(camera) != frameNumber):\n            logger.error('Error: input files do not align!\\n' + str((image, camera)))\n            return -1\n        if frameNumber <= lastFrame:\n            logger.error('Error: input frames not sorted properly!\\n')\n            return -1\n        lastFrame = frameNumber\n\n    # Do not compute output resolution. Will be overwritten anyway per frame. \n    ## Set the output resolution as the computed mean GSD\n    ## TODO: This should be cashed, and recomputed only when the batch file changes!\n    #NUM_GSD_FRAMES = 20\n    #logger.info('Computing GSD with ' + str(NUM_GSD_FRAMES) + ' frames.')\n    #gsdFrameSkip = len(imageCameraPairs) / NUM_GSD_FRAMES\n    #if gsdFrameSkip < 1:\n    #    gsdFrameSkip = 1\n    #medianGsd = getRunMedianGsd(imageCameraPairs, options.referenceDem, options.isSouth,\n    #                            gsdFrameSkip)\n    #outputResolution = icebridge_common.gsdToDemRes(medianGsd)\n    #logger.info('OUTPUT_RESOLUTION: ' + str(outputResolution))\n    outputResolution = 0.4 \n\n    # Generate a map of initial camera positions\n    orbitvizBefore = os.path.join(outputFolder, 'cameras_in.kml')\n    vizString  = ''\n    for (image, camera) in imageCameraPairs: \n        vizString += camera+' '\n    cmd = 'orbitviz_pinhole --hide-labels -o '+ orbitvizBefore +' '+ vizString\n    logger.info('Running orbitviz on input files...')\n\n    # Suppress (potentially long) output\n    asp_system_utils.executeCommand(cmd, orbitvizBefore, True, redo)\n\n    # Set up options for process_icebridge_batch\n    extraOptions = ''\n    if options.numThreads:\n        extraOptions += ' --num-threads ' + str(options.numThreads)\n    if options.solve_intr:\n        extraOptions += ' --solve-intrinsics '\n    if options.isSouth:\n        extraOptions += ' --south '\n    if options.maxDisplacement:\n        extraOptions += ' --max-displacement ' + str(options.maxDisplacement)\n    if options.fireballFolder:\n        extraOptions += ' --fireball-folder ' + str(options.fireballFolder)\n    if options.cleanup:\n        extraOptions += ' --cleanup '\n    if options.manyip:\n        extraOptions += ' --many-ip '\n\n    # We ran this before, as part of fetching, so hopefully all the data is cached\n    forceAllFramesInRange = False\n    (breaks, largeSkips) = getImageSpacing(options.orthoFolder, availableFrames,\n                                           options.startFrame, options.stopFrame,\n                                           options.maxOverlapRatio,\n                                           forceAllFramesInRange)\n    if options.imageStereoInterval: \n        logger.info('Using manually specified image stereo interval: ' +\n                    str(options.imageStereoInterval))\n        largeSkips = [] # Always use a manually specified skip interval\n    else:\n        options.imageStereoInterval = 1\n\n    sleepTime = 20\n\n    # If all we are doing is logging commands then one process is sufficient.\n    # - Wipe the output file while we are at it.\n    batchLogPath = ''\n    batchNum = 0\n\n    if options.logBatches:\n        options.numProcesses = 1\n        sleepTime    = 1\n        batchLogPath = os.path.join(outputFolder, BATCH_COMMAND_LOG_FILE)\n        os.system('rm -f ' + batchLogPath)\n        logger.info('Just generating batch log file '+batchLogPath+', no processing will occur.')\n\n    logger.info('Starting processing pool with ' + str(options.numProcesses) +' processes.')\n    pool = NonDaemonPool(options.numProcesses)\n    \n    # Call process_icebridge_batch on each batch of images.\n    # - Batch size should be the largest number of images which can be effectively bundle-adjusted.\n    taskHandles           = []\n    batchImageCameraPairs = []\n    frameNumbers          = []\n    i = 0 # The frame index that starts the current batch\n    while True: # Loop for adding batches\n\n        # Bugfix: arrived at the last feasible frame (maybe there are more but\n        # they lack cameras).\n        if i >= len(list(imageCameraPairs)):\n            break\n        \n        firstBundleFrame = icebridge_common.getFrameNumberFromFilename(imageCameraPairs[i][0])\n        \n        # Determine the frame skip amount for this batch (set by the first frame)\n        thisSkipInterval = options.imageStereoInterval\n        if firstBundleFrame in largeSkips:\n            #print(\" \", firstBundleFrame, \" in largeskips!\" )\n            thisSkipInterval = largeSkips[firstBundleFrame]\n        thisBatchSize = options.bundleLength + thisSkipInterval - 1\n\n        # Keep adding frames until we have enough or run out of frames\n        j = i # The frame index that ends the batch\n        while True:\n            \n            if j >= len(imageCameraPairs):\n                # Bugfix: arrived at the last feasible frame.\n                break\n            \n            frameNumber = icebridge_common.getFrameNumberFromFilename(imageCameraPairs[j][0])\n            # Useful debugging code\n            #print(\"Framenumber is \", frameNumber)\n            #if int(frameNumber) > 8531:\n            #    #    pass\n            #    for t in range(8340, 8360):\n            #        print(\"i frame is \", t, imageCameraPairs[t][0])\n            #    print(\"breaks are \", breaks)\n            #    sys.exit(1)\n                \n            # Update conditions\n            hitBreakFrame = (frameNumber in breaks)\n            \n            lastFrame     = (frameNumber > options.stopFrame) or (j >= numFiles)\n            endBatch      = ( len(frameNumbers) >= thisBatchSize )\n\n            if lastFrame or endBatch:\n                break # The new frame is too much, don't add it to the batch\n        \n            # Add frame to the list for the current batch\n            batchImageCameraPairs.append(imageCameraPairs[j])\n            frameNumbers.append(frameNumber)\n            \n            if hitBreakFrame:\n                logger.info(\"Hit a break, won't start a batch with frame: \" + str(frameNumber))\n                break # Break after this frame, it is the last one added to the batch.\n            \n            j = j + 1\n        # Done adding frames to this batch\n\n        if len(frameNumbers) <= thisSkipInterval:\n            logger.info('Batch from frame: ' + str(firstBundleFrame) +\n                        ' is too small to run. Skipping.')\n        else:\n\n            # Submit the batch\n            if not options.logBatches:\n                logger.info('Processing frame number: ' + str(firstBundleFrame))\n                     \n            # The output folder is named after the first and last frame in the batch.\n            # We count on this convention in blend_dems.py.\n            batchFolderName  = icebridge_common.batchFolderName(frameNumbers[0], frameNumbers[-1],\n                                                                options.bundleLength)\n            thisOutputFolder = os.path.join(outputFolder, batchFolderName)\n\n            if not options.logBatches:\n                logger.info('Running processing batch in output folder: ' +  \\\n                            thisOutputFolder + '\\n' + 'with options: '    +  \\\n                            extraOptions + ' --stereo-arguments '         +  \\\n                            options.stereoArgs)\n\n            if not options.dryRun:\n                # Generate the command call\n                taskHandles.append(pool.apply_async(processBatch, \n                    (batchImageCameraPairs, lidarFolder, options.referenceDem, thisSkipInterval,\n                     thisOutputFolder, extraOptions, \n                     outputResolution, options.stereoArgs, batchNum, batchLogPath)))\n            batchNum += 1\n            \n        \n        # Reset these lists\n        batchImageCameraPairs = []\n        frameNumbers          = []\n        \n        # Advance to the frame that starts the next batch\n        if hitBreakFrame:\n            # When we hit a break in the frames we need to start the\n            # next batch after the break frame\n            #print(\"Hit break frame for i, j, frameNumber\", i, j, frameNumber)\n            i = j + 1\n        else:\n            # Start in the next frame that was not used as a \"left\" stereo image.\n            i = i + options.bundleLength - 1\n        \n        if lastFrame:\n            break # Quit the main loop if we hit the end of the frame list.\n\n    # End of loop through input file pairs\n    logger.info('Finished adding ' + str(len(taskHandles)) + ' tasks to the pool.')\n    \n    # Wait for all the tasks to complete\n    icebridge_common.waitForTaskCompletionOrKeypress(taskHandles, logger, options.interactive, \n                                                     quitKey='q', sleepTime=sleepTime)\n\n    # Either all the tasks are finished or the user requested a cancel.\n    # Clean up the processing pool\n    icebridge_common.stopTaskPool(pool)\n\n    logger.info('Finished process_icebridge_run.') # to avoid ending a log with 'waiting ...'\n\n# Run main function if file used from shell\nif __name__ == \"__main__\":\n    sys.exit(main(sys.argv[1:]))\n\n\n\n"
  },
  {
    "path": "src/asp/IceBridge/push_to_nsidc.py",
    "content": "#!/usr/bin/env python\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n# Push DEMs and orthos to NSIDC.\n# Usage: /usr/bin/python push_to_nsidc.py --yyyymmdd 20140321 --site GR --camera-calibration-folder camera_calib --reference-dem-folder reference_dems --login-info 'user,password server.nsidc.org'\n\n# If there is more than one archive, push the one with the latest\n# modification time.\n\n# TODO: How to prevent old copies littering the remote directory?\n\nimport os, sys, argparse, datetime, time, subprocess, logging, multiprocessing\nimport re, shutil, glob\n\nimport os.path as P\n\n# The path to the ASP python files and tools\nbasepath      = os.path.dirname(os.path.realpath(__file__)) # won't change, unlike syspath\npythonpath    = os.path.abspath(basepath + '/../Python')     # for dev ASP\nlibexecpath   = os.path.abspath(basepath + '/../libexec')    # for packaged ASP\nicebridgepath = os.path.abspath(basepath + '/../IceBridge')  # IceBridge tools\n\n# Prepend to Python path\nsys.path.insert(0, basepath)\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\nsys.path.insert(0, icebridgepath)\n\nimport icebridge_common, archive_functions, run_helper\nimport asp_system_utils\n\nasp_system_utils.verify_python_version_is_supported()\n\n# Prepend to system PATH\nos.environ[\"PATH\"] = basepath       + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = pythonpath     + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = libexecpath    + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = icebridgepath  + os.pathsep + os.environ[\"PATH\"]\n\ng_start_time = -1\ng_stop_time  = -1\ndef start_time():\n    global g_start_time, g_stop_time\n    g_start_time = time.time()\ndef stop_time(job, logger):\n    global g_start_time, g_stop_time\n    g_stop_time = time.time()\n    wall_s = float(g_stop_time - g_start_time)/3600.0\n    logger.info( (\"Elapsed time for %s is %g hours.\" % (job, wall_s) ) )\n    \ndef fetchIndices(options, logger):\n    '''Fetch the csv indices of available files.'''\n    logger.info(\"Fetch indices from NSIDC.\")\n    pythonPath = asp_system_utils.which('python')\n    cmd = ( (pythonPath + ' ' + icebridge_common.fullPath('full_processing_script.py') + \\\n             ' --camera-calibration-folder %s --reference-dem-folder %s --site %s ' + \\\n             '--yyyymmdd %s --stop-after-index-fetch --no-nav ' ) % \\\n            (options.inputCalFolder, options.refDemFolder, options.site, options.yyyymmdd))\n    logger.info(cmd)\n    start_time()\n    os.system(cmd)\n    stop_time(\"fetch index\", logger)\n    \ndef pushByType(run, options, logger, dataType):\n               \n    # Fetch the ortho index from NSIDC if missing\n    outputFolder   = run.getFolder()\n    logger.info(\"Output folder is \" + outputFolder)\n    os.system(\"mkdir -p \" + outputFolder)\n    \n    # Current directory. It is important to go from /u to the real dir which is /nobackup...\n    unpackDir = os.path.realpath(os.getcwd())\n    logger.info(\"Unpack directory is \" + unpackDir)\n    \n    orthoFolder    = icebridge_common.getOrthoFolder(outputFolder)\n    orthoIndexPath = icebridge_common.csvIndexFile(orthoFolder)\n    if not os.path.exists(orthoIndexPath):\n        fetchIndices(options, logger)\n        \n    logger.info(\"Reading ortho index: \" + orthoIndexPath)\n    (orthoFrameDict, orthoUrlDict) = icebridge_common.readIndexFile(orthoIndexPath)\n\n    # Fetch unarchived folder if missing\n    if dataType == 'DEM':\n        unarchivedFolder = run.getAssemblyFolder()\n    elif dataType == 'ORTHO':\n        unarchivedFolder = run.getProcessFolder()\n    else:\n        raise Exception(\"Unknown data type: \" + dataType)\n    logger.info(\"Unarchived data folder is \" + unarchivedFolder)\n    \n    # Especially for ortho, force-fetch each time, as there is no good way\n    # of checking if we fetched well before.\n    start_time()\n    if not archive_functions.fetchProcessedByType(run, unpackDir, logger, dataType):\n        return\n    stop_time(\"fetching archived data by type: \" + dataType, logger)\n\n    # Make the output directory at NSIDC\n    m = re.match(\"(\\d\\d\\d\\d)(\\d\\d)(\\d\\d)\", options.yyyymmdd)\n    if m:\n        outDir = options.site + \"_\" + m.group(1) + \".\" + m.group(2) + \".\" + m.group(3)\n    else:\n        raise Exception(\"Could not parse: \" + options.yyyymmdd)\n\n    # Keep the output directory locally here\n    localDirPath = os.path.join(outputFolder, dataType, outDir)\n    os.system(\"mkdir -p \" + localDirPath)\n\n    logger.info(\"Storing the renamed \" + dataType + \" files in \" + localDirPath)\n    logger.info(\"Directory name at NSIDC: \" + outDir)\n\n    # Read the DEMs and orthos, and copy them to outDir according to the final convention\n    if dataType == 'DEM':\n        dataFiles = icebridge_common.getTifs(unarchivedFolder, prependFolder=True)\n    else:\n        dataFiles = glob.glob(os.path.join(unarchivedFolder, 'batch_*', 'out-ortho.tif'))\n        \n    for dataFile in dataFiles:\n\n        # Here we use the convention from archive_functions.py for DEMs and from how we store orthos.\n        if dataType == 'DEM':\n            m = re.match(\"^.*?\" + unarchivedFolder + \"/F_(\\d+)_\\d+_\" + dataType + \\\n                         \"\\.tif$\", dataFile)\n            if not m:\n                continue\n            frameNumber = int(m.group(1))\n        else:\n            m = re.match(\"^.*?\" + unarchivedFolder + \"/batch_(\\d+)_\\d+_\\d+/\" + \\\n                         \"out-ortho.tif$\", dataFile)\n            if not m:\n                continue\n            frameNumber = int(m.group(1))\n            \n        if frameNumber < options.startFrame or frameNumber > options.stopFrame:\n            continue\n\n        # For each data file, copy from the ortho its meta info\n        if not frameNumber in orthoFrameDict.keys():\n            # Bugfix: Ortho fetching failed, try again\n            fetchIndices(options, logger)\n            logger.info(\"Re-reading ortho index: \" + orthoIndexPath)\n            (orthoFrameDict, orthoUrlDict) = icebridge_common.readIndexFile(orthoIndexPath)\n            if not frameNumber in orthoFrameDict.keys():\n                # This time there is nothing we can do\n                raise Exception(\"Cannot find ortho for frame: \" + str(frameNumber))\n            \n        orthoFile = orthoFrameDict[frameNumber]\n        [dateString, timeString] = icebridge_common.parseTimeStamps(orthoFile)\n\n        # It is always possible that the ortho file date will be the next day\n        # after the current flight date, if the flight goes after midnight.\n        # So it is not unreasonable that options.yyyymmdd != dateString.\n\n        if dataType == 'DEM':\n            outFile = ('IODEM3_%s_%s_%05d_DEM.tif' % (dateString, timeString, frameNumber))\n        else:\n            # TODO: Need to think more of the naming convention.\n            outFile = ('IODEM3_%s_%s_%05d_ORTHO.tif' % (dateString, timeString, frameNumber))\n            \n        cmd = \"/bin/cp -fv \" + dataFile + \" \" + os.path.join(localDirPath, outFile)\n        logger.info(cmd)\n        os.system(cmd)\n\n    # Push the directory to NSIDC\n    remoteDirPath = os.path.join(os.path.basename(os.path.dirname(localDirPath)),\n                           os.path.basename(localDirPath))\n    remoteDirPath = os.path.join('/incoming', 'Ames', remoteDirPath)\n    logger.info(\"Storing at NSIDC in: \" + remoteDirPath)\n\n    cmd = 'lftp -e \"mirror -P 20 -c -R -vvv --delete --delete-first ' + localDirPath + \\\n          ' ' + remoteDirPath + ' -i \\'\\.(tif)$\\'; bye\\\" -u ' + options.loginInfo\n    logger.info(cmd)\n    start_time()\n\n    (output, err, status) = asp_system_utils.executeCommand(cmd,\n                                                            suppressOutput = True)\n    #status = os.system(cmd)\n    logger.info(\"LFTP output and error: \" + output + ' ' + err)\n    logger.info(\"LFTP status: \" + str(status))\n    #if status != 0:\n    #    raise Exception(\"Problem pushing\")\n    \n    stop_time(\"push to NSIDC\", logger)\n\ndef main(argsIn):\n\n    try:\n        usage = '''usage: push_to_nsidc.py <options> '''\n        parser = argparse.ArgumentParser(usage=usage)\n\n        parser.add_argument(\"--yyyymmdd\",  dest=\"yyyymmdd\", default=\"\",\n                            help=\"Specify the year, month, and day in one YYYYMMDD string.\")\n\n        parser.add_argument(\"--site\",  dest=\"site\", default = \"\",\n                            help=\"Name of the location of the images (AN, GR, or AL)\")\n                            \n        parser.add_argument(\"--site_yyyymmdd\",  dest=\"site_yyyymmdd\", default = \"\",\n                            help=\"A value like GR_20150330, which will be split into site and yyyymmdd by this script.\")\n\n        parser.add_argument('--start-frame', dest='startFrame', type=int,\n                            default=icebridge_common.getSmallestFrame(),\n                            help=\"Frame to start with.  Leave this and stop-frame blank to \" + \\\n                            \"process all frames.\")\n        \n        parser.add_argument('--stop-frame', dest='stopFrame', type=int,\n                            default=icebridge_common.getLargestFrame(),\n                            help='Frame to stop on.')\n        parser.add_argument(\"--camera-calibration-folder\",  dest=\"inputCalFolder\", default=None,\n                          help=\"The folder containing camera calibration.\")\n        \n        parser.add_argument(\"--reference-dem-folder\",  dest=\"refDemFolder\", default=None,\n                          help=\"The folder containing DEMs that created orthoimages.\")\n\n        parser.add_argument(\"--login-info\",  dest=\"loginInfo\", default=None,\n                            help=\"user,password destination.nsidc.org.\")\n\n        parser.add_argument(\"--done-file\",  dest=\"doneFile\", default=None,\n                            help=\"List of runs that were done by now.\")\n\n        options = parser.parse_args(argsIn)\n\n    except argparse.ArgumentError as msg:\n        parser.error(msg)\n\n    # parse --site_yyyymmdd. Sometimes it is easier to pass this than\n    # to pass separately --site and --yyyymmdd.\n    m = re.match('^(\\w+)_(\\w+)', options.site_yyyymmdd)\n    if m:\n        options.site = m.group(1)\n        options.yyyymmdd = m.group(2)\n    else:\n        options.site_yyyymmdd = options.site + \"_\" + options.yyyymmdd\n        \n    # Read the done file and exit if the current flight is done\n    done = set()\n    if options.doneFile != \"\":\n        with open(options.doneFile, 'r') as f:\n            for val in f:\n                val = val.strip()\n                done.add(val)\n    if options.site_yyyymmdd in done:\n        print(\"Skipping done flight: \" + options.site_yyyymmdd)\n        return 0\n    \n    run = run_helper.RunHelper(options.site, options.yyyymmdd, os.getcwd())\n\n    # Set up logging in the run directory. Log outside of the run dir,\n    # as that one we will wipe\n    logFolder = os.path.abspath(os.path.join(run.getFolder(), '..', 'push_logs'))\n    os.system('mkdir -p ' + logFolder)\n    logLevel = logging.INFO\n    logger   = icebridge_common.setUpLogger(logFolder, logLevel, \"push\")\n    logger.info(\"Logging in: \" + logFolder)\n\n    # Check the lftp version. On some machines it is too old. \n    (out, err, status) = asp_system_utils.executeCommand(['lftp', '--version'],\n                                                         suppressOutput = True)\n    m = re.match('^.*?LFTP\\s+\\|\\s+Version\\s+4.5', out)\n    if not m:\n        raise Exception('Expecting LFTP version 4.5.')\n    else:\n        logger.info(\"Found an acceptable version of LFTP.\")\n    \n    pushByType(run, options, logger, 'DEM')\n    #pushByType(run, options, logger, 'ORTHO') # need to wait for format decision\n\n    # Wipe at the end\n    cmd = \"rm -rf \" + run.getFolder()\n    logger.info(cmd)\n    os.system(cmd)\n    \n# Run main function if file used from shell\nif __name__ == \"__main__\":\n    sys.exit(main(sys.argv[1:]))\n"
  },
  {
    "path": "src/asp/IceBridge/qi2txt.cc",
    "content": "/*\n* Initial version was received at NSIDC from Serdar Manizade.  Modified\n* significantly by Bruce Raup (braup@nsidc.org).\n* 7-8-16 Modified by Cade \"The Intern\" Haley to accommodate 10 and 14-word data\n* \tplus other output modes\n* \n* qi2txt()  creates ascii output (to standard output) from qfit binary files\n* (12-word input).  Output stream contains the laser lat/lon/elev/hhmmss\n* (removed output of passive data and laser srt).  Originally written by Bob\n* Swift/EG&G, Modified by Serdar Manizade 08-Feb-2010.  Output format includes\n* title for each column, comma delimited.\n*\n* Input data are in big-endian format.  This reader automatically detects the\n* endianness of the host machine and swaps if needed.\n* \n*\n* The output columns are different depending on whether the ATM records\n* are 10, 12, or 14 words long (hence the need for 'scale' and 'multiply_table'\n* below). The corresponding column information will be printed to standard output.\n*/\n\n/* Copied from qi2txt-readme.txt\n\nOVERVIEW\n\nThis readme accompanies the IceBridge QFIT data reader: qi2txt\n\nThe qi2txt program reads binary data files from the Operation IceBridge ATM\ninstrument, which are available as the ILATM1B and BLATM1B product at the\nNational Snow and Ice Data Center (NSIDC), at\n\nhttp://nsidc.org/data/ilatm1b.html\n\nThis software is available at\n\nhttp://nsidc.org/data/icebridge/tools.html\n\nDISCLAIMER\n\nThis software is provided as-is as a service to the user community in the\nhope that it will be useful, but without any warranty of fitness for any\nparticular purpose or correctness.  Bug reports, comments, and suggestions\nfor improvement are welcome; please send to nsidc@nsidc.org.\n\nCHANGELOG\n\nv0.4 >> 7-8-16 Modified to accommodate 10 and 14-word data outputs\n       plus more output modes:\n        - Short output  -Coordinates only -First and Last -Print all\n\nThe program assumes by default that the input binary QFIT file is in big\nendian format.  It tests the endianness of the host machine and swaps the\ndata to match that of the host machine.  To have the program assume the\ndata format is little endian, use the -L option.\n\n\nExamples of using the reader:\n\nConvert an entire binary input file to a (possibly huge) text file:\n  $ ./qi2txt inputfile.qi > outfile_ascii.txt\n\nExtract lat, lon, elevation only, skipping over the header line:\n  $ ./qi2txt -S inputfile.qi > xyz.txt\n\nPrint the first few lines, and tell the program that the input file is in\nlittle endian format:\n  $ ./qi2txt -L inputfile.qi | head -n10\n\n*/\n\n\n#include <stdio.h>\n#include <stdlib.h>\n\n\n\n/*----------------------------------------------------------------------\n * Contents of define.h - operating system dependent stuff\n *----------------------------------------------------------------------*/\n\nstatic const char define_h_rcsid[] = \"$Id: define.h 16072 2010-01-30 19:39:09Z brodzik $\";\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <limits.h>\n#include <math.h>\n#include <assert.h>\n\n#ifdef DEBUG_MALLOC\n#include \"dbmalloc.h\"\n#endif\n\n#ifndef FALSE\n#define FALSE 0\n#endif\n#ifndef TRUE\n#define TRUE 1\n#endif\n\n#define NEVER FALSE\n\n#ifndef PI\n#define PI 3.141592653589793\n#endif\n\n#define radians(t) ( (t) * PI / 180.0)\n#define degrees(t) ( (t) * 180.0 / PI)\n\n#define nint(x) ((int)((x)+.5))\n\n#define sign(x) ((x) < 0 ? -1 : 1)\n\n#define streq(s1,s2) (strcmp(s1,s2) == 0)\n\n#ifdef NEED_STRDUP\nstatic char *t_sd_p;\n#define strdup(string) \\\n  t_sd_p = (char *)malloc(strlen(string)+1); \\\n  if (t_sd_p) strcpy(t_sd_p, string); \n#endif\n\n#define NUMBER(a) ((int)(sizeof(a)/sizeof(a[0])))\n\n#define ABORT EXIT_FAILURE\n\n#define error_exit(msg) {fprintf(stderr,\"%s\\n\",msg); exit(ABORT);}\n\n#define repeat do\n#define until(condition) while(!(condition))\n\n#define MAX_STRING 256\n\n//typedef int bool;\n\ntypedef unsigned char byte1;\ntypedef unsigned short int byte2;\ntypedef unsigned int byte4;\ntypedef unsigned long long NSIDCbyte8;\n\ntypedef char int1;\ntypedef short int int2;\ntypedef int int4;\ntypedef long long NSIDCint8;\n\n#define BYTE1_BITS CHAR_BIT\n#define BYTE1_MAX UCHAR_MAX\n#define BYTE2_MAX USHRT_MAX\n#define BYTE4_MAX UINT_MAX\n#define NSIDCBYTE8_MAX ULLONG_MAX\n\n#define INT1_MAX SCHAR_MAX\n#define INT2_MAX SHRT_MAX\n#define INT4_MAX INT_MAX\n#define NSIDCINT8_MAX LLONG_MAX\n\n#define BYTE1_MIN 0\n#define BYTE2_MIN 0\n#define BYTE4_MIN 0\n#define NSIDCBYTE8_MIN 0\n\n#define INT1_MIN SCHAR_MIN\n#define INT2_MIN SHRT_MIN\n#define INT4_MIN INT_MIN\n#define NSIDCINT8_MIN LLONG_MIN\n\n\n/*----------------------------------------------------------------------\n * END contents of define.h\n *----------------------------------------------------------------------*/\n\n\n\n#define SEEK_SET        0\n#define MAXARG          14\n#define LAT_MIN         0\n#define LAT_MAX         90\n\n/* There are system endian.h definitions, but I'm not sure these are available\n* on all potential platforms.  This source file includes a small routine to\n* test the endianness of the machine it's running on.\n*/\n\n#define MY_BIG_ENDIAN      0\n#define MY_LITTLE_ENDIAN   1\n#define MAX_NAME_LENGTH    1024\n#define VERSION            0.4\n\n\nint short_output = 0;\nint coordinates_output = 0;\nint first_n_last = 0;\nint printall = 0;\n\nint host_endianness;\nint data_endianness;\n\n/*======================================================================*/\n/* byte swap function myswap */\nint4 myswap(char *in, char* out, int4 len, int4 cnt) {\n    int4 i,  j,  k, sp, ep;\n\n    for (i=0; i<cnt; ++i) {\n\n        sp = i*len;\n        ep = sp+len-1;     /* ((i+1) * len)-1; */\n\n        for (j=sp, k=0; j<=ep; ++j, ++k) {\n            out[j] = in[ep-k];\n        }\n    }\n    return(i);\n}\n\n/*======================================================================*/\nint testendianness(void) {\n\n    typedef union\n    {\n        int i;\n        char c[4];\n    } u;\n\n    u temp;\n    temp.i = 0x12345678;\n\n    if (temp.c[0] == 0x12) {\n      return(MY_BIG_ENDIAN);\n    }\n    else {\n      return(MY_LITTLE_ENDIAN);\n    }\n}\n\n\n/*======================================================================*/\nint4 get_record_length(int4 *value, int4 *svalue, FILE *infile) {\n\n    int4 nvar;// ipart;\n\n    fread((char *)value,sizeof(*value),1,infile);//Read single int4\n \n    /* swap bytes if host machine is little-endian (e.g. PC) */\n    if (host_endianness != data_endianness) {\n      /*ipart =*/ myswap((char*)value,(char*)svalue,4,1); // Swap the bytes in that int4\n      nvar = *(svalue) / 4;\n    }\n    else {\n      /* Sun Workstations, etc. */\n      nvar = *(value) / 4;\n    }\n\n    /*  rewind file */\n    fseek (infile,0L,SEEK_SET);\n\n    /*  read past first record */\t \n    fread((char *)value,sizeof(*value),nvar,infile); // Read again but length of that first integer into infile\n\n    return( nvar );\n}\n\n\n/*======================================================================*/\n/* Print function which accommodates a variety of modes  */\n// word_format = values 0-2 representing 10, 12, and 14 word modes, respectively\n// mode = Different print modes. 'n' = normal, 'h' = header only\n// bufout = Pointer to the array containing the multiplied results\n\nvoid printData(int word_format, char mode, double * bufout){\n\t\t\n\tif (short_output){\n\t\tif (mode == 'h'){\n\t\t\tfprintf(stdout,\"# LATITUDE,LONGITUDE,ELEVATION,TIME-HHMMSS\\n\");\n\t\t\treturn;\n\t\t}\n\t\tswitch(word_format){\n\t\t\tcase 0:\n\t\t\t\tfprintf(stdout,\"%10.7f  %11.7f  %8.3f  %011.4f\\n\",\n\t\t\t\tbufout[1], bufout[2],bufout[3],bufout[9]);\n\t\t\tbreak;\n\t\t\tcase 1:\t\n\t\t\t\tfprintf(stdout,\"%10.7f  %11.7f  %8.3f  %011.4f\\n\",\n\t\t\t\tbufout[1], bufout[2],bufout[3],bufout[11]);\n\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\n\t\t\t\tfprintf(stdout,\"%10.7f  %11.7f  %8.3f  %011.4f\\n\",\n\t\t\t\tbufout[1], bufout[2],bufout[3],bufout[13]);\n\t\t\tbreak;\n\t\t}\t\n\t}\n\telse if (coordinates_output){ //Longitude, latitude\n\t\tif (mode == 'n'){\n\t\t\tfprintf(stdout,\"%.6f %.6f\\n\", bufout[2], bufout[1]);\n\t\t}\n\t}\n\n\telse { /* full output */\n\t\tswitch(word_format){\n\t\t\tcase 0: // 10 word\n\t\t\t\tif (mode == 'h'){\n\t\t\t\t\tfprintf(stdout,\"# REL_TIME,LATITUDE,LONGITUDE,ELEVATION,strt_pulse_sigstr,ref_sigstr,azi,pitch,roll,time-hhmmss\\n\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tfprintf(stdout,\n\t\t\t\t\"%10.6f %10.7f %11.7f %8.3f %7.0f %5.0f %5.0f %10.3f %11.3f %011.4f\\n\",\n\t\t\t\tbufout[0], bufout[1], bufout[2], bufout[3], bufout[4], bufout[5],\n\t\t\t\tbufout[6], bufout[7], bufout[8], bufout[9]);\n\t\t\tbreak;\n\t\t\tcase 1:\t// 12 word\n\t\t\t\tif (mode == 'h'){\n\t\t\t\t\tfprintf(stdout,\"# REL_TIME,LATITUDE,LONGITUDE,ELEVATION,strt_pulse_sigstr,ref_sigstr,azi,pitch,roll,gps_dil_prec,pulse_width,time-hhmmss\\n\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tfprintf(stdout,\n\t\t\t\t\"%10.6f %10.7f %11.7f %8.3f %7.0f %5.0f %5.0f %10.3f %11.3f %8.1f %10.1f %011.4f\\n\",\n\t\t\t\tbufout[0], bufout[1], bufout[2], bufout[3], bufout[4], bufout[5],\n\t\t\t\tbufout[6], bufout[7], bufout[8], bufout[9], bufout[10], bufout[11]);\n\t\t\tbreak;\n\t\t\tcase 2: // 14 word\n\t\t\t\tif (mode == 'h'){\n\t\t\t\t\tfprintf(stdout,\"# REL_TIME,LATITUDE,LONGITUDE,ELEVATION,strt_pulse_sigstr,ref_sigstr,azi,pitch,roll,passive_sig,pass_foot_lat,pass_foot_long,pass_foot_synth_elev,time-hhmmss\\n\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tfprintf(stdout,\n\t\t\t\t\"%10.6f %10.7f %11.7f %8.3f %7.0f %5.0f %5.0f %10.3f %11.3f %7.0f %10.7f %10.7f %8.3f %011.4f\\n\",\n\t\t\t\tbufout[0], bufout[1], bufout[2], bufout[3], bufout[4], bufout[5], bufout[6],\n\t\t\t\tbufout[7], bufout[8], bufout[9], bufout[10], bufout[11], bufout[12], bufout[13]);\n\t\t\tbreak;\n\t\t}\t\n\t}\n}\n\n\nint main(int argc, char *argv[]) {\n    char infilename[MAX_NAME_LENGTH]; // 100 long c string\n    FILE *infile; // Pointer to infile c string\n    int4 value[MAXARG], svalue[MAXARG];//, gvalue[MAXARG];// value, s, and g w/ 14 spots each\n    long unsigned int in_rec = 0, out_rec = 0;\n    int4 neg_rec_count = 0;\n    int4 j, nvar, /*ipart,*/ multiply_rule;\n    // This scale represents a combination of word sizes,\n    // appropriately multiplied by 'multiply_matrix'\n    double scale[MAXARG] = {\n                              1.0e3,\n                              1.0e6,\n                              1.0e6,\n                              1.0e3,\n                              1.0,\n                              1.0,\n                              1.0e3,\n                              1.0e3,\n                              1.0e3,\n                              1.0e1,\n                              1.0e6,\n                              1.0e6,\n\t\t\t      1.0e3,\n\t\t\t      1.0\n                           };\n    int multiply_table[3][MAXARG] = // 3 word formats, 14 max words\n\t\t\t\t    // 0 = don't multiply, 1 = multiply by scale[i], 2 = is timestamp\n\t{{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 0, 0, 0},\n\t { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 0, 0},\n\t { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 2}};\n    int word_format;\n    double bufout[MAXARG];// 14 entries\n    const char *endian[] = { \"big\", \"little\" };\n    float version = VERSION;\n\n    host_endianness = testendianness();\n\n    // Had to make some edits here to accept more than one argument at once!\n\n    if (argc < 2) {\n      fprintf(stderr, \"%s version %g\\n\", argv[0], version );\n      fprintf( stderr, \"Usage:  %s [-S/-C/-L/-F/-P] inputfile\\n\", argv[0] );\n      fprintf( stderr, \"  Use -S to print shortened version (only LAT,LONG,ELEVATION,TIME)\\n\" );\n      fprintf( stderr, \"  Use -C to print coordinates only (for generating .spatial files)\\n\" );\n      fprintf( stderr, \"  Use -L to assume data is little-endian\\n\" );\n      fprintf( stderr, \"  Use -F to print only first and last valid lines in short form\\n\" );\n      fprintf( stderr, \"  Use -P to forceably print all lines, even if garbage (for debug)\\n\" );\n      fprintf( stderr, \"  By default the program assumes the data are big-endian\\n\" );\n      fprintf( stderr, \"  In either case, it tests the host architecture and will\\n\" );\n      fprintf( stderr, \"  try to match the data to that endianness.\\n\" );\n      fprintf( stderr, \"(Enter any key to exit)\\n\" );\n      getchar();\n      exit(1);\n    }\n\n    // To keep this code simple, this must be the last argument!\n    int file_index = argc - 1;\n    data_endianness = MY_BIG_ENDIAN;\n\n    // Check for flags\n    for (int i=1; i<argc-1; ++i) {\n      if (strcmp(argv[i], \"-S\")==0) // Short mode\n        short_output = 1;\n      if (strcmp(argv[i], \"-C\")==0) // Coordinates only\n        coordinates_output = 1;\n      if (strcmp(argv[i], \"-L\")==0) // Little endian mode\n        data_endianness = MY_LITTLE_ENDIAN;\n      if (strcmp(argv[i], \"-F\")==0){ // Print first and last records only\n        first_n_last = 1;\n        short_output = 1;\n      }\n      if (strcmp(argv[i], \"-P\")==0) // Print all records, even negative\n        printall = 1;\n    }\n    \n    strncpy(infilename, argv[file_index], MAX_NAME_LENGTH); // Dump first arg name into 1024 long c string\n\n    fprintf(stderr, \"%s version %g\\n\", argv[0], version );\n    fprintf(stderr, \" Input file:  %s\\n\", infilename);\n    fprintf(stderr, \"This machine is %s endian.\\n\", endian[host_endianness]);\n    fprintf(stderr, \"Assuming data are %s endian.\\n\", endian[data_endianness]);\n \n    infile=fopen(infilename,\"rb\"); // Open the filename in binary read mode, give pointer to file object\n    if (infile==NULL) {\n        fprintf(stderr, \"cannot open input file\\n\");\n        exit(1);\n    }\n\n    /*  read first record and verify fixed record length */\n    nvar = get_record_length(value, svalue, infile);\n    word_format = (nvar-10)/2; // 10word = 0, 12word = 1, 14word = 2\n    // Quick error check\n    if (word_format > 2){\n\tfprintf(stderr, \"ERROR: Unexpected words/record %d\\n\", nvar);\n\texit(1);\n    }\n    fprintf(stderr, \"Number of words/record = %d\\n\", nvar);\n    fprintf(stderr, \"Skipping records with negative time values.\\n\");\n      \n //    // OUTPUT FILE instead of stdout\n //   FILE *output = fopen(\"output.txt\",\"w+\");\n //   if (output==NULL){\n //       fprintf(stderr, \"cant create output file\");\n //       exit (1);\n //   }\n    int found_first = 0;\n    int found_last = 0;\n    int nvar_mult = 0;\n\n    printData(word_format, 'h', NULL); // Print headers\n    \n    \n    // Begin fairly slow stdout print. Want speedup? fputs out to file instead!\n    while (fread((char *)value,sizeof(*value),nvar,infile) != 0) {\n        ++in_rec;\n\n\n        /* swap bytes if host machine is little-endian (e.g. PC) */\n        if (host_endianness != data_endianness) {\n      \t  /*ipart =*/ myswap((char*)value,(char*)svalue,sizeof(*value),nvar);\n        }\n        else {\n          /* host machine is big-endian (e.g. Sun Workstation) */\n          for (j=0; j < nvar; j++) svalue[j] = value[j]; \n        }\n\n\n        /*  skip header records which begin with negative integers */\n        // if (*(svalue) >= 0 && (in_rec%20000)==0) {\n        if (*(svalue) >= 0 || printall == 1) {\n            /*  convert scaled integers to double precision reals */\n            for (j=0; j < nvar; j++){\n\t\tmultiply_rule=multiply_table[word_format][j];\n\t\tif (multiply_rule == 1){ // Regular divide (value / scale)\n                    bufout[j] = svalue[j] / scale[j];\n\t\t}\n\t\telse if (multiply_rule == 2){ // Is an HHMMSS timestamp\n\t\t    bufout[j] = svalue[j] / 1.0e3;\n\t\t}\n\t\telse{ // Doesn't need to be scaled\n\t\t    bufout[j] = svalue[j];\n\t\t}\n\t    }\n            /*  convert positive east longitude to negative when value exists */\n            if (bufout[2] > 180) bufout[2] -= 360;\n\t             /*  xyz limited output for laser spot */   \n            if (bufout[1] != 0.0 && bufout[3] > -9999){\n\t\t\n\t\tprintData(word_format, 'n', bufout); ///////PRINT DATA\n\t\t\n\t\t/* SPECIAL: Track when first line, then last line is printed*/\n\t\t(found_first) ? (found_last=1) : (found_first=1);\n                ++out_rec;\n\t    }\n        }\n        else {\n          ++neg_rec_count;\n        }\n\n\t/* SPECIAL: Print first and last lines only */\n\tif (first_n_last && found_first){\n\t\tnvar_mult++;\n\t\tif (found_last){\n\t\t\tbreak;\n\t\t}\n\t\t// Rewind line-by-line to find the last data point\n\t\tfseek(infile,-nvar*nvar_mult*sizeof(*value), SEEK_END);\n\t}\n    }\n    \n    \n    \n    \n    \n \n    fprintf(stderr, \"Number of records read = %ld\\nNumber of records written = %ld\\n\", in_rec, out_rec);\n    fprintf(stderr, \"Number of negative time records skipped = %d\\n\", neg_rec_count);\n    fclose(infile);\n\n    \n    if (out_rec == 0){\n\tfprintf(stderr, \"\\n\\tWarning: No valid records found.\");\n\texit (2);\n    }\n//    fclose(output);\n\n    return 0;\n}\n\n"
  },
  {
    "path": "src/asp/IceBridge/regenerate_summary_images.py",
    "content": "#!/usr/bin/env python\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n# Program to generate a new version of a SUMMARY tarball with any missing\n#  DEM and ORTHO browse images replaced.\n\nimport os, sys, argparse, datetime, time, subprocess, logging, multiprocessing\nimport traceback\nimport os.path as P\n\n# The path to the ASP python files and tools\nbasepath      = os.path.dirname(os.path.realpath(__file__)) # won't change, unlike syspath\npythonpath    = os.path.abspath(basepath + '/../Python')     # for dev ASP\nlibexecpath   = os.path.abspath(basepath + '/../libexec')    # for packaged ASP\nicebridgepath = os.path.abspath(basepath + '/../IceBridge')  # IceBridge tools\n\n# Prepend to Python path\nsys.path.insert(0, basepath)\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\nsys.path.insert(0, icebridgepath)\n\nimport icebridge_common, pbs_functions, archive_functions, run_helper\nimport asp_system_utils, generate_flight_summary\n\nasp_system_utils.verify_python_version_is_supported()\n\n# Prepend to system PATH\nos.environ[\"PATH\"] = basepath       + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = pythonpath     + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = libexecpath    + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = icebridgepath  + os.pathsep + os.environ[\"PATH\"]\n\n#=========================================================================\n# Parameters\n\n# Constants used in this file\n\nPBS_QUEUE   = 'normal'\n\nGROUP_ID = 's2022'\n\ng_start_time = -1\ng_stop_time  = -1\n\ndef start_time():\n    global g_start_time, g_stop_time\n    g_start_time = time.time()\n    \ndef stop_time(job, logger):\n    global g_start_time, g_stop_time\n    g_stop_time = time.time()\n    wall_s = float(g_stop_time - g_start_time)/3600.0\n    logger.info( (\"Elapsed time for %s is %g hours.\" % (job, wall_s) ) )\n\n\nPFE_NODES = ['san', 'ivy', 'has', 'bro']\n\n#=========================================================================\n\n# 'wes' = Westmere = 12 cores/24 processors, 48 GB mem, SBU 1.0, Launch from mfe1 only!\n# 'san' = Sandy bridge = 16 cores,  32 GB mem, SBU 1.82\n# 'ivy' = Ivy bridge   = 20 cores,  64 GB mem, SBU 2.52\n# 'has' = Haswell      = 24 cores, 128 GB mem, SBU 3.34\n# 'bro' = Broadwell    = 28 cores, 128 GB mem, SBU 4.04\n\ndef getParallelParams(nodeType):\n    '''Return (numProcesses, numThreads, tasksPerJob, maxHours) for running a certain task on a certain node type'''\n\n    if nodeType == 'san': return (16, 1, 600, 2)\n    if nodeType == 'ivy': return (20, 1, 700, 2)\n    if nodeType == 'has': return (24, 1, 800, 2)\n    if nodeType == 'bro': return (28, 1, 900, 2)\n    if nodeType == 'wes': return (12, 1, 400, 2)\n\n    raise Exception('No params defined for node type ' + nodeType + ', task = ' + task)\n\n#=========================================================================\n\ndef getEmailAddress(userName):\n    '''Return the email address to use for a user'''\n    \n    if userName == 'smcmich1':\n        return 'scott.t.mcmichael@nasa.gov'\n    if userName == 'oalexan1':\n        return 'oleg.alexandrov@nasa.gov'\n\ndef sendEmail(address, subject, body):\n    '''Send a simple email from the command line'''\n    # Remove any quotes, as that confuses the command line.\n    subject = subject.replace(\"\\\"\", \"\")\n    body    = body.replace(\"\\\"\", \"\")\n    try:\n        cmd = 'mail -s \"' + subject + '\" ' + address + ' <<< \"' + body + '\"'\n        #print(cmd) # too verbose to print\n        os.system(cmd)\n    except Exception as e:\n        print(\"Could not send mail.\")\n        \n#---------------------------------------------------------------------\n\n\ndef submitBatchJobs(commandFileList, options, pbsLogFolder, run, logger):\n    '''Read all the batch jobs required for a run and distribute them across job submissions.\n       Returns the common string in the job names.'''\n\n    # Retrieve parallel processing parameters\n    (numProcesses, numThreads, tasksPerJob, maxHours) = getParallelParams(options.nodeType)\n\n    numBatches = len(commandFileList)\n    logger.info( (\"Num batches: %d, tasks per job: %d\" % (numBatches, tasksPerJob) ) )\n\n    baseName = run.shortName() # SITE + YYMMDD = 8 chars, leaves seven for frame digits.\n\n    # Call the tool which just executes commands from a file\n    scriptPath = icebridge_common.fullPath('multi_process_command_runner.py')\n\n    index  = 0\n    jobIDs = []\n    for commandFile in commandFileList:\n\n        jobName = ('%s%05d%s' % ('RS', index, baseName) )\n\n        # Specify the range of lines in the file we want this node to execute\n        args = ('--command-file-path %s --start-frame -1 --stop-frame -1 --num-processes %d' % \\\n                (commandFile, numProcesses))\n\n        logPrefix = os.path.join(pbsLogFolder, 'batch_' + jobName)\n        logger.info('Submitting summary regen job: ' + scriptPath + ' ' + args)\n\n        BATCH_PBS_QUEUE = 'normal'\n        jobID = pbs_functions.submitJob(jobName, BATCH_PBS_QUEUE, maxHours, logger,\n                                        options.minutesInDevelQueue,\n                                        GROUP_ID,\n                                        options.nodeType, '~/repo/python_env/bin/python',\n                                        scriptPath + ' ' + args, logPrefix)\n        jobIDs.append(jobID)\n        index += 1\n\n    # Waiting on these jobs happens outside this function\n    return (baseName, jobIDs)\n\ndef checkRequiredTools():\n    '''Verify that we have all the tools we will be calling during the script.'''\n\n    tools  = ['gdal_translate']\n    \n    for tool in tools:\n        asp_system_utils.checkIfToolExists(tool)\n\ndef fetchTarball(louPath, localPath):\n    '''Retrieve and unpack the desired tarball file from Lou'''\n\n    if os.path.exists(localPath):\n        return # Currently not checking that everything is there!\n\n    cmd = 'shiftc --wait -d -r --verify --extract-tar lfe:' + louPath + ' ' + localPath\n    print cmd\n    os.system(cmd)\n\n    if not os.path.exists(localPath):\n        raise Exception('Failed to retrieve tarball: lfe:' + louPath)\n\n\ndef getSummaryFileCommand(inFile, outFile, isOrtho):\n   '''Get a one line command to generate a single summary file'''\n\n   if isOrtho:\n       cmd = 'gdal_translate -scale -outsize 25% 25% -of jpeg ' + inFile +' '+ outFile\n   else:\n       # Hillshade then downsample.\n       tempPath = outFile + '_temp.tif'\n       cmd = 'hillshade ' + inFile +' -o ' + tempPath\n       cmd += (' && gdal_translate '+ tempPath +' '+ outFile+\n              ' -of GTiff -outsize 40% 40% -b 1 -co \"COMPRESS=JPEG\"')\n       cmd += ' && rm ' + tempPath\n\n   return cmd\n\ndef descendIfNeeded(folder):\n    '''If the input folder contains only a single folder, return\n       that contained folder.  Otherwise return the input folder.'''\n\n    files = os.listdir(folder)\n    if (len(files) == 1) and os.path.isdir(os.path.join(folder,files[0])):\n        return os.path.join(folder, files[0])\n    else:\n        return folder\n\n# TODO: Move to a shared file!\ndef getUnpackedFiles(folder):\n    '''Find all the DEM or ORTHO files unpacked from their tarball.'''\n\n    # Dig down through the initial unpack folder\n    top_folder = descendIfNeeded(folder)\n\n    # Dig down through a subsequent unpack folder\n    possible_directories = ['tarAssembly', 'processed', 'camera', 'summary']\n    file_dir   = []\n    for d in possible_directories:\n        test_dir = os.path.join(top_folder, d)\n        if os.path.exists(test_dir):\n            file_dir = test_dir\n            break\n        test_dir = os.path.join(top_folder, d)\n        if os.path.exists(test_dir):\n            file_dir = test_dir\n            break\n\n    # Handle case where each file is buried in a subfolder\n    final_files = []\n    file_list = os.listdir(file_dir)\n    for f in file_list:\n        full_path = os.path.join(file_dir, f)\n        if os.path.isdir(full_path):\n            subfiles = os.listdir(full_path)\n            final_files.append(os.path.join(full_path, subfiles[0]))\n        else:\n            final_files.append(full_path)\n\n    return final_files\n\ndef getMissingSummaryFiles(folder, summaryFolder, isOrtho):\n    '''Return a list of input/output pairs of missing summary files.'''\n\n    print 'Looking for missing summary files for folder: ' + folder\n\n    inFiles      = getUnpackedFiles(folder)\n    summaryFiles = os.listdir(summaryFolder)\n\n    # Handle DEM and ORTHO browse images separately.\n    keyword = 'dem'\n    if isOrtho:\n        keyword = 'ortho'\n\n    # Associate each summary file with its frame number\n    summaryFrames = {}\n    for c in summaryFiles:\n        if keyword not in c:\n            continue\n\n        # Inputs like: dem_01058_01060_browse.tif\n        parts = os.path.basename(c).split('_')\n        frame = int(parts[1])\n        summaryFrames[frame] = c\n\n    # See if any input files are missing their summary frame\n    missingSummaryList = []\n    for f in inFiles:\n        # Skip metadata files\n        ext = os.path.splitext(f)[1]\n        if ext != '.tif':\n            continue\n\n        # TODO: This may break later!\n        fname = os.path.basename(f)\n        if fname[0] == 'F':\n            parts      = fname.split('_')\n            frameStart = int(parts[1])\n            frameEnd   = int(parts[2])\n        else: # AN_20141116/processed/batch_05962_05963_2/out-ortho.tif\n            parts = os.path.dirname(f).split('_')\n            frameStart = int(parts[-3])\n            frameEnd   = int(parts[-2])\n\n        try:\n            summary = summaryFrames[frameStart]\n            continue # Summary file already exists.\n\n        except KeyError:\n            # Get the desired summary file name\n            if isOrtho:\n                summaryName = ('ortho_%05d_%05d_browse.tif' % (frameStart, frameEnd))\n            else: # DEM\n                summaryName = ('dem_%05d_%05d_browse.tif' % (frameStart, frameEnd))\n\n            summaryPath = os.path.join(summaryFolder, summaryName)\n            missingSummaryList.append((f, summaryPath))\n\n    return missingSummaryList\n\ndef writeCommandFiles(missingDemFiles, missingOrthoFiles, outputPrefix, chunkSize):\n    '''Generate conversion commands for each missing summary file and\n       divide them up into files of a fixed length.  Returns the list of\n       command files that were written.'''\n\n    if (not missingDemFiles) and (not missingOrthoFiles):\n        return []\n\n    # Open the first file\n    fileCounter = 0\n    cmdCounter  = 0\n    fname   = outputPrefix + str(fileCounter) + '.txt'\n    handle  = open(fname, 'w')\n\n    commandFiles = [fname]\n\n    # Add all the DEM commands\n    for p in missingDemFiles:\n\n        # If the file is too large, start a new file.\n        if cmdCounter >= chunkSize:\n            fileCounter += 1\n            cmdCounter = 0\n            handle.close()\n            fname   = outputPrefix + str(fileCounter) + '.txt'\n            handle  = open(fname, 'w')\n            commandFiles.append(fname)\n\n        # Generate command, then write to file.\n        cmd = getSummaryFileCommand(p[0], p[1], isOrtho=False)\n        handle.write(cmd + '\\n')\n        cmdCounter += 1\n \n    # Add all the ORTHO commands\n    for p in missingOrthoFiles:\n\n        if cmdCounter >= chunkSize:\n            fileCounter += 1\n            cmdCounter = 0\n            handle.close()\n            fname   = outputPrefix + str(fileCounter) + '.txt'\n            handle  = open(fname, 'w')\n            commandFiles.append(fname)\n\n        cmd = getSummaryFileCommand(p[0], p[1], isOrtho=True)\n        handle.write(cmd + '\\n')\n        cmdCounter += 1\n\n    handle.close()\n\n    print 'Created ' + str(len(commandFiles)) + ' command files.'\n\n    return commandFiles\n\ndef main(argsIn):\n\n    try:\n        usage = '''usage: regenerate_summary_images.py <options> '''\n        parser = argparse.ArgumentParser(usage=usage)\n\n        parser.add_argument(\"--data-folder\",  dest=\"dataFolder\",\n                            help=\"Where all the inputs and outputs are stored.\")\n\n        parser.add_argument(\"--work-folder\",  dest=\"workFolder\",\n                            help=\"Where working files are stored.\")\n\n        parser.add_argument(\"--site\",  dest=\"site\", help=\"Site code.\")\n\n        parser.add_argument(\"--yyyymmdd\",  dest=\"yyyymmdd\", help=\"Date.\")\n\n        #parser.add_argument(\"--dem-tarball\",  dest=\"demTarball\", default=os.getcwd(),\n        #                    help=\"Where all the inputs and outputs are stored.\")\n\n        #parser.add_argument(\"--ortho-tarball\",  dest=\"orthoTarball\", default=None,\n        #                    help=\"Where to unpack the data.\")\n\n        #parser.add_argument(\"--summary-tarball\",  dest=\"summaryTarball\", default=None,\n        #                    help=\"Where to unpack the data.\")\n\n        #parser.add_argument(\"--unpack-dir\",  dest=\"unpackDir\", default=None,\n        #                    help=\"Where to unpack the data.\")\n\n        parser.add_argument(\"--node-type\",  dest=\"nodeType\", default='san',\n                            help=\"Node type to use (wes[mfe], san, ivy, has, bro)\")\n\n        #parser.add_argument(\"--skip-archive-summary\", action=\"store_true\",\n        #                    dest=\"skipArchiveSummary\", default=False,\n        #                    help=\"Skip archiving the summary.\")\n\n        # Debug option\n        parser.add_argument('--minutes-in-devel-queue', dest='minutesInDevelQueue', type=int,\n                            default=0,\n                            help=\"If positive, submit to the devel queue for this many minutes.\")\n\n        options = parser.parse_args(argsIn)\n\n    except argparse.ArgumentError as msg:\n        parser.error(msg)\n\n    # Check if we are on the right machine\n    (host, err, status) = asp_system_utils.executeCommand(['uname', '-n'],\n                                                         suppressOutput = True)\n    host = host.strip()\n    if 'pfe' in host and options.nodeType not in PFE_NODES:\n        raise Exception(\"From machine \" + host + \" can only launch on: \" + \" \".join(PFE_NODES)) \n    if 'mfe' in host and options.nodeType != 'wes':\n        raise Exception(\"From machine \" + host + \" can only launch on: wes\")\n\n    # Make sure our paths will work when called from PBS\n    options.dataFolder= os.path.abspath(options.dataFolder)\n\n    #os.system('mkdir -p ' + options.unpackDir)\n\n    # TODO: Check folders!\n    run = run_helper.RunHelper(options.site, options.yyyymmdd, options.workFolder)\n\n    runFolder = os.path.join(options.workFolder, str(run))\n    os.system('mkdir -p ' + runFolder)\n\n    logFolder = os.path.join(runFolder, 'logs')\n\n    # Set up logging in the run directory\n    os.system('mkdir -p ' + logFolder)\n    logLevel = logging.INFO\n    logger   = icebridge_common.setUpLogger(logFolder, logLevel,\n                                            icebridge_common.manager_log_prefix())\n    logger.info(\"Logging in: \" + logFolder)\n    \n    \n    checkRequiredTools() # Make sure all the needed tools can be found before we start\n\n    logger.info(\"Disabling core dumps.\") # these just take a lot of room\n    os.system(\"ulimit -c 0\")\n    os.system(\"umask 022\") # enforce files be readable by others\n\n    # See how many hours we used so far. I think this counter gets updated once a day.\n    (out, err, status) = asp_system_utils.executeCommand(\"acct_ytd\", outputPath = None, \n                                                         suppressOutput = True, redo = True,\n                                                         noThrow = True)\n    logger.info(\"Hours used so far:\\n\" + out + '\\n' + err)\n\n\n    try:\n      \n        # Fetch and extract the tarball files from Lou\n\n        localDemFolder     = os.path.join(options.dataFolder, run.name()+'_dems')\n        localOrthoFolder   = os.path.join(options.dataFolder, run.name()+'_orthos')\n        demSummaryFolder   = os.path.join(options.dataFolder, run.name()+'_dem_summaries')\n        orthoSummaryFolder = os.path.join(options.dataFolder, run.name()+'_ortho_summaries')\n\n        missingDemFiles   = []\n        missingOrthoFiles = []\n        for f in os.listdir(localDemFolder):\n            if 'temp' in f:\n                raise Exception('Bad file: ' + f)\n            if ('IODEM3' in f) and (f[-4:] == '.tif'):\n                inputPath  = os.path.join(localDemFolder, f)\n                outputPath = os.path.join(demSummaryFolder, f.replace('DEM.tif', 'DEM_browse.tif'))\n                if not os.path.exists(outputPath):\n                    missingDemFiles.append((inputPath, outputPath))\n\n        for f in os.listdir(localOrthoFolder):\n            if 'temp' in f:\n                raise Exception('Bad file: ' + f)\n            if ('IODIM3' in f) and (f[-4:] == '.tif'):\n                inputPath  = os.path.join(localOrthoFolder, f)\n                outputPath = os.path.join(orthoSummaryFolder, f.replace('ORTHO.tif', 'ORTHO.jpg'))\n                if not os.path.exists(outputPath):\n                    missingOrthoFiles.append((inputPath, outputPath))\n\n        #print 'Fetching and unpacking tarballs...'\n        #fetchTarball(options.demTarball,     localDemFolder)\n        #fetchTarball(options.orthoTarball,   localOrthoFolder)\n        #fetchTarball(options.summaryTarball, localSummaryFolder)\n\n        # If the summary tarball unpacked to []/summary/summary,\n        #  work with the lower level folder from now on.\n        #localSummaryFolder = descendIfNeeded(localSummaryFolder)\n\n        # Make a list of all input files that are missing their summary file, and\n        #  the desired output path for that file.\n        #missingDemFiles   = getMissingSummaryFiles(localDemFolder,   localSummaryFolder, isOrtho=False)\n        #missingOrthoFiles = getMissingSummaryFiles(localOrthoFolder, localSummaryFolder, isOrtho=True )\n\n        # Divide this list into chunks and for each chunk generate a file containing all of\n        #  the gdal_translate commands that need to be executed.\n        print 'Writing command files...'\n        commandFileLength = getParallelParams(options.nodeType)[2]\n        commandFilePrefix = os.path.join(runFolder, 'convert_commands_')\n        print 'Clearing existing command files.'\n        os.system('rm ' + commandFilePrefix + '*')\n        commandFileList   = writeCommandFiles(missingDemFiles, missingOrthoFiles,\n                                              commandFilePrefix, commandFileLength)\n        #raise Exception('DEBUG')\n\n        # Get the location to store the logs\n        pbsLogFolder = run.getPbsLogFolder()\n        logger.info(\"Storing logs in: \" + pbsLogFolder)\n        os.system('mkdir -p ' + pbsLogFolder)\n\n        # Call multi_process_command_runner.py through PBS for each chunk.\n        start_time()\n        (baseName, jobIDs) = submitBatchJobs(commandFileList, options, pbsLogFolder, run, logger)\n\n        # Wait for everything to finish.\n        pbs_functions.waitForJobCompletion(jobIDs, logger, baseName)\n        stop_time(\"pbs_jobs\", logger)\n\n        # Check that we now have all of the summary files.\n        # - Both of these should now be empty.\n        #newMissingDemFiles   = getMissingSummaryFiles(localDemFolder,   demSummaryFolder, isOrtho=False)\n        #newMissingOrthoFiles = getMissingSummaryFiles(localOrthoFolder, orthoSummaryFolder, isOrtho=True )\n        numDemsMissing   = 0\n        numOrthosMissing = 0\n        for pair in missingDemFiles:\n            if not os.path.exists(pair[1]):\n                numDemsMissing += 1\n        for pair in missingOrthoFiles:\n            if not os.path.exists(pair[1]):\n                numOrthosMissing += 1\n\n\n        resultText = ('After regeneration, missing %d DEM summaries and %d ORTHO summaries' \n                      % (numDemsMissing, numOrthosMissing))\n        logger.info(resultText)\n\n        runWasSuccess = ((numDemsMissing == 0) and (numOrthosMissing == 0))\n\n        # If successful, create a new tarball and send it to Lou.\n\n        #if runWasSuccess and (not options.skipArchiveSummary):\n        #    start_time()\n        #    archive_functions.packAndSendSummaryFolder(run, localSummaryFolder, logger)\n        #    stop_time(\"archive summary\", logger)\n\n\n    except Exception as e:\n        resultText = 'Caught exception: ' + str(e) + '\\n' + traceback.format_exc()\n        runWasSuccess = False\n\n    # Send a summary email.\n    emailAddress = getEmailAddress(icebridge_common.getUser())\n    logger.info(\"Sending email to: \" + emailAddress)\n    if runWasSuccess:\n        sendEmail(emailAddress, 'OIB summary regen passed', resultText)\n    else:\n        sendEmail(emailAddress, '\"OIB summary regen failed', resultText)\n\n    # TODO: Add automated delete command!\n    #if options.wipeProcessed:\n    #    processedFolder = run.getProcessFolder()\n    #    logger.info(\"Will delete: \" + processedFolder)\n    #    os.system(\"rm -rf \" + processedFolder)\n\n    logger.info('==== regenerate_summary_images script has finished for run: ' + str(run) + ' ====')\n\n\n# Run main function if file used from shell\nif __name__ == \"__main__\":\n    sys.exit(main(sys.argv[1:]))\n\n"
  },
  {
    "path": "src/asp/IceBridge/run_helper.py",
    "content": "#!/usr/bin/env python\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n# Class to help manage a run stored on disk\n\nimport os, sys, optparse, datetime, time, subprocess, logging, multiprocessing\nimport re, shutil, time, getpass, glob\n\nimport os.path as P\n\n# The path to the ASP python files and tools\nbasepath      = os.path.dirname(os.path.realpath(__file__)) # won't change, unlike syspath\npythonpath    = os.path.abspath(basepath + '/../Python')     # for dev ASP\nlibexecpath   = os.path.abspath(basepath + '/../libexec')    # for packaged ASP\nicebridgepath = os.path.abspath(basepath + '/../IceBridge')  # IceBridge tools\n\n# Prepend to Python path\nsys.path.insert(0, basepath)\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\nsys.path.insert(0, icebridgepath)\n\nimport icebridge_common, asp_file_utils\n\n# Prepend to system PATH\nos.environ[\"PATH\"] = basepath       + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = pythonpath     + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = libexecpath    + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = icebridgepath  + os.pathsep + os.environ[\"PATH\"]\n\n\nclass RunHelper():\n    '''Class for managing a folder for processing one run (flight)'''\n\n    def __init__(self, site, yyyymmdd, parentFolder=''):\n        '''Constructor.\n           If optional parent folder is provided, it will be prependend to all returned paths.'''\n        self.site          = site\n        self.yyyymmdd      = yyyymmdd\n        self.parentFolder  = parentFolder\n        # Create the timestamp just once, rather than each time it is\n        # needed, as maybe the date has changed while the run\n        # was being done.\n        self.suffix        = \"_V\"\n        self.timestamp     = self.suffix +datetime.datetime.now().strftime(\"%Y%m%d\")\n        \n    def __str__(self):\n        '''Define string autoconversion'''\n        return self.site +'_'+ self.yyyymmdd\n\n    def name(self):\n        '''Return a name in SS_YYYYMMDD format'''\n        return str(self)\n\n    def shortName(self):\n        '''Return a name in SSYYMMDD format'''\n        return self.site + self.yyyymmdd[2:]\n\n    def yyyy_mm_dd(self):\n        '''Return the date in the format YYYY_MM_DD'''\n        return self.yyyymmdd[0:4] +'_'+ self.yyyymmdd[4:6] +'_'+ self.yyyymmdd[6:8]\n\n    # TODO: Add version numbers to these in a way that is easily handled!\n    def getInputTarName(self):\n        '''Return the file name used to tar up the downloaded input data'''\n        return self.name() + '.tar'\n\n    def getCameraTarName(self):\n        '''Return the file name used to tar up the generated camera files'''\n        return 'CAMERA_' + self.name()  + self.timestamp + '.tar'\n\n    def getAlignedCameraTarName(self):\n        '''Return the file name used to tar up the generated bundle-adjustd\n        and aligned camera files'''\n        return 'ALIGNED_CAMERA_' + self.name() + self.timestamp + '.tar'\n\n    def getOrthoTarName(self, useWildCard = False):\n        '''Return the file name used to tar up the generated ortho images.'''\n        if useWildCard:\n            # This is conventient when we want to list all existing outputs\n            return 'ORTHO_' + self.name() + '*' + '.tar'\n        return 'ORTHO_' + self.name() + self.timestamp + '.tar'\n\n    def getSummaryTarName(self):\n        '''Return the file name used to tar up the generated camera files'''\n        return 'SUMMARY_' + self.name()  + self.timestamp + '.tar'\n\n    def getOutputTarName(self, useWildCard = False):\n        '''Return the file name used to tar up the final results'''\n        if useWildCard:\n            # This is conventient when we want to list all existing outputs\n            return 'DEM_' + self.name() + '*' + '.tar'\n        return 'DEM_' + self.name() + self.timestamp + '.tar'\n\n    def getLabelTarName(self):\n        '''Return the file name used to tar up the label files'''\n        return 'LABELS_' + self.name()  + self.timestamp + '.tar'\n\n    def getFolder(self):\n        '''Returns the folder where this run will be stored'''\n        return os.path.join(self.parentFolder, str(self))\n\n    def _internalLoc(self, path):\n        '''Returns a folder relative to getFolder()'''\n        return os.path.join(self.getFolder(), path)\n\n    # TODO: Merge these with corresponding functions in icebridge_common.\n    def getJpegFolder(self):\n        return self._internalLoc('jpeg')\n    def getImageFolder(self):\n        return self._internalLoc('image')\n    def getLidarFolder(self):\n        return self._internalLoc('lidar')\n    def getLidarPairFolder(self):\n        return icebridge_common.getPairedLidarFolder(self.getLidarFolder())\n    def getNavFolder(self):\n        return self._internalLoc('nav')\n    def getNavCameraFolder(self):\n        return self._internalLoc('nav_camera')\n    def getCameraFolder(self):\n        return self._internalLoc('camera')\n    def getOrthoFolder(self):\n        return self._internalLoc('ortho')\n    def getProcessFolder(self):\n        return self._internalLoc('processed')\n    def getAssemblyFolder(self):\n        return self._internalLoc('tarAssembly')\n    def getPbsLogFolder(self):\n        return self._internalLoc('pbsLog')\n    def getSummaryFolder(self):\n        return self._internalLoc('summary')\n    def getLabelFolder(self):\n        return self._internalLoc('labeled')\n    def getLabelOrthoFolder(self):\n        return self._internalLoc('label_ortho')\n\n    def getJpegList(self, prependFolder=False):\n        '''Return a list containing all the currently stored jpeg files'''\n        jpegFolder = self.getJpegFolder()\n        jpegs = icebridge_common.getJpegs(jpegFolder)\n        if prependFolder:\n            jpegs = [os.path.join(jpegFolder, x) for x in jpegs]\n        jpegs.sort()\n        return jpegs\n\n    def getImageList(self, prependFolder=False):\n        '''Return a list containing all the currently stored image files'''\n        imageFolder = self.getImageFolder()\n        images = icebridge_common.getTifs(imageFolder)\n        if prependFolder:\n            images = [os.path.join(imageFolder, x) for x in images]\n        images.sort()\n        return images\n\n    def getLidarList(self, paired=False, prependFolder=False):\n        '''Return a list containing all the currently stored lidar files.\n           This does not return converted csv files.'''\n        lidarFolder = self.getLidarFolder()\n        if paired:\n            lidarFolder = icebridge_common.getPairedLidarFolder(lidarFolder)\n        files = icebridge_common.getLidar(lidarFolder)\n        if prependFolder:\n            files = [os.path.join(lidarFolder, x) for x in files]\n        files.sort()\n        return files\n\n    def getBatchFolderList(self):\n        '''Return a list of all the batch folders'''\n        pFolder       = self.getProcessFolder()\n        batchFolders  = os.listdir(pFolder)\n        def getFirstFrame(s):\n            try:\n                parts = s.split('_')\n                return int(parts[1])\n            except:\n                return 99999999\n        batchFolders.sort(key=getFirstFrame)\n        batchFolders  = [os.path.join(pFolder,x) for x in batchFolders if 'batch_' in x]\n        batchFolders  = [x for x in batchFolders if os.path.isdir(x)]\n        return batchFolders\n\n    # Get a list of all output files of given type. They may not exist. \n    def getOutputFileList(self, fileType):\n        '''Return a list containing all the output DEM files in the run and the associated frames'''\n        \n        batchList = self.getBatchFolderList()\n        output = []\n        for batch in batchList:\n            frames = icebridge_common.getFrameRangeFromBatchFolder(batch)\n            path   = os.path.join(batch, fileType)\n            output.append((path, frames))\n        return output\n\n    def existingFilesDict(self, fileType, startFrame, stopFrame):\n        '''See which output files of given type exist.'''\n\n        fileList = self.getOutputFileList(fileType)\n        fileDict = {}\n        \n        for (filename, frames) in fileList:\n            \n            # Handle frame range option\n            if (frames[0] < startFrame):\n                continue\n            if (frames[1] > stopFrame):\n                break\n\n            if not os.path.exists(filename):\n                continue\n            fileDict[frames[0]] = filename\n\n        return fileDict\n        \n    def allSourceDataFetched(self, noNav, verbose=False):\n        '''Return true if all the required source data has been downloaded'''\n    \n        logger = logging.getLogger(__name__)\n\n        # Old file collections use a different naming scheme    \n        altIndexName = 'image_index.html.csv'\n\n        # Verify these input folders\n        subFolders = [self.getJpegFolder(), self.getLidarFolder(), self.getOrthoFolder()]\n        \n        for folder in subFolders:\n            \n            # Make sure all the files specified in the parsed index file are present\n            indexFile = icebridge_common.csvIndexFile(folder)\n            if not os.path.exists(indexFile):\n                # See if the older naming scheme was used\n                altPath = os.path.join(folder, altIndexName)\n                if os.path.exists(altPath):\n                    indexFile = altPath\n            \n            (fileDict, urlDict) = icebridge_common.readIndexFile(indexFile)\n            logger.info(\"Checking all files listed in: \" + indexFile)\n            num = len(fileDict.keys())\n            count = 0\n            for f in fileDict.itervalues():\n\n                # Add the progress, as this operation can be terribly slow\n                # when the filesystem is not doing too well, especially on mfe.\n                count = count + 1\n                if (count - 1) % 1000 == 0:\n                    logger.info('Progress: ' + str(count) + '/' + str(num))\n                    \n                path = os.path.join(folder, f)\n                if not os.path.exists(path):\n                    logger.error('Missing file ' + path)\n                    return False\n\n        if not noNav:\n            # Simple nav file check\n            navFiles = os.listdir(self.getNavFolder())\n            navFiles = [x for x in navFiles if '.out' in navFiles]\n            if (len(navFiles) == 0) or (len(navFiles) > 2):\n                logger.error('Wrong number of nav files detected!')\n                return False\n        \n        return True # Success!\n\n    def massRenameByGlob(self, startFrame, stopFrame, orthoFrameDict,\n                         globStr, logger):\n        '''Axuxually function used below.'''\n        \n        files = glob.glob(globStr)\n\n        for fileName in files:\n\n            # This is rather fragile, try to ignore certain types of files\n            if ('_sub' in fileName) or ('pct.tif' in fileName) or ('_hillshade_' in fileName):\n                continue\n            \n            [prefix, dateString, timeString, frameString, suffix] = \\\n                     icebridge_common.parseParts(fileName)\n            if frameString == \"\":\n                logger.info(\"Could not parse frame and time stamps from: \" + fileName)\n                continue\n\n            frame = int(frameString)\n            if frame < startFrame or frame > stopFrame:\n                continue\n            if not frame in orthoFrameDict:\n                logger.info(\"Missing ortho for frame: \" + frameString)\n                continue\n\n            [newDateString, newTimeString] = icebridge_common.parseTimeStamps(orthoFrameDict[frame])\n            newFile = prefix + icebridge_common.formFilePrefix(newDateString, newTimeString,\n                                                               frame) + suffix\n            if not os.path.exists(fileName):\n                continue\n            if fileName == newFile:\n                continue\n            \n            if os.path.exists(newFile):\n                logger.info(\"File exists: \" + newFile + \", will wipe \" + fileName)\n                os.system(\"rm -f \" + fileName)\n                continue\n\n            logger.info(\"Renaming: \" + fileName + \" to \" + newFile)\n            os.system(\"mv -f \" + fileName + \" \" + newFile)\n            \n    def massRename(self, startFrame, stopFrame, logger):\n        '''We changed how the timestamp for images and cameras is computed.\n        Make all existing converted images, cameras, nav cameras, and aligned cameras conform.'''\n\n        logger.info(\"Renaming files with timestamp. This is slow.\")\n        \n        # Need to do a mass rename for incorrect timestamp for:\n        # converted images, nav cameras, cameras, and bundle aligned cameras\n        outputFolder    = self.getFolder()\n        cameraFolder    = icebridge_common.getCameraFolder(outputFolder)\n        imageFolder     = icebridge_common.getImageFolder(outputFolder)\n        jpegFolder      = icebridge_common.getJpegFolder(outputFolder)\n        orthoFolder     = icebridge_common.getOrthoFolder(outputFolder)\n        processedFolder = icebridge_common.getProcessedFolder(outputFolder)\n        navFolder       = icebridge_common.getNavFolder(outputFolder)\n        navCameraFolder = icebridge_common.getNavCameraFolder(outputFolder)\n        \n        # Need the orthos to get the timestamp\n        orthoFolder = icebridge_common.getOrthoFolder(os.path.dirname(jpegFolder))\n        orthoIndexPath = icebridge_common.csvIndexFile(orthoFolder)\n        if not os.path.exists(orthoIndexPath):\n            raise Exception(\"Error: Missing ortho index file: \" + orthoIndexPath + \".\")\n        (orthoFrameDict, orthoUrlDict) = icebridge_common.readIndexFile(orthoIndexPath,\n                                                                        prependFolder = True)\n\n        logger.info('Renaming camera files...')\n        self.massRenameByGlob(startFrame, stopFrame, orthoFrameDict, \n                              os.path.join(cameraFolder, '*DMS*tsai'), logger)\n\n        logger.info('Renaming nav camera files...')\n        self.massRenameByGlob(startFrame, stopFrame, orthoFrameDict, \n                              os.path.join(navCameraFolder, '*DMS*tsai'), logger)\n\n        logger.info('Renaming converted images...')\n        self.massRenameByGlob(startFrame, stopFrame, orthoFrameDict, \n                              os.path.join(imageFolder, '*DMS*tif'), logger)\n\n        logger.info('Renaming aligned cameras...')\n        self.massRenameByGlob(startFrame, stopFrame, orthoFrameDict, \n                              os.path.join(processedFolder, 'batch*',\n                                           icebridge_common.alignedBundleStr() + '*DMS*tsai'),\n                              logger)\n        \n    def checkForImages(self, startFrame, stopFrame, logger):\n        '''Return true if all the images have been converted from jpeg.'''\n\n        logger.info(\"Checking if all jpegs have been converted.\")\n        \n        jpegFolder = self.getJpegFolder()\n        imageFolder = self.getImageFolder()\n        orthoFolder = self.getOrthoFolder()\n        \n        if not os.path.exists(jpegFolder):\n            logger.info(\"Missing: \" + jpegFolder)\n            return False\n        if not os.path.exists(imageFolder):\n            logger.info(\"Missing: \" + imageFolder)\n            return False\n\n        jpegIndexPath = icebridge_common.csvIndexFile(jpegFolder)\n        if not os.path.exists(jpegIndexPath):\n            logger.info(\"Missing: \" + jpegIndexPath)\n            return False\n        (jpegFrameDict, jpegUrlDict) = icebridge_common.readIndexFile(jpegIndexPath,\n                                                                  prependFolder = True)\n\n        # Need the orthos to get the timestamp\n        orthoIndexPath = icebridge_common.csvIndexFile(orthoFolder)\n        if not os.path.exists(orthoIndexPath):\n            raise Exception(\"Error: Missing ortho index file: \" + orthoIndexPath + \".\")\n        (orthoFrameDict, orthoUrlDict) = icebridge_common.readIndexFile(orthoIndexPath,\n                                                                        prependFolder = True)\n        \n        # Thorough check for missing images. It is very slow.\n        num = len(jpegFrameDict.keys())\n        allGood = True\n        count = 0\n        for frame in sorted(jpegFrameDict.keys()):\n\n            if frame < startFrame or frame > stopFrame: continue\n            \n            # Add the progress, as this operation can be terribly slow\n            # when the filesystem is not doing too well, especially on mfe.\n            count = count + 1\n            if (count - 1) % 1000 == 0:\n                logger.info('Progress: ' + str(count) + '/' + str(num))\n                \n            inputPath = jpegFrameDict[frame]\n            \n            if not frame in orthoFrameDict:\n                logger.info(\"Missing ortho for frame: \" + frame)\n                continue\n        \n            # Make sure the timestamp and frame number are in the output file name\n            try:\n                outputPath = icebridge_common.jpegToImageFile(inputPath, orthoFrameDict[frame])\n            except Exception as e:\n                logger.info(str(e))\n                logger.info(\"Removing bad file: \" + inputPath)\n                if os.path.exists(inputPath): os.remove(inputPath)\n\n                allGood = False\n                continue\n\n            if not os.path.exists(outputPath):\n                logger.info(\"Missing image file: \" + outputPath)\n                allGood = False\n                \n        return allGood\n\n    def conversionIsFinished(self, startFrame, stopFrame, verbose=False):\n        '''Return true if this run is present and conversion has finished running on it'''\n        \n        logger = logging.getLogger(__name__)\n\n        # Make sure that there is a camera file for input image file.    \n        # - This could be a more expansive check.\n        cameraFolder = self.getCameraFolder()\n        imageList    = self.getImageList()\n        for imageFile in imageList:\n            camFile = os.path.join(cameraFolder,\n                                   icebridge_common.getCameraFileName(imageFile))\n\n            # Check only within range\n            # TODO: Actually we need the cameras to go a bit beyond\n            frame = icebridge_common.getFrameNumberFromFilename(camFile)\n            if frame < startFrame or frame >= stopFrame:\n                continue\n            \n            if not os.path.exists(camFile):\n                if verbose:\n                    logger.error('Missing file ' + camFile)\n                return False\n\n        # Do a simple check of the converted lidar files\n\n        prependFolder = True\n        lidarFolder   = self.getLidarFolder()\n        convLidarFile = icebridge_common.getConvertedLidarIndexFile(lidarFolder)\n        (lidarDict, dummyUrlDict) = icebridge_common.readIndexFile(convLidarFile,\n                                                                   prependFolder)\n\n        pairedLidarFolder = icebridge_common.getPairedLidarFolder(lidarFolder)\n        pairedLidarFile   = icebridge_common.getPairedIndexFile(pairedLidarFolder)\n        (pairedLidarDict, dummyUrlDict) = icebridge_common.readIndexFile(pairedLidarFile,\n                                                                         prependFolder)\n\n        numLidar = len(lidarDict.values())\n        numPairedLidar = len(pairedLidarDict.values())\n        \n        if numLidar != (numPairedLidar+1):\n            logger.error('Not enough paired lidar files found')\n            return False\n        \n        # Make sure the lidar files are not empty\n        success = True\n        for f in lidarDict.values() + pairedLidarDict.values():\n            if not asp_file_utils.fileIsNonZero(f):\n                logger.error('lidar file ' + f + ' is empty!')\n                os.system('rm -f ' + f) # Remove bad files\n                success = False\n\n        return success\n    \n\n    def getFrameRange(self):\n        '''Return the min and max frame currently stored for the run'''\n\n        jpegFolder = icebridge_common.getJpegFolder(self.getFolder())\n        jpegIndexPath = icebridge_common.csvIndexFile(jpegFolder)\n        if not os.path.exists(jpegIndexPath):\n            raise Exception(\"Error: Missing jpeg index file: \" + jpegIndexPath + \".\")\n        (jpegFrameDict, jpegUrlDict) = icebridge_common.readIndexFile(jpegIndexPath)\n\n        frames = sorted(jpegFrameDict.keys())\n\n        if len(frames) == 0:\n            raise Exception(\"Empty folder: \" + jpegFolder)\n\n        return (frames[0], frames[-1])\n    \n    def setFlag(self, flag):\n        '''Set a file based flag to be checked later'''\n        os.system('touch '+ self._internalLoc(flag))\n        \n    def checkFlag(self, flag):\n        '''Check if a file based flag has been set'''\n        return os.path.exists(self._internalLoc(flag))\n        \n    def clearFlag(self, flag):\n        '''Clear a file based flag'''\n        return os.system('rm -rf ' + self._internalLoc(flag))\n\n\n    def deleteLocalData(self):\n        '''Delete everything which has not been archived'''\n        os.system('rm -rf ' + self.getFolder())\n\n"
  },
  {
    "path": "src/asp/IceBridge/run_multiple_flights.py",
    "content": "#!/usr/bin/env python\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n# Script to run pleiades_manager multiple times with fixed arguments to fetch and process data.\n\nimport os, sys, argparse, time, threading\nimport traceback\n\n# The path to the ASP python files and tools\nbasepath      = os.path.dirname(os.path.realpath(__file__))  # won't change, unlike syspath\npythonpath    = os.path.abspath(basepath + '/../Python')     # for dev ASP\nlibexecpath   = os.path.abspath(basepath + '/../libexec')    # for packaged ASP\nbinpath       = os.path.abspath(basepath + '/../bin')        # for packaged ASP\nicebridgepath = os.path.abspath(basepath + '/../IceBridge')  # IceBridge tools\ntoolspath     = os.path.abspath(basepath + '/../Tools')      # ASP Tools\n\n# Prepend to Python path\nsys.path.insert(0, basepath)\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\nsys.path.insert(0, icebridgepath)\n\nimport icebridge_common\nimport asp_system_utils, asp_alg_utils, asp_geo_utils\n\nasp_system_utils.verify_python_version_is_supported()\n\n# Prepend to system PATH\nos.environ[\"PATH\"] = basepath       + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = pythonpath     + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = libexecpath    + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = icebridgepath  + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = toolspath      + os.pathsep + os.environ[\"PATH\"]\nos.environ[\"PATH\"] = binpath        + os.pathsep + os.environ[\"PATH\"]\n\n\ndef checkFileForFlight(path, site, date):\n    '''Return True if the site/date pair is contained in the file'''\n  \n    with open(path, 'r') as f:\n        for line in f:\n            # Parse the line\n            parts = line.split()\n            if len(parts) != 2:\n                print('Illegal input line is skipped: ' + line)\n                continue\n            thisSite = parts[0]\n            thisDate = parts[1]\n\n            if (thisSite == site) and (thisDate == date):\n                return True\n\n    return False\n\n\n\ndef processAndLog(command, logPath, line, deleteFolder=None):\n    '''Run the command and log the result'''\n    \n    print(command)\n    #os.system(command)\n    time.sleep(2) # DEBUG\n    \n    # TODO: How to check for an error?\n    \n    with open(logPath, 'a') as f:\n        f.write(line + '\\n')\n\n    print('Finished running: ' + command)\n    \n    if deleteFolder:\n        print('Cleaning up folder: ' + deleteFolder)\n        cleanup = 'rm -rf ' + deleteFolder\n        #print(cleanup)\n        #os.system(cleanup)\n\n\ndef main(argsIn):\n\n    try:\n        usage = '''label_images.py <options>'''\n\n        parser = argparse.ArgumentParser(usage=usage)\n\n        parser.add_argument(\"--input-file\",  dest=\"inputFile\", required=True,\n                          help=\"Path to a file containing 'SITE DATE' pairs, one per line, to be run.\")\n        \n        parser.add_argument(\"--success-file\",  dest=\"successFile\", required=True,\n                          help=\"Log of completed flights.\")\n        \n        parser.add_argument(\"--failure-file\",  dest=\"failureFile\", required=True,\n                          help=\"Log of failed flights.\")\n\n        parser.add_argument(\"--limit\",  dest=\"limit\", default=4,\n                          help=\"Don't process more than this many flights at once.\")\n\n        options = parser.parse_args(argsIn)\n\n    except argparse.ArgumentError as msg:\n        parser.error(msg)\n\n\n    # This assumes that we already have the input data archived.\n    FETCH_COMMAND = \"\"\"python ~/repo/StereoPipeline/src/asp/IceBridge/pleiades_manager.py --node-type san --camera-calibration-folder /nobackup/smcmich1/icebridge/calib_files --reference-dem-folder  /nobackup/smcmich1/icebridge/reference_dems/  --skip-convert  --skip-archive-cameras  --skip-batch-gen  --skip-process  --skip-blend  --skip-ortho-gen  --skip-check-outputs  --skip-report  --skip-archive-aligned-cameras  --skip-archive-orthos  --skip-archive-summary  --skip-archive-run  --base-dir /nobackup/smcmich1/icebridge\"\"\"\n    \n    # This assumes that we already have the flight fetched.\n    PROCESS_COMMAND = \"\"\"python ~/repo/StereoPipeline/src/asp/IceBridge/pleiades_manager.py --node-type san --camera-calibration-folder /nobackup/smcmich1/icebridge/calib_files --reference-dem-folder  /nobackup/smcmich1/icebridge/reference_dems/ --skip-check-inputs  --skip-fetch  --skip-convert  --skip-archive-cameras  --skip-batch-gen  --skip-process  --skip-blend  --skip-ortho-gen  --skip-check-outputs  --skip-report  --skip-archive-aligned-cameras  --skip-archive-orthos  --skip-archive-summary  --skip-archive-run  --skip-validate  --base-dir /nobackup/smcmich1/icebridge --generate-labels --archive-labels\"\"\"\n\n\n    # Build up the list of flights to process\n    tasks = []\n    print(options.inputFile)\n    with open(options.inputFile, 'r') as f:\n        for line in f:\n            # Parse the line\n            parts = line.split()\n            if len(parts) != 2:\n                print('ERROR: Illegal input line is skipped: ' + line)\n                continue\n            site = parts[0]\n            date = parts[1]\n\n            # See if we already processed this flight\n            if ( checkFileForFlight(options.successFile, site, date) or\n                 checkFileForFlight(options.failureFile, site, date)   ):\n                print('This flight was already processed, skipping...')\n                continue\n\n            tasks.append((site, date))\n\n    print('Finished creating the flight list.')\n\n\n    # Loop through all of the flights to process them\n    numProcessed  = 0\n    lastPair      = None\n    fetchThread   = None\n    processThread = None\n    for (site, date) in tasks:\n\n        idString = (' --site %s --yyyymmdd %s ' % (site, date))\n\n        fetchCmd   = FETCH_COMMAND   + idString\n        processCmd = PROCESS_COMMAND + idString\n\n        # Launch the fetch job for this flight\n        # TODO: Log to both files\n        logLine = site+' '+date\n        print('Launching FETCH job for ' + logLine)\n        fetchThread = threading.Thread(target=processAndLog, args=(fetchCmd, options.successFile, logLine))\n        fetchThread.start()\n\n\n        # Launch the process job for the previous flight\n        if lastPair:\n            if processThread:\n                print('Waiting on the last processing job to complete...')\n                processThread.join()\n          \n            logLine = lastPair[0]+' '+lastPair[1]\n            print('Launching PROCESS job for ' + logLine)\n            folder  = '/nobackup/smcmich1/icebridge/data/'+lastPair[0]+'_'+lastPair[1]\n            processThread = threading.Thread(target=processAndLog, args=(processCmd, options.successFile, logLine, None))\n            processThread.start()\n\n        if fetchThread:\n            print('Waiting on the last fetch job to complete...')\n            fetchThread.join()\n\n        # This pair was fetched this iteration, will be processed next iteration.\n        lastPair = (site, date)\n\n        numProcessed += 1\n        if numProcessed >= options.limit:\n            print('Hit the limit of processed flights!')\n            break\n\n\n    # Process the data from the last fetch\n    if lastPair:\n        if processThread:\n            print('Waiting on the last processing job to complete...')\n            processThread.join()\n      \n        logLine = lastPair[0]+' '+lastPair[1]\n        print('Launching PROCESS job for ' + logLine)\n        folder  = '/nobackup/smcmich1/icebridge/data/'+lastPair[0]+'_'+lastPair[1]\n        processThread = threading.Thread(target=processAndLog, args=(processCmd, options.successFile, logLine, None))\n        processThread.start()\n\n    # Make sure everything is finished\n    if fetchThread:\n        print('Waiting on the last fetch job to complete...')\n        fetchThread.join()\n    if processThread:\n        print('Waiting on the last processing job to complete...')\n        processThread.join()\n\n    print('Jobs finished.')\n\n\n# Run main function if file used from shell\nif __name__ == \"__main__\":\n    sys.exit(main(sys.argv[1:]))\n\n\n"
  },
  {
    "path": "src/asp/IceBridge/sbet2txt.pl",
    "content": "#!/usr/bin/perl\n######################################################################\n# Reader for the DMS Applanix GPS data for Operation IceBridge.\n# The file format is \"SBET\".\n# Author:  Bruce Raup, braup@nsidc.org\n######################################################################\n\nuse strict;\nuse warnings;\n\n# get basename of program\nmy $progname = $0;\n$progname =~ s{^.*/}{};\n\nuse Getopt::Std;\n\n# Get Subversion revision number\nmy $version = '$Revision: 15550 $';\n($version) = $version =~ /^\\$Revision:\\s*(\\d+\\.?\\d*)/;\n\n# Set defaults above definition of $usage so that defaults can be shown there.\n\nmy $usage = \"$progname version $version\nUsage:\n  $progname  -h            (prints this help message and exits)\nOR\n  $progname  [-q] [-r] [-n N] infile\nwhere\n  -q    Quiet mode\n  -n    Output only every nth point\n  -r    Raw mode.  Don't convert lon/lat coordinates to degrees\n  --    explicitly ends options.  Arguments starting with '-' (e.g. negative\n        numbers) thereafter will not be interpreted as options.\n\nThis program reads a binary SBET file and dumps it as ASCII to standard output.\n\n\";\n\n# Get command-line options.  Letters that require arguments should be followed\n# by a ':' in the call to getopts.\nmy %opt = ();\nif (! getopts('hqn:r', \\%opt) ) {\n  die \"$usage\\n\";\n}\n\ndie \"$usage\\n\" if $opt{h};\n\n# main program\n\nif (! defined $ARGV[0]) {\n  print STDERR \"No input file specified on command line.\\n\\n\";\n  die \"$usage\\n\";\n}\nif (! -f $ARGV[0]) {\n  print STDERR \"Couldn't find input file $ARGV[0]\\n\\n\";\n  die \"$usage\\n\";\n}\ndump_sbet_file($ARGV[0]);\n\n# End of main\n\n##############################################################################\n## Subroutines\n##############################################################################\n\n##############################################################################\n## dump_sbet_file\n##############################################################################\nsub dump_sbet_file {\n  my $infile = shift;\n  my $rec_length = 136; # bytes. 17 doubles\n\n  my $point_count = 0;\n\n  my $n_points;\n  if ($opt{n}) {\n    $n_points = $opt{n};\n    unless ($n_points > 0) {\n      die \"Bad value for -n argument.\\n\\n$usage\\n\";\n    }\n  }\n\n  open my $F, \"<\", $infile or die \"Couldn't open $infile for reading: $!\";\n  my $rec;\n  while ($rec_length == read($F, $rec, $rec_length)) {\n    if (!defined $n_points || $point_count % $n_points == 0) {\n      print_sbet_rec_as_ascii($rec);\n    }\n    ++$point_count;\n  }\n}\n\n##############################################################################\n## print_sbet_rec_as_ascii\n##############################################################################\nsub print_sbet_rec_as_ascii {\n  my $binrec = shift;\n  my $rec_field_pattern = 'd17';\n  my ($time, $lat, $lon, $alt, $x_vel, $y_vel, $z_vel,\n      $roll, $pitch, $heading, $wander, $x_force, $y_force, $z_force,\n      $x_ang_rate, $y_ang_rate, $z_ang_rate) = unpack('d17', $binrec);\n\n  unless ($opt{r}) {\n    my $r2d = 180 / 3.141592654;\n    $lat *= $r2d;\n    $lon *= $r2d;\n  }\n  print join('  ', $time, $lat, $lon, $alt, $x_vel, $y_vel, $z_vel,\n      $roll, $pitch, $heading, $wander, $x_force, $y_force, $z_force,\n      $x_ang_rate, $y_ang_rate, $z_ang_rate), \"\\n\";\n}\n\n# Internal documentation below.  See it nicely formatted by typing\n#   perldoc thisfile\n# at the system command line.  For help on this format, see the man page\n# perlpod(1) (that is, type 'man perlpod' at the command line.)\n\n__END__\n\n=head1 NAME\n\nskeleton_program - skeleton program for perl\n\n=head1 SYNOPSIS\n\nCopy to new location and edit.\n\n=head1 DESCRIPTION\n\nThis file can (should) be used as a starter template for new perl programs.\n\n=head1 EXAMPLES\n\n=head1 AUTHOR\n\nBruce H. Raup (braup@nsidc.org)\n"
  },
  {
    "path": "src/asp/IceBridge/special_cases.txt",
    "content": "1. Major flight notes\n\n- 2015 flights are rotated 180 degrees from the standard camera mounting,\n    ie flight direction is towards the left side of the image.\n    - Use the option \"--camera-mounting 1\"\n- 2016 flights are rotated 90 degrees from the standard camera mounting,\n    ie flight direction is towards the upper side of the image.\n    - Use the option \"--camera-mounting 2\"\n\n2. For GR_04222010, raw images are split into two dirs:\n\nhttps://n5eil01u.ecs.nsidc.org/ICEBRIDGE_FTP/IODMS0_DMSraw_v01/2010_GR_NASA/04222010a_raw/\nhttps://n5eil01u.ecs.nsidc.org/ICEBRIDGE_FTP/IODMS0_DMSraw_v01/2010_GR_NASA/04222010b_raw/\n\nbut the ortho images and lidar are in one dir:\n\nhttps://n5eil01u.ecs.nsidc.org/ICEBRIDGE/IODMS1B.001/2010.04.22/\nhttps://n5eil01u.ecs.nsidc.org/ICEBRIDGE/ILVIS2.001/2010.04.22/\n\nThe fetching tool takes care of this automatically.\n\nSame for GR_07252017.\n\n3. For flight AN 20091025, the raw image folder \n\nhttps://n5eil01u.ecs.nsidc.org/ICEBRIDGE_FTP/IODMS0_DMSraw_v01/2009_AN_NASA/10252009_raw/\n\nhas images for both 10/25 and for 10/26. The ortho images though are split into two:\n\nhttps://n5eil01u.ecs.nsidc.org/ICEBRIDGE/IODMS1B.001/2009.10.25/\nhttps://n5eil01u.ecs.nsidc.org/ICEBRIDGE/IODMS1B.001/2009.10.26/\n\nThere is only one LIDAR file:\n\nhttps://n5eil01u.ecs.nsidc.org/ICEBRIDGE/ILVIS2.001/2009.10.25/\n\nFor processing, it will be convenient to move data to a single\ndirectory, for the earliest of these two dates, and concatenate the\northoimage indices from both directories, and the same for the raw\nimage index and DEM index files (the latter are empty in this case).\n\nWhen it comes to submitting the data for archival, it perhaps makes\nmost sense to follow the same convention as for orthoimages (so\nsplitting things back), and need to verify the convention used in the\nFireball DEMs.\n\nHere is the complete list of flights for which we will have to fetch\northoimages from the next day's dataset.\n\nAN 20091025\nAN 20091103\nAN 20091104\nAN 20091105\nAN 20091109\nAN 20091112\nAN 20101026\nAN 20101110\nGR 20120317\nAN 20121107\nAN 20131120\nAN 20131127\nGR 20150327\nGR 20150330\nAN 20150911\nAN 20150926\nGR 20160421\nGR 20160715\n\nThe fetching tool takes care of this automatically.\n\n4. There exist runs with the same flight day in the North and South\nHemisphere. For example, consider the raw images:\n\nhttps://n5eil01u.ecs.nsidc.org/ICEBRIDGE_FTP/IODMS0_DMSraw_v01/2015_GR_NASA/09242015_raw/2015_09_24_00280.JPG\nhttps://n5eil01u.ecs.nsidc.org/ICEBRIDGE_FTP/IODMS0_DMSraw_v01/2015_AN_NASA/09242015_raw/2015_09_24_00280.JPG\n\nTheir ortho images are in the same output directory, with same frame number, but with a different timestamp:\n\nhttps://n5eil01u.ecs.nsidc.org/ICEBRIDGE/IODMS1B.001/2015.09.24/DMS_1552503_00280_20150924_13202038.tif (GR)\n\nhttps://n5eil01u.ecs.nsidc.org/ICEBRIDGE/IODMS1B.001/2015.09.24/DMS_1567708_00280_20150924_15010401.tif (AN)\n\nHere are the pairs of such directories:\n\n20150924 corresp to:\n2015_AN_NASA 09242015_raw\n2015_GR_NASA 09242015_raw\n\n20151005 corresp to:\n2015_AN_NASA 10052015_raw\n2015_GR_NASA 10052015_raw\n\n20151020 corresp to:\n2015_AN_NASA 10202015_raw\n2015_GR_NASA 10202015_raw\n\n20151022 corresp to:\n2015_AN_NASA 10222015_raw\n2015_GR_NASA 10222015_raw\n\nThere are corresponding LIDAR files, some for AN and some for GR.\nFor example, for 20150924, there are:\n\nhttps://n5eil01u.ecs.nsidc.org/ICEBRIDGE/ILVIS2.001/2015.09.24/\n        \nand\n\nhttps://n5eil01u.ecs.nsidc.org/ICEBRIDGE/ILATM1B.002/2015.09.24/\n\nThe fetching tool can correctly fetch the ortho images by first\nfetching the corresponding XML files for each orthoimage and then\nfiltering by latitude. It also determines which LIDAR file to get\nusing similar logic. None of these have Fireball DEMs.\n\n5. For 20151019, there are both LVIS and ATM clouds:\n\nhttps://n5eil01u.ecs.nsidc.org/ICEBRIDGE/ILATM1B.002/2015.10.19/\nhttps://n5eil01u.ecs.nsidc.org/ICEBRIDGE/ILVIS2.001/2015.10.19/\n\neven though on that day there is only an GR dataset:\n\nhttps://n5eil01u.ecs.nsidc.org/ICEBRIDGE_FTP/IODMS0_DMSraw_v01/2015_GR_NASA/10192015_raw/\n\nand no AN dataset. The closest is for 10202015:\n\nhttps://n5eil01u.ecs.nsidc.org/ICEBRIDGE_FTP/IODMS0_DMSraw_v01/2015_AN_NASA/10202015_raw/\n\t\nThe software is able to fetch the right LIDAR for the GR run, and\nshould not be invoked for the AN run.\n\n6. Some AN test flights are in fact over California, East Coast, or en\nroute. Those should be ignored, as they have no LIDAR.\n\nAN 20111004 (https://asapdata.arc.nasa.gov/dms/flight_html/1281702.html)\nAN 20111009 (https://asapdata.arc.nasa.gov/dms/flight_html/1281704.html)\nAN_20101016\nAN 20131108\nGR 20100423\nGR 20130314\nGR_20100430\nGR_20100317\nGR_20150313\n\nThis has LIDAR though but it is en-route:\n\nAN 20111010 (https://asapdata.arc.nasa.gov/dms/flight_html/1281705.html)\n\nSome flights have both LVIS and ATM and they are both valid:\n\nhttps://n5eil01u.ecs.nsidc.org/ICEBRIDGE/ILVIS2.001/2011.10.12 \nhttps://n5eil01u.ecs.nsidc.org/ICEBRIDGE/ILATM1B.001/2011.10.12\n\nWe need to think of what to do in such a situation.\n\n7. Miscellaneous flight notes:\n\nAN 20101104 - This is a short flight which travels around the South Pole but\n              it suffers from a lot of cloud coverage and missing lidar sections.\nGR 20100526 - Includes an airport flyover.\nGR_20110317 - Image quality is poor.\nGR_20100409 - Image quality is poor.\nAN_20111013 - Not great image quality at the beginning.\nAN_20091025 - Mix of fine features and bad images\nGR_20110415 - Mix of large terrain and small features.\nGR_20110322 - Only frames 1-600 have lidar, after that altitude is much higher, careful about auto-GSD.\n\n8. Flights lacking features\n\nSome combination of altitude, camera quality, and ground features results in some flights\ncontaining sections of images which have no quality features for us to use. These images are\nare usually flat but are nearly impossible to process.\n\nAN 20101110\nAN_20101104\nGR_20100329\nGR 20110322 - Only a bit of the flight\nGR 20100422 - Only part of the flight\nAN_20091020 - Some features\nGR_20110505 - Moderate features\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "src/asp/IsisIO/BaseEquation.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n#ifndef __ASP_BASE_EQUATION__\n#define __ASP_BASE_EQUATION__\n\n// STL\n#include <fstream>\n#include <iostream>\n// VW\n#include <vw/Math/Vector.h>\n\nnamespace asp {\n\n  // Vector Equation is a method\n  // used to modify an IsisCameraModel through\n  // IsisAdjustCameraModel.\n\n  // BaseEquation\n  // Returns a Vector3 that is evaluated on a double, time.\n  //\n  class BaseEquation {\n  protected:\n    vw::Vector3 m_cached_output;\n    double m_cached_time;\n    double m_time_offset;\n\n    // Update Cache (m_cached_output)\n    virtual void update ( double t ) = 0;\n\n  public:\n    // Constructor\n    virtual ~BaseEquation() {}\n    virtual std::string type() const = 0;\n\n    //Evaluates the equation at time T\n    vw::Vector3 evaluate( double t ) {\n      if ( t != m_cached_time )\n        update( t );\n      return m_cached_output;\n    }\n    vw::Vector3 operator()( double t ) { return evaluate(t);}\n\n    // Tells the number of constants defining the equation\n    // This is especially vague as it is meant for interaction with a\n    // bundle adjuster. BA just wants to roll through the constants\n    // and redefine them.\n    virtual size_t size() const = 0;\n    virtual double& operator[]( size_t n ) = 0;\n    const double& operator[]( size_t n ) const {\n      return const_cast<BaseEquation*>(this)->operator[](n);\n    }\n\n    // Allows us to set the time offset\n    void set_time_offset( double offset ) {\n      m_cached_time = -1;\n      m_time_offset = offset;\n    }\n    double get_time_offset() const { return m_time_offset; }\n\n    // FileIO routines\n    virtual void write( std::ofstream &f ) = 0;\n    virtual void read( std::ifstream &f ) = 0;\n  };\n\n\n}\n\n#endif//__ASP_BASE_EQUATION__\n"
  },
  {
    "path": "src/asp/IsisIO/CMakeLists.txt",
    "content": "# Use wrapper function at this level to avoid code duplication\nadd_library_wrapper(AspIsisIO \"${ASP_ISISIO_SRC_FILES}\" \"${ASP_ISISIO_TEST_FILES}\" \"${ASP_ISISIO_LIB_DEPENDENCIES}\")\n\n\n"
  },
  {
    "path": "src/asp/IsisIO/DiskImageResourceIsis.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n/// \\file DiskImageResourceDDD.cc\n///\n#ifdef _MSC_VER\n#pragma warning(disable:4244)\n#pragma warning(disable:4267)\n#pragma warning(disable:4996)\n#endif\n\n#include <vw/Core/Exception.h>\n#include <vw/Math/BBox.h>\n#include <vw/Math/Vector.h>\n#include <vw/Image/ImageResource.h>\n#include <vw/Image/PixelTypeInfo.h>\n#include <asp/IsisIO/DiskImageResourceIsis.h>\n\n#include <string>\n\n#include <Cube.h>\n#include <Portal.h>\n#include <SpecialPixel.h>\n\nusing namespace boost;\n\nnamespace vw {\n\n  // We use a fixed tile size of 2048x2048 pixels here.  Although this\n  // may not be the native tile size of the ISIS cube, it seems to be\n  // much faster to let the ISIS driver aggregate smaller blocks by\n  // making a larger request rather than caching those blocks ourselves.\n  Vector2i DiskImageResourceIsis::block_read_size() const {\n    return Vector2i(2048,2048);\n  }\n\n  /// Bind the resource to a file for writing.\n  void DiskImageResourceIsis::create(std::string const& /*filename*/,\n                                     ImageFormat const& /*format*/)\n  {\n    throw NoImplErr() << \"The Isis driver does not yet support creation of Isis files\";\n  }\n\n  /// Bind the resource to a file for reading.  Confirm that we can open\n  /// the file and that it has a sane pixel format.\n  void DiskImageResourceIsis::open(std::string const& filename) {\n    m_cube     = boost::shared_ptr<Isis::Cube>(new Isis::Cube());\n    m_filename = filename;\n    m_cube->open(QString::fromStdString(m_filename));\n    VW_ASSERT(m_cube->isOpen(), IOErr() << \"DiskImageResourceIsis: Could not open cube file: \\\"\" << filename << \"\\\".\");\n\n    // Code copied from DiskImageResourceGDAL.cc, with some modifications,\n    // to fix a crash in loading an ISIS .cub file with 4 bands.\n    if ( m_cube->bandCount() == 1) {\n      m_format.pixel_format = VW_PIXEL_GRAY;\n      m_format.planes = 1;\n    } else if (m_cube->bandCount() == 2) {\n      m_format.pixel_format = VW_PIXEL_GRAYA;\n      m_format.planes = 1;\n    } else if (m_cube->bandCount() == 3) {\n      m_format.pixel_format = VW_PIXEL_RGB;\n      m_format.planes = 1;\n    } else if (m_cube->bandCount() == 4) {\n      m_format.pixel_format = VW_PIXEL_RGBA;\n      m_format.planes = 1;\n    } else {\n      m_format.pixel_format = VW_PIXEL_SCALAR;\n      m_format.planes = m_cube->bandCount();\n    }\n    \n    // Extract the dimensions of the image\n    m_format.cols = m_cube->sampleCount();\n    m_format.rows = m_cube->lineCount();\n\n    // Set member variables according to the specified pixel type\n    Isis::PixelType isis_ptype = m_cube->pixelType();\n    switch (isis_ptype) {\n      case Isis::UnsignedByte:    m_bytes_per_pixel = 1;  m_format.channel_type = VW_CHANNEL_UINT8;    break;\n      case Isis::SignedByte:      m_bytes_per_pixel = 1;  m_format.channel_type = VW_CHANNEL_INT8;     break;\n      case Isis::UnsignedWord:    m_bytes_per_pixel = 2;  m_format.channel_type = VW_CHANNEL_UINT16;   break;\n      case Isis::SignedWord:      m_bytes_per_pixel = 2;  m_format.channel_type = VW_CHANNEL_INT16;    break;\n      case Isis::UnsignedInteger: m_bytes_per_pixel = 4;  m_format.channel_type = VW_CHANNEL_UINT32;   break;\n      case Isis::SignedInteger:   m_bytes_per_pixel = 4;  m_format.channel_type = VW_CHANNEL_INT32;    break;\n      case Isis::Real:            m_bytes_per_pixel = 4;  m_format.channel_type = VW_CHANNEL_FLOAT32;  break;\n      case Isis::Double:          m_bytes_per_pixel = 8;  m_format.channel_type = VW_CHANNEL_FLOAT64;  break;\n      default:\n        vw_throw(IOErr() << \"DiskImageResourceIsis: Unknown pixel type.\");\n    }\n  }\n\n  /// Read the disk image into the given buffer.\n  void DiskImageResourceIsis::read(ImageBuffer const& dest, BBox2i const& bbox) const {\n    VW_ASSERT(bbox.max().x() <= m_cube->sampleCount() ||\n              bbox.max().y() <= m_cube->lineCount(),\n              IOErr() << \"DiskImageResourceIsis: requested bbox \" << bbox\n              << \" exceeds image dimensions [\" << m_cube->sampleCount()\n              << \" \" << m_cube->lineCount() << \"]\");\n\n    // Read in the requested tile from the cube file.  Note that ISIS\n    // cube pixel indices appear to be 1-based.\n    Isis::Portal buffer(bbox.width(), bbox.height(), m_cube->pixelType());\n    buffer.SetPosition(bbox.min().x()+1, bbox.min().y()+1, 1);\n    m_cube->read(buffer);\n\n    // Create generic image buffer from the Isis data.\n    ImageBuffer src;\n    src.data = buffer.RawBuffer();\n    src.format = m_format;\n    src.format.cols = bbox.width();\n    src.format.rows = bbox.height();\n    src.cstride = m_bytes_per_pixel;\n    src.rstride = m_bytes_per_pixel * bbox.width();\n    src.pstride = m_bytes_per_pixel * bbox.width() * bbox.height();\n\n    convert(dest, src);\n  }\n\n  // Write the given buffer into the disk image.\n  void DiskImageResourceIsis::write(ImageBuffer const& /*src*/, BBox2i const& /*bbox*/) {\n    vw_throw ( NoImplErr() << \"The Isis driver does not yet support creation of Isis files\" );\n  }\n\n  // A FileIO hook to open a file for reading\n  DiskImageResource* DiskImageResourceIsis::construct_open(std::string const& filename) {\n    return new DiskImageResourceIsis(filename);\n  }\n\n  // A FileIO hook to open a file for writing\n  DiskImageResource*\n  DiskImageResourceIsis::construct_create(std::string const& filename,\n                                          ImageFormat const& format)\n  {\n    return new DiskImageResourceIsis(filename, format);\n  }\n\n  /// Info about special pixel types in ISIS\n  //  --------------------------------------\n  double DiskImageResourceIsis::nodata_read() const {\n    switch (m_format.channel_type) {\n      case VW_CHANNEL_FLOAT64: return Isis::NULL8;\n      case VW_CHANNEL_FLOAT32: return Isis::NULL4;\n      case VW_CHANNEL_INT32:   return Isis::INULL4;\n      case VW_CHANNEL_INT16:   return Isis::NULL2;\n      default:                 return 0.0;\n    }\n  }\n  double DiskImageResourceIsis::valid_minimum() const {\n    switch (m_format.channel_type) {\n      case VW_CHANNEL_FLOAT64: return Isis::ValidMinimum;\n      case VW_CHANNEL_FLOAT32: return Isis::VALID_MIN4;\n      case VW_CHANNEL_INT32:   return Isis::IVALID_MIN4;\n      case VW_CHANNEL_INT16:   return Isis::VALID_MIN2;\n      case VW_CHANNEL_UINT16:  return Isis::VALID_MINU2;\n      default:                 return Isis::VALID_MIN1;\n    }\n  }\n  double DiskImageResourceIsis::valid_maximum() const {\n    switch (m_format.channel_type) {\n      case VW_CHANNEL_FLOAT64: return Isis::ValidMaximum;\n      case VW_CHANNEL_FLOAT32: return Isis::VALID_MAX4;\n      case VW_CHANNEL_INT32:   return 2147483647;\n      case VW_CHANNEL_INT16:   return Isis::VALID_MAX2;\n      case VW_CHANNEL_UINT16:  return Isis::VALID_MAXU2;\n      default:                 return Isis::VALID_MAX1;\n    }\n  }\n  bool DiskImageResourceIsis::is_map_projected() const {\n    // They used to have a HasProjection. I'm not sure if this fix is the correct method now.\n    return m_cube->projection() != NULL;\n  }\n}\n"
  },
  {
    "path": "src/asp/IsisIO/DiskImageResourceIsis.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n/// \\file DiskImageResourceIsis.h\n///\n/// Provides support for ISIS image files.\n///\n#ifndef __VW_FILEIO_DISK_IMAGE_RESOUCE_ISIS_H__\n#define __VW_FILEIO_DISK_IMAGE_RESOUCE_ISIS_H__\n\n#include <vw/Image/PixelTypes.h>\n#include <vw/FileIO/DiskImageResource.h>\n#include <vw/FileIO/DiskImageResourceGDAL.h>\n\nnamespace Isis {\n  class Cube;\n}\n\nnamespace vw {\n\n  class DiskImageResourceIsis : public DiskImageResourceGDAL {\n  public:\n\n    DiskImageResourceIsis(std::string const& filename) : DiskImageResourceGDAL(filename) {\n      open(filename);\n    }\n\n    DiskImageResourceIsis(std::string const& filename, ImageFormat const& format)\n      : DiskImageResourceGDAL(filename) {\n      create(filename, format);\n    }\n\n    virtual ~DiskImageResourceIsis() {}\n\n    /// Returns the type of disk image resource.\n    static std::string type_static() { return \"ISIS\"; }\n    virtual std::string type() { return type_static(); }\n\n    virtual bool has_block_write () const {return false;}\n    virtual bool has_nodata_write() const {return false;}\n    virtual bool has_block_read  () const {return true; }\n    virtual bool has_nodata_read () const {return true; }\n\n    virtual Vector2i block_read_size() const;\n\n    virtual void read (ImageBuffer const& dest, BBox2i const& bbox) const;\n    virtual void write(ImageBuffer const& dest, BBox2i const& bbox);\n    virtual void flush() {}\n    //    std::string query(std::string const& key) const;\n    void open(std::string const& filename);\n    void create(std::string const& filename, ImageFormat const& format);\n    static DiskImageResource* construct_open  (std::string const& filename);\n    static DiskImageResource* construct_create(std::string const& filename,\n                                               ImageFormat const& format);\n\n    // Info about special pixel types in ISIS\n    // --------------------------------------\n    // Note: Isis has many types of invalid pixels. If creating a mask\n    // of valid pixels, use only pixels within the valid range\n    // provided in the functions below.\n    double nodata_read  () const;\n    double valid_minimum() const;\n    double valid_maximum() const;\n\n    // Additional cube informat\n    bool is_map_projected() const;\n\n  private:\n    boost::shared_ptr<Isis::Cube> m_cube;\n    std::string m_filename;\n    int         m_bytes_per_pixel;\n    Vector2i    m_native_block_size;\n  };\n\n} // namespace vw\n\n#endif // __VW_FILEIO_DISK_IMAGE_RESOUCE_ISIS_H__\n"
  },
  {
    "path": "src/asp/IsisIO/Equation.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <vw/Core/Exception.h>\n#include <asp/IsisIO/Equation.h>\n#include <asp/IsisIO/BaseEquation.h>\n#include <asp/IsisIO/PolyEquation.h>\n#include <asp/IsisIO/RPNEquation.h>\n\n#include <ostream>\n#include <string>\n\nusing namespace vw;\nusing namespace asp;\n\n// Useful tools\n//-------------------------------------------------------\n\n// Debugging output of coefficients (constants)\nstd::ostream& asp::operator<<( std::ostream& os,\n                               boost::shared_ptr<BaseEquation> eq ) {\n  os << \"Vector Equation-----------------------------\\n\";\n  os << \" \" << eq->type() << std::endl;\n  os << \" Time Offset: \" << eq->get_time_offset() << \"\\n\";\n  os << \" Eq Coeff: \" << \"\\n\";\n  unsigned working_idx = 0;\n  while ( working_idx != eq->size() ) {\n    os << \" \";\n    for ( int i = 0; i < 4; i++ )\n      if ( working_idx != eq->size() ) {\n        os << (*eq)[working_idx] << \" \";\n        working_idx++;\n      }\n    os << \"\\n\";\n  }\n  os << \"--------------------------------------------\\n\";\n  return os;\n}\n\n// Determines equation type and write appropriate\nvoid asp::write_equation( std::ofstream& f, boost::shared_ptr<BaseEquation> eq ) {\n  f << eq->type() << \"\\n\";\n  eq->write( f );\n}\n// Determines equation type from file and return appropriate\nboost::shared_ptr<BaseEquation> asp::read_equation( std::ifstream& f) {\n  if ( !f.is_open() )\n    vw_throw( IOErr() << \"IsisIO/Equation: Unable to open equation file\\n\" );\n\n  boost::shared_ptr<BaseEquation> eq;\n\n  std::string buffer = \"\";\n  std::getline( f, buffer );\n  if ( buffer == \"PolyEquation\" ) {\n    boost::shared_ptr<PolyEquation> eqn_new( new PolyEquation() );\n    eq = boost::dynamic_pointer_cast<BaseEquation>( eqn_new );\n    eq->read( f );\n  } else if ( buffer == \"RPNEquation\" ) {\n    boost::shared_ptr<RPNEquation> eqn_new( new RPNEquation() );\n    eq = boost::dynamic_pointer_cast<BaseEquation>( eqn_new );\n    eq->read( f );\n  } else {\n    vw_throw( IOErr() << \"Unknown equation type: \" << buffer << \"\\n\" );\n  }\n  return eq;\n}\n\n\n"
  },
  {
    "path": "src/asp/IsisIO/Equation.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n#ifndef __ASP_EQUATION_H__\n#define __ASP_EQUATION_H__\n\n#include <iosfwd>\n\n#include <boost/smart_ptr/shared_ptr.hpp>\n\nnamespace asp {\n\n  class BaseEquation;\n\n  // Useful tools\n  //-------------------------------------------------------\n\n  // Debugging output of coefficients (constants)\n  std::ostream& operator<<( std::ostream&, boost::shared_ptr<BaseEquation> eq);\n\n  // Determines equation type and write appropriate\n  void write_equation( std::ofstream& f, boost::shared_ptr<BaseEquation> eq);\n  // Determines equation type from file and return appropriate\n  boost::shared_ptr<BaseEquation> read_equation( std::ifstream& f);\n\n}\n\n#endif//__ASP_EQUATION_H__\n"
  },
  {
    "path": "src/asp/IsisIO/IsisCameraModel.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n/// \\file IsisCameraModel.h\n///\n/// This file contains the ISIS camera model.\n///\n#ifndef __VW_CAMERAMODEL_ISIS_H__\n#define __VW_CAMERAMODEL_ISIS_H__\n\n// VW\n#include <vw/Math/Vector.h>\n#include <vw/Math/Matrix.h>\n#include <vw/Camera/CameraModel.h>\n\n// ASP\n#include <asp/IsisIO/IsisInterface.h>\n\nnamespace vw {\nnamespace camera {\n\n  // This is largely just a shortened reimplementation of ISIS's\n  // Camera.cpp.\n  class IsisCameraModel : public CameraModel {\n\n  public:\n    //------------------------------------------------------------------\n    // Constructors / Destructors\n    //------------------------------------------------------------------\n    IsisCameraModel(std::string cube_filename) :\n      m_interface(asp::isis::IsisInterface::open( cube_filename )) {}\n    virtual std::string type() const { return \"Isis\"; }\n\n    //------------------------------------------------------------------\n    // Methods\n    //------------------------------------------------------------------\n\n    //  Computes the image of the point 'point' in 3D space on the\n    //  image plane.  Returns a pixel location (col, row) where the\n    //  point appears in the image.\n    virtual Vector2 point_to_pixel(Vector3 const& point) const {\n      return m_interface->point_to_pixel( point ); }\n\n    // Returns a (normalized) pointing vector from the camera center\n    //  through the position of the pixel 'pix' on the image plane.\n    virtual Vector3 pixel_to_vector (Vector2 const& pix) const {\n      return m_interface->pixel_to_vector( pix ); }\n\n\n    // Returns the position of the focal point of the camera\n    virtual Vector3 camera_center(Vector2 const& pix = Vector2() ) const {\n      return m_interface->camera_center( pix ); }\n\n    // Pose is a rotation which moves a vector in camera coordinates\n    // into world coordinates.\n    virtual Quat camera_pose(Vector2 const& pix = Vector2() ) const {\n      return m_interface->camera_pose( pix ); }\n\n    // Returns the number of lines is the ISIS cube\n    int lines() const { return m_interface->lines(); }\n\n    // Returns the number of samples in the ISIS cube\n    int samples() const{ return m_interface->samples(); }\n\n    // Returns the serial number of the ISIS cube\n    std::string serial_number() const {\n      return m_interface->serial_number(); \n    }\n\n    // Returns the ephemeris time for a pixel\n    double ephemeris_time( Vector2 const& pix = Vector2() ) const {\n      return m_interface->ephemeris_time( pix );\n    }\n\n    // Sun position in the target frame's inertial frame\n    Vector3 sun_position( Vector2 const& pix = Vector2() ) const {\n      return m_interface->sun_position( pix );\n    }\n\n    // The three main radii that make up the spheroid. Z is out the polar region\n    Vector3 target_radii() const {\n      return m_interface->target_radii();\n    }\n\n    // The spheroid name\n    std::string target_name() const {\n      return m_interface->target_name();\n    }\n\n    // The datum\n    vw::cartography::Datum get_datum_isis(bool use_sphere_for_non_earth) const {\n      return m_interface->get_datum_isis(use_sphere_for_non_earth);\n    }\n    \n  protected:\n    boost::shared_ptr<asp::isis::IsisInterface> m_interface;\n\n    friend std::ostream& operator<<( std::ostream&, IsisCameraModel const& );\n  };\n\n  // IOstream interface\n  // ---------------------------------------------\n  inline std::ostream& operator<<( std::ostream& os,\n                                   IsisCameraModel const& i ) {\n    os << \"IsisCameraModel\" << i.lines() << \"x\" << i.samples() << \"( \"\n       << i.m_interface << \" )\";\n    return os;\n  }\n\n}}\n\n#endif  //__VW_CAMERA_ISIS_H__\n"
  },
  {
    "path": "src/asp/IsisIO/IsisInterface.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/IsisIO/IsisInterface.h>\n#include <asp/IsisIO/IsisInterfaceMapFrame.h>\n#include <asp/IsisIO/IsisInterfaceFrame.h>\n#include <asp/IsisIO/IsisInterfaceMapLineScan.h>\n#include <asp/IsisIO/IsisInterfaceLineScan.h>\n#include <asp/IsisIO/IsisInterfaceSAR.h>\n\n#include <isis/Cube.h>\n#include <isis/Distance.h>\n#include <isis/Pvl.h>\n#include <isis/Camera.h>\n#include <isis/Target.h>\n#include <isis/FileName.h>\n#include <isis/CameraFactory.h>\n#include <isis/SerialNumber.h>\n#include <isis/iTime.h>\n#include <isis/Blob.h>\n#include <isis/Process.h>\n#include <isis/CubeAttribute.h>\n\n#include <vw/Core/Exception.h>\n#include <vw/Math/Vector.h>\n#include <vw/Core/Log.h>\n\n#include <boost/filesystem.hpp>\n\n#include <iomanip>\n#include <ostream>\n\nusing namespace vw;\n\nnamespace asp {namespace isis { \n                               \nIsisInterface::IsisInterface(std::string const& file) {\n  \n  // Opening labels and camera\n  Isis::FileName ifilename(QString::fromStdString(file));\n  m_label = std::make_unique<Isis::Pvl>();\n  m_label->read(ifilename.expanded());\n\n  // Opening Isis::Camera\n  m_cube = std::make_unique<Isis::Cube>(QString::fromStdString(file));\n  m_camera.reset(Isis::CameraFactory::Create(*m_cube));\n\n  // Set the datum\n  // TODO(oalexan1): This is fragile. Need to find the right internal ISIS\n  // function to use to convert ECEF to lon-lat-height and vice-versa.\n  bool use_sphere_for_non_earth = true;\n  m_datum = this->get_datum_isis(use_sphere_for_non_earth);\n}\n\nIsisInterface::~IsisInterface() {}\n\nIsisInterface* IsisInterface::open(std::string const& filename) {\n  \n  // Opening Labels (This should be done somehow though labels)\n  Isis::FileName ifilename(QString::fromStdString(filename));\n  Isis::Pvl label;\n  label.read(ifilename.expanded());\n\n  QString access = \"r\";\n  Isis::Cube tempCube(QString::fromStdString(filename), access);\n  Isis::Camera* camera = Isis::CameraFactory::Create(tempCube);\n\n  IsisInterface* result;\n\n  // Instantiate the correct class type\n  switch (camera->GetCameraType()) {\n  case 0:\n    // Framing camera\n    if (camera->HasProjection())\n      result = new IsisInterfaceMapFrame(filename);\n    else\n      result = new IsisInterfaceFrame(filename);\n    break;\n  case 2:\n    // Linescan camera\n    if (camera->HasProjection())\n      result = new IsisInterfaceMapLineScan(filename);\n    else\n      result = new IsisInterfaceLineScan(filename);\n    break;\n  case 3:\n    // SAR camera (such as MiniRF)\n    // The same interface handles both projected and unprojected images,\n    // since the ISIS functions take care of the details.\n    // TODO(oalexan1): that cam2map-ed images are handled correctly.\n    result = new IsisInterfaceSAR(filename);\n    break;\n  default:\n    // LRO WAC comes here\n    vw_throw(NoImplErr() << \"Unusual input file: \" << filename\n             << \". Seems to have Isis camera type \" << camera->GetCameraType() \n             << \". Check your data. Maybe it will work with CSM.\");\n  }\n\n  return result;\n}\n\nint IsisInterface::lines() const {\n  return m_camera->Lines();\n}\n\nint IsisInterface::samples() const {\n  return m_camera->Samples();\n}\n\nstd::string IsisInterface::serial_number() const {\n  Isis::Pvl copy(*m_label);\n  return Isis::SerialNumber::Compose(copy, true).toStdString();\n}\n\ndouble IsisInterface::ephemeris_time(vw::Vector2 const& pix) const {\n  m_camera->SetImage(pix[0]+1, pix[1]+1);\n  return m_camera->time().Et();\n}\n\nvw::Vector3 IsisInterface::sun_position(vw::Vector2 const& pix) const {\n  m_camera->SetImage(pix[0]+1, pix[1]+1);\n  Vector3 sun;\n  m_camera->sunPosition(&sun[0]);\n  return sun * 1000;\n}\n\nvw::Vector3 IsisInterface::target_radii() const {\n  Isis::Distance radii[3];\n  m_camera->radii(radii);\n  return Vector3(radii[0].meters(), radii[1].meters(), radii[2].meters());\n}\n\nstd::string IsisInterface::target_name() const {\n  return m_camera->target()->name().toStdString();\n}\n\n// Manufacture a datum\nvw::cartography::Datum IsisInterface::get_datum_isis(bool use_sphere_for_non_earth) const {\n  \n  vw::Vector3 radii = this->target_radii();\n  double radius1 = (radii[0] + radii[1]) / 2.0; // average the x and y axes (semi-major) \n  double radius2 = radius1;\n  if (!use_sphere_for_non_earth)\n    radius2 = radii[2]; // the z radius (semi-minor axis)\n  \n  vw::cartography::Datum datum(\"D_\" + this->target_name(), this->target_name(),\n                               \"Reference Meridian\", radius1, radius2, 0);\n  return datum;\n}\n\nstd::ostream& operator<<(std::ostream& os, IsisInterface* i) {\n  os << \"IsisInterface\" << i->type()\n       << \"(Serial=\" << i->serial_number()\n       << std::setprecision(9)\n       << \", f=\" << i->m_camera->FocalLength()\n       << \" mm, pitch=\" << i->m_camera->PixelPitch()\n       << \" mm/px,\" << std::setprecision(6)\n       << \"Center=\" << i->camera_center() << \")\";\n    return os;\n}\n\n// Check if ISISROOT and ISISDATA was set\nbool IsisEnv() {\n  char * isisroot_ptr = getenv(\"ISISROOT\");\n  char * isisdata_ptr = getenv(\"ISISDATA\");\n\n  if (isisroot_ptr == NULL || isisdata_ptr == NULL ||\n      std::string(isisroot_ptr) == \"\" ||\n      std::string(isisdata_ptr) == \"\" ||\n      !boost::filesystem::exists(std::string(isisroot_ptr) + \"/IsisPreferences\"))\n    return false;\n  return true;\n}\n\n// TODO(oalexan1): This must be integrated with ISIS\nvoid deleteKeywords(Isis::Cube *cube) {\n  \n  Isis::PvlGroup &kernelsGroup = cube->group(\"Kernels\");\n\n  // Get rid of keywords from spiceinit\n  if (kernelsGroup.hasKeyword(\"LeapSecond\")) {\n    kernelsGroup.deleteKeyword(\"LeapSecond\");\n  }\n  if (kernelsGroup.hasKeyword(\"TargetAttitudeShape\")) {\n    kernelsGroup.deleteKeyword(\"TargetAttitudeShape\");\n  }\n  if (kernelsGroup.hasKeyword(\"TargetPosition\")) {\n    kernelsGroup.deleteKeyword(\"TargetPosition\");\n  }\n  if (kernelsGroup.hasKeyword(\"InstrumentPointing\")) {\n    kernelsGroup.deleteKeyword(\"InstrumentPointing\");\n  }\n  if (kernelsGroup.hasKeyword(\"InstrumentPointingQuality\")) {\n    kernelsGroup.deleteKeyword(\"InstrumentPointingQuality\");\n  }\n  if (kernelsGroup.hasKeyword(\"Instrument\")) {\n    kernelsGroup.deleteKeyword(\"Instrument\");\n  }\n  if (kernelsGroup.hasKeyword(\"SpacecraftClock\")) {\n    kernelsGroup.deleteKeyword(\"SpacecraftClock\");\n  }\n  if (kernelsGroup.hasKeyword(\"InstrumentPositionQuality\")) {\n    kernelsGroup.deleteKeyword(\"InstrumentPositionQuality\");\n  }\n  if (kernelsGroup.hasKeyword(\"InstrumentPosition\")) {\n    kernelsGroup.deleteKeyword(\"InstrumentPosition\");\n  }\n  if (kernelsGroup.hasKeyword(\"InstrumentAddendum\")) {\n    kernelsGroup.deleteKeyword(\"InstrumentAddendum\");\n  }\n  if (kernelsGroup.hasKeyword(\"EXTRA\")) {\n    kernelsGroup.deleteKeyword(\"EXTRA\");\n  }\n  if (kernelsGroup.hasKeyword(\"Source\")) {\n    kernelsGroup.deleteKeyword(\"Source\");\n  }\n  if (kernelsGroup.hasKeyword(\"SpacecraftPointing\")) {\n    kernelsGroup.deleteKeyword(\"SpacecraftPointing\");\n  }\n  if (kernelsGroup.hasKeyword(\"SpacecraftPosition\")) {\n    kernelsGroup.deleteKeyword(\"SpacecraftPosition\");\n  }\n  if (kernelsGroup.hasKeyword(\"CameraVersion\")) {\n    kernelsGroup.deleteKeyword(\"CameraVersion\");\n  }\n  if (kernelsGroup.hasKeyword(\"ElevationModel\")) {\n    kernelsGroup.deleteKeyword(\"ElevationModel\");\n  }\n  if (kernelsGroup.hasKeyword(\"Frame\")) {\n    kernelsGroup.deleteKeyword(\"Frame\");\n  }\n  if (kernelsGroup.hasKeyword(\"StartPadding\")) {\n    kernelsGroup.deleteKeyword(\"StartPadding\");\n  }\n  if (kernelsGroup.hasKeyword(\"EndPadding\")) {\n    kernelsGroup.deleteKeyword(\"EndPadding\");\n  }\n  if (kernelsGroup.hasKeyword(\"RayTraceEngine\")) {\n    kernelsGroup.deleteKeyword(\"RayTraceEngine\");\n  }\n  if (kernelsGroup.hasKeyword(\"OnError\")) {\n    kernelsGroup.deleteKeyword(\"OnError\");\n  }\n  if (kernelsGroup.hasKeyword(\"Tolerance\")) {\n    kernelsGroup.deleteKeyword(\"Tolerance\");\n  }\n\n  if (cube->label()->hasObject(\"NaifKeywords\")) {\n    cube->label()->deleteObject(\"NaifKeywords\");\n  }\n  \n  // Delete any existing polygon (per jigsaw)\n  if (cube->label()->hasObject(\"Polygon\")) {\n    cube->label()->deleteObject(\"Polygon\");\n  }\n\n  // Delete any CameraStatistics table (per jigsaw)\n  for (int iobj = 0; iobj < cube->label()->objects(); iobj++) {\n    Isis::PvlObject obj = cube->label()->object(iobj);\n    if (obj.name() != \"Table\") continue;\n    if (obj[\"Name\"][0] != QString(\"CameraStatistics\")) continue;\n    cube->label()->deleteObject(iobj);\n    break;\n  }\n\n  // Remove tables from spiceinit before writing to the cube (per csminit)\n  cube->deleteBlob(\"InstrumentPointing\", \"Table\");\n  cube->deleteBlob(\"InstrumentPosition\", \"Table\");\n  cube->deleteBlob(\"BodyRotation\", \"Table\");\n  cube->deleteBlob(\"SunPosition\", \"Table\");\n  cube->deleteBlob(\"CameraStatistics\", \"Table\");\n  cube->deleteBlob(\"Footprint\", \"Polygon\");\n  \n  // Wipe any existing blob (per csminit)\n  cube->deleteBlob(\"CSMState\", \"String\");\n}\n\n// Peek inside a cube file to see if it has a CSM blob. This needs ISIS\n// logic, rather than any CSM-specific info.  \nbool IsisCubeHasCsmBlob(std::string const& cubeFile) {\n  \n  QString qCubeFile = QString::fromStdString(cubeFile);\n  QString access = \"r\";\n  Isis::Cube cube(qCubeFile, access);\n  return cube.hasBlob(\"CSMState\", \"String\");\n}\n\n// Read the CSM state (a string) from a cube file. Throw an exception if\n// missing. Careful not to copy junk from the blob.\nstd::string csmStateFromIsisCube(std::string const& cubeFile) {\n    \n  QString qCubeFile = QString::fromStdString(cubeFile);\n  QString access = \"r\";\n  Isis::Cube cube(qCubeFile, access);\n  if (!cube.hasBlob(\"CSMState\", \"String\"))\n    vw::vw_throw( vw::ArgumentErr() << \"Cannot find the CSM state in: \"\n                  << cubeFile << \"\\n\");\n\n  Isis::Blob csmStateBlob(\"CSMState\", \"String\");\n  cube.read(csmStateBlob);\n\n  // Copy precisely the number of characters in the blob. This prevents copying junk,\n  // which can result in a parse error later.\n  int len = csmStateBlob.Size();\n  std::string buf(len, ' ');\n  memcpy(&buf[0], csmStateBlob.getBuffer(), len);\n\n  return buf;\n}\n\n// Save a CSM state to an ISIS Cube file. Wipe any spice info.\n// This may throw if the file cannot be saved.\nvoid saveCsmStateToIsisCube(std::string const& cubeFile, \n                            std::string const& pluginName, \n                            std::string const& modelName,\n                            std::string const& modelState) {\n \n if (modelState.empty())\n   vw::vw_throw( vw::ArgumentErr() << \"Cannot save empty CSM state to ISIS cube file \"\n                 << cubeFile << \".\\n\");\n\n  QString qCubeFile = QString::fromStdString(cubeFile);\n  Isis::Process p;\n  Isis::CubeAttributeInput inAtt;\n  Isis::Cube *cube = p.SetInputCube(qCubeFile, inAtt, Isis::ReadWrite);\n  \n  // Delete any spice and other obsolete keywords (per csminit)\n  deleteKeywords(cube);\n\n  // Add the CSM state to to a blob\n  Isis::Blob csmStateBlob(\"CSMState\", \"String\");\n  csmStateBlob.setData(modelState.c_str(), modelState.size());\n\n  // Save the state and other info to the cube\n  QString jigComment = \"Jigged = \" + Isis::iTime::CurrentLocalTime();\n  QString qModelName = QString::fromStdString(modelName);\n  QString qPluginName = QString::fromStdString(pluginName);\n  Isis::PvlObject &blobLabel = csmStateBlob.Label();\n  blobLabel += Isis::PvlKeyword(\"ModelName\", qModelName);\n  blobLabel += Isis::PvlKeyword(\"PluginName\", qPluginName);\n  blobLabel.addComment(jigComment);\n\n  // Write the cube  \n  cube->write(csmStateBlob);\n  Isis::CameraFactory::Create(*cube);\n  p.WriteHistory(*cube);\n  \n  // Note: It appears that one need not deallocate the cube, at least it is not\n  // done in ISIS code and the comments do not mention needing that.\n}\n\n}} // end namespace asp::isis\n\n"
  },
  {
    "path": "src/asp/IsisIO/IsisInterface.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n/// \\file IsisInterface.h\n///\n/// Generic Interface with ISIS\n///\n#ifndef __ASP_ISIS_INTERFACE_H__\n#define __ASP_ISIS_INTERFACE_H__\n\n// Must include foreach.hpp before Cube.h as otherwise there will be\n// an issue with Qt imported by Cube.h.\n#include <boost/foreach.hpp>\n\n// VW & ASP\n#include <vw/Math/Vector.h>\n#include <vw/Math/Quaternion.h>\n#include <vw/Cartography/Datum.h>\n\n#include <memory>\n\n// Isis include\n#include <Cube.h>\n\n#include <string>\n\nnamespace Isis {\n  class Pvl;\n  class Camera;\n}\n\nnamespace asp {\nnamespace isis {\n\n  /// The IsisInterface abstract base class\n  // -------------------------------------------------------\n\n  class IsisInterface {\n  public:\n    IsisInterface( std::string const& file );\n    virtual ~IsisInterface(); // Can't be declared here since we have\n                              // incomplete types from Isis.\n\n    virtual std::string type() = 0;\n    \n    /// Construct an IsisInterface-derived class of the correct type for the given file.\n    static IsisInterface* open( std::string const& filename );\n\n    // Standard Methods\n    //------------------------------------------------------\n\n    // These are the standard camera request; IsisInterface allows for\n    // them to be customized for the type of camera so that they are\n    // fast and not too full of conditionals.\n\n    virtual vw::Vector2 point_to_pixel ( vw::Vector3 const& point               ) const = 0;\n    virtual vw::Vector3 pixel_to_vector( vw::Vector2 const& pix                 ) const = 0;\n    virtual vw::Vector3 camera_center  ( vw::Vector2 const& pix = vw::Vector2() ) const = 0;\n    virtual vw::Quat    camera_pose    ( vw::Vector2 const& pix = vw::Vector2() ) const = 0;\n\n    // General information\n    //------------------------------------------------------\n    int         lines         () const;\n    int         samples       () const;\n    std::string serial_number () const;\n    double      ephemeris_time( vw::Vector2 const& pix ) const;\n    vw::Vector3 sun_position  ( vw::Vector2 const& pix = vw::Vector2() ) const;\n    vw::Vector3 target_radii  () const;\n    std::string target_name   () const;\n    vw::cartography::Datum get_datum_isis(bool use_sphere_for_non_earth) const;\n\n  protected:\n    // Standard Variables\n    //------------------------------------------------------\n    std::unique_ptr<Isis::Pvl> m_label;\n    std::unique_ptr<Isis::Camera> m_camera;\n    std::unique_ptr<Isis::Cube> m_cube;\n\n    vw::cartography::Datum m_datum;\n    \n    friend std::ostream& operator<<( std::ostream&, IsisInterface* );\n  };\n\n  // IOstream interface\n  // -------------------------------------------------------\n  std::ostream& operator<<( std::ostream& os, IsisInterface* i );\n\n  bool IsisEnv();\n\n  // Peek inside a Cube file to see if it has a CSM blob. This needs ISIS\n  // logic, rather than any CSM-specific info.  \n  bool IsisCubeHasCsmBlob(std::string const& cubeFile);\n  \n  // Read the CSM state (a string) from a cube file. Throw an exception\n  // if missing.\n  std::string csmStateFromIsisCube(std::string const& cubeFile);\n  \n  // Save a CSM state to an ISIS Cube file. Wipe any spice info. This may\n  // throw if the file cannot be saved.\n  void saveCsmStateToIsisCube(std::string const& cubeFile,\n                              std::string const& pluginName,\n                              std::string const& modelName,\n                              std::string const& modelState);\n}}\n\n#endif //__ASP_ISIS_INTERFACE_H__\n"
  },
  {
    "path": "src/asp/IsisIO/IsisInterfaceFrame.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n#include <vw/Math/Matrix.h>\n#include <asp/IsisIO/IsisInterfaceFrame.h>\n\n#include <algorithm>\n#include <vector>\n\n#include <Camera.h>\n#include <CameraDetectorMap.h>\n#include <CameraDistortionMap.h>\n#include <CameraFocalPlaneMap.h>\n\nusing namespace vw;\nusing namespace asp;\nusing namespace asp::isis;\n\n// Constructor\nIsisInterfaceFrame::IsisInterfaceFrame(std::string const& filename):\n  IsisInterface(filename), m_alphacube(*m_cube) {\n\n  // Gutting Isis::Camera\n  m_distortmap = m_camera->DistortionMap();\n  m_focalmap   = m_camera->FocalPlaneMap();\n  m_detectmap  = m_camera->DetectorMap();\n\n  // Calculate the camera center (just once)\n  m_camera->instrumentPosition(&m_center[0]);\n  m_center *= 1000.0; // convert to meters\n\n  // Calculating the camera pose (just once)\n  std::vector<double> rot_inst = m_camera->instrumentRotation()->Matrix();\n  std::vector<double> rot_body = m_camera->bodyRotation()->Matrix();\n  MatrixProxy<double,3,3> R_inst(&(rot_inst[0]));\n  MatrixProxy<double,3,3> R_body(&(rot_body[0]));\n\n  // Instrument Rotation = Spacecraft to Camera's Frame\n  // Body Rotation = Spacecraft to World Frame\n  m_pose = Quat(R_body*transpose(R_inst));\n}\n\nVector2\nIsisInterfaceFrame::point_to_pixel(Vector3 const& point) const {\n\n  Vector3 look = normalize(point - m_center);\n  std::vector<double> lookB_copy(3);\n  std::copy(look.begin(), look.end(), lookB_copy.begin());\n  lookB_copy = m_camera->bodyRotation()->J2000Vector(lookB_copy);\n  lookB_copy = m_camera->instrumentRotation()->ReferenceVector(lookB_copy);\n  std::copy(lookB_copy.begin(), lookB_copy.end(), look.begin());\n  look = m_camera->FocalLength() * (look / std::abs(look[2]));\n\n  // Project into the camera\n  m_distortmap->SetUndistortedFocalPlane(look[0], look[1]);\n  m_focalmap->SetFocalPlane(m_distortmap->FocalPlaneX(),\n                             m_distortmap->FocalPlaneY());\n  m_detectmap->SetDetector(m_focalmap->DetectorSample(),\n                            m_focalmap->DetectorLine());\n  return Vector2(m_alphacube.BetaSample(m_detectmap->ParentSample()) - 1,\n                  m_alphacube.BetaLine(m_detectmap->ParentLine()) - 1);\n}\n\nVector3\nIsisInterfaceFrame::pixel_to_vector(Vector2 const& px) const {\n  m_detectmap->SetParent(m_alphacube.AlphaSample(px[0] + 1), m_alphacube.AlphaLine(px[1] + 1));\n  m_focalmap->SetDetector(m_detectmap->DetectorSample(), m_detectmap->DetectorLine());\n  m_distortmap->SetFocalPlane(m_focalmap->FocalPlaneX(), m_focalmap->FocalPlaneY());\n  \n  std::vector<double> look(3);\n  look[0] = m_distortmap->UndistortedFocalPlaneX();\n  look[1] = m_distortmap->UndistortedFocalPlaneY();\n  look[2] = m_distortmap->UndistortedFocalPlaneZ();\n  VectorProxy<double,3> result(&look[0]);\n  result = normalize(result);\n  look = m_camera->instrumentRotation()->J2000Vector(look);\n  look = m_camera->bodyRotation()->ReferenceVector(look);\n  return result;\n}\n\nVector3\nIsisInterfaceFrame::camera_center(Vector2 const& /*pix*/) const {\n  return m_center;\n}\n\nQuat\nIsisInterfaceFrame::camera_pose(Vector2 const& /*pix*/) const {\n  return m_pose;\n}\n"
  },
  {
    "path": "src/asp/IsisIO/IsisInterfaceFrame.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n/// \\file IsisInterfaceFrame.h\n///\n/// Frame Camera Interface with ISIS\n///\n#ifndef __ASP_ISIS_INTERFACE_FRAME_H__\n#define __ASP_ISIS_INTERFACE_FRAME_H__\n\n#include <vw/Math/Vector.h>\n#include <vw/Math/Quaternion.h>\n#include <asp/IsisIO/IsisInterface.h>\n\n#include <string>\n\n#include <AlphaCube.h>\n\nnamespace Isis {\n  class CameraDetectorMap;\n  class CameraDistortionMap;\n  class CameraFocalPlaneMap;\n}\n\nnamespace asp {\nnamespace isis {\n\n  class IsisInterfaceFrame : public IsisInterface {\n\n  public:\n    IsisInterfaceFrame( std::string const& filename );\n\n    virtual std::string type()  { return \"Frame\"; }\n\n    // Standard Methods\n    //-------------------------------------------------\n\n    virtual vw::Vector2 point_to_pixel ( vw::Vector3 const& point ) const;\n    virtual vw::Vector3 pixel_to_vector( vw::Vector2 const& pix   ) const;\n    virtual vw::Vector3 camera_center  ( vw::Vector2 const& pix = vw::Vector2(1,1) ) const;\n    virtual vw::Quat    camera_pose    ( vw::Vector2 const& pix = vw::Vector2(1,1) ) const;\n\n  protected:\n\n    // Custom Variables\n    Isis::CameraDistortionMap *m_distortmap;\n    Isis::CameraFocalPlaneMap *m_focalmap;\n    Isis::CameraDetectorMap   *m_detectmap;\n    mutable Isis::AlphaCube    m_alphacube;\n\n    vw::Vector3 m_center;\n    vw::Quat    m_pose;\n  };\n\n}}\n\n#endif//__ASP_ISIS_INTERFACE_FRAME_H__\n"
  },
  {
    "path": "src/asp/IsisIO/IsisInterfaceLineScan.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/IsisIO/IsisInterfaceLineScan.h>\n\n#include <vw/Math/LevenbergMarquardt.h>\n#include <vw/Math/Matrix.h>\n#include <vw/Camera/CameraModel.h>\n\n// Isis headers\n#include <Camera.h>\n#include <CameraDetectorMap.h>\n#include <CameraDistortionMap.h>\n#include <CameraFocalPlaneMap.h>\n#include <iTime.h>\n#include <SurfacePoint.h>\n#include <Latitude.h>\n#include <Longitude.h>\n#include <Angle.h>\n\n#include <algorithm>\n#include <vector>\n\nusing namespace vw;\nusing namespace asp;\nusing namespace asp::isis;\n\n// Construct\nIsisInterfaceLineScan::IsisInterfaceLineScan(std::string const& filename): IsisInterface(filename), m_alphacube(*m_cube) {\n\n  // Gutting Isis::Camera\n  m_distortmap = m_camera->DistortionMap();\n  m_focalmap   = m_camera->FocalPlaneMap();\n  m_detectmap  = m_camera->DetectorMap();\n}\n\n// Custom function to help avoid over invoking the deeply buried\n// functions of Isis::Sensor\nvoid IsisInterfaceLineScan::SetTime(Vector2 const& px, bool calc_pose) const {\n  if (px != m_c_location) {\n    m_c_location = px;\n    m_detectmap->SetParent(m_alphacube.AlphaSample(px[0]),\n                           m_alphacube.AlphaLine(px[1]));\n\n    if (calc_pose) {\n      // Calculating the spacecraft position and orientation (hence pose)\n      m_camera->instrumentPosition(&m_center[0]);\n      m_center *= 1000;\n\n      std::vector<double> rot_inst = m_camera->instrumentRotation()->Matrix();\n      std::vector<double> rot_body = m_camera->bodyRotation()->Matrix();\n      MatrixProxy<double,3,3> R_inst(&(rot_inst[0]));\n      MatrixProxy<double,3,3> R_body(&(rot_body[0]));\n      m_pose = Quat(R_body*transpose(R_inst));\n    }\n  }\n}\n\nclass EphemerisLMA : public vw::math::LeastSquaresModelBase<EphemerisLMA> {\n  vw::Vector3 m_point;\n  Isis::Camera* m_camera;\n  Isis::CameraDistortionMap *m_distortmap;\n  Isis::CameraFocalPlaneMap *m_focalmap;\npublic:\n  typedef vw::Vector<double> result_type; // Back project result\n  typedef vw::Vector<double> domain_type; // Ephemeris time\n  typedef vw::Matrix<double> jacobian_type;\n\n  inline EphemerisLMA(vw::Vector3 const& point,\n                      Isis::Camera* camera,\n                      Isis::CameraDistortionMap* distortmap,\n                      Isis::CameraFocalPlaneMap* focalmap) : m_point(point), m_camera(camera), m_distortmap(distortmap), m_focalmap(focalmap) {}\n\n  inline result_type operator()(domain_type const& x) const;\n};\n\n// LMA for projecting point to linescan camera\nEphemerisLMA::result_type\nEphemerisLMA::operator()(EphemerisLMA::domain_type const& x) const {\n\n  // Setting Ephemeris Time\n  m_camera->setTime(Isis::iTime(x[0]));\n\n  // Calculating the look direction in camera frame\n  Vector3 instr_pos;\n  m_camera->instrumentPosition(&instr_pos[0]);\n  instr_pos *= 1000;  // Spice gives in km\n  Vector3 lookB = normalize(m_point - instr_pos);\n  std::vector<double> lookB_copy(3);\n  std::copy(lookB.begin(), lookB.end(), lookB_copy.begin());\n  std::vector<double> lookJ = m_camera->bodyRotation()->J2000Vector(lookB_copy);\n  std::vector<double> lookC = m_camera->instrumentRotation()->ReferenceVector(lookJ);\n  Vector3 look;\n  std::copy(lookC.begin(), lookC.end(), look.begin());\n\n  // Projecting to mm focal plane\n  look = m_camera->FocalLength() * (look / look[2]);\n  m_distortmap->SetUndistortedFocalPlane(look[0], look[1]);\n  m_focalmap->SetFocalPlane(m_distortmap->FocalPlaneX(),\n                            m_distortmap->FocalPlaneY());\n  result_type result(1);\n  // Not exactly sure about lineoffset .. but ISIS does it\n  result[0] = m_focalmap->DetectorLineOffset() - m_focalmap->DetectorLine();\n  return result;\n}\n\n// The secant method for solving the equation model(t) = 0 with given\n// absolute tolerance. Do not use a smaller tol than 1e-8, as this can\n// result in numerical instability for some high focal length and a junk\n// solution. This method does implement some safeguards against divergence. \n// It is assumed that the model function takes as input and returns the output\n// as a Vector<double> of size 1.\n// Thoroughly validated with MOC, CTX, LRO NAC. Old LMA approach is commented\n// out.\n// TODO(oalexan1): Move this to a more general place and test with Earth cameras.\nnamespace asp {\ntemplate<class ModelT>\ndouble secant_method(ModelT const& model, double start, double tol) {\n      \n  Vector<double> t0(1), t1(1);\n  double dt = 0.1;\n  t0[0] = start;\n  t1[0] = start + dt;\n  Vector<double> f0 = model(t0);\n  Vector<double> f1 = model(t1);\n\n  // Do at most 10 iterations. This method usually converges in 5 iterations\n  // or less. If it does not converge, it is probably because there is a problem.\n  for (int i = 0; i < 10; i++) {\n    \n    // If the function is close to 0, or function values are too small,\n    // stop iterating, as bad things will happen.\n    if (std::abs(f1[0]) < tol || std::abs(f1[0] - f0[0]) < tol)\n      break;\n\n    // If the function is close to 0, but stops getting closer to it, that is\n    // a sign of divergence, most likely due to numerical precision issues.\n    // Stop iterating. Note how we use here a larger value than tol.\n    if (std::abs(f0[0]) < std::abs(f1[0]) && std::abs(f0[0]) < 100 * tol) {\n      f1 = f0;\n      t1 = t0;\n      break;\n    }\n    \n    Vector<double> t2(1);\n    t2[0] = t1[0] - f1[0]*(t1[0]-t0[0])/(f1[0]-f0[0]);\n    t0 = t1;\n    t1 = t2;\n    f0 = f1;\n    f1 = model(t1);\n  }\n\n  return t1[0];\n}\n} // end namespace asp\n\nVector2\nIsisInterfaceLineScan::point_to_pixel(Vector3 const& point) const {\n\n  // First seed LMA with an ephemeris time in the middle of the image\n  // TODO(oalexan1): Can create an affine function that fits a \n  // ground location to best-guess ephemeris time. This is how\n  // it is done for CSM. This may save a few iterations.\n  double middle = lines() / 2;\n  m_detectmap->SetParent(1, m_alphacube.AlphaLine(middle));\n  double start_e = m_camera->time().Et();\n\n  // Build LMA\n  EphemerisLMA model(point, m_camera.get(), m_distortmap, m_focalmap);\n  int status;\n  Vector<double> objective(1), start(1);\n  start[0] = start_e;\n  objective[0] = 0;\n\n  // Use the secant method to find the ideal time  \n  Vector<double> solution_e(1);\n  double tol = 1e-8; // Do not use a smaller tol to avoid numerical instability\n  solution_e[0] = asp::secant_method(model, start[0], tol);\n\n  // Old approach, based on LMA. About 2.2-2.6 times slower than secant method.\n  // solution_e = math::levenberg_marquardt(model, start, objective, status);\n  // // Make sure we found ideal time\n  // VW_ASSERT(status > 0, vw::camera::PointToPixelErr()\n  //           << \" Unable to project point into ISIS linescan camera \");\n\n  // Converting now to pixel\n  m_camera->setTime(Isis::iTime(solution_e[0]));\n\n  // Working out pointing\n  m_camera->instrumentPosition(&m_center[0]);\n  m_center *= 1000;\n  Vector3 look = normalize(point-m_center);\n\n  // Calculating rotation to camera frame\n  std::vector<double> rot_inst = m_camera->instrumentRotation()->Matrix();\n  std::vector<double> rot_body = m_camera->bodyRotation()->Matrix();\n  MatrixProxy<double,3,3> R_inst(&(rot_inst[0]));\n  MatrixProxy<double,3,3> R_body(&(rot_body[0]));\n  m_pose = Quat(R_body*transpose(R_inst));\n\n  look = inverse(m_pose).rotate(look);\n  look = m_camera->FocalLength() * (look / look[2]);\n  m_distortmap->SetUndistortedFocalPlane(look[0], look[1]);\n  m_focalmap->SetFocalPlane(m_distortmap->FocalPlaneX(),\n                            m_distortmap->FocalPlaneY());\n  m_detectmap->SetDetector(m_focalmap->DetectorSample(),\n                           m_focalmap->DetectorLine());\n  Vector2 pixel(m_detectmap->ParentSample(),\n                m_detectmap->ParentLine());\n  pixel[0] = m_alphacube.BetaSample(pixel[0]);\n  pixel[1] = m_alphacube.BetaLine(pixel[1]);\n  SetTime(pixel, false);\n\n  pixel -= Vector2(1,1);\n  return pixel;\n}\n\nVector3\nIsisInterfaceLineScan::pixel_to_vector(Vector2 const& pix) const {\n  Vector2 px = pix + Vector2(1,1);\n  SetTime(px, true);\n\n  // Projecting to get look direction\n  Vector3 result;\n  m_focalmap->SetDetector(m_detectmap->DetectorSample(),\n                          m_detectmap->DetectorLine());\n  m_distortmap->SetFocalPlane(m_focalmap->FocalPlaneX(),\n                              m_focalmap->FocalPlaneY());\n  result[0] = m_distortmap->UndistortedFocalPlaneX();\n  result[1] = m_distortmap->UndistortedFocalPlaneY();\n  result[2] = m_distortmap->UndistortedFocalPlaneZ();\n  result = normalize(result);\n  result = m_pose.rotate(result);\n  return result;\n}\n\nVector3\nIsisInterfaceLineScan::camera_center(Vector2 const& pix) const {\n  Vector2 px = pix + Vector2(1,1);\n  SetTime(px, true);\n  return m_center;\n}\n\nQuat\nIsisInterfaceLineScan::camera_pose(Vector2 const& pix) const {\n  Vector2 px = pix + Vector2(1,1);\n  SetTime(px, true);\n  return m_pose;\n}\n"
  },
  {
    "path": "src/asp/IsisIO/IsisInterfaceLineScan.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n/// \\file IsisInterfaceLineScan.h\n///\n/// Line Scan Camera Interface with ISIS\n///\n#ifndef __ASP_ISIS_INTERFACE_LINESCAN_H__\n#define __ASP_ISIS_INTERFACE_LINESCAN_H__\n\n#include <vw/Math/Vector.h>\n#include <vw/Math/Quaternion.h>\n#include <asp/IsisIO/IsisInterface.h>\n\n#include <string>\n\n#include <AlphaCube.h>\n\nnamespace Isis {\n  class CameraDetectorMap;\n  class CameraDistortionMap;\n  class CameraFocalPlaneMap;\n}\n\nnamespace asp {\nnamespace isis {\n\n  class IsisInterfaceLineScan : public IsisInterface {\n\n  public:\n    IsisInterfaceLineScan(std::string const& file);\n\n    virtual ~IsisInterfaceLineScan() {}\n\n    virtual std::string type()  { return \"LineScan\"; }\n\n    // Standard Methods\n    //-------------------------------------------------\n\n    virtual vw::Vector2 point_to_pixel (vw::Vector3 const& point) const;\n    virtual vw::Vector3 pixel_to_vector(vw::Vector2 const& pix  ) const;\n    virtual vw::Vector3 camera_center  (vw::Vector2 const& pix = vw::Vector2(1,1)) const;\n    virtual vw::Quat    camera_pose    (vw::Vector2 const& pix = vw::Vector2(1,1)) const;\n\n  protected:\n\n    // Custom Variables\n    Isis::CameraDistortionMap *m_distortmap;\n    Isis::CameraFocalPlaneMap *m_focalmap;\n    Isis::CameraDetectorMap   *m_detectmap;\n    mutable Isis::AlphaCube    m_alphacube; // Doesn't use const\n\n  private:\n\n    // Custom Functions\n    mutable vw::Vector2 m_c_location;\n    mutable vw::Vector3 m_center;\n    mutable vw::Quat    m_pose;\n    void SetTime(vw::Vector2 const& px, bool calc_pose = false) const;\n  };\n\n}}\n\n#endif//__ASP_ISIS_INTERFACE_LINESCAN_H__\n"
  },
  {
    "path": "src/asp/IsisIO/IsisInterfaceMapFrame.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n// ASP\n#include <asp/IsisIO/IsisInterfaceMapFrame.h>\n#include <vw/Cartography/PointImageManipulation.h>\n\n// ISIS\n#include <ProjectionFactory.h>\n#include <Projection.h>\n#include <CameraGroundMap.h>\n#include <CameraDistortionMap.h>\n#include <Distance.h>\n#include <SurfacePoint.h>\n#include <Latitude.h>\n#include <Longitude.h>\n\nusing namespace vw;\nusing namespace asp;\nusing namespace asp::isis;\n\n// Constructor\nIsisInterfaceMapFrame::IsisInterfaceMapFrame(std::string const& filename) :\n  IsisInterface(filename) {// , m_projection(Isis::ProjectionFactory::CreateFromCube(*m_label)) {\n\n  Isis::TProjection* tempProj\n    = (Isis::TProjection*)Isis::ProjectionFactory::CreateFromCube(*m_label);\n  m_projection.reset(tempProj);\n\n  // Gutting Isis::Camera\n  m_groundmap  = m_camera->GroundMap();\n  m_distortmap = m_camera->DistortionMap();\n\n  // TODO(oalexan1): Look at these radii, see if perhaps one can get the datum this way\n  m_camera->radii(m_radii);\n\n  // Calculate the camera center (just once)\n  m_camera->instrumentPosition(&m_center[0]);\n  m_center *= 1000.0; // convert to meters\n\n  // Calculating the camera pose (just once)\n  std::vector<double> rot_inst = m_camera->instrumentRotation()->Matrix();\n  std::vector<double> rot_body = m_camera->bodyRotation()->Matrix();\n  MatrixProxy<double,3,3> R_inst(&(rot_inst[0]));\n  MatrixProxy<double,3,3> R_body(&(rot_body[0]));\n  m_pose = Quat(R_body*transpose(R_inst));\n}\n\nVector2 IsisInterfaceMapFrame::point_to_pixel(Vector3 const& point) const {\n  // TODO(oalexan1): It looks that the code below assumes the datum to be spherical.\n  Vector3 lon_lat_radius = cartography::xyz_to_lon_lat_radius_estimate(point); // TODO: INACCURATE!!!\n  if (lon_lat_radius[0] < 0)\n    lon_lat_radius[0] += 360.0;\n\n  // Project into the camera\n  m_groundmap->SetGround(\n    Isis::SurfacePoint(Isis::Latitude (lon_lat_radius[1], Isis::Angle::Degrees  ),\n                        Isis::Longitude(lon_lat_radius[0], Isis::Angle::Degrees  ),\n                        Isis::Distance (lon_lat_radius[2], Isis::Distance::Meters)));\n  m_distortmap->SetUndistortedFocalPlane(m_groundmap->FocalPlaneX(),\n                                          m_groundmap->FocalPlaneY());\n\n  // Projection back out on to DEM\n  m_groundmap->SetFocalPlane(m_distortmap->UndistortedFocalPlaneX(),\n                              m_distortmap->UndistortedFocalPlaneY(),\n                              m_distortmap->UndistortedFocalPlaneZ());\n\n  m_projection->SetGround(m_camera->UniversalLatitude(),\n                           m_camera->UniversalLongitude());\n  return Vector2(m_projection->WorldX() - 1, m_projection->WorldY() - 1);\n}\n\nVector3 IsisInterfaceMapFrame::pixel_to_vector(Vector2 const& px) const {\n  m_projection->SetWorld(px[0] + 1, px[1] + 1);\n\n  // Longitude and Latitude are planetocentric. This is why\n  // lon_lat_radius_to_xyz is the apprioprate choice.\n  Vector3 lon_lat_radius(m_projection->UniversalLongitude(),\n                          m_projection->UniversalLatitude(),\n                          m_camera->LocalRadius(m_projection->UniversalLatitude(),\n                                                 m_projection->UniversalLongitude()).meters());\n\n  Vector3 point = cartography::lon_lat_radius_to_xyz_estimate(lon_lat_radius); // TODO: INACCURATE!!!\n  return normalize(point-m_center);\n}\n\nVector3 IsisInterfaceMapFrame::camera_center(Vector2 const& /*pix*/) const {\n  return m_center;\n}\n\nQuat IsisInterfaceMapFrame::camera_pose(Vector2 const& /*pix*/) const {\n  return m_pose;\n}\n"
  },
  {
    "path": "src/asp/IsisIO/IsisInterfaceMapFrame.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n/// \\file IsisInterfaceMapFrame.h\n///\n/// Map Projected Frame Camera Interface with ISIS\n///\n#ifndef __ASP_ISIS_INTERFACE_MAP_FRAME_H__\n#define __ASP_ISIS_INTERFACE_MAP_FRAME_H__\n\n#include <TProjection.h>\n#include <vw/Math/Vector.h>\n#include <asp/IsisIO/IsisInterface.h>\n#include <memory>\n\n#include <string>\n\n// Isis forward declaration\nnamespace Isis {\n  class CameraGroundMap;\n  class CameraDistortionMap;\n  class Projection;\n}\n#include <Distance.h>\n\nnamespace asp {\nnamespace isis {\n\n  /// ??\n  class IsisInterfaceMapFrame : public IsisInterface {\n\n  public:\n    IsisInterfaceMapFrame( std::string const& file );\n\n    virtual std::string type()  { return \"MapFrame\"; }\n\n    // Standard methods\n    //-------------------------------------------------\n\n    virtual vw::Vector2 point_to_pixel ( vw::Vector3 const& point ) const; // TODO: Inaccurate!  Needs DATUM!\n    virtual vw::Vector3 pixel_to_vector( vw::Vector2 const& pix   ) const;\n    virtual vw::Vector3 camera_center  ( vw::Vector2 const& pix = vw::Vector2() ) const;\n    virtual vw::Quat    camera_pose    ( vw::Vector2 const& pix = vw::Vector2() ) const;\n\n  protected:\n\n    // Custom variables\n    std::unique_ptr<Isis::TProjection> m_projection;\n    Isis::CameraGroundMap     *m_groundmap;\n    Isis::CameraDistortionMap *m_distortmap;\n\n    vw::Vector3    m_center;\n    vw::Quat       m_pose;\n    Isis::Distance m_radii[3];\n  };\n\n}}\n\n#endif//__ASP_ISIS_INTERFACE_MAP_FRAME_H__\n"
  },
  {
    "path": "src/asp/IsisIO/IsisInterfaceMapLineScan.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n#include <vw/Math/Matrix.h>\n#include <vw/Math/Quaternion.h>\n#include <vw/Math/Vector.h>\n#include <vw/Math/LevenbergMarquardt.h>\n#include <vw/Camera/CameraModel.h>\n#include <asp/IsisIO/IsisInterfaceMapLineScan.h>\n\n#include <algorithm>\n#include <limits>\n#include <string>\n#include <vector>\n\n#include <Camera.h>\n#include <CameraDistortionMap.h>\n#include <CameraFocalPlaneMap.h>\n#include <CameraGroundMap.h>\n#include <Latitude.h>\n#include <Longitude.h>\n#include <Projection.h>\n#include <ProjectionFactory.h>\n#include <Sensor.h>\n#include <SpiceRotation.h>\n#include <iTime.h>\n\n\nusing namespace vw;\nusing namespace asp;\nusing namespace asp::isis;\n\n// Constructor\nIsisInterfaceMapLineScan::IsisInterfaceMapLineScan(std::string const& filename) :\n  IsisInterface(filename){\n  //,m_projection(Isis::ProjectionFactory::CreateFromCube(*m_label)) {\n\n  Isis::TProjection* tempProj\n    = (Isis::TProjection*)Isis::ProjectionFactory::CreateFromCube(*m_label);\n  m_projection.reset(tempProj);\n\n  // Gutting Isis::Camera\n  m_distortmap = m_camera->DistortionMap();\n  m_groundmap = m_camera->GroundMap();\n  m_focalmap = m_camera->FocalPlaneMap();\n  m_cache_px[0] = m_cache_px[1] = std::numeric_limits<double>::quiet_NaN();\n}\n\n// Custom Functions\nclass EphemerisLMA : public vw::math::LeastSquaresModelBase<EphemerisLMA> {\n  vw::Vector3 m_point;\n  Isis::Camera* m_camera;\n  Isis::CameraDistortionMap *m_distortmap;\n  Isis::CameraFocalPlaneMap *m_focalmap;\npublic:\n  typedef vw::Vector<double> result_type; // Back project result\n      typedef vw::Vector<double> domain_type; // Ephemeris time\n  typedef vw::Matrix<double> jacobian_type;\n\n  inline EphemerisLMA(vw::Vector3 const& point,\n                       Isis::Camera* camera,\n                       Isis::CameraDistortionMap* distortmap,\n                       Isis::CameraFocalPlaneMap* focalmap):\n    m_point(point), m_camera(camera), m_distortmap(distortmap), m_focalmap(focalmap) {}\n\n  inline result_type operator()(domain_type const& x) const;\n};\n\n\n// LMA for projecting point to linescan camera\nEphemerisLMA::result_type EphemerisLMA::operator()(EphemerisLMA::domain_type const& x) const {\n\n  // Setting Ephemeris Time\n  m_camera->setTime(Isis::iTime(x[0]));\n\n  // Calculating the look direction in camera frame\n  Vector3 instru;\n  m_camera->instrumentPosition(&instru[0]);\n  instru *= 1000;  // Spice gives in km\n  Vector3 lookB = normalize(m_point - instru);\n  std::vector<double> lookB_copy(3);\n  std::copy(lookB.begin(),lookB.end(),lookB_copy.begin());\n  std::vector<double> lookJ = m_camera->bodyRotation()->J2000Vector(lookB_copy);\n  std::vector<double> lookC = m_camera->instrumentRotation()->ReferenceVector(lookJ);\n  Vector3 look;\n  std::copy(lookC.begin(),lookC.end(),look.begin());\n\n  // Projecting to mm focal plane\n  look = m_camera->FocalLength() * (look / look[2]);\n  m_distortmap->SetUndistortedFocalPlane(look[0], look[1]);\n  m_focalmap->SetFocalPlane(m_distortmap->FocalPlaneX(),\n                             m_distortmap->FocalPlaneY());\n  result_type result(1);\n  // Not exactly sure about lineoffset .. but ISIS does it\n  result[0] = m_focalmap->DetectorLineOffset() - m_focalmap->DetectorLine();\n\n  return result;\n}\n\nVector2 IsisInterfaceMapLineScan::point_to_pixel(Vector3 const& point) const {\n\n  // First seed LMA with an ephemeris time in the middle of the image\n  double middle_et = m_camera->cacheStartTime().Et()\n    + (m_camera->cacheEndTime().Et()-m_camera->cacheStartTime().Et())/2.0;\n\n  // Build LMA\n  EphemerisLMA model(point, m_camera.get(), m_distortmap, m_focalmap);\n  int status;\n  Vector<double> objective(1), start(1);\n  start[0] = middle_et;\n  Vector<double> solution_e = math::levenberg_marquardt(model, start, objective, status);\n\n  // Make sure we found ideal time\n  VW_ASSERT(status > 0,\n            camera::PointToPixelErr()\n            << \" Unable to project point into ISIS map linescan camera.\");\n\n  // Setting to camera time to solution\n  m_camera->setTime(Isis::iTime(solution_e[0]));\n\n  // Working out pointing\n  Vector3 center;\n  m_camera->instrumentPosition(&center[0]);\n  Vector3 look = normalize(point-1000*center);\n\n  // Calculating rotation to camera frame\n  std::vector<double> rot_inst = m_camera->instrumentRotation()->Matrix();\n  std::vector<double> rot_body = m_camera->bodyRotation()->Matrix();\n  MatrixProxy<double,3,3> R_inst(&(rot_inst[0]));\n  MatrixProxy<double,3,3> R_body(&(rot_body[0]));\n  look = transpose(R_body*transpose(R_inst))*look;\n  look = m_camera->FocalLength() * (look / look[2]);\n\n  // Projecting back on to ground to find out time\n  m_groundmap->SetFocalPlane(look[0],\n                              look[1],\n                              look[2]);\n\n  m_projection->SetGround(m_camera->UniversalLatitude(),\n                           m_camera->UniversalLongitude());\n  m_cache_px = Vector2(m_projection->WorldX()-1,\n                        m_projection->WorldY()-1);\n  return m_cache_px;\n}\n\nVector3 IsisInterfaceMapLineScan::camera_center(Vector2 const& px) const {\n  if (px != m_cache_px) {\n    m_cache_px = px;\n    if (!m_projection->SetWorld(px[0]+1,\n                                 px[1]+1))\n      vw_throw(camera::PixelToRayErr() << \"Failed to SetWorld.\");\n    if (!m_groundmap->SetGround(Isis::Latitude(m_projection->UniversalLatitude(),\n                                               Isis::Angle::Degrees),\n                                Isis::Longitude(m_projection->UniversalLongitude(),\n                                                Isis::Angle::Degrees)))\n      vw_throw(camera::PixelToRayErr() << \"Failed to SetGround.\");\n  }\n  Vector3 position;\n  m_camera->instrumentPosition(&position[0]);\n  return position * 1e3;\n}\n\nVector3 IsisInterfaceMapLineScan::pixel_to_vector(Vector2 const& px) const {\n  Vector3 sB = camera_center(px);\n  Vector3 p_pB;\n  m_camera->Sensor::Coordinate(&p_pB[0]);\n  return normalize(p_pB*1000 - sB);\n}\n\nQuat IsisInterfaceMapLineScan::camera_pose(Vector2 const& px) const {\n  camera_center(px);\n  std::vector<double> rot_inst = m_camera->instrumentRotation()->Matrix();\n  std::vector<double> rot_body = m_camera->bodyRotation()->Matrix();\n  MatrixProxy<double,3,3> R_inst(&(rot_inst[0]));\n  MatrixProxy<double,3,3> R_body(&(rot_body[0]));\n  return Quat(R_body*transpose(R_inst));\n}\n"
  },
  {
    "path": "src/asp/IsisIO/IsisInterfaceMapLineScan.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n/// \\file IsisInterfaceMapLineScane.h\n///\n/// Map Projected Line Scan Camera Interface with ISIS\n///\n#ifndef __ASP_ISIS_INTERFACE_MAP_LINESCAN_H__\n#define __ASP_ISIS_INTERFACE_MAP_LINESCAN_H__\n\n// ASP & VW\n#include <asp/IsisIO/IsisInterface.h>\n#include <memory>\n\n// Isis\n#include <TProjection.h>\n#include <CameraDistortionMap.h>\n#include <CameraGroundMap.h>\n#include <CameraFocalPlaneMap.h>\n\nnamespace asp {\nnamespace isis {\n\n  class IsisInterfaceMapLineScan : public IsisInterface {\n\n  public:\n    IsisInterfaceMapLineScan( std::string const& file );\n\n    virtual std::string type()  { return \"MapLineScan\"; }\n\n    // Standard Methods\n    //-------------------------------------------------\n\n    virtual vw::Vector2 point_to_pixel ( vw::Vector3 const& point ) const;\n    virtual vw::Vector3 pixel_to_vector( vw::Vector2 const& pix   ) const;\n    virtual vw::Vector3 camera_center  ( vw::Vector2 const& pix = vw::Vector2(1,1) ) const;\n    virtual vw::Quat    camera_pose    ( vw::Vector2 const& pix = vw::Vector2(1,1) ) const;\n\n  protected:\n\n    // Custom Variables\n    mutable vw::Vector2 m_cache_px;\n    std::unique_ptr<Isis::TProjection> m_projection;\n    Isis::CameraDistortionMap *m_distortmap;\n    Isis::CameraGroundMap     *m_groundmap;\n    Isis::CameraFocalPlaneMap *m_focalmap;\n\n  };\n\n}}\n\n#endif//__ASP_ISIS_INTERFACE_MAP_LINESCAN_H__\n"
  },
  {
    "path": "src/asp/IsisIO/IsisInterfaceSAR.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <vw/Math/Matrix.h>\n#include <vw/Camera/CameraModel.h>\n#include <vw/Core/Exception.h>\n\n#include <asp/IsisIO/IsisInterfaceSAR.h>\n#include <vw/Cartography/PointImageManipulation.h>\n\n// ISIS \n#include <Camera.h>\n#include <CameraDetectorMap.h>\n#include <CameraDistortionMap.h>\n#include <CameraGroundMap.h>\n#include <CameraFocalPlaneMap.h>\n#include <Distance.h>\n#include <iTime.h>\n#include <Target.h>\n#include <SurfacePoint.h>\n#include <Latitude.h>\n#include <Longitude.h>\n#include <Angle.h>\n\n#include <algorithm>\n#include <vector>\n\nusing namespace vw;\nusing namespace asp;\nusing namespace asp::isis;\n\n// Constructor\nIsisInterfaceSAR::IsisInterfaceSAR(std::string const& filename):\n  IsisInterface(filename), m_alphacube(*m_cube) {\n\n  // Gutting Isis::Camera\n  m_groundmap  = m_camera->GroundMap();\n  m_distortmap = m_camera->DistortionMap();\n  m_focalmap   = m_camera->FocalPlaneMap();\n  m_detectmap  = m_camera->DetectorMap();\n\n  // Set the shape to be the ellipsoid.  This will ensure that ground\n  // points will be on the ellipsoid, which is needed in\n  // pixel_to_vector().\n  m_camera->IgnoreElevationModel(true);\n}\n\nVector2 IsisInterfaceSAR::point_to_pixel(Vector3 const& point) const {\n\n  // TODO(oalexan1): It looks that the code below assumes the datum to be spherical.\n  Vector3 lon_lat_radius = cartography::xyz_to_lon_lat_radius_estimate(point); // TODO: INACCURATE!!!\n  if (lon_lat_radius[0] < 0)\n    lon_lat_radius[0] += 360.0;\n\n  // Project into the camera. The ground was set to be the ellipsoid in the constructor.\n  if (!m_groundmap->SetGround\n      (Isis::SurfacePoint(Isis::Latitude (lon_lat_radius[1], Isis::Angle::Degrees  ),\n                          Isis::Longitude(lon_lat_radius[0], Isis::Angle::Degrees  ),\n                          Isis::Distance (lon_lat_radius[2], Isis::Distance::Meters))))\n    vw_throw(camera::PixelToRayErr() << \"Failed in SetGround().\");\n      \n  m_distortmap->SetUndistortedFocalPlane(m_groundmap->FocalPlaneX(), m_groundmap->FocalPlaneY());\n\n  // ISIS pixels start with 1.\n  return Vector2(m_camera->Sample() - 1.0, m_camera->Line() - 1.0);\n}\n\n// TODO(oalexan1): There should be a better way of doing this\nVector3 IsisInterfaceSAR::pixel_to_vector(Vector2 const& pix) const {\n\n  // Find the camera center\n  Vector3 cam_ctr = camera_center(pix);\n\n  // Find the intersection with the ground. The ground is defined\n  // in the constructor to be the ellipsoid. The camera center also\n  // sets the image pixel, so the intersection with ground is computed\n  // already, need to just fetch it.\n  Vector3 llh(m_camera->UniversalLongitude(), m_camera->UniversalLatitude(), 0.0);\n  Vector3 ground_pt = m_datum.geodetic_to_cartesian(llh);\n\n  // The desired vector is the normalized direction from the camera\n  // center to the ground\n  Vector3 dir = ground_pt - cam_ctr;\n  return dir / norm_2(dir);\n}\n\nVector3 IsisInterfaceSAR::camera_center(Vector2 const& pix) const {\n\n  Vector2 isis_pix = pix + Vector2(1,1);\n\n  if (!m_camera->SetImage(isis_pix[0], isis_pix[1]))\n    vw_throw(camera::PixelToRayErr() << \"Failed in SetImage().\");\n\n  vw::Vector3 center;\n  m_camera->instrumentPosition(&center[0]);\n  center *= 1000.0; // km to meters\n  \n  return center;\n}\n\nQuat IsisInterfaceSAR::camera_pose(Vector2 const& pix) const {\n  vw_throw(NoImplErr() << \"camera_pose() not implemented for ISIS SAR cameras.\");\n\n  return vw::Quat();\n}\n"
  },
  {
    "path": "src/asp/IsisIO/IsisInterfaceSAR.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file IsisInterfaceSAR.h\n///\n/// ISIS SAR Camera Interface. Tested with MiniRF.\n///\n#ifndef __ASP_ISIS_INTERFACE_SAR_H__\n#define __ASP_ISIS_INTERFACE_SAR_H__\n\n#include <vw/Math/Vector.h>\n#include <vw/Math/Quaternion.h>\n#include <vw/Cartography/Datum.h>\n#include <asp/IsisIO/IsisInterface.h>\n\n#include <string>\n\n#include <AlphaCube.h>\n\nnamespace Isis {\n  class CameraDetectorMap;\n  class CameraGroundMap;\n  class CameraDistortionMap;\n  class CameraFocalPlaneMap;\n}\n\nnamespace asp {\nnamespace isis {\n\n  class IsisInterfaceSAR : public IsisInterface {\n\n  public:\n    IsisInterfaceSAR(std::string const& file);\n\n    virtual ~IsisInterfaceSAR() {}\n\n    virtual std::string type()  { return \"SAR\"; }\n\n    // Standard methods\n    //-------------------------------------------------\n\n    virtual vw::Vector2 point_to_pixel (vw::Vector3 const& point) const;\n    virtual vw::Vector3 pixel_to_vector(vw::Vector2 const& pix)   const;\n    virtual vw::Vector3 camera_center  (vw::Vector2 const& pix)   const;\n    virtual vw::Quat    camera_pose    (vw::Vector2 const& pix)   const;\n\n  protected:\n\n    // Custom variables\n    Isis::CameraDistortionMap *m_distortmap;\n    Isis::CameraFocalPlaneMap *m_focalmap;\n    Isis::CameraDetectorMap   *m_detectmap;\n    mutable Isis::AlphaCube    m_alphacube; // Doesn't use const\n\n    Isis::CameraGroundMap     *m_groundmap;\n  };\n\n}}\n\n#endif//__ASP_ISIS_INTERFACE_SAR_H__\n"
  },
  {
    "path": "src/asp/IsisIO/IsisSpecialPixels.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/asp_config.h> // defines ASP_HAVE_PKG_ISIS\n#if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1\n\n#include <asp/IsisIO/IsisSpecialPixels.h>\n#include <asp/IsisIO/DiskImageResourceIsis.h>\n\n#include <vw/Core/Functors.h>\n#include <vw/Image/MaskViews.h>\n#include <vw/Image/PerPixelViews.h>\n#include <vw/Image/PixelTypes.h>\n#include <vw/Image/Filter.h>\n\n#include <cmath>\n#include <limits>\n\n// Isis headers\n#include <isis/SpecialPixel.h>\n\nnamespace asp {\n\n//  IsisSpecialPixelFunc\n//\n/// Replace ISIS missing data values with a pixel value of your choice.\ntemplate <class PixelT>\nclass IsisSpecialPixelFunc: public vw::UnaryReturnSameType {\n  PixelT m_replacement_low;\n  PixelT m_replacement_high;\n  PixelT m_replacement_null;\n\n  // Private\n  IsisSpecialPixelFunc(): m_replacement_low(0), m_replacement_high(0), m_replacement_null(0) {}\n\npublic:\n  IsisSpecialPixelFunc(PixelT const& pix_l, PixelT const& pix_h, PixelT const& pix_n):\n    m_replacement_low(pix_l), m_replacement_high(pix_h), m_replacement_null(pix_n) {}\n\n  // Helper to determine special across different channel types\n  template <typename ChannelT, typename T = void>\n  struct Helper {\n    static inline bool IsSpecial(ChannelT const& arg) { return false; }\n    static inline bool IsHighPixel(ChannelT const& arg) { return false; }\n    static inline bool IsNull(ChannelT const& arg) { return false; }\n  };\n  template<typename T> struct Helper<double, T> {\n    static inline bool IsSpecial(double const& arg) {\n      return arg < Isis::VALID_MIN8;\n    }\n    static inline bool IsHighPixel(double const& arg) {\n      return arg == Isis::HIGH_INSTR_SAT8 || arg == Isis::HIGH_REPR_SAT8;\n    }\n    static inline bool IsNull(double const& arg) {\n      return arg == Isis::NULL8;\n    }\n  };\n  template<typename T> struct Helper<float, T> {\n    static inline bool IsSpecial(float const& arg) {\n      return arg < Isis::VALID_MIN4;\n    }\n    static inline bool IsHighPixel(float const& arg) {\n      return arg == Isis::HIGH_INSTR_SAT4 || arg == Isis::HIGH_REPR_SAT4;\n    }\n    static inline bool IsNull(float const& arg) {\n      return arg == Isis::NULL4;\n    }\n  };\n  template<typename T> struct Helper<short, T>{\n    static inline bool IsSpecial(short const& arg) {\n      return arg < Isis::VALID_MIN2;\n    }\n    static inline bool IsHighPixel(short const& arg) {\n      return arg == Isis::HIGH_INSTR_SAT2 || arg == Isis::HIGH_REPR_SAT2;\n    }\n    static inline bool IsNull(short const& arg) {\n      return arg == Isis::NULL2;\n    }\n  };\n  template<typename T> struct Helper<unsigned short, T> {\n    static inline bool IsSpecial(unsigned short const& arg) {\n      return arg < Isis::VALID_MINU2 || arg > Isis::VALID_MAXU2;\n    }\n    static inline bool IsHighPixel(unsigned short const& arg) {\n      return arg == Isis::HIGH_INSTR_SATU2 || arg == Isis::HIGH_REPR_SATU2;\n    }\n    static inline bool IsNull(unsigned short const& arg) {\n      return arg == Isis::NULLU2;\n    }\n  };\n  template<typename T> struct Helper<unsigned char, T> {\n    static inline bool IsSpecial(unsigned char const& arg) {\n      return arg < Isis::VALID_MIN1 || arg > Isis::VALID_MAX1;\n    }\n    static inline bool IsHighPixel(unsigned char const& arg) {\n      return arg == Isis::HIGH_INSTR_SAT1 || arg == Isis::HIGH_REPR_SAT1;\n    }\n    static inline bool IsNull(unsigned char const& arg) {\n      return arg == Isis::NULL1;\n    }\n  };\n\n  PixelT operator() (PixelT const& pix) const {\n    typedef typename vw::CompoundChannelType<PixelT>::type channel_type;\n    typedef Helper<channel_type, void> help;\n    for (size_t n = 0; n < vw::CompoundNumChannels<PixelT>::value; ++n) {\n      if (help::IsSpecial(vw::compound_select_channel<const channel_type&>(pix,n))) {\n        if (help::IsHighPixel(vw::compound_select_channel<const channel_type&>(pix,n)))\n          return m_replacement_high;\n        else if (help::IsNull(vw::compound_select_channel<const channel_type&>(pix,n)))\n          return m_replacement_null;\n        else\n          return m_replacement_low;\n      }\n    }\n    return pix;\n  }\n};\n\n// Replace ISIS special pixel values with given replacement values.\n// Specialize this only for float pixels, as that's all that is needed.\nvw::ImageViewRef<float>\nremoveIsisSpecialPixels(vw::ImageViewRef<float> const& image,\n                        float r_low, float r_high, float r_null) {\n  auto obj = IsisSpecialPixelFunc<float>(r_low, r_high, r_null);\n  return vw::per_pixel_filter(image.impl(), obj);\n}\n\n// Adjust a masked image to handle ISIS special pixels\nvoid adjustIsisImage(std::string const& input_file,\n                     float nodata_value,\n                     vw::ImageViewRef<vw::PixelMask<float>> & masked_image) {\n\n  boost::shared_ptr<vw::DiskImageResourceIsis> isis_rsrc(new vw::DiskImageResourceIsis(input_file));\n  float isis_lo = isis_rsrc->valid_minimum();\n  float isis_hi = isis_rsrc->valid_maximum();\n\n  // Force the low value to be greater than the nodata value\n  if (!std::isnan(nodata_value) && nodata_value >= isis_lo) {\n    isis_lo = std::nextafter(nodata_value, std::numeric_limits<float>::max());\n    if (isis_hi < isis_lo)\n      isis_hi = isis_lo;\n  }\n\n  vw::ImageViewRef<float> processed_image = vw::apply_mask(masked_image, isis_lo);\n  // Invalidate pixels outside range\n  masked_image = vw::create_mask(processed_image, isis_lo, isis_hi);\n  processed_image = vw::apply_mask(masked_image, isis_lo);\n  // ISIS-aware removal of special pixels\n  processed_image = removeIsisSpecialPixels(processed_image, isis_lo, isis_hi, isis_lo);\n  masked_image = vw::create_mask(processed_image, isis_lo);\n}\n\n} // end namespace asp\n\n#endif  // ASP_HAVE_PKG_ISIS\n"
  },
  {
    "path": "src/asp/IsisIO/IsisSpecialPixels.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#ifndef __ASP_ISISIO_ISISSPECIALPIXELS_H__\n#define __ASP_ISISIO_ISISSPECIALPIXELS_H__\n\n#include <vw/Image/ImageViewRef.h>\n\nnamespace asp {\n\n// Adjust a masked image to handle ISIS special pixels. Reads valid min/max\n// from the ISIS file and removes special pixels from the image.\nvoid adjustIsisImage(std::string const& input_file,\n                     float nodata_value,\n                     vw::ImageViewRef<vw::PixelMask<float>> & masked_image);\n\n} // end namespace asp\n\n#endif//__ASP_ISISIO_ISISSPECIALPIXELS_H__\n"
  },
  {
    "path": "src/asp/IsisIO/PolyEquation.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <vw/Core/FundamentalTypes.h>\n#include <vw/Math/Vector.h>\n#include <asp/IsisIO/PolyEquation.h>\n\n#include <iomanip>\n#include <vector>\n#include <string>\n#include <algorithm>\n\n#include <boost/algorithm/string/split.hpp>\n#include <boost/algorithm/string/classification.hpp>\n\nusing namespace vw;\nusing namespace asp;\n\n// Constructors\n//---------------------------------------------\nPolyEquation::PolyEquation ( int order ) {\n  if ( order < 0 )\n    vw_throw( ArgumentErr() << \"PolyEquation: Polynomial order must be greater than zero.\" );\n  if ( order > 254 )\n    vw_throw( ArgumentErr() << \"PolyEquation: Polynomial order must be less than 255\" );\n  m_x_coeff.set_size( order + 1 );\n  m_y_coeff.set_size( order + 1 );\n  m_z_coeff.set_size( order + 1 );\n  for ( int i = 0; i < order+1; i++ )\n    m_x_coeff[i] = m_y_coeff[i] = m_z_coeff[i] = 0;\n  m_cached_time = -1;\n  m_time_offset = 0;\n  m_max_length = uint8(order)+1;\n}\nPolyEquation::PolyEquation( int order_x,\n                            int order_y,\n                            int order_z ) {\n  if ( order_x < 0 || order_y < 0 || order_z < 0 )\n    vw_throw( ArgumentErr() << \"PolyEquation: Polynomial order must be greater than zero.\" );\n  if ( order_x > 254 || order_y > 254 || order_z > 254 )\n    vw_throw( ArgumentErr() << \"PolyEquation: Polynomial order must be less than 255\" );\n  m_x_coeff.set_size(order_x+1);\n  m_y_coeff.set_size(order_y+1);\n  m_z_coeff.set_size(order_z+1);\n  for ( unsigned i = 0; i < m_x_coeff.size(); i++ )\n    m_x_coeff[i] = 0;\n  for ( unsigned i = 0; i < m_y_coeff.size(); i++ )\n    m_y_coeff[i] = 0;\n  for ( unsigned i = 0; i < m_z_coeff.size(); i++ )\n    m_z_coeff[i] = 0;\n  m_cached_time = -1;\n  m_time_offset = 0;\n  m_max_length = uint8( std::max( order_x, std::max( order_y, order_z ) ) ) + 1;\n}\n\n// Update\n//-----------------------------------------------\nvoid PolyEquation::update( double t ) {\n  m_cached_time = t;\n  double delta_t = t-m_time_offset;\n  Vector<double> powers( m_max_length );\n  powers[0] = 1;\n  for ( uint8 i = 1; i < m_max_length; i++ )\n    powers[i] = powers[i-1]*delta_t;\n  m_cached_output[0] = sum( elem_prod(m_x_coeff,\n                                      subvector(powers,0,m_x_coeff.size())) );\n  m_cached_output[1] = sum( elem_prod(m_y_coeff,\n                                      subvector(powers,0,m_y_coeff.size())) );\n  m_cached_output[2] = sum( elem_prod(m_z_coeff,\n                                      subvector(powers,0,m_z_coeff.size())) );\n}\n\n// FileIO\n//-----------------------------------------------\nvoid PolyEquation::write( std::ofstream& f ) {\n  for ( int i = 0; i < 3; i++ ) {\n    Vector<double>* pointer;\n    switch(i) {\n    case 0:\n      pointer = &m_x_coeff;\n      break;\n    case 1:\n      pointer = &m_y_coeff;\n      break;\n    default:\n    case 2:\n      pointer = &m_z_coeff;\n      break;\n    }\n\n    f << std::setprecision( 15 );\n    for ( unsigned j = 0; j < (*pointer).size(); j++ )\n      f << (*pointer)[j] << \" \";\n    f << \"\\n\";\n  }\n}\n\nvoid PolyEquation::read( std::ifstream& f ) {\n  std::string buffer;\n  std::vector<std::string> tokens;\n  m_cached_time = -1;\n  for ( int i = 0; i < 3; i++ ) {\n    buffer = \"\";\n    std::getline( f, buffer );\n    boost::split( tokens, buffer, boost::is_any_of(\" =\\n\") );\n\n    // Cleaning out any tokens that are just \"\"\n    for(std::vector<std::string>::iterator iter = tokens.begin();\n        iter != tokens.end(); ++iter )\n      if ( (*iter) == \"\" ) {\n        iter = tokens.erase(iter);\n        iter--;\n      }\n\n    Vector<double>* pointer;\n    switch(i) {\n    case 0:\n      pointer = &m_x_coeff;\n      break;\n    case 1:\n      pointer = &m_y_coeff;\n      break;\n    default:\n    case 2:\n      pointer = &m_z_coeff;\n      break;\n    }\n\n    pointer->set_size( tokens.size() );\n    for ( unsigned j = 0; j < tokens.size(); j++ )\n      (*pointer)[j] = atof( tokens[j].c_str() );\n\n  }\n}\n\n// Constant Access\n//-----------------------------------------------\ndouble& PolyEquation::operator[]( size_t n ) {\n  m_cached_time = -1;\n  if (n >= m_x_coeff.size() + m_y_coeff.size() + m_z_coeff.size())\n    vw_throw(ArgumentErr() << \"PolyEquation: invalid index.\");\n  if (n < m_x_coeff.size()) {\n    return m_x_coeff[n];\n  } else if (n < m_x_coeff.size() + m_y_coeff.size()) {\n    return m_y_coeff[n - m_x_coeff.size()];\n  } else {\n    return m_z_coeff[n - m_x_coeff.size() - m_y_coeff.size()];\n  }\n}\n"
  },
  {
    "path": "src/asp/IsisIO/PolyEquation.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n#ifndef __ASP_POLY_EQUATION__\n#define __ASP_POLY_EQUATION__\n\n#include <asp/IsisIO/BaseEquation.h>\n\nnamespace asp {\n\n  // Polynomial Equation\n  // .. is a vector equation described by an n'th order polynomial\n  class PolyEquation : public BaseEquation {\n    vw::Vector<double> m_x_coeff;\n    vw::Vector<double> m_y_coeff;\n    vw::Vector<double> m_z_coeff;\n    vw::uint8 m_max_length; // Maximum order + 1\n\n    void update ( double t );\n  public:\n    PolyEquation( int order = 0 );\n    PolyEquation( int, int, int );\n    PolyEquation(vw::Vector<double> const& x, vw::Vector<double> const& y,\n                 vw::Vector<double> const& z)\n        : m_x_coeff(x), m_y_coeff(y), m_z_coeff(z) {\n      m_cached_time = -1;\n      m_time_offset = 0;\n      if ( x.size() > 254 || y.size() > 254 || z.size() > 254 )\n        vw::vw_throw( vw::ArgumentErr() << \"PolyEquation: Polynomial order must be less than 255\" );\n      m_max_length = vw::uint8( std::max( x.size(),\n                                          std::max( y.size(), z.size() ) ) ) + 1;\n    }\n    std::string type() const {  return \"PolyEquation\"; }\n\n    size_t size() const { return m_x_coeff.size()+m_y_coeff.size()+m_z_coeff.size(); }\n    double& operator[]( size_t n );\n\n    void write( std::ofstream &f );\n    void read( std::ifstream &f );\n  };\n\n}\n\n#endif//__ASP_POLY_EQUATION__\n"
  },
  {
    "path": "src/asp/IsisIO/RPNEquation.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <vw/Core/Exception.h>\n#include <vw/Math/Vector.h>\n#include <asp/IsisIO/RPNEquation.h>\n\n#include <iomanip>\n#include <stack>\n#include <vector>\n\n#include <boost/algorithm/string/classification.hpp>\n#include <boost/algorithm/string/split.hpp>\n\nusing namespace vw;\nusing namespace asp;\n\n// Constructors\n//-----------------------------------------------------\nRPNEquation::RPNEquation() {\n  m_x_eq.clear();\n  m_x_consts.clear();\n  m_y_eq.clear();\n  m_y_consts.clear();\n  m_z_eq.clear();\n  m_z_consts.clear();\n  m_cached_time = -1;\n  m_time_offset = 0;\n}\nRPNEquation::RPNEquation( std::string const& x_eq,\n                          std::string const& y_eq,\n                          std::string const& z_eq ) {\n  string_to_eqn( x_eq, m_x_eq, m_x_consts );\n  string_to_eqn( y_eq, m_y_eq, m_y_consts );\n  string_to_eqn( z_eq, m_z_eq, m_z_consts );\n  m_cached_time = -1;\n  m_time_offset = 0;\n}\n\n// Update\n//-----------------------------------------------------\nvoid RPNEquation::update( double t ) {\n  m_cached_time = t;\n  double delta_t = t - m_time_offset;\n  m_cached_output[0] = evaluate( m_x_eq,\n                                 m_x_consts,\n                                 delta_t );\n  m_cached_output[1] = evaluate( m_y_eq,\n                                 m_y_consts,\n                                 delta_t );\n  m_cached_output[2] = evaluate( m_z_eq,\n                                 m_z_consts,\n                                 delta_t );\n}\nvoid RPNEquation::string_to_eqn( std::string const& str,\n                                 std::vector<std::string>& commands,\n                                 std::vector<double>& consts ) {\n  // Breaks a string into the equation format used internally\n  commands.clear();\n  consts.clear();\n  boost::split( commands, str, boost::is_any_of(\" =\"));\n\n  // Cleaning out any tokens that are just \"\"\n  for(std::vector<std::string>::iterator iter = commands.begin();\n      iter != commands.end(); ++iter ) {\n    if ( (*iter) == \"\" ) {\n      iter = commands.erase(iter);\n      iter--;\n    }\n  }\n\n  // Pulling out the numbers\n  for(std::vector<std::string>::iterator iter = commands.begin();\n      iter != commands.end(); ++iter ) {\n    if ( isdigit( (*iter)[(*iter).size()-1] ) ) {\n      consts.push_back( atof( iter->c_str() ) );\n      *iter = \"c\";\n    }\n  }\n}\n\ndouble RPNEquation::evaluate( std::vector<std::string> const& commands,\n                              std::vector<double>& consts,\n                              double t ) {\n  // Evaluates an equation in the internal format\n  if ( commands.empty() )\n    return 0;\n  int consts_index = 0;\n  std::stack<double> rpn_stack;\n  double buffer;\n  for ( std::vector<std::string>::const_iterator iter = commands.begin();\n        iter != commands.end(); ++iter ) {\n    if ( *iter == \"c\" ) {\n      rpn_stack.push( consts[consts_index] );\n      consts_index++;\n    } else if ( *iter == \"t\" ) {\n      rpn_stack.push( t );\n    } else if ( rpn_stack.size() < 1 ) {\n      vw_throw( IOErr() << \"Insufficient arguments for RPN command: \"\n                << *iter << \"\\n\" );\n    } else if ( *iter == \"sin\" ) {\n      buffer = sin( rpn_stack.top() );\n      rpn_stack.pop();\n      rpn_stack.push( buffer );\n    } else if ( *iter == \"cos\" ) {\n      buffer = cos( rpn_stack.top() );\n      rpn_stack.pop();\n      rpn_stack.push( buffer );\n    } else if ( *iter == \"tan\" ) {\n      buffer = tan( rpn_stack.top() );\n      rpn_stack.pop();\n      rpn_stack.push( buffer );\n    } else if ( *iter == \"abs\" ) {\n      buffer = fabs( rpn_stack.top() );\n      rpn_stack.pop();\n      rpn_stack.push( buffer );\n    } else if ( rpn_stack.size() < 2 ) {\n      vw_throw( IOErr() << \"Insufficient arguments for command: \"\n                << *iter << \"\\n\" );\n    } else if ( *iter == \"*\" ) {\n      buffer = rpn_stack.top();\n      rpn_stack.pop();\n      buffer *= rpn_stack.top();\n      rpn_stack.pop();\n      rpn_stack.push( buffer );\n    } else if ( *iter == \"/\" ) {\n      buffer = rpn_stack.top();\n      rpn_stack.pop();\n      buffer = rpn_stack.top() / buffer;\n      rpn_stack.pop();\n      rpn_stack.push( buffer );\n    } else if ( *iter == \"-\" ) {\n      buffer = rpn_stack.top();\n      rpn_stack.pop();\n      buffer = rpn_stack.top() - buffer;\n      rpn_stack.pop();\n      rpn_stack.push( buffer );\n    } else if ( *iter == \"+\" ) {\n      buffer = rpn_stack.top();\n      rpn_stack.pop();\n      buffer += rpn_stack.top();\n      rpn_stack.pop();\n      rpn_stack.push( buffer );\n    } else if ( *iter == \"^\" ) {\n      buffer = rpn_stack.top();\n      rpn_stack.pop();\n      buffer = pow( rpn_stack.top(), buffer );\n      rpn_stack.pop();\n      rpn_stack.push( buffer );\n    } else {\n      vw_throw( IOErr() << \"Unknown RPN operator: \" << *iter << \"\\n\" );\n    }\n  } // End of calculator\n\n  if ( rpn_stack.size() != 1 )\n    vw_throw( IOErr() << \"Unbalanced RPN equation! More constants than need by operators.\\n\" );\n\n  return rpn_stack.top();\n}\n\n// FileIO\n//-----------------------------------------------------\nvoid RPNEquation::write( std::ofstream &f ) {\n  for ( int i = 0; i < 3; i++ ) {\n    std::vector<std::string>* eq_ptr = NULL;\n    std::vector<double>* cs_ptr = NULL;\n    switch(i) {\n    case 0:\n      eq_ptr = &m_x_eq;\n      cs_ptr = &m_x_consts;\n      break;\n    case 1:\n      eq_ptr = &m_y_eq;\n      cs_ptr = &m_y_consts;\n      break;\n    case 2:\n      eq_ptr = &m_z_eq;\n      cs_ptr = &m_z_consts;\n      break;\n    }\n\n    f << std::setprecision( 15 );\n    int cs_idx = 0;\n    for ( unsigned j = 0; j < eq_ptr->size(); j++ ) {\n      if ( (*eq_ptr)[j] == \"c\" ) {\n        f << (*cs_ptr)[cs_idx] << \" \";\n        cs_idx++;\n      } else {\n        f << (*eq_ptr)[j] << \" \";\n      }\n    }\n    f << \"\\n\";\n  }\n}\n\nvoid RPNEquation::read( std::ifstream &f ) {\n  std::string buffer;\n  m_cached_time = -1;\n\n  buffer.clear();\n  std::getline( f, buffer );\n  string_to_eqn( buffer, m_x_eq, m_x_consts );\n\n  buffer.clear();\n  std::getline( f, buffer );\n  string_to_eqn( buffer, m_y_eq, m_y_consts );\n\n  buffer.clear();\n  std::getline( f, buffer );\n  string_to_eqn( buffer, m_z_eq, m_z_consts );\n}\n\n// Constant Access\n//-----------------------------------------------------\ndouble& RPNEquation::operator[]( size_t n ) {\n  m_cached_time = -1;\n  if ( n >= m_x_consts.size() + m_y_consts.size()\n       + m_z_consts.size() )\n    vw_throw( ArgumentErr() << \"RPNEquation: invalid index.\" );\n  if ( n < m_x_consts.size() )\n    return m_x_consts[n];\n  else if ( n < m_x_consts.size() + m_y_consts.size() )\n    return m_y_consts[n-m_x_consts.size()];\n  return m_z_consts[n-m_x_consts.size()-m_y_consts.size()];\n}\n"
  },
  {
    "path": "src/asp/IsisIO/RPNEquation.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n#ifndef __ASP_RPN_EQUATION__\n#define __ASP_RPN_EQUATION__\n\n// STL\n#include <vector>\n// ASP\n#include <asp/IsisIO/BaseEquation.h>\n\nnamespace asp {\n\n  // RPN Equation\n  // .. is an equation defined by a string containing Reverse Polish\n  // Notation (RPN) equation.\n  // ex: 3 t + 4 t * sin * == sin(4t)*(3+t)\n  //\n  // Current supported commands\n  //  t       (refers to the t this equation is evaluated with)\n  //  sin, cos, tan, abs\n  //  *, /, -, +, ^\n  //\n  // Remember: Have your equation space delimited\n  // Also: 'c' is an internal place holder for RPNEquation\n  class RPNEquation : public BaseEquation {\n    std::vector<std::string> m_x_eq;\n    std::vector<double> m_x_consts;\n    std::vector<std::string> m_y_eq;\n    std::vector<double> m_y_consts;\n    std::vector<std::string> m_z_eq;\n    std::vector<double> m_z_consts;\n\n    void update( double t );\n    void string_to_eqn( std::string const& str,\n                        std::vector<std::string>& commands,\n                        std::vector<double>& consts );\n    double evaluate( std::vector<std::string> const& commands,\n                     std::vector<double>& consts,\n                     double t );\n  public:\n    RPNEquation();\n    RPNEquation( std::string const& x_eq,\n                 std::string const& y_eq,\n                 std::string const& z_eq );\n    std::string type() const { return \"RPNEquation\"; }\n\n    size_t size() const { return m_x_consts.size() +\n        m_y_consts.size() + m_z_consts.size(); }\n    double& operator[]( size_t n );\n\n    void write( std::ofstream &f );\n    void read( std::ifstream &f );\n  };\n\n}\n\n#endif//__ASP_RPN_EQUATION__\n"
  },
  {
    "path": "src/asp/IsisIO/tests/TestEphemerisEquations.cxx",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n#include <test/Helpers.h>\n\n#include <asp/IsisIO/PolyEquation.h>\n#include <asp/IsisIO/RPNEquation.h>\n\nusing namespace vw;\nusing namespace asp;\n\ndouble DELTA = 1e-6;\n\nTEST(EphemerisEquations, polynomial_equal_order) {\n  PolyEquation poly(0);\n  EXPECT_EQ( poly.size(), 3u );\n  EXPECT_EQ( poly.type(), \"PolyEquation\" );\n  poly[0] = 10;\n  poly[1] = 1;\n  poly[2] = 20;\n  EXPECT_EQ( poly[0], 10 );\n  EXPECT_EQ( poly[1], 1 );\n  EXPECT_EQ( poly[2], 20 );\n\n  Vector3 test = poly(20);\n  EXPECT_EQ( 10, test[0] );\n  EXPECT_EQ( 1,  test[1] );\n  EXPECT_EQ( 20, test[2] );\n\n  poly[1] = -50;\n  test = poly(-100);\n  EXPECT_EQ( 10,  test[0] );\n  EXPECT_EQ( -50, test[1] );\n  EXPECT_EQ( 20,  test[2] );\n\n  PolyEquation poly2(1);\n  EXPECT_EQ( poly2.size(), 6u );\n  poly2[0] = 10; poly2[1] = 0.5;\n  poly2[2] = 5; poly2[3] = -0.5;\n  poly2[4] = 0; poly2[5] = 6;\n\n  test = poly2(20);\n  EXPECT_EQ( 20,  test[0] );\n  EXPECT_EQ( -5,  test[1] );\n  EXPECT_EQ( 120, test[2] );\n}\n\nTEST(EphemerisEquations, polynomial_variable_order) {\n  PolyEquation poly(0,2,1);\n  EXPECT_EQ( 6u, poly.size() );\n  EXPECT_EQ( poly.type(), \"PolyEquation\" );\n  poly[0] = 11;\n  poly[1] = -5; poly[2] = 0.6; poly[3] = .1;\n  poly[4] = -4; poly[5] = 2.5;\n  EXPECT_EQ( -5, poly[1] );\n\n  Vector3 test = poly(-1.5);\n  EXPECT_NEAR( 11, test[0], DELTA );\n  EXPECT_NEAR( -5.675, test[1], DELTA );\n  EXPECT_NEAR( -7.75, test[2], DELTA );\n}\n\nTEST(EphemerisEquations, polynomial_defined_const) {\n  Vector<double> x_coeff(1);\n  x_coeff[0] = 11;\n  Vector<double> y_coeff(3);\n  y_coeff[0] = -5;\n  y_coeff[1] = 0.6;\n  y_coeff[2] = .1;\n  Vector<double> z_coeff(2);\n  z_coeff[0] = -4;\n  z_coeff[1] = 2.5;\n  PolyEquation poly(x_coeff,\n                    y_coeff,\n                    z_coeff);\n  EXPECT_EQ( 6u, poly.size() );\n  EXPECT_EQ( poly.type(), \"PolyEquation\" );\n  EXPECT_EQ( -5, poly[1] );\n\n  Vector3 test = poly(-1.5);\n  EXPECT_NEAR( 11, test[0], DELTA );\n  EXPECT_NEAR( -5.675, test[1], DELTA );\n  EXPECT_NEAR( -7.75, test[2], DELTA );\n}\n\nTEST(EphemerisEquations, reversepolish) {\n  std::string x_eq(\"3 t t * * 1 +\");\n  std::string y_eq(\"t sin 4 * t +\");\n  std::string z_eq(\"t t 2 * * 5 t / - abs\");\n  RPNEquation rpn( x_eq, y_eq, z_eq );\n  EXPECT_EQ( 5u, rpn.size() );\n  EXPECT_EQ( \"RPNEquation\", rpn.type() );\n\n  Vector3 test = rpn(-1.5);\n  EXPECT_NEAR( 7.75, test[0], DELTA );\n  EXPECT_NEAR( -5.48997994641622, test[1], DELTA );\n  EXPECT_NEAR( 7.8333333333, test[2], DELTA );\n\n  rpn[0] = 22;\n  rpn[2] = 9;\n  rpn[3] = 8;\n  test = rpn(-1.5);\n  EXPECT_NEAR( 50.5, test[0], DELTA );\n  EXPECT_NEAR( -10.4774548794365, test[1], DELTA );\n  EXPECT_NEAR( 21.333333333, test[2], DELTA );\n\n  rpn.set_time_offset( -20 );\n  EXPECT_EQ( -20, rpn.get_time_offset() );\n  test = rpn(-1.5); // like eval with 18.5\n  EXPECT_NEAR( 7530.5, test[0], DELTA );\n  EXPECT_NEAR( 15.4176744337735, test[1], DELTA );\n  EXPECT_NEAR( 2737.72972972973, test[2], DELTA );\n}\n"
  },
  {
    "path": "src/asp/IsisIO/tests/TestIsisCameraModel.cxx",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n#include <test/Helpers.h>\n\n#include <vw/Math/Vector.h>\n#include <vw/Core/Debugging.h>\n#include <asp/IsisIO/IsisCameraModel.h>\n#include <vw/Cartography/PointImageManipulation.h>\n\n#include <FileName.h>\n#include <CameraFactory.h>\n#include <TProjection.h>\n#include <ProjectionFactory.h>\n#include <Cube.h>\n#include <Camera.h>\n#include <Pvl.h>\n#include <AlphaCube.h>\n#include <CameraFocalPlaneMap.h>\n#include <CameraDetectorMap.h>\n#include <CameraDistortionMap.h>\n#include <Projection.h>\n#include <Distance.h>\n\n#include <boost/foreach.hpp>\n\nusing namespace vw;\nusing namespace vw::camera;\n\ndouble DELTA = 1e-8;\n\nVector2 generate_random( int const& xsize,\n\t\t\t int const& ysize ) {\n  Vector2 pixel;\n  pixel[0] = rand() % ( 10 * xsize - 10 ) + 10;\n  pixel[0] /= 10.0;\n  pixel[1] = rand() % ( 10 * ysize - 10 ) + 10;\n  pixel[1] /= 10.0;\n  return pixel;\n}\n\nTEST(IsisCameraModel, mapprojected) {\n  if (!asp::isis::IsisEnv()) {\n    vw_out() << \"ISISROOT or ISISDATA was not set. ISIS unit tests won't be run.\"\n\t     << std::endl;\n    return;\n  }\n  std::string file(\"E0201461.tiny.cub\");\n  Isis::FileName cubefile( file.c_str() );\n  Isis::Pvl label;\n  label.read( cubefile.expanded() );\n  Isis::Cube tempCube(cubefile.expanded());\n  Isis::Camera* cam = Isis::CameraFactory::Create( tempCube );\n  Isis::AlphaCube alphacube( tempCube );\n  Isis::TProjection* proj =(Isis::TProjection*)Isis::ProjectionFactory::CreateFromCube( label );\n\n  // This is testing the assumption that we don't need to invoke much\n  // of the camera model to do a pixel to vector.\n\n  srand( 42 ); // We only want repeatible pseudo random\n  for ( size_t i = 0; i < 2; i++ ) {\n    Vector2 pixel = generate_random( cam->Samples(),\n\t\t\t\t     cam->Lines() );\n    Vector2 noise = generate_random( cam->Samples(),\n\t\t\t\t     cam->Lines() );\n\n    proj->SetWorld( pixel[0], pixel[1] );\n    Vector3 lon_lat_radius( proj->UniversalLongitude(),\n\t\t\t    proj->UniversalLatitude(),\n\t\t\t    cam->LocalRadius( proj->UniversalLatitude(),\n\t\t\t\t\t      proj->UniversalLongitude() ).meters() );\n    cam->SetImage( noise[0], noise[1] );\n    cam->SetUniversalGround( lon_lat_radius[1],\n\t\t\t     lon_lat_radius[0],\n\t\t\t     lon_lat_radius[2] );\n    EXPECT_VECTOR_NEAR( Vector2(cam->Sample(),cam->Line()), pixel, 1e-3 );\n    double ip[3];\n    cam->instrumentPosition( ip );\n    VectorProxy<double,3> instru( ip );\n    double bc[3];\n    cam->Coordinate( bc );\n    VectorProxy<double,3> coord( bc );\n    Vector3 alt = cartography::lon_lat_radius_to_xyz_estimate( lon_lat_radius ); // INACCURATE\n\n    Vector3 dir = normalize( alt - instru );\n    Vector3 new_point = instru*1000+50000*dir;\n    new_point /= 1000;\n  }\n\n  delete cam;\n  delete proj;\n}\n\nTEST(IsisCameraModel, groundmap_chk) {\n  // Run two methods ..\n  // solve for vector out with and without the groundmap solution\n  // prove that they get the same values\n\n  if (!asp::isis::IsisEnv()) {\n    vw_out() << \"ISISROOT or ISISDATA was not set. ISIS unit tests won't be run.\"\n\t     << std::endl;\n    return;\n  }\n\n  std::vector<std::string> files;\n  files.push_back(\"E1701676.reduce.cub\"); // Linescan\n  files.push_back(\"5165r.cub\");           // Frame\n  files.push_back(\"5165r.map.cub\");\n  files.push_back(\"E0201461.tiny.cub\");\n\n  for ( size_t j = 0; j < files.size(); j++ ) {\n\n    vw_out() << \"File: \" << files[j] << \"\\n\";\n    vw_out() << \"------------------------------------\\n\";\n\n    Isis::FileName cubefile( files[j].c_str() );\n    Isis::Pvl label;\n    label.read( cubefile.expanded() );\n    Isis::Cube tempCube(cubefile.expanded());\n    Isis::Camera* cam = Isis::CameraFactory::Create( tempCube );\n    Isis::AlphaCube alphacube( tempCube );\n\n    vw_out() << \"CameraType: \" << cam->GetCameraType() << \"\\n\";\n\n    double m_delta = 1e-8;\n    if ( cam->HasProjection() )\n      m_delta = 2e-2; // Cameras and Projections don't always line up\n\n    // Ripping out the parts of the Camera Model\n    Isis::CameraDistortionMap* distortmap = cam->DistortionMap();\n    Isis::CameraFocalPlaneMap* focalmap = cam->FocalPlaneMap();\n    Isis::CameraDetectorMap* detectmap = cam->DetectorMap();\n\n    // Building test set\n    std::vector<Vector2> pixel_sets;\n    srand( 42 );\n    for ( size_t i = 0; i < 1000; i++ ) {\n      Vector2 pixel = generate_random( cam->Samples(),\n\t\t\t\t       cam->Lines() );\n      pixel_sets.push_back(pixel);\n    }\n\n    std::vector<Vector3> g_solution_sets, nog_solution_sets;\n\n    Timer *t = new Timer(\"No GroundMap Solution\");\n\n    for ( size_t i = 0; i < pixel_sets.size(); i++ ) {\n      Vector2 pixel = pixel_sets[i];\n      Vector3 nog_solution;\n\n      // No Ground Map Solution\n      detectmap->SetParent( alphacube.AlphaSample(pixel[0]),\n\t\t\t    alphacube.AlphaLine(pixel[1]) );\n      focalmap->SetDetector( detectmap->DetectorSample(),\n\t\t\t     detectmap->DetectorLine() );\n      distortmap->SetFocalPlane( focalmap->FocalPlaneX(),\n\t\t\t\t focalmap->FocalPlaneY() );\n      nog_solution[0] = distortmap->UndistortedFocalPlaneX();\n      nog_solution[1] = distortmap->UndistortedFocalPlaneY();\n      nog_solution[2] = distortmap->UndistortedFocalPlaneZ();\n      nog_solution /= norm_2(nog_solution);\n      std::vector<double> lookC(3); // Should make fancy func for std vec and vec\n      std::copy( nog_solution.begin(), nog_solution.end(), lookC.begin() );\n      std::vector<double> lookJ = cam->instrumentRotation()->J2000Vector(lookC);\n      lookC = cam->bodyRotation()->ReferenceVector(lookJ);\n      std::copy( lookC.begin(), lookC.end(), nog_solution.begin() );\n\n      nog_solution_sets.push_back(nog_solution);\n    }\n\n    delete(t);\n    t = new Timer(\"Ground Map Solution:\");\n\n    for ( size_t i = 0; i < pixel_sets.size(); i++ ) {\n\n      Vector2 pixel = pixel_sets[i];\n      Vector3 g_solution;\n\n      // Ground Map Solution\n      cam->SetImage(pixel[0],pixel[1]);\n      double p[3];\n      cam->instrumentPosition(p);\n      Vector3 instrument( p[0], p[1], p[2] );\n\n      cam->Coordinate(p);\n      Vector3 ground( p[0], p[1], p[2] );\n      g_solution = normalize( ground - instrument );\n\n      g_solution_sets.push_back(g_solution);\n    }\n\n    delete t;\n\n    for ( size_t i = 0; i < pixel_sets.size(); i++ )\n      EXPECT_VECTOR_NEAR( nog_solution_sets[i],\n\t\t\t  g_solution_sets[i], m_delta );\n  }\n}\n\nTEST(IsisCameraModel, camera_model) {\n  if (!asp::isis::IsisEnv()) {\n    vw_out() << \"ISISROOT or ISISDATA was not set. ISIS unit tests won't be run.\"\n\t     << std::endl;\n    return;\n  }\n\n  // Circle Check\n  std::vector<std::string> files;\n  files.push_back(\"E1701676.reduce.cub\");\n  files.push_back(\"5165r.cub\");\n  files.push_back(\"E0201461.tiny.cub\"); // Map Projected\n  files.push_back(\"5165r.map.cub\");\n\n  srand( 42 );\n  BOOST_FOREACH( std::string const& cube, files ) {\n    IsisCameraModel cam(cube);\n\n    vw_out() << \"File: \" << cube << \"\\n\";\n    vw_out() << \"------------------------------------\\n\";\n\n    Timer t(cube+\"'s time: \");\n\n    for ( size_t i = 0; i < 2; i++ ) {\n      Vector2 pixel = generate_random( cam.samples(),\n\t\t\t\t       cam.lines() );\n      Vector3 point = cam.pixel_to_vector( pixel );\n      for ( size_t k = 0; k < 2; k++ ) {\n\t// Apply noise to make sure we are not using stored values\n\tVector2 noise = generate_random( cam.samples(),\n\t\t\t\t\t cam.lines() );\n      }\n      point *= 70000; // 70 km below\n      point += cam.camera_center( pixel );\n      for ( size_t k = 0; k < 2; k++ ) {\n\t// Apply noise to make sure we are not using stored values\n\tVector2 noise = generate_random( cam.samples(),\n\t\t\t\t\t cam.lines() );\n      }\n\n      Vector2 rpixel = cam.point_to_pixel( point );\n      EXPECT_VECTOR_NEAR( pixel, rpixel, 0.02 );\n      EXPECT_TRUE( cam.ephemeris_time(Vector2()) );\n    }\n\n    EXPECT_TRUE( cam.sun_position() != Vector3() );\n    EXPECT_TRUE( cam.target_radii() != Vector3() );\n    EXPECT_GT( cam.target_radii()[0], 0 );\n    EXPECT_GT( cam.target_radii()[1], 0 );\n    EXPECT_GT( cam.target_radii()[2], 0 );\n\n    Vector2 center_pixel( cam.lines(), cam.samples() );\n    center_pixel /= 2;\n    Quat center_pose = cam.camera_pose(center_pixel);\n    double angle_from_z =\n      acos(dot_prod(Vector3(0,0,1),inverse(center_pose).rotate(cam.pixel_to_vector(center_pixel))));\n    EXPECT_LT( angle_from_z, 0.5 );\n  }\n}\n"
  },
  {
    "path": "src/asp/OpenMVG/CMakeLists.txt",
    "content": "add_library_wrapper(AspOpenMvg \"${ASP_OPENMVG_SRC_FILES}\" \"${ASP_OPENMVG_TEST_FILES}\"\n    \"${ASP_OPENMVG_LIB_DEPENDENCIES}\")\n"
  },
  {
    "path": "src/asp/OpenMVG/README.md",
    "content": "This has several small utilities copied from the OpenMVG project.\n\n"
  },
  {
    "path": "src/asp/OpenMVG/flat_pair_map.hpp",
    "content": "\n// Copyright (c) 2012-2016 Pierre MOULON.\n\n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef OPENMVG_FLAT_PAIR_MAP_HPP\n#define OPENMVG_FLAT_PAIR_MAP_HPP\n\n#include <algorithm>\n#include <utility>\n#include <vector>\n\nnamespace aspOpenMVG  {\n\n/// Lightweight copy of the flat_map of BOOST library\n/// Use a vector to speed up insertion (preallocated array)\ntemplate<typename T1, typename T2>\nclass flat_pair_map\n{\n  using P = std::pair<T1, T2>;\npublic:\n  using iterator = typename std::vector< P >::iterator;\n\n  typename std::vector< P >::iterator find(const T1 & val)  {\n    return std::lower_bound(m_vec.begin(), m_vec.end(), val, superiorToFirst);\n  }\n\n  T2 & operator[](const T1 & val) {\n    return std::lower_bound(m_vec.begin(), m_vec.end(), val, superiorToFirst)->second;\n  }\n\n  void sort()  { std::sort(m_vec.begin(), m_vec.end(), sortPairAscend);}\n  void push_back(const P & val)  { m_vec.push_back(val);}\n  void clear()  { m_vec.clear();}\n  void reserve(size_t count)  { m_vec.reserve(count);}\n\n  template< class... Args >\n  void emplace_back( Args&&... args )\n  {\n    m_vec.emplace_back(std::forward<Args>(args)...);\n  }\n\n  size_t size() const { return m_vec.size();}\n  const P& operator[](std::size_t idx) const { return m_vec[idx];}\n\nprivate:\n  std::vector< P > m_vec;\n\n  static bool sortPairAscend(const P &a, const P &b) {return a.first<b.first;}\n  static bool superiorToFirst(const P &a, const T1 &b) {return a.first<b;}\n};\n\n} // namespace aspOpenMVG\n\n#endif // OPENMVG_FLAT_PAIR_MAP_HPP\n"
  },
  {
    "path": "src/asp/OpenMVG/indMatch.hpp",
    "content": "\n// Copyright (c) 2012, 2013 Pierre MOULON.\n\n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef OPENMVG_MATCHING_IND_MATCH_HPP\n#define OPENMVG_MATCHING_IND_MATCH_HPP\n\n#include <asp/OpenMVG/types.hpp>\n\n//#include <cereal/cereal.hpp> // Serialization\n\n#include <iostream>\n#include <map>\n#include <set>\n#include <vector>\n\nnamespace aspOpenMVG {\nnamespace matching {\n\n/// Structure in order to save pairwise indexed references.\n/// A sort operator exist in order to remove duplicates of IndMatch series.\nstruct IndMatch\n{\n  IndMatch(IndexT i = 0, IndexT j = 0) : i_(i), j_(j)  {}\n\n  friend bool operator==(const IndMatch& m1, const IndMatch& m2)  {\n    return (m1.i_ == m2.i_ && m1.j_ == m2.j_);\n  }\n\n  friend bool operator!=(const IndMatch& m1, const IndMatch& m2)  {\n    return !(m1 == m2);\n  }\n\n  // Lexicographical ordering of matches. Used to remove duplicates\n  friend bool operator<(const IndMatch& m1, const IndMatch& m2)  {\n    return (m1.i_ < m2.i_ || (m1.i_ == m2.i_ && m1.j_ < m2.j_));\n  }\n\n  /// Remove duplicates ((i_, j_) that appears multiple times)\n  static bool getDeduplicated(std::vector<IndMatch> & vec_match)  {\n\n    const size_t sizeBefore = vec_match.size();\n    const std::set<IndMatch> set_deduplicated( vec_match.begin(), vec_match.end());\n    vec_match.assign(set_deduplicated.begin(), set_deduplicated.end());\n    return sizeBefore != vec_match.size();\n  }\n\n  // Serialization\n  template <class Archive>\n  void serialize( Archive & ar )  {\n    ar(i_, j_);\n  }\n\n  IndexT i_, j_;  // Left, right index\n};\n\ninline std::ostream& operator<<(std::ostream & out, const IndMatch & obj) {\n  return out << obj.i_ << \" \" << obj.j_;\n}\n\ninline std::istream& operator>>(std::istream & in, IndMatch & obj) {\n  return in >> obj.i_ >> obj.j_;\n}\n\nusing IndMatches = std::vector<matching::IndMatch>;\n\n/// Pairwise matches (indexed matches for a pair <I,J>)\n/// The interface used to store corresponding point indexes per images pairs\nclass PairWiseMatchesContainer\n{\npublic:\n  virtual ~PairWiseMatchesContainer() {}\n  virtual void insert(std::pair<Pair, IndMatches>&& pairWiseMatches) = 0;\n};\n\n//--\n/// Pairwise matches (indexed matches for a pair <I,J>)\n/// A structure used to store corresponding point indexes per images pairs\nstruct PairWiseMatches :\n  public PairWiseMatchesContainer,\n  public std::map< Pair, IndMatches >\n{\n  void insert(std::pair<Pair, IndMatches> && pairWiseMatches)override\n  {\n    std::map< Pair, IndMatches >::insert(\n      std::forward<std::pair<Pair, IndMatches>>(pairWiseMatches));\n  }\n\n  // Serialization\n  template <class Archive>\n  void serialize( Archive & ar )  {\n    ar(static_cast<std::map< Pair, IndMatches >&>(*this));\n  }\n};\n\ninline Pair_Set getPairs(const PairWiseMatches & matches)\n{\n  Pair_Set pairs;\n  for ( const auto & cur_pair : matches )\n    pairs.insert(cur_pair.first);\n  return pairs;\n}\n\n}  // namespace matching\n}  // namespace aspOpenMVG\n\n// namespace cereal\n// {\n//   // This struct specialization will tell cereal which is the right way to serialize PairWiseMatches\n//   template <class Archive>\n//   struct specialize<\n//     Archive,\n//     aspOpenMVG::matching::PairWiseMatches,\n//     cereal::specialization::member_serialize>\n//   {};\n// } // namespace cereal \n\n#endif // OPENMVG_MATCHING_IND_MATCH_HPP\n"
  },
  {
    "path": "src/asp/OpenMVG/numeric.cpp",
    "content": "\n// Copyright (c) 2007, 2008 libmv authors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to\n// deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n// sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n// IN THE SOFTWARE.\n\n// Copyright (c) 2012, 2013 Pierre MOULON.\n\n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include <asp/OpenMVG/numeric.h>\n\n#include <fstream>\n\nnamespace aspOpenMVG {\n\nMat3 CrossProductMatrix(const Vec3 &x) {\n  Mat3 X;\n  X << 0, -x(2),  x(1),\n    x(2),     0, -x(0),\n   -x(1),  x(0),     0;\n  return X;\n}\n\nMat3 RotationAroundX(double angle) {\n  return Eigen::AngleAxisd(angle, Vec3::UnitX()).toRotationMatrix();\n}\n\nMat3 RotationAroundY(double angle) {\n  return Eigen::AngleAxisd(angle, Vec3::UnitY()).toRotationMatrix();\n}\n\nMat3 RotationAroundZ(double angle) {\n  return Eigen::AngleAxisd(angle, Vec3::UnitZ()).toRotationMatrix();\n}\n\ndouble getRotationMagnitude(const Mat3 & R2) {\n  const Mat3 R1 = Mat3::Identity();\n  double cos_theta = (R1.array() * R2.array()).sum() / 3.0;\n  cos_theta = clamp(cos_theta, -1.0, 1.0);\n  return std::acos(cos_theta);\n}\n\nMat3 LookAt(const Vec3 &center, const Vec3 & up) {\n  Vec3 zc = center.normalized();\n  Vec3 xc = up.cross(zc).normalized();\n  Vec3 yc = zc.cross(xc);\n  Mat3 R;\n  R.row(0) = xc;\n  R.row(1) = yc;\n  R.row(2) = zc;\n  return R;\n}\n\n//eyePosition3D is a XYZ position. This is where you are (your eye is).\n//center3D is the XYZ position where you want to look at.\n//upVector3D is a XYZ normalized vector. Quite often 0.0, 1.0, 0.0\n\nMat3 LookAt2(const Vec3 &eyePosition3D,\n  const Vec3 &center3D,\n  const Vec3 &upVector3D )\n{\n  Vec3 forward, side, up;\n  Mat3 matrix2, resultMatrix;\n  //------------------\n  forward = center3D - eyePosition3D;\n  forward.normalize();\n  //------------------\n  //Side = forward x up\n  //ComputeNormalOfPlane(side, forward, upVector3D);\n  side[0]=(forward[1]*upVector3D[2])-(forward[2]*upVector3D[1]);\n  side[1]=(forward[2]*upVector3D[0])-(forward[0]*upVector3D[2]);\n  side[2]=(forward[0]*upVector3D[1])-(forward[1]*upVector3D[0]);\n  side.normalize();\n  //------------------\n  //Recompute up as: up = side x forward\n  //ComputeNormalOfPlane(up, side, forward);\n  up[0]=(side[1]*forward[2])-(side[2]*forward[1]);\n  up[1]=(side[2]*forward[0])-(side[0]*forward[2]);\n  up[2]=(side[0]*forward[1])-(side[1]*forward[0]);\n\n  //------------------\n  matrix2(0) = side[0];\n  matrix2(1) = side[1];\n  matrix2(2) = side[2];\n  //------------------\n  matrix2(3) = up[0];\n  matrix2(4) = up[1];\n  matrix2(5) = up[2];\n  //------------------\n  matrix2(6) = -forward[0];\n  matrix2(7) = -forward[1];\n  matrix2(8) = -forward[2];\n\n  return matrix2;\n}\n\nvoid MeanAndVarianceAlongRows(const Mat &A,\n  Vec *mean_pointer,\n  Vec *variance_pointer) {\n  const Mat::Index n = A.rows();\n  const double m = static_cast<double>(A.cols());\n  (*mean_pointer) = Vec::Zero(n);\n  (*variance_pointer) = Vec::Zero(n);\n\n  for (Mat::Index i = 0; i < n; ++i) {\n    (*mean_pointer)(i) += A.row(i).array().sum();\n    (*variance_pointer)(i) += (A.row(i).array() * A.row(i).array()).array().sum();\n  }\n  (*mean_pointer) /= m;\n  for (Mat::Index i = 0; i < n; ++i) {\n    (*variance_pointer)(i) = (*variance_pointer)(i) / m - Square((*mean_pointer)(i));\n  }\n}\n\nbool exportMatToTextFile(const Mat & mat, const std::string & filename,\n  const std::string & sPrefix)\n{\n  bool bOk = false;\n  std::ofstream outfile;\n  outfile.open(filename.c_str(), std::ios_base::out);\n  if (outfile.is_open()) {\n    outfile << sPrefix << \"=[\" << std::endl;\n    for (int j=0; j < mat.rows(); ++j)  {\n      for (int i=0; i < mat.cols(); ++i)  {\n        outfile << mat(j,i) << \" \";\n      }\n      outfile << \";\\n\";\n    }\n    outfile << \"];\";\n    bOk = true;\n  }\n  outfile.close();\n  return bOk;\n}\n\n}  // namespace aspOpenMVG\n"
  },
  {
    "path": "src/asp/OpenMVG/numeric.h",
    "content": "\n// Copyright (c) 2007, 2008 libmv authors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to\n// deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n// sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n// IN THE SOFTWARE.\n\n// Copyright (c) 2012, 2013 Pierre MOULON.\n\n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef OPENMVG_NUMERIC_NUMERIC_H\n#define OPENMVG_NUMERIC_NUMERIC_H\n\n//--\n// Eigen\n// http://eigen.tuxfamily.org/dox-devel/QuickRefPage.html\n//--\n#include <Eigen/Core>\n#include <Eigen/Eigenvalues>\n#include <Eigen/Geometry>\n#include <Eigen/LU>\n#include <Eigen/QR>\n#include <Eigen/SparseCore>\n#include <Eigen/StdVector>\n#include <Eigen/SVD>\n\n#include <cmath>\n#include <iostream>\n#include <numeric>\n#include <string>\n#include <vector>\n\nnamespace aspOpenMVG\n{\n\n// Check MSVC\n#if _WIN32 || _WIN64\n  #if _WIN64\n    #define ENV64BIT\n  #else\n    #define ENV32BIT\n  #endif\n#endif\n\n// Check GCC\n#if __GNUC__\n  #if __x86_64__ || __ppc64__ || _LP64\n    #define ENV64BIT\n  #else\n    #define ENV32BIT\n  #endif\n#endif\n\nusing Eigen::Map;\n\n/// Trait used for double type\nusing EigenDoubleTraits = Eigen::NumTraits<double>;\n\n/// 3d vector using double internal format\nusing Vec3 = Eigen::Vector3d;\n\n/// 2d vector using int internal format\nusing Vec2i = Eigen::Vector2i;\n\n/// 2d vector using float internal format\nusing Vec2f = Eigen::Vector2f;\n\n/// 3d vector using float internal format\nusing Vec3f =Eigen::Vector3f;\n\n/// 9d vector using double internal format\nusing Vec9 = Eigen::Matrix<double, 9, 1>;\n\n/// Quaternion type\nusing Quaternion = Eigen::Quaternion<double>;\n\n/// 3x3 matrix using double internal format\nusing Mat3 = Eigen::Matrix<double, 3, 3>;\n\n#if defined(ENV32BIT)\n\n  /// 3x4 matrix using double internal format\n  using Mat34 = Eigen::Matrix<double, 3, 4, Eigen::DontAlign>;\n\n  /// 2d vector using double internal format\n  using Vec2 = Eigen::Matrix<double, 2, 1, Eigen::DontAlign>;\n\n  /// 4d vector using double internal format\n  using Vec4 = Eigen::Matrix<double, 4, 1, Eigen::DontAlign>;\n\n  /// 6d vector using double internal format\n  using Vec6 = Eigen::Matrix<double, 6, 1, Eigen::DontAlign>;\n#else // 64 bits compiler\n\n  /// 3x4 matrix using double internal format\n  using Mat34 = Eigen::Matrix<double, 3, 4>;\n\n  /// 2d vector using double internal format\n  using Vec2 = Eigen::Vector2d;\n\n  /// 4d vector using double internal format\n  using Vec4 = Eigen::Vector4d;\n\n  /// 6d vector using double internal format\n  using Vec6 = Eigen::Matrix<double, 6, 1>;\n#endif\n\n\n/// 4x4 matrix using double internal format\nusing Mat4 = Eigen::Matrix<double, 4, 4>;\n\n/// generic matrix using unsigned int internal format\nusing Matu = Eigen::Matrix<unsigned int, Eigen::Dynamic, Eigen::Dynamic>;\n\n/// 3x3 matrix using double internal format with RowMajor storage\nusing RMat3 = Eigen::Matrix<double, 3, 3, Eigen::RowMajor>;\n\n//-- General purpose Matrix and Vector\n/// Unconstrained matrix using double internal format\nusing Mat = Eigen::MatrixXd;\n\n/// Unconstrained vector using double internal format\nusing Vec = Eigen::VectorXd;\n\n/// Unconstrained vector using unsigned int internal format\nusing Vecu = Eigen::Matrix<unsigned int, Eigen::Dynamic, 1>;\n\n/// Unconstrained matrix using float internal format\nusing Matf = Eigen::MatrixXf;\n\n/// Unconstrained vector using float internal format\nusing Vecf = Eigen::VectorXf;\n\n/// 2xN matrix using double internal format\nusing Mat2X = Eigen::Matrix<double, 2, Eigen::Dynamic>;\n\n/// 3xN matrix using double internal format\nusing Mat3X = Eigen::Matrix<double, 3, Eigen::Dynamic>;\n\n/// 4xN matrix using double internal format\nusing Mat4X = Eigen::Matrix<double, 4, Eigen::Dynamic>;\n\n/// 9xN matrix using double internal format\nusing MatX9 = Eigen::Matrix<double, Eigen::Dynamic, 9>;\n\n//-- Sparse Matrix (Column major, and row major)\n/// Sparse unconstrained matrix using double internal format\nusing sMat = Eigen::SparseMatrix<double>;\n\n/// Sparse unconstrained matrix using double internal format and Row Major storage\nusing sRMat = Eigen::SparseMatrix<double, Eigen::RowMajor>;\n\n//--------------\n//-- Function --\n//--------------\n\n\n/**\n* @brief Compute square of a number\n* @tparam T Type of the number to square\n* @param x Input number\n* @return square of x\n*/\ntemplate<typename T>\ninline T Square( T x )\n{\n  return x * x;\n}\n\n\n/**\n* @brief Clamp value inside a given range\n* @tparam T working type\n* @param val Value to clamp\n* @param min Lower bound of clamping range\n* @param max Upper bound od clamping range\n* @return clamped value\n* @note Assuming range form a valid range (ie: min <= max )\n*/\ntemplate<typename T>\ninline T clamp( const T & val, const T& min, const T & max )\n{\n  return std::max( min, std::min( val, max ) );\n  //(val < min) ? val : ((val>max) ? val : max);\n}\n\n/**\n* @brief Given a vector, computes it's cross product matrix\n*\n* Cross product matrix is a helper matrix used to express cross product as a multiplication matrix \\n\n* Given two vectors \\f$a=\\begin{pmatrix}a_x\\\\a_y\\\\a_z\\end{pmatrix}\\f$ and \\f$b=\\begin{pmatrix}b_x\\\\b_y\\\\b_z\\end{pmatrix}\\f$, cross product \\f$a\\times b\\f$ is equal to :\\n\n* \\f$a\\times b = \\begin{pmatrix}a\\end{pmatrix}_{\\times} b = \\begin{pmatrix}0 & -a_z & a_y \\\\ a_z & 0 & -a_x \\\\ -a_y & a_x & 0 \\end{pmatrix} b \\f$\n*\n* where \\f$\\begin{pmatrix}a\\end{pmatrix}_{\\times}\\f$ is the cross product matrix of a.\n*\n* @param x Input vector\n* @return Cross product matrix of a input vector\n*/\nMat3 CrossProductMatrix( const Vec3 &x );\n\n\n/**\n* @brief Compute rotation matrix around X-axis\n* @param angle Angle of rotation in radian\n* @return Rotation matrix of given magnitude\n*/\nMat3 RotationAroundX( double angle );\n\n\n/**\n* @brief Compute rotation matrix around Y-axis\n* @param angle Angle of rotation in radian\n* @return Rotation matrix of given magnitude\n*/\nMat3 RotationAroundY( double angle );\n\n\n/**\n* @brief Compute rotation matrix around Z-axis\n* @param angle Angle sof rotation in radian\n* @return Rotation matrix of given magnitude\n*/\nMat3 RotationAroundZ( double angle );\n\n\n/**\n* @brief Convert an angle from degree to radian\n* @param degree Angle in degree\n* @return Same angle in radian\n* @note Assuming input angle is in range [0;360]\n*/\ninline double D2R( double degree )\n{\n  return degree * M_PI / 180.0;\n}\n\n\n/**\n* @brief Convert an angle from radian to degree\n* @param radian Angle in radian\n* @return Same angle in degree\n* @note Assuming input angle in range [0;2Pi]\n*/\ninline double R2D( double radian )\n{\n  return radian / M_PI * 180.0;\n}\n\n/**\n* @brief Compute mean rotation magnitude of the given rotation matrix\n* @param R2 Input rotation matrix\n* @return magnitude of the rotation (in radian)\n* @note Assuming R2 is a correct rotation matrix\n* @note Mean is computed using the matrix column dot products to an Identity matrix\n*/\ndouble  getRotationMagnitude( const Mat3 & R2 );\n\n/**\n* @brief Gives an indication of the sign of the input value\n* @param x Value to test\n* @retval 1.0 if value is nul or positive\n* @retval -1.0 if value is negative\n*/\ninline double SIGN( double x )\n{\n  return x < 0.0 ? -1.0 : 1.0;\n}\n\n/**\n* @brief Compute L infinity norm\n* \\f$ \\| v \\|_{\\infty} = \\max ( |v_0| , |v_1| , \\dots , |v_n| ) \\f$\n* @param x Input vector\n* @return L infinity norm of input vector\n*/\ntemplate<typename TVec>\ninline double NormLInfinity( const TVec &x )\n{\n  return x.array().abs().maxCoeff();\n}\n\n/**\n* @brief Compute L infinity distance between two vectors\n* @param x first vector\n* @param y second vector\n* @return distance between input vectors using L infinity norm\n*/\ntemplate<typename TVec>\ninline double DistanceLInfinity( const TVec &x, const TVec &y )\n{\n  return NormLInfinity( x - y );\n}\n\n/**\n* @brief Solve linear system\n*\n* Linear system is given by : \\n\n* \\f$ A x = 0 \\f$\n* Solution is found using the constraint on x : \\f$ \\| x \\| = 1 \\f$\n*\n* @param[in,out] A Input matrix storing the system to solve\n* @param[out] nullspace result vector containing the solution of the system\n* @return Singular value corresponding to the solution of the system\n*\n* @note Computation is made using SVD decomposition of input matrix\n* @note Input matrix A content may be modified during computation\n* @note Input vector nullspace may be resized to store the full result\n*/\ntemplate <typename TMat, typename TVec>\ndouble Nullspace( TMat *A, TVec *nullspace )\n{\n  if ( A->rows() >= A->cols() )\n  {\n    Eigen::JacobiSVD<TMat> svd( *A, Eigen::ComputeFullV );\n    ( *nullspace ) = svd.matrixV().col( A->cols() - 1 );\n    return svd.singularValues()( A->cols() - 1 );\n  }\n  // Extend A with rows of zeros to make it square. It's a hack, but is\n  // necessary until Eigen supports SVD with more columns than rows.\n  TMat A_extended( A->cols(), A->cols() );\n  A_extended.block( A->rows(), 0, A->cols() - A->rows(), A->cols() ).setZero();\n  A_extended.block( 0, 0, A->rows(), A->cols() ) = ( *A );\n  return Nullspace( &A_extended, nullspace );\n}\n\n/**\n* @brief Solve linear system and gives the two best solutions\n*\n* Linear system is given by : \\n\n* \\f$ A x = 0 \\f$\n* Solution is found using the constraint on x : \\f$ \\| x \\| = 1 \\f$\n*\n* @param[in,out] A Input matrix storing the system to solve\n* @param[out] x1 result vector containing the best solution of the system\n* @param[out] x2 result vector containing the second best solution of the system\n* @return Singular value corresponding to the best solution of the system\n*\n* @note Computation is made using SVD decomposition of input matrix\n* @note Input matrix A content may be modified during computation\n* @note Input vector nullspace may be resized to store the full result\n*/\ntemplate <typename TMat, typename TVec1, typename TVec2>\ninline double Nullspace2( TMat *A, TVec1 *x1, TVec2 *x2 )\n{\n  if ( A->rows() >= A->cols() )\n  {\n    Eigen::JacobiSVD<TMat> svd( *A, Eigen::ComputeFullV );\n    TMat V = svd.matrixV();\n    *x1 = V.col( A->cols() - 1 );\n    *x2 = V.col( A->cols() - 2 );\n    return svd.singularValues()( A->cols() - 1 );\n  }\n  // Extend A with rows of zeros to make it square. It's a hack, but is\n  // necessary until Eigen supports SVD with more columns than rows.\n  TMat A_extended( A->cols(), A->cols() );\n  A_extended.block( A->rows(), 0, A->cols() - A->rows(), A->cols() ).setZero();\n  A_extended.block( 0, 0, A->rows(), A->cols() ) = ( *A );\n  return Nullspace2( &A_extended, x1, x2 );\n}\n\n\n/**\n* @brief Compute look at matrix\n* Make a rotation matrix such that center becomes the direction of the\n* positive z-axis, and y is oriented close to up by default.\n* @param center New direction (z-axis)\n* @param up Desired up vector (y-axis)\n* @return Rotation matrix\n*/\nMat3 LookAt( const Vec3 &center, const Vec3 & up = Vec3::UnitY() );\n\n\n/**\n* @brief Compute generic look at matrix\n* @param eyePosition3D New center of rotation\n* @param center3D Position where matrix look at (center3D-eyePosition3D forms the new z-axis)\n* @param upVector3D Desired up vector (y-axis)\n* @return Rotation matrix conforming the given parameters\n*/\nMat3 LookAt2( const Vec3 &eyePosition3D,\n              const Vec3 &center3D = Vec3::Zero(),\n              const Vec3 &upVector3D = Vec3::UnitY() );\n\n#define SUM_OR_DYNAMIC(x,y) (x==Eigen::Dynamic||y==Eigen::Dynamic)?Eigen::Dynamic:(x+y)\n\ntemplate<typename Derived1, typename Derived2>\nstruct hstack_return\n{\n  using Scalar =typename Derived1::Scalar;\n  enum\n  {\n    RowsAtCompileTime = Derived1::RowsAtCompileTime,\n    ColsAtCompileTime = SUM_OR_DYNAMIC( Derived1::ColsAtCompileTime, Derived2::ColsAtCompileTime ),\n    Options = Derived1::Flags & Eigen::RowMajorBit ? Eigen::RowMajor : 0,\n    MaxRowsAtCompileTime = Derived1::MaxRowsAtCompileTime,\n    MaxColsAtCompileTime = SUM_OR_DYNAMIC( Derived1::MaxColsAtCompileTime, Derived2::MaxColsAtCompileTime )\n  };\n  using type =\n    Eigen::Matrix<\n      Scalar,\n      RowsAtCompileTime,\n      ColsAtCompileTime,\n      Options,\n      MaxRowsAtCompileTime,\n      MaxColsAtCompileTime>;\n};\n\ntemplate<typename Derived1, typename Derived2>\ntypename hstack_return<Derived1, Derived2>::type\nHStack ( const Eigen::MatrixBase<Derived1>& lhs, const Eigen::MatrixBase<Derived2>& rhs )\n{\n  typename hstack_return<Derived1, Derived2>::type res;\n  res.resize( lhs.rows(), lhs.cols() + rhs.cols() );\n  res << lhs, rhs;\n  return res;\n}\n\n\ntemplate<typename Derived1, typename Derived2>\nstruct vstack_return\n{\n  using Scalar =  typename Derived1::Scalar;\n  enum\n  {\n    RowsAtCompileTime = SUM_OR_DYNAMIC( Derived1::RowsAtCompileTime, Derived2::RowsAtCompileTime ),\n    ColsAtCompileTime = Derived1::ColsAtCompileTime,\n    Options = Derived1::Flags & Eigen::RowMajorBit ? Eigen::RowMajor : 0,\n    MaxRowsAtCompileTime = SUM_OR_DYNAMIC( Derived1::MaxRowsAtCompileTime, Derived2::MaxRowsAtCompileTime ),\n    MaxColsAtCompileTime = Derived1::MaxColsAtCompileTime\n  };\n  using type = \n    Eigen::Matrix<\n      Scalar,\n      RowsAtCompileTime,\n      ColsAtCompileTime,\n      Options,\n      MaxRowsAtCompileTime,\n      MaxColsAtCompileTime>;\n};\n\ntemplate<typename Derived1, typename Derived2>\ntypename vstack_return<Derived1, Derived2>::type\nVStack ( const Eigen::MatrixBase<Derived1>& lhs, const Eigen::MatrixBase<Derived2>& rhs )\n{\n  typename vstack_return<Derived1, Derived2>::type res;\n  res.resize( lhs.rows() + rhs.rows(), lhs.cols() );\n  res << lhs, rhs;\n  return res;\n}\n#undef SUM_OR_DYNAMIC\n\n/**\n* @brief Compute Frobenius norm\n* \\f$ \\| A \\|_2 = \\sqrt{ \\sum_{i=1}^n \\sum_{j=0}^m a_{ij}^2 } \\f$\n* @param Input A input matrix\n* @return Frobenius norm of given matrix\n*/\ntemplate<typename TMat>\ninline double FrobeniusNorm( const TMat &A )\n{\n  return sqrt( A.array().abs2().sum() );\n}\n\n/**\n* @brief Compute distance between two matrices using Frobenius norm\n* @param A first matrix\n* @param B second matrix\n* @return Distance between the input matrices given Frobenius norm\n*/\ntemplate<typename TMat>\ninline double FrobeniusDistance( const TMat &A, const TMat &B )\n{\n  return FrobeniusNorm( A - B );\n}\n\n\n/**\n* @brief Compute similarity of matrices given cosine similarity mesure\n* \\f$ \\cos( A , B ) = \\frac{ A . B }{ \\| A \\|_2 \\| B \\|_2 } \\f$\n* @param a First matrix\n* @param b Second matrix\n* @return cosine similarity mesure between the input matrices\n*/\ntemplate<class TMat>\ndouble CosinusBetweenMatrices( const TMat &a, const TMat &b )\n{\n  return ( a.array() * b.array() ).sum() /\n         FrobeniusNorm( a ) / FrobeniusNorm( b );\n}\n\n/**\n* @brief Extract a submatrix given a list of column\n* @param A Input matrix\n* @param columns A vector of columns index to extract\n* @return Matrix containing a subset of input matrix columns\n* @note columns index start at index 0\n* @note Assuming columns contains a list of valid columns index\n*/\ntemplate <typename TMat, typename TCols>\nTMat ExtractColumns( const TMat &A, const TCols &columns )\n{\n  TMat compressed( A.rows(), columns.size() );\n  for ( size_t i = 0; i < static_cast<size_t>( columns.size() ); ++i )\n  {\n    compressed.col( i ) = A.col( columns[i] );\n  }\n  return compressed;\n}\n\n\n/**\n* @brief Compute per row mean and variance\n* @param A input matrix\n* @param[out] mean_pointer a pointer to a vector where mean values are stored\n* @param[out] variance_pointer a pointer to a vector where variance values are stored\n* @note mean_pointer and variance_pointer vector may be resized to store all values\n*/\nvoid MeanAndVarianceAlongRows( const Mat &A,\n                               Vec *mean_pointer,\n                               Vec *variance_pointer );\n\n\n/**\n* @brief Export a matrix to a file in Text mode\n* @param mat Matrix to export\n* @param filename Path to the file where matrix will be written\n* @param sPrefix Prefix before content of the matrix\n* @retval true if export is correct\n* @retval false if there was an error during export\n*/\nbool exportMatToTextFile( const Mat & mat, const std::string & filename,\n                          const std::string & sPrefix = \"A\" );\n\n\n/**\n* @brief Test if value is a finite one\n* @param val Input parameter\n* @retval 0 if input is not a finite one\n* @retval non-zero value if input is a finite one\n*/\ninline int is_finite( const double val )\n{\n#ifdef _MSC_VER\n  return _finite( val );\n#else\n  return std::isfinite( val );\n#endif\n}\n\n\n/**\n* @brief Compute min, max, mean and median value a a given range\n* @param begin start computation iterator\n* @param end end computation iterator\n* @param[out] min Minimum value of range\n* @param[out] max Maximum value of range\n* @param[out] mean Mean value of range\n* @param[out] median Median value of range\n* @return true if the statistical values can be estimated\n*/\ntemplate <typename Type, typename DataInputIterator>\nbool minMaxMeanMedian( DataInputIterator begin, DataInputIterator end,\n                       Type & min, Type & max, Type & mean, Type & median )\n{\n  if( std::distance( begin, end ) < 1 )\n  {\n    return false;\n  }\n\n  std::vector<Type> vec_val( begin, end );\n  std::sort( vec_val.begin(), vec_val.end() );\n  min = vec_val[0];\n  max = vec_val[vec_val.size() - 1];\n  mean = accumulate( vec_val.begin(), vec_val.end(), Type( 0 ) )\n         / static_cast<Type>( vec_val.size() );\n  median = vec_val[vec_val.size() / 2];\n  return true;\n}\n\n\n/**\n* @brief Display to standard output min, max, mean and median value of input range\n* @param begin start of range\n* @param end end of range\n*/\ntemplate <typename Type, typename DataInputIterator>\nvoid minMaxMeanMedian( DataInputIterator begin, DataInputIterator end )\n{\n  Type min, max, mean, median;\n  minMaxMeanMedian( begin, end, min, max, mean, median );\n  std::cout << \"\\n\"\n            << \"\\t min: \" << min << \"\\n\"\n            << \"\\t mean: \" << mean << \"\\n\"\n            << \"\\t median: \" << median << std::endl\n            << \"\\t max: \" << max << std::endl;\n}\n\n/**\n ** Split a range [ a ; b [ into a set of n ranges :\n [ a ; c1 [ U [ c1 ; c2 [ U ... U [ c(n-1) ; b [\n  **\n  Output range vector only store [ a , c1 , c2 , ... , b ]\n\n ** if input range can't be split (range [a;b[ size is less than nb_split, only return [a;b[ range\n **\n ** @param range_start Start of range to split\n ** @param range_end End of range to split\n ** @param nb_split Number of desired split\n ** @param d_range Output splitted range\n **/\ntemplate < typename T >\nvoid SplitRange( const T range_start , const T range_end , const int nb_split ,\n                 std::vector< T > & d_range )\n{\n  const T range_length = range_end - range_start ;\n  if( range_length < nb_split )\n  {\n    d_range.push_back( range_start ) ;\n    d_range.push_back( range_end ) ;\n  }\n  else\n  {\n    const T delta_range = range_length / nb_split ;\n\n    d_range.push_back( range_start ) ;\n    for( int i = 1 ; i < nb_split ; ++i )\n    {\n      d_range.push_back( range_start + i * delta_range ) ;\n    }\n    d_range.push_back( range_end ) ;\n  }\n}\n\n\n} // namespace aspOpenMVG\n\n\n#endif  // OPENMVG_NUMERIC_NUMERIC_H\n"
  },
  {
    "path": "src/asp/OpenMVG/projection.cpp",
    "content": "\n// Copyright (c) 2010 libmv authors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to\n// deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n// sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n// IN THE SOFTWARE.\n\n// Copyright (c) 2012, 2013 Pierre MOULON.\n\n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include <asp/OpenMVG/projection.hpp>\n\nnamespace aspOpenMVG {\n\n/// Compute P = K[R|t]\nvoid P_From_KRt(\n  const Mat3 &K,  const Mat3 &R,  const Vec3 &t, Mat34 *P) {\n  *P = K * HStack(R,t);\n}\n\nvoid KRt_From_P(const Mat34 &P, Mat3 *Kp, Mat3 *Rp, Vec3 *tp) {\n  // Decompose using the RQ decomposition HZ A4.1.1 pag.579.\n  Mat3 K = P.block(0, 0, 3, 3);\n\n  Mat3 Q;\n  Q.setIdentity();\n\n  // Set K(2,1) to zero.\n  if (K(2,1) != 0) {\n    double c = -K(2,2);\n    double s = K(2,1);\n    double l = sqrt(c * c + s * s);\n    c /= l; s /= l;\n    Mat3 Qx;\n    Qx << 1, 0, 0,\n          0, c, -s,\n          0, s, c;\n    K = K * Qx;\n    Q = Qx.transpose() * Q;\n  }\n  // Set K(2,0) to zero.\n  if (K(2,0) != 0) {\n    double c = K(2,2);\n    double s = K(2,0);\n    double l = sqrt(c * c + s * s);\n    c /= l; s /= l;\n    Mat3 Qy;\n    Qy << c, 0, s,\n          0, 1, 0,\n         -s, 0, c;\n    K = K * Qy;\n    Q = Qy.transpose() * Q;\n  }\n  // Set K(1,0) to zero.\n  if (K(1,0) != 0) {\n    double c = -K(1,1);\n    double s = K(1,0);\n    double l = sqrt(c * c + s * s);\n    c /= l; s /= l;\n    Mat3 Qz;\n    Qz << c,-s, 0,\n          s, c, 0,\n          0, 0, 1;\n    K = K * Qz;\n    Q = Qz.transpose() * Q;\n  }\n\n  Mat3 R = Q;\n\n  //Mat3 H = P.block(0, 0, 3, 3);\n  // RQ decomposition\n  //Eigen::HouseholderQR<Mat3> qr(H);\n  //Mat3 K = qr.matrixQR().triangularView<Eigen::Upper>();\n  //Mat3 R = qr.householderQ();\n\n  // Ensure that the diagonal is positive and R determinant == 1.\n  if (K(2,2) < 0) {\n    K = -K;\n    R = -R;\n  }\n  if (K(1,1) < 0) {\n    Mat3 S;\n    S << 1, 0, 0,\n         0,-1, 0,\n         0, 0, 1;\n    K = K * S;\n    R = S * R;\n  }\n  if (K(0,0) < 0) {\n    Mat3 S;\n    S << -1, 0, 0,\n          0, 1, 0,\n          0, 0, 1;\n    K = K * S;\n    R = S * R;\n  }\n\n  // Compute translation.\n  Eigen::PartialPivLU<Mat3> lu(K);\n  Vec3 t = lu.solve(P.col(3));\n\n  if(R.determinant()<0) {\n    R = -R;\n    t = -t;\n  }\n\n  // scale K so that K(2,2) = 1\n  K = K / K(2,2);\n\n  *Kp = K;\n  *Rp = R;\n  *tp = t;\n}\n\nMat3 F_from_P(const Mat34 & P1, const Mat34 & P2)\n{\n  Mat3 F12;\n\n  using Mat24 = Eigen::Matrix<double, 2, 4>;\n  Mat24 X1 = P1.block<2, 4>(1, 0);\n  Mat24 X2;  X2 << P1.row(2), P1.row(0);\n  Mat24 X3 = P1.block<2, 4>(0, 0);\n  Mat24 Y1 = P2.block<2, 4>(1, 0);\n  Mat24 Y2;  Y2 << P2.row(2), P2.row(0);\n  Mat24 Y3 = P2.block<2, 4>(0, 0);\n\n\n  Mat4 X1Y1, X2Y1, X3Y1, X1Y2, X2Y2, X3Y2, X1Y3, X2Y3, X3Y3;\n  X1Y1 << X1, Y1;  X2Y1 << X2, Y1;  X3Y1 << X3, Y1;\n  X1Y2 << X1, Y2;  X2Y2 << X2, Y2;  X3Y2 << X3, Y2;\n  X1Y3 << X1, Y3;  X2Y3 << X2, Y3;  X3Y3 << X3, Y3;\n\n\n  F12 <<\n    X1Y1.determinant(), X2Y1.determinant(), X3Y1.determinant(),\n    X1Y2.determinant(), X2Y2.determinant(), X3Y2.determinant(),\n    X1Y3.determinant(), X2Y3.determinant(), X3Y3.determinant();\n\n  return F12;\n}\n\nVec2 Project(const Mat34 &P, const Vec3 &X) {\n  return Vec3(P * X.homogeneous()).hnormalized();\n}\n\nvoid Project(const Mat34 &P, const Mat3X &X, Mat2X *x) {\n  x->resize(2, X.cols());\n  for (size_t c = 0; c < static_cast<size_t>(X.cols()); ++c) {\n    x->col(c) = Project(P, Vec3(X.col(c)));\n  }\n}\n\nvoid Project(const Mat34 &P, const Mat4X &X, Mat2X *x) {\n  x->resize(2, X.cols());\n  for (Mat4X::Index c = 0; c < X.cols(); ++c) {\n    const Vec3 hx = P * X.col(c);\n    x->col(c) = hx.hnormalized();\n  }\n}\n\nMat2X Project(const Mat34 &P, const Mat3X &X) {\n  Mat2X x(2, X.cols());\n  Project(P, X, &x);\n  return x;\n}\n\nMat2X Project(const Mat34 &P, const Mat4X &X) {\n  Mat2X x(2, X.cols());\n  Project(P, X, &x);\n  return x;\n}\n\nvoid HomogeneousToEuclidean(const Vec4 &H, Vec3 *X) {\n  double w = H(3);\n  *X << H(0) / w, H(1) / w, H(2) / w;\n}\n\nvoid EuclideanToHomogeneous(const Mat &X, Mat *H) {\n  Mat::Index d = X.rows();\n  Mat::Index n = X.cols();\n  H->resize(d + 1, n);\n  H->block(0, 0, d, n) = X;\n  H->row(d).setOnes();\n}\n\ndouble Depth(const Mat3 &R, const Vec3 &t, const Vec3 &X) {\n  return (R*X)[2] + t[2];\n}\n\nvoid HomogeneousToEuclidean(const Mat &H, Mat *X) {\n  Mat::Index d = H.rows() - 1;\n  Mat::Index n = H.cols();\n  X->resize(d, n);\n  for (Mat::Index i = 0; i < n; ++i) {\n    double h = H(d, i);\n    for (int j = 0; j < d; ++j) {\n      (*X)(j, i) = H(j, i) / h;\n    }\n  }\n}\n\nMat3X EuclideanToHomogeneous(const Mat2X &x) {\n  Mat3X h(3, x.cols());\n  h.block(0, 0, 2, x.cols()) = x;\n  h.row(2).setOnes();\n  return h;\n}\n\nvoid EuclideanToHomogeneous(const Mat2X &x, Mat3X *h) {\n  h->resize(3, x.cols());\n  h->block(0, 0, 2, x.cols()) = x;\n  h->row(2).setOnes();\n}\n\nvoid HomogeneousToEuclidean(const Mat3X &h, Mat2X *e) {\n  e->resize(2, h.cols());\n  e->row(0) = h.row(0).array() / h.row(2).array();\n  e->row(1) = h.row(1).array() / h.row(2).array();\n}\n\nvoid EuclideanToNormalizedCamera(const Mat2X &x, const Mat3 &K, Mat2X *n) {\n  Mat3X x_image_h;\n  EuclideanToHomogeneous(x, &x_image_h);\n  Mat3X x_camera_h = K.inverse() * x_image_h;\n  HomogeneousToEuclidean(x_camera_h, n);\n}\n\nvoid HomogeneousToNormalizedCamera(const Mat3X &x, const Mat3 &K, Mat2X *n) {\n  Mat3X x_camera_h = K.inverse() * x;\n  HomogeneousToEuclidean(x_camera_h, n);\n}\n\n/// Estimates the root mean square error (2D)\ndouble RootMeanSquareError(const Mat2X &x_image,\n  const Mat4X &X_world,\n  const Mat34 &P) {\n    size_t num_points = x_image.cols();\n    Mat2X dx = Project(P, X_world) - x_image;\n    return dx.norm() / num_points;\n}\n\n/// Estimates the root mean square error (2D)\ndouble RootMeanSquareError(const Mat2X &x_image,\n  const Mat3X &X_world,\n  const Mat3 &K,\n  const Mat3 &R,\n  const Vec3 &t) {\n    Mat34 P;\n    P_From_KRt(K, R, t, &P);\n    size_t num_points = x_image.cols();\n    Mat2X dx = Project(P, X_world) - x_image;\n    return dx.norm() / num_points;\n}\n\n} // namespace aspOpenMVG\n"
  },
  {
    "path": "src/asp/OpenMVG/projection.hpp",
    "content": "\n// Copyright (c) 2010 libmv authors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to\n// deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n// sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n// IN THE SOFTWARE.\n\n// Copyright (c) 2012, 2013 Pierre MOULON.\n\n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef OPENMVG_MULTIVIEW_PROJECTION_HPP\n#define OPENMVG_MULTIVIEW_PROJECTION_HPP\n\n#include <asp/OpenMVG/numeric.h>\n\n/// Collection of function related to the classic Projection matrix used\n///  in computer vision. P = K[R|t] with [t]=[-RC] Cf HZ\nnamespace aspOpenMVG\n{\n\n/**\n* @brief Compute P = K[R|t]\n* @param K Intrinsic matrix\n* @param R Rotation matrix\n* @param t Translation vector\n* @param[out] P Projection matrix\n*/\nvoid P_From_KRt( const Mat3 &K, const Mat3 &R, const Vec3 &t, Mat34 *P );\n\n/**\n* Decompose using the RQ decomposition\n* @param P Projection matrix\n* @param[out] Kp Intrinsic matrix\n* @param[out] Rp Rotation matrix\n* @param[out] tp Translation vector\n* @ref Multiple View Geometry - Richard Hartley, Andrew Zisserman - second edition\n* @see  HZ A4.1.1 pag.579.\n*/\nvoid KRt_From_P( const Mat34 &P, Mat3 *Kp, Mat3 *Rp, Vec3 *tp );\n\n/**\n* @brief Compute a fundamental matrix from projection matrices\n* @param P1 Projection matrix of first camera\n* @param P2 Projection matrix of second camera\n* @return Fundamental matrix between the two camera\n*/\nMat3 F_from_P( const Mat34 & P1, const Mat34 & P2 );\n\n/**\n* @brief Compute the depth of the X point. R*X[2]+t[2]\n* @param R Rotation matrix\n* @param t Translation vector\n* @param X 3d points\n* @return Depth of X wtr to the camera center\n*/\ndouble Depth( const Mat3 &R, const Vec3 &t, const Vec3 &X );\n\n/**\n* @brief Compute P*[X|1.0]. Transformed from homogeneous to euclidean coordinates\n* @param P Camera projection matrix\n* @param X Input 3d point\n* @return Projected point\n*/\nVec2 Project( const Mat34 &P, const Vec3 &X );\n\n/**\n* @brief Compute P*[X|1.0] for the X list of point (3D point)\n* @param P Camera projection matrix\n* @param X Input 3d points\n* @param[out] x Projected points\n*/\nvoid Project( const Mat34 &P, const Mat3X &X, Mat2X *x );\n\n/**\n* @brief Compute P*[X|1.0] for the X list of point (4D point)\n* @param P Camera projection matrix\n* @param X Input 4d points\n* @param[out] x Projected points\n*/\nvoid Project( const Mat34 &P, const Mat4X &X, Mat2X *x );\n\n/**\n* @brief Return P*[X|1.0] for the X list of point (3D point)\n* @param P Camera projection matrix\n* @param X Input 3d points\n* @return Projected points\n*/\nMat2X Project( const Mat34 &P, const Mat3X &X );\n\n/**\n* @brief Return P*[X|1.0] for the X list of point (4D point)\n* @param P Camera projection matrix\n* @param X Input 4d points\n* @return Projected points\n*/\nMat2X Project( const Mat34 &P, const Mat4X &X );\n\n\n/**\n* @brief Change homogeneous coordinates to euclidean\n* @param H Input 4d point\n* @param[out] X Output 3d point\n*/\nvoid HomogeneousToEuclidean( const Vec4 &H, Vec3 *X );\n\n/**\n* @brief Change euclidean coordinates to homogeneous\n* @param X Input points\n* @param H Output points\n*/\nvoid EuclideanToHomogeneous( const Mat &X, Mat *H );\n\n/**\n* @brief Change homogeneous to euclidean\n* @param H Input homogeneous Points\n* @param[out] Output euclidean points\n*/\nvoid HomogeneousToEuclidean( const Mat &H, Mat *X );\n\n/**\n* @brief Change euclidean to homogenous\n* @param x Input 2d points\n* @return Output 3d homogeneous points\n*/\nMat3X EuclideanToHomogeneous( const Mat2X &x );\n\n/**\n* @brief Change euclidean to homogenous\n* @param x Input 2d points\n* @param[out] h Output 3d homogeneous points\n*/\nvoid EuclideanToHomogeneous( const Mat2X &x, Mat3X *h );\n\n/**\n* @brief Change homogenous to euclidean\n* @param x Input 3d homogeneous points\n* @param[out] e Output 2d euclidean points\n*/\nvoid HomogeneousToEuclidean( const Mat3X &h, Mat2X *e );\n\n/**\n* @brief Project x point in camera coordinates\n* @param x Input list of 2d points\n* @param K intrinsic matrix\n* @param[out] n Normalized points in camera plane frame\n*/\nvoid EuclideanToNormalizedCamera( const Mat2X &x, const Mat3 &K, Mat2X *n );\n\n/**\n* @brief Project x point in camera coordinates\n* @param x Input list of (homogeneous) 3d points\n* @param K intrinsic matrix\n* @param[out] n Normalized points in camera plane frame\n*/\nvoid HomogeneousToNormalizedCamera( const Mat3X &x, const Mat3 &K, Mat2X *n );\n\n/**\n* @brief Estimates the root mean square error (2D)\n* @param x_image Points in image frame\n* @param X_world Points in world frame\n* @param P Projection matrix\n* @return RMS of projection error\n*/\ndouble RootMeanSquareError( const Mat2X &x_image,\n                            const Mat4X &X_world,\n                            const Mat34 &P );\n\n/**\n* @brief Estimates the root mean square error (2D)\n* @param x_image Points in image frame\n* @param X_world Points in world frame\n* @param K Intrinsic matrix\n* @param R Rotation matrix\n* @param t translation vector\n* @note KRt defines a projection\n*/\ndouble RootMeanSquareError( const Mat2X &x_image,\n                            const Mat3X &X_world,\n                            const Mat3 &K,\n                            const Mat3 &R,\n                            const Vec3 &t );\n\n} // namespace aspOpenMVG\n\n#endif // OPENMVG_MULTIVIEW_PROJECTION_HPP\n"
  },
  {
    "path": "src/asp/OpenMVG/tracks.hpp",
    "content": "\n// Copyright (c) 2012, 2013 Pierre MOULON.\n\n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n// Implementation of [1] an efficient algorithm to compute track from pairwise\n//  correspondences.\n//\n//  [1] Pierre Moulon and Pascal Monasse,\n//    \"Unordered feature tracking made fast and easy\" CVMP 2012.\n//\n// It tracks the position of features along the series of image from pairwise\n//  correspondences.\n//\n// From map< [imageI,ImageJ], [indexed matches array] > it builds tracks.\n//\n// Usage :\n//  PairWiseMatches map_Matches;\n//  PairedIndMatchImport(sMatchFile, map_Matches); // Load series of pairwise matches\n//  //---------------------------------------\n//  // Compute tracks from matches\n//  //---------------------------------------\n//  TracksBuilder tracksBuilder;\n//  tracks::STLMAPTracks map_tracks;\n//  tracksBuilder.Build(map_Matches); // Build: Efficient fusion of correspondences\n//  tracksBuilder.Filter();           // Filter: Remove tracks that have conflict\n//  tracksBuilder.ExportToSTL(map_tracks); // Build tracks with STL compliant type\n//\n\n#ifndef OPENMVG_TRACKS_TRACKS_HPP\n#define OPENMVG_TRACKS_TRACKS_HPP\n\n#include <asp/OpenMVG/indMatch.hpp>\n#include <asp/OpenMVG/flat_pair_map.hpp>\n#include <asp/OpenMVG/union_find.hpp>\n\n#include <algorithm>\n#include <cstdint>\n#include <functional>\n#include <map>\n#include <memory>\n#include <set>\n#include <vector>\n\nnamespace aspOpenMVG  {\n\nusing namespace aspOpenMVG::matching;\n\nnamespace tracks  {\n\n// Data structure to store a track: collection of {ImageId,FeatureId}\n//  The corresponding image points with their imageId and FeatureId.\nusing submapTrack = std::map<uint32_t,uint32_t>;\n// A track is a collection of {trackId, submapTrack}\nusing STLMAPTracks = std::map< size_t, submapTrack >;\n\nstruct TracksBuilder\n{\n  using indexedFeaturePair = std::pair<uint32_t, uint32_t>;\n\n  flat_pair_map<indexedFeaturePair, uint32_t> map_node_to_index;\n  UnionFind uf_tree;\n\n  /// Build tracks for a given series of pairWise matches\n  void Build( const PairWiseMatches &  map_pair_wise_matches)\n  {\n    // 1. We need to know how much single set we will have.\n    //   i.e each set is made of a tuple : (imageIndex, featureIndex)\n    using SetIndexedPair = std::set<indexedFeaturePair>;\n    SetIndexedPair allFeatures;\n    // For each couple of images list the used features\n    for ( const auto & iter : map_pair_wise_matches )\n    {\n      const auto & I = iter.first.first;\n      const auto & J = iter.first.second;\n      const std::vector<IndMatch> & vec_FilteredMatches = iter.second;\n\n      // Retrieve all shared features and add them to a set\n      for ( const auto & cur_filtered_match : vec_FilteredMatches )\n      {\n        allFeatures.emplace(I,cur_filtered_match.i_);\n        allFeatures.emplace(J,cur_filtered_match.j_);\n      }\n    }\n\n    // 2. Build the 'flat' representation where a tuple (the node)\n    //  is attached to a unique index.\n    map_node_to_index.reserve(allFeatures.size());\n    unsigned int cpt = 0;\n    for (const auto & feat : allFeatures)\n    {\n      map_node_to_index.emplace_back(feat, cpt);\n      ++cpt;\n    }\n    // Sort the flat_pair_map\n    map_node_to_index.sort();\n    // Clean some memory\n    allFeatures.clear();\n\n    // 3. Add the node and the pairwise correpondences in the UF tree.\n    uf_tree.InitSets(map_node_to_index.size());\n\n    // 4. Union of the matched features corresponding UF tree sets\n    for ( const auto & iter : map_pair_wise_matches )\n    {\n      const auto & I = iter.first.first;\n      const auto & J = iter.first.second;\n      const std::vector<IndMatch> & vec_FilteredMatches = iter.second;\n      for (const IndMatch & match : vec_FilteredMatches)\n      {\n        const indexedFeaturePair pairI(I, match.i_);\n        const indexedFeaturePair pairJ(J, match.j_);\n        // Link feature correspondences to the corresponding containing sets.\n        uf_tree.Union(map_node_to_index[pairI], map_node_to_index[pairJ]);\n      }\n    }\n  }\n\n  /// Remove bad tracks (too short or track with ids collision)\n  bool Filter(size_t nLengthSupTo = 2)\n  {\n    // Remove bad tracks:\n    // - track that are too short,\n    // - track with id conflicts:\n    //    i.e. tracks that have many times the same image index\n\n    // From the UF tree, create tracks of the image indexes.\n    //  If an image index appears two time the track must disappear\n    //  If a track is too short it has to be removed.\n    std::map<unsigned int, std::set<unsigned int> > tracks;\n\n    std::set<unsigned int> problematic_track_id;\n    // Build tracks from the UF tree, track problematic ids.\n    for (unsigned int k = 0; k < map_node_to_index.size(); ++k)\n    {\n      const unsigned int & track_id = uf_tree.m_cc_parent[k];\n      if (problematic_track_id.count(track_id) != 0)\n        continue; // Track already marked\n\n      const auto & feat = map_node_to_index[k];\n\n      if (tracks[track_id].count(feat.first.first))\n      {\n        problematic_track_id.insert(track_id);\n      }\n      else\n      {\n        tracks[track_id].insert(feat.first.first);\n      }\n    }\n\n    // - track that are too short,\n    for (const auto & val : tracks)\n    {\n      if (val.second.size() < nLengthSupTo)\n      {\n        problematic_track_id.insert(val.first);\n      }\n    }\n\n    for (unsigned int & root_index : uf_tree.m_cc_parent)\n    {\n      if (problematic_track_id.count(root_index) > 0)\n      {\n        // reset selected root\n        uf_tree.m_cc_size[root_index] = 1;\n        root_index = std::numeric_limits<unsigned int>::max();\n      }\n    }\n    return false;\n  }\n\n  /// Return the number of connected set in the UnionFind structure (tree forest)\n  size_t NbTracks() const\n  {\n    std::set<unsigned int> parent_id(uf_tree.m_cc_parent.begin(), uf_tree.m_cc_parent.end());\n    // Erase the \"special marker\" that depicted rejected tracks\n    parent_id.erase(std::numeric_limits<unsigned int>::max());\n    return parent_id.size();\n  }\n\n  /// Export tracks as a map (each entry is a sequence of imageId and featureIndex):\n  ///  {TrackIndex => {(imageIndex, featureIndex), ... ,(imageIndex, featureIndex)}\n  void ExportToSTL(STLMAPTracks & map_tracks)\n  {\n    map_tracks.clear();\n    for (unsigned int k = 0; k < map_node_to_index.size(); ++k)\n    {\n      const auto & feat = map_node_to_index[k];\n      const unsigned int track_id = uf_tree.m_cc_parent[k];\n      if\n      (\n        // ensure never add rejected elements (track marked as invalid)\n        track_id != std::numeric_limits<unsigned int>::max()\n        // ensure never add 1-length track element (it's not a track)\n        && uf_tree.m_cc_size[track_id] > 1\n      )\n      {\n        map_tracks[track_id].insert(feat.first);\n      }\n    }\n  }\n};\n\nstruct TracksUtilsMap\n{\n  /**\n   * @brief Find common tracks between images.\n   *\n   * @param[in] set_imageIndex: set of images we are looking for common tracks\n   * @param[in] map_tracksIn: all tracks of the scene\n   * @param[out] map_tracksOut: output with only the common tracks\n   */\n  static bool GetTracksInImages\n  (\n    const std::set<size_t> & set_imageIndex,\n    const STLMAPTracks & map_tracksIn,\n    STLMAPTracks & map_tracksOut\n  )\n  {\n    map_tracksOut.clear();\n\n    // Go along the tracks\n    for ( const auto & iterT : map_tracksIn )\n    {\n      // Look if the track contains the provided view index & save the point ids\n      submapTrack map_temp;\n      bool bTest = true;\n      for (auto iterIndex = set_imageIndex.begin();\n        iterIndex != set_imageIndex.end() && bTest; ++iterIndex)\n      {\n        auto iterSearch = iterT.second.find(*iterIndex);\n        if (iterSearch != iterT.second.end())\n          map_temp[iterSearch->first] = iterSearch->second;\n        else\n          bTest = false;\n      }\n\n      if (!map_temp.empty() && map_temp.size() == set_imageIndex.size())\n        map_tracksOut[iterT.first] = std::move(map_temp);\n    }\n    return !map_tracksOut.empty();\n  }\n\n  /// Return the tracksId as a set (sorted increasing)\n  static void GetTracksIdVector\n  (\n    const STLMAPTracks & map_tracks,\n    std::set<size_t> * set_tracksIds\n  )\n  {\n    set_tracksIds->clear();\n    for ( const auto & iterT : map_tracks )\n    {\n      set_tracksIds->insert(iterT.first);\n    }\n  }\n\n  /// Get feature index PerView and TrackId\n  static bool GetFeatIndexPerViewAndTrackId\n  (\n    const STLMAPTracks & map_tracks,\n    const std::set<size_t> & set_trackId,\n    size_t nImageIndex,\n    std::vector<size_t> * pvec_featIndex\n  )\n  {\n    for (const size_t & trackId: set_trackId)\n    {\n      STLMAPTracks::const_iterator iterT = map_tracks.find(trackId);\n      if (iterT != map_tracks.end())\n      {\n        //try to find imageIndex\n        const submapTrack & map_ref = iterT->second;\n        submapTrack::const_iterator iterSearch = map_ref.find(nImageIndex);\n        if (iterSearch != map_ref.end())\n        {\n          pvec_featIndex->emplace_back(iterSearch->second);\n        }\n      }\n    }\n    return !pvec_featIndex->empty();\n  }\n\n  struct FunctorMapFirstEqual {\n    size_t id;\n    FunctorMapFirstEqual(size_t val):id(val){};\n    bool operator()(const std::pair<size_t, submapTrack > & val) {\n      return (id == val.first);\n    }\n  };\n\n  /**\n   * @brief Convert a trackId to a vector of indexed Matches.\n   *\n   * @param[in]  map_tracks: set of tracks with only 2 elements\n   *             (image A and image B) in each submapTrack.\n   * @param[in]  vec_filterIndex: the track indexes to retrieve.\n   *             Only track indexes contained in this filter vector are kept.\n   * @param[out] pvec_index: list of matches\n   *             (feature index in image A, feature index in image B).\n   *\n   * @warning The input tracks must be composed of only two images index.\n   * @warning Image index are considered sorted (increasing order).\n   */\n  static void TracksToIndexedMatches\n  (\n    const STLMAPTracks & map_tracks,\n    const std::vector<IndexT> & vec_filterIndex,\n    std::vector<IndMatch> * pvec_index\n  )\n  {\n\n    std::vector<IndMatch> & vec_indexref = *pvec_index;\n    vec_indexref.clear();\n    for ( const auto & filter_index : vec_filterIndex )\n    {\n      // Retrieve the track information from the current index i.\n      auto itF =\n        find_if(map_tracks.begin(), map_tracks.end(), FunctorMapFirstEqual( filter_index ) ) ;\n      // The current track.\n      const submapTrack & map_ref = itF->second;\n\n      // We have 2 elements for a track.\n      assert(map_ref.size() == 2);\n      const IndexT indexI = (map_ref.begin())->second;\n      const IndexT indexJ = (++map_ref.begin())->second;\n\n      vec_indexref.emplace_back(indexI, indexJ);\n    }\n  }\n\n  /// Return the occurrence of tracks length.\n  static void TracksLength\n  (\n    const STLMAPTracks & map_tracks,\n    std::map<size_t, size_t> & map_Occurence_TrackLength\n  )\n  {\n    for ( const auto & iterT : map_tracks )\n    {\n      const size_t trLength = iterT.second.size();\n      if (map_Occurence_TrackLength.end() ==\n        map_Occurence_TrackLength.find(trLength))\n      {\n        map_Occurence_TrackLength[trLength] = 1;\n      }\n      else\n      {\n        map_Occurence_TrackLength[trLength] += 1;\n      }\n    }\n  }\n\n  /// Return a set containing the image Id considered in the tracks container.\n  static void ImageIdInTracks\n  (\n    const STLMAPTracks & map_tracks,\n    std::set<size_t> & set_imagesId\n  )\n  {\n    for ( const auto & iterT : map_tracks )\n    {\n      const submapTrack & map_ref = iterT.second;\n      for ( const auto & iter : map_ref )\n      {\n        set_imagesId.insert(iter.first);\n      }\n    }\n  }\n};\n\n} // namespace tracks\n} // namespace aspOpenMVG\n\n#endif // OPENMVG_TRACKS_TRACKS_HPP\n"
  },
  {
    "path": "src/asp/OpenMVG/triangulation.cpp",
    "content": "\n// Copyright (c) 2010 libmv authors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to\n// deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n// sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n// IN THE SOFTWARE.\n\n// Copyright (c) 2012, 2013 Pierre MOULON.\n\n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include <asp/OpenMVG/projection.hpp>\n#include <asp/OpenMVG/triangulation.hpp>\n\nnamespace aspOpenMVG {\n\n// HZ 12.2 pag.312\nvoid TriangulateDLT(const Mat34 &P1, const Vec2 &x1,\n                    const Mat34 &P2, const Vec2 &x2,\n                    Vec4 *X_homogeneous) {\n  Mat4 design;\n  for (int i = 0; i < 4; ++i) {\n    design(0,i) = x1[0] * P1(2,i) - P1(0,i);\n    design(1,i) = x1[1] * P1(2,i) - P1(1,i);\n    design(2,i) = x2[0] * P2(2,i) - P2(0,i);\n    design(3,i) = x2[1] * P2(2,i) - P2(1,i);\n  }\n  Nullspace(&design, X_homogeneous);\n}\n\nvoid TriangulateDLT(const Mat34 &P1, const Vec2 &x1,\n                    const Mat34 &P2, const Vec2 &x2,\n                    Vec3 *X_euclidean) {\n  Vec4 X_homogeneous;\n  TriangulateDLT(P1, x1, P2, x2, &X_homogeneous);\n  HomogeneousToEuclidean(X_homogeneous, X_euclidean);\n}\n\n}  // namespace aspOpenMVG\n"
  },
  {
    "path": "src/asp/OpenMVG/triangulation.hpp",
    "content": "\n// Copyright (c) 2010 libmv authors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to\n// deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n// sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n// IN THE SOFTWARE.\n\n// Copyright (c) 2012, 2013 Pierre MOULON.\n\n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef OPENMVG_MULTIVIEW_TRIANGULATION_HPP\n#define OPENMVG_MULTIVIEW_TRIANGULATION_HPP\n\n#include <asp/OpenMVG/numeric.h>\n\nnamespace aspOpenMVG\n{\n\n/**\n* @brief Linear DLT triangulation\n* @brief P1 First camera projection matrix\n* @param P2 Second camera projection matrix\n* @param x1 Point in first camera\n* @param x2 Point in second camera\n* @param[out] X_homogeneous Homogeneous triangulated point\n* @see HZ 12.2 pag.312\n* @ref Multiple View Geometry - Richard Hartley, Andrew Zisserman - second edition\n*/\nvoid TriangulateDLT( const Mat34 &P1, const Vec2 &x1,\n                     const Mat34 &P2, const Vec2 &x2,\n                     Vec4 *X_homogeneous );\n\n/**\n* @brief Linear DLT triangulation\n* @brief P1 First camera projection matrix\n* @param P2 Second camera projection matrix\n* @param x1 Point in first camera\n* @param x2 Point in second camera\n* @param[out] X_euclidean Euclidean triangulated point\n* @see HZ 12.2 pag.312\n* @ref Multiple View Geometry - Richard Hartley, Andrew Zisserman - second edition\n*/\nvoid TriangulateDLT( const Mat34 &P1, const Vec2 &x1,\n                     const Mat34 &P2, const Vec2 &x2,\n                     Vec3 *X_euclidean );\n\n} // namespace aspOpenMVG\n\n#endif  // OPENMVG_MULTIVIEW_TRIANGULATION_HPP\n"
  },
  {
    "path": "src/asp/OpenMVG/triangulation_nview.cpp",
    "content": "\n// Copyright (c) 2010 libmv authors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to\n// deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n// sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n// IN THE SOFTWARE.\n\n// Copyright (c) 2012, 2013 Pierre MOULON.\n\n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include <asp/OpenMVG/projection.hpp>\n#include <asp/OpenMVG/triangulation_nview.hpp>\n\nnamespace aspOpenMVG {\n\n  void TriangulateNView(const Mat2X &x,\n    const std::vector< Mat34 > &Ps,\n    Vec4 *X) {\n      const Mat2X::Index nviews = x.cols();\n      assert(static_cast<size_t>(nviews) == Ps.size());\n\n      Mat design = Mat::Zero(3*nviews, 4 + nviews);\n      for (int i = 0; i < nviews; i++) {\n        design.block<3, 4>(3*i, 0) = -Ps[i];\n        design(3*i + 0, 4 + i) = x(0, i);\n        design(3*i + 1, 4 + i) = x(1, i);\n        design(3*i + 2, 4 + i) = 1.0;\n      }\n      Vec X_and_alphas;\n      Nullspace(&design, &X_and_alphas);\n      *X = X_and_alphas.head(4);\n  }\n\n  using Mat23 = Eigen::Matrix<double, 2, 3>;\n  inline Mat23 SkewMatMinimal(const Vec2 &x) {\n    Mat23 skew;\n    skew <<\n      0, -1,  x(1),\n      1, 0, -x(0);\n    return skew;\n  }\n\n  void TriangulateNViewAlgebraic(const Mat2X &x,\n    const std::vector< Mat34 > &Ps,\n    Vec4 *X) {\n      const Mat2X::Index nviews = x.cols();\n      assert(static_cast<size_t>(nviews) == Ps.size());\n\n      Mat design(2*nviews, 4);\n      for (int i = 0; i < nviews; i++) {\n        design.block<2, 4>(2*i, 0) = SkewMatMinimal(x.col(i)) * Ps[i];\n      }\n      Nullspace(&design, X);\n  }\n\n  void Triangulation::add\n  (\n    const Mat34& projMatrix,\n    const Vec2 & p\n  )\n  {\n    views.emplace_back( projMatrix, p );\n  }\n\n  size_t Triangulation::size() const\n  {\n    return views.size();\n  }\n\n  void Triangulation::clear()\n  {\n    views.clear();\n  }\n\n  double Triangulation::error(const Vec3 &X) const\n  {\n    double squared_reproj_error = 0.0;\n    for (std::size_t i=0;i<views.size();i++)\n    {\n      const Mat34& PMat = views[i].first;\n      const Vec2 & xy = views[i].second;\n      squared_reproj_error += (xy - Project(PMat, X)).norm();\n    }\n    return squared_reproj_error;\n  }\n\n  // Camera triangulation using the iterated linear method\n  Vec3 Triangulation::compute(int iter) const\n  {\n    const int nviews = int(views.size());\n    assert(nviews>=2);\n\n    // Iterative weighted linear least squares\n    Mat3 AtA;\n    Vec3 Atb, X;\n    Vec weights = Vec::Constant(nviews,1.0);\n    for (int it=0;it<iter;++it)\n    {\n      AtA.fill(0.0);\n      Atb.fill(0.0);\n      for (int i=0;i<nviews;++i)\n      {\n        const Mat34& PMat = views[i].first;\n        const Vec2 & p = views[i].second;\n        const double w = weights[i];\n\n        Vec3 v1, v2;\n        for (int j=0;j<3;j++)\n        {\n          v1[j] = w * ( PMat(0,j) - p(0) * PMat(2,j) );\n          v2[j] = w * ( PMat(1,j) - p(1) * PMat(2,j) );\n          Atb[j] += w * ( v1[j] * ( p(0) * PMat(2,3) - PMat(0,3) )\n                 + v2[j] * ( p(1) * PMat(2,3) - PMat(1,3) ) );\n        }\n\n        for (int k=0;k<3;k++)\n        {\n          for (int j=0;j<=k;j++)\n          {\n            const double v = v1[j] * v1[k] + v2[j] * v2[k];\n            AtA(j,k) += v;\n            if (j<k) AtA(k,j) += v;\n          }\n        }\n      }\n\n      X = AtA.inverse() * Atb;\n\n      // Compute reprojection error, min and max depth, and update weights\n      zmin = std::numeric_limits<double>::max();\n      zmax = - std::numeric_limits<double>::max();\n      err = 0.0;\n      for (int i=0;i<nviews;++i)\n      {\n        const Mat34& PMat = views[i].first;\n        const Vec2 & p = views[i].second;\n        const Vec3 xProj = PMat * X.homogeneous();\n        const double z = xProj(2);\n        if (z < zmin) zmin = z;\n        else if (z > zmax) zmax = z;\n        err += (p - xProj.hnormalized()).norm(); // residual error\n        weights[i] = 1.0 / z;\n      }\n    }\n    return X;\n  }\n\n\n}  // namespace aspOpenMVG\n"
  },
  {
    "path": "src/asp/OpenMVG/triangulation_nview.hpp",
    "content": "\n// Copyright (c) 2010 libmv authors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to\n// deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n// sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n// IN THE SOFTWARE.\n\n// Copyright (c) 2012, 2013 Pierre MOULON.\n\n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef OPENMVG_MULTIVIEW_TRIANGULATION_NVIEW_HPP\n#define OPENMVG_MULTIVIEW_TRIANGULATION_NVIEW_HPP\n\n#include <asp/OpenMVG/numeric.h>\n\nnamespace aspOpenMVG {\n\n  /// Compute a 3D position of a point from several images of it. In particular,\n  ///  compute the projective point X in R^4 such that x = PX.\n  /// Algorithm is the standard DLT; for derivation see appendix of Keir's thesis.\n  void TriangulateNView(\n    const Mat2X &x, // x's are 2D coordinates (x,y,1) in each image\n    const std::vector< Mat34 > &Ps, // Ps are projective cameras\n    Vec4 *X);\n\n  // This method uses the algebraic distance approximation.\n  // Note that this method works better when the 2D points are normalized\n  // with an isotopic normalization.\n  void TriangulateNViewAlgebraic(\n    const Mat2X &x, // x's are 2D coordinates (x,y,1) in each image\n    const std::vector< Mat34 > &Ps, // Ps are projective cameras.\n    Vec4 *X);\n\n  //Iterated linear method\n  class Triangulation\n  {\n    public:\n\n    size_t size() const;\n\n    void clear();\n\n    void add\n    (\n      const Mat34& projMatrix,\n      const Vec2 & p\n    );\n\n    // Return squared L2 sum of error\n    double error(const Vec3 &X) const;\n\n    // Compute the corresponding 3D point\n    Vec3 compute(int iter = 3) const;\n\n    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n    // Accessors\n\n    // These values are defined after a successful call to compute\n    double minDepth() const { return zmin; }\n    double maxDepth() const { return zmax; }\n    double error()    const { return err; }\n\n    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n    // Data members\n\n    protected:\n      mutable double zmin; // min depth, mutable since modified in compute(...) const;\n      mutable double zmax; // max depth, mutable since modified in compute(...) const;\n      mutable double err;  // re-projection error, mutable since modified in compute(...) const;\n      std::vector< std::pair<Mat34, Vec2> > views; // Proj matrix and associated image point\n  };\n\n}  // namespace aspOpenMVG\n\n#endif  // OPENMVG_MULTIVIEW_TRIANGULATION_NVIEW_HPP\n"
  },
  {
    "path": "src/asp/OpenMVG/types.hpp",
    "content": "// Copyright (c) 2015 Pierre MOULON.\n\n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef OPENMVG_TYPES_HPP\n#define OPENMVG_TYPES_HPP\n\n#include <Eigen/Core>\n\n#include <cstdint>\n#include <limits>\n#include <map>\n#include <set>\n#include <vector>\n\n/**\n* @brief Main namespace of openMVG API\n*/\nnamespace aspOpenMVG\n{\n\n/// Portable type used to store an index\nusing IndexT = uint32_t;\n\n/// Portable value used to save an undefined index value\nstatic const IndexT UndefinedIndexT = std::numeric_limits<IndexT>::max();\n\n/// Standard Pair of IndexT\nusing Pair = std::pair<IndexT, IndexT>;\n\n/// Set of Pair\nusing Pair_Set = std::set<Pair>;\n\n/// Vector of Pair\nusing Pair_Vec = std::vector<Pair>;\n\n} // namespace aspOpenMVG\n\n#endif  // OPENMVG_TYPES_HPP\n"
  },
  {
    "path": "src/asp/OpenMVG/union_find.hpp",
    "content": "\n// Copyright (c) 2016 Pierre MOULON.\n\n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef OPENMVG_TRACKS_UNION_FIND_DISJOINT_SET_HPP\n#define OPENMVG_TRACKS_UNION_FIND_DISJOINT_SET_HPP\n\n#include <numeric>\n#include <vector>\n\nnamespace aspOpenMVG  {\n\n// Union-Find/Disjoint-Set data structure\n//--\n// A disjoint-set data structure also called a union–find data structure\n// or merge–find set, is a data structure that keeps track of a set of elements\n// partitioned into a number of disjoint (non-overlapping) subsets.\n// It supports two operations:\n// - Find: Determine which subset a particular element is in.\n//   - It returns an item from this set that serves as its \"representative\";\n// - Union: Join two subsets into a single subset.\n// Sometime a Connected method is implemented:\n// - Connected:\n//   - By comparing the result of two Find operations, one can determine whether\n//      two elements are in the same subset.\n//--\nstruct UnionFind\n{\n  // Represent the DS/UF forest thanks to two array:\n  // A parent 'pointer tree' where each node holds a reference to its parent node\n  std::vector<unsigned int> m_cc_parent;\n  // A rank array used for union by rank\n  std::vector<unsigned int> m_cc_rank;\n  // A 'size array' to know the size of each connected component\n  std::vector<unsigned int> m_cc_size;\n\n  // Init the UF structure with num_cc nodes\n  void InitSets\n  (\n    const unsigned int num_cc\n  )\n  {\n    // all set size are 1 (independent nodes)\n    m_cc_size.resize(num_cc, 1);\n    // Parents id have their own CC id {0,n}\n    m_cc_parent.resize(num_cc);\n    std::iota(m_cc_parent.begin(), m_cc_parent.end(), 0);\n    // Rank array (0)\n    m_cc_rank.resize(num_cc, 0);\n  }\n\n  // Return the number of nodes that have been initialized in the UF tree\n  unsigned int GetNumNodes() const\n  {\n    return m_cc_size.size();\n  }\n\n  // Return the representative set id of I nth component\n  unsigned int Find\n  (\n    unsigned int i\n  )\n  {\n    // Recursively set all branch as children of root (Path compression)\n    if (m_cc_parent[i] != i)\n        m_cc_parent[i] = Find(m_cc_parent[i]);\n     return m_cc_parent[i];\n  }\n\n  // Replace sets containing I and J with their union\n  void Union\n  (\n    unsigned int i,\n    unsigned int j\n  )\n  {\n    i = Find(i);\n    j = Find(j);\n    if (i==j)\n    { // Already in the same set. Nothing to do\n      return;\n    }\n\n    // x and y are not already in same set. Merge them.\n    // Perform an union by rank:\n    //  - always attach the smaller tree to the root of the larger tree\n    if (m_cc_rank[i] < m_cc_rank[j])\n    {\n      m_cc_parent[i] = j;\n      m_cc_size[j] += m_cc_size[i];\n    }\n    else\n    {\n      m_cc_parent[j] = i;\n      m_cc_size[i] += m_cc_size[j];\n      if (m_cc_rank[i] > m_cc_rank[j])\n        ++m_cc_rank[i];\n    }\n  }\n};\n\n} // namespace aspOpenMVG\n\n#endif // OPENMVG_TRACKS_UNION_FIND_DISJOINT_SET_HPP\n"
  },
  {
    "path": "src/asp/PcAlign/CMakeLists.txt",
    "content": "# Use wrapper function at this level to avoid code duplication\n\nadd_library_wrapper(AspPcAlign \"${ASP_PC_ALIGN_SRC_FILES}\" \"${ASP_PC_ALIGN_TEST_FILES}\"\n    \"${ASP_PC_ALIGN_LIB_DEPENDENCIES}\")\n\n# This must be built with C++14 as otherwise it fails. Must be set\n# after the standard is set for the entire library.\nset_source_files_properties(\n    pc_align_fgr.cc\n    PROPERTIES\n    CXX_STANDARD_REQUIRED ON\n    CXX_EXTENSIONS OFF # Keep consistent if desired\n    COMPILE_FLAGS \"-std=c++14\"\n)\n\n"
  },
  {
    "path": "src/asp/PcAlign/MaskedImageAlgs.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file MaskedImageAlgs.cc\n///\n/// Algorithms that operate on masked float images. All computations are with\n/// double precision, for better accuracy.\n///\n#include <asp/PcAlign/MaskedImageAlgs.h>\n#include <vw/Image/PixelMask.h>\n#include <vw/Math/Functors.h>\n#include <vw/Math/Statistics.h>\n#include <vw/Core/Exception.h>\n\n#include <omp.h>\n\nnamespace vw {\n\n// Find the valid pixels. Use long long, to avoid integer overflow.\nlong long validCount(vw::ImageView<vw::PixelMask<float>> const& img) {\n  \n  long long count = 0;\n  for (int col = 0; col < img.cols(); col++) {\n    for (int row = 0; row < img.rows(); row++) {\n      if (is_valid(img(col, row)))\n        count++;\n    }\n  }\n  \n  return count;\n}\n\n// Compute the median of the valid pixels\ndouble maskedMedian(vw::ImageView<vw::PixelMask<float>> const& img) {\n\n  // Allocate enough space first  \n  std::vector<float> vals(img.cols()*img.rows());\n  vals.clear();\n  \n  for (int col = 0; col < img.cols(); col++) {\n    for (int row = 0; row < img.rows(); row++) {\n      if (is_valid(img(col, row)))\n        vals.push_back(img(col, row).child());\n    }\n  }\n  \n  if (vals.empty())\n    vw::vw_throw(vw::ArgumentErr() << \"No valid pixels found in median calculation.\\n\");\n  \n  return vw::math::destructive_median(vals);\n}\n\n// Comput normalized median absolute deviation\ndouble normalizedMad(vw::ImageView<vw::PixelMask<float>> const& img, \n                     double median) {\n  \n  // Compute the median absolute deviation\n  std::vector<float> vals(img.cols()*img.rows());\n  vals.clear();\n  for (int col = 0; col < img.cols(); col++) {\n    for (int row = 0; row < img.rows(); row++) {\n      if (is_valid(img(col, row)))\n        vals.push_back(std::abs(img(col, row).child() - median));\n    }\n  }\n  \n  if (vals.empty())\n    vw::vw_throw(vw::ArgumentErr() << \"No valid pixels found in MAD calculation.\\n\");\n  \n  double mad = vw::math::destructive_median(vals);\n\n  // The normalization factor is to make this equivalent to the standard deviation  \n  return  1.4826 * mad;\n}\n\n// Find the mean of valid pixels\ndouble maskedMean(vw::ImageView<vw::PixelMask<float>> const& img) {\n  \n  double sum = 0.0;\n  long long count = 0;\n  for (int col = 0; col < img.cols(); col++) {\n    for (int row = 0; row < img.rows(); row++) {\n      if (is_valid(img(col, row))) {\n        sum += img(col, row).child();\n        count++;\n      }\n    }\n  }\n  \n  if (count == 0)\n    return 0.0;\n  \n  return sum / count;\n}\n\n// Find the std dev of valid pixels\ndouble maskedStdDev(vw::ImageView<vw::PixelMask<float>> const& img, double mean) {\n  \n  double sum = 0.0;\n  long long count = 0;\n  for (int col = 0; col < img.cols(); col++) {\n    for (int row = 0; row < img.rows(); row++) {\n      if (is_valid(img(col, row))) {\n        sum += (img(col, row).child() - mean) * (img(col, row).child() - mean);\n        count++;\n      }\n    }\n  }\n  \n  if (count == 0)\n    return 0.0;\n  \n  return sqrt(sum / count);\n}\n  \n// Filter outside this range\nvoid rangeFilter(vw::ImageView<vw::PixelMask<float>> & diff, \n                 double min_val, double max_val) {\n\n  #pragma omp parallel for\n  for (int col = 0; col < diff.cols(); col++) {\n    for (int row = 0; row < diff.rows(); row++) {\n      if (is_valid(diff(col, row)) && \n          (diff(col, row).child() < min_val || diff(col, row).child() > max_val))\n        diff(col, row).invalidate();\n    }\n  }\n}\n\n// Invalidate pixels in first image that are invalid in second image\nvoid intersectValid(vw::ImageView<vw::PixelMask<float>> & img1, \n                    vw::ImageView<vw::PixelMask<float>> const& img2) {\n  \n  #pragma omp parallel for\n  for (int col = 0; col < img1.cols(); col++) {\n    for (int row = 0; row < img1.rows(); row++) {\n      if (!is_valid(img2(col, row)))\n        img1(col, row).invalidate();\n    }\n  }\n}\n\n// Filter by normalized median absolute deviation with given factor\nvoid madFilter(vw::ImageView<vw::PixelMask<float>> & diff, double outlierFactor) {\n  \n  double median = maskedMedian(diff);\n  double mad = normalizedMad(diff, median);\n  double min_val = median - outlierFactor * mad;\n  double max_val = median + outlierFactor * mad;\n  rangeFilter(diff, min_val, max_val);\n}\n\n// Group y-values into bins based on their corresponding x-values and computes\n// a statistic (like mean, sum, etc.) for each bin. This reimplements\n// scipy.stats.binned_statistic. Do not return bin number, as we don't need it.\n// Also some stats that are not needed were not implemented.\nvoid binnedStatistics(vw::ImageView<vw::PixelMask<float>> const& x, \n                      vw::ImageView<vw::PixelMask<float>> const& y,\n                      std::string stat, int nbins, \n                      vw::Vector2 const& bin_range,\n                      // Outputs\n                      std::vector<double> & bin_stat,\n                      std::vector<double> & bin_edges,\n                      std::vector<double> & bin_centers) {\n\n  // x and y must have the same size\n  if (x.cols() != y.cols() || x.rows() != y.rows())\n    vw::vw_throw(vw::ArgumentErr() \n                 << \"The x and y images must have the same size.\\n\");\n  \n  double bin_width = (bin_range[1] - bin_range[0]) / nbins;\n  \n  // Resize output vectors\n  bin_stat.resize(nbins);\n  bin_edges.resize(nbins + 1);\n  bin_centers.resize(nbins);\n\n  for (int i = 0; i <= nbins; i++)\n    bin_edges[i] = bin_range[0] + i * bin_width;\n\n  // To get the bin center shift right by half a bin width. Skip the last edge.\n  // There are as many bin centers as there are bins\n  for (int i = 0; i < nbins; i++)\n    bin_centers[i] = bin_edges[i] + bin_width / 2.0;\n\n  // Accumulate the values in each bin. It is enough to keep this as float.\n  std::vector<std::vector<float>> bin_values(nbins);\n  for (int col = 0; col < x.cols(); col++) {\n    for (int row = 0; row < x.rows(); row++) {\n      \n      if (!is_valid(x(col, row)) || !is_valid(y(col, row)))\n        continue; // Skip invalid pixels\n      \n      // Skip values outside range\n      if (x(col, row).child() < bin_range[0] || x(col, row).child() > bin_range[1])\n        continue;\n      \n      // Bin index  \n      int bin_index = (int)std::floor((x(col, row).child() - bin_range[0]) / bin_width);\n      if (bin_index >= nbins) // This can happen due to numerical errors\n        bin_index = nbins - 1;\n      if (bin_index < 0)\n        bin_index = 0;\n        \n      bin_values[bin_index].push_back(y(col, row).child());\n    }\n  }\n  \n  // Compute the statistic for each bin\n  #pragma omp parallel for\n  for (int i = 0; i < nbins; i++) {\n    \n    if (bin_values[i].empty()) {\n      bin_stat[i] = 0;\n      continue;\n    }\n    \n    if (stat == \"mean\")\n      bin_stat[i] = vw::math::mean(bin_values[i]);\n     else if (stat == \"count\")\n       bin_stat[i] = bin_values[i].size();\n     else if (stat == \"median\")\n       bin_stat[i] = vw::math::destructive_median(bin_values[i]);\n    else\n      vw::vw_throw(vw::ArgumentErr() << \"Invalid statistic: \" << stat << \".\\n\");\n   }\n}\n\n} // end namespace vw\n"
  },
  {
    "path": "src/asp/PcAlign/MaskedImageAlgs.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NASA Vision Workbench is licensed under the Apache License,\n//  Version 2.0 (the \"License\"); you may not use this file except in\n//  compliance with the License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file MaskedImageAlgs.h\n///\n/// Algorithms that operate on masked float images. All computations are with\n/// double precision, for better accuracy.\n///\n#ifndef __ASP_PC_ALIGN_MASKEDIMAGEALGS_H__\n#define __ASP_PC_ALIGN_MASKEDIMAGEALGS_H__\n\n#include <vw/Image/ImageView.h>\n\nnamespace vw {\n  \n// Find the valid pixels. Use long long, to avoid integer overflow.\nlong long validCount(vw::ImageView<vw::PixelMask<float>> const& img);\n\n// Compute the median of the valid pixels\ndouble maskedMedian(vw::ImageView<vw::PixelMask<float>> const& img);\n  \n// Comput normalized median absolute deviation\ndouble normalizedMad(vw::ImageView<vw::PixelMask<float>> const& img, \n                     double median);\n  \n// Find the mean of valid pixels\ndouble maskedMean(vw::ImageView<vw::PixelMask<float>> const& img);\n  \n// Find the std dev of valid pixels\ndouble maskedStdDev(vw::ImageView<vw::PixelMask<float>> const& img, double mean);\n  \n// Filter outside this range\nvoid rangeFilter(vw::ImageView<vw::PixelMask<float>> & diff, \n                 double min_val, double max_val);\n  \n// Invalidate pixels in first image that are invalid in second image\nvoid intersectValid(vw::ImageView<vw::PixelMask<float>> & img1, \n                    vw::ImageView<vw::PixelMask<float>> const& img2);\n  \n// Filter by normalized median absolute deviation with given factor\nvoid madFilter(vw::ImageView<vw::PixelMask<float>> & diff, double outlierFactor);\n  \n// Group y-values into bins based on their corresponding x-values and computes\n// a statistic (like mean, sum, etc.) for each bin. This reimplements\n// scipy.stats.binned_statistic. Do not return bin number, as we don't need it.\n// Also some stats that are not needed were not implemented.\nvoid binnedStatistics(vw::ImageView<vw::PixelMask<float>> const& x, \n                      vw::ImageView<vw::PixelMask<float>> const& y,\n                      std::string stat, int nbins, \n                      vw::Vector2 const& bin_range,\n                      // Outputs\n                      std::vector<double> & bin_stat,\n                      std::vector<double> & bin_edges,\n                      std::vector<double> & bin_centers);\n  \n} // end namespace vw\n\n#endif // __ASP_PC_ALIGN_MASKEDIMAGEALGS_H__\n\n"
  },
  {
    "path": "src/asp/PcAlign/NuthAlignment.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// C++ implementation of the Nuth and Kaab alignment method from:\n// https://github.com/dshean/demcoreg/tree/master\n// Paper: https://tc.copernicus.org/articles/5/271/2011/\n\n// TODO(oalexan1): Is it worth reading ref and source as double?\n// TODO(oalexan1): Implement tilt correction.\n// TODO(oalexan1): What to do about opt.res, opt.polyorder.\n\n#include <asp/PcAlign/NuthAlignment.h>\n#include <asp/PcAlign/NuthAlignmentParse.h>\n#include <asp/PcAlign/NuthFit.h>\n\n#include <vw/Cartography/GeoTransform.h>\n#include <vw/Cartography/GeoReferenceUtils.h>\n#include <vw/FileIO/DiskImageView.h>\n#include <vw/Core/Exception.h>\n#include <vw/Core/Stopwatch.h>\n#include <vw/Math/Functors.h>\n#include <vw/Math/Statistics.h>\n#include <asp/PcAlign/MaskedImageAlgs.h>\n#include <asp/PcAlign/SlopeAspect.h>\n#include <vw/Core/Settings.h>\n#include <vw/Math/RandomSet.h>\n#include <vw/Math/Geometry.h>\n\n#include <Eigen/Core>\n#include <omp.h>\n\n#include <iostream>\n#include <vector>\n#include <cmath>\n#include <thread>\n#include <sstream>\n\nnamespace asp {\n  \n\ninline double DegToRad(double deg) {\n  return deg * M_PI / 180.0;\n}\n\n// Put the above logic in a function that prepares the data.\nvoid prepareData(NuthOptions const& opt, \n                 vw::ImageView<vw::PixelMask<float>> & ref,\n                 vw::ImageView<vw::PixelMask<float>> & src,\n                 double & ref_nodata, double & src_nodata,\n                 vw::cartography::GeoReference & ref_georef,\n                 vw::cartography::GeoReference & src_georef) {\n\n  // The DEMs must have a georeference\n  bool has_ref_georef = vw::cartography::read_georeference(ref_georef, opt.ref);\n  bool has_src_georef = vw::cartography::read_georeference(src_georef, opt.src);\n  if (!has_ref_georef || !has_src_georef)\n    vw::vw_throw(vw::ArgumentErr() << \"The input DEMs must have georeferences.\\n\");\n  \n  // The georeferences must be in projected coordinates\n  if (!ref_georef.is_projected() || !src_georef.is_projected())\n    vw::vw_throw(vw::ArgumentErr() \n      << \"The input DEMs must be in a projected coordinate system, in units of meter. \"\n      << \"Use gdalwarp with the option -r cubic to reproject them. \"\n      << \"Consider using an equidistant or UTM projection.\\n\");\n\n  // We don't support datum changes\n  if (std::abs(ref_georef.datum().semi_major_axis()\n               - src_georef.datum().semi_major_axis()) > 0.1 ||\n      std::abs(ref_georef.datum().semi_minor_axis()\n               - src_georef.datum().semi_minor_axis()) > 0.1 ||\n      ref_georef.datum().meridian_offset() != src_georef.datum().meridian_offset())\n    vw::vw_throw(vw::NoImplErr() \n                 << \"The input DEMs must have the same datum radii and meridian \"\n                 << \"Use gdalwarp -r cubic to reproject to a shared datum.\");\n\n  // Reference and source DEM resolutions\n  double ref_tr = ref_georef.transform()(0, 0);\n  double src_tr = src_georef.transform()(0, 0);\n\n  // Sanity check. This code was not tested with different grid sizes in x and y.\n  double ref_tr_y = ref_georef.transform()(1, 1);\n  double src_tr_y = src_georef.transform()(1, 1);\n  double ref_err  = std::abs(std::abs(ref_tr_y/ref_tr) - 1.0);\n  double src_err  = std::abs(std::abs(src_tr_y/src_tr) - 1.0);\n  if (ref_err > 1e-2 || src_err > 1e-2)\n    vw::vw_throw(vw::NoImplErr() \n                 << \"The input DEM grid sizes in x and y do not agree. Please reproject \"\n                 << \"the DEMs with gdalwarp -r cubic.\\n\");\n  \n  // Prefer the reference resolution to be smaller\n  if (ref_tr > src_tr)\n    vw::vw_out(vw::WarningMessage) \n      << \"The reference DEM grid size is larger than of the source DEM. \"\n      << \"This may lead to suboptimal results. It is strongly suggest to \"\n      << \"swap or regrid the reference and source DEMs.\\n\";\n  \n  // The (1, 1) value in both transforms must be negative, as otherwise this a\n  // non-standard transform that we do not handle.\n  if (ref_georef.transform()(1, 1) >= 0 || src_georef.transform()(1, 1) >= 0)\n    vw::vw_throw(vw::ArgumentErr() \n      << \"The input DEMs must have y direction pointing down, so the second coordinate \"\n      << \" of the pixel size in the geoheader be negative. The provided input DEMs \"\n      << \" are not standard and are not supported.\\n\");\n\n  // Read the no-data values\n  vw::DiskImageResourceGDAL ref_rsrc(opt.ref), src_rsrc(opt.src);\n  ref_nodata = -std::numeric_limits<double>::max();\n  src_nodata = ref_nodata;\n  if (ref_rsrc.has_nodata_read())\n    ref_nodata = ref_rsrc.nodata_read();\n  if (src_rsrc.has_nodata_read())\n    src_nodata = src_rsrc.nodata_read(); \n  \n  // Read the ref and source images fully in memory, for speed\n  ref = copy(create_mask(vw::DiskImageView<float>(opt.ref), ref_nodata));\n\n  // Get a handle to the source image on disk. We will warp it and read it in memory\n  // as needed, when it is being shifted.\n  src = copy(create_mask(vw::DiskImageView<float>(opt.src), src_nodata));\n  \n  // TODO(oalexan1): Crop the reference given the extent of the source\n  // and estimated max movement.\n#if 0  \n  // Estimate the ground resolution\n  double gridx = 0.0, gridy = 0.0;\n  int sample_rate = std::min(ref.cols(), ref.rows()) / 50;\n  if (sample_rate < 1) \n    sample_rate = 1;\n  asp::calcGsd(vw::apply_mask(ref, ref_nodata), ref_georef, ref_nodata,\n               sample_rate, sample_rate, gridx, gridy);\n  double res = (gridx + gridy) / 2.0;\n  if (res <= 0.0)\n    vw::vw_throw(vw::ArgumentErr() \n                 << \"Could not estimate the DEM grid size. Check if your input clouds \"\n                 \"are dense enough and with solid overlap.\\n\");\n    \n  int max_horiz_offset_px = int(max_horiz_offset/res) + 1;\n#endif  \n}\n\n// Warp the source DEM to the reference DEM's georef, while applying a\n// translation defined in the projected space of the reference DEM.\nvoid shiftWarp(int ref_cols, int ref_rows, \n               vw::ImageView<vw::PixelMask<float>> const& src,\n               vw::cartography::GeoReference const& ref_georef,\n               vw::cartography::GeoReference const& src_georef,\n               double dx_total, double dy_total, double dz_total,\n               // Outputs\n               vw::ImageView<vw::PixelMask<float>> & src_warp) {\n  \n  // Set up the interpolation\n  vw::PixelMask<float> nodata_val;\n  nodata_val.invalidate();\n  auto nodata_ext = vw::ValueEdgeExtension<vw::PixelMask<float>>(nodata_val);\n  vw::ImageViewRef<vw::PixelMask<float>> src_interp \n    = vw::interpolate(src, vw::BicubicInterpolation(), nodata_ext);\n  src_warp.set_size(ref_cols, ref_rows);\n  vw::cartography::GeoTransform gt(ref_georef, src_georef);\n  \n  // Interpolate  \n  #pragma omp parallel for\n  for (int col = 0; col < ref_cols; col++) {\n    for (int row = 0; row < ref_rows; row++) {\n      vw::Vector2 ref_pix(col, row);\n      \n      // Convert to projected coordinates\n      vw::Vector2 proj_pt = ref_georef.pixel_to_point(ref_pix);\n      \n      // We want to shift src by this much in projected coordinates\n      // So shift this proj pt in reverse and find the corresponding pixel in src\n      proj_pt -= vw::Vector2(dx_total, dy_total);\n      \n      // Convert back to pixel coordinates, in the ref domain, as that\n      // is where all operations take place.\n      ref_pix = ref_georef.point_to_pixel(proj_pt);\n      \n      // go to src domain\n      vw::Vector2 src_pix = gt.forward(ref_pix);\n      src_warp(col, row) = src_interp(src_pix[0], src_pix[1]);\n      \n      // Add the vertical offset\n      src_warp(col, row) += dz_total;\n    }\n  }\n\n  return;\n}\n\n// Convert a translation in projected coordinates that aligns the source to the\n// reference to a rotation + translation transform in ECEF. Make use of the\n// filtered differences we employed to find the translation.\nvoid calcEcefTransform(vw::ImageView<vw::PixelMask<float>> const& ref,\n                       vw::ImageView<vw::PixelMask<float>> const& diff,\n                       vw::cartography::GeoReference const& ref_georef,\n                       double dx_total, double dy_total, double dz_total,\n                       bool compute_translation_only,\n                       // Outputs\n                       Eigen::MatrixXd & ecef_transform) {\n  \n  // This takes time, so put a note\n  vw::vw_out() << \"Calculating the ECEF transform.\\n\";\n  \n  std::vector<vw::Vector3> ref_pts, src_pts;\n  \n  // The images can be huge. A sample is enough here.\n  int col_rate = std::max(ref.cols() / 1000, 1);\n  int row_rate = std::max(ref.rows() / 1000, 1);\n  \n  // Report progress\n  vw::TerminalProgressCallback tpc(\"asp\", \"\\t--> \");\n  double inc = 1.0 / (double(ref.cols())/col_rate);\n  tpc.report_progress(0);\n  \n  #pragma omp parallel for\n  for (int col = 0; col < ref.cols(); col += col_rate) {\n    for (int row = 0; row < ref.rows(); row += row_rate) {\n      \n      vw::Vector2 ref_pix(col, row);\n      vw::PixelMask<float> ht = ref(col, row);\n      if (!is_valid(ht)) \n        continue;\n      if (!is_valid(diff(col, row))) \n        continue;\n      \n      // Convert to projected coordinates, then to ECEF\n      vw::Vector2 ref_pt = ref_georef.pixel_to_point(ref_pix);\n      vw::Vector2 ref_lon_lat = ref_georef.point_to_lonlat(ref_pt);\n      vw::Vector3 ref_ecef = ref_georef.datum().geodetic_to_cartesian\n        (vw::Vector3(ref_lon_lat[0], ref_lon_lat[1], ht.child()));\n\n      // Same for the source. Must go back to the source domain, in x, y, z.\n      vw::Vector2 src_pt = ref_pt - vw::Vector2(dx_total, dy_total);\n      vw::Vector2 src_lon_lat = ref_georef.point_to_lonlat(src_pt);\n      vw::Vector3 src_ecef = ref_georef.datum().geodetic_to_cartesian\n        (vw::Vector3(src_lon_lat[0], src_lon_lat[1], ht.child() - dz_total));\n  \n      #pragma omp critical\n      {\n        ref_pts.push_back(ref_ecef);\n        src_pts.push_back(src_ecef);\n      }\n      \n    }\n    #pragma omp critical\n    {\n      tpc.report_progress(inc);\n    }\n  }\n  \n  tpc.report_finished();\n  \n  // This will not be robust unless we have a lot of samples\n  int minSamples = 10;\n  if (ref_pts.size() < minSamples)\n    vw::vw_throw(vw::ArgumentErr() \n                 << \"Too few valid samples to compute the ECEF transform.\\n\");\n  \n  // A subset should be enough\n  std::vector<int> sampleIndices;\n  int maxSamples = 100000;  \n  vw::math::pick_random_indices_in_range(ref_pts.size(), maxSamples, sampleIndices);\n  \n  // Keep only the samples in the vectors. Copy in-place.\n  int numSamples = sampleIndices.size();\n  for (int i = 0; i < numSamples; i++) {\n    ref_pts[i] = ref_pts[sampleIndices[i]];\n    src_pts[i] = src_pts[sampleIndices[i]];\n  }\n  ref_pts.resize(numSamples);\n  src_pts.resize(numSamples);\n  \n  // It is safe to assume by now that there are no outliers in the data, given \n  // how much filtering we did.\n  vw::Matrix<double, 3, 3> rotation;\n  vw::Vector<double, 3> translation;\n  double scale = 1.0;\n  std::string transform_type = \"rigid\";\n  if (compute_translation_only)\n    transform_type = \"translation\";\n  vw::math::find_3D_transform_no_outliers(src_pts, ref_pts,\n                                          rotation, translation, scale, // outputs\n                                          transform_type);\n  \n  // We do a rigid transform, as that's all Nuth supports.\n  if (scale != 1.0)\n    vw::vw_throw(vw::NoImplErr() << \"Found an unexpected scale factor.\\n\");\n    \n  // Copy the rotation and translation\n  ecef_transform.setIdentity(4, 4);\n  for (int i = 0; i < 3; i++) {\n    for (int j = 0; j < 3; j++) {\n      ecef_transform(i, j) = rotation(i, j);\n    }\n  }\n  for (int i = 0; i < 3; i++)\n    ecef_transform(i, 3) = translation[i];\n  \n  return;\n}\n\n// Compute the Nuth offset. By now the DEMs have been regrided to the same\n// resolution and use the same projection. All data is kept as float,\n// but the calculations are done in double precision, for accuracy.\nvoid computeNuthOffset(NuthOptions const& opt,\n                       vw::ImageView<vw::PixelMask<float>> const& ref,\n                       vw::ImageView<vw::PixelMask<float>> const& src,\n                       vw::cartography::GeoReference const& ref_georef,\n                       vw::cartography::GeoReference const& src_georef,\n                       double ref_nodata, double src_nodata,\n                       double max_horiz_offset, double max_vert_offset, \n                       vw::Vector2 const& slope_lim,\n                       double dx_total, double dy_total, double dz_total,\n                       // Outputs\n                       vw::ImageView<vw::PixelMask<float>> & diff,\n                       vw::Vector3 & fit_params,\n                       double & median_diff) {\n\n  // Find shifted src, and interpolate it onto same grid as ref.\n  vw::ImageView<vw::PixelMask<float>> src_warp;\n  shiftWarp(ref.cols(), ref.rows(), src, ref_georef, src_georef,\n            dx_total, dy_total, dz_total, \n            src_warp); // output\n  \n  // Ref and src must have the same size\n  if (ref.cols() != src_warp.cols() || ref.rows() != src_warp.rows())\n    vw::vw_throw(vw::ArgumentErr() \n                 << \"The reference and source DEMs must have the same size.\\n\"); \n    \n  // Find the diff\n  diff.set_size(src_warp.cols(), src_warp.rows());\n  for (int col = 0; col < src_warp.cols(); col++) {\n    for (int row = 0; row < src_warp.rows(); row++) {\n       diff(col, row) = src_warp(col, row) - ref(col, row);\n    }\n  }\n   \n  // Filter out diff whose magnitude is greater than max_vert_offset    \n  // Apply normalized mad filter with given factor\n  double outlierFactor = 3.0;\n  vw::rangeFilter(diff, -max_vert_offset, max_vert_offset);\n  \n  vw::madFilter(diff, outlierFactor);\n  \n  // Calculate the slope and aspect of the src_warp_copy DEM\n  vw::ImageView<vw::PixelMask<float>> slope, aspect;\n  vw::cartography::calcSlopeAspect(src_warp, ref_georef, slope, aspect);\n  \n  // Filter slopes by range\n  vw::rangeFilter(slope, slope_lim[0], slope_lim[1]);\n  \n  // Invalidate diffs with invalid slope or aspect\n  vw::intersectValid(diff, slope);\n  vw::intersectValid(diff, aspect);\n  \n  // Important sanity check\n  int minCount = 100;\n  if (validCount(diff) < minCount)\n    vw::vw_throw(vw::ArgumentErr() \n                 << \"Too little valid data left after filtering.\\n\");\n  \n  // Find the initial guess to fit_params\n  median_diff = vw::maskedMedian(diff); // will return\n  double median_slope = vw::maskedMedian(slope);\n  double c_seed = (median_diff/tan(DegToRad(median_slope)));\n  fit_params = vw::Vector3(0, 0, c_seed); // will update later and return\n\n  // For invalid diff make the slope and aspect invalid\n  vw::intersectValid(slope, diff);\n  vw::intersectValid(aspect, diff);\n\n  // Form xdata and ydata. We don't bother removing the flagged invalid pixels.\n  // xdata = aspect[common_mask].data\n  // ydata = (diff[common_mask]/np.tan(np.deg2rad(slope[common_mask]))).data\n  // Make xdata an alias, to save on memory\n  vw::ImageView<vw::PixelMask<float>> & xdata = aspect;\n  vw::ImageView<vw::PixelMask<float>> ydata(src_warp.cols(), src_warp.rows());\n  for (int col = 0; col < src_warp.cols(); col++) {\n    for (int row = 0; row < src_warp.rows(); row++) {\n      \n      ydata(col, row).invalidate();\n      if (is_valid(diff(col, row)) && is_valid(slope(col, row)) && \n          slope(col, row).child() != 0) {\n        ydata(col, row) \n          = diff(col, row).child() / tan(DegToRad(slope(col, row).child()));\n        ydata(col, row).validate();\n      }\n    }\n  }\n   \n  // Filter outliers in y by mean and std dev\n  outlierFactor = 3.0;\n  double mean_y = vw::maskedMean(ydata);\n  double std_dev_y = vw::maskedStdDev(ydata, mean_y);\n  double rmin = mean_y - outlierFactor * std_dev_y;\n  double rmax = mean_y + outlierFactor * std_dev_y;\n  \n  // Filter y by range, and then apply to x\n  vw::rangeFilter(ydata, rmin, rmax);\n  vw::intersectValid(xdata, ydata);\n  \n  // Prepare for binning\n  int numBins = 360;\n  vw::Vector2 binRange(0.0, numBins);\n\n  // Bin counts. Keep these are double as they are small.\n  std::vector<double> bin_count, bin_edges, bin_centers;\n  vw::binnedStatistics(xdata, ydata, \"count\", numBins, binRange, \n                       bin_count, bin_edges, bin_centers); // outputs  \n  \n  // Bin medians\n  std::vector<double> bin_median;\n  vw::binnedStatistics(xdata, ydata, \"median\", numBins, binRange, \n                       bin_median, bin_edges, bin_centers); // outputs\n  \n  // Find the best fit. This refines fit_params.\n  asp::nuthFit(bin_count, bin_centers, bin_median, opt.inner_iter, opt.num_threads,\n               fit_params);\n} // End function computeNuthOffset\n\n// Compute the Nuth alignment transform in projected coordinates and then\n// convert it to an ECEF transform.\nEigen::MatrixXd nuthAlignment(std::string const& ref_file, \n                              std::string const& src_file, \n                              std::string const& out_prefix, \n                              double max_displacement,\n                              int num_iterations,\n                              int num_threads,\n                              bool compute_translation_only,\n                              std::string const& nuth_options) { \n\n  // Pass some of these directly to opt\n  NuthOptions opt;\n  opt.ref = ref_file;\n  opt.src = src_file;\n  opt.out_prefix = out_prefix;\n  opt.max_displacement = max_displacement;\n  opt.max_iter = num_iterations;\n  opt.num_threads = num_threads;\n  opt.compute_translation_only = compute_translation_only;\n\n  // Parse the others from nuth_options, or defaults are used.\n  int argc = 0;\n  std::vector<char*> argv;\n  std::vector<std::string> argv_str;\n  formArgcArgv(nuth_options, argc, argv, argv_str);\n  handleNuthArgs(argc, &argv[0], opt);\n  \n  // If no iterations, return the identity\n  Eigen::MatrixXd ecef_transform = Eigen::MatrixXd::Identity(4, 4);\n  if (opt.max_iter == 0)\n    return ecef_transform;\n  \n  // Load and prepare the data\n  vw::ImageView<vw::PixelMask<float>> ref, src;\n  double ref_nodata = -std::numeric_limits<double>::max();\n  double src_nodata = ref_nodata;\n  vw::cartography::GeoReference ref_georef, src_georef;\n  // start stopwatch\n  prepareData(opt, ref, src, ref_nodata, src_nodata, ref_georef, src_georef);\n  \n  // Initialize\n  double dx_total = 0, dy_total = 0, dz_total = 0;\n  vw::Vector3 fit_params;\n  double median_diff = 0.0; // will be returned\n  int iter = 1;\n  double change_len = -1.0;\n  vw::ImageView<vw::PixelMask<float>> diff;\n  \n  vw::vw_out() << \"Iteration and change in transform (meters)\\n\";\n  while (1) {\n    \n    // Compute the Nuth offset\n    computeNuthOffset(opt, ref, src, ref_georef, src_georef, ref_nodata, src_nodata,\n                      opt.max_horiz_offset, opt.max_vert_offset, opt.slope_lim,\n                      dx_total, dy_total, dz_total, \n                      diff, fit_params, median_diff); // outputs\n    \n    // Note: minus signs here since we are computing dz = src-ref, but adjusting src\n    double dx = -fit_params[0] * sin(DegToRad(fit_params[1]));\n    double dy = -fit_params[0] * cos(DegToRad(fit_params[1]));\n    double dz = -median_diff;\n    \n    dx_total += dx;\n    dy_total += dy;\n    dz_total += dz;\n    change_len = vw::math::norm_2(vw::Vector3(dx, dy, dz));\n    vw::vw_out() << iter << '\\t' << change_len << \"\\n\";\n    \n    iter++;\n    if (iter > opt.max_iter) {\n      vw::vw_out() << \"Reached the maximum number of iterations, before convergence.\\n\";\n      break;\n    }\n    \n    if (change_len < opt.tol) {\n      vw::vw_out() << \"Reached the prescribed tolerance.\\n\";\n      break;\n    }\n  }\n  \n  // Warning. Not sure if it should be an error.\n  double horiz_total = vw::math::norm_2(vw::Vector2(dx_total, dy_total));\n  if (horiz_total > opt.max_horiz_offset) \n    vw::vw_out(vw::WarningMessage)\n      << \"Total horizontal offset is: \" << horiz_total << \" meters. It exceeds the \"\n      << \"specified max horizontal offset: \" << opt.max_horiz_offset << \" meters. Consider increasing the --max-horizontal-offset value.\\n\";\n    \n  // Compute the ECEF transform\n  calcEcefTransform(ref, diff, ref_georef, dx_total, dy_total, dz_total, \n                    opt.compute_translation_only,\n                    ecef_transform); // output \n     \n   return ecef_transform;\n}\n\n#if 0  \n  // Write the cropped and warped ref\n  {\n  vw::TerminalProgressCallback ref_tpc(\"asp\", \": \");\n  bool has_ref_no_data = true;\n  std::string ref_crop_file = opt.out_prefix + \"-ref-crop.tif\"; \n  vw::vw_out() << \"Writing: \" << ref_crop_file << \"\\n\";\n  vw::cartography::block_write_gdal_image(ref_crop_file,\n                                          vw::apply_mask(ref_dem, ref_nodata),\n                                          has_ref_georef, ref_georef,\n                                          has_ref_no_data, ref_nodata,\n                                          opt, ref_tpc);\n  }\n    \n  // Write the cropped src\n  { \n  vw::TerminalProgressCallback src_tpc(\"asp\", \": \");\n  bool has_src_no_data = true;\n  std::string src_crop_file = opt.out_prefix + \"-src-crop.tif\";\n  vw::vw_out() << \"Writing: \" << src_crop_file << \"\\n\";\n  vw::cartography::block_write_gdal_image(src_crop_file,\n                                          vw::apply_mask(src_trans, src_nodata),\n                                          has_src_georef, ref_georef,\n                                          has_src_no_data, src_nodata,\n                                          opt, src_tpc);\n  }\n\n  // Write the slope\n  {\n  vw::TerminalProgressCallback src_tpc(\"asp\", \": \");\n  bool has_src_no_data = true, has_src_georef = true;\n  std::string src_slope_file = opt.out_prefix + \"-src-slope.tif\";\n  vw::vw_out() << \"Writing: \" << src_slope_file << \"\\n\";\n  vw::cartography::block_write_gdal_image(src_slope_file,\n                                          vw::apply_mask(slope, src_nodata),\n                                          has_src_georef, ref_georef,\n                                          has_src_no_data, src_nodata,\n                                          opt, src_tpc);\n  }\n\n  // Write the aspect\n  {\n  vw::TerminalProgressCallback src_tpc(\"asp\", \": \");\n  bool has_src_no_data = true, has_src_georef = true;\n  std::string src_aspect_file = opt.out_prefix + \"-src-aspect.tif\";\n  vw::vw_out() << \"Writing: \" << src_aspect_file << \"\\n\";\n  vw::cartography::block_write_gdal_image(src_aspect_file,\n                                          vw::apply_mask(aspect, src_nodata),\n                                          has_src_georef, ref_georef,\n                                          has_src_no_data, src_nodata,\n                                          opt, src_tpc);\n  }\n#endif  \n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/PcAlign/NuthAlignment.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file NuthAlignment.h\n/// Nuth and Kaab alignment.\n\n#ifndef __ASP_PC_ALIGN_NUTH_ALIGNMENT_H__\n#define __ASP_PC_ALIGN_NUTH_ALIGNMENT_H__\n\n#include <Eigen/Dense>\n#include <vector>\n\nnamespace asp {\n\nEigen::MatrixXd nuthAlignment(std::string const& ref_file, \n                              std::string const& src_file, \n                              std::string const& output_prefix, \n                              double max_displacement,\n                              int num_iterations,\n                              int num_threads,\n                              bool compute_translation_only,\n                              std::string const& nuth_options);\n\n} // end namespace asp\n\n#endif // __ASP_PC_ALIGN_NUTH_ALIGNMENT_H__\n"
  },
  {
    "path": "src/asp/PcAlign/NuthAlignmentParse.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/PcAlign/NuthAlignmentParse.h>\n#include <asp/Core/AspProgramOptions.h>\n\n#include <vw/Core/Exception.h>\n#include <vw/Core/Log.h>\n#include <vw/FileIO/DiskImageView.h>\n\n#include <boost/program_options.hpp>\n#include <omp.h>\n\n#include <iostream>\n#include <vector>\n#include <cmath>\n#include <thread>\n#include <sstream>\n#include <limits>\n\nnamespace po = boost::program_options;\n\nnamespace asp {\n\n// Parse the arguments. Some were set by now directly into opt.\nvoid handleNuthArgs(int argc, char *argv[],  NuthOptions& opt) {\n\n  double nan = std::numeric_limits<double>::quiet_NaN();\n  po::options_description general_options(\"General options\");\n  general_options.add_options()\n    (\"slope-lim\", \n     po::value(&opt.slope_lim)->default_value(vw::Vector2(0.1, 40.0), \"0.1, 40.0\"),\n     \"Minimum and maximum surface slope limits to consider (degrees).\")\n    (\"tol\", po::value(&opt.tol)->default_value(0.01),\n     \"Stop when the addition to the computed translation at given iteration has magnitude \"\n     \"below this tolerance (meters).\")\n    (\"max-horizontal-offset\", po::value(&opt.max_horiz_offset)->default_value(nan),\n     \"Maximum expected horizontal translation magnitude (meters). Used to filter outliers.\")\n    (\"max-vertical-offset\", po::value(&opt.max_vert_offset)->default_value(nan),\n     \"Maximum expected vertical translation (meters). Used to filter outliers.\")\n    (\"num-inner-iter\", po::value(&opt.inner_iter)->default_value(10),\n      \"Maximum number of iterations for the inner loop, when finding the best \"\n      \"fit parameters for the current translation.\")\n    // The options below are not yet supported\n    (\"tiltcorr\", po::bool_switch(&opt.tiltcorr)->default_value(false),\n     \"After a preliminary translation, fit a polynomial to residual elevation offsets \"\n     \"and remove.\")\n    (\"res\", po::value(&opt.res)->default_value(\"mean\"),\n     \"Regrid the input DEMs to this resolution given the resolutions of input datasets. \"\n     \" NuthOptions: min, max, mean, common_scale_factor.\")\n    (\"poly-order\", po::value(&opt.poly_order)->default_value(1), \n     \"Specify the order of the polynomial fit.\")\n    ;\n  general_options.add(vw::GdalWriteOptionsDescription(opt));\n\n  po::options_description positional(\"\");\n  po::positional_options_description positional_desc;\n  std::string usage; // not used\n   \n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line(argc, argv, opt, general_options, general_options,\n                            positional, positional_desc, usage,\n                            allow_unregistered, unregistered);\n\n  if (opt.out_prefix == \"\")\n    vw::vw_throw(vw::ArgumentErr() << \"The output prefix was not set.\\n\");\n\n  // The ref and src DEMs must be provided\n  if (opt.ref == \"\" || opt.src == \"\")\n    vw::vw_throw(vw::ArgumentErr() << \"The reference and source DEMs must be provided.\\n\");\n\n  // The poly order must be positive\n  if (opt.poly_order < 1)\n    vw::vw_throw(vw::ArgumentErr() << \"The polynomial order must be at least 1.\\n\");\n  \n  // The tol must be positive\n  if (opt.tol <= 0.0)\n    vw::vw_throw(vw::ArgumentErr() << \"The tolerance must be positive.\\n\");\n\n  // If horizontal and vertical offset are NaN (so, not set), use max_displacement\n  if (std::isnan(opt.max_horiz_offset))\n     opt.max_horiz_offset = opt.max_displacement;\n  if (std::isnan(opt.max_vert_offset))\n      opt.max_vert_offset = opt.max_displacement;\n         \n  // All these offsets must be positive\n  if (opt.max_displacement <= 0.0)\n    vw::vw_throw(vw::ArgumentErr() << \"The maximum displacement must be positive.\\n\");\n  if (opt.max_horiz_offset <= 0.0 || opt.max_vert_offset <= 0.0)\n    vw::vw_throw(vw::ArgumentErr() \n                 << \"The maximum horizontal and vertical offsets must be positive.\\n\");\n\n  // Check that res is one of the allowed values\n  if (opt.res != \"min\" && opt.res != \"max\" && opt.res != \"mean\" &&\n      opt.res != \"common_scale_factor\")\n    vw::vw_throw(vw::ArgumentErr() << \"Unknown value for --res: \" << opt.res << \".\\n\");\n  \n  // Check that slope limits are positive and in the right order\n  if (opt.slope_lim[0] <= 0.0 || opt.slope_lim[1] <= 0.0 || \n      opt.slope_lim[0] >= opt.slope_lim[1])\n    vw::vw_throw(vw::ArgumentErr() \n                 << \"The slope limits must be positive and in increasing order.\\n\");\n\n  if (opt.tiltcorr)\n    vw::vw_throw(vw::NoImplErr() << \"Tilt correction is not implemented yet.\\n\");\n     \n  // TODO(oalexan1): Sort out the number of threads. Now it comes from .vwrc if\n  // not set.\n\n  // Set the number of threads for OpenMP.  \n  int processor_count = std::thread::hardware_concurrency();\n  omp_set_dynamic(0);\n  omp_set_num_threads(processor_count);\n  vw::vw_out() << \"Using \" << processor_count << \" threads with OpenMP.\\n\";\n}\n\n// Given a command-line string, form argc and argv. In addition to pointers,\n// will also store the strings in argv_str, to ensure permanence.\nvoid formArgcArgv(std::string const& cmd,\n                  int & argc,\n                  std::vector<char*> & argv,\n                  std::vector<std::string> & argv_str) {\n\n  // Break by space and read into argv\n  argv_str.clear();\n  argv_str.push_back(\"nuthAlignment\"); // program name\n  std::istringstream iss(cmd);\n  std::string word;\n  while (iss >> word) \n    argv_str.push_back(word);\n  \n  argc = argv_str.size();  \n  argv.resize(argc);\n  for (int i = 0; i < argc; i++)\n    argv[i] = &argv_str[i][0];\n  \n  return;\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/PcAlign/NuthAlignmentParse.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#ifndef ASP_PCALIGN_NUTH_ALIGNMENT_PARSE_H\n#define ASP_PCALIGN_NUTH_ALIGNMENT_PARSE_H\n\n#include <string>\n#include <vector>\n#include <vw/Math/Vector.h>\n#include <vw/FileIO/GdalWriteOptions.h>\n\nnamespace asp {\n\n// Definition of the options struct\nstruct NuthOptions: vw::GdalWriteOptions {\n  std::string ref, src, out_prefix, res;\n  int poly_order, max_iter, inner_iter;\n  double tol, max_horiz_offset, max_vert_offset, max_displacement;\n  bool tiltcorr, compute_translation_only;\n  vw::Vector2 slope_lim;\n   NuthOptions() {}\n};\n\n// Parse the arguments. Some were set by now directly into opt.\nvoid handleNuthArgs(int argc, char *argv[],  NuthOptions& opt);\n\n// Given a command-line string, form argc and argv. In addition to pointers,\n// will also store the strings in argv_str, to ensure permanence.\nvoid formArgcArgv(std::string const& cmd,\n                  int & argc,\n                  std::vector<char*> & argv,\n                  std::vector<std::string> & argv_str);\n\n} // end namespace asp\n\n#endif // ASP_PCALIGN_NUTH_ALIGNMENT_PARSE_H\n"
  },
  {
    "path": "src/asp/PcAlign/NuthFit.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/PcAlign/NuthFit.h>\n\n#include <ceres/ceres.h>\n\n/// Best fit function for Nuth alignment with Ceres\n\nnamespace asp {\n\n// Function for fitting Nuth and Kaab (2011)\n// Can use phasor addition, but need to change conversion to offset dx and dy\n// https://stackoverflow.com/questions/12397412/i-know-scipy-curve-fit-can-do-better?rq=1\ninline double nuth_func(double x, double a, double b, double c) {\n  return a * cos((b-x) * M_PI / 180.0) + c;\n}\n\n// Cost functor for Nuth and Kaab function\nstruct NuthResidual {\n\n  NuthResidual(double x, double y): m_x(x), m_y(y) {}\n\n  bool operator()(double const * const * params, double * residuals) const {\n    // params[0][0] = a, params[0][1] = b, params[0][2] = c\n    double predicted = nuth_func(m_x, params[0][0], params[0][1], params[0][2]);\n    residuals[0] = predicted - m_y;\n    return true;\n  }\n\n  // Factory to hide the construction of the CostFunction object from the client code.\n  static ceres::CostFunction* CreateNuthCostFunction(double x, double y) {\n    \n    ceres::DynamicNumericDiffCostFunction<NuthResidual>* cost_function\n      = new ceres::DynamicNumericDiffCostFunction<NuthResidual>(new NuthResidual(x, y));\n      \n    // The residual size is 1\n    cost_function->SetNumResiduals(1);\n    \n    // Add a parameter block for each parameter\n    cost_function->AddParameterBlock(3);\n    \n    return cost_function;\n  }\n\n  double m_x, m_y;\n}; // End class NuthResidual\n\n// Form a Ceres optimization problem. Will fit a curve to bin centers and bin\n// medians, while taking into acount the bin count and min_bin_sample_count.\nvoid nuthFit(std::vector<double> const& bin_count, \n             std::vector<double> const& bin_centers, \n             std::vector<double> const& bin_median, \n             int inner_iter,\n             int num_threads,\n             vw::Vector3 & fit_params) {\n\n  ceres::Problem problem;\n  \n  int min_bin_sample_count = 9;\n  int numBins = bin_centers.size();\n  \n  // Add residuals\n  for (int i = 0; i < numBins; i++) {\n    \n     // Skip bin count less than min_bin_sample_count\n     if (bin_count[i] < min_bin_sample_count)\n       continue;\n        \n    // The residual is the difference between the data and the model\n    // fit = optimization.curve_fit(nuth_func, bin_centers, bin_med, fit_params)[0]\n    ceres::CostFunction* cost_function = \n      NuthResidual::CreateNuthCostFunction(bin_centers[i], bin_median[i]);\n    \n    // A lot of outlier removal took place. Likely there is no need for \n    // a robust loss function.\n    ceres::LossFunction* loss_function = NULL;\n    \n    problem.AddResidualBlock(cost_function, loss_function, &fit_params[0]);\n  }\n  \n  ceres::Solver::Options options;\n  options.gradient_tolerance  = 1e-16;\n  options.function_tolerance  = 1e-16;\n  options.parameter_tolerance = 1e-12;\n  options.max_num_iterations  = inner_iter;\n  options.max_num_consecutive_invalid_steps = std::max(5, inner_iter/5); // try hard\n  options.minimizer_progress_to_stdout = false; // verbose\n  options.num_threads = num_threads;\n  options.linear_solver_type = ceres::SPARSE_SCHUR;\n  \n  ceres::Solver::Summary summary;\n  ceres::Solve(options, &problem, &summary);\n  // vw::vw_out() << summary.FullReport() << \"\\n\"; // verbose\n  \n} // End function nuthFit\n    \n} // end namespace asp\n"
  },
  {
    "path": "src/asp/PcAlign/NuthFit.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file NuthFit.h\n/// Best fit function for Nuth alignment.\n\n#ifndef __ASP_PC_ALIGN_NUTH_FIT_H__\n#define __ASP_PC_ALIGN_NUTH_FIT_H__\n\n#include <vw/Math/Vector.h>\n\n#include <vector>\n\nnamespace asp {\n \n// Form a Ceres optimization problem. Will fit a curve to bin centers and bin\n// medians, while taking into acount the bin count and min_bin_sample_count.\nvoid nuthFit(std::vector<double> const& bin_count, \n             std::vector<double> const& bin_centers, \n             std::vector<double> const& bin_median, \n             int inner_iter,\n             int num_threads,\n             vw::Vector3 & fit_params);\n\n} // end namespace asp\n\n#endif // __ASP_PC_ALIGN_NUTH_FIT_H__\n"
  },
  {
    "path": "src/asp/PcAlign/SlopeAspect.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NASA Vision Workbench is licensed under the Apache License,\n//  Version 2.0 (the \"License\"); you may not use this file except in\n//  compliance with the License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/PcAlign/SlopeAspect.h>\n\n#include <omp.h>\n\nnamespace vw {\nnamespace cartography {\n\n// Calculate the DEM slope and aspect in degrees at a given location.\n// The code below is adapted from GDAL.\n// https://github.com/OSGeo/gdal/blob/46412f0fb7df3f0f71c6c31ff0ae97b7cef6fa61/apps/gdaldem_lib.cpp#L1284C1-L1301C1\n//https://github.com/OSGeo/gdal/blob/46412f0fb7df3f0f71c6c31ff0ae97b7cef6fa61/apps/gdaldem_lib.cpp#L1363\n// It looks to be an approximation of the Zevenbergen and Thorne method, not the\n// real thing. Using same logic for consistency.\ninline \nvoid SlopeAspectZevenbergenThorneAlg(vw::ImageView<vw::PixelMask<float>> const& dem,\n                                     vw::cartography::GeoReference const& georef,\n                                     int col, int row,\n                                     vw::PixelMask<float> & slope,\n                                     vw::PixelMask<float> & aspect) {\n\n  // The slope and aspect start as invalid\n  slope.invalidate();\n  aspect.invalidate();\n  \n  int num_cols = dem.cols(), num_rows = dem.rows();\n  \n  // If the pixel is at the border, return invalid\n  if (col <= 0 || row <= 0 || col >= num_cols - 1 || row >= num_rows - 1)\n    return;\n  \n  // Form the afWin vector with the pixel values\n  std::vector<double> afWin(9);\n  int count = 0;\n  for (int irow = -1; irow <= 1; irow++) {\n    for (int icol = -1; icol <= 1; icol++) {\n      \n      auto val = dem(col + icol, row + irow);\n      \n      // If invalid, return invalid right away. Note how we check here only\n      // either icol or irow being zero, as we don't use the diagonal values.\n      // The original Zevenbergen and Thorne method uses those values,\n      // but the GDAL implementation does not.\n      if (!is_valid(val) && (icol == 0 || irow == 0))\n        return;\n        \n      afWin[count] = val.child();\n      count++;\n    }\n  }\n  \n  // To find the local grid size in x, convert pixels to projected coordinates.\n  vw::Vector2 left_pt = georef.pixel_to_point(vw::Vector2(col - 1, row));\n  vw::Vector2 right_pt = georef.pixel_to_point(vw::Vector2(col + 1, row));\n  double grid_x = vw::math::norm_2(right_pt - left_pt) / 2.0;\n\n  // Same for y\n  vw::Vector2 top_pt = georef.pixel_to_point(vw::Vector2(col, row - 1));\n  vw::Vector2 bottom_pt = georef.pixel_to_point(vw::Vector2(col, row + 1));\n  double grid_y = vw::math::norm_2(bottom_pt - top_pt) / 2.0;\n  \n  // Compute the slope\n  double dx = (afWin[3] - afWin[5]) / grid_x;\n  double dy = (afWin[7] - afWin[1]) / grid_y;\n  double key = dx * dx + dy * dy;\n  // The division by 2 is needed because that's how centered differences are found\n  slope = atan(sqrt(key)/2.0) * 180.0 / M_PI;\n  slope.validate();\n\n  // Compute the aspect   \n  // TODO(oalexan1): It is not clear if need to divide by grid_x or grid_y here.\n  // The GDAL code does not, but I think it should. These grid sizes are usually \n  // about the same in projected coordinates, so likely it does not matter.\n  dx = afWin[5] - afWin[3];\n  dy = afWin[7] - afWin[1];  \n  if (dx == 0 && dy == 0) {\n    aspect.invalidate();\n    return;\n  }\n  double a = atan2(dy, -dx) * 180.0 / M_PI;\n  // Using the logic for when psData->bAngleAsAzimuth is true\n  if (a > 90.0)\n      a = 450.0 - a;\n  else\n      a = 90.0 - a;  \n  if (a >= 360.0)\n    a -= 360.0;\n    \n  aspect = a;\n  aspect.validate();  \n}\n\n// Calculate the DEM slope and aspect in degrees. Use the same logic as gdaldem. \nvoid calcSlopeAspect(vw::ImageView<vw::PixelMask<float>> const& dem, \n                     vw::cartography::GeoReference const& georef,\n                     // Outputs\n                     vw::ImageView<vw::PixelMask<float>> & slope,\n                     vw::ImageView<vw::PixelMask<float>> & aspect) {\n\n  // Allocate space for the output slope and aspect\n  slope.set_size(dem.cols(), dem.rows());\n  aspect.set_size(dem.cols(), dem.rows());\n  \n  #pragma omp parallel for\n  for (int col = 0; col < dem.cols(); col++) {\n    for (int row = 0; row < dem.rows(); row++) {\n      SlopeAspectZevenbergenThorneAlg(dem, georef, col, row, \n                                      slope(col, row), aspect(col, row)); // outputs\n    }\n  }\n\n}\n\n}} // end namespace vw::cartography\n"
  },
  {
    "path": "src/asp/PcAlign/SlopeAspect.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NASA Vision Workbench is licensed under the Apache License,\n//  Version 2.0 (the \"License\"); you may not use this file except in\n//  compliance with the License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#ifndef __ASP_PC_ALIGN_SLOPE_ASPECT_H__\n#define __ASP_PC_ALIGN_SLOPE_ASPECT_H__\n\n#include <vw/Image/ImageView.h>\n#include <vw/Image/PixelMask.h>\n#include <vw/Cartography/GeoReference.h>\nnamespace vw {\nnamespace cartography {\n\n// Calculate the DEM slope and aspect in degrees. Use the same logic as gdaldem. \nvoid calcSlopeAspect(vw::ImageView<vw::PixelMask<float>> const& dem, \n                     vw::cartography::GeoReference const& georef,\n                     // Outputs\n                     vw::ImageView<vw::PixelMask<float>> & slope,\n                     vw::ImageView<vw::PixelMask<float>> & aspect);\n\n}} // namespace vw::cartography\n\n#endif // __ASP_PC_ALIGN_SLOPE_ASPECT_H__\n"
  },
  {
    "path": "src/asp/PcAlign/pc_align_ceres.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Implement least square alignment using the Ceres solver.\n\n#include <asp/PcAlign/pc_align_ceres.h>\n#include <asp/PcAlign/pc_align_utils.h>\n#include <asp/Core/EigenUtils.h>\n\n#include <ceres/ceres.h>\n#include <ceres/loss_function.h>\n\nnamespace asp {\n\nusing namespace vw;\n  \n// Discrepancy between a 3D point with the rotation to be solved\n// applied to it, and its projection straight down onto the DEM. Used\n// with the least squares method of finding the best transform between\n// clouds.\nstruct PointToDemError {\n  PointToDemError(Vector3 const& point,\n\t\t ImageViewRef<vw::PixelMask<float> > const& dem,\n\t\t cartography::GeoReference const& geo):\n    m_point(point), m_dem(dem), m_geo(geo){}\n\n  template <typename F>\n  bool operator()(const F* const transform, const F* const scale, F* residuals) const {\n\n    // Default residuals are zero, if we can't project into the DEM\n    residuals[0] = F(0.0);\n\n    // Extract the translation, and rotation\n    Vector3 translation;\n    Quat rotation;\n    extract_rotation_translation(transform, rotation, translation);\n\n    Vector3 trans_point = scale[0]*rotation.rotate(m_point) + translation;\n    \n    // Convert from GDC to GCC\n    Vector3 llh = m_geo.datum().cartesian_to_geodetic(trans_point); // lon-lat-height\n\n    // Interpolate the point at this location\n    double dem_height_here;\n    if (!interp_dem_height(m_dem, m_geo, llh, dem_height_here)) {\n      // If we did not intersect the DEM, record a flag error value here.\n      residuals[0] = F(0.0);\n      return true;\n    }\n    \n    residuals[0] = llh[2] - dem_height_here;\n    return true;\n  }\n  \n  // Factory to hide the construction of the CostFunction object from\n  // the client code.\n  static ceres::CostFunction* Create(Vector3 const& point,\n\t\t\t\t     vw::ImageViewRef<vw::PixelMask<float> > const& dem,\n\t\t\t\t     vw::cartography::GeoReference const& geo){\n    return (new ceres::NumericDiffCostFunction<PointToDemError,\n\t    ceres::CENTRAL, 1, 6, 1>\n\t    (new PointToDemError(point, dem, geo)));\n  }\n\n  Vector3                                  m_point;\n  ImageViewRef< PixelMask<float> > const & m_dem;    // alias\n  cartography::GeoReference        const & m_geo;    // alias\n};\n\n/// Compute alignment using least squares\nEigen::MatrixXd\nleast_squares_alignment(DP const& source_point_cloud, // Should not be modified\n\t\t\tvw::Vector3 const& point_cloud_shift,\n\t\t\tvw::cartography::GeoReference        const& dem_georef,\n\t\t\tvw::ImageViewRef< PixelMask<float> > const& dem_ref,\n      std::string const& alignment_method,\n      int num_iter, int num_threads) { \n\n  ceres::Problem problem;\n\n  // The final transform as a axis angle and translation pair\n  std::vector<double> transform(6, 0.0);\n\n  double scale = 1.0;\n  \n  // Add a residual block for every source point\n  const std::int64_t num_pts = source_point_cloud.features.cols();\n\n  // Loop through every point in the point cloud\n  for (std::int64_t i = 0; i < num_pts; i++){\n    \n    // Extract and un-shift the point to get the real GCC coordinate\n    Vector3 gcc_coord = get_cloud_gcc_coord(source_point_cloud, point_cloud_shift, i);\n\n    ceres::CostFunction* cost_function =\n      PointToDemError::Create(gcc_coord, dem_ref, dem_georef);\n    ceres::LossFunction* loss_function = new ceres::CauchyLoss(0.5); // NULL;\n    problem.AddResidualBlock(cost_function, loss_function, &transform[0], &scale);\n    \n  } // End loop through all points\n\n  if (alignment_method == \"least-squares\") {\n    // Only solve for rotation and translation\n    problem.SetParameterBlockConstant(&scale);\n  }\n  \n  ceres::Solver::Options options;\n  options.gradient_tolerance = 1e-16;\n  options.function_tolerance = 1e-16;\n  options.max_num_iterations = num_iter;\n  options.minimizer_progress_to_stdout = 1;\n  options.num_threads = num_threads;\n  options.linear_solver_type = ceres::SPARSE_SCHUR;\n\n  // Solve the problem\n  ceres::Solver::Summary summary;\n  ceres::Solve(options, &problem, &summary);\n\n  vw_out() << summary.FullReport() << \"\\n\" << std::endl;\n\n  Quat rotation;\n  Vector3 translation;\n  extract_rotation_translation(&transform[0], rotation, translation);\n  vw::Matrix<double,3,3> rot_matrix = rotation.rotation_matrix();\n  \n  Eigen::MatrixXd T = Eigen::MatrixXd::Identity(DIM + 1, DIM + 1);\n  for (int row = 0; row < DIM; row++){\n    for (int col = 0; col < DIM; col++){\n      T(row, col) = scale*rot_matrix(col, row);\n    }\n  }\n\n  for (int row = 0; row < DIM; row++)\n    T(row, DIM) = translation[row];\n\n  // This transform is in the world coordinate system (as that's the natural\n  // coord system for the DEM). Transform it to the internal shifted coordinate\n  // system.\n  T = apply_shift(T, point_cloud_shift);\n\n  return T;\n}\n    \n} // end namespace asp\n"
  },
  {
    "path": "src/asp/PcAlign/pc_align_ceres.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file pc_align_ceres.h\n///\n\n#ifndef __ASP_TOOLS_PC_ALIGN_CERES_H__\n#define __ASP_TOOLS_PC_ALIGN_CERES_H__\n\n#include <asp/PcAlign/pc_align_utils.h>\n\n#include <vw/Cartography/Datum.h>\n#include <vw/Cartography/GeoReference.h>\n#include <vw/Image/ImageViewRef.h>\n#include <vw/Image/PixelMask.h>\n#include <vw/Math/Quaternion.h>\n\nnamespace asp {\n \n/// Compute least squares alignment, using Ceres\nEigen::MatrixXd\nleast_squares_alignment(DP const& source_point_cloud, // Should not be modified\n\t\t\tvw::Vector3 const& point_cloud_shift,\n\t\t\tvw::cartography::GeoReference        const& dem_georef,\n\t\t\tvw::ImageViewRef<vw::PixelMask<float> > const& dem_ref,\n      std::string const& alignment_method,\n      int num_iter, int num_threads); \n}\n\n#endif //__ASP_TOOLS_PC_ALIGN_CERES_H__\n"
  },
  {
    "path": "src/asp/PcAlign/pc_align_fgr.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Implement least square alignment using the FGR method\n\n#include <asp/PcAlign/pc_align_fgr.h>\n#include <asp/PcAlign/pc_align_utils.h>\n#include <asp/Core/EigenUtils.h>\n\n// Can't do much about external warnings except hide them\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wdeprecated-declarations\"\n#include <FastGlobalRegistration/app.h>\n#pragma GCC diagnostic pop\n\nnamespace asp {\n\nusing namespace vw;\n\n// Parse a string like:\n// div_factor: 1.4 use_absolute_scale: 0 max_corr_dist: 0.025 iteration_number: 100 tuple_scale: 0.95 tuple_max_cnt: 10000\nvoid parse_fgr_options(std::string const & options,\n                       double            & div_factor,\n                       bool              & use_absolute_scale,\n                       double            & max_corr_dist,\n                       int               & iteration_number,\n                       float             & tuple_scale,\n                       int               & tuple_max_cnt){\n\n  // Initialize the outputs\n  div_factor         = -1;\n  use_absolute_scale = false;\n  max_corr_dist      = -1;\n  iteration_number   = -1;\n  tuple_scale        = -1;\n  tuple_max_cnt      = -1;\n\n  std::istringstream is(options);\n  std::string name, val;\n  while( is >> name >> val){\n    if (name.find(\"div_factor\") != std::string::npos)\n      div_factor = atof(val.c_str());\n    if (name.find(\"use_absolute_scale\") != std::string::npos)\n      use_absolute_scale = atof(val.c_str());\n    if (name.find(\"max_corr_dist\") != std::string::npos)\n      max_corr_dist = atof(val.c_str());\n    if (name.find(\"iteration_number\") != std::string::npos)\n      iteration_number = atof(val.c_str());\n    if (name.find(\"tuple_scale\") != std::string::npos)\n      tuple_scale = atof(val.c_str());\n    if (name.find(\"tuple_max_cnt\") != std::string::npos)\n      tuple_max_cnt = atof(val.c_str());\n  }\n  \n  // Sanity check\n  if (div_factor <= 0 || max_corr_dist < 0 || iteration_number < 0 || tuple_scale <= 0 ||\n      tuple_max_cnt <= 0) {\n    vw_throw( ArgumentErr() << \"Could not parse correctly --fgr-options.\");\n  }\n}\n  \n// Convert a point clould to the format expected by FGR\nvoid export_to_fgr(DP const & data, fgr::Points& pts, fgr::Feature & feat){\n\n  pts.clear();\n  feat.clear();\n  for (int c = 0; c < data.features.cols(); c++){\n\n    Eigen::Vector3f pts_v;\n    for (int r = 0; r < 3; r++) pts_v[r] = data.features(r, c);\n\n    pts.push_back(pts_v);\n\n    // fgr expects features in addition to points. This works well enough,\n    // but need to get to the bottom of whether they are necessary.\n    feat.push_back(pts_v); \n  }\n  \n}\n  \n/// Compute alignment using FGR\nEigen::MatrixXd fgr_alignment(DP const & source_point_cloud, \n                                          DP const & ref_point_cloud, \n                                          std::string const& fgr_options) {\n\n  // Parse the options and initialize the FGR object\n  double  div_factor; \n  bool    use_absolute_scale;\n  double  max_corr_dist;\n  int     iteration_number;\n  float   tuple_scale;\n  int     tuple_max_cnt;\n  parse_fgr_options(fgr_options, div_factor, use_absolute_scale, max_corr_dist,\n                    iteration_number, tuple_scale, tuple_max_cnt);\n  fgr::CApp app(div_factor, use_absolute_scale, max_corr_dist, iteration_number,  \n                tuple_scale, tuple_max_cnt);\n\n  // Intermediate data\n  fgr::Points pts;\n  fgr::Feature feat;\n\n  // Pass the reference cloud to FGR\n  export_to_fgr(ref_point_cloud, pts, feat);\n  app.LoadFeature(pts, feat);\n\n  // Pass the source cloud to FGR\n  export_to_fgr(source_point_cloud, pts, feat);\n  app.LoadFeature(pts, feat);\n\n  // Perform alignment\n  app.NormalizePoints();\n  app.AdvancedMatching();\n  app.OptimizePairwise(true);\n  Eigen::Matrix4f S = app.GetOutputTrans();\n\n  // Export the transform\n  Eigen::MatrixXd T = Eigen::MatrixXd::Identity(DIM + 1, DIM + 1);\n  if (T.cols() != S.cols() || T.rows() != S.rows()) \n    vw_throw( LogicErr() << \"Error: size mis-match in FGR.\\n\");\n  for (int row = 0; row < T.rows(); row++) {\n    for (int col = 0; col < T.cols(); col++) {\n      T(row, col) = S(row, col);\n    }\n  }\n\n  return T;\n}\n    \n} // end namespace asp\n"
  },
  {
    "path": "src/asp/PcAlign/pc_align_fgr.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file pc_align_fgr.h\n///\n\n#ifndef __ASP_TOOLS_PC_ALIGN_FGR_H__\n#define __ASP_TOOLS_PC_ALIGN_FGR_H__\n\n#include <asp/PcAlign/pc_align_utils.h>\n\nnamespace asp {\n \n/// Compute alignment using FGR\nEigen::MatrixXd fgr_alignment(DP const & source_point_cloud, \n                                          DP const & ref_point_cloud, \n                                          std::string const& fgr_options);\n\n}\n\n#endif //__ASP_TOOLS_PC_ALIGN_FGR_H__\n"
  },
  {
    "path": "src/asp/PcAlign/pc_align_utils.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// This tool uses libpointmatcher for alignment. BSD license.\n// https://github.com/ethz-asl/libpointmatcher\n\n#include <asp/PcAlign/pc_align_utils.h>\n#include <asp/Core/EigenUtils.h>\n#include <asp/Core/PointUtils.h>\n#include <asp/Core/PointCloudRead.h>\n#include <asp/Core/PdalUtils.h>\n\n#include <vw/Cartography/PointImageManipulation.h>\n#include <vw/Image/Filter.h>\n#include <pdal/PDALUtils.hpp>\n#include <pointmatcher/PointMatcher.h>\n\nnamespace asp {\n\nusing namespace vw;\n\n/// Apply a transform to the first three coordinates of the cloud\nstruct TransformPC: public vw::UnaryReturnSameType {\n  Eigen::MatrixXd m_T;\n  TransformPC(Eigen::MatrixXd const& T): m_T(T){}\n  inline vw::Vector<double> operator()(vw::Vector<double> const& pt) const {\n\n    vw::Vector<double> P = pt; // local copy\n    vw::Vector3 xyz = subvector(P, 0, 3);\n\n    if (xyz == vw::Vector3())\n      return P; // invalid point\n\n    vw::Vector3 Q = apply_transform_to_vec(m_T, xyz);\n    subvector(P, 0, 3) = Q;\n\n    return P;\n  }\n};\n\n// Generate labels compatible with libpointmatcher\nPLabels form_labels(int dim) {\n\n  PLabels labels;\n  typedef typename PointMatcher<double>::DataPoints::Label Label;\n\n  for (int i=0; i < dim; i++) {\n    std::string text;\n    text += char('x' + i);\n    labels.push_back(Label(text, 1));\n  }\n  labels.push_back(Label(\"pad\", 1));\n\n  return labels;\n}\n\n// Load xyz points from disk into a matrix with 4 columns. Last column is just ones.\nvoid load_cloud_as_mat(std::string const& file_name,\n                       std::int64_t num_points_to_load,\n                       vw::BBox2 const& lonlat_box,\n                       vw::BBox2 const& copc_win, bool copc_read_all,\n                       bool calc_shift,\n                       vw::Vector3 & shift,\n                       vw::cartography::GeoReference const& geo,\n                       CsvConv const& csv_conv,\n                       bool   & is_lola_rdr_format,\n                       double & median_longitude,\n                       bool verbose,\n                       Eigen::MatrixXd & data) {\n\n  if (verbose)\n    vw::vw_out() << \"Reading: \" << file_name << std::endl;\n\n  // Remote files should not be checked for existence\n  if (!asp::is_las(file_name) || !pdal::Utils::isRemote(file_name))\n    PointMatcherSupport::validateFile(file_name);\n\n  // We will over-write this below for CSV and DEM files where\n  // longitude is available.\n  median_longitude = 0.0;\n\n  std::string file_type = get_cloud_type(file_name);\n  if (file_type == \"DEM\")\n    load_dem(file_name, num_points_to_load, lonlat_box,\n             calc_shift, shift, verbose, data);\n  else if (file_type == \"PC\")\n    load_pc(file_name, num_points_to_load, lonlat_box, calc_shift, shift,\n            geo, verbose, data);\n  else if (file_type == \"LAS\")\n    load_las(file_name, num_points_to_load, lonlat_box,\n             copc_win, copc_read_all,\n             calc_shift, shift,\n             geo, verbose, data);\n  else if (file_type == \"CSV\") {\n    bool verbose = true;\n    load_csv(file_name, num_points_to_load, lonlat_box,\n             calc_shift, shift, geo, csv_conv, is_lola_rdr_format,\n             median_longitude, verbose, data);\n  } else {\n    vw::vw_throw(vw::ArgumentErr() << \"Unknown file type: \" << file_name << \"\\n\");\n  }\n\n  if (data.cols() == 0)\n    vw::vw_throw(vw::ArgumentErr() << \"File: \" << file_name << \" has 0 valid points.\\n\");\n\n  if (verbose)\n    vw::vw_out() << \"Loaded points: \" << data.cols() << std::endl;\n\n  return;\n}\n\n// Load xyz points from disk in libpointmatcher's format.\nvoid load_cloud(std::string const& file_name,\n                std::int64_t num_points_to_load,\n                vw::BBox2 const& lonlat_box,\n                vw::BBox2 const& copc_win, bool copc_read_all,\n                bool calc_shift,\n                vw::Vector3 & shift,\n                vw::cartography::GeoReference const& geo,\n                CsvConv const& csv_conv,\n                bool   & is_lola_rdr_format,\n                double & median_longitude,\n                bool verbose,\n                typename PointMatcher<double>::DataPoints & data) {\n\n  data.featureLabels = form_labels(DIM);\n  load_cloud_as_mat(file_name, num_points_to_load,  lonlat_box,\n                    copc_win, copc_read_all,\n                    calc_shift, shift,  geo,  csv_conv,  is_lola_rdr_format,\n                    median_longitude, verbose,  data.features);\n\n}\n\n// Calculate the lon-lat bounding box of the points and bias it based\n// on max displacement (which is in meters). This is used to throw\n// away points in the other cloud which are not within this box.\n// Handle the situation when there is an initial transform applied\n// to the source points.\nvoid calc_extended_lonlat_bbox(vw::cartography::GeoReference const& geo,\n                               int num_sample_pts,\n                               CsvConv const& csv_conv,\n                               std::string const& file_name,\n                               double max_disp,\n                               Eigen::MatrixXd const & transform,\n                               vw::BBox2 const& copc_win, bool copc_read_all,\n                               bool need_projwin,\n                               vw::cartography::GeoReference const& projwin_georef,\n                               vw::BBox2 & out_box,\n                               vw::BBox2 & trans_out_box,\n                               vw::BBox2 & needed_projwin) {\n\n  // Initialize\n  out_box       = vw::BBox2();\n  trans_out_box = vw::BBox2();\n  needed_projwin  = vw::BBox2();\n\n  // If the user does not want to use the max-displacement parameter,\n  // or if there is no datum to use to convert to/from lon/lat,\n  // there is not much we can do.\n  if (max_disp < 0.0 || geo.datum().name() == UNSPECIFIED_DATUM)\n    return;\n\n  PointMatcher<double>::DataPoints points;\n  double      median_longitude = 0.0; // to convert back from xyz to lonlat\n  bool        verbose        = false;\n  bool        calc_shift     = false; // won't shift the points\n  vw::Vector3 shift          = vw::Vector3(0, 0, 0);\n  vw::BBox2   dummy_box;\n  bool        is_lola_rdr_format = false; // will be overwritten\n  // Load a sample of points, hopefully enough to estimate the box reliably.\n  load_cloud(file_name, num_sample_pts, dummy_box, copc_win, copc_read_all,\n             calc_shift, shift, geo, csv_conv, is_lola_rdr_format,\n             median_longitude, verbose, points);\n\n  bool has_transform = (transform != Eigen::MatrixXd::Identity(DIM + 1, DIM + 1));\n\n  // For the first point, figure out how much shift in lonlat a small\n  // shift in XYZ produces.  We will use this to expand out from the\n  // test points when computing the bounding box.\n  vw::Vector3 p1;\n  vw::BBox2 box1, box1_trans;\n  for (int row = 0; row < DIM; row++)\n    p1[row] = points.features(row, 0);\n\n  for (int x = -1; x <= 1; x += 2) {\n    for (int y = -1; y <= 1; y += 2) {\n      for (int z = -1; z <= 1; z += 2) {\n        vw::Vector3 q   = p1 + vw::Vector3(x, y, z)*max_disp;\n        vw::Vector3 llh = geo.datum().cartesian_to_geodetic(q);\n        llh[0] += 360.0*round((median_longitude - llh[0])/360.0); // 360 deg adjust\n        box1.grow(subvector(llh, 0, 2));\n\n        // Do the same thing in transformed coordinates\n        if (has_transform) {\n          vw::Vector3 qT   = apply_transform_to_vec(transform, q);\n          vw::Vector3 llhT = geo.datum().cartesian_to_geodetic(qT);\n          llhT[0] += 360.0*round((median_longitude - llhT[0])/360.0); // 360 deg adjust\n          box1_trans.grow(subvector(llhT, 0, 2));\n        }\n      }\n    }\n  }\n\n  const double EXPANSION_MARGIN = 1.05; // Pad the size a little bit just to be safe.\n  const double rad_lon  = EXPANSION_MARGIN * box1.width       () / 2.0;\n  const double rad_lat  = EXPANSION_MARGIN * box1.height      () / 2.0;\n  const double rad_lonT = EXPANSION_MARGIN * box1_trans.width () / 2.0;\n  const double rad_latT = EXPANSION_MARGIN * box1_trans.height() / 2.0;\n\n  // Make a box around each point the size of the box we computed earlier and \n  //  keep growing the output bounding box.\n  for (int col = 0; col < points.features.cols(); col++) {\n    vw::Vector3 p;\n    for (int row = 0; row < DIM; row++)\n      p[row] = points.features(row, col);\n\n    vw::Vector3 q   = p;\n    vw::Vector3 llh = geo.datum().cartesian_to_geodetic(q);\n    llh[0] += 360.0*round((median_longitude - llh[0])/360.0); // 360 deg adjust\n    vw::BBox2 b(llh[0]-rad_lon, llh[1]-rad_lat, rad_lon*2, 2*rad_lat);\n    out_box.grow(b);\n    if (need_projwin)\n      needed_projwin.grow(projwin_georef.lonlat_to_point(subvector(llh, 0, 2)));\n\n    // Do the same thing in transformed coordinates\n    if (has_transform) {\n      vw::Vector3 qT   = apply_transform_to_vec(transform, q);\n      vw::Vector3 llhT = geo.datum().cartesian_to_geodetic(qT);\n      llhT[0] += 360.0*round((median_longitude - llhT[0])/360.0); // 360 deg adjust\n      vw::BBox2 bT(llhT[0]-rad_lonT, llhT[1]-rad_latT, 2*rad_lonT, 2*rad_latT);\n      trans_out_box.grow(bT);\n      if (need_projwin)\n        needed_projwin.grow(projwin_georef.lonlat_to_point(subvector(llhT, 0, 2)));\n    }\n  }\n\n  if (!has_transform)\n    trans_out_box = out_box;\n\n  // Here we assume needed_projwin is in units of meter, so in projected\n  // (non-geographic) space\n  if (need_projwin && max_disp > 0)\n    needed_projwin.expand(max_disp);\n\n  return;\n}\n\n// Sometime the box we computed with cartesian_to_geodetic is offset\n// from the box computed with pixel_to_lonlat by 360 degrees.\n// Fix that.\nvoid adjust_lonlat_bbox(std::string const& file_name, vw::BBox2 & box) {\n\n  using namespace vw;\n\n  // Can only adjust DEM boxes\n  if (get_cloud_type(file_name) != \"DEM\")\n    return;\n\n  cartography::GeoReference georef;\n  bool has_georef = cartography::read_georeference(georef, file_name);\n  if (!has_georef)\n    vw_throw(ArgumentErr() << \"DEM: \" << file_name << \" does not have a georeference.\\n\");\n\n  DiskImageView<float> dem(file_name);\n  BBox2 box2 = georef.pixel_to_lonlat_bbox(bounding_box(dem));\n\n  double mean_lon  = (box.min().x() + box.max().x())/2.0;\n  double mean_lon2 = (box2.min().x() + box2.max().x())/2.0;\n\n  double lon_offset = mean_lon2 - mean_lon;\n  lon_offset = 360.0*round(lon_offset/360.0);\n\n  box += Vector2(lon_offset, 0);\n}\n\ndouble calc_mean(std::vector<double> const& errs, int len) {\n\n  // Check that len is valid\n  if (len < 0 || len > static_cast<int>(errs.size()))\n    vw::vw_throw(vw::ArgumentErr() << \"Invalid length in calc_mean.\\n\");\n\n  double mean = 0.0;\n  for (int i = 0; i < len; i++) {\n    mean += errs[i];\n  }\n  if (len == 0) return 0;\n  return mean/len;\n}\n\ndouble calc_stddev(std::vector<double> const& errs) {\n\n  int len = errs.size();\n  if (len == 0)\n    return 0;\n\n  double mean = calc_mean(errs, len);\n  double variance_sum = 0.0;\n\n  for (int i = 0; i < len; i++)\n      variance_sum += (errs[i] - mean) * (errs[i] - mean);\n\n  return std::sqrt(variance_sum / len);\n}\n\ndouble calc_rmse(std::vector<double> const& errs) {\n\n  int len = errs.size();\n\n  double sum = 0.0;\n  for (int i = 0; i < len; i++)\n    sum += errs[i] * errs[i];\n\n  if (len == 0)\n    return 0;\n  return sqrt(sum/len);\n}\n\n// Compute the translation vector from the source points (before any initial alignment\n// applied to them), and the source points after alignment.   \nvoid calc_translation_vec(Eigen::MatrixXd const& initT,\n                          DP const& source, DP const& trans_source,\n                          vw::Vector3 & shift, // from planet center to current origin\n                          vw::cartography::Datum const& datum,\n                          vw::Vector3 & source_ctr_vec,\n                          vw::Vector3 & source_ctr_llh,\n                          vw::Vector3 & trans_xyz,\n                          vw::Vector3 & trans_ned,\n                          vw::Vector3 & trans_llh,\n                          vw::Matrix3x3 & NedToEcef) {\n\n  // The center of gravity of the source points (after the initial transform is applied to them)\n  Eigen::VectorXd source_ctr\n    = source.features.rowwise().sum() / source.features.cols();\n\n  // Undo the initial transform, if any \n  Eigen::MatrixXd invInitT = initT.inverse();\n  source_ctr = invInitT*source_ctr;\n\n  // The center of gravity of the source points after aligning to the reference cloud\n  Eigen::VectorXd trans_source_ctr\n    = trans_source.features.rowwise().sum() / trans_source.features.cols();\n\n  // Copy to VW's vectors\n  vw::Vector3 trans_source_ctr_vec;\n  for (int row = 0; row < DIM; row++) {\n    source_ctr_vec[row]       = source_ctr(row, 0);\n    trans_source_ctr_vec[row] = trans_source_ctr(row, 0);\n  }\n\n  // Make these vectors in reference to the center of the planet\n  source_ctr_vec       += shift;\n  trans_source_ctr_vec += shift;\n\n  trans_xyz = trans_source_ctr_vec - source_ctr_vec;\n\n  source_ctr_llh = datum.cartesian_to_geodetic(source_ctr_vec);\n  vw::Vector3 trans_source_ctr_llh = datum.cartesian_to_geodetic(trans_source_ctr_vec);\n  trans_llh = trans_source_ctr_llh - source_ctr_llh;\n\n  // The matrix to go from the NED coordinate system to the ECEF coordinate system\n  NedToEcef = datum.lonlat_to_ned_matrix(source_ctr_llh);\n\n  trans_ned = inverse(NedToEcef)*trans_xyz;\n}\n\n// Calculate the maximum displacement from the source points (after\n// any initial transform is applied to them) to the source points\n// after alignment with the reference.\ndouble calc_max_displacement(DP const& source, DP const& trans_source) {\n\n  double max_obtained_disp = 0.0;\n  int numPts = source.features.cols();\n  for (int col = 0; col < numPts; col++) {\n\n    vw::Vector3 s, t;\n    for (int row = 0; row < DIM; row++) {\n      s[row] = source.features(row, col);\n      t[row] = trans_source.features(row, col);\n    }\n    max_obtained_disp = std::max(max_obtained_disp, norm_2(s - t));\n  }\n\n  return max_obtained_disp;\n}\n\n/// Save a transformed point cloud with N bands\ntemplate<int n> // Number of bands\nvoid save_trans_point_cloud_n(vw::GdalWriteOptions const& opt,\n                              vw::cartography::GeoReference const& geo,\n                              std::string input_file,\n                              std::string output_file,\n                              Eigen::MatrixXd const& T) {\n\n  // We will try to save the transformed cloud with a georef. Try to get it from\n  // the input cloud, or otherwise from the \"global\" georef.\n  vw::cartography::GeoReference curr_geo;\n  bool has_georef = vw::cartography::read_georeference(curr_geo, input_file);\n  if (!has_georef && geo.datum().name() != UNSPECIFIED_DATUM) {\n    has_georef = true;\n    curr_geo = geo;\n  }\n\n  // There is no nodata\n  bool has_nodata = false;\n  double nodata = -std::numeric_limits<float>::max(); // smallest float\n\n  vw::ImageViewRef<vw::Vector<double, n>> point_cloud;\n  if constexpr (n == 3) point_cloud = read_asp_point_cloud_3(input_file);\n  else if constexpr (n == 4) point_cloud = read_asp_point_cloud_4(input_file);\n  else if constexpr (n == 6) point_cloud = read_asp_point_cloud_6(input_file);\n  vw::cartography::block_write_gdal_image(output_file,\n                              per_pixel_filter(point_cloud, TransformPC(T)),\n                              has_georef, curr_geo,\n                              has_nodata, nodata,\n                              opt, vw::TerminalProgressCallback(\"asp\", \"\\t--> \"));\n}\n\n/// Apply a given transform to the point cloud in input file,\n/// and save it.\n/// Note: We transform the entire point cloud, not just the resampled\n/// version used in alignment.\nvoid save_trans_point_cloud(vw::GdalWriteOptions const& opt,\n                            std::string input_file,\n                            std::string out_prefix,\n                            vw::BBox2 const& copc_win, bool copc_read_all,\n                            vw::cartography::GeoReference const& geo,\n                            CsvConv const& csv_conv,\n                            Eigen::MatrixXd const& T) {\n\n  std::string file_type = get_cloud_type(input_file);\n\n  std::string output_file;\n  if (file_type == \"CSV\")\n    output_file = out_prefix + \".csv\";\n  else if (file_type == \"LAS\")\n    output_file = out_prefix + boost::filesystem::path(input_file).extension().string();\n  else\n    output_file = out_prefix + \".tif\";\n  vw::vw_out() << \"Writing: \" << output_file << std::endl;\n\n  if (file_type == \"DEM\") {\n    // TODO(oalexan1): This must be a function.\n    vw::cartography::GeoReference dem_geo;\n    bool has_georef = vw::cartography::read_georeference(dem_geo, input_file);\n    if (!has_georef) vw_throw(vw::ArgumentErr() << \"DEM: \" << input_file\n                           << \" does not have a georeference.\\n\");\n\n    vw::DiskImageView<float> dem(input_file);\n    double nodata = std::numeric_limits<double>::quiet_NaN();\n    {\n      boost::shared_ptr<vw::DiskImageResource> dem_rsrc\n        (new vw::DiskImageResourceGDAL(input_file));\n      if (dem_rsrc->has_nodata_read()) nodata = dem_rsrc->nodata_read();\n    }\n    vw::ImageViewRef<vw::Vector3> point_cloud =\n      geodetic_to_cartesian(dem_to_geodetic(create_mask(dem, nodata), dem_geo),\n                             dem_geo.datum());\n\n    // Save the georeference with the cloud, to help point2dem later\n    bool has_nodata2 = false; // the cloud should not use DEM nodata\n    vw::cartography::block_write_gdal_image(output_file,\n                                per_pixel_filter(point_cloud, TransformPC(T)),\n                                has_georef, dem_geo,\n                                has_nodata2, nodata,\n                                opt, vw::TerminalProgressCallback(\"asp\", \"\\t--> \"));\n\n  } else if (file_type == \"PC\") {\n\n    // Need this logic because we cannot open an image\n    // with n channels without knowing n beforehand.\n    // TODO(oalexan1): This must be a function.\n    int nc = vw::get_num_channels(input_file);\n    switch (nc) {\n    case 3:  save_trans_point_cloud_n<3>(opt, geo, input_file, output_file, T);  break;\n    case 4:  save_trans_point_cloud_n<4>(opt, geo, input_file, output_file, T);  break;\n    case 6:  save_trans_point_cloud_n<6>(opt, geo, input_file, output_file, T);  break;\n    default:\n      vw_throw(vw::ArgumentErr() << \"The point cloud from \" << input_file\n                << \" has \" << nc << \" channels, which is not supported.\\n\");\n    }\n\n  } else if (file_type == \"LAS\") {\n\n    asp::apply_transform_to_las(input_file, output_file, copc_win, copc_read_all, T);\n\n  } else if (file_type == \"CSV\") {\n\n    // Write a CSV file in format consistent with the input CSV file.\n    // TODO(oalexan1): This must be a function.\n\n    vw::BBox2   empty_box, copc_win;\n    bool        verbose = false, copc_read_all = false;\n    bool        calc_shift = true;\n    vw::Vector3 shift;\n    bool        is_lola_rdr_format;\n    double      median_longitude;\n    DP          point_cloud;\n    load_cloud(input_file, std::numeric_limits<int>::max(),\n               empty_box, copc_win, copc_read_all,\n               calc_shift, shift,\n               geo, csv_conv, is_lola_rdr_format,\n               median_longitude, verbose, point_cloud);\n\n    std::ofstream outfile(output_file.c_str());\n    outfile.precision(16);\n\n    // Write the header line\n    if (csv_conv.is_configured()) {\n      outfile << \"# \" << csv_conv.write_header_string(\",\");\n      outfile << std::endl;\n    } else {\n      if (is_lola_rdr_format)\n        outfile << \"# longitude,latitude,radius (km)\" << std::endl;\n      else\n        outfile << \"# latitude,longitude,height above datum (meters)\" << std::endl;\n    }\n\n    // Save the datum, may be useful to know what it was\n    if (geo.datum().name() != UNSPECIFIED_DATUM) {\n      outfile << \"# \" << geo.datum() << std::endl;\n      outfile << \"# Projection: \" << geo.get_wkt() << std::endl;\n    }\n\n    int numPts = point_cloud.features.cols();\n    vw::TerminalProgressCallback tpc(\"asp\", \"\\t--> \");\n    int hundred = 100;\n    int spacing = std::max(numPts/hundred, 1);\n    double inc_amount = 1.0 / hundred;\n    for (int col = 0; col < numPts; col++) {\n\n      Eigen::VectorXd V(DIM + 1);\n      for (int row = 0; row < DIM; row++)\n        V[row] = point_cloud.features(row, col) + shift[row];\n      V[DIM] = 1;\n\n      // Apply the transform\n      V = T*V;\n\n      vw::Vector3 P;\n      for (int row = 0; row < DIM; row++) P[row] = V[row];\n\n      if (csv_conv.is_configured()) {\n\n        vw::Vector3 csv = csv_conv.cartesian_to_csv(P, geo, median_longitude);\n        outfile << csv[0] << ',' << csv[1] << ',' << csv[2] << std::endl;\n\n      } else {\n        vw::Vector3 llh = geo.datum().cartesian_to_geodetic(P); // lon-lat-height\n        llh[0] += 360.0*round((median_longitude - llh[0])/360.0); // 360 deg adjustment\n\n        if (is_lola_rdr_format)\n          outfile << llh[0] << ',' << llh[1] << ',' << norm_2(P)/1000.0 << std::endl;\n        else\n          outfile << llh[1] << ',' << llh[0] << ',' << llh[2] << std::endl;\n      }\n\n      if (col%spacing == 0) tpc.report_incremental_progress(inc_amount);\n    }\n    tpc.report_finished();\n    outfile.close();\n\n  } else {\n    vw_throw(vw::ArgumentErr() << \"Unknown file type: \" << input_file << \"\\n\");\n  }\n} // end save_trans_point_cloud\n\nInterpolationReadyDem load_interpolation_ready_dem(std::string const& dem_path,\n                                                   vw::cartography::GeoReference & georef) {\n  // Load the georeference from the DEM\n  bool has_georef = vw::cartography::read_georeference(georef, dem_path);\n  if (!has_georef)\n    vw::vw_throw(vw::ArgumentErr() << \"DEM: \" << dem_path\n                 << \" does not have a georeference.\\n\");\n\n  // Set up file handle to the DEM and read the nodata value\n  vw::DiskImageView<float> dem(dem_path);\n  double nodata = std::numeric_limits<double>::quiet_NaN();\n  {\n    boost::shared_ptr<vw::DiskImageResource>\n      dem_rsrc(new vw::DiskImageResourceGDAL(dem_path));\n    if (dem_rsrc->has_nodata_read())\n      nodata = dem_rsrc->nodata_read();\n  }\n\n  // Set up interpolation + mask view of the DEM\n  vw::ImageViewRef<vw::PixelMask<float>> masked_dem = create_mask(dem, nodata);\n  return InterpolationReadyDem(interpolate(masked_dem));\n}\n\n\n/// Try to read the georef/datum info, need it to read CSV files.\nvoid read_georef(std::vector<std::string> const& clouds,\n                 std::string const& datum_str,\n                 std::string const& csv_srs,\n                 double semi_major_axis,\n                 double semi_minor_axis,\n                 std::string & csv_format_str,\n                 asp::CsvConv& csv_conv, vw::cartography::GeoReference& geo) {\n\n  // Use an initialized datum for the georef, so later we can check\n  // if we manage to populate it.\n  {\n    vw::cartography::Datum datum(UNSPECIFIED_DATUM, \"User Specified Spheroid\",\n              \"Reference Meridian\", 1, 1, 0);\n    geo.set_datum(datum);\n  }\n\n  // First, get the datum from the DEM if available.\n  bool is_good = false;\n  std::string dem_file = \"\";\n  for (size_t it = 0; it < clouds.size(); it++) {\n    if (asp::get_cloud_type(clouds[it]) == \"DEM\") {\n      dem_file = clouds[it];\n      break;\n    }\n  }\n\n  if (dem_file != \"\") {\n    vw::cartography::GeoReference local_geo;\n    bool have_georef = vw::cartography::read_georeference(local_geo, dem_file);\n    if (!have_georef)\n      vw::vw_throw(vw::ArgumentErr()\n                   << \"DEM: \" << dem_file << \" does not have a georeference.\\n\");\n    geo = local_geo;\n    is_good = true;\n  }\n\n  // Then, try to set it from the pc file if available.\n  // Either one, or both or neither of the pc files may have a georef.\n  std::string pc_file = \"\";\n  for (size_t it = 0; it < clouds.size(); it++) {\n    if (is_good)\n      break;\n    if (asp::get_cloud_type(clouds[it]) == \"PC\") {\n      vw::cartography::GeoReference local_geo;\n      if (vw::cartography::read_georeference(local_geo, clouds[it])) {\n        pc_file = clouds[it];\n        geo = local_geo;\n        vw::vw_out() << \"Detected datum from \" << pc_file << \":\\n\" << geo.datum() << std::endl;\n        is_good = true;\n        break;\n      }\n    }\n  }\n\n  // Then, try to set it from the las file if available.\n  // Either one, or both or neither of the las files may have a georef.\n  std::string las_file = \"\";\n  for (size_t it = 0; it < clouds.size(); it++) {\n    if (is_good)\n      break;\n    if (asp::get_cloud_type(clouds[it]) == \"LAS\") {\n      vw::cartography::GeoReference local_geo;\n      if (asp::georef_from_las(clouds[it], local_geo)) {\n        las_file = clouds[it];\n        geo = local_geo;\n        vw::vw_out() << \"Detected datum from \" << las_file << \":\\n\" << geo.datum() << std::endl;\n        is_good = true;\n      }\n    }\n  }\n\n  // We should have read in the datum from an input file, but check to see if\n  //  we should override it with input parameters.\n  if (datum_str != \"\") {\n    // If the user set the datum, use it.\n    vw::cartography::Datum datum;\n    datum.set_well_known_datum(datum_str);\n    geo.set_datum(datum);\n    is_good = true;\n  } else if (semi_major_axis > 0 && semi_minor_axis > 0) {\n    // Otherwise, if the user set the semi-axes, use that.\n    vw::cartography::Datum datum(\"User Specified Datum\", \"User Specified Spheroid\",\n                                 \"Reference Meridian\",\n                                 semi_major_axis, semi_minor_axis, 0.0);\n    geo.set_datum(datum);\n    is_good = true;\n  }\n\n  // This must be the last as it has priority. Add to the georef based on --csv-srs.\n  if (csv_conv.parse_georef(geo))\n    is_good = true;\n\n  if (is_good)\n    vw::vw_out() << \"Will use datum (for CSV files): \" << geo.datum() << std::endl;\n\n  // A lot of care is needed below.\n  if (!is_good  && (csv_format_str == \"\" || csv_conv.get_format() != asp::CsvConv::XYZ)) {\n    // There is no DEM/LAS to read the datum from, and the user either\n    // did not specify the CSV format (then we set it to lat, lon,\n    // height), or it is specified as containing lat, lon, rather than xyz.\n    bool has_csv = false;\n    for (size_t it = 0; it < clouds.size(); it++)\n      has_csv = has_csv || (asp::get_cloud_type(clouds[it]) == \"CSV\");\n    if (has_csv) {\n      // We are in trouble, will not be able to convert input lat, lon, to xyz.\n      vw::vw_throw(vw::ArgumentErr() << \"Cannot detect the datum. \"\n                    << \"Please specify it via --csv-srs or --datum or \"\n                    << \"--semi-major-axis and --semi-minor-axis.\\n\");\n    } else {\n      // The inputs have no georef. Will have to write xyz.\n      vw::vw_out() << \"No datum specified. Will write output CSV files \"\n                   << \"in the x,y,z format.\" << std::endl;\n      csv_format_str = \"1:x 2:y 3:z\";\n      csv_conv.parse_csv_format(csv_format_str, csv_srs);\n      is_good = true;\n    }\n  }\n\n  if (!is_good)\n    vw::vw_throw(vw::InputErr() << \"The datum is required and could not be set.\\n\");\n\n  return;\n}\n\nvoid extract_rotation_translation(const double * transform, vw::Quat & rotation,\n                                  vw::Vector3 & translation) {\n\n  vw::Vector3 axis_angle;\n  for (int i = 0; i < 3; i++) {\n    translation[i] = transform[i];\n    axis_angle[i]  = transform[i+3];\n  }\n  rotation = vw::math::axis_angle_to_quaternion(axis_angle);\n}\n\n/// Extracts the full GCC coordinate of a single point from a LibPointMatcher point cloud.\n/// - The shift converts from the normalized coordinate to the actual GCC coordinate.\n/// - No bounds checking is performed on the point index.\nVector3 get_cloud_gcc_coord(DP const& point_cloud, vw::Vector3 const& shift, int index) {\n  Vector3 gcc_coord;\n  for (int row = 0; row < DIM; ++row)\n     gcc_coord[row] = point_cloud.features(row, index) + shift[row];\n  return gcc_coord;\n}\n\nbool interp_dem_height(vw::ImageViewRef<vw::PixelMask<float> > const& dem,\n                       vw::cartography::GeoReference const & georef,\n                       vw::Vector3                   const & lonlat,\n                       double                              & dem_height) {\n  // Convert the lon/lat location into a pixel in the DEM.\n  vw::Vector2 pix;\n  try {\n    pix = georef.lonlat_to_pixel(subvector(lonlat, 0, 2));\n  } catch(...) {\n    return false;\n  }\n\n  double c = pix[0], r = pix[1];\n\n  // Quit if the pixel falls outside the DEM.\n  if (c < 0 || c >= dem.cols()-1 || // TODO: This ought to be an image class function\n      r < 0 || r >= dem.rows()-1)\n    return false;\n\n  // Interpolate the DEM height at the pixel location\n  vw::PixelMask<float> v = dem(c, r);\n  if (!is_valid(v))\n    return false;\n\n  dem_height = v.child();\n  return true;\n}\n\n// Consider a 4x4 matrix T which implements a rotation + translation\n// y = A*x + b. Consider a point s in space close to the points\n// x. We want to make that the new origin, so the points x get\n// closer to origin. In the coordinates (x2 = x - s, y2 = y - s) the\n// transform becomes y2 + s = A*(x2 + s) + b, or\n// y2 = A*x2 + b + A*s - s. Encode the obtained transform into another\n// 4x4 matrix T2.\nEigen::MatrixXd apply_shift(Eigen::MatrixXd const& T, vw::Vector3 const& shift) {\n\n  VW_ASSERT(T.cols() == 4 && T.rows() == 4,\n            vw::ArgumentErr() << \"Expected square matrix of size 4.\");\n\n  Eigen::MatrixXd A = T.block(0, 0, 3, 3);\n  Eigen::MatrixXd b = T.block(0, 3, 3, 1);\n\n  Eigen::MatrixXd s = b;\n  for (int i = 0; i < 3; i++) s(i, 0) = shift[i];\n\n  Eigen::MatrixXd b2 = b + A*s - s;\n  Eigen::MatrixXd T2 = T;\n  T2.block(0, 3, 3, 1) = b2;\n\n  return T2;\n}\n\n/// Filters out all points from point_cloud with an error entry higher than cutoff\nvoid filterPointsByError(DP & point_cloud, Eigen::MatrixXd &errors, double cutoff) {\n\n  DP input_copy = point_cloud; // Make a copy of the input DP object\n\n  // Init LPM data structure\n  const int input_point_count = point_cloud.features.cols();\n  if (errors.cols() != input_point_count)\n    vw_throw(LogicErr() << \"Error: error size does not match point count size!\\n\");\n  point_cloud.features.conservativeResize(DIM+1, input_point_count);\n  point_cloud.featureLabels = asp::form_labels(DIM);\n\n  // Loop through all the input points and copy them to the output if they pass the test\n  std::int64_t points_count = 0;\n  for (std::int64_t col = 0; col < input_point_count; ++col) {\n\n    if (errors(0,col) > cutoff)\n      continue; // Error too high, don't add this point\n\n    // Copy this point to the output LPM structure\n    for (std::int64_t row = 0; row < DIM; row++)\n      point_cloud.features(row, points_count) = input_copy.features(row, col);\n    point_cloud.features(DIM, points_count) = 1; // Extend to be a homogenous coordinate\n    ++points_count; // Update output point count\n\n  } // End loop through points\n\n  // Finalize the LPM data structure\n  point_cloud.features.conservativeResize(Eigen::NoChange, points_count);\n\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/PcAlign/pc_align_utils.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// This tool uses libpointmatcher for alignment,\n// https://github.com/ethz-asl/libpointmatcher\n// Copyright (c) 2010--2012,\n// Francois Pomerleau and Stephane Magnenat, ASL, ETHZ, Switzerland\n// You can contact the authors at <f dot pomerleau at gmail dot com> and\n// <stephane at magnenat dot net>\n\n#ifndef __PC_ALIGN_UTILS_H__\n#define __PC_ALIGN_UTILS_H__\n\n#include <Eigen/Dense>\n\n#include <vw/FileIO/DiskImageView.h>\n#include <vw/Cartography/Datum.h>\n#include <vw/Cartography/GeoReference.h>\n#include <vw/FileIO/DiskImageUtils.h>\n#include <vw/Math/Quaternion.h>\n#include <vw/FileIO/GdalWriteOptions.h>\n#include <vw/Image/Interpolation.h>\n\n#include <limits>\n#include <cstring>\n\n#include <pointmatcher/PointMatcher.h>\n\nnamespace asp {\n\n// Forward declaration - full definition in EigenUtils.h\nclass CsvConv;\n\n// This file contains helper functions for the pc_align tool.\n\n// Some of these could probably be moved elsewhere, but many of them depend on\n// libpointmatcher object types.\n\ntypedef PointMatcher<double> PM;\ntypedef PM::DataPoints DP;\ntypedef PointMatcher<double>::DataPoints::Labels PLabels;\n\nconst std::string UNSPECIFIED_DATUM = \"unspecified_datum\";\n\n// Generate labels compatible with libpointmatcher\nPLabels form_labels(int dim);\n\n// Load xyz points from disk into a matrix with 4 columns. Last column is just ones.\nvoid load_cloud_as_mat(std::string const& file_name,\n                       std::int64_t num_points_to_load,\n                       vw::BBox2 const& lonlat_box,\n                       vw::BBox2 const& copc_win, bool copc_read_all,\n                       bool calc_shift,\n                       vw::Vector3 & shift,\n                       vw::cartography::GeoReference const& geo,\n                       CsvConv const& csv_conv,\n                       bool   & is_lola_rdr_format,\n                       double & median_longitude,\n                       bool verbose,\n                       Eigen::MatrixXd & data);\n\n/// Load a file from disk and convert to libpointmatcher's format\nvoid load_cloud(std::string const& file_name,\n                std::int64_t num_points_to_load,\n                vw::BBox2 const& lonlat_box,\n                vw::BBox2 const& copc_win, bool copc_read_all,\n                bool calc_shift,\n                vw::Vector3 & shift,\n                vw::cartography::GeoReference const& geo,\n                CsvConv const& csv_conv,\n                bool   & is_lola_rdr_format,\n                double & median_longitude,\n                bool verbose,\n                typename PointMatcher<double>::DataPoints & data);\n\n/// Calculate the lon-lat bounding box of the points and bias it based\n/// on max displacement (which is in meters). This is used to throw\n/// away points in the other cloud which are not within this box.\n/// Return a version of it with given transform applied to it.\n/// Also may calculate a proj win if needed.\nvoid calc_extended_lonlat_bbox(vw::cartography::GeoReference const& geo,\n                               int num_sample_pts,\n                               CsvConv const& csv_conv,\n                               std::string const& file_name,\n                               double max_disp,\n                               Eigen::MatrixXd const & transform,\n                               vw::BBox2 const& copc_win, bool copc_read_all,\n                               bool need_projwin, \n                               vw::cartography::GeoReference const& projwin_georef,\n                               vw::BBox2 & out_box, \n                               vw::BBox2 & trans_out_box,\n                               vw::BBox2 & needed_projwin);\n  \n/// Compute the mean value of an std::vector out to a length\ndouble calc_mean(std::vector<double> const& errs, int len);\n\n/// Compute the standard deviation of an std::vector\ndouble calc_stddev(std::vector<double> const& errs);\n\n/// Compute the root mean square error of an std::vector\ndouble calc_rmse(std::vector<double> const& errs);\n\n/// Calculate translation vector between the centers two point clouds\nvoid calc_translation_vec(Eigen::MatrixXd const& initT,\n                          DP const& source, DP const& trans_source,\n                          vw::Vector3 & shift, // from planet center to current origin\n                          vw::cartography::Datum const& datum,\n                          vw::Vector3 & source_ctr_vec,\n                          vw::Vector3 & source_ctr_llh,\n                          vw::Vector3 & trans_xyz,\n                          vw::Vector3 & trans_ned,\n                          vw::Vector3 & trans_llh,\n                          vw::Matrix3x3 & NedToEcef);\n\n/// Calculate max distance between any two points of two point clouds.\ndouble calc_max_displacement(DP const& source, DP const& trans_source);\n\n/// Apply a transformation matrix to a Vector3 in homogenous coordinates\nvw::Vector3 apply_transform(Eigen::MatrixXd const& T, vw::Vector3 const& P);\n\n/// Apply a given transform to the point cloud in input file, and save it.\n/// - Note: We transform the entire point cloud, not just the resampled\n///   version used in alignment.\nvoid save_trans_point_cloud(vw::GdalWriteOptions const& opt,\n                            std::string input_file,\n                            std::string out_prefix,\n                            vw::BBox2 const& copc_win, bool copc_read_all,\n                            vw::cartography::GeoReference const& geo,\n                            CsvConv const& csv_conv,\n                            Eigen::MatrixXd const& T);\n\n/// A type for interpolation from a masked DEM object.\ntypedef vw::InterpolationView<vw::EdgeExtensionView<vw::ImageViewRef<vw::PixelMask<float>>,\n                              vw::ConstantEdgeExtension>, vw::BilinearInterpolation>\n                              InterpolationReadyDem;\n\n/// Get ready to interpolate points on a DEM existing on disk.\nInterpolationReadyDem load_interpolation_ready_dem(std::string const& dem_path,\n                                                   vw::cartography::GeoReference & georef);\n\n// Extract rotation and translation from a vector of 6 elements\nvoid extract_rotation_translation(const double * transform, vw::Quat & rotation, \n                                  vw::Vector3 & translation);\n\n\nvw::Vector3 get_cloud_gcc_coord(DP const& point_cloud, \n                                vw::Vector3 const& shift, int index);\n\n/// Interpolates the DEM height at the input coordinate.\n/// - Returns false if the coordinate falls outside the valid DEM area.\nbool interp_dem_height(vw::ImageViewRef<vw::PixelMask<float>> const& dem,\n                       vw::cartography::GeoReference          const& georef,\n                       vw::Vector3                            const& lonlat,\n                       double                                      & dem_height);\n\n/// Consider a 4x4 matrix T which implements a rotation + translation\n/// y = A*x + b. Consider a point s in space close to the points\n/// x. We want to make that the new origin, so the points x get\n/// closer to origin. In the coordinates (x2 = x - s, y2 = y - s) the\n/// transform becomes y2 + s = A*(x2 + s) + b, or\n/// y2 = A*x2 + b + A*s - s. Encode the obtained transform into another 4x4 matrix T2.\nEigen::MatrixXd apply_shift(Eigen::MatrixXd const& T, vw::Vector3 const& shift);\n\n// Sometime the box we computed with cartesian_to_geodetic is offset\n// from the box computed with pixel_to_lonlat by 360 degrees.\n// Fix that.\nvoid adjust_lonlat_bbox(std::string const& file_name, vw::BBox2 & box);\n\n/// Try to read the georef/datum info, need it to read CSV files.\nvoid read_georef(std::vector<std::string> const& clouds,\n                 std::string const& datum_str,\n                 std::string const& csv_srs, \n                 double semi_major_axis,\n                 double semi_minor_axis,\n                 std::string & csv_format_str,\n                 asp::CsvConv& csv_conv, vw::cartography::GeoReference& geo);\n\n/// Filters out all points from point_cloud with an error entry higher than cutoff\nvoid filterPointsByError(DP & point_cloud, Eigen::MatrixXd &errors,\n                         double cutoff);\n\n}\n\n#endif // #define __PC_ALIGN_UTILS_H__\n"
  },
  {
    "path": "src/asp/PclIO/CMakeLists.txt",
    "content": "# Use wrapper function at this level to avoid code duplication\nadd_library_wrapper(AspPclIO \"${ASP_PCLIO_SRC_FILES}\" \"${ASP_PCLIO_TEST_FILES}\" \n                    \"${ASP_PCLIO_LIB_DEPENDENCIES}\")\n"
  },
  {
    "path": "src/asp/PclIO/PclIO.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Interface with PCL.\n\n#include <vw/Image/ImageViewRef.h>\n#include <vw/FileIO/FileUtils.h>\n#include <asp/PclIO/PclIO.h>\n\n#include <boost/filesystem.hpp>\n#include <boost/algorithm/string.hpp>\n\n#include <pcl/io/pcd_io.h>\n#include <pcl/io/ply_io.h>\n\nnamespace fs = boost::filesystem;\n\nnamespace asp {\n  \nvoid writeCloud(vw::ImageViewRef<vw::Vector<double, 4>> cloud,\n                vw::ImageViewRef<float> out_texture,\n                vw::ImageViewRef<float> weight,\n                std::string const& cloud_file) {\n      \n  std::string ext = fs::path(cloud_file).extension().string();\n  boost::algorithm::to_lower(ext);\n  if (ext != \".pcd\" && ext != \".ply\") \n    vw::vw_throw(vw::ArgumentErr() << \"The input point cloud extension must be .pcd or .ply.\");\n\n  // Create the output directory\n  vw::create_out_dir(cloud_file);\n\n  // Save the cloud\n  std::cout << \"Writing: \" << cloud_file << std::endl;\n\n  bool write_ply = (ext == \".ply\");\n  if (write_ply) {\n\n    // Write ply \n    pcl::PointCloud<pcl::PointXYZI> pc;\n      \n    pc.width = std::int64_t(cloud.cols()) * std::int64_t(cloud.rows());  // avoid int overflow\n    pc.height = 1;\n    pc.points.resize(std::int64_t(pc.width) * std::int64_t(pc.height)); // avoid overflow\n      \n    std::int64_t count = 0;\n    for (std::int64_t col = 0; col < cloud.cols(); col++) {\n      for (std::int64_t row = 0; row < cloud.rows(); row++) {\n        vw::Vector<double, 4> const& Q = cloud(col, row); // alias\n        if (subvector(Q, 0, 3) != vw::Vector3() && weight(col, row) > 0) {\n          pc.points[count].x         = Q[0];\n          pc.points[count].y         = Q[1];\n          pc.points[count].z         = Q[2];\n          pc.points[count].intensity = out_texture(col, row);  // intensity\n          count++;\n        }\n      }\n    }\n\n    pc.width = count;\n    pc.points.resize(pc.width * pc.height);\n    \n    pcl::io::savePLYFileBinary(cloud_file, pc);\n\n  } else {\n        \n    // Write pcd\n    pcl::PointCloud<pcl::PointNormal> pc;\n\n    pc.width = std::int64_t(cloud.cols()) * std::int64_t(cloud.rows()); \n    pc.height = 1;\n    pc.points.resize(pc.width * pc.height);\n      \n    std::int64_t count = 0;\n    for (std::int64_t col = 0; col < cloud.cols(); col++) {\n      for (std::int64_t row = 0; row < cloud.rows(); row++) {\n        vw::Vector<double, 4> const& Q = cloud(col, row); // alias\n        if (subvector(Q, 0, 3) != vw::Vector3() && weight(col, row) > 0) {\n          pc.points[count].x         = Q[0];\n          pc.points[count].y         = Q[1];\n          pc.points[count].z         = Q[2];\n          // As expected by VoxBlox\n          pc.points[count].normal_x  = out_texture(col, row);  // intensity\n          pc.points[count].normal_y  = weight(col, row); // weight\n          pc.points[count].normal_z  = Q[3]; // intersection error\n          pc.points[count].curvature = 0;  // ensure initialization\n          count++;\n        }\n      }\n    }\n\n    pc.width = count;\n    pc.points.resize(pc.width * pc.height);\n    \n    pcl::io::savePCDFileBinary(cloud_file, pc);\n  }\n  \n  return;\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/PclIO/PclIO.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n/// \\file PclIo.h\n///\n\n#ifndef __ASP_PCLIO_PCLIO_H__\n#define __ASP_PCLIO_PCLIO_H__\n\n#include <string>\n\n#include <vw/Image/ImageViewRef.h>\n\nnamespace asp {\n\n  void writeCloud(vw::ImageViewRef<vw::Vector<double, 4>> cloud,\n                  vw::ImageViewRef<float> out_texture,\n                  vw::ImageViewRef<float> weight,\n                  std::string const& cloud_file);\n  \n} // end namespace asp\n\n#endif//__ASP_PCLIO_PCLIO_H__\n"
  },
  {
    "path": "src/asp/Python/CMakeLists.txt",
    "content": "\n# Python\n\n# Install all of the python files.\nset(PYTHON_FILES asp_alg_utils.py   asp_image_utils.py\n                 asp_cmd_utils.py   asp_string_utils.py\n                 asp_file_utils.py  asp_system_utils.py\n                 asp_geo_utils.py   asp_stereo_utils.py\n                 asp_rig_utils.py   asp_dist_utils.py)\n\nforeach(p ${PYTHON_FILES})\n  INSTALL(FILES ${p}  DESTINATION libexec)\nendforeach()\n"
  },
  {
    "path": "src/asp/Python/asp_alg_utils.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n\"\"\"\n   Misc functions implementing algorithms.\n\"\"\"\nfrom __future__ import print_function\nimport sys, os, re, string, time, math\n\nclass BBox:\n    def __init__(self, x, y, width, height):\n        self.x      = x\n        self.y      = y\n        self.width  = width\n        self.height = height\n\n    def add_collar(self, size):\n        '''Expands the BBox in all directions by the given size'''\n        self.x      -= size\n        self.y      -= size\n        self.width  += 2*size\n        self.height += 2*size\n\n    def name_str(self):\n        return \"%i_%i_%i_%i\" % (self.x, self.y, self.width, self.height)\n\n    def as_array(self):\n        '''Return the upper-left corner and dimensions of the crop box in an array of strings.'''\n        return [str(self.x), str(self.y), str(self.width), str(self.height)]\n                \n    def __str__(self):\n        return 'BBox('+ str(self.x) +', '+ str(self.y) +', '+ str(self.width) +', '+ str(self.height) +')' \n\ndef dirToTile(dir):\n    '''\n      From run/run-512_0_512_512 extract the bbox 512 0 512 512.\n    '''\n\n    # Split by _ and -\n    parts = re.split('[-_]', dir)\n    \n    # Must be at least 4 of them\n    if len(parts) < 4:\n        raise Exception('Could not extract bbox from ' + dir)\n    \n    # Last 4 parts are the bbox\n    bbox = BBox(int(parts[-4]), int(parts[-3]), int(parts[-2]), int(parts[-1]))\n    return bbox\n\ndef readDirList(out_prefix):\n    '''Read the subdirectories for parallel_stereo.'''\n\n    dirList = out_prefix + '-dirList.txt'\n    \n    # Must exist\n    if not os.path.exists(dirList):\n        raise Exception('Incomplete parallel_stereo run. Cannot find: ' + dirList)\n    \n    # Read and parse the tiles    \n    f = open(dirList, 'r')\n    lines = f.readlines()\n    f.close()\n\n    dirs = []\n    for line in lines:\n        line = line.strip()\n        # Remove empty lines\n        if line == '':\n            continue\n        dirs.append(line)\n    \n    return dirs\n    \ndef readTiles(out_prefix):\n    '''Read the tiles corresponding to parallel_stereo subdirectories.'''\n\n    dirs = readDirList(out_prefix)\n\n    tiles = []\n    for dir in dirs:\n        dir = dir.strip()\n        if dir == '':\n            continue\n        tiles.append(dirToTile(dir))\n    \n    return tiles\n      \ndef intersect_boxes(A, B):\n    axmin = A.x; axmax = A.x + A.width; aymin = A.y; aymax = A.y + A.height\n    bxmin = B.x; bxmax = B.x + B.width; bymin = B.y; bymax = B.y + B.height\n    xmin  = max(axmin, bxmin); xmax = min(axmax, bxmax)\n    ymin  = max(aymin, bymin); ymax = min(aymax, bymax)\n    C     = BBox(0, 0, 0, 0)\n    C.x   = xmin; C.width = xmax - xmin\n    if (C.width  < 0):\n        C.width = 0\n    C.y      = ymin; \n    C.height = ymax - ymin\n    if (C.height < 0):\n        C.height = 0\n    return C\n\ndef generateTileDir(startX, startY, stopX, stopY):\n    \"\"\"Generate the name of a tile based on its location\"\"\"\n\n    tileString = 'tile_' + str(startX) + '_' + str(startY) + '_' + str(stopX) + '_' + str(stopY)\n    return tileString\n\ndef generateTileName(startX, startY, stopX, stopY):\n    \"\"\"Generate the name of a tile based on its location\"\"\"\n\n    return generateTileDir(startX, startY, stopX, stopY) + \".tif\"\n\n# Split a segment of of given length in pieces of about given size.\n# All pieces are about the same length.\ndef genSegmentList(length, size, padding):\n\n    if length <= 0: length = 1\n    if size   <= 0: size   = 1\n    num = int(math.ceil(length/float(size))) # if in doubt, make pieces smaller\n    if num <= 0: num = 1\n\n    goodSize = int(math.floor(length/float(num)))\n    if goodSize <= 0: goodSize = 1\n\n    # numBig segments will have length goodSize + 1, and the rest will have length goodSize\n    numBig = length - goodSize*num\n\n    count = 0\n    L = [0]\n    for c in range(0, num):\n        if count < numBig:\n            curLen = goodSize + 1\n        else:\n            curLen = goodSize\n        count = count + 1\n        pos = L[-1] + curLen\n        L.append(pos)\n    \n    return L\n\ndef isVrt(filename):\n    '''\n    Peek at the first line and see if it this is a vrt.\n    '''\n\n    if (not os.path.exists(filename)) or os.path.isdir(filename):\n        return False\n\n    try:\n        with open(filename, 'r', encoding='utf-8') as f:\n            line = f.readline().lower()\n            if line.startswith('<vrtdataset'):\n                return True\n    except:\n        # Binary files will be handled here\n        return False\n    \n    return False\n\n"
  },
  {
    "path": "src/asp/Python/asp_cmd_utils.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n# TODO: Move this to asp_system_utils\n\n\"\"\"General systems related utilities\"\"\"\nfrom __future__ import print_function\nimport sys, os, re, shutil, subprocess, string, time, errno, multiprocessing, shlex\n\ndef wipe_option(options, opt, n):\n    # In the array 'options', find the entry with value 'opt'.\n    # Wipe this entry and the next n values.\n    while opt in options:\n        r = options.index(opt)\n        if r < len(options):\n            del options[r] # rm 'opt'\n        for i in range(n):\n            if r < len(options): del options[r]\n\ndef replace_opt_val(argv, opt, old_val, new_val):\n    # In the array 'options', find the entry with value 'opt'.\n    # If the value that follows is 'old_val', replace it with 'new_val'.\n    \n    # Find the index of opt in argv\n    try:\n        r = argv.index(opt)\n    except:\n        return argv\n    \n    # There must be another value after the option\n    if r+1 >= len(argv):\n        raise CmdRunException(\"Option \" + opt + \" has no value\")\n  \n    # Replace the value\n    if argv[r+1] == str(old_val):\n        argv[r+1] = str(new_val)\n    \n    return argv\n\ndef option_val(argv, opt):\n  # Find the value that follows the option 'opt' in the array 'argv'.\n  # If the value is not found, return None.\n  try:\n    r = argv.index(opt)\n  except:\n    return None\n  \n  # There must be another value after the option\n  if r+1 >= len(argv):\n     return None\n    \n  # Return the value\n  return argv[r+1]   \n  \nclass CmdRunException(Exception):\n    '''Exception type indicating an error with a cmd call'''\n    pass\n\ndef isCmdOption(arg):\n    \"\"\"Returns True if the string is a command line option,\n    False otherwise (if it is an argument)\"\"\"\n\n    # An option must start with '-' and not consist of all numbers\n    if ( arg.startswith('-') and not re.match(r'^-[0-9.]+$', arg) ):\n        return True\n    else:\n        return False\n\n# Utilities to ensure that the Python parser does not garble negative\n# values such as '-365' into '-3'.\nescapeStr='esc_rand_str'\ndef escape_vals(vals):\n    for index, val in enumerate(vals):\n        p = re.match(r\"^-[\\.\\d]\", val)\n        if p:\n            vals[index] = escapeStr + val\n    return vals\n\ndef unescape_vals(vals):\n    for index, val in enumerate(vals):\n        p = re.match(r\"^\" + escapeStr + \"(-.*?)$\", val)\n        if p:\n            vals[index] = p.group(1)\n    return vals\n\ndef clean_args(args):\n    '''Fix various problems that can happen in the input args'''\n    args = unescape_vals(args)\n    argsout = []\n    return args\n\ndef get_option(options, opt, n):\n    # In the array 'options', find and return the entry with value 'opt'\n    #  and the next n values.\n    output = []\n    r = options.index(opt)\n    if r < len(options):\n        output.append(options[r])\n    for i in range(1,n+1):\n        if r+i < len(options):\n            output.append(options[r+i])\n    return output\n\ndef set_option(options, opt, new_values):\n    '''In the array 'options', find the entry with value 'opt'.\n    Replace the next values with new_values.'''\n\n    if opt in options:\n        # The option is already included, update its value.\n        r = options.index(opt)\n        if r < len(options):\n            r += 1\n            for i in new_values:\n                if r < len(options):\n                  options[r] = str(i)\n                r += 1\n    else: # The option is not present, add it.\n        options.append(opt)\n        for i in new_values:\n            options.append(str(i))\n\n"
  },
  {
    "path": "src/asp/Python/asp_dist_utils.py",
    "content": "#!/usr/bin/env python\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2026, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n\"\"\"\nUtility functions for stereo_dist (distributed stereo processing).\n\"\"\"\n\nimport sys, subprocess, os, math, shlex\n\nimport asp_system_utils\nfrom asp_stereo_utils import Step, readDistTileList\n\ndef tileGridSize(tiles):\n    '''Given a list of (BBox, padding) tuples from readDistTileList,\n    return (num_cols, num_rows) of the tile grid.'''\n    xs = set(tile.x for (tile, padding) in tiles)\n    ys = set(tile.y for (tile, padding) in tiles)\n    return (len(xs), len(ys))\n\ndef numMosaicJobs(nodesListPath, numProcesses):\n    '''Compute the number of parallel dem_mosaic jobs for DEM assembly.\n    Uses nodes * processes, capped at 32.'''\n    numNodes = asp_system_utils.getNumNodesInList(nodesListPath)\n    if numProcesses is not None and numProcesses > 0:\n        numJobs = numNodes * numProcesses\n    else:\n        numJobs = numNodes * asp_system_utils.get_num_cpus()\n    return min(numJobs, 32)\n\ndef buildMosaicBlockLists(outPrefix, numJobs, suffix='DEM'):\n    '''Partition tile raster files into blocks for parallel mosaicking. Reads\n    the distributed tile list, collects existing files with the given suffix\n    (e.g., DEM, DRG, IntersectionErr), divides the tile grid into blocks,\n    writes per-block list files, and returns a list of (blockListFile,\n    blockOutputFile) tuples.'''\n\n    # Read the list of tiles\n    tiles = readDistTileList(outPrefix)\n    numTiles = len(tiles)\n    if numTiles == 0:\n        raise Exception('No tiles found in tile list.')\n\n    # Collect files with given suffix that exist\n    demFiles = []\n    for (tile, padding) in tiles:\n        tileSubdir = outPrefix + '-' + tile.name_str()\n        tilePrefix = tileSubdir + '/' + os.path.basename(outPrefix)\n        demFile = tilePrefix + '-' + suffix + '.tif'\n        if os.path.exists(demFile):\n            demFiles.append(demFile)\n    if len(demFiles) == 0:\n        raise Exception('No ' + suffix + ' files found in tile directories.')\n    print('Found ' + str(len(demFiles)) + ' ' + suffix + ' files to mosaic.')\n\n    # Compute tile grid size and number of parallel jobs\n    (numCols, numRows) = tileGridSize(tiles)\n    print('Tile grid: ' + str(numCols) + ' cols x ' + str(numRows) + ' rows')\n\n    # Each block must have at least 2 tiles. Use this to limit the number of jobs\n    maxJobs = (numCols * numRows) // 2\n    numJobs = max(min(numJobs, maxJobs), 1)\n    print('Num mosaic jobs: ' + str(numJobs))\n\n    # Divide tile grid into blocks matching the aspect ratio\n    aspect = float(numCols) / float(max(numRows, 1))\n\n    blockCols = int(round(math.sqrt(numJobs * aspect)))\n    blockRows = int(round(numJobs / float(max(blockCols, 1))))\n    blockCols = max(blockCols, 1)\n    blockRows = max(blockRows, 1)\n    blockCols = min(blockCols, numCols)\n    blockRows = min(blockRows, numRows)\n    print('Block grid: ' + str(blockCols) + ' x ' + str(blockRows) +\n          ' = ' + str(blockCols * blockRows) + ' blocks')\n\n    # Compute tiles per block in each dimension\n    tilesPerBlockX = int(math.ceil(numCols / blockCols))\n    tilesPerBlockY = int(math.ceil(numRows / blockRows))\n    print('Tiles per block: ' + str(tilesPerBlockX) + ' x ' +\n          str(tilesPerBlockY))\n\n    # Build sorted lists of distinct tile starting corner coordinates\n    tileStartCornerX = sorted(set(tile.x for (tile, padding) in tiles))\n    tileStartCornerY = sorted(set(tile.y for (tile, padding) in tiles))\n\n    # Build a map from (x, y) origin to file path\n    demMap = {}\n    for (tile, padding) in tiles:\n        tileSubdir = outPrefix + '-' + tile.name_str()\n        tilePrefix = tileSubdir + '/' + os.path.basename(outPrefix)\n        demFile = tilePrefix + '-' + suffix + '.tif'\n        if os.path.exists(demFile):\n            demMap[(tile.x, tile.y)] = demFile\n\n    # Keep track of each partial DEM mosaic name and of the list of DEMs\n    # that goes into making it.\n    masterList = []\n\n    # Assign tiles to blocks. For each block, find which tile grid columns\n    # and rows it covers, convert grid indices to pixel origins via\n    # tileStartCornerX/Y, and look up the DEM file in demMap.\n    for by in range(blockRows):\n        for bx in range(blockCols):\n            # Range of tile indices for this block\n            colStart = bx * tilesPerBlockX\n            colEnd = min((bx + 1) * tilesPerBlockX, numCols)\n            rowStart = by * tilesPerBlockY\n            rowEnd = min((by + 1) * tilesPerBlockY, numRows)\n\n            blockDems = []\n            for ci in range(colStart, colEnd):\n                for ri in range(rowStart, rowEnd):\n                    # Tile corner in pixel coordinates\n                    key = (tileStartCornerX[ci], tileStartCornerY[ri])\n                    if key in demMap:\n                        # Collect DEMs that exist\n                        blockDems.append(demMap[key])\n\n            # Skip empty blocks\n            if len(blockDems) == 0:\n                continue\n\n            # Write this block's DEM list file\n            blockIndex = len(masterList)\n            blockDemListFile = (outPrefix + '-mosaicBlock_' +\n                                str(blockIndex) + '_' + suffix + '.txt')\n            blockOutputDem = (outPrefix + '-mosaicBlock_' +\n                              str(blockIndex) + '-' + suffix + '.tif')\n            with open(blockDemListFile, 'w') as f:\n                for d in blockDems:\n                    f.write(d + '\\n')\n\n            masterList.append((blockDemListFile, blockOutputDem))\n            print('Block ' + str(blockIndex) + ' (' + str(bx) + ', ' +\n                  str(by) + '): ' + str(len(blockDems)) + ' DEMs, list: ' +\n                  blockDemListFile)\n\n    return masterList\n\ndef queryMapproject(dem, image, camera, outputImage, extraArgs):\n    '''Run mapproject_single --query-projection and return parsed settings.'''\n    queryArgs = ['--query-projection', '--write-wkt', dem, image]\n    if camera:\n        queryArgs.append(camera)\n    queryArgs.append(outputImage)\n    queryArgs += extraArgs\n    sep = \",\"\n    return asp_system_utils.run_and_parse_output(\n        'mapproject_single', queryArgs, sep, verbose=False)\n\ndef runMapprojection(opt, settings, outPrefix, entryPoint):\n    '''Mapproject both input images onto the DEM with a common projection,\n    grid size, and bounding box. Return the paths to the mapprojected images.\n    If entryPoint > 0, skip mapprojection and just return the expected paths,\n    verifying that the mapprojected images already exist.'''\n\n    in_file1  = settings['in_file1'][0]\n    in_file2  = settings['in_file2'][0]\n    cam_file1 = settings['cam_file1'][0]\n    cam_file2 = settings['cam_file2'][0]\n\n    leftMap  = outPrefix + '-left_map.tif'\n    rightMap = outPrefix + '-right_map.tif'\n\n    # If resuming from a later entry point, just verify the mapprojected\n    # images exist and return their paths.\n    if entryPoint > Step.pprc:\n        for f in [leftMap, rightMap]:\n            if not os.path.exists(f):\n                raise Exception('Mapprojected image not found: ' + f +\n                    '. Run from entry point 0 first.')\n        print('Skipping mapprojection (entry point > ' + str(Step.pprc) + ').')\n        return (leftMap, rightMap)\n\n    # Create the output directory if needed\n    outDir = os.path.dirname(outPrefix)\n    if outDir and not os.path.exists(outDir):\n        os.makedirs(outDir)\n\n    # Step 1: Query left image to get auto projection, GSD, and bounding box.\n    # If --t_srs is provided, use it for the left query too.\n    leftExtraArgs = []\n    if opt.t_srs is not None:\n        leftExtraArgs = ['--t_srs', opt.t_srs]\n    print('Querying projection for the left image.')\n    leftQuery = queryMapproject(opt.dem, in_file1, cam_file1, leftMap,\n                                leftExtraArgs)\n\n    leftGsd = float(leftQuery['pixel_size'][0])\n    leftWkt = leftQuery['projection_wkt_file'][0]\n    leftXmin = float(leftQuery['proj_box_xmin'][0])\n    leftYmin = float(leftQuery['proj_box_ymin'][0])\n    leftXmax = float(leftQuery['proj_box_xmax'][0])\n    leftYmax = float(leftQuery['proj_box_ymax'][0])\n\n    print('Left GSD: ' + str(leftGsd))\n    print('Left WKT: ' + leftWkt)\n    print('Left proj box: ' + str(leftXmin) + ' ' + str(leftYmin) +\n          ' ' + str(leftXmax) + ' ' + str(leftYmax))\n\n    # Step 2: Query right image with the left projection forced\n    print('Querying projection for the right image.')\n    rightQuery = queryMapproject(opt.dem, in_file2, cam_file2, rightMap,\n                                ['--t_srs', leftWkt])\n\n    rightGsd = float(rightQuery['pixel_size'][0])\n    rightXmin = float(rightQuery['proj_box_xmin'][0])\n    rightYmin = float(rightQuery['proj_box_ymin'][0])\n    rightXmax = float(rightQuery['proj_box_xmax'][0])\n    rightYmax = float(rightQuery['proj_box_ymax'][0])\n\n    print('Right GSD: ' + str(rightGsd))\n    print('Right proj box: ' + str(rightXmin) + ' ' + str(rightYmin) +\n          ' ' + str(rightXmax) + ' ' + str(rightYmax))\n\n    # Step 3: Use the finer (smaller) GSD\n    gsd = min(abs(leftGsd), abs(rightGsd))\n\n    # Step 4: Intersect the two bounding boxes\n    xmin = max(leftXmin, rightXmin)\n    ymin = max(leftYmin, rightYmin)\n    xmax = min(leftXmax, rightXmax)\n    ymax = min(leftYmax, rightYmax)\n\n    if xmin >= xmax or ymin >= ymax:\n        raise Exception('The two images do not overlap in projected space.')\n\n    # Step 5: Override with user-provided values\n    if opt.tr is not None:\n        gsd = opt.tr\n        print('Using input GSD: ' + str(gsd))\n    else:\n        print('Using min estim GSD: ' + str(gsd))\n\n    if opt.t_projwin is not None:\n        xmin = opt.t_projwin[0]\n        ymin = opt.t_projwin[1]\n        xmax = opt.t_projwin[2]\n        ymax = opt.t_projwin[3]\n        print('Using input box: ' + str(xmin) + ' ' + str(ymin) +\n          ' ' + str(xmax) + ' ' + str(ymax))\n    else:\n        print('Using intersection box: ' + str(xmin) + ' ' + str(ymin) +\n          ' ' + str(xmax) + ' ' + str(ymax))\n\n    if opt.t_srs is not None:\n       leftWkt = opt.t_srs\n       print('Using input projection: ' + leftWkt)\n\n    # Step 6: Run mapproject on both images with common parameters\n    commonArgs = ['--t_srs', leftWkt, '--tr', str(gsd),\n                  '--t_projwin', str(xmin), str(ymin), str(xmax), str(ymax)]\n\n    mapprojectPath = asp_system_utils.bin_path('mapproject')\n\n    for (image, camera, outputPath, label) in \\\n        [(in_file1, cam_file1, leftMap, 'left'),\n         (in_file2, cam_file2, rightMap, 'right')]:\n\n        cmd = [mapprojectPath] + commonArgs + [opt.dem, image]\n        if camera:\n            cmd.append(camera)\n        cmd.append(outputPath)\n        if opt.nodes_list:\n            cmd += ['--nodes-list', opt.nodes_list]\n\n        print('Mapprojecting ' + label + ' image.')\n        if opt.verbose or opt.dryrun:\n            print(' '.join(cmd))\n        if not opt.dryrun:\n            subprocess.check_call(cmd)\n\n    return (leftMap, rightMap)\n\ndef mapprojAndUpdateArgs(opt, settings, outPrefix, sep):\n    '''Mapproject both images onto the DEM with consistent parameters, then\n    rebuild the argument list to use the mapprojected images instead of the\n    originals. Return updated (args, settings, outPrefix).'''\n\n    (leftMap, rightMap) = runMapprojection(opt, settings, outPrefix,\n                                           opt.entry_point)\n\n    # Care is needed when the images are .cub so have the cameras embedded. For RPC,\n    # the mapprojected images will be .tif but will hve internally the cameras, so no\n    # need for extra args.\n    in_file1  = settings['in_file1'][0]\n    in_file2  = settings['in_file2'][0]\n    cam_file1 = settings['cam_file1'][0]\n    cam_file2 = settings['cam_file2'][0]\n    if settings['stereo_session'][0] == 'isis':\n        if not cam_file1:\n            cam_file1 = in_file1\n        if not cam_file2:\n            cam_file2 = in_file2\n\n    # named_options has all the options and values we need to pass through\n    named_opts = settings.get('named_options', [''])\n    if named_opts == ['']:\n        named_opts = []\n    args = [leftMap, rightMap]\n    if cam_file1:\n        args.append(cam_file1)\n    if cam_file2:\n        args.append(cam_file2)\n    args.append(outPrefix)\n    args += named_opts\n\n    # Add the DEM for the stereo pipeline, if not already present\n    if '--dem' not in args:\n        args.extend(['--dem', opt.dem])\n\n    # Re-parse with updated args. Likely redundant, but good to have as a\n    # sanity check that we reconnected correctly the args.\n    settings = asp_system_utils.run_and_parse_output(\"stereo_parse\", args,\n                                                      sep, opt.verbose)\n    outPrefix = settings['out_prefix'][0]\n\n    return (args, settings, outPrefix)\n\ndef runStereoTiles(opt, args, outPrefix, tileEntryPoint, tileStopPoint):\n    '''Run stereo_tile on all tiles using GNU Parallel.'''\n\n    tiles = readDistTileList(outPrefix)\n    numTiles = len(tiles)\n    if numTiles == 0:\n        raise Exception('No tiles found in tile list.')\n\n    print('Running stereo_tile on ' + str(numTiles) + ' tiles.')\n\n    # Write argument file (one tile index per line)\n    argumentFilePath = outPrefix + '-tileArgs.txt'\n    with open(argumentFilePath, 'w') as f:\n        for i in range(numTiles):\n            f.write(str(i) + '\\n')\n\n    # Set up GNU parallel arguments\n    parallelArgs = ['--will-cite', '--env', 'ASP_DEPS_DIR',\n                    '--env', 'PATH', '--env', 'LD_LIBRARY_PATH',\n                    '--env', 'ASP_LIBRARY_PATH', '--env', 'ISISROOT']\n\n    if opt.parallel_options is not None:\n        parallelArgs += opt.parallel_options.split(' ')\n\n    # Determine number of processes\n    numProcesses = opt.processes\n    if numProcesses is None:\n        numProcesses = asp_system_utils.get_num_cpus()\n\n    # Build stereo_tile command with placeholder for tile index\n    pythonPath = sys.executable\n    stereoTilePath = asp_system_utils.libexec_path('stereo_tile')\n    commandList = [pythonPath, stereoTilePath,\n                   '--tile-index', '{1}',\n                   '--entry-point', str(tileEntryPoint),\n                   '--stop-point', str(tileStopPoint)]\n\n    if opt.dem:\n        commandList += ['--dem', opt.dem]\n    if opt.point2dem_options:\n        commandList += ['--point2dem-options', opt.point2dem_options]\n\n    if opt.verbose:\n        commandList.append('--verbose')\n    if opt.dryrun:\n        commandList.append('--dry-run')\n\n    commandList += args\n\n    # Append the run directory so the child can chdir to it\n    runDir = asp_system_utils.escape_token(os.getcwd())\n    commandList += ['--run-dir', runDir]\n\n    # Prepend parallel args to command\n    fullCommandList = parallelArgs + commandList\n\n    if opt.dryrun:\n        print('Run GNU parallel with ' + str(numProcesses) + ' processes')\n        print('Command: ' + ' '.join(fullCommandList))\n        return\n\n    asp_system_utils.runInGnuParallel(numProcesses, argumentFilePath,\n                                      fullCommandList, opt.nodes_list, opt.verbose)\n\ndef runBlockMosaic(opt, masterFile):\n    '''Run dem_mosaic in parallel on blocks via stereo_tile --dem-mosaic-index.'''\n\n    # Count blocks in master file\n    with open(masterFile, 'r') as f:\n        lines = [l.strip() for l in f if l.strip()]\n    numBlocks = len(lines)\n    if numBlocks == 0:\n        raise Exception('No blocks in master file: ' + masterFile)\n\n    print('Running dem_mosaic on ' + str(numBlocks) + ' blocks.')\n\n    # Write argument file (one block index per line, 0-based)\n    argumentFilePath = masterFile.replace('.txt', '-args.txt')\n    with open(argumentFilePath, 'w') as f:\n        for i in range(numBlocks):\n            f.write(str(i) + '\\n')\n\n    # Set up GNU parallel arguments\n    parallelArgs = ['--will-cite', '--env', 'ASP_DEPS_DIR',\n                    '--env', 'PATH', '--env', 'LD_LIBRARY_PATH',\n                    '--env', 'ASP_LIBRARY_PATH', '--env', 'ISISROOT']\n\n    if opt.parallel_options is not None:\n        parallelArgs += opt.parallel_options.split(' ')\n\n    # Determine number of processes\n    numProcesses = opt.processes\n    if numProcesses is None:\n        numProcesses = asp_system_utils.get_num_cpus()\n\n    # Build stereo_tile command with --dem-mosaic-index placeholder\n    pythonPath = sys.executable\n    stereoTilePath = asp_system_utils.libexec_path('stereo_tile')\n    commandList = [pythonPath, stereoTilePath,\n                   '--dem-mosaic-index', '{1}',\n                   '--dem-mosaic-master', masterFile]\n\n    if opt.verbose:\n        commandList.append('--verbose')\n    if opt.dryrun:\n        commandList.append('--dry-run')\n\n    # Append the run directory so the child can chdir to it\n    runDir = asp_system_utils.escape_token(os.getcwd())\n    commandList += ['--run-dir', runDir]\n\n    # Prepend parallel args to command\n    fullCommandList = parallelArgs + commandList\n\n    if opt.dryrun:\n        print('Run GNU parallel with ' + str(numProcesses) + ' processes')\n        print('Command: ' + ' '.join(fullCommandList))\n        return\n\n    asp_system_utils.runInGnuParallel(numProcesses, argumentFilePath,\n                                      fullCommandList, opt.nodes_list,\n                                      opt.verbose)\n\ndef mosaicProduct(opt, outPrefix, numJobs, suffix):\n    '''Mosaic blocks of per-tile products (DEM, DRG, or IntersectionErr) in\n    parallel, then mosaic the block results into a final output.'''\n\n    # Partition tile files into blocks for parallel mosaicking\n    masterList = buildMosaicBlockLists(outPrefix, numJobs, suffix)\n\n    # Write master file having the list of lists to mosaic\n    masterFile = outPrefix + '-mosaicMaster_' + suffix + '.txt'\n    with open(masterFile, 'w') as f:\n        for (listFile, outputFile) in masterList:\n            f.write(listFile + ' ' + outputFile + '\\n')\n    print('Wrote master mosaic file: ' + masterFile + ' with ' +\n          str(len(masterList)) + ' blocks')\n\n    # Run parallel dem_mosaic per block\n    runBlockMosaic(opt, masterFile)\n\n    # Final merge of block files\n    blockFiles = [outputFile for (listFile, outputFile) in masterList]\n    blockFiles = [f for f in blockFiles if os.path.exists(f)]\n    if len(blockFiles) == 0:\n        raise Exception('No block ' + suffix + ' files were produced.')\n\n    finalFile = outPrefix + '-' + suffix + '.tif'\n    print('Merging ' + str(len(blockFiles)) + ' block ' + suffix +\n          ' files into ' + finalFile)\n    demMosaicPath = asp_system_utils.bin_path('dem_mosaic')\n    commandList = [demMosaicPath] + blockFiles + ['-o', finalFile]\n    if not opt.dryrun:\n        if opt.verbose:\n            print(' '.join(commandList))\n        subprocess.call(commandList)\n\n    # Clean up partial block mosaics and helper lists\n    print('Removing partial ' + suffix + ' mosaics and helper lists.')\n    for (listFile, outputFile) in masterList:\n        if os.path.exists(outputFile):\n            os.remove(outputFile)\n        if os.path.exists(listFile):\n            os.remove(listFile)\n    # Remove the args file created by runBlockMosaic\n    argsFile = masterFile.replace('.txt', '-args.txt')\n    if os.path.exists(argsFile):\n        os.remove(argsFile)\n    if os.path.exists(masterFile):\n        os.remove(masterFile)\n\ndef mosaicDems(opt, outPrefix):\n    '''Mosaic per-tile DEMs, and optionally DRG and IntersectionErr files.'''\n\n    numJobs = numMosaicJobs(opt.nodes_list, opt.processes)\n\n    # Always mosaic DEMs\n    mosaicProduct(opt, outPrefix, numJobs, 'DEM')\n\n    # Mosaic ortho images if --orthoimage was requested\n    if opt.point2dem_options and '--orthoimage' in opt.point2dem_options:\n        mosaicProduct(opt, outPrefix, numJobs, 'DRG')\n\n    # Mosaic error images if --errorimage was requested\n    if opt.point2dem_options and '--errorimage' in opt.point2dem_options:\n        mosaicProduct(opt, outPrefix, numJobs, 'IntersectionErr')\n"
  },
  {
    "path": "src/asp/Python/asp_file_utils.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n\"\"\"\nGeneral functions for handling files\n\"\"\"\nfrom __future__ import print_function\nimport sys, os, re, shutil, subprocess, string, time, errno\n\n\ndef createFolder(path):\n    \"\"\"Creates a folder if it does not already exist\"\"\"\n    if path == '':\n        return\n    if not os.path.exists(path):\n        os.makedirs(path)\n\ndef removeIfExists(path):\n    \"\"\"Removes a file if it exists\"\"\"\n    try:\n        os.remove(path)\n    except OSError as e: \n        if e.errno != errno.ENOENT: # Continue if the error is \"no such file or directory\"\n            raise # Re-raise the exception if a different error occurred\n\ndef removeFolderIfExists(directory):\n    \"\"\"Removes a directory and everything in it\"\"\"\n    try:\n        shutil.rmtree(directory)\n    except OSError as e: \n        if e.errno != errno.ENOENT: # Continue if the error is \"no such file or directory\"\n            raise # Re-raise the exception if a different error occurred\n\ndef replaceExtensionAndFolder(inputPath, outputFolder, newExtension):\n    \"\"\"Convenience function to replace the extension and the folder of a file path\"\"\"\n    newExt = os.path.splitext(inputPath)[0] + newExtension\n    return os.path.join(outputFolder, os.path.basename(newExt))\n\ndef fileIsNonZero(path):  \n    '''Return true if the file exists and is non-empty'''\n    if os.path.isfile(path) and (os.path.getsize(path) > 0):\n        return True\n    else:\n        return False\n\n\ndef getFileLineCount(filePath):\n    \"\"\"Counts up the number of lines in a file\"\"\"\n    f = open(filePath)\n    i = 0\n    for line in f:\n        i = i + 1\n    return i\n\n\n\ndef tarFileList(fileList, outputPath, compress=True, replacementNameList=None):\n    \"\"\"Creates a tar file containing a list of files with no absolute paths\"\"\"\n\n    # An extra set of commands is needed to strip the absolute path name from each stored file\n    tag = '-vcf'\n    if compress:\n        tag = '-jvcf'\n    cmd = 'tar ' + tag + ' '  + outputPath\n    if not replacementNameList: # Add all the files as they are\n        for f in fileList:\n            cmd = cmd + ' -C ' + os.path.dirname(f) + ' ' + os.path.basename(f) # Add the current path\n    else: # Use the replacement names for the files\n        for (f, r) in zip(fileList, replacementNameList):\n            os.rename(f, r) # Temporarily replace the file path\n            cmd = cmd + ' -C ' + os.path.dirname(r) + ' ' + os.path.basename(r) # Add the new path\n    # Command set up, now run it!    \n    print(cmd)\n    os.system(cmd)\n    \n    if replacementNameList: # Move all the files back to their original locations\n        for (f, r) in zip(fileList, replacementNameList):\n            os.rename(r, f)\n\n\n\n\n\n\n\n"
  },
  {
    "path": "src/asp/Python/asp_geo_utils.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n\"\"\"\n   Functions for working with images containing geo metadata.\n\"\"\"\nfrom __future__ import print_function\nimport sys, os, glob, re, shutil, string, time, errno, subprocess\nimport asp_string_utils, asp_image_utils, asp_system_utils\n\ndef getGdalInfoTagValue(text, tag):\n    \"\"\"Gets the value of a gdal parameter in a [\"\"] tag or None if it is absent.\"\"\"\n\n    try:\n        lineAfterTag = asp_string_utils.getLineAfterText(text, tag)\n        \n        # The remaining line should look like this: \",25],\n        commaPos   = lineAfterTag.find(',')\n        bracketPos = lineAfterTag.find(']')\n        # The value is always returned as a string\n        return asp_string_utils.convertToFloatIfNumber(lineAfterTag[commaPos+1:bracketPos])\n    \n    except Exception: # Requested tag was not found\n        return None\n\ndef convertCoordinate(input_srs_string, output_srs_string, x, y):\n    '''Convert a single 2D coordinate between proj.4 coordinate systems.'''\n\n    cmd = [asp_system_utils.which('gdaltransform'), '-s_srs',\n           input_srs_string, '-t_srs', output_srs_string]\n    p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, encoding = 'utf8')\n    input_str = str(x) + \" \" + str(y)\n    out, err = p.communicate(input = input_str)\n    parts = out.split()\n    return (float(parts[0]), float(parts[1]))\n\ndef getLonLatProjString(inputString):\n    '''Given a projected proj4 string, get the longlat proj4 string'''\n    \n    if '+proj=longlat' in inputString:\n        return inputString\n    \n    # The output string is longlat projection plus certain allowed proj4 keys.\n    outputString = '+proj=longlat'\n    keywords = ['+datum', '+ellps', '+no_defs', '+a', '+b']\n   \n    parts = inputString.split()\n    for p in parts:\n        for k in keywords:\n            if k in p:\n                outputString += ' ' + p\n                break\n    return outputString\n\n\n# This can take a while if stats are requested\ndef getImageGeoInfo(imagePath, getStats=True):\n    \"\"\"Obtains some image geo information from gdalinfo in dictionary format\"\"\"\n    \n    if not os.path.exists(imagePath):\n        raise Exception('Error: input file ' + imagePath + ' does not exist!')\n    \n    outputDict = {}\n    \n    # Call command line tool silently\n    cmd = [asp_system_utils.which('gdalinfo'), imagePath, '-proj4']\n    if getStats:\n        cmd.append('-stats')\n    p = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True)\n    textOutput, err = p.communicate()\n    \n    # Get the size in pixels\n    imageSizeLine = asp_string_utils.getLineAfterText(textOutput, 'Size is ')\n    sizeVals      = imageSizeLine.split(',')\n    outputDict['image_size'] = (int(sizeVals[0]), int(sizeVals[1]))\n\n    # Get origin location and pixel size    \n    originLine    = asp_string_utils.getLineAfterText(textOutput, 'Origin = ')\n    pixelSizeLine = asp_string_utils.getLineAfterText(textOutput, 'Pixel Size = ')    \n    originVals    = asp_string_utils.getNumbersInParentheses(originLine)\n    pixelSizeVals = asp_string_utils.getNumbersInParentheses(pixelSizeLine)\n    outputDict['origin']     = originVals\n    outputDict['pixel_size'] = pixelSizeVals\n\n    # Get bounding box in projected coordinates\n    upperLeftLine  = asp_string_utils.getLineAfterText(textOutput, 'Upper Left')\n    lowerRightLine = asp_string_utils.getLineAfterText(textOutput, 'Lower Right')\n    (minX, maxY)   = asp_string_utils.getNumbersInParentheses(upperLeftLine)\n    (maxX, minY)   = asp_string_utils.getNumbersInParentheses(lowerRightLine)\n    outputDict['projection_bounds'] = (minX, maxX, minY, maxY)\n    outputDict['projection_center'] = ( (minX+maxX)/2.0, (minY+maxY)/2.0 )\n\n    # Get some proj4 values\n    outputDict['standard_parallel_1'] = getGdalInfoTagValue(textOutput, 'standard_parallel_1')\n    outputDict['central_meridian']    = getGdalInfoTagValue(textOutput, 'central_meridian')\n\n    # Get the projection type\n    projStart = textOutput.find('PROJ.4 string is:')\n    nextLine  = textOutput.find(\"'\", projStart)+1\n    endLine   = textOutput.find(\"'\", nextLine)\n    outputDict['proj_string'] = textOutput[nextLine:endLine]\n    outputDict['projection'] = 'UNKNOWN'\n    if '+proj=eqc' in textOutput:\n        outputDict['projection'] = 'EQUIRECTANGULAR'\n    elif ('+proj=ster' in textOutput) or ('+proj=stere' in textOutput):\n        outputDict['projection'] = 'POLAR STEREOGRAPHIC'\n\n    outputDict['lonlat_bounds'] = outputDict['projection_bounds']\n    if '+proj=longlat' not in outputDict['proj_string']:\n        longlatString = getLonLatProjString(outputDict['proj_string'])\n        ul = convertCoordinate(outputDict['proj_string'], longlatString, minX, maxY)\n        br = convertCoordinate(outputDict['proj_string'], longlatString, maxX, minY)\n        outputDict['lonlat_bounds'] = (ul[0], br[0], br[1], ul[1])\n\n    # Extract this variable which ASP inserts into its point cloud files\n    try:\n        pointOffsetLine = asp_string_utils.getLineAfterText(textOutput, 'POINT_OFFSET=') # Tag name must be synced with C++ code\n        offsetValues    = pointOffsetLine.split(' ')\n        outputDict['point_offset'] =  (float(offsetValues[0]), float(offsetValues[1]), float(offsetValues[2]))        \n    except:\n        pass # In most cases this line will not be present\n\n    # TODO: Currently this does not find much information, and there\n    #       is another function in image_utils dedicated to returning statistics.\n    if getStats:\n\n        # List of dictionaries per band\n        outputDict['band_info'] = []\n    \n        # Populate band information\n        band = 1\n        while (True): # Loop until we run out of bands\n            bandString = 'Band ' + str(band) + ' Block='\n            bandLoc = textOutput.find(bandString)\n            if bandLoc < 0: # Ran out of bands\n                break\n        \n            # Found the band, read pertinent information\n            bandInfo = {}\n        \n            # Get the type string\n            bandLine = asp_string_utils.getLineAfterText(textOutput, bandString)\n            typePos  = bandLine.find('Type=')\n            commaPos = bandLine.find(',')\n            typeName = bandLine[typePos+5:commaPos-1]\n            bandInfo['type'] = typeName\n        \n            outputDict['band_info'] = bandInfo\n        \n            band = band + 1 # Move on to the next band\n        \n    return outputDict\n\ndef doesImageHaveGeoData(imagePath):\n    '''Returns true if a file has geo data associated with it'''\n    \n    if not os.path.exists(imagePath):\n        raise Exception('Image file ' + imagePath + ' not found!')\n    \n    # Call command line tool silently\n    cmd = [asp_system_utils.which('gdalinfo'), imagePath, '-proj4']\n    p = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True)\n    textOutput, err = p.communicate()\n    \n    # For now we just do a very simple check\n    if \"Coordinate System is `'\" in textOutput:\n        return False\n    else:\n        return True\n    \n\n# This is a very handy function but it requires a C++ tool!\n#\n#def getGeoTiffBoundingBox(geoTiffPath):\n#    \"\"\"Returns (minLon, maxLon, minLat, maxLat) for a geotiff image\"\"\"\n#    \n#    if not os.path.exists(geoTiffPath):\n#        raise Exception('Input file does not exist: ' + geoTiffPath)\n#    \n#    # Call command line tool silently\n#    cmd = ['geoRefTool', '--printBounds', geoTiffPath]\n#    p = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True)\n#    textOutput, err = p.communicate()\n#\n#    # Check that the call did not fail\n#    if (textOutput.find('Failed') >= 0):\n#        raise Exception('Error: getGeoTiffBoundingBox failed on input image: ' + geoTiffPath)\n#    \n#    # Parse the output\n#    try:\n#        minLat = float( asp_string_utils.getLineAfterText(textOutput, 'Min latitude  =') )\n#        maxLat = float( asp_string_utils.getLineAfterText(textOutput, 'Max latitude  =') )\n#        minLon = float( asp_string_utils.getLineAfterText(textOutput, 'Min longitude =') )\n#        maxLon = float( asp_string_utils.getLineAfterText(textOutput, 'Max longitude =') )\n#    except Exception as e:\n#        print 'In file: ' + geoTiffPath\n#        print 'In text:'\n#        print textOutput\n#        raise e\n#    \n#    return (minLon, maxLon, minLat, maxLat)\n#\n\n#=========================================================================\n# Start ISIS functions\n\ndef getProjectedBoundsFromIsisLabel(filePath):\n    '''Function to read the projected coordinates bounding box from an ISIS label file'''\n\n    if not os.path.exists(filePath):\n        raise Exception('Error, missing label file path!')\n    \n    # Read all the values!\n    minX    = None\n    maxY    = None\n    pixRes  = None\n    numRows = None\n    numCols = None\n    f = open(filePath, 'r')\n    for line in f:\n        if ('UpperLeftCornerX' in line):\n            s = asp_string_utils.getLineAfterText(line, '=')\n            endPos = s.find('<')\n            if (endPos >= 0):\n                minX = float(s[:endPos-1])\n            else:\n                minX = float(s)\n            continue\n        if ('UpperLeftCornerY' in line):\n            s = asp_string_utils.getLineAfterText(line, '=')\n            endPos = s.find('<')\n            if (endPos >= 0):\n                maxY = float(s[:endPos-1])\n            else:\n                maxY = float(s)\n            continue\n        if ('PixelResolution' in line):\n            s = asp_string_utils.getLineAfterText(line, '=')\n            endPos = s.find('<')\n            if (endPos >= 0):\n                pixRes = float(s[:endPos-1])\n            else:\n                pixRes = float(s)\n            continue\n        if ('      Samples =' in line):\n            s = asp_string_utils.getLineAfterText(line, '=')\n            numCols = float(s)\n            continue\n        if ('      Lines   =' in line):\n            s = asp_string_utils.getLineAfterText(line, '=')\n            numRows = float(s)\n            continue\n        \n    f.close()\n    if (not minX) or (not maxY) or (not pixRes) or (not numRows) or (not numCols):\n        raise Exception('Failed to find projected bounds in file ' + filePath)\n\n    # Compute the other bounds\n    maxX = minX + pixRes*numCols\n    minY = maxY - pixRes*numRows\n\n    return (minX, maxX, minY, maxY)\n\n\ndef getProjectionFromIsisLabel(filePath):\n    '''Function to read the projection type from an ISIS label file'''\n\n    if not os.path.exists(filePath):\n        raise Exception('Error, missing label file path!')\n    \n    f = open(filePath, 'r')\n    for line in f:\n        if ('MAP_PROJECTION_TYPE          =' in line) or ('ProjectionName     =' in line):\n            line = line.replace('\"','') # Strip quotes\n            projType = asp_string_utils.getLineAfterText(line, '=').strip()\n            f.close()\n            return projType\n    f.close()\n    raise Exception('Unable to find projection type in file ' + filePath)\n\n\ndef getBoundingBoxFromIsisLabel(filePath):\n    '''Function to read the bounding box from an ISIS label file'''\n\n    if not os.path.exists(filePath):\n        raise Exception('Error, missing label file path!')\n    \n    numFound = 0\n    f = open(filePath, 'r')\n    for line in f:\n        if ('MINIMUM_LATITUDE' in line) or ('MinimumLatitude' in line):\n            s = asp_string_utils.getLineAfterText(line, '=')\n            endPos = s.find('<')\n            if (endPos >= 0):\n                minLat = float(s[:endPos-1])\n            else:\n                minLat = float(s)\n            numFound = numFound + 1\n            continue\n        if ('MAXIMUM_LATITUDE' in line) or ('MaximumLatitude' in line):\n            s = asp_string_utils.getLineAfterText(line, '=')\n            endPos = s.find('<')\n            if (endPos >= 0):\n                maxLat = float(s[:endPos-1])\n            else:\n                maxLat = float(s)\n            numFound = numFound + 1\n            continue\n        if ('EASTERNMOST_LONGITUDE' in line) or ('MAXIMUM_LONGITUDE' in line)  or ('MaximumLongitude' in line):\n            s = asp_string_utils.getLineAfterText(line, '=')\n            endPos = s.find('<') # Check for unit name\n            if (endPos >= 0):\n                maxLon = float(s[:endPos-1])\n            else:\n                maxLon = float(s)\n            numFound = numFound + 1\n            continue\n        if ('WESTERNMOST_LONGITUDE' in line) or ('MINIMUM_LONGITUDE' in line) or ('MinimumLongitude' in line):\n            s = asp_string_utils.getLineAfterText(line, '=')\n            endPos = s.find('<') # Check for unit name\n            if (endPos >= 0):\n                minLon = float(s[:endPos-1])\n            else:\n                minLon = float(s)\n            numFound = numFound + 1\n            continue\n        if numFound == 4:\n            break\n\n    f.close()\n    if numFound < 4:\n        raise Exception('Failed to find lat/lon bounds in file ' + filePath)\n\n    return (minLon, maxLon, minLat, maxLat)\n\n\n# TODO: Create a real bounding box class or something\ndef getIsisBoundingBox(cubePath):\n    \"\"\"Returns (minLon, maxLon, minLat, maxLat) for an ISIS compatible object\"\"\"\n   \n    # Get the cube size, then request the positions of the four corners\n    cubeSize = getImageSize(cubePath)\n    \n    # Note that the underlying ISIS tool is one-based\n    points  = []\n    firstPt =     getPixelLocInCube(cubePath, 1,           1,         )['gdc']\n    points.append(getPixelLocInCube(cubePath, cubeSize[0], 1,         )['gdc'])\n    points.append(getPixelLocInCube(cubePath, 1,           cubeSize[1])['gdc'])\n    points.append(getPixelLocInCube(cubePath, cubeSize[0], cubeSize[1])['gdc'])\n\n    # Go through the four corners and get the bounding box\n    minLon = firstPt[0]\n    maxLon = firstPt[0]\n    minLat = firstPt[1]\n    maxLat = firstPt[1]\n    \n    for p in points:\n        if p[0] < minLon:\n            minLon = p[0]\n        if p[0] > maxLon:\n            maxLon = p[0]\n        if p[1] < minLat:\n            minLat = p[1]\n        if p[1] > maxLat:\n            maxLat = p[1]\n\n    return (minLon, maxLon, minLat, maxLat)\n\n\ndef getCubeCenterLatitude(cubePath, workDir='tmp'):\n    \"\"\"Calls caminfo on a cube and returns the CenterLatitude value\"\"\"\n\n    # Make sure the requested file is present\n    if not os.path.exists(cubePath):\n        raise Exception('File ' + cubePath + ' does not exist!')\n\n    # Call caminfo (from ISIS) on the input cube to find out the CenterLatitude value\n    camInfoOuputPath = workDir + \"/camInfoOutput.txt\"\n    cmd = 'caminfo from=' + cubePath + ' to=' + camInfoOuputPath\n    print (cmd)\n    os.system(cmd)\n\n    if not os.path.exists(camInfoOuputPath):\n        raise Exception('Call to caminfo failed on file ' + cubePath)\n\n    # Read in the output file to extract the CenterLatitude value\n    centerLatitude = -9999\n    infoFile       = open(camInfoOuputPath, 'r')\n    for line in infoFile:\n        if (line.find('CenterLatitude') >= 0):\n            centerLatitude = asp_string_utils.getNumberAfterEqualSign(line, )\n            break\n    # Make sure we found the desired value\n    if (centerLatitude == -9999) or (asp_string_utils.isString(centerLatitude)):\n        raise Exception(\"Unable to find CenterLatitude from file \" + cubePath)\n\n    # Clean up temporary file\n    os.remove(camInfoOuputPath)\n    \n    return centerLatitude\n\n# End ISIS related functions\n#======================================================================\n\n\ndef getImageBoundingBox(filePath):\n    \"\"\"Returns (minLon, maxLon, minLat, maxLat) for a georeferenced image file\"\"\"\n\n    extension = os.path.splitext(filePath)[1]\n    if asp_image_utils.isIsisFile(filePath):\n        return getIsisBoundingBox(filePath)\n    else: # Handle all other types\n        return getGeoTiffBoundingBox(filePath)\n          \n    # Any other file types will end up raising some sort of exception\n    \n    \n# This function is not used. If it gets used, see the function with\n# same name in parallel_stereo. It is essential to add to the lines\n# below the line \"<SourceProperties\" element, as done there, to avoid\n# the \"too many open files\" problem when there are more than 1024\n# tiles.\ndef build_vrt(fullImageSize, tileLocs, tilePaths, outputPath):\n    \"\"\"Generates a VRT file from a set of image tiles and their locations in the output image\"\"\"\n\n    outputFolder = os.path.dirname(outputPath)\n\n    f = open(outputPath, 'w')\n    f.write(\"<VRTDataset rasterXSize=\\\"%i\\\" rasterYSize=\\\"%i\\\">\\n\" % (int(fullImageSize[0]),int(fullImageSize[1])) ) # Write whole image size\n\n    #\n    ## If a tile is missing, for example, in the case we\n    ## skipped it when it does not intersect user's crop box,\n    ## substitute it with a different one, to ensure the mosaic\n    ## does not have holes. --> Does this make sense?\n    #goodFilename = \"\"\n    #for tile in tiles: # Find the first valid tile (we don't care which one)\n    #    directory = settings['out_prefix'][0] + tile.name_str()\n    #    filename  = directory + \"/\" + tile.name_str() + tile_postfix\n    #    if os.path.isfile(filename):\n    #        goodFilename = filename\n    #        break\n    #if goodFilename == \"\":\n    #    raise Exception('No tiles were generated')\n\n    \n    # Read some metadata from one of the tiles\n    gdalInfo = getImageGeoInfo(tilePaths[0])\n    \n    num_bands = len(gdalInfo['band_info'])\n    data_type = gdalInfo['band_info'][0]['type']\n\n    # This special metadata value is only used for ASP stereo point cloud files!    \n    if 'point_offset' in gdalInfo:\n        f.write(\"  <Metadata>\\n    <MDI key=\\\"\" + 'POINT_OFFSET' + \"\\\">\" +\n                gdalInfo['point_offset'][0] + \"</MDI>\\n  </Metadata>\\n\")\n      \n\n    # Write each band\n    for b in range( 1, num_bands + 1 ):\n        f.write(\"  <VRTRasterBand dataType=\\\"%s\\\" band=\\\"%i\\\">\\n\" % (data_type, b) ) # Write band data type and index\n\n        for tile, tileLoc in zip(tilePaths, tileLocs):\n            filename  = tile\n            \n            imageSize = getImageSize(filename) # Get the image size for this tile\n\n            ## Replace missing tile paths with the good tile we found earlier\n            #if not os.path.isfile(filename): filename = goodFilename\n\n            relative = os.path.relpath(filename, outputPath) # Relative path from the output file to the input tile\n            f.write(\"    <SimpleSource>\\n\")\n            f.write(\"       <SourceFilename relativeToVRT=\\\"1\\\">%s</SourceFilename>\\n\" % relative) # Write relative path\n            f.write(\"       <SourceBand>%i</SourceBand>\\n\" % b)\n            f.write(\"       <SrcRect xOff=\\\"%i\\\" yOff=\\\"%i\\\" xSize=\\\"%i\\\" ySize=\\\"%i\\\"/>\\n\" % (tileLoc[0], tileLoc[1], imageSize[0], imageSize[1]) ) # Source ROI (entire tile)\n            f.write(\"       <DstRect xOff=\\\"%i\\\" yOff=\\\"%i\\\" xSize=\\\"%i\\\" ySize=\\\"%i\\\"/>\\n\" % (tileLoc[0], tileLoc[1], imageSize[0], imageSize[1]) ) # Output ROI (entire tile)\n            f.write(\"    </SimpleSource>\\n\")\n        f.write(\"  </VRTRasterBand>\\n\")\n    f.write(\"</VRTDataset>\\n\")\n    f.close()    \n\n"
  },
  {
    "path": "src/asp/Python/asp_image_utils.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n\"\"\"\nBasic functions for working with images on disk.\n\"\"\"\nfrom __future__ import print_function\nimport sys, os, re, subprocess, string, time, errno\nimport asp_string_utils\n\ndef stripRgbImageAlphaChannel(inputPath, outputPath):\n    \"\"\"Makes an RGB copy of an RBGA image\"\"\"\n    cmd = 'gdal_translate ' + inputPath + ' ' + outputPath + ' -b 1 -b 2 -b 3 -co \"COMPRESS=LZW\" -co \"TILED=YES\" -co \"BLOCKXSIZE=256\" -co \"BLOCKYSIZE=256\"'\n    print (cmd)\n    os.system(cmd)\n\n\n\ndef getImageSize(imagePath):\n    \"\"\"Returns the size [samples, lines] in an image\"\"\"\n\n    # Make sure the input file exists\n    if not os.path.exists(imagePath):\n        raise Exception('Image file ' + imagePath + ' not found!')\n       \n    # Use subprocess to suppress the command output\n    cmd = ['gdalinfo', imagePath]\n    p = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True)\n    textOutput, err = p.communicate()\n\n    # Extract the size from the text\n    sizePos    = textOutput.find('Size is')\n    endPos     = textOutput.find('\\n', sizePos+7)\n    sizeStr    = textOutput[sizePos+7:endPos]\n    sizeStrs   = sizeStr.strip().split(',')\n    numSamples = int(sizeStrs[0])\n    numLines   = int(sizeStrs[1])\n    \n    size = [numSamples, numLines]\n    return size\n\ndef isIsisFile(filePath):\n    \"\"\"Returns True if the file is an ISIS file, False otherwise.\"\"\"\n\n    # Currently we treat all files with .cub extension as ISIS files\n    extension = os.path.splitext(filePath)[1]\n    return (extension == '.cub')\n\n\n\n\ndef getImageStats(imagePath):\n    \"\"\"Obtains some image statistics from gdalinfo\"\"\"\n    \n    if not os.path.exists(imagePath):\n        raise Exception('Image file ' + imagePath + ' not found!')\n    \n    # Call command line tool silently\n    cmd = ['gdalinfo', imagePath, '-stats']\n    p = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True)\n    textOutput, err = p.communicate()\n    \n    # Statistics are computed separately for each band\n    bandStats = []\n    band = 0\n    while (True): # Loop until we run out of bands\n        # Look for the stats line for this band\n        bandString = 'Band ' + str(band+1) + ' Block='\n        bandLoc = textOutput.find(bandString)\n        if bandLoc < 0:\n            return bandStats # Quit if we did not find it\n            \n        # Now parse out the statistics for this band\n        bandMaxStart  = textOutput.find('STATISTICS_MAXIMUM=', bandLoc)\n        bandMeanStart = textOutput.find('STATISTICS_MEAN=',    bandLoc)\n        bandMinStart  = textOutput.find('STATISTICS_MINIMUM=', bandLoc)\n        bandStdStart  = textOutput.find('STATISTICS_STDDEV=',  bandLoc)\n               \n        bandMax  = asp_string_utils.getNumberAfterEqualSign(textOutput, bandMaxStart)\n        bandMean = asp_string_utils.getNumberAfterEqualSign(textOutput, bandMeanStart)\n        bandMin  = asp_string_utils.getNumberAfterEqualSign(textOutput, bandMinStart)\n        bandStd  = asp_string_utils.getNumberAfterEqualSign(textOutput, bandStdStart)\n            \n        # Add results to the output list\n        bandStats.append( (bandMin, bandMax, bandMean, bandStd) )\n            \n        band = band + 1 # Move to the next band\n    \n\n\n\n\n\n"
  },
  {
    "path": "src/asp/Python/asp_rig_utils.py",
    "content": "#!/usr/bin/python\n\nimport sys, os, re, subprocess, shutil, subprocess, glob\nimport numpy as np\n\nif sys.version_info < (3, 0, 0):\n    print('\\nERROR: Must use Python 3.0 or greater.')\n    sys.exit(1)\n\ndef check_for_sub_images(images):\n    \"\"\"\n    If a an image like img.png is present, and also img_sub2.tif, the latter are\n    likely unintended, and the tool must refuse to run.\n    \"\"\"\n    \n    # Put them all in a set without the extension\n    base_names = dict()\n    for image in images:\n        base_name = os.path.splitext(image)[0]\n        base_names[base_name] = image\n   \n    # For any _sub images, check if the base image is present.\n    # A sub image matches _sub[0-9]+\n    for base_name in base_names:\n        m = re.match(r\"^(.*)_sub[0-9]+$\", base_name)\n        if m:\n            full_base_name = m.group(1)\n            if full_base_name in base_names:\n                full_img = base_names[full_base_name]\n                img = base_names[base_name]\n                raise Exception(\"Found images:\\n\\t\" + full_img + \"\\n\\t\" + img + \\\n                  \"\\nThis is likely not intended and the sub-images were \"\n                  \"likely created with stereo_gui. Remove the sub-images.\")\n\ndef create_index_dict(lst):\n    \"\"\"\n    Create a dictionary mapping each element in the input list to its index in the list.\n    \"\"\"\n    index_dict = {}\n    for index, value in enumerate(lst):\n        index_dict[value] = index\n\n    return index_dict\n\ndef read_list(file):\n    '''\n    Read entries from a file. Ignore empty lines.\n    '''\n    vals = []\n    with open(file, 'r') as f:\n        for line in f.readlines():\n            line = line.rstrip()\n            if line == \"\":\n                continue\n            vals.append(line)\n    return vals\n\ndef read_image_pairs(file1, file2):\n    \"\"\"\n    Given two input lists, returns a list of tuples where each tuple contains one element\n    from the first list and one element from the second list.\n    \"\"\"\n    list1 = read_list(file1)\n    list2 = read_list(file2)\n    if len(list1) != len(list2):\n        raise Exception(\"The two input lists must have the same length.\")\n    \n    pairs = []\n    for it in range(len(list1)):\n        pairs.append((list1[it], list2[it]))\n\n    return pairs\n\ndef mkdir_p(path):\n    if path == \"\":\n        return  # this can happen when path is os.path.dirname(\"myfile.txt\")\n    try:\n        os.makedirs(path)\n    except OSError:\n        if os.path.isdir(path):\n            pass\n        else:\n            raise Exception(\"Could not make directory \" +\n                            path + \" as a file with this name exists.\")\n\ndef which(program):\n    \"\"\"\n    Find the absolute path to a program based on the PATH environment variable.\n    If not found, return None.\n    \"\"\"\n\n    def is_exe(fpath):\n        return os.path.isfile(fpath) and os.access(fpath, os.X_OK)\n\n    fpath, fname = os.path.split(program)\n    if fpath:\n        if is_exe(program):\n            return program\n    else:\n        for path in os.environ[\"PATH\"].split(os.pathsep):\n            path = path.strip('\"')\n            exe_file = os.path.join(path, program)\n            if is_exe(exe_file):\n                return exe_file\n\n    return None\n\ndef find_tool(tool_base_dir, tool):\n    \"\"\"\n    Find a given program either in the given dir, or based on PATH.\n    \"\"\"\n    tool_path = tool_base_dir + \"/bin/\" + tool\n    if not os.path.exists(tool_path):\n        print(\"Could not find \" + tool_path)\n        tool_path = which(tool)\n        if tool_path is None:\n            raise Exception(\"Could not find \" + tool + \" in the PATH either.\")\n        else:\n            print(\"Using: \" + tool_path)\n    return tool_path\n        \ndef add_missing_quotes(vals):\n    \"\"\"\n    Given a list of strings, protect each one having spaces with quotes, if not present.\n    \"\"\"\n\n    out_vals = []\n    for val in vals:\n        if (' ' in val or '\\t' in val) and (val[0] != '\\'' and val[0] != '\"'):\n            val = '\\'' + val + '\\''\n        out_vals.append(val)\n    return out_vals\n        \ndef run_cmd(cmd, quit_on_failure = True):\n    \"\"\"\n    Run a command. Print the output in real time.\n    \"\"\"\n\n    # This is a bugfix for not printing quotes around strings with spaces\n    fmt_cmd = add_missing_quotes(cmd)\n    print(\" \".join(fmt_cmd))\n\n    # Note how we redirect stderr to stdout\n    p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,\n                         universal_newlines=True)\n\n    # Print the standard output in real time\n    status = 0\n    while True:\n        out = p.stdout.readline()\n        if not out:\n            break # finished the run\n\n        # Print the line but wipe the extra whitespace\n        print(out.rstrip())\n\n    status = p.poll()\n\n    # Sometimes status is None which appears to be a bug in Python.\n    # Let that pass. Only if the status is a valid integer and non-zero,\n    # then quit on failure if requested to do so.\n    if status is not None and status != 0 and quit_on_failure:\n        print(\"Failed execution of: \" + \" \".join(cmd) + \" with status \" + str(status))\n        sys.exit(1)\n\n    return status\n\ndef readConfigVals(handle, tag, num_vals):\n    \"\"\"\n    Read a tag and vals. If num_vals > 0, expecting to read this many vals.\n    \"\"\"\n    \n    vals = []\n\n    while True:\n\n        line = handle.readline()\n        \n        # Wipe everything after pound but keep the newline,\n        # as otherwise this will be treated as the last line\n        match = re.match(r\"^(.*?)\\#.*?\\n\", line)\n        if match:\n            line = match.group(1) + \"\\n\"\n\n        if len(line) == 0:\n            # Last line, lacks a newline\n            break\n\n        line = line.rstrip() # wipe newline\n        if len(line) == 0:\n            continue\n        \n        # Split by commas and/or spaces\n        vals = re.split(r'[,\\s]+', line)\n\n        # Quietly gloss over ref_sensor_name, as we don't need it.\n        if len(vals) > 0 and vals[0] == 'ref_sensor_name:':\n            continue\n\n        if len(vals) == 0 or vals[0] != tag:\n            raise Exception(\"Failed to read entry for: \" + tag)\n\n        vals = vals[1:]\n        if num_vals > 0 and len(vals) != num_vals:\n            raise Exception(\"Failed to read \" + str(num_vals) + \" values.\")\n\n        # Done\n        break\n    \n    # Return the handle as well, as it changed\n    return (vals, handle)\n\ndef parseRigConfig(rig_config_file):\n    '''Parse a rig set. This function does not implement the rig\n    structure. The individual sensors are read without any knowledge\n    of a rig or set of rigs. That because that functionality is not\n    needed. It is implemented in C++, however.'''\n    cameras = []\n    with open(rig_config_file, \"r\") as handle:\n\n        while True:\n            camera = {}\n            \n            (vals, handle) = readConfigVals(handle, 'sensor_name:', 1)\n            if len(vals) == 0:\n                break # end of file\n            camera[\"sensor_name\"] = vals[0]\n\n            (vals, handle) = readConfigVals(handle, \"focal_length:\", 1)\n            camera[\"focal_length\"] = vals[0]\n\n            (vals, handle) = readConfigVals(handle, \"optical_center:\", 2)\n            camera[\"optical_center\"] = vals\n\n            (vals, handle) = readConfigVals(handle, \"distortion_coeffs:\", -1) # var length\n            camera[\"distortion_coeffs\"] = vals\n            if (len(vals) != 0 and len(vals) != 1 and len(vals) != 4 and len(vals) != 5):\n                raise Exception(\"Expecting 0, 1, 4, or 5 distortion coefficients\")\n\n            (vals, handle) = readConfigVals(handle, \"distortion_type:\", 1)\n            \n            if len(camera[\"distortion_coeffs\"]) == 0 and vals[0] != \"no_distortion\":\n                raise Exception(\"When there are no distortion coefficients, distortion \" + \\\n                                \"type must be: no_distortion\")\n            # For backward compatibility, the fisheye distortion type with one\n            # coefficient is accepted and converted to fov.    \n            if len(camera[\"distortion_coeffs\"]) == 1:\n                if vals[0] == \"fisheye\":\n                    vals[0] = \"fov\"\n                if vals[0] != \"fov\":\n                  raise Exception(\"When there is 1 distortion coefficient, distortion \" + \\\n                                  \"type must be: fov or fisheye\")\n            if len(camera[\"distortion_coeffs\"]) == 4 and \\\n                 vals[0] != \"radtan\" and vals[0] != \"fisheye\":\n                raise Exception(\"When there are 4 distortion coefficients, distortion \" + \\\n                                \"type must be: radtan or fisheye\")\n            if len(camera[\"distortion_coeffs\"]) == 5 and vals[0] != \"radtan\":\n                raise Exception(\"When there are 4 or 5 distortion coefficients, \" + \\\n                                \"distortion type must be: radtan\")\n            camera[\"distortion_type\"] = vals[0]\n\n            (vals, handle) = readConfigVals(handle, \"image_size:\", 2)\n            camera[\"image_size\"] = vals\n            \n            (vals, handle) = readConfigVals(handle, \"distorted_crop_size:\", 2)\n            camera[\"distorted_crop_size\"] = vals\n\n            (vals, handle) = readConfigVals(handle, \"undistorted_image_size:\", 2)\n            camera[\"undistorted_image_size\"] = vals\n\n            (vals, handle) = readConfigVals(handle, \"ref_to_sensor_transform:\", -1)\n            camera[\"ref_to_sensor_transform\"] = vals\n            \n            (vals, handle) = readConfigVals(handle, \"depth_to_image_transform:\", -1)\n            camera[\"depth_to_image_transform\"] = vals\n\n            (vals, handle) = readConfigVals(handle, \"ref_to_sensor_timestamp_offset:\", 1)\n            camera[\"ref_to_sensor_timestamp_offset\"] = vals[0]\n\n            cameras.append(camera)\n\n    if len(cameras) == 0:\n        raise Exception(\"No sensors found in \" + rig_config_file)\n    \n    return cameras\n\ndef imageExtension(images):\n    '''\n    Get the image extensions for all images. Check that there is only one.\n    '''\n    \n    extensions = set()\n    for image in images:\n        path, ext = os.path.splitext(image)\n        extensions.add(ext)\n    if len(extensions) > 1:\n        raise Exception(\"Input images have a mix of filename extensions. Use just one.\")\n    if len(extensions) == 0:\n        raise Exception(\"The input image set is invalid.\")\n    return list(extensions)[0]\n\ndef parse_cameras(image_list, subset_list, rig_sensor,\n                  # These indices will start from 1, if specified\n                  first_image_index = None, last_image_index = None):\n\n    # If desired to process only a subset\n    subset = set()\n    if subset_list != \"\":\n            lines = read_list(subset_list)\n            for line in lines:\n                subset.add(line)\n\n    # Read the limage file\n    lines = read_list(image_list)\n\n    images = []\n    world_to_cam = []\n    image_count = 0 # Below, the count of the first image will be 1\n    for line in lines:\n        m = re.match(r\"^(.*?)\\#\", line)\n        if m:\n            # Wipe comments\n            line = m.group(1)\n        line = line.rstrip()\n        if len(line) == 0:\n            continue\n        \n        vals = line.split()\n        if len(vals) < 13:\n            raise Exception(\"Could not parse: \" + image_list)\n\n        image = vals[0]\n        vals = vals[1:13]\n\n        if (len(subset) > 0) and (image not in subset):\n            # Use only the subset\n            continue\n\n        # Use only desired sensor\n        curr_sensor = os.path.basename(os.path.dirname(image))\n        if curr_sensor != rig_sensor:\n            continue\n\n        image_count += 1\n\n        # If to use only a range\n        if first_image_index is not None and last_image_index is not None:\n            if image_count < first_image_index or image_count > last_image_index:\n                continue\n        \n        # Put the values in a matrix\n        M = np.identity(4)\n        val_count = 0\n        # Read rotation\n        for row in range(3):\n            for col in range(3):\n                M[row][col] = float(vals[val_count])\n                val_count = val_count + 1\n        # Read translation\n        for row in range(3):\n            M[row][3] = float(vals[val_count])\n            val_count = val_count + 1\n\n        images.append(image)\n        world_to_cam.append(M)\n        \n    return (images, world_to_cam)\n\ndef undistort_images(args, rig_sensor, images, tools_base_dir, extension,\n                     extra_opts, suff):\n\n    # Form the list of distorted images\n    dist_image_list = args.out_dir + \"/\" + rig_sensor + \"/distorted_index.txt\"\n    mkdir_p(os.path.dirname(dist_image_list))\n    print(\"Writing: \" + dist_image_list)\n    dist_images = []\n    with open(dist_image_list, 'w') as f:\n        for image in images:\n            dist_images.append(image)\n            f.write(image + \"\\n\")\n\n    # Form the list of unundistorted images\n    undist_dir = args.out_dir + \"/\" + rig_sensor + \"/undistorted\" + suff\n\n    if os.path.isdir(undist_dir):\n        # Wipe the existing directory, as it may have stray files\n        print(\"Removing recursively old directory: \" + undist_dir)\n        shutil.rmtree(undist_dir)\n    \n    undist_image_list = undist_dir + \"/index.txt\"\n    mkdir_p(undist_dir)\n    print(\"Writing: \" + undist_image_list)\n    undistorted_images = []\n    with open(undist_image_list, 'w') as f:\n        for image in dist_images:\n            image = undist_dir + \"/\" + os.path.basename(image)\n            # Use desired extension. For example, texrecon seems to want .jpg. In stereo\n            # one prefers .tif, as that one is lossless.\n            path, ext = os.path.splitext(image)\n            image = path + extension\n            undistorted_images.append(image)\n            f.write(image + \"\\n\")\n\n    undist_intrinsics = undist_dir + \"/undistorted_intrinsics.txt\"\n    cmd = [tools_base_dir + \"/bin/undistort_image_texrecon\",\n           \"--image_list\", dist_image_list,\n           \"--output_list\", undist_image_list,\n           \"--rig_config\", args.rig_config,\n           \"--rig_sensor\", rig_sensor,\n           \"--undistorted_crop_win\", args.undistorted_crop_win,\n           \"--undistorted_intrinsics\", undist_intrinsics] + \\\n           extra_opts\n    \n    print(\"Undistorting \" + rig_sensor + \" images.\")\n    run_cmd(cmd)\n\n    return (undist_intrinsics, undistorted_images, undist_dir)\n\ndef read_intrinsics(intrinsics_file):\n    \n    if not os.path.exists(intrinsics_file):\n        raise Exception(\"Missing file: \" + intrinsics_file)\n\n    with open(intrinsics_file, \"r\") as f:\n        for line in f:\n            if re.match(r\"^\\s*\\#\", line):\n                continue  # ignore the comments\n            vals = line.split()\n            if len(vals) < 5:\n                raise Exception(\"Expecting 5 parameters in \" + intrinsics_file)\n            widx = float(vals[0])\n            widy = float(vals[1])\n            f = float(vals[2])\n            cx = float(vals[3])\n            cy = float(vals[4])\n\n            return(widx, widy, f, cx, cy)\n\n    # If no luck\n    raise Exception(\"Could not read intrinsics from: \" + intrinsics_file)\n\ndef write_tsai_camera_file(tsai_file, f, cx, cy, cam_to_world):\n    \"\"\"\n    Write a tsai camera file understandable by ASP. Assume that the\n    intrinsics f, cx, cy are in units of pixels, and the pitch is 1,\n    and that there is no distortion.\n    \"\"\"\n\n    print(\"Writing: \" + tsai_file)\n    M = cam_to_world # to save on typing\n    with open(tsai_file, \"w\") as g:\n        g.write(\"VERSION_3\\n\")\n        g.write(\"fu = %0.17g\\n\" % f)\n        g.write(\"fv = %0.17g\\n\" % f)\n        g.write(\"cu = %0.17g\\n\" % cx)\n        g.write(\"cv = %0.17g\\n\" % cy)\n        g.write(\"u_direction = 1 0 0\\n\")\n        g.write(\"v_direction = 0 1 0\\n\")\n        g.write(\"w_direction = 0 0 1\\n\")\n        g.write(\"C = %0.17g %0.17g %0.17g\\n\" % (M[0][3], M[1][3], M[2][3]))\n        g.write(\"R = %0.17g %0.17g %0.17g %0.17g %0.17g %0.17g %0.17g %0.17g %0.17g\\n\" %\n                (M[0][0], M[0][1], M[0][2],\n                 M[1][0], M[1][1], M[1][2],\n                 M[2][0], M[2][1], M[2][2]))\n        g.write(\"pitch = 1\\n\")\n        g.write(\"NULL\\n\")\n\ndef write_cam_to_world_matrix(cam_to_world_file, cam_to_world):\n\n    print(\"Writing: \" + cam_to_world_file)\n    M = cam_to_world # to save on typing\n    with open(cam_to_world_file, \"w\") as g:\n        g.write((\"%0.17g %0.17g %0.17g %0.17g\\n\" + \\\n                 \"%0.17g %0.17g %0.17g %0.17g\\n\" + \\\n                 \"%0.17g %0.17g %0.17g %0.17g\\n\" + \\\n                 \"%0.17g %0.17g %0.17g %0.17g\\n\") % \n                (M[0][0], M[0][1], M[0][2], M[0][3],\n                 M[1][0], M[1][1], M[1][2], M[1][3],\n                 M[2][0], M[2][1], M[2][2], M[2][3],\n                 M[3][0], M[3][1], M[3][2], M[3][3]))\n\ndef findSensorNames(images, rig_config, image_sensor_list):\n\n    \"\"\"\n    Find the sensor name for each image. Either must have a list that specifies \n    the sensor name, or the sensor name must be in the image name or directory name.\n    \"\"\"\n\n    # Will return a dictionary called img_sensor_dict\n    img_sensor_dict = {}\n    \n    # Put the sensor names in a set\n    sensor_names = set()\n    for sensor_id in range(len(rig_config)):\n        sensor_name = rig_config[sensor_id]['sensor_name']\n        print(\"Sensor name: \" + sensor_name)\n        sensor_names.add(sensor_name)\n    \n    # First check if image_sensor_list exists, then first entry \n    # is image name, and second is sensor name. Read\n    # both the images and corresponding sensor names.\n    if image_sensor_list != \"\":\n        with open(image_sensor_list, 'r') as fh:\n            images = [] \n            for line in fh:\n                vals = line.split()\n                if len(vals) < 2:\n                    raise Exception(\"Each line in the image sensor list must have \" + \\\n                                    \"at least two entries: image name and sensor name.\")\n                img_sensor_dict[vals[0]] = vals[1]\n                images.append(vals[0])\n    \n    else:\n      # Infer based on image / directory names\n      for image in images:\n        cam_type = \"\"\n        try:\n          cam_type = os.path.basename(os.path.dirname(image))\n        except:\n          pass\n        # See if the directory name is sensor name \n        if cam_type in sensor_names:\n            img_sensor_dict[image] = cam_type\n            continue\n            \n        # See if the image name has the sensor name\n        success = False\n        for cam_type in sensor_names:\n            if cam_type in image:\n                img_sensor_dict[image] = cam_type\n                success = True\n                break\n       \n        if not success:\n          raise Exception(\"Could not find the sensor name for image: \" + image + \\\n                          \"\\nCheck your images and the naming conventions.\") \n      \n    return (images, img_sensor_dict)\n    \n    \ndef genCalibrationFile(args, rig_config, sym_images):\n    \"\"\"\n    Generate the calibration file for the rig.\n    \"\"\"\n    \n    calib_file = args.out_dir + \"/\" + \"theia_calibration.json\"\n\n    print(\"Writing Theia calibration file: \" + calib_file)\n    with open(calib_file, \"w\") as fh:\n        fh.write(\"{\\n\")\n        fh.write('\"priors\" : [\\n')\n\n        for sensor_id in range(len(rig_config)):\n            sensor_name = rig_config[sensor_id]['sensor_name']\n            num_images = len(sym_images[sensor_name])\n            if num_images == 0:\n                continue\n            for it in range(num_images):\n                image = os.path.basename(sym_images[sensor_name][it])\n                fh.write('{\"CameraIntrinsicsPrior\" : {\\n')\n                fh.write('\"image_name\" : \"' + image + '\",\\n')\n                fh.write('\"width\" : '  + rig_config[sensor_id]['image_size'][0] + \",\\n\")\n                fh.write('\"height\" : ' + rig_config[sensor_id]['image_size'][1] + \",\\n\")\n                fh.write('\"focal_length\" : ' + rig_config[sensor_id][\"focal_length\"] + \",\\n\")\n                fh.write('\"principal_point\" : [' + \\\n                         rig_config[sensor_id][\"optical_center\"][0] + \", \" + \\\n                         rig_config[sensor_id][\"optical_center\"][1] + \"],\\n\")\n                \n                dist_coeffs = rig_config[sensor_id][\"distortion_coeffs\"]\n                        \n                if rig_config[sensor_id]['distortion_type'] == 'no_distortion':\n                    fh.write('\"camera_intrinsics_type\" : \"PINHOLE\"\\n')\n                elif rig_config[sensor_id]['distortion_type'] == 'fov':\n                    fh.write('\"radial_distortion_1\" : ' + \\\n                             dist_coeffs[0] + \",\\n\")\n                    fh.write('\"camera_intrinsics_type\" : \"FOV\"\\n')\n                elif rig_config[sensor_id]['distortion_type'] == 'fisheye':\n                    # Theia expects the fisheye model to have 4 distortion coefficients.\n                    k1 = dist_coeffs[0]\n                    k2 = dist_coeffs[1]\n                    k3 = dist_coeffs[2]\n                    k4 = dist_coeffs[3]\n                    fh.write('\"radial_distortion_coeffs\" : [' + \\\n                             k1 + \", \" + k2 + \", \" + k3 + \", \" + k4 + \"],\\n\")\n                    fh.write('\"camera_intrinsics_type\" : \"FISHEYE\"\\n')\n                elif rig_config[sensor_id]['distortion_type'] == 'radtan':\n                    \n                    # Distortion coeffs convention copied from\n                    # camera_params.cc. JSON format from\n                    # calibration_test.json in TheiaSFM.\n                    k1 = dist_coeffs[0]\n                    k2 = dist_coeffs[1]\n                    p1 = dist_coeffs[2]\n                    p2 = dist_coeffs[3]\n                    k3 = '0'\n                    if len(dist_coeffs) == 5:\n                        k3 = dist_coeffs[4]\n                    fh.write('\"radial_distortion_coeffs\" : [' + \\\n                             k1 + \", \" + k2 + \", \" + k3 + \"],\\n\")\n                    fh.write('\"tangential_distortion_coeffs\" : [' + \\\n                             p1 + \", \" + p2 + \"],\\n\")\n                    fh.write('\"camera_intrinsics_type\" : \"PINHOLE_RADIAL_TANGENTIAL\"\\n')\n                else:\n                    raise Exception(\"Unknown distortion type: \" + \\\n                                    rig_config[sensor_id]['distortion_type'])\n\n                if it < num_images - 1 or sensor_id < len(rig_config)  - 1:\n                    fh.write(\"}},\\n\")\n                else:\n                    fh.write(\"}}\\n\")\n\n        fh.write(\"]\\n\")\n        fh.write(\"}\\n\")\n    \n    return calib_file\n"
  },
  {
    "path": "src/asp/Python/asp_stereo_utils.py",
    "content": "#!/usr/bin/env python\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\nfrom __future__ import print_function\nimport sys, optparse, subprocess, re, os, math, time, glob\nimport fcntl # for file locking\nimport os.path as P\n\nfrom asp_system_utils import *\nfrom asp_alg_utils import *\n\nimport asp_system_utils, asp_string_utils, asp_cmd_utils\nasp_system_utils.verify_python_version_is_supported()\n\n# For consistency with C++\nVW_CORRELATION_BM        = '0'\nVW_CORRELATION_SGM       = '1'\nVW_CORRELATION_MGM       = '2'\nVW_CORRELATION_FINAL_MGM = '3'\nVW_CORRELATION_OTHER     = '4'\n\ndef stereo_alg_to_num(alg):\n    '''Convert, for example, 'asp_mgm' to '2'. This function has a C++\n    analog in stereo.cc.'''\n\n    alg = alg.lower()\n    \n    if alg.startswith('0') or alg.startswith('asp_bm'):\n        return VW_CORRELATION_BM\n    \n    if alg.startswith('1') or alg.startswith('asp_sgm'):\n        return VW_CORRELATION_SGM\n\n    if alg.startswith('2') or alg.startswith('asp_mgm'):\n        return VW_CORRELATION_MGM\n\n    if alg.startswith('3') or alg.startswith('asp_final_mgm'):\n        return VW_CORRELATION_FINAL_MGM\n\n    # Use an external algorithm\n    return VW_CORRELATION_OTHER\n\nclass Step:\n    # The ids of individual stereo steps\n    pprc  = 0\n    corr  = 1\n    blend = 2\n    rfne  = 3\n    fltr  = 4\n    tri   = 5\n    clean  = 6  # parallel_stereo stops here\n    dem    = 7  # only used by stereo_dist\n    mosaic = 8  # only used by stereo_dist\n\ndef stereoProgName(step):\n    '''\n    Return the stereo program name for a given step.\n    '''\n    if step == Step.pprc:\n        return 'stereo_pprc'\n    elif step == Step.corr:\n        return 'stereo_corr'\n    elif step == Step.blend:\n        return 'stereo_blend'\n    elif step == Step.rfne:\n        return 'stereo_rfne'\n    elif step == Step.fltr:\n        return 'stereo_fltr'\n    elif step == Step.tri:\n        return 'stereo_tri'\n    elif step == Step.clean:\n        # Add this for convenience, when querying the latest stage in the status file\n        return 'stereo_parse'\n    else:\n        return 'stereo_unknown'\n\n# This is a bugfix for OpenBLAS on the Mac. It cannot handle\n# too many threads. Never use more than 128 threads in either\n# case, as openblas can't  handle it.\ndef reduce_num_threads(cmd):\n\n    # This is only needed if the user specified --threads\n    if '--threads' not in cmd:\n        return cmd\n\n    num_threads_arr = asp_cmd_utils.get_option(cmd, '--threads', 1)\n    if len(num_threads_arr) > 1:\n        num_threads = int(num_threads_arr[1])\n    else:\n        num_threads = 1\n\n    prog = cmd[0]\n    if os.path.basename(prog) == 'stereo_pprc' and sys.platform == 'darwin':\n        os.environ['OPENBLAS_NUM_THREADS'] = '1'\n        num_threads = min(num_threads, get_num_cpus())\n        num_threads = min(num_threads, 4)\n\n    num_threads = min(num_threads, 128)\n    num_threads = max(num_threads, 1)\n    asp_cmd_utils.set_option(cmd, '--threads', [num_threads])\n\n    return cmd\n\ndef stereo_run(prog, args, opt, **kw):\n    '''Run a stereo executable. Output is shown on screen as it happens.\n       Optional kw args: extra_args (list), msg (string for error message).'''\n    extra_args = kw.get('extra_args', [])\n    msg = kw.get('msg', prog)\n\n    binpath = bin_path(prog)\n    call = [binpath] + args + extra_args\n\n    call = reduce_num_threads(call)\n\n    # On Linux estimate the memory usage and runtime\n    if 'linux' in sys.platform and prog == 'stereo_corr' and \\\n           hasattr(opt, 'mem_usage') and opt.mem_usage:\n        call = ['/usr/bin/time',  '-f', '\"elapsed=%E mem=%M (kb) time_stereo_corr\"'] + call\n        print(\" \".join(call))\n        \n    if opt.dryrun or opt.verbose:\n        print(\" \".join(call))\n        \n    if opt.dryrun: return\n    try:\n        t_start = time.time()\n        code = subprocess.call(call)\n        if opt.verbose:\n            wall_s = time.time() - t_start\n            print('Wall time (s): {0:.1f}\\n'.format(wall_s))\n    except OSError as e:\n        raise Exception('%s: %s' % (binpath, e))\n    if code != 0:\n        raise Exception('Stereo step ' + msg + ' failed')\n\ndef run_sparse_disp(args, opt):\n\n    settings   = run_and_parse_output( \"stereo_parse\", args, \",\", opt.verbose )\n    left_img   = settings[\"trans_left_image\"]\n    right_img  = settings[\"trans_right_image\"]\n    out_prefix = settings[\"out_prefix\"]\n\n    sparse_args = left_img + right_img + out_prefix + ['--nodata-value', str(0)]\n    if opt.sparse_disp_options is not None:\n        sparse_args += opt.sparse_disp_options.split()\n\n    # Pass the number of threads to sparse_disp\n    # sparse_disp_options should trump\n    if not any('--processes' in s for s in sparse_args):\n        num_threads = 0\n        if hasattr(opt, 'threads') and opt.threads is not None and opt.threads > 0:\n            num_threads = opt.threads\n        if hasattr(opt, 'threads_single')       and \\\n               (opt.threads_single is not None) and \\\n               (opt.threads_single > 0):\n            num_threads = opt.threads_single\n        if num_threads > 0:\n            sparse_args += ['--processes', str(num_threads)]\n\n    # If the user set ASP_PYTHON_MODULES_PATH using the custom ASP python installation script,\n    #  set the LD_LIBRARY_PATH and PYTHON_PATH accordingly.  Otherwise the user's default\n    #  Python installation will be used.\n    if os.environ.get('ASP_PYTHON_MODULES_PATH') is not None:\n        if os.environ.get('LD_LIBRARY_PATH') is None:\n            os.environ['LD_LIBRARY_PATH'] = os.environ.get('ASP_PYTHON_MODULES_PATH')\n        else:\n            os.environ['LD_LIBRARY_PATH'] = os.environ.get('LD_LIBRARY_PATH') + \\\n                                            \":\" + os.environ.get('ASP_PYTHON_MODULES_PATH')\n        if os.environ.get('PYTHONPATH') is None:\n            os.environ['PYTHONPATH'] = os.environ.get('ASP_PYTHON_MODULES_PATH')\n        else:\n            os.environ['PYTHONPATH'] = os.environ.get('ASP_PYTHON_MODULES_PATH') + \":\" + \\\n                                      os.environ.get('PYTHONPATH')\n\n    print('Running sparse disp with arguments: ' + str(sparse_args) +'\\nand options: ' + str(opt))\n\n    stereo_run('sparse_disp', sparse_args, opt,\n               msg='%d: Low-res correlation with sparse_disp' % Step.corr)\n\n# Do low-res correlation.\ndef calc_lowres_disp(args, opt, sep, resume = False):\n\n    will_run = True\n    if resume:\n        settings     = run_and_parse_output(\"stereo_parse\", args, \",\", opt.verbose)\n        out_prefix   = settings[\"out_prefix\"][0]\n        d_sub        = out_prefix + '-D_sub.tif'\n        d_sub_spread = out_prefix + '-D_sub_spread.tif'\n    \n        if (opt.seed_mode != 3):\n            if asp_system_utils.is_valid_image(d_sub):\n                will_run = False\n            else:\n                print(\"Will recreate: \" + d_sub)\n        else:\n            if asp_system_utils.is_valid_image(d_sub) and \\\n                   asp_system_utils.is_valid_image(d_sub_spread):\n                will_run = False\n            else:\n                print(\"Will recreate: \" + d_sub + \" and \" + d_sub_spread)\n\n    if will_run:\n        if (opt.seed_mode == 3):\n            # This uses the python sparse_disp tool\n            run_sparse_disp(args, opt)\n        else:\n            local_args = args[:] # deep copy to use locally\n            local_args.extend(['--compute-low-res-disparity-only'])\n            # invoke here stereo_run to be able to see the output on screen\n            stereo_run('stereo_corr', local_args, opt, msg='')\n\n    # Attach a georef to D_sub and D_sub_spread if appropriate\n    local_args = args[:] # deep copy to use locally\n    local_args.append('--attach-georeference-to-lowres-disparity')\n    run_and_parse_output(\"stereo_parse\", local_args, sep, opt.verbose)\n\ndef parse_corr_seed_mode(filename):\n\n    mode = None\n\n    # Extract corr-seed-mode from filename.\n    if not os.path.isfile(filename):\n        return mode\n\n    # Care with encoding\n    fh = open(filename, 'r', encoding='utf8', errors='ignore')\n    \n    for line in fh:\n        line = re.sub(r'\\#.*?$', '', line) # wipe comments\n        matches = re.match(r'^\\s*corr-seed-mode\\s+(\\d+)', line)\n        if matches:\n            mode = int(matches.group(1))\n    fh.close()\n\n    return mode\n\ndef resolve_seed_mode(opt, args):\n    '''Resolve corr-seed-mode from CLI, stereo file, or default.\n    Sets opt.seed_mode and appends --corr-seed-mode to args.'''\n    if opt.seed_mode is None:\n        opt.seed_mode = parse_corr_seed_mode(opt.stereo_file)\n    if opt.seed_mode is None:\n        opt.seed_mode = 1\n    args.extend(['--corr-seed-mode', str(opt.seed_mode)])\n\ndef run_multiview(prog_name, args, extra_args, entry_point, stop_point,\n                  verbose, settings):\n\n    # Invoke multiview stereo processing, either using 'stereo', or\n    # using 'parallel_stereo', depending on the caller of this function.\n\n    # Doing multi-view stereo amounts to doing all the steps of stereo\n    # save for triangulation for stereo pairs made up of first image\n    # and another image in the sequence. Then, triangulation is done\n    # using all images. The precise stereo command to use for each\n    # pair was already generated by stereo_parse, and here we extract\n    # it from 'settings'.\n\n    # We must respect caller's entry and stop points.\n\n    # Must make sure to use the same Python invoked by parent\n    python_path = sys.executable\n\n    # Run all steps but tri\n    for s in sorted(settings.keys()):\n\n        m = re.match(r'multiview_command', s)\n        if not m: continue\n\n        local_args    = settings[s][:] # the current two-image stereo command\n        local_args[0] = prog_name\n        local_entry   = entry_point\n        local_stop    = stop_point\n        if local_stop > Step.tri:\n            local_stop = Step.tri\n        local_args.extend(['--entry-point', str(local_entry)])\n        local_args.extend(['--stop-point',  str(local_stop)])\n        local_args.extend(extra_args)\n        cmd = [python_path] + local_args\n        # Go on even if some of the runs fail\n        try:\n            asp_system_utils.generic_run(cmd, verbose)\n        except:\n            pass\n\n    # Run tri\n    local_args  = [prog_name]\n    local_args.extend(args)\n    local_entry = Step.tri\n    local_stop  = stop_point\n    local_args.extend(['--entry-point', str(local_entry)])\n    local_args.extend(['--stop-point', str(local_stop)])\n    local_args.extend(extra_args)\n    cmd = [python_path] + local_args\n    asp_system_utils.generic_run(cmd, verbose)\n\n    # Here we ensure that in the run directory\n    # the L.tif file is present, by sym-linking\n    # from the subdirectory of one of the pairs.\n    # It is nice to have L.tif for when we later\n    # do point2dem PC.tif --orthoimage L.tif\n\n    # The code below amounts to:\n    # ln -s out_prefix-pair1/1-L.tif out_prefix-L.tif\n    out_prefix = settings['out_prefix'][0]\n    sym_f      = out_prefix + '-L.tif'\n    if not os.path.lexists(sym_f):\n        files = glob.glob(out_prefix + '-pair*/*-L.tif')\n        if len(files) > 0:\n            f = files[0]\n            run_dir = os.path.dirname(out_prefix)\n            rel_f   = os.path.relpath(f, run_dir)\n            os.symlink(rel_f, sym_f)\n\ndef stereoTilesIndex(out_prefix):\n    '''\n    Form the index of tiles.\n    '''\n    return out_prefix + \"-tiles-index.txt\"\n\ndef stereoStatusFile(out_prefix):\n    '''\n    The file having the status of how many tiles were successfully processed.\n    '''\n    return out_prefix + \"-stereo-status.txt\"\n\n\ndef numTiles(out_prefix):\n    '''\n    Return the total number of tiles for current stage of processing.\n    '''\n    \n    tiles_index = stereoTilesIndex(out_prefix)\n    \n    num_tiles = 0\n    if not os.path.exists(tiles_index):\n        return num_tiles\n        \n    # Read this file and count how many lines\n    with open(tiles_index, 'r') as f:\n        lines = f.readlines()\n        num_tiles = len(lines)\n    return num_tiles\n    \n            \ndef updateNumDoneTiles(out_prefix, latest_stage_name, reset):\n    '''\n    Update the number of done tiles for current stage of processing. Care is taken\n    that multiple processes can both update the same status file without conflicts.\n    '''\n\n    num_tiles = numTiles(out_prefix)\n    status_file = stereoStatusFile(out_prefix)\n    \n    if latest_stage_name in ['stereo_pprc', 'stereo_fltr']:\n        # There is no tiling for these stages\n        num_tiles = 1\n        \n    # If this is a sym link, wipe it. Symlinks can happen if resuming from a prev run.\n    if os.path.islink(status_file):\n        os.unlink(status_file)\n\n    # Ensure file exists so r+ mode does not fail\n    if not os.path.exists(status_file):\n        with open(status_file, 'a') as f:\n            pass\n\n    # Open handle for both reading and writing\n    with open(status_file, 'r+') as f:\n        # Get exclusive lock to prevent race conditions\n        # lockf is used for better compatibility with network storage\n        fcntl.lockf(f, fcntl.LOCK_EX)\n        try:\n            # read current status\n            lines = f.readlines()\n            stage_name = \"\"\n            num_done = 0\n            \n            if len(lines) > 1:\n                # First line is a comment, second one has the data\n                statusParts = lines[1].strip().split(' ')\n                if len(statusParts) > 1:\n                    stage_name = statusParts[0]\n                    num_done = int(statusParts[1])\n\n            # update logic\n            if stage_name != latest_stage_name or reset:\n                num_done = 0\n                stage_name = latest_stage_name\n            \n            if not reset:\n                num_done += 1\n\n            # Write new status\n            f.seek(0) # return to start of file\n            f.truncate() # wipe old data\n            f.write(\"# processingStep numDoneTiles numTotalTiles\\n\")\n            f.write(f\"{stage_name} {num_done} {num_tiles}\\n\")\n            \n            # Ensure data reaches the disk/server before unlocking\n            f.flush()\n            os.fsync(f.fileno()) \n            \n            # It is helpful to print this info, but not for pprc, etc.\n            if num_tiles > 1:\n                print(f\"Processing status: {stage_name} {num_done} / {num_tiles} tiles\")\n\n        finally:\n            # release the lock\n            fcntl.lockf(f, fcntl.LOCK_UN)\n\ndef produce_tiles(opt, args, settings, tile_w, tile_h):\n    '''\n    Generate a list of bounding boxes for each output tile. Use stereo_parse for\n    that. Skip the tiles that have no valid low-res disparity (D_sub.tif).\n    '''\n    \n    # This cannot happen before we know trans_left_image_size\n    key = 'trans_left_image_size'\n    if key not in settings:\n        raise Exception(\"Cannot produce tiles until L.tif is known.\")\n        \n    sep = \",\"\n    tile_opt = ['--parallel-tile-size', str(tile_w), str(tile_h)]\n    verbose = False\n    num_pairs = int(settings['num_stereo_pairs'][0]) # for multiview\n    \n    if opt.seed_mode != 0 and num_pairs == 1:\n      # D_sub must exist\n      d_sub_file = settings['out_prefix'][0] + '-D_sub.tif'\n      if not os.path.exists(d_sub_file):\n        print(\"WARNING: The file \" + d_sub_file + \" does not exist. \" + \\\n              \"Will not be able to exclude tiles with no data.\")\n    \n    # Create the tiles with stereo_parse This can handle D_sub.\n    run_and_parse_output(\"stereo_parse\", args + tile_opt, sep, verbose)\n    tiles = readTiles(settings['out_prefix'][0])\n    return tiles\n\ndef tile_dir(prefix, tile):\n    return prefix + '-' + tile.name_str()\n\ndef use_padded_tiles(settings):\n    '''\n    Tiles with padding are needed for local epipolar alignment and for non-asp_bm \n    stereo algorithms.\n    '''\n    \n    alg = stereo_alg_to_num(settings['stereo_algorithm'][0])\n    return (alg > VW_CORRELATION_BM or settings['alignment_method'][0] == 'local_epipolar')\n\ndef grow_crop_tile_maybe(settings, prog, tile):\n    '''\n    The tile, perhaps with padding added, and perhaps cropped to\n    desired region, on which to run one of the stereo tools.\n    '''\n\n    # Make a local copy of the tile, as we may grow it\n    local_tile = BBox(tile.x, tile.y, tile.width, tile.height)\n    if use_padded_tiles(settings) and prog == 'stereo_corr':\n        collar_size = int(settings['collar_size'][0])\n        local_tile.add_collar(collar_size)\n\n    # Will do only the tiles intersecting user's crop window.\n    w = settings['transformed_window']\n    user_crop_win = BBox(int(w[0]), int(w[1]), int(w[2]), int(w[3]))\n    \n    crop_box = intersect_boxes(user_crop_win, local_tile)\n    if crop_box.width <= 0 or crop_box.height <= 0: \n        return [] # Don't need to process this\n\n    return crop_box\n\ndef build_vrt(prog, opt, args, settings, georef, postfix, tile_postfix, contract_tiles=False):\n    '''Generate a VRT file to treat the separate image tiles as one large image.'''\n\n    image_size = settings[\"trans_left_image_size\"]\n\n    vrt_file = settings['out_prefix'][0]+postfix\n    print(\"Writing: \" + vrt_file)\n    f = open(vrt_file,'w')\n    f.write(\"<VRTDataset rasterXSize=\\\"%i\\\" rasterYSize=\\\"%i\\\">\\n\" %\n            (int(image_size[0]),int(image_size[1])))\n\n    # Write the datum, projection, and georeference transform in XML format\n    f.write(\"  <SRS>\" + georef[\"WKT\"] + \"</SRS>\\n\")\n    f.write(\"  <GeoTransform>\" + georef[\"GeoTransform\"] + \"</GeoTransform>\\n\")\n\n    # Locate a known good tile\n    tiles = produce_tiles(opt, args, settings, opt.job_size_w, opt.job_size_h)\n    goodFilename = \"\"\n    for tile in tiles:\n        directory = tile_dir(settings['out_prefix'][0], tile)\n        filename  = directory + \"/\" + tile.name_str() + tile_postfix\n        if os.path.isfile(filename):\n            goodFilename = filename\n            break\n    if goodFilename == \"\":\n        raise Exception('No tiles were generated.')\n\n    # Do gdalinfo on the good tile to get metadata\n    args = [goodFilename]\n    sep = \"=\"\n    gdal_settings = run_and_parse_output(\"gdalinfo\", args, sep, opt.verbose)\n    \n    # Extract the data type (e.g., Float32 or Float64)\n    data_type = \"Float32\"\n    for s in gdal_settings:\n        val = \" \".join(gdal_settings[s])\n        m = re.match(r'^.*? Type (\\w+)', val)\n        if m:\n            data_type = m.group(1)\n            break\n\n    # Extract the block size, e.g., 256x256, from 'Band 2 Block=256x256'\n    BlockXSize = 0\n    BlockYSize = 0\n    for s in gdal_settings:\n        val = \" \".join(gdal_settings[s])\n        if re.match(r\"^\\s*Band\\s+\\d\", s):\n            m = re.match(r'^\\s*(\\d+)x(\\d+)', val)\n            if m:\n                BlockXSize = m.group(1)\n                BlockYSize = m.group(2)\n                break\n\n    # Extract no-data value, if present\n    has_nodata = False\n    key = 'NoData Value'\n    nodata_value = 0\n    if key in gdal_settings:\n        has_nodata = True\n        nodata_value = gdal_settings[key][0]\n\n    # Find how many bands are in the file\n    num_bands = 0\n    for s in gdal_settings:\n        m = re.match(r'^.*?Band\\s+(\\d+)', s)\n        if m:\n            b = int(m.group(1))\n            if num_bands < b:\n                num_bands = b\n\n    # Copy some keys over to the vrt\n    keys = [\"POINT_OFFSET\", \"AREA_OR_POINT\", \"BAND1\", \"BAND2\", \"BAND3\", \"BAND4\", \"BAND5\", \"BAND6\"]\n    for key in keys:\n        if key in gdal_settings:\n            f.write(\"  <Metadata>\\n    <MDI key=\\\"\" + key + \"\\\">\" +\n                    gdal_settings[key][0] + \"</MDI>\\n  </Metadata>\\n\")\n\n    # Write each band\n    for b in range(1, num_bands + 1):\n        f.write(\"  <VRTRasterBand dataType=\\\"%s\\\" band=\\\"%i\\\">\\n\" % (data_type,b))\n\n        for tile in tiles:\n            directory = tile_dir(settings['out_prefix'][0], tile)\n            filename  = directory + \"/\" + tile.name_str() + tile_postfix\n\n            # Handle non-existent tiles\n            if not os.path.isfile(filename):\n                continue # Leave empty\n\n            relative  = os.path.relpath(filename, os.path.dirname(settings['out_prefix'][0]))\n            f.write(\"    <SimpleSource>\\n\")\n            f.write(\"       <SourceFilename relativeToVRT=\\\"1\\\">%s</SourceFilename>\\n\" % relative)\n            f.write(\"       <SourceBand>%i</SourceBand>\\n\" % b)\n\n            # Bugfix for the \"too many open files\" problem.\n            # Per https://lists.osgeo.org/pipermail/gdal-dev/2017-October/047370.html\n            adjusted_tile = grow_crop_tile_maybe(settings, prog, tile)\n            f.write(('       <SourceProperties RasterXSize=\"%i\" RasterYSize=\"%i\" ' + \\\n                     'DataType=\"%s\" BlockXSize=\"%s\" BlockYSize=\"%s\"/>\\n') \\\n                    % (adjusted_tile.width, adjusted_tile.height, data_type, BlockXSize, BlockYSize))\n\n            min_x  = 0\n            min_y  = 0\n            if (contract_tiles):\n                # Need to account for the padding\n                pad_amount = int(settings['collar_size'][0])\n                user_min_x = int(settings['transformed_window'][0])\n                user_min_y = int(settings['transformed_window'][1])\n                # For the tiles not starting at zero, account for the fact that they\n                #  have padding at the top and/or right of the images.\n                if (tile.x > user_min_x):\n                    min_x  += pad_amount\n                if (tile.y > user_min_y):\n                    min_y  += pad_amount\n\n            f.write('       <SrcRect xOff=\"%i\" yOff=\"%i\" xSize=\"%i\" ySize=\"%i\"/>\\n' %\n                    (min_x, min_y, tile.width, tile.height))\n\n            f.write('       <DstRect xOff=\"%i\" yOff=\"%i\" xSize=\"%i\" ySize=\"%i\"/>\\n' %\n                    (tile.x, tile.y, tile.width, tile.height))\n            f.write(\"    </SimpleSource>\\n\")\n        # End tile loop\n\n        if has_nodata:\n            f.write(\"  <NoDataValue>\" + nodata_value + \"</NoDataValue>\\n\")\n        \n        f.write(\"  </VRTRasterBand>\\n\")\n    # End band loop\n    f.write(\"</VRTDataset>\\n\")\n    f.close()\n\n# We will not symlink PC.tif and RD.tif which will be VRT files,\n# and neither the log files. We will symlink L.txt and R.txt.\nskip_symlink_expr = r'^.*?-(PC\\.tif|RD\\.tif|log.*?\\.txt)$'\n\ndef create_subdirs_symlink(opt, args, settings):\n    '''Create tile subdirectories and symlink files from parent run directory.\n       Return the created subdirectories.'''\n    out_prefix = settings['out_prefix'][0]\n    tiles = produce_tiles(opt, args, settings, opt.job_size_w, opt.job_size_h)\n    subdirs = readDirList(out_prefix)\n\n    try:\n        parentDir = os.path.dirname(out_prefix)\n        mkdir_p(parentDir)\n    except:\n        pass\n\n    for tile_id in range(len(subdirs)):\n        tile = tiles[tile_id]\n        subdir = subdirs[tile_id]\n        tile_prefix = subdir + \"/\" + tile.name_str()\n\n        if opt.dryrun:\n            print(\"mkdir -p %s\" % subdir)\n            print(\"Soft linking via %s %s\" % (tile_prefix, out_prefix))\n            continue\n\n        mkdir_p(subdir)\n        files = glob.glob(out_prefix + '*')\n        for f in files:\n            if os.path.isdir(f):\n                continue\n            rel_src = os.path.relpath(f, subdir)\n            m = re.match(skip_symlink_expr, rel_src)\n            if m:\n                continue\n            dst_f = f.replace(out_prefix, tile_prefix)\n            if os.path.lexists(dst_f):\n                continue\n            os.symlink(rel_src, dst_f)\n\n    return subdirs\n\ndef rename_files(settings, subdirs, postfix_in, postfix_out):\n    '''Rename tile_dir/file_in.tif to tile_dir/file_out.tif.\n       Skip symlinks, such as when this directory was processed before.'''\n    for subdir in subdirs:\n        tile = dirToTile(subdir)\n        prefix = subdir + \"/\" + tile.name_str()\n        filename_in = prefix + postfix_in\n        filename_out = prefix + postfix_out\n        if os.path.isfile(filename_in) and (not os.path.islink(filename_in)):\n            if os.path.exists(filename_out):\n                os.remove(filename_out)\n            os.rename(filename_in, filename_out)\n\ndef set_collar_size(new_collar_size, args, settings):\n    '''Set collar_size to a new value, and update the settings and args.'''\n    collar_size = new_collar_size\n    asp_cmd_utils.set_option(args, '--sgm-collar-size', [str(collar_size)])\n    settings['collar_size'] = [str(collar_size)]\n    return (settings, args)\n\ndef normal_run(prog, opt, args, out_prefix, **kw):\n    '''Job launch wrapper for a non-tile stereo call.'''\n    binpath = bin_path(prog)\n    call = [binpath]\n    call.extend(args)\n\n    if opt.threads_single is not None:\n        asp_cmd_utils.wipe_option(call, '--threads', 1)\n        call.extend(['--threads', str(opt.threads_single)])\n    call = reduce_num_threads(call)\n\n    if opt.dryrun:\n        print('%s' % ' '.join(call))\n        return\n\n    if prog != \"stereo_tri\":\n        resetStatus = True\n        updateNumDoneTiles(out_prefix, prog, resetStatus)\n\n    if opt.verbose:\n        print('%s' % ' '.join(call))\n    try:\n        status = subprocess.call(call)\n    except OSError as e:\n        raise Exception('%s: %s' % (binpath, e))\n    if status != 0:\n        raise Exception('Stereo step ' + kw['msg'] + ' failed')\n\n    if status == 0 and prog != \"stereo_tri\":\n        resetStatus = False\n        updateNumDoneTiles(out_prefix, prog, resetStatus)\n\ndef readDistTileList(outPrefix):\n    '''Read the distributed tile list file. Return list of (BBox, padding) tuples.'''\n    tileListFile = outPrefix + '-distTileList.txt'\n    if not os.path.exists(tileListFile):\n        raise Exception('Tile list file not found: ' + tileListFile)\n\n    tiles = []\n    with open(tileListFile, 'r') as f:\n        for line in f:\n            line = line.strip()\n            if not line:\n                continue\n            parts = line.split()\n            if len(parts) != 5:\n                raise Exception('Invalid tile list line: ' + line)\n            x, y, width, height, padding = [int(p) for p in parts]\n            tiles.append((BBox(x, y, width, height), padding))\n\n    return tiles\n\n"
  },
  {
    "path": "src/asp/Python/asp_string_utils.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n\"\"\"\n   Functions to help with string parsing.\n\"\"\"\nfrom __future__ import print_function\nimport sys, os, re, string, time, shlex\n\ndef isNumber(text):\n    \"\"\"Returns True if the text is a number\"\"\"\n    \n    try:\n        float(text)\n    except ValueError: # Not a number\n        return False\n    return True # No error, the number must have converted\n\ndef convertToFloatIfNumber(text):\n    \"\"\"If the text is a number returns float(text), otherwise just text\"\"\"\n    \n    try:\n        a = float(text)\n    except ValueError: # Not a number\n        return text\n    return a # No error, the number must have converted\n\ndef getLineAfterText(text, prefix, startPos=0, includeText=False):\n    \"\"\"Extracts the remainder of a line after a prefix\"\"\"\n    # StartPos = index in the text to start looking at\n    \n    # Find the prefix\n    prefixLoc = text.find(prefix, startPos)\n    if prefixLoc < 0:\n        raise Exception('Desired text not found: ' + prefix)\n    \n    # Find the bounds after the prefix\n    prefixEnd = prefixLoc + len(prefix)\n    nextEnd   = text.find('\\n', prefixEnd)\n    if nextEnd == -1: # If there was no trailing \\n, use one past last character.\n        nextEnd = len(text) \n\n    # Check that we found the bounds\n    if (prefixEnd < startPos) or (nextEnd <= prefixEnd):\n        raise Exception('Desired text not found: ' + prefix)\n    \n    # Extract the text\n    if includeText:\n        return text[prefixLoc:nextEnd]\n    else:\n        return text[prefixEnd:nextEnd]\n    \ndef getNumbersInParentheses(text):\n    \"\"\"Returns all sets of numbers in parentheses\"\"\"\n    \n    numberSets = []\n    \n    # Find all number sets in the text\n    parenGroups = re.findall( r'\\([ \\d.,-]*\\)', text) \n\n    for p in parenGroups:\n        numberText = p[1:-1] # Remove ()\n        numberList = numberText.split(',')\n        numbers = []\n        for n in numberList: # Convert strings to floats\n            numbers.append(float(n))\n        numberSets.append(numbers) # Add this set of numbers to output list\n\n    # If only one set of numbers return a list\n    if len(numberSets) == 1:\n        return numberSets[0]\n    else: # Otherwise return a list of lists\n        return numberSets\n    \n\ndef getNumberAfterEqualSign(text, lineStart=0):\n    \"\"\"Extracts a number after an '=' sign on a line\"\"\"\n    # LineStart = index in the text to start looking at\n    \n    numberText = getLineAfterText(text, '=', lineStart, False)\n\n    return convertToFloatIfNumber(numberText)\n\n\n# The following functions are useful for going between string and list\n#  representations of command line arguments\ndef isString(a):\n    \"\"\"Returns true if the object is a string\"\"\"\n\n    # Python 2/3 compatibilty\n    try:\n        basestring\n    except NameError:\n        basestring = str\n        \n    return isinstance(a, basestring)\n\ndef argListToString(argList):\n    \"\"\"Converts a list of arguments into a single argument string\"\"\"\n\n    string = \"\"\n    for arg in argList:\n        stringVersion = str(arg)\n\n        # Wrap arguments with spaces in them in \"\" so they stay together\n        if stringVersion.find(' ') >= 0:\n            stringVersion = '\"' + stringVersion + '\" '\n\n        if string == \"\":\n            string = stringVersion\n        else:\n            string = string + ' ' + stringVersion\n        \n    return string\n\ndef stringToArgList(string):\n    \"\"\"Converts a single argument string into a list of arguments\"\"\"\n    return shlex.split(string)\n\n"
  },
  {
    "path": "src/asp/Python/asp_system_utils.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n\"\"\"\nGeneral system related utilities\n\"\"\"\nfrom __future__ import print_function\nimport sys, os, re, shutil, subprocess, string, time, errno, multiprocessing, signal\nimport os.path as P\nimport asp_string_utils, asp_cmd_utils\n\n# This is explained further down\nif 'ASP_LIBRARY_PATH' in os.environ:\n    os.environ['LD_LIBRARY_PATH'] = os.environ['ASP_LIBRARY_PATH']\n\ndef raise_error(msg, code=-1):\n    '''Exit the program with an error message'''\n    print('Error: ' + msg, file=sys.stderr)\n    sys.exit(code)\n\ndef verify_python_version_is_supported():\n    '''Verifies that a supported version of Python is being used.'''\n    \n    if sys.version_info < (3, 0, 0):\n        print('\\nERROR: Must use Python version >= 3.0.')\n        sys.exit(1)\n\n# Print the version of the ASP programs\ndef print_version_and_exit():\n    prog = libexec_path(\"stereo_parse\") # get the full path\n    cmd = prog + \" --version\"\n    os.system(cmd)\n    sys.exit(0)\n\ndef get_prog_version(prog):\n    '''Get the version of a command line program.'''\n    try:\n        p = subprocess.Popen([prog,\"--version\"], stdout=subprocess.PIPE, universal_newlines=True)\n        out, err = p.communicate()\n    except:\n        raise Exception(\"Could not find: \" + prog)\n    if p.returncode != 0 and ('stereo_parse' not in prog):\n        # Our own stereo_parse returns 1 even if the version check\n        # succeeded. Too much work would be needed to fix that, so\n        # just ignore the return status in that case.\n        raise Exception(\"Checking \" + prog + \" version caused errors\")\n\n    # This is a fix for sometimes GNU Parallel printing a warning at the beginning\n    for line in out.split(\"\\n\"):\n        m = re.match(r\"^.*?warning\", line, re.IGNORECASE)\n        if m: \n            continue\n        # This covers a version with no dots and a version like 3.0.1-alpha.\n        # This is a fragile code.\n        m = re.match(r\"^.*? (\\d[^\\s]+)\", line)\n        if m:\n          return m.group(1)\n        \n    raise Exception(\"Could not find version in: \" + out)\n    \n    return \"\"\n\ndef get_asp_version():\n    '''Returns the current ASP version number'''\n    prog = libexec_path(\"stereo_parse\") # get the full path\n    return get_prog_version(prog)\n\ndef get_num_cpus():\n    \"\"\"Return the number of CPUs on the current machine.\"\"\"\n\n    import sys\n    if sys.version_info < (2, 6, 0):\n        num_cpus = 8\n    else:\n        from multiprocessing import cpu_count\n        num_cpus = cpu_count()\n\n    return num_cpus\n\ndef checkIfToolExists(toolName):\n    \"\"\"Returns true if the system knows about the utility with this name (it is on the PATH).\"\"\"\n\n    # Look for the tool using the 'which' command\n    cmd = ['which', toolName]\n    p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,\n                         universal_newlines=True)\n    translateOut, err = p.communicate()\n\n    # Check if that command failed to find the file\n    failString = 'no ' + toolName + ' in ('\n    if translateOut.find(failString) >= 0:\n        raise Exception('Missing required executable \"' + toolName + \\\n                        '\", please add it to your PATH.')\n    else:\n        return True\n\n# Find if a program is in the path. Some ASP tools are in libexec, hence the\n# option lookInLibexec.\n# TODO: This logic needs serious cleanup, but while making sure that nothing breaks.\ndef which(program, lookInLibexec = False):\n\n    if not lookInLibexec:\n        checkIfToolExists(program)\n    \n    def is_exe(fpath):\n        return os.path.isfile(fpath) and os.access(fpath, os.X_OK)\n\n    fpath, fname = os.path.split(program)\n    if fpath:\n        if is_exe(program):\n            return program\n    else:\n        paths = []\n        for path in os.environ[\"PATH\"].split(os.pathsep):\n            path = path.strip('\"')\n            paths.append(path)\n\n        for path in paths:\n            exe_file = os.path.join(path, program)\n            if is_exe(exe_file):\n                return exe_file\n\n        if lookInLibexec:\n            for path in paths:\n                exe_file = os.path.join(os.path.dirname(path), 'libexec', program)\n                if is_exe(exe_file):\n                    return exe_file\n            \n    raise Exception('Missing required executable \"' + program + '\", please add it to your PATH.')\n\n    return None\n\ndef getNumNodesInList(nodesListPath):\n    \"\"\"Get number of Pleiades nodes listed in a file\"\"\"\n\n    if nodesListPath is None:\n        return 1 # local machine\n\n    # Count the number of nodes without repetition\n    # (need this for Pleiades).\n    nodes     = {}\n    num_nodes = 0\n    try:\n        fileHandle = open(nodesListPath, \"r\")\n        for line in fileHandle:\n            if re.match(r'^\\s*$', line): continue # skip empty lines\n            matches = re.match(r'^\\s*([^\\s]*)', line)\n            if matches:\n                nodes[matches.group(1)] = 1\n\n        num_nodes = len(nodes)\n    except Exception as e: # Fail on exception\n        raise_error(e)\n    if num_nodes == 0:\n        raise Exception('The list of computing nodes is empty')\n\n    return num_nodes\n\ndef check_parallel_version():\n    # This error will never be reached for users of our packaged final\n    # product as that one bundles 'parallel' with it.\n    ver = get_prog_version('parallel')\n    if ver < '20170722':\n        raise_error(\"Expecting a version of GNU parallel >= 20170722.\")\n\n# Add simple quotes around each argument which has quotes or spaces\n# and which is not already quoted. This is a bugfix for 3D CRS specified via\n# --t_srs, and for arguments having spaces.\ndef escape_token(token):\n    has_issues = ('\"' in token or ' ' in token or '\\t' in token)\n    has_simple_quotes = token.startswith('\\'') and token.endswith('\\'')\n    has_double_quotes = token.startswith('\"') and token.endswith('\"')\n    if has_issues and not has_simple_quotes and not has_double_quotes:\n      token = '\\'' + token + '\\''\n    return token\n\ndef runInGnuParallel(numParallelProcesses, argumentFilePath, args, \n                     nodeListPath=None, verbose=False):\n    \"\"\"Use GNU Parallel to spread task across multiple computers and processes\"\"\"\n\n    # Make sure GNU parallel is installed\n    if not checkIfToolExists('parallel'):\n        raise Exception('Need GNU Parallel to distribute the jobs.')\n\n    # Ensure our 'parallel' is not out of date\n    check_parallel_version()\n\n    # Use GNU parallel with given number of processes. Let output be\n    # interspersed, read input series from file Start in the same directory on\n    # remote machines. Ensure that vital env variables are copied over.\n    # We do not use the GNU Parallel --workdir option, as this tool cannot\n    # handle spaces in the path. Instead, each caller of this function must\n    # handle the workdir itself. See for example the mapproject program.\n    cmd = ['parallel',  '--will-cite', '-u',\n           '--env', 'PATH', '--env', 'PYTHONPATH', '--env', 'ISISROOT',\n           '--env', 'ASP_LIBRARY_PATH',\n           '--env', 'ISISDATA', '-a', argumentFilePath]\n\n    # Add number of processes if specified (default is one job per CPU core)\n    if numParallelProcesses is not None:\n        cmd += ['-P', str(numParallelProcesses)]\n\n    # Add list of nodes as argument to the parallel tool if it is available\n    if nodeListPath is not None:\n        cmd += ['--sshloginfile', nodeListPath]\n\n    # Append any additional arguments to parallel\n    cmd += args\n\n    if verbose: # Echo the command line call we are about to make\n        print(\" \".join(cmd))\n\n    # This is a bugfix for RHEL 8. The 'parallel' program fails to start with ASP's\n    # libs, so temporarily hide them.\n    if 'LD_LIBRARY_PATH' in os.environ:\n        os.environ['ASP_LIBRARY_PATH'] = os.environ['LD_LIBRARY_PATH']\n        os.environ['LD_LIBRARY_PATH'] = ''\n\n    # Handle spaces and quotes\n    for i in range(len(cmd)):\n        cmd[i] = escape_token(cmd[i])\n\n    returnCode = subprocess.call(cmd)\n\n    # Undo the above\n    if 'ASP_LIBRARY_PATH' in os.environ:\n        os.environ['LD_LIBRARY_PATH'] = os.environ['ASP_LIBRARY_PATH']\n\n    return returnCode\n\n# When user-exposed ASP executables are installed, they are in\n# 'bin'. Otherwise, in dev mode, they are in the same dir as __file__.\n# We prefer absolute paths below, in case some intermediate directories\n# do not exist.\ndef bin_path(prog, **kw):\n    currpath = kw.get('path', P.dirname(P.abspath(__file__)))\n    binpath = os.path.abspath(P.join(currpath, '..', 'bin', prog))\n    if not P.isfile(binpath):\n        binpath = os.path.abspath(P.join(currpath, '..', 'Tools', prog))\n    if not P.isfile(binpath):\n        binpath = os.path.abspath(P.join(currpath, prog))\n    return binpath\n\n# When hidden ASP executables are installed, they are in\n# 'libexec'. Otherwise, in dev mode, they are in the same dir as\n# __file__. If no luck at all, search in 'bin'.\ndef libexec_path(prog, **kw):\n    currpath = kw.get('path', P.dirname(P.abspath(__file__)))\n    libexecpath = os.path.abspath(P.join(currpath, '..', 'libexec', prog))\n    if not P.isfile(libexecpath):\n        libexecpath = os.path.abspath(P.join(currpath, '..', 'Tools', prog))\n    if not P.isfile(libexecpath):\n        libexecpath = os.path.abspath(P.join(currpath, prog))\n    if not P.isfile(libexecpath):\n        libexecpath = os.path.abspath(P.join(currpath, '..', 'bin', prog))\n\n    if not P.isfile(libexecpath):\n        # Could not find prog in ''libexec' or 'bin' either. We will\n        # come here only for executables like gdalinfo that will be\n        # packages in the release, but are not yet in dev mode. Just\n        # print a warning and hope this tool is somewhere in user's\n        # path.\n        print(\"Could not find: \" + libexecpath)\n        libexecpath = which(prog)\n        if libexecpath is None:\n            raise Exception('Could not find: ' + prog)\n        print(\"Using instead: \" + libexecpath)\n\n    return libexecpath\n\n# mkdir without throw\ndef mkdir_p(path):\n    try:\n        os.makedirs(path)\n    except OSError:\n        pass\n\n# Execute a given command stored in the libexec directory and parse\n# its output. The output format is expected to be lines of\n# comma-separated values.  The first value on each line becomes the\n# output variable name, the other values are read into the array of\n# variable values.\ndef run_and_parse_output(cmd, args, sep, verbose, return_full_lines = False, **kw):\n    \n    libexecpath = libexec_path(cmd)\n    call = [libexecpath]\n    call.extend(args)\n\n    if verbose:\n        print (asp_string_utils.argListToString(call))\n\n    try:\n        p = subprocess.Popen(call, stdout=subprocess.PIPE, stderr=subprocess.PIPE,\n                             universal_newlines=True)\n    except OSError as e:\n        raise Exception('%s: %s' % (libexecpath, e))\n    (stdout, stderr) = p.communicate()\n    p.wait()\n    if p.returncode != 0:\n        if stdout is not None:\n            stdout = stdout.rstrip()\n            print(stdout)\n        if stderr is not None:\n            stderr = stderr.rstrip()\n            print(stderr)\n        raise Exception('Failed executing: ' + \" \".join(call))\n    data = {}\n    if verbose:\n        if stdout is not None: print(stdout)\n        if stderr is not None: print(stderr)\n\n    count = 0\n    for line in stdout.split('\\n'):\n\n        # Do not usually print warnings as they are verbose, and this function\n        # is invoked often. The main processes (such as stereo_pprc) will print\n        # the warnings.\n        if verbose and re.match(r\"^Warning\", line): \n            print(line)\n\n        if return_full_lines:\n            data[count] = line # return the entire line\n            count += 1\n        else:\n            if sep in line:\n                keywords = line.split(sep)\n                for index, item in enumerate(keywords):\n                    # Strip whitespace from ends\n                    keywords[index] = item.strip(' \\t\\n\\r')\n                data[keywords[0]] = keywords[1:]\n\n    return data\n\ndef run_with_return_code(cmd, verbose=False):\n    # TODO: Wipe this and use instead executeCommand.\n    if verbose:\n        print (asp_string_utils.argListToString(cmd))\n\n    try:\n        p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE,\n                             universal_newlines=True)\n    except OSError as e:\n        print('Error: %s: %s' % ( asp_string_utils.argListToString(cmd), e))\n        \n    (stdout, stderr) = p.communicate()\n    p.wait()\n    \n    if p.returncode != 0 and verbose:\n        if stdout is not None: print(stdout)\n        if stderr is not None: print(stderr)\n        print ('Failed executing: ' + \" \".join(cmd))\n\n    return p.returncode\n\ndef is_valid_image(filename):\n    \"\"\"See if the current image file exists and is valid.\"\"\"\n\n    if not os.path.exists(filename):\n        return False\n    \n    verbose = False\n    ans = run_with_return_code(['gdalinfo', filename], verbose) \n    if ans == 0:\n        return True\n\n    return False\n    \n# For timeout\ndef timeout_alarm_handler(signum, frame):\n    raise Exception(\"Timeout reached!\")\n\n# TODO: Improve this function a bit\ndef executeCommand(cmd,\n                   outputPath=None,      # If given, throw if the file is not created.  Don't run if it already exists.\n                   suppressOutput=False, # If true, don't print anything!\n                   redo=False,           # If true, run even if outputPath already exists.\n                   noThrow=False,        # If true, don't throw if output is missing\n                   numAttempts = 1,      # How many attempts to use\n                   sleepTime = 60,       # How much to sleep between attempts\n                   timeout   = -1,       # After how long to timeout in seconds\n                   realTimeOutput = False # If to print what the command is doing in real time\n                   ):\n    '''Executes a command with multiple options'''\n\n    # Initialize outputs\n    out    = \"\"\n    status = 0\n    err    = \"\"\n    \n    if cmd == '': # An empty task\n        return (out, err, status)\n\n    # Convert the input to list format if needed\n    if asp_string_utils.isString(cmd):\n        cmd = asp_string_utils.stringToArgList(cmd)\n    \n    for attempt in range(numAttempts):\n        \n        # Run the command if conditions are met\n        if redo or (outputPath is None) or (not os.path.exists(outputPath)):\n\n            if not suppressOutput:\n                print (asp_string_utils.argListToString(cmd))\n\n            if timeout > 0:\n                print(\"Will enforce timeout of \" + str(timeout) + \" seconds.\")\n                signal.signal(signal.SIGALRM, timeout_alarm_handler)\n                signal.alarm(timeout)\n                    \n            try:\n                p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE,\n                                     universal_newlines=True)\n                \n                if realTimeOutput and (not suppressOutput):\n                    # Print in real time what is going on, and return nothing in out and err\n                    while True:\n                        curr_out = p.stdout.readline()\n                        # TODO(oalexan1): It appears that quering p.stderr makes this not\n                        # work in real time, so may need to turn off the line below.\n                        # This will however break code which depends on things kept in\n                        # the error string. \n                        curr_err = p.stderr.readline()\n                        out += curr_out\n                        err += curr_err\n                        if curr_out == '' and p.poll() is not None:\n                            break\n                        if curr_out:\n                            print(curr_out.strip())\n                            \n                    status = p.poll()\n                else:\n                    # Collect the output and error\n                    out, err = p.communicate()\n                    status = p.returncode\n                    \n                if timeout > 0:\n                    signal.alarm(0)  # reset the alarm\n            except Exception as e:\n                out = \"\"\n                err = ('Error: %s: %s' % (asp_string_utils.argListToString(cmd), e))\n                if timeout > 0:\n                    # this module is generally not available, so this use is very niche\n                    import psutil\n                    def kill_proc_tree(pid, including_parent=True):    \n                        parent = psutil.Process(pid)\n                        for child in parent.children(recursive=True):\n                            print(\"Killing: \" + str(child))\n                            child.kill()\n                        if including_parent:\n                            print(\"Killing: \" + str(parent))\n                            parent.kill()\n                    pid = psutil.Process(p.pid)\n                    try:\n                        kill_proc_tree(p.pid)\n                    except:\n                        pass\n                    \n                status = 1\n                if not noThrow:\n                    raise Exception(err)\n\n            if out is None: out = \"\"\n            if err is None: err = \"\"\n\n            if (not suppressOutput) and (not realTimeOutput):\n                print (out + '\\n' + err)\n\n            if status == 0:\n                break\n\n            if numAttempts <= 1:\n                break\n\n            if attempt < numAttempts - 1:\n                print(\"attempt: \" + str(attempt))\n                print(\"ran: \" + asp_string_utils.argListToString(cmd) )\n                print(\"out = \" + out)\n                print(\"err = \" + err)\n                print(\"status = \" + str(status))\n                print(\"Will sleep for \" + str(sleepTime) + \" seconds\")\n\n                time.sleep(sleepTime)\n        \n        else: # Output file already exists, don't re-run\n            out    = \"\"\n            err    = \"\"\n            status = 0\n\n        # Optionally check that the output file was created\n        if outputPath and (not os.path.exists(outputPath)) and (not noThrow):\n            raise asp_cmd_utils.CmdRunException('Failed to create output file: ' + outputPath)\n\n    return (out, err, status)\n    \n# A very simple wrapper around subprocess\ndef generic_run(cmd, verbose):\n    cmd_str = asp_string_utils.argListToString(cmd)\n    if verbose:\n        print(cmd_str)\n\n    try:\n        code = subprocess.call(cmd)\n    except OSError as e:\n        raise Exception('%s: %s' % (cmd_str, e))\n    if code != 0:\n            raise Exception('Failed to run: ' + cmd_str)\n\ndef findTheiaInstallDir():\n    \"\"\"\n    Find the Theia installation directory. \n    \n    For packaged builds, this will be based on the path to the current\n    executable.\n    \n    For a dev build, it is easier to use the ISISROOT environment variable,\n    which is usually set.\n    \"\"\"\n    \n    installDir = os.path.dirname(os.path.dirname(os.path.abspath(sys.argv[0])))\n\n    if not os.path.exists(installDir + \"/bin/build_reconstruction\"):\n        if 'ISISROOT' in os.environ:\n            installDir = os.environ['ISISROOT']\n\n    if not os.path.exists(installDir + \"/bin/build_reconstruction\"):\n       raise Exception(\"Cannot find the Theia build_reconstruction binary. \" + \\\n                       \"Set the environment variable ISISROOT to point to the \" + \\\n                       \"installation directory for ASP dependencies, including Theia.\")\n\n    return installDir\n"
  },
  {
    "path": "src/asp/Python/scale_linescan.py",
    "content": "#!/usr/bin/env python3\n\n# Take a csm linescan json file, and make it work for an image with the\n# resolution that is 2x finer. This expects as input the number of columns\n# (samples) and rows (lines) in the image to be used with the rescaled output\n# camera. These are roughly 2x the width and height specified in the input\n# camera.\n\n# Usage: scale_linescan.py <in.json> <out.json> <out samples> <out lines>\n\n# This camera should be refined with jitter_solve.\n\n# This is a research script that is not officially supported.\n\nimport sys, json, os, re\nimport numpy as np\n\ndef read_json(file):\n\n    # Read into string\n    print(\"Reading: \", file)\n    with open(file, 'r') as f:\n        data = f.read()\n\n    # Find first occurrence of open brace. This is needed because the CSM\n    # state has some text before the JSON object.\n    pos = data.find('{')\n\n    # Do substring from pos to the end, if pos was found\n    header = \"\"\n    if pos != -1:\n        header = data[:pos] # save the header\n        data = data[pos:]\n        \n    # parse the json from data\n    j = json.loads(data)\n\n    # # Print all keys in the json\n    # print(\"will print all keys in the json\")\n    # # for key in j.keys():\n    # #     print(key)\n    \n    return (header, j)\n\ndef multiply(j, key, factor):\n    \"\"\"\n    Multiply the values in the list j[key] by factor. j gets modified in place.\n    \"\"\"\n    if key in j:\n      if isinstance(j[key], list):\n        j[key] = [x * factor for x in j[key]]\n      elif isinstance(j[key], (int, float)):\n        j[key] *= factor\n    else:\n      raise KeyError(f\"Key '{key}' not found or is not a list in the JSON object.\")\n  \ndef process_json(j, outSamples, outLines):\n\n    j[\"m_nSamples\"] = outSamples\n    j[\"m_nLines\"] = outLines\n    \n    multiply(j, \"m_iTransS\", 2.0)\n    multiply(j, \"m_iTransL\", 2.0)\n    multiply(j, \"m_detectorLineOrigin\", 2.0)\n    multiply(j, \"m_detectorSampleOrigin\", 2.0)\n\n    # These need to be divided by 2.0\n    multiply(j, \"m_intTimes\", 0.5)\n    multiply(j, \"m_gsd\", 0.5)\n    \ndef write_json(file, header, j):\n\n    # Convert the json to string\n    data = json.dumps(j, indent = 2, sort_keys=True)\n    \n    # Create the directory having the output file, if it does not exist\n    outDir = os.path.dirname(file)\n    if not os.path.exists(outDir):\n        os.makedirs(outDir)\n\n    # Write the header and the json data to the file\n    print(\"Writing: \", file)\n    with open(file, 'w') as f:\n        f.write(header + data + \"\\n\")\n\n# Check if we have at least one input file\nif len(sys.argv) != 5:\n    print(\"Usage: scale_linescan.py <in.json> <out.json> <out samples> <out lines>\")\n    sys.exit(1)\n\n# Load the first file\ninFile = sys.argv[1]\noutFile = sys.argv[2]\noutSamples = int(sys.argv[3])\noutLines = int(sys.argv[4])\n\nheader, j = read_json(inFile)\nprocess_json(j, outSamples, outLines)\nwrite_json(outFile, header, j)\n\n"
  },
  {
    "path": "src/asp/Rig/BasicAlgs.cc",
    "content": "/* Copyright (c) 2021, United States Government, as represented by the\n * Administrator of the National Aeronautics and Space Administration.\n *\n * All rights reserved.\n *\n * The \"ISAAC - Integrated System for Autonomous and Adaptive Caretaking\n * platform\" software is licensed under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n#include <asp/Rig/BasicAlgs.h>\n\n#include <glog/logging.h>\n#include <boost/filesystem.hpp>\n\n#include <fstream>\n#include <iostream>\n#include <iomanip>\n\nnamespace fs = boost::filesystem;\n\nnamespace rig {\n\n// Convert keypoints to Eigen format\nvoid vec2eigen(std::vector<std::pair<float, float>> const& vec,\n               Eigen::Matrix2Xd & mat) {\n\n  mat = Eigen::MatrixXd(2, vec.size());\n  for (size_t it = 0; it < vec.size(); it++) {\n    mat.col(it) = Eigen::Vector2d(vec[it].first, vec[it].second);\n  }\n}\n\n// Convert keypoints from Eigen format\nvoid eigen2vec(Eigen::Matrix2Xd const& mat,\n               std::vector<std::pair<float, float>> & vec) {\n\n  vec.clear();\n  vec.resize(mat.cols());\n  for (size_t it = 0; it < vec.size(); it++)\n    vec.at(it) = std::make_pair<float, float>(mat(0, it), mat(1, it));\n}\n\n// Read a vector of strings from a file, with spaces and newlines\n// acting as separators.  Store them in a set.\nvoid readList(std::string const& file, std::set<std::string> & list) {\n  list.clear();\n  std::ifstream fh(file);\n  std::string val;\n  while (fh >> val)\n    list.insert(val);\n  fh.close();\n}\n\n// Replace .<extension> with <suffix>  \nstd::string changeFileSuffix(std::string filename, std::string new_suffix) {\n  // Find the last '.' character in the filename\n  size_t last_dot = filename.find_last_of(\".\");\n  if (last_dot == std::string::npos) {\n    // No dot found, return original filename\n    return filename;\n  } else {\n    // Replace extension with new suffix\n    std::string new_filename = filename.substr(0, last_dot) + new_suffix;\n    return new_filename;\n  }\n}  \n\nstd::string print_vec(double a) {\n  char st[256];\n  snprintf(st, sizeof(st), \"%7.4f\", a);\n  return std::string(st);\n}\nstd::string print_vec(Eigen::Vector3d a) {\n  char st[256];\n  snprintf(st, sizeof(st), \"%7.4f %7.4f %7.4f\", a[0], a[1], a[2]);\n  return std::string(st);\n}\n\n}  // end namespace rig\n"
  },
  {
    "path": "src/asp/Rig/BasicAlgs.h",
    "content": "/* Copyright (c) 2017, United States Government, as represented by the\n * Administrator of the National Aeronautics and Space Administration.\n * \n * All rights reserved.\n * \n * The Astrobee platform is licensed under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n * \n *     http://www.apache.org/licenses/LICENSE-2.0\n * \n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n#ifndef ASP_RIG_BASIC_ALGS_H\n#define ASP_RIG_BASIC_ALGS_H\n\n// Some low-level algorithms\n\n#include <glog/logging.h>\n#include <Eigen/Geometry>\n\n#include <map>\n#include <algorithm>\n#include <set>\n#include <vector>\n\nnamespace rig {\n\n// Look up a map value and throw an error when not found\ntemplate<class A, class B>\nB mapVal(std::map<A, B> const& map, A const& a) {\n  auto it = map.find(a);\n  if (it == map.end())\n    LOG(FATAL) << \"Cannot look up expected map value.\\n\";\n\n  return it->second;\n}\n\n// Get a map value while being const-correct and also checking that the value exists.\ntemplate <class T>\nT getMapValue(std::vector<std::map<int, std::map<int, T>>> const& pid_cid_fid,\n              size_t pid, int cid, int fid) {\n  if (pid_cid_fid.size() <= pid)\n    LOG(FATAL) << \"Current pid is out of range.\\n\";\n\n  auto& cid_fid_map = pid_cid_fid[pid];  // alias\n  auto cid_it = cid_fid_map.find(cid);\n  if (cid_it == cid_fid_map.end()) LOG(FATAL) << \"Current cid it out of range.\\n\";\n\n  auto& fid_map = cid_it->second;  // alias\n  auto fid_it = fid_map.find(fid);\n  if (fid_it == fid_map.end()) LOG(FATAL) << \"Current fid is out of range.\\n\";\n\n  return fid_it->second;\n}\n\n// Set a map value while taking care that the place for it exists.\ntemplate <class T>\nvoid setMapValue(std::vector<std::map<int, std::map<int, T>>> & pid_cid_fid,\n                 size_t pid, int cid, int fid, int val) {\n  if (pid_cid_fid.size() <= pid)\n    LOG(FATAL) << \"Current pid is out of range.\\n\";\n\n  auto& cid_fid_map = pid_cid_fid[pid];  // alias\n  auto cid_it = cid_fid_map.find(cid);\n  if (cid_it == cid_fid_map.end()) LOG(FATAL) << \"Current cid it out of range.\\n\";\n\n  auto& fid_map = cid_it->second;  // alias\n  auto fid_it = fid_map.find(fid);\n  if (fid_it == fid_map.end()) LOG(FATAL) << \"Current fid is out of range.\\n\";\n\n  fid_it->second = val;\n}\n\n// Maximum value in a map\ntemplate<typename K, typename V>\nV maxMapVal(const std::map<K,V> &map) {\n  if (map.empty()) \n    LOG(FATAL) << \"Cannot find the maximum value in an empty map.\\n\";\n  \n  auto key = std::max_element(map.begin(), map.end(),\n                              [](std::pair<K,V> const &x, std::pair<K,V> const &y) {\n                                return x.second < y.second;\n                              });\n  return key->second;\n}\n\n// Convert keypoints to Eigen format\nvoid vec2eigen(std::vector<std::pair<float, float>> const& vec,\n               Eigen::Matrix2Xd & mat);\n\n// Convert keypoints from Eigen format\nvoid eigen2vec(Eigen::Matrix2Xd const& mat,\n               std::vector<std::pair<float, float>> & vec);\n\n// Read a vector of strings from a file, with spaces and newlines\n// acting as separators.  Store them in a set.\nvoid readList(std::string const& file, std::set<std::string> & list);\n\n// Replace .<extension> with <suffix>  \nstd::string changeFileSuffix(std::string filename, std::string new_suffix);\n\nstd::string print_vec(double a);\nstd::string print_vec(Eigen::Vector3d a);\n  \n}  // end namespace rig\n\n#endif  // ASP_RIG_BASIC_ALGS_H\n"
  },
  {
    "path": "src/asp/Rig/CMakeLists.txt",
    "content": "# Use wrapper function at this level to avoid code duplication\n\nadd_library_wrapper(AspRig \"${ASP_RIG_SRC_FILES}\" \"${ASP_RIG_TEST_FILES}\"\n    \"${ASP_RIG_LIB_DEPENDENCIES}\")\n\n#target_link_libraries(AspRig ${SOLVER_LIBRARIES})\n"
  },
  {
    "path": "src/asp/Rig/CameraImage.h",
    "content": "/* Copyright (c) 2021, United States Government, as represented by the\n * Administrator of the National Aeronautics and Space Administration.\n *\n * All rights reserved.\n *\n * The \"ISAAC - Integrated System for Autonomous and Adaptive Caretaking\n * platform\" software is licensed under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n#ifndef ASP_RIG_CAMERA_IMAGE_H\n#define ASP_RIG_CAMERA_IMAGE_H\n\n#include <opencv2/imgproc.hpp>\n#include <Eigen/Core>\n#include <Eigen/Geometry>\n\nnamespace rig {\n\n// A class to encompass all known information about a camera image\nstruct cameraImage {\n  // An index to look up the type of camera. This will equal the\n  // value ref_camera_type if and only if this is a reference\n  // camera.\n  int camera_type;\n\n  // The timestamp for this camera (in floating point seconds since epoch)\n  // measured by the clock/cpu which is particular to this camera.\n  double timestamp;\n\n  // The timestamp with an adjustment added to it to be in\n  // reference camera time\n  double ref_timestamp;\n\n  // The timestamp of the closest cloud for this image, measured\n  // with the same clock as the 'timestamp' value.\n  double cloud_timestamp;\n\n  // Indices to look up the reference cameras bracketing this camera\n  // in time in array ref_timestamps. These can have the same value\n  // for the reference camera and for the last camera if its time\n  // stamp is also the last ref cam timestamp, as then there's no more\n  // indices.  this is a reference camera.\n  int beg_ref_index;\n  int end_ref_index;\n\n  // The image for this camera, in grayscale\n  cv::Mat image;\n\n  // The corresponding depth cloud, for an image + depth camera.\n  // Will be empty and uninitialized for a camera lacking depth.\n  cv::Mat depth_cloud;\n\n  // These will be populated automatically if missing\n  std::string image_name, depth_name;\n};\n\n// A struct to collect together some attributes of an image or depth cloud\n// (stored as an image with 3 channels)\nstruct ImageMessage {\n  cv::Mat image;\n  double timestamp;\n  std::string name;\n  Eigen::Affine3d world_to_cam;\n};\n  \n}  // namespace rig\n\n#endif  // ASP_RIG_CAMERA_IMAGE_H\n"
  },
  {
    "path": "src/asp/Rig/Detector.cc",
    "content": "/* Copyright (c) 2017, United States Government, as represented by the\n * Administrator of the National Aeronautics and Space Administration.\n *\n * All rights reserved.\n *\n * The Astrobee platform is licensed under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n#include <asp/Rig/Detector.h>\n\n#include <opencv2/xfeatures2d.hpp>\n#include <gflags/gflags.h>\n#include <glog/logging.h>\n#include <Eigen/Core>\n\n#include <iostream>\n#include <vector>\n\n// Customize the feature detectors.\nDEFINE_int32(detection_retries, 5,\n             \"Number of attempts to acquire the desired number of features with the detector.\");\n// SURF detector\nDEFINE_int32(min_surf_features, 1000,\n             \"Minimum number of features to be computed using SURF.\");\nDEFINE_int32(max_surf_features, 5000,\n             \"Maximum number of features to be computed using SURF.\");\nDEFINE_double(min_surf_threshold, 1.1,\n              \"Minimum threshold for feature detection using SURF.\");\nDEFINE_double(default_surf_threshold, 10,\n              \"Default threshold for feature detection using SURF.\");\nDEFINE_double(max_surf_threshold, 1000,\n              \"Maximum threshold for feature detection using SURF.\");\n\nnamespace rig {\n\nDynamicDetector::DynamicDetector(int min_features, int max_features, int max_retries,\n                                 double min_thresh, double default_thresh, double max_thresh):\n    min_features_(min_features), max_features_(max_features), max_retries_(max_retries),\n  min_thresh_(min_thresh), default_thresh_(default_thresh), max_thresh_(max_thresh),\n  dynamic_thresh_(default_thresh) {}\n\nvoid DynamicDetector::GetDetectorParams(int & min_features, int & max_features,\n                                        int & max_retries,\n                                        double & min_thresh, double & default_thresh,\n                                        double & max_thresh) {\n  min_features = min_features_; max_features = max_features_; max_retries = max_retries_;\n  min_thresh = min_thresh_; default_thresh = default_thresh_; max_thresh = max_thresh_;\n}\n\nvoid DynamicDetector::Detect(const cv::Mat& image,\n                             std::vector<cv::KeyPoint>* keypoints,\n                             cv::Mat* keypoints_description) {\n\n  // Sometimes we want a placeholder detector for initialization. Yet\n  // that one cannot be used until it is configured.\n  if (default_thresh_ <= 0)\n    LOG(FATAL) << \"The detector parameters have not been set.\";\n\n  for (unsigned int i = 0; i < max_retries_; i++) {\n    keypoints->clear();\n    DetectImpl(image, keypoints);\n    if (keypoints->size() < min_features_)\n      TooFew();\n    else if (keypoints->size() > max_features_)\n      TooMany();\n    else\n      break;\n  }\n  ComputeImpl(image, keypoints, keypoints_description);\n}\n\nclass SurfDynamicDetector : public DynamicDetector {\n  public:\n  SurfDynamicDetector(int min_features, int max_features, int max_retries,\n                      double min_thresh, double default_thresh, double max_thresh)\n    : DynamicDetector(min_features, max_features, max_retries,\n                      min_thresh, default_thresh, max_thresh) {\n    surf_ = cv::xfeatures2d::SURF::create(dynamic_thresh_);\n  }\n\n  virtual void DetectImpl(const cv::Mat& image, std::vector<cv::KeyPoint>* keypoints) {\n    surf_->detect(image, *keypoints);\n  }\n  virtual void ComputeImpl(const cv::Mat& image, std::vector<cv::KeyPoint>* keypoints,\n                            cv::Mat* keypoints_description) {\n    surf_->compute(image, *keypoints, *keypoints_description);\n  }\n  virtual void TooMany(void) {\n    dynamic_thresh_ *= 1.1;\n    if (dynamic_thresh_ > max_thresh_)\n      dynamic_thresh_ = max_thresh_;\n    surf_->setHessianThreshold(static_cast<float>(dynamic_thresh_));\n  }\n  virtual void TooFew(void) {\n    dynamic_thresh_ *= 0.9;\n    if (dynamic_thresh_ < min_thresh_)\n      dynamic_thresh_ = min_thresh_;\n    surf_->setHessianThreshold(static_cast<float>(dynamic_thresh_));\n  }\n\n  private:\n  cv::Ptr<cv::xfeatures2d::SURF> surf_;\n};\n\nFeatureDetector::FeatureDetector(std::string const& detector_name,\n                                  int min_features, int max_features, int retries,\n                                  double min_thresh, double default_thresh, double max_thresh) {\n  detector_ = NULL;\n  Reset(detector_name, min_features, max_features, retries,\n        min_thresh, default_thresh, max_thresh);\n}\n\nvoid FeatureDetector::GetDetectorParams(int & min_features, int & max_features, int & max_retries,\n                                        double & min_thresh, double & default_thresh,\n                                        double & max_thresh) {\n  if (detector_ == NULL)\n    LOG(FATAL) << \"The detector was not set.\";\n  detector_->GetDetectorParams(min_features, max_features, max_retries,\n                                min_thresh, default_thresh, max_thresh);\n}\n\nFeatureDetector::~FeatureDetector(void) {\n  if (detector_ != NULL) {\n    delete detector_;\n    detector_ = NULL;\n  }\n}\n\nvoid FeatureDetector::Reset(std::string const& detector_name,\n                            int min_features, int max_features, int retries,\n                            double min_thresh, double default_thresh, double max_thresh) {\n  detector_name_ = detector_name;\n\n  if (detector_ != NULL) {\n    delete detector_;\n    detector_ = NULL;\n  }\n\n  // Populate the defaults\n  if (max_features <= 0) {\n    if (detector_name == \"SURF\") {\n      min_features   = FLAGS_min_surf_features;\n      max_features   = FLAGS_max_surf_features;\n      retries        = FLAGS_detection_retries;\n      min_thresh     = FLAGS_min_surf_threshold;\n      default_thresh = FLAGS_default_surf_threshold;\n      max_thresh     = FLAGS_max_surf_threshold;\n    } else {\n      LOG(FATAL) << \"Unimplemented feature detector: \" << detector_name;\n    }\n  }\n\n  if (detector_name == \"SURF\")\n    detector_ = new SurfDynamicDetector(min_features, max_features, retries,\n                                        min_thresh, default_thresh, max_thresh);\n  else\n    LOG(FATAL) << \"Unimplemented feature detector: \" << detector_name;\n}\n\nvoid FeatureDetector::Detect(const cv::Mat& image,\n                              std::vector<cv::KeyPoint>* keypoints,\n                              cv::Mat* keypoints_description) {\n  if (detector_ == NULL)\n    LOG(FATAL) << \"The detector was not initialized.\";\n\n  detector_->Detect(image, keypoints, keypoints_description);\n\n  // Normalize the image points relative to the center of the image\n  for (cv::KeyPoint& key : *keypoints) {\n    key.pt.x -= image.cols/2.0;\n    key.pt.y -= image.rows/2.0;\n  }\n}\n\n}  // end namespace rig\n"
  },
  {
    "path": "src/asp/Rig/Detector.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#ifndef ASP_RIG_DETECTOR_H\n#define ASP_RIG_DETECTOR_H\n\n#include <vw/InterestPoint/InterestPoint.h>\n\n#include <opencv2/features2d/features2d.hpp>\n#include <Eigen/Core>\n\n#include <vector>\n#include <string>\n#include <map>\n\nnamespace rig {\n  \ntypedef std::pair<std::vector<vw::ip::InterestPoint>, std::vector<vw::ip::InterestPoint>> MATCH_PAIR;\ntypedef std::map<std::pair<int, int>, rig::MATCH_PAIR> MATCH_MAP;\n\nclass DynamicDetector {\n  public:\n  DynamicDetector(int min_features, int max_features, int retries,\n                  double min_thresh, double default_thresh, double max_thresh);\n  virtual ~DynamicDetector(void) {}\n  void Detect(const cv::Mat& image,\n                      std::vector<cv::KeyPoint>* keypoints,\n                      cv::Mat* keypoints_description);\n  virtual void DetectImpl(const cv::Mat& image,\n                          std::vector<cv::KeyPoint>* keypoints) = 0;\n  virtual void ComputeImpl(const cv::Mat& image,\n                          std::vector<cv::KeyPoint>* keypoints,\n                          cv::Mat* keypoints_description) = 0;\n  virtual void TooFew(void) = 0;\n  virtual void TooMany(void) = 0;\n  void GetDetectorParams(int & min_features, int & max_features, int & max_retries,\n                          double & min_thresh, double & default_thresh, double & max_thresh);\n\n  protected:\n  unsigned int min_features_, max_features_, max_retries_;\n  double min_thresh_, default_thresh_, max_thresh_, dynamic_thresh_;\n};\n\nclass FeatureDetector {\n  private:\n  DynamicDetector* detector_;\n  std::string detector_name_;\n\n  // A feature detector cannot be copied, since it has a pointer\n  FeatureDetector(FeatureDetector &);\n  FeatureDetector& operator=(const FeatureDetector&);\n\n  public:\n  // Here on purpose invalid values are set, so the user explicitly sets them.\n  FeatureDetector(std::string const& detector_name = \"SURF\",\n                  int min_features = 0, int max_features = 0, int retries = 0,\n                  double min_thresh = 0, double default_thresh = 0, double max_thresh = 0);\n  ~FeatureDetector(void);\n\n  void Reset(std::string const& detector_name,\n                  int min_features = 0, int max_features = 0, int retries = 0,\n                  double min_thresh = 0, double default_thresh = 0, double max_thresh = 0);\n\n  void Detect(const cv::Mat& image, std::vector<cv::KeyPoint>* keypoints,\n              cv::Mat* keypoints_description);\n\n  std::string GetDetectorName() const {return detector_name_;}\n\n  void GetDetectorParams(int & min_features, int & max_features, int & max_retries,\n                          double & min_thresh, double & default_thresh, double & max_thresh);\n\n  friend bool operator== (FeatureDetector const& A, FeatureDetector const& B) {\n    return (A.detector_name_ == B.detector_name_);\n  }\n};\n\n}  // namespace rig\n\n#endif  // ASP_RIG_DETECTOR_H\n\n"
  },
  {
    "path": "src/asp/Rig/ImageLookup.cc",
    "content": "/* Copyright (c) 2021-2026, United States Government, as represented by the\n * Administrator of the National Aeronautics and Space Administration.\n *\n * All rights reserved.\n *\n * The \"ISAAC - Integrated System for Autonomous and Adaptive Caretaking\n * platform\" software is licensed under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n#include <asp/Rig/ImageLookup.h>\n#include <asp/Rig/CameraImage.h>\n#include <asp/Rig/RigConfig.h>\n#include <asp/Rig/BasicAlgs.h>\n#include <asp/Rig/RigCameraParams.h>\n#include <asp/Rig/InterpolationUtils.h>\n#include <asp/Rig/TransformUtils.h>\n#include <asp/Core/Nvm.h>\n#include <asp/Rig/RigImageIO.h>\n\n#include <vw/Core/Log.h>\n#include <glog/logging.h>\n#include <boost/filesystem.hpp>\n\n#include <iostream>\n#include <fstream>\n#include <iomanip>\n\nnamespace fs = boost::filesystem;\n\nnamespace rig {\n  \n// Sort by timestamps adjusted to be relative to the ref camera clock.\n// Additionally sort by image name, so that the order is deterministic.\nbool timestampLess(cameraImage i, cameraImage j) {\n  return (i.ref_timestamp < j.ref_timestamp) || \n    (i.ref_timestamp == j.ref_timestamp && i.image_name < j.image_name);\n}\n\n// Find an image at the given timestamp or right after it. We assume\n// that during repeated calls to this function we always travel\n// forward in time, and we keep track of where we are in the bag using\n// the variable start_pos that we update as we go.\nbool lookupImage(// Inputs\n                 double desired_time, MsgMap const& msgs,\n                 // Outputs\n                 cv::Mat& image, std::string & image_name,\n                 MsgMapIter& start_pos, double& found_time) {\n  // Initialize the outputs. Note that start_pos is passed in from outside.\n  image = cv::Mat();\n  image_name = \"\";\n  found_time = -1.0;\n\n   int num_msgs = msgs.size();\n   double prev_image_time = -1.0;\n\n   for (auto local_pos = start_pos; local_pos != msgs.end(); local_pos++) {\n     start_pos = local_pos;  // save this for exporting\n\n     rig::ImageMessage const& imgMsg = local_pos->second; // alias\n     found_time = imgMsg.timestamp;\n\n     // Sanity check: We must always travel forward in time\n     if (found_time < prev_image_time) {\n       LOG(FATAL) << \"Found images not in chronological order.\\n\"\n                  << std::fixed << std::setprecision(17)\n                  << \"Times in wrong order: \" << prev_image_time << ' ' << found_time << \".\\n\";\n       continue;\n     }\n\n     prev_image_time = found_time;\n\n     if (found_time >= desired_time) {\n       // Found the desired data. Do a deep copy, to not depend on the\n       // original structure.\n       imgMsg.image.copyTo(image);\n       image_name = imgMsg.name;\n       return true;\n     }\n   }\n  return false;\n}\n\n// A function to extract poses, filenames, and timestamps from read data.\nvoid lookupFilesPoses(// Inputs\n                      rig::RigSet const& R,\n                      std::vector<std::map<double, rig::ImageMessage>> const& image_maps,\n                      std::vector<std::map<double, rig::ImageMessage>> const& depth_maps,\n                      // Outputs\n                      std::vector<double>& ref_timestamps,\n                      std::vector<Eigen::Affine3d> & world_to_ref) {\n\n  // Sanity checks\n  if (image_maps.size() != depth_maps.size() || image_maps.size() != R.cam_names.size())\n    LOG(FATAL) << \"Bookkeeping failure in lookupFilesPoses()\\n\";\n  \n  // Wipe the outputs\n  ref_timestamps.clear();\n  world_to_ref.clear();\n\n  int num_cams = R.cam_names.size();\n  for (size_t cam_type = 0; cam_type < image_maps.size(); cam_type++) {\n\n    auto const& image_map = image_maps[cam_type];\n\n    for (auto it = image_map.begin(); it != image_map.end(); it++) {\n      // Collect the ref cam timestamps, world_to_ref, in chronological order\n      if (R.isRefSensor(R.cam_names[cam_type])) {\n        world_to_ref.push_back(it->second.world_to_cam);\n        ref_timestamps.push_back(it->second.timestamp);\n      }\n    }\n  }\n}\n\n// Look up each ref cam image by timestamp, with the rig assumption. In between\n// any two ref cam timestamps, which are no further from each other than the\n// bracket length, look up one or more images of each of the other camera types\n// in the rig. If more than one choice, and bracket_single_image is true, choose\n// the one closest to the midpoint of the two bracketing ref cam timestamps.\n// This way there's more wiggle room later if one attempts to modify the\n// timestamp offset.\n// TODO(oalexan1): This is messy code but was developed with much testing,\n// and it works. If it is to be cleaned up, it should be done with care.\n// Especially the cases when the other cameras have exactly the same timestamp\n// as the ref cam are tricky, and it gets even trickier at the last timestamp.\n// Also need to consider the case when timestamp_offsets_max_change is true.\nvoid lookupImagesAndBrackets(// Inputs\n                             double bracket_len,\n                             double timestamp_offsets_max_change,\n                             bool bracket_single_image,\n                             rig::RigSet   const& R,\n                             std::vector<double> const& ref_timestamps,\n                             std::vector<MsgMap> const& image_data,\n                             std::vector<MsgMap> const& depth_data,\n                             // Outputs\n                             std::vector<rig::cameraImage>& cams,\n                             std::vector<double>& min_timestamp_offset,\n                             std::vector<double>& max_timestamp_offset) {\n\n  vw::vw_out() << \"Looking up the images and bracketing the timestamps.\" << std::endl;\n\n  int num_ref_cams = ref_timestamps.size();\n  int num_cam_types = R.cam_names.size();\n\n  // Sanity checks\n  if (R.cam_names.size() != image_data.size()) \n    LOG(FATAL) << \"Expecting as many sensors as image datasets for them.\\n\";\n  if (R.cam_names.size() != depth_data.size()) \n    LOG(FATAL) << \"Expecting as many sensors as depth datasets for them.\\n\";\n    \n  // Initialize the outputs\n  cams.clear();\n  min_timestamp_offset.resize(num_cam_types, -1.0e+100);\n  max_timestamp_offset.resize(num_cam_types,  1.0e+100);\n\n  // A lot of care is needed with positions. This remembers how we travel in time\n  // for each camera type so we have fewer messages to search.\n  // But if a mistake is done below it will mess up this bookkeeping.\n  std::vector<MsgMapIter> image_start_positions(num_cam_types);\n  std::vector<MsgMapIter> depth_start_positions(num_cam_types);\n  for (int cam_it = 0; cam_it < num_cam_types; cam_it++) {\n    image_start_positions[cam_it] = image_data[cam_it].begin();\n    depth_start_positions[cam_it] = depth_data[cam_it].begin();\n  }\n\n  double big = std::numeric_limits<double>::max();\n  \n  // Populate the data for each camera image\n  for (int beg_ref_it = 0; beg_ref_it < num_ref_cams; beg_ref_it++) {\n\n    // For when we have last ref timestamp and last other cam timestamp and they are equal\n    int end_ref_it = beg_ref_it + 1;\n    bool last_timestamp = (end_ref_it == num_ref_cams);\n    if (last_timestamp) end_ref_it = beg_ref_it;\n\n    for (int cam_type = 0; cam_type < num_cam_types; cam_type++) {\n      std::vector<rig::cameraImage> local_cams;\n      bool success = false;\n\n      // The ref cam does not need bracketing, but the others need to be bracketed\n      // by ref cam, so there are two cases to consider.\n\n      if (R.isRefSensor(R.cam_names[cam_type])) {\n        // Case of ref sensor\n        rig::cameraImage cam;\n        cam.camera_type   = cam_type;\n        cam.timestamp     = ref_timestamps[beg_ref_it];\n        cam.ref_timestamp = cam.timestamp;  // the time offset is 0 between ref and itself\n        cam.beg_ref_index = beg_ref_it;\n        cam.end_ref_index = beg_ref_it;  // same index for beg and end\n\n        // Start looking up the image timestamp from this position. Some care\n        // is needed here as we advance in time in image_start_positions[cam_type].\n        double found_time = -1.0;\n        // This has to succeed since this timestamp came from an existing image\n        bool have_lookup =  \n          rig::lookupImage(cam.timestamp, image_data[cam_type],\n                           // Outputs\n                           cam.image, cam.image_name, \n                           image_start_positions[cam_type], // this will move forward\n                           found_time);\n        \n        if (!have_lookup)\n          LOG(FATAL) << std::fixed << std::setprecision(17)\n                     << \"Cannot look up camera at time \" << cam.timestamp << \".\\n\";\n\n        // The exact time is expected\n        if (found_time != cam.timestamp)\n          LOG(FATAL) << std::fixed << std::setprecision(17)\n                     << \"Cannot look up camera at time \" << cam.timestamp << \".\\n\";\n\n        success = true;\n        local_cams.push_back(cam);\n\n      } else {\n        // Case of not ref sensor\n        // Need care here since sometimes ref_cam and current cam can have\n        // exactly the same timestamp, so then bracketing should succeed.\n\n        // Convert the bracketing timestamps to current cam's time\n        double ref_to_cam_offset = R.ref_to_cam_timestamp_offsets[cam_type];\n        double beg_timestamp     = ref_timestamps[beg_ref_it] + ref_to_cam_offset;\n        double end_timestamp     = ref_timestamps[end_ref_it] + ref_to_cam_offset;\n        if (end_timestamp == beg_timestamp && last_timestamp)  // necessary adjustment\n          end_timestamp = std::nextafter(end_timestamp, big); \n\n        if (end_timestamp <= beg_timestamp)\n          LOG(FATAL) << \"Ref timestamps must be in strictly increasing order.\\n\";\n\n        // Find the image timestamp closest to the midpoint of the brackets. This will give\n        // more room to vary the timestamp later.\n        double mid_timestamp = (beg_timestamp + end_timestamp)/2.0;\n\n        // Search forward in time from image_start_positions[cam_type].\n        // We will update that too later. One has to be very careful\n        // with it so it does not go too far forward in time\n        // so that at the next iteration we are passed what we\n        // search for.\n        MsgMapIter start_pos = image_start_positions[cam_type]; // care here\n        double curr_timestamp = beg_timestamp;                  // start here\n        double found_time = -1.0;\n        std::vector<double> found_times;\n        std::vector<cv::Mat> found_images;\n        std::vector<std::string> found_image_names;\n        while (1) {\n          \n          // Stop when we are past the end of the bracket\n          if (found_time > end_timestamp) break;\n\n          cv::Mat image;\n          std::string image_name;\n          bool have_lookup =\n            rig::lookupImage(curr_timestamp, image_data[cam_type],\n                             // Outputs\n                             image, image_name,\n                             // care here, start_pos moves forward\n                             start_pos,\n                             // found_time will be updated now\n                             found_time);\n\n          // Need not succeed, but then there's no need to go on as we\n          // are at the end\n          if (!have_lookup)\n            break; \n\n          // Check if the found time is in the bracket. Note how we allow\n          // found_time == beg_timestamp if there's no other choice.\n          bool is_in_bracket = (beg_timestamp <= found_time && found_time < end_timestamp);\n          double curr_dist = std::abs(found_time - mid_timestamp);\n\n          // Must respect the bracket length, unless best time equals beg time,\n          // as then the bracketing is not going to be used.\n          bool fail_bracket_len = ((found_time > beg_timestamp && \n                                    end_timestamp - beg_timestamp > bracket_len));\n\n          if (is_in_bracket && !fail_bracket_len) {\n            // Update the start position for the future only if this is a good\n            // solution. Otherwise we may have moved too far.\n            image_start_positions[cam_type] = start_pos;\n            \n            // Record the found image\n            found_images.push_back(cv::Mat());\n            image.copyTo(found_images.back());\n            found_times.push_back(found_time);\n            found_image_names.push_back(image_name);\n          }\n\n          // Go forward in time. We count on the fact that\n          // lookupImage() looks forward from given guess.\n          // Careful here with the api of std::nextafter().\n          curr_timestamp = std::nextafter(found_time, big);\n        } // end while loop\n        \n        if (bracket_single_image) {\n          // Must pick only one image, which is closest to the midpoint \n          cv::Mat best_image;\n          std::string best_image_name;\n          double best_dist = 1.0e+100;\n          double best_time = -1.0;\n          best_dist = 1.0e+100;\n          // loop over found images to find the closest one to the midpoint. Save \n          // that as best image, and update best_time and best_image_name, and best_dist.\n          for (size_t i = 0; i < found_times.size(); i++) {\n            double curr_dist = std::abs(found_times[i] - mid_timestamp);\n            if (curr_dist < best_dist) {\n              best_dist = curr_dist;\n              best_time = found_times[i];\n              found_images[i].copyTo(best_image);\n              best_image_name = found_image_names[i];\n            }\n          }\n\n          if (best_time < 0.0) continue;  // bracketing failed\n          \n          // Make the vector of found images contain only the best image\n          found_images.resize(1);\n          found_times.resize(1);\n          found_image_names.resize(1);\n          best_image.copyTo(found_images[0]);\n          found_times[0] = best_time;\n          found_image_names[0] = best_image_name;\n        }\n\n        // Iterate ove found_times and add to local_cams\n        for (size_t i = 0; i < found_times.size(); i++) {\n          rig::cameraImage cam;\n          cam.camera_type   = cam_type;\n          cam.timestamp     = found_times[i];\n          cam.ref_timestamp = found_times[i] - ref_to_cam_offset;\n          cam.beg_ref_index = beg_ref_it;\n          cam.end_ref_index = end_ref_it;\n          found_images[i].copyTo(cam.image);\n          cam.image_name = found_image_names[i];\n          local_cams.push_back(cam);\n        }\n          \n        success = (local_cams.size() > 0);\n      } // end case of not ref sensor\n\n      if (!success) continue;\n      \n      // Iterate over the local_cams and update the timestamp offset bounds\n      for (size_t i = 0; i < local_cams.size(); i++) {\n        auto & cam = local_cams[i];\n\n        if (!R.isRefSensor(R.cam_names[cam_type])) { // Not a ref sensor\n          double ref_to_cam_offset = R.ref_to_cam_timestamp_offsets[cam_type];\n\n          // Assuming the option --bracket_single_image is used, \n          // cam.timestamp was chosen as centrally as possible so that\n          // ref_timestamps[beg_ref_it] + ref_to_cam_offset <= cam.timestamp\n          // and\n          // cam.timestamp <= ref_timestamps[end_ref_it] + ref_to_cam_offset\n          // Find the range of potential future values of ref_to_cam_offset so that\n          // cam.timestamp still respects these bounds.\n          min_timestamp_offset[cam_type]\n            = std::max(min_timestamp_offset[cam_type],\n                      cam.timestamp - ref_timestamps[end_ref_it]);\n          max_timestamp_offset[cam_type]\n            = std::min(max_timestamp_offset[cam_type],\n                      cam.timestamp - ref_timestamps[beg_ref_it]);\n        }\n\n        // Look up the closest depth in time (either before or after cam.timestamp)\n        // This need not succeed.\n        cam.cloud_timestamp = -1.0;  // will change\n        if (!depth_data.empty()) \n          rig::lookupImage(cam.timestamp,  // start looking from this time forward\n                           depth_data[cam_type],\n                           // Outputs\n                           cam.depth_cloud, cam.depth_name, \n                           depth_start_positions[cam_type],  // this will move forward\n                           cam.cloud_timestamp);             // found time\n        \n        cams.push_back(cam);\n      } // end loop over local_cams\n    }  // end loop over camera types\n  }    // end loop over ref images\n\n  // Adjust for timestamp_offsets_max_change. Printing the bounds is useful if\n  // the timestamps can be allowed to change. Turn off printing this for now, as\n  // it is rather confusing. \n  // vw::vw_out() << \"If optimizing the timestamp offset, its bounds must be, per sensor:\\n\";\n  for (int cam_type = 0; cam_type < num_cam_types; cam_type++) {\n    if (R.isRefSensor(R.cam_names[cam_type]))\n      continue;  // bounds don't make sense here\n    min_timestamp_offset[cam_type] = std::max(min_timestamp_offset[cam_type],\n                                              R.ref_to_cam_timestamp_offsets[cam_type]\n                                              - timestamp_offsets_max_change);\n    max_timestamp_offset[cam_type] = std::min(max_timestamp_offset[cam_type],\n                                              R.ref_to_cam_timestamp_offsets[cam_type]\n                                              + timestamp_offsets_max_change);\n    // Tighten the range a bit to ensure we don't exceed things when we add and\n    // subtract timestamps later. Note that timestamps are measured in seconds\n    // and fractions of a second since epoch and can be quite large so precision\n    // loss can easily happen.\n    double delta = (max_timestamp_offset[cam_type] - min_timestamp_offset[cam_type]);\n    delta = std::max(std::min(delta/10.0, 1.0e-5), 0.0);\n    min_timestamp_offset[cam_type] += delta;\n    max_timestamp_offset[cam_type] -= delta;\n    // Print the timestamp offset allowed ranges\n    // vw::vw_out() << std::setprecision(8) << R.cam_names[cam_type]\n    //           << \": [\" << min_timestamp_offset[cam_type]\n    //           << \", \" << max_timestamp_offset[cam_type] << \"]\\n\";\n  }\n\n}\n\n// Assuming that the rig constraint is not used, initialize the 'cams' structure\n// by copying each image and its other data in that structure as expected\n// by later code. See also lookupImagesAndBrackets() when some selection based\n// on bracketing takes place.\nvoid lookupImagesNoBrackets(// Inputs\n                            rig::RigSet const& R,\n                            std::vector<MsgMap> const& image_data,\n                            std::vector<MsgMap> const& depth_data,\n                            // Outputs\n                            std::vector<rig::cameraImage>& cams,\n                            std::vector<double>& min_timestamp_offset,\n                            std::vector<double>& max_timestamp_offset) {\n\n  vw::vw_out() << \"Looking up the images.\" << std::endl;\n  int num_cam_types = R.cam_names.size();\n  \n  // Initialize the outputs\n  cams.clear();\n  min_timestamp_offset.resize(num_cam_types, -1.0e+100);\n  max_timestamp_offset.resize(num_cam_types,  1.0e+100);\n\n  // A lot of care is needed with positions. This remembers how we travel in time\n  // for each camera type so we have fewer messages to search.\n  // But if a mistake is done below it will mess up this bookkeeping.\n  std::vector<MsgMapIter> image_start_positions(num_cam_types);\n  std::vector<MsgMapIter> depth_start_positions(num_cam_types);\n  for (int cam_it = 0; cam_it < num_cam_types; cam_it++) {\n    image_start_positions[cam_it] = image_data[cam_it].begin();\n    depth_start_positions[cam_it] = depth_data[cam_it].begin();\n  }\n\n  // Populate the data for each camera image\n  for (int cam_type = 0; cam_type < num_cam_types; cam_type++) {\n\n    int cam_it = -1;\n    for (auto map_it = image_data[cam_type].begin(); map_it != image_data[cam_type].end();\n         map_it++) {\n      cam_it++;\n      \n      rig::cameraImage cam;\n      cam.camera_type   = cam_type;\n      cam.timestamp     = (map_it->second).timestamp;\n      cam.ref_timestamp = cam.timestamp; // no rig, so no timestamp offset\n      // These two values below should not be needed with no rig\n      cam.beg_ref_index = cam_it;\n      cam.end_ref_index = cam_it;\n\n      // Start looking up the image timestamp from this position. Some care\n      // is needed here as we advance in time in image_start_positions[cam_type].\n      double found_time = -1.0;\n      // This has to succeed since this timestamp originally came from an existing image\n      bool have_lookup =  \n        rig::lookupImage(cam.timestamp, image_data[cam_type],\n                         // Outputs\n                         cam.image, cam.image_name, \n                         image_start_positions[cam_type],  // this will move forward\n                         found_time);\n      if (!have_lookup)\n        LOG(FATAL) << std::fixed << std::setprecision(17)\n                   << \"Cannot look up camera at time \" << cam.timestamp << \".\\n\";\n\n      // The exact time is expected\n      if (found_time != cam.timestamp)\n        LOG(FATAL) << std::fixed << std::setprecision(17)\n                   << \"Cannot look up camera at time \" << cam.timestamp << \".\\n\";\n      \n      // Look up the closest cloud in time (either before or after cam.timestamp)\n      // This need not succeed.\n      cam.cloud_timestamp = -1.0;  // will change\n      if (!depth_data.empty()) \n        rig::lookupImage(cam.timestamp,  // start looking from this time forward\n                               depth_data[cam_type],\n                               // Outputs\n                               cam.depth_cloud, cam.depth_name, \n                               depth_start_positions[cam_type],  // this will move forward\n                               cam.cloud_timestamp);             // found time\n\n      // Accept this camera\n      cams.push_back(cam);\n    }  // end loop over camera types\n  }    // end loop over ref images\n\n  return;\n}\n\n// Look up images, with or without the rig constraint. See individual functions\n// below for more details.\nvoid lookupImagesOneRig(// Inputs\n                        bool no_rig, double bracket_len,\n                        double timestamp_offsets_max_change,\n                        bool bracket_single_image,\n                        rig::RigSet const& R,\n                        std::vector<MsgMap> const& image_maps,\n                        std::vector<MsgMap> const& depth_maps,\n                        // Outputs\n                        std::vector<double>                 & ref_timestamps,\n                        std::vector<Eigen::Affine3d>        & world_to_ref,\n                        std::vector<rig::cameraImage> & cams,\n                        std::vector<Eigen::Affine3d>        & world_to_cam,\n                        std::vector<double>                 & min_timestamp_offset,\n                        std::vector<double>                 & max_timestamp_offset) {\n  \n  rig::lookupFilesPoses(// Inputs\n                        R, image_maps, depth_maps,\n                        // Outputs\n                        ref_timestamps, world_to_ref);\n  \n  if (!no_rig) \n    lookupImagesAndBrackets(// Inputs\n                            bracket_len,  \n                            timestamp_offsets_max_change,  \n                            bracket_single_image,\n                            R, ref_timestamps,  image_maps, depth_maps,  \n                            // Outputs\n                            cams, min_timestamp_offset, max_timestamp_offset);\n  else\n    lookupImagesNoBrackets(// Inputs\n                           R, image_maps, depth_maps,  \n                           // Outputs\n                           cams, min_timestamp_offset, max_timestamp_offset);\n  \n  // See how many timestamps we have for each camera\n  std::map<int, int> num_images;\n  int num_cam_types = R.cam_names.size();\n  for (int cam_type_it = 0; cam_type_it < num_cam_types; cam_type_it++)\n    num_images[cam_type_it] = 0;\n  for (size_t cam_it = 0; cam_it < cams.size(); cam_it++)\n    num_images[cams[cam_it].camera_type]++;\n  bool is_good = true;\n  for (int cam_type_it = 0; cam_type_it < num_cam_types; cam_type_it++) {\n    vw::vw_out() << \"Number of images for sensor: \" << R.cam_names[cam_type_it] << \": \"\n              << num_images[cam_type_it] << std::endl;\n\n    if (num_images[cam_type_it] == 0)\n      is_good = false;\n  }\n  if (!is_good)\n    vw::vw_out(vw::WarningMessage) << \"Could not find images for all sensors.\\n\";\n\n  // The images may need to be resized to be the same\n  // size as in the calibration file. Sometimes the full-res images\n  // can be so blurry that interest point matching fails, hence the\n  // resizing.\n  for (size_t it = 0; it < cams.size(); it++)\n    rig::adjustImageSize(R.cam_params[cams[it].camera_type], cams[it].image);\n\n  // Sort by the timestamp in reference camera time. This is essential\n  // for matching each image to other images close in time. Note\n  // that this does not affect the book-keeping of beg_ref_index\n  // and end_ref_it in this vector because those indices point to\n  // world_to_ref and ref_timestamp, which do not change.\n  // Note that this happens for each rig. So, different rigs\n  // have the ref timestamps individually sorted, and later\n  // these will be concatenated.\n  std::sort(cams.begin(), cams.end(), rig::timestampLess);\n\n  // Parse the transform from the world to each cam, which were known\n  // on input. Later, if use_initial_rig_transform is specified,\n  // these will be computed based on the rig.  Since\n  // image_maps[cam_type] is sorted chronologically, travel in time\n  // along at as we move along the cams array. Use the two arrays\n  // below to remember where we left off.\n  // TODO(oalexan1): This is fragile. It relies on cams being sorted by time.\n  // Make the cams array have a world_to_cam entry and remove the loop below.\n  world_to_cam.resize(cams.size());\n  std::vector<MsgMapIter> beg_pos(num_cam_types); \n  std::vector<MsgMapIter> end_pos(num_cam_types); \n  for (int cam_type = 0; cam_type < num_cam_types; cam_type++) {\n    beg_pos[cam_type] = image_maps[cam_type].begin();\n    end_pos[cam_type] = image_maps[cam_type].end();\n  }\n  for (size_t cam_it = 0; cam_it < cams.size(); cam_it++) {\n    int cam_type = cams[cam_it].camera_type;\n    for (auto pos = beg_pos[cam_type]; pos != end_pos[cam_type]; pos++) {\n      if (cams[cam_it].timestamp == pos->first) {\n        world_to_cam[cam_it] = (pos->second).world_to_cam;\n        beg_pos[cam_type] = pos;  // save for next time\n        break;\n      }\n    }\n  }  \n  return; \n}\n\n// Look up images for a set of rigs. This requires looking up images for individual rigs,\n// then concatenating the results and adjusting the book-keeping.\nvoid lookupImages(// Inputs\n                  bool no_rig, double bracket_len,\n                  double timestamp_offsets_max_change,\n                  bool bracket_single_image,\n                  rig::RigSet const& R,\n                  std::vector<MsgMap> const& image_maps,\n                  std::vector<MsgMap> const& depth_maps,\n                  // Outputs\n                  std::vector<double>                 & ref_timestamps,\n                  std::vector<Eigen::Affine3d>        & world_to_ref,\n                  std::vector<rig::cameraImage> & cams,\n                  std::vector<Eigen::Affine3d>        & world_to_cam,\n                  std::vector<double>                 & min_timestamp_offset,\n                  std::vector<double>                 & max_timestamp_offset) {\n\n  // Wipe the outputs\n  ref_timestamps.clear();\n  world_to_ref.clear();\n  cams.clear();\n  world_to_cam.clear();\n  min_timestamp_offset.clear();\n  max_timestamp_offset.clear();\n\n  for (size_t rig_id = 0; rig_id < R.cam_set.size(); rig_id++) {\n\n    // Create a single rig\n    rig::RigSet sub_rig = R.subRig(rig_id);\n\n    // Prepare the inputs for the subrig\n    std::vector<MsgMap> sub_image_maps;\n    std::vector<MsgMap> sub_depth_maps;\n    for (size_t sub_it = 0; sub_it < sub_rig.cam_names.size(); sub_it++) {\n      std::string sensor_name = sub_rig.cam_names[sub_it];\n      int rig_set_it = R.sensorIndex(sensor_name); // index in the larger rig\n      sub_image_maps.push_back(image_maps[rig_set_it]);\n      sub_depth_maps.push_back(depth_maps[rig_set_it]);\n    }\n\n    std::vector<double>                 sub_ref_timestamps;\n    std::vector<Eigen::Affine3d>        sub_world_to_ref;\n    std::vector<rig::cameraImage> sub_cams;\n    std::vector<Eigen::Affine3d>        sub_world_to_cam;\n    std::vector<double>                 sub_min_timestamp_offset;\n    std::vector<double>                 sub_max_timestamp_offset;\n\n    // Do the work for the subrig\n    lookupImagesOneRig(// Inputs\n                       no_rig, bracket_len, timestamp_offsets_max_change, \n                       bracket_single_image,\n                       sub_rig,  \n                       sub_image_maps, sub_depth_maps,  \n                       // Outputs\n                       sub_ref_timestamps, sub_world_to_ref, sub_cams,  \n                       sub_world_to_cam, sub_min_timestamp_offset, sub_max_timestamp_offset);\n\n    // Save the endpoints for ref timestamps and all cams, before concatenation\n    size_t prev_ref_end = ref_timestamps.size();\n    size_t prev_end = cams.size();\n\n    // Append the answers\n    ref_timestamps.insert(ref_timestamps.end(), sub_ref_timestamps.begin(),\n                          sub_ref_timestamps.end());\n    world_to_ref.insert(world_to_ref.end(), sub_world_to_ref.begin(), sub_world_to_ref.end());\n    cams.insert(cams.end(), sub_cams.begin(), sub_cams.end());\n    world_to_cam.insert(world_to_cam.end(), sub_world_to_cam.begin(), sub_world_to_cam.end());\n    min_timestamp_offset.insert(min_timestamp_offset.end(), sub_min_timestamp_offset.begin(),\n                                sub_min_timestamp_offset.end());\n    max_timestamp_offset.insert(max_timestamp_offset.end(), sub_max_timestamp_offset.begin(),\n                                sub_max_timestamp_offset.end());\n\n    // Update the bookkeeping in 'cams'\n    for (size_t cam_it = prev_end; cam_it < cams.size(); cam_it++) {\n\n      // Find the current sensor index in the larger rig set\n      int subrig_sensor_index = cams[cam_it].camera_type;\n      std::string subrig_sensor = sub_rig.cam_names[subrig_sensor_index];\n      int rig_sensor_index = R.sensorIndex(subrig_sensor);\n      cams[cam_it].camera_type = rig_sensor_index;\n\n      // Update the pointers to indices in ref_timestamps\n      cams[cam_it].beg_ref_index += prev_ref_end;     \n      cams[cam_it].end_ref_index += prev_ref_end;\n    }\n  }\n\n  return;\n}\n\n// Find pointers to the camera and reference images that bracket the\n// camera image. Great care is needed here. Two cases are considered,\n// if there is a rig or not. If no_rig is true, then the reference images are\n// the same as the camera images. \nvoid calcBracketing(// Inputs\n                  bool no_rig, int cid, int cam_type,\n                  std::vector<rig::cameraImage> const& cams,\n                  std::vector<double> const& ref_timestamps,\n                  rig::RigSet   const& R,\n                  // Will not be changed but need access\n                  std::vector<double> & world_to_cam_vec,\n                  std::vector<double> & world_to_ref_vec,\n                  std::vector<double> & ref_to_cam_vec,\n                  std::vector<double> & ref_identity_vec,\n                  std::vector<double> & right_identity_vec,\n                  // Outputs\n                  double* & beg_cam_ptr, \n                  double* & end_cam_ptr, \n                  double* & ref_to_cam_ptr,\n                  double  & beg_ref_timestamp, \n                  double  & end_ref_timestamp,\n                  double  & cam_timestamp) {\n\n  if (!no_rig) {\n    // Model the rig, use timestamps\n    int beg_ref_index = cams[cid].beg_ref_index;\n    int end_ref_index = cams[cid].end_ref_index;\n\n    // Left bracketing ref cam for a given cam. For a ref cam, this is itself.\n    beg_cam_ptr = &world_to_ref_vec[rig::NUM_RIGID_PARAMS * beg_ref_index];\n\n    // Right bracketing camera. When the cam is the ref type,\n    // or when this cam is the last one and has exactly\n    // same timestamp as the ref cam, this is not used.\n    if (R.isRefSensor(R.cam_names[cam_type]) || beg_ref_index == end_ref_index)\n      end_cam_ptr = &right_identity_vec[0];\n    else\n      end_cam_ptr = &world_to_ref_vec[rig::NUM_RIGID_PARAMS * end_ref_index];\n\n    // The beg and end timestamps will be the same only for the\n    // ref cam or for last non-ref cam whose timestamp is same\n    // as ref cam timestamp which is also last.\n    beg_ref_timestamp = ref_timestamps[beg_ref_index];\n    end_ref_timestamp = ref_timestamps[end_ref_index];\n    cam_timestamp = cams[cid].timestamp;  // uses current camera's clock\n\n  } else {\n    // No rig. Then, beg_cam_ptr is just current camera, not the\n    // ref bracketing cam, end_cam_ptr is the identity. The timestamps\n    // will be the same, so the camera brackets itself.\n    cam_timestamp     = cams[cid].timestamp;\n    beg_ref_timestamp = cam_timestamp;\n    end_ref_timestamp = cam_timestamp;\n\n    // Note how we use world_to_cam_vec and not world_to_ref_vec for \n    // the beg cam. The end cam is unused.\n    beg_cam_ptr = &world_to_cam_vec[rig::NUM_RIGID_PARAMS * cid];\n    end_cam_ptr = &right_identity_vec[0];\n  }\n\n  // Transform from reference camera to given camera. Won't be used when\n  // FLAGS_no_rig is true or when the cam is of ref type.\n  if (no_rig || R.isRefSensor(R.cam_names[cam_type]))\n    ref_to_cam_ptr = &ref_identity_vec[0];\n  else\n    ref_to_cam_ptr = &ref_to_cam_vec[rig::NUM_RIGID_PARAMS * cam_type];\n\n  return;\n}\n  \n}  // end namespace rig\n"
  },
  {
    "path": "src/asp/Rig/ImageLookup.h",
    "content": "/* Copyright (c) 2021, United States Government, as represented by the\n * Administrator of the National Aeronautics and Space Administration.\n *\n * All rights reserved.\n *\n * The \"ISAAC - Integrated System for Autonomous and Adaptive Caretaking\n * platform\" software is licensed under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n#ifndef ASP_RIG_IMAGE_LOOKUP_H\n#define ASP_RIG_IMAGE_LOOKUP_H\n\n#include <opencv2/calib3d/calib3d.hpp>\n#include <opencv2/imgproc.hpp>\n#include <opencv2/imgcodecs.hpp>\n#include <opencv2/highgui.hpp>\n#include <opencv2/core/utility.hpp>\n\n#include <Eigen/Core>\n#include <Eigen/Geometry>\n\n#include <boost/shared_ptr.hpp>\n\n#include <map>\n#include <set>\n#include <string>\n#include <vector>\n\nnamespace rig {\n  // Forward declaration\n  class CameraParameters;\n}\n\nnamespace asp {\n  class nvmData;\n}\n\nnamespace rig {\n\n// Forward declarations  \nclass cameraImage;\nclass ImageMessage;\nclass RigSet;\n\n// Look up images, with or without the rig constraint. See individual\n// functions below for more details.\ntypedef std::map<double, rig::ImageMessage> MsgMap;\ntypedef MsgMap::const_iterator MsgMapIter;\nvoid lookupImages(// Inputs\n                  bool no_rig, double bracket_len,\n                  double timestamp_offsets_max_change,\n                  bool bracket_single_image,\n                  rig::RigSet const& R,\n                  std::vector<MsgMap> const& image_maps,\n                  std::vector<MsgMap> const& depth_maps,\n                  // Outputs\n                  std::vector<double>                 & ref_timestamps,\n                  std::vector<Eigen::Affine3d>        & world_to_ref,\n                  std::vector<rig::cameraImage> & cams,\n                  std::vector<Eigen::Affine3d>        & world_to_cam,\n                  std::vector<double>                 & min_timestamp_offset,\n                  std::vector<double>                 & max_timestamp_offset);\n  \n// Find pointers to the camera and reference images that bracket the\n// camera image. Great care is needed here. Two cases are considered,\n// if there is a rig or not. If no_rig is true, then the reference images are\n// the same as the camera images. \nvoid calcBracketing(// Inputs\n                  bool no_rig, int cid, int cam_type,\n                  std::vector<rig::cameraImage> const& cams,\n                  std::vector<double> const& ref_timestamps,\n                  rig::RigSet   const& R,\n                  // Will not be changed but need access\n                  std::vector<double> & world_to_cam_vec,\n                  std::vector<double> & world_to_ref_vec,\n                  std::vector<double> & ref_to_cam_vec,\n                  std::vector<double> & ref_identity_vec,\n                  std::vector<double> & right_identity_vec,\n                  // Outputs\n                  double* & beg_cam_ptr, \n                  double* & end_cam_ptr, \n                  double* & ref_to_cam_ptr,\n                  double  & beg_ref_timestamp, \n                  double  & end_ref_timestamp,\n                  double  & cam_timestamp);\n\n}  // namespace rig\n\n#endif  // ASP_RIG_IMAGE_LOOKUP_H\n"
  },
  {
    "path": "src/asp/Rig/InterestPoint.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  https://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Core/Nvm.h>\n#include <asp/Rig/BasicAlgs.h>\n#include <asp/Rig/InterestPoint.h>\n#include <asp/Rig/CameraImage.h>\n#include <asp/Rig/SystemUtils.h>\n#include <asp/Rig/RigThread.h>\n#include <asp/Rig/Detector.h>\n#include <asp/Rig/TransformUtils.h>\n#include <asp/Rig/InterpolationUtils.h>\n#include <asp/Rig/RigConfig.h>\n#include <asp/Rig/ImageLookup.h>\n#include <asp/Rig/Tracks.h>\n#include <asp/Rig/RigCameraParams.h>\n#include <asp/Rig/NvmUtils.h>\n#include <asp/Rig/RigIo.h>\n#include <asp/Rig/Triangulation.h>\n\n#include <vw/InterestPoint/MatcherIO.h>\n#include <vw/Math/RandomSet.h>\n\n#include <opencv2/xfeatures2d.hpp>\n#include <opencv2/highgui.hpp>\n#include <opencv2/calib3d/calib3d.hpp>\n\n// Get rid of warnings beyond our control\n#pragma GCC diagnostic ignored \"-Wdeprecated-declarations\"\n#pragma GCC diagnostic ignored \"-Wunused-function\"\n#pragma GCC diagnostic push\n#include <OpenMVG/projection.hpp>\n#include <OpenMVG/triangulation_nview.hpp>\n#include <OpenMVG/tracks.hpp>\n#pragma GCC diagnostic pop\n\n#include <boost/filesystem.hpp>\n\n#include <iostream>\n#include <fstream>\n#include <iomanip>\n\nnamespace fs = boost::filesystem;\n\n// SIFT is doing so much better than SURF for haz cam images.\nDEFINE_string(feature_detector, \"SIFT\", \"The feature detector to use. SIFT or SURF.\");\nDEFINE_int32(sift_nFeatures, 10000, \"Number of SIFT features.\");\nDEFINE_int32(sift_nOctaveLayers, 3, \"Number of SIFT octave layers.\");\nDEFINE_double(sift_contrastThreshold, 0.02,\n                \"SIFT contrast threshold\");  // decrease for more ip\nDEFINE_double(sift_edgeThreshold, 10, \"SIFT edge threshold.\");\nDEFINE_double(sift_sigma, 1.6, \"SIFT sigma.\");\nDEFINE_int32(max_pairwise_matches, 2000,\n             \"Maximum number of pairwise matches in an image pair to keep.\");\nDEFINE_double(goodness_ratio, 0.8,\n              \"A smaller value keeps fewer but more reliable float descriptor matches.\");\n\nnamespace rig {\n\n// Copy IP information from an OpenCV KeyPoint object.\nvoid setFromCvKeypoint(Eigen::Vector2d const& key, cv::Mat const& cv_descriptor,\n                       vw::ip::InterestPoint& ip) {\n  ip.x = key[0];\n  ip.y = key[1];\n  ip.ix = round(ip.x);\n  ip.iy = round(ip.y);\n  ip.interest = 0;\n  ip.octave = 0;\n  ip.scale_lvl = 1;\n  ip.scale = 1;\n  ip.orientation = 0;\n  ip.polarity = false;\n\n  if (cv_descriptor.rows != 1 || cv_descriptor.cols < 2)\n    LOG(FATAL) << \"The descriptors must be in one row, and have at least two columns.\";\n\n  ip.descriptor.set_size(cv_descriptor.cols);\n  for (size_t it = 0; it < ip.descriptor.size(); it++) {\n    ip.descriptor[it] = cv_descriptor.at<float>(0, it);\n  }\n}\n\nvoid detectFeatures(const cv::Mat& image, bool verbose,\n                    // Outputs\n                    cv::Mat* descriptors, Eigen::Matrix2Xd* keypoints) {\n  bool histogram_equalization = false;\n\n  // If using histogram equalization, need an extra image to store it\n  cv::Mat* image_ptr = const_cast<cv::Mat*>(&image);\n  cv::Mat hist_image;\n  if (histogram_equalization) {\n    cv::equalizeHist(image, hist_image);\n    image_ptr = &hist_image;\n  }\n\n  std::vector<cv::KeyPoint> storage;\n\n  if (FLAGS_feature_detector == \"SIFT\") {\n    cv::Ptr<cv::SIFT> sift =\n      cv::SIFT::create(FLAGS_sift_nFeatures, FLAGS_sift_nOctaveLayers,\n                                    FLAGS_sift_contrastThreshold,\n                                    FLAGS_sift_edgeThreshold, FLAGS_sift_sigma);\n    sift->detect(image, storage);\n    sift->compute(image, storage, *descriptors);\n\n  } else if (FLAGS_feature_detector == \"SURF\") {\n    rig::FeatureDetector detector(\"SURF\");\n    detector.Detect(*image_ptr, &storage, descriptors);\n\n    // Undo the shift in the detector\n    for (cv::KeyPoint& key : storage) {\n      key.pt.x += image.cols / 2.0;\n      key.pt.y += image.rows / 2.0;\n    }\n\n  } else {\n    LOG(FATAL) << \"Unknown feature detector: \" << FLAGS_feature_detector;\n  }\n\n  if (verbose) std::cout << \"Features detected \" << storage.size() << std::endl;\n\n  // Copy to data structures expected by subsequent code\n  keypoints->resize(2, storage.size());\n  Eigen::Vector2d output;\n  for (size_t j = 0; j < storage.size(); j++) {\n    keypoints->col(j) = Eigen::Vector2d(storage[j].pt.x, storage[j].pt.y);\n  }\n}\n\nvoid reduceMatches(std::vector<vw::ip::InterestPoint> & left_ip,\n                   std::vector<vw::ip::InterestPoint> & right_ip) {\n\n  // pick a random subset\n  std::vector<int> subset;\n  vw::math::pick_random_indices_in_range(left_ip.size(), FLAGS_max_pairwise_matches, subset);\n  std::sort(subset.begin(), subset.end());  // sort the indices (not strictly necessary)\n\n  std::vector<vw::ip::InterestPoint> left_ip_full, right_ip_full;\n  left_ip_full.swap(left_ip);\n  right_ip_full.swap(right_ip);\n\n  left_ip.resize(FLAGS_max_pairwise_matches);\n  right_ip.resize(FLAGS_max_pairwise_matches);\n  for (size_t it = 0; it < subset.size(); it++) {\n    left_ip[it] = left_ip_full[subset[it]];\n    right_ip[it] = right_ip_full[subset[it]];\n  }\n}\n\n// descriptor is what opencv descriptor was used to make the descriptors\n// the descriptor maps are the features in the two images\n// matches is output to contain the matching features between the two images\nvoid FindMatches(const cv::Mat & img1_descriptor_map,\n                  const cv::Mat & img2_descriptor_map, std::vector<cv::DMatch> * matches) {\n  CHECK(img1_descriptor_map.depth() ==\n        img2_descriptor_map.depth())\n    << \"Mixed descriptor types. Did you mash BRISK with SIFT/SURF?\";\n\n  // Check for early exit conditions\n  matches->clear();\n  if (img1_descriptor_map.rows == 0 ||\n      img2_descriptor_map.rows == 0)\n    return;\n\n  // Traditional floating point descriptor\n  cv::FlannBasedMatcher matcher;\n  std::vector<std::vector<cv::DMatch> > possible_matches;\n  matcher.knnMatch(img1_descriptor_map, img2_descriptor_map, possible_matches, 2);\n  matches->clear();\n  matches->reserve(possible_matches.size());\n  for (std::vector<cv::DMatch> const& best_pair : possible_matches) {\n    if (best_pair.size() == 1) {\n      // This was the only best match, push it.\n      matches->push_back(best_pair.at(0));\n    } else {\n      // Push back a match only if it is 25% better than the next best.\n      if (best_pair.at(0).distance < FLAGS_goodness_ratio * best_pair.at(1).distance) {\n        matches->push_back(best_pair[0]);\n      }\n    }\n  }\n}\n\n// This really likes haz cam first and nav cam second\n// Note: The function matchFeaturesWithCams() is used instead.\nvoid matchFeatures(std::mutex* match_mutex,\n                   int left_image_index, int right_image_index,\n                   cv::Mat const& left_descriptors, cv::Mat const& right_descriptors,\n                   Eigen::Matrix2Xd const& left_keypoints,\n                   Eigen::Matrix2Xd const& right_keypoints, bool verbose,\n                   // output\n                   MATCH_PAIR* matches) {\n  std::vector<cv::DMatch> cv_matches;\n  rig::FindMatches(left_descriptors, right_descriptors, &cv_matches);\n\n  std::vector<cv::Point2f> left_vec;\n  std::vector<cv::Point2f> right_vec;\n  for (size_t j = 0; j < cv_matches.size(); j++) {\n    int left_ip_index = cv_matches.at(j).queryIdx;\n    int right_ip_index = cv_matches.at(j).trainIdx;\n\n    // Get the keypoints from the good matches\n    left_vec.push_back(cv::Point2f(left_keypoints.col(left_ip_index)[0],\n                                   left_keypoints.col(left_ip_index)[1]));\n    right_vec.push_back(cv::Point2f(right_keypoints.col(right_ip_index)[0],\n                                    right_keypoints.col(right_ip_index)[1]));\n  }\n\n  if (left_vec.empty()) return;\n\n  // These may need some tweaking but works reasonably well.\n  double ransacReprojThreshold = 20.0;\n  cv::Mat inlier_mask;\n  int maxIters = 10000;\n  double confidence = 0.8;\n\n  // affine2D works better than homography\n  // cv::Mat H = cv::findHomography(left_vec, right_vec, cv::RANSAC,\n  // ransacReprojThreshold, inlier_mask, maxIters, confidence);\n  cv::Mat H = cv::estimateAffine2D(left_vec, right_vec, inlier_mask, cv::RANSAC,\n                                   ransacReprojThreshold, maxIters, confidence);\n\n  std::vector<vw::ip::InterestPoint> left_ip, right_ip;\n  for (size_t j = 0; j < cv_matches.size(); j++) {\n    if (inlier_mask.at<uchar>(j, 0) == 0) continue;\n\n    int left_ip_index = cv_matches.at(j).queryIdx;\n    int right_ip_index = cv_matches.at(j).trainIdx;\n\n    cv::Mat left_desc = left_descriptors.row(left_ip_index);\n    cv::Mat right_desc = right_descriptors.row(right_ip_index);\n\n    vw::ip::InterestPoint left;\n    setFromCvKeypoint(left_keypoints.col(left_ip_index), left_desc, left);\n\n    vw::ip::InterestPoint right;\n    setFromCvKeypoint(right_keypoints.col(right_ip_index), right_desc, right);\n\n    left_ip.push_back(left);\n    right_ip.push_back(right);\n  }\n\n  // Update the shared variable using a lock\n  match_mutex->lock();\n\n  // Print the verbose message inside the lock, otherwise the text\n  // may get messed up.\n  if (verbose)\n    std::cout << \"Number of matches for pair \"\n              << left_image_index << ' ' << right_image_index << \": \"\n              << left_ip.size() << std::endl;\n\n  if (FLAGS_max_pairwise_matches >= 0 && (int)left_ip.size() > FLAGS_max_pairwise_matches)\n    reduceMatches(left_ip, right_ip);\n\n  *matches = std::make_pair(left_ip, right_ip);\n  match_mutex->unlock();\n}\n\n// Match features while assuming that the input cameras can be used to filter out\n// outliers by reprojection error.\n// TODO(oalexan1): This can be fragile. What if input cameras have poor pointing info?\nvoid matchFeaturesWithCams(std::mutex* match_mutex,\n                           int left_image_index, int right_image_index,\n                           rig::CameraParameters const& left_params,\n                           rig::CameraParameters const& right_params,\n                           bool filter_matches_using_cams,\n                           Eigen::Affine3d const& left_world_to_cam,\n                           Eigen::Affine3d const& right_world_to_cam,\n                           double reprojection_error,\n                           cv::Mat const& left_descriptors,\n                           cv::Mat const& right_descriptors,\n                           Eigen::Matrix2Xd const& left_keypoints,\n                           Eigen::Matrix2Xd const& right_keypoints,\n                           bool verbose,\n                           // output\n                           MATCH_PAIR* matches) {\n  // Match by using descriptors first\n  std::vector<cv::DMatch> cv_matches;\n  rig::FindMatches(left_descriptors, right_descriptors, &cv_matches);\n\n  // Do filtering\n  std::vector<cv::Point2f> left_vec;\n  std::vector<cv::Point2f> right_vec;\n  std::vector<cv::DMatch> filtered_cv_matches;\n  for (size_t j = 0; j < cv_matches.size(); j++) {\n    int left_ip_index = cv_matches.at(j).queryIdx;\n    int right_ip_index = cv_matches.at(j).trainIdx;\n\n    // We may not always have the cameras to use in filtering\n    if (filter_matches_using_cams) {\n      Eigen::Vector2d dist_left_ip(left_keypoints.col(left_ip_index)[0],\n                                   left_keypoints.col(left_ip_index)[1]);\n\n      Eigen::Vector2d dist_right_ip(right_keypoints.col(right_ip_index)[0],\n                                    right_keypoints.col(right_ip_index)[1]);\n\n      Eigen::Vector2d undist_left_ip;\n      Eigen::Vector2d undist_right_ip;\n      left_params.Convert<rig::DISTORTED, rig::UNDISTORTED_C>\n        (dist_left_ip, &undist_left_ip);\n      right_params.Convert<rig::DISTORTED, rig::UNDISTORTED_C>\n        (dist_right_ip, &undist_right_ip);\n\n      Eigen::Vector3d X =\n        rig::TriangulatePair(left_params.GetFocalLength(),\n                                   right_params.GetFocalLength(),\n                                   left_world_to_cam, right_world_to_cam,\n                                   undist_left_ip, undist_right_ip);\n\n      // Project back into the cameras\n      Eigen::Vector3d left_cam_X = left_world_to_cam * X;\n      Eigen::Vector2d undist_left_pix\n        = left_params.GetFocalVector().cwiseProduct(left_cam_X.hnormalized());\n      Eigen::Vector2d dist_left_pix;\n      left_params.Convert<rig::UNDISTORTED_C, rig::DISTORTED>(undist_left_pix,\n                                                                    &dist_left_pix);\n\n      Eigen::Vector3d right_cam_X = right_world_to_cam * X;\n      Eigen::Vector2d undist_right_pix\n        = right_params.GetFocalVector().cwiseProduct(right_cam_X.hnormalized());\n      Eigen::Vector2d dist_right_pix;\n      right_params.Convert<rig::UNDISTORTED_C, rig::DISTORTED>(undist_right_pix,\n                                                                     &dist_right_pix);\n\n      // Filter out points whose reprojection error is too big\n      bool is_good = ((dist_left_ip - dist_left_pix).norm() <= reprojection_error &&\n                      (dist_right_ip - dist_right_pix).norm() <= reprojection_error);\n\n      // If any values above are Inf or NaN, is_good will be false as well\n      if (!is_good) continue;\n    }\n\n    // Get the keypoints from the good matches\n    left_vec.push_back(cv::Point2f(left_keypoints.col(left_ip_index)[0],\n                                   left_keypoints.col(left_ip_index)[1]));\n    right_vec.push_back(cv::Point2f(right_keypoints.col(right_ip_index)[0],\n                                    right_keypoints.col(right_ip_index)[1]));\n\n    filtered_cv_matches.push_back(cv_matches[j]);\n  }\n\n  if (left_vec.empty()) return;\n\n  // Filter using geometry constraints\n  // These may need some tweaking but works reasonably well.\n  double ransacReprojThreshold = 20.0;\n  cv::Mat inlier_mask;\n  int maxIters = 10000;\n  double confidence = 0.8;\n\n  // affine2D works better than homography\n  // cv::Mat H = cv::findHomography(left_vec, right_vec, cv::RANSAC,\n  // ransacReprojThreshold, inlier_mask, maxIters, confidence);\n  cv::Mat H = cv::estimateAffine2D(left_vec, right_vec, inlier_mask, cv::RANSAC,\n                                   ransacReprojThreshold, maxIters, confidence);\n\n  std::vector<vw::ip::InterestPoint> left_ip, right_ip;\n  for (size_t j = 0; j < filtered_cv_matches.size(); j++) {\n    int left_ip_index = filtered_cv_matches.at(j).queryIdx;\n    int right_ip_index = filtered_cv_matches.at(j).trainIdx;\n\n    if (inlier_mask.at<uchar>(j, 0) == 0) continue;\n\n    cv::Mat left_desc = left_descriptors.row(left_ip_index);\n    cv::Mat right_desc = right_descriptors.row(right_ip_index);\n\n    vw::ip::InterestPoint left;\n    setFromCvKeypoint(left_keypoints.col(left_ip_index), left_desc, left);\n\n    vw::ip::InterestPoint right;\n    setFromCvKeypoint(right_keypoints.col(right_ip_index), right_desc, right);\n\n    left_ip.push_back(left);\n    right_ip.push_back(right);\n  }\n\n  if (FLAGS_max_pairwise_matches >= 0 && (int)left_ip.size() > FLAGS_max_pairwise_matches)\n    reduceMatches(left_ip, right_ip);\n\n  // Update the shared variable using a lock\n  match_mutex->lock();\n\n  // Print the verbose message inside the lock, otherwise the text\n  // may get messed up.\n  if (verbose)\n    std::cout << \"Number of matches for pair \"\n              << left_image_index << ' ' << right_image_index << \": \"\n              << left_ip.size() << std::endl;\n\n  *matches = std::make_pair(left_ip, right_ip);\n  match_mutex->unlock();\n}\n\n// Add keypoints from a map, appending to existing keypoints. Take into\n// account how this map's cid gets transformed to the new map cid.\n// Note that keypoint_offsets are applied before the cid2cid transform gets used!\n// This is very error-prone!\n// TODO(oalexan1): addKeypoints() can be merged into addMatchPairs().\n// Just add keypoints and update the counter as they are found.\nvoid addKeypoints(// Append from these\n                  rig::PidCidFid               const& pid_to_cid_fid,\n                  rig::CidToKeypointMatVec     const& cid_to_keypoint_map,\n                  std::map<int, int>           const& cid2cid,\n                  std::vector<Eigen::Vector2d> const& keypoint_offsets,\n                  int cid_shift,\n                  size_t num_out_cams,\n                  // Outputs, append to these\n                  std::vector<int>                  & keypoint_count,\n                  KeyPointMap                       & merged_keypoint_map) {\n\n  // Sanity checks\n  if (num_out_cams != keypoint_count.size())\n    LOG(FATAL) << \"Keypoint count was not initialized correctly.\\n\";\n  if (num_out_cams != merged_keypoint_map.size())\n    LOG(FATAL) << \"Keypoint map was not initialized correctly.\\n\";\n  if (num_out_cams != rig::maxMapVal(cid2cid) + 1)\n    LOG(FATAL) << \"Unexpected value for the size of the output map.\\n\";\n\n  for (size_t pid = 0; pid < pid_to_cid_fid.size(); pid++) {\n\n    auto const& cid_fid = pid_to_cid_fid[pid];  // alias\n    for (auto map_it = cid_fid.begin(); map_it != cid_fid.end(); map_it++) {\n\n      int cid = -1;  // will change soon\n      std::pair<float, float> K;\n      bool ans = updateCidFindKeypoint(map_it, cid_to_keypoint_map, cid2cid,\n                                       keypoint_offsets, cid_shift,\n                                       cid, K);\n      if (!ans)\n        continue;\n\n      // Insert K in the keypoint map and increment the count,\n      // unless it already exists\n      auto & key_map = merged_keypoint_map.at(cid);  // alias, will be changed\n      if (key_map.find(K) != key_map.end())\n        continue;  // exists already\n\n      key_map[K] = keypoint_count[cid];\n      keypoint_count[cid]++;\n    }\n  }\n\n  return;\n}\n\n// Break up each track of keypoints of length N into N pairs, (T0,\n// T1), (T1, T2), ,, . (T(N-1), T0). Find their indices in the merged\n// set of keypoints. Repeat this for each input map to merge and\n// accumulate the pairs. Later these will be combined into new tracks\n// and any repeated data will be fused. This is very tied to the\n// addKeypoints() function.\n// Note that keypoint_offsets are applied before the cid2cid transform gets used!\n// This is very error-prone!  // TODO(oalexan1): Remove that logic and the shift\n// as well from this function to make it easier to understand.\n// TODO(oalexan1): Incorporate here the addKeypoints() logic which\n// mirrors a lot of this.\n// TODO(oalexan1): Test at some point using this to rebuild and merge the tracks in\n// a merged map. The concern is that it will result in conflicting tracks\n// which will be removed, so this should be an option.\nvoid addMatchPairs(// Append from these\n                   rig::PidCidFid                        const& pid_to_cid_fid,\n                   rig::CidToKeypointMatVec              const& cid_to_keypoint_map,\n                   std::map<int, int>                    const& cid2cid,\n                   std::vector<Eigen::Vector2d>          const& keypoint_offsets,\n                   KeyPointMap                           const& merged_keypoint_map,\n                   int cid_shift, size_t num_out_cams,\n                   aspOpenMVG::matching::PairWiseMatches      & match_map) {  // append here\n\n  // Sanity checks\n  if (num_out_cams != merged_keypoint_map.size())\n    LOG(FATAL) << \"Keypoint map was not initialized correctly.\\n\";\n  if (num_out_cams != rig::maxMapVal(cid2cid) + 1)\n    LOG(FATAL) << \"Unexpected value for the size of the output map.\\n\";\n\n  for (size_t pid = 0; pid < pid_to_cid_fid.size(); pid++) {\n\n    auto const& cid_fid = pid_to_cid_fid[pid];  // alias\n    for (auto map_it1 = cid_fid.begin(); map_it1 != cid_fid.end(); map_it1++) {\n\n      // First element in the pair\n      int cid1 = -1;  // will change soon\n      std::pair<float, float> K1;\n      bool ans = updateCidFindKeypoint(map_it1, cid_to_keypoint_map, cid2cid,\n                                       keypoint_offsets, cid_shift,\n                                       cid1, K1);  // output\n      if (!ans)\n        continue;\n\n      // Find the second element in the pair. If at the end of the track,\n      // and the track length is more than 2, use the earliest element.\n      auto map_it2 = map_it1;\n      map_it2++;\n      if (map_it2 == cid_fid.end()) {\n\n        if (cid_fid.size() <= 2)\n          continue;  // Already added (T0, T1), no need to add (T1, T0).\n\n        map_it2 = cid_fid.begin();\n      }\n      int cid2 = -1;  // will change soon\n      std::pair<float, float> K2;\n      ans = updateCidFindKeypoint(map_it2, cid_to_keypoint_map, cid2cid,\n                                  keypoint_offsets, cid_shift,\n                                  cid2, K2);  // output\n      if (!ans)\n        continue;\n\n      // No point in adding a match from an image to itself\n      if (cid1 == cid2)\n        continue;\n\n      // Find the fid indices\n      auto it1 = merged_keypoint_map.at(cid1).find(K1);\n      auto it2 = merged_keypoint_map.at(cid2).find(K2);\n      if (it1 == merged_keypoint_map.at(cid1).end() ||\n          it2 == merged_keypoint_map.at(cid2).end())\n        LOG(FATAL) << \"Could not look up a keypoint. That is unexpected.\\n\";\n      int fid1 = it1->second;\n      int fid2 = it2->second;\n\n      // Append the pair\n      std::vector<aspOpenMVG::matching::IndMatch> & mvg_matches\n        = match_map[std::make_pair(cid1, cid2)];  // alias\n      mvg_matches.push_back(aspOpenMVG::matching::IndMatch(fid1, fid2));\n    }  // end iterating over the track\n  }\n  return;\n}\n\n// Helper function to add an ip to the keypoint map if not there.\n// In either case find its fid, which is the keypoint map value.\nvoid findFid(std::pair<float, float> const & ip,\n             int cid,\n             // Outputs\n             KeyPointMap & keypoint_map,\n             std::vector<int> & fid_count,\n             int & fid) {\n\n  fid = -1;  // initialize the output\n\n  auto it = keypoint_map[cid].find(ip);\n  if (it != keypoint_map[cid].end()) {\n    fid = it->second;\n  } else {\n    keypoint_map[cid][ip] = fid_count[cid];\n    fid = fid_count[cid];\n    fid_count[cid]++;\n  }\n  return;\n}\n\n// Create keypoint_vec from keypoint_map. That just reorganizes the data\n// to the format expected later.\nvoid keypointMapToVec(KeyPointMap const& keypoint_map,\n                      KeypointVec & keypoint_vec) {\n  size_t num_images = keypoint_map.size();\n  keypoint_vec.clear();\n  keypoint_vec.resize(num_images);\n  for (size_t cid = 0; cid < num_images; cid++) {\n    auto const& map = keypoint_map[cid];  // alias\n    keypoint_vec[cid].resize(map.size());\n    for (auto ip_it = map.begin(); ip_it != map.end(); ip_it++) {\n      auto const& ip = ip_it->first;  // alias\n      int fid = ip_it->second;\n      keypoint_vec[cid][fid] = ip;\n    }\n  }\n}\n\n// Detects features, matches them between image pairs, and builds tracks.\n//\n//  This function handles the entire feature detection and matching pipeline:\n//  1. Detects keypoints and descriptors in all images using multiple threads.\n//  2. Determines which image pairs to match (based on overlap or input pairs).\n//  3. Matches features between pairs, filtering with camera geometry if enabled.\n//  4. Optionally saves matches to disk.\n//  5. Builds keypoint maps and feature-ID (fid) counts.\n//  6. Builds connectivity tracks (pid_to_cid_fid) from the pairwise matches.\nvoid detectMatchFeatures(// Inputs\n    std::vector<rig::cameraImage>      const& cams,\n    std::vector<rig::CameraParameters> const& cam_params,\n    std::string                        const& out_dir,\n    bool save_matches,\n    bool filter_matches_using_cams,\n    std::vector<Eigen::Affine3d>       const& world_to_cam,\n    int num_overlaps,\n    std::vector<std::pair<int, int>>   const& input_image_pairs,\n    int initial_max_reprojection_error, int num_match_threads,\n    bool verbose,\n    // Outputs\n    KeyPointMap                             & keypoint_map,\n    std::vector<int>                        & fid_count,\n    rig::PidCidFid                          & pid_to_cid_fid) {\n\n  // Initialize outputs\n  size_t num_images = cams.size();\n  keypoint_map.clear();\n  fid_count.clear();\n  pid_to_cid_fid.clear();\n  keypoint_map.resize(num_images);\n  fid_count.resize(num_images, 0);  // Important: initialize count to 0\n\n  // Detect features using multiple threads. Too many threads may result\n  // in high memory usage.\n  std::cout << \"Using \" << num_match_threads << \" threads for feature detection/matching.\\n\";\n\n  std::cout << \"Detecting features.\" << std::endl;\n\n  std::vector<cv::Mat> cid_to_descriptor_map;\n  rig::CidToKeypointMatVec cid_to_keypoint_map;\n  cid_to_descriptor_map.resize(num_images);\n  cid_to_keypoint_map.resize(num_images);\n  {\n    // Make the thread pool go out of scope when not needed to not use up memory\n    rig::ThreadPool thread_pool(num_match_threads);\n    for (size_t it = 0; it < num_images; it++) {\n      thread_pool.AddTask\n        (&rig::detectFeatures, // multi-threaded  // NOLINT\n         // rig::detectFeatures(   // single-threaded  // NOLINT\n         cams[it].image, verbose, &cid_to_descriptor_map[it], &cid_to_keypoint_map[it]);\n    }\n    thread_pool.Join();\n  }\n\n  // Find which image pairs to match\n  std::vector<std::pair<int, int>> image_pairs;\n  if (!input_image_pairs.empty()) {\n    // Use provided image pairs instead of num_overlaps\n    image_pairs = input_image_pairs;\n  } else {\n    for (size_t it1 = 0; it1 < num_images; it1++) {\n      int end = std::min(num_images, it1 + num_overlaps + 1);\n      for (size_t it2 = it1 + 1; it2 < end; it2++) {\n        image_pairs.push_back(std::make_pair(it1, it2));\n      }\n    }\n  }\n\n  MATCH_MAP matches;\n  {  // Deallocate local variables as soon as they are not needed\n    std::cout << \"Matching features.\" << std::endl;\n    rig::ThreadPool thread_pool(num_match_threads);\n    std::mutex match_mutex;\n    for (size_t pair_it = 0; pair_it < image_pairs.size(); pair_it++) {\n      auto pair = image_pairs[pair_it];\n      int left_image_it = pair.first, right_image_it = pair.second;\n      thread_pool.AddTask\n        (&rig::matchFeaturesWithCams, // multi-threaded  // NOLINT\n         // rig::matchFeaturesWithCams(  // single-threaded  // NOLINT\n         &match_mutex, left_image_it, right_image_it,\n         cam_params[cams[left_image_it].camera_type],\n         cam_params[cams[right_image_it].camera_type],\n         filter_matches_using_cams,\n         world_to_cam[left_image_it], world_to_cam[right_image_it],\n         initial_max_reprojection_error,\n         cid_to_descriptor_map[left_image_it], cid_to_descriptor_map[right_image_it],\n         cid_to_keypoint_map[left_image_it], cid_to_keypoint_map[right_image_it], verbose,\n         &matches[pair]);\n    }\n    thread_pool.Join();\n  }\n  cid_to_keypoint_map = rig::CidToKeypointMatVec();  // wipe, no longer needed\n  cid_to_descriptor_map = std::vector<cv::Mat>();    // Wipe, no longer needed\n\n  if (save_matches) {\n    if (out_dir.empty())\n      LOG(FATAL) << \"Cannot save matches if no output directory was provided.\\n\";\n\n    std::string match_dir = out_dir + \"/matches\";\n    rig::createDir(match_dir);\n\n    for (auto it = matches.begin(); it != matches.end(); it++) {\n      std::pair<int, int> cid_pair = it->first;\n      rig::MATCH_PAIR const& match_pair = it->second;\n\n      int left_cid = cid_pair.first;\n      int right_cid = cid_pair.second;\n      std::string const& left_image = cams[left_cid].image_name;  // alias\n      std::string const& right_image = cams[right_cid].image_name;  // alias\n\n      bool matches_as_txt = false;\n      std::string match_file = vw::ip::match_filename(match_dir + \"/run\",\n                                                      left_image, right_image,\n                                                      matches_as_txt);\n      std::cout << \"Writing: \" << left_image << \" \" << right_image << \" \"\n                << match_file << std::endl;\n      vw::ip::write_match_file(match_file, match_pair.first, match_pair.second, matches_as_txt);\n    }\n  }\n\n  // Collect all keypoints in keypoint_map, and put the fid (indices of keypoints) in\n  // match_map. It will be used to find the tracks.\n  aspOpenMVG::matching::PairWiseMatches match_map;\n  for (auto it = matches.begin(); it != matches.end(); it++) {\n    std::pair<int, int> const& cid_pair = it->first;      // alias\n\n    int left_cid = cid_pair.first;\n    int right_cid = cid_pair.second;\n\n    rig::MATCH_PAIR const& match_pair = it->second;   // alias\n    std::vector<vw::ip::InterestPoint> const& left_ip_vec = match_pair.first;\n    std::vector<vw::ip::InterestPoint> const& right_ip_vec = match_pair.second;\n\n    for (size_t ip_it = 0; ip_it < left_ip_vec.size(); ip_it++) {\n      auto left_ip  = std::make_pair(left_ip_vec[ip_it].x, left_ip_vec[ip_it].y);\n      auto right_ip = std::make_pair(right_ip_vec[ip_it].x, right_ip_vec[ip_it].y);\n\n      // Add an ip to the keypoint map if not there. In either case find its fid.\n      int left_fid = -1, right_fid = -1;\n      findFid(left_ip, left_cid,\n              keypoint_map, fid_count, left_fid);  // may change\n      findFid(right_ip, right_cid,\n              keypoint_map, fid_count, right_fid);  // may change\n\n      match_map[cid_pair].push_back(aspOpenMVG::matching::IndMatch(left_fid, right_fid));\n    }\n  }\n  matches.clear(); matches = MATCH_MAP();  // mo longer needed\n\n  // If feature A in image I matches feather B in image J, which\n  // matches feature C in image K, then (A, B, C) belong together in\n  // a track, and will have a single triangulated xyz. Build such a track.\n  buildTracks(match_map, pid_to_cid_fid);\n  std::cout << \"Tracks obtained after matching: \" << pid_to_cid_fid.size() << std::endl;\n  match_map = aspOpenMVG::matching::PairWiseMatches();  // wipe this, no longer needed\n}\n\nvoid detectAddFeatures(// Inputs\n                       std::vector<rig::cameraImage>      const& cams,\n                       std::vector<rig::CameraParameters> const& cam_params,\n                       std::string                        const& out_dir,\n                       bool save_matches,\n                       bool filter_matches_using_cams,\n                       std::vector<Eigen::Affine3d>       const& world_to_cam,\n                       int num_overlaps,\n                       std::vector<std::pair<int, int>>   const& input_image_pairs,\n                       int initial_max_reprojection_error, int num_match_threads,\n                       bool read_nvm_no_shift, bool no_nvm_matches, bool verbose,\n                       // Outputs\n                       rig::KeypointVec                        & keypoint_vec,\n                       rig::PidCidFid                          & pid_to_cid_fid,\n                       std::vector<Eigen::Vector3d>            & xyz_vec,\n                       asp::nvmData                            & nvm) {\n\n  // Wipe the outputs\n  keypoint_vec.clear();\n  pid_to_cid_fid.clear();\n  xyz_vec.clear();\n\n  if (!no_nvm_matches)\n    std::cout << \"Tracks read from disk: \" << nvm.pid_to_cid_fid.size() << std::endl;\n\n  // Sanity check: the offsets from the nvm must agree with the optical centers\n  // The offsets may be empty if the cameras were read from a list\n  if (!read_nvm_no_shift && !no_nvm_matches && !nvm.optical_centers.empty()) {\n    for (size_t cid = 0; cid < cams.size(); cid++) {\n      Eigen::Vector2d offset = cam_params[cams[cid].camera_type].GetOpticalOffset();\n      auto it = nvm.optical_centers.find(cams[cid].image_name);\n      if (it == nvm.optical_centers.end())\n        continue;  // offsets may be missing when extra images are added\n      Eigen::Vector2d nvm_offset = it->second;\n      if ((offset - nvm_offset).norm() > 1e-8)\n        LOG(FATAL) << \"Optical centers read from the nvm file do not agree with the \"\n                   << \"ones from the rig configuration for image:  \"\n                   << cams[cid].image_name << \".\\n\";\n    }\n  }\n\n  size_t num_images = cams.size();\n  if (num_overlaps == 0 && !no_nvm_matches) {\n    // Add the optical center shift, if needed\n    // Here keypoint_offsets are for the cid in the order in cams, not in nvm.\n    // TODO(oalexan1): This is confusing and needs to be dealt with at some point.\n    std::vector<Eigen::Vector2d> keypoint_offsets(num_images);\n    for (int cid = 0; cid < num_images; cid++) {\n      if (read_nvm_no_shift)\n        keypoint_offsets[cid] = Eigen::Vector2d(0, 0);\n      else\n        keypoint_offsets[cid] = cam_params[cams[cid].camera_type].GetOpticalOffset();\n    }\n\n    // If we do not need to create new matches, just reorganize the ones read in\n    // and quit.\n    rig::transformNvm(cams, keypoint_offsets, nvm,\n                      pid_to_cid_fid, keypoint_vec, xyz_vec);  // outputs\n    nvm = asp::nvmData();  // no longer needed\n    return;\n  }\n\n  // Detect and match features\n  KeyPointMap keypoint_map;\n  std::vector<int> fid_count;\n  detectMatchFeatures(// Inputs\n                      cams, cam_params, out_dir, save_matches,\n                      filter_matches_using_cams,\n                      world_to_cam, num_overlaps,\n                      input_image_pairs,\n                      initial_max_reprojection_error, num_match_threads,\n                      verbose,\n                      // Outputs\n                      keypoint_map, fid_count, pid_to_cid_fid);\n\n  // Append tracks being read from nvm. This turned out to work better than to try\n  // to merge these tracks with the ones from the pairwise matching above, as the latter\n  // would make many good tracks disappear.\n  if (!no_nvm_matches) {\n    // Find how to map each cid from nvm to cid in 'cams'.\n    std::map<int, int> nvm_cid_to_cams_cid;\n    rig::findCidReorderMap(nvm, cams,\n                           nvm_cid_to_cams_cid);  // output\n\n    // Add the optical center shift, if needed.\n    std::vector<Eigen::Vector2d> keypoint_offsets(nvm.cid_to_filename.size());\n    for (size_t nvm_cid = 0; nvm_cid < nvm.cid_to_filename.size(); nvm_cid++) {\n\n      // This is a bugfix. The transformAppendNvm() function below\n      // expects that keypoint_offsets be indexed by nvm_cid and not\n      // reordered cid in cams.\n      // TODO(oalexan1): This is confusing. The keypoint offsets in transformAppendNvm()\n      // better be applied after nvm_cid_to_cams_cid is applied. Also merge\n      // with function transformNvm() and remove the latter.\n      auto it = nvm_cid_to_cams_cid.find(nvm_cid);\n      if (it == nvm_cid_to_cams_cid.end()) {\n        // This nvm_cid does not exist in cams. A warning about that\n        // was given in findCidReorderMap(). Give a value to this\n        // but it won't be used.\n        keypoint_offsets[nvm_cid] = Eigen::Vector2d(0, 0);\n        continue;\n      }\n\n      int cams_cid = it->second;\n      if (read_nvm_no_shift)\n        keypoint_offsets[nvm_cid] = Eigen::Vector2d(0, 0);\n      else\n        keypoint_offsets[nvm_cid]\n          = cam_params[cams[cams_cid].camera_type].GetOpticalOffset();\n    }\n\n    // Add the nvm matches. Unlike the transformNvm() function above,\n    // the keypoints are shared with the newly created matches. Later\n    // that will be used to remove duplicates.\n    int cid_shift = 0;  // part of the API\n    rig::transformAppendNvm(nvm.pid_to_cid_fid, nvm.cid_to_keypoint_map,\n                            nvm_cid_to_cams_cid,\n                            keypoint_offsets, cid_shift, num_images,\n                            fid_count, keypoint_map, pid_to_cid_fid);  // append\n  }\n\n  // Create keypoint_vec from keypoint_map. That just reorganizes the data\n  // to the format expected later.\n  keypointMapToVec(keypoint_map, keypoint_vec);\n\n  // De-allocate data not needed anymore\n  nvm = asp::nvmData();  // no longer needed\n  keypoint_map.clear(); keypoint_map.shrink_to_fit();\n\n  // Remove duplicate tracks. Those can happen since additional tracks being\n  // created in matching can duplicate tracks read from disk. Ideally also\n  // shorter tracks contained in longer tracks should be removed, and tracks\n  // that can be merged without conflicts should be merged.\n  rmDuplicateTracks(pid_to_cid_fid);\n\n  return;\n}\n\n}  // end namespace rig\n"
  },
  {
    "path": "src/asp/Rig/InterestPoint.h",
    "content": "/* Copyright (c) 2021, United States Government, as represented by the\n * Administrator of the National Aeronautics and Space Administration.\n *\n * All rights reserved.\n *\n * The \"ISAAC - Integrated System for Autonomous and Adaptive Caretaking\n * platform\" software is licensed under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n#ifndef ASP_RIG_INTEREST_POINT_H\n#define ASP_RIG_INTEREST_POINT_H\n\n#include <asp/Rig/RigTypeDefs.h>\n#include <asp/Rig/Detector.h>\n\n#include <vw/InterestPoint/InterestPoint.h>\n\n#include <opencv2/imgproc.hpp>\n#include <glog/logging.h>\n\n#include <Eigen/Core>\n#include <Eigen/Geometry>\n\n#include <string>\n#include <vector>\n#include <map>\n#include <mutex>\n#include <utility>\n\nnamespace rig {\n  class CameraParameters;\n}\n\nnamespace aspOpenMVG {\n  namespace matching {\n    class PairWiseMatches;\n  }\n}\n\nnamespace asp {\n  class nvmData;\n}\n\nnamespace rig {\n\nclass cameraImage;\nclass RigSet;\nclass ImageMessage;\n\n// Copy IP information from an OpenCV KeyPoint object.\nvoid setFromCvKeypoint(Eigen::Vector2d const& key, cv::Mat const& cv_descriptor,\n                       vw::ip::InterestPoint& ip);\n\nvoid detectFeatures(const cv::Mat& image, bool verbose,\n                    // Outputs\n                    cv::Mat* descriptors, Eigen::Matrix2Xd* keypoints);\n\n// This really likes haz cam first and nav cam second\nvoid matchFeatures(std::mutex* match_mutex, int left_image_index, int right_image_index,\n                   cv::Mat const& left_descriptors, cv::Mat const& right_descriptors,\n                   Eigen::Matrix2Xd const& left_keypoints,\n                   Eigen::Matrix2Xd const& right_keypoints, bool verbose,\n                   // Output\n                   MATCH_PAIR* matches);\n\n// Create keypoint_vec from keypoint_map.\nvoid keypointMapToVec(KeyPointMap const& keypoint_map,\n                      KeypointVec & keypoint_vec);\n\nvoid detectAddFeatures(// Inputs\n                       std::vector<rig::cameraImage>      const& cams,\n                       std::vector<rig::CameraParameters> const& cam_params,\n                       std::string                        const& out_dir,\n                       bool save_matches,\n                       bool filter_matches_using_cams,\n                       std::vector<Eigen::Affine3d>       const& world_to_cam,\n                       int num_overlaps,\n                       std::vector<std::pair<int, int>>   const& input_image_pairs,\n                       int initial_max_reprojection_error, int num_match_threads,\n                       bool read_nvm_no_shift, bool no_nvm_matches, bool verbose,\n                       // Outputs\n                       rig::KeypointVec                        & keypoint_vec,\n                       rig::PidCidFid                          & pid_to_cid_fid,\n                       std::vector<Eigen::Vector3d>            & xyz_vec,\n                       asp::nvmData                            & nvm);\n\n// For nvm data that has the keypoints shifted relative to the optical\n// center, undo this shift when 'undo_shift' is true. So, add the optical center.\n// When 'undo_shift' is false, subtract the optical center.\nvoid shiftKeypoints(bool undo_shift, rig::RigSet const& R,\n                    asp::nvmData & nvm);  // output\n\n// Break up each track of keypoints of length N into N pairs, (T0,\n// T1), (T1, T2), ,, . (T(N-1), T0). Find their indices in the merged\n// set of keypoints. Repeat this for each input map to merge and\n// accumulate the pairs. Later these will be combined into new tracks\n// and any repeated data will be fused. This is very tied to the\n// addKeypoints() function.\n// Note that keypoint_offsets are applied before the cid2cid transform gets used!\n// This is very error-prone!\nvoid addMatchPairs(// Append from these\n                   rig::PidCidFid                        const& pid_to_cid_fid,\n                   rig::CidToKeypointMatVec              const& cid_to_keypoint_map,\n                   std::map<int, int>                    const& cid2cid,\n                   std::vector<Eigen::Vector2d>          const& keypoint_offsets,\n                   KeyPointMap                           const& merged_keypoint_map,\n                   int cid_shift, size_t num_out_cams,\n                   aspOpenMVG::matching::PairWiseMatches      & match_map);  // append here\n\n// Given some tracks read from nvm from disk, append the ones from\n// nvm. Some remapping is needed.  given that 'fid' values already\n// exist for the given tracks and that the nvm read from disk\n// may have the images in different order. New keypoints are recorded\n// with the help of fid_count and merged_keypoint_map.\n// Note that keypoint_offsets are applied before the cid2cid transform gets used!\n// This is very error-prone!\nvoid transformAppendNvm(// Append from these\n                        rig::PidCidFid               const& nvm_pid_to_cid_fid,\n                        rig::CidToKeypointMatVec     const& nvm_cid_to_keypoint_map,\n                        std::map<int, int>           const& cid2cid,\n                        std::vector<Eigen::Vector2d> const& keypoint_offsets,\n                        int cid_shift,\n                        size_t num_out_cams,\n                        // Outputs, append to these\n                        std::vector<int>                  & fid_count,\n                        KeyPointMap                       & merged_keypoint_map,\n                        rig::PidCidFid                    & pid_to_cid_fid);\n\n// Add keypoints from a map, appending to existing keypoints. Take into\n// account how this map's cid gets transformed to the new map cid.\n// Note that keypoint_offsets are applied before the cid2cid transform gets used!\n// This is very error-prone!\nvoid addKeypoints(// Append from these\n                  rig::PidCidFid               const& pid_to_cid_fid,\n                  rig::CidToKeypointMatVec     const& cid_to_keypoint_map,\n                  std::map<int, int>           const& cid2cid,\n                  std::vector<Eigen::Vector2d> const& keypoint_offsets,\n                  int cid_shift,\n                  size_t num_out_cams,\n                  // Outputs, append to these\n                  std::vector<int>                  & keypoint_count,\n                  KeyPointMap                       & merged_keypoint_map);\n\nvoid savePairwiseConvergenceAngles(// Inputs\n  rig::PidCidFid                const& pid_to_cid_fid,\n  rig::KeypointVec              const& keypoint_vec,\n  std::vector<rig::cameraImage> const& cams,\n  std::vector<Eigen::Affine3d>  const& world_to_cam,\n  std::vector<Eigen::Vector3d>  const& xyz_vec,\n  PidCidFidMap                  const& pid_cid_fid_inlier,\n  std::string                   const& conv_angles_file);\n\n}  // namespace rig\n\n#endif  // ASP_RIG_INTEREST_POINT_H\n"
  },
  {
    "path": "src/asp/Rig/InterpolationUtils.cc",
    "content": "/* Copyright (c) 2021, United States Government, as represented by the\n * Administrator of the National Aeronautics and Space Administration.\n *\n * All rights reserved.\n *\n * The \"ISAAC - Integrated System for Autonomous and Adaptive Caretaking\n * platform\" software is licensed under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n#include <asp/Rig/InterpolationUtils.h>\n\n#include <glog/logging.h>\n\n#include <iostream>\n\nnamespace rig {\n\n// Given two poses aff0 and aff1, and 0 <= alpha <= 1, do linear interpolation.\nEigen::Affine3d linearInterp(double alpha, Eigen::Affine3d const& aff0,\n                             Eigen::Affine3d const& aff1) {\n  Eigen::Quaternion<double> rot0(aff0.linear());\n  Eigen::Quaternion<double> rot1(aff1.linear());\n  \n  Eigen::Vector3d trans0 = aff0.translation();\n  Eigen::Vector3d trans1 = aff1.translation();\n\n  Eigen::Affine3d result;\n\n  result.translation() = (1.0 - alpha) * trans0 + alpha * trans1;\n  result.linear() = rot0.slerp(alpha, rot1).toRotationMatrix();\n\n  return result;\n}\n\n// Given two poses aff0 and aff1, and t0 <= t <= t1, do linear interpolation.\nEigen::Affine3d linearInterp(double t0, double t, double t1, Eigen::Affine3d const& aff0,\n                             Eigen::Affine3d const& aff1) {\n\n  bool is_good = ((t0 <= t) && (t <= t1));\n  if (!is_good) \n    LOG(FATAL) << \"Incorrect bounds in interpolation.\\n\";\n  \n  double den = t1 - t0;\n  if (den == 0.0)\n    den = 1.0;\n  \n  double alpha = (t - t0) / den;\n  if (alpha < 0.0 || alpha > 1.0) LOG(FATAL) << \"Out of bounds in interpolation.\\n\";\n\n  return rig::linearInterp(alpha, aff0, aff1);\n}\n\n// Given a set of poses indexed by time, interpolate or extrapolate\n// (within range of bracket_len) at a set of target timestamps. Go\n// forward in time both in the input and the target, which makes the\n// complexity linear rather than quadratic.\nvoid interpOrExtrap(std::map<double, Eigen::Affine3d> const& input_poses,\n                    std::map<double, std::string> const& target,\n                    double bracket_len,  bool nearest_neighbor_interp,\n                    // Outputs\n                    std::vector<std::string> & found_images,\n                    std::vector<Eigen::Affine3d> & found_poses) {\n\n  found_images.clear();\n  found_poses.clear();\n  \n  double beg_timestamp = input_poses.begin()->first;\n  double end_timestamp = input_poses.rbegin()->first;\n  \n  // Iterate over all timestamps to interpolate at, and simultaneously\n  // over the existing images to interpolate into, both in increasing\n  // order of time.  This makes complexity linear rather than\n  // quadratic. This is possible because both the inputs and outputs\n  // are sorted by time. Some care is needed.\n\n  auto start = input_poses.begin(); // track where we are in the input \n  for (auto curr_it = target.begin(); curr_it != target.end(); curr_it++) {\n    \n    double curr_timestamp = curr_it->first;\n    std::string const& image_file = curr_it->second;\n    \n    if (curr_timestamp < beg_timestamp - bracket_len ||\n        curr_timestamp > end_timestamp + bracket_len) {\n      std::cout << \"Warning: Image \" << image_file\n                << \" is either earlier or later by --bracket_len amount \"\n                << bracket_len << \" from the range of timestamps of existing \"\n                << \"images. Ignoring it.\\n\";\n      continue;\n    }\n    \n    Eigen::Affine3d found_pose;\n    if (curr_timestamp <= beg_timestamp) {\n      // Use extrapolation\n      found_pose = input_poses.begin()->second; // pose for earliest time\n    } else if (curr_timestamp >= end_timestamp) {\n      found_pose = input_poses.rbegin()->second; // pose for the latest tame\n    } else {\n      // Use interpolation\n      bool success = false;\n      for (auto map_it = start; map_it != input_poses.end(); map_it++) {\n        \n        // Find the right bracketing iterator\n        auto right_map_it = map_it;\n        right_map_it++;\n        if (right_map_it == input_poses.end())\n          right_map_it = map_it; // fall back to left if at the end\n        \n        double left_timestamp = map_it->first;\n        double right_timestamp = right_map_it->first;\n\n        if (left_timestamp > curr_timestamp) {\n          // Went too far\n          break;\n        }\n\n        // Update this for next time. It always moves forward in time,\n        // and points to a location left of current timestamp.\n        start = map_it;\n        \n        bool is_good = (curr_timestamp <= right_timestamp);\n        if (!is_good) \n          continue; // too early\n\n        double min_dist = std::min(std::abs(left_timestamp - curr_timestamp),\n                                   std::abs(right_timestamp - curr_timestamp));\n\n        if (min_dist > bracket_len) {\n          std::cout << \"Timestamp of image \" << image_file\n                    << \" differs by \" << min_dist << \" seconds from the one \"\n                    << \"of existing images, which is more than the \"\n                    << \"--bracket_len value of \" << bracket_len << \". Ignoring it.\\n\";\n          continue;\n        }\n\n        if (nearest_neighbor_interp) {\n          // Use the nearest neighbor\n          if (std::abs(left_timestamp - curr_timestamp) <=\n              std::abs(right_timestamp - curr_timestamp)) {\n            curr_timestamp = left_timestamp;\n          } else {\n            curr_timestamp = right_timestamp;\n          }\n        }\n        \n        // Interpolate at desired time\n        found_pose\n          = rig::linearInterp(left_timestamp, curr_timestamp, right_timestamp,\n                                    map_it->second, right_map_it->second);\n        \n        found_images.push_back(image_file);\n        found_poses.push_back(found_pose);\n        success = true;\n        break;\n      }\n      \n      if (!success) {\n        std::cout << \"Warning: Cannot compute camera pose for image \" << image_file\n                  << \". Ignoring it.\\n\";\n      }\n    }\n  }  \n}\n  \n}  // end namespace rig\n"
  },
  {
    "path": "src/asp/Rig/InterpolationUtils.h",
    "content": "/* Copyright (c) 2021, United States Government, as represented by the\n * Administrator of the National Aeronautics and Space Administration.\n *\n * All rights reserved.\n *\n * The \"ISAAC - Integrated System for Autonomous and Adaptive Caretaking\n * platform\" software is licensed under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n#ifndef ASP_RIG_INTERPOLATION_UTILS_H\n#define ASP_RIG_INTERPOLATION_UTILS_H\n\n#include <Eigen/Core>\n#include <Eigen/Geometry>\n\n#include <vector>\n#include <map>\n\nnamespace rig {\n\n// Given two poses aff0 and aff1, and 0 <= alpha <= 1, do linear interpolation.\nEigen::Affine3d linearInterp(double alpha, Eigen::Affine3d const& aff0,\n                               Eigen::Affine3d const& aff1);\n\n// Given two poses aff0 and aff1, and t0 <= t <= t1, do linear interpolation.\nEigen::Affine3d linearInterp(double t0, double t, double t1, Eigen::Affine3d const& aff0,\n                             Eigen::Affine3d const& aff1);\n  \n// Given a set of poses indexed by time, interpolate or extrapolate\n// (within range of bracket_len) at a set of target timestamps. Go\n// forward in time both in the input and the target, which makes the\n// complexity linear rather than quadratic.\nvoid interpOrExtrap(std::map<double, Eigen::Affine3d> const& input_poses,\n                    std::map<double, std::string> const& target,\n                    double bracket_len, bool nearest_neighbor,\n                    // Outputs\n                    std::vector<std::string> & found_images,\n                    std::vector<Eigen::Affine3d> & found_poses);\n  \n}  // namespace rig\n\n#endif  // ASP_RIG_INTERPOLATION_UTILS_H\n"
  },
  {
    "path": "src/asp/Rig/MergeMaps.cc",
    "content": "/* Copyright (c) 2017-2026, United States Government, as represented by the\n * Administrator of the National Aeronautics and Space Administration.\n *\n * All rights reserved.\n *\n * The Astrobee platform is licensed under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n#include <asp/Rig/MergeMaps.h>\n#include <asp/Rig/RigConfig.h>\n#include <asp/Rig/CameraImage.h>\n#include <asp/Rig/ImageLookup.h>\n#include <asp/Rig/Tracks.h>\n#include <asp/Rig/BasicAlgs.h>\n#include <asp/Rig/Ransac.h>\n#include <asp/Rig/TransformUtils.h>\n#include <asp/Rig/RigConfig.h>\n#include <asp/Rig/InterestPoint.h>\n#include <asp/Rig/RigOutlier.h>\n#include <asp/Rig/Triangulation.h>\n#include <asp/Core/Nvm.h>\n#include <asp/Rig/RigTypeDefs.h>\n#include <asp/Rig/RigIo.h>\n\n#include <ceres/ceres.h>\n#include <gflags/gflags.h>\n#include <glog/logging.h>\n// Get rid of warning beyond our control\n#pragma GCC diagnostic ignored \"-Wdeprecated-declarations\"\n#pragma GCC diagnostic ignored \"-Wunused-function\"\n#pragma GCC diagnostic push\n#include <OpenMVG/projection.hpp>\n#include <OpenMVG/triangulation_nview.hpp>\n#include <OpenMVG/numeric.h>\n#include <OpenMVG/tracks.hpp>\n#pragma GCC diagnostic pop\n\n#include <Eigen/Core>\n#include <Eigen/Geometry>\n#include <opencv2/features2d/features2d.hpp>\n#include <opencv2/core/core.hpp>\n#include <opencv2/highgui/highgui.hpp>\n\n#include <set>\n#include <thread>\n#include <vector>\n#include <mutex>\n#include <fstream>\n\nnamespace rig {\n\n// TODO(oalexan1): This code is not used but may be useful one day\n// As result of matching some images in A to some images in B, we must\n// now merge some tracks in A with some tracks in B, as those tracks\n// correspond physically to the same point in space. A track in\n// C.pid_to_cid_fid_ tells us which track in A.pid_to_cid_fid_ is tied\n// with which track in B.pid_to_cid_fid_. If it turns out one track in\n// A should be merged with multiple tracks in B or vice-versa, select\n// just one candidate from each map, based on who got most votes. Note\n// that here it is easier to work with A.cid_fid_to_pid_ rather than\n// A.pid_to_cid_fid_.\nvoid FindPidCorrespondences(rig::PidCidFid const& A_cid_fid_to_pid,\n                            rig::PidCidFid const& B_cid_fid_to_pid,\n                            rig::PidCidFid const& C_pid_to_cid_fid,\n                            int num_acid, // How many images are in A\n                            std::map<int, int> * A2B, std::map<int, int> * B2A) {\n  A2B->clear();\n  B2A->clear();\n\n  std::map<int, std::map<int, int>> VoteMap;\n  for (int pid = 0; pid < static_cast<int>(C_pid_to_cid_fid.size()); pid++) {\n    // This track has some cid indices from A (those < num_acid)\n    // and some from B (those >= num_acid). Ignore all other combinations.\n    auto const& cid_fid_c = C_pid_to_cid_fid[pid];  // alias\n    for (auto it_a = cid_fid_c.begin(); it_a != cid_fid_c.end(); it_a++) {\n      for (auto it_b = it_a; it_b != cid_fid_c.end(); it_b++) {\n        int cid_a = it_a->first, fid_a = it_a->second;\n        int cid_b = it_b->first, fid_b = it_b->second;\n        if (cid_a >= num_acid) continue;\n        if (cid_b <  num_acid) continue;\n\n        // Subtract num_acid from cid_b so it becomes a cid in B.\n        cid_b -= num_acid;\n\n        auto it_fida = A_cid_fid_to_pid[cid_a].find(fid_a);\n        if (it_fida == A_cid_fid_to_pid[cid_a].end()) continue;\n\n        auto it_fidb = B_cid_fid_to_pid[cid_b].find(fid_b);\n        if (it_fidb == B_cid_fid_to_pid[cid_b].end()) continue;\n\n        int pid_a = it_fida->second;\n        int pid_b = it_fidb->second;\n\n        VoteMap[pid_a][pid_b]++;\n      }\n    }\n  }\n\n  // For each pid in A, keep the pid in B with most votes\n  std::map<int, std::map<int, int>> B2A_Version0;  // still not fully one-to-one\n  for (auto it_a = VoteMap.begin(); it_a != VoteMap.end(); it_a++) {\n    auto & M = it_a->second;  // all pid_b corresp to given pid_a with their votes\n    int pid_a = it_a->first;\n    int best_pid_b = -1;\n    int max_vote = -1;\n    for (auto it_b = M.begin(); it_b != M.end(); it_b++) {\n      int pid_b = it_b->first;\n      int vote = it_b->second;\n      if (vote > max_vote) {\n        best_pid_b = pid_b;\n        max_vote = vote;\n      }\n    }\n    B2A_Version0[best_pid_b][pid_a] = max_vote;\n  }\n\n  // And vice-versa\n  for (auto it_b = B2A_Version0.begin(); it_b != B2A_Version0.end(); it_b++) {\n    int pid_b = it_b->first;\n    auto & M = it_b->second;\n    int best_pid_a = -1;\n    int max_vote = -1;\n    for (auto it_a = M.begin(); it_a != M.end(); it_a++) {\n      int pid_a = it_a->first;\n      int vote = it_a->second;\n      if (vote > max_vote) {\n        best_pid_a = pid_a;\n        max_vote = vote;\n      }\n    }\n\n    (*A2B)[best_pid_a] = pid_b;  // track from A and track from B\n    (*B2A)[pid_b] = best_pid_a;  // track from B and track from A\n  }\n}\n\n// Merge the camera poses from both maps using the cid2cid map of\n// indices. By now the poses are in the same coordinate system but\n// some show up in both maps.\nvoid MergePoses(std::map<int, int> & cid2cid,\n                std::vector<Eigen::Affine3d> & world_to_cam) {\n\n  // The total number of output cameras (last new cid value + 1)\n  int num_out_cams = rig::maxMapVal(cid2cid) + 1;\n\n  // Each blob will be original cids that end up being a single cid\n  // after identifying repeat images.\n  std::vector<std::set<int>> blobs(num_out_cams);\n  for (size_t cid = 0; cid < world_to_cam.size(); cid++)\n    blobs[cid2cid[cid]].insert(cid);\n\n  // To merge world_to_cam, find the average rotation and translation\n  // from the two maps.\n  std::vector<Eigen::Affine3d> world_to_cam2(num_out_cams);\n  for (size_t c = 0; c < blobs.size(); c++) {\n    if (blobs[c].size() == 1) {\n      world_to_cam2[c] = world_to_cam[*blobs[c].begin()];\n    } else {\n      int num = blobs[c].size();\n\n      // All cams to merge get equal weight\n      std::vector<double> W(num, 1.0/num);\n\n      std::vector<Eigen::Quaternion<double>> Q(num);\n      world_to_cam2[c].translation() << 0.0, 0.0, 0.0;\n      int pos = -1;\n      for (auto it = blobs[c].begin(); it != blobs[c].end(); it++) {\n        pos++;\n        int cid = *it;\n        Q[pos] = Eigen::Quaternion<double>(world_to_cam[cid].linear());\n\n        world_to_cam2[c].translation()\n          += W[pos]*world_to_cam[cid].translation();\n      }\n      Eigen::Quaternion<double> S = rig::slerp_n(W, Q);\n      world_to_cam2[c].linear() = S.toRotationMatrix();\n    }\n  }\n\n  // Return the updated poses\n  world_to_cam = world_to_cam2;\n\n  return;\n}\n\n// Choose the images to match and load them. It is assumed that in image_files\n// we have the images from the first and then he second maps to merge.\nvoid setupLoadMatchingImages(std::vector<std::string> const& image_files,\n                             rig::RigSet const& R,\n                             std::string const& image_sensor_list,\n                             int map1_len, int map2_len,\n                             int num_image_overlaps_at_endpoints,\n                             // Outputs\n                             std::vector<std::pair<int, int>> & image_pairs,\n                             std::vector<rig::cameraImage> & cams) {\n\n  // sanity check\n  if (map1_len + map2_len != image_files.size())\n    LOG(FATAL) << \"Book-keeping error, total number of images is not right.\\n\";\n\n  // Initialize the outputs\n  image_pairs.clear();\n  cams.resize(image_files.size());\n\n  std::set<int> map1_search, map2_search;  // use sets to avoid duplicates\n  int num = num_image_overlaps_at_endpoints;\n\n  // Images in map1 to search for matches in map2\n  for (int cid = 0; cid < num; cid++)\n    if (cid < map1_len) map1_search.insert(cid);\n  for (int cid = map1_len-num; cid < map1_len; cid++)\n    if (cid >= 0) map1_search.insert(cid);\n\n  // Images in map2 to search for matches in map1. Add map1_len since we will\n  // match map1 and map2 inside of the merged map.\n  for (int cid = 0; cid < num; cid++)\n    if (cid < map2_len) map2_search.insert(map1_len + cid);\n  for (int cid = map2_len-num; cid < map2_len; cid++)\n    if (cid >= 0) map2_search.insert(map1_len + cid);\n\n  // The indices in the merged map between which we need matches. Do not match\n  // an image with itself. That can happen if the maps to merge\n  // have shared images.\n  for (auto it1 = map1_search.begin(); it1 != map1_search.end() ; it1++) {\n    for (auto it2 = map2_search.begin(); it2 != map2_search.end(); it2++) {\n      if (*it1 == *it2)\n        LOG(FATAL) << \"Book-keeping failure in map merging.\";\n      if (image_files[*it1] == image_files[*it2])\n        continue;\n      image_pairs.push_back(std::make_pair(*it1, *it2));\n    }\n  }\n\n  // Allocate a structure having an entry for all images, but load\n  // only those for which we need to find matches.\n  if (!map1_search.empty() && !map2_search.empty())\n    std::cout << \"Loading images to match.\" << std::endl;\n\n  // Infer the sensor type (and timestamp, which is not used)\n  std::vector<int> cam_types;\n  std::vector<double> timestamps;\n  bool flexible_strategy = true;  // can handle with and without separate attributes\n  rig::readImageSensorTimestamp(image_sensor_list, image_files, R.cam_names,\n                                      flexible_strategy,\n                                      // Outputs\n                                      cam_types, timestamps);\n\n  for (size_t cid = 0; cid < image_files.size(); cid++) {\n    auto & c = cams[cid];  // alias\n    // Populate most fields. All we need is the image data and camera type.\n    c.image_name = image_files[cid];\n    c.camera_type = cam_types[cid];\n    c.timestamp = timestamps[cid];\n    if (map1_search.find(cid) != map1_search.end() ||\n        map2_search.find(cid) != map2_search.end()) {\n      c.image = cv::imread(c.image_name, cv::IMREAD_GRAYSCALE);\n    }\n  }\n}\n\n// Compute the transform from the B map to the A map by finding the median\n// transform based on the shared images\nEigen::Affine3d computeTransformFromBToA(const asp::nvmData& A,\n                                         const asp::nvmData& B) {\n  // Calc all transforms from B poses to A poses\n  std::vector<Eigen::MatrixXd> B2A_vec;\n\n  // Put the B poses in a map\n  std::map<std::string, Eigen::Affine3d> B_world2cam;\n  for (size_t cid = 0; cid < B.world_to_cam.size(); cid++)\n    B_world2cam[B.cid_to_filename[cid]] = B.world_to_cam[cid];\n\n  // Find the transform from B to A based on shared poses\n  for (size_t cid = 0; cid < A.cid_to_filename.size(); cid++) {\n    auto b_it = B_world2cam.find(A.cid_to_filename[cid]);\n    if (b_it == B_world2cam.end())\n      continue;\n\n    auto const& A_world2cam = A.world_to_cam[cid];\n    auto const& B_world2cam = b_it->second;\n\n    // Go from world of B to world of A\n    B2A_vec.push_back(((A_world2cam.inverse()) * B_world2cam).matrix());\n  }\n\n  // Find the median transform, for robustness\n  Eigen::Affine3d B2A_trans;\n  B2A_trans.matrix() = rig::median_matrix(B2A_vec);\n\n  return B2A_trans;\n}\n\n// Given a set of points in 3D, heuristically estimate what it means\n// for two points to be \"not far\" from each other. The logic is to\n// find a bounding box of an inner cluster and multiply that by 0.1.\ndouble estimateCloseDistance(std::vector<Eigen::Vector3d> const& vec) {\n  Eigen::Vector3d range;\n  int num_pts = vec.size();\n  if (num_pts <= 0)\n    LOG(FATAL) << \"Empty set of points.\\n\";  // to avoid a segfault\n\n  std::vector<double> vals(num_pts);\n  for (int it = 0; it < range.size(); it++) {  // iterate in each coordinate\n    // Sort all values in given coordinate\n    for (int p = 0; p < num_pts; p++)\n      vals[p] = vec[p][it];\n    std::sort(vals.begin(), vals.end());\n\n    // Find some percentiles\n    int min_p = round(num_pts*0.25);\n    int max_p = round(num_pts*0.75);\n    if (min_p >= num_pts) min_p = num_pts - 1;\n    if (max_p >= num_pts) max_p = num_pts - 1;\n    double min_val = vals[min_p], max_val = vals[max_p];\n    range[it] = 0.1*(max_val - min_val);\n  }\n\n  // Find the average of all ranges\n  double range_val = 0.0;\n  for (int it = 0; it < range.size(); it++)\n    range_val += range[it];\n  range_val /= range.size();\n\n  return range_val;\n}\n// This fitting functor attempts to find a rotation + translation + scale transformation\n// between two vectors of points.\nstruct TranslationRotationScaleFittingFunctor {\n  typedef Eigen::Affine3d result_type;\n\n  // A transformation requires 3 inputs and 3 outputs to make a fit.\n  size_t min_elements_needed_for_fit() const { return 3; }\n\n  result_type operator() (std::vector<Eigen::Vector3d> const& in_vec,\n                          std::vector<Eigen::Vector3d> const& out_vec) const {\n    // check consistency\n    if (in_vec.size() != out_vec.size())\n      LOG(FATAL) << \"There must be as many inputs as outputs to be \"\n                 << \"able to compute a transform between them.\\n\";\n    if (in_vec.size() < min_elements_needed_for_fit())\n      LOG(FATAL) << \"Cannot compute a transformation. Insufficient data.\\n\";\n\n    Eigen::Matrix3Xd in_mat  = Eigen::MatrixXd(3, in_vec.size());\n    Eigen::Matrix3Xd out_mat = Eigen::MatrixXd(3, in_vec.size());\n    for (size_t it = 0; it < in_vec.size(); it++) {\n      in_mat.col(it)  = in_vec[it];\n      out_mat.col(it) = out_vec[it];\n    }\n    result_type out_trans;\n    rig::Find3DAffineTransform(in_mat, out_mat, &out_trans);\n    return out_trans;\n  }\n};\n\n// How well does the given transform do to map p1 to p2.\nstruct TransformError {\n  double operator() (Eigen::Affine3d const& T, Eigen::Vector3d const& p1,\n                     Eigen::Vector3d const& p2) const {\n    return (T*p1 - p2).norm();\n  }\n};\n\n// Estimate the transform from B_xyz_vec to A_xyz_vec using RANSAC.\n// A lot of outliers are possible.\nEigen::Affine3d findMapToMapTransform(const std::vector<Eigen::Vector3d>& A_xyz_vec,\n                                      const std::vector<Eigen::Vector3d>& B_xyz_vec,\n                                      const double close_dist) {\n\n  double inlier_threshold = estimateCloseDistance(A_xyz_vec);\n  if (close_dist > 0.0)\n    inlier_threshold = close_dist;  // user-set value\n\n  std::cout << \"3D points are declared to be rather close if their distance is \"\n            << inlier_threshold << \" meters (option --close_dist). \"\n            << \"Using this as inlier threshold.\\n\";\n\n  int  num_iterations = 1000;\n  int  min_num_output_inliers = A_xyz_vec.size()/2;\n  bool reduce_min_num_output_inliers_if_no_fit = true;  // If too many outliers\n  bool increase_threshold_if_no_fit = false;  // better fail than give bad results\n  std::vector<size_t> inlier_indices;\n  Eigen::Affine3d B2A_trans;\n  try {\n    RandomSampleConsensus<TranslationRotationScaleFittingFunctor, TransformError>\n      ransac(TranslationRotationScaleFittingFunctor(),\n             TransformError(), num_iterations,\n             inlier_threshold, min_num_output_inliers,\n             reduce_min_num_output_inliers_if_no_fit, increase_threshold_if_no_fit);\n    B2A_trans = ransac(B_xyz_vec, A_xyz_vec);\n    inlier_indices\n      = ransac.inlier_indices(B2A_trans, B_xyz_vec, A_xyz_vec);\n  } catch(std::exception const& e) {\n    LOG(FATAL) << e.what() << \"\\n\" << \"Consider adjusting --close_dist or \"\n               << \"taking a closer look at your maps. They should have \"\n               << \"mostly images with non-small baseline.\";\n  }\n\n  std::cout << \"Number of RANSAC inliers: \" << inlier_indices.size() << \" (\"\n            << (100.0 * inlier_indices.size()) / A_xyz_vec.size() << \" %)\\n\";\n\n  return B2A_trans;\n}\n\n// Find how to map cids which may have repetition, to new unique cid.\n// Also sort the new cid by image name.\nvoid findCidToCid(std::vector<std::string> const& cid_to_filename,\n                  std::map<int, int> & cid2cid, int & num_out_cams) {\n\n  // Wipe the outputs\n  cid2cid.clear();\n  num_out_cams = 0;\n\n  std::vector<std::string> sorted = cid_to_filename;  // make a copy\n  std::sort(sorted.begin(), sorted.end());\n\n  // The new index of each image after rm repetitions\n  std::map<std::string, int> image2cid;\n  for (size_t cid = 0; cid < sorted.size(); cid++) {\n    std::string img = sorted[cid];\n    if (image2cid.find(img) == image2cid.end()) {\n      image2cid[img] = num_out_cams;\n      num_out_cams++;\n    }\n  }\n\n  // The index of the cid after removing the repetitions\n  for (size_t cid = 0; cid < cid_to_filename.size(); cid++)\n    cid2cid[cid] = image2cid[cid_to_filename[cid]];\n  if (num_out_cams != rig::maxMapVal(cid2cid) + 1)  // sanity check\n    LOG(FATAL) << \"Book-keeping error in findCidToCid().\\n\";\n}\n\n// Merge the camera names using cid2cid, which remaps the cid to remove repetitions\n// and sort the images by time.\nvoid mergeCameraNames(std::vector<std::string> & cid_to_filename,\n                      const std::map<int, int> & cid2cid,\n                      int num_out_cams) {\n  std::vector<std::string> cid_to_filename2(num_out_cams);\n  for (size_t cid = 0; cid < cid_to_filename.size(); cid++) {\n    auto it = cid2cid.find(cid);\n    if (it == cid2cid.end())\n      LOG(FATAL) << \"cid2cid does not contain cid \" << cid << \".\\n\";\n    cid_to_filename2.at(it->second) = cid_to_filename[cid];\n  }\n\n  cid_to_filename = cid_to_filename2;\n}\n\n// Merge the camera poses using cid2cid, which remaps the cids to remove repetitions.\nvoid mergeCameraPoses(std::vector<rig::cameraImage> &C_cams,\n                      std::map<int, int> const& cid2cid,\n                      int num_out_cams) {\n  std::vector<rig::cameraImage> merged_cams(num_out_cams);\n  for (size_t cid = 0; cid < C_cams.size(); cid++) {\n    auto it = cid2cid.find(cid);\n    if (it == cid2cid.end())\n      LOG(FATAL) << \"cid2cid does not contain cid \" << cid << \".\\n\";\n    merged_cams[it->second] = C_cams[cid];\n  }\n\n  C_cams = merged_cams;\n}\n\n// Merge two maps. See sfm_merge.cc. Approach: Find matches among\n// several images in map A and several in map B, based on\n// num_image_overlaps_at_endpoints. Then build tracks (so merging the\n// pairwise matches into tracks). If a track is partially in A and\n// partially in B, (with at least two features in each), that makes it\n// possible to find a triangulated point in A and one in B for that\n// track. Doing RANSAC between them will find the transform from B to\n// A. Then merge the transformed poses, remove the repeated images,\n// and concatenate and remove repetitions from tracks.  If the\n// -fast_merge flag is used, find the transform between the maps using\n// shared poses.  It is assumed features in keypoint maps are not\n// shifted relative to the optical center. The caller is responsible\n// to ensure that.\n// TODO(oalexan1): Modularize and move to some new tracks.cc file,\n// together with other logic from interest_point.cc.\nvoid MergeMaps(asp::nvmData const& A,\n               asp::nvmData const& B,\n               rig::RigSet const& R,\n               int num_image_overlaps_at_endpoints,\n               bool fast_merge,\n               bool no_transform,\n               double close_dist,\n               std::string const& image_sensor_list,\n               int num_threads,\n               asp::nvmData & C) {  // output merged map\n\n  // Wipe the output\n  C = asp::nvmData();\n\n  if (fast_merge && num_image_overlaps_at_endpoints > 0) {\n    std::cout << \"Setting number of image overlaps at end points to zero, \"\n              << \"as fast merging is used.\\n\";\n    num_image_overlaps_at_endpoints = 0;\n  }\n\n  // Merge things that make sense to merge and are easy to do. Later\n  // some of these will be shrunk if the input maps have shared data.\n  int num_acid = A.cid_to_filename.size();\n  int num_bcid = B.cid_to_filename.size();\n  int num_ccid = num_acid + num_bcid;\n\n  // Concatenate the images from A and B into C.\n  C.cid_to_filename.clear();\n  C.cid_to_filename.insert(C.cid_to_filename.end(),\n                           A.cid_to_filename.begin(), A.cid_to_filename.end());\n  C.cid_to_filename.insert(C.cid_to_filename.end(),\n                           B.cid_to_filename.begin(), B.cid_to_filename.end());\n\n  std::vector<rig::cameraImage> C_cams;\n  std::vector<std::pair<int, int>> image_pairs;\n  setupLoadMatchingImages(C.cid_to_filename, R, image_sensor_list,\n                          num_acid, num_bcid,\n                          num_image_overlaps_at_endpoints,\n                          image_pairs, C_cams);  // Outputs\n\n  Eigen::Affine3d B2A_trans = Eigen::Affine3d::Identity();\n  if (fast_merge || no_transform) {\n\n    // This will be empty, as we add no new features, during merging,\n    // but ensure it has the right size.\n    C.cid_to_keypoint_map.clear();\n    C.cid_to_keypoint_map.resize(C.cid_to_filename.size());\n\n    // Compute the transform from the B map to the A map by finding the median\n    // transform based on the shared images\n    if (!no_transform)\n      B2A_trans = computeTransformFromBToA(A, B);\n\n  } else {\n    // Find corresponding triangulated points between the maps which will\n    // result in the transform between them.\n\n    // Find features among matching images\n    std::string out_dir = \"\";\n    bool save_matches = false;\n    int num_overlaps = 0;  // will use image_pairs\n    rig::KeypointVec C_keypoint_vec;\n    int initial_max_reprojection_error = -1;  // won't be used\n    bool verbose = false;\n    bool filter_matches_using_cams = false;  // do not have a single camera set yet\n    bool read_nvm_no_shift = true;  // not used, part of the api\n    bool no_nvm_matches = true;  // not used, part of the api\n    asp::nvmData empty_nvm;  // not used, part of the api\n    C.world_to_cam.resize(C.cid_to_filename.size());  // won't be used\n    std::cout << \"Number of image pairs to match: \" << image_pairs.size() << std::endl;\n    std::vector<Eigen::Vector3d> local_xyz_vec;  // not used\n    rig::detectAddFeatures(// Inputs\n                           C_cams, R.cam_params, out_dir, save_matches,\n                           filter_matches_using_cams,\n                           C.world_to_cam,\n                           num_overlaps, image_pairs,\n                           initial_max_reprojection_error, num_threads,\n                           read_nvm_no_shift, no_nvm_matches, verbose,\n                           // Outputs\n                           C_keypoint_vec, C.pid_to_cid_fid, local_xyz_vec,\n                           empty_nvm);\n\n    // Split intro corresponding tracks in the two maps\n    rig::PidCidFid A_pid_to_cid_fid, B_pid_to_cid_fid;\n    rig::KeypointVec A_keypoint_vec, B_keypoint_vec;\n    std::vector<rig::cameraImage> A_cams, B_cams;\n    rig::splitTracksOneToOne(// Inputs\n                                   num_acid, C.pid_to_cid_fid, C_keypoint_vec, C_cams,\n                                   // Outputs\n                                   A_pid_to_cid_fid, B_pid_to_cid_fid,\n                                   A_keypoint_vec, B_keypoint_vec,\n                                   A_cams, B_cams);\n\n#if 1\n    // TODO(oalexan1): This should be a function called findMatchingTriPoints().\n    // Flag as outliers features outside of the distorted crop box\n    PidCidFidMap A_pid_cid_fid_inlier, B_pid_cid_fid_inlier;\n    rig::flagOutlierByExclusionDist(// Inputs\n                                          R.cam_params, A_cams, A_pid_to_cid_fid,\n                                          A_keypoint_vec,\n                                          // Outputs\n                                          A_pid_cid_fid_inlier);\n    rig::flagOutlierByExclusionDist(// Inputs\n                                          R.cam_params, B_cams, B_pid_to_cid_fid,\n                                          B_keypoint_vec,\n                                          // Outputs\n                                          B_pid_cid_fid_inlier);\n\n    // Find triangulated points\n    std::vector<Eigen::Vector3d> A_xyz_vec, B_xyz_vec;  // triangulated points go here\n    rig::multiViewTriangulation(// Inputs\n                                      R.cam_params, A_cams, A.world_to_cam,\n                                      A_pid_to_cid_fid,\n                                      A_keypoint_vec,\n                                      // Outputs\n                                      A_pid_cid_fid_inlier, A_xyz_vec);\n    rig::multiViewTriangulation(// Inputs\n                                      R.cam_params, B_cams,\n                                      B.world_to_cam,\n                                      B_pid_to_cid_fid,\n                                      B_keypoint_vec,\n                                      // Outputs\n                                      B_pid_cid_fid_inlier, B_xyz_vec);\n\n    // Keep only the good points\n    int count = 0;\n    for (size_t pid = 0; pid < A_xyz_vec.size(); pid++) {\n      if (!rig::isGoodTri(A_xyz_vec[pid]) || !rig::isGoodTri(B_xyz_vec[pid]))\n        continue;\n      A_xyz_vec[count] = A_xyz_vec[pid];\n      B_xyz_vec[count] = B_xyz_vec[pid];\n      count++;\n    }\n    A_xyz_vec.resize(count);\n    B_xyz_vec.resize(count);\n#endif\n\n    // Use the triangulated points and RANSAC to find the B to A transform\n    B2A_trans = findMapToMapTransform(A_xyz_vec, B_xyz_vec, close_dist);\n\n    // Convert keypoints to nvm format, updating C.cid_to_keypoint_map.\n    C.cid_to_keypoint_map.resize(C.cid_to_filename.size());\n    for (size_t cid = 0; cid < C.cid_to_filename.size(); cid++)\n      rig::vec2eigen(C_keypoint_vec[cid], C.cid_to_keypoint_map[cid]);\n    C_keypoint_vec = rig::KeypointVec ();  // wipe this\n\n  }  // end finding the transform using matches\n\n  // In either case print the found transform\n  std::cout << \"Affine transform from second map to first map:\\n\";\n  std::cout << \"Rotation + scale:\\n\" << B2A_trans.linear()  << \"\\n\";\n  std::cout << \"Translation: \" << B2A_trans.translation().transpose() << \"\\n\";\n\n  // Bring the B map cameras in the A map coordinate system. Do not modify\n  // B.world_to_cam, but make a copy of it in B_trans_world2cam.\n  std::vector<Eigen::Affine3d> B_trans_world2cam = B.world_to_cam;\n  rig::TransformCameras(B2A_trans, B_trans_world2cam);\n\n  // Append all to the C map. Note how we use the transformed B.\n  C.world_to_cam.clear();\n  C.world_to_cam.insert(C.world_to_cam.end(),\n                           A.world_to_cam.begin(), A.world_to_cam.end());\n  C.world_to_cam.insert(C.world_to_cam.end(),\n                               B_trans_world2cam.begin(), B_trans_world2cam.end());\n\n  // Find how to map cid to new cid which will not have\n  // repetition. Also sort by image name.\n  std::map<int, int> cid2cid;\n  int num_out_cams = 0;\n  findCidToCid(C.cid_to_filename, cid2cid, num_out_cams);\n\n  // Update C.world_to_cam by merging poses for same images in the two maps\n  MergePoses(cid2cid, C.world_to_cam);\n\n  // Merge the camera names too, based on cid2cid\n  mergeCameraNames(C.cid_to_filename, cid2cid, num_out_cams);\n\n#if 1\n  // By now we have 3 maps: A, B, and the new one in C having shared\n  // tracks. Each of these has its own images and indices, and C\n  // has repeated indices too, and need to merge them all into\n  // a single set of tracks. We will not merge tracks, just remove\n  // duplicates.\n  // Factor this block out and call it mergeTracks().\n  // Note that keypoint_offsets are applied before the cid2cid transform gets used!\n  // There must be enough for all the input cameras.\n  // This is very error-prone!\n  std::vector<Eigen::Vector2d> keypoint_offsets(num_acid + num_bcid,\n                                                Eigen::Vector2d(0, 0));\n  KeyPointMap merged_keypoint_map(num_out_cams);\n  std::vector<int> find_count(num_out_cams, 0);  // how many keypoints so far\n  rig::PidCidFid merged_pid_to_cid_fid;\n  // Add A\n  int cid_shift = 0;  // A and C start with same images, so no shift\n  rig::transformAppendNvm(A.pid_to_cid_fid, A.cid_to_keypoint_map,\n                                cid2cid, keypoint_offsets, cid_shift, num_out_cams,\n                                // Append below\n                                find_count, merged_keypoint_map,\n                                merged_pid_to_cid_fid);\n  // Add B\n  cid_shift = num_acid;  // the B map starts later\n  rig::transformAppendNvm(B.pid_to_cid_fid, B.cid_to_keypoint_map,\n                                cid2cid, keypoint_offsets, cid_shift, num_out_cams,\n                                // Append below\n                                find_count, merged_keypoint_map,\n                                merged_pid_to_cid_fid);\n  // Add C\n  cid_shift = 0;  // no shift, C is consistent with itself\n  rig::transformAppendNvm(C.pid_to_cid_fid, C.cid_to_keypoint_map,\n                                cid2cid, keypoint_offsets, cid_shift, num_out_cams,\n                                // Append below\n                                find_count, merged_keypoint_map,\n                                merged_pid_to_cid_fid);\n\n  // Overwrite C.pid_to_cid_fid after the merge\n  C.pid_to_cid_fid = merged_pid_to_cid_fid;\n  merged_pid_to_cid_fid = rig::PidCidFid();\n\n  // Remove duplicate tracks\n  rig::rmDuplicateTracks(C.pid_to_cid_fid);\n\n  // Update C.cid_to_keypoint_map. This has the same data as\n  // merged_keypoint_map but need to reverse key and value and use\n  // an Eigen::Matrix.\n  C.cid_to_keypoint_map.clear();\n  C.cid_to_keypoint_map.resize(num_out_cams);\n  for (int cid = 0; cid < num_out_cams; cid++) {\n    auto const& map = merged_keypoint_map[cid];  // alias\n    C.cid_to_keypoint_map[cid] = Eigen::MatrixXd(2, map.size());\n    for (auto map_it = map.begin(); map_it != map.end(); map_it++) {\n      std::pair<float, float> const& K = map_it->first;\n      int fid = map_it->second;\n      C.cid_to_keypoint_map.at(cid).col(fid) = Eigen::Vector2d(K.first, K.second);\n    }\n  }\n#endif\n\n  // Merge the camera poses as well (remove duplicates)\n  mergeCameraPoses(C_cams, cid2cid, num_out_cams);\n\n  // Create C_keypoint_vec. Same info as C.cid_to_keypoint_map but different structure.\n  rig::KeypointVec C_keypoint_vec;\n  C_keypoint_vec.resize(num_out_cams);\n  for (int cid = 0; cid < num_out_cams; cid++)\n    rig::eigen2vec(C.cid_to_keypoint_map[cid], C_keypoint_vec[cid]);\n\n  // Flag outliers\n  PidCidFidMap C_pid_cid_fid_inlier;\n  rig::flagOutlierByExclusionDist(// Inputs\n                                  R.cam_params, C_cams, C.pid_to_cid_fid,\n                                  C_keypoint_vec,\n                                  // Outputs\n                                  C_pid_cid_fid_inlier);\n\n  // Triangulate the merged tracks with merged cameras\n  rig::multiViewTriangulation(// Inputs\n                              R.cam_params, C_cams, C.world_to_cam,\n                              C.pid_to_cid_fid, C_keypoint_vec,\n                              // Outputs\n                              C_pid_cid_fid_inlier, C.pid_to_xyz);\n\n  // TODO(oalexan1): Should one remove outliers from tri points\n  // and C.pid_to_cid_fid?\n}\n\n}\n\n"
  },
  {
    "path": "src/asp/Rig/MergeMaps.h",
    "content": "#ifndef ASP_RIG_MERGE_MAPS_H\n#define ASP_RIG_MERGE_MAPS_H\n\n#include <string>\n\nnamespace rig {\n  class CameraParameters;\n}\n\nnamespace asp {\n  class nvmData;\n}\n\nnamespace rig {\n\nclass RigSet;\n  \n// Merge two maps\nvoid MergeMaps(asp::nvmData const& A_in,\n               asp::nvmData const& B_in,\n               rig::RigSet const& R,\n               int num_image_overlaps_at_endpoints,\n               bool fast_merge,\n               bool no_transform,\n               double close_dist,\n               std::string const& image_sensor_list,\n               int num_threads, \n               asp::nvmData & C_out);\n\n}  // namespace rig\n\n#endif  // ASP_RIG_MERGE_MAPS_H\n"
  },
  {
    "path": "src/asp/Rig/NvmUtils.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  https://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Rig/NvmUtils.h>\n#include <asp/Rig/SystemUtils.h>\n#include <asp/Rig/BasicAlgs.h>\n#include <asp/Rig/Triangulation.h>\n#include <asp/Rig/RigTypeDefs.h>\n#include <asp/OpenMVG/tracks.hpp>\n\n#include <glog/logging.h>\n\n#include <iostream>\n#include <string>\n#include <set>\n\nnamespace rig {\n\n// The nvm file produced by Theia can have files in arbitrary order. Find the map\n// which will help bring the cid in the correct order.\nvoid findCidReorderMap(asp::nvmData const& nvm,\n                       std::vector<rig::cameraImage> const& cams,\n                       // output\n                       std::map<int, int> & nvm_cid_to_cams_cid) {\n\n  // Wipe the output\n  nvm_cid_to_cams_cid.clear();\n\n  // First find how to map each cid from nvm to cid in 'cams'.\n  std::map<std::string, int> nvm_image_name_to_cid;\n  for (size_t nvm_cid = 0; nvm_cid < nvm.cid_to_filename.size(); nvm_cid++) {\n    nvm_image_name_to_cid[nvm.cid_to_filename[nvm_cid]] = nvm_cid;\n  }\n\n  std::set<std::string> cam_set;\n  for (size_t cid = 0; cid < cams.size(); cid++) {\n    std::string const& image_name = cams[cid].image_name;\n    cam_set.insert(image_name);\n\n    auto nvm_it = nvm_image_name_to_cid.find(image_name);\n    if (nvm_it == nvm_image_name_to_cid.end())\n      LOG(FATAL) << \"Could not look up image: \" << image_name\n                 << \" in the input nvm file. Likely the input reconstruction \"\n                 << \"is incomplete.\\n\";\n    int nvm_cid = nvm_it->second;\n    nvm_cid_to_cams_cid[nvm_cid] = cid;\n  }\n\n  // This is an important sanity check. Warn the user when not all images\n  // from the NVM file are among the ones being used.\n  if (cams.size() < nvm.cid_to_filename.size()) {\n    std::cout << \"Warning: Some input images are not present among the images being used. \"\n              << \"Perhaps they were removed during bracketing. Only images bracketed in time \"\n              << \"by reference sensor images can be used. Excluded images:\\n\";\n    for (size_t nvm_it = 0; nvm_it < nvm.cid_to_filename.size(); nvm_it++) {\n      if (cam_set.find(nvm.cid_to_filename[nvm_it]) == cam_set.end())\n        std::cout << nvm.cid_to_filename[nvm_it] << std::endl;\n    }\n  }\n\n  return;\n}\n\n// For nvm data that has the keypoints shifted relative to the optical\n// center, undo this shift when 'undo_shift' is true. So, add the optical center.\n// When 'undo_shift' is false, subtract the optical center.\nvoid shiftKeypoints(bool undo_shift, rig::RigSet const& R,\n                    asp::nvmData & nvm) {  // output\n\n  for (size_t cid = 0; cid < nvm.cid_to_filename.size(); cid++) {\n    std::string const& image_name = nvm.cid_to_filename[cid];  // alias\n\n    auto it = nvm.optical_centers.find(image_name);\n    if (it == nvm.optical_centers.end())\n      LOG(FATAL) << \"Could not find optical center for image: \" << image_name << \".\\n\";\n    Eigen::Vector2d keypoint_offset = it->second;\n\n    int num_fid = nvm.cid_to_keypoint_map[cid].cols();\n    for (int fid = 0; fid < num_fid; fid++) {\n      if (undo_shift)\n        nvm.cid_to_keypoint_map.at(cid).col(fid) += keypoint_offset;\n      else\n        nvm.cid_to_keypoint_map.at(cid).col(fid) -= keypoint_offset;\n    }\n  }\n\n  return;\n}\n\n// Transform nvm matches. Account for the fact that the nvm file will\n// likely have the images in different order than in the 'cams'\n// vector, and may have more such images, as later we may have used\n// bracketing to thin them out. Also many need to add a keypoint\n// offset.\n// TODO(oalexan1): Integrate this with transformAppendNvm().\nvoid transformNvm(// Inputs\n                  std::vector<rig::cameraImage> const& cams,\n                  std::vector<Eigen::Vector2d>  const& keypoint_offsets,\n                  asp::nvmData                  const& nvm,\n                  // Outputs\n                  rig::PidCidFid                     & pid_to_cid_fid,\n                  rig::KeypointVec                   & keypoint_vec,\n                  std::vector<Eigen::Vector3d>       & xyz_vec) {\n\n  // Sanity checks\n  if (!keypoint_vec.empty() && keypoint_vec.size() != cams.size())\n    LOG(FATAL) << \"There must be as many sets of keypoints as images, or none at all.\\n\";\n  if (nvm.pid_to_cid_fid.size() != nvm.pid_to_xyz.size())\n    LOG(FATAL) << \"There must be as many tracks as triangulated points for them.\\n\";\n\n  // Wipe the outputs\n  pid_to_cid_fid.clear();\n  keypoint_vec.clear();\n  keypoint_vec.resize(cams.size());\n  xyz_vec.clear();\n\n  // Find how to map each cid from nvm to cid in 'cams'.\n  std::map<int, int> nvm_cid_to_cams_cid;\n  rig::findCidReorderMap(nvm, cams,\n                               nvm_cid_to_cams_cid);  // output\n\n  // Get new pid_to_cid_fid and keypoint_vec. Note that we ignore the triangulated\n  // points in nvm.pid_to_xyz. Triangulation will be redone later.\n  for (size_t pid = 0; pid < nvm.pid_to_cid_fid.size(); pid++) {\n\n    // Ignore triangulated points that are NaN, Inf, or (0, 0, 0).\n    if (!rig::isGoodTri(nvm.pid_to_xyz[pid]))\n      continue;\n\n    std::map<int, int> out_cid_fid;\n    for (auto cid_fid = nvm.pid_to_cid_fid[pid].begin();\n         cid_fid != nvm.pid_to_cid_fid[pid].end(); cid_fid++) {\n\n      int nvm_cid = cid_fid->first;\n      int nvm_fid = cid_fid->second;\n      Eigen::Vector2d keypoint = nvm.cid_to_keypoint_map.at(nvm_cid).col(nvm_fid);\n\n      // Find cid value in 'cams' based on cid value in the nvm\n      auto it = nvm_cid_to_cams_cid.find(nvm_cid);\n      if (it == nvm_cid_to_cams_cid.end())\n        continue;  // this image may not have been within brackets and was thrown out\n      int cid = it->second;\n\n      // Add the optical center shift, if needed\n      keypoint += keypoint_offsets[cid];\n\n      int fid = keypoint_vec[cid].size();  // this is before we add the keypoint\n      out_cid_fid[cid] = fid;\n      // After the push back, size is fid + 1\n      keypoint_vec[cid].push_back(std::make_pair(keypoint[0], keypoint[1]));\n    }\n\n    // Keep only the tracks with at least two matches, and corresponding xyz\n    if (out_cid_fid.size() > 1) {\n      pid_to_cid_fid.push_back(out_cid_fid);\n      xyz_vec.push_back(nvm.pid_to_xyz[pid]);\n    }\n\n  }  // end iterating over nvm pid\n}\n\n// Helper function to find a keypoint for given iterator and update cid in the merged\n// map with repetitions removed (via cid2cid).\nbool updateCidFindKeypoint(std::map<int, int>::const_iterator map_it,\n                           rig::CidToKeypointMatVec const& cid_to_keypoint_map,\n                           std::map<int, int>            const& cid2cid,\n                           std::vector<Eigen::Vector2d>  const& keypoint_offsets,\n                           int cid_shift,\n                           // outputs\n                           int                                & cid,\n                           std::pair<float, float>            & K) {\n\n  // Start with the cid in the input map\n  cid = map_it->first;\n  int fid = map_it->second;\n  Eigen::Vector2d const& P = cid_to_keypoint_map.at(cid).col(fid);  // alias\n  K = std::pair<float, float>(P[0], P[1]);  // the keypoint\n\n  // Let the cid value point to the merged map, before removing repetitions\n  cid += cid_shift;  // only for map B that gets appended, which starts later\n\n  // Add the keypoint offset, using the updated cid\n  K.first  += keypoint_offsets.at(cid)[0];\n  K.second += keypoint_offsets.at(cid)[1];\n\n  // cid gets replaced by cid2cid[cid], the value after removing repetitions\n  auto it = cid2cid.find(cid);\n  if (it == cid2cid.end())\n    return false;  // cid2cid is missing this keypoint, just ignore it\n\n  cid = it->second;\n\n  return true;\n}\n\n// Given some tracks read from nvm from disk, append the ones from\n// nvm. Some remapping is needed.  given that 'fid' values already\n// exist for the given tracks and that the nvm read from disk\n// may have the images in different order. New keypoints are recorded\n// with the help of fid_count and merged_keypoint_map.\n// Note that keypoint_offsets are applied before the cid2cid transform gets used!\n// This is very error-prone!\n// TODO(oalexan1): cid_shift and keypoint_offsets should be applied outside\n// this function as they make it hard to understand.\nvoid transformAppendNvm(// Append from these\n                        rig::PidCidFid               const& nvm_pid_to_cid_fid,\n                        rig::CidToKeypointMatVec     const& nvm_cid_to_keypoint_map,\n                        std::map<int, int>           const& cid2cid,\n                        std::vector<Eigen::Vector2d> const& keypoint_offsets,\n                        int cid_shift,\n                        size_t num_out_cams,\n                        // Outputs, append to these\n                        std::vector<int>                  & fid_count,\n                        KeyPointMap                       & merged_keypoint_map,\n                        rig::PidCidFid                    & pid_to_cid_fid) {\n\n  // Sanity checks\n  if (num_out_cams != fid_count.size())\n    LOG(FATAL) << \"Keypoint count was not initialized correctly.\\n\";\n  if (num_out_cams != merged_keypoint_map.size())\n    LOG(FATAL) << \"Keypoint map was not initialized correctly.\\n\";\n  if (num_out_cams < rig::maxMapVal(cid2cid) + 1)\n    LOG(FATAL) << \"Unexpected value for the size of the output map.\\n\";\n\n  for (size_t pid = 0; pid < nvm_pid_to_cid_fid.size(); pid++) {\n\n    std::map<int, int> out_cid_fid;\n    auto const& cid_fid = nvm_pid_to_cid_fid[pid];  // alias\n    for (auto map_it = cid_fid.begin(); map_it != cid_fid.end(); map_it++) {\n\n      int cid = -1;  // will change soon\n      std::pair<float, float> K;\n      bool ans = updateCidFindKeypoint(map_it, nvm_cid_to_keypoint_map, cid2cid,\n                                       keypoint_offsets, cid_shift,\n                                       cid, K);\n      if (!ans)\n        continue;  // could not lookup cid in cid2cid\n\n      // TODO(oalexan1): Use below the function findFid(), with testing.\n      // Insert K in the keypoint map and increment the count,\n      // unless it already exists. In either case get the fid.\n      auto key_it = merged_keypoint_map.at(cid).find(K);\n      int fid = -1;\n      if (key_it != merged_keypoint_map.at(cid).end()) {\n        fid = key_it->second;\n      } else {\n        // fid is the last count, then increment the count\n        fid = fid_count[cid];\n        merged_keypoint_map.at(cid)[K] = fid_count[cid];\n        fid_count[cid]++;\n      }\n\n      // Create the track\n      out_cid_fid[cid] = fid;\n    }\n\n    // Append the transformed track\n    if (out_cid_fid.size() > 1)\n      pid_to_cid_fid.push_back(out_cid_fid);\n  }\n\n  return;\n}\n\n}  // end namespace rig\n"
  },
  {
    "path": "src/asp/Rig/NvmUtils.h",
    "content": "/* Copyright (c) 2021, United States Government, as represented by the\n * Administrator of the National Aeronautics and Space Administration.\n *\n * All rights reserved.\n *\n * The \"ISAAC - Integrated System for Autonomous and Adaptive Caretaking\n * platform\" software is licensed under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n#pragma once\n\n#include <asp/Core/Nvm.h>\n#include <asp/Rig/CameraImage.h>\n#include <asp/Rig/RigConfig.h>\n#include <asp/Rig/RigTypeDefs.h>\n\n#include <Eigen/Core>\n#include <Eigen/Geometry>\n\n#include <map>\n#include <vector>\n#include <string>\n\n#include <OpenMVG/tracks.hpp>\n\nnamespace rig {\n\n// Helper function to find a keypoint for given iterator and update cid in the merged\n// map with repetitions removed (via cid2cid).\nbool updateCidFindKeypoint(std::map<int, int>::const_iterator map_it,\n                           rig::CidToKeypointMatVec const& cid_to_keypoint_map,\n                           std::map<int, int>            const& cid2cid,\n                           std::vector<Eigen::Vector2d>  const& keypoint_offsets,\n                           int cid_shift,\n                           // outputs\n                           int                                & cid,\n                           std::pair<float, float>            & K);\n\n// The nvm file produced by Theia can have files in arbitrary order. Find the map\n// which will help bring the cid in the correct order.\nvoid findCidReorderMap(asp::nvmData const& nvm,\n                       std::vector<rig::cameraImage> const& cams,\n                       // output\n                       std::map<int, int> & nvm_cid_to_cams_cid);\n\n// For nvm data that has the keypoints shifted relative to the optical\n// center, undo this shift when 'undo_shift' is true. So, add the optical center.\n// When 'undo_shift' is false, subtract the optical center.\nvoid shiftKeypoints(bool undo_shift, rig::RigSet const& R,\n                    asp::nvmData & nvm);  // output\n\n// Transform nvm matches. Account for the fact that the nvm file will\n// likely have the images in different order than in the 'cams'\n// vector, and may have more such images, as later we may have used\n// bracketing to thin them out. Also many need to add a keypoint\n// offset.\n// TODO(oalexan1): Integrate this with transformAppendNvm().\nvoid transformNvm(// Inputs\n                  std::vector<rig::cameraImage> const& cams,\n                  std::vector<Eigen::Vector2d>  const& keypoint_offsets,\n                  asp::nvmData                  const& nvm,\n                  // Outputs\n                  rig::PidCidFid                     & pid_to_cid_fid,\n                  rig::KeypointVec                   & keypoint_vec,\n                  std::vector<Eigen::Vector3d>       & xyz_vec);\n\n// Given some tracks read from nvm from disk, append the ones from\n// nvm. Some remapping is needed.  given that 'fid' values already\n// exist for the given tracks and that the nvm read from disk\n// may have the images in different order. New keypoints are recorded\n// with the help of fid_count and merged_keypoint_map.\n// Note that keypoint_offsets are applied before the cid2cid transform gets used!\n// This is very error-prone!\n// TODO(oalexan1): cid_shift and keypoint_offsets should be applied outside\n// this function as they make it hard to understand.\nvoid transformAppendNvm(// Append from these\n                        rig::PidCidFid               const& nvm_pid_to_cid_fid,\n                        rig::CidToKeypointMatVec     const& nvm_cid_to_keypoint_map,\n                        std::map<int, int>           const& cid2cid,\n                        std::vector<Eigen::Vector2d> const& keypoint_offsets,\n                        int cid_shift,\n                        size_t num_out_cams,\n                        // Outputs, append to these\n                        std::vector<int>                  & fid_count,\n                        KeyPointMap                       & merged_keypoint_map,\n                        rig::PidCidFid                    & pid_to_cid_fid);\n\n}  // end namespace rig\n"
  },
  {
    "path": "src/asp/Rig/Ransac.cc",
    "content": "/* Copyright (c) 2017, United States Government, as represented by the\n * Administrator of the National Aeronautics and Space Administration.\n *\n * All rights reserved.\n *\n * The Astrobee platform is licensed under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n#include <asp/Rig/Ransac.h>\n\n#include <glog/logging.h>\n\n#include <iostream>\n#include <set>\n#include <functional>\n\nnamespace rig {\n\n// Get a given number of unique random integers within a given range\n// (inclusive). It is very important that the generator be stored\n// outside, so we don't always initialize it to the same value. That\n// would result in same random numbers each time this function is\n// called which is very undesirable.\nvoid get_n_unique_integers(int min_val, int max_val, int num,\n                             std::mt19937 * generator, std::vector<int> * values) {\n  // Sanity check\n  if (max_val - min_val + 1 < num) {\n    LOG(FATAL) << \"Cannot get \" << num << \" unique integers in [\"\n               << min_val << \", \" << max_val << \"]\" << std::endl;\n  }\n\n  values->clear();\n  std::set<int> done;\n\n  std::uniform_int_distribution <int> distribution(min_val, max_val);\n\n  while (1) {\n    if (values->size() == static_cast<size_t>(num))\n      break;\n\n    int val = distribution(*generator);\n\n    // If this was encountered, skip it\n    if (done.find(val) != done.end()) continue;\n\n    done.insert(val);\n    values->push_back(val);\n  }\n}\n\n}  // end namespace rig\n"
  },
  {
    "path": "src/asp/Rig/Ransac.h",
    "content": "/* Copyright (c) 2017, United States Government, as represented by the\n * Administrator of the National Aeronautics and Space Administration.\n *\n * All rights reserved.\n *\n * The Astrobee platform is licensed under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n#ifndef ASP_RIG_RANSAC_H\n#define ASP_RIG_RANSAC_H\n\n#include <glog/logging.h>\n\n#include <iostream>\n#include <ctime>\n#include <climits>\n#include <string>\n#include <vector>\n#include <random>\n#include <limits>\n\n\nnamespace rig {\n\n  void get_n_unique_integers(int min_val, int max_val, int num,\n                             std::mt19937 * generator, std::vector<int> * values);\n\n/// RANSAC Driver class\ntemplate <class FittingFuncT, class ErrorFuncT>\nclass RandomSampleConsensus {\n  const FittingFuncT& m_fitting_func;\n  const ErrorFuncT  & m_error_func;\n  int           m_num_iterations;\n  double        m_inlier_threshold;\n  int           m_min_num_output_inliers;\n  bool          m_reduce_min_num_output_inliers_if_no_fit;\n  bool          m_increase_threshold_if_no_fit;\n  std::mt19937  m_generator;\n\n public:\n  // Returns the list of inliers.\n  template <class ContainerT1, class ContainerT2>\n  void inliers(typename FittingFuncT::result_type const& H,\n               std::vector<ContainerT1>  const& p1,\n               std::vector<ContainerT2>  const& p2,\n               std::vector<ContainerT1>       & inliers1,\n               std::vector<ContainerT2>       & inliers2) const {\n    inliers1.clear();\n    inliers2.clear();\n\n    for (size_t i = 0; i < p1.size(); i++) {\n      if (m_error_func(H, p1[i], p2[i]) < m_inlier_threshold) {\n        inliers1.push_back(p1[i]);\n        inliers2.push_back(p2[i]);\n      }\n    }\n  }\n\n  // Returns the list of inlier indices.\n  template <class ContainerT1, class ContainerT2>\n  std::vector<size_t> inlier_indices(typename FittingFuncT::result_type const& H,\n                                     std::vector<ContainerT1>  const& p1,\n                                     std::vector<ContainerT2>  const& p2) const {\n    std::vector<size_t> result;\n    for (size_t i = 0; i < p1.size(); i++)\n      if (m_error_func(H, p1[i], p2[i]) < m_inlier_threshold)\n        result.push_back(i);\n\n    return result;\n  }\n\n  void reduce_min_num_output_inliers() {\n    m_min_num_output_inliers = static_cast<int>(m_min_num_output_inliers/1.5);\n  }\n\n  /// Constructor - Stores all the inputs in member variables\n  RandomSampleConsensus(FittingFuncT const& fitting_func,\n                        ErrorFuncT   const& error_func,\n                        int    num_iterations,\n                        double inlier_threshold,\n                        int    min_num_output_inliers,\n                        bool   reduce_min_num_output_inliers_if_no_fit,\n                        bool   increase_threshold_if_no_fit):\n    m_fitting_func(fitting_func), m_error_func(error_func),\n    m_num_iterations(num_iterations),\n    m_inlier_threshold(inlier_threshold),\n    m_min_num_output_inliers(min_num_output_inliers),\n    m_reduce_min_num_output_inliers_if_no_fit(reduce_min_num_output_inliers_if_no_fit),\n    m_increase_threshold_if_no_fit(increase_threshold_if_no_fit),\n    m_generator(0) // use a fixed seed to give reproducible results\n  {}\n\n  /// As attempt_ransac but keep trying with smaller numbers of required inliers.\n  template <class ContainerT1, class ContainerT2>\n  typename FittingFuncT::result_type operator()(std::vector<ContainerT1> const& p1,\n                                                std::vector<ContainerT2> const& p2) {\n    // Try to fit using RANSAC. Perform repeated fits with smaller\n    // m_min_num_output_inliers if the fit fails and\n    // m_reduce_min_num_output_inliers_if_no_fit is true.\n\n    typename FittingFuncT::result_type H;\n    bool success = false;\n\n    int orig_num_inliers = m_min_num_output_inliers;\n\n    // Try various attempts while getting ever more generous with the\n    // threshold and the number of liners. for each of these, there\n    // will be m_num_iterations attempts.\n    for (int attempt_thresh = 0; attempt_thresh < 10; attempt_thresh++) {\n      for (int attempt_inlier = 0; attempt_inlier < 10; attempt_inlier++) {\n        try {\n          H = attempt_ransac(p1, p2);\n          success = true;\n          break;\n        } catch (const std::exception& e) {\n          std::cout << e.what() << \"\\n\";\n          if (!m_reduce_min_num_output_inliers_if_no_fit)\n            break;\n          reduce_min_num_output_inliers();\n          // A similarity transform needs at least 3 samples\n          if (m_min_num_output_inliers < 3)\n            break;\n          std::cout << \"Attempting RANSAC with \" << m_min_num_output_inliers\n                    << \" output inliers.\\n\";\n        }\n      }\n\n      if (success)\n        break;\n      if (!m_increase_threshold_if_no_fit)\n        break;\n\n      m_min_num_output_inliers = orig_num_inliers;  // restore this\n      m_inlier_threshold *= 1.5;\n      std::cout << \"Increasing the inlier threshold to: \" << m_inlier_threshold << \".\\n\";\n    }\n\n    if (!success)\n      throw std::runtime_error(\"RANSAC was unable to find a fit that matched the supplied data.\");\n    \n    return H;\n  }\n\n  /// Run RANSAC on two input data lists using the current parameters.\n  template <class ContainerT1, class ContainerT2>\n  typename FittingFuncT::result_type attempt_ransac(std::vector<ContainerT1> const& p1,\n                                                    std::vector<ContainerT2> const& p2) {\n    if (p1.empty())\n      LOG(FATAL) << \"RANSAC error. Insufficient data.\\n\";\n    if (p1.size() != p2.size())\n      LOG(FATAL) << \"RANSAC error. Data vectors are not the same size.\\n\";\n\n    int min_elems_for_fit = m_fitting_func.min_elements_needed_for_fit();\n\n    if (static_cast<int>(p1.size()) < min_elems_for_fit)\n      LOG(FATAL) << \"RANSAC error. Not enough potential matches for this fitting functor.\\n\";\n\n    // This one we want to catch.\n    if (m_min_num_output_inliers < min_elems_for_fit)\n      throw std::runtime_error(\"RANSAC error. Number of requested inliers is less than \"\n                               \"min number of elements needed for fit.\\n\");\n\n    typename FittingFuncT::result_type best_H;\n\n    std::vector<ContainerT1> try1;\n    std::vector<ContainerT2> try2;\n    std::vector<int> random_indices(min_elems_for_fit);\n\n    int num_inliers = 0;\n    double min_err = std::numeric_limits<double>::max();\n    for (int iteration = 0; iteration < m_num_iterations; iteration++) {\n      // Get min_elems_for_fit points at random, taking care not to\n      // select the same point twice.\n      int num = p1.size();\n      get_n_unique_integers(0, num - 1, min_elems_for_fit, &m_generator, &random_indices);\n\n      // Resizing below is essential, as by now their size may have changed\n      try1.resize(min_elems_for_fit);\n      try2.resize(min_elems_for_fit);\n      for (int i = 0; i < min_elems_for_fit; i++) {\n        try1[i] = p1[random_indices[i]];\n        try2[i] = p2[random_indices[i]];\n      }\n\n      // 1. Compute the fit using these samples.\n      typename FittingFuncT::result_type H = m_fitting_func(try1, try2);\n\n      // 2. Find all the inliers for this fit.\n      inliers(H, p1, p2, try1, try2);\n\n      // 3. Skip this model if too few inliers.\n      if (static_cast<int>(try1.size()) < m_min_num_output_inliers)\n        continue;\n\n      // 4. Re-estimate the model using the inliers.\n      H = m_fitting_func(try1, try2);\n\n      // 5. Find the mean error for the inliers.\n      double err_val = 0.0;\n      for (size_t i = 0; i < try1.size(); i++)\n        err_val += m_error_func(H, try1[i], try2[i]);\n      err_val /= try1.size();\n\n      // 6. Save this model if its error is lowest so far.\n      if (err_val < min_err) {\n        min_err     = err_val;\n        best_H      = H;\n        num_inliers = try1.size();\n      }\n    }\n\n    if (num_inliers < m_min_num_output_inliers) {\n      // Here throw, to be able to catch it in the caller.\n      std::ostringstream os;\n      os << \"RANSAC was unable to find a fit with \"\n         << m_min_num_output_inliers << \" inliers.\";\n      throw std::runtime_error(os.str());\n    }\n    return best_H;\n  }\n};  // End of RandomSampleConsensus class definition\n\n  // Helper function to instantiate a RANSAC class object and immediately call it\n  template <class ContainerT1, class ContainerT2, class FittingFuncT, class ErrorFuncT>\n  typename FittingFuncT::result_type ransac(std::vector<ContainerT1> const& p1,\n                                            std::vector<ContainerT2> const& p2,\n                                            FittingFuncT             const& fitting_func,\n                                            ErrorFuncT               const& error_func,\n                                            int     num_iterations,\n                                            double  inlier_threshold,\n                                            int     min_num_output_inliers,\n                                            bool    reduce_min_num_output_inliers_if_no_fit,\n                                            bool    increase_threshold_if_no_fit) {\n    RandomSampleConsensus < FittingFuncT, ErrorFuncT>\n      ransac_instance(fitting_func, error_func,\n                      num_iterations, inlier_threshold,\n                      min_num_output_inliers,\n                      reduce_min_num_output_inliers_if_no_fit,\n                      increase_threshold_if_no_fit);\n    return ransac_instance(p1, p2);\n  }\n\n}  // end namespace rig\n\n#endif  // ASP_RIG_RANSAC_H\n"
  },
  {
    "path": "src/asp/Rig/RigCameraParams.cc",
    "content": "/* Copyright (c) 2017, United States Government, as represented by the\n * Administrator of the National Aeronautics and Space Administration.\n * \n * All rights reserved.\n * \n * The Astrobee platform is licensed under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n * \n *     http://www.apache.org/licenses/LICENSE-2.0\n * \n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n#include <asp/Rig/RigCameraParams.h>\n#include <asp/Rig/RigRpcDistortion.h>\n\n#include <Eigen/Dense>\n#include <gflags/gflags.h>\n\n#include <iostream>\n\n#include <glog/logging.h>\n#include <opencv2/highgui/highgui.hpp>\n#include <opencv2/core/core.hpp>\n#include <opencv2/core/eigen.hpp>\n#include <opencv2/calib3d/calib3d.hpp>\n#include <opencv2/imgproc/imgproc.hpp>\n\n#include <fstream>\n#include <iostream>\n\nrig::CameraParameters::CameraParameters(Eigen::Vector2i const& image_size,\n    Eigen::Vector2d const& focal_length,\n    Eigen::Vector2d const& optical_center,\n    Eigen::VectorXd const& distortion,\n    DistortionType distortion_type) {\n  SetDistortedSize(image_size);\n  SetDistortedCropSize(image_size);\n  SetUndistortedSize(image_size);\n  m_focal_length = focal_length;\n  m_optical_offset = optical_center;\n  m_crop_offset.setZero();\n  SetDistortion(distortion);\n  m_distortion_type = distortion_type;\n}\n\nvoid rig::CameraParameters::SetDistortedSize(Eigen::Vector2i const& image_size) {\n  m_distorted_image_size = image_size;\n  m_distorted_half_size = image_size.cast<double>() / 2.0;\n}\n\nconst Eigen::Vector2i& rig::CameraParameters::GetDistortedSize() const {\n  return m_distorted_image_size;\n}\n\nconst Eigen::Vector2d& rig::CameraParameters::GetDistortedHalfSize() const {\n  return m_distorted_half_size;\n}\n\nvoid rig::CameraParameters::SetDistortedCropSize(Eigen::Vector2i const& crop_size) {\n  m_distorted_crop_size = crop_size;\n}\n\nconst Eigen::Vector2i& rig::CameraParameters::GetDistortedCropSize() const {\n  return m_distorted_crop_size;\n}\n\nvoid rig::CameraParameters::SetUndistortedSize(Eigen::Vector2i const& image_size) {\n  m_undistorted_size = image_size;\n  m_undistorted_half_size = image_size.cast<double>() / 2.0;\n}\n\nconst Eigen::Vector2i& rig::CameraParameters::GetUndistortedSize() const {\n  return m_undistorted_size;\n}\n\nconst Eigen::Vector2d& rig::CameraParameters::GetUndistortedHalfSize() const {\n  return m_undistorted_half_size;\n}\n\nvoid rig::CameraParameters::SetCropOffset(Eigen::Vector2i const& crop) {\n  m_crop_offset = crop;\n}\n\nconst Eigen::Vector2i& rig::CameraParameters::GetCropOffset() const {\n  return m_crop_offset;\n}\n\nvoid rig::CameraParameters::SetOpticalOffset(Eigen::Vector2d const& offset) {\n  m_optical_offset = offset;\n}\n\nconst Eigen::Vector2d& rig::CameraParameters::GetOpticalOffset() const {\n  return m_optical_offset;\n}\n\nvoid rig::CameraParameters::SetFocalLength(Eigen::Vector2d const& f) {\n  m_focal_length = f;\n}\n\ndouble rig::CameraParameters::GetFocalLength() const {\n  return m_focal_length.mean();\n}\n\nconst Eigen::Vector2d& rig::CameraParameters::GetFocalVector() const {\n  return m_focal_length;\n}\n\nvoid rig::CameraParameters::SetDistortion(Eigen::VectorXd const& distortion) {\n\n  // Reset this. Will be needed only with RPC distortion.\n  m_rpc = rig::RPCLensDistortion(); \n  \n  m_distortion_coeffs = distortion;\n\n  // Ensure variables are initialized\n  m_distortion_precalc1 = 0;\n  m_distortion_precalc2 = 0;\n  m_distortion_precalc3 = 0;\n\n  switch (m_distortion_coeffs.size()) {\n  case 0:\n    // No lens distortion!\n    break;\n  case 1:\n    // FOV model\n    // inverse alpha\n    m_distortion_precalc1 = 1 / distortion[0];\n    // Inside tangent function\n    m_distortion_precalc2 = 2 * tan(distortion[0] / 2);\n    break;\n  case 4:\n    // Fall through intended.\n  case 5:\n    // Tsai model\n    // There doesn't seem like there are any precalculations we can use.\n    break;\n  default:\n    m_rpc.set_distortion_parameters(m_distortion_coeffs);\n  }\n}\n\nconst Eigen::VectorXd& rig::CameraParameters::GetDistortion() const {\n  return m_distortion_coeffs;\n}\n\n// Typedefs for distortion and Jacobian of distortion function signatures\ntypedef std::function<Eigen::Vector2d(Eigen::Vector2d const&, Eigen::VectorXd const&)> FunT;\ntypedef std::function<Eigen::VectorXd(Eigen::Vector2d const&, Eigen::VectorXd const&, \n                                      double, FunT)> JacT;\n\n// Apply the fisheye distortion model. Input and output are normalized pixels.\nEigen::Vector2d fishEyeDistortionNorm(Eigen::Vector2d const& P, Eigen::VectorXd const& dist) {\n  \n  double k1 = dist[0];\n  double k2 = dist[1];\n  double k3 = dist[2];\n  double k4 = dist[3];\n\n  double x = P[0];\n  double y = P[1];  \n  double r2 = x*x + y*y;\n  double r = sqrt(r2);\n  double theta = atan(r);\n\n  double theta1 = theta*theta;   // theta^2\n  double theta2 = theta1*theta1; // theta^4\n  double theta3 = theta2*theta1; // theta^6\n  double theta4 = theta2*theta2; // theta^8\n  double theta_d = theta*(1 + k1*theta1 + k2*theta2 + k3*theta3 + k4*theta4);\n  \n  // Careful with the case where r is very small\n  double scale = 1.0;\n  if (r > 1e-8)\n    scale = theta_d / r;\n\n  return Eigen::Vector2d(x*scale, y*scale);\n}\n\n// Find the Jacobian of a function at a given point using numerical differentiation.\n// A good value for the step is 1e-6. Note that above we use a tolerance of 1e-8\n// when dividing floating point values, which is way smaller than this step.\nEigen::VectorXd numericalJacobian(Eigen::Vector2d const& P,\n                                  Eigen::VectorXd const& dist,\n                                  double step, FunT func) {\n\n  // The Jacobian has 4 elements.\n  Eigen::VectorXd jacobian(4);\n  \n  // First column\n  Eigen::Vector2d JX = (func(P + Eigen::Vector2d(step, 0), dist) - \n                        func(P - Eigen::Vector2d(step, 0), dist)) / (2*step);\n  // Second column\n  Eigen::Vector2d JY = (func(P + Eigen::Vector2d(0, step), dist) - \n                        func(P - Eigen::Vector2d(0, step), dist)) / (2*step);\n  \n  // Put in the jacobian matrix\n  jacobian[0] = JX[0];\n  jacobian[1] = JY[0];\n  jacobian[2] = JX[1];\n  jacobian[3] = JY[1];  \n  \n  return jacobian;\n}\n\n// Find X solving func(X) - Y = 0. Use the Newton-Raphson method.\n// Update X as X - (func(X) - Y) * J^-1, where J is the Jacobian of func(X).\nEigen::Vector2d newtonRaphson(Eigen::Vector2d const& Y,\n                              Eigen::VectorXd const& distortion,\n                              FunT func, JacT jac) {\n\n  // The step for differentiating the function (1e-6) should be larger\n  // than the tolerance for finding the function value (1e-8).\n  double step = 1e-6;\n     \n  // Initial guess for the root\n  Eigen::Vector2d X = Y;\n\n  int count = 1, maxTries = 20;\n  while (count < maxTries) {\n    \n    Eigen::Vector2d F = func(X, distortion) - Y;\n    \n    // Compute the Jacobian\n    Eigen::VectorXd J(4);\n    J = jac(X, distortion, step, func);\n    \n    // Find the determinant\n    double det = J[0]*J[3] - J[1]*J[2];\n    if (fabs(det) < 1e-6) {\n      // Near-zero determinant. Cannot continue. Return most recent result.\n      return X;\n    } \n\n    Eigen::Vector2d DX;\n    DX[0] = (J[3]*F[0] - J[1]*F[1]) / det;\n    DX[1] = (J[0]*F[1] - J[2]*F[0]) / det;\n    \n    // Update X\n    X -= DX;\n    \n    // If DX is small enough, we are done\n    if (DX.norm() < 1e-6)\n      return X;\n      \n    count++;\n   }\n  return X;\n}\n\nvoid rig::CameraParameters::DistortCentered(Eigen::Vector2d const& undistorted_c,\n                                               Eigen::Vector2d* distorted_c) const {\n  // We assume that input x and y are pixel values that have\n  // undistorted_len_x/2.0 and undistorted_len_y/2.0 subtracted from\n  // them. The outputs will have distorted_len_x/2.0 and\n  // distorted_len_y/2.0 subtracted from them.\n  if (m_distortion_coeffs.size() == 0) {\n    // There is no distortion\n    *distorted_c = undistorted_c + m_optical_offset - m_distorted_half_size;\n  } else if (m_distortion_coeffs.size() == 1) {\n    // This is the FOV model\n    Eigen::Vector2d norm = undistorted_c.cwiseQuotient(m_focal_length);\n    double ru = norm.norm();\n    double rd = atan(ru * m_distortion_precalc2) * m_distortion_precalc1;\n    double conv;\n    if (ru > 1e-8) {\n      conv = rd / ru;\n    } else {\n      conv = 1;\n    }\n    *distorted_c = (m_optical_offset - m_distorted_half_size) +\n      conv * norm.cwiseProduct(m_focal_length);\n      \n  } else if (m_distortion_coeffs.size() == 4 && m_distortion_type == FISHEYE_DISTORTION) {\n  \n    // Fisheye lens distortion\n    // https://docs.opencv.org/4.x/db/d58/group__calib3d__fisheye.html Note: The\n    // function cv::fisheye::distortPoints() assumes that the inputs have the\n    // image midpoint subtracted and are divided by the focal length, while its\n    // output are pixels that are not centered.\n    \n    // Normalize the pixel\n    Eigen::Vector2d norm = undistorted_c.cwiseQuotient(m_focal_length);\n\n    // Apply the distortion to the normalized pixel\n    *distorted_c = fishEyeDistortionNorm(norm, m_distortion_coeffs);\n   \n   // Scale by the focal length and add the optical offset\n   *distorted_c = distorted_c->cwiseProduct(m_focal_length) +\n     (m_optical_offset - m_distorted_half_size);\n    \n  } else if (m_distortion_coeffs.size() == 4 ||\n             m_distortion_coeffs.size() == 5) {\n    // Tsai lens distortion (radial-tangential, implemented in OpenCV)\n    double k1 = m_distortion_coeffs[0];\n    double k2 = m_distortion_coeffs[1];\n    double p1 = m_distortion_coeffs[2];\n    double p2 = m_distortion_coeffs[3];\n    double k3 = 0;\n    if (m_distortion_coeffs.size() == 5)\n      k3 = m_distortion_coeffs[4];\n\n    // To relative coordinates\n    Eigen::Vector2d norm = undistorted_c.cwiseQuotient(m_focal_length);\n    double r2 = norm.squaredNorm();\n\n    // Radial distortion\n    double radial_dist = 1 + k1 * r2 + k2 * r2 * r2 + k3 * r2 * r2 * r2;\n    *distorted_c = radial_dist * norm;\n\n    // Tangential distortion\n    *distorted_c +=\n      Eigen::Vector2d(2 * p1 * norm[0] * norm[1] + p2 * (r2 + 2 * norm[0] * norm[0]),\n                      p1 * (r2 + 2 * norm[1] * norm[1]) + 2 * p2 * norm[0] * norm[1]);\n\n    // Back to absolute coordinates\n    *distorted_c = distorted_c->cwiseProduct(m_focal_length) +\n      (m_optical_offset - m_distorted_half_size);\n  } else {\n  \n    // RPC \n    // Normalize the pixel\n    Eigen::Vector2d norm = undistorted_c.cwiseQuotient(m_focal_length);\n\n    // Apply the distortion to the normalized pixel\n    *distorted_c = rig::compute_rpc(norm, m_distortion_coeffs);\n   \n    // Scale by the focal length and add the optical offset\n    *distorted_c = distorted_c->cwiseProduct(m_focal_length) +\n     (m_optical_offset - m_distorted_half_size);\n  }\n}\n\nvoid rig::CameraParameters::UndistortCentered(Eigen::Vector2d const& distorted_c,\n                                                 Eigen::Vector2d *undistorted_c) const {\n  if (m_distortion_coeffs.size() == 0) {\n    // No lens distortion\n    *undistorted_c = distorted_c - (m_optical_offset - m_distorted_half_size);\n  } else if (m_distortion_coeffs.size() == 1) {\n    // FOV lens distortion\n    Eigen::Vector2d norm =\n      (distorted_c - (m_optical_offset - m_distorted_half_size)).cwiseQuotient(m_focal_length);\n    double rd = norm.norm();\n    double ru = tan(rd * m_distortion_coeffs[0]) / m_distortion_precalc2;\n    double conv = 1.0;\n    if (rd > 1e-8)\n      conv = ru / rd;\n    *undistorted_c = conv * norm.cwiseProduct(m_focal_length);\n    \n  } else if (m_distortion_coeffs.size() == 4 && m_distortion_type == FISHEYE_DISTORTION) {\n  \n    // Center and normalize\n    Eigen::Vector2d norm =\n    (distorted_c - (m_optical_offset - m_distorted_half_size)).cwiseQuotient(m_focal_length);\n\n     // Find the normalized undistorted pixel using Newton-Raphson\n     Eigen::Vector2d U = newtonRaphson(norm, m_distortion_coeffs,\n                                       fishEyeDistortionNorm, numericalJacobian);\n     \n     // Undo the normalization\n     *undistorted_c = U.cwiseProduct(m_focal_length);\n      \n  } else if (m_distortion_coeffs.size() == 4 ||\n             m_distortion_coeffs.size() == 5) {\n    // Tsai lens distortion (radial-tangential)\n    // TODO(oalexan1): Must test this! There is apparently an issue with \n    // the OpenCV implementation! Must use the numerical Jacobian here!\n    cv::Mat src(1, 1, CV_64FC2);\n    cv::Mat dst(1, 1, CV_64FC2);\n    Eigen::Map<Eigen::Vector2d> src_map(src.ptr<double>()), dst_map(dst.ptr<double>());\n    cv::Mat dist_int_mat(3, 3, cv::DataType<double>::type),\n      undist_int_mat(3, 3, cv::DataType<double>::type);\n    cv::Mat cvdist;\n    cv::eigen2cv(m_distortion_coeffs, cvdist);\n    cv::eigen2cv(GetIntrinsicMatrix<DISTORTED>(), dist_int_mat);\n    cv::eigen2cv(GetIntrinsicMatrix<UNDISTORTED>(), undist_int_mat);\n    src_map = distorted_c + m_distorted_half_size;\n    // Note: cv::undistortPoints() has an error of about half a pixel\n    // TODO(oalexan1): Need to investigate this further, and maybe\n    // change the implementation to using Newton-Raphson.\n    cv::undistortPoints(src, dst, dist_int_mat, cvdist, cv::Mat(), undist_int_mat);\n    *undistorted_c = dst_map - m_undistorted_half_size;\n  } else {\n    // RPC lens distortion\n    // Center and normalize\n    Eigen::Vector2d norm =\n    (distorted_c - (m_optical_offset - m_distorted_half_size)).cwiseQuotient(m_focal_length);\n\n     // Find the normalized undistorted pixel using Newton-Raphson\n     Eigen::Vector2d U = newtonRaphson(norm, m_distortion_coeffs,\n                                       rig::compute_rpc, numericalJacobian);\n     \n     // Undo the normalization\n     *undistorted_c = U.cwiseProduct(m_focal_length);\n  }\n}\n\n// The 'scale' variable is useful when we have the distortion model for a given\n// image, and want to apply it to a version of that image at a different resolution,\n// with 'scale' being the ratio of the width of the image at different resolution\n// and the one at the resolution at which the distortion model is computed.\nvoid rig::CameraParameters::GenerateRemapMaps(cv::Mat* remap_map, double scale) {\n  remap_map->create(scale*m_undistorted_size[1], scale*m_undistorted_size[0], CV_32FC2);\n  Eigen::Vector2d undistorted, distorted;\n  for (undistorted[1] = 0; undistorted[1] < scale*m_undistorted_size[1]; undistorted[1]++) {\n    for (undistorted[0] = 0; undistorted[0] < scale*m_undistorted_size[0]; undistorted[0]++) {\n      Convert<UNDISTORTED, DISTORTED>(undistorted/scale, &distorted);\n      remap_map->at<cv::Vec2f>(undistorted[1], undistorted[0])[0] = scale*distorted[0];\n      remap_map->at<cv::Vec2f>(undistorted[1], undistorted[0])[1] = scale*distorted[1];\n    }\n  }\n}\n\n\nnamespace rig {\n\n  // Conversion function helpers\n#define DEFINE_CONVERSION(TYPEA, TYPEB) \\\n  template <> \\\n  void rig::CameraParameters::Convert<TYPEA, TYPEB>(Eigen::Vector2d const& input, Eigen::Vector2d *output) const\n\n  DEFINE_CONVERSION(RAW, DISTORTED) {\n    *output = input - m_crop_offset.cast<double>();\n  }\n  DEFINE_CONVERSION(DISTORTED, RAW) {\n    *output = input + m_crop_offset.cast<double>();\n  }\n  DEFINE_CONVERSION(UNDISTORTED_C, DISTORTED_C) {\n    DistortCentered(input, output);\n  }\n  DEFINE_CONVERSION(DISTORTED_C, UNDISTORTED_C) {\n    UndistortCentered(input, output);\n  }\n  DEFINE_CONVERSION(UNDISTORTED, UNDISTORTED_C) {\n    *output = input - m_undistorted_half_size;\n  }\n  DEFINE_CONVERSION(UNDISTORTED_C, UNDISTORTED) {\n    *output = input + m_undistorted_half_size;\n  }\n  DEFINE_CONVERSION(DISTORTED, UNDISTORTED) {\n    Convert<DISTORTED_C, UNDISTORTED_C>(input - m_distorted_half_size, output);\n    *output += m_undistorted_half_size;\n  }\n  DEFINE_CONVERSION(UNDISTORTED, DISTORTED) {\n    Eigen::Vector2d centered_output;\n    Convert<UNDISTORTED, UNDISTORTED_C>(input, output);\n    Convert<UNDISTORTED_C, DISTORTED_C>(*output, &centered_output);\n    *output = centered_output + m_distorted_half_size;\n  }\n  DEFINE_CONVERSION(DISTORTED, DISTORTED_C) {\n    *output = input - m_distorted_half_size;\n  }\n  DEFINE_CONVERSION(DISTORTED, UNDISTORTED_C) {\n    Convert<DISTORTED_C, UNDISTORTED_C>(input - m_distorted_half_size, output);\n  }\n  DEFINE_CONVERSION(UNDISTORTED_C, DISTORTED) {\n    Convert<UNDISTORTED_C, DISTORTED_C>(input, output);\n    *output += m_distorted_half_size;\n  }\n  DEFINE_CONVERSION(UNDISTORTED, DISTORTED_C) {\n    Eigen::Vector2d centered_output;\n    Convert<UNDISTORTED, UNDISTORTED_C>(input, output);\n    Convert<UNDISTORTED_C, DISTORTED_C>(*output, &centered_output);\n    *output = centered_output;\n  }\n\n#undef DEFINE_CONVERSION\n\n  // Helper functions to give the intrinsic matrix\n#define DEFINE_INTRINSIC(TYPE) \\\n  template <> \\\n  Eigen::Matrix3d rig::CameraParameters::GetIntrinsicMatrix<TYPE>() const\n\n  DEFINE_INTRINSIC(RAW) {\n    Eigen::Matrix3d k = m_focal_length.homogeneous().asDiagonal();\n    k.block<2, 1>(0, 2) = m_optical_offset + m_crop_offset.cast<double>();\n    return k;\n  }\n  DEFINE_INTRINSIC(DISTORTED) {\n    Eigen::Matrix3d k = m_focal_length.homogeneous().asDiagonal();\n    k.block<2, 1>(0, 2) = m_optical_offset;\n    return k;\n  }\n  DEFINE_INTRINSIC(DISTORTED_C) {\n    Eigen::Matrix3d k = m_focal_length.homogeneous().asDiagonal();\n    k.block<2, 1>(0, 2) = m_optical_offset - m_distorted_half_size;\n    return k;\n  }\n  DEFINE_INTRINSIC(UNDISTORTED) {\n    Eigen::Matrix3d k = m_focal_length.homogeneous().asDiagonal();\n    k.block<2, 1>(0, 2) = m_undistorted_half_size;\n    return k;\n  }\n  DEFINE_INTRINSIC(UNDISTORTED_C) {\n    Eigen::Matrix3d k = m_focal_length.homogeneous().asDiagonal();\n    return k;\n  }\n\n#undef DEFINE_INTRINSIC\n\n}  // end namespace rig\n\n"
  },
  {
    "path": "src/asp/Rig/RigCameraParams.h",
    "content": "/* Copyright (c) 2017, United States Government, as represented by the\n * Administrator of the National Aeronautics and Space Administration.\n * \n * All rights reserved.\n * \n * The Astrobee platform is licensed under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n * \n *     http://www.apache.org/licenses/LICENSE-2.0\n * \n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n#ifndef ASP_RIG_CAMERA_PARAMS_H\n#define ASP_RIG_CAMERA_PARAMS_H\n\n#include <asp/Rig/RigRpcDistortion.h>\n\n#include <Eigen/Core>\n\n#include <string>\n#include <vector>\n#include <algorithm>\n\n// Forward declare mat type so that we don't have to include OpenCV if we're\n// not going to use it.\nnamespace cv {\n  class Mat;\n}  // end namespace cv\n\n// Functionality for undistorting and re-distorting images\nnamespace rig {\n\n  // Definition of camera frames\n  //\n  // RAW - This is how the image came to us.\n  // DISTORTED - Similar to RAW, but we've cropped out everything that is\n  // non-image\n  // DISTORTED_C - Same as DISTORTED, but the origin is the center of the image\n  // UNDISTORTED - A new camera frame that is create by remove lens distortion\n  // and placing the optical center directly center of the image.\n  // UNDISTORTED_C - Same as UNDISTORTED, but the origin is the center of the image\n  enum {\n    RAW,\n    DISTORTED,\n    DISTORTED_C,\n    UNDISTORTED,\n    UNDISTORTED_C\n  };\n\n  enum DistortionType {\n    NO_DISTORTION,      // no distortion params\n    FOV_DISTORTION,     // 1 distortion param\n    FISHEYE_DISTORTION, // 4 distortion params\n    RADTAN_DISTORTION,  // 4 or 5 distortion params\n    RPC_DISTORTION      // many distortion params\n  };\n  \n  // These are the names of the distortion models as strings in the config files\n  const std::string NO_DISTORTION_STR      = \"no_distortion\";\n  const std::string FOV_DISTORTION_STR     = \"fov\";\n  const std::string FISHEYE_DISTORTION_STR = \"fisheye\";\n  const std::string RADTAN_DISTORTION_STR  = \"radtan\";\n  const std::string RPC_DISTORTION_STR     = \"rpc\";\n\n  class CameraParameters {\n   public:\n    EIGEN_MAKE_ALIGNED_OPERATOR_NEW;\n\n    CameraParameters() {} // empty constructor; will create an undefined model\n    \n    CameraParameters(Eigen::Vector2i const& image_size,\n                     Eigen::Vector2d const& focal_length,\n                     Eigen::Vector2d const& optical_center,\n                     Eigen::VectorXd const& distortion,\n                     DistortionType distortion_type);\n\n    // Used to create a remap table. This table is the same size as the\n    // UNDISTORTED image, where every pixel's value is the corresponding pixel\n    // location in the DISTORTED image.\n    void GenerateRemapMaps(cv::Mat* remap_map, double scale = 1.0);\n\n    // Conversion utilities\n    template <int SRC, int DEST>\n    void Convert(Eigen::Vector2d const& input, Eigen::Vector2d *output) const {\n      throw(\"Please use the explicitly specified conversions by using the correct enum.\");\n    }\n\n    // Utility to create intrinsic matrix for the correct coordinate frame\n    template <int FRAME>\n    Eigen::Matrix3d GetIntrinsicMatrix() const {\n      throw(\"Please use the explicitly specified frame by using the correct enum.\");\n    }\n\n    // Image size info. We don't give direct access because if the size\n    // changes, we need to recompute some temporary variables.\n    //   These apply to coordinate frames DISTORTED, DISTORTED_C\n    void SetDistortedSize(Eigen::Vector2i const& image_size);\n    const Eigen::Vector2i& GetDistortedSize() const;\n    const Eigen::Vector2d& GetDistortedHalfSize() const;\n\n    // Domain of validity of distortion model (normally all image)\n    // Centered around image center.\n    void SetDistortedCropSize(Eigen::Vector2i const& crop_size);\n    const Eigen::Vector2i& GetDistortedCropSize() const;\n\n    //   These apply to UNDISTORTED, UNDISTORTED_C\n    void SetUndistortedSize(Eigen::Vector2i const& image_size);\n    const Eigen::Vector2i& GetUndistortedSize() const;\n    const Eigen::Vector2d& GetUndistortedHalfSize() const;\n\n    // Start of DISTORTED inside RAW frame\n    void SetCropOffset(Eigen::Vector2i const& crop);\n    const Eigen::Vector2i& GetCropOffset() const;\n    // Optical offset in DISTORTED frame\n    void SetOpticalOffset(Eigen::Vector2d const& offset);\n    const Eigen::Vector2d& GetOpticalOffset() const;\n\n    // Helper functions for focal length. Unless pixels are square,\n    // the focal length in x may differ than the one in y. Note that\n    // they are equal for undistorted images. Note that\n    // GetFocalLength() returns the mean of the two focal lengths\n    // while GetFocalVector() returns the vector.\n    void SetFocalLength(Eigen::Vector2d const&);\n    double GetFocalLength() const;\n    const Eigen::Vector2d& GetFocalVector() const;\n\n    // This will change the lens distortion type based on the size of the\n    // vector. Size 0, no lens distortion, Size 1, FOV, Size 4 or 5, TSAI.\n    void SetDistortion(Eigen::VectorXd const& distortion);\n    const Eigen::VectorXd& GetDistortion() const;\n\n    rig::RPCLensDistortion m_rpc;\n\n    // Comparison operator\n    friend bool operator== (CameraParameters const& A, CameraParameters const& B) {\n      return (A.m_crop_offset          == B.m_crop_offset          &&\n              A.m_distorted_image_size == B.m_distorted_image_size &&\n              A.m_distorted_crop_size  == B.m_distorted_crop_size  &&\n              A.m_undistorted_size     == B.m_undistorted_size     &&\n              A.m_distorted_half_size  == B.m_distorted_half_size  &&\n              A.m_focal_length         == B.m_focal_length         &&\n              A.m_optical_offset       == B.m_optical_offset       &&\n              A.m_distortion_coeffs    == B.m_distortion_coeffs    &&\n              A.m_distortion_type      == B.m_distortion_type      &&\n              A.m_distortion_precalc1  == B.m_distortion_precalc1  &&\n              A.m_distortion_precalc2  == B.m_distortion_precalc2  &&\n              A.m_distortion_precalc3  == B.m_distortion_precalc3);\n    }\n    \n    // Make this public to not have to use set and get functions\n    DistortionType m_distortion_type;\n\n    private:\n    // Converts UNDISTORTED_C to DISTORTED_C\n    void DistortCentered(Eigen::Vector2d const& undistorted_c,\n                          Eigen::Vector2d* distorted_c) const;\n    // Converts DISTORTED_C to UNDISTORTED_C\n    void UndistortCentered(Eigen::Vector2d const& distorted_c,\n                            Eigen::Vector2d* undistorted_c) const;\n\n    // Members\n    Eigen::Vector2i m_crop_offset;             // Start of DISTORTED in RAW frame\n    Eigen::Vector2i m_distorted_image_size;    // Applies to DISTORTED, DISTORTED_C\n      \n    // Domain of validity of distortion model (normally all image).\n    // Centered at the image center.\n    Eigen::Vector2i m_distorted_crop_size;\n    \n    // Applies to UNDISTORTED, UNDISTORTED_C, this is bigger than distorted image\n    // size because we need to expand the sensor to capture the unravelling from\n    // lens distortion removal.      \n    Eigen::Vector2i m_undistorted_size;  \n    \n    Eigen::Vector2d m_distorted_half_size, m_undistorted_half_size;\n    \n    // Focal length, in pixels\n    Eigen::Vector2d m_focal_length;\n    \n    // Optical offset in DISTORTED frame\n    Eigen::Vector2d m_optical_offset;\n\n    // Distortion coefficients are in an arbitrary sized vector. The length of\n    // the vector tells us what lens distortion model we are using. Length 0 =\n    // No lens distortion, ideal camera. Length 1 = FOV model, Length 4:\n    // fisheye or TSAI/OpenCV model, Length 5 = TSAI/OpenCV model.\n    Eigen::VectorXd m_distortion_coeffs;\n    double m_distortion_precalc1, m_distortion_precalc2, m_distortion_precalc3;\n  };\n\n#define DECLARE_CONVERSION(TYPEA, TYPEB) \\\n  template <>  \\\n  void CameraParameters::Convert<TYPEA, TYPEB>(Eigen::Vector2d const& input, Eigen::Vector2d *output) const\n  DECLARE_CONVERSION(RAW, DISTORTED);\n  DECLARE_CONVERSION(DISTORTED, RAW);\n  DECLARE_CONVERSION(UNDISTORTED_C, DISTORTED_C);\n  DECLARE_CONVERSION(UNDISTORTED_C, DISTORTED);\n  DECLARE_CONVERSION(UNDISTORTED_C, UNDISTORTED);\n  DECLARE_CONVERSION(UNDISTORTED, UNDISTORTED_C);\n  DECLARE_CONVERSION(UNDISTORTED, DISTORTED);\n  DECLARE_CONVERSION(UNDISTORTED, DISTORTED_C);\n  DECLARE_CONVERSION(DISTORTED, DISTORTED_C);\n  DECLARE_CONVERSION(DISTORTED_C, UNDISTORTED_C);\n  DECLARE_CONVERSION(DISTORTED, UNDISTORTED);\n  DECLARE_CONVERSION(DISTORTED, UNDISTORTED_C);\n#undef DECLARE_CONVERSION\n\n#define DECLARE_INTRINSIC(TYPE) \\\n  template <>  \\\n  Eigen::Matrix3d CameraParameters::GetIntrinsicMatrix<TYPE>() const\n  DECLARE_INTRINSIC(RAW);\n  DECLARE_INTRINSIC(DISTORTED);\n  DECLARE_INTRINSIC(DISTORTED_C);\n  DECLARE_INTRINSIC(UNDISTORTED);\n  DECLARE_INTRINSIC(UNDISTORTED_C);\n#undef DECLARE_INTRINSIC\n}  // namespace rig\n\n#endif  // ASP_RIG_CAMERA_PARAMS_H\n"
  },
  {
    "path": "src/asp/Rig/RigCameraUtils.cc",
    "content": "/* Copyright (c) 2017-2026, United States Government, as represented by the\n * Administrator of the National Aeronautics and Space Administration.\n * \n * All rights reserved.\n * \n * The Astrobee platform is licensed under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n * \n *     http://www.apache.org/licenses/LICENSE-2.0\n * \n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n#include <asp/Rig/RigCameraUtils.h>\n#include <asp/Rig/RigCameraParams.h>\n#include <asp/Rig/CameraImage.h>\n#include <asp/Rig/SystemUtils.h>\n\n#include <vw/Camera/PinholeModel.h>\n#include <vw/Camera/LensDistortion.h>\n#include <vw/Core/Exception.h>\n#include <vw/Core/Log.h>\n\n#include <boost/filesystem.hpp>\n#include <glog/logging.h>\n\n#include <Eigen/Dense>\n\n#include <string>\n#include <set>\n\nnamespace fs = boost::filesystem;\n\nnamespace rig {\n\n// Write a line of the form: name = a b c\nvoid write_param_vec(std::string const& param_name, std::ofstream & os, \n                     Eigen::VectorXd const& vals) {\n\n  os << param_name << \" = \";\n  for (size_t p = 0; p < vals.size(); p++){\n    os << vals[p];\n    if (p + 1 < vals.size()) \n      os << \" \"; // write a whitespace after each number except the last\n  }\n  os << \"\\n\";\n}\n\n// For an image like image_dir/my_cam/image.png, create the file\n// out_dir/image.tsai.\nstd::string pinholeFile(std::string const& out_dir, \n                        std::string const& sensor_name, \n                        std::string const& image_file) {\n\n  std::string base = fs::path(image_file).stem().string();\n  \n  // Ensure that the sensor name is part of the pinhole file name,\n  // to ensure uniqueness.\n  if (base.find(sensor_name) == std::string::npos)\n    base = base + \"_\" + sensor_name;\n\n  return out_dir + \"/\" + sensor_name + \"/\" + base + \".tsai\";\n}\n\n// A utility for creating a pinhole camera model\nvoid createPinholeCamera(rig::CameraParameters const& cam_params,\n                         Eigen::Affine3d const& world_to_cam,\n                         vw::camera::PinholeModel& pinhole_cam) {\n\n  // Go from world_to_cam to cam_to_world\n  Eigen::MatrixXd T = world_to_cam.inverse().matrix();\n  vw::Matrix3x3 R;\n  for (int r = 0; r < 3; r++)\n    for (int c = 0; c < 3; c++)\n      R(r, c) = T(r, c);\n  vw::Vector3 C;\n  for (int r = 0; r < 3; r++)\n    C[r] = T(r, 3);\n\n  double fu = cam_params.GetFocalVector()[0];\n  double fv = cam_params.GetFocalVector()[1];\n  double cu = cam_params.GetOpticalOffset()[0];\n  double cv = cam_params.GetOpticalOffset()[1];\n\n  auto dist = cam_params.GetDistortion();\n  boost::shared_ptr<vw::camera::LensDistortion> distortion;\n  if (dist.size() == 0) {\n    distortion.reset(new vw::camera::NullLensDistortion());\n  } else if (dist.size() == 1) {\n    vw::Vector<double> params(dist.size());\n    for (int i = 0; i < dist.size(); i++)\n      params[i] = dist[i];\n    distortion.reset(new vw::camera::FovLensDistortion(params));\n  } else if (dist.size() == 4 && cam_params.m_distortion_type == rig::FISHEYE_DISTORTION) {\n    vw::Vector<double> params(dist.size());\n    for (int i = 0; i < dist.size(); i++)\n      params[i] = dist[i];\n    distortion.reset(new vw::camera::FisheyeLensDistortion(params));\n  } else if (dist.size() == 4 || dist.size() == 5) {\n    // Tsai distortion model always has 5 parameters\n    vw::Vector<double> params(5); \n    for (int i = 0; i < dist.size(); i++)\n      params[i] = dist[i];\n    // If having only 4 parameters, add zero\n    for (int i = dist.size(); i < 5; i++)\n      params[i] = 0;\n    distortion.reset(new vw::camera::TsaiLensDistortion(params));\n  } else if (dist.size() > 5 && cam_params.m_distortion_type == rig::RPC_DISTORTION) {\n    // RPC\n    vw::Vector<double> params(dist.size());\n    for (int i = 0; i < dist.size(); i++)\n      params[i] = dist[i];\n    distortion.reset(new vw::camera::RPCLensDistortion(params));\n  } else {\n    LOG(FATAL) << \"Expecting 0, 1, 4, or 5 distortion coefficients.\\n\";\n  }\n\n  // We assume the focal length and optical center are already in pixels, so the\n  // pitch is 1.0.\n  double pitch = 1.0;\n  pinhole_cam = vw::camera::PinholeModel(C, R, fu, fv, cu, cv, distortion.get(), pitch);\n}\n\n// A utility for saving a camera in a format ASP understands \nvoid writePinholeCamera(rig::CameraParameters const& cam_params,\n                        Eigen::Affine3d const& world_to_cam,\n                        std::string const& filename) {\n\n  // Go from world_to_cam to cam_to_world\n  Eigen::MatrixXd T = world_to_cam.inverse().matrix();\n\n  // Must create the directory having the output file\n  std::string out_dir = fs::path(filename).parent_path().string();\n  rig::createDir(out_dir);\n\n  std::ofstream ofs(filename);\n  ofs.precision(17);\n  ofs << \"VERSION_4\\n\";\n  ofs << \"PINHOLE\\n\";\n  ofs << \"fu = \" << cam_params.GetFocalVector()[0] << \"\\n\";\n  ofs << \"fv = \" << cam_params.GetFocalVector()[1] << \"\\n\";\n  ofs << \"cu = \" << cam_params.GetOpticalOffset()[0] << \"\\n\";\n  ofs << \"cv = \" << cam_params.GetOpticalOffset()[1] << \"\\n\";\n  ofs << \"u_direction = 1 0 0\\n\";\n  ofs << \"v_direction = 0 1 0\\n\";\n  ofs << \"w_direction = 0 0 1\\n\";\n  ofs << \"C = \" << T(0, 3) << ' ' << T(1, 3) << ' ' << T(2, 3) << \"\\n\";\n  ofs << \"R = \"\n      << T(0, 0) << ' ' << T(0, 1) << ' ' << T(0, 2) << ' '\n      << T(1, 0) << ' ' << T(1, 1) << ' ' << T(1, 2) << ' '\n      << T(2, 0) << ' ' << T(2, 1) << ' ' << T(2, 2) << \"\\n\";\n\n  // We assume the focal length and optical center are already in pixels, so the\n  // pitch is 1.0.\n  ofs << \"pitch = 1\\n\";\n\n  auto dist = cam_params.GetDistortion();\n  // Dist size is 0, 1, 4, or 5\n  if (dist.size() == 0) {\n    ofs << \"NULL\\n\";\n  } else if (dist.size() == 1) {\n    ofs << \"FOV\\n\";\n    ofs << \"k1 = \" << dist[0] << \"\\n\";\n  } else if (dist.size() == 4 && cam_params.m_distortion_type == rig::FISHEYE_DISTORTION) {\n    ofs << \"FISHEYE\\n\";\n    ofs << \"k1 = \" << dist[0] << \"\\n\";\n    ofs << \"k2 = \" << dist[1] << \"\\n\";\n    ofs << \"k3 = \" << dist[2] << \"\\n\";\n    ofs << \"k4 = \" << dist[3] << \"\\n\";\n  } else if (dist.size() == 4 || dist.size() == 5) {\n    ofs << \"TSAI\\n\";\n    ofs << \"k1 = \" << dist[0] << \"\\n\";\n    ofs << \"k2 = \" << dist[1] << \"\\n\";\n    ofs << \"p1 = \" << dist[2] << \"\\n\";\n    ofs << \"p2 = \" << dist[3] << \"\\n\";\n    if (dist.size() > 4)\n      ofs << \"k3 = \" << dist[4] << \"\\n\";\n  } else if (dist.size() > 5 && cam_params.m_distortion_type == rig::RPC_DISTORTION) {\n    // RPC\n    ofs << \"RPC\\n\";\n    Eigen::VectorXd num_x, den_x, num_y, den_y;\n    rig::unpack_params(dist, num_x, den_x, num_y, den_y);\n    rig::prepend_1(den_x);\n    rig::prepend_1(den_y);\n    write_param_vec(\"distortion_num_x\", ofs, num_x);\n    write_param_vec(\"distortion_den_x\", ofs, den_x);\n    write_param_vec(\"distortion_num_y\", ofs, num_y);\n    write_param_vec(\"distortion_den_y\", ofs, den_y);\n\n  } else {\n    LOG(FATAL) << \"Expecting 0, 1, 4, or 5 distortion coefficients.\\n\";\n  }\n\n  ofs.close();\n}\n  \n// Save the optimized cameras in ASP's Pinhole format. \nvoid writePinholeCameras(std::vector<std::string>              const& cam_names,\n                         std::vector<rig::CameraParameters> const& cam_params,\n                         std::vector<rig::cameraImage>         const& cams,\n                         std::vector<Eigen::Affine3d>          const& world_to_cam,\n                         std::string                           const& out_dir) {\n\n  // Sanity checks\n  if (world_to_cam.size() != cams.size())\n    LOG(FATAL) << \"Expecting as many world-to-camera transforms as cameras.\\n\";\n\n  std::string pinhole_dir = out_dir + \"/pinhole\";\n  std::cout << \"Writing pinhole cameras to: \" << pinhole_dir << std::endl;\n\n  std::vector<std::string> pinholeCamFiles; \n  for (size_t cid = 0; cid < cams.size(); cid++) {\n    std::string const& image_file = cams[cid].image_name;\n    int cam_type = cams[cid].camera_type;\n    std::string sensor_name = cam_names[cam_type]; \n    std::string camFile = pinholeFile(pinhole_dir, sensor_name, image_file);\n    rig::writePinholeCamera(cam_params[cam_type], world_to_cam[cid], camFile);\n    pinholeCamFiles.push_back(camFile);\n  }\n\n  // Must ensure that all camera names without directory are unique\n  std::set<std::string> base_names;\n  for (size_t it = 0; it < pinholeCamFiles.size(); it++) {\n    std::string base_name = fs::path(pinholeCamFiles[it]).filename().string();\n    if (base_names.find(base_name) != base_names.end())\n      LOG(FATAL) << \"Non-unique camera name (without directory): \" << base_name \n                 << \". It will not be possible to use these cameras with bundle_adjust.\\n\";\n    base_names.insert(base_name);\n  }\n  \n  // Also save their list. Useful for bundle adjustment.\n  std::string camera_list = out_dir + \"/camera_list.txt\";\n  std::string dir = fs::path(camera_list).parent_path().string();\n  rig::createDir(dir);\n  \n  std::cout << \"Writing: \" << camera_list << std::endl;\n  std::ofstream ofs(camera_list.c_str());\n  for (size_t it = 0; it < pinholeCamFiles.size(); it++)\n    ofs << pinholeCamFiles[it] << \"\\n\";\n  ofs.close();\n  \n  return;\n}\n\n// Calculate camera center and ray direction in world coordinates from a distorted pixel\nvoid calcCamCtrDir(rig::CameraParameters const& cam_params,\n                   Eigen::Vector2d const& dist_pix,\n                   Eigen::Affine3d const& world_to_cam,\n                   // Output\n                   Eigen::Vector3d& cam_ctr,\n                   Eigen::Vector3d& world_ray) {\n  \n  // Undistort the pixel\n  Eigen::Vector2d undist_centered_pix;\n  cam_params.Convert<rig::DISTORTED, rig::UNDISTORTED_C>(dist_pix, &undist_centered_pix);\n\n  // Ray from camera going through the undistorted and centered pixel\n  Eigen::Vector3d cam_ray(undist_centered_pix.x() / cam_params.GetFocalVector()[0],\n                          undist_centered_pix.y() / cam_params.GetFocalVector()[1], 1.0);\n  cam_ray.normalize();\n\n  Eigen::Affine3d cam_to_world = world_to_cam.inverse();\n  world_ray = cam_to_world.linear() * cam_ray;\n  cam_ctr = cam_to_world.translation();\n}\n\n} // end namespace rig\n"
  },
  {
    "path": "src/asp/Rig/RigCameraUtils.h",
    "content": "/* Copyright (c) 2017-2026, United States Government, as represented by the\n * Administrator of the National Aeronautics and Space Administration.\n * \n * All rights reserved.\n * \n * The Astrobee platform is licensed under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n * \n *     http://www.apache.org/licenses/LICENSE-2.0\n * \n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n#ifndef ASP_RIG_CAMERA_UTILS_H\n#define ASP_RIG_CAMERA_UTILS_H\n\n#include <Eigen/Core>\n#include <Eigen/Geometry>\n\n#include <string>\n#include <vector>\n#include <algorithm>\n\n// forward decl\nnamespace vw { namespace camera {\n  class PinholeModel;\n}}  // namespace vw::camera\n\nnamespace rig {\n\nclass CameraParameters;\nclass cameraImage;\n\n// A utility for creating a pinhole camera model\nvoid createPinholeCamera(rig::CameraParameters const& cam_params,\n                         Eigen::Affine3d const& world_to_cam,\n                         vw::camera::PinholeModel& pinhole_cam);\n\n// A utility for saving a camera in a format ASP understands. For now do not save\n// the distortion.\nvoid writePinholeCamera(rig::CameraParameters const& cam_params,\n                        Eigen::Affine3d          const& world_to_cam,\n                        std::string              const& filename);\n  \n// Save the optimized cameras in ASP's Pinhole format. For now do not save\n// the distortion model.\nvoid writePinholeCameras(std::vector<std::string>              const& cam_names,\n                         std::vector<rig::CameraParameters> const& cam_params,\n                         std::vector<rig::cameraImage>         const& cams,\n                         std::vector<Eigen::Affine3d>          const& world_to_cam,\n                         std::string                           const& out_dir);\n\n// Calculate camera center and ray direction in world coordinates from a distorted pixel\nvoid calcCamCtrDir(rig::CameraParameters const& cam_params,\n                   Eigen::Vector2d const& dist_pix,\n                   Eigen::Affine3d const& world_to_cam,\n                   // Output\n                   Eigen::Vector3d& cam_ctr,\n                   Eigen::Vector3d& world_ray);\n\n}  // namespace rig\n\n#endif  // ASP_RIG_CAMERA_UTILS_H\n"
  },
  {
    "path": "src/asp/Rig/RigConfig.cc",
    "content": "/* Copyright (c) 2021, United States Government, as represented by the\n * Administrator of the National Aeronautics and Space Administration.\n *\n * All rights reserved.\n *\n * The \"ISAAC - Integrated System for Autonomous and Adaptive Caretaking\n * platform\" software is licensed under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n#include <asp/Rig/RigConfig.h>\n#include <asp/Rig/TransformUtils.h>\n#include <asp/Rig/SystemUtils.h>\n\n#include <vw/Core/Log.h>\n#include <vw/Core/Exception.h>\n\n#include <opencv2/calib3d.hpp>\n#include <boost/filesystem.hpp>\n\n#include <iostream>\n#include <set>\n#include <fstream>\n#include <iomanip>\n\nnamespace fs = boost::filesystem;\n\nnamespace rig {\n\nvoid RigSet::validate() const {\n  if (cam_set.empty()) \n    vw::vw_throw(vw::IOErr() << \"Found an empty set of rigs.\\n\");\n  \n  size_t num_cams = 0;\n  std::set<std::string> all_cams; // checks for duplicates\n  for (size_t rig_it = 0; rig_it < cam_set.size(); rig_it++) {\n    if (cam_set[rig_it].empty()) \n      vw::vw_throw(vw::IOErr() << \"Found a rig with no cams.\\n\");\n    \n    num_cams += cam_set[rig_it].size();\n    for (size_t cam_it = 0; cam_it < cam_set[rig_it].size(); cam_it++)\n      all_cams.insert(cam_set[rig_it][cam_it]);\n  }\n  \n  if (num_cams != all_cams.size() || num_cams != cam_names.size())\n    vw::vw_throw(vw::IOErr()\n                 << \"Found a duplicate sensor name in the rig set.\\n\");\n  \n  if (num_cams != ref_to_cam_trans.size()) \n    vw::vw_throw(vw::IOErr() \n                 << \"Number of sensors is not equal to number of ref-to-cam transforms.\\n\");\n  \n  if (num_cams != depth_to_image.size()) \n    vw::vw_throw(vw::IOErr()\n                  << \"Number of sensors is not equal to number of depth-to-image \"\n                  << \"transforms.\\n\");\n  \n  if (num_cams != ref_to_cam_timestamp_offsets.size()) \n    vw::vw_throw(vw::IOErr() \n                 << \"Number of sensors is not equal to number of ref-to-cam \"\n                 << \"timestamp offsets.\\n\");\n  \n  if (num_cams != cam_params.size()) \n    vw::vw_throw(vw::IOErr() \n                 << \"Number of sensors is not equal to number of camera models.\\n\");\n  \n  for (size_t cam_it = 0; cam_it < cam_names.size(); cam_it++) {\n    if (isRefSensor(cam_names[cam_it]) && ref_to_cam_timestamp_offsets[cam_it] != 0) \n      vw::vw_throw(vw::IOErr() << \"The timestamp offsets for the reference sensors must be always 0.\\n\");\n  }\n  \n  for (size_t i = 0; i < this->cam_params.size(); i++) {\n    auto const& params = this->cam_params[i];\n    if (params.GetDistortedSize()[0] <= 1 || params.GetDistortedSize()[1] <= 1)\n        vw::vw_throw(vw::IOErr() << \"The image size must be at least 2 x 2.\\n\");\n    if (params.GetFocalLength() == 0)\n       vw::vw_throw(vw::IOErr() << \"The focal length must be non-zero.\\n\");\n  }\n\n  for (size_t cam_it = 0; cam_it < cam_names.size(); cam_it++) {\n    if (isRefSensor(cam_names[cam_it]) &&\n        ref_to_cam_trans[cam_it].matrix() != Eigen::Affine3d::Identity().matrix())\n      vw::vw_throw(vw::IOErr() \n        << \"The transform from the reference sensor to itself must be the identity.\\n\");\n  }\n\n}\n  \n// We assume the first encountered sensor is the ref sensor. This is enforced\n// on reading the rig.\nbool RigSet::isRefSensor(std::string const& cam_name) const {\n  for (size_t rig_it = 0; rig_it < cam_set.size(); rig_it++) \n    if (cam_set[rig_it][0] == cam_name) \n      return true;\n  return false;\n}\n\n// A ref sensor is the first sensor on each rig\nbool RigSet::isRefSensor(int cam_id) const {\n  return isRefSensor(cam_names[cam_id]);\n}\n\n// Return the id of the rig given the index of the sensor\n// in cam_names.\nint RigSet::rigId(int cam_id) const {\n  if (cam_id < 0 || cam_id >= cam_names.size()) \n    vw::vw_throw(vw::IOErr() << \"Out of bounds sensor id.\\n\");\n  \n  std::string cam_name = cam_names[cam_id];\n  \n  for (size_t rig_it = 0; rig_it < cam_set.size(); rig_it++) {\n    for (size_t cam_it = 0; cam_it < cam_set[rig_it].size(); cam_it++) {\n      if (cam_set[rig_it][cam_it] == cam_name) {\n        return rig_it;\n      }\n    }\n  }\n\n  // Should not arrive here\n  vw::vw_throw(vw::IOErr() \n               << \"Could not look up in the rig the sensor: \" << cam_name << \"\\n\");\n  return -1;\n}\n\n// The name of the ref sensor for the rig having the given sensor id. We assume\n// the first encountered sensor is the ref sensor. This is enforced on reading\n// the rig.\nstd::string RigSet::refSensor(int cam_id) const {\n  return cam_set[rigId(cam_id)][0];\n}\n  \n// Index in the list of sensors of the sensor with given name\nint RigSet::sensorIndex(std::string const& sensor_name) const {\n  auto it = std::find(cam_names.begin(), cam_names.end(), sensor_name);\n  if (it == cam_names.end()) \n    vw::vw_throw(vw::IOErr()\n                 << \"Could not find sensor in rig. That is unexpected. Offending sensor: \"\n                 << sensor_name << \".\\n\");\n    \n  return it - cam_names.begin();\n}\n\n// Given the id of a sensor, find the id of the ref sensor for the rig\n// having this sensor\nint RigSet::refSensorId(int cam_id) const {\n  return sensorIndex(refSensor(cam_id));\n}\n  \n// Create a rig set having a single rig  \nRigSet RigSet::subRig(int rig_id) const {\n\n  if (rig_id < 0 || rig_id >= cam_set.size()) \n    vw::vw_throw(vw::IOErr() << \"Out of range in rig set.\\n\");\n\n  RigSet sub_rig;\n  sub_rig.cam_set.push_back(cam_set[rig_id]);\n\n  // Add the relevant portion of each rig member\n  for (size_t subrig_it = 0; subrig_it < cam_set[rig_id].size(); subrig_it++) {\n    \n    std::string sensor_name = cam_set[rig_id][subrig_it];\n    int rig_index = sensorIndex(sensor_name);\n\n    sub_rig.cam_names.push_back(cam_names[rig_index]);\n    sub_rig.ref_to_cam_trans.push_back(ref_to_cam_trans[rig_index]);\n    sub_rig.depth_to_image.push_back(depth_to_image[rig_index]);\n    sub_rig.ref_to_cam_timestamp_offsets.push_back(ref_to_cam_timestamp_offsets[rig_index]);\n    sub_rig.cam_params.push_back(cam_params[rig_index]);\n  }\n  sub_rig.validate();\n\n  return sub_rig;\n}\n  \n// Save the optimized rig configuration\nvoid writeRigConfig(std::string const& rig_config, bool model_rig, RigSet const& R) {\n\n  R.validate();\n  \n  // Ensure that the output directory exists\n  std::string out_dir = fs::path(rig_config).parent_path().string();\n  rig::createDir(out_dir);\n  \n  vw::vw_out() << \"Writing: \" << rig_config << \"\\n\";\n  std::ofstream f;\n  f.open(rig_config.c_str(), std::ios::binary | std::ios::out);\n  if (!f.is_open()) \n    vw::vw_throw(vw::IOErr() << \"Cannot open file for writing: \" << rig_config << \"\\n\");\n  f.precision(17);\n\n  for (size_t cam_type = 0; cam_type < R.cam_params.size(); cam_type++) {\n\n    if (R.isRefSensor(R.cam_names[cam_type])) {\n      if (cam_type > 0)\n        f << \"\\n\"; // add an empty line for clarity\n      \n      f << \"ref_sensor_name: \" << R.cam_names[cam_type] << \"\\n\";\n    }\n    \n    f << \"\\n\";\n    f << \"sensor_name: \"  << R.cam_names[cam_type] << \"\\n\";\n    f << \"focal_length: \" << R.cam_params[cam_type].GetFocalLength() << \"\\n\";\n\n    Eigen::Vector2d c = R.cam_params[cam_type].GetOpticalOffset();\n    f << \"optical_center: \" << c[0] << \" \" << c[1] << \"\\n\";\n\n    Eigen::VectorXd D = R.cam_params[cam_type].GetDistortion();\n\n    f << \"distortion_coeffs: \";\n    for (int d = 0; d < D.size(); d++) {\n      f << D[d];\n      if (d + 1 < D.size()) f << \" \";\n    }\n    f << \"\\n\";\n\n    auto dist_type = R.cam_params[cam_type].m_distortion_type;\n    if (D.size() == 0 && dist_type == rig::NO_DISTORTION)\n      f << \"distortion_type: \" << rig::NO_DISTORTION_STR << \"\\n\";\n    else if (D.size() == 1 && dist_type == rig::FOV_DISTORTION)\n      f << \"distortion_type: \" << rig::FOV_DISTORTION_STR << \"\\n\";\n    // Both fisheye and radtan distortion can have 4 coefficients  \n    else if (D.size() == 4 && dist_type == rig::FISHEYE_DISTORTION)\n      f << \"distortion_type: \" << rig::FISHEYE_DISTORTION_STR << \"\\n\";\n    else if (D.size() >= 4 && D.size() <= 5 && dist_type == rig::RADTAN_DISTORTION)\n      f << \"distortion_type: \" << rig::RADTAN_DISTORTION_STR << \"\\n\";\n    else if (D.size() > 5 && dist_type == rig::RPC_DISTORTION)\n      f << \"distortion_type: \" << rig::RPC_DISTORTION_STR << \"\\n\";\n    else\n      vw::vw_throw(vw::IOErr() \n                   << \"Expecting 0, 1, 4, 5, or more distortion coefficients. Got: \"\n                   << D.size() << \".\\n\");\n\n    Eigen::Vector2i image_size = R.cam_params[cam_type].GetDistortedSize();\n    f << \"image_size: \" << image_size[0] << ' ' << image_size[1] << \"\\n\";\n\n    Eigen::Vector2i distorted_crop_size = R.cam_params[cam_type].GetDistortedCropSize();\n    f << \"distorted_crop_size: \" << distorted_crop_size[0] << ' ' << distorted_crop_size[1] << \"\\n\";\n\n    Eigen::Vector2i undist_size = R.cam_params[cam_type].GetUndistortedSize();\n    f << \"undistorted_image_size: \" << undist_size[0] << ' ' << undist_size[1] << \"\\n\";\n\n    Eigen::Affine3d T;\n    if (model_rig)\n      T = R.ref_to_cam_trans[cam_type];\n    else\n      T = Eigen::Affine3d::Identity(); // write something valid\n\n    f << \"ref_to_sensor_transform: \" << rig::affineToStr(T) << \"\\n\";\n\n    f << \"depth_to_image_transform: \" << rig::affineToStr(R.depth_to_image[cam_type]) << \"\\n\";\n\n    f << \"ref_to_sensor_timestamp_offset: \" << R.ref_to_cam_timestamp_offsets[cam_type] << \"\\n\";\n  }\n\n  f.close();\n}\n\n// Read real values after given tag. Ignore comments, so any line starting\n// with #, and empty lines. If desired_num_vals >=0, validate that we\n// read the desired number.\nvoid readConfigVals(std::ifstream & f, std::string const& tag, int desired_num_vals,\n                    Eigen::VectorXd & vals) {\n\n  // Clear the output\n  vals.resize(0);\n\n  std::vector<double> local_vals;  // std::vector has push_back()\n  std::string line;\n  while (getline(f, line)) {\n\n    // Remove everything after any point sign\n    bool have_comment = (line.find('#') != line.npos);\n    if (have_comment) {\n      std::string new_line;\n      for (size_t c = 0; c < line.size(); c++) {\n        if (line[c] == '#') \n          break; // got to the pound sign\n        \n        new_line += line[c];\n      }\n\n      line = new_line;\n    }\n    \n    // Here must remove anything after the pound sign\n    \n    if (line.empty() || line[0] == '#') continue;\n    \n    // Remove commas that occasionally appear in the file\n    for (size_t c = 0; c < line.size(); c++) {\n      if (line[c] == ',') \n        line[c] = ' ';\n    }\n\n    std::istringstream iss(line);\n    std::string token;\n    iss >> token;\n    std::string val; \n    while (iss >> val)\n      local_vals.push_back(atof(val.c_str()));\n\n    if (token == \"\") \n      continue; // likely just whitespace is present on the line\n    \n    if (token != tag) \n      vw::vw_throw(vw::IOErr() << \"Could not read value for: \" << tag << \"\\n\");\n\n    // Copy to Eigen::VectorXd\n    vals.resize(local_vals.size());\n    for (int it = 0; it < vals.size(); it++) vals[it] = local_vals[it];\n\n    if (desired_num_vals >= 0 && vals.size() != desired_num_vals)\n      vw::vw_throw(vw::IOErr() << \"Read an incorrect number of values for: \" << tag << \"\\n\");\n\n    return;\n  }\n\n  vw::vw_throw(vw::IOErr() << \"Could not read value for: \" << tag << \"\\n\");\n}\n  \n// Read strings separated by spaces after given tag. Ignore comments, so any line starting\n// with #, and empty lines. If desired_num_vals >=0, validate that we\n// read the desired number.\nvoid readConfigVals(std::ifstream & f, std::string const& tag, int desired_num_vals,\n                    std::vector<std::string> & vals) {\n\n  // Clear the output\n  vals.resize(0);\n\n  std::string line;\n  while (getline(f, line)) {\n    if (line.empty() || line[0] == '#') continue;\n\n    std::istringstream iss(line);\n    std::string token;\n    iss >> token;\n    std::string val;\n    while (iss >> val) {\n      vals.push_back(val);\n    }\n\n    if (token != tag) \n      vw::vw_throw(vw::IOErr() << \"Could not read value for: \" << tag << \"\\n\");\n\n    if (desired_num_vals >= 0 && vals.size() != desired_num_vals)\n      vw::vw_throw(vw::IOErr() << \"Read an incorrect number of values for: \" << tag << \"\\n\");\n\n    return;\n  }\n\n  vw::vw_throw(vw::IOErr() << \"Could not read value for: \" << tag << \"\\n\");\n}\n\n// Read a rig configuration. Check if the transforms among the sensors\n// on the rig is not 0, in that case will use it.\nvoid readRigConfig(std::string const& rig_config, bool have_rig_transforms, RigSet & R) {\n  \n  // To check for duplicate sensors\n  std::set<std::string> ref_sensors, sensors;\n  \n  try {\n    // Initialize the outputs\n    R = RigSet();\n\n    // Open the file\n    vw::vw_out() << \"Reading: \" << rig_config << \"\\n\";\n    \n    std::ifstream f;\n    f.open(rig_config.c_str(), std::ios::in);\n    if (!f.is_open()) \n      vw::vw_throw(vw::IOErr() << \"Cannot open file: \" << rig_config << \"\\n\");\n\n    int ref_sensor_count = 0;\n    Eigen::VectorXd vals;\n    std::vector<std::string> str_vals;\n    \n    // It is assumed in several places that the first encountered\n    // sensor is the ref sensor.\n    \n    // Read each sensor\n    bool is_ref_sensor = false; \n    std::string ref_sensor_name;\n    while (1) {\n      int curr_pos = f.tellg(); // where we are in the file\n      // Read the reference sensor\n      try {\n        readConfigVals(f, \"ref_sensor_name:\", 1, str_vals);\n        ref_sensor_name = str_vals[0];\n        ref_sensor_count++; // found a ref sensor\n        R.cam_set.resize(ref_sensor_count);\n        is_ref_sensor = true;\n        \n       // Check for duplicate ref sensor\n        if (ref_sensors.find(ref_sensor_name) != ref_sensors.end())\n          vw::vw_throw(vw::IOErr() << \"Found a duplicate reference sensor: \" << ref_sensor_name << \"\\n\");\n        ref_sensors.insert(ref_sensor_name);\n      } catch (...) {\n        // No luck, go back to the line we tried to read, and continue reading other fields\n        f.seekg(curr_pos, std::ios::beg);\n      }\n      \n      try {\n        readConfigVals(f, \"sensor_name:\", 1, str_vals);\n      } catch (...) {\n        // Likely no more sensors\n        break;\n      }\n      \n      std::string sensor_name = str_vals[0];\n      \n      // The first sensor must be the ref sensor\n      if (is_ref_sensor && sensor_name != ref_sensor_name) \n        vw::vw_throw(vw::IOErr() \n                     << \"The first sensor in each rig must be the reference sensor. \"\n                     << \"Check the rig configuration file.\\n\");\n        \n      is_ref_sensor = false; // reset  \n      \n      if (ref_sensor_name == \"\")\n        vw::vw_throw(vw::IOErr() \n                     << \"The reference sensor name must be the first entry in \"\n                     << \"the rig configuration file.\\n\");\n\n      // Check for duplicate sensor\n      if (sensors.find(sensor_name) != sensors.end())\n        vw::vw_throw(vw::IOErr() << \"Found a duplicate sensor: \" << sensor_name << \"\\n\");\n      sensors.insert(sensor_name);\n\n      // It is convenient to store each sensor in cam_set, which has the rig set structure,\n      // and in R.cam_names, which is enough for almost all processing.\n      R.cam_set.back().push_back(sensor_name);\n      R.cam_names.push_back(sensor_name);\n      \n      readConfigVals(f, \"focal_length:\", 1, vals);\n      Eigen::Vector2d focal_length(vals[0], vals[0]);\n\n      readConfigVals(f, \"optical_center:\", 2, vals);\n      Eigen::Vector2d optical_center(vals[0], vals[1]);\n\n      // Read distortion\n      \n      rig::DistortionType dist_type = rig::NO_DISTORTION;\n      \n      readConfigVals(f, \"distortion_coeffs:\", -1, vals);\n      if (vals.size() != 0 && vals.size() != 1 && vals.size() != 4 && vals.size() < 5)\n        vw::vw_throw(vw::IOErr()\n                     << \"Expecting 0, 1, 4, 5, or more distortion coefficients.\\n\");\n      Eigen::VectorXd distortion = vals;\n\n      readConfigVals(f, \"distortion_type:\", 1, str_vals);\n      if (distortion.size() == 0 && str_vals[0] != rig::NO_DISTORTION_STR)\n        vw::vw_throw(vw::IOErr() \n                     << \"When there are no distortion coefficients, distortion type must be: \"\n                     << rig::NO_DISTORTION_STR << \"\\n\");\n      \n      // For backward compatibility, accept rig::FISHEYE_DISTORTION_STR with 1 distortion coefficient, but use the FOV model\n      if (distortion.size() == 1 && str_vals[0] == rig::FISHEYE_DISTORTION_STR)\n        str_vals[0] = rig::FOV_DISTORTION_STR;\n      \n      // Validation \n      if (distortion.size() == 1 && str_vals[0] != rig::FOV_DISTORTION_STR)\n          vw::vw_throw(vw::IOErr() \n                       << \"When there is 1 distortion coefficient, distortion type must be: \"\n                       << rig::FOV_DISTORTION_STR << \"\\n\");\n      if (distortion.size() == 4 &&\n          str_vals[0] != rig::FISHEYE_DISTORTION_STR &&\n          str_vals[0] != rig::RADTAN_DISTORTION_STR)\n        vw::vw_throw(vw::IOErr() \n                     << \"When there are 4 distortion coefficients, distortion type \"\n                     << \"must be: \" << rig::FISHEYE_DISTORTION_STR << \" or \"\n                     << rig::RADTAN_DISTORTION_STR << \"\\n\");\n      if (distortion.size() == 5 &&\n          str_vals[0] != rig::RADTAN_DISTORTION_STR)\n        vw::vw_throw(vw::IOErr() \n                     << \"When there are 5 distortion coefficient, distortion type must be: \"\n                     << rig::RADTAN_DISTORTION_STR << \"\\n\");\n      if ((distortion.size() > 5) &&\n          str_vals[0] != rig::RPC_DISTORTION_STR)\n        vw::vw_throw(vw::IOErr() \n                     << \"When there are more than 5 distortion coefficients, distortion \"\n                     << \"type must be: \" << rig::RPC_DISTORTION_STR << \"\\n\");\n\n      // Set distortion type based on str_vals[0]\n      if (str_vals[0] == rig::NO_DISTORTION_STR) \n        dist_type = rig::NO_DISTORTION;\n      else if (str_vals[0] == rig::FOV_DISTORTION_STR) \n        dist_type = rig::FOV_DISTORTION;\n      else if (str_vals[0] == rig::FISHEYE_DISTORTION_STR) \n        dist_type = rig::FISHEYE_DISTORTION;\n      else if (str_vals[0] == rig::RADTAN_DISTORTION_STR)\n        dist_type = rig::RADTAN_DISTORTION;\n      else if (str_vals[0] == rig::RPC_DISTORTION_STR)\n        dist_type = rig::RPC_DISTORTION;\n      else\n        vw::vw_throw(vw::IOErr() << \"Unknown distortion type: \" << str_vals[0] << \"\\n\");\n      \n      readConfigVals(f, \"image_size:\", 2, vals);\n      Eigen::Vector2i image_size(vals[0], vals[1]);\n\n      readConfigVals(f, \"distorted_crop_size:\", 2, vals);\n      Eigen::Vector2i distorted_crop_size(vals[0], vals[1]);\n\n      readConfigVals(f, \"undistorted_image_size:\", 2, vals);\n      Eigen::Vector2i undistorted_image_size(vals[0], vals[1]);\n\n      rig::CameraParameters params(image_size, focal_length, optical_center, \n                                      distortion, dist_type);\n      \n      params.SetDistortedCropSize(distorted_crop_size);\n      params.SetUndistortedSize(undistorted_image_size);\n      R.cam_params.push_back(params);\n\n      readConfigVals(f, \"ref_to_sensor_transform:\", 12, vals);\n      R.ref_to_cam_trans.push_back(vecToAffine(vals));\n\n      // Sanity check\n      if (have_rig_transforms) {\n        if (R.ref_to_cam_trans.back().matrix() == 0 * R.ref_to_cam_trans.back().matrix())\n          vw::vw_throw(vw::IOErr() \n                       << \"Failed to read valid transforms between the sensors on the rig\\n\");\n          \n        // Put a warning if the transform is the identity matrix if the sensor\n        // is not the ref one\n        if (sensor_name != ref_sensor_name && \n            R.ref_to_cam_trans.back().matrix() == Eigen::Affine3d::Identity().matrix()) \n          vw::vw_out(vw::WarningMessage) \n            << \"A non-reference sensor on the rig has the identity as the \"\n            << \"sensor transform. Sensor name: \" << sensor_name << \"\\n\";\n          \n        // The determinant of the transform must be 1.\n        double scale = pow(R.ref_to_cam_trans.back().linear().determinant(), 1.0 / 3.0);\n        if (std::abs(scale - 1.0) > 1e-6)\n          vw::vw_throw(vw::IOErr() \n                       << \"The determinant of the ref-to-sensor transform must be 1.\\n\");\n      }\n\n      readConfigVals(f, \"depth_to_image_transform:\", 12, vals);\n      R.depth_to_image.push_back(vecToAffine(vals));\n\n      readConfigVals(f, \"ref_to_sensor_timestamp_offset:\", 1, vals);\n      double timestamp_offset = vals[0];\n      R.ref_to_cam_timestamp_offsets.push_back(timestamp_offset);\n    }\n    \n  } catch(std::exception const& e) {\n    vw::vw_throw(vw::IOErr() << e.what() << \"\\n\");\n  }\n\n  R.validate();\n\n  return;\n}\n  \n}  // end namespace rig\n"
  },
  {
    "path": "src/asp/Rig/RigConfig.h",
    "content": "/* Copyright (c) 2017, United States Government, as represented by the\n * Administrator of the National Aeronautics and Space Administration.\n * \n * All rights reserved.\n * \n * The Astrobee platform is licensed under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n * \n *     http://www.apache.org/licenses/LICENSE-2.0\n * \n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n#ifndef ASP_RIG_RIG_CONFIG_H\n#define ASP_RIG_RIG_CONFIG_H\n\n// A structure to hold info about a set of rigs\n\n#include <asp/Rig/RigCameraParams.h>\n\n#include <Eigen/Geometry>\n\n#include <map>\n#include <vector>\n\nnamespace rig {\n\nstruct RigSet {\n\n  // For rig i, cam_set[i] will list the sensor/camera names in that rig.\n  // cam_set[i][0] is the reference sensor. All sensor\n  // names are unique. For convenience, this is also duplicated\n  // as 'cam_names', where all sensors are concatenated. That vector\n  // is often more convenient.\n  std::vector<std::vector<std::string>> cam_set;\n\n  // Must be in one-to-one correspondence with all vectors below.\n  std::vector<std::string> cam_names;\n\n  // A transform from a reference sensor to a sensor in the rig\n  // (including to itself, that's the identity transform). This\n  // concatenates all such transforms for all rigs, in the order\n  // given by concatenating cam_set[0], cam_set[1], etc.\n  std::vector<Eigen::Affine3d> ref_to_cam_trans;\n\n  // Depth-to-image transform for each sensor. It is the identity\n  // if there are no depth transforms. One per sensor. All\n  // concatenated.\n  std::vector<Eigen::Affine3d> depth_to_image;\n\n  // The value to add to each ref sensor time to get a given sensor\n  // time. One per sensor. All concatenated.\n  std::vector<double> ref_to_cam_timestamp_offsets;\n    \n  // Each sensor's intrinsics. All concatenated. \n  std::vector<rig::CameraParameters> cam_params;\n\n  // If this sensor is a reference sensor for one of the rig.\n  bool isRefSensor(std::string const& sensor_name) const;\n\n  // If this sensor is a reference sensor for one of the rig.\n  bool isRefSensor(int cam_id) const;\n\n  // Return the id of the rig given the index of the camera\n  // in cam_names.\n  int rigId(int cam_id) const;\n\n  // The name of the ref sensor for the rig having the given sensor id\n  std::string refSensor(int cam_id) const;\n\n  // Index in the list of sensors of the sensor with given name\n  int sensorIndex(std::string const& sensor_name) const;\n\n  // Given the id of a sensor, find the id of the ref sensor for the rig\n  // having this sensor\n  int refSensorId(int cam_id) const;\n   \n  // Create a rig set having a single rig  \n  RigSet subRig(int rig_id) const;\n  \n  // Sanity checks\n  void validate() const;\n};\n  \n// Save the optimized rig configuration\nvoid writeRigConfig(std::string const& out_dir, bool model_rig, RigSet const& R);\n  \n// Read a rig configuration. Check if the transforms among the sensors\n// on the rig is not 0, in that case will use it.\nvoid readRigConfig(std::string const& rig_config, bool have_rig_transforms,\n                   RigSet & R);\n}  // end namespace rig\n\n#endif  // ASP_RIG_RIG_CONFIG_H\n"
  },
  {
    "path": "src/asp/Rig/RigCostFunction.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Rig/RigCostFunction.h>\n#include <asp/Rig/CameraImage.h>\n#include <asp/Rig/RigConfig.h>\n#include <asp/Rig/TransformUtils.h>\n#include <asp/Rig/ImageLookup.h>\n#include <asp/Rig/BasicAlgs.h>\n#include <asp/Rig/RigUtils.h>\n\n#include <iostream>\n#include <iomanip>\n\nnamespace rig {\n\n// If applicable, set up the parameters block to fix the rig translations and/or rotations\nvoid setUpFixRigOptions(bool no_rig, bool fix_rig_translations, bool fix_rig_rotations,\n                        ceres::SubsetManifold*& constant_transform_manifold) {\n\n  constant_transform_manifold = NULL;\n\n  int beg = 0, end = 0;\n  if (!no_rig && fix_rig_translations) {\n    beg = 0;\n    end = 3;\n  }\n\n  if (!no_rig && fix_rig_rotations) {\n    if (!fix_rig_translations)\n      beg = 3; // only fix rotation\n    end = rig::NUM_RIGID_PARAMS;\n  }\n\n  // Make a vector that goes from beg to end with increment 1\n  std::vector<int> fixed_indices;\n  for (int it = beg; it < end; it++)\n    fixed_indices.push_back(it);\n\n  if (!fixed_indices.empty())\n    constant_transform_manifold\n      = new ceres::SubsetManifold(rig::NUM_RIGID_PARAMS, fixed_indices);\n}\n\nceres::LossFunction* GetLossFunction(std::string cost_fun, double th) {\n  // Convert to lower-case\n  std::transform(cost_fun.begin(), cost_fun.end(), cost_fun.begin(), ::tolower);\n\n  ceres::LossFunction* loss_function = NULL;\n  if (cost_fun == \"l2\")\n    loss_function = NULL;\n  else if (cost_fun == \"huber\")\n    loss_function = new ceres::HuberLoss(th);\n  else if (cost_fun == \"cauchy\")\n    loss_function = new ceres::CauchyLoss(th);\n  else if (cost_fun == \"l1\")\n    loss_function = new ceres::SoftLOneLoss(th);\n  else\n    LOG(FATAL) << \"Unknown cost function: \" + cost_fun;\n\n  return loss_function;\n}\n\nBracketedCamError::BracketedCamError(Eigen::Vector2d const& meas_dist_pix,\n                  double left_ref_stamp, double right_ref_stamp, double cam_stamp,\n                  std::vector<int> const& block_sizes,\n                  rig::CameraParameters const& cam_params):\n  m_meas_dist_pix(meas_dist_pix),\n  m_left_ref_stamp(left_ref_stamp),\n  m_right_ref_stamp(right_ref_stamp),\n  m_cam_stamp(cam_stamp),\n  m_block_sizes(block_sizes),\n  m_cam_params(cam_params),\n  m_num_focal_lengths(1) {\n  // Sanity check\n  if (m_block_sizes.size() != 8 || m_block_sizes[0] != NUM_RIGID_PARAMS ||\n      m_block_sizes[1] != NUM_RIGID_PARAMS || m_block_sizes[2] != NUM_RIGID_PARAMS ||\n      m_block_sizes[3] != NUM_XYZ_PARAMS || m_block_sizes[4] != NUM_SCALAR_PARAMS ||\n      m_block_sizes[5] != m_num_focal_lengths ||\n      m_block_sizes[6] != NUM_OPT_CTR_PARAMS ||\n      m_block_sizes[7] != 1) { // This will be overwritten shortly\n    LOG(FATAL) << \"BracketedCamError: The block sizes were not set up properly.\\n\";\n  }\n\n  // Set the correct distortion size. This cannot be done in the interface for now.\n  m_block_sizes[7] = m_cam_params.GetDistortion().size();\n}\n\n// Call to work with ceres::DynamicNumericDiffCostFunction.\nbool BracketedCamError::operator()(double const* const* parameters, double* residuals) const {\n  Eigen::Affine3d world_to_cam_trans =\n    calcWorldToCamBase(parameters[0],  // beg_world_to_ref_t\n                       parameters[1],  // end_world_to_ref_t\n                       parameters[2],  // ref_to_cam_trans\n                       m_left_ref_stamp, m_right_ref_stamp,\n                       parameters[4][0],  // ref_to_cam_offset\n                       m_cam_stamp);\n\n  // World point\n  Eigen::Vector3d X(parameters[3][0], parameters[3][1], parameters[3][2]);\n\n  // Make a deep copy which we will modify\n  rig::CameraParameters cam_params = m_cam_params;\n  Eigen::Vector2d focal_vector = Eigen::Vector2d(parameters[5][0], parameters[5][0]);\n  Eigen::Vector2d optical_center(parameters[6][0], parameters[6][1]);\n  Eigen::VectorXd distortion(m_block_sizes[7]);\n  for (int i = 0; i < m_block_sizes[7]; i++) distortion[i] = parameters[7][i];\n  cam_params.SetFocalLength(focal_vector);\n  cam_params.SetOpticalOffset(optical_center);\n  cam_params.SetDistortion(distortion);\n\n  // Convert world point to given cam coordinates\n  X = world_to_cam_trans * X;\n\n  // Project into the image\n  Eigen::Vector2d undist_pix\n    = cam_params.GetFocalVector().cwiseProduct(X.hnormalized());\n  Eigen::Vector2d curr_dist_pix;\n  cam_params.Convert<rig::UNDISTORTED_C, rig::DISTORTED>\n    (undist_pix, &curr_dist_pix);\n\n  // Compute the residuals\n  residuals[0] = curr_dist_pix[0] - m_meas_dist_pix[0];\n  residuals[1] = curr_dist_pix[1] - m_meas_dist_pix[1];\n\n  return true;\n}\n\n// Factory to hide the construction of the CostFunction object from the client code.\nceres::CostFunction*\nBracketedCamError::Create(Eigen::Vector2d const& meas_dist_pix, double left_ref_stamp,\n                          double right_ref_stamp, double cam_stamp,\n                          std::vector<int> const& block_sizes,\n                          rig::CameraParameters const& cam_params) {\n\n  ceres::DynamicNumericDiffCostFunction<BracketedCamError>* cost_function =\n    new ceres::DynamicNumericDiffCostFunction<BracketedCamError>\n    (new BracketedCamError(meas_dist_pix, left_ref_stamp, right_ref_stamp,\n                            cam_stamp, block_sizes, cam_params));\n\n  cost_function->SetNumResiduals(NUM_PIX_PARAMS);\n\n  // The camera wrapper knows all of the block sizes to add, except\n  // for distortion, which is last\n  for (size_t i = 0; i + 1 < block_sizes.size(); i++)  // note the i + 1\n    cost_function->AddParameterBlock(block_sizes[i]);\n\n  // The distortion block size is added separately as it is variable\n  cost_function->AddParameterBlock(cam_params.GetDistortion().size());\n\n  return cost_function;\n}\n\nBracketedDepthError::BracketedDepthError(double weight, Eigen::Vector3d const& meas_depth_xyz,\n                    double left_ref_stamp, double right_ref_stamp, double cam_stamp,\n                    std::vector<int> const& block_sizes):\n  m_weight(weight),\n  m_meas_depth_xyz(meas_depth_xyz),\n  m_left_ref_stamp(left_ref_stamp),\n  m_right_ref_stamp(right_ref_stamp),\n  m_cam_stamp(cam_stamp),\n  m_block_sizes(block_sizes) {\n  // Sanity check\n  if (m_block_sizes.size() != 7             ||\n      m_block_sizes[0] != NUM_RIGID_PARAMS  ||\n      m_block_sizes[1] != NUM_RIGID_PARAMS  ||\n      m_block_sizes[2] != NUM_RIGID_PARAMS  ||\n      (m_block_sizes[3] != NUM_RIGID_PARAMS && m_block_sizes[3] != NUM_AFFINE_PARAMS) ||\n      m_block_sizes[4] != NUM_SCALAR_PARAMS ||\n      m_block_sizes[5] != NUM_XYZ_PARAMS    ||\n      m_block_sizes[6] != NUM_SCALAR_PARAMS) {\n    LOG(FATAL) << \"BracketedDepthError: The block sizes were not set up properly.\\n\";\n  }\n}\n\n// Call to work with ceres::DynamicNumericDiffCostFunction.\nbool BracketedDepthError::operator()(double const* const* parameters,\n                                     double* residuals) const {\n  // Current world to camera transform\n  Eigen::Affine3d world_to_cam_trans =\n    calcWorldToCamBase(parameters[0],  // beg_world_to_ref_t\n                       parameters[1],  // end_world_to_ref_t\n                       parameters[2],  // ref_to_cam_trans\n                       m_left_ref_stamp, m_right_ref_stamp,\n                       parameters[6][0],  // ref_to_cam_offset\n                       m_cam_stamp);\n\n  // The current transform from the depth point cloud to the camera image\n  Eigen::Affine3d depth_to_image;\n  if (m_block_sizes[3] == NUM_AFFINE_PARAMS)\n    array_to_affine_transform(depth_to_image, parameters[3]);\n  else\n    array_to_rigid_transform(depth_to_image, parameters[3]);\n\n  // Apply the scale\n  double depth_to_image_scale = parameters[4][0];\n  depth_to_image.linear() *= depth_to_image_scale;\n\n  // Convert from depth cloud coordinates to cam coordinates\n  Eigen::Vector3d M = depth_to_image * m_meas_depth_xyz;\n\n  // Convert to world coordinates\n  M = world_to_cam_trans.inverse() * M;\n\n  // Triangulated world point\n  Eigen::Vector3d X(parameters[5][0], parameters[5][1], parameters[5][2]);\n\n  // Compute the residuals\n  for (size_t it = 0; it < NUM_XYZ_PARAMS; it++) {\n    residuals[it] = m_weight * (X[it] - M[it]);\n  }\n\n  return true;\n}\n\n// Factory to hide the construction of the CostFunction object from the client code.\nceres::CostFunction* BracketedDepthError::Create(double weight,\n                                                 Eigen::Vector3d const& meas_depth_xyz,\n                                                 double left_ref_stamp,\n                                                 double right_ref_stamp,\n                                                 double cam_stamp,\n                                                 std::vector<int> const& block_sizes) {\n  ceres::DynamicNumericDiffCostFunction<BracketedDepthError>* cost_function =\n    new ceres::DynamicNumericDiffCostFunction<BracketedDepthError>\n    (new BracketedDepthError(weight, meas_depth_xyz, left_ref_stamp, right_ref_stamp,\n                            cam_stamp, block_sizes));\n\n  // The residual size is always the same.\n  cost_function->SetNumResiduals(NUM_XYZ_PARAMS);\n\n  for (size_t i = 0; i < block_sizes.size(); i++)\n    cost_function->AddParameterBlock(block_sizes[i]);\n\n  return cost_function;\n}\n\nBracketedDepthMeshError::BracketedDepthMeshError(double weight,\n                        Eigen::Vector3d const& meas_depth_xyz,\n                        Eigen::Vector3d const& mesh_xyz,\n                        double left_ref_stamp, double right_ref_stamp, double cam_stamp,\n                        std::vector<int> const& block_sizes):\n  m_weight(weight),\n  m_meas_depth_xyz(meas_depth_xyz),\n  m_mesh_xyz(mesh_xyz),\n  m_left_ref_stamp(left_ref_stamp),\n  m_right_ref_stamp(right_ref_stamp),\n  m_cam_stamp(cam_stamp),\n  m_block_sizes(block_sizes) {\n  // Sanity check\n  if (m_block_sizes.size() != 6 ||\n      m_block_sizes[0] != NUM_RIGID_PARAMS  ||\n      m_block_sizes[1] != NUM_RIGID_PARAMS  ||\n      m_block_sizes[2] != NUM_RIGID_PARAMS  ||\n      (m_block_sizes[3] != NUM_RIGID_PARAMS  && m_block_sizes[3] != NUM_AFFINE_PARAMS) ||\n      m_block_sizes[4] != NUM_SCALAR_PARAMS ||\n      m_block_sizes[5] != NUM_SCALAR_PARAMS) {\n    LOG(FATAL) << \"BracketedDepthMeshError: The block sizes were not set up properly.\\n\";\n  }\n}\n\n// Call to work with ceres::DynamicNumericDiffCostFunction.\nbool BracketedDepthMeshError::operator()(double const* const* parameters, double* residuals) const {\n  // Current world to camera transform\n  Eigen::Affine3d world_to_cam_trans =\n    calcWorldToCamBase(parameters[0],  // beg_world_to_ref_t\n                       parameters[1],  // end_world_to_ref_t\n                       parameters[2],  // ref_to_cam_trans\n                       m_left_ref_stamp, m_right_ref_stamp,\n                       parameters[5][0],  // ref_to_cam_offset\n                       m_cam_stamp);\n\n  // The current transform from the depth point cloud to the camera image\n  Eigen::Affine3d depth_to_image;\n  if (m_block_sizes[3] == NUM_AFFINE_PARAMS)\n    array_to_affine_transform(depth_to_image, parameters[3]);\n  else\n    array_to_rigid_transform(depth_to_image, parameters[3]);\n\n  // Apply the scale\n  double depth_to_image_scale = parameters[4][0];\n  depth_to_image.linear() *= depth_to_image_scale;\n\n  // Convert from depth cloud coordinates to cam coordinates\n  Eigen::Vector3d M = depth_to_image * m_meas_depth_xyz;\n\n  // Convert to world coordinates\n  M = world_to_cam_trans.inverse() * M;\n\n  // Compute the residuals\n  for (size_t it = 0; it < NUM_XYZ_PARAMS; it++) {\n    residuals[it] = m_weight * (m_mesh_xyz[it] - M[it]);\n  }\n\n  return true;\n}\n\n// Factory to hide the construction of the CostFunction object from the client code.\nceres::CostFunction* BracketedDepthMeshError::Create(double weight,\n                                    Eigen::Vector3d const& meas_depth_xyz,\n                                    Eigen::Vector3d const& mesh_xyz,\n                                    double left_ref_stamp, double right_ref_stamp,\n                                    double cam_stamp, std::vector<int> const& block_sizes) {\n  ceres::DynamicNumericDiffCostFunction<BracketedDepthMeshError>* cost_function =\n    new ceres::DynamicNumericDiffCostFunction<BracketedDepthMeshError>\n    (new BracketedDepthMeshError(weight, meas_depth_xyz, mesh_xyz,\n                                  left_ref_stamp, right_ref_stamp,\n                                  cam_stamp, block_sizes));\n\n  // The residual size is always the same.\n  cost_function->SetNumResiduals(NUM_XYZ_PARAMS);\n\n  for (size_t i = 0; i < block_sizes.size(); i++)\n    cost_function->AddParameterBlock(block_sizes[i]);\n\n  return cost_function;\n}\n\nXYZError::XYZError(Eigen::Vector3d const& ref_xyz, std::vector<int> const& block_sizes, \n                   double weight): \n  m_ref_xyz(ref_xyz), m_block_sizes(block_sizes), m_weight(weight) {\n    \n  // Sanity check\n  if (m_block_sizes.size() != 1 || m_block_sizes[0] != NUM_XYZ_PARAMS)\n    LOG(FATAL) << \"XYZError: The block sizes were not set up properly.\\n\";\n}\n\n// Call to work with ceres::DynamicNumericDiffCostFunction.\n// Takes array of arrays as parameters.\n// TODO(oalexan1): May want to use the analytical Ceres cost function\nbool XYZError::operator()(double const* const* parameters, double* residuals) const {\n  // Compute the residuals\n  for (int it = 0; it < NUM_XYZ_PARAMS; it++)\n    residuals[it] = m_weight * (parameters[0][it] - m_ref_xyz[it]);\n\n  return true;\n}\n\n// Factory to hide the construction of the CostFunction object from the client code.\nceres::CostFunction* XYZError::Create(Eigen::Vector3d const& ref_xyz,\n                                    std::vector<int> const& block_sizes,\n                                    double weight) {\n  ceres::DynamicNumericDiffCostFunction<XYZError>* cost_function =\n    new ceres::DynamicNumericDiffCostFunction<XYZError>\n    (new XYZError(ref_xyz, block_sizes, weight));\n\n  // The residual size is always the same\n  cost_function->SetNumResiduals(NUM_XYZ_PARAMS);\n\n  // The camera wrapper knows all of the block sizes to add.\n  for (size_t i = 0; i < block_sizes.size(); i++) {\n    cost_function->AddParameterBlock(block_sizes[i]);\n  }\n  return cost_function;\n}\n\n// This cost function is for the --height-from-dem option. Unlike XYZError, it\n// uses an uncertainty, rather than a weight.\nHeightsFromDemError::HeightsFromDemError(Eigen::Vector3d const& dem_xyz, double uncertainty):\n  m_dem_xyz(dem_xyz), m_uncertainty(uncertainty) {\n}\n\nbool HeightsFromDemError::operator()(double const* const* parameters, double* residuals) const {\n  Eigen::Vector3d tri_xyz(parameters[0][0], parameters[0][1], parameters[0][2]);\n  \n  // Constrain all XYZ coordinates to the DEM position (following bundle_adjust logic)\n  for (int it = 0; it < NUM_XYZ_PARAMS; it++)\n    residuals[it] = (tri_xyz[it] - m_dem_xyz[it]) / m_uncertainty;\n  \n  return true;\n}\n\n// Factory to hide the construction of the CostFunction object from the client code.\nceres::CostFunction* HeightsFromDemError::Create(Eigen::Vector3d const& dem_xyz, \n                                                 double uncertainty) {\n\n  ceres::DynamicNumericDiffCostFunction<HeightsFromDemError>* cost_function =\n    new ceres::DynamicNumericDiffCostFunction<HeightsFromDemError>\n    (new HeightsFromDemError(dem_xyz, uncertainty));\n\n  // The residual size is 3 (all XYZ coordinates constrained to DEM)\n  cost_function->SetNumResiduals(NUM_XYZ_PARAMS);\n  \n  // Add the triangulated point parameter block (3 parameters: x, y, z)\n  cost_function->AddParameterBlock(NUM_XYZ_PARAMS);\n\n  return cost_function;\n}\n\nCamPositionErr::CamPositionErr(const double * init_world_to_cam, double uncertainty):\n  m_uncertainty(uncertainty) {\n\n  // Make a copy, as later the value at the pointer will change\n  m_init_position = calc_cam_position(init_world_to_cam);\n}\n\nbool CamPositionErr::operator()(double const* const* parameters, double* residuals) const {\n  Eigen::Vector3d curr_cam_position = calc_cam_position(parameters[0]);\n  for (size_t p = 0; p < NUM_XYZ_PARAMS; p++)\n      residuals[p] = (curr_cam_position[p] - m_init_position[p]) / m_uncertainty;\n  for (size_t p = NUM_XYZ_PARAMS; p < rig::NUM_RIGID_PARAMS; p++)\n    residuals[p] = 0; // for rotations\n  return true;\n}\n\n// Factory to hide the construction of the CostFunction object from the client code.\nceres::CostFunction* CamPositionErr::Create(const double * init_world_to_cam, \n                                            double uncertainty) {\n\n  ceres::DynamicNumericDiffCostFunction<CamPositionErr>* cost_function =\n    new ceres::DynamicNumericDiffCostFunction<CamPositionErr>\n    (new CamPositionErr(init_world_to_cam, uncertainty));\n\n  // The residual size is always the same\n  cost_function->SetNumResiduals(rig::NUM_RIGID_PARAMS);\n\n  // The camera wrapper knows all of the block sizes to add.\n  // The full parameter has the rotation too.\n  cost_function->AddParameterBlock(rig::NUM_RIGID_PARAMS);\n\n  return cost_function;\n}\n\n}  // end namespace rig\n"
  },
  {
    "path": "src/asp/Rig/RigCostFunction.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#ifndef ASP_RIG_COST_FUNCTION_H\n#define ASP_RIG_COST_FUNCTION_H\n\n#include <asp/Rig/RigCameraParams.h>\n#include <asp/Rig/RigConfig.h>\n#include <asp/Rig/TransformUtils.h>\n#include <asp/Rig/RigTypeDefs.h>\n#include <asp/Rig/RigData.h>\n#include <asp/Rig/RigOptions.h>\n\n#include <ceres/ceres.h>\n#include <ceres/dynamic_numeric_diff_cost_function.h>\n#include <ceres/loss_function.h>\n\n#include <Eigen/Core>\n#include <Eigen/Geometry>\n\n#include <vector>\n#include <string>\n\nnamespace rig {\n\n// Forward declarations\nclass cameraImage;\nclass RigSet;\n\n// If applicable, set up the parameters block to fix the rig translations and/or rotations\nvoid setUpFixRigOptions(bool no_rig, bool fix_rig_translations, bool fix_rig_rotations,\n                        ceres::SubsetManifold*& constant_transform_manifold);\n\nceres::LossFunction* GetLossFunction(std::string cost_fun, double th);\n\n// An error function minimizing the error of projecting\n// an xyz point into a camera that is bracketed by\n// two reference cameras. The precise timestamp offset\n// between them is also floated.\nstruct BracketedCamError {\n  EIGEN_MAKE_ALIGNED_OPERATOR_NEW\n  BracketedCamError(Eigen::Vector2d const& meas_dist_pix,\n                    double left_ref_stamp, double right_ref_stamp, double cam_stamp,\n                    std::vector<int> const& block_sizes,\n                    rig::CameraParameters const& cam_params);\n\n  // Call to work with ceres::DynamicNumericDiffCostFunction.\n  bool operator()(double const* const* parameters, double* residuals) const;\n\n  // Factory to hide the construction of the CostFunction object from the client code.\n  static ceres::CostFunction*\n  Create(Eigen::Vector2d const& meas_dist_pix, double left_ref_stamp, double right_ref_stamp,\n         double cam_stamp, std::vector<int> const& block_sizes,\n         rig::CameraParameters const& cam_params);\n\n private:\n  Eigen::Vector2d m_meas_dist_pix;             // Measured distorted current camera pixel\n  double m_left_ref_stamp, m_right_ref_stamp;  // left and right ref cam timestamps\n  double m_cam_stamp;                          // Current cam timestamp\n  std::vector<int> m_block_sizes;\n  rig::CameraParameters m_cam_params;\n  int m_num_focal_lengths;\n};  // End class BracketedCamError\n\n// An error function minimizing the product of a given weight and the\n// error between a triangulated point and a measured depth point. The\n// depth point needs to be transformed to world coordinates first. For\n// that one has to do pose interpolation.\nstruct BracketedDepthError {\n  EIGEN_MAKE_ALIGNED_OPERATOR_NEW\n  BracketedDepthError(double weight, Eigen::Vector3d const& meas_depth_xyz,\n                      double left_ref_stamp, double right_ref_stamp, double cam_stamp,\n                      std::vector<int> const& block_sizes);\n\n  // Call to work with ceres::DynamicNumericDiffCostFunction.\n  bool operator()(double const* const* parameters, double* residuals) const;\n\n  // Factory to hide the construction of the CostFunction object from the client code.\n  static ceres::CostFunction* Create(double weight, Eigen::Vector3d const& meas_depth_xyz,\n                                     double left_ref_stamp, double right_ref_stamp,\n                                     double cam_stamp, std::vector<int> const& block_sizes);\n\n private:\n  double m_weight;                             // How much weight to give to this constraint\n  Eigen::Vector3d m_meas_depth_xyz;            // Measured depth measurement\n  double m_left_ref_stamp, m_right_ref_stamp;  // left and right ref cam timestamps\n  double m_cam_stamp;                          // Current cam timestamp\n  std::vector<int> m_block_sizes;\n};  // End class BracketedDepthError\n\n// An error function minimizing the product of a given weight and the\n// error between a mesh point and a transformed measured depth point. The\n// depth point needs to be transformed to world coordinates first. For\n// that one has to do pose interpolation.\nstruct BracketedDepthMeshError {\n  EIGEN_MAKE_ALIGNED_OPERATOR_NEW\n  BracketedDepthMeshError(double weight,\n                          Eigen::Vector3d const& meas_depth_xyz,\n                          Eigen::Vector3d const& mesh_xyz,\n                          double left_ref_stamp, double right_ref_stamp, double cam_stamp,\n                          std::vector<int> const& block_sizes);\n\n  // Call to work with ceres::DynamicNumericDiffCostFunction.\n  bool operator()(double const* const* parameters, double* residuals) const;\n\n  // Factory to hide the construction of the CostFunction object from the client code.\n  static ceres::CostFunction* Create(double weight,\n                                     Eigen::Vector3d const& meas_depth_xyz,\n                                     Eigen::Vector3d const& mesh_xyz,\n                                     double left_ref_stamp, double right_ref_stamp,\n                                     double cam_stamp, std::vector<int> const& block_sizes);\n\n private:\n  double m_weight;                             // How much weight to give to this constraint\n  Eigen::Vector3d m_meas_depth_xyz;            // Measured depth measurement\n  Eigen::Vector3d m_mesh_xyz;                  // Point on preexisting mesh\n  double m_left_ref_stamp, m_right_ref_stamp;  // left and right ref cam timestamps\n  double m_cam_stamp;                          // Current cam timestamp\n  std::vector<int> m_block_sizes;\n};  // End class BracketedDepthMeshError\n\n// An error function minimizing a weight times the distance from a\n// variable xyz point to a fixed reference xyz point.\nstruct XYZError {\n  EIGEN_MAKE_ALIGNED_OPERATOR_NEW\n  XYZError(Eigen::Vector3d const& ref_xyz, std::vector<int> const& block_sizes, double weight);\n\n  // Call to work with ceres::DynamicNumericDiffCostFunction.\n  // Takes array of arrays as parameters.\n  // TODO(oalexan1): May want to use the analytical Ceres cost function\n  bool operator()(double const* const* parameters, double* residuals) const;\n\n  // Factory to hide the construction of the CostFunction object from the client code.\n  static ceres::CostFunction* Create(Eigen::Vector3d const& ref_xyz,\n                                     std::vector<int> const& block_sizes,\n                                     double weight);\n\n private:\n  Eigen::Vector3d m_ref_xyz;  // reference xyz\n  std::vector<int> m_block_sizes;\n  double m_weight;\n};  // End class XYZError\n\n/// A Ceres cost function. The residual is the difference between the initial\n/// position and optimized position, divided by given uncertainty. The variable\n/// has the rotations as well, but those are ignored.\nstruct CamPositionErr {\n  EIGEN_MAKE_ALIGNED_OPERATOR_NEW\n\n  CamPositionErr(const double * init_world_to_cam, double uncertainty);\n\n  bool operator()(double const* const* parameters, double* residuals) const;\n\n  // Factory to hide the construction of the CostFunction object from the client code.\n  static ceres::CostFunction* Create(const double * init_world_to_cam, double uncertainty);\n\n  Eigen::Vector3d m_init_position;\n  double m_uncertainty;\n};\n\n/// A Ceres cost function for constraining triangulated points to DEM positions.\n/// The residuals are the differences between the triangulated point coordinates\n/// and the point projected vertically onto the DEM from that location, divided\n/// by the uncertainty. All three coordinates (X, Y, Z) are constrained\n/// following bundle_adjust logic.\nstruct HeightsFromDemError {\n  EIGEN_MAKE_ALIGNED_OPERATOR_NEW\n\n  HeightsFromDemError(Eigen::Vector3d const& dem_xyz, double uncertainty);\n\n  bool operator()(double const* const* parameters, double* residuals) const;\n\n  // Factory to hide the construction of the CostFunction object from the client code.\n  static ceres::CostFunction* Create(Eigen::Vector3d const& dem_xyz, double uncertainty);\n\n  Eigen::Vector3d m_dem_xyz;\n  double m_uncertainty;\n};\n\n}  // namespace rig\n\n#endif  // ASP_RIG_COST_FUNCTION_H\n"
  },
  {
    "path": "src/asp/Rig/RigData.cc",
    "content": "// Structured to hold rig data for i/o and for optimization\n\n// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Rig/RigData.h>\n#include <asp/Rig/TransformUtils.h>\n\nnamespace rig {\n\n// Must call this before running the optimization to populate the OptState structure\nvoid toOptState(const Extrinsics& extrinsics, const RigSet& R, OptState& state,\n                bool no_rig, bool affine_depth_to_image, int num_depth_params) {\n  // Convert world_to_ref transforms\n  state.world_to_ref_vec.resize(extrinsics.world_to_ref.size() * rig::NUM_RIGID_PARAMS);\n  for (size_t cid = 0; cid < extrinsics.world_to_ref.size(); cid++)\n    rig::rigid_transform_to_array(extrinsics.world_to_ref[cid],\n                                  &state.world_to_ref_vec[rig::NUM_RIGID_PARAMS * cid]);\n  \n  // Convert world_to_cam transforms (only if no_rig)\n  if (no_rig) {\n    state.world_to_cam_vec.resize(extrinsics.world_to_cam.size() * rig::NUM_RIGID_PARAMS);\n    for (size_t cid = 0; cid < extrinsics.world_to_cam.size(); cid++)\n      rig::rigid_transform_to_array(extrinsics.world_to_cam[cid],\n                                    &state.world_to_cam_vec[rig::NUM_RIGID_PARAMS * cid]);\n  }\n  \n  // Convert ref_to_cam transforms from R\n  state.ref_to_cam_vec.resize(R.ref_to_cam_trans.size() * rig::NUM_RIGID_PARAMS);\n  for (size_t cam_type = 0; cam_type < R.ref_to_cam_trans.size(); cam_type++)\n    rig::rigid_transform_to_array(R.ref_to_cam_trans[cam_type],\n                                  &state.ref_to_cam_vec[rig::NUM_RIGID_PARAMS * cam_type]);\n  \n  // Convert depth_to_image transforms from R (affine or rigid)\n  state.depth_to_image_vec.resize(R.depth_to_image.size() * num_depth_params);\n  for (size_t cam_type = 0; cam_type < R.depth_to_image.size(); cam_type++) {\n    if (affine_depth_to_image)\n      rig::affine_transform_to_array(R.depth_to_image[cam_type],\n                                     &state.depth_to_image_vec[num_depth_params * cam_type]);\n    else\n      rig::rigid_transform_to_array(R.depth_to_image[cam_type],\n                                    &state.depth_to_image_vec[num_depth_params * cam_type]);\n  }\n  \n  // Copy intrinsics from R to state\n  int num_cam_types = R.cam_names.size();\n  state.focal_lengths.resize(num_cam_types);\n  state.optical_centers.resize(num_cam_types);\n  state.distortions.resize(num_cam_types);\n  for (int cam_type = 0; cam_type < num_cam_types; cam_type++) {\n    state.focal_lengths[cam_type] = R.cam_params[cam_type].GetFocalLength();\n    state.optical_centers[cam_type] = R.cam_params[cam_type].GetOpticalOffset();\n    state.distortions[cam_type] = R.cam_params[cam_type].GetDistortion();\n  }\n  \n  // Setup identity transforms for ref cam and right bracketing cam placeholders.\n  // These need to have different pointers because CERES wants it that way.\n  Eigen::Affine3d identity = Eigen::Affine3d::Identity();\n  state.ref_identity_vec.resize(rig::NUM_RIGID_PARAMS);\n  state.right_identity_vec.resize(rig::NUM_RIGID_PARAMS);\n  rig::rigid_transform_to_array(identity, &state.ref_identity_vec[0]);\n  rig::rigid_transform_to_array(identity, &state.right_identity_vec[0]);\n}\n\n// Must all this after optimization to update the Extrinsics structure\nvoid fromOptState(const OptState& state, Extrinsics& extrinsics, RigSet& R,\n                  bool no_rig, bool affine_depth_to_image, int num_depth_params) {\n  // Convert world_to_ref transforms\n  size_t num_world_to_ref = state.world_to_ref_vec.size() / rig::NUM_RIGID_PARAMS;\n  extrinsics.world_to_ref.resize(num_world_to_ref);\n  for (size_t cid = 0; cid < num_world_to_ref; cid++)\n    rig::array_to_rigid_transform(extrinsics.world_to_ref[cid],\n                                  &state.world_to_ref_vec[rig::NUM_RIGID_PARAMS * cid]);\n  \n  // Convert world_to_cam transforms (only if no_rig)\n  if (no_rig) {\n    size_t num_world_to_cam = state.world_to_cam_vec.size() / rig::NUM_RIGID_PARAMS;\n    extrinsics.world_to_cam.resize(num_world_to_cam);\n    for (size_t cid = 0; cid < num_world_to_cam; cid++)\n      rig::array_to_rigid_transform(extrinsics.world_to_cam[cid],\n                                    &state.world_to_cam_vec[rig::NUM_RIGID_PARAMS * cid]);\n  }\n  \n  // Convert ref_to_cam transforms back to R\n  size_t num_ref_to_cam = state.ref_to_cam_vec.size() / rig::NUM_RIGID_PARAMS;\n  R.ref_to_cam_trans.resize(num_ref_to_cam);\n  for (size_t cam_type = 0; cam_type < num_ref_to_cam; cam_type++)\n    rig::array_to_rigid_transform(R.ref_to_cam_trans[cam_type],\n                                  &state.ref_to_cam_vec[rig::NUM_RIGID_PARAMS * cam_type]);\n  \n  // Convert depth_to_image transforms back to R (affine or rigid)\n  size_t num_depth_to_image = state.depth_to_image_vec.size() / num_depth_params;\n  R.depth_to_image.resize(num_depth_to_image);\n  for (size_t cam_type = 0; cam_type < num_depth_to_image; cam_type++) {\n    if (affine_depth_to_image)\n      rig::array_to_affine_transform(R.depth_to_image[cam_type],\n                                     &state.depth_to_image_vec[num_depth_params * cam_type]);\n    else\n      rig::array_to_rigid_transform(R.depth_to_image[cam_type],\n                                    &state.depth_to_image_vec[num_depth_params * cam_type]);\n  }\n  \n  // Copy optimized intrinsics from state back to R\n  int num_cam_types = R.cam_names.size();\n  for (int cam_type = 0; cam_type < num_cam_types; cam_type++) {\n    R.cam_params[cam_type].SetFocalLength(Eigen::Vector2d(state.focal_lengths[cam_type],\n                                                           state.focal_lengths[cam_type]));\n    R.cam_params[cam_type].SetOpticalOffset(state.optical_centers[cam_type]);\n    R.cam_params[cam_type].SetDistortion(state.distortions[cam_type]);\n  }\n}\n\n} // namespace rig\n"
  },
  {
    "path": "src/asp/Rig/RigData.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#ifndef __ASP_RIG_RIG_DATA_H__\n#define __ASP_RIG_RIG_DATA_H__\n\n#include <asp/Rig/RigConfig.h>\n#include <Eigen/Core>\n#include <Eigen/Geometry>\n#include <vector>\n\n// Structured to hold rig data for i/o and for optimization\n\nnamespace rig {\n\n// Structured extrinsics data (human-readable, used for I/O and logic)\nstruct Extrinsics {\n  // Camera extrinsics as Affine3d transforms\n  std::vector<Eigen::Affine3d> world_to_ref;\n  std::vector<Eigen::Affine3d> world_to_cam;\n};\n\n// Optimization state (flattened data for Ceres parameter blocks). Must be populated\n// before optimization, and data from it must be exported after optimization.\nstruct OptState {\n  // Camera extrinsics (flattened to vector<double> for Ceres)\n  std::vector<double> world_to_cam_vec;\n  std::vector<double> world_to_ref_vec;\n  std::vector<double> ref_to_cam_vec;\n  std::vector<double> ref_identity_vec;\n  std::vector<double> right_identity_vec;\n  \n  // Camera intrinsics\n  std::vector<double> focal_lengths;\n  std::vector<Eigen::Vector2d> optical_centers;\n  std::vector<Eigen::VectorXd> distortions;\n  \n  // Depth-to-image transforms (flattened)\n  std::vector<double> depth_to_image_vec;\n};\n\n// Convert from structured extrinsics to optimization state\nvoid toOptState(const Extrinsics& extrinsics, const RigSet& R, OptState& state, \n                bool no_rig, bool affine_depth_to_image, int num_depth_params);\n\n// Convert from optimization state back to structured extrinsics\nvoid fromOptState(const OptState& state, Extrinsics& extrinsics, RigSet& R,\n                  bool no_rig, bool affine_depth_to_image, int num_depth_params);\n\n} // namespace rig\n\n#endif // __ASP_RIG_RIG_DATA_H__\n"
  },
  {
    "path": "src/asp/Rig/RigDem.cc",
    "content": "/* Copyright (c) 2017-2026, United States Government, as represented by the\n * Administrator of the National Aeronautics and Space Administration.\n * \n * All rights reserved.\n * \n * The Astrobee platform is licensed under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n * \n *     http://www.apache.org/licenses/LICENSE-2.0\n * \n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n#include <asp/Rig/RigDem.h>\n#include <asp/Rig/RigCameraUtils.h>\n#include <asp/Rig/RigCameraParams.h>\n#include <asp/Rig/CameraImage.h>\n#include <asp/Rig/BasicAlgs.h>\n#include <asp/Core/BundleAdjustUtils.h>\n#include <asp/Core/ImageUtils.h>\n\n#include <vw/Image/ImageChannels.h>\n#include <vw/Image/Interpolation.h>\n#include <vw/Core/Log.h>\n#include <vw/Core/Stopwatch.h>\n#include <vw/Cartography/CameraBBox.h>\n#include <vw/Cartography/GeoReference.h>\n#include <vw/Core/ProgressCallback.h>\n\n// This has logic that makes heavy use of both rig and asp functionality\n\nnamespace rig {\n\n// Update triangulated points with DEM heights (rig-specific version). See the\n// There is a version of this with the same name for bundle adjustment. Triangulated\n// points will also be overwritten by DEM points for each successfully found DEM point.\nvoid updateTriPtsFromDem(std::vector<rig::CameraParameters> const& cam_params,\n                         std::vector<rig::cameraImage>      const& cams,\n                         std::vector<Eigen::Affine3d>       const& world_to_cam,\n                         rig::PidCidFid                     const& pid_to_cid_fid,\n                         PidCidFidMap                       const& pid_cid_fid_inlier,\n                         rig::KeypointVec                   const& keypoint_vec,\n                         std::string                        const& dem_filename,\n                         // Outputs\n                         std::vector<Eigen::Vector3d>            & xyz_vec_orig,\n                         std::vector<Eigen::Vector3d>            & xyz_vec,\n                         std::vector<Eigen::Vector3d>            & dem_xyz_vec) {\n\n  // Load DEM for height constraints\n  vw::vw_out() << \"Updating triangulated points with DEM heights.\\n\";\n  vw::cartography::GeoReference dem_georef;\n  vw::ImageViewRef<vw::PixelMask<double>> masked_dem;\n  asp::create_masked_dem(dem_filename, dem_georef, masked_dem);\n\n  // Initialize output\n  int num_tri_points = pid_to_cid_fid.size();\n  dem_xyz_vec.resize(num_tri_points, Eigen::Vector3d(0, 0, 0));\n\n  // Create interpolated DEM for pixel lookups\n  vw::PixelMask<double> invalid_val;\n  vw::ImageViewRef<vw::PixelMask<double>> interp_dem\n   = vw::interpolate(masked_dem, vw::BilinearInterpolation(),\n                     vw::ValueEdgeExtension<vw::PixelMask<float>>(invalid_val));\n\n  // Progress reporting\n  vw::TerminalProgressCallback tpc(\"asp\", \"\\t--> \");\n  double inc_amount = 1.0 / std::max(1, num_tri_points);\n  tpc.report_progress(0);\n\n  for (int pid = 0; pid < num_tri_points; pid++) {\n    tpc.report_incremental_progress(inc_amount);\n\n    // Get the initial triangulated point as a guess\n    vw::Vector3 xyz_guess(xyz_vec_orig[pid][0], xyz_vec_orig[pid][1], xyz_vec_orig[pid][2]);\n\n    // Skip invalid initial points\n    if (xyz_guess == vw::Vector3(0, 0, 0))\n      continue;\n\n    vw::Vector3 accum_xyz(0, 0, 0);\n    int num_intersections = 0;\n\n    // Iterate through all camera observations for this triangulated point\n    for (const auto& cid_fid: pid_to_cid_fid[pid]) {\n\n      int cid = cid_fid.first;\n      int fid = cid_fid.second;\n\n      // Skip outliers\n      if (!rig::getMapValue(pid_cid_fid_inlier, pid, cid, fid))\n        continue;\n\n      // Get the distorted pixel observation\n      std::pair<float, float> kp_pair = keypoint_vec[cid][fid];\n      Eigen::Vector2d dist_pix(kp_pair.first, kp_pair.second);\n\n      // Calculate camera center and ray direction\n      Eigen::Vector3d cam_ctr, cam_dir;\n      rig::calcCamCtrDir(cam_params[cams[cid].camera_type], dist_pix, world_to_cam[cid],\n                         cam_ctr, cam_dir);\n\n      // Convert Eigen types to VW types for DEM intersection\n      vw::Vector3 cam_ctr_vw(cam_ctr[0], cam_ctr[1], cam_ctr[2]);\n      vw::Vector3 ray_dir_vw(cam_dir[0], cam_dir[1], cam_dir[2]);\n\n      // Intersect ray with DEM\n      bool treat_nodata_as_zero = false;\n      bool has_intersection = false;\n      double height_error_tol = 0.001; // 1 mm\n      double max_abs_tol      = 1e-14;\n      double max_rel_tol      = 1e-14;\n      int num_max_iter        = 25;\n      vw::Vector3 dem_xyz = vw::cartography::camera_pixel_to_dem_xyz\n        (cam_ctr_vw, ray_dir_vw,\n         vw::pixel_cast<vw::PixelMask<float>>(masked_dem),\n         dem_georef, treat_nodata_as_zero, has_intersection,\n         height_error_tol, max_abs_tol, max_rel_tol, num_max_iter, xyz_guess);\n\n      if (!has_intersection)\n        continue;\n\n      accum_xyz += dem_xyz;\n      num_intersections++;\n    }\n\n    // Average the successful intersections\n    vw::Vector3 dem_xyz(0, 0, 0);\n    if (num_intersections > 0)\n      dem_xyz = accum_xyz / double(num_intersections);\n\n    if (dem_xyz == vw::Vector3(0, 0, 0))\n      continue; // Skip invalid points\n\n    // Project vertically onto DEM\n    vw::Vector3 observation = dem_xyz;\n    if (asp::updatePointHeightFromDem(dem_georef, interp_dem, observation))\n      dem_xyz = observation;\n\n    // Convert from VW to Eigen\n    dem_xyz_vec[pid] = Eigen::Vector3d(dem_xyz[0], dem_xyz[1], dem_xyz[2]);\n\n    // If dem_xyz_vec[pid] is not zero, also overwrite xyz_vec and xyz_vec_orig,\n    // so the triangulated points can start on the DEM\n    if (dem_xyz_vec[pid] != Eigen::Vector3d(0, 0, 0)) {\n      xyz_vec[pid] = dem_xyz_vec[pid];\n      xyz_vec_orig[pid] = dem_xyz_vec[pid];\n    }\n  }\n\n  tpc.report_finished();\n}\n\n}  // namespace rig\n"
  },
  {
    "path": "src/asp/Rig/RigDem.h",
    "content": "/* Copyright (c) 2017-2026, United States Government, as represented by the\n * Administrator of the National Aeronautics and Space Administration.\n * \n * All rights reserved.\n * \n * The Astrobee platform is licensed under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n * \n *     http://www.apache.org/licenses/LICENSE-2.0\n * \n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n#ifndef ASP_RIG_DEM_H\n#define ASP_RIG_DEM_H\n\n#include <asp/Rig/RigTypeDefs.h>\n\n#include <Eigen/Core>\n#include <Eigen/Geometry>\n\n#include <vector>\n#include <string>\n\nnamespace rig {\n\n// Forward declarations\nclass CameraParameters;\nclass cameraImage;\n\n// Update triangulated points with DEM heights (rig-specific version). See the\n// There is a version of this with the same name for bundle adjustment. Triangulated\n// points will also be overwritten by DEM points for each successfully found DEM point.\n// There is a version of this with the same name for bundle adjustment.\nvoid updateTriPtsFromDem(std::vector<rig::CameraParameters> const& cam_params,\n                         std::vector<rig::cameraImage>      const& cams,\n                         std::vector<Eigen::Affine3d>       const& world_to_cam,\n                         rig::PidCidFid                     const& pid_to_cid_fid,\n                         PidCidFidMap                       const& pid_cid_fid_inlier,\n                         rig::KeypointVec                   const& keypoint_vec,\n                         std::string                        const& dem_filename,\n                         // Outputs\n                         std::vector<Eigen::Vector3d>            & xyz_vec_orig,\n                         std::vector<Eigen::Vector3d>            & xyz_vec,\n                         std::vector<Eigen::Vector3d>            & dem_xyz_vec);\n\n}  // namespace rig\n\n#endif  // ASP_RIG_DEM_H\n"
  },
  {
    "path": "src/asp/Rig/RigImageIO.cc",
    "content": "/* Copyright (c) 2021-2026, United States Government, as represented by the\n * Administrator of the National Aeronautics and Space Administration.\n *\n * All rights reserved.\n *\n * The \"ISAAC - Integrated System for Autonomous and Adaptive Caretaking\n * platform\" software is licensed under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License. */\n\n#include <asp/Rig/RigImageIO.h>\n#include <asp/Rig/RigCameraParams.h>\n#include <asp/Rig/CameraImage.h>\n#include <asp/Rig/SystemUtils.h>\n#include <asp/Rig/BasicAlgs.h>\n#include <asp/Core/ImageNormalization.h>\n#include <asp/Core/ImageUtils.h>\n#include <asp/Core/OpenCVUtils.h>\n\n#include <vw/Core/Log.h>\n#include <glog/logging.h>\n#include <boost/filesystem.hpp>\n\n#include <opencv2/imgproc.hpp>\n#include <opencv2/imgcodecs.hpp>\n\n#include <iostream>\n#include <fstream>\n#include <iomanip>\n\nnamespace fs = boost::filesystem;\n\nnamespace rig {\n\n// The images from the bag may need to be resized to be the same\n// size as in the calibration file. Sometimes the full-res images\n// can be so blurry that interest point matching fails, hence the\n// resizing.\n// Similar logic to deal with differences between image size and calibrated size\n// is used further down this code.\nvoid adjustImageSize(rig::CameraParameters const& cam_params, cv::Mat & image) {\n  int64_t raw_image_cols = image.cols;\n  int64_t raw_image_rows = image.rows;\n  int64_t calib_image_cols = cam_params.GetDistortedSize()[0];\n  int64_t calib_image_rows = cam_params.GetDistortedSize()[1];\n  int64_t factor = raw_image_cols / calib_image_cols;\n\n  // If the raw image has size 0, skip, but give a warning. This happens\n  // when the image is not found. If prior interest point matches exist,\n  // the workflow can still continue.\n  if (raw_image_cols == 0 || raw_image_rows == 0) {\n    LOG(WARNING) << \"Image has size 0, skipping.\";\n    return;\n  }\n  \n  if ((raw_image_cols != calib_image_cols * factor) ||\n      (raw_image_rows != calib_image_rows * factor)) {\n    LOG(FATAL) << \"Image width and height are: \"\n               << raw_image_cols << ' ' << raw_image_rows << \"\\n\"\n               << \"Calibrated image width and height are: \"\n               << calib_image_cols << ' ' << calib_image_rows << \"\\n\"\n               << \"These must be equal up to an integer factor.\\n\";\n  }\n\n  if (factor != 1) {\n    // TODO(oalexan1): This kind of resizing may be creating aliased images.\n    cv::Mat local_image;\n    cv::resize(image, local_image, cv::Size(), 1.0/factor, 1.0/factor, cv::INTER_AREA);\n    local_image.copyTo(image);\n  }\n\n  // Check\n  if (image.cols != calib_image_cols || image.rows != calib_image_rows)\n    LOG(FATAL) << \"The images have the wrong size.\";\n}\n\n// Read an image with 3 floats per pixel. OpenCV's imread() cannot do that.\nvoid readXyzImage(std::string const& filename, cv::Mat & img) {\n  std::ifstream f;\n  f.open(filename.c_str(), std::ios::binary | std::ios::in);\n  if (!f.is_open()) LOG(FATAL) << \"Cannot open file for reading: \" << filename << \"\\n\";\n\n  int rows, cols, channels;\n  // TODO(oalexan1): Replace below with int32_t and check that it is same thing.\n  f.read((char*)(&rows), sizeof(rows));         // NOLINT\n  f.read((char*)(&cols), sizeof(cols));         // NOLINT\n  f.read((char*)(&channels), sizeof(channels)); // NOLINT\n\n  img = cv::Mat::zeros(rows, cols, CV_32FC3);\n\n  for (int row = 0; row < rows; row++) {\n    for (int col = 0; col < cols; col++) {\n      cv::Vec3f P;\n      // TODO(oalexan1): See if using reinterpret_cast<char*> does the same\n      // thing.\n      for (int c = 0; c < channels; c++)\n        f.read((char*)(&P[c]), sizeof(P[c])); // NOLINT\n      img.at<cv::Vec3f>(row, col) = P;\n    }\n  }\n\n  return;\n}\n\nvoid readImageEntry(// Inputs\n                    std::string const& image_file,\n                    Eigen::Affine3d const& world_to_cam,\n                    std::vector<std::string> const& cam_names,\n                    int cam_type,\n                    double timestamp,\n                    int num_overlaps,\n                    // Outputs\n                    std::vector<std::map<double, rig::ImageMessage>> & image_maps,\n                    std::vector<std::map<double, rig::ImageMessage>> & depth_maps) {\n  \n  // Aliases\n  std::map<double, ImageMessage> & image_map = image_maps[cam_type];\n  std::map<double, ImageMessage> & depth_map = depth_maps[cam_type];\n\n  if (image_map.find(timestamp) != image_map.end())\n    vw::vw_out(vw::WarningMessage) \n      << \"Duplicate timestamp \" << std::setprecision(17) << timestamp\n      << \" for sensor id \" << cam_type << \"\\n\";\n  \n  // Read the image as grayscale, in order for feature matching to work.\n  // Non-byte images need to normalized to [0, 255] and converted to byte type.\n  // If num_overlaps is 0, no feature matching will happen, so no need to read\n  // the images.\n  if (num_overlaps > 0) {\n    bool hasByte = asp::hasByteChannels(image_file);\n    if (hasByte) {\n      image_map[timestamp].image = cv::imread(image_file, cv::IMREAD_GRAYSCALE);\n    } else {\n      vw::vw_out() << \"Non-byte image detected. Will normalize.\\n\";\n      vw::ImageViewRef<vw::PixelMask<float>> masked_image;\n      asp::normalizeImage(image_file, masked_image);\n      asp::maskedToScaledByteCvImage(masked_image, image_map[timestamp].image);\n    }\n  }\n  \n  // Populate the other fields \n  image_map[timestamp].name         = image_file;\n  image_map[timestamp].timestamp    = timestamp;\n  image_map[timestamp].world_to_cam = world_to_cam;\n\n  // Sanity check\n  if (depth_map.find(timestamp) != depth_map.end())\n     vw::vw_out(vw::WarningMessage) << \"Duplicate timestamp \" << std::setprecision(17) \n       << timestamp << \" for sensor id \" << cam_type << \"\\n\";\n\n  // Read the depth data, if present\n  std::string depth_file = fs::path(image_file).replace_extension(\".pc\").string();\n  if (fs::exists(depth_file)) {\n    //vw::vw_out() << \"Reading: \" << depth_file << std::endl;\n    rig::readXyzImage(depth_file, depth_map[timestamp].image);\n    depth_map[timestamp].name      = depth_file;\n    depth_map[timestamp].timestamp = timestamp;\n  }\n}\n\n// Write an image with 3 floats per pixel. OpenCV's imwrite() cannot do that.\nvoid saveXyzImage(std::string const& filename, cv::Mat const& img) {\n  if (img.depth() != CV_32F)\n    LOG(FATAL) << \"Expecting an image with float values.\\n\";\n  if (img.channels() != 3) LOG(FATAL) << \"Expecting 3 channels.\\n\";\n\n  std::ofstream f;\n  f.open(filename.c_str(), std::ios::binary | std::ios::out);\n  if (!f.is_open()) LOG(FATAL) << \"Cannot open file for writing: \" << filename << \"\\n\";\n\n  // Assign these to explicit variables so we know their type and size in bytes\n  // TODO(oalexan1): Replace below with int32_t and check that it is same thing.\n  int rows = img.rows, cols = img.cols, channels = img.channels();\n\n  // TODO(oalexan1): Avoid C-style cast. Test if\n  // reinterpret_cast<char*> does the same thing.\n  f.write((char*)(&rows), sizeof(rows));         // NOLINT\n  f.write((char*)(&cols), sizeof(cols));         // NOLINT\n  f.write((char*)(&channels), sizeof(channels)); // NOLINT\n\n  for (int row = 0; row < rows; row++) {\n    for (int col = 0; col < cols; col++) {\n      cv::Vec3f const& P = img.at<cv::Vec3f>(row, col);  // alias\n      // TODO(oalexan1): See if using reinterpret_cast<char*> does the same\n      // thing.\n      for (int c = 0; c < channels; c++)\n        f.write((char*)(&P[c]), sizeof(P[c])); // NOLINT\n    }\n  }\n\n  return;\n}\n\n// Save images and depth clouds to disk\nvoid saveImagesAndDepthClouds(std::vector<rig::cameraImage> const& cams) {\n  for (size_t it = 0; it < cams.size(); it++) {\n\n    std::cout << \"Writing: \" << cams[it].image_name << std::endl;\n    cv::imwrite(cams[it].image_name, cams[it].image);\n\n    if (cams[it].depth_cloud.cols > 0 && cams[it].depth_cloud.rows > 0) {\n      std::cout << \"Writing: \" << cams[it].depth_name << std::endl;\n      rig::saveXyzImage(cams[it].depth_name, cams[it].depth_cloud);\n    }\n  }\n\n  return;\n}\n\n// Save the list of images, for use with bundle_adjust.\nvoid saveImageList(std::vector<rig::cameraImage> const& cams,\n                   std::string const& image_list) {\n\n  // Create the directory having image_list\n  std::string dir = fs::path(image_list).parent_path().string();\n  rig::createDir(dir);\n  \n  std::cout << \"Writing: \" << image_list << std::endl;\n  std::ofstream ofs(image_list.c_str());\n  for (size_t it = 0; it < cams.size(); it++)\n    ofs << cams[it].image_name << std::endl;\n  ofs.close();\n\n  return;\n}\n\n} // namespace rig\n"
  },
  {
    "path": "src/asp/Rig/RigImageIO.h",
    "content": "/* Copyright (c) 2021-2026, United States Government, as represented by the\n * Administrator of the National Aeronautics and Space Administration.\n *\n * All rights reserved.\n *\n * The \"ISAAC - Integrated System for Autonomous and Adaptive Caretaking\n * platform\" software is licensed under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n#ifndef ASP_RIG_RIG_IMAGE_IO_H\n#define ASP_RIG_RIG_IMAGE_IO_H\n\n#include <string>\n#include <vector>\n#include <map>\n#include <opencv2/core.hpp>\n#include <Eigen/Geometry>\n\nnamespace rig {\n\nclass CameraParameters;\nstruct ImageMessage;\nstruct cameraImage;\n\n// The images from the bag may need to be resized to be the same\n// size as in the calibration file.\nvoid adjustImageSize(rig::CameraParameters const& cam_params, cv::Mat & image);\n\n// Read an image with 3 floats per pixel. OpenCV's imread() cannot do that.\nvoid readXyzImage(std::string const& filename, cv::Mat & img);\n\n// Write an image with 3 floats per pixel.\n//\n// This is used for saving 3D point cloud data (XYZ) as an image.\n// OpenCV's imwrite() cannot do this.\nvoid saveXyzImage(std::string const& filename, cv::Mat const& img);\n\n// Read an image and potentially its depth cloud\nvoid readImageEntry(// Inputs\n                    std::string const& image_file,\n                    Eigen::Affine3d const& world_to_cam,\n                    std::vector<std::string> const& cam_names,\n                    int cam_type,\n                    double timestamp,\n                    int num_overlaps,\n                    // Outputs\n                    std::vector<std::map<double, rig::ImageMessage>> & image_maps,\n                    std::vector<std::map<double, rig::ImageMessage>> & depth_maps);\n\n// Save images and their corresponding depth clouds to disk.\nvoid saveImagesAndDepthClouds(std::vector<rig::cameraImage> const& cams);\n\n// Save the list of images, for use with bundle_adjust.\nvoid saveImageList(std::vector<rig::cameraImage> const& cams,\n                   std::string const& image_list);\n\n}  // namespace rig\n\n#endif  // ASP_RIG_RIG_IMAGE_IO_H\n"
  },
  {
    "path": "src/asp/Rig/RigIo.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Rig/RigIo.h>\n#include <asp/Rig/RigImageIO.h>\n#include <asp/Rig/RigParseUtils.h>\n#include <asp/Rig/Detector.h>\n#include <asp/Rig/CameraImage.h>\n#include <asp/Rig/SystemUtils.h>\n#include <asp/Rig/BasicAlgs.h>\n#include <asp/Rig/RigConfig.h>\n#include <asp/Rig/RigCameraParams.h>\n#include <asp/Rig/InterpolationUtils.h>\n#include <asp/Rig/TransformUtils.h>\n#include <asp/Core/Nvm.h>\n\n#include <vw/InterestPoint/MatcherIO.h>\n#include <vw/Core/Log.h>\n\n#include <boost/filesystem.hpp>\n#include <opencv2/imgcodecs.hpp>\n#include <glog/logging.h>\n\n#include <fstream>\n#include <iostream>\n#include <iomanip>\n#include <string>\n#include <vector>\n#include <set>\n\nnamespace fs = boost::filesystem;\n\nnamespace rig {\n\n// For each image, find its sensor name and timestamp. The info can be in a list or\n// from the file or directory structure. If flexible_strategy is true, then \n// can try from list first, and if that fails, then from file/directory structure.\nvoid readImageSensorTimestamp(std::string const& image_sensor_list,\n                              std::vector<std::string> const& image_files,\n                              std::vector<std::string> const& cam_names,\n                              bool flexible_strategy,\n                              // Outputs\n                              std::vector<int> & cam_types,\n                              std::vector<double> & timestamps) {\n\n  // Parse the image sensor list if it is not empty\n  bool success = false;\n  if (image_sensor_list != \"\") {\n    bool success = parseImageSensorList(image_sensor_list, image_files, cam_names,\n                                        flexible_strategy,\n                                        cam_types, timestamps); // outputs\n    if (success)\n      return;\n    if (!success && !flexible_strategy)\n      LOG(FATAL) << \"Cannot parse the image sensor list: \" << image_sensor_list << \"\\n\";\n  }\n\n  // Clear the outputs\n  cam_types.clear(); cam_types.resize(image_files.size());\n  timestamps.clear(); timestamps.resize(image_files.size());\n\n  for (size_t it = 0; it < image_files.size(); it++) {\n    int cam_type = 0;\n    double timestamp = 0.0;\n    try {\n      std::string group; // not used \n      findCamTypeAndTimestamp(image_files[it], cam_names,\n                              cam_type, timestamp, group); // outputs\n    } catch (std::exception const& e) {\n        LOG(FATAL) << \"Could not infer sensor type and image timestamp. See the naming \"\n                   << \"convention, and check your images. Detailed message:\\n\" << e.what();\n    }\n\n    cam_types[it] = cam_type;\n    timestamps[it] = timestamp;\n  }\n}\n\n// Add poses for the extra desired images based on interpolation, extrapolation,\n// and/or the rig transform.\nvoid calcExtraPoses(std::string const& extra_list, bool use_initial_rig_transforms,\n                    double bracket_len, bool nearest_neighbor_interp,\n                    rig::RigSet const& R,\n                    // Append here\n                    std::vector<std::string>     & cid_to_filename,\n                    std::vector<int>             & cam_types,\n                    std::vector<double>          & timestamps,\n                    std::vector<Eigen::Affine3d> & world_to_cam) {\n\n  // Put the existing poses in a map\n  std::map<int, std::map<double, Eigen::Affine3d>> existing_world_to_cam;\n  std::set<std::string> existing_images;\n\n  for (size_t image_it = 0; image_it < cid_to_filename.size(); image_it++) {\n    auto const& image_file = cid_to_filename[image_it];\n    existing_images.insert(image_file);\n    int cam_type = cam_types[image_it];\n    double timestamp = timestamps[image_it];\n    Eigen::Affine3d world2cam = world_to_cam[image_it];\n    existing_world_to_cam[cam_type][timestamp] = world2cam;\n\n    if (use_initial_rig_transforms) {\n      // Use the rig constraint to find the poses for the other sensors on the rig\n      // First go to the ref sensor\n      double ref_timestamp = timestamp - R.ref_to_cam_timestamp_offsets[cam_type];\n\n      // Careful here with transform directions and order\n      Eigen::Affine3d cam_to_ref = R.ref_to_cam_trans[cam_type].inverse();\n      Eigen::Affine3d world_to_ref = cam_to_ref * world2cam;\n\n      // Now do all the sensors on that rig. Note how we do the reverse of the above\n      // timestamp and camera operations, but not just for the given cam_type,\n      // but for any sensor on the rig.\n      for (size_t sensor_it = 0; sensor_it < R.ref_to_cam_trans.size(); sensor_it++) {\n\n        if (R.rigId(sensor_it) != R.rigId(cam_type))\n          continue; // stay within the current rig\n\n        // Initialize the map if needed\n        if (existing_world_to_cam.find(sensor_it) == existing_world_to_cam.end())\n          existing_world_to_cam[sensor_it] = std::map<double, Eigen::Affine3d>();\n\n        // Add an entry, unless one already exists\n        std::map<double, Eigen::Affine3d> & map = existing_world_to_cam[sensor_it]; // alias\n        // TODO(oalexan1): Any issues with numerical precision of timestamps?\n        double curr_timestamp = ref_timestamp + R.ref_to_cam_timestamp_offsets[sensor_it];\n        if (map.find(curr_timestamp) == map.end())\n          existing_world_to_cam[sensor_it][curr_timestamp]\n            = R.ref_to_cam_trans[sensor_it] * world_to_ref;\n      }\n    }\n  }\n\n  // Read the extra image names. Ignore the ones already existing.\n  std::ifstream f(extra_list.c_str());\n  std::vector<std::string> extra_images;\n  if (!f.is_open())\n    LOG(FATAL) << \"Cannot open file for reading: \" << extra_list << \"\\n\";\n  std::string line;\n  while (getline(f, line)) {\n    if (line.empty() || line[0] == '#') continue;\n    std::string image_file;\n    std::istringstream iss(line);\n    if (!(iss >> image_file))\n      LOG(FATAL) << \"Cannot parse the image file in: \" << extra_list << \"\\n\";\n    if (existing_images.find(image_file) != existing_images.end())\n      continue; // this image already exists\n    extra_images.push_back(image_file);\n  }\n\n  // Infer the timestamp and sensor type for the extra images\n  std::vector<int> extra_cam_types;\n  std::vector<double> extra_timestamps;\n  bool flexible_strategy = true; // can handle with and without separate attributes\n  readImageSensorTimestamp(extra_list, extra_images, R.cam_names,\n                           flexible_strategy,\n                           extra_cam_types, extra_timestamps); // outputs\n\n  // Save the new images in a map, to ensure they are sorted.\n  // Also need maps for cam types and timestamps, to be able to associate\n  // image names with these\n  std::map<int, std::map<double, std::string>> extra_map;\n  std::map<std::string, int> extra_cam_types_map;\n  std::map<std::string, double> extra_timestamps_map;\n  for (size_t image_it = 0; image_it < extra_images.size(); image_it++) {\n    std::string image_file = extra_images[image_it];\n    int cam_type = extra_cam_types[image_it];\n    double curr_timestamp = extra_timestamps[image_it];\n    extra_map[cam_type][curr_timestamp] = image_file;\n    extra_cam_types_map[image_file] = cam_type;\n    extra_timestamps_map[image_file] = curr_timestamp;\n  }\n\n  // Iterate over each sensor type and interpolate or extrapolate into existing data\n  for (auto sensor_it = extra_map.begin(); sensor_it != extra_map.end(); sensor_it++) {\n\n    int cam_type = sensor_it->first;\n    std::map<double, std::string> & target_map = sensor_it->second; // alias\n\n    // Look up existing poses to be used for interpolation/extrapolation\n    auto & input_map = existing_world_to_cam[cam_type]; // alias\n    if (input_map.empty()) {\n      std::string msg = std::string(\"Cannot find camera poses for sensor: \")\n        + R.cam_names[cam_type] + \" as the data is insufficient.\\n\";\n      if (!use_initial_rig_transforms)\n        msg += std::string(\"If the rig configuration file has an initial rig, consider \")\n          + \"using the option --use_initial_rig_transforms.\\n\";\n      vw::vw_out() << msg;\n      continue;\n    }\n\n    std::vector<std::string> found_images;\n    std::vector<Eigen::Affine3d> found_poses;\n    interpOrExtrap(input_map, target_map, bracket_len, nearest_neighbor_interp,\n                   found_images, found_poses); // outputs\n\n    for (size_t found_it = 0; found_it < found_images.size(); found_it++) {\n      cid_to_filename.push_back(found_images[found_it]);\n      world_to_cam.push_back(found_poses[found_it]);\n\n      // Add the cam type and timestamp\n      auto type_it = extra_cam_types_map.find(found_images[found_it]);\n      if (type_it == extra_cam_types_map.end())\n        LOG(FATAL) << \"Cannot find cam type for image: \" << found_images[found_it] << \"\\n\";\n      cam_types.push_back(type_it->second);\n      auto time_it = extra_timestamps_map.find(found_images[found_it]);\n      if (time_it == extra_timestamps_map.end())\n        LOG(FATAL) << \"Cannot find timestamp for image: \" << found_images[found_it] << \"\\n\";\n      timestamps.push_back(time_it->second);\n    }\n  }\n}\n\nvoid readCameraPoses(std::string const& camera_poses_file,\n                     asp::nvmData & nvm) {\n\n  // Clear the outputs\n  nvm = asp::nvmData();\n\n  // Open the file\n  vw::vw_out() << \"Reading: \" << camera_poses_file << std::endl;\n  std::ifstream f(camera_poses_file.c_str());\n  if (!f.is_open())\n    LOG(FATAL) << \"Cannot open file for reading: \" << camera_poses_file << \"\\n\";\n\n  std::string line;\n  while (getline(f, line)) {\n    if (line.empty() || line[0] == '#') continue;\n\n    std::string image_file;\n    std::istringstream iss(line);\n    if (!(iss >> image_file))\n      LOG(FATAL) << \"Cannot parse the image file in: \"\n                 << camera_poses_file << \"\\n\";\n\n    // Read the camera to world transform\n    Eigen::VectorXd vals(12);\n    double val = -1.0;\n    int count = 0;\n    while (iss >> val) {\n      if (count >= 12) break;\n      vals[count] = val;\n      count++;\n    }\n\n    if (count != 12)\n      LOG(FATAL) << \"Expecting 12 values for the transform on line:\\n\" << line << \"\\n\";\n\n    Eigen::Affine3d world2cam = vecToAffine(vals);\n    nvm.world_to_cam.push_back(world2cam);\n    nvm.cid_to_filename.push_back(image_file);\n  }\n}\n\n// Read camera information and images from a list or from an NVM file. Can\n// interpolate/extrapolate poses for data from an extra list. Only later we will\n// consider if the features are shifted or not in the nvm.\nvoid readListOrNvm(// Inputs\n                   std::string const& camera_poses_list,\n                   std::string const& nvm_file,\n                   std::string const& image_sensor_list,\n                   std::string const& extra_list,\n                   bool use_initial_rig_transforms,\n                   double bracket_len, bool nearest_neighbor_interp,\n                   bool read_nvm_no_shift,\n                   int num_overlaps,\n                   rig::RigSet const& R,\n                   // Outputs\n                   asp::nvmData & nvm,\n                   std::vector<std::map<double, rig::ImageMessage>> & image_maps,\n                   std::vector<std::map<double, rig::ImageMessage>> & depth_maps) {\n\n  // Wipe the outputs\n  image_maps.clear();\n  depth_maps.clear();\n  image_maps.resize(R.cam_names.size());\n  depth_maps.resize(R.cam_names.size());\n\n  if (int(camera_poses_list.empty()) + int(nvm_file.empty()) != 1)\n    LOG(FATAL) << \"Must specify precisely one of --camera-poses or --nvm.\\n\";\n\n  if (camera_poses_list != \"\") {\n    rig::readCameraPoses(// Inputs\n                               camera_poses_list,\n                               // Outputs\n                               nvm);\n  } else {\n    asp::readNvm(nvm_file,\n                 nvm.cid_to_keypoint_map,\n                 nvm.cid_to_filename,\n                 nvm.pid_to_cid_fid,\n                 nvm.pid_to_xyz,\n                 nvm.world_to_cam,\n                 nvm.focal_lengths);\n    if (!read_nvm_no_shift) {\n      std::string offsets_file = asp::offsetsFilename(nvm_file);\n      asp::readNvmOffsets(offsets_file, nvm.optical_centers);\n      // Must have as many offsets as images\n      if (nvm.optical_centers.size() != nvm.cid_to_filename.size())\n        LOG(FATAL) << \"Expecting as many optical centers as images.\\n\";\n    }\n  }\n\n  // Infer the timestamp and sensor type from list or directory structure\n  std::vector<int> cam_types;\n  std::vector<double> timestamps;\n  bool flexible_strategy = false;\n  readImageSensorTimestamp(image_sensor_list, nvm.cid_to_filename, R.cam_names,\n                           flexible_strategy,\n                           cam_types, timestamps); // outputs\n\n  // Extra poses need be be added right after reading the original ones,\n  // to ensure the same book-keeping is done for all of them. The extra\n  // entries do not mess up the bookkeeping of pid_to_cid_fid, etc,\n  // if their cid is larger than the ones read from NVM.\n  if (extra_list != \"\")\n    calcExtraPoses(extra_list, use_initial_rig_transforms, bracket_len,\n                   nearest_neighbor_interp, R,\n                   // Append here\n                   nvm.cid_to_filename, cam_types, timestamps, nvm.world_to_cam);\n\n  if (num_overlaps > 0)\n    vw::vw_out() << \"Reading the images.\\n\";\n  else\n    vw::vw_out() << \"Not reading the images as no feature matching will be done.\\n\";\n\n  for (size_t it = 0; it < nvm.cid_to_filename.size(); it++)\n    readImageEntry(nvm.cid_to_filename[it], nvm.world_to_cam[it],\n                   R.cam_names, cam_types[it], timestamps[it],\n                   num_overlaps,\n                   // Outputs\n                   image_maps, depth_maps);\n  return;\n}\n\n// Given all the merged and filtered tracks in pid_cid_fid, for each\n// image pair cid1 and cid2 with cid1 < cid2 < cid1 + num_overlaps + 1,\n// save the matches of this pair which occur in the set of tracks.\nvoid saveInlierMatchPairs(// Inputs\n                          std::vector<rig::cameraImage> const& cams,\n                          int num_overlaps,\n                          rig::PidCidFid                const& pid_to_cid_fid,\n                          rig::KeypointVec              const& keypoint_vec,\n                          PidCidFidMap                  const& pid_cid_fid_inlier,\n                          std::string                   const& out_dir) {\n\n  MATCH_MAP matches;\n\n  for (size_t pid = 0; pid < pid_to_cid_fid.size(); pid++) {\n    for (auto cid_fid1 = pid_to_cid_fid[pid].begin();\n         cid_fid1 != pid_to_cid_fid[pid].end(); cid_fid1++) {\n      int cid1 = cid_fid1->first;\n      int fid1 = cid_fid1->second;\n\n      for (auto cid_fid2 = pid_to_cid_fid[pid].begin();\n           cid_fid2 != pid_to_cid_fid[pid].end(); cid_fid2++) {\n        int cid2 = cid_fid2->first;\n        int fid2 = cid_fid2->second;\n\n        // When num_overlaps == 0, we save only matches read from nvm rather\n        // ones made wen this tool was run.\n        bool is_good = (cid1 < cid2 && (num_overlaps == 0 || cid2 < cid1 + num_overlaps + 1));\n        if (!is_good)\n          continue;\n\n        // Consider inliers only\n        if (!rig::getMapValue(pid_cid_fid_inlier, pid, cid1, fid1) ||\n            !rig::getMapValue(pid_cid_fid_inlier, pid, cid2, fid2))\n          continue;\n\n        auto cid_pair = std::make_pair(cid1, cid2);\n\n        vw::ip::InterestPoint ip1(keypoint_vec[cid1][fid1].first, keypoint_vec[cid1][fid1].second);\n        vw::ip::InterestPoint ip2(keypoint_vec[cid2][fid2].first, keypoint_vec[cid2][fid2].second);\n\n        matches[cid_pair].first.push_back(ip1);\n        matches[cid_pair].second.push_back(ip2);\n      }\n    }\n  }  // End iterations over pid\n\n  for (auto it = matches.begin(); it != matches.end(); it++) {\n    auto & cid_pair = it->first;\n    rig::MATCH_PAIR const& match_pair = it->second;\n\n    int left_cid = cid_pair.first;\n    int right_cid = cid_pair.second;\n\n    std::string match_dir = out_dir + \"/matches\";\n    rig::createDir(match_dir);\n\n    bool matches_as_txt = false;\n    std::string match_file = vw::ip::match_filename(match_dir + \"/run\",\n                                                    cams[left_cid].image_name,\n                                                    cams[right_cid].image_name,\n                                                    matches_as_txt);\n\n    std::cout << \"Writing: \" << match_file << std::endl;\n    vw::ip::write_match_file(match_file, match_pair.first, match_pair.second, matches_as_txt);\n  }\n\n  // The image names (without directory) must be unique, or else bundle\n  // adjustment will fail.\n  std::set<std::string> base_names;\n  for (size_t it = 0; it < cams.size(); it++) {\n    std::string base_name = fs::path(cams[it].image_name).filename().string();\n    if (base_names.find(base_name) != base_names.end())\n      LOG(FATAL) << \"Non-unique image name (without directory): \" << base_name\n                 << \". It will not be possible to use these matches with bundle_adjust.\";\n    base_names.insert(base_name);\n  }\n\n} // end function saveInlierMatchPairs\n\n// Find convergence angles between every pair of images and save to disk their\n// percentiles assumed that the cameras in world_to_cam are up-to-date given the\n// current state of optimization, and that the residuals (including the\n// reprojection errors) have also been updated beforehand.\nvoid savePairwiseConvergenceAngles(// Inputs\n  rig::PidCidFid                const& pid_to_cid_fid,\n  rig::KeypointVec              const& keypoint_vec,\n  std::vector<rig::cameraImage> const& cams,\n  std::vector<Eigen::Affine3d>  const& world_to_cam,\n  std::vector<Eigen::Vector3d>  const& xyz_vec,\n  PidCidFidMap                  const& pid_cid_fid_inlier,\n  std::string                   const& conv_angles_file) {\n\n  rig::PairwiseConvergenceAngles conv_angles;\n\n  for (size_t pid = 0; pid < pid_to_cid_fid.size(); pid++) {\n\n    for (auto cid_fid1 = pid_to_cid_fid[pid].begin();\n         cid_fid1 != pid_to_cid_fid[pid].end(); cid_fid1++) {\n      int cid1 = cid_fid1->first;\n      int fid1 = cid_fid1->second;\n\n      // Deal with inliers only\n      if (!rig::getMapValue(pid_cid_fid_inlier, pid, cid1, fid1)) continue;\n\n      Eigen::Vector3d cam_ctr1 = (world_to_cam[cid1].inverse()) * Eigen::Vector3d(0, 0, 0);\n      Eigen::Vector3d ray1 = xyz_vec[pid] - cam_ctr1;\n      ray1.normalize();\n\n      for (auto cid_fid2 = pid_to_cid_fid[pid].begin();\n           cid_fid2 != pid_to_cid_fid[pid].end(); cid_fid2++) {\n        int cid2 = cid_fid2->first;\n        int fid2 = cid_fid2->second;\n\n        // Look at each cid and next cids\n        if (cid2 <= cid1)\n          continue;\n\n        // Deal with inliers only\n        if (!rig::getMapValue(pid_cid_fid_inlier, pid, cid2, fid2)) continue;\n\n        Eigen::Vector3d cam_ctr2 = (world_to_cam[cid2].inverse()) * Eigen::Vector3d(0, 0, 0);\n        Eigen::Vector3d ray2 = xyz_vec[pid] - cam_ctr2;\n        ray2.normalize();\n\n        // Calculate the convergence angle\n        double conv_angle = (180.0 / M_PI) * acos(ray1.dot(ray2));\n        if (std::isnan(conv_angle) || std::isinf(conv_angle)) continue;\n\n        // Add to the image pair\n        std::pair<int, int> pair(cid1, cid2);\n        conv_angles[pair].push_back(conv_angle);\n      }\n    }\n  }\n\n  // Sort the convergence angles per pair\n  std::cout << \"Writing: \" << conv_angles_file << std::endl;\n  std::ofstream ofs(conv_angles_file.c_str());\n  ofs << \"# Convergence angle percentiles (in degrees) for each image pair having matches\\n\";\n  ofs << \"# left_image right_image 25% 50% 75% num_matches\\n\";\n  ofs.precision(17);\n  for (auto it = conv_angles.begin(); it != conv_angles.end(); it++) {\n\n    // Sort the values first\n    std::vector<double> & vals = it->second; // alias\n    std::sort(vals.begin(), vals.end());\n    int len = vals.size();\n\n    int cid1 = (it->first).first;\n    int cid2 = (it->first).second;\n    ofs << cams[cid1].image_name << ' ' << cams[cid2].image_name << ' '\n        << vals[0.25 * len] << ' ' << vals[0.5 * len] << ' ' << vals[0.75*len] << ' '\n        << len << std::endl;\n  }\n  ofs.close();\n\n  return;\n} // end function savePairwiseConvergenceAngles\n\n}  // namespace rig\n\n"
  },
  {
    "path": "src/asp/Rig/RigIo.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#ifndef ASP_RIG_RIG_IO_H\n#define ASP_RIG_RIG_IO_H\n\n#include <asp/Rig/RigTypeDefs.h>\n#include <string>\n#include <vector>\n#include <map>\n\n#include <opencv2/core/mat.hpp>\n#include <Eigen/Core>\n#include <Eigen/Geometry>\n\n// Forward declarations of types from other headers\nnamespace rig {\n  struct cameraImage;\n  class RigSet;\n  struct ImageMessage;\n}\n\nnamespace asp {\n  class nvmData;\n}\n\nnamespace rig {\n\n// For each image, find its sensor name and timestamp. The info can be in a list or\n// from the file or directory structure. If flexible_strategy is true, then \n// can try from list first, and if that fails, then from file/directory structure.\nvoid readImageSensorTimestamp(std::string const& image_sensor_list, \n                              std::vector<std::string> const& image_files,\n                              std::vector<std::string> const& cam_names,\n                              bool flexible_strategy,\n                              // Outputs\n                              std::vector<int> & cam_types,\n                              std::vector<double> & timestamps);\n\nvoid readCameraPoses(// Inputs\n                     std::string const& camera_poses_file,\n                     // Outputs\n                     asp::nvmData & nvm);\n\n// Read camera information and images from a list or from an NVM file.\n// Can interpolate/extrapolate poses for data from an extra list.\n// Only later we will consider if the features are shifted or not in the nvm.\nvoid readListOrNvm(// Inputs\n                   std::string const& camera_poses_list,\n                   std::string const& nvm_file,\n                   std::string const& image_sensor_list,\n                   std::string const& extra_list,\n                   bool use_initial_rig_transforms,\n                   double bracket_len, bool nearest_neighbor_interp,\n                   bool read_nvm_no_shift,\n                   int num_overlaps,\n                   rig::RigSet const& R,\n                   // Outputs\n                   asp::nvmData & nvm,\n                   std::vector<std::map<double, rig::ImageMessage>> & image_maps,\n                   std::vector<std::map<double, rig::ImageMessage>> & depth_maps);\n\n// Save the inlier matches for each image pair to disk.\n//\n// Given all the merged and filtered tracks, this function iterates through\n// them and extracts the pairwise matches that belong to inlier tracks,\n// saving them to .match files.\nvoid saveInlierMatchPairs(// Inputs\n                          std::vector<rig::cameraImage> const& cams,\n                          int num_overlaps,\n                          rig::PidCidFid                const& pid_to_cid_fid,\n                          rig::KeypointVec              const& keypoint_vec,\n                          PidCidFidMap                  const& pid_cid_fid_inlier,\n                          std::string                   const& out_dir);\n\n// Find convergence angles between every pair of images and save\n// their percentiles to disk.\nvoid savePairwiseConvergenceAngles(// Inputs\n                                   rig::PidCidFid                const& pid_to_cid_fid,\n                                   rig::KeypointVec              const& keypoint_vec,\n                                   std::vector<rig::cameraImage> const& cams,\n                                   std::vector<Eigen::Affine3d>  const& world_to_cam,\n                                   std::vector<Eigen::Vector3d>  const& xyz_vec,\n                                   PidCidFidMap                  const& pid_cid_fid_inlier,\n                                   std::string                   const& conv_angles_file);\n\n}  // end namespace rig\n\n#endif  // ASP_RIG_RIG_IO_H\n"
  },
  {
    "path": "src/asp/Rig/RigMath.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Rig/RigMath.h>\n#include <Eigen/SVD>\n#include <glog/logging.h>\n#include <iostream>\n#include <vector>\n#include <algorithm>\n#include <cmath>\n\nnamespace rig {\n\n// Implement some heuristic to find the maximum rotation angle that can result\n// from applying the given transform. It is assumed that the transform is not\n// too different from the identity.\ndouble maxRotationAngle(Eigen::Affine3d const& T) {\n  Eigen::Vector3d angles = T.linear().eulerAngles(0, 1, 2);\n\n  // Angles close to +/-pi can result even if the matrix is close to identity\n  for (size_t it = 0; it < 3; it++)\n    angles[it] = std::min(std::abs(angles[it]), std::abs(M_PI - std::abs(angles[it])));\n  double angle_norm = (180.0 / M_PI) * angles.norm();\n  return angle_norm;\n}\n\n// Compute the azimuth and elevation for a (normal) vector\nvoid normalToAzimuthAndElevation(Eigen::Vector3d const& normal,\n                                 double& azimuth, double& elevation) {\n  if (normal.x() == 0 && normal.y() == 0) {\n    azimuth = 0.0;\n    if (normal.z() >= 0.0)\n      elevation = M_PI / 2.0;\n    else\n      elevation = -M_PI / 2.0;\n  } else {\n    azimuth = atan2(normal.y(), normal.x());\n    elevation = atan2(normal.z(), Eigen::Vector2d(normal.x(), normal.y()).norm());\n  }\n}\n\n// Compute a normal vector based on the azimuth and elevation angles\nvoid azimuthAndElevationToNormal(Eigen::Vector3d& normal, double azimuth, double elevation) {\n  double ca = cos(azimuth), sa = sin(azimuth);\n  double ce = cos(elevation), se = sin(elevation);\n  normal = Eigen::Vector3d(ca * ce, sa * ce, se);\n}\n\n// Snap the normal to the plane (and the plane itself) to make\n// all angles multiple of 45 degrees with the coordinate axes.\nvoid snapPlaneNormal(Eigen::Vector3d& plane_normal) {\n  double azimuth, elevation;\n  normalToAzimuthAndElevation(plane_normal, azimuth, elevation);\n\n  // Snap to multiple of 45 degrees\n  double radian45 = M_PI / 4.0;\n  azimuth = radian45 * round(azimuth / radian45);\n  elevation = radian45 * round(elevation / radian45);\n\n  azimuthAndElevationToNormal(plane_normal, azimuth, elevation);\n}\n\n// Find the best fitting plane to a set of points\nvoid bestFitPlane(const std::vector<Eigen::Vector3d>& points, Eigen::Vector3d& centroid,\n                  Eigen::Vector3d& plane_normal) {\n  // Copy coordinates to  matrix in Eigen format\n  size_t num_points = points.size();\n  Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> coord(3, num_points);\n\n  for (size_t i = 0; i < num_points; i++) coord.col(i) = points[i];\n\n  // calculate centroid\n  centroid = Eigen::Vector3d(coord.row(0).mean(), coord.row(1).mean(), coord.row(2).mean());\n\n  // subtract centroid\n  for (size_t it = 0; it < 3; it++) coord.row(it).array() -= centroid(it);\n\n  // We only need the left-singular matrix here\n  // https://math.stackexchange.com/questions/99299/best-fitting-plane-given-a-set-of-points\n  auto svd = coord.jacobiSvd(Eigen::ComputeThinU | Eigen::ComputeThinV);\n\n  plane_normal = svd.matrixU().rightCols<1>();\n}\n\n// Gamma correction for x between 0 and 1.\n// https://en.wikipedia.org/wiki/SRGB#Specification_of_the_transformation\ndouble gamma(double x) {\n  // return pow(x, 1.0/2.6);\n\n  if (x <= 0.0031308) return 12.92 * x;\n\n  return 1.055 * pow(x, 1.0 / 2.4) - 0.055;\n}\n\ndouble inv_gamma(double x) {\n  // return pow(x, 2.6);\n\n  if (x <= 0.04045) return x / 12.92;\n\n  return pow((x + 0.055) / (1.055), 2.4);\n}\n\n// Apply the inverse gamma transform to images, multiply them by\n// max_iso_times_exposure/ISO/exposure_time to adjust for\n// lightning differences, then apply the gamma transform back.\nvoid exposureCorrection(double max_iso_times_exposure, double iso, double exposure,\n                        cv::Mat const& input_image, cv::Mat& output_image) {\n  double scale = max_iso_times_exposure / iso / exposure;\n\n  // Make an image of the same type\n  input_image.copyTo(output_image);\n\n  // Apply the inverse gamma correction, multiply by scale,\n  // and apply the correction back\n#pragma omp parallel for\n  for (int row = 0; row < input_image.rows; row++) {\n    for (int col = 0; col < input_image.cols; col++) {\n      cv::Vec3b b = input_image.at<cv::Vec3b>(row, col);\n\n      cv::Vec3b c;\n      for (int color = 0; color < 3; color++) {\n        double x = 255.0 * gamma(inv_gamma(static_cast<double>(b[color]) / 255.0) * scale);\n        c[color] = std::min(round(x), 255.0);\n      }\n      output_image.at<cv::Vec3b>(row, col) = c;\n    }\n  }\n}\n\n}  // namespace rig\n"
  },
  {
    "path": "src/asp/Rig/RigMath.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#ifndef ASP_RIG_RIG_MATH_H\n#define ASP_RIG_RIG_MATH_H\n\n#include <Eigen/Core>\n#include <Eigen/Geometry>\n#include <opencv2/core/core.hpp>\n#include <vector>\n\nnamespace rig {\n\n// Implement some heuristic to find the maximum rotation angle that can result\n// from applying the given transform. It is assumed that the transform is not\n// too different from the identity.\ndouble maxRotationAngle(Eigen::Affine3d const& T);\n\n// Compute the azimuth and elevation for a (normal) vector\nvoid normalToAzimuthAndElevation(Eigen::Vector3d const& normal, double& azimuth, double& elevation);\n\n// Compute a normal vector based on the azimuth and elevation angles\nvoid azimuthAndElevationToNormal(Eigen::Vector3d& normal, double azimuth, double elevation);\n\n// Snap the normal to the plane (and the plane itself) to make\n// all angles multiple of 45 degrees with the coordinate axes.\nvoid snapPlaneNormal(Eigen::Vector3d& plane_normal);\n\n// Find the best fitting plane to a set of points\nvoid bestFitPlane(const std::vector<Eigen::Vector3d>& points, Eigen::Vector3d& centroid, Eigen::Vector3d& plane_normal);\n\n// Gamma and inverse gamma functions\n// https://en.wikipedia.org/wiki/SRGB#Specification_of_the_transformation\ndouble gamma(double x);\ndouble inv_gamma(double x);\n\n// Apply the inverse gamma transform to images, multiply them by\n// max_iso_times_exposure/ISO/exposure_time to adjust for\n// lightning differences, then apply the gamma transform back.\nvoid exposureCorrection(double max_iso_times_exposure, double iso,\n                        double exposure, cv::Mat const& input_image,\n                        cv::Mat& output_image);\n\n}  // namespace rig\n\n#endif  // ASP_RIG_RIG_MATH_H\n"
  },
  {
    "path": "src/asp/Rig/RigOptimizer.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Rig/RigOptimizer.h>\n#include <asp/Rig/RigCostFunction.h>\n#include <asp/Rig/RigCameraUtils.h>\n#include <asp/Rig/RigDem.h>\n#include <asp/Rig/CameraImage.h>\n#include <asp/Rig/RigConfig.h>\n#include <asp/Rig/TransformUtils.h>\n#include <asp/Rig/ImageLookup.h>\n#include <asp/Rig/BasicAlgs.h>\n#include <asp/Rig/RigUtils.h>\n#include <asp/Rig/TextureProcessing.h>\n#include <asp/Rig/Triangulation.h>\n#include <asp/Rig/RigOutlier.h>\n#include <asp/Core/ImageUtils.h>\n\n#include <ceres/ceres.h>\n#include <ceres/dynamic_numeric_diff_cost_function.h>\n#include <ceres/loss_function.h>\n\n#include <iomanip>\n#include <iostream>\n#include <set>\n\nnamespace rig {\n\n// A struct to hold the block sizes for the various cost functions\nstruct RigBlockSizes {\n  std::vector<int> image_block_sizes;\n  std::vector<int> depth_block_sizes;\n  std::vector<int> depth_mesh_block_sizes;\n  std::vector<int> xyz_block_sizes;\n};\n\n// Set up block sizes for various cost functions\nvoid set_up_block_sizes(int num_depth_params,\n                        RigBlockSizes& block_sizes) {\n  // Wipe the outputs\n  block_sizes.image_block_sizes.clear();\n  block_sizes.depth_block_sizes.clear();\n  block_sizes.depth_mesh_block_sizes.clear();\n  block_sizes.xyz_block_sizes.clear();\n\n  int num_focal_lengths = 1;      // The x and y focal length are assumed to be the same\n  int num_distortion_params = 1;  // will be overwritten later\n\n  // Set up the variable blocks to optimize for BracketedCamError\n\n  block_sizes.image_block_sizes.push_back(rig::NUM_RIGID_PARAMS);\n  block_sizes.image_block_sizes.push_back(rig::NUM_RIGID_PARAMS);\n  block_sizes.image_block_sizes.push_back(rig::NUM_RIGID_PARAMS);\n  block_sizes.image_block_sizes.push_back(rig::NUM_XYZ_PARAMS);\n  block_sizes.image_block_sizes.push_back(rig::NUM_SCALAR_PARAMS);\n  block_sizes.image_block_sizes.push_back(num_focal_lengths);\n  block_sizes.image_block_sizes.push_back(rig::NUM_OPT_CTR_PARAMS);\n  block_sizes.image_block_sizes.push_back(num_distortion_params);\n\n  // Set up variable blocks to optimize for BracketedDepthError\n  block_sizes.depth_block_sizes.push_back(rig::NUM_RIGID_PARAMS);\n  block_sizes.depth_block_sizes.push_back(rig::NUM_RIGID_PARAMS);\n  block_sizes.depth_block_sizes.push_back(rig::NUM_RIGID_PARAMS);\n  block_sizes.depth_block_sizes.push_back(num_depth_params);\n  block_sizes.depth_block_sizes.push_back(rig::NUM_SCALAR_PARAMS);\n  block_sizes.depth_block_sizes.push_back(rig::NUM_XYZ_PARAMS);\n  block_sizes.depth_block_sizes.push_back(rig::NUM_SCALAR_PARAMS);\n\n  // Set up the variable blocks to optimize for BracketedDepthMeshError\n  block_sizes.depth_mesh_block_sizes.push_back(rig::NUM_RIGID_PARAMS);\n  block_sizes.depth_mesh_block_sizes.push_back(rig::NUM_RIGID_PARAMS);\n  block_sizes.depth_mesh_block_sizes.push_back(rig::NUM_RIGID_PARAMS);\n  block_sizes.depth_mesh_block_sizes.push_back(num_depth_params);\n  block_sizes.depth_mesh_block_sizes.push_back(rig::NUM_SCALAR_PARAMS);\n  block_sizes.depth_mesh_block_sizes.push_back(rig::NUM_SCALAR_PARAMS);\n\n  // Set up the variable blocks to optimize for the mesh xyz\n  block_sizes.xyz_block_sizes.push_back(rig::NUM_XYZ_PARAMS);\n}\n\n// Evaluate the residuals before and after optimization\nvoid evalResiduals(// Inputs\n                   std::string              const& tag,\n                   std::vector<std::string> const& residual_names,\n                   std::vector<double>      const& residual_scales,\n                   // Outputs\n                   ceres::Problem     & problem,\n                   std::vector<double>& residuals) {\n\n  double total_cost = 0.0;\n  ceres::Problem::EvaluateOptions eval_options;\n  eval_options.num_threads = 1;\n  eval_options.apply_loss_function = false;  // want raw residuals\n  problem.Evaluate(eval_options, &total_cost, &residuals, NULL, NULL);\n\n  // Sanity checks, after the residuals are created\n  if (residuals.size() != residual_names.size())\n    LOG(FATAL) << \"There must be as many residual names as residual values.\";\n  if (residuals.size() != residual_scales.size())\n    LOG(FATAL) << \"There must be as many residual values as residual scales.\";\n\n  // Compensate for the scale\n  for (size_t it = 0; it < residuals.size(); it++)\n    residuals[it] /= residual_scales[it];\n\n  rig::calcResidualStats(residuals, residual_names, tag);\n  return;\n}\n\nvoid addRigReprojCostFun(// Observation\n                         Eigen::Vector2d const& dist_ip,\n                         double beg_ref_timestamp,\n                         double end_ref_timestamp,\n                         double cam_timestamp,\n                         // Params and variables\n                         std::vector<int> const& image_block_sizes,\n                         rig::CameraParameters const& cam_params,\n                         Eigen::VectorXd& distortion_vec,\n                         double* distortion_placeholder_ptr,\n                         double* beg_cam_ptr,\n                         double* end_cam_ptr,\n                         double* ref_to_cam_ptr,\n                         double* xyz_ptr,\n                         double* timestamp_offset_ptr,\n                         double* focal_length_ptr,\n                         double* optical_center_ptr,\n                         rig::RigSet const& R,\n                         int cam_type,\n                         std::string const& image_name,\n                         std::set<std::string> const& intrinsics_to_float,\n                         std::set<std::string> const& camera_poses_to_float,\n                         std::set<std::string> const& fixed_images,\n                         std::set<double*>& fixed_parameters,\n                         ceres::SubsetManifold* constant_transform_manifold,\n                         double min_timestamp_offset,\n                         double max_timestamp_offset,\n                         // Flags\n                         bool no_rig, bool fix_rig_translations,\n                         bool fix_rig_rotations, bool float_timestamp_offsets,\n                         double robust_threshold,\n                         // Output\n                         ceres::Problem& problem,\n                         std::vector<std::string>& residual_names,\n                         std::vector<double>& residual_scales) {\n\n  ceres::CostFunction* bracketed_cost_function =\n    rig::BracketedCamError::Create(dist_ip, beg_ref_timestamp,\n                                   end_ref_timestamp,\n                                   cam_timestamp, image_block_sizes,\n                                   cam_params);\n  ceres::LossFunction* bracketed_loss_function\n    = rig::GetLossFunction(\"cauchy\", robust_threshold);\n\n  // Handle the case of no distortion\n  double * distortion_ptr = NULL;\n  if (distortion_vec.size() > 0)\n    distortion_ptr = &distortion_vec[0];\n  else\n    distortion_ptr = distortion_placeholder_ptr;\n\n  residual_names.push_back(R.cam_names[cam_type] + \"_pix_x\");\n  residual_names.push_back(R.cam_names[cam_type] + \"_pix_y\");\n  residual_scales.push_back(1.0);\n  residual_scales.push_back(1.0);\n  problem.AddResidualBlock\n    (bracketed_cost_function, bracketed_loss_function,\n     beg_cam_ptr, end_cam_ptr, ref_to_cam_ptr, xyz_ptr,\n     timestamp_offset_ptr,\n     focal_length_ptr, optical_center_ptr, distortion_ptr);\n\n  // See which intrinsics to float\n  if (intrinsics_to_float.find(\"focal_length\") ==\n      intrinsics_to_float.end())\n    problem.SetParameterBlockConstant(focal_length_ptr);\n  if (intrinsics_to_float.find(\"optical_center\") ==\n      intrinsics_to_float.end())\n    problem.SetParameterBlockConstant(optical_center_ptr);\n  if (intrinsics_to_float.find(\"distortion\")\n      == intrinsics_to_float.end() || distortion_vec.size() == 0)\n    problem.SetParameterBlockConstant(distortion_ptr);\n\n  if (!no_rig) {\n    // See if to float the beg camera, which here will point to the ref cam\n    if (camera_poses_to_float.find(R.refSensor(cam_type))\n        == camera_poses_to_float.end())\n      problem.SetParameterBlockConstant(beg_cam_ptr);\n  } else {\n    // There is no rig. Then beg_cam_ptr refers to camera\n    // for cams[cid], and not to its ref bracketing cam.\n    // See if the user wants it floated.\n    if (camera_poses_to_float.find(R.cam_names[cam_type])\n        == camera_poses_to_float.end())\n      problem.SetParameterBlockConstant(beg_cam_ptr);\n  }\n\n  // The end cam floats only if the ref cam can float and end cam brackets\n  // a non-ref cam and we have a rig. \n  if (camera_poses_to_float.find(R.refSensor(cam_type))\n      == camera_poses_to_float.end() ||\n      R.isRefSensor(R.cam_names[cam_type]) || no_rig)\n    problem.SetParameterBlockConstant(end_cam_ptr);\n\n  // ref_to_cam is kept fixed at the identity if the cam is the ref type or\n  // no rig\n  if (camera_poses_to_float.find(R.cam_names[cam_type])\n      == camera_poses_to_float.end() ||\n      R.isRefSensor(R.cam_names[cam_type]) || no_rig) {\n    problem.SetParameterBlockConstant(ref_to_cam_ptr);\n    fixed_parameters.insert(ref_to_cam_ptr);\n  }\n\n  // See if to fix the rig translation or rotation components\n  if ((fix_rig_translations || fix_rig_rotations) &&\n      fixed_parameters.find(ref_to_cam_ptr) == fixed_parameters.end())\n    problem.SetManifold(ref_to_cam_ptr, constant_transform_manifold);\n\n  // See if to fix some images. For that, an image must be in the list,\n  // and its camera must be either of ref type or there must be no rig.\n  if (!fixed_images.empty() &&\n      (fixed_images.find(image_name) != fixed_images.end()) &&\n      (R.isRefSensor(R.cam_names[cam_type]) || no_rig))\n    problem.SetParameterBlockConstant(beg_cam_ptr);\n\n  if (!float_timestamp_offsets || R.isRefSensor(R.cam_names[cam_type]) ||\n      no_rig) {\n    // Either we don't float timestamp offsets at all, or the cam is the ref type,\n    // or with no extrinsics, when it can't float anyway.\n    problem.SetParameterBlockConstant(timestamp_offset_ptr);\n  } else {\n    problem.SetParameterLowerBound(timestamp_offset_ptr, 0,\n                                   min_timestamp_offset);\n    problem.SetParameterUpperBound(timestamp_offset_ptr, 0,\n                                   max_timestamp_offset);\n  }\n}\n\n// Ensure that the depth points agree with triangulated points\nvoid addRigDepthTriCostFun(// Observation\n                           Eigen::Vector3d const& depth_xyz,\n                           double beg_ref_timestamp,\n                           double end_ref_timestamp,\n                           double cam_timestamp,\n                           // Params & Variables\n                           std::vector<int> const& depth_block_sizes,\n                           int num_depth_params,\n                           double* beg_cam_ptr,\n                           double* end_cam_ptr,\n                           double* ref_to_cam_ptr,\n                           double* depth_to_image_ptr,\n                           double* depth_to_image_scale_ptr,\n                           double* xyz_ptr,\n                           double* timestamp_offset_ptr,\n                           rig::RigSet const& R,\n                           int cam_type,\n                           std::set<std::string> const& depth_to_image_transforms_to_float,\n                           // Flags\n                           bool float_scale,\n                           bool affine_depth_to_image,\n                           double depth_tri_weight,\n                           double robust_threshold,\n                           // Output\n                           ceres::Problem& problem,\n                           std::vector<std::string>& residual_names,\n                           std::vector<double>& residual_scales) {\n\n  ceres::CostFunction* bracketed_depth_cost_function\n    = rig::BracketedDepthError::Create(depth_tri_weight, depth_xyz,\n                                       beg_ref_timestamp, end_ref_timestamp,\n                                       cam_timestamp,\n                                       depth_block_sizes);\n\n  ceres::LossFunction* bracketed_depth_loss_function\n    = rig::GetLossFunction(\"cauchy\", robust_threshold);\n\n  residual_names.push_back(\"depth_tri_x_m\");\n  residual_names.push_back(\"depth_tri_y_m\");\n  residual_names.push_back(\"depth_tri_z_m\");\n  residual_scales.push_back(depth_tri_weight);\n  residual_scales.push_back(depth_tri_weight);\n  residual_scales.push_back(depth_tri_weight);\n  problem.AddResidualBlock\n    (bracketed_depth_cost_function, bracketed_depth_loss_function,\n     beg_cam_ptr, end_cam_ptr, ref_to_cam_ptr,\n     depth_to_image_ptr,\n     depth_to_image_scale_ptr,\n     xyz_ptr,\n     timestamp_offset_ptr);\n\n  // Note that above we already considered fixing some params.\n  // We won't repeat that code here.\n  // If we model an affine depth to image, fix its scale here,\n  // it will change anyway as part of depth_to_image_vec.\n  if (!float_scale || affine_depth_to_image) {\n    problem.SetParameterBlockConstant(depth_to_image_scale_ptr);\n  }\n\n  if (depth_to_image_transforms_to_float.find(R.cam_names[cam_type])\n      == depth_to_image_transforms_to_float.end())\n    problem.SetParameterBlockConstant(depth_to_image_ptr);\n}\n\n// Try to make each mesh intersection agree with corresponding depth\n// measurement, if it exists\nvoid addRigDepthMeshCostFun(// Observation\n                            Eigen::Vector3d const& depth_xyz,\n                            Eigen::Vector3d const& mesh_xyz,\n                            double beg_ref_timestamp,\n                            double end_ref_timestamp,\n                            double cam_timestamp,\n                            // Params & Variables\n                            std::vector<int> const& depth_mesh_block_sizes,\n                            int num_depth_params,\n                            double* beg_cam_ptr,\n                            double* end_cam_ptr,\n                            double* ref_to_cam_ptr,\n                            double* depth_to_image_ptr,\n                            double* depth_to_image_scale_ptr,\n                            double* timestamp_offset_ptr,\n                            rig::RigSet const& R,\n                            int cam_type,\n                            std::set<std::string> const& depth_to_image_transforms_to_float,\n                            // Flags\n                            bool float_scale,\n                            bool affine_depth_to_image,\n                            double depth_mesh_weight,\n                            double robust_threshold,\n                            // Output\n                            ceres::Problem& problem,\n                            std::vector<std::string>& residual_names,\n                            std::vector<double>& residual_scales) {\n\n  ceres::CostFunction* bracketed_depth_mesh_cost_function\n    = rig::BracketedDepthMeshError::Create\n    (depth_mesh_weight, depth_xyz, mesh_xyz, beg_ref_timestamp,\n     end_ref_timestamp, cam_timestamp, depth_mesh_block_sizes);\n\n  ceres::LossFunction* bracketed_depth_mesh_loss_function\n    = rig::GetLossFunction(\"cauchy\", robust_threshold);\n\n  residual_names.push_back(\"depth_mesh_x_m\");\n  residual_names.push_back(\"depth_mesh_y_m\");\n  residual_names.push_back(\"depth_mesh_z_m\");\n  residual_scales.push_back(depth_mesh_weight);\n  residual_scales.push_back(depth_mesh_weight);\n  residual_scales.push_back(depth_mesh_weight);\n  problem.AddResidualBlock\n    (bracketed_depth_mesh_cost_function, bracketed_depth_mesh_loss_function,\n     beg_cam_ptr, end_cam_ptr, ref_to_cam_ptr,\n     depth_to_image_ptr,\n     depth_to_image_scale_ptr,\n     timestamp_offset_ptr);\n\n  // Note that above we already fixed some of these variables.\n  // Repeat the fixing of depth variables, however, as the previous block\n  // may not take place.\n  if (!float_scale || affine_depth_to_image)\n    problem.SetParameterBlockConstant(depth_to_image_scale_ptr);\n\n  if (depth_to_image_transforms_to_float.find(R.cam_names[cam_type])\n      == depth_to_image_transforms_to_float.end())\n    problem.SetParameterBlockConstant(depth_to_image_ptr);\n}\n\nvoid addRigMeshTriCostFun(Eigen::Vector3d const& avg_mesh_xyz,\n                         std::vector<int> const& xyz_block_sizes,\n                         double mesh_tri_weight,\n                         double robust_threshold,\n                         double* xyz_ptr,\n                         ceres::Problem& problem,\n                         std::vector<std::string>& residual_names,\n                         std::vector<double>& residual_scales) {\n\n  // Try to make the triangulated point agree with the mesh intersection\n  ceres::CostFunction* mesh_cost_function =\n    rig::XYZError::Create(avg_mesh_xyz, xyz_block_sizes, mesh_tri_weight);\n\n  ceres::LossFunction* mesh_loss_function =\n    rig::GetLossFunction(\"cauchy\", robust_threshold);\n\n  problem.AddResidualBlock(mesh_cost_function, mesh_loss_function,\n                           xyz_ptr);\n\n  residual_names.push_back(\"mesh_tri_x_m\");\n  residual_names.push_back(\"mesh_tri_y_m\");\n  residual_names.push_back(\"mesh_tri_z_m\");\n  residual_scales.push_back(mesh_tri_weight);\n  residual_scales.push_back(mesh_tri_weight);\n  residual_scales.push_back(mesh_tri_weight);\n}\n\nvoid addRigHeightsFromDemCostFun(Eigen::Vector3d const& dem_xyz,\n                                 double uncertainty,\n                                 double robust_threshold,\n                                 double* xyz_ptr,\n                                 ceres::Problem& problem,\n                                 std::vector<std::string>& residual_names,\n                                 std::vector<double>& residual_scales) {\n\n  // Create the DEM constraint cost function\n  ceres::CostFunction* dem_cost_function =\n    rig::HeightsFromDemError::Create(dem_xyz, uncertainty);\n\n  ceres::LossFunction* dem_loss_function = NULL;\n  if (robust_threshold > 0.0)\n    dem_loss_function = new ceres::CauchyLoss(robust_threshold);\n\n  problem.AddResidualBlock(dem_cost_function, dem_loss_function, xyz_ptr);\n\n  residual_names.push_back(\"dem_x_m\");\n  residual_names.push_back(\"dem_y_m\");\n  residual_names.push_back(\"dem_z_m\");\n  double scale = 1.0/uncertainty;\n  residual_scales.push_back(scale);\n  residual_scales.push_back(scale);\n  residual_scales.push_back(scale);\n}\n\nvoid addRigTriCostFun(Eigen::Vector3d const& xyz_orig,\n                      std::vector<int> const& xyz_block_sizes,\n                      double tri_weight,\n                      double robust_threshold,\n                      double* xyz_ptr,\n                      ceres::Problem& problem,\n                      std::vector<std::string>& residual_names,\n                      std::vector<double>& residual_scales) {\n\n  // Try to make the triangulated points (and hence cameras) not move too far\n  ceres::CostFunction* tri_cost_function =\n    rig::XYZError::Create(xyz_orig, xyz_block_sizes, tri_weight);\n\n  ceres::LossFunction* tri_loss_function =\n    rig::GetLossFunction(\"cauchy\", robust_threshold);\n\n  problem.AddResidualBlock(tri_cost_function, tri_loss_function,\n                           xyz_ptr);\n\n  residual_names.push_back(\"tri_x_m\");\n  residual_names.push_back(\"tri_y_m\");\n  residual_names.push_back(\"tri_z_m\");\n  residual_scales.push_back(tri_weight);\n  residual_scales.push_back(tri_weight);\n  residual_scales.push_back(tri_weight);\n}\n\n// Add the camera position constraints for the ref cams\nvoid addRigCamPosCostFun(// Observation\n                         std::vector<rig::cameraImage> const& cams,\n                         // Params & Variables\n                         rig::RigSet const& R,\n                         std::set<std::string> const& camera_poses_to_float,\n                         std::vector<double> const& ref_timestamps,\n                         std::vector<double>& world_to_cam_vec,\n                         std::vector<double>& world_to_ref_vec,\n                         std::vector<double>& ref_to_cam_vec,\n                         std::vector<double>& ref_identity_vec,\n                         std::vector<double>& right_identity_vec,\n                         // Flags\n                         bool no_rig,\n                         double camera_position_uncertainty,\n                         // Output\n                         ceres::Problem& problem,\n                         std::vector<std::string>& residual_names,\n                         std::vector<double>& residual_scales) {\n\n  for (size_t cid = 0; cid < cams.size(); cid++) {\n    int cam_type = cams[cid].camera_type;\n    auto const& sensor_name = R.cam_names[cam_type];\n\n    if (camera_poses_to_float.find(sensor_name)\n        == camera_poses_to_float.end()) continue; // sensor not floated\n\n    if (!no_rig && !R.isRefSensor(sensor_name))\n      continue; // only ref sensors are floated in a rig\n\n    // Find timestamps and pointers to bracketing cameras ref_to_cam transform.\n    // This strongly depends on whether we are using a rig or not.\n    double beg_ref_timestamp = -1.0, end_ref_timestamp = -1.0, cam_timestamp = -1.0;\n    double *beg_cam_ptr = NULL, *end_cam_ptr = NULL, *ref_to_cam_ptr = NULL;\n\n    rig::calcBracketing(// Inputs\n                  no_rig, cid, cam_type, cams, ref_timestamps, R,\n                  world_to_cam_vec, world_to_ref_vec, ref_to_cam_vec,\n                  ref_identity_vec, right_identity_vec,\n                  // Outputs\n                  beg_cam_ptr, end_cam_ptr, ref_to_cam_ptr,\n                  beg_ref_timestamp, end_ref_timestamp,\n                  cam_timestamp);\n\n    ceres::CostFunction* cam_pos_cost_function =\n       rig::CamPositionErr::Create(beg_cam_ptr, camera_position_uncertainty);\n    ceres::LossFunction* cam_pos_loss_function = NULL; // no robust threshold\n\n    problem.AddResidualBlock(cam_pos_cost_function, cam_pos_loss_function,\n                             beg_cam_ptr);\n\n    residual_names.push_back(sensor_name + \"_pos_x\");\n    residual_names.push_back(sensor_name + \"_pos_y\");\n    residual_names.push_back(sensor_name + \"_pos_z\");\n    residual_names.push_back(sensor_name + \"_q_x\");\n    residual_names.push_back(sensor_name + \"_q_y\");\n    residual_names.push_back(sensor_name + \"_q_z\");\n    residual_names.push_back(sensor_name + \"_q_w\");\n    // Record the uncertainty scaling factor in residual scales\n    residual_scales.push_back(1.0/camera_position_uncertainty);\n    residual_scales.push_back(1.0/camera_position_uncertainty);\n    residual_scales.push_back(1.0/camera_position_uncertainty);\n    residual_scales.push_back(1.0); // Rotations will not be constrained\n    residual_scales.push_back(1.0);\n    residual_scales.push_back(1.0);\n    residual_scales.push_back(1.0);\n  }\n}\n\n// Set up the optimization problem for rig calibration\nvoid setupRigOptProblem(// Inputs\n                        std::vector<cameraImage> const& cams,\n                        RigSet& R,\n                        std::vector<double> const& ref_timestamps,\n                        OptState& state,\n                        std::vector<double>& depth_to_image_scales,\n                        KeypointVec const& keypoint_vec,\n                        rig::PidCidFid const& pid_to_cid_fid,\n                        rig::PidCidFidMap const& pid_cid_fid_inlier,\n                        rig::PidCidFidToMeshXyz const& pid_cid_fid_mesh_xyz,\n                        std::vector<Eigen::Vector3d> const& pid_mesh_xyz,\n                        std::vector<Eigen::Vector3d>& xyz_vec,\n                        std::vector<Eigen::Vector3d> const& xyz_vec_orig,\n                        std::vector<Eigen::Vector3d> const& dem_xyz_vec,\n                        rig::RigBlockSizes const& block_sizes,\n                        int num_depth_params,\n                        std::vector<double> const& min_timestamp_offset,\n                        std::vector<double> const& max_timestamp_offset,\n                        RigOptions const& opt,\n                        // Outputs\n                        rig::PidCidFidMap& pid_cid_fid_to_residual_index,\n                        ceres::Problem& problem,\n                        std::vector<std::string>& residual_names,\n                        std::vector<double>& residual_scales) {\n\n  bool has_mesh = (opt.mesh != \"\");\n\n  // For when we don't have distortion but must get a pointer to\n  // distortion for the interface\n  double distortion_placeholder = 0.0;\n\n  // Prepare for the case of fixed rig translations and/or rotations\n  std::set<double*> fixed_parameters; // to avoid double fixing\n  ceres::SubsetManifold* constant_transform_manifold = nullptr;\n  rig::setUpFixRigOptions(opt.no_rig, opt.fix_rig_translations,\n                          opt.fix_rig_rotations,\n                          constant_transform_manifold);\n\n  for (size_t pid = 0; pid < pid_to_cid_fid.size(); pid++) {\n    for (auto cid_fid = pid_to_cid_fid[pid].begin();\n         cid_fid != pid_to_cid_fid[pid].end(); cid_fid++) {\n      int cid = cid_fid->first;\n      int fid = cid_fid->second;\n\n      // Deal with inliers only\n      if (!rig::getMapValue(pid_cid_fid_inlier, pid, cid, fid))\n        continue;\n\n      // Find timestamps and pointers to bracketing cameras ref_to_cam transform.\n      // This strongly depends on whether we are using a rig or not.\n      int cam_type = cams[cid].camera_type;\n      double beg_ref_timestamp = -1.0, end_ref_timestamp = -1.0, cam_timestamp = -1.0;\n      double *beg_cam_ptr = NULL, *end_cam_ptr = NULL, *ref_to_cam_ptr = NULL;\n      rig::calcBracketing(// Inputs\n                          opt.no_rig, cid, cam_type, cams, ref_timestamps, R,\n                          state.world_to_cam_vec, state.world_to_ref_vec, state.ref_to_cam_vec,\n                          state.ref_identity_vec, state.right_identity_vec,\n                          // Outputs\n                          beg_cam_ptr, end_cam_ptr, ref_to_cam_ptr,\n                          beg_ref_timestamp, end_ref_timestamp,\n                          cam_timestamp);\n\n      Eigen::Vector2d dist_ip(keypoint_vec[cid][fid].first,\n                              keypoint_vec[cid][fid].second);\n\n      // Remember the index of the pixel residuals about to create\n      pid_cid_fid_to_residual_index[pid][cid][fid] = residual_names.size();\n\n      // Add pixel reprojection error cost function\n      rig::addRigReprojCostFun(dist_ip, beg_ref_timestamp, end_ref_timestamp,\n                               cam_timestamp,\n                               block_sizes.image_block_sizes,\n                               R.cam_params[cam_type],\n                               state.distortions[cam_type], &distortion_placeholder,\n                               beg_cam_ptr, end_cam_ptr, ref_to_cam_ptr,\n                               &xyz_vec[pid][0],\n                               &R.ref_to_cam_timestamp_offsets[cam_type],\n                               &state.focal_lengths[cam_type],\n                               &state.optical_centers[cam_type][0],\n                               R, cam_type, cams[cid].image_name,\n                               opt.intrinsics_to_float[cam_type],\n                               opt.camera_poses_to_float, opt.fixed_images, fixed_parameters,\n                               constant_transform_manifold,\n                               min_timestamp_offset[cam_type],\n                               max_timestamp_offset[cam_type],\n                               opt.no_rig, opt.fix_rig_translations,\n                               opt.fix_rig_rotations, opt.float_timestamp_offsets,\n                               opt.robust_threshold,\n                               problem,\n                               residual_names, residual_scales);\n\n      // Add the depth to triangulated point constraint\n      Eigen::Vector3d depth_xyz(0, 0, 0);\n      bool have_depth_tri_constraint\n        = (opt.depth_tri_weight > 0 &&\n           rig::depthValue(cams[cid].depth_cloud, dist_ip, depth_xyz));\n      if (have_depth_tri_constraint)\n        rig::addRigDepthTriCostFun(depth_xyz, beg_ref_timestamp, end_ref_timestamp,\n                                   cam_timestamp,\n                                   block_sizes.depth_block_sizes,\n                                   num_depth_params,\n                                   beg_cam_ptr, end_cam_ptr, ref_to_cam_ptr,\n                                   &state.depth_to_image_vec[num_depth_params * cam_type],\n                                   &depth_to_image_scales[cam_type],\n                                   &xyz_vec[pid][0],\n                                   &R.ref_to_cam_timestamp_offsets[cam_type],\n                                   R, cam_type, opt.depth_to_image_transforms_to_float,\n                                   opt.float_scale,\n                                   opt.affine_depth_to_image,\n                                   opt.depth_tri_weight,\n                                   opt.robust_threshold,\n                                   problem,\n                                   residual_names,\n                                   residual_scales);\n\n      // Add the depth to mesh constraint\n      bool have_depth_mesh_constraint = false;\n      depth_xyz = Eigen::Vector3d(0, 0, 0);\n      Eigen::Vector3d mesh_xyz(0, 0, 0);\n      if (has_mesh) {\n        mesh_xyz = rig::getMapValue(pid_cid_fid_mesh_xyz, pid, cid, fid);\n        have_depth_mesh_constraint\n          = (opt.depth_mesh_weight > 0 && mesh_xyz != rig::badMeshXyz() &&\n             rig::depthValue(cams[cid].depth_cloud, dist_ip, depth_xyz));\n      }\n\n      if (have_depth_mesh_constraint)\n        rig::addRigDepthMeshCostFun(depth_xyz, mesh_xyz, beg_ref_timestamp,\n                                    end_ref_timestamp, cam_timestamp,\n                                    block_sizes.depth_mesh_block_sizes,\n                                    num_depth_params, beg_cam_ptr, end_cam_ptr,\n                                    ref_to_cam_ptr,\n                                    &state.depth_to_image_vec[num_depth_params * cam_type],\n                                    &depth_to_image_scales[cam_type],\n                                    &R.ref_to_cam_timestamp_offsets[cam_type],\n                                    R, cam_type, opt.depth_to_image_transforms_to_float,\n                                    opt.float_scale, opt.affine_depth_to_image,\n                                    opt.depth_mesh_weight, opt.robust_threshold,\n                                    problem, residual_names, residual_scales);\n    }  // end iterating over all cid for given pid\n\n    // The constraints below will be for each triangulated point. Skip such a\n    // point if all rays converging to it come from outliers.\n    bool isTriInlier = false;\n    for (auto cid_fid = pid_to_cid_fid[pid].begin();\n         cid_fid != pid_to_cid_fid[pid].end(); cid_fid++) {\n      int cid = cid_fid->first;\n      int fid = cid_fid->second;\n      if (rig::getMapValue(pid_cid_fid_inlier, pid, cid, fid)) {\n        isTriInlier = true;\n        break; // found it to be an inlier, no need to do further checking\n      }\n    }\n\n    // Add mesh-to-triangulated point constraint. Only apply for inlier points.\n    bool have_mesh_tri_constraint = false;\n    Eigen::Vector3d avg_mesh_xyz(0, 0, 0);\n    if (has_mesh && isTriInlier) {\n      avg_mesh_xyz = pid_mesh_xyz.at(pid);\n      if (opt.mesh_tri_weight > 0 && avg_mesh_xyz != rig::badMeshXyz())\n        have_mesh_tri_constraint = true;\n    }\n    if (have_mesh_tri_constraint)\n      rig::addRigMeshTriCostFun(avg_mesh_xyz, block_sizes.xyz_block_sizes,\n                                opt.mesh_tri_weight,\n                                opt.robust_threshold,\n                                &xyz_vec[pid][0], problem, residual_names,\n                                residual_scales);\n\n    bool haveDem = (!opt.heights_from_dem.empty() && opt.heights_from_dem_uncertainty > 0.0 &&\n        pid < dem_xyz_vec.size() && dem_xyz_vec[pid].norm() > 0 && xyz_vec[pid].norm() > 0);\n\n    // Add the constraint that the triangulated point does not go too far.\n    // This is exclusive with the dem and mesh constraints.\n    if (opt.tri_weight > 0.0 && isTriInlier && !haveDem && !have_mesh_tri_constraint)\n      rig::addRigTriCostFun(xyz_vec_orig[pid], block_sizes.xyz_block_sizes,\n                            opt.tri_weight, opt.tri_robust_threshold,\n                            &xyz_vec[pid][0], problem,\n                            residual_names, residual_scales);\n\n    // Add DEM constraints if requested and if we have valid DEM point and\n    // triangulated point.\n    if (haveDem && isTriInlier)\n      rig::addRigHeightsFromDemCostFun(dem_xyz_vec[pid], opt.heights_from_dem_uncertainty,\n                                       opt.heights_from_dem_robust_threshold,\n                                       &xyz_vec[pid][0], problem,\n                                       residual_names, residual_scales);\n\n  }  // end iterating over pid\n\n  // Add the camera position constraints for the ref cams. Need to respect\n  // the fact that opt.camera_position_uncertainty type is a vector of vectors.\n  if (opt.camera_position_uncertainty.size() > 0)\n    rig::addRigCamPosCostFun(cams, R, opt.camera_poses_to_float, ref_timestamps,\n                             state.world_to_cam_vec, state.world_to_ref_vec, state.ref_to_cam_vec,\n                             state.ref_identity_vec, state.right_identity_vec,\n                             opt.no_rig, opt.camera_position_uncertainty[0][0],\n                             problem, residual_names, residual_scales);\n}\n\n// Run an optimization pass for rig calibration\nvoid runOptPass(int pass,\n                int num_depth_params,\n                rig::RigOptions               const& opt,\n                std::vector<rig::cameraImage> const& imgData,\n                std::vector<double>           const& ref_timestamps,\n                rig::KeypointVec              const& keypoint_vec,\n                rig::PidCidFid                const& pid_to_cid_fid,\n                std::vector<double>           const& min_timestamp_offset,\n                std::vector<double>           const& max_timestamp_offset,\n                mve::TriangleMesh::Ptr        const& mesh,\n                std::shared_ptr<BVHTree>      const& bvh_tree,\n                // Outputs\n                std::vector<double>                & depth_to_image_scales,\n                rig::Extrinsics                    & cams,\n                rig::RigSet                        & R,\n                std::vector<Eigen::Vector3d>       & xyz_vec,\n                rig::PidCidFidMap                  & pid_cid_fid_inlier) {\n\n  // Set up the block sizes\n  rig::RigBlockSizes block_sizes;\n  rig::set_up_block_sizes(num_depth_params, block_sizes);\n\n  // Optimization state local to this pass. Must update the state from\n  // extrinsics and rig config, run the optimization, then update back the extrinsics.\n  rig::OptState state;\n  rig::toOptState(cams, R, state, opt.no_rig, opt.affine_depth_to_image, num_depth_params);\n\n  // Update cams.world_to_cam from current state. This is strictly necessary\n  // only when the rig is on, as then this data must be derived from the rig\n  // and the transforms for the reference sensor.\n  rig::calcWorldToCam(// Inputs\n                      opt.no_rig, imgData, state.world_to_ref_vec, ref_timestamps,\n                      state.ref_to_cam_vec, state.world_to_cam_vec,\n                      R.ref_to_cam_timestamp_offsets,\n                      // Output\n                      cams.world_to_cam);\n\n  // Triangulate, unless desired to reuse the initial points\n  if (!opt.use_initial_triangulated_points)\n    rig::multiViewTriangulation(// Inputs\n                                R.cam_params, imgData, cams.world_to_cam, pid_to_cid_fid,\n                                keypoint_vec,\n                                // Outputs\n                                pid_cid_fid_inlier, xyz_vec);\n\n  // This is a copy which won't change\n  std::vector<Eigen::Vector3d> xyz_vec_orig;\n  if (opt.tri_weight > 0.0) {\n    // Better copy manually to ensure no shallow copy\n    xyz_vec_orig.resize(xyz_vec.size());\n    for (size_t pt_it = 0; pt_it < xyz_vec.size(); pt_it++) {\n      for (int coord_it = 0; coord_it < 3; coord_it++) {\n        xyz_vec_orig[pt_it][coord_it] = xyz_vec[pt_it][coord_it];\n      }\n    }\n  }\n\n  // Compute where each ray intersects the mesh\n  rig::PidCidFidToMeshXyz pid_cid_fid_mesh_xyz;\n  std::vector<Eigen::Vector3d> pid_mesh_xyz;\n  if (opt.mesh != \"\")\n    rig::meshTriangulations(// Inputs\n                            R.cam_params, imgData, cams.world_to_cam, pid_to_cid_fid,\n                            pid_cid_fid_inlier, keypoint_vec,\n                            opt.min_ray_dist, opt.max_ray_dist, mesh, bvh_tree,\n                            // Outputs\n                            pid_cid_fid_mesh_xyz, pid_mesh_xyz);\n\n  // Update triangulated points with DEM heights if requested\n  std::vector<Eigen::Vector3d> dem_xyz_vec;\n  if (opt.heights_from_dem != \"\")\n    rig::updateTriPtsFromDem(R.cam_params, imgData, cams.world_to_cam, pid_to_cid_fid,\n                             pid_cid_fid_inlier, keypoint_vec,\n                             opt.heights_from_dem,\n                             // Outputs\n                             xyz_vec_orig, xyz_vec, dem_xyz_vec);\n\n  // For a given fid = pid_to_cid_fid[pid][cid], the value\n  // pid_cid_fid_to_residual_index[pid][cid][fid] will be the index in the array\n  // of residuals (look only at pixel residuals). This structure is populated\n  // only for inliers, so its total number of elements changes at each pass.\n  rig::PidCidFidMap pid_cid_fid_to_residual_index;\n  pid_cid_fid_to_residual_index.resize(pid_to_cid_fid.size());\n\n  // Form the problem\n  ceres::Problem problem;\n  std::vector<std::string> residual_names;\n  std::vector<double> residual_scales;\n  rig::setupRigOptProblem(imgData, R, ref_timestamps, state, depth_to_image_scales,\n                          keypoint_vec, pid_to_cid_fid, pid_cid_fid_inlier,\n                          pid_cid_fid_mesh_xyz, pid_mesh_xyz, xyz_vec, xyz_vec_orig,\n                          dem_xyz_vec, block_sizes, num_depth_params,\n                          min_timestamp_offset, max_timestamp_offset, opt,\n                          // Outputs\n                          pid_cid_fid_to_residual_index, problem, residual_names,\n                          residual_scales);\n\n  // Evaluate the residuals before optimization\n  std::vector<double> residuals;\n  rig::evalResiduals(\"before opt\", residual_names, residual_scales, problem, residuals);\n\n  if (pass == 0)\n    rig::writeResiduals(opt.out_prefix, \"initial\", R.cam_names, imgData, keypoint_vec,\n                        pid_to_cid_fid, pid_cid_fid_inlier, pid_cid_fid_to_residual_index,\n                        residuals);\n\n  // Solve the problem\n  ceres::Solver::Options options;\n  ceres::Solver::Summary summary;\n  options.linear_solver_type = ceres::ITERATIVE_SCHUR;\n  options.num_threads = opt.num_threads;\n  options.max_num_iterations = opt.num_iterations;\n  options.minimizer_progress_to_stdout = true;\n  options.gradient_tolerance = 1e-16;\n  options.function_tolerance = 1e-16;\n  options.parameter_tolerance = opt.parameter_tolerance;\n  ceres::Solve(options, &problem, &summary);\n\n  // The optimization is done. Convert state back to extrinsics and R (includes intrinsics).\n  rig::fromOptState(state, cams, R, opt.no_rig, opt.affine_depth_to_image, num_depth_params);\n\n  // Update cams.world_to_cam from optimized state. This is strictly necessary\n  // only when the rig is on, as then this data must be derived from the rig\n  // and the transforms for the reference sensor.\n  rig::calcWorldToCam(// Inputs\n                      opt.no_rig, imgData, state.world_to_ref_vec, ref_timestamps,\n                      state.ref_to_cam_vec, state.world_to_cam_vec,\n                      R.ref_to_cam_timestamp_offsets,\n                      // Output\n                      cams.world_to_cam);\n\n  // Evaluate the residuals after optimization\n  rig::evalResiduals(\"after opt\", residual_names, residual_scales, problem,\n                     residuals);\n\n  // Flag outliers after this pass using the computed residuals\n  rig::flagOutliers(// Inputs\n                    opt.min_triangulation_angle, opt.max_reprojection_error,\n                    pid_to_cid_fid, keypoint_vec,\n                    cams.world_to_cam, xyz_vec, pid_cid_fid_to_residual_index, residuals,\n                    // Outputs\n                    pid_cid_fid_inlier);\n\n  rig::writeResiduals(opt.out_prefix, \"final\", R.cam_names, imgData, keypoint_vec,\n                      pid_to_cid_fid, pid_cid_fid_inlier,\n                      pid_cid_fid_to_residual_index, residuals);\n}\n\n}  // end namespace rig\n"
  },
  {
    "path": "src/asp/Rig/RigOptimizer.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#ifndef ASP_RIG_OPTIMIZER_H\n#define ASP_RIG_OPTIMIZER_H\n\n#include <asp/Rig/RigCameraParams.h>\n#include <asp/Rig/RigTypeDefs.h>\n#include <asp/Rig/RigData.h>\n#include <asp/Rig/TextureProcessing.h>\n\n#include <Eigen/Core>\n#include <Eigen/Geometry>\n\n#include <vector>\n#include <string>\n\nnamespace rig {\n\n// Forward declarations\nclass cameraImage;\nclass RigSet;\nclass RigOptions;\n\n// Run an optimization pass for rig calibration\nvoid runOptPass(int pass,\n                int num_depth_params,\n                rig::RigOptions               const& opt,\n                std::vector<rig::cameraImage> const& imgData,\n                std::vector<double>           const& ref_timestamps,\n                rig::KeypointVec              const& keypoint_vec,\n                rig::PidCidFid                const& pid_to_cid_fid,\n                std::vector<double>           const& min_timestamp_offset,\n                std::vector<double>           const& max_timestamp_offset,\n                mve::TriangleMesh::Ptr        const& mesh,\n                std::shared_ptr<BVHTree>      const& bvh_tree,\n                // Outputs\n                std::vector<double>                & depth_to_image_scales,\n                rig::Extrinsics                    & cams,\n                rig::RigSet                        & R,\n                std::vector<Eigen::Vector3d>       & xyz_vec,\n                rig::PidCidFidMap                  & pid_cid_fid_inlier);\n\n}  // namespace rig\n\n#endif  // ASP_RIG_OPTIMIZER_H\n"
  },
  {
    "path": "src/asp/Rig/RigOptions.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file RigOptions.h\n///\n/// Options structure for rig_calibrator, inheriting common options from BaBaseOptions.\n\n#ifndef __ASP_RIG_OPTIONS_H__\n#define __ASP_RIG_OPTIONS_H__\n\n#include <asp/Core/BaBaseOptions.h>\n\n#include <set>\n#include <string>\n\nnamespace rig {\n\nstruct RigOptions: public asp::BaBaseOptions {\n  std::string rig_config, image_sensor_list, intrinsics_to_float_str,\n    camera_poses_to_float_str, depth_to_image_transforms_to_float_str,\n    mesh, hugin_file, xyz_file, camera_poses, extra_list,\n    out_texture_dir;\n  double bracket_len, depth_tri_weight, mesh_tri_weight, depth_mesh_weight,\n    timestamp_offsets_max_change,\n    initial_max_reprojection_error, max_reprojection_error,\n    min_ray_dist, max_ray_dist;\n  int num_overlaps, num_match_threads;\n  bool fix_rig_translations, fix_rig_rotations, float_scale,\n    float_timestamp_offsets, use_initial_triangulated_points,\n    affine_depth_to_image, registration, skip_post_registration, no_rig,\n    no_nvm_matches, use_initial_rig_transforms, bracket_single_image,\n    nearest_neighbor_interp, read_nvm_no_shift, save_nvm_no_shift,\n    save_matches, export_to_voxblox, save_pinhole_cameras,\n    save_transformed_depth_clouds, verbose;\n\n  // Parsed options\n  std::vector<std::set<std::string>> intrinsics_to_float;\n  std::set<std::string> camera_poses_to_float;\n  std::set<std::string> depth_to_image_transforms_to_float;\n  std::set<std::string> fixed_images;\n\n  RigOptions(): asp::BaBaseOptions(),\n    bracket_len(0.6), depth_tri_weight(1000.0),\n    mesh_tri_weight(0.0), depth_mesh_weight(0.0),\n    timestamp_offsets_max_change(1.0),\n    initial_max_reprojection_error(300.0), max_reprojection_error(25.0),\n    min_ray_dist(0.0), max_ray_dist(100.0),\n    num_overlaps(0), num_match_threads(8),\n    fix_rig_translations(false), fix_rig_rotations(false), float_scale(false),\n    float_timestamp_offsets(false), use_initial_triangulated_points(false),\n    affine_depth_to_image(false), registration(false), skip_post_registration(false),\n    no_rig(false), no_nvm_matches(false), use_initial_rig_transforms(false),\n    bracket_single_image(false), nearest_neighbor_interp(false),\n    read_nvm_no_shift(false), save_nvm_no_shift(false), save_matches(false),\n    export_to_voxblox(false), save_pinhole_cameras(false),\n    save_transformed_depth_clouds(false), verbose(false) {};\n};\n\n} // namespace rig\n\n#endif // __ASP_RIG_OPTIONS_H__\n"
  },
  {
    "path": "src/asp/Rig/RigOutlier.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Rig/RigOutlier.h>\n#include <asp/Rig/RigCameraParams.h>\n#include <asp/Rig/CameraImage.h>\n#include <asp/Rig/BasicAlgs.h>\n\n#include <iostream>\n#include <iomanip>\n\nnamespace rig {\n\nvoid flagOutlierByExclusionDist(// Inputs\n                                std::vector<rig::CameraParameters> const& cam_params,\n                                std::vector<rig::cameraImage>      const& cams,\n                                rig::PidCidFid                     const& pid_to_cid_fid,\n                                rig::KeypointVec                   const& keypoint_vec,\n                                // Outputs\n                                PidCidFidMap                            & pid_cid_fid_inlier) {\n\n  // Initialize the output\n  pid_cid_fid_inlier.resize(pid_to_cid_fid.size());\n\n  // Iterate though interest point matches\n  int num_excl = 0;\n  for (size_t pid = 0; pid < pid_to_cid_fid.size(); pid++) {\n    for (auto cid_fid = pid_to_cid_fid[pid].begin(); cid_fid != pid_to_cid_fid[pid].end();\n         cid_fid++) {\n      int cid = cid_fid->first;\n      int fid = cid_fid->second;\n      int cam_type = cams[cid].camera_type;\n\n      // Initially there are inliers only\n      pid_cid_fid_inlier[pid][cid][fid] = 1;\n\n      // Flag as outliers pixels at the image boundary.\n      Eigen::Vector2d dist_pix(keypoint_vec[cid][fid].first,\n                               keypoint_vec[cid][fid].second);\n      Eigen::Vector2i dist_size = cam_params[cam_type].GetDistortedSize();\n      Eigen::Vector2i dist_crop_size = cam_params[cam_type].GetDistortedCropSize();\n      // Note that if dist_crop_size equals dist_size, which is image\n      // size, no outliers are flagged\n      if (std::abs(dist_pix[0] - dist_size[0] / 2.0) > dist_crop_size[0] / 2.0  ||\n          std::abs(dist_pix[1] - dist_size[1] / 2.0) > dist_crop_size[1] / 2.0) {\n        rig::setMapValue(pid_cid_fid_inlier, pid, cid, fid, 0);\n        num_excl++;\n      }\n    }\n  }\n\n  std::cout << \"Removed \" << num_excl << \" features based on distorted_crop_size region.\\n\";\n  \n  return;\n}\n\n// Flag outliers by triangulation angle and reprojection error.  It is\n// assumed that the cameras in world_to_cam are up-to-date given the\n// current state of optimization, and that the residuals (including\n// the reprojection errors) have also been updated beforehand.\nvoid flagOutliers(// Inputs\n                  double min_triangulation_angle, double max_reprojection_error,\n                  rig::PidCidFid               const& pid_to_cid_fid,\n                  rig::KeypointVec             const& keypoint_vec,\n                  std::vector<Eigen::Affine3d> const& world_to_cam, \n                  std::vector<Eigen::Vector3d> const& xyz_vec,\n                  PidCidFidMap                 const& pid_cid_fid_to_residual_index,\n                  std::vector<double>          const& residuals,\n                  // Outputs\n                  PidCidFidMap                      & pid_cid_fid_inlier) {\n\n  // Must deal with outliers by triangulation angle before\n  // removing outliers by reprojection error, as the latter will\n  // exclude some rays which form the given triangulated points.\n  int num_outliers_small_angle = 0;\n  for (size_t pid = 0; pid < pid_to_cid_fid.size(); pid++) {\n    // Find the largest angle among any two intersecting rays\n    double max_rays_angle = 0.0;\n    bool point_checked = false;\n    for (auto cid_fid1 = pid_to_cid_fid[pid].begin();\n         cid_fid1 != pid_to_cid_fid[pid].end(); cid_fid1++) {\n      int cid1 = cid_fid1->first;\n      int fid1 = cid_fid1->second;\n\n      // Deal with inliers only\n      if (!rig::getMapValue(pid_cid_fid_inlier, pid, cid1, fid1)) \n        continue;\n\n      Eigen::Vector3d cam_ctr1 = (world_to_cam[cid1].inverse()) * Eigen::Vector3d(0, 0, 0);\n      Eigen::Vector3d ray1 = xyz_vec[pid] - cam_ctr1;\n      ray1.normalize();\n\n      for (auto cid_fid2 = pid_to_cid_fid[pid].begin();\n           cid_fid2 != pid_to_cid_fid[pid].end(); cid_fid2++) {\n        int cid2 = cid_fid2->first;\n        int fid2 = cid_fid2->second;\n\n        // Look at each cid and next cids\n        if (cid2 <= cid1)\n          continue;\n\n        // Deal with inliers only\n        if (!rig::getMapValue(pid_cid_fid_inlier, pid, cid2, fid2))\n           continue;\n        point_checked = true;\n\n        Eigen::Vector3d cam_ctr2 = (world_to_cam[cid2].inverse()) * Eigen::Vector3d(0, 0, 0);\n        Eigen::Vector3d ray2 = xyz_vec[pid] - cam_ctr2;\n        ray2.normalize();\n\n        double curr_angle = (180.0 / M_PI) * acos(ray1.dot(ray2));\n        if (std::isnan(curr_angle) || std::isinf(curr_angle)) continue;\n        max_rays_angle = std::max(max_rays_angle, curr_angle);\n      }\n    }\n\n    if (max_rays_angle >= min_triangulation_angle)\n      continue;  // This is a good triangulated point, with large angle of convergence\n     \n    if (!point_checked)\n      continue; // this point was an outlier to start with \n       \n    // Flag as outliers all the features for this cid and increment the counter\n    num_outliers_small_angle++;\n    for (auto cid_fid = pid_to_cid_fid[pid].begin();\n         cid_fid != pid_to_cid_fid[pid].end(); cid_fid++) {\n      int cid = cid_fid->first;\n      int fid = cid_fid->second;\n      rig::setMapValue(pid_cid_fid_inlier, pid, cid, fid, 0);\n    }\n  }\n\n  std::cout << std::setprecision(4) \n            << \"Removed \" << num_outliers_small_angle \n            << \" triangulated points out of \" << pid_to_cid_fid.size() \n            << \" (\" << (100.0 * num_outliers_small_angle) / pid_to_cid_fid.size() << \")\"\n            << \" by ray convergence angle.\\n\";\n  \n  int num_outliers_reproj = 0;\n  int num_total_features = 0;\n  for (size_t pid = 0; pid < pid_to_cid_fid.size(); pid++) {\n    for (auto cid_fid = pid_to_cid_fid[pid].begin();\n         cid_fid != pid_to_cid_fid[pid].end(); cid_fid++) {\n      int cid = cid_fid->first;\n      int fid = cid_fid->second;\n\n      // Deal with inliers only\n      if (!rig::getMapValue(pid_cid_fid_inlier, pid, cid, fid)) \n        continue;\n\n      num_total_features++;\n\n      // Find the pixel residuals\n      size_t residual_index = rig::getMapValue(pid_cid_fid_to_residual_index, pid, cid, fid);\n      if (residuals.size() <= residual_index + 1) LOG(FATAL) << \"Too few residuals.\\n\";\n\n      double res_x = residuals[residual_index + 0];\n      double res_y = residuals[residual_index + 1];\n      // NaN values will never be inliers if the comparison is set as below\n      bool is_good = (Eigen::Vector2d(res_x, res_y).norm() <= max_reprojection_error);\n      if (!is_good) {\n        num_outliers_reproj++;\n        rig::setMapValue(pid_cid_fid_inlier, pid, cid, fid, 0);\n      }\n    }\n  }\n\n  std::cout << std::setprecision(4) << \"Removed \" << num_outliers_reproj\n            << \" outlier features using reprojection error, out of \" << num_total_features\n            << \" (\" << (100.0 * num_outliers_reproj) / num_total_features << \"%)\\n\";\n\n  return;\n}\n\n}  // end namespace rig\n"
  },
  {
    "path": "src/asp/Rig/RigOutlier.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#ifndef ASP_RIG_RIG_OUTLIER_H\n#define ASP_RIG_RIG_OUTLIER_H\n\n#include <asp/Rig/RigTypeDefs.h>\n#include <vector>\n#include <Eigen/Core>\n#include <Eigen/Geometry>\n\nnamespace rig {\n\nclass CameraParameters;\nclass cameraImage;\n\nvoid flagOutlierByExclusionDist(// Inputs\n                                std::vector<rig::CameraParameters> const& cam_params,\n                                std::vector<rig::cameraImage>      const& cams,\n                                rig::PidCidFid                     const& pid_to_cid_fid,\n                                rig::KeypointVec                   const& keypoint_vec,\n                                // Outputs\n                                PidCidFidMap                            & pid_cid_fid_inlier);\n\nvoid flagOutliers(// Inputs\n                  double min_triangulation_angle, double max_reprojection_error,\n                  rig::PidCidFid               const& pid_to_cid_fid,\n                  rig::KeypointVec             const& keypoint_vec,\n                  std::vector<Eigen::Affine3d> const& world_to_cam, \n                  std::vector<Eigen::Vector3d> const& xyz_vec,\n                  PidCidFidMap                 const& pid_cid_fid_to_residual_index,\n                  std::vector<double>          const& residuals,\n                  // Outputs\n                  PidCidFidMap                      & pid_cid_fid_inlier);\n\n}  // namespace rig\n\n#endif  // ASP_RIG_RIG_OUTLIER_H\n"
  },
  {
    "path": "src/asp/Rig/RigParseOptions.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file RigParseOptions.cc\n///\n/// Parse and validate rig_calibrator command-line options.\n\n#include <asp/Rig/RigParseOptions.h>\n#include <asp/Rig/RigThread.h>\n#include <asp/Rig/RigParseUtils.h>\n#include <asp/Rig/RigConfig.h>\n#include <asp/Rig/BasicAlgs.h>\n#include <asp/Core/AspProgramOptions.h>\n\n#include <vw/Core/Exception.h>\n#include <vw/Core/StringUtils.h>\n\n#include <boost/program_options.hpp>\n\n#include <glog/logging.h>\n\nnamespace po = boost::program_options;\n\nnamespace rig {\n\n// Parse camera_position_uncertainty_str if non-empty\nvoid handleCamPosUncertainty(RigOptions& opt) {\n\n  if (opt.camera_position_uncertainty_str.empty())\n    return;\n\n  std::string sep = \",\";\n  std::vector<double> vals = vw::str_to_std_vec(opt.camera_position_uncertainty_str, sep);\n\n  // Check if values were parsed\n  if (vals.empty())\n    vw::vw_throw(vw::ArgumentErr() << \"Camera position uncertainty string is invalid.\\n\");\n\n  // If size is 1, add a second value equal to the first. Only the first will be used,\n  // but need to respect the api.\n  if (vals.size() == 1)\n    vals.push_back(vals[0]);\n\n  // Validate that values are positive\n  if (vals[0] <= 0.0 || vals[1] <= 0.0)\n    vw::vw_throw(vw::ArgumentErr() << \"Camera position uncertainty values must be positive.\\n\");\n\n  opt.camera_position_uncertainty.resize(1);\n  opt.camera_position_uncertainty[0] = vw::Vector2(vals[0], vals[1]);\n}\n\nvoid handleRigArgs(int argc, char *argv[], RigOptions& opt) {\n\n  po::options_description general_options(\"\");\n  general_options.add_options()\n    (\"rig-config\", po::value(&opt.rig_config)->default_value(\"\"),\n     \"Read the rig configuration from this file.\")\n    (\"nvm\", po::value(&opt.nvm)->default_value(\"\"),\n     \"Read images and camera poses from this nvm file, as exported by Theia.\")\n    (\"image-sensor-list\", po::value(&opt.image_sensor_list)->default_value(\"\"),\n     \"Read image name, sensor name, and timestamp, from each line in this list. \"\n     \"Alternatively, a directory structure can be used.\")\n    (\"robust-threshold\", po::value(&opt.robust_threshold)->default_value(0.5),\n     \"Residual pixel errors and 3D point residuals (the latter multiplied by \"\n     \"corresponding weight) much larger than this will be logarithmically attenuated \"\n     \"to affect less the cost function.\")\n    (\"num-iterations\", po::value(&opt.num_iterations)->default_value(100),\n     \"How many solver iterations to perform in calibration.\")\n    (\"bracket-len\", po::value(&opt.bracket_len)->default_value(0.6),\n     \"Lookup non-reference cam images only between consecutive ref cam images whose \"\n     \"distance in time is no more than this (in seconds), after adjusting for the \"\n     \"timestamp offset between these cameras. It is assumed the rig moves slowly and \"\n     \"uniformly during this time. A large value here will make the calibrator compute \"\n     \"a poor solution but a small value may prevent enough images being bracketed. See \"\n     \"also --bracket-single-image.\")\n    (\"intrinsics-to-float\", po::value(&opt.intrinsics_to_float_str)->default_value(\"\"),\n     \"Specify which intrinsics to float for each sensor. Example: \"\n     \"'cam1:focal_length,optical_center,distortion cam2:focal_length'.\")\n    (\"camera-poses-to-float\", po::value(&opt.camera_poses_to_float_str)->default_value(\"\"),\n     \"Specify the cameras for which sensors can have their poses floated. Example: \"\n     \"'cam1 cam3'. The documentation has more details.\")\n    (\"depth-to-image-transforms-to-float\",\n     po::value(&opt.depth_to_image_transforms_to_float_str)->default_value(\"\"),\n     \"Specify for which sensors to float the depth-to-image transform (if depth data \"\n     \"exists). Example: 'cam1 cam3'.\")\n    (\"fix-rig-translations\", po::bool_switch(&opt.fix_rig_translations)->default_value(false),\n     \"Fix the translation component of the transforms between the sensors on a rig. \"\n     \"Works only when --no-rig is not set.\")\n    (\"fix-rig-rotations\", po::bool_switch(&opt.fix_rig_rotations)->default_value(false),\n     \"Fix the rotation component of the transforms between the sensors on a rig. Works \"\n     \"only when --no-rig is not set.\")\n    (\"float-scale\", po::bool_switch(&opt.float_scale)->default_value(false),\n     \"If to optimize the scale of the clouds, part of depth-to-image transform. If kept \"\n     \"fixed, the configuration of cameras should adjust to respect the given scale. This \"\n     \"parameter should not be used with --affine-depth-to-image when the transform is \"\n     \"affine, rather than rigid and a scale.\")\n    (\"float-timestamp-offsets\",\n     po::bool_switch(&opt.float_timestamp_offsets)->default_value(false),\n     \"If to optimize the timestamp offsets among the cameras. This is experimental.\")\n    (\"timestamp-offsets-max-change\",\n     po::value(&opt.timestamp_offsets_max_change)->default_value(1.0),\n     \"If floating the timestamp offsets, do not let them change by more than this \"\n     \"(measured in seconds). Existing image bracketing acts as an additional constraint.\")\n    (\"tri-weight\", po::value(&opt.tri_weight)->default_value(0.1),\n     \"The weight to give to the constraint that optimized triangulated points stay \"\n     \"close to original triangulated points. A positive value will help ensure the \"\n     \"cameras do not move too far, but a large value may prevent convergence. This \"\n     \"does not get set for triangulated points at which --heights-from-dem or --mesh \"\n     \"constraints are applied.\")\n    (\"tri-robust-threshold\", po::value(&opt.tri_robust_threshold)->default_value(0.1),\n     \"The robust threshold to use with the triangulation weight. Must be positive.\")\n    (\"use-initial-triangulated-points\",\n     po::bool_switch(&opt.use_initial_triangulated_points)->default_value(false),\n     \"Use the triangulated points from the input nvm file. Together with --tri-weight, \"\n     \"this ensures the cameras do not move too far from the initial solution. This will \"\n     \"fail if additional interest point matches are created with --num-overlaps. If \"\n     \"registration is used, the initial triangulated points are transformed appropriately.\")\n    (\"depth-tri-weight\", po::value(&opt.depth_tri_weight)->default_value(1000.0),\n     \"The weight to give to the constraint that depth measurements agree with triangulated \"\n     \"points. Use a bigger number as depth errors are usually on the order of 0.01 meters \"\n     \"while reprojection errors are on the order of 1 pixel.\")\n    (\"mesh\", po::value(&opt.mesh)->default_value(\"\"),\n     \"Use this mesh to help constrain the calibration (in .ply format). Must use a \"\n     \"positive --mesh-tri-weight.\")\n    (\"mesh-tri-weight\", po::value(&opt.mesh_tri_weight)->default_value(0.0),\n     \"A larger value will give more weight to the constraint that triangulated points \"\n     \"stay close to the mesh. Not suggested by default.\")\n    (\"depth-mesh-weight\", po::value(&opt.depth_mesh_weight)->default_value(0.0),\n     \"A larger value will give more weight to the constraint that the depth clouds stay \"\n     \"close to the mesh. Not suggested by default.\")\n    (\"camera-position-uncertainty\",\n     po::value(&opt.camera_position_uncertainty_str)->default_value(\"\"),\n     \"Camera position uncertainty (1 sigma, in meters). This strongly constrains the \"\n     \"movement of cameras, potentially at the expense of accuracy. Specify a single value.\")\n    (\"heights-from-dem\", po::value(&opt.heights_from_dem)->default_value(\"\"),\n     \"Use this DEM to constrain the triangulated points. The uncertainty of the DEM is \"\n     \"specified via --heights-from-dem-uncertainty.\")\n    (\"heights-from-dem-uncertainty\",\n     po::value(&opt.heights_from_dem_uncertainty)->default_value(-1.0),\n     \"Uncertainty (in meters, 1 sigma) for --heights-from-dem. A smaller value constrains \"\n     \"more the triangulated points to the DEM specified via --heights-from-dem.\")\n    (\"heights-from-dem-robust-threshold\",\n     po::value(&opt.heights_from_dem_robust_threshold)->default_value(0.1),\n     \"Robust threshold for residual errors in triangulated points relative to DEM \"\n     \"specified via --heights-from-dem. This is applied after the point differences \"\n     \"are divided by --heights-from-dem-uncertainty. It will attenuate large height \"\n     \"differences. Set to 0 to turn off.\")\n    (\"affine-depth-to-image\",\n     po::bool_switch(&opt.affine_depth_to_image)->default_value(false),\n     \"Assume that the depth-to-image transform for each depth + image camera is an \"\n     \"arbitrary affine transform rather than scale * rotation + translation.\")\n    (\"num-passes\", po::value(&opt.num_passes)->default_value(2),\n     \"How many passes of optimization to do. Outliers will be removed after every pass. \"\n     \"Each pass will start with the previously optimized solution as an initial guess. \"\n     \"Mesh intersections (if applicable) and ray triangulation will be recomputed before \"\n     \"each pass.\")\n    (\"initial-max-reprojection-error\",\n     po::value(&opt.initial_max_reprojection_error)->default_value(300.0),\n     \"If filtering outliers, remove interest points for which the reprojection error, in \"\n     \"pixels, is larger than this. This filtering happens when matches are created, before \"\n     \"cameras are optimized, and a big value should be used if the initial cameras are not \"\n     \"trusted.\")\n    (\"max-reprojection-error\", po::value(&opt.max_reprojection_error)->default_value(25.0),\n     \"If filtering outliers, remove interest points for which the reprojection error, in \"\n     \"pixels, is larger than this. This filtering happens after each optimization pass \"\n     \"finishes, unless disabled. It is better to not filter too aggressively unless \"\n     \"confident of the solution.\")\n    (\"min-triangulation-angle\", po::value(&opt.min_triangulation_angle)->default_value(0.01),\n     \"If filtering outliers, remove triangulated points for which all rays converging to \"\n     \"it make an angle (in degrees) less than this. Note that some cameras in the rig may \"\n     \"be very close to each other relative to the triangulated points, so care is needed \"\n     \"here.\")\n    (\"out-texture-dir\", po::value(&opt.out_texture_dir)->default_value(\"\"),\n     \"If non-empty and if an input mesh was provided, project the camera images using the \"\n     \"optimized poses onto the mesh and write the obtained .obj files in the given \"\n     \"directory.\")\n    (\"min-ray-dist\", po::value(&opt.min_ray_dist)->default_value(0.0),\n     \"The minimum search distance from a starting point along a ray when intersecting the \"\n     \"ray with a mesh, in meters (if applicable).\")\n    (\"max-ray-dist\", po::value(&opt.max_ray_dist)->default_value(100.0),\n     \"The maximum search distance from a starting point along a ray when intersecting the \"\n     \"ray with a mesh, in meters (if applicable).\")\n    (\"registration\", po::bool_switch(&opt.registration)->default_value(false),\n     \"If true, and registration control points for the sparse map exist and are specified \"\n     \"by --hugin-file and --xyz-file, register all camera poses and the rig transforms \"\n     \"before starting the optimization. For now, the depth-to-image transforms do not \"\n     \"change as result of this, which may be a problem. To apply the registration only, \"\n     \"use zero iterations.\")\n    (\"hugin-file\", po::value(&opt.hugin_file)->default_value(\"\"),\n     \"The path to the hugin .pto file used for registration.\")\n    (\"xyz-file\", po::value(&opt.xyz_file)->default_value(\"\"),\n     \"The path to the xyz file used for registration.\")\n    (\"skip-post-registration\", po::bool_switch(&opt.skip_post_registration)->default_value(false),\n     \"If true and registration to world coordinates takes place, do not apply the \"\n     \"registration again after the cameras are optimized. This is usually not recommended, \"\n     \"unless one is quite confident that other constraints (such as using --tri-weight or \"\n     \"--mesh-tri-weight) are sufficient to keep the cameras from drifting.\")\n    (\"parameter-tolerance\", po::value(&opt.parameter_tolerance)->default_value(1e-12),\n     \"Stop when the optimization variables change by less than this.\")\n    (\"no-rig\", po::bool_switch(&opt.no_rig)->default_value(false),\n     \"Do not assumes the cameras are on a rig. Hence the pose of any camera of any sensor \"\n     \"type may vary on its own and not being tied to other sensor types. See also \"\n     \"--camera-poses-to-float.\")\n    (\"out-dir,o\", po::value(&opt.out_prefix)->default_value(\"\"),\n     \"Save in this directory the camera intrinsics and extrinsics. See also \"\n     \"--save-images-and-depth-clouds, --save-matches, --verbose, and --in-dir.\")\n    (\"no-nvm-matches\", po::bool_switch(&opt.no_nvm_matches)->default_value(false),\n     \"Do not read interest point matches from the nvm file. So read only camera poses. \"\n     \"This implies --num-overlaps is positive, to be able to find new matches.\")\n    (\"camera-poses\", po::value(&opt.camera_poses)->default_value(\"\"),\n     \"Read the images and world-to-camera poses from this list. The same format is used \"\n     \"when this tool saves the updated poses in the output directory. It is preferred to \"\n     \"read the camera poses with the --nvm option, as then interest point matches will be \"\n     \"read as well.\")\n    (\"num-overlaps\", po::value(&opt.num_overlaps)->default_value(0),\n     \"Match an image with this many images (of all camera types) following it in \"\n     \"increasing order of timestamp value. Set to a positive value only if desired to find \"\n     \"more interest point matches than read from the input nvm file. Not suggested by \"\n     \"default.\")\n    (\"use-initial-rig-transforms\",\n     po::bool_switch(&opt.use_initial_rig_transforms)->default_value(false),\n     \"Use the transforms between the sensors (ref_to_sensor_transform) of the rig \"\n     \"specified via --rig-config to initialize all non-reference camera poses based on the \"\n     \"reference camera poses and the rig transforms. If this option is not set, derive the \"\n     \"rig transforms from the poses of individual cameras.\")\n    (\"bracket-single-image\", po::bool_switch(&opt.bracket_single_image)->default_value(false),\n     \"If more than one image from a given sensor is acquired between two consecutive \"\n     \"reference sensor images, as measured by timestamps, keep only one, choosing the image \"\n     \"that is closest to the midpoint of the interval formed by reference sensor \"\n     \"timestamps. Only applicable without --no-rig.\")\n    (\"extra-list\", po::value(&opt.extra_list)->default_value(\"\"),\n     \"Add to the SfM solution the camera poses for the additional images/depth clouds in \"\n     \"this list. Use bilinear interpolation of poses in time and nearest neighbor \"\n     \"extrapolation (within --bracket-len) and/or the rig constraint to find the new poses \"\n     \"(will be followed by bundle adjustment refinement). This can give incorrect results \"\n     \"if the new images are not very similar or not close in time to the existing ones. \"\n     \"This list can contain entries for the data already present.\")\n    (\"fixed-image-list\", po::value(&opt.fixed_image_list_str)->default_value(\"\"),\n     \"A file having a list of images, one per line, whose cameras will be fixed during \"\n     \"optimization.\")\n    (\"nearest-neighbor-interp\",\n     po::bool_switch(&opt.nearest_neighbor_interp)->default_value(false),\n     \"Use nearest neighbor interpolation (in time) when inserting extra camera poses.\")\n    (\"read-nvm-no-shift\", po::bool_switch(&opt.read_nvm_no_shift)->default_value(false),\n     \"Read an nvm file assuming that interest point matches were not shifted to the \"\n     \"origin.\")\n    (\"save-nvm-no-shift\", po::bool_switch(&opt.save_nvm_no_shift)->default_value(false),\n     \"Save the optimized camera poses and inlier interest point matches to \"\n     \"<out dir>/cameras_no_shift.nvm. Interest point matches are not offset relative to \"\n     \"the optical center, which is not standard, but which allows this file to be \"\n     \"self-contained and for the matches to be drawn with stereo_gui.\")\n    (\"save-matches\", po::bool_switch(&opt.save_matches)->default_value(false),\n     \"Save the inlier interest point matches. stereo_gui can be used to visualize these.\")\n    (\"export-to-voxblox\", po::bool_switch(&opt.export_to_voxblox)->default_value(false),\n     \"Save the depth clouds and optimized transforms needed to create a mesh with voxblox \"\n     \"(if depth clouds exist).\")\n    (\"save-pinhole-cameras\", po::bool_switch(&opt.save_pinhole_cameras)->default_value(false),\n     \"Save the optimized cameras in ASP's Pinhole format. The distortion model gets saved \"\n     \"if it is of radtan type (OpenCV radial-tangential distortion model).\")\n    (\"save-transformed-depth-clouds\",\n     po::bool_switch(&opt.save_transformed_depth_clouds)->default_value(false),\n     \"Save the depth clouds with the camera transform applied to them to make them be in \"\n     \"world coordinates.\")\n    (\"num-threads\", po::value(&opt.num_threads)->default_value(rig::defaultNumThreads()),\n     \"Number of threads to use.\")\n    (\"num-match-threads\", po::value(&opt.num_match_threads)->default_value(8),\n     \"How many threads to use in feature detection/matching. A large number can use a lot \"\n     \"of memory.\")\n    (\"verbose\", po::bool_switch(&opt.verbose)->default_value(false),\n     \"Print a lot of verbose information about how matching goes.\");\n\n  general_options.add(vw::GdalWriteOptionsDescription(opt));\n  po::options_description positional(\"\");\n  po::positional_options_description positional_desc;\n  std::string usage(\"[options]\");\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line(argc, argv, opt, general_options, general_options,\n                            positional, positional_desc, usage,\n                            allow_unregistered, unregistered);\n\n  // Parse and validate camera position uncertainty\n  handleCamPosUncertainty(opt);\n\n  // Validation will happen in parameterValidation()\n}\n\nvoid parameterValidation(RigOptions const& opt) {\n\n  if (opt.robust_threshold <= 0.0)\n    LOG(FATAL) << \"The robust threshold must be positive.\\n\";\n\n  if (opt.bracket_len <= 0.0) LOG(FATAL) << \"Bracket length must be positive.\";\n\n  if (opt.num_overlaps < 1 && (opt.nvm == \"\" || opt.no_nvm_matches))\n    LOG(FATAL) << \"No nvm file was specified or it is not desired to read its matches. \"\n               << \"Then must set a positive --num-overlaps to be able to find new \"\n               << \"interest point matches.\";\n\n  if (opt.timestamp_offsets_max_change < 0)\n    LOG(FATAL) << \"The timestamp offsets must be non-negative.\";\n\n  if (opt.min_triangulation_angle <= 0.0)\n    LOG(FATAL) << \"The min triangulation angle must be positive.\\n\";\n\n  if (opt.depth_tri_weight < 0.0)\n    LOG(FATAL) << \"The depth weight must non-negative.\\n\";\n\n  if (opt.mesh_tri_weight < 0.0)\n    LOG(FATAL) << \"The mesh weight must non-negative.\\n\";\n\n  if (opt.depth_mesh_weight < 0.0)\n    LOG(FATAL) << \"The depth mesh weight must non-negative.\\n\";\n\n  if (opt.tri_weight < 0.0)\n    LOG(FATAL) << \"The triangulation weight must non-negative.\\n\";\n\n  if (opt.tri_weight > 0.0 && opt.tri_robust_threshold <= 0.0)\n    LOG(FATAL) << \"The triangulation robust threshold must be positive.\\n\";\n\n  // Validate heights-from-dem options  \n  if (!opt.heights_from_dem.empty() && opt.heights_from_dem_uncertainty <= 0.0)\n    LOG(FATAL) << \"The value of --heights-from-dem-uncertainty must be positive.\\n\";\n\n  if (opt.heights_from_dem.empty() && opt.heights_from_dem_uncertainty > 0.0)\n    LOG(FATAL) << \"The value of --heights-from-dem-uncertainty is set, \"\n               << \"but --heights-from-dem is not set.\\n\";\n\n  if (opt.heights_from_dem_robust_threshold <= 0.0)\n    LOG(FATAL) << \"The value of --heights-from-dem-robust-threshold must be positive.\\n\";\n\n  // Validate mesh and DEM exclusivity\n  if (!opt.mesh.empty() && !opt.heights_from_dem.empty())\n    LOG(FATAL) << \"Cannot use both --mesh and --heights-from-dem simultaneously. \"\n               << \"These constraints may conflict as they both try to constrain triangulated points \"\n               << \"to different external reference positions.\\n\";\n\n  if (opt.registration && (opt.xyz_file.empty() || opt.hugin_file.empty()))\n    LOG(FATAL) << \"In order to register the map, the hugin and xyz file must be specified.\";\n\n  if (opt.float_scale && opt.affine_depth_to_image)\n    LOG(FATAL) << \"The options --float-scale and --affine-depth-to-image should not be used \"\n               << \"together. If the latter is used, the scale is always floated.\\n\";\n\n  if (opt.no_rig && opt.float_timestamp_offsets)\n      LOG(FATAL) << \"Cannot float timestamps with option --no-rig.\\n\";\n\n  if (opt.out_prefix == \"\")\n    LOG(FATAL) << \"The output directory was not specified.\\n\";\n\n  if (opt.out_texture_dir != \"\" && opt.mesh == \"\")\n      LOG(FATAL) << \"Cannot project camera images onto a mesh if a mesh was not provided.\\n\";\n\n  if (opt.rig_config == \"\")\n    LOG(FATAL) << \"Must specify the initial rig configuration via --rig-config.\\n\";\n\n  if (opt.camera_poses != \"\" && opt.nvm != \"\")\n    LOG(FATAL) << \"Cannot specify both --nvm and --camera-poses.\\n\";\n\n  if (opt.camera_poses == \"\" && opt.nvm == \"\")\n    LOG(FATAL) << \"Must specify the cameras via --nvm or --camera-poses.\\n\";\n\n  if (opt.num_overlaps > 0 && opt.use_initial_triangulated_points)\n    LOG(FATAL) << \"Cannot use the initial triangulated points if new matches are created.\\n\";\n\n  return;\n}\n\nvoid parseAuxRigOptions(RigOptions& opt, RigSet const& R) {\n  rig::parse_intrinsics_to_float(opt.intrinsics_to_float_str, R.cam_names,\n                                 opt.intrinsics_to_float);\n\n  rig::parse_camera_names(R.cam_names, opt.camera_poses_to_float_str,\n                        opt.camera_poses_to_float);\n\n  rig::parse_camera_names(R.cam_names, opt.depth_to_image_transforms_to_float_str,\n                        opt.depth_to_image_transforms_to_float);\n\n  // Read a list of images to keep fixed, if provided\n  if (!opt.fixed_image_list_str.empty())\n    rig::readList(opt.fixed_image_list_str, opt.fixed_images);\n}\n\n} // end namespace rig\n\n"
  },
  {
    "path": "src/asp/Rig/RigParseOptions.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file RigParseOptions.h\n///\n/// Parse and validate rig_calibrator command-line options.\n\n#ifndef __ASP_RIG_RIG_PARSE_OPTIONS_H__\n#define __ASP_RIG_RIG_PARSE_OPTIONS_H__\n\n#include <asp/Rig/RigOptions.h>\n\nnamespace rig {\n  \nstruct RigSet;\n  \n// Process the rig_calibrator options using boost::program_options\nvoid handleRigArgs(int argc, char *argv[], RigOptions& opt);\n\n// Validate rig_calibrator options\nvoid parameterValidation(RigOptions const& opt);\n\n// Parse auxiliary rig options\nvoid parseAuxRigOptions(RigOptions& opt, RigSet const& R);\n  \n} // namespace rig\n\n#endif // __ASP_RIG_RIG_PARSE_OPTIONS_H__\n"
  },
  {
    "path": "src/asp/Rig/RigParseUtils.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Rig/RigParseUtils.h>\n#include <asp/Rig/SystemUtils.h>\n\n#include <vw/Core/Log.h>\n#include <glog/logging.h>\n#include <boost/filesystem.hpp>\n\n#include <iostream>\n#include <fstream>\n#include <sstream>\n#include <iomanip>\n#include <algorithm>\n\nnamespace fs = boost::filesystem;\n\nnamespace rig {\n\n// Find cam type based on cam name\nvoid camTypeFromName(std::string const& cam_name,\n                     std::vector<std::string> const& cam_names,\n                     int& cam_type) {\n  cam_type = 0; // initialize\n  for (size_t cam_it = 0; cam_it < cam_names.size(); cam_it++) {\n    if (cam_names[cam_it] == cam_name) {\n      cam_type = cam_it;\n      return;\n    }\n  }\n\n  throw std::string(\"Could not determine the sensor type for: \" + cam_name);\n}\n\n// The parent subdirectory. Example: mydir/nav_cam/file.jpg will return\n// 'nav_cam'.\nstd::string parentSubdir(std::string const& image_file) {\n  return fs::path(image_file).parent_path().filename().string();\n}\n\n// Given a file with name \n// <dir><text><digits>.<digits><text>ref_cam<text>.jpg\n// or \n// <dir>/<cam name>/<digits>.<digits>.jpg\n// find the cam type\n// Return the index in the basename where the cam name starts or std::string::npos\n// if not found.\nsize_t findCamType(std::string const& image_file,\n                   std::vector<std::string> const& cam_names,\n                   // Output\n                   int & cam_type) {\n  // Initialize the output\n  cam_type = 0;\n  \n  std::string basename = fs::path(image_file).filename().string();\n\n  // Try to find the cam name from the basename\n  // Convention: my_images/<text>10004.6<text>ref_cam<text>.jpg,\n  // where ref_cam is the cam name.\n  bool found_cam_name = false;\n  std::string cam_name;\n  size_t cam_name_pos = std::string::npos;\n  for (size_t cam_it = 0; cam_it < cam_names.size(); cam_it++) {\n    auto pos_it = basename.find(cam_names[cam_it]);\n    if (pos_it != std::string::npos) {\n      cam_name = cam_names[cam_it];\n      found_cam_name = true;\n      cam_name_pos = pos_it;\n      break;\n    }\n  }\n\n  // Infer cam name based on name of parent directory\n  if (!found_cam_name) {\n    try {\n      // The cam name is the subdir having the images\n      cam_name = rig::parentSubdir(image_file);\n      found_cam_name = true;\n    } catch (std::string const& e) {}\n  }\n\n  // Find the sensor id (type)\n  camTypeFromName(cam_name, cam_names, cam_type);\n  \n  // If no luck, cannot continue. In this case the user is supposed to provide\n  // --image_sensor_list.\n  if (!found_cam_name)\n    LOG(FATAL) << \"Could not determine the sensor type for: \" << image_file\n               << \". Check your rig configuration, or provide --image_sensor_list.\\n\"; \n               \n  return cam_name_pos;\n            \n}\n\n// Must keep only alphanumeric characters in the s\nvoid removeNonAlphaNum(std::string & s) {\n  for (size_t it = 0; it < s.size(); it++) {\n    if ((s[it] < '0' || s[it] > '9') &&\n        (s[it] < 'a' || s[it] > 'z') &&\n        (s[it] < 'A' || s[it] > 'Z')) {\n      s = s.substr(0, it) + s.substr(it+1);\n      it--;\n    }\n  }\n}\n\n// Given a file with name \n// <dir>/<text><digits>.<digits><text>ref_cam<text>.jpg\n// or \n// <dir>/<cam name>/<digits>.<digits>.jpg\n// find the cam name and the timestamp. \n// Can also handle:\n// <dir>/<group><separator><digits>.<digits><text>ref_cam<text>.jpg\n// when it parses the group.\nvoid findCamTypeAndTimestamp(std::string const& image_file,\n                             std::vector<std::string> const& cam_names,\n                             // Outputs\n                             int    & cam_type,\n                             double & timestamp,\n                             std::string & group) {\n\n  // Initialize the outputs\n  cam_type  = -1;\n  timestamp = 0.0;\n  group     = \"\";\n  \n  size_t cam_name_pos = rig::findCamType(image_file, cam_names, cam_type);\n  std::string basename = fs::path(image_file).filename().string();\n  \n  // Eliminate the text starting with the sensor name, if we have\n  // the sensor name as part of the image name.\n  if (cam_name_pos != std::string::npos)\n    basename = basename.substr(0, cam_name_pos);\n\n  // Eliminate all non-digits at the end of the basename\n  for (size_t it = basename.size(); it > 0; it--) {\n    if (basename[it-1] < '0' || basename[it-1] > '9') {\n      basename = basename.substr(0, it-1);\n    } else {\n      break;\n    }\n  }\n  \n  // Search backward until finding a non-digit or a second dot.\n  // The entry before that is the group, and after is the timestamp.\n  int num_dots = 0;\n  for (size_t it = basename.size(); it > 0; it--) {\n    if (basename[it-1] == '.')\n      num_dots++;\n      \n    if (num_dots >= 2) {\n      basename = basename.substr(it);\n      break;\n    }\n  \n    if (basename[it-1] != '.' && (basename[it-1] < '0' || basename[it-1] > '9')) {\n      group = basename.substr(0, it);\n      basename = basename.substr(it);\n      break;\n    }\n  }  \n  \n  removeNonAlphaNum(group);\n\n  // Read the last sequence of digits, followed potentially by a dot and more \n  // digits. Remove anything after <digits>.<digits>.\n  bool have_dot = false;\n  std::string timestamp_str;\n  bool found_digits = false;\n  for (size_t it = 0; it < basename.size(); it++) {\n\n    if (!found_digits && (basename[it] < '0' || basename[it] > '9')) \n      continue; // Not a digit yet, keep going\n    \n    found_digits = true;\n      \n    if (basename[it] == '.') {\n      if (have_dot) \n        break; // We have seen a dot already, ignore the rest\n      have_dot = true;\n      timestamp_str += basename[it];\n      continue;\n    }\n\n    if (basename[it] < '0' || basename[it] > '9') \n      break; // Not a digit, ignore the rest\n    \n    timestamp_str += basename[it];\n  }\n\n  if (timestamp_str.empty())\n    \tthrow (std::string(\"Image name (without directory) must have digits as part of \")\n              + std::string(\"their name, which will be converted to a timestamp.\"));\n\n  // Having the timestamp extracted from the image name is convenient though it\n  // requires some care. This is well-documented.\n  timestamp = atof(timestamp_str.c_str());\n}\n\n// Given a file with name \n// <dir>/<group><separator><separator>ref_cam<text>.ext\n// parse the group and the cam index.\nvoid findCamTypeAndGroup(std::string const& image_file,\n                        std::vector<std::string> const& cam_names,\n                        // Outputs\n                        int         & cam_type,\n                        std::string & group) {\n\n  // Initialize the outputs\n  cam_type  = -1;\n  group     = \"\";\n  \n  size_t cam_name_pos = rig::findCamType(image_file, cam_names, cam_type);\n  std::string basename = fs::path(image_file).filename().string();\n  \n  // Eliminate the text starting with the sensor name, if we have\n  // the sensor name as part of the image name.\n  if (cam_name_pos != std::string::npos)\n    group = basename.substr(0, cam_name_pos);\n\n  removeNonAlphaNum(group);\n  \n  // The group must be non-empty\n  if (group.empty())\n    LOG(FATAL) << \"Could not parse the group from: \" << image_file << \"\\n\";\n}\n\n// Parse a file each line of which contains a filename, a sensor name, and a timestamp.\n// Then reorder the data based on input file names. \nbool parseImageSensorList(std::string const& image_sensor_list,\n                          std::vector<std::string> const& image_files,\n                          std::vector<std::string> const& cam_names,\n                          bool flexible_strategy,\n                          // Outputs\n                          std::vector<int> & cam_types,\n                          std::vector<double> & timestamps) {\n\n  // Wipe the outputs\n  cam_types.clear(); cam_types.resize(image_files.size());\n  timestamps.clear(); timestamps.resize(image_files.size());\n     \n  // Open the file\n  std::ifstream f(image_sensor_list.c_str());\n  if (!f.is_open()) {\n    if (flexible_strategy)\n      return false;\n    else\n      LOG(FATAL) << \"Cannot open file for reading: \" << image_sensor_list << \"\\n\";\n  }\n\n  vw::vw_out() << \"Reading: \" << image_sensor_list << \"\\n\";\n  \n  // Go from cam name to cam type\n  std::map<std::string, int> cam_name_to_type;\n  for (size_t it = 0; it < cam_names.size(); it++)\n    cam_name_to_type[cam_names[it]] = it;\n    \n  // Must put the data to read in maps, as they may not be in the same\n  // order as in the input image_files that we must respect.\n  std::map<std::string, int> image_to_cam_type;\n  std::map<std::string, double> image_to_timestamp;\n  std::string line;\n  while (getline(f, line)) {\n    \n    // if line starts with comment or has only white spaces, skip it\n    if (line.empty() || line[0] == '#') continue;\n    if (line.find_first_not_of(\" \\t\\n\\v\\f\\r\") == std::string::npos) continue;\n     \n    std::string image_file;\n    double timestamp = 0.0;\n    std::string cam_name;\n    std::istringstream iss(line);\n    if (!(iss >> image_file >> cam_name >> timestamp)) {\n      if (flexible_strategy)\n        return false;\n      else \n       LOG(FATAL) << \"Cannot parse: \" << image_sensor_list << \"\\n\";\n    }\n    \n    // Must not have duplicate image_file\n    if (image_to_cam_type.find(image_file) != image_to_cam_type.end())\n      LOG(FATAL) << \"Duplicate image file: \" << image_file << \" in: \"\n                 << image_sensor_list << \"\\n\";\n    if (image_to_timestamp.find(image_file) != image_to_timestamp.end())\n      LOG(FATAL) << \"Duplicate image file: \" << image_file << \" in: \"\n                 << image_sensor_list << \"\\n\";\n    \n    // Look up the sensor name    \n    auto it = cam_name_to_type.find(cam_name);\n    if (it == cam_name_to_type.end())\n      LOG(FATAL) << \"Cannot find sensor name: \" << cam_name << \"\\n\";\n    image_to_cam_type[image_file] = it->second;\n    image_to_timestamp[image_file] = timestamp;\n  }\n  \n  // Must now add them in the order of image_files\n  for (size_t img_it = 0; img_it < image_files.size(); img_it++) {\n    auto type_it = image_to_cam_type.find(image_files[img_it]);\n    auto time_it = image_to_timestamp.find(image_files[img_it]);\n    if (type_it == image_to_cam_type.end() || time_it == image_to_timestamp.end())\n      LOG(FATAL) << \"Cannot find image file: \" << image_files[img_it] \n                 << \" in list: \" << image_sensor_list << \"\\n\";\n    cam_types[img_it] = type_it->second;\n    timestamps[img_it] = time_it->second;\n  }\n    \n  return true;\n}\n\n// A little function to replace separators with space. Note that the backslash\n// is a separator, in case, it used as a continuation line.\nvoid replace_separators_with_space(std::string & str) {\n  std::string sep = \"\\\\:, \\t\\r\\n\";\n  for (size_t it = 0; it < sep.size(); it++) \n    std::replace(str.begin(), str.end(), sep[it], ' ');\n}\n  \n// A function to parse a string like\n// 'cam1:focal_length,optical_center,distortion cam2:focal_length' and\n// extract the intrinsics to float. Separators can be space, comma,\n// colon.\nvoid parse_intrinsics_to_float(std::string const& intrinsics_to_float_str,\n                               std::vector<std::string> const& cam_names,\n                               std::vector<std::set<std::string>>& intrinsics_to_float) {\n  // Wipe the output\n  intrinsics_to_float.clear();\n\n  std::string input_str = intrinsics_to_float_str; // so we can edit it\n\n  replace_separators_with_space(input_str);\n\n  std::istringstream iss(input_str);\n  std::string curr_cam = \"\";\n  std::string val;\n  \n  // Temporary map of sets for collection. This will ensure variable order\n  // of inputs is supported.\n  std::map<std::string, std::set<std::string>> local_map;\n  while (iss >> val) {\n    // See if this is a camera name\n    bool have_cam_name = false;\n    for (size_t it = 0; it < cam_names.size(); it++) {\n      if (val == cam_names[it]) {\n        curr_cam = val;\n        have_cam_name = true;\n        break;\n      }\n    }\n\n    if (have_cam_name) // recorded the camera name\n      continue;\n    \n    if (val != \"focal_length\" && val != \"optical_center\" && val != \"distortion\")\n      LOG(FATAL) << \"Unexpected value when parsing intrinsics to float: \" << val << \"\\n\";\n\n    if (curr_cam == \"\") \n      LOG(FATAL) << \"Incorrectly set option for floating intrinsics.\\n\";\n\n    local_map[curr_cam].insert(val);\n  }\n\n  // Export this\n  intrinsics_to_float.resize(cam_names.size());\n  for (size_t it = 0; it < cam_names.size(); it++)\n    intrinsics_to_float[it] = local_map[cam_names[it]];\n}\n\n// A  function to split a string like 'haz_cam sci_cam' into\n// its two constituents and validate against the list of known cameras.\nvoid parse_camera_names(std::vector<std::string> const& cam_names,\n                        std::string const&\n                        depth_to_image_transforms_to_float_str,\n                        std::set<std::string>&\n                        depth_to_image_transforms_to_float) {\n  // Wipe the output\n  depth_to_image_transforms_to_float.clear();\n\n  std::string input_str = depth_to_image_transforms_to_float_str; // so we can edit it\n  replace_separators_with_space(input_str);\n  \n  std::istringstream iss(input_str);\n  std::string curr_cam = \"\";\n  std::string val;\n  \n  while (iss >> val) {\n    bool have_cam_name = false;\n    for (size_t it = 0; it < cam_names.size(); it++) {\n      if (val == cam_names[it]) {\n        have_cam_name = true;\n        break;\n      }\n    }\n    \n    if (!have_cam_name) \n      LOG(FATAL) << \"Error: A specified sensor name is not among the known sensors. \"\n                 << \"Offending camera: \" << val << \"\\n\";\n    \n    depth_to_image_transforms_to_float.insert(val);\n  }\n\n  return;\n}\n\n// Extract from a string of the form someDir/1234.5678.jpg the number 123.456.\ndouble fileNameToTimestamp(std::string const& file_name) {\n  size_t beg = file_name.rfind(\"/\");\n  size_t end = file_name.rfind(\".\");\n  if (beg == std::string::npos || end == std::string::npos || beg > end) {\n    std::cout << \"Could not parse file name: \" + file_name;\n    exit(1);\n  }\n\n  std::string frameStr = file_name.substr(beg + 1, end - beg - 1);\n  return atof(frameStr.c_str());\n}\n\n// Convert a string of space-separated numbers to a vector\nvoid strToVec(std::string const& str, std::vector<double> & vec) {\n\n  vec.clear();\n  std::istringstream iss(str);\n  double val = 0.0;\n  while (iss >> val)\n    vec.push_back(val);\n}\n\n// Extract control points and the images they correspond 2 from\n// a Hugin project file\nvoid ParseHuginControlPoints(std::string const& hugin_file,\n                             std::vector<std::string> * images,\n                             Eigen::MatrixXd * points) {\n  \n  // Initialize the outputs\n  (*images).clear();\n  *points = Eigen::MatrixXd(6, 0); // this will be resized as points are added\n\n  std::ifstream hf(hugin_file.c_str());\n  if (!hf.good())\n    LOG(FATAL) << \"ParseHuginControlPoints(): Could not open hugin file: \" << hugin_file;\n\n  int num_points = 0;\n  std::string line;\n  while (getline(hf, line)) {\n    // Parse for images\n    if (line.find(\"i \") == 0) {\n      size_t it = line.find(\"n\\\"\");\n      if (it == std::string::npos)\n        LOG(FATAL) << \"ParseHuginControlPoints(): Invalid line: \" << line;\n      it += 2;\n      std::string image;\n      while (it < line.size() && line[it] != '\"') {\n        image += line[it];\n        it++;\n      }\n      (*images).push_back(image);\n    }\n\n    // Parse control points\n    if (line.find(\"c \") == 0) {\n      // First wipe all letters\n      std::string orig_line = line;\n      char * ptr = const_cast<char*>(line.c_str());\n      for (size_t i = 0; i < line.size(); i++) {\n        // Wipe some extra chars\n        if ( (ptr[i] >= 'a' && ptr[i] <= 'z') ||\n             (ptr[i] >= 'A' && ptr[i] <= 'Z') )\n          ptr[i] = ' ';\n      }\n\n      // Out of a line like:\n      // c n0 N1 x367 y240 X144.183010710425 Y243.04008545843 t0\n      // we store the numbers, 0, 1, 367, 240, 144.183010710425 243.04008545843\n      // as a column.\n      // The stand for left image cid, right image cid,\n      // left image x, left image y, right image x, right image y.\n      double a, b, c, d, e, f;\n      if (sscanf(ptr, \"%lf %lf %lf %lf %lf %lf\", &a, &b, &c, &d, &e, &f) != 6)\n        LOG(FATAL) << \"ParseHuginControlPoints(): Could not scan line: \" << line;\n\n      // The left and right images must be different\n      if (a == b)\n        LOG(FATAL) << \"The left and right images must be distinct. \"\n                   << \"Offending line in \" << hugin_file << \" is:\\n\"\n                   << orig_line << \"\\n\";\n\n      num_points++;\n      (*points).conservativeResize(Eigen::NoChange_t(), num_points);\n      (*points).col(num_points - 1) << a, b, c, d, e, f;\n    }\n  }\n\n  return;\n}\n\n// A little helper function\nbool is_blank(std::string const& line) {\n  return (line.find_first_not_of(\" \\t\\n\\v\\f\\r\") == std::string::npos);\n}\n\n// Parse a file having on each line xyz coordinates\nvoid ParseXYZ(std::string const& xyz_file,\n              Eigen::MatrixXd * xyz) {\n\n  // Initialize the outputs\n  *xyz = Eigen::MatrixXd(3, 1);\n\n  std::ifstream hf(xyz_file.c_str());\n  if (!hf.good())\n    LOG(FATAL) << \"ParseXYZ(): Could not open hugin file: \" << xyz_file;\n\n  int num_points = 0;\n  std::string line;\n  while (getline(hf, line)) {\n    // Ignore lines starting with comments and empty lines\n    if (line.find(\"#\") == 0 || is_blank(line)) continue;\n\n    // Apparently sometimes empty lines show up as if of length 1\n    if (line.size() == 1)\n      continue;\n\n    // Replace commas with spaces\n    char * ptr = const_cast<char*>(line.c_str());\n    for (size_t c = 0; c < line.size(); c++)\n      if (ptr[c] == ',') ptr[c] = ' ';\n    double x, y, z;\n    if (sscanf(line.c_str(), \"%lf %lf %lf\", &x, &y, &z) != 3)\n      LOG(FATAL) << \"ParseXYZ(): Could not scan line: '\" << line << \"'\\n\";\n\n    num_points++;\n    (*xyz).conservativeResize(Eigen::NoChange_t(), num_points);\n    (*xyz).col(num_points-1) << x, y, z;\n  }\n}\n  \n}  // namespace rig\n"
  },
  {
    "path": "src/asp/Rig/RigParseUtils.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#ifndef ASP_RIG_RIG_PARSE_UTILS_H\n#define ASP_RIG_RIG_PARSE_UTILS_H\n\n#include <Eigen/Core>\n\n#include <string>\n#include <vector>\n#include <set>\n#include <map>\n\nnamespace rig {\n\n// Given a file with name \n// <dir><text><digits>.<digits><text>ref_cam<text>.jpg\n// or \n// <dir>/<cam name>/<digits>.<digits>.jpg\n// find the cam type\n// Return the index in the basename where the cam name starts or std::string::npos if not found.\nsize_t findCamType(std::string const& image_file,\n                   std::vector<std::string> const& cam_names,\n                   // Output\n                   int & cam_type);\n\n// Must keep only alphanumeric characters in the s\nvoid removeNonAlphaNum(std::string & s);\n\n// Given a file with name \n// <dir><text><digits>.<digits><text>ref_cam<text>.jpg\n// or \n// <dir>/<cam name>/<digits>.<digits>.jpg\n// find the cam name and the timestamp. \n// Can also handle:\n// <dir>/<group><separator><digits>.<digits><text>ref_cam<text>.jpg\n// when it parses the group.\nvoid findCamTypeAndTimestamp(std::string const& image_file,\n                             std::vector<std::string> const& cam_names,\n                             // Outputs\n                             int    & cam_type,\n                             double & timestamp,\n                             std::string & group);\n\n// Given a file with name \n// <dir>/<group><separator><separator>ref_cam<text>.ext\n// parse the group and the cam index.\nvoid findCamTypeAndGroup(std::string const& image_file,\n                        std::vector<std::string> const& cam_names,\n                        // Outputs\n                        int         & cam_type,\n                        std::string & group);\n\n// Parse a file each line of which contains a filename, a sensor name, and a timestamp.\n// Then reorder the data based on input file names. \nbool parseImageSensorList(std::string const& image_sensor_list,\n                          std::vector<std::string> const& image_files,\n                          std::vector<std::string> const& cam_names,\n                          bool flexible_strategy,\n                          // Outputs\n                          std::vector<int> & cam_types,\n                          std::vector<double> & timestamps);\n\n// A little function to replace separators with space. Note that the backslash\n// is a separator, in case, it used as a continuation line.\nvoid replace_separators_with_space(std::string & str);\n\n// A function to parse a string like\n// 'cam1:focal_length,optical_center,distortion cam2:focal_length' and\n// extract the intrinsics to float. Separators can be space, comma,\n// colon.\nvoid parse_intrinsics_to_float(std::string const& intrinsics_to_float_str,\n                               std::vector<std::string> const& cam_names,\n                               std::vector<std::set<std::string>>& intrinsics_to_float);\n\n// A  function to split a string like 'haz_cam sci_cam' into\n// its two constituents and validate against the list of known cameras.\nvoid parse_camera_names(std::vector<std::string> const& cam_names,\n                        std::string const&\n                        depth_to_image_transforms_to_float_str,\n                        std::set<std::string>&\n                        depth_to_image_transforms_to_float);\n\n// Extract from a string of the form someDir/1234.5678.jpg the number 123.456.\ndouble fileNameToTimestamp(std::string const& file_name);\n\n// Convert a string of space-separated numbers to a vector\nvoid strToVec(std::string const& str, std::vector<double> & vec);\n\n// Extract control points and the images they correspond 2 from\n// a Hugin project file\nvoid ParseHuginControlPoints(std::string const& hugin_file,\n                             std::vector<std::string> * images,\n                             Eigen::MatrixXd * points);\n\n// Parse a file having on each line xyz coordinates\nvoid ParseXYZ(std::string const& xyz_file,\n              Eigen::MatrixXd * xyz);\n\n}  // namespace rig\n\n#endif  // ASP_RIG_RIG_PARSE_UTILS_H\n"
  },
  {
    "path": "src/asp/Rig/RigRpcDistortion.cc",
    "content": "/* Copyright (c) 2017, United States Government, as represented by the\n * Administrator of the National Aeronautics and Space Administration.\n * \n * All rights reserved.\n * \n * The Astrobee platform is licensed under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n * \n *     http://www.apache.org/licenses/LICENSE-2.0\n * \n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n#include <asp/Rig/RigRpcDistortion.h>\n#include <asp/Rig/RigCameraParams.h>\n#include <asp/Rig/RigUtils.h>\n\n#include <ceres/ceres.h>\n#include <ceres/rotation.h>\n#include <ceres/problem.h>\n#include <ceres/solver.h>\n#include <ceres/cost_function.h>\n#include <ceres/loss_function.h>\n#include <ceres/dynamic_numeric_diff_cost_function.h>\n#include <ceres/numeric_diff_cost_function.h>\n#include <ceres/autodiff_cost_function.h>\n\n#include <Eigen/Dense>\n\n#include <glog/logging.h>\n\n#include <fstream>\n#include <iostream>\n#include <iomanip>\n\nnamespace rig {\nconst int PIXEL_SIZE = 2;\n\nint rpc_degree(int num_dist_params) {\n  return static_cast<int>(round(sqrt(2.0 * num_dist_params + 5.0) / 2.0 - 1.5));\n}\n\nint num_dist_params(int rpc_degree) {\n  return 2*(rpc_degree+1)*(rpc_degree+2)-2;\n}\n\n// See if the current set of parameters have the right size to be usable\n// with some RPC model\nvoid validate_distortion_params(int num_params) {\n  int deg = rpc_degree(num_params);\n  if (num_dist_params(deg) != num_params || deg <= 0 || std::isnan(deg))\n    throw \"Incorrect number of RPC coefficients.\";\n}\n\n// A little function to append zeros to a Vector.\nvoid append_zeros_to_vector(Eigen::VectorXd & vec, int num) {\n  int len = vec.size();\n\n  // Create a vector big enough to store the output\n  Eigen::VectorXd out_vec;\n  out_vec.resize(len + num);\n  // Copy current elements\n  for (int it = 0; it < len; it++) out_vec[it] = vec[it];\n  // Fill the rest with zeros\n  for (int it = len; it < len + num; it++) out_vec[it] = 0.0;\n\n  vec = out_vec;\n}\n\n// Prepend a 1 to a vector\nvoid prepend_1(Eigen::VectorXd & vec) {\n  int old_len = vec.size();\n  Eigen::VectorXd old_vec = vec;\n\n  vec.resize(old_len + 1);\n  vec[0] = 1.0;\n\n  for (int it = 0; it < old_len; it++) vec[it + 1] = old_vec[it];\n\n}\n\n// Remove 1 from first position in a vector\nvoid remove_1(Eigen::VectorXd & vec) {\n  int old_len = vec.size();\n  if (old_len <= 0)\n    throw \"Found an unexpected empty vector.\";\n  Eigen::VectorXd old_vec = vec;\n\n  vec.resize(old_len - 1);\n  for (int it = 0; it < old_len - 1; it++) vec[it] = old_vec[it + 1];\n}\n\nEigen::VectorXd subvector(Eigen::VectorXd const& vec, int start, int len) {\n  if (start + len > vec.size()) throw \"Out of range in subvector().\";\n\n  Eigen::VectorXd subvec(len);\n  for (int it = 0; it < len; it++) subvec[it] = vec[start + it];\n\n  return subvec;\n}\n\nvoid set_subvector(Eigen::VectorXd & vec, int start, int len, Eigen::VectorXd const& subvec) {\n  if (start + len > vec.size()) throw \"Out of range in set_subvector().\\n\";\n\n  if (len != subvec.size()) throw \"Size mismatch in set_subvector().\";\n\n  for (int it = 0; it < len; it++) vec[start + it] = subvec[it];\n}\n\n// Compute the RPC model with given coefficients at the given point. Recall that\n// RPC is ratio of two polynomials in x and y. This assumes centered pixels that\n// are normalized by the focal length.\nEigen::Vector2d compute_rpc(Eigen::Vector2d const& p, Eigen::VectorXd const& coeffs)  {\n  validate_distortion_params(coeffs.size());\n\n  int rpc_deg = rpc_degree(coeffs.size());\n  double x = p[0];\n  double y = p[1];\n\n  // Precompute x^n and y^m values\n  std::vector<double> powx(rpc_deg + 1), powy(rpc_deg + 1);\n  double valx = 1.0, valy = 1.0;\n  for (int deg = 0; deg <= rpc_deg; deg++) {\n    powx[deg] = valx;\n    valx *= x;\n    powy[deg] = valy;\n    valy *= y;\n  }\n\n  // Evaluate the RPC expression. The denominator always has a 1 as\n  // the 0th coefficient.\n  int coeff_index = 0;\n\n  // Loop four times, for output first coordinate numerator and\n  // denominator, then for output second coordinate numerator and\n  // denominator.\n\n  double vals[] = {0.0, 1.0, 0.0, 1.0};\n\n  for (int count = 0; count < 4; count++) {\n    int start = 0;                            // starting degree for numerator\n    if (count == 1 || count == 3) start = 1;  // starting degree for denominator\n\n    for (int deg = start; deg <= rpc_deg; deg++) {\n      for (int i = 0; i <= deg; i++) {\n        // Add coeff * x^(deg-i) * y^i\n        vals[count] += coeffs[coeff_index] * powx[deg - i] * powy[i];\n        coeff_index++;\n      }\n    }\n  }\n\n  if (coeff_index != static_cast<int>(coeffs.size()))\n    throw \"Book-keeping failure in RPCLensDistortion.\";\n\n  return Eigen::Vector2d(vals[0]/vals[1], vals[2]/vals[3]);\n}\n\n// Put the vectors of numerator and denominator coefficients for the x and y\n// coordinates into a single vector.\nvoid pack_params(Eigen::VectorXd& params, Eigen::VectorXd const& num_x,\n                 Eigen::VectorXd const& den_x, Eigen::VectorXd const& num_y,\n                 Eigen::VectorXd const& den_y) {\n  int num_len = num_x.size();\n  int den_len = den_x.size();\n\n  if (num_len != den_len + 1 ||\n      num_len != static_cast<int>(num_y.size()) ||\n      den_len != static_cast<int>(den_y.size()))\n    throw \"Book-keeping failure in RPCLensDistortion.\";\n\n  params.resize(2*num_len + 2*den_len);\n\n  set_subvector(params, 0, num_len, num_x);\n  set_subvector(params, num_len,                     den_len, den_x);\n  set_subvector(params, num_len + den_len,           num_len, num_y);\n  set_subvector(params, num_len + den_len + num_len, den_len, den_y);\n  validate_distortion_params(params.size());\n}\n\nvoid unpack_params(Eigen::VectorXd const& params, \n                   Eigen::VectorXd& num_x, Eigen::VectorXd& den_x,\n                   Eigen::VectorXd& num_y, Eigen::VectorXd& den_y) {\n  validate_distortion_params(params.size());\n\n  int num_params = params.size();\n  int num_len = (num_params + 2)/4;\n  int den_len = num_len - 1;  // because the denominator always starts with 1.\n  num_x = subvector(params, 0,                           num_len);\n  den_x = subvector(params, num_len,                     den_len);\n  num_y = subvector(params, num_len + den_len,           num_len);\n  den_y = subvector(params, num_len + den_len + num_len, den_len);\n}\n\n// RPC lens distortion of arbitrary degree.\n// For a given undistorted centered pixel (x, y), compute\n// (P1num(x, y)/P1den(x, y), P2num(x, y)/P2den(x, y))\n// where these polynomials are of at most given degree,\n// and P1den(0, 0) = P2den(0, 0) = 1.\n// Undistortion is computed numerically. \n\nRPCLensDistortion::RPCLensDistortion() {\n  m_rpc_degree = 0;\n}\n\nRPCLensDistortion::RPCLensDistortion(Eigen::VectorXd const& params): m_distortion(params) {\n  validate_distortion_params(params.size());\n  m_rpc_degree = rpc_degree(params.size());\n}\n\nvoid RPCLensDistortion::set_distortion_parameters(Eigen::VectorXd const& params) {\n  validate_distortion_params(params.size());\n  m_distortion = params;\n  m_rpc_degree = rpc_degree(params.size());\n}\n\nEigen::VectorXd RPCLensDistortion::distortion_parameters() const {\n  return m_distortion;\n}\n\n// Make RPC coefficients so that the RPC transform is the identity.\n// The vector params must already have the right size.\nvoid RPCLensDistortion::init_as_identity(Eigen::VectorXd& params) {\n  validate_distortion_params(params.size());\n\n  for (size_t it = 0; it < params.size(); it++)\n    params[it] = 0.0;\n\n  Eigen::VectorXd num_x, den_x, num_y, den_y;\n  unpack_params(params, num_x, den_x, num_y, den_y);\n\n  // Initialize the transform (x, y) -> (x, y), which is\n  // ( (0 + 1*x + 0*y)/(1 + 0*x + 0*y), (0 + 0*x + 1*y)/(1 + 0*x + 0*y) )\n  // hence set num_x and num_y accordingly. As always, we do not\n  // store the 1 values in the denominator.\n  num_x[1] = 1; num_y[2] = 1;\n  pack_params(params, num_x, den_x, num_y, den_y);\n}\n\n// Form the identity transform\nvoid RPCLensDistortion::reset(int rpc_degree) {\n  if (rpc_degree <= 0) throw \"The RPC degree must be positive.\";\n\n  m_rpc_degree = rpc_degree;\n  int num_params = rig::num_dist_params(rpc_degree);\n  m_distortion.resize(num_params);\n  init_as_identity(m_distortion);\n}\n\n// Given the RPC coefficients corresponding to the four polynomials,\n// increase the degree of each polynomial by 1 and set the new\n// coefficients to 0.\nvoid RPCLensDistortion::increment_degree(Eigen::VectorXd& params) {\n  validate_distortion_params(params.size());\n\n  Eigen::VectorXd num_x, den_x, num_y, den_y;\n  unpack_params(params, num_x, den_x, num_y, den_y);\n\n  int r = rpc_degree(params.size());\n\n  // The next monomials to add will be\n  // x^(r+1), x^r*y, ..., x*y^r, y^(r+1)\n  // and there are r + 2 of them.\n  // Set their coefficients to zero.\n  int num = r + 2;\n\n  append_zeros_to_vector(num_x, num);\n  append_zeros_to_vector(den_x, num);\n  append_zeros_to_vector(num_y, num);\n  append_zeros_to_vector(den_y, num);\n\n  pack_params(params, num_x, den_x, num_y, den_y);\n}\n\n// An error function minimizing the fit of an RPC model, that is,\n// minimizing norm of dist_pix - RPC_model(undist_pix).\nstruct RpcFitError {\n  EIGEN_MAKE_ALIGNED_OPERATOR_NEW\n  RpcFitError(Eigen::Vector2d const& undist_pix, Eigen::Vector2d const& dist_pix,\n              std::vector<int> const& block_sizes):\n    m_undist_pix(undist_pix), m_dist_pix(dist_pix), m_block_sizes(block_sizes) {\n    // Sanity check\n    if (block_sizes.size() != 1)\n      throw \"RpcFitError: The block sizes were not set up properly.\\n\";\n    validate_distortion_params(block_sizes[0]);\n  }\n\n  // Call to work with ceres::DynamicNumericDiffCostFunction.\n  bool operator()(double const* const* parameters, double* residuals) const {\n    int num_coeffs = m_block_sizes[0];\n    Eigen::VectorXd coeffs(num_coeffs);\n    for (int it = 0; it < num_coeffs; it++) coeffs[it] = parameters[0][it];\n\n    // distort\n    // this is wrong!\n    Eigen::Vector2d rpc_dist = compute_rpc(m_undist_pix, coeffs);\n\n    for (int it = 0; it < PIXEL_SIZE; it++) \n      residuals[it] = rpc_dist[it] - m_dist_pix[it];\n\n    return true;\n  }\n\n  // Factory to hide the construction of the CostFunction object from the client code.\n  // TODO(oalexan1): Use analytical diff cost function\n  static ceres::CostFunction*\n  Create(Eigen::Vector2d const& undist_pix, Eigen::Vector2d const& dist_pix,\n         std::vector<int> const& block_sizes) {\n    ceres::DynamicNumericDiffCostFunction<RpcFitError>* cost_function =\n      new ceres::DynamicNumericDiffCostFunction<RpcFitError>\n      (new RpcFitError(undist_pix, dist_pix, block_sizes));\n\n    cost_function->SetNumResiduals(PIXEL_SIZE);\n\n    for (size_t i = 0; i < block_sizes.size(); i++)\n      cost_function->AddParameterBlock(block_sizes[i]);\n\n    return cost_function;\n  }\n\n private:\n  Eigen::Vector2d m_undist_pix, m_dist_pix;\n  std::vector<int> m_block_sizes;\n};  // End class RpcFitError\n\n// Evaluate the residuals before and after optimization\nvoid evalRpcResiduals(// Inputs\n                       std::string const& tag, \n                       std::vector<std::string> const& residual_names,\n                       // Outputs\n                       ceres::Problem& problem, \n                       std::vector<double>& residuals) {\n\n  double total_cost = 0.0;\n  ceres::Problem::EvaluateOptions eval_options;\n  eval_options.num_threads = 1;\n  eval_options.apply_loss_function = false;  // want raw residuals\n  problem.Evaluate(eval_options, &total_cost, &residuals, NULL, NULL);\n\n  // Sanity checks, after the residuals are created\n  if (residuals.size() != residual_names.size())\n    throw \"There must be as many residual names as residual values.\";\n\n  calcResidualStats(residuals, residual_names, tag);\n\n  return;\n}\n\n// Collect a set of pairs of centered and normalized distorted and undistorted\n// pixels. Sample uniformly the distorted pixels within the image box.\nvoid genDistUndistPairs(int num_samples, rig::CameraParameters const& cam_params,\n                        std::vector<Eigen::Vector2d>& undist_centered_pixels,\n                        std::vector<Eigen::Vector2d>& dist_centered_pixels) {\n\n  dist_centered_pixels.clear();\n  undist_centered_pixels.clear();\n\n  Eigen::Vector2i dist_size        = cam_params.GetDistortedSize();\n  Eigen::Vector2i dist_crop_size   = cam_params.GetDistortedCropSize();\n  Eigen::Vector2i undist_size      = cam_params.GetUndistortedSize();\n  Eigen::Vector2d dist_half_size   = cam_params.GetDistortedHalfSize();\n  Eigen::Vector2d undist_half_size = cam_params.GetUndistortedHalfSize();\n  Eigen::Vector2d optical_offset   = cam_params.GetOpticalOffset();\n  Eigen::Vector2d focal_length     = cam_params.GetFocalVector();\n\n  for (int ix = 0; ix < num_samples; ix++) {\n    double x = (dist_size[0] - 1.0) * double(ix) / (num_samples - 1.0);\n    for (int iy = 0; iy < num_samples; iy++) {\n      double y = (dist_size[1] - 1.0) * double(iy) / (num_samples - 1.0);\n\n      Eigen::Vector2d dist_pix(x, y);\n\n      // Find the centered distorted pixel\n      Eigen::Vector2d dist_ctr_pix;\n      cam_params.Convert<rig::DISTORTED, rig::DISTORTED_C>\n        (dist_pix, &dist_ctr_pix);\n\n      // Find the centered undistorted pixel\n      Eigen::Vector2d undist_ctr_pix;\n      cam_params.Convert<rig::DISTORTED_C, rig::UNDISTORTED_C>\n        (dist_ctr_pix, &undist_ctr_pix);\n      \n      // TODO(oalexan1): Dist back with OpenCV and compare with undist_pix!\n       \n      // // Exclude points based on dist_crop_size. \n      // // Note that if dist_crop_size equals dist_size, which is image\n      // // size, no points are excluded.\n      // if (std::abs(dist_pix[0] - dist_size[0] / 2.0) > dist_crop_size[0] / 2.0  ||\n      //     std::abs(dist_pix[1] - dist_size[1] / 2.0) > dist_crop_size[1] / 2.0) \n      //   continue;\n      \n      // Ensure that these pixels are centered. Here we use the same\n      // convention as in camera_params.cc.\n      //undist_pix -= undist_half_size;\n      //dist_pix   -= dist_half_size;\n   \n      // Normalize the undistorted and distorted pixels. Use the logic from\n      // DistortCentered() in camera_params.cc.\n      undist_ctr_pix = undist_ctr_pix.cwiseQuotient(focal_length);\n      dist_ctr_pix = dist_ctr_pix - (optical_offset - dist_half_size);\n      dist_ctr_pix = dist_ctr_pix.cwiseQuotient(focal_length);\n      \n      dist_centered_pixels.push_back(dist_ctr_pix);\n      undist_centered_pixels.push_back(undist_ctr_pix);\n    }\n  }\n\n  return;\n}\n\nvoid fitCurrDegRPC(std::vector<Eigen::Vector2d> const& undist_centered_pixels,\n                   std::vector<Eigen::Vector2d> const& dist_centered_pixels,\n                   int num_opt_threads, int num_iterations, double parameter_tolerance,\n                   bool verbose, Eigen::VectorXd & rpc_coeffs) {\n  std::vector<int> block_sizes;\n  block_sizes.push_back(rpc_coeffs.size());\n\n  // Form the problem\n  ceres::Problem problem;\n  std::vector<std::string> residual_names;\n  for (size_t it = 0; it < undist_centered_pixels.size(); it++) {\n    ceres::CostFunction* rpc_cost_fun =\n      RpcFitError::Create(undist_centered_pixels[it], dist_centered_pixels[it],\n                          block_sizes);\n    // Note that we do not use a robust threshold, so we want the RPC\n    // to work on the entire domain.\n    ceres::LossFunction* rpc_loss_fun = NULL;\n\n    residual_names.push_back(\"normalized_pix_x\");\n    residual_names.push_back(\"normalized_pix_y\");\n    problem.AddResidualBlock(rpc_cost_fun, rpc_loss_fun, &rpc_coeffs[0]);\n  }\n\n  if (verbose) {\n    Eigen::VectorXd num_x, den_x, num_y, den_y;\n    unpack_params(rpc_coeffs, num_x, den_x, num_y, den_y);\n    std::cout << \"input num_x \" << num_x.transpose() << std::endl;\n    std::cout << \"input den_x \" << den_x.transpose() << std::endl;\n    std::cout << \"input num_y \" << num_y.transpose() << std::endl;\n    std::cout << \"input den_y \" << den_y.transpose() << std::endl;\n  }\n\n  std::vector<double> residuals;\n  evalRpcResiduals(\"before opt\", residual_names, problem, residuals);\n\n  // Solve the problem\n  ceres::Solver::Options options;\n  ceres::Solver::Summary summary;\n  options.linear_solver_type = ceres::ITERATIVE_SCHUR;\n  options.num_threads = num_opt_threads;  // The result is more predictable with one thread\n  options.max_num_iterations = num_iterations;\n  options.minimizer_progress_to_stdout = true;\n  options.gradient_tolerance = 1e-16;\n  options.function_tolerance = 1e-16;\n  options.parameter_tolerance = parameter_tolerance;\n\n  if (!verbose)\n    options.logging_type = ceres::SILENT;\n\n  ceres::Solve(options, &problem, &summary);\n\n  if (verbose) {\n    Eigen::VectorXd num_x, den_x, num_y, den_y;\n    unpack_params(rpc_coeffs, num_x, den_x, num_y, den_y);\n    std::cout << \"output num_x \" << num_x.transpose() << std::endl;\n    std::cout << \"output den_x \" << den_x.transpose() << std::endl;\n    std::cout << \"output num_y \" << num_y.transpose() << std::endl;\n    std::cout << \"output den_y \" << den_y.transpose() << std::endl;\n  }\n\n  evalRpcResiduals(\"after opt\", residual_names, problem, residuals);\n}\n\nvoid fitRpcDist(int rpc_degree, int num_samples, rig::CameraParameters const& cam_params,\n                int num_opt_threads, int num_iterations, double parameter_tolerance,\n                bool verbose,\n                // Output\n                Eigen::VectorXd & rpc_dist_coeffs) {\n\n  std::vector<Eigen::Vector2d> undist_centered_pixels, dist_centered_pixels;\n  genDistUndistPairs(num_samples, cam_params,\n                     // Outputs\n                     undist_centered_pixels, dist_centered_pixels);\n\n  std::cout << \"Found \" << dist_centered_pixels.size() << \" pixel correspondences \"\n            << \"between undistorted and distorted images.\" << std::endl;\n\n  // First fit RPC of degree 1. Then refine to degree 2, etc, till desired rpc_degree.\n  // That is more likely to be successful than aiming right way for the full solution.\n  int initial_rpc_degree = 1;\n  int init_num_params = num_dist_params(initial_rpc_degree);\n\n  // Set up the initial guess for the variable of optimization\n  rpc_dist_coeffs = Eigen::VectorXd::Zero(init_num_params);\n  RPCLensDistortion::init_as_identity(rpc_dist_coeffs);  // this changes rpc_dist_coeffs\n\n  std::cout << \"\\nComputing RPC distortion.\" << std::endl;\n  for (int deg = 1; deg <= rpc_degree; deg++) {\n    if (deg >= 2) {\n      // Use the previously solved model as an initial guess. Increment its degree by adding\n      // to the polynomials new powers of given degree with zero coefficient in front.\n      RPCLensDistortion::increment_degree(rpc_dist_coeffs);\n    }\n    std::cout << \"Fitting RPC distortion of degree \" << deg << std::endl;\n    fitCurrDegRPC(undist_centered_pixels, dist_centered_pixels, num_opt_threads, \n                  num_iterations, parameter_tolerance, verbose, rpc_dist_coeffs);\n  }\n}\n\n// TODO(oalexan1): This needs more work\nvoid evalRpcDistUndist(int num_samples, rig::CameraParameters const& cam_params,\n                       RPCLensDistortion const& rpc) {\n\n  std::vector<Eigen::Vector2d> undist_centered_pixels, dist_centered_pixels;\n  genDistUndistPairs(num_samples, cam_params,\n                     // Outputs\n                     undist_centered_pixels, dist_centered_pixels);\n\n  double max_err = 0.0;\n  for (size_t it = 0; it < undist_centered_pixels.size(); it++) {\n    // Eigen::Vector2d pix = rpc.distort_centered(undist_centered_pixels[it]);\n    // Eigen::Vector2d pix2 = rpc.undistort_centered(pix);\n    // max_err = std::max(max_err, (undist_centered_pixels[it] - pix2).norm());\n  }\n\n  std::cout << \"Max distort_undistort error: \" << max_err << std::endl;\n}\n  \n}  // end namespace rig\n\n"
  },
  {
    "path": "src/asp/Rig/RigRpcDistortion.h",
    "content": "/* Copyright (c) 2017, United States Government, as represented by the\n * Administrator of the National Aeronautics and Space Administration.\n * \n * All rights reserved.\n * \n * The Astrobee platform is licensed under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n * \n *     http://www.apache.org/licenses/LICENSE-2.0\n * \n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n#ifndef ASP_RIG_RPC_DISTORTION_H\n#define ASP_RIG_RPC_DISTORTION_H\n\n#include <Eigen/Core>\n\n#include <string>\n#include <vector>\n\nnamespace rig {\n  // forward declaration\n  class CameraParameters;\n}\n\nnamespace rig {\nclass RPCLensDistortion {\n  int m_rpc_degree;\n  Eigen::VectorXd m_distortion;\n\n public:\n  explicit RPCLensDistortion(); // NOLINT\n  explicit RPCLensDistortion(Eigen::VectorXd const& params);\n  void reset(int rpc_degree);  // Form the identity transform\n  Eigen::VectorXd distortion_parameters() const;\n  void set_image_size(Eigen::Vector2i const& image_size);\n  void set_distortion_parameters(Eigen::VectorXd const& params);\n  int num_dist_params() const { return m_distortion.size(); }\n\n  Eigen::Vector2d distorted_coordinates(Eigen::Vector2d const& p) const;\n\n  void write(std::ostream& os) const;\n  void read(std::istream& os);\n\n  static  std::string class_name()       { return \"RPC\"; }\n  std::string name      () const { return class_name();  }\n\n  static void init_as_identity(Eigen::VectorXd & params);\n  static void increment_degree(Eigen::VectorXd & params);\n\n  Eigen::VectorXd dist_undist_params();\n\n  //Eigen::Vector2d distort_centered(Eigen::Vector2d const& p) const;\n};\n\nvoid unpack_params(Eigen::VectorXd const& params, \n                   Eigen::VectorXd& num_x, Eigen::VectorXd& den_x,\n                   Eigen::VectorXd& num_y, Eigen::VectorXd& den_y);\n\nvoid fitRpcDist(int rpc_degree, int num_samples, rig::CameraParameters const& cam_params,\n                int num_opt_threads, int num_iterations, double parameter_tolerance,\n                bool verbose,\n                // Output\n                Eigen::VectorXd & rpc_dist_coeffs);\n\nvoid evalRpcDistUndist(int num_samples, rig::CameraParameters const& cam_params,\n                       RPCLensDistortion const& rpc);\n  \n// Compute the RPC model with given coefficients at the given point. Recall that\n// RPC is ratio of two polynomials in x and y. This assumes centered pixels that\n// are normalized by the focal length.\nEigen::Vector2d compute_rpc(Eigen::Vector2d const& p, Eigen::VectorXd const& coeffs);\n  \n// Prepend a 1 to a vector\nvoid prepend_1(Eigen::VectorXd & vec);\n  \n}\n  \n#endif  // ASP_RIG_RPC_DISTORTION_H\n"
  },
  {
    "path": "src/asp/Rig/RigThread.cc",
    "content": "/* Copyright (c) 2017, United States Government, as represented by the\n * Administrator of the National Aeronautics and Space Administration.\n * \n * All rights reserved.\n * \n * The Astrobee platform is licensed under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n * \n *     http://www.apache.org/licenses/LICENSE-2.0\n * \n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n#include <asp/Rig/RigThread.h>\n\n#include <vw/Core/Exception.h>\n\n#include <sys/time.h>\n#include <thread>\n\nnamespace rig {\n  \nint defaultNumThreads() {\n  return (std::thread::hardware_concurrency() == 0 ?\n          8 : std::thread::hardware_concurrency());\n}\n\n\nvoid* HolderFunction(void* ptr) {\n  rig::ThreadPool::VarsTuple* vars = reinterpret_cast<rig::ThreadPool::VarsTuple*>(ptr);\n\n  // Run the function\n  std::get<0>(*vars)();\n\n  // Set out boolean so someone can know they can delete this\n  std::get<3>(*vars) = true;\n\n  // Signal that we are finished\n  pthread_mutex_lock(std::get<1>(*vars));\n  pthread_cond_signal(std::get<2>(*vars));\n  pthread_mutex_unlock(std::get<1>(*vars));\n\n  return NULL;\n}\n\nThreadPool::ThreadPool(int num_threads): max_concurrent_jobs_(num_threads) {\n  pthread_mutex_init(&cond_mutex_, NULL);\n  pthread_cond_init(&cond_, NULL);\n  if (max_concurrent_jobs_ <= 0)\n     vw::vw_throw(vw::ArgumentErr() << \"Thread pool without threads created.\\n\");\n}\n\nThreadPool::~ThreadPool() {\n  Join();\n  pthread_cond_destroy(&cond_);\n  pthread_mutex_destroy(&cond_mutex_);\n}\n\nvoid ThreadPool::Join() {\n  while (threads_.size()) {\n    pthread_join(threads_.front(), NULL);\n    threads_.pop_front();\n    var_bindings_.pop_front();\n  }\n}\n\nvoid ThreadPool::WaitTillJobOpening() {\n  while (threads_.size() >= max_concurrent_jobs_) {\n    // Wait for a condition event to signal a free job or time out\n    // after one second. I do a time out because somehow I still have\n    // a deadlock. I think it occurs if a task just finishes faster\n    // than we can get back into a state to wait for condition.\n    pthread_mutex_lock(&cond_mutex_);\n    struct timeval tv;\n    struct timespec ts;\n    gettimeofday(&tv, NULL);\n    ts.tv_sec = tv.tv_sec + 1;\n    ts.tv_nsec = 0;\n    pthread_cond_timedwait(&cond_, &cond_mutex_, &ts);\n    pthread_mutex_unlock(&cond_mutex_);\n\n    // Iterate through and clean out all the finished jobs\n    std::list<pthread_t>::iterator thread_it = threads_.begin();\n    std::list<VarsTuple>::iterator vars_it = var_bindings_.begin();\n    while (thread_it != threads_.end()) {\n      if (std::get<3>(*vars_it)) {\n        // Thread says it has finished. Join.\n        pthread_join(*thread_it, NULL);\n        thread_it = threads_.erase(thread_it);\n        vars_it = var_bindings_.erase(vars_it);\n      } else {\n        thread_it++;\n        vars_it++;\n      }\n    }\n  }\n}\n\n} // end namespace rig\n"
  },
  {
    "path": "src/asp/Rig/RigThread.h",
    "content": "/* Copyright (c) 2017, United States Government, as represented by the\n * Administrator of the National Aeronautics and Space Administration.\n * \n * All rights reserved.\n * \n * The Astrobee platform is licensed under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n * \n *     http://www.apache.org/licenses/LICENSE-2.0\n * \n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n#ifndef ASP_RIG_THREAD_H\n#define ASP_RIG_THREAD_H\n\n#include <gflags/gflags.h>\n#include <pthread.h>\n\n#include <list>\n#include <functional>\n\n#define GOOGLE_ALLOW_RVALUE_REFERENCES_PUSH\n#define GOOGLE_ALLOW_RVALUE_REFERENCES_POP\n\nGOOGLE_ALLOW_RVALUE_REFERENCES_PUSH\n\nnamespace rig {\n\nint defaultNumThreads();\n\nvoid* HolderFunction(void* ptr);\n\nclass ThreadPool {\n\npublic:\n\n  typedef std::tuple<std::function<void(void)>, pthread_mutex_t*, pthread_cond_t*, bool> VarsTuple;\n\n  ThreadPool(int num_threads);\n  ~ThreadPool();  \n  // The following identifies this thread as non copyable and non\n  // moveable. Our threads are holding pointers to this exact\n  // object.\n  ThreadPool(const ThreadPool&) = delete;\n  ThreadPool& operator=(const ThreadPool&) = delete;\n\n  // This pushes back a function and it's arguments to be\n  // executed. This method will block if the number of threads is\n  // already maxed. You can also push back mixed types of functions.\n  //\n  // Example:\n  // void Monkey(std::vector const& input, int val, std::vector * output);\n  // ThreadPool pool;\n  // pool.AddTask(Monkey, std::ref(input), 3, &output);\n  //\n  // If you don't use a std::ref as in the above example, the input\n  // will be copied. Other alternatives are to use a pointer.\n  template <typename Function, typename... Args>\n  void AddTask(Function&& f, Args&&... args) {\n    WaitTillJobOpening();\n\n    // Bind up the function the user has given us\n    var_bindings_.emplace_back(std::bind(f, args...),\n                                &cond_mutex_,\n                                &cond_, false);\n\n    // Create the thread and start doing work\n    threads_.push_back(pthread_t());\n    pthread_create(&threads_.back(), NULL, HolderFunction, &var_bindings_.back());\n  }\n\n  void Join();\n\nprivate:\n\n  void WaitTillJobOpening();\n\n  size_t max_concurrent_jobs_;\n  std::list<pthread_t> threads_;\n  std::list<VarsTuple> var_bindings_;\n  pthread_mutex_t cond_mutex_;\n  pthread_cond_t cond_;\n};\n\n}  // namespace rig\n\nGOOGLE_ALLOW_RVALUE_REFERENCES_POP\n\n#endif  // ASP_RIG_THREAD_H\n"
  },
  {
    "path": "src/asp/Rig/RigTypeDefs.h",
    "content": "/* Copyright (c) 2017, United States Government, as represented by the\n * Administrator of the National Aeronautics and Space Administration.\n * \n * All rights reserved.\n * \n * The Astrobee platform is licensed under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n * \n *     http://www.apache.org/licenses/LICENSE-2.0\n * \n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n#ifndef ASP_RIG_TYPE_DEFS_H\n#define ASP_RIG_TYPE_DEFS_H\n\n#include <map>\n#include <vector>\n#include <Eigen/Core>\n#include <Eigen/Geometry>\n\n// A small header to hold type definitions for the rig calibrator\nnamespace rig {\n\n  // Vector of keypoints for each image\n  typedef std::vector<std::vector<std::pair<float, float>>> KeypointVec;  \n\n  // A map from keypoint coordinates to its index in the KeypointVec\n  typedef std::vector<std::map<std::pair<float, float>, int>> KeyPointMap;\n\n  // Maps Point ID -> Camera ID -> Feature ID\n  typedef std::vector<std::map<int, int>> PidCidFid; \n\n  // PidCidFid with extra info\n  typedef std::vector<std::map<int, std::map<int, int>>> PidCidFidMap;\n  \n  // Maps Point ID -> Camera ID -> Feature ID -> 3D Mesh Intersection Point\n  typedef std::vector<std::map<int, std::map<int, Eigen::Vector3d>>> PidCidFidToMeshXyz;\n\n  // Vector of Eigen Matrices holding keypoints (NVM format)\n  typedef std::vector<Eigen::Matrix2Xd> CidToKeypointMatVec;\n\n  // Maps Image ID pair -> List of convergence angles\n  typedef std::map<std::pair<int, int>, std::vector<double>> PairwiseConvergenceAngles;\n\n}  // namespace rig\n\n#endif  // ASP_RIG_TYPE_DEFS_H\n\n"
  },
  {
    "path": "src/asp/Rig/RigUtils.cc",
    "content": "/* Copyright (c) 2021, United States Government, as represented by the\n * Administrator of the National Aeronautics and Space Administration.\n *\n * All rights reserved.\n *\n * The \"ISAAC - Integrated System for Autonomous and Adaptive Caretaking\n * platform\" software is licensed under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n#include <asp/Rig/SystemUtils.h>\n#include <asp/Rig/RigUtils.h>\n#include <asp/Rig/RigParseUtils.h>\n#include <asp/Rig/CameraImage.h>\n#include <asp/Rig/TransformUtils.h>\n#include <asp/Rig/InterpolationUtils.h>\n#include <asp/Rig/RigConfig.h>\n#include <asp/Rig/happly.h> // for saving ply files as meshes\n#include <asp/Rig/RigCameraParams.h>\n#include <asp/Rig/BasicAlgs.h>\n#include <asp/Rig/RigMath.h>\n#include <asp/Core/Nvm.h>\n\n#include <glog/logging.h>\n#include <boost/filesystem.hpp>\n\n#include <pcl/io/ply_io.h>\n#include <pcl/io/pcd_io.h>\n\n#include <iostream>\n#include <fstream>\n#include <iomanip>\n\n// TODO(oalexan1): This file needs to be broken up\n\nnamespace rig {\n\n// Read a 4x4 pose matrix of doubles from disk\nvoid readPoseMatrix(cv::Mat& pose, std::string const& filename) {\n  pose = cv::Mat::zeros(4, 4, CV_64F);\n  std::ifstream ifs(filename.c_str(), std::ifstream::in);\n  for (int row = 0; row < 4; row++) {\n    for (int col = 0; col < 4; col++) {\n      double val;\n      if (!(ifs >> val)) LOG(FATAL) << \"Could not read a 4x4 matrix from: \" << filename;\n      pose.at<double>(row, col) = val;\n    }\n  }\n}\n\n// Read an affine matrix with double values\nbool readAffine(Eigen::Affine3d& T, std::string const& filename) {\n  Eigen::MatrixXd M(4, 4);\n\n  std::ifstream ifs(filename.c_str(), std::ifstream::in);\n  for (int row = 0; row < 4; row++) {\n    for (int col = 0; col < 4; col++) {\n      double val;\n      if (!(ifs >> val)) return false;\n\n      M(row, col) = val;\n    }\n  }\n\n  T.linear() = M.block<3, 3>(0, 0);\n  T.translation() = M.block<3, 1>(0, 3);\n\n  return true;\n}\n\n// Write a matrix with double values\nvoid writeMatrix(Eigen::MatrixXd const& M, std::string const& filename) {\n  // std::cout << \"Writing: \" << filename << std::endl;\n  std::ofstream ofs(filename.c_str());\n  ofs.precision(17);\n  ofs << M << \"\\n\";\n  ofs.close();\n}\n\n// Save a file with x, y, z rows if point_size is 3, and also a color\n// if point_size is 4.\nvoid writeCloud(std::vector<float> const& points, size_t point_size, std::string const& filename) {\n  size_t num_points = points.size() / point_size;\n  if (point_size * num_points != points.size()) LOG(FATAL) << \"Book-keeping failure.\";\n\n  // std::cout << \"Writing: \" << filename << \"\\n\";\n  std::ofstream fh(filename.c_str());\n  fh.precision(17);\n  for (size_t it = 0; it < num_points; it++) {\n    for (size_t ch = 0; ch < point_size; ch++) {\n      fh << points[point_size * it + ch];\n      if (ch + 1 < point_size)\n        fh << \" \";\n      else\n        fh << \"\\n\";\n    }\n  }\n  fh.close();\n}\n\n// Return the type of an opencv matrix\nstd::string matType(cv::Mat const& mat) {\n  int type = mat.type();\n  std::string r;\n\n  uchar depth = type & CV_MAT_DEPTH_MASK;\n  uchar chans = 1 + (type >> CV_CN_SHIFT);\n\n  switch (depth) {\n    case CV_8U:\n      r = \"8U\";\n      break;\n    case CV_8S:\n      r = \"8S\";\n      break;\n    case CV_16U:\n      r = \"16U\";\n      break;\n    case CV_16S:\n      r = \"16S\";\n      break;\n    case CV_32S:\n      r = \"32S\";\n      break;\n    case CV_32F:\n      r = \"32F\";\n      break;\n    case CV_64F:\n      r = \"64F\";\n      break;\n    default:\n      r = \"User\";\n      break;\n  }\n\n  r += \"C\";\n  r += (chans + '0');\n\n  return r;\n}\n\nvoid StampedPoseStorage::addPose(Eigen::Affine3d const& pose, double timestamp) {\n  int bin_index = floor(timestamp);\n  m_poses[bin_index][timestamp] = pose;\n}\n\nbool StampedPoseStorage::interpPose(double input_timestamp, double max_gap, Eigen::Affine3d& out_pose) const {\n  bool is_success = false;\n\n  if (m_poses.empty()) return is_success;\n\n  // Look for the nearest pose with timestamp <= input_timestamp.\n  double low_timestamp = -1.0;\n  Eigen::Affine3d low_pose;\n  // Traverse the bins in decreasing order of bin key.\n  for (int bin_iter = floor(input_timestamp); bin_iter >= m_poses.begin()->first; bin_iter--) {\n    auto bin_ptr = m_poses.find(bin_iter);\n    if (bin_ptr == m_poses.end()) continue;  // empty bin\n\n    // Found a bin. Study it in decreasing order of timestamps.\n    auto& bin = bin_ptr->second;\n    for (auto it = bin.rbegin(); it != bin.rend(); it++) {\n      double timestamp = it->first;\n      if (timestamp <= input_timestamp) {\n        low_timestamp = timestamp;\n        low_pose = it->second;\n        is_success = true;\n        break;\n      }\n    }\n    if (is_success) break;\n  }\n\n  if (!is_success) return false;  // Failed\n\n  // Found the lower bound. Now go forward in time. Here the logic is\n  // the reverse of the above.\n  is_success = false;\n  double high_timestamp = -1.0;\n  Eigen::Affine3d high_pose;\n  for (int bin_iter = floor(input_timestamp); bin_iter <= m_poses.rbegin()->first; bin_iter++) {\n    auto bin_ptr = m_poses.find(bin_iter);\n    if (bin_ptr == m_poses.end()) continue;  // empty bin\n\n    // Found a bin. Study it in increasing order of timestamps.\n    auto& bin = bin_ptr->second;\n    for (auto it = bin.begin(); it != bin.end(); it++) {\n      double timestamp = it->first;\n      if (timestamp >= input_timestamp) {\n        high_timestamp = timestamp;\n        high_pose = it->second;\n        is_success = true;\n        break;\n      }\n    }\n    if (is_success) break;\n  }\n\n  if (!is_success || high_timestamp - low_timestamp > max_gap) {\n    return false;  // Failed\n  }\n\n  if (!(low_timestamp <= input_timestamp && input_timestamp <= high_timestamp))\n    LOG(FATAL) << \"Book-keeping failure in pose interpolation.\";\n\n  double alpha = (input_timestamp - low_timestamp) / (high_timestamp - low_timestamp);\n  if (high_timestamp == low_timestamp) alpha = 0.0;  // handle division by zero\n\n  out_pose = rig::linearInterp(alpha, low_pose, high_pose);\n\n  return is_success;\n}\n\nvoid StampedPoseStorage::clear() { m_poses.clear(); }\n\nbool StampedPoseStorage::empty() const { return m_poses.empty(); }\n\nvoid readCameraPoses(std::string const& filename,\n                     std::map<double, double>& haz_depth_to_image_timestamps,\n                     std::map<std::string, std::map<double, Eigen::Affine3d> >&\n                     world_to_cam_poses) {\n  haz_depth_to_image_timestamps.clear();\n  world_to_cam_poses.clear();\n\n  std::ifstream ifs(filename.c_str());\n  std::string line;\n  while (std::getline(ifs, line)) {\n    std::istringstream is(line);\n\n    std::string str;\n    if (!(is >> str)) continue;\n\n    if (str == \"nav_cam\" || str == \"sci_cam\" || str == \"haz_cam\") {\n      double timestamp;\n      if (!(is >> timestamp)) continue;\n\n      Eigen::MatrixXd M(4, 4);\n      for (int row = 0; row < 4; row++) {\n        for (int col = 0; col < 4; col++) {\n          if (!(is >> M(row, col))) LOG(FATAL) << \"Failure reading: \" << filename;\n        }\n      }\n\n      world_to_cam_poses[str][timestamp].matrix() = M;\n\n    } else if (str == \"haz_depth_to_image\") {\n      double depth_time, image_time;\n      if (!(is >> depth_time >> image_time)) LOG(FATAL) << \"Failure reading: \" << filename;\n\n      haz_depth_to_image_timestamps[depth_time] = image_time;\n    }\n  }\n\n  ifs.close();\n}\n\n// Scale an image to correct for lightning variations by taking into\n// account that JPEG images have gamma correction applied to them.\n// See https://en.wikipedia.org/wiki/Gamma_correction.\nvoid scaleImage(double max_iso_times_exposure, double iso, double exposure,\n                cv::Mat const& input_image, cv::Mat& output_image) {\n  double scale = pow(max_iso_times_exposure / iso / exposure, 1.0 / 2.2);\n  int same_type = -1;\n  double offset = 0.0;\n  input_image.convertTo(output_image, same_type, scale, offset);\n}\n\n// Given two bounds, pick two timestamps within these bounds, the one\n// closest to the left bound and the one to the right bound. Take into\n// account that the timestamps may need to have an offset added to\n// them. Assume that the input timestamps are sorted in increasing order.\n// TODO(oalexan1): May have to add a constraint to only pick\n// a timestamp if not further from the bound than a given value.\nvoid pickTimestampsInBounds(std::vector<double> const& timestamps,\n                            double left_bound, double right_bound, double offset,\n                            std::vector<double>& out_timestamps) {\n  out_timestamps.clear();\n\n  // Start by simply collecting all timestamps between the given\n  // bounds. Much easier to understand than if doing something more\n  // fancy.\n  std::vector<double> local_timestamps;\n  for (size_t it = 0; it < timestamps.size(); it++) {\n    double timestamp = timestamps[it];\n    if (timestamp + offset >= left_bound && timestamp + offset < right_bound) {\n      local_timestamps.push_back(timestamp);\n    }\n  }\n\n  if (local_timestamps.size() < 1) {\n    // Nothing to pick\n    return;\n  }\n\n  if (local_timestamps.size() == 1) {\n    // Only one is present\n    out_timestamps.push_back(local_timestamps[0]);\n    return;\n  }\n\n  // Add the ones at the ends\n  out_timestamps.push_back(local_timestamps[0]);\n  out_timestamps.push_back(local_timestamps.back());\n\n  return;\n}\n\n// Read the images, depth clouds, and their metadata\n// Save the properties of images. Use space as separator.\nvoid saveCameraPoses(std::string const& out_dir,\n                     std::vector<rig::cameraImage> const& cams,\n                     std::vector<Eigen::Affine3d> const& world_to_cam) {\n  rig::createDir(out_dir);\n  std::string image_list = out_dir + \"/cameras.txt\";\n  std::cout << \"Writing: \" << image_list << std::endl;\n\n  std::ofstream f;\n  f.open(image_list.c_str(), std::ios::binary | std::ios::out);\n  if (!f.is_open()) LOG(FATAL) << \"Cannot open file for writing: \" << image_list << \"\\n\";\n  f.precision(17);\n\n  f << \"# image_file world_to_camera_transform\\n\";\n\n  for (size_t it = 0; it < cams.size(); it++) {\n\n    // Convert an affine transform to a 4x4 matrix\n    Eigen::MatrixXd T = world_to_cam[it].matrix();\n\n    // Save the rotation and translation of T\n    f << cams[it].image_name << \" \" << rig::affineToStr(world_to_cam[it]) << \"\\n\";\n  }\n\n  f.close();\n}\n\n// Check if first three coordinates of a vector are 0. That would make it invalid.\nbool invalidXyz(cv::Vec3f const& p) { return (p[0] == 0) && (p[1] == 0) && (p[2] == 0); }\n\n// Add a given vertex to the ply file unless already present\nvoid add_vertex(cv::Vec3f const& V, double intensity,\n                std::pair<int, int> const& pix,    // NOLINT\n                std::map<std::pair<int, int>, size_t>& pix_to_vertex,  // NOLINT\n                size_t& vertex_count,                                  // NOLINT\n                std::vector<std::array<double, 3>>& vertices,          // NOLINT\n                std::vector<std::array<double, 3>>& colors) {          // NOLINT\n  // Do not add the invalid zero vertex\n  if (invalidXyz(V)) return;\n\n  if (pix_to_vertex.find(pix) != pix_to_vertex.end()) return;  // Vertex already exists\n\n  std::array<double, 3> point = {V[0], V[1], V[2]};\n  std::array<double, 3> color = {intensity/255.0, intensity/255.0, intensity/255.0};\n\n  vertices.push_back(point);\n  colors.push_back(color);\n\n  // Record the map from the pixel to its location\n  pix_to_vertex[pix] = vertex_count;\n  vertex_count++;\n}\n\nvoid applyTransformToCloud(cv::Mat const& in_cloud,\n                           Eigen::Affine3d const& cam_to_world,\n                           cv::Mat & out_cloud) {\n\n  if (in_cloud.channels() != 3) \n    LOG(FATAL) << \"Expecting an xyz point cloud.\\n\";\n  \n  out_cloud = cv::Mat::zeros(in_cloud.rows, in_cloud.cols, CV_32FC3);\n  for (int row = 0; row < in_cloud.rows; row++) {\n    for (int col = 0; col < in_cloud.cols; col++) {\n      cv::Vec3f xyz = in_cloud.at<cv::Vec3f>(row, col);\n      \n      if (invalidXyz(xyz)) {\n        // Invalid points stay invalid\n        out_cloud.at<cv::Vec3f>(row, col) = xyz;\n        continue;\n      }\n\n      // Transform to world coordinates\n      Eigen::Vector3d P(xyz[0], xyz[1], xyz[2]);\n      P = cam_to_world * P;\n      for (size_t c = 0; c < 3; c++)\n        out_cloud.at<cv::Vec3f>(row, col)[c] = P[c];\n    }\n  }\n}\n  \n// Apply a transform to a point cloud to make it go from camera coordinates to world\n// coordinates and save it as a ply file.\nvoid saveTransformedMesh(cv::Mat const& depthMat, cv::Mat const& intensity,\n                         Eigen::Affine3d const& depth_to_world,\n                         std::string const& plyFileName) {\n\n  // Sanity check\n  if (depthMat.cols != intensity.cols || depthMat.rows != intensity.rows)\n    LOG(FATAL) << \"The depth cloud and its intensity must have same size.\\n\";\n  \n  // Apply the transform.\n  cv::Mat transMat;\n  applyTransformToCloud(depthMat, depth_to_world, transMat);\n\n  size_t vertex_count = 0;\n  std::map<std::pair<int, int>, size_t> pix_to_vertex;  // map from pixel to vertex indices\n  std::vector<std::array<double, 3>> vertices;\n  std::vector<std::array<double, 3>> colors;\n  std::vector<std::vector<size_t>> faces;\n\n  for (int row = 0; row < transMat.rows - 1; row++) {\n    for (int col = 0; col < transMat.cols - 1; col++) {\n      std::pair<int, int> pix_ul = std::make_pair(row, col);\n      std::pair<int, int> pix_ur = std::make_pair(row + 1, col);\n      std::pair<int, int> pix_ll = std::make_pair(row, col + 1);\n      std::pair<int, int> pix_lr = std::make_pair(row + 1, col + 1);\n      cv::Vec3f UL = transMat.at<cv::Vec3f>(pix_ul.first, pix_ul.second);\n      cv::Vec3f UR = transMat.at<cv::Vec3f>(pix_ur.first, pix_ur.second);\n      cv::Vec3f LL = transMat.at<cv::Vec3f>(pix_ll.first, pix_ll.second);\n      cv::Vec3f LR = transMat.at<cv::Vec3f>(pix_lr.first, pix_lr.second);\n\n      double inten_UL = intensity.at<uchar>(pix_ul.first, pix_ul.second);\n      double inten_UR = intensity.at<uchar>(pix_ur.first, pix_ur.second);\n      double inten_LL = intensity.at<uchar>(pix_ll.first, pix_ll.second);\n      double inten_LR = intensity.at<uchar>(pix_lr.first, pix_lr.second);\n\n      // Add three vertices of a face\n      add_vertex(UL, inten_UL, pix_ul, pix_to_vertex, vertex_count, vertices, colors);\n      add_vertex(UR, inten_UR, pix_ur, pix_to_vertex, vertex_count, vertices, colors);\n      add_vertex(LL, inten_LL, pix_ll, pix_to_vertex, vertex_count, vertices, colors);\n\n      // Note how we add only valid faces, so all three vertices must be valid (non-zero)\n      if (!invalidXyz(UL) && !invalidXyz(UR) && !invalidXyz(LL) &&\n          inten_UL >= 0 && inten_UR >= 0 && inten_LL >= 0) {\n        std::vector<size_t> face = {pix_to_vertex[pix_ul], pix_to_vertex[pix_ur],\n                                    pix_to_vertex[pix_ll]};\n        faces.push_back(face);\n      }\n\n      // Add the other face, forming a full grid cell\n      add_vertex(UR, inten_UR, pix_ur, pix_to_vertex, vertex_count, vertices, colors);\n      add_vertex(LR, inten_LR, pix_lr, pix_to_vertex, vertex_count, vertices, colors);\n      add_vertex(LL, inten_LL, pix_ll, pix_to_vertex, vertex_count, vertices, colors);\n      if (!invalidXyz(UR) && !invalidXyz(LR) && !invalidXyz(LL) &&\n          inten_UR >= 0 && inten_LR >= 0 && inten_LL >= 0) {\n        std::vector<size_t> face = {pix_to_vertex[pix_ur], pix_to_vertex[pix_lr],\n                                    pix_to_vertex[pix_ll]};\n        faces.push_back(face);\n      }\n    }\n  }\n\n  // Form and save the ply\n  happly::PLYData ply;\n  ply.addVertexPositions(vertices);\n  ply.addVertexColors(colors);\n  ply.addFaceIndices(faces);\n  std::cout << \"Writing: \" << plyFileName << std::endl;\n  ply.write(plyFileName, happly::DataFormat::ASCII);\n}\n\n// Save the depth clouds and optimized transforms needed to create a mesh with voxblox\n// (if depth clouds exist).\nvoid exportToVoxblox(std::vector<std::string> const& cam_names,\n                     std::vector<rig::cameraImage> const& cam_images,\n                     std::vector<Eigen::Affine3d> const& depth_to_image,\n                     std::vector<Eigen::Affine3d> const& world_to_cam,\n                     std::string const& out_dir) {\n\n  if (cam_images.size() != world_to_cam.size())\n    LOG(FATAL) << \"There must be as many camera images as camera poses.\\n\";\n  if (cam_names.size() != depth_to_image.size()) \n    LOG(FATAL) << \"Must have as many camera types as depth-to-image transforms.\\n\";\n  if (out_dir.empty())\n    LOG(FATAL) << \"The output directory is empty.\\n\";\n\n  std::string voxblox_dir = out_dir + \"/voxblox\";\n  rig::createDir(voxblox_dir);\n  std::cout << \"Saving voxblox data to: \" << voxblox_dir << \"\\n\";\n  \n  char timestamp_buffer[1000];\n\n  // Must take a pass for each camera type, and then visit\n  // all images while ignoring those of a different type. There are very\n  // few camera types, so this is not unreasonable.\n  // Keep the 2D image structure of the cloud. Replace the invalid\n  // entries with Inf.\n  double inf = std::numeric_limits<double>::infinity();\n  for (size_t cam_type = 0; cam_type < cam_names.size(); cam_type++) {\n\n    std::string voxblox_subdir = voxblox_dir + \"/\" + cam_names[cam_type];\n    rig::createDir(voxblox_subdir);\n\n    int num_saved_clouds = 0;\n    std::string index_file = voxblox_subdir + \"/index.txt\";\n    std::cout << \"Writing: \" << index_file << std::endl;\n    std::ofstream ofs(index_file.c_str());\n\n    for (size_t cid = 0; cid < cam_images.size(); cid++) {\n\n      if (cam_images[cid].camera_type != cam_type) \n        continue;\n\n      int depth_cols = cam_images[cid].depth_cloud.cols;\n      int depth_rows = cam_images[cid].depth_cloud.rows;\n      \n      if (depth_cols == 0 || depth_rows == 0)\n        continue; // skip empty clouds\n\n      // Sanity check\n      if (depth_cols != cam_images[cid].image.cols || \n          depth_rows != cam_images[cid].image.rows)\n        LOG(FATAL) << \"Found a depth cloud and corresponding image with \"\n                   << \"mismatching dimensions.\\n\";\n        \n      // Must use the 10.7f format for the timestamp as everywhere else in the code,\n      // as it is in double precision.\n      double timestamp = cam_images[cid].timestamp;\n      snprintf(timestamp_buffer, sizeof(timestamp_buffer), \"%10.7f\", timestamp);\n\n      // Sanity check\n      if (cam_images[cid].image.channels() != 1) \n        LOG(FATAL) << \"Expecting a grayscale input image.\\n\";\n      \n      // Form the pcl point cloud. Add the first band of the image as an intensity.\n      // TODO(oalexan1): Make this a subroutine\n      pcl::PointCloud<pcl::PointNormal> pc;\n      pc.width = depth_cols;\n      pc.height = depth_rows;\n      pc.points.resize(std::int64_t(pc.width) * std::int64_t(pc.height)); // avoid overflow\n      int count = 0;\n      for (int row = 0; row < depth_rows; row++) {\n        for (int col = 0; col < depth_cols; col++) {\n          cv::Vec3f xyz = cam_images[cid].depth_cloud.at<cv::Vec3f>(row, col);\n          Eigen::Vector3d P;\n          if (xyz == cv::Vec3f(0, 0, 0)) {\n            P = Eigen::Vector3d(inf, inf, inf);\n          } else{\n            // Transform from depth cloud coordinates to camera coordinates\n            // (later voxblox will transform to world coordinates)\n            P = Eigen::Vector3d(xyz[0], xyz[1], xyz[2]);\n            P = depth_to_image[cam_images[cid].camera_type] * P;\n          }\n          pc.points[count].x         = P[0];\n          pc.points[count].y         = P[1];\n          pc.points[count].z         = P[2];\n          pc.points[count].normal_x  = cam_images[cid].image.at<uchar>(row, col); // intensity\n          pc.points[count].normal_y  = 1.0; // weight\n          pc.points[count].normal_y  = 1.0; // intersection err\n          pc.points[count].normal_y  = 0.0; // ensure initialization\n          \n          count++;\n        }\n      }\n\n      // Save the transform\n      std::string transform_file = voxblox_subdir + \"/\" + timestamp_buffer + \"_cam2world.txt\";\n      ofs << transform_file << \"\\n\"; // save its name in the index\n      rig::writeMatrix(world_to_cam[cid].inverse().matrix(), transform_file);\n\n      // Save the pcd file\n      std::string cloud_file = voxblox_subdir + \"/\" + timestamp_buffer + \".pcd\";\n      //std::cout << \"Writing: \" << cloud_file << std::endl;\n      ofs << cloud_file << \"\\n\"; // save its name in the index\n      pcl::io::savePCDFileBinary(cloud_file, pc); // writing binary is much faster than ascii\n\n      num_saved_clouds++;\n    }\n    \n    if (num_saved_clouds == 0)\n      std::cout << \"No depth clouds were saved for camera: \" << cam_names[cam_type]\n                << \". Empty index file: \" << index_file << \".\\n\";\n    \n  } // end loop over camera types\n\n  return;\n}\n  \n// Save the depth clouds and optimized transforms needed to create a mesh with voxblox\n// (if depth clouds exist).\nvoid saveTransformedDepthClouds(std::vector<std::string> const& cam_names,\n                                std::vector<rig::cameraImage> const& cam_images,\n                                std::vector<Eigen::Affine3d> const& depth_to_image,\n                                std::vector<Eigen::Affine3d> const& world_to_cam,\n                                std::string const& out_dir) {\n  if (cam_images.size() != world_to_cam.size())\n    LOG(FATAL) << \"There must be as many camera images as camera poses.\\n\";\n  if (cam_names.size() != depth_to_image.size()) \n    LOG(FATAL) << \"Must have as many camera types as depth-to-image transforms.\\n\";\n  \n  if (out_dir.empty())\n    LOG(FATAL) << \"The output directory is empty.\\n\";\n\n  std::string trans_depth_dir = out_dir + \"/trans_depth\";\n  rig::createDir(trans_depth_dir);\n\n  char timestamp_buffer[1000];\n\n  // Must take a pass for each camera type, and then visit\n  // all images while ignoring those of a different type. There are very\n  // few camera types, so this is not unreasonable.\n\n  for (size_t cam_type = 0; cam_type < cam_names.size(); cam_type++) {\n\n    std::string trans_depth_subdir = trans_depth_dir + \"/\" + cam_names[cam_type];\n    rig::createDir(trans_depth_subdir);\n\n    for (size_t cid = 0; cid < cam_images.size(); cid++) {\n\n      if (cam_images[cid].camera_type != cam_type) \n        continue;\n\n      int depth_cols = cam_images[cid].depth_cloud.cols;\n      int depth_rows = cam_images[cid].depth_cloud.rows;\n      \n      if (depth_cols == 0 || depth_rows == 0)\n        continue; // skip empty clouds\n\n      // Sanity check\n      if (depth_cols != cam_images[cid].image.cols || \n          depth_rows != cam_images[cid].image.rows)\n        LOG(FATAL) << \"Found a depth cloud and corresponding image with mismatching dimensions.\\n\";\n        \n      // Must use the 10.7f format for the timestamp as everywhere else in the code,\n      // as it is in double precision.\n      double timestamp = cam_images[cid].timestamp;\n      snprintf(timestamp_buffer, sizeof(timestamp_buffer), \"%10.7f\", timestamp);\n\n      // Sanity check\n      if (cam_images[cid].image.channels() != 1) \n        LOG(FATAL) << \"Expecting a grayscale input image.\\n\";\n\n      // Save the pcd file\n      std::string cloud_file = trans_depth_subdir + \"/\" + timestamp_buffer + \".ply\";\n\n      // To go from the depth cloud to world coordinates need to first to go from depth\n      // to image coordinates, then from image to world. \n      Eigen::Affine3d depth_to_world = (world_to_cam[cid].inverse())\n        * depth_to_image[cam_images[cid].camera_type];\n      saveTransformedMesh(cam_images[cid].depth_cloud, cam_images[cid].image,\n                          depth_to_world, cloud_file);\n      \n    }\n  }\n  \n}\n\n// Find the depth measurement. Use nearest neighbor interpolation\n// to look into the depth cloud.\nbool depthValue(// Inputs\n                cv::Mat const& depth_cloud, Eigen::Vector2d const& dist_ip,\n                // Output\n                Eigen::Vector3d& depth_xyz) {\n  depth_xyz = Eigen::Vector3d(0, 0, 0);  // initialize\n\n  if (depth_cloud.cols == 0 && depth_cloud.rows == 0)\n    return false;  // empty cloud\n\n  int col = round(dist_ip[0]);\n  int row = round(dist_ip[1]);\n\n  if (col < 0 || row < 0 || col > depth_cloud.cols || row > depth_cloud.rows)\n    LOG(FATAL) << \"Out of range in the depth cloud.\";\n\n  // After rounding one may hit the bound\n  if (col == depth_cloud.cols || row == depth_cloud.rows)\n    return false;\n\n  cv::Vec3f cv_depth_xyz = depth_cloud.at<cv::Vec3f>(row, col);\n\n  // Skip invalid measurements\n  if (cv_depth_xyz == cv::Vec3f(0, 0, 0))\n    return false;\n\n  depth_xyz = Eigen::Vector3d(cv_depth_xyz[0], cv_depth_xyz[1], cv_depth_xyz[2]);\n\n  return true;\n}\n\n// Write the inliers in nvm format. The keypoints are shifted relative to the\n// optical center, as written by Theia if shift_keypoints is specified. This\n// handles properly the case when a (cid, fid) shows up in many tracks.\nvoid writeInliersToNvm(std::string                        const& nvm_file,\n                       bool                                      shift_keypoints, \n                       std::vector<rig::CameraParameters> const& cam_params,\n                       std::vector<rig::cameraImage>      const& cams,\n                       std::vector<Eigen::Affine3d>       const& world_to_cam,\n                       rig::KeypointVec                   const& keypoint_vec,\n                       rig::PidCidFid                     const& pid_to_cid_fid,\n                       PidCidFidMap                       const& pid_cid_fid_inlier,\n                       std::vector<Eigen::Vector3d>       const& xyz_vec) {\n  \n  // Sanity checks\n  if (world_to_cam.size() != cams.size())\n    LOG(FATAL) << \"Expecting as many world-to-camera transforms as cameras.\\n\";\n  if (world_to_cam.size() != keypoint_vec.size()) \n    LOG(FATAL) << \"Expecting as many sets of keypoints as cameras.\\n\";  \n  if (pid_to_cid_fid.size() != pid_cid_fid_inlier.size())\n    LOG(FATAL) << \"Expecting as many inlier flags as there are tracks.\\n\";\n  if (pid_to_cid_fid.size() != xyz_vec.size()) \n    LOG(FATAL) << \"Expecting as many tracks as there are triangulated points.\\n\";\n\n  // Initialize the keypoints in expected format. Copy the filenames\n  // and focal lengths.\n  rig::CidToKeypointMatVec cid_to_keypoint_map(keypoint_vec.size());\n  std::vector<std::string> cid_to_filename(keypoint_vec.size());\n  for (size_t cid = 0; cid < cams.size(); cid++) {\n    cid_to_keypoint_map[cid] = Eigen::MatrixXd(2, keypoint_vec[cid].size());\n    cid_to_filename[cid] = cams[cid].image_name;\n  }\n  \n  // Copy over only inliers, and tracks of length >= 2.\n  rig::PidCidFid nvm_pid_to_cid_fid;\n  std::vector<Eigen::Vector3d> nvm_pid_to_xyz;\n\n  for (size_t pid = 0; pid < pid_to_cid_fid.size(); pid++) {\n\n    std::map<int, int> nvm_cid_fid;\n    for (auto cid_fid = pid_to_cid_fid[pid].begin();\n         cid_fid != pid_to_cid_fid[pid].end(); cid_fid++) {\n      int cid = cid_fid->first;\n      int fid = cid_fid->second;\n\n      // Keep inliers only\n      if (!rig::getMapValue(pid_cid_fid_inlier, pid, cid, fid))\n        continue;\n\n      Eigen::Vector2d dist_ip(keypoint_vec[cid][fid].first,\n                              keypoint_vec[cid][fid].second);\n\n      // Offset relative to the optical center\n      if (shift_keypoints) \n        dist_ip -= cam_params[cams[cid].camera_type].GetOpticalOffset();\n\n      // Add this to the keypoint map for cid in the location at fid_count[cid]\n      cid_to_keypoint_map.at(cid).col(fid) = dist_ip;\n      nvm_cid_fid[cid] = fid;\n    }\n\n    // Keep only tracks with at least two points\n    if (nvm_cid_fid.size() > 1) {\n      nvm_pid_to_cid_fid.push_back(nvm_cid_fid);\n      nvm_pid_to_xyz.push_back(xyz_vec[pid]);\n    }\n  }\n  \n  asp::writeNvm(cid_to_keypoint_map, cid_to_filename, nvm_pid_to_cid_fid,\n                nvm_pid_to_xyz, world_to_cam, nvm_file);\n\n  // Write the optical center per image\n  if (shift_keypoints) {\n    // Remove .nvm and add new suffix\n    std::string offset_path = changeFileSuffix(nvm_file, \"_offsets.txt\");\n    std::cout << \"Writing optical center per image: \" << offset_path << std::endl;\n    std::ofstream offset_fh(offset_path.c_str());\n    offset_fh.precision(17);   // Save with the highest precision\n    for (size_t cid = 0; cid < cid_to_filename.size(); cid++) {\n      auto const& optical_center = cam_params[cams[cid].camera_type].GetOpticalOffset();\n      offset_fh << cid_to_filename[cid] << \" \"\n                << optical_center[0] << \" \" << optical_center[1] << \"\\n\";\n    }\n  }\n}\n\n// Calculate the rmse residual for each residual type.\nvoid calcResidualStats(std::vector<double> const& residuals,\n                       std::vector<std::string> const& residual_names,\n                       std::string const& tag) {\n  size_t num = residuals.size();\n\n  if (num != residual_names.size())\n    LOG(FATAL) << \"There must be as many residuals as residual names.\";\n\n  std::map<std::string, std::vector<double>> stats;\n  for (size_t it = 0; it < residuals.size(); it++)\n    stats[residual_names[it]] = std::vector<double>();  // initialize\n\n  for (size_t it = 0; it < residuals.size(); it++)\n    stats[residual_names[it]].push_back(std::abs(residuals[it]));\n\n  std::cout << \"The 25, 50, 75, and 100th percentile residual stats \" << tag << std::endl;\n  for (auto it = stats.begin(); it != stats.end(); it++) {\n    std::string const& name = it->first;\n    std::vector<double> vals = stats[name];  // make a copy\n    std::sort(vals.begin(), vals.end());\n\n    int len = vals.size();\n\n    int it1 = static_cast<int>(0.25 * len);\n    int it2 = static_cast<int>(0.50 * len);\n    int it3 = static_cast<int>(0.75 * len);\n    int it4 = static_cast<int>(len - 1);\n\n    if (len == 0)\n      std::cout << name << \": \" << \"none\";\n    else\n      std::cout << std::setprecision(5)\n                << name << \": \" << vals[it1] << ' ' << vals[it2] << ' '\n                << vals[it3] << ' ' << vals[it4];\n    std::cout << \" (\" << len << \" residuals)\" << std::endl;\n  }\n}\n  \n// Write the inlier residuals. Create one output file for each camera type.\n// The format of each file is:\n// dist_pixel_x, dist_pixel_y, norm(residual_x, residual_y)\nvoid writeResiduals(std::string                   const& out_dir,\n                    std::string                   const & prefix,\n                    std::vector<std::string>      const& cam_names,\n                    std::vector<rig::cameraImage> const& cams,\n                    rig::KeypointVec              const& keypoint_vec,\n                    rig::PidCidFid                const& pid_to_cid_fid,\n                    rig::PidCidFidMap             const& pid_cid_fid_inlier,\n                    rig::PidCidFidMap             const& pid_cid_fid_to_residual_index,\n                    std::vector<double>           const& residuals) {\n\n  if (pid_to_cid_fid.size() != pid_cid_fid_inlier.size())\n    LOG(FATAL) << \"Expecting as many inlier flags as there are tracks.\\n\";\n\n  typedef std::tuple<double, double, double> Triplet;\n  std::vector<std::vector<Triplet>> res_vec(cam_names.size());\n\n  // Create the pixel and residual triplet\n  for (size_t pid = 0; pid < pid_to_cid_fid.size(); pid++) {\n    \n    for (auto cid_fid = pid_to_cid_fid[pid].begin();\n         cid_fid != pid_to_cid_fid[pid].end(); cid_fid++) {\n      int cid = cid_fid->first;\n      int fid = cid_fid->second;\n      \n      // Keep inliers only\n      if (!rig::getMapValue(pid_cid_fid_inlier, pid, cid, fid))\n        continue;\n\n      // Pixel value\n      Eigen::Vector2d dist_ip(keypoint_vec[cid][fid].first, keypoint_vec[cid][fid].second);\n\n      // Find the pixel residuals\n      size_t residual_index = rig::getMapValue(pid_cid_fid_to_residual_index, pid, cid, fid);\n      if (residuals.size() <= residual_index + 1) LOG(FATAL) << \"Too few residuals.\\n\";\n      double res_x = residuals[residual_index + 0];\n      double res_y = residuals[residual_index + 1];\n      double res = Eigen::Vector2d(res_x, res_y).norm();\n      \n      int cam_type = cams[cid].camera_type;\n      res_vec[cam_type].push_back(Triplet(dist_ip.x(), dist_ip.y(), res));\n    }\n  }    \n\n  // Save these to disk\n  rig::createDir(out_dir);\n  for (size_t cam_type  = 0; cam_type < cam_names.size(); cam_type++) {\n    std::string out_file = out_dir + \"/\" + cam_names[cam_type] + \n      \"-\" + prefix + \"-residuals.txt\";\n    std::cout << \"Writing: \" << out_file << std::endl;\n    std::ofstream ofs (out_file.c_str());\n    ofs.precision(17);\n    ofs << \"# pixel_x pixel_y residual\\n\"; // stereo_gui will use this\n    for (size_t rit = 0; rit < res_vec[cam_type].size(); rit++) {\n      auto const& T = res_vec[cam_type][rit];\n      ofs << std::get<0>(T) << ' ' << std::get<1>(T) << ' ' << std::get<2>(T) << std::endl;\n    }\n  }\n  \n  return;\n}\n  \n}  // end namespace rig\n"
  },
  {
    "path": "src/asp/Rig/RigUtils.h",
    "content": "/* Copyright (c) 2021, United States Government, as represented by the\n * Administrator of the National Aeronautics and Space Administration.\n *\n * All rights reserved.\n *\n * The \"ISAAC - Integrated System for Autonomous and Adaptive Caretaking\n * platform\" software is licensed under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n#ifndef ASP_RIG_RIG_UTILS_H\n#define ASP_RIG_RIG_UTILS_H\n\n#include <asp/Rig/RigTypeDefs.h>\n\n#include <opencv2/calib3d/calib3d.hpp>\n#include <opencv2/imgproc.hpp>\n#include <opencv2/imgcodecs.hpp>\n#include <opencv2/highgui.hpp>\n#include <opencv2/core/utility.hpp>\n\n#include <Eigen/Core>\n#include <Eigen/Geometry>\n\n#include <boost/shared_ptr.hpp>\n\n#include <map>\n#include <set>\n#include <string>\n#include <vector>\n\n// Forward declarations\nnamespace rig {\n\nclass CameraParameters;\nclass cameraImage;\nclass ImageMessage;\nclass RigSet;\n\nconst std::string NO_DEPTH_FILE = \"no_depth_file\";\n\n// Read a 4x4 pose matrix of doubles from disk\nvoid readPoseMatrix(cv::Mat& pose, std::string const& filename);\n\n// Read an affine matrix with double values\nbool readAffine(Eigen::Affine3d& T, std::string const& filename);\n\n// Write a matrix with double values\nvoid writeMatrix(Eigen::MatrixXd const& M, std::string const& filename);\n\nvoid writeCloud(std::vector<float> const& points, size_t point_size, \n                std::string const& filename);\n\n// Return the type of an opencv matrix\nstd::string matType(cv::Mat const& mat);\n\n// A class to store timestamped poses, implementing O(log(n)) linear\n// interpolation at a desired timestamp. For fast access, keep the\n// poses in bins obtained by flooring the timestamp, which is measured\n// in seconds. It is assumed that there are a handful of poses\n// measured every second, so in each bin. When bins get large, or too\n// many bins are empty, the efficiency of this algorithm goes down.\nclass StampedPoseStorage {\n public:\n  void addPose(Eigen::Affine3d const& pose, double timestamp);\n\n  // Find the interpolated pose by looking up the two poses with\n  // closest timestamps that are below and above input_timestamp. If\n  // the gap between those timestamps is more than max_gap, return\n  // failure, as then likely the interpolation result is not accurate.\n  bool interpPose(double input_timestamp, double max_gap, Eigen::Affine3d& out_pose) const;\n\n  void clear();\n\n  bool empty() const;\n\n private:\n  std::map<int, std::map<double, Eigen::Affine3d>> m_poses;\n};\n\n// A little holding structure for nav, sci, and haz poses\nstruct CameraPoses {\n  std::map<double, double> haz_depth_to_image_timestamps;\n  std::map<std::string, std::map<double, Eigen::Affine3d>> world_to_cam_poses;\n};\n\n// Some small utilities for writing a file having poses for nav, sci, and haz cam,\n// and also the depth timestamp corresponding to given haz intensity timestamp\nvoid writeCameraPoses(std::string const& filename,\n                      std::map<double, double> const& haz_depth_to_image_timestamps,\n                      std::map<std::string, std::map<double, Eigen::Affine3d>> const&\n                      world_to_cam_poses);\n\nvoid readCameraPoses(std::string const& filename,\n                     std::map<double, double>& haz_depth_to_image_timestamps,\n                     std::map<std::string, std::map<double, Eigen::Affine3d>>&\n                     world_to_cam_poses);\n\n// Scale an image to correct for lightning variations by taking into\n// account that JPEG images have gamma correction applied to them.\n// See https://en.wikipedia.org/wiki/Gamma_correction.\nvoid scaleImage(double max_iso_times_exposure, double iso, double exposure,\n                cv::Mat const& input_image,\n                cv::Mat& output_image);\n\n// Given two bounds, pick two timestamps within these bounds, the one\n// closest to the left bound and the one to the right bound. Take into\n// account that the timestamps may need to have an offset added to\n// them. Assume that the input timestamps are sorted in increasing order.\n// TODO(oalexan1): May have to add a constraint to only pick\n// a timestamp if not further from the bound than a given value.\nvoid pickTimestampsInBounds(std::vector<double> const& timestamps, double left_bound,\n                            double right_bound, double offset,\n                            std::vector<double>& out_timestamps);\n\n// Must always have NUM_EXIF the last.\nenum ExifData { TIMESTAMP = 0, EXPOSURE_TIME, ISO, APERTURE, FOCAL_LENGTH, NUM_EXIF };\n\n// Find the depth measurement. Use nearest neighbor interpolation\n// to look into the depth cloud.\nbool depthValue(// Inputs\n                cv::Mat const& depth_cloud, Eigen::Vector2d const& dist_ip,\n                // Output\n                Eigen::Vector3d& depth_xyz);\n  \n// Forward declaration\nstruct cameraImage;\n\n// Read the images, depth clouds, and their metadata\n// Save the properties of images. Use space as separator.\nvoid saveCameraPoses(std::string const& out_dir, std::vector<rig::cameraImage> const& cams,\n                    std::vector<Eigen::Affine3d> const& world_to_cam);\n\n// Save the depth clouds and optimized transforms needed to create a mesh with voxblox\n// (if depth clouds exist).\nvoid exportToVoxblox(std::vector<std::string> const& cam_names,\n                     std::vector<rig::cameraImage> const& cam_images,\n                     std::vector<Eigen::Affine3d> const& depth_to_image,\n                     std::vector<Eigen::Affine3d> const& world_to_cam,\n                     std::string const& out_dir);\n\nvoid saveTransformedDepthClouds(std::vector<std::string> const& cam_names,\n                                std::vector<rig::cameraImage> const& cam_images,\n                                std::vector<Eigen::Affine3d> const& depth_to_image,\n                                std::vector<Eigen::Affine3d> const& world_to_cam,\n                                std::string const& out_dir);\n  \n// Write the inliers in nvm format. The keypoints are shifted relative to the\n// optical center, as written by Theia if shift_keypoints is specified. This\n// handles properly the case when a (cid, fid) shows up in many tracks.\nvoid writeInliersToNvm(std::string                        const& nvm_file,\n                       bool                                      shift_keypoints, \n                       std::vector<rig::CameraParameters> const& cam_params,\n                       std::vector<rig::cameraImage>      const& cams,\n                       std::vector<Eigen::Affine3d>       const& world_to_cam,\n                       rig::KeypointVec                   const& keypoint_vec,\n                       rig::PidCidFid                     const& pid_to_cid_fid,\n                       PidCidFidMap                       const& pid_cid_fid_inlier,\n                       std::vector<Eigen::Vector3d>       const& xyz_vec);\n\n// Calculate the rmse residual for each residual type.\nvoid calcResidualStats(std::vector<double> const& residuals,\n                       std::vector<std::string> const& residual_names,\n                       std::string const& tag);\n\n// Write the inlier residuals. Create one output file for each camera type.\n// The format of each file is:\n// dist_pixel_x, dist_pixel_y, norm(residual_x, residual_y)\nvoid writeResiduals(std::string                   const& out_dir,\n                    std::string                   const & prefix,\n                    std::vector<std::string>      const& cam_names,\n                    std::vector<rig::cameraImage> const& cams,\n                    rig::KeypointVec              const& keypoint_vec,\n                    rig::PidCidFid                const& pid_to_cid_fid,\n                    rig::PidCidFidMap             const& pid_cid_fid_inlier,\n                    rig::PidCidFidMap             const& pid_cid_fid_to_residual_index,\n                    std::vector<double>           const& residuals);\n\n}  // namespace rig\n#endif  // ASP_RIG_RIG_UTILS_H\n"
  },
  {
    "path": "src/asp/Rig/SystemUtils.cc",
    "content": "/* Copyright (c) 2021, United States Government, as represented by the\n * Administrator of the National Aeronautics and Space Administration.\n *\n * All rights reserved.\n *\n * The \"ISAAC - Integrated System for Autonomous and Adaptive Caretaking\n * platform\" software is licensed under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n#include <asp/Rig/SystemUtils.h>\n\n#include <boost/filesystem.hpp>\n#include <glog/logging.h>\n\nnamespace rig {\n\n// Create a directory recursively, unless it exists already. This works like mkdir -p.\nvoid createDir(std::string const& dir) {\n  if (dir == \"\")\n    return;  // This can be useful if dir was created with parent_path().\n\n  if (!boost::filesystem::exists(dir)) {\n    if (!boost::filesystem::create_directories(dir) || !boost::filesystem::is_directory(dir))\n      LOG(FATAL) << \"Failed to create directory: \" << dir << \"\\n\";\n  }\n}\n\n}  // end namespace rig\n"
  },
  {
    "path": "src/asp/Rig/SystemUtils.h",
    "content": "/* Copyright (c) 2021, United States Government, as represented by the\n * Administrator of the National Aeronautics and Space Administration.\n *\n * All rights reserved.\n *\n * The \"ISAAC - Integrated System for Autonomous and Adaptive Caretaking\n * platform\" software is licensed under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n#ifndef ASP_RIG_SYSTEM_UTILS_H\n#define ASP_RIG_SYSTEM_UTILS_H\n\n#include <string>\n\nnamespace rig {\n  \n// Create a directory recursively, unless it exists already. This works like mkdir -p.\nvoid createDir(std::string const& dir);\n\n}  // namespace rig\n\n#endif  // ASP_RIG_SYSTEM_UTILS_H\n"
  },
  {
    "path": "src/asp/Rig/TextureProcessing.cc",
    "content": "/* Copyright (c) 2021-2026, United States Government, as represented by the\n * Administrator of the National Aeronautics and Space Administration.\n *\n * All rights reserved.\n *\n * The \"ISAAC - Integrated System for Autonomous and Adaptive Caretaking\n * platform\" software is licensed under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n#include <asp/Rig/TextureProcessing.h>\n#include <asp/Rig/RigCameraUtils.h>\n#include <asp/Rig/SystemUtils.h>\n#include <asp/Rig/CameraImage.h>\n#include <asp/Rig/BasicAlgs.h>\n\n// OpenCV includes\n#include <opencv2/core/core.hpp>\n#include <opencv2/highgui/highgui.hpp>\n#include <opencv2/imgproc.hpp>\n\n// Eigen includes\n#include <Eigen/Geometry>\n#include <Eigen/Core>\n\n#include <glog/logging.h>\n\n// Boost includes\n#include <boost/filesystem.hpp>\n\n// texrecon includes\n#include <mve/image_io.h>\n#include <mve/image_tools.h>\n#include <tex/defines.h>\n#include <tex/obj_model.h>\n#include <util/file_system.h>\n\n// System includes\n#include <string>\n#include <map>\n#include <iostream>\n#include <fstream>\n#include <utility>\n#include <set>\n\n// TODO(oalexan1): Consider applying TILE_PADDING not to at the atlas\n// forming stage, when the patch is padded, but earlier, right when\n// the patch is created from a mesh triangle. That will ensure that\n// while the same overall buffer is used, the padding region will have\n// actual image samples, which may improve the rendering in meshlab\n// when one zooms out, where now for some reason the triangle edges\n// show up.  Can test the output with the test_texture_gen tool.\n\nnamespace rig {\n\nvoid loadMeshBuildTree(std::string const& mesh_file, mve::TriangleMesh::Ptr& mesh,\n                       std::shared_ptr<mve::MeshInfo>& mesh_info,\n                       std::shared_ptr<tex::Graph>& graph,\n                       std::shared_ptr<BVHTree>& bvh_tree) {\n  std::cout << \"Loading mesh: \" << mesh_file << std::endl;\n  mesh = mve::geom::load_ply_mesh(mesh_file);\n\n  mesh_info = std::shared_ptr<mve::MeshInfo>(new mve::MeshInfo(mesh));\n  tex::prepare_mesh(mesh_info.get(), mesh);\n\n  std::size_t const num_faces = mesh->get_faces().size() / 3;\n  if (num_faces > std::numeric_limits<std::uint32_t>::max())\n    throw std::runtime_error(\"Exeeded maximal number of faces\");\n\n  // TODO(oalexan1): Is this necessary?\n  graph = std::shared_ptr<tex::Graph>(new tex::Graph(num_faces));\n  tex::build_adjacency_graph(mesh, *mesh_info.get(), graph.get());\n\n  util::WallTimer timer;\n  std::vector<unsigned int> const& faces = mesh->get_faces();\n  std::vector<math::Vec3f> const& vertices = mesh->get_vertices();\n  std::cout << \"Number of faces: \" << faces.size() / 3 << \" faces.\\n\";\n  bvh_tree = std::shared_ptr<BVHTree>(new BVHTree(faces, vertices));\n  std::cout << \"Building the tree took: \" << timer.get_elapsed() / 1000.0 << \" seconds\\n\";\n}\n\nEigen::Vector3d vec3f_to_eigen(math::Vec3f const& v) {\n  Eigen::Vector3d V;\n  for (size_t it = 0; it < 3; it++) V[it] = v[it];\n  return V;\n}\n\nmath::Vec3f eigen_to_vec3f(Eigen::Vector3d const& V) {\n  math::Vec3f v;\n  for (size_t it = 0; it < 3; it++) v[it] = V[it];\n  return v;\n}\n\nvoid formMtl(std::string const& out_prefix, std::string& mtl_str) {\n  std::ostringstream ofs;\n  ofs << \"newmtl material0000\\n\";\n  ofs << \"Ka 0.200000 0.200000 0.200000\\n\";\n  ofs << \"Kd 1.000000 1.000000 1.000000\\n\";\n  ofs << \"Ks 1.000000 1.000000 1.000000\\n\";\n  ofs << \"Tr 0.000000\\n\";\n  ofs << \"illum 2\\n\";\n  ofs << \"Ns 0.000000\\n\";\n  ofs << \"map_Kd \" << out_prefix << \".png\\n\";\n  mtl_str = ofs.str();\n}\n\nvoid formObjCustomUV(mve::TriangleMesh::ConstPtr mesh, \n                     std::vector<Eigen::Vector3i> const& face_vec,\n                     std::map<int, Eigen::Vector2d> const& uv_map, \n                     std::string const& out_prefix,\n                     std::string& obj_str) {\n  // Get handles to the vertices and vertex normals\n  std::vector<math::Vec3f> const& vertices = mesh->get_vertices();\n  std::vector<math::Vec3f> const& mesh_normals = mesh->get_vertex_normals();\n  if (vertices.size() != mesh_normals.size())\n    LOG(FATAL) << \"A mesh must have as many vertices as vertex normals.\";\n\n  // The uv_map assigns to each of the mesh vertices that is visible\n  // in the texture its (u, v) pair. Find the map from each vertex\n  // index to the index in the list of (u, v) pairs.\n  std::map<int, int> vertex_to_uv;\n  int64_t count = 0;\n  for (auto it = uv_map.begin(); it != uv_map.end(); it++) {\n    vertex_to_uv[it->first] = count;\n    count++;\n  }\n\n  std::ostringstream out;\n\n  out << \"mtllib \" << out_prefix << \".mtl\\n\";\n\n  out << std::setprecision(16);\n  for (std::size_t i = 0; i < vertices.size(); i++) {\n    out << \"v \" << vertices[i][0] << \" \" << vertices[i][1] << \" \" << vertices[i][2] << \"\\n\";\n  }\n\n  for (auto it = uv_map.begin(); it != uv_map.end(); it++)\n    out << \"vt \" << (it->second)[0] << \" \" << (it->second)[1] << \"\\n\";\n\n  for (std::size_t i = 0; i < mesh_normals.size(); i++)\n    out << \"vn \" << mesh_normals[i][0] << \" \" << mesh_normals[i][1] << \" \"\n        << mesh_normals[i][2] << \"\\n\";\n\n  int64_t OBJ_INDEX_OFFSET = 1;  // have indices start from 1\n  for (std::size_t j = 0; j < face_vec.size(); j++) {\n    out << \"f\";\n    for (std::size_t k = 0; k < 3; ++k) {\n      out << \" \" << face_vec[j][k] + OBJ_INDEX_OFFSET << \"/\"\n          << vertex_to_uv[face_vec[j][k]] + OBJ_INDEX_OFFSET << \"/\"\n          << face_vec[j][k] + OBJ_INDEX_OFFSET;\n    }\n    out << \"\\n\";\n  }\n  obj_str = out.str();\n}\n\n// Project texture and find the UV coordinates\nvoid projectTexture(mve::TriangleMesh::ConstPtr mesh, std::shared_ptr<BVHTree> bvh_tree,\n                    cv::Mat const& image,\n                    Eigen::Affine3d const& world_to_cam,\n                    rig::CameraParameters const& cam_params,\n                    // outputs\n                    std::vector<double>& smallest_cost_per_face,\n                    std::vector<Eigen::Vector3i>& face_vec,\n                    std::map<int, Eigen::Vector2d>& uv_map) {\n\n  // Wipe the outputs\n  face_vec.clear();\n  uv_map.clear();\n\n  // Compute camera center from world_to_cam transform\n  Eigen::Vector3d cam_ctr = world_to_cam.inverse().translation();\n\n  // Here need to take into account that for real (not simulated)\n  // images the camera may have been calibrated at 1/4 the original\n  // image resolution. We will use the calibrated dimensions when\n  // normalizing u and v, because when projecting 3D points in the\n  // camera we will the calibrated camera model.\n  int64_t raw_image_cols = image.cols;\n  int64_t raw_image_rows = image.rows;\n  int64_t calib_image_cols = cam_params.GetDistortedSize()[0];\n  int64_t calib_image_rows = cam_params.GetDistortedSize()[1];\n\n  int64_t factor = raw_image_cols / calib_image_cols;\n\n  if ((raw_image_cols != calib_image_cols * factor) ||\n      (raw_image_rows != calib_image_rows * factor)) {\n    LOG(FATAL) << \"Published image width and height are: \"\n               << raw_image_cols << ' ' << raw_image_rows << \"\\n\"\n               << \"Calibrated image width and height are: \"\n               << calib_image_cols << ' ' << calib_image_rows << \"\\n\"\n               << \"These must be equal up to an integer factor.\\n\";\n  }\n\n  std::vector<math::Vec3f> const& vertices = mesh->get_vertices();\n  std::vector<math::Vec3f> const& mesh_normals = mesh->get_vertex_normals();\n  if (vertices.size() != mesh_normals.size())\n    LOG(FATAL) << \"A mesh must have as many vertices as vertex normals.\";\n\n  std::vector<unsigned int> const& faces = mesh->get_faces();\n  std::vector<math::Vec3f> const& face_normals = mesh->get_face_normals();\n\n  if (smallest_cost_per_face.size() != faces.size())\n    LOG(FATAL) << \"There must be one cost value per face.\";\n\n#pragma omp parallel for\n  for (std::size_t face_id = 0; face_id < faces.size() / 3; face_id++) {\n    math::Vec3f const& v1 = vertices[faces[3 * face_id + 0]];\n    math::Vec3f const& v2 = vertices[faces[3 * face_id + 1]];\n    math::Vec3f const& v3 = vertices[faces[3 * face_id + 2]];\n    math::Vec3f const& face_normal = face_normals[face_id];\n    math::Vec3f const face_center = (v1 + v2 + v3) / 3.0f;\n\n    // Do some geometric checks and compute the cost for this face and camera\n\n    Eigen::Vector3d cam_to_face_vec = (vec3f_to_eigen(face_center) - cam_ctr).normalized();\n    Eigen::Vector3d face_to_cam_vec = -cam_to_face_vec;\n    double face_normal_to_cam_dot_prod = face_to_cam_vec.dot(vec3f_to_eigen(face_normal));\n\n    if (face_normal_to_cam_dot_prod <= 0.0) continue;  // The face points away from the camera\n\n    // Angle between face normal and ray from face center to camera center\n    // is bigger than 75 degrees.\n    // TODO(oalexan1): Make this a parameter.\n    // TODO(oalexan1): Filter by distance from each of\n    // v1, v2, v3 to view_pos.\n    double face_normal_to_cam_angle = std::acos(face_normal_to_cam_dot_prod);  // radians\n    if (face_normal_to_cam_angle > 75.0 * M_PI / 180.0) continue;\n\n    // The further a camera is and the bigger then angle between the\n    // camera direction and the face normal, the less we want this\n    // camera's texture for this triangle.\n    double cost_val = face_normal_to_cam_angle + (vec3f_to_eigen(face_center) - cam_ctr).norm();\n    if (cost_val >= smallest_cost_per_face[face_id]) {\n      continue;\n    }\n\n    // A mesh triangle is visible if rays from its vertices do not\n    // intersect the mesh somewhere else before hitting the camera,\n    // and hit the camera inside the image bounds.\n    bool visible = true;\n    math::Vec3f const* samples[] = {&v1, &v2, &v3};\n\n    std::vector<Eigen::Vector2d> UV;\n    for (std::size_t vertex_it = 0; vertex_it < 3; vertex_it++) {\n      BVHTree::Ray ray;\n      ray.origin = *samples[vertex_it];\n      ray.dir = eigen_to_vec3f(cam_ctr) - ray.origin;\n      ray.tmax = ray.dir.norm();\n      ray.tmin = ray.tmax * 0.0001f;\n      ray.dir.normalize();\n\n      BVHTree::Hit hit;\n      if (bvh_tree->intersect(ray, &hit)) {\n        visible = false;\n        break;\n      }\n\n      // Triangle vertex in world coordinates\n      Eigen::Vector3d world_pt = vec3f_to_eigen(*samples[vertex_it]);\n\n      // Transform the vertex to camera coordinates\n      Eigen::Vector3d cam_pt = world_to_cam * world_pt;\n\n      // Skip points that project behind the camera\n      if (cam_pt.z() <= 0) {\n        visible = false;\n        break;\n      }\n\n      // Get the undistorted pixel\n      Eigen::Vector2d undist_centered_pix =\n        cam_params.GetFocalVector().cwiseProduct(cam_pt.hnormalized());\n      if (std::abs(undist_centered_pix[0]) > cam_params.GetUndistortedHalfSize()[0] ||\n          std::abs(undist_centered_pix[1]) > cam_params.GetUndistortedHalfSize()[1]) {\n        // If we are out of acceptable undistorted region, there's some uncertainty whether\n        // the distortion computation in the next operation will work, so quit early.\n        visible = false;\n        break;\n      }\n\n      // Get the distorted pixel value\n      Eigen::Vector2d dist_pix;\n      cam_params.Convert<rig::UNDISTORTED_C, rig::DISTORTED>\n        (undist_centered_pix, &dist_pix);\n\n      // Skip pixels that don't project in the window of dimensions\n      // dist_crop_size centered at the image center. Note that\n      // dist_crop_size is read from the camera configuration, and is\n      // normally either the full image or something smaller if the\n      // user restricts the domain of validity of the distortion\n      // model.\n      Eigen::Vector2i dist_size      = cam_params.GetDistortedSize();\n      Eigen::Vector2i dist_crop_size = cam_params.GetDistortedCropSize();\n      if (std::abs(dist_pix[0] - dist_size[0] / 2.0) > dist_crop_size[0] / 2.0  ||\n          std::abs(dist_pix[1] - dist_size[1] / 2.0) > dist_crop_size[1] / 2.0) {\n        visible = false;\n        break;\n      }\n      \n      // Find the u, v coordinates of each vertex\n      double u = dist_pix.x() / calib_image_cols;\n      // TODO(oalexan1): Maybe use:\n      // v = (calib_image_rows - 1 - dist_pix.y())/image_rows ?\n      double v = 1.0 - dist_pix.y() / calib_image_rows;\n\n      UV.push_back(Eigen::Vector2d(u, v));\n    }\n\n    if (!visible) continue;\n\n#pragma omp critical\n    {\n      // Here we integrate the results from each loop iteration so have\n      // to use a lock (critical section).\n\n      // Sanity check, to ensure nothing got mixed up with the multiple\n      // threads\n      if (cost_val >= smallest_cost_per_face[face_id])\n        LOG(FATAL) << \"Book-keeping error in estimating cost per face.\";\n\n      smallest_cost_per_face[face_id] = cost_val;\n\n      for (std::size_t vertex_it = 0; vertex_it < 3; vertex_it++)\n        uv_map[faces[3 * face_id + vertex_it]] = UV[vertex_it];\n\n      face_vec.push_back(Eigen::Vector3i(faces[3 * face_id + 0], faces[3 * face_id + 1], faces[3 * face_id + 2]));\n    }\n  }  // End loop over mesh faces\n}\n\n// Intersect ray with a mesh. Return true on success.\nbool ray_mesh_intersect(Eigen::Vector2d const& dist_pix,\n                        rig::CameraParameters const& cam_params,\n                        Eigen::Affine3d const& world_to_cam,\n                        mve::TriangleMesh::Ptr const& mesh,\n                        std::shared_ptr<BVHTree> const& bvh_tree,\n                        double min_ray_dist, double max_ray_dist,\n                        // Output\n                        Eigen::Vector3d& intersection) {\n\n  // Initialize the output\n  intersection = Eigen::Vector3d(0.0, 0.0, 0.0);\n\n  // Calculate camera center and ray direction\n  Eigen::Vector3d cam_ctr, world_ray;\n  rig::calcCamCtrDir(cam_params, dist_pix, world_to_cam, cam_ctr, world_ray);\n\n  // Set up the ray structure for the mesh\n  BVHTree::Ray bvh_ray;\n  bvh_ray.origin = rig::eigen_to_vec3f(cam_ctr);\n  bvh_ray.dir = rig::eigen_to_vec3f(world_ray);\n  bvh_ray.dir.normalize();\n  bvh_ray.tmin = min_ray_dist;\n  bvh_ray.tmax = max_ray_dist;\n\n  // Intersect the ray with the mesh\n  BVHTree::Hit hit;\n  if (bvh_tree->intersect(bvh_ray, &hit)) {\n    double cam_to_mesh_dist = hit.t;\n    intersection = cam_ctr + cam_to_mesh_dist * world_ray;\n    return true;\n  }\n\n  return false;\n}\n\n// Project and save a mesh as an obj file to out_prefix.obj,\n// out_prefix.mtl, out_prefix.png.\nvoid meshProject(mve::TriangleMesh::Ptr const& mesh, std::shared_ptr<BVHTree> const& bvh_tree,\n                 cv::Mat const& image, Eigen::Affine3d const& world_to_cam,\n                 rig::CameraParameters const& cam_params,\n                 std::string const& out_prefix) {\n  // Create the output directory, if needed\n  std::string out_dir = boost::filesystem::path(out_prefix).parent_path().string();\n  if (out_dir != \"\") rig::createDir(out_dir);\n\n  std::vector<Eigen::Vector3i> face_vec;\n  std::map<int, Eigen::Vector2d> uv_map;\n\n  std::vector<unsigned int> const& faces = mesh->get_faces();\n  int64_t num_faces = faces.size();\n  std::vector<double> smallest_cost_per_face(num_faces, 1.0e+100);\n\n  // Find the UV coordinates and the faces having them\n  rig::projectTexture(mesh, bvh_tree, image, world_to_cam, cam_params,\n                      smallest_cost_per_face, face_vec, uv_map);\n\n  // Strip the directory name, according to .obj file conventions.\n  std::string suffix = boost::filesystem::path(out_prefix).filename().string();\n\n  std::string obj_str;\n  rig::formObjCustomUV(mesh, face_vec, uv_map, suffix, obj_str);\n\n  std::string mtl_str;\n  rig::formMtl(suffix, mtl_str);\n\n  std::string obj_file = out_prefix + \".obj\";\n  std::cout << \"Writing: \" << obj_file << std::endl;\n  std::ofstream obj_handle(obj_file);\n  obj_handle << obj_str;\n  obj_handle.close();\n\n  std::string mtl_file = out_prefix + \".mtl\";\n  std::cout << \"Writing: \" << mtl_file << std::endl;\n  std::ofstream mtl_handle(mtl_file);\n  mtl_handle << mtl_str;\n  mtl_handle.close();\n\n  std::string texture_file = out_prefix + \".png\";\n  std::cout << \"Writing: \" << texture_file << std::endl;\n  cv::imwrite(texture_file, image);\n}\n\n// Project given images with optimized cameras onto mesh. It is\n// assumed that the most up-to-date cameras were copied/interpolated\n// form the optimizer structures into the world_to_cam vector.\nvoid meshProjectCameras(std::vector<std::string> const& cam_names,\n                        std::vector<rig::CameraParameters> const& cam_params,\n                        std::vector<rig::cameraImage> const& cam_images,\n                        std::vector<Eigen::Affine3d> const& world_to_cam,\n                        mve::TriangleMesh::Ptr const& mesh,\n                        std::shared_ptr<BVHTree> const& bvh_tree,\n                        std::string const& out_dir) {\n  if (cam_names.size() != cam_params.size())\n    LOG(FATAL) << \"There must be as many camera names as sets of camera parameters.\\n\";\n  if (cam_images.size() != world_to_cam.size())\n    LOG(FATAL) << \"There must be as many camera images as camera poses.\\n\";\n  if (out_dir.empty())\n    LOG(FATAL) << \"The output directory is empty.\\n\";\n  \n  char filename_buffer[1000];\n\n  for (size_t cid = 0; cid < cam_images.size(); cid++) {\n    double timestamp = cam_images[cid].timestamp;\n    int cam_type = cam_images[cid].camera_type;\n\n    // Must use the 10.7f format for the timestamp as everywhere else in the code\n    snprintf(filename_buffer, sizeof(filename_buffer), \"%s/%10.7f_%s\",\n             out_dir.c_str(), timestamp, cam_names[cam_type].c_str());\n    std::string out_prefix = filename_buffer;  // convert to string\n\n    std::cout << \"Creating texture for: \" << out_prefix << std::endl;\n    meshProject(mesh, bvh_tree, cam_images[cid].image, world_to_cam[cid], \n                cam_params[cam_type], out_prefix);\n  }\n}\n\n// Intersect them with a mesh instead, and average those intersections.\n// This will be used to for a mesh-to-triangulated-points constraint.\nvoid meshTriangulations(std::vector<rig::CameraParameters> const& cam_params,\n                        std::vector<rig::cameraImage> const& cams,\n                        std::vector<Eigen::Affine3d> const& world_to_cam,\n                        rig::PidCidFid const& pid_to_cid_fid,\n                        PidCidFidMap const& pid_cid_fid_inlier,\n                        rig::KeypointVec const& keypoint_vec,\n                        double min_ray_dist, double max_ray_dist,\n                        mve::TriangleMesh::Ptr const& mesh, \n                        std::shared_ptr<BVHTree> const& bvh_tree,\n                        // Outputs\n                        rig::PidCidFidToMeshXyz & pid_cid_fid_mesh_xyz,\n                        std::vector<Eigen::Vector3d> & pid_mesh_xyz) {\n  \n  // Initialize the outputs\n  pid_cid_fid_mesh_xyz.resize(pid_to_cid_fid.size());\n  pid_mesh_xyz.resize(pid_to_cid_fid.size());\n\n  for (size_t pid = 0; pid < pid_to_cid_fid.size(); pid++) {\n    Eigen::Vector3d avg_mesh_xyz(0, 0, 0);\n    int num_intersections = 0;\n\n    for (auto cid_fid = pid_to_cid_fid[pid].begin(); cid_fid != pid_to_cid_fid[pid].end();\n         cid_fid++) {\n      int cid = cid_fid->first;\n      int fid = cid_fid->second;\n\n      // Initialize this\n      pid_cid_fid_mesh_xyz[pid][cid][fid] = rig::badMeshXyz();\n\n      // Deal with inliers only\n      if (!rig::getMapValue(pid_cid_fid_inlier, pid, cid, fid))\n        continue;\n\n      // Intersect the ray with the mesh\n      Eigen::Vector2d dist_ip(keypoint_vec[cid][fid].first, keypoint_vec[cid][fid].second);\n      Eigen::Vector3d mesh_xyz(0.0, 0.0, 0.0);\n      bool have_mesh_intersection\n        = rig::ray_mesh_intersect(dist_ip, cam_params[cams[cid].camera_type],\n                                  world_to_cam[cid], mesh, bvh_tree,\n                                  min_ray_dist, max_ray_dist,\n                                  // Output\n                                  mesh_xyz);\n\n      if (have_mesh_intersection) {\n        pid_cid_fid_mesh_xyz[pid][cid][fid] = mesh_xyz;\n        avg_mesh_xyz += mesh_xyz;\n        num_intersections += 1;\n      }\n    }\n\n    // Average the intersections of all rays with the mesh\n    if (num_intersections >= 1)\n      avg_mesh_xyz /= num_intersections;\n    else\n      avg_mesh_xyz = rig::badMeshXyz();\n\n    pid_mesh_xyz[pid] = avg_mesh_xyz;\n  }\n\n  return;\n}\n\n}  // namespace rig\n"
  },
  {
    "path": "src/asp/Rig/TextureProcessing.h",
    "content": "/* Copyright (c) 2021-2026, United States Government, as represented by the\n * Administrator of the National Aeronautics and Space Administration.\n *\n * All rights reserved.\n *\n * The \"ISAAC - Integrated System for Autonomous and Adaptive Caretaking\n * platform\" software is licensed under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n#ifndef ASP_RIG_TEXTURE_PROCESSING_H\n#define ASP_RIG_TEXTURE_PROCESSING_H\n\n#include <asp/Rig/RigCameraParams.h>\n#include <asp/Rig/RigUtils.h>\n#include <asp/Rig/CameraImage.h>\n\n#include <Eigen/Geometry>\n#include <Eigen/Core>\n\n// texrecon includes\n#include <mve/mesh_io_ply.h>\n#include <mve/mesh_info.h>\n#include <mve/mesh.h>\n#include <mve/image.h>\n#include <acc/bvh_tree.h>\n#include <tex/timer.h>\n#include <tex/texturing.h>\n#include <tex/tri.h>\n#include <tex/texture_patch.h>\n#include <tex/rectangular_bin.h>\n#include <tex/material_lib.h>\n#include <util/exception.h>\n#include <math/vector.h>\n\n// OpenCV\n#include <opencv2/highgui/highgui.hpp>\n\n#include <vector>\n#include <map>\n#include <limits>\n#include <string>\n\ntypedef acc::BVHTree<unsigned int, math::Vec3f> BVHTree;\n\nnamespace rig {\n\n// Small utilities\ninline Eigen::Vector3d badMeshXyz() {\n  return Eigen::Vector3d(1.0e+100, 1.0e+100, 1.0e+100);\n}\nEigen::Vector3d vec3f_to_eigen(math::Vec3f const& v);\nmath::Vec3f eigen_to_vec3f(Eigen::Vector3d const& V);\n\n// Load and prepare a mesh\nvoid loadMeshBuildTree(std::string const& mesh_file, \n                       mve::TriangleMesh::Ptr& mesh,\n                       std::shared_ptr<mve::MeshInfo>& mesh_info,\n                       std::shared_ptr<tex::Graph>& graph,\n                       std::shared_ptr<BVHTree>& bvh_tree);\n\n// Put an textured mesh obj file in a string\nvoid formObjCustomUV(mve::TriangleMesh::ConstPtr mesh, \n                     std::vector<Eigen::Vector3i> const& face_vec,\n                     std::map<int, Eigen::Vector2d> const& uv_map,\n                     std::string const& out_prefix, \n                     std::string& obj_str);\n\nvoid formMtl(std::string const& out_prefix, std::string& mtl_str);\n\n// Find where ray emanating from a distorted pixel intersects a mesh. Return true\n// on success.\nbool ray_mesh_intersect(Eigen::Vector2d const& dist_pix,\n                        rig::CameraParameters const& cam_params,\n                        Eigen::Affine3d const& world_to_cam,\n                        mve::TriangleMesh::Ptr const& mesh,\n                        std::shared_ptr<BVHTree> const& bvh_tree,\n                        double min_ray_dist, double max_ray_dist,\n                        // Output\n                        Eigen::Vector3d& intersection);\n\nvoid meshProject(mve::TriangleMesh::Ptr const& mesh, std::shared_ptr<BVHTree> const& bvh_tree,\n                 cv::Mat const& image,\n                 Eigen::Affine3d const& world_to_cam, rig::CameraParameters const& cam_params,\n                 std::string const& out_prefix);\n\nvoid meshProjectCameras(std::vector<std::string> const& cam_names,\n                        std::vector<rig::CameraParameters> const& cam_params,\n                        std::vector<rig::cameraImage> const& cam_images,\n                        std::vector<Eigen::Affine3d> const& world_to_cam,\n                        mve::TriangleMesh::Ptr const& mesh,\n                        std::shared_ptr<BVHTree> const& bvh_tree,\n                        std::string const& out_dir);\n\nvoid meshTriangulations(// Inputs\n  std::vector<rig::CameraParameters> const& cam_params,\n  std::vector<rig::cameraImage>      const& cams,\n  std::vector<Eigen::Affine3d>       const& world_to_cam,\n  rig::PidCidFid                     const& pid_to_cid_fid,\n  PidCidFidMap                       const& pid_cid_fid_inlier,\n  rig::KeypointVec                   const& keypoint_vec,\n  double min_ray_dist, double max_ray_dist,\n  mve::TriangleMesh::Ptr             const& mesh, std::shared_ptr<BVHTree> const& bvh_tree,\n  // Outputs\n  rig::PidCidFidToMeshXyz                 & pid_cid_fid_mesh_xyz,\n  std::vector<Eigen::Vector3d>            & pid_mesh_xyz);\n  \n}  // namespace rig\n\n#endif  // ASP_RIG_TEXTURE_PROCESSING_H\n"
  },
  {
    "path": "src/asp/Rig/Tracks.cc",
    "content": "/* Copyright (c) 2017, United States Government, as represented by the\n * Administrator of the National Aeronautics and Space Administration.\n *\n * All rights reserved.\n *\n * The Astrobee platform is licensed under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n// TODO(oalexan1): Move here track logic from interest_point.cc.\n\n#include <asp/Rig/CameraImage.h>\n#include <asp/Rig/Tracks.h>\n#include <asp/Rig/RigTypeDefs.h>\n\n// Get rid of warning beyond our control\n#pragma GCC diagnostic ignored \"-Wdeprecated-declarations\"\n#pragma GCC diagnostic ignored \"-Wunused-function\"\n#pragma GCC diagnostic push\n#include <OpenMVG/numeric.h>\n#include <OpenMVG/projection.hpp>\n#include <OpenMVG/triangulation_nview.hpp>\n#include <asp/OpenMVG/tracks.hpp>\n#pragma GCC diagnostic pop\n\n#include <glog/logging.h>\n\n#include <set>\n#include <vector>\n#include <map>\n\nnamespace rig {\n  \n// Given tracks in a map C that has images from one map A followed by\n// images from second map named B, split the tracks that have at least\n// two features in each map into tracks for the two maps. For the\n// second one, need to shift the cid to start from 0 rather than from\n// end of first map. The resulting vectors of tracks must be in\n// one-to-one correspondence.\nvoid splitTracksOneToOne(// Inputs\n                         int num_acid, // number of images in map A\n                         rig::PidCidFid                const& C_pid_to_cid_fid, \n                         rig::KeypointVec              const& C_keypoint_vec, \n                         std::vector<rig::cameraImage> const& C_cams,\n                         // Outputs\n                         rig::PidCidFid                     & A_pid_to_cid_fid, \n                         rig::PidCidFid                     & B_pid_to_cid_fid, \n                         rig::KeypointVec                   & A_keypoint_vec, \n                         rig::KeypointVec                   & B_keypoint_vec, \n                         std::vector<rig::cameraImage>      & A_cams, \n                         std::vector<rig::cameraImage>      & B_cams) {\n  \n  // Wipe the outputs\n  A_pid_to_cid_fid.clear();\n  B_pid_to_cid_fid.clear();\n  A_keypoint_vec.clear();\n  B_keypoint_vec.clear();\n  A_cams.clear();\n  B_cams.clear();\n  \n  for (size_t pid = 0; pid < C_pid_to_cid_fid.size(); pid++) {\n\n    auto & cid_fid = C_pid_to_cid_fid[pid];\n    std::map<int, int> A_cid_fid, B_cid_fid;\n    \n    for (auto map_it = cid_fid.begin(); map_it != cid_fid.end(); map_it++) {\n      int cid = map_it->first;\n      int fid = map_it->second;\n      if (cid < num_acid) \n        A_cid_fid[cid] = fid; // belongs to A\n      else\n        B_cid_fid[cid - num_acid] = fid; // belongs to B\n    }\n    \n    if (A_cid_fid.size() > 1 && B_cid_fid.size() > 1) {\n      // This is a shared track, that we break in two. Each obtained track\n      // must have at least two images.\n      A_pid_to_cid_fid.push_back(A_cid_fid);\n      B_pid_to_cid_fid.push_back(B_cid_fid);\n    }\n  }\n  \n  // Break up the keypoint vec and the images\n  for (size_t cid = 0; cid < C_keypoint_vec.size(); cid++) {\n    if (cid < num_acid) {\n      A_keypoint_vec.push_back(C_keypoint_vec[cid]);\n      A_cams.push_back(C_cams[cid]);\n    } else {\n      B_keypoint_vec.push_back(C_keypoint_vec[cid]);\n      B_cams.push_back(C_cams[cid]);\n    }\n  }\n\n  return;\n}\n\n// Build tracks from pairs  \nvoid buildTracks(aspOpenMVG::matching::PairWiseMatches const& match_map,\n                 rig::PidCidFid                             & pid_to_cid_fid) { // output\n\n  pid_to_cid_fid.clear(); // wipe the output\n  \n  aspOpenMVG::tracks::TracksBuilder trackBuilder;\n  trackBuilder.Build(match_map);  // Build:  Efficient fusion of correspondences\n  trackBuilder.Filter();          // Filter: Remove tracks that have conflict\n  // trackBuilder.ExportToStream(std::cout);\n  // Export tracks as a map (each entry is a sequence of imageId and featureIndex):\n  //  {TrackIndex => {(imageIndex, featureIndex), ... ,(imageIndex, featureIndex)}\n  aspOpenMVG::tracks::STLMAPTracks map_tracks;\n  trackBuilder.ExportToSTL(map_tracks);\n  trackBuilder = aspOpenMVG::tracks::TracksBuilder();   // wipe it\n\n  if (map_tracks.empty())\n    LOG(FATAL) << \"No tracks left after filtering. Perhaps images \"\n               << \"are too dis-similar?\\n\";\n  \n  // Populate the filtered tracks\n  size_t num_elems = map_tracks.size();\n  pid_to_cid_fid.clear();\n  pid_to_cid_fid.resize(num_elems);\n  size_t curr_id = 0;\n  for (auto itr = map_tracks.begin(); itr != map_tracks.end(); itr++) {\n    for (auto itr2 = (itr->second).begin(); itr2 != (itr->second).end(); itr2++) {\n      pid_to_cid_fid[curr_id][itr2->first] = itr2->second;\n    }\n    curr_id++;\n  }\n\n  return;\n}\n\n// Remove duplicate tracks. There can still be two tracks with one contained\n// in the other or otherwise having shared elements. \nvoid rmDuplicateTracks(rig::PidCidFid & pid_to_cid_fid) {\n\n  int num_tracks = pid_to_cid_fid.size();\n  // vector to set, and back\n  std::set<std::map<int, int>> track_set(pid_to_cid_fid.begin(), pid_to_cid_fid.end());\n  pid_to_cid_fid.assign(track_set.begin(), track_set.end());\n\n  int diff = num_tracks - int(pid_to_cid_fid.size());\n  std::cout << \"Removed \" << diff << \" duplicate tracks (\"\n            << 100.0 * double(diff)/double(num_tracks) << \"%)\\n\";\n}\n\n} // end namespace rig\n"
  },
  {
    "path": "src/asp/Rig/Tracks.h",
    "content": "/* Copyright (c) 2017, United States Government, as represented by the\n * Administrator of the National Aeronautics and Space Administration.\n *\n * All rights reserved.\n *\n * The Astrobee platform is licensed under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n#ifndef ASP_RIG_TRACKS_H\n#define ASP_RIG_TRACKS_H\n\n#include <set>\n#include <vector>\n#include <map>\n\n#include <asp/Rig/RigTypeDefs.h>\n\n// TODO(oalexan1): Move here all tracks logic from interest_point.cc.\n\nnamespace aspOpenMVG {\n  namespace matching {\n    class PairWiseMatches;\n  }\n}\n\nnamespace rig {\n\nclass cameraImage;\n\nvoid buildTracks(aspOpenMVG::matching::PairWiseMatches const& match_map,\n                 rig::PidCidFid                             & pid_to_cid_fid);\n\n// Remove duplicate tracks. There can still be two tracks with one contained\n// in the other or otherwise having shared elements. \nvoid rmDuplicateTracks(rig::PidCidFid & pid_to_cid_fid);\n\n// See tracks.cc for the doc\nvoid splitTracksOneToOne(// Inputs\n                         int num_acid, // number of images in map A\n                         rig::PidCidFid                const& C_pid_to_cid_fid, \n                         rig::KeypointVec              const& C_keypoint_vec, \n                         std::vector<rig::cameraImage> const& C_cams,\n                         // Outputs\n                         rig::PidCidFid                     & A_pid_to_cid_fid, \n                         rig::PidCidFid                     & B_pid_to_cid_fid, \n                         rig::KeypointVec                   & A_keypoint_vec, \n                         rig::KeypointVec                   & B_keypoint_vec, \n                         std::vector<rig::cameraImage>      & A_cams, \n                         std::vector<rig::cameraImage>      & B_cams);\n  \n}  // namespace rig\n\n#endif  // ASP_RIG_TRACKS_H\n"
  },
  {
    "path": "src/asp/Rig/TransformUtils.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Rig/TransformUtils.h>\n#include <asp/Rig/InterpolationUtils.h>\n#include <asp/Rig/RigConfig.h>\n#include <asp/Rig/CameraImage.h>\n#include <asp/Rig/BasicAlgs.h>\n#include <asp/Rig/RigCameraParams.h>\n#include <asp/Rig/Triangulation.h>\n#include <asp/Rig/RigParseUtils.h>\n\n#include <glog/logging.h>\n\n#include <string>\n#include <vector>\n#include <iostream>\n#include <fstream>\n#include <set>\n#include <string>\n\nnamespace rig {\n\n// Save an affine transform represented as a matrix to a string.\nstd::string affineToStr(Eigen::Affine3d const& M) {\n  Eigen::MatrixXd T = M.matrix();\n  std::ostringstream os;\n  os.precision(17);\n  os << T(0, 0) << \" \" << T(0, 1) << \" \" << T(0, 2) << \" \"\n     << T(1, 0) << \" \" << T(1, 1) << \" \" << T(1, 2) << \" \"\n     << T(2, 0) << \" \" << T(2, 1) << \" \" << T(2, 2) << \" \"\n     << T(0, 3) << \" \" << T(1, 3) << \" \" << T(2, 3);\n\n  return os.str();\n}\n\n// Form an affine transform from 12 values\nEigen::Affine3d vecToAffine(Eigen::VectorXd const& vals) {\n  if (vals.size() != 12)\n    LOG(FATAL) << \"An affine transform must have 12 parameters.\\n\";\n\n  Eigen::Affine3d M = Eigen::Affine3d::Identity();\n  Eigen::MatrixXd T = M.matrix();\n\n  int count = 0;\n\n  // linear part\n  T(0, 0) = vals[count++];\n  T(0, 1) = vals[count++];\n  T(0, 2) = vals[count++];\n  T(1, 0) = vals[count++];\n  T(1, 1) = vals[count++];\n  T(1, 2) = vals[count++];\n  T(2, 0) = vals[count++];\n  T(2, 1) = vals[count++];\n  T(2, 2) = vals[count++];\n\n  // translation part\n  T(0, 3) = vals[count++];\n  T(1, 3) = vals[count++];\n  T(2, 3) = vals[count++];\n\n  M.matrix() = T;\n\n  return M;\n}\n\n// Calculate interpolated world to reference sensor transform. Take into account\n// that the timestamp is for a sensor which may not be the reference one, so\n// an offset needs to be applied. If beg_ref_stamp equals end_ref_stamp,\n// end_world_to_ref_t is ignored.\nEigen::Affine3d calc_interp_world_to_ref(const double* beg_world_to_ref_t,\n                                         const double* end_world_to_ref_t,\n                                         double beg_ref_stamp,\n                                         double end_ref_stamp,\n                                         double ref_to_cam_offset,\n                                         double cam_stamp) {\n    Eigen::Affine3d beg_world_to_ref_aff;\n    array_to_rigid_transform(beg_world_to_ref_aff, beg_world_to_ref_t);\n\n    Eigen::Affine3d end_world_to_ref_aff;\n    array_to_rigid_transform(end_world_to_ref_aff, end_world_to_ref_t);\n\n    // Handle the degenerate case\n    if (end_ref_stamp == beg_ref_stamp)\n      return beg_world_to_ref_aff;\n\n    // Covert from cam time to ref time and normalize. It is very\n    // important that below we subtract the big numbers from each\n    // other first, which are the timestamps, then subtract whatever\n    // else is necessary. Otherwise we get problems with numerical\n    // precision with CERES.\n    double alpha = ((cam_stamp - beg_ref_stamp) - ref_to_cam_offset)\n        / (end_ref_stamp - beg_ref_stamp);\n\n    if (alpha < 0.0 || alpha > 1.0) LOG(FATAL) << \"Out of bounds in interpolation.\\n\";\n\n    // Interpolate at desired time\n    Eigen::Affine3d interp_world_to_ref_aff\n      = rig::linearInterp(alpha, beg_world_to_ref_aff,\n                                end_world_to_ref_aff);\n\n    return interp_world_to_ref_aff;\n}\n\n// Calculate interpolated world to camera transform. Use the\n// convention that if beg_ref_stamp == end_ref_stamp, then only\n// beg_world_to_ref_t is used, while end_world_to_ref_t is\n// ignored. For the reference camera it is also expected that\n// ref_to_cam_aff is the identity. This saves some code duplication\n// later as the ref cam need not be treated separately.\nEigen::Affine3d calcWorldToCamBase(const double* beg_world_to_ref_t,\n                                   const double* end_world_to_ref_t,\n                                   const double* ref_to_cam_trans,\n                                   double beg_ref_stamp,\n                                   double end_ref_stamp,\n                                   double ref_to_cam_offset,\n                                   double cam_stamp) {\n\n  Eigen::Affine3d ref_to_cam_aff;\n  array_to_rigid_transform(ref_to_cam_aff, // output\n                           ref_to_cam_trans);\n\n  Eigen::Affine3d interp_world_to_ref_aff\n    = calc_interp_world_to_ref(beg_world_to_ref_t, end_world_to_ref_t,\n                               beg_ref_stamp, end_ref_stamp,  ref_to_cam_offset,\n                               cam_stamp);\n\n  return ref_to_cam_aff * interp_world_to_ref_aff;\n}\n\n// Compute the transforms from the world to every camera, based on the rig transforms.\nvoid calcWorldToCamWithRig(// Inputs\n                           bool have_rig,\n                           std::vector<rig::cameraImage> const& cams,\n                           std::vector<double> const& world_to_ref_vec,\n                           std::vector<double> const& ref_timestamps,\n                           std::vector<double> const& ref_to_cam_vec,\n                           std::vector<double> const& ref_to_cam_timestamp_offsets,\n                           // Output\n                           std::vector<Eigen::Affine3d>& world_to_cam) {\n\n  if (ref_to_cam_vec.size() / rig::NUM_RIGID_PARAMS != ref_to_cam_timestamp_offsets.size())\n    LOG(FATAL) << \"Must have as many transforms to reference as timestamp offsets.\\n\";\n  if (world_to_ref_vec.size() / rig::NUM_RIGID_PARAMS != ref_timestamps.size())\n    LOG(FATAL) << \"Must have as many reference timestamps as reference cameras.\\n\";\n\n  // What is stored in \"cams\" is completely different when a rig is not used,\n  // even one is available and is good, so then this code will give wrong results.\n  if (!have_rig)\n    LOG(FATAL) << \"calcWorldToCamWithRig: Must have a rig.\\n\";\n\n  world_to_cam.resize(cams.size());\n\n  for (size_t it = 0; it < cams.size(); it++) {\n    int beg_index = cams[it].beg_ref_index;\n    int end_index = cams[it].end_ref_index;\n    int cam_type = cams[it].camera_type;\n    world_to_cam[it] = rig::calcWorldToCamBase\n      (&world_to_ref_vec[rig::NUM_RIGID_PARAMS * beg_index],\n       &world_to_ref_vec[rig::NUM_RIGID_PARAMS * end_index],\n       &ref_to_cam_vec[rig::NUM_RIGID_PARAMS * cam_type],\n       ref_timestamps[beg_index], ref_timestamps[end_index],\n       ref_to_cam_timestamp_offsets[cam_type],\n       cams[it].timestamp);\n  }\n  return;\n}\n\n// A version of the above with the data stored differently\nvoid calcWorldToCamWithRig(// Inputs\n                           bool have_rig,\n                           std::vector<rig::cameraImage> const& cams,\n                           std::vector<Eigen::Affine3d> const& world_to_ref,\n                           std::vector<double> const& ref_timestamps,\n                           std::vector<Eigen::Affine3d> const& ref_to_cam,\n                           std::vector<double> const& ref_to_cam_timestamp_offsets,\n                           // Output\n                           std::vector<Eigen::Affine3d>& world_to_cam) {\n\n  int num_cam_types = ref_to_cam.size();\n  std::vector<double> ref_to_cam_vec(num_cam_types * rig::NUM_RIGID_PARAMS);\n  for (int cam_type = 0; cam_type < num_cam_types; cam_type++)\n    rig::rigid_transform_to_array\n      (ref_to_cam[cam_type], &ref_to_cam_vec[rig::NUM_RIGID_PARAMS * cam_type]);\n\n  int num_ref_cams = world_to_ref.size();\n  if (world_to_ref.size() != ref_timestamps.size())\n    LOG(FATAL) << \"Must have as many ref cam timestamps as ref cameras.\\n\";\n  std::vector<double> world_to_ref_vec(num_ref_cams * rig::NUM_RIGID_PARAMS);\n  for (int cid = 0; cid < num_ref_cams; cid++)\n    rig::rigid_transform_to_array(world_to_ref[cid],\n                                        &world_to_ref_vec[rig::NUM_RIGID_PARAMS * cid]);\n\n  calcWorldToCamWithRig(// Inputs\n                        have_rig, cams, world_to_ref_vec,\n                        ref_timestamps, ref_to_cam_vec,\n                        ref_to_cam_timestamp_offsets,\n                        // Output\n                        world_to_cam);\n}\n\n// Calculate world_to_cam transforms from their representation in a\n// vector, rather than using reference cameras, extrinsics and\n// timestamp interpolation. Only for use with --no_rig, when\n// each camera varies independently.\nvoid calcWorldToCamNoRig(// Inputs\n                         std::vector<rig::cameraImage> const& cams,\n                         std::vector<double> const& world_to_cam_vec,\n                         // Output\n                         std::vector<Eigen::Affine3d>& world_to_cam) {\n\n  if (world_to_cam_vec.size() != cams.size() * rig::NUM_RIGID_PARAMS)\n    LOG(FATAL) << \"Incorrect size for world_to_cam_vec.\\n\";\n\n  for (size_t cid = 0; cid < cams.size(); cid++)\n    rig::array_to_rigid_transform(world_to_cam[cid],  // output\n                                        &world_to_cam_vec[rig::NUM_RIGID_PARAMS * cid]);\n}\n\n// Use one of the two implementations above. Care is needed as when\n// there are no extrinsics, each camera is on its own, so the input is\n// in world_to_cam_vec and not in world_to_ref_vec\nvoid calcWorldToCam(// Inputs\n  bool no_rig, std::vector<rig::cameraImage> const& cams,\n  std::vector<double> const& world_to_ref_vec, std::vector<double> const& ref_timestamps,\n  std::vector<double> const& ref_to_cam_vec, std::vector<double> const& world_to_cam_vec,\n  std::vector<double> const& ref_to_cam_timestamp_offsets,\n  // Output\n  std::vector<Eigen::Affine3d>& world_to_cam) {\n  if (!no_rig)\n    calcWorldToCamWithRig(// Inputs\n                          !no_rig,\n                          cams, world_to_ref_vec, ref_timestamps, ref_to_cam_vec,\n                          ref_to_cam_timestamp_offsets,\n                          // Output\n                          world_to_cam);\n  else\n    calcWorldToCamNoRig(// Inputs\n      cams, world_to_cam_vec,\n      // Output\n      world_to_cam);\n\n  return;\n}\n\n// Extract a affine transform to an array of length NUM_AFFINE_PARAMS\nvoid affine_transform_to_array(Eigen::Affine3d const& aff, double* arr) {\n  Eigen::MatrixXd M = aff.matrix();\n  int count = 0;\n  // The 4th row always has 0, 0, 0, 1\n  for (int row = 0; row < 3; row++) {\n    for (int col = 0; col < 4; col++) {\n      arr[count] = M(row, col);\n      count++;\n    }\n  }\n}\n\n// Convert an array of length NUM_AFFINE_PARAMS to a affine\n// transform. Normalize the quaternion to make it into a rotation.\nvoid array_to_affine_transform(Eigen::Affine3d& aff, const double* arr) {\n  Eigen::MatrixXd M = Eigen::Matrix<double, 4, 4>::Identity();\n\n  int count = 0;\n  // The 4th row always has 0, 0, 0, 1\n  for (int row = 0; row < 3; row++) {\n    for (int col = 0; col < 4; col++) {\n      M(row, col) = arr[count];\n      count++;\n    }\n    }\n\n  aff.matrix() = M;\n}\n\n// Find the median of some matrices, by finding the median for each entry\nEigen::MatrixXd median_matrix(std::vector<Eigen::MatrixXd> const& transforms) {\n\n  // Sanity checks\n  if (transforms.empty())\n    LOG(FATAL) << \"Cannot find the median of an empty set of matrices.\\n\";\n\n  for (size_t cam_it = 0; cam_it < transforms.size(); cam_it++) {\n    if (transforms[cam_it].rows() != 4 || transforms[cam_it].cols() != 4)\n      LOG(FATAL) << \"Expecting square matrices of size 4 in the median computation.\\n\";\n  }\n\n  Eigen::MatrixXd median_trans = Eigen::MatrixXd::Zero(4, 4);\n  for (int col = 0; col < 4; col++) {\n    for (int row = 0; row < 4; row++) {\n\n      std::vector<double> vals;\n      for (size_t cam_it = 0; cam_it < transforms.size(); cam_it++)\n        vals.push_back(transforms[cam_it](col, row));\n\n      median_trans(col, row) = vals[vals.size()/2];\n    }\n  }\n\n  return median_trans;\n}\n\n// Given the transforms from each camera to the world and their timestamps,\n// find an initial guess for the relationship among the sensors on the rig.\n// Note that strictly speaking the transforms in world_to_ref_vec are among\n// those in world_to_cam, but we don't have a way of looking them up in that\n// vector.\nvoid calc_rig_trans(std::vector<rig::cameraImage> const& cams,\n                    std::vector<Eigen::Affine3d>  const& world_to_ref,\n                    std::vector<Eigen::Affine3d>  const& world_to_cam,\n                    std::vector<double>           const& ref_timestamps,\n                    rig::RigSet                        & R) { // update this\n  // Sanity check\n  if (cams.size() != world_to_cam.size())\n    LOG(FATAL) << \"There must be as many world to cam transforms as metadata sets for them.\\n\";\n\n  int num_ref_cams = world_to_ref.size();\n  if (world_to_ref.size() != ref_timestamps.size())\n    LOG(FATAL) << \"Must have as many ref cam timestamps as ref cameras.\\n\";\n  std::vector<double> world_to_ref_vec(num_ref_cams * rig::NUM_RIGID_PARAMS);\n  for (int cid = 0; cid < num_ref_cams; cid++)\n    rig::rigid_transform_to_array(world_to_ref[cid],\n                                        &world_to_ref_vec[rig::NUM_RIGID_PARAMS * cid]);\n\n  // Resize the output\n  int num_cam_types = R.cam_names.size();\n  R.ref_to_cam_trans.resize(num_cam_types);\n\n  // Calc all transforms\n  std::map<int, std::vector<Eigen::MatrixXd>> transforms_map;\n  for (size_t cam_it = 0; cam_it < cams.size(); cam_it++) {\n    int beg_index = cams[cam_it].beg_ref_index;\n    int end_index = cams[cam_it].end_ref_index;\n    int cam_type = cams[cam_it].camera_type;\n\n    if (R.isRefSensor(R.cam_names[cam_type])) {\n      // The identity transform, from the ref sensor to itself\n      transforms_map[cam_type].push_back(Eigen::MatrixXd::Identity(4, 4));\n    } else {\n      // We have world_to_ref transform at times bracketing current time,\n      // and world_to_cam at current time. Interp world_to_ref\n      // at current time, then find ref_to_cam.\n      Eigen::Affine3d interp_world_to_ref_aff\n        = rig::calc_interp_world_to_ref\n        (&world_to_ref_vec[rig::NUM_RIGID_PARAMS * beg_index],\n         &world_to_ref_vec[rig::NUM_RIGID_PARAMS * end_index],\n         ref_timestamps[beg_index], ref_timestamps[end_index],\n         R.ref_to_cam_timestamp_offsets[cam_type],\n         cams[cam_it].timestamp);\n\n      Eigen::Affine3d ref_to_cam_aff\n        = world_to_cam[cam_it] * (interp_world_to_ref_aff.inverse());\n      transforms_map[cam_type].push_back(ref_to_cam_aff.matrix());\n    }\n  }\n\n  // Find median, for robustness\n  for (auto it = transforms_map.begin(); it != transforms_map.end(); it++) {\n    int cam_type = it->first;\n    auto & transforms = it->second;\n\n    if (transforms.empty())\n        LOG(FATAL) << \"No poses were found for rig sensor with id: \" << cam_type << \"\\n\";\n\n    Eigen::MatrixXd median_trans = median_matrix(transforms);\n    R.ref_to_cam_trans[cam_type].matrix() = median_trans;\n    R.ref_to_cam_trans[cam_type].linear() /=\n      pow(R.ref_to_cam_trans[cam_type].linear().determinant(), 1.0 / 3.0);\n  }\n\n  return;\n}\n\n// Extract a rigid transform to an array of length NUM_RIGID_PARAMS\nvoid rigid_transform_to_array(Eigen::Affine3d const& aff, double* arr) {\n\n  for (size_t it = 0; it < 3; it++)\n    arr[it] = aff.translation()[it];\n\n  Eigen::Quaterniond R(aff.linear());\n  arr[3] = R.x();\n  arr[4] = R.y();\n  arr[5] = R.z();\n  arr[6] = R.w();\n}\n\n// Convert an array of length NUM_RIGID_PARAMS to a rigid\n// transform. Normalize the quaternion to make it into a rotation.\nvoid array_to_rigid_transform(Eigen::Affine3d& aff, const double* arr) {\n\n  for (size_t it = 0; it < 3; it++)\n    aff.translation()[it] = arr[it];\n\n  Eigen::Quaterniond R(arr[6], arr[3], arr[4], arr[5]);\n  R.normalize();\n\n  aff = Eigen::Affine3d(Eigen::Translation3d(arr[0], arr[1], arr[2])) * Eigen::Affine3d(R);\n}\n\n// A function to compute the camera position in world coordinates given\n// the world_to_cam array\nEigen::Vector3d calc_cam_position(double const* world_to_cam) {\n\n  Eigen::Affine3d world_to_cam_aff;\n  array_to_rigid_transform(world_to_cam_aff, world_to_cam);\n  Eigen::Vector3d t(world_to_cam_aff.translation());\n  Eigen::Vector3d camera_center = -world_to_cam_aff.rotation().inverse() * t;\n\n  return camera_center;\n}\n\n// Compute the n-weight slerp, analogous to the linear combination\n// W[0]*Q[0] + ... + W[n-1]*Q[n-1]. This is experimental.\n// We assume the sum of weights is 1.\n// TODO(oalexan1): Move this to transform_utils.cc.\nEigen::Quaternion<double> slerp_n(std::vector<double> const& W,\n                                  std::vector<Eigen::Quaternion<double>> const& Q) {\n  if (W.size() != Q.size())\n    LOG(FATAL) << \"Expecting as many quaternions as weights.\";\n\n  if (Q.empty())\n    LOG(FATAL) << \"Expecting at least one quaternion and weight.\";\n\n  if (Q.size() == 1)\n    return Q[0];\n\n  if (Q.size() == 2) {\n    if (!(std::abs(W[0] + W[1] - 1.0) < 1e-6 && W[0] >= 0 && W[1] >= 0))\n      LOG(FATAL) << \"Expecting the weights to be >= 0 and sum up to 1.\";\n    return Q[0].slerp(W[1], Q[1]);\n  }\n\n  // Call recursively this function with fewer terms\n  double sum = W[0] + W[1];\n  if (sum == 0) sum = 1.0;\n  Eigen::Quaternion<double> q = Q[0].slerp(W[1]/sum, Q[1]);\n  std::vector<double> W2 = W;\n  std::vector<Eigen::Quaternion<double>> Q2 = Q;\n  W2.erase(W2.begin());\n  Q2.erase(Q2.begin());\n  W2[0] = sum;\n  Q2[0] = q;\n  return slerp_n(W2, Q2);\n}\n\n// Given two sets of 3D points, find the rotation + translation + scale\n// which best maps the first set to the second.\n// Source: http://en.wikipedia.org/wiki/Kabsch_algorithm\n// TODO(oalexan1): Use the version robust to outliers!  \nvoid Find3DAffineTransform(Eigen::Matrix3Xd const & in,\n                           Eigen::Matrix3Xd const & out,\n                           Eigen::Affine3d* result) {\n  // Default output\n  result->linear() = Eigen::Matrix3d::Identity(3, 3);\n  result->translation() = Eigen::Vector3d::Zero();\n\n  if (in.cols() != out.cols())\n    LOG(FATAL) << \"Find3DAffineTransform(): input data mis-match.\";\n\n  // Local copies we can modify\n  Eigen::Matrix3Xd local_in = in, local_out = out;\n\n  // First find the scale, by finding the ratio of sums of some distances,\n  // then bring the datasets to the same scale.\n  double dist_in = 0, dist_out = 0;\n  for (int col = 0; col < local_in.cols()-1; col++) {\n    dist_in  += (local_in.col(col+1) - local_in.col(col)).norm();\n    dist_out += (local_out.col(col+1) - local_out.col(col)).norm();\n  }\n  if (dist_in <= 0 || dist_out <= 0)\n    return;\n  double scale = dist_out/dist_in;\n  local_out /= scale;\n\n  // Find the centroids then shift to the origin\n  Eigen::Vector3d in_ctr = Eigen::Vector3d::Zero();\n  Eigen::Vector3d out_ctr = Eigen::Vector3d::Zero();\n  for (int col = 0; col < local_in.cols(); col++) {\n    in_ctr  += local_in.col(col);\n    out_ctr += local_out.col(col);\n  }\n  in_ctr /= local_in.cols();\n  out_ctr /= local_out.cols();\n  for (int col = 0; col < local_in.cols(); col++) {\n    local_in.col(col)  -= in_ctr;\n    local_out.col(col) -= out_ctr;\n  }\n\n  // SVD\n  Eigen::Matrix3d Cov = local_in * local_out.transpose();\n  Eigen::JacobiSVD<Eigen::Matrix3d> svd(Cov, Eigen::ComputeFullU | Eigen::ComputeFullV);\n\n  // Find the rotation\n  double d = (svd.matrixV() * svd.matrixU().transpose()).determinant();\n  if (d > 0)\n    d = 1.0;\n  else\n    d = -1.0;\n  Eigen::Matrix3d I = Eigen::Matrix3d::Identity(3, 3);\n  I(2, 2) = d;\n  Eigen::Matrix3d R = svd.matrixV() * I * svd.matrixU().transpose();\n\n  // The final transform\n  result->linear() = scale * R;\n  result->translation() = scale*(out_ctr - R*in_ctr);\n}\n\n// Apply a given transform to the given set of cameras.\n// We assume that the transform is of the form\n// T(x) = scale * rotation * x + translation\nvoid TransformCameras(Eigen::Affine3d const& T,\n                      std::vector<Eigen::Affine3d> &world_to_cam) {\n\n  // Inverse of rotation component\n  double scale = pow(T.linear().determinant(), 1.0 / 3.0);\n  Eigen::MatrixXd Tinv = (T.linear()/scale).inverse();\n\n  for (size_t cid = 0; cid < world_to_cam.size(); cid++) {\n    world_to_cam[cid].linear() = world_to_cam[cid].linear()*Tinv;\n    world_to_cam[cid].translation() = scale*world_to_cam[cid].translation() -\n      world_to_cam[cid].linear()*T.translation();\n  }\n}\n\n// Apply same transform as above to points\nvoid TransformPoints(Eigen::Affine3d const& T, std::vector<Eigen::Vector3d> *xyz) {\n  for (size_t pid = 0; pid < (*xyz).size(); pid++)\n    (*xyz)[pid] = T * (*xyz)[pid];\n}\n\n// Apply a given transform to the specified xyz points, and adjust accordingly the cameras\n// for consistency. We assume that the transform is of the form\n// A(x) = scale * rotation * x + translation\nvoid TransformCamerasAndPoints(Eigen::Affine3d const& A,\n                               std::vector<Eigen::Affine3d> *cid_to_cam_t,\n                               std::vector<Eigen::Vector3d> *xyz) {\n  TransformCameras(A, *cid_to_cam_t);\n  TransformPoints(A, xyz);\n}\n\n// Apply a registration transform to a rig. The only thing that\n// changes is scale, as the rig transforms are between coordinate\n// systems of various cameras.\nvoid TransformRig(Eigen::Affine3d const& T, std::vector<Eigen::Affine3d> & ref_to_cam_trans) {\n  double scale = pow(T.linear().determinant(), 1.0 / 3.0);\n  for (size_t cam_type = 0; cam_type < ref_to_cam_trans.size(); cam_type++)\n    ref_to_cam_trans[cam_type].translation() *= scale;\n}\n\n// Find the name of the camera type of the images used in registration.\n// The registration images must all be acquired with the same sensor.  \nstd::string registrationCamName(std::string const& hugin_file,\n                                std::vector<std::string> const& cam_names,\n                                std::vector<rig::cameraImage> const & cams) {\n\n  std::vector<std::string> images;\n  Eigen::MatrixXd user_ip;\n  Eigen::MatrixXd user_xyz;\n  ParseHuginControlPoints(hugin_file, &images, &user_ip);\n\n  // Must create a map from the image name in cams to sensor type\n  std::map<std::string, int> image_to_cam_type;\n  for (size_t cid = 0; cid < cams.size(); cid++)\n    image_to_cam_type[cams[cid].image_name] = cams[cid].camera_type;\n\n  std::set<std::string> sensors;\n  for (size_t cid = 0; cid < images.size(); cid++) {\n    // Find the image in the map\n    auto it = image_to_cam_type.find(images[cid]);\n    if (it == image_to_cam_type.end())\n      LOG(FATAL) << \"Cannot find image: \" << images[cid]\n        << \" from the Hugin file having control points in the input SfM map.\\n\";\n\n     sensors.insert(cam_names.at(it->second));\n  }\n\n  if (sensors.size() != 1)\n    LOG(FATAL) << \"All images used in registration must be for the same sensor. \"\n               << \"Check the registration file: \" << hugin_file << \".\\n\";\n\n  return *sensors.begin();\n}\n\n// Find the 3D transform from an abstract coordinate system to the\n// world, given control points (pixel matches) and corresponding 3D\n// measurements. It is assumed all images are acquired with the same camera.\nEigen::Affine3d\nregistrationTransform(std::string                  const& hugin_file,\n                      std::string                  const& xyz_file,\n                      rig::CameraParameters     const& cam_params,\n                      std::vector<std::string>     const& cid_to_filename,\n                      std::vector<Eigen::Affine3d> const& world_to_cam_trans) {\n\n  // Get the interest points in the images, and their positions in\n  // the world coordinate system, as supplied by a user.\n  // Parse and concatenate that information from multiple files.\n  std::vector<std::string> images;\n  Eigen::MatrixXd user_ip;\n  Eigen::MatrixXd user_xyz;\n\n  ParseHuginControlPoints(hugin_file, &images, &user_ip);\n  ParseXYZ(xyz_file, &user_xyz);\n\n  int num_points = user_ip.cols();\n  if (num_points != user_xyz.cols())\n    LOG(FATAL) << \"Could not parse an equal number of control \"\n               << \"points and xyz coordinates. Their numbers are \"\n               << num_points << \" vs \" << user_xyz.cols() << \".\\n\";\n\n  std::map<std::string, int> filename_to_cid;\n  for (size_t cid = 0; cid < cid_to_filename.size(); cid++)\n    filename_to_cid[cid_to_filename[cid]] = cid;\n\n  // Wipe images that are missing from the map\n  std::map<int, int> cid2cid;\n  int good_cid = 0;\n  for (size_t cid = 0; cid < images.size(); cid++) {\n    std::string image = images[cid];\n    if (filename_to_cid.find(image) == filename_to_cid.end()) {\n      LOG(WARNING) << \"Will ignore image missing from map: \" << image;\n      continue;\n    }\n    cid2cid[cid] = good_cid;\n    images[good_cid] = images[cid];\n    good_cid++;\n  }\n  images.resize(good_cid);\n\n  // Remove points corresponding to images missing from map\n  int good_pid = 0;\n  for (int pid = 0; pid < num_points; pid++) {\n    int id1 = user_ip(0, pid);\n    int id2 = user_ip(1, pid);\n    if (cid2cid.find(id1) == cid2cid.end() || cid2cid.find(id2) == cid2cid.end()) {\n      continue;\n    }\n    user_ip.col(good_pid) = user_ip.col(pid);\n    user_xyz.col(good_pid) = user_xyz.col(pid);\n    good_pid++;\n  }\n  user_ip.conservativeResize(Eigen::NoChange_t(), good_pid);\n  user_xyz.conservativeResize(Eigen::NoChange_t(), good_pid);\n  num_points = good_pid;\n  for (int pid = 0; pid < num_points; pid++) {\n    int id1 = user_ip(0, pid);\n    int id2 = user_ip(1, pid);\n    if (cid2cid.find(id1) == cid2cid.end() || cid2cid.find(id2) == cid2cid.end())\n      LOG(FATAL) << \"Book-keeping failure in registration.\";\n    user_ip(0, pid) = cid2cid[id1];\n    user_ip(1, pid) = cid2cid[id2];\n  }\n\n  if (num_points < 3)\n    LOG(FATAL) << \"Must have at least 3 points to apply registration. Got: \"\n               << num_points << \"\\n\";\n\n  // Iterate over the control points in the hugin file. Copy the\n  // control points to the list of user keypoints, and create the\n  // corresponding user_pid_to_cid_fid.\n  rig::CidToKeypointMatVec user_cid_to_keypoint_map;\n  std::vector<std::map<int, int> > user_pid_to_cid_fid;\n  user_cid_to_keypoint_map.resize(cid_to_filename.size());\n  user_pid_to_cid_fid.resize(num_points);\n  for (int pid = 0; pid < num_points; pid++) {\n    // Left and right image indices\n    int id1 = user_ip(0, pid);\n    int id2 = user_ip(1, pid);\n\n    // Sanity check\n    if (id1 < 0 || id2 < 0 ||\n        id1 >= static_cast<int>(images.size()) ||\n        id2 >= static_cast<int>(images.size()))\n      LOG(FATAL) << \"Invalid image indices in the hugin file: \" << id1 << ' ' << id2;\n\n    // Find the corresponding indices in the map where these keypoints will go to\n    if (filename_to_cid.find(images[id1]) == filename_to_cid.end())\n      LOG(FATAL) << \"File missing from map: \" << images[id1];\n    if (filename_to_cid.find(images[id2]) == filename_to_cid.end())\n      LOG(FATAL) << \"File missing from map: \" << images[id2];\n    int cid1 = filename_to_cid[images[id1]];\n    int cid2 = filename_to_cid[images[id2]];\n\n    // Append to the keypoints for cid1\n    Eigen::Matrix<double, 2, -1> &M1 = user_cid_to_keypoint_map[cid1];  // alias\n    Eigen::Matrix<double, 2, -1> N1(M1.rows(), M1.cols()+1);\n    N1 << M1, user_ip.block(2, pid, 2, 1);  // left image pixel x and pixel y\n    M1.swap(N1);\n\n    // Append to the keypoints for cid2\n    Eigen::Matrix<double, 2, -1> &M2 = user_cid_to_keypoint_map[cid2];  // alias\n    Eigen::Matrix<double, 2, -1> N2(M2.rows(), M2.cols()+1);\n    N2 << M2, user_ip.block(4, pid, 2, 1);  // right image pixel x and pixel y\n    M2.swap(N2);\n\n    // The corresponding user_pid_to_cid_fid\n    user_pid_to_cid_fid[pid][cid1] = user_cid_to_keypoint_map[cid1].cols()-1;\n    user_pid_to_cid_fid[pid][cid2] = user_cid_to_keypoint_map[cid2].cols()-1;\n  }\n\n  // Apply undistortion\n  Eigen::Vector2d output;\n  for (size_t cid = 0; cid < user_cid_to_keypoint_map.size(); cid++) {\n    for (int i = 0; i < user_cid_to_keypoint_map[cid].cols(); i++) {\n      cam_params.Convert<rig::DISTORTED, rig::UNDISTORTED_C>\n        (user_cid_to_keypoint_map[cid].col(i), &output);\n      user_cid_to_keypoint_map[cid].col(i) = output;\n    }\n  }\n\n  // Triangulate to find the coordinates of the current points\n  // in the virtual coordinate system\n  std::vector<Eigen::Vector3d> unreg_pid_to_xyz;\n  bool rm_invalid_xyz = false;  // there should be nothing to remove hopefully\n  rig::Triangulate(rm_invalid_xyz,\n              cam_params.GetFocalLength(),\n              world_to_cam_trans,\n              user_cid_to_keypoint_map,\n              &user_pid_to_cid_fid,\n              &unreg_pid_to_xyz);\n\n  double mean_err = 0;\n  for (int i = 0; i < user_xyz.cols(); i++) {\n    Eigen::Vector3d a = unreg_pid_to_xyz[i];\n    Eigen::Vector3d b = user_xyz.col(i);\n    mean_err += (a-b).norm();\n  }\n  mean_err /= user_xyz.cols();\n  std::cout << \"Mean absolute error before registration: \" << mean_err << \" meters\" << std::endl;\n  std::cout << \"Un-transformed computed xyz -- measured xyz -- error diff -- error norm (meters)\"\n            << std::endl;\n\n  for (int i = 0; i < user_xyz.cols(); i++) {\n    Eigen::Vector3d a = unreg_pid_to_xyz[i];\n    Eigen::Vector3d b = user_xyz.col(i);\n    std::cout << print_vec(a) << \" -- \"\n              << print_vec(b) << \" -- \"\n              << print_vec(a-b) << \" -- \"\n              << print_vec((a - b).norm())\n              << std::endl;\n  }\n\n  // Find the transform from the computed map coordinate system\n  // to the world coordinate system.\n  int np = unreg_pid_to_xyz.size();\n  Eigen::Matrix3Xd in(3, np);\n  for (int i = 0; i < np; i++)\n    in.col(i) = unreg_pid_to_xyz[i];\n\n  Eigen::Affine3d registration_trans;\n  Find3DAffineTransform(in, user_xyz, &registration_trans);\n\n  mean_err = 0.0;\n  for (int i = 0; i < user_xyz.cols(); i++)\n    mean_err += (registration_trans*in.col(i) - user_xyz.col(i)).norm();\n  mean_err /= user_xyz.cols();\n\n  // Print some info to stdout. If moving this to vw_out(), test if it plays well\n  // with Eigen data, or if custom formatting is needed.\n  double scale = pow(registration_trans.linear().determinant(), 1.0 / 3.0);\n  std::cout << \"Registration transform (to measured world coordinates).\" << std::endl;\n  std::cout << \"Rotation:\\n\" << registration_trans.linear() / scale << std::endl;\n  std::cout << \"Scale:\\n\" << scale << std::endl;\n  std::cout << \"Translation:\\n\" << registration_trans.translation().transpose()\n            << std::endl;\n\n  std::cout << \"Mean absolute error after registration: \"\n            << mean_err << \" meters\" << std::endl;\n\n  std::cout << \"Transformed computed xyz -- measured xyz -- \"\n            << \"error diff - error norm (meters)\" << std::endl;\n  for (int i = 0; i < user_xyz.cols(); i++) {\n    Eigen::Vector3d a = registration_trans*in.col(i);\n    Eigen::Vector3d b = user_xyz.col(i);\n    int id1 = user_ip(0, i);\n    int id2 = user_ip(1, i);\n\n    std::cout << print_vec(a) << \" -- \"\n              << print_vec(b) << \" -- \"\n              << print_vec(a - b) << \" -- \"\n              << print_vec((a - b).norm()) << \" -- \"\n              << images[id1] << ' '\n              << images[id2] << std::endl;\n  }\n\n  return registration_trans;\n}\n\n// Apply a transform to inlier triangulated points  \nvoid transformInlierTriPoints(// Inputs\n  Eigen::Affine3d              const& trans,\n  rig::PidCidFid               const& pid_to_cid_fid,\n  PidCidFidMap                 const& pid_cid_fid_inlier,\n  std::vector<Eigen::Vector3d>      & xyz_vec) { // output\n\n  if (pid_to_cid_fid.size() != pid_cid_fid_inlier.size())\n    LOG(FATAL) << \"Expecting as many inlier flags as there are tracks.\\n\";\n  if (pid_to_cid_fid.size() != xyz_vec.size())\n    LOG(FATAL) << \"Expecting as many tracks as there are triangulated points.\\n\";\n\n  for (size_t pid = 0; pid < pid_to_cid_fid.size(); pid++) {\n\n    bool isInlierXyz = false;\n    for (auto cid_fid1 = pid_to_cid_fid[pid].begin();\n         cid_fid1 != pid_to_cid_fid[pid].end(); cid_fid1++) {\n      int cid1 = cid_fid1->first;\n      int fid1 = cid_fid1->second;\n\n      // Deal with inliers only\n      if (!rig::getMapValue(pid_cid_fid_inlier, pid, cid1, fid1)) continue;\n\n      isInlierXyz = true;\n      break;\n    }\n\n    if (isInlierXyz)\n      xyz_vec[pid] = trans * xyz_vec[pid];\n  }\n\n  return;\n}\n\n// TODO(oalexan1): Test this with multiple rigs. It should work.\n// TODO(oalexan1): Need to fix ref_cam_type.\n// Apply registration to each camera, rig (if present), and depth-to-image, if desired\nvoid applyRegistration(bool no_rig, bool scale_depth,\n                       std::string                   const & hugin_file,\n                       std::string                   const & xyz_file,\n                       std::vector<bool>             const & has_depth,\n                       std::vector<rig::cameraImage> const & cams,\n                       // Outputs\n                       Eigen::Affine3d                     & registration_trans,\n                       std::vector<Eigen::Affine3d>        & world_to_ref,\n                       std::vector<Eigen::Affine3d>        & world_to_cam,\n                       rig::RigSet                         & R) {\n\n  if (R.cam_params.size() != has_depth.size())\n    LOG(FATAL) << \"Number of camera types must equal the number of depth flags.\";\n\n  // All cameras used in registration must be from the same sensor.\n  // That is enforced in registrationCamName().\n  std::string reg_cam_name = rig::registrationCamName(hugin_file, R.cam_names, cams);\n  int reg_cam_index = R.sensorIndex(reg_cam_name);\n\n  // Find the image files. These are one-to-one with world_to_cam.\n  std::vector<std::string> image_files;\n  for (size_t cid = 0; cid < cams.size(); cid++)\n    image_files.push_back(cams[cid].image_name);\n\n  // Find the registration transform.\n  // TODO(oalexan1): Pass to this the whole set of cameras and camera\n  // params, as it need not be the first rig images that are used.\n  registration_trans\n    = rig::registrationTransform(hugin_file, xyz_file,\n                                 R.cam_params[reg_cam_index],\n                                 image_files,\n                                 world_to_cam);\n\n  // Apply the transform to world_to_ref and world_to_cam\n  rig::TransformCameras(registration_trans, world_to_ref);\n  rig::TransformCameras(registration_trans, world_to_cam);\n\n  // Transform the rig\n  if (!no_rig)\n    rig::TransformRig(registration_trans, R.ref_to_cam_trans);\n\n  // Transform the depth-to-image transforms, if desired\n  if (scale_depth) {\n    double scale = pow(registration_trans.linear().determinant(), 1.0 / 3.0);\n    int num_cam_types = R.cam_params.size();\n    for (int cam_type = 0; cam_type < num_cam_types; cam_type++) {\n      if (has_depth[cam_type]) {\n        R.depth_to_image[cam_type].linear() *= scale;\n        R.depth_to_image[cam_type].translation() *= scale;\n      }\n    }\n  }\n\n  return;\n}\n\n}  // end namespace rig\n"
  },
  {
    "path": "src/asp/Rig/TransformUtils.h",
    "content": "/* Copyright (c) 2021, United States Government, as represented by the\n * Administrator of the National Aeronautics and Space Administration.\n *\n * All rights reserved.\n *\n * The \"ISAAC - Integrated System for Autonomous and Adaptive Caretaking\n * platform\" software is licensed under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n#ifndef TRANSFORM_UTILS_H_\n#define TRANSFORM_UTILS_H_\n\n#include <asp/Rig/RigTypeDefs.h>\n#include <vector>\n#include <string>\n#include <map>\n\n#include <Eigen/Core>\n#include <Eigen/Geometry>\n\nnamespace rig {\n  class CameraParameters;\n}\n\nnamespace rig {\n\nconst int NUM_SCALAR_PARAMS  = 1;  // Used to float single-value params // NOLINT\nconst int NUM_OPT_CTR_PARAMS = 2;  // optical center in x and y         // NOLINT\nconst int NUM_PIX_PARAMS     = 2;                                       // NOLINT\nconst int NUM_XYZ_PARAMS     = 3;                                       // NOLINT\nconst int NUM_RIGID_PARAMS   = 7;  // quaternion (4) + translation (3)  // NOLINT\nconst int NUM_AFFINE_PARAMS  = 12; // 3x3 matrix (9) + translation (3)  // NOLINT\n  \nclass cameraImage;\nclass RigSet;\n  \n// Save an affine transform represented as a matrix to a string.\nstd::string affineToStr(Eigen::Affine3d const& M);\n\n// Form an affine transform from 12 values\nEigen::Affine3d vecToAffine(Eigen::VectorXd const& vals);\n\n// Calculate interpolated world to reference sensor transform. Take into account\n// that the timestamp is for a sensor which may not be the reference one, so\n// an offset needs to be applied. If beg_ref_stamp equals end_ref_stamp,\n// end_world_to_ref_t is ignored.\nEigen::Affine3d calc_interp_world_to_ref(const double* beg_world_to_ref_t,\n                                         const double* end_world_to_ref_t,\n                                         double beg_ref_stamp,\n                                         double end_ref_stamp,\n                                         double ref_to_cam_offset,\n                                         double cam_stamp);\n\n// Calculate interpolated world to camera transform. Use the\n// convention that if beg_ref_stamp == end_ref_stamp only\n// beg_world_to_ref_t is used, while end_world_to_ref_t is\n// ignored. For the reference camera it is also expected that\n// ref_to_cam_aff is the identity. This saves some code duplication\n// later as the ref cam need not be treated separately.\nEigen::Affine3d calcWorldToCamBase(const double* beg_world_to_ref_t,\n                                   const double* end_world_to_ref_t,\n                                   const double* ref_to_cam_trans,\n                                   double beg_ref_stamp,\n                                   double end_ref_stamp,\n                                   double ref_to_cam_offset,\n                                   double cam_stamp);\n\n// Find the median of some matrices, by finding the median for each entry\nEigen::MatrixXd median_matrix(std::vector<Eigen::MatrixXd> const& transforms);\n  \n// Given the transforms from each camera to the world and their timestamps,\n// find an initial guess for the relationship among the sensors on the rig.\n// Note that strictly speaking the transforms in world_to_ref_vec are among\n// those in world_to_cam, but we don't have a way of looking them up in that\n// vector.\nvoid calc_rig_trans(std::vector<rig::cameraImage> const& cams,\n                    std::vector<Eigen::Affine3d>  const& world_to_ref,\n                    std::vector<Eigen::Affine3d>  const& world_to_cam,\n                    std::vector<double>           const& ref_timestamps,\n                    rig::RigSet                        & R); // update this\n\n// Compute the transforms from the world to every camera, based on the rig transforms.\nvoid calcWorldToCamWithRig(// Inputs\n                           bool have_rig,\n                           std::vector<rig::cameraImage> const& cams,\n                           std::vector<double> const& world_to_ref_vec,\n                           std::vector<double> const& ref_timestamps,\n                           std::vector<double> const& ref_to_cam_vec,\n                           std::vector<double> const& ref_to_cam_timestamp_offsets,\n                           // Output\n                           std::vector<Eigen::Affine3d>& world_to_cam);\n  \n// A version of the above with the data stored differently\nvoid calcWorldToCamWithRig(// Inputs\n                           bool have_rig,\n                           std::vector<rig::cameraImage> const& cams,\n                           std::vector<Eigen::Affine3d> const& world_to_ref,\n                           std::vector<double> const& ref_timestamps,\n                           std::vector<Eigen::Affine3d> const& ref_to_cam,\n                           std::vector<double> const& ref_to_cam_timestamp_offsets,\n                           // Output\n                           std::vector<Eigen::Affine3d>& world_to_cam);\n\nvoid calcWorldToCamNoRig(// Inputs\n                          std::vector<rig::cameraImage> const& cams,\n                          std::vector<double> const& world_to_cam_vec,\n                          // Output\n                          std::vector<Eigen::Affine3d>& world_to_cam);\n  \nvoid calcWorldToCam(// Inputs\n bool no_rig, std::vector<rig::cameraImage> const& cams,\n std::vector<double> const& world_to_ref_vec, std::vector<double> const& ref_timestamps,\n std::vector<double> const& ref_to_cam_vec, std::vector<double> const& world_to_cam_vec,\n std::vector<double> const& ref_to_cam_timestamp_offsets,\n // Output\n std::vector<Eigen::Affine3d>& world_to_cam);\n  \nvoid affine_transform_to_array(Eigen::Affine3d const& aff, double* arr);\nvoid array_to_affine_transform(Eigen::Affine3d& aff, const double* arr);\n\n// Extract a rigid transform to an array of length NUM_RIGID_PARAMS\nvoid rigid_transform_to_array(Eigen::Affine3d const& aff, double* arr);\n\n// Convert an array of length NUM_RIGID_PARAMS to a rigid\n// transform. Normalize the quaternion to make it into a rotation.\nvoid array_to_rigid_transform(Eigen::Affine3d& aff, const double* arr);\n\n// A function to compute the camera position in world coordinates given\n// the world_to_cam array\nEigen::Vector3d calc_cam_position(double const* world_to_cam);\n\n// Compute the n-weight slerp, analogous to the linear combination\n// W[0]*Q[0] + ... + W[n-1]*Q[n-1]. This is experimental.\n// We assume the sum of weights is 1.\n// TODO(oalexan1): Move this to transform_utils.cc.\nEigen::Quaternion<double> slerp_n(std::vector<double> const& W,\n                                  std::vector<Eigen::Quaternion<double>> const& Q);\n  \n// Given two sets of 3D points, find the rotation + translation + scale\n// which best maps the first set to the second.\n// Source: http://en.wikipedia.org/wiki/Kabsch_algorithm\n// TODO(oalexan1): Use the version robust to outliers!  \nvoid Find3DAffineTransform(Eigen::Matrix3Xd const & in,\n                           Eigen::Matrix3Xd const & out,\n                           Eigen::Affine3d* result);\n\n// Extract control points and the images they correspond 2 from\n// a hugin project file\nvoid ParseHuginControlPoints(std::string const& hugin_file,\n                             std::vector<std::string> * images,\n                             Eigen::MatrixXd * points);\n\n// Parse a file having on each line xyz coordinates\nvoid ParseXYZ(std::string const& xyz_file,\n              Eigen::MatrixXd * xyz);\n\n// Apply a given transform to the given set of cameras.\n// We assume that the transform is of the form\n// T(x) = scale * rotation * x + translation\nvoid TransformCameras(Eigen::Affine3d const& T, std::vector<Eigen::Affine3d> &world_to_cam);\n  \n// Apply same transform as above to points\nvoid TransformPoints(Eigen::Affine3d const& T, std::vector<Eigen::Vector3d> *xyz);\n\n// Apply a given transform to the specified xyz points, and adjust accordingly the cameras\n// for consistency. We assume that the transform is of the form\n// A(x) = scale * rotation * x + translation\nvoid TransformCamerasAndPoints(Eigen::Affine3d const& A,\n                               std::vector<Eigen::Affine3d> *cid_to_cam_t,\n                               std::vector<Eigen::Vector3d> *xyz);\n  \n// Apply a registration transform to a rig. The only thing that\n// changes is scale, as the rig transforms are between coordinate\n// systems of various cameras.\nvoid TransformRig(Eigen::Affine3d const& T, std::vector<Eigen::Affine3d> & ref_to_cam_trans);\n\n// Find the name of the camera of the images used in registration.\n// The registration images must all be acquired with the same sensor.  \nstd::string registrationCamName(std::string const& hugin_file,\n                                std::vector<std::string> const& cam_names,\n                                std::vector<rig::cameraImage> const & cams);\n\n// Find the 3D transform from an abstract coordinate system to the world, given\n// control points (pixel matches) and corresponding 3D measurements. It is\n// assumed all images are acquired with the same camera.\nEigen::Affine3d registrationTransform(std::string                  const& hugin_file,\n                                      std::string                  const& xyz_file,\n                                      rig::CameraParameters     const& cam_params,\n                                      std::vector<std::string>     const& cid_to_filename,\n                                      std::vector<Eigen::Affine3d> const& world_to_cam_trans); \n\n// Apply a transform to inlier triangulated points  \nvoid transformInlierTriPoints(// Inputs\n                              Eigen::Affine3d              const& trans,\n                              rig::PidCidFid               const& pid_to_cid_fid,\n                              PidCidFidMap                 const& pid_cid_fid_inlier,\n                              std::vector<Eigen::Vector3d>      & xyz_vec); // output\n\n// TODO(oalexan1): Test this with multiple rigs. It should work.\n// TODO(oalexan1): Need to fix ref_cam_type.\n// Apply registration to each camera, rig (if present), and depth-to-image, if desired\nvoid applyRegistration(bool no_rig, bool scale_depth, \n                       std::string                   const & hugin_file,\n                       std::string                   const & xyz_file,\n                       std::vector<bool>             const & has_depth,\n                       std::vector<rig::cameraImage> const & cams,\n                       // Outputs\n                       Eigen::Affine3d                     & registration_trans,\n                       std::vector<Eigen::Affine3d>        & world_to_ref,\n                       std::vector<Eigen::Affine3d>        & world_to_cam,\n                       rig::RigSet                         & R);\n\n}  // end namespace rig\n\n#endif  // TRANSFORM_UTILS_H_\n"
  },
  {
    "path": "src/asp/Rig/Triangulation.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Rig/Triangulation.h>\n#include <asp/Rig/BasicAlgs.h>\n#include <asp/Rig/SystemUtils.h>\n#include <asp/Rig/CameraImage.h>\n#include <asp/Rig/RigCameraParams.h>\n#include <asp/OpenMVG/projection.hpp>\n#include <asp/OpenMVG/triangulation_nview.hpp>\n\nnamespace rig {\n\nvoid Triangulate(bool rm_invalid_xyz, double focal_length,\n                 std::vector<Eigen::Affine3d> const& world_to_cam,\n                 rig::CidToKeypointMatVec     const& cid_to_keypoint_map,\n                 rig::PidCidFid * pid_to_cid_fid,\n                 std::vector<Eigen::Vector3d> * pid_to_xyz) {\n\n  Eigen::Matrix3d k;\n  k << focal_length, 0, 0,\n    0, focal_length, 0,\n    0, 0, 1;\n\n  // Build p matrices for all of the cameras. aspOpenMVG::Triangulation\n  // will be holding pointers to all of the cameras.\n  std::vector<aspOpenMVG::Mat34> cid_to_p(world_to_cam.size());\n  for (size_t cid = 0; cid < cid_to_p.size(); cid++) {\n    aspOpenMVG::P_From_KRt(k, world_to_cam[cid].linear(),\n                        world_to_cam[cid].translation(), &cid_to_p[cid]);\n  }\n\n  pid_to_xyz->resize(pid_to_cid_fid->size());\n  for (int pid = pid_to_cid_fid->size() - 1; pid >= 0; pid--) {\n    aspOpenMVG::Triangulation tri;\n    for (std::pair<int, int> const& cid_fid : pid_to_cid_fid->at(pid)) {\n      tri.add(cid_to_p[cid_fid.first],  // they're holding a pointer to this\n              cid_to_keypoint_map[cid_fid.first].col(cid_fid.second));\n    }\n    Eigen::Vector3d solution = tri.compute();\n    if (rm_invalid_xyz && (std::isnan(solution[0]) || tri.minDepth() < 0)) {\n      pid_to_xyz->erase(pid_to_xyz->begin() + pid);\n      pid_to_cid_fid->erase(pid_to_cid_fid->begin() + pid);\n    } else {\n      pid_to_xyz->at(pid) = solution;\n    }\n  }\n\n}\n\n// Triangulate rays emanating from given undistorted and centered pixels\nEigen::Vector3d TriangulatePair(double focal_length1, double focal_length2,\n                                Eigen::Affine3d const& world_to_cam1,\n                                Eigen::Affine3d const& world_to_cam2,\n                                Eigen::Vector2d const& pix1,\n                                Eigen::Vector2d const& pix2) {\n  Eigen::Matrix3d k1;\n  k1 << focal_length1, 0, 0, 0, focal_length1, 0, 0, 0, 1;\n\n  Eigen::Matrix3d k2;\n  k2 << focal_length2, 0, 0, 0, focal_length2, 0, 0, 0, 1;\n\n  aspOpenMVG::Mat34 cid_to_p1, cid_to_p2;\n  aspOpenMVG::P_From_KRt(k1, world_to_cam1.linear(), world_to_cam1.translation(), &cid_to_p1);\n  aspOpenMVG::P_From_KRt(k2, world_to_cam2.linear(), world_to_cam2.translation(), &cid_to_p2);\n\n  aspOpenMVG::Triangulation tri;\n  tri.add(cid_to_p1, pix1);\n  tri.add(cid_to_p2, pix2);\n\n  Eigen::Vector3d solution = tri.compute();\n  return solution;\n}\n\n// Triangulate n rays emanating from given undistorted and centered pixels\nEigen::Vector3d Triangulate(std::vector<double>          const& focal_length_vec,\n                            std::vector<Eigen::Affine3d> const& world_to_cam_vec,\n                            std::vector<Eigen::Vector2d> const& pix_vec) {\n  if (focal_length_vec.size() != world_to_cam_vec.size() ||\n      focal_length_vec.size() != pix_vec.size())\n    LOG(FATAL) << \"All inputs to Triangulate() must have the same size.\";\n\n  if (focal_length_vec.size() <= 1)\n    LOG(FATAL) << \"At least two rays must be passed to Triangulate().\";\n\n  aspOpenMVG::Triangulation tri;\n\n  for (size_t it = 0; it < focal_length_vec.size(); it++) {\n    Eigen::Matrix3d k;\n    k << focal_length_vec[it], 0, 0, 0, focal_length_vec[it], 0, 0, 0, 1;\n\n    aspOpenMVG::Mat34 cid_to_p;\n    aspOpenMVG::P_From_KRt(k, world_to_cam_vec[it].linear(),\n                        world_to_cam_vec[it].translation(),\n                        &cid_to_p);\n\n    tri.add(cid_to_p, pix_vec[it]);\n  }\n\n  Eigen::Vector3d solution = tri.compute();\n  return solution;\n}\n\nvoid multiViewTriangulation(// Inputs\n                            std::vector<rig::CameraParameters> const& cam_params,\n                            std::vector<rig::cameraImage>      const& cams,\n                            std::vector<Eigen::Affine3d>       const& world_to_cam,\n                            rig::PidCidFid                     const& pid_to_cid_fid,\n                            rig::KeypointVec                   const& keypoint_vec,\n                            // Outputs\n                            PidCidFidMap                            & pid_cid_fid_inlier,\n                            std::vector<Eigen::Vector3d>            & xyz_vec) {\n\n  if (cams.size() != world_to_cam.size())\n    LOG(FATAL) << \"Expecting as many images as cameras.\\n\";\n\n  xyz_vec.clear();\n  xyz_vec.resize(pid_to_cid_fid.size());\n  for (size_t pid = 0; pid < pid_to_cid_fid.size(); pid++)\n    xyz_vec[pid] = Eigen::Vector3d(0, 0, 0); // initialize to 0\n\n  for (size_t pid = 0; pid < pid_to_cid_fid.size(); pid++) {\n    std::vector<double> focal_length_vec;\n    std::vector<Eigen::Affine3d> world_to_cam_aff_vec;\n    std::vector<Eigen::Vector2d> pix_vec;\n\n    for (auto cid_fid = pid_to_cid_fid[pid].begin(); cid_fid != pid_to_cid_fid[pid].end();\n         cid_fid++) {\n      int cid = cid_fid->first;\n      int fid = cid_fid->second;\n\n      // Triangulate inliers only\n      if (!rig::getMapValue(pid_cid_fid_inlier, pid, cid, fid))\n        continue;\n\n      Eigen::Vector2d dist_ip(keypoint_vec[cid][fid].first, keypoint_vec[cid][fid].second);\n      Eigen::Vector2d undist_ip;\n      cam_params[cams[cid].camera_type].Convert<rig::DISTORTED, rig::UNDISTORTED_C>\n        (dist_ip, &undist_ip);\n\n      focal_length_vec.push_back(cam_params[cams[cid].camera_type].GetFocalLength());\n      world_to_cam_aff_vec.push_back(world_to_cam[cid]);\n      pix_vec.push_back(undist_ip);\n    }\n\n    if (pix_vec.size() < 2) {\n      // If after outlier filtering less than two rays are left, can't triangulate.\n      // Must set all features for this pid to outliers.\n      for (auto cid_fid = pid_to_cid_fid[pid].begin();\n           cid_fid != pid_to_cid_fid[pid].end();\n           cid_fid++) {\n        int cid = cid_fid->first;\n        int fid = cid_fid->second;\n        rig::setMapValue(pid_cid_fid_inlier, pid, cid, fid, 0);\n      }\n\n      // Nothing else to do\n      continue;\n    }\n\n    // Triangulate n rays emanating from given undistorted and centered pixels\n    xyz_vec[pid] = rig::Triangulate(focal_length_vec, world_to_cam_aff_vec,\n                                          pix_vec);\n\n    bool bad_xyz = false;\n    for (int c = 0; c < xyz_vec[pid].size(); c++) {\n      if (std::isinf(xyz_vec[pid][c]) || std::isnan(xyz_vec[pid][c]))\n        bad_xyz = true;\n    }\n    if (bad_xyz) {\n      // if triangulation failed, must set all features for this pid to outliers.\n      for (auto cid_fid = pid_to_cid_fid[pid].begin(); cid_fid != pid_to_cid_fid[pid].end();\n           cid_fid++) {\n        int cid = cid_fid->first;\n        int fid = cid_fid->second;\n        rig::setMapValue(pid_cid_fid_inlier, pid, cid, fid, 0);\n      }\n    }\n\n  } // end iterating over triangulated points\n\n  return;\n}\n\n// A triangulated point that is equal to (0, 0, 0), inf, or NaN, is not good.\nbool isGoodTri(Eigen::Vector3d const& P) {\n  for (int c = 0; c < P.size(); c++) {\n    if (std::isinf(P[c]) || std::isnan(P[c]))\n      return false;\n  }\n\n  if (P[0] == 0 && P[1] == 0 && P[2] == 0)\n    return false;\n\n  return true;\n}\n\n} // end namespace rig\n"
  },
  {
    "path": "src/asp/Rig/Triangulation.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#ifndef ASP_RIG_TRIANGULATION_H\n#define ASP_RIG_TRIANGULATION_H\n\n#include <asp/Rig/RigTypeDefs.h>\n#include <vector>\n#include <map>\n\n#include <Eigen/Core>\n#include <Eigen/Geometry>\n\n#include <asp/Rig/CameraImage.h>\n#include <asp/Rig/RigCameraParams.h>\n\nnamespace rig {\n\n// Triangulate a 3D point from multiple 2D observations and camera poses. This\n// version takes a single focal length and a map of camera IDs to keypoints.\nvoid Triangulate(bool rm_invalid_xyz, double focal_length,\n                 std::vector<Eigen::Affine3d> const& world_to_cam,\n                 rig::CidToKeypointMatVec     const& cid_to_keypoint_map,\n                 rig::PidCidFid * pid_to_cid_fid,\n                 std::vector<Eigen::Vector3d> * pid_to_xyz);\n\n// Triangulate rays emanating from given undistorted and centered pixels for a\n// pair of cameras.\nEigen::Vector3d TriangulatePair(double focal_length1, double focal_length2,\n                                Eigen::Affine3d const& world_to_cam1,\n                                Eigen::Affine3d const& world_to_cam2,\n                                Eigen::Vector2d const& pix1,\n                                Eigen::Vector2d const& pix2);\n\n// Triangulate n rays emanating from given undistorted and centered pixels. This\n// version takes vectors of focal lengths, camera poses, and pixels.\nEigen::Vector3d Triangulate(std::vector<double>          const& focal_length_vec,\n                            std::vector<Eigen::Affine3d> const& world_to_cam_vec,\n                            std::vector<Eigen::Vector2d> const& pix_vec);\n\n// Perform multi-view triangulation to compute 3D points from 2D keypoints\n// across multiple cameras.\nvoid multiViewTriangulation(std::vector<rig::CameraParameters> const& cam_params,\n                            std::vector<rig::cameraImage>      const& cams,\n                            std::vector<Eigen::Affine3d>       const& world_to_cam,\n                            rig::PidCidFid                     const& pid_to_cid_fid,\n                            rig::KeypointVec                   const& keypoint_vec,\n                            // Outputs\n                            PidCidFidMap                            & pid_cid_fid_inlier,\n                            std::vector<Eigen::Vector3d>            & xyz_vec);\n\n// A triangulated point that is equal to (0, 0, 0), inf, or NaN, is not good\nbool isGoodTri(Eigen::Vector3d const& P);\n\n} // end namespace rig\n\n#endif // ASP_RIG_TRIANGULATION_H\n"
  },
  {
    "path": "src/asp/Rig/happly.h",
    "content": "#pragma once\n\n/* A header-only implementation of the .ply file format.\n * https://github.com/nmwsharp/happly\n * By Nicholas Sharp - nsharp@cs.cmu.edu\n *\n * Version 2, July 20, 2019\n */\n\n/*\nMIT License\n\nCopyright (c) 2018 Nick Sharp\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n*/\n\n\n// clang-format off\n/*\n\n === Changelog ===\n\n  Significant changes to the file recorded here.\n\n  - Version 5 (Aug 22, 2020)      Minor: skip blank lines before properties in ASCII files\n  - Version 4 (Sep 11, 2019)      Change internal list format to be flat. Other small perf fixes and cleanup.\n  - Version 3 (Aug 1, 2019)       Add support for big endian and obj_info\n  - Version 2 (July 20, 2019)     Catch exceptions by const reference.\n  - Version 1 (undated)           Initial version. Unnamed changes before version numbering.\n\n*/\n// clang-format on\n\n#include <array>\n#include <cctype>\n#include <fstream>\n#include <iostream>\n#include <limits>\n#include <memory>\n#include <sstream>\n#include <string>\n#include <type_traits>\n#include <vector>\n#include <climits>\n\n// General namespace wrapping all Happly things.\nnamespace happly {\n\n// Enum specifying binary or ASCII filetypes. Binary can be little-endian\n// (default) or big endian.\nenum class DataFormat { ASCII, Binary, BinaryBigEndian };\n\n// Type name strings\n// clang-format off\ntemplate <typename T> std::string typeName()                { return \"unknown\"; }\ntemplate<> inline std::string typeName<int8_t>()            { return \"char\";    }\ntemplate<> inline std::string typeName<uint8_t>()           { return \"uchar\";   }\ntemplate<> inline std::string typeName<int16_t>()           { return \"short\";   }\ntemplate<> inline std::string typeName<uint16_t>()          { return \"ushort\";  }\ntemplate<> inline std::string typeName<int32_t>()           { return \"int\";     }\ntemplate<> inline std::string typeName<uint32_t>()          { return \"uint\";    }\ntemplate<> inline std::string typeName<float>()             { return \"float\";   }\ntemplate<> inline std::string typeName<double>()            { return \"double\";  }\n\n// Template hackery that makes getProperty<T>() and friends pretty while automatically picking up smaller types\nnamespace {\n\n// A pointer for the equivalent/smaller equivalent of a type (eg. when a double is requested a float works too, etc)\n// long int is intentionally absent to avoid platform confusion\ntemplate <class T> struct TypeChain                 { bool hasChildType = false;   typedef T            type; };\ntemplate <> struct TypeChain<int64_t>               { bool hasChildType = true;    typedef int32_t      type; };\ntemplate <> struct TypeChain<int32_t>               { bool hasChildType = true;    typedef int16_t      type; };\ntemplate <> struct TypeChain<int16_t>               { bool hasChildType = true;    typedef int8_t       type; };\ntemplate <> struct TypeChain<uint64_t>              { bool hasChildType = true;    typedef uint32_t     type; };\ntemplate <> struct TypeChain<uint32_t>              { bool hasChildType = true;    typedef uint16_t     type; };\ntemplate <> struct TypeChain<uint16_t>              { bool hasChildType = true;    typedef uint8_t      type; };\ntemplate <> struct TypeChain<double>                { bool hasChildType = true;    typedef float        type; };\n\ntemplate <class T> struct CanonicalName                     { typedef T         type; };\ntemplate <> struct CanonicalName<char>                      { typedef int8_t    type; };\ntemplate <> struct CanonicalName<unsigned char>             { typedef uint8_t   type; };\ntemplate <> struct CanonicalName<size_t>                    { typedef std::conditional<std::is_same<std::make_signed<size_t>::type, int>::value, uint32_t, uint64_t>::type type; };\n\n// Used to change behavior of >> for 8bit ints, which does not do what we want.\ntemplate <class T> struct SerializeType                 { typedef T         type; };\ntemplate <> struct SerializeType<uint8_t>               { typedef int32_t   type; };\ntemplate <> struct SerializeType< int8_t>               { typedef int32_t   type; };\n\n// Give address only if types are same (used below when conditionally copying data)\n// last int/char arg is to resolve ambiguous overloads, just always pass 0 and the int version will be preferred\ntemplate <typename S, typename T>\nS* addressIfSame(T&, char) {\n  throw std::runtime_error(\"tried to take address for types that are not same\");\n  return nullptr;}\ntemplate <typename S>\nS* addressIfSame(S& t, int) {return &t;}\n\n// clang-format on\n} // namespace\n\n/**\n * @brief A generic property, which is associated with some element. Can be plain Property or a ListProperty, of some\n * type.  Generally, the user should not need to interact with these directly, but they are exposed in case someone\n * wants to get clever.\n */\nclass Property {\n\npublic:\n  /**\n   * @brief Create a new Property with the given name.\n   *\n   * @param name_\n   */\n  Property(const std::string& name_) : name(name_){};\n  virtual ~Property(){};\n\n  std::string name;\n\n  /**\n   * @brief Reserve memory.\n   *\n   * @param capacity Expected number of elements.\n   */\n  virtual void reserve(size_t capacity) = 0;\n\n  /**\n   * @brief (ASCII reading) Parse out the next value of this property from a list of tokens.\n   *\n   * @param tokens The list of property tokens for the element.\n   * @param currEntry Index in to tokens, updated after this property is read.\n   */\n  virtual void parseNext(const std::vector<std::string>& tokens, size_t& currEntry) = 0;\n\n  /**\n   * @brief (binary reading) Copy the next value of this property from a stream of bits.\n   *\n   * @param stream Stream to read from.\n   */\n  virtual void readNext(std::istream& stream) = 0;\n\n  /**\n   * @brief (binary reading) Copy the next value of this property from a stream of bits.\n   *\n   * @param stream Stream to read from.\n   */\n  virtual void readNextBigEndian(std::istream& stream) = 0;\n\n  /**\n   * @brief (reading) Write a header entry for this property.\n   *\n   * @param outStream Stream to write to.\n   */\n  virtual void writeHeader(std::ostream& outStream) = 0;\n\n  /**\n   * @brief (ASCII writing) write this property for some element to a stream in plaintext\n   *\n   * @param outStream Stream to write to.\n   * @param iElement index of the element to write.\n   */\n  virtual void writeDataASCII(std::ostream& outStream, size_t iElement) = 0;\n\n  /**\n   * @brief (binary writing) copy the bits of this property for some element to a stream\n   *\n   * @param outStream Stream to write to.\n   * @param iElement index of the element to write.\n   */\n  virtual void writeDataBinary(std::ostream& outStream, size_t iElement) = 0;\n\n  /**\n   * @brief (binary writing) copy the bits of this property for some element to a stream\n   *\n   * @param outStream Stream to write to.\n   * @param iElement index of the element to write.\n   */\n  virtual void writeDataBinaryBigEndian(std::ostream& outStream, size_t iElement) = 0;\n\n  /**\n   * @brief Number of element entries for this property\n   *\n   * @return\n   */\n  virtual size_t size() = 0;\n\n  /**\n   * @brief A string naming the type of the property\n   *\n   * @return\n   */\n  virtual std::string propertyTypeName() = 0;\n};\n\nnamespace {\n\n/**\n * Check if the platform is little endian.\n * (not foolproof, but will work on most platforms)\n *\n * @return true if little endian\n */\nbool isLittleEndian() {\n  int32_t oneVal = 0x1;\n  char* numPtr = (char*)&oneVal;\n  return (numPtr[0] == 1);\n}\n\n/**\n * Swap endianness.\n *\n * @param value Value to swap.\n *\n * @return Swapped value.\n */\ntemplate <typename T>\nT swapEndian(T val) {\n  char* bytes = reinterpret_cast<char*>(&val);\n  for (unsigned int i = 0; i < sizeof(val) / 2; i++) {\n    std::swap(bytes[sizeof(val) - 1 - i], bytes[i]);\n  }\n  return val;\n}\n\n\n// Unpack flattened list from the convention used in TypedListProperty\ntemplate <typename T>\nstd::vector<std::vector<T>> unflattenList(const std::vector<T>& flatList, const std::vector<size_t> flatListStarts) {\n  size_t outerCount = flatListStarts.size() - 1;\n\n  // Put the output here\n  std::vector<std::vector<T>> outLists(outerCount);\n\n  if (outerCount == 0) {\n    return outLists; // quick out for empty\n  }\n\n  // Copy each sublist\n  for (size_t iOuter = 0; iOuter < outerCount; iOuter++) {\n    size_t iFlatStart = flatListStarts[iOuter];\n    size_t iFlatEnd = flatListStarts[iOuter + 1];\n    outLists[iOuter].insert(outLists[iOuter].begin(), flatList.begin() + iFlatStart, flatList.begin() + iFlatEnd);\n  }\n\n  return outLists;\n}\n\n\n}; // namespace\n\n\n/**\n * @brief A property which takes a single value (not a list).\n */\ntemplate <class T>\nclass TypedProperty : public Property {\n\npublic:\n  /**\n   * @brief Create a new Property with the given name.\n   *\n   * @param name_\n   */\n  TypedProperty(const std::string& name_) : Property(name_) {\n    if (typeName<T>() == \"unknown\") {\n      // TODO should really be a compile-time error\n      throw std::runtime_error(\"Attempted property type does not match any type defined by the .ply format.\");\n    }\n  };\n\n  /**\n   * @brief Create a new property and initialize with data.\n   *\n   * @param name_\n   * @param data_\n   */\n  TypedProperty(const std::string& name_, const std::vector<T>& data_) : Property(name_), data(data_) {\n    if (typeName<T>() == \"unknown\") {\n      throw std::runtime_error(\"Attempted property type does not match any type defined by the .ply format.\");\n    }\n  };\n\n  virtual ~TypedProperty() override{};\n\n  /**\n   * @brief Reserve memory.\n   *\n   * @param capacity Expected number of elements.\n   */\n  virtual void reserve(size_t capacity) override { data.reserve(capacity); }\n\n  /**\n   * @brief (ASCII reading) Parse out the next value of this property from a list of tokens.\n   *\n   * @param tokens The list of property tokens for the element.\n   * @param currEntry Index in to tokens, updated after this property is read.\n   */\n  virtual void parseNext(const std::vector<std::string>& tokens, size_t& currEntry) override {\n    data.emplace_back();\n    std::istringstream iss(tokens[currEntry]);\n    typename SerializeType<T>::type tmp; // usually the same type as T\n    iss >> tmp;\n    data.back() = tmp;\n    currEntry++;\n  };\n\n  /**\n   * @brief (binary reading) Copy the next value of this property from a stream of bits.\n   *\n   * @param stream Stream to read from.\n   */\n  virtual void readNext(std::istream& stream) override {\n    data.emplace_back();\n    stream.read((char*)&data.back(), sizeof(T));\n  }\n\n  /**\n   * @brief (binary reading) Copy the next value of this property from a stream of bits.\n   *\n   * @param stream Stream to read from.\n   */\n  virtual void readNextBigEndian(std::istream& stream) override {\n    data.emplace_back();\n    stream.read((char*)&data.back(), sizeof(T));\n    data.back() = swapEndian(data.back());\n  }\n\n  /**\n   * @brief (reading) Write a header entry for this property.\n   *\n   * @param outStream Stream to write to.\n   */\n  virtual void writeHeader(std::ostream& outStream) override {\n    outStream << \"property \" << typeName<T>() << \" \" << name << \"\\n\";\n  }\n\n  /**\n   * @brief (ASCII writing) write this property for some element to a stream in plaintext\n   *\n   * @param outStream Stream to write to.\n   * @param iElement index of the element to write.\n   */\n  virtual void writeDataASCII(std::ostream& outStream, size_t iElement) override {\n    outStream.precision(std::numeric_limits<T>::max_digits10);\n    outStream << static_cast<typename SerializeType<T>::type>(data[iElement]); // case is usually a no-op\n  }\n\n  /**\n   * @brief (binary writing) copy the bits of this property for some element to a stream\n   *\n   * @param outStream Stream to write to.\n   * @param iElement index of the element to write.\n   */\n  virtual void writeDataBinary(std::ostream& outStream, size_t iElement) override {\n    outStream.write((char*)&data[iElement], sizeof(T));\n  }\n\n  /**\n   * @brief (binary writing) copy the bits of this property for some element to a stream\n   *\n   * @param outStream Stream to write to.\n   * @param iElement index of the element to write.\n   */\n  virtual void writeDataBinaryBigEndian(std::ostream& outStream, size_t iElement) override {\n    auto value = swapEndian(data[iElement]);\n    outStream.write((char*)&value, sizeof(T));\n  }\n\n  /**\n   * @brief Number of element entries for this property\n   *\n   * @return\n   */\n  virtual size_t size() override { return data.size(); }\n\n\n  /**\n   * @brief A string naming the type of the property\n   *\n   * @return\n   */\n  virtual std::string propertyTypeName() override { return typeName<T>(); }\n\n  /**\n   * @brief The actual data contained in the property\n   */\n  std::vector<T> data;\n};\n\n\n/**\n * @brief A property which is a list of value (eg, 3 doubles). Note that lists are always variable length per-element.\n */\ntemplate <class T>\nclass TypedListProperty : public Property {\n\npublic:\n  /**\n   * @brief Create a new Property with the given name.\n   *\n   * @param name_\n   */\n  TypedListProperty(const std::string& name_, int listCountBytes_) : Property(name_), listCountBytes(listCountBytes_) {\n    if (typeName<T>() == \"unknown\") {\n      throw std::runtime_error(\"Attempted property type does not match any type defined by the .ply format.\");\n    }\n\n    flattenedIndexStart.push_back(0);\n  };\n\n  /**\n   * @brief Create a new property and initialize with data\n   *\n   * @param name_\n   * @param data_\n   */\n  TypedListProperty(const std::string& name_, const std::vector<std::vector<T>>& data_) : Property(name_) {\n    if (typeName<T>() == \"unknown\") {\n      throw std::runtime_error(\"Attempted property type does not match any type defined by the .ply format.\");\n    }\n\n    // Populate list with data\n    flattenedIndexStart.push_back(0);\n    for (const std::vector<T>& vec : data_) {\n      for (const T& val : vec) {\n        flattenedData.emplace_back(val);\n      }\n      flattenedIndexStart.push_back(flattenedData.size());\n    }\n  };\n\n  virtual ~TypedListProperty() override{};\n\n  /**\n   * @brief Reserve memory.\n   *\n   * @param capacity Expected number of elements.\n   */\n  virtual void reserve(size_t capacity) override {\n    flattenedData.reserve(3 * capacity); // optimize for triangle meshes\n    flattenedIndexStart.reserve(capacity + 1);\n  }\n\n  /**\n   * @brief (ASCII reading) Parse out the next value of this property from a list of tokens.\n   *\n   * @param tokens The list of property tokens for the element.\n   * @param currEntry Index in to tokens, updated after this property is read.\n   */\n  virtual void parseNext(const std::vector<std::string>& tokens, size_t& currEntry) override {\n\n    std::istringstream iss(tokens[currEntry]);\n    size_t count;\n    iss >> count;\n    currEntry++;\n\n    size_t currSize = flattenedData.size();\n    size_t afterSize = currSize + count;\n    flattenedData.resize(afterSize);\n    for (size_t iFlat = currSize; iFlat < afterSize; iFlat++) {\n      std::istringstream iss(tokens[currEntry]);\n      typename SerializeType<T>::type tmp; // usually the same type as T\n      iss >> tmp;\n      flattenedData[iFlat] = tmp;\n      currEntry++;\n    }\n    flattenedIndexStart.emplace_back(afterSize);\n  }\n\n  /**\n   * @brief (binary reading) Copy the next value of this property from a stream of bits.\n   *\n   * @param stream Stream to read from.\n   */\n  virtual void readNext(std::istream& stream) override {\n\n    // Read the size of the list\n    size_t count = 0;\n    stream.read(((char*)&count), listCountBytes);\n\n    // Read list elements\n    size_t currSize = flattenedData.size();\n    size_t afterSize = currSize + count;\n    flattenedData.resize(afterSize);\n    if (count > 0) {\n      stream.read((char*)&flattenedData[currSize], count * sizeof(T));\n    }\n    flattenedIndexStart.emplace_back(afterSize);\n  }\n\n  /**\n   * @brief (binary reading) Copy the next value of this property from a stream of bits.\n   *\n   * @param stream Stream to read from.\n   */\n  virtual void readNextBigEndian(std::istream& stream) override {\n\n    // Read the size of the list\n    size_t count = 0;\n    stream.read(((char*)&count), listCountBytes);\n    if (listCountBytes == 8) {\n      count = (size_t)swapEndian((uint64_t)count);\n    } else if (listCountBytes == 4) {\n      count = (size_t)swapEndian((uint32_t)count);\n    } else if (listCountBytes == 2) {\n      count = (size_t)swapEndian((uint16_t)count);\n    }\n\n    // Read list elements\n    size_t currSize = flattenedData.size();\n    size_t afterSize = currSize + count;\n    flattenedData.resize(afterSize);\n    if (count > 0) {\n      stream.read((char*)&flattenedData[currSize], count * sizeof(T));\n    }\n    flattenedIndexStart.emplace_back(afterSize);\n\n    // Swap endian order of list elements\n    for (size_t iFlat = currSize; iFlat < afterSize; iFlat++) {\n      flattenedData[iFlat] = swapEndian(flattenedData[iFlat]);\n    }\n  }\n\n  /**\n   * @brief (reading) Write a header entry for this property. Note that we already use \"uchar\" for the list count type.\n   *\n   * @param outStream Stream to write to.\n   */\n  virtual void writeHeader(std::ostream& outStream) override {\n    // NOTE: We ALWAYS use uchar as the list count output type\n    outStream << \"property list uchar \" << typeName<T>() << \" \" << name << \"\\n\";\n  }\n\n  /**\n   * @brief (ASCII writing) write this property for some element to a stream in plaintext\n   *\n   * @param outStream Stream to write to.\n   * @param iElement index of the element to write.\n   */\n  virtual void writeDataASCII(std::ostream& outStream, size_t iElement) override {\n    size_t dataStart = flattenedIndexStart[iElement];\n    size_t dataEnd = flattenedIndexStart[iElement + 1];\n\n    // Get the number of list elements as a uchar, and ensure the value fits\n    size_t dataCount = dataEnd - dataStart;\n    if (dataCount > std::numeric_limits<uint8_t>::max()) {\n      throw std::runtime_error(\n          \"List property has an element with more entries than fit in a uchar. See note in README.\");\n    }\n\n    outStream << dataCount;\n    outStream.precision(std::numeric_limits<T>::max_digits10);\n    for (size_t iFlat = dataStart; iFlat < dataEnd; iFlat++) {\n      outStream << \" \" << static_cast<typename SerializeType<T>::type>(flattenedData[iFlat]); // cast is usually a no-op\n    }\n  }\n\n  /**\n   * @brief (binary writing) copy the bits of this property for some element to a stream\n   *\n   * @param outStream Stream to write to.\n   * @param iElement index of the element to write.\n   */\n  virtual void writeDataBinary(std::ostream& outStream, size_t iElement) override {\n    size_t dataStart = flattenedIndexStart[iElement];\n    size_t dataEnd = flattenedIndexStart[iElement + 1];\n\n    // Get the number of list elements as a uchar, and ensure the value fits\n    size_t dataCount = dataEnd - dataStart;\n    if (dataCount > std::numeric_limits<uint8_t>::max()) {\n      throw std::runtime_error(\n          \"List property has an element with more entries than fit in a uchar. See note in README.\");\n    }\n    uint8_t count = static_cast<uint8_t>(dataCount);\n\n    outStream.write((char*)&count, sizeof(uint8_t));\n    outStream.write((char*)&flattenedData[dataStart], count * sizeof(T));\n  }\n\n  /**\n   * @brief (binary writing) copy the bits of this property for some element to a stream\n   *\n   * @param outStream Stream to write to.\n   * @param iElement index of the element to write.\n   */\n  virtual void writeDataBinaryBigEndian(std::ostream& outStream, size_t iElement) override {\n    size_t dataStart = flattenedIndexStart[iElement];\n    size_t dataEnd = flattenedIndexStart[iElement + 1];\n\n    // Get the number of list elements as a uchar, and ensure the value fits\n    size_t dataCount = dataEnd - dataStart;\n    if (dataCount > std::numeric_limits<uint8_t>::max()) {\n      throw std::runtime_error(\n          \"List property has an element with more entries than fit in a uchar. See note in README.\");\n    }\n    uint8_t count = static_cast<uint8_t>(dataCount);\n\n    outStream.write((char*)&count, sizeof(uint8_t));\n    for (size_t iFlat = dataStart; iFlat < dataEnd; iFlat++) {\n      T value = swapEndian(flattenedData[iFlat]);\n      outStream.write((char*)&value, sizeof(T));\n    }\n  }\n\n  /**\n   * @brief Number of element entries for this property\n   *\n   * @return\n   */\n  virtual size_t size() override { return flattenedIndexStart.size() - 1; }\n\n\n  /**\n   * @brief A string naming the type of the property\n   *\n   * @return\n   */\n  virtual std::string propertyTypeName() override { return typeName<T>(); }\n\n  /**\n   * @brief The (flattened) data for the property, as formed by concatenating all of the individual element lists\n   * together.\n   */\n  std::vector<T> flattenedData;\n\n  /**\n   * @brief Indices in to flattenedData. The i'th element gives the index in to flattenedData where the element's data\n   * begins. A final entry is included which is the length of flattenedData. Size is N_elem + 1.\n   */\n  std::vector<size_t> flattenedIndexStart;\n\n  /**\n   * @brief The number of bytes used to store the count for lists of data.\n   */\n  int listCountBytes = -1;\n};\n\n\n/**\n * @brief Helper function to construct a new property of the appropriate type.\n *\n * @param name The name of the property to construct.\n * @param typeStr A string naming the type according to the format.\n * @param isList Is this a plain property, or a list property?\n * @param listCountTypeStr If a list property, the type of the count varible.\n *\n * @return A new Property with the proper type.\n */\ninline std::unique_ptr<Property> createPropertyWithType(const std::string& name, const std::string& typeStr,\n                                                        bool isList, const std::string& listCountTypeStr) {\n\n  // == Figure out how many bytes the list count field has, if this is a list type\n  // Note: some files seem to use signed types here, we read the width but always parse as if unsigned\n  int listCountBytes = -1;\n  if (isList) {\n    if (listCountTypeStr == \"uchar\" || listCountTypeStr == \"uint8\" || listCountTypeStr == \"char\" ||\n        listCountTypeStr == \"int8\") {\n      listCountBytes = 1;\n    } else if (listCountTypeStr == \"ushort\" || listCountTypeStr == \"uint16\" || listCountTypeStr == \"short\" ||\n               listCountTypeStr == \"int16\") {\n      listCountBytes = 2;\n    } else if (listCountTypeStr == \"uint\" || listCountTypeStr == \"uint32\" || listCountTypeStr == \"int\" ||\n               listCountTypeStr == \"int32\") {\n      listCountBytes = 4;\n    } else {\n      throw std::runtime_error(\"Unrecognized list count type: \" + listCountTypeStr);\n    }\n  }\n\n  // = Unsigned int\n\n  // 8 bit unsigned\n  if (typeStr == \"uchar\" || typeStr == \"uint8\") {\n    if (isList) {\n      return std::unique_ptr<Property>(new TypedListProperty<uint8_t>(name, listCountBytes));\n    } else {\n      return std::unique_ptr<Property>(new TypedProperty<uint8_t>(name));\n    }\n  }\n\n  // 16 bit unsigned\n  else if (typeStr == \"ushort\" || typeStr == \"uint16\") {\n    if (isList) {\n      return std::unique_ptr<Property>(new TypedListProperty<uint16_t>(name, listCountBytes));\n    } else {\n      return std::unique_ptr<Property>(new TypedProperty<uint16_t>(name));\n    }\n  }\n\n  // 32 bit unsigned\n  else if (typeStr == \"uint\" || typeStr == \"uint32\") {\n    if (isList) {\n      return std::unique_ptr<Property>(new TypedListProperty<uint32_t>(name, listCountBytes));\n    } else {\n      return std::unique_ptr<Property>(new TypedProperty<uint32_t>(name));\n    }\n  }\n\n  // = Signed int\n\n  // 8 bit signed\n  if (typeStr == \"char\" || typeStr == \"int8\") {\n    if (isList) {\n      return std::unique_ptr<Property>(new TypedListProperty<int8_t>(name, listCountBytes));\n    } else {\n      return std::unique_ptr<Property>(new TypedProperty<int8_t>(name));\n    }\n  }\n\n  // 16 bit signed\n  else if (typeStr == \"short\" || typeStr == \"int16\") {\n    if (isList) {\n      return std::unique_ptr<Property>(new TypedListProperty<int16_t>(name, listCountBytes));\n    } else {\n      return std::unique_ptr<Property>(new TypedProperty<int16_t>(name));\n    }\n  }\n\n  // 32 bit signed\n  else if (typeStr == \"int\" || typeStr == \"int32\") {\n    if (isList) {\n      return std::unique_ptr<Property>(new TypedListProperty<int32_t>(name, listCountBytes));\n    } else {\n      return std::unique_ptr<Property>(new TypedProperty<int32_t>(name));\n    }\n  }\n\n  // = Float\n\n  // 32 bit float\n  else if (typeStr == \"float\" || typeStr == \"float32\") {\n    if (isList) {\n      return std::unique_ptr<Property>(new TypedListProperty<float>(name, listCountBytes));\n    } else {\n      return std::unique_ptr<Property>(new TypedProperty<float>(name));\n    }\n  }\n\n  // 64 bit float\n  else if (typeStr == \"double\" || typeStr == \"float64\") {\n    if (isList) {\n      return std::unique_ptr<Property>(new TypedListProperty<double>(name, listCountBytes));\n    } else {\n      return std::unique_ptr<Property>(new TypedProperty<double>(name));\n    }\n  }\n\n  else {\n    throw std::runtime_error(\"Data type: \" + typeStr + \" cannot be mapped to .ply format\");\n  }\n}\n\n/**\n * @brief An element (more properly an element type) in the .ply object. Tracks the name of the elemnt type (eg,\n * \"vertices\"), the number of elements of that type (eg, 1244), and any properties associated with that element (eg,\n * \"position\", \"color\").\n */\nclass Element {\n\npublic:\n  /**\n   * @brief Create a new element type.\n   *\n   * @param name_ Name of the element type (eg, \"vertices\")\n   * @param count_ Number of instances of this element.\n   */\n  Element(const std::string& name_, size_t count_) : name(name_), count(count_) {}\n\n  std::string name;\n  size_t count;\n  std::vector<std::unique_ptr<Property>> properties;\n\n  /**\n   * @brief Check if a property exists.\n   *\n   * @param target The name of the property to get.\n   *\n   * @return Whether the target property exists.\n   */\n  bool hasProperty(const std::string& target) {\n    for (std::unique_ptr<Property>& prop : properties) {\n      if (prop->name == target) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * @brief Check if a property exists with the requested type.\n   *\n   * @tparam T The type of the property\n   * @param target The name of the property to get.\n   *\n   * @return Whether the target property exists.\n   */\n  template <class T>\n  bool hasPropertyType(const std::string& target) {\n    for (std::unique_ptr<Property>& prop : properties) {\n      if (prop->name == target) {\n        TypedProperty<T>* castedProp = dynamic_cast<TypedProperty<T>*>(prop.get());\n        if (castedProp) {\n          return true;\n        }\n        return false;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * @brief A list of the names of all properties\n   *\n   * @return Property names\n   */\n  std::vector<std::string> getPropertyNames() {\n    std::vector<std::string> names;\n    for (std::unique_ptr<Property>& p : properties) {\n      names.push_back(p->name);\n    }\n    return names;\n  }\n\n  /**\n   * @brief Low-level method to get a pointer to a property. Users probably don't need to call this.\n   *\n   * @param target The name of the property to get.\n   *\n   * @return A (unique_ptr) pointer to the property.\n   */\n  std::unique_ptr<Property>& getPropertyPtr(const std::string& target) {\n    for (std::unique_ptr<Property>& prop : properties) {\n      if (prop->name == target) {\n        return prop;\n      }\n    }\n    throw std::runtime_error(\"PLY parser: element \" + name + \" does not have property \" + target);\n  }\n\n  /**\n   * @brief Add a new (plain, not list) property for this element type.\n   *\n   * @tparam T The type of the property\n   * @param propertyName The name of the property\n   * @param data The data for the property. Must have the same length as the number of elements.\n   */\n  template <class T>\n  void addProperty(const std::string& propertyName, const std::vector<T>& data) {\n\n    if (data.size() != count) {\n      throw std::runtime_error(\"PLY write: new property \" + propertyName + \" has size which does not match element\");\n    }\n\n    // If there is already some property with this name, remove it\n    for (size_t i = 0; i < properties.size(); i++) {\n      if (properties[i]->name == propertyName) {\n        properties.erase(properties.begin() + i);\n        i--;\n      }\n    }\n\n    // Copy to canonical type. Often a no-op, but takes care of standardizing widths across platforms.\n    std::vector<typename CanonicalName<T>::type> canonicalVec(data.begin(), data.end());\n\n    properties.push_back(\n        std::unique_ptr<Property>(new TypedProperty<typename CanonicalName<T>::type>(propertyName, canonicalVec)));\n  }\n\n  /**\n   * @brief Add a new list property for this element type.\n   *\n   * @tparam T The type of the property (eg, \"double\" for a list of doubles)\n   * @param propertyName The name of the property\n   * @param data The data for the property. Outer vector must have the same length as the number of elements.\n   */\n  template <class T>\n  void addListProperty(const std::string& propertyName, const std::vector<std::vector<T>>& data) {\n\n    if (data.size() != count) {\n      throw std::runtime_error(\"PLY write: new property \" + propertyName + \" has size which does not match element\");\n    }\n\n    // If there is already some property with this name, remove it\n    for (size_t i = 0; i < properties.size(); i++) {\n      if (properties[i]->name == propertyName) {\n        properties.erase(properties.begin() + i);\n        i--;\n      }\n    }\n\n    // Copy to canonical type. Often a no-op, but takes care of standardizing widths across platforms.\n    std::vector<std::vector<typename CanonicalName<T>::type>> canonicalListVec;\n    for (const std::vector<T>& subList : data) {\n      canonicalListVec.emplace_back(subList.begin(), subList.end());\n    }\n\n    properties.push_back(std::unique_ptr<Property>(\n        new TypedListProperty<typename CanonicalName<T>::type>(propertyName, canonicalListVec)));\n  }\n\n  /**\n   * @brief Get a vector of a data from a property for this element. Automatically promotes to larger types. Throws if\n   * requested data is unavailable.\n   *\n   * @tparam T The type of data requested\n   * @param propertyName The name of the property to get.\n   *\n   * @return The data.\n   */\n  template <class T>\n  std::vector<T> getProperty(const std::string& propertyName) {\n\n    // Find the property\n    std::unique_ptr<Property>& prop = getPropertyPtr(propertyName);\n\n    // Get a copy of the data with auto-promoting type magic\n    return getDataFromPropertyRecursive<T, T>(prop.get());\n  }\n\n  /**\n   * @brief Get a vector of a data from a property for this element. Unlike getProperty(), only returns if the ply\n   * record contains a type that matches T exactly. Throws if * requested data is unavailable.\n   *\n   * @tparam T The type of data requested\n   * @param propertyName The name of the property to get.\n   *\n   * @return The data.\n   */\n  template <class T>\n  std::vector<T> getPropertyType(const std::string& propertyName) {\n\n    // Find the property\n    std::unique_ptr<Property>& prop = getPropertyPtr(propertyName);\n    TypedProperty<T>* castedProp = dynamic_cast<TypedProperty<T>*>(prop);\n    if (castedProp) {\n      return castedProp->data;\n    }\n\n    // No match, failure\n    throw std::runtime_error(\"PLY parser: property \" + prop->name + \" is not of type type \" + typeName<T>() +\n                             \". Has type \" + prop->propertyTypeName());\n  }\n\n  /**\n   * @brief Get a vector of lists of data from a property for this element. Automatically promotes to larger types.\n   * Throws if requested data is unavailable.\n   *\n   * @tparam T The type of data requested\n   * @param propertyName The name of the property to get.\n   *\n   * @return The data.\n   */\n  template <class T>\n  std::vector<std::vector<T>> getListProperty(const std::string& propertyName) {\n\n    // Find the property\n    std::unique_ptr<Property>& prop = getPropertyPtr(propertyName);\n\n    // Get a copy of the data with auto-promoting type magic\n    return getDataFromListPropertyRecursive<T, T>(prop.get());\n  }\n\n  /**\n   * @brief Get a vector of a data from a property for this element. Unlike getProperty(), only returns if the ply\n   * record contains a type that matches T exactly. Throws if * requested data is unavailable.\n   *\n   * @tparam T The type of data requested\n   * @param propertyName The name of the property to get.\n   *\n   * @return The data.\n   */\n  template <class T>\n  std::vector<std::vector<T>> getListPropertyType(const std::string& propertyName) {\n\n    // Find the property\n    std::unique_ptr<Property>& prop = getPropertyPtr(propertyName);\n    TypedListProperty<T>* castedProp = dynamic_cast<TypedListProperty<T>*>(prop);\n    if (castedProp) {\n      return unflattenList(castedProp->flattenedData, castedProp->flattenedIndexStart);\n    }\n\n    // No match, failure\n    throw std::runtime_error(\"PLY parser: list property \" + prop->name + \" is not of type \" + typeName<T>() +\n                             \". Has type \" + prop->propertyTypeName());\n  }\n\n\n  /**\n   * @brief Get a vector of lists of data from a property for this element. Automatically promotes to larger types.\n   * Unlike getListProperty(), this method will additionally convert between types of different sign (eg, requesting and\n   * int32 would get data from a uint32); doing so naively converts between signed and unsigned types. This is typically\n   * useful for data representing indices, which might be stored as signed or unsigned numbers.\n   *\n   * @tparam T The type of data requested\n   * @param propertyName The name of the property to get.\n   *\n   * @return The data.\n   */\n  template <class T>\n  std::vector<std::vector<T>> getListPropertyAnySign(const std::string& propertyName) {\n\n    // Find the property\n    std::unique_ptr<Property>& prop = getPropertyPtr(propertyName);\n\n    // Get a copy of the data with auto-promoting type magic\n    try {\n      // First, try the usual approach, looking for a version of the property with the same signed-ness and possibly\n      // smaller size\n      return getDataFromListPropertyRecursive<T, T>(prop.get());\n    } catch (const std::runtime_error& orig_e) {\n\n      // If the usual approach fails, look for a version with opposite signed-ness\n      try {\n\n        // This type has the oppopsite signeness as the input type\n        typedef typename CanonicalName<T>::type Tcan;\n        typedef typename std::conditional<std::is_signed<Tcan>::value, typename std::make_unsigned<Tcan>::type,\n                                          typename std::make_signed<Tcan>::type>::type OppsignType;\n\n        return getDataFromListPropertyRecursive<T, OppsignType>(prop.get());\n\n      } catch (const std::runtime_error&) {\n        throw orig_e;\n      }\n\n      throw orig_e;\n    }\n  }\n\n\n  /**\n   * @brief Performs sanity checks on the element, throwing if any fail.\n   */\n  void validate() {\n\n    // Make sure no properties have duplicate names, and no names have whitespace\n    for (size_t iP = 0; iP < properties.size(); iP++) {\n      for (char c : properties[iP]->name) {\n        if (std::isspace(c)) {\n          throw std::runtime_error(\"Ply validate: illegal whitespace in name \" + properties[iP]->name);\n        }\n      }\n      for (size_t jP = iP + 1; jP < properties.size(); jP++) {\n        if (properties[iP]->name == properties[jP]->name) {\n          throw std::runtime_error(\"Ply validate: multiple properties with name \" + properties[iP]->name);\n        }\n      }\n    }\n\n    // Make sure all properties have right length\n    for (size_t iP = 0; iP < properties.size(); iP++) {\n      if (properties[iP]->size() != count) {\n        throw std::runtime_error(\"Ply validate: property has wrong size. \" + properties[iP]->name +\n                                 \" does not match element size.\");\n      }\n    }\n  }\n\n  /**\n   * @brief Writes out this element's information to the file header.\n   *\n   * @param outStream The stream to use.\n   */\n  void writeHeader(std::ostream& outStream) {\n\n    outStream << \"element \" << name << \" \" << count << \"\\n\";\n\n    for (std::unique_ptr<Property>& p : properties) {\n      p->writeHeader(outStream);\n    }\n  }\n\n  /**\n   * @brief (ASCII writing) Writes out all of the data for every element of this element type to the stream, including\n   * all contained properties.\n   *\n   * @param outStream The stream to write to.\n   */\n  void writeDataASCII(std::ostream& outStream) {\n    // Question: what is the proper output for an element with no properties? Here, we write a blank line, so there is\n    // one line per element no matter what.\n    for (size_t iE = 0; iE < count; iE++) {\n      for (size_t iP = 0; iP < properties.size(); iP++) {\n        properties[iP]->writeDataASCII(outStream, iE);\n        if (iP < properties.size() - 1) {\n          outStream << \" \";\n        }\n      }\n      outStream << \"\\n\";\n    }\n  }\n\n\n  /**\n   * @brief (binary writing) Writes out all of the data for every element of this element type to the stream, including\n   * all contained properties.\n   *\n   * @param outStream The stream to write to.\n   */\n  void writeDataBinary(std::ostream& outStream) {\n    for (size_t iE = 0; iE < count; iE++) {\n      for (size_t iP = 0; iP < properties.size(); iP++) {\n        properties[iP]->writeDataBinary(outStream, iE);\n      }\n    }\n  }\n\n\n  /**\n   * @brief (binary writing) Writes out all of the data for every element of this element type to the stream, including\n   * all contained properties.\n   *\n   * @param outStream The stream to write to.\n   */\n  void writeDataBinaryBigEndian(std::ostream& outStream) {\n    for (size_t iE = 0; iE < count; iE++) {\n      for (size_t iP = 0; iP < properties.size(); iP++) {\n        properties[iP]->writeDataBinaryBigEndian(outStream, iE);\n      }\n    }\n  }\n\n\n  /**\n   * @brief Helper function which does the hard work to implement type promotion for data getters. Throws if type\n   * conversion fails.\n   *\n   * @tparam D The desired output type\n   * @tparam T The current attempt for the actual type of the property\n   * @param prop The property to get (does not delete nor share pointer)\n   *\n   * @return The data, with the requested type\n   */\n  template <class D, class T>\n  std::vector<D> getDataFromPropertyRecursive(Property* prop) {\n\n    typedef typename CanonicalName<T>::type Tcan;\n\n    { // Try to return data of type D from a property of type T\n      TypedProperty<Tcan>* castedProp = dynamic_cast<TypedProperty<Tcan>*>(prop);\n      if (castedProp) {\n        // Succeeded, return a buffer of the data (copy while converting type)\n        std::vector<D> castedVec;\n        castedVec.reserve(castedProp->data.size());\n        for (Tcan& v : castedProp->data) {\n          castedVec.push_back(static_cast<D>(v));\n        }\n        return castedVec;\n      }\n    }\n\n    TypeChain<Tcan> chainType;\n    if (chainType.hasChildType) {\n      return getDataFromPropertyRecursive<D, typename TypeChain<Tcan>::type>(prop);\n    } else {\n      // No smaller type to try, failure\n      throw std::runtime_error(\"PLY parser: property \" + prop->name + \" cannot be coerced to requested type \" +\n                               typeName<D>() + \". Has type \" + prop->propertyTypeName());\n    }\n  }\n\n\n  /**\n   * @brief Helper function which does the hard work to implement type promotion for list data getters. Throws if type\n   * conversion fails.\n   *\n   * @tparam D The desired output type\n   * @tparam T The current attempt for the actual type of the property\n   * @param prop The property to get (does not delete nor share pointer)\n   *\n   * @return The data, with the requested type\n   */\n  template <class D, class T>\n  std::vector<std::vector<D>> getDataFromListPropertyRecursive(Property* prop) {\n    typedef typename CanonicalName<T>::type Tcan;\n\n    TypedListProperty<Tcan>* castedProp = dynamic_cast<TypedListProperty<Tcan>*>(prop);\n    if (castedProp) {\n      // Succeeded, return a buffer of the data (copy while converting type)\n\n      // Convert to flat buffer of new type\n      std::vector<D>* castedFlatVec = nullptr;\n      std::vector<D> castedFlatVecCopy; // we _might_ make a copy here, depending on is_same below\n\n      if (std::is_same<std::vector<D>, std::vector<Tcan>>::value) {\n        // just use the array we already have\n        castedFlatVec = addressIfSame<std::vector<D>>(castedProp->flattenedData, 0 /* dummy arg to disambiguate */);\n      } else {\n        // make a copy\n        castedFlatVecCopy.reserve(castedProp->flattenedData.size());\n        for (Tcan& v : castedProp->flattenedData) {\n          castedFlatVecCopy.push_back(static_cast<D>(v));\n        }\n        castedFlatVec = &castedFlatVecCopy;\n      }\n\n      // Unflatten and return\n      return unflattenList(*castedFlatVec, castedProp->flattenedIndexStart);\n    }\n\n    TypeChain<Tcan> chainType;\n    if (chainType.hasChildType) {\n      return getDataFromListPropertyRecursive<D, typename TypeChain<Tcan>::type>(prop);\n    } else {\n      // No smaller type to try, failure\n      throw std::runtime_error(\"PLY parser: list property \" + prop->name +\n                               \" cannot be coerced to requested type list \" + typeName<D>() + \". Has type list \" +\n                               prop->propertyTypeName());\n    }\n  }\n};\n\n\n// Some string helpers\nnamespace {\n\ninline std::string trimSpaces(const std::string& input) {\n  size_t start = 0;\n  while (start < input.size() && input[start] == ' ') start++;\n  size_t end = input.size();\n  while (end > start && (input[end - 1] == ' ' || input[end - 1] == '\\n' || input[end - 1] == '\\r')) end--;\n  return input.substr(start, end - start);\n}\n\ninline std::vector<std::string> tokenSplit(const std::string& input) {\n  std::vector<std::string> result;\n  size_t curr = 0;\n  size_t found = 0;\n  while ((found = input.find_first_of(' ', curr)) != std::string::npos) {\n    std::string token = input.substr(curr, found - curr);\n    token = trimSpaces(token);\n    if (token.size() > 0) {\n      result.push_back(token);\n    }\n    curr = found + 1;\n  }\n  std::string token = input.substr(curr);\n  token = trimSpaces(token);\n  if (token.size() > 0) {\n    result.push_back(token);\n  }\n\n  return result;\n}\n\ninline bool startsWith(const std::string& input, const std::string& query) {\n  return input.compare(0, query.length(), query) == 0;\n}\n}; // namespace\n\n\n/**\n * @brief Primary class; represents a set of data in the .ply format.\n */\nclass PLYData {\n\npublic:\n  /**\n   * @brief Create an empty PLYData object.\n   */\n  PLYData(){};\n\n  /**\n   * @brief Initialize a PLYData by reading from a file. Throws if any failures occur.\n   *\n   * @param filename The file to read from.\n   * @param verbose If true, print useful info about the file to stdout\n   */\n  PLYData(const std::string& filename, bool verbose = false) {\n\n    using std::cout;\n    using std::endl;\n    using std::string;\n    using std::vector;\n\n    if (verbose) cout << \"PLY parser: Reading ply file: \" << filename << endl;\n\n    // Open a file in binary always, in case it turns out to have binary data.\n    std::ifstream inStream(filename, std::ios::binary);\n    if (inStream.fail()) {\n      throw std::runtime_error(\"PLY parser: Could not open file \" + filename);\n    }\n\n    parsePLY(inStream, verbose);\n\n    if (verbose) {\n      cout << \"  - Finished parsing file.\" << endl;\n    }\n  }\n\n  /**\n   * @brief Initialize a PLYData by reading from a stringstream. Throws if any failures occur.\n   *\n   * @param inStream The stringstream to read from.\n   * @param verbose If true, print useful info about the file to stdout\n   */\n  PLYData(std::istream& inStream, bool verbose = false) {\n\n    using std::cout;\n    using std::endl;\n\n    if (verbose) cout << \"PLY parser: Reading ply file from stream\" << endl;\n\n    parsePLY(inStream, verbose);\n\n    if (verbose) {\n      cout << \"  - Finished parsing stream.\" << endl;\n    }\n  }\n\n  /**\n   * @brief Perform sanity checks on the file, throwing if any fail.\n   */\n  void validate() {\n\n    for (size_t iE = 0; iE < elements.size(); iE++) {\n      for (char c : elements[iE].name) {\n        if (std::isspace(c)) {\n          throw std::runtime_error(\"Ply validate: illegal whitespace in element name \" + elements[iE].name);\n        }\n      }\n      for (size_t jE = iE + 1; jE < elements.size(); jE++) {\n        if (elements[iE].name == elements[jE].name) {\n          throw std::runtime_error(\"Ply validate: duplcate element name \" + elements[iE].name);\n        }\n      }\n    }\n\n    // Do a quick validation sanity check\n    for (Element& e : elements) {\n      e.validate();\n    }\n  }\n\n  /**\n   * @brief Write this data to a .ply file.\n   *\n   * @param filename The file to write to.\n   * @param format The format to use (binary or ascii?)\n   */\n  void write(const std::string& filename, DataFormat format = DataFormat::ASCII) {\n    outputDataFormat = format;\n\n    validate();\n\n    // Open stream for writing\n    std::ofstream outStream(filename, std::ios::out | std::ios::binary);\n    if (!outStream.good()) {\n      throw std::runtime_error(\"Ply writer: Could not open output file \" + filename + \" for writing\");\n    }\n\n    writePLY(outStream);\n  }\n\n  /**\n   * @brief Write this data to an output stream\n   *\n   * @param outStream The output stream to write to.\n   * @param format The format to use (binary or ascii?)\n   */\n  void write(std::ostream& outStream, DataFormat format = DataFormat::ASCII) {\n    outputDataFormat = format;\n\n    validate();\n\n    writePLY(outStream);\n  }\n\n  /**\n   * @brief Get an element type by name (\"vertices\")\n   *\n   * @param target The name of the element type to get\n   *\n   * @return A reference to the element type.\n   */\n  Element& getElement(const std::string& target) {\n    for (Element& e : elements) {\n      if (e.name == target) return e;\n    }\n    throw std::runtime_error(\"PLY parser: no element with name: \" + target);\n  }\n\n\n  /**\n   * @brief Check if an element type exists\n   *\n   * @param target The name to check for.\n   *\n   * @return True if exists.\n   */\n  bool hasElement(const std::string& target) {\n    for (Element& e : elements) {\n      if (e.name == target) return true;\n    }\n    return false;\n  }\n\n\n  /**\n   * @brief A list of the names of all elements\n   *\n   * @return Element names\n   */\n  std::vector<std::string> getElementNames() {\n    std::vector<std::string> names;\n    for (Element& e : elements) {\n      names.push_back(e.name);\n    }\n    return names;\n  }\n\n\n  /**\n   * @brief Add a new element type to the object\n   *\n   * @param name The name of the new element type (\"vertices\").\n   * @param count The number of elements of this type.\n   */\n  void addElement(const std::string& name, size_t count) { elements.emplace_back(name, count); }\n\n  // === Common-case helpers\n\n\n  /**\n   * @brief Common-case helper get mesh vertex positions\n   *\n   * @param vertexElementName The element name to use (default: \"vertex\")\n   *\n   * @return A vector of vertex positions.\n   */\n  std::vector<std::array<double, 3>> getVertexPositions(const std::string& vertexElementName = \"vertex\") {\n\n    std::vector<double> xPos = getElement(vertexElementName).getProperty<double>(\"x\");\n    std::vector<double> yPos = getElement(vertexElementName).getProperty<double>(\"y\");\n    std::vector<double> zPos = getElement(vertexElementName).getProperty<double>(\"z\");\n\n    std::vector<std::array<double, 3>> result(xPos.size());\n    for (size_t i = 0; i < result.size(); i++) {\n      result[i][0] = xPos[i];\n      result[i][1] = yPos[i];\n      result[i][2] = zPos[i];\n    }\n\n    return result;\n  }\n\n  /**\n   * @brief Common-case helper get mesh vertex colors\n   *\n   * @param vertexElementName The element name to use (default: \"vertex\")\n   *\n   * @return A vector of vertex colors (unsigned chars [0,255]).\n   */\n  std::vector<std::array<unsigned char, 3>> getVertexColors(const std::string& vertexElementName = \"vertex\") {\n\n    std::vector<unsigned char> r = getElement(vertexElementName).getProperty<unsigned char>(\"red\");\n    std::vector<unsigned char> g = getElement(vertexElementName).getProperty<unsigned char>(\"green\");\n    std::vector<unsigned char> b = getElement(vertexElementName).getProperty<unsigned char>(\"blue\");\n\n    std::vector<std::array<unsigned char, 3>> result(r.size());\n    for (size_t i = 0; i < result.size(); i++) {\n      result[i][0] = r[i];\n      result[i][1] = g[i];\n      result[i][2] = b[i];\n    }\n\n    return result;\n  }\n\n  /**\n   * @brief Common-case helper to get face indices for a mesh. If not template type is given, size_t is used. Naively\n   * converts to requested signedness, which may lead to unexpected values if an unsigned type is used and file contains\n   * negative values.\n   *\n   * @return The indices into the vertex elements for each face. Usually 0-based, though there are no formal rules.\n   */\n  template <typename T = size_t>\n  std::vector<std::vector<T>> getFaceIndices() {\n\n    for (const std::string& f : std::vector<std::string>{\"face\"}) {\n      for (const std::string& p : std::vector<std::string>{\"vertex_indices\", \"vertex_index\"}) {\n        try {\n          return getElement(f).getListPropertyAnySign<T>(p);\n        } catch (const std::runtime_error&) {\n          // that's fine\n        }\n      }\n    }\n    throw std::runtime_error(\"PLY parser: could not find face vertex indices attribute under any common name.\");\n  }\n\n\n  /**\n   * @brief Common-case helper set mesh vertex positons. Creates vertex element, if necessary.\n   *\n   * @param vertexPositions A vector of vertex positions\n   */\n  void addVertexPositions(std::vector<std::array<double, 3>>& vertexPositions) {\n\n    std::string vertexName = \"vertex\";\n    size_t N = vertexPositions.size();\n\n    // Create the element\n    if (!hasElement(vertexName)) {\n      addElement(vertexName, N);\n    }\n\n    // De-interleave\n    std::vector<double> xPos(N);\n    std::vector<double> yPos(N);\n    std::vector<double> zPos(N);\n    for (size_t i = 0; i < vertexPositions.size(); i++) {\n      xPos[i] = vertexPositions[i][0];\n      yPos[i] = vertexPositions[i][1];\n      zPos[i] = vertexPositions[i][2];\n    }\n\n    // Store\n    getElement(vertexName).addProperty<double>(\"x\", xPos);\n    getElement(vertexName).addProperty<double>(\"y\", yPos);\n    getElement(vertexName).addProperty<double>(\"z\", zPos);\n  }\n\n  /**\n   * @brief Common-case helper set mesh vertex colors. Creates a vertex element, if necessary.\n   *\n   * @param colors A vector of vertex colors (unsigned chars [0,255]).\n   */\n  void addVertexColors(std::vector<std::array<unsigned char, 3>>& colors) {\n\n    std::string vertexName = \"vertex\";\n    size_t N = colors.size();\n\n    // Create the element\n    if (!hasElement(vertexName)) {\n      addElement(vertexName, N);\n    }\n\n    // De-interleave\n    std::vector<unsigned char> r(N);\n    std::vector<unsigned char> g(N);\n    std::vector<unsigned char> b(N);\n    for (size_t i = 0; i < colors.size(); i++) {\n      r[i] = colors[i][0];\n      g[i] = colors[i][1];\n      b[i] = colors[i][2];\n    }\n\n    // Store\n    getElement(vertexName).addProperty<unsigned char>(\"red\", r);\n    getElement(vertexName).addProperty<unsigned char>(\"green\", g);\n    getElement(vertexName).addProperty<unsigned char>(\"blue\", b);\n  }\n\n  /**\n   * @brief Common-case helper set mesh vertex colors. Creates a vertex element, if necessary.\n   *\n   * @param colors A vector of vertex colors as floating point [0,1] values. Internally converted to [0,255] chars.\n   */\n  void addVertexColors(std::vector<std::array<double, 3>>& colors) {\n\n    std::string vertexName = \"vertex\";\n    size_t N = colors.size();\n\n    // Create the element\n    if (!hasElement(vertexName)) {\n      addElement(vertexName, N);\n    }\n\n    auto toChar = [](double v) {\n      if (v < 0.0) v = 0.0;\n      if (v > 1.0) v = 1.0;\n      return static_cast<unsigned char>(v * 255.);\n    };\n\n    // De-interleave\n    std::vector<unsigned char> r(N);\n    std::vector<unsigned char> g(N);\n    std::vector<unsigned char> b(N);\n    for (size_t i = 0; i < colors.size(); i++) {\n      r[i] = toChar(colors[i][0]);\n      g[i] = toChar(colors[i][1]);\n      b[i] = toChar(colors[i][2]);\n    }\n\n    // Store\n    getElement(vertexName).addProperty<unsigned char>(\"red\", r);\n    getElement(vertexName).addProperty<unsigned char>(\"green\", g);\n    getElement(vertexName).addProperty<unsigned char>(\"blue\", b);\n  }\n\n\n  /**\n   * @brief Common-case helper to set face indices. Creates a face element if needed. The input type will be casted to a\n   * 32 bit integer of the same signedness.\n   *\n   * @param indices The indices into the vertex list around each face.\n   */\n  template <typename T>\n  void addFaceIndices(std::vector<std::vector<T>>& indices) {\n\n    std::string faceName = \"face\";\n    size_t N = indices.size();\n\n    // Create the element\n    if (!hasElement(faceName)) {\n      addElement(faceName, N);\n    }\n\n    // Cast to 32 bit\n    typedef typename std::conditional<std::is_signed<T>::value, int32_t, uint32_t>::type IndType;\n    std::vector<std::vector<IndType>> intInds;\n    for (std::vector<T>& l : indices) {\n      std::vector<IndType> thisInds;\n      for (T& val : l) {\n        IndType valConverted = static_cast<IndType>(val);\n        if (valConverted != val) {\n          throw std::runtime_error(\"Index value \" + std::to_string(val) +\n                                   \" could not be converted to a .ply integer without loss of data. Note that .ply \"\n                                   \"only supports 32-bit ints.\");\n        }\n        thisInds.push_back(valConverted);\n      }\n      intInds.push_back(thisInds);\n    }\n\n    // Store\n    getElement(faceName).addListProperty<IndType>(\"vertex_indices\", intInds);\n  }\n\n\n  /**\n   * @brief Comments for the file. When writing, each entry will be written as a sequential comment line.\n   */\n  std::vector<std::string> comments;\n\n\n  /**\n   * @brief obj_info comments for the file. When writing, each entry will be written as a sequential comment line.\n   */\n  std::vector<std::string> objInfoComments;\n\nprivate:\n  std::vector<Element> elements;\n  const int majorVersion = 1; // I'll buy you a drink if these ever get bumped\n  const int minorVersion = 0;\n\n  DataFormat inputDataFormat = DataFormat::ASCII;  // set when reading from a file\n  DataFormat outputDataFormat = DataFormat::ASCII; // option for writing files\n\n\n  // === Reading ===\n\n  /**\n   * @brief Parse a PLY file from an input stream\n   *\n   * @param inStream\n   * @param verbose\n   */\n  void parsePLY(std::istream& inStream, bool verbose) {\n\n    // == Process the header\n    parseHeader(inStream, verbose);\n\n\n    // === Parse data from a binary file\n    if (inputDataFormat == DataFormat::Binary) {\n      parseBinary(inStream, verbose);\n    }\n    // === Parse data from an binary file\n    else if (inputDataFormat == DataFormat::BinaryBigEndian) {\n      parseBinaryBigEndian(inStream, verbose);\n    }\n    // === Parse data from an ASCII file\n    else if (inputDataFormat == DataFormat::ASCII) {\n      parseASCII(inStream, verbose);\n    }\n  }\n\n  /**\n   * @brief Read the header for a file\n   *\n   * @param inStream\n   * @param verbose\n   */\n  void parseHeader(std::istream& inStream, bool verbose) {\n\n    using std::cout;\n    using std::endl;\n    using std::string;\n    using std::vector;\n\n    // First two lines are predetermined\n    { // First line is magic constant\n      string plyLine;\n      std::getline(inStream, plyLine);\n      if (trimSpaces(plyLine) != \"ply\") {\n        throw std::runtime_error(\"PLY parser: File does not appear to be ply file. First line should be 'ply'\");\n      }\n    }\n\n    { // second line is version\n      string styleLine;\n      std::getline(inStream, styleLine);\n      vector<string> tokens = tokenSplit(styleLine);\n      if (tokens.size() != 3) throw std::runtime_error(\"PLY parser: bad format line\");\n      std::string formatStr = tokens[0];\n      std::string typeStr = tokens[1];\n      std::string versionStr = tokens[2];\n\n      // \"format\"\n      if (formatStr != \"format\") throw std::runtime_error(\"PLY parser: bad format line\");\n\n      // ascii/binary\n      if (typeStr == \"ascii\") {\n        inputDataFormat = DataFormat::ASCII;\n        if (verbose) cout << \"  - Type: ascii\" << endl;\n      } else if (typeStr == \"binary_little_endian\") {\n        inputDataFormat = DataFormat::Binary;\n        if (verbose) cout << \"  - Type: binary\" << endl;\n      } else if (typeStr == \"binary_big_endian\") {\n        inputDataFormat = DataFormat::BinaryBigEndian;\n        if (verbose) cout << \"  - Type: binary big endian\" << endl;\n      } else {\n        throw std::runtime_error(\"PLY parser: bad format line\");\n      }\n\n      // version\n      if (versionStr != \"1.0\") {\n        throw std::runtime_error(\"PLY parser: encountered file with version != 1.0. Don't know how to parse that\");\n      }\n      if (verbose) cout << \"  - Version: \" << versionStr << endl;\n    }\n\n    // Consume header line by line\n    while (inStream.good()) {\n      string line;\n      std::getline(inStream, line);\n\n      // Parse a comment\n      if (startsWith(line, \"comment\")) {\n        string comment = line.substr(8);\n        if (verbose) cout << \"  - Comment: \" << comment << endl;\n        comments.push_back(comment);\n        continue;\n      }\n\n      // Parse an obj_info comment\n      if (startsWith(line, \"obj_info\")) {\n        string infoComment = line.substr(9);\n        if (verbose) cout << \"  - obj_info: \" << infoComment << endl;\n        objInfoComments.push_back(infoComment);\n        continue;\n      }\n\n      // Parse an element\n      else if (startsWith(line, \"element\")) {\n        vector<string> tokens = tokenSplit(line);\n        if (tokens.size() != 3) throw std::runtime_error(\"PLY parser: Invalid element line\");\n        string name = tokens[1];\n        size_t count;\n        std::istringstream iss(tokens[2]);\n        iss >> count;\n        elements.emplace_back(name, count);\n        if (verbose) cout << \"  - Found element: \" << name << \" (count = \" << count << \")\" << endl;\n        continue;\n      }\n\n      // Parse a property list\n      else if (startsWith(line, \"property list\")) {\n        vector<string> tokens = tokenSplit(line);\n        if (tokens.size() != 5) throw std::runtime_error(\"PLY parser: Invalid property list line\");\n        if (elements.size() == 0) throw std::runtime_error(\"PLY parser: Found property list without previous element\");\n        string countType = tokens[2];\n        string type = tokens[3];\n        string name = tokens[4];\n        elements.back().properties.push_back(createPropertyWithType(name, type, true, countType));\n        if (verbose)\n          cout << \"    - Found list property: \" << name << \" (count type = \" << countType << \", data type = \" << type\n               << \")\" << endl;\n        continue;\n      }\n\n      // Parse a property\n      else if (startsWith(line, \"property\")) {\n        vector<string> tokens = tokenSplit(line);\n        if (tokens.size() != 3) throw std::runtime_error(\"PLY parser: Invalid property line\");\n        if (elements.size() == 0) throw std::runtime_error(\"PLY parser: Found property without previous element\");\n        string type = tokens[1];\n        string name = tokens[2];\n        elements.back().properties.push_back(createPropertyWithType(name, type, false, \"\"));\n        if (verbose) cout << \"    - Found property: \" << name << \" (type = \" << type << \")\" << endl;\n        continue;\n      }\n\n      // Parse end of header\n      else if (startsWith(line, \"end_header\")) {\n        break;\n      }\n\n      // Error!\n      else {\n        throw std::runtime_error(\"Unrecognized header line: \" + line);\n      }\n    }\n  }\n\n  /**\n   * @brief Read the actual data for a file, in ASCII\n   *\n   * @param inStream\n   * @param verbose\n   */\n  void parseASCII(std::istream& inStream, bool verbose) {\n\n    using std::string;\n    using std::vector;\n\n    // Read all elements\n    for (Element& elem : elements) {\n\n      if (verbose) {\n        std::cout << \"  - Processing element: \" << elem.name << std::endl;\n      }\n\n      for (size_t iP = 0; iP < elem.properties.size(); iP++) {\n        elem.properties[iP]->reserve(elem.count);\n      }\n      for (size_t iEntry = 0; iEntry < elem.count; iEntry++) {\n\n        string line;\n        std::getline(inStream, line);\n\n        // Some .ply files seem to include empty lines before the start of property data (though this is not specified\n        // in the format description). We attempt to recover and parse such files by skipping any empty lines.\n        if (!elem.properties.empty()) { // if the element has no properties, the line _should_ be blank, presumably\n          while (line.empty()) { // skip lines until we hit something nonempty\n            std::getline(inStream, line);\n          }\n        }\n\n        vector<string> tokens = tokenSplit(line);\n        size_t iTok = 0;\n        for (size_t iP = 0; iP < elem.properties.size(); iP++) {\n          elem.properties[iP]->parseNext(tokens, iTok);\n        }\n      }\n    }\n  }\n\n  /**\n   * @brief Read the actual data for a file, in binary.\n   *\n   * @param inStream\n   * @param verbose\n   */\n  void parseBinary(std::istream& inStream, bool verbose) {\n\n    if (!isLittleEndian()) {\n      throw std::runtime_error(\"binary reading assumes little endian system\");\n    }\n\n    using std::string;\n    using std::vector;\n\n    // Read all elements\n    for (Element& elem : elements) {\n\n      if (verbose) {\n        std::cout << \"  - Processing element: \" << elem.name << std::endl;\n      }\n\n      for (size_t iP = 0; iP < elem.properties.size(); iP++) {\n        elem.properties[iP]->reserve(elem.count);\n      }\n      for (size_t iEntry = 0; iEntry < elem.count; iEntry++) {\n        for (size_t iP = 0; iP < elem.properties.size(); iP++) {\n          elem.properties[iP]->readNext(inStream);\n        }\n      }\n    }\n  }\n\n  /**\n   * @brief Read the actual data for a file, in binary.\n   *\n   * @param inStream\n   * @param verbose\n   */\n  void parseBinaryBigEndian(std::istream& inStream, bool verbose) {\n\n    if (!isLittleEndian()) {\n      throw std::runtime_error(\"binary reading assumes little endian system\");\n    }\n\n    using std::string;\n    using std::vector;\n\n    // Read all elements\n    for (Element& elem : elements) {\n\n      if (verbose) {\n        std::cout << \"  - Processing element: \" << elem.name << std::endl;\n      }\n\n      for (size_t iP = 0; iP < elem.properties.size(); iP++) {\n        elem.properties[iP]->reserve(elem.count);\n      }\n      for (size_t iEntry = 0; iEntry < elem.count; iEntry++) {\n        for (size_t iP = 0; iP < elem.properties.size(); iP++) {\n          elem.properties[iP]->readNextBigEndian(inStream);\n        }\n      }\n    }\n  }\n\n  // === Writing ===\n\n\n  /**\n   * @brief write a PLY file to an output stream\n   *\n   * @param outStream\n   */\n  void writePLY(std::ostream& outStream) {\n\n    writeHeader(outStream);\n\n    // Write all elements\n    for (Element& e : elements) {\n      if (outputDataFormat == DataFormat::Binary) {\n        if (!isLittleEndian()) {\n          throw std::runtime_error(\"binary writing assumes little endian system\");\n        }\n        e.writeDataBinary(outStream);\n      } else if (outputDataFormat == DataFormat::BinaryBigEndian) {\n        if (!isLittleEndian()) {\n          throw std::runtime_error(\"binary writing assumes little endian system\");\n        }\n        e.writeDataBinaryBigEndian(outStream);\n      } else if (outputDataFormat == DataFormat::ASCII) {\n        e.writeDataASCII(outStream);\n      }\n    }\n  }\n\n\n  /**\n   * @brief Write out a header for a file\n   *\n   * @param outStream\n   */\n  void writeHeader(std::ostream& outStream) {\n\n    // Magic line\n    outStream << \"ply\\n\";\n\n    // Type line\n    outStream << \"format \";\n    if (outputDataFormat == DataFormat::Binary) {\n      outStream << \"binary_little_endian \";\n    } else if (outputDataFormat == DataFormat::BinaryBigEndian) {\n      outStream << \"binary_big_endian \";\n    } else if (outputDataFormat == DataFormat::ASCII) {\n      outStream << \"ascii \";\n    }\n\n    // Version number\n    outStream << majorVersion << \".\" << minorVersion << \"\\n\";\n\n    // Write comments\n    bool hasHapplyComment = false;\n    std::string happlyComment = \"Written with hapPLY (https://github.com/nmwsharp/happly)\";\n    for (const std::string& comment : comments) {\n      if (comment == happlyComment) hasHapplyComment = true;\n      outStream << \"comment \" << comment << \"\\n\";\n    }\n    if (!hasHapplyComment) {\n      outStream << \"comment \" << happlyComment << \"\\n\";\n    }\n\n    // Write obj_info comments\n    for (const std::string& comment : objInfoComments) {\n      outStream << \"obj_info \" << comment << \"\\n\";\n    }\n\n    // Write elements (and their properties)\n    for (Element& e : elements) {\n      e.writeHeader(outStream);\n    }\n\n    // End header\n    outStream << \"end_header\\n\";\n  }\n};\n\n} // namespace happly\n"
  },
  {
    "path": "src/asp/Rig/theia_flags.txt",
    "content": "############### Input/Output ###############\n# Input/output files.\n# Set these if a matches file is not present. Images should be a filepath with a\n# wildcard e.g., /home/my_username/my_images/*.jpg\n# These should be left empty if specified on the command line.\n--images=\n--output_matches_file=\n\n# If a matches file has already been created, set the filepath here. This avoids\n# having to recompute all features and matches.\n# This should be left empty if specified on the command line.\n--matches_file=\n\n# The calibration file indicates possibly known calibration e.g, from EXIF or\n# explicit calibration. Theia attempts to extract EXIF focal lengths if calibration\n# is not supplied for a given image.\n# These should be left empty if specified on the command line.\n--calibration_file=\n--output_reconstruction=\n\n############### Multithreading ###############\n# Set to the number of threads you want to use.\n--num_threads=16\n\n############### Feature Extraction ###############\n--descriptor=SIFT\n--feature_density=NORMAL\n\n############### Matching Options ###############\n# Perform matching out-of-core. If set to true, the matching_working_directory\n# must be set to a valid, writable directory (the directory will be created if\n# it does not exits) Set to false to perform all-in-memory matching.\n--match_out_of_core=true\n\n# During feature matching, features are saved to disk so that out-of-core\n# matching may be performed. This directory specifies which directory those\n# features should be saved to.\n# This should be left empty if specified on the command line.\n--matching_working_directory=\n\n# During feature matching we utilize an LRU cache for out-of-core matching. The size\n# of that cache (in terms of number of images) is controlled by this parameter. The\n# higher this number the more memory is required.\n--matching_max_num_images_in_cache=128\n\n--matching_strategy=CASCADE_HASHING\n--lowes_ratio=0.8\n--min_num_inliers_for_valid_match=5\n# NOTE: This threshold is relative to an image with a width of 1024 pixels. It\n# will be scaled appropriately based on the image resolutions. This allows a\n# single threshold to be used for images with different resolutions.\n--max_sampson_error_for_verified_match=10.0\n--bundle_adjust_two_view_geometry=true\n--keep_only_symmetric_matches=true\n\n# Global descriptor extractor settings. The global image descriptors are used to\n# speed up matching by selected the K most similar images for each image, and\n# only performing feature matching with these images.\n--num_nearest_neighbors_for_global_descriptor_matching=100\n--num_gmm_clusters_for_fisher_vector=16\n--max_num_features_for_fisher_vector_training=1000000\n\n############### General SfM Options ###############\n--reconstruction_estimator=GLOBAL\n--min_track_length=2\n--max_track_length=50\n--reconstruct_largest_connected_component=true\n\n# Set to true if all views were captured with the same camera. If true, then a\n# single set of camera intrinsic parameters will be used for all views in the\n# reconstruction.\n--shared_calibration=false\n\n# If set to true, only views with known calibration are reconstructed.\n--only_calibrated_views=true\n\n############### Global SfM Options ###############\n--global_position_estimator=LEAST_UNSQUARED_DEVIATION\n--global_rotation_estimator=ROBUST_L1L2\n# The value below should be bigger to filter less\n--post_rotation_filtering_degrees=20\n\n# This refinement is very unstable for rotation-only motions so\n# it is advised that this is set to false for these motions.\n--refine_relative_translations_after_rotation_estimation=false\n\n# If true, only cameras that are well-conditioned for position estimation will\n# be used for global position estimation\n--extract_maximal_rigid_subgraph=false\n\n# Filter the relative translations with the 1DSfM filter to remove potential\n# outliers in the relative pose measurements.\n--filter_relative_translations_with_1dsfm=true\n\n# Nonlinear position estimation options\n--position_estimation_min_num_tracks_per_view=0\n--position_estimation_robust_loss_width=0.1\n\n# If true, perform a single iteration of bundle adjustment only on the camera\n# positions and 3D points (rotation and camera intrinsics are held\n# constant). This helps often to constrain inaccurate intrinsics.\n--refine_camera_positions_and_points_after_position_estimation=true\n\n# After estimating camera poses, we perform trianguation, then BA,\n# then filter out bad points. This controls how many times we repeat\n# this process.\n--num_retriangulation_iterations=1\n\n############### Incremental SfM Options ###############\n# NOTE: This threshold is relative to an image with a width of 1024 pixels. It\n# will be scaled appropriately based on the image resolutions. This allows a\n# single threshold to be used for images with different resolutions.\n--absolute_pose_reprojection_error_threshold=10\n--partial_bundle_adjustment_num_views=20\n--full_bundle_adjustment_growth_percent=5\n--min_num_absolute_pose_inliers=30\n\n############### Bundle Adjustment Options ###############\n# Set this parameter to a value other than NONE if you want to utilize a robust\n# cost function during bundle adjustment. This can increase robustness to outliers\n# during the optimization.\n--bundle_adjustment_robust_loss_function=CAUCHY\n\n# Set this value to the determine the reprojection error in pixels at which\n# robustness begins (if a robust cost function is being used).\n--bundle_adjustment_robust_loss_width=2.0\n\n# Set this parameter to change which camera intrinsics should be\n# optimized. Valid options are NONE, ALL, FOCAL_LENGTH, PRINCIPAL_POINTS,\n# RADIAL_DISTORTION, ASPECT_RATIO, and SKEW. This parameter can be set using a\n# bitmask (with no spaces) e.g., FOCAL_LENGTH|RADIAL_DISTORTION\n--intrinsics_to_optimize=NONE\n\n# After BA, remove any points that have a reprojection error greater\n# than this.\n--max_reprojection_error_pixels=50.0\n\n############### Track Subsampling Options ###############\n\n# If true, the estimated tracks are subsampled for bundle adjustment to increase\n# the efficiency of BA. Tracks are chosen in a way which attempts to constraint\n# BA as best as possible. This has been shown to provide a significant speedup\n# without reducing the accuracy much (in fact, it increases the accuracy in some\n# cases).\n--subsample_tracks_for_bundle_adjustment=false\n\n# Subsampled tracks are chosen with a probability related to their track\n# length. We limit the effect of long tracks by capping the track length at this\n# value for the purpose of selecting tracks.\n--track_subset_selection_long_track_length_threshold=10\n\n# Tracks are chosen in a way that ensures each view is spatially\n# constrained. Tracks are first binned in an image grid and the top ranked track\n# is chosen for optimization from each grid cell to ensure good spatial coverage\n# of the image. The grid cells are set to be this size.\n--track_selection_image_grid_cell_size_pixels=100\n\n# Tracks are chosen such that each image observes at least this many tracks\n#  which are being optimized. This ensures that each image is well-constrained.\n--min_num_optimized_tracks_per_view=100\n\n############### Triangulation Options ###############\n--min_triangulation_angle_degrees=0.2\n--triangulation_reprojection_error_pixels=50.0\n--bundle_adjust_tracks=true\n\n############### Logging Options ###############\n# Logging verbosity.\n--logtostderr\n# Increase this number to get more verbose logging.\n--v=1\n"
  },
  {
    "path": "src/asp/Sessions/BundleAdjustParse.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// \\file BundleAdjustParse.cc.\n\n// Parse and validate bundle_adjust options. This makes use of StereoSession so\n// must be in this directory.\n\n#include <asp/Sessions/BundleAdjustParse.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Sessions/StereoSessionFactory.h>\n#include <asp/Core/AspProgramOptions.h>\n#include <asp/Core/AspLog.h>\n#include <asp/Sessions/CameraUtils.h>\n#include <asp/Core/Bathymetry.h>\n#include <asp/Core/FileUtils.h>\n#include <asp/Core/PointUtils.h>\n\n#include <vw/Cartography/DatumUtils.h>\n#include <vw/FileIO/FileUtils.h>\n#include <vw/FileIO/FileTypes.h>\n#include <vw/FileIO/MatrixIO.h>\n\n#include <boost/filesystem.hpp>\n#include <boost/program_options.hpp>\n\nnamespace po = boost::program_options;\nnamespace fs = boost::filesystem;\n\nnamespace asp {\n\n// Validate the bundle_adjust options. This modifies the options structure.\nvoid loadValidateBaOptions(po::variables_map const& vm,\n                           bool inline_adjustments,\n                           asp::BaOptions &opt) {\n\n  // Create the output directory\n  vw::create_out_dir(opt.out_prefix);\n\n  // These must be done early\n  boost::to_lower(opt.stereo_session);\n  boost::to_lower(opt.cost_function);\n\n  // Separate out GCP files\n  bool rm_from_input_list = true;\n  opt.gcp_files = vw::get_files_with_ext(opt.image_files, \".gcp\", rm_from_input_list);\n\n  // Handle the situation when the images and cameras are in lists\n  if (!opt.image_list.empty()) {\n    // Read the images and cameras and put them in 'images_or_cams' to be parsed later\n    if (!opt.image_files.empty())\n      vw::vw_throw(vw::ArgumentErr() << \"The option --image-list was specified, but also \"\n               << \"images or cameras on the command line.\\n\");\n\n    // Read image and camera lists. Consider he case of sharing intrinsics per sensor.\n    read_image_cam_lists(opt.image_list, opt.camera_list,\n                         opt.image_files, opt.camera_files,\n                         opt.intrinsics_options); // outputs\n  } else {\n    // The images and cameras are passed on the command line\n    std::vector<std::string> images_or_cams = opt.image_files;\n    bool ensure_equal_sizes = true;\n    asp::separate_images_from_cameras(images_or_cams,\n                                      opt.image_files, opt.camera_files, // outputs\n                                      ensure_equal_sizes);\n  }\n\n  // Sanity checks\n  if (!opt.mapprojected_data_list.empty() && opt.image_list.empty())\n    vw::vw_throw(vw::ArgumentErr() << \"Found --mapprojected-data-list, \"\n             << \"but not --image-list.\\n\");\n  if (!opt.mapprojected_data.empty() && !opt.mapprojected_data_list.empty())\n    vw::vw_throw(vw::ArgumentErr() << \"Cannot specify both --mapprojected-data and \"\n             << \"--mapprojected-data-list.\\n\");\n\n  // Sanity checks\n  asp::check_for_duplicates(opt.image_files, opt.camera_files, opt.out_prefix);\n  if (opt.image_files.size() != (int)opt.camera_files.size()) {\n    vw::vw_out() << \"Detected \" << opt.image_files.size() << \" images and \"\n             << opt.camera_files.size() << \" cameras.\\n\";\n    vw::vw_throw(vw::ArgumentErr() << \"Must have as many cameras as images.\\n\");\n  }\n  if (opt.image_files.empty())\n    vw::vw_throw(vw::ArgumentErr() << \"Missing input image files.\\n\");\n\n  // Guess the session if not provided. Do this as soon as we have\n  // the cameras figured out.\n  asp::SessionPtr session(NULL);\n  if (opt.stereo_session.empty())\n    session = asp::StereoSessionFactory::create\n                        (opt.stereo_session, // may change\n                         opt, opt.image_files[0], opt.image_files[0],\n                         opt.camera_files[0], opt.camera_files[0],\n                         opt.out_prefix);\n\n  // Reusing match files implies that we skip matching\n  if (opt.clean_match_files_prefix != \"\" || opt.match_files_prefix != \"\" ||\n      opt.isis_cnet != \"\" || opt.nvm != \"\")\n    opt.skip_matching = true;\n\n  // If opt.output_cnet_type is not set, set it to the same format as the input\n  if (opt.output_cnet_type == \"\") {\n    if (opt.isis_cnet != \"\")\n      opt.output_cnet_type = \"isis-cnet\";\n    else if (opt.nvm != \"\")\n      opt.output_cnet_type = \"nvm\";\n    else\n      opt.output_cnet_type = \"match-files\";\n  }\n  // Sanity check in case the user set this option manually.\n  if (opt.output_cnet_type != \"match-files\" && opt.output_cnet_type != \"isis-cnet\" &&\n      opt.output_cnet_type != \"nvm\")\n    vw::vw_throw(vw::ArgumentErr() << \"Unknown value for --output-cnet-type: \"\n                           << opt.output_cnet_type << \".\\n\");\n\n  //  When skipping matching, we are already forced to reuse match\n  //  files based on the logic in the code, but here enforce it\n  //  explicitly anyway.\n  if (opt.skip_matching)\n    opt.force_reuse_match_files = true;\n\n    // Must specify either csv_srs or csv_proj4_str, but not both. The latter is\n  // for backward compatibility.\n  if (!opt.csv_srs.empty() && !opt.csv_proj4_str.empty())\n    vw::vw_throw(vw::ArgumentErr() << \"Cannot specify both --csv-srs and --csv-proj4.\\n\");\n  if (!opt.csv_proj4_str.empty() && opt.csv_srs.empty())\n    opt.csv_srs = opt.csv_proj4_str;\n\n  // Sanity checks for solving for intrinsics\n  if (opt.intrinsics_options.share_intrinsics_per_sensor && !opt.solve_intrinsics)\n    vw::vw_throw(vw::ArgumentErr()\n      << \"Must set --solve-intrinsics to solve for intrinsics per sensor.\\n\");\n  if (opt.solve_intrinsics && !inline_adjustments) {\n    vw::vw_out() << \"Solving for intrinsics, so assuming --inline-adjustments.\\n\";\n    inline_adjustments = true;\n  }\n\n  // Work out the camera model type. This must happen before early.\n  // Cameras are not loaded yet.\n  // TODO(oalexan1): Maybe we need to load cameras by now?\n  opt.camera_type = BaCameraType_Other;\n  if (inline_adjustments) {\n    if ((opt.stereo_session == \"pinhole\") ||\n        (opt.stereo_session == \"nadirpinhole\"))\n      opt.camera_type = BaCameraType_Pinhole;\n    else if (opt.stereo_session == \"opticalbar\")\n        opt.camera_type = BaCameraType_OpticalBar;\n    else if (opt.stereo_session == \"csm\")\n      opt.camera_type = BaCameraType_CSM;\n    else\n      vw::vw_throw(vw::ArgumentErr() << \"Cannot use inline adjustments with session: \"\n                << opt.stereo_session << \".\\n\");\n  }\n\n  // Solving for intrinsics requires working harder to push the error down\n  if (opt.solve_intrinsics && vm[\"parameter-tolerance\"].defaulted())\n    opt.parameter_tolerance = 1e-12;\n\n  // Sharing intrinsics per sensor is not supported with reference terrain.\n  // It would be too much work to fix the BaDispXyzError() cost function in that\n  // case. Would need to handle all intrinsics being shared, only shared per sensor,\n  // and none being shared. Same with random passes, there also new logic is needed.\n  if (opt.intrinsics_options.share_intrinsics_per_sensor) {\n    if (opt.reference_terrain != \"\")\n      vw::vw_throw(vw::ArgumentErr() << \"Cannot share intrinsics per sensor with \"\n        << \"--reference-terrain.\\n\");\n    if (opt.num_random_passes > 0)\n      vw::vw_throw(vw::ArgumentErr() << \"Cannot share intrinsics per sensor with \"\n        << \"--num-random-passes.\\n\");\n  }\n\n  bool external_matches = (!opt.clean_match_files_prefix.empty() ||\n                           !opt.match_files_prefix.empty());\n  if (external_matches && (opt.isis_cnet != \"\" || opt.nvm != \"\"))\n    vw::vw_throw(vw::ArgumentErr() << \"Cannot use more than one of: ISIS cnet, nvm file, \"\n             << \"match files.\\n\");\n\n  if (opt.transform_cameras_using_gcp &&\n      (!inline_adjustments) &&\n      (opt.camera_type != BaCameraType_Pinhole)) {\n    vw::vw_throw(vw::ArgumentErr() << \"Transforming cameras using GCP works only for pinhole \"\n              << \"cameras and with the --inline-adjustments flag.\\n\");\n  }\n\n  if (opt.overlap_list_file != \"\" && opt.overlap_limit > 0)\n    vw::vw_throw(vw::ArgumentErr()\n              << \"Cannot specify both the overlap limit and the overlap list.\\n\");\n\n  if (opt.overlap_list_file != \"\" && opt.match_first_to_last > 0)\n    vw::vw_throw(vw::ArgumentErr()\n      << \"Cannot specify both the overlap limit and --match-first-to-last.\\n\");\n\n  if (opt.overlap_limit < 0)\n    vw::vw_throw(vw::ArgumentErr() << \"Must allow search for matches between \"\n      << \"at least each image and its subsequent one.\\n\");\n\n  if (int(opt.overlap_list_file != \"\") + int(!vm[\"auto-overlap-buffer\"].defaulted()) +\n      int(opt.auto_overlap_params != \"\") + int(opt.overlap_limit > 0) > 1)\n    vw::vw_throw(vw::ArgumentErr() << \"Cannot specify more than one of --overlap-list, \"\n              << \"--auto-overlap-params, --overlap-limit, and --auto-overlap-buffer.\\n\");\n\n  // By default, try to match all of the images\n  if (opt.overlap_limit == 0)\n    opt.overlap_limit = opt.image_files.size();\n\n  opt.have_overlap_list = false;\n  if (opt.overlap_list_file != \"\") {\n   opt.have_overlap_list = true;\n    if (!fs::exists(opt.overlap_list_file))\n      vw::vw_throw(vw::ArgumentErr() << \"The overlap list does not exist.\\n\");\n    opt.overlap_list.clear();\n    std::string image1, image2;\n    std::ifstream ifs(opt.overlap_list_file.c_str());\n    while (ifs >> image1 >> image2) {\n      opt.overlap_list.insert(std::make_pair(image1, image2));\n      opt.overlap_list.insert(std::make_pair(image2, image1));\n    }\n    ifs.close();\n  } else if (!vm[\"auto-overlap-buffer\"].defaulted()) {\n    opt.have_overlap_list = true;\n    auto_build_overlap_list(opt, opt.auto_overlap_buffer);\n  }\n  // The third alternative, --auto-overlap-params will be handled when we have cameras\n\n  if (opt.camera_weight < 0.0)\n    vw::vw_throw(vw::ArgumentErr() << \"The camera weight must be non-negative.\\n\");\n\n  if (opt.rotation_weight < 0.0)\n    vw::vw_throw(vw::ArgumentErr() << \"The rotation weight must be non-negative.\\n\");\n\n  if (opt.camera_position_weight < 0.0)\n    vw::vw_throw(vw::ArgumentErr() << \"The camera position weight must be non-negative.\\n\");\n\n  if (opt.tri_weight < 0.0)\n    vw::vw_throw(vw::ArgumentErr() << \"The triangulation weight must be non-negative.\\n\");\n\n  // NOTE(oalexan1): The reason min_triangulation_angle cannot be 0 is deep inside\n  // StereoModel.cc. Better keep it this way than make too many changes there.\n  if (opt.min_triangulation_angle <= 0.0)\n    vw::vw_throw(vw::ArgumentErr() << \"The minimum triangulation angle must be positive.\\n\");\n\n  // TODO: Make sure the normal model loading catches this error.\n  //if (opt.create_pinhole && !vw::has_pinhole_extension(opt.camera_files[0]))\n  // vw::vw_throw(vw::ArgumentErr() \n  //    << \"Cannot use special pinhole handling with non-pinhole input!\\n\");\n\n  if ((opt.camera_type == BaCameraType_Other) && opt.solve_intrinsics)\n    vw::vw_throw(vw::ArgumentErr() \n                 << \"Solving for intrinsic parameters is only supported with \"\n                 << \"pinhole, optical bar, and CSM cameras.\\n\");\n\n  if ((opt.camera_type!=BaCameraType_Pinhole) && opt.approximate_pinhole_intrinsics)\n    vw::vw_throw(vw::ArgumentErr() \n                 << \"Cannot approximate intrinsics unless using pinhole cameras.\\n\");\n\n  if (opt.approximate_pinhole_intrinsics && opt.solve_intrinsics)\n    vw::vw_throw(vw::ArgumentErr() \n                 << \"Cannot approximate intrinsics while solving for them.\\n\");\n\n  if (opt.camera_type != BaCameraType_Other   &&\n      opt.camera_type != BaCameraType_Pinhole &&\n      opt.camera_type != BaCameraType_CSM     &&\n      opt.input_prefix != \"\")\n    vw::vw_throw(vw::ArgumentErr() << \"Can only use initial adjustments with camera type \"\n              << \"'pinhole', 'csm', or 'other'. Here likely having optical bar cameras.\\n\");\n\n  vw::string_replace(opt.remove_outliers_params_str, \",\", \" \"); // replace any commas\n  opt.remove_outliers_params = vw::str_to_vec<vw::Vector<double, 4>>(opt.remove_outliers_params_str);\n\n  // Ensure good order\n  if (opt.lon_lat_limit != vw::BBox2(0,0,0,0)) {\n    if (opt.lon_lat_limit.min().y() > opt.lon_lat_limit.max().y())\n      std::swap(opt.lon_lat_limit.min().y(), opt.lon_lat_limit.max().y());\n    if (opt.lon_lat_limit.min().x() > opt.lon_lat_limit.max().x())\n      std::swap(opt.lon_lat_limit.min().x(), opt.lon_lat_limit.max().x());\n  }\n\n  if (!opt.camera_position_file.empty() && opt.csv_format_str == \"\")\n    vw::vw_throw(vw::ArgumentErr() << \"When using a camera position file, the csv-format \"\n              << \"option must be set.\\n\");\n\n  if (opt.max_pairwise_matches < 0)\n    vw::vw_throw(vw::ArgumentErr()\n                 << \"The value of --max-pairwise-matches must be non-negative.\\n\");\n  if (opt.max_pairwise_matches == 0)\n    vw::vw_out(vw::WarningMessage)\n      << \"Setting --max-pairwise-matches to 0 will result in no matches being \"\n      << \"loaded. Only GCP will constrain the solution.\\n\";\n\n  // Copy the IP settings to the global stereo_settings() object\n  opt.copy_to_asp_settings();\n\n  // Try to infer the datum, if possible, from the images. For\n  // example, Cartosat-1 has that info in the Tif file.\n  bool have_datum = false;\n  // For pinhole session the guessed datum may be unreliable, so warn only\n  bool warn_only = (opt.stereo_session.find(\"pinhole\") != std::string::npos);\n\n  vw::cartography::GeoReference georef;\n  for (size_t it = 0; it < opt.image_files.size(); it++) {\n    bool is_good = vw::cartography::read_georeference(georef, opt.image_files[it]);\n\n    // Must check the consistency of the datums\n    if (is_good && have_datum)\n      vw::checkDatumConsistency(opt.datum, georef.datum(), warn_only);\n\n    if (is_good && !have_datum) {\n      opt.datum = georef.datum();\n      opt.datum_str = opt.datum.name();\n      have_datum = true;\n    }\n  }\n\n  // Try to infer the datum from the reference terrain\n  if (opt.reference_terrain != \"\") {\n    std::string file_type = asp::get_cloud_type(opt.reference_terrain);\n    if (file_type == \"DEM\") {\n      vw::cartography::GeoReference georef;\n      bool is_good = vw::cartography::read_georeference(georef, opt.reference_terrain);\n      if (!is_good)\n        vw::vw_throw(vw::ArgumentErr()\n                 << \"The reference terrain DEM does not have a georeference.\\n\");\n      // Ensure the datum read from the DEM agrees with the one from the cameras/user\n      if (is_good && have_datum)\n        vw::checkDatumConsistency(opt.datum, georef.datum(), warn_only);\n      if (opt.datum_str == \"\") {\n        opt.datum = georef.datum();\n        opt.datum_str = opt.datum.name();\n        have_datum = true;\n      }\n    }\n  }\n\n  if (opt.robust_threshold <= 0.0)\n    vw::vw_throw(vw::ArgumentErr() \n                 << \"The value of --robust-threshold must be positive.\\n\");\n\n  if (opt.tri_robust_threshold <= 0.0)\n    vw::vw_throw(vw::ArgumentErr() \n                 << \"The value of --tri-robust-threshold must be positive.\\n\");\n\n  if (opt.camera_position_robust_threshold <= 0.0)\n    vw::vw_throw(vw::ArgumentErr() << \"The value of --camera-position-robust-threshold \"\n              << \"must be positive.\\n\");\n\n  // This is a bug fix. The user by mistake passed in an empty height-from-dem string.\n  if (!vm[\"heights-from-dem\"].defaulted() && opt.heights_from_dem.empty())\n    vw::vw_throw(vw::ArgumentErr()\n             << \"The value of --heights-from-dem is empty. \"\n             << \"Then it must not be set at all.\\n\");\n  if (!vm[\"heights-from-dem-uncertainty\"].defaulted() &&\n      vm[\"heights-from-dem\"].defaulted())\n    vw::vw_throw(vw::ArgumentErr()\n             << \"The value of --heights-from-dem-uncertainty is set, \"\n             << \"but --heights-from-dem is not set.\\n\");\n  if (!vm[\"heights-from-dem\"].defaulted() && opt.heights_from_dem_uncertainty <= 0.0)\n    vw::vw_throw(vw::ArgumentErr() \n                 << \"The value of --heights-from-dem-uncertainty must be \"\n                 << \"positive.\\n\");\n  if (opt.heights_from_dem_robust_threshold <= 0.0)\n    vw::vw_throw(vw::ArgumentErr() \n                 << \"The value of --heights-from-robust-threshold must be \"\n                 << \"positive.\\n\");\n\n  bool have_dem = (!opt.heights_from_dem.empty());\n\n  // Try to infer the datum from the heights-from-dem\n  std::string dem_file;\n  if (opt.heights_from_dem != \"\")\n    dem_file = opt.heights_from_dem;\n  if (dem_file != \"\") {\n    std::string file_type = asp::get_cloud_type(dem_file);\n    if (file_type == \"DEM\") {\n      vw::cartography::GeoReference georef;\n      bool is_good = vw::cartography::read_georeference(georef, dem_file);\n      if (!is_good)\n        vw::vw_throw(vw::ArgumentErr() << \"The DEM \" << dem_file\n                  << \" does not have a georeference.\\n\");\n\n      // Must check the consistency of the datums\n      if (have_datum)\n        vw::checkDatumConsistency(opt.datum, georef.datum(), warn_only);\n\n      if (opt.datum_str == \"\") {\n        opt.datum = georef.datum();\n        opt.datum_str = opt.datum.name();\n        have_datum = true;\n      }\n    }\n  }\n\n  // Set the datum, either based on what the user specified or the axes\n  vw::cartography::Datum user_datum;\n  bool have_user_datum = false;\n  if (opt.datum_str != \"\") {\n    try {\n      user_datum.set_well_known_datum(opt.datum_str);\n      have_user_datum = true;\n    } catch(...) {\n      // Whatever datum name we had, it was bad, so we'll make more attempts below\n      opt.datum_str = \"\";\n      have_user_datum = false;\n    }\n  } else if (opt.semi_major > 0 && opt.semi_minor > 0) {\n    // Otherwise, if the user set the semi-axes, use that.\n    user_datum = vw::cartography::Datum(\"User Specified Datum\",\n                                        \"User Specified Spheroid\",\n                                        \"Reference Meridian\",\n                                        opt.semi_major, opt.semi_minor, 0.0);\n    have_user_datum = true;\n  }\n\n  // Must check the consistency of the datums\n  if (have_datum && have_user_datum)\n    vw::checkDatumConsistency(opt.datum, user_datum, warn_only);\n\n  if (!have_datum && have_user_datum) {\n    opt.datum = user_datum;\n    have_datum = true;\n  }\n\n  if (opt.datum_str.empty() && have_datum)\n    opt.datum_str = opt.datum.name();\n\n  // Try to find the datum from the cameras.\n  vw::cartography::Datum cam_datum;\n  bool have_cam_datum = asp::datum_from_camera(opt.image_files[0], opt.camera_files[0],\n                                               // Outputs\n                                               opt.stereo_session, session, cam_datum);\n\n  // Must check the consistency of the datums. Skip that for pinhole cameras\n  // if we already have a prior datum, as the result of that could be wrong\n  // and it would just confuse the user.\n  bool have_pinhole = (opt.stereo_session.find(\"pinhole\") != std::string::npos);\n  if (have_cam_datum && have_datum && !have_pinhole)\n    vw::checkDatumConsistency(opt.datum, cam_datum, have_pinhole);\n\n  // Otherwise try to set the datum based on cameras. It will not work for Pinhole.\n  if (!have_datum && have_cam_datum) {\n    opt.datum = cam_datum;\n    opt.datum_str = opt.datum.name();\n    have_datum = true;\n  }\n\n  // Many times the datum is mandatory\n  if (!have_datum) {\n    if (!opt.gcp_files.empty() || !opt.camera_position_file.empty())\n      vw::vw_throw(vw::ArgumentErr() << \"When ground control points or a camera position \"\n               << \"file are used, option --datum must be specified.\\n\");\n    if (opt.elevation_limit[0] < opt.elevation_limit[1])\n      vw::vw_throw(vw::ArgumentErr()\n                << \"When filtering by elevation limit, option --datum must be specified.\\n\");\n  }\n\n  if (have_datum)\n    vw::vw_out() << \"Datum:\\n\" << opt.datum << \"\\n\";\n  else\n    vw::vw_out() << \"No datum specified or detected.\\n\";\n\n\n  if (opt.apply_initial_transform_only && opt.initial_transform_file == \"\")\n    vw::vw_throw(vw::IOErr() << \"Cannot use --apply-initial-transform-only \"\n              << \"without --initial-transform.\\n\");\n\n  if (opt.apply_initial_transform_only) {\n    if (opt.solve_intrinsics) {\n      vw::vw_out() << \"Not solving for intrinsics, as --apply-initial-transform-only \"\n                   << \"was set.\\n\";\n      opt.solve_intrinsics = false;\n    }\n  }\n    \n  if (opt.initial_transform_file != \"\") {\n    vw::vw_out() << \"Reading the alignment transform from: \"\n             << opt.initial_transform_file << \"\\n\";\n    vw::read_matrix_as_txt(opt.initial_transform_file, opt.initial_transform);\n    if (opt.initial_transform.cols() != 4 || opt.initial_transform.rows() != 4)\n      vw::vw_throw(vw::ArgumentErr() << \"Could not read the initial transform.\\n\");\n    vw::vw_out() << \"Initial transform:\\n\" << opt.initial_transform << \"\\n\";\n  }\n\n  // Parse the indices of cameras not to float\n  if (opt.fixed_cameras_indices_str != \"\") {\n    opt.fixed_cameras_indices.clear();\n    std::istringstream is(opt.fixed_cameras_indices_str);\n    int val;\n    while (is >> val) {\n      opt.fixed_cameras_indices.insert(val);\n      if (val < 0 || val >= (int)opt.image_files.size())\n        vw::vw_throw(vw::IOErr() << \"The camera index to keep fixed \" << val\n                              << \" is out of bounds.\\n\");\n    }\n  }\n\n  if (!opt.fixed_cameras_indices.empty() && !opt.fixed_image_list_str.empty())\n    vw::vw_throw(vw::ArgumentErr() << \"Cannot specify both --fixed-camera-indices and \"\n             << \"--fixed-image-list.\\n\");\n  if (!opt.fixed_image_list_str.empty()) {\n\n    opt.fixed_cameras_indices.clear();\n\n    std::vector<std::string> fixed_images;\n    asp::read_list(opt.fixed_image_list_str, fixed_images);\n\n    // Find the indices of all images\n    std::map<std::string, int> all_indices;\n    for (size_t image_it = 0; image_it < opt.image_files.size(); image_it++)\n      all_indices[opt.image_files[image_it]] = image_it;\n\n    // Find the indices of images to fix\n    for (size_t image_it = 0; image_it < fixed_images.size(); image_it++) {\n      auto map_it = all_indices.find(fixed_images[image_it]);\n      if (map_it == all_indices.end())\n        vw::vw_throw(vw::ArgumentErr() << \"Could not find image \" << fixed_images[image_it]\n                 << \" read via --fixed-image-list among the input images.\\n\");\n      opt.fixed_cameras_indices.insert(map_it->second);\n    }\n  }\n\n  // Handle fixed distortion indices\n  std::string sep = \",\";\n  auto v = vw::str_to_std_vec(opt.fixed_distortion_indices_str, sep);\n  // Copy from doubles to int\n  opt.fixed_distortion_indices.clear();\n  for (size_t i = 0; i < v.size(); i++) {\n     if (int(v[i]) != v[i])\n       vw::vw_throw(vw::ArgumentErr() \n              << \"The distortion indices to keep fixed must be integers.\\n\");\n    opt.fixed_distortion_indices.push_back(int(v[i]));\n  }\n  // Sanity check\n  for (size_t i = 0; i < opt.fixed_distortion_indices.size(); i++) {\n    if (opt.fixed_distortion_indices[i] < 0)\n      vw::vw_throw(vw::ArgumentErr() \n               << \"The distortion indices to keep fixed must be non-negative.\\n\");\n  }\n  // Non-empty fixed_distortion_indices only makes sense when solving for intrinsics\n  if (!opt.fixed_distortion_indices.empty() && !opt.solve_intrinsics)\n    vw::vw_throw(vw::ArgumentErr() \n             << \"The option --fixed-distortion-indices requires \"\n             << \"the option --solve-intrinsics.\\n\");\n    \n  if (opt.reference_terrain != \"\") {\n    std::string file_type = asp::get_cloud_type(opt.reference_terrain);\n    if (file_type == \"CSV\" && opt.csv_format_str == \"\")\n      vw::vw_throw(vw::ArgumentErr()\n               << \"When using a csv reference terrain, \"\n               << \"must specify the csv-format.\\n\");\n    if (!have_datum)\n      vw::vw_throw(vw::ArgumentErr()\n               << \"When using a reference terrain, must specify the datum.\\n\");\n    if (opt.disparity_list == \"\")\n      vw::vw_throw(vw::ArgumentErr()\n               << \"When using a reference terrain, must specify a list \"\n               << \"of disparities.\\n\");\n    if (opt.max_disp_error <= 0)\n      vw::vw_throw(vw::ArgumentErr()\n               << \"Must specify --max-disp-error in pixels as a positive value.\\n\");\n    if (opt.reference_terrain_weight < 0)\n      vw::vw_throw(vw::ArgumentErr()\n               << \"The value of --reference-terrain-weight must be non-negative.\\n\");\n  }\n\n  if (opt.match_files_prefix != \"\" && opt.clean_match_files_prefix != \"\")\n    vw::vw_throw(vw::ArgumentErr()\n              << \"Cannot specify both --match-files-prefix and \"\n              << \"--clean-match-files-prefix.\\n\");\n\n  if (int(opt.proj_win != vw::BBox2(0, 0, 0, 0)) + int(!opt.proj_str.empty()) == 1)\n    vw::vw_throw(vw::ArgumentErr()\n             << \"Must specify both or neither of --proj-win and --proj-str.\\n\");\n\n  if (int(opt.transform_cameras_using_gcp) +\n      int(opt.transform_cameras_with_shared_gcp) +\n      int(opt.init_camera_using_gcp) > 1)\n    vw::vw_throw(vw::ArgumentErr()\n                 << \"Cannot specify more than one of --transform-cameras-using-gcp, \"\n                 << \"--transform-cameras-with-shared-gcp, --init-camera-using-gcp.\\n\");\n\n  if (opt.propagate_errors && !have_datum)\n    vw::vw_throw(vw::ArgumentErr() \n                 << \"Cannot propagate errors without a datum. Set --datum.\\n\");\n\n  if (opt.update_isis_cubes_with_csm_state) {\n    // This must happen after the session was auto-detected.\n    bool have_csm = (opt.stereo_session == \"csm\");\n    bool have_cub_input \n      = boost::iends_with(boost::to_lower_copy(opt.image_files[0]), \".cub\");\n    if (!have_csm || !have_cub_input)\n      vw::vw_throw(vw::ArgumentErr() << \"Cannot update ISIS cubes with CSM state \"\n               << \"unless using the CSM session with ISIS .cub images.\\n\");\n  }\n\n  // Prepare for computing footprints of images. Do this before loading all\n  // cameras, which can take time. So fail early if things are not working.\n  opt.pct_for_overlap = -1.0;\n  if (opt.auto_overlap_params != \"\") {\n    std::istringstream is(opt.auto_overlap_params);\n    if (!(is >> opt.dem_file_for_overlap >> opt.pct_for_overlap))\n      vw::vw_throw(vw::ArgumentErr()\n                << \"Could not parse correctly option --auto-overlap-params.\\n\");\n      // Can also keep track of how many images to overlap with\n      opt.overlap_limit = opt.image_files.size();\n      int val = 0;\n      if (is >> val)\n        opt.overlap_limit = val;\n      try {\n        vw::DiskImageView<float> dem(opt.dem_file_for_overlap);\n      } catch (const vw::Exception& e) {\n        vw::vw_throw(vw::ArgumentErr()\n                  << \"Could not load DEM: \" << opt.dem_file_for_overlap << \"\\n\");\n      }\n      if (opt.pct_for_overlap < 0 || opt.overlap_limit < 0)\n        vw::vw_throw(vw::ArgumentErr()\n                  << \"Invalid value for --auto-overlap-params.\\n\");\n  }\n\n  // If opt.camera_position_uncertainty is non-empty, read this file. It\n  // has the image name and the uncertainty in the camera position.\n  bool have_camera_position_uncertainty = !opt.camera_position_uncertainty_str.empty();\n  if (have_camera_position_uncertainty)\n   asp::handleCameraPositionUncertainty(opt, have_datum);\n\n  // Set camera weight to 0 if camera position weight is positive\n  if (opt.camera_position_weight > 0) {\n    if (opt.camera_weight > 0) {\n      vw::vw_out() << \"Setting --camera-weight to 0 as --camera-position-weight \"\n                    << \"is positive.\\n\";\n      opt.camera_weight = 0;\n    }\n  }\n\n  if (opt.use_llh_error && !have_datum)\n    vw::vw_throw(vw::ArgumentErr()\n              << \"Cannot use --use-lon-lat-height-gcp-error without a datum. Set --datum.\\n\");\n\n  if ((opt.calc_normalization_bounds || opt.calc_ip) &&\n      (opt.stop_after_stats || opt.stop_after_matching))\n    vw::vw_throw(vw::ArgumentErr()\n              << \"Cannot use --calc-normalization-bounds or --calc-ip with \"\n              << \"--stop-after-stats or --stop-after-matching.\\n\");\n\n  // Handle bathy options\n  asp::bathyChecks(session->name(), asp::stereo_settings(), opt.image_files.size());\n  if (asp::doBathy(asp::stereo_settings()))\n    asp::readBathyData(opt.image_files.size(),\n                       asp::stereo_settings().bathy_mask_list,\n                       asp::stereo_settings().bathy_plane,\n                       asp::stereo_settings().bathy_plane_list,\n                       asp::stereo_settings().refraction_index,\n                       opt.bathy_data);\n\n  return;\n}\n\n// Process the bundle_adjust options and sanity checks\nvoid handleBaArgs(int argc, char *argv[], asp::BaOptions& opt) {\n\n  const double nan = std::numeric_limits<double>::quiet_NaN();\n  std::string intrinsics_to_float_str, intrinsics_to_share_str,\n    intrinsics_limit_str;\n  bool inline_adjustments = false;\n  int max_iterations_tmp = -1;\n  po::options_description general_options(\"\");\n  general_options.add_options()\n    (\"output-prefix,o\",  po::value(&opt.out_prefix), \"Prefix for output filenames.\")\n    (\"cost-function\",    po::value(&opt.cost_function)->default_value(\"Cauchy\"),\n     \"Choose a cost function from: Cauchy, PseudoHuber, Huber, L1, L2, Trivial.\")\n    (\"robust-threshold\", po::value(&opt.robust_threshold)->default_value(0.5),\n     \"Set the threshold for robust cost functions. Increasing this makes the solver focus harder on the larger errors.\")\n    (\"inline-adjustments\",   po::bool_switch(&inline_adjustments)->default_value(false),\n     \"If this is set, and the input cameras are of the pinhole or panoramic type, apply \"\n     \"the adjustments directly to the cameras, rather than saving them separately as \"\n     \".adjust files.\")\n    (\"approximate-pinhole-intrinsics\", po::bool_switch(&opt.approximate_pinhole_intrinsics)->default_value(false),\n     \"If it reduces computation time, approximate the lens distortion model.\")\n    (\"solve-intrinsics\",    po::bool_switch(&opt.solve_intrinsics)->default_value(false)->implicit_value(true),\n     \"Optimize intrinsic camera parameters. Only used for pinhole, optical bar, and CSM \"\n     \"(frame and linescan) cameras. This implies --inline-adjustments.\")\n    (\"intrinsics-to-float\", po::value(&intrinsics_to_float_str)->default_value(\"\"),\n     \"If solving for intrinsics and is desired to float only a few of them, specify here, \"\n     \"in quotes, one or more of: focal_length, optical_center, other_intrinsics \"\n     \"(distortion). Not specifying anything will float all of them. Also can specify 'all' \"\n     \"or 'none'. See the documentation for when intrinsics are optimized per sensor.\")\n    (\"intrinsics-to-share\", po::value(&intrinsics_to_share_str)->default_value(\"\"),\n     \"If solving for intrinsics and is desired to share only a few of them across all \"\n     \"cameras, specify here, in quotes, one or more of: focal_length, optical_center, \"\n     \"other_intrinsics (distortion). By default all of the intrinsics are shared, so to \"\n     \"not share any of them pass in an empty string. Also can specify 'all' or 'none'. If \"\n     \"sharing intrinsics per sensor, this option is ignored, as then the sharing is more \"\n     \"fine-grained.\")\n    (\"intrinsics-limits\", po::value(&intrinsics_limit_str)->default_value(\"\"),\n     \"Specify minimum and maximum ratios for the intrinsic parameters. Values must be in \"\n     \"min max pairs and are applied in the order [focal length, optical center, other \"\n     \"intrinsics] until all of the limits are used. Check the documentation to determine \"\n     \"how many intrinsic parameters are used for your cameras.\")\n    (\"camera-position-uncertainty\",\n     po::value(&opt.camera_position_uncertainty_str)->default_value(\"\"),\n     \"A file having on each line the image name and the horizontal and vertical camera \"\n     \"position uncertainty (1 sigma, in meters). This strongly constrains the movement of \"\n     \"cameras, potentially at the expense of accuracy. To have the same uncertainties for \"\n     \"all cameras, pass instead of a file name two values separated by a comma (no \"\n     \"spaces). See the documentation for an example. See also \"\n     \"--camera-position-uncertainty-power.\")\n    (\"camera-position-uncertainty-power\",\n     po::value(&opt.camera_position_uncertainty_power)->default_value(2.0),\n     \"A higher value makes the cost function rise more steeply when \"\n     \"--camera-position-uncertainty is close to being violated. This is an advanced \"\n      \"option. The default should be good enough.\")\n    (\"camera-positions\",\n     po::value(&opt.camera_position_file)->default_value(\"\"),\n     \"CSV file containing estimated position of each camera in ECEF coordinates. For this \"\n     \"to work well the camera must travel not along linear path, as this data will be used \"\n     \"to find an alignment transform. Only used with the inline-adjustments setting to \"\n     \"initialize global camera coordinates. If used, the csv-format setting must also be \"\n     \"set. The 'file' field is searched for strings that are found in the input image \"\n     \"files to match locations to cameras.\")\n    (\"init-camera-using-gcp\",  po::bool_switch(&opt.init_camera_using_gcp)->default_value(false)->implicit_value(true),\n     \"Given an image, a pinhole camera lacking correct position and orientation, and a GCP \"\n     \"file, find the pinhole camera with given intrinsics most consistent with the GCP.\")\n    (\"transform-cameras-with-shared-gcp\",\n     po::bool_switch(&opt.transform_cameras_with_shared_gcp)->default_value(false)->implicit_value(true),\n     \"Given at least 3 GCP, with each seen in at least 2 images, find the triangulated \"\n     \"positions based on pixels values in the GCP, and apply a rotation + translation + \"\n     \"scale transform to the entire camera system so that the triangulated points get \"\n     \"mapped to the ground coordinates in the GCP.\")\n    (\"transform-cameras-using-gcp\",  po::bool_switch(&opt.transform_cameras_using_gcp)->default_value(false)->implicit_value(true),\n     \"Given a set of GCP, with at least two images having at least three GCP each (but \"\n     \"with each GCP not shared among the images), transform the cameras to ground \"\n     \"coordinates. This is not as robust as --transform-cameras-with-shared-gcp.\")\n    (\"disable-pinhole-gcp-init\",  po::bool_switch(&opt.disable_pinhole_gcp_init)->default_value(false)->implicit_value(true),\n     \"Do not try to initialize the positions of pinhole cameras based on input GCPs. This \"\n     \"ignored as is now the default. See also: --init-camera-using-gcp.\")\n    (\"input-adjustments-prefix\",  po::value(&opt.input_prefix),\n     \"Prefix to read initial adjustments from, written by a previous invocation of \"\n     \"this program.\")\n    (\"initial-transform\",  po::value(&opt.initial_transform_file)->default_value(\"\"),\n     \"Before optimizing the cameras, apply to them the 4x4 rotation + translation transform \"\n     \"from this file. The transform is in respect to the planet center, such as written by \"\n     \"pc_align's source-to-reference or reference-to-source alignment transform. Set the \"\n     \"number of iterations to 0 to stop at this step. If --input-adjustments-prefix is \"\n     \"specified, the transform gets applied after the adjustments are read.\")\n    (\"fixed-camera-indices\",    po::value(&opt.fixed_cameras_indices_str)->default_value(\"\"),\n     \"A list of indices, in quotes and starting from 0, with space as separator, corresponding to cameras to keep fixed during the optimization process.\")\n    (\"fixed-image-list\",    po::value(&opt.fixed_image_list_str)->default_value(\"\"),\n     \"A file having a list of images (separated by spaces or newlines) whose cameras should be fixed during optimization.\")\n    (\"fix-gcp-xyz\", \n     po::bool_switch(&opt.fix_gcp_xyz)->default_value(false)->implicit_value(true),\n     \"If the GCP are highly accurate, use this option to not float them during the optimization.\")\n    (\"csv-format\",\n     po::value(&opt.csv_format_str)->default_value(\"\"), asp::csv_opt_caption().c_str())\n    (\"csv-srs\",\n     po::value(&opt.csv_srs)->default_value(\"\"),\n     \"The PROJ or WKT string for interpreting the entries in input CSV files.\")\n    (\"reference-terrain\", po::value(&opt.reference_terrain)->default_value(\"\"),\n     \"An externally provided trustworthy 3D terrain, either as a DEM or as a lidar file, \"\n     \"very close (after alignment) to the stereo result from the given images and cameras \"\n     \"that can be used as a reference, to optimize the intrinsics of the \"\n     \"cameras.\")\n    (\"max-num-reference-points\", po::value(&opt.max_num_reference_points)->default_value(100000000),\n     \"Maximum number of (randomly picked) points from the reference terrain to use.\")\n    (\"disparity-list\", po::value(&opt.disparity_list)->default_value(\"\"),\n     \"The unaligned disparity files to use when optimizing the intrinsics based on a \"\n     \"reference terrain. Specify them as a list in quotes separated by spaces. First file \"\n     \"is for the first two images, second is for the second and third images, etc. If an \"\n     \"image pair has no disparity file, use 'none'.\")\n    (\"max-disp-error\", po::value(&opt.max_disp_error)->default_value(-1),\n     \"When using a reference terrain as an external control, ignore as outliers xyz points which projected in the left image and transported by disparity to the right image differ by the projection of xyz in the right image by more than this value in pixels.\")\n    (\"reference-terrain-weight\", po::value(&opt.reference_terrain_weight)->default_value(1.0),\n     \"How much weight to give to the cost function terms involving the reference terrain.\")\n    (\"heights-from-dem\",   po::value(&opt.heights_from_dem)->default_value(\"\"),\n     \"Assuming the cameras have already been bundle-adjusted and aligned to a \"\n     \"known DEM, constrain the triangulated points to be close to this DEM. See also \"\n     \"--heights-from-dem-uncertainty.\")\n    (\"heights-from-dem-uncertainty\",\n     po::value(&opt.heights_from_dem_uncertainty)->default_value(-1.0),\n     \"The DEM uncertainty (1 sigma, in meters). Must be positive. A smaller value \"\n     \"constrains more the triangulated points to the DEM specified via --heights-from-dem.\")\n    (\"heights-from-dem-robust-threshold\",\n     po::value(&opt.heights_from_dem_robust_threshold)->default_value(0.1),\n     \"The robust threshold to use to keep the triangulated points close to the DEM if \"\n      \"specified via --heights-from-dem. This is applied after the point differences \"\n      \"are divided by --heights-from-dem-uncertainty. It will attenuate large height \"\n      \"difference outliers. It is suggested to not modify this value, and adjust instead \"\n      \"--heights-from-dem-uncertainty.\")\n    (\"mapproj-dem\", po::value(&opt.mapproj_dem)->default_value(\"\"),\n     \"If specified, mapproject every pair of matched interest points onto this DEM \"\n     \"and compute their distance, then percentiles of such distances for each image \"\n     \"vs the rest and each image pair. This is done after bundle adjustment \"\n     \"and outlier removal. Measured in meters. Not related to --mapprojected-data.\")\n    (\"weight-image\", po::value(&opt.weight_image)->default_value(\"\"),\n     \"Given a georeferenced image with float values, for each initial triangulated \"\n     \"point find its location in the image and closest pixel value. Multiply the \"\n     \"reprojection errors in the cameras for this point by this weight value. The solver \"\n     \"will focus more on optimizing points with a higher weight. Points that fall \"\n     \"outside the image and weights that are non-positive, NaN, or equal to nodata \"\n     \"will be ignored.\")\n    (\"datum\", po::value(&opt.datum_str)->default_value(\"\"),\n     \"Use this datum. Needed only for ground control points, a camera position file, or \"\n     \"for RPC sessions. Options: WGS_1984, D_MOON (1,737,400 meters), D_MARS (3,396,190 \"\n     \"meters), MOLA (3,396,000 meters), NAD83, WGS72, and NAD27. Also accepted: Earth \"\n     \"(=WGS_1984), Mars (=D_MARS), Moon (=D_MOON).\")\n    (\"semi-major-axis\",  po::value(&opt.semi_major)->default_value(0),\n     \"Explicitly set the datum semi-major axis in meters (see above).\")\n    (\"semi-minor-axis\",  po::value(&opt.semi_minor)->default_value(0),\n     \"Explicitly set the datum semi-minor axis in meters (see above).\")\n    (\"session-type,t\",   po::value(&opt.stereo_session)->default_value(\"\"),\n     \"Select the stereo session type to use for processing. Usually the program can select \"\n     \"this automatically by the file extension, except for xml cameras. See the doc for \"\n     \"options.\")\n    (\"min-matches\",      po::value(&opt.min_matches)->default_value(5),\n     \"Set the minimum  number of matches between images that will be considered.\")\n    (\"max-pairwise-matches\", po::value(&opt.max_pairwise_matches)->default_value(10000),\n     \"Reduce the number of matches per pair of images to at most this \"\n     \"number, by selecting a random subset, if needed. This happens \"\n     \"when setting up the optimization, and before outlier filtering. \"\n     \"Set to 0 to load no matches (use with GCP only).\")\n    (\"ip-detect-method\", po::value(&opt.ip_detect_method)->default_value(0),\n     \"Interest point detection algorithm (0: Integral OBALoG (default), 1: OpenCV SIFT, 2: OpenCV ORB.\")\n    (\"epipolar-threshold\",      po::value(&opt.epipolar_threshold)->default_value(-1),\n     \"Maximum distance from the epipolar line to search for IP matches. Default: automatic calculation. A higher values will result in more matches.\")\n    (\"ip-inlier-factor\",        po::value(&opt.ip_inlier_factor)->default_value(0.2),\n     \"A higher factor will result in more interest points, but perhaps also more outliers.\")\n    (\"ip-uniqueness-threshold\", po::value(&opt.ip_uniqueness_thresh)->default_value(0.8),\n     \"A higher threshold will result in more interest points, but perhaps less unique ones.\")\n    (\"ip-side-filter-percent\",  po::value(&opt.ip_edge_buffer_percent)->default_value(-1),\n     \"Remove matched IPs this percentage from the image left/right sides.\")\n    (\"normalize-ip-tiles\",\n     po::bool_switch(&opt.ip_normalize_tiles)->default_value(false)->implicit_value(true),\n     \"Individually normalize tiles used for IP detection.\")\n    (\"num-obalog-scales\",      po::value(&opt.num_scales)->default_value(-1),\n     \"How many scales to use if detecting interest points with OBALoG. If not specified, 8 will be used. More can help for images with high frequency artifacts.\")\n    (\"nodata-value\",           po::value(&opt.nodata_value)->default_value(nan),\n     \"Pixels with values less than or equal to this number are treated as no-data. This overrides the no-data values from input images.\")\n    (\"num-iterations\",       po::value(&opt.num_iterations)->default_value(1000),\n     \"Set the maximum number of iterations.\")\n    (\"max-iterations\",       po::value(&max_iterations_tmp)->default_value(1000),\n     \"Set the maximum number of iterations.\") // alias for num-iterations\n    (\"parameter-tolerance\",  po::value(&opt.parameter_tolerance)->default_value(1e-8),\n     \"Stop when the relative error in the variables being optimized is less than this. \"\n     \"When --solve-intrinsics is used, the default is 1e-12.\")\n    (\"overlap-limit\",        po::value(&opt.overlap_limit)->default_value(0),\n     \"Limit the number of subsequent images to search for matches to the current image to this value. By default match all images.\")\n    (\"overlap-list\",         po::value(&opt.overlap_list_file)->default_value(\"\"),\n     \"A file containing a list of image pairs, one pair per line, separated by a space, which are expected to overlap. Matches are then computed only among the images in each pair.\")\n    (\"auto-overlap-params\",  po::value(&opt.auto_overlap_params)->default_value(\"\"),\n     \"Determine which camera images overlap by finding the bounding boxes of their ground \"\n     \"footprints given the specified DEM, expanding them by a given percentage, and see if \"\n     \"those intersect. A higher percentage should be used when there is more uncertainty \"\n     \"about the input camera poses. As of the 10/2025 build, a third parameter can be \"\n     \"provided to limit the number of subsequent images that overlap to this many. \"\n     \"Example: 'dem.tif 15.0 6'. Using this with --mapprojected-data will restrict the \"\n     \"matching only to the ground-level overlap regions (expanded by this percentage). As \"\n     \"of the 10/2025 build, this works also with --match-first-to-last.\")\n    (\"auto-overlap-buffer\",  po::value(&opt.auto_overlap_buffer)->default_value(-1.0),\n     \"Try to automatically determine which images overlap. Used only if \"\n     \"this option is explicitly set. Only supports Worldview style XML \"\n     \"camera files. The lon-lat footprints of the cameras are expanded \"\n     \"outwards on all sides by this value (in degrees), before checking \"\n     \"if they intersect.\")\n    (\"image-list\", po::value(&opt.image_list)->default_value(\"\"),\n     \"A file containing the list of images, when they are too many to specify on the command line. Use space or newline as separator. See also --camera-list and --mapprojected-data-list.\")\n    (\"camera-list\", po::value(&opt.camera_list)->default_value(\"\"),\n     \"A file containing the list of cameras, when they are too many to specify on \"\n     \"the command line. If the images have embedded camera information, such as for ISIS, \"\n     \"this file may be omitted, or specify the image names instead of camera names.\")\n    (\"mapprojected-data-list\", po::value(&opt.mapprojected_data_list)->default_value(\"\"),\n     \"A file containing the list of mapprojected images and the DEM \"\n     \"(see --mapprojected-data), when they are too many to specify on the command line. \"\n     \"The DEM is optional (since the 1/2026 build) if it can be looked up in the \"\n     \"geoheaders of the mapprojected images. If provided, the DEM must be the last entry.\")\n    (\"position-filter-dist\", po::value(&opt.position_filter_dist)->default_value(-1),\n     \"Set a distance in meters and don't perform IP matching on images with an estimated camera center farther apart than this distance.  Requires --camera-positions.\")\n    (\"match-first-to-last\", po::bool_switch(&opt.match_first_to_last)->default_value(false)->implicit_value(true),\n     \"Match the first several images to last several images by extending the logic of \"\n     \"--overlap-limit past the last image to the earliest ones. As of the 10/2025 build, \"\n     \"this works also with --auto-overlap-params.\")\n    (\"camera-position-weight\", po::value(&opt.camera_position_weight)->default_value(0.0),\n     \"A soft constraint to keep the camera positions close to the original values. \"\n     \"It is meant to prevent a wholesale shift of the cameras. It can impede \"\n     \"the reduction in reprojection errors. It adjusts to the ground sample distance \"\n     \"and the number of interest points in the images. The computed \"\n     \"discrepancy is attenuated with --camera-position-robust-threshold. \"\n     \"See --camera-position-uncertainty for a hard constraint.\")\n    (\"camera-position-robust-threshold\",\n     po::value(&opt.camera_position_robust_threshold)->default_value(0.1),\n     \"The robust threshold to attenuate large discrepancies between initial and optimized \"\n     \"camera positions with the option --camera-position-weight. This is less than \"\n     \"--robust-threshold, as the primary goal is to reduce pixel reprojection errors, even \"\n     \"if that results in big differences in the camera positions. It is suggested to not \"\n     \"modify this value, and adjust instead --camera-position-weight.\")\n    (\"rotation-weight\",\n     po::value(&opt.rotation_weight)->default_value(0.0),\n     \"A higher weight will penalize more rotation deviations from the original \"\n     \"configuration.\")\n    (\"camera-weight\", po::value(&opt.camera_weight)->default_value(0.0),\n     \"The weight to give to the constraint that the camera positions/orientations \"\n     \"stay close to the original values. A higher weight means that the values will \"\n     \"change less. This option is deprecated. Use instead --camera-position-weight \"\n     \"and --tri-weight.\")\n    (\"tri-weight\", po::value(&opt.tri_weight)->default_value(0.1),\n     \"The weight to give to the constraint that optimized triangulated points stay \"\n      \"close to original triangulated points. A positive value will help ensure the \"\n      \"cameras do not move too far, but a large value may prevent convergence. It is \"\n      \"suggested to use here 0.1 to 0.5. This will be divided by ground sample distance \"\n      \"(GSD) to convert this constraint to pixel units, since the reprojection errors \"\n      \"are in pixels. See also --tri-robust-threshold. Does not apply to GCP or points \"\n      \"constrained by a DEM.\")\n    (\"tri-robust-threshold\", po::value(&opt.tri_robust_threshold)->default_value(0.1),\n     \"The robust threshold to attenuate large differences between initial and optimized \"\n     \"triangulation points, after multiplying them by --tri-weight and dividing by GSD. \"\n     \"This is less than --robust-threshold, as the primary goal is to reduce pixel \"\n     \"reprojection errors, even if that results in big differences in the triangulated \"\n     \"points. It is suggested to not modify this value, and adjust instead --tri-weight.\")\n    (\"isis-cnet\", po::value(&opt.isis_cnet)->default_value(\"\"),\n     \"Read a control network having interest point matches from this binary file \"\n     \"in the ISIS jigsaw format. This can be used with any images and cameras \"\n     \"supported by ASP. For Pinhole cameras, the (optimized) camera poses will be \"\n     \"read/written to NVM as well.  See also --output-cnet-type.\")\n    (\"nvm\", po::value(&opt.nvm)->default_value(\"\"),\n     \"Read a control network having interest point matches from this file in the NVM \"\n     \"format. This can be used with any images and cameras supported by ASP. For Pinhole \"\n     \"or CSM frame cameras, the (optimized) camera poses will be read from / written to \"\n     \"NVM as well. See also --output-cnet-type, --no-poses-from-nvm.\")\n    (\"output-cnet-type\", po::value(&opt.output_cnet_type)->default_value(\"\"),\n      \"The format in which to save the control network of interest point matches. \"\n      \"Options: 'match-files' (match files in ASP's format), 'isis-cnet' (ISIS \"\n      \"jigsaw format), 'nvm' (plain text VisualSfM NVM format). If not set, the same \"\n      \"format as for the input is used.\")\n    (\"no-poses-from-nvm\",\n      po::bool_switch(&opt.no_poses_from_nvm)->default_value(false)->implicit_value(true),\n     \"Do not read the camera poses from the NVM file or write them to such a file. \"\n     \"Applicable only with the option --nvm and Pinhole camera models.\")\n    (\"overlap-exponent\",  po::value(&opt.overlap_exponent)->default_value(0.0),\n     \"If a feature is seen in n >= 2 images, give it a weight proportional with \"\n     \"(n-1)^exponent.\")\n    (\"ip-per-tile\", po::value(&opt.ip_per_tile)->default_value(0),\n     \"How many interest points to detect in each 1024^2 image tile (default: automatic \"\n     \"determination). This is before matching. Not all interest points will have a match. \"\n     \"See also --matches-per-tile.\")\n    (\"ip-per-image\", po::value(&opt.ip_per_image)->default_value(0),\n     \"How many interest points to detect in each image (default: automatic determination). \"\n     \"Can set either this or --ip-per-tile.\")\n    (\"num-passes\",\n     po::value(&opt.num_passes)->default_value(2),\n     \"How many passes of bundle adjustment to do, with given number of iterations in each \"\n     \"pass. For more than one pass, outliers will be removed between passes using \"\n     \"--remove-outliers-params, and re-optimization will take place. Residual files and a \"\n     \"copy of the match files with the outliers removed (*-clean.match) will be written to \"\n     \"disk.\")\n    (\"num-random-passes\", po::value(&opt.num_random_passes)->default_value(0),\n     \"After performing the normal bundle adjustment passes, do this many more passes using the same matches but adding random offsets to the initial parameter values with the goal of avoiding local minima that the optimizer may be getting stuck in.\")\n    (\"remove-outliers-params\",\n     po::value(&opt.remove_outliers_params_str)->default_value(\"75.0 3.0 5.0 8.0\", \"'pct factor err1 err2'\"),\n     \"Outlier removal based on percentage, when more than one bundle adjustment pass is \"\n     \"used. Triangulated points (that are not GCP) with reprojection error in pixels \"\n     \"larger than min(max('pct'-th percentile * 'factor', err1), err2) will be removed as \"\n     \"outliers. Hence, never remove errors smaller than err1 but always remove those \"\n     \"bigger than err2. Specify as a list in quotes. Also remove outliers based on \"\n     \"distribution of interest point matches and triangulated points.\")\n    (\"max-gcp-reproj-err\", po::value(&opt.max_gcp_reproj_err)->default_value(-1.0),\n     \"If positive, after each pass remove GCP whose mean reprojection error \"\n     \"(averaged over all cameras seeing that point) is more than this, in pixels.\")\n    (\"elevation-limit\", po::value(&opt.elevation_limit)->default_value(vw::Vector2(0,0), \"auto\"),\n     \"Remove as outliers interest points (that are not GCP) for which the elevation of the triangulated position (after cameras are optimized) is outside of this range. Specify as two values: min max.\")\n    // Note that we count later on the default for lon_lat_limit being BBox2(0,0,0,0).\n    (\"lon-lat-limit\", po::value(&opt.lon_lat_limit)->default_value(vw::BBox2(0,0,0,0), \"auto\"),\n     \"Remove as outliers interest points (that are not GCP) for which the longitude and latitude of the triangulated position (after cameras are optimized) are outside of this range. Specify as: min_lon min_lat max_lon max_lat.\")\n    (\"match-files-prefix\",  po::value(&opt.match_files_prefix)->default_value(\"\"),\n     \"Use the match files from this prefix instead of the current output prefix. See the \"\n     \"naming convention in the documentation. This implies --skip-matching. The order of \"\n     \"images in each interest point match file need not be the same as for input images. \"\n     \"See also --clean-match-files-prefix. Only one of these two options can be specified.\")\n    (\"clean-match-files-prefix\",  po::value(&opt.clean_match_files_prefix)->default_value(\"\"),\n     \"Use as input the *-clean.match files with this prefix (this had the \"\n     \"outliers filtered out by bundle_adjust). See also --match-files-prefix.\")\n    (\"update-isis-cubes-with-csm-state\",\n     po::bool_switch(&opt.update_isis_cubes_with_csm_state)->default_value(false)->implicit_value(true),\n     \"Save the model state of optimized CSM cameras as part of the .cub files. Any prior \"\n     \"version and any SPICE data will be deleted. Mapprojected images obtained with prior \"\n     \"version of the cameras must no longer be used in stereo.\")\n    (\"save-adjusted-rpc\",\n     po::bool_switch(&opt.save_adjusted_rpc)->default_value(false)->implicit_value(true),\n     \"In addition to external adjustments to the input cameras, save RPC cameras with \"\n     \"the adjustments applied to them, in XML format. This recomputes the RPC models.\")\n    (\"enable-rough-homography\",\n     po::bool_switch(&opt.enable_rough_homography)->default_value(false)->implicit_value(true),\n     \"Enable the step of performing datum-based rough homography for interest point matching. This is best used with reasonably reliable input cameras and a wide footprint on the ground.\")\n    (\"skip-rough-homography\",\n     po::bool_switch(&opt.skip_rough_homography)->default_value(false)->implicit_value(true),\n     \"Skip the step of performing datum-based rough homography. This obsolete option is ignored as is the default.\")\n    (\"enable-tri-ip-filter\",\n     po::bool_switch(&opt.enable_tri_filtering)->default_value(false)->implicit_value(true),\n     \"Enable triangulation-based interest points filtering. This is best used with reasonably reliable input cameras.\")\n    (\"disable-tri-ip-filter\",\n     po::bool_switch(&opt.disable_tri_filtering)->default_value(false)->implicit_value(true),\n     \"Disable triangulation-based interest points filtering. This obsolete option is ignored as is the default.\")\n    (\"no-datum\", po::bool_switch(&opt.no_datum)->default_value(false)->implicit_value(true),\n     \"Do not assume a reliable datum exists, such as for irregularly shaped bodies.\")\n    (\"individually-normalize\",\n     po::bool_switch(&opt.individually_normalize)->default_value(false)->implicit_value(true),\n     \"Individually normalize the input images instead of using common values.\")\n    (\"ip-triangulation-max-error\",  po::value(&opt.ip_triangulation_max_error)->default_value(-1),\n     \"When matching IP, filter out any pairs with a triangulation error higher than this.\")\n    (\"ip-num-ransac-iterations\", po::value(&opt.ip_num_ransac_iterations)->default_value(1000),\n     \"How many RANSAC iterations to do in interest point matching.\")\n    (\"min-triangulation-angle\", po::value(&opt.min_triangulation_angle)->default_value(0.1),\n     \"Filter as outlier any triangulation point for which all rays converging to \"\n      \"it have an angle less than this (measured in degrees). This happens on \"\n      \"loading the match files and after each optimization pass. This should be used \"\n      \"cautiously with very uncertain input cameras.\")\n    (\"max-triangulation-angle\", po::value(&opt.max_triangulation_angle)->default_value(-1.0),\n     \"Filter as outlier any triangulation points for which the maximum angle of rays \"\n     \"converging to it are more than this (measured in degrees). Set to a positive value.\")\n    (\"forced-triangulation-distance\", po::value(&opt.forced_triangulation_distance)->default_value(-1),\n     \"When triangulation fails, for example, when input cameras are inaccurate, \"\n     \"artificially create a triangulation point this far ahead of the camera, \"\n     \"in units of meter. Can also set a small --min-triangulation-angle in this case.\")\n    (\"use-lon-lat-height-gcp-error\",\n     po::bool_switch(&opt.use_llh_error)->default_value(false)->implicit_value(true),\n     \"When having GCP (or a DEM constraint), constrain the triangulated points in the \"\n     \"longitude, latitude, and height space, instead of ECEF. The standard deviations \"\n     \"in the GCP file (or DEM uncertainty) are applied accordingly.\")\n    (\"mapprojected-data\",  po::value(&opt.mapprojected_data)->default_value(\"\"),\n     \"Given map-projected versions of the input images and the DEM they were mapprojected \"\n     \"onto, create interest point matches between the mapprojected images. Unproject and \"\n     \"save those matches, then continue with bundle adjustment. Existing match files will \"\n     \"be reused. Specify the mapprojected images and the DEM as a string in quotes, \"\n     \"separated by spaces. The DEM is optional (since the 1/2026 build) if it can be \"\n     \"looked up in the geoheaders of the mapprojected images. If provided, the DEM must \"\n     \"be the last file. It is suggested to use this with --auto-overlap-params.\")\n    (\"matches-per-tile\",  po::value(&opt.matches_per_tile)->default_value(0),\n     \"How many interest point matches to compute in each image tile (of size \"\n     \"normally 1024^2 pixels). Use a value of --ip-per-tile a few times larger \"\n     \"than this. See also --matches-per-tile-params.\")\n    (\"save-cnet-as-gcp\",\n      po::bool_switch(&opt.save_cnet_as_gcp)->default_value(false)->implicit_value(true),\n     \"Save the optimized control network, after outlier filtering, in the \"\n     \"format used by ground control points (GCP), including any input GCP. \"\n     \"The xyz sigma is 1 meter for regular non-GCP triangulated points and the \"\n     \"value of --heights-from-dem-uncertainty for DEM-constrained points.\")\n    (\"num-parallel-jobs\", po::value(&opt.num_parallel_jobs)->default_value(1),\n     \"The number of bundle_adjustment processes being run in parallel over all nodes.\")\n    (\"job-id\", po::value(&opt.job_id)->default_value(0),\n     \"The id of this parallel bundle adjustment job.\")\n    (\"force-reuse-match-files\", po::bool_switch(&opt.force_reuse_match_files)->default_value(false)->implicit_value(true),\n     \"Force reusing the match files even if older than the images or cameras. \"\n     \"Then the order of images in each interest point match file need not be the same \"\n     \"as for input images. Additional match files will be created if needed.\")\n    (\"skip-matching\",    po::bool_switch(&opt.skip_matching)->default_value(false)->implicit_value(true),\n     \"Only use the match files that can be loaded from disk. This implies --force-reuse-match-files.\")\n    (\"matches-as-txt\",\n     po::bool_switch(&asp::stereo_settings().matches_as_txt)->default_value(false)->implicit_value(true),\n     \"Read and write match files as plain text instead of binary. See the documentation for details.\")\n    (\"save-intermediate-cameras\", po::bool_switch(&opt.save_intermediate_cameras)->default_value(false)->implicit_value(true),\n     \"Save the values for the cameras at each iteration.\")\n    (\"apply-initial-transform-only\", po::bool_switch(&opt.apply_initial_transform_only)->default_value(false)->implicit_value(true),\n     \"Apply to the cameras the transform given by --initial-transform. \"\n     \"No iterations, GCP loading, image matching, or report generation \"\n     \"take place. Using --num-iterations 0 and without this option \"\n     \"will create those.\")\n    (\"proj-win\", po::value(&opt.proj_win)->default_value(vw::BBox2(0,0,0,0), \"auto\"),\n     \"Flag as outliers input triangulated points not in this proj win (box in projected \"\n     \"units as provided by --proj_str). This should be generous if the input cameras have \"\n     \"significant errors.\")\n    (\"proj-str\",   po::value(&opt.proj_str)->default_value(\"\"),\n     \"To be used in conjunction with --proj-win.\")\n    (\"matches-per-tile-params\",  po::value(&opt.matches_per_tile_params)->default_value(vw::Vector2(1024, 1280), \"1024 1280\"),\n     \"To be used with --matches-per-tile. The first value is the image tile size for both \"\n     \"images. A larger second value allows each right tile to further expand to this size, \"\n     \"resulting in the tiles overlapping. This may be needed if the homography alignment \"\n     \"between these images is not great, as this transform is used to pair up left and \"\n     \"right image tiles.\")\n    (\"propagate-errors\",\n     po::bool_switch(&opt.propagate_errors)->default_value(false)->implicit_value(true),\n     \"Propagate the errors from the input cameras to the triangulated points for all pairs \"\n     \"of match points, and produce a report having the median, mean, standard deviation, \"\n     \"and number of samples for each camera pair.\")\n    (\"horizontal-stddev\", po::value(&opt.horizontal_stddev)->default_value(0),\n     \"If positive, propagate this stddev of horizontal ground plane camera uncertainty \"\n     \"through triangulation for all cameras. To be used with --propagate-errors.\")\n    (\"min-distortion\",\n     po::value(&opt.min_distortion)->default_value(1e-7),\n     \"Distortion parameters that are optimized and that are smaller in magnitude than this \"\n     \"value are set to this value. This is to ensure the parameters are big enough to be \"\n     \"optimized. Can be negative. This is affected by --fixed-distortion-indices. Applies \"\n     \"to Pinhole cameras (all distortion models) and CSM (radial-tangential distortion \"\n     \"only). Does not apply to optical bar models. See also --fixed-distortion-indices.\")\n    (\"fixed-distortion-indices\",\n     po::value(&opt.fixed_distortion_indices_str)->default_value(\"\"),\n     \"A sequence indices, separated by commas (with no spaces) starting from 0, \"\n     \"corresponding to lens distortion parameters to keep fixed, if --solve-intrinsics is \"\n     \"invoked. These will not be changed by the --min-distortion setting. Sample input: \"\n     \"0,3,4. The order of distortion parameters is as saved in output camera files. \"\n     \"For example, for radial-tangential distortion, the order is k1, k2, p1, p2, k3.\")\n    (\"flann-method\",  po::value(&opt.flann_method)->default_value(\"auto\"),\n     \"Choose the FLANN method for matching interest points. Options: 'kmeans': \"\n     \"slower but deterministic, 'kdtree': faster (up to 6x) but not deterministic \"\n     \"(starting with FLANN 1.9.2). The default ('auto') is to use 'kmeans' for \"\n     \"25,000 features or less and 'kdtree' otherwise. This does not apply to ORB \"\n     \"feature matching.\")\n    (\"csv-proj4\", po::value(&opt.csv_proj4_str)->default_value(\"\"),\n     \"An alias for --csv-srs, for backward compatibility.\")\n    (\"save-vwip\", po::bool_switch(&opt.save_vwip)->default_value(false)->implicit_value(true),\n     \"Save .vwip files (interest point matches per image, before matching). This option \"\n     \"is currently ignored as .vwip are always saved.\")\n    (\"ip-nodata-radius\", po::value(&opt.ip_nodata_radius)->default_value(4),\n     \"Remove IP near nodata with this radius, in pixels.\")\n    (\"accept-provided-mapproj-dem\", \n     po::bool_switch(&asp::stereo_settings().accept_provided_mapproj_dem)->default_value(false)->implicit_value(true),\n     \"Accept the DEM provided on the command line as the one mapprojection was done with, \"\n     \"even if it disagrees with the DEM recorded in the geoheaders of input images.\")\n    (\"stop-after-statistics\",    \n      po::bool_switch(&opt.stop_after_stats)->default_value(false)->implicit_value(true),\n     \"Quit after computing image statistics.\")\n    (\"stop-after-matching\",\n      po::bool_switch(&opt.stop_after_matching)->default_value(false)->implicit_value(true),\n     \"Quit after writing all match files.\")\n    (\"calc-normalization-bounds\",\n     po::bool_switch(&opt.calc_normalization_bounds)->default_value(false)->implicit_value(true),\n     \"This is called in parallel_bundle_adjust just once to calculate all image bounds \"\n     \"for normalization, after statistics were computed by separate processes.\") \n    (\"calc-ip\",\n     po::bool_switch(&opt.calc_ip)->default_value(false)->implicit_value(true),\n     \"Compute interest points for each image. This is before interest point matching.\"\n     \"This is called by parallel_bundle_adjust with multiple processes.\")\n    (\"ip-debug-images\",\n     po::bool_switch(&opt.ip_debug_images)->default_value(false)->implicit_value(true),\n     \"Write debug images to disk when detecting and matching interest points.\")\n    (\"query-num-image-pairs\", \n     po::bool_switch(&opt.query_num_image_pairs)->default_value(false)->implicit_value(true), \n     \"Print how many image pairs need to find matches for, and exit.\")\n    // For bathymetry correction\n    (\"bathy-mask-list\", \n     po::value(&asp::stereo_settings().bathy_mask_list)->default_value(\"\"),\n     \"A file having a list of mask files to use for bathymetry. Specify one per line. \"\n     \"Must be one per input image and 1-to-1 with the images. Pixels classified as \"\n     \"water must have non-positive value or be no-data in the mask, while land pixels \"\n     \"must have positive value. This is preliminary work. This program does not yet \"\n     \"model bathymetry.\")\n    (\"bathy-plane\",\n     po::value(&asp::stereo_settings().bathy_plane),\n      \"Path to a file containing a plane approximating the water surface, for \"\n      \"bathymetry correction with underwater terrain. This corrects camera rays passing \"\n      \"through water using Snell's law. If multiple images are used and they have \"\n      \"different water surfaces use --bathy-plane-list. Use together with \"\n      \"--refraction-index. See also --bathy-mask-list.\")\n    (\"bathy-plane-list\", \n     po::value(&asp::stereo_settings().bathy_plane_list)->default_value(\"\"),\n     \"Path to a file containing a list of bathy plane files for bathymetry correction, \"\n     \"if more than one. Set one plane file per line. Must specify one plane per input \"\n     \"image, in the same order. Use with --bathy-mask-list and --refraction-index.\")\n    (\"refraction-index\", \n     po::value(&asp::stereo_settings().refraction_index)->default_value(0),\n      \"The index of refraction of water to be used in bathymetry correction. \"\n      \"Must be specified and bigger than 1. This index can be computed with \"\n      \"the refr_index program.\")\n    ;\n\n  general_options.add(vw::GdalWriteOptionsDescription(opt));\n\n  po::options_description positional(\"\");\n  positional.add_options()\n    (\"input-files\", po::value(&opt.image_files));\n\n  po::positional_options_description positional_desc;\n  positional_desc.add(\"input-files\", -1);\n\n  std::string usage(\"<images> <cameras> <optional ground control points> -o <output prefix> [options]\");\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line(argc, argv, opt, general_options, general_options,\n                            positional, positional_desc, usage,\n                            allow_unregistered, unregistered);\n\n  // Do this check first, as the output prefix is needed to log to file. This\n  // will be triggered when called with no arguments, so print the general\n  // options, which functions as the help message.\n  if (opt.out_prefix.empty())\n    vw::vw_throw(vw::ArgumentErr() << \"Missing the output prefix.\\n\" << usage \n             << general_options);\n\n  // Turn on logging to file. Do this early.\n  asp::log_to_file(argc, argv, \"\", opt.out_prefix);\n\n  // This is a little clumsy, but need to see whether the user set --max-iterations\n  // or --num-iterations. They are aliases to each other.\n  if (!vm[\"max-iterations\"].defaulted() && !vm[\"num-iterations\"].defaulted())\n    vw::vw_throw(vw::ArgumentErr() \n                 << \"Cannot set both --num-iterations and --max-iterations.\\n\");\n  if (!vm[\"max-iterations\"].defaulted())\n    opt.num_iterations = max_iterations_tmp;\n\n  // Validate the options. This also populates some fields in opt,\n  // such as opt.intrinsics_options.share_intrinsics_per_sensor.\n  asp::loadValidateBaOptions(vm, inline_adjustments, opt);\n\n  // This better happen here so that do not need to carry all these strings around.\n  // TODO(oalexan1): Merge this into loadValidateBaOptions.\n  load_intrinsics_options(opt.solve_intrinsics, !vm[\"intrinsics-to-share\"].defaulted(),\n                          intrinsics_to_float_str, intrinsics_to_share_str,\n                          opt.intrinsics_options);\n  asp::parse_intrinsics_limits(intrinsics_limit_str, opt.intrinsics_limits);\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Sessions/BundleAdjustParse.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Parse and validate bundle_adjust options. This makes use of StereoSession so\n// must be in this directory.\n\n#ifndef __ASP_SESSION_BUNDLE_ADJUST_PARSE_H__\n#define __ASP_SESSION_BUNDLE_ADJUST_PARSE_H__\n\n#include <asp/Camera/BundleAdjustOptions.h>\n\nnamespace asp {\n  \n// Process the bundle_adjust options and sanity checks\nvoid handleBaArgs(int argc, char *argv[], asp::BaOptions& opt);\n  \n} // end namespace asp\n\n#endif // __ASP_SESSION_BUNDLE_ADJUST_PARSE_H__\n"
  },
  {
    "path": "src/asp/Sessions/BundleAdjustSession.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// \\file BundleAdjustSession.cc\n// Bundle adjustment functions that need StereoSession\n\n#include <asp/Core/ImageNormalization.h>\n#include <asp/Core/ImageUtils.h>\n#include <asp/Core/IpMatchingAlgs.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/FileUtils.h>\n#include <asp/Camera/BundleAdjustOptions.h>\n#include <asp/Sessions/BundleAdjustSession.h>\n#include <asp/Sessions/StereoSession.h>\n#include <asp/Sessions/StereoSessionFactory.h>\n\n#include <vw/InterestPoint/MatcherIO.h>\n#include <vw/Cartography/GeoTransform.h>\n\n#include <set>\n\nnamespace asp {\n\nusing namespace vw;\n\n// Create matches among the mapprojected images (or use any such matches created\n// beforehand manually by the user), and undo the mapprojection. All matches are\n// saved to files.\nvoid matchesFromMapprojImages(int i, int j,\n                              asp::BaOptions& opt, asp::SessionPtr session,\n                              std::vector<std::string> const& map_files,\n                              std::string mapproj_dem,\n                              vw::cartography::GeoReference const& dem_georef,\n                              vw::ImageViewRef<vw::PixelMask<double>> & interp_dem,\n                              std::string const& match_filename) {\n\n  vw::cartography::GeoReference georef1, georef2;\n  vw_out() << \"Reading georef from \" << map_files[i] << ' ' << map_files[j] << std::endl;\n  bool is_good1 = vw::cartography::read_georeference(georef1, map_files[i]);\n  bool is_good2 = vw::cartography::read_georeference(georef2, map_files[j]);\n  if (!is_good1 || !is_good2)\n    vw_throw(ArgumentErr() << \"Error: Cannot read georeference.\\n\");\n\n  std::string image1_path  = opt.image_files[i];\n  std::string image2_path  = opt.image_files[j];\n  if (boost::filesystem::exists(match_filename)) {\n    vw_out() << \"Using cached match file: \" << match_filename << \"\\n\";\n    return;\n  }\n\n  // TODO(oalexan1):  What if mapprojection was done with a different camera\n  // model? Such as RPC vs DG? Also must check the DEM and adjust prefix! Same\n  // as when undoing mapprojection during stereo.\n  if (opt.skip_matching)\n    return;\n\n  // If the match file does not exist, create it. The user can create this manually\n  // too.\n  bool matches_as_txt = asp::stereo_settings().matches_as_txt;\n  std::string map_match_file = ip::match_filename(opt.out_prefix,\n                                                  map_files[i], map_files[j],\n                                                  matches_as_txt);\n  try {\n    asp::matchIp(opt.out_prefix, opt.enable_rough_homography, opt.pct_for_overlap,\n                 session, map_files[i], map_files[j],\n                 NULL, NULL, // no cameras\n                 map_match_file);\n  } catch (const std::exception& e) {\n    vw_out() << \"Could not find interest points between images \"\n             << map_files[i] << \" and \" << map_files[j] << std::endl;\n    vw_out(WarningMessage) << e.what() << std::endl;\n    return;\n  } //End try/catch\n\n  if (!boost::filesystem::exists(map_match_file)) {\n    vw_out() << \"Missing: \" << map_match_file << \"\\n\";\n    return;\n  }\n\n  vw_out() << \"Reading: \" << map_match_file << std::endl;\n  std::vector<ip::InterestPoint> ip1,     ip2;\n  std::vector<ip::InterestPoint> ip1_cam, ip2_cam;\n  ip::read_match_file(map_match_file, ip1, ip2, matches_as_txt);\n\n  // Undo the map-projection\n  vw::CamPtr left_map_proj_cam, right_map_proj_cam;\n  session->read_mapproj_cams(map_files[i], map_files[j],\n                             opt.camera_files[i], opt.camera_files[j],\n                             mapproj_dem, session->name(),\n                             left_map_proj_cam, right_map_proj_cam);\n\n  for (size_t ip_iter = 0; ip_iter < ip1.size(); ip_iter++) {\n    vw::ip::InterestPoint P1 = ip1[ip_iter];\n    vw::ip::InterestPoint P2 = ip2[ip_iter];\n    if (!asp::projected_ip_to_raw_ip(P1, interp_dem, left_map_proj_cam,\n                                     georef1, dem_georef))\n      continue;\n    if (!asp::projected_ip_to_raw_ip(P2, interp_dem, right_map_proj_cam,\n                                      georef2, dem_georef))\n      continue;\n\n    ip1_cam.push_back(P1);\n    ip2_cam.push_back(P2);\n  }\n\n  vw::vw_out() << \"Saving \" << ip1_cam.size() << \" matches.\\n\";\n\n  vw::vw_out() << \"Writing: \" << match_filename << std::endl;\n  vw::ip::write_match_file(match_filename, ip1_cam, ip2_cam, matches_as_txt);\n\n} // End function matchesFromMapprojImages()\n\nvoid findPairwiseMatches(asp::BaOptions & opt, // will change\n                         std::vector<std::string> const& map_files,\n                         std::string const& mapproj_dem,\n                         std::vector<vw::Vector3> const& estimated_camera_gcc,\n                         bool need_no_matches) {\n\n  bool matches_as_txt = asp::stereo_settings().matches_as_txt;\n  int num_images = opt.image_files.size();\n  const bool got_est_cam_positions =\n    (estimated_camera_gcc.size() == static_cast<size_t>(num_images));\n\n  // When prior matches are used, accept them in any order\n  bool external_matches = (!opt.clean_match_files_prefix.empty() ||\n                           !opt.match_files_prefix.empty() ||\n                           opt.skip_matching);\n\n  // Make a list of all the image pairs to find matches for. When using external\n  // matches, try to read read both image1__image2 and image2__image1 matches.\n  std::vector<std::pair<int,int>> all_pairs;\n  if (!need_no_matches)\n    asp::determineImagePairs(// Inputs\n                             opt.overlap_limit, opt.match_first_to_last,\n                             external_matches,\n                             opt.image_files, got_est_cam_positions,\n                             opt.position_filter_dist, estimated_camera_gcc,\n                             opt.have_overlap_list, opt.overlap_list,\n                             // Output\n                             all_pairs);\n\n  // Need this information in parallel_bundle_adjust for load balancing.\n  if (opt.query_num_image_pairs) {\n    vw::vw_out() << \"num_image_pairs,\" << all_pairs.size() << \"\\n\";\n    exit(0);\n  }\n\n  // Assign the pairs (match files) which this job should compute, when called\n  // from parallel_bundle_adjust. TODO(oalexan1): It is hard to understand the\n  // logic here.  \n  size_t per_job = all_pairs.size() / opt.num_parallel_jobs; // Round down\n  size_t remainder = all_pairs.size() % opt.num_parallel_jobs;\n  size_t curr_job_start_index = 0, curr_job_num_tasks = 0;\n  for (size_t i = 0; i <= opt.job_id; i++) {\n    curr_job_num_tasks = per_job;\n    if (i < remainder)\n      curr_job_num_tasks++;\n    curr_job_start_index += curr_job_num_tasks;\n  }\n  curr_job_start_index -= curr_job_num_tasks;\n\n  // Sanity check\n  if (opt.num_parallel_jobs == 1) {\n    if (curr_job_start_index != 0 || curr_job_num_tasks != all_pairs.size())\n      vw::vw_throw(vw::ArgumentErr() << \"Book-keeping failure in bundle_adjust.\\n\");\n  }\n\n  std::vector<std::pair<int,int>> curr_job_pairs;\n  for (size_t i = 0; i < curr_job_num_tasks; i++)\n    curr_job_pairs.push_back(all_pairs[i+curr_job_start_index]);\n\n  // When using --match-files-prefix or --clean-match-files-prefix, form the\n  // list of match files, rather than searching for them exhaustively on disk,\n  // which can get very slow.\n  std::set<std::string> existing_files;\n  if (external_matches && !need_no_matches) {\n    std::string prefix = asp::matchMultiPrefix(opt.clean_match_files_prefix,\n                                               opt.match_files_prefix,\n                                               opt.out_prefix);\n    vw_out() << \"Computing the list of existing match files.\\n\";\n    asp::listExistingMatchFiles(prefix, matches_as_txt, existing_files);\n  }\n\n  vw::cartography::GeoReference dem_georef;\n  ImageViewRef<PixelMask<double>> interp_dem;\n  if (mapproj_dem != \"\")\n      asp::create_interp_dem(mapproj_dem, dem_georef, interp_dem);\n\n  // Process the selected pairs\n  // TODO(oalexan1): This block must be a function.\n  for (size_t k = 0; k < curr_job_pairs.size(); k++) {\n\n    if (need_no_matches)\n      continue;\n\n    const int i = curr_job_pairs[k].first;\n    const int j = curr_job_pairs[k].second;\n\n    std::string const& image1_path  = opt.image_files[i];  // alias\n    std::string const& image2_path  = opt.image_files[j];  // alias\n    std::string const& camera1_path = opt.camera_files[i]; // alias\n    std::string const& camera2_path = opt.camera_files[j]; // alias\n\n    // See if perhaps to load match files from a different source\n    std::string match_file\n      = asp::matchFileMultiPrefix(opt.clean_match_files_prefix, opt.match_files_prefix,\n                                  opt.out_prefix, image1_path, image2_path,\n                                  matches_as_txt);\n\n    // The external match file does not exist, don't try to load it\n    if (external_matches && existing_files.find(match_file) == existing_files.end())\n      continue;\n\n    opt.match_files[std::make_pair(i, j)] = match_file;\n\n    // If we skip matching (which is the case, among other situations, when\n    // using external matches), there's no point in checking if the match\n    // files are recent.\n    bool inputs_changed = false;\n    if (!opt.skip_matching) {\n      inputs_changed = (!asp::first_is_newer(match_file,\n                                             image1_path,  image2_path,\n                                             camera1_path, camera2_path));\n\n      // We make an exception and not rebuild if explicitly asked\n      if (asp::stereo_settings().force_reuse_match_files &&\n          boost::filesystem::exists(match_file))\n        inputs_changed = false;\n    }\n\n    if (!inputs_changed) {\n      vw_out() << \"\\t--> Using cached match file: \" << match_file << \"\\n\";\n      continue;\n    }\n\n    // Read no-data\n    boost::shared_ptr<DiskImageResource>\n      rsrc1(vw::DiskImageResourcePtr(image1_path)),\n      rsrc2(vw::DiskImageResourcePtr(image2_path));\n    if ((rsrc1->channels() > 1) || (rsrc2->channels() > 1))\n      vw_throw(ArgumentErr() << \"Error: Input images can only have a single channel!\\n\\n\");\n    float nodata1, nodata2;\n    asp::get_nodata_values(rsrc1, rsrc2, asp::stereo_settings().nodata_value, nodata1, nodata2);\n\n    // Set up the stereo session\n    asp::SessionPtr\n      session(asp::StereoSessionFactory::create(opt.stereo_session, // may change\n                                                opt, image1_path, image2_path,\n                                                camera1_path, camera2_path,\n                                                opt.out_prefix));\n\n    // Find matches between image pairs. This may not always succeed.\n    try {\n      if (opt.mapprojected_data == \"\")\n        asp::matchIp(opt.out_prefix, opt.enable_rough_homography, opt.pct_for_overlap,\n                     session, image1_path, image2_path,\n                     opt.camera_models[i].get(),\n                     opt.camera_models[j].get(),\n                     match_file);\n      else\n        asp::matchesFromMapprojImages(i, j, opt, session, map_files, mapproj_dem,\n                                       dem_georef, interp_dem, match_file);\n\n      // Compute the coverage fraction\n      std::vector<ip::InterestPoint> ip1, ip2;\n      ip::read_match_file(match_file, ip1, ip2, matches_as_txt);\n      int right_ip_width = rsrc1->cols() *\n                            static_cast<double>(100-opt.ip_edge_buffer_percent)/100.0;\n      Vector2i ip_size(right_ip_width, rsrc1->rows());\n      double ip_coverage = asp::calc_ip_coverage_fraction(ip2, ip_size);\n      vw_out() << \"IP coverage fraction = \" << ip_coverage << std::endl;\n    } catch (const std::exception& e) {\n      vw_out() << \"Could not find interest points between images \"\n                << opt.image_files[i] << \" and \" << opt.image_files[j] << std::endl;\n      vw_out(WarningMessage) << e.what() << std::endl;\n    } //End try/catch\n  } // End loop through all input image pairs\n\n} // end function findPairwiseMatches()\n\n} // End namespace asp\n"
  },
  {
    "path": "src/asp/Sessions/BundleAdjustSession.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// \\file BundleAdjustSession.h\n// Bundle adjustment functions that need StereoSession\n\n#ifndef __BUNDLE_ADJUST_SESSION_H__\n#define __BUNDLE_ADJUST_SESSION_H__\n\n#include <vw/Cartography/GeoReference.h>\n#include <vw/Image/ImageViewRef.h>\n#include <vw/Image/PixelMask.h>\n\n#include <boost/shared_ptr.hpp>\n#include <string>\n\nnamespace vw {\n  namespace camera {\n    class CameraModel;\n  }\n}\n\nnamespace asp {\n\nclass BaOptions;\nclass StereoSession;\ntypedef boost::shared_ptr<StereoSession> SessionPtr;\n\n// Create matches among the mapprojected images (or use any such matches created\n// beforehand manually by the user), and undo the mapprojection. All matches are\n// saved to files.\nvoid matchesFromMapprojImages(int i, int j,\n                              asp::BaOptions& opt, asp::SessionPtr session,\n                              std::vector<std::string> const& map_files,\n                              std::string mapproj_dem,\n                              vw::cartography::GeoReference const& dem_georef,\n                              vw::ImageViewRef<vw::PixelMask<double>> & interp_dem,\n                              std::string const& match_filename);\n\nvoid findPairwiseMatches(asp::BaOptions & opt, // will change\n                         std::vector<std::string> const& map_files,\n                         std::string const& mapproj_dem,\n                         std::vector<vw::Vector3> const& estimated_camera_gcc,\n                         bool need_no_matches);\n\n} // end namespace asp\n\n#endif // __BUNDLE_ADJUST_SESSION_H__\n"
  },
  {
    "path": "src/asp/Sessions/CMakeLists.txt",
    "content": "# Use wrapper function at this level to avoid code duplication\nadd_library_wrapper(AspSessions \"${ASP_SESSIONS_SRC_FILES}\" \"${ASP_SESSIONS_TEST_FILES}\" \"${ASP_SESSIONS_LIB_DEPENDENCIES}\")\n"
  },
  {
    "path": "src/asp/Sessions/CameraModelLoader.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file CameraModelLoader.cc\n///\n\n#include <asp/Core/StereoSettings.h>\n#include <asp/Camera/CsmModel.h>\n#include <asp/Camera/LinescanDGModel.h>\n#include <asp/Camera/LinescanSpotModel.h>\n#include <asp/Camera/LinescanPeruSatModel.h>\n#include <asp/Camera/LinescanPleiadesModel.h>\n#include <asp/Camera/LinescanASTERModel.h>\n#include <asp/Sessions/CameraModelLoader.h>\n#include <asp/Camera/RPCModel.h>\n#include <asp/Camera/RPC_XML.h>\n#include <asp/asp_config.h> // defines ASP_HAVE_PKG_ISIS\n\n#if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1\n#include <asp/IsisIO/Equation.h>\n#include <asp/IsisIO/IsisCameraModel.h>\n#endif // ASP_HAVE_PKG_ISIS\n\n#include <vw/Camera/CameraUtilities.h>\n#include <vw/Core/Exception.h>\n#include <vw/Core/Log.h>\n#include <vw/FileIO/FileUtils.h>\n#include <vw/Math/EulerAngles.h>\n#include <vw/Math/Matrix.h>\n#include <vw/Camera/OpticalBarModel.h>\n#include <vw/Core/Stopwatch.h>\n#include <vw/FileIO/FileTypes.h>\n\n#include <xercesc/util/PlatformUtils.hpp>\n#include <boost/date_time/posix_time/posix_time.hpp>\n\n#include <map>\n#include <utility>\n#include <string>\n#include <ostream>\n#include <limits>\n\nnamespace asp {\n\nCameraModelLoader::CameraModelLoader() {\n  xercesc::XMLPlatformUtils::Initialize();\n}\n\nCameraModelLoader::~CameraModelLoader() {\n  xercesc::XMLPlatformUtils::Terminate();\n}\n\nboost::shared_ptr<vw::camera::CameraModel>\nCameraModelLoader::load_pinhole_camera_model(std::string const& path) const {\n  return vw::camera::load_pinhole_camera_model(path);\n}\n\n// Load an RPC camera file\n// - TODO: Move to another file\nboost::shared_ptr<vw::camera::CameraModel>\nCameraModelLoader::load_rpc_camera_model(std::string const& path) const {\n  \n  // Try the default loading method\n  RPCModel* rpc_model = NULL;\n  try {\n    RPCXML rpc_xml; // This is for reading XML files\n    rpc_xml.read_from_file(path);\n    rpc_model = new RPCModel(*rpc_xml.rpc_ptr()); // Copy the value\n  } catch (...) {\n  }\n  if (!rpc_model) { // The default loading method failed, try the backup method.\n    rpc_model = new RPCModel(path); // Invoke the GDAL driver for the image file\n  }\n  \n  // We don't catch an error here because the user will need to\n  // know of a failure at this point.\n  return boost::shared_ptr<asp::RPCModel>(rpc_model);\n}\n\n// Load a DG camera file\nboost::shared_ptr<vw::camera::CameraModel>\nCameraModelLoader::load_dg_camera_model(std::string const& path) const {\n  // Redirect to the call from LinescanDGModel.h file\n  return vw::CamPtr(load_dg_camera_model_from_xml(path));\n}\n\n// Load a spot5 camera file\nboost::shared_ptr<vw::camera::CameraModel>\nCameraModelLoader::load_spot5_camera_model(std::string const& path) const {\n  vw::Stopwatch sw;\n  sw.start();\n\n  vw::CamPtr ans = load_spot5_csm_camera_model_from_xml(path);\n\n  sw.stop();\n  vw::vw_out() << \"Load time: \" << sw.elapsed_seconds() << \" seconds.\\n\";\n\n  return ans;\n}\n\n// Load a PeruSat linescan camera file\nboost::shared_ptr<vw::camera::CameraModel>\nCameraModelLoader::load_perusat_camera_model(std::string const& path) const {\n  return vw::CamPtr(load_perusat_camera_model_from_xml(path));\n}\n\n// Load a Pleiades linescan camera file\nboost::shared_ptr<vw::camera::CameraModel>\nCameraModelLoader::load_pleiades_camera_model(std::string const& path) const {\n  return vw::CamPtr(load_pleiades_camera_model_from_xml(path));\n}\n\n// Load a SPOT 6/7 linescan camera file\nboost::shared_ptr<vw::camera::CameraModel>\nCameraModelLoader::load_spot_camera_model(std::string const& path) const {\n  return vw::CamPtr(load_spot_camera_model_from_xml(path));\n}\n\n// Load a ASTER camera file\nboost::shared_ptr<vw::camera::CameraModel>\nCameraModelLoader::load_ASTER_camera_model(std::string const& path) const {\n  return vw::CamPtr(load_ASTER_camera_model_from_xml(path));\n}\n\n// Load an ISIS camera model\nboost::shared_ptr<vw::camera::CameraModel>\nCameraModelLoader::load_isis_camera_model(std::string const& path) const {\n#if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1\n  return vw::CamPtr(new vw::camera::IsisCameraModel(path));\n#endif\n  // If ISIS was not enabled in the build, just throw an exception.\n  vw::vw_throw(vw::NoImplErr()\n               << \"Cannot load ISIS files because ISIS was not enabled in the build.\\n\");\n\n} // End function load_isis_camera_model()\n\n// Load an optical bar camera file\nboost::shared_ptr<vw::camera::CameraModel>\nCameraModelLoader::load_optical_bar_camera_model(std::string const& path) const {\n  return vw::CamPtr(new vw::camera::OpticalBarModel(path));\n}\n\n// Load a CSM camera file\nboost::shared_ptr<vw::camera::CameraModel> \nCameraModelLoader::load_csm_camera_model(std::string const& path) const {\n  \n  boost::shared_ptr<asp::CsmModel> cam_ptr(new asp::CsmModel());\n  if (vw::has_isd_extension(path)) {\n    // Load a .json file\n    cam_ptr->load_model(path);\n    return vw::CamPtr(cam_ptr);\n  }\n  \n  // The CSM model is embedded in the cub file\n#if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1\n  std::string modelState = asp::isis::csmStateFromIsisCube(path);\n  bool recreateModel = true; \n  cam_ptr->setModelFromStateString(modelState, recreateModel);\n#endif // ASP_HAVE_PKG_ISIS\n\n  return vw::CamPtr(cam_ptr);\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Sessions/CameraModelLoader.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n/// \\file CameraModelLoader.h\n///\n\n#ifndef __STEREO_SESSION_CAMERAMODELLOADER_H__\n#define __STEREO_SESSION_CAMERAMODELLOADER_H__\n\n\n#include <vw/Camera/CameraModel.h>\n\nnamespace asp {\n\n  class CameraModelLoader {\n  public:\n\n    // Setup/teardown code is handled here\n    // - Currently this just means the Xerces XML init/deinit functions.\n    CameraModelLoader();\n    ~CameraModelLoader();\n\n    // TODO: Add a generic loading function.\n\n    // Camera model loading functions\n    vw::CamPtr load_rpc_camera_model        (std::string const& path) const;\n    vw::CamPtr load_dg_camera_model         (std::string const& path) const;\n    vw::CamPtr load_pinhole_camera_model    (std::string const& path) const;\n    vw::CamPtr load_isis_camera_model       (std::string const& path) const;\n    vw::CamPtr load_spot5_camera_model      (std::string const& path) const;\n    vw::CamPtr load_perusat_camera_model    (std::string const& path) const;\n    vw::CamPtr load_pleiades_camera_model   (std::string const& path) const;\n    vw::CamPtr load_spot_camera_model      (std::string const& path) const;\n    vw::CamPtr load_ASTER_camera_model      (std::string const& path) const;\n    vw::CamPtr load_optical_bar_camera_model(std::string const& path) const;\n    vw::CamPtr load_csm_camera_model        (std::string const& path) const;\n  }; // End class CameraModelLoader\n\n  \n} // end namespace asp\n\n#endif // __STEREO_SESSION_CAMERAMODELLOADER_H__\n"
  },
  {
    "path": "src/asp/Sessions/CameraUtils.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// Camera utilities that need the stereo session\n\n/// \\file CameraUtils.cc\n\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/AspStringUtils.h>\n#include <asp/Sessions/CameraUtils.h>\n#include <asp/Sessions/StereoSessionFactory.h>\n#include <asp/Core/DemUtils.h>\n#include <asp/Core/FileUtils.h>\n#include <asp/Core/ImageUtils.h>\n\n#include <vw/Cartography/Map2CamTrans.h>\n#include <vw/Core/Exception.h>\n#include <vw/Camera/PinholeModel.h>\n#include <vw/Camera/CameraUtilities.h>\n#include <vw/InterestPoint/InterestPoint.h>\n#include <vw/Core/Stopwatch.h>\n\n#include <boost/filesystem.hpp>\n#include <omp.h>\n\n#include <string>\n#include <iostream>\n\nnamespace fs = boost::filesystem;\n\nnamespace asp {\n\nvoid load_camera(std::string const& image_file,\n                 std::string const& camera_file,\n                 std::string const& out_prefix,\n                 vw::GdalWriteOptions const& opt,\n                 bool approximate_pinhole_intrinsics,\n                 bool quiet,\n                 // Outputs\n                 asp::SessionPtr & session,\n                 std::string     & stereo_session,\n                 vw::CamPtr      & camera_model,\n                 bool            & single_threaded_camera) {\n\n  // Must have a try block, as otherwise OpenMP crashes the program\n  // as the caller seems unable to catch the exception from threads.\n  try {\n    std::string input_dem = \"\"; // No DEM\n    bool allow_map_promote = false;\n    if (session.get() == NULL) {\n      session = asp::StereoSessionFactory::create\n                      (stereo_session, // may change\n                      opt, image_file, image_file,\n                      camera_file, camera_file,\n                      out_prefix, input_dem,\n                      allow_map_promote, quiet);\n    \n      // This is necessary to avoid a crash with ISIS cameras which is single-threaded\n      // TODO(oalexan1): Check this value for csm cameras embedded in ISIS images.\n      single_threaded_camera = (!session->supports_multi_threading());\n    }\n    \n    bool local_quiet = true; // To not print messages about loading each camera\n    camera_model = session->camera_model(image_file, camera_file, local_quiet);\n    if (approximate_pinhole_intrinsics) {\n      boost::shared_ptr<vw::camera::PinholeModel> pinhole_ptr = \n        boost::dynamic_pointer_cast<vw::camera::PinholeModel>(camera_model);\n      // Must be non-null\n      if (pinhole_ptr.get() == NULL) \n        vw::vw_throw(vw::ArgumentErr() << \"Expecting a pinhole camera model.\\n\");\n      // Replace lens distortion with fast approximation\n      bool force_conversion = false;\n      *pinhole_ptr.get()\n        = vw::camera::fitPinholeModel(pinhole_ptr.get(), vw::file_image_size(image_file),\n                                      \"TsaiLensDistortion\", force_conversion);\n    }\n  } catch (const std::exception& e) {\n    vw::vw_out() << e.what() << \"\\n\";\n  }\n}\n\n// Load cameras from given image and camera files. Load them in parallel except\n// for ISIS which is not thread-safe.\nvoid load_cameras(std::vector<std::string> const& image_files,\n                  std::vector<std::string> const& camera_files,\n                  std::string              const& out_prefix, \n                  vw::GdalWriteOptions     const& opt,\n                  bool approximate_pinhole_intrinsics,\n                  // Outputs\n                  std::string             & stereo_session,\n                  bool                    & single_threaded_camera,\n                  std::vector<vw::CamPtr> & camera_models) {\n\n  // Print a message as this may take a while\n  vw::vw_out() << \"Loading the cameras.\\n\";\n  \n  vw::Stopwatch sw;\n  sw.start();\n  \n  // Sanity check\n  if (image_files.size() != camera_files.size()) \n    vw::vw_throw(vw::ArgumentErr() << \"Expecting as many images as cameras.\\n\");  \n\n  camera_models.resize(image_files.size(), vw::CamPtr(NULL));\n\n  // First invocation. Will create the session. Will update\n  // single_threaded_camera, and stereo_session. All subsequent invocations will\n  // not change these so will be thread-safe.\n  asp::SessionPtr session(NULL); // will change\n  single_threaded_camera = false; // may change\n  bool quiet = false;\n  int i = 0;\n  load_camera(image_files[i], camera_files[i], out_prefix, opt,\n              approximate_pinhole_intrinsics, quiet,\n              session, stereo_session, camera_models[i], single_threaded_camera);\n\n  quiet = true;\n  if (!single_threaded_camera) {\n    // Use OpenMP to load the cameras in parallel\n    #pragma omp parallel for\n    for (size_t i = 0; i < image_files.size(); i++)\n      load_camera(image_files[i], camera_files[i], out_prefix, opt,\n                  approximate_pinhole_intrinsics, quiet,\n                  session, stereo_session, camera_models[i], single_threaded_camera);\n      \n    // Check that the cameras got loaded\n    for (size_t i = 0; i < camera_models.size(); i++) {\n      if (camera_models[i].get() == NULL) \n        vw::vw_throw(vw::ArgumentErr() << \"Failed to load all camera models.\\n\");\n    }  \n  } else {\n    // Load the cameras one by one. This is needed for ISIS cameras.\n    for (size_t i = 0; i < image_files.size(); i++)\n      load_camera(image_files[i], camera_files[i], out_prefix, opt,\n                  approximate_pinhole_intrinsics, quiet,\n                  session, stereo_session, camera_models[i], single_threaded_camera);\n  }\n  \n  sw.stop();\n  vw::vw_out() << \"Loading cameras elapsed time: \" << sw.elapsed_seconds() << \" seconds.\\n\";\n  return;\n}\n\n// Guess the based on camera position. Usually one arrives here for pinhole\n// cameras. This function is to be used when anything else fails.\nbool guessDatum(double cam_center_radius, vw::cartography::Datum & datum) {\n\n  bool success = false;\n  \n  // Datums for Earth, Mars, and Moon\n  vw::cartography::Datum earth(\"WGS84\");\n  vw::cartography::Datum mars(\"D_MARS\");\n  vw::cartography::Datum moon(\"D_MOON\");\n  \n  double km = 1000.0;\n  if (cam_center_radius > earth.semi_major_axis() - 100*km && \n      cam_center_radius < earth.semi_major_axis() + 5000*km) {\n    datum = earth;\n    success = true;\n  } else if (cam_center_radius > mars.semi_major_axis() - 100*km && \n             cam_center_radius < mars.semi_major_axis() + 1500*km) {\n    datum = mars;\n    success = true;\n  } else if (cam_center_radius > moon.semi_major_axis() - 100*km && \n             cam_center_radius < moon.semi_major_axis() + 1000*km) {\n    datum = moon;\n    success = true;\n  }\n\n  return success;\n}\n\n// Find the datum based on cameras. Return true on success. Otherwise don't set it.\nbool datum_from_camera(std::string const& image_file,\n                       std::string const& camera_file, \n                       std::string & stereo_session, // may change\n                       asp::SessionPtr & session, // may be null on input\n                       // Outputs\n                       vw::cartography::Datum & datum) {\n  \n  std::string out_prefix = \"run\";\n\n  // Look for a non-pinhole camera, as a pinhole camera does not have a datum\n  bool success = false;\n  double cam_center_radius = 0.0;\n  if (session.get() == NULL) {\n    // If a session was not passed in, create it here.\n    std::string input_dem = \"\"; // No DEM\n    bool allow_map_promote = false, quiet = true;\n    session = asp::StereoSessionFactory::create(stereo_session, // may change\n                                                vw::GdalWriteOptions(),\n                                                image_file, image_file,\n                                                camera_file, camera_file,\n                                                out_prefix, input_dem,\n                                                allow_map_promote, quiet);\n  }\n    \n  bool use_sphere_for_non_earth = true;\n  auto cam = session->camera_model(image_file, camera_file);\n  datum = session->get_datum(cam.get(), use_sphere_for_non_earth);\n  success = session->have_datum(); \n\n  // TODO(oalexan1): Must have the function get_datum() return success or not.\n  // That must be checked at each location. then the block below can be removed.\n  if (!success && !asp::stereo_settings().no_datum && !stereo_settings().correlator_mode) {\n    double cam_center_radius = norm_2(cam->camera_center(vw::Vector2()));\n    success = guessDatum(cam_center_radius, datum);\n    if (success)\n      vw::vw_out() << \"Guessed the datum from camera position.\\n\";\n  }\n  \n  return success;\n}\n\n// Validate that key exists in the map and the value is a vector of 4 entries,\n// each equal to \"0\".\nvoid validateCropWin(std::string const& key, std::string const& file,  \n                     std::map<std::string, std::vector<std::string>> const& vals) {\n\n  if (vals.find(key) == vals.end())\n    vw::vw_throw(vw::ArgumentErr() << \"Missing entry for \" << key << \" in \" << file << \".\\n\");\n     \n  std::vector<std::string> const& v = vals.find(key)->second;\n  if (v.size() != 4)\n    vw::vw_throw(vw::ArgumentErr() << \"Expecting 4 entries for \" << key << \" in \" \n                 << file << \".\\n\");\n  \n  for (int i = 0; i < 4; i++)\n    if (v[i] != \"0\")\n        vw::vw_throw(vw::ArgumentErr() << \"Cannot use a run produced with cropped images.\\n\");\n}\n\n// Given a list of stereo prefixes, extract the indices of the left and right\n// images in the full list of images, the alignment transforms, disparities,\n// and sessions.\nvoid parseStereoRuns(std::string const& prefix_file,\n                     std::vector<std::string> const& all_image_files,\n                     // Outputs\n                     std::vector<int> & left_indices,\n                     std::vector<int> & right_indices,\n                     std::vector<asp::SessionPtr>  & sessions,\n                     std::vector<vw::TransformPtr> & left_trans,\n                     std::vector<vw::TransformPtr> & right_trans,\n                     std::vector<std::string>      & disp_files) {\n\n  // Must have at least one stereo run\n  if (prefix_file.empty())\n    vw::vw_throw(vw::ArgumentErr() << \"No list of stereo runs was specified.\\n\");\n\n  // Wipe the outputs\n  left_indices.clear();\n  right_indices.clear();\n  sessions.clear();\n  left_trans.clear();\n  right_trans.clear();\n  disp_files.clear();\n  \n  // Read the list of stereo prefixes\n  std::vector<std::string> prefix_list;\n  asp::read_list(prefix_file, prefix_list);\n  if (prefix_list.empty())\n    vw::vw_throw(vw::ArgumentErr() << \"Expecting at least one stereo prefix.\\n\");\n  \n  // For each left and right image in the stereo run, find the index in \n  // the input cameras, and the transforms.\n  for (size_t i = 0; i < prefix_list.size(); i++) {\n    \n    std::string stereo_prefix = prefix_list[i];\n    std::string info_file = stereo_prefix + \"-info.txt\";\n    // If it does not exist, the run is invalid\n    if (!fs::exists(info_file))\n      vw::vw_throw(vw::ArgumentErr() << \"Missing: \" << info_file \n                     << \". Invalid stereo run.\\n\");\n   \n    std::map<std::string, std::vector<std::string>> vals;\n    asp::parseKeysVals(info_file, vals);\n    \n    // Must not have a run with crop wins\n    validateCropWin(\"left_image_crop_win:\", info_file, vals);\n    validateCropWin(\"right_image_crop_win:\", info_file, vals);\n    \n    // This DEM is nonempty if the images are mapprojected\n    std::string input_dem;\n    auto dem_val = vals.find(\"input_dem:\");\n    if (dem_val != vals.end() && !dem_val->second.empty())\n      input_dem = dem_val->second[0];\n    \n    // Must have only two images in each run\n    auto img_val = vals.find(\"images:\");\n    if (img_val == vals.end())\n      vw::vw_throw(vw::ArgumentErr() << \"Missing left_image_path in \" << info_file << \".\\n\");\n    auto images = img_val->second;\n    if (images.size() > 2)\n      vw::vw_throw(vw::ArgumentErr() << \"Cannot handle multiview stereo runs.\\n\"); \n    if (images.size() != 2)\n      vw::vw_throw(vw::ArgumentErr() << \"Expecting two images in \" << info_file << \".\\n\");\n    \n    // Find the camera files\n    auto cam_val = vals.find(\"cameras:\");\n    if (cam_val == vals.end())\n      vw::vw_throw(vw::ArgumentErr() << \"Missing camera_files in \" << info_file << \".\\n\");\n    auto cameras = cam_val->second;\n    if (cameras.size() != 2)\n      vw::vw_throw(vw::ArgumentErr() << \"Expecting two camera files in \" \n                   << info_file << \".\\n\");\n      \n    // Find the raw images, for when the images are mapprojected\n    std::vector<std::string> raw_images = images; \n    for (size_t i = 0; i < images.size(); i++) {\n      \n      if (input_dem.empty())\n        continue; \n        \n      std::string img = images[i];\n      // Read the raw image name from the mapprojection metadata.\n      std::string adj_key, img_key, cam_type_key, cam_file_key, dem_key;\n      std::string adj, raw_img, cam_type, cam_file, dem;\n      asp::read_mapproj_header(img, adj_key, img_key, cam_type_key,\n                               cam_file_key, dem_key, adj, raw_img,\n                               cam_type, cam_file, dem);\n      if (raw_img.empty())\n        vw::vw_throw(vw::ArgumentErr() << \"Failed to find the raw image name in \"\n                     << \"the geoheader of \" << img << \".\\n\");\n      raw_images[i] = raw_img;\n    }\n    \n    // Each raw image must be among the input images\n    int left_index = -1, right_index = -1;\n    for (size_t i = 0; i < all_image_files.size(); i++) {\n      if (all_image_files[i] == raw_images[0])\n        left_index = i;\n      if (all_image_files[i] == raw_images[1])\n        right_index = i;\n    }\n    // If not found, that's a failure\n    if (left_index < 0 || right_index < 0)\n      vw::vw_throw(vw::ArgumentErr() << \"Some images for the stereo run: \" << stereo_prefix\n                   << \" are not among the input images for the jitter solver.\\n\");\n    \n    auto session_val = vals.find(\"stereo_session:\");\n    if (session_val == vals.end() || session_val->second.empty())\n      vw::vw_throw(vw::ArgumentErr() << \"Missing stereo_session in \" << info_file << \".\\n\");\n    std::string stereo_session = session_val->second[0];\n    \n    auto alignment_val = vals.find(\"alignment_method:\");\n    if (alignment_val == vals.end() || alignment_val->second.empty())\n      vw::vw_throw(vw::ArgumentErr() << \"Missing alignment_method in \" << info_file << \".\\n\");\n    std::string curr_alignment_method = alignment_val->second[0];\n    // For epipolar alignment, the transforms need a different approach\n    if (curr_alignment_method == \"epipolar\")\n      vw::vw_throw(vw::ArgumentErr() \n                   << \"Cannot use a run produced with epipolar alignment.\\n\");\n      \n    // Temporarily replace the alignment method so we can fetch the transform\n    std::string orig_alignment_method = asp::stereo_settings().alignment_method;\n    \n    asp::stereo_settings().alignment_method = curr_alignment_method;\n    \n    // The prefix from the info file must agree with the one passed in\n    auto prefix_val = vals.find(\"output_prefix:\");\n    if (prefix_val == vals.end() || prefix_val->second.empty())\n      vw::vw_throw(vw::ArgumentErr() << \"Missing output_prefix in \" << info_file << \".\\n\");\n    if (prefix_val->second[0] != stereo_prefix)\n      vw::vw_throw(vw::ArgumentErr() << \"Mismatch between output prefix in \" << info_file\n                   << \" and the stereo prefix.\\n\");\n     \n    vw::GdalWriteOptions opt;   \n    asp::SessionPtr session\n     (asp::StereoSessionFactory::create(stereo_session, // may change\n                                       opt, images[0], images[1],\n                                       cameras[0], cameras[1],\n                                       stereo_prefix, input_dem));\n  \n     std::string disp_file = stereo_prefix + \"-F.tif\";\n     if (!fs::exists(disp_file))\n       vw::vw_throw(vw::ArgumentErr() << \"Missing: \" << disp_file \n                      << \". Invalid stereo run.\\n\"); \n    \n    // Must not have an -L_cropped.tif file as then cannot use the run.\n    // Same for -R_cropped.tif and for L.tsai and R.tsai.\n    std::string left_cropped = stereo_prefix + \"-L-cropped.tif\";\n    std::string right_cropped = stereo_prefix + \"-R-cropped.tif\"; \n    if (fs::exists(left_cropped) || fs::exists(right_cropped))\n      vw::vw_throw(vw::ArgumentErr()\n                   << \"Cannot use a run produced with cropped images.\\n\");\n    std::string left_tsai = stereo_prefix + \"-L.tsai\";\n    std::string right_tsai = stereo_prefix + \"-R.tsai\";\n    if (fs::exists(left_tsai) || fs::exists(right_tsai))\n      vw::vw_throw(vw::ArgumentErr() \n                   << \"Cannot use a run produced with epipolar alignment.\\n\");\n    \n    // Add to the indices and transforms\n    left_indices.push_back(left_index);\n    right_indices.push_back(right_index);\n    sessions.push_back(session);\n    left_trans.push_back(session->tx_left());\n    right_trans.push_back(session->tx_right());\n    disp_files.push_back(disp_file);\n                                 \n    // Put back the original alignment method\n    asp::stereo_settings().alignment_method = orig_alignment_method;\n  } // end loop through stereo prefixes\n  \n}\n\n// Computes a Map2CamTrans given a DEM, image, and a sensor model. Can take a\n// DEM height instead of a DEM file.\nvw::TransformPtr\ntransformFromMapProject(std::string dem_path,\n                        const std::string &img_file_path,\n                        vw::CamPtr map_proj_model_ptr,\n                        vw::GdalWriteOptions const& options,\n                        std::string const& tag, \n                        std::string const& out_prefix, \n                        double dem_height) {\n\n  // If the input DEM is empty, the dem height must not be nan\n  if (dem_path.empty() && std::isnan(dem_height))\n    vw::vw_throw(vw::ArgumentErr() << \"Must provide either a DEM file or a DEM height.\");\n  // But must have just one\n  if (!dem_path.empty() && !std::isnan(dem_height))\n    vw::vw_throw(vw::ArgumentErr() \n      << \"Must provide either a DEM file or a DEM height, not both.\");\n  \n  vw::DiskImageView<float> img(img_file_path);\n  vw::cartography::GeoReference image_georef;\n  if (!read_georeference(image_georef, img_file_path))\n    vw::vw_throw(vw::ArgumentErr() << \"Missing georeference in image: \" << img_file_path);\n\n  // For an orthoimage without a DEM, prepare one, unless it was already made.\n  // The produced dem will be at location dem_path.\n  if (!std::isnan(dem_height))\n    asp::setupOrCheckDem(options, img, image_georef, tag, out_prefix, dem_height,\n                         dem_path);\n  \n  // Read in data necessary for the Map2CamTrans object\n  vw::cartography::GeoReference dem_georef;\n  if (!read_georeference(dem_georef, dem_path))\n    vw::vw_throw(vw::ArgumentErr() << \"No georeference found in DEM: \" << dem_path);\n  bool call_from_mapproject = false;\n  return vw::TransformPtr(new vw::cartography::Map2CamTrans(map_proj_model_ptr.get(),\n                                   image_georef, dem_georef, dem_path,\n                                   vw::Vector2(img.cols(), img.rows()),\n                                   call_from_mapproject));\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Sessions/CameraUtils.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file CameraUtils.h\n/// Camera utilities that need the stereo session\n\n#ifndef __STEREO_SESSION_CAMERA_UTILS_H__\n#define __STEREO_SESSION_CAMERA_UTILS_H__\n\n#include <vector>\n#include <string>\n\n#include <vw/Camera/CameraModel.h>\n#include <vw/Math/Transform.h>\n#include <vw/FileIO/GdalWriteOptions.h>\n#include <vw/FileIO/DiskImageView.h>\n\nnamespace vw {\n  namespace cartography {\n    class Datum;\n  }\n  namespace ip {\n    class InterestPoint;\n  }\n}\n\nnamespace asp {\n\nclass StereoSession;\ntypedef boost::shared_ptr<StereoSession> SessionPtr;\n\n// Load cameras from given image and camera files\nvoid load_cameras(std::vector<std::string> const& image_files,\n                  std::vector<std::string> const& camera_files,\n                  std::string const& out_prefix, \n                  vw::GdalWriteOptions const& opt,\n                  bool approximate_pinhole_intrinsics,\n                  // Outputs\n                  std::string & stereo_session, // may change\n                  bool & single_threaded_cameras,\n                  std::vector<vw::CamPtr> & camera_models);\n\n// Guess the based on camera position. Usually one arrives here for pinhole\n// cameras.\nbool guessDatum(double cam_center_radius, vw::cartography::Datum & datum);\n  \n// Find the datum based on cameras. Return true on success.\nbool datum_from_camera(std::string const& image_file, \n                       std::string const& camera_file,\n                       std::string & stereo_session, // may change\n                       asp::SessionPtr & session, // may be null on input\n                       // Outputs\n                       vw::cartography::Datum & datum);\n\n// Given a list of stereo prefixes, extract some info about them\nvoid parseStereoRuns(std::string              const& prefix_file,\n                     std::vector<std::string> const& all_image_files,\n                     // Outputs\n                     std::vector<int>              & left_indices,\n                     std::vector<int>              & right_indices,\n                     std::vector<asp::SessionPtr>  & sessions,\n                     std::vector<vw::TransformPtr> & left_trans,\n                     std::vector<vw::TransformPtr> & right_trans,\n                     std::vector<std::string>      & disp_files);\n\n// Computes a Map2CamTrans given a DEM, image, and a sensor model. Can take a\n// DEM height instead of a DEM file.\nvw::TransformPtr\ntransformFromMapProject(std::string dem_path,\n                        const std::string &img_file_path,\n                        vw::CamPtr map_proj_model_ptr,\n                        vw::GdalWriteOptions const& options,\n                        std::string const& tag, \n                        std::string const& out_prefix, \n                        double dem_height);\n\n} // end namespace asp\n\n#endif // __STEREO_SESSION_CAMERA_UTILS_H__\n"
  },
  {
    "path": "src/asp/Sessions/StereoSession.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file StereoSession.cc\n///\n\n#include <asp/asp_config.h> // defines ASP_HAVE_PKG_ISIS\n#if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1\n#include <asp/IsisIO/IsisCameraModel.h>\n#endif // ASP_HAVE_PKG_ISIS\n\n#include <asp/Sessions/StereoSession.h>\n#include <asp/Sessions/CameraUtils.h>\n#include <asp/Sessions/StereoSessionFactory.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Camera/RPCModel.h>\n#include <asp/Camera/CsmModel.h>\n#include <asp/Core/AspStringUtils.h>\n#include <asp/Core/ImageUtils.h>\n#include <asp/Core/BaseCameraUtils.h>\n#include <asp/Core/AlignmentUtils.h>\n\n#include <vw/Core/Exception.h>\n#include <vw/Core/Log.h>\n#include <vw/Math/Vector.h>\n#include <vw/Math/Functors.h>\n#include <vw/Math/Geometry.h>\n#include <vw/Image/PixelMask.h>\n#include <vw/FileIO/DiskImageView.h>\n#include <vw/Cartography/GeoReferenceUtils.h>\n#include <vw/Cartography/Map2CamTrans.h>\n#include <vw/Cartography/DatumUtils.h>\n\n#include <boost/filesystem/operations.hpp>\n#include <boost/filesystem/path.hpp>\n\n#include <map>\n#include <utility>\n#include <string>\n\nusing namespace vw;\nusing namespace vw::cartography;\nnamespace fs = boost::filesystem;\n\nnamespace asp {\n\n  // Pass over all the string variables we use\n  void StereoSession::initialize(vw::GdalWriteOptions const& options,\n                                 std::string const& left_image_file,\n                                 std::string const& right_image_file,\n                                 std::string const& left_camera_file,\n                                 std::string const& right_camera_file,\n                                 std::string const& out_prefix,\n                                 std::string const& input_dem) {\n    m_options           = options;\n    m_left_image_file   = left_image_file;\n    m_right_image_file  = right_image_file;\n    m_left_camera_file  = left_camera_file;\n    m_right_camera_file = right_camera_file;\n    m_out_prefix        = out_prefix;\n    m_input_dem         = input_dem;\n\n    // Read the cameras used in mapprojection\n    if (isMapProjected())\n      read_mapproj_cams(m_left_image_file, m_right_image_file,\n                        m_left_camera_file, m_right_camera_file,\n                        m_input_dem, this->name(),\n                        m_left_map_proj_model, m_right_map_proj_model);\n  }\n\n  // Read keywords that describe how the images were map-projected.\n  // Do sanity checks.\n  void read_mapproj_header_session(std::string const& map_file,\n                                   std::string const& input_cam_file,\n                                   std::string const& input_dem,\n                                   std::string const& session_name,\n                                   // Outputs\n                                   std::string & adj_prefix,\n                                   std::string & image_file, std::string & cam_type,\n                                   std::string & cam_file, std::string & dem_file) {\n\n    // Call a lower-level function to do the reading\n    std::string adj_key, img_file_key, cam_type_key, cam_file_key, dem_file_key;\n    asp::read_mapproj_header(map_file,\n                             adj_key, img_file_key, cam_type_key, cam_file_key, dem_file_key,\n                             adj_prefix, image_file, cam_type, cam_file, dem_file);\n\n    // Sanity checks\n\n    bool has_geoheader_cam_type = true;\n    if (cam_type == \"\") {\n      // If cam_type is empty, and session name is XmapY, use cam type Y.\n      std::string tri_cam_type, mapproj_cam_type;\n      asp::parseCamTypes(session_name, tri_cam_type, mapproj_cam_type);\n      vw::vw_out(WarningMessage)\n           << \"Assuming mapprojection was done with camera type: \"\n           << mapproj_cam_type << \"\\n\";\n      cam_type = mapproj_cam_type;\n      has_geoheader_cam_type = false;\n    }\n\n    bool has_geoheader_image = true;\n    if (image_file == \"\") {\n      image_file = map_file; // should be enough to load the camera\n      has_geoheader_image = false;\n    }\n\n    // This is very hard to get right\n    if (cam_file == \"\") {\n      if (has_geoheader_cam_type && has_geoheader_image) {\n        // The mapprojection info was saved, but the camera file was empty.\n        // Then, the image file before mapprojection should have the camera.\n        cam_file = image_file;\n      } else {\n        // The mapprojection info was not saved. Use the user-supplied\n        // camera.\n        cam_file = input_cam_file;\n      }\n    }\n\n    if (dem_file == \"\") {\n      vw::vw_out(WarningMessage) << \"Missing field value for: \" << dem_file_key\n                                 << \" in \" << map_file << \".\\n\";\n      dem_file = input_dem; // should be enough to load the DEM\n      vw::vw_out(WarningMessage) << \"Using DEM: \" << dem_file << \" instead.\\n\";\n    }\n\n    vw::Vector2 heights = asp::stereo_settings().ortho_heights;\n    bool have_heights = (!std::isnan(heights[0]) && !std::isnan(heights[1]));\n\n    // TODO(oalexan1): When do not have heights, the dem_file must be non-empty\n    // and must exist.\n\n    // The DEM the user provided better be the one used for map projection.\n    // Give an error, as the results can be very different with the wrong DEM.\n    if (input_dem != dem_file && !asp::stereo_settings().accept_provided_mapproj_dem\n        && !have_heights)\n      vw::vw_throw(ArgumentErr()\n          << \"The DEM used for map projection is different from the one \"\n          << \"provided currently.\\n\"\n          << \"Mapprojection DEM: \" << dem_file << \"\\n\"\n          << \"Current DEM: \" << input_dem << \"\\n\"\n          << \"To override this error, use: --accept-provided-mapproj-dem.\\n\"\n          << \"Or, to change the DEM name in the geoheader of mapprojected images, run\\n\"\n          << \"  image_calc -c var_0 --mo DEM_FILE=myDem.tif in.tif -o out.tif -d float32\\n\"\n          << \"but only if sure that the DEMs are equivalent.\\n\");\n\n    // If this is set to none, it means no bundle-adjust prefix was used\n    if (adj_prefix == \"NONE\")\n      adj_prefix = \"\";\n  }\n\n  // When loading camera models from the image files, we either use the sensor\n  // model for the current session type or else the RPC model which is often\n  // used as an approximation. If that fails, create a new session from scratch\n  // and load the camera model with that.\n  void StereoSession::read_mapproj_cam(std::string const& image_file,\n                                       std::string const& cam_file,\n                                       std::string const& adj_prefix,\n                                       std::string const& cam_type,\n                                       vw::CamPtr & map_proj_cam) {\n\n    const Vector2 zero_pixel_offset(0,0);\n    try {\n      if (cam_type == \"rpc\") {\n        map_proj_cam = load_rpc_camera_model(image_file, cam_file,\n                                             adj_prefix, zero_pixel_offset);\n      } else { // Use the native model\n        map_proj_cam = load_camera_model(image_file, cam_file,\n                                         adj_prefix, zero_pixel_offset);\n      }\n    } catch (std::exception const& e) {\n      std::string msg = e.what();\n      vw_out() << \"Creating a new session to load the mapprojected camera model.\\n\";\n      std::string session_type = cam_type;\n      std::string out_prefix;\n      try {\n        asp::SessionPtr session(asp::StereoSessionFactory::create\n                            (session_type, // may change\n                             m_options, image_file, image_file, cam_file, cam_file,\n                             out_prefix));\n        map_proj_cam = session->load_camera_model(image_file, cam_file,\n                                                  adj_prefix, zero_pixel_offset);\n      } catch (std::exception const& e) {\n        vw_throw(ArgumentErr() << \"Failed to load the camera model from \" << cam_file\n                << \" for image: \" << image_file << \".\\n\"\n                << \"First error message: \" << msg << \"\\n\"\n                << \"Second error message: \" << e.what() << \"\\n\");\n      }\n    }\n\n    return;\n  }\n\n  // Read the cameras used to undo the mapprojection. The header file of the\n  // mapprojected images contain a lot of info that we load along the way,\n  // including the bundle adjust prefix that was used to create these images,\n  // which may be different than the one used later for triangulation.\n  void StereoSession::read_mapproj_cams(std::string const& left_image_file,\n                                        std::string const& right_image_file,\n                                        std::string const& left_camera_file,\n                                        std::string const& right_camera_file,\n                                        std::string const& input_dem,\n                                        std::string const& session_name,\n                                        vw::CamPtr & left_map_proj_cam,\n                                        vw::CamPtr & right_map_proj_cam) {\n\n    std::string l_adj_prefix, r_adj_prefix, l_image_file, r_image_file,\n    l_cam_type, r_cam_type, l_cam_file, r_cam_file, l_dem_file, r_dem_file;\n\n    vw::Vector2 heights = asp::stereo_settings().ortho_heights;\n    bool have_heights = (!std::isnan(heights[0]) && !std::isnan(heights[1]));\n\n    if (have_heights) {\n      // For ortho-ready images it is assumed the mapprojection was done\n      // with the original cameras and no bundle adjustment prefix was used.\n      l_cam_file = left_camera_file;\n      r_cam_file = right_camera_file;\n      l_cam_type = session_name;\n      r_cam_type = session_name;\n\n      // If not having cameras, use the images\n      if (l_cam_file == \"\")\n        l_cam_file = left_image_file;\n      if (r_cam_file == \"\")\n        r_cam_file = right_image_file;\n    } else {\n      // Load the name of the camera model, session, and DEM used in mapprojection\n      // based on the record in that image. Load the bundle adjust prefix from the\n      // mapprojected image. It can be empty, when such a prefix was not used in\n      // mapprojection.\n      read_mapproj_header_session(left_image_file, left_camera_file, input_dem,\n                                  session_name, l_adj_prefix, l_image_file, l_cam_type,\n                                  l_cam_file, l_dem_file);\n      read_mapproj_header_session(right_image_file, right_camera_file, input_dem,\n                                  session_name, r_adj_prefix, r_image_file, r_cam_type,\n                                  r_cam_file, r_dem_file);\n    }\n\n    vw_out() << \"Images before mapprojection: \"\n      << l_image_file << ' ' << r_image_file << \"\\n\";\n    vw_out() << \"Mapprojection cameras: \" << l_cam_file << ' ' << r_cam_file << \"\\n\";\n    vw_out() << \"Mapprojected images bundle adjustment prefixes: \"\n              << l_adj_prefix << ' ' << r_adj_prefix << \"\\n\";\n    vw_out() << \"Mapprojection cam types: \" << l_cam_type << ' ' << r_cam_type << \"\\n\";\n\n    // Load either the current session camera type, or rpc, or form a new session.\n    read_mapproj_cam(l_image_file, l_cam_file, l_adj_prefix, l_cam_type, left_map_proj_cam);\n    read_mapproj_cam(r_image_file, r_cam_file, r_adj_prefix, r_cam_type, right_map_proj_cam);\n\n    VW_ASSERT(left_map_proj_cam.get() && right_map_proj_cam.get(),\n              ArgumentErr() << \"StereoSession: Unable to locate map \"\n              << \"projection camera model inside input files.\");\n\n    // Double check that we can read the DEM and that it has cartographic information.\n    if (input_dem.empty() && !have_heights)\n       vw_throw(ArgumentErr() << \"StereoSession: An input DEM is required.\");\n    if (!boost::filesystem::exists(input_dem) && !have_heights)\n      vw_throw(ArgumentErr() << \"StereoSession: DEM '\" << input_dem << \"' does not exist.\");\n  }\n\n  // Default implementation of this function.  Derived classes will probably override this.\n  void StereoSession::camera_models(boost::shared_ptr<vw::camera::CameraModel> &cam1,\n                                    boost::shared_ptr<vw::camera::CameraModel> &cam2) {\n    cam1 = camera_model(m_left_image_file,  m_left_camera_file);\n    cam2 = camera_model(m_right_image_file, m_right_camera_file);\n  }\n\n// This will be overridden in some sessions\nbool StereoSession::have_datum() const {\n  return !asp::stereo_settings().no_datum && !stereo_settings().correlator_mode;\n}\n\n// Returns the target datum to use for a given camera model.\n// Can be overridden by derived classes.\n// If no success finding the datum, will return WGS84.\n// TODO(oalexan1): This must return a flag indicating if the datum was found.\nvw::cartography::Datum StereoSession::get_datum(const vw::camera::CameraModel* cam,\n                                                bool use_sphere_for_non_earth) const {\n\n  if (!stereo_settings().datum.empty())\n    return vw::cartography::Datum(stereo_settings().datum);\n\n  // For ISIS, can query the camera. This code is invoked for stereo with\n  // mapprojected ISIS cameras, as that use the mapprojected session, and not\n  // the ISIS one. In the latter case the ISIS session has this own\n  // implementation of this function.\n#if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1\n  vw::camera::IsisCameraModel const* isis_cam\n    = dynamic_cast<vw::camera::IsisCameraModel const*>(unadjusted_model(cam));\n  if (isis_cam != NULL)\n    return isis_cam->get_datum_isis(use_sphere_for_non_earth);\n#endif // ASP_HAVE_PKG_ISIS\n\n  // Do same for csm\n  asp::CsmModel const* csm_cam\n    = dynamic_cast<asp::CsmModel const*>(unadjusted_model(cam));\n  if (csm_cam != NULL)\n    return csm_cam->get_datum_csm(\"unknown\", use_sphere_for_non_earth);\n\n  // Same for RPC\n  asp::RPCModel const* rpc_cam\n     = dynamic_cast<const asp::RPCModel*>(vw::camera::unadjusted_model(cam));\n  if (rpc_cam != NULL)\n     return rpc_cam->datum();\n\n  // TODO(oalexan1): Need to find a systematic way of handling all\n  // these cases.\n\n  // Otherwise guess the datum based on the camera position.\n  // If no luck, it will return the default WGS84 datum.\n  // TODO(oalexan1): This may result in a bad datum for other planets.\n  double cam_center_radius\n      = norm_2(cam->camera_center(vw::Vector2()));\n  vw::cartography::Datum datum;\n  asp::guessDatum(cam_center_radius, datum);\n\n  return datum;\n}\n\n// Peek inside the images and camera models and return the datum and projection,\n// or at least the datum, packaged in a georef.\n// If no success finding the datum, will return WGS84.\nvw::cartography::GeoReference StereoSession::get_georef() {\n\n  vw::cartography::GeoReference georef;\n\n  // First try to see if the image is map-projected.\n  bool has_georef = read_georeference(georef, m_left_image_file);\n\n  bool has_datum = false;\n  vw::cartography::Datum datum;\n  if (!stereo_settings().correlator_mode) {\n    has_datum = true;\n    vw::CamPtr cam = this->camera_model(m_left_image_file, m_left_camera_file);\n    // Spherical datum for non-Earth, as done usually. Used\n    // consistently this way in bundle adjustment and stereo.\n    bool use_sphere_for_non_earth = true;\n    datum = this->get_datum(cam.get(), use_sphere_for_non_earth);\n  }\n\n  // Sanity check\n  if (has_georef && has_datum) {\n    // This check is very important, as it prevents a mixup of datums from\n    // different planets. The guessed datum may be unreliable, so always warn only.\n    bool warn_only = true;\n    vw::checkDatumConsistency(georef.datum(), datum, warn_only);\n  }\n\n  if (!has_georef) {\n    // The best we can do is to get the datum, even non-projected\n    // images have that. Create however a fake valid georeference to\n    // go with this datum, otherwise we can't read the datum when we\n    // needed it later.\n\n    georef = vw::cartography::GeoReference();\n    Matrix3x3 transform = georef.transform();\n\n    // assume these are degrees, does not mater much, but it needs be small enough\n    double small = 1e-8;\n    transform(0,0) = small;  // grid in x\n    transform(1,1) = -small; // grid in y; y always goes down\n    transform(0,2) = 0; // origin x\n    transform(1,2) = 0; // origin y\n    georef.set_transform(transform);\n\n    georef.set_geographic(); // default projection\n\n    if (has_datum)\n      georef.set_datum(datum);\n  }\n\n  return georef;\n}\n\nboost::shared_ptr<vw::camera::CameraModel>\nStereoSession::camera_model(std::string const& image_file, std::string const& camera_file,\n                            bool quiet) {\n\n  // TODO(oalexan1): ba_prefix better be passed from outside\n  std::string ba_prefix = asp::stereo_settings().bundle_adjust_prefix;\n\n  if (stereo_settings().correlator_mode) {\n    // No cameras exist, so make some dummy cameras. Recall that we\n    // set the session to rpc in this mode so that it is assumed that\n    // the cameras may hiding in the images rather than kept\n    // separately. In this mode the cameras should not actually get\n    // used.\n    vw::Vector<double, 20> v; v[0] = 1.0; // to a void a zero denominator\n    vw::Vector2 v2(1.0, 1.0); // to avoid division by 0\n    vw::Vector3 v3(1.0, 1.0, 1.0);\n    boost::shared_ptr<vw::camera::CameraModel>\n      cam(new RPCModel(vw::cartography::Datum(\"WGS84\"), v, v, v, v, v2, v2, v3, v3));\n    return cam;\n  }\n\n  // If the desired camera is already loaded, do not load it again.\n  std::pair<std::string, std::string> image_cam_pair = std::make_pair(image_file, camera_file);\n\n  auto map_it = m_camera_model.find(image_cam_pair);\n  if (map_it != m_camera_model.end())\n    return map_it->second;\n\n  // Sometime when we do many attempts at loading cameras we don't want to print\n  // this message.\n  if (!quiet)\n    vw_out() << \"Loading camera model: \" << image_file << ' ' << camera_file << \"\\n\";\n\n  // Retrieve the pixel offset (if any) to cropped images\n  vw::Vector2 pixel_offset = camera_pixel_offset(isMapProjected(),\n                                                 m_left_image_file,\n                                                 m_right_image_file,\n                                                 image_file);\n\n  vw::CamPtr cam;\n  if (camera_file == \"\") // No camera file provided, use the image file.\n    cam = load_camera_model(image_file, image_file, ba_prefix, pixel_offset);\n  else // Camera file provided\n    cam  = load_camera_model(image_file, camera_file, ba_prefix, pixel_offset);\n\n  {\n    // Save the camera model in the map to not load it again. Ensure thread safety.\n    vw::Mutex::Lock lock(m_camera_mutex);\n    m_camera_model[image_cam_pair] = cam;\n  }\n\n  return cam;\n}\n\nImageViewRef<PixelMask<Vector2f>>\nStereoSession::pre_pointcloud_hook(std::string const& input_file) {\n  return DiskImageView<PixelMask<Vector2f> >(input_file);\n}\n\nstd::string StereoSession::left_cropped_image(bool do_crop) const{\n  std::string cropped_image = m_left_image_file;\n  if (do_crop) {\n    // In stereo_dist_mode, the cropped and normalized image is L.tif, L-cropped.tif is skipped\n    if (stereo_settings().stereo_dist_mode)\n      cropped_image = m_out_prefix + \"-L.tif\";\n    else\n      cropped_image = m_out_prefix + \"-L-cropped.tif\";\n  }\n  std::cout << \"left_cropped_image: \" << cropped_image << \"\\n\";\n  return cropped_image;\n}\n\nstd::string StereoSession::right_cropped_image(bool do_crop) const{\n  std::string cropped_image = m_right_image_file;\n  if (do_crop) {\n    // In stereo_dist_mode, the cropped and normalized image is R.tif, R-cropped.tif is skipped\n    if (stereo_settings().stereo_dist_mode)\n      cropped_image = m_out_prefix + \"-R.tif\";\n    else\n      cropped_image = m_out_prefix + \"-R-cropped.tif\";\n  }\n  std::cout << \"right_cropped_image: \" << cropped_image << \"\\n\";\n  return cropped_image;\n}\n\nbool StereoSession::do_crop_left() const {\n  return stereo_settings().left_image_crop_win != BBox2i(0, 0, 0, 0);\n}\n\nbool StereoSession::do_crop_right() const {\n  return stereo_settings().right_image_crop_win != BBox2i(0, 0, 0, 0);\n}\n\n// Apply epipolar alignment to images, if the camera models are pinhole. This will\n// be reimplemented in StereoSessionPinhole.\nvoid StereoSession::\nepipolar_alignment(vw::ImageViewRef<vw::PixelMask<float>> left_masked_image,\n                   vw::ImageViewRef<vw::PixelMask<float>> right_masked_image,\n                   vw::ValueEdgeExtension<vw::PixelMask<float>> ext_nodata,\n                   // Outputs\n                   vw::ImageViewRef<vw::PixelMask<float>> & Limg,\n                   vw::ImageViewRef<vw::PixelMask<float>> & Rimg) {\n  vw_throw(ArgumentErr() << \"Epipolar alignment is only implemented for pinhole cameras.\");\n}\n\nvoid StereoSession::get_input_image_crops(vw::BBox2i &left_image_crop,\n                                          vw::BBox2i &right_image_crop) const {\n\n  // Set the ROIs to the entire image if the input crop windows are not set.\n  Vector2i left_size  = file_image_size(m_left_image_file);\n  Vector2i right_size = file_image_size(m_right_image_file);\n\n  if (do_crop_left())\n    left_image_crop  = stereo_settings().left_image_crop_win;\n  else\n    left_image_crop = BBox2i(0, 0, left_size [0], left_size [1]);\n\n  if (do_crop_right())\n    right_image_crop = stereo_settings().right_image_crop_win;\n  else\n    right_image_crop = BBox2i(0, 0, right_size[0], right_size[1]);\n}\n\nvw::TransformPtr StereoSession::tx_left_homography() const {\n  vw::Matrix<double> tx\n    = asp::alignmentMatrix(m_out_prefix, asp::stereo_settings().alignment_method,\n                           \"left\");\n  return vw::TransformPtr(new vw::HomographyTransform(tx));\n}\n\nvw::TransformPtr StereoSession::tx_right_homography() const {\n  vw::Matrix<double> tx\n    = asp::alignmentMatrix(m_out_prefix, asp::stereo_settings().alignment_method,\n                           \"right\");\n  return vw::TransformPtr(new vw::HomographyTransform(tx));\n}\n\nvw::TransformPtr StereoSession::tx_identity() const {\n  Matrix<double> tx = math::identity_matrix<3>();\n  return vw::TransformPtr(new vw::HomographyTransform(tx));\n}\n\nvw::TransformPtr StereoSession::tx_left_map_trans() const {\n\n  bool crop_left = do_crop_left();\n  std::string left_map_proj_image = this->left_cropped_image(crop_left);\n  if (!m_left_map_proj_model)\n    vw_throw(ArgumentErr() << \"Map projection model not loaded for image \"\n              << left_map_proj_image);\n  return asp::transformFromMapProject(m_input_dem, left_map_proj_image,\n                                      m_left_map_proj_model,\n                                      m_options, \"left\", m_out_prefix,\n                                      asp::stereo_settings().ortho_heights[0]);\n}\n\nvw::TransformPtr StereoSession::tx_right_map_trans() const {\n\n  bool crop_right = do_crop_right();\n  std::string right_map_proj_image = this->right_cropped_image(crop_right);\n  if (!m_right_map_proj_model)\n    vw_throw(ArgumentErr() << \"Map projection model not loaded for image \"\n              << right_map_proj_image);\n  return asp::transformFromMapProject(m_input_dem, right_map_proj_image,\n                                      m_right_map_proj_model,\n                                      m_options, \"right\", m_out_prefix,\n                                      asp::stereo_settings().ortho_heights[1]);\n}\n\n// Load an RPC model. Any adjustment in ba_prefix and pixel_offset\n// will be applied.\nboost::shared_ptr<vw::camera::CameraModel>\nStereoSession::load_rpc_camera_model(std::string const& image_file,\n                                     std::string const& camera_file,\n                                     std::string const& ba_prefix,\n                                     Vector2 pixel_offset) const {\n\n  std::string err1, err2;\n  try {\n    if (camera_file != \"\")\n      return load_adjusted_model(m_camera_loader.load_rpc_camera_model(camera_file),\n                                 image_file, camera_file, ba_prefix, pixel_offset);\n  } catch(std::exception const& e1) {\n    err1 = e1.what();\n  }\n  try {\n    return load_adjusted_model(m_camera_loader.load_rpc_camera_model(image_file),\n                               image_file, camera_file, ba_prefix, pixel_offset);\n  } catch(std::exception const& e2) {\n    err2 = e2.what();\n  }\n\n  // For Cartosat, GDAL chokes. The user must move {image}_RPC_ORG.TXT\n  // to {image}_RPC.TXT\n  std::string truncated = fs::path(image_file).replace_extension(\"\").string();\n  std::string org_file = truncated + \"_RPC_ORG.TXT\";\n  std::string rpc_file = truncated + \"_RPC.TXT\";\n  std::string msg = \"\";\n  if (boost::filesystem::exists(org_file))\n    msg = \"Detected file: \" + org_file + \". If this is Cartosat data, any such files \"\n      \"must be moved to names like \" + rpc_file\n      + \" by overwriting those files if necessary.\\n\";\n\n  // Raise a custom exception if both failed\n  vw_throw(ArgumentErr() << \"Unable to load RPC model from either \" << image_file\n          << \" or \" << camera_file << \".\\n\"\n       << err1 << \"\\n\" << err2 << \"\\n\" << msg);\n} // End function load_rpc_camera_model\n\n} // End namespace asp\n"
  },
  {
    "path": "src/asp/Sessions/StereoSession.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file StereoSession.h\n///\n\n#ifndef __STEREO_SESSION_H__\n#define __STEREO_SESSION_H__\n\n#include <asp/Sessions/CameraModelLoader.h>\n\n#include <vw/Cartography/GeoReference.h>\n#include <vw/Camera/CameraModel.h>\n#include <vw/Image/ImageViewBase.h>\n#include <vw/Image/ImageViewRef.h>\n#include <vw/Image/PixelMask.h>\n#include <vw/Image/Transform.h>\n#include <vw/FileIO/GdalWriteOptions.h>\n\n#include <boost/shared_ptr.hpp>\n\n// Forward declarations\nnamespace vw {\n  namespace ip {\n    struct InterestPoint;\n  }\n}\n\nnamespace asp {\n\ntypedef vw::Vector<vw::float32,6> Vector6f;\n\n// Forward declarations\nclass StereoSessionFactory;\n\n/// Stereo Sessions define for different missions or satellites how to:\n///   * Initialize, normalize, and align the input imagery\n///   * Extract the camera model\n///   * Custom code needed for correlation, filtering, and triangulation.\nclass StereoSession {\n  friend class StereoSessionFactory; // Needed so the factory can call initialize()\n\npublic:\n\n  virtual ~StereoSession() {}\n\n  /// Simple typedef of a factory function that creates a StereoSession instance\n  typedef StereoSession* (*construct_func)();\n\n  /// General init function.\n  void initialize(vw::GdalWriteOptions const& options,\n                  std::string const& left_image_file,\n                  std::string const& right_image_file,\n                  std::string const& left_camera_file,\n                  std::string const& right_camera_file,\n                  std::string const& out_prefix,\n                  std::string const& input_dem);\n\n  // The next set of functions describe characteristics of the derived session class.\n  // - These could be made in to some sort of static constant if needed.\n  virtual bool isMapProjected() const { return false; }\n  virtual bool have_datum() const;\n  virtual bool supports_multi_threading () const {\n    return true;\n  }\n\n  /// Helper function that retrieves both cameras.\n  virtual void camera_models(vw::CamPtr &cam1, vw::CamPtr &cam2);\n\n  /// Method that produces a Camera Model from input files.\n  virtual vw::CamPtr camera_model(std::string const& image_file,\n                                  std::string const& camera_file = \"\",\n                                  bool quiet = false);\n\n  /// Method to help determine what session we actually have\n  virtual std::string name() const = 0;\n\n  /// Specialization for how interest points are found\n  bool ip_matching(std::string  const& input_file1,\n                    std::string  const& input_file2,\n                    vw::Vector2  const& uncropped_image_size,\n                    Vector6f     const& stats1,\n                    Vector6f     const& stats2,\n                    float nodata1, float nodata2,\n                    vw::camera::CameraModel* cam1,\n                    vw::camera::CameraModel* cam2,\n                    std::string const& match_filename,\n                    std::string const left_ip_file = \"\",\n                    std::string const right_ip_file = \"\",\n                    vw::BBox2i const& bbox1 = vw::BBox2i(),\n                    vw::BBox2i const& bbox2 = vw::BBox2i());\n\n  // Returns the target datum to use for a given camera model.\n  // Can be overridden by derived classes.\n  virtual vw::cartography::Datum get_datum(const vw::camera::CameraModel* cam,\n                                            bool use_sphere_for_non_earth) const;\n\n  // Peek inside the images and camera models and return the datum and projection,\n  // or at least the datum, packaged in a georef.\n  virtual vw::cartography::GeoReference get_georef();\n\n  /// Get the crop ROI applied to the two input images.\n  void get_input_image_crops(vw::BBox2i &left_image_crop, vw::BBox2i &right_image_crop) const;\n\n  virtual vw::TransformPtr tx_left () const {return tx_left_homography ();} // Default implementation\n  virtual vw::TransformPtr tx_right() const {return tx_right_homography();}\n\n  // All of the \"hook\" functions below have default implementations\n  // that just copy the inputs to the outputs!\n\n  /// Stage 1: Preprocessing\n  ///\n  /// Pre  file is a pair of images.   (ImageView<PixelT>)\n  /// Post file is a grayscale images. (ImageView<PixelGray<float>>)\n  virtual void preprocessing_hook(bool adjust_left_image_size,\n                                  std::string const& input_file1,\n                                  std::string const& input_file2,\n                                  std::string      & output_file1,\n                                  std::string      & output_file2);\n\n  /// Stage 4: Point cloud generation\n  ///\n  /// Pre  file is a disparity map. (ImageView<PixelDisparity<float>>)\n  /// Post file is point image.     (ImageView<Vector3>)\n  virtual vw::ImageViewRef<vw::PixelMask<vw::Vector2f>>\n  pre_pointcloud_hook(std::string const& input_file);\n\n  // Return the left and right cropped images. These are the same as\n  // the input images unless the cropping is on.\n  std::string left_cropped_image(bool do_crop) const;\n  std::string right_cropped_image(bool do_crop) const;\n\n  // Helper functions to check if cropping is enabled\n  bool do_crop_left() const;\n  bool do_crop_right() const;\n\n  std::string left_aligned_bathy_mask() const;\n  std::string right_aligned_bathy_mask() const;\n\n  void read_aligned_bathy_masks\n  (vw::ImageViewRef< vw::PixelMask<float>> & left_aligned_bathy_mask_image,\n    vw::ImageViewRef< vw::PixelMask<float>> & right_aligned_bathy_mask_image);\n\n  // Align the bathy masks. This will be called in stereo_pprc and, if needed,\n  // in stereo_tri\n  void align_bathy_masks(vw::GdalWriteOptions const& options);\n\n    // Read a camera used in mapprojection\n    void read_mapproj_cam(std::string const& image_file, std::string const& cam_file,\n                          std::string const& adj_prefix, std::string const& cam_type,\n                          vw::CamPtr & map_proj_cam);\n\n    // Read cameras used in mapprojection\n    void read_mapproj_cams(std::string const& left_image_file,\n                          std::string const& right_image_file,\n                          std::string const& left_camera_file,\n                          std::string const& right_camera_file,\n                          std::string const& input_dem,\n                          std::string const& session_name,\n                          vw::CamPtr & left_map_proj_cam,\n                          vw::CamPtr & right_map_proj_cam);\n\n  /// Function to load a specific type of camera model with a pixel offset.\n  virtual vw::CamPtr load_camera_model(std::string const& image_file,\n                                       std::string const& camera_file,\n                                       std::string const& ba_prefix,\n                                       vw::Vector2 pixel_offset) const = 0;\n\nprotected: // Variables\n\n  vw::GdalWriteOptions m_options;\n  std::string m_left_image_file,  m_right_image_file;\n  std::string m_left_camera_file, m_right_camera_file;\n  std::string m_out_prefix, m_input_dem;\n\n  /// Object to help with camera model loading, mostly used by derived classes.\n  CameraModelLoader m_camera_loader;\n\n  /// Storage for the camera models used to map project the input images.\n  /// - Not used in non map-projected sessions.\n  vw::CamPtr m_left_map_proj_model, m_right_map_proj_model;\n\nprotected:\n\n  // Prepare input images for preprocessing: load images, handle cropping,\n  // get nodata values. Return 'true' if cached outputs exist and we can\n  // skip reprocessing.\n  bool prepareInputImages(vw::GdalWriteOptions           & options,\n                          std::string const             & left_input_file,\n                          std::string const             & right_input_file,\n                          std::string                   & left_output_file,\n                          std::string                   & right_output_file,\n                          std::string                   & left_cropped_file,\n                          std::string                   & right_cropped_file,\n                          vw::ImageViewRef<float>       & left_cropped_image,\n                          vw::ImageViewRef<float>       & right_cropped_image,\n                          float                         & left_nodata_value,\n                          float                         & right_nodata_value,\n                          bool                          & has_left_georef,\n                          bool                          & has_right_georef,\n                          vw::cartography::GeoReference & left_georef,\n                          vw::cartography::GeoReference & right_georef);\n\n  // These are all the currently supported transformation types\n  vw::TransformPtr tx_identity        () const; // Not left or right specific\n  vw::TransformPtr tx_left_homography () const;\n  vw::TransformPtr tx_right_homography() const;\n  vw::TransformPtr tx_left_map_trans  () const;\n  vw::TransformPtr tx_right_map_trans () const;\n\n  /// Load an RPC camera model with a pixel offset\n  /// - We define it here so it can be used for reading RPC map projection models and also\n  ///   so it does not get duplicated in derived RPC sessions.\n  vw::CamPtr load_rpc_camera_model(std::string const& image_file,\n                                   std::string const& camera_file,\n                                   std::string const& ba_prefix,\n                                   vw::Vector2 pixel_offset) const;\n\n  void read_bathy_masks(float & left_bathy_nodata,\n                        float & right_bathy_nodata,\n                        vw::ImageViewRef< vw::PixelMask<float>> & left_bathy_mask,\n                        vw::ImageViewRef< vw::PixelMask<float>> & right_bathy_mask);\n\n  std::string left_cropped_bathy_mask() const;\n  std::string right_cropped_bathy_mask() const;\n\n  // Apply epipolar alignment to images, if the camera models are pinhole. This will\n  // be reimplemented in StereoSessionPinhole.\n  virtual void epipolar_alignment(vw::ImageViewRef<vw::PixelMask<float>> left_masked_image,\n                                  vw::ImageViewRef<vw::PixelMask<float>> right_masked_image,\n                                  vw::ValueEdgeExtension<vw::PixelMask<float>> ext_nodata,\n                                  // Outputs\n                                  vw::ImageViewRef<vw::PixelMask<float>> & Limg,\n                                  vw::ImageViewRef<vw::PixelMask<float>> & Rimg);\n\n  // Find the masked images and stats. Handles ISIS special pixels if needed.\n  void calcStatsMaskedImages(// Inputs\n                             vw::ImageViewRef<float> const& left_cropped_image,\n                             vw::ImageViewRef<float> const& right_cropped_image,\n                             float left_nodata_value, float right_nodata_value,\n                             std::string const& left_input_file,\n                             std::string const& right_input_file,\n                             std::string const& left_cropped_file,\n                             std::string const& right_cropped_file,\n                             // Outputs\n                             vw::ImageViewRef<vw::PixelMask<float>> & left_masked_image,\n                             vw::ImageViewRef<vw::PixelMask<float>> & right_masked_image,\n                             vw::Vector6f & left_stats,\n                             vw::Vector6f & right_stats) const;\n\n  // Find ip matches and determine the alignment matrices\n  void imageAlignment(// Inputs\n                      std::string  const& out_prefix,\n                      std::string  const& left_cropped_file,\n                      std::string  const& right_cropped_file,\n                      std::string  const& left_uncropped_file,\n                      vw::Vector6f const& left_stats,\n                      vw::Vector6f const& right_stats,\n                      float left_nodata_value,\n                      float right_nodata_value,\n                      vw::CamPtr left_cam,\n                      vw::CamPtr right_cam,\n                      bool adjust_left_image_size,\n                      // In-out\n                      vw::Matrix<double> & align_left_matrix,\n                      vw::Matrix<double> & align_right_matrix,\n                      vw::Vector2i & left_size,\n                      vw::Vector2i & right_size);\n\n  // Cache here the camera when loaded. Use a mutex to protect the cache.\n  vw::Mutex m_camera_mutex;\n  std::map<std::pair<std::string, std::string>, vw::CamPtr> m_camera_model;\n\n};\n\ntypedef boost::shared_ptr<StereoSession> SessionPtr;\n\n// A wrapper around ip matching. Can also work with NULL cameras\n// TODO(oalexan1): See if it is possible to not use the stereo session here.\nvoid matchIp(std::string const& out_prefix,\n             bool enable_rough_homography,\n             double pct_for_overlap,\n             asp::SessionPtr session,\n             std::string const& image1_path,  std::string const& image2_path,\n             vw::camera::CameraModel* cam1,   vw::camera::CameraModel* cam2,\n             std::string const& match_filename);\n\n// Compute list of matched IP between two images with no cameras\nvoid matchIpNoCams(std::string const& image1, \n                   std::string const& image2,\n                   std::string const& output_prefix, \n                   std::vector<vw::ip::InterestPoint> & matched_ip1,\n                   std::vector<vw::ip::InterestPoint> & matched_ip2);\n\n} // end namespace asp\n\n#endif // __STEREO_SESSION_H__\n"
  },
  {
    "path": "src/asp/Sessions/StereoSessionASTER.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n/// \\file StereoSessionASTER.cc\n///\n#include <asp/Camera/LinescanASTERModel.h>\n#include <asp/Sessions/StereoSessionASTER.h>\n\n#include <vw/Camera/CameraModel.h>\n\nnamespace asp {\n\n  boost::shared_ptr<vw::camera::CameraModel>  StereoSessionASTER::load_camera_model\n    (std::string const& image_file, std::string const& camera_file, \n     std::string const& ba_prefix, vw::Vector2 pixel_offset) const {\n    return load_adjusted_model(m_camera_loader.load_ASTER_camera_model(camera_file),\n                              image_file, camera_file, ba_prefix, pixel_offset);\n  }\n} // End namespace asp\n"
  },
  {
    "path": "src/asp/Sessions/StereoSessionASTER.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n/// \\file StereoSessionASTER.h\n///\n/// This a session to support ASTER satellite images.\n\n#ifndef __STEREO_SESSION_ASTER_H__\n#define __STEREO_SESSION_ASTER_H__\n\n#include <asp/Sessions/StereoSessionGdal.h>\n\nnamespace asp {\n\n/// Session class for ASTER images.\nclass StereoSessionASTER: public StereoSessionGdal {\n  \npublic:\n  StereoSessionASTER(){}\n  virtual ~StereoSessionASTER(){}\n  \n  virtual std::string name() const { return \"aster\"; }\n  \n  /// Simple factory function\n  static SessionPtr construct() { return SessionPtr(new StereoSessionASTER); }\n\nprotected:\n  /// Function to load a camera model of the particular type.\n  virtual boost::shared_ptr<vw::camera::CameraModel>\n  load_camera_model(std::string const& image_file, \n                    std::string const& camera_file,\n                    std::string const& ba_prefix, \n                    vw::Vector2 pixel_offset) const;\n};\n\n} // End namespace asp\n\n#endif//__STEREO_SESSION_ASTER_H__\n"
  },
  {
    "path": "src/asp/Sessions/StereoSessionBathy.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file StereoSessionBathy.cc\n///\n\n#include <asp/Sessions/StereoSession.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/Bathymetry.h>\n#include <asp/Core/FileUtils.h>\n#include <asp/Core/AlignmentUtils.h>\n\n#include <vw/Core/Log.h>\n#include <vw/Image/PixelMask.h>\n#include <vw/FileIO/DiskImageView.h>\n#include <vw/FileIO/DiskImageUtils.h>\n#include <vw/FileIO/FileUtils.h>\n#include <vw/Cartography/GeoReferenceUtils.h>\n#include <vw/Math/Geometry.h>\n\n#include <boost/filesystem/operations.hpp>\n\nusing namespace vw;\nusing namespace vw::cartography;\n\nnamespace asp {\n\n// Crop the bathy mask to match the crop window. This only does the cropping and\n// does not interpret which pixels are land or water. That is handled later by\n// read_bathy_mask() when the cropped mask is read.\nvoid crop_bathy_mask(vw::GdalWriteOptions const& options,\n                     std::string const& input_mask_file, std::string const& input_image_file,\n                     BBox2i const& crop_win, std::string const& cropped_mask_file) {\n\n  if (input_mask_file == \"\")\n    vw_throw(ArgumentErr() << \"Required bathy mask file was not specified.\");\n\n  // Sanity check, input image and mask must have same size\n  DiskImageView<float> input_image(input_image_file);\n  DiskImageView<float> input_bathy_mask(input_mask_file);\n  if (input_bathy_mask.cols() != input_image.cols() ||\n      input_bathy_mask.rows() != input_image.rows())\n    vw_throw(ArgumentErr() << \"Input image and input bathy mask don't have the same dimensions.\");\n\n  // Read nodata from the file. If absent, default to 0 (water pixels have\n  // non-positive values). The full masking logic is in read_bathy_mask().\n  float mask_nodata_value = 0.0f;\n  vw::read_nodata_val(input_mask_file, mask_nodata_value);\n\n  vw::cartography::GeoReference georef;\n  bool has_georef = read_georeference(georef, input_image_file);\n\n  bool has_mask_nodata = true;\n  vw_out() << \"\\t--> Writing cropped mask: \" << cropped_mask_file << \"\\n\";\n  block_write_gdal_image(cropped_mask_file,\n                         crop(input_bathy_mask, crop_win),\n                         has_georef, crop(georef, crop_win),\n                         has_mask_nodata, mask_nodata_value,\n                         options,\n                         TerminalProgressCallback(\"asp\", \"\\t:  \"));\n}\n\nvoid StereoSession::read_aligned_bathy_masks\n(vw::ImageViewRef<vw::PixelMask<float>> & left_aligned_bathy_mask_image,\n vw::ImageViewRef<vw::PixelMask<float>> & right_aligned_bathy_mask_image) {\n\n  float left_nodata = -std::numeric_limits<float>::max();\n  float right_nodata = -std::numeric_limits<float>::max();\n  left_aligned_bathy_mask_image = vw::read_bathy_mask(left_aligned_bathy_mask(), left_nodata);\n  right_aligned_bathy_mask_image = vw::read_bathy_mask(right_aligned_bathy_mask(), right_nodata);\n}\n\nstd::string StereoSession::left_cropped_bathy_mask() const {\n  if (!asp::doBathy(asp::stereo_settings()))\n    vw_throw(ArgumentErr() << \"The left cropped bathy mask is requested when \"\n              << \"bathymetry mode is not on.\");\n\n  bool crop_left = do_crop_left();\n  if (!crop_left)\n    return stereo_settings().left_bathy_mask;\n\n  return this->m_out_prefix + \"-L_cropped_bathy_mask.tif\";\n}\n\nstd::string StereoSession::right_cropped_bathy_mask() const {\n  if (!asp::doBathy(asp::stereo_settings()))\n    vw_throw(ArgumentErr() << \"The right cropped bathy mask is requested when \"\n              << \"bathymetry mode is not on.\");\n\n  bool crop_right = do_crop_right();\n  if (!crop_right)\n    return stereo_settings().right_bathy_mask;\n\n  return this->m_out_prefix + \"-R_cropped_bathy_mask.tif\";\n}\n\nstd::string StereoSession::left_aligned_bathy_mask() const {\n  return m_out_prefix + \"-L_aligned_bathy_mask.tif\";\n}\n\nstd::string StereoSession::right_aligned_bathy_mask() const {\n  return m_out_prefix + \"-R_aligned_bathy_mask.tif\";\n}\n\n// Align the bathy masks. This will be called in stereo_pprc and, if\n// needed, in stereo_tri. Skip this if the masks already exit and are\n// not older than the images. This code mirrors very closely the logic\n// for how the images are aligned.\n// TODO(oalexan1): Such duplication of logic is not good.\nvoid StereoSession::align_bathy_masks(vw::GdalWriteOptions const& options) {\n\n  bool do_bathy = asp::doBathy(asp::stereo_settings());\n\n  if (!do_bathy)\n    return;\n\n  // Check the timestamp of aligned masks\n  std::vector<std::string> check_files;\n  check_files.push_back(m_left_image_file);\n  check_files.push_back(m_right_image_file);\n  check_files.push_back(m_left_camera_file);\n  check_files.push_back(m_right_camera_file);\n  check_files.push_back(stereo_settings().left_bathy_mask);\n  check_files.push_back(stereo_settings().right_bathy_mask);\n\n  bool crop_left  = do_crop_left();\n  bool crop_right = do_crop_right();\n\n  bool rebuild = (!first_is_newer(left_aligned_bathy_mask(), check_files) ||\n                  !first_is_newer(right_aligned_bathy_mask(), check_files));\n\n  if (!rebuild && !crop_left && !crop_right) {\n    try {\n      vw_log().console_log().rule_set().add_rule(-1, \"fileio\");\n      DiskImageView<float> left_bathy_mask (left_aligned_bathy_mask());\n      DiskImageView<float> right_bathy_mask(right_aligned_bathy_mask());\n\n      vw_out(InfoMessage) << \"\\t--> Using cached aligned bathy masks.\\n\";\n      vw_settings().reload_config();\n      return; // no need to rebuild, the results exit and are good\n\n    } catch (vw::ArgumentErr const& e) {\n      // This throws on a corrupted file.\n      vw_settings().reload_config();\n    } catch (vw::IOErr const& e) {\n      vw_settings().reload_config();\n    }\n  } // End check for existing output files\n\n  // See if to crop the masks\n  if (crop_left) {\n    DiskImageView<float> left_orig_image(m_left_image_file);\n    BBox2i left_win = stereo_settings().left_image_crop_win;\n    left_win.crop(bounding_box(left_orig_image));\n    crop_bathy_mask(options, stereo_settings().left_bathy_mask,\n                    m_left_image_file, left_win, left_cropped_bathy_mask());\n  }\n  if (crop_right) {\n    DiskImageView<float> right_orig_image(m_right_image_file);\n    BBox2i right_win = stereo_settings().right_image_crop_win;\n    right_win.crop(bounding_box(right_orig_image));\n    crop_bathy_mask(options, stereo_settings().right_bathy_mask,\n                    m_right_image_file, right_win, right_cropped_bathy_mask());\n  }\n\n  // Read the unaligned cropped masks\n  ImageViewRef<PixelMask<float>> left_bathy_mask, right_bathy_mask;\n  float left_bathy_nodata = -std::numeric_limits<float>::max();\n  float right_bathy_nodata = -std::numeric_limits<float>::max();\n  StereoSession::read_bathy_masks(left_bathy_nodata, right_bathy_nodata,\n                                  left_bathy_mask, right_bathy_mask);\n\n  // Use no-data in interpolation and edge extension.\n  PixelMask<float>bathy_nodata_pix(0); bathy_nodata_pix.invalidate();\n  ValueEdgeExtension<PixelMask<float>> bathy_ext_nodata(bathy_nodata_pix);\n\n  // Get the aligned size from the images already aligned\n  Vector2i left_size;\n  std::string left_aligned_file = this->m_out_prefix + \"-L.tif\";\n  if (boost::filesystem::exists(left_aligned_file))\n    left_size = file_image_size(left_aligned_file);\n  else\n    vw_throw(NoImplErr() << \"Could not read: \" << left_aligned_file);\n\n  // Read alignment matrices\n  vw::Matrix<double> align_left_matrix\n   = asp::alignmentMatrix(this->m_out_prefix, asp::stereo_settings().alignment_method,\n                              \"left\");\n  vw::Matrix<double> align_right_matrix\n   = asp::alignmentMatrix(this->m_out_prefix, asp::stereo_settings().alignment_method,\n                              \"right\");\n\n  // Generate aligned versions of the masks according to the options.\n  ImageViewRef<PixelMask<float>> left_aligned_bathy_mask, right_aligned_bathy_mask;\n  if (stereo_settings().alignment_method == \"homography\"     ||\n      stereo_settings().alignment_method == \"affineepipolar\" ||\n      stereo_settings().alignment_method == \"local_epipolar\") {\n\n    left_aligned_bathy_mask = transform(left_bathy_mask,\n                                        HomographyTransform(align_left_matrix),\n                                        left_size.x(), left_size.y());\n\n    // Note how we use left_size and not right_size\n    right_aligned_bathy_mask = transform(right_bathy_mask,\n                                         HomographyTransform(align_right_matrix),\n                                         left_size.x(), left_size.y());\n\n  } else if (stereo_settings().alignment_method == \"none\") {\n    // No alignment\n    left_aligned_bathy_mask  = left_bathy_mask;\n    right_aligned_bathy_mask = right_bathy_mask;\n  } // End of image alignment block\n\n  bool has_bathy_nodata = true;\n  float output_nodata = -32768.0;\n\n  // Read the georef of the cropped left and right images saved before the masks\n  vw::cartography::GeoReference left_georef, right_georef;\n  bool has_left_georef  = read_georeference(left_georef,\n                                            this->left_cropped_image(crop_left));\n  bool has_right_georef = read_georeference(right_georef,\n                                            this->right_cropped_image(crop_right));\n\n  std::string left_aligned_bathy_mask_file = StereoSession::left_aligned_bathy_mask();\n  vw_out() << \"\\t--> Writing: \" << left_aligned_bathy_mask_file << \"\\n\";\n  block_write_gdal_image(left_aligned_bathy_mask_file,\n                         apply_mask(left_aligned_bathy_mask, left_bathy_nodata),\n                         has_left_georef, left_georef,\n                         has_bathy_nodata, left_bathy_nodata, options,\n                         TerminalProgressCallback(\"asp\",\"\\t  L bathy mask:  \"));\n\n  // Use same logic as when the right aligned image is written\n  if (stereo_settings().alignment_method == \"none\") {\n    std::string right_aligned_bathy_mask_file = StereoSession::right_aligned_bathy_mask();\n    vw_out() << \"\\t--> Writing: \" << right_aligned_bathy_mask_file << \"\\n\";\n    block_write_gdal_image(right_aligned_bathy_mask_file,\n                           apply_mask(right_aligned_bathy_mask, right_bathy_nodata),\n                           has_right_georef, right_georef,\n                           has_bathy_nodata, right_bathy_nodata, options,\n                           TerminalProgressCallback(\"asp\",\"\\t  R bathy mask:  \"));\n  } else {\n    std::string right_aligned_bathy_mask_file = StereoSession::right_aligned_bathy_mask();\n    vw_out() << \"\\t--> Writing: \" << right_aligned_bathy_mask_file << \"\\n\";\n    block_write_gdal_image(right_aligned_bathy_mask_file,\n                           apply_mask(crop(edge_extend(right_aligned_bathy_mask,\n                                                       bathy_ext_nodata),\n                                           // Note how we use the left aligned mask bbox\n                                           bounding_box(left_aligned_bathy_mask)),\n                                      right_bathy_nodata),\n                           has_right_georef, right_georef,\n                           has_bathy_nodata, right_bathy_nodata,\n                           options,\n                           TerminalProgressCallback(\"asp\",\"\\t  R bathy mask:  \"));\n  }\n}\n\nvoid StereoSession::read_bathy_masks(float & left_bathy_nodata,\n                                     float & right_bathy_nodata,\n                                     vw::ImageViewRef<vw::PixelMask<float>> & left_bathy_mask,\n                                     vw::ImageViewRef<vw::PixelMask<float>> & right_bathy_mask) {\n\n  left_bathy_mask = vw::read_bathy_mask(left_cropped_bathy_mask(), left_bathy_nodata);\n  right_bathy_mask = vw::read_bathy_mask(right_cropped_bathy_mask(), right_bathy_nodata);\n\n  // The left image (after crop) better needs to have the same dims\n  // as the left mask after crop, and same for the right\n  bool crop_left  = do_crop_left();\n  bool crop_right = do_crop_right();\n  DiskImageView<float> left_image(this->left_cropped_image(crop_left));\n  DiskImageView<float> right_image(this->right_cropped_image(crop_right));\n  if (left_bathy_mask.cols() != left_image.cols()   ||\n      left_bathy_mask.rows() != left_image.rows()   ||\n      right_bathy_mask.cols() != right_image.cols() ||\n      right_bathy_mask.rows() != right_image.rows()) {\n    vw_throw(ArgumentErr() << \"The dimensions of bathymetry masks don't agree \"\n              << \"with the image sizes (after crop win, if applicable).\");\n  }\n}\n\n} // End namespace asp\n"
  },
  {
    "path": "src/asp/Sessions/StereoSessionFactory.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file StereoSessionFactory.cc\n\n#include <asp/Sessions/StereoSessionFactory.h>\n#include <asp/Sessions/StereoSessionMapProj.h>\n#include <asp/Sessions/StereoSessionIsis.h>\n#include <asp/Sessions/StereoSessionNadirPinhole.h>\n#include <asp/Sessions/StereoSessionPinhole.h>\n#include <asp/Sessions/StereoSessionRPC.h>\n#include <asp/Sessions/StereoSessionASTER.h>\n#include <asp/Camera/SPOT_XML.h>\n#include <asp/Camera/ASTER_XML.h>\n#include <asp/asp_config.h> // defines ASP_HAVE_PKG_ISIS\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/ImageUtils.h>\n\n#if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1\n#include <asp/IsisIO/IsisInterface.h>\n#endif // ASP_HAVE_PKG_ISIS\n\n#include <vw/FileIO/DiskImageResourceRaw.h>\n#include <vw/Camera/CameraUtilities.h>\n#include <vw/Camera/OpticalBarModel.h>\n#include <vw/FileIO/FileTypes.h>\n\nnamespace asp {\n\n// Parse the ortho heights (terrain heights) from the cameras, if they exist.\n// If opt_heights is already set, it has priority. Otherwise this will\n// populate those heights from the cameras.\nvoid handleOrthoHeights(std::string const& left_image_file, \n                        std::string const& right_image_file,\n                        std::string const& left_camera_file, \n                        std::string const& right_camera_file,\n                        bool total_quiet,\n                        vw::Vector2 & opt_heights) {\n  \n  bool quiet = true;\n  StereoSessionRPC session;\n  vw::CamPtr cam1 = session.camera_model(left_image_file,  left_camera_file, quiet);\n  vw::CamPtr cam2 = session.camera_model(right_image_file, right_camera_file, quiet);\n  \n  asp::RPCModel const* rpc1 \n    = dynamic_cast<asp::RPCModel const*>(vw::camera::unadjusted_model(cam1.get()));\n  asp::RPCModel const* rpc2 \n    = dynamic_cast<asp::RPCModel const*>(vw::camera::unadjusted_model(cam2.get()));\n  \n  if ((rpc1 == NULL) != (rpc2 == NULL))\n    vw::vw_throw(vw::ArgumentErr() << \"Expecting both or neither cameras to be RPC.\\n\");\n  if (rpc1 == NULL || rpc2 == NULL) \n    return;\n   \n  double cam_ht1 = rpc1->m_terrain_height;\n  double cam_ht2 = rpc2->m_terrain_height;\n  \n  // Left\n  if (!std::isnan(opt_heights[0]) && !std::isnan(cam_ht1) && opt_heights[0] != cam_ht1\n      && !total_quiet)\n    vw::vw_out() << \"Will use first entry in --ortho-heights instead of \"\n      << \"the corresponding entry in the left camera file.\\n\";\n   if (std::isnan(opt_heights[0]) && !std::isnan(cam_ht1))\n    opt_heights[0] = cam_ht1;\n  // Right\n  if (!std::isnan(opt_heights[1]) && !std::isnan(cam_ht2) && opt_heights[1] != cam_ht2 &&\n      !total_quiet)\n    vw::vw_out() << \"Will use second entry in --ortho-heights instead of \"\n      << \"the corresponding entry in the right camera file.\\n\";\n  if (std::isnan(opt_heights[1]) && !std::isnan(cam_ht2))\n    opt_heights[1] = cam_ht2;\n}\n\nSessionPtr StereoSessionFactory::create(std::string      & session_type, // in-out\n                                        vw::GdalWriteOptions const& options,\n                                        std::string const& left_image_file,\n                                        std::string const& right_image_file,\n                                        std::string const& left_camera_file,\n                                        std::string const& right_camera_file,\n                                        std::string const& out_prefix,\n                                        std::string const& input_dem,\n                                        bool allow_map_promote, \n                                        bool total_quiet) {\n\n  // Known user session types are:\n  // DG, RPC, ISIS, Pinhole, NadirPinhole, OpticalBar, etc.\n  //\n  // Hidden sessions are:\n  // DGMapRPC, Blank (Guessing)\n\n  // Try to guess the session if not provided\n  std::string actual_session_type = session_type;\n  bool quiet = true;\n  boost::to_lower(actual_session_type);\n  if (actual_session_type.empty()) {\n    if (vw::has_pinhole_extension(left_camera_file) ||\n        vw::has_pinhole_extension(right_camera_file)) {\n      // There can be several types of .tsai files\n      std::string error_pinhole, error_opticalbar;\n      try {\n        boost::shared_ptr<vw::camera::CameraModel> P = \n          vw::camera::load_pinhole_camera_model(left_camera_file);\n        actual_session_type = \"pinhole\";\n      }catch (std::exception & e) {\n        error_pinhole = e.what();\n        try {\n          vw::camera::OpticalBarModel P;\n          P.read(left_camera_file);\n          actual_session_type = \"opticalbar\";\n        }catch (std::exception & e) {\n          error_opticalbar = e.what();\n          vw_throw(vw::NoImplErr() << \"Could not read the camera model \" <<\n                    left_camera_file << \" as pinhole. \"\n                    << \"The error was: \" << error_pinhole << \"\\n\"\n                    << \"Could not read it as opticalbar model either, the error was: \"\n                    << error_opticalbar);\n        }\n      }\n    } else if (vw::has_isd_extension(left_camera_file) ||\n                vw::has_isd_extension(right_camera_file)) {\n      actual_session_type = \"csm\";\n#if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1\n    } else if (boost::iends_with(boost::to_lower_copy(left_image_file), \".cub\") &&\n               left_camera_file == \"\" &&\n               asp::isis::IsisCubeHasCsmBlob(left_image_file)) {\n      // The image has a CSM blob and there is no separate camera file\n      actual_session_type = \"csm\";\n    } else if (boost::iends_with(boost::to_lower_copy(left_camera_file), \".cub\") &&\n               asp::isis::IsisCubeHasCsmBlob(left_camera_file)) {\n      // The camera file has a CSM blob\n      actual_session_type = \"csm\";\n#endif // ASP_HAVE_PKG_ISIS\n    } else if (boost::iends_with(boost::to_lower_copy(left_image_file  ), \".cub\") ||\n                boost::iends_with(boost::to_lower_copy(right_image_file ), \".cub\") ||\n                boost::iends_with(boost::to_lower_copy(left_camera_file ), \".cub\") ||\n                boost::iends_with(boost::to_lower_copy(right_camera_file), \".cub\")) {\n      actual_session_type = \"isis\";\n    } else if (boost::iends_with(boost::to_lower_copy(left_camera_file ), \".dim\") ||\n                boost::iends_with(boost::to_lower_copy(right_camera_file), \".dim\")) {\n      actual_session_type = \"spot5\";\n    } else if (boost::iends_with(boost::to_lower_copy(left_camera_file ), \".xml\") ||\n                boost::iends_with(boost::to_lower_copy(right_camera_file), \".xml\")) {\n\n      // Here we have several options for .xml files. Note that a\n      // Digital Globe xml file has both linescan and RPC\n      // models. The logic below favors the linescan sensor.\n      if (actual_session_type.empty()) {\n        \n        // TODO(oalexan1): Try to peek in the xml file instead of doing this exhaustive\n        // checking.\n        \n        // Try DG exact linescan model\n        try {\n          StereoSessionDG session;\n          boost::shared_ptr<vw::camera::CameraModel>\n            left_model  = session.camera_model(left_image_file,  left_camera_file, quiet),\n            right_model = session.camera_model(right_image_file, right_camera_file, quiet);\n          actual_session_type = \"dg\";\n        } catch (...) {}\n      }\n      \n      if (actual_session_type.empty()) {\n        // Try PeruSat exact linescan model\n        try {\n          StereoSessionPeruSat session;\n          boost::shared_ptr<vw::camera::CameraModel>\n            left_model  = session.camera_model(left_image_file,  left_camera_file, quiet),\n            right_model = session.camera_model(right_image_file, right_camera_file, quiet);\n          actual_session_type = \"perusat\";\n        } catch (...) {}\n      }\n\n      if (actual_session_type.empty()) {\n        // Try SPOT 6/7 exact linescan model (before Pleiades, same DIMAP V2 family)\n        try {\n          StereoSessionSpot67 session;\n          boost::shared_ptr<vw::camera::CameraModel>\n            left_model  = session.camera_model(left_image_file,  left_camera_file, quiet),\n            right_model = session.camera_model(right_image_file, right_camera_file, quiet);\n          actual_session_type = \"spot\";\n        } catch (...) {}\n      }\n\n      if (actual_session_type.empty()) {\n        // Try Pleiades exact linescan model\n        try {\n          StereoSessionPleiades session;\n          boost::shared_ptr<vw::camera::CameraModel>\n            left_model  = session.camera_model(left_image_file,  left_camera_file, quiet),\n            right_model = session.camera_model(right_image_file, right_camera_file, quiet);\n          actual_session_type = \"pleiades\";\n        } catch (...) {}\n      }\n      \n      if (actual_session_type.empty()) {\n        // Try the ASTER exact linescan model\n        try {\n          StereoSessionASTER session;\n          boost::shared_ptr<vw::camera::CameraModel>\n            left_model  = session.camera_model(left_image_file,  left_camera_file, quiet),\n            right_model = session.camera_model(right_image_file, right_camera_file, quiet);\n          actual_session_type = \"aster\";\n        } catch (...) {}\n      }\n      \n    } // end considering the xml extension case\n\n    // Try RPC, which can either have xml cameras or no cameras at all (if embedded\n    // in the tif files).\n    if (actual_session_type.empty()) {\n      try {\n        StereoSessionRPC session;\n        boost::shared_ptr<vw::camera::CameraModel>\n          left_model  = session.camera_model(left_image_file,  left_camera_file, quiet),\n          right_model = session.camera_model(right_image_file, right_camera_file, quiet);\n        actual_session_type = \"rpc\";\n      } catch (...) {}\n    }\n  }\n\n  // If the session name starts with rpc, read the ortho heights, if available.\n  if (boost::to_lower_copy(actual_session_type).find(\"rpc\") == 0) \n    handleOrthoHeights(left_image_file, right_image_file, \n                       left_camera_file, right_camera_file,\n                       total_quiet, asp::stereo_settings().ortho_heights);\n  vw::Vector2 heights = asp::stereo_settings().ortho_heights;\n  bool have_heights = (!std::isnan(heights[0]) && !std::isnan(heights[1]));\n  \n  if (allow_map_promote) {\n    \n    // The case of images mapprojected onto some surface of constant height\n    if (have_heights) {\n      size_t pos = actual_session_type.find(\"map\");\n      if (pos != std::string::npos)\n        actual_session_type = actual_session_type.substr(0, pos); // wipe map and after\n      actual_session_type = actual_session_type + \"map\" + actual_session_type;\n    }\n\n    // Read the camera model type from the mapprojection metadata.\n    std::string l_cam_type;\n    if (!input_dem.empty()) {\n      std::string adj_key, img_key, cam_type_key, cam_file_key, dem_key;\n      std::string adj, img, cam_file, dem;\n      asp::read_mapproj_header(left_image_file, adj_key, img_key,\n                               cam_type_key, cam_file_key, dem_key,\n                               adj, img, l_cam_type, cam_file, dem);\n    }\n\n    if (!input_dem.empty() && actual_session_type == \"dg\") {\n      // User says DG but also gives a DEM.\n      // Mapprojection can happen either with DG or RPC cameras\n      if (l_cam_type == \"dg\")\n        actual_session_type = \"dgmapdg\";\n      else\n        actual_session_type = \"dgmaprpc\"; // used also when l_cam_type is empty\n    }\n    if (!input_dem.empty() && actual_session_type == \"rpc\") {\n      // User says RPC but also gives a DEM.\n      actual_session_type = \"rpcmaprpc\";\n    }\n    if (!input_dem.empty() && actual_session_type == \"pinhole\") {\n      // User says PINHOLE but also gives a DEM.\n      actual_session_type = \"pinholemappinhole\";\n    }\n    if (!input_dem.empty() && actual_session_type == \"opticalbar\") {\n      // User says OPTICAL BAR but also gives a DEM.\n      actual_session_type = \"opticalbarmapopticalbar\";\n    }\n    if (!input_dem.empty() && actual_session_type == \"csm\") {\n      // User says CSM but also gives a DEM.\n      // Mapprojection can happen either with CSM or RPC cameras\n      if (l_cam_type == \"rpc\")\n        actual_session_type = \"csmmaprpc\";\n      else\n        actual_session_type = \"csmmapcsm\"; // used also when l_cam_type is empty\n    }\n    if (!input_dem.empty() && actual_session_type == \"isis\") {\n      // User says ISIS but also gives a DEM.\n      actual_session_type = \"isismapisis\";\n    }\n    if (!input_dem.empty() && actual_session_type == \"spot5\") {\n      // User says SPOT5 but also gives a DEM.\n      actual_session_type = \"spot5maprpc\";\n    }\n    if (!input_dem.empty() && actual_session_type == \"aster\") {\n      // User says ASTER but also gives a DEM.\n      // Mapprojection can happen either with ASTER or RPC cameras\n      if (l_cam_type == \"aster\")\n        actual_session_type = \"astermapaster\";\n      else\n        actual_session_type = \"astermaprpc\"; // used also when l_cam_type is empty\n    }\n    if (!input_dem.empty() && actual_session_type == \"pleiades\") {\n      // User says Pleiades but also gives a DEM.\n      actual_session_type = \"pleiadesmappleiades\";\n    }\n    if (!input_dem.empty() && actual_session_type == \"spot\") {\n      // User says SPOT 6/7 but also gives a DEM.\n      actual_session_type = \"spotmapspot\";\n    }\n    \n    // Quietly switch from nadirpinhole to pinhole for mapprojected images\n    if (!input_dem.empty() && actual_session_type == \"nadirpinhole\") {\n      // User says nadirpinhole but also gives a DEM.\n      actual_session_type = \"pinholemappinhole\";\n    }\n    \n  } // End map promotion section\n\n  // For ISIS and CSM sessions with mapprojected images, camera files must be\n  // provided separately. Unlike RPC/DG where camera info is embedded in the\n  // image header, ISIS and CSM cameras are in external files (.cub or .json).\n  // This catches both cam2map asp_map=true cubes (no embedded camera) and the\n  // case of .tif images mapprojected with ISIS/CSM cameras.\n  if (!input_dem.empty() &&\n      (actual_session_type == \"isismapisis\" ||\n       actual_session_type == \"csmmapcsm\") &&\n      (left_camera_file.empty() || right_camera_file.empty()) &&\n      !asp::stereo_settings().correlator_mode)\n    vw_throw(vw::ArgumentErr()\n             << \"The input images are mapprojected. Camera files must be \"\n             << \"provided as the 3rd and 4th arguments.\\n\");\n\n  if (!input_dem.empty() && actual_session_type == \"perusat\") {\n    // User says PeruSat-1 or Pleiades but also gives a DEM, so the images were mapprojected.\n    // If the mapprojection was done with the exact model, stereo becomes\n    // painfully slow. If it was done with the RPC model, things become hard\n    // to manage, and stereo needs to know both the exact and RPC model\n    // and those are in different files. Hence, just don't allow mapprojected\n    // images in this case.\n    vw_throw(vw::NoImplErr() << \"Stereo with mapprojected images and the \"\n              << \"PeruSat-1 linescan model is not implemented. \"\n              << \"Use instead the RPC model.\");\n  }\n  \n  // We should know the session type by now.\n  VW_ASSERT(!actual_session_type.empty(),\n            vw::ArgumentErr() << \"Could not determine stereo session type. \"\n            << \"Please set it explicitly with the --session-type option.\\n\");\n  \n  if (!total_quiet)\n    vw::vw_out() << \"Using session: \" << actual_session_type << \"\\n\";\n\n  // Compare the current session name to all recognized types\n  // - Only one of these will ever get triggered\n  SessionPtr session;\n  if (actual_session_type == \"dg\")\n    session = StereoSessionDG::construct();\n  else if (actual_session_type == \"dgmaprpc\")\n      session = StereoSessionDGMapRPC::construct();\n  else if (actual_session_type == \"dgmapdg\")\n      session = StereoSessionDGMapDG::construct();\n  else if (actual_session_type == \"nadirpinhole\")\n    session = StereoSessionNadirPinhole::construct();\n  else if (actual_session_type == \"pinhole\")\n    session = StereoSessionPinhole::construct();\n  else if (actual_session_type == \"rpc\")\n    session = StereoSessionRPC::construct();\n  else if (actual_session_type == \"rpcmaprpc\")\n    session = StereoSessionRPCMapRPC::construct();\n  else if (actual_session_type == \"pinholemappinhole\")\n    session = StereoSessionPinholeMapPinhole::construct();\n  else if (actual_session_type == \"opticalbarmapopticalbar\")\n    session = StereoSessionBarMapBar::construct();\n  else if (actual_session_type == \"spot5maprpc\")\n      session = StereoSessionSpot5MapRPC::construct();\n  else if (actual_session_type == \"astermapaster\")\n      session = StereoSessionASTERMapASTER::construct();\n  else if (actual_session_type == \"astermaprpc\")\n      session = StereoSessionASTERMapRPC::construct();\n  else if (actual_session_type == \"pleiadesmappleiades\")\n      session = StereoSessionPleiadesMapPleiades::construct();\n  else if (actual_session_type == \"spotmapspot\")\n      session = StereoSessionSpot67MapSpot67::construct();\n#if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1\n  else if (actual_session_type == \"isis\")\n    session = StereoSessionIsis::construct();\n  else if (actual_session_type == \"isismapisis\")\n    session = StereoSessionIsisMapIsis::construct();\n#endif\n  else if (actual_session_type == \"spot5\")\n    session = StereoSessionSpot::construct();\n  else if (actual_session_type == \"perusat\")\n    session = StereoSessionPeruSat::construct();\n  else if (actual_session_type == \"spot\")\n    session = StereoSessionSpot67::construct();\n  else if (actual_session_type == \"pleiades\")\n    session = StereoSessionPleiades::construct();\n  else if (actual_session_type == \"aster\")\n    session = StereoSessionASTER::construct();\n  else if (actual_session_type == \"opticalbar\")\n    session = StereoSessionOpticalBar::construct();\n  else if (actual_session_type == \"csm\")\n    session = StereoSessionCsm::construct();\n  else if (actual_session_type == \"csmmapcsm\")\n    session = StereoSessionCsmMapCsm::construct();\n  else if (actual_session_type == \"csmmaprpc\")\n    session = StereoSessionCsmMapRpc::construct();\n  if (!session)\n    vw_throw(vw::NoImplErr() << \"Unsupported stereo session type: \"\n              << actual_session_type);\n\n  session->initialize(options,         // Initialize the new object\n                      left_image_file,  right_image_file,\n                      left_camera_file, right_camera_file,\n                      out_prefix, input_dem);\n  session_type = session->name(); // update the session name \n\n  return session;\n} // End function create()\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Sessions/StereoSessionFactory.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n/// \\file StereoSessionFactory.h\n///\n\n#ifndef __STEREO_SESSION_FACTORY_H__\n#define __STEREO_SESSION_FACTORY_H__\n\n#include <asp/Sessions/StereoSession.h>\n#include <vw/FileIO/DiskImageResource.h>\n#include <vw/Cartography/GeoReference.h>\n\nnamespace asp {\n\nclass StereoSessionFactory {\n  public:\n    /// Given the input arguments, selects the correct type of StereoSession and initializes it.\n    static SessionPtr create(std::string & session_type, // in-out variable\n                             vw::GdalWriteOptions const& options,\n                             std::string const& left_image_file   = \"\",\n                             std::string const& right_image_file  = \"\",\n                             std::string const& left_camera_file  = \"\",\n                             std::string const& right_camera_file = \"\",\n                             std::string const& out_prefix        = \"\",\n                             std::string const& input_dem         = \"\",\n                             bool allow_map_promote=true, // If true, allow isis to become isismapisis based on dem availability\n                             bool total_quiet = false);\n\n  private:\n    StereoSessionFactory() {} // Prevent construction of static-only class\n\n}; // End class StereoSessionFactory\n\n} // end namespace asp\n\n#endif // __STEREO_SESSION_FACTORY_H__\n"
  },
  {
    "path": "src/asp/Sessions/StereoSessionGdal.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file StereoSessionGdal.cc\n///\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/AffineEpipolar.h>\n#include <asp/Core/FileUtils.h>\n#include <asp/Sessions/StereoSessionGdal.h>\n#include <asp/Sessions/StereoSessionASTER.h>\n#include <asp/Sessions/StereoSessionNadirPinhole.h>\n#include <asp/Camera/RPCModel.h>\n#include <asp/Camera/RPC_XML.h>\n\n#include <vw/Image/ImageMath.h>\n#include <vw/Image/Manipulation.h>\n#include <vw/Image/MaskViews.h>\n#include <vw/Image/Transform.h>\n#include <vw/Math/Matrix.h>\n#include <vw/Cartography/Datum.h>\n\n#include <boost/shared_ptr.hpp>\n#include <boost/filesystem/operations.hpp>\nnamespace fs = boost::filesystem;\n\n#include <iostream>\n#include <string>\n#include <vector>\n#include <algorithm>\n\nusing namespace vw;\n\nnamespace asp {\n\n/// Returns the target datum to use for a given camera model\nvw::cartography::Datum StereoSessionCsm::get_datum(const vw::camera::CameraModel* cam,\n                                                   bool use_sphere_for_non_earth) const {\n\n  // Peek at the .cub file to get the planet name without reading\n  // it as an ISIS camera (which can fail unless the ISISDATA\n  // folder exists, and for CSM that is not guaranteed.)\n  // The CSM camera .json file itself lacks this information.\n  std::string spheroid_name = asp::read_target_name(m_left_image_file);\n\n  const asp::CsmModel * csm_cam\n    = dynamic_cast<const asp::CsmModel*>(vw::camera::unadjusted_model(cam));\n  VW_ASSERT(csm_cam != NULL,\n            vw::ArgumentErr() << \"Could not load a CSM camera.\\n\");\n\n  return csm_cam->get_datum_csm(spheroid_name, use_sphere_for_non_earth);\n}\n\n} // End namespace asp\n\n"
  },
  {
    "path": "src/asp/Sessions/StereoSessionGdal.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n/// \\file StereoSessionGdal.h\n///\n/// \n\n#ifndef __STEREO_SESSION_GDAL_H__\n#define __STEREO_SESSION_GDAL_H__\n\n#include <asp/Sessions/StereoSession.h>\n#include <asp/Core/BaseCameraUtils.h>\n#include <asp/Camera/RPCModel.h>\n#include <asp/Camera/RPC_XML.h>\n#include <asp/Camera/CsmModel.h>\n\nnamespace asp {\n\n  /// Generic stereoSession implementation for images which we can\n  /// read/write with GDAL. This class adds a \"preprocessing hook\"\n  /// which aligns and normalizes the images using the specified\n  /// methods. Derived classes need to set up camera model loading.\n  class StereoSessionGdal: public StereoSession {\n    \n  public:\n    StereoSessionGdal(){}\n    virtual ~StereoSessionGdal(){}\n    \n    virtual std::string name() const = 0;\n  };\n  \n  //----------------------------------------------------------\n\n  // Stereo session for Digital Globe images.\n  class StereoSessionDG: public StereoSessionGdal {\n\n  public:\n    StereoSessionDG(){}\n    virtual ~StereoSessionDG(){}\n\n    virtual std::string name() const { return \"dg\"; }\n\n    /// Simple factory function\n    static SessionPtr construct() { return SessionPtr(new StereoSessionDG);}\n    \n  protected:\n    /// Function to load a camera model of the particular type.\n    virtual vw::CamPtr\n    load_camera_model(std::string const& image_file, \n                      std::string const& camera_file,\n                      std::string const& ba_prefix, \n                      vw::Vector2 pixel_offset) const {\n      return load_adjusted_model(m_camera_loader.load_dg_camera_model(camera_file),\n                                 image_file, camera_file, ba_prefix, pixel_offset);\n    }\n  };\n\n  //----------------------------------------------------------\n\n  /// Stereo session for optical bar cameras such as Corona and Hexagon.\n  class StereoSessionOpticalBar: public StereoSessionGdal {\n\n  public:\n    StereoSessionOpticalBar(){}\n    virtual ~StereoSessionOpticalBar(){}\n\n    virtual std::string name() const { return \"opticalbar\"; }\n\n    /// Simple factory function\n    static SessionPtr construct() { return SessionPtr(new StereoSessionOpticalBar);}\n\n  protected:\n    /// Function to load a camera model of the particular type.\n    virtual vw::CamPtr\n    load_camera_model(std::string const& image_file, \n                      std::string const& camera_file,\n                      std::string const& ba_prefix, \n                      vw::Vector2 pixel_offset) const {\n      return load_adjusted_model(m_camera_loader.load_optical_bar_camera_model(camera_file),\n                                 image_file, camera_file, ba_prefix, pixel_offset);\n    }\n  };\n\n  //----------------------------------------------------------\n  \n  /// Stereo session for CSM camera models that use GDAL compatible image files.\n  /// - CSM files can also be used with ISIS image data, in which case\n  /// they use StereoSessionIsis.\n  class StereoSessionCsm: public StereoSessionGdal {\n\n    // TODO(oalexan1): Should one deal with ISIS special pixels like for ISIS?\n    \n  public:\n    StereoSessionCsm(){}\n    virtual ~StereoSessionCsm(){}\n    \n    virtual std::string name() const { return \"csm\"; }\n    \n    /// Simple factory function\n    static SessionPtr construct() { return SessionPtr(new StereoSessionCsm);}\n    \n    /// Returns the target datum to use for a given camera model\n    virtual vw::cartography::Datum get_datum(const vw::camera::CameraModel* cam,\n                                             bool use_sphere_for_non_earth) const;\n\n  protected:\n    /// Function to load a camera model of the particular type.\n    virtual vw::CamPtr\n    load_camera_model(std::string const& image_file, \n                      std::string const& camera_file,\n                      std::string const& ba_prefix,\n                      vw::Vector2 pixel_offset) const {\n      return load_adjusted_model(m_camera_loader.load_csm_camera_model(camera_file),\n                                 image_file, camera_file, ba_prefix, pixel_offset);\n    }\n  };\n  \n  /// StereoSession instance for processing SPOT5 data.\n  class StereoSessionSpot: public StereoSessionGdal {\n\n  public:\n    StereoSessionSpot(){}\n    virtual ~StereoSessionSpot(){}\n    \n    virtual std::string name() const { return \"spot5\"; }\n    \n    /// Simple factory function\n    static SessionPtr construct() { return SessionPtr(new StereoSessionSpot); }\n    \n  protected:\n    /// Function to load a camera model of the particular type.\n    virtual vw::CamPtr\n    load_camera_model(std::string const& image_file,\n                      std::string const& camera_file,\n                      std::string const& ba_prefix,\n                      vw::Vector2 pixel_offset) const{\n      return load_adjusted_model(m_camera_loader.load_spot5_camera_model(camera_file),\n                                 image_file, camera_file, ba_prefix, pixel_offset);\n    }\n  };\n  \n  /// StereoSession instance for processing PeruSat data.\n  class StereoSessionPeruSat: public StereoSessionGdal {\n\n  public:\n    StereoSessionPeruSat(){}\n    virtual ~StereoSessionPeruSat(){}\n    \n    virtual std::string name() const { return \"perusat\"; }\n    \n    /// Simple factory function\n    static SessionPtr construct() { return SessionPtr(new StereoSessionPeruSat); }\n    \n  protected:\n    /// Function to load a camera model of the particular type.\n    virtual vw::CamPtr\n    load_camera_model(std::string const& image_file,\n                      std::string const& camera_file,\n                      std::string const& ba_prefix,\n                      vw::Vector2 pixel_offset) const{\n      return load_adjusted_model(m_camera_loader.load_perusat_camera_model(camera_file),\n                                 image_file, camera_file, ba_prefix, pixel_offset);\n    }\n  };\n\n  /// StereoSession instance for processing Pleiades data.\n  class StereoSessionPleiades: public StereoSessionGdal {\n\n  public:\n    StereoSessionPleiades(){}\n    virtual ~StereoSessionPleiades(){}\n    \n    virtual std::string name() const { return \"pleiades\"; }\n    \n    /// Simple factory function\n    static SessionPtr construct() { return SessionPtr(new StereoSessionPleiades); }\n    \n  protected:\n    /// Function to load a camera model of the particular type.\n    virtual vw::CamPtr\n    load_camera_model(std::string const& image_file,\n                      std::string const& camera_file,\n                      std::string const& ba_prefix,\n                      vw::Vector2 pixel_offset) const{\n      return load_adjusted_model(m_camera_loader.load_pleiades_camera_model(camera_file),\n                                 image_file, camera_file, ba_prefix, pixel_offset);\n    }\n  };\n\n  /// StereoSession instance for processing SPOT 6/7 data.\n  /// Uses the same camera model as Pleiades NEO.\n  class StereoSessionSpot67: public StereoSessionPleiades {\n\n  public:\n    StereoSessionSpot67(){}\n    virtual ~StereoSessionSpot67(){}\n\n    virtual std::string name() const { return \"spot\"; }\n\n    static SessionPtr construct() { return SessionPtr(new StereoSessionSpot67); }\n\n  protected:\n    virtual vw::CamPtr\n    load_camera_model(std::string const& image_file,\n                      std::string const& camera_file,\n                      std::string const& ba_prefix,\n                      vw::Vector2 pixel_offset) const{\n      return load_adjusted_model(m_camera_loader.load_spot_camera_model(camera_file),\n                                 image_file, camera_file, ba_prefix, pixel_offset);\n    }\n  };\n\n} // End namespace asp\n\n#endif//__STEREO_SESSION_GDAL_H__\n"
  },
  {
    "path": "src/asp/Sessions/StereoSessionIo.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file StereoSessionIo.cc\n///\n\n#include <asp/Sessions/StereoSession.h>\n#include <asp/Sessions/StereoSessionFactory.h>\n#include <asp/IsisIO/IsisSpecialPixels.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/Bathymetry.h>\n#include <asp/Core/ImageUtils.h>\n#include <asp/Core/ImageNormalization.h>\n#include <asp/Core/FileUtils.h>\n#include <asp/Core/AlignmentUtils.h>\n\n#include <vw/Core/Log.h>\n#include <vw/Core/Stopwatch.h>\n#include <vw/Image/PixelMask.h>\n#include <vw/FileIO/DiskImageResource.h>\n#include <vw/FileIO/DiskImageView.h>\n#include <vw/FileIO/DiskImageUtils.h>\n#include <vw/FileIO/ImageChannelRead.h>\n#include <vw/FileIO/FileUtils.h>\n#include <vw/Cartography/GeoReferenceUtils.h>\n#include <vw/Math/Geometry.h>\n\nusing namespace vw;\nusing namespace vw::cartography;\nnamespace fs = boost::filesystem;\n\nnamespace asp {\n\n// Find the masked images and stats. Handles ISIS special pixels if needed.\nvoid StereoSession::\ncalcStatsMaskedImages(// Inputs\n                      vw::ImageViewRef<float> const& left_cropped_image,\n                      vw::ImageViewRef<float> const& right_cropped_image,\n                      float left_nodata_value, float right_nodata_value,\n                      std::string const& left_input_file,\n                      std::string const& right_input_file,\n                      std::string const& left_cropped_file,\n                      std::string const& right_cropped_file,\n                      // Outputs\n                      vw::ImageViewRef<vw::PixelMask<float>> & left_masked_image,\n                      vw::ImageViewRef<vw::PixelMask<float>> & right_masked_image,\n                      vw::Vector6f & left_stats,\n                      vw::Vector6f & right_stats) const {\n\n  // Form the masked imagess\n  left_masked_image = create_mask(left_cropped_image, left_nodata_value);\n  right_masked_image = create_mask(right_cropped_image, right_nodata_value);\n\n  // Handle ISIS special pixels for .cub files (isis and csm sessions)\n  bool isIsis = (fs::path(left_input_file).extension() == \".cub\");\n  if (isIsis)\n    adjustIsisImage(left_input_file, left_nodata_value, left_masked_image);\n  if (fs::path(right_input_file).extension() == \".cub\")\n    adjustIsisImage(right_input_file, right_nodata_value, right_masked_image);\n\n  // In --stereo-dist-mode, want the stats from the original images which should already exist\n  std::string left_file, right_file;\n  if (!asp::stereo_settings().stereo_dist_mode) {\n    left_file = left_cropped_file;\n    right_file = right_cropped_file;\n  } else {\n    left_file = left_input_file;\n    right_file = right_input_file;\n  }\n\n  // For ISIS, do not exceed min and max as there could be special pixels\n  bool adjust_min_max_with_std = isIsis && !stereo_settings().force_use_entire_range;\n\n  // Compute input image statistics\n  vw::Stopwatch sw1;\n  sw1.start();\n  left_stats = gather_stats(left_masked_image,\n                            this->m_out_prefix, left_file,\n                            asp::stereo_settings().force_reuse_match_files,\n                            adjust_min_max_with_std);\n  sw1.stop();\n  vw_out() << \"Left image stats time: \" << sw1.elapsed_seconds() << \"\\n\";\n  vw::Stopwatch sw2;\n  sw2.start();\n  right_stats = gather_stats(right_masked_image,\n                             this->m_out_prefix, right_file,\n                             asp::stereo_settings().force_reuse_match_files,\n                             adjust_min_max_with_std);\n  sw2.stop();\n  vw_out() << \"Right image stats time: \" << sw2.elapsed_seconds() << \"\\n\";\n}\n\n// Default preprocessing hook. Some sessions may override it.\nvoid StereoSession::preprocessing_hook(bool adjust_left_image_size,\n                                       std::string const& left_input_file,\n                                       std::string const& right_input_file,\n                                       std::string      & left_output_file,\n                                       std::string      & right_output_file) {\n\n  // Handle skip_image_normalization mode. Create symlinks instead of normalized\n  // images, but still compute stats further down (needed for subpixel modes 2\n  // and 3). The validation for this mode was done earlier in stereo_pprc.cc.\n  if (stereo_settings().skip_image_normalization) {\n    vw_out(WarningMessage) << \"Skipping image normalization.\\n\";\n    createSymLinks(left_input_file, right_input_file, m_out_prefix,\n                   left_output_file, right_output_file);\n  }\n\n  std::string left_cropped_file, right_cropped_file;\n  ImageViewRef<float> left_cropped_image, right_cropped_image;\n  vw::GdalWriteOptions options;\n  float left_nodata_value, right_nodata_value;\n  bool has_left_georef, has_right_georef;\n  vw::cartography::GeoReference left_georef, right_georef;\n  bool exit_early =\n    StereoSession::prepareInputImages(options,\n                                      left_input_file,    right_input_file,\n                                      left_output_file,   right_output_file,\n                                      left_cropped_file,  right_cropped_file,\n                                      left_cropped_image, right_cropped_image,\n                                      left_nodata_value,  right_nodata_value,\n                                      has_left_georef,    has_right_georef,\n                                      left_georef,        right_georef);\n\n  if (exit_early)\n    return;\n\n  // For skip_image_normalization, use L.tif/R.tif paths for stats file naming\n  // so that later stages (stereo_rfne) can find them.\n  if (stereo_settings().skip_image_normalization) {\n    left_cropped_file  = left_output_file;\n    right_cropped_file = right_output_file;\n  }\n\n  ImageViewRef<PixelMask<float>> left_masked_image, right_masked_image;\n  Vector6f left_stats, right_stats;\n\n  // Set up the image masks and compute the stats. If the user provided a custom\n  // no-data value, values no more than that have been masked by now in\n  // prepareInputImages.\n  this->calcStatsMaskedImages(// Inputs\n                              left_cropped_image, right_cropped_image,\n                              left_nodata_value, right_nodata_value,\n                              left_input_file, right_input_file,\n                              left_cropped_file, right_cropped_file,\n                              // Outputs\n                              left_masked_image, right_masked_image,\n                              left_stats, right_stats);\n\n  // If the user only wanted stats, stop here. Doing exit(0) seems to be simpler\n  // than tracing back a flag. This is needed for stereo_dist.\n  if (stereo_settings().stop_after_stats) {\n    vw_out() << \"Stopping after computing image statistics.\\n\";\n    exit(0);\n  }\n\n  // For skip_image_normalization, we created symlinks above and computed stats.\n  // No alignment or image writing is needed.\n  if (stereo_settings().skip_image_normalization)\n    return;\n\n  // Initialize the alignment matrices\n  Matrix<double> align_left_matrix  = math::identity_matrix<3>();\n  Matrix<double> align_right_matrix = math::identity_matrix<3>();\n\n  ImageViewRef<PixelMask<float>> Limg, Rimg;\n  bool isis_session = (this->name() == \"isis\" || this->name() == \"isismapisis\");\n\n  // Use no-data in interpolation and edge extension\n  // TODO(oalexan1): Maybe using 0 for nodata_pix is not good. May need to use\n  // -32768.0.\n  PixelMask<float>nodata_pix(0); nodata_pix.invalidate();\n  ValueEdgeExtension<PixelMask<float>> ext_nodata(nodata_pix);\n\n  // Generate aligned versions of the input images according to the options\n  vw_out() << \"\\t--> Applying alignment method: \"\n           << stereo_settings().alignment_method << \"\\n\";\n  if (stereo_settings().alignment_method == \"epipolar\") {\n    if (isis_session)\n      vw_throw(NoImplErr() << \"StereoSessionISIS does not support epipolar rectification\");\n    epipolar_alignment(left_masked_image, right_masked_image, ext_nodata,\n                       // Outputs\n                       Limg, Rimg);\n\n  } else if (stereo_settings().alignment_method == \"homography\"     ||\n             stereo_settings().alignment_method == \"affineepipolar\" ||\n             stereo_settings().alignment_method == \"local_epipolar\") {\n\n    // Load the cameras\n    boost::shared_ptr<camera::CameraModel> left_cam, right_cam;\n    this->camera_models(left_cam, right_cam);\n\n    // Get the image sizes. Later alignment options can choose to\n    // change this parameters (such as affine epipolar alignment).\n    Vector2i left_size(left_cropped_image.cols(), left_cropped_image.rows());\n    Vector2i right_size(right_cropped_image.cols(), right_cropped_image.rows());\n\n    imageAlignment(// Inputs\n                   m_out_prefix, left_cropped_file, right_cropped_file,\n                   left_input_file,\n                   left_stats, right_stats, left_nodata_value, right_nodata_value,\n                   left_cam, right_cam,\n                   adjust_left_image_size,\n                   // In-out\n                   align_left_matrix, align_right_matrix, left_size, right_size);\n\n    // Apply the alignment transform to both input images\n    Limg = transform(left_masked_image,\n                     HomographyTransform(align_left_matrix),\n                     left_size.x(), left_size.y());\n    Rimg = transform(right_masked_image,\n                     HomographyTransform(align_right_matrix),\n                     right_size.x(), right_size.y());\n\n  } else {\n    // No alignment, just provide the original files.\n    if (!asp::stereo_settings().stereo_dist_mode) {\n      Limg = left_masked_image;\n      Rimg = right_masked_image;\n    } else {\n      // Do the delayed cropping. This allows writing the cropped images\n      // only after normalization avoiding an unnecessary write.\n      Limg = crop(left_masked_image, asp::stereo_settings().left_image_crop_win);\n      Rimg = crop(right_masked_image, asp::stereo_settings().right_image_crop_win);\n      // Also crop the georefs\n      left_georef = crop(left_georef, asp::stereo_settings().left_image_crop_win);\n      right_georef = crop(right_georef, asp::stereo_settings().right_image_crop_win);\n    }\n  } // End of image alignment block\n\n  // Apply our normalization options.\n  bool use_percentile_stretch = false;\n  bool do_not_exceed_min_max = isis_session; // for isis, do not exceed min/max\n  // TODO(oalexan1): Should one add above \"csm\" and \"csmmapcsm\" / \"csmmaprpc\"?\n  asp::normalize_images(stereo_settings().force_use_entire_range,\n                        stereo_settings().individually_normalize,\n                        use_percentile_stretch,\n                        do_not_exceed_min_max,\n                        left_stats, right_stats, Limg, Rimg);\n\n  // The output no-data value must be < 0 as we scale the images to [0, 1].\n  bool has_nodata = true;\n  float output_nodata = -32768.0;\n  vw_out() << \"\\t--> Writing pre-aligned images.\\n\";\n  vw_out() << \"\\t--> Writing: \" << left_output_file << \"\\n\";\n  vw::Stopwatch sw3;\n  sw3.start();\n  block_write_gdal_image(left_output_file, apply_mask(Limg, output_nodata),\n                         has_left_georef, left_georef,\n                         has_nodata, output_nodata, options,\n                         TerminalProgressCallback(\"asp\",\"\\t  L:  \"));\n  sw3.stop();\n  vw_out() << \"Writing left image elapsed time: \" << sw3.elapsed_seconds() << \" s\\n\";\n\n  vw_out() << \"\\t--> Writing: \" << right_output_file << \"\\n\";\n  vw::Stopwatch sw4;\n  sw4.start();\n\n  // With no alignment, do not crop the right image to have the same dimensions\n  // as the left image. Since there is no alignment, and images may not be\n  // georeferenced, we do not know what portion of the right image corresponds\n  // best to the left image, so cropping may throw away an area where the left\n  // and right images overlap.\n  if (stereo_settings().alignment_method != \"none\")\n    Rimg = crop(edge_extend(Rimg, ext_nodata), bounding_box(Limg));\n\n  block_write_gdal_image(right_output_file, apply_mask(Rimg, output_nodata),\n                         has_right_georef, right_georef,\n                         has_nodata, output_nodata, options,\n                         TerminalProgressCallback(\"asp\",\"\\t  R:  \"));\n  sw4.stop();\n  vw_out() << \"Writing right image elapsed time: \" << sw4.elapsed_seconds() << \" s\\n\";\n\n  // For bathy runs only\n  if (asp::doBathy(asp::stereo_settings()))\n    this->align_bathy_masks(options);\n\n} // End function preprocessing_hook\n\nbool StereoSession::prepareInputImages(vw::GdalWriteOptions          & options,\n                                       std::string const             & left_input_file,\n                                       std::string const             & right_input_file,\n                                       std::string                   & left_output_file,\n                                       std::string                   & right_output_file,\n                                       std::string                   & left_cropped_file,\n                                       std::string                   & right_cropped_file,\n                                       vw::ImageViewRef<float>       & left_cropped_image,\n                                       vw::ImageViewRef<float>       & right_cropped_image,\n                                       float                         & left_nodata_value,\n                                       float                         & right_nodata_value,\n                                       bool                          & has_left_georef,\n                                       bool                          & has_right_georef,\n                                       vw::cartography::GeoReference & left_georef,\n                                       vw::cartography::GeoReference & right_georef) {\n\n  // Retrieve nodata values and let the handles go out of scope right away.\n  // For this to work the ISIS type must be registered with the\n  // DiskImageResource class. This happens in \"stereo.cc\", so\n  // these calls will create DiskImageResourceIsis objects.\n  {\n    boost::shared_ptr<DiskImageResource>\n      left_rsrc (DiskImageResourcePtr(left_input_file)),\n      right_rsrc(DiskImageResourcePtr(right_input_file));\n    asp::get_nodata_values(left_rsrc, right_rsrc,\n                           stereo_settings().nodata_value,\n                           left_nodata_value, right_nodata_value);\n  }\n\n  // Set output file paths\n  left_output_file  = this->m_out_prefix + \"-L.tif\";\n  right_output_file = this->m_out_prefix + \"-R.tif\";\n\n  // Enforce no predictor in compression, it works badly with L.tif and R.tif.\n  options = this->m_options;\n  options.gdal_options[\"PREDICTOR\"] = \"1\";\n\n  // Read the georef if available in the input images\n  has_left_georef  = read_georeference(left_georef,  left_input_file);\n  has_right_georef = read_georeference(right_georef, right_input_file);\n  if (stereo_settings().alignment_method != \"none\") {\n    // If any alignment at all happens, the georef will be messed up.\n    has_left_georef = false;\n    has_right_georef = false;\n  }\n\n  bool crop_left  = do_crop_left();\n  bool crop_right = do_crop_right();\n\n  // For --stereo-dist-mode will do the cropping when we normalize to avoid\n  // an extra write.\n  if (asp::stereo_settings().stereo_dist_mode) {\n    crop_left = false;\n    crop_right = false;\n  }\n\n  // Here either the input image or the cropped images will be returned,\n  // depending on whether the crop actually happens\n  left_cropped_file = this->left_cropped_image(crop_left);\n  right_cropped_file = this->right_cropped_image(crop_right);\n\n  // If the output files already exist and are newer than the input files, and\n  // we don't crop both left and right images, then there is nothing to do here.\n  // Note: Must make sure all outputs are initialized before we get to this part\n  // where we exit early. For stereo dist mode the L.tif and R.tif do not exist\n  // yet as those would be per-tile.\n  std::vector<std::string> check_files;\n  check_files.push_back(left_input_file);\n  check_files.push_back(right_input_file);\n  check_files.push_back(m_left_camera_file);\n  check_files.push_back(m_right_camera_file);\n  bool rebuild = (!asp::stereo_settings().stereo_dist_mode)  &&\n                 (!first_is_newer(left_output_file, check_files) ||\n                  !first_is_newer(right_output_file, check_files));\n  bool do_bathy = asp::doBathy(asp::stereo_settings());\n  if (do_bathy) {\n    rebuild = (rebuild ||\n               (!first_is_newer(left_aligned_bathy_mask(), check_files) ||\n                !first_is_newer(right_aligned_bathy_mask(), check_files)));\n  }\n\n  // Consider the case of multi-band images\n  if (!rebuild) {\n    int lc = vw::get_num_channels(left_input_file);\n    int rc = vw::get_num_channels(right_input_file);\n    if (lc > 1 || rc > 1) {\n      vw_out(vw::WarningMessage)\n        << \"Always recomputing the inputs for multi-band images as the \"\n        << \"provided band may change.\\n\";\n      rebuild = true;\n    }\n  }\n\n  // These will throw if the files do not exist\n  if (!rebuild && !crop_left && !crop_right) {\n    try {\n      vw_log().console_log().rule_set().add_rule(-1, \"fileio\");\n      if (!asp::stereo_settings().stereo_dist_mode) {\n        DiskImageView<float> out_left (left_output_file);\n        DiskImageView<float> out_right(right_output_file);\n      }\n\n      if (do_bathy) {\n        DiskImageView<float> left_bathy_mask (left_aligned_bathy_mask());\n        DiskImageView<float> right_bathy_mask(right_aligned_bathy_mask());\n      }\n\n      if (!asp::stereo_settings().stereo_dist_mode)\n        vw_out(InfoMessage) << \"\\t--> Using cached normalized input images.\\n\";\n      vw_settings().reload_config();\n      if (!asp::stereo_settings().stereo_dist_mode)\n        return true; // Return true if we exist early since the images exist\n    } catch (vw::ArgumentErr const& e) {\n      // This throws on a corrupted file.\n      vw_settings().reload_config();\n    } catch (vw::IOErr const& e) {\n      vw_settings().reload_config();\n    }\n  } // End check for existing output files\n\n  // Load the desired band. Subtract 1 to make it start from 0.\n  int ch = asp::stereo_settings().band - 1;\n  ImageViewRef<float> left_orig_image = vw::read_float_channel(left_input_file, ch);\n  ImageViewRef<float> right_orig_image = vw::read_float_channel(right_input_file, ch);\n\n  // If the user provided a custom no-data value, values no more than that are\n  // masked.\n  float user_nodata = stereo_settings().nodata_value;\n  if (!std::isnan(user_nodata)) {\n    left_orig_image = apply_mask(create_mask_less_or_equal(left_orig_image, user_nodata),\n                                  user_nodata);\n    right_orig_image = apply_mask(create_mask_less_or_equal(right_orig_image, user_nodata),\n                                   user_nodata);\n  }\n\n  // See if to crop the images\n  if (crop_left) {\n    // Crop and save the left image to left_cropped_file\n    has_left_georef = read_georeference(left_georef, left_input_file);\n    bool has_nodata = true;\n    BBox2i left_win = stereo_settings().left_image_crop_win;\n    left_win.crop(bounding_box(left_orig_image));\n    // Return a handle to the cropped image\n    left_cropped_image = crop(left_orig_image, left_win);\n\n    if (stereo_settings().left_image_clip != \"\") {\n      // Replace the crop with a given clip. This is a very rarely used option.\n      // It can be handy when investigating CCD artifacts correction.\n      left_cropped_image = DiskImageView<float>(stereo_settings().left_image_clip);\n      if (left_cropped_image.cols() != left_win.width() ||\n          left_cropped_image.rows() != left_win.height()) {\n        vw_throw(ArgumentErr() << \"The image specified via --left-image-clip has different \"\n                  << \"dimensions than set via --left-image-crop-win.\");\n      }\n    }\n\n    // Crop the georef as well\n    vw_out() << \"\\t--> Writing cropped image: \" << left_cropped_file << \"\\n\";\n    block_write_gdal_image(left_cropped_file,\n                           left_cropped_image,\n                           has_left_georef, crop(left_georef, left_win),\n                           has_nodata, left_nodata_value,\n                           options,\n                           TerminalProgressCallback(\"asp\", \"\\t:  \"));\n  } else {\n    // Return a handle to the desired channel of the input image\n    left_cropped_image = left_orig_image;\n  }\n\n  if (crop_right) {\n    // Crop the right image and write to right_cropped_file\n    has_right_georef = read_georeference(right_georef, right_input_file);\n    bool has_nodata = true;\n    BBox2i right_win = stereo_settings().right_image_crop_win;\n    right_win.crop(bounding_box(right_orig_image));\n    // Return a handle to the cropped image\n    right_cropped_image = crop(right_orig_image, right_win);\n\n    if (stereo_settings().right_image_clip != \"\") {\n      // Replace the crop with a given clip. This is a very rarely used option.\n      // It can be handy when investigating CCD artifacts correction.\n      right_cropped_image = DiskImageView<float>(stereo_settings().right_image_clip);\n      if (right_cropped_image.cols() != right_win.width() ||\n          right_cropped_image.rows() != right_win.height()) {\n        vw_throw(ArgumentErr() << \"The image specified via --right-image-clip has different \"\n                  << \"dimensions than set via --right-image-crop-win.\");\n      }\n    }\n\n    // Crop the georef as well\n    vw_out() << \"\\t--> Writing cropped image: \" << right_cropped_file << \"\\n\";\n    block_write_gdal_image(right_cropped_file,\n                           right_cropped_image,\n                           has_right_georef,\n                           crop(right_georef, right_win),\n                           has_nodata, right_nodata_value,\n                           options,\n                           TerminalProgressCallback(\"asp\", \"\\t:  \"));\n  } else {\n    // Return a handle to the desired channel of the input image\n    right_cropped_image = right_orig_image;\n  }\n\n  // Re-read the georef, since it may have changed above.\n  has_left_georef  = read_georeference(left_georef,  left_cropped_file);\n  has_right_georef = read_georeference(right_georef, right_cropped_file);\n  if (stereo_settings().alignment_method != \"none\") {\n    // If any alignment at all happens, the georef will be messed up.\n    has_left_georef  = false;\n    has_right_georef = false;\n  }\n\n  return false; // don't exit early\n}\n\n} // End namespace asp\n"
  },
  {
    "path": "src/asp/Sessions/StereoSessionIp.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2024, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Keep here interest-point matching logic for StereoSession, as this logic\n// can be slow to compile.\n\n/// \\file StereoSessionIp.cc\n///\n#include <asp/Core/InterestPointMatching.h>\n#include <asp/Core/IpMatchingAlgs.h>\n#include <asp/Core/ImageNormalization.h>\n#include <asp/Core/AffineEpipolar.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/FileUtils.h>\n#include <asp/Camera/RPCModel.h>\n#include <asp/Sessions/StereoSession.h>\n#include <asp/Sessions/StereoSessionFactory.h>\n#include <asp/Core/ImageUtils.h>\n\n#include <vw/Core/Exception.h>\n#include <vw/Core/Log.h>\n#include <vw/Math/Vector.h>\n#include <vw/Image/PixelMask.h>\n#include <vw/FileIO/DiskImageResource.h>\n#include <vw/FileIO/DiskImageView.h>\n#include <vw/Cartography/GeoReferenceUtils.h>\n#include <vw/InterestPoint/MatcherIO.h>\n#include <vw/FileIO/MatrixIO.h>\n#include <vw/Cartography/GeoTransform.h>\n\n#include <boost/filesystem/operations.hpp>\n\n#include <string>\n\nusing namespace vw;\nusing namespace vw::cartography;\n\nnamespace fs = boost::filesystem;\n\nnamespace asp {\n\n// A default IP matching implementation that derived classes can use\nbool StereoSession::ip_matching(std::string const& input_file1,\n                                std::string const& input_file2,\n                                vw::Vector2 const& uncropped_image_size,\n                                Vector6f    const& stats1,\n                                Vector6f    const& stats2,\n                                float nodata1, float nodata2,\n                                vw::camera::CameraModel* cam1,\n                                vw::camera::CameraModel* cam2,\n                                std::string const& match_filename,\n                                std::string const  left_ip_file,\n                                std::string const  right_ip_file,\n                                vw::BBox2i const& bbox1,\n                                vw::BBox2i const& bbox2) {\n\n  vw_out() << \"\\t--> Matching interest points in StereoSession.\\n\";\n\n  // Sanity checks. Must be here since we will use this code in stereo and bundle_adjust.\n  if (asp::stereo_settings().matches_per_tile > 0) {\n\n   if (asp::stereo_settings().ip_per_tile < asp::stereo_settings().matches_per_tile ||\n      asp::stereo_settings().ip_per_image > 0)\n        vw::vw_throw(vw::ArgumentErr()\n          << \"When setting --matches-per-tile, must set --ip-per-tile to at least \"\n          << \"a factor of that, and do not set --ip-per-image.\\n\");\n\n    Vector2i params = asp::stereo_settings().matches_per_tile_params;\n    if (params[0] <= 0 || params[1] < params[0] || params[1] > 2 * params[0])\n      vw::vw_throw(vw::ArgumentErr()\n          << \"First value in --matches-per-tile-params must be positive, and second one must be no less than first one but no more than twice the first one.\\n\");\n  }\n\n  bool inlier = false;\n\n  // Try to give a useful error message if things fail\n  std::string err = \"\";\n\n  try {\n\n  // If we crop the images we must always create new matching files.\n  // Otherwise, do not rebuild with externally provided match files,\n  // or if a match file newer than the image and cameras is found in\n  // the output directory.\n  bool crop_left  = (stereo_settings().left_image_crop_win  != BBox2i(0, 0, 0, 0));\n  bool crop_right = (stereo_settings().right_image_crop_win != BBox2i(0, 0, 0, 0));\n  bool rebuild = (!asp::first_is_newer(match_filename, input_file1, input_file2,\n                                  m_left_camera_file, m_right_camera_file));\n  if (!crop_left && !crop_right &&\n      (stereo_settings().force_reuse_match_files ||\n       stereo_settings().clean_match_files_prefix != \"\" ||\n       stereo_settings().match_files_prefix != \"\"))\n    rebuild = false;\n  if (crop_left || crop_right)\n    rebuild = true;\n\n  if (boost::filesystem::exists(match_filename) && !rebuild) {\n    vw_out() << \"\\t--> Using cached match file: \" << match_filename << \"\\n\";\n    return true;\n  }\n  \n  // If any cropping is done, or if the vwip file is old, or of using rough\n  // homography, then remove the old vwip files.\n  if (boost::filesystem::exists(left_ip_file) && \n      (crop_left || crop_right || !asp::first_is_newer(left_ip_file, input_file1) ||\n       !asp::stereo_settings().skip_rough_homography))\n    boost::filesystem::remove(left_ip_file);\n  if (boost::filesystem::exists(right_ip_file) && \n      (crop_left || crop_right || !asp::first_is_newer(right_ip_file, input_file2) ||\n       !asp::stereo_settings().skip_rough_homography))\n    boost::filesystem::remove(right_ip_file);\n  if (boost::filesystem::exists(match_filename)) {\n    vw_out() << \"Removing old match file: \" << match_filename << \"\\n\";\n    // It is hoped the logic before here was such that we will not\n    // wipe external match files given by --match-files-prefix or\n    // --clean-match-files-prefix.\n    boost::filesystem::remove(match_filename);\n  }\n\n  // Create DiskImageResource objects. It is a little messy to make sure\n  // it works with SPOT5 which will not work without the camera file\n  // but the camera file does not match if the image is cropped.\n  // Ideally there would be a function to make this cleaner.\n  boost::shared_ptr<DiskImageResource> rsrc1, rsrc2;\n  if (input_file1 == m_left_image_file)\n    rsrc1 = vw::DiskImageResourcePtr(m_left_image_file);\n  else // Tiff input\n    rsrc1 = vw::DiskImageResourcePtr(input_file1);\n  if (input_file2 == m_right_image_file)\n    rsrc2 = vw::DiskImageResourcePtr(m_right_image_file);\n  else // Tiff input\n    rsrc2 = vw::DiskImageResourcePtr(input_file2);\n\n  // Open the images\n  ImageViewRef<float> image1 = DiskImageView<float>(rsrc1);\n  ImageViewRef<float> image2 = DiskImageView<float>(rsrc2);\n  \n  // If the user provided a custom no-data value, values no more than that are\n  // masked. Otherwise, only values equal to no-data are masked.\n  ImageViewRef<PixelMask<float>> masked_image1, masked_image2; \n  float user_nodata = stereo_settings().nodata_value;\n    if (!std::isnan(user_nodata)) {\n    masked_image1 = create_mask_less_or_equal(image1, user_nodata);\n    masked_image2 = create_mask_less_or_equal(image2, user_nodata);\n  } else {\n    // Mask the no-data values in the images\n    masked_image1 = create_mask(image1, nodata1);\n    masked_image2 = create_mask(image2, nodata2);\n  }\n\n  // Get normalized versions of the images for OpenCV based methods.\n  // Similar logic is used in bundle_adjust per image.\n  if (asp::openCvDetectMethod()) {\n    vw_out() << \"\\t--> Normalizing images for IP detection using stats \" << stats1 << \"\\n\";\n    asp::normalize_images(stereo_settings().force_use_entire_range,\n                          stereo_settings().individually_normalize,\n                          asp::openCvDetectMethod(),\n                          asp::doNotExceedMinMax(),\n                          stats1, stats2,\n                          masked_image1, masked_image2);\n  }\n\n  bool have_datum = this->have_datum();\n\n  // If cameras are null then we cannot use them\n  if (cam1 == NULL || cam2 == NULL)\n    have_datum = false;\n\n  // Jobs set to 2x the number of cores. This is just in case all jobs are not equal.\n  // The total number of interest points will be divided up among the jobs.\n  size_t number_of_jobs = vw_settings().default_num_threads() * 2;\n  if (vw_settings().default_num_threads() == 1) // the user wants one thread\n    number_of_jobs = 1;\n\n#if __APPLE__\n  // Fix due to OpenBLAS crashing and/or giving different results\n  // each time.\n  // TODO(oalexan1): Revisit this.\n  number_of_jobs = std::min(int(vw_settings().default_num_threads()), 1);\n  vw_out() << \"\\t    Using \" << number_of_jobs << \" thread(s) for matching.\\n\";\n#endif\n\n  if (have_datum) {\n    // Run an IP matching function that takes the camera and datum info into account\n\n    bool use_sphere_for_non_earth = true; // Assume Mars is a sphere\n    cartography::Datum datum = this->get_datum(cam1, use_sphere_for_non_earth);\n\n    // This is a bugfix. For RPC models, we must never intersect with\n    // a datum whose height is outside of the domain of applicability\n    // of the RPC model, as that can lead to very incorrect results.\n    const asp::RPCModel *rpc_cam\n      = dynamic_cast<const asp::RPCModel*>(vw::camera::unadjusted_model(cam1));\n    if (rpc_cam != NULL) {\n      Vector3 lonlatheight_offset = rpc_cam->lonlatheight_offset();\n      Vector3 lonlatheight_scale  = rpc_cam->lonlatheight_scale();\n      double mid_ht = lonlatheight_offset[2];\n      double min_ht = mid_ht - lonlatheight_scale[2];\n      double max_ht = mid_ht + lonlatheight_scale[2];\n      if (max_ht < 0)\n        vw_out() << \"Warning: The RPC model maximum height is below the zero datum.\\n\";\n\n      if (min_ht > 0)\n        vw_out() << \"Warning: The RPC model minimum height is above the zero datum.\\n\";\n\n      if (max_ht < 0 || min_ht > 0) {\n        vw_out() << \"RPC model min and max heights above datum: \"\n                 << min_ht << ' ' << max_ht << \" meters.\\n\";\n        vw_out() << \"Adjusting the datum to compensate, for the purpose of alignment.\\n\";\n        vw_out() << \"The new datum height will be at \" << mid_ht\n                 << \" meters relative to the previous one.\\n\";\n        vw_out() << \"Old datum: \" << datum << \"\\n\";\n        datum = vw::cartography::Datum(datum.name(),\n                                       datum.spheroid_name(),\n                                       datum.meridian_name(),\n                                       datum.semi_major_axis() + mid_ht,\n                                       datum.semi_minor_axis() + mid_ht,\n                                       datum.meridian_offset());\n        vw_out() << \"New datum: \" << datum << \"\\n\";\n      }\n    } // End RPC case\n\n    // A smaller value here makes IP more unique, but also fewer\n    double ip_uniqueness_thresh = stereo_settings().ip_uniqueness_thresh;\n\n    // TODO: Improve calculation of epipolar parameter!\n    // This computes a distance used for throwing out interest points.\n    // - It has to be computed using the entire (not cropped) image size!\n    // A larger value will keep more (but of lower quality) points.\n    double epipolar_threshold = norm_2(uncropped_image_size)/15;\n    if (stereo_settings().epipolar_threshold > 0)\n      epipolar_threshold = stereo_settings().epipolar_threshold;\n    vw_out() << \"\\t    Using epipolar threshold = \" << epipolar_threshold << \"\\n\";\n    vw_out() << \"\\t    IP uniqueness threshold  = \" << ip_uniqueness_thresh  << \"\\n\";\n    vw_out() << \"\\t    Datum:                     \" << datum << \"\\n\";\n    inlier = match_ip_with_datum(!supports_multi_threading(),\n                                 !stereo_settings().skip_rough_homography,\n                                 cam1, cam2,\n                                 apply_mask(masked_image1, nodata1),\n                                 apply_mask(masked_image2, nodata2),\n                                 asp::stereo_settings().ip_per_tile,\n                                 datum, match_filename, number_of_jobs,\n                                 epipolar_threshold, ip_uniqueness_thresh,\n                                 left_ip_file, right_ip_file,\n                                 nodata1, nodata2);\n  } else { // No datum\n    // Run a simpler purely image-based matching function\n    double ip_inlier_factor = stereo_settings().ip_inlier_factor;\n    // --ip-inlier-factor is 0.2 in bundle_adjust and stereo. \n    // The default value below should be 200. Lower values were observed\n    // to filter too many inliers.\n    int inlier_threshold = round(1000.0 * ip_inlier_factor);\n\n    // HACK: If the otherwise unused epipolar threshold is set, use it as\n    // the inlier threshold.\n    // TODO(oalexan1): This may need to be removed.\n    if (stereo_settings().epipolar_threshold > 0)\n      inlier_threshold = stereo_settings().epipolar_threshold;\n\n    vw_out() << \"\\t    Not using a datum in interest point matching.\\n\";\n    bool use_cached_ip = true; // When ip should not be cached they were already wiped\n    inlier = homography_ip_matching(apply_mask(masked_image1, nodata1),\n                                    apply_mask(masked_image2, nodata2),\n                                    asp::stereo_settings().ip_per_tile,\n                                    inlier_threshold,\n                                    match_filename, number_of_jobs,\n                                    left_ip_file, right_ip_file,\n                                    use_cached_ip,\n                                    nodata1, nodata2, bbox1, bbox2);\n  }\n\n  } catch (std::exception const& e) {\n    err = e.what();\n  }\n\n  if (!inlier || err != \"\") {\n    boost::filesystem::remove(match_filename);\n    std::string msg = \"Unable to find enough interest point matches in the images. \"\n      \"Check if the images are similar enough in illumination and if they have \"\n      \"enough overlap.\\n\";\n    if (err != \"\")\n      msg += \"A more technical error message is as follows.\\n\" + err;\n    vw_throw(IOErr() << msg);\n  }\n\n  return inlier;\n} // End function ip_matching()\n\n// Find ip matches and determine the alignment matrices\nvoid StereoSession::imageAlignment(// Inputs\n                                   std::string  const& out_prefix,\n                                   std::string  const& left_cropped_file,\n                                   std::string  const& right_cropped_file,\n                                   std::string  const& left_uncropped_file,\n                                   vw::Vector6f const& left_stats,\n                                   vw::Vector6f const& right_stats,\n                                   float left_nodata_value,\n                                   float right_nodata_value,\n                                   vw::CamPtr left_cam,\n                                   vw::CamPtr right_cam,\n                                   bool adjust_left_image_size,\n                                   // In-out\n                                   vw::Matrix<double> & align_left_matrix,\n                                   vw::Matrix<double> & align_right_matrix,\n                                   vw::Vector2i & left_size,\n                                   vw::Vector2i & right_size) {\n\n  // Define the file name containing IP match information.\n  bool matches_as_txt = stereo_settings().matches_as_txt;\n  std::string match_filename\n    = asp::stereoMatchFile(left_cropped_file, right_cropped_file, out_prefix,\n                           matches_as_txt);\n\n  std::string left_ip_filename  = ip::ip_filename(out_prefix, left_cropped_file);\n  std::string right_ip_filename = ip::ip_filename(out_prefix, right_cropped_file);\n\n  // Detect matching interest points between the left and right input images.\n  // The output is written directly to a file.\n  DiskImageView<float> left_orig_image(left_uncropped_file);\n  vw::Vector2 uncropped_left_image_size = bounding_box(left_orig_image).size();\n  this->ip_matching(left_cropped_file, right_cropped_file,\n                    uncropped_left_image_size,\n                    left_stats, right_stats,\n                    left_nodata_value, right_nodata_value,\n                    left_cam.get(), right_cam.get(),\n                    match_filename, left_ip_filename, right_ip_filename);\n\n  // Load the interest points results from the file we just wrote\n  std::vector<ip::InterestPoint> left_ip, right_ip;\n  vw::vw_out() << \"Reading match file: \" << match_filename << \"\\n\";\n  ip::read_match_file(match_filename, left_ip, right_ip, matches_as_txt);\n\n  // Compute the appropriate alignment matrix based on the input points\n  if (stereo_settings().alignment_method == \"homography\") {\n    bool tight_inlier_threshold = false;\n    left_size = homography_rectification(adjust_left_image_size, tight_inlier_threshold,\n                                         left_size, right_size, left_ip, right_ip,\n                                         align_left_matrix, align_right_matrix);\n    vw_out() << \"\\t--> Aligning right image to left using matrices:\\n\"\n             << \"\\t      \" << align_left_matrix  << \"\\n\"\n             << \"\\t      \" << align_right_matrix << \"\\n\";\n  } else {\n    // affineepipolar and local_epipolar\n    bool crop_to_shared_area = true;\n    left_size\n      = affine_epipolar_rectification(left_size,         right_size,\n                                      stereo_settings().global_alignment_threshold,\n                                      stereo_settings().alignment_num_ransac_iterations,\n                                      left_ip,           right_ip,\n                                      crop_to_shared_area,\n                                      align_left_matrix, align_right_matrix);\n    vw_out() << \"\\t--> Aligning left and right images using affine matrices:\\n\"\n             << \"\\t      \" << submatrix(align_left_matrix, 0,0,2,3) << \"\\n\"\n             << \"\\t      \" << submatrix(align_right_matrix,0,0,2,3) << \"\\n\";\n  }\n  // Write out both computed matrices to disk\n  write_matrix_as_txt(out_prefix + \"-align-L.txt\", align_left_matrix);\n  write_matrix_as_txt(out_prefix + \"-align-R.txt\", align_right_matrix);\n\n  // Because the images are now aligned they are the same size\n  right_size = left_size;\n}\n\n// A wrapper around ip matching. Can also work with NULL cameras. Various settings\n// are passed in via asp::stereo_settings().\n// TODO(oalexan1): It is not clear the stereo session is needed for ip matching.\nvoid matchIp(std::string const& out_prefix,\n             bool enable_rough_homography,\n             double pct_for_overlap,\n             asp::SessionPtr session,\n             std::string const& image1_path,  std::string const& image2_path,\n             vw::camera::CameraModel* cam1,   vw::camera::CameraModel* cam2,\n             std::string const& match_filename) {\n\n  boost::shared_ptr<DiskImageResource>\n    rsrc1(vw::DiskImageResourcePtr(image1_path)),\n    rsrc2(vw::DiskImageResourcePtr(image2_path));\n  if ((rsrc1->channels() > 1) || (rsrc2->channels() > 1))\n    vw_throw(ArgumentErr()\n             << \"Error: Input images can only have a single channel!\\n\\n\");\n  float nodata1, nodata2;\n  asp::get_nodata_values(rsrc1, rsrc2, asp::stereo_settings().nodata_value, nodata1, nodata2);\n\n  // IP matching may not succeed for all pairs\n\n  // Get masked views of the images to get statistics from. If the user provided\n  // a custom no-data value, values no more than that are masked. Otherwise only \n  // the exact no-data values are masked.\n  ImageViewRef<float> image1_view = DiskImageView<float>(rsrc1);\n  ImageViewRef<float> image2_view = DiskImageView<float>(rsrc2);\n  ImageViewRef<PixelMask<float>> masked_image1, masked_image2;\n  float user_nodata = asp::stereo_settings().nodata_value;\n  if (!std::isnan(user_nodata)) {\n    masked_image1 = create_mask_less_or_equal(image1_view, user_nodata);\n    masked_image2 = create_mask_less_or_equal(image2_view, user_nodata);\n  } else {\n    masked_image1 = create_mask(image1_view, nodata1);\n    masked_image2 = create_mask(image2_view, nodata2);\n  }\n\n  // Since we computed statistics earlier, this will just be loading files.\n  vw::Vector<vw::float32,6> image1_stats, image2_stats;\n  image1_stats = asp::gather_stats(masked_image1,\n                                   out_prefix, image1_path,\n                                   asp::stereo_settings().force_reuse_match_files);\n  image2_stats = asp::gather_stats(masked_image2,\n                                   out_prefix, image2_path,\n                                   asp::stereo_settings().force_reuse_match_files);\n\n  // Rough homography cannot use / cache vwip\n  std::string vwip_file1, vwip_file2; \n  if (enable_rough_homography) {\n    vw::vw_out(vw::WarningMessage)\n      << \"Option --enable-rough-homography is set. Will not save interest \"\n      << \"point matches per image before matching (vwip), as these depend \"\n      << \"on the pair of images used.\\n\";\n  } else {\n    vwip_file1 = ip::ip_filename(out_prefix, image1_path);\n    vwip_file2 = ip::ip_filename(out_prefix, image2_path);\n  }\n  \n  // For mapprojected images and given the overlap params,\n  // can restrict the matching to a smaller region.\n  vw::BBox2 bbox1, bbox2;\n  if (pct_for_overlap >= 0 && cam1 == NULL && cam2 == NULL) {\n    vw::cartography::GeoReference georef1, georef2;\n    bool has_georef1 = vw::cartography::read_georeference(georef1, image1_path);\n    bool has_georef2 = vw::cartography::read_georeference(georef2, image2_path);\n    if (has_georef1 && has_georef2) {\n      bbox1 = vw::bounding_box(masked_image1);\n      bbox2 = vw::bounding_box(masked_image2);\n      // Expand the boxes by pct\n      expand_box_by_pct(bbox1, pct_for_overlap);\n      expand_box_by_pct(bbox2, pct_for_overlap);\n      // Transform each box to the other image's pixel coordinates\n      vw::cartography::GeoTransform trans(georef1, georef2);\n      vw::BBox2 trans_bbox1 = trans.forward_bbox(bbox1);\n      vw::BBox2 trans_bbox2 = trans.reverse_bbox(bbox2);\n      // The first box will be the 2nd transformed box, then cropped\n      // to bounding box of first image\n      bbox1 = trans_bbox2;\n      bbox1.crop(bounding_box(masked_image1));\n      // Same logic for the second box.\n      bbox2 = trans_bbox1;\n      bbox2.crop(bounding_box(masked_image2));\n    }\n  }\n\n  // The match files (.match) are cached unless the images or camera\n  // are newer than them.\n  session->ip_matching(image1_path, image2_path,\n                       Vector2(masked_image1.cols(), masked_image1.rows()),\n                       image1_stats, image2_stats,\n                       nodata1, nodata2, cam1, cam2, match_filename,\n                       vwip_file1, vwip_file2, bbox1, bbox2);\n}\n\n// Compute list of matched IP between two images with no cameras\nvoid matchIpNoCams(std::string const& image1, \n                   std::string const& image2,\n                   std::string const& output_prefix, \n                   std::vector<vw::ip::InterestPoint> & matched_ip1,\n                   std::vector<vw::ip::InterestPoint> & matched_ip2) {\n\n  // Alias for interest point matching settings \n  auto & ip_opt = asp::stereo_settings();\n  \n  // These need to be passed to the ip matching function\n  ip_opt.correlator_mode  = true; // no cameras\n  ip_opt.alignment_method = \"none\"; // no alignment; a homography transform will be used\n  bool matches_as_txt = ip_opt.matches_as_txt; // for loading matches\n\n  std::string match_file\n    = vw::ip::match_filename(output_prefix, image1, image2, matches_as_txt);\n\n  asp::SessionPtr session(NULL);\n  std::string stereo_session = \"pinhole\", input_dem = \"\";\n  bool allow_map_promote = false, total_quiet = true;\n  vw::GdalWriteOptions gdal_opt;\n  session = asp::StereoSessionFactory::create\n                        (stereo_session, // may change\n                        gdal_opt, \n                        image1, image2,\n                        image1, image2,\n                        output_prefix, input_dem, allow_map_promote, total_quiet);\n\n  vw::camera::CameraModel* cam1 = NULL, *cam2 = NULL;\n  bool enable_rough_homography = false;\n  double pct_for_overlap = -1.0;\n  asp::matchIp(output_prefix, enable_rough_homography, pct_for_overlap,\n               session, image1, image2,\n               cam1, cam2,\n               match_file);\n               \n  // Read the match files from disk\n  vw::vw_out() << \"Reading matches from: \" << match_file << \"\\n\";\n  vw::ip::read_match_file(match_file, matched_ip1, matched_ip2, matches_as_txt);\n   \n  return;\n}\n\n} // End namespace asp\n"
  },
  {
    "path": "src/asp/Sessions/StereoSessionIsis.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file StereoSessionIsis.cc\n///\n\n#include <asp/asp_config.h> // defines ASP_HAVE_PKG_ISIS\n#if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1\n\n#include <asp/Sessions/StereoSessionIsis.h>\n#include <asp/IsisIO/IsisCameraModel.h>\n#include <asp/Core/BaseCameraUtils.h>\n\n#include <vw/Camera/CameraModel.h>\n#include <vw/Cartography/Datum.h>\n\n#include <boost/shared_ptr.hpp>\n\nusing namespace vw;\nusing namespace vw::camera;\nusing namespace vw::cartography;\n\nnamespace asp {\n\nbool StereoSessionIsis::supports_multi_threading () const {\n  return false;\n}\n\n/// Returns the target datum to use for a given camera model. Note the parameter\n/// use_sphere_for_non_earth. During alignment, we'd like to use the most\n/// accurate non-spherical datum, hence radii[2]. However, for the purpose of\n/// creating a DEM on non-Earth planets people usually just use a spherical\n/// datum, which we'll do as well.  Maybe at some point this needs to change.\nvw::cartography::Datum StereoSessionIsis::get_datum(const vw::camera::CameraModel* cam,\n                                                    bool use_sphere_for_non_earth) const {\n  const IsisCameraModel * isis_cam\n    = dynamic_cast<const IsisCameraModel*>(vw::camera::unadjusted_model(cam));\n  VW_ASSERT(isis_cam != NULL, ArgumentErr() << \"StereoSessionISIS: Invalid camera.\\n\");\n\n  return isis_cam->get_datum_isis(use_sphere_for_non_earth);\n}\n\nboost::shared_ptr<vw::camera::CameraModel>\nStereoSessionIsis::load_camera_model(std::string const& image_file,\n                                     std::string const& camera_file,\n                                     std::string const& ba_prefix,\n                                     Vector2 pixel_offset) const {\n\n  // If the camera file is empty, then we assume the image file has the camera.\n  std::string l_cam = camera_file;\n  if (l_cam.empty())\n    l_cam = image_file;\n\n  return load_adjusted_model(m_camera_loader.load_isis_camera_model(l_cam),\n                            image_file, camera_file, ba_prefix, pixel_offset);\n}\n\n}\n\n#endif  // ASP_HAVE_PKG_ISIS\n"
  },
  {
    "path": "src/asp/Sessions/StereoSessionIsis.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file StereoSessionIsis.h\n///\n\n#ifndef __STEREO_SESSION_ISIS_H__\n#define __STEREO_SESSION_ISIS_H__\n\n#include <asp/Sessions/StereoSession.h>\n#include <asp/asp_config.h> // defines ASP_HAVE_PKG_ISIS\n#if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1\n\nnamespace asp {\n\n/// Derived StereoSession class for ISIS images\nclass StereoSessionIsis: public StereoSession {\npublic:\n\n  virtual ~StereoSessionIsis() {}\n\n  virtual std::string name() const { return \"isis\"; }\n\n  virtual bool supports_multi_threading() const;\n\n  /// Returns the target datum to use for a given camera model\n  virtual vw::cartography::Datum get_datum(const vw::camera::CameraModel* cam,\n                                            bool use_sphere_for_non_earth) const;\n\n  /// Simple factory function\n  static SessionPtr construct() { return SessionPtr(new StereoSessionIsis); }\n\nprotected:\n  /// Function to load a camera model of the particular type\n  virtual boost::shared_ptr<vw::camera::CameraModel>\n  load_camera_model(std::string const& image_file,\n                    std::string const& camera_file,\n                    std::string const& ba_prefix,\n                    vw::Vector2 pixel_offset) const;\n};\n\n} // end namespace asp\n\n#endif  // ASP_HAVE_PKG_ISIS\n\n#endif // __STEREO_SESSION_ISIS_H__\n"
  },
  {
    "path": "src/asp/Sessions/StereoSessionMapProj.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file StereoSessionMapProj.h\n///\n/// This a session that support RPC Mapproject DG images. It is built\n/// entirely so that left and right TX are objects and not TransformRefs.\n\n#ifndef __STEREO_SESSION_MAPPROJ_H__\n#define __STEREO_SESSION_MAPPROJ_H__\n\n#include <asp/Sessions/StereoSession.h>\n#include <asp/Sessions/StereoSessionGdal.h>\n#include <asp/Sessions/StereoSessionPinhole.h>\n#include <asp/Camera/CsmModel.h>\n#include <asp/Core/BaseCameraUtils.h>\n#include <asp/asp_config.h> // defines ASP_HAVE_PKG_ISIS\n\n#include <vw/Image/Transform.h>\n\nnamespace asp {\n \n  /// Parent class for all map projected types\n  /// - All map projected types inherit from the Gdal session since\n  ///   our map projected images are tiff files.\n  class StereoSessionMapProj: public StereoSessionGdal  {\n  public:\n    StereoSessionMapProj(){};\n    virtual ~StereoSessionMapProj(){};\n    \n    virtual std::string name() const = 0;\n    virtual bool isMapProjected() const { return true; }\n\n    virtual vw::TransformPtr tx_left () const {return tx_left_map_trans ();}\n    virtual vw::TransformPtr tx_right() const {return tx_right_map_trans();}\n  };\n  \n  \n  /// Specialization of the StereoSessionGDAL class to use RPC\n  /// map-projected inputs with the DG sensor model.\n  class StereoSessionDGMapRPC: public StereoSessionMapProj {\n  public:\n    StereoSessionDGMapRPC(){};\n    virtual ~StereoSessionDGMapRPC(){};\n\n    virtual std::string name() const { return \"dgmaprpc\"; }\n\n    static SessionPtr construct() { return SessionPtr(new StereoSessionDGMapRPC); }\n    \n  protected:\n    /// Function to load a camera model of the particular type.\n    virtual boost::shared_ptr<vw::camera::CameraModel>\n    load_camera_model(std::string const& image_file, \n                      std::string const& camera_file,\n                      std::string const& ba_prefix, \n                      vw::Vector2 pixel_offset) const {\n      return load_adjusted_model(m_camera_loader.load_dg_camera_model(camera_file),\n                                 image_file, camera_file, ba_prefix, pixel_offset);\n    }\n  };\n\n  /// Specialization of the StereoSessionGDAL class to use DG\n  /// map-projected inputs with the DG sensor model.\n  class StereoSessionDGMapDG: public StereoSessionMapProj {\n  public:\n    StereoSessionDGMapDG(){};\n    virtual ~StereoSessionDGMapDG(){};\n\n    virtual std::string name() const { return \"dgmapdg\"; }\n\n    static SessionPtr construct() { return SessionPtr(new StereoSessionDGMapDG); }\n    \n  protected:\n    /// Function to load a camera model of the particular type.\n    virtual boost::shared_ptr<vw::camera::CameraModel>\n    load_camera_model(std::string const& image_file, \n                      std::string const& camera_file,\n                      std::string const& ba_prefix, \n                      vw::Vector2 pixel_offset) const {\n      return load_adjusted_model(m_camera_loader.load_dg_camera_model(camera_file),\n                                 image_file, camera_file, ba_prefix, pixel_offset);\n    }\n  };\n\n  /// Specialization of the StereoSessionGDAL class to use RPC\n  /// map-projected inputs with the RPC sensor model.\n  class StereoSessionRPCMapRPC: public StereoSessionMapProj  {\n  public:\n    StereoSessionRPCMapRPC(){};\n    virtual ~StereoSessionRPCMapRPC(){};\n\n    virtual std::string name() const { return \"rpcmaprpc\"; }\n\n    static SessionPtr construct() { return SessionPtr(new StereoSessionRPCMapRPC); }\n    \n  protected:\n    /// Function to load a camera model of the particular type.\n    virtual boost::shared_ptr<vw::camera::CameraModel>\n    load_camera_model(std::string const& image_file, \n                      std::string const& camera_file,\n                      std::string const& ba_prefix, \n                      vw::Vector2 pixel_offset) const {\n      return load_rpc_camera_model(image_file, camera_file, ba_prefix, pixel_offset);\n  }\n  \n  };\n\n#if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1\n\n  /// Specialization of the StereoSessionGDAL class to use (ISIS)\n  /// map-projected inputs with the ISIS sensor model.\n  class StereoSessionIsisMapIsis: public StereoSessionMapProj  {\n  public:\n    StereoSessionIsisMapIsis() {};\n    virtual ~StereoSessionIsisMapIsis(){};\n\n    virtual std::string name() const { return \"isismapisis\"; }\n\n    virtual bool supports_multi_threading() const {\n      return false;\n    }\n\n    static SessionPtr construct() { return SessionPtr(new StereoSessionIsisMapIsis); }\n    \n  protected:\n    /// Function to load a camera model of the particular type.\n    virtual boost::shared_ptr<vw::camera::CameraModel>\n    load_camera_model(std::string const& image_file, \n                      std::string const& camera_file,\n                      std::string const& ba_prefix, \n                      vw::Vector2 pixel_offset) const {\n    return load_adjusted_model(m_camera_loader.load_isis_camera_model(camera_file),\n                               image_file, camera_file, ba_prefix, pixel_offset);\n    }\n    \n  };\n\n#endif // defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1\n\n  /// Specialization of the StereoSessionGDAL class to use Pinhole\n  /// map-projected inputs with the Pinhole sensor model.\n  class StereoSessionPinholeMapPinhole: public StereoSessionMapProj{\n  public:\n    StereoSessionPinholeMapPinhole() {}\n    virtual ~StereoSessionPinholeMapPinhole() {}\n\n    virtual std::string name() const { return \"pinholemappinhole\"; }\n\n    static SessionPtr construct() { return SessionPtr(new StereoSessionPinholeMapPinhole); }\n    \n  protected:\n    /// Function to load a camera model of the particular type.\n    virtual boost::shared_ptr<vw::camera::CameraModel>\n    load_camera_model(std::string const& image_file, \n                      std::string const& camera_file,\n                      std::string const& ba_prefix, \n                      vw::Vector2 pixel_offset) const {\n      return asp::load_adj_pinhole_model(image_file, camera_file,\n                                         m_left_image_file, m_right_image_file,\n                                         m_left_camera_file, m_right_camera_file,\n                                         ba_prefix, isMapProjected());\n    }\n  };\n\n  /// Specialization of the StereoSessionGDAL class to use optical bar\n  /// map-projected inputs with the optical bar sensor model.\n  class StereoSessionBarMapBar: public StereoSessionMapProj{\n  public:\n    StereoSessionBarMapBar() {}\n    virtual ~StereoSessionBarMapBar() {}\n\n    virtual std::string name() const { return \"opticalbarmapopticalbar\"; }\n\n    static SessionPtr construct() { return SessionPtr(new StereoSessionBarMapBar); }\n\n  protected:\n    /// Function to load a camera model of the particular type.\n    virtual boost::shared_ptr<vw::camera::CameraModel>\n    load_camera_model(std::string const& image_file, \n                      std::string const& camera_file,\n                      std::string const& ba_prefix,\n                      vw::Vector2 pixel_offset) const {\n      return load_adjusted_model(m_camera_loader.load_optical_bar_camera_model(camera_file),\n                                 image_file, camera_file, ba_prefix, pixel_offset);\n    }\n  };\n\n  /// Specialization of the StereoSessionGDAL class to use CSM\n  /// map-projected inputs with the CSM sensor model.\n  class StereoSessionCsmMapCsm: public StereoSessionMapProj{\n  public:\n    StereoSessionCsmMapCsm() {}\n    virtual ~StereoSessionCsmMapCsm() {}\n\n    virtual std::string name() const { return \"csmmapcsm\"; }\n\n    static SessionPtr construct() { return SessionPtr(new StereoSessionCsmMapCsm); }\n\n  protected:\n    /// Function to load a camera model of the particular type.\n    virtual boost::shared_ptr<vw::camera::CameraModel>\n    load_camera_model(std::string const& image_file, \n                      std::string const& camera_file,\n                      std::string const& ba_prefix,\n                      vw::Vector2 pixel_offset) const {\n    return load_adjusted_model(m_camera_loader.load_csm_camera_model(camera_file),\n                               image_file, camera_file, ba_prefix, pixel_offset);\n    }\n  };\n\n  /// Specialization of the StereoSessionGDAL class to use RPC\n  /// map-projected inputs with the CSM sensor model. The \n  /// loading of the camera model used to undo the mapprojection\n  /// happens in read_mapproj_cams().\n  class StereoSessionCsmMapRpc: public StereoSessionMapProj{\n  public:\n    StereoSessionCsmMapRpc() {}\n    virtual ~StereoSessionCsmMapRpc() {}\n\n    virtual std::string name() const { return \"csmmaprpc\"; }\n\n    static SessionPtr construct() { return SessionPtr(new StereoSessionCsmMapRpc); }\n\n  protected:\n    /// Function to load a camera model of the particular type, for\n    /// the purpose of triangulation.\n    virtual boost::shared_ptr<vw::camera::CameraModel>\n    load_camera_model(std::string const& image_file, \n                      std::string const& camera_file,\n                      std::string const& ba_prefix,\n                      vw::Vector2 pixel_offset) const {\n    return load_adjusted_model(m_camera_loader.load_csm_camera_model(camera_file),\n                               image_file, camera_file, ba_prefix, pixel_offset);\n    }\n  };\n\n  /// Specialization of the StereoSessionGDAL class to use RPC\n  /// map-projected inputs with the SPOT5 sensor model.\n  class StereoSessionSpot5MapRPC: public StereoSessionMapProj  {\n  public:\n    StereoSessionSpot5MapRPC(){};\n    virtual ~StereoSessionSpot5MapRPC(){};\n\n    virtual std::string name() const { return \"spot5maprpc\"; }\n\n    static SessionPtr construct() { return SessionPtr(new StereoSessionSpot5MapRPC); }\n    \n   protected:\n    /// Function to load a camera model of the particular type.\n    virtual boost::shared_ptr<vw::camera::CameraModel>\n    load_camera_model(std::string const& image_file, \n                      std::string const& camera_file,\n                      std::string const& ba_prefix,\n                      vw::Vector2 pixel_offset) const {\n    return load_adjusted_model(m_camera_loader.load_spot5_camera_model(camera_file),\n                               image_file, camera_file, ba_prefix, pixel_offset);\n    }\n    \n  };\n\n  /// Specialization of the StereoSessionGDAL class to use RPC\n  /// map-projected inputs with the ASTER sensor model.\n  class StereoSessionASTERMapRPC: public StereoSessionMapProj  {\n  public:\n    StereoSessionASTERMapRPC(){};\n    virtual ~StereoSessionASTERMapRPC(){};\n\n    virtual std::string name() const { return \"astermaprpc\"; }\n\n    static SessionPtr construct() { return SessionPtr(new StereoSessionASTERMapRPC); }\n    \n  protected:\n    /// Function to load a camera model of the particular type.\n    virtual boost::shared_ptr<vw::camera::CameraModel>\n    load_camera_model(std::string const& image_file, \n                      std::string const& camera_file,\n                      std::string const& ba_prefix,\n                      vw::Vector2 pixel_offset) const {\n    return load_adjusted_model(m_camera_loader.load_ASTER_camera_model(camera_file),\n                               image_file, camera_file, ba_prefix, pixel_offset);\n    }\n    \n  };\n\n  /// Specialization of the StereoSessionGDAL class to use ASTER\n  /// map-projected inputs with the ASTER sensor model.\n  class StereoSessionASTERMapASTER: public StereoSessionMapProj  {\n  public:\n    StereoSessionASTERMapASTER(){};\n    virtual ~StereoSessionASTERMapASTER(){};\n\n    virtual std::string name() const { return \"astermapaster\"; }\n\n    static SessionPtr construct() { return SessionPtr(new StereoSessionASTERMapASTER); }\n    \n  protected:\n    /// Function to load a camera model of the particular type.\n    virtual boost::shared_ptr<vw::camera::CameraModel>\n    load_camera_model(std::string const& image_file, \n                      std::string const& camera_file,\n                      std::string const& ba_prefix,\n                      vw::Vector2 pixel_offset) const {\n    return load_adjusted_model(m_camera_loader.load_ASTER_camera_model(camera_file),\n                                 image_file, camera_file, ba_prefix, pixel_offset);\n    }\n    \n  };\n\n\n  /// Specialization of the StereoSessionGDAL class to use Pleiades\n  /// map-projected inputs with the Pleiades sensor model.\n  class StereoSessionPleiadesMapPleiades: public StereoSessionMapProj  {\n  public:\n    StereoSessionPleiadesMapPleiades(){};\n    virtual ~StereoSessionPleiadesMapPleiades(){};\n\n    virtual std::string name() const { return \"pleiadesmappleiades\"; }\n\n    static SessionPtr construct() { return SessionPtr(new StereoSessionPleiadesMapPleiades); }\n \n  protected:\n    /// Function to load a camera model of the particular type.\n    virtual boost::shared_ptr<vw::camera::CameraModel>\n    load_camera_model(std::string const& image_file, \n                      std::string const& camera_file,\n                      std::string const& ba_prefix,\n                      vw::Vector2 pixel_offset) const {\n    return load_adjusted_model(m_camera_loader.load_pleiades_camera_model(camera_file),\n                               image_file, camera_file, ba_prefix, pixel_offset);\n    }\n    \n  };\n\n  /// Specialization for SPOT 6/7 map-projected inputs.\n  class StereoSessionSpot67MapSpot67: public StereoSessionMapProj {\n  public:\n    StereoSessionSpot67MapSpot67(){};\n    virtual ~StereoSessionSpot67MapSpot67(){};\n\n    virtual std::string name() const { return \"spotmapspot\"; }\n\n    static SessionPtr construct() { return SessionPtr(new StereoSessionSpot67MapSpot67); }\n\n  protected:\n    virtual boost::shared_ptr<vw::camera::CameraModel>\n    load_camera_model(std::string const& image_file,\n                      std::string const& camera_file,\n                      std::string const& ba_prefix,\n                      vw::Vector2 pixel_offset) const {\n    return load_adjusted_model(m_camera_loader.load_spot_camera_model(camera_file),\n                               image_file, camera_file, ba_prefix, pixel_offset);\n    }\n  };\n\n}\n\n#endif//__STEREO_SESSION_MAPPROJ_H__\n"
  },
  {
    "path": "src/asp/Sessions/StereoSessionNadirPinhole.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n/// \\file StereoSessionNadirPinhole.cc\n///\n#include <vw/Image/ImageMath.h>\n#include <vw/Image/Manipulation.h>\n#include <vw/Image/MaskViews.h>\n#include <vw/Image/Transform.h>\n#include <vw/Math/Matrix.h>\n#include <vw/Cartography/Datum.h>\n\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/AffineEpipolar.h>\n#include <asp/Sessions/StereoSessionGdal.h>\n#include <asp/Sessions/StereoSessionASTER.h>\n#include <asp/Sessions/StereoSessionNadirPinhole.h>\n#include <asp/Camera/RPCModel.h>\n#include <asp/Camera/RPC_XML.h>\n\n#include <boost/shared_ptr.hpp>\n#include <boost/filesystem/operations.hpp>\nnamespace fs = boost::filesystem;\n\n#include <iostream>\n#include <string>\n#include <vector>\n#include <algorithm>\n\nusing namespace vw;\nusing namespace asp;\n\nnamespace asp {\n\nstd::string StereoSessionNadirPinhole::name() const {\n  return \"nadirpinhole\"; \n}\n\nSessionPtr StereoSessionNadirPinhole::construct() { \n  return SessionPtr(new StereoSessionNadirPinhole); \n}\n\n// Must override the StereoSessionPinhole function\nbool StereoSessionNadirPinhole::have_datum() const {\n  return StereoSession::have_datum();\n}\n\n} // End namespace asp\n"
  },
  {
    "path": "src/asp/Sessions/StereoSessionNadirPinhole.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n/// \\file StereoSessionNadirPinhole.h\n///\n/// This is a specialization for downward facing pinhole camera model\n/// on Earth. In other word images that we are sure not going to be\n/// looking at the horizon. If that is the case, we can be smarter\n/// about interest point gathering.\n\n#ifndef __STEREO_SESSION_NADIR_PINHOLE_H__\n#define __STEREO_SESSION_NADIR_PINHOLE_H__\n\n#include <asp/Sessions/StereoSessionPinhole.h>\n\nnamespace asp {\n\n  class StereoSessionNadirPinhole: public StereoSessionPinhole{\n  public:\n    virtual ~StereoSessionNadirPinhole() {}\n\n    // Unlike the pinhole session, this one normally has a datum\n    virtual bool have_datum() const;\n    \n    virtual std::string name() const;\n    static SessionPtr construct();\n  };\n}\n\n#endif//__STEREO_SESSION_NADIR_PINHOLE_H__\n"
  },
  {
    "path": "src/asp/Sessions/StereoSessionPinhole.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n/// \\file StereoSessionPinhole.cc\n///\n\n#include <asp/Sessions/StereoSessionPinhole.h>\n#include <asp/Core/BaseCameraUtils.h>\n#include <asp/Core/StereoSettings.h>\n\n#include <vw/Math/BBox.h>\n#include <vw/Math/Geometry.h>\n#include <vw/Math/Matrix.h>\n#include <vw/Math/RANSAC.h>\n#include <vw/Math/Vector.h>\n#include <vw/Image/ImageViewRef.h>\n#include <vw/Image/MaskViews.h>\n#include <vw/Camera/CameraUtilities.h>\n#include <vw/Camera/EpipolarUtils.h>\n#include <vw/Stereo/DisparityMap.h>\n\n#include <boost/shared_ptr.hpp>\n#include <boost/filesystem/operations.hpp>\nnamespace fs = boost::filesystem;\n\nusing namespace vw;\nusing namespace vw::camera;\n\n// This class assumes pinhole cameras with no datum, such as on a rover.\n// For pinhole satellite images the nadirpinhole mode is suggested.\n\nnamespace asp {\n\nvw::CamPtr load_adj_pinhole_model(std::string const& image_file,\n                                  std::string const& camera_file,\n                                  std::string const& left_image_file,\n                                  std::string const& right_image_file,\n                                  std::string const& left_camera_file,\n                                  std::string const& right_camera_file,\n                                  std::string const& ba_prefix,\n                                  bool isMapProjected) { \n\n  // Unfortunately the pinhole case is more complicated since the left\n  // and right files are inter-dependent.\n\n  // Retrieve the pixel offset (if any) to cropped images\n  vw::Vector2 pixel_offset \n    = asp::camera_pixel_offset(isMapProjected, left_image_file, right_image_file, \n                                         image_file);\n  \n  if (stereo_settings().alignment_method != \"epipolar\") {\n    // Not epipolar, just load the camera model.\n    return asp::load_adjusted_model(\n      vw::camera::load_pinhole_camera_model(camera_file),\n      image_file, camera_file, ba_prefix, pixel_offset);\n  }\n  // Otherwise handle the epipolar case\n\n  bool is_left_camera = true;\n  if (image_file == left_image_file)\n    is_left_camera = true;\n  else if (image_file == right_image_file)\n    is_left_camera = false;\n  else\n    vw::vw_throw(vw::ArgumentErr() \n                 << \"StereoSessionPinhole: supplied camera model filename \"\n                 << \"does not match the name supplied in the constructor.\");\n\n  std::string lcase_file = boost::to_lower_copy(left_camera_file);\n  if (boost::ends_with(lcase_file, \".pinhole\") || boost::ends_with(lcase_file, \".tsai\")) {\n    // Use PinholeModel epipolar code\n\n    PinholeModel left_pin (left_camera_file );\n    PinholeModel right_pin(right_camera_file);\n\n    // Create epipolar rectified camera views\n    boost::shared_ptr<PinholeModel> epipolar_left_pin (new PinholeModel);\n    boost::shared_ptr<PinholeModel> epipolar_right_pin(new PinholeModel);\n    epipolar(left_pin,  right_pin, *epipolar_left_pin, *epipolar_right_pin);\n\n    // Expand epipolar cameras to contain the entire source images.\n    Vector2i left_size  = file_image_size(left_image_file );\n    Vector2i right_size = file_image_size(right_image_file);\n    Vector2i epi_size1, epi_size2; // TODO: Use these!\n    resize_epipolar_cameras_to_fit(left_pin, right_pin,\n                                   *(epipolar_left_pin.get()), *(epipolar_right_pin.get()),\n                                   BBox2i(Vector2i(0,0), left_size),\n                                   BBox2i(Vector2i(0,0), right_size),\n                                   epi_size1, epi_size2);\n\n    // Left camera\n    if (is_left_camera)\n      return asp::load_adjusted_model(epipolar_left_pin, image_file, camera_file, \n                                 ba_prefix, pixel_offset);\n\n    // Right camera\n    return asp::load_adjusted_model(epipolar_right_pin, image_file, camera_file, \n                               ba_prefix, pixel_offset);\n       \n  } else { // Not PinholeModel, use CAHV epipolar code.\n\n    // Fetch CAHV version of the two input pinhole files\n    boost::shared_ptr<CAHVModel> left_cahv\n      = vw::camera::load_cahv_pinhole_camera_model(left_image_file,  left_camera_file );\n    boost::shared_ptr<CAHVModel> right_cahv\n      = vw::camera::load_cahv_pinhole_camera_model(right_image_file, right_camera_file);\n\n    // Create epipolar rectified camera views\n    boost::shared_ptr<CAHVModel> epipolar_left_cahv (new CAHVModel);\n    boost::shared_ptr<CAHVModel> epipolar_right_cahv(new CAHVModel);\n    epipolar(*(left_cahv.get()),  *(right_cahv.get()),\n             *epipolar_left_cahv, *epipolar_right_cahv);\n\n    // Left camera\n    if (is_left_camera)\n      return asp::load_adjusted_model(epipolar_left_cahv, image_file, camera_file, \n                                 ba_prefix, pixel_offset);\n\n    // Right camera\n    return asp::load_adjusted_model(epipolar_right_cahv, image_file, camera_file, \n                               ba_prefix, pixel_offset);\n  }\n}\n\n// The pinhole session is used with rovers and other non-satellite cameras,\n// so there is no datum, unless explicitly provided.\nbool StereoSessionPinhole::have_datum() const {\n  return !stereo_settings().datum.empty() && \n         StereoSession::have_datum();\n}\n\nboost::shared_ptr<vw::camera::CameraModel>\nStereoSessionPinhole::load_camera_model\n  (std::string const& image_file, std::string const& camera_file, \n   std::string const& ba_prefix, Vector2 pixel_offset) const {\n\n  return load_adj_pinhole_model(image_file, camera_file,\n                                m_left_image_file,  m_right_image_file,\n                                m_left_camera_file, m_right_camera_file,\n                                ba_prefix, isMapProjected());\n}\n\n// Apply epipolar alignment to images, if the camera models are pinhole\nvoid StereoSessionPinhole::\nepipolar_alignment(vw::ImageViewRef<vw::PixelMask<float>> left_masked_image,\n                   vw::ImageViewRef<vw::PixelMask<float>> right_masked_image,\n                   vw::ValueEdgeExtension<vw::PixelMask<float>> ext_nodata,\n                   // Outputs\n                   vw::ImageViewRef<vw::PixelMask<float>> & Limg, \n                   vw::ImageViewRef<vw::PixelMask<float>> & Rimg) {\n\n  // Load the two images and fetch the two camera models\n  boost::shared_ptr<camera::CameraModel> left_cam, right_cam;\n\n  std::string lcase_file = boost::to_lower_copy(m_left_camera_file);\n  if (boost::ends_with(lcase_file, \".pinhole\") || boost::ends_with(lcase_file, \".tsai\")) {\n      \n    // This loads epipolar-aligned camera models.\n    // - The out sizes incorporate the crop amount if any, the camera models \n    Vector2i left_out_size, right_out_size;\n    load_camera_models(left_cam, right_cam, left_out_size, right_out_size);\n      \n    // Get the input image crop regions, if any.\n    BBox2i left_image_in_roi, right_image_in_roi;\n    get_input_image_crops(left_image_in_roi, right_image_in_roi);\n\n    // Write out the camera models used to generate the aligned images.\n    // - Currently this won't work if we used .adjust files from bundle_adjust.\n    PinholeModel* left_pin_model  = dynamic_cast<PinholeModel*>(left_cam.get ());\n    PinholeModel* right_pin_model = dynamic_cast<PinholeModel*>(right_cam.get());\n    if (left_pin_model)\n      left_pin_model->write(m_out_prefix + \"-L.tsai\");\n    if (right_pin_model)\n      right_pin_model->write(m_out_prefix + \"-R.tsai\");\n\n    // Transform the input images to be as if they were captured by the\n    //  epipolar-aligned camera models, aligning the two images.\n    epipolar_transformed_images(m_left_camera_file, m_right_camera_file,\n                                left_cam, right_cam,\n                                left_masked_image, right_masked_image,\n                                left_image_in_roi, right_image_in_roi,\n                                left_out_size, right_out_size,\n                                Limg, Rimg,\n                                ext_nodata);\n\n  } else { // Handle CAHV derived models\n    camera_models(left_cam, right_cam);\n    epipolar_transformed_cahv_images(m_left_camera_file, m_right_camera_file,\n                                    left_cam, right_cam,\n                                    left_masked_image, right_masked_image,\n                                    Limg, Rimg, ext_nodata);\n  }\n}\n\nvoid StereoSessionPinhole::get_unaligned_camera_models(\n                                 boost::shared_ptr<vw::camera::CameraModel> &left_cam,\n                                 boost::shared_ptr<vw::camera::CameraModel> &right_cam,\n                                 std::string ba_prefix) const{\n\n  // Retrieve the pixel offset (if any) to cropped images\n  vw::Vector2 left_pixel_offset\n   = camera_pixel_offset(isMapProjected(), m_left_image_file, m_right_image_file, \n                         m_left_image_file);\n  vw::Vector2 right_pixel_offset\n     = camera_pixel_offset(isMapProjected(), m_left_image_file, m_right_image_file, \n                           m_right_image_file);\n\n  // Load the camera models adjusted for cropping\n  \n  left_cam  = load_adjusted_model(vw::camera::load_pinhole_camera_model(m_left_camera_file),\n                                  m_left_image_file, m_left_camera_file, ba_prefix, left_pixel_offset);\n  right_cam = load_adjusted_model(vw::camera::load_pinhole_camera_model(m_right_camera_file),\n                                  m_right_image_file, m_right_camera_file, ba_prefix, right_pixel_offset);\n}\n\n\nvoid StereoSessionPinhole::camera_models(boost::shared_ptr<vw::camera::CameraModel> &cam1,\n                                         boost::shared_ptr<vw::camera::CameraModel> &cam2) {\n  vw::Vector2i left_out_size, right_out_size;\n  load_camera_models(cam1, cam2, left_out_size, right_out_size);\n}\n\nvoid StereoSessionPinhole::load_camera_models(\n                   boost::shared_ptr<vw::camera::CameraModel> &left_cam,\n                   boost::shared_ptr<vw::camera::CameraModel> &right_cam,\n                   Vector2i &left_out_size, Vector2i &right_out_size) {\n\n  std::string lcase_file = boost::to_lower_copy(m_left_camera_file);\n  if ( (stereo_settings().alignment_method != \"epipolar\") ||\n       ( !boost::ends_with(lcase_file, \".pinhole\") &&\n         !boost::ends_with(lcase_file, \".tsai\"   )   ) ) {\n    // Non-PinholeModel and non-epipolar case, just use the simpler handling method\n    // and leave the sizes unset, they won't be used.\n    left_cam  = camera_model(m_left_image_file,  m_left_camera_file );\n    right_cam = camera_model(m_right_image_file, m_right_camera_file);\n    return;\n  }\n\n  // The case of epipolar alignment is more complicated. The camera models\n  // returned do not include a crop offset, but the aligned camera\n  // models have been shifted so that they are aligned after the crop\n  // has been applied.\n\n  PinholeModel left_pin (m_left_camera_file );\n  PinholeModel right_pin(m_right_camera_file);\n\n  // Create epipolar rectified camera views\n  boost::shared_ptr<PinholeModel> epipolar_left_pin (new PinholeModel);\n  boost::shared_ptr<PinholeModel> epipolar_right_pin(new PinholeModel);\n  epipolar(left_pin,  right_pin, *epipolar_left_pin, *epipolar_right_pin);\n\n  // Get the input image crop regions, if any.\n  BBox2i left_bbox, right_bbox;\n  get_input_image_crops(left_bbox, right_bbox);\n\n  // Shift the epipolar cameras to line up with the top left corner of the image and also\n  //  get the pixel sizes of -L.tif and -R.tif.\n  // - These camera model still represent the entire image as if no cropping occurred.\n  resize_epipolar_cameras_to_fit(left_pin, right_pin,\n                                 *(epipolar_left_pin.get()), *(epipolar_right_pin.get()),\n                                 left_bbox, right_bbox, left_out_size, right_out_size);\n\n  // The pinhole epipolar case is incompatible with adjustment files so they are not loaded.\n  left_cam  = epipolar_left_pin;\n  right_cam = epipolar_right_pin;\n}\n\n// Return the left transform used in alignment\nvw::TransformPtr StereoSessionPinhole::tx_left() const {\n  \n  // TODO(oalexan1): Find a relevant test case then wipe the commented-out logic\n  // below.\n  \n  // A very annoying feature of epipolar alignment is that the cameras\n  // returned in this mode already have alignment applied to them.\n  // See StereoSessionPinhole::load_camera_models() above.\n  \n  // Then, the alignment need not happen in here, so we always return\n  // tx_left_homography(), even though for epipolar alignment that\n  // becomes the identity matrix instead of the expected alignment\n  // transform.\n\n  // It has to be that way since the cameras are aligned. Otherwise,\n  // since triangulation is done with aligned cameras, if tx_left()\n  // would return unaligned pixels, the results end up wrong.\n  \n  // That was likely a clever optimization, but it wreaks havoc with\n  // usual conventions.  It also results in having two camera loaders,\n  // namely camera_models() and get_unaligned_camera_models().\n\n  // All this must be wiped and one must go back to the normal way of\n  // doing things consistent with the other modes.  It would require\n  // very careful understanding of the many camera loading functions\n  // in this class, which have repeated logic, and how they deal with\n  // alignment and crop windows. Lots of work.\n\n  // So, for now leave things so that this class is consistent with\n  // itself for epipolar alignment, and the produced triangulated \n  // point cloud is correct, even though that is not consistent\n  // with the usual way of doing things.\n  \n  //if (stereo_settings().alignment_method != \"epipolar\")\n  return StereoSession::tx_left_homography(); // see above\n\n  // Comment out the logic below, per the text above.\n  // TODO(oalexan1): Figure out if things can work without casting\n  // away the const.\n  //vw::TransformPtr trans_left, trans_right;\n  //((StereoSessionPinhole*)this)->pinhole_cam_trans(trans_left, trans_right);\n  //return trans_left;\n}\n\n// Return the right transform used in alignment\nvw::TransformPtr StereoSessionPinhole::tx_right() const {\n\n  //if (stereo_settings().alignment_method != \"epipolar\")\n  return StereoSession::tx_right_homography(); // see above\n\n  // See the lengthy rant in tx_left() above.\n  // TODO(oalexan1): Figure out if things can work without casting\n  // away the const.\n  //vw::TransformPtr trans_left, trans_right;\n  //((StereoSessionPinhole*)this)->pinhole_cam_trans(trans_left, trans_right);\n  //return trans_right;\n}\n\nvoid StereoSessionPinhole::pinhole_cam_trans(vw::TransformPtr & left_trans,\n                                             vw::TransformPtr & right_trans) {\n\n  // Load the epipolar aligned camera models\n  boost::shared_ptr<camera::CameraModel> left_aligned_model, right_aligned_model;\n\n  // TODO(oalexan1): Models must be loaded by now, presumably. Then\n  // pinhole_cam_trans can be const, and we don't to cast away the const in tx_left()\n  // and tx_right() above.\n  this->camera_models(left_aligned_model, right_aligned_model);\n  \n  boost::shared_ptr<camera::CameraModel> left_input_model, right_input_model;\n  std::string ba_prefix = asp::stereo_settings().bundle_adjust_prefix;\n  this->get_unaligned_camera_models(left_input_model, right_input_model, ba_prefix);\n\n  // Check the type, CAHV* type models are not supported!\n  typedef vw::camera::PinholeModel PinModel;\n  PinModel* left_in_ptr = dynamic_cast<PinModel*>(&(*left_input_model));\n  if (!left_in_ptr)\n    vw_throw(NoImplErr() << \"Detected CAHV-type cameras. Use an alignment \"\n             << \"method different than 'epipolar'.\\n\" );\n\n  // Set up transform objects\n  left_trans.reset (new PinholeCamTrans(*dynamic_cast<PinModel*>(&(*left_input_model)),\n                                        *dynamic_cast<PinModel*>(&(*left_aligned_model))));\n  right_trans.reset(new PinholeCamTrans(*dynamic_cast<PinModel*>(&(*right_input_model)),\n                                        *dynamic_cast<PinModel*>(&(*right_aligned_model))));\n}\n\n} // end namespace asp\n\n"
  },
  {
    "path": "src/asp/Sessions/StereoSessionPinhole.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n/// \\file StereoSessionPinhole.h\n///\n\n#ifndef __STEREO_SESSION_PINHOLE_H__\n#define __STEREO_SESSION_PINHOLE_H__\n\n#include <asp/Sessions/StereoSession.h>\n#include <vw/Camera/CameraTransform.h>\n#include <vw/Camera/PinholeModel.h>\n\nnamespace asp {\n\n// Pinhole camera model loading function which handles the case of epipolar alignment.\nvw::CamPtr load_adj_pinhole_model(std::string const& image_file,      \n                                  std::string const& camera_file,\n                                  std::string const& left_image_file,\n                                  std::string const& right_image_file,\n                                  std::string const& left_camera_file, \n                                  std::string const& right_camera_file,\n                                  std::string const& ba_prefix, \n                                  bool isMapProjected);\n\n  typedef vw::camera::CameraTransform<vw::camera::PinholeModel, vw::camera::PinholeModel> PinholeCamTrans;\n  typedef boost::shared_ptr<PinholeCamTrans> PinholeCamTransPtr;\n\n class StereoSessionPinhole: public StereoSession {\n  public:\n    StereoSessionPinhole() {}\n    virtual ~StereoSessionPinhole() {}\n\n    virtual std::string name() const { return \"pinhole\"; }\n\n    // The pinhole session is used with rovers and other non-satellite cameras,\n    // so there is no datum, unless explicitly provided.\n    virtual bool have_datum() const;\n\n    static SessionPtr construct() { return SessionPtr(new StereoSessionPinhole); }\n\n\n    /// Override this function to make sure it properly generates the\n    ///  aligned camera models.\n    virtual void camera_models(boost::shared_ptr<vw::camera::CameraModel> &cam1,\n                               boost::shared_ptr<vw::camera::CameraModel> &cam2);\n\n    /// Specialized function to load both camera models and find their output sizes\n    void load_camera_models(boost::shared_ptr<vw::camera::CameraModel> &left_cam,\n                            boost::shared_ptr<vw::camera::CameraModel> &right_cam,\n                            vw::Vector2i &left_out_size, vw::Vector2i &right_out_size);\n\n    /// Return the input camera models with no alignment applied.\n    /// - This only matters in the epipolar alignment case, where the normal camera model\n    ///   functions return the aligned camera models.\n    void get_unaligned_camera_models(boost::shared_ptr<vw::camera::CameraModel> &left_cam,\n                                     boost::shared_ptr<vw::camera::CameraModel> &right_cam,\n                                     std::string ba_prefix) const;\n\n\n    /// Transforms from the aligned image coordinates back to coordinates in the camera models.\n    /// - Note that for epipolar aligned images these return identity transforms since the \n    ///   epipolar aligned images are consisted with the (new epipolar) camera models returned\n    ///   from this class.\n    virtual vw::TransformPtr tx_left () const;\n    virtual vw::TransformPtr tx_right() const;\n\n    /// Get the transforms from the unaligned input images to the epipolar aligned images.\n    /// - CAHV* type models are not currently supported!\n    void pinhole_cam_trans(vw::TransformPtr & left_trans, vw::TransformPtr & right_trans);\n    \n  protected:\n    /// Function to load a camera model of the particular type.\n   virtual boost::shared_ptr<vw::camera::CameraModel>\n   load_camera_model(std::string const& image_file, \n                     std::string const& camera_file,\n                     std::string const& ba_prefix, \n                     vw::Vector2 pixel_offset) const;\n\n   // Apply epipolar alignment to images, if the camera models are pinhole\n   virtual void epipolar_alignment(vw::ImageViewRef<vw::PixelMask<float>> left_masked_image,\n                                   vw::ImageViewRef<vw::PixelMask<float>> right_masked_image,\n                                   vw::ValueEdgeExtension<vw::PixelMask<float>> ext_nodata,\n                                   // Outputs\n                                   vw::ImageViewRef<vw::PixelMask<float>> & Limg, \n                                   vw::ImageViewRef<vw::PixelMask<float>> & Rimg);\n };\n\n}\n\n#endif // __STEREO_SESSION_PINHOLE_H__\n"
  },
  {
    "path": "src/asp/Sessions/StereoSessionRPC.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n/// \\file StereoSessionRPC.h\n///\n\n#ifndef __STEREO_SESSION_RPC_H__\n#define __STEREO_SESSION_RPC_H__\n\n#include <asp/Camera/RPCStereoModel.h>\n#include <asp/Sessions/StereoSessionGdal.h>\n\nnamespace asp {\n\n  /// Derived StereoSession class using the RPC camera model.\n  class StereoSessionRPC: public StereoSessionGdal {\n  public:\n\n    StereoSessionRPC(){};\n    virtual ~StereoSessionRPC(){};\n\n    virtual std::string name() const { return \"rpc\"; }\n\n    /// Simple factory function.\n    static SessionPtr construct() { return SessionPtr(new StereoSessionRPC); }\n\n    /// Returns the target datum to use for a given camera model.\n    virtual vw::cartography::Datum get_datum(const vw::camera::CameraModel* cam,\n                                             bool use_sphere_for_non_earth) const {\n      const asp::RPCModel *rpc_cam\n        = dynamic_cast<const asp::RPCModel*>(vw::camera::unadjusted_model(cam));\n      if (rpc_cam == NULL) \n        vw::vw_throw(vw::ArgumentErr() << \"Could not get an RPC camera model as expected.\");\n      \n      // The RPC model knows its datum\n      return rpc_cam->datum();\n    }\n    \n  protected:\n    /// Function to load a camera model of the particular type.\n    virtual boost::shared_ptr<vw::camera::CameraModel>\n    load_camera_model(std::string const& image_file, \n                      std::string const& camera_file,\n                      std::string const& ba_prefix, \n                      vw::Vector2 pixel_offset) const {\n      return load_rpc_camera_model(image_file, camera_file, ba_prefix,\n                                   pixel_offset);\n    }\n  }; // End class StereoSessionRPC\n\n} // namespace asp\n\n#endif // __STEREO_SESSION_RPC_H__\n"
  },
  {
    "path": "src/asp/Sessions/tests/TestInstantiation.cxx",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n#include <asp/Sessions/StereoSessionGdal.h>\n#include <asp/Sessions/StereoSessionMapProj.h>\n#include <asp/Sessions/StereoSessionRPC.h>\n#include <asp/Sessions/StereoSessionIsis.h>\n#include <asp/Sessions/StereoSessionPinhole.h>\n#include <asp/Sessions/StereoSessionNadirPinhole.h>\n#include <asp/asp_config.h>\n\n#include <test/Helpers.h>\n\nusing namespace vw;\nusing namespace asp;\n\n// This is to make sure the developers provide types for their\n// sessions. The test is to see if this even compiles. Not if it\n// runs. (It doesn't)\ntemplate <typename T>\nclass InstantiationTest : public ::testing::Test {\npublic:\n  typedef T SessionT;\n\n  InstantiationTest() {}\n\n  virtual void SetUp() {}\n\n  SessionT session;\n};\n\ntypedef ::testing::Types<StereoSessionDG, StereoSessionDGMapRPC, StereoSessionRPC,\n#if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1\n                         StereoSessionIsis,\n#endif\n                         StereoSessionPinhole, StereoSessionNadirPinhole> SessionTypes;\nTYPED_TEST_CASE( InstantiationTest, SessionTypes );\n\nTYPED_TEST( InstantiationTest, Typedefs ) {\n  try {\n    // Verify object for left transform\n    vw::TransformPtr left_tx =\n      this->session.tx_left();\n    // Verify object for right transform\n    vw::TransformPtr right_tx =\n      this->session.tx_right();\n  } catch ( const vw::Exception& e ) {}\n}\n\nTEST( Instantiation, Names ) {\n  std::vector<StereoSession*> sessions;\n  vw::GdalWriteOptions opt;\n  sessions.push_back( StereoSessionDG::construct() );\n  sessions.push_back( StereoSessionDGMapRPC::construct() );\n  sessions.push_back( StereoSessionRPC::construct() );\n#if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1\n  sessions.push_back( StereoSessionIsis::construct() );\n#endif\n  sessions.push_back( StereoSessionPinhole::construct() );\n  sessions.push_back( StereoSessionNadirPinhole::construct() );\n\n  for ( size_t i = 0; i < sessions.size(); i++ ) {\n    EXPECT_TRUE( sessions[i] );\n  }\n\n  std::set<std::string> names;\n  for ( size_t i = 0; i < sessions.size(); i++ ) {\n    EXPECT_EQ( names.end(), names.find( sessions[i]->name() ) );\n    names.insert( sessions[i]->name() );\n  }\n  EXPECT_EQ( names.size(), sessions.size() );\n\n  for ( size_t i = 0; i < sessions.size(); i++ ) {\n    delete sessions[i];\n  }\n}\n"
  },
  {
    "path": "src/asp/Sessions/tests/TestStereoSessionASTER.cxx",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n#include <asp/Sessions/StereoSessionASTER.h>\n#include <asp/Camera/XMLBase.h>\n#include <asp/Camera/ASTER_XML.h>\n#include <boost/shared_ptr.hpp>\n#include <test/Helpers.h>\n\n#include <vw/Stereo/StereoModel.h>\n\n#include <vw/Cartography/GeoTransform.h>\n\nusing namespace vw;\nusing namespace asp;\nusing namespace xercesc;\nusing namespace vw::test;\n\n//TODO: Run tests!\n\n\n/*\nTEST(StereoSessionAster, CreateCamera) {\n  StereoSessionDG session;\n\n  boost::shared_ptr<camera::CameraModel> cam1( session.camera_model(\"\", \"dg_example1.xml\") ),\n    cam2( session.camera_model(\"\", \"dg_example2.xml\") );\n  ASSERT_TRUE( cam1.get() != 0 );\n  ASSERT_TRUE( cam2.get() != 0 );\n\n  Vector2 m1(13864, 5351), m2(15045, 5183);\n  m1 *= 2; m2 *= 2;\n\n  stereo::StereoModel sm(cam1.get(), cam2.get());\n  double error;\n  Vector3 pos = sm(m1,m2,error);\n  EXPECT_LT( error, 5.0 ); // Triangulation should be better than 5 meters.\n  EXPECT_LT( norm_2(pos), norm_2(cam1->camera_center(m1)) ); // Point should be below camera.\n\n  // Verify that projection back into the camera hits the right\n  // spot. It will slightly be wrong due to the above triangulation error.\n#if __GNUC__\n#if __x86_64__ || __ppc64__\n  EXPECT_VECTOR_NEAR( m1, cam1->point_to_pixel( pos ), 4 );\n  EXPECT_VECTOR_NEAR( m2, cam2->point_to_pixel( pos ), 4 );\n#else\n  EXPECT_VECTOR_NEAR( m1, cam1->point_to_pixel( pos ), 9 );\n  EXPECT_VECTOR_NEAR( m2, cam2->point_to_pixel( pos ), 25 );\n#endif\n#endif\n\n  // A more accurate test is just to project out and back into the same camera\n  for ( size_t i = 0; i < 30000; i += 500 ) {\n    for ( size_t j = 0; j < 24000; j += 500 ) {\n      EXPECT_VECTOR_NEAR( Vector2(i,j),\n                          cam1->point_to_pixel( cam1->camera_center(Vector2(i,j)) +\n                                                2e4 * cam1->pixel_to_vector( Vector2(i,j) ) ),\n                          1e-1 / *pixels* /);\n    }\n  }\n\n  // Create a camera that only has a single TLC entry. It will throw\n  // an error in the event that first line time and TLC entry lookup\n  // don't agree. That should be good enough for a test.\n  EXPECT_NO_THROW( boost::shared_ptr<camera::CameraModel> cam3( session.camera_model(\"\", \"dg_example3.xml\") ) );\n}\n\n\nTEST(StereoSessionDG, ProjectRPC) {\n  XMLPlatformUtils::Initialize();\n\n  // Read the RPC\n  RPCXML xml;\n  xml.read_from_file( \"dg_example1.xml\" );\n  boost::shared_ptr<RPCModel> rpc_model( new RPCModel(*xml.rpc_ptr()) );\n\n  // Read the Digital Globe camera model\n  StereoSessionDG session;\n  boost::shared_ptr<camera::CameraModel> dg_model( session.camera_model(\"\", \"dg_example1.xml\") );\n\n  // Verify the measurement between the two cameras\n  cartography::Datum datum(\"WGS84\");\n  // This should be 0,0\n  Vector3 xyz = datum.geodetic_to_cartesian( Vector3(-105.42399,39.833107,2595.9) );\n  EXPECT_VECTOR_NEAR( rpc_model->point_to_pixel( xyz ),\n                      dg_model->point_to_pixel( xyz ), 25 );\n  // This should be 35170, 0\n  xyz = datum.geodetic_to_cartesian( Vector3(-105.35823,39.842179,2441.3) );\n  EXPECT_VECTOR_NEAR( rpc_model->point_to_pixel( xyz ),\n                      dg_model->point_to_pixel( xyz ), 25 );\n  // This should be 35170, 23708\n  xyz = datum.geodetic_to_cartesian( Vector3(-105.35795,39.803541,2612.6) );\n  EXPECT_VECTOR_NEAR( rpc_model->point_to_pixel( xyz ),\n                      dg_model->point_to_pixel( xyz ), 25 );\n  // This should be 0, 23708\n  xyz = datum.geodetic_to_cartesian( Vector3(-105.42418,39.793464,2801.8) );\n  EXPECT_VECTOR_NEAR( rpc_model->point_to_pixel( xyz ),\n                      dg_model->point_to_pixel( xyz ), 25 );\n}\n\n*/\n"
  },
  {
    "path": "src/asp/Sessions/tests/TestStereoSessionDG.cxx",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n#include <asp/Sessions/StereoSessionGdal.h>\n#include <asp/Camera/XMLBase.h>\n#include <asp/Camera/RPC_XML.h>\n#include <asp/Camera/RPCModel.h>\n#include <boost/shared_ptr.hpp>\n#include <test/Helpers.h>\n\n#include <vw/Stereo/StereoModel.h>\n\n#include <vw/Cartography/GeoTransform.h>\n\nusing namespace vw;\nusing namespace asp;\nusing namespace xercesc;\nusing namespace vw::test;\n\n\nTEST(StereoSessionDG, CreateCamera) {\n  StereoSessionDG session;\n\n  boost::shared_ptr<camera::CameraModel> cam1( session.camera_model(\"\", \"dg_example1.xml\") ),\n    cam2( session.camera_model(\"\", \"dg_example2.xml\") );\n  ASSERT_TRUE( cam1.get() != 0 );\n  ASSERT_TRUE( cam2.get() != 0 );\n\n  Vector2 m1(13864, 5351), m2(15045, 5183);\n  m1 *= 2; m2 *= 2;\n\n  stereo::StereoModel sm(cam1.get(), cam2.get());\n  double error;\n  Vector3 pos = sm(m1,m2,error);\n  EXPECT_LT( error, 5.0 ); // Triangulation should be better than 5 meters.\n  EXPECT_LT( norm_2(pos), norm_2(cam1->camera_center(m1)) ); // Point should be below camera.\n\n  // Verify that projection back into the camera hits the right\n  // spot. It will slightly be wrong due to the above triangulation error.\n#if __GNUC__\n#if __x86_64__ || __ppc64__\n  EXPECT_VECTOR_NEAR( m1, cam1->point_to_pixel( pos ), 4 );\n  EXPECT_VECTOR_NEAR( m2, cam2->point_to_pixel( pos ), 4 );\n#else\n  EXPECT_VECTOR_NEAR( m1, cam1->point_to_pixel( pos ), 9 );\n  EXPECT_VECTOR_NEAR( m2, cam2->point_to_pixel( pos ), 25 );\n#endif\n#endif\n\n  // A more accurate test is just to project out and back into the same camera\n  for ( size_t i = 0; i < 30000; i += 500 ) {\n    for ( size_t j = 0; j < 24000; j += 500 ) {\n      EXPECT_VECTOR_NEAR( Vector2(i,j),\n                          cam1->point_to_pixel( cam1->camera_center(Vector2(i,j)) +\n                                                2e4 * cam1->pixel_to_vector( Vector2(i,j) ) ),\n                          1e-1 /*pixels*/);\n    }\n  }\n\n  // Create a camera that only has a single TLC entry. It will throw\n  // an error in the event that first line time and TLC entry lookup\n  // don't agree. That should be good enough for a test.\n  EXPECT_NO_THROW( boost::shared_ptr<camera::CameraModel> cam3( session.camera_model(\"\", \"dg_example3.xml\") ) );\n}\n\n\nTEST(StereoSessionDG, ProjectRPC) {\n  XMLPlatformUtils::Initialize();\n\n  // Read the RPC\n  RPCXML xml;\n  xml.read_from_file( \"dg_example1.xml\" );\n  boost::shared_ptr<RPCModel> rpc_model( new RPCModel(*xml.rpc_ptr()) );\n\n  // Read the Digital Globe camera model\n  StereoSessionDG session;\n  boost::shared_ptr<camera::CameraModel> dg_model( session.camera_model(\"\", \"dg_example1.xml\") );\n\n  // Verify the measurement between the two cameras\n  cartography::Datum datum(\"WGS84\");\n  // This should be 0,0\n  Vector3 xyz = datum.geodetic_to_cartesian( Vector3(-105.42399,39.833107,2595.9) );\n  EXPECT_VECTOR_NEAR( rpc_model->point_to_pixel( xyz ),\n                      dg_model->point_to_pixel( xyz ), 25 );\n  // This should be 35170, 0\n  xyz = datum.geodetic_to_cartesian( Vector3(-105.35823,39.842179,2441.3) );\n  EXPECT_VECTOR_NEAR( rpc_model->point_to_pixel( xyz ),\n                      dg_model->point_to_pixel( xyz ), 25 );\n  // This should be 35170, 23708\n  xyz = datum.geodetic_to_cartesian( Vector3(-105.35795,39.803541,2612.6) );\n  EXPECT_VECTOR_NEAR( rpc_model->point_to_pixel( xyz ),\n                      dg_model->point_to_pixel( xyz ), 25 );\n  // This should be 0, 23708\n  xyz = datum.geodetic_to_cartesian( Vector3(-105.42418,39.793464,2801.8) );\n  EXPECT_VECTOR_NEAR( rpc_model->point_to_pixel( xyz ),\n                      dg_model->point_to_pixel( xyz ), 25 );\n}\n"
  },
  {
    "path": "src/asp/Sessions/tests/TestStereoSessionDGMapRPC.cxx",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n#include <asp/Sessions/StereoSessionMapProj.h>\n#include <asp/Camera/RPC_XML.h>\n#include <asp/Camera/RPCModel.h>\n#include <boost/shared_ptr.hpp>\n#include <test/Helpers.h>\n\n#include <vw/Stereo/StereoModel.h>\n#include <vw/Cartography/GeoReferenceUtils.h>\n\nusing namespace vw;\nusing namespace asp;\nusing namespace vw::test;\n\nTEST(StereoSessionDGMapRPC, TransformCycle) {\n  // Generate GeoReference projection that matches something that the\n  // RPC models in dg_example1 and dg_example4 see.\n  cartography::GeoReference lowres_georef; // WGS84\n  lowres_georef.set_equirectangular( 37.745, -103.29, 37 );\n  Matrix<double> tx = math::identity_matrix<3>();\n  tx(0,0) = tx(1,1) = 500;\n  tx(0,2) = tx(1,2) = -1000;\n  lowres_georef.set_transform( tx );\n\n  // Make low res images. We have to overcrop, otherwise the bicubic\n  // interpolation of the DEM will have edge effects.\n  cartography::GeoReference lowres_overcrop_georef = lowres_georef;\n  tx(0,2) = tx(1,2) = -2000;\n  lowres_overcrop_georef.set_transform( tx );\n  ImageView<float> lowres_overcrop_image(8,8);\n  double dem_height = 2287; // Average height of this area\n  fill( lowres_overcrop_image, dem_height );\n  UnlinkName lowres_dem_name( \"lowres_dem.tif\" );\n  write_gdal_image(lowres_dem_name, lowres_overcrop_image, lowres_overcrop_georef, GdalWriteOptions());\n\n  // Make hires images\n  cartography::GeoReference hires_georef = lowres_georef;\n  tx(0,0) = tx(1,1) = 100;\n  tx(0,2) = tx(1,2) = -1000;\n  hires_georef.set_transform( tx );\n  ImageView<float> hires_image(20,20);\n  fill( hires_image, 1 );\n  ImageView<float> lowres_image(4,4);\n  fill( lowres_image, 2 );\n  UnlinkName left_image_name(\"faked_left.tif\"), right_image_name(\"faked_right.tif\");\n  write_gdal_image(left_image_name, lowres_image, lowres_georef, GdalWriteOptions());\n  write_gdal_image(right_image_name, hires_image, hires_georef, GdalWriteOptions());\n\n  // Create session\n  vw::GdalWriteOptions opt;\n  StereoSessionDGMapRPC session;\n  session.initialize( opt, left_image_name, right_image_name,\n                      \"dg_example1.xml\", \"dg_example4.xml\",\n                      \"debug/debug\", lowres_dem_name);\n  RPCXML left_xml, right_xml;\n  left_xml.read_from_file( \"dg_example1.xml\" );\n  right_xml.read_from_file( \"dg_example4.xml\" );\n  vw::TransformPtr left_tx = session.tx_left();\n  vw::TransformPtr right_tx = session.tx_right();\n  cartography::Datum datum;\n\n  // Verify that LX matches what we got by hand.\n  for ( size_t j = 0; j < 4; j++ ) {\n    for ( size_t i = 0; i < 4; i++ ) {\n      Vector3 lonlatheight;\n      subvector(lonlatheight,0,2) = lowres_georef.pixel_to_lonlat( Vector2(i,j) );\n      lonlatheight.z() = dem_height;\n      Vector3 xyz = datum.geodetic_to_cartesian( lonlatheight );\n      EXPECT_VECTOR_NEAR( left_xml.rpc_ptr()->point_to_pixel( xyz ),\n                          left_tx->reverse( Vector2(i,j) ), 1e-1 );\n    }\n  }\n\n  // Verify that RX matches what we got by hand\n  for ( size_t j = 0; j < 20; j++ ) {\n    for ( size_t i = 0; i < 20; i++ ) {\n      Vector3 lonlatheight;\n      subvector(lonlatheight,0,2) = hires_georef.pixel_to_lonlat( Vector2(i,j) );\n      lonlatheight.z() = dem_height;\n      Vector3 xyz = datum.geodetic_to_cartesian( lonlatheight );\n      EXPECT_VECTOR_NEAR( right_xml.rpc_ptr()->point_to_pixel( xyz ),\n                          right_tx->reverse( Vector2(i,j) ), 1e-1 );\n    }\n  }\n}\n"
  },
  {
    "path": "src/asp/Sessions/tests/TestStereoSessionRPC.cxx",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n#include <asp/Sessions/StereoSessionRPC.h>\n#include <asp/Camera/RPCModel.h>\n#include <asp/Camera/RPCStereoModel.h>\n#include <asp/Camera/RPC_XML.h>\n#include <test/Helpers.h>\n\nusing namespace vw;\nusing namespace asp;\nusing namespace xercesc;\n\n// Placeholder test for when we have a real test case\nTEST( StereoSessionRPC, Dummy ) {\n  EXPECT_TRUE(true);\n}\n\n\n"
  },
  {
    "path": "src/asp/Sessions/tests/TestStereoSessionSpot.cxx",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n#include <asp/Sessions/StereoSessionGdal.h>\n#include <asp/Camera/XMLBase.h>\n#include <asp/Camera/SPOT_XML.h>\n#include <boost/shared_ptr.hpp>\n#include <test/Helpers.h>\n\n#include <vw/Stereo/StereoModel.h>\n\n#include <vw/Cartography/GeoTransform.h>\n\nusing namespace vw;\nusing namespace asp;\nusing namespace xercesc;\nusing namespace vw::test;\n\n//TODO: Run tests!\n\n\n/*\nTEST(StereoSessionSpot, CreateCamera) {\n  StereoSessionDG session;\n\n  boost::shared_ptr<camera::CameraModel> cam1( session.camera_model(\"\", \"dg_example1.xml\") ),\n    cam2( session.camera_model(\"\", \"dg_example2.xml\") );\n  ASSERT_TRUE( cam1.get() != 0 );\n  ASSERT_TRUE( cam2.get() != 0 );\n\n  Vector2 m1(13864, 5351), m2(15045, 5183);\n  m1 *= 2; m2 *= 2;\n\n  stereo::StereoModel sm(cam1.get(), cam2.get());\n  double error;\n  Vector3 pos = sm(m1,m2,error);\n  EXPECT_LT( error, 5.0 ); // Triangulation should be better than 5 meters.\n  EXPECT_LT( norm_2(pos), norm_2(cam1->camera_center(m1)) ); // Point should be below camera.\n\n  // Verify that projection back into the camera hits the right\n  // spot. It will slightly be wrong due to the above triangulation error.\n#if __GNUC__\n#if __x86_64__ || __ppc64__\n  EXPECT_VECTOR_NEAR( m1, cam1->point_to_pixel( pos ), 4 );\n  EXPECT_VECTOR_NEAR( m2, cam2->point_to_pixel( pos ), 4 );\n#else\n  EXPECT_VECTOR_NEAR( m1, cam1->point_to_pixel( pos ), 9 );\n  EXPECT_VECTOR_NEAR( m2, cam2->point_to_pixel( pos ), 25 );\n#endif\n#endif\n\n  // A more accurate test is just to project out and back into the same camera\n  for ( size_t i = 0; i < 30000; i += 500 ) {\n    for ( size_t j = 0; j < 24000; j += 500 ) {\n      EXPECT_VECTOR_NEAR( Vector2(i,j),\n                          cam1->point_to_pixel( cam1->camera_center(Vector2(i,j)) +\n                                                2e4 * cam1->pixel_to_vector( Vector2(i,j) ) ),\n                          1e-1 / *pixels* /);\n    }\n  }\n\n  // Create a camera that only has a single TLC entry. It will throw\n  // an error in the event that first line time and TLC entry lookup\n  // don't agree. That should be good enough for a test.\n  EXPECT_NO_THROW( boost::shared_ptr<camera::CameraModel> cam3( session.camera_model(\"\", \"dg_example3.xml\") ) );\n}\n\n\nTEST(StereoSessionDG, ProjectRPC) {\n  XMLPlatformUtils::Initialize();\n\n  // Read the RPC\n  RPCXML xml;\n  xml.read_from_file( \"dg_example1.xml\" );\n  boost::shared_ptr<RPCModel> rpc_model( new RPCModel(*xml.rpc_ptr()) );\n\n  // Read the Digital Globe camera model\n  StereoSessionDG session;\n  boost::shared_ptr<camera::CameraModel> dg_model( session.camera_model(\"\", \"dg_example1.xml\") );\n\n  // Verify the measurement between the two cameras\n  cartography::Datum datum(\"WGS84\");\n  // This should be 0,0\n  Vector3 xyz = datum.geodetic_to_cartesian( Vector3(-105.42399,39.833107,2595.9) );\n  EXPECT_VECTOR_NEAR( rpc_model->point_to_pixel( xyz ),\n                      dg_model->point_to_pixel( xyz ), 25 );\n  // This should be 35170, 0\n  xyz = datum.geodetic_to_cartesian( Vector3(-105.35823,39.842179,2441.3) );\n  EXPECT_VECTOR_NEAR( rpc_model->point_to_pixel( xyz ),\n                      dg_model->point_to_pixel( xyz ), 25 );\n  // This should be 35170, 23708\n  xyz = datum.geodetic_to_cartesian( Vector3(-105.35795,39.803541,2612.6) );\n  EXPECT_VECTOR_NEAR( rpc_model->point_to_pixel( xyz ),\n                      dg_model->point_to_pixel( xyz ), 25 );\n  // This should be 0, 23708\n  xyz = datum.geodetic_to_cartesian( Vector3(-105.42418,39.793464,2801.8) );\n  EXPECT_VECTOR_NEAR( rpc_model->point_to_pixel( xyz ),\n                      dg_model->point_to_pixel( xyz ), 25 );\n}\n\n*/\n"
  },
  {
    "path": "src/asp/Sessions/tests/dg_example1.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<isd>\n\t<IMD>\n\t\t<VERSION>AA</VERSION>\n\t\t<BANDID>P</BANDID>\n\t\t<NUMROWS>23708</NUMROWS>\n\t\t<NUMCOLUMNS>35170</NUMCOLUMNS>\n\t\t<RADIOMETRICLEVEL>Corrected</RADIOMETRICLEVEL>\n\t\t<BITSPERPIXEL>16</BITSPERPIXEL>\n\t\t<COMPRESSIONTYPE>None</COMPRESSIONTYPE>\n\t\t<OUTPUTFORMAT>GeoTIFF</OUTPUTFORMAT>\n\t\t<IMAGE>\n\t\t\t<SATID>Imaginary1</SATID>\n\t\t\t<MODE>FullSwath</MODE>\n\t\t\t<SCANDIRECTION>Forward</SCANDIRECTION>\n\t\t\t<TLCTIME>1959-11-25T17:39:48.740958Z</TLCTIME>\n\t\t\t<NUMTLC>2</NUMTLC>\n\t\t\t<TLCLISTList>\n\t\t\t\t<TLCLIST>0.000000000000000e+00 0.000000000000000e+00</TLCLIST>\n\t\t\t\t<TLCLIST>2.370800000000000e+04 1.975667000000000e+00</TLCLIST>\n\t\t\t</TLCLISTList>\n\t\t\t<FIRSTLINETIME>1959-11-25T17:39:48.740958Z</FIRSTLINETIME>\n\t\t\t<AVGLINERATE>1.200000000000000e+04</AVGLINERATE>\n\t\t\t<EXPOSUREDURATION>2.666670000000000e-03</EXPOSUREDURATION>\n\t\t\t<MINCOLLECTEDROWGSD>7.290000000000000e-01</MINCOLLECTEDROWGSD>\n\t\t\t<MAXCOLLECTEDROWGSD>7.320000000000000e-01</MAXCOLLECTEDROWGSD>\n\t\t\t<MEANCOLLECTEDROWGSD>7.310000000000000e-01</MEANCOLLECTEDROWGSD>\n\t\t\t<MINCOLLECTEDCOLGSD>6.720000000000000e-01</MINCOLLECTEDCOLGSD>\n\t\t\t<MAXCOLLECTEDCOLGSD>6.720000000000000e-01</MAXCOLLECTEDCOLGSD>\n\t\t\t<MEANCOLLECTEDCOLGSD>6.720000000000000e-01</MEANCOLLECTEDCOLGSD>\n\t\t\t<MEANCOLLECTEDGSD>7.010000000000000e-01</MEANCOLLECTEDGSD>\n\t\t\t<ROWUNCERTAINTY>5.732000000000000e+01</ROWUNCERTAINTY>\n\t\t\t<COLUNCERTAINTY>3.417000000000000e+01</COLUNCERTAINTY>\n\t\t\t<MINSUNAZ>1.619000000000000e+02</MINSUNAZ>\n\t\t\t<MAXSUNAZ>1.620000000000000e+02</MAXSUNAZ>\n\t\t\t<MEANSUNAZ>1.619000000000000e+02</MEANSUNAZ>\n\t\t\t<MINSUNEL>2.750000000000000e+01</MINSUNEL>\n\t\t\t<MAXSUNEL>2.770000000000000e+01</MAXSUNEL>\n\t\t\t<MEANSUNEL>2.760000000000000e+01</MEANSUNEL>\n\t\t\t<MINSATAZ>2.660000000000000e+01</MINSATAZ>\n\t\t\t<MAXSATAZ>2.720000000000000e+01</MAXSATAZ>\n\t\t\t<MEANSATAZ>2.690000000000000e+01</MEANSATAZ>\n\t\t\t<MINSATEL>5.200000000000000e+01</MINSATEL>\n\t\t\t<MAXSATEL>5.320000000000000e+01</MAXSATEL>\n\t\t\t<MEANSATEL>5.260000000000000e+01</MEANSATEL>\n\t\t\t<MININTRACKVIEWANGLE>3.240000000000000e+01</MININTRACKVIEWANGLE>\n\t\t\t<MAXINTRACKVIEWANGLE>3.270000000000000e+01</MAXINTRACKVIEWANGLE>\n\t\t\t<MEANINTRACKVIEWANGLE>3.260000000000000e+01</MEANINTRACKVIEWANGLE>\n\t\t\t<MINCROSSTRACKVIEWANGLE>1.170000000000000e+01</MINCROSSTRACKVIEWANGLE>\n\t\t\t<MAXCROSSTRACKVIEWANGLE>1.210000000000000e+01</MAXCROSSTRACKVIEWANGLE>\n\t\t\t<MEANCROSSTRACKVIEWANGLE>1.190000000000000e+01</MEANCROSSTRACKVIEWANGLE>\n\t\t\t<MINOFFNADIRVIEWANGLE>3.440000000000000e+01</MINOFFNADIRVIEWANGLE>\n\t\t\t<MAXOFFNADIRVIEWANGLE>3.440000000000000e+01</MAXOFFNADIRVIEWANGLE>\n\t\t\t<MEANOFFNADIRVIEWANGLE>3.440000000000000e+01</MEANOFFNADIRVIEWANGLE>\n\t\t\t<PNIIRS>4.200000000000000e+00</PNIIRS>\n\t\t\t<CLOUDCOVER>0.000000000000000e+00</CLOUDCOVER>\n\t\t\t<RESAMPLINGKERNEL>CC</RESAMPLINGKERNEL>\n\t\t\t<TDILEVEL>32</TDILEVEL>\n\t\t\t<POSITIONKNOWLEDGESRC>R</POSITIONKNOWLEDGESRC>\n\t\t\t<ATTITUDEKNOWLEDGESRC>R</ATTITUDEKNOWLEDGESRC>\n\t\t</IMAGE>\n\t</IMD>\n\t<EPH>\n\t\t<SATID>Imaginary1</SATID>\n\t\t<GENERATIONTIME>1959-11-25T19:05:33.862633Z</GENERATIONTIME>\n\t\t<STARTTIME>1959-11-25T17:39:40.987511Z</STARTTIME>\n\t\t<NUMPOINTS>840</NUMPOINTS>\n\t\t<TIMEINTERVAL>2.000000000000000e-02</TIMEINTERVAL>\n\t\t<EPHEMLISTList>\n\t\t\t<EPHEMLIST>1.000000000000000e+00 -1.150529111070304e+06 -4.900037170821411e+06 4.673402253879593e+06 -2.844266339347013e+03 -4.580208925894603e+03 -5.486888667664808e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.000000000000000e+00 -1.150585995837413e+06 -4.900128772944907e+06 4.673292515863864e+06 -2.844251584254513e+03 -4.580080713915985e+03 -5.487003834508436e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.000000000000000e+00 -1.150642880303100e+06 -4.900220372492305e+06 4.673182775558697e+06 -2.844236826943937e+03 -4.579952496310532e+03 -5.487119001767498e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.000000000000000e+00 -1.150699764494275e+06 -4.900311969514028e+06 4.673073032904602e+06 -2.844222067857655e+03 -4.579824274595800e+03 -5.487234167951268e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.000000000000000e+00 -1.150756648380619e+06 -4.900403563953296e+06 4.672963287968581e+06 -2.844207307142466e+03 -4.579696052627004e+03 -5.487349329716501e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.000000000000000e+00 -1.150813531973219e+06 -4.900495155830931e+06 4.672853540726059e+06 -2.844192543983192e+03 -4.579567828490194e+03 -5.487464489059428e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.000000000000000e+00 -1.150870415294624e+06 -4.900586745189165e+06 4.672743791127197e+06 -2.844177779207410e+03 -4.579439598388071e+03 -5.487579648831945e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.000000000000000e+00 -1.150927298277373e+06 -4.900678331901664e+06 4.672634039321106e+06 -2.844163013479430e+03 -4.579311373453886e+03 -5.487694799271948e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.000000000000000e+00 -1.150984180988860e+06 -4.900769916094676e+06 4.672524285158779e+06 -2.844148245986792e+03 -4.579183142428841e+03 -5.487809950315375e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.000000000000000e+01 -1.151041063417754e+06 -4.900861497747016e+06 4.672414528665220e+06 -2.844133475840487e+03 -4.579054907747178e+03 -5.487925100296267e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.100000000000000e+01 -1.151097945507887e+06 -4.900953076753495e+06 4.672304769964599e+06 -2.844118705172034e+03 -4.578926677823406e+03 -5.488040241099258e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.200000000000000e+01 -1.151154827371495e+06 -4.901044653324357e+06 4.672195008808733e+06 -2.844103931308538e+03 -4.578798434954264e+03 -5.488155388977065e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.300000000000000e+01 -1.151211708907560e+06 -4.901136227270410e+06 4.672085245420964e+06 -2.844089156197057e+03 -4.578670195508489e+03 -5.488270529139892e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.400000000000000e+01 -1.151268590149601e+06 -4.901227798654475e+06 4.671975479727124e+06 -2.844074379018060e+03 -4.578541953612254e+03 -5.488385666949694e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.500000000000000e+01 -1.151325471075321e+06 -4.901319367434779e+06 4.671865711776550e+06 -2.844059601800196e+03 -4.578413712984060e+03 -5.488500798328534e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.600000000000000e+01 -1.151382351740661e+06 -4.901410933716147e+06 4.671755941445468e+06 -2.844044821060139e+03 -4.578285464949879e+03 -5.488615932223071e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.700000000000000e+01 -1.151439232123080e+06 -4.901502497456396e+06 4.671646168783685e+06 -2.844030037785475e+03 -4.578157213251616e+03 -5.488731065006846e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.800000000000000e+01 -1.151496112155442e+06 -4.901594058529757e+06 4.671536393939713e+06 -2.844015255598032e+03 -4.578028967718285e+03 -5.488846186690504e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.900000000000000e+01 -1.151552991938527e+06 -4.901685617125041e+06 4.671426616690597e+06 -2.844000469617523e+03 -4.577900713024012e+03 -5.488961312502534e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.000000000000000e+01 -1.151609871416160e+06 -4.901777173137079e+06 4.671316837160538e+06 -2.843985681735768e+03 -4.577772458286071e+03 -5.489076433841945e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.100000000000000e+01 -1.151666750610898e+06 -4.901868726608082e+06 4.671207055299672e+06 -2.843970892771224e+03 -4.577644199024388e+03 -5.489191554142876e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.200000000000000e+01 -1.151723629500114e+06 -4.901960277495755e+06 4.671097271157968e+06 -2.843956101303744e+03 -4.577515939868817e+03 -5.489306670116709e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.300000000000000e+01 -1.151780508061520e+06 -4.902051825758324e+06 4.670987484784760e+06 -2.843941310398315e+03 -4.577387683219245e+03 -5.489421778337507e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.400000000000000e+01 -1.151837386373473e+06 -4.902143371542585e+06 4.670877696006669e+06 -2.843926515631169e+03 -4.577259417541747e+03 -5.489536890603293e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.500000000000000e+01 -1.151894264402217e+06 -4.902234914785371e+06 4.670767904898304e+06 -2.843911718023092e+03 -4.577131148313282e+03 -5.489652001800463e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.600000000000000e+01 -1.151951142103047e+06 -4.902326455402927e+06 4.670658111558600e+06 -2.843896921042729e+03 -4.577002881675212e+03 -5.489767105143569e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.700000000000000e+01 -1.152008019509473e+06 -4.902417993458058e+06 4.670548315913371e+06 -2.843882121649303e+03 -4.576874612858939e+03 -5.489882206058975e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.800000000000000e+01 -1.152064896632588e+06 -4.902509528971580e+06 4.670438517938030e+06 -2.843867319682478e+03 -4.576746340501584e+03 -5.489997305776314e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.900000000000000e+01 -1.152121773472520e+06 -4.902601061943715e+06 4.670328717632309e+06 -2.843852516488502e+03 -4.576618063637789e+03 -5.490112404505194e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.000000000000000e+01 -1.152178649973106e+06 -4.902692592269323e+06 4.670218915120433e+06 -2.843837712704800e+03 -4.576489791849443e+03 -5.490227493822896e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.100000000000000e+01 -1.152235526246320e+06 -4.902784120158154e+06 4.670109110154591e+06 -2.843822904164006e+03 -4.576361507616246e+03 -5.490342590489337e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.200000000000000e+01 -1.152292402191408e+06 -4.902875645421492e+06 4.669999302957743e+06 -2.843808096122985e+03 -4.576233225949493e+03 -5.490457679381193e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.300000000000000e+01 -1.152349277796962e+06 -4.902967168038044e+06 4.669889493555067e+06 -2.843793286913500e+03 -4.576104949464185e+03 -5.490572759035058e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.400000000000000e+01 -1.152406153186410e+06 -4.903058688238930e+06 4.669779681673459e+06 -2.843778474140327e+03 -4.575976658274283e+03 -5.490687847413945e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.500000000000000e+01 -1.152463028269964e+06 -4.903150205856049e+06 4.669669867511555e+06 -2.843763659399241e+03 -4.575848366705903e+03 -5.490802931635549e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.600000000000000e+01 -1.152519903036292e+06 -4.903241720868234e+06 4.669560051094379e+06 -2.843748843207369e+03 -4.575720076748883e+03 -5.490918009777291e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.700000000000000e+01 -1.152576777496739e+06 -4.903333233296691e+06 4.669450232396863e+06 -2.843734026809636e+03 -4.575591785692230e+03 -5.491033083576515e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.800000000000000e+01 -1.152633651662393e+06 -4.903424743162243e+06 4.669340411394418e+06 -2.843719207983936e+03 -4.575463492932561e+03 -5.491148154551486e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.900000000000000e+01 -1.152690525544347e+06 -4.903516250485696e+06 4.669230588062446e+06 -2.843704386635668e+03 -4.575335196288773e+03 -5.491263224595757e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.000000000000000e+01 -1.152747399142728e+06 -4.903607755267271e+06 4.669120762400682e+06 -2.843689563948833e+03 -4.575206895288075e+03 -5.491378293574211e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.100000000000000e+01 -1.152804272434999e+06 -4.903699257464811e+06 4.669010934458954e+06 -2.843674739451556e+03 -4.575078594068126e+03 -5.491493358189720e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.200000000000000e+01 -1.152861145409841e+06 -4.903790757057165e+06 4.668901104262288e+06 -2.843659913643468e+03 -4.574950294300805e+03 -5.491608416797939e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.300000000000000e+01 -1.152918018134627e+06 -4.903882254170460e+06 4.668791271661562e+06 -2.843645085271854e+03 -4.574821984989120e+03 -5.491723479295699e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.400000000000000e+01 -1.152974890530784e+06 -4.903973748657627e+06 4.668681436830656e+06 -2.843630255873566e+03 -4.574693678917060e+03 -5.491838534141622e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.500000000000000e+01 -1.153031762631818e+06 -4.904065240581444e+06 4.668571599695355e+06 -2.843615424267048e+03 -4.574565370809171e+03 -5.491953586346244e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.600000000000000e+01 -1.153088634482690e+06 -4.904156730026064e+06 4.668461760156151e+06 -2.843600590214636e+03 -4.574437053293622e+03 -5.492068642270134e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.700000000000000e+01 -1.153145505993540e+06 -4.904248216823312e+06 4.668351918411899e+06 -2.843585755024012e+03 -4.574308740734860e+03 -5.492183689136757e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.800000000000000e+01 -1.153202377242944e+06 -4.904339701120278e+06 4.668242074288663e+06 -2.843570917922168e+03 -4.574180420390991e+03 -5.492298738103873e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.900000000000000e+01 -1.153259248152341e+06 -4.904431182769935e+06 4.668132227960333e+06 -2.843556080060214e+03 -4.574052105153576e+03 -5.492413777716386e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.000000000000000e+01 -1.153316118788852e+06 -4.904522661897971e+06 4.668022379278250e+06 -2.843541239267616e+03 -4.573923784110380e+03 -5.492528818211897e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.100000000000000e+01 -1.153372989130191e+06 -4.904614138462659e+06 4.667912528291783e+06 -2.843526397590566e+03 -4.573795460904361e+03 -5.492643855574530e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.200000000000000e+01 -1.153429859187451e+06 -4.904705612484806e+06 4.667802674976319e+06 -2.843511553215319e+03 -4.573667133734673e+03 -5.492758892152260e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.300000000000000e+01 -1.153486728926893e+06 -4.904797083901284e+06 4.667692819406519e+06 -2.843496707544644e+03 -4.573538808049596e+03 -5.492873922690167e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.400000000000000e+01 -1.153543598382262e+06 -4.904888552775256e+06 4.667582961507676e+06 -2.843481860526524e+03 -4.573410477939130e+03 -5.492988952223373e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.500000000000000e+01 -1.153600467531033e+06 -4.904980019064590e+06 4.667473101329635e+06 -2.843467011793300e+03 -4.573282147756354e+03 -5.493103977227182e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.600000000000000e+01 -1.153657336395500e+06 -4.905071482811065e+06 4.667363238822975e+06 -2.843452160288984e+03 -4.573153813781507e+03 -5.493219001333411e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.700000000000000e+01 -1.153714204964581e+06 -4.905162943993925e+06 4.667253374012247e+06 -2.843437307982118e+03 -4.573025477108835e+03 -5.493334022723365e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.800000000000000e+01 -1.153771073238083e+06 -4.905254402612862e+06 4.667143506897822e+06 -2.843422453017709e+03 -4.572897138747175e+03 -5.493449041381165e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.900000000000000e+01 -1.153827941216130e+06 -4.905345858668094e+06 4.667033637479442e+06 -2.843407597158233e+03 -4.572768797866286e+03 -5.493564057213151e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.000000000000000e+01 -1.153884808909815e+06 -4.905437312180419e+06 4.666923765732494e+06 -2.843392738801496e+03 -4.572640452983973e+03 -5.493679072200657e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.100000000000000e+01 -1.153941676296602e+06 -4.905528763107707e+06 4.666813891706831e+06 -2.843377878402196e+03 -4.572512107970349e+03 -5.493794082857313e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.200000000000000e+01 -1.153998543387832e+06 -4.905620211471166e+06 4.666704015377372e+06 -2.843363017441559e+03 -4.572383760459086e+03 -5.493909090518860e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.300000000000000e+01 -1.154055410183384e+06 -4.905711657270607e+06 4.666594136744323e+06 -2.843348153923399e+03 -4.572255410789019e+03 -5.494024095801255e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.400000000000000e+01 -1.154112276694348e+06 -4.905803100526833e+06 4.666484255783088e+06 -2.843333288033959e+03 -4.572127057540642e+03 -5.494139099823244e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.500000000000000e+01 -1.154169142876027e+06 -4.905894541156168e+06 4.666374372592675e+06 -2.843318422338207e+03 -4.571998706797271e+03 -5.494254096268891e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.600000000000000e+01 -1.154226008784337e+06 -4.905985979263305e+06 4.666264487049202e+06 -2.843303553799633e+03 -4.571870350720647e+03 -5.494369093154796e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.700000000000000e+01 -1.154282874396747e+06 -4.906077414806122e+06 4.666154599202517e+06 -2.843288682830397e+03 -4.571741992438925e+03 -5.494484087643367e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.800000000000000e+01 -1.154339739713385e+06 -4.906168847784837e+06 4.666044709052360e+06 -2.843273811176478e+03 -4.571613631705432e+03 -5.494599079153784e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.900000000000000e+01 -1.154396604745338e+06 -4.906260278220244e+06 4.665934816574119e+06 -2.843258936751139e+03 -4.571485267252272e+03 -5.494714069704265e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.000000000000000e+01 -1.154453469458874e+06 -4.906351706049254e+06 4.665824921842472e+06 -2.843244060987852e+03 -4.571356904121445e+03 -5.494829054374317e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.100000000000000e+01 -1.154510333887738e+06 -4.906443131335001e+06 4.665715024782693e+06 -2.843229183998753e+03 -4.571228536773508e+03 -5.494944037806771e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.200000000000000e+01 -1.154567198031729e+06 -4.906534554077177e+06 4.665605125395147e+06 -2.843214303794174e+03 -4.571100165869832e+03 -5.495059020341043e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.300000000000000e+01 -1.154624061868566e+06 -4.906625974234062e+06 4.665495223729224e+06 -2.843199423239261e+03 -4.570971794176063e+03 -5.495173998338155e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.400000000000000e+01 -1.154680925409340e+06 -4.906717391826447e+06 4.665385319760310e+06 -2.843184540549422e+03 -4.570843420385077e+03 -5.495288973712725e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.500000000000000e+01 -1.154737788665132e+06 -4.906808806875126e+06 4.665275413463791e+06 -2.843169655036500e+03 -4.570715042893835e+03 -5.495403948133842e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.600000000000000e+01 -1.154794651613666e+06 -4.906900219338380e+06 4.665165504889054e+06 -2.843154769233221e+03 -4.570586664482401e+03 -5.495518918101102e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.700000000000000e+01 -1.154851514266028e+06 -4.906991629237007e+06 4.665055594011488e+06 -2.843139881116995e+03 -4.570458284256192e+03 -5.495633885287098e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.800000000000000e+01 -1.154908376622101e+06 -4.907083036570825e+06 4.664945680831304e+06 -2.843124990803692e+03 -4.570329901775607e+03 -5.495748850011772e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.900000000000000e+01 -1.154965238659604e+06 -4.907174441298127e+06 4.664835765397899e+06 -2.843110100459730e+03 -4.570201520461547e+03 -5.495863808398282e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.000000000000000e+01 -1.155022100434441e+06 -4.907265843523558e+06 4.664725847587340e+06 -2.843095206624067e+03 -4.570073131690681e+03 -5.495978769314877e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.100000000000000e+01 -1.155078961890472e+06 -4.907357243142126e+06 4.664615927523985e+06 -2.843080311355226e+03 -4.569944744603838e+03 -5.496093724089453e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.200000000000000e+01 -1.155135823072649e+06 -4.907448640237903e+06 4.664506005108253e+06 -2.843065414629913e+03 -4.569816351275252e+03 -5.496208679444347e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.300000000000000e+01 -1.155192683935948e+06 -4.907540034726722e+06 4.664396080439836e+06 -2.843050515736385e+03 -4.569687959721338e+03 -5.496323628913139e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.400000000000000e+01 -1.155249544525319e+06 -4.907631426692662e+06 4.664286153419144e+06 -2.843035615414764e+03 -4.569559561987407e+03 -5.496438578896835e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.500000000000000e+01 -1.155306404807031e+06 -4.907722816072658e+06 4.664176224120885e+06 -2.843020713163069e+03 -4.569431164083182e+03 -5.496553524533780e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.600000000000000e+01 -1.155363264769761e+06 -4.907814202845571e+06 4.664066292570105e+06 -2.843005809429155e+03 -4.569302767773566e+03 -5.496668464127544e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.700000000000000e+01 -1.155420124469661e+06 -4.907905587116427e+06 4.663956358642382e+06 -2.842990903844056e+03 -4.569174363438064e+03 -5.496783405989848e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.800000000000000e+01 -1.155476983861794e+06 -4.907996968801212e+06 4.663846422437257e+06 -2.842975996279350e+03 -4.569045959131432e+03 -5.496898343359439e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.900000000000000e+01 -1.155533842979658e+06 -4.908088347962614e+06 4.663736483880439e+06 -2.842961085763979e+03 -4.568917548917253e+03 -5.497013281700698e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.000000000000000e+01 -1.155590701756154e+06 -4.908179724475113e+06 4.663626543120671e+06 -2.842946175802107e+03 -4.568789143443045e+03 -5.497128210416423e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.100000000000000e+01 -1.155647560258395e+06 -4.908271098464282e+06 4.663516600009158e+06 -2.842931263162876e+03 -4.568660732213298e+03 -5.497243139851564e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.200000000000000e+01 -1.155704418475052e+06 -4.908362469908987e+06 4.663406654570953e+06 -2.842916347579419e+03 -4.568532317509039e+03 -5.497358068195705e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.300000000000000e+01 -1.155761276372644e+06 -4.908453838746571e+06 4.663296706880289e+06 -2.842901432037963e+03 -4.568403903549264e+03 -5.497472990528127e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.400000000000000e+01 -1.155818133995873e+06 -4.908545205060690e+06 4.663186756838045e+06 -2.842886513584070e+03 -4.568275484064951e+03 -5.497587913490115e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.500000000000000e+01 -1.155874991322208e+06 -4.908636568809252e+06 4.663076804494101e+06 -2.842871592728384e+03 -4.568147062727805e+03 -5.497702833743227e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.600000000000000e+01 -1.155931848329377e+06 -4.908727929950567e+06 4.662966849897867e+06 -2.842856672016299e+03 -4.568018642278726e+03 -5.497817747817630e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.700000000000000e+01 -1.155988705050784e+06 -4.908819288547194e+06 4.662856892975205e+06 -2.842841748015673e+03 -4.567890218193316e+03 -5.497932661093408e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.800000000000000e+01 -1.156045561464160e+06 -4.908910644557439e+06 4.662746933775521e+06 -2.842826823819952e+03 -4.567761793118867e+03 -5.498047569932273e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.900000000000000e+01 -1.156102417614191e+06 -4.909001998064948e+06 4.662636972199687e+06 -2.842811895910526e+03 -4.567633361174029e+03 -5.498162480900789e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.000000000000000e+02 -1.156159273444750e+06 -4.909093348964773e+06 4.662527008372096e+06 -2.842796966748417e+03 -4.567504930416047e+03 -5.498277386069291e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.010000000000000e+02 -1.156216128955963e+06 -4.909184697257137e+06 4.662417042292492e+06 -2.842782037507791e+03 -4.567376500664933e+03 -5.498392285059853e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.020000000000000e+02 -1.156272984192528e+06 -4.909276043025675e+06 4.662307073861729e+06 -2.842767105266476e+03 -4.567248065530181e+03 -5.498507184599629e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.030000000000000e+02 -1.156329839165524e+06 -4.909367386291160e+06 4.662197103055177e+06 -2.842752169526072e+03 -4.567119623048505e+03 -5.498622086574209e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.040000000000000e+02 -1.156386693751856e+06 -4.909458726823345e+06 4.662087130145821e+06 -2.842737236159083e+03 -4.566991191890783e+03 -5.498736972535802e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.050000000000000e+02 -1.156443548108242e+06 -4.909550064915373e+06 4.661977154786103e+06 -2.842722298301765e+03 -4.566862748430161e+03 -5.498851865572372e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.060000000000000e+02 -1.156500402178548e+06 -4.909641400462311e+06 4.661867177100432e+06 -2.842707357553832e+03 -4.566734301078247e+03 -5.498966757845177e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.070000000000000e+02 -1.156557255906893e+06 -4.909732733359624e+06 4.661757197212764e+06 -2.842692417785086e+03 -4.566605858096571e+03 -5.499081640618123e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.080000000000000e+02 -1.156614109360295e+06 -4.909824063732712e+06 4.661647214974411e+06 -2.842677474416332e+03 -4.566477409952301e+03 -5.499196524023264e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.090000000000000e+02 -1.156670962550078e+06 -4.909915391602735e+06 4.661537230360270e+06 -2.842662529114237e+03 -4.566348953955546e+03 -5.499311409581958e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.100000000000000e+02 -1.156727815408916e+06 -4.910006716843826e+06 4.661427243519608e+06 -2.842647582587687e+03 -4.566220501066961e+03 -5.499426287704412e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.110000000000000e+02 -1.156784667947893e+06 -4.910098039476763e+06 4.661317254427799e+06 -2.842632634722024e+03 -4.566092049832412e+03 -5.499541159672718e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.120000000000000e+02 -1.156841520211948e+06 -4.910189359585556e+06 4.661207262985204e+06 -2.842617685353838e+03 -4.565963592481087e+03 -5.499656032131907e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.130000000000000e+02 -1.156898372178557e+06 -4.910280677128133e+06 4.661097269241722e+06 -2.842602733558466e+03 -4.565835133179066e+03 -5.499770901976718e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.140000000000000e+02 -1.156955223858803e+06 -4.910371992125261e+06 4.660987273172718e+06 -2.842587779243282e+03 -4.565706669957761e+03 -5.499885770913411e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.150000000000000e+02 -1.157012075252817e+06 -4.910463304577160e+06 4.660877274777933e+06 -2.842572823660461e+03 -4.565578202608126e+03 -5.500000638552833e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.160000000000000e+02 -1.157068926315674e+06 -4.910554614399873e+06 4.660767274156960e+06 -2.842557867008848e+03 -4.565449738346610e+03 -5.500115498704139e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.170000000000000e+02 -1.157125777080865e+06 -4.910645921656067e+06 4.660657271235478e+06 -2.842542908243628e+03 -4.565321272091635e+03 -5.500230356135726e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.180000000000000e+02 -1.157182627559714e+06 -4.910737226366895e+06 4.660547265988373e+06 -2.842527948095325e+03 -4.565192801678863e+03 -5.500345212347203e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.190000000000000e+02 -1.157239477740908e+06 -4.910828528511248e+06 4.660437258440705e+06 -2.842512985838483e+03 -4.565064329017664e+03 -5.500460066052059e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.200000000000000e+02 -1.157296327613124e+06 -4.910919828067995e+06 4.660327248617536e+06 -2.842498021559147e+03 -4.564935856224390e+03 -5.500574915422580e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.210000000000000e+02 -1.157353177221297e+06 -4.911011125121132e+06 4.660217236419208e+06 -2.842483055570052e+03 -4.564807375712488e+03 -5.500689766729941e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.220000000000000e+02 -1.157410026486819e+06 -4.911102419523763e+06 4.660107222020037e+06 -2.842468088076580e+03 -4.564678900309353e+03 -5.500804609039477e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.230000000000000e+02 -1.157466875488228e+06 -4.911193711422692e+06 4.659997205245812e+06 -2.842453118884190e+03 -4.564550417147433e+03 -5.500919453314606e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.240000000000000e+02 -1.157523724180601e+06 -4.911285000733973e+06 4.659887186196138e+06 -2.842438147717739e+03 -4.564421933365905e+03 -5.501034293645719e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.250000000000000e+02 -1.157580572563824e+06 -4.911376287457443e+06 4.659777164871238e+06 -2.842423174714715e+03 -4.564293449781891e+03 -5.501149129280417e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.260000000000000e+02 -1.157637420671623e+06 -4.911467571656134e+06 4.659667141196298e+06 -2.842408200157342e+03 -4.564164959991508e+03 -5.501263965502825e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.270000000000000e+02 -1.157694268447879e+06 -4.911558853225172e+06 4.659557115295780e+06 -2.842393224428646e+03 -4.564036473365310e+03 -5.501378794221748e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.280000000000000e+02 -1.157751115970878e+06 -4.911650132310958e+06 4.659447086995930e+06 -2.842378244950554e+03 -4.563907977732702e+03 -5.501493626885192e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.290000000000000e+02 -1.157807963173548e+06 -4.911741408788074e+06 4.659337056445612e+06 -2.842363265453650e+03 -4.563779483125079e+03 -5.501608453332415e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.300000000000000e+02 -1.157864810078170e+06 -4.911832682698227e+06 4.659227023595320e+06 -2.842348283688554e+03 -4.563650986509332e+03 -5.501723277142027e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.310000000000000e+02 -1.157921656673430e+06 -4.911923954020308e+06 4.659116988470130e+06 -2.842333300081384e+03 -4.563522489660076e+03 -5.501838096622433e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.320000000000000e+02 -1.157978503004253e+06 -4.912015222838267e+06 4.659006950970355e+06 -2.842318314476045e+03 -4.563393984836485e+03 -5.501952918383498e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.330000000000000e+02 -1.158035349014441e+06 -4.912106489047130e+06 4.658896911220641e+06 -2.842303326923101e+03 -4.563265481785996e+03 -5.502067734167819e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.340000000000000e+02 -1.158092194715323e+06 -4.912197752668047e+06 4.658786869195876e+06 -2.842288338997628e+03 -4.563136977960232e+03 -5.502182545417339e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.350000000000000e+02 -1.158149040117984e+06 -4.912289013721783e+06 4.658676824871410e+06 -2.842273348822791e+03 -4.563008472083676e+03 -5.502297354056945e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.360000000000000e+02 -1.158205885244700e+06 -4.912380272250024e+06 4.658566778197742e+06 -2.842258355489071e+03 -4.562879960628598e+03 -5.502412163476751e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.370000000000000e+02 -1.158262730062005e+06 -4.912471528190184e+06 4.658456729249188e+06 -2.842243361971740e+03 -4.562751448545757e+03 -5.502526968151961e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.380000000000000e+02 -1.158319574580980e+06 -4.912562781563034e+06 4.658346678001096e+06 -2.842228365996533e+03 -4.562622934344506e+03 -5.502641770368349e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.390000000000000e+02 -1.158376418801509e+06 -4.912654032368389e+06 4.658236624453678e+06 -2.842213367906349e+03 -4.562494418115616e+03 -5.502756569894454e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.400000000000000e+02 -1.158433262701320e+06 -4.912745280564608e+06 4.658126568656394e+06 -2.842198369709035e+03 -4.562365902873752e+03 -5.502871363278264e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.410000000000000e+02 -1.158490106336292e+06 -4.912836526256173e+06 4.658016510485158e+06 -2.842183368138239e+03 -4.562237380381233e+03 -5.502986158950476e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.420000000000000e+02 -1.158546949683911e+06 -4.912927769401041e+06 4.657906449989897e+06 -2.842168363896095e+03 -4.562108854062119e+03 -5.503100953702363e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.430000000000000e+02 -1.158603792688309e+06 -4.913019009894783e+06 4.657796387294654e+06 -2.842153360457620e+03 -4.561980332222231e+03 -5.503215738952478e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.440000000000000e+02 -1.158660635450158e+06 -4.913110247925587e+06 4.657686322175892e+06 -2.842138352708486e+03 -4.561851799613107e+03 -5.503330529883975e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.450000000000000e+02 -1.158717477857356e+06 -4.913201483283999e+06 4.657576254882442e+06 -2.842123344794960e+03 -4.561723273881315e+03 -5.503445309726495e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.460000000000000e+02 -1.158774319988419e+06 -4.913292716116721e+06 4.657466185240003e+06 -2.842108335234259e+03 -4.561594741796339e+03 -5.503560090319568e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.470000000000000e+02 -1.158831161809555e+06 -4.913383946360675e+06 4.657356113323534e+06 -2.842093323381529e+03 -4.561466209790116e+03 -5.503674866524151e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.480000000000000e+02 -1.158888003376882e+06 -4.913475174120710e+06 4.657246039008463e+06 -2.842078309124447e+03 -4.561337668387877e+03 -5.503789646389006e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.490000000000000e+02 -1.158944844589497e+06 -4.913566399208312e+06 4.657135962518764e+06 -2.842063294502320e+03 -4.561209133503902e+03 -5.503904415560080e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.500000000000000e+02 -1.159001685503280e+06 -4.913657621727939e+06 4.657025883730334e+06 -2.842048277761278e+03 -4.561080596594672e+03 -5.504019182040975e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.510000000000000e+02 -1.159058526140752e+06 -4.913748841721660e+06 4.656915802593191e+06 -2.842033259542652e+03 -4.560952053848240e+03 -5.504133948759569e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.520000000000000e+02 -1.159115366490593e+06 -4.913840059168374e+06 4.656805719132397e+06 -2.842018238280638e+03 -4.560823507267878e+03 -5.504248714731303e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.530000000000000e+02 -1.159172206552689e+06 -4.913931274067899e+06 4.656695633348170e+06 -2.842003214660535e+03 -4.560694956781908e+03 -5.504363479707200e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.540000000000000e+02 -1.159229046304774e+06 -4.914022486378607e+06 4.656585545289976e+06 -2.841988190576093e+03 -4.560566405556490e+03 -5.504478240160712e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.550000000000000e+02 -1.159285885713142e+06 -4.914113696037565e+06 4.656475455032634e+06 -2.841973165872654e+03 -4.560437859482440e+03 -5.504592991190972e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.560000000000000e+02 -1.159342724867248e+06 -4.914204903211967e+06 4.656365362377415e+06 -2.841958137253684e+03 -4.560309304135315e+03 -5.504707746457514e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.570000000000000e+02 -1.159399563711236e+06 -4.914296107797430e+06 4.656255267448400e+06 -2.841943108250072e+03 -4.560180748200602e+03 -5.504822497037966e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.580000000000000e+02 -1.159456402256106e+06 -4.914387309814564e+06 4.656145170221085e+06 -2.841928076547665e+03 -4.560052190310143e+03 -5.504937245130940e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.590000000000000e+02 -1.159513240501984e+06 -4.914478509263587e+06 4.656035070695212e+06 -2.841913044054540e+03 -4.559923629941019e+03 -5.505051990316801e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.600000000000000e+02 -1.159570078448758e+06 -4.914569706144325e+06 4.655924968870988e+06 -2.841898009308997e+03 -4.559795067451519e+03 -5.505166732952694e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.610000000000000e+02 -1.159626916096302e+06 -4.914660900456604e+06 4.655814864748633e+06 -2.841882972135561e+03 -4.559666503195977e+03 -5.505281472818868e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.620000000000000e+02 -1.159683753444752e+06 -4.914752092200642e+06 4.655704758327880e+06 -2.841867934470212e+03 -4.559537936207125e+03 -5.505396209857956e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.630000000000000e+02 -1.159740590505184e+06 -4.914843281397182e+06 4.655594649584064e+06 -2.841852893898874e+03 -4.559409365406308e+03 -5.505510946068770e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.640000000000000e+02 -1.159797427232697e+06 -4.914934467962373e+06 4.655484538616895e+06 -2.841837852513516e+03 -4.559280797862085e+03 -5.505625674545290e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.650000000000000e+02 -1.159854263683395e+06 -4.915025652001026e+06 4.655374425301747e+06 -2.841822809226096e+03 -4.559152224456187e+03 -5.505740403469651e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.660000000000000e+02 -1.159911099834778e+06 -4.915116833471132e+06 4.655264309688574e+06 -2.841807763930031e+03 -4.559023648840441e+03 -5.505855129809542e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.670000000000000e+02 -1.159967935686723e+06 -4.915208012372514e+06 4.655154191777592e+06 -2.841792716331181e+03 -4.558895071195907e+03 -5.505969853544923e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.680000000000000e+02 -1.160024771239355e+06 -4.915299188705390e+06 4.655044071568538e+06 -2.841777667871725e+03 -4.558766491207622e+03 -5.506084574290964e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.690000000000000e+02 -1.160081606526152e+06 -4.915390362532332e+06 4.654933948986996e+06 -2.841762616025784e+03 -4.558637903791051e+03 -5.506199297474513e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.700000000000000e+02 -1.160138441457423e+06 -4.915481533685839e+06 4.654823824232176e+06 -2.841747563762891e+03 -4.558509323062311e+03 -5.506314009852463e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.710000000000000e+02 -1.160195276089283e+06 -4.915572702270715e+06 4.654713697179453e+06 -2.841732511029155e+03 -4.558380739991208e+03 -5.506428719064448e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.720000000000000e+02 -1.160252110466310e+06 -4.915663868370302e+06 4.654603567729681e+06 -2.841717453670260e+03 -4.558252148015572e+03 -5.506543432516855e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.730000000000000e+02 -1.160308944532654e+06 -4.915755031880246e+06 4.654493436006983e+06 -2.841702396043576e+03 -4.558123555121537e+03 -5.506658141510594e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.740000000000000e+02 -1.160365778254614e+06 -4.915846192737643e+06 4.654383302086201e+06 -2.841687337659920e+03 -4.557994967361794e+03 -5.506772841163612e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.750000000000000e+02 -1.160422611721639e+06 -4.915937351109614e+06 4.654273165768533e+06 -2.841672275667749e+03 -4.557866370503402e+03 -5.506887544761498e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.760000000000000e+02 -1.160479444877868e+06 -4.916028506891811e+06 4.654163027178105e+06 -2.841657212883795e+03 -4.557737772920202e+03 -5.507002243974164e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.770000000000000e+02 -1.160536277734397e+06 -4.916119660104981e+06 4.654052886290241e+06 -2.841642148264060e+03 -4.557609173136513e+03 -5.507116940516494e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.780000000000000e+02 -1.160593110291093e+06 -4.916210810748943e+06 4.653942743105166e+06 -2.841627081059322e+03 -4.557480571645950e+03 -5.507231634310219e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.790000000000000e+02 -1.160649942548095e+06 -4.916301958823916e+06 4.653832597622608e+06 -2.841612013298626e+03 -4.557351967338244e+03 -5.507346325376352e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.800000000000000e+02 -1.160706774505279e+06 -4.916393104329723e+06 4.653722449842788e+06 -2.841596943104002e+03 -4.557223361231730e+03 -5.507461013703274e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.810000000000000e+02 -1.160763606151337e+06 -4.916484247245287e+06 4.653612299790794e+06 -2.841581871148091e+03 -4.557094754722674e+03 -5.507575697810995e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.820000000000000e+02 -1.160820437542369e+06 -4.916575387675351e+06 4.653502147341957e+06 -2.841566796843717e+03 -4.556966138613009e+03 -5.507690385716120e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.830000000000000e+02 -1.160877268588619e+06 -4.916666525452365e+06 4.653391992695702e+06 -2.841551721291274e+03 -4.556837527893202e+03 -5.507805064289034e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.840000000000000e+02 -1.160934099346189e+06 -4.916757660681075e+06 4.653281835727354e+06 -2.841536644613062e+03 -4.556708912633122e+03 -5.507919741843364e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.850000000000000e+02 -1.160990929792571e+06 -4.916848793319498e+06 4.653171676486894e+06 -2.841521565994612e+03 -4.556580297362415e+03 -5.508034414929202e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.860000000000000e+02 -1.161047759972429e+06 -4.916939923451077e+06 4.653061514874998e+06 -2.841506484020091e+03 -4.556451674615382e+03 -5.508149090475548e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.870000000000000e+02 -1.161104589829916e+06 -4.917031050971502e+06 4.652951351015825e+06 -2.841491402120867e+03 -4.556323052831034e+03 -5.508263759824675e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.880000000000000e+02 -1.161161419364916e+06 -4.917122175880610e+06 4.652841184909587e+06 -2.841476318559175e+03 -4.556194432795372e+03 -5.508378423098125e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.890000000000000e+02 -1.161218248599702e+06 -4.917213298220025e+06 4.652731016506728e+06 -2.841461232902410e+03 -4.556065810511246e+03 -5.508493083858846e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.900000000000000e+02 -1.161275077590370e+06 -4.917304418094483e+06 4.652620845682560e+06 -2.841446144423438e+03 -4.555937176866660e+03 -5.508607750110782e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.910000000000000e+02 -1.161331906269638e+06 -4.917395535378386e+06 4.652510672586603e+06 -2.841431054039296e+03 -4.555808543126577e+03 -5.508722411949972e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.920000000000000e+02 -1.161388734615005e+06 -4.917486650029767e+06 4.652400497268844e+06 -2.841415962565876e+03 -4.555679912641251e+03 -5.508837066186855e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.930000000000000e+02 -1.161445562660177e+06 -4.917577762111539e+06 4.652290319654368e+06 -2.841400870417292e+03 -4.555551279600870e+03 -5.508951717529146e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.940000000000000e+02 -1.161502390416234e+06 -4.917668871644435e+06 4.652180139718493e+06 -2.841385775612106e+03 -4.555422642657485e+03 -5.509066368005160e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.950000000000000e+02 -1.161559217849475e+06 -4.917759978565578e+06 4.652069957536095e+06 -2.841370679225754e+03 -4.555294007253090e+03 -5.509181012546589e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.960000000000000e+02 -1.161616045038385e+06 -4.917851083021482e+06 4.651959772932701e+06 -2.841355580199527e+03 -4.555165360637401e+03 -5.509295662369158e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.970000000000000e+02 -1.161672871870827e+06 -4.917942184802851e+06 4.651849586157556e+06 -2.841340480232637e+03 -4.555036720946046e+03 -5.509410301433109e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.980000000000000e+02 -1.161729698425290e+06 -4.918033284056189e+06 4.651739397036187e+06 -2.841325379007723e+03 -4.554908075046583e+03 -5.509524940941537e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.990000000000000e+02 -1.161786524690456e+06 -4.918124380760428e+06 4.651629205593686e+06 -2.841310274798608e+03 -4.554779425509763e+03 -5.509639579507056e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.000000000000000e+02 -1.161843350643823e+06 -4.918215474873597e+06 4.651519011880050e+06 -2.841295168751823e+03 -4.554650775890122e+03 -5.509754213619808e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.010000000000000e+02 -1.161900176296716e+06 -4.918306566416807e+06 4.651408815870123e+06 -2.841280062142756e+03 -4.554522123348437e+03 -5.509868845095965e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.020000000000000e+02 -1.161957001649014e+06 -4.918397655389889e+06 4.651298617564120e+06 -2.841264953102658e+03 -4.554393469117082e+03 -5.509983473739898e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.030000000000000e+02 -1.162013826700602e+06 -4.918488741792665e+06 4.651188416962255e+06 -2.841249841903648e+03 -4.554264812697756e+03 -5.510098099848559e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.040000000000000e+02 -1.162070651451606e+06 -4.918579825625350e+06 4.651078214064261e+06 -2.841234729801721e+03 -4.554136153771807e+03 -5.510212723124317e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.050000000000000e+02 -1.162127475901913e+06 -4.918670906887776e+06 4.650968008870349e+06 -2.841219615513253e+03 -4.554007492740412e+03 -5.510327343807761e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.060000000000000e+02 -1.162184300051402e+06 -4.918761985579765e+06 4.650857801380741e+06 -2.841204499003339e+03 -4.553878830014973e+03 -5.510441961568291e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.070000000000000e+02 -1.162241123911393e+06 -4.918853061722425e+06 4.650747591570271e+06 -2.841189381236472e+03 -4.553750162617042e+03 -5.510556578478550e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.080000000000000e+02 -1.162297947436923e+06 -4.918944135231888e+06 4.650637379538893e+06 -2.841174261944863e+03 -4.553621498963415e+03 -5.510671187574417e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.090000000000000e+02 -1.162354770706460e+06 -4.919035206254608e+06 4.650527165112078e+06 -2.841159140300288e+03 -4.553492825527375e+03 -5.510785800614703e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.100000000000000e+02 -1.162411593641547e+06 -4.919126274644172e+06 4.650416948464304e+06 -2.841144017641710e+03 -4.553364155466382e+03 -5.510900405921655e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.110000000000000e+02 -1.162468416275639e+06 -4.919217340463081e+06 4.650306729521099e+06 -2.841128892558820e+03 -4.553235483315887e+03 -5.511015008730119e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.120000000000000e+02 -1.162525238631247e+06 -4.919308403753331e+06 4.650196508232411e+06 -2.841113765950585e+03 -4.553106805200430e+03 -5.511129611896557e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.130000000000000e+02 -1.162582060697067e+06 -4.919399464493859e+06 4.650086284623339e+06 -2.841098636758805e+03 -4.552978123264001e+03 -5.511244214092967e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.140000000000000e+02 -1.162638882417021e+06 -4.919490522580034e+06 4.649976058818587e+06 -2.841083506902005e+03 -4.552849446256258e+03 -5.511358807092464e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.150000000000000e+02 -1.162695703836001e+06 -4.919581578095647e+06 4.649865830718308e+06 -2.841068376159833e+03 -4.552720766917384e+03 -5.511473397103791e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.160000000000000e+02 -1.162752524998660e+06 -4.919672631124066e+06 4.649755600223115e+06 -2.841053241721418e+03 -4.552592078399603e+03 -5.511587991154567e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.170000000000000e+02 -1.162809345826539e+06 -4.919763681518903e+06 4.649645367507511e+06 -2.841038106044193e+03 -4.552463393124023e+03 -5.511702577686662e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.180000000000000e+02 -1.162866166386912e+06 -4.919854729405695e+06 4.649535132421841e+06 -2.841022968508459e+03 -4.552334700107473e+03 -5.511817166220058e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.190000000000000e+02 -1.162922986601331e+06 -4.919945774638067e+06 4.649424895140611e+06 -2.841007830360738e+03 -4.552206012037203e+03 -5.511931745519352e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.200000000000000e+02 -1.162979806525626e+06 -4.920036817320275e+06 4.649314655539539e+06 -2.840992689391856e+03 -4.552077320270445e+03 -5.512046323850840e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.210000000000000e+02 -1.163036626182310e+06 -4.920127857494300e+06 4.649204413568556e+06 -2.840977546573228e+03 -4.551948620578250e+03 -5.512160904334190e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.220000000000000e+02 -1.163093445515226e+06 -4.920218895055420e+06 4.649094169352540e+06 -2.840962401575019e+03 -4.551819922866901e+03 -5.512275478784592e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.230000000000000e+02 -1.163150264535701e+06 -4.920309930024729e+06 4.648983922866325e+06 -2.840947256531522e+03 -4.551691223979411e+03 -5.512390048896862e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.240000000000000e+02 -1.163207083277185e+06 -4.920400962464715e+06 4.648873674035423e+06 -2.840932108200295e+03 -4.551562519849387e+03 -5.512504619551278e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.250000000000000e+02 -1.163263901705989e+06 -4.920491992312543e+06 4.648763422934745e+06 -2.840916958136983e+03 -4.551433815238222e+03 -5.512619186042509e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.260000000000000e+02 -1.163320719811052e+06 -4.920583019547557e+06 4.648653169588941e+06 -2.840901807919180e+03 -4.551305111861482e+03 -5.512733746217690e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.270000000000000e+02 -1.163377537659400e+06 -4.920674044294869e+06 4.648542913848794e+06 -2.840886654061033e+03 -4.551176399175538e+03 -5.512848310513376e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.280000000000000e+02 -1.163434355172580e+06 -4.920765066408133e+06 4.648432655888853e+06 -2.840871498950579e+03 -4.551047690101062e+03 -5.512962866988415e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.290000000000000e+02 -1.163491172417864e+06 -4.920856086012857e+06 4.648322395559419e+06 -2.840856341942467e+03 -4.550918972901047e+03 -5.513077425803320e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.300000000000000e+02 -1.163547989316804e+06 -4.920947102962696e+06 4.648212133035045e+06 -2.840841184272019e+03 -4.550790260777059e+03 -5.513191975301028e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.310000000000000e+02 -1.163604805936425e+06 -4.921038117382763e+06 4.648101868166510e+06 -2.840826023595991e+03 -4.550661543125591e+03 -5.513306525452610e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.320000000000000e+02 -1.163661622265660e+06 -4.921129129252391e+06 4.647991600978463e+06 -2.840810861595468e+03 -4.550532821370392e+03 -5.513421074303834e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.330000000000000e+02 -1.163718438281937e+06 -4.921220138529520e+06 4.647881331521076e+06 -2.840795697418383e+03 -4.550404099407493e+03 -5.513535618962638e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.340000000000000e+02 -1.163775253985376e+06 -4.921311145214363e+06 4.647771059794094e+06 -2.840780532663925e+03 -4.550275376538245e+03 -5.513650159296721e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.350000000000000e+02 -1.163832069409439e+06 -4.921402149369385e+06 4.647660785723004e+06 -2.840765365081456e+03 -4.550146648256850e+03 -5.513764700107045e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.360000000000000e+02 -1.163888884520431e+06 -4.921493150931775e+06 4.647550509382746e+06 -2.840750195457035e+03 -4.550017919827124e+03 -5.513879236614668e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.370000000000000e+02 -1.163945699329676e+06 -4.921584149922628e+06 4.647440230748145e+06 -2.840735025126626e+03 -4.549889188602994e+03 -5.513993770442671e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.380000000000000e+02 -1.164002513848240e+06 -4.921675146362652e+06 4.647329949794509e+06 -2.840719852034787e+03 -4.549760454059056e+03 -5.514108302957738e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.390000000000000e+02 -1.164059328031255e+06 -4.921766140168156e+06 4.647219666621682e+06 -2.840704678088866e+03 -4.549631722184866e+03 -5.514222828267240e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.400000000000000e+02 -1.164116141934793e+06 -4.921857131443746e+06 4.647109381104860e+06 -2.840689502391848e+03 -4.549502984646141e+03 -5.514337353779854e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.410000000000000e+02 -1.164172955525167e+06 -4.921948120126623e+06 4.646999093318983e+06 -2.840674324861493e+03 -4.549374246882589e+03 -5.514451874960729e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.420000000000000e+02 -1.164229768835831e+06 -4.922039106279232e+06 4.646888803189528e+06 -2.840659144343034e+03 -4.549245503439986e+03 -5.514566396913211e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.430000000000000e+02 -1.164286581833341e+06 -4.922130089839163e+06 4.646778510790969e+06 -2.840643963342353e+03 -4.549116759165489e+03 -5.514680914436035e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.440000000000000e+02 -1.164343394528777e+06 -4.922221070827122e+06 4.646668216098604e+06 -2.840628780193780e+03 -4.548988012991344e+03 -5.514795429176187e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.450000000000000e+02 -1.164400206933201e+06 -4.922312049263806e+06 4.646557919087737e+06 -2.840613594276181e+03 -4.548859263102077e+03 -5.514909942938601e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.460000000000000e+02 -1.164457018990804e+06 -4.922403025045071e+06 4.646447619882673e+06 -2.840598409233281e+03 -4.548730517616822e+03 -5.515024447261867e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.470000000000000e+02 -1.164513830813271e+06 -4.922493998379327e+06 4.646337318234636e+06 -2.840583219019079e+03 -4.548601759766613e+03 -5.515138958955755e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.480000000000000e+02 -1.164570642300033e+06 -4.922584969078952e+06 4.646227014367600e+06 -2.840568029234033e+03 -4.548473004729972e+03 -5.515253462747403e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.490000000000000e+02 -1.164627453462164e+06 -4.922675937164646e+06 4.646116708256858e+06 -2.840552837932941e+03 -4.548344251034975e+03 -5.515367960749245e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.500000000000000e+02 -1.164684264377865e+06 -4.922766902782318e+06 4.646006399728222e+06 -2.840537642578651e+03 -4.548215486715839e+03 -5.515482464154799e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.510000000000000e+02 -1.164741074968940e+06 -4.922857865786097e+06 4.645896088955829e+06 -2.840522446919258e+03 -4.548086723255349e+03 -5.515596961631279e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.520000000000000e+02 -1.164797885235281e+06 -4.922948826175817e+06 4.645785775939899e+06 -2.840507250040388e+03 -4.547957961389874e+03 -5.515711452971970e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.530000000000000e+02 -1.164854695221517e+06 -4.923039784034774e+06 4.645675460580978e+06 -2.840492050075385e+03 -4.547829193953856e+03 -5.515825945035536e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.540000000000000e+02 -1.164911504871838e+06 -4.923130739258849e+06 4.645565143003391e+06 -2.840476850375020e+03 -4.547700429320879e+03 -5.515940429281403e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.550000000000000e+02 -1.164968314242070e+06 -4.923221691952203e+06 4.645454823082759e+06 -2.840461647867241e+03 -4.547571659014412e+03 -5.516054914211055e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.560000000000000e+02 -1.165025123309712e+06 -4.923312642072924e+06 4.645344500869130e+06 -2.840446442853996e+03 -4.547442886760027e+03 -5.516169396559521e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.570000000000000e+02 -1.165081932052525e+06 -4.923403589579501e+06 4.645234176412083e+06 -2.840431238033108e+03 -4.547314115435612e+03 -5.516283872696538e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.580000000000000e+02 -1.165138740503868e+06 -4.923494534534230e+06 4.645123849637235e+06 -2.840416029933083e+03 -4.547185340838482e+03 -5.516398347713130e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.590000000000000e+02 -1.165195548697434e+06 -4.923585476999911e+06 4.645013520469550e+06 -2.840400819589738e+03 -4.547056556268590e+03 -5.516512826768972e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.600000000000000e+02 -1.165252356554792e+06 -4.923676416830327e+06 4.644903189083688e+06 -2.840385608044455e+03 -4.546927775188814e+03 -5.516627298090944e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.610000000000000e+02 -1.165309164120576e+06 -4.923767354108753e+06 4.644792855380180e+06 -2.840370393975649e+03 -4.546798990231342e+03 -5.516741768460078e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.620000000000000e+02 -1.165365971373467e+06 -4.923858288793362e+06 4.644682519408756e+06 -2.840355225785978e+03 -4.546670188576375e+03 -5.516856226868937e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.630000000000000e+02 -1.165422778307146e+06 -4.923949220876525e+06 4.644572181179011e+06 -2.840339963335913e+03 -4.546541420424878e+03 -5.516970694202174e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.640000000000000e+02 -1.165479584964677e+06 -4.924040150436529e+06 4.644461840597177e+06 -2.840324743968192e+03 -4.546412628915295e+03 -5.517085156424979e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.650000000000000e+02 -1.165536391297093e+06 -4.924131077382049e+06 4.644351497772365e+06 -2.840309524524399e+03 -4.546283838399535e+03 -5.517199612504527e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.660000000000000e+02 -1.165593197349026e+06 -4.924222001796350e+06 4.644241152605093e+06 -2.840294302059045e+03 -4.546155042542819e+03 -5.517314069083206e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.670000000000000e+02 -1.165650003109170e+06 -4.924312923658396e+06 4.644130805120492e+06 -2.840279076866794e+03 -4.546026242593492e+03 -5.517428524980293e+03 1.916870120600000e-03 7.337122999400000e-04 1.159096367800000e-03 2.444819232100000e-03 1.868036280500000e-03 3.272469259000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.680000000000000e+02 -1.165706808521722e+06 -4.924403842864110e+06 4.644020455442934e+06 -2.840263852539814e+03 -4.545897447455306e+03 -5.517542971107204e+03 1.916870120600000e-03 7.337122999400000e-04 1.159096367800000e-03 2.444819232100000e-03 1.868036280500000e-03 3.272469259000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.690000000000000e+02 -1.165763613653685e+06 -4.924494759538471e+06 4.643910103423076e+06 -2.840248625185939e+03 -4.545768646651914e+03 -5.517657418007521e+03 1.916870120600000e-03 7.337122999400000e-04 1.159096367800000e-03 2.444819232100000e-03 1.868036280500000e-03 3.272469259000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.700000000000000e+02 -1.165820418482567e+06 -4.924585673639591e+06 4.643799749110977e+06 -2.840233395524254e+03 -4.545639843864918e+03 -5.517771862267744e+03 1.916870120600000e-03 7.337122999400000e-04 1.159096367800000e-03 2.444819232100000e-03 1.868036280500000e-03 3.272469259000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.710000000000000e+02 -1.165877222986126e+06 -4.924676585125968e+06 4.643689392556232e+06 -2.840218165950092e+03 -4.545511041939851e+03 -5.517886300422885e+03 1.916870120600000e-03 7.337122999400000e-04 1.159096367800000e-03 2.444819232100000e-03 1.868036280500000e-03 3.272469259000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.720000000000000e+02 -1.165934027205992e+06 -4.924767494089013e+06 4.643579033665133e+06 -2.840202786895663e+03 -4.545382648720954e+03 -5.518000457471592e+03 1.916870120600000e-03 7.337122999400000e-04 1.159096367800000e-03 2.444819232100000e-03 1.868036280500000e-03 3.272469259000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.730000000000000e+02 -1.165990831087042e+06 -4.924858400435004e+06 4.643468672559977e+06 -2.840187311450798e+03 -4.545254530555154e+03 -5.518114421727834e+03 1.916870120600000e-03 7.337122999400000e-04 1.159096367800000e-03 2.444819232100000e-03 1.868036280500000e-03 3.272469259000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.740000000000000e+02 -1.166047634708204e+06 -4.924949304288351e+06 4.643358309066248e+06 -2.840172073952302e+03 -4.545125713568120e+03 -5.518228860065032e+03 1.916870120600000e-03 7.337122999400000e-04 1.159096367800000e-03 2.444819232100000e-03 1.868036280500000e-03 3.272469259000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.750000000000000e+02 -1.166104437992551e+06 -4.925040205505672e+06 4.643247943355346e+06 -2.840156835485618e+03 -4.544996900133768e+03 -5.518343290514320e+03 1.916870120600000e-03 7.337122999400000e-04 1.159096367800000e-03 2.444819232100000e-03 1.868036280500000e-03 3.272469259000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.760000000000000e+02 -1.166161240973770e+06 -4.925131104149744e+06 4.643137575352211e+06 -2.840141596251096e+03 -4.544868083785215e+03 -5.518457718411961e+03 1.916870120600000e-03 7.337122999400000e-04 1.159096367800000e-03 2.444819232100000e-03 1.868036280500000e-03 3.272469259000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.770000000000000e+02 -1.166218043629377e+06 -4.925222000178695e+06 4.643027205106924e+06 -2.840126355667363e+03 -4.544739269083874e+03 -5.518572140192507e+03 1.916823711500000e-03 7.334078665900000e-04 1.159269326400000e-03 2.443984690900000e-03 1.867915683200000e-03 3.273454095500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.780000000000000e+02 -1.166274846026357e+06 -4.925312893717471e+06 4.642916832470113e+06 -2.840111110926993e+03 -4.544610445512106e+03 -5.518686565941822e+03 1.916823711500000e-03 7.334078665900000e-04 1.159269326400000e-03 2.443984690900000e-03 1.867915683200000e-03 3.273454095500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.790000000000000e+02 -1.166331648086550e+06 -4.925403784620310e+06 4.642806457616026e+06 -2.840095866796953e+03 -4.544481624367292e+03 -5.518800984039082e+03 1.916823711500000e-03 7.334078665900000e-04 1.159269326400000e-03 2.443984690900000e-03 1.867915683200000e-03 3.273454095500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.800000000000000e+02 -1.166388449854576e+06 -4.925494672970454e+06 4.642696080445157e+06 -2.840080620070802e+03 -4.544352799734383e+03 -5.518915400888013e+03 1.916823711500000e-03 7.334078665900000e-04 1.159269326400000e-03 2.443984690900000e-03 1.867915683200000e-03 3.273454095500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.810000000000000e+02 -1.166445251307949e+06 -4.925585558726020e+06 4.642585701007579e+06 -2.840065371344765e+03 -4.544223974616518e+03 -5.519029813701432e+03 1.916823711500000e-03 7.334078665900000e-04 1.159269326400000e-03 2.443984690900000e-03 1.867915683200000e-03 3.273454095500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.820000000000000e+02 -1.166502052478665e+06 -4.925676441956272e+06 4.642475319232903e+06 -2.840050036618713e+03 -4.544095467661826e+03 -5.519143992948872e+03 1.916823711500000e-03 7.334078665900000e-04 1.159269326400000e-03 2.443984690900000e-03 1.867915683200000e-03 3.273454095500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.830000000000000e+02 -1.166558853326205e+06 -4.925767322592112e+06 4.642364935211979e+06 -2.840034643639323e+03 -4.543967175035474e+03 -5.519258013264394e+03 1.916823711500000e-03 7.334078665900000e-04 1.159269326400000e-03 2.443984690900000e-03 1.867915683200000e-03 3.273454095500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.840000000000000e+02 -1.166615653864806e+06 -4.925858200644052e+06 4.642254548911585e+06 -2.840019390244958e+03 -4.543838341321183e+03 -5.519372419330269e+03 1.916823711500000e-03 7.334078665900000e-04 1.159269326400000e-03 2.443984690900000e-03 1.867915683200000e-03 3.273454095500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.850000000000000e+02 -1.166672454077510e+06 -4.925949076080530e+06 4.642144160369478e+06 -2.840004135341224e+03 -4.543709509387291e+03 -5.519486819240626e+03 1.916823711500000e-03 7.334078665900000e-04 1.159269326400000e-03 2.443984690900000e-03 1.867915683200000e-03 3.273454095500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.860000000000000e+02 -1.166729254020125e+06 -4.926039949005619e+06 4.642033769461199e+06 -2.839988877160108e+03 -4.543580669905296e+03 -5.519601221613322e+03 1.916823711500000e-03 7.334078665900000e-04 1.159269326400000e-03 2.443984690900000e-03 1.867915683200000e-03 3.273454095500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.870000000000000e+02 -1.166786053636852e+06 -4.926130819315278e+06 4.641923376311160e+06 -2.839973618800369e+03 -4.543451831386440e+03 -5.519715617917904e+03 1.916777237000000e-03 7.331033551700000e-04 1.159442133400000e-03 2.443150217600000e-03 1.867794695500000e-03 3.274438960700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.880000000000000e+02 -1.166842852961130e+06 -4.926221687071898e+06 4.641812980844765e+06 -2.839958357800975e+03 -4.543322989359393e+03 -5.519830013010094e+03 1.916777237000000e-03 7.331033551700000e-04 1.159442133400000e-03 2.443150217600000e-03 1.867794695500000e-03 3.274438960700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.890000000000000e+02 -1.166899651992842e+06 -4.926312552275287e+06 4.641702583062227e+06 -2.839943094260792e+03 -4.543194143280063e+03 -5.519944407301464e+03 1.916777237000000e-03 7.331033551700000e-04 1.159442133400000e-03 2.443150217600000e-03 1.867794695500000e-03 3.274438960700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.900000000000000e+02 -1.166956450709745e+06 -4.926403414883974e+06 4.641592183013158e+06 -2.839927830234144e+03 -4.543065296629653e+03 -5.520058796949835e+03 1.916777237000000e-03 7.331033551700000e-04 1.159442133400000e-03 2.443150217600000e-03 1.867794695500000e-03 3.274438960700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.910000000000000e+02 -1.167013249134093e+06 -4.926494274939477e+06 4.641481780647893e+06 -2.839912563588357e+03 -4.542936446028258e+03 -5.520173185747494e+03 1.916777237000000e-03 7.331033551700000e-04 1.159442133400000e-03 2.443150217600000e-03 1.867794695500000e-03 3.274438960700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.920000000000000e+02 -1.167070047232581e+06 -4.926585132388047e+06 4.641371376049115e+06 -2.839897313451336e+03 -4.542808044682814e+03 -5.520287185139953e+03 1.916777237000000e-03 7.331033551700000e-04 1.159442133400000e-03 2.443150217600000e-03 1.867794695500000e-03 3.274438960700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.930000000000000e+02 -1.167126845007805e+06 -4.926675987239993e+06 4.641260969216676e+06 -2.839882074955960e+03 -4.542679939136136e+03 -5.520400926003512e+03 1.916777237000000e-03 7.331033551700000e-04 1.159442133400000e-03 2.443150217600000e-03 1.867794695500000e-03 3.274438960700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.940000000000000e+02 -1.167183642487466e+06 -4.926766839533217e+06 4.641150560074680e+06 -2.839866803445793e+03 -4.542551083979373e+03 -5.520515304795755e+03 1.916777237000000e-03 7.331033551700000e-04 1.159442133400000e-03 2.443150217600000e-03 1.867794695500000e-03 3.274438960700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.950000000000000e+02 -1.167240439663165e+06 -4.926857689252108e+06 4.641040148641804e+06 -2.839851529672712e+03 -4.542422226824200e+03 -5.520629680940214e+03 1.916777237000000e-03 7.331033551700000e-04 1.159442133400000e-03 2.443150217600000e-03 1.867794695500000e-03 3.274438960700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.960000000000000e+02 -1.167297236535031e+06 -4.926948536396886e+06 4.640929734917783e+06 -2.839836255090182e+03 -4.542293366952744e+03 -5.520744054385536e+03 1.916777237000000e-03 7.331033551700000e-04 1.159442133400000e-03 2.443150217600000e-03 1.867794695500000e-03 3.274438960700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.970000000000000e+02 -1.167354033080494e+06 -4.927039380925559e+06 4.640819318952872e+06 -2.839820978494224e+03 -4.542164508905134e+03 -5.520858421867362e+03 1.916730697200000e-03 7.327987657500000e-04 1.159614788800000e-03 2.442315812500000e-03 1.867673317500000e-03 3.275423854800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.980000000000000e+02 -1.167410829355605e+06 -4.927130222942557e+06 4.640708900622107e+06 -2.839805700065937e+03 -4.542035643028407e+03 -5.520972791395001e+03 1.916730697200000e-03 7.327987657500000e-04 1.159614788800000e-03 2.442315812500000e-03 1.867673317500000e-03 3.275423854800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.990000000000000e+02 -1.167467625337872e+06 -4.927221062406025e+06 4.640598479975575e+06 -2.839790418715379e+03 -4.541906773493767e+03 -5.521087159961718e+03 1.916730697200000e-03 7.327987657500000e-04 1.159614788800000e-03 2.442315812500000e-03 1.867673317500000e-03 3.275423854800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.000000000000000e+02 -1.167524420960092e+06 -4.927311899190725e+06 4.640488057163144e+06 -2.839775137564015e+03 -4.541777910421434e+03 -5.521201517683911e+03 1.916730697200000e-03 7.327987657500000e-04 1.159614788800000e-03 2.442315812500000e-03 1.867673317500000e-03 3.275423854800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.010000000000000e+02 -1.167581216323027e+06 -4.927402733484466e+06 4.640377631960077e+06 -2.839759853587550e+03 -4.541649038200998e+03 -5.521315879002683e+03 1.916730697200000e-03 7.327987657500000e-04 1.159614788800000e-03 2.442315812500000e-03 1.867673317500000e-03 3.275423854800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.020000000000000e+02 -1.167638011367999e+06 -4.927493565189105e+06 4.640267204495324e+06 -2.839744435115327e+03 -4.541520477759975e+03 -5.521430034130097e+03 1.916730697200000e-03 7.327987657500000e-04 1.159614788800000e-03 2.442315812500000e-03 1.867673317500000e-03 3.275423854800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.030000000000000e+02 -1.167694806077752e+06 -4.927584394279960e+06 4.640156774806090e+06 -2.839728927258385e+03 -4.541392126038913e+03 -5.521544049175813e+03 1.916730697200000e-03 7.327987657500000e-04 1.159614788800000e-03 2.442315812500000e-03 1.867673317500000e-03 3.275423854800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.040000000000000e+02 -1.167751600509837e+06 -4.927675220845649e+06 4.640046342767142e+06 -2.839713637947765e+03 -4.541263247272046e+03 -5.521658402340074e+03 1.916730697200000e-03 7.327987657500000e-04 1.159614788800000e-03 2.442315812500000e-03 1.867673317500000e-03 3.275423854800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.050000000000000e+02 -1.167808394626511e+06 -4.927766044815863e+06 4.639935908462640e+06 -2.839698347157437e+03 -4.541134367939999e+03 -5.521772751303821e+03 1.916730697200000e-03 7.327987657500000e-04 1.159614788800000e-03 2.442315812500000e-03 1.867673317500000e-03 3.275423854800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.060000000000000e+02 -1.167865188438829e+06 -4.927856866211262e+06 4.639825471867855e+06 -2.839683053735073e+03 -4.541005486782760e+03 -5.521887097640480e+03 1.916730697200000e-03 7.327987657500000e-04 1.159614788800000e-03 2.442315812500000e-03 1.867673317500000e-03 3.275423854800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.070000000000000e+02 -1.167921981969292e+06 -4.927947685073739e+06 4.639715032932631e+06 -2.839667759080832e+03 -4.540876599440735e+03 -5.522001444373384e+03 1.916684092000000e-03 7.324940982599999e-04 1.159787292700000e-03 2.441481475500000e-03 1.867551549200000e-03 3.276408778400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.080000000000000e+02 -1.167978775150603e+06 -4.928038501277970e+06 4.639604591807020e+06 -2.839652463048036e+03 -4.540747717460427e+03 -5.522115781895379e+03 1.916684092000000e-03 7.324940982599999e-04 1.159787292700000e-03 2.441481475500000e-03 1.867551549200000e-03 3.276408778400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.090000000000000e+02 -1.168035568061169e+06 -4.928129314970030e+06 4.639494148316131e+06 -2.839637165177146e+03 -4.540618827615805e+03 -5.522230121492788e+03 1.916684092000000e-03 7.324940982599999e-04 1.159787292700000e-03 2.441481475500000e-03 1.867551549200000e-03 3.276408778400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.100000000000000e+02 -1.168092360644957e+06 -4.928220126045564e+06 4.639383702584909e+06 -2.839621865624315e+03 -4.540489939329622e+03 -5.522344455202048e+03 1.916684092000000e-03 7.324940982599999e-04 1.159787292700000e-03 2.441481475500000e-03 1.867551549200000e-03 3.276408778400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.110000000000000e+02 -1.168149152935402e+06 -4.928310934566902e+06 4.639273254538730e+06 -2.839606563730941e+03 -4.540361047171467e+03 -5.522458787867845e+03 1.916684092000000e-03 7.324940982599999e-04 1.159787292700000e-03 2.441481475500000e-03 1.867551549200000e-03 3.276408778400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.120000000000000e+02 -1.168205944931243e+06 -4.928401740542039e+06 4.639162804183202e+06 -2.839591190951622e+03 -4.540232539404275e+03 -5.522572825065521e+03 1.916684092000000e-03 7.324940982599999e-04 1.159787292700000e-03 2.441481475500000e-03 1.867551549200000e-03 3.276408778400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.130000000000000e+02 -1.168262736603401e+06 -4.928492543923707e+06 4.639052351585020e+06 -2.839575770428658e+03 -4.540104289182313e+03 -5.522686662666879e+03 1.916684092000000e-03 7.324940982599999e-04 1.159787292700000e-03 2.441481475500000e-03 1.867551549200000e-03 3.276408778400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.140000000000000e+02 -1.168319527965100e+06 -4.928583344719361e+06 4.638941896709986e+06 -2.839560463088232e+03 -4.539975390561541e+03 -5.522800987164927e+03 1.916684092000000e-03 7.324940982599999e-04 1.159787292700000e-03 2.441481475500000e-03 1.867551549200000e-03 3.276408778400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.150000000000000e+02 -1.168376318999931e+06 -4.928674142898409e+06 4.638831439594741e+06 -2.839545155739224e+03 -4.539846492955506e+03 -5.522915305479598e+03 1.916684092000000e-03 7.324940982599999e-04 1.159787292700000e-03 2.441481475500000e-03 1.867551549200000e-03 3.276408778400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.160000000000000e+02 -1.168433109763684e+06 -4.928764938564839e+06 4.638720980114744e+06 -2.839529844892784e+03 -4.539717588096503e+03 -5.523029626101293e+03 1.916684092000000e-03 7.324940982599999e-04 1.159787292700000e-03 2.441481475500000e-03 1.867551549200000e-03 3.276408778400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.170000000000000e+02 -1.168489900233880e+06 -4.928855731676806e+06 4.638610518320111e+06 -2.839514531459401e+03 -4.539588679383663e+03 -5.523143945774246e+03 1.916637421700000e-03 7.321893526300000e-04 1.159959645300000e-03 2.440647206400000e-03 1.867429390700000e-03 3.277393732300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.180000000000000e+02 -1.168546690354740e+06 -4.928946522130374e+06 4.638500054335333e+06 -2.839499218891026e+03 -4.539459775280196e+03 -5.523258255861896e+03 1.916637421700000e-03 7.321893526300000e-04 1.159959645300000e-03 2.440647206400000e-03 1.867429390700000e-03 3.277393732300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.190000000000000e+02 -1.168603480204414e+06 -4.929037310071184e+06 4.638389587985964e+06 -2.839483902687131e+03 -4.539330863720520e+03 -5.523372568488076e+03 1.916637421700000e-03 7.321893526300000e-04 1.159959645300000e-03 2.440647206400000e-03 1.867429390700000e-03 3.277393732300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.200000000000000e+02 -1.168660269726883e+06 -4.929128095394914e+06 4.638279119396971e+06 -2.839468585194058e+03 -4.539201953757956e+03 -5.523486875018888e+03 1.916637421700000e-03 7.321893526300000e-04 1.159959645300000e-03 2.440647206400000e-03 1.867429390700000e-03 3.277393732300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.210000000000000e+02 -1.168717058933451e+06 -4.929218878122605e+06 4.638168648543150e+06 -2.839453267288825e+03 -4.539073042983393e+03 -5.523601177077907e+03 1.916637421700000e-03 7.321893526300000e-04 1.159959645300000e-03 2.440647206400000e-03 1.867429390700000e-03 3.277393732300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.220000000000000e+02 -1.168773847870052e+06 -4.929309658345157e+06 4.638058175332256e+06 -2.839438015362064e+03 -4.538944518597977e+03 -5.523715120694993e+03 1.916637421700000e-03 7.321893526300000e-04 1.159959645300000e-03 2.440647206400000e-03 1.867429390700000e-03 3.277393732300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.230000000000000e+02 -1.168830636484562e+06 -4.929400435968916e+06 4.637947699887505e+06 -2.839422809760101e+03 -4.538816253992560e+03 -5.523828820716756e+03 1.916637421700000e-03 7.321893526300000e-04 1.159959645300000e-03 2.440647206400000e-03 1.867429390700000e-03 3.277393732300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.240000000000000e+02 -1.168887424743925e+06 -4.929491210923617e+06 4.637837222265426e+06 -2.839407486316265e+03 -4.538687338701432e+03 -5.523943113030855e+03 1.916637421700000e-03 7.321893526300000e-04 1.159959645300000e-03 2.440647206400000e-03 1.867429390700000e-03 3.277393732300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.250000000000000e+02 -1.168944212754170e+06 -4.929581983406818e+06 4.637726742229323e+06 -2.839392158839987e+03 -4.538558412726428e+03 -5.524057410762072e+03 1.916637421700000e-03 7.321893526300000e-04 1.159959645300000e-03 2.440647206400000e-03 1.867429390700000e-03 3.277393732300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.260000000000000e+02 -1.169001000425978e+06 -4.929672753252119e+06 4.637616259978573e+06 -2.839376831626690e+03 -4.538429489427224e+03 -5.524171700799097e+03 1.916637421700000e-03 7.321893526300000e-04 1.159959645300000e-03 2.440647206400000e-03 1.867429390700000e-03 3.277393732300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.270000000000000e+02 -1.169057787803962e+06 -4.929763520542650e+06 4.637505775413565e+06 -2.839361501883073e+03 -4.538300562325876e+03 -5.524285989818241e+03 1.916590686300000e-03 7.318845289300000e-04 1.160131846800000e-03 2.439813005600000e-03 1.867306842000000e-03 3.278378716600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.280000000000000e+02 -1.169114574876813e+06 -4.929854285257414e+06 4.637395288559468e+06 -2.839346169662939e+03 -4.538171633234626e+03 -5.524400276278435e+03 1.916590686300000e-03 7.318845289300000e-04 1.160131846800000e-03 2.439813005600000e-03 1.867306842000000e-03 3.278378716600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.290000000000000e+02 -1.169171361644669e+06 -4.929945047396624e+06 4.637284799416019e+06 -2.839330836911925e+03 -4.538042701580508e+03 -5.524514559785822e+03 1.916590686300000e-03 7.318845289300000e-04 1.160131846800000e-03 2.439813005600000e-03 1.867306842000000e-03 3.278378716600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.300000000000000e+02 -1.169228148107405e+06 -4.930035806960110e+06 4.637174307983432e+06 -2.839315501715297e+03 -4.537913768106537e+03 -5.524628840578085e+03 1.916590686300000e-03 7.318845289300000e-04 1.160131846800000e-03 2.439813005600000e-03 1.867306842000000e-03 3.278378716600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.310000000000000e+02 -1.169284934264909e+06 -4.930126563947693e+06 4.637063814261919e+06 -2.839300164358477e+03 -4.537784832380954e+03 -5.524743118888424e+03 1.916590686300000e-03 7.318845289300000e-04 1.160131846800000e-03 2.439813005600000e-03 1.867306842000000e-03 3.278378716600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.320000000000000e+02 -1.169341720123623e+06 -4.930217318387037e+06 4.636953318229603e+06 -2.839284582443540e+03 -4.537656223267795e+03 -5.524857228321160e+03 1.916590686300000e-03 7.318845289300000e-04 1.160131846800000e-03 2.439813005600000e-03 1.867306842000000e-03 3.278378716600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.330000000000000e+02 -1.169398505656603e+06 -4.930308070238420e+06 4.636842819941572e+06 -2.839268836683422e+03 -4.537527833272874e+03 -5.524971222610785e+03 1.916590686300000e-03 7.318845289300000e-04 1.160131846800000e-03 2.439813005600000e-03 1.867306842000000e-03 3.278378716600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.340000000000000e+02 -1.169455290858296e+06 -4.930398819465403e+06 4.636732319422763e+06 -2.839253495830934e+03 -4.537398894377855e+03 -5.525085489119494e+03 1.916590686300000e-03 7.318845289300000e-04 1.160131846800000e-03 2.439813005600000e-03 1.867306842000000e-03 3.278378716600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.350000000000000e+02 -1.169512075777055e+06 -4.930489566158090e+06 4.636621816565169e+06 -2.839238151890624e+03 -4.537269949981590e+03 -5.525199756281616e+03 1.916590686300000e-03 7.318845289300000e-04 1.160131846800000e-03 2.439813005600000e-03 1.867306842000000e-03 3.278378716600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.360000000000000e+02 -1.169568860412762e+06 -4.930580310316293e+06 4.636511311368992e+06 -2.839222804780890e+03 -4.537140999787455e+03 -5.525314024381477e+03 1.916590686300000e-03 7.318845289300000e-04 1.160131846800000e-03 2.439813005600000e-03 1.867306842000000e-03 3.278378716600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.370000000000000e+02 -1.169625644698471e+06 -4.930671051815315e+06 4.636400803983746e+06 -2.839207458709298e+03 -4.537012054289997e+03 -5.525428282751129e+03 1.916543885900000e-03 7.315796270600000e-04 1.160303897300000e-03 2.438978872800000e-03 1.867183903200000e-03 3.279363732100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.380000000000000e+02 -1.169682428712318e+06 -4.930761790800725e+06 4.636290294234910e+06 -2.839192108921598e+03 -4.536883101654281e+03 -5.525542543425067e+03 1.916543885900000e-03 7.315796270600000e-04 1.160303897300000e-03 2.438978872800000e-03 1.867183903200000e-03 3.279363732100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.390000000000000e+02 -1.169739212409470e+06 -4.930852527189062e+06 4.636179782222545e+06 -2.839176757521561e+03 -4.536754148506706e+03 -5.525656799915781e+03 1.916543885900000e-03 7.315796270600000e-04 1.160303897300000e-03 2.438978872800000e-03 1.867183903200000e-03 3.279363732100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.400000000000000e+02 -1.169795995801233e+06 -4.930943261001368e+06 4.636069267921425e+06 -2.839161405078297e+03 -4.536625193022366e+03 -5.525771053494503e+03 1.916543885900000e-03 7.315796270600000e-04 1.160303897300000e-03 2.438978872800000e-03 1.867183903200000e-03 3.279363732100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.410000000000000e+02 -1.169852778887492e+06 -4.931033992237468e+06 4.635958751331761e+06 -2.839146050626973e+03 -4.536496235303352e+03 -5.525885304508794e+03 1.916543885900000e-03 7.315796270600000e-04 1.160303897300000e-03 2.438978872800000e-03 1.867183903200000e-03 3.279363732100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.420000000000000e+02 -1.169909561646211e+06 -4.931124720863192e+06 4.635848232510258e+06 -2.839130716289931e+03 -4.536367660639112e+03 -5.525999220776214e+03 1.916543885900000e-03 7.315796270600000e-04 1.160303897300000e-03 2.438978872800000e-03 1.867183903200000e-03 3.279363732100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.430000000000000e+02 -1.169966344113333e+06 -4.931215446949970e+06 4.635737711381677e+06 -2.839115394832157e+03 -4.536239332781837e+03 -5.526112919523269e+03 1.916543885900000e-03 7.315796270600000e-04 1.160303897300000e-03 2.438978872800000e-03 1.867183903200000e-03 3.279363732100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.440000000000000e+02 -1.170023126236293e+06 -4.931306170388632e+06 4.635627188050807e+06 -2.839100035731153e+03 -4.536110372308300e+03 -5.526227158916675e+03 1.916543885900000e-03 7.315796270600000e-04 1.160303897300000e-03 2.438978872800000e-03 1.867183903200000e-03 3.279363732100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.450000000000000e+02 -1.170079908098244e+06 -4.931396891334045e+06 4.635516662331912e+06 -2.839084672892321e+03 -4.535981402652804e+03 -5.526341402331580e+03 1.916543885900000e-03 7.315796270600000e-04 1.160303897300000e-03 2.438978872800000e-03 1.867183903200000e-03 3.279363732100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.460000000000000e+02 -1.170136689632235e+06 -4.931487609661536e+06 4.635406134374523e+06 -2.839069309969312e+03 -4.535852434081943e+03 -5.526455639542997e+03 1.916543885900000e-03 7.315796270600000e-04 1.160303897300000e-03 2.438978872800000e-03 1.867183903200000e-03 3.279363732100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.470000000000000e+02 -1.170193470838072e+06 -4.931578325370803e+06 4.635295604179007e+06 -2.839053945078582e+03 -4.535723467291401e+03 -5.526569870814719e+03 1.916497020500000e-03 7.312746470800000e-04 1.160475796800000e-03 2.438144808300000e-03 1.867060574400000e-03 3.280348779100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.480000000000000e+02 -1.170250251760596e+06 -4.931669038545320e+06 4.635185071645238e+06 -2.839038578720682e+03 -4.535594494182935e+03 -5.526684102693697e+03 1.916497020500000e-03 7.312746470800000e-04 1.160475796800000e-03 2.438144808300000e-03 1.867060574400000e-03 3.280348779100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.490000000000000e+02 -1.170307032410866e+06 -4.931759749205721e+06 4.635074536748463e+06 -2.839023208754726e+03 -4.535465514149155e+03 -5.526798336647696e+03 1.916497020500000e-03 7.312746470800000e-04 1.160475796800000e-03 2.438144808300000e-03 1.867060574400000e-03 3.280348779100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.500000000000000e+02 -1.170363812699344e+06 -4.931850457185335e+06 4.634963999688632e+06 -2.839007838709218e+03 -4.535336540698760e+03 -5.526912559799483e+03 1.916497020500000e-03 7.312746470800000e-04 1.160475796800000e-03 2.438144808300000e-03 1.867060574400000e-03 3.280348779100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.510000000000000e+02 -1.170420592704399e+06 -4.931941162630064e+06 4.634853460290707e+06 -2.838992466877366e+03 -4.535207561157114e+03 -5.527026783511716e+03 1.916497020500000e-03 7.312746470800000e-04 1.160475796800000e-03 2.438144808300000e-03 1.867060574400000e-03 3.280348779100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.520000000000000e+02 -1.170477372401133e+06 -4.932031865507069e+06 4.634742918611214e+06 -2.838976971124473e+03 -4.535079027235198e+03 -5.527140684938235e+03 1.916497020500000e-03 7.312746470800000e-04 1.160475796800000e-03 2.438144808300000e-03 1.867060574400000e-03 3.280348779100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.530000000000000e+02 -1.170534151780964e+06 -4.932122565809376e+06 4.634632374669896e+06 -2.838961392216275e+03 -4.534950788275323e+03 -5.527254371763398e+03 1.916497020500000e-03 7.312746470800000e-04 1.160475796800000e-03 2.438144808300000e-03 1.867060574400000e-03 3.280348779100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.540000000000000e+02 -1.170590930858405e+06 -4.932213263541541e+06 4.634521828432781e+06 -2.838946014756458e+03 -4.534821800409837e+03 -5.527368588940945e+03 1.916497020500000e-03 7.312746470800000e-04 1.160475796800000e-03 2.438144808300000e-03 1.867060574400000e-03 3.280348779100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.550000000000000e+02 -1.170647709596315e+06 -4.932303958634463e+06 4.634411279982796e+06 -2.838930636351082e+03 -4.534692816000457e+03 -5.527482798320735e+03 1.916497020500000e-03 7.312746470800000e-04 1.160475796800000e-03 2.438144808300000e-03 1.867060574400000e-03 3.280348779100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.560000000000000e+02 -1.170704488050465e+06 -4.932394651192022e+06 4.634300729195303e+06 -2.838915254730054e+03 -4.534563826172359e+03 -5.527597008339188e+03 1.916497020500000e-03 7.312746470800000e-04 1.160475796800000e-03 2.438144808300000e-03 1.867060574400000e-03 3.280348779100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.570000000000000e+02 -1.170761266198627e+06 -4.932485341172813e+06 4.634190176119980e+06 -2.838899872479760e+03 -4.534434833601692e+03 -5.527711215599239e+03 1.916450090400000e-03 7.309695889300000e-04 1.160647545600000e-03 2.437310812100000e-03 1.866936855500000e-03 3.281333858200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.580000000000000e+02 -1.170818044062957e+06 -4.932576028618138e+06 4.634079620707254e+06 -2.838884486504292e+03 -4.534305835691168e+03 -5.527825423659955e+03 1.916450090400000e-03 7.309695889300000e-04 1.160647545600000e-03 2.437310812100000e-03 1.866936855500000e-03 3.281333858200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.590000000000000e+02 -1.170874821587698e+06 -4.932666713424184e+06 4.633969063081723e+06 -2.838869101176789e+03 -4.534176840540276e+03 -5.527939623791080e+03 1.916450090400000e-03 7.309695889300000e-04 1.160647545600000e-03 2.437310812100000e-03 1.866936855500000e-03 3.281333858200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.600000000000000e+02 -1.170931598806262e+06 -4.932757395653203e+06 4.633858503168681e+06 -2.838853713361925e+03 -4.534047843550857e+03 -5.528053821241768e+03 1.916450090400000e-03 7.309695889300000e-04 1.160647545600000e-03 2.437310812100000e-03 1.866936855500000e-03 3.281333858200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.610000000000000e+02 -1.170988375729713e+06 -4.932848075325825e+06 4.633747940943372e+06 -2.838838323045793e+03 -4.533918842785497e+03 -5.528168017637177e+03 1.916450090400000e-03 7.309695889300000e-04 1.160647545600000e-03 2.437310812100000e-03 1.866936855500000e-03 3.281333858200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.620000000000000e+02 -1.171045152347420e+06 -4.932938752427900e+06 4.633637376436062e+06 -2.838822952783026e+03 -4.533790161190530e+03 -5.528281933011269e+03 1.916450090400000e-03 7.309695889300000e-04 1.160647545600000e-03 2.437310812100000e-03 1.866936855500000e-03 3.281333858200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.630000000000000e+02 -1.171101928645328e+06 -4.933029426937067e+06 4.633526809682422e+06 -2.838807594472756e+03 -4.533661692998925e+03 -5.528395659397963e+03 1.916450090400000e-03 7.309695889300000e-04 1.160647545600000e-03 2.437310812100000e-03 1.866936855500000e-03 3.281333858200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.640000000000000e+02 -1.171158704664810e+06 -4.933120098920972e+06 4.633416240579143e+06 -2.838792198020894e+03 -4.533532682185984e+03 -5.528509850946482e+03 1.916450090400000e-03 7.309695889300000e-04 1.160647545600000e-03 2.437310812100000e-03 1.866936855500000e-03 3.281333858200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.650000000000000e+02 -1.171215480355670e+06 -4.933210768286148e+06 4.633305669238415e+06 -2.838776801570437e+03 -4.533403672320815e+03 -5.528624036370416e+03 1.916450090400000e-03 7.309695889300000e-04 1.160647545600000e-03 2.437310812100000e-03 1.866936855500000e-03 3.281333858200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.660000000000000e+02 -1.171272255728966e+06 -4.933301435053229e+06 4.633195095635482e+06 -2.838761403273365e+03 -4.533274662215284e+03 -5.528738217491405e+03 1.916450090400000e-03 7.309695889300000e-04 1.160647545600000e-03 2.437310812100000e-03 1.866936855500000e-03 3.281333858200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.670000000000000e+02 -1.171329030795759e+06 -4.933392099242846e+06 4.633084519745574e+06 -2.838746002632724e+03 -4.533145650037216e+03 -5.528852396063012e+03 1.916403095400000e-03 7.306644525399999e-04 1.160819143800000e-03 2.436476883900000e-03 1.866812746700000e-03 3.282318970100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.680000000000000e+02 -1.171385805567351e+06 -4.933482760876016e+06 4.632973941543460e+06 -2.838730600964762e+03 -4.533016633575247e+03 -5.528966573342265e+03 1.916403095400000e-03 7.306644525399999e-04 1.160819143800000e-03 2.436476883900000e-03 1.866812746700000e-03 3.282318970100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.690000000000000e+02 -1.171442580043626e+06 -4.933573419952565e+06 4.632863361029346e+06 -2.838715196480159e+03 -4.532887613417141e+03 -5.529080749640234e+03 1.916403095400000e-03 7.306644525399999e-04 1.160819143800000e-03 2.436476883900000e-03 1.866812746700000e-03 3.282318970100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.700000000000000e+02 -1.171499354179764e+06 -4.933664076389114e+06 4.632752778303358e+06 -2.838699791080532e+03 -4.532758596525911e+03 -5.529194918288372e+03 1.916403095400000e-03 7.306644525399999e-04 1.160819143800000e-03 2.436476883900000e-03 1.866812746700000e-03 3.282318970100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.710000000000000e+02 -1.171556128031773e+06 -4.933754730289883e+06 4.632642193240344e+06 -2.838684384085841e+03 -4.532629573471685e+03 -5.529309087468044e+03 1.916403095400000e-03 7.306644525399999e-04 1.160819143800000e-03 2.436476883900000e-03 1.866812746700000e-03 3.282318970100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.720000000000000e+02 -1.171612901573593e+06 -4.933845381620971e+06 4.632531605895728e+06 -2.838668798704362e+03 -4.532500948585298e+03 -5.529422998731588e+03 1.916403095400000e-03 7.306644525399999e-04 1.160819143800000e-03 2.436476883900000e-03 1.866812746700000e-03 3.282318970100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.730000000000000e+02 -1.171669674795743e+06 -4.933936030374351e+06 4.632421016288907e+06 -2.838653096208484e+03 -4.532372586324184e+03 -5.529536737829148e+03 1.916403095400000e-03 7.306644525399999e-04 1.160819143800000e-03 2.436476883900000e-03 1.866812746700000e-03 3.282318970100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.740000000000000e+02 -1.171726447694254e+06 -4.934026676518496e+06 4.632310424433276e+06 -2.838637683481681e+03 -4.532243556987539e+03 -5.529650898802573e+03 1.916403095400000e-03 7.306644525399999e-04 1.160819143800000e-03 2.436476883900000e-03 1.866812746700000e-03 3.282318970100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.750000000000000e+02 -1.171783220297155e+06 -4.934117320105628e+06 4.632199830266129e+06 -2.838622267962735e+03 -4.532114523909561e+03 -5.529765058821041e+03 1.916403095400000e-03 7.306644525399999e-04 1.160819143800000e-03 2.436476883900000e-03 1.866812746700000e-03 3.282318970100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.760000000000000e+02 -1.171839992571041e+06 -4.934207961073571e+06 4.632089233862150e+06 -2.838606852344837e+03 -4.531985492000168e+03 -5.529879212577314e+03 1.916403095400000e-03 7.306644525399999e-04 1.160819143800000e-03 2.436476883900000e-03 1.866812746700000e-03 3.282318970100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.770000000000000e+02 -1.171896764560510e+06 -4.934298599505340e+06 4.631978635121617e+06 -2.838591433981583e+03 -4.531856454351886e+03 -5.529993367025540e+03 1.916356035800000e-03 7.303592379900000e-04 1.160990591400000e-03 2.435643024100000e-03 1.866688248000000e-03 3.283304115100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.780000000000000e+02 -1.171953536209556e+06 -4.934389235296768e+06 4.631868034169662e+06 -2.838576014284956e+03 -4.531727420126997e+03 -5.530107513882613e+03 1.916356035800000e-03 7.303592379900000e-04 1.160990591400000e-03 2.435643024100000e-03 1.866688248000000e-03 3.283304115100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.790000000000000e+02 -1.172010307596540e+06 -4.934479868593663e+06 4.631757430831142e+06 -2.838560592371788e+03 -4.531598376298026e+03 -5.530221664421426e+03 1.916356035800000e-03 7.303592379900000e-04 1.160990591400000e-03 2.435643024100000e-03 1.866688248000000e-03 3.283304115100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.800000000000000e+02 -1.172067078654292e+06 -4.934570499271062e+06 4.631646825256165e+06 -2.838545168846176e+03 -4.531469334051521e+03 -5.530335809031350e+03 1.916356035800000e-03 7.303592379900000e-04 1.160990591400000e-03 2.435643024100000e-03 1.866688248000000e-03 3.283304115100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.810000000000000e+02 -1.172123849393871e+06 -4.934661127349591e+06 4.631536217419959e+06 -2.838529743609350e+03 -4.531340291335026e+03 -5.530449949470507e+03 1.916356035800000e-03 7.303592379900000e-04 1.160990591400000e-03 2.435643024100000e-03 1.866688248000000e-03 3.283304115100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.820000000000000e+02 -1.172180619839827e+06 -4.934751752878908e+06 4.631425607279762e+06 -2.838514420495992e+03 -4.531211636655004e+03 -5.530563714882419e+03 1.916356035800000e-03 7.303592379900000e-04 1.160990591400000e-03 2.435643024100000e-03 1.866688248000000e-03 3.283304115100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.830000000000000e+02 -1.172237389946290e+06 -4.934842375776360e+06 4.631314994946084e+06 -2.838499164614165e+03 -4.531083245071190e+03 -5.530677225237603e+03 1.916356035800000e-03 7.303592379900000e-04 1.160990591400000e-03 2.435643024100000e-03 1.866688248000000e-03 3.283304115100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.840000000000000e+02 -1.172294159787169e+06 -4.934932996172830e+06 4.631204380233576e+06 -2.838483734207314e+03 -4.530954192350823e+03 -5.530791360370473e+03 1.916356035800000e-03 7.303592379900000e-04 1.160990591400000e-03 2.435643024100000e-03 1.866688248000000e-03 3.283304115100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.850000000000000e+02 -1.172350929332166e+06 -4.935023614011976e+06 4.631093763209921e+06 -2.838468301057922e+03 -4.530825135543493e+03 -5.530905494813764e+03 1.916356035800000e-03 7.303592379900000e-04 1.160990591400000e-03 2.435643024100000e-03 1.866688248000000e-03 3.283304115100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.860000000000000e+02 -1.172407698547638e+06 -4.935114229231242e+06 4.630983143950303e+06 -2.838452866506072e+03 -4.530696080315432e+03 -5.531019623237642e+03 1.916356035800000e-03 7.303592379900000e-04 1.160990591400000e-03 2.435643024100000e-03 1.866688248000000e-03 3.283304115100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.870000000000000e+02 -1.172464467433714e+06 -4.935204841830851e+06 4.630872522454459e+06 -2.838437432004209e+03 -4.530567026239581e+03 -5.531133745348128e+03 1.916308911700000e-03 7.300539451700000e-04 1.161161888700000e-03 2.434809232500000e-03 1.866563359400000e-03 3.284289293800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.880000000000000e+02 -1.172521236046152e+06 -4.935295451914587e+06 4.630761898597664e+06 -2.838421994136050e+03 -4.530437964708826e+03 -5.531247869859329e+03 1.916308911700000e-03 7.300539451700000e-04 1.161161888700000e-03 2.434809232500000e-03 1.866563359400000e-03 3.284289293800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.890000000000000e+02 -1.172578004362481e+06 -4.935386059440690e+06 4.630651272430108e+06 -2.838406553386064e+03 -4.530308899615299e+03 -5.531361993305560e+03 1.916308911700000e-03 7.300539451700000e-04 1.161161888700000e-03 2.434809232500000e-03 1.866563359400000e-03 3.284289293800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.900000000000000e+02 -1.172634772326963e+06 -4.935476664305428e+06 4.630540644076464e+06 -2.838391113701064e+03 -4.530179838825577e+03 -5.531476107353968e+03 1.916308911700000e-03 7.300539451700000e-04 1.161161888700000e-03 2.434809232500000e-03 1.866563359400000e-03 3.284289293800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.910000000000000e+02 -1.172691540006521e+06 -4.935567266633363e+06 4.630430013387017e+06 -2.838375670749730e+03 -4.530050772561325e+03 -5.531590222105180e+03 1.916308911700000e-03 7.300539451700000e-04 1.161161888700000e-03 2.434809232500000e-03 1.866563359400000e-03 3.284289293800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.920000000000000e+02 -1.172748307350982e+06 -4.935657866347280e+06 4.630319380464622e+06 -2.838359958130226e+03 -4.529922013117632e+03 -5.531704196330925e+03 1.916308911700000e-03 7.300539451700000e-04 1.161161888700000e-03 2.434809232500000e-03 1.866563359400000e-03 3.284289293800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.930000000000000e+02 -1.172805074392089e+06 -4.935748463516862e+06 4.630208745232150e+06 -2.838344066361132e+03 -4.529793449767618e+03 -5.531818081870466e+03 1.916308911700000e-03 7.300539451700000e-04 1.161161888700000e-03 2.434809232500000e-03 1.866563359400000e-03 3.284289293800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.940000000000000e+02 -1.172861841135118e+06 -4.935839058125239e+06 4.630098107693218e+06 -2.838328617324733e+03 -4.529664373641889e+03 -5.531932191557493e+03 1.916308911700000e-03 7.300539451700000e-04 1.161161888700000e-03 2.434809232500000e-03 1.866563359400000e-03 3.284289293800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.950000000000000e+02 -1.172918607525960e+06 -4.935929650071779e+06 4.629987467968798e+06 -2.838313167700806e+03 -4.529535302286453e+03 -5.532046292199363e+03 1.916308911700000e-03 7.300539451700000e-04 1.161161888700000e-03 2.434809232500000e-03 1.866563359400000e-03 3.284289293800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.960000000000000e+02 -1.172975373631787e+06 -4.936020239481434e+06 4.629876825908691e+06 -2.838297716587480e+03 -4.529406225200061e+03 -5.532160392961131e+03 1.916308911700000e-03 7.300539451700000e-04 1.161161888700000e-03 2.434809232500000e-03 1.866563359400000e-03 3.284289293800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.970000000000000e+02 -1.173032139430047e+06 -4.936110826312316e+06 4.629766181563242e+06 -2.838282262485241e+03 -4.529277146135861e+03 -5.532274491383416e+03 1.916261723000000e-03 7.297485741300000e-04 1.161333035700000e-03 2.433975509300000e-03 1.866438081100000e-03 3.285274506600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.980000000000000e+02 -1.173088904920877e+06 -4.936201410564650e+06 4.629655534932193e+06 -2.838266807859823e+03 -4.529148064547033e+03 -5.532388586817739e+03 1.916261723000000e-03 7.297485741300000e-04 1.161333035700000e-03 2.433975509300000e-03 1.866438081100000e-03 3.285274506600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.990000000000000e+02 -1.173145670126497e+06 -4.936291992279826e+06 4.629544885965766e+06 -2.838251349979527e+03 -4.529018977515313e+03 -5.532502682921848e+03 1.916261723000000e-03 7.297485741300000e-04 1.161333035700000e-03 2.433975509300000e-03 1.866438081100000e-03 3.285274506600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.000000000000000e+02 -1.173202434990930e+06 -4.936382571353746e+06 4.629434234789144e+06 -2.838235891166943e+03 -4.528889893618796e+03 -5.532616771500427e+03 1.916261723000000e-03 7.297485741300000e-04 1.161333035700000e-03 2.433975509300000e-03 1.866438081100000e-03 3.285274506600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.010000000000000e+02 -1.173259199558994e+06 -4.936473147869769e+06 4.629323581302088e+06 -2.838220431066320e+03 -4.528760805534964e+03 -5.532730858820491e+03 1.916261723000000e-03 7.297485741300000e-04 1.161333035700000e-03 2.433975509300000e-03 1.866438081100000e-03 3.285274506600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.020000000000000e+02 -1.173315963810116e+06 -4.936563721794691e+06 4.629212925562739e+06 -2.838205063292064e+03 -4.528632143417418e+03 -5.532844544198377e+03 1.916261723000000e-03 7.297485741300000e-04 1.161333035700000e-03 2.433975509300000e-03 1.866438081100000e-03 3.285274506600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.030000000000000e+02 -1.173372727749885e+06 -4.936654293142287e+06 4.629102267566605e+06 -2.838189755543937e+03 -4.528503762107792e+03 -5.532957963193769e+03 1.916261723000000e-03 7.297485741300000e-04 1.161333035700000e-03 2.433975509300000e-03 1.866438081100000e-03 3.285274506600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.040000000000000e+02 -1.173429491359338e+06 -4.936744861868904e+06 4.628991607335920e+06 -2.838174291087234e+03 -4.528374671054363e+03 -5.533072038954011e+03 1.916261723000000e-03 7.297485741300000e-04 1.161333035700000e-03 2.433975509300000e-03 1.866438081100000e-03 3.285274506600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.050000000000000e+02 -1.173486254683374e+06 -4.936835428058102e+06 4.628880944770175e+06 -2.838158823483017e+03 -4.528245574408880e+03 -5.533186115459751e+03 1.916261723000000e-03 7.297485741300000e-04 1.161333035700000e-03 2.433975509300000e-03 1.866438081100000e-03 3.285274506600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.060000000000000e+02 -1.173543017699528e+06 -4.936925991668137e+06 4.628770279919581e+06 -2.838143353618029e+03 -4.528116475808305e+03 -5.533300189280877e+03 1.916261723000000e-03 7.297485741300000e-04 1.161333035700000e-03 2.433975509300000e-03 1.866438081100000e-03 3.285274506600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.070000000000000e+02 -1.173599780407931e+06 -4.937016552699233e+06 4.628659612783877e+06 -2.838127883035237e+03 -4.527987374828289e+03 -5.533414260080197e+03 1.916214469900000e-03 7.294431248400000e-04 1.161504032700000e-03 2.433141854400000e-03 1.866312412900000e-03 3.286259754100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.080000000000000e+02 -1.173656542819552e+06 -4.937107111171862e+06 4.628548943338433e+06 -2.838112409122952e+03 -4.527858270014689e+03 -5.533528330239678e+03 1.916214469900000e-03 7.294431248400000e-04 1.161504032700000e-03 2.433141854400000e-03 1.866312412900000e-03 3.286259754100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.090000000000000e+02 -1.173713304912180e+06 -4.937197667044679e+06 4.628438271632981e+06 -2.838096935040533e+03 -4.527729164601804e+03 -5.533642395647862e+03 1.916214469900000e-03 7.294431248400000e-04 1.161504032700000e-03 2.433141854400000e-03 1.866312412900000e-03 3.286259754100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.100000000000000e+02 -1.173770066696867e+06 -4.937288220338293e+06 4.628327597642740e+06 -2.838081458589359e+03 -4.527600057128318e+03 -5.533756458507765e+03 1.916214469900000e-03 7.294431248400000e-04 1.161504032700000e-03 2.433141854400000e-03 1.866312412900000e-03 3.286259754100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.110000000000000e+02 -1.173826828173498e+06 -4.937378771052533e+06 4.628216921367922e+06 -2.838065979941718e+03 -4.527470947749088e+03 -5.533870518613145e+03 1.916214469900000e-03 7.294431248400000e-04 1.161504032700000e-03 2.433141854400000e-03 1.866312412900000e-03 3.286259754100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.120000000000000e+02 -1.173883589337707e+06 -4.937469319194195e+06 4.628106242811725e+06 -2.838050275725150e+03 -4.527342164688628e+03 -5.533984402373073e+03 1.916214469900000e-03 7.294431248400000e-04 1.161504032700000e-03 2.433141854400000e-03 1.866312412900000e-03 3.286259754100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.130000000000000e+02 -1.173940350172330e+06 -4.937559864741279e+06 4.627995562008154e+06 -2.838034421005966e+03 -4.527213598711318e+03 -5.534098167246038e+03 1.916214469900000e-03 7.294431248400000e-04 1.161504032700000e-03 2.433141854400000e-03 1.866312412900000e-03 3.286259754100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.140000000000000e+02 -1.173997110705166e+06 -4.937650407720714e+06 4.627884878905904e+06 -2.838018937076555e+03 -4.527084482855391e+03 -5.534212219120732e+03 1.916214469900000e-03 7.294431248400000e-04 1.161504032700000e-03 2.433141854400000e-03 1.866312412900000e-03 3.286259754100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.150000000000000e+02 -1.174053870918791e+06 -4.937740948100082e+06 4.627774193543977e+06 -2.838003452511045e+03 -4.526955366209408e+03 -5.534326266612436e+03 1.916214469900000e-03 7.294431248400000e-04 1.161504032700000e-03 2.433141854400000e-03 1.866312412900000e-03 3.286259754100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.160000000000000e+02 -1.174110630846614e+06 -4.937831485941540e+06 4.627663505847583e+06 -2.837987965255639e+03 -4.526826243983796e+03 -5.534440314632566e+03 1.916214469900000e-03 7.294431248400000e-04 1.161504032700000e-03 2.433141854400000e-03 1.866312412900000e-03 3.286259754100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.170000000000000e+02 -1.174167390454993e+06 -4.937922021182586e+06 4.627552815891935e+06 -2.837972475897496e+03 -4.526697121400866e+03 -5.534554358565700e+03 1.916167152500000e-03 7.291375972000000e-04 1.161674879600000e-03 2.432308267800000e-03 1.866186355100000e-03 3.287245037000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.180000000000000e+02 -1.174224149766401e+06 -4.938012553864981e+06 4.627442123626774e+06 -2.837956985450230e+03 -4.526567994666313e+03 -5.534668401120146e+03 1.916167152500000e-03 7.291375972000000e-04 1.161674879600000e-03 2.432308267800000e-03 1.866186355100000e-03 3.287245037000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.190000000000000e+02 -1.174280908758380e+06 -4.938103083947008e+06 4.627331429102315e+06 -2.837941493097833e+03 -4.526438867828841e+03 -5.534782439287274e+03 1.916167152500000e-03 7.291375972000000e-04 1.161674879600000e-03 2.432308267800000e-03 1.866186355100000e-03 3.287245037000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.200000000000000e+02 -1.174337667430813e+06 -4.938193611428494e+06 4.627220732318763e+06 -2.837925998936802e+03 -4.526309740271295e+03 -5.534896473538370e+03 1.916167152500000e-03 7.291375972000000e-04 1.161674879600000e-03 2.432308267800000e-03 1.866186355100000e-03 3.287245037000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.210000000000000e+02 -1.174394425795000e+06 -4.938284136330433e+06 4.627110033250868e+06 -2.837910503947951e+03 -4.526180610848811e+03 -5.535010504388450e+03 1.916167152500000e-03 7.291375972000000e-04 1.161674879600000e-03 2.432308267800000e-03 1.866186355100000e-03 3.287245037000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.220000000000000e+02 -1.174451183886796e+06 -4.938374658722389e+06 4.626999331831391e+06 -2.837895131995696e+03 -4.526051851254866e+03 -5.535124166682923e+03 1.916167152500000e-03 7.291375972000000e-04 1.161674879600000e-03 2.432308267800000e-03 1.866186355100000e-03 3.287245037000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.230000000000000e+02 -1.174507941621227e+06 -4.938465178448201e+06 4.626888628259265e+06 -2.837879845022010e+03 -4.525923346694341e+03 -5.535237573130557e+03 1.916167152500000e-03 7.291375972000000e-04 1.161674879600000e-03 2.432308267800000e-03 1.866186355100000e-03 3.287245037000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.240000000000000e+02 -1.174564699055478e+06 -4.938555695609552e+06 4.626777922384628e+06 -2.837864343831934e+03 -4.525794208717712e+03 -5.535351597888840e+03 1.916167152500000e-03 7.291375972000000e-04 1.161674879600000e-03 2.432308267800000e-03 1.866186355100000e-03 3.287245037000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.250000000000000e+02 -1.174621456147667e+06 -4.938646210128611e+06 4.626667214301202e+06 -2.837848841775130e+03 -4.525665074295453e+03 -5.535465614748939e+03 1.916167152500000e-03 7.291375972000000e-04 1.161674879600000e-03 2.432308267800000e-03 1.866186355100000e-03 3.287245037000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.260000000000000e+02 -1.174678212976112e+06 -4.938736722150980e+06 4.626556503833670e+06 -2.837833337025443e+03 -4.525535930218221e+03 -5.535579635532459e+03 1.916167152500000e-03 7.291375972000000e-04 1.161674879600000e-03 2.432308267800000e-03 1.866186355100000e-03 3.287245037000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.270000000000000e+02 -1.174734969507190e+06 -4.938827231614182e+06 4.626445791057263e+06 -2.837817829842948e+03 -4.525406782303596e+03 -5.535693655276204e+03 1.916119770900000e-03 7.288319913100000e-04 1.161845576800000e-03 2.431474749700000e-03 1.866059907600000e-03 3.288230355500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.280000000000000e+02 -1.174791725696099e+06 -4.938917738434958e+06 4.626335076072223e+06 -2.837802321524310e+03 -4.525277637752196e+03 -5.535807667401987e+03 1.916119770900000e-03 7.288319913100000e-04 1.161845576800000e-03 2.431474749700000e-03 1.866059907600000e-03 3.288230355500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.290000000000000e+02 -1.174848481609988e+06 -4.939008242738143e+06 4.626224358728247e+06 -2.837786811216121e+03 -4.525148485451136e+03 -5.535921681548255e+03 1.916119770900000e-03 7.288319913100000e-04 1.161845576800000e-03 2.431474749700000e-03 1.866059907600000e-03 3.288230355500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.300000000000000e+02 -1.174905237192892e+06 -4.939098744419720e+06 4.626113639150579e+06 -2.837771299441619e+03 -4.525019334506330e+03 -5.536035689896309e+03 1.916119770900000e-03 7.288319913100000e-04 1.161845576800000e-03 2.431474749700000e-03 1.866059907600000e-03 3.288230355500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.310000000000000e+02 -1.174961992444691e+06 -4.939189243479520e+06 4.626002917339445e+06 -2.837755786199863e+03 -4.524890185355167e+03 -5.536149692082727e+03 1.916119770900000e-03 7.288319913100000e-04 1.161845576800000e-03 2.431474749700000e-03 1.866059907600000e-03 3.288230355500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.320000000000000e+02 -1.175018747371381e+06 -4.939279739948890e+06 4.625892193275807e+06 -2.837740007177711e+03 -4.524761553069987e+03 -5.536263377442824e+03 1.916119770900000e-03 7.288319913100000e-04 1.161845576800000e-03 2.431474749700000e-03 1.866059907600000e-03 3.288230355500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.330000000000000e+02 -1.175075502041684e+06 -4.939370233969095e+06 4.625781466801972e+06 -2.837724046670771e+03 -4.524633252222796e+03 -5.536376862709598e+03 1.916119770900000e-03 7.288319913100000e-04 1.161845576800000e-03 2.431474749700000e-03 1.866059907600000e-03 3.288230355500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.340000000000000e+02 -1.175132256344472e+06 -4.939460725299857e+06 4.625670738176171e+06 -2.837708529150790e+03 -4.524504096065987e+03 -5.536490856686933e+03 1.916119770900000e-03 7.288319913100000e-04 1.161845576800000e-03 2.431474749700000e-03 1.866059907600000e-03 3.288230355500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.350000000000000e+02 -1.175189010371948e+06 -4.939551214112623e+06 4.625560007191903e+06 -2.837693008167270e+03 -4.524374932630046e+03 -5.536604852951354e+03 1.916119770900000e-03 7.288319913100000e-04 1.161845576800000e-03 2.431474749700000e-03 1.866059907600000e-03 3.288230355500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.360000000000000e+02 -1.175245764079316e+06 -4.939641700324162e+06 4.625449273949430e+06 -2.837677485394799e+03 -4.524245768905388e+03 -5.536718844932573e+03 1.916119770900000e-03 7.288319913100000e-04 1.161845576800000e-03 2.431474749700000e-03 1.866059907600000e-03 3.288230355500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.370000000000000e+02 -1.175302517500209e+06 -4.939732183996984e+06 4.625338538373453e+06 -2.837661960942601e+03 -4.524116599190371e+03 -5.536832837328963e+03 1.916072325100000e-03 7.285263070500000e-04 1.162016124200000e-03 2.430641299900000e-03 1.865933070500000e-03 3.289215710400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.380000000000000e+02 -1.175359270589836e+06 -4.939822665047858e+06 4.625227800564227e+06 -2.837646434994882e+03 -4.523987430989592e+03 -5.536946823809834e+03 1.916072325100000e-03 7.285263070500000e-04 1.162016124200000e-03 2.430641299900000e-03 1.865933070500000e-03 3.289215710400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.390000000000000e+02 -1.175416023359248e+06 -4.939913143497380e+06 4.625117060496962e+06 -2.837630907363830e+03 -4.523858262570667e+03 -5.537060805901870e+03 1.916072325100000e-03 7.285263070500000e-04 1.162016124200000e-03 2.430641299900000e-03 1.865933070500000e-03 3.289215710400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.400000000000000e+02 -1.175472775819741e+06 -4.940003619366527e+06 4.625006318146381e+06 -2.837615378746794e+03 -4.523729091691795e+03 -5.537174785159496e+03 1.916072325100000e-03 7.285263070500000e-04 1.162016124200000e-03 2.430641299900000e-03 1.865933070500000e-03 3.289215710400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.410000000000000e+02 -1.175529527982371e+06 -4.940094092675887e+06 4.624895573487679e+06 -2.837599847672433e+03 -4.523599916912130e+03 -5.537288763440370e+03 1.916072325100000e-03 7.285263070500000e-04 1.162016124200000e-03 2.430641299900000e-03 1.865933070500000e-03 3.289215710400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.420000000000000e+02 -1.175586279826104e+06 -4.940184563387034e+06 4.624784826574453e+06 -2.837584385726535e+03 -4.523470905342116e+03 -5.537402569595098e+03 1.916072325100000e-03 7.285263070500000e-04 1.162016124200000e-03 2.430641299900000e-03 1.865933070500000e-03 3.289215710400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.430000000000000e+02 -1.175643031354351e+06 -4.940275031506700e+06 4.624674077403424e+06 -2.837568970195571e+03 -4.523341999474260e+03 -5.537516261656926e+03 1.916072325100000e-03 7.285263070500000e-04 1.162016124200000e-03 2.430641299900000e-03 1.865933070500000e-03 3.289215710400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.440000000000000e+02 -1.175699782570332e+06 -4.940365497039879e+06 4.624563325956458e+06 -2.837553433676062e+03 -4.523212818345023e+03 -5.537630231644457e+03 1.916072325100000e-03 7.285263070500000e-04 1.162016124200000e-03 2.430641299900000e-03 1.865933070500000e-03 3.289215710400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.450000000000000e+02 -1.175756533488222e+06 -4.940455960012961e+06 4.624452572201746e+06 -2.837537894435288e+03 -4.523083633303375e+03 -5.537744200782526e+03 1.916072325100000e-03 7.285263070500000e-04 1.162016124200000e-03 2.430641299900000e-03 1.865933070500000e-03 3.289215710400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.460000000000000e+02 -1.175813284085815e+06 -4.940546420384654e+06 4.624341816189062e+06 -2.837522354975728e+03 -4.522954447721712e+03 -5.537858165144890e+03 1.916072325100000e-03 7.285263070500000e-04 1.162016124200000e-03 2.430641299900000e-03 1.865933070500000e-03 3.289215710400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.470000000000000e+02 -1.175870034385253e+06 -4.940636878196166e+06 4.624231057868741e+06 -2.837506812428144e+03 -4.522825258399477e+03 -5.537972128678703e+03 1.916024815300000e-03 7.282205444900000e-04 1.162186522100000e-03 2.429807918700000e-03 1.865805843800000e-03 3.290201102000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.480000000000000e+02 -1.175926784353150e+06 -4.940727333385437e+06 4.624120297315572e+06 -2.837491269670093e+03 -4.522696069936750e+03 -5.538086086268673e+03 1.916024815300000e-03 7.282205444900000e-04 1.162186522100000e-03 2.429807918700000e-03 1.865805843800000e-03 3.290201102000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.490000000000000e+02 -1.175983534022897e+06 -4.940817786014574e+06 4.624009534454722e+06 -2.837475724315399e+03 -4.522566878207052e+03 -5.538200042416177e+03 1.916024815300000e-03 7.282205444900000e-04 1.162186522100000e-03 2.429807918700000e-03 1.865805843800000e-03 3.290201102000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.500000000000000e+02 -1.176040283372046e+06 -4.940908236041889e+06 4.623898769336433e+06 -2.837460177259643e+03 -4.522437685830378e+03 -5.538313994540504e+03 1.916024815300000e-03 7.282205444900000e-04 1.162186522100000e-03 2.429807918700000e-03 1.865805843800000e-03 3.290201102000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.510000000000000e+02 -1.176097032423054e+06 -4.940998683509102e+06 4.623788001910406e+06 -2.837444628799514e+03 -4.522308489127788e+03 -5.538427945570066e+03 1.916024815300000e-03 7.282205444900000e-04 1.162186522100000e-03 2.429807918700000e-03 1.865805843800000e-03 3.290201102000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.520000000000000e+02 -1.176153781149712e+06 -4.941089128385573e+06 4.623677232234369e+06 -2.837428890370758e+03 -4.522179843691722e+03 -5.538541517585916e+03 1.916024815300000e-03 7.282205444900000e-04 1.162186522100000e-03 2.429807918700000e-03 1.865805843800000e-03 3.290201102000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.530000000000000e+02 -1.176210529557112e+06 -4.941179570692773e+06 4.623566460296229e+06 -2.837413024479209e+03 -4.522051561990952e+03 -5.538654838696844e+03 1.916024815300000e-03 7.282205444900000e-04 1.162186522100000e-03 2.429807918700000e-03 1.865805843800000e-03 3.290201102000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.540000000000000e+02 -1.176267277654430e+06 -4.941270010417743e+06 4.623455686077037e+06 -2.837397470922285e+03 -4.521922358788325e+03 -5.538768781463265e+03 1.916024815300000e-03 7.282205444900000e-04 1.162186522100000e-03 2.429807918700000e-03 1.865805843800000e-03 3.290201102000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.550000000000000e+02 -1.176324025442219e+06 -4.941360447561554e+06 4.623344909575502e+06 -2.837381915053363e+03 -4.521793153725582e+03 -5.538882721489161e+03 1.916024815300000e-03 7.282205444900000e-04 1.162186522100000e-03 2.429807918700000e-03 1.865805843800000e-03 3.290201102000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.560000000000000e+02 -1.176380772953865e+06 -4.941450882186297e+06 4.623234130716769e+06 -2.837366355553218e+03 -4.521663941443398e+03 -5.538996663822491e+03 1.916024815300000e-03 7.282205444900000e-04 1.162186522100000e-03 2.429807918700000e-03 1.865805843800000e-03 3.290201102000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.570000000000000e+02 -1.176437520100156e+06 -4.941541314126167e+06 4.623123349700763e+06 -2.837350797517883e+03 -4.521534735541898e+03 -5.539110594871401e+03 1.915977241500000e-03 7.279147035700000e-04 1.162356770500000e-03 2.428974605900000e-03 1.865678227700000e-03 3.291186530900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.580000000000000e+02 -1.176494266981400e+06 -4.941631743567626e+06 4.623012566302639e+06 -2.837335234974877e+03 -4.521405520468032e+03 -5.539224530243863e+03 1.915977241500000e-03 7.279147035700000e-04 1.162356770500000e-03 2.428974605900000e-03 1.865678227700000e-03 3.291186530900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.590000000000000e+02 -1.176551013530722e+06 -4.941722170386386e+06 4.622901780672283e+06 -2.837319672518042e+03 -4.521276306801448e+03 -5.539338459085668e+03 1.915977241500000e-03 7.279147035700000e-04 1.162356770500000e-03 2.428974605900000e-03 1.865678227700000e-03 3.291186530900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.600000000000000e+02 -1.176607759748004e+06 -4.941812594582275e+06 4.622790992809899e+06 -2.837304108499238e+03 -4.521147094350264e+03 -5.539452382293842e+03 1.915977241500000e-03 7.279147035700000e-04 1.162356770500000e-03 2.428974605900000e-03 1.865678227700000e-03 3.291186530900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.610000000000000e+02 -1.176664505677799e+06 -4.941903016238119e+06 4.622680202615617e+06 -2.837288541632617e+03 -4.521017876557835e+03 -5.539566305896398e+03 1.915977241500000e-03 7.279147035700000e-04 1.162356770500000e-03 2.428974605900000e-03 1.865678227700000e-03 3.291186530900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.620000000000000e+02 -1.176721251301090e+06 -4.941993435318035e+06 4.622569410145113e+06 -2.837273133080033e+03 -4.520888925877040e+03 -5.539679931244406e+03 1.915977241500000e-03 7.279147035700000e-04 1.162356770500000e-03 2.428974605900000e-03 1.865678227700000e-03 3.291186530900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.630000000000000e+02 -1.176777996615867e+06 -4.942083851817995e+06 4.622458615411481e+06 -2.837257827662698e+03 -4.520760151997376e+03 -5.539793358128603e+03 1.915977241500000e-03 7.279147035700000e-04 1.162356770500000e-03 2.428974605900000e-03 1.865678227700000e-03 3.291186530900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.640000000000000e+02 -1.176834741603062e+06 -4.942174265703481e+06 4.622347818435727e+06 -2.837242255897207e+03 -4.520630929545761e+03 -5.539907271805603e+03 1.915977241500000e-03 7.279147035700000e-04 1.162356770500000e-03 2.428974605900000e-03 1.865678227700000e-03 3.291186530900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.650000000000000e+02 -1.176891486313956e+06 -4.942264677069750e+06 4.622237019102933e+06 -2.837226681849956e+03 -4.520501699083946e+03 -5.540021187842368e+03 1.915977241500000e-03 7.279147035700000e-04 1.162356770500000e-03 2.428974605900000e-03 1.865678227700000e-03 3.291186530900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.660000000000000e+02 -1.176948230670268e+06 -4.942355085771396e+06 4.622126217588506e+06 -2.837211107448246e+03 -4.520372473692245e+03 -5.540135094501279e+03 1.915977241500000e-03 7.279147035700000e-04 1.162356770500000e-03 2.428974605900000e-03 1.865678227700000e-03 3.291186530900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.670000000000000e+02 -1.177004974761213e+06 -4.942445491974228e+06 4.622015413692438e+06 -2.837195528999207e+03 -4.520243239320646e+03 -5.540249005115114e+03 1.915929603700000e-03 7.276087842200000e-04 1.162526869600000e-03 2.428141361500000e-03 1.865550222000000e-03 3.292171997700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.680000000000000e+02 -1.177061718508750e+06 -4.942535895533228e+06 4.621904607589664e+06 -2.837179951039190e+03 -4.520114007722080e+03 -5.540362907884318e+03 1.915929603700000e-03 7.276087842200000e-04 1.162526869600000e-03 2.428141361500000e-03 1.865550222000000e-03 3.292171997700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.690000000000000e+02 -1.177118461957433e+06 -4.942626296531216e+06 4.621793799180274e+06 -2.837164370424090e+03 -4.519984772368730e+03 -5.540476809641661e+03 1.915929603700000e-03 7.276087842200000e-04 1.162526869600000e-03 2.428141361500000e-03 1.865550222000000e-03 3.292171997700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.700000000000000e+02 -1.177175205084810e+06 -4.942716694926518e+06 4.621682988514555e+06 -2.837148787912166e+03 -4.519855536734469e+03 -5.540590707160273e+03 1.915929603700000e-03 7.276087842200000e-04 1.162526869600000e-03 2.428141361500000e-03 1.865550222000000e-03 3.292171997700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.710000000000000e+02 -1.177231947924504e+06 -4.942807090781593e+06 4.621572175517143e+06 -2.837133203792161e+03 -4.519726295081897e+03 -5.540704605080367e+03 1.915929603700000e-03 7.276087842200000e-04 1.162526869600000e-03 2.428141361500000e-03 1.865550222000000e-03 3.292171997700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.720000000000000e+02 -1.177288690405333e+06 -4.942897483980070e+06 4.621461360343771e+06 -2.837117418739598e+03 -4.519597478193144e+03 -5.540818234425570e+03 1.915929603700000e-03 7.276087842200000e-04 1.162526869600000e-03 2.428141361500000e-03 1.865550222000000e-03 3.292171997700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.730000000000000e+02 -1.177345432607189e+06 -4.942987874680838e+06 4.621350542812869e+06 -2.837101498768670e+03 -4.519468929983126e+03 -5.540931695453717e+03 1.915929603700000e-03 7.276087842200000e-04 1.162526869600000e-03 2.428141361500000e-03 1.865550222000000e-03 3.292171997700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.740000000000000e+02 -1.177402174499048e+06 -4.943078262800012e+06 4.621239723000194e+06 -2.837085908313816e+03 -4.519339680416045e+03 -5.541045586829892e+03 1.915929603700000e-03 7.276087842200000e-04 1.162526869600000e-03 2.428141361500000e-03 1.865550222000000e-03 3.292171997700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.750000000000000e+02 -1.177458916035933e+06 -4.943168648254064e+06 4.621128901006553e+06 -2.837070317594600e+03 -4.519210435670449e+03 -5.541159468997357e+03 1.915929603700000e-03 7.276087842200000e-04 1.162526869600000e-03 2.428141361500000e-03 1.865550222000000e-03 3.292171997700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.760000000000000e+02 -1.177515657284958e+06 -4.943259031167667e+06 4.621018076681493e+06 -2.837054724987367e+03 -4.519081185082334e+03 -5.541273351544738e+03 1.915929603700000e-03 7.276087842200000e-04 1.162526869600000e-03 2.428141361500000e-03 1.865550222000000e-03 3.292171997700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.770000000000000e+02 -1.177572398234844e+06 -4.943349411519905e+06 4.620907250050247e+06 -2.837039129831022e+03 -4.518951930445373e+03 -5.541387233276538e+03 1.915881902200000e-03 7.273027865200000e-04 1.162696819600000e-03 2.427308185800000e-03 1.865421826900000e-03 3.293157502900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.780000000000000e+02 -1.177629138885474e+06 -4.943439789310598e+06 4.620796421113043e+06 -2.837023531995026e+03 -4.518822672354131e+03 -5.541501113756790e+03 1.915881902200000e-03 7.273027865200000e-04 1.162696819600000e-03 2.427308185800000e-03 1.865421826900000e-03 3.293157502900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.790000000000000e+02 -1.177685879181149e+06 -4.943530164436262e+06 4.620685589994780e+06 -2.837007935082991e+03 -4.518693418609746e+03 -5.541614984892848e+03 1.915881902200000e-03 7.273027865200000e-04 1.162696819600000e-03 2.427308185800000e-03 1.865421826900000e-03 3.293157502900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.800000000000000e+02 -1.177742619199909e+06 -4.943620537041910e+06 4.620574756520431e+06 -2.836992334586223e+03 -4.518564157735580e+03 -5.541728858236012e+03 1.915881902200000e-03 7.273027865200000e-04 1.162696819600000e-03 2.427308185800000e-03 1.865421826900000e-03 3.293157502900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.810000000000000e+02 -1.177799358885810e+06 -4.943710907023667e+06 4.620463920815385e+06 -2.836976732674644e+03 -4.518434898317739e+03 -5.541842725682380e+03 1.915881902200000e-03 7.273027865200000e-04 1.162696819600000e-03 2.427308185800000e-03 1.865421826900000e-03 3.293157502900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.820000000000000e+02 -1.177856098249895e+06 -4.943801274410027e+06 4.620353082860474e+06 -2.836961117609916e+03 -4.518306014487479e+03 -5.541956281632905e+03 1.915881902200000e-03 7.273027865200000e-04 1.162696819600000e-03 2.427308185800000e-03 1.865421826900000e-03 3.293157502900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.830000000000000e+02 -1.177912837297382e+06 -4.943891639216062e+06 4.620242242647623e+06 -2.836945491336409e+03 -4.518177378691284e+03 -5.542069631214431e+03 1.915881902200000e-03 7.273027865200000e-04 1.162696819600000e-03 2.427308185800000e-03 1.865421826900000e-03 3.293157502900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.840000000000000e+02 -1.177969576047804e+06 -4.943982001464706e+06 4.620131400123787e+06 -2.836929884783249e+03 -4.518048110459461e+03 -5.542183492085639e+03 1.915881902200000e-03 7.273027865200000e-04 1.162696819600000e-03 2.427308185800000e-03 1.865421826900000e-03 3.293157502900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.850000000000000e+02 -1.178026314487637e+06 -4.944072361130900e+06 4.620020555319245e+06 -2.836914275769487e+03 -4.517918840570239e+03 -5.542297350114528e+03 1.915881902200000e-03 7.273027865200000e-04 1.162696819600000e-03 2.427308185800000e-03 1.865421826900000e-03 3.293157502900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.860000000000000e+02 -1.178083052650261e+06 -4.944162718276668e+06 4.619909708159095e+06 -2.836898663530790e+03 -4.517789563162539e+03 -5.542411210511034e+03 1.915881902200000e-03 7.273027865200000e-04 1.162696819600000e-03 2.427308185800000e-03 1.865421826900000e-03 3.293157502900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.870000000000000e+02 -1.178139790468811e+06 -4.944253072777820e+06 4.619798858793299e+06 -2.836883051424940e+03 -4.517660288773413e+03 -5.542525063022260e+03 1.915834136900000e-03 7.269967103700000e-04 1.162866620500000e-03 2.426475078500000e-03 1.865293042500000e-03 3.294143047000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.880000000000000e+02 -1.178196527943181e+06 -4.944343424634185e+06 4.619688007222073e+06 -2.836867438675885e+03 -4.517531017471477e+03 -5.542638907938633e+03 1.915834136900000e-03 7.269967103700000e-04 1.162866620500000e-03 2.426475078500000e-03 1.865293042500000e-03 3.294143047000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.890000000000000e+02 -1.178253265151395e+06 -4.944433773990729e+06 4.619577153270361e+06 -2.836851821716134e+03 -4.517401737209934e+03 -5.542752756859652e+03 1.915834136900000e-03 7.269967103700000e-04 1.162866620500000e-03 2.426475078500000e-03 1.865293042500000e-03 3.294143047000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.900000000000000e+02 -1.178310002048925e+06 -4.944524120764730e+06 4.619466297038053e+06 -2.836836204064289e+03 -4.517272454456023e+03 -5.542866602841618e+03 1.915834136900000e-03 7.269967103700000e-04 1.162866620500000e-03 2.426475078500000e-03 1.865293042500000e-03 3.294143047000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.910000000000000e+02 -1.178366738624491e+06 -4.944614464935280e+06 4.619355438550401e+06 -2.836820584542579e+03 -4.517143171340818e+03 -5.542980444640980e+03 1.915834136900000e-03 7.269967103700000e-04 1.162866620500000e-03 2.426475078500000e-03 1.865293042500000e-03 3.294143047000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.920000000000000e+02 -1.178423474873752e+06 -4.944704806507966e+06 4.619244577810504e+06 -2.836804751757510e+03 -4.517014175719457e+03 -5.543094137639641e+03 1.915834136900000e-03 7.269967103700000e-04 1.162866620500000e-03 2.426475078500000e-03 1.865293042500000e-03 3.294143047000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.930000000000000e+02 -1.178480210788637e+06 -4.944795145476801e+06 4.619133714832102e+06 -2.836788778408086e+03 -4.516885369739545e+03 -5.543207730627068e+03 1.915834136900000e-03 7.269967103700000e-04 1.162866620500000e-03 2.426475078500000e-03 1.865293042500000e-03 3.294143047000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.940000000000000e+02 -1.178536946411622e+06 -4.944885481898083e+06 4.619022849530850e+06 -2.836773153142477e+03 -4.516756078372077e+03 -5.543321565861787e+03 1.915834136900000e-03 7.269967103700000e-04 1.162866620500000e-03 2.426475078500000e-03 1.865293042500000e-03 3.294143047000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.950000000000000e+02 -1.178593681712423e+06 -4.944975815715623e+06 4.618911981974638e+06 -2.836757526168096e+03 -4.516626787094574e+03 -5.543435396467550e+03 1.915834136900000e-03 7.269967103700000e-04 1.162866620500000e-03 2.426475078500000e-03 1.865293042500000e-03 3.294143047000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.960000000000000e+02 -1.178650416691165e+06 -4.945066146929625e+06 4.618801112163201e+06 -2.836741898713377e+03 -4.516497494688285e+03 -5.543549222907779e+03 1.915834136900000e-03 7.269967103700000e-04 1.162866620500000e-03 2.426475078500000e-03 1.865293042500000e-03 3.294143047000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.970000000000000e+02 -1.178707151381142e+06 -4.945156475601991e+06 4.618690240021783e+06 -2.836726267713366e+03 -4.516368197305806e+03 -5.543663049745724e+03 1.915786308000000e-03 7.266905558200000e-04 1.163036272500000e-03 2.425642039900000e-03 1.865163868700000e-03 3.295128630400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.980000000000000e+02 -1.178763885748991e+06 -4.945246801670735e+06 4.618579365625247e+06 -2.836710636373125e+03 -4.516238898888639e+03 -5.543776872277394e+03 1.915786308000000e-03 7.266905558200000e-04 1.163036272500000e-03 2.425642039900000e-03 1.865163868700000e-03 3.295128630400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.990000000000000e+02 -1.178820619805758e+06 -4.945337125156416e+06 4.618468488948768e+06 -2.836695002782878e+03 -4.516109598518797e+03 -5.543890692118001e+03 1.915786308000000e-03 7.266905558200000e-04 1.163036272500000e-03 2.425642039900000e-03 1.865163868700000e-03 3.295128630400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.000000000000000e+02 -1.178877353562489e+06 -4.945427446079592e+06 4.618357609967509e+06 -2.836679366456229e+03 -4.515980294424697e+03 -5.544004510955315e+03 1.915786308000000e-03 7.266905558200000e-04 1.163036272500000e-03 2.425642039900000e-03 1.865163868700000e-03 3.295128630400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.010000000000000e+02 -1.178934086974659e+06 -4.945517764357566e+06 4.618246728781398e+06 -2.836663730619545e+03 -4.515850993220522e+03 -5.544118321858204e+03 1.915786308000000e-03 7.266905558200000e-04 1.163036272500000e-03 2.425642039900000e-03 1.865163868700000e-03 3.295128630400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.020000000000000e+02 -1.178990820100996e+06 -4.945608080101999e+06 4.618135845273538e+06 -2.836648242746400e+03 -4.515722095507655e+03 -5.544231726450035e+03 1.915786308000000e-03 7.266905558200000e-04 1.163036272500000e-03 2.425642039900000e-03 1.865163868700000e-03 3.295128630400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.030000000000000e+02 -1.179047552902790e+06 -4.945698393242766e+06 4.618024959540632e+06 -2.836632853309185e+03 -4.515593469056472e+03 -5.544344856635176e+03 1.915786308000000e-03 7.266905558200000e-04 1.163036272500000e-03 2.425642039900000e-03 1.865163868700000e-03 3.295128630400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.040000000000000e+02 -1.179104285384221e+06 -4.945788703783333e+06 4.617914071548514e+06 -2.836617211860006e+03 -4.515464159593885e+03 -5.544458660947841e+03 1.915786308000000e-03 7.266905558200000e-04 1.163036272500000e-03 2.425642039900000e-03 1.865163868700000e-03 3.295128630400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.050000000000000e+02 -1.179161017565519e+06 -4.945879011761302e+06 4.617803181251728e+06 -2.836601567515332e+03 -4.515334846283374e+03 -5.544572464430699e+03 1.915786308000000e-03 7.266905558200000e-04 1.163036272500000e-03 2.425642039900000e-03 1.865163868700000e-03 3.295128630400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.060000000000000e+02 -1.179217749435410e+06 -4.945969317155782e+06 4.617692288675538e+06 -2.836585921146353e+03 -4.515205531046840e+03 -5.544686265099603e+03 1.915786308000000e-03 7.266905558200000e-04 1.163036272500000e-03 2.425642039900000e-03 1.865163868700000e-03 3.295128630400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.070000000000000e+02 -1.179274481016344e+06 -4.946059620008434e+06 4.617581393769584e+06 -2.836570273122324e+03 -4.515076209697882e+03 -5.544800066263574e+03 1.915738415600000e-03 7.263843228300000e-04 1.163205775800000e-03 2.424809070000000e-03 1.865034305600000e-03 3.296114253800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.080000000000000e+02 -1.179331212252306e+06 -4.946149920215328e+06 4.617470496659478e+06 -2.836554623420290e+03 -4.514946891823211e+03 -5.544913859977736e+03 1.915738415600000e-03 7.263843228300000e-04 1.163205775800000e-03 2.424809070000000e-03 1.865034305600000e-03 3.296114253800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.090000000000000e+02 -1.179387943210405e+06 -4.946240217901031e+06 4.617359597194665e+06 -2.836538971862989e+03 -4.514817566249520e+03 -5.545027655592620e+03 1.915738415600000e-03 7.263843228300000e-04 1.163205775800000e-03 2.424809070000000e-03 1.865034305600000e-03 3.296114253800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.100000000000000e+02 -1.179444673812386e+06 -4.946330512920301e+06 4.617248695550702e+06 -2.836523319658999e+03 -4.514688245502964e+03 -5.545141442175250e+03 1.915738415600000e-03 7.263843228300000e-04 1.163205775800000e-03 2.424809070000000e-03 1.865034305600000e-03 3.296114253800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.110000000000000e+02 -1.179501404136263e+06 -4.946420805418034e+06 4.617137791552464e+06 -2.836507663861179e+03 -4.514558917809058e+03 -5.545255230810923e+03 1.915738415600000e-03 7.263843228300000e-04 1.163205775800000e-03 2.424809070000000e-03 1.865034305600000e-03 3.296114253800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.120000000000000e+02 -1.179558134131700e+06 -4.946511095320180e+06 4.617026885304419e+06 -2.836491716620339e+03 -4.514430020347598e+03 -5.545368787313014e+03 1.915738415600000e-03 7.263843228300000e-04 1.163205775800000e-03 2.424809070000000e-03 1.865034305600000e-03 3.296114253800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.130000000000000e+02 -1.179614863804942e+06 -4.946601382651261e+06 4.616915976786871e+06 -2.836475574133062e+03 -4.514301406848834e+03 -5.545482190104914e+03 1.915738415600000e-03 7.263843228300000e-04 1.163205775800000e-03 2.424809070000000e-03 1.865034305600000e-03 3.296114253800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.140000000000000e+02 -1.179671593147573e+06 -4.946691667363383e+06 4.616805066032812e+06 -2.836459913873271e+03 -4.514172075945923e+03 -5.545595967445537e+03 1.915738415600000e-03 7.263843228300000e-04 1.163205775800000e-03 2.424809070000000e-03 1.865034305600000e-03 3.296114253800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.150000000000000e+02 -1.179728322178642e+06 -4.946781949491885e+06 4.616694152999526e+06 -2.836444253051437e+03 -4.514042742686719e+03 -5.545709741676553e+03 1.915738415600000e-03 7.263843228300000e-04 1.163205775800000e-03 2.424809070000000e-03 1.865034305600000e-03 3.296114253800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.160000000000000e+02 -1.179785050898026e+06 -4.946872229036590e+06 4.616583237687218e+06 -2.836428589705368e+03 -4.513913407285834e+03 -5.545823513495914e+03 1.915738415600000e-03 7.263843228300000e-04 1.163205775800000e-03 2.424809070000000e-03 1.865034305600000e-03 3.296114253800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.170000000000000e+02 -1.179841779327937e+06 -4.946962506038766e+06 4.616472320046000e+06 -2.836412923419011e+03 -4.513784066538607e+03 -5.545937285747275e+03 1.915690459700000e-03 7.260780113200000e-04 1.163375130400000e-03 2.423976168500000e-03 1.864904353300000e-03 3.297099917900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.180000000000000e+02 -1.179898507457337e+06 -4.947052780477899e+06 4.616361400100656e+06 -2.836397255949466e+03 -4.513654721274525e+03 -5.546051056957935e+03 1.915690459700000e-03 7.260780113200000e-04 1.163375130400000e-03 2.423976168500000e-03 1.864904353300000e-03 3.297099917900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.190000000000000e+02 -1.179955235241466e+06 -4.947143052270955e+06 4.616250477951618e+06 -2.836381587418128e+03 -4.513525379478318e+03 -5.546164820451521e+03 1.915690459700000e-03 7.260780113200000e-04 1.163375130400000e-03 2.423976168500000e-03 1.864904353300000e-03 3.297099917900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.200000000000000e+02 -1.180011962747172e+06 -4.947233321542062e+06 4.616139553448774e+06 -2.836365915326659e+03 -4.513396030429691e+03 -5.546278586234052e+03 1.915690459700000e-03 7.260780113200000e-04 1.163375130400000e-03 2.423976168500000e-03 1.864904353300000e-03 3.297099917900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.210000000000000e+02 -1.180068689885298e+06 -4.947323588125701e+06 4.616028626792297e+06 -2.836350244603025e+03 -4.513266687493000e+03 -5.546392341022969e+03 1.915690459700000e-03 7.260780113200000e-04 1.163375130400000e-03 2.423976168500000e-03 1.864904353300000e-03 3.297099917900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.220000000000000e+02 -1.180125416756416e+06 -4.947413852215947e+06 4.615917697763773e+06 -2.836334585451822e+03 -4.513137732076208e+03 -5.546505763977629e+03 1.915690459700000e-03 7.260780113200000e-04 1.163375130400000e-03 2.423976168500000e-03 1.864904353300000e-03 3.297099917900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.230000000000000e+02 -1.180182143297591e+06 -4.947504113700830e+06 4.615806766509421e+06 -2.836318936423188e+03 -4.513009038376073e+03 -5.546618960089306e+03 1.915690459700000e-03 7.260780113200000e-04 1.163375130400000e-03 2.423976168500000e-03 1.864904353300000e-03 3.297099917900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.240000000000000e+02 -1.180238869512725e+06 -4.947594372575447e+06 4.615695833008092e+06 -2.836303258577156e+03 -4.512879684098427e+03 -5.546732711503298e+03 1.915690459700000e-03 7.260780113200000e-04 1.163375130400000e-03 2.423976168500000e-03 1.864904353300000e-03 3.297099917900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.250000000000000e+02 -1.180295595393459e+06 -4.947684628824324e+06 4.615584897278509e+06 -2.836287579399519e+03 -4.512750331218651e+03 -5.546846457038570e+03 1.915690459700000e-03 7.260780113200000e-04 1.163375130400000e-03 2.423976168500000e-03 1.864904353300000e-03 3.297099917900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.260000000000000e+02 -1.180352320984560e+06 -4.947774882530528e+06 4.615473959220178e+06 -2.836271898574284e+03 -4.512620972368536e+03 -5.546960202945169e+03 1.915690459700000e-03 7.260780113200000e-04 1.163375130400000e-03 2.423976168500000e-03 1.864904353300000e-03 3.297099917900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.270000000000000e+02 -1.180409046274753e+06 -4.947865133673173e+06 4.615363018858367e+06 -2.836256215163332e+03 -4.512491609629081e+03 -5.547073947916141e+03 1.915642440400000e-03 7.257716213700000e-04 1.163544336500000e-03 2.423143335900000e-03 1.864774011800000e-03 3.298085622700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.280000000000000e+02 -1.180465771230436e+06 -4.947955382189950e+06 4.615252076268471e+06 -2.836240530165366e+03 -4.512362248637341e+03 -5.547187686832634e+03 1.915642440400000e-03 7.257716213700000e-04 1.163544336500000e-03 2.423143335900000e-03 1.864774011800000e-03 3.298085622700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.290000000000000e+02 -1.180522495874062e+06 -4.948045628122496e+06 4.615141131400106e+06 -2.836224844566760e+03 -4.512232885012952e+03 -5.547301422885980e+03 1.915642440400000e-03 7.257716213700000e-04 1.163544336500000e-03 2.423143335900000e-03 1.864774011800000e-03 3.298085622700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.300000000000000e+02 -1.180579220216674e+06 -4.948135871491353e+06 4.615030184228424e+06 -2.836209156205276e+03 -4.512103517564804e+03 -5.547415158028307e+03 1.915642440400000e-03 7.257716213700000e-04 1.163544336500000e-03 2.423143335900000e-03 1.864774011800000e-03 3.298085622700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.310000000000000e+02 -1.180635944246992e+06 -4.948226112275633e+06 4.614919234778703e+06 -2.836193465565452e+03 -4.511974148286271e+03 -5.547528890390966e+03 1.915642440400000e-03 7.257716213700000e-04 1.163544336500000e-03 2.423143335900000e-03 1.864774011800000e-03 3.298085622700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.320000000000000e+02 -1.180692667954652e+06 -4.948316350459358e+06 4.614808283079760e+06 -2.836177807691172e+03 -4.511845003549788e+03 -5.547642416700411e+03 1.915642440400000e-03 7.257716213700000e-04 1.163544336500000e-03 2.423143335900000e-03 1.864774011800000e-03 3.298085622700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.330000000000000e+02 -1.180749391368812e+06 -4.948406586098884e+06 4.614697329069703e+06 -2.836162168214490e+03 -4.511716003053260e+03 -5.547755809936136e+03 1.915642440400000e-03 7.257716213700000e-04 1.163544336500000e-03 2.423143335900000e-03 1.864774011800000e-03 3.298085622700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.340000000000000e+02 -1.180806114465930e+06 -4.948496819145043e+06 4.614586372792236e+06 -2.836146472849588e+03 -4.511586624981178e+03 -5.547869535734055e+03 1.915642440400000e-03 7.257716213700000e-04 1.163544336500000e-03 2.423143335900000e-03 1.864774011800000e-03 3.298085622700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.350000000000000e+02 -1.180862837228375e+06 -4.948587049565166e+06 4.614475414286915e+06 -2.836130776058893e+03 -4.511457248634894e+03 -5.547983255424837e+03 1.915642440400000e-03 7.257716213700000e-04 1.163544336500000e-03 2.423143335900000e-03 1.864774011800000e-03 3.298085622700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.360000000000000e+02 -1.180919559700674e+06 -4.948677277441917e+06 4.614364453453697e+06 -2.836115076217179e+03 -4.511327866617715e+03 -5.548096975863334e+03 1.915642440400000e-03 7.257716213700000e-04 1.163544336500000e-03 2.423143335900000e-03 1.864774011800000e-03 3.298085622700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.370000000000000e+02 -1.180976281815991e+06 -4.948767502651258e+06 4.614253490442704e+06 -2.836099377167701e+03 -4.511198489305595e+03 -5.548210686736835e+03 1.915594357800000e-03 7.254651528800000e-04 1.163713394300000e-03 2.422310571900000e-03 1.864643281100000e-03 3.299071369300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.380000000000000e+02 -1.181033003652330e+06 -4.948857725337978e+06 4.614142525078696e+06 -2.836083674768109e+03 -4.511069104515569e+03 -5.548324399988710e+03 1.915594357800000e-03 7.254651528800000e-04 1.163713394300000e-03 2.422310571900000e-03 1.864643281100000e-03 3.299071369300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.390000000000000e+02 -1.181089725187249e+06 -4.948947945460476e+06 4.614031557412020e+06 -2.836067969484307e+03 -4.510939716129131e+03 -5.548438112194475e+03 1.915594357800000e-03 7.254651528800000e-04 1.163713394300000e-03 2.422310571900000e-03 1.864643281100000e-03 3.299071369300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.400000000000000e+02 -1.181146446376247e+06 -4.949038162936158e+06 4.613920587542672e+06 -2.836052264863758e+03 -4.510810330578602e+03 -5.548551816442293e+03 1.915594357800000e-03 7.254651528800000e-04 1.163713394300000e-03 2.422310571900000e-03 1.864643281100000e-03 3.299071369300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.410000000000000e+02 -1.181203167297318e+06 -4.949128377909779e+06 4.613809615295399e+06 -2.836036556208428e+03 -4.510680935812330e+03 -5.548665524812778e+03 1.915594357800000e-03 7.254651528800000e-04 1.163713394300000e-03 2.422310571900000e-03 1.864643281100000e-03 3.299071369300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.420000000000000e+02 -1.181259887880271e+06 -4.949218590266990e+06 4.613698640827733e+06 -2.836020690059407e+03 -4.510552044827615e+03 -5.548778880764256e+03 1.915594357800000e-03 7.254651528800000e-04 1.163713394300000e-03 2.422310571900000e-03 1.864643281100000e-03 3.299071369300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.430000000000000e+02 -1.181316608115535e+06 -4.949308800000509e+06 4.613587664161148e+06 -2.836004720519096e+03 -4.510423487706306e+03 -5.548892000961408e+03 1.915594357800000e-03 7.254651528800000e-04 1.163713394300000e-03 2.422310571900000e-03 1.864643281100000e-03 3.299071369300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.440000000000000e+02 -1.181373328054015e+06 -4.949399007178499e+06 4.613476685181388e+06 -2.835989006956538e+03 -4.510294088541461e+03 -5.549005699224931e+03 1.915594357800000e-03 7.254651528800000e-04 1.163713394300000e-03 2.422310571900000e-03 1.864643281100000e-03 3.299071369300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.450000000000000e+02 -1.181430047668550e+06 -4.949489211750600e+06 4.613365703949413e+06 -2.835973291664693e+03 -4.510164688715359e+03 -5.549119393495495e+03 1.915594357800000e-03 7.254651528800000e-04 1.163713394300000e-03 2.422310571900000e-03 1.864643281100000e-03 3.299071369300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.460000000000000e+02 -1.181486766959265e+06 -4.949579413717040e+06 4.613254720464971e+06 -2.835957575821585e+03 -4.510035288595015e+03 -5.549233082943897e+03 1.915594357800000e-03 7.254651528800000e-04 1.163713394300000e-03 2.422310571900000e-03 1.864643281100000e-03 3.299071369300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.470000000000000e+02 -1.181543485948285e+06 -4.949669613118911e+06 4.613143734678287e+06 -2.835941857122855e+03 -4.509905884466622e+03 -5.549346771673976e+03 1.915546211900000e-03 7.251586059200000e-04 1.163882303800000e-03 2.421477876700000e-03 1.864512161300000e-03 3.300057157800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.480000000000000e+02 -1.181600204613416e+06 -4.949759809915034e+06 4.613032746639243e+06 -2.835926137832332e+03 -4.509776479913313e+03 -5.549460455708379e+03 1.915546211900000e-03 7.251586059200000e-04 1.163882303800000e-03 2.421477876700000e-03 1.864512161300000e-03 3.300057157800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.490000000000000e+02 -1.181656922976858e+06 -4.949850004146636e+06 4.612921756297910e+06 -2.835910415818971e+03 -4.509647071448647e+03 -5.549574138884992e+03 1.915546211900000e-03 7.251586059200000e-04 1.163882303800000e-03 2.421477876700000e-03 1.864512161300000e-03 3.300057157800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.500000000000000e+02 -1.181713641049655e+06 -4.949940195834244e+06 4.612810763629426e+06 -2.835894690884847e+03 -4.509517657482999e+03 -5.549687822608204e+03 1.915546211900000e-03 7.251586059200000e-04 1.163882303800000e-03 2.421477876700000e-03 1.864512161300000e-03 3.300057157800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.510000000000000e+02 -1.181770358776142e+06 -4.950030384874567e+06 4.612699768758890e+06 -2.835878966420944e+03 -4.509388246354422e+03 -5.549801498460985e+03 1.915546211900000e-03 7.251586059200000e-04 1.163882303800000e-03 2.421477876700000e-03 1.864512161300000e-03 3.300057157800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.520000000000000e+02 -1.181827076190261e+06 -4.950120571335440e+06 4.612588771616427e+06 -2.835863268599706e+03 -4.509259127905632e+03 -5.549914914761768e+03 1.915546211900000e-03 7.251586059200000e-04 1.163882303800000e-03 2.421477876700000e-03 1.864512161300000e-03 3.300057157800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.530000000000000e+02 -1.181883793309267e+06 -4.950210755252114e+06 4.612477772167491e+06 -2.835847586928969e+03 -4.509130199422803e+03 -5.550028161259942e+03 1.915546211900000e-03 7.251586059200000e-04 1.163882303800000e-03 2.421477876700000e-03 1.864512161300000e-03 3.300057157800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.540000000000000e+02 -1.181940510097566e+06 -4.950300936550512e+06 4.612366770481372e+06 -2.835831856792655e+03 -4.509000779976563e+03 -5.550141830586941e+03 1.915546211900000e-03 7.251586059200000e-04 1.163882303800000e-03 2.421477876700000e-03 1.864512161300000e-03 3.300057157800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.550000000000000e+02 -1.181997226550494e+06 -4.950391115222046e+06 4.612255766568510e+06 -2.835816125096045e+03 -4.508871362273376e+03 -5.550255493855854e+03 1.915546211900000e-03 7.251586059200000e-04 1.163882303800000e-03 2.421477876700000e-03 1.864512161300000e-03 3.300057157800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.560000000000000e+02 -1.182053942712561e+06 -4.950481291349311e+06 4.612144760328823e+06 -2.835800390328036e+03 -4.508741938796325e+03 -5.550369157963890e+03 1.915546211900000e-03 7.251586059200000e-04 1.163882303800000e-03 2.421477876700000e-03 1.864512161300000e-03 3.300057157800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.570000000000000e+02 -1.182110658561580e+06 -4.950571464891138e+06 4.612033751812193e+06 -2.835784654749568e+03 -4.508612512875321e+03 -5.550482819145923e+03 1.915498003000000e-03 7.248519804199999e-04 1.164051065200000e-03 2.420645250300000e-03 1.864380652400000e-03 3.301042988900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.580000000000000e+02 -1.182167374108511e+06 -4.950661635867918e+06 4.611922740993922e+06 -2.835768916039362e+03 -4.508483083485960e+03 -5.550596479284886e+03 1.915498003000000e-03 7.248519804199999e-04 1.164051065200000e-03 2.420645250300000e-03 1.864380652400000e-03 3.301042988900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.590000000000000e+02 -1.182224089331165e+06 -4.950751804238480e+06 4.611811727923891e+06 -2.835753176898750e+03 -4.508353653321613e+03 -5.550710134946797e+03 1.915498003000000e-03 7.248519804199999e-04 1.164051065200000e-03 2.420645250300000e-03 1.864380652400000e-03 3.301042988900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.600000000000000e+02 -1.182280804240589e+06 -4.950841970023338e+06 4.611700712577236e+06 -2.835737435671434e+03 -4.508224220929723e+03 -5.550823788072574e+03 1.915498003000000e-03 7.248519804199999e-04 1.164051065200000e-03 2.420645250300000e-03 1.864380652400000e-03 3.301042988900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.610000000000000e+02 -1.182337518836660e+06 -4.950932133222325e+06 4.611589694954180e+06 -2.835721692024967e+03 -4.508094786834610e+03 -5.550937438376462e+03 1.915498003000000e-03 7.248519804199999e-04 1.164051065200000e-03 2.420645250300000e-03 1.864380652400000e-03 3.301042988900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.620000000000000e+02 -1.182394233117115e+06 -4.951022293842166e+06 4.611478675058762e+06 -2.835705827900856e+03 -4.507965675340050e+03 -5.551050870067017e+03 1.915498003000000e-03 7.248519804199999e-04 1.164051065200000e-03 2.420645250300000e-03 1.864380652400000e-03 3.301042988900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.630000000000000e+02 -1.182450947076843e+06 -4.951112451880679e+06 4.611367652901721e+06 -2.835689882248852e+03 -4.507836777596686e+03 -5.551164155883229e+03 1.915498003000000e-03 7.248519804199999e-04 1.164051065200000e-03 2.420645250300000e-03 1.864380652400000e-03 3.301042988900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.640000000000000e+02 -1.182507660694067e+06 -4.951202607279319e+06 4.611256628533734e+06 -2.835674134160605e+03 -4.507707340439318e+03 -5.551277794747827e+03 1.915498003000000e-03 7.248519804199999e-04 1.164051065200000e-03 2.420645250300000e-03 1.864380652400000e-03 3.301042988900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.650000000000000e+02 -1.182564374042586e+06 -4.951292760174941e+06 4.611145601788930e+06 -2.835658383640359e+03 -4.507577893870630e+03 -5.551391437175108e+03 1.915498003000000e-03 7.248519804199999e-04 1.164051065200000e-03 2.420645250300000e-03 1.864380652400000e-03 3.301042988900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.660000000000000e+02 -1.182621087066503e+06 -4.951382910463909e+06 4.611034572792907e+06 -2.835642631294573e+03 -4.507448446787894e+03 -5.551505075531671e+03 1.915498003000000e-03 7.248519804199999e-04 1.164051065200000e-03 2.420645250300000e-03 1.864380652400000e-03 3.301042988900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.670000000000000e+02 -1.182677799765700e+06 -4.951473058146060e+06 4.610923541545887e+06 -2.835626877008485e+03 -4.507318999817590e+03 -5.551618709350490e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.680000000000000e+02 -1.182734512129150e+06 -4.951563203200911e+06 4.610812508072685e+06 -2.835611122997490e+03 -4.507189553513253e+03 -5.551732337186389e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.690000000000000e+02 -1.182791224212513e+06 -4.951653345731745e+06 4.610701472248116e+06 -2.835595365223696e+03 -4.507060100244728e+03 -5.551845967152312e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.700000000000000e+02 -1.182847935959898e+06 -4.951743485634938e+06 4.610590434197788e+06 -2.835579606181724e+03 -4.506930648212766e+03 -5.551959591351218e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.710000000000000e+02 -1.182904647404897e+06 -4.951833622972775e+06 4.610479393846205e+06 -2.835563845915562e+03 -4.506801192080821e+03 -5.552073214178678e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.720000000000000e+02 -1.182961358536154e+06 -4.951923757724263e+06 4.610368351218816e+06 -2.835548082852867e+03 -4.506671734203429e+03 -5.552186834387498e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.730000000000000e+02 -1.183018069342644e+06 -4.952013889868930e+06 4.610257306340437e+06 -2.835532319459702e+03 -4.506542275369926e+03 -5.552300450225736e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.740000000000000e+02 -1.183074779880028e+06 -4.952104019510039e+06 4.610146259085874e+06 -2.835516552185143e+03 -4.506412807659775e+03 -5.552414069827518e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.750000000000000e+02 -1.183131490070100e+06 -4.952194146502611e+06 4.610035209630915e+06 -2.835500783881256e+03 -4.506283343200482e+03 -5.552527681890203e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.760000000000000e+02 -1.183188199946451e+06 -4.952284270908915e+06 4.609924157900051e+06 -2.835485014683748e+03 -4.506153876219801e+03 -5.552641291128044e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.770000000000000e+02 -1.183244909486655e+06 -4.952374392687417e+06 4.609813103943663e+06 -2.835469244157086e+03 -4.506024410791017e+03 -5.552754894366382e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.780000000000000e+02 -1.183301618757531e+06 -4.952464511962051e+06 4.609702047611455e+06 -2.835453469673595e+03 -4.505894936330933e+03 -5.552868501528769e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.790000000000000e+02 -1.183358327669960e+06 -4.952554628567550e+06 4.609590989103852e+06 -2.835437696147023e+03 -4.505765466417645e+03 -5.552982099196392e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.800000000000000e+02 -1.183415036290757e+06 -4.952644742627856e+06 4.609479928270545e+06 -2.835421919372389e+03 -4.505635991123298e+03 -5.553095697453233e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.810000000000000e+02 -1.183471744597499e+06 -4.952734854101421e+06 4.609368865161923e+06 -2.835406140558807e+03 -4.505506513548865e+03 -5.553209293196016e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.820000000000000e+02 -1.183528452601463e+06 -4.952824963009141e+06 4.609257799752633e+06 -2.835390360423624e+03 -4.505377031764720e+03 -5.553322887700587e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.830000000000000e+02 -1.183585160280144e+06 -4.952915069309358e+06 4.609146732093226e+06 -2.835374577883274e+03 -4.505247550084093e+03 -5.553436477883326e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.840000000000000e+02 -1.183641867622513e+06 -4.953005172981602e+06 4.609035662208526e+06 -2.835358795527759e+03 -4.505118069360503e+03 -5.553550061884945e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.850000000000000e+02 -1.183698574706538e+06 -4.953095274170467e+06 4.608924589923126e+06 -2.835343008740520e+03 -4.504988577860300e+03 -5.553663651462966e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.860000000000000e+02 -1.183755281442864e+06 -4.953185372710330e+06 4.608813515437949e+06 -2.835327220978447e+03 -4.504859089446896e+03 -5.553777233615714e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.870000000000000e+02 -1.183811987842773e+06 -4.953275468622098e+06 4.608702438727647e+06 -2.835311433273252e+03 -4.504729602403207e+03 -5.553890809303637e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.880000000000000e+02 -1.183868693950768e+06 -4.953365561988314e+06 4.608591359692071e+06 -2.835295642433844e+03 -4.504600109680853e+03 -5.554004385774911e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.890000000000000e+02 -1.183925399744419e+06 -4.953455652767438e+06 4.608480278381614e+06 -2.835279849338261e+03 -4.504470614868670e+03 -5.554117959671570e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.900000000000000e+02 -1.183982105223860e+06 -4.953545740959696e+06 4.608369194796020e+06 -2.835264055620423e+03 -4.504341117764305e+03 -5.554231530433046e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.910000000000000e+02 -1.184038810388969e+06 -4.953635826564905e+06 4.608258108935491e+06 -2.835248259441471e+03 -4.504211618317237e+03 -5.554345098920187e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.920000000000000e+02 -1.184095515273092e+06 -4.953725909644932e+06 4.608147020724975e+06 -2.835232459841948e+03 -4.504082112070611e+03 -5.554458669243618e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.930000000000000e+02 -1.184152219775972e+06 -4.953815990013903e+06 4.608035930390032e+06 -2.835216661871476e+03 -4.503952613528027e+03 -5.554572227167880e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.940000000000000e+02 -1.184208924009032e+06 -4.953906067878400e+06 4.607924837679950e+06 -2.835200860123191e+03 -4.503823106069001e+03 -5.554685788836906e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.950000000000000e+02 -1.184265627927538e+06 -4.953996143155552e+06 4.607813742695317e+06 -2.835185056023103e+03 -4.503693596628809e+03 -5.554799347883946e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.960000000000000e+02 -1.184322331509309e+06 -4.954086215804216e+06 4.607702645486057e+06 -2.835169251957958e+03 -4.503564088166191e+03 -5.554912900801305e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.970000000000000e+02 -1.184379034787613e+06 -4.954176285886129e+06 4.607591545977260e+06 -2.835153444861574e+03 -4.503434576199308e+03 -5.555026452658010e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.980000000000000e+02 -1.184435737740265e+06 -4.954266353360152e+06 4.607480444218851e+06 -2.835137637149818e+03 -4.503305063420639e+03 -5.555140000153462e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.990000000000000e+02 -1.184492440411764e+06 -4.954356418308799e+06 4.607369340110661e+06 -2.835121826212222e+03 -4.503175543368515e+03 -5.555253549788747e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.000000000000000e+02 -1.184549142712768e+06 -4.954446480566522e+06 4.607258233853676e+06 -2.835106014925196e+03 -4.503046030198390e+03 -5.555367088588171e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.010000000000000e+02 -1.184605844743781e+06 -4.954536540319587e+06 4.607147125221761e+06 -2.835090201145738e+03 -4.502916507453676e+03 -5.555480631101649e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.020000000000000e+02 -1.184662546460076e+06 -4.954626597485130e+06 4.607036014315515e+06 -2.835074385345786e+03 -4.502786982605692e+03 -5.555594170946484e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.030000000000000e+02 -1.184719247839227e+06 -4.954716652021641e+06 4.606924901185349e+06 -2.835058567806065e+03 -4.502657459465302e+03 -5.555707704849893e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.040000000000000e+02 -1.184775948925975e+06 -4.954806704012010e+06 4.606813785730608e+06 -2.835042748901541e+03 -4.502527930174691e+03 -5.555821239135660e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.050000000000000e+02 -1.184832649664441e+06 -4.954896753352725e+06 4.606702668076999e+06 -2.835026928865947e+03 -4.502398404324148e+03 -5.555934765778393e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.060000000000000e+02 -1.184889350132575e+06 -4.954986800188289e+06 4.606591548049038e+06 -2.835011104926083e+03 -4.502268869274367e+03 -5.556048296452121e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.070000000000000e+02 -1.184946050263587e+06 -4.955076844394906e+06 4.606480425797061e+06 -2.834995281038226e+03 -4.502139335270410e+03 -5.556161820933687e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.080000000000000e+02 -1.185002750090740e+06 -4.955166886034283e+06 4.606369301246142e+06 -2.834979454030092e+03 -4.502009797795366e+03 -5.556275344365936e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.090000000000000e+02 -1.185059449569552e+06 -4.955256925023964e+06 4.606258174496419e+06 -2.834963627497009e+03 -4.501880263021574e+03 -5.556388860051152e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.100000000000000e+02 -1.185116148755666e+06 -4.955346961467110e+06 4.606147045422599e+06 -2.834947797749811e+03 -4.501750722744409e+03 -5.556502376407114e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.110000000000000e+02 -1.185172847615507e+06 -4.955436995301551e+06 4.606035914100206e+06 -2.834931966240316e+03 -4.501621182336520e+03 -5.556615888350943e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.120000000000000e+02 -1.185229546182661e+06 -4.955527026589499e+06 4.605924780453663e+06 -2.834916133115528e+03 -4.501491635761296e+03 -5.556729400801565e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.130000000000000e+02 -1.185286244434706e+06 -4.955617055289445e+06 4.605813644533390e+06 -2.834900297734315e+03 -4.501362087207242e+03 -5.556842910585834e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.140000000000000e+02 -1.185342942360378e+06 -4.955707081380563e+06 4.605702506364703e+06 -2.834884460526418e+03 -4.501232538546498e+03 -5.556956415966879e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.150000000000000e+02 -1.185399639993248e+06 -4.955797104925045e+06 4.605591365872030e+06 -2.834868621567091e+03 -4.501102983768602e+03 -5.557069921873272e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.160000000000000e+02 -1.185456337244002e+06 -4.955887125757426e+06 4.605480223256416e+06 -2.834852783158236e+03 -4.500973437465482e+03 -5.557183415234455e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.170000000000000e+02 -1.185513034246329e+06 -4.955977144125482e+06 4.605369078216823e+06 -2.834836939581801e+03 -4.500843878878758e+03 -5.557296915731852e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.180000000000000e+02 -1.185569730888848e+06 -4.956067159822805e+06 4.605257931004039e+06 -2.834821097221281e+03 -4.500714324678936e+03 -5.557410406762974e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.190000000000000e+02 -1.185626427260653e+06 -4.956157173014519e+06 4.605146781417423e+06 -2.834805250805939e+03 -4.500584761370629e+03 -5.557523901813231e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.200000000000000e+02 -1.185683123283568e+06 -4.956247183555814e+06 4.605035629632946e+06 -2.834789403460582e+03 -4.500455201504136e+03 -5.557637389132836e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.210000000000000e+02 -1.185739819024623e+06 -4.956337191570878e+06 4.604924475499691e+06 -2.834773553921240e+03 -4.500325633762617e+03 -5.557750878624736e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.220000000000000e+02 -1.185796514405569e+06 -4.956427196914784e+06 4.604813319193787e+06 -2.834757703448626e+03 -4.500196071276311e+03 -5.557864358891381e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.230000000000000e+02 -1.185853209504584e+06 -4.956517199732367e+06 4.604702160539214e+06 -2.834741850783837e+03 -4.500066500914286e+03 -5.557977841329775e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.240000000000000e+02 -1.185909904276953e+06 -4.956607199940817e+06 4.604590999636625e+06 -2.834725996518061e+03 -4.499936930545743e+03 -5.558091319182658e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.250000000000000e+02 -1.185966598733708e+06 -4.956697197560618e+06 4.604479836461118e+06 -2.834710139795038e+03 -4.499807357908405e+03 -5.558204794697997e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.260000000000000e+02 -1.186023292874977e+06 -4.956787192591992e+06 4.604368671012432e+06 -2.834694282332877e+03 -4.499677783061226e+03 -5.558318267062622e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.270000000000000e+02 -1.186079986678340e+06 -4.956877184993447e+06 4.604257503341003e+06 -2.834678423479754e+03 -4.499548209613634e+03 -5.558431733588609e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.280000000000000e+02 -1.186136680210585e+06 -4.956967174888750e+06 4.604146333296379e+06 -2.834662560661855e+03 -4.499418627096731e+03 -5.558545204058617e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.290000000000000e+02 -1.186193373404937e+06 -4.957057162154176e+06 4.604035161028961e+06 -2.834646697928679e+03 -4.499289045543746e+03 -5.558658668392814e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.300000000000000e+02 -1.186250066261279e+06 -4.957147146789561e+06 4.603923986538963e+06 -2.834630833715718e+03 -4.499159465715838e+03 -5.558772126659802e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.310000000000000e+02 -1.186306758857543e+06 -4.957237128939312e+06 4.603812809650821e+06 -2.834614965206970e+03 -4.499029875055428e+03 -5.558885590471648e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.320000000000000e+02 -1.186363451082363e+06 -4.957327108397099e+06 4.603701630615385e+06 -2.834599098086605e+03 -4.498900290423857e+03 -5.558999043390144e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.330000000000000e+02 -1.186420143035881e+06 -4.957417085348509e+06 4.603590449207023e+06 -2.834583226383228e+03 -4.498770697316288e+03 -5.559112500036813e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.340000000000000e+02 -1.186476834640185e+06 -4.957507059649178e+06 4.603479265601254e+06 -2.834567355329365e+03 -4.498641106740446e+03 -5.559225949004075e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.350000000000000e+02 -1.186533525928599e+06 -4.957597031360902e+06 4.603368079722960e+06 -2.834551481760559e+03 -4.498511514319513e+03 -5.559339395310025e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.360000000000000e+02 -1.186590216912161e+06 -4.957687000504148e+06 4.603256891547236e+06 -2.834535605773746e+03 -4.498381918022916e+03 -5.559452840586182e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.370000000000000e+02 -1.186646907590996e+06 -4.957776967079140e+06 4.603145701073818e+06 -2.834519728413668e+03 -4.498252317610361e+03 -5.559566284565750e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.380000000000000e+02 -1.186703597942691e+06 -4.957866931044402e+06 4.603034508353149e+06 -2.834503849314627e+03 -4.498122716841976e+03 -5.559679724310488e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.390000000000000e+02 -1.186760287978275e+06 -4.957956892420404e+06 4.602923313360326e+06 -2.834487967861758e+03 -4.497993114023221e+03 -5.559793161491390e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.400000000000000e+02 -1.186816977675579e+06 -4.958046851166074e+06 4.602812116145327e+06 -2.834472086541658e+03 -4.497863512517785e+03 -5.559906592228946e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.410000000000000e+02 -1.186873667090236e+06 -4.958136807384483e+06 4.602700916582776e+06 -2.834456201842854e+03 -4.497733903537714e+03 -5.560020025331159e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.420000000000000e+02 -1.186930356177525e+06 -4.958226760992859e+06 4.602589714773351e+06 -2.834440314914816e+03 -4.497604294347030e+03 -5.560133454297150e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.430000000000000e+02 -1.186987044948727e+06 -4.958316712012060e+06 4.602478510691675e+06 -2.834424427656299e+03 -4.497474682540998e+03 -5.560246880265211e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.440000000000000e+02 -1.187043733403723e+06 -4.958406660441926e+06 4.602367304337963e+06 -2.834408537690877e+03 -4.497345068997906e+03 -5.560360303568162e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.450000000000000e+02 -1.187100421553548e+06 -4.958496606302924e+06 4.602256095687309e+06 -2.834392645415006e+03 -4.497215451649224e+03 -5.560473725734900e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.460000000000000e+02 -1.187157109364882e+06 -4.958586549533334e+06 4.602144884814803e+06 -2.834376753014521e+03 -4.497085835125098e+03 -5.560587141976484e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.470000000000000e+02 -1.187213796882122e+06 -4.958676490215432e+06 4.602033671620348e+06 -2.834360857121454e+03 -4.496956213492605e+03 -5.560700558681368e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.480000000000000e+02 -1.187270484094241e+06 -4.958766428328787e+06 4.601922456128786e+06 -2.834344959887534e+03 -4.496826587440089e+03 -5.560813974324961e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.490000000000000e+02 -1.187327170945393e+06 -4.958856363770004e+06 4.601811238465945e+06 -2.834329062308998e+03 -4.496696966358184e+03 -5.560927380724334e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.500000000000000e+02 -1.187383857513486e+06 -4.958946296683430e+06 4.601700018456195e+06 -2.834313160969988e+03 -4.496567338417543e+03 -5.561040789148439e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.510000000000000e+02 -1.187440543742914e+06 -4.959036226966055e+06 4.601588796224872e+06 -2.834297259775101e+03 -4.496437711202875e+03 -5.561154191609859e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.520000000000000e+02 -1.187497229655855e+06 -4.959126154658990e+06 4.601477571721946e+06 -2.834281356359813e+03 -4.496308081925850e+03 -5.561267591458117e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.530000000000000e+02 -1.187553915263340e+06 -4.959216079782711e+06 4.601366344922513e+06 -2.834265450172898e+03 -4.496178449160160e+03 -5.561380990113622e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.540000000000000e+02 -1.187610600554348e+06 -4.959306002316784e+06 4.601255115851426e+06 -2.834249543320177e+03 -4.496048813611380e+03 -5.561494386058546e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.550000000000000e+02 -1.187667285517614e+06 -4.959395922240401e+06 4.601143884534028e+06 -2.834233634465480e+03 -4.495919178061697e+03 -5.561607777594497e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.560000000000000e+02 -1.187723970186466e+06 -4.959485839615311e+06 4.601032650895161e+06 -2.834217722769267e+03 -4.495789536943752e+03 -5.561721169681998e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.570000000000000e+02 -1.187780654538736e+06 -4.959575754400442e+06 4.600921414984804e+06 -2.834201810076647e+03 -4.495659893311195e+03 -5.561834558984518e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.580000000000000e+02 -1.187837338563076e+06 -4.959665666574857e+06 4.600810176828453e+06 -2.834185895109717e+03 -4.495530249522943e+03 -5.561947944126759e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.590000000000000e+02 -1.187894022248469e+06 -4.959755576118133e+06 4.600698936450983e+06 -2.834169980232286e+03 -4.495400606774479e+03 -5.562061323073318e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.600000000000000e+02 -1.187950705661680e+06 -4.959845483153935e+06 4.600587693701841e+06 -2.834154061334624e+03 -4.495270955266605e+03 -5.562174705723680e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.610000000000000e+02 -1.188007388713416e+06 -4.959935387516976e+06 4.600476448782258e+06 -2.834138141977394e+03 -4.495141308591981e+03 -5.562288079297694e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.620000000000000e+02 -1.188064071492980e+06 -4.960025289372575e+06 4.600365201490952e+06 -2.834122220086052e+03 -4.495011652425687e+03 -5.562401456517518e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.630000000000000e+02 -1.188120753922227e+06 -4.960115188576098e+06 4.600253952004028e+06 -2.834106297208342e+03 -4.494881999437611e+03 -5.562514826258879e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.640000000000000e+02 -1.188177436045627e+06 -4.960205085209923e+06 4.600142700221191e+06 -2.834090371632749e+03 -4.494752342934001e+03 -5.562628194796129e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.650000000000000e+02 -1.188234117874455e+06 -4.960294979294896e+06 4.600031446117040e+06 -2.834074444469512e+03 -4.494622680105803e+03 -5.562741563949056e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.660000000000000e+02 -1.188290799330571e+06 -4.960384870686407e+06 4.599920189867704e+06 -2.834058517146123e+03 -4.494493024436124e+03 -5.562854921979098e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.670000000000000e+02 -1.188347480525316e+06 -4.960474759590620e+06 4.599808931222097e+06 -2.834042585441969e+03 -4.494363357814595e+03 -5.562968285676762e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.680000000000000e+02 -1.188404161380799e+06 -4.960564645863314e+06 4.599697670355863e+06 -2.834026653814038e+03 -4.494233692129250e+03 -5.563081643271028e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.690000000000000e+02 -1.188460841941484e+06 -4.960654529586851e+06 4.599586407168690e+06 -2.834010718993634e+03 -4.494104021041500e+03 -5.563195001434173e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.700000000000000e+02 -1.188517522140382e+06 -4.960744410637263e+06 4.599475141811591e+06 -2.833994783775228e+03 -4.493974355131869e+03 -5.563308350212285e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.710000000000000e+02 -1.188574202044491e+06 -4.960834289138556e+06 4.599363874133503e+06 -2.833978846780316e+03 -4.493844682930939e+03 -5.563421699661939e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.720000000000000e+02 -1.188630881609035e+06 -4.960924165007902e+06 4.599252604235332e+06 -2.833962907963492e+03 -4.493715012514966e+03 -5.563535043153743e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.730000000000000e+02 -1.188687560901013e+06 -4.961014038369314e+06 4.599141331966016e+06 -2.833946966621455e+03 -4.493585332785875e+03 -5.563648390137139e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.740000000000000e+02 -1.188744239831144e+06 -4.961103909057557e+06 4.599030057526832e+06 -2.833931024796927e+03 -4.493455657754952e+03 -5.563761728169390e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.750000000000000e+02 -1.188800918477329e+06 -4.961193777216885e+06 4.598918780742065e+06 -2.833915079360252e+03 -4.493325975882571e+03 -5.563875068140996e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.760000000000000e+02 -1.188857596795113e+06 -4.961283642764981e+06 4.598807501711980e+06 -2.833899133531012e+03 -4.493196292904746e+03 -5.563988403899361e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.770000000000000e+02 -1.188914274806671e+06 -4.961373505742935e+06 4.598696220386524e+06 -2.833883185127600e+03 -4.493066606292719e+03 -5.564101738495337e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.780000000000000e+02 -1.188970952511885e+06 -4.961463366150577e+06 4.598584936765910e+06 -2.833867233925175e+03 -4.492936916093168e+03 -5.564215071990196e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.790000000000000e+02 -1.189027629844016e+06 -4.961553223864353e+06 4.598473651000692e+06 -2.833851284241157e+03 -4.492807231850115e+03 -5.564328394610790e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.800000000000000e+02 -1.189084306903247e+06 -4.961643079069744e+06 4.598362362864855e+06 -2.833835330361532e+03 -4.492677538947462e+03 -5.564441720925342e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.810000000000000e+02 -1.189140983633740e+06 -4.961732931663429e+06 4.598251072484299e+06 -2.833819374890296e+03 -4.492547845602759e+03 -5.564555043013685e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.820000000000000e+02 -1.189197660046765e+06 -4.961822781666261e+06 4.598139779833621e+06 -2.833803418404165e+03 -4.492418149934865e+03 -5.564668362167813e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.830000000000000e+02 -1.189254336142127e+06 -4.961912629077934e+06 4.598028484913194e+06 -2.833787459386873e+03 -4.492288452248554e+03 -5.564781678810505e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.840000000000000e+02 -1.189311011897662e+06 -4.962002473857419e+06 4.597917187773036e+06 -2.833771500282563e+03 -4.492158755744090e+03 -5.564894989222830e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.850000000000000e+02 -1.189367687357831e+06 -4.962092316087035e+06 4.597805888312797e+06 -2.833755538092219e+03 -4.492029053615060e+03 -5.565008300337527e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.860000000000000e+02 -1.189424362511374e+06 -4.962182155745985e+06 4.597694586557837e+06 -2.833739573258033e+03 -4.491899347914650e+03 -5.565121610268497e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.870000000000000e+02 -1.189481037358417e+06 -4.962271992834485e+06 4.597583282507882e+06 -2.833723607239174e+03 -4.491769637774035e+03 -5.565234919082214e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.880000000000000e+02 -1.189537711843126e+06 -4.962361827249249e+06 4.597471976288860e+06 -2.833707640633540e+03 -4.491639932702376e+03 -5.565348218690084e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.890000000000000e+02 -1.189594386043385e+06 -4.962451659134465e+06 4.597360667724992e+06 -2.833691670413173e+03 -4.491510220497054e+03 -5.565461520475940e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.900000000000000e+02 -1.189651059914754e+06 -4.962541488407850e+06 4.597249356916580e+06 -2.833675700015682e+03 -4.491380507364098e+03 -5.565574817807449e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.910000000000000e+02 -1.189707733468255e+06 -4.962631315089870e+06 4.597138043838700e+06 -2.833659727153275e+03 -4.491250792590944e+03 -5.565688112286964e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.920000000000000e+02 -1.189764406681489e+06 -4.962721139139096e+06 4.597026728541849e+06 -2.833643753104388e+03 -4.491121078968587e+03 -5.565801401051168e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.930000000000000e+02 -1.189821079588009e+06 -4.962810960617613e+06 4.596915410950335e+06 -2.833627777682704e+03 -4.490991361305139e+03 -5.565914688453347e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.940000000000000e+02 -1.189877752221129e+06 -4.962900779587097e+06 4.596804090988936e+06 -2.833611798284886e+03 -4.490861634570463e+03 -5.566027979786266e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.950000000000000e+02 -1.189934424480444e+06 -4.962990595861815e+06 4.596692768884172e+06 -2.833595818864827e+03 -4.490731914768494e+03 -5.566141260131896e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.960000000000000e+02 -1.189991096455228e+06 -4.963080409606922e+06 4.596581444434610e+06 -2.833579837324563e+03 -4.490602186950593e+03 -5.566254542715884e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.970000000000000e+02 -1.190047768122994e+06 -4.963170220780884e+06 4.596470117690919e+06 -2.833563852669016e+03 -4.490472455589514e+03 -5.566367824301419e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.980000000000000e+02 -1.190104439450440e+06 -4.963260029322062e+06 4.596358788728277e+06 -2.833547867958630e+03 -4.490342725619816e+03 -5.566481099471865e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.990000000000000e+02 -1.190161110437454e+06 -4.963349835230291e+06 4.596247457546890e+06 -2.833531881958196e+03 -4.490212996730227e+03 -5.566594369032082e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.000000000000000e+02 -1.190217781139629e+06 -4.963439638608471e+06 4.596136124021243e+06 -2.833515892408691e+03 -4.490083260718791e+03 -5.566707640729014e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.010000000000000e+02 -1.190274451512521e+06 -4.963529439374355e+06 4.596024788251661e+06 -2.833499902426734e+03 -4.489953524021570e+03 -5.566820907886882e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.020000000000000e+02 -1.190331121567161e+06 -4.963619237548389e+06 4.595913450213211e+06 -2.833483910322122e+03 -4.489823785448742e+03 -5.566934172234485e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.030000000000000e+02 -1.190387791303428e+06 -4.963709033130402e+06 4.595802109906103e+06 -2.833467915796457e+03 -4.489694044744981e+03 -5.567047434114201e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.040000000000000e+02 -1.190444460721449e+06 -4.963798826120608e+06 4.595690767330077e+06 -2.833451920585022e+03 -4.489564301597943e+03 -5.567160693012411e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.050000000000000e+02 -1.190501129821110e+06 -4.963888616518831e+06 4.595579422485341e+06 -2.833435923066557e+03 -4.489434556387528e+03 -5.567273949336566e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.060000000000000e+02 -1.190557798613435e+06 -4.963978404345516e+06 4.595468075346968e+06 -2.833419922903903e+03 -4.489304807496786e+03 -5.567387204565384e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.070000000000000e+02 -1.190614467053981e+06 -4.964068189518428e+06 4.595356726015292e+06 -2.833403923195379e+03 -4.489175061479471e+03 -5.567500451936699e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.080000000000000e+02 -1.190671135220549e+06 -4.964157972181544e+06 4.595245374314628e+06 -2.833387919101121e+03 -4.489045306431574e+03 -5.567613703383120e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.090000000000000e+02 -1.190727803024126e+06 -4.964247752170195e+06 4.595134020445924e+06 -2.833371915905623e+03 -4.488915556054557e+03 -5.567726945297774e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.100000000000000e+02 -1.190784470531449e+06 -4.964337529607871e+06 4.595022664258483e+06 -2.833355909528671e+03 -4.488785800124559e+03 -5.567840187894520e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.110000000000000e+02 -1.190841137720118e+06 -4.964427304453177e+06 4.594911305802825e+06 -2.833339900956510e+03 -4.488656042273434e+03 -5.567953427750675e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.120000000000000e+02 -1.190897804601400e+06 -4.964517076726940e+06 4.594799945053532e+06 -2.833323891211543e+03 -4.488526280161385e+03 -5.568066666335110e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.130000000000000e+02 -1.190954471130614e+06 -4.964606846346547e+06 4.594688582111430e+06 -2.833307880359090e+03 -4.488396521135288e+03 -5.568179897581862e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.140000000000000e+02 -1.191011137363350e+06 -4.964696613414879e+06 4.594577216850968e+06 -2.833291866519207e+03 -4.488266756887202e+03 -5.568293129152032e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.150000000000000e+02 -1.191067803299736e+06 -4.964786377932140e+06 4.594465849271879e+06 -2.833275851069927e+03 -4.488136986651105e+03 -5.568406361062994e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.160000000000000e+02 -1.191124468895087e+06 -4.964876139815724e+06 4.594354479474988e+06 -2.833259834052346e+03 -4.488007217526985e+03 -5.568519587463019e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.170000000000000e+02 -1.191181134160431e+06 -4.964965899086078e+06 4.594243107435373e+06 -2.833243815349977e+03 -4.487877448657900e+03 -5.568632809108190e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.180000000000000e+02 -1.191237799140458e+06 -4.965055655825836e+06 4.594131733052131e+06 -2.833227794544246e+03 -4.487747671801980e+03 -5.568746032955068e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.190000000000000e+02 -1.191294463745925e+06 -4.965145409869988e+06 4.594020356526729e+06 -2.833211773562288e+03 -4.487617901759012e+03 -5.568859245990649e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.200000000000000e+02 -1.191351128076981e+06 -4.965235161403794e+06 4.593908977632976e+06 -2.833195748702369e+03 -4.487488122826196e+03 -5.568972462756934e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.210000000000000e+02 -1.191407792078051e+06 -4.965324910324456e+06 4.593797596496388e+06 -2.833179723371267e+03 -4.487358343004473e+03 -5.569085675169728e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.220000000000000e+02 -1.191464455737798e+06 -4.965414656611074e+06 4.593686213142504e+06 -2.833163696318671e+03 -4.487228564938155e+03 -5.569198881612172e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.230000000000000e+02 -1.191521119134328e+06 -4.965504400408068e+06 4.593574827394942e+06 -2.833147666123492e+03 -4.487098775637595e+03 -5.569312093383428e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.240000000000000e+02 -1.191577782156124e+06 -4.965594141509252e+06 4.593463439505511e+06 -2.833131635971351e+03 -4.486968993106814e+03 -5.569425294283289e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.250000000000000e+02 -1.191634444903332e+06 -4.965683880099872e+06 4.593352049247987e+06 -2.833115601821959e+03 -4.486839201583357e+03 -5.569538499049623e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.260000000000000e+02 -1.191691107309236e+06 -4.965773616056526e+06 4.593240656773067e+06 -2.833099567718309e+03 -4.486709410979157e+03 -5.569651697748512e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.270000000000000e+02 -1.191747769396002e+06 -4.965863349420247e+06 4.593129262030641e+06 -2.833083531398782e+03 -4.486579618425807e+03 -5.569764893739063e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.280000000000000e+02 -1.191804431152372e+06 -4.965953080170270e+06 4.593017865046090e+06 -2.833067493182864e+03 -4.486449825804359e+03 -5.569878085335040e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.290000000000000e+02 -1.191861092589612e+06 -4.966042808327402e+06 4.592906465793988e+06 -2.833051454195161e+03 -4.486320030553612e+03 -5.569991274140659e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.300000000000000e+02 -1.191917753729887e+06 -4.966132533932676e+06 4.592795064224220e+06 -2.833035412100495e+03 -4.486190229905104e+03 -5.570104463464729e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.310000000000000e+02 -1.191974414539662e+06 -4.966222256924116e+06 4.592683660412489e+06 -2.833019368262399e+03 -4.486060428875964e+03 -5.570217648583060e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.320000000000000e+02 -1.192031075041339e+06 -4.966311977343136e+06 4.592572254308210e+06 -2.833003323102899e+03 -4.485930623787845e+03 -5.570330832328324e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.330000000000000e+02 -1.192087735201305e+06 -4.966401695127642e+06 4.592460845987242e+06 -2.832987276115752e+03 -4.485800820166460e+03 -5.570444010388862e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.340000000000000e+02 -1.192144395053107e+06 -4.966491410339639e+06 4.592349435373831e+06 -2.832971227895309e+03 -4.485671012490280e+03 -5.570557187033830e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.350000000000000e+02 -1.192201054574346e+06 -4.966581122937768e+06 4.592238022518519e+06 -2.832955177802863e+03 -4.485541204627742e+03 -5.570670359371053e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.360000000000000e+02 -1.192257713787185e+06 -4.966670832963039e+06 4.592126607371187e+06 -2.832939125045031e+03 -4.485411392727632e+03 -5.570783530913622e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.370000000000000e+02 -1.192314372702892e+06 -4.966760540436264e+06 4.592015189906411e+06 -2.832923070667751e+03 -4.485281575135911e+03 -5.570896702554915e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.380000000000000e+02 -1.192371031310210e+06 -4.966850245336680e+06 4.591903770149563e+06 -2.832907013679409e+03 -4.485151753632621e+03 -5.571009873273438e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.390000000000000e+02 -1.192427689542185e+06 -4.966939947540548e+06 4.591792348251864e+06 -2.832890956389175e+03 -4.485021939030776e+03 -5.571123033171106e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.400000000000000e+02 -1.192484347476925e+06 -4.967029647192238e+06 4.591680924036879e+06 -2.832874897630216e+03 -4.484892118388840e+03 -5.571236193386537e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.410000000000000e+02 -1.192541005069750e+06 -4.967119344209211e+06 4.591569497605494e+06 -2.832858837325472e+03 -4.484762299256955e+03 -5.571349347757988e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.420000000000000e+02 -1.192597662365103e+06 -4.967209038673662e+06 4.591458068857251e+06 -2.832842774094901e+03 -4.484632474733791e+03 -5.571462502560673e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.430000000000000e+02 -1.192654319351970e+06 -4.967298730565204e+06 4.591346637817048e+06 -2.832826709491727e+03 -4.484502645731523e+03 -5.571575656356981e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.440000000000000e+02 -1.192710976007959e+06 -4.967388419842497e+06 4.591235204535441e+06 -2.832810643103478e+03 -4.484372816767994e+03 -5.571688805622844e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.450000000000000e+02 -1.192767632332953e+06 -4.967478106505360e+06 4.591123769012650e+06 -2.832794574923185e+03 -4.484242987553228e+03 -5.571801950599508e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.460000000000000e+02 -1.192824288338218e+06 -4.967567790574599e+06 4.591012331223235e+06 -2.832778505919911e+03 -4.484113155692581e+03 -5.571915092822054e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.470000000000000e+02 -1.192880944034694e+06 -4.967657472070507e+06 4.590900891142400e+06 -2.832762433750108e+03 -4.483983320272836e+03 -5.572028234078685e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.480000000000000e+02 -1.192937599433642e+06 -4.967747151013881e+06 4.590789448744708e+06 -2.832746359878689e+03 -4.483853478972089e+03 -5.572141375624351e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.490000000000000e+02 -1.192994254468124e+06 -4.967836827281024e+06 4.590678004181401e+06 -2.832730285537595e+03 -4.483723642601006e+03 -5.572254508044847e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.500000000000000e+02 -1.193050909238261e+06 -4.967926501057046e+06 4.590566557226146e+06 -2.832714206856594e+03 -4.483593795471827e+03 -5.572367645924354e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.510000000000000e+02 -1.193107563632802e+06 -4.968016172136299e+06 4.590455108130411e+06 -2.832698129453857e+03 -4.483463954882560e+03 -5.572480772583524e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.520000000000000e+02 -1.193164217729597e+06 -4.968105840662717e+06 4.590343656718188e+06 -2.832682048885656e+03 -4.483334108440981e+03 -5.572593900156881e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.530000000000000e+02 -1.193220871517386e+06 -4.968195506615532e+06 4.590232203014874e+06 -2.832665965609068e+03 -4.483204258490821e+03 -5.572707026519211e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.540000000000000e+02 -1.193277524962892e+06 -4.968285169933210e+06 4.590120747095722e+06 -2.832649882715756e+03 -4.483074409485763e+03 -5.572820146647507e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.550000000000000e+02 -1.193334178077130e+06 -4.968374830636170e+06 4.590009288935777e+06 -2.832633797552604e+03 -4.482944560407060e+03 -5.572933262553670e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.560000000000000e+02 -1.193390830915671e+06 -4.968464488827149e+06 4.589897828409368e+06 -2.832617708695573e+03 -4.482814702001085e+03 -5.573046382457025e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.570000000000000e+02 -1.193447483422954e+06 -4.968554144403446e+06 4.589786365642115e+06 -2.832601619373866e+03 -4.482684843037093e+03 -5.573159497734963e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.580000000000000e+02 -1.193504135598786e+06 -4.968643797364764e+06 4.589674900634391e+06 -2.832585527873580e+03 -4.482554984039341e+03 -5.573272608717546e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.590000000000000e+02 -1.193560787454426e+06 -4.968733447731895e+06 4.589563433360755e+06 -2.832569435357809e+03 -4.482425122577517e+03 -5.573385716882040e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.600000000000000e+02 -1.193617438967489e+06 -4.968823095463511e+06 4.589451963871776e+06 -2.832553341625110e+03 -4.482295262690120e+03 -5.573498819006828e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.610000000000000e+02 -1.193674090193541e+06 -4.968912740662343e+06 4.589340492041781e+06 -2.832537244407338e+03 -4.482165395434683e+03 -5.573611923428578e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.620000000000000e+02 -1.193730741088157e+06 -4.969002383246279e+06 4.589229017971217e+06 -2.832521146546066e+03 -4.482035527504810e+03 -5.573725023400162e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.630000000000000e+02 -1.193787391662363e+06 -4.969092023235733e+06 4.589117541635117e+06 -2.832505046692121e+03 -4.481905657509191e+03 -5.573838120660193e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.640000000000000e+02 -1.193844041927175e+06 -4.969181660651103e+06 4.589006063008519e+06 -2.832488943999188e+03 -4.481775783870496e+03 -5.573951216876624e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.650000000000000e+02 -1.193900691849315e+06 -4.969271295430876e+06 4.588894582166699e+06 -2.832472841545429e+03 -4.481645911268421e+03 -5.574064306849519e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.660000000000000e+02 -1.193957341473209e+06 -4.969360927657190e+06 4.588783099009144e+06 -2.832456735865773e+03 -4.481516033092517e+03 -5.574177397532713e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.670000000000000e+02 -1.194013990765331e+06 -4.969450557268139e+06 4.588671613611620e+06 -2.832440628311527e+03 -4.481386154771479e+03 -5.574290483877836e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.680000000000000e+02 -1.194070639736946e+06 -4.969540184284517e+06 4.588560125948674e+06 -2.832424520070049e+03 -4.481256273902262e+03 -5.574403567328338e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.690000000000000e+02 -1.194127288387937e+06 -4.969629808706149e+06 4.588448636020519e+06 -2.832408409526511e+03 -4.481126390935542e+03 -5.574516648230404e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.700000000000000e+02 -1.194183936718187e+06 -4.969719430532866e+06 4.588337143827378e+06 -2.832392296743628e+03 -4.480996506324699e+03 -5.574629726184723e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.710000000000000e+02 -1.194240584716687e+06 -4.969809049744310e+06 4.588225649394165e+06 -2.832376183447659e+03 -4.480866620809060e+03 -5.574742799820687e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.720000000000000e+02 -1.194297232405511e+06 -4.969898666381324e+06 4.588114152670885e+06 -2.832360067220346e+03 -4.480736731648170e+03 -5.574855872455326e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.730000000000000e+02 -1.194353879762519e+06 -4.969988280402975e+06 4.588002653707646e+06 -2.832343950621813e+03 -4.480606841786715e+03 -5.574968940541538e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.740000000000000e+02 -1.194410526843264e+06 -4.970077891911963e+06 4.587891152378735e+06 -2.832327829886046e+03 -4.480476943016462e+03 -5.575082012472863e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.750000000000000e+02 -1.194467173547414e+06 -4.970167500722952e+06 4.587779648911035e+06 -2.832311709040235e+03 -4.480347051049705e+03 -5.575195073592115e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.760000000000000e+02 -1.194523819964181e+06 -4.970257107000739e+06 4.587668143102792e+06 -2.832295586313148e+03 -4.480217151084222e+03 -5.575308136811115e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.770000000000000e+02 -1.194580466037771e+06 -4.970346710642298e+06 4.587556635080157e+06 -2.832279462027178e+03 -4.480087252931987e+03 -5.575421193948729e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.780000000000000e+02 -1.194637111812606e+06 -4.970436311729737e+06 4.587445124742592e+06 -2.832263334620004e+03 -4.479957349167289e+03 -5.575534251780093e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.790000000000000e+02 -1.194693757255411e+06 -4.970525910201557e+06 4.587333612165399e+06 -2.832247206989733e+03 -4.479827444647837e+03 -5.575647305042115e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.800000000000000e+02 -1.194750402388337e+06 -4.970615506098728e+06 4.587222097298411e+06 -2.832231076558416e+03 -4.479697536434939e+03 -5.575760357283840e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.810000000000000e+02 -1.194807047177863e+06 -4.970705099359369e+06 4.587110580217417e+06 -2.832214944755815e+03 -4.479567629856808e+03 -5.575873403507914e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.820000000000000e+02 -1.194863691646386e+06 -4.970794690024840e+06 4.586999060871769e+06 -2.832198812120036e+03 -4.479437720748836e+03 -5.575986446887141e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.830000000000000e+02 -1.194920335804847e+06 -4.970884278115398e+06 4.586887539236651e+06 -2.832182676465116e+03 -4.479307807808530e+03 -5.576099489456348e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.840000000000000e+02 -1.194976979664498e+06 -4.970973863651830e+06 4.586776015286610e+06 -2.832166538956822e+03 -4.479177889226293e+03 -5.576212532180844e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.850000000000000e+02 -1.195033623169561e+06 -4.971063446531123e+06 4.586664489147810e+06 -2.832150400746743e+03 -4.479047973703023e+03 -5.576325567425440e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.860000000000000e+02 -1.195090266364448e+06 -4.971153026835380e+06 4.586552960719702e+06 -2.832134259548620e+03 -4.478918054555903e+03 -5.576438601675291e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.870000000000000e+02 -1.195146909238158e+06 -4.971242604544245e+06 4.586441430027218e+06 -2.832118117678859e+03 -4.478788132892778e+03 -5.576551632997259e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.880000000000000e+02 -1.195203551779439e+06 -4.971332179636982e+06 4.586329897095759e+06 -2.832101974138831e+03 -4.478658211047827e+03 -5.576664659922516e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.890000000000000e+02 -1.195260194021573e+06 -4.971421752175113e+06 4.586218361849966e+06 -2.832085827243856e+03 -4.478528283640059e+03 -5.576777687602713e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.900000000000000e+02 -1.195316835931289e+06 -4.971511322097157e+06 4.586106824365148e+06 -2.832069680171095e+03 -4.478398355461970e+03 -5.576890710707085e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.910000000000000e+02 -1.195373477497334e+06 -4.971600889382386e+06 4.585995284666719e+06 -2.832053531517447e+03 -4.478268429070834e+03 -5.577003727763722e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.920000000000000e+02 -1.195430118764130e+06 -4.971690454112876e+06 4.585883742654115e+06 -2.832037379943932e+03 -4.478138496919414e+03 -5.577116745543990e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.930000000000000e+02 -1.195486759709533e+06 -4.971780016247715e+06 4.585772198377462e+06 -2.832021227479374e+03 -4.478008562443484e+03 -5.577229760336784e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.940000000000000e+02 -1.195543400344562e+06 -4.971869575807290e+06 4.585660651811775e+06 -2.832005072425618e+03 -4.477878624086255e+03 -5.577342774168238e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.950000000000000e+02 -1.195600040669100e+06 -4.971959132791433e+06 4.585549102957269e+06 -2.831988914559586e+03 -4.477748682150289e+03 -5.577455786889248e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.960000000000000e+02 -1.195656680638738e+06 -4.972048687118113e+06 4.585437551914465e+06 -2.831972757177445e+03 -4.477618742763433e+03 -5.577568792025101e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.970000000000000e+02 -1.195713320286685e+06 -4.972138238848713e+06 4.585325998608147e+06 -2.831956597253673e+03 -4.477488801773055e+03 -5.577681794314361e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.980000000000000e+02 -1.195769959624193e+06 -4.972227788004011e+06 4.585214443012858e+06 -2.831940435901017e+03 -4.477358856582357e+03 -5.577794795389504e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.990000000000000e+02 -1.195826598651151e+06 -4.972317334583830e+06 4.585102885128805e+06 -2.831924271947571e+03 -4.477228907514786e+03 -5.577907795504430e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.000000000000000e+02 -1.195883237345172e+06 -4.972406878546878e+06 4.584991325006602e+06 -2.831908106098477e+03 -4.477098958240183e+03 -5.578020791343844e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.010000000000000e+02 -1.195939875717522e+06 -4.972496419913931e+06 4.584879762620789e+06 -2.831891939653796e+03 -4.476969006532398e+03 -5.578133784153961e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.020000000000000e+02 -1.195996513745816e+06 -4.972585958643706e+06 4.584768198021976e+06 -2.831875771636827e+03 -4.476839056500075e+03 -5.578246771005504e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.030000000000000e+02 -1.196053151496731e+06 -4.972675494859369e+06 4.584656631059177e+06 -2.831859599638956e+03 -4.476709097168979e+03 -5.578359761943640e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.040000000000000e+02 -1.196109788881336e+06 -4.972765028396678e+06 4.584545061933731e+06 -2.831843428662674e+03 -4.476579142558302e+03 -5.578472743283953e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.050000000000000e+02 -1.196166425999706e+06 -4.972854559440474e+06 4.584433490419045e+06 -2.831827253258851e+03 -4.476449177104859e+03 -5.578585730171028e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.060000000000000e+02 -1.196223062740403e+06 -4.972944087785022e+06 4.584321916767349e+06 -2.831811077752956e+03 -4.476319218460188e+03 -5.578698706249754e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.070000000000000e+02 -1.196279699192605e+06 -4.973033613594980e+06 4.584210340776762e+06 -2.831794900048782e+03 -4.476189252115694e+03 -5.578811684316922e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.080000000000000e+02 -1.196336335311595e+06 -4.973123136787830e+06 4.584098762548467e+06 -2.831778720288800e+03 -4.476059285697593e+03 -5.578924658070936e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.090000000000000e+02 -1.196392971097491e+06 -4.973212657363789e+06 4.583987182082202e+06 -2.831762539827600e+03 -4.475929318668168e+03 -5.579037627352336e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.100000000000000e+02 -1.196449606583582e+06 -4.973302175384344e+06 4.583875599302566e+06 -2.831746356572789e+03 -4.475799345904607e+03 -5.579150597277155e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.110000000000000e+02 -1.196506241736351e+06 -4.973391690787660e+06 4.583764014285388e+06 -2.831730171328343e+03 -4.475669373189983e+03 -5.579263562759545e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.120000000000000e+02 -1.196562876567054e+06 -4.973481203594508e+06 4.583652427005203e+06 -2.831713985344990e+03 -4.475539397765919e+03 -5.579376525502060e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.130000000000000e+02 -1.196619511075579e+06 -4.973570713804713e+06 4.583540837462217e+06 -2.831697797070093e+03 -4.475409420500119e+03 -5.579489485482170e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.140000000000000e+02 -1.196676145272937e+06 -4.973660221438658e+06 4.583429245631448e+06 -2.831681606092501e+03 -4.475279439469099e+03 -5.579602444454697e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.150000000000000e+02 -1.196732779103602e+06 -4.973749726393803e+06 4.583317651638656e+06 -2.831665416097846e+03 -4.475149462992021e+03 -5.579715393986156e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.160000000000000e+02 -1.196789412656508e+06 -4.973839228834378e+06 4.583206055282407e+06 -2.831649222187447e+03 -4.475019477374125e+03 -5.579828347442379e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.170000000000000e+02 -1.196846045898138e+06 -4.973928728698560e+06 4.583094456638533e+06 -2.831633025439332e+03 -4.474889488260987e+03 -5.579941299729648e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.180000000000000e+02 -1.196902678772971e+06 -4.974018225883820e+06 4.582982855832808e+06 -2.831616829664339e+03 -4.474759503632669e+03 -5.580054242637455e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.190000000000000e+02 -1.196959311325414e+06 -4.974107720472183e+06 4.582871252764613e+06 -2.831600631751227e+03 -4.474629516776406e+03 -5.580167183031062e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.200000000000000e+02 -1.197015943610998e+06 -4.974197212566207e+06 4.582759647308125e+06 -2.831584429278199e+03 -4.474499519418016e+03 -5.580280128745911e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.210000000000000e+02 -1.197072575540810e+06 -4.974286702001737e+06 4.582648039664746e+06 -2.831568227395378e+03 -4.474369524757249e+03 -5.580393066712381e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.220000000000000e+02 -1.197129207159176e+06 -4.974376188860655e+06 4.582536429734015e+06 -2.831552022406670e+03 -4.474239526627294e+03 -5.580506003607064e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.230000000000000e+02 -1.197185838443957e+06 -4.974465673102083e+06 4.582424817566082e+06 -2.831535816906799e+03 -4.474109527523739e+03 -5.580618936242077e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.240000000000000e+02 -1.197242469395038e+06 -4.974555154725849e+06 4.582313203161168e+06 -2.831519609599047e+03 -4.473979528549980e+03 -5.580731864289402e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.250000000000000e+02 -1.197299100023436e+06 -4.974644633752334e+06 4.582201586494276e+06 -2.831503400165733e+03 -4.473849527380830e+03 -5.580844789790187e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.260000000000000e+02 -1.197355730340405e+06 -4.974734110202286e+06 4.582089967539930e+06 -2.831487189379915e+03 -4.473719521947240e+03 -5.580957714093379e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.270000000000000e+02 -1.197412360356960e+06 -4.974823584096084e+06 4.581978346273127e+06 -2.831470975600319e+03 -4.473589511036673e+03 -5.581070638915631e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.280000000000000e+02 -1.197468990006203e+06 -4.974913055310296e+06 4.581866722845365e+06 -2.831454761187219e+03 -4.473459505464424e+03 -5.581183554374575e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.290000000000000e+02 -1.197525619355042e+06 -4.975002523968391e+06 4.581755097105094e+06 -2.831438545147369e+03 -4.473329493469458e+03 -5.581296470520757e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.300000000000000e+02 -1.197582248392230e+06 -4.975091990049653e+06 4.581643469077744e+06 -2.831422326419899e+03 -4.473199477960758e+03 -5.581409385445994e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.310000000000000e+02 -1.197638877084261e+06 -4.975181453492290e+06 4.581531838839177e+06 -2.831406106345656e+03 -4.473069464048606e+03 -5.581522294381699e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.320000000000000e+02 -1.197695505453520e+06 -4.975270914337598e+06 4.581420206338692e+06 -2.831389885369461e+03 -4.472939447562026e+03 -5.581635200539326e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.330000000000000e+02 -1.197752133510945e+06 -4.975360372605816e+06 4.581308571551454e+06 -2.831373661402753e+03 -4.472809427527359e+03 -5.581748105638005e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.340000000000000e+02 -1.197808761267783e+06 -4.975449828317692e+06 4.581196934451975e+06 -2.831357435611624e+03 -4.472679401399629e+03 -5.581861011240906e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.350000000000000e+02 -1.197865388679408e+06 -4.975539281390899e+06 4.581085295141338e+06 -2.831341208597335e+03 -4.472549376786358e+03 -5.581973910867112e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.360000000000000e+02 -1.197922015745697e+06 -4.975628731825273e+06 4.580973653619763e+06 -2.831324979957078e+03 -4.472419354093826e+03 -5.582086804363325e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.370000000000000e+02 -1.197978642522428e+06 -4.975718179723715e+06 4.580862009760893e+06 -2.831308749406481e+03 -4.472289323226652e+03 -5.582199700101884e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.380000000000000e+02 -1.198035268964968e+06 -4.975807625003905e+06 4.580750363665812e+06 -2.831292517029972e+03 -4.472159292314049e+03 -5.582312591404961e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.390000000000000e+02 -1.198091895106584e+06 -4.975897067727273e+06 4.580638715259084e+06 -2.831276281525874e+03 -4.472029255827311e+03 -5.582425483363900e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.400000000000000e+02 -1.198148520891759e+06 -4.975986507791362e+06 4.580527064666537e+06 -2.831260046398957e+03 -4.471899222303998e+03 -5.582538367455914e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t</EPHEMLISTList>\n\t</EPH>\n\t<ATT>\n\t\t<SATID>Imaginary1</SATID>\n\t\t<GENERATIONTIME>1959-11-30T00:18:13.000000Z</GENERATIONTIME>\n\t\t<STARTTIME>1959-11-25T17:39:40.987511Z</STARTTIME>\n\t\t<NUMPOINTS>840</NUMPOINTS>\n\t\t<TIMEINTERVAL>2.000000000000000e-02</TIMEINTERVAL>\n\t\t<ATTLISTList>\n\t\t\t<ATTLIST>1.000000000000000e+00 6.795012901179663e-01 -7.039793799103053e-01 -2.023917199358860e-01 -4.157668926833060e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.000000000000000e+00 6.795031921696149e-01 -7.039852730262131e-01 -2.023634939866958e-01 -4.158321169664750e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.000000000000000e+00 6.795050940076900e-01 -7.039911671585269e-01 -2.023352617254185e-01 -4.158973001693780e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.000000000000000e+00 6.795069956282339e-01 -7.039970623085654e-01 -2.023070231575671e-01 -4.159624423340190e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.000000000000000e+00 6.795088970622606e-01 -7.040029584543205e-01 -2.022787782519255e-01 -4.160275435235960e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.000000000000000e+00 6.795107983244882e-01 -7.040088555841620e-01 -2.022505269954615e-01 -4.160926038219470e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.000000000000000e+00 6.795126993442279e-01 -7.040147537480659e-01 -2.022222694541582e-01 -4.161576229965050e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.000000000000000e+00 6.795146002014344e-01 -7.040206528897818e-01 -2.021940055491108e-01 -4.162226012287550e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>9.000000000000000e+00 6.795165008206093e-01 -7.040265530611999e-01 -2.021657353543056e-01 -4.162875383594130e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.000000000000000e+01 6.795184012613739e-01 -7.040324542188404e-01 -2.021374588139688e-01 -4.163524346048480e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.100000000000000e+01 6.795203015174702e-01 -7.040383563686955e-01 -2.021091759287698e-01 -4.164172898266690e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.200000000000000e+01 6.795222015273501e-01 -7.040442595509356e-01 -2.020808867636002e-01 -4.164821040134950e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.300000000000000e+01 6.795241013689588e-01 -7.040501637119229e-01 -2.020525912387455e-01 -4.165468772698050e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.400000000000000e+01 6.795260010190228e-01 -7.040560688668507e-01 -2.020242893776136e-01 -4.166116095744060e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.500000000000000e+01 6.795279004301762e-01 -7.040619750503345e-01 -2.019959812213390e-01 -4.166763006948090e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.600000000000000e+01 6.795297996610842e-01 -7.040678822172045e-01 -2.019676667204161e-01 -4.167409509825730e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.700000000000000e+01 6.795316987072143e-01 -7.040737903710086e-01 -2.019393458766498e-01 -4.168055603755300e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.800000000000000e+01 6.795335975150002e-01 -7.040796995524565e-01 -2.019110187332267e-01 -4.168701285238810e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.900000000000000e+01 6.795354961360811e-01 -7.040856097198989e-01 -2.018826852506496e-01 -4.169346558437880e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.000000000000000e+01 6.795373945807668e-01 -7.040915208672780e-01 -2.018543454144770e-01 -4.169991422628810e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.100000000000000e+01 6.795392927722119e-01 -7.040974330490690e-01 -2.018259992963614e-01 -4.170635875234390e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.200000000000000e+01 6.795411908128990e-01 -7.041033461910222e-01 -2.017976468003938e-01 -4.171279919900170e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.300000000000000e+01 6.795430886004499e-01 -7.041092603677667e-01 -2.017692880179178e-01 -4.171923552104290e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.400000000000000e+01 6.795449862043442e-01 -7.041151755254639e-01 -2.017409228913374e-01 -4.172566776259380e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.500000000000000e+01 6.795468836354301e-01 -7.041210916568698e-01 -2.017125514075215e-01 -4.173209592126210e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.600000000000000e+01 6.795487808108983e-01 -7.041270088231787e-01 -2.016841736381700e-01 -4.173851995499380e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.700000000000000e+01 6.795506778088990e-01 -7.041329269658226e-01 -2.016557895141527e-01 -4.174493990213870e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.800000000000000e+01 6.795525746226287e-01 -7.041388460888128e-01 -2.016273990420547e-01 -4.175135576251040e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.900000000000000e+01 6.795544711875586e-01 -7.041447662384701e-01 -2.015990022805154e-01 -4.175776751059130e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.000000000000000e+01 6.795563675697758e-01 -7.041506873681586e-01 -2.015705991641825e-01 -4.176417516142380e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.100000000000000e+01 6.795582637705441e-01 -7.041566094724618e-01 -2.015421897003983e-01 -4.177057873886140e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.200000000000000e+01 6.795601597194840e-01 -7.041625326055196e-01 -2.015137739450329e-01 -4.177697819421850e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.300000000000000e+01 6.795620555097833e-01 -7.041684566994181e-01 -2.014853518115018e-01 -4.178337356262010e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.400000000000000e+01 6.795639510474406e-01 -7.041743818175766e-01 -2.014569233952892e-01 -4.178976483219710e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.500000000000000e+01 6.795658464051249e-01 -7.041803079097471e-01 -2.014284886223090e-01 -4.179615201370400e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.600000000000000e+01 6.795677415806715e-01 -7.041862349773556e-01 -2.014000474931086e-01 -4.180253510417940e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.700000000000000e+01 6.795696364968842e-01 -7.041921630755553e-01 -2.013716000788236e-01 -4.180891407532190e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.800000000000000e+01 6.795715312385208e-01 -7.041980921417377e-01 -2.013431463024344e-01 -4.181528896355330e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.900000000000000e+01 6.795734257882386e-01 -7.042040221875822e-01 -2.013146861801534e-01 -4.182165976446780e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.000000000000000e+01 6.795753200928879e-01 -7.042099532511444e-01 -2.012862197602649e-01 -4.182802645705700e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.100000000000000e+01 6.795772142114155e-01 -7.042158852897767e-01 -2.012577469866033e-01 -4.183438906049140e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.200000000000000e+01 6.795791081393254e-01 -7.042218183066008e-01 -2.012292678618453e-01 -4.184074757087550e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.300000000000000e+01 6.795810018215931e-01 -7.042277523386692e-01 -2.012007824414075e-01 -4.184710198032180e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.400000000000000e+01 6.795828953184365e-01 -7.042336873443790e-01 -2.011722906634436e-01 -4.185345229695360e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.500000000000000e+01 6.795847886270806e-01 -7.042396233240191e-01 -2.011437925326658e-01 -4.185979852681810e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.600000000000000e+01 6.795866816859607e-01 -7.042455603201958e-01 -2.011152881086695e-01 -4.186614065477190e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.700000000000000e+01 6.795885745799152e-01 -7.042514982738010e-01 -2.010867773061127e-01 -4.187247869648390e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.800000000000000e+01 6.795904672174917e-01 -7.042574372480126e-01 -2.010582602146097e-01 -4.187881263177330e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.900000000000000e+01 6.795923596757100e-01 -7.042633771889883e-01 -2.010297367569464e-01 -4.188514247551360e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.000000000000000e+01 6.795942519378680e-01 -7.042693181059694e-01 -2.010012069532644e-01 -4.189146823511180e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.100000000000000e+01 6.795961439552599e-01 -7.042752600345781e-01 -2.009726708460155e-01 -4.189778988667740e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.200000000000000e+01 6.795980357844214e-01 -7.042812029327177e-01 -2.009441283839045e-01 -4.190410745539760e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.300000000000000e+01 6.795999274203595e-01 -7.042871468046601e-01 -2.009155795682612e-01 -4.191042093254690e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.400000000000000e+01 6.796018188080356e-01 -7.042930916886662e-01 -2.008870244518403e-01 -4.191673030325510e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.500000000000000e+01 6.796037100041895e-01 -7.042990375436710e-01 -2.008584629804457e-01 -4.192303558586010e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.600000000000000e+01 6.796056010159021e-01 -7.043049843631807e-01 -2.008298951488766e-01 -4.192933678804790e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.700000000000000e+01 6.796074917731262e-01 -7.043109321979667e-01 -2.008013210200126e-01 -4.193563387966340e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.800000000000000e+01 6.796093823611057e-01 -7.043168809854401e-01 -2.007727405152986e-01 -4.194192689510570e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.900000000000000e+01 6.796112726996719e-01 -7.043228307833497e-01 -2.007441537077760e-01 -4.194821580246480e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.000000000000000e+01 6.796131628397541e-01 -7.043287815536684e-01 -2.007155605512496e-01 -4.195450062470620e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.100000000000000e+01 6.796150527998679e-01 -7.043347332831532e-01 -2.006869610264543e-01 -4.196078136485220e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.200000000000000e+01 6.796169424965223e-01 -7.043406860315834e-01 -2.006583552103851e-01 -4.196705799195700e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.300000000000000e+01 6.796188320142774e-01 -7.043466397368305e-01 -2.006297430251785e-01 -4.197333054018500e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.400000000000000e+01 6.796207213316237e-01 -7.043525944136150e-01 -2.006011244908768e-01 -4.197959900343160e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.500000000000000e+01 6.796226104022928e-01 -7.043585500965851e-01 -2.005724996459374e-01 -4.198586335411420e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.600000000000000e+01 6.796244992744610e-01 -7.043645067481321e-01 -2.005438684502678e-01 -4.199212362336900e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.700000000000000e+01 6.796263879612657e-01 -7.043704643589256e-01 -2.005152308895167e-01 -4.199837981206470e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.800000000000000e+01 6.796282763888346e-01 -7.043764229821449e-01 -2.004865870310055e-01 -4.200463189077510e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.900000000000000e+01 6.796301646299087e-01 -7.043823825638621e-01 -2.004579368085549e-01 -4.201087989126120e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.000000000000000e+01 6.796320526743754e-01 -7.043883431120742e-01 -2.004292802281825e-01 -4.201712380273550e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.100000000000000e+01 6.796339404640521e-01 -7.043943046673543e-01 -2.004006173455687e-01 -4.202336360900710e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.200000000000000e+01 6.796358280863000e-01 -7.044002671655367e-01 -2.003719480801510e-01 -4.202959934540350e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.300000000000000e+01 6.796377154506369e-01 -7.044062306726971e-01 -2.003432725126685e-01 -4.203583097116940e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.400000000000000e+01 6.796396026170802e-01 -7.044121951441673e-01 -2.003145905885660e-01 -4.204205851297100e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.500000000000000e+01 6.796414895980506e-01 -7.044181605699508e-01 -2.002859022968422e-01 -4.204828197833920e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.600000000000000e+01 6.796433763167853e-01 -7.044241270061340e-01 -2.002572077056954e-01 -4.205450133201960e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.700000000000000e+01 6.796452628469613e-01 -7.044300943980907e-01 -2.002285067480556e-01 -4.206071660618740e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.800000000000000e+01 6.796471491794277e-01 -7.044360627519347e-01 -2.001997994317655e-01 -4.206692779737960e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.900000000000000e+01 6.796490352585286e-01 -7.044420321083782e-01 -2.001710858057136e-01 -4.207313487882250e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.000000000000000e+01 6.796509211421690e-01 -7.044480024227050e-01 -2.001423658208579e-01 -4.207933788561480e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.100000000000000e+01 6.796528068342278e-01 -7.044539736935043e-01 -2.001136394686103e-01 -4.208553680796570e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.200000000000000e+01 6.796546922590817e-01 -7.044599459736781e-01 -2.000849068215534e-01 -4.209173162493760e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.300000000000000e+01 6.796565775227883e-01 -7.044659191869860e-01 -2.000561677783481e-01 -4.209792237019010e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.400000000000000e+01 6.796584625182990e-01 -7.044718934092341e-01 -2.000274224403609e-01 -4.210410901012060e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.500000000000000e+01 6.796603473237741e-01 -7.044778685840885e-01 -1.999986707327806e-01 -4.211029156948910e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.600000000000000e+01 6.796622319377462e-01 -7.044838447124563e-01 -1.999699126555146e-01 -4.211647004561090e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.700000000000000e+01 6.796641162823588e-01 -7.044898218484826e-01 -1.999411482841119e-01 -4.212264441894000e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.800000000000000e+01 6.796660004402233e-01 -7.044957999329756e-01 -1.999123775387696e-01 -4.212881471373130e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.900000000000000e+01 6.796678843935604e-01 -7.045017789771568e-01 -1.998836004379378e-01 -4.213498092998230e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>9.000000000000000e+01 6.796697681018203e-01 -7.045077590123142e-01 -1.998548170131007e-01 -4.214114303771320e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>9.100000000000000e+01 6.796716515954266e-01 -7.045137400133533e-01 -1.998260272412535e-01 -4.214730106329730e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>9.200000000000000e+01 6.796735349070104e-01 -7.045197219563238e-01 -1.997972310910624e-01 -4.215345501780120e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>9.300000000000000e+01 6.796754179552619e-01 -7.045257049010482e-01 -1.997684286340649e-01 -4.215960486174000e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>9.400000000000000e+01 6.796773008000128e-01 -7.045316888017777e-01 -1.997396198185027e-01 -4.216575062872800e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>9.500000000000000e+01 6.796791834556047e-01 -7.045376736482865e-01 -1.997108046288966e-01 -4.217189232014360e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>9.600000000000000e+01 6.796810658444614e-01 -7.045436594972865e-01 -1.996819831342765e-01 -4.217802990030720e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>9.700000000000000e+01 6.796829480627019e-01 -7.045496462769856e-01 -1.996531552486250e-01 -4.218416341516560e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>9.800000000000000e+01 6.796848300095097e-01 -7.045556340610444e-01 -1.996243210622798e-01 -4.219029281964820e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>9.900000000000000e+01 6.796867117714123e-01 -7.045616227842402e-01 -1.995954804989941e-01 -4.219641815816980e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.000000000000000e+02 6.796885933255380e-01 -7.045676124646588e-01 -1.995666335746971e-01 -4.220253941013960e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.010000000000000e+02 6.796904746220614e-01 -7.045736031379983e-01 -1.995377803348005e-01 -4.220865655569230e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.020000000000000e+02 6.796923557182968e-01 -7.045795947603323e-01 -1.995089207298232e-01 -4.221476962745790e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.030000000000000e+02 6.796942366154390e-01 -7.045855873298367e-01 -1.994800547590306e-01 -4.222087862845600e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.040000000000000e+02 6.796961172538162e-01 -7.045915808937199e-01 -1.994511824669762e-01 -4.222698350936580e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.050000000000000e+02 6.796979976852925e-01 -7.045975754080924e-01 -1.994223038181599e-01 -4.223308432377840e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.060000000000000e+02 6.796998779255191e-01 -7.046035708629457e-01 -1.993934187931938e-01 -4.223918106666610e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.070000000000000e+02 6.797017578961645e-01 -7.046095673167410e-01 -1.993645274591496e-01 -4.224527369504360e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.080000000000000e+02 6.797036376917659e-01 -7.046155646976316e-01 -1.993356297340957e-01 -4.225136226123380e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.090000000000000e+02 6.797055172182811e-01 -7.046215630731820e-01 -1.993067257049162e-01 -4.225744672978040e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.100000000000000e+02 6.797073965522089e-01 -7.046275623893914e-01 -1.992778152955133e-01 -4.226352711795160e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.110000000000000e+02 6.797092756839871e-01 -7.046335626522799e-01 -1.992488985150173e-01 -4.226960342441640e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.120000000000000e+02 6.797111545451996e-01 -7.046395639095456e-01 -1.992199754295197e-01 -4.227567563101480e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.130000000000000e+02 6.797130332134302e-01 -7.046455661048171e-01 -1.991910459655104e-01 -4.228174376472930e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.140000000000000e+02 6.797149116732815e-01 -7.046515692483717e-01 -1.991621101374741e-01 -4.228780782186530e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.150000000000000e+02 6.797167898714911e-01 -7.046575733784293e-01 -1.991331679940133e-01 -4.229386778112310e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.160000000000000e+02 6.797186678692761e-01 -7.046635784513378e-01 -1.991042194748240e-01 -4.229992365824300e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.170000000000000e+02 6.797205456600242e-01 -7.046695844701800e-01 -1.990752645881302e-01 -4.230597545771560e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.180000000000000e+02 6.797224231929014e-01 -7.046755914710134e-01 -1.990463033812120e-01 -4.231202316153090e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.190000000000000e+02 6.797243005156455e-01 -7.046815994188381e-01 -1.990173358088236e-01 -4.231806678692700e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.200000000000000e+02 6.797261776449124e-01 -7.046876083013288e-01 -1.989883618542364e-01 -4.232410633855860e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.210000000000000e+02 6.797280544946541e-01 -7.046936181790645e-01 -1.989593815997579e-01 -4.233014179108430e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.220000000000000e+02 6.797299311798736e-01 -7.046996289703368e-01 -1.989303949329057e-01 -4.233617317510400e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.230000000000000e+02 6.797318075843050e-01 -7.047056407566004e-01 -1.989014019664283e-01 -4.234220045996710e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.240000000000000e+02 6.797336837877276e-01 -7.047116534806431e-01 -1.988724026229552e-01 -4.234822366896840e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.250000000000000e+02 6.797355597921615e-01 -7.047176671404248e-01 -1.988433969000887e-01 -4.235424280315040e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.260000000000000e+02 6.797374355242299e-01 -7.047236817876797e-01 -1.988143848676253e-01 -4.236025783996730e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.270000000000000e+02 6.797393110583803e-01 -7.047296973694713e-01 -1.987853664521773e-01 -4.236626879825200e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.280000000000000e+02 6.797411863821243e-01 -7.047357138916002e-01 -1.987563416709577e-01 -4.237227568937300e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.290000000000000e+02 6.797430614399738e-01 -7.047417313962825e-01 -1.987273105692628e-01 -4.237827847718480e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.300000000000000e+02 6.797449362940748e-01 -7.047477498368057e-01 -1.986982730912777e-01 -4.238427719175490e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.310000000000000e+02 6.797468109439584e-01 -7.047537692133381e-01 -1.986692292359904e-01 -4.239027183080040e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.320000000000000e+02 6.797486853211984e-01 -7.047597895736176e-01 -1.986401790695730e-01 -4.239626237607330e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.330000000000000e+02 6.797505595173958e-01 -7.047658108521972e-01 -1.986111225027640e-01 -4.240224885338540e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.340000000000000e+02 6.797524334436709e-01 -7.047718331129262e-01 -1.985820596178356e-01 -4.240823122922970e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.350000000000000e+02 6.797543071639158e-01 -7.047778563082016e-01 -1.985529903564512e-01 -4.241420953208690e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.360000000000000e+02 6.797561806809566e-01 -7.047838804346076e-01 -1.985239147172657e-01 -4.242018376796050e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.370000000000000e+02 6.797580539211397e-01 -7.047899055464529e-01 -1.984948327649853e-01 -4.242615390024520e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.380000000000000e+02 6.797599269624665e-01 -7.047959315858279e-01 -1.984657444282991e-01 -4.243211996316710e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.390000000000000e+02 6.797617997916312e-01 -7.048019585618789e-01 -1.984366497188867e-01 -4.243808195154290e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.400000000000000e+02 6.797636723557344e-01 -7.048079865133727e-01 -1.984075486832945e-01 -4.244403983950480e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.410000000000000e+02 6.797655447081312e-01 -7.048140153988206e-01 -1.983784412764372e-01 -4.244999366054020e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.420000000000000e+02 6.797674168530146e-01 -7.048200452153767e-01 -1.983493274921200e-01 -4.245594341194520e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.430000000000000e+02 6.797692887287506e-01 -7.048260760093651e-01 -1.983202073822311e-01 -4.246188905734140e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.440000000000000e+02 6.797711603963520e-01 -7.048321077321323e-01 -1.982910808982288e-01 -4.246783064260640e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.450000000000000e+02 6.797730318568528e-01 -7.048381403862743e-01 -1.982619480296380e-01 -4.247376814522210e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.460000000000000e+02 6.797749030429507e-01 -7.048441740175544e-01 -1.982328088443416e-01 -4.247970155428780e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.470000000000000e+02 6.797767740425864e-01 -7.048502085623766e-01 -1.982036632581659e-01 -4.248563089884010e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.480000000000000e+02 6.797786447688474e-01 -7.048562440816140e-01 -1.981745113552329e-01 -4.249155615536030e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.490000000000000e+02 6.797805152918426e-01 -7.048622805270170e-01 -1.981453530624595e-01 -4.249747733175350e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.500000000000000e+02 6.797823856004088e-01 -7.048683179042089e-01 -1.981161883940513e-01 -4.250339443528250e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.510000000000000e+02 6.797842556315041e-01 -7.048743562578088e-01 -1.980870174095032e-01 -4.250930744517820e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.520000000000000e+02 6.797861254679065e-01 -7.048803955271700e-01 -1.980578400312500e-01 -4.251521639305070e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.530000000000000e+02 6.797879950808270e-01 -7.048864357327520e-01 -1.980286562852194e-01 -4.252112126740020e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.540000000000000e+02 6.797898644234995e-01 -7.048924769088557e-01 -1.979994662123582e-01 -4.252702204480930e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.550000000000000e+02 6.797917335587214e-01 -7.048985190102082e-01 -1.979702697516701e-01 -4.253291874413050e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.560000000000000e+02 6.797936024814468e-01 -7.049045620367884e-01 -1.979410669144260e-01 -4.253881138206560e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.570000000000000e+02 6.797954711314728e-01 -7.049106060338930e-01 -1.979118577512490e-01 -4.254469992276370e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.580000000000000e+02 6.797973395895273e-01 -7.049166509416007e-01 -1.978826421881329e-01 -4.255058440165000e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.590000000000000e+02 6.797992077727463e-01 -7.049226968198082e-01 -1.978534203010406e-01 -4.255646478521280e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.600000000000000e+02 6.798010757438010e-01 -7.049287436221506e-01 -1.978241920317650e-01 -4.256234109922370e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.610000000000000e+02 6.798029435130043e-01 -7.049347913405176e-01 -1.977949573702664e-01 -4.256821334811320e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.620000000000000e+02 6.798048109921104e-01 -7.049408400387458e-01 -1.977657163974766e-01 -4.257408149615750e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.630000000000000e+02 6.798066782686570e-01 -7.049468896519006e-01 -1.977364690331906e-01 -4.257994558159980e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.640000000000000e+02 6.798085453254362e-01 -7.049529401935497e-01 -1.977072152891063e-01 -4.258580558837690e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.650000000000000e+02 6.798104121186409e-01 -7.049589916930997e-01 -1.976779552097546e-01 -4.259166151046600e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.660000000000000e+02 6.798122786875559e-01 -7.049650441220499e-01 -1.976486887566367e-01 -4.259751335948540e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.670000000000000e+02 6.798141450456567e-01 -7.049710974699759e-01 -1.976194159167985e-01 -4.260336114115990e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.680000000000000e+02 6.798160111310448e-01 -7.049771517814684e-01 -1.975901367469469e-01 -4.260920483048780e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.690000000000000e+02 6.798178769972170e-01 -7.049832070156776e-01 -1.975608511999767e-01 -4.261504445648290e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.700000000000000e+02 6.798197426591834e-01 -7.049892631641861e-01 -1.975315592543420e-01 -4.262088000696420e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.710000000000000e+02 6.798216080319331e-01 -7.049953202865271e-01 -1.975022609925256e-01 -4.262671145906310e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.720000000000000e+02 6.798234732209134e-01 -7.050013783035031e-01 -1.974729563203813e-01 -4.263253886532880e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.730000000000000e+02 6.798253381257020e-01 -7.050074372898302e-01 -1.974436453256216e-01 -4.263836217341660e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.740000000000000e+02 6.798272028242294e-01 -7.050134971891345e-01 -1.974143279332440e-01 -4.264418140844000e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.750000000000000e+02 6.798290672951102e-01 -7.050195580133446e-01 -1.973850041695649e-01 -4.264999658042160e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.760000000000000e+02 6.798309315042805e-01 -7.050256197886668e-01 -1.973556740611991e-01 -4.265580766411970e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.770000000000000e+02 6.798327954797303e-01 -7.050316824936707e-01 -1.973263375827155e-01 -4.266161467351580e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.780000000000000e+02 6.798346592564191e-01 -7.050377461022169e-01 -1.972969947013596e-01 -4.266741762312860e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.790000000000000e+02 6.798365227410014e-01 -7.050438106819047e-01 -1.972676455028438e-01 -4.267321647505450e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.800000000000000e+02 6.798383860193378e-01 -7.050498761693755e-01 -1.972382899075223e-01 -4.267901126463060e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.810000000000000e+02 6.798402490773372e-01 -7.050559425747454e-01 -1.972089279269271e-01 -4.268480198400300e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.820000000000000e+02 6.798421118500496e-01 -7.050620099429011e-01 -1.971795596251077e-01 -4.269058861845190e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.830000000000000e+02 6.798439744368735e-01 -7.050680782037289e-01 -1.971501849026640e-01 -4.269637119032000e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.840000000000000e+02 6.798458367370194e-01 -7.050741474283274e-01 -1.971208038566758e-01 -4.270214967021480e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.850000000000000e+02 6.798476988269346e-01 -7.050802175609912e-01 -1.970914164143522e-01 -4.270792408501470e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.860000000000000e+02 6.798495606920428e-01 -7.050862886102385e-01 -1.970620225921574e-01 -4.271369443824960e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.870000000000000e+02 6.798514222739783e-01 -7.050923606200558e-01 -1.970326224391282e-01 -4.271946069470040e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.880000000000000e+02 6.798532836506548e-01 -7.050984335328769e-01 -1.970032158829008e-01 -4.272522288649730e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.890000000000000e+02 6.798551448009553e-01 -7.051045073627854e-01 -1.969738029441770e-01 -4.273098100985320e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.900000000000000e+02 6.798570056664353e-01 -7.051105821499222e-01 -1.969443836810372e-01 -4.273673505268180e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.910000000000000e+02 6.798588663180682e-01 -7.051166578441354e-01 -1.969149580221255e-01 -4.274248503037880e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.920000000000000e+02 6.798607267547637e-01 -7.051227344464227e-01 -1.968855259661000e-01 -4.274823093809000e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.930000000000000e+02 6.798625869035370e-01 -7.051288120083469e-01 -1.968560875826636e-01 -4.275397275312360e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.940000000000000e+02 6.798644468316455e-01 -7.051348904797335e-01 -1.968266428101466e-01 -4.275971050558920e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.950000000000000e+02 6.798663065475848e-01 -7.051409698549571e-01 -1.967971916374721e-01 -4.276544419224420e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.960000000000000e+02 6.798681659713435e-01 -7.051470501891645e-01 -1.967677341444176e-01 -4.277117379677370e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.970000000000000e+02 6.798700252083145e-01 -7.051531314085940e-01 -1.967382702241842e-01 -4.277689933943110e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.980000000000000e+02 6.798718841447217e-01 -7.051592135931014e-01 -1.967087999876984e-01 -4.278262079004330e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.990000000000000e+02 6.798737428751541e-01 -7.051652966732846e-01 -1.966793233462688e-01 -4.278833818531920e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.000000000000000e+02 6.798756013870554e-01 -7.051713806585288e-01 -1.966498403091284e-01 -4.279405151570000e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.010000000000000e+02 6.798774596011082e-01 -7.051774656058257e-01 -1.966203509500633e-01 -4.279976075122290e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.020000000000000e+02 6.798793176047739e-01 -7.051835514505909e-01 -1.965908551878366e-01 -4.280546592800730e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.030000000000000e+02 6.798811753820057e-01 -7.051896382039839e-01 -1.965613530366951e-01 -4.281116703969420e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.040000000000000e+02 6.798830328785108e-01 -7.051957259050775e-01 -1.965318445464533e-01 -4.281686406426270e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.050000000000000e+02 6.798848901500238e-01 -7.052018145124993e-01 -1.965023296651326e-01 -4.282255702482280e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.060000000000000e+02 6.798867472016763e-01 -7.052079040219095e-01 -1.964728083874397e-01 -4.282824592370850e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.070000000000000e+02 6.798886039654499e-01 -7.052139944820403e-01 -1.964432807767602e-01 -4.283393073556980e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.080000000000000e+02 6.798904605329755e-01 -7.052200858268264e-01 -1.964137467443024e-01 -4.283961148898780e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.090000000000000e+02 6.798923168074383e-01 -7.052261781237396e-01 -1.963842063854064e-01 -4.284528816068030e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.100000000000000e+02 6.798941728609138e-01 -7.052322713221690e-01 -1.963546596267274e-01 -4.285096076426350e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.110000000000000e+02 6.798960286978132e-01 -7.052383654171293e-01 -1.963251064663201e-01 -4.285662930873390e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.120000000000000e+02 6.798978842441032e-01 -7.052444604613733e-01 -1.962955469740358e-01 -4.286229376856430e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.130000000000000e+02 6.798997395631307e-01 -7.052505564083331e-01 -1.962659810899465e-01 -4.286795416770520e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.140000000000000e+02 6.799015946610585e-01 -7.052566532548605e-01 -1.962364088033276e-01 -4.287361049732730e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.150000000000000e+02 6.799034494766948e-01 -7.052627510435318e-01 -1.962068301739770e-01 -4.287926274180850e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.160000000000000e+02 6.799053040579373e-01 -7.052688497371346e-01 -1.961772451606945e-01 -4.288491093034770e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.170000000000000e+02 6.799071584244262e-01 -7.052749493234310e-01 -1.961476537385194e-01 -4.289055505502580e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.180000000000000e+02 6.799090124953324e-01 -7.052810498586009e-01 -1.961180559871833e-01 -4.289619509676460e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.190000000000000e+02 6.799108663419909e-01 -7.052871512925548e-01 -1.960884518339890e-01 -4.290183106891620e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.200000000000000e+02 6.799127199705892e-01 -7.052932536182239e-01 -1.960588412771350e-01 -4.290746298584930e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.210000000000000e+02 6.799145733007834e-01 -7.052993568929989e-01 -1.960292243923389e-01 -4.291309081939600e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.220000000000000e+02 6.799164264410558e-01 -7.053054610388255e-01 -1.959996010742728e-01 -4.291871460284140e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.230000000000000e+02 6.799182792742511e-01 -7.053115661404445e-01 -1.959699714317722e-01 -4.292433429053130e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.240000000000000e+02 6.799201318924670e-01 -7.053176721286518e-01 -1.959403353818848e-01 -4.292994992757770e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.250000000000000e+02 6.799219842782368e-01 -7.053237790168198e-01 -1.959106929375021e-01 -4.293556150005920e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.260000000000000e+02 6.799238363838389e-01 -7.053298868396233e-01 -1.958810441415389e-01 -4.294116898626830e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.270000000000000e+02 6.799256882489312e-01 -7.053359955650910e-01 -1.958513889621641e-01 -4.294677241668230e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.280000000000000e+02 6.799275399007848e-01 -7.053421051753849e-01 -1.958217273673531e-01 -4.295237178653950e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.290000000000000e+02 6.799293912523900e-01 -7.053482157312343e-01 -1.957920594425984e-01 -4.295796707415940e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.300000000000000e+02 6.799312423804701e-01 -7.053543271785773e-01 -1.957623851101765e-01 -4.296355829516520e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.310000000000000e+02 6.799330932777483e-01 -7.053604395198165e-01 -1.957327043816172e-01 -4.296914546069910e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.320000000000000e+02 6.799349438895221e-01 -7.053665527947474e-01 -1.957030173063042e-01 -4.297472854615510e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.330000000000000e+02 6.799367942876130e-01 -7.053726669509697e-01 -1.956733238154107e-01 -4.298030757673090e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.340000000000000e+02 6.799386444002338e-01 -7.053787820404068e-01 -1.956436239750128e-01 -4.298588252308550e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.350000000000000e+02 6.799404942750004e-01 -7.053848980264166e-01 -1.956139177432166e-01 -4.299145341204710e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.360000000000000e+02 6.799423439304839e-01 -7.053910148959684e-01 -1.955842050996064e-01 -4.299702024455190e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.370000000000000e+02 6.799441932868407e-01 -7.053971327065053e-01 -1.955544861186160e-01 -4.300258299023900e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.380000000000000e+02 6.799460424220555e-01 -7.054032513999069e-01 -1.955247607284734e-01 -4.300814168384420e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.390000000000000e+02 6.799478913162851e-01 -7.054093709916773e-01 -1.954950289433865e-01 -4.301369630812860e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.400000000000000e+02 6.799497399253909e-01 -7.054154915115455e-01 -1.954652908083617e-01 -4.301924685673470e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.410000000000000e+02 6.799515883048342e-01 -7.054216129194452e-01 -1.954355462688653e-01 -4.302479334583630e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.420000000000000e+02 6.799534364486993e-01 -7.054277352179514e-01 -1.954057953324866e-01 -4.303033578017730e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.430000000000000e+02 6.799552843018397e-01 -7.054338584479759e-01 -1.953760380472673e-01 -4.303587413029110e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.440000000000000e+02 6.799571319212289e-01 -7.054399825667831e-01 -1.953462743608417e-01 -4.304140842226400e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.450000000000000e+02 6.799589793143376e-01 -7.054461075679146e-01 -1.953165042666282e-01 -4.304693866173220e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.460000000000000e+02 6.799608264114252e-01 -7.054522335037593e-01 -1.952867278243909e-01 -4.305246480854950e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.470000000000000e+02 6.799626732958443e-01 -7.054583603087674e-01 -1.952569449652997e-01 -4.305798692057540e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.480000000000000e+02 6.799645198865102e-01 -7.054644880452009e-01 -1.952271557560460e-01 -4.306350494368820e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.490000000000000e+02 6.799663662478446e-01 -7.054706166648559e-01 -1.951973601373549e-01 -4.306901890707300e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.500000000000000e+02 6.799682123672300e-01 -7.054767461736650e-01 -1.951675581265924e-01 -4.307452882197600e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.510000000000000e+02 6.799700582031040e-01 -7.054828766041455e-01 -1.951377497556802e-01 -4.308003465524490e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.520000000000000e+02 6.799719037993398e-01 -7.054890079235407e-01 -1.951079349834540e-01 -4.308553642525750e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.530000000000000e+02 6.799737491623745e-01 -7.054951401249805e-01 -1.950781138069646e-01 -4.309103414418460e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.540000000000000e+02 6.799755942368141e-01 -7.055012732503474e-01 -1.950482862727311e-01 -4.309652777778040e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.550000000000000e+02 6.799774390652883e-01 -7.055074072658489e-01 -1.950184523451998e-01 -4.310201735551260e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.560000000000000e+02 6.799792836711779e-01 -7.055135421545229e-01 -1.949886120003735e-01 -4.310750288265310e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.570000000000000e+02 6.799811279726711e-01 -7.055196779764594e-01 -1.949587653119178e-01 -4.311298432096380e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.580000000000000e+02 6.799829720696676e-01 -7.055258146566715e-01 -1.949289121893675e-01 -4.311846171898520e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.590000000000000e+02 6.799848158555376e-01 -7.055319522715081e-01 -1.948990527338428e-01 -4.312393503978870e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.600000000000000e+02 6.799866594173840e-01 -7.055380907592211e-01 -1.948691868578758e-01 -4.312940430344600e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.610000000000000e+02 6.799885027376091e-01 -7.055442301305632e-01 -1.948393145807669e-01 -4.313486951217600e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.620000000000000e+02 6.799903437330825e-01 -7.055503719134103e-01 -1.948094378296771e-01 -4.314032979820430e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.630000000000000e+02 6.799921885598681e-01 -7.055565115924540e-01 -1.947795509023465e-01 -4.314578771245710e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.640000000000000e+02 6.799940311106697e-01 -7.055626536447086e-01 -1.947496594578396e-01 -4.315124073250150e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.650000000000000e+02 6.799958733666632e-01 -7.055687966182198e-01 -1.947197616570699e-01 -4.315668966962220e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.660000000000000e+02 6.799977153858934e-01 -7.055749404682642e-01 -1.946898574492786e-01 -4.316213455739350e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.670000000000000e+02 6.799995571682322e-01 -7.055810851947246e-01 -1.946599468331228e-01 -4.316757539367460e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.680000000000000e+02 6.800013986536546e-01 -7.055872308428952e-01 -1.946300298594589e-01 -4.317301214224540e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.690000000000000e+02 6.800032398987002e-01 -7.055933773683748e-01 -1.946001064806982e-01 -4.317844484070730e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.700000000000000e+02 6.800050809094393e-01 -7.055995247668866e-01 -1.945701766888613e-01 -4.318387348717150e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.710000000000000e+02 6.800069216160569e-01 -7.056056730897458e-01 -1.945402405465657e-01 -4.318929804830290e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.720000000000000e+02 6.800087719761647e-01 -7.056118150292564e-01 -1.945102888288200e-01 -4.319472266742780e-02 3.720000000000000e-12 3.510000000000000e-12 1.110000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.730000000000000e+02 6.800106285608964e-01 -7.056179531014544e-01 -1.944803247074674e-01 -4.320014591186370e-02 3.720000000000000e-12 3.510000000000000e-12 1.110000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.740000000000000e+02 6.800124685148802e-01 -7.056241040720422e-01 -1.944503693701792e-01 -4.320555830709490e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.530000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.170000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.750000000000000e+02 6.800143082323805e-01 -7.056302559152922e-01 -1.944204076167761e-01 -4.321096664370000e-02 3.700000000000000e-12 3.500000000000000e-12 1.160000000000000e-13 6.510000000000000e-13 3.850000000000000e-12 -1.920000000000000e-12 8.150000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.760000000000000e+02 6.800161476428638e-01 -7.056364086811139e-01 -1.943904395150271e-01 -4.321637089962240e-02 3.700000000000000e-12 3.500000000000000e-12 1.170000000000000e-13 6.500000000000000e-13 3.850000000000000e-12 -1.920000000000000e-12 8.140000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.770000000000000e+02 6.800179868134718e-01 -7.056425623204187e-01 -1.943604650003440e-01 -4.322177109833850e-02 3.700000000000000e-12 3.500000000000000e-12 1.190000000000000e-13 6.490000000000000e-13 3.850000000000000e-12 -1.910000000000000e-12 8.130000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.780000000000000e+02 6.800198257563828e-01 -7.056487168213401e-01 -1.943304840662219e-01 -4.322716725906180e-02 3.700000000000000e-12 3.500000000000000e-12 1.180000000000000e-13 6.490000000000000e-13 3.850000000000000e-12 -1.910000000000000e-12 8.130000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.790000000000000e+02 6.800216643871712e-01 -7.056548722478666e-01 -1.943004967843931e-01 -4.323255933074930e-02 3.700000000000000e-12 3.500000000000000e-12 1.190000000000000e-13 6.480000000000000e-13 3.850000000000000e-12 -1.910000000000000e-12 8.120000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.800000000000000e+02 6.800235027783970e-01 -7.056610285445999e-01 -1.942705030905896e-01 -4.323794735306230e-02 3.700000000000000e-12 3.490000000000000e-12 1.230000000000000e-13 6.450000000000000e-13 3.840000000000000e-12 -1.910000000000000e-12 8.060000000000000e-13 7.880000000000000e-12 -2.380000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.810000000000000e+02 6.800253409346203e-01 -7.056671857083662e-01 -1.942405029782267e-01 -4.324333132348980e-02 3.700000000000000e-12 3.490000000000000e-12 1.240000000000000e-13 6.440000000000000e-13 3.840000000000000e-12 -1.910000000000000e-12 8.050000000000000e-13 7.880000000000000e-12 -2.380000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.820000000000000e+02 6.800271853035798e-01 -7.056733390051212e-01 -1.942104904705938e-01 -4.324871393030960e-02 3.700000000000000e-12 3.490000000000000e-12 1.230000000000000e-13 6.440000000000000e-13 3.840000000000000e-12 -1.900000000000000e-12 8.050000000000000e-13 7.880000000000000e-12 -2.380000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.830000000000000e+02 6.800290337684854e-01 -7.056794899887119e-01 -1.941804675260357e-01 -4.325409428645660e-02 3.700000000000000e-12 3.490000000000000e-12 1.230000000000000e-13 6.440000000000000e-13 3.840000000000000e-12 -1.900000000000000e-12 8.050000000000000e-13 7.880000000000000e-12 -2.380000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.840000000000000e+02 6.800308710951687e-01 -7.056856498393206e-01 -1.941504482732636e-01 -4.325946605880240e-02 3.700000000000000e-12 3.490000000000000e-12 1.240000000000000e-13 6.420000000000000e-13 3.840000000000000e-12 -1.900000000000000e-12 8.040000000000000e-13 7.880000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.850000000000000e+02 6.800327081877929e-01 -7.056918105541162e-01 -1.941204225983502e-01 -4.326483377834180e-02 3.700000000000000e-12 3.490000000000000e-12 1.250000000000000e-13 6.410000000000000e-13 3.840000000000000e-12 -1.900000000000000e-12 8.020000000000000e-13 7.880000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.860000000000000e+02 6.800345450279224e-01 -7.056979721440877e-01 -1.940903905222845e-01 -4.327019744924040e-02 3.700000000000000e-12 3.490000000000000e-12 1.260000000000000e-13 6.400000000000000e-13 3.840000000000000e-12 -1.900000000000000e-12 8.010000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.870000000000000e+02 6.800363815718353e-01 -7.057041346425851e-01 -1.940603520808704e-01 -4.327555704198350e-02 3.700000000000000e-12 3.490000000000000e-12 1.270000000000000e-13 6.390000000000000e-13 3.840000000000000e-12 -1.900000000000000e-12 8.000000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.880000000000000e+02 6.800382178757998e-01 -7.057102980065399e-01 -1.940303072240221e-01 -4.328091258717610e-02 3.700000000000000e-12 3.490000000000000e-12 1.270000000000000e-13 6.390000000000000e-13 3.840000000000000e-12 -1.900000000000000e-12 8.000000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.890000000000000e+02 6.800400539303699e-01 -7.057164622422814e-01 -1.940002559599285e-01 -4.328626408111950e-02 3.700000000000000e-12 3.490000000000000e-12 1.280000000000000e-13 6.380000000000000e-13 3.840000000000000e-12 -1.900000000000000e-12 7.990000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.900000000000000e+02 6.800418896856781e-01 -7.057226273865107e-01 -1.939701983327810e-01 -4.329161149869400e-02 3.700000000000000e-12 3.490000000000000e-12 1.300000000000000e-13 6.370000000000000e-13 3.840000000000000e-12 -1.900000000000000e-12 7.980000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.910000000000000e+02 6.800437251952343e-01 -7.057287933985669e-01 -1.939401342941489e-01 -4.329695486704600e-02 3.700000000000000e-12 3.490000000000000e-12 1.310000000000000e-13 6.360000000000000e-13 3.840000000000000e-12 -1.900000000000000e-12 7.960000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.920000000000000e+02 6.800455640215590e-01 -7.057349576634192e-01 -1.939100605350644e-01 -4.330229566315500e-02 3.700000000000000e-12 3.490000000000000e-12 1.300000000000000e-13 6.360000000000000e-13 3.840000000000000e-12 -1.890000000000000e-12 7.960000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.930000000000000e+02 6.800474048929434e-01 -7.057411211137069e-01 -1.938799782350156e-01 -4.330763335869410e-02 3.700000000000000e-12 3.490000000000000e-12 1.300000000000000e-13 6.360000000000000e-13 3.840000000000000e-12 -1.890000000000000e-12 7.960000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.940000000000000e+02 6.800492396130379e-01 -7.057472897657984e-01 -1.938498950018737e-01 -4.331296454552660e-02 3.700000000000000e-12 3.490000000000000e-12 1.310000000000000e-13 6.340000000000000e-13 3.830000000000000e-12 -1.890000000000000e-12 7.950000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.950000000000000e+02 6.800510740907735e-01 -7.057534592811132e-01 -1.938198053511975e-01 -4.331829168320820e-02 3.700000000000000e-12 3.490000000000000e-12 1.320000000000000e-13 6.330000000000000e-13 3.830000000000000e-12 -1.890000000000000e-12 7.940000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.960000000000000e+02 6.800529082602366e-01 -7.057596297073655e-01 -1.937897093438714e-01 -4.332361474455530e-02 3.700000000000000e-12 3.490000000000000e-12 1.330000000000000e-13 6.320000000000000e-13 3.830000000000000e-12 -1.890000000000000e-12 7.920000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.970000000000000e+02 6.800547422135207e-01 -7.057658009771285e-01 -1.937596068919702e-01 -4.332893376351720e-02 3.700000000000000e-12 3.490000000000000e-12 1.330000000000000e-13 6.320000000000000e-13 3.830000000000000e-12 -1.890000000000000e-12 7.920000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.980000000000000e+02 6.800565758502106e-01 -7.057719731615167e-01 -1.937294980928684e-01 -4.333424871012740e-02 3.700000000000000e-12 3.490000000000000e-12 1.330000000000000e-13 6.320000000000000e-13 3.830000000000000e-12 -1.890000000000000e-12 7.920000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.990000000000000e+02 6.800584092542421e-01 -7.057781461990635e-01 -1.936993828662977e-01 -4.333955961496180e-02 3.700000000000000e-12 3.490000000000000e-12 1.340000000000000e-13 6.310000000000000e-13 3.830000000000000e-12 -1.890000000000000e-12 7.910000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.000000000000000e+02 6.800602423965444e-01 -7.057843201128331e-01 -1.936692612333187e-01 -4.334486645220950e-02 3.700000000000000e-12 3.490000000000000e-12 1.370000000000000e-13 6.290000000000000e-13 3.830000000000000e-12 -1.890000000000000e-12 7.890000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.010000000000000e+02 6.800620752489481e-01 -7.057904949193428e-01 -1.936391332278207e-01 -4.335016923129100e-02 3.700000000000000e-12 3.490000000000000e-12 1.360000000000000e-13 6.290000000000000e-13 3.830000000000000e-12 -1.890000000000000e-12 7.890000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.020000000000000e+02 6.800644394734375e-01 -7.057960240025316e-01 -1.936093530548097e-01 -4.335607311087000e-02 3.700000000000000e-12 3.490000000000000e-12 1.370000000000000e-13 6.280000000000001e-13 3.830000000000000e-12 -1.880000000000000e-12 7.870000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.030000000000000e+02 6.800662099626688e-01 -7.058022743575298e-01 -1.935791808418024e-01 -4.336127677278720e-02 3.700000000000000e-12 3.490000000000000e-12 1.370000000000000e-13 6.280000000000001e-13 3.830000000000000e-12 -1.880000000000000e-12 7.870000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.040000000000000e+02 6.800679823561149e-01 -7.058085232968602e-01 -1.935490019777740e-01 -4.336648070798970e-02 3.700000000000000e-12 3.490000000000000e-12 1.370000000000000e-13 6.280000000000001e-13 3.830000000000000e-12 -1.880000000000000e-12 7.870000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.050000000000000e+02 6.800697572740785e-01 -7.058147706185546e-01 -1.935188149694217e-01 -4.337168512617530e-02 3.700000000000000e-12 3.490000000000000e-12 1.390000000000000e-13 6.250000000000000e-13 3.830000000000000e-12 -1.880000000000000e-12 7.850000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.060000000000000e+02 6.800715348115959e-01 -7.058210162409955e-01 -1.934886196787965e-01 -4.337689046396430e-02 3.700000000000000e-12 3.490000000000000e-12 1.390000000000000e-13 6.250000000000000e-13 3.830000000000000e-12 -1.880000000000000e-12 7.850000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.070000000000000e+02 6.800733146676580e-01 -7.058272601562531e-01 -1.934584170540734e-01 -4.338209732359600e-02 3.700000000000000e-12 3.490000000000000e-12 1.400000000000000e-13 6.240000000000000e-13 3.830000000000000e-12 -1.880000000000000e-12 7.840000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.080000000000000e+02 6.800750963970092e-01 -7.058335023457607e-01 -1.934282085873377e-01 -4.338730631888740e-02 3.700000000000000e-12 3.490000000000000e-12 1.400000000000000e-13 6.240000000000000e-13 3.830000000000000e-12 -1.880000000000000e-12 7.830000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.090000000000000e+02 6.800768796934054e-01 -7.058397426907372e-01 -1.933979956928406e-01 -4.339251786595870e-02 3.700000000000000e-12 3.490000000000000e-12 1.400000000000000e-13 6.240000000000000e-13 3.830000000000000e-12 -1.880000000000000e-12 7.830000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.100000000000000e+02 6.800786646053507e-01 -7.058459809165807e-01 -1.933677791939897e-01 -4.339773199255140e-02 3.700000000000000e-12 3.490000000000000e-12 1.420000000000000e-13 6.220000000000000e-13 3.830000000000000e-12 -1.880000000000000e-12 7.810000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.110000000000000e+02 6.800804515977056e-01 -7.058522166070010e-01 -1.933375590727444e-01 -4.340294825743240e-02 3.700000000000000e-12 3.490000000000000e-12 1.420000000000000e-13 6.220000000000000e-13 3.830000000000000e-12 -1.880000000000000e-12 7.810000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.120000000000000e+02 6.800822588065927e-01 -7.058584365326280e-01 -1.933073183873061e-01 -4.340817308002680e-02 3.700000000000000e-12 3.490000000000000e-12 1.430000000000000e-13 6.210000000000000e-13 3.820000000000000e-12 -1.880000000000000e-12 7.800000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.130000000000000e+02 6.800840522858849e-01 -7.058646658638073e-01 -1.932770881414288e-01 -4.341339091750420e-02 3.700000000000000e-12 3.490000000000000e-12 1.430000000000000e-13 6.210000000000000e-13 3.820000000000000e-12 -1.880000000000000e-12 7.800000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.140000000000000e+02 6.800858499148742e-01 -7.058708917723857e-01 -1.932468508586869e-01 -4.341860807557950e-02 3.700000000000000e-12 3.490000000000000e-12 1.430000000000000e-13 6.210000000000000e-13 3.820000000000000e-12 -1.880000000000000e-12 7.800000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.150000000000000e+02 6.800876516570992e-01 -7.058771146110748e-01 -1.932166055230281e-01 -4.342382389926380e-02 3.700000000000000e-12 3.490000000000000e-12 1.440000000000000e-13 6.200000000000000e-13 3.820000000000000e-12 -1.870000000000000e-12 7.780000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.160000000000000e+02 6.800894568475073e-01 -7.058833351635689e-01 -1.931863516630958e-01 -4.342903814640470e-02 3.700000000000000e-12 3.490000000000000e-12 1.450000000000000e-13 6.190000000000000e-13 3.820000000000000e-12 -1.870000000000000e-12 7.770000000000000e-13 7.890000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.170000000000000e+02 6.800912643221110e-01 -7.058895545116237e-01 -1.931560893868945e-01 -4.343425096506160e-02 3.700000000000000e-12 3.490000000000000e-12 1.450000000000000e-13 6.190000000000000e-13 3.820000000000000e-12 -1.870000000000000e-12 7.770000000000000e-13 7.890000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.180000000000000e+02 6.800930727187896e-01 -7.058957737833765e-01 -1.931258192714218e-01 -4.343946276631000e-02 3.700000000000000e-12 3.490000000000000e-12 1.450000000000000e-13 6.190000000000000e-13 3.820000000000000e-12 -1.870000000000000e-12 7.770000000000000e-13 7.890000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.190000000000000e+02 6.800948808447127e-01 -7.059019938571479e-01 -1.930955421893178e-01 -4.344467405715620e-02 3.700000000000000e-12 3.480000000000000e-12 1.460000000000000e-13 6.180000000000000e-13 3.820000000000000e-12 -1.870000000000000e-12 7.760000000000000e-13 7.890000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.200000000000000e+02 6.800966879858228e-01 -7.059082151169886e-01 -1.930652591494158e-01 -4.344988527753310e-02 3.700000000000000e-12 3.480000000000000e-12 1.470000000000000e-13 6.160000000000000e-13 3.820000000000000e-12 -1.870000000000000e-12 7.750000000000000e-13 7.890000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.210000000000000e+02 6.800984940569759e-01 -7.059144373489267e-01 -1.930349711758078e-01 -4.345509667388730e-02 3.700000000000000e-12 3.480000000000000e-12 1.470000000000000e-13 6.160000000000000e-13 3.820000000000000e-12 -1.870000000000000e-12 7.740000000000000e-13 7.890000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.220000000000000e+02 6.801003020370210e-01 -7.059206579863587e-01 -1.930046769274401e-01 -4.346030926481870e-02 3.700000000000000e-12 3.480000000000000e-12 1.480000000000000e-13 6.150000000000000e-13 3.820000000000000e-12 -1.870000000000000e-12 7.730000000000000e-13 7.890000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.230000000000000e+02 6.801021078577804e-01 -7.059268796031856e-01 -1.929743818578749e-01 -4.346552067656540e-02 3.700000000000000e-12 3.480000000000000e-12 1.480000000000000e-13 6.150000000000000e-13 3.820000000000000e-12 -1.870000000000000e-12 7.730000000000000e-13 7.890000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.240000000000000e+02 6.801039149963756e-01 -7.059330992606205e-01 -1.929440843497088e-01 -4.347073141034490e-02 3.700000000000000e-12 3.480000000000000e-12 1.480000000000000e-13 6.150000000000000e-13 3.820000000000000e-12 -1.870000000000000e-12 7.730000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.250000000000000e+02 6.801057243103703e-01 -7.059393160402793e-01 -1.929137848951576e-01 -4.347594077503440e-02 3.700000000000000e-12 3.480000000000000e-12 1.500000000000000e-13 6.130000000000000e-13 3.820000000000000e-12 -1.870000000000000e-12 7.710000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.260000000000000e+02 6.801075363507137e-01 -7.059455293769104e-01 -1.928834837823045e-01 -4.348114804967640e-02 3.700000000000000e-12 3.480000000000000e-12 1.510000000000000e-13 6.120000000000000e-13 3.820000000000000e-12 -1.860000000000000e-12 7.700000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.270000000000000e+02 6.801093513191596e-01 -7.059517390925577e-01 -1.928531810928108e-01 -4.348635260410910e-02 3.700000000000000e-12 3.480000000000000e-12 1.510000000000000e-13 6.120000000000000e-13 3.820000000000000e-12 -1.860000000000000e-12 7.700000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.280000000000000e+02 6.801111691377855e-01 -7.059579453254369e-01 -1.928228767002737e-01 -4.349155397262000e-02 3.700000000000000e-12 3.480000000000000e-12 1.520000000000000e-13 6.110000000000000e-13 3.820000000000000e-12 -1.860000000000000e-12 7.680000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.290000000000000e+02 6.801129895795008e-01 -7.059641484040237e-01 -1.927925702686442e-01 -4.349675186292970e-02 3.700000000000000e-12 3.480000000000000e-12 1.520000000000000e-13 6.110000000000000e-13 3.820000000000000e-12 -1.860000000000000e-12 7.680000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.300000000000000e+02 6.801148124070654e-01 -7.059703487146184e-01 -1.927622612561160e-01 -4.350194611383860e-02 3.700000000000000e-12 3.480000000000000e-12 1.530000000000000e-13 6.100000000000000e-13 3.820000000000000e-12 -1.860000000000000e-12 7.670000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.310000000000000e+02 6.801166374723390e-01 -7.059765465972978e-01 -1.927319489590141e-01 -4.350713663679110e-02 3.700000000000000e-12 3.480000000000000e-12 1.530000000000000e-13 6.100000000000000e-13 3.820000000000000e-12 -1.860000000000000e-12 7.670000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.320000000000000e+02 6.801184993492909e-01 -7.059827168493201e-01 -1.927016004199913e-01 -4.351233788818200e-02 3.700000000000000e-12 3.480000000000000e-12 1.540000000000000e-13 6.080000000000000e-13 3.810000000000000e-12 -1.860000000000000e-12 7.660000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.330000000000000e+02 6.801203289352233e-01 -7.059889104477063e-01 -1.926712793077983e-01 -4.351752088297940e-02 3.700000000000000e-12 3.480000000000000e-12 1.540000000000000e-13 6.090000000000000e-13 3.810000000000000e-12 -1.860000000000000e-12 7.650000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.340000000000000e+02 6.801221609731459e-01 -7.059951019419735e-01 -1.926409529417248e-01 -4.352270024785650e-02 3.700000000000000e-12 3.480000000000000e-12 1.540000000000000e-13 6.090000000000000e-13 3.810000000000000e-12 -1.860000000000000e-12 7.650000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.350000000000000e+02 6.801239956176084e-01 -7.060012912206600e-01 -1.926106211194158e-01 -4.352787626215090e-02 3.700000000000000e-12 3.480000000000000e-12 1.550000000000000e-13 6.070000000000000e-13 3.810000000000000e-12 -1.860000000000000e-12 7.640000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.360000000000000e+02 6.801258329907574e-01 -7.060074781139022e-01 -1.925802839342549e-01 -4.353304934964170e-02 3.700000000000000e-12 3.480000000000000e-12 1.550000000000000e-13 6.070000000000000e-13 3.810000000000000e-12 -1.860000000000000e-12 7.640000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.370000000000000e+02 6.801276731500231e-01 -7.060136624505002e-01 -1.925499416972246e-01 -4.353822000451810e-02 3.700000000000000e-12 3.480000000000000e-12 1.560000000000000e-13 6.060000000000000e-13 3.810000000000000e-12 -1.860000000000000e-12 7.630000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.380000000000000e+02 6.801295160474115e-01 -7.060198441369843e-01 -1.925195948200177e-01 -4.354338866278710e-02 3.700000000000000e-12 3.480000000000000e-12 1.560000000000000e-13 6.060000000000000e-13 3.810000000000000e-12 -1.860000000000000e-12 7.630000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.390000000000000e+02 6.801313614774970e-01 -7.060260232454797e-01 -1.924892437082617e-01 -4.354855556228500e-02 3.700000000000000e-12 3.480000000000000e-12 1.550000000000000e-13 6.060000000000000e-13 3.810000000000000e-12 -1.860000000000000e-12 7.630000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.400000000000000e+02 6.801332090266611e-01 -7.060322000869281e-01 -1.924588886956475e-01 -4.355372063951040e-02 3.700000000000000e-12 3.480000000000000e-12 1.570000000000000e-13 6.050000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.610000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.410000000000000e+02 6.801350580620289e-01 -7.060383752329706e-01 -1.924285300092317e-01 -4.355888350077100e-02 3.700000000000000e-12 3.480000000000000e-12 1.560000000000000e-13 6.050000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.610000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.420000000000000e+02 6.801369151651825e-01 -7.060445440378701e-01 -1.923981608769439e-01 -4.356404658792890e-02 3.700000000000000e-12 3.480000000000000e-12 1.570000000000000e-13 6.050000000000000e-13 3.810000000000000e-12 -1.860000000000000e-12 7.630000000000000e-13 7.910000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.430000000000000e+02 6.801387647563755e-01 -7.060507182148600e-01 -1.923677949636090e-01 -4.356920293958800e-02 3.700000000000000e-12 3.480000000000000e-12 1.570000000000000e-13 6.050000000000000e-13 3.810000000000000e-12 -1.860000000000000e-12 7.630000000000000e-13 7.910000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.440000000000000e+02 6.801406135260747e-01 -7.060568931226953e-01 -1.923374251072434e-01 -4.357435495124470e-02 3.700000000000000e-12 3.480000000000000e-12 1.560000000000000e-13 6.050000000000000e-13 3.810000000000000e-12 -1.860000000000000e-12 7.630000000000000e-13 7.910000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.450000000000000e+02 6.801424610737332e-01 -7.060630693323596e-01 -1.923070507392924e-01 -4.357950212529070e-02 3.700000000000000e-12 3.480000000000000e-12 1.580000000000000e-13 6.040000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.620000000000000e-13 7.910000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.460000000000000e+02 6.801443073457261e-01 -7.060692471347370e-01 -1.922766710300751e-01 -4.358464423831640e-02 3.700000000000000e-12 3.480000000000000e-12 1.570000000000000e-13 6.040000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.620000000000000e-13 7.910000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.470000000000000e+02 6.801461525871760e-01 -7.060754265624326e-01 -1.922462849855272e-01 -4.358978131172920e-02 3.700000000000000e-12 3.480000000000000e-12 1.580000000000000e-13 6.030000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.610000000000000e-13 7.910000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.480000000000000e+02 6.801479972114610e-01 -7.060816074762175e-01 -1.922158916139338e-01 -4.359491351177890e-02 3.700000000000000e-12 3.480000000000000e-12 1.580000000000000e-13 6.030000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.600000000000000e-13 7.910000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.490000000000000e+02 6.801498416365545e-01 -7.060877896807292e-01 -1.921854901090596e-01 -4.360004102168940e-02 3.700000000000000e-12 3.480000000000000e-12 1.580000000000000e-13 6.030000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.600000000000000e-13 7.910000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.500000000000000e+02 6.801516861526294e-01 -7.060939730226484e-01 -1.921550799812269e-01 -4.360516394000830e-02 3.700000000000000e-12 3.480000000000000e-12 1.580000000000000e-13 6.030000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.600000000000000e-13 7.920000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.510000000000000e+02 6.801535308504425e-01 -7.061001574578133e-01 -1.921246610761919e-01 -4.361028222892130e-02 3.700000000000000e-12 3.480000000000000e-12 1.580000000000000e-13 6.030000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.600000000000000e-13 7.920000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.520000000000000e+02 6.801554001039072e-01 -7.061063250660442e-01 -1.920942106598000e-01 -4.361540601906740e-02 3.700000000000000e-12 3.480000000000000e-12 1.590000000000000e-13 6.020000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.590000000000000e-13 7.920000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.530000000000000e+02 6.801572446539955e-01 -7.061125121322184e-01 -1.920637744903463e-01 -4.362051448039410e-02 3.700000000000000e-12 3.480000000000000e-12 1.590000000000000e-13 6.020000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.590000000000000e-13 7.920000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.540000000000000e+02 6.801590885724863e-01 -7.061187010483723e-01 -1.920333297755846e-01 -4.362561767248610e-02 3.700000000000000e-12 3.480000000000000e-12 1.590000000000000e-13 6.020000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.590000000000000e-13 7.920000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.550000000000000e+02 6.801609313471219e-01 -7.061248923784263e-01 -1.920028762938195e-01 -4.363071541324870e-02 3.700000000000000e-12 3.480000000000000e-12 1.630000000000000e-13 6.040000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.570000000000000e-13 7.930000000000000e-12 -2.400000000000000e-12 7.740000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>3.560000000000000e+02 6.801627724101943e-01 -7.061310868066147e-01 -1.919724135575382e-01 -4.363580760661090e-02 3.700000000000000e-12 3.480000000000000e-12 1.630000000000000e-13 6.040000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.570000000000000e-13 7.930000000000000e-12 -2.400000000000000e-12 7.740000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>3.570000000000000e+02 6.801646112014484e-01 -7.061372850557405e-01 -1.919419408921662e-01 -4.364089423738440e-02 3.700000000000000e-12 3.480000000000000e-12 1.640000000000000e-13 6.030000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.550000000000000e-13 7.930000000000000e-12 -2.400000000000000e-12 7.740000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>3.580000000000000e+02 6.801664472598314e-01 -7.061434877568908e-01 -1.919114575967263e-01 -4.364597534221030e-02 3.700000000000000e-12 3.480000000000000e-12 1.640000000000000e-13 6.030000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.550000000000000e-13 7.930000000000000e-12 -2.400000000000000e-12 7.740000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>3.590000000000000e+02 6.801682803280756e-01 -7.061496952973384e-01 -1.918809631407742e-01 -4.365105097467090e-02 3.700000000000000e-12 3.480000000000000e-12 1.640000000000000e-13 6.030000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.550000000000000e-13 7.930000000000000e-12 -2.400000000000000e-12 7.740000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>3.600000000000000e+02 6.801701104290790e-01 -7.061559077022543e-01 -1.918504573352982e-01 -4.365612117832780e-02 3.700000000000000e-12 3.480000000000000e-12 1.640000000000000e-13 6.030000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.550000000000000e-13 7.930000000000000e-12 -2.400000000000000e-12 7.740000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>3.610000000000000e+02 6.801719378710744e-01 -7.061621246060932e-01 -1.918199404230304e-01 -4.366118597359400e-02 3.700000000000000e-12 3.480000000000000e-12 1.640000000000000e-13 6.030000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.550000000000000e-13 7.930000000000000e-12 -2.400000000000000e-12 7.740000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>3.620000000000000e+02 6.801737691071448e-01 -7.061683409708717e-01 -1.917894074939692e-01 -4.366624785963960e-02 3.710000000000000e-12 3.490000000000000e-12 1.650000000000000e-13 5.980000000000000e-13 3.820000000000000e-12 -1.850000000000000e-12 7.510000000000000e-13 7.930000000000000e-12 -2.400000000000000e-12 7.750000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>3.630000000000000e+02 6.801755927532240e-01 -7.061745648166142e-01 -1.917588705339414e-01 -4.367130179434690e-02 3.710000000000000e-12 3.490000000000000e-12 1.650000000000000e-13 5.980000000000000e-13 3.820000000000000e-12 -1.850000000000000e-12 7.500000000000000e-13 7.930000000000000e-12 -2.400000000000000e-12 7.750000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>3.640000000000000e+02 6.801774151031481e-01 -7.061807911800915e-01 -1.917283249311070e-01 -4.367635024783870e-02 3.710000000000000e-12 3.490000000000000e-12 1.650000000000000e-13 5.980000000000000e-13 3.820000000000000e-12 -1.850000000000000e-12 7.500000000000000e-13 7.930000000000000e-12 -2.400000000000000e-12 7.750000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>3.650000000000000e+02 6.801792361594092e-01 -7.061870198433671e-01 -1.916977714849323e-01 -4.368139317898700e-02 3.710000000000000e-12 3.490000000000000e-12 1.640000000000000e-13 5.990000000000000e-13 3.820000000000000e-12 -1.850000000000000e-12 7.540000000000000e-13 7.940000000000000e-12 -2.420000000000000e-12 7.759999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>3.660000000000000e+02 6.801810555277493e-01 -7.061932510359407e-01 -1.916672107545939e-01 -4.368643054771070e-02 3.710000000000000e-12 3.490000000000000e-12 1.640000000000000e-13 5.990000000000000e-13 3.820000000000000e-12 -1.850000000000000e-12 7.530000000000000e-13 7.940000000000000e-12 -2.420000000000000e-12 7.759999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>3.670000000000000e+02 6.801828724913421e-01 -7.061994853641913e-01 -1.916366430558360e-01 -4.369146231322840e-02 3.710000000000000e-12 3.490000000000000e-12 1.650000000000000e-13 5.980000000000000e-13 3.820000000000000e-12 -1.850000000000000e-12 7.520000000000000e-13 7.940000000000000e-12 -2.420000000000000e-12 7.759999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>3.680000000000000e+02 6.801846862046709e-01 -7.062057236062526e-01 -1.916060685283139e-01 -4.369648843495330e-02 3.710000000000000e-12 3.490000000000000e-12 1.650000000000000e-13 5.980000000000000e-13 3.820000000000000e-12 -1.850000000000000e-12 7.520000000000000e-13 7.940000000000000e-12 -2.420000000000000e-12 7.759999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>3.690000000000000e+02 6.801864959373461e-01 -7.062119664532197e-01 -1.915754872232734e-01 -4.370150887459910e-02 3.710000000000000e-12 3.490000000000000e-12 1.650000000000000e-13 5.980000000000000e-13 3.820000000000000e-12 -1.850000000000000e-12 7.520000000000000e-13 7.940000000000000e-12 -2.420000000000000e-12 7.759999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>3.700000000000000e+02 6.801883012909300e-01 -7.062182142840798e-01 -1.915448991616742e-01 -4.370652360356150e-02 3.710000000000000e-12 3.490000000000000e-12 1.660000000000000e-13 5.970000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.510000000000000e-13 7.950000000000001e-12 -2.420000000000000e-12 7.759999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>3.710000000000000e+02 6.801901023146560e-01 -7.062244670488351e-01 -1.915143043496762e-01 -4.371153262270760e-02 3.710000000000000e-12 3.490000000000000e-12 1.660000000000000e-13 5.970000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.510000000000000e-13 7.950000000000001e-12 -2.420000000000000e-12 7.759999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>3.720000000000000e+02 6.801919285068792e-01 -7.062307029180814e-01 -1.914836757033568e-01 -4.371654822898150e-02 3.710000000000000e-12 3.490000000000000e-12 1.660000000000000e-13 5.970000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.500000000000000e-13 7.950000000000001e-12 -2.420000000000000e-12 7.759999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>3.730000000000000e+02 6.801937226254594e-01 -7.062369638605401e-01 -1.914530673190127e-01 -4.372154608550890e-02 3.710000000000000e-12 3.490000000000000e-12 1.660000000000000e-13 5.970000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.500000000000000e-13 7.950000000000001e-12 -2.420000000000000e-12 7.759999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>3.740000000000000e+02 6.801955146018881e-01 -7.062432276131284e-01 -1.914224521275256e-01 -4.372653870990670e-02 3.710000000000000e-12 3.490000000000000e-12 1.650000000000000e-13 5.970000000000000e-13 3.810000000000000e-12 -1.840000000000000e-12 7.500000000000000e-13 7.950000000000001e-12 -2.420000000000000e-12 7.759999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>3.750000000000000e+02 6.801973053107719e-01 -7.062494932801145e-01 -1.913918302260797e-01 -4.373152652557850e-02 3.710000000000000e-12 3.490000000000000e-12 1.690000000000000e-13 6.000000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.520000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.760000000000000e+02 6.801990954756447e-01 -7.062557600607223e-01 -1.913612018674053e-01 -4.373651009200950e-02 3.710000000000000e-12 3.490000000000000e-12 1.690000000000000e-13 6.000000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.520000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.770000000000000e+02 6.802008856196530e-01 -7.062620273028956e-01 -1.913305674546980e-01 -4.374149002614150e-02 3.710000000000000e-12 3.490000000000000e-12 1.690000000000000e-13 6.000000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.510000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.780000000000000e+02 6.802026760627290e-01 -7.062682945362354e-01 -1.912999274617662e-01 -4.374646686422570e-02 3.720000000000000e-12 3.500000000000000e-12 1.710000000000000e-13 5.960000000000000e-13 3.820000000000000e-12 -1.850000000000000e-12 7.470000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.790000000000000e+02 6.802044669429620e-01 -7.062745614976668e-01 -1.912692822987938e-01 -4.375144090226060e-02 3.720000000000000e-12 3.500000000000000e-12 1.710000000000000e-13 5.960000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.470000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.800000000000000e+02 6.802062582397056e-01 -7.062808281513652e-01 -1.912386321853256e-01 -4.375641207007920e-02 3.720000000000000e-12 3.500000000000000e-12 1.710000000000000e-13 5.960000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.470000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.810000000000000e+02 6.802080497998825e-01 -7.062870946838381e-01 -1.912079770820723e-01 -4.376137989923880e-02 3.720000000000000e-12 3.500000000000000e-12 1.710000000000000e-13 5.960000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.470000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.820000000000000e+02 6.802098402435032e-01 -7.062933622898558e-01 -1.911773177679569e-01 -4.376634314456770e-02 3.720000000000000e-12 3.500000000000000e-12 1.720000000000000e-13 5.950000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.450000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.830000000000000e+02 6.802116314901038e-01 -7.062996297857557e-01 -1.911466517663737e-01 -4.377130188354560e-02 3.720000000000000e-12 3.500000000000000e-12 1.710000000000000e-13 5.950000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.450000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.840000000000000e+02 6.802134220469110e-01 -7.063058984866772e-01 -1.911159798039798e-01 -4.377625490746310e-02 3.720000000000000e-12 3.500000000000000e-12 1.710000000000000e-13 5.950000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.450000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.850000000000000e+02 6.802152115236040e-01 -7.063121688228459e-01 -1.910853017684443e-01 -4.378120181914800e-02 3.720000000000000e-12 3.500000000000000e-12 1.710000000000000e-13 5.950000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.450000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.860000000000000e+02 6.802169995375121e-01 -7.063184411126199e-01 -1.910546178355632e-01 -4.378614264958230e-02 3.720000000000000e-12 3.500000000000000e-12 1.710000000000000e-13 5.950000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.450000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.870000000000000e+02 6.802187857635544e-01 -7.063247155260187e-01 -1.910239284347045e-01 -4.379107782205750e-02 3.720000000000000e-12 3.500000000000000e-12 1.710000000000000e-13 5.950000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.450000000000000e-13 7.980000000000000e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.880000000000000e+02 6.802205700179722e-01 -7.063309920503870e-01 -1.909932341104011e-01 -4.379600800975710e-02 3.720000000000000e-12 3.500000000000000e-12 1.710000000000000e-13 5.950000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.450000000000000e-13 7.980000000000000e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.890000000000000e+02 6.802223523626676e-01 -7.063372704514413e-01 -1.909625353388405e-01 -4.380093394402210e-02 3.720000000000000e-12 3.500000000000000e-12 1.710000000000000e-13 5.950000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.450000000000000e-13 7.980000000000000e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.900000000000000e+02 6.802241331925430e-01 -7.063435502433074e-01 -1.909318323677224e-01 -4.380585623906630e-02 3.720000000000000e-12 3.500000000000000e-12 1.730000000000000e-13 5.990000000000000e-13 3.820000000000000e-12 -1.850000000000000e-12 7.470000000000000e-13 8.000000000000000e-12 -2.420000000000000e-12 7.800000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.910000000000000e+02 6.802259132479141e-01 -7.063498307049770e-01 -1.909011251377613e-01 -4.381077527536250e-02 3.720000000000000e-12 3.500000000000000e-12 1.730000000000000e-13 5.990000000000000e-13 3.820000000000000e-12 -1.850000000000000e-12 7.470000000000000e-13 8.000000000000000e-12 -2.420000000000000e-12 7.800000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.920000000000000e+02 6.802277300521115e-01 -7.063560840505319e-01 -1.908703791748643e-01 -4.381570661980990e-02 3.720000000000000e-12 3.500000000000000e-12 1.740000000000000e-13 5.980000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.460000000000000e-13 8.000000000000000e-12 -2.420000000000000e-12 7.810000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.930000000000000e+02 6.802295115937508e-01 -7.063623632619583e-01 -1.908396621669644e-01 -4.382061920954230e-02 3.720000000000000e-12 3.500000000000000e-12 1.740000000000000e-13 5.980000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.460000000000000e-13 8.000000000000000e-12 -2.420000000000000e-12 7.810000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.940000000000000e+02 6.802312952915669e-01 -7.063686407597149e-01 -1.908089393521965e-01 -4.382552818300820e-02 3.720000000000000e-12 3.500000000000000e-12 1.740000000000000e-13 5.980000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.450000000000000e-13 8.000000000000000e-12 -2.420000000000000e-12 7.800000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.950000000000000e+02 6.802330816816051e-01 -7.063749162250748e-01 -1.907782100979862e-01 -4.383043310046160e-02 3.720000000000000e-12 3.500000000000000e-12 1.740000000000000e-13 5.980000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.450000000000000e-13 8.000000000000000e-12 -2.420000000000000e-12 7.800000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.960000000000000e+02 6.802348708755319e-01 -7.063811897329385e-01 -1.907474738372137e-01 -4.383533347823560e-02 3.720000000000000e-12 3.500000000000000e-12 1.740000000000000e-13 5.980000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.450000000000000e-13 8.000000000000000e-12 -2.420000000000000e-12 7.800000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.970000000000000e+02 6.802366626172719e-01 -7.063874616847539e-01 -1.907167300998881e-01 -4.384022885310550e-02 3.730000000000000e-12 3.510000000000000e-12 1.740000000000000e-13 5.950000000000000e-13 3.830000000000000e-12 -1.840000000000000e-12 7.420000000000000e-13 8.000000000000000e-12 -2.420000000000000e-12 7.810000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.980000000000000e+02 6.802384564385460e-01 -7.063937326485615e-01 -1.906859785353562e-01 -4.384511884977200e-02 3.730000000000000e-12 3.510000000000000e-12 1.740000000000000e-13 5.950000000000000e-13 3.830000000000000e-12 -1.840000000000000e-12 7.420000000000000e-13 8.000000000000000e-12 -2.420000000000000e-12 7.810000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.990000000000000e+02 6.802402518470395e-01 -7.064000031677929e-01 -1.906552189334111e-01 -4.385000325053290e-02 3.730000000000000e-12 3.510000000000000e-12 1.740000000000000e-13 5.950000000000000e-13 3.830000000000000e-12 -1.840000000000000e-12 7.420000000000000e-13 8.000000000000000e-12 -2.420000000000000e-12 7.810000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.000000000000000e+02 6.802420484814161e-01 -7.064062736029311e-01 -1.906244512462664e-01 -4.385488204621590e-02 3.730000000000000e-12 3.510000000000000e-12 1.730000000000000e-13 5.960000000000000e-13 3.830000000000000e-12 -1.850000000000000e-12 7.450000000000000e-13 8.020000000000000e-12 -2.430000000000000e-12 7.820000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.010000000000000e+02 6.802438461925319e-01 -7.064125440497465e-01 -1.905936755979732e-01 -4.385975545315480e-02 3.730000000000000e-12 3.510000000000000e-12 1.730000000000000e-13 5.960000000000000e-13 3.830000000000000e-12 -1.850000000000000e-12 7.450000000000000e-13 8.020000000000000e-12 -2.430000000000000e-12 7.820000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.020000000000000e+02 6.802456458038937e-01 -7.064188137855374e-01 -1.905628915571316e-01 -4.386462419835680e-02 3.730000000000000e-12 3.510000000000000e-12 1.730000000000000e-13 5.960000000000000e-13 3.830000000000000e-12 -1.850000000000000e-12 7.450000000000000e-13 8.020000000000000e-12 -2.430000000000000e-12 7.820000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.030000000000000e+02 6.802474460071875e-01 -7.064250835867260e-01 -1.905321009419303e-01 -4.386948815338650e-02 3.730000000000000e-12 3.510000000000000e-12 1.730000000000000e-13 5.960000000000000e-13 3.830000000000000e-12 -1.840000000000000e-12 7.440000000000000e-13 8.020000000000000e-12 -2.430000000000000e-12 7.820000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.040000000000000e+02 6.802492478494531e-01 -7.064313524611116e-01 -1.905013034914019e-01 -4.387434818085840e-02 3.730000000000000e-12 3.510000000000000e-12 1.730000000000000e-13 5.960000000000000e-13 3.830000000000000e-12 -1.840000000000000e-12 7.440000000000000e-13 8.020000000000000e-12 -2.430000000000000e-12 7.820000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.050000000000000e+02 6.802510516157936e-01 -7.064376199848340e-01 -1.904704996464725e-01 -4.387920475798640e-02 3.740000000000000e-12 3.510000000000000e-12 1.760000000000000e-13 5.990000000000000e-13 3.830000000000000e-12 -1.850000000000000e-12 7.430000000000000e-13 8.030000000000000e-12 -2.420000000000000e-12 7.830000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.060000000000000e+02 6.802528575401868e-01 -7.064438858073744e-01 -1.904396897833301e-01 -4.388405825600820e-02 3.740000000000000e-12 3.510000000000000e-12 1.760000000000000e-13 5.990000000000000e-13 3.830000000000000e-12 -1.850000000000000e-12 7.430000000000000e-13 8.030000000000000e-12 -2.420000000000000e-12 7.830000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.070000000000000e+02 6.802546657741058e-01 -7.064501496950181e-01 -1.904088741663710e-01 -4.388890893086110e-02 3.750000000000000e-12 3.520000000000000e-12 1.760000000000000e-13 5.960000000000000e-13 3.840000000000000e-12 -1.840000000000000e-12 7.400000000000000e-13 8.030000000000000e-12 -2.420000000000000e-12 7.830000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.080000000000000e+02 6.802564763724911e-01 -7.064564115528399e-01 -1.903780529140825e-01 -4.389375693432620e-02 3.750000000000000e-12 3.520000000000000e-12 1.760000000000000e-13 5.960000000000000e-13 3.840000000000000e-12 -1.840000000000000e-12 7.400000000000000e-13 8.030000000000000e-12 -2.420000000000000e-12 7.830000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.090000000000000e+02 6.802582892833321e-01 -7.064626714398087e-01 -1.903472259760865e-01 -4.389860233141870e-02 3.750000000000000e-12 3.520000000000000e-12 1.760000000000000e-13 5.960000000000000e-13 3.840000000000000e-12 -1.840000000000000e-12 7.400000000000000e-13 8.030000000000000e-12 -2.420000000000000e-12 7.830000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.100000000000000e+02 6.802601043407317e-01 -7.064689295760400e-01 -1.903163931272641e-01 -4.390344511595710e-02 3.750000000000000e-12 3.520000000000000e-12 1.750000000000000e-13 5.970000000000000e-13 3.840000000000000e-12 -1.850000000000000e-12 7.430000000000000e-13 8.040000000000000e-12 -2.430000000000000e-12 7.840000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>4.110000000000000e+02 6.802619212649104e-01 -7.064751863358286e-01 -1.902855539902404e-01 -4.390828522450710e-02 3.750000000000000e-12 3.520000000000000e-12 1.750000000000000e-13 5.970000000000000e-13 3.840000000000000e-12 -1.850000000000000e-12 7.430000000000000e-13 8.040000000000000e-12 -2.430000000000000e-12 7.840000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>4.120000000000000e+02 6.802637721074779e-01 -7.064814183017823e-01 -1.902546777612606e-01 -4.391313633033190e-02 3.750000000000000e-12 3.520000000000000e-12 1.750000000000000e-13 5.970000000000000e-13 3.840000000000000e-12 -1.850000000000000e-12 7.430000000000000e-13 8.040000000000000e-12 -2.430000000000000e-12 7.840000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>4.130000000000000e+02 6.802655915507858e-01 -7.064876738714381e-01 -1.902238246395407e-01 -4.391797080113560e-02 3.750000000000000e-12 3.520000000000000e-12 1.750000000000000e-13 5.970000000000000e-13 3.840000000000000e-12 -1.850000000000000e-12 7.430000000000000e-13 8.040000000000000e-12 -2.430000000000000e-12 7.840000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>4.140000000000000e+02 6.802674115316771e-01 -7.064939296988663e-01 -1.901929639553983e-01 -4.392280237536900e-02 3.750000000000000e-12 3.520000000000000e-12 1.750000000000000e-13 5.970000000000000e-13 3.840000000000000e-12 -1.850000000000000e-12 7.420000000000000e-13 8.040000000000000e-12 -2.430000000000000e-12 7.840000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>4.150000000000000e+02 6.802692315605059e-01 -7.065001862801269e-01 -1.901620955966321e-01 -4.392763112805400e-02 3.750000000000000e-12 3.520000000000000e-12 1.780000000000000e-13 6.000000000000000e-13 3.840000000000000e-12 -1.850000000000000e-12 7.420000000000000e-13 8.060000000000001e-12 -2.420000000000000e-12 7.850000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>4.160000000000000e+02 6.802710512089848e-01 -7.065064439727169e-01 -1.901312197150202e-01 -4.393245726940230e-02 3.750000000000000e-12 3.520000000000000e-12 1.780000000000000e-13 6.000000000000000e-13 3.840000000000000e-12 -1.850000000000000e-12 7.420000000000000e-13 8.060000000000001e-12 -2.420000000000000e-12 7.850000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>4.170000000000000e+02 6.802728701677373e-01 -7.065127029536329e-01 -1.901003366799004e-01 -4.393728112991470e-02 3.760000000000000e-12 3.540000000000000e-12 1.780000000000000e-13 5.980000000000000e-13 3.860000000000000e-12 -1.850000000000000e-12 7.410000000000000e-13 8.069999999999999e-12 -2.430000000000000e-12 7.859999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.180000000000000e+02 6.802746882974433e-01 -7.065189632039591e-01 -1.900694469660521e-01 -4.394210310213120e-02 3.760000000000000e-12 3.540000000000000e-12 1.780000000000000e-13 5.980000000000000e-13 3.860000000000000e-12 -1.850000000000000e-12 7.410000000000000e-13 8.069999999999999e-12 -2.430000000000000e-12 7.859999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.190000000000000e+02 6.802765056648097e-01 -7.065252245174817e-01 -1.900385510136808e-01 -4.394692355124710e-02 3.760000000000000e-12 3.540000000000000e-12 1.770000000000000e-13 5.980000000000000e-13 3.860000000000000e-12 -1.850000000000000e-12 7.410000000000000e-13 8.069999999999999e-12 -2.430000000000000e-12 7.859999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.200000000000000e+02 6.802783225387664e-01 -7.065314865404763e-01 -1.900076491151806e-01 -4.395174272391700e-02 3.760000000000000e-12 3.540000000000000e-12 1.780000000000000e-13 5.980000000000000e-13 3.860000000000000e-12 -1.850000000000000e-12 7.410000000000000e-13 8.069999999999999e-12 -2.430000000000000e-12 7.859999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.210000000000000e+02 6.802801393378579e-01 -7.065377488374247e-01 -1.899767413728930e-01 -4.395656068831830e-02 3.760000000000000e-12 3.540000000000000e-12 1.770000000000000e-13 5.980000000000000e-13 3.860000000000000e-12 -1.850000000000000e-12 7.410000000000000e-13 8.069999999999999e-12 -2.430000000000000e-12 7.859999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.220000000000000e+02 6.802819525251127e-01 -7.065440139322317e-01 -1.899458314848123e-01 -4.396137562331650e-02 3.760000000000000e-12 3.540000000000000e-12 1.770000000000000e-13 5.980000000000000e-13 3.860000000000000e-12 -1.850000000000000e-12 7.410000000000000e-13 8.069999999999999e-12 -2.430000000000000e-12 7.859999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.230000000000000e+02 6.802837704595793e-01 -7.065502756113528e-01 -1.899149118966115e-01 -4.396619067104030e-02 3.760000000000000e-12 3.540000000000000e-12 1.770000000000000e-13 5.980000000000000e-13 3.860000000000000e-12 -1.850000000000000e-12 7.410000000000000e-13 8.069999999999999e-12 -2.430000000000000e-12 7.859999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.240000000000000e+02 6.802855892643807e-01 -7.065565367099876e-01 -1.898839864069531e-01 -4.397100382987110e-02 3.760000000000000e-12 3.540000000000000e-12 1.770000000000000e-13 5.980000000000000e-13 3.860000000000000e-12 -1.850000000000000e-12 7.400000000000000e-13 8.069999999999999e-12 -2.430000000000000e-12 7.859999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.250000000000000e+02 6.802874087251581e-01 -7.065627973659192e-01 -1.898530553261513e-01 -4.397581485068910e-02 3.770000000000000e-12 3.550000000000000e-12 1.810000000000000e-13 5.970000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.390000000000000e-13 8.100000000000000e-12 -2.430000000000000e-12 7.890000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.260000000000000e+02 6.802892282868032e-01 -7.065690579557221e-01 -1.898221192658409e-01 -4.398062361920790e-02 3.770000000000000e-12 3.550000000000000e-12 1.810000000000000e-13 5.970000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.380000000000000e-13 8.100000000000000e-12 -2.430000000000000e-12 7.890000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.270000000000000e+02 6.802910471598365e-01 -7.065753190113121e-01 -1.897911790571878e-01 -4.398543020499480e-02 3.770000000000000e-12 3.550000000000000e-12 1.810000000000000e-13 5.970000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.380000000000000e-13 8.100000000000000e-12 -2.430000000000000e-12 7.890000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.280000000000000e+02 6.802928645164167e-01 -7.065815810870441e-01 -1.897602355410413e-01 -4.399023487081920e-02 3.770000000000000e-12 3.550000000000000e-12 1.810000000000000e-13 5.970000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.380000000000000e-13 8.100000000000000e-12 -2.430000000000000e-12 7.890000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.290000000000000e+02 6.802946797156906e-01 -7.065878446162231e-01 -1.897292892971905e-01 -4.399503806009420e-02 3.770000000000000e-12 3.550000000000000e-12 1.810000000000000e-13 5.980000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.380000000000000e-13 8.100000000000000e-12 -2.430000000000000e-12 7.890000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.300000000000000e+02 6.802964924828465e-01 -7.065941098048144e-01 -1.896983404063894e-01 -4.399984036039130e-02 3.770000000000000e-12 3.550000000000000e-12 1.800000000000000e-13 5.980000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.410000000000000e-13 8.110000000000000e-12 -2.450000000000000e-12 7.900000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.310000000000000e+02 6.802983029757570e-01 -7.066003765969556e-01 -1.896673883543656e-01 -4.400464243895090e-02 3.770000000000000e-12 3.550000000000000e-12 1.800000000000000e-13 5.980000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.410000000000000e-13 8.110000000000000e-12 -2.450000000000000e-12 7.900000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.320000000000000e+02 6.803001533380484e-01 -7.066066140030287e-01 -1.896363931612669e-01 -4.400946266643310e-02 3.780000000000000e-12 3.550000000000000e-12 1.840000000000000e-13 6.000000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.390000000000000e-13 8.120000000000000e-12 -2.440000000000000e-12 7.910000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.330000000000000e+02 6.803019611034552e-01 -7.066128830087639e-01 -1.896054315308723e-01 -4.401426608303030e-02 3.780000000000000e-12 3.550000000000000e-12 1.840000000000000e-13 6.010000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.390000000000000e-13 8.120000000000000e-12 -2.440000000000000e-12 7.910000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.340000000000000e+02 6.803037686768679e-01 -7.066191524283109e-01 -1.895744633869473e-01 -4.401907060692340e-02 3.780000000000000e-12 3.550000000000000e-12 1.840000000000000e-13 6.010000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.390000000000000e-13 8.120000000000000e-12 -2.440000000000000e-12 7.910000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.350000000000000e+02 6.803055767518681e-01 -7.066254217928893e-01 -1.895434880307972e-01 -4.402387603844530e-02 3.780000000000000e-12 3.550000000000000e-12 1.840000000000000e-13 6.010000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.390000000000000e-13 8.130000000000000e-12 -2.440000000000000e-12 7.910000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.360000000000000e+02 6.803073858539772e-01 -7.066316906779148e-01 -1.895125052941892e-01 -4.402868178039780e-02 3.780000000000000e-12 3.550000000000000e-12 1.840000000000000e-13 6.010000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.390000000000000e-13 8.130000000000000e-12 -2.440000000000000e-12 7.910000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.370000000000000e+02 6.803091963301170e-01 -7.066379587255932e-01 -1.894815154687763e-01 -4.403348694406500e-02 3.790000000000000e-12 3.560000000000000e-12 1.840000000000000e-13 5.980000000000000e-13 3.880000000000000e-12 -1.850000000000000e-12 7.390000000000000e-13 8.140000000000000e-12 -2.450000000000000e-12 7.920000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.380000000000000e+02 6.803110083621803e-01 -7.066442256763065e-01 -1.894505190952507e-01 -4.403829054478440e-02 3.790000000000000e-12 3.560000000000000e-12 1.840000000000000e-13 5.980000000000000e-13 3.880000000000000e-12 -1.850000000000000e-12 7.380000000000000e-13 8.140000000000000e-12 -2.450000000000000e-12 7.920000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.390000000000000e+02 6.803128219705727e-01 -7.066504914192853e-01 -1.894195167105630e-01 -4.404309172225810e-02 3.790000000000000e-12 3.560000000000000e-12 1.840000000000000e-13 5.980000000000000e-13 3.880000000000000e-12 -1.850000000000000e-12 7.380000000000000e-13 8.140000000000000e-12 -2.450000000000000e-12 7.920000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.400000000000000e+02 6.803146370035202e-01 -7.066567560436259e-01 -1.893885086538902e-01 -4.404788992134960e-02 3.790000000000000e-12 3.560000000000000e-12 1.840000000000000e-13 5.980000000000000e-13 3.880000000000000e-12 -1.850000000000000e-12 7.380000000000000e-13 8.140000000000000e-12 -2.450000000000000e-12 7.920000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.410000000000000e+02 6.803164531387218e-01 -7.066630198532664e-01 -1.893574949844595e-01 -4.405268497857830e-02 3.790000000000000e-12 3.560000000000000e-12 1.830000000000000e-13 5.980000000000000e-13 3.880000000000000e-12 -1.850000000000000e-12 7.380000000000000e-13 8.140000000000000e-12 -2.450000000000000e-12 7.920000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.420000000000000e+02 6.803182664650349e-01 -7.066692858714224e-01 -1.893264787655951e-01 -4.405747562224080e-02 3.790000000000000e-12 3.560000000000000e-12 1.840000000000000e-13 5.970000000000000e-13 3.880000000000000e-12 -1.850000000000000e-12 7.370000000000000e-13 8.140000000000000e-12 -2.450000000000000e-12 7.920000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.430000000000000e+02 6.803200833919300e-01 -7.066755495237650e-01 -1.892954532433296e-01 -4.406226526501960e-02 3.790000000000000e-12 3.560000000000000e-12 1.840000000000000e-13 5.970000000000000e-13 3.880000000000000e-12 -1.850000000000000e-12 7.370000000000000e-13 8.140000000000000e-12 -2.450000000000000e-12 7.920000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.440000000000000e+02 6.803219000057933e-01 -7.066818138184671e-01 -1.892644214571921e-01 -4.406705301269040e-02 3.790000000000000e-12 3.560000000000000e-12 1.840000000000000e-13 5.970000000000000e-13 3.880000000000000e-12 -1.850000000000000e-12 7.370000000000000e-13 8.140000000000000e-12 -2.450000000000000e-12 7.920000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.450000000000000e+02 6.803237159759746e-01 -7.066880790344341e-01 -1.892333834231832e-01 -4.407183941563450e-02 3.790000000000000e-12 3.560000000000000e-12 1.870000000000000e-13 6.010000000000000e-13 3.880000000000000e-12 -1.850000000000000e-12 7.390000000000000e-13 8.169999999999999e-12 -2.450000000000000e-12 7.940000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.460000000000000e+02 6.803255311253283e-01 -7.066943452343719e-01 -1.892023394442672e-01 -4.407662488914970e-02 3.790000000000000e-12 3.560000000000000e-12 1.860000000000000e-13 6.010000000000000e-13 3.880000000000000e-12 -1.850000000000000e-12 7.390000000000000e-13 8.169999999999999e-12 -2.450000000000000e-12 7.940000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.470000000000000e+02 6.803273454047817e-01 -7.067006123017689e-01 -1.891712900767801e-01 -4.408140965843110e-02 3.800000000000000e-12 3.570000000000000e-12 1.880000000000000e-13 5.970000000000000e-13 3.890000000000000e-12 -1.850000000000000e-12 7.350000000000000e-13 8.169999999999999e-12 -2.450000000000000e-12 7.940000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.480000000000000e+02 6.803291588421839e-01 -7.067068800227996e-01 -1.891402360111027e-01 -4.408619374805630e-02 3.800000000000000e-12 3.570000000000000e-12 1.880000000000000e-13 5.970000000000000e-13 3.890000000000000e-12 -1.850000000000000e-12 7.340000000000000e-13 8.169999999999999e-12 -2.450000000000000e-12 7.940000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.490000000000000e+02 6.803309714939706e-01 -7.067131481749768e-01 -1.891091779080065e-01 -4.409097700937710e-02 3.800000000000000e-12 3.570000000000000e-12 1.880000000000000e-13 5.970000000000000e-13 3.890000000000000e-12 -1.850000000000000e-12 7.340000000000000e-13 8.169999999999999e-12 -2.450000000000000e-12 7.940000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.500000000000000e+02 6.803327834150843e-01 -7.067194165915641e-01 -1.890781162542221e-01 -4.409575917158480e-02 3.800000000000000e-12 3.570000000000000e-12 1.890000000000000e-13 5.960000000000000e-13 3.890000000000000e-12 -1.850000000000000e-12 7.330000000000000e-13 8.169999999999999e-12 -2.450000000000000e-12 7.940000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.510000000000000e+02 6.803345946534085e-01 -7.067256851867987e-01 -1.890470512746948e-01 -4.410053989890760e-02 3.800000000000000e-12 3.570000000000000e-12 1.890000000000000e-13 5.960000000000000e-13 3.890000000000000e-12 -1.850000000000000e-12 7.330000000000000e-13 8.169999999999999e-12 -2.450000000000000e-12 7.940000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.520000000000000e+02 6.803364394377216e-01 -7.067319287058482e-01 -1.890159508673926e-01 -4.410533344858510e-02 3.800000000000000e-12 3.570000000000000e-12 1.890000000000000e-13 5.950000000000000e-13 3.890000000000000e-12 -1.850000000000000e-12 7.350000000000000e-13 8.179999999999999e-12 -2.460000000000000e-12 7.959999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.530000000000000e+02 6.803382495328318e-01 -7.067381976175982e-01 -1.889848788136730e-01 -4.411011029925720e-02 3.800000000000000e-12 3.570000000000000e-12 1.890000000000000e-13 5.950000000000000e-13 3.890000000000000e-12 -1.850000000000000e-12 7.350000000000000e-13 8.179999999999999e-12 -2.460000000000000e-12 7.959999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.540000000000000e+02 6.803400592993639e-01 -7.067444666503566e-01 -1.889538025843840e-01 -4.411488479575560e-02 3.800000000000000e-12 3.570000000000000e-12 1.890000000000000e-13 5.950000000000000e-13 3.890000000000000e-12 -1.850000000000000e-12 7.350000000000000e-13 8.179999999999999e-12 -2.460000000000000e-12 7.959999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.550000000000000e+02 6.803418690541270e-01 -7.067507356732268e-01 -1.889227215701331e-01 -4.411965675097470e-02 3.800000000000000e-12 3.570000000000000e-12 1.920000000000000e-13 5.990000000000000e-13 3.890000000000000e-12 -1.850000000000000e-12 7.340000000000000e-13 8.190000000000000e-12 -2.450000000000000e-12 7.969999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.560000000000000e+02 6.803436792623270e-01 -7.067570044260013e-01 -1.888916350920696e-01 -4.412442605665890e-02 3.800000000000000e-12 3.570000000000000e-12 1.920000000000000e-13 5.990000000000000e-13 3.890000000000000e-12 -1.850000000000000e-12 7.340000000000000e-13 8.190000000000000e-12 -2.450000000000000e-12 7.969999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.570000000000000e+02 6.803454905143478e-01 -7.067632725234611e-01 -1.888605424693584e-01 -4.412919268352170e-02 3.810000000000000e-12 3.580000000000000e-12 1.940000000000000e-13 5.940000000000000e-13 3.900000000000000e-12 -1.850000000000000e-12 7.290000000000000e-13 8.190000000000000e-12 -2.450000000000000e-12 7.969999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.580000000000000e+02 6.803473034519605e-01 -7.067695395029227e-01 -1.888294431080919e-01 -4.413395667692460e-02 3.810000000000000e-12 3.580000000000000e-12 1.940000000000000e-13 5.940000000000000e-13 3.900000000000000e-12 -1.850000000000000e-12 7.290000000000000e-13 8.190000000000000e-12 -2.450000000000000e-12 7.969999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.590000000000000e+02 6.803491186622448e-01 -7.067758048968200e-01 -1.887983366158546e-01 -4.413871814003550e-02 3.810000000000000e-12 3.580000000000000e-12 1.940000000000000e-13 5.940000000000000e-13 3.900000000000000e-12 -1.850000000000000e-12 7.290000000000000e-13 8.190000000000000e-12 -2.450000000000000e-12 7.969999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.600000000000000e+02 6.803509365731008e-01 -7.067820683077765e-01 -1.887672229035642e-01 -4.414347720742450e-02 3.810000000000000e-12 3.580000000000000e-12 1.940000000000000e-13 5.940000000000000e-13 3.900000000000000e-12 -1.850000000000000e-12 7.310000000000000e-13 8.210000000000000e-12 -2.460000000000000e-12 7.980000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.610000000000000e+02 6.803527573764295e-01 -7.067883294700855e-01 -1.887361022380261e-01 -4.414823402099550e-02 3.810000000000000e-12 3.580000000000000e-12 1.940000000000000e-13 5.940000000000000e-13 3.900000000000000e-12 -1.850000000000000e-12 7.310000000000000e-13 8.210000000000000e-12 -2.460000000000000e-12 7.980000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.620000000000000e+02 6.803545708357642e-01 -7.067945957983303e-01 -1.887049847384032e-01 -4.415298436161800e-02 3.810000000000000e-12 3.580000000000000e-12 1.950000000000000e-13 5.930000000000000e-13 3.900000000000000e-12 -1.850000000000000e-12 7.300000000000000e-13 8.210000000000000e-12 -2.460000000000000e-12 7.980000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.630000000000000e+02 6.803563969492094e-01 -7.068008523799267e-01 -1.886738520916976e-01 -4.415773705908380e-02 3.810000000000000e-12 3.580000000000000e-12 1.950000000000000e-13 5.930000000000000e-13 3.900000000000000e-12 -1.850000000000000e-12 7.300000000000000e-13 8.210000000000000e-12 -2.460000000000000e-12 7.980000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.640000000000000e+02 6.803582249837111e-01 -7.068071070564178e-01 -1.886427146044410e-01 -4.416248790794260e-02 3.810000000000000e-12 3.580000000000000e-12 1.950000000000000e-13 5.930000000000000e-13 3.900000000000000e-12 -1.850000000000000e-12 7.300000000000000e-13 8.210000000000000e-12 -2.460000000000000e-12 7.980000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.650000000000000e+02 6.803600541606709e-01 -7.068133604016299e-01 -1.886115728910247e-01 -4.416723708608340e-02 3.810000000000000e-12 3.580000000000000e-12 1.990000000000000e-13 5.950000000000000e-13 3.900000000000000e-12 -1.850000000000000e-12 7.280000000000000e-13 8.220000000000000e-12 -2.450000000000000e-12 7.990000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.660000000000000e+02 6.803618835539779e-01 -7.068196131942610e-01 -1.885804273235806e-01 -4.417198480093930e-02 3.810000000000000e-12 3.580000000000000e-12 1.990000000000000e-13 5.950000000000000e-13 3.890000000000000e-12 -1.850000000000000e-12 7.270000000000000e-13 8.220000000000000e-12 -2.450000000000000e-12 7.990000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.670000000000000e+02 6.803637122207733e-01 -7.068258662962895e-01 -1.885492780265805e-01 -4.417673124308570e-02 3.830000000000000e-12 3.590000000000000e-12 2.000000000000000e-13 5.910000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.260000000000000e-13 8.230000000000000e-12 -2.460000000000000e-12 8.010000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.680000000000000e+02 6.803655394111383e-01 -7.068321204408440e-01 -1.885181249350094e-01 -4.418147650180370e-02 3.830000000000000e-12 3.590000000000000e-12 2.000000000000000e-13 5.910000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.260000000000000e-13 8.230000000000000e-12 -2.460000000000000e-12 8.010000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.690000000000000e+02 6.803673648158205e-01 -7.068383759788941e-01 -1.884869678739297e-01 -4.418622046281020e-02 3.830000000000000e-12 3.590000000000000e-12 2.000000000000000e-13 5.910000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.260000000000000e-13 8.240000000000000e-12 -2.460000000000000e-12 8.010000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.700000000000000e+02 6.803691887579600e-01 -7.068446326807400e-01 -1.884558066296656e-01 -4.419096272799490e-02 3.830000000000000e-12 3.590000000000000e-12 2.010000000000000e-13 5.900000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.250000000000000e-13 8.240000000000000e-12 -2.470000000000000e-12 8.010000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.710000000000000e+02 6.803710122222661e-01 -7.068508896981386e-01 -1.884246409905228e-01 -4.419570259868910e-02 3.830000000000000e-12 3.590000000000000e-12 2.010000000000000e-13 5.900000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.250000000000000e-13 8.240000000000000e-12 -2.470000000000000e-12 8.010000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.720000000000000e+02 6.803728686876107e-01 -7.068571220725769e-01 -1.883934406845775e-01 -4.420045289464950e-02 3.830000000000000e-12 3.590000000000000e-12 2.040000000000000e-13 5.930000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.260000000000000e-13 8.260000000000001e-12 -2.470000000000000e-12 8.030000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.730000000000000e+02 6.803746956145477e-01 -7.068633757872791e-01 -1.883622656994435e-01 -4.420518520033690e-02 3.830000000000000e-12 3.590000000000000e-12 2.040000000000000e-13 5.930000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.260000000000000e-13 8.260000000000001e-12 -2.470000000000000e-12 8.030000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.740000000000000e+02 6.803765261844503e-01 -7.068696261476821e-01 -1.883310858131882e-01 -4.420991250208020e-02 3.830000000000000e-12 3.590000000000000e-12 2.040000000000000e-13 5.930000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.260000000000000e-13 8.260000000000001e-12 -2.470000000000000e-12 8.030000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.750000000000000e+02 6.803783608264738e-01 -7.068758727928139e-01 -1.882999009065380e-01 -4.421463446717630e-02 3.840000000000000e-12 3.600000000000000e-12 2.070000000000000e-13 5.870000000000000e-13 3.920000000000000e-12 -1.850000000000000e-12 7.200000000000000e-13 8.260000000000001e-12 -2.470000000000000e-12 8.030000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.760000000000000e+02 6.803801991461443e-01 -7.068821161140445e-01 -1.882687108892860e-01 -4.421935128504470e-02 3.840000000000000e-12 3.600000000000000e-12 2.080000000000000e-13 5.860000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.190000000000000e-13 8.260000000000001e-12 -2.470000000000000e-12 8.030000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.770000000000000e+02 6.803820401074957e-01 -7.068883570808240e-01 -1.882375157116770e-01 -4.422406360152890e-02 3.840000000000000e-12 3.600000000000000e-12 2.080000000000000e-13 5.860000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.190000000000000e-13 8.260000000000001e-12 -2.470000000000000e-12 8.030000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.780000000000000e+02 6.803838824298796e-01 -7.068945968701824e-01 -1.882063153735754e-01 -4.422877229686940e-02 3.840000000000000e-12 3.600000000000000e-12 2.120000000000000e-13 5.890000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.200000000000000e-13 8.290000000000000e-12 -2.470000000000000e-12 8.060000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>4.790000000000000e+02 6.803857250455710e-01 -7.069008364431604e-01 -1.881751099313517e-01 -4.423347818673940e-02 3.840000000000000e-12 3.600000000000000e-12 2.120000000000000e-13 5.890000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.200000000000000e-13 8.290000000000000e-12 -2.470000000000000e-12 8.060000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>4.800000000000000e+02 6.803875674548957e-01 -7.069070762198838e-01 -1.881438994973934e-01 -4.423818175490420e-02 3.840000000000000e-12 3.600000000000000e-12 2.130000000000000e-13 5.880000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.190000000000000e-13 8.290000000000000e-12 -2.470000000000000e-12 8.060000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>4.810000000000000e+02 6.803894098561737e-01 -7.069133159634268e-01 -1.881126842355853e-01 -4.424288303041550e-02 3.840000000000000e-12 3.600000000000000e-12 2.140000000000000e-13 5.870000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.180000000000000e-13 8.290000000000000e-12 -2.470000000000000e-12 8.060000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>4.820000000000000e+02 6.803912639514307e-01 -7.069195468184943e-01 -1.880814540762603e-01 -4.424758634173140e-02 3.850000000000000e-12 3.610000000000000e-12 2.140000000000000e-13 5.840000000000000e-13 3.930000000000000e-12 -1.850000000000000e-12 7.170000000000000e-13 8.300000000000000e-12 -2.480000000000000e-12 8.069999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.830000000000000e+02 6.803931088853072e-01 -7.069257839480435e-01 -1.880502298073997e-01 -4.425228175150710e-02 3.850000000000000e-12 3.610000000000000e-12 2.140000000000000e-13 5.840000000000000e-13 3.930000000000000e-12 -1.850000000000000e-12 7.170000000000000e-13 8.300000000000000e-12 -2.480000000000000e-12 8.069999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.840000000000000e+02 6.803949564346709e-01 -7.069320184084023e-01 -1.880190014450611e-01 -4.425697349443240e-02 3.850000000000000e-12 3.610000000000000e-12 2.150000000000000e-13 5.830000000000000e-13 3.920000000000000e-12 -1.850000000000000e-12 7.160000000000000e-13 8.300000000000000e-12 -2.480000000000000e-12 8.069999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.850000000000000e+02 6.803968069423726e-01 -7.069382497896975e-01 -1.879877693261727e-01 -4.426166140886420e-02 3.850000000000000e-12 3.610000000000000e-12 2.160000000000000e-13 5.820000000000000e-13 3.920000000000000e-12 -1.850000000000000e-12 7.150000000000000e-13 8.300000000000000e-12 -2.480000000000000e-12 8.069999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.860000000000000e+02 6.803986601013317e-01 -7.069444782772060e-01 -1.879565338110631e-01 -4.426634572011170e-02 3.850000000000000e-12 3.610000000000000e-12 2.160000000000000e-13 5.820000000000000e-13 3.920000000000000e-12 -1.840000000000000e-12 7.150000000000000e-13 8.300000000000000e-12 -2.480000000000000e-12 8.069999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.870000000000000e+02 6.804005150458041e-01 -7.069507045881674e-01 -1.879252952073051e-01 -4.427102696962610e-02 3.850000000000000e-12 3.610000000000000e-12 2.200000000000000e-13 5.840000000000000e-13 3.920000000000000e-12 -1.840000000000000e-12 7.130000000000000e-13 8.320000000000000e-12 -2.470000000000000e-12 8.080000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.880000000000000e+02 6.804023706504176e-01 -7.069569297294003e-01 -1.878940536421642e-01 -4.427570583048060e-02 3.850000000000000e-12 3.610000000000000e-12 2.200000000000000e-13 5.840000000000000e-13 3.920000000000000e-12 -1.840000000000000e-12 7.130000000000000e-13 8.320000000000000e-12 -2.470000000000000e-12 8.080000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.890000000000000e+02 6.804042259214623e-01 -7.069631546749781e-01 -1.878628089106905e-01 -4.428038288456980e-02 3.850000000000000e-12 3.610000000000000e-12 2.200000000000000e-13 5.840000000000000e-13 3.920000000000000e-12 -1.840000000000000e-12 7.120000000000000e-13 8.320000000000000e-12 -2.470000000000000e-12 8.080000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.900000000000000e+02 6.804060803357034e-01 -7.069693800786994e-01 -1.878315603707232e-01 -4.428505845139280e-02 3.850000000000000e-12 3.610000000000000e-12 2.210000000000000e-13 5.830000000000000e-13 3.920000000000000e-12 -1.840000000000000e-12 7.130000000000000e-13 8.330000000000000e-12 -2.480000000000000e-12 8.100000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.910000000000000e+02 6.804079340040512e-01 -7.069756061183868e-01 -1.878003069515258e-01 -4.428973252110370e-02 3.850000000000000e-12 3.610000000000000e-12 2.210000000000000e-13 5.830000000000000e-13 3.920000000000000e-12 -1.840000000000000e-12 7.130000000000000e-13 8.330000000000000e-12 -2.480000000000000e-12 8.100000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.920000000000000e+02 6.804098174966778e-01 -7.069818104037153e-01 -1.877690192113430e-01 -4.429441767122830e-02 3.860000000000000e-12 3.620000000000000e-12 2.230000000000000e-13 5.780000000000000e-13 3.930000000000000e-12 -1.840000000000000e-12 7.090000000000000e-13 8.330000000000000e-12 -2.480000000000000e-12 8.100000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.930000000000000e+02 6.804116720343808e-01 -7.069880365587891e-01 -1.877377520462600e-01 -4.429908778681280e-02 3.860000000000000e-12 3.620000000000000e-12 2.230000000000000e-13 5.780000000000000e-13 3.930000000000000e-12 -1.840000000000000e-12 7.090000000000000e-13 8.330000000000000e-12 -2.480000000000000e-12 8.100000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.940000000000000e+02 6.804135284959884e-01 -7.069942617995010e-01 -1.877064763980241e-01 -4.430375537644200e-02 3.860000000000000e-12 3.620000000000000e-12 2.230000000000000e-13 5.780000000000000e-13 3.930000000000000e-12 -1.840000000000000e-12 7.080000000000000e-13 8.330000000000000e-12 -2.480000000000000e-12 8.100000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.950000000000000e+02 6.804153875696328e-01 -7.070004855633120e-01 -1.876751919267832e-01 -4.430842027146590e-02 3.870000000000000e-12 3.620000000000000e-12 2.280000000000000e-13 5.800000000000000e-13 3.930000000000000e-12 -1.840000000000000e-12 7.090000000000000e-13 8.360000000000001e-12 -2.480000000000000e-12 8.120000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.960000000000000e+02 6.804172494894142e-01 -7.070067075283486e-01 -1.876438989760214e-01 -4.431308254072470e-02 3.870000000000000e-12 3.620000000000000e-12 2.280000000000000e-13 5.800000000000000e-13 3.930000000000000e-12 -1.840000000000000e-12 7.090000000000000e-13 8.360000000000001e-12 -2.480000000000000e-12 8.120000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.970000000000000e+02 6.804191140311587e-01 -7.070129276594594e-01 -1.876125984225085e-01 -4.431774245838540e-02 3.860000000000000e-12 3.620000000000000e-12 2.280000000000000e-13 5.790000000000000e-13 3.930000000000000e-12 -1.840000000000000e-12 7.070000000000000e-13 8.360000000000001e-12 -2.490000000000000e-12 8.120000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.980000000000000e+02 6.804209806186307e-01 -7.070191461952581e-01 -1.875812913617432e-01 -4.432240041299860e-02 3.860000000000000e-12 3.620000000000000e-12 2.280000000000000e-13 5.790000000000000e-13 3.930000000000000e-12 -1.840000000000000e-12 7.070000000000000e-13 8.360000000000001e-12 -2.490000000000000e-12 8.120000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.990000000000000e+02 6.804228484731202e-01 -7.070253636083783e-01 -1.875499787396011e-01 -4.432705680440600e-02 3.860000000000000e-12 3.620000000000000e-12 2.280000000000000e-13 5.790000000000000e-13 3.930000000000000e-12 -1.840000000000000e-12 7.070000000000000e-13 8.360000000000001e-12 -2.490000000000000e-12 8.120000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.000000000000000e+02 6.804247167509674e-01 -7.070315805567897e-01 -1.875186610578563e-01 -4.433171195433680e-02 3.880000000000000e-12 3.630000000000000e-12 2.300000000000000e-13 5.740000000000000e-13 3.940000000000000e-12 -1.840000000000000e-12 7.030000000000000e-13 8.360000000000001e-12 -2.490000000000000e-12 8.120000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.010000000000000e+02 6.804265846554490e-01 -7.070377978113996e-01 -1.874873382524493e-01 -4.433636605698650e-02 3.880000000000000e-12 3.630000000000000e-12 2.310000000000000e-13 5.730000000000000e-13 3.940000000000000e-12 -1.840000000000000e-12 7.020000000000000e-13 8.360000000000001e-12 -2.490000000000000e-12 8.120000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.020000000000000e+02 6.804284457956532e-01 -7.070440203922262e-01 -1.874560151564688e-01 -4.434101669297690e-02 3.880000000000000e-12 3.630000000000000e-12 2.330000000000000e-13 5.770000000000000e-13 3.940000000000000e-12 -1.840000000000000e-12 7.040000000000000e-13 8.379999999999999e-12 -2.490000000000000e-12 8.150000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.030000000000000e+02 6.804303111768971e-01 -7.070502404805854e-01 -1.874246801654535e-01 -4.434566870546690e-02 3.880000000000000e-12 3.630000000000000e-12 2.330000000000000e-13 5.770000000000000e-13 3.940000000000000e-12 -1.840000000000000e-12 7.040000000000000e-13 8.379999999999999e-12 -2.490000000000000e-12 8.150000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.040000000000000e+02 6.804321748860434e-01 -7.070564627194242e-01 -1.873933378655103e-01 -4.435031939194290e-02 3.880000000000000e-12 3.630000000000000e-12 2.340000000000000e-13 5.760000000000000e-13 3.940000000000000e-12 -1.840000000000000e-12 7.020000000000000e-13 8.379999999999999e-12 -2.490000000000000e-12 8.150000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.050000000000000e+02 6.804340370307466e-01 -7.070626871720161e-01 -1.873619877137878e-01 -4.435496836958380e-02 3.880000000000000e-12 3.630000000000000e-12 2.360000000000000e-13 5.750000000000000e-13 3.940000000000000e-12 -1.840000000000000e-12 7.010000000000000e-13 8.379999999999999e-12 -2.490000000000000e-12 8.150000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.060000000000000e+02 6.804358979687370e-01 -7.070689135627078e-01 -1.873306295686791e-01 -4.435961512606940e-02 3.880000000000000e-12 3.630000000000000e-12 2.370000000000000e-13 5.740000000000000e-13 3.940000000000000e-12 -1.840000000000000e-12 7.000000000000000e-13 8.379999999999999e-12 -2.490000000000000e-12 8.150000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.070000000000000e+02 6.804377582037535e-01 -7.070751413725604e-01 -1.872992636922413e-01 -4.436425908282890e-02 3.880000000000000e-12 3.630000000000000e-12 2.360000000000000e-13 5.740000000000000e-13 3.940000000000000e-12 -1.840000000000000e-12 7.030000000000000e-13 8.400000000000000e-12 -2.500000000000000e-12 8.160000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.080000000000000e+02 6.804396182491000e-01 -7.070813699927277e-01 -1.872678906381760e-01 -4.436889971764570e-02 3.880000000000000e-12 3.630000000000000e-12 2.350000000000000e-13 5.740000000000000e-13 3.940000000000000e-12 -1.840000000000000e-12 7.030000000000000e-13 8.400000000000000e-12 -2.500000000000000e-12 8.160000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.090000000000000e+02 6.804414784981926e-01 -7.070875988822702e-01 -1.872365110885500e-01 -4.437353672502190e-02 3.880000000000000e-12 3.630000000000000e-12 2.370000000000000e-13 5.730000000000000e-13 3.940000000000000e-12 -1.840000000000000e-12 7.020000000000000e-13 8.400000000000000e-12 -2.500000000000000e-12 8.160000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.100000000000000e+02 6.804433391438437e-01 -7.070938276792915e-01 -1.872051256936050e-01 -4.437817015905710e-02 3.890000000000000e-12 3.640000000000000e-12 2.390000000000000e-13 5.690000000000000e-13 3.950000000000000e-12 -1.840000000000000e-12 6.970000000000000e-13 8.400000000000000e-12 -2.500000000000000e-12 8.160000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.110000000000000e+02 6.804452001695896e-01 -7.071000562381442e-01 -1.871737349519128e-01 -4.438280047869550e-02 3.890000000000000e-12 3.640000000000000e-12 2.390000000000000e-13 5.690000000000000e-13 3.950000000000000e-12 -1.840000000000000e-12 6.970000000000000e-13 8.400000000000000e-12 -2.500000000000000e-12 8.160000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.120000000000000e+02 6.804471034366796e-01 -7.071062534855720e-01 -1.871422995800814e-01 -4.438744658244870e-02 3.890000000000000e-12 3.640000000000000e-12 2.420000000000000e-13 5.720000000000000e-13 3.950000000000000e-12 -1.840000000000000e-12 6.980000000000000e-13 8.420000000000000e-12 -2.500000000000000e-12 8.190000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.130000000000000e+02 6.804489647120614e-01 -7.071124817441781e-01 -1.871108987606872e-01 -4.439207304059260e-02 3.890000000000000e-12 3.640000000000000e-12 2.420000000000000e-13 5.720000000000000e-13 3.950000000000000e-12 -1.840000000000000e-12 6.980000000000000e-13 8.420000000000000e-12 -2.500000000000000e-12 8.190000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.140000000000000e+02 6.804508259103161e-01 -7.071187100141300e-01 -1.870794927818112e-01 -4.439669859822580e-02 3.890000000000000e-12 3.640000000000000e-12 2.420000000000000e-13 5.720000000000000e-13 3.950000000000000e-12 -1.840000000000000e-12 6.980000000000000e-13 8.420000000000000e-12 -2.500000000000000e-12 8.190000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.150000000000000e+02 6.804526871032610e-01 -7.071249382973606e-01 -1.870480813402299e-01 -4.440132339068760e-02 3.890000000000000e-12 3.640000000000000e-12 2.430000000000000e-13 5.710000000000000e-13 3.950000000000000e-12 -1.840000000000000e-12 6.970000000000000e-13 8.420000000000000e-12 -2.500000000000000e-12 8.190000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.160000000000000e+02 6.804545485690342e-01 -7.071311664598303e-01 -1.870166640316401e-01 -4.440594698177390e-02 3.890000000000000e-12 3.640000000000000e-12 2.440000000000000e-13 5.700000000000000e-13 3.950000000000000e-12 -1.840000000000000e-12 6.960000000000000e-13 8.420000000000000e-12 -2.500000000000000e-12 8.190000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.170000000000000e+02 6.804564107329627e-01 -7.071373942640587e-01 -1.869852404170683e-01 -4.441056847217940e-02 3.900000000000000e-12 3.660000000000000e-12 2.440000000000000e-13 5.660000000000000e-13 3.960000000000000e-12 -1.840000000000000e-12 6.920000000000000e-13 8.420000000000000e-12 -2.500000000000000e-12 8.190000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.180000000000000e+02 6.804582740277767e-01 -7.071436214673144e-01 -1.869538100930558e-01 -4.441518678245570e-02 3.900000000000000e-12 3.660000000000000e-12 2.440000000000000e-13 5.660000000000000e-13 3.960000000000000e-12 -1.840000000000000e-12 6.920000000000000e-13 8.430000000000000e-12 -2.500000000000000e-12 8.190000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.190000000000000e+02 6.804601387148121e-01 -7.071498479544605e-01 -1.869223727551841e-01 -4.441980101007110e-02 3.900000000000000e-12 3.650000000000000e-12 2.450000000000000e-13 5.650000000000000e-13 3.960000000000000e-12 -1.830000000000000e-12 6.910000000000000e-13 8.430000000000000e-12 -2.500000000000000e-12 8.190000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.200000000000000e+02 6.804620047249804e-01 -7.071560738611651e-01 -1.868909282409560e-01 -4.442441072380310e-02 3.900000000000000e-12 3.650000000000000e-12 2.480000000000000e-13 5.690000000000000e-13 3.960000000000000e-12 -1.840000000000000e-12 6.930000000000000e-13 8.450000000000001e-12 -2.500000000000000e-12 8.210000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.210000000000000e+02 6.804638715878522e-01 -7.071622996319363e-01 -1.868594765370707e-01 -4.442901609572860e-02 3.900000000000000e-12 3.650000000000000e-12 2.490000000000000e-13 5.680000000000000e-13 3.960000000000000e-12 -1.840000000000000e-12 6.920000000000000e-13 8.450000000000001e-12 -2.500000000000000e-12 8.210000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.220000000000000e+02 6.804657468579826e-01 -7.071685197822557e-01 -1.868280098581551e-01 -4.443362144168260e-02 3.900000000000000e-12 3.650000000000000e-12 2.490000000000000e-13 5.680000000000000e-13 3.960000000000000e-12 -1.840000000000000e-12 6.920000000000000e-13 8.450000000000001e-12 -2.500000000000000e-12 8.210000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.230000000000000e+02 6.804676128318610e-01 -7.071747475383846e-01 -1.867965441021969e-01 -4.443822051350210e-02 3.900000000000000e-12 3.650000000000000e-12 2.480000000000000e-13 5.680000000000000e-13 3.960000000000000e-12 -1.840000000000000e-12 6.920000000000000e-13 8.450000000000001e-12 -2.500000000000000e-12 8.210000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.240000000000000e+02 6.804694769925534e-01 -7.071809774728639e-01 -1.867650714649811e-01 -4.444281789767960e-02 3.900000000000000e-12 3.650000000000000e-12 2.500000000000000e-13 5.670000000000000e-13 3.960000000000000e-12 -1.830000000000000e-12 6.910000000000000e-13 8.450000000000001e-12 -2.500000000000000e-12 8.210000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.250000000000000e+02 6.804713387700733e-01 -7.071872101007519e-01 -1.867335919061132e-01 -4.444741428047780e-02 3.920000000000000e-12 3.670000000000000e-12 2.550000000000000e-13 5.650000000000000e-13 3.970000000000000e-12 -1.840000000000000e-12 6.880000000000000e-13 8.479999999999999e-12 -2.510000000000000e-12 8.240000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.260000000000000e+02 6.804731980370196e-01 -7.071934455708004e-01 -1.867021052564498e-01 -4.445200994083620e-02 3.920000000000000e-12 3.670000000000000e-12 2.550000000000000e-13 5.660000000000000e-13 3.970000000000000e-12 -1.840000000000000e-12 6.880000000000000e-13 8.479999999999999e-12 -2.510000000000000e-12 8.240000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.270000000000000e+02 6.804750550979983e-01 -7.071996836573675e-01 -1.866706112812963e-01 -4.445660477547360e-02 3.920000000000000e-12 3.670000000000000e-12 2.550000000000000e-13 5.660000000000000e-13 3.970000000000000e-12 -1.830000000000000e-12 6.880000000000000e-13 8.479999999999999e-12 -2.510000000000000e-12 8.240000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.280000000000000e+02 6.804769105518069e-01 -7.072059238521039e-01 -1.866391098014493e-01 -4.446119844182430e-02 3.920000000000000e-12 3.670000000000000e-12 2.550000000000000e-13 5.650000000000000e-13 3.970000000000000e-12 -1.840000000000000e-12 6.900000000000000e-13 8.490000000000000e-12 -2.520000000000000e-12 8.250000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.290000000000000e+02 6.804787650873577e-01 -7.072121655091635e-01 -1.866076008413017e-01 -4.446579055046080e-02 3.920000000000000e-12 3.670000000000000e-12 2.550000000000000e-13 5.650000000000000e-13 3.970000000000000e-12 -1.840000000000000e-12 6.890000000000000e-13 8.490000000000000e-12 -2.520000000000000e-12 8.250000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.300000000000000e+02 6.804806192923739e-01 -7.072184079886291e-01 -1.865760847431044e-01 -4.447038083298010e-02 3.920000000000000e-12 3.660000000000000e-12 2.560000000000000e-13 5.640000000000000e-13 3.970000000000000e-12 -1.840000000000000e-12 6.880000000000000e-13 8.490000000000000e-12 -2.520000000000000e-12 8.250000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.310000000000000e+02 6.804824735366802e-01 -7.072246507599401e-01 -1.865445621806901e-01 -4.447496922648460e-02 3.920000000000000e-12 3.660000000000000e-12 2.560000000000000e-13 5.640000000000000e-13 3.970000000000000e-12 -1.830000000000000e-12 6.880000000000000e-13 8.490000000000000e-12 -2.520000000000000e-12 8.250000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.320000000000000e+02 6.804843301541184e-01 -7.072308918192621e-01 -1.865130319755352e-01 -4.447955681574660e-02 3.920000000000000e-12 3.660000000000000e-12 2.570000000000000e-13 5.630000000000000e-13 3.970000000000000e-12 -1.830000000000000e-12 6.870000000000000e-13 8.490000000000000e-12 -2.520000000000000e-12 8.250000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.330000000000000e+02 6.804861847334052e-01 -7.072371341863908e-01 -1.864814991615314e-01 -4.448414195264290e-02 3.920000000000000e-12 3.660000000000000e-12 2.570000000000000e-13 5.630000000000000e-13 3.970000000000000e-12 -1.830000000000000e-12 6.870000000000000e-13 8.490000000000000e-12 -2.520000000000000e-12 8.250000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.340000000000000e+02 6.804880393992045e-01 -7.072433761168424e-01 -1.864499623126039e-01 -4.448872584268990e-02 3.920000000000000e-12 3.660000000000000e-12 2.570000000000000e-13 5.630000000000000e-13 3.970000000000000e-12 -1.830000000000000e-12 6.870000000000000e-13 8.490000000000000e-12 -2.520000000000000e-12 8.250000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.350000000000000e+02 6.804898941164037e-01 -7.072496175776053e-01 -1.864184216420885e-01 -4.449330864578800e-02 3.930000000000000e-12 3.680000000000000e-12 2.580000000000000e-13 5.590000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.860000000000000e-13 8.500000000000000e-12 -2.530000000000000e-12 8.269999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.360000000000000e+02 6.804917489208079e-01 -7.072558585928699e-01 -1.863868769202563e-01 -4.449789038455780e-02 3.930000000000000e-12 3.680000000000000e-12 2.580000000000000e-13 5.600000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.860000000000000e-13 8.500000000000000e-12 -2.530000000000000e-12 8.269999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.370000000000000e+02 6.804936038904005e-01 -7.072620992192971e-01 -1.863553276634038e-01 -4.450247098345640e-02 3.930000000000000e-12 3.680000000000000e-12 2.620000000000000e-13 5.620000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.830000000000000e-13 8.520000000000000e-12 -2.520000000000000e-12 8.279999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.380000000000000e+02 6.804954590820982e-01 -7.072683395082562e-01 -1.863237734829476e-01 -4.450705037355140e-02 3.930000000000000e-12 3.680000000000000e-12 2.620000000000000e-13 5.620000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.830000000000000e-13 8.520000000000000e-12 -2.520000000000000e-12 8.279999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.390000000000000e+02 6.804973144598477e-01 -7.072745794679552e-01 -1.862922144610335e-01 -4.451162862181950e-02 3.930000000000000e-12 3.680000000000000e-12 2.620000000000000e-13 5.620000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.830000000000000e-13 8.520000000000000e-12 -2.520000000000000e-12 8.279999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.400000000000000e+02 6.804991698544183e-01 -7.072808190293802e-01 -1.862606514046339e-01 -4.451620602542600e-02 3.930000000000000e-12 3.680000000000000e-12 2.630000000000000e-13 5.610000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.820000000000000e-13 8.520000000000000e-12 -2.520000000000000e-12 8.279999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.410000000000000e+02 6.805012867909005e-01 -7.072867527392439e-01 -1.862293183242573e-01 -4.452065893477910e-02 3.930000000000000e-12 3.680000000000000e-12 2.630000000000000e-13 5.610000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.820000000000000e-13 8.520000000000000e-12 -2.520000000000000e-12 8.279999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.420000000000000e+02 6.805031799178527e-01 -7.072929563598265e-01 -1.861977466990716e-01 -4.452521902984450e-02 3.930000000000000e-12 3.680000000000000e-12 2.630000000000000e-13 5.600000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.840000000000000e-13 8.530000000000000e-12 -2.530000000000000e-12 8.290000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.430000000000000e+02 6.805050809828308e-01 -7.072991540833821e-01 -1.861661626019244e-01 -4.452977982830140e-02 3.930000000000000e-12 3.680000000000000e-12 2.630000000000000e-13 5.600000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.840000000000000e-13 8.530000000000000e-12 -2.530000000000000e-12 8.290000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.440000000000000e+02 6.805069643946929e-01 -7.073053648728441e-01 -1.861345901826797e-01 -4.453433024015160e-02 3.930000000000000e-12 3.680000000000000e-12 2.630000000000000e-13 5.600000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.840000000000000e-13 8.530000000000000e-12 -2.530000000000000e-12 8.290000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.450000000000000e+02 6.805088484871842e-01 -7.073115751425622e-01 -1.861030121403158e-01 -4.453887821101840e-02 3.930000000000000e-12 3.680000000000000e-12 2.630000000000000e-13 5.610000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.840000000000000e-13 8.530000000000000e-12 -2.530000000000000e-12 8.290000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.460000000000000e+02 6.805107332163123e-01 -7.073177849245140e-01 -1.860714285159732e-01 -4.454342372226410e-02 3.930000000000000e-12 3.680000000000000e-12 2.630000000000000e-13 5.610000000000000e-13 3.970000000000000e-12 -1.830000000000000e-12 6.840000000000000e-13 8.530000000000000e-12 -2.530000000000000e-12 8.290000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.470000000000000e+02 6.805126186383037e-01 -7.073239941757525e-01 -1.860398392575891e-01 -4.454796680331320e-02 3.940000000000000e-12 3.690000000000000e-12 2.670000000000000e-13 5.600000000000000e-13 3.990000000000000e-12 -1.830000000000000e-12 6.820000000000000e-13 8.560000000000001e-12 -2.530000000000000e-12 8.320000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.480000000000000e+02 6.805145046966103e-01 -7.073302029383208e-01 -1.860082444163940e-01 -4.455250742541880e-02 3.940000000000000e-12 3.690000000000000e-12 2.670000000000000e-13 5.600000000000000e-13 3.990000000000000e-12 -1.830000000000000e-12 6.810000000000000e-13 8.560000000000001e-12 -2.530000000000000e-12 8.320000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.490000000000000e+02 6.805163914426786e-01 -7.073364111727845e-01 -1.859766439449270e-01 -4.455704561595780e-02 3.940000000000000e-12 3.690000000000000e-12 2.660000000000000e-13 5.600000000000000e-13 3.990000000000000e-12 -1.830000000000000e-12 6.810000000000000e-13 8.560000000000001e-12 -2.530000000000000e-12 8.320000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.500000000000000e+02 6.805182788688150e-01 -7.073426188839199e-01 -1.859450378506618e-01 -4.456158137431390e-02 3.940000000000000e-12 3.690000000000000e-12 2.680000000000000e-13 5.590000000000000e-13 3.990000000000000e-12 -1.830000000000000e-12 6.800000000000000e-13 8.560000000000001e-12 -2.530000000000000e-12 8.320000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.510000000000000e+02 6.805201669190556e-01 -7.073488261144781e-01 -1.859134261816430e-01 -4.456611466499450e-02 3.940000000000000e-12 3.690000000000000e-12 2.670000000000000e-13 5.590000000000000e-13 3.990000000000000e-12 -1.830000000000000e-12 6.800000000000000e-13 8.560000000000001e-12 -2.530000000000000e-12 8.320000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.520000000000000e+02 6.805220573093533e-01 -7.073550315906878e-01 -1.858818073197795e-01 -4.457064624071170e-02 3.940000000000000e-12 3.690000000000000e-12 2.680000000000000e-13 5.580000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.790000000000000e-13 8.560000000000001e-12 -2.530000000000000e-12 8.320000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.530000000000000e+02 6.805239494795332e-01 -7.073612357265610e-01 -1.858501817943947e-01 -4.457517586236790e-02 3.940000000000000e-12 3.690000000000000e-12 2.680000000000000e-13 5.580000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.790000000000000e-13 8.560000000000001e-12 -2.530000000000000e-12 8.320000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.540000000000000e+02 6.805258395218137e-01 -7.073674414197361e-01 -1.858185532921351e-01 -4.457970182543620e-02 3.940000000000000e-12 3.690000000000000e-12 2.680000000000000e-13 5.580000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.790000000000000e-13 8.560000000000001e-12 -2.530000000000000e-12 8.320000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.550000000000000e+02 6.805277302574784e-01 -7.073736465783308e-01 -1.857869191482154e-01 -4.458422535487440e-02 3.940000000000000e-12 3.690000000000000e-12 2.670000000000000e-13 5.590000000000000e-13 3.990000000000000e-12 -1.830000000000000e-12 6.820000000000000e-13 8.569999999999999e-12 -2.550000000000000e-12 8.330000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.560000000000000e+02 6.805296216745166e-01 -7.073798512091868e-01 -1.857552793768310e-01 -4.458874645517210e-02 3.940000000000000e-12 3.690000000000000e-12 2.670000000000000e-13 5.590000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.820000000000000e-13 8.569999999999999e-12 -2.550000000000000e-12 8.330000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.570000000000000e+02 6.805315137141127e-01 -7.073860553560423e-01 -1.857236340313879e-01 -4.459326509655990e-02 3.950000000000000e-12 3.700000000000000e-12 2.690000000000000e-13 5.550000000000000e-13 4.000000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.569999999999999e-12 -2.550000000000000e-12 8.330000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.580000000000000e+02 6.805334064588721e-01 -7.073922589567497e-01 -1.856919830339849e-01 -4.459778131764620e-02 3.950000000000000e-12 3.700000000000000e-12 2.690000000000000e-13 5.550000000000000e-13 4.000000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.569999999999999e-12 -2.550000000000000e-12 8.330000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.590000000000000e+02 6.805352998263100e-01 -7.073984620725992e-01 -1.856603264603890e-01 -4.460229507836520e-02 3.950000000000000e-12 3.700000000000000e-12 2.690000000000000e-13 5.550000000000000e-13 4.000000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.569999999999999e-12 -2.550000000000000e-12 8.330000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.600000000000000e+02 6.805371938683505e-01 -7.074046646641636e-01 -1.856286642617684e-01 -4.460680640401320e-02 3.950000000000000e-12 3.700000000000000e-12 2.710000000000000e-13 5.590000000000000e-13 4.000000000000000e-12 -1.830000000000000e-12 6.800000000000000e-13 8.590000000000000e-12 -2.550000000000000e-12 8.350000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.610000000000000e+02 6.805390886029358e-01 -7.074108667175882e-01 -1.855969964205011e-01 -4.461131530278950e-02 3.950000000000000e-12 3.700000000000000e-12 2.710000000000000e-13 5.590000000000000e-13 4.000000000000000e-12 -1.830000000000000e-12 6.790000000000000e-13 8.590000000000000e-12 -2.550000000000000e-12 8.350000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.620000000000000e+02 6.805409918404088e-01 -7.074170624399340e-01 -1.855653155572003e-01 -4.461582517318450e-02 3.950000000000000e-12 3.700000000000000e-12 2.720000000000000e-13 5.580000000000000e-13 4.000000000000000e-12 -1.830000000000000e-12 6.780000000000000e-13 8.600000000000000e-12 -2.550000000000000e-12 8.350000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.630000000000000e+02 6.805429009851827e-01 -7.074232537550383e-01 -1.855336241221036e-01 -4.462033488695880e-02 3.950000000000000e-12 3.700000000000000e-12 2.720000000000000e-13 5.580000000000000e-13 4.000000000000000e-12 -1.830000000000000e-12 6.780000000000000e-13 8.600000000000000e-12 -2.550000000000000e-12 8.350000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.640000000000000e+02 6.805447977018727e-01 -7.074294542616685e-01 -1.855019394368551e-01 -4.462483646043270e-02 3.950000000000000e-12 3.700000000000000e-12 2.720000000000000e-13 5.580000000000000e-13 4.000000000000000e-12 -1.830000000000000e-12 6.780000000000000e-13 8.600000000000000e-12 -2.550000000000000e-12 8.350000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.650000000000000e+02 6.805466950362852e-01 -7.074356542817831e-01 -1.854702491810835e-01 -4.462933558548260e-02 3.950000000000000e-12 3.700000000000000e-12 2.730000000000000e-13 5.570000000000000e-13 3.990000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.600000000000000e-12 -2.550000000000000e-12 8.360000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.660000000000000e+02 6.805485930491795e-01 -7.074418537716606e-01 -1.854385532922979e-01 -4.463383227730270e-02 3.950000000000000e-12 3.700000000000000e-12 2.730000000000000e-13 5.570000000000000e-13 3.990000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.600000000000000e-12 -2.550000000000000e-12 8.360000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.670000000000000e+02 6.805504917507675e-01 -7.074480527231749e-01 -1.854068517601737e-01 -4.463832654073590e-02 3.950000000000000e-12 3.700000000000000e-12 2.720000000000000e-13 5.580000000000000e-13 3.990000000000000e-12 -1.830000000000000e-12 6.800000000000000e-13 8.610000000000000e-12 -2.560000000000000e-12 8.369999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.680000000000000e+02 6.805523910575262e-01 -7.074542511980290e-01 -1.853751446623895e-01 -4.464281833753750e-02 3.950000000000000e-12 3.700000000000000e-12 2.710000000000000e-13 5.580000000000000e-13 3.990000000000000e-12 -1.830000000000000e-12 6.800000000000000e-13 8.610000000000000e-12 -2.560000000000000e-12 8.369999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.690000000000000e+02 6.805542910572175e-01 -7.074604491286851e-01 -1.853434319197339e-01 -4.464730771795980e-02 3.950000000000000e-12 3.700000000000000e-12 2.710000000000000e-13 5.580000000000000e-13 3.990000000000000e-12 -1.830000000000000e-12 6.790000000000000e-13 8.610000000000000e-12 -2.560000000000000e-12 8.369999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.700000000000000e+02 6.805561917285031e-01 -7.074666465323102e-01 -1.853117135472950e-01 -4.465179466146390e-02 3.970000000000000e-12 3.710000000000000e-12 2.760000000000000e-13 5.570000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.750000000000000e-13 8.620000000000000e-12 -2.550000000000000e-12 8.379999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.710000000000000e+02 6.805580930180705e-01 -7.074728434466908e-01 -1.852799895977349e-01 -4.465627915226250e-02 3.970000000000000e-12 3.710000000000000e-12 2.760000000000000e-13 5.570000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.740000000000000e-13 8.620000000000000e-12 -2.550000000000000e-12 8.379999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.720000000000000e+02 6.805599950109590e-01 -7.074790398085944e-01 -1.852482599890111e-01 -4.466076122545080e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.730000000000000e+02 6.805618976158928e-01 -7.074852356854846e-01 -1.852165248061569e-01 -4.466524083938010e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.740000000000000e+02 6.805638008983755e-01 -7.074914310263259e-01 -1.851847839909751e-01 -4.466971803463320e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.750000000000000e+02 6.805657048604445e-01 -7.074976258316985e-01 -1.851530375346965e-01 -4.467419279619480e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.760000000000000e+02 6.805676094409745e-01 -7.075038201451924e-01 -1.851212854973860e-01 -4.467866510485430e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.770000000000000e+02 6.805695146960570e-01 -7.075100139253930e-01 -1.850895278235674e-01 -4.468313498080430e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.780000000000000e+02 6.805714206288039e-01 -7.075162071671730e-01 -1.850577645149062e-01 -4.468760243977380e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.790000000000000e+02 6.805733271728232e-01 -7.075223999221897e-01 -1.850259956267711e-01 -4.469206743462320e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.800000000000000e+02 6.805752344004763e-01 -7.075285921339283e-01 -1.849942210953318e-01 -4.469653001128730e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.810000000000000e+02 6.805771422928842e-01 -7.075347838166015e-01 -1.849624409360073e-01 -4.470099015726920e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.820000000000000e+02 6.805790508025281e-01 -7.075409750044676e-01 -1.849306551942538e-01 -4.470544785461200e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.830000000000000e+02 6.805809600136632e-01 -7.075471656352235e-01 -1.848988637878261e-01 -4.470990313580800e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.840000000000000e+02 6.805828698307244e-01 -7.075533557795428e-01 -1.848670668058809e-01 -4.471435595726460e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.850000000000000e+02 6.805847803251571e-01 -7.075595453812051e-01 -1.848352641863081e-01 -4.471880636687220e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.860000000000000e+02 6.805866914915339e-01 -7.075657344467025e-01 -1.848034559265214e-01 -4.472325434402590e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.870000000000000e+02 6.805886032718196e-01 -7.075719230181050e-01 -1.847716420819424e-01 -4.472769986616110e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.880000000000000e+02 6.805905157254911e-01 -7.075781110492009e-01 -1.847398225991315e-01 -4.473214296896920e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.890000000000000e+02 6.805924288515512e-01 -7.075842985409305e-01 -1.847079974765933e-01 -4.473658364775430e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.900000000000000e+02 6.805943425824637e-01 -7.075904855427991e-01 -1.846761667778728e-01 -4.474102187345890e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.910000000000000e+02 6.805962569908148e-01 -7.075966720003660e-01 -1.846443304335873e-01 -4.474545767819880e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.920000000000000e+02 6.805981720717642e-01 -7.076028579155387e-01 -1.846124884502809e-01 -4.474989106724630e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.930000000000000e+02 6.806000877625229e-01 -7.076090433376953e-01 -1.845806408790939e-01 -4.475432199264100e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.940000000000000e+02 6.806020041191391e-01 -7.076152282208984e-01 -1.845487876750901e-01 -4.475875050257690e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.950000000000000e+02 6.806039211508469e-01 -7.076214125592438e-01 -1.845169288253257e-01 -4.476317659217400e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.960000000000000e+02 6.806058387904138e-01 -7.076275964027753e-01 -1.844850643913227e-01 -4.476760022782080e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.970000000000000e+02 6.806077571168555e-01 -7.076337796911591e-01 -1.844531943001218e-01 -4.477202145144800e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.980000000000000e+02 6.806096760592454e-01 -7.076399624771855e-01 -1.844213186167506e-01 -4.477644022782020e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.990000000000000e+02 6.806115956594206e-01 -7.076461447277239e-01 -1.843894373044297e-01 -4.478085658495750e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.000000000000000e+02 6.806135159379672e-01 -7.076523264299429e-01 -1.843575503359406e-01 -4.478527051363270e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.010000000000000e+02 6.806154368222731e-01 -7.076585076337463e-01 -1.843256577876024e-01 -4.478968200348310e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.020000000000000e+02 6.806173583647662e-01 -7.076646883011479e-01 -1.842937596055554e-01 -4.479409106853670e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.030000000000000e+02 6.806192805904152e-01 -7.076708684137979e-01 -1.842618557637039e-01 -4.479849771546850e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.040000000000000e+02 6.806212034085927e-01 -7.076770480368718e-01 -1.842299463510489e-01 -4.480290191436160e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.050000000000000e+02 6.806231269015282e-01 -7.076832271106166e-01 -1.841980312846037e-01 -4.480730368998010e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.060000000000000e+02 6.806250510583440e-01 -7.076894056399192e-01 -1.841661105801514e-01 -4.481170305426870e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.070000000000000e+02 6.806269758190756e-01 -7.076955836709498e-01 -1.841341842888569e-01 -4.481609996742830e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.080000000000000e+02 6.806289012665798e-01 -7.077017611404951e-01 -1.841022523340594e-01 -4.482049447313670e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.090000000000000e+02 6.806308273162907e-01 -7.077079381122506e-01 -1.840703147920051e-01 -4.482488652546510e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.100000000000000e+02 6.806327540363198e-01 -7.077141145331748e-01 -1.840383716018563e-01 -4.482927616631790e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.110000000000000e+02 6.806346814199060e-01 -7.077202904088615e-01 -1.840064227667008e-01 -4.483366338614220e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.120000000000000e+02 6.806366094029825e-01 -7.077264657851488e-01 -1.839744683495275e-01 -4.483804816428820e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.130000000000000e+02 6.806385380508827e-01 -7.077326406136876e-01 -1.839425082859625e-01 -4.484243052514650e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.140000000000000e+02 6.806404673640545e-01 -7.077388148939621e-01 -1.839105425740186e-01 -4.484681046698540e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.150000000000000e+02 6.806423972815441e-01 -7.077449886695021e-01 -1.838785712737441e-01 -4.485118797050810e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.160000000000000e+02 6.806443278510637e-01 -7.077511619073037e-01 -1.838465943321854e-01 -4.485556303840600e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.170000000000000e+02 6.806462591012522e-01 -7.077573345810102e-01 -1.838146117320522e-01 -4.485993571161200e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.180000000000000e+02 6.806481909370581e-01 -7.077635067643873e-01 -1.837826235543106e-01 -4.486430592555760e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.190000000000000e+02 6.806501234388842e-01 -7.077696783941123e-01 -1.837506297290610e-01 -4.486867373457920e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.200000000000000e+02 6.806520566020791e-01 -7.077758494757149e-01 -1.837186302538764e-01 -4.487303912072410e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.210000000000000e+02 6.806539903682228e-01 -7.077820200497232e-01 -1.836866251890621e-01 -4.487740207277580e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.220000000000000e+02 6.806559248125247e-01 -7.077881900623336e-01 -1.836546144563401e-01 -4.488176260783480e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.230000000000000e+02 6.806578598589749e-01 -7.077943595667765e-01 -1.836225981335875e-01 -4.488612070928050e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.240000000000000e+02 6.806597955590322e-01 -7.078005285257449e-01 -1.835905761677870e-01 -4.489047639079790e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.250000000000000e+02 6.806617319248200e-01 -7.078066969292897e-01 -1.835585485476301e-01 -4.489482966044730e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.260000000000000e+02 6.806636688880379e-01 -7.078128648275482e-01 -1.835265153375409e-01 -4.489918048866720e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.270000000000000e+02 6.806656065089071e-01 -7.078190321759418e-01 -1.834944764779350e-01 -4.490352889766620e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.280000000000000e+02 6.806675447893018e-01 -7.078251989702612e-01 -1.834624319716208e-01 -4.490787490265400e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.290000000000000e+02 6.806694836636518e-01 -7.078313652608742e-01 -1.834303818751729e-01 -4.491221846127150e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.300000000000000e+02 6.806714232012057e-01 -7.078375309957319e-01 -1.833983261221829e-01 -4.491655960437200e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.310000000000000e+02 6.806733633934785e-01 -7.078436961779525e-01 -1.833662647261695e-01 -4.492089834494080e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.320000000000000e+02 6.806753041752375e-01 -7.078498608591596e-01 -1.833341977398859e-01 -4.492523463142980e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.330000000000000e+02 6.806772456449776e-01 -7.078560249621955e-01 -1.833021250769521e-01 -4.492956852853420e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.340000000000000e+02 6.806791876994079e-01 -7.078621885658611e-01 -1.832700468288954e-01 -4.493389997494180e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.350000000000000e+02 6.806811304222570e-01 -7.078683516062020e-01 -1.832379629181729e-01 -4.493822901489690e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.360000000000000e+02 6.806830737898589e-01 -7.078745140998804e-01 -1.832058733674463e-01 -4.494255564071590e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.370000000000000e+02 6.806850177579234e-01 -7.078806760791975e-01 -1.831737782183893e-01 -4.494687983335490e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.380000000000000e+02 6.806869623766859e-01 -7.078868375069791e-01 -1.831416774208552e-01 -4.495120161067370e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.390000000000000e+02 6.806889076540393e-01 -7.078929983764155e-01 -1.831095709675389e-01 -4.495552097888330e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.400000000000000e+02 6.806908535227985e-01 -7.078991587375911e-01 -1.830774589201096e-01 -4.495983790418430e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.410000000000000e+02 6.806928000382613e-01 -7.079053185469351e-01 -1.830453412297512e-01 -4.496415242299260e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.420000000000000e+02 6.806947472238813e-01 -7.079114777879364e-01 -1.830132178699826e-01 -4.496846453672560e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.430000000000000e+02 6.806966949806493e-01 -7.079176365332347e-01 -1.829810889353541e-01 -4.497277420453460e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.440000000000000e+02 6.806986434112186e-01 -7.079237947058986e-01 -1.829489543276551e-01 -4.497708147207000e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.450000000000000e+02 6.807005924796364e-01 -7.079299523317365e-01 -1.829168140812343e-01 -4.498138632621690e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.460000000000000e+02 6.807025421428867e-01 -7.079361094432369e-01 -1.828846682339453e-01 -4.498568874147190e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.470000000000000e+02 6.807044924778166e-01 -7.079422659811857e-01 -1.828525167154901e-01 -4.498998876143240e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.480000000000000e+02 6.807064434050233e-01 -7.079484220043960e-01 -1.828203596000608e-01 -4.499428634920480e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.490000000000000e+02 6.807083949744324e-01 -7.079545774770304e-01 -1.827881968351337e-01 -4.499858151555730e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.500000000000000e+02 6.807103472083096e-01 -7.079607323793300e-01 -1.827560284050028e-01 -4.500287428703820e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.510000000000000e+02 6.807123000235670e-01 -7.079668867743577e-01 -1.827238543838677e-01 -4.500716461578460e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.520000000000000e+02 6.807142534872245e-01 -7.079730406109251e-01 -1.826916747090908e-01 -4.501145253643870e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.530000000000000e+02 6.807162076071777e-01 -7.079791938822150e-01 -1.826594893733536e-01 -4.501573805522380e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.540000000000000e+02 6.807181623060411e-01 -7.079853466455538e-01 -1.826272984489629e-01 -4.502002113610010e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.550000000000000e+02 6.807201176632410e-01 -7.079914988416366e-01 -1.825951018588372e-01 -4.502430181221130e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.560000000000000e+02 6.807220736585090e-01 -7.079976504838594e-01 -1.825628996241920e-01 -4.502858008200500e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.570000000000000e+02 6.807240302473074e-01 -7.080038016054792e-01 -1.825306917852352e-01 -4.503285592160440e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.580000000000000e+02 6.807259875027123e-01 -7.080099521519357e-01 -1.824984782708074e-01 -4.503712936134690e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.590000000000000e+02 6.807279453417535e-01 -7.080161021847218e-01 -1.824662591585503e-01 -4.504140036269920e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.600000000000000e+02 6.807299038336975e-01 -7.080222516494622e-01 -1.824340343871619e-01 -4.504566897066450e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.610000000000000e+02 6.807318629667408e-01 -7.080284005573719e-01 -1.824018039601574e-01 -4.504993516177940e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.620000000000000e+02 6.807338226858302e-01 -7.080345489457980e-01 -1.823695679365381e-01 -4.505419893081690e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.630000000000000e+02 6.807357830503799e-01 -7.080406967725612e-01 -1.823373262529522e-01 -4.505846028812930e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.640000000000000e+02 6.807377440639806e-01 -7.080468440329223e-01 -1.823050789088007e-01 -4.506271924503720e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.650000000000000e+02 6.807397056552275e-01 -7.080529907790288e-01 -1.822728259725109e-01 -4.506697577275010e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.660000000000000e+02 6.807416678960652e-01 -7.080591369593643e-01 -1.822405673687968e-01 -4.507122988717470e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.670000000000000e+02 6.807436307805834e-01 -7.080652825740191e-01 -1.822083031113624e-01 -4.507548160941980e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.680000000000000e+02 6.807455942449967e-01 -7.080714276724660e-01 -1.821760332543794e-01 -4.507973089539750e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.690000000000000e+02 6.807475583582121e-01 -7.080775722013274e-01 -1.821437577350872e-01 -4.508397778533580e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.700000000000000e+02 6.807495231100620e-01 -7.080837161698509e-01 -1.821114765572078e-01 -4.508822226114910e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.710000000000000e+02 6.807514884451850e-01 -7.080898596163767e-01 -1.820791897783101e-01 -4.509246431277890e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.720000000000000e+02 6.807534544423335e-01 -7.080960024832067e-01 -1.820468973191290e-01 -4.509670396615490e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.730000000000000e+02 6.807554210228176e-01 -7.081021448260580e-01 -1.820145992594473e-01 -4.510094120088160e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.740000000000000e+02 6.807573882392532e-01 -7.081082866081659e-01 -1.819822955414662e-01 -4.510517602201180e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.750000000000000e+02 6.807593561051585e-01 -7.081144278162731e-01 -1.819499861577594e-01 -4.510940845226630e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.760000000000000e+02 6.807613245471359e-01 -7.081205685059022e-01 -1.819176711743164e-01 -4.511363845025670e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.770000000000000e+02 6.807632936272958e-01 -7.081267086294700e-01 -1.818853505330568e-01 -4.511786604857500e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.780000000000000e+02 6.807652633546568e-01 -7.081328481796877e-01 -1.818530242246962e-01 -4.512209125162740e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.790000000000000e+02 6.807672336486459e-01 -7.081389872181768e-01 -1.818206923203216e-01 -4.512631401016290e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.800000000000000e+02 6.807692045960232e-01 -7.081451256763670e-01 -1.817883547444964e-01 -4.513053438404330e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.810000000000000e+02 6.807711761716351e-01 -7.081512635742973e-01 -1.817560115161019e-01 -4.513475235086060e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.820000000000000e+02 6.807731483341586e-01 -7.081574009417341e-01 -1.817236626749872e-01 -4.513896789508200e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.830000000000000e+02 6.807751211464188e-01 -7.081635377313235e-01 -1.816913081605091e-01 -4.514318104496230e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.840000000000000e+02 6.807770945415387e-01 -7.081696739929957e-01 -1.816589480342367e-01 -4.514739176662900e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.850000000000000e+02 6.807790685731693e-01 -7.081758096847086e-01 -1.816265822478663e-01 -4.515160009362310e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.860000000000000e+02 6.807810432430113e-01 -7.081819448049966e-01 -1.815942107982048e-01 -4.515580602477600e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.870000000000000e+02 6.807830184844125e-01 -7.081880794028822e-01 -1.815618337483745e-01 -4.516000953096380e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.880000000000000e+02 6.807849943642746e-01 -7.081942134298039e-01 -1.815294510295447e-01 -4.516421063063060e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.890000000000000e+02 6.807869708857051e-01 -7.082003468802595e-01 -1.814970626441921e-01 -4.516840934189250e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.900000000000000e+02 6.807889479711839e-01 -7.082064798128702e-01 -1.814646686623046e-01 -4.517260562145490e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.910000000000000e+02 6.807909257043773e-01 -7.082126121643321e-01 -1.814322690043164e-01 -4.517679950921920e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.920000000000000e+02 6.807929040608919e-01 -7.082187439530008e-01 -1.813998636910308e-01 -4.518099099009130e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.930000000000000e+02 6.807948829980202e-01 -7.082248752089418e-01 -1.813674527653983e-01 -4.518518005255610e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.940000000000000e+02 6.807968625706520e-01 -7.082310058895476e-01 -1.813350361770212e-01 -4.518936672841060e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.950000000000000e+02 6.807988427745676e-01 -7.082371360007492e-01 -1.813026139213409e-01 -4.519355099519470e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.960000000000000e+02 6.808008235496430e-01 -7.082432655837332e-01 -1.812701860623031e-01 -4.519773284530540e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.970000000000000e+02 6.808028049778222e-01 -7.082493945776093e-01 -1.812377525192185e-01 -4.520191231089780e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.980000000000000e+02 6.808047869844066e-01 -7.082555230385364e-01 -1.812053133603006e-01 -4.520608935222300e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.990000000000000e+02 6.808067696151456e-01 -7.082616509318331e-01 -1.811728685412241e-01 -4.521026399003330e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.000000000000000e+02 6.808087528808324e-01 -7.082677782470129e-01 -1.811404180553752e-01 -4.521443624120280e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.010000000000000e+02 6.808107367189448e-01 -7.082739050315358e-01 -1.811079619584937e-01 -4.521860606904870e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.020000000000000e+02 6.808127211848252e-01 -7.082800312431887e-01 -1.810755001979677e-01 -4.522277350093610e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.030000000000000e+02 6.808147062875297e-01 -7.082861568746440e-01 -1.810430327644590e-01 -4.522693854130610e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.040000000000000e+02 6.808166919547797e-01 -7.082922819791505e-01 -1.810105597265315e-01 -4.523110115844970e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.050000000000000e+02 6.808186782542116e-01 -7.082984065056950e-01 -1.809780810189561e-01 -4.523526138288520e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.060000000000000e+02 6.808206651833549e-01 -7.083045304551714e-01 -1.809455966442655e-01 -4.523941921625540e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.070000000000000e+02 6.808226526815658e-01 -7.083106538736483e-01 -1.809131066564336e-01 -4.524357462268660e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.080000000000000e+02 6.808246408266715e-01 -7.083167766999217e-01 -1.808806109865182e-01 -4.524772765356300e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.090000000000000e+02 6.808266295396548e-01 -7.083228989952568e-01 -1.808481097025336e-01 -4.525187825548610e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.100000000000000e+02 6.808286188842521e-01 -7.083290207093024e-01 -1.808156027482012e-01 -4.525602647125950e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.110000000000000e+02 6.808306088556996e-01 -7.083351418457807e-01 -1.807830901256167e-01 -4.526017229450540e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.120000000000000e+02 6.808325993906527e-01 -7.083412624509203e-01 -1.807505718957297e-01 -4.526431569978880e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.130000000000000e+02 6.808345905564706e-01 -7.083473824753863e-01 -1.807180479900354e-01 -4.526845670821170e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.140000000000000e+02 6.808365823478467e-01 -7.083535019206981e-01 -1.806855184172763e-01 -4.527259532948540e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.150000000000000e+02 6.808385747024017e-01 -7.083596208327423e-01 -1.806529832366167e-01 -4.527673153625900e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.160000000000000e+02 6.808405676861033e-01 -7.083657391632148e-01 -1.806204423808666e-01 -4.528086534902890e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.170000000000000e+02 6.808425612949469e-01 -7.083718569141539e-01 -1.805878958540248e-01 -4.528499676875270e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.180000000000000e+02 6.808445554663316e-01 -7.083779741301267e-01 -1.805553437189790e-01 -4.528912577730150e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.190000000000000e+02 6.808465502650366e-01 -7.083840907651980e-01 -1.805227859061624e-01 -4.529325238532250e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.200000000000000e+02 6.808485456872755e-01 -7.083902068182659e-01 -1.804902224263644e-01 -4.529737661253660e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.210000000000000e+02 6.808505416740982e-01 -7.083963223345281e-01 -1.804576533311229e-01 -4.530149842143130e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.220000000000000e+02 6.808525383000187e-01 -7.084024372581978e-01 -1.804250785475814e-01 -4.530561784332790e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.230000000000000e+02 6.808545354967350e-01 -7.084085516369897e-01 -1.803924981467175e-01 -4.530973486453200e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.240000000000000e+02 6.808565333097875e-01 -7.084146654400594e-01 -1.803599120755737e-01 -4.531384948245440e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.250000000000000e+02 6.808585317482313e-01 -7.084207786567212e-01 -1.803273203326689e-01 -4.531796172255330e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.260000000000000e+02 6.808605307461827e-01 -7.084268913377275e-01 -1.802947229753115e-01 -4.532207154186230e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.270000000000000e+02 6.808625303655046e-01 -7.084330034355817e-01 -1.802621199454352e-01 -4.532617897309750e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.280000000000000e+02 6.808645306111482e-01 -7.084391149463797e-01 -1.802295112367289e-01 -4.533028401655080e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.290000000000000e+02 6.808665314136469e-01 -7.084452259209501e-01 -1.801968969160628e-01 -4.533438664397530e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.300000000000000e+02 6.808685328387164e-01 -7.084513363089135e-01 -1.801642769216742e-01 -4.533848688982390e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.310000000000000e+02 6.808705348799348e-01 -7.084574461156008e-01 -1.801316512563733e-01 -4.534258474463640e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.320000000000000e+02 6.808725374849748e-01 -7.084635553786779e-01 -1.800990199715337e-01 -4.534668019014930e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.330000000000000e+02 6.808745407264242e-01 -7.084696640445132e-01 -1.800663829943334e-01 -4.535077325221610e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.340000000000000e+02 6.808765445274881e-01 -7.084757721686717e-01 -1.800337404004194e-01 -4.535486390395650e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.350000000000000e+02 6.808785489501280e-01 -7.084818797050537e-01 -1.800010921280964e-01 -4.535895216883330e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.360000000000000e+02 6.808805539885986e-01 -7.084879866566256e-01 -1.799684381839022e-01 -4.536303804935630e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.370000000000000e+02 6.808825595851908e-01 -7.084940930654516e-01 -1.799357786234989e-01 -4.536712152250130e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.380000000000000e+02 6.808845657958876e-01 -7.085001988895191e-01 -1.799031133917713e-01 -4.537120261140240e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.390000000000000e+02 6.808865726322215e-01 -7.085063041218627e-01 -1.798704424717370e-01 -4.537528130763220e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.400000000000000e+02 6.808885800162574e-01 -7.085124088174284e-01 -1.798377659436623e-01 -4.537935759310230e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.410000000000000e+02 6.808905880228995e-01 -7.085185129211795e-01 -1.798050837316965e-01 -4.538343149243010e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.420000000000000e+02 6.808925966404363e-01 -7.085246164397966e-01 -1.797723958498352e-01 -4.538750301011960e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.430000000000000e+02 6.808946058156794e-01 -7.085307194127197e-01 -1.797397023476891e-01 -4.539157212047940e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.440000000000000e+02 6.808966156077765e-01 -7.085368217959314e-01 -1.797070031662165e-01 -4.539563884575310e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.450000000000000e+02 6.808986260138759e-01 -7.085429235909795e-01 -1.796742983074390e-01 -4.539970318507640e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.460000000000000e+02 6.809006369722996e-01 -7.085490248429075e-01 -1.796415878308517e-01 -4.540376511360940e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.470000000000000e+02 6.809026485667781e-01 -7.085551254882401e-01 -1.796088716563944e-01 -4.540782467161120e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.480000000000000e+02 6.809046607166711e-01 -7.085612255861896e-01 -1.795761498617157e-01 -4.541188182573490e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.490000000000000e+02 6.809066734762103e-01 -7.085673250978856e-01 -1.795434223889629e-01 -4.541593658670240e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.500000000000000e+02 6.809086868482833e-01 -7.085734240172480e-01 -1.795106892425292e-01 -4.541998897723170e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.510000000000000e+02 6.809107007753857e-01 -7.085795223902923e-01 -1.794779504683220e-01 -4.542403894865620e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.520000000000000e+02 6.809127153146730e-01 -7.085856201711339e-01 -1.794452060170373e-01 -4.542808654336990e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.530000000000000e+02 6.809147304700425e-01 -7.085917173566478e-01 -1.794124558833610e-01 -4.543213176120150e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.540000000000000e+02 6.809167461612653e-01 -7.085978140072384e-01 -1.793797001410882e-01 -4.543617455961240e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.550000000000000e+02 6.809187624832950e-01 -7.086039100509950e-01 -1.793469386994671e-01 -4.544021498396970e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.560000000000000e+02 6.809207794036682e-01 -7.086100055097396e-01 -1.793141715932427e-01 -4.544425303178730e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.570000000000000e+02 6.809227968779552e-01 -7.086161004178703e-01 -1.792813988601950e-01 -4.544828867191410e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.580000000000000e+02 6.809248149786700e-01 -7.086221947206348e-01 -1.792486204300674e-01 -4.545232193730730e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.590000000000000e+02 6.809268336361344e-01 -7.086282884690779e-01 -1.792158363700675e-01 -4.545635279947880e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.600000000000000e+02 6.809288528965587e-01 -7.086343816288192e-01 -1.791830466334801e-01 -4.546038127492950e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.610000000000000e+02 6.809308727638658e-01 -7.086404741944884e-01 -1.791502512202048e-01 -4.546440737751010e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.620000000000000e+02 6.809328931891661e-01 -7.086465662034507e-01 -1.791174501731815e-01 -4.546843107638470e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.630000000000000e+02 6.809349142121880e-01 -7.086526576250545e-01 -1.790846434545153e-01 -4.547245239215630e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.640000000000000e+02 6.809369358509707e-01 -7.086587484448578e-01 -1.790518310470846e-01 -4.547647133568360e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.650000000000000e+02 6.809389580280220e-01 -7.086648387212425e-01 -1.790190130221216e-01 -4.548048786559470e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.660000000000000e+02 6.809409808169218e-01 -7.086709283971335e-01 -1.789861893119021e-01 -4.548450202472730e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.670000000000000e+02 6.809430042157032e-01 -7.086770174745259e-01 -1.789533599149803e-01 -4.548851380560880e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.680000000000000e+02 6.809450281540091e-01 -7.086831060049913e-01 -1.789205248992581e-01 -4.549252317939930e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.690000000000000e+02 6.809470526996855e-01 -7.086891939372164e-01 -1.788876841989991e-01 -4.549653017703370e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.700000000000000e+02 6.809490778541782e-01 -7.086952812695326e-01 -1.788548378121055e-01 -4.550053479957960e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.710000000000000e+02 6.809511035558852e-01 -7.087013680477118e-01 -1.788219857963538e-01 -4.550453701745240e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.720000000000000e+02 6.809531298739107e-01 -7.087074542187775e-01 -1.787891280864303e-01 -4.550853686681940e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.730000000000000e+02 6.809551567347115e-01 -7.087135398378043e-01 -1.787562647506948e-01 -4.551253431037690e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.740000000000000e+02 6.809571842084384e-01 -7.087196248498925e-01 -1.787233957255401e-01 -4.551652939180000e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.750000000000000e+02 6.809592122855965e-01 -7.087257092648864e-01 -1.786905210115027e-01 -4.552052208621420e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.760000000000000e+02 6.809612408943675e-01 -7.087317931328768e-01 -1.786576406840331e-01 -4.552451238042590e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.770000000000000e+02 6.809632701153938e-01 -7.087378763948103e-01 -1.786247546607199e-01 -4.552850029950050e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.780000000000000e+02 6.809652999391334e-01 -7.087439590557560e-01 -1.785918629534919e-01 -4.553248584889750e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.790000000000000e+02 6.809673302969796e-01 -7.087500411674791e-01 -1.785589656251333e-01 -4.553646899116820e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.800000000000000e+02 6.809693612624313e-01 -7.087561226736718e-01 -1.785260626061762e-01 -4.554044976452320e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.810000000000000e+02 6.809713928294867e-01 -7.087622035793449e-01 -1.784931538990471e-01 -4.554442815966870e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.820000000000000e+02 6.809734249366683e-01 -7.087682839290854e-01 -1.784602395640665e-01 -4.554840415403300e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.830000000000000e+02 6.809754576576139e-01 -7.087743636668711e-01 -1.784273195306426e-01 -4.555237778355030e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.840000000000000e+02 6.809774909284921e-01 -7.087804428394224e-01 -1.783943938604884e-01 -4.555634902224500e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.850000000000000e+02 6.809795247865806e-01 -7.087865214201099e-01 -1.783614625127611e-01 -4.556031787566800e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.860000000000000e+02 6.809815592580190e-01 -7.087925993873060e-01 -1.783285254651504e-01 -4.556428436537280e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.870000000000000e+02 6.809835942614045e-01 -7.087986768016250e-01 -1.782955827945016e-01 -4.556824845276870e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.880000000000000e+02 6.809856298581493e-01 -7.088047536168951e-01 -1.782626344402904e-01 -4.557221016364830e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.890000000000000e+02 6.809876660630629e-01 -7.088108298203344e-01 -1.782296803902026e-01 -4.557616951212150e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.900000000000000e+02 6.809897027959312e-01 -7.088169054724142e-01 -1.781967207182155e-01 -4.558012645544500e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.910000000000000e+02 6.809917401362764e-01 -7.088229805134013e-01 -1.781637553464046e-01 -4.558408102760380e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.920000000000000e+02 6.809937780645423e-01 -7.088290549558639e-01 -1.781307842963182e-01 -4.558803322952690e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.930000000000000e+02 6.809958165329454e-01 -7.088351288356377e-01 -1.780978076116843e-01 -4.559198303543690e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.940000000000000e+02 6.809978555933653e-01 -7.088412021129333e-01 -1.780648252428481e-01 -4.559593047151980e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.950000000000000e+02 6.809998952571137e-01 -7.088472747786925e-01 -1.780318371782307e-01 -4.559987554330640e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.960000000000000e+02 6.810019354521004e-01 -7.088533468876873e-01 -1.779988434831693e-01 -4.560381820935310e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.970000000000000e+02 6.810039762578107e-01 -7.088594183787453e-01 -1.779658440831257e-01 -4.560775851298640e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.980000000000000e+02 6.810060176050697e-01 -7.088654893026132e-01 -1.779328390450043e-01 -4.561169642575130e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.990000000000000e+02 6.810080595429023e-01 -7.088715596219997e-01 -1.778998283210010e-01 -4.561563197022770e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.000000000000000e+02 6.810101020781255e-01 -7.088776293319464e-01 -1.778668119021065e-01 -4.561956514524570e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.010000000000000e+02 6.810121451376883e-01 -7.088836984861102e-01 -1.778337898589654e-01 -4.562349592057990e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.020000000000000e+02 6.810141887990662e-01 -7.088897670266296e-01 -1.778007621146855e-01 -4.562742432701820e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.030000000000000e+02 6.810162330521961e-01 -7.088958349582328e-01 -1.777677286834468e-01 -4.563135037444490e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.040000000000000e+02 6.810182778329679e-01 -7.089019023312081e-01 -1.777346896194735e-01 -4.563527401563940e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.050000000000000e+02 6.810203232075799e-01 -7.089079690920732e-01 -1.777016448662802e-01 -4.563919530200060e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.060000000000000e+02 6.810223691734331e-01 -7.089140352458700e-01 -1.776685944169317e-01 -4.564311420941110e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.070000000000000e+02 6.810244156743013e-01 -7.089201008310853e-01 -1.776355383320309e-01 -4.564703073158420e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.080000000000000e+02 6.810264627770446e-01 -7.089261657985555e-01 -1.776024765430099e-01 -4.565094488984420e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.090000000000000e+02 6.810285104226231e-01 -7.089322301918273e-01 -1.775694091062104e-01 -4.565485665793490e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.100000000000000e+02 6.810305586443592e-01 -7.089382939842455e-01 -1.775363359914986e-01 -4.565876605837320e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.110000000000000e+02 6.810326074653478e-01 -7.089443571590238e-01 -1.775032571733386e-01 -4.566267309503310e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.120000000000000e+02 6.810346568094643e-01 -7.089504197721435e-01 -1.774701727253826e-01 -4.566657773623850e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.130000000000000e+02 6.810367067459103e-01 -7.089564817711747e-01 -1.774370825803762e-01 -4.567048001376540e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.140000000000000e+02 6.810387572721706e-01 -7.089625431570388e-01 -1.774039867408901e-01 -4.567437992923030e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.150000000000000e+02 6.810408083217846e-01 -7.089686039806952e-01 -1.773708852660710e-01 -4.567827744130390e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.160000000000000e+02 6.810428599569692e-01 -7.089746641919925e-01 -1.773377781023370e-01 -4.568217259730110e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.170000000000000e+02 6.810449121886879e-01 -7.089807237832272e-01 -1.773046652358094e-01 -4.568606539560540e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.180000000000000e+02 6.810469649423324e-01 -7.089867828114678e-01 -1.772715467334860e-01 -4.568995579117810e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.190000000000000e+02 6.810490182762355e-01 -7.089928412309413e-01 -1.772384225420232e-01 -4.569384382024000e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.200000000000000e+02 6.810510722065449e-01 -7.089988990271111e-01 -1.772052926495194e-01 -4.569772950222150e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.210000000000000e+02 6.810531266556628e-01 -7.090049562603973e-01 -1.771721571232530e-01 -4.570161278370090e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.220000000000000e+02 6.810551817101914e-01 -7.090110128638626e-01 -1.771390158825626e-01 -4.570549371372280e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.230000000000000e+02 6.810572372911720e-01 -7.090170688967409e-01 -1.771058690012700e-01 -4.570937225225740e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.240000000000000e+02 6.810592934599027e-01 -7.090231243124995e-01 -1.770727164196713e-01 -4.571324842754930e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.250000000000000e+02 6.810613502063598e-01 -7.090291791176860e-01 -1.770395581475625e-01 -4.571712223780550e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.260000000000000e+02 6.810634074798574e-01 -7.090352333492478e-01 -1.770063942341844e-01 -4.572099366282570e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.270000000000000e+02 6.810654653331903e-01 -7.090412869666515e-01 -1.769732246288753e-01 -4.572486272934330e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.280000000000000e+02 6.810675237761251e-01 -7.090473399641873e-01 -1.769400493162878e-01 -4.572872942819650e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.290000000000000e+02 6.810695827351571e-01 -7.090533923940712e-01 -1.769068683719928e-01 -4.573259374049080e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.300000000000000e+02 6.810716422795037e-01 -7.090594442041902e-01 -1.768736817277645e-01 -4.573645569576060e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.310000000000000e+02 6.810737024046939e-01 -7.090654953984015e-01 -1.768404893845741e-01 -4.574031528538560e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.320000000000000e+02 6.810757630529478e-01 -7.090715460186111e-01 -1.768072913993834e-01 -4.574417248825620e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.330000000000000e+02 6.810778242969725e-01 -7.090775960093723e-01 -1.767740877022290e-01 -4.574802734016340e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.340000000000000e+02 6.810798860660643e-01 -7.090836454226515e-01 -1.767408783616552e-01 -4.575187981177660e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.350000000000000e+02 6.810819484087633e-01 -7.090896942229294e-01 -1.767076633267141e-01 -4.575572991624150e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.360000000000000e+02 6.810840113444374e-01 -7.090957423950847e-01 -1.766744425780280e-01 -4.575957766279200e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.370000000000000e+02 6.810860747875246e-01 -7.091017900007616e-01 -1.766412162019485e-01 -4.576342302466930e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.380000000000000e+02 6.810881388119088e-01 -7.091078369854313e-01 -1.766079841231059e-01 -4.576726602656120e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.390000000000000e+02 6.810902034157582e-01 -7.091138833487657e-01 -1.765747463451501e-01 -4.577110667506850e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.400000000000000e+02 6.810922685419595e-01 -7.091199291347565e-01 -1.765415029183413e-01 -4.577494493299320e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t</ATTLISTList>\n\t</ATT>\n\t<TIL>monkey</TIL>\n\t<GEO>\n\t\t<EFFECTIVETIME>1959-09-18T00:00:00.000000Z</EFFECTIVETIME>\n\t\t<MODELGENERATIONTIME>1959-12-16T00:00:00.000000Z</MODELGENERATIONTIME>\n\t\t<SATID>Imaginary1</SATID>\n\t\t<PRINCIPAL_DISTANCE>\n\t\t\t<GENERATIONTIME>1959-12-05T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<PD>7.949165000000000e+03</PD>\n\t\t</PRINCIPAL_DISTANCE>\n\t\t<OPTICAL_DISTORTION>\n\t\t\t<GENERATIONTIME>1958-01-01T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<POLYORDER>0</POLYORDER>\n\t\t\t<ALIST>0.000000000000000e+00</ALIST>\n\t\t\t<BLIST>0.000000000000000e+00</BLIST>\n\t\t</OPTICAL_DISTORTION>\n\t\t<PERSPECTIVE_CENTER>\n\t\t\t<GENERATIONTIME>1958-01-01T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<CX>0.000000000000000e+00</CX>\n\t\t\t<CY>0.000000000000000e+00</CY>\n\t\t\t<CZ>0.000000000000000e+00</CZ>\n\t\t</PERSPECTIVE_CENTER>\n\t\t<CAMERA_ATTITUDE>\n\t\t\t<GENERATIONTIME>1959-06-08T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<QCS1>0.000000000000000e+00</QCS1>\n\t\t\t<QCS2>0.000000000000000e+00</QCS2>\n\t\t\t<QCS3>0.000000000000000e+00</QCS3>\n\t\t\t<QCS4>1.000000000000000e+00</QCS4>\n\t\t</CAMERA_ATTITUDE>\n\t\t<DETECTOR_MOUNTING>\n\t\t\t<GENERATIONTIME>1959-12-16T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<BAND_P>\n\t\t\t\t<BANDID>P</BANDID>\n\t\t\t\t<DETECTOR_ARRAY>\n\t\t\t\t\t<DETARRID>1</DETARRID>\n\t\t\t\t\t<DETORIGINX>5.372000000000000e-02</DETORIGINX>\n\t\t\t\t\t<DETORIGINY>1.407119300000000e+02</DETORIGINY>\n\t\t\t\t\t<DETROTANGLE>0.000000000000000e+00</DETROTANGLE>\n\t\t\t\t\t<DETPITCH>8.000000000000000e-03</DETPITCH>\n\t\t\t\t</DETECTOR_ARRAY>\n\t\t\t</BAND_P>\n\t\t</DETECTOR_MOUNTING>\n\t</GEO>\n        \t<RPB>\n\t\t<SATID>IMAGINE01</SATID>\n\t\t<BANDID>P</BANDID>\n\t\t<SPECID>RPC00Y</SPECID>\n\t\t<IMAGE>\n\t\t\t<LINEOFFSET>11856</LINEOFFSET>\n\t\t\t<SAMPOFFSET>17564</SAMPOFFSET>\n\t\t\t<LATOFFSET>3.974540000000000e+01</LATOFFSET>\n\t\t\t<LONGOFFSET>-1.052903000000000e+02</LONGOFFSET>\n\t\t\t<HEIGHTOFFSET>2281</HEIGHTOFFSET>\n\t\t\t<LINESCALE>12384</LINESCALE>\n\t\t\t<SAMPSCALE>17927</SAMPSCALE>\n\t\t\t<LATSCALE>1.003000000000000e-01</LATSCALE>\n\t\t\t<LONGSCALE>1.345000000000000e-01</LONGSCALE>\n\t\t\t<HEIGHTSCALE>637</HEIGHTSCALE>\n\t\t\t<LINENUMCOEFList>\n\t\t\t\t<LINENUMCOEF>4.683662000000000e-03 2.746477000000000e-01 -1.231100000000000e+00 4.273921000000000e-02 1.234612000000000e-04 2.079892000000000e-05 2.803797000000000e-05 -1.625616000000000e-03 -3.580082000000000e-03 9.675819999999999e-06 -2.546898000000000e-06 2.437124000000000e-06 2.683441000000000e-05 2.832873000000000e-06 -1.765243000000000e-05 -6.187956999999999e-05 -1.335746000000000e-05 4.754263000000000e-07 8.598401000000000e-06 4.395393000000000e-06</LINENUMCOEF>\n\t\t\t</LINENUMCOEFList>\n\t\t\t<LINEDENCOEFList>\n\t\t\t\t<LINEDENCOEF>1.000000000000000e+00 -6.927463000000000e-04 1.374485000000000e-03 -1.832948000000000e-04 3.793725000000000e-05 -2.426451000000000e-06 5.328107000000000e-06 5.042993000000000e-06 -5.045604000000000e-05 1.005969000000000e-05 -1.014973000000000e-05 3.421277000000000e-06 2.035450000000000e-04 -8.247975000000000e-08 -4.562828000000000e-05 -3.053413000000000e-04 3.611736000000000e-07 1.162165000000000e-06 2.272529000000000e-05 -3.711560000000000e-08</LINEDENCOEF>\n\t\t\t</LINEDENCOEFList>\n\t\t\t<SAMPNUMCOEFList>\n\t\t\t\t<SAMPNUMCOEF>-7.306375000000000e-03 9.830429000000001e-01 3.542948000000000e-03 -1.894230000000000e-02 -6.090531000000000e-04 5.183200000000000e-04 -1.865072000000000e-04 7.436490000000000e-03 -6.180940000000000e-04 -7.676881000000001e-06 -4.251489000000000e-06 3.392046000000000e-05 7.682103000000000e-06 -3.827847000000000e-06 1.743396000000000e-05 -8.450706000000000e-05 -8.998127000000000e-07 7.975684000000000e-06 9.288044000000000e-06 -1.585929000000000e-06</SAMPNUMCOEF>\n\t\t\t</SAMPNUMCOEFList>\n\t\t\t<SAMPDENCOEFList>\n\t\t\t\t<SAMPDENCOEF>1.000000000000000e+00 -1.162718000000000e-04 6.204958000000000e-04 -6.463894000000000e-04 -1.800104000000000e-05 -3.829136000000000e-06 2.878440000000000e-06 1.192222000000000e-05 -1.355693000000000e-05 -5.064440000000000e-06 -4.852090000000000e-08 -4.637834000000000e-08 5.601284000000000e-07 2.741121000000000e-08 -8.104437000000000e-07 7.045655000000000e-07 0.000000000000000e+00 -5.420071000000000e-08 -5.402048000000000e-08 -1.211995000000000e-07</SAMPDENCOEF>\n\t\t\t</SAMPDENCOEFList>\n\t\t</IMAGE>\n\t</RPB>\n</isd>\n"
  },
  {
    "path": "src/asp/Sessions/tests/dg_example2.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<isd>\n\t<IMD>\n\t\t<BANDID>P</BANDID>\n\t\t<PANSHARPENALGORITHM>None</PANSHARPENALGORITHM>\n\t\t<NUMROWS>27576</NUMROWS>\n\t\t<NUMCOLUMNS>35170</NUMCOLUMNS>\n\t\t<PRODUCTLEVEL>Stereo 1B</PRODUCTLEVEL>\n\t\t<PRODUCTTYPE>Stereo</PRODUCTTYPE>\n\t\t<NUMBEROFLOOKS>2</NUMBEROFLOOKS>\n\t\t<RADIOMETRICLEVEL>Corrected</RADIOMETRICLEVEL>\n\t\t<BITSPERPIXEL>16</BITSPERPIXEL>\n\t\t<COMPRESSIONTYPE>None</COMPRESSIONTYPE>\n\t\t<OUTPUTFORMAT>GeoTIFF</OUTPUTFORMAT>\n\t\t<IMAGE>\n\t\t\t<SATID>Imaginary1</SATID>\n\t\t\t<MODE>FullSwath</MODE>\n\t\t\t<SCANDIRECTION>Forward</SCANDIRECTION>\n\t\t\t<TLCTIME>1432-11-25T17:40:29.834958Z</TLCTIME>\n\t\t\t<NUMTLC>2</NUMTLC>\n\t\t\t<TLCLISTList>\n\t\t\t\t<TLCLIST>0.000000000000000e+00 0.000000000000000e+00</TLCLIST>\n\t\t\t\t<TLCLIST>2.789200000000000e+04 2.324333000000000e+00</TLCLIST>\n\t\t\t</TLCLISTList>\n\t\t\t<FIRSTLINETIME>1432-11-25T17:40:29.834958Z</FIRSTLINETIME>\n\t\t\t<AVGLINERATE>1.200000000000000e+04</AVGLINERATE>\n\t\t\t<EXPOSUREDURATION>2.666670000000000e-03</EXPOSUREDURATION>\n\t\t\t<MINCOLLECTEDROWGSD>5.080000000000000e-01</MINCOLLECTEDROWGSD>\n\t\t\t<MAXCOLLECTEDROWGSD>5.080000000000000e-01</MAXCOLLECTEDROWGSD>\n\t\t\t<MEANCOLLECTEDROWGSD>5.080000000000000e-01</MEANCOLLECTEDROWGSD>\n\t\t\t<MINCOLLECTEDCOLGSD>5.240000000000000e-01</MINCOLLECTEDCOLGSD>\n\t\t\t<MAXCOLLECTEDCOLGSD>5.250000000000000e-01</MAXCOLLECTEDCOLGSD>\n\t\t\t<MEANCOLLECTEDCOLGSD>5.250000000000000e-01</MEANCOLLECTEDCOLGSD>\n\t\t\t<MEANCOLLECTEDGSD>5.160000000000000e-01</MEANCOLLECTEDGSD>\n\t\t\t<ROWUNCERTAINTY>1.600000000000000e+01</ROWUNCERTAINTY>\n\t\t\t<COLUNCERTAINTY>3.055000000000000e+01</COLUNCERTAINTY>\n\t\t\t<MINSUNAZ>1.621000000000000e+02</MINSUNAZ>\n\t\t\t<MAXSUNAZ>1.621000000000000e+02</MAXSUNAZ>\n\t\t\t<MEANSUNAZ>1.621000000000000e+02</MEANSUNAZ>\n\t\t\t<MINSUNEL>2.760000000000000e+01</MINSUNEL>\n\t\t\t<MAXSUNEL>2.770000000000000e+01</MAXSUNEL>\n\t\t\t<MEANSUNEL>2.760000000000000e+01</MEANSUNEL>\n\t\t\t<MINSATAZ>7.400000000000000e+01</MINSATAZ>\n\t\t\t<MAXSATAZ>8.270000000000000e+01</MAXSATAZ>\n\t\t\t<MEANSATAZ>7.830000000000000e+01</MEANSATAZ>\n\t\t\t<MINSATEL>7.750000000000000e+01</MINSATEL>\n\t\t\t<MAXSATEL>7.820000000000000e+01</MAXSATEL>\n\t\t\t<MEANSATEL>7.790000000000001e+01</MEANSATEL>\n\t\t\t<MININTRACKVIEWANGLE>4.000000000000000e+00</MININTRACKVIEWANGLE>\n\t\t\t<MAXINTRACKVIEWANGLE>4.300000000000000e+00</MAXINTRACKVIEWANGLE>\n\t\t\t<MEANINTRACKVIEWANGLE>4.100000000000000e+00</MEANINTRACKVIEWANGLE>\n\t\t\t<MINCROSSTRACKVIEWANGLE>1.030000000000000e+01</MINCROSSTRACKVIEWANGLE>\n\t\t\t<MAXCROSSTRACKVIEWANGLE>1.070000000000000e+01</MAXCROSSTRACKVIEWANGLE>\n\t\t\t<MEANCROSSTRACKVIEWANGLE>1.050000000000000e+01</MEANCROSSTRACKVIEWANGLE>\n\t\t\t<MINOFFNADIRVIEWANGLE>1.130000000000000e+01</MINOFFNADIRVIEWANGLE>\n\t\t\t<MAXOFFNADIRVIEWANGLE>1.130000000000000e+01</MAXOFFNADIRVIEWANGLE>\n\t\t\t<MEANOFFNADIRVIEWANGLE>1.130000000000000e+01</MEANOFFNADIRVIEWANGLE>\n\t\t\t<PNIIRS>4.600000000000000e+00</PNIIRS>\n\t\t\t<CLOUDCOVER>0.000000000000000e+00</CLOUDCOVER>\n\t\t\t<RESAMPLINGKERNEL>CC</RESAMPLINGKERNEL>\n\t\t\t<TDILEVEL>32</TDILEVEL>\n\t\t\t<POSITIONKNOWLEDGESRC>R</POSITIONKNOWLEDGESRC>\n\t\t\t<ATTITUDEKNOWLEDGESRC>R</ATTITUDEKNOWLEDGESRC>\n\t\t</IMAGE>\n\t</IMD>\n\t<EPH>\n\t\t<SATID>Imaginary1</SATID>\n\t\t<GENERATIONTIME>1432-11-25T19:05:33.862633Z</GENERATIONTIME>\n\t\t<STARTTIME>1432-11-25T17:40:21.387413Z</STARTTIME>\n\t\t<NUMPOINTS>931</NUMPOINTS>\n\t\t<TIMEINTERVAL>2.000000000000000e-02</TIMEINTERVAL>\n\t\t<EPHEMLISTList>\n\t\t\t<EPHEMLIST>1.000000000000000e+00 -1.264786099517881e+06 -5.079788984103872e+06 4.447110266754559e+06 -2.810824796318426e+03 -4.317015677790741e+03 -5.713803070374209e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.000000000000000e+00 -1.264842315405748e+06 -5.079875322324694e+06 4.446995990591982e+06 -2.810806474997520e+03 -4.316883162896974e+03 -5.713912662339114e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.000000000000000e+00 -1.264898530934286e+06 -5.079961657908056e+06 4.446881712220941e+06 -2.810788152274015e+03 -4.316750645754544e+03 -5.714022251482255e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.000000000000000e+00 -1.264954746092496e+06 -5.080047990834096e+06 4.446767431667244e+06 -2.810769828231033e+03 -4.316618126363581e+03 -5.714131837768030e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.000000000000000e+00 -1.265010960885827e+06 -5.080134321112684e+06 4.446653148918072e+06 -2.810751502044848e+03 -4.316485605127642e+03 -5.714241421236855e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.000000000000000e+00 -1.265067175314160e+06 -5.080220648743652e+06 4.446538863973644e+06 -2.810733173525062e+03 -4.316353081892289e+03 -5.714351002089194e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.000000000000000e+00 -1.265123389377621e+06 -5.080306973727209e+06 4.446424576833691e+06 -2.810714844240871e+03 -4.316220556562411e+03 -5.714460579728314e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.000000000000000e+00 -1.265179603054010e+06 -5.080393296023355e+06 4.446310287550225e+06 -2.810696513066640e+03 -4.316088032753253e+03 -5.714570151846040e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.000000000000000e+00 -1.265235816398463e+06 -5.080479615731570e+06 4.446195995993895e+06 -2.810678179875879e+03 -4.315955501355695e+03 -5.714679725523418e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.000000000000000e+01 -1.265292029366854e+06 -5.080565932772273e+06 4.446081702268185e+06 -2.810659844721672e+03 -4.315822969832768e+03 -5.714789294980564e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.100000000000000e+01 -1.265348241970073e+06 -5.080652247165151e+06 4.445967406347499e+06 -2.810641507489429e+03 -4.315690436290932e+03 -5.714898861727119e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.200000000000000e+01 -1.265404454219244e+06 -5.080738558930263e+06 4.445853108205749e+06 -2.810623168904423e+03 -4.315557898674017e+03 -5.715008427039278e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.300000000000000e+01 -1.265460666081250e+06 -5.080824868007886e+06 4.445738807920609e+06 -2.810604829044986e+03 -4.315425362725256e+03 -5.715117986454004e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.400000000000000e+01 -1.265516877599978e+06 -5.080911174477259e+06 4.445624505389022e+06 -2.810586485952013e+03 -4.315292821201429e+03 -5.715227546394125e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.500000000000000e+01 -1.265573088742548e+06 -5.080997478279040e+06 4.445510200688178e+06 -2.810568142505838e+03 -4.315160279292229e+03 -5.715337101627397e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.600000000000000e+01 -1.265629299519852e+06 -5.081083779432915e+06 4.445395893792474e+06 -2.810549796960044e+03 -4.315027735297114e+03 -5.715446654210965e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.700000000000000e+01 -1.265685509909765e+06 -5.081170077899013e+06 4.445281584753774e+06 -2.810531449894400e+03 -4.314895193212630e+03 -5.715556200815625e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.800000000000000e+01 -1.265741719978424e+06 -5.081256373796647e+06 4.445167273416875e+06 -2.810513100348325e+03 -4.314762641286388e+03 -5.715665750913574e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.900000000000000e+01 -1.265797929648705e+06 -5.081342666986700e+06 4.445052959962756e+06 -2.810494749920369e+03 -4.314630093120733e+03 -5.715775293333953e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.000000000000000e+01 -1.265854138986493e+06 -5.081428957588099e+06 4.444938644236696e+06 -2.810476395696284e+03 -4.314497537389122e+03 -5.715884838053921e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.100000000000000e+01 -1.265910347914917e+06 -5.081515245462115e+06 4.444824326419187e+06 -2.810458042802524e+03 -4.314364986645493e+03 -5.715994373206236e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.200000000000000e+01 -1.265966556477778e+06 -5.081601530687852e+06 4.444710006407319e+06 -2.810439686865067e+03 -4.314232434167718e+03 -5.716103905840911e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.300000000000000e+01 -1.266022764719201e+06 -5.081687813344901e+06 4.444595684097529e+06 -2.810421328533046e+03 -4.314099872003807e+03 -5.716213441810765e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.400000000000000e+01 -1.266078972573074e+06 -5.081774093314022e+06 4.444481359644975e+06 -2.810402968760773e+03 -4.313967311684031e+03 -5.716322971819766e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.500000000000000e+01 -1.266135180072279e+06 -5.081860370654580e+06 4.444367032972403e+06 -2.810384606302935e+03 -4.313834747447174e+03 -5.716432500840567e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.600000000000000e+01 -1.266191387172940e+06 -5.081946645287407e+06 4.444252704182852e+06 -2.810366244440468e+03 -4.313702186498078e+03 -5.716542021919487e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.700000000000000e+01 -1.266247593929943e+06 -5.082032917311561e+06 4.444138373147404e+06 -2.810347879319712e+03 -4.313569619945310e+03 -5.716651543554642e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.800000000000000e+01 -1.266303800354173e+06 -5.082119186746714e+06 4.444024039840457e+06 -2.810329510837939e+03 -4.313437045814743e+03 -5.716761067310840e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.900000000000000e+01 -1.266360006379752e+06 -5.082205453474016e+06 4.443909704416695e+06 -2.810311142583800e+03 -4.313304475071472e+03 -5.716870583205785e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.000000000000000e+01 -1.266416212006573e+06 -5.082291717493303e+06 4.443795366876342e+06 -2.810292773728662e+03 -4.313171907873805e+03 -5.716980091471785e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.100000000000000e+01 -1.266472417300510e+06 -5.082377978923464e+06 4.443681027064656e+06 -2.810274401125877e+03 -4.313039333166981e+03 -5.717089601970699e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.200000000000000e+01 -1.266528622239692e+06 -5.082464237725020e+06 4.443566685033014e+06 -2.810256027266850e+03 -4.312906754237058e+03 -5.717199111106711e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.300000000000000e+01 -1.266584826801925e+06 -5.082550493857998e+06 4.443452340833462e+06 -2.810237651244327e+03 -4.312774175409240e+03 -5.717308615934208e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.400000000000000e+01 -1.266641031009329e+06 -5.082636747362289e+06 4.443337994414066e+06 -2.810219273755713e+03 -4.312641592436413e+03 -5.717418119428040e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.500000000000000e+01 -1.266697234828801e+06 -5.082722998178212e+06 4.443223645852537e+06 -2.810200895235276e+03 -4.312509011308006e+03 -5.717527616788339e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.600000000000000e+01 -1.266753438282212e+06 -5.082809246345269e+06 4.443109295097439e+06 -2.810182514121101e+03 -4.312376428166257e+03 -5.717637111653935e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.700000000000000e+01 -1.266809641402691e+06 -5.082895491923187e+06 4.442994942071002e+06 -2.810164131262554e+03 -4.312243837070509e+03 -5.717746608238745e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.800000000000000e+01 -1.266865844135124e+06 -5.082981734812613e+06 4.442880586902601e+06 -2.810145746647177e+03 -4.312111247863489e+03 -5.717856098965532e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.900000000000000e+01 -1.266922046501396e+06 -5.083067975053054e+06 4.442766229540798e+06 -2.810127359992593e+03 -4.311978656813126e+03 -5.717965586829900e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.000000000000000e+01 -1.266978248490632e+06 -5.083154212624881e+06 4.442651870011152e+06 -2.810108972973550e+03 -4.311846065045994e+03 -5.718075070249666e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.100000000000000e+01 -1.267034450124716e+06 -5.083240447567604e+06 4.442537508262213e+06 -2.810090583290125e+03 -4.311713469542280e+03 -5.718184552532036e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.200000000000000e+01 -1.267090651381533e+06 -5.083326679841385e+06 4.442423144345879e+06 -2.810072191835382e+03 -4.311580874183983e+03 -5.718294030306070e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.300000000000000e+01 -1.267146852305201e+06 -5.083412909525770e+06 4.442308778158534e+06 -2.810053798073835e+03 -4.311448270817283e+03 -5.718403510079851e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.400000000000000e+01 -1.267203052829617e+06 -5.083499136501586e+06 4.442194409855405e+06 -2.810035403514999e+03 -4.311315671109256e+03 -5.718512982224186e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.500000000000000e+01 -1.267259252998658e+06 -5.083585360847999e+06 4.442080039333372e+06 -2.810017006268665e+03 -4.311183067523140e+03 -5.718622453349666e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.600000000000000e+01 -1.267315452812447e+06 -5.083671582565223e+06 4.441965666592167e+06 -2.809998607777927e+03 -4.311050459860421e+03 -5.718731922993380e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.700000000000000e+01 -1.267371652226799e+06 -5.083757801573637e+06 4.441851291735511e+06 -2.809980207828703e+03 -4.310917855915009e+03 -5.718841385245355e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.800000000000000e+01 -1.267427851285829e+06 -5.083844017952774e+06 4.441736914659799e+06 -2.809961806814529e+03 -4.310785247864109e+03 -5.718950845961423e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.900000000000000e+01 -1.267484050022416e+06 -5.083930231761965e+06 4.441622535287729e+06 -2.809943401578330e+03 -4.310652630390795e+03 -5.719060310581365e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.000000000000000e+01 -1.267540248337466e+06 -5.084016442822562e+06 4.441508153852057e+06 -2.809924996390579e+03 -4.310520020289421e+03 -5.719169764353683e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.100000000000000e+01 -1.267596446308086e+06 -5.084102651273580e+06 4.441393770171655e+06 -2.809906589652447e+03 -4.310387404024188e+03 -5.719279218381498e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.200000000000000e+01 -1.267652643945153e+06 -5.084188857134701e+06 4.441279384220896e+06 -2.809888178985893e+03 -4.310254780541284e+03 -5.719388674489735e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.300000000000000e+01 -1.267708841182575e+06 -5.084275060286768e+06 4.441164996155038e+06 -2.809869767737591e+03 -4.310122160638734e+03 -5.719498122938782e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.400000000000000e+01 -1.267765038042466e+06 -5.084361260769644e+06 4.441050605922125e+06 -2.809851355908731e+03 -4.309989539950772e+03 -5.719607567089182e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.500000000000000e+01 -1.267821234535717e+06 -5.084447458603008e+06 4.440936213496549e+06 -2.809832942185753e+03 -4.309856917817999e+03 -5.719717008008787e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.600000000000000e+01 -1.267877430673199e+06 -5.084533653806511e+06 4.440821818852678e+06 -2.809814525355438e+03 -4.309724291587392e+03 -5.719826448256853e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.700000000000000e+01 -1.267933626444043e+06 -5.084619846360535e+06 4.440707422016089e+06 -2.809796107921289e+03 -4.309591663131126e+03 -5.719935885324782e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.800000000000000e+01 -1.267989821870050e+06 -5.084706036304440e+06 4.440593022935477e+06 -2.809777686901722e+03 -4.309459029079797e+03 -5.720045323076884e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.900000000000000e+01 -1.268046016907355e+06 -5.084792223559134e+06 4.440478621713941e+06 -2.809759265881616e+03 -4.309326396568026e+03 -5.720154754493913e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.000000000000000e+01 -1.268102211544850e+06 -5.084878408104619e+06 4.440364218377544e+06 -2.809740844051478e+03 -4.309193767459494e+03 -5.720264178487406e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.100000000000000e+01 -1.268158405848394e+06 -5.084964590059689e+06 4.440249812771450e+06 -2.809722418534095e+03 -4.309061131118909e+03 -5.720373604468043e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.200000000000000e+01 -1.268214599796122e+06 -5.085050769384897e+06 4.440135404947073e+06 -2.809703991915452e+03 -4.308928490460925e+03 -5.720483029090086e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.300000000000000e+01 -1.268270793365923e+06 -5.085136946040430e+06 4.440020994956316e+06 -2.809685563303193e+03 -4.308795849732146e+03 -5.720592449466522e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.400000000000000e+01 -1.268326986590672e+06 -5.085223120085591e+06 4.439906582721873e+06 -2.809667131653343e+03 -4.308663203505550e+03 -5.720701870217842e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.500000000000000e+01 -1.268383179404522e+06 -5.085309291401653e+06 4.439792168398536e+06 -2.809648701064403e+03 -4.308530562188988e+03 -5.720811281589628e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.600000000000000e+01 -1.268439371884320e+06 -5.085395460127207e+06 4.439677751805611e+06 -2.809630266749600e+03 -4.308397913579003e+03 -5.720920695011020e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.700000000000000e+01 -1.268495563985975e+06 -5.085481626182796e+06 4.439563333046701e+06 -2.809611830788402e+03 -4.308265264807369e+03 -5.721030104108968e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.800000000000000e+01 -1.268551755698614e+06 -5.085567789548808e+06 4.439448912147379e+06 -2.809593394792175e+03 -4.308132617213363e+03 -5.721139507166661e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.900000000000000e+01 -1.268607947099088e+06 -5.085653950363824e+06 4.439334488926941e+06 -2.809574954355781e+03 -4.307999958826846e+03 -5.721248915269092e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.000000000000000e+01 -1.268664138088323e+06 -5.085740108449296e+06 4.439220063618226e+06 -2.809556513370168e+03 -4.307867305649527e+03 -5.721358314449552e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.100000000000000e+01 -1.268720328721427e+06 -5.085826263904526e+06 4.439105636091731e+06 -2.809538071491233e+03 -4.307734648378881e+03 -5.721467712009930e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.200000000000000e+01 -1.268776518976205e+06 -5.085912416689591e+06 4.438991206399532e+06 -2.809519626843446e+03 -4.307601991138831e+03 -5.721577105577953e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.300000000000000e+01 -1.268832708896767e+06 -5.085998566883973e+06 4.438876774437963e+06 -2.809501180355492e+03 -4.307469326054065e+03 -5.721686500814139e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.400000000000000e+01 -1.268888898395041e+06 -5.086084714328958e+06 4.438762340414037e+06 -2.809482733863016e+03 -4.307336668179046e+03 -5.721795885359143e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.500000000000000e+01 -1.268945087569858e+06 -5.086170859202744e+06 4.438647904095335e+06 -2.809464283248959e+03 -4.307204001256327e+03 -5.721905273469492e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.600000000000000e+01 -1.269001276377368e+06 -5.086257001426257e+06 4.438533465584976e+06 -2.809445831785054e+03 -4.307071331673892e+03 -5.722014658838339e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.700000000000000e+01 -1.269057464795468e+06 -5.086343140959717e+06 4.438419024934883e+06 -2.809427379090407e+03 -4.306938664166779e+03 -5.722124037987427e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.800000000000000e+01 -1.269113652868017e+06 -5.086429277882207e+06 4.438304582041877e+06 -2.809408923215822e+03 -4.306805990913729e+03 -5.722233417760982e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.900000000000000e+01 -1.269169840562159e+06 -5.086515412134496e+06 4.438190136983231e+06 -2.809390466919817e+03 -4.306673317082030e+03 -5.722342793010550e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.000000000000000e+01 -1.269226027866784e+06 -5.086601543696600e+06 4.438075689785029e+06 -2.809372009415806e+03 -4.306540645129557e+03 -5.722452162182052e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.100000000000000e+01 -1.269282214847742e+06 -5.086687672687243e+06 4.437961240292369e+06 -2.809353547788733e+03 -4.306407963903553e+03 -5.722561535091264e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.200000000000000e+01 -1.269338401428197e+06 -5.086773798967930e+06 4.437846788685956e+06 -2.809335086690340e+03 -4.306275285774827e+03 -5.722670900246152e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.300000000000000e+01 -1.269394587640937e+06 -5.086859922597822e+06 4.437732334888606e+06 -2.809316622859045e+03 -4.306142606101705e+03 -5.722780262604831e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.400000000000000e+01 -1.269450773530062e+06 -5.086946043656360e+06 4.437617878796636e+06 -2.809298156516355e+03 -4.306009916442046e+03 -5.722889628561510e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.500000000000000e+01 -1.269506958996517e+06 -5.087032161965087e+06 4.437503420642952e+06 -2.809279690115390e+03 -4.305877234165499e+03 -5.722998983720555e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.600000000000000e+01 -1.269563144128128e+06 -5.087118277682316e+06 4.437388960220939e+06 -2.809261220042929e+03 -4.305744544537015e+03 -5.723108340946651e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.700000000000000e+01 -1.269619328870058e+06 -5.087204390709208e+06 4.437274497659598e+06 -2.809242750226366e+03 -4.305611856093553e+03 -5.723217692005430e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.800000000000000e+01 -1.269675513266165e+06 -5.087290501124832e+06 4.437160032855736e+06 -2.809224277241484e+03 -4.305479162200686e+03 -5.723327043454318e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.900000000000000e+01 -1.269731697283349e+06 -5.087376608869601e+06 4.437045565887131e+06 -2.809205802275862e+03 -4.305346468272915e+03 -5.723436390626418e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.000000000000000e+01 -1.269787880910747e+06 -5.087462713923908e+06 4.436931096779373e+06 -2.809187327593699e+03 -4.305213775520439e+03 -5.723545731627531e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.100000000000000e+01 -1.269844064214200e+06 -5.087548816406441e+06 4.436816625377537e+06 -2.809168848859477e+03 -4.305081073579920e+03 -5.723655076267451e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.200000000000000e+01 -1.269900247138628e+06 -5.087634916217989e+06 4.436702151811131e+06 -2.809150368319726e+03 -4.304948371539586e+03 -5.723764416605889e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.300000000000000e+01 -1.269956429662169e+06 -5.087721013319156e+06 4.436587676131604e+06 -2.809131888202458e+03 -4.304815672788728e+03 -5.723873749090171e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.400000000000000e+01 -1.270012611839674e+06 -5.087807107808799e+06 4.436473198209877e+06 -2.809113405101313e+03 -4.304682968181095e+03 -5.723983082198250e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.500000000000000e+01 -1.270068793649039e+06 -5.087893199647150e+06 4.436358718097894e+06 -2.809094919668286e+03 -4.304550262031348e+03 -5.724092412337493e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.600000000000000e+01 -1.270124975079402e+06 -5.087979288814602e+06 4.436244235821241e+06 -2.809076434008208e+03 -4.304417555044343e+03 -5.724201738070020e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.700000000000000e+01 -1.270181156163536e+06 -5.088065375370287e+06 4.436129751302720e+06 -2.809057944507493e+03 -4.304284842895786e+03 -5.724311064256611e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.800000000000000e+01 -1.270237336879588e+06 -5.088151459274797e+06 4.436015264593781e+06 -2.809039454404493e+03 -4.304152128222768e+03 -5.724420387492163e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.900000000000000e+01 -1.270293517205456e+06 -5.088237540488359e+06 4.435900775746365e+06 -2.809020962810196e+03 -4.304019415273579e+03 -5.724529704892446e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.000000000000000e+02 -1.270349697184994e+06 -5.088323619090023e+06 4.435786284657248e+06 -2.809002468112682e+03 -4.303886696775628e+03 -5.724639022729705e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.010000000000000e+02 -1.270405876785352e+06 -5.088409695020592e+06 4.435671791403744e+06 -2.808983973233550e+03 -4.303753977838130e+03 -5.724748335835634e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.020000000000000e+02 -1.270462056028393e+06 -5.088495768319494e+06 4.435557295934346e+06 -2.808965475371246e+03 -4.303621255096309e+03 -5.724857647987395e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.030000000000000e+02 -1.270518234881031e+06 -5.088581838927172e+06 4.435442798326869e+06 -2.808946976337203e+03 -4.303488534336801e+03 -5.724966953969896e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.040000000000000e+02 -1.270574413354383e+06 -5.088667906863631e+06 4.435328298555175e+06 -2.808928476979827e+03 -4.303355812701435e+03 -5.725076255616985e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.050000000000000e+02 -1.270630591492299e+06 -5.088753972207901e+06 4.435213796516028e+06 -2.808909973965505e+03 -4.303223083933624e+03 -5.725185559152228e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.060000000000000e+02 -1.270686769283668e+06 -5.088840034940020e+06 4.435099292235506e+06 -2.808891467711560e+03 -4.303090349479323e+03 -5.725294863287120e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.070000000000000e+02 -1.270742946640692e+06 -5.088926094901802e+06 4.434984785920267e+06 -2.808872963613928e+03 -4.302957623680928e+03 -5.725404154712483e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.080000000000000e+02 -1.270799123662088e+06 -5.089012152271142e+06 4.434870277337902e+06 -2.808854455193882e+03 -4.302824890545871e+03 -5.725513448465646e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.090000000000000e+02 -1.270855300315015e+06 -5.089098206988857e+06 4.434755766565740e+06 -2.808835946112618e+03 -4.302692155210366e+03 -5.725622739044242e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.100000000000000e+02 -1.270911476610347e+06 -5.089184259074580e+06 4.434641253578129e+06 -2.808817434371103e+03 -4.302559416063651e+03 -5.725732028535845e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.110000000000000e+02 -1.270967652525982e+06 -5.089270308488543e+06 4.434526738427024e+06 -2.808798920663241e+03 -4.302426676879089e+03 -5.725841313748408e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.120000000000000e+02 -1.271023828073037e+06 -5.089356355250759e+06 4.434412221086292e+06 -2.808780406191308e+03 -4.302293935268939e+03 -5.725950596003044e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.130000000000000e+02 -1.271080003229422e+06 -5.089442399321473e+06 4.434297701607881e+06 -2.808761890508727e+03 -4.302161195506334e+03 -5.726059872210150e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.140000000000000e+02 -1.271136178049969e+06 -5.089528440799486e+06 4.434183179862677e+06 -2.808743371175632e+03 -4.302028448232129e+03 -5.726169150591786e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.150000000000000e+02 -1.271192352490841e+06 -5.089614479605833e+06 4.434068655953879e+06 -2.808724851465368e+03 -4.301895700555016e+03 -5.726278424298349e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.160000000000000e+02 -1.271248526562913e+06 -5.089700515760136e+06 4.433954129855838e+06 -2.808706329517224e+03 -4.301762950850302e+03 -5.726387695368921e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.170000000000000e+02 -1.271304700288049e+06 -5.089786549301823e+06 4.433839601517036e+06 -2.808687804370239e+03 -4.301630195820561e+03 -5.726496966742877e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.180000000000000e+02 -1.271360873600438e+06 -5.089872580112343e+06 4.433725071092417e+06 -2.808669280271973e+03 -4.301497445453605e+03 -5.726606228947875e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.190000000000000e+02 -1.271417046576891e+06 -5.089958608330074e+06 4.433610538401117e+06 -2.808650752688519e+03 -4.301364687889782e+03 -5.726715493014407e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.200000000000000e+02 -1.271473219195310e+06 -5.090044633915263e+06 4.433496003495088e+06 -2.808632222149665e+03 -4.301231926511977e+03 -5.726824756120797e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.210000000000000e+02 -1.271529391378902e+06 -5.090130656729594e+06 4.433381466555169e+06 -2.808613693870955e+03 -4.301099173868778e+03 -5.726934006419496e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.220000000000000e+02 -1.271585563259335e+06 -5.090216677010252e+06 4.433266927271275e+06 -2.808595159811802e+03 -4.300966408420080e+03 -5.727043263859106e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.230000000000000e+02 -1.271641734726846e+06 -5.090302694559548e+06 4.433152385901858e+06 -2.808576626984931e+03 -4.300833647755335e+03 -5.727152511960103e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.240000000000000e+02 -1.271697905869232e+06 -5.090388709535629e+06 4.433037842240154e+06 -2.808558089985380e+03 -4.300700878095401e+03 -5.727261763593659e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.250000000000000e+02 -1.271754076631431e+06 -5.090474721839387e+06 4.432923296415754e+06 -2.808539551243588e+03 -4.300568108315726e+03 -5.727371010916506e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.260000000000000e+02 -1.271810247013570e+06 -5.090560731471027e+06 4.432808748428377e+06 -2.808521012178646e+03 -4.300435337850576e+03 -5.727480253758918e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.270000000000000e+02 -1.271866417004545e+06 -5.090646738410607e+06 4.432694198304136e+06 -2.808502471742330e+03 -4.300302569596246e+03 -5.727589490345700e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.280000000000000e+02 -1.271922586659181e+06 -5.090732742756883e+06 4.432579645913859e+06 -2.808483927685696e+03 -4.300169793517060e+03 -5.727698729331292e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.290000000000000e+02 -1.271978755900687e+06 -5.090818744371566e+06 4.432465091438416e+06 -2.808465384674187e+03 -4.300037022594242e+03 -5.727807958774191e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.300000000000000e+02 -1.272034924838829e+06 -5.090904743452343e+06 4.432350534619254e+06 -2.808446836705292e+03 -4.299904238558184e+03 -5.727917195240054e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.310000000000000e+02 -1.272091093374596e+06 -5.090990739820985e+06 4.432235975689492e+06 -2.808428287760383e+03 -4.299771458527577e+03 -5.728026423906076e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.320000000000000e+02 -1.272147261541081e+06 -5.091076733537048e+06 4.432121414571218e+06 -2.808409738166180e+03 -4.299638675653327e+03 -5.728135649885918e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.330000000000000e+02 -1.272203429316108e+06 -5.091162724560685e+06 4.432006851316583e+06 -2.808391186566565e+03 -4.299505895151526e+03 -5.728244869756937e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.340000000000000e+02 -1.272259596765735e+06 -5.091248713010789e+06 4.431892285770038e+06 -2.808372632581864e+03 -4.299373104574188e+03 -5.728354093225494e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.350000000000000e+02 -1.272315763801943e+06 -5.091334698728951e+06 4.431777718138835e+06 -2.808354078098514e+03 -4.299240319766618e+03 -5.728463307339507e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.360000000000000e+02 -1.272371930523500e+06 -5.091420681893026e+06 4.431663148190278e+06 -2.808335518866476e+03 -4.299107523633264e+03 -5.728572527014504e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.370000000000000e+02 -1.272428096820662e+06 -5.091506662305417e+06 4.431548576182900e+06 -2.808316961482898e+03 -4.298974734451152e+03 -5.728681735431191e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.380000000000000e+02 -1.272484262803182e+06 -5.091592640163762e+06 4.431434001858108e+06 -2.808298399234457e+03 -4.298841934061372e+03 -5.728790949366964e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.390000000000000e+02 -1.272540428361076e+06 -5.091678615270095e+06 4.431319425474942e+06 -2.808279837225609e+03 -4.298709141222232e+03 -5.728900152270110e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.400000000000000e+02 -1.272596593560393e+06 -5.091764587743303e+06 4.431204846877832e+06 -2.808261273950000e+03 -4.298576343715313e+03 -5.729009354148136e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.410000000000000e+02 -1.272652758412001e+06 -5.091850557603001e+06 4.431090266041128e+06 -2.808242707430403e+03 -4.298443541276833e+03 -5.729118556043990e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.420000000000000e+02 -1.272708922882824e+06 -5.091936524789680e+06 4.430975683042685e+06 -2.808224139125018e+03 -4.298310738133823e+03 -5.729227754097287e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.430000000000000e+02 -1.272765086962004e+06 -5.092022489283781e+06 4.430861097908126e+06 -2.808205571097253e+03 -4.298177936854327e+03 -5.729336945462373e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.440000000000000e+02 -1.272821250693369e+06 -5.092108451164241e+06 4.430746510534130e+06 -2.808186999707599e+03 -4.298045129556700e+03 -5.729446137727962e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.450000000000000e+02 -1.272877414076802e+06 -5.092194410430898e+06 4.430631920920918e+06 -2.808168425125075e+03 -4.297912317120220e+03 -5.729555330147854e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.460000000000000e+02 -1.272933577046516e+06 -5.092280366965297e+06 4.430517329223522e+06 -2.808149851913605e+03 -4.297779509195067e+03 -5.729664513385762e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.470000000000000e+02 -1.272989739679211e+06 -5.092366320905578e+06 4.430402735261138e+06 -2.808131274214904e+03 -4.297646694256461e+03 -5.729773698764903e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.480000000000000e+02 -1.273045901953044e+06 -5.092452272212396e+06 4.430288139085265e+06 -2.808112695479753e+03 -4.297513875242731e+03 -5.729882882565703e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.490000000000000e+02 -1.273102063812975e+06 -5.092538220786726e+06 4.430173540825544e+06 -2.808094116389107e+03 -4.297381061496499e+03 -5.729992057340233e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.500000000000000e+02 -1.273158225324791e+06 -5.092624166747034e+06 4.430058940326887e+06 -2.808075533840181e+03 -4.297248242258061e+03 -5.730101232652306e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.510000000000000e+02 -1.273214386477643e+06 -5.092710110073756e+06 4.429944337614905e+06 -2.808056950356278e+03 -4.297115418831549e+03 -5.730210406429376e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.520000000000000e+02 -1.273270547249440e+06 -5.092796050727184e+06 4.429829732741589e+06 -2.808038364863763e+03 -4.296982595274133e+03 -5.730319576019688e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.530000000000000e+02 -1.273326707651049e+06 -5.092881988726921e+06 4.429715125681278e+06 -2.808019777259476e+03 -4.296849769908806e+03 -5.730428742751956e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.540000000000000e+02 -1.273382867682599e+06 -5.092967924073176e+06 4.429600516433698e+06 -2.808001188756169e+03 -4.296716942020253e+03 -5.730537906658468e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.550000000000000e+02 -1.273439027343973e+06 -5.093053856765786e+06 4.429485904999069e+06 -2.807982598068004e+03 -4.296584112463997e+03 -5.730647067630631e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.560000000000000e+02 -1.273495186635057e+06 -5.093139786804584e+06 4.429371291377611e+06 -2.807964005169632e+03 -4.296451280910513e+03 -5.730756225931639e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.570000000000000e+02 -1.273551345544987e+06 -5.093225714170006e+06 4.429256675594943e+06 -2.807945411803652e+03 -4.296318448766362e+03 -5.730865379743329e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.580000000000000e+02 -1.273607504117514e+06 -5.093311638940845e+06 4.429142057547886e+06 -2.807926814437975e+03 -4.296185609502259e+03 -5.730974535568023e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.590000000000000e+02 -1.273663662275864e+06 -5.093397560978917e+06 4.429027437417408e+06 -2.807908218187518e+03 -4.296052775111347e+03 -5.731083682046054e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.600000000000000e+02 -1.273719820096815e+06 -5.093483480422441e+06 4.428912815022484e+06 -2.807889618176531e+03 -4.295919933285127e+03 -5.731192830676625e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.610000000000000e+02 -1.273775977536316e+06 -5.093569397192182e+06 4.428798190466908e+06 -2.807871016368312e+03 -4.295787091589817e+03 -5.731301974830719e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.620000000000000e+02 -1.273832134594488e+06 -5.093655311288344e+06 4.428683563750402e+06 -2.807852414303479e+03 -4.295654249150488e+03 -5.731411114523587e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.630000000000000e+02 -1.273888291293188e+06 -5.093741222750296e+06 4.428568934821409e+06 -2.807833809496610e+03 -4.295521403233732e+03 -5.731520252904827e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.640000000000000e+02 -1.273944447632299e+06 -5.093827131577872e+06 4.428454303680142e+06 -2.807815202040687e+03 -4.295388553277328e+03 -5.731629390365166e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.650000000000000e+02 -1.274000603589976e+06 -5.093913037731747e+06 4.428339670378117e+06 -2.807796594109516e+03 -4.295255702997776e+03 -5.731738523135041e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.660000000000000e+02 -1.274056759177090e+06 -5.093998941231521e+06 4.428225034889663e+06 -2.807777984092368e+03 -4.295122850788379e+03 -5.731847653129345e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.670000000000000e+02 -1.274112914404509e+06 -5.094084842096795e+06 4.428110397189104e+06 -2.807759371307670e+03 -4.294989994847414e+03 -5.731956782017018e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.680000000000000e+02 -1.274169069250389e+06 -5.094170740288246e+06 4.427995757327959e+06 -2.807740758136357e+03 -4.294857138362156e+03 -5.732065906346094e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.690000000000000e+02 -1.274225223736587e+06 -5.094256635845237e+06 4.427881115254654e+06 -2.807722142421061e+03 -4.294724278137423e+03 -5.732175029479424e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.700000000000000e+02 -1.274281377830028e+06 -5.094342528708315e+06 4.427766471047102e+06 -2.807703525086996e+03 -4.294591419694576e+03 -5.732284146797504e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.710000000000000e+02 -1.274337531552810e+06 -5.094428418917213e+06 4.427651824653240e+06 -2.807684907207368e+03 -4.294458558937557e+03 -5.732393260979654e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.720000000000000e+02 -1.274393684915720e+06 -5.094514306491401e+06 4.427537176047550e+06 -2.807666285997649e+03 -4.294325694583084e+03 -5.732502374191384e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.730000000000000e+02 -1.274449837896916e+06 -5.094600191391561e+06 4.427422525281562e+06 -2.807647664615482e+03 -4.294192829642968e+03 -5.732611482785661e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.740000000000000e+02 -1.274505990529233e+06 -5.094686073676818e+06 4.427307872277792e+06 -2.807629039861279e+03 -4.294059959178139e+03 -5.732720591902031e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.750000000000000e+02 -1.274562142779606e+06 -5.094771953287717e+06 4.427193217114165e+06 -2.807610413489984e+03 -4.293927088778797e+03 -5.732829696516580e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.760000000000000e+02 -1.274618294659141e+06 -5.094857830244228e+06 4.427078559764505e+06 -2.807591786246917e+03 -4.293794215696734e+03 -5.732938798415722e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.770000000000000e+02 -1.274674446167728e+06 -5.094943704546191e+06 4.426963900229036e+06 -2.807573156842665e+03 -4.293661341241511e+03 -5.733047897145309e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.780000000000000e+02 -1.274730597294261e+06 -5.095029576173674e+06 4.426849238533875e+06 -2.807554525492817e+03 -4.293528466144808e+03 -5.733156992053981e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.790000000000000e+02 -1.274786748082799e+06 -5.095115445205918e+06 4.426734574575149e+06 -2.807535892060720e+03 -4.293395583552917e+03 -5.733266088443524e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.800000000000000e+02 -1.274842898456352e+06 -5.095201311504458e+06 4.426619908534388e+06 -2.807517258234596e+03 -4.293262706287474e+03 -5.733375175787056e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.810000000000000e+02 -1.274899048469713e+06 -5.095287175167918e+06 4.426505240282304e+06 -2.807498621667551e+03 -4.293129825356593e+03 -5.733484261961319e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.820000000000000e+02 -1.274955198112025e+06 -5.095373036176745e+06 4.426390569844528e+06 -2.807479984299815e+03 -4.292996942018704e+03 -5.733593345179142e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.830000000000000e+02 -1.275011347427022e+06 -5.095458894609663e+06 4.426275897117832e+06 -2.807461342350199e+03 -4.292864049720257e+03 -5.733702432059876e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.840000000000000e+02 -1.275067496337955e+06 -5.095544750328598e+06 4.426161222283258e+06 -2.807442701122513e+03 -4.292731160164295e+03 -5.733811511397959e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.850000000000000e+02 -1.275123644855691e+06 -5.095630603353149e+06 4.426046545315136e+06 -2.807424058452137e+03 -4.292598272892506e+03 -5.733920584464126e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.860000000000000e+02 -1.275179793046004e+06 -5.095716453801664e+06 4.425931866058256e+06 -2.807405411660381e+03 -4.292465376111520e+03 -5.734029661416482e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.870000000000000e+02 -1.275235940821164e+06 -5.095802301516329e+06 4.425817184719581e+06 -2.807386765972007e+03 -4.292332484402948e+03 -5.734138728883048e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.880000000000000e+02 -1.275292088268912e+06 -5.095888146654999e+06 4.425702501092096e+06 -2.807368116136796e+03 -4.292199583458286e+03 -5.734247800037139e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.890000000000000e+02 -1.275348235312259e+06 -5.095973989079242e+06 4.425587815357356e+06 -2.807349465568690e+03 -4.292066686062791e+03 -5.734356863650864e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.900000000000000e+02 -1.275404382017219e+06 -5.096059828907772e+06 4.425473127359651e+06 -2.807330812620085e+03 -4.291933780792340e+03 -5.734465929160311e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.910000000000000e+02 -1.275460528306811e+06 -5.096145666002175e+06 4.425358437280552e+06 -2.807312159540496e+03 -4.291800881016951e+03 -5.734574985386286e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.920000000000000e+02 -1.275516674246801e+06 -5.096231500480780e+06 4.425243744964837e+06 -2.807293503005624e+03 -4.291667975672573e+03 -5.734684042201065e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.930000000000000e+02 -1.275572819826338e+06 -5.096317332324047e+06 4.425129050438142e+06 -2.807274845483510e+03 -4.291535066161007e+03 -5.734793097484235e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.940000000000000e+02 -1.275628965023340e+06 -5.096403161492314e+06 4.425014353752498e+06 -2.807256185980702e+03 -4.291402156550394e+03 -5.734902148547348e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.950000000000000e+02 -1.275685109870637e+06 -5.096488988044659e+06 4.424899654830399e+06 -2.807237523305779e+03 -4.291269241340702e+03 -5.735011200101261e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.960000000000000e+02 -1.275741254302470e+06 -5.096574811862804e+06 4.424784953827037e+06 -2.807218861862468e+03 -4.291136331195467e+03 -5.735120242123715e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.970000000000000e+02 -1.275797398395505e+06 -5.096660633084690e+06 4.424670250561423e+06 -2.807200196006891e+03 -4.291003413818241e+03 -5.735229286411828e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.980000000000000e+02 -1.275853542073006e+06 -5.096746451572303e+06 4.424555545214660e+06 -2.807181531538066e+03 -4.290870501372839e+03 -5.735338321204737e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.990000000000000e+02 -1.275909685444663e+06 -5.096832267522927e+06 4.424440837527856e+06 -2.807162861821519e+03 -4.290737576024168e+03 -5.735447362952497e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.000000000000000e+02 -1.275965828378592e+06 -5.096918080699460e+06 4.424326127812170e+06 -2.807144192742267e+03 -4.290604659774296e+03 -5.735556392338809e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.010000000000000e+02 -1.276021970984726e+06 -5.097003891299558e+06 4.424211415808214e+06 -2.807125520916949e+03 -4.290471733916844e+03 -5.735665425098090e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.020000000000000e+02 -1.276078113240985e+06 -5.097089699283551e+06 4.424096701568027e+06 -2.807106846113757e+03 -4.290338802274538e+03 -5.735774458406489e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.030000000000000e+02 -1.276134255070392e+06 -5.097175504513090e+06 4.423981985273222e+06 -2.807088171133192e+03 -4.290205878279876e+03 -5.735883480809614e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.040000000000000e+02 -1.276190396549937e+06 -5.097261307126572e+06 4.423867266742135e+06 -2.807069494541169e+03 -4.290072947954220e+03 -5.735992503599181e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.050000000000000e+02 -1.276246537624604e+06 -5.097347107025132e+06 4.423752546104556e+06 -2.807050817196931e+03 -4.289940021414233e+03 -5.736101518679697e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.060000000000000e+02 -1.276302678371131e+06 -5.097432904346784e+06 4.423637823179310e+06 -2.807032135541880e+03 -4.289807085622509e+03 -5.736210537524170e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.070000000000000e+02 -1.276358818734751e+06 -5.097518698993028e+06 4.423523098095690e+06 -2.807013453792513e+03 -4.289674149106503e+03 -5.736319551826361e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.080000000000000e+02 -1.276414958748202e+06 -5.097604491022802e+06 4.423408370776336e+06 -2.806994768152490e+03 -4.289541207296427e+03 -5.736428566689439e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.090000000000000e+02 -1.276471098367695e+06 -5.097690280357352e+06 4.423293641324642e+06 -2.806976082834784e+03 -4.289408266966293e+03 -5.736537575149429e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.100000000000000e+02 -1.276527237604092e+06 -5.097776067016254e+06 4.423178909714907e+06 -2.806957395641758e+03 -4.289275326348775e+03 -5.736646579489786e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.110000000000000e+02 -1.276583376501193e+06 -5.097861851078295e+06 4.423064175843691e+06 -2.806938704754781e+03 -4.289142378533148e+03 -5.736755585761720e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.120000000000000e+02 -1.276639514982273e+06 -5.097947632405513e+06 4.422949439892140e+06 -2.806920015113360e+03 -4.289009435403086e+03 -5.736864582790530e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.130000000000000e+02 -1.276695653113089e+06 -5.098033411116177e+06 4.422834701704971e+06 -2.806901322125931e+03 -4.288876487078111e+03 -5.736973580072873e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.140000000000000e+02 -1.276751790871567e+06 -5.098119187170642e+06 4.422719961334239e+06 -2.806882626955038e+03 -4.288743536674543e+03 -5.737082574734728e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.150000000000000e+02 -1.276807928268808e+06 -5.098204960588847e+06 4.422605218753752e+06 -2.806863930431872e+03 -4.288610582051692e+03 -5.737191568058211e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.160000000000000e+02 -1.276864065271769e+06 -5.098290731311427e+06 4.422490474041485e+06 -2.806845232822718e+03 -4.288477629094513e+03 -5.737300555435734e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.170000000000000e+02 -1.276920201902281e+06 -5.098376499377687e+06 4.422375727145830e+06 -2.806826532629156e+03 -4.288344674698813e+03 -5.737409539874246e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.180000000000000e+02 -1.276976338160478e+06 -5.098462264787833e+06 4.422260978066508e+06 -2.806807831955713e+03 -4.288211717552813e+03 -5.737518521482327e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.190000000000000e+02 -1.277032474068199e+06 -5.098548027581167e+06 4.422146226751896e+06 -2.806789128003958e+03 -4.288078754960196e+03 -5.737627503506468e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.200000000000000e+02 -1.277088609614345e+06 -5.098633787737785e+06 4.422031473228136e+06 -2.806770421226664e+03 -4.287945788546036e+03 -5.737736484513245e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.210000000000000e+02 -1.277144744755135e+06 -5.098719545178969e+06 4.421916717598644e+06 -2.806751715202045e+03 -4.287812825322510e+03 -5.737845457630045e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.220000000000000e+02 -1.277200879534281e+06 -5.098805299983359e+06 4.421801959760119e+06 -2.806733005817247e+03 -4.287679858778545e+03 -5.737954429573922e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.230000000000000e+02 -1.277257013962890e+06 -5.098891052170883e+06 4.421687199686361e+06 -2.806714294986524e+03 -4.287546885766137e+03 -5.738063401935698e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.240000000000000e+02 -1.277313147974975e+06 -5.098976801623005e+06 4.421572437533131e+06 -2.806695583442996e+03 -4.287413918548300e+03 -5.738172365042153e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.250000000000000e+02 -1.277369281636293e+06 -5.099062548457936e+06 4.421457673145110e+06 -2.806676868984869e+03 -4.287280945560045e+03 -5.738281328656805e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.260000000000000e+02 -1.277425414925007e+06 -5.099148292636422e+06 4.421342906573875e+06 -2.806658153563236e+03 -4.287147970379347e+03 -5.738390289220167e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.270000000000000e+02 -1.277481547851987e+06 -5.099234034178031e+06 4.421228137793719e+06 -2.806639435588964e+03 -4.287014991275646e+03 -5.738499248727439e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.280000000000000e+02 -1.277537680395153e+06 -5.099319773043135e+06 4.421113366856716e+06 -2.806620715647025e+03 -4.286882012411652e+03 -5.738608203752964e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.290000000000000e+02 -1.277593812576592e+06 -5.099405509271400e+06 4.420998593710735e+06 -2.806601994588085e+03 -4.286749029090274e+03 -5.738717157521002e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.300000000000000e+02 -1.277649944341300e+06 -5.099491242764020e+06 4.420883818485632e+06 -2.806583273012151e+03 -4.286616051227834e+03 -5.738826102208777e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.310000000000000e+02 -1.277706075776979e+06 -5.099576973678657e+06 4.420769040974223e+06 -2.806564547431225e+03 -4.286483064375245e+03 -5.738935050323702e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.320000000000000e+02 -1.277762206828868e+06 -5.099662701916876e+06 4.420654261305862e+06 -2.806545821487535e+03 -4.286350076900945e+03 -5.739043993933740e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.330000000000000e+02 -1.277818337507746e+06 -5.099748427498115e+06 4.420539479455005e+06 -2.806527092734239e+03 -4.286217087620113e+03 -5.739152934981213e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.340000000000000e+02 -1.277874467846677e+06 -5.099834150481753e+06 4.420424695343601e+06 -2.806508362073978e+03 -4.286084090399270e+03 -5.739261877763259e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.350000000000000e+02 -1.277930597746747e+06 -5.099919870690108e+06 4.420309909205218e+06 -2.806489631625892e+03 -4.285951102294795e+03 -5.739370808366296e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.360000000000000e+02 -1.277986727306632e+06 -5.100005588300535e+06 4.420195120806730e+06 -2.806470897731789e+03 -4.285818107087864e+03 -5.739479740717725e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.370000000000000e+02 -1.278042856504506e+06 -5.100091303273787e+06 4.420080330199713e+06 -2.806452162460633e+03 -4.285685107369539e+03 -5.739588671962543e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.380000000000000e+02 -1.278098985318299e+06 -5.100177015570256e+06 4.419965537436251e+06 -2.806433425547907e+03 -4.285552107695003e+03 -5.739697598737594e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.390000000000000e+02 -1.278155113758871e+06 -5.100262725209502e+06 4.419850742490635e+06 -2.806414686182531e+03 -4.285419106308044e+03 -5.739806522726863e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.400000000000000e+02 -1.278211241826350e+06 -5.100348432191726e+06 4.419735945362591e+06 -2.806395946228461e+03 -4.285286102401402e+03 -5.739915443755582e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.410000000000000e+02 -1.278267369487691e+06 -5.100434136457607e+06 4.419621146130137e+06 -2.806377205312407e+03 -4.285153102176594e+03 -5.740024357251692e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.420000000000000e+02 -1.278323496819608e+06 -5.100519838145020e+06 4.419506344611970e+06 -2.806358460254854e+03 -4.285020092596274e+03 -5.740133274508424e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.430000000000000e+02 -1.278379623778326e+06 -5.100605537175289e+06 4.419391540911543e+06 -2.806339714576455e+03 -4.284887080697150e+03 -5.740242188664866e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.440000000000000e+02 -1.278435750352753e+06 -5.100691233528531e+06 4.419276735055011e+06 -2.806320967009358e+03 -4.284754068821193e+03 -5.740351098472563e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.450000000000000e+02 -1.278491876564723e+06 -5.100776927244020e+06 4.419161926990730e+06 -2.806302216715457e+03 -4.284621053125558e+03 -5.740460007217825e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.460000000000000e+02 -1.278548002392412e+06 -5.100862618282524e+06 4.419047116770294e+06 -2.806283466146400e+03 -4.284488037003660e+03 -5.740568911272987e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.470000000000000e+02 -1.278604127835622e+06 -5.100948306643757e+06 4.418932304394085e+06 -2.806264713086729e+03 -4.284355020902985e+03 -5.740677811236505e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.480000000000000e+02 -1.278660252927407e+06 -5.101033992387081e+06 4.418817489784034e+06 -2.806245958645017e+03 -4.284221998989538e+03 -5.740786711087047e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.490000000000000e+02 -1.278716377634722e+06 -5.101119675453168e+06 4.418702673018160e+06 -2.806227202166456e+03 -4.284088976739573e+03 -5.740895606926308e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.500000000000000e+02 -1.278772501968431e+06 -5.101205355861584e+06 4.418587854070752e+06 -2.806208443564622e+03 -4.283955952768703e+03 -5.741004499846648e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.510000000000000e+02 -1.278828625928657e+06 -5.101291033612525e+06 4.418473032941538e+06 -2.806189684203465e+03 -4.283822926342407e+03 -5.741113389829770e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.520000000000000e+02 -1.278884749493337e+06 -5.101376708666407e+06 4.418358209682606e+06 -2.806170923388956e+03 -4.283689901799427e+03 -5.741222273862198e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.530000000000000e+02 -1.278940872717226e+06 -5.101462381121626e+06 4.418243384164503e+06 -2.806152159057611e+03 -4.283556869764236e+03 -5.741331159966525e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.540000000000000e+02 -1.278996995578497e+06 -5.101548050938964e+06 4.418128556438821e+06 -2.806133393284289e+03 -4.283423833619829e+03 -5.741440044683582e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.550000000000000e+02 -1.279053118044122e+06 -5.101633718059117e+06 4.418013726583594e+06 -2.806114626527582e+03 -4.283290799108590e+03 -5.741548923441542e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.560000000000000e+02 -1.279109240113974e+06 -5.101719382481926e+06 4.417898894599054e+06 -2.806095858077829e+03 -4.283157766608442e+03 -5.741657796253626e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.570000000000000e+02 -1.279165361832081e+06 -5.101805044286440e+06 4.417784060381165e+06 -2.806077088161067e+03 -4.283024727911784e+03 -5.741766669280192e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.580000000000000e+02 -1.279221483176299e+06 -5.101890703432950e+06 4.417669223982194e+06 -2.806058315414041e+03 -4.282891687606879e+03 -5.741875539601747e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.590000000000000e+02 -1.279277604146750e+06 -5.101976359921656e+06 4.417554385401864e+06 -2.806039541936047e+03 -4.282758644798782e+03 -5.741984407010464e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.600000000000000e+02 -1.279333724754295e+06 -5.102062013772112e+06 4.417439544614456e+06 -2.806020765602874e+03 -4.282625598370131e+03 -5.742093273258263e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.610000000000000e+02 -1.279389844976871e+06 -5.102147664944726e+06 4.417324701672074e+06 -2.806001987681992e+03 -4.282492551816944e+03 -5.742202135143585e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.620000000000000e+02 -1.279445964826544e+06 -5.102233313459087e+06 4.417209856548660e+06 -2.805983257188343e+03 -4.282359486272295e+03 -5.742310986267881e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.630000000000000e+02 -1.279502084296997e+06 -5.102318959308037e+06 4.417095009254208e+06 -2.805964428211254e+03 -4.282226454116560e+03 -5.742419848562716e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.640000000000000e+02 -1.279558203419559e+06 -5.102404602545802e+06 4.416980159717042e+06 -2.805945643988480e+03 -4.282093397805608e+03 -5.742528705164031e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.650000000000000e+02 -1.279614322124254e+06 -5.102490243046697e+06 4.416865308102630e+06 -2.805926860891526e+03 -4.281960346425288e+03 -5.742637552401476e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.660000000000000e+02 -1.279670440476802e+06 -5.102575880928799e+06 4.416750454255533e+06 -2.805908074462490e+03 -4.281827289542747e+03 -5.742746400113551e+03 1.906386139200000e-03 6.709393430400000e-04 1.191117863100000e-03 2.278383585100000e-03 1.836064310800000e-03 3.472124541400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.670000000000000e+02 -1.279726558455141e+06 -5.102661516152524e+06 4.416635598227861e+06 -2.805889285870697e+03 -4.281694230917512e+03 -5.742855244940189e+03 1.906327359800000e-03 6.706186422100000e-04 1.191261010900000e-03 2.277565510300000e-03 1.835863948600000e-03 3.473120718900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.680000000000000e+02 -1.279782676070371e+06 -5.102747148737782e+06 4.416520739993399e+06 -2.805870496075871e+03 -4.281561167830239e+03 -5.742964088546234e+03 1.906327359800000e-03 6.706186422100000e-04 1.191261010900000e-03 2.277565510300000e-03 1.835863948600000e-03 3.473120718900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.690000000000000e+02 -1.279838793289458e+06 -5.102832778625303e+06 4.416405879630193e+06 -2.805851704824050e+03 -4.281428106705654e+03 -5.743072926145064e+03 1.906327359800000e-03 6.706186422100000e-04 1.191261010900000e-03 2.277565510300000e-03 1.835863948600000e-03 3.473120718900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.700000000000000e+02 -1.279894910156175e+06 -5.102918405893731e+06 4.416291017034693e+06 -2.805832910523576e+03 -4.281295040086800e+03 -5.743181764091642e+03 1.906327359800000e-03 6.706186422100000e-04 1.191261010900000e-03 2.277565510300000e-03 1.835863948600000e-03 3.473120718900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.710000000000000e+02 -1.279951026648707e+06 -5.103004030503864e+06 4.416176152258510e+06 -2.805814115489270e+03 -4.281161970891010e+03 -5.743290599182586e+03 1.906327359800000e-03 6.706186422100000e-04 1.191261010900000e-03 2.277565510300000e-03 1.835863948600000e-03 3.473120718900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.720000000000000e+02 -1.280007142717958e+06 -5.103089652379040e+06 4.416061285405545e+06 -2.805795069131365e+03 -4.281029028800604e+03 -5.743399438811032e+03 1.906327359800000e-03 6.706186422100000e-04 1.191261010900000e-03 2.277565510300000e-03 1.835863948600000e-03 3.473120718900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.730000000000000e+02 -1.280063258418591e+06 -5.103175271625338e+06 4.415946416338124e+06 -2.805775846600983e+03 -4.280896165040842e+03 -5.743508288271773e+03 1.906327359800000e-03 6.706186422100000e-04 1.191261010900000e-03 2.277565510300000e-03 1.835863948600000e-03 3.473120718900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.740000000000000e+02 -1.280119373729612e+06 -5.103260888185742e+06 4.415831545126399e+06 -2.805757046595906e+03 -4.280763093835842e+03 -5.743617111562724e+03 1.906327359800000e-03 6.706186422100000e-04 1.191261010900000e-03 2.277565510300000e-03 1.835863948600000e-03 3.473120718900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.750000000000000e+02 -1.280175488699060e+06 -5.103346502146542e+06 4.415716671656704e+06 -2.805738243079264e+03 -4.280630014946653e+03 -5.743725937064522e+03 1.906327359800000e-03 6.706186422100000e-04 1.191261010900000e-03 2.277565510300000e-03 1.835863948600000e-03 3.473120718900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.760000000000000e+02 -1.280231603250254e+06 -5.103432113370050e+06 4.415601796110408e+06 -2.805719440411037e+03 -4.280496941282806e+03 -5.743834753098806e+03 1.906327359800000e-03 6.706186422100000e-04 1.191261010900000e-03 2.277565510300000e-03 1.835863948600000e-03 3.473120718900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.770000000000000e+02 -1.280287717459883e+06 -5.103517721994001e+06 4.415486918306090e+06 -2.805700634171057e+03 -4.280363860145862e+03 -5.743943571208394e+03 1.906268516600000e-03 6.702978758300000e-04 1.191403989300000e-03 2.276747549300000e-03 1.835663190900000e-03 3.474116876700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.780000000000000e+02 -1.280343831283950e+06 -5.103603327939428e+06 4.415372038347768e+06 -2.805681826363963e+03 -4.280230778991960e+03 -5.744052384866140e+03 1.906268516600000e-03 6.702978758300000e-04 1.191403989300000e-03 2.276747549300000e-03 1.835663190900000e-03 3.474116876700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.790000000000000e+02 -1.280399944733542e+06 -5.103688931226240e+06 4.415257156209220e+06 -2.805663017460001e+03 -4.280097695510217e+03 -5.744161195632501e+03 1.906268516600000e-03 6.702978758300000e-04 1.191403989300000e-03 2.276747549300000e-03 1.835663190900000e-03 3.474116876700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.800000000000000e+02 -1.280456057830492e+06 -5.103774531893658e+06 4.415142271838760e+06 -2.805644205613575e+03 -4.279964606154267e+03 -5.744270006989320e+03 1.906268516600000e-03 6.702978758300000e-04 1.191403989300000e-03 2.276747549300000e-03 1.835663190900000e-03 3.474116876700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.810000000000000e+02 -1.280512170508856e+06 -5.103860129823348e+06 4.415027385392325e+06 -2.805625393159503e+03 -4.279831522831657e+03 -5.744378808881816e+03 1.906268516600000e-03 6.702978758300000e-04 1.191403989300000e-03 2.276747549300000e-03 1.835663190900000e-03 3.474116876700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.820000000000000e+02 -1.280568282832841e+06 -5.103945725141881e+06 4.414912496719407e+06 -2.805606491645318e+03 -4.279698842298398e+03 -5.744487336728486e+03 1.906268516600000e-03 6.702978758300000e-04 1.191403989300000e-03 2.276747549300000e-03 1.835663190900000e-03 3.474116876700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.830000000000000e+02 -1.280624394770896e+06 -5.104031317800600e+06 4.414797605895503e+06 -2.805587526181225e+03 -4.279566446234290e+03 -5.744595669992283e+03 1.906268516600000e-03 6.702978758300000e-04 1.191403989300000e-03 2.276747549300000e-03 1.835663190900000e-03 3.474116876700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.840000000000000e+02 -1.280680506301905e+06 -5.104116907742329e+06 4.414682712968305e+06 -2.805568709566884e+03 -4.279433356192778e+03 -5.744704463375074e+03 1.906268516600000e-03 6.702978758300000e-04 1.191403989300000e-03 2.276747549300000e-03 1.835663190900000e-03 3.474116876700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.850000000000000e+02 -1.280736617491068e+06 -5.104202495084164e+06 4.414567817783523e+06 -2.805549889332644e+03 -4.279300258846196e+03 -5.744813258723896e+03 1.906268516600000e-03 6.702978758300000e-04 1.191403989300000e-03 2.276747549300000e-03 1.835663190900000e-03 3.474116876700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.860000000000000e+02 -1.280792728294380e+06 -5.104288079747152e+06 4.414452920445194e+06 -2.805531067205353e+03 -4.279167161265011e+03 -5.744922049925223e+03 1.906268516600000e-03 6.702978758300000e-04 1.191403989300000e-03 2.276747549300000e-03 1.835663190900000e-03 3.474116876700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.870000000000000e+02 -1.280848838722943e+06 -5.104373661751200e+06 4.414338020927087e+06 -2.805512244378053e+03 -4.279034061435552e+03 -5.745030838006505e+03 1.906209609700000e-03 6.699770440600000e-04 1.191546798200000e-03 2.275929702200000e-03 1.835462037800000e-03 3.475113014300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.880000000000000e+02 -1.280904948776637e+06 -5.104459241096140e+06 4.414223119229430e+06 -2.805493419289647e+03 -4.278900959788022e+03 -5.745139623301537e+03 1.906209609700000e-03 6.699770440600000e-04 1.191546798200000e-03 2.275929702200000e-03 1.835462037800000e-03 3.475113014300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.890000000000000e+02 -1.280961058433408e+06 -5.104544817742422e+06 4.414108215404349e+06 -2.805474592774142e+03 -4.278767859869127e+03 -5.745248402758034e+03 1.906209609700000e-03 6.699770440600000e-04 1.191546798200000e-03 2.275929702200000e-03 1.835462037800000e-03 3.475113014300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.900000000000000e+02 -1.281017167759205e+06 -5.104630391808407e+06 4.413993309295841e+06 -2.805455763801674e+03 -4.278634750151130e+03 -5.745357185584853e+03 1.906209609700000e-03 6.699770440600000e-04 1.191546798200000e-03 2.275929702200000e-03 1.835462037800000e-03 3.475113014300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.910000000000000e+02 -1.281073276688087e+06 -5.104715963175777e+06 4.413878401059859e+06 -2.805436933410287e+03 -4.278501642347624e+03 -5.745465962428235e+03 1.906209609700000e-03 6.699770440600000e-04 1.191546798200000e-03 2.275929702200000e-03 1.835462037800000e-03 3.475113014300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.920000000000000e+02 -1.281129385222781e+06 -5.104801531850369e+06 4.413763490702376e+06 -2.805418243427207e+03 -4.278368835741445e+03 -5.745574445481687e+03 1.906209609700000e-03 6.699770440600000e-04 1.191546798200000e-03 2.275929702200000e-03 1.835462037800000e-03 3.475113014300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.930000000000000e+02 -1.281185493417586e+06 -5.104887097930252e+06 4.413648578103636e+06 -2.805399650371648e+03 -4.278236230332252e+03 -5.745682729268003e+03 1.906209609700000e-03 6.699770440600000e-04 1.191546798200000e-03 2.275929702200000e-03 1.835462037800000e-03 3.475113014300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.940000000000000e+02 -1.281241601221440e+06 -5.104972661322294e+06 4.413533663363242e+06 -2.805380814698034e+03 -4.278103116374285e+03 -5.745791497625802e+03 1.906209609700000e-03 6.699770440600000e-04 1.191546798200000e-03 2.275929702200000e-03 1.835462037800000e-03 3.475113014300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.950000000000000e+02 -1.281297708650101e+06 -5.105058222054819e+06 4.413418746443855e+06 -2.805361976819807e+03 -4.277970000577932e+03 -5.745900263188904e+03 1.906209609700000e-03 6.699770440600000e-04 1.191546798200000e-03 2.275929702200000e-03 1.835462037800000e-03 3.475113014300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.960000000000000e+02 -1.281353815703692e+06 -5.105143780128028e+06 4.413303827345201e+06 -2.805343138113417e+03 -4.277836882279314e+03 -5.746009025879530e+03 1.906209609700000e-03 6.699770440600000e-04 1.191546798200000e-03 2.275929702200000e-03 1.835462037800000e-03 3.475113014300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.970000000000000e+02 -1.281409922382018e+06 -5.105229335541645e+06 4.413188906067664e+06 -2.805324296556294e+03 -4.277703762458553e+03 -5.746117785808476e+03 1.906150639000000e-03 6.696561470700000e-04 1.191689437600000e-03 2.275111969100000e-03 1.835260489200000e-03 3.476109131300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.980000000000000e+02 -1.281466028685207e+06 -5.105314888295865e+06 4.413073982610972e+06 -2.805305454378530e+03 -4.277570640020612e+03 -5.746226542864480e+03 1.906150639000000e-03 6.696561470700000e-04 1.191689437600000e-03 2.275111969100000e-03 1.835260489200000e-03 3.476109131300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.990000000000000e+02 -1.281522134602171e+06 -5.105400438370847e+06 4.412959057001308e+06 -2.805286610315814e+03 -4.277437517913490e+03 -5.746335295340466e+03 1.906150639000000e-03 6.696561470700000e-04 1.191689437600000e-03 2.275111969100000e-03 1.835260489200000e-03 3.476109131300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.000000000000000e+02 -1.281578240143765e+06 -5.105485985786105e+06 4.412844129212928e+06 -2.805267764080142e+03 -4.277304393540851e+03 -5.746444045333413e+03 1.906150639000000e-03 6.696561470700000e-04 1.191689437600000e-03 2.275111969100000e-03 1.835260489200000e-03 3.476109131300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.010000000000000e+02 -1.281634345321083e+06 -5.105571530561536e+06 4.412729199219610e+06 -2.805248916510370e+03 -4.277171265322488e+03 -5.746552793689982e+03 1.906150639000000e-03 6.696561470700000e-04 1.191689437600000e-03 2.275111969100000e-03 1.835260489200000e-03 3.476109131300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.020000000000000e+02 -1.281690450107593e+06 -5.105657072665113e+06 4.412614267077288e+06 -2.805229843041788e+03 -4.277038512071585e+03 -5.746661347363225e+03 1.906150639000000e-03 6.696561470700000e-04 1.191689437600000e-03 2.275111969100000e-03 1.835260489200000e-03 3.476109131300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.030000000000000e+02 -1.281746554515348e+06 -5.105742612129383e+06 4.412499332752633e+06 -2.805210610264715e+03 -4.276906017508903e+03 -5.746769766610353e+03 1.906150639000000e-03 6.696561470700000e-04 1.191689437600000e-03 2.275111969100000e-03 1.835260489200000e-03 3.476109131300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.040000000000000e+02 -1.281802658519505e+06 -5.105828148883317e+06 4.412384396316031e+06 -2.805191757981926e+03 -4.276772884884222e+03 -5.746878504909087e+03 1.906150639000000e-03 6.696561470700000e-04 1.191689437600000e-03 2.275111969100000e-03 1.835260489200000e-03 3.476109131300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.050000000000000e+02 -1.281858762192069e+06 -5.105913683056189e+06 4.412269457596979e+06 -2.805172901457142e+03 -4.276639742971007e+03 -5.746987246941012e+03 1.906150639000000e-03 6.696561470700000e-04 1.191689437600000e-03 2.275111969100000e-03 1.835260489200000e-03 3.476109131300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.060000000000000e+02 -1.281914865445178e+06 -5.105999214490359e+06 4.412154516803412e+06 -2.805154044629782e+03 -4.276506606607858e+03 -5.747095979754648e+03 1.906150639000000e-03 6.696561470700000e-04 1.191689437600000e-03 2.275111969100000e-03 1.835260489200000e-03 3.476109131300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.070000000000000e+02 -1.281970968333799e+06 -5.106084743284456e+06 4.412039573805233e+06 -2.805135186566887e+03 -4.276373465946503e+03 -5.747204711233883e+03 1.906091604600000e-03 6.693351851700000e-04 1.191831907200000e-03 2.274294350600000e-03 1.835058545400000e-03 3.477105226500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.080000000000000e+02 -1.282027070835803e+06 -5.106170269398826e+06 4.411924628654761e+06 -2.805116326216852e+03 -4.276240325540293e+03 -5.747313438361674e+03 1.906091604600000e-03 6.693351851700000e-04 1.191831907200000e-03 2.274294350600000e-03 1.835058545400000e-03 3.477105226500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.090000000000000e+02 -1.282083172984214e+06 -5.106255792892713e+06 4.411809681273828e+06 -2.805097464129812e+03 -4.276107178998525e+03 -5.747422165764066e+03 1.906091604600000e-03 6.693351851700000e-04 1.191831907200000e-03 2.274294350600000e-03 1.835058545400000e-03 3.477105226500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.100000000000000e+02 -1.282139274746017e+06 -5.106341313706919e+06 4.411694731740545e+06 -2.805078600213002e+03 -4.275974032428167e+03 -5.747530888837142e+03 1.906091604600000e-03 6.693351851700000e-04 1.191831907200000e-03 2.274294350600000e-03 1.835058545400000e-03 3.477105226500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.110000000000000e+02 -1.282195376143031e+06 -5.106426831880637e+06 4.411579780003208e+06 -2.805059733698647e+03 -4.275840882180501e+03 -5.747639610679833e+03 1.906091604600000e-03 6.693351851700000e-04 1.191831907200000e-03 2.274294350600000e-03 1.835058545400000e-03 3.477105226500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.120000000000000e+02 -1.282251477144342e+06 -5.106512347360555e+06 4.411464826144416e+06 -2.805040960389066e+03 -4.275708009213463e+03 -5.747748077154759e+03 1.906091604600000e-03 6.693351851700000e-04 1.191831907200000e-03 2.274294350600000e-03 1.835058545400000e-03 3.477105226500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.130000000000000e+02 -1.282307577770725e+06 -5.106597860185523e+06 4.411349870121493e+06 -2.805022249702033e+03 -4.275575327153216e+03 -5.747856366882505e+03 1.906091604600000e-03 6.693351851700000e-04 1.191831907200000e-03 2.274294350600000e-03 1.835058545400000e-03 3.477105226500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.140000000000000e+02 -1.282363678026998e+06 -5.106683370360524e+06 4.411234911907025e+06 -2.805003378254977e+03 -4.275442172767925e+03 -5.747965078567809e+03 1.906091604600000e-03 6.693351851700000e-04 1.191831907200000e-03 2.274294350600000e-03 1.835058545400000e-03 3.477105226500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.150000000000000e+02 -1.282419777929474e+06 -5.106768877914798e+06 4.411119951462421e+06 -2.804984505265712e+03 -4.275309012022810e+03 -5.748073790614690e+03 1.906091604600000e-03 6.693351851700000e-04 1.191831907200000e-03 2.274294350600000e-03 1.835058545400000e-03 3.477105226500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.160000000000000e+02 -1.282475877412223e+06 -5.106854382730111e+06 4.411004988943720e+06 -2.804965631652187e+03 -4.275175856912603e+03 -5.748182493518066e+03 1.906091604600000e-03 6.693351851700000e-04 1.191831907200000e-03 2.274294350600000e-03 1.835058545400000e-03 3.477105226500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.170000000000000e+02 -1.282531976540940e+06 -5.106939884924363e+06 4.410890024195328e+06 -2.804946755035114e+03 -4.275042696176180e+03 -5.748291196843869e+03 1.906032506300000e-03 6.690141584900000e-04 1.191974206900000e-03 2.273476846500000e-03 1.834856206500000e-03 3.478101299700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.180000000000000e+02 -1.282588075293812e+06 -5.107025384458411e+06 4.410775057268918e+06 -2.804927877501216e+03 -4.274909533350121e+03 -5.748399897021050e+03 1.906032506300000e-03 6.690141584900000e-04 1.191974206900000e-03 2.273476846500000e-03 1.834856206500000e-03 3.478101299700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.190000000000000e+02 -1.282644173681692e+06 -5.107110881351763e+06 4.410660088138730e+06 -2.804908997344578e+03 -4.274776366402264e+03 -5.748508596315739e+03 1.906032506300000e-03 6.690141584900000e-04 1.191974206900000e-03 2.273476846500000e-03 1.834856206500000e-03 3.478101299700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.200000000000000e+02 -1.282700271649633e+06 -5.107196375505880e+06 4.410545116934841e+06 -2.804890116719293e+03 -4.274643205297269e+03 -5.748617286244389e+03 1.906032506300000e-03 6.690141584900000e-04 1.191974206900000e-03 2.273476846500000e-03 1.834856206500000e-03 3.478101299700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.210000000000000e+02 -1.282756369307425e+06 -5.107281867117709e+06 4.410430143397277e+06 -2.804871232717551e+03 -4.274510030605509e+03 -5.748725982801488e+03 1.906032506300000e-03 6.690141584900000e-04 1.191974206900000e-03 2.273476846500000e-03 1.834856206500000e-03 3.478101299700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.220000000000000e+02 -1.282812466528778e+06 -5.107367355977590e+06 4.410315167815122e+06 -2.804852074900025e+03 -4.274377215079717e+03 -5.748834517176007e+03 1.906032506300000e-03 6.690141584900000e-04 1.191974206900000e-03 2.273476846500000e-03 1.834856206500000e-03 3.478101299700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.230000000000000e+02 -1.282868563366035e+06 -5.107452842191138e+06 4.410200190057553e+06 -2.804832725712000e+03 -4.274244640696984e+03 -5.748942944168151e+03 1.906032506300000e-03 6.690141584900000e-04 1.191974206900000e-03 2.273476846500000e-03 1.834856206500000e-03 3.478101299700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.240000000000000e+02 -1.282924659812585e+06 -5.107538325717973e+06 4.410085210156978e+06 -2.804813837534696e+03 -4.274111467513979e+03 -5.749051625939813e+03 1.906032506300000e-03 6.690141584900000e-04 1.191974206900000e-03 2.273476846500000e-03 1.834856206500000e-03 3.478101299700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.250000000000000e+02 -1.282980755893850e+06 -5.107623806603739e+06 4.409970228053132e+06 -2.804794946766628e+03 -4.273978290575739e+03 -5.749160306536612e+03 1.906032506300000e-03 6.690141584900000e-04 1.191974206900000e-03 2.273476846500000e-03 1.834856206500000e-03 3.478101299700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.260000000000000e+02 -1.283036851598992e+06 -5.107709284828974e+06 4.409855243771714e+06 -2.804776055254730e+03 -4.273845111257147e+03 -5.749268984132526e+03 1.906032506300000e-03 6.690141584900000e-04 1.191974206900000e-03 2.273476846500000e-03 1.834856206500000e-03 3.478101299700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.270000000000000e+02 -1.283092946927892e+06 -5.107794760393513e+06 4.409740257312947e+06 -2.804757161432804e+03 -4.273711930179375e+03 -5.749377658918290e+03 1.905973344300000e-03 6.686930673300000e-04 1.192116336500000e-03 2.272659457300000e-03 1.834653472500000e-03 3.479097349900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.280000000000000e+02 -1.283149041880437e+06 -5.107880233297191e+06 4.409625268677051e+06 -2.804738265328433e+03 -4.273578747029878e+03 -5.749486331119658e+03 1.905973344300000e-03 6.686930673300000e-04 1.192116336500000e-03 2.272659457300000e-03 1.834653472500000e-03 3.479097349900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.290000000000000e+02 -1.283205136467716e+06 -5.107965703559881e+06 4.409510277837779e+06 -2.804719368009649e+03 -4.273445559914955e+03 -5.749595001723126e+03 1.905973344300000e-03 6.686930673300000e-04 1.192116336500000e-03 2.272659457300000e-03 1.834653472500000e-03 3.479097349900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.300000000000000e+02 -1.283261230667685e+06 -5.108051171142085e+06 4.409395284847299e+06 -2.804700468970077e+03 -4.273312372582142e+03 -5.749703668096460e+03 1.905973344300000e-03 6.686930673300000e-04 1.192116336500000e-03 2.272659457300000e-03 1.834653472500000e-03 3.479097349900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.310000000000000e+02 -1.283317324502157e+06 -5.108136636082971e+06 4.409280289653884e+06 -2.804681567112387e+03 -4.273179181654507e+03 -5.749812333268691e+03 1.905973344300000e-03 6.686930673300000e-04 1.192116336500000e-03 2.272659457300000e-03 1.834653472500000e-03 3.479097349900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.320000000000000e+02 -1.283373417938384e+06 -5.108222098330185e+06 4.409165292340072e+06 -2.804662666342765e+03 -4.273046313581209e+03 -5.749920747655823e+03 1.905973344300000e-03 6.686930673300000e-04 1.192116336500000e-03 2.272659457300000e-03 1.834653472500000e-03 3.479097349900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.330000000000000e+02 -1.283429510979883e+06 -5.108307557894566e+06 4.409050292900916e+06 -2.804643764110103e+03 -4.272913670453676e+03 -5.750028986710843e+03 1.905973344300000e-03 6.686930673300000e-04 1.192116336500000e-03 2.272659457300000e-03 1.834653472500000e-03 3.479097349900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.340000000000000e+02 -1.283485603669352e+06 -5.108393014841805e+06 4.408935291226891e+06 -2.804624858076585e+03 -4.272780472958061e+03 -5.750137643251053e+03 1.905973344300000e-03 6.686930673300000e-04 1.192116336500000e-03 2.272659457300000e-03 1.834653472500000e-03 3.479097349900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.350000000000000e+02 -1.283541695971335e+06 -5.108478469108361e+06 4.408820287401942e+06 -2.804605950028805e+03 -4.272647275581501e+03 -5.750246295429742e+03 1.905973344300000e-03 6.686930673300000e-04 1.192116336500000e-03 2.272659457300000e-03 1.834653472500000e-03 3.479097349900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.360000000000000e+02 -1.283597787896680e+06 -5.108563920713729e+06 4.408705281400318e+06 -2.804587039947304e+03 -4.272514076343768e+03 -5.750354944758918e+03 1.905973344300000e-03 6.686930673300000e-04 1.192116336500000e-03 2.272659457300000e-03 1.834653472500000e-03 3.479097349900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.370000000000000e+02 -1.283653879445514e+06 -5.108649369658115e+06 4.408590273221748e+06 -2.804568129082197e+03 -4.272380874589976e+03 -5.750463591207093e+03 1.905914118400000e-03 6.683719118600000e-04 1.192258296000000e-03 2.271842183200000e-03 1.834450343700000e-03 3.480093376400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.380000000000000e+02 -1.283709970628685e+06 -5.108734815961023e+06 4.408475262840464e+06 -2.804549215322687e+03 -4.272247669269605e+03 -5.750572236464504e+03 1.905914118400000e-03 6.683719118600000e-04 1.192258296000000e-03 2.271842183200000e-03 1.834450343700000e-03 3.480093376400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.390000000000000e+02 -1.283766061413182e+06 -5.108820259563292e+06 4.408360250334634e+06 -2.804530300361737e+03 -4.272114465640828e+03 -5.750680875823144e+03 1.905914118400000e-03 6.683719118600000e-04 1.192258296000000e-03 2.271842183200000e-03 1.834450343700000e-03 3.480093376400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.400000000000000e+02 -1.283822151810096e+06 -5.108905700484798e+06 4.408245235678005e+06 -2.804511385014743e+03 -4.271981261525428e+03 -5.750789510592184e+03 1.905914118400000e-03 6.683719118600000e-04 1.192258296000000e-03 2.271842183200000e-03 1.834450343700000e-03 3.480093376400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.410000000000000e+02 -1.283878241863172e+06 -5.108991138804024e+06 4.408130218766877e+06 -2.804492466160167e+03 -4.271848050020208e+03 -5.750898147332041e+03 1.905914118400000e-03 6.683719118600000e-04 1.192258296000000e-03 2.271842183200000e-03 1.834450343700000e-03 3.480093376400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.420000000000000e+02 -1.283934331516991e+06 -5.109076574427203e+06 4.408015199734733e+06 -2.804473521747252e+03 -4.271715075682235e+03 -5.751006609716784e+03 1.905914118400000e-03 6.683719118600000e-04 1.192258296000000e-03 2.271842183200000e-03 1.834450343700000e-03 3.480093376400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.430000000000000e+02 -1.283990420832865e+06 -5.109162007468143e+06 4.407900178437877e+06 -2.804454558210442e+03 -4.271582255541986e+03 -5.751114958014618e+03 1.905914118400000e-03 6.683719118600000e-04 1.192258296000000e-03 2.271842183200000e-03 1.834450343700000e-03 3.480093376400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.440000000000000e+02 -1.284046509710609e+06 -5.109247437737794e+06 4.407785155109868e+06 -2.804435635270760e+03 -4.271449043573264e+03 -5.751223581443453e+03 1.905914118400000e-03 6.683719118600000e-04 1.192258296000000e-03 2.271842183200000e-03 1.834450343700000e-03 3.480093376400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.450000000000000e+02 -1.284102598233328e+06 -5.109332865385210e+06 4.407670129553732e+06 -2.804416709328953e+03 -4.271315826052361e+03 -5.751332205233858e+03 1.905914118400000e-03 6.683719118600000e-04 1.192258296000000e-03 2.271842183200000e-03 1.834450343700000e-03 3.480093376400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.460000000000000e+02 -1.284158686357289e+06 -5.109418290331962e+06 4.407555101873117e+06 -2.804397783402419e+03 -4.271182609695367e+03 -5.751440823012688e+03 1.905914118400000e-03 6.683719118600000e-04 1.192258296000000e-03 2.271842183200000e-03 1.834450343700000e-03 3.480093376400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.470000000000000e+02 -1.284214774148083e+06 -5.109503712695707e+06 4.407440071912514e+06 -2.804378852989093e+03 -4.271049384135070e+03 -5.751549444551260e+03 1.905854828700000e-03 6.680506922499999e-04 1.192400085100000e-03 2.271025024300000e-03 1.834246820000000e-03 3.481089378800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.480000000000000e+02 -1.284270861551010e+06 -5.109589132378371e+06 4.407325039801569e+06 -2.804359922145217e+03 -4.270916158408172e+03 -5.751658061276348e+03 1.905854828700000e-03 6.680506922499999e-04 1.192400085100000e-03 2.271025024300000e-03 1.834246820000000e-03 3.481089378800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.490000000000000e+02 -1.284326948565960e+06 -5.109674549379786e+06 4.407210005540495e+06 -2.804340989599808e+03 -4.270782932458600e+03 -5.751766673768115e+03 1.905854828700000e-03 6.680506922499999e-04 1.192400085100000e-03 2.271025024300000e-03 1.834246820000000e-03 3.481089378800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.500000000000000e+02 -1.284383035203778e+06 -5.109759963719435e+06 4.407094969103537e+06 -2.804322054765423e+03 -4.270649704516906e+03 -5.751875283617703e+03 1.905854828700000e-03 6.680506922499999e-04 1.192400085100000e-03 2.271025024300000e-03 1.834246820000000e-03 3.481089378800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.510000000000000e+02 -1.284439121464592e+06 -5.109845375397537e+06 4.406979930490422e+06 -2.804303119155303e+03 -4.270516474435532e+03 -5.751983890297324e+03 1.905854828700000e-03 6.680506922499999e-04 1.192400085100000e-03 2.271025024300000e-03 1.834246820000000e-03 3.481089378800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.520000000000000e+02 -1.284495207305267e+06 -5.109930784344469e+06 4.406864889812598e+06 -2.804284224615571e+03 -4.270383707626755e+03 -5.752092122992807e+03 1.905854828700000e-03 6.680506922499999e-04 1.192400085100000e-03 2.271025024300000e-03 1.834246820000000e-03 3.481089378800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.530000000000000e+02 -1.284551292805300e+06 -5.110016190708165e+06 4.406749846888044e+06 -2.804265354768956e+03 -4.270251251483525e+03 -5.752200104441359e+03 1.905854828700000e-03 6.680506922499999e-04 1.192400085100000e-03 2.271025024300000e-03 1.834246820000000e-03 3.481089378800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.540000000000000e+02 -1.284607377904876e+06 -5.110101594368333e+06 4.406634801842847e+06 -2.804246414481921e+03 -4.270118017033456e+03 -5.752308701040227e+03 1.905854828700000e-03 6.680506922499999e-04 1.192400085100000e-03 2.271025024300000e-03 1.834246820000000e-03 3.481089378800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.550000000000000e+02 -1.284663462671080e+06 -5.110186995445280e+06 4.406519754517925e+06 -2.804227469864471e+03 -4.269984773357598e+03 -5.752417301347289e+03 1.905854828700000e-03 6.680506922499999e-04 1.192400085100000e-03 2.271025024300000e-03 1.834246820000000e-03 3.481089378800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.560000000000000e+02 -1.284719547016089e+06 -5.110272393781614e+06 4.406404705121414e+06 -2.804208524930394e+03 -4.269851535290134e+03 -5.752525892412696e+03 1.905854828700000e-03 6.680506922499999e-04 1.192400085100000e-03 2.271025024300000e-03 1.834246820000000e-03 3.481089378800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.570000000000000e+02 -1.284775630994845e+06 -5.110357789475804e+06 4.406289653523092e+06 -2.804189578792380e+03 -4.269718292837593e+03 -5.752634482192499e+03 1.905795475100000e-03 6.677294088100000e-04 1.192541703700000e-03 2.270207981000000e-03 1.834042901700000e-03 3.482085356100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.580000000000000e+02 -1.284831714585224e+06 -5.110443182488263e+06 4.406174599775329e+06 -2.804170630277608e+03 -4.269585050718063e+03 -5.752743067603660e+03 1.905795475100000e-03 6.677294088100000e-04 1.192541703700000e-03 2.270207981000000e-03 1.834042901700000e-03 3.482085356100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.590000000000000e+02 -1.284887797820245e+06 -5.110528572878148e+06 4.406059543799878e+06 -2.804151680177241e+03 -4.269451802328586e+03 -5.752851653319913e+03 1.905795475100000e-03 6.677294088100000e-04 1.192541703700000e-03 2.270207981000000e-03 1.834042901700000e-03 3.482085356100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.600000000000000e+02 -1.284943880666900e+06 -5.110613960586340e+06 4.405944485674932e+06 -2.804132728220490e+03 -4.269318554078309e+03 -5.752960234594586e+03 1.905795475100000e-03 6.677294088100000e-04 1.192541703700000e-03 2.270207981000000e-03 1.834042901700000e-03 3.482085356100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.610000000000000e+02 -1.284999963114113e+06 -5.110699345593027e+06 4.405829425426704e+06 -2.804113774976275e+03 -4.269185307593682e+03 -5.753068809954040e+03 1.905795475100000e-03 6.677294088100000e-04 1.192541703700000e-03 2.270207981000000e-03 1.834042901700000e-03 3.482085356100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.620000000000000e+02 -1.285056045222105e+06 -5.110784728019627e+06 4.405714362899084e+06 -2.804094535184599e+03 -4.269052216749851e+03 -5.753177383245855e+03 1.905795475100000e-03 6.677294088100000e-04 1.192541703700000e-03 2.270207981000000e-03 1.834042901700000e-03 3.482085356100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.630000000000000e+02 -1.285112126907965e+06 -5.110870107726963e+06 4.405599298279275e+06 -2.804075096374486e+03 -4.268919244755111e+03 -5.753285945369116e+03 1.905795475100000e-03 6.677294088100000e-04 1.192541703700000e-03 2.270207981000000e-03 1.834042901700000e-03 3.482085356100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.640000000000000e+02 -1.285168208219842e+06 -5.110955484778496e+06 4.405484231475736e+06 -2.804056136865292e+03 -4.268785988245039e+03 -5.753394515563977e+03 1.905795475100000e-03 6.677294088100000e-04 1.192541703700000e-03 2.270207981000000e-03 1.834042901700000e-03 3.482085356100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.650000000000000e+02 -1.285224289154220e+06 -5.111040859167913e+06 4.405369162496836e+06 -2.804037176536838e+03 -4.268652729877482e+03 -5.753503082393435e+03 1.905795475100000e-03 6.677294088100000e-04 1.192541703700000e-03 2.270207981000000e-03 1.834042901700000e-03 3.482085356100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.660000000000000e+02 -1.285280369710984e+06 -5.111126230895047e+06 4.405254091342786e+06 -2.804018214029957e+03 -4.268519469288318e+03 -5.753611646707955e+03 1.905795475100000e-03 6.677294088100000e-04 1.192541703700000e-03 2.270207981000000e-03 1.834042901700000e-03 3.482085356100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.670000000000000e+02 -1.285336449890019e+06 -5.111211599959725e+06 4.405139018013815e+06 -2.803999249260503e+03 -4.268386206849785e+03 -5.753720208260858e+03 1.905736057700000e-03 6.674080616700000e-04 1.192683151700000e-03 2.269391053200000e-03 1.833838588900000e-03 3.483081307800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.680000000000000e+02 -1.285392529691451e+06 -5.111296966362162e+06 4.405023942509648e+06 -2.803980283779277e+03 -4.268252942135494e+03 -5.753828766720105e+03 1.905736057700000e-03 6.674080616700000e-04 1.192683151700000e-03 2.269391053200000e-03 1.833838588900000e-03 3.483081307800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.690000000000000e+02 -1.285448609115164e+06 -5.111382330102198e+06 4.404908864830502e+06 -2.803961315841394e+03 -4.268119675530489e+03 -5.753937322531094e+03 1.905736057700000e-03 6.674080616700000e-04 1.192683151700000e-03 2.269391053200000e-03 1.833838588900000e-03 3.483081307800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.700000000000000e+02 -1.285504688150080e+06 -5.111467691160013e+06 4.404793785002599e+06 -2.803942346345396e+03 -4.267986408917226e+03 -5.754045873887208e+03 1.905736057700000e-03 6.674080616700000e-04 1.192683151700000e-03 2.269391053200000e-03 1.833838588900000e-03 3.483081307800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.710000000000000e+02 -1.285560766807285e+06 -5.111553049555463e+06 4.404678702999668e+06 -2.803923375920962e+03 -4.267853139882074e+03 -5.754154422352156e+03 1.905736057700000e-03 6.674080616700000e-04 1.192683151700000e-03 2.269391053200000e-03 1.833838588900000e-03 3.483081307800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.720000000000000e+02 -1.285616845098298e+06 -5.111638405318195e+06 4.404563618804193e+06 -2.803904439593704e+03 -4.267720381315753e+03 -5.754262564366303e+03 1.905736057700000e-03 6.674080616700000e-04 1.192683151700000e-03 2.269391053200000e-03 1.833838588900000e-03 3.483081307800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.730000000000000e+02 -1.285672923002324e+06 -5.111723758417157e+06 4.404448532472409e+06 -2.803885528611889e+03 -4.267587978932448e+03 -5.754370420611231e+03 1.905736057700000e-03 6.674080616700000e-04 1.192683151700000e-03 2.269391053200000e-03 1.833838588900000e-03 3.483081307800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.740000000000000e+02 -1.285729000504185e+06 -5.111809108810024e+06 4.404333444023489e+06 -2.803866552334947e+03 -4.267454704191942e+03 -5.754478960531183e+03 1.905736057700000e-03 6.674080616700000e-04 1.192683151700000e-03 2.269391053200000e-03 1.833838588900000e-03 3.483081307800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.750000000000000e+02 -1.285785077660918e+06 -5.111894456599047e+06 4.404218353322108e+06 -2.803847572613915e+03 -4.267321421920773e+03 -5.754587502494382e+03 1.905736057700000e-03 6.674080616700000e-04 1.192683151700000e-03 2.269391053200000e-03 1.833838588900000e-03 3.483081307800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.760000000000000e+02 -1.285841154395923e+06 -5.111979801646933e+06 4.404103260549972e+06 -2.803828593858475e+03 -4.267188144596936e+03 -5.754696035181372e+03 1.905736057700000e-03 6.674080616700000e-04 1.192683151700000e-03 2.269391053200000e-03 1.833838588900000e-03 3.483081307800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.770000000000000e+02 -1.285897230785811e+06 -5.112065144091012e+06 4.403988165525320e+06 -2.803809611613570e+03 -4.267054859948384e+03 -5.754804569774403e+03 1.905676576500000e-03 6.670866511400000e-04 1.192824428900000e-03 2.268574241600000e-03 1.833633881600000e-03 3.484077233000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.780000000000000e+02 -1.285953306775659e+06 -5.112150483832913e+06 4.403873068378361e+06 -2.803790627803772e+03 -4.266921576944819e+03 -5.754913098663198e+03 1.905676576500000e-03 6.670866511400000e-04 1.192824428900000e-03 2.268574241600000e-03 1.833633881600000e-03 3.484077233000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.790000000000000e+02 -1.286009382409439e+06 -5.112235820951409e+06 4.403757969004833e+06 -2.803771642484313e+03 -4.266788288285700e+03 -5.755021627356434e+03 1.905676576500000e-03 6.670866511400000e-04 1.192824428900000e-03 2.268574241600000e-03 1.833633881600000e-03 3.484077233000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.800000000000000e+02 -1.286065457654153e+06 -5.112321155387410e+06 4.403642867482946e+06 -2.803752655347574e+03 -4.266654999110269e+03 -5.755130152089867e+03 1.905676576500000e-03 6.670866511400000e-04 1.192824428900000e-03 2.268574241600000e-03 1.833633881600000e-03 3.484077233000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.810000000000000e+02 -1.286121532520641e+06 -5.112406487160394e+06 4.403527763786931e+06 -2.803733665780971e+03 -4.266521708489510e+03 -5.755238673826255e+03 1.905676576500000e-03 6.670866511400000e-04 1.192824428900000e-03 2.268574241600000e-03 1.833633881600000e-03 3.484077233000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.820000000000000e+02 -1.286177606986255e+06 -5.112491816234142e+06 4.403412657970302e+06 -2.803714633488466e+03 -4.266388561470211e+03 -5.755347099675462e+03 1.905676576500000e-03 6.670866511400000e-04 1.192824428900000e-03 2.268574241600000e-03 1.833633881600000e-03 3.484077233000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.830000000000000e+02 -1.286233681077863e+06 -5.112577142659954e+06 4.403297549969056e+06 -2.803695567523700e+03 -4.266255510787450e+03 -5.755455461616548e+03 1.905676576500000e-03 6.670866511400000e-04 1.192824428900000e-03 2.268574241600000e-03 1.833633881600000e-03 3.484077233000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.840000000000000e+02 -1.286289754802759e+06 -5.112662466443392e+06 4.403182439766339e+06 -2.803676573403606e+03 -4.266122211588759e+03 -5.755563976366439e+03 1.905676576500000e-03 6.670866511400000e-04 1.192824428900000e-03 2.268574241600000e-03 1.833633881600000e-03 3.484077233000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.850000000000000e+02 -1.286345828138411e+06 -5.112747787544136e+06 4.403067327415555e+06 -2.803657577307490e+03 -4.265988912463520e+03 -5.755672486777101e+03 1.905676576500000e-03 6.670866511400000e-04 1.192824428900000e-03 2.268574241600000e-03 1.833633881600000e-03 3.484077233000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.860000000000000e+02 -1.286401901106626e+06 -5.112833106001297e+06 4.402952212864920e+06 -2.803638578637103e+03 -4.265855609729278e+03 -5.755780995890641e+03 1.905676576500000e-03 6.670866511400000e-04 1.192824428900000e-03 2.268574241600000e-03 1.833633881600000e-03 3.484077233000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.870000000000000e+02 -1.286457973674649e+06 -5.112918421756175e+06 4.402837096192172e+06 -2.803619580081669e+03 -4.265722308318424e+03 -5.755889498835357e+03 1.905617031300000e-03 6.667651773900000e-04 1.192965535200000e-03 2.267757546100000e-03 1.833428780000000e-03 3.485073131200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.880000000000000e+02 -1.286514045864285e+06 -5.113003734847872e+06 4.402721977345521e+06 -2.803600579323735e+03 -4.265589004885779e+03 -5.755997999123883e+03 1.905617031300000e-03 6.667651773900000e-04 1.192965535200000e-03 2.267757546100000e-03 1.833428780000000e-03 3.485073131200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.890000000000000e+02 -1.286570117708296e+06 -5.113089045335131e+06 4.402606856247180e+06 -2.803581574901281e+03 -4.265455694155155e+03 -5.756106501369412e+03 1.905617031300000e-03 6.667651773900000e-04 1.192965535200000e-03 2.267757546100000e-03 1.833428780000000e-03 3.485073131200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.900000000000000e+02 -1.286626189152008e+06 -5.113174353119984e+06 4.402491733026893e+06 -2.803562570545235e+03 -4.265322384652763e+03 -5.756214997538976e+03 1.905617031300000e-03 6.667651773900000e-04 1.192965535200000e-03 2.267757546100000e-03 1.833428780000000e-03 3.485073131200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.910000000000000e+02 -1.286682260206267e+06 -5.113259658221900e+06 4.402376607658882e+06 -2.803543564422424e+03 -4.265189075184503e+03 -5.756323489311318e+03 1.905617031300000e-03 6.667651773900000e-04 1.192965535200000e-03 2.267757546100000e-03 1.833428780000000e-03 3.485073131200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.920000000000000e+02 -1.286738330880097e+06 -5.113344960668077e+06 4.402261480122424e+06 -2.803524464881888e+03 -4.265056149631571e+03 -5.756431724688684e+03 1.905617031300000e-03 6.667651773900000e-04 1.192965535200000e-03 2.267757546100000e-03 1.833428780000000e-03 3.485073131200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.930000000000000e+02 -1.286794401191233e+06 -5.113430260497920e+06 4.402146350375975e+06 -2.803505300055589e+03 -4.264923486998884e+03 -5.756539783436724e+03 1.905617031300000e-03 6.667651773900000e-04 1.192965535200000e-03 2.267757546100000e-03 1.833428780000000e-03 3.485073131200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.940000000000000e+02 -1.286850471095368e+06 -5.113515557613459e+06 4.402031218523376e+06 -2.803486288737857e+03 -4.264790171533631e+03 -5.756648266586712e+03 1.905617031300000e-03 6.667651773900000e-04 1.192965535200000e-03 2.267757546100000e-03 1.833428780000000e-03 3.485073131200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.950000000000000e+02 -1.286906540620785e+06 -5.113600852065410e+06 4.401916084497439e+06 -2.803467275114746e+03 -4.264656854123459e+03 -5.756756747065720e+03 1.905617031300000e-03 6.667651773900000e-04 1.192965535200000e-03 2.267757546100000e-03 1.833428780000000e-03 3.485073131200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.960000000000000e+02 -1.286962609800489e+06 -5.113686143912870e+06 4.401800948219867e+06 -2.803448259320743e+03 -4.264523528819873e+03 -5.756865229320409e+03 1.905617031300000e-03 6.667651773900000e-04 1.192965535200000e-03 2.267757546100000e-03 1.833428780000000e-03 3.485073131200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.970000000000000e+02 -1.287018678579487e+06 -5.113771433057402e+06 4.401685809821082e+06 -2.803429241525319e+03 -4.264390205554311e+03 -5.756973705760101e+03 1.905557422200000e-03 6.664436405900000e-04 1.193106470400000e-03 2.266940966900000e-03 1.833223284200000e-03 3.486069001700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.980000000000000e+02 -1.287074746968871e+06 -5.113856719518842e+06 4.401570669274804e+06 -2.803410223751747e+03 -4.264256881619712e+03 -5.757082177580313e+03 1.905557422200000e-03 6.664436405900000e-04 1.193106470400000e-03 2.266940966900000e-03 1.833223284200000e-03 3.486069001700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.990000000000000e+02 -1.287130814990437e+06 -5.113942003336289e+06 4.401455526529240e+06 -2.803391203049001e+03 -4.264123554094806e+03 -5.757190648238369e+03 1.905557422200000e-03 6.664436405900000e-04 1.193106470400000e-03 2.266940966900000e-03 1.833223284200000e-03 3.486069001700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.000000000000000e+02 -1.287186882622152e+06 -5.114027284470320e+06 4.401340381636631e+06 -2.803372180626488e+03 -4.263990226663703e+03 -5.757299114434905e+03 1.905557422200000e-03 6.664436405900000e-04 1.193106470400000e-03 2.266940966900000e-03 1.833223284200000e-03 3.486069001700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.010000000000000e+02 -1.287242949897017e+06 -5.114112562980010e+06 4.401225234518670e+06 -2.803353156455227e+03 -4.263856892945983e+03 -5.757407581011666e+03 1.905557422200000e-03 6.664436405900000e-04 1.193106470400000e-03 2.266940966900000e-03 1.833223284200000e-03 3.486069001700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.020000000000000e+02 -1.287299016760973e+06 -5.114197838774255e+06 4.401110085311399e+06 -2.803334173381568e+03 -4.263723921321453e+03 -5.757515751050747e+03 1.905557422200000e-03 6.664436405900000e-04 1.193106470400000e-03 2.266940966900000e-03 1.833223284200000e-03 3.486069001700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.030000000000000e+02 -1.287355083260623e+06 -5.114283111940534e+06 4.400994933909546e+06 -2.803315216188801e+03 -4.263591194329118e+03 -5.757623719898452e+03 1.905557422200000e-03 6.664436405900000e-04 1.193106470400000e-03 2.266940966900000e-03 1.833223284200000e-03 3.486069001700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.040000000000000e+02 -1.287411149366600e+06 -5.114368382416579e+06 4.400879780369683e+06 -2.803296187353928e+03 -4.263457856516642e+03 -5.757732176173228e+03 1.905557422200000e-03 6.664436405900000e-04 1.193106470400000e-03 2.266940966900000e-03 1.833223284200000e-03 3.486069001700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.050000000000000e+02 -1.287467215115501e+06 -5.114453650268010e+06 4.400764624604854e+06 -2.803277155128838e+03 -4.263324513142109e+03 -5.757840632972003e+03 1.905557422200000e-03 6.664436405900000e-04 1.193106470400000e-03 2.266940966900000e-03 1.833223284200000e-03 3.486069001700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.060000000000000e+02 -1.287523280441473e+06 -5.114538915376909e+06 4.400649466771360e+06 -2.803258122537964e+03 -4.263191175219919e+03 -5.757949080683125e+03 1.905557422200000e-03 6.664436405900000e-04 1.193106470400000e-03 2.266940966900000e-03 1.833223284200000e-03 3.486069001700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.070000000000000e+02 -1.287579345388470e+06 -5.114624177821985e+06 4.400534306764876e+06 -2.803239089399183e+03 -4.263057835039708e+03 -5.758057525218524e+03 1.905497749200000e-03 6.661220410500000e-04 1.193247234300000e-03 2.266124504400000e-03 1.833017394400000e-03 3.487064843700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.080000000000000e+02 -1.287635410011077e+06 -5.114709437701065e+06 4.400419144455723e+06 -2.803220050830841e+03 -4.262924483891992e+03 -5.758165975228431e+03 1.905497749200000e-03 6.661220410500000e-04 1.193247234300000e-03 2.266124504400000e-03 1.833017394400000e-03 3.487064843700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.090000000000000e+02 -1.287691474199854e+06 -5.114794694818117e+06 4.400303980103758e+06 -2.803201014093140e+03 -4.262791139446569e+03 -5.758274414278719e+03 1.905497749200000e-03 6.661220410500000e-04 1.193247234300000e-03 2.266124504400000e-03 1.833017394400000e-03 3.487064843700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.100000000000000e+02 -1.287747538053295e+06 -5.114879949349586e+06 4.400188813475084e+06 -2.803181973109209e+03 -4.262657785887574e+03 -5.758382856900746e+03 1.905497749200000e-03 6.661220410500000e-04 1.193247234300000e-03 2.266124504400000e-03 1.833017394400000e-03 3.487064843700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.110000000000000e+02 -1.287803601505542e+06 -5.114965201177578e+06 4.400073644726004e+06 -2.803162930786080e+03 -4.262524434274051e+03 -5.758491293500399e+03 1.905497749200000e-03 6.661220410500000e-04 1.193247234300000e-03 2.266124504400000e-03 1.833017394400000e-03 3.487064843700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.120000000000000e+02 -1.287859664554604e+06 -5.115050450307036e+06 4.399958473858929e+06 -2.803143782541853e+03 -4.262391320607097e+03 -5.758599589660706e+03 1.905497749200000e-03 6.661220410500000e-04 1.193247234300000e-03 2.266124504400000e-03 1.833017394400000e-03 3.487064843700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.130000000000000e+02 -1.287915727218629e+06 -5.115135696776466e+06 4.399843300829062e+06 -2.803124557760747e+03 -4.262258370191722e+03 -5.758707789493588e+03 1.905497749200000e-03 6.661220410500000e-04 1.193247234300000e-03 2.266124504400000e-03 1.833017394400000e-03 3.487064843700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.140000000000000e+02 -1.287971789548613e+06 -5.115220940662733e+06 4.399728125519264e+06 -2.803105508915357e+03 -4.262125006866780e+03 -5.758816222325813e+03 1.905497749200000e-03 6.661220410500000e-04 1.193247234300000e-03 2.266124504400000e-03 1.833017394400000e-03 3.487064843700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.150000000000000e+02 -1.288027851455512e+06 -5.115306181806367e+06 4.399612948140997e+06 -2.803086460989503e+03 -4.261991648441753e+03 -5.758924645948366e+03 1.905497749200000e-03 6.661220410500000e-04 1.193247234300000e-03 2.266124504400000e-03 1.833017394400000e-03 3.487064843700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.160000000000000e+02 -1.288083912983038e+06 -5.115391420285688e+06 4.399497768590417e+06 -2.803067410926079e+03 -4.261858288427308e+03 -5.759033066560192e+03 1.905497749200000e-03 6.661220410500000e-04 1.193247234300000e-03 2.266124504400000e-03 1.833017394400000e-03 3.487064843700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.170000000000000e+02 -1.288139974163942e+06 -5.115476656159387e+06 4.399382586789685e+06 -2.803048357053939e+03 -4.261724920786910e+03 -5.759141489431920e+03 1.905438012300000e-03 6.658003788999999e-04 1.193387826900000e-03 2.265308158600000e-03 1.832811110600000e-03 3.488060656700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.180000000000000e+02 -1.288196034943569e+06 -5.115561889329570e+06 4.399267402868624e+06 -2.803029303421715e+03 -4.261591554466871e+03 -5.759249906088819e+03 1.905438012300000e-03 6.658003788999999e-04 1.193387826900000e-03 2.265308158600000e-03 1.832811110600000e-03 3.488060656700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.190000000000000e+02 -1.288252095321807e+06 -5.115647119796083e+06 4.399152216827453e+06 -2.803010248515722e+03 -4.261458190069335e+03 -5.759358316714627e+03 1.905438012300000e-03 6.658003788999999e-04 1.193387826900000e-03 2.265308158600000e-03 1.832811110600000e-03 3.488060656700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.200000000000000e+02 -1.288308155342360e+06 -5.115732347637231e+06 4.399037028562322e+06 -2.802991190356157e+03 -4.261324820096776e+03 -5.759466727814665e+03 1.905438012300000e-03 6.658003788999999e-04 1.193387826900000e-03 2.265308158600000e-03 1.832811110600000e-03 3.488060656700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.210000000000000e+02 -1.288364214994399e+06 -5.115817572833593e+06 4.398921838098970e+06 -2.802972130977203e+03 -4.261191445783593e+03 -5.759575137596882e+03 1.905438012300000e-03 6.658003788999999e-04 1.193387826900000e-03 2.265308158600000e-03 1.832811110600000e-03 3.488060656700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.220000000000000e+02 -1.288420274254113e+06 -5.115902795353240e+06 4.398806645494830e+06 -2.802952984040263e+03 -4.261058450555754e+03 -5.759683292552165e+03 1.905438012300000e-03 6.658003788999999e-04 1.193387826900000e-03 2.265308158600000e-03 1.832811110600000e-03 3.488060656700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.230000000000000e+02 -1.288476333092463e+06 -5.115988015151588e+06 4.398691450819564e+06 -2.802933777909675e+03 -4.260925723138477e+03 -5.759791264874044e+03 1.905438012300000e-03 6.658003788999999e-04 1.193387826900000e-03 2.265308158600000e-03 1.832811110600000e-03 3.488060656700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.240000000000000e+02 -1.288532391581865e+06 -5.116073232340274e+06 4.398576253899493e+06 -2.802914712779984e+03 -4.260792342913602e+03 -5.759899666196868e+03 1.905438012300000e-03 6.658003788999999e-04 1.193387826900000e-03 2.265308158600000e-03 1.832811110600000e-03 3.488060656700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.250000000000000e+02 -1.288588449702448e+06 -5.116158446883767e+06 4.398461054781763e+06 -2.802895644871784e+03 -4.260658959194275e+03 -5.760008066219392e+03 1.905438012300000e-03 6.658003788999999e-04 1.193387826900000e-03 2.265308158600000e-03 1.832811110600000e-03 3.488060656700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.260000000000000e+02 -1.288644507399571e+06 -5.116243658684216e+06 4.398345853596207e+06 -2.802876578160038e+03 -4.260525580464524e+03 -5.760116456850970e+03 1.905438012300000e-03 6.658003788999999e-04 1.193387826900000e-03 2.265308158600000e-03 1.832811110600000e-03 3.488060656700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.270000000000000e+02 -1.288700564738841e+06 -5.116328867859123e+06 4.398230650186912e+06 -2.802857508201494e+03 -4.260392196042893e+03 -5.760224848041235e+03 1.905378211400000e-03 6.654786544600000e-04 1.193528248000000e-03 2.264491930000000e-03 1.832604432900000e-03 3.489056439700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.280000000000000e+02 -1.288756621698234e+06 -5.116414074369109e+06 4.398115444606147e+06 -2.802838435903409e+03 -4.260258809842895e+03 -5.760333236448824e+03 1.905378211400000e-03 6.654786544600000e-04 1.193528248000000e-03 2.264491930000000e-03 1.832604432900000e-03 3.489056439700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.290000000000000e+02 -1.288812678277874e+06 -5.116499278214367e+06 4.398000236853638e+06 -2.802819362975247e+03 -4.260125421227493e+03 -5.760441621834206e+03 1.905378211400000e-03 6.654786544600000e-04 1.193528248000000e-03 2.264491930000000e-03 1.832604432900000e-03 3.489056439700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.300000000000000e+02 -1.288868734488604e+06 -5.116584479414353e+06 4.397885026903577e+06 -2.802800287272475e+03 -4.259992028964664e+03 -5.760550006033103e+03 1.905378211400000e-03 6.654786544600000e-04 1.193528248000000e-03 2.264491930000000e-03 1.832604432900000e-03 3.489056439700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.310000000000000e+02 -1.288924790286487e+06 -5.116669677890464e+06 4.397769814860293e+06 -2.802781210631253e+03 -4.259858640419221e+03 -5.760658382704624e+03 1.905378211400000e-03 6.654786544600000e-04 1.193528248000000e-03 2.264491930000000e-03 1.832604432900000e-03 3.489056439700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.320000000000000e+02 -1.288980845721780e+06 -5.116754873749075e+06 4.397654600597555e+06 -2.802761900152731e+03 -4.259725651677686e+03 -5.760766550711428e+03 1.905378211400000e-03 6.654786544600000e-04 1.193528248000000e-03 2.264491930000000e-03 1.832604432900000e-03 3.489056439700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.330000000000000e+02 -1.289036900761973e+06 -5.116840066943523e+06 4.397539384187737e+06 -2.802742424770073e+03 -4.259592944597644e+03 -5.760874570284466e+03 1.905378211400000e-03 6.654786544600000e-04 1.193528248000000e-03 2.264491930000000e-03 1.832604432900000e-03 3.489056439700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.340000000000000e+02 -1.289092955422504e+06 -5.116925257473519e+06 4.397424165605820e+06 -2.802723342480097e+03 -4.259459543888455e+03 -5.760982943167215e+03 1.905378211400000e-03 6.654786544600000e-04 1.193528248000000e-03 2.264491930000000e-03 1.832604432900000e-03 3.489056439700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.350000000000000e+02 -1.289149009659179e+06 -5.117010445260013e+06 4.397308944956769e+06 -2.802704259815642e+03 -4.259326149060232e+03 -5.761091306650728e+03 1.905378211400000e-03 6.654786544600000e-04 1.193528248000000e-03 2.264491930000000e-03 1.832604432900000e-03 3.489056439700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.360000000000000e+02 -1.289205063581418e+06 -5.117095630498892e+06 4.397193721980540e+06 -2.802685172099627e+03 -4.259192741124175e+03 -5.761199677056347e+03 1.905378211400000e-03 6.654786544600000e-04 1.193528248000000e-03 2.264491930000000e-03 1.832604432900000e-03 3.489056439700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.370000000000000e+02 -1.289261117079809e+06 -5.117180812994299e+06 4.397078496937127e+06 -2.802666085541429e+03 -4.259059338043666e+03 -5.761308038191684e+03 1.905318346600000e-03 6.651568678800000e-04 1.193668497400000e-03 2.263675818700000e-03 1.832397361600000e-03 3.490052192200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.380000000000000e+02 -1.289317170198053e+06 -5.117265992824498e+06 4.396963269722648e+06 -2.802646996683301e+03 -4.258925933322248e+03 -5.761416396423960e+03 1.905318346600000e-03 6.651568678800000e-04 1.193668497400000e-03 2.263675818700000e-03 1.832397361600000e-03 3.490052192200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.390000000000000e+02 -1.289373222936031e+06 -5.117351169989326e+06 4.396848040337319e+06 -2.802627905451798e+03 -4.258792526646448e+03 -5.761524752021003e+03 1.905318346600000e-03 6.651568678800000e-04 1.193668497400000e-03 2.263675818700000e-03 1.832397361600000e-03 3.490052192200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.400000000000000e+02 -1.289429275315779e+06 -5.117436344528201e+06 4.396732808728815e+06 -2.802608812669906e+03 -4.258659113987244e+03 -5.761633107679545e+03 1.905318346600000e-03 6.651568678800000e-04 1.193668497400000e-03 2.263675818700000e-03 1.832397361600000e-03 3.490052192200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.410000000000000e+02 -1.289485327315273e+06 -5.117521516401739e+06 4.396617574949404e+06 -2.802589717607771e+03 -4.258525699300848e+03 -5.761741460718289e+03 1.905318346600000e-03 6.651568678800000e-04 1.193668497400000e-03 2.263675818700000e-03 1.832397361600000e-03 3.490052192200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.420000000000000e+02 -1.289541378916444e+06 -5.117606685573355e+06 4.396502339055128e+06 -2.802570818676966e+03 -4.258392425110395e+03 -5.761849619798847e+03 1.905318346600000e-03 6.651568678800000e-04 1.193668497400000e-03 2.263675818700000e-03 1.832397361600000e-03 3.490052192200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.430000000000000e+02 -1.289597430151389e+06 -5.117691852097457e+06 4.396387100978923e+06 -2.802552056639316e+03 -4.258259243265066e+03 -5.761957646276137e+03 1.905318346600000e-03 6.651568678800000e-04 1.193668497400000e-03 2.263675818700000e-03 1.832397361600000e-03 3.490052192200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.440000000000000e+02 -1.289653481002072e+06 -5.117777015949129e+06 4.396271860741255e+06 -2.802532956644885e+03 -4.258125824464340e+03 -5.762065989128032e+03 1.905318346600000e-03 6.651568678800000e-04 1.193668497400000e-03 2.263675818700000e-03 1.832397361600000e-03 3.490052192200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.450000000000000e+02 -1.289709531450378e+06 -5.117862177095986e+06 4.396156618385143e+06 -2.802513855531281e+03 -4.257992407495844e+03 -5.762174325955808e+03 1.905318346600000e-03 6.651568678800000e-04 1.193668497400000e-03 2.263675818700000e-03 1.832397361600000e-03 3.490052192200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.460000000000000e+02 -1.289765581573097e+06 -5.117947335675435e+06 4.396041373728086e+06 -2.802494751090383e+03 -4.257858978882188e+03 -5.762282667869501e+03 1.905318346600000e-03 6.651568678800000e-04 1.193668497400000e-03 2.263675818700000e-03 1.832397361600000e-03 3.490052192200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.470000000000000e+02 -1.289821631293361e+06 -5.118032491549985e+06 4.395926126952700e+06 -2.802475644920957e+03 -4.257725552365725e+03 -5.762391003815726e+03 1.905258417700000e-03 6.648350193600001e-04 1.193808575000000e-03 2.262859824800000e-03 1.832189896600000e-03 3.491047913700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.480000000000000e+02 -1.289877680600352e+06 -5.118117644700242e+06 4.395810878084740e+06 -2.802456539449082e+03 -4.257592128771463e+03 -5.762499332149177e+03 1.905258417700000e-03 6.648350193600001e-04 1.193808575000000e-03 2.262859824800000e-03 1.832189896600000e-03 3.491047913700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.490000000000000e+02 -1.289933729548710e+06 -5.118202795224041e+06 4.395695626994267e+06 -2.802437430675262e+03 -4.257458699770406e+03 -5.762607660845948e+03 1.905258417700000e-03 6.648350193600001e-04 1.193808575000000e-03 2.262859824800000e-03 1.832189896600000e-03 3.491047913700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.500000000000000e+02 -1.289989778138320e+06 -5.118287943121219e+06 4.395580373681504e+06 -2.802418318778764e+03 -4.257325265333747e+03 -5.762715989851802e+03 1.905258417700000e-03 6.648350193600001e-04 1.193808575000000e-03 2.262859824800000e-03 1.832189896600000e-03 3.491047913700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.510000000000000e+02 -1.290045826292645e+06 -5.118373088254791e+06 4.395465118328412e+06 -2.802399208427341e+03 -4.257191837568443e+03 -5.762824308057301e+03 1.905258417700000e-03 6.648350193600001e-04 1.193808575000000e-03 2.262859824800000e-03 1.832189896600000e-03 3.491047913700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.520000000000000e+02 -1.290101874070794e+06 -5.118458230751198e+06 4.395349860783062e+06 -2.802379770811249e+03 -4.257058856394227e+03 -5.762932421897295e+03 1.905258417700000e-03 6.648350193600001e-04 1.193808575000000e-03 2.262859824800000e-03 1.832189896600000e-03 3.491047913700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.530000000000000e+02 -1.290157921446734e+06 -5.118543370578283e+06 4.395234601099342e+06 -2.802360104309338e+03 -4.256926187193570e+03 -5.763040391566505e+03 1.905258417700000e-03 6.648350193600001e-04 1.193808575000000e-03 2.262859824800000e-03 1.832189896600000e-03 3.491047913700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.540000000000000e+02 -1.290213968481274e+06 -5.118628507809830e+06 4.395119339152029e+06 -2.802340985965411e+03 -4.256792742492244e+03 -5.763148710588896e+03 1.905258417700000e-03 6.648350193600001e-04 1.193808575000000e-03 2.262859824800000e-03 1.832189896600000e-03 3.491047913700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.550000000000000e+02 -1.290270015102212e+06 -5.118713642316694e+06 4.395004075112715e+06 -2.802321866605947e+03 -4.256659301391102e+03 -5.763257022209923e+03 1.905258417700000e-03 6.648350193600001e-04 1.193808575000000e-03 2.262859824800000e-03 1.832189896600000e-03 3.491047913700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.560000000000000e+02 -1.290326061342287e+06 -5.118798774157496e+06 4.394888808903517e+06 -2.802302745095348e+03 -4.256525858405561e+03 -5.763365331049014e+03 1.905258417700000e-03 6.648350193600001e-04 1.193808575000000e-03 2.262859824800000e-03 1.832189896600000e-03 3.491047913700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.570000000000000e+02 -1.290382107201626e+06 -5.118883903332436e+06 4.394773540524162e+06 -2.802283622782361e+03 -4.256392412994966e+03 -5.763473636945854e+03 1.905198424900000e-03 6.645131092000000e-04 1.193948480600000e-03 2.262043948700000e-03 1.831982038200000e-03 3.492043603000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.580000000000000e+02 -1.290438152680034e+06 -5.118969029841245e+06 4.394658269975035e+06 -2.802264497715161e+03 -4.256258966114336e+03 -5.763581940002156e+03 1.905198424900000e-03 6.645131092000000e-04 1.193948480600000e-03 2.262043948700000e-03 1.831982038200000e-03 3.492043603000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.590000000000000e+02 -1.290494197788583e+06 -5.119054153703704e+06 4.394542997229827e+06 -2.802245371421806e+03 -4.256125514933946e+03 -5.763690241709759e+03 1.905198424900000e-03 6.645131092000000e-04 1.193948480600000e-03 2.262043948700000e-03 1.831982038200000e-03 3.492043603000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.600000000000000e+02 -1.290550242483356e+06 -5.119139274841281e+06 4.394427722392911e+06 -2.802226244258434e+03 -4.255992067262683e+03 -5.763798536024774e+03 1.905198424900000e-03 6.645131092000000e-04 1.193948480600000e-03 2.262043948700000e-03 1.831982038200000e-03 3.492043603000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.610000000000000e+02 -1.290606286818994e+06 -5.119224393351782e+06 4.394312445334313e+06 -2.802207113911667e+03 -4.255858614216078e+03 -5.763906830627734e+03 1.905198424900000e-03 6.645131092000000e-04 1.193948480600000e-03 2.262043948700000e-03 1.831982038200000e-03 3.492043603000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.620000000000000e+02 -1.290662330776917e+06 -5.119309509202610e+06 4.394197166111995e+06 -2.802188142546402e+03 -4.255725477752591e+03 -5.764014814195497e+03 1.905198424900000e-03 6.645131092000000e-04 1.193948480600000e-03 2.262043948700000e-03 1.831982038200000e-03 3.492043603000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.630000000000000e+02 -1.290718374356196e+06 -5.119394622392613e+06 4.394081884737701e+06 -2.802169280323796e+03 -4.255592561944173e+03 -5.764122580144163e+03 1.905198424900000e-03 6.645131092000000e-04 1.193948480600000e-03 2.262043948700000e-03 1.831982038200000e-03 3.492043603000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.640000000000000e+02 -1.290774417548843e+06 -5.119479732906413e+06 4.393966601207037e+06 -2.802150144720257e+03 -4.255459102926926e+03 -5.764230866116893e+03 1.905198424900000e-03 6.645131092000000e-04 1.193948480600000e-03 2.262043948700000e-03 1.831982038200000e-03 3.492043603000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.650000000000000e+02 -1.290830460360472e+06 -5.119564840754033e+06 4.393851315506663e+06 -2.802131008287686e+03 -4.255325641343421e+03 -5.764339149265147e+03 1.905198424900000e-03 6.645131092000000e-04 1.193948480600000e-03 2.262043948700000e-03 1.831982038200000e-03 3.492043603000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.660000000000000e+02 -1.290886502780017e+06 -5.119649945915719e+06 4.393736027662847e+06 -2.802111870046493e+03 -4.255192179857511e+03 -5.764447427991742e+03 1.905198424900000e-03 6.645131092000000e-04 1.193948480600000e-03 2.262043948700000e-03 1.831982038200000e-03 3.492043603000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.670000000000000e+02 -1.290942544829262e+06 -5.119735048430487e+06 4.393620737623729e+06 -2.802092729196049e+03 -4.255058714587560e+03 -5.764555705562817e+03 1.905138368000000e-03 6.641911375300000e-04 1.194088214100000e-03 2.261228190400000e-03 1.831773786400000e-03 3.493039260000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.680000000000000e+02 -1.290998586497382e+06 -5.119820148278951e+06 4.393505445415078e+06 -2.802073587509575e+03 -4.254925246981700e+03 -5.764663980138555e+03 1.905138368000000e-03 6.641911375300000e-04 1.194088214100000e-03 2.261228190400000e-03 1.831773786400000e-03 3.493039260000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.690000000000000e+02 -1.291054627806165e+06 -5.119905245500124e+06 4.393390150985016e+06 -2.802054442614878e+03 -4.254791773629685e+03 -5.764772255291039e+03 1.905138368000000e-03 6.641911375300000e-04 1.194088214100000e-03 2.261228190400000e-03 1.831773786400000e-03 3.493039260000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.700000000000000e+02 -1.291110668689789e+06 -5.119990339976320e+06 4.393274854490045e+06 -2.802035297331255e+03 -4.254658306174554e+03 -5.764880521049017e+03 1.905138368000000e-03 6.641911375300000e-04 1.194088214100000e-03 2.261228190400000e-03 1.831773786400000e-03 3.493039260000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.710000000000000e+02 -1.291166709214085e+06 -5.120075431825263e+06 4.393159555773618e+06 -2.802016150391073e+03 -4.254524832357249e+03 -5.764988787194745e+03 1.905138368000000e-03 6.641911375300000e-04 1.194088214100000e-03 2.261228190400000e-03 1.831773786400000e-03 3.493039260000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.720000000000000e+02 -1.291222749351925e+06 -5.120160521013735e+06 4.393044254890789e+06 -2.801996749059153e+03 -4.254391668610504e+03 -5.765096921491219e+03 1.905138368000000e-03 6.641911375300000e-04 1.194088214100000e-03 2.261228190400000e-03 1.831773786400000e-03 3.493039260000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.730000000000000e+02 -1.291278789081363e+06 -5.120245607513094e+06 4.392928951887228e+06 -2.801977171683813e+03 -4.254258721929120e+03 -5.765204961092214e+03 1.905138368000000e-03 6.641911375300000e-04 1.194088214100000e-03 2.261228190400000e-03 1.831773786400000e-03 3.493039260000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.740000000000000e+02 -1.291334828425276e+06 -5.120330691338430e+06 4.392813646724419e+06 -2.801958019033118e+03 -4.254125242306438e+03 -5.765313218654262e+03 1.905138368000000e-03 6.641911375300000e-04 1.194088214100000e-03 2.261228190400000e-03 1.831773786400000e-03 3.493039260000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.750000000000000e+02 -1.291390867376706e+06 -5.120415772477357e+06 4.392698339418855e+06 -2.801938864480298e+03 -4.253991762893401e+03 -5.765421471750252e+03 1.905138368000000e-03 6.641911375300000e-04 1.194088214100000e-03 2.261228190400000e-03 1.831773786400000e-03 3.493039260000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.760000000000000e+02 -1.291446905957678e+06 -5.120500850969235e+06 4.392583029918158e+06 -2.801919708586342e+03 -4.253858278958170e+03 -5.765529723712605e+03 1.905138368000000e-03 6.641911375300000e-04 1.194088214100000e-03 2.261228190400000e-03 1.831773786400000e-03 3.493039260000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.770000000000000e+02 -1.291502944135235e+06 -5.120585926755160e+06 4.392467718300699e+06 -2.801900551660816e+03 -4.253724796979994e+03 -5.765637969524629e+03 1.905078247100000e-03 6.638691046700000e-04 1.194227775400000e-03 2.260412550500000e-03 1.831565141300000e-03 3.494034883400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.780000000000000e+02 -1.291558981985897e+06 -5.120670999972046e+06 4.392352404384363e+06 -2.801881389894494e+03 -4.253591304027929e+03 -5.765746220542035e+03 1.905078247100000e-03 6.638691046700000e-04 1.194227775400000e-03 2.260412550500000e-03 1.831565141300000e-03 3.494034883400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.790000000000000e+02 -1.291615019422200e+06 -5.120756070463437e+06 4.392237088377260e+06 -2.801862228787504e+03 -4.253457814057427e+03 -5.765854463924321e+03 1.905078247100000e-03 6.638691046700000e-04 1.194227775400000e-03 2.260412550500000e-03 1.831565141300000e-03 3.494034883400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.800000000000000e+02 -1.291671056465928e+06 -5.120841138268330e+06 4.392121770227511e+06 -2.801843065967503e+03 -4.253324324074746e+03 -5.765962702928552e+03 1.905078247100000e-03 6.638691046700000e-04 1.194227775400000e-03 2.260412550500000e-03 1.831565141300000e-03 3.494034883400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.810000000000000e+02 -1.291727093127915e+06 -5.120926203406158e+06 4.392006449909301e+06 -2.801823900868431e+03 -4.253190832446889e+03 -5.766070939024570e+03 1.905078247100000e-03 6.638691046700000e-04 1.194227775400000e-03 2.260412550500000e-03 1.831565141300000e-03 3.494034883400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.820000000000000e+02 -1.291783129430640e+06 -5.121011265921935e+06 4.391891127374696e+06 -2.801804756825099e+03 -4.253057617389095e+03 -5.766178952615599e+03 1.905078247100000e-03 6.638691046700000e-04 1.194227775400000e-03 2.260412550500000e-03 1.831565141300000e-03 3.494034883400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.830000000000000e+02 -1.291839165335996e+06 -5.121096325750973e+06 4.391775802718147e+06 -2.801785626158919e+03 -4.252924600225096e+03 -5.766286806268073e+03 1.905078247100000e-03 6.638691046700000e-04 1.194227775400000e-03 2.260412550500000e-03 1.831565141300000e-03 3.494034883400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.840000000000000e+02 -1.291895200828916e+06 -5.121181382858068e+06 4.391660475966131e+06 -2.801766457248849e+03 -4.252791103842031e+03 -5.766395032212802e+03 1.905078247100000e-03 6.638691046700000e-04 1.194227775400000e-03 2.260412550500000e-03 1.831565141300000e-03 3.494034883400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.850000000000000e+02 -1.291951235983828e+06 -5.121266437376373e+06 4.391545146941504e+06 -2.801747284136533e+03 -4.252657598317470e+03 -5.766503261710181e+03 1.905078247100000e-03 6.638691046700000e-04 1.194227775400000e-03 2.260412550500000e-03 1.831565141300000e-03 3.494034883400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.860000000000000e+02 -1.292007270713029e+06 -5.121351489149087e+06 4.391429815852904e+06 -2.801728110732861e+03 -4.252524098430811e+03 -5.766611481972129e+03 1.905078247100000e-03 6.638691046700000e-04 1.194227775400000e-03 2.260412550500000e-03 1.831565141300000e-03 3.494034883400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.870000000000000e+02 -1.292063305115175e+06 -5.121436538352611e+06 4.391314482465578e+06 -2.801708934206390e+03 -4.252390586624373e+03 -5.766719707425736e+03 1.905018062100000e-03 6.635470107900000e-04 1.194367164200000e-03 2.259597028800000e-03 1.831356103200000e-03 3.495030472900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.880000000000000e+02 -1.292119339080677e+06 -5.121521584791020e+06 4.391199147040282e+06 -2.801689757759627e+03 -4.252257082465964e+03 -5.766827921973070e+03 1.905018062100000e-03 6.635470107900000e-04 1.194367164200000e-03 2.259597028800000e-03 1.831356103200000e-03 3.495030472900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.890000000000000e+02 -1.292175372686048e+06 -5.121606628601181e+06 4.391083809394866e+06 -2.801670578070017e+03 -4.252123572573885e+03 -5.766936137099579e+03 1.905018062100000e-03 6.635470107900000e-04 1.194367164200000e-03 2.259597028800000e-03 1.831356103200000e-03 3.495030472900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.900000000000000e+02 -1.292231405931412e+06 -5.121691669783298e+06 4.390968469529055e+06 -2.801651396600892e+03 -4.251990056819720e+03 -5.767044352285462e+03 1.905018062100000e-03 6.635470107900000e-04 1.194367164200000e-03 2.259597028800000e-03 1.831356103200000e-03 3.495030472900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.910000000000000e+02 -1.292287438783820e+06 -5.121776708278481e+06 4.390853127521225e+06 -2.801632213623247e+03 -4.251856540788744e+03 -5.767152563207172e+03 1.905018062100000e-03 6.635470107900000e-04 1.194367164200000e-03 2.259597028800000e-03 1.831356103200000e-03 3.495030472900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.920000000000000e+02 -1.292343471222102e+06 -5.121861744052957e+06 4.390737783428235e+06 -2.801613071835321e+03 -4.251723305115896e+03 -5.767260540394437e+03 1.905018062100000e-03 6.635470107900000e-04 1.194367164200000e-03 2.259597028800000e-03 1.831356103200000e-03 3.495030472900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.930000000000000e+02 -1.292399503299385e+06 -5.121946777204480e+06 4.390622437128250e+06 -2.801593958232766e+03 -4.251590256238309e+03 -5.767368359842860e+03 1.905018062100000e-03 6.635470107900000e-04 1.194367164200000e-03 2.259597028800000e-03 1.831356103200000e-03 3.495030472900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.940000000000000e+02 -1.292455534952773e+06 -5.122031807613841e+06 4.390507088759788e+06 -2.801574771465947e+03 -4.251456741804145e+03 -5.767476555811377e+03 1.905018062100000e-03 6.635470107900000e-04 1.194367164200000e-03 2.259597028800000e-03 1.831356103200000e-03 3.495030472900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.950000000000000e+02 -1.292511566267715e+06 -5.122116835433855e+06 4.390391738119432e+06 -2.801555580848110e+03 -4.251323218020533e+03 -5.767584755338629e+03 1.905018062100000e-03 6.635470107900000e-04 1.194367164200000e-03 2.259597028800000e-03 1.831356103200000e-03 3.495030472900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.960000000000000e+02 -1.292567597189604e+06 -5.122201860566857e+06 4.390276385337180e+06 -2.801536389937880e+03 -4.251189693621443e+03 -5.767692950345402e+03 1.905018062100000e-03 6.635470107900000e-04 1.194367164200000e-03 2.259597028800000e-03 1.831356103200000e-03 3.495030472900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.970000000000000e+02 -1.292623627729181e+06 -5.122286883032136e+06 4.390161030387371e+06 -2.801517196014051e+03 -4.251056167662267e+03 -5.767801142689055e+03 1.904957813100000e-03 6.632248560600000e-04 1.194506380600000e-03 2.258781625700000e-03 1.831146672100000e-03 3.496026027900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.980000000000000e+02 -1.292679657897529e+06 -5.122371902849469e+06 4.390045673243666e+06 -2.801498001181154e+03 -4.250922637437453e+03 -5.767909333521908e+03 1.904957813100000e-03 6.632248560600000e-04 1.194506380600000e-03 2.258781625700000e-03 1.831146672100000e-03 3.496026027900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.990000000000000e+02 -1.292735687639794e+06 -5.122456919920839e+06 4.389930314036579e+06 -2.801478805710492e+03 -4.250789112641642e+03 -5.768017515426547e+03 1.904957813100000e-03 6.632248560600000e-04 1.194506380600000e-03 2.258781625700000e-03 1.831146672100000e-03 3.496026027900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.000000000000000e+02 -1.292791717065326e+06 -5.122541934441786e+06 4.389814952505754e+06 -2.801459605299015e+03 -4.250655575249329e+03 -5.768125703793069e+03 1.904957813100000e-03 6.632248560600000e-04 1.194506380600000e-03 2.258781625700000e-03 1.831146672100000e-03 3.496026027900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.010000000000000e+02 -1.292847746064785e+06 -5.122626946216809e+06 4.389699588911496e+06 -2.801440405925706e+03 -4.250522042471966e+03 -5.768233883139435e+03 1.904957813100000e-03 6.632248560600000e-04 1.194506380600000e-03 2.258781625700000e-03 1.831146672100000e-03 3.496026027900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.020000000000000e+02 -1.292903774699016e+06 -5.122711955370374e+06 4.389584223101103e+06 -2.801420967246297e+03 -4.250388864331037e+03 -5.768341890974319e+03 1.904957813100000e-03 6.632248560600000e-04 1.194506380600000e-03 2.258781625700000e-03 1.831146672100000e-03 3.496026027900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.030000000000000e+02 -1.292959802889128e+06 -5.122796961772427e+06 4.389468855256874e+06 -2.801401362999305e+03 -4.250255943216379e+03 -5.768449769795414e+03 1.904957813100000e-03 6.632248560600000e-04 1.194506380600000e-03 2.258781625700000e-03 1.831146672100000e-03 3.496026027900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.040000000000000e+02 -1.293015830727220e+06 -5.122881965561005e+06 4.389353485172852e+06 -2.801382157647907e+03 -4.250122400832067e+03 -5.768557943551994e+03 1.904957813100000e-03 6.632248560600000e-04 1.194506380600000e-03 2.258781625700000e-03 1.831146672100000e-03 3.496026027900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.050000000000000e+02 -1.293071858171858e+06 -5.122966966662099e+06 4.389238112947617e+06 -2.801362950192124e+03 -4.249988858508730e+03 -5.768666113041901e+03 1.904957813100000e-03 6.632248560600000e-04 1.194506380600000e-03 2.258781625700000e-03 1.831146672100000e-03 3.496026027900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.060000000000000e+02 -1.293127885211981e+06 -5.123051965055969e+06 4.389122738607456e+06 -2.801343741543593e+03 -4.249855317942547e+03 -5.768774276604397e+03 1.904957813100000e-03 6.632248560600000e-04 1.194506380600000e-03 2.258781625700000e-03 1.831146672100000e-03 3.496026027900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.070000000000000e+02 -1.293183911891502e+06 -5.123136960821090e+06 4.389007362047850e+06 -2.801324531274406e+03 -4.249721771492462e+03 -5.768882440173777e+03 1.904897500000000e-03 6.629026408000000e-04 1.194645424200000e-03 2.257966341500000e-03 1.830936848100000e-03 3.497021547300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.080000000000000e+02 -1.293239938188329e+06 -5.123221953918049e+06 4.388891983321307e+06 -2.801305318096742e+03 -4.249588223368045e+03 -5.768990601121884e+03 1.904897500000000e-03 6.629026408000000e-04 1.194645424200000e-03 2.257966341500000e-03 1.830936848100000e-03 3.497021547300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.090000000000000e+02 -1.293295964113531e+06 -5.123306944366602e+06 4.388776602401490e+06 -2.801286103672231e+03 -4.249454670724522e+03 -5.769098760891410e+03 1.904897500000000e-03 6.629026408000000e-04 1.194645424200000e-03 2.257966341500000e-03 1.830936848100000e-03 3.497021547300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.100000000000000e+02 -1.293351989645108e+06 -5.123391932127471e+06 4.388661219340743e+06 -2.801266887584065e+03 -4.249321118319885e+03 -5.769206916075208e+03 1.904897500000000e-03 6.629026408000000e-04 1.194645424200000e-03 2.257966341500000e-03 1.830936848100000e-03 3.497021547300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.110000000000000e+02 -1.293408014793885e+06 -5.123476917220047e+06 4.388545834113234e+06 -2.801247669191142e+03 -4.249187564016192e+03 -5.769315068552877e+03 1.904897500000000e-03 6.629026408000000e-04 1.194645424200000e-03 2.257966341500000e-03 1.830936848100000e-03 3.497021547300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.120000000000000e+02 -1.293464039562520e+06 -5.123561899651409e+06 4.388430446724906e+06 -2.801228576292051e+03 -4.249054350629139e+03 -5.769422906448473e+03 1.904897500000000e-03 6.629026408000000e-04 1.194645424200000e-03 2.257966341500000e-03 1.830936848100000e-03 3.497021547300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.130000000000000e+02 -1.293520063928009e+06 -5.123646879382128e+06 4.388315057239043e+06 -2.801209570447410e+03 -4.248921378570688e+03 -5.769530520932123e+03 1.904897500000000e-03 6.629026408000000e-04 1.194645424200000e-03 2.257966341500000e-03 1.830936848100000e-03 3.497021547300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.140000000000000e+02 -1.293576087948063e+06 -5.123731856511409e+06 4.388199665497350e+06 -2.801190345805745e+03 -4.248787814645206e+03 -5.769638667946940e+03 1.904897500000000e-03 6.629026408000000e-04 1.194645424200000e-03 2.257966341500000e-03 1.830936848100000e-03 3.497021547300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.150000000000000e+02 -1.293632111563451e+06 -5.123816830933355e+06 4.388084271640914e+06 -2.801171121402831e+03 -4.248654251754968e+03 -5.769746808976498e+03 1.904897500000000e-03 6.629026408000000e-04 1.194645424200000e-03 2.257966341500000e-03 1.830936848100000e-03 3.497021547300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.160000000000000e+02 -1.293688134806888e+06 -5.123901802706496e+06 4.387968875591762e+06 -2.801151894189292e+03 -4.248520685383934e+03 -5.769854948703281e+03 1.904897500000000e-03 6.629026408000000e-04 1.194645424200000e-03 2.257966341500000e-03 1.830936848100000e-03 3.497021547300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.170000000000000e+02 -1.293744157656372e+06 -5.123986771791544e+06 4.387853477402250e+06 -2.801132665222960e+03 -4.248387118792807e+03 -5.769963084227905e+03 1.904837122700000e-03 6.625803651500000e-04 1.194784295100000e-03 2.257151176200000e-03 1.830726631300000e-03 3.498017030800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.180000000000000e+02 -1.293800180101082e+06 -5.124071738169146e+06 4.387738077098176e+06 -2.801113436410152e+03 -4.248253553876601e+03 -5.770071213322387e+03 1.904837122700000e-03 6.625803651500000e-04 1.194784295100000e-03 2.257151176200000e-03 1.830726631300000e-03 3.498017030800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.190000000000000e+02 -1.293856202184681e+06 -5.124156701917378e+06 4.387622674575482e+06 -2.801094204365462e+03 -4.248119983069199e+03 -5.770179343105428e+03 1.904837122700000e-03 6.625803651500000e-04 1.194784295100000e-03 2.257151176200000e-03 1.830726631300000e-03 3.498017030800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.200000000000000e+02 -1.293912223896109e+06 -5.124241663016508e+06 4.387507269860468e+06 -2.801074969704893e+03 -4.247986408784719e+03 -5.770287471500716e+03 1.904837122700000e-03 6.625803651500000e-04 1.194784295100000e-03 2.257151176200000e-03 1.830726631300000e-03 3.498017030800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.210000000000000e+02 -1.293968245213602e+06 -5.124326621427634e+06 4.387391863004989e+06 -2.801055734637606e+03 -4.247852833816568e+03 -5.770395595476717e+03 1.904837122700000e-03 6.625803651500000e-04 1.194784295100000e-03 2.257151176200000e-03 1.830726631300000e-03 3.498017030800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.220000000000000e+02 -1.294024266131265e+06 -5.124411577157174e+06 4.387276454012074e+06 -2.801036212114819e+03 -4.247719594141149e+03 -5.770503582950802e+03 1.904837122700000e-03 6.625803651500000e-04 1.194784295100000e-03 2.257151176200000e-03 1.830726631300000e-03 3.498017030800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.230000000000000e+02 -1.294080286637332e+06 -5.124496530195870e+06 4.387161042902139e+06 -2.801016490378385e+03 -4.247586587701311e+03 -5.770611473607609e+03 1.904837122700000e-03 6.625803651500000e-04 1.194784295100000e-03 2.257151176200000e-03 1.830726631300000e-03 3.498017030800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.240000000000000e+02 -1.294136306777759e+06 -5.124581480597214e+06 4.387045629584231e+06 -2.800997249045946e+03 -4.247453005115100e+03 -5.770719590606049e+03 1.904837122700000e-03 6.625803651500000e-04 1.194784295100000e-03 2.257151176200000e-03 1.830726631300000e-03 3.498017030800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.250000000000000e+02 -1.294192326491122e+06 -5.124666428251482e+06 4.386930214204636e+06 -2.800978007455472e+03 -4.247319427976433e+03 -5.770827698510105e+03 1.904837122700000e-03 6.625803651500000e-04 1.194784295100000e-03 2.257151176200000e-03 1.830726631300000e-03 3.498017030800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.260000000000000e+02 -1.294248345876034e+06 -5.124751373334876e+06 4.386814796528442e+06 -2.800958762592161e+03 -4.247185839496918e+03 -5.770935811218827e+03 1.904837122700000e-03 6.625803651500000e-04 1.194784295100000e-03 2.257151176200000e-03 1.830726631300000e-03 3.498017030800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.270000000000000e+02 -1.294304364844839e+06 -5.124836315690792e+06 4.386699376764434e+06 -2.800939517071277e+03 -4.247052254311583e+03 -5.771043916621585e+03 1.904776681300000e-03 6.622580294100000e-04 1.194922992900000e-03 2.256336130300000e-03 1.830516021900000e-03 3.499012477300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.280000000000000e+02 -1.294360383474016e+06 -5.124921255455946e+06 4.386583954730337e+06 -2.800920267259638e+03 -4.246918660315317e+03 -5.771152025353003e+03 1.904776681300000e-03 6.622580294100000e-04 1.194922992900000e-03 2.256336130300000e-03 1.830516021900000e-03 3.499012477300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.290000000000000e+02 -1.294416401676152e+06 -5.125006192474114e+06 4.386468530634454e+06 -2.800901018640601e+03 -4.246785070884677e+03 -5.771260125044217e+03 1.904776681300000e-03 6.622580294100000e-04 1.194922992900000e-03 2.256336130300000e-03 1.830516021900000e-03 3.499012477300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.300000000000000e+02 -1.294472419483957e+06 -5.125091126803795e+06 4.386353104398788e+06 -2.800881768228367e+03 -4.246651481819998e+03 -5.771368220110608e+03 1.904776681300000e-03 6.622580294100000e-04 1.194922992900000e-03 2.256336130300000e-03 1.830516021900000e-03 3.499012477300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.310000000000000e+02 -1.294528436962973e+06 -5.125176058562138e+06 4.386237675867124e+06 -2.800862513126437e+03 -4.246517881486572e+03 -5.771476320521367e+03 1.904776681300000e-03 6.622580294100000e-04 1.194922992900000e-03 2.256336130300000e-03 1.830516021900000e-03 3.499012477300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.320000000000000e+02 -1.294584454005254e+06 -5.125260987559057e+06 4.386122245304414e+06 -2.800843327278314e+03 -4.246384549210433e+03 -5.771584185085191e+03 1.904776681300000e-03 6.622580294100000e-04 1.194922992900000e-03 2.256336130300000e-03 1.830516021900000e-03 3.499012477300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.330000000000000e+02 -1.294640470669463e+06 -5.125345913901402e+06 4.386006812576168e+06 -2.800824185175342e+03 -4.246251395585117e+03 -5.771691891789581e+03 1.904776681300000e-03 6.622580294100000e-04 1.194922992900000e-03 2.256336130300000e-03 1.830516021900000e-03 3.499012477300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.340000000000000e+02 -1.294696486939144e+06 -5.125430837554970e+06 4.385891377708538e+06 -2.800804927861533e+03 -4.246117796190988e+03 -5.771799977100791e+03 1.904776681300000e-03 6.622580294100000e-04 1.194922992900000e-03 2.256336130300000e-03 1.830516021900000e-03 3.499012477300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.350000000000000e+02 -1.294752502825261e+06 -5.125515758539408e+06 4.385775940675342e+06 -2.800785668050863e+03 -4.245984195274743e+03 -5.771908059503318e+03 1.904776681300000e-03 6.622580294100000e-04 1.194922992900000e-03 2.256336130300000e-03 1.830516021900000e-03 3.499012477300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.360000000000000e+02 -1.294808518349586e+06 -5.125600676893641e+06 4.385660501424647e+06 -2.800766405245528e+03 -4.245850588416202e+03 -5.772016142530273e+03 1.904776681300000e-03 6.622580294100000e-04 1.194922992900000e-03 2.256336130300000e-03 1.830516021900000e-03 3.499012477300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.370000000000000e+02 -1.294864533490358e+06 -5.125685592578779e+06 4.385545060008329e+06 -2.800747141503046e+03 -4.245716979492110e+03 -5.772124222401080e+03 1.904716175800000e-03 6.619356337700000e-04 1.195061517600000e-03 2.255521203800000e-03 1.830305020100000e-03 3.500007886400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.380000000000000e+02 -1.294920548225578e+06 -5.125770505555565e+06 4.385429616478764e+06 -2.800727876592133e+03 -4.245583372321683e+03 -5.772232296341435e+03 1.904716175800000e-03 6.619356337700000e-04 1.195061517600000e-03 2.255521203800000e-03 1.830305020100000e-03 3.500007886400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.390000000000000e+02 -1.294976562587955e+06 -5.125855415882476e+06 4.385314170757943e+06 -2.800708608868906e+03 -4.245449761368142e+03 -5.772340369205704e+03 1.904716175800000e-03 6.619356337700000e-04 1.195061517600000e-03 2.255521203800000e-03 1.830305020100000e-03 3.500007886400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.400000000000000e+02 -1.295032576566674e+06 -5.125940323540171e+06 4.385198722871674e+06 -2.800689340364764e+03 -4.245316148139241e+03 -5.772448439006065e+03 1.904716175800000e-03 6.619356337700000e-04 1.195061517600000e-03 2.255521203800000e-03 1.830305020100000e-03 3.500007886400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.410000000000000e+02 -1.295088590183502e+06 -5.126025228567573e+06 4.385083272768013e+06 -2.800670068693411e+03 -4.245182529259857e+03 -5.772556509283070e+03 1.904716175800000e-03 6.619356337700000e-04 1.195061517600000e-03 2.255521203800000e-03 1.830305020100000e-03 3.500007886400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.420000000000000e+02 -1.295144603381335e+06 -5.126110130872119e+06 4.384967820580614e+06 -2.800650682058602e+03 -4.245049179872004e+03 -5.772664420181509e+03 1.904716175800000e-03 6.619356337700000e-04 1.195061517600000e-03 2.255521203800000e-03 1.830305020100000e-03 3.500007886400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.430000000000000e+02 -1.295200616199272e+06 -5.126195030530170e+06 4.384852366214643e+06 -2.800631214765169e+03 -4.244916011646492e+03 -5.772772223687080e+03 1.904716175800000e-03 6.619356337700000e-04 1.195061517600000e-03 2.255521203800000e-03 1.830305020100000e-03 3.500007886400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.440000000000000e+02 -1.295256628609081e+06 -5.126279927475408e+06 4.384736909741409e+06 -2.800611939631242e+03 -4.244782394090094e+03 -5.772880279081864e+03 1.904716175800000e-03 6.619356337700000e-04 1.195061517600000e-03 2.255521203800000e-03 1.830305020100000e-03 3.500007886400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.450000000000000e+02 -1.295312640656777e+06 -5.126364821790069e+06 4.384621451051179e+06 -2.800592661389326e+03 -4.244648771127067e+03 -5.772988334744809e+03 1.904716175800000e-03 6.619356337700000e-04 1.195061517600000e-03 2.255521203800000e-03 1.830305020100000e-03 3.500007886400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.460000000000000e+02 -1.295368652353425e+06 -5.126449713493899e+06 4.384505990117596e+06 -2.800573380834161e+03 -4.244515140157123e+03 -5.773096392295755e+03 1.904716175800000e-03 6.619356337700000e-04 1.195061517600000e-03 2.255521203800000e-03 1.830305020100000e-03 3.500007886400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.470000000000000e+02 -1.295424663611304e+06 -5.126534602430271e+06 4.384390527149693e+06 -2.800554100022161e+03 -4.244381516829966e+03 -5.773204439108124e+03 1.904655606000000e-03 6.616131784100000e-04 1.195199869100000e-03 2.254706396900000e-03 1.830093625800000e-03 3.501003257400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.480000000000000e+02 -1.295480674507127e+06 -5.126619488736186e+06 4.384275061964627e+06 -2.800534817545412e+03 -4.244247887292070e+03 -5.773312486185907e+03 1.904655606000000e-03 6.616131784100000e-04 1.195199869100000e-03 2.254706396900000e-03 1.830093625800000e-03 3.501003257400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.490000000000000e+02 -1.295536685018890e+06 -5.126704372372400e+06 4.384159594614787e+06 -2.800515532606738e+03 -4.244114256068125e+03 -5.773420530463524e+03 1.904655606000000e-03 6.616131784100000e-04 1.195199869100000e-03 2.254706396900000e-03 1.830093625800000e-03 3.501003257400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.500000000000000e+02 -1.295592695146484e+06 -5.126789253338746e+06 4.384044125100390e+06 -2.800496245481532e+03 -4.243980622789903e+03 -5.773528572101939e+03 1.904655606000000e-03 6.616131784100000e-04 1.195199869100000e-03 2.254706396900000e-03 1.830093625800000e-03 3.501003257400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.510000000000000e+02 -1.295648704900970e+06 -5.126874131654966e+06 4.383928653395087e+06 -2.800476957247753e+03 -4.243846985625191e+03 -5.773636612024813e+03 1.904655606000000e-03 6.616131784100000e-04 1.195199869100000e-03 2.254706396900000e-03 1.830093625800000e-03 3.501003257400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.520000000000000e+02 -1.295704714262521e+06 -5.126959007289744e+06 4.383813179558098e+06 -2.800457775120331e+03 -4.243713743833398e+03 -5.773744305161229e+03 1.904655606000000e-03 6.616131784100000e-04 1.195199869100000e-03 2.254706396900000e-03 1.830093625800000e-03 3.501003257400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.530000000000000e+02 -1.295760723179043e+06 -5.127043880152931e+06 4.383697703721949e+06 -2.800438668342357e+03 -4.243580785760718e+03 -5.773851748359451e+03 1.904655606000000e-03 6.616131784100000e-04 1.195199869100000e-03 2.254706396900000e-03 1.830093625800000e-03 3.501003257400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.540000000000000e+02 -1.295816731773427e+06 -5.127128750457079e+06 4.383582225573297e+06 -2.800419374379384e+03 -4.243447140528337e+03 -5.773959781434824e+03 1.904655606000000e-03 6.616131784100000e-04 1.195199869100000e-03 2.254706396900000e-03 1.830093625800000e-03 3.501003257400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.550000000000000e+02 -1.295872739972605e+06 -5.127213618071748e+06 4.383466745286291e+06 -2.800400078491922e+03 -4.243313495372270e+03 -5.774067810159929e+03 1.904655606000000e-03 6.616131784100000e-04 1.195199869100000e-03 2.254706396900000e-03 1.830093625800000e-03 3.501003257400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.560000000000000e+02 -1.295928747776460e+06 -5.127298482996769e+06 4.383351262861156e+06 -2.800380780830324e+03 -4.243179850046951e+03 -5.774175834656300e+03 1.904655606000000e-03 6.616131784100000e-04 1.195199869100000e-03 2.254706396900000e-03 1.830093625800000e-03 3.501003257400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.570000000000000e+02 -1.295984755196056e+06 -5.127383345251885e+06 4.383235778271534e+06 -2.800361482421522e+03 -4.243046202434941e+03 -5.774283856083181e+03 1.904594972100000e-03 6.612906636300001e-04 1.195338047100000e-03 2.253891710100000e-03 1.829881839300000e-03 3.501998589400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.580000000000000e+02 -1.296040762220262e+06 -5.127468204817283e+06 4.383120291543900e+06 -2.800342181647844e+03 -4.242912555140035e+03 -5.774391873164507e+03 1.904594972100000e-03 6.612906636300001e-04 1.195338047100000e-03 2.253891710100000e-03 1.829881839300000e-03 3.501998589400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.590000000000000e+02 -1.296096768860143e+06 -5.127553061712695e+06 4.383004802651896e+06 -2.800322880369419e+03 -4.242778905240371e+03 -5.774499887313536e+03 1.904594972100000e-03 6.612906636300001e-04 1.195338047100000e-03 2.253891710100000e-03 1.829881839300000e-03 3.501998589400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.600000000000000e+02 -1.296152775137458e+06 -5.127637915977023e+06 4.382889311543563e+06 -2.800303575614486e+03 -4.242645249880645e+03 -5.774607901923486e+03 1.904594972100000e-03 6.612906636300001e-04 1.195338047100000e-03 2.253891710100000e-03 1.829881839300000e-03 3.501998589400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.610000000000000e+02 -1.296208781019273e+06 -5.127722767551512e+06 4.382773818297389e+06 -2.800284269090371e+03 -4.242511594692269e+03 -5.774715912047143e+03 1.904594972100000e-03 6.612906636300001e-04 1.195338047100000e-03 2.253891710100000e-03 1.829881839300000e-03 3.501998589400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.620000000000000e+02 -1.296264786510966e+06 -5.127807616462979e+06 4.382658322889930e+06 -2.800264677167253e+03 -4.242378290958506e+03 -5.774823773017320e+03 1.904594972100000e-03 6.612906636300001e-04 1.195338047100000e-03 2.253891710100000e-03 1.829881839300000e-03 3.501998589400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.630000000000000e+02 -1.296320791585244e+06 -5.127892462674784e+06 4.382542825378776e+06 -2.800244885092732e+03 -4.242245236267283e+03 -5.774931525938013e+03 1.904594972100000e-03 6.612906636300001e-04 1.195338047100000e-03 2.253891710100000e-03 1.829881839300000e-03 3.501998589400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.640000000000000e+02 -1.296376796321691e+06 -5.127977306299786e+06 4.382427325592160e+06 -2.800225571814179e+03 -4.242111569378060e+03 -5.775039532349443e+03 1.904594972100000e-03 6.612906636300001e-04 1.195338047100000e-03 2.253891710100000e-03 1.829881839300000e-03 3.501998589400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.650000000000000e+02 -1.296432800607967e+06 -5.128062147137372e+06 4.382311823798053e+06 -2.800206260832429e+03 -4.241977911187295e+03 -5.775147526163482e+03 1.904594972100000e-03 6.612906636300001e-04 1.195338047100000e-03 2.253891710100000e-03 1.829881839300000e-03 3.501998589400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.660000000000000e+02 -1.296488804553346e+06 -5.128146985382693e+06 4.382196319735773e+06 -2.800186945602813e+03 -4.241844243707951e+03 -5.775255523636581e+03 1.904594972100000e-03 6.612906636300001e-04 1.195338047100000e-03 2.253891710100000e-03 1.829881839300000e-03 3.501998589400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.670000000000000e+02 -1.296544808103014e+06 -5.128231820937927e+06 4.382080813535992e+06 -2.800167628511175e+03 -4.241710576245429e+03 -5.775363516778911e+03 1.904534274000000e-03 6.609680895700000e-04 1.195476051600000e-03 2.253077143200000e-03 1.829669660600000e-03 3.502993882000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.680000000000000e+02 -1.296600811268042e+06 -5.128316653822815e+06 4.381965305172350e+06 -2.800148310849651e+03 -4.241576906354939e+03 -5.775471506883386e+03 1.904534274000000e-03 6.609680895700000e-04 1.195476051600000e-03 2.253077143200000e-03 1.829669660600000e-03 3.502993882000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.690000000000000e+02 -1.296656814026430e+06 -5.128401483998133e+06 4.381849794697252e+06 -2.800128991545894e+03 -4.241443238514466e+03 -5.775579491038635e+03 1.904534274000000e-03 6.609680895700000e-04 1.195476051600000e-03 2.253077143200000e-03 1.829669660600000e-03 3.502993882000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.700000000000000e+02 -1.296712816443697e+06 -5.128486311580895e+06 4.381734281954365e+06 -2.800109668403055e+03 -4.241309561270863e+03 -5.775687478765911e+03 1.904534274000000e-03 6.609680895700000e-04 1.195476051600000e-03 2.253077143200000e-03 1.829669660600000e-03 3.502993882000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.710000000000000e+02 -1.296768818465275e+06 -5.128571136473658e+06 4.381618767073877e+06 -2.800090344782137e+03 -4.241175883566253e+03 -5.775795461939941e+03 1.904534274000000e-03 6.609680895700000e-04 1.195476051600000e-03 2.253077143200000e-03 1.829669660600000e-03 3.502993882000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.720000000000000e+02 -1.296824820080324e+06 -5.128655958662420e+06 4.381503250086745e+06 -2.800071033888383e+03 -4.241042498256823e+03 -5.775903215169545e+03 1.904534274000000e-03 6.609680895700000e-04 1.195476051600000e-03 2.253077143200000e-03 1.829669660600000e-03 3.502993882000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.730000000000000e+02 -1.296880821304073e+06 -5.128740778178066e+06 4.381387730960260e+06 -2.800051732054644e+03 -4.240909313590799e+03 -5.776010808885510e+03 1.904534274000000e-03 6.609680895700000e-04 1.195476051600000e-03 2.253077143200000e-03 1.829669660600000e-03 3.502993882000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.740000000000000e+02 -1.296936822128086e+06 -5.128825594996576e+06 4.381272209705736e+06 -2.800032403757973e+03 -4.240775633691374e+03 -5.776118780357959e+03 1.904534274000000e-03 6.609680895700000e-04 1.195476051600000e-03 2.253077143200000e-03 1.829669660600000e-03 3.502993882000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.750000000000000e+02 -1.296992822588922e+06 -5.128910409183266e+06 4.381156686235891e+06 -2.800013072127449e+03 -4.240641948430211e+03 -5.776226752155452e+03 1.904534274000000e-03 6.609680895700000e-04 1.195476051600000e-03 2.253077143200000e-03 1.829669660600000e-03 3.502993882000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.760000000000000e+02 -1.297048822632020e+06 -5.128995220640705e+06 4.381041160680921e+06 -2.799993741155213e+03 -4.240508266060273e+03 -5.776334716407145e+03 1.904534274000000e-03 6.609680895700000e-04 1.195476051600000e-03 2.253077143200000e-03 1.829669660600000e-03 3.502993882000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.770000000000000e+02 -1.297104822333827e+06 -5.129080029505412e+06 4.380925632858380e+06 -2.799974406193973e+03 -4.240374574493590e+03 -5.776442684136886e+03 1.904473511600000e-03 6.606454565500000e-04 1.195613882300000e-03 2.252262696700000e-03 1.829457090000000e-03 3.503989134200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.780000000000000e+02 -1.297160821628604e+06 -5.129164835660074e+06 4.380810102925070e+06 -2.799955069763625e+03 -4.240240884990179e+03 -5.776550645835820e+03 1.904473511600000e-03 6.606454565500000e-04 1.195613882300000e-03 2.252262696700000e-03 1.829457090000000e-03 3.503989134200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.790000000000000e+02 -1.297216820516473e+06 -5.129249639104891e+06 4.380694570880716e+06 -2.799935733541190e+03 -4.240107196506871e+03 -5.776658601582926e+03 1.904473511600000e-03 6.606454565500000e-04 1.195613882300000e-03 2.252262696700000e-03 1.829457090000000e-03 3.503989134200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.800000000000000e+02 -1.297272819041070e+06 -5.129334439917807e+06 4.380579036621153e+06 -2.799916394026995e+03 -4.239973502912030e+03 -5.776766557449097e+03 1.904473511600000e-03 6.606454565500000e-04 1.195613882300000e-03 2.252262696700000e-03 1.829457090000000e-03 3.503989134200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.810000000000000e+02 -1.297328817191343e+06 -5.129419238079123e+06 4.380463500172696e+06 -2.799897052035439e+03 -4.239839805143751e+03 -5.776874512388085e+03 1.904473511600000e-03 6.606454565500000e-04 1.195613882300000e-03 2.252262696700000e-03 1.829457090000000e-03 3.503989134200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.820000000000000e+02 -1.297384814942893e+06 -5.129504033556356e+06 4.380347961590910e+06 -2.799877576930704e+03 -4.239706424437891e+03 -5.776982280221954e+03 1.904473511600000e-03 6.606454565500000e-04 1.195613882300000e-03 2.252262696700000e-03 1.829457090000000e-03 3.503989134200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.830000000000000e+02 -1.297440812274895e+06 -5.129588826320128e+06 4.380232420923554e+06 -2.799858007698216e+03 -4.239573267305486e+03 -5.777089914736425e+03 1.904473511600000e-03 6.606454565500000e-04 1.195613882300000e-03 2.252262696700000e-03 1.829457090000000e-03 3.503989134200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.840000000000000e+02 -1.297496809220242e+06 -5.129673616410318e+06 4.380116878096703e+06 -2.799838662252296e+03 -4.239439566957462e+03 -5.777197857741445e+03 1.904473511600000e-03 6.606454565500000e-04 1.195613882300000e-03 2.252262696700000e-03 1.829457090000000e-03 3.503989134200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.850000000000000e+02 -1.297552805802139e+06 -5.129758403868395e+06 4.380001333054920e+06 -2.799819313533758e+03 -4.239305861224330e+03 -5.777305801061922e+03 1.904473511600000e-03 6.606454565500000e-04 1.195613882300000e-03 2.252262696700000e-03 1.829457090000000e-03 3.503989134200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.860000000000000e+02 -1.297608801987662e+06 -5.129843188635635e+06 4.379885785876731e+06 -2.799799963097780e+03 -4.239172155532601e+03 -5.777413739973910e+03 1.904473511600000e-03 6.606454565500000e-04 1.195613882300000e-03 2.252262696700000e-03 1.829457090000000e-03 3.503989134200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.870000000000000e+02 -1.297664797787872e+06 -5.129927970731757e+06 4.379770236535757e+06 -2.799780611806046e+03 -4.239038447330759e+03 -5.777521676029716e+03 1.904412685000000e-03 6.603227647600000e-04 1.195751539200000e-03 2.251448370800000e-03 1.829244127400000e-03 3.504984345400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.880000000000000e+02 -1.297720793202653e+06 -5.130012750156605e+06 4.379654685032221e+06 -2.799761258285514e+03 -4.238904737396909e+03 -5.777629609222172e+03 1.904412685000000e-03 6.603227647600000e-04 1.195751539200000e-03 2.251448370800000e-03 1.829244127400000e-03 3.504984345400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.890000000000000e+02 -1.297776788242827e+06 -5.130097526929528e+06 4.379539131340244e+06 -2.799741902061926e+03 -4.238771023677878e+03 -5.777737541290298e+03 1.904412685000000e-03 6.603227647600000e-04 1.195751539200000e-03 2.251448370800000e-03 1.829244127400000e-03 3.504984345400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.900000000000000e+02 -1.297832782886648e+06 -5.130182301011697e+06 4.379423575511757e+06 -2.799722545663165e+03 -4.238637309501473e+03 -5.777845468676847e+03 1.904412685000000e-03 6.603227647600000e-04 1.195751539200000e-03 2.251448370800000e-03 1.829244127400000e-03 3.504984345400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.910000000000000e+02 -1.297888777123064e+06 -5.130267072383438e+06 4.379308017573086e+06 -2.799703187762296e+03 -4.238503597212837e+03 -5.777953390180362e+03 1.904412685000000e-03 6.603227647600000e-04 1.195751539200000e-03 2.251448370800000e-03 1.829244127400000e-03 3.504984345400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.920000000000000e+02 -1.297944770996083e+06 -5.130351841127758e+06 4.379192457424023e+06 -2.799683845714520e+03 -4.238370134617490e+03 -5.778061112662673e+03 1.904412685000000e-03 6.603227647600000e-04 1.195751539200000e-03 2.251448370800000e-03 1.829244127400000e-03 3.504984345400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.930000000000000e+02 -1.298000764479622e+06 -5.130436607201173e+06 4.379076895130295e+06 -2.799664516448820e+03 -4.238236848156784e+03 -5.778168692585567e+03 1.904412685000000e-03 6.603227647600000e-04 1.195751539200000e-03 2.251448370800000e-03 1.829244127400000e-03 3.504984345400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.940000000000000e+02 -1.298056757576890e+06 -5.130521370601943e+06 4.378961330675844e+06 -2.799645152263005e+03 -4.238103125947310e+03 -5.778276608841540e+03 1.904412685000000e-03 6.603227647600000e-04 1.195751539200000e-03 2.251448370800000e-03 1.829244127400000e-03 3.504984345400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.950000000000000e+02 -1.298112750299340e+06 -5.130606131350547e+06 4.378845764033295e+06 -2.799625785561538e+03 -4.237969400224986e+03 -5.778384523689879e+03 1.904412685000000e-03 6.603227647600000e-04 1.195751539200000e-03 2.251448370800000e-03 1.829244127400000e-03 3.504984345400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.960000000000000e+02 -1.298168742625226e+06 -5.130690889408155e+06 4.378730195254574e+06 -2.799606418473733e+03 -4.237835673820689e+03 -5.778492434114141e+03 1.904412685000000e-03 6.603227647600000e-04 1.195751539200000e-03 2.251448370800000e-03 1.829244127400000e-03 3.504984345400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.970000000000000e+02 -1.298224734565286e+06 -5.130775644794001e+06 4.378614624313970e+06 -2.799587048617137e+03 -4.237701945848523e+03 -5.778600341778694e+03 1.904351794100000e-03 6.600000143500000e-04 1.195889022200000e-03 2.250634165600000e-03 1.829030773100000e-03 3.505979515100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.980000000000000e+02 -1.298280726119646e+06 -5.130860397508289e+06 4.378499051211204e+06 -2.799567677953418e+03 -4.237568215538947e+03 -5.778708246437121e+03 1.904351794100000e-03 6.600000143500000e-04 1.195889022200000e-03 2.250634165600000e-03 1.829030773100000e-03 3.505979515100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.990000000000000e+02 -1.298336717299126e+06 -5.130945147570363e+06 4.378383475920398e+06 -2.799548304699284e+03 -4.237434481516232e+03 -5.778816149869195e+03 1.904351794100000e-03 6.600000143500000e-04 1.195889022200000e-03 2.250634165600000e-03 1.829030773100000e-03 3.505979515100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.000000000000000e+02 -1.298392708103608e+06 -5.131029894980060e+06 4.378267898441764e+06 -2.799528928530534e+03 -4.237300743635260e+03 -5.778924052319561e+03 1.904351794100000e-03 6.600000143500000e-04 1.195889022200000e-03 2.250634165600000e-03 1.829030773100000e-03 3.505979515100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.010000000000000e+02 -1.298448698456676e+06 -5.131114639601015e+06 4.378152318957791e+06 -2.799509554570915e+03 -4.237167014727463e+03 -5.779031942019441e+03 1.904351794100000e-03 6.600000143500000e-04 1.195889022200000e-03 2.250634165600000e-03 1.829030773100000e-03 3.505979515100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.020000000000000e+02 -1.298504688465727e+06 -5.131199381637206e+06 4.378036737213604e+06 -2.799490084378038e+03 -4.237033727969995e+03 -5.779139535579812e+03 1.904351794100000e-03 6.600000143500000e-04 1.195889022200000e-03 2.250634165600000e-03 1.829030773100000e-03 3.505979515100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.030000000000000e+02 -1.298560678063763e+06 -5.131284120977738e+06 4.377921153370222e+06 -2.799470547962928e+03 -4.236900756350233e+03 -5.779246915635808e+03 1.904351794100000e-03 6.600000143500000e-04 1.195889022200000e-03 2.250634165600000e-03 1.829030773100000e-03 3.505979515100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.040000000000000e+02 -1.298616667272151e+06 -5.131368857639803e+06 4.377805567373945e+06 -2.799451166799607e+03 -4.236767013932177e+03 -5.779354803188535e+03 1.904351794100000e-03 6.600000143500000e-04 1.195889022200000e-03 2.250634165600000e-03 1.829030773100000e-03 3.505979515100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.050000000000000e+02 -1.298672656083581e+06 -5.131453591610400e+06 4.377689979242182e+06 -2.799431783929038e+03 -4.236633271554139e+03 -5.779462686331138e+03 1.904351794100000e-03 6.600000143500000e-04 1.195889022200000e-03 2.250634165600000e-03 1.829030773100000e-03 3.505979515100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.060000000000000e+02 -1.298728644541670e+06 -5.131538322967391e+06 4.377574388870719e+06 -2.799412397284615e+03 -4.236499521745838e+03 -5.779570571529256e+03 1.904351794100000e-03 6.600000143500000e-04 1.195889022200000e-03 2.250634165600000e-03 1.829030773100000e-03 3.505979515100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.070000000000000e+02 -1.298784632559072e+06 -5.131623051554929e+06 4.377458796468158e+06 -2.799393012157806e+03 -4.236365778864419e+03 -5.779678445803189e+03 1.904290838900000e-03 6.596772056700000e-04 1.196026331000000e-03 2.249820081400000e-03 1.828817027200000e-03 3.506974642300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.080000000000000e+02 -1.298840620233999e+06 -5.131707777548286e+06 4.377343201799896e+06 -2.799373622586965e+03 -4.236232026875362e+03 -5.779786323670586e+03 1.904290838900000e-03 6.596772056700000e-04 1.196026331000000e-03 2.249820081400000e-03 1.828817027200000e-03 3.506974642300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.090000000000000e+02 -1.298896607511904e+06 -5.131792500850128e+06 4.377227604996210e+06 -2.799354232560480e+03 -4.236098274231797e+03 -5.779894197123275e+03 1.904290838900000e-03 6.596772056700000e-04 1.196026331000000e-03 2.249820081400000e-03 1.828817027200000e-03 3.506974642300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.100000000000000e+02 -1.298952594414541e+06 -5.131877221499317e+06 4.377112006005101e+06 -2.799334839857690e+03 -4.235964518173422e+03 -5.780002069161351e+03 1.904290838900000e-03 6.596772056700000e-04 1.196026331000000e-03 2.249820081400000e-03 1.828817027200000e-03 3.506974642300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.110000000000000e+02 -1.299008580908994e+06 -5.131961939437170e+06 4.376996404905131e+06 -2.799315445873708e+03 -4.235830764000465e+03 -5.780109935228274e+03 1.904290838900000e-03 6.596772056700000e-04 1.196026331000000e-03 2.249820081400000e-03 1.828817027200000e-03 3.506974642300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.120000000000000e+02 -1.299064567017328e+06 -5.132046654704984e+06 4.376880801645388e+06 -2.799296054747269e+03 -4.235697111569549e+03 -5.780217718762303e+03 1.904290838900000e-03 6.596772056700000e-04 1.196026331000000e-03 2.249820081400000e-03 1.828817027200000e-03 3.506974642300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.130000000000000e+02 -1.299120552745912e+06 -5.132131367315551e+06 4.376765196211852e+06 -2.799276663386943e+03 -4.235563528973637e+03 -5.780325444964279e+03 1.904290838900000e-03 6.596772056700000e-04 1.196026331000000e-03 2.249820081400000e-03 1.828817027200000e-03 3.506974642300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.140000000000000e+02 -1.299176538106905e+06 -5.132216077287252e+06 4.376649588572419e+06 -2.799257262773778e+03 -4.235429762937812e+03 -5.780433307381692e+03 1.904290838900000e-03 6.596772056700000e-04 1.196026331000000e-03 2.249820081400000e-03 1.828817027200000e-03 3.506974642300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.150000000000000e+02 -1.299232523037866e+06 -5.132300784508700e+06 4.376533978876255e+06 -2.799237863159360e+03 -4.235296002097136e+03 -5.780541160392713e+03 1.904290838900000e-03 6.596772056700000e-04 1.196026331000000e-03 2.249820081400000e-03 1.828817027200000e-03 3.506974642300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.160000000000000e+02 -1.299288507604280e+06 -5.132385489096748e+06 4.376418366966886e+06 -2.799218460318233e+03 -4.235162235701212e+03 -5.780649013823217e+03 1.904290838900000e-03 6.596772056700000e-04 1.196026331000000e-03 2.249820081400000e-03 1.828817027200000e-03 3.506974642300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.170000000000000e+02 -1.299344491816964e+06 -5.132470191070726e+06 4.376302752818421e+06 -2.799199053830204e+03 -4.235028461674831e+03 -5.780756869403352e+03 1.904229819300000e-03 6.593543388400000e-04 1.196163465500000e-03 2.249006118300000e-03 1.828602889700000e-03 3.507969726500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.180000000000000e+02 -1.299400475588577e+06 -5.132554890274832e+06 4.376187136639516e+06 -2.799179648987892e+03 -4.234894694834958e+03 -5.780864713815000e+03 1.904229819300000e-03 6.593543388400000e-04 1.196163465500000e-03 2.249006118300000e-03 1.828602889700000e-03 3.507969726500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.190000000000000e+02 -1.299456458973675e+06 -5.132639586806414e+06 4.376071518299811e+06 -2.799160241810641e+03 -4.234760926076939e+03 -5.780972555547720e+03 1.904229819300000e-03 6.593543388400000e-04 1.196163465500000e-03 2.249006118300000e-03 1.828602889700000e-03 3.507969726500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.200000000000000e+02 -1.299512442015868e+06 -5.132724280743303e+06 4.375955897695061e+06 -2.799140830634800e+03 -4.234627148005919e+03 -5.781080400837245e+03 1.904229819300000e-03 6.593543388400000e-04 1.196163465500000e-03 2.249006118300000e-03 1.828602889700000e-03 3.507969726500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.210000000000000e+02 -1.299568424660614e+06 -5.132808971988196e+06 4.375840274955574e+06 -2.799121418864776e+03 -4.234493369409365e+03 -5.781188241674249e+03 1.904229819300000e-03 6.593543388400000e-04 1.196163465500000e-03 2.249006118300000e-03 1.828602889700000e-03 3.507969726500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.220000000000000e+02 -1.299624406904241e+06 -5.132893660551862e+06 4.375724650088522e+06 -2.799101830610154e+03 -4.234360142469241e+03 -5.781295738322017e+03 1.904229819300000e-03 6.593543388400000e-04 1.196163465500000e-03 2.249006118300000e-03 1.828602889700000e-03 3.507969726500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.230000000000000e+02 -1.299680388714961e+06 -5.132978346389635e+06 4.375609023168780e+06 -2.799082120868834e+03 -4.234227303570864e+03 -5.781402990260774e+03 1.904229819300000e-03 6.593543388400000e-04 1.196163465500000e-03 2.249006118300000e-03 1.828602889700000e-03 3.507969726500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.240000000000000e+02 -1.299736370155557e+06 -5.133063029584228e+06 4.375493394048939e+06 -2.799062704141431e+03 -4.234093520975463e+03 -5.781510820864135e+03 1.904229819300000e-03 6.593543388400000e-04 1.196163465500000e-03 2.249006118300000e-03 1.828602889700000e-03 3.507969726500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.250000000000000e+02 -1.299792351209338e+06 -5.133147710105926e+06 4.375377762768811e+06 -2.799043284835290e+03 -4.233959736705425e+03 -5.781618648708191e+03 1.904229819300000e-03 6.593543388400000e-04 1.196163465500000e-03 2.249006118300000e-03 1.828602889700000e-03 3.507969726500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.260000000000000e+02 -1.299848331887368e+06 -5.133232387974436e+06 4.375262129301991e+06 -2.799023864486897e+03 -4.233825947993095e+03 -5.781726475220648e+03 1.904229819300000e-03 6.593543388400000e-04 1.196163465500000e-03 2.249006118300000e-03 1.828602889700000e-03 3.507969726500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.270000000000000e+02 -1.299904312167666e+06 -5.133317063150601e+06 4.375146493700949e+06 -2.799004442399946e+03 -4.233692159525400e+03 -5.781834297184479e+03 1.904168735400000e-03 6.590314141700000e-04 1.196300425600000e-03 2.248192276700000e-03 1.828388360900000e-03 3.508964766800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.280000000000000e+02 -1.299960292039184e+06 -5.133401735614763e+06 4.375030855992025e+06 -2.798985018849473e+03 -4.233558372748166e+03 -5.781942113402254e+03 1.904168735400000e-03 6.590314141700000e-04 1.196300425600000e-03 2.248192276700000e-03 1.828388360900000e-03 3.508964766800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.290000000000000e+02 -1.300016271545776e+06 -5.133486405445102e+06 4.374915216070461e+06 -2.798965593755803e+03 -4.233424579787242e+03 -5.782049929802088e+03 1.904168735400000e-03 6.590314141700000e-04 1.196300425600000e-03 2.248192276700000e-03 1.828388360900000e-03 3.508964766800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.300000000000000e+02 -1.300072250643597e+06 -5.133571072563489e+06 4.374799574040968e+06 -2.798946167126305e+03 -4.233290789152471e+03 -5.782157740010613e+03 1.904168735400000e-03 6.590314141700000e-04 1.196300425600000e-03 2.248192276700000e-03 1.828388360900000e-03 3.508964766800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.310000000000000e+02 -1.300128229398122e+06 -5.133655737086709e+06 4.374683929747031e+06 -2.798926736553988e+03 -4.233156988763381e+03 -5.782265554079695e+03 1.904168735400000e-03 6.590314141700000e-04 1.196300425600000e-03 2.248192276700000e-03 1.828388360900000e-03 3.508964766800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.320000000000000e+02 -1.300184207743006e+06 -5.133740398902543e+06 4.374568283348123e+06 -2.798907261813847e+03 -4.233023416085544e+03 -5.782373211124000e+03 1.904168735400000e-03 6.590314141700000e-04 1.196300425600000e-03 2.248192276700000e-03 1.828388360900000e-03 3.508964766800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.330000000000000e+02 -1.300240185669107e+06 -5.133825057999010e+06 4.374452634866631e+06 -2.798887754358902e+03 -4.232890003156653e+03 -5.782480757215786e+03 1.904168735400000e-03 6.590314141700000e-04 1.196300425600000e-03 2.248192276700000e-03 1.828388360900000e-03 3.508964766800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.340000000000000e+02 -1.300296163198755e+06 -5.133909714405549e+06 4.374336984247710e+06 -2.798868321343994e+03 -4.232756204053895e+03 -5.782588556034229e+03 1.904168735400000e-03 6.590314141700000e-04 1.196300425600000e-03 2.248192276700000e-03 1.828388360900000e-03 3.508964766800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.350000000000000e+02 -1.300352140385045e+06 -5.133994368216880e+06 4.374221331364400e+06 -2.798848884149868e+03 -4.232622395740406e+03 -5.782696358404314e+03 1.904168735400000e-03 6.590314141700000e-04 1.196300425600000e-03 2.248192276700000e-03 1.828388360900000e-03 3.508964766800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.360000000000000e+02 -1.300408117140411e+06 -5.134079019276920e+06 4.374105676425924e+06 -2.798829446541783e+03 -4.232488592965377e+03 -5.782804151709655e+03 1.904168735400000e-03 6.590314141700000e-04 1.196300425600000e-03 2.248192276700000e-03 1.828388360900000e-03 3.508964766800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.370000000000000e+02 -1.300464093563359e+06 -5.134163667761271e+06 4.373990019196874e+06 -2.798810005769224e+03 -4.232354778329724e+03 -5.782911950123470e+03 1.904107587100000e-03 6.587084318599999e-04 1.196437211100000e-03 2.247378556700000e-03 1.828173440800000e-03 3.509959762700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.380000000000000e+02 -1.300520069566331e+06 -5.134248313513860e+06 4.373874359886484e+06 -2.798790564460730e+03 -4.232220967615642e+03 -5.783019740733909e+03 1.904107587100000e-03 6.587084318599999e-04 1.196437211100000e-03 2.247378556700000e-03 1.828173440800000e-03 3.509959762700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.390000000000000e+02 -1.300576045181994e+06 -5.134332956592992e+06 4.373758698416593e+06 -2.798771120464674e+03 -4.232087154964149e+03 -5.783127528827329e+03 1.904107587100000e-03 6.587084318599999e-04 1.196437211100000e-03 2.247378556700000e-03 1.828173440800000e-03 3.509959762700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.400000000000000e+02 -1.300632020388623e+06 -5.134417596959898e+06 4.373643034839189e+06 -2.798751676954696e+03 -4.231953343772509e+03 -5.783235310531612e+03 1.904107587100000e-03 6.587084318599999e-04 1.196437211100000e-03 2.247378556700000e-03 1.828173440800000e-03 3.509959762700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.410000000000000e+02 -1.300687995240746e+06 -5.134502234711850e+06 4.373527369023852e+06 -2.798732229623145e+03 -4.231819525051143e+03 -5.783343094378276e+03 1.904107587100000e-03 6.587084318599999e-04 1.196437211100000e-03 2.247378556700000e-03 1.828173440800000e-03 3.509959762700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.420000000000000e+02 -1.300743969694249e+06 -5.134586869776309e+06 4.373411701079346e+06 -2.798712766234881e+03 -4.231685984573964e+03 -5.783450671695971e+03 1.904107587100000e-03 6.587084318599999e-04 1.196437211100000e-03 2.247378556700000e-03 1.828173440800000e-03 3.509959762700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.430000000000000e+02 -1.300799943758020e+06 -5.134671502173332e+06 4.373296030986789e+06 -2.798693292121214e+03 -4.231552635527303e+03 -5.783558105210785e+03 1.904107587100000e-03 6.587084318599999e-04 1.196437211100000e-03 2.247378556700000e-03 1.828173440800000e-03 3.509959762700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.440000000000000e+02 -1.300855917441611e+06 -5.134756131909693e+06 4.373180358717592e+06 -2.798673839440202e+03 -4.231418810904891e+03 -5.783665880421579e+03 1.904107587100000e-03 6.587084318599999e-04 1.196437211100000e-03 2.247378556700000e-03 1.828173440800000e-03 3.509959762700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.450000000000000e+02 -1.300911890726760e+06 -5.134840758952869e+06 4.373064684315366e+06 -2.798654385141589e+03 -4.231284986180191e+03 -5.783773651294062e+03 1.904107587100000e-03 6.587084318599999e-04 1.196437211100000e-03 2.247378556700000e-03 1.828173440800000e-03 3.509959762700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.460000000000000e+02 -1.300967863591729e+06 -5.134925383264100e+06 4.372949007832099e+06 -2.798634931402233e+03 -4.231151164704460e+03 -5.783881414409525e+03 1.904107587100000e-03 6.587084318599999e-04 1.196437211100000e-03 2.247378556700000e-03 1.828173440800000e-03 3.509959762700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.470000000000000e+02 -1.301023836134691e+06 -5.135010005018456e+06 4.372833329033013e+06 -2.798615472198239e+03 -4.231017330561093e+03 -5.783989184197473e+03 1.904046374400000e-03 6.583853920800000e-04 1.196573822000000e-03 2.246564958500000e-03 1.827958129600000e-03 3.510954713500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.480000000000000e+02 -1.301079808235544e+06 -5.135094624001819e+06 4.372717648205258e+06 -2.798596014375402e+03 -4.230883503105017e+03 -5.784096943312528e+03 1.904046374400000e-03 6.583853920800000e-04 1.196573822000000e-03 2.246564958500000e-03 1.827958129600000e-03 3.510954713500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.490000000000000e+02 -1.301135779992543e+06 -5.135179240389369e+06 4.372601965113880e+06 -2.798576552684998e+03 -4.230749666320246e+03 -5.784204705932761e+03 1.904046374400000e-03 6.583853920800000e-04 1.196573822000000e-03 2.246564958500000e-03 1.827958129600000e-03 3.510954713500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.500000000000000e+02 -1.301191751339990e+06 -5.135263854064059e+06 4.372486279915897e+06 -2.798557089386434e+03 -4.230615831702098e+03 -5.784312462514251e+03 1.904046374400000e-03 6.583853920800000e-04 1.196573822000000e-03 2.246564958500000e-03 1.827958129600000e-03 3.510954713500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.510000000000000e+02 -1.301247722310802e+06 -5.135348465084531e+06 4.372370592532631e+06 -2.798537625040000e+03 -4.230481992758369e+03 -5.784420217677283e+03 1.904046374400000e-03 6.583853920800000e-04 1.196573822000000e-03 2.246564958500000e-03 1.827958129600000e-03 3.510954713500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.520000000000000e+02 -1.301303692858411e+06 -5.135433073378057e+06 4.372254903071687e+06 -2.798518022879777e+03 -4.230348424921797e+03 -5.784527822760740e+03 1.904046374400000e-03 6.583853920800000e-04 1.196573822000000e-03 2.246564958500000e-03 1.827958129600000e-03 3.510954713500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.530000000000000e+02 -1.301359663025619e+06 -5.135517679028125e+06 4.372139211428085e+06 -2.798498321840276e+03 -4.230215038715585e+03 -5.784635328357409e+03 1.904046374400000e-03 6.583853920800000e-04 1.196573822000000e-03 2.246564958500000e-03 1.827958129600000e-03 3.510954713500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.540000000000000e+02 -1.301415632789282e+06 -5.135602281976081e+06 4.372023517663469e+06 -2.798478852695154e+03 -4.230081195600575e+03 -5.784743073328099e+03 1.904046374400000e-03 6.583853920800000e-04 1.196573822000000e-03 2.246564958500000e-03 1.827958129600000e-03 3.510954713500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.550000000000000e+02 -1.301471602132375e+06 -5.135686882191629e+06 4.371907821818501e+06 -2.798459382615586e+03 -4.229947356255645e+03 -5.784850810780059e+03 1.904046374400000e-03 6.583853920800000e-04 1.196573822000000e-03 2.246564958500000e-03 1.827958129600000e-03 3.510954713500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.560000000000000e+02 -1.301527571131280e+06 -5.135771479810946e+06 4.371792123710466e+06 -2.798439908386024e+03 -4.229813507610399e+03 -5.784958551832450e+03 1.904046374400000e-03 6.583853920800000e-04 1.196573822000000e-03 2.246564958500000e-03 1.827958129600000e-03 3.510954713500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.570000000000000e+02 -1.301583539731479e+06 -5.135856074736850e+06 4.371676423469761e+06 -2.798420433909215e+03 -4.229679658391056e+03 -5.785066288325937e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.580000000000000e+02 -1.301639507921851e+06 -5.135940666949577e+06 4.371560721122913e+06 -2.798400957659173e+03 -4.229545811287350e+03 -5.785174018889501e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.590000000000000e+02 -1.301695475768090e+06 -5.136025256566192e+06 4.371445016512826e+06 -2.798381478741008e+03 -4.229411954215909e+03 -5.785281752930498e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.600000000000000e+02 -1.301751443204508e+06 -5.136109843469678e+06 4.371329309796548e+06 -2.798361998363019e+03 -4.229278099409635e+03 -5.785389480798497e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.610000000000000e+02 -1.301807410263779e+06 -5.136194427718294e+06 4.371213600895883e+06 -2.798342515430184e+03 -4.229144240535731e+03 -5.785497207685858e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.620000000000000e+02 -1.301863376924167e+06 -5.136279009273293e+06 4.371097889862836e+06 -2.798323032121034e+03 -4.229010381364779e+03 -5.785604929861686e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.630000000000000e+02 -1.301919343196490e+06 -5.136363588153991e+06 4.370982176671488e+06 -2.798303546616654e+03 -4.228876520150426e+03 -5.785712649393292e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.640000000000000e+02 -1.301975309058772e+06 -5.136448164321279e+06 4.370866461374344e+06 -2.798284059623923e+03 -4.228742661136724e+03 -5.785820362813009e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.650000000000000e+02 -1.302031274565781e+06 -5.136532737872729e+06 4.370750743840433e+06 -2.798264570725799e+03 -4.228608793838608e+03 -5.785928078130996e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.660000000000000e+02 -1.302087239706470e+06 -5.136617308788694e+06 4.370635024096114e+06 -2.798245078386682e+03 -4.228474921253626e+03 -5.786035793749992e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.670000000000000e+02 -1.302143204382378e+06 -5.136701876893773e+06 4.370519302376869e+06 -2.798225587223418e+03 -4.228341059527255e+03 -5.786143495672130e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.680000000000000e+02 -1.302199168724759e+06 -5.136786442421826e+06 4.370403578368745e+06 -2.798206092899582e+03 -4.228207186466588e+03 -5.786251202296571e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.690000000000000e+02 -1.302255132667936e+06 -5.136871005255869e+06 4.370287852228802e+06 -2.798186596780472e+03 -4.228073313296303e+03 -5.786358904664351e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.700000000000000e+02 -1.302311096233641e+06 -5.136955565434671e+06 4.370172123904987e+06 -2.798167097906439e+03 -4.227939436437810e+03 -5.786466605851079e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.710000000000000e+02 -1.302367059389224e+06 -5.137040122900030e+06 4.370056393475441e+06 -2.798147599254724e+03 -4.227805560952367e+03 -5.786574300828665e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.720000000000000e+02 -1.302423022156341e+06 -5.137124677690601e+06 4.369940660888274e+06 -2.798128097731926e+03 -4.227671683676429e+03 -5.786681993256266e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.730000000000000e+02 -1.302478984546046e+06 -5.137209229826055e+06 4.369824926117075e+06 -2.798108595185156e+03 -4.227537802371223e+03 -5.786789684032574e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.740000000000000e+02 -1.302534946547296e+06 -5.137293779286770e+06 4.369709189188197e+06 -2.798089090248722e+03 -4.227403919133945e+03 -5.786897372162880e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.750000000000000e+02 -1.302590908181825e+06 -5.137378326111505e+06 4.369593450049583e+06 -2.798069582115022e+03 -4.227270030290755e+03 -5.787005060729335e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.760000000000000e+02 -1.302646869384204e+06 -5.137462870183663e+06 4.369477708857818e+06 -2.798050075049148e+03 -4.227136146519418e+03 -5.787112739970709e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.770000000000000e+02 -1.302702830252653e+06 -5.137547411678287e+06 4.369361965377828e+06 -2.798030563498679e+03 -4.227002251754197e+03 -5.787220424211118e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.780000000000000e+02 -1.302758790677794e+06 -5.137631950400553e+06 4.369246219871284e+06 -2.798011051924582e+03 -4.226868364323048e+03 -5.787328097894552e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.790000000000000e+02 -1.302814750736237e+06 -5.137716486486920e+06 4.369130472154891e+06 -2.797991538756917e+03 -4.226734470649661e+03 -5.787435771817499e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.800000000000000e+02 -1.302870710416938e+06 -5.137801019917766e+06 4.369014722255023e+06 -2.797972022812806e+03 -4.226600573753156e+03 -5.787543444220389e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.810000000000000e+02 -1.302926669687003e+06 -5.137885550634525e+06 4.368898970250335e+06 -2.797952505449324e+03 -4.226466678272568e+03 -5.787651111071013e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.820000000000000e+02 -1.302982628590264e+06 -5.137970078715269e+06 4.368783216035970e+06 -2.797932986549781e+03 -4.226332776947059e+03 -5.787758777839810e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.830000000000000e+02 -1.303038587071894e+06 -5.138054604062386e+06 4.368667459743051e+06 -2.797913466175293e+03 -4.226198879331993e+03 -5.787866437366763e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.840000000000000e+02 -1.303094545208497e+06 -5.138139126812328e+06 4.368551701188273e+06 -2.797893943254453e+03 -4.226064972196709e+03 -5.787974099978583e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.850000000000000e+02 -1.303150502912558e+06 -5.138223646809230e+06 4.368435940581037e+06 -2.797874419883062e+03 -4.225931070549343e+03 -5.788081753593043e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.860000000000000e+02 -1.303206460249509e+06 -5.138308164169703e+06 4.368320177764681e+06 -2.797854893283814e+03 -4.225797163345660e+03 -5.788189407618116e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.870000000000000e+02 -1.303262417208550e+06 -5.138392678874478e+06 4.368204412765073e+06 -2.797835365475525e+03 -4.225663251839422e+03 -5.788297060272353e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.880000000000000e+02 -1.303318373789569e+06 -5.138477190923402e+06 4.368088645582433e+06 -2.797815835046566e+03 -4.225529336519085e+03 -5.788404711781864e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.890000000000000e+02 -1.303374329926899e+06 -5.138561700199557e+06 4.367972876373895e+06 -2.797796304592349e+03 -4.225395429069541e+03 -5.788512352338594e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.900000000000000e+02 -1.303430285729911e+06 -5.138646206897731e+06 4.367857104877673e+06 -2.797776771055982e+03 -4.225261509644531e+03 -5.788619998035422e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.910000000000000e+02 -1.303486241122021e+06 -5.138730710881556e+06 4.367741331277038e+06 -2.797757236178169e+03 -4.225127592064508e+03 -5.788727637828275e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.920000000000000e+02 -1.303542196124959e+06 -5.138815212189780e+06 4.367625555519928e+06 -2.797737699100323e+03 -4.224993672825955e+03 -5.788835274691542e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.930000000000000e+02 -1.303598150738854e+06 -5.138899710822613e+06 4.367509777606054e+06 -2.797718161190905e+03 -4.224859751151632e+03 -5.788942908632476e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.940000000000000e+02 -1.303654104963585e+06 -5.138984206779892e+06 4.367393997535643e+06 -2.797698621037845e+03 -4.224725827644546e+03 -5.789050539792114e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.950000000000000e+02 -1.303710058799043e+06 -5.139068700061455e+06 4.367278215308921e+06 -2.797679078687591e+03 -4.224591902440008e+03 -5.789158168050051e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.960000000000000e+02 -1.303766012245348e+06 -5.139153190667496e+06 4.367162430925607e+06 -2.797659535440012e+03 -4.224457974557808e+03 -5.789265793593656e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.970000000000000e+02 -1.303821965280462e+06 -5.139237678558835e+06 4.367046644438404e+06 -2.797639990627658e+03 -4.224324048871755e+03 -5.789373413065920e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.980000000000000e+02 -1.303877917959120e+06 -5.139322163832936e+06 4.366930855716261e+06 -2.797620443295923e+03 -4.224190115242916e+03 -5.789481034430990e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.990000000000000e+02 -1.303933870237520e+06 -5.139406646411831e+06 4.366815064864018e+06 -2.797600894372050e+03 -4.224056181812873e+03 -5.789588651226402e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.000000000000000e+02 -1.303989822126467e+06 -5.139491126314805e+06 4.366699271855749e+06 -2.797581343188309e+03 -4.223922246404399e+03 -5.789696265355999e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.010000000000000e+02 -1.304045773626091e+06 -5.139575603542062e+06 4.366583476691173e+06 -2.797561791343452e+03 -4.223788308535234e+03 -5.789803876510496e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.020000000000000e+02 -1.304101724747192e+06 -5.139660078112888e+06 4.366467679344358e+06 -2.797542236546760e+03 -4.223654367090287e+03 -5.789911486480182e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.030000000000000e+02 -1.304157675435044e+06 -5.139744549929873e+06 4.366351879946315e+06 -2.797522681455169e+03 -4.223520431269972e+03 -5.790019087290761e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.040000000000000e+02 -1.304213625777154e+06 -5.139829019148817e+06 4.366236078287506e+06 -2.797503123798571e+03 -4.223386485554010e+03 -5.790126691468566e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.050000000000000e+02 -1.304269575740638e+06 -5.139913485711216e+06 4.366120274446627e+06 -2.797483563303515e+03 -4.223252536334306e+03 -5.790234294360042e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.060000000000000e+02 -1.304325525292612e+06 -5.139997949558550e+06 4.366004468502374e+06 -2.797464001497981e+03 -4.223118588721897e+03 -5.790341891514061e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.070000000000000e+02 -1.304381474444126e+06 -5.140082410710475e+06 4.365888660428319e+06 -2.797444439493375e+03 -4.222984640751484e+03 -5.790449483931620e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.080000000000000e+02 -1.304437423216827e+06 -5.140166869205605e+06 4.365772850172528e+06 -2.797424874201429e+03 -4.222850689216600e+03 -5.790557075296028e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.090000000000000e+02 -1.304493371599919e+06 -5.140251325024694e+06 4.365657037760888e+06 -2.797405308116851e+03 -4.222716735270635e+03 -5.790664663703358e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.100000000000000e+02 -1.304549319593287e+06 -5.140335778167584e+06 4.365541223193617e+06 -2.797385739779631e+03 -4.222582779572621e+03 -5.790772249273001e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.110000000000000e+02 -1.304605267196815e+06 -5.140420228634110e+06 4.365425406470945e+06 -2.797366169296461e+03 -4.222448822083061e+03 -5.790879831989785e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.120000000000000e+02 -1.304661214410626e+06 -5.140504676424471e+06 4.365309587592595e+06 -2.797346597842874e+03 -4.222314862248932e+03 -5.790987411774269e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.130000000000000e+02 -1.304717161245532e+06 -5.140589121557955e+06 4.365193766532624e+06 -2.797327023940392e+03 -4.222180898537544e+03 -5.791094990387552e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.140000000000000e+02 -1.304773107657721e+06 -5.140673563956619e+06 4.365077943395910e+06 -2.797307448776387e+03 -4.222046938843702e+03 -5.791202561447357e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.150000000000000e+02 -1.304829053701939e+06 -5.140758003717890e+06 4.364962118051358e+06 -2.797287872422953e+03 -4.221912972756625e+03 -5.791310132684796e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.160000000000000e+02 -1.304884999356217e+06 -5.140842440802719e+06 4.364846290551522e+06 -2.797268293347740e+03 -4.221779005131014e+03 -5.791417701121652e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.170000000000000e+02 -1.304940944642288e+06 -5.140926875249821e+06 4.364730460844293e+06 -2.797248711393991e+03 -4.221645031704234e+03 -5.791525270000727e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.180000000000000e+02 -1.304996889494746e+06 -5.141011306942748e+06 4.364614629086384e+06 -2.797229130407076e+03 -4.221511063320124e+03 -5.791632829631020e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.190000000000000e+02 -1.305052833989926e+06 -5.141095736017441e+06 4.364498795094864e+06 -2.797209545774156e+03 -4.221377087869913e+03 -5.791740390967239e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.200000000000000e+02 -1.305108778084026e+06 -5.141180162395963e+06 4.364382958974616e+06 -2.797189959254937e+03 -4.221243112121132e+03 -5.791847948229268e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.210000000000000e+02 -1.305164721777176e+06 -5.141264586078517e+06 4.364267120725368e+06 -2.797170372640100e+03 -4.221109135901118e+03 -5.791955500797078e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.220000000000000e+02 -1.305220665101935e+06 -5.141349007123142e+06 4.364151280269009e+06 -2.797150782165718e+03 -4.220975154550700e+03 -5.792063053716908e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.230000000000000e+02 -1.305276608036595e+06 -5.141433425491164e+06 4.364035437657594e+06 -2.797131191050629e+03 -4.220841170581005e+03 -5.792170603771106e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.240000000000000e+02 -1.305332550559195e+06 -5.141517841143535e+06 4.363919592943680e+06 -2.797111598524447e+03 -4.220707188449135e+03 -5.792278147960771e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.250000000000000e+02 -1.305388492691461e+06 -5.141602254118981e+06 4.363803746075162e+06 -2.797092003729306e+03 -4.220573204725144e+03 -5.792385689200629e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.260000000000000e+02 -1.305444434444439e+06 -5.141686664437135e+06 4.363687897025591e+06 -2.797072407864043e+03 -4.220439216648096e+03 -5.792493229046418e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.270000000000000e+02 -1.305500375828933e+06 -5.141771072117275e+06 4.363572045769022e+06 -2.797052808536733e+03 -4.220305223101568e+03 -5.792600769329803e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.280000000000000e+02 -1.305556316801150e+06 -5.141855477081489e+06 4.363456192410351e+06 -2.797033208208687e+03 -4.220171231278646e+03 -5.792708303662600e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.290000000000000e+02 -1.305612257372129e+06 -5.141939879349421e+06 4.363340336923140e+06 -2.797013607267463e+03 -4.220037239140298e+03 -5.792815833402143e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.300000000000000e+02 -1.305668197563600e+06 -5.142024278959775e+06 4.363224479255266e+06 -2.796994003782439e+03 -4.219903243160719e+03 -5.792923361982199e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.310000000000000e+02 -1.305724137364526e+06 -5.142108675892958e+06 4.363108619433127e+06 -2.796974398022455e+03 -4.219769245362966e+03 -5.793030887783259e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.320000000000000e+02 -1.305780076753191e+06 -5.142193070110306e+06 4.362992757508793e+06 -2.796954792317146e+03 -4.219635249086112e+03 -5.793138407344345e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.330000000000000e+02 -1.305836015794919e+06 -5.142277461728136e+06 4.362876893325613e+06 -2.796935182121820e+03 -4.219501243515148e+03 -5.793245930620741e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.340000000000000e+02 -1.305891954435239e+06 -5.142361850649479e+06 4.362761027014176e+06 -2.796915571625310e+03 -4.219367237512794e+03 -5.793353449259905e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.350000000000000e+02 -1.305947892674032e+06 -5.142446236874178e+06 4.362645158574704e+06 -2.796895959218107e+03 -4.219233231489138e+03 -5.793460963629500e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.360000000000000e+02 -1.306003830500266e+06 -5.142530620382640e+06 4.362529288033601e+06 -2.796876345626349e+03 -4.219099227373343e+03 -5.793568471989598e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.370000000000000e+02 -1.306059767957740e+06 -5.142615001252796e+06 4.362413415285895e+06 -2.796856730111193e+03 -4.218965217404711e+03 -5.793675980428418e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.380000000000000e+02 -1.306115705024504e+06 -5.142699379445615e+06 4.362297540384147e+06 -2.796837112648128e+03 -4.218831205229386e+03 -5.793783486240850e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.390000000000000e+02 -1.306171641700441e+06 -5.142783754960940e+06 4.362181663328592e+06 -2.796817492739735e+03 -4.218697191452496e+03 -5.793890989184232e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.400000000000000e+02 -1.306227577996595e+06 -5.142868127818401e+06 4.362065784092772e+06 -2.796797871675508e+03 -4.218563173316749e+03 -5.793998490772482e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.410000000000000e+02 -1.306283513880093e+06 -5.142952497959551e+06 4.361949902755440e+06 -2.796778249211797e+03 -4.218429157245739e+03 -5.794105986324879e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.420000000000000e+02 -1.306339449394498e+06 -5.143036865461942e+06 4.361834019212116e+06 -2.796758623627830e+03 -4.218295135463633e+03 -5.794213482349872e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.430000000000000e+02 -1.306395384507171e+06 -5.143121230267488e+06 4.361718133541049e+06 -2.796738997577598e+03 -4.218161113198408e+03 -5.794320973845973e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.440000000000000e+02 -1.306451319207088e+06 -5.143205592356609e+06 4.361602245768643e+06 -2.796719370414037e+03 -4.218027092853588e+03 -5.794428459294667e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.450000000000000e+02 -1.306507253592395e+06 -5.143289951903977e+06 4.361486355659525e+06 -2.796699737697531e+03 -4.217893057772732e+03 -5.794535952950030e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.460000000000000e+02 -1.306563187510359e+06 -5.143374308637823e+06 4.361370463579904e+06 -2.796680107346928e+03 -4.217759033094347e+03 -5.794643432790268e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.470000000000000e+02 -1.306619121037216e+06 -5.143458662693858e+06 4.361254569346931e+06 -2.796660474373983e+03 -4.217625007109932e+03 -5.794750909615816e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.480000000000000e+02 -1.306675054194925e+06 -5.143543014111125e+06 4.361138672907964e+06 -2.796640839618296e+03 -4.217490974686420e+03 -5.794858386896100e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.490000000000000e+02 -1.306730986983368e+06 -5.143627362889463e+06 4.361022774263230e+06 -2.796621201743855e+03 -4.217356936894078e+03 -5.794965864392431e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.500000000000000e+02 -1.306786919347842e+06 -5.143711708931589e+06 4.360906873543851e+06 -2.796601562850675e+03 -4.217222902806719e+03 -5.795073334474433e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.510000000000000e+02 -1.306842851332150e+06 -5.143796052315406e+06 4.360790970644828e+06 -2.796581923073495e+03 -4.217088864488302e+03 -5.795180802991922e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.520000000000000e+02 -1.306898782914329e+06 -5.143880393001899e+06 4.360675065618748e+06 -2.796562281040420e+03 -4.216954826203025e+03 -5.795288267344941e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.530000000000000e+02 -1.306954714105190e+06 -5.143964731010335e+06 4.360559158439656e+06 -2.796542637099355e+03 -4.216820786193158e+03 -5.795395728696192e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.540000000000000e+02 -1.307010644937607e+06 -5.144049066399178e+06 4.360443249028726e+06 -2.796522990867239e+03 -4.216686738076471e+03 -5.795503191954274e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.550000000000000e+02 -1.307066575367795e+06 -5.144133399090573e+06 4.360327337490906e+06 -2.796503342818177e+03 -4.216552690058155e+03 -5.795610650815868e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.560000000000000e+02 -1.307122505384725e+06 -5.144217729064953e+06 4.360211423852609e+06 -2.796483693509309e+03 -4.216418643940556e+03 -5.795718103707583e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.570000000000000e+02 -1.307178435010351e+06 -5.144302056361353e+06 4.360095508061194e+06 -2.796464043386796e+03 -4.216284595461277e+03 -5.795825553614330e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.580000000000000e+02 -1.307234364277232e+06 -5.144386381037749e+06 4.359979590038495e+06 -2.796444389181064e+03 -4.216150539734557e+03 -5.795933005536419e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.590000000000000e+02 -1.307290293130908e+06 -5.144470702997243e+06 4.359863669915156e+06 -2.796424735069289e+03 -4.216016485327289e+03 -5.796040451355769e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.600000000000000e+02 -1.307346221582179e+06 -5.144555022259106e+06 4.359747747665224e+06 -2.796405079187086e+03 -4.215882431039888e+03 -5.796147892743888e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.610000000000000e+02 -1.307402149641847e+06 -5.144639338842583e+06 4.359631823262726e+06 -2.796385420957077e+03 -4.215748374734931e+03 -5.796255331531947e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.620000000000000e+02 -1.307458077320956e+06 -5.144723652767299e+06 4.359515896681212e+06 -2.796365761631992e+03 -4.215614314468717e+03 -5.796362768642244e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.630000000000000e+02 -1.307514004641220e+06 -5.144807964071915e+06 4.359399967868521e+06 -2.796346098639828e+03 -4.215480246532395e+03 -5.796470207907178e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.640000000000000e+02 -1.307569931515194e+06 -5.144892272600952e+06 4.359284037034378e+06 -2.796326435675139e+03 -4.215346186314843e+03 -5.796577636338778e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.650000000000000e+02 -1.307625858019418e+06 -5.144976578490522e+06 4.359168103995195e+06 -2.796306770995637e+03 -4.215212119899623e+03 -5.796685065014497e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.660000000000000e+02 -1.307681784142858e+06 -5.145060881721038e+06 4.359052168777382e+06 -2.796287103616357e+03 -4.215078049816899e+03 -5.796792492463868e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.670000000000000e+02 -1.307737709841739e+06 -5.145145182214693e+06 4.358936231485915e+06 -2.796267435376641e+03 -4.214943983421462e+03 -5.796899912449787e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.680000000000000e+02 -1.307793635159846e+06 -5.145229480049338e+06 4.358820292015770e+06 -2.796247766010531e+03 -4.214809912924199e+03 -5.797007330875324e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.690000000000000e+02 -1.307849560107980e+06 -5.145313775244226e+06 4.358704350340970e+06 -2.796228093202591e+03 -4.214675836759148e+03 -5.797114749871530e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.700000000000000e+02 -1.307905484675107e+06 -5.145398067779773e+06 4.358588406487932e+06 -2.796208417837175e+03 -4.214541756873779e+03 -5.797222167620788e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.710000000000000e+02 -1.307961408817695e+06 -5.145482357578547e+06 4.358472460561142e+06 -2.796188743130892e+03 -4.214407680299842e+03 -5.797329577552163e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.720000000000000e+02 -1.308017332579206e+06 -5.145566644717904e+06 4.358356512456230e+06 -2.796169065124840e+03 -4.214273600244556e+03 -5.797436986369079e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.730000000000000e+02 -1.308073255937939e+06 -5.145650929159229e+06 4.358240562225298e+06 -2.796149386891881e+03 -4.214139519582045e+03 -5.797544390651728e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.740000000000000e+02 -1.308129178915607e+06 -5.145735210941177e+06 4.358124609816185e+06 -2.796129705880511e+03 -4.214005435167276e+03 -5.797651793803439e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.750000000000000e+02 -1.308185101523004e+06 -5.145819490082996e+06 4.358008655202925e+06 -2.796110021591009e+03 -4.213871345481502e+03 -5.797759197161477e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.760000000000000e+02 -1.308241023716604e+06 -5.145903766507249e+06 4.357892698490014e+06 -2.796090337720662e+03 -4.213737256843759e+03 -5.797866594485179e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.770000000000000e+02 -1.308296945507205e+06 -5.145988040233192e+06 4.357776739651479e+06 -2.796070651827972e+03 -4.213603168498069e+03 -5.797973987356197e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.780000000000000e+02 -1.308352866927431e+06 -5.146072311318877e+06 4.357660778608964e+06 -2.796050962887754e+03 -4.213469074375805e+03 -5.798081380712738e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.790000000000000e+02 -1.308408787922838e+06 -5.146156579667483e+06 4.357544815493165e+06 -2.796031274491032e+03 -4.213334983724123e+03 -5.798188766183331e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.800000000000000e+02 -1.308464708569708e+06 -5.146240845414681e+06 4.357428850120939e+06 -2.796011581912016e+03 -4.213200883583217e+03 -5.798296155371849e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.810000000000000e+02 -1.308520628780618e+06 -5.146325108405069e+06 4.357312882702078e+06 -2.795991889211528e+03 -4.213066789172392e+03 -5.798403535273434e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.820000000000000e+02 -1.308576548632082e+06 -5.146409368774686e+06 4.357196913052929e+06 -2.795972193916188e+03 -4.212932686728696e+03 -5.798510917147553e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.830000000000000e+02 -1.308632468080258e+06 -5.146493626445627e+06 4.357080941278663e+06 -2.795952496687357e+03 -4.212798584392107e+03 -5.798618294669644e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.840000000000000e+02 -1.308688387136179e+06 -5.146577881437502e+06 4.356964967352823e+06 -2.795932798608201e+03 -4.212664480090886e+03 -5.798725668926945e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.850000000000000e+02 -1.308744305799732e+06 -5.146662133750147e+06 4.356848991275616e+06 -2.795913098227812e+03 -4.212530373527186e+03 -5.798833040746421e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.860000000000000e+02 -1.308800224070804e+06 -5.146746383383404e+06 4.356733013047273e+06 -2.795893395634910e+03 -4.212396265431260e+03 -5.798940409548505e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.870000000000000e+02 -1.308856141960427e+06 -5.146830630356871e+06 4.356617032641323e+06 -2.795873691755825e+03 -4.212262153026568e+03 -5.799047777009080e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.880000000000000e+02 -1.308912059446666e+06 -5.146914874631589e+06 4.356501050110374e+06 -2.795853986112831e+03 -4.212128040551605e+03 -5.799155140178990e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.890000000000000e+02 -1.308967976518485e+06 -5.146999116187993e+06 4.356385065480864e+06 -2.795834279031921e+03 -4.211993930125127e+03 -5.799262497348658e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.900000000000000e+02 -1.309023893219671e+06 -5.147083355103889e+06 4.356269078647712e+06 -2.795814570568434e+03 -4.211859813453164e+03 -5.799369854655544e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.910000000000000e+02 -1.309079809528272e+06 -5.147167591340314e+06 4.356153089663543e+06 -2.795794859447240e+03 -4.211725695109997e+03 -5.799477209234147e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.920000000000000e+02 -1.309135725455095e+06 -5.147251824916507e+06 4.356037098502374e+06 -2.795775145920033e+03 -4.211591572952691e+03 -5.799584562570872e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.930000000000000e+02 -1.309191640967519e+06 -5.147336055774469e+06 4.355921105242539e+06 -2.795755432379923e+03 -4.211457452197898e+03 -5.799691909792823e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.940000000000000e+02 -1.309247556098172e+06 -5.147420283972241e+06 4.355805109805656e+06 -2.795735716241937e+03 -4.211323327814965e+03 -5.799799255714845e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.950000000000000e+02 -1.309303470836025e+06 -5.147504509490262e+06 4.355689112218146e+06 -2.795715997732424e+03 -4.211189201540075e+03 -5.799906598953090e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.960000000000000e+02 -1.309359385170287e+06 -5.147588732309333e+06 4.355573112505941e+06 -2.795696278947054e+03 -4.211055074793174e+03 -5.800013937578714e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.970000000000000e+02 -1.309415299155329e+06 -5.147672952526151e+06 4.355457110538411e+06 -2.795676555626027e+03 -4.210920938840231e+03 -5.800121279854231e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.980000000000000e+02 -1.309471212703973e+06 -5.147757169985757e+06 4.355341106524907e+06 -2.795656833245146e+03 -4.210786808110224e+03 -5.800228612781328e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.990000000000000e+02 -1.309527125848847e+06 -5.147841384746180e+06 4.355225100387044e+06 -2.795637109212253e+03 -4.210652677460377e+03 -5.800335941260457e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.000000000000000e+02 -1.309583038633477e+06 -5.147925596884830e+06 4.355109092020230e+06 -2.795617381431390e+03 -4.210518539321916e+03 -5.800443271785148e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.010000000000000e+02 -1.309638951036166e+06 -5.148009806363115e+06 4.354993081476595e+06 -2.795597652483966e+03 -4.210384396868576e+03 -5.800550600921731e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.020000000000000e+02 -1.309694863024069e+06 -5.148094013122700e+06 4.354877068834974e+06 -2.795577922331183e+03 -4.210250256264062e+03 -5.800657924110932e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.030000000000000e+02 -1.309750774607971e+06 -5.148178217182822e+06 4.354761054069393e+06 -2.795558189991293e+03 -4.210116116016256e+03 -5.800765242870316e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.040000000000000e+02 -1.309806685798920e+06 -5.148262418563070e+06 4.354645037153371e+06 -2.795538457350550e+03 -4.209981973218783e+03 -5.800872558570332e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.050000000000000e+02 -1.309862596618616e+06 -5.148346617302063e+06 4.354529018034708e+06 -2.795518721151981e+03 -4.209847824720222e+03 -5.800979874908660e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.060000000000000e+02 -1.309918507045124e+06 -5.148430813360862e+06 4.354412996766052e+06 -2.795498982974901e+03 -4.209713674679979e+03 -5.801087188139109e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.070000000000000e+02 -1.309974417067657e+06 -5.148515006720276e+06 4.354296973373324e+06 -2.795479244299147e+03 -4.209579523908455e+03 -5.801194497042995e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.080000000000000e+02 -1.310030326718751e+06 -5.148599197438190e+06 4.354180947778300e+06 -2.795459502006101e+03 -4.209445367916193e+03 -5.801301806252925e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.090000000000000e+02 -1.310086235922159e+06 -5.148683385379088e+06 4.354064920164155e+06 -2.795439761298818e+03 -4.209311218882144e+03 -5.801409104560887e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.100000000000000e+02 -1.310142144754142e+06 -5.148767570678526e+06 4.353948890347660e+06 -2.795420017509850e+03 -4.209177064084010e+03 -5.801516403354814e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.110000000000000e+02 -1.310198053225488e+06 -5.148851753355725e+06 4.353832858302819e+06 -2.795400269855244e+03 -4.209042901993304e+03 -5.801623704095335e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.120000000000000e+02 -1.310253961259952e+06 -5.148935933275188e+06 4.353716824212833e+06 -2.795380523365585e+03 -4.208908745235744e+03 -5.801730995316187e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.130000000000000e+02 -1.310309868922885e+06 -5.149020110553064e+06 4.353600787920658e+06 -2.795360773790034e+03 -4.208774582524692e+03 -5.801838287164685e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.140000000000000e+02 -1.310365776203253e+06 -5.149104285169804e+06 4.353484749452729e+06 -2.795341021291264e+03 -4.208640416231407e+03 -5.801945577813395e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.150000000000000e+02 -1.310421683068457e+06 -5.149188457067462e+06 4.353368708887409e+06 -2.795321269097083e+03 -4.208506251607150e+03 -5.802052862020404e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.160000000000000e+02 -1.310477589551113e+06 -5.149272626304027e+06 4.353252666146278e+06 -2.795301514259009e+03 -4.208372082952805e+03 -5.802160145243372e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.170000000000000e+02 -1.310533495651100e+06 -5.149356792879337e+06 4.353136621229568e+06 -2.795281756498342e+03 -4.208237910754280e+03 -5.802267427237857e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.180000000000000e+02 -1.310589401357634e+06 -5.149440956774210e+06 4.353020574163206e+06 -2.795261998041367e+03 -4.208103736230806e+03 -5.802374706170905e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.190000000000000e+02 -1.310645306659696e+06 -5.149525117969097e+06 4.352904524973629e+06 -2.795242237933649e+03 -4.207969561483691e+03 -5.802481980882055e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.200000000000000e+02 -1.310701211546254e+06 -5.149609276444463e+06 4.352788473687286e+06 -2.795222476350660e+03 -4.207835389070935e+03 -5.802589249401230e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.210000000000000e+02 -1.310757116050164e+06 -5.149693432258653e+06 4.352672420225252e+06 -2.795202713491935e+03 -4.207701212079462e+03 -5.802696516772444e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.220000000000000e+02 -1.310813020182143e+06 -5.149777585430765e+06 4.352556364561703e+06 -2.795182947191983e+03 -4.207567029877995e+03 -5.802803784366541e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.230000000000000e+02 -1.310868923931400e+06 -5.149861735941620e+06 4.352440306722573e+06 -2.795163179304579e+03 -4.207432843290299e+03 -5.802911050799296e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.240000000000000e+02 -1.310924827243282e+06 -5.149945883694153e+06 4.352324246839168e+06 -2.795143411386957e+03 -4.207298662522793e+03 -5.803018307853191e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.250000000000000e+02 -1.310980730194029e+06 -5.150030028823863e+06 4.352208184728199e+06 -2.795123639516580e+03 -4.207164474265654e+03 -5.803125567033261e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.260000000000000e+02 -1.311036632740137e+06 -5.150114171253436e+06 4.352092120494254e+06 -2.795103867589908e+03 -4.207030285495965e+03 -5.803232821541318e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.270000000000000e+02 -1.311092534903302e+06 -5.150198311021469e+06 4.351976054085121e+06 -2.795084092692480e+03 -4.206896092971126e+03 -5.803340074996708e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.280000000000000e+02 -1.311148436661596e+06 -5.150282448089040e+06 4.351859985553464e+06 -2.795064316152281e+03 -4.206761900717237e+03 -5.803447323860799e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.290000000000000e+02 -1.311204338026051e+06 -5.150366582475730e+06 4.351743914872785e+06 -2.795044538866537e+03 -4.206627705852162e+03 -5.803554569896367e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.300000000000000e+02 -1.311260238996551e+06 -5.150450714181378e+06 4.351627842043307e+06 -2.795024759232971e+03 -4.206493509203121e+03 -5.803661813158134e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.310000000000000e+02 -1.311316139551166e+06 -5.150534843167077e+06 4.351511767117700e+06 -2.795004978404122e+03 -4.206359314632945e+03 -5.803769050302380e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.320000000000000e+02 -1.311372039733651e+06 -5.150618969510522e+06 4.351395689990800e+06 -2.794985195686965e+03 -4.206225113852977e+03 -5.803876287762029e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.330000000000000e+02 -1.311427939521999e+06 -5.150703093172687e+06 4.351279610715441e+06 -2.794965410464462e+03 -4.206090911310057e+03 -5.803983522497981e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.340000000000000e+02 -1.311483838927234e+06 -5.150787214173142e+06 4.351163529265127e+06 -2.794945623690289e+03 -4.205956704749832e+03 -5.804090755783486e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.350000000000000e+02 -1.311539737927437e+06 -5.150871332472986e+06 4.351047445692519e+06 -2.794925835457786e+03 -4.205822498125017e+03 -5.804197984650088e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.360000000000000e+02 -1.311595636533390e+06 -5.150955448091419e+06 4.350931359971623e+06 -2.794906044762935e+03 -4.205688289645052e+03 -5.804305210843409e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.370000000000000e+02 -1.311651534745222e+06 -5.151039561028655e+06 4.350815272102161e+06 -2.794886253284464e+03 -4.205554078988739e+03 -5.804412433901768e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.380000000000000e+02 -1.311707432562820e+06 -5.151123671284528e+06 4.350699182084360e+06 -2.794866459718828e+03 -4.205419866299023e+03 -5.804519654262548e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.390000000000000e+02 -1.311763329996973e+06 -5.151207778878249e+06 4.350583089892217e+06 -2.794846663276325e+03 -4.205285650125260e+03 -5.804626873329731e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.400000000000000e+02 -1.311819227015085e+06 -5.151291883751903e+06 4.350466995604129e+06 -2.794826867076580e+03 -4.205151435074533e+03 -5.804734086389522e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.410000000000000e+02 -1.311875123649763e+06 -5.151375985963446e+06 4.350350899141643e+06 -2.794807068148594e+03 -4.205017216522430e+03 -5.804841298106615e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.420000000000000e+02 -1.311931019879076e+06 -5.151460085473973e+06 4.350234800557436e+06 -2.794787267369238e+03 -4.204882997900683e+03 -5.804948505573024e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.430000000000000e+02 -1.311986915714057e+06 -5.151544182303058e+06 4.350118699825010e+06 -2.794767465904913e+03 -4.204748776951711e+03 -5.805055709975318e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.440000000000000e+02 -1.312042811198216e+06 -5.151628276528015e+06 4.350002596839679e+06 -2.794747660232191e+03 -4.204614546785225e+03 -5.805162917885872e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.450000000000000e+02 -1.312098706244188e+06 -5.151712367993727e+06 4.349886491811473e+06 -2.794727854289453e+03 -4.204480321998616e+03 -5.805270116849917e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.460000000000000e+02 -1.312154600928437e+06 -5.151796456835981e+06 4.349770384556539e+06 -2.794708045984114e+03 -4.204346089585973e+03 -5.805377317373704e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.470000000000000e+02 -1.312210495163524e+06 -5.151880542899556e+06 4.349654275285078e+06 -2.794688237462495e+03 -4.204211864737912e+03 -5.805484507311186e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.480000000000000e+02 -1.312266389047726e+06 -5.151964626358952e+06 4.349538163760769e+06 -2.794668426134027e+03 -4.204077630072589e+03 -5.805591700616284e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.490000000000000e+02 -1.312322282526399e+06 -5.152048707117178e+06 4.349422050114973e+06 -2.794648613148791e+03 -4.203943395380079e+03 -5.805698889558513e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.500000000000000e+02 -1.312378175610333e+06 -5.152132785193435e+06 4.349305934321688e+06 -2.794628797923475e+03 -4.203809159017880e+03 -5.805806075597476e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.510000000000000e+02 -1.312434068299651e+06 -5.152216860587929e+06 4.349189816380635e+06 -2.794608981818085e+03 -4.203674920096150e+03 -5.805913258825521e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.520000000000000e+02 -1.312489960583335e+06 -5.152300933281137e+06 4.349073696318266e+06 -2.794589163898357e+03 -4.203540681435647e+03 -5.806020437543132e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.530000000000000e+02 -1.312545852504892e+06 -5.152385003350338e+06 4.348957574029889e+06 -2.794569342517689e+03 -4.203406435177086e+03 -5.806127618255904e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.540000000000000e+02 -1.312601744020822e+06 -5.152469070718293e+06 4.348841449620145e+06 -2.794549520754554e+03 -4.203272188416088e+03 -5.806234794427046e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.550000000000000e+02 -1.312657635120104e+06 -5.152553135365480e+06 4.348725323115491e+06 -2.794529697454786e+03 -4.203137943788304e+03 -5.806341964586201e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.560000000000000e+02 -1.312713525813534e+06 -5.152637197311097e+06 4.348609194489921e+06 -2.794509872691586e+03 -4.203003698871295e+03 -5.806449130496770e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.570000000000000e+02 -1.312769416144850e+06 -5.152721256632790e+06 4.348493063638231e+06 -2.794490045486315e+03 -4.202869446281152e+03 -5.806556298032900e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.580000000000000e+02 -1.312825306070243e+06 -5.152805313252837e+06 4.348376930665739e+06 -2.794470216236395e+03 -4.202735193809768e+03 -5.806663461260361e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.590000000000000e+02 -1.312881195600737e+06 -5.152889367190800e+06 4.348260795545935e+06 -2.794450386015004e+03 -4.202600939080941e+03 -5.806770621491291e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.600000000000000e+02 -1.312937084736220e+06 -5.152973418446507e+06 4.348144658279043e+06 -2.794430553629235e+03 -4.202466682196235e+03 -5.806877779147379e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.610000000000000e+02 -1.312992973476578e+06 -5.153057467019809e+06 4.348028518865286e+06 -2.794410719014704e+03 -4.202332423829492e+03 -5.806984933756669e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.620000000000000e+02 -1.313048861821931e+06 -5.153141512910907e+06 4.347912377304394e+06 -2.794390883560545e+03 -4.202198163079908e+03 -5.807092085407337e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.630000000000000e+02 -1.313104749783074e+06 -5.153225556138990e+06 4.347796233570343e+06 -2.794371045428031e+03 -4.202063898429014e+03 -5.807199235988970e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.640000000000000e+02 -1.313160637338080e+06 -5.153309596665188e+06 4.347680087715841e+06 -2.794351205495626e+03 -4.201929634035467e+03 -5.807306382057865e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.650000000000000e+02 -1.313216524497978e+06 -5.153393634509055e+06 4.347563939714367e+06 -2.794331364846791e+03 -4.201795367136883e+03 -5.807413525207250e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.660000000000000e+02 -1.313272411251748e+06 -5.153477669651086e+06 4.347447789592384e+06 -2.794311522252610e+03 -4.201661100435393e+03 -5.807520663949378e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.670000000000000e+02 -1.313328297642891e+06 -5.153561702168522e+06 4.347331637245169e+06 -2.794291676179658e+03 -4.201526826065473e+03 -5.807627804743061e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.680000000000000e+02 -1.313384183595206e+06 -5.153645731926098e+06 4.347215482856107e+06 -2.794271831074238e+03 -4.201392557076891e+03 -5.807734936080517e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.690000000000000e+02 -1.313440069163097e+06 -5.153729759020419e+06 4.347099326294231e+06 -2.794251983384188e+03 -4.201258284228796e+03 -5.807842066278810e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.700000000000000e+02 -1.313495954357351e+06 -5.153813783470675e+06 4.346983167533530e+06 -2.794232132415747e+03 -4.201124005918984e+03 -5.807949196811946e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.710000000000000e+02 -1.313551839156285e+06 -5.153897805238361e+06 4.346867006626202e+06 -2.794212280664766e+03 -4.200989725205576e+03 -5.808056324377880e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.720000000000000e+02 -1.313607723548801e+06 -5.153981824303846e+06 4.346750843598878e+06 -2.794192426646375e+03 -4.200855444810266e+03 -5.808163447581470e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.730000000000000e+02 -1.313663607524121e+06 -5.154065840647978e+06 4.346634678477520e+06 -2.794172572776189e+03 -4.200721165692706e+03 -5.808270564707297e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.740000000000000e+02 -1.313719491125745e+06 -5.154149854348002e+06 4.346518511157388e+06 -2.794152715835337e+03 -4.200586880882891e+03 -5.808377682251589e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.750000000000000e+02 -1.313775374353551e+06 -5.154233865403756e+06 4.346402341638717e+06 -2.794132855450279e+03 -4.200452590749601e+03 -5.808484800096648e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.760000000000000e+02 -1.313831257174960e+06 -5.154317873757386e+06 4.346286169999939e+06 -2.794112995059229e+03 -4.200318300013974e+03 -5.808591913318818e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.770000000000000e+02 -1.313887139535343e+06 -5.154401879311997e+06 4.346169996372498e+06 -2.794093135039730e+03 -4.200184018722131e+03 -5.808699014331242e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.780000000000000e+02 -1.313943021576319e+06 -5.154485882318957e+06 4.346053820415467e+06 -2.794073269549990e+03 -4.200049722561817e+03 -5.808806123547126e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.790000000000000e+02 -1.313998903199888e+06 -5.154569882604327e+06 4.345937642364750e+06 -2.794053404191803e+03 -4.199915427609746e+03 -5.808913226744147e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.800000000000000e+02 -1.314054784438643e+06 -5.154653880225993e+06 4.345821462141840e+06 -2.794033536112621e+03 -4.199781129155034e+03 -5.809020328593730e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.810000000000000e+02 -1.314110665270664e+06 -5.154737875145101e+06 4.345705279799457e+06 -2.794013666304471e+03 -4.199646830780273e+03 -5.809127426033644e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.820000000000000e+02 -1.314166545739683e+06 -5.154821867439232e+06 4.345589095232334e+06 -2.793993794172112e+03 -4.199512524152139e+03 -5.809234525473535e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.830000000000000e+02 -1.314222425747389e+06 -5.154905856933999e+06 4.345472908677072e+06 -2.793973922258550e+03 -4.199378227370659e+03 -5.809341612471721e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.840000000000000e+02 -1.314278305402926e+06 -5.154989843823059e+06 4.345356719870945e+06 -2.793954047640989e+03 -4.199243920730596e+03 -5.809448702814709e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.850000000000000e+02 -1.314334184651670e+06 -5.155073828009518e+06 4.345240528945399e+06 -2.793934171317364e+03 -4.199109613856365e+03 -5.809555788971027e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.860000000000000e+02 -1.314390063515303e+06 -5.155157809531907e+06 4.345124335848171e+06 -2.793914292071247e+03 -4.198975303669815e+03 -5.809662873722683e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.870000000000000e+02 -1.314445941950352e+06 -5.155241788313054e+06 4.345008140683969e+06 -2.793894413704070e+03 -4.198840996505010e+03 -5.809769950805112e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.880000000000000e+02 -1.314501820000304e+06 -5.155325764430178e+06 4.344891943348033e+06 -2.793874532434760e+03 -4.198706685867413e+03 -5.809877026593213e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.890000000000000e+02 -1.314557697675947e+06 -5.155409737902450e+06 4.344775743814329e+06 -2.793854648029223e+03 -4.198572369409181e+03 -5.809984102919606e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.900000000000000e+02 -1.314613574944697e+06 -5.155493708672049e+06 4.344659542161341e+06 -2.793834763380746e+03 -4.198438052744485e+03 -5.810091174430280e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.910000000000000e+02 -1.314669451828246e+06 -5.155577676777493e+06 4.344543338336770e+06 -2.793814875888236e+03 -4.198303732011799e+03 -5.810198245061862e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.920000000000000e+02 -1.314725328304674e+06 -5.155661642179944e+06 4.344427132393359e+06 -2.793794986698535e+03 -4.198169411616048e+03 -5.810305311081454e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.930000000000000e+02 -1.314781204374105e+06 -5.155745604879602e+06 4.344310924330824e+06 -2.793775097070085e+03 -4.198035090666776e+03 -5.810412372623695e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.940000000000000e+02 -1.314837080047329e+06 -5.155829564895649e+06 4.344194714123146e+06 -2.793755205471776e+03 -4.197900767950180e+03 -5.810519431222855e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.950000000000000e+02 -1.314892955367830e+06 -5.155913522305273e+06 4.344078501665536e+06 -2.793735309498355e+03 -4.197766435806909e+03 -5.810626493539496e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.960000000000000e+02 -1.314948830259428e+06 -5.155997476973307e+06 4.343962287141477e+06 -2.793715414220575e+03 -4.197632106908217e+03 -5.810733548100145e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.970000000000000e+02 -1.315004704721931e+06 -5.156081428899480e+06 4.343846070551366e+06 -2.793695517646234e+03 -4.197497782113195e+03 -5.810840595099618e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.980000000000000e+02 -1.315060578820864e+06 -5.156165378200010e+06 4.343729851737413e+06 -2.793675618856290e+03 -4.197363449367826e+03 -5.810947643826742e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.990000000000000e+02 -1.315116452534311e+06 -5.156249324836061e+06 4.343613630752341e+06 -2.793655717330244e+03 -4.197229112782068e+03 -5.811054691461026e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.000000000000000e+02 -1.315172325829456e+06 -5.156333268749468e+06 4.343497407675137e+06 -2.793635814441489e+03 -4.197094778309895e+03 -5.811161733032358e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.010000000000000e+02 -1.315228198750026e+06 -5.156417210017766e+06 4.343381182400514e+06 -2.793615910014272e+03 -4.196960437496717e+03 -5.811268774859845e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.020000000000000e+02 -1.315284071274105e+06 -5.156501148602135e+06 4.343264954981196e+06 -2.793596003201988e+03 -4.196826095224592e+03 -5.811375813688950e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.030000000000000e+02 -1.315339943357977e+06 -5.156585084425072e+06 4.343148725522427e+06 -2.793576095995393e+03 -4.196691758162251e+03 -5.811482843765762e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.040000000000000e+02 -1.315395815110765e+06 -5.156669017680109e+06 4.343032493761386e+06 -2.793556185279116e+03 -4.196557407777233e+03 -5.811589880075238e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.050000000000000e+02 -1.315451686412460e+06 -5.156752948154435e+06 4.342916259987096e+06 -2.793536274600734e+03 -4.196423064915097e+03 -5.811696905744496e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.060000000000000e+02 -1.315507557339238e+06 -5.156836875983207e+06 4.342800024016004e+06 -2.793516360759811e+03 -4.196288716509792e+03 -5.811803931755611e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.070000000000000e+02 -1.315563427891228e+06 -5.156920801166623e+06 4.342683785847824e+06 -2.793496445157632e+03 -4.196154361846508e+03 -5.811910958053169e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.080000000000000e+02 -1.315619298024635e+06 -5.157004723627083e+06 4.342567545587975e+06 -2.793476527753936e+03 -4.196020009538225e+03 -5.812017978293104e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.090000000000000e+02 -1.315675167772284e+06 -5.157088643422776e+06 4.342451303157403e+06 -2.793456609154884e+03 -4.195885652738092e+03 -5.812124997279658e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.100000000000000e+02 -1.315731037090464e+06 -5.157172560476231e+06 4.342335058661377e+06 -2.793436689753626e+03 -4.195751300012280e+03 -5.812232008523895e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.110000000000000e+02 -1.315786906033552e+06 -5.157256474883924e+06 4.342218811968820e+06 -2.793416767011295e+03 -4.195616941503966e+03 -5.812339020360246e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.120000000000000e+02 -1.315842774579876e+06 -5.157340386607401e+06 4.342102563131975e+06 -2.793396843625939e+03 -4.195482580695908e+03 -5.812446029094775e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.130000000000000e+02 -1.315898642740221e+06 -5.157424295665832e+06 4.341986312124806e+06 -2.793376917541618e+03 -4.195348216263527e+03 -5.812553036560421e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.140000000000000e+02 -1.315954510459976e+06 -5.157508201962416e+06 4.341870059078837e+06 -2.793356990901156e+03 -4.195213857409690e+03 -5.812660035071878e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.150000000000000e+02 -1.316010377837354e+06 -5.157592105671302e+06 4.341753803757452e+06 -2.793337061383379e+03 -4.195079487049569e+03 -5.812767038207460e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.160000000000000e+02 -1.316066244785052e+06 -5.157676006637707e+06 4.341637546370951e+06 -2.793317130760566e+03 -4.194945120112915e+03 -5.812874034208362e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.170000000000000e+02 -1.316122111379243e+06 -5.157759904996760e+06 4.341521286735740e+06 -2.793297196242784e+03 -4.194810744180533e+03 -5.812981033402404e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.180000000000000e+02 -1.316177977511070e+06 -5.157843800555406e+06 4.341405025114153e+06 -2.793277263617065e+03 -4.194676376983342e+03 -5.813088020295197e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.190000000000000e+02 -1.316233843289397e+06 -5.157927693506735e+06 4.341288761243795e+06 -2.793257326881756e+03 -4.194542000564334e+03 -5.813195010636992e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.200000000000000e+02 -1.316289708659623e+06 -5.158011583753960e+06 4.341172495256201e+06 -2.793237388462810e+03 -4.194407624097960e+03 -5.813301996647217e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.210000000000000e+02 -1.316345573632766e+06 -5.158095471316611e+06 4.341056227124834e+06 -2.793217449112217e+03 -4.194273245440235e+03 -5.813408979595673e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.220000000000000e+02 -1.316401438197736e+06 -5.158179356175082e+06 4.340939956876348e+06 -2.793197507617263e+03 -4.194138866869168e+03 -5.813515958305503e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.230000000000000e+02 -1.316457302398246e+06 -5.158263238406861e+06 4.340823684405410e+06 -2.793177563862843e+03 -4.194004480439412e+03 -5.813622938687818e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.240000000000000e+02 -1.316513166179695e+06 -5.158347117915181e+06 4.340707409843558e+06 -2.793157618844231e+03 -4.193870095745550e+03 -5.813729913248483e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.250000000000000e+02 -1.316569029585554e+06 -5.158430994777160e+06 4.340591133085966e+06 -2.793137670505457e+03 -4.193735705681932e+03 -5.813836888085558e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.260000000000000e+02 -1.316624892528777e+06 -5.158514868838442e+06 4.340474854342478e+06 -2.793117724418763e+03 -4.193601324451075e+03 -5.813943850403319e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.270000000000000e+02 -1.316680755107319e+06 -5.158598740272753e+06 4.340358573376931e+06 -2.793097774577044e+03 -4.193466935728789e+03 -5.814050814743901e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.280000000000000e+02 -1.316736617310164e+06 -5.158682609060599e+06 4.340242290215809e+06 -2.793077821481064e+03 -4.193332541420928e+03 -5.814157779492452e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.290000000000000e+02 -1.316792479126544e+06 -5.158766475182864e+06 4.340126004885103e+06 -2.793057867273805e+03 -4.193198142972903e+03 -5.814264742691439e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.300000000000000e+02 -1.316848340512755e+06 -5.158850338562118e+06 4.340009717490100e+06 -2.793037912068963e+03 -4.193063748293321e+03 -5.814371698459459e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.310000000000000e+02 -1.316904201534062e+06 -5.158934199314109e+06 4.339893427873428e+06 -2.793017953285129e+03 -4.192929346324219e+03 -5.814478656026865e+03 1.903985097300000e-03 6.580622951500000e-04 1.196710257900000e-03 2.245751482300000e-03 1.827742427400000e-03 3.511949618300000e-03</EPHEMLIST>\n\t\t</EPHEMLISTList>\n\t</EPH>\n\t<ATT>\n\t\t<SATID>Imaginary1</SATID>\n\t\t<GENERATIONTIME>1432-11-30T00:18:13.000000Z</GENERATIONTIME>\n\t\t<STARTTIME>1432-11-25T17:40:21.387413Z</STARTTIME>\n\t\t<NUMPOINTS>931</NUMPOINTS>\n\t\t<TIMEINTERVAL>2.000000000000000e-02</TIMEINTERVAL>\n\t\t<ATTLISTList>\n\t\t\t<ATTLIST>1.000000000000000e+00 5.963495484933250e-01 -6.934368026823722e-01 -3.205075648978710e-01 -2.465512472908900e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.000000000000000e+00 5.963334485063230e-01 -6.934402641385681e-01 -3.205023134940338e-01 -2.465872772649916e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.000000000000000e+00 5.963173459829008e-01 -6.934437240797997e-01 -3.204970630833572e-01 -2.466233098658573e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.000000000000000e+00 5.963012409191887e-01 -6.934471825095347e-01 -3.204918136671009e-01 -2.466593450899359e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.000000000000000e+00 5.962851333581405e-01 -6.934506393968903e-01 -3.204865652212883e-01 -2.466953829498429e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.000000000000000e+00 5.962690233064322e-01 -6.934540947368222e-01 -3.204813177418672e-01 -2.467314234473679e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.000000000000000e+00 5.962529106883656e-01 -6.934575485816902e-01 -3.204760712709986e-01 -2.467674665620057e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.000000000000000e+00 5.962367956000061e-01 -6.934610008664329e-01 -3.204708257531446e-01 -2.468035123150793e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.000000000000000e+00 5.962206779376155e-01 -6.934644516573011e-01 -3.204655812497633e-01 -2.468395606897328e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.000000000000000e+01 5.962045577877020e-01 -6.934679008981546e-01 -3.204603377092656e-01 -2.468756117001870e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.100000000000000e+01 5.961884351324633e-01 -6.934713485998710e-01 -3.204550951420113e-01 -2.469116653439147e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.200000000000000e+01 5.961723099125963e-01 -6.934747948022648e-01 -3.204498535817096e-01 -2.469477216070176e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.300000000000000e+01 5.961561821927567e-01 -6.934782394632878e-01 -3.204446129897190e-01 -2.469837805001064e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.400000000000000e+01 5.961400519781010e-01 -6.934816825744373e-01 -3.204393733657354e-01 -2.470198420334876e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.500000000000000e+01 5.961239191944268e-01 -6.934851241904247e-01 -3.204341347488972e-01 -2.470559061803488e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.600000000000000e+01 5.961077839033464e-01 -6.934885642668045e-01 -3.204288971051644e-01 -2.470919729594134e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.700000000000000e+01 5.960916461248322e-01 -6.934920027915257e-01 -3.204236604216075e-01 -2.471280423715702e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.800000000000000e+01 5.960755057630196e-01 -6.934954398242309e-01 -3.204184247559836e-01 -2.471641144042779e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.900000000000000e+01 5.960593629049137e-01 -6.934988753118163e-01 -3.204131900542727e-01 -2.472001890652165e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.000000000000000e+01 5.960432175518950e-01 -6.935023092461473e-01 -3.204079563197292e-01 -2.472362663681442e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.100000000000000e+01 5.960270696119827e-01 -6.935057416988473e-01 -3.204027235985216e-01 -2.472723462725539e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.200000000000000e+01 5.960109192105725e-01 -6.935091725776286e-01 -3.203974918230958e-01 -2.473084288210392e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.300000000000000e+01 5.959947662212670e-01 -6.935126019656676e-01 -3.203922610668132e-01 -2.473445139884083e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.400000000000000e+01 5.959786107367339e-01 -6.935160298047833e-01 -3.203870312732254e-01 -2.473806017861001e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.500000000000000e+01 5.959624527462324e-01 -6.935194560986740e-01 -3.203818024501873e-01 -2.474166922179334e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.600000000000000e+01 5.959462921807978e-01 -6.935228808995441e-01 -3.203765746331682e-01 -2.474527852562468e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.700000000000000e+01 5.959301291152834e-01 -6.935263041491916e-01 -3.203713477836417e-01 -2.474888809322502e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.800000000000000e+01 5.959139635303619e-01 -6.935297258595577e-01 -3.203661219128118e-01 -2.475249792429986e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.900000000000000e+01 5.958977953876535e-01 -6.935331460637981e-01 -3.203608970376077e-01 -2.475610801645606e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.000000000000000e+01 5.958816247276902e-01 -6.935365647332759e-01 -3.203556731350649e-01 -2.475971837078005e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.100000000000000e+01 5.958654515659898e-01 -6.935399818499989e-01 -3.203504502005374e-01 -2.476332898902641e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.200000000000000e+01 5.958492758239277e-01 -6.935433974706469e-01 -3.203452282763290e-01 -2.476693986861518e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.300000000000000e+01 5.958330975956216e-01 -6.935468115314921e-01 -3.203400073080473e-01 -2.477055101163230e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.400000000000000e+01 5.958169167968498e-01 -6.935502240885938e-01 -3.203347873440147e-01 -2.477416241623961e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.500000000000000e+01 5.958007334783809e-01 -6.935536351095709e-01 -3.203295683533821e-01 -2.477777408312934e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.600000000000000e+01 5.957845476672612e-01 -6.935570445729173e-01 -3.203243503221717e-01 -2.478138601347311e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.700000000000000e+01 5.957683592517051e-01 -6.935604525527732e-01 -3.203191333148164e-01 -2.478499820491594e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.800000000000000e+01 5.957521683498366e-01 -6.935638589720776e-01 -3.203139172614070e-01 -2.478861065951070e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.900000000000000e+01 5.957359749296874e-01 -6.935672638504508e-01 -3.203087021809259e-01 -2.479222337684642e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.000000000000000e+01 5.957197789254000e-01 -6.935706672345534e-01 -3.203034881092564e-01 -2.479583635490696e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.100000000000000e+01 5.957035804087587e-01 -6.935740690716977e-01 -3.202982750074372e-01 -2.479944959606435e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.200000000000000e+01 5.956873793836106e-01 -6.935774693610692e-01 -3.202930628715563e-01 -2.480306309997592e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.300000000000000e+01 5.956711757771349e-01 -6.935808681485248e-01 -3.202878517449968e-01 -2.480667686555360e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.400000000000000e+01 5.956549696574441e-01 -6.935842653929869e-01 -3.202826415850674e-01 -2.481029089328688e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.500000000000000e+01 5.956387610228994e-01 -6.935876610906739e-01 -3.202774323952580e-01 -2.481390518402432e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.600000000000000e+01 5.956225498025520e-01 -6.935910552906670e-01 -3.202722242150084e-01 -2.481751973583518e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.700000000000000e+01 5.956063360994895e-01 -6.935944479252367e-01 -3.202670169835045e-01 -2.482113455060338e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.800000000000000e+01 5.955901198008600e-01 -6.935978390681455e-01 -3.202618107664686e-01 -2.482474962616520e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.900000000000000e+01 5.955739009914686e-01 -6.936012286564881e-01 -3.202566055184079e-01 -2.482836496546671e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.000000000000000e+01 5.955576796706271e-01 -6.936046167005381e-01 -3.202514012328815e-01 -2.483198056648215e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.100000000000000e+01 5.955414557510735e-01 -6.936080032528257e-01 -3.202461979634867e-01 -2.483559642840323e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.200000000000000e+01 5.955252293318546e-01 -6.936113882427798e-01 -3.202409956553429e-01 -2.483921255411300e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.300000000000000e+01 5.955090003840441e-01 -6.936147716969625e-01 -3.202357943199382e-01 -2.484282894149646e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.400000000000000e+01 5.954927688549129e-01 -6.936181536494961e-01 -3.202305939879770e-01 -2.484644558955687e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.500000000000000e+01 5.954765347978335e-01 -6.936215340616457e-01 -3.202253946300737e-01 -2.485006249995111e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.600000000000000e+01 5.954602982379663e-01 -6.936249129143417e-01 -3.202201962325925e-01 -2.485367967357837e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.700000000000000e+01 5.954440590790617e-01 -6.936282902754441e-01 -3.202149988483514e-01 -2.485729710760312e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.800000000000000e+01 5.954278174209470e-01 -6.936316660726892e-01 -3.202098024227193e-01 -2.486091480516273e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.900000000000000e+01 5.954115731795561e-01 -6.936350403688445e-01 -3.202046069995444e-01 -2.486453276307944e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.000000000000000e+01 5.953953264150372e-01 -6.936384131227152e-01 -3.201994125442216e-01 -2.486815098274666e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.100000000000000e+01 5.953790771349843e-01 -6.936417843218095e-01 -3.201942190565329e-01 -2.487176946570709e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.200000000000000e+01 5.953628252519734e-01 -6.936451540289733e-01 -3.201890265836372e-01 -2.487538820913815e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.300000000000000e+01 5.953465708585710e-01 -6.936485221815413e-01 -3.201838350721254e-01 -2.487900721508204e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.400000000000000e+01 5.953303139383689e-01 -6.936518887871543e-01 -3.201786445330014e-01 -2.488262648376704e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.500000000000000e+01 5.953140544224789e-01 -6.936552539002737e-01 -3.201734550001881e-01 -2.488624601197602e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.600000000000000e+01 5.952977923898282e-01 -6.936586174575374e-01 -3.201682664343946e-01 -2.488986580339267e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.700000000000000e+01 5.952815278273781e-01 -6.936619794721731e-01 -3.201630788396856e-01 -2.489348585677432e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.800000000000000e+01 5.952652606747908e-01 -6.936653399870153e-01 -3.201578922488232e-01 -2.489710617024854e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.900000000000000e+01 5.952489909956817e-01 -6.936686989493723e-01 -3.201527066310618e-01 -2.490072674708778e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.000000000000000e+01 5.952327187980915e-01 -6.936720563634461e-01 -3.201475219750973e-01 -2.490434758550100e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.100000000000000e+01 5.952164439861021e-01 -6.936754122900775e-01 -3.201423383378647e-01 -2.490796868399643e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.200000000000000e+01 5.952001666972812e-01 -6.936787666352044e-01 -3.201371556408298e-01 -2.491159004583801e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.300000000000000e+01 5.951838867927925e-01 -6.936821194907280e-01 -3.201319739641367e-01 -2.491521166815588e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.400000000000000e+01 5.951676043662508e-01 -6.936854708000496e-01 -3.201267932494812e-01 -2.491883355168444e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.500000000000000e+01 5.951513194162378e-01 -6.936888205535481e-01 -3.201216135038383e-01 -2.492245569839335e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.600000000000000e+01 5.951350318647413e-01 -6.936921688097918e-01 -3.201164347676463e-01 -2.492607810526401e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.700000000000000e+01 5.951187417859234e-01 -6.936955155189363e-01 -3.201112569977896e-01 -2.492970077384643e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.800000000000000e+01 5.951024491774880e-01 -6.936988606776453e-01 -3.201060801981189e-01 -2.493332370497121e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.900000000000000e+01 5.950861539708645e-01 -6.937022043367708e-01 -3.201009044045274e-01 -2.493694689609643e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.000000000000000e+01 5.950698562321249e-01 -6.937055464509746e-01 -3.200957295791358e-01 -2.494057034877783e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.100000000000000e+01 5.950535559644743e-01 -6.937088870108112e-01 -3.200905557241730e-01 -2.494419406444030e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.200000000000000e+01 5.950372530965135e-01 -6.937122260736504e-01 -3.200853828742149e-01 -2.494781803957289e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.300000000000000e+01 5.950209477258321e-01 -6.937155635676187e-01 -3.200802109766590e-01 -2.495144227748198e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.400000000000000e+01 5.950046397403153e-01 -6.937188995659945e-01 -3.200750400967163e-01 -2.495506677601340e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.500000000000000e+01 5.949883292321714e-01 -6.937222340142908e-01 -3.200698701761726e-01 -2.495869153564323e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.600000000000000e+01 5.949720161944864e-01 -6.937255669078459e-01 -3.200647012243401e-01 -2.496231655796988e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.700000000000000e+01 5.949557005440560e-01 -6.937288983099982e-01 -3.200595332838110e-01 -2.496594183960961e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.800000000000000e+01 5.949393823622567e-01 -6.937322281590499e-01 -3.200543663117987e-01 -2.496956738364712e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.900000000000000e+01 5.949230616575850e-01 -6.937355564520826e-01 -3.200492003010865e-01 -2.497319318964233e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.000000000000000e+01 5.949067383373392e-01 -6.937388832545199e-01 -3.200440353024404e-01 -2.497681925484717e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.100000000000000e+01 5.948904124811241e-01 -6.937422085036233e-01 -3.200388712755112e-01 -2.498044558274537e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.200000000000000e+01 5.948740840915734e-01 -6.937455322028362e-01 -3.200337082149045e-01 -2.498407217229264e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.300000000000000e+01 5.948577531038263e-01 -6.937488543993023e-01 -3.200285461551465e-01 -2.498769902126767e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.400000000000000e+01 5.948414195683520e-01 -6.937521750517383e-01 -3.200233850714050e-01 -2.499132613214623e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.500000000000000e+01 5.948250835055611e-01 -6.937554941477793e-01 -3.200182249505472e-01 -2.499495350503257e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.600000000000000e+01 5.948087448243335e-01 -6.937588117517522e-01 -3.200130658424456e-01 -2.499858113721983e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.700000000000000e+01 5.947924036426032e-01 -6.937621277775725e-01 -3.200079076831945e-01 -2.500220903256627e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.800000000000000e+01 5.947760598388919e-01 -6.937654423118820e-01 -3.200027505388533e-01 -2.500583718732290e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.900000000000000e+01 5.947597135056757e-01 -6.937687552920460e-01 -3.199975943561440e-01 -2.500946560353754e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.000000000000000e+02 5.947433646311175e-01 -6.937720667213739e-01 -3.199924391442291e-01 -2.501309428178330e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.010000000000000e+02 5.947270131383015e-01 -6.937753766565631e-01 -3.199872849436153e-01 -2.501672321928921e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.020000000000000e+02 5.947106591185725e-01 -6.937786850312163e-01 -3.199821317045474e-01 -2.502035241896552e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.030000000000000e+02 5.946943025553553e-01 -6.937819918599081e-01 -3.199769794337756e-01 -2.502398187969594e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.040000000000000e+02 5.946779433740239e-01 -6.937852971931932e-01 -3.199718281734123e-01 -2.502761159966291e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.050000000000000e+02 5.946615816560762e-01 -6.937886009692653e-01 -3.199666778806349e-01 -2.503124158195784e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.060000000000000e+02 5.946452173987642e-01 -6.937919031907777e-01 -3.199615285559351e-01 -2.503487182628358e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.070000000000000e+02 5.946288505193315e-01 -6.937952039241976e-01 -3.199563802394547e-01 -2.503850232859488e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.080000000000000e+02 5.946124811308657e-01 -6.937985030799778e-01 -3.199512328743450e-01 -2.504213309396082e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.090000000000000e+02 5.945961091218266e-01 -6.938018007389807e-01 -3.199460865203791e-01 -2.504576411867422e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.100000000000000e+02 5.945797345667441e-01 -6.938050968476684e-01 -3.199409411364602e-01 -2.504939540497011e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.110000000000000e+02 5.945633574776932e-01 -6.938083913994917e-01 -3.199357967141053e-01 -2.505302695272837e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.120000000000000e+02 5.945469777688589e-01 -6.938116844528166e-01 -3.199306533016420e-01 -2.505665875982788e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.130000000000000e+02 5.945305955121162e-01 -6.938149759593698e-01 -3.199255108572929e-01 -2.506029082776333e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.140000000000000e+02 5.945142107096709e-01 -6.938182659115205e-01 -3.199203693831181e-01 -2.506392315770956e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.150000000000000e+02 5.944978232920357e-01 -6.938215543619360e-01 -3.199152289147439e-01 -2.506755574687046e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.160000000000000e+02 5.944814333270347e-01 -6.938248412617518e-01 -3.199100894148164e-01 -2.507118859730097e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.170000000000000e+02 5.944650408197891e-01 -6.938281266047164e-01 -3.199049508816102e-01 -2.507482170958562e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.180000000000000e+02 5.944486456896313e-01 -6.938314104535795e-01 -3.198998133555278e-01 -2.507845508017952e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.190000000000000e+02 5.944322480073333e-01 -6.938346927505855e-01 -3.198946768019052e-01 -2.508208871255612e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.200000000000000e+02 5.944158477881314e-01 -6.938379734869778e-01 -3.198895412105031e-01 -2.508572260668103e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.210000000000000e+02 5.943994449362703e-01 -6.938412527371786e-01 -3.198844066293955e-01 -2.508935675837790e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.220000000000000e+02 5.943830395717906e-01 -6.938445304033408e-01 -3.198792730000598e-01 -2.509299117357678e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.230000000000000e+02 5.943666315748002e-01 -6.938478065801496e-01 -3.198741403818355e-01 -2.509662584677926e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.240000000000000e+02 5.943502210341279e-01 -6.938510811961015e-01 -3.198690087307395e-01 -2.510026078217089e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.250000000000000e+02 5.943338079413171e-01 -6.938543542623921e-01 -3.198638780475554e-01 -2.510389597840766e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.260000000000000e+02 5.943173922222373e-01 -6.938576258303847e-01 -3.198587483733594e-01 -2.510753143345823e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.270000000000000e+02 5.943009739605279e-01 -6.938608958424468e-01 -3.198536196605747e-01 -2.511116714936078e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.280000000000000e+02 5.942845531413441e-01 -6.938641643028394e-01 -3.198484919207467e-01 -2.511480312682926e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.290000000000000e+02 5.942681297000669e-01 -6.938674312642671e-01 -3.198433651846097e-01 -2.511843936252737e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.300000000000000e+02 5.942517036998641e-01 -6.938706966708451e-01 -3.198382394239084e-01 -2.512207586039414e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.310000000000000e+02 5.942352751580358e-01 -6.938739605203547e-01 -3.198331146222158e-01 -2.512571261888975e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.320000000000000e+02 5.942188439766111e-01 -6.938772228773838e-01 -3.198279908360212e-01 -2.512934963600596e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.330000000000000e+02 5.942024102815575e-01 -6.938804836558810e-01 -3.198228679934454e-01 -2.513298691471342e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.340000000000000e+02 5.941859739408791e-01 -6.938837429407635e-01 -3.198177461720605e-01 -2.513662445275198e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.350000000000000e+02 5.941695350554377e-01 -6.938870006703509e-01 -3.198126253096829e-01 -2.514026225106608e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.360000000000000e+02 5.941530936198414e-01 -6.938902568377425e-01 -3.198075054154790e-01 -2.514390031151736e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.370000000000000e+02 5.941366495420465e-01 -6.938935115182172e-01 -3.198023865332625e-01 -2.514753862935681e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.380000000000000e+02 5.941202029200671e-01 -6.938967646315529e-01 -3.197972686154099e-01 -2.515117720946776e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.390000000000000e+02 5.941037537379749e-01 -6.939000161998720e-01 -3.197921516632574e-01 -2.515481604918821e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.400000000000000e+02 5.940873019197094e-01 -6.939032662690517e-01 -3.197870357232521e-01 -2.515845514777033e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.410000000000000e+02 5.940708475546300e-01 -6.939065147751727e-01 -3.197819207461049e-01 -2.516209450785617e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.420000000000000e+02 5.940543906245400e-01 -6.939097617339568e-01 -3.197768067394562e-01 -2.516573412828373e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.430000000000000e+02 5.940379310622844e-01 -6.939130071930527e-01 -3.197716937397529e-01 -2.516937400698415e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.440000000000000e+02 5.940214689445460e-01 -6.939162510939633e-01 -3.197665817069217e-01 -2.517301414692614e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.450000000000000e+02 5.940050042731916e-01 -6.939194934349817e-01 -3.197614706396076e-01 -2.517665454816015e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.460000000000000e+02 5.939885369487319e-01 -6.939227342920387e-01 -3.197563605886279e-01 -2.518029520662561e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.470000000000000e+02 5.939720671083063e-01 -6.939259735609928e-01 -3.197512514824172e-01 -2.518393612760766e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.480000000000000e+02 5.939555946240176e-01 -6.939292113330432e-01 -3.197461433904615e-01 -2.518757730716809e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.490000000000000e+02 5.939391195756869e-01 -6.939324475577686e-01 -3.197410362644709e-01 -2.519121874635385e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.500000000000000e+02 5.939226419797434e-01 -6.939356822164472e-01 -3.197359300993169e-01 -2.519486044694838e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.510000000000000e+02 5.939061617323881e-01 -6.939389153823169e-01 -3.197308249518014e-01 -2.519850240588850e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.520000000000000e+02 5.938896789326313e-01 -6.939421469881319e-01 -3.197257207651347e-01 -2.520214462541099e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.530000000000000e+02 5.938731935645897e-01 -6.939453770434374e-01 -3.197206175485475e-01 -2.520578710530826e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.540000000000000e+02 5.938567055621180e-01 -6.939486055940434e-01 -3.197155153386286e-01 -2.520942984376001e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.550000000000000e+02 5.938402149955635e-01 -6.939518325904304e-01 -3.197104140959646e-01 -2.521307284267295e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.560000000000000e+02 5.938237218617209e-01 -6.939550580344330e-01 -3.197053138220191e-01 -2.521671610195997e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.570000000000000e+02 5.938072260949041e-01 -6.939582819726853e-01 -3.197002145524018e-01 -2.522035961958963e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.580000000000000e+02 5.937907277825910e-01 -6.939615043391238e-01 -3.196951162410162e-01 -2.522400339883508e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.590000000000000e+02 5.937742268274110e-01 -6.939647252093629e-01 -3.196900189367545e-01 -2.522764743546677e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.600000000000000e+02 5.937577233108013e-01 -6.939679445181373e-01 -3.196849225990890e-01 -2.523129173325457e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.610000000000000e+02 5.937412172305927e-01 -6.939711622711280e-01 -3.196798272260287e-01 -2.523493629124718e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.620000000000000e+02 5.937247085032633e-01 -6.939743785262853e-01 -3.196747328638038e-01 -2.523858110715158e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.630000000000000e+02 5.937081972125754e-01 -6.939775932224297e-01 -3.196696394670008e-01 -2.524222618368582e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.640000000000000e+02 5.936916833469824e-01 -6.939808063672200e-01 -3.196645470417170e-01 -2.524587152053645e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.650000000000000e+02 5.936751668481477e-01 -6.939840180033076e-01 -3.196594556187473e-01 -2.524951711564703e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.660000000000000e+02 5.936586477722523e-01 -6.939872280899129e-01 -3.196543651672847e-01 -2.525316297076474e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.670000000000000e+02 5.936421261292641e-01 -6.939904366185281e-01 -3.196492756821953e-01 -2.525680908638291e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.680000000000000e+02 5.936256018448161e-01 -6.939936436430019e-01 -3.196441872031732e-01 -2.526045546000960e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.690000000000000e+02 5.936090749817083e-01 -6.939968491167861e-01 -3.196390996964594e-01 -2.526410209379515e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.700000000000000e+02 5.935925455622586e-01 -6.940000530273210e-01 -3.196340131471838e-01 -2.526774898767586e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.710000000000000e+02 5.935760134860903e-01 -6.940032554420494e-01 -3.196289276123579e-01 -2.527139613934543e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.720000000000000e+02 5.935594788686240e-01 -6.940064562788033e-01 -3.196238430282375e-01 -2.527504355216931e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.730000000000000e+02 5.935429415967239e-01 -6.940096556185131e-01 -3.196187594560366e-01 -2.527869122260191e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.740000000000000e+02 5.935264017613865e-01 -6.940128533937887e-01 -3.196136768470668e-01 -2.528233915378313e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.750000000000000e+02 5.935098593465404e-01 -6.940160496188829e-01 -3.196085952077760e-01 -2.528598734460695e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.760000000000000e+02 5.934933142836686e-01 -6.940192443401340e-01 -3.196035145767547e-01 -2.528963579340801e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.770000000000000e+02 5.934767666486487e-01 -6.940224375041409e-01 -3.195984349115559e-01 -2.529328450224692e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.780000000000000e+02 5.934602164398782e-01 -6.940256291127626e-01 -3.195933562120336e-01 -2.529693347085675e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.790000000000000e+02 5.934436635806586e-01 -6.940288192146215e-01 -3.195882785234725e-01 -2.530058269801861e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.800000000000000e+02 5.934271081453075e-01 -6.940320077654138e-01 -3.195832017992626e-01 -2.530423218418965e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.810000000000000e+02 5.934105501357425e-01 -6.940351947576734e-01 -3.195781260416192e-01 -2.530788193053715e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.820000000000000e+02 5.933939894752047e-01 -6.940383802457890e-01 -3.195730512922587e-01 -2.531153193472447e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.830000000000000e+02 5.933774262625864e-01 -6.940415641556880e-01 -3.195679774987988e-01 -2.531518220034026e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.840000000000000e+02 5.933608603882822e-01 -6.940447465715733e-01 -3.195629047168693e-01 -2.531883272281630e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.850000000000000e+02 5.933442919481969e-01 -6.940479274249024e-01 -3.195578328936423e-01 -2.532248350498215e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.860000000000000e+02 5.933277209263624e-01 -6.940511067195551e-01 -3.195527620419779e-01 -2.532613454774188e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.870000000000000e+02 5.933111472513779e-01 -6.940542845141970e-01 -3.195476921955767e-01 -2.532978584734204e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.880000000000000e+02 5.932945709981585e-01 -6.940574607469282e-01 -3.195426233182980e-01 -2.533343740760373e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.890000000000000e+02 5.932779921590845e-01 -6.940606354306832e-01 -3.195375554090208e-01 -2.533708922675783e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.900000000000000e+02 5.932614106739320e-01 -6.940638086002890e-01 -3.195324885053045e-01 -2.534074130447745e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.910000000000000e+02 5.932448265970226e-01 -6.940669802254099e-01 -3.195274225716565e-01 -2.534439364067788e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.920000000000000e+02 5.932282399514861e-01 -6.940701502826078e-01 -3.195223575992404e-01 -2.534804623732640e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.930000000000000e+02 5.932116506373217e-01 -6.940733188425197e-01 -3.195172936426466e-01 -2.535169909145204e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.940000000000000e+02 5.931950587499305e-01 -6.940764858403796e-01 -3.195122306471919e-01 -2.535535220520347e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.950000000000000e+02 5.931784642787462e-01 -6.940796512797266e-01 -3.195071686205774e-01 -2.535900557896216e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.960000000000000e+02 5.931618671440145e-01 -6.940828152227858e-01 -3.195021076025617e-01 -2.536265920919174e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.970000000000000e+02 5.931452674633902e-01 -6.940859775789152e-01 -3.194970475325439e-01 -2.536631310066410e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.980000000000000e+02 5.931286651093792e-01 -6.940891384448442e-01 -3.194919884760423e-01 -2.536996724832029e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.990000000000000e+02 5.931120601796604e-01 -6.940922977404562e-01 -3.194869303857446e-01 -2.537362165704913e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.000000000000000e+02 5.930954526610904e-01 -6.940954554882843e-01 -3.194818732600005e-01 -2.537727632381546e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.010000000000000e+02 5.930788424875465e-01 -6.940986117226934e-01 -3.194768171424980e-01 -2.538093124902251e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.020000000000000e+02 5.930622297155446e-01 -6.941017664060808e-01 -3.194717620001363e-01 -2.538458643376201e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.030000000000000e+02 5.930456143741677e-01 -6.941049195257439e-01 -3.194667078114413e-01 -2.538824187726392e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.040000000000000e+02 5.930289963624082e-01 -6.941080711438643e-01 -3.194616546372847e-01 -2.539189757831176e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.050000000000000e+02 5.930123757609849e-01 -6.941112212093655e-01 -3.194566024289943e-01 -2.539555353798759e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.060000000000000e+02 5.929957525802598e-01 -6.941143697065727e-01 -3.194515511855367e-01 -2.539920975813481e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.070000000000000e+02 5.929791267236668e-01 -6.941175167083270e-01 -3.194465009566919e-01 -2.540286623498010e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.080000000000000e+02 5.929624983146484e-01 -6.941206621245073e-01 -3.194414516758046e-01 -2.540652297256371e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.090000000000000e+02 5.929458672356342e-01 -6.941238060414892e-01 -3.194364034050151e-01 -2.541017996676279e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.100000000000000e+02 5.929292335686065e-01 -6.941269484004278e-01 -3.194313560992716e-01 -2.541383722003336e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.110000000000000e+02 5.929125973154699e-01 -6.941300891949961e-01 -3.194263097600749e-01 -2.541749473331922e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.120000000000000e+02 5.928959583861007e-01 -6.941332284958360e-01 -3.194212644321857e-01 -2.542115250257519e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.130000000000000e+02 5.928793168774059e-01 -6.941363662279315e-01 -3.194162200658762e-01 -2.542481053178003e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.140000000000000e+02 5.928626727716888e-01 -6.941395024055386e-01 -3.194111766692030e-01 -2.542846882000487e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.150000000000000e+02 5.928460260035214e-01 -6.941426370728627e-01 -3.194061342789786e-01 -2.543212736566162e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.160000000000000e+02 5.928293766307424e-01 -6.941457701925174e-01 -3.194010928606710e-01 -2.543578616965699e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.170000000000000e+02 5.928127246860271e-01 -6.941489017389632e-01 -3.193960523972915e-01 -2.543944523332745e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.180000000000000e+02 5.927960700540404e-01 -6.941520317924366e-01 -3.193910129525877e-01 -2.544310455350080e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.190000000000000e+02 5.927794128336964e-01 -6.941551602811005e-01 -3.193859744728600e-01 -2.544676413331950e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.200000000000000e+02 5.927627530227526e-01 -6.941582872072627e-01 -3.193809369583165e-01 -2.545042397249887e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.210000000000000e+02 5.927460905364819e-01 -6.941614126343634e-01 -3.193759004528645e-01 -2.545408406780806e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.220000000000000e+02 5.927294254898468e-01 -6.941645364770361e-01 -3.193708648953066e-01 -2.545774442328339e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.230000000000000e+02 5.927127577543321e-01 -6.941676588235882e-01 -3.193658303573979e-01 -2.546140503561473e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.240000000000000e+02 5.926960874425168e-01 -6.941707796018117e-01 -3.193607967721373e-01 -2.546506590653385e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.250000000000000e+02 5.926794145184335e-01 -6.941738988295498e-01 -3.193557641634421e-01 -2.546872703639757e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.260000000000000e+02 5.926627389327228e-01 -6.941770165432284e-01 -3.193507325570514e-01 -2.547238842338513e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.270000000000000e+02 5.926460607390308e-01 -6.941801327037913e-01 -3.193457019236446e-01 -2.547605006918274e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.280000000000000e+02 5.926293799593386e-01 -6.941832472977633e-01 -3.193406722492930e-01 -2.547971197394349e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.290000000000000e+02 5.926126964966059e-01 -6.941863603903082e-01 -3.193356435890153e-01 -2.548337413543742e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.300000000000000e+02 5.925960104415207e-01 -6.941894719233686e-01 -3.193306158886707e-01 -2.548703655502345e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.310000000000000e+02 5.925793217838339e-01 -6.941925818945079e-01 -3.193255891593611e-01 -2.549069923420611e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.320000000000000e+02 5.925626304523192e-01 -6.941956903588906e-01 -3.193205634367769e-01 -2.549436216989765e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.330000000000000e+02 5.925459365475558e-01 -6.941987972446352e-01 -3.193155386655632e-01 -2.549802536507546e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.340000000000000e+02 5.925292399525902e-01 -6.942019026296814e-01 -3.193105149124728e-01 -2.550168881718772e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.350000000000000e+02 5.925125407726293e-01 -6.942050064504156e-01 -3.193054921124666e-01 -2.550535252709858e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.360000000000000e+02 5.924958389840526e-01 -6.942081087125979e-01 -3.193004702847660e-01 -2.550901649617034e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.370000000000000e+02 5.924791345202760e-01 -6.942112094647038e-01 -3.192954494646355e-01 -2.551268072211040e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.380000000000000e+02 5.924624274480718e-01 -6.942143086619417e-01 -3.192904296133479e-01 -2.551634520629559e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.390000000000000e+02 5.924457177840148e-01 -6.942174062911652e-01 -3.192854107221271e-01 -2.552000994940116e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.400000000000000e+02 5.924290054300999e-01 -6.942205024205226e-01 -3.192803928450646e-01 -2.552367494872186e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.410000000000000e+02 5.924122904781791e-01 -6.942235969888351e-01 -3.192753759288355e-01 -2.552734020609709e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.420000000000000e+02 5.923955729205286e-01 -6.942266899930429e-01 -3.192703599824216e-01 -2.553100572287685e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.430000000000000e+02 5.923788526754873e-01 -6.942297814944711e-01 -3.192653450479891e-01 -2.553467149590940e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.440000000000000e+02 5.923621298306025e-01 -6.942328714326469e-01 -3.192603310760380e-01 -2.553833752736328e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.450000000000000e+02 5.923454043785779e-01 -6.942359598099628e-01 -3.192553180717255e-01 -2.554200381748470e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.460000000000000e+02 5.923286762442525e-01 -6.942390466809010e-01 -3.192503060750496e-01 -2.554567036374512e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.470000000000000e+02 5.923119455370348e-01 -6.942421319685377e-01 -3.192452950250858e-01 -2.554933716914359e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.480000000000000e+02 5.922952121337584e-01 -6.942452157551723e-01 -3.192402849919846e-01 -2.555300423095437e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.490000000000000e+02 5.922784761310101e-01 -6.942482979763074e-01 -3.192352759198196e-01 -2.555667155114797e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.500000000000000e+02 5.922617375155167e-01 -6.942513786396654e-01 -3.192302678163376e-01 -2.556033912958406e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.510000000000000e+02 5.922449962137571e-01 -6.942544577962853e-01 -3.192252607220536e-01 -2.556400696422407e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.520000000000000e+02 5.922282523102583e-01 -6.942575353889496e-01 -3.192202545884405e-01 -2.556767505693264e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.530000000000000e+02 5.922115057887622e-01 -6.942606114228638e-01 -3.192152494277627e-01 -2.557134340837991e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.540000000000000e+02 5.921947565917942e-01 -6.942636859401482e-01 -3.192102452702181e-01 -2.557501201651959e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.550000000000000e+02 5.921780047664987e-01 -6.942667589108790e-01 -3.192052420872511e-01 -2.557868088197118e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.560000000000000e+02 5.921612503503613e-01 -6.942698303084313e-01 -3.192002398578056e-01 -2.558235000575949e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.570000000000000e+02 5.921444932333499e-01 -6.942729002047769e-01 -3.191952386454548e-01 -2.558601938573843e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.580000000000000e+02 5.921277335345235e-01 -6.942759685185314e-01 -3.191902383825299e-01 -2.558968902472779e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.590000000000000e+02 5.921109711437211e-01 -6.942790353263651e-01 -3.191852391298027e-01 -2.559335891968498e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.600000000000000e+02 5.920942061470961e-01 -6.942821005664612e-01 -3.191802408400133e-01 -2.559702907319006e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.610000000000000e+02 5.920774385265447e-01 -6.942851642533763e-01 -3.191752435214250e-01 -2.560069948430063e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.620000000000000e+02 5.920606657423099e-01 -6.942882281620454e-01 -3.191702485792464e-01 -2.560437008368737e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.630000000000000e+02 5.920438953072188e-01 -6.942912870375865e-01 -3.191652518577061e-01 -2.560804107692616e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.640000000000000e+02 5.920271197714951e-01 -6.942943460871939e-01 -3.191602574788457e-01 -2.561171226069447e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.650000000000000e+02 5.920103415430473e-01 -6.942974036336299e-01 -3.191552641061104e-01 -2.561538369945763e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.660000000000000e+02 5.919935607057178e-01 -6.943004596109251e-01 -3.191502716971138e-01 -2.561905539684907e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.670000000000000e+02 5.919767772491649e-01 -6.943035140282088e-01 -3.191452802558263e-01 -2.562272735213872e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.680000000000000e+02 5.919599910950082e-01 -6.943065669387796e-01 -3.191402898261354e-01 -2.562639956337490e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.690000000000000e+02 5.919432023321575e-01 -6.943096182834930e-01 -3.191353003564102e-01 -2.563007203232263e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.700000000000000e+02 5.919264109451774e-01 -6.943126680681256e-01 -3.191303118577349e-01 -2.563374475945071e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.710000000000000e+02 5.919096168597729e-01 -6.943157163465792e-01 -3.191253243695841e-01 -2.563741774224957e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.720000000000000e+02 5.918928334504350e-01 -6.943187537665586e-01 -3.191203304949952e-01 -2.564109134628123e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.160000000000001e-12 2.050000000000000e-11 -9.770000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.730000000000000e+02 5.918760565867468e-01 -6.943217832106326e-01 -3.191153325222185e-01 -2.564476545959495e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.160000000000001e-12 2.050000000000000e-11 -9.770000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.740000000000000e+02 5.918592546035150e-01 -6.943248268340828e-01 -3.191103479536296e-01 -2.564843921389879e-01 2.430000000000000e-11 2.160000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.250000000000000e-11 -1.620000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.770000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.750000000000000e+02 5.918424499892497e-01 -6.943278688991349e-01 -3.191053643592831e-01 -2.565211322636740e-01 2.430000000000000e-11 2.170000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.260000000000000e-11 -1.630000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.750000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.760000000000000e+02 5.918256426936491e-01 -6.943309094486778e-01 -3.191003817618008e-01 -2.565578749403226e-01 2.430000000000000e-11 2.170000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.260000000000000e-11 -1.630000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.750000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.770000000000000e+02 5.918088327714436e-01 -6.943339484359375e-01 -3.190954001356258e-01 -2.565946201995423e-01 2.430000000000000e-11 2.170000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.260000000000000e-11 -1.630000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.740000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.780000000000000e+02 5.917920202175332e-01 -6.943369858686865e-01 -3.190904194803941e-01 -2.566313680310039e-01 2.430000000000000e-11 2.170000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.260000000000000e-11 -1.630000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.740000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.790000000000000e+02 5.917752049814906e-01 -6.943400217806751e-01 -3.190854398245241e-01 -2.566681184228312e-01 2.430000000000000e-11 2.170000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.260000000000000e-11 -1.630000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.740000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.800000000000000e+02 5.917583871070718e-01 -6.943430561385726e-01 -3.190804611449463e-01 -2.567048713914728e-01 2.440000000000000e-11 2.170000000000000e-11 -1.220000000000000e-11 1.260000000000000e-11 2.260000000000000e-11 -1.630000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.740000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.810000000000000e+02 5.917415666272183e-01 -6.943460889258443e-01 -3.190754834188410e-01 -2.567416269325679e-01 2.440000000000000e-11 2.170000000000000e-11 -1.230000000000000e-11 1.260000000000000e-11 2.260000000000000e-11 -1.630000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.730000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.820000000000000e+02 5.917247524136722e-01 -6.943491139276953e-01 -3.190705017480212e-01 -2.567783874921506e-01 2.440000000000000e-11 2.170000000000000e-11 -1.230000000000000e-11 1.260000000000000e-11 2.260000000000000e-11 -1.630000000000000e-11 9.140000000000000e-12 2.050000000000000e-11 -9.720000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.830000000000000e+02 5.917079418806728e-01 -6.943521329557739e-01 -3.190655175598193e-01 -2.568151523555228e-01 2.440000000000000e-11 2.170000000000000e-11 -1.230000000000000e-11 1.260000000000000e-11 2.260000000000000e-11 -1.630000000000000e-11 9.140000000000000e-12 2.050000000000000e-11 -9.720000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.840000000000000e+02 5.916911133939351e-01 -6.943551611498376e-01 -3.190605428066734e-01 -2.568519155839403e-01 2.440000000000000e-11 2.170000000000000e-11 -1.230000000000000e-11 1.260000000000000e-11 2.260000000000000e-11 -1.630000000000000e-11 9.140000000000000e-12 2.050000000000000e-11 -9.710000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.850000000000000e+02 5.916742822810304e-01 -6.943581877781175e-01 -3.190555690224480e-01 -2.568886813942531e-01 2.440000000000000e-11 2.180000000000000e-11 -1.230000000000000e-11 1.270000000000000e-11 2.270000000000000e-11 -1.630000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.699999999999999e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.860000000000000e+02 5.916574485454388e-01 -6.943612128423852e-01 -3.190505962020400e-01 -2.569254497784838e-01 2.440000000000000e-11 2.180000000000000e-11 -1.230000000000000e-11 1.270000000000000e-11 2.270000000000000e-11 -1.630000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.699999999999999e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.870000000000000e+02 5.916406121060998e-01 -6.943642363978294e-01 -3.190456243907824e-01 -2.569622207163433e-01 2.450000000000000e-11 2.180000000000000e-11 -1.230000000000000e-11 1.270000000000000e-11 2.270000000000000e-11 -1.630000000000000e-11 9.150000000000000e-12 2.050000000000000e-11 -9.689999999999999e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.880000000000000e+02 5.916237730413361e-01 -6.943672583892355e-01 -3.190406535450835e-01 -2.569989942293092e-01 2.450000000000000e-11 2.180000000000000e-11 -1.230000000000000e-11 1.270000000000000e-11 2.270000000000000e-11 -1.630000000000000e-11 9.140000000000000e-12 2.050000000000000e-11 -9.689999999999999e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.890000000000000e+02 5.916069313541610e-01 -6.943702788163933e-01 -3.190356836615309e-01 -2.570357703137387e-01 2.450000000000000e-11 2.180000000000000e-11 -1.230000000000000e-11 1.270000000000000e-11 2.270000000000000e-11 -1.630000000000000e-11 9.140000000000000e-12 2.050000000000000e-11 -9.689999999999999e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.900000000000000e+02 5.915900869535334e-01 -6.943732977357040e-01 -3.190307147945447e-01 -2.570725489577526e-01 2.450000000000000e-11 2.180000000000000e-11 -1.230000000000000e-11 1.270000000000000e-11 2.270000000000000e-11 -1.640000000000000e-11 9.189999999999999e-12 2.060000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.910000000000000e+02 5.915732399313975e-01 -6.943763150893472e-01 -3.190257468887185e-01 -2.571093301731860e-01 2.450000000000000e-11 2.180000000000000e-11 -1.230000000000000e-11 1.270000000000000e-11 2.270000000000000e-11 -1.640000000000000e-11 9.189999999999999e-12 2.060000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.920000000000000e+02 5.915563871305913e-01 -6.943793330863186e-01 -3.190207816875355e-01 -2.571461130934614e-01 2.450000000000000e-11 2.190000000000000e-11 -1.230000000000000e-11 1.270000000000000e-11 2.270000000000000e-11 -1.640000000000000e-11 9.189999999999999e-12 2.060000000000000e-11 -9.770000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.930000000000000e+02 5.915395294187301e-01 -6.943823511137004e-01 -3.190158187147280e-01 -2.571828979668923e-01 2.450000000000000e-11 2.190000000000000e-11 -1.230000000000000e-11 1.270000000000000e-11 2.270000000000000e-11 -1.640000000000000e-11 9.189999999999999e-12 2.060000000000000e-11 -9.770000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.940000000000000e+02 5.915226744342094e-01 -6.943853638304457e-01 -3.190108537481933e-01 -2.572196868809012e-01 2.450000000000000e-11 2.190000000000000e-11 -1.230000000000000e-11 1.270000000000000e-11 2.270000000000000e-11 -1.640000000000000e-11 9.189999999999999e-12 2.060000000000000e-11 -9.770000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.950000000000000e+02 5.915058168179784e-01 -6.943883749847428e-01 -3.190058897487663e-01 -2.572564783676836e-01 2.460000000000000e-11 2.190000000000000e-11 -1.230000000000000e-11 1.270000000000000e-11 2.280000000000000e-11 -1.640000000000000e-11 9.179999999999999e-12 2.060000000000000e-11 -9.770000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.960000000000000e+02 5.914889564967606e-01 -6.943913846274958e-01 -3.190009267567477e-01 -2.572932724068370e-01 2.460000000000000e-11 2.190000000000000e-11 -1.230000000000000e-11 1.270000000000000e-11 2.280000000000000e-11 -1.640000000000000e-11 9.179999999999999e-12 2.060000000000000e-11 -9.760000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.970000000000000e+02 5.914720935771467e-01 -6.943943926836857e-01 -3.189959647129031e-01 -2.573300690277110e-01 2.460000000000000e-11 2.190000000000000e-11 -1.240000000000000e-11 1.270000000000000e-11 2.280000000000000e-11 -1.640000000000000e-11 9.179999999999999e-12 2.060000000000000e-11 -9.750000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.980000000000000e+02 5.914552279404289e-01 -6.943973992360142e-01 -3.189910036826188e-01 -2.573668681974245e-01 2.460000000000000e-11 2.190000000000000e-11 -1.240000000000000e-11 1.270000000000000e-11 2.280000000000000e-11 -1.640000000000000e-11 9.179999999999999e-12 2.060000000000000e-11 -9.750000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.990000000000000e+02 5.914383596811951e-01 -6.944004042190270e-01 -3.189860436126273e-01 -2.574036699397122e-01 2.460000000000000e-11 2.190000000000000e-11 -1.240000000000000e-11 1.270000000000000e-11 2.280000000000000e-11 -1.640000000000000e-11 9.179999999999999e-12 2.060000000000000e-11 -9.750000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.000000000000000e+02 5.914214887813167e-01 -6.944034076438452e-01 -3.189810845133386e-01 -2.574404742518179e-01 2.460000000000000e-11 2.190000000000000e-11 -1.240000000000000e-11 1.270000000000000e-11 2.280000000000000e-11 -1.640000000000000e-11 9.179999999999999e-12 2.060000000000000e-11 -9.740000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.010000000000000e+02 5.914046151815887e-01 -6.944064095503727e-01 -3.189761264179895e-01 -2.574772811194260e-01 2.460000000000000e-11 2.190000000000000e-11 -1.240000000000000e-11 1.270000000000000e-11 2.280000000000000e-11 -1.640000000000000e-11 9.179999999999999e-12 2.060000000000000e-11 -9.740000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.020000000000000e+02 5.913879963867059e-01 -6.944095768564661e-01 -3.189708818905229e-01 -2.575134050990811e-01 2.460000000000000e-11 2.200000000000000e-11 -1.240000000000000e-11 1.270000000000000e-11 2.280000000000000e-11 -1.640000000000000e-11 9.179999999999999e-12 2.060000000000000e-11 -9.730000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.030000000000000e+02 5.913710908180344e-01 -6.944125581297270e-01 -3.189659523749431e-01 -2.575502927235037e-01 2.460000000000000e-11 2.200000000000000e-11 -1.240000000000000e-11 1.270000000000000e-11 2.280000000000000e-11 -1.640000000000000e-11 9.179999999999999e-12 2.060000000000000e-11 -9.730000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.040000000000000e+02 5.913541835045778e-01 -6.944155385251428e-01 -3.189610227761947e-01 -2.575871803021919e-01 2.460000000000000e-11 2.200000000000000e-11 -1.240000000000000e-11 1.270000000000000e-11 2.280000000000000e-11 -1.640000000000000e-11 9.179999999999999e-12 2.060000000000000e-11 -9.730000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.050000000000000e+02 5.913372745065445e-01 -6.944185178638008e-01 -3.189560931737013e-01 -2.576240680805720e-01 2.470000000000000e-11 2.200000000000000e-11 -1.240000000000000e-11 1.270000000000000e-11 2.290000000000000e-11 -1.640000000000000e-11 9.179999999999999e-12 2.060000000000000e-11 -9.710000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.060000000000000e+02 5.913203638243970e-01 -6.944214960670192e-01 -3.189511636599131e-01 -2.576609561548143e-01 2.470000000000000e-11 2.200000000000000e-11 -1.240000000000000e-11 1.270000000000000e-11 2.290000000000000e-11 -1.640000000000000e-11 9.179999999999999e-12 2.060000000000000e-11 -9.710000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.070000000000000e+02 5.913034514196017e-01 -6.944244731305931e-01 -3.189462343482442e-01 -2.576978444838838e-01 2.470000000000000e-11 2.200000000000000e-11 -1.240000000000000e-11 1.270000000000000e-11 2.290000000000000e-11 -1.640000000000000e-11 9.179999999999999e-12 2.060000000000000e-11 -9.710000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.080000000000000e+02 5.912865372481506e-01 -6.944274490804222e-01 -3.189413053753891e-01 -2.577347329294052e-01 2.470000000000000e-11 2.200000000000000e-11 -1.240000000000000e-11 1.270000000000000e-11 2.290000000000000e-11 -1.640000000000000e-11 9.179999999999999e-12 2.060000000000000e-11 -9.699999999999999e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.090000000000000e+02 5.912696212920824e-01 -6.944304239284989e-01 -3.189363768939262e-01 -2.577716213111489e-01 2.470000000000000e-11 2.200000000000000e-11 -1.240000000000000e-11 1.270000000000000e-11 2.290000000000000e-11 -1.640000000000000e-11 9.170000000000001e-12 2.060000000000000e-11 -9.699999999999999e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.100000000000000e+02 5.912527035783678e-01 -6.944333976450446e-01 -3.189314490517635e-01 -2.578085094642389e-01 2.480000000000000e-11 2.210000000000000e-11 -1.250000000000000e-11 1.280000000000000e-11 2.290000000000000e-11 -1.650000000000000e-11 9.230000000000000e-12 2.070000000000000e-11 -9.789999999999999e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.110000000000000e+02 5.912357841757553e-01 -6.944363701560252e-01 -3.189265219645919e-01 -2.578453972871583e-01 2.480000000000000e-11 2.210000000000000e-11 -1.250000000000000e-11 1.280000000000000e-11 2.290000000000000e-11 -1.650000000000000e-11 9.230000000000000e-12 2.070000000000000e-11 -9.789999999999999e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.120000000000000e+02 5.912188601282394e-01 -6.944393434967950e-01 -3.189215973665177e-01 -2.578822839312433e-01 2.480000000000000e-11 2.210000000000000e-11 -1.250000000000000e-11 1.280000000000000e-11 2.290000000000000e-11 -1.650000000000000e-11 9.230000000000000e-12 2.070000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.130000000000000e+02 5.912019375993054e-01 -6.944423133256588e-01 -3.189166718663808e-01 -2.579191711513629e-01 2.480000000000000e-11 2.210000000000000e-11 -1.250000000000000e-11 1.280000000000000e-11 2.290000000000000e-11 -1.650000000000000e-11 9.230000000000000e-12 2.070000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.140000000000000e+02 5.911850135812312e-01 -6.944452817442737e-01 -3.189117470162506e-01 -2.579560582640364e-01 2.480000000000000e-11 2.210000000000000e-11 -1.250000000000000e-11 1.280000000000000e-11 2.290000000000000e-11 -1.650000000000000e-11 9.220000000000000e-12 2.070000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.150000000000000e+02 5.911680880594964e-01 -6.944482487969971e-01 -3.189068225981056e-01 -2.579929454524756e-01 2.480000000000000e-11 2.210000000000000e-11 -1.250000000000000e-11 1.280000000000000e-11 2.300000000000000e-11 -1.650000000000000e-11 9.220000000000000e-12 2.060000000000000e-11 -9.770000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.160000000000000e+02 5.911511609809345e-01 -6.944512145971979e-01 -3.189018983321382e-01 -2.580298328789301e-01 2.480000000000000e-11 2.210000000000000e-11 -1.250000000000000e-11 1.280000000000000e-11 2.300000000000000e-11 -1.650000000000000e-11 9.220000000000000e-12 2.060000000000000e-11 -9.770000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.170000000000000e+02 5.911342322890790e-01 -6.944541792966968e-01 -3.188969739192114e-01 -2.580667206334871e-01 2.480000000000000e-11 2.210000000000000e-11 -1.250000000000000e-11 1.280000000000000e-11 2.300000000000000e-11 -1.650000000000000e-11 9.220000000000000e-12 2.060000000000000e-11 -9.760000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.180000000000000e+02 5.911173019749008e-01 -6.944571430354725e-01 -3.188920490889463e-01 -2.581036086938276e-01 2.480000000000000e-11 2.210000000000000e-11 -1.250000000000000e-11 1.280000000000000e-11 2.300000000000000e-11 -1.650000000000000e-11 9.210000000000000e-12 2.060000000000000e-11 -9.760000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.190000000000000e+02 5.911003701243096e-01 -6.944601058893241e-01 -3.188871236411941e-01 -2.581404969061211e-01 2.480000000000000e-11 2.210000000000000e-11 -1.250000000000000e-11 1.280000000000000e-11 2.300000000000000e-11 -1.650000000000000e-11 9.210000000000000e-12 2.060000000000000e-11 -9.760000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.200000000000000e+02 5.910834369414890e-01 -6.944630678342011e-01 -3.188821974711751e-01 -2.581773849966356e-01 2.490000000000000e-11 2.220000000000000e-11 -1.250000000000000e-11 1.280000000000000e-11 2.300000000000000e-11 -1.650000000000000e-11 9.220000000000000e-12 2.060000000000000e-11 -9.740000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.210000000000000e+02 5.910665027298865e-01 -6.944660287461724e-01 -3.188772705713225e-01 -2.582142726132025e-01 2.490000000000000e-11 2.220000000000000e-11 -1.250000000000000e-11 1.280000000000000e-11 2.300000000000000e-11 -1.650000000000000e-11 9.220000000000000e-12 2.060000000000000e-11 -9.740000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.220000000000000e+02 5.910496138582622e-01 -6.944689562128986e-01 -3.188723176208844e-01 -2.582511720586225e-01 2.490000000000000e-11 2.220000000000000e-11 -1.250000000000000e-11 1.280000000000000e-11 2.300000000000000e-11 -1.650000000000000e-11 9.210000000000000e-12 2.060000000000000e-11 -9.720000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.230000000000000e+02 5.910326785354487e-01 -6.944719145164832e-01 -3.188673895234846e-01 -2.582880576981866e-01 2.490000000000000e-11 2.220000000000000e-11 -1.250000000000000e-11 1.280000000000000e-11 2.300000000000000e-11 -1.650000000000000e-11 9.210000000000000e-12 2.060000000000000e-11 -9.720000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.240000000000000e+02 5.910157428961152e-01 -6.944748713361503e-01 -3.188624610207928e-01 -2.583249420465512e-01 2.490000000000000e-11 2.220000000000000e-11 -1.250000000000000e-11 1.280000000000000e-11 2.300000000000000e-11 -1.650000000000000e-11 9.210000000000000e-12 2.060000000000000e-11 -9.720000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.250000000000000e+02 5.909988068088693e-01 -6.944778267158010e-01 -3.188575322359375e-01 -2.583618251348266e-01 2.490000000000000e-11 2.220000000000000e-11 -1.250000000000000e-11 1.280000000000000e-11 2.310000000000000e-11 -1.650000000000000e-11 9.210000000000000e-12 2.060000000000000e-11 -9.710000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.260000000000000e+02 5.909818698957027e-01 -6.944807808460968e-01 -3.188526032716093e-01 -2.583987071888953e-01 2.490000000000000e-11 2.220000000000000e-11 -1.250000000000000e-11 1.280000000000000e-11 2.310000000000000e-11 -1.650000000000000e-11 9.210000000000000e-12 2.060000000000000e-11 -9.710000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.270000000000000e+02 5.909649315861545e-01 -6.944837340272759e-01 -3.188476742196532e-01 -2.584355885934089e-01 2.500000000000000e-11 2.220000000000000e-11 -1.250000000000000e-11 1.280000000000000e-11 2.310000000000000e-11 -1.650000000000000e-11 9.210000000000000e-12 2.060000000000000e-11 -9.710000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.280000000000000e+02 5.909479912226194e-01 -6.944866865941698e-01 -3.188427451838806e-01 -2.584724698241752e-01 2.500000000000000e-11 2.220000000000000e-11 -1.250000000000000e-11 1.280000000000000e-11 2.310000000000000e-11 -1.650000000000000e-11 9.210000000000000e-12 2.060000000000000e-11 -9.699999999999999e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.290000000000000e+02 5.909310481858988e-01 -6.944896388290154e-01 -3.188378163032102e-01 -2.585093513667528e-01 2.500000000000000e-11 2.220000000000000e-11 -1.250000000000000e-11 1.280000000000000e-11 2.310000000000000e-11 -1.650000000000000e-11 9.200000000000000e-12 2.060000000000000e-11 -9.699999999999999e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.300000000000000e+02 5.909141020056720e-01 -6.944925908900452e-01 -3.188328877633905e-01 -2.585462336413357e-01 2.500000000000000e-11 2.230000000000000e-11 -1.250000000000000e-11 1.280000000000000e-11 2.310000000000000e-11 -1.650000000000000e-11 9.210000000000000e-12 2.060000000000000e-11 -9.699999999999999e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.310000000000000e+02 5.908971524264404e-01 -6.944955427787406e-01 -3.188279597869852e-01 -2.585831169524708e-01 2.500000000000000e-11 2.230000000000000e-11 -1.250000000000000e-11 1.280000000000000e-11 2.310000000000000e-11 -1.650000000000000e-11 9.200000000000000e-12 2.060000000000000e-11 -9.689999999999999e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.320000000000000e+02 5.908802095781815e-01 -6.944984872395084e-01 -3.188230269938680e-01 -2.586200042714139e-01 2.500000000000000e-11 2.230000000000000e-11 -1.260000000000000e-11 1.280000000000000e-11 2.310000000000000e-11 -1.660000000000000e-11 9.250000000000000e-12 2.070000000000000e-11 -9.789999999999999e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.330000000000000e+02 5.908632532882420e-01 -6.945014382756296e-01 -3.188181007604915e-01 -2.586568900574462e-01 2.500000000000000e-11 2.230000000000000e-11 -1.260000000000000e-11 1.280000000000000e-11 2.310000000000000e-11 -1.660000000000000e-11 9.250000000000000e-12 2.070000000000000e-11 -9.789999999999999e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.340000000000000e+02 5.908462939817773e-01 -6.945043885263817e-01 -3.188131755478240e-01 -2.586937770853950e-01 2.500000000000000e-11 2.230000000000000e-11 -1.260000000000000e-11 1.280000000000000e-11 2.310000000000000e-11 -1.660000000000000e-11 9.250000000000000e-12 2.070000000000000e-11 -9.789999999999999e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.350000000000000e+02 5.908293319602620e-01 -6.945073377992603e-01 -3.188082512755854e-01 -2.587306652814428e-01 2.510000000000000e-11 2.230000000000000e-11 -1.260000000000000e-11 1.280000000000000e-11 2.320000000000000e-11 -1.660000000000000e-11 9.250000000000000e-12 2.070000000000000e-11 -9.770000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.360000000000000e+02 5.908123675020691e-01 -6.945102859959903e-01 -3.188033277158631e-01 -2.587675545536184e-01 2.510000000000000e-11 2.230000000000000e-11 -1.260000000000000e-11 1.280000000000000e-11 2.320000000000000e-11 -1.660000000000000e-11 9.250000000000000e-12 2.070000000000000e-11 -9.770000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.370000000000000e+02 5.907954008269557e-01 -6.945132331217395e-01 -3.187984045234780e-01 -2.588044448107299e-01 2.510000000000000e-11 2.230000000000000e-11 -1.260000000000000e-11 1.280000000000000e-11 2.320000000000000e-11 -1.660000000000000e-11 9.250000000000000e-12 2.070000000000000e-11 -9.760000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.380000000000000e+02 5.907784320867945e-01 -6.945161792629834e-01 -3.187934812951915e-01 -2.588413359699503e-01 2.510000000000000e-11 2.230000000000000e-11 -1.260000000000000e-11 1.280000000000000e-11 2.320000000000000e-11 -1.660000000000000e-11 9.250000000000000e-12 2.070000000000000e-11 -9.760000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.390000000000000e+02 5.907614613761017e-01 -6.945191245449944e-01 -3.187885576439500e-01 -2.588782279553789e-01 2.510000000000000e-11 2.230000000000000e-11 -1.260000000000000e-11 1.280000000000000e-11 2.320000000000000e-11 -1.660000000000000e-11 9.250000000000000e-12 2.070000000000000e-11 -9.760000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.400000000000000e+02 5.907444887493126e-01 -6.945220690859372e-01 -3.187836332698911e-01 -2.589151206943108e-01 2.510000000000000e-11 2.240000000000000e-11 -1.260000000000000e-11 1.280000000000000e-11 2.320000000000000e-11 -1.660000000000000e-11 9.240000000000000e-12 2.070000000000000e-11 -9.750000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.410000000000000e+02 5.907275142341686e-01 -6.945250129622232e-01 -3.187787080102262e-01 -2.589520141182047e-01 2.510000000000000e-11 2.240000000000000e-11 -1.260000000000000e-11 1.280000000000000e-11 2.320000000000000e-11 -1.660000000000000e-11 9.240000000000000e-12 2.070000000000000e-11 -9.750000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.420000000000000e+02 5.907105484164645e-01 -6.945279487825892e-01 -3.187737760277499e-01 -2.589889110876736e-01 2.510000000000000e-11 2.240000000000000e-11 -1.260000000000000e-11 1.280000000000000e-11 2.320000000000000e-11 -1.660000000000000e-11 9.250000000000000e-12 2.070000000000000e-11 -9.740000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.430000000000000e+02 5.906935701000017e-01 -6.945308913411690e-01 -3.187688491331288e-01 -2.590258057369896e-01 2.510000000000000e-11 2.240000000000000e-11 -1.260000000000000e-11 1.280000000000000e-11 2.320000000000000e-11 -1.660000000000000e-11 9.240000000000000e-12 2.070000000000000e-11 -9.740000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.440000000000000e+02 5.906765897889685e-01 -6.945338331650311e-01 -3.187639217613003e-01 -2.590627009967258e-01 2.510000000000000e-11 2.240000000000000e-11 -1.260000000000000e-11 1.280000000000000e-11 2.320000000000000e-11 -1.660000000000000e-11 9.240000000000000e-12 2.070000000000000e-11 -9.740000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.450000000000000e+02 5.906596073491523e-01 -6.945367741859964e-01 -3.187589942568204e-01 -2.590995969310563e-01 2.520000000000000e-11 2.240000000000000e-11 -1.260000000000000e-11 1.280000000000000e-11 2.320000000000000e-11 -1.660000000000000e-11 9.240000000000000e-12 2.070000000000000e-11 -9.740000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.460000000000000e+02 5.906426225933300e-01 -6.945397143476566e-01 -3.187540669908646e-01 -2.591364936606425e-01 2.520000000000000e-11 2.240000000000000e-11 -1.260000000000000e-11 1.280000000000000e-11 2.320000000000000e-11 -1.660000000000000e-11 9.240000000000000e-12 2.070000000000000e-11 -9.730000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.470000000000000e+02 5.906256352997493e-01 -6.945426536151866e-01 -3.187491403102333e-01 -2.591733913568865e-01 2.520000000000000e-11 2.240000000000000e-11 -1.260000000000000e-11 1.280000000000000e-11 2.330000000000000e-11 -1.660000000000000e-11 9.240000000000000e-12 2.070000000000000e-11 -9.730000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.480000000000000e+02 5.906086452461078e-01 -6.945455919729938e-01 -3.187442144919944e-01 -2.592102902265307e-01 2.520000000000000e-11 2.240000000000000e-11 -1.260000000000000e-11 1.280000000000000e-11 2.330000000000000e-11 -1.660000000000000e-11 9.240000000000000e-12 2.070000000000000e-11 -9.730000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.490000000000000e+02 5.905916522484375e-01 -6.945485294150615e-01 -3.187392897113263e-01 -2.592471904884515e-01 2.520000000000000e-11 2.240000000000000e-11 -1.260000000000000e-11 1.280000000000000e-11 2.330000000000000e-11 -1.660000000000000e-11 9.230000000000000e-12 2.070000000000000e-11 -9.730000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.500000000000000e+02 5.905746561923702e-01 -6.945514659334190e-01 -3.187343660293517e-01 -2.592840923482773e-01 2.520000000000000e-11 2.250000000000000e-11 -1.260000000000000e-11 1.280000000000000e-11 2.330000000000000e-11 -1.660000000000000e-11 9.230000000000000e-12 2.070000000000000e-11 -9.720000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.510000000000000e+02 5.905576570444631e-01 -6.945544015113340e-01 -3.187294434042187e-01 -2.593209959772329e-01 2.520000000000000e-11 2.250000000000000e-11 -1.260000000000000e-11 1.280000000000000e-11 2.330000000000000e-11 -1.660000000000000e-11 9.230000000000000e-12 2.070000000000000e-11 -9.720000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.520000000000000e+02 5.905406642080196e-01 -6.945573295606731e-01 -3.187245165643217e-01 -2.593579040845627e-01 2.520000000000000e-11 2.250000000000000e-11 -1.260000000000000e-11 1.280000000000000e-11 2.330000000000000e-11 -1.660000000000000e-11 9.230000000000000e-12 2.070000000000000e-11 -9.710000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.530000000000000e+02 5.905236590113392e-01 -6.945602631798656e-01 -3.187195957056815e-01 -2.593948115760654e-01 2.520000000000000e-11 2.250000000000000e-11 -1.270000000000000e-11 1.280000000000000e-11 2.330000000000000e-11 -1.660000000000000e-11 9.230000000000000e-12 2.070000000000000e-11 -9.710000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.540000000000000e+02 5.905066508884041e-01 -6.945631957784320e-01 -3.187146755736847e-01 -2.594317210762263e-01 2.520000000000000e-11 2.250000000000000e-11 -1.270000000000000e-11 1.280000000000000e-11 2.330000000000000e-11 -1.660000000000000e-11 9.230000000000000e-12 2.070000000000000e-11 -9.710000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.550000000000000e+02 5.904896398706079e-01 -6.945661273354273e-01 -3.187097561470346e-01 -2.594686325944713e-01 2.530000000000000e-11 2.250000000000000e-11 -1.270000000000000e-11 1.290000000000000e-11 2.340000000000000e-11 -1.670000000000000e-11 9.279999999999999e-12 2.080000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.560000000000000e+02 5.904726259420937e-01 -6.945690578318947e-01 -3.187048374961136e-01 -2.595055461298242e-01 2.530000000000000e-11 2.250000000000000e-11 -1.270000000000000e-11 1.290000000000000e-11 2.340000000000000e-11 -1.670000000000000e-11 9.279999999999999e-12 2.080000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.570000000000000e+02 5.904556090446846e-01 -6.945719872421683e-01 -3.186999197783551e-01 -2.595424616886527e-01 2.530000000000000e-11 2.250000000000000e-11 -1.270000000000000e-11 1.290000000000000e-11 2.340000000000000e-11 -1.670000000000000e-11 9.279999999999999e-12 2.080000000000000e-11 -9.780000000000001e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.580000000000000e+02 5.904385890960226e-01 -6.945749155261131e-01 -3.186950032106449e-01 -2.595793792980445e-01 2.530000000000000e-11 2.260000000000000e-11 -1.270000000000000e-11 1.290000000000000e-11 2.340000000000000e-11 -1.670000000000000e-11 9.270000000000001e-12 2.080000000000000e-11 -9.760000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.590000000000000e+02 5.904215660150908e-01 -6.945778426237519e-01 -3.186900880270145e-01 -2.596162990140571e-01 2.530000000000000e-11 2.260000000000000e-11 -1.270000000000000e-11 1.290000000000000e-11 2.340000000000000e-11 -1.670000000000000e-11 9.270000000000001e-12 2.080000000000000e-11 -9.760000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.600000000000000e+02 5.904045397468964e-01 -6.945807684525553e-01 -3.186851744332235e-01 -2.596532209285666e-01 2.540000000000000e-11 2.260000000000000e-11 -1.270000000000000e-11 1.290000000000000e-11 2.340000000000000e-11 -1.670000000000000e-11 9.270000000000001e-12 2.080000000000000e-11 -9.760000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.610000000000000e+02 5.903875102769084e-01 -6.945836929071367e-01 -3.186802625728868e-01 -2.596901451788146e-01 2.540000000000000e-11 2.260000000000000e-11 -1.270000000000000e-11 1.290000000000000e-11 2.340000000000000e-11 -1.670000000000000e-11 9.260000000000001e-12 2.080000000000000e-11 -9.760000000000000e-12 1.650000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.620000000000000e+02 5.903705190953407e-01 -6.945865868084511e-01 -3.186753296828287e-01 -2.597270834172373e-01 2.540000000000000e-11 2.260000000000000e-11 -1.270000000000000e-11 1.290000000000000e-11 2.340000000000000e-11 -1.670000000000000e-11 9.260000000000001e-12 2.080000000000000e-11 -9.750000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.630000000000000e+02 5.903534833412855e-01 -6.945895080964636e-01 -3.186704214143642e-01 -2.597640130285854e-01 2.540000000000000e-11 2.260000000000000e-11 -1.270000000000000e-11 1.290000000000000e-11 2.340000000000000e-11 -1.670000000000000e-11 9.260000000000001e-12 2.080000000000000e-11 -9.750000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.640000000000000e+02 5.903364445535536e-01 -6.945924275401237e-01 -3.186655148685640e-01 -2.598009458592104e-01 2.540000000000000e-11 2.260000000000000e-11 -1.270000000000000e-11 1.290000000000000e-11 2.340000000000000e-11 -1.670000000000000e-11 9.260000000000001e-12 2.080000000000000e-11 -9.750000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.650000000000000e+02 5.903194028064566e-01 -6.945953449336816e-01 -3.186606099398972e-01 -2.598378824179055e-01 2.540000000000000e-11 2.260000000000000e-11 -1.270000000000000e-11 1.290000000000000e-11 2.340000000000000e-11 -1.670000000000000e-11 9.260000000000001e-12 2.080000000000000e-11 -9.740000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.660000000000000e+02 5.903023581536750e-01 -6.945982600547675e-01 -3.186557065087073e-01 -2.598748233217995e-01 2.540000000000000e-11 2.260000000000000e-11 -1.270000000000000e-11 1.290000000000000e-11 2.340000000000000e-11 -1.670000000000000e-11 9.260000000000001e-12 2.080000000000000e-11 -9.740000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.670000000000000e+02 5.902853106145990e-01 -6.946011726757277e-01 -3.186508044630414e-01 -2.599117692702411e-01 2.540000000000000e-11 2.270000000000000e-11 -1.280000000000000e-11 1.290000000000000e-11 2.350000000000000e-11 -1.670000000000000e-11 9.260000000000001e-12 2.080000000000000e-11 -9.730000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.680000000000000e+02 5.902682601693620e-01 -6.946040825774248e-01 -3.186459037157556e-01 -2.599487209981579e-01 2.540000000000000e-11 2.270000000000000e-11 -1.280000000000000e-11 1.290000000000000e-11 2.350000000000000e-11 -1.670000000000000e-11 9.260000000000001e-12 2.070000000000000e-11 -9.730000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.690000000000000e+02 5.902512067609031e-01 -6.946069895640183e-01 -3.186410042196630e-01 -2.599856792132867e-01 2.540000000000000e-11 2.270000000000000e-11 -1.280000000000000e-11 1.290000000000000e-11 2.350000000000000e-11 -1.670000000000000e-11 9.260000000000001e-12 2.080000000000000e-11 -9.730000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.700000000000000e+02 5.902341503042655e-01 -6.946098934732954e-01 -3.186361059822977e-01 -2.600226445293888e-01 2.550000000000000e-11 2.270000000000000e-11 -1.280000000000000e-11 1.290000000000000e-11 2.350000000000000e-11 -1.670000000000000e-11 9.260000000000001e-12 2.070000000000000e-11 -9.710000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.710000000000000e+02 5.902170906993423e-01 -6.946127941781406e-01 -3.186312090811967e-01 -2.600596174147290e-01 2.550000000000000e-11 2.270000000000000e-11 -1.280000000000000e-11 1.290000000000000e-11 2.350000000000000e-11 -1.670000000000000e-11 9.260000000000001e-12 2.070000000000000e-11 -9.710000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.720000000000000e+02 5.902000395438711e-01 -6.946156833819166e-01 -3.186263072382979e-01 -2.600966013964269e-01 2.550000000000000e-11 2.270000000000000e-11 -1.280000000000000e-11 1.290000000000000e-11 2.350000000000000e-11 -1.670000000000000e-11 9.260000000000001e-12 2.070000000000000e-11 -9.699999999999999e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.730000000000000e+02 5.901829733523937e-01 -6.946185773932744e-01 -3.186214135835806e-01 -2.601335901245214e-01 2.550000000000000e-11 2.270000000000000e-11 -1.280000000000000e-11 1.290000000000000e-11 2.350000000000000e-11 -1.670000000000000e-11 9.260000000000001e-12 2.070000000000000e-11 -9.699999999999999e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.740000000000000e+02 5.901659037584862e-01 -6.946214679281478e-01 -3.186165220174466e-01 -2.601705867921671e-01 2.550000000000000e-11 2.270000000000000e-11 -1.280000000000000e-11 1.290000000000000e-11 2.350000000000000e-11 -1.670000000000000e-11 9.260000000000001e-12 2.070000000000000e-11 -9.699999999999999e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.750000000000000e+02 5.901488307296958e-01 -6.946243548948796e-01 -3.186116329405435e-01 -2.602075912232495e-01 2.550000000000000e-11 2.270000000000000e-11 -1.280000000000000e-11 1.290000000000000e-11 2.350000000000000e-11 -1.670000000000000e-11 9.260000000000001e-12 2.070000000000000e-11 -9.689999999999999e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.760000000000000e+02 5.901317542650071e-01 -6.946272382011882e-01 -3.186067467730851e-01 -2.602446031482044e-01 2.550000000000000e-11 2.270000000000000e-11 -1.280000000000000e-11 1.290000000000000e-11 2.350000000000000e-11 -1.670000000000000e-11 9.250000000000000e-12 2.070000000000000e-11 -9.689999999999999e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.770000000000000e+02 5.901146743870617e-01 -6.946301177684325e-01 -3.186018638998043e-01 -2.602816222510464e-01 2.560000000000000e-11 2.280000000000000e-11 -1.280000000000000e-11 1.290000000000000e-11 2.350000000000000e-11 -1.670000000000000e-11 9.250000000000000e-12 2.070000000000000e-11 -9.680000000000001e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.780000000000000e+02 5.900975911308390e-01 -6.946329935523826e-01 -3.185969846090162e-01 -2.603186482142208e-01 2.560000000000000e-11 2.280000000000000e-11 -1.280000000000000e-11 1.290000000000000e-11 2.350000000000000e-11 -1.670000000000000e-11 9.250000000000000e-12 2.070000000000000e-11 -9.680000000000001e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.790000000000000e+02 5.900805045314543e-01 -6.946358655632282e-01 -3.185921090430657e-01 -2.603556807535040e-01 2.560000000000000e-11 2.280000000000000e-11 -1.280000000000000e-11 1.290000000000000e-11 2.350000000000000e-11 -1.670000000000000e-11 9.250000000000000e-12 2.070000000000000e-11 -9.680000000000001e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.800000000000000e+02 5.900634146134776e-01 -6.946387338758792e-01 -3.185872371756673e-01 -2.603927196424165e-01 2.560000000000000e-11 2.280000000000000e-11 -1.280000000000000e-11 1.290000000000000e-11 2.360000000000000e-11 -1.680000000000000e-11 9.300000000000000e-12 2.080000000000000e-11 -9.780000000000001e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.810000000000000e+02 5.900463213803443e-01 -6.946415986256690e-01 -3.185823688283419e-01 -2.604297647274997e-01 2.560000000000000e-11 2.280000000000000e-11 -1.280000000000000e-11 1.290000000000000e-11 2.360000000000000e-11 -1.680000000000000e-11 9.300000000000000e-12 2.080000000000000e-11 -9.770000000000001e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.820000000000000e+02 5.900292348717907e-01 -6.946444529312412e-01 -3.185774981905553e-01 -2.604668187219109e-01 2.560000000000000e-11 2.280000000000000e-11 -1.290000000000000e-11 1.290000000000000e-11 2.360000000000000e-11 -1.680000000000000e-11 9.289999999999999e-12 2.080000000000000e-11 -9.770000000000001e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.830000000000000e+02 5.900121348805404e-01 -6.946473110884361e-01 -3.185726360628517e-01 -2.605038760619089e-01 2.560000000000000e-11 2.280000000000000e-11 -1.290000000000000e-11 1.290000000000000e-11 2.360000000000000e-11 -1.680000000000000e-11 9.289999999999999e-12 2.080000000000000e-11 -9.770000000000001e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.840000000000000e+02 5.899950313612599e-01 -6.946501661957769e-01 -3.185677767125657e-01 -2.605409396114526e-01 2.560000000000000e-11 2.280000000000000e-11 -1.290000000000000e-11 1.290000000000000e-11 2.360000000000000e-11 -1.680000000000000e-11 9.289999999999999e-12 2.080000000000000e-11 -9.770000000000001e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.850000000000000e+02 5.899779241647224e-01 -6.946530183532204e-01 -3.185629200945184e-01 -2.605780094940847e-01 2.570000000000000e-11 2.290000000000000e-11 -1.290000000000000e-11 1.290000000000000e-11 2.360000000000000e-11 -1.680000000000000e-11 9.289999999999999e-12 2.080000000000000e-11 -9.750000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.860000000000000e+02 5.899608131219856e-01 -6.946558675881297e-01 -3.185580663372199e-01 -2.606150858590500e-01 2.570000000000000e-11 2.290000000000000e-11 -1.290000000000000e-11 1.290000000000000e-11 2.360000000000000e-11 -1.680000000000000e-11 9.289999999999999e-12 2.080000000000000e-11 -9.750000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.870000000000000e+02 5.899436980674200e-01 -6.946587138545092e-01 -3.185532157166355e-01 -2.606521688632705e-01 2.570000000000000e-11 2.290000000000000e-11 -1.290000000000000e-11 1.290000000000000e-11 2.360000000000000e-11 -1.680000000000000e-11 9.300000000000000e-12 2.080000000000000e-11 -9.740000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.880000000000000e+02 5.899265788674714e-01 -6.946615570459930e-01 -3.185483685877988e-01 -2.606892586552229e-01 2.570000000000000e-11 2.290000000000000e-11 -1.290000000000000e-11 1.290000000000000e-11 2.360000000000000e-11 -1.680000000000000e-11 9.300000000000000e-12 2.080000000000000e-11 -9.740000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.890000000000000e+02 5.899094554494745e-01 -6.946643970196328e-01 -3.185435252942779e-01 -2.607263553570069e-01 2.570000000000000e-11 2.290000000000000e-11 -1.290000000000000e-11 1.290000000000000e-11 2.360000000000000e-11 -1.680000000000000e-11 9.289999999999999e-12 2.080000000000000e-11 -9.740000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.900000000000000e+02 5.898923278211571e-01 -6.946672336270362e-01 -3.185386860814128e-01 -2.607634590432957e-01 2.570000000000000e-11 2.290000000000000e-11 -1.290000000000000e-11 1.290000000000000e-11 2.370000000000000e-11 -1.680000000000000e-11 9.300000000000000e-12 2.080000000000000e-11 -9.730000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.910000000000000e+02 5.898751960728623e-01 -6.946700667476043e-01 -3.185338510391901e-01 -2.608005697175992e-01 2.570000000000000e-11 2.290000000000000e-11 -1.290000000000000e-11 1.290000000000000e-11 2.370000000000000e-11 -1.680000000000000e-11 9.289999999999999e-12 2.080000000000000e-11 -9.730000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.920000000000000e+02 5.898580843221218e-01 -6.946728795253411e-01 -3.185290069075511e-01 -2.608376939215207e-01 2.570000000000000e-11 2.290000000000000e-11 -1.290000000000000e-11 1.290000000000000e-11 2.370000000000000e-11 -1.680000000000000e-11 9.300000000000000e-12 2.080000000000000e-11 -9.720000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.930000000000000e+02 5.898409448256785e-01 -6.946757055905615e-01 -3.185241798036690e-01 -2.608748181596042e-01 2.570000000000000e-11 2.290000000000000e-11 -1.290000000000000e-11 1.290000000000000e-11 2.370000000000000e-11 -1.680000000000000e-11 9.300000000000000e-12 2.080000000000000e-11 -9.710000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.940000000000000e+02 5.898238017251072e-01 -6.946785282960837e-01 -3.185193562015465e-01 -2.609119486874477e-01 2.570000000000000e-11 2.290000000000000e-11 -1.290000000000000e-11 1.290000000000000e-11 2.370000000000000e-11 -1.680000000000000e-11 9.300000000000000e-12 2.080000000000000e-11 -9.710000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.950000000000000e+02 5.898066551663620e-01 -6.946813479135037e-01 -3.185145356916158e-01 -2.609490849489614e-01 2.570000000000000e-11 2.290000000000000e-11 -1.290000000000000e-11 1.290000000000000e-11 2.370000000000000e-11 -1.690000000000000e-11 9.300000000000000e-12 2.080000000000000e-11 -9.699999999999999e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.960000000000000e+02 5.897895052519888e-01 -6.946841648192522e-01 -3.185097178485846e-01 -2.609862262266103e-01 2.570000000000000e-11 2.290000000000000e-11 -1.290000000000000e-11 1.290000000000000e-11 2.370000000000000e-11 -1.690000000000000e-11 9.300000000000000e-12 2.080000000000000e-11 -9.699999999999999e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.970000000000000e+02 5.897723520457850e-01 -6.946869794557534e-01 -3.185049022680479e-01 -2.610233716896737e-01 2.580000000000000e-11 2.300000000000000e-11 -1.290000000000000e-11 1.290000000000000e-11 2.380000000000000e-11 -1.680000000000000e-11 9.260000000000001e-12 2.080000000000000e-11 -9.710000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.980000000000000e+02 5.897551955909337e-01 -6.946897922769764e-01 -3.185000885894664e-01 -2.610605204702026e-01 2.590000000000000e-11 2.300000000000000e-11 -1.290000000000000e-11 1.290000000000000e-11 2.380000000000000e-11 -1.680000000000000e-11 9.250000000000000e-12 2.080000000000000e-11 -9.710000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.990000000000000e+02 5.897380359323424e-01 -6.946926036902876e-01 -3.184952765073052e-01 -2.610976717537088e-01 2.590000000000000e-11 2.300000000000000e-11 -1.290000000000000e-11 1.290000000000000e-11 2.380000000000000e-11 -1.680000000000000e-11 9.250000000000000e-12 2.080000000000000e-11 -9.710000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.000000000000000e+02 5.897208731332050e-01 -6.946954140055263e-01 -3.184904657762735e-01 -2.611348248708189e-01 2.590000000000000e-11 2.300000000000000e-11 -1.290000000000000e-11 1.290000000000000e-11 2.380000000000000e-11 -1.680000000000000e-11 9.250000000000000e-12 2.080000000000000e-11 -9.689999999999999e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.010000000000000e+02 5.897037072765023e-01 -6.946982234026168e-01 -3.184856562157240e-01 -2.611719793745818e-01 2.590000000000000e-11 2.300000000000000e-11 -1.290000000000000e-11 1.290000000000000e-11 2.380000000000000e-11 -1.680000000000000e-11 9.250000000000000e-12 2.080000000000000e-11 -9.689999999999999e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.020000000000000e+02 5.896865445905913e-01 -6.947010276170882e-01 -3.184808443412815e-01 -2.612091367931734e-01 2.590000000000000e-11 2.300000000000000e-11 -1.290000000000000e-11 1.290000000000000e-11 2.380000000000000e-11 -1.680000000000000e-11 9.250000000000000e-12 2.080000000000000e-11 -9.680000000000001e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.030000000000000e+02 5.896693728553010e-01 -6.947038351729158e-01 -3.184760368800616e-01 -2.612462938409807e-01 2.590000000000000e-11 2.300000000000000e-11 -1.290000000000000e-11 1.290000000000000e-11 2.380000000000000e-11 -1.680000000000000e-11 9.250000000000000e-12 2.080000000000000e-11 -9.680000000000001e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.040000000000000e+02 5.896521982267650e-01 -6.947066415700808e-01 -3.184712305274243e-01 -2.612834526163331e-01 2.590000000000000e-11 2.300000000000000e-11 -1.290000000000000e-11 1.290000000000000e-11 2.380000000000000e-11 -1.680000000000000e-11 9.250000000000000e-12 2.080000000000000e-11 -9.680000000000001e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.050000000000000e+02 5.896350206561158e-01 -6.947094465455552e-01 -3.184664254466194e-01 -2.613206137285826e-01 2.590000000000000e-11 2.310000000000000e-11 -1.300000000000000e-11 1.300000000000000e-11 2.380000000000000e-11 -1.690000000000000e-11 9.310000000000000e-12 2.090000000000000e-11 -9.760000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.060000000000000e+02 5.896178400333606e-01 -6.947122498062798e-01 -3.184616218756435e-01 -2.613577779133925e-01 2.590000000000000e-11 2.310000000000000e-11 -1.300000000000000e-11 1.300000000000000e-11 2.380000000000000e-11 -1.690000000000000e-11 9.310000000000000e-12 2.090000000000000e-11 -9.750000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.070000000000000e+02 5.896006562105103e-01 -6.947150510721312e-01 -3.184568200855063e-01 -2.613949459171109e-01 2.590000000000000e-11 2.310000000000000e-11 -1.300000000000000e-11 1.300000000000000e-11 2.380000000000000e-11 -1.690000000000000e-11 9.310000000000000e-12 2.090000000000000e-11 -9.750000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.080000000000000e+02 5.895834690447578e-01 -6.947178501165443e-01 -3.184520203171201e-01 -2.614321183683068e-01 2.590000000000000e-11 2.310000000000000e-11 -1.300000000000000e-11 1.300000000000000e-11 2.390000000000000e-11 -1.690000000000000e-11 9.320000000000000e-12 2.090000000000000e-11 -9.740000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.090000000000000e+02 5.895662784491618e-01 -6.947206468004871e-01 -3.184472227126934e-01 -2.614692956568526e-01 2.590000000000000e-11 2.310000000000000e-11 -1.300000000000000e-11 1.300000000000000e-11 2.390000000000000e-11 -1.690000000000000e-11 9.310000000000000e-12 2.090000000000000e-11 -9.740000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.100000000000000e+02 5.895490844325995e-01 -6.947234410946330e-01 -3.184424272643574e-01 -2.615064778476818e-01 2.590000000000000e-11 2.310000000000000e-11 -1.300000000000000e-11 1.300000000000000e-11 2.390000000000000e-11 -1.690000000000000e-11 9.320000000000000e-12 2.090000000000000e-11 -9.730000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.110000000000000e+02 5.895318871172164e-01 -6.947262330827644e-01 -3.184376337983363e-01 -2.615436646519333e-01 2.600000000000000e-11 2.310000000000000e-11 -1.300000000000000e-11 1.300000000000000e-11 2.390000000000000e-11 -1.690000000000000e-11 9.310000000000000e-12 2.090000000000000e-11 -9.730000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.120000000000000e+02 5.895147078388958e-01 -6.947290081407874e-01 -3.184328304048916e-01 -2.615808613214444e-01 2.600000000000000e-11 2.310000000000000e-11 -1.300000000000000e-11 1.300000000000000e-11 2.390000000000000e-11 -1.700000000000000e-11 9.320000000000000e-12 2.090000000000000e-11 -9.720000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.130000000000000e+02 5.894975046648619e-01 -6.947317961173853e-01 -3.184280398942907e-01 -2.616180553144086e-01 2.600000000000000e-11 2.310000000000000e-11 -1.300000000000000e-11 1.300000000000000e-11 2.390000000000000e-11 -1.700000000000000e-11 9.320000000000000e-12 2.090000000000000e-11 -9.720000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.140000000000000e+02 5.894802990195879e-01 -6.947345824671063e-01 -3.184232502842962e-01 -2.616552515628480e-01 2.600000000000000e-11 2.310000000000000e-11 -1.300000000000000e-11 1.300000000000000e-11 2.390000000000000e-11 -1.700000000000000e-11 9.320000000000000e-12 2.090000000000000e-11 -9.720000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.150000000000000e+02 5.894630911927085e-01 -6.947373674242426e-01 -3.184184612607191e-01 -2.616924491733102e-01 2.600000000000000e-11 2.310000000000000e-11 -1.300000000000000e-11 1.300000000000000e-11 2.390000000000000e-11 -1.700000000000000e-11 9.320000000000000e-12 2.090000000000000e-11 -9.710000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.160000000000000e+02 5.894458814141741e-01 -6.947401511698651e-01 -3.184136726161952e-01 -2.617296473986219e-01 2.600000000000000e-11 2.310000000000000e-11 -1.300000000000000e-11 1.300000000000000e-11 2.390000000000000e-11 -1.700000000000000e-11 9.320000000000000e-12 2.090000000000000e-11 -9.699999999999999e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.170000000000000e+02 5.894286698333805e-01 -6.947429338221170e-01 -3.184088842450384e-01 -2.617668457167926e-01 2.610000000000000e-11 2.320000000000000e-11 -1.300000000000000e-11 1.290000000000000e-11 2.400000000000000e-11 -1.690000000000000e-11 9.279999999999999e-12 2.090000000000000e-11 -9.710000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.180000000000000e+02 5.894114565171377e-01 -6.947457154430015e-01 -3.184040961015365e-01 -2.618040438681228e-01 2.610000000000000e-11 2.320000000000000e-11 -1.300000000000000e-11 1.290000000000000e-11 2.400000000000000e-11 -1.690000000000000e-11 9.270000000000001e-12 2.090000000000000e-11 -9.710000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.190000000000000e+02 5.893942414623748e-01 -6.947484960573419e-01 -3.183993081413461e-01 -2.618412418473559e-01 2.610000000000000e-11 2.320000000000000e-11 -1.300000000000000e-11 1.290000000000000e-11 2.400000000000000e-11 -1.690000000000000e-11 9.270000000000001e-12 2.090000000000000e-11 -9.710000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.200000000000000e+02 5.893770246167669e-01 -6.947512756777319e-01 -3.183945202700193e-01 -2.618784398534472e-01 2.610000000000000e-11 2.320000000000000e-11 -1.300000000000000e-11 1.300000000000000e-11 2.400000000000000e-11 -1.690000000000000e-11 9.279999999999999e-12 2.090000000000000e-11 -9.699999999999999e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.210000000000000e+02 5.893598059002253e-01 -6.947540543282109e-01 -3.183897323221016e-01 -2.619156382036452e-01 2.610000000000000e-11 2.320000000000000e-11 -1.300000000000000e-11 1.300000000000000e-11 2.400000000000000e-11 -1.690000000000000e-11 9.270000000000001e-12 2.090000000000000e-11 -9.699999999999999e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.220000000000000e+02 5.893426082411166e-01 -6.947568159190997e-01 -3.183849314406180e-01 -2.619528436132450e-01 2.610000000000000e-11 2.330000000000000e-11 -1.300000000000000e-11 1.300000000000000e-11 2.400000000000000e-11 -1.700000000000000e-11 9.279999999999999e-12 2.080000000000000e-11 -9.689999999999999e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.230000000000000e+02 5.893253855153259e-01 -6.947595928254763e-01 -3.183801426937408e-01 -2.619900435178870e-01 2.610000000000000e-11 2.330000000000000e-11 -1.300000000000000e-11 1.300000000000000e-11 2.400000000000000e-11 -1.700000000000000e-11 9.279999999999999e-12 2.080000000000000e-11 -9.689999999999999e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.240000000000000e+02 5.893081606676938e-01 -6.947623690176438e-01 -3.183753533089288e-01 -2.620272443332297e-01 2.610000000000000e-11 2.330000000000000e-11 -1.300000000000000e-11 1.300000000000000e-11 2.400000000000000e-11 -1.700000000000000e-11 9.279999999999999e-12 2.090000000000000e-11 -9.689999999999999e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.250000000000000e+02 5.892909336471884e-01 -6.947651446154045e-01 -3.183705632931739e-01 -2.620644458471012e-01 2.620000000000000e-11 2.330000000000000e-11 -1.310000000000000e-11 1.300000000000000e-11 2.400000000000000e-11 -1.700000000000000e-11 9.289999999999999e-12 2.080000000000000e-11 -9.670000000000001e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.260000000000000e+02 5.892737044311627e-01 -6.947679197139898e-01 -3.183657728199945e-01 -2.621016476464763e-01 2.620000000000000e-11 2.330000000000000e-11 -1.310000000000000e-11 1.300000000000000e-11 2.400000000000000e-11 -1.700000000000000e-11 9.279999999999999e-12 2.080000000000000e-11 -9.670000000000001e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.270000000000000e+02 5.892564730318360e-01 -6.947706943492022e-01 -3.183609822081107e-01 -2.621388492213537e-01 2.620000000000000e-11 2.330000000000000e-11 -1.310000000000000e-11 1.300000000000000e-11 2.400000000000000e-11 -1.700000000000000e-11 9.289999999999999e-12 2.080000000000000e-11 -9.660000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.280000000000000e+02 5.892392395028159e-01 -6.947734684657036e-01 -3.183561918573428e-01 -2.621760501120765e-01 2.620000000000000e-11 2.330000000000000e-11 -1.310000000000000e-11 1.300000000000000e-11 2.400000000000000e-11 -1.700000000000000e-11 9.289999999999999e-12 2.080000000000000e-11 -9.660000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.290000000000000e+02 5.892220039444839e-01 -6.947762418973109e-01 -3.183514021591740e-01 -2.622132500580089e-01 2.620000000000000e-11 2.330000000000000e-11 -1.310000000000000e-11 1.300000000000000e-11 2.400000000000000e-11 -1.700000000000000e-11 9.279999999999999e-12 2.080000000000000e-11 -9.660000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.300000000000000e+02 5.892047665066678e-01 -6.947790143658767e-01 -3.183466134077163e-01 -2.622504491024603e-01 2.620000000000000e-11 2.330000000000000e-11 -1.310000000000000e-11 1.300000000000000e-11 2.400000000000000e-11 -1.700000000000000e-11 9.279999999999999e-12 2.080000000000000e-11 -9.660000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.310000000000000e+02 5.891875273851376e-01 -6.947817855047761e-01 -3.183418257357244e-01 -2.622876476157980e-01 2.620000000000000e-11 2.330000000000000e-11 -1.310000000000000e-11 1.300000000000000e-11 2.400000000000000e-11 -1.700000000000000e-11 9.279999999999999e-12 2.080000000000000e-11 -9.660000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.320000000000000e+02 5.891703294141535e-01 -6.947845250233186e-01 -3.183370157081875e-01 -2.623248580598964e-01 2.620000000000000e-11 2.330000000000000e-11 -1.310000000000000e-11 1.300000000000000e-11 2.400000000000000e-11 -1.700000000000000e-11 9.279999999999999e-12 2.080000000000000e-11 -9.650000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.330000000000000e+02 5.891530876573813e-01 -6.947872922878675e-01 -3.183322298625004e-01 -2.623620574889514e-01 2.620000000000000e-11 2.330000000000000e-11 -1.310000000000000e-11 1.300000000000000e-11 2.400000000000000e-11 -1.700000000000000e-11 9.279999999999999e-12 2.080000000000000e-11 -9.650000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.340000000000000e+02 5.891358449966476e-01 -6.947900570958478e-01 -3.183274444585361e-01 -2.623992583932591e-01 2.620000000000000e-11 2.330000000000000e-11 -1.310000000000000e-11 1.300000000000000e-11 2.400000000000000e-11 -1.700000000000000e-11 9.279999999999999e-12 2.080000000000000e-11 -9.650000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.350000000000000e+02 5.891186017293450e-01 -6.947928192404119e-01 -3.183226590607003e-01 -2.624364611805055e-01 2.620000000000000e-11 2.330000000000000e-11 -1.310000000000000e-11 1.300000000000000e-11 2.400000000000000e-11 -1.700000000000000e-11 9.270000000000001e-12 2.080000000000000e-11 -9.650000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.360000000000000e+02 5.891013581608872e-01 -6.947955786454124e-01 -3.183178732126851e-01 -2.624736659193408e-01 2.620000000000000e-11 2.330000000000000e-11 -1.310000000000000e-11 1.300000000000000e-11 2.400000000000000e-11 -1.700000000000000e-11 9.270000000000001e-12 2.080000000000000e-11 -9.650000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.370000000000000e+02 5.890841145900709e-01 -6.947983353562955e-01 -3.183130864891679e-01 -2.625108723338757e-01 2.620000000000000e-11 2.330000000000000e-11 -1.310000000000000e-11 1.300000000000000e-11 2.410000000000000e-11 -1.700000000000000e-11 9.310000000000000e-12 2.100000000000000e-11 -9.740000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.380000000000000e+02 5.890668712845241e-01 -6.948010895136425e-01 -3.183082985367903e-01 -2.625480798793449e-01 2.620000000000000e-11 2.330000000000000e-11 -1.310000000000000e-11 1.300000000000000e-11 2.410000000000000e-11 -1.700000000000000e-11 9.310000000000000e-12 2.100000000000000e-11 -9.740000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.390000000000000e+02 5.890496284435018e-01 -6.948038413219532e-01 -3.183035091049088e-01 -2.625852878710689e-01 2.620000000000000e-11 2.330000000000000e-11 -1.310000000000000e-11 1.300000000000000e-11 2.410000000000000e-11 -1.700000000000000e-11 9.310000000000000e-12 2.100000000000000e-11 -9.740000000000000e-12 1.640000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.400000000000000e+02 5.890323861517418e-01 -6.948065910254536e-01 -3.182987180647543e-01 -2.626224956288160e-01 2.640000000000000e-11 2.350000000000000e-11 -1.320000000000000e-11 1.300000000000000e-11 2.420000000000000e-11 -1.710000000000000e-11 9.320000000000000e-12 2.090000000000000e-11 -9.670000000000001e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.410000000000000e+02 5.890151443317465e-01 -6.948093388958894e-01 -3.182939254180302e-01 -2.626597026056542e-01 2.640000000000000e-11 2.350000000000000e-11 -1.320000000000000e-11 1.300000000000000e-11 2.420000000000000e-11 -1.710000000000000e-11 9.320000000000000e-12 2.090000000000000e-11 -9.670000000000001e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.420000000000000e+02 5.889978819716319e-01 -6.948120997795312e-01 -3.182891426656596e-01 -2.626969027111850e-01 2.640000000000000e-11 2.350000000000000e-11 -1.320000000000000e-11 1.300000000000000e-11 2.420000000000000e-11 -1.710000000000000e-11 9.320000000000000e-12 2.090000000000000e-11 -9.670000000000001e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.430000000000000e+02 5.889806400440366e-01 -6.948148449190564e-01 -3.182843472894206e-01 -2.627341074241641e-01 2.640000000000000e-11 2.350000000000000e-11 -1.320000000000000e-11 1.300000000000000e-11 2.420000000000000e-11 -1.710000000000000e-11 9.310000000000000e-12 2.090000000000000e-11 -9.660000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.440000000000000e+02 5.889633971214852e-01 -6.948175892276386e-01 -3.182795509706276e-01 -2.627713111908299e-01 2.640000000000000e-11 2.350000000000000e-11 -1.320000000000000e-11 1.300000000000000e-11 2.420000000000000e-11 -1.710000000000000e-11 9.310000000000000e-12 2.090000000000000e-11 -9.660000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.450000000000000e+02 5.889461523640128e-01 -6.948203330963815e-01 -3.182747540531877e-01 -2.628085144431997e-01 2.640000000000000e-11 2.350000000000000e-11 -1.320000000000000e-11 1.300000000000000e-11 2.420000000000000e-11 -1.710000000000000e-11 9.310000000000000e-12 2.090000000000000e-11 -9.660000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.460000000000000e+02 5.889289048752789e-01 -6.948230769081700e-01 -3.182699568853323e-01 -2.628457177556388e-01 2.640000000000000e-11 2.350000000000000e-11 -1.320000000000000e-11 1.300000000000000e-11 2.420000000000000e-11 -1.710000000000000e-11 9.310000000000000e-12 2.090000000000000e-11 -9.660000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.470000000000000e+02 5.889116538249032e-01 -6.948258209861046e-01 -3.182651597873186e-01 -2.628829217460804e-01 2.640000000000000e-11 2.350000000000000e-11 -1.320000000000000e-11 1.300000000000000e-11 2.420000000000000e-11 -1.710000000000000e-11 9.310000000000000e-12 2.090000000000000e-11 -9.660000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.480000000000000e+02 5.888943985869851e-01 -6.948285655292816e-01 -3.182603630223382e-01 -2.629201269706896e-01 2.640000000000000e-11 2.350000000000000e-11 -1.320000000000000e-11 1.300000000000000e-11 2.420000000000000e-11 -1.710000000000000e-11 9.310000000000000e-12 2.090000000000000e-11 -9.660000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.490000000000000e+02 5.888771388663756e-01 -6.948313105523543e-01 -3.182555667727208e-01 -2.629573338296987e-01 2.640000000000000e-11 2.350000000000000e-11 -1.320000000000000e-11 1.300000000000000e-11 2.420000000000000e-11 -1.710000000000000e-11 9.300000000000000e-12 2.090000000000000e-11 -9.660000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.500000000000000e+02 5.888598747786584e-01 -6.948340558495361e-01 -3.182507711260389e-01 -2.629945425004637e-01 2.640000000000000e-11 2.350000000000000e-11 -1.320000000000000e-11 1.300000000000000e-11 2.420000000000000e-11 -1.710000000000000e-11 9.300000000000000e-12 2.090000000000000e-11 -9.660000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.510000000000000e+02 5.888426068547477e-01 -6.948368010001711e-01 -3.182459760736534e-01 -2.630317529145130e-01 2.640000000000000e-11 2.350000000000000e-11 -1.320000000000000e-11 1.300000000000000e-11 2.420000000000000e-11 -1.710000000000000e-11 9.300000000000000e-12 2.090000000000000e-11 -9.660000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.520000000000000e+02 5.888253917413067e-01 -6.948395062830113e-01 -3.182411509350623e-01 -2.630689803085968e-01 2.640000000000000e-11 2.350000000000000e-11 -1.320000000000000e-11 1.300000000000000e-11 2.420000000000000e-11 -1.710000000000000e-11 9.300000000000000e-12 2.090000000000000e-11 -9.660000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.530000000000000e+02 5.888081189276576e-01 -6.948422493261439e-01 -3.182363567304404e-01 -2.631061931828941e-01 2.640000000000000e-11 2.350000000000000e-11 -1.320000000000000e-11 1.300000000000000e-11 2.420000000000000e-11 -1.710000000000000e-11 9.300000000000000e-12 2.090000000000000e-11 -9.660000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.540000000000000e+02 5.887908452426157e-01 -6.948449903811125e-01 -3.182315626814343e-01 -2.631434065563687e-01 2.640000000000000e-11 2.350000000000000e-11 -1.320000000000000e-11 1.300000000000000e-11 2.420000000000000e-11 -1.710000000000000e-11 9.289999999999999e-12 2.090000000000000e-11 -9.650000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.550000000000000e+02 5.887735715631032e-01 -6.948477289761975e-01 -3.182267685918510e-01 -2.631806199495639e-01 2.640000000000000e-11 2.350000000000000e-11 -1.320000000000000e-11 1.300000000000000e-11 2.420000000000000e-11 -1.710000000000000e-11 9.289999999999999e-12 2.090000000000000e-11 -9.650000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.560000000000000e+02 5.887562984709093e-01 -6.948504648368283e-01 -3.182219742857026e-01 -2.632178329988051e-01 2.640000000000000e-11 2.350000000000000e-11 -1.320000000000000e-11 1.300000000000000e-11 2.420000000000000e-11 -1.710000000000000e-11 9.289999999999999e-12 2.090000000000000e-11 -9.650000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.570000000000000e+02 5.887390262002465e-01 -6.948531979006782e-01 -3.182171796280827e-01 -2.632550455082202e-01 2.640000000000000e-11 2.350000000000000e-11 -1.320000000000000e-11 1.300000000000000e-11 2.420000000000000e-11 -1.710000000000000e-11 9.289999999999999e-12 2.090000000000000e-11 -9.650000000000000e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.580000000000000e+02 5.887217546568978e-01 -6.948559282923032e-01 -3.182123845371357e-01 -2.632922574591498e-01 2.660000000000000e-11 2.360000000000000e-11 -1.320000000000000e-11 1.300000000000000e-11 2.430000000000000e-11 -1.710000000000000e-11 9.240000000000000e-12 2.090000000000000e-11 -9.670000000000001e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.590000000000000e+02 5.887044834891642e-01 -6.948586562722624e-01 -3.182075889880564e-01 -2.633294689807248e-01 2.660000000000000e-11 2.360000000000000e-11 -1.320000000000000e-11 1.300000000000000e-11 2.430000000000000e-11 -1.710000000000000e-11 9.240000000000000e-12 2.090000000000000e-11 -9.670000000000001e-12 1.630000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.600000000000000e+02 5.886872121850539e-01 -6.948613821745951e-01 -3.182027930128812e-01 -2.633666802976453e-01 2.660000000000000e-11 2.370000000000000e-11 -1.330000000000000e-11 1.300000000000000e-11 2.440000000000000e-11 -1.710000000000000e-11 9.289999999999999e-12 2.080000000000000e-11 -9.580000000000001e-12 1.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.610000000000000e+02 5.886699401711903e-01 -6.948641063449025e-01 -3.181979966997828e-01 -2.634038916732104e-01 2.660000000000000e-11 2.370000000000000e-11 -1.330000000000000e-11 1.300000000000000e-11 2.440000000000000e-11 -1.710000000000000e-11 9.289999999999999e-12 2.080000000000000e-11 -9.570000000000001e-12 1.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.620000000000000e+02 5.886526567836088e-01 -6.948668361861173e-01 -3.181932057339993e-01 -2.634411005424462e-01 2.670000000000000e-11 2.370000000000000e-11 -1.330000000000000e-11 1.300000000000000e-11 2.440000000000000e-11 -1.710000000000000e-11 9.289999999999999e-12 2.080000000000000e-11 -9.570000000000001e-12 1.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.630000000000000e+02 5.886353817836361e-01 -6.948695577296178e-01 -3.181884092213625e-01 -2.634783127512724e-01 2.670000000000000e-11 2.370000000000000e-11 -1.330000000000000e-11 1.300000000000000e-11 2.440000000000000e-11 -1.710000000000000e-11 9.289999999999999e-12 2.080000000000000e-11 -9.570000000000001e-12 1.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.640000000000000e+02 5.886181047164143e-01 -6.948722781945434e-01 -3.181836129380968e-01 -2.635155256421162e-01 2.670000000000000e-11 2.370000000000000e-11 -1.330000000000000e-11 1.300000000000000e-11 2.440000000000000e-11 -1.710000000000000e-11 9.289999999999999e-12 2.080000000000000e-11 -9.570000000000001e-12 1.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.650000000000000e+02 5.886008253764795e-01 -6.948749975942807e-01 -3.181788171414928e-01 -2.635527393272855e-01 2.670000000000000e-11 2.370000000000000e-11 -1.330000000000000e-11 1.300000000000000e-11 2.440000000000000e-11 -1.710000000000000e-11 9.279999999999999e-12 2.080000000000000e-11 -9.570000000000001e-12 1.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.660000000000000e+02 5.885835436849942e-01 -6.948777158432244e-01 -3.181740220953114e-01 -2.635899538893884e-01 2.670000000000000e-11 2.370000000000000e-11 -1.330000000000000e-11 1.300000000000000e-11 2.440000000000000e-11 -1.710000000000000e-11 9.279999999999999e-12 2.080000000000000e-11 -9.570000000000001e-12 1.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.670000000000000e+02 5.885662596669270e-01 -6.948804327779271e-01 -3.181692280474755e-01 -2.636271694035304e-01 2.670000000000000e-11 2.370000000000000e-11 -1.330000000000000e-11 1.300000000000000e-11 2.440000000000000e-11 -1.710000000000000e-11 9.279999999999999e-12 2.080000000000000e-11 -9.570000000000001e-12 1.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.680000000000000e+02 5.885489734253450e-01 -6.948831481833708e-01 -3.181644352032855e-01 -2.636643859578205e-01 2.670000000000000e-11 2.370000000000000e-11 -1.330000000000000e-11 1.300000000000000e-11 2.440000000000000e-11 -1.710000000000000e-11 9.279999999999999e-12 2.080000000000000e-11 -9.570000000000001e-12 1.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.690000000000000e+02 5.885316851170886e-01 -6.948858618212306e-01 -3.181596436974485e-01 -2.637016036669450e-01 2.670000000000000e-11 2.370000000000000e-11 -1.330000000000000e-11 1.300000000000000e-11 2.440000000000000e-11 -1.710000000000000e-11 9.279999999999999e-12 2.080000000000000e-11 -9.570000000000001e-12 1.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.700000000000000e+02 5.885143949338798e-01 -6.948885734544360e-01 -3.181548535721063e-01 -2.637388226761091e-01 2.670000000000000e-11 2.370000000000000e-11 -1.330000000000000e-11 1.300000000000000e-11 2.440000000000000e-11 -1.720000000000000e-11 9.270000000000001e-12 2.080000000000000e-11 -9.570000000000001e-12 1.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.710000000000000e+02 5.884971030886889e-01 -6.948912828679180e-01 -3.181500647647579e-01 -2.637760431513463e-01 2.670000000000000e-11 2.370000000000000e-11 -1.330000000000000e-11 1.300000000000000e-11 2.440000000000000e-11 -1.720000000000000e-11 9.270000000000001e-12 2.080000000000000e-11 -9.560000000000000e-12 1.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.720000000000000e+02 5.884798518599743e-01 -6.948939603662780e-01 -3.181452540715797e-01 -2.638132769840489e-01 2.670000000000000e-11 2.370000000000000e-11 -1.330000000000000e-11 1.310000000000000e-11 2.440000000000000e-11 -1.720000000000000e-11 9.320000000000000e-12 2.100000000000000e-11 -9.670000000000001e-12 1.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.730000000000000e+02 5.884625573626229e-01 -6.948966648576408e-01 -3.181404673241751e-01 -2.638505008574457e-01 2.670000000000000e-11 2.370000000000000e-11 -1.330000000000000e-11 1.310000000000000e-11 2.440000000000000e-11 -1.720000000000000e-11 9.320000000000000e-12 2.100000000000000e-11 -9.670000000000001e-12 1.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.740000000000000e+02 5.884452618676588e-01 -6.948993667465198e-01 -3.181356811796136e-01 -2.638877265830525e-01 2.670000000000000e-11 2.370000000000000e-11 -1.330000000000000e-11 1.310000000000000e-11 2.440000000000000e-11 -1.720000000000000e-11 9.310000000000000e-12 2.100000000000000e-11 -9.660000000000000e-12 1.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.750000000000000e+02 5.884279655776723e-01 -6.949020660053281e-01 -3.181308953150391e-01 -2.639249541701205e-01 2.670000000000000e-11 2.370000000000000e-11 -1.330000000000000e-11 1.300000000000000e-11 2.440000000000000e-11 -1.720000000000000e-11 9.310000000000000e-12 2.100000000000000e-11 -9.660000000000000e-12 1.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.760000000000000e+02 5.884106686758982e-01 -6.949047626425779e-01 -3.181261094258283e-01 -2.639621835540669e-01 2.670000000000000e-11 2.370000000000000e-11 -1.330000000000000e-11 1.300000000000000e-11 2.440000000000000e-11 -1.720000000000000e-11 9.310000000000000e-12 2.100000000000000e-11 -9.660000000000000e-12 1.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.770000000000000e+02 5.883933713200483e-01 -6.949074566838066e-01 -3.181213232635035e-01 -2.639994146147843e-01 2.680000000000000e-11 2.380000000000000e-11 -1.330000000000000e-11 1.300000000000000e-11 2.450000000000000e-11 -1.720000000000000e-11 9.260000000000001e-12 2.100000000000000e-11 -9.680000000000001e-12 1.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.780000000000000e+02 5.883760736350990e-01 -6.949101481501971e-01 -3.181165366688722e-01 -2.640366472090906e-01 2.680000000000000e-11 2.380000000000000e-11 -1.330000000000000e-11 1.300000000000000e-11 2.450000000000000e-11 -1.720000000000000e-11 9.260000000000001e-12 2.100000000000000e-11 -9.680000000000001e-12 1.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.790000000000000e+02 5.883587757045583e-01 -6.949128370407848e-01 -3.181117495960701e-01 -2.640738812080595e-01 2.680000000000000e-11 2.380000000000000e-11 -1.330000000000000e-11 1.300000000000000e-11 2.450000000000000e-11 -1.720000000000000e-11 9.260000000000001e-12 2.100000000000000e-11 -9.680000000000001e-12 1.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.800000000000000e+02 5.883414775597865e-01 -6.949155233255734e-01 -3.181069621203456e-01 -2.641111165295334e-01 2.680000000000000e-11 2.380000000000000e-11 -1.330000000000000e-11 1.300000000000000e-11 2.450000000000000e-11 -1.720000000000000e-11 9.250000000000000e-12 2.100000000000000e-11 -9.680000000000001e-12 1.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.810000000000000e+02 5.883241791699956e-01 -6.949182069521852e-01 -3.181021744251813e-01 -2.641483531583770e-01 2.680000000000000e-11 2.380000000000000e-11 -1.330000000000000e-11 1.300000000000000e-11 2.450000000000000e-11 -1.720000000000000e-11 9.250000000000000e-12 2.100000000000000e-11 -9.680000000000001e-12 1.620000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.820000000000000e+02 5.883068866268988e-01 -6.949208835195128e-01 -3.180973833798006e-01 -2.641855928750644e-01 2.690000000000000e-11 2.390000000000000e-11 -1.340000000000000e-11 1.310000000000000e-11 2.460000000000000e-11 -1.730000000000000e-11 9.310000000000000e-12 2.090000000000000e-11 -9.580000000000001e-12 1.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.830000000000000e+02 5.882895873875101e-01 -6.949235616844704e-01 -3.180925960493193e-01 -2.642228323324988e-01 2.690000000000000e-11 2.390000000000000e-11 -1.340000000000000e-11 1.310000000000000e-11 2.460000000000000e-11 -1.730000000000000e-11 9.310000000000000e-12 2.090000000000000e-11 -9.580000000000001e-12 1.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.840000000000000e+02 5.882722874242562e-01 -6.949262371162247e-01 -3.180878093012846e-01 -2.642600733936700e-01 2.690000000000000e-11 2.390000000000000e-11 -1.340000000000000e-11 1.310000000000000e-11 2.460000000000000e-11 -1.730000000000000e-11 9.310000000000000e-12 2.090000000000000e-11 -9.580000000000001e-12 1.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.850000000000000e+02 5.882549864884214e-01 -6.949289098982067e-01 -3.180830233126779e-01 -2.642973161790787e-01 2.690000000000000e-11 2.390000000000000e-11 -1.340000000000000e-11 1.310000000000000e-11 2.460000000000000e-11 -1.730000000000000e-11 9.300000000000000e-12 2.090000000000000e-11 -9.580000000000001e-12 1.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.860000000000000e+02 5.882376843278579e-01 -6.949315801862801e-01 -3.180782381513658e-01 -2.643345607576167e-01 2.690000000000000e-11 2.390000000000000e-11 -1.340000000000000e-11 1.310000000000000e-11 2.460000000000000e-11 -1.730000000000000e-11 9.300000000000000e-12 2.090000000000000e-11 -9.580000000000001e-12 1.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.870000000000000e+02 5.882203807203297e-01 -6.949342481930718e-01 -3.180734537744209e-01 -2.643718071156074e-01 2.690000000000000e-11 2.390000000000000e-11 -1.340000000000000e-11 1.310000000000000e-11 2.460000000000000e-11 -1.730000000000000e-11 9.300000000000000e-12 2.090000000000000e-11 -9.580000000000001e-12 1.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.880000000000000e+02 5.882030755066365e-01 -6.949369141563081e-01 -3.180686700533975e-01 -2.644090551359867e-01 2.690000000000000e-11 2.390000000000000e-11 -1.340000000000000e-11 1.310000000000000e-11 2.460000000000000e-11 -1.730000000000000e-11 9.300000000000000e-12 2.090000000000000e-11 -9.580000000000001e-12 1.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.890000000000000e+02 5.881857686137594e-01 -6.949395783021320e-01 -3.180638868156816e-01 -2.644463045935742e-01 2.690000000000000e-11 2.390000000000000e-11 -1.340000000000000e-11 1.310000000000000e-11 2.460000000000000e-11 -1.730000000000000e-11 9.300000000000000e-12 2.090000000000000e-11 -9.580000000000001e-12 1.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.900000000000000e+02 5.881684600587601e-01 -6.949422408155229e-01 -3.180591038913979e-01 -2.644835551678165e-01 2.690000000000000e-11 2.390000000000000e-11 -1.340000000000000e-11 1.300000000000000e-11 2.460000000000000e-11 -1.730000000000000e-11 9.300000000000000e-12 2.090000000000000e-11 -9.589999999999999e-12 1.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.910000000000000e+02 5.881511499267612e-01 -6.949449018272047e-01 -3.180543211557624e-01 -2.645208064753180e-01 2.690000000000000e-11 2.390000000000000e-11 -1.340000000000000e-11 1.300000000000000e-11 2.460000000000000e-11 -1.730000000000000e-11 9.289999999999999e-12 2.090000000000000e-11 -9.580000000000001e-12 1.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.920000000000000e+02 5.881338417987459e-01 -6.949475589818361e-01 -3.180495366554452e-01 -2.645580590900449e-01 2.690000000000000e-11 2.390000000000000e-11 -1.340000000000000e-11 1.300000000000000e-11 2.460000000000000e-11 -1.730000000000000e-11 9.289999999999999e-12 2.090000000000000e-11 -9.580000000000001e-12 1.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.930000000000000e+02 5.881165287841086e-01 -6.949502172267124e-01 -3.180447542326138e-01 -2.645953107154252e-01 2.690000000000000e-11 2.390000000000000e-11 -1.340000000000000e-11 1.300000000000000e-11 2.460000000000000e-11 -1.730000000000000e-11 9.289999999999999e-12 2.090000000000000e-11 -9.580000000000001e-12 1.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.940000000000000e+02 5.880992143226798e-01 -6.949528741937295e-01 -3.180399721057058e-01 -2.646325620665817e-01 2.690000000000000e-11 2.390000000000000e-11 -1.340000000000000e-11 1.300000000000000e-11 2.460000000000000e-11 -1.730000000000000e-11 9.289999999999999e-12 2.090000000000000e-11 -9.580000000000001e-12 1.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.950000000000000e+02 5.880818982501613e-01 -6.949555299857788e-01 -3.180351904586206e-01 -2.646698130173166e-01 2.690000000000000e-11 2.390000000000000e-11 -1.340000000000000e-11 1.300000000000000e-11 2.460000000000000e-11 -1.730000000000000e-11 9.289999999999999e-12 2.090000000000000e-11 -9.580000000000001e-12 1.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.960000000000000e+02 5.880645802873361e-01 -6.949581847345780e-01 -3.180304095059376e-01 -2.647070635842289e-01 2.690000000000000e-11 2.390000000000000e-11 -1.340000000000000e-11 1.300000000000000e-11 2.460000000000000e-11 -1.730000000000000e-11 9.279999999999999e-12 2.090000000000000e-11 -9.580000000000001e-12 1.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.970000000000000e+02 5.880472600983636e-01 -6.949608385762234e-01 -3.180256294534483e-01 -2.647443139086806e-01 2.690000000000000e-11 2.390000000000000e-11 -1.340000000000000e-11 1.300000000000000e-11 2.460000000000000e-11 -1.730000000000000e-11 9.279999999999999e-12 2.090000000000000e-11 -9.580000000000001e-12 1.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.980000000000000e+02 5.880299373846022e-01 -6.949634916059197e-01 -3.180208504577000e-01 -2.647815642157340e-01 2.690000000000000e-11 2.390000000000000e-11 -1.340000000000000e-11 1.300000000000000e-11 2.460000000000000e-11 -1.730000000000000e-11 9.279999999999999e-12 2.090000000000000e-11 -9.580000000000001e-12 1.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.990000000000000e+02 5.880126119861054e-01 -6.949661438269985e-01 -3.180160725952168e-01 -2.648188147594945e-01 2.690000000000000e-11 2.390000000000000e-11 -1.340000000000000e-11 1.300000000000000e-11 2.460000000000000e-11 -1.730000000000000e-11 9.279999999999999e-12 2.090000000000000e-11 -9.580000000000001e-12 1.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.000000000000000e+02 5.879952839589644e-01 -6.949687951124411e-01 -3.180112958472531e-01 -2.648560657706930e-01 2.700000000000000e-11 2.400000000000000e-11 -1.340000000000000e-11 1.300000000000000e-11 2.470000000000000e-11 -1.720000000000000e-11 9.230000000000000e-12 2.090000000000000e-11 -9.599999999999999e-12 1.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.010000000000000e+02 5.879779536009161e-01 -6.949714451954034e-01 -3.180065201049506e-01 -2.648933174185998e-01 2.700000000000000e-11 2.400000000000000e-11 -1.340000000000000e-11 1.300000000000000e-11 2.470000000000000e-11 -1.720000000000000e-11 9.230000000000000e-12 2.090000000000000e-11 -9.599999999999999e-12 1.610000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.020000000000000e+02 5.879606630646701e-01 -6.949740644452396e-01 -3.180017224091932e-01 -2.649305814393725e-01 2.710000000000000e-11 2.410000000000000e-11 -1.350000000000000e-11 1.310000000000000e-11 2.480000000000000e-11 -1.730000000000000e-11 9.279999999999999e-12 2.080000000000000e-11 -9.500000000000000e-12 1.600000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.030000000000000e+02 5.879433296573264e-01 -6.949767109250355e-01 -3.179969481413305e-01 -2.649678345687942e-01 2.710000000000000e-11 2.410000000000000e-11 -1.350000000000000e-11 1.300000000000000e-11 2.480000000000000e-11 -1.730000000000000e-11 9.279999999999999e-12 2.080000000000000e-11 -9.500000000000000e-12 1.600000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.040000000000000e+02 5.879259956292240e-01 -6.949793549627717e-01 -3.179921743423720e-01 -2.650050884340261e-01 2.710000000000000e-11 2.410000000000000e-11 -1.350000000000000e-11 1.300000000000000e-11 2.480000000000000e-11 -1.730000000000000e-11 9.279999999999999e-12 2.080000000000000e-11 -9.500000000000000e-12 1.600000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.050000000000000e+02 5.879086614556825e-01 -6.949819962238477e-01 -3.179874008931027e-01 -2.650423430007982e-01 2.710000000000000e-11 2.410000000000000e-11 -1.350000000000000e-11 1.300000000000000e-11 2.480000000000000e-11 -1.730000000000000e-11 9.279999999999999e-12 2.080000000000000e-11 -9.510000000000000e-12 1.600000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.060000000000000e+02 5.878913274104115e-01 -6.949846345121425e-01 -3.179826277380722e-01 -2.650795982425631e-01 2.710000000000000e-11 2.410000000000000e-11 -1.350000000000000e-11 1.300000000000000e-11 2.480000000000000e-11 -1.730000000000000e-11 9.279999999999999e-12 2.080000000000000e-11 -9.510000000000000e-12 1.600000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.070000000000000e+02 5.878739935411265e-01 -6.949872697925172e-01 -3.179778548759694e-01 -2.651168541470488e-01 2.710000000000000e-11 2.410000000000000e-11 -1.350000000000000e-11 1.300000000000000e-11 2.480000000000000e-11 -1.730000000000000e-11 9.279999999999999e-12 2.080000000000000e-11 -9.500000000000000e-12 1.600000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.080000000000000e+02 5.878566596984033e-01 -6.949899021825474e-01 -3.179730823375851e-01 -2.651541107002954e-01 2.710000000000000e-11 2.410000000000000e-11 -1.350000000000000e-11 1.300000000000000e-11 2.480000000000000e-11 -1.730000000000000e-11 9.270000000000001e-12 2.080000000000000e-11 -9.500000000000000e-12 1.600000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.090000000000000e+02 5.878393255999493e-01 -6.949925319204806e-01 -3.179683101606842e-01 -2.651913678582231e-01 2.710000000000000e-11 2.410000000000000e-11 -1.350000000000000e-11 1.300000000000000e-11 2.480000000000000e-11 -1.730000000000000e-11 9.270000000000001e-12 2.080000000000000e-11 -9.500000000000000e-12 1.600000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.100000000000000e+02 5.878219909051503e-01 -6.949951593210907e-01 -3.179635383692510e-01 -2.652286255219506e-01 2.710000000000000e-11 2.410000000000000e-11 -1.350000000000000e-11 1.300000000000000e-11 2.480000000000000e-11 -1.730000000000000e-11 9.270000000000001e-12 2.090000000000000e-11 -9.500000000000000e-12 1.600000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.110000000000000e+02 5.878046552766588e-01 -6.949977847298375e-01 -3.179587669634912e-01 -2.652658835334145e-01 2.710000000000000e-11 2.410000000000000e-11 -1.350000000000000e-11 1.300000000000000e-11 2.480000000000000e-11 -1.730000000000000e-11 9.270000000000001e-12 2.090000000000000e-11 -9.500000000000000e-12 1.600000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.120000000000000e+02 5.877873133458417e-01 -6.950004120450206e-01 -3.179539986944827e-01 -2.653031402775282e-01 2.710000000000000e-11 2.410000000000000e-11 -1.350000000000000e-11 1.300000000000000e-11 2.480000000000000e-11 -1.730000000000000e-11 9.260000000000001e-12 2.090000000000000e-11 -9.500000000000000e-12 1.600000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.130000000000000e+02 5.877699750189249e-01 -6.950030344315845e-01 -3.179492279759940e-01 -2.653403984066725e-01 2.710000000000000e-11 2.410000000000000e-11 -1.350000000000000e-11 1.300000000000000e-11 2.480000000000000e-11 -1.730000000000000e-11 9.260000000000001e-12 2.090000000000000e-11 -9.500000000000000e-12 1.600000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.140000000000000e+02 5.877526350348073e-01 -6.950056556751673e-01 -3.179444575452863e-01 -2.653776563793666e-01 2.710000000000000e-11 2.420000000000000e-11 -1.350000000000000e-11 1.300000000000000e-11 2.480000000000000e-11 -1.730000000000000e-11 9.260000000000001e-12 2.090000000000000e-11 -9.500000000000000e-12 1.600000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.150000000000000e+02 5.877352932437616e-01 -6.950082759181794e-01 -3.179396873824579e-01 -2.654149141778855e-01 2.710000000000000e-11 2.420000000000000e-11 -1.350000000000000e-11 1.300000000000000e-11 2.480000000000000e-11 -1.730000000000000e-11 9.260000000000001e-12 2.090000000000000e-11 -9.500000000000000e-12 1.600000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.160000000000000e+02 5.877179495207198e-01 -6.950108952189600e-01 -3.179349175025726e-01 -2.654521719081102e-01 2.710000000000000e-11 2.420000000000000e-11 -1.350000000000000e-11 1.300000000000000e-11 2.480000000000000e-11 -1.730000000000000e-11 9.250000000000000e-12 2.090000000000000e-11 -9.489999999999999e-12 1.600000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.170000000000000e+02 5.877006037618500e-01 -6.950135135542833e-01 -3.179301479687496e-01 -2.654894297847961e-01 2.720000000000000e-11 2.420000000000000e-11 -1.350000000000000e-11 1.310000000000000e-11 2.480000000000000e-11 -1.740000000000000e-11 9.300000000000000e-12 2.100000000000000e-11 -9.599999999999999e-12 1.600000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.180000000000000e+02 5.876832558939851e-01 -6.950161308252751e-01 -3.179253788958586e-01 -2.655266880907334e-01 2.720000000000000e-11 2.420000000000000e-11 -1.350000000000000e-11 1.310000000000000e-11 2.480000000000000e-11 -1.740000000000000e-11 9.300000000000000e-12 2.100000000000000e-11 -9.599999999999999e-12 1.600000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.190000000000000e+02 5.876659058921084e-01 -6.950187468682493e-01 -3.179206104400271e-01 -2.655639471222265e-01 2.720000000000000e-11 2.420000000000000e-11 -1.350000000000000e-11 1.310000000000000e-11 2.480000000000000e-11 -1.740000000000000e-11 9.289999999999999e-12 2.100000000000000e-11 -9.589999999999999e-12 1.600000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.200000000000000e+02 5.876485537965235e-01 -6.950213614720170e-01 -3.179158427739692e-01 -2.656012071353507e-01 2.730000000000000e-11 2.430000000000000e-11 -1.350000000000000e-11 1.300000000000000e-11 2.490000000000000e-11 -1.730000000000000e-11 9.250000000000000e-12 2.100000000000000e-11 -9.620000000000000e-12 1.600000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.210000000000000e+02 5.876311997230000e-01 -6.950239744037523e-01 -3.179110760464117e-01 -2.656384683044471e-01 2.730000000000000e-11 2.430000000000000e-11 -1.350000000000000e-11 1.300000000000000e-11 2.490000000000000e-11 -1.730000000000000e-11 9.250000000000000e-12 2.100000000000000e-11 -9.620000000000000e-12 1.600000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.220000000000000e+02 5.876138909449281e-01 -6.950265523658973e-01 -3.179062845990487e-01 -2.656757438822100e-01 2.740000000000000e-11 2.440000000000000e-11 -1.360000000000000e-11 1.310000000000000e-11 2.500000000000000e-11 -1.740000000000000e-11 9.310000000000000e-12 2.090000000000000e-11 -9.530000000000000e-12 1.600000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.230000000000000e+02 5.875965335457058e-01 -6.950291613366745e-01 -3.179015198603029e-01 -2.657130074482968e-01 2.740000000000000e-11 2.440000000000000e-11 -1.360000000000000e-11 1.310000000000000e-11 2.500000000000000e-11 -1.740000000000000e-11 9.300000000000000e-12 2.090000000000000e-11 -9.530000000000000e-12 1.590000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.240000000000000e+02 5.875791748999094e-01 -6.950317681418330e-01 -3.178967559025686e-01 -2.657502720303440e-01 2.740000000000000e-11 2.440000000000000e-11 -1.360000000000000e-11 1.310000000000000e-11 2.500000000000000e-11 -1.740000000000000e-11 9.300000000000000e-12 2.090000000000000e-11 -9.530000000000000e-12 1.590000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.250000000000000e+02 5.875618153192986e-01 -6.950343727746088e-01 -3.178919923767287e-01 -2.657875373738401e-01 2.740000000000000e-11 2.440000000000000e-11 -1.360000000000000e-11 1.310000000000000e-11 2.500000000000000e-11 -1.740000000000000e-11 9.300000000000000e-12 2.090000000000000e-11 -9.520000000000000e-12 1.590000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.260000000000000e+02 5.875444551155058e-01 -6.950369753099488e-01 -3.178872288058295e-01 -2.658248031639850e-01 2.740000000000000e-11 2.440000000000000e-11 -1.360000000000000e-11 1.310000000000000e-11 2.500000000000000e-11 -1.740000000000000e-11 9.300000000000000e-12 2.090000000000000e-11 -9.520000000000000e-12 1.590000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.270000000000000e+02 5.875270945793766e-01 -6.950395758752691e-01 -3.178824646493578e-01 -2.658620690709610e-01 2.740000000000000e-11 2.440000000000000e-11 -1.360000000000000e-11 1.310000000000000e-11 2.500000000000000e-11 -1.740000000000000e-11 9.289999999999999e-12 2.090000000000000e-11 -9.520000000000000e-12 1.590000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.280000000000000e+02 5.875097339587407e-01 -6.950421746086340e-01 -3.178776993923615e-01 -2.658993348018197e-01 2.740000000000000e-11 2.440000000000000e-11 -1.360000000000000e-11 1.310000000000000e-11 2.500000000000000e-11 -1.740000000000000e-11 9.289999999999999e-12 2.090000000000000e-11 -9.520000000000000e-12 1.590000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.290000000000000e+02 5.874923734325125e-01 -6.950447716185011e-01 -3.178729326395213e-01 -2.659366001504294e-01 2.740000000000000e-11 2.440000000000000e-11 -1.360000000000000e-11 1.310000000000000e-11 2.500000000000000e-11 -1.740000000000000e-11 9.289999999999999e-12 2.090000000000000e-11 -9.520000000000000e-12 1.590000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.300000000000000e+02 5.874750130821288e-01 -6.950473669583371e-01 -3.178681641905603e-01 -2.659738650366955e-01 2.740000000000000e-11 2.440000000000000e-11 -1.360000000000000e-11 1.300000000000000e-11 2.500000000000000e-11 -1.740000000000000e-11 9.289999999999999e-12 2.090000000000000e-11 -9.520000000000000e-12 1.590000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.310000000000000e+02 5.874576528653014e-01 -6.950499606227531e-01 -3.178633940772710e-01 -2.660111295302847e-01 2.740000000000000e-11 2.440000000000000e-11 -1.360000000000000e-11 1.300000000000000e-11 2.500000000000000e-11 -1.740000000000000e-11 9.279999999999999e-12 2.090000000000000e-11 -9.520000000000000e-12 1.590000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.320000000000000e+02 5.874402923852159e-01 -6.950525527169167e-01 -3.178586226697234e-01 -2.660483937906339e-01 2.740000000000000e-11 2.440000000000000e-11 -1.360000000000000e-11 1.300000000000000e-11 2.500000000000000e-11 -1.740000000000000e-11 9.279999999999999e-12 2.090000000000000e-11 -9.520000000000000e-12 1.590000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.330000000000000e+02 5.874229317398661e-01 -6.950551428900594e-01 -3.178538501591616e-01 -2.660856582892380e-01 2.740000000000000e-11 2.440000000000000e-11 -1.360000000000000e-11 1.300000000000000e-11 2.500000000000000e-11 -1.740000000000000e-11 9.279999999999999e-12 2.090000000000000e-11 -9.520000000000000e-12 1.590000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.340000000000000e+02 5.874055702623016e-01 -6.950577312677021e-01 -3.178490771766248e-01 -2.661229234165732e-01 2.740000000000000e-11 2.440000000000000e-11 -1.360000000000000e-11 1.300000000000000e-11 2.500000000000000e-11 -1.740000000000000e-11 9.279999999999999e-12 2.090000000000000e-11 -9.520000000000000e-12 1.590000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.350000000000000e+02 5.873882074174798e-01 -6.950603178788433e-01 -3.178443042339090e-01 -2.661601896661175e-01 2.740000000000000e-11 2.440000000000000e-11 -1.360000000000000e-11 1.300000000000000e-11 2.500000000000000e-11 -1.740000000000000e-11 9.270000000000001e-12 2.090000000000000e-11 -9.510000000000000e-12 1.590000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.360000000000000e+02 5.873708426559063e-01 -6.950629028087122e-01 -3.178395317557940e-01 -2.661974575199300e-01 2.740000000000000e-11 2.440000000000000e-11 -1.360000000000000e-11 1.300000000000000e-11 2.500000000000000e-11 -1.740000000000000e-11 9.270000000000001e-12 2.090000000000000e-11 -9.510000000000000e-12 1.590000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.370000000000000e+02 5.873534755000190e-01 -6.950654861779432e-01 -3.178347600131700e-01 -2.662347273922744e-01 2.740000000000000e-11 2.440000000000000e-11 -1.360000000000000e-11 1.300000000000000e-11 2.500000000000000e-11 -1.740000000000000e-11 9.270000000000001e-12 2.090000000000000e-11 -9.510000000000000e-12 1.590000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.380000000000000e+02 5.873361056340924e-01 -6.950680681042352e-01 -3.178299890832726e-01 -2.662719995789108e-01 2.740000000000000e-11 2.440000000000000e-11 -1.360000000000000e-11 1.300000000000000e-11 2.500000000000000e-11 -1.740000000000000e-11 9.270000000000001e-12 2.090000000000000e-11 -9.510000000000000e-12 1.590000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.390000000000000e+02 5.873187329748918e-01 -6.950706486603880e-01 -3.178252188403056e-01 -2.663092742221100e-01 2.740000000000000e-11 2.440000000000000e-11 -1.360000000000000e-11 1.300000000000000e-11 2.500000000000000e-11 -1.740000000000000e-11 9.270000000000001e-12 2.090000000000000e-11 -9.510000000000000e-12 1.590000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.400000000000000e+02 5.873013576991700e-01 -6.950732278427990e-01 -3.178204489787553e-01 -2.663465513045863e-01 2.740000000000000e-11 2.440000000000000e-11 -1.360000000000000e-11 1.300000000000000e-11 2.500000000000000e-11 -1.740000000000000e-11 9.260000000000001e-12 2.090000000000000e-11 -9.510000000000000e-12 1.590000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.410000000000000e+02 5.872839802125299e-01 -6.950758055608205e-01 -3.178156790679983e-01 -2.663838306809415e-01 2.740000000000000e-11 2.440000000000000e-11 -1.360000000000000e-11 1.300000000000000e-11 2.500000000000000e-11 -1.740000000000000e-11 9.260000000000001e-12 2.090000000000000e-11 -9.510000000000000e-12 1.590000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.420000000000000e+02 5.872666241226706e-01 -6.950783654441578e-01 -3.178108960359582e-01 -2.664211186146118e-01 2.750000000000000e-11 2.450000000000000e-11 -1.360000000000000e-11 1.300000000000000e-11 2.510000000000000e-11 -1.740000000000000e-11 9.210000000000000e-12 2.100000000000000e-11 -9.530000000000000e-12 1.590000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.430000000000000e+02 5.872492438565683e-01 -6.950809397077689e-01 -3.178061246341826e-01 -2.664584019877330e-01 2.750000000000000e-11 2.450000000000000e-11 -1.360000000000000e-11 1.300000000000000e-11 2.510000000000000e-11 -1.740000000000000e-11 9.210000000000000e-12 2.100000000000000e-11 -9.530000000000000e-12 1.590000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.440000000000000e+02 5.872318629032612e-01 -6.950835119546510e-01 -3.178013519515749e-01 -2.664956872028239e-01 2.750000000000000e-11 2.450000000000000e-11 -1.360000000000000e-11 1.300000000000000e-11 2.510000000000000e-11 -1.740000000000000e-11 9.210000000000000e-12 2.100000000000000e-11 -9.530000000000000e-12 1.590000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.450000000000000e+02 5.872144814627993e-01 -6.950860820435831e-01 -3.177965778451486e-01 -2.665329743570003e-01 2.760000000000000e-11 2.460000000000000e-11 -1.370000000000000e-11 1.300000000000000e-11 2.520000000000000e-11 -1.750000000000000e-11 9.260000000000001e-12 2.090000000000000e-11 -9.430000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.460000000000000e+02 5.871970994729333e-01 -6.950886499034225e-01 -3.177918023609356e-01 -2.665702637170916e-01 2.760000000000000e-11 2.460000000000000e-11 -1.370000000000000e-11 1.300000000000000e-11 2.520000000000000e-11 -1.750000000000000e-11 9.260000000000001e-12 2.090000000000000e-11 -9.430000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.470000000000000e+02 5.871797166448167e-01 -6.950912155338735e-01 -3.177870257092981e-01 -2.666075556682385e-01 2.760000000000000e-11 2.460000000000000e-11 -1.370000000000000e-11 1.300000000000000e-11 2.520000000000000e-11 -1.750000000000000e-11 9.260000000000001e-12 2.090000000000000e-11 -9.430000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.480000000000000e+02 5.871623325560366e-01 -6.950937789908480e-01 -3.177822482091274e-01 -2.666448506135625e-01 2.760000000000000e-11 2.460000000000000e-11 -1.370000000000000e-11 1.300000000000000e-11 2.520000000000000e-11 -1.750000000000000e-11 9.260000000000001e-12 2.090000000000000e-11 -9.430000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.490000000000000e+02 5.871449467691510e-01 -6.950963403633866e-01 -3.177774702172825e-01 -2.666821488573654e-01 2.760000000000000e-11 2.460000000000000e-11 -1.370000000000000e-11 1.300000000000000e-11 2.520000000000000e-11 -1.750000000000000e-11 9.260000000000001e-12 2.090000000000000e-11 -9.430000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.500000000000000e+02 5.871275589390302e-01 -6.950988997498267e-01 -3.177726920638705e-01 -2.667194505081261e-01 2.760000000000000e-11 2.460000000000000e-11 -1.370000000000000e-11 1.300000000000000e-11 2.520000000000000e-11 -1.750000000000000e-11 9.250000000000000e-12 2.090000000000000e-11 -9.420000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.510000000000000e+02 5.871101688762794e-01 -6.951014572403337e-01 -3.177679140084063e-01 -2.667567554368162e-01 2.760000000000000e-11 2.460000000000000e-11 -1.370000000000000e-11 1.300000000000000e-11 2.520000000000000e-11 -1.750000000000000e-11 9.250000000000000e-12 2.090000000000000e-11 -9.420000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.520000000000000e+02 5.870927755166525e-01 -6.951040136367778e-01 -3.177631367901908e-01 -2.667940630138804e-01 2.760000000000000e-11 2.460000000000000e-11 -1.370000000000000e-11 1.300000000000000e-11 2.520000000000000e-11 -1.750000000000000e-11 9.250000000000000e-12 2.090000000000000e-11 -9.420000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.530000000000000e+02 5.870753810108268e-01 -6.951065675440066e-01 -3.177583593854063e-01 -2.668313733594254e-01 2.760000000000000e-11 2.460000000000000e-11 -1.370000000000000e-11 1.300000000000000e-11 2.520000000000000e-11 -1.750000000000000e-11 9.250000000000000e-12 2.090000000000000e-11 -9.420000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.540000000000000e+02 5.870579844437934e-01 -6.951091197362769e-01 -3.177535824241380e-01 -2.668686857180433e-01 2.760000000000000e-11 2.460000000000000e-11 -1.370000000000000e-11 1.300000000000000e-11 2.520000000000000e-11 -1.750000000000000e-11 9.250000000000000e-12 2.090000000000000e-11 -9.420000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.550000000000000e+02 5.870405858992074e-01 -6.951116702603918e-01 -3.177488059578897e-01 -2.669059997213608e-01 2.760000000000000e-11 2.460000000000000e-11 -1.370000000000000e-11 1.300000000000000e-11 2.520000000000000e-11 -1.750000000000000e-11 9.240000000000000e-12 2.090000000000000e-11 -9.420000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.560000000000000e+02 5.870231853796027e-01 -6.951142191652044e-01 -3.177440300410564e-01 -2.669433151708449e-01 2.760000000000000e-11 2.460000000000000e-11 -1.370000000000000e-11 1.300000000000000e-11 2.520000000000000e-11 -1.750000000000000e-11 9.240000000000000e-12 2.090000000000000e-11 -9.420000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.570000000000000e+02 5.870057828089180e-01 -6.951167664950982e-01 -3.177392547269935e-01 -2.669806320537564e-01 2.760000000000000e-11 2.460000000000000e-11 -1.370000000000000e-11 1.300000000000000e-11 2.520000000000000e-11 -1.750000000000000e-11 9.240000000000000e-12 2.090000000000000e-11 -9.420000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.580000000000000e+02 5.869883780860840e-01 -6.951193122682291e-01 -3.177344800454723e-01 -2.670179505086620e-01 2.760000000000000e-11 2.460000000000000e-11 -1.370000000000000e-11 1.300000000000000e-11 2.520000000000000e-11 -1.750000000000000e-11 9.230000000000000e-12 2.090000000000000e-11 -9.420000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.590000000000000e+02 5.869709711684574e-01 -6.951218564469129e-01 -3.177297059714993e-01 -2.670552707561114e-01 2.760000000000000e-11 2.460000000000000e-11 -1.370000000000000e-11 1.300000000000000e-11 2.520000000000000e-11 -1.750000000000000e-11 9.230000000000000e-12 2.090000000000000e-11 -9.410000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.600000000000000e+02 5.869535621526131e-01 -6.951243989117891e-01 -3.177249323983031e-01 -2.670925930204285e-01 2.770000000000000e-11 2.470000000000000e-11 -1.370000000000000e-11 1.300000000000000e-11 2.530000000000000e-11 -1.750000000000000e-11 9.179999999999999e-12 2.090000000000000e-11 -9.430000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.610000000000000e+02 5.869361513198960e-01 -6.951269394511921e-01 -3.177201591288774e-01 -2.671299174673777e-01 2.770000000000000e-11 2.470000000000000e-11 -1.370000000000000e-11 1.300000000000000e-11 2.530000000000000e-11 -1.750000000000000e-11 9.179999999999999e-12 2.090000000000000e-11 -9.430000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.620000000000000e+02 5.869187867807525e-01 -6.951294442753391e-01 -3.177153598952387e-01 -2.671672575595799e-01 2.770000000000000e-11 2.470000000000000e-11 -1.370000000000000e-11 1.300000000000000e-11 2.530000000000000e-11 -1.750000000000000e-11 9.170000000000001e-12 2.090000000000000e-11 -9.420000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.630000000000000e+02 5.869013737950214e-01 -6.951319800561934e-01 -3.177105863872959e-01 -2.672045864840520e-01 2.770000000000000e-11 2.470000000000000e-11 -1.370000000000000e-11 1.300000000000000e-11 2.530000000000000e-11 -1.750000000000000e-11 9.170000000000001e-12 2.090000000000000e-11 -9.420000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.640000000000000e+02 5.868839605901154e-01 -6.951345129873079e-01 -3.177058123139796e-01 -2.672419175164567e-01 2.770000000000000e-11 2.470000000000000e-11 -1.370000000000000e-11 1.300000000000000e-11 2.530000000000000e-11 -1.750000000000000e-11 9.170000000000001e-12 2.090000000000000e-11 -9.420000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.650000000000000e+02 5.868665476336227e-01 -6.951370428450682e-01 -3.177010374464457e-01 -2.672792504828218e-01 2.780000000000000e-11 2.480000000000000e-11 -1.380000000000000e-11 1.300000000000000e-11 2.540000000000000e-11 -1.760000000000000e-11 9.220000000000000e-12 2.080000000000000e-11 -9.320000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.660000000000000e+02 5.868491351901779e-01 -6.951395695398537e-01 -3.176962616576819e-01 -2.673165851854707e-01 2.780000000000000e-11 2.480000000000000e-11 -1.380000000000000e-11 1.300000000000000e-11 2.540000000000000e-11 -1.760000000000000e-11 9.220000000000000e-12 2.080000000000000e-11 -9.320000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.670000000000000e+02 5.868317232596179e-01 -6.951420931443648e-01 -3.176914849465883e-01 -2.673539214364552e-01 2.780000000000000e-11 2.480000000000000e-11 -1.380000000000000e-11 1.300000000000000e-11 2.540000000000000e-11 -1.760000000000000e-11 9.220000000000000e-12 2.080000000000000e-11 -9.320000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.680000000000000e+02 5.868143115573040e-01 -6.951446138978723e-01 -3.176867074449010e-01 -2.673912590813756e-01 2.780000000000000e-11 2.480000000000000e-11 -1.380000000000000e-11 1.300000000000000e-11 2.540000000000000e-11 -1.760000000000000e-11 9.220000000000000e-12 2.080000000000000e-11 -9.320000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.690000000000000e+02 5.867968995364318e-01 -6.951471321863054e-01 -3.176819294074077e-01 -2.674285980136997e-01 2.780000000000000e-11 2.480000000000000e-11 -1.380000000000000e-11 1.300000000000000e-11 2.540000000000000e-11 -1.760000000000000e-11 9.220000000000000e-12 2.080000000000000e-11 -9.320000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.700000000000000e+02 5.867794864474135e-01 -6.951496485019975e-01 -3.176771511864957e-01 -2.674659381792224e-01 2.780000000000000e-11 2.480000000000000e-11 -1.380000000000000e-11 1.300000000000000e-11 2.540000000000000e-11 -1.760000000000000e-11 9.210000000000000e-12 2.080000000000000e-11 -9.320000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.710000000000000e+02 5.867620714272890e-01 -6.951521633890155e-01 -3.176723731921683e-01 -2.675032795693996e-01 2.780000000000000e-11 2.480000000000000e-11 -1.380000000000000e-11 1.300000000000000e-11 2.540000000000000e-11 -1.760000000000000e-11 9.210000000000000e-12 2.080000000000000e-11 -9.320000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.720000000000000e+02 5.867446611246515e-01 -6.951546720955358e-01 -3.176675917420238e-01 -2.675406243214082e-01 2.790000000000000e-11 2.480000000000000e-11 -1.380000000000000e-11 1.310000000000000e-11 2.540000000000000e-11 -1.760000000000000e-11 9.250000000000000e-12 2.100000000000000e-11 -9.420000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.730000000000000e+02 5.867272397386643e-01 -6.951571856551073e-01 -3.176628154028994e-01 -2.675779682466817e-01 2.790000000000000e-11 2.480000000000000e-11 -1.380000000000000e-11 1.310000000000000e-11 2.540000000000000e-11 -1.760000000000000e-11 9.250000000000000e-12 2.100000000000000e-11 -9.420000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.740000000000000e+02 5.867098142196144e-01 -6.951596991195140e-01 -3.176580403438659e-01 -2.676153135068081e-01 2.790000000000000e-11 2.480000000000000e-11 -1.380000000000000e-11 1.310000000000000e-11 2.540000000000000e-11 -1.760000000000000e-11 9.250000000000000e-12 2.100000000000000e-11 -9.420000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.750000000000000e+02 5.866923842595693e-01 -6.951622126737922e-01 -3.176532666925566e-01 -2.676526601434159e-01 2.790000000000000e-11 2.480000000000000e-11 -1.380000000000000e-11 1.310000000000000e-11 2.540000000000000e-11 -1.760000000000000e-11 9.250000000000000e-12 2.100000000000000e-11 -9.420000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.760000000000000e+02 5.866749498169868e-01 -6.951647263488984e-01 -3.176484944237309e-01 -2.676900081957384e-01 2.790000000000000e-11 2.480000000000000e-11 -1.380000000000000e-11 1.310000000000000e-11 2.540000000000000e-11 -1.760000000000000e-11 9.240000000000000e-12 2.100000000000000e-11 -9.410000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.770000000000000e+02 5.866575110726610e-01 -6.951672400495676e-01 -3.176437233734483e-01 -2.677273577080792e-01 2.800000000000000e-11 2.490000000000000e-11 -1.380000000000000e-11 1.300000000000000e-11 2.550000000000000e-11 -1.760000000000000e-11 9.200000000000000e-12 2.100000000000000e-11 -9.430000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.780000000000000e+02 5.866400683499513e-01 -6.951697536005664e-01 -3.176389532769495e-01 -2.677647087396250e-01 2.800000000000000e-11 2.490000000000000e-11 -1.380000000000000e-11 1.300000000000000e-11 2.550000000000000e-11 -1.760000000000000e-11 9.189999999999999e-12 2.100000000000000e-11 -9.430000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.790000000000000e+02 5.866226220227498e-01 -6.951722667971002e-01 -3.176341838238451e-01 -2.678020613697649e-01 2.800000000000000e-11 2.490000000000000e-11 -1.380000000000000e-11 1.300000000000000e-11 2.550000000000000e-11 -1.760000000000000e-11 9.189999999999999e-12 2.100000000000000e-11 -9.430000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.800000000000000e+02 5.866051724382451e-01 -6.951747794443727e-01 -3.176294147174676e-01 -2.678394156941872e-01 2.800000000000000e-11 2.490000000000000e-11 -1.380000000000000e-11 1.300000000000000e-11 2.550000000000000e-11 -1.760000000000000e-11 9.179999999999999e-12 2.100000000000000e-11 -9.420000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.810000000000000e+02 5.865877198697079e-01 -6.951772913785852e-01 -3.176246457286122e-01 -2.678767718100333e-01 2.800000000000000e-11 2.490000000000000e-11 -1.380000000000000e-11 1.300000000000000e-11 2.550000000000000e-11 -1.760000000000000e-11 9.179999999999999e-12 2.100000000000000e-11 -9.420000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.820000000000000e+02 5.865702915953132e-01 -6.951797834181532e-01 -3.176198619731151e-01 -2.679141374109590e-01 2.800000000000000e-11 2.490000000000000e-11 -1.380000000000000e-11 1.300000000000000e-11 2.550000000000000e-11 -1.760000000000000e-11 9.179999999999999e-12 2.100000000000000e-11 -9.420000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.830000000000000e+02 5.865528335774208e-01 -6.951822935359712e-01 -3.176150929898333e-01 -2.679514972554268e-01 2.800000000000000e-11 2.490000000000000e-11 -1.380000000000000e-11 1.300000000000000e-11 2.550000000000000e-11 -1.760000000000000e-11 9.179999999999999e-12 2.100000000000000e-11 -9.420000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.840000000000000e+02 5.865353730257773e-01 -6.951848025485315e-01 -3.176103241590456e-01 -2.679888588778601e-01 2.800000000000000e-11 2.490000000000000e-11 -1.380000000000000e-11 1.300000000000000e-11 2.550000000000000e-11 -1.760000000000000e-11 9.170000000000001e-12 2.100000000000000e-11 -9.420000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.850000000000000e+02 5.865179100956148e-01 -6.951873102950598e-01 -3.176055557290150e-01 -2.680262220601862e-01 2.800000000000000e-11 2.490000000000000e-11 -1.380000000000000e-11 1.300000000000000e-11 2.550000000000000e-11 -1.760000000000000e-11 9.170000000000001e-12 2.100000000000000e-11 -9.420000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.860000000000000e+02 5.865004449952715e-01 -6.951898165950547e-01 -3.176007880003015e-01 -2.680635864575237e-01 2.800000000000000e-11 2.490000000000000e-11 -1.380000000000000e-11 1.300000000000000e-11 2.550000000000000e-11 -1.760000000000000e-11 9.170000000000001e-12 2.100000000000000e-11 -9.410000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.870000000000000e+02 5.864829779762812e-01 -6.951923212771586e-01 -3.175960212573547e-01 -2.681009516261491e-01 2.800000000000000e-11 2.490000000000000e-11 -1.380000000000000e-11 1.300000000000000e-11 2.550000000000000e-11 -1.760000000000000e-11 9.170000000000001e-12 2.100000000000000e-11 -9.410000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.880000000000000e+02 5.864655092945393e-01 -6.951948242247349e-01 -3.175912556977663e-01 -2.681383170741410e-01 2.800000000000000e-11 2.490000000000000e-11 -1.380000000000000e-11 1.300000000000000e-11 2.550000000000000e-11 -1.760000000000000e-11 9.160000000000001e-12 2.100000000000000e-11 -9.410000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.890000000000000e+02 5.864480391551858e-01 -6.951973254242699e-01 -3.175864913744524e-01 -2.681756823249348e-01 2.800000000000000e-11 2.490000000000000e-11 -1.380000000000000e-11 1.300000000000000e-11 2.550000000000000e-11 -1.760000000000000e-11 9.160000000000001e-12 2.100000000000000e-11 -9.410000000000000e-12 1.580000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.900000000000000e+02 5.864305676589907e-01 -6.951998249974500e-01 -3.175817281699456e-01 -2.682130469817971e-01 2.810000000000000e-11 2.500000000000000e-11 -1.390000000000000e-11 1.310000000000000e-11 2.560000000000000e-11 -1.770000000000000e-11 9.220000000000000e-12 2.090000000000000e-11 -9.320000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.910000000000000e+02 5.864130947655712e-01 -6.952023232012958e-01 -3.175769658166143e-01 -2.682504107838410e-01 2.810000000000000e-11 2.500000000000000e-11 -1.390000000000000e-11 1.310000000000000e-11 2.560000000000000e-11 -1.770000000000000e-11 9.220000000000000e-12 2.090000000000000e-11 -9.310000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.920000000000000e+02 5.863956260718777e-01 -6.952048163207856e-01 -3.175722008109748e-01 -2.682877752716800e-01 2.810000000000000e-11 2.500000000000000e-11 -1.390000000000000e-11 1.310000000000000e-11 2.560000000000000e-11 -1.770000000000000e-11 9.210000000000000e-12 2.090000000000000e-11 -9.300000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.930000000000000e+02 5.863781496913424e-01 -6.952073128761582e-01 -3.175674391203923e-01 -2.683251372842003e-01 2.810000000000000e-11 2.500000000000000e-11 -1.390000000000000e-11 1.310000000000000e-11 2.560000000000000e-11 -1.770000000000000e-11 9.210000000000000e-12 2.090000000000000e-11 -9.300000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.940000000000000e+02 5.863606710206287e-01 -6.952098091220050e-01 -3.175626773672606e-01 -2.683624987290895e-01 2.810000000000000e-11 2.500000000000000e-11 -1.390000000000000e-11 1.310000000000000e-11 2.560000000000000e-11 -1.770000000000000e-11 9.210000000000000e-12 2.090000000000000e-11 -9.300000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.950000000000000e+02 5.863431896565763e-01 -6.952123052507850e-01 -3.175579155113822e-01 -2.683998600359310e-01 2.820000000000000e-11 2.510000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.570000000000000e-11 -1.770000000000000e-11 9.160000000000001e-12 2.100000000000000e-11 -9.320000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.960000000000000e+02 5.863257052398329e-01 -6.952148012799562e-01 -3.175531537222354e-01 -2.684372217434572e-01 2.820000000000000e-11 2.510000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.570000000000000e-11 -1.770000000000000e-11 9.150000000000000e-12 2.100000000000000e-11 -9.320000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.970000000000000e+02 5.863082174973093e-01 -6.952172970512899e-01 -3.175483923494231e-01 -2.684745844435248e-01 2.820000000000000e-11 2.510000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.570000000000000e-11 -1.770000000000000e-11 9.150000000000000e-12 2.100000000000000e-11 -9.320000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.980000000000000e+02 5.862907262671981e-01 -6.952197922682785e-01 -3.175436318466187e-01 -2.685119487195913e-01 2.820000000000000e-11 2.510000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.570000000000000e-11 -1.770000000000000e-11 9.150000000000000e-12 2.100000000000000e-11 -9.320000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.990000000000000e+02 5.862732315044108e-01 -6.952222865592735e-01 -3.175388726717793e-01 -2.685493150894387e-01 2.820000000000000e-11 2.510000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.570000000000000e-11 -1.770000000000000e-11 9.150000000000000e-12 2.100000000000000e-11 -9.320000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.000000000000000e+02 5.862557332676986e-01 -6.952247795513603e-01 -3.175341151880539e-01 -2.685866839593044e-01 2.820000000000000e-11 2.510000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.570000000000000e-11 -1.770000000000000e-11 9.140000000000000e-12 2.100000000000000e-11 -9.310000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.010000000000000e+02 5.862382316920366e-01 -6.952272709379806e-01 -3.175293595896643e-01 -2.686240555968497e-01 2.820000000000000e-11 2.510000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.570000000000000e-11 -1.770000000000000e-11 9.140000000000000e-12 2.100000000000000e-11 -9.300000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.020000000000000e+02 5.862207532079811e-01 -6.952297420581097e-01 -3.175245915695942e-01 -2.686614375280610e-01 2.820000000000000e-11 2.510000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.570000000000000e-11 -1.770000000000000e-11 9.130000000000000e-12 2.100000000000000e-11 -9.300000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.030000000000000e+02 5.862032454728993e-01 -6.952322298044825e-01 -3.175198395199714e-01 -2.686988149384708e-01 2.820000000000000e-11 2.510000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.570000000000000e-11 -1.770000000000000e-11 9.130000000000000e-12 2.100000000000000e-11 -9.300000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.040000000000000e+02 5.861857348828309e-01 -6.952347157949949e-01 -3.175150887831609e-01 -2.687361951214418e-01 2.820000000000000e-11 2.510000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.570000000000000e-11 -1.770000000000000e-11 9.130000000000000e-12 2.100000000000000e-11 -9.300000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.050000000000000e+02 5.861682215291913e-01 -6.952372002316747e-01 -3.175103389006207e-01 -2.687735778951129e-01 2.820000000000000e-11 2.510000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.570000000000000e-11 -1.770000000000000e-11 9.120000000000000e-12 2.100000000000000e-11 -9.289999999999999e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.060000000000000e+02 5.861507054539878e-01 -6.952396833814493e-01 -3.175055893825497e-01 -2.688109630545123e-01 2.820000000000000e-11 2.510000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.570000000000000e-11 -1.770000000000000e-11 9.120000000000000e-12 2.100000000000000e-11 -9.289999999999999e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.070000000000000e+02 5.861331866585314e-01 -6.952421655172295e-01 -3.175008397761618e-01 -2.688483504242874e-01 2.820000000000000e-11 2.510000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.570000000000000e-11 -1.770000000000000e-11 9.110000000000000e-12 2.100000000000000e-11 -9.289999999999999e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.080000000000000e+02 5.861156651119892e-01 -6.952446468632852e-01 -3.174960897240426e-01 -2.688857399123634e-01 2.820000000000000e-11 2.510000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.570000000000000e-11 -1.770000000000000e-11 9.110000000000000e-12 2.100000000000000e-11 -9.289999999999999e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.090000000000000e+02 5.860981407548821e-01 -6.952471275577010e-01 -3.174913390033984e-01 -2.689231315529875e-01 2.820000000000000e-11 2.510000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.570000000000000e-11 -1.770000000000000e-11 9.110000000000000e-12 2.100000000000000e-11 -9.289999999999999e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.100000000000000e+02 5.860806134970684e-01 -6.952496076389161e-01 -3.174865875402547e-01 -2.689605255290772e-01 2.830000000000000e-11 2.520000000000000e-11 -1.380000000000000e-11 1.290000000000000e-11 2.580000000000000e-11 -1.770000000000000e-11 9.060000000000001e-12 2.100000000000000e-11 -9.300000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.110000000000000e+02 5.860630832111199e-01 -6.952520870576340e-01 -3.174818353984232e-01 -2.689979221687941e-01 2.830000000000000e-11 2.520000000000000e-11 -1.380000000000000e-11 1.290000000000000e-11 2.580000000000000e-11 -1.770000000000000e-11 9.060000000000001e-12 2.100000000000000e-11 -9.300000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.120000000000000e+02 5.860455526278586e-01 -6.952545636684537e-01 -3.174770811687704e-01 -2.690353227289192e-01 2.840000000000000e-11 2.520000000000000e-11 -1.380000000000000e-11 1.290000000000000e-11 2.580000000000000e-11 -1.770000000000000e-11 9.050000000000000e-12 2.100000000000000e-11 -9.289999999999999e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.130000000000000e+02 5.860280157419054e-01 -6.952570414292534e-01 -3.174723282366854e-01 -2.690727260660675e-01 2.840000000000000e-11 2.520000000000000e-11 -1.380000000000000e-11 1.290000000000000e-11 2.580000000000000e-11 -1.770000000000000e-11 9.050000000000000e-12 2.100000000000000e-11 -9.289999999999999e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.140000000000000e+02 5.860104752233183e-01 -6.952595181986952e-01 -3.174675752640515e-01 -2.691101334744250e-01 2.840000000000000e-11 2.520000000000000e-11 -1.380000000000000e-11 1.290000000000000e-11 2.580000000000000e-11 -1.770000000000000e-11 9.050000000000000e-12 2.100000000000000e-11 -9.289999999999999e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.150000000000000e+02 5.859929308441728e-01 -6.952619939189821e-01 -3.174628224650206e-01 -2.691475453445576e-01 2.840000000000000e-11 2.530000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.590000000000000e-11 -1.770000000000000e-11 9.100000000000000e-12 2.090000000000000e-11 -9.189999999999999e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.160000000000000e+02 5.859753824049120e-01 -6.952644685784900e-01 -3.174580700122047e-01 -2.691849619347510e-01 2.840000000000000e-11 2.530000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.590000000000000e-11 -1.770000000000000e-11 9.100000000000000e-12 2.090000000000000e-11 -9.189999999999999e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.170000000000000e+02 5.859578297601089e-01 -6.952669421941766e-01 -3.174533180428444e-01 -2.692223833531892e-01 2.840000000000000e-11 2.530000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.590000000000000e-11 -1.770000000000000e-11 9.100000000000000e-12 2.090000000000000e-11 -9.189999999999999e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.180000000000000e+02 5.859402728408525e-01 -6.952694147789898e-01 -3.174485666821319e-01 -2.692598095660187e-01 2.840000000000000e-11 2.530000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.590000000000000e-11 -1.770000000000000e-11 9.100000000000000e-12 2.090000000000000e-11 -9.189999999999999e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.190000000000000e+02 5.859227116709622e-01 -6.952718863063096e-01 -3.174438160709173e-01 -2.692972404213353e-01 2.840000000000000e-11 2.530000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.590000000000000e-11 -1.770000000000000e-11 9.089999999999999e-12 2.090000000000000e-11 -9.189999999999999e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.200000000000000e+02 5.859051463728423e-01 -6.952743566834101e-01 -3.174390663870568e-01 -2.693346756799100e-01 2.850000000000000e-11 2.530000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.590000000000000e-11 -1.780000000000000e-11 9.089999999999999e-12 2.100000000000000e-11 -9.179999999999999e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.210000000000000e+02 5.858875771598755e-01 -6.952768257452879e-01 -3.174343178483161e-01 -2.693721150443412e-01 2.850000000000000e-11 2.530000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.590000000000000e-11 -1.780000000000000e-11 9.079999999999999e-12 2.100000000000000e-11 -9.179999999999999e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.220000000000000e+02 5.858700442965538e-01 -6.952792651375006e-01 -3.174295489442543e-01 -2.694095694715736e-01 2.850000000000000e-11 2.530000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.590000000000000e-11 -1.780000000000000e-11 9.079999999999999e-12 2.100000000000000e-11 -9.179999999999999e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.230000000000000e+02 5.858524681343797e-01 -6.952817309011466e-01 -3.174248034073474e-01 -2.694470160119946e-01 2.850000000000000e-11 2.530000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.590000000000000e-11 -1.780000000000000e-11 9.079999999999999e-12 2.100000000000000e-11 -9.179999999999999e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.240000000000000e+02 5.858348889715289e-01 -6.952841947056411e-01 -3.174200596593129e-01 -2.694844655673552e-01 2.850000000000000e-11 2.530000000000000e-11 -1.390000000000000e-11 1.300000000000000e-11 2.590000000000000e-11 -1.780000000000000e-11 9.079999999999999e-12 2.100000000000000e-11 -9.170000000000001e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.250000000000000e+02 5.858173070961499e-01 -6.952866564410199e-01 -3.174153177738452e-01 -2.695219177065405e-01 2.860000000000000e-11 2.540000000000000e-11 -1.390000000000000e-11 1.290000000000000e-11 2.600000000000000e-11 -1.770000000000000e-11 9.020000000000000e-12 2.100000000000000e-11 -9.179999999999999e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.260000000000000e+02 5.857997227486680e-01 -6.952891161103021e-01 -3.174105776979354e-01 -2.695593719602450e-01 2.860000000000000e-11 2.540000000000000e-11 -1.390000000000000e-11 1.290000000000000e-11 2.600000000000000e-11 -1.770000000000000e-11 9.020000000000000e-12 2.100000000000000e-11 -9.179999999999999e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.270000000000000e+02 5.857821361107132e-01 -6.952915738363965e-01 -3.174058392506267e-01 -2.695968278286714e-01 2.860000000000000e-11 2.540000000000000e-11 -1.390000000000000e-11 1.290000000000000e-11 2.600000000000000e-11 -1.770000000000000e-11 9.020000000000000e-12 2.100000000000000e-11 -9.179999999999999e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.280000000000000e+02 5.857645473039378e-01 -6.952940298476485e-01 -3.174011021459068e-01 -2.696342847944115e-01 2.860000000000000e-11 2.540000000000000e-11 -1.390000000000000e-11 1.290000000000000e-11 2.600000000000000e-11 -1.770000000000000e-11 9.010000000000000e-12 2.100000000000000e-11 -9.179999999999999e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.290000000000000e+02 5.857469563968277e-01 -6.952964844501076e-01 -3.173963660281785e-01 -2.696717423373847e-01 2.860000000000000e-11 2.540000000000000e-11 -1.390000000000000e-11 1.290000000000000e-11 2.600000000000000e-11 -1.770000000000000e-11 9.010000000000000e-12 2.100000000000000e-11 -9.179999999999999e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.300000000000000e+02 5.857293634163256e-01 -6.952989379979103e-01 -3.173916305056663e-01 -2.697091999466067e-01 2.860000000000000e-11 2.540000000000000e-11 -1.390000000000000e-11 1.290000000000000e-11 2.600000000000000e-11 -1.770000000000000e-11 9.000000000000000e-12 2.100000000000000e-11 -9.170000000000001e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.310000000000000e+02 5.857117683600849e-01 -6.953013908703486e-01 -3.173868951737872e-01 -2.697466571251707e-01 2.860000000000000e-11 2.540000000000000e-11 -1.390000000000000e-11 1.290000000000000e-11 2.600000000000000e-11 -1.770000000000000e-11 9.000000000000000e-12 2.100000000000000e-11 -9.170000000000001e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.320000000000000e+02 5.856944368947047e-01 -6.953037624774738e-01 -3.173820601354442e-01 -2.697838623406612e-01 2.860000000000000e-11 2.540000000000000e-11 -1.390000000000000e-11 1.290000000000000e-11 2.600000000000000e-11 -1.770000000000000e-11 9.000000000000000e-12 2.100000000000000e-11 -9.170000000000001e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.330000000000000e+02 5.856768658658663e-01 -6.953062037147749e-01 -3.173773103153456e-01 -2.698213015354438e-01 2.860000000000000e-11 2.540000000000000e-11 -1.390000000000000e-11 1.290000000000000e-11 2.600000000000000e-11 -1.770000000000000e-11 9.000000000000000e-12 2.100000000000000e-11 -9.170000000000001e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.340000000000000e+02 5.856592842556815e-01 -6.953086494198389e-01 -3.173725653467898e-01 -2.698587400331517e-01 2.860000000000000e-11 2.540000000000000e-11 -1.390000000000000e-11 1.290000000000000e-11 2.600000000000000e-11 -1.770000000000000e-11 8.989999999999999e-12 2.100000000000000e-11 -9.160000000000001e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.350000000000000e+02 5.856417002716372e-01 -6.953110938098434e-01 -3.173678207701076e-01 -2.698961801647775e-01 2.860000000000000e-11 2.540000000000000e-11 -1.390000000000000e-11 1.290000000000000e-11 2.600000000000000e-11 -1.770000000000000e-11 8.989999999999999e-12 2.100000000000000e-11 -9.150000000000000e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.360000000000000e+02 5.856241139157427e-01 -6.953135368925616e-01 -3.173630765783489e-01 -2.699336219130233e-01 2.860000000000000e-11 2.540000000000000e-11 -1.390000000000000e-11 1.290000000000000e-11 2.600000000000000e-11 -1.770000000000000e-11 8.979999999999999e-12 2.100000000000000e-11 -9.150000000000000e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.370000000000000e+02 5.856065251053210e-01 -6.953159787152158e-01 -3.173583328227506e-01 -2.699710652742937e-01 2.860000000000000e-11 2.540000000000000e-11 -1.390000000000000e-11 1.290000000000000e-11 2.600000000000000e-11 -1.780000000000000e-11 9.030000000000000e-12 2.110000000000000e-11 -9.250000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.380000000000000e+02 5.855889339083709e-01 -6.953184192391336e-01 -3.173535894604843e-01 -2.700085102499489e-01 2.860000000000000e-11 2.540000000000000e-11 -1.390000000000000e-11 1.290000000000000e-11 2.600000000000000e-11 -1.780000000000000e-11 9.030000000000000e-12 2.110000000000000e-11 -9.250000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.390000000000000e+02 5.855713403546023e-01 -6.953208584395167e-01 -3.173488464773070e-01 -2.700459568550708e-01 2.860000000000000e-11 2.540000000000000e-11 -1.390000000000000e-11 1.290000000000000e-11 2.600000000000000e-11 -1.780000000000000e-11 9.020000000000000e-12 2.110000000000000e-11 -9.250000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.400000000000000e+02 5.855537443355530e-01 -6.953232963948154e-01 -3.173441039307017e-01 -2.700834050542197e-01 2.870000000000000e-11 2.550000000000000e-11 -1.390000000000000e-11 1.290000000000000e-11 2.610000000000000e-11 -1.780000000000000e-11 8.970000000000001e-12 2.120000000000000e-11 -9.260000000000001e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.410000000000000e+02 5.855361459442947e-01 -6.953257330332522e-01 -3.173393617733928e-01 -2.701208548848608e-01 2.870000000000000e-11 2.550000000000000e-11 -1.390000000000000e-11 1.290000000000000e-11 2.610000000000000e-11 -1.780000000000000e-11 8.970000000000001e-12 2.120000000000000e-11 -9.260000000000001e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.420000000000000e+02 5.855185491719553e-01 -6.953281655496542e-01 -3.173346178332730e-01 -2.701583074671813e-01 2.880000000000000e-11 2.560000000000000e-11 -1.400000000000000e-11 1.300000000000000e-11 2.620000000000000e-11 -1.790000000000000e-11 9.020000000000000e-12 2.110000000000000e-11 -9.160000000000001e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.430000000000000e+02 5.855009527298933e-01 -6.953305948497700e-01 -3.173298728115886e-01 -2.701957624383356e-01 2.880000000000000e-11 2.560000000000000e-11 -1.400000000000000e-11 1.300000000000000e-11 2.620000000000000e-11 -1.790000000000000e-11 9.020000000000000e-12 2.110000000000000e-11 -9.160000000000001e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.440000000000000e+02 5.854833471354922e-01 -6.953330276078120e-01 -3.173251318620752e-01 -2.702332171171619e-01 2.880000000000000e-11 2.560000000000000e-11 -1.400000000000000e-11 1.300000000000000e-11 2.620000000000000e-11 -1.790000000000000e-11 9.020000000000000e-12 2.110000000000000e-11 -9.160000000000001e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.450000000000000e+02 5.854657391541639e-01 -6.953354590628759e-01 -3.173203913063377e-01 -2.702706734140444e-01 2.880000000000000e-11 2.560000000000000e-11 -1.400000000000000e-11 1.300000000000000e-11 2.620000000000000e-11 -1.790000000000000e-11 9.010000000000000e-12 2.110000000000000e-11 -9.150000000000000e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.460000000000000e+02 5.854481287239500e-01 -6.953378892606827e-01 -3.173156511765706e-01 -2.703081313066868e-01 2.880000000000000e-11 2.560000000000000e-11 -1.400000000000000e-11 1.300000000000000e-11 2.620000000000000e-11 -1.790000000000000e-11 9.010000000000000e-12 2.110000000000000e-11 -9.150000000000000e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.470000000000000e+02 5.854305159341220e-01 -6.953403181273479e-01 -3.173109114303517e-01 -2.703455908405129e-01 2.880000000000000e-11 2.560000000000000e-11 -1.400000000000000e-11 1.300000000000000e-11 2.620000000000000e-11 -1.790000000000000e-11 9.010000000000000e-12 2.110000000000000e-11 -9.150000000000000e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.480000000000000e+02 5.854129006980108e-01 -6.953427457366954e-01 -3.173061721069501e-01 -2.703830519661484e-01 2.880000000000000e-11 2.560000000000000e-11 -1.400000000000000e-11 1.300000000000000e-11 2.620000000000000e-11 -1.790000000000000e-11 9.000000000000000e-12 2.110000000000000e-11 -9.150000000000000e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.490000000000000e+02 5.853952830671537e-01 -6.953451720414179e-01 -3.173014331844996e-01 -2.704205147182452e-01 2.880000000000000e-11 2.560000000000000e-11 -1.400000000000000e-11 1.300000000000000e-11 2.620000000000000e-11 -1.790000000000000e-11 9.000000000000000e-12 2.110000000000000e-11 -9.150000000000000e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.500000000000000e+02 5.853776630748353e-01 -6.953475970248998e-01 -3.172966946404721e-01 -2.704579790928218e-01 2.880000000000000e-11 2.560000000000000e-11 -1.400000000000000e-11 1.300000000000000e-11 2.620000000000000e-11 -1.790000000000000e-11 8.989999999999999e-12 2.110000000000000e-11 -9.130000000000000e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.510000000000000e+02 5.853600406153219e-01 -6.953500207577379e-01 -3.172919565343655e-01 -2.704954450663388e-01 2.880000000000000e-11 2.560000000000000e-11 -1.400000000000000e-11 1.300000000000000e-11 2.620000000000000e-11 -1.790000000000000e-11 8.989999999999999e-12 2.110000000000000e-11 -9.130000000000000e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.520000000000000e+02 5.853424254339851e-01 -6.953524363827998e-01 -3.172872135692935e-01 -2.705329153892326e-01 2.880000000000000e-11 2.560000000000000e-11 -1.400000000000000e-11 1.300000000000000e-11 2.620000000000000e-11 -1.790000000000000e-11 8.979999999999999e-12 2.110000000000000e-11 -9.120000000000000e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.530000000000000e+02 5.853248146224551e-01 -6.953548459422469e-01 -3.172824673287505e-01 -2.705703892476099e-01 2.880000000000000e-11 2.560000000000000e-11 -1.400000000000000e-11 1.300000000000000e-11 2.620000000000000e-11 -1.790000000000000e-11 8.979999999999999e-12 2.110000000000000e-11 -9.120000000000000e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.540000000000000e+02 5.853071849456428e-01 -6.953572657986130e-01 -3.172777304320631e-01 -2.706078600557705e-01 2.880000000000000e-11 2.560000000000000e-11 -1.400000000000000e-11 1.300000000000000e-11 2.620000000000000e-11 -1.790000000000000e-11 8.979999999999999e-12 2.110000000000000e-11 -9.120000000000000e-12 1.560000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.550000000000000e+02 5.852895528935942e-01 -6.953596843431190e-01 -3.172729939198171e-01 -2.706453324796315e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.920000000000000e-12 2.120000000000000e-11 -9.130000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.560000000000000e+02 5.852719184580404e-01 -6.953621015729359e-01 -3.172682578012318e-01 -2.706828065324546e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.920000000000000e-12 2.120000000000000e-11 -9.130000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.570000000000000e+02 5.852542815612930e-01 -6.953645175484408e-01 -3.172635221149122e-01 -2.707202821807774e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.920000000000000e-12 2.120000000000000e-11 -9.130000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.580000000000000e+02 5.852366423075759e-01 -6.953669321971048e-01 -3.172587868032843e-01 -2.707577594519683e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.910000000000000e-12 2.120000000000000e-11 -9.130000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.590000000000000e+02 5.852190005915120e-01 -6.953693455857081e-01 -3.172540519277470e-01 -2.707952383292633e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.910000000000000e-12 2.120000000000000e-11 -9.120000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.600000000000000e+02 5.852013565048416e-01 -6.953717576564767e-01 -3.172493174340336e-01 -2.708327188252471e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.900000000000000e-12 2.120000000000000e-11 -9.110000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.610000000000000e+02 5.851837100217011e-01 -6.953741684237309e-01 -3.172445833380956e-01 -2.708702009392699e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.900000000000000e-12 2.120000000000000e-11 -9.110000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.620000000000000e+02 5.851660610850813e-01 -6.953765779297217e-01 -3.172398496694150e-01 -2.709076846504131e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.630000000000000e+02 5.851484097590725e-01 -6.953789861278076e-01 -3.172351163936827e-01 -2.709451699790525e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.640000000000000e+02 5.851307560616458e-01 -6.953813930073960e-01 -3.172303834995215e-01 -2.709826569258024e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.650000000000000e+02 5.851130998844488e-01 -6.953837986385580e-01 -3.172256510492222e-01 -2.710201454708074e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.660000000000000e+02 5.850954413358767e-01 -6.953862029458314e-01 -3.172209189830160e-01 -2.710576356425430e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.670000000000000e+02 5.850777803951108e-01 -6.953886059542803e-01 -3.172161873056501e-01 -2.710951274150090e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.680000000000000e+02 5.850601169953407e-01 -6.953910076963832e-01 -3.172114560617900e-01 -2.711326207957394e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.690000000000000e+02 5.850424512088878e-01 -6.953934081280363e-01 -3.172067252077339e-01 -2.711701157918326e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.700000000000000e+02 5.850247830368903e-01 -6.953958072457348e-01 -3.172019947440637e-01 -2.712076124080577e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.710000000000000e+02 5.850071124005890e-01 -6.953982051082478e-01 -3.171972647113503e-01 -2.712451106150847e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.720000000000000e+02 5.849894394067295e-01 -6.954006016376769e-01 -3.171925350528047e-01 -2.712826104477260e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.730000000000000e+02 5.849717639406388e-01 -6.954029969133201e-01 -3.171878058313053e-01 -2.713201118753874e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.740000000000000e+02 5.849540860919462e-01 -6.954053908729213e-01 -3.171830769972923e-01 -2.713576149212427e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.750000000000000e+02 5.849364058534681e-01 -6.954077835188361e-01 -3.171783485558634e-01 -2.713951195876995e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.760000000000000e+02 5.849187231543139e-01 -6.954101749078743e-01 -3.171736205411951e-01 -2.714326258409567e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.770000000000000e+02 5.849010380595855e-01 -6.954125649831299e-01 -3.171688929240919e-01 -2.714701337195486e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.780000000000000e+02 5.848833505824673e-01 -6.954149537469204e-01 -3.171641656901418e-01 -2.715076432048855e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.790000000000000e+02 5.848656606310142e-01 -6.954173412553879e-01 -3.171594388941021e-01 -2.715451542861942e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.800000000000000e+02 5.848479682972464e-01 -6.954197274445862e-01 -3.171547124851289e-01 -2.715826669873385e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.810000000000000e+02 5.848302735737035e-01 -6.954221123230289e-01 -3.171499864649467e-01 -2.716201812994903e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.820000000000000e+02 5.848125763768405e-01 -6.954244959445196e-01 -3.171452608816330e-01 -2.716576972075597e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.830000000000000e+02 5.847948768200809e-01 -6.954268782347893e-01 -3.171405356698738e-01 -2.716952147326623e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.840000000000000e+02 5.847771747920576e-01 -6.954292592636632e-01 -3.171358108949500e-01 -2.717327338585004e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.850000000000000e+02 5.847594703769200e-01 -6.954316389810870e-01 -3.171310865053671e-01 -2.717702545910952e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.860000000000000e+02 5.847417635703021e-01 -6.954340173826565e-01 -3.171263625075116e-01 -2.718077769425781e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.870000000000000e+02 5.847240542921777e-01 -6.954363945256665e-01 -3.171216389440188e-01 -2.718453008876911e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.880000000000000e+02 5.847063426146137e-01 -6.954387703590261e-01 -3.171169157755906e-01 -2.718828264468806e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.890000000000000e+02 5.846886285574723e-01 -6.954411448755839e-01 -3.171121929870191e-01 -2.719203536123818e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.900000000000000e+02 5.846709120224511e-01 -6.954435181323835e-01 -3.171074706385945e-01 -2.719578823782857e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.910000000000000e+02 5.846531930957800e-01 -6.954458900767090e-01 -3.171027486784128e-01 -2.719954127534470e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.920000000000000e+02 5.846354717746990e-01 -6.954482607077976e-01 -3.170980271091700e-01 -2.720329447415265e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.930000000000000e+02 5.846177479850914e-01 -6.954506300775927e-01 -3.170933059709897e-01 -2.720704783211655e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.940000000000000e+02 5.846000218004164e-01 -6.954529981340173e-01 -3.170885852238311e-01 -2.721080135132157e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.950000000000000e+02 5.845822932197179e-01 -6.954553648774245e-01 -3.170838648680027e-01 -2.721455503173886e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.960000000000000e+02 5.845645621696898e-01 -6.954577303591899e-01 -3.170791449431832e-01 -2.721830887125490e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.970000000000000e+02 5.845468287406869e-01 -6.954600945177026e-01 -3.170744253987201e-01 -2.722206287199883e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.980000000000000e+02 5.845290928537464e-01 -6.954624574023535e-01 -3.170697062808771e-01 -2.722581703281180e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.990000000000000e+02 5.845113545641019e-01 -6.954648189786803e-01 -3.170649875566854e-01 -2.722957135436939e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.000000000000000e+02 5.844936138763418e-01 -6.954671792419352e-01 -3.170602692241519e-01 -2.723332583702329e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.010000000000000e+02 5.844758707090094e-01 -6.954695382492416e-01 -3.170555513273636e-01 -2.723708047842747e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.020000000000000e+02 5.844581251559721e-01 -6.954718959329390e-01 -3.170508338159378e-01 -2.724083528147186e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.030000000000000e+02 5.844403772040307e-01 -6.954742523079823e-01 -3.170461166932985e-01 -2.724459024466375e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.040000000000000e+02 5.844226267704047e-01 -6.954766074228710e-01 -3.170414000098757e-01 -2.724834536740388e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.050000000000000e+02 5.844048739455676e-01 -6.954789612171122e-01 -3.170366837143173e-01 -2.725210065159378e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.060000000000000e+02 5.843871187196821e-01 -6.954813137009034e-01 -3.170319678096324e-01 -2.725585609628257e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.070000000000000e+02 5.843693610160483e-01 -6.954836649268263e-01 -3.170272523380220e-01 -2.725961169948128e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.080000000000000e+02 5.843516009405999e-01 -6.954860148174994e-01 -3.170225372432346e-01 -2.726336746465719e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.090000000000000e+02 5.843338383896745e-01 -6.954883634468985e-01 -3.170178225806694e-01 -2.726712338860778e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.100000000000000e+02 5.843160734396614e-01 -6.954907107608660e-01 -3.170131083087279e-01 -2.727087947350444e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.110000000000000e+02 5.842983060846727e-01 -6.954930567632314e-01 -3.170083944303905e-01 -2.727463571917777e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.120000000000000e+02 5.842805362623766e-01 -6.954954014976492e-01 -3.170036809793610e-01 -2.727839212382372e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.130000000000000e+02 5.842627640233117e-01 -6.954977449269839e-01 -3.169989679287539e-01 -2.728214868910164e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.140000000000000e+02 5.842449894075324e-01 -6.955000870274668e-01 -3.169942552538495e-01 -2.728590541525713e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.150000000000000e+02 5.842272122843237e-01 -6.955024278849737e-01 -3.169895430289044e-01 -2.728966229965500e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.160000000000000e+02 5.842094327846888e-01 -6.955047674092403e-01 -3.169848311813445e-01 -2.729341934557590e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.170000000000000e+02 5.841916508636360e-01 -6.955071056292645e-01 -3.169801197367355e-01 -2.729717655218351e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.180000000000000e+02 5.841738664722402e-01 -6.955094425864351e-01 -3.169754087172885e-01 -2.730093391671568e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.190000000000000e+02 5.841560796793650e-01 -6.955117782235155e-01 -3.169706980904252e-01 -2.730469144269303e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.200000000000000e+02 5.841382904845881e-01 -6.955141125452683e-01 -3.169659878533504e-01 -2.730844912920921e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.210000000000000e+02 5.841204988011045e-01 -6.955164456126073e-01 -3.169612780530048e-01 -2.731220697376175e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.220000000000000e+02 5.841027047488182e-01 -6.955187773370833e-01 -3.169565686263153e-01 -2.731596498044239e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.230000000000000e+02 5.840849082066607e-01 -6.955211078061588e-01 -3.169518596373633e-01 -2.731972314532624e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.240000000000000e+02 5.840671092649424e-01 -6.955234369582445e-01 -3.169471510356347e-01 -2.732348147053730e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.250000000000000e+02 5.840493079217062e-01 -6.955257647920037e-01 -3.169424428233881e-01 -2.732723995646432e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.260000000000000e+02 5.840315040865945e-01 -6.955280913696625e-01 -3.169377350501790e-01 -2.733099860072574e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.270000000000000e+02 5.840136978582137e-01 -6.955304166201872e-01 -3.169330276631203e-01 -2.733475740635207e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.280000000000000e+02 5.839958892081509e-01 -6.955327405680767e-01 -3.169283206745694e-01 -2.733851637163930e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.290000000000000e+02 5.839780780929669e-01 -6.955350632424827e-01 -3.169236141086801e-01 -2.734227549554220e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.300000000000000e+02 5.839602645601643e-01 -6.955373846071993e-01 -3.169189079409361e-01 -2.734603477985875e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.310000000000000e+02 5.839424486213922e-01 -6.955397046548893e-01 -3.169142021641203e-01 -2.734979422469596e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.320000000000000e+02 5.839246302074598e-01 -6.955420234364549e-01 -3.169094968142101e-01 -2.735355382760485e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.330000000000000e+02 5.839068093998936e-01 -6.955443408868918e-01 -3.169047918510442e-01 -2.735731359225576e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.340000000000000e+02 5.838889861094081e-01 -6.955466570748655e-01 -3.169000873193608e-01 -2.736107351495706e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.350000000000000e+02 5.838711604164700e-01 -6.955489719433202e-01 -3.168953831754061e-01 -2.736483359800086e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.360000000000000e+02 5.838533323100364e-01 -6.955512855009193e-01 -3.168906794242438e-01 -2.736859384084723e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.370000000000000e+02 5.838355017298018e-01 -6.955535977851144e-01 -3.168859761012539e-01 -2.737235424263861e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.380000000000000e+02 5.838176687211944e-01 -6.955559087659493e-01 -3.168812731802392e-01 -2.737611480422213e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.390000000000000e+02 5.837998333145428e-01 -6.955582184217171e-01 -3.168765706445820e-01 -2.737987552646077e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.400000000000000e+02 5.837819954152460e-01 -6.955605268176491e-01 -3.168718685461019e-01 -2.738363640684894e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.410000000000000e+02 5.837641551128304e-01 -6.955628338938911e-01 -3.168671668340473e-01 -2.738739744726880e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.420000000000000e+02 5.837463123929925e-01 -6.955651396554128e-01 -3.168624655187589e-01 -2.739115864820293e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.430000000000000e+02 5.837284671943698e-01 -6.955674441488053e-01 -3.168577646312576e-01 -2.739492000720076e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.440000000000000e+02 5.837106195763908e-01 -6.955697473330390e-01 -3.168530641384842e-01 -2.739868152573258e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.450000000000000e+02 5.836927695441628e-01 -6.955720491933975e-01 -3.168483640437939e-01 -2.740244320595047e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.460000000000000e+02 5.836749170318810e-01 -6.955743497928002e-01 -3.168436643728734e-01 -2.740620504282199e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.470000000000000e+02 5.836570621307416e-01 -6.955766490582023e-01 -3.168389650810632e-01 -2.740996704051923e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.480000000000000e+02 5.836392047384135e-01 -6.955789470590961e-01 -3.168342662250465e-01 -2.741372919653729e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.490000000000000e+02 5.836213449303548e-01 -6.955812437419429e-01 -3.168295677638069e-01 -2.741749151302781e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.500000000000000e+02 5.836034827182855e-01 -6.955835391041530e-01 -3.168248696872848e-01 -2.742125398920773e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.510000000000000e+02 5.835856179985505e-01 -6.955858332137573e-01 -3.168201720542758e-01 -2.742501662297985e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.520000000000000e+02 5.835677508875651e-01 -6.955881259907279e-01 -3.168154748002195e-01 -2.742877941721936e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.530000000000000e+02 5.835498813469788e-01 -6.955904174605910e-01 -3.168107779463452e-01 -2.743254237105254e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.540000000000000e+02 5.835320093166678e-01 -6.955927076618763e-01 -3.168060815272026e-01 -2.743630548340127e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.550000000000000e+02 5.835141348741624e-01 -6.955949965443786e-01 -3.168013854978563e-01 -2.744006875558487e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.560000000000000e+02 5.834962580148892e-01 -6.955972841122019e-01 -3.167966898598680e-01 -2.744383218724767e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.570000000000000e+02 5.834783786654938e-01 -6.955995704144100e-01 -3.167919946542331e-01 -2.744759577671007e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.580000000000000e+02 5.834604969197658e-01 -6.956018553809091e-01 -3.167872998321029e-01 -2.745135952732799e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.590000000000000e+02 5.834426126855181e-01 -6.956041390824514e-01 -3.167826054397302e-01 -2.745512343532155e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.600000000000000e+02 5.834247260354545e-01 -6.956064214662310e-01 -3.167779114383129e-01 -2.745888750298885e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.610000000000000e+02 5.834068369703270e-01 -6.956087025301940e-01 -3.167732178279383e-01 -2.746265173057257e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.620000000000000e+02 5.833889454069964e-01 -6.956109823315106e-01 -3.167685246541772e-01 -2.746641611588949e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.630000000000000e+02 5.833710514209808e-01 -6.956132608141853e-01 -3.167638318774125e-01 -2.747018066154171e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.640000000000000e+02 5.833531550259811e-01 -6.956155379778383e-01 -3.167591394844141e-01 -2.747394536613369e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.650000000000000e+02 5.833352561337060e-01 -6.956178138760706e-01 -3.167544475277447e-01 -2.747771022867325e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.660000000000000e+02 5.833173548210511e-01 -6.956200884555152e-01 -3.167497559649418e-01 -2.748147525113297e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.670000000000000e+02 5.832994510909917e-01 -6.956223617185553e-01 -3.167450647913811e-01 -2.748524043270335e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.680000000000000e+02 5.832815448604923e-01 -6.956246337186902e-01 -3.167403740546705e-01 -2.748900577187235e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.690000000000000e+02 5.832636362191355e-01 -6.956269043911956e-01 -3.167356837069057e-01 -2.749277127142218e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.700000000000000e+02 5.832457251486519e-01 -6.956291737498391e-01 -3.167309937570452e-01 -2.749653693060527e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.710000000000000e+02 5.832278115833165e-01 -6.956314418455223e-01 -3.167263042377223e-01 -2.750030274661883e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.720000000000000e+02 5.832098956260603e-01 -6.956337086004795e-01 -3.167216150958865e-01 -2.750406872330643e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.730000000000000e+02 5.831919771671186e-01 -6.956359740942818e-01 -3.167169263893606e-01 -2.750783485705177e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.740000000000000e+02 5.831740562877817e-01 -6.956382382668485e-01 -3.167122380754318e-01 -2.751160115062404e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.750000000000000e+02 5.831561329925340e-01 -6.956405011134896e-01 -3.167075501521728e-01 -2.751536760437264e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.760000000000000e+02 5.831382071844491e-01 -6.956427627071282e-01 -3.167028626690587e-01 -2.751913421460132e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.770000000000000e+02 5.831202789687576e-01 -6.956450229719894e-01 -3.166981755697529e-01 -2.752290098454169e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.780000000000000e+02 5.831023483192034e-01 -6.956472819226700e-01 -3.166934888703323e-01 -2.752666791410986e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.790000000000000e+02 5.830844151794714e-01 -6.956495396046427e-01 -3.166888025976340e-01 -2.753043500054790e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.800000000000000e+02 5.830664796132707e-01 -6.956517959642123e-01 -3.166841167219613e-01 -2.753420224723870e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.810000000000000e+02 5.830485416150840e-01 -6.956540510145710e-01 -3.166794312404689e-01 -2.753796965223715e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.820000000000000e+02 5.830306011328652e-01 -6.956563047837491e-01 -3.166747461861094e-01 -2.754173721558481e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.830000000000000e+02 5.830126582345619e-01 -6.956585572282714e-01 -3.166700615191317e-01 -2.754550493834141e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.840000000000000e+02 5.829947128434927e-01 -6.956608084007722e-01 -3.166653772815733e-01 -2.754927281850406e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.850000000000000e+02 5.829767650241529e-01 -6.956630582554145e-01 -3.166606934384076e-01 -2.755304085791704e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.860000000000000e+02 5.829588147807234e-01 -6.956653067889245e-01 -3.166560099871700e-01 -2.755680905669798e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.870000000000000e+02 5.829408620354734e-01 -6.956675540546792e-01 -3.166513269704571e-01 -2.756057741281340e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.880000000000000e+02 5.829229068623707e-01 -6.956698000025611e-01 -3.166466443467315e-01 -2.756434592793293e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.890000000000000e+02 5.829049492715592e-01 -6.956720446262921e-01 -3.166419621096092e-01 -2.756811460212181e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.900000000000000e+02 5.828869891587379e-01 -6.956742879943926e-01 -3.166372803181250e-01 -2.757188343325451e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.910000000000000e+02 5.828690266395175e-01 -6.956765300273531e-01 -3.166325989082742e-01 -2.757565242419386e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.920000000000000e+02 5.828510616754471e-01 -6.956787707507837e-01 -3.166279179013008e-01 -2.757942157405953e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.930000000000000e+02 5.828330942174438e-01 -6.956810102026629e-01 -3.166232373215231e-01 -2.758319088074500e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.940000000000000e+02 5.828151243252382e-01 -6.956832483368977e-01 -3.166185571386063e-01 -2.758696034662875e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.950000000000000e+02 5.827971520090908e-01 -6.956854851471268e-01 -3.166138773461051e-01 -2.759072997177953e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.960000000000000e+02 5.827791771874248e-01 -6.956877206918572e-01 -3.166091979872700e-01 -2.759449975360566e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.970000000000000e+02 5.827611999535102e-01 -6.956899548988957e-01 -3.166045190150286e-01 -2.759826969590304e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.980000000000000e+02 5.827432202258372e-01 -6.956921878351339e-01 -3.165998404676824e-01 -2.760203979451962e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.990000000000000e+02 5.827252380631254e-01 -6.956944194551884e-01 -3.165951623154489e-01 -2.760581005180557e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.000000000000000e+02 5.827072534710865e-01 -6.956966497498854e-01 -3.165904845578452e-01 -2.760958046881501e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.010000000000000e+02 5.826892663667650e-01 -6.956988787799151e-01 -3.165858072381525e-01 -2.761335104269267e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.020000000000000e+02 5.826712768270340e-01 -6.957011064943041e-01 -3.165811303125931e-01 -2.761712177497065e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.030000000000000e+02 5.826532848794255e-01 -6.957033328720889e-01 -3.165764537668129e-01 -2.762089266665937e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.040000000000000e+02 5.826352903993585e-01 -6.957055579997335e-01 -3.165717776686401e-01 -2.762466371437880e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.050000000000000e+02 5.826172935012799e-01 -6.957077817937122e-01 -3.165671019575464e-01 -2.762843492185479e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.060000000000000e+02 5.825992941611964e-01 -6.957100042730495e-01 -3.165624266448607e-01 -2.763220628795079e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.070000000000000e+02 5.825812923192838e-01 -6.957122254809077e-01 -3.165577517620805e-01 -2.763597781069690e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.080000000000000e+02 5.825632880668580e-01 -6.957144453488653e-01 -3.165530772618108e-01 -2.763974949338902e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.090000000000000e+02 5.825452813078505e-01 -6.957166639529077e-01 -3.165484031908835e-01 -2.764352133167844e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.100000000000000e+02 5.825272721059203e-01 -6.957188812393303e-01 -3.165437295196725e-01 -2.764729332895106e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.110000000000000e+02 5.825092604788189e-01 -6.957210971940696e-01 -3.165390562391017e-01 -2.765106548593716e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.120000000000000e+02 5.824912463439814e-01 -6.957233118835827e-01 -3.165343833887144e-01 -2.765483779867471e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.130000000000000e+02 5.824732297631289e-01 -6.957255252567345e-01 -3.165297109392333e-01 -2.765861027027131e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.140000000000000e+02 5.824552107571479e-01 -6.957277372996592e-01 -3.165250388784912e-01 -2.766238290110101e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.150000000000000e+02 5.824371892380432e-01 -6.957299480778293e-01 -3.165203672517569e-01 -2.766615568793791e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.160000000000000e+02 5.824191652746327e-01 -6.957321575387126e-01 -3.165156960238288e-01 -2.766992863342431e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.170000000000000e+02 5.824011388855037e-01 -6.957343656688602e-01 -3.165110251844822e-01 -2.767370173809153e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.180000000000000e+02 5.823831099805280e-01 -6.957365725328419e-01 -3.165063547815302e-01 -2.767747499909810e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.190000000000000e+02 5.823650786300579e-01 -6.957387780818642e-01 -3.165016847761464e-01 -2.768124841823826e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.200000000000000e+02 5.823470448566271e-01 -6.957409823008985e-01 -3.164970151552803e-01 -2.768502199593362e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.210000000000000e+02 5.823290085661269e-01 -6.957431852525021e-01 -3.164923459716862e-01 -2.768879573012030e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.220000000000000e+02 5.823109698521846e-01 -6.957453868690139e-01 -3.164876771753546e-01 -2.769256962371734e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.230000000000000e+02 5.822929286375025e-01 -6.957475872059478e-01 -3.164830088071746e-01 -2.769634367425067e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.240000000000000e+02 5.822748849732314e-01 -6.957497862328947e-01 -3.164783408358728e-01 -2.770011788207128e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.250000000000000e+02 5.822568388807733e-01 -6.957519839259674e-01 -3.164736732546169e-01 -2.770389224935368e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.260000000000000e+02 5.822387902618280e-01 -6.957541803591372e-01 -3.164690061135010e-01 -2.770766677235049e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.270000000000000e+02 5.822207392135617e-01 -6.957563754610457e-01 -3.164643393613722e-01 -2.771144145429691e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.280000000000000e+02 5.822026857222734e-01 -6.957585692434597e-01 -3.164596730040027e-01 -2.771521629435090e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.290000000000000e+02 5.821846297103098e-01 -6.957607617597373e-01 -3.164550070838612e-01 -2.771899129047319e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.300000000000000e+02 5.821665712627864e-01 -6.957629529494422e-01 -3.164503415548917e-01 -2.772276644510718e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.310000000000000e+02 5.821485103723264e-01 -6.957651428198749e-01 -3.164456764194593e-01 -2.772654175759239e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.320000000000000e+02 5.821304469698791e-01 -6.957673314146972e-01 -3.164410117174953e-01 -2.773031722680575e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.330000000000000e+02 5.821123811384951e-01 -6.957695186773272e-01 -3.164363474026121e-01 -2.773409285469521e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.340000000000000e+02 5.820943128053812e-01 -6.957717046576937e-01 -3.164316835146523e-01 -2.773786863936038e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.350000000000000e+02 5.820762420142032e-01 -6.957738893270475e-01 -3.164270200284908e-01 -2.774164458160786e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.360000000000000e+02 5.820581687899399e-01 -6.957760726662133e-01 -3.164223569311706e-01 -2.774542068237662e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.370000000000000e+02 5.820400930493064e-01 -6.957782547337412e-01 -3.164176942674763e-01 -2.774919693924091e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.380000000000000e+02 5.820220148551207e-01 -6.957804354849367e-01 -3.164130320033753e-01 -2.775297335400457e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.390000000000000e+02 5.820039342263251e-01 -6.957826149048855e-01 -3.164083701291627e-01 -2.775674992743318e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.400000000000000e+02 5.819858510723547e-01 -6.957847930609107e-01 -3.164037086914346e-01 -2.776052665622155e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.410000000000000e+02 5.819677654759241e-01 -6.957869698906334e-01 -3.163990476475529e-01 -2.776430354341566e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.420000000000000e+02 5.819496774375017e-01 -6.957891453958156e-01 -3.163943869956590e-01 -2.776808058858043e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.430000000000000e+02 5.819315868742189e-01 -6.957913196335117e-01 -3.163897267809997e-01 -2.777185778952395e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.440000000000000e+02 5.819134938671313e-01 -6.957934925413013e-01 -3.163850669625369e-01 -2.777563514946820e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.450000000000000e+02 5.818953984093933e-01 -6.957956641333685e-01 -3.163804075381466e-01 -2.777941266642878e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.460000000000000e+02 5.818773004397692e-01 -6.957978344442328e-01 -3.163757485456281e-01 -2.778319034017449e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.470000000000000e+02 5.818592000430243e-01 -6.958000034233444e-01 -3.163710899335022e-01 -2.778696817136654e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.480000000000000e+02 5.818410971278563e-01 -6.958021711240455e-01 -3.163664317571461e-01 -2.779074615935458e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.490000000000000e+02 5.818229917597070e-01 -6.958043375058253e-01 -3.163617739776330e-01 -2.779452430490382e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.500000000000000e+02 5.818048839454777e-01 -6.958065025622731e-01 -3.163571165917429e-01 -2.779830260843371e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.510000000000000e+02 5.817867736100961e-01 -6.958086663461525e-01 -3.163524596398105e-01 -2.780208106775203e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.520000000000000e+02 5.817686608316146e-01 -6.958108288032028e-01 -3.163478030789305e-01 -2.780585968488011e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.530000000000000e+02 5.817505455909165e-01 -6.958129899417663e-01 -3.163431469219805e-01 -2.780963846015780e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.540000000000000e+02 5.817324278297862e-01 -6.958151498075382e-01 -3.163384911974209e-01 -2.781341739098508e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.550000000000000e+02 5.817143076344311e-01 -6.958173083404936e-01 -3.163338358579657e-01 -2.781719647961862e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.560000000000000e+02 5.816961849714265e-01 -6.958194655627148e-01 -3.163291809220889e-01 -2.782097572531674e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.570000000000000e+02 5.816780597959783e-01 -6.958216215007350e-01 -3.163245264166255e-01 -2.782475512765062e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.580000000000000e+02 5.816599321845121e-01 -6.958237761050522e-01 -3.163198722974089e-01 -2.782853468793607e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.590000000000000e+02 5.816418020571233e-01 -6.958259294306408e-01 -3.163152186080582e-01 -2.783231440406337e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.600000000000000e+02 5.816236694709122e-01 -6.958280814368287e-01 -3.163105653176532e-01 -2.783609427767481e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.610000000000000e+02 5.816055344366186e-01 -6.958302321157006e-01 -3.163059124202110e-01 -2.783987430907752e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.620000000000000e+02 5.815873968776649e-01 -6.958323815210938e-01 -3.163012599568550e-01 -2.784365449603383e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.630000000000000e+02 5.815692568616415e-01 -6.958345296037094e-01 -3.162966078917271e-01 -2.784743484071190e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.640000000000000e+02 5.815511143976942e-01 -6.958366763591807e-01 -3.162919562183046e-01 -2.785121534292659e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.650000000000000e+02 5.815329694007949e-01 -6.958388218461087e-01 -3.162873049829473e-01 -2.785499600041934e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.660000000000000e+02 5.815148219614794e-01 -6.958409660013981e-01 -3.162826541360672e-01 -2.785877681557379e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.670000000000000e+02 5.814966720551789e-01 -6.958431088372415e-01 -3.162780036934651e-01 -2.786255778857196e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.680000000000000e+02 5.814785196322499e-01 -6.958452503969265e-01 -3.162733536768749e-01 -2.786633891638949e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.690000000000000e+02 5.814603647463017e-01 -6.958473906361835e-01 -3.162687040607646e-01 -2.787012020168500e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.700000000000000e+02 5.814422074099109e-01 -6.958495295445863e-01 -3.162640548388659e-01 -2.787390164504185e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.710000000000000e+02 5.814240475428735e-01 -6.958516671809677e-01 -3.162594060528345e-01 -2.787768324366982e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.720000000000000e+02 5.814058852479905e-01 -6.958538034735398e-01 -3.162547576464547e-01 -2.788146500031716e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.730000000000000e+02 5.813877204231332e-01 -6.958559384954224e-01 -3.162501096738626e-01 -2.788524691178429e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.740000000000000e+02 5.813695531339568e-01 -6.958580721950373e-01 -3.162454621023588e-01 -2.788902898085467e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.750000000000000e+02 5.813513834021187e-01 -6.958602045567507e-01 -3.162408149200974e-01 -2.789281120815051e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.760000000000000e+02 5.813332111234679e-01 -6.958623356575390e-01 -3.162361681808935e-01 -2.789659358996684e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.770000000000000e+02 5.813150364030600e-01 -6.958644654288825e-01 -3.162315218245857e-01 -2.790037612821580e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.780000000000000e+02 5.812968592173021e-01 -6.958665938713704e-01 -3.162268758727366e-01 -2.790415882511533e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.790000000000000e+02 5.812786794994969e-01 -6.958687210427844e-01 -3.162222303548325e-01 -2.790794167670128e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.800000000000000e+02 5.812604973256570e-01 -6.958708468854302e-01 -3.162175852319191e-01 -2.791172468583376e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.810000000000000e+02 5.812423126926801e-01 -6.958729714036002e-01 -3.162129405040593e-01 -2.791550785197454e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.820000000000000e+02 5.812241255262258e-01 -6.958750946447176e-01 -3.162082962139302e-01 -2.791929117383943e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.830000000000000e+02 5.812059359280037e-01 -6.958772165474577e-01 -3.162036523003404e-01 -2.792307465236257e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.840000000000000e+02 5.811877437937374e-01 -6.958793371731296e-01 -3.161990088262405e-01 -2.792685828673430e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.850000000000000e+02 5.811695491941765e-01 -6.958814564774579e-01 -3.161943657499202e-01 -2.793064207787844e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.860000000000000e+02 5.811513521482911e-01 -6.958835744442788e-01 -3.161897230623827e-01 -2.793442602678650e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.870000000000000e+02 5.811331525547214e-01 -6.958856911498272e-01 -3.161850808152155e-01 -2.793821012960814e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.880000000000000e+02 5.811149505113100e-01 -6.958878065197522e-01 -3.161804389584545e-01 -2.794199439005827e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.890000000000000e+02 5.810967459999881e-01 -6.958899205652878e-01 -3.161757975022972e-01 -2.794577880783594e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.900000000000000e+02 5.810785389530592e-01 -6.958920333376604e-01 -3.161711564809435e-01 -2.794956338028511e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.910000000000000e+02 5.810603294453802e-01 -6.958941447811916e-01 -3.161665158553826e-01 -2.795334811001148e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.920000000000000e+02 5.810421174764387e-01 -6.958962548983457e-01 -3.161618756242864e-01 -2.795713299655139e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.930000000000000e+02 5.810239029759451e-01 -6.958983637385437e-01 -3.161572358253394e-01 -2.796091803784308e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.940000000000000e+02 5.810056860006197e-01 -6.959004712601424e-01 -3.161525964285756e-01 -2.796470323574547e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.950000000000000e+02 5.809874665694046e-01 -6.959025774445649e-01 -3.161479574264141e-01 -2.796848859169596e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.960000000000000e+02 5.809692445987980e-01 -6.959046823590764e-01 -3.161433188587358e-01 -2.797227410168842e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.970000000000000e+02 5.809510201926489e-01 -6.959067859299050e-01 -3.161386806695309e-01 -2.797605976873053e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.980000000000000e+02 5.809327932460990e-01 -6.959088882236331e-01 -3.161340429192251e-01 -2.797984559109964e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.990000000000000e+02 5.809145638337309e-01 -6.959109891896249e-01 -3.161294055661758e-01 -2.798363157050214e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.000000000000000e+02 5.808963319634960e-01 -6.959130888255755e-01 -3.161247686038135e-01 -2.798741770649591e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.010000000000000e+02 5.808780975397640e-01 -6.959151871939737e-01 -3.161201320862030e-01 -2.799120399717788e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.020000000000000e+02 5.808598606617771e-01 -6.959172842267435e-01 -3.161154959584729e-01 -2.799499044496779e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.030000000000000e+02 5.808416213174963e-01 -6.959193799369323e-01 -3.161108602240852e-01 -2.799877704862250e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.040000000000000e+02 5.808233794256747e-01 -6.959214743695692e-01 -3.161062249335686e-01 -2.800256380799301e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.050000000000000e+02 5.808051350748651e-01 -6.959235674750707e-01 -3.161015900315101e-01 -2.800635072318234e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.060000000000000e+02 5.807868882549465e-01 -6.959256592517621e-01 -3.160969555280244e-01 -2.801013779545733e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.070000000000000e+02 5.807686388909959e-01 -6.959277497523529e-01 -3.160923214632559e-01 -2.801392502261977e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.080000000000000e+02 5.807503870900764e-01 -6.959298389056441e-01 -3.160876877767071e-01 -2.801771240688037e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.090000000000000e+02 5.807321327395073e-01 -6.959319267874047e-01 -3.160830545308733e-01 -2.802149994561799e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.100000000000000e+02 5.807138759254036e-01 -6.959340133412668e-01 -3.160784216765503e-01 -2.802528764042817e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.110000000000000e+02 5.806956166460356e-01 -6.959360985620483e-01 -3.160737892179524e-01 -2.802907549237413e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.120000000000000e+02 5.806773548168237e-01 -6.959381825117258e-01 -3.160691571989988e-01 -2.803286349853105e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.130000000000000e+02 5.806590905178923e-01 -6.959402651320853e-01 -3.160645255771965e-01 -2.803665166143753e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.140000000000000e+02 5.806408237610376e-01 -6.959423464205376e-01 -3.160598943425227e-01 -2.804043998031655e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.150000000000000e+02 5.806225544454130e-01 -6.959444264371912e-01 -3.160552635552945e-01 -2.804422845422669e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.160000000000000e+02 5.806042826706947e-01 -6.959465051209457e-01 -3.160506331562557e-01 -2.804801708426454e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.170000000000000e+02 5.805860084151201e-01 -6.959485824783535e-01 -3.160460031617608e-01 -2.805180587135971e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.180000000000000e+02 5.805677316239107e-01 -6.959506585600499e-01 -3.160413735941470e-01 -2.805559481166358e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.190000000000000e+02 5.805494523586150e-01 -6.959527333100070e-01 -3.160367444271813e-01 -2.805938390918646e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.200000000000000e+02 5.805311706173489e-01 -6.959548067353131e-01 -3.160321156581771e-01 -2.806317316275553e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.210000000000000e+02 5.805128863381084e-01 -6.959568788783360e-01 -3.160274873210229e-01 -2.806696257076716e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.220000000000000e+02 5.804945996055608e-01 -6.959589496800560e-01 -3.160228593693650e-01 -2.807075213545651e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.230000000000000e+02 5.804763103272732e-01 -6.959610192007165e-01 -3.160182318554973e-01 -2.807454185500813e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.240000000000000e+02 5.804580185738928e-01 -6.959630873960984e-01 -3.160136047378450e-01 -2.807833173034932e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.250000000000000e+02 5.804397243544648e-01 -6.959651542546071e-01 -3.160089780141460e-01 -2.808212176263198e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.260000000000000e+02 5.804214275809261e-01 -6.959672198480055e-01 -3.160043517259676e-01 -2.808591194748871e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.270000000000000e+02 5.804031283351840e-01 -6.959692841070644e-01 -3.159997258354755e-01 -2.808970228929750e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.280000000000000e+02 5.803848266166751e-01 -6.959713470330723e-01 -3.159951003420692e-01 -2.809349278781627e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.290000000000000e+02 5.803665223419990e-01 -6.959734086859748e-01 -3.159904752896953e-01 -2.809728344037404e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.300000000000000e+02 5.803482156026000e-01 -6.959754690056189e-01 -3.159858506263420e-01 -2.810107424872477e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.310000000000000e+02 5.803299063837136e-01 -6.959775279948167e-01 -3.159812263639046e-01 -2.810486521377699e-01 2.900000000000000e-11 2.570000000000000e-11 -1.400000000000000e-11 1.290000000000000e-11 2.630000000000000e-11 -1.790000000000000e-11 8.889999999999999e-12 2.120000000000000e-11 -9.100000000000000e-12 1.570000000000000e-11</ATTLIST>\n\t\t</ATTLISTList>\n\t</ATT>\n\t<TIL>\n\t\t<BANDID>P</BANDID>\n\t\t<NUMTILES>1</NUMTILES>\n\t\t<TILESIZEX>35170</TILESIZEX>\n\t\t<TILESIZEY>27576</TILESIZEY>\n\t\t<TILEUNITS>Pixels</TILEUNITS>\n\t\t<TILEOVERLAP>3545</TILEOVERLAP>\n\t\t<TILE>\n\t\t\t<FILENAME>07NOV25174027-P1BS_R1C1-005728210010_01_P001.TIF</FILENAME>\n\t\t\t<ULCOLOFFSET>0</ULCOLOFFSET>\n\t\t\t<ULROWOFFSET>0</ULROWOFFSET>\n\t\t\t<URCOLOFFSET>35169</URCOLOFFSET>\n\t\t\t<URROWOFFSET>0</URROWOFFSET>\n\t\t\t<LRCOLOFFSET>35169</LRCOLOFFSET>\n\t\t\t<LRROWOFFSET>27575</LRROWOFFSET>\n\t\t\t<LLCOLOFFSET>0</LLCOLOFFSET>\n\t\t\t<LLROWOFFSET>27575</LLROWOFFSET>\n\t\t\t<ULLON>-1.053955881000000e+02</ULLON>\n\t\t\t<ULLAT>3.980947709000000e+01</ULLAT>\n\t\t\t<URLON>-1.051834485800000e+02</URLON>\n\t\t\t<URLAT>3.981066533000000e+01</URLAT>\n\t\t\t<LRLON>-1.051836261900000e+02</LRLON>\n\t\t\t<LRLAT>3.968439626000000e+01</LRLAT>\n\t\t\t<LLLON>-1.053955469800000e+02</LLLON>\n\t\t\t<LLLAT>3.968329551000000e+01</LLLAT>\n\t\t</TILE>\n\t</TIL>\n\t<GEO>\n\t\t<EFFECTIVETIME>1432-09-18T00:00:00.000000Z</EFFECTIVETIME>\n\t\t<MODELGENERATIONTIME>1432-12-16T00:00:00.000000Z</MODELGENERATIONTIME>\n\t\t<SATID>Imaginary1</SATID>\n\t\t<GEOMODELLEVEL>LV1B</GEOMODELLEVEL>\n\t\t<PRINCIPAL_DISTANCE>\n\t\t\t<GENERATIONTIME>1432-12-05T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<PD>7.949165000000000e+03</PD>\n\t\t</PRINCIPAL_DISTANCE>\n\t\t<OPTICAL_DISTORTION>\n\t\t\t<GENERATIONTIME>2000-01-01T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<POLYORDER>0</POLYORDER>\n\t\t\t<ALIST>0.000000000000000e+00</ALIST>\n\t\t\t<BLIST>0.000000000000000e+00</BLIST>\n\t\t</OPTICAL_DISTORTION>\n\t\t<PERSPECTIVE_CENTER>\n\t\t\t<GENERATIONTIME>2000-01-01T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<CX>0.000000000000000e+00</CX>\n\t\t\t<CY>0.000000000000000e+00</CY>\n\t\t\t<CZ>0.000000000000000e+00</CZ>\n\t\t</PERSPECTIVE_CENTER>\n\t\t<CAMERA_ATTITUDE>\n\t\t\t<GENERATIONTIME>1432-06-08T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<QCS1>0.000000000000000e+00</QCS1>\n\t\t\t<QCS2>0.000000000000000e+00</QCS2>\n\t\t\t<QCS3>0.000000000000000e+00</QCS3>\n\t\t\t<QCS4>1.000000000000000e+00</QCS4>\n\t\t</CAMERA_ATTITUDE>\n\t\t<DETECTOR_MOUNTING>\n\t\t\t<GENERATIONTIME>1432-12-16T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<BAND_P>\n\t\t\t\t<BANDID>P</BANDID>\n\t\t\t\t<DETECTOR_ARRAY>\n\t\t\t\t\t<DETARRID>1</DETARRID>\n\t\t\t\t\t<DETORIGINX>5.372000000000000e-02</DETORIGINX>\n\t\t\t\t\t<DETORIGINY>1.407119300000000e+02</DETORIGINY>\n\t\t\t\t\t<DETROTANGLE>0.000000000000000e+00</DETROTANGLE>\n\t\t\t\t\t<DETPITCH>8.000000000000000e-03</DETPITCH>\n\t\t\t\t</DETECTOR_ARRAY>\n\t\t\t</BAND_P>\n\t\t</DETECTOR_MOUNTING>\n\t</GEO>\n</isd>\n"
  },
  {
    "path": "src/asp/Sessions/tests/dg_example3.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<isd>\n\t<IMD>\n\t\t<VERSION>Monkey</VERSION>\n\t\t<BANDID>P</BANDID>\n\t\t<NUMROWS>54272</NUMROWS>\n\t\t<NUMCOLUMNS>35840</NUMCOLUMNS>\n\t\t<BITSPERPIXEL>16</BITSPERPIXEL>\n\t\t<COMPRESSIONTYPE>JPEG2000</COMPRESSIONTYPE>\n\t\t<OUTPUTFORMAT>NITF21NCDRD</OUTPUTFORMAT>\n\t\t<IMAGE>\n\t\t\t<SATID>WV01</SATID>\n\t\t\t<MODE>FullSwath</MODE>\n\t\t\t<SCANDIRECTION>Forward</SCANDIRECTION>\n\t\t\t<TLCTIME>1959-11-15T22:24:14.209479Z</TLCTIME>\n\t\t\t<NUMTLC>1</NUMTLC>\n\t\t\t<TLCLISTList>\n\t\t\t\t<TLCLIST>1.010200000000000e+05 0.000000000000000e+00</TLCLIST>\n\t\t\t</TLCLISTList>\n\t\t\t<FIRSTLINETIME>1959-11-15T22:24:10.000312Z</FIRSTLINETIME>\n\t\t\t<AVGLINERATE>2.400000000000000e+04</AVGLINERATE>\n\t\t\t<EXPOSUREDURATION>1.333330000000000e-03</EXPOSUREDURATION>\n\t\t\t<MINCOLLECTEDROWGSD>5.820000000000000e-01</MINCOLLECTEDROWGSD>\n\t\t\t<MAXCOLLECTEDROWGSD>5.830000000000000e-01</MAXCOLLECTEDROWGSD>\n\t\t\t<MEANCOLLECTEDROWGSD>5.820000000000000e-01</MEANCOLLECTEDROWGSD>\n\t\t\t<MINCOLLECTEDCOLGSD>6.760000000000000e-01</MINCOLLECTEDCOLGSD>\n\t\t\t<MAXCOLLECTEDCOLGSD>6.820000000000001e-01</MAXCOLLECTEDCOLGSD>\n\t\t\t<MEANCOLLECTEDCOLGSD>6.790000000000000e-01</MEANCOLLECTEDCOLGSD>\n\t\t\t<MEANCOLLECTEDGSD>6.290000000000000e-01</MEANCOLLECTEDGSD>\n\t\t\t<MEANPRODUCTROWGSD>5.860000000000000e-01</MEANPRODUCTROWGSD>\n\t\t\t<MEANPRODUCTCOLGSD>6.770000000000000e-01</MEANPRODUCTCOLGSD>\n\t\t\t<MEANPRODUCTGSD>6.300000000000000e-01</MEANPRODUCTGSD>\n\t\t\t<ROWUNCERTAINTY>3.294000000000000e+01</ROWUNCERTAINTY>\n\t\t\t<COLUNCERTAINTY>7.561000000000000e+01</COLUNCERTAINTY>\n\t\t\t<MINSUNAZ>1.870000000000000e+02</MINSUNAZ>\n\t\t\t<MAXSUNAZ>1.871000000000000e+02</MAXSUNAZ>\n\t\t\t<MEANSUNAZ>1.871000000000000e+02</MEANSUNAZ>\n\t\t\t<MINSUNEL>4.390000000000000e+01</MINSUNEL>\n\t\t\t<MAXSUNEL>4.410000000000000e+01</MAXSUNEL>\n\t\t\t<MEANSUNEL>4.400000000000000e+01</MEANSUNEL>\n\t\t\t<MINSATAZ>2.570000000000000e+02</MINSATAZ>\n\t\t\t<MAXSATAZ>2.595000000000000e+02</MAXSATAZ>\n\t\t\t<MEANSATAZ>2.582000000000000e+02</MEANSATAZ>\n\t\t\t<MINSATEL>5.860000000000000e+01</MINSATEL>\n\t\t\t<MAXSATEL>5.950000000000000e+01</MAXSATEL>\n\t\t\t<MEANSATEL>5.910000000000000e+01</MEANSATEL>\n\t\t\t<MININTRACKVIEWANGLE>-1.780000000000000e+01</MININTRACKVIEWANGLE>\n\t\t\t<MAXINTRACKVIEWANGLE>-1.650000000000000e+01</MAXINTRACKVIEWANGLE>\n\t\t\t<MEANINTRACKVIEWANGLE>-1.710000000000000e+01</MEANINTRACKVIEWANGLE>\n\t\t\t<MINCROSSTRACKVIEWANGLE>-2.370000000000000e+01</MINCROSSTRACKVIEWANGLE>\n\t\t\t<MAXCROSSTRACKVIEWANGLE>-2.230000000000000e+01</MAXCROSSTRACKVIEWANGLE>\n\t\t\t<MEANCROSSTRACKVIEWANGLE>-2.300000000000000e+01</MEANCROSSTRACKVIEWANGLE>\n\t\t\t<MINOFFNADIRVIEWANGLE>2.830000000000000e+01</MINOFFNADIRVIEWANGLE>\n\t\t\t<MAXOFFNADIRVIEWANGLE>2.830000000000000e+01</MAXOFFNADIRVIEWANGLE>\n\t\t\t<MEANOFFNADIRVIEWANGLE>2.830000000000000e+01</MEANOFFNADIRVIEWANGLE>\n\t\t\t<PNIIRS>4.700000000000000e+00</PNIIRS>\n\t\t\t<CLOUDCOVER>2.000000000000000e-02</CLOUDCOVER>\n\t\t\t<RESAMPLINGKERNEL>CC</RESAMPLINGKERNEL>\n\t\t\t<POSITIONKNOWLEDGESRC>R</POSITIONKNOWLEDGESRC>\n\t\t\t<ATTITUDEKNOWLEDGESRC>R</ATTITUDEKNOWLEDGESRC>\n\t\t\t<REVNUMBER>26387</REVNUMBER>\n\t\t</IMAGE>\n\t</IMD>\n\t<EPH>\n\t\t<SATID>Imaginary1</SATID>\n\t\t<GENERATIONTIME>1959-11-15T23:10:47.429131Z</GENERATIONTIME>\n\t\t<STARTTIME>1959-11-15T22:23:59.803099Z</STARTTIME>\n\t\t<NUMPOINTS>1031</NUMPOINTS>\n\t\t<TIMEINTERVAL>2.000000000000000e-02</TIMEINTERVAL>\n\t\t<EPHEMLISTList>\n\t\t\t<EPHEMLIST>1.000000000000000e+00 -2.222801220490064e+06 -9.762394661473891e+05 6.418958437574347e+06 -7.264228935222518e+03 8.299702698268845e+00 -2.508742481120458e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.000000000000000e+00 -2.222946504075846e+06 -9.762392996922520e+05 6.418908261298127e+06 -7.264174485733922e+03 8.344852287009303e+00 -2.508900782518880e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.000000000000000e+00 -2.223091786556884e+06 -9.762391323337869e+05 6.418858081861349e+06 -7.264120031792038e+03 8.390002324739243e+00 -2.509059084882994e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.000000000000000e+00 -2.223237067967512e+06 -9.762389640727162e+05 6.418807899252011e+06 -7.264065574168916e+03 8.435152563402482e+00 -2.509217385983949e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.000000000000000e+00 -2.223382348290439e+06 -9.762387949086854e+05 6.418757713476153e+06 -7.264011112829769e+03 8.480302142865838e+00 -2.509375685868814e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.000000000000000e+00 -2.223527627557777e+06 -9.762386248423835e+05 6.418707524522544e+06 -7.263956647356594e+03 8.525451700741257e+00 -2.509533985774678e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.000000000000000e+00 -2.223672905672717e+06 -9.762384538717479e+05 6.418657332425038e+06 -7.263902179036207e+03 8.570601215894129e+00 -2.509692282012013e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.000000000000000e+00 -2.223818182667155e+06 -9.762382819974745e+05 6.418607137172480e+06 -7.263847707332437e+03 8.615749776792455e+00 -2.509850576062117e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.000000000000000e+00 -2.223963458703341e+06 -9.762381092230049e+05 6.418556938708129e+06 -7.263793230419710e+03 8.660899434079738e+00 -2.510008873281924e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.000000000000000e+01 -2.224108733619083e+06 -9.762379355449006e+05 6.418506737088706e+06 -7.263738750272652e+03 8.706048516209876e+00 -2.510167167910249e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.100000000000000e+01 -2.224254007414096e+06 -9.762377609631632e+05 6.418456532314301e+06 -7.263684266648410e+03 8.751197098205381e+00 -2.510325460647801e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.200000000000000e+01 -2.224399280023964e+06 -9.762375854764269e+05 6.418406324407458e+06 -7.263629780628594e+03 8.796345261921402e+00 -2.510483748400926e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.300000000000000e+01 -2.224544551707455e+06 -9.762374090901923e+05 6.418356113277656e+06 -7.263575288924545e+03 8.841494070283005e+00 -2.510642040656624e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.400000000000000e+01 -2.224689822205239e+06 -9.762372317989608e+05 6.418305899015607e+06 -7.263520794640564e+03 8.886642014386581e+00 -2.510800328429023e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.500000000000000e+01 -2.224835091614793e+06 -9.762370536048014e+05 6.418255681587212e+06 -7.263466296676665e+03 8.931790072653996e+00 -2.510958614929335e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.600000000000000e+01 -2.224980360000610e+06 -9.762368745090910e+05 6.418205460969910e+06 -7.263411794352536e+03 8.976938138653622e+00 -2.511116902099589e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.700000000000000e+01 -2.225125627265249e+06 -9.762366945097694e+05 6.418155237197781e+06 -7.263357288554137e+03 9.022085744384384e+00 -2.511275187373452e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.800000000000000e+01 -2.225270893506212e+06 -9.762365136089015e+05 6.418105010236717e+06 -7.263302778385054e+03 9.067233903704874e+00 -2.511433473380050e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.900000000000000e+01 -2.225416158593678e+06 -9.762363318037436e+05 6.418054780132135e+06 -7.263248265257948e+03 9.112381270213348e+00 -2.511591755991595e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.000000000000000e+01 -2.225561422624520e+06 -9.762361490963558e+05 6.418004546850143e+06 -7.263193748059746e+03 9.157528628190164e+00 -2.511750038443510e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.100000000000000e+01 -2.225706685534311e+06 -9.762359654853769e+05 6.417954310413283e+06 -7.263139227531511e+03 9.202675829184471e+00 -2.511908318604733e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.200000000000000e+01 -2.225851947290187e+06 -9.762357809701157e+05 6.417904070833060e+06 -7.263084704066678e+03 9.247822320081610e+00 -2.512066595315422e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.300000000000000e+01 -2.225997208022004e+06 -9.762355955533232e+05 6.417853828064018e+06 -7.263030176166919e+03 9.292969331345205e+00 -2.512224872940329e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.400000000000000e+01 -2.226142467664721e+06 -9.762354092336313e+05 6.417803582128925e+06 -7.262975644546981e+03 9.338115845718903e+00 -2.512383149371044e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.500000000000000e+01 -2.226287726218063e+06 -9.762352220110417e+05 6.417753333027874e+06 -7.262921109246512e+03 9.383262225226673e+00 -2.512541424516107e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.600000000000000e+01 -2.226432983649987e+06 -9.762350338848740e+05 6.417703080772087e+06 -7.262866570660811e+03 9.428408416583352e+00 -2.512699697240921e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.700000000000000e+01 -2.226578240057349e+06 -9.762348448571857e+05 6.417652825327642e+06 -7.262812027510614e+03 9.473554813452608e+00 -2.512857971230831e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.800000000000000e+01 -2.226723495342726e+06 -9.762346549259251e+05 6.417602566728654e+06 -7.262757481135056e+03 9.518700518051190e+00 -2.513016242598459e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.900000000000000e+01 -2.226868749474091e+06 -9.762344640904082e+05 6.417552304986341e+06 -7.262702931814838e+03 9.563846320463625e+00 -2.513174510588916e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.000000000000000e+01 -2.227014002677802e+06 -9.762342723554372e+05 6.417502040021427e+06 -7.262648376861761e+03 9.608992398810472e+00 -2.513332782905300e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.100000000000000e+01 -2.227159254662174e+06 -9.762340797148480e+05 6.417451771936062e+06 -7.262593819703276e+03 9.654137450870252e+00 -2.513491049660910e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.200000000000000e+01 -2.227304505589447e+06 -9.762338861720717e+05 6.417401500673431e+06 -7.262539258542560e+03 9.699283065144556e+00 -2.513649316093787e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.300000000000000e+01 -2.227449755426746e+06 -9.762336917264222e+05 6.417351226245038e+06 -7.262484693615137e+03 9.744427944044759e+00 -2.513807581451105e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.400000000000000e+01 -2.227595004174415e+06 -9.762334963779048e+05 6.417300948650766e+06 -7.262430125041596e+03 9.789573204960789e+00 -2.513965845455781e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.500000000000000e+01 -2.227740251864550e+06 -9.762333001272082e+05 6.417250667879372e+06 -7.262375552391281e+03 9.834718137910215e+00 -2.514124109296526e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.600000000000000e+01 -2.227885498367364e+06 -9.762331029715985e+05 6.417200383976322e+06 -7.262320977152334e+03 9.879862274242043e+00 -2.514282368688424e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.700000000000000e+01 -2.228030743845081e+06 -9.762329049144981e+05 6.417150096884779e+06 -7.262266397452642e+03 9.925007014233586e+00 -2.514440629071213e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.800000000000000e+01 -2.228175988297408e+06 -9.762327059559070e+05 6.417099806604841e+06 -7.262211813346097e+03 9.970151766529341e+00 -2.514598890254409e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.900000000000000e+01 -2.228321231529819e+06 -9.762325060917344e+05 6.417049513204670e+06 -7.262157226970944e+03 1.001529522587941e+01 -2.514757146044110e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.000000000000000e+01 -2.228466473736913e+06 -9.762323053260787e+05 6.416999216616081e+06 -7.262102636264811e+03 1.006043960728894e+01 -2.514915402472448e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.100000000000000e+01 -2.228611714918394e+06 -9.762321036589452e+05 6.416948916839161e+06 -7.262048040987794e+03 1.010558363612131e+01 -2.515073660147668e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.200000000000000e+01 -2.228756954976866e+06 -9.762319010882879e+05 6.416898613908052e+06 -7.261993442426713e+03 1.015072724613623e+01 -2.515231915386327e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.300000000000000e+01 -2.228902193847919e+06 -9.762316976127394e+05 6.416848307845327e+06 -7.261938841313643e+03 1.019587083757781e+01 -2.515390166120183e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.400000000000000e+01 -2.229047431693146e+06 -9.762314932357246e+05 6.416797998594352e+06 -7.261884235800171e+03 1.024101407028749e+01 -2.515548417612977e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.500000000000000e+01 -2.229192668447507e+06 -9.762312879558778e+05 6.416747686177910e+06 -7.261829626471571e+03 1.028615700328029e+01 -2.515706668195006e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.600000000000000e+01 -2.229337904176100e+06 -9.762310817745655e+05 6.416697370573186e+06 -7.261775012787320e+03 1.033130072362641e+01 -2.515864919476838e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.700000000000000e+01 -2.229483138748933e+06 -9.762308746890620e+05 6.416647051825749e+06 -7.261720396076477e+03 1.037644328533329e+01 -2.516023167542001e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.800000000000000e+01 -2.229628372166368e+06 -9.762306666993754e+05 6.416596729935484e+06 -7.261665776526232e+03 1.042158587045648e+01 -2.516181411927512e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.900000000000000e+01 -2.229773604622338e+06 -9.762304578095946e+05 6.416546404834370e+06 -7.261611151667031e+03 1.046672878972029e+01 -2.516339659709405e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.000000000000000e+01 -2.229918835922332e+06 -9.762302480156344e+05 6.416496076590627e+06 -7.261556523948009e+03 1.051187095258516e+01 -2.516497903822862e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.100000000000000e+01 -2.230064066099067e+06 -9.762300373181815e+05 6.416445745192776e+06 -7.261501892868266e+03 1.055701317409890e+01 -2.516656145748804e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.200000000000000e+01 -2.230209295217008e+06 -9.762298257186024e+05 6.416395410618213e+06 -7.261447257735346e+03 1.060215518674352e+01 -2.516814387449516e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.300000000000000e+01 -2.230354523243494e+06 -9.762296132162154e+05 6.416345072878383e+06 -7.261392618878507e+03 1.064729686610198e+01 -2.516972627976704e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.400000000000000e+01 -2.230499750178876e+06 -9.762293998110276e+05 6.416294731973168e+06 -7.261337976364875e+03 1.069243875764477e+01 -2.517130867171531e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.500000000000000e+01 -2.230644975990499e+06 -9.762291855023596e+05 6.416244387914021e+06 -7.261283330477082e+03 1.073758026670151e+01 -2.517289104190851e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.600000000000000e+01 -2.230790200775180e+06 -9.762289702922566e+05 6.416194040666972e+06 -7.261228680159393e+03 1.078272144299569e+01 -2.517447342053132e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.700000000000000e+01 -2.230935424500903e+06 -9.762287541800385e+05 6.416143690243252e+06 -7.261174025789190e+03 1.082786336016642e+01 -2.517605579744938e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.800000000000000e+01 -2.231080646940582e+06 -9.762285371609494e+05 6.416093336722544e+06 -7.261119369978144e+03 1.087300343663250e+01 -2.517763809652258e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.900000000000000e+01 -2.231225868483008e+06 -9.762283192431564e+05 6.416042979968419e+06 -7.261064708195913e+03 1.091814499134819e+01 -2.517922044912900e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.000000000000000e+01 -2.231371088868929e+06 -9.762281004212215e+05 6.415992620071852e+06 -7.261010043482304e+03 1.096328563680521e+01 -2.518080276702047e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.100000000000000e+01 -2.231516308098070e+06 -9.762278806951455e+05 6.415942257032936e+06 -7.260955375766701e+03 1.100842571129837e+01 -2.518238505242176e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.200000000000000e+01 -2.231661526364985e+06 -9.762276600690127e+05 6.415891890783393e+06 -7.260900702962906e+03 1.105356665069667e+01 -2.518396736576059e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.300000000000000e+01 -2.231806743475181e+06 -9.762274385387485e+05 6.415841521391477e+06 -7.260846027095205e+03 1.109870678948562e+01 -2.518554964823839e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.400000000000000e+01 -2.231951959493113e+06 -9.762272161057144e+05 6.415791148834573e+06 -7.260791347589407e+03 1.114384671169674e+01 -2.518713191660116e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.500000000000000e+01 -2.232097174419122e+06 -9.762269927699128e+05 6.415740773112552e+06 -7.260736664367016e+03 1.118898687759852e+01 -2.518871417336663e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.600000000000000e+01 -2.232242388188189e+06 -9.762267685299893e+05 6.415690394248253e+06 -7.260681978299654e+03 1.123412625559797e+01 -2.519029639303707e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.700000000000000e+01 -2.232387600929508e+06 -9.762265433886647e+05 6.415640012196300e+06 -7.260627287620798e+03 1.127926561376307e+01 -2.519187862649443e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.800000000000000e+01 -2.232532812578679e+06 -9.762263173445817e+05 6.415589626979313e+06 -7.260572593403761e+03 1.132440532427609e+01 -2.519346084332788e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.900000000000000e+01 -2.232678023135424e+06 -9.762260903977458e+05 6.415539238597381e+06 -7.260517895355776e+03 1.136954448954958e+01 -2.519504305135269e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.000000000000000e+01 -2.232823232631825e+06 -9.762258625488392e+05 6.415488847039239e+06 -7.260463193273370e+03 1.141468349157597e+01 -2.519662525660359e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.100000000000000e+01 -2.232968440971130e+06 -9.762256337958288e+05 6.415438452338867e+06 -7.260408488275263e+03 1.145982251189335e+01 -2.519820742726959e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.200000000000000e+01 -2.233113648282305e+06 -9.762254041414303e+05 6.415388054450966e+06 -7.260353778803772e+03 1.150496125142513e+01 -2.519978960761429e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.300000000000000e+01 -2.233258854403869e+06 -9.762251735822582e+05 6.415337653432260e+06 -7.260299066839841e+03 1.155009965144654e+01 -2.520137174108826e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.400000000000000e+01 -2.233404059562107e+06 -9.762249421230612e+05 6.415287249203252e+06 -7.260244349547578e+03 1.159523835622798e+01 -2.520295390897845e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.500000000000000e+01 -2.233549263594901e+06 -9.762247097604516e+05 6.415236841820893e+06 -7.260189628995202e+03 1.164037674038130e+01 -2.520453605190823e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.600000000000000e+01 -2.233694466502584e+06 -9.762244764944320e+05 6.415186431285064e+06 -7.260134905073769e+03 1.168551503966358e+01 -2.520611817312907e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.700000000000000e+01 -2.233839668284889e+06 -9.762242423250092e+05 6.415136017595867e+06 -7.260080177949525e+03 1.173065270658770e+01 -2.520770026757359e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.800000000000000e+01 -2.233984869103350e+06 -9.762240072555718e+05 6.415085600696528e+06 -7.260025445461680e+03 1.177579085473053e+01 -2.520928239753083e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.900000000000000e+01 -2.234130068634665e+06 -9.762237712793498e+05 6.415035180700669e+06 -7.259970711725101e+03 1.182092812756582e+01 -2.521086444484370e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.000000000000000e+01 -2.234275267169838e+06 -9.762235344024400e+05 6.414984757506018e+06 -7.259915973070715e+03 1.186606563038612e+01 -2.521244651480436e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.100000000000000e+01 -2.234420464676210e+06 -9.762232966241736e+05 6.414934331124042e+06 -7.259861229880657e+03 1.191120285547586e+01 -2.521402859620641e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.200000000000000e+01 -2.234565660927587e+06 -9.762230579398110e+05 6.414883901634256e+06 -7.259806485047723e+03 1.195633975969261e+01 -2.521561060654926e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.300000000000000e+01 -2.234710856247112e+06 -9.762228183561236e+05 6.414833468923065e+06 -7.259751734481379e+03 1.200147690605573e+01 -2.521719266278977e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.400000000000000e+01 -2.234856050343854e+06 -9.762225778670256e+05 6.414783033092739e+06 -7.259696981809532e+03 1.204661349294980e+01 -2.521877466102363e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.500000000000000e+01 -2.235001243476440e+06 -9.762223364779343e+05 6.414732594052361e+06 -7.259642223963780e+03 1.209175037724762e+01 -2.522035668923075e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.600000000000000e+01 -2.235146435450409e+06 -9.762220941847885e+05 6.414682151870287e+06 -7.259587463061913e+03 1.213688678688615e+01 -2.522193868658212e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.700000000000000e+01 -2.235291626330823e+06 -9.762218509889505e+05 6.414631706523646e+06 -7.259532698520458e+03 1.218202318349526e+01 -2.522352066998567e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.800000000000000e+01 -2.235436816085049e+06 -9.762216068897469e+05 6.414581258023915e+06 -7.259477930737672e+03 1.222715906115926e+01 -2.522510262779043e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.900000000000000e+01 -2.235582004777521e+06 -9.762213618885298e+05 6.414530806348430e+06 -7.259423158741884e+03 1.227229489841977e+01 -2.522668458797272e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.000000000000000e+01 -2.235727192376221e+06 -9.762211159846276e+05 6.414480351508453e+06 -7.259368383166193e+03 1.231743091646842e+01 -2.522826653262292e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.100000000000000e+01 -2.235872378880870e+06 -9.762208691780441e+05 6.414429893504078e+06 -7.259313603861609e+03 1.236256651099424e+01 -2.522984846562532e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.200000000000000e+01 -2.236017564291180e+06 -9.762206214687856e+05 6.414379432335405e+06 -7.259258820796190e+03 1.240770166846443e+01 -2.523143038788194e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.300000000000000e+01 -2.236162748672220e+06 -9.762203728581974e+05 6.414328967979542e+06 -7.259204033349939e+03 1.245283771579639e+01 -2.523301231784594e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.400000000000000e+01 -2.236307931829539e+06 -9.762201233422413e+05 6.414278500504896e+06 -7.259149243710093e+03 1.249797232343923e+01 -2.523459419182035e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.500000000000000e+01 -2.236453113957023e+06 -9.762198729249669e+05 6.414228029843255e+06 -7.259094449551018e+03 1.254310713991018e+01 -2.523617607703827e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.600000000000000e+01 -2.236598294990293e+06 -9.762196216050296e+05 6.414177556017272e+06 -7.259039651837827e+03 1.258824205282934e+01 -2.523775794594038e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.700000000000000e+01 -2.236743474928858e+06 -9.762193693824258e+05 6.414127079027112e+06 -7.258984850307414e+03 1.263337661651954e+01 -2.523933980575478e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.800000000000000e+01 -2.236888653773058e+06 -9.762191162571677e+05 6.414076598872654e+06 -7.258930045092889e+03 1.267851119546941e+01 -2.524092165290757e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.900000000000000e+01 -2.237033831522614e+06 -9.762188622292544e+05 6.414026115554004e+06 -7.258875236283315e+03 1.272364548537760e+01 -2.524250348468134e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.000000000000000e+02 -2.237179008177243e+06 -9.762186072986869e+05 6.413975629071249e+06 -7.258820423628122e+03 1.276877946701507e+01 -2.524408530819973e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.010000000000000e+02 -2.237324183737284e+06 -9.762183514654727e+05 6.413925139424276e+06 -7.258765607393474e+03 1.281391363039870e+01 -2.524566711617592e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.020000000000000e+02 -2.237469358202461e+06 -9.762180947296120e+05 6.413874646613175e+06 -7.258710787404982e+03 1.285904745948585e+01 -2.524724891326777e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.030000000000000e+02 -2.237614531540130e+06 -9.762178370904400e+05 6.413824150649443e+06 -7.258655964091753e+03 1.290418067254296e+01 -2.524883068709224e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.040000000000000e+02 -2.237759703880065e+06 -9.762175785506460e+05 6.413773651487384e+06 -7.258601135960711e+03 1.294931470417561e+01 -2.525041248100494e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.050000000000000e+02 -2.237904875060202e+06 -9.762173191068711e+05 6.413723149184061e+06 -7.258546304898764e+03 1.299444801357913e+01 -2.525199424037628e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.060000000000000e+02 -2.238050045144961e+06 -9.762170587604665e+05 6.413672643716792e+06 -7.258491470154736e+03 1.303958089206824e+01 -2.525357598676294e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.070000000000000e+02 -2.238195214069976e+06 -9.762167975100846e+05 6.413622135108234e+06 -7.258436632497100e+03 1.308471377753938e+01 -2.525515769855603e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.080000000000000e+02 -2.238340382028903e+06 -9.762165353597695e+05 6.413571623290197e+06 -7.258381789524863e+03 1.312984674162479e+01 -2.525673944412663e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.090000000000000e+02 -2.238485548827939e+06 -9.762162723054867e+05 6.413521108330927e+06 -7.258326943710266e+03 1.317497961020925e+01 -2.525832115301499e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.100000000000000e+02 -2.238630714531518e+06 -9.762160083485870e+05 6.413470590207731e+06 -7.258272094164469e+03 1.322011201213007e+01 -2.525990285029555e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.110000000000000e+02 -2.238775879074641e+06 -9.762157434877256e+05 6.413420068943502e+06 -7.258217241695473e+03 1.326524379812162e+01 -2.526148451289161e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.120000000000000e+02 -2.238921042619438e+06 -9.762154777262689e+05 6.413369544481131e+06 -7.258162384361181e+03 1.331037639714327e+01 -2.526306619690600e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.130000000000000e+02 -2.239066205100908e+06 -9.762152110628781e+05 6.413319016843514e+06 -7.258107523005404e+03 1.335550855378418e+01 -2.526464787758278e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.140000000000000e+02 -2.239211366356991e+06 -9.762149434941910e+05 6.413268486087734e+06 -7.258052659405057e+03 1.340063987367506e+01 -2.526622950414279e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.150000000000000e+02 -2.239356526582169e+06 -9.762146750242474e+05 6.413217952145283e+06 -7.257997791380055e+03 1.344577189782981e+01 -2.526781113951593e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.160000000000000e+02 -2.239501685776153e+06 -9.762144056530467e+05 6.413167415016256e+06 -7.257942918936678e+03 1.349090354367263e+01 -2.526939278287700e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.170000000000000e+02 -2.239646843809247e+06 -9.762141353779093e+05 6.413116874746353e+06 -7.257888043542704e+03 1.353603462519621e+01 -2.527097439237044e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.180000000000000e+02 -2.239792000714139e+06 -9.762138641995051e+05 6.413066331324050e+06 -7.257833164788782e+03 1.358116596289108e+01 -2.527255598012709e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.190000000000000e+02 -2.239937156555261e+06 -9.762135921191864e+05 6.413015784726644e+06 -7.257778281996555e+03 1.362629683741818e+01 -2.527413756501176e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.200000000000000e+02 -2.240082311267627e+06 -9.762133191356109e+05 6.412965234977036e+06 -7.257723395846137e+03 1.367142728365351e+01 -2.527571912770568e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.210000000000000e+02 -2.240227464916276e+06 -9.762130452501222e+05 6.412914682052304e+06 -7.257668505731452e+03 1.371655814976131e+01 -2.527730068594445e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.220000000000000e+02 -2.240372617468380e+06 -9.762127704620570e+05 6.412864125964013e+06 -7.257613611769129e+03 1.376168843452439e+01 -2.527888223581780e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.230000000000000e+02 -2.240517768859562e+06 -9.762124947700753e+05 6.412813566734860e+06 -7.257558714994874e+03 1.380681859277024e+01 -2.528046374815280e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.240000000000000e+02 -2.240662919283665e+06 -9.762122181782009e+05 6.412763004296507e+06 -7.257503812955139e+03 1.385194911885978e+01 -2.528204529298786e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.250000000000000e+02 -2.240808068578638e+06 -9.762119406830877e+05 6.412712438706077e+06 -7.257448907563024e+03 1.389707906606932e+01 -2.528362681537865e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.260000000000000e+02 -2.240953216680118e+06 -9.762116622834007e+05 6.412661869986271e+06 -7.257393999715789e+03 1.394220868099927e+01 -2.528520828997244e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.270000000000000e+02 -2.241098363814296e+06 -9.762113829838259e+05 6.412611298057325e+06 -7.257339086551678e+03 1.398733883403418e+01 -2.528678979861807e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.280000000000000e+02 -2.241243509786766e+06 -9.762111027803574e+05 6.412560722987795e+06 -7.257284170495755e+03 1.403246788271849e+01 -2.528837127142319e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.290000000000000e+02 -2.241388654694941e+06 -9.762108216750009e+05 6.412510144743327e+06 -7.257229250391219e+03 1.407759772811559e+01 -2.528995274238589e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.300000000000000e+02 -2.241533798473824e+06 -9.762105396664226e+05 6.412459563346838e+06 -7.257174326880126e+03 1.412272688057669e+01 -2.529153419238172e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.310000000000000e+02 -2.241678941123131e+06 -9.762102567546257e+05 6.412408978798431e+06 -7.257119400170441e+03 1.416785541164100e+01 -2.529311561554646e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.320000000000000e+02 -2.241824082740265e+06 -9.762099729416216e+05 6.412358391063746e+06 -7.257064468876752e+03 1.421298460543133e+01 -2.529469705199851e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.330000000000000e+02 -2.241969223227685e+06 -9.762096882254049e+05 6.412307800177196e+06 -7.257009534398043e+03 1.425811314586315e+01 -2.529627846121542e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.340000000000000e+02 -2.242114362553373e+06 -9.762094026053112e+05 6.412257206150069e+06 -7.256954596915437e+03 1.430324147761286e+01 -2.529785983831823e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.350000000000000e+02 -2.242259500846461e+06 -9.762091160840229e+05 6.412206608936815e+06 -7.256899655045789e+03 1.434836967098028e+01 -2.529944122263723e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.360000000000000e+02 -2.242404638041959e+06 -9.762088286601984e+05 6.412156008560349e+06 -7.256844709390247e+03 1.439349773872337e+01 -2.530102259710312e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.370000000000000e+02 -2.242549774140209e+06 -9.762085403338455e+05 6.412105405020556e+06 -7.256789760042549e+03 1.443862591904534e+01 -2.530260395919343e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.380000000000000e+02 -2.242694909205632e+06 -9.762082511063053e+05 6.412054798294704e+06 -7.256734806323733e+03 1.448375396754145e+01 -2.530418532804445e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.390000000000000e+02 -2.242840043108546e+06 -9.762079609749037e+05 6.412004188428550e+06 -7.256679849582729e+03 1.452888152462177e+01 -2.530576666513799e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.400000000000000e+02 -2.242985175946337e+06 -9.762076699416512e+05 6.411953575387725e+06 -7.256624888806558e+03 1.457400937302461e+01 -2.530734799970012e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.410000000000000e+02 -2.243130307589334e+06 -9.762073780038803e+05 6.411902959217998e+06 -7.256569925476476e+03 1.461913631551479e+01 -2.530892928897020e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.420000000000000e+02 -2.243275438198995e+06 -9.762070851649317e+05 6.411852339862377e+06 -7.256514957675060e+03 1.466426326299987e+01 -2.531051058792454e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.430000000000000e+02 -2.243420567678615e+06 -9.762067914228066e+05 6.411801717354999e+06 -7.256459986600454e+03 1.470939034221655e+01 -2.531209186262157e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.440000000000000e+02 -2.243565696092617e+06 -9.762064967788439e+05 6.411751091673122e+06 -7.256405011434294e+03 1.475451709470633e+01 -2.531367313602305e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.450000000000000e+02 -2.243710823440713e+06 -9.762062012330471e+05 6.411700462816841e+06 -7.256350032168037e+03 1.479964362683387e+01 -2.531525440843197e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.460000000000000e+02 -2.243855949658542e+06 -9.762059047840799e+05 6.411649830808877e+06 -7.256295049635913e+03 1.484477039965543e+01 -2.531683565644057e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.470000000000000e+02 -2.244001074777972e+06 -9.762056074326185e+05 6.411599195637976e+06 -7.256240063298557e+03 1.488989651474790e+01 -2.531841689482989e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.480000000000000e+02 -2.244146198734652e+06 -9.762053091773308e+05 6.411548557326872e+06 -7.256185074187699e+03 1.493502257952642e+01 -2.531999809467945e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.490000000000000e+02 -2.244291321754723e+06 -9.762050100228870e+05 6.411497915795693e+06 -7.256130079361819e+03 1.498014903005921e+01 -2.532157933971541e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.500000000000000e+02 -2.244436443579126e+06 -9.762047099639594e+05 6.411447271135923e+06 -7.256075081946569e+03 1.502527449741578e+01 -2.532316054043858e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.510000000000000e+02 -2.244581564208211e+06 -9.762044090005468e+05 6.411396623347455e+06 -7.256020082139426e+03 1.507040007376628e+01 -2.532474169189424e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.520000000000000e+02 -2.244726683835776e+06 -9.762041071366593e+05 6.411345972361827e+06 -7.255965077377676e+03 1.511552537754619e+01 -2.532632286656735e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.530000000000000e+02 -2.244871802429182e+06 -9.762038043716216e+05 6.411295318190562e+06 -7.255910068159348e+03 1.516065091413142e+01 -2.532790405061939e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.540000000000000e+02 -2.245016919859400e+06 -9.762035007027850e+05 6.411244660879246e+06 -7.255855056077799e+03 1.520577622015389e+01 -2.532948519857866e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.550000000000000e+02 -2.245162036190828e+06 -9.762031961314733e+05 6.411194000405123e+06 -7.255800040267183e+03 1.525090130833880e+01 -2.533106633501543e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.560000000000000e+02 -2.245307151390841e+06 -9.762028906570346e+05 6.411143336779720e+06 -7.255745021103322e+03 1.529602554176321e+01 -2.533264744889782e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.570000000000000e+02 -2.245452265492130e+06 -9.762025842801320e+05 6.411092669991486e+06 -7.255689998274752e+03 1.534115029319969e+01 -2.533422854986494e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.580000000000000e+02 -2.245597378558898e+06 -9.762022770021001e+05 6.411042000017733e+06 -7.255634971003892e+03 1.538627478482707e+01 -2.533580965951110e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.590000000000000e+02 -2.245742490494446e+06 -9.762019688209493e+05 6.410991326892632e+06 -7.255579940414762e+03 1.543139918742489e+01 -2.533739074606035e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.600000000000000e+02 -2.245887601330840e+06 -9.762016597373436e+05 6.410940650604848e+06 -7.255524906146361e+03 1.547652341326278e+01 -2.533897181969895e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.610000000000000e+02 -2.246032711067799e+06 -9.762013497512885e+05 6.410889971154479e+06 -7.255469868133749e+03 1.552164718864483e+01 -2.534055288210798e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.620000000000000e+02 -2.246177819770346e+06 -9.762010388641167e+05 6.410839288518536e+06 -7.255414825672724e+03 1.556677156189980e+01 -2.534213395386400e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.630000000000000e+02 -2.246322927276490e+06 -9.762007270725099e+05 6.410788602754284e+06 -7.255359780669723e+03 1.561189493900267e+01 -2.534371497998826e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.640000000000000e+02 -2.246468033715319e+06 -9.762004143791284e+05 6.410737913816092e+06 -7.255304731638615e+03 1.565701823557464e+01 -2.534529600314765e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.650000000000000e+02 -2.246613139054828e+06 -9.762001007833097e+05 6.410687221715266e+06 -7.255249678860847e+03 1.570214175510915e+01 -2.534687701554052e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.660000000000000e+02 -2.246758243294743e+06 -9.761997862850594e+05 6.410636526451908e+06 -7.255194622433674e+03 1.574726483672438e+01 -2.534845801402397e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.670000000000000e+02 -2.246903346434780e+06 -9.761994708843809e+05 6.410585828026114e+06 -7.255139562244740e+03 1.579238767329514e+01 -2.535003900189502e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.680000000000000e+02 -2.247048448475275e+06 -9.761991545812733e+05 6.410535126437766e+06 -7.255084498446680e+03 1.583751068097655e+01 -2.535161997507118e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.690000000000000e+02 -2.247193549415949e+06 -9.761988373757456e+05 6.410484421686955e+06 -7.255029430872703e+03 1.588263323008761e+01 -2.535320093791124e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.700000000000000e+02 -2.247338649256526e+06 -9.761985192678004e+05 6.410433713773784e+06 -7.254974359611382e+03 1.592775547451049e+01 -2.535478188799522e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.710000000000000e+02 -2.247483747932653e+06 -9.761982002561082e+05 6.410383002721014e+06 -7.254919285521721e+03 1.597287775645054e+01 -2.535636280118624e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.720000000000000e+02 -2.247628845573216e+06 -9.761978803433324e+05 6.410332288483055e+06 -7.254864206869844e+03 1.601799962533593e+01 -2.535794372634580e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.730000000000000e+02 -2.247773942178557e+06 -9.761975595294730e+05 6.410281571059783e+06 -7.254809123832198e+03 1.606312209584587e+01 -2.535952465906213e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.740000000000000e+02 -2.247919037554342e+06 -9.761972378105585e+05 6.410230850519938e+06 -7.254754038556172e+03 1.610824347513730e+01 -2.536110553751933e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.750000000000000e+02 -2.248064131894339e+06 -9.761969151905648e+05 6.410180126794977e+06 -7.254698948878755e+03 1.615336497973783e+01 -2.536268642369822e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.760000000000000e+02 -2.248209225198892e+06 -9.761965916694980e+05 6.410129399884772e+06 -7.254643854700857e+03 1.619848700995956e+01 -2.536426732063420e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.770000000000000e+02 -2.248354317370688e+06 -9.761962672453696e+05 6.410078669823746e+06 -7.254588757202484e+03 1.624360842950477e+01 -2.536584819424367e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.780000000000000e+02 -2.248499408409451e+06 -9.761959419181907e+05 6.410027936612004e+06 -7.254533656403550e+03 1.628872929972317e+01 -2.536742904400086e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.790000000000000e+02 -2.248644498250844e+06 -9.761956156866340e+05 6.409977200272321e+06 -7.254478553138179e+03 1.633385005295492e+01 -2.536900984654151e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.800000000000000e+02 -2.248789587088623e+06 -9.761952885546798e+05 6.409926460736115e+06 -7.254423444958733e+03 1.637897069312925e+01 -2.537059067117581e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.810000000000000e+02 -2.248934674825490e+06 -9.761949605203446e+05 6.409875718037823e+06 -7.254368333111297e+03 1.642409107915265e+01 -2.537217148253622e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.820000000000000e+02 -2.249079761558804e+06 -9.761946315856120e+05 6.409824972142980e+06 -7.254313216368403e+03 1.646921234929860e+01 -2.537375231603338e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.830000000000000e+02 -2.249224847029350e+06 -9.761943017451941e+05 6.409774223143336e+06 -7.254258097858086e+03 1.651433211845256e+01 -2.537533308172713e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.840000000000000e+02 -2.249369931463862e+06 -9.761939710037307e+05 6.409723470958643e+06 -7.254202974935145e+03 1.655945232155528e+01 -2.537691385562714e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.850000000000000e+02 -2.249515014797376e+06 -9.761936393598962e+05 6.409672715611886e+06 -7.254147848334892e+03 1.660457236583454e+01 -2.537849461657293e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.860000000000000e+02 -2.249660096964919e+06 -9.761933068123778e+05 6.409621957126074e+06 -7.254092718746881e+03 1.664969143769287e+01 -2.538007534457659e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.870000000000000e+02 -2.249805178160877e+06 -9.761929733651361e+05 6.409571195432371e+06 -7.254037583942979e+03 1.669481169644769e+01 -2.538165610395130e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.880000000000000e+02 -2.249950258223276e+06 -9.761926390148759e+05 6.409520430588134e+06 -7.253982445848387e+03 1.673993131166571e+01 -2.538323683914665e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.890000000000000e+02 -2.250095337119489e+06 -9.761923037609409e+05 6.409469662604916e+06 -7.253927304822898e+03 1.678505010042818e+01 -2.538481753987874e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.900000000000000e+02 -2.250240414946879e+06 -9.761919676053105e+05 6.409418891448236e+06 -7.253872159722872e+03 1.683016952809135e+01 -2.538639823936006e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.910000000000000e+02 -2.250385491672823e+06 -9.761916305473369e+05 6.409368117129645e+06 -7.253817010897326e+03 1.687528830231508e+01 -2.538797892696417e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.920000000000000e+02 -2.250530567329373e+06 -9.761912925876711e+05 6.409317339637788e+06 -7.253761858023312e+03 1.692040715958294e+01 -2.538955961225416e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.930000000000000e+02 -2.250675641884537e+06 -9.761909537256636e+05 6.409266558983996e+06 -7.253706701446583e+03 1.696552618351660e+01 -2.539114028549588e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.940000000000000e+02 -2.250820715273364e+06 -9.761906139600022e+05 6.409215775191281e+06 -7.253651541964365e+03 1.701064428619634e+01 -2.539272092350879e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.950000000000000e+02 -2.250965787592576e+06 -9.761902732926632e+05 6.409164988225373e+06 -7.253596378377165e+03 1.705576232754885e+01 -2.539430156072201e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.960000000000000e+02 -2.251110858810187e+06 -9.761899317229933e+05 6.409114198097605e+06 -7.253541211116544e+03 1.710088073958048e+01 -2.539588218517780e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.970000000000000e+02 -2.251255928861023e+06 -9.761895892496754e+05 6.409063404831070e+06 -7.253486040954023e+03 1.714599804151328e+01 -2.539746277420089e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.980000000000000e+02 -2.251400997939448e+06 -9.761892458766667e+05 6.409012608356888e+06 -7.253430865500102e+03 1.719111634927393e+01 -2.539904339658987e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.990000000000000e+02 -2.251546065851166e+06 -9.761889016000225e+05 6.408961808743915e+06 -7.253375687162015e+03 1.723623381542677e+01 -2.540062398320029e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.000000000000000e+02 -2.251691132692903e+06 -9.761885564217156e+05 6.408911005957865e+06 -7.253320504705408e+03 1.728135125337496e+01 -2.540220456940704e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.010000000000000e+02 -2.251836198335653e+06 -9.761882103391176e+05 6.408860200044472e+06 -7.253265319821745e+03 1.732646842368732e+01 -2.540378510724880e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.020000000000000e+02 -2.251981263005489e+06 -9.761878633568403e+05 6.408809390923590e+06 -7.253210129592512e+03 1.737158578368823e+01 -2.540536567950292e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.030000000000000e+02 -2.252126326540447e+06 -9.761875154715970e+05 6.408758578652632e+06 -7.253154936041372e+03 1.741670272552642e+01 -2.540694622860402e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.040000000000000e+02 -2.252271388908538e+06 -9.761871666827336e+05 6.408707763242941e+06 -7.253099739613159e+03 1.746181940209743e+01 -2.540852674206894e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.050000000000000e+02 -2.252416450141820e+06 -9.761868169909077e+05 6.408656944683155e+06 -7.253044539917420e+03 1.750693576848221e+01 -2.541010723091247e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.060000000000000e+02 -2.252561510401667e+06 -9.761864663994181e+05 6.408606122916052e+06 -7.252989334936833e+03 1.755205205934448e+01 -2.541168775228591e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.070000000000000e+02 -2.252706569429767e+06 -9.761861149030013e+05 6.408555298033222e+06 -7.252934127824682e+03 1.759716833890374e+01 -2.541326821710551e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.080000000000000e+02 -2.252851627354954e+06 -9.761857625042954e+05 6.408504469988983e+06 -7.252878917005045e+03 1.764228375235842e+01 -2.541484866941941e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.090000000000000e+02 -2.252996684306909e+06 -9.761854092059255e+05 6.408453638737344e+06 -7.252823700979831e+03 1.768740029542960e+01 -2.541642915270889e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.100000000000000e+02 -2.253141740091343e+06 -9.761850550039602e+05 6.408402804347203e+06 -7.252768482000935e+03 1.773251588106552e+01 -2.541800960213626e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.110000000000000e+02 -2.253286794804986e+06 -9.761846999003693e+05 6.408351966784251e+06 -7.252713258920556e+03 1.777763145829954e+01 -2.541959005068087e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.120000000000000e+02 -2.253431848383504e+06 -9.761843438938425e+05 6.408301126071312e+06 -7.252658032596400e+03 1.782274708139130e+01 -2.542117047414124e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.130000000000000e+02 -2.253576900826617e+06 -9.761839869843854e+05 6.408250282208480e+06 -7.252602802923892e+03 1.786786211529096e+01 -2.542275087510828e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.140000000000000e+02 -2.253721952134045e+06 -9.761836291720015e+05 6.408199435195860e+06 -7.252547569977336e+03 1.791297649373871e+01 -2.542433125144715e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.150000000000000e+02 -2.253867002435461e+06 -9.761832704593166e+05 6.408148584987444e+06 -7.252492332171183e+03 1.795809184761706e+01 -2.542591164888202e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.160000000000000e+02 -2.254012051665914e+06 -9.761829108450237e+05 6.408097731606266e+06 -7.252437090256649e+03 1.800320685291084e+01 -2.542749204542732e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.170000000000000e+02 -2.254157099728132e+06 -9.761825503271590e+05 6.408046875086843e+06 -7.252381845418506e+03 1.804832110851902e+01 -2.542907240739207e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.180000000000000e+02 -2.254302146687111e+06 -9.761821889070326e+05 6.407996015406108e+06 -7.252326596849948e+03 1.809343581358942e+01 -2.543065275825335e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.190000000000000e+02 -2.254447192477921e+06 -9.761818265833430e+05 6.407945152587113e+06 -7.252271345475277e+03 1.813854964321774e+01 -2.543223307115012e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.200000000000000e+02 -2.254592237294252e+06 -9.761814633600246e+05 6.407894286561110e+06 -7.252216088818151e+03 1.818366368596332e+01 -2.543381341663135e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.210000000000000e+02 -2.254737280974802e+06 -9.761810992338011e+05 6.407843417385344e+06 -7.252160828825191e+03 1.822877803829599e+01 -2.543539373978544e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.220000000000000e+02 -2.254882323519072e+06 -9.761807342046768e+05 6.407792545059989e+06 -7.252105565497838e+03 1.827389152959029e+01 -2.543697403990095e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.230000000000000e+02 -2.255027364862756e+06 -9.761803682713486e+05 6.407741669607882e+06 -7.252050299741470e+03 1.831900468667067e+01 -2.543855429172573e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.240000000000000e+02 -2.255172405199546e+06 -9.761800014377495e+05 6.407690790960260e+06 -7.251995029056159e+03 1.836411801211739e+01 -2.544013456611972e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.250000000000000e+02 -2.255317444432172e+06 -9.761796337019160e+05 6.407639909151650e+06 -7.251939754723710e+03 1.840923090235506e+01 -2.544171482655080e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.260000000000000e+02 -2.255462482593299e+06 -9.761792650645007e+05 6.407589024170448e+06 -7.251884476245212e+03 1.845434453793041e+01 -2.544329508777763e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.270000000000000e+02 -2.255607519585665e+06 -9.761788955235548e+05 6.407538136051194e+06 -7.251829194908614e+03 1.849945697703268e+01 -2.544487531233613e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.280000000000000e+02 -2.255752555538298e+06 -9.761785250816899e+05 6.407487244748071e+06 -7.251773909084455e+03 1.854456967744179e+01 -2.544645554704907e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.290000000000000e+02 -2.255897590419215e+06 -9.761781537382563e+05 6.407436350272426e+06 -7.251718619158844e+03 1.858968284791806e+01 -2.544803578113645e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.300000000000000e+02 -2.256042624066499e+06 -9.761777814899941e+05 6.407385452681773e+06 -7.251663327138933e+03 1.863479462323534e+01 -2.544961595689556e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.310000000000000e+02 -2.256187656673824e+06 -9.761774083408242e+05 6.407334551907319e+06 -7.251608030586530e+03 1.867990669366881e+01 -2.545119614409290e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.320000000000000e+02 -2.256332688209211e+06 -9.761770342900966e+05 6.407283647960421e+06 -7.251552730011998e+03 1.872501900665185e+01 -2.545277632829525e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.330000000000000e+02 -2.256477718575184e+06 -9.761766593358547e+05 6.407232740875702e+06 -7.251497426506449e+03 1.877013043759834e+01 -2.545435647807777e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.340000000000000e+02 -2.256622747901402e+06 -9.761762834807161e+05 6.407181830607105e+06 -7.251442118507946e+03 1.881524252866518e+01 -2.545593663838546e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.350000000000000e+02 -2.256767776090594e+06 -9.761759067227234e+05 6.407130917189181e+06 -7.251386807237426e+03 1.886035397930775e+01 -2.545751677403237e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.360000000000000e+02 -2.256912803174808e+06 -9.761755290625326e+05 6.407080000610543e+06 -7.251331492235109e+03 1.890546513535401e+01 -2.545909689818640e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.370000000000000e+02 -2.257057829122053e+06 -9.761751504994944e+05 6.407029080882560e+06 -7.251276173953891e+03 1.895057625941448e+01 -2.546067699822551e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.380000000000000e+02 -2.257202854029040e+06 -9.761747710355732e+05 6.406978157970867e+06 -7.251220851246625e+03 1.899568739066532e+01 -2.546225710652249e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.390000000000000e+02 -2.257347877798504e+06 -9.761743906688158e+05 6.406927231910021e+06 -7.251165525156393e+03 1.904079786319170e+01 -2.546383719328089e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.400000000000000e+02 -2.257492900463105e+06 -9.761740093998696e+05 6.406876302688416e+06 -7.251110195440440e+03 1.908590893363726e+01 -2.546541726606543e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.410000000000000e+02 -2.257637922054892e+06 -9.761736272293968e+05 6.406825370294660e+06 -7.251054861600452e+03 1.913101941590381e+01 -2.546699733824709e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.420000000000000e+02 -2.257782942476608e+06 -9.761732441554450e+05 6.406774434763321e+06 -7.250999524862002e+03 1.917612925975487e+01 -2.546857737524530e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.430000000000000e+02 -2.257927961760926e+06 -9.761728601786678e+05 6.406723496082791e+06 -7.250944184831238e+03 1.922123933909918e+01 -2.547015738866589e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.440000000000000e+02 -2.258072980069175e+06 -9.761724753023235e+05 6.406672554195707e+06 -7.250888839507771e+03 1.926634974175323e+01 -2.547173743494609e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.450000000000000e+02 -2.258217997174809e+06 -9.761720895218625e+05 6.406621609182614e+06 -7.250833491685590e+03 1.931145895573098e+01 -2.547331743446496e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.460000000000000e+02 -2.258363013207464e+06 -9.761717028398879e+05 6.406570660997418e+06 -7.250778139822411e+03 1.935656883872301e+01 -2.547489743175607e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.470000000000000e+02 -2.258508028134332e+06 -9.761713152557552e+05 6.406519709651785e+06 -7.250722784229424e+03 1.940167797620390e+01 -2.547647741724049e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.480000000000000e+02 -2.258653041955751e+06 -9.761709267694647e+05 6.406468755145592e+06 -7.250667424936108e+03 1.944678753119149e+01 -2.547805739075086e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.490000000000000e+02 -2.258798054736085e+06 -9.761705373823206e+05 6.406417797455946e+06 -7.250612061180459e+03 1.949189702401000e+01 -2.547963737348427e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.500000000000000e+02 -2.258943066248792e+06 -9.761701470897774e+05 6.406366836663417e+06 -7.250556695688375e+03 1.953700508669993e+01 -2.548121728785434e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.510000000000000e+02 -2.259088076849764e+06 -9.761697558989889e+05 6.406315872641427e+06 -7.250501324189212e+03 1.958211467827675e+01 -2.548279725587621e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.520000000000000e+02 -2.259233086280143e+06 -9.761693638047561e+05 6.406264905482039e+06 -7.250445949730054e+03 1.962722340511843e+01 -2.548437719033239e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.530000000000000e+02 -2.259378094507316e+06 -9.761689708064343e+05 6.406213935196859e+06 -7.250390572745212e+03 1.967233123577631e+01 -2.548595707897553e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.540000000000000e+02 -2.259523101660923e+06 -9.761685769066258e+05 6.406162961739775e+06 -7.250335191737430e+03 1.971743953118718e+01 -2.548753696476076e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.550000000000000e+02 -2.259668107772999e+06 -9.761681821059863e+05 6.406111985099382e+06 -7.250279806233439e+03 1.976254772881464e+01 -2.548911686069591e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.560000000000000e+02 -2.259813112746298e+06 -9.761677864025687e+05 6.406061005310273e+06 -7.250224417370937e+03 1.980765538643200e+01 -2.549069673448323e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.570000000000000e+02 -2.259958116581165e+06 -9.761673897963723e+05 6.406010022372332e+06 -7.250169025278923e+03 1.985276326677109e+01 -2.549227658292557e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.580000000000000e+02 -2.260103119341744e+06 -9.761669922887026e+05 6.405959036262729e+06 -7.250113629069343e+03 1.989787065335341e+01 -2.549385643062545e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.590000000000000e+02 -2.260248120996067e+06 -9.761665938789180e+05 6.405908046992846e+06 -7.250058229245717e+03 1.994297809086927e+01 -2.549543626371211e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.600000000000000e+02 -2.260393121576169e+06 -9.761661945676649e+05 6.405857054551267e+06 -7.250002825196511e+03 1.998808554674326e+01 -2.549701609938553e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.610000000000000e+02 -2.260538121017120e+06 -9.761657943536500e+05 6.405806058961106e+06 -7.249947417926930e+03 2.003319240451407e+01 -2.549859590899247e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.620000000000000e+02 -2.260683119286953e+06 -9.761653932362294e+05 6.405755060233746e+06 -7.249892007762915e+03 2.007829913912295e+01 -2.550017568362952e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.630000000000000e+02 -2.260828116514661e+06 -9.761649912179994e+05 6.405704058323269e+06 -7.249836593122933e+03 2.012340584579690e+01 -2.550175546787515e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.640000000000000e+02 -2.260973112635326e+06 -9.761645882976712e+05 6.405653053252781e+06 -7.249781174799423e+03 2.016851202292651e+01 -2.550333523913480e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.650000000000000e+02 -2.261118107649283e+06 -9.761641844752412e+05 6.405602045022154e+06 -7.249725752692607e+03 2.021361878543166e+01 -2.550491500084930e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.660000000000000e+02 -2.261263101556255e+06 -9.761637797507168e+05 6.405551033631496e+06 -7.249670327006655e+03 2.025872493005639e+01 -2.550649474658941e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.670000000000000e+02 -2.261408094420594e+06 -9.761633741253960e+05 6.405500019057882e+06 -7.249614896798108e+03 2.030383105760367e+01 -2.550807450324733e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.680000000000000e+02 -2.261553086081052e+06 -9.761629675960434e+05 6.405449001358736e+06 -7.249559464059897e+03 2.034893692377096e+01 -2.550965421459880e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.690000000000000e+02 -2.261698076666626e+06 -9.761625601652556e+05 6.405397980488123e+06 -7.249504027304191e+03 2.039404261935678e+01 -2.551123392256662e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.700000000000000e+02 -2.261843066144702e+06 -9.761621518323824e+05 6.405346956457643e+06 -7.249448586730842e+03 2.043914789871030e+01 -2.551281362138677e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.710000000000000e+02 -2.261988054515639e+06 -9.761617425974326e+05 6.405295929267185e+06 -7.249393142608847e+03 2.048425349775340e+01 -2.551439330390719e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.720000000000000e+02 -2.262133041778935e+06 -9.761613324604097e+05 6.405244898916912e+06 -7.249337694680794e+03 2.052935837791742e+01 -2.551597297678235e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.730000000000000e+02 -2.262278027934940e+06 -9.761609214213151e+05 6.405193865406708e+06 -7.249282243129895e+03 2.057446364607264e+01 -2.551755263548442e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.740000000000000e+02 -2.262423012983359e+06 -9.761605094801510e+05 6.405142828736669e+06 -7.249226787896099e+03 2.061956839067588e+01 -2.551913228118687e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.750000000000000e+02 -2.262567996923931e+06 -9.761600966369229e+05 6.405091788906891e+06 -7.249171328905290e+03 2.066467291964327e+01 -2.552071191614873e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.760000000000000e+02 -2.262712979756973e+06 -9.761596828916308e+05 6.405040745917259e+06 -7.249115866263615e+03 2.070977764931550e+01 -2.552229153761997e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.770000000000000e+02 -2.262857961514547e+06 -9.761592682449333e+05 6.404989699756350e+06 -7.249060399572822e+03 2.075488196782968e+01 -2.552387115645406e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.780000000000000e+02 -2.263002942131719e+06 -9.761588526955328e+05 6.404938650447292e+06 -7.249004929489268e+03 2.079998592621391e+01 -2.552545075422153e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.790000000000000e+02 -2.263147921641152e+06 -9.761584362440816e+05 6.404887597978458e+06 -7.248949455855766e+03 2.084509018012281e+01 -2.552703033571404e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.800000000000000e+02 -2.263292900042566e+06 -9.761580188905819e+05 6.404836542349935e+06 -7.248893978399020e+03 2.089019393075111e+01 -2.552860990816520e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.810000000000000e+02 -2.263437877335678e+06 -9.761576006350386e+05 6.404785483561826e+06 -7.248838497314006e+03 2.093529726416949e+01 -2.553018946614172e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.820000000000000e+02 -2.263582853488517e+06 -9.761571814768080e+05 6.404734421625530e+06 -7.248783012910917e+03 2.098040089033765e+01 -2.553176900132413e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.830000000000000e+02 -2.263727828597534e+06 -9.761567614178328e+05 6.404683356506663e+06 -7.248727524066705e+03 2.102550406630613e+01 -2.553334854486486e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.840000000000000e+02 -2.263872802566131e+06 -9.761563404561777e+05 6.404632288239650e+06 -7.248672031816297e+03 2.107060739367859e+01 -2.553492806800852e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.850000000000000e+02 -2.264017775426335e+06 -9.761559185924928e+05 6.404581216813085e+06 -7.248616536031999e+03 2.111571029948442e+01 -2.553650757402288e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.860000000000000e+02 -2.264162747177872e+06 -9.761554958267810e+05 6.404530142227057e+06 -7.248561036449965e+03 2.116081284605463e+01 -2.553808707035925e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.870000000000000e+02 -2.264307717821081e+06 -9.761550721590434e+05 6.404479064481446e+06 -7.248505533210529e+03 2.120591572839533e+01 -2.553966655346497e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.880000000000000e+02 -2.264452687355679e+06 -9.761546475892881e+05 6.404427983576353e+06 -7.248450026288288e+03 2.125101808162776e+01 -2.554124602356685e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.890000000000000e+02 -2.264597655781384e+06 -9.761542221175173e+05 6.404376899511875e+06 -7.248394515647567e+03 2.129612008056719e+01 -2.554282548176573e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.900000000000000e+02 -2.264742623066228e+06 -9.761537957430866e+05 6.404325812299414e+06 -7.248339001734773e+03 2.134122234612201e+01 -2.554440491586870e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.910000000000000e+02 -2.264887589339211e+06 -9.761533684680782e+05 6.404274721893050e+06 -7.248283484867951e+03 2.138634950383488e+01 -2.554598433080072e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.920000000000000e+02 -2.265032554395696e+06 -9.761529402894253e+05 6.404223628365587e+06 -7.248227962043758e+03 2.143142556762902e+01 -2.554756376817592e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.930000000000000e+02 -2.265177518353823e+06 -9.761525112089763e+05 6.404172531674979e+06 -7.248172437040047e+03 2.147652726828568e+01 -2.554914316504065e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.940000000000000e+02 -2.265322481267519e+06 -9.761520812278159e+05 6.404121431801983e+06 -7.248116907538853e+03 2.152162886406816e+01 -2.555072257202539e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.950000000000000e+02 -2.265467443104188e+06 -9.761516503453015e+05 6.404070328758225e+06 -7.248061373999377e+03 2.156673020974699e+01 -2.555230197614634e+03 5.035587407600000e-03 2.128561678600000e-05 1.353348924000000e-03 1.572026727200000e-03 8.186395361899999e-05 1.562942300700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.960000000000000e+02 -2.265612403767242e+06 -9.761512185595082e+05 6.404019222578165e+06 -7.248005837550283e+03 2.161183140209312e+01 -2.555388134575717e+03 5.034972896900000e-03 2.111294149600000e-05 1.354145687900000e-03 1.572075627200000e-03 8.179915850000000e-05 1.563550221100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.970000000000000e+02 -2.265757363320812e+06 -9.761507858717251e+05 6.403968113238921e+06 -7.247950297374565e+03 2.165693211309681e+01 -2.555546070362238e+03 5.034972896900000e-03 2.111294149600000e-05 1.354145687900000e-03 1.572075627200000e-03 8.179915850000000e-05 1.563550221100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.980000000000000e+02 -2.265902321700623e+06 -9.761503522806721e+05 6.403917000763431e+06 -7.247894754347795e+03 2.170203259775715e+01 -2.555704002529808e+03 5.034972896900000e-03 2.111294149600000e-05 1.354145687900000e-03 1.572075627200000e-03 8.179915850000000e-05 1.563550221100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.990000000000000e+02 -2.266047279067943e+06 -9.761499177895644e+05 6.403865885094143e+06 -7.247839206426017e+03 2.174713334287279e+01 -2.555861936845508e+03 5.034972896900000e-03 2.111294149600000e-05 1.354145687900000e-03 1.572075627200000e-03 8.179915850000000e-05 1.563550221100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.000000000000000e+02 -2.266192235293247e+06 -9.761494823958341e+05 6.403814766277278e+06 -7.247783655178930e+03 2.179223353773148e+01 -2.556019868855839e+03 5.034972896900000e-03 2.111294149600000e-05 1.354145687900000e-03 1.572075627200000e-03 8.179915850000000e-05 1.563550221100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.010000000000000e+02 -2.266337190379942e+06 -9.761490461027398e+05 6.403763644321481e+06 -7.247728253603522e+03 2.183717106104291e+01 -2.556177359919118e+03 5.034972896900000e-03 2.111294149600000e-05 1.354145687900000e-03 1.572075627200000e-03 8.179915850000000e-05 1.563550221100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.020000000000000e+02 -2.266482144402239e+06 -9.761486089259820e+05 6.403712519244158e+06 -7.247673528680629e+03 2.188138401962811e+01 -2.556332899194491e+03 5.034972896900000e-03 2.111294149600000e-05 1.354145687900000e-03 1.572075627200000e-03 8.179915850000000e-05 1.563550221100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.030000000000000e+02 -2.266627097304469e+06 -9.761481708470524e+05 6.403661391011418e+06 -7.247617966446368e+03 2.192648368460615e+01 -2.556490827391451e+03 5.034972896900000e-03 2.111294149600000e-05 1.354145687900000e-03 1.572075627200000e-03 8.179915850000000e-05 1.563550221100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.040000000000000e+02 -2.266772049129430e+06 -9.761477318668005e+05 6.403610259607993e+06 -7.247562400185490e+03 2.197158375928433e+01 -2.556648755305836e+03 5.034972896900000e-03 2.111294149600000e-05 1.354145687900000e-03 1.572075627200000e-03 8.179915850000000e-05 1.563550221100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.050000000000000e+02 -2.266916999747603e+06 -9.761472919826608e+05 6.403559125080111e+06 -7.247506831340421e+03 2.201668291504947e+01 -2.556806678814480e+03 5.034972896900000e-03 2.111294149600000e-05 1.354145687900000e-03 1.572075627200000e-03 8.179915850000000e-05 1.563550221100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.060000000000000e+02 -2.267061949384860e+06 -9.761468511991304e+05 6.403507987347131e+06 -7.247451257239721e+03 2.206178231877917e+01 -2.556964605480967e+03 5.034358077200000e-03 2.094029629600000e-05 1.354942171100000e-03 1.572124544400000e-03 8.173427468699999e-05 1.564158498300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.070000000000000e+02 -2.267206897783087e+06 -9.761464095110806e+05 6.403456846501214e+06 -7.247395681059116e+03 2.210688133162427e+01 -2.557122526356343e+03 5.034358077200000e-03 2.094029629600000e-05 1.354942171100000e-03 1.572124544400000e-03 8.173427468699999e-05 1.564158498300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.080000000000000e+02 -2.267351845135637e+06 -9.761459669223605e+05 6.403405702473318e+06 -7.247340100372759e+03 2.215198012350828e+01 -2.557280448258434e+03 5.034358077200000e-03 2.094029629600000e-05 1.354942171100000e-03 1.572124544400000e-03 8.173427468699999e-05 1.564158498300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.090000000000000e+02 -2.267496791378233e+06 -9.761455234316927e+05 6.403354555286394e+06 -7.247284516051076e+03 2.219707909722237e+01 -2.557438368766891e+03 5.034358077200000e-03 2.094029629600000e-05 1.354942171100000e-03 1.572124544400000e-03 8.173427468699999e-05 1.564158498300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.100000000000000e+02 -2.267641736510604e+06 -9.761450790390788e+05 6.403303404940533e+06 -7.247228927953099e+03 2.224217778987091e+01 -2.557596288251365e+03 5.034358077200000e-03 2.094029629600000e-05 1.354942171100000e-03 1.572124544400000e-03 8.173427468699999e-05 1.564158498300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.110000000000000e+02 -2.267786680600459e+06 -9.761446337488678e+05 6.403252251422425e+06 -7.247173504588128e+03 2.228712337889232e+01 -2.557753725404299e+03 5.034358077200000e-03 2.094029629600000e-05 1.354942171100000e-03 1.572124544400000e-03 8.173427468699999e-05 1.564158498300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.120000000000000e+02 -2.267931623469445e+06 -9.761441875708376e+05 6.403201094844191e+06 -7.247118832627929e+03 2.233138742564140e+01 -2.557909004972712e+03 5.034358077200000e-03 2.094029629600000e-05 1.354942171100000e-03 1.572124544400000e-03 8.173427468699999e-05 1.564158498300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.130000000000000e+02 -2.268076565307416e+06 -9.761437404924500e+05 6.403149935078725e+06 -7.247063233154086e+03 2.237648566479146e+01 -2.558066921821988e+03 5.034358077200000e-03 2.094029629600000e-05 1.354942171100000e-03 1.572124544400000e-03 8.173427468699999e-05 1.564158498300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.140000000000000e+02 -2.268221505970047e+06 -9.761432925108492e+05 6.403098772177585e+06 -7.247007630873271e+03 2.242158335112012e+01 -2.558224834912900e+03 5.034358077200000e-03 2.094029629600000e-05 1.354942171100000e-03 1.572124544400000e-03 8.173427468699999e-05 1.564158498300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.150000000000000e+02 -2.268366445586890e+06 -9.761428436286027e+05 6.403047606094484e+06 -7.246952024088896e+03 2.246668134209477e+01 -2.558382749052512e+03 5.034358077200000e-03 2.094029629600000e-05 1.354942171100000e-03 1.572124544400000e-03 8.173427468699999e-05 1.564158498300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.160000000000000e+02 -2.268511384060767e+06 -9.761423938437924e+05 6.402996436864140e+06 -7.246896413949886e+03 2.251177903745602e+01 -2.558540660984496e+03 5.033742948100000e-03 2.076768112900000e-05 1.355738373500000e-03 1.572173478800000e-03 8.166930216999999e-05 1.564767132000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.170000000000000e+02 -2.268656321391376e+06 -9.761419431564223e+05 6.402945264486658e+06 -7.246840800550014e+03 2.255687593951794e+01 -2.558698570418295e+03 5.033742948100000e-03 2.076768112900000e-05 1.355738373500000e-03 1.572173478800000e-03 8.166930216999999e-05 1.564767132000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.180000000000000e+02 -2.268801257675990e+06 -9.761414915684140e+05 6.402894088927284e+06 -7.246785182712901e+03 2.260197367390867e+01 -2.558856480743757e+03 5.033742948100000e-03 2.076768112900000e-05 1.355738373500000e-03 1.572173478800000e-03 8.166930216999999e-05 1.564767132000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.190000000000000e+02 -2.268946192817402e+06 -9.761410390778523e+05 6.402842910220747e+06 -7.246729561500646e+03 2.264707079924074e+01 -2.559014388901820e+03 5.033742948100000e-03 2.076768112900000e-05 1.355738373500000e-03 1.572173478800000e-03 8.166930216999999e-05 1.564767132000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.200000000000000e+02 -2.269091126847641e+06 -9.761405856853822e+05 6.402791728355606e+06 -7.246673936650841e+03 2.269216734594531e+01 -2.559172295630123e+03 5.033742948100000e-03 2.076768112900000e-05 1.355738373500000e-03 1.572173478800000e-03 8.166930216999999e-05 1.564767132000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.210000000000000e+02 -2.269236059769953e+06 -9.761401313939777e+05 6.402740543340039e+06 -7.246618453299984e+03 2.273711567618540e+01 -2.559329785791479e+03 5.033742948100000e-03 2.076768112900000e-05 1.355738373500000e-03 1.572173478800000e-03 8.166930216999999e-05 1.564767132000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.220000000000000e+02 -2.269380991526032e+06 -9.761396762154861e+05 6.402689355236482e+06 -7.246563613298669e+03 2.278140097840625e+01 -2.559485423895016e+03 5.033742948100000e-03 2.076768112900000e-05 1.355738373500000e-03 1.572173478800000e-03 8.166930216999999e-05 1.564767132000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.230000000000000e+02 -2.269525922233850e+06 -9.761392201363344e+05 6.402638163951832e+06 -7.246507977525765e+03 2.282649752181382e+01 -2.559643326704724e+03 5.033742948100000e-03 2.076768112900000e-05 1.355738373500000e-03 1.572173478800000e-03 8.166930216999999e-05 1.564767132000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.240000000000000e+02 -2.269670851895018e+06 -9.761387631565654e+05 6.402586969485498e+06 -7.246452337135824e+03 2.287159409686993e+01 -2.559801230864343e+03 5.033742948100000e-03 2.076768112900000e-05 1.355738373500000e-03 1.572173478800000e-03 8.166930216999999e-05 1.564767132000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.250000000000000e+02 -2.269815780315429e+06 -9.761383052723485e+05 6.402535771906881e+06 -7.246396694685993e+03 2.291668955793958e+01 -2.559959129142202e+03 5.033742948100000e-03 2.076768112900000e-05 1.355738373500000e-03 1.572173478800000e-03 8.166930216999999e-05 1.564767132000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.260000000000000e+02 -2.269960707753857e+06 -9.761378464887966e+05 6.402484571123462e+06 -7.246341047041993e+03 2.296178601232413e+01 -2.560117030440972e+03 5.033127509400000e-03 2.059509593600000e-05 1.356534294900000e-03 1.572222430500000e-03 8.160424093600001e-05 1.565376122300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.270000000000000e+02 -2.270105634016197e+06 -9.761373868020814e+05 6.402433367204634e+06 -7.246285396404352e+03 2.300688169841911e+01 -2.560274928494738e+03 5.033127509400000e-03 2.059509593600000e-05 1.356534294900000e-03 1.572222430500000e-03 8.160424093600001e-05 1.565376122300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.280000000000000e+02 -2.270250559199078e+06 -9.761369262141242e+05 6.402382160115853e+06 -7.246229741726596e+03 2.305197711231958e+01 -2.560432826264070e+03 5.033127509400000e-03 2.059509593600000e-05 1.356534294900000e-03 1.572222430500000e-03 8.160424093600001e-05 1.565376122300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.290000000000000e+02 -2.270395483238230e+06 -9.761364647236465e+05 6.402330949880091e+06 -7.246174083698638e+03 2.309707276519691e+01 -2.560590721844006e+03 5.033127509400000e-03 2.059509593600000e-05 1.356534294900000e-03 1.572222430500000e-03 8.160424093600001e-05 1.565376122300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.300000000000000e+02 -2.270540406068776e+06 -9.761360023293805e+05 6.402279736520560e+06 -7.246118423270578e+03 2.314216735178928e+01 -2.560748612500050e+03 5.033127509400000e-03 2.059509593600000e-05 1.356534294900000e-03 1.572222430500000e-03 8.160424093600001e-05 1.565376122300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.310000000000000e+02 -2.270685327919321e+06 -9.761355390389404e+05 6.402228519964417e+06 -7.246062895882317e+03 2.318710507252123e+01 -2.560906110114374e+03 5.033127509400000e-03 2.059509593600000e-05 1.356534294900000e-03 1.572222430500000e-03 8.160424093600001e-05 1.565376122300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.320000000000000e+02 -2.270830248707195e+06 -9.761350748644418e+05 6.402177300280946e+06 -7.246007980878596e+03 2.323134336755442e+01 -2.561061841755021e+03 5.033127509400000e-03 2.059509593600000e-05 1.356534294900000e-03 1.572222430500000e-03 8.160424093600001e-05 1.565376122300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.330000000000000e+02 -2.270975168337443e+06 -9.761346097871803e+05 6.402126077455469e+06 -7.245952308215293e+03 2.327643777948040e+01 -2.561219732143083e+03 5.033127509400000e-03 2.059509593600000e-05 1.356534294900000e-03 1.572222430500000e-03 8.160424093600001e-05 1.565376122300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.340000000000000e+02 -2.271120086855904e+06 -9.761341438080567e+05 6.402074851471582e+06 -7.245896631812933e+03 2.332153246736118e+01 -2.561377621433480e+03 5.033127509400000e-03 2.059509593600000e-05 1.356534294900000e-03 1.572222430500000e-03 8.160424093600001e-05 1.565376122300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.350000000000000e+02 -2.271265004197696e+06 -9.761336769257997e+05 6.402023622352507e+06 -7.245840952580191e+03 2.336662644678520e+01 -2.561535507026392e+03 5.033127509400000e-03 2.059509593600000e-05 1.356534294900000e-03 1.572222430500000e-03 8.160424093600001e-05 1.565376122300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.360000000000000e+02 -2.271409920524041e+06 -9.761332091436026e+05 6.401972390040553e+06 -7.245785268404732e+03 2.341172051059715e+01 -2.561693394882406e+03 5.032511760400000e-03 2.042254060800000e-05 1.357329935500000e-03 1.572271399500000e-03 8.153909095499999e-05 1.565985469200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.370000000000000e+02 -2.271554835673767e+06 -9.761327404582743e+05 6.401921154593387e+06 -7.245729581398995e+03 2.345681458692678e+01 -2.561851279080866e+03 5.032511760400000e-03 2.042254060800000e-05 1.357329935500000e-03 1.572271399500000e-03 8.153909095499999e-05 1.565985469200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.380000000000000e+02 -2.271699749743511e+06 -9.761322708717390e+05 6.401869915976434e+06 -7.245673890269823e+03 2.350190832958745e+01 -2.562009163224324e+03 5.032511760400000e-03 2.042254060800000e-05 1.357329935500000e-03 1.572271399500000e-03 8.153909095499999e-05 1.565985469200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.390000000000000e+02 -2.271844662797580e+06 -9.761318003852690e+05 6.401818674166671e+06 -7.245618194263311e+03 2.354700219204977e+01 -2.562167049448725e+03 5.032511760400000e-03 2.042254060800000e-05 1.357329935500000e-03 1.572271399500000e-03 8.153909095499999e-05 1.565985469200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.400000000000000e+02 -2.271989574545616e+06 -9.761313289931358e+05 6.401767429268011e+06 -7.245562496936603e+03 2.359209542981489e+01 -2.562324927752270e+03 5.032511760400000e-03 2.042254060800000e-05 1.357329935500000e-03 1.572271399500000e-03 8.153909095499999e-05 1.565985469200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.410000000000000e+02 -2.272134485281383e+06 -9.761308567042446e+05 6.401716181186027e+06 -7.245506961449239e+03 2.363703022999960e+01 -2.562482332584697e+03 5.032511760400000e-03 2.042254060800000e-05 1.357329935500000e-03 1.572271399500000e-03 8.153909095499999e-05 1.565985469200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.420000000000000e+02 -2.272279394910242e+06 -9.761303835305519e+05 6.401664930002233e+06 -7.245452164478205e+03 2.368125934706828e+01 -2.562637619294368e+03 5.032511760400000e-03 2.042254060800000e-05 1.357329935500000e-03 1.572271399500000e-03 8.153909095499999e-05 1.565985469200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.430000000000000e+02 -2.272424303350503e+06 -9.761299094535296e+05 6.401613675687523e+06 -7.245396455417555e+03 2.372635230059552e+01 -2.562795495939308e+03 5.032511760400000e-03 2.042254060800000e-05 1.357329935500000e-03 1.572271399500000e-03 8.153909095499999e-05 1.565985469200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.440000000000000e+02 -2.272569210710329e+06 -9.761294344753159e+05 6.401562418203173e+06 -7.245340742243803e+03 2.377144508070137e+01 -2.562953372508729e+03 5.032511760400000e-03 2.042254060800000e-05 1.357329935500000e-03 1.572271399500000e-03 8.153909095499999e-05 1.565985469200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.450000000000000e+02 -2.272714116957152e+06 -9.761289585952825e+05 6.401511157560842e+06 -7.245285025358015e+03 2.381653733933328e+01 -2.563111247860527e+03 5.032511760400000e-03 2.042254060800000e-05 1.357329935500000e-03 1.572271399500000e-03 8.153909095499999e-05 1.565985469200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.460000000000000e+02 -2.272859022091294e+06 -9.761284818134244e+05 6.401459893760416e+06 -7.245229304899213e+03 2.386162998704702e+01 -2.563269121656025e+03 5.031895701200000e-03 2.025001518800000e-05 1.358125294700000e-03 1.572320385600000e-03 8.147385225299999e-05 1.566595172200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.470000000000000e+02 -2.273003926112282e+06 -9.761280041297517e+05 6.401408626802059e+06 -7.245173580611809e+03 2.390672202480911e+01 -2.563426994555268e+03 5.031895701200000e-03 2.025001518800000e-05 1.358125294700000e-03 1.572320385600000e-03 8.147385225299999e-05 1.566595172200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.480000000000000e+02 -2.273148829085046e+06 -9.761275255455369e+05 6.401357356662521e+06 -7.245117851942970e+03 2.395181457243532e+01 -2.563584868167191e+03 5.031895701200000e-03 2.025001518800000e-05 1.358125294700000e-03 1.572320385600000e-03 8.147385225299999e-05 1.566595172200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.490000000000000e+02 -2.273293730880117e+06 -9.761270460582405e+05 6.401306083388158e+06 -7.245062120293560e+03 2.399690651041587e+01 -2.563742738509536e+03 5.031895701200000e-03 2.025001518800000e-05 1.358125294700000e-03 1.572320385600000e-03 8.147385225299999e-05 1.566595172200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.500000000000000e+02 -2.273438631432617e+06 -9.761265656665997e+05 6.401254807002216e+06 -7.245006386596149e+03 2.404199719283065e+01 -2.563900602937708e+03 5.031895701200000e-03 2.025001518800000e-05 1.358125294700000e-03 1.572320385600000e-03 8.147385225299999e-05 1.566595172200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.510000000000000e+02 -2.273583531068757e+06 -9.761260843799564e+05 6.401203527397141e+06 -7.244950791299717e+03 2.408693979574022e+01 -2.564058060392779e+03 5.031895701200000e-03 2.025001518800000e-05 1.358125294700000e-03 1.572320385600000e-03 8.147385225299999e-05 1.566595172200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.520000000000000e+02 -2.273728429572763e+06 -9.761256022071454e+05 6.401152244691545e+06 -7.244895835955256e+03 2.413121580168968e+01 -2.564213679187771e+03 5.031895701200000e-03 2.025001518800000e-05 1.358125294700000e-03 1.572320385600000e-03 8.147385225299999e-05 1.566595172200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.530000000000000e+02 -2.273873326885031e+06 -9.761251191310035e+05 6.401100958856164e+06 -7.244840090063858e+03 2.417630646989701e+01 -2.564371543240286e+03 5.031895701200000e-03 2.025001518800000e-05 1.358125294700000e-03 1.572320385600000e-03 8.147385225299999e-05 1.566595172200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.540000000000000e+02 -2.274018223116342e+06 -9.761246351537051e+05 6.401049669851308e+06 -7.244784340063116e+03 2.422139774684291e+01 -2.564529407249163e+03 5.031895701200000e-03 2.025001518800000e-05 1.358125294700000e-03 1.572320385600000e-03 8.147385225299999e-05 1.566595172200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.550000000000000e+02 -2.274163118234109e+06 -9.761241502746162e+05 6.400998377688653e+06 -7.244728586404975e+03 2.426648860711768e+01 -2.564687269893402e+03 5.031895701200000e-03 2.025001518800000e-05 1.358125294700000e-03 1.572320385600000e-03 8.147385225299999e-05 1.566595172200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.560000000000000e+02 -2.274308012270350e+06 -9.761236644943800e+05 6.400947082356730e+06 -7.244672828714161e+03 2.431157907447107e+01 -2.564845132223939e+03 5.031279331200000e-03 2.007751956700000e-05 1.358920372500000e-03 1.572369388900000e-03 8.140852479900000e-05 1.567205231600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.570000000000000e+02 -2.274452905160822e+06 -9.761231778117260e+05 6.400895783878551e+06 -7.244617067647495e+03 2.435666984104321e+01 -2.565002992441854e+03 5.031279331200000e-03 2.007751956700000e-05 1.358920372500000e-03 1.572369388900000e-03 8.140852479900000e-05 1.567205231600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.580000000000000e+02 -2.274597796872733e+06 -9.761226902260245e+05 6.400844482265864e+06 -7.244561303674871e+03 2.440175966792773e+01 -2.565160849164958e+03 5.031279331200000e-03 2.007751956700000e-05 1.358920372500000e-03 1.572369388900000e-03 8.140852479900000e-05 1.567205231600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.590000000000000e+02 -2.274742687535606e+06 -9.761222017398165e+05 6.400793177472262e+06 -7.244505535300812e+03 2.444684994954960e+01 -2.565318706652370e+03 5.031279331200000e-03 2.007751956700000e-05 1.358920372500000e-03 1.572369388900000e-03 8.140852479900000e-05 1.567205231600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.600000000000000e+02 -2.274887577084573e+06 -9.761217123518371e+05 6.400741869520986e+06 -7.244449763227673e+03 2.449193990051452e+01 -2.565476562896529e+03 5.031279331200000e-03 2.007751956700000e-05 1.358920372500000e-03 1.572369388900000e-03 8.140852479900000e-05 1.567205231600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.610000000000000e+02 -2.275032465522738e+06 -9.761212220653279e+05 6.400690558421769e+06 -7.244394156550368e+03 2.453686761327120e+01 -2.565633936210727e+03 5.031279331200000e-03 2.007751956700000e-05 1.358920372500000e-03 1.572369388900000e-03 8.140852479900000e-05 1.567205231600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.620000000000000e+02 -2.275177352866226e+06 -9.761207308947011e+05 6.400639244217153e+06 -7.244339299680280e+03 2.458107580060692e+01 -2.565789162187195e+03 5.031279331200000e-03 2.007751956700000e-05 1.358920372500000e-03 1.572369388900000e-03 8.140852479900000e-05 1.567205231600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.630000000000000e+02 -2.275322239148516e+06 -9.761202388233546e+05 6.400587926835962e+06 -7.244283515804162e+03 2.462616541443606e+01 -2.565947016963676e+03 5.031279331200000e-03 2.007751956700000e-05 1.358920372500000e-03 1.572369388900000e-03 8.140852479900000e-05 1.567205231600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.640000000000000e+02 -2.275467124187220e+06 -9.761197458477182e+05 6.400536606343580e+06 -7.244227729828192e+03 2.467125413135099e+01 -2.566104865995078e+03 5.031279331200000e-03 2.007751956700000e-05 1.358920372500000e-03 1.572369388900000e-03 8.140852479900000e-05 1.567205231600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.650000000000000e+02 -2.275612008273332e+06 -9.761192519734903e+05 6.400485282635686e+06 -7.244171938172428e+03 2.471634398222025e+01 -2.566262719400474e+03 5.031279331200000e-03 2.007751956700000e-05 1.358920372500000e-03 1.572369388900000e-03 8.140852479900000e-05 1.567205231600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.660000000000000e+02 -2.275756891083625e+06 -9.761187571943504e+05 6.400433955828159e+06 -7.244116144830165e+03 2.476143251678911e+01 -2.566420565882906e+03 5.030662650000000e-03 1.990505368600000e-05 1.359715168900000e-03 1.572418409500000e-03 8.134310858300000e-05 1.567815647200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.670000000000000e+02 -2.275901772843871e+06 -9.761182615147253e+05 6.400382625840048e+06 -7.244060346921217e+03 2.480652117028342e+01 -2.566578413571848e+03 5.030662650000000e-03 1.990505368600000e-05 1.359715168900000e-03 1.572418409500000e-03 8.134310858300000e-05 1.567815647200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.680000000000000e+02 -2.276046653489831e+06 -9.761177649333624e+05 6.400331292694398e+06 -7.244004545503003e+03 2.485160972558651e+01 -2.566736259499868e+03 5.030662650000000e-03 1.990505368600000e-05 1.359715168900000e-03 1.572418409500000e-03 8.134310858300000e-05 1.567815647200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.690000000000000e+02 -2.276191533021224e+06 -9.761172674502536e+05 6.400279956391289e+06 -7.243948740186309e+03 2.489669828792597e+01 -2.566894104760429e+03 5.030662650000000e-03 1.990505368600000e-05 1.359715168900000e-03 1.572418409500000e-03 8.134310858300000e-05 1.567815647200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.700000000000000e+02 -2.276336411405474e+06 -9.761167690647815e+05 6.400228616942420e+06 -7.243892931718979e+03 2.494178597967402e+01 -2.567051947215616e+03 5.030662650000000e-03 1.990505368600000e-05 1.359715168900000e-03 1.572418409500000e-03 8.134310858300000e-05 1.567815647200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.710000000000000e+02 -2.276481288710557e+06 -9.761162697812633e+05 6.400177274333156e+06 -7.243837271160555e+03 2.498672143731858e+01 -2.567209356506473e+03 5.030662650000000e-03 1.990505368600000e-05 1.359715168900000e-03 1.572418409500000e-03 8.134310858300000e-05 1.567815647200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.720000000000000e+02 -2.276626164943737e+06 -9.761157696132042e+05 6.400125928604350e+06 -7.243782284018284e+03 2.503097571651907e+01 -2.567364835577207e+03 5.030662650000000e-03 1.990505368600000e-05 1.359715168900000e-03 1.572418409500000e-03 8.134310858300000e-05 1.567815647200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.730000000000000e+02 -2.276771039948624e+06 -9.761152685411953e+05 6.400074579758884e+06 -7.243726464908581e+03 2.507606338102681e+01 -2.567522673343799e+03 5.030662650000000e-03 1.990505368600000e-05 1.359715168900000e-03 1.572418409500000e-03 8.134310858300000e-05 1.567815647200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.740000000000000e+02 -2.276915913967738e+06 -9.761147665699892e+05 6.400023227709762e+06 -7.243670640556232e+03 2.512115118358332e+01 -2.567680514204947e+03 5.030662650000000e-03 1.990505368600000e-05 1.359715168900000e-03 1.572418409500000e-03 8.134310858300000e-05 1.567815647200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.750000000000000e+02 -2.277060786807054e+06 -9.761142636958058e+05 6.399971872526585e+06 -7.243614813264475e+03 2.516623822600016e+01 -2.567838351677084e+03 5.030662650000000e-03 1.990505368600000e-05 1.359715168900000e-03 1.572418409500000e-03 8.134310858300000e-05 1.567815647200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.760000000000000e+02 -2.277205658531493e+06 -9.761137599199009e+05 6.399920514186061e+06 -7.243558982314690e+03 2.521132579595172e+01 -2.567996187838401e+03 5.030045657400000e-03 1.973261748800000e-05 1.360509683700000e-03 1.572467447200000e-03 8.127760359000000e-05 1.568426418900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.770000000000000e+02 -2.277350529076194e+06 -9.761132552410284e+05 6.399869152711467e+06 -7.243503148510752e+03 2.525641221202250e+01 -2.568154020351642e+03 5.030045657400000e-03 1.973261748800000e-05 1.360509683700000e-03 1.572467447200000e-03 8.127760359000000e-05 1.568426418900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.780000000000000e+02 -2.277495398570043e+06 -9.761127496617064e+05 6.399817788056551e+06 -7.243447310167465e+03 2.530149893259957e+01 -2.568311854003356e+03 5.030045657400000e-03 1.973261748800000e-05 1.360509683700000e-03 1.572467447200000e-03 8.127760359000000e-05 1.568426418900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.790000000000000e+02 -2.277640266948788e+06 -9.761122431806772e+05 6.399766420244367e+06 -7.243391468174169e+03 2.534658581951288e+01 -2.568469686302042e+03 5.030045657400000e-03 1.973261748800000e-05 1.360509683700000e-03 1.572467447200000e-03 8.127760359000000e-05 1.568426418900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.800000000000000e+02 -2.277785134244451e+06 -9.761117357985821e+05 6.399715049263423e+06 -7.243335622067115e+03 2.539167229165011e+01 -2.568627518510793e+03 5.030045657400000e-03 1.973261748800000e-05 1.360509683700000e-03 1.572467447200000e-03 8.127760359000000e-05 1.568426418900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.810000000000000e+02 -2.277930000362652e+06 -9.761112275165340e+05 6.399663675156490e+06 -7.243279911733539e+03 2.543660776853514e+01 -2.568784951820700e+03 5.030045657400000e-03 1.973261748800000e-05 1.360509683700000e-03 1.572467447200000e-03 8.127760359000000e-05 1.568426418900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.820000000000000e+02 -2.278074865518969e+06 -9.761107183519033e+05 6.399612297885838e+06 -7.243224813605408e+03 2.548087417733512e+01 -2.568940627865560e+03 5.030045657400000e-03 1.973261748800000e-05 1.360509683700000e-03 1.572467447200000e-03 8.127760359000000e-05 1.568426418900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.830000000000000e+02 -2.278219729481236e+06 -9.761102082840522e+05 6.399560917486244e+06 -7.243168956886294e+03 2.552595985619445e+01 -2.569098455225438e+03 5.030045657400000e-03 1.973261748800000e-05 1.360509683700000e-03 1.572467447200000e-03 8.127760359000000e-05 1.568426418900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.840000000000000e+02 -2.278364592263462e+06 -9.761096973132561e+05 6.399509533952690e+06 -7.243113097351265e+03 2.557104542940053e+01 -2.569256278889100e+03 5.030045657400000e-03 1.973261748800000e-05 1.360509683700000e-03 1.572467447200000e-03 8.127760359000000e-05 1.568426418900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.850000000000000e+02 -2.278509454059102e+06 -9.761091854432926e+05 6.399458147215721e+06 -7.243057232448909e+03 2.561613144003729e+01 -2.569414106008399e+03 5.030045657400000e-03 1.973261748800000e-05 1.360509683700000e-03 1.572467447200000e-03 8.127760359000000e-05 1.568426418900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.860000000000000e+02 -2.278654314577270e+06 -9.761086726685032e+05 6.399406757379768e+06 -7.243001365874307e+03 2.566121602517003e+01 -2.569571926167293e+03 5.029428352700000e-03 1.956021086200000e-05 1.361303917100000e-03 1.572516502100000e-03 8.121200979100000e-05 1.569037546900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.870000000000000e+02 -2.278799174044329e+06 -9.761081589932926e+05 6.399355364363563e+06 -7.242945494824769e+03 2.570630142289454e+01 -2.569729747311269e+03 5.029428352700000e-03 1.956021086200000e-05 1.361303917100000e-03 1.572516502100000e-03 8.121200979100000e-05 1.569037546900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.880000000000000e+02 -2.278944032492291e+06 -9.761076444182988e+05 6.399303968155606e+06 -7.242889618909241e+03 2.575138671902320e+01 -2.569887570481168e+03 5.029428352700000e-03 1.956021086200000e-05 1.361303917100000e-03 1.572516502100000e-03 8.121200979100000e-05 1.569037546900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.890000000000000e+02 -2.279088889759428e+06 -9.761071289403761e+05 6.399252568813961e+06 -7.242833740052472e+03 2.579647144470820e+01 -2.570045390279747e+03 5.029428352700000e-03 1.956021086200000e-05 1.361303917100000e-03 1.572516502100000e-03 8.121200979100000e-05 1.569037546900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.900000000000000e+02 -2.279233745910655e+06 -9.761066125607848e+05 6.399201166315325e+06 -7.242777857549666e+03 2.584155639204545e+01 -2.570203208717260e+03 5.029428352700000e-03 1.956021086200000e-05 1.361303917100000e-03 1.572516502100000e-03 8.121200979100000e-05 1.569037546900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.910000000000000e+02 -2.279378600949045e+06 -9.761060952825629e+05 6.399149760669262e+06 -7.242722138122391e+03 2.588648933526022e+01 -2.570360552320495e+03 5.029428352700000e-03 1.956021086200000e-05 1.361303917100000e-03 1.572516502100000e-03 8.121200979100000e-05 1.569037546900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.920000000000000e+02 -2.279523454816191e+06 -9.761055771177863e+05 6.399098351944251e+06 -7.242667158420321e+03 2.593074684333860e+01 -2.570515783856294e+03 5.029428352700000e-03 1.956021086200000e-05 1.361303917100000e-03 1.572516502100000e-03 8.121200979100000e-05 1.569037546900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.930000000000000e+02 -2.279668307656050e+06 -9.761050580530813e+05 6.399046940030415e+06 -7.242611264164472e+03 2.597583169280509e+01 -2.570673600705555e+03 5.029428352700000e-03 1.956021086200000e-05 1.361303917100000e-03 1.572516502100000e-03 8.121200979100000e-05 1.569037546900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.940000000000000e+02 -2.279813159314926e+06 -9.761045380854654e+05 6.398995524982956e+06 -7.242555367002766e+03 2.602091577354724e+01 -2.570831414074709e+03 5.029428352700000e-03 1.956021086200000e-05 1.361303917100000e-03 1.572516502100000e-03 8.121200979100000e-05 1.569037546900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.950000000000000e+02 -2.279958009824828e+06 -9.761040172155751e+05 6.398944106790381e+06 -7.242499466569228e+03 2.606599903579720e+01 -2.570989224982351e+03 5.029428352700000e-03 1.956021086200000e-05 1.361303917100000e-03 1.572516502100000e-03 8.121200979100000e-05 1.569037546900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.960000000000000e+02 -2.280102859218387e+06 -9.761034954440378e+05 6.398892685440960e+06 -7.242443562382471e+03 2.611108281719521e+01 -2.571147034844340e+03 5.028810735900000e-03 1.938783385300000e-05 1.362097868400000e-03 1.572565574100000e-03 8.114632721199999e-05 1.569649030700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.970000000000000e+02 -2.280247707527402e+06 -9.761029727714898e+05 6.398841260923276e+06 -7.242387654169405e+03 2.615616606906295e+01 -2.571304844365053e+03 5.028810735900000e-03 1.938783385300000e-05 1.362097868400000e-03 1.572565574100000e-03 8.114632721199999e-05 1.569649030700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.980000000000000e+02 -2.280392554752203e+06 -9.761024491979275e+05 6.398789833237197e+06 -7.242331741863311e+03 2.620124971055026e+01 -2.571462653780478e+03 5.028810735900000e-03 1.938783385300000e-05 1.362097868400000e-03 1.572565574100000e-03 8.114632721199999e-05 1.569649030700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.990000000000000e+02 -2.280537400795670e+06 -9.761019247214773e+05 6.398738402417630e+06 -7.242275826672648e+03 2.624633265857099e+01 -2.571620459661510e+03 5.028810735900000e-03 1.938783385300000e-05 1.362097868400000e-03 1.572565574100000e-03 8.114632721199999e-05 1.569649030700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.000000000000000e+02 -2.280682245754356e+06 -9.761013993440226e+05 6.398686968429867e+06 -7.242219907323199e+03 2.629141547634487e+01 -2.571778265592282e+03 5.028810735900000e-03 1.938783385300000e-05 1.362097868400000e-03 1.572565574100000e-03 8.114632721199999e-05 1.569649030700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.010000000000000e+02 -2.280827089631322e+06 -9.761008730689115e+05 6.398635531281514e+06 -7.242164119298601e+03 2.633633128695155e+01 -2.571935684742305e+03 5.028810735900000e-03 1.938783385300000e-05 1.362097868400000e-03 1.572565574100000e-03 8.114632721199999e-05 1.569649030700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.020000000000000e+02 -2.280971932366936e+06 -9.761003459096634e+05 6.398584091032737e+06 -7.242108930486958e+03 2.638050164417027e+01 -2.572091381278628e+03 5.028810735900000e-03 1.938783385300000e-05 1.362097868400000e-03 1.572565574100000e-03 8.114632721199999e-05 1.569649030700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.030000000000000e+02 -2.281116773877830e+06 -9.760998178467108e+05 6.398532647666062e+06 -7.242053001347721e+03 2.642558318291944e+01 -2.572249180027959e+03 5.028810735900000e-03 1.938783385300000e-05 1.362097868400000e-03 1.572565574100000e-03 8.114632721199999e-05 1.569649030700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.040000000000000e+02 -2.281261614368649e+06 -9.760992888840192e+05 6.398481201107939e+06 -7.241997067458185e+03 2.647066568517607e+01 -2.572406980535352e+03 5.028810735900000e-03 1.938783385300000e-05 1.362097868400000e-03 1.572565574100000e-03 8.114632721199999e-05 1.569649030700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.050000000000000e+02 -2.281406453839103e+06 -9.760987590215927e+05 6.398429751358449e+06 -7.241941128531638e+03 2.651574841680505e+01 -2.572564783559392e+03 5.028810735900000e-03 1.938783385300000e-05 1.362097868400000e-03 1.572565574100000e-03 8.114632721199999e-05 1.569649030700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.060000000000000e+02 -2.281551292127494e+06 -9.760982282563050e+05 6.398378298475735e+06 -7.241885186841963e+03 2.656083011271787e+01 -2.572722582692777e+03 5.028192806500000e-03 1.921548635100000e-05 1.362891537700000e-03 1.572614663400000e-03 8.108055582100000e-05 1.570260870500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.070000000000000e+02 -2.281696129234158e+06 -9.760976965881535e+05 6.398326842459667e+06 -7.241829242150508e+03 2.660591197443657e+01 -2.572880378666471e+03 5.028192806500000e-03 1.921548635100000e-05 1.362891537700000e-03 1.572614663400000e-03 8.108055582100000e-05 1.570260870500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.080000000000000e+02 -2.281840965255469e+06 -9.760971640190288e+05 6.398275383275605e+06 -7.241773293447341e+03 2.665099328819576e+01 -2.573038174256602e+03 5.028192806500000e-03 1.921548635100000e-05 1.362891537700000e-03 1.572614663400000e-03 8.108055582100000e-05 1.570260870500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.090000000000000e+02 -2.281985800094911e+06 -9.760966305470529e+05 6.398223920958247e+06 -7.241717341848906e+03 2.669607445177948e+01 -2.573195966373476e+03 5.028192806500000e-03 1.921548635100000e-05 1.362891537700000e-03 1.572614663400000e-03 8.108055582100000e-05 1.570260870500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.100000000000000e+02 -2.282130633913618e+06 -9.760960961753562e+05 6.398172455449647e+06 -7.241661385356355e+03 2.674115584556449e+01 -2.573353760607850e+03 5.028192806500000e-03 1.921548635100000e-05 1.362891537700000e-03 1.572614663400000e-03 8.108055582100000e-05 1.570260870500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.110000000000000e+02 -2.282275466585401e+06 -9.760955609044111e+05 6.398120986805452e+06 -7.241605586219471e+03 2.678608821122225e+01 -2.573511096796364e+03 5.028192806500000e-03 1.921548635100000e-05 1.362891537700000e-03 1.572614663400000e-03 8.108055582100000e-05 1.570260870500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.120000000000000e+02 -2.282420298148490e+06 -9.760950247478974e+05 6.398069515057632e+06 -7.241550498730840e+03 2.683035974932895e+01 -2.573666403004215e+03 5.028192806500000e-03 1.921548635100000e-05 1.362891537700000e-03 1.572614663400000e-03 8.108055582100000e-05 1.570260870500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.130000000000000e+02 -2.282565128652859e+06 -9.760944876909457e+05 6.398018040132219e+06 -7.241494530818542e+03 2.687544067974852e+01 -2.573824194673912e+03 5.028192806500000e-03 1.921548635100000e-05 1.362891537700000e-03 1.572614663400000e-03 8.108055582100000e-05 1.570260870500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.140000000000000e+02 -2.282709957974581e+06 -9.760939497311598e+05 6.397966562073792e+06 -7.241438560072416e+03 2.692052092991477e+01 -2.573981982670901e+03 5.028192806500000e-03 1.921548635100000e-05 1.362891537700000e-03 1.572614663400000e-03 8.108055582100000e-05 1.570260870500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.150000000000000e+02 -2.282854786113997e+06 -9.760934108685444e+05 6.397915080882230e+06 -7.241382586398652e+03 2.696560124798751e+01 -2.574139767297544e+03 5.028192806500000e-03 1.921548635100000e-05 1.362891537700000e-03 1.572614663400000e-03 8.108055582100000e-05 1.570260870500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.160000000000000e+02 -2.282999613199956e+06 -9.760928711056062e+05 6.397863596511180e+06 -7.241326608283402e+03 2.701068122764477e+01 -2.574297552748742e+03 5.027574564200000e-03 1.904316829800000e-05 1.363684925000000e-03 1.572663769700000e-03 8.101469560600000e-05 1.570873066100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.170000000000000e+02 -2.283144439199887e+06 -9.760923304417187e+05 6.397812108972351e+06 -7.241270626049122e+03 2.705576120552794e+01 -2.574455338144247e+03 5.027574564200000e-03 1.904316829800000e-05 1.363684925000000e-03 1.572663769700000e-03 8.101469560600000e-05 1.570873066100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.180000000000000e+02 -2.283289264017296e+06 -9.760917888750158e+05 6.397760618300468e+06 -7.241214640963652e+03 2.710084096080104e+01 -2.574613119941034e+03 5.027574564200000e-03 1.904316829800000e-05 1.363684925000000e-03 1.572663769700000e-03 8.101469560600000e-05 1.570873066100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.190000000000000e+02 -2.283434087748747e+06 -9.760912464073690e+05 6.397709124460780e+06 -7.241158651762572e+03 2.714592076681998e+01 -2.574770901675421e+03 5.027574564200000e-03 1.904316829800000e-05 1.363684925000000e-03 1.572663769700000e-03 8.101469560600000e-05 1.570873066100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.200000000000000e+02 -2.283578910393944e+06 -9.760907030387881e+05 6.397657627453391e+06 -7.241102658467271e+03 2.719099998139393e+01 -2.574928683252848e+03 5.027574564200000e-03 1.904316829800000e-05 1.363684925000000e-03 1.572663769700000e-03 8.101469560600000e-05 1.570873066100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.210000000000000e+02 -2.283723731892048e+06 -9.760901587711350e+05 6.397606127310912e+06 -7.241046829643698e+03 2.723592403837230e+01 -2.575085986980733e+03 5.027574564200000e-03 1.904316829800000e-05 1.363684925000000e-03 1.572663769700000e-03 8.101469560600000e-05 1.570873066100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.220000000000000e+02 -2.283868552252912e+06 -9.760896136181761e+05 6.397554624077536e+06 -7.240991744903139e+03 2.728015467784059e+01 -2.575241170188554e+03 5.027574564200000e-03 1.904316829800000e-05 1.363684925000000e-03 1.572663769700000e-03 8.101469560600000e-05 1.570873066100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.230000000000000e+02 -2.284013371505254e+06 -9.760890675638552e+05 6.397503117684474e+06 -7.240935741058632e+03 2.732523378390241e+01 -2.575398946851575e+03 5.027574564200000e-03 1.904316829800000e-05 1.363684925000000e-03 1.572663769700000e-03 8.101469560600000e-05 1.570873066100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.240000000000000e+02 -2.284158189638990e+06 -9.760885206079873e+05 6.397451608135348e+06 -7.240879733501299e+03 2.737031256276305e+01 -2.575556722309933e+03 5.027574564200000e-03 1.904316829800000e-05 1.363684925000000e-03 1.572663769700000e-03 8.101469560600000e-05 1.570873066100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.250000000000000e+02 -2.284303006621551e+06 -9.760879727499528e+05 6.397400095441885e+06 -7.240823722674195e+03 2.741539075838611e+01 -2.575714495316522e+03 5.027574564200000e-03 1.904316829800000e-05 1.363684925000000e-03 1.572663769700000e-03 8.101469560600000e-05 1.570873066100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.260000000000000e+02 -2.284447822517841e+06 -9.760874239910023e+05 6.397348579580720e+06 -7.240767707823569e+03 2.746046920048292e+01 -2.575872268014389e+03 5.026956008600000e-03 1.887087963500000e-05 1.364478030000000e-03 1.572712893300000e-03 8.094874655400000e-05 1.571485617500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.270000000000000e+02 -2.284592637295309e+06 -9.760868743305168e+05 6.397297060563566e+06 -7.240711689192982e+03 2.750554750246530e+01 -2.576030039704568e+03 5.026956008600000e-03 1.887087963500000e-05 1.364478030000000e-03 1.572712893300000e-03 8.094874655400000e-05 1.571485617500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.280000000000000e+02 -2.284737450953655e+06 -9.760863237684972e+05 6.397245538390532e+06 -7.240655666928046e+03 2.755062521619351e+01 -2.576187809957572e+03 5.026956008600000e-03 1.887087963500000e-05 1.364478030000000e-03 1.572712893300000e-03 8.094874655400000e-05 1.571485617500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.290000000000000e+02 -2.284882263460955e+06 -9.760857723043241e+05 6.397194013073109e+06 -7.240599641338116e+03 2.759570319907985e+01 -2.576345577958871e+03 5.026956008600000e-03 1.887087963500000e-05 1.364478030000000e-03 1.572712893300000e-03 8.094874655400000e-05 1.571485617500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.300000000000000e+02 -2.285027074881480e+06 -9.760852199392475e+05 6.397142484588161e+06 -7.240543611737164e+03 2.764078089129231e+01 -2.576503345587370e+03 5.026956008600000e-03 1.887087963500000e-05 1.364478030000000e-03 1.572712893300000e-03 8.094874655400000e-05 1.571485617500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.310000000000000e+02 -2.285171885217909e+06 -9.760846666762761e+05 6.397090952944151e+06 -7.240487725609449e+03 2.768570809887942e+01 -2.576660694380537e+03 5.026956008600000e-03 1.887087963500000e-05 1.364478030000000e-03 1.572712893300000e-03 8.094874655400000e-05 1.571485617500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.320000000000000e+02 -2.285316694456955e+06 -9.760841125282587e+05 6.397039418187899e+06 -7.240432493152518e+03 2.772996747192857e+01 -2.576816177051644e+03 5.026956008600000e-03 1.887087963500000e-05 1.364478030000000e-03 1.572712893300000e-03 8.094874655400000e-05 1.571485617500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.330000000000000e+02 -2.285461502580705e+06 -9.760835574788061e+05 6.396987880274376e+06 -7.240376452456263e+03 2.777504442874113e+01 -2.576973941144470e+03 5.026956008600000e-03 1.887087963500000e-05 1.364478030000000e-03 1.572712893300000e-03 8.094874655400000e-05 1.571485617500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.340000000000000e+02 -2.285606309585317e+06 -9.760830015278392e+05 6.396936339204971e+06 -7.240320408133104e+03 2.782012163568413e+01 -2.577131703824703e+03 5.026956008600000e-03 1.887087963500000e-05 1.364478030000000e-03 1.572712893300000e-03 8.094874655400000e-05 1.571485617500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.350000000000000e+02 -2.285751115567339e+06 -9.760824446772329e+05 6.396884794944896e+06 -7.240264358867952e+03 2.786519888130462e+01 -2.577289468739074e+03 5.026956008600000e-03 1.887087963500000e-05 1.364478030000000e-03 1.572712893300000e-03 8.094874655400000e-05 1.571485617500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.360000000000000e+02 -2.285895920236005e+06 -9.760818869213887e+05 6.396833247598903e+06 -7.240208308311620e+03 2.791027473561243e+01 -2.577447225655318e+03 5.026337139100000e-03 1.869862025200000e-05 1.365270852900000e-03 1.572762033900000e-03 8.088270863200001e-05 1.572098524900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.370000000000000e+02 -2.286040723849862e+06 -9.760813282652867e+05 6.396781697073855e+06 -7.240152253377491e+03 2.795535123990447e+01 -2.577604983269424e+03 5.026337139100000e-03 1.869862025200000e-05 1.365270852900000e-03 1.572762033900000e-03 8.088270863200001e-05 1.572098524900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.380000000000000e+02 -2.286185526408636e+06 -9.760807687089306e+05 6.396730143369833e+06 -7.240096193815340e+03 2.800042773635897e+01 -2.577762742241461e+03 5.026337139100000e-03 1.869862025200000e-05 1.365270852900000e-03 1.572762033900000e-03 8.088270863200001e-05 1.572098524900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.390000000000000e+02 -2.286330327847483e+06 -9.760802082510783e+05 6.396678586510203e+06 -7.240040130656047e+03 2.804550372111132e+01 -2.577920499677002e+03 5.026337139100000e-03 1.869862025200000e-05 1.365270852900000e-03 1.572762033900000e-03 8.088270863200001e-05 1.572098524900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.400000000000000e+02 -2.286475128102201e+06 -9.760796468904938e+05 6.396627026518103e+06 -7.239984064567577e+03 2.809057970766446e+01 -2.578078253746362e+03 5.026337139100000e-03 1.869862025200000e-05 1.365270852900000e-03 1.572762033900000e-03 8.088270863200001e-05 1.572098524900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.410000000000000e+02 -2.286619927272137e+06 -9.760790846321683e+05 6.396575463366685e+06 -7.239928134330041e+03 2.813549909919095e+01 -2.578235610169228e+03 5.026337139100000e-03 1.869862025200000e-05 1.365270852900000e-03 1.572762033900000e-03 8.088270863200001e-05 1.572098524900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.420000000000000e+02 -2.286764725269291e+06 -9.760785214880939e+05 6.396523897127548e+06 -7.239872824287391e+03 2.817972212409606e+01 -2.578391193467496e+03 5.026337139100000e-03 1.869862025200000e-05 1.365270852900000e-03 1.572762033900000e-03 8.088270863200001e-05 1.572098524900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.430000000000000e+02 -2.286909522146170e+06 -9.760779574425288e+05 6.396472327732928e+06 -7.239816746855116e+03 2.822479773572820e+01 -2.578548944809038e+03 5.026337139100000e-03 1.869862025200000e-05 1.365270852900000e-03 1.572762033900000e-03 8.088270863200001e-05 1.572098524900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.440000000000000e+02 -2.287054317902975e+06 -9.760773924954890e+05 6.396420755182756e+06 -7.239760665796134e+03 2.826987286783884e+01 -2.578706694698330e+03 5.026337139100000e-03 1.869862025200000e-05 1.365270852900000e-03 1.572762033900000e-03 8.088270863200001e-05 1.572098524900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.450000000000000e+02 -2.287199112507148e+06 -9.760768266463564e+05 6.396369179488761e+06 -7.239704581360882e+03 2.831494746786623e+01 -2.578864442436447e+03 5.026337139100000e-03 1.869862025200000e-05 1.365270852900000e-03 1.572762033900000e-03 8.088270863200001e-05 1.572098524900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.460000000000000e+02 -2.287343906055846e+06 -9.760762598969949e+05 6.396317600615919e+06 -7.239648492485110e+03 2.836002274335237e+01 -2.579022191046506e+03 5.025717955700000e-03 1.852639019400000e-05 1.366063393100000e-03 1.572811191700000e-03 8.081658186900000e-05 1.572711787700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.470000000000000e+02 -2.287488698451761e+06 -9.760756922455452e+05 6.396266018599307e+06 -7.239592400324013e+03 2.840509717364512e+01 -2.579179937235767e+03 5.025717955700000e-03 1.852639019400000e-05 1.366063393100000e-03 1.572811191700000e-03 8.081658186900000e-05 1.572711787700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.480000000000000e+02 -2.287633489759783e+06 -9.760751236932568e+05 6.396214433415536e+06 -7.239536304114489e+03 2.845017196121083e+01 -2.579337683189784e+03 5.025717955700000e-03 1.852639019400000e-05 1.366063393100000e-03 1.572811191700000e-03 8.081658186900000e-05 1.572711787700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.490000000000000e+02 -2.287778279882814e+06 -9.760745542382677e+05 6.396162845099607e+06 -7.239480204971624e+03 2.849524618453719e+01 -2.579495425760122e+03 5.025717955700000e-03 1.852639019400000e-05 1.366063393100000e-03 1.572811191700000e-03 8.081658186900000e-05 1.572711787700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.500000000000000e+02 -2.287923068949656e+06 -9.760739838830638e+05 6.396111253605078e+06 -7.239424101330999e+03 2.854032021133921e+01 -2.579653169314093e+03 5.025717955700000e-03 1.852639019400000e-05 1.366063393100000e-03 1.572811191700000e-03 8.081658186900000e-05 1.572711787700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.510000000000000e+02 -2.288067856867225e+06 -9.760734126289767e+05 6.396059658976286e+06 -7.239368163306031e+03 2.858523497015602e+01 -2.579810432650710e+03 5.025717955700000e-03 1.852639019400000e-05 1.366063393100000e-03 1.572811191700000e-03 8.081658186900000e-05 1.572711787700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.520000000000000e+02 -2.288212643652388e+06 -9.760728404902616e+05 6.396008061255137e+06 -7.239312974231231e+03 2.862943859675016e+01 -2.579965565568122e+03 5.025717955700000e-03 1.852639019400000e-05 1.366063393100000e-03 1.572811191700000e-03 8.081658186900000e-05 1.572711787700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.530000000000000e+02 -2.288357429342582e+06 -9.760722674506013e+05 6.395956460369363e+06 -7.239256859989817e+03 2.867451197333691e+01 -2.580123304240407e+03 5.025717955700000e-03 1.852639019400000e-05 1.366063393100000e-03 1.572811191700000e-03 8.081658186900000e-05 1.572711787700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.540000000000000e+02 -2.288502213944438e+06 -9.760716935101160e+05 6.395904856316573e+06 -7.239200741695668e+03 2.871958588761422e+01 -2.580281042698601e+03 5.025717955700000e-03 1.852639019400000e-05 1.366063393100000e-03 1.572811191700000e-03 8.081658186900000e-05 1.572711787700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.550000000000000e+02 -2.288646997328596e+06 -9.760711186663372e+05 6.395853249143430e+06 -7.239144620869471e+03 2.876465879416523e+01 -2.580438776635551e+03 5.025717955700000e-03 1.852639019400000e-05 1.366063393100000e-03 1.572811191700000e-03 8.081658186900000e-05 1.572711787700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.560000000000000e+02 -2.288791779656128e+06 -9.760705429223671e+05 6.395801638791827e+06 -7.239088495607237e+03 2.880973148245761e+01 -2.580596511382762e+03 5.025098457900000e-03 1.835418935100000e-05 1.366855650800000e-03 1.572860366600000e-03 8.075036623100001e-05 1.573325406100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.570000000000000e+02 -2.288936560830558e+06 -9.760699662763444e+05 6.395750025296573e+06 -7.239032367133957e+03 2.885480444428370e+01 -2.580754243563802e+03 5.025098457900000e-03 1.835418935100000e-05 1.366855650800000e-03 1.572860366600000e-03 8.075036623100001e-05 1.573325406100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.580000000000000e+02 -2.289081341012756e+06 -9.760693887313668e+05 6.395698408599610e+06 -7.238976233200855e+03 2.889987759286447e+01 -2.580911979419654e+03 5.025098457900000e-03 1.835418935100000e-05 1.366855650800000e-03 1.572860366600000e-03 8.075036623100001e-05 1.573325406100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.590000000000000e+02 -2.289226119912628e+06 -9.760688102818772e+05 6.395646788805626e+06 -7.238920097750647e+03 2.894494991811828e+01 -2.581069707946198e+03 5.025098457900000e-03 1.835418935100000e-05 1.366855650800000e-03 1.572860366600000e-03 8.075036623100001e-05 1.573325406100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.600000000000000e+02 -2.289370897820321e+06 -9.760682309334379e+05 6.395595165809908e+06 -7.238863956896116e+03 2.899002254993644e+01 -2.581227439999309e+03 5.025098457900000e-03 1.835418935100000e-05 1.366855650800000e-03 1.572860366600000e-03 8.075036623100001e-05 1.573325406100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.610000000000000e+02 -2.289515674544979e+06 -9.760676506855184e+05 6.395543539691012e+06 -7.238807964666852e+03 2.903493612514774e+01 -2.581384739385715e+03 5.025098457900000e-03 1.835418935100000e-05 1.366855650800000e-03 1.572860366600000e-03 8.075036623100001e-05 1.573325406100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.620000000000000e+02 -2.289660450025181e+06 -9.760670695507686e+05 6.395491910514191e+06 -7.238752645133454e+03 2.907914460472398e+01 -2.581540122013574e+03 5.025098457900000e-03 1.835418935100000e-05 1.366855650800000e-03 1.572860366600000e-03 8.075036623100001e-05 1.573325406100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.630000000000000e+02 -2.289805224571157e+06 -9.760664875181955e+05 6.395440278114715e+06 -7.238696493344420e+03 2.912421668300155e+01 -2.581697850178983e+03 5.025098457900000e-03 1.835418935100000e-05 1.366855650800000e-03 1.572860366600000e-03 8.075036623100001e-05 1.573325406100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.640000000000000e+02 -2.289949997930836e+06 -9.760659045829854e+05 6.395388642583560e+06 -7.238640338690721e+03 2.916928799563058e+01 -2.581855574761423e+03 5.025098457900000e-03 1.835418935100000e-05 1.366855650800000e-03 1.572860366600000e-03 8.075036623100001e-05 1.573325406100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.650000000000000e+02 -2.290094770201375e+06 -9.760653207469865e+05 6.395337003885659e+06 -7.238584179963147e+03 2.921436001233221e+01 -2.582013299196476e+03 5.025098457900000e-03 1.835418935100000e-05 1.366855650800000e-03 1.572860366600000e-03 8.075036623100001e-05 1.573325406100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.660000000000000e+02 -2.290239541317943e+06 -9.760647360089717e+05 6.395285362044407e+06 -7.238528017909847e+03 2.925943127385636e+01 -2.582171021329378e+03 5.024478645400000e-03 1.818201766400000e-05 1.367647625700000e-03 1.572909558500000e-03 8.068406170600000e-05 1.573939380100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.670000000000000e+02 -2.290384311312535e+06 -9.760641503695662e+05 6.395233717048259e+06 -7.238471852180613e+03 2.930450202100016e+01 -2.582328742145229e+03 5.024478645400000e-03 1.818201766400000e-05 1.367647625700000e-03 1.572909558500000e-03 8.068406170600000e-05 1.573939380100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.680000000000000e+02 -2.290529080185495e+06 -9.760635638287659e+05 6.395182068897088e+06 -7.238415682750078e+03 2.934957332580871e+01 -2.582486461771593e+03 5.024478645400000e-03 1.818201766400000e-05 1.367647625700000e-03 1.572909558500000e-03 8.068406170600000e-05 1.573939380100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.690000000000000e+02 -2.290673847936535e+06 -9.760629763865777e+05 6.395130417590999e+06 -7.238359509716116e+03 2.939464400649510e+01 -2.582644179873846e+03 5.024478645400000e-03 1.818201766400000e-05 1.367647625700000e-03 1.572909558500000e-03 8.068406170600000e-05 1.573939380100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.700000000000000e+02 -2.290818614597644e+06 -9.760623880436238e+05 6.395078763118431e+06 -7.238303332469857e+03 2.943971449575105e+01 -2.582801898164672e+03 5.024478645400000e-03 1.818201766400000e-05 1.367647625700000e-03 1.572909558500000e-03 8.068406170600000e-05 1.573939380100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.710000000000000e+02 -2.290963380075546e+06 -9.760617988010518e+05 6.395027105523201e+06 -7.238247311332593e+03 2.948463512924437e+01 -2.582959163824855e+03 5.024478645400000e-03 1.818201766400000e-05 1.367647625700000e-03 1.572909558500000e-03 8.068406170600000e-05 1.573939380100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.720000000000000e+02 -2.291108144417879e+06 -9.760612086728580e+05 6.394975444833186e+06 -7.238191994427766e+03 2.952888794383520e+01 -2.583114428590055e+03 5.024478645400000e-03 1.818201766400000e-05 1.367647625700000e-03 1.572909558500000e-03 8.068406170600000e-05 1.573939380100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.730000000000000e+02 -2.291252907736897e+06 -9.760606176451733e+05 6.394923780952631e+06 -7.238135805885437e+03 2.957395849664306e+01 -2.583272143999923e+03 5.024478645400000e-03 1.818201766400000e-05 1.367647625700000e-03 1.572909558500000e-03 8.068406170600000e-05 1.573939380100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.740000000000000e+02 -2.291397669804573e+06 -9.760600257136548e+05 6.394872113963898e+06 -7.238079615232687e+03 2.961902809874917e+01 -2.583429853726253e+03 5.024478645400000e-03 1.818201766400000e-05 1.367647625700000e-03 1.572909558500000e-03 8.068406170600000e-05 1.573939380100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.750000000000000e+02 -2.291542430814216e+06 -9.760594328820052e+05 6.394820443797164e+06 -7.238023420106247e+03 2.966409741414219e+01 -2.583587564360988e+03 5.024478645400000e-03 1.818201766400000e-05 1.367647625700000e-03 1.572909558500000e-03 8.068406170600000e-05 1.573939380100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.760000000000000e+02 -2.291687190701631e+06 -9.760588391489886e+05 6.394768770475611e+06 -7.237967221342246e+03 2.970916728280076e+01 -2.583745273629112e+03 5.023858517700000e-03 1.800987507500000e-05 1.368439317700000e-03 1.572958767600000e-03 8.061766828000000e-05 1.574553709600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.770000000000000e+02 -2.291831949563343e+06 -9.760582445164587e+05 6.394717093964367e+06 -7.237911017625065e+03 2.975423709411103e+01 -2.583902985147161e+03 5.023858517700000e-03 1.800987507500000e-05 1.368439317700000e-03 1.572958767600000e-03 8.061766828000000e-05 1.574553709600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.780000000000000e+02 -2.291976707140942e+06 -9.760576489795009e+05 6.394665414356793e+06 -7.237854812234063e+03 2.979930555264932e+01 -2.584060689750534e+03 5.023858517700000e-03 1.800987507500000e-05 1.368439317700000e-03 1.572958767600000e-03 8.061766828000000e-05 1.574553709600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.790000000000000e+02 -2.292121463660633e+06 -9.760570525424210e+05 6.394613731571163e+06 -7.237798602423156e+03 2.984437478952364e+01 -2.584218395169166e+03 5.023858517700000e-03 1.800987507500000e-05 1.368439317700000e-03 1.572958767600000e-03 8.061766828000000e-05 1.574553709600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.800000000000000e+02 -2.292266219025328e+06 -9.760564552033758e+05 6.394562045642547e+06 -7.237742389215668e+03 2.988944339088948e+01 -2.584376098489790e+03 5.023858517700000e-03 1.800987507500000e-05 1.368439317700000e-03 1.572958767600000e-03 8.061766828000000e-05 1.574553709600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.810000000000000e+02 -2.292410973334332e+06 -9.760558569671058e+05 6.394510356543921e+06 -7.237686310426608e+03 2.993436752619436e+01 -2.584533409940624e+03 5.023858517700000e-03 1.800987507500000e-05 1.368439317700000e-03 1.572958767600000e-03 8.061766828000000e-05 1.574553709600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.820000000000000e+02 -2.292555726477986e+06 -9.760552578441491e+05 6.394458664354341e+06 -7.237630846964076e+03 2.997864808052671e+01 -2.584688969742283e+03 5.023858517700000e-03 1.800987507500000e-05 1.368439317700000e-03 1.572958767600000e-03 8.061766828000000e-05 1.574553709600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.830000000000000e+02 -2.292700478596974e+06 -9.760546578217306e+05 6.394406968974677e+06 -7.237574622015515e+03 3.002371632934796e+01 -2.584846671369621e+03 5.023858517700000e-03 1.800987507500000e-05 1.368439317700000e-03 1.572958767600000e-03 8.061766828000000e-05 1.574553709600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.840000000000000e+02 -2.292845229560888e+06 -9.760540568973637e+05 6.394355270452054e+06 -7.237518393763834e+03 3.006878463209105e+01 -2.585004370676514e+03 5.023858517700000e-03 1.800987507500000e-05 1.368439317700000e-03 1.572958767600000e-03 8.061766828000000e-05 1.574553709600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.850000000000000e+02 -2.292989979433971e+06 -9.760534550722780e+05 6.394303568763250e+06 -7.237462161487369e+03 3.011385269053383e+01 -2.585162069647875e+03 5.023858517700000e-03 1.800987507500000e-05 1.368439317700000e-03 1.572958767600000e-03 8.061766828000000e-05 1.574553709600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.860000000000000e+02 -2.293134728151418e+06 -9.760528523452533e+05 6.394251863931691e+06 -7.237405925831817e+03 3.015892012838120e+01 -2.585319766473749e+03 5.023238074400000e-03 1.783776147500000e-05 1.369230727100000e-03 1.573007993800000e-03 8.055118592000000e-05 1.575168394600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.870000000000000e+02 -2.293279475745837e+06 -9.760522487169009e+05 6.394200155945591e+06 -7.237349686553512e+03 3.020398809716028e+01 -2.585477461890743e+03 5.023238074400000e-03 1.783776147500000e-05 1.369230727100000e-03 1.573007993800000e-03 8.055118592000000e-05 1.575168394600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.880000000000000e+02 -2.293424222216934e+06 -9.760516441872289e+05 6.394148444805050e+06 -7.237293443585635e+03 3.024905533484136e+01 -2.585635156017186e+03 5.023238074400000e-03 1.783776147500000e-05 1.369230727100000e-03 1.573007993800000e-03 8.055118592000000e-05 1.575168394600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.890000000000000e+02 -2.293568967628970e+06 -9.760510387574703e+05 6.394096730486833e+06 -7.237237196115712e+03 3.029412259512358e+01 -2.585792851144640e+03 5.023238074400000e-03 1.783776147500000e-05 1.369230727100000e-03 1.573007993800000e-03 8.055118592000000e-05 1.575168394600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.900000000000000e+02 -2.293713711788699e+06 -9.760504324239400e+05 6.394045013060818e+06 -7.237180946585226e+03 3.033918962006393e+01 -2.585950540493322e+03 5.023238074400000e-03 1.783776147500000e-05 1.369230727100000e-03 1.573007993800000e-03 8.055118592000000e-05 1.575168394600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.910000000000000e+02 -2.293858454925149e+06 -9.760498251942170e+05 6.393993292455203e+06 -7.237124865264991e+03 3.038409279740068e+01 -2.586107743597503e+03 5.023238074400000e-03 1.783776147500000e-05 1.369230727100000e-03 1.573007993800000e-03 8.055118592000000e-05 1.575168394600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.920000000000000e+02 -2.294003196819273e+06 -9.760492170784394e+05 6.393941568798279e+06 -7.237069552947851e+03 3.042826561259133e+01 -2.586262765955171e+03 5.023238074400000e-03 1.783776147500000e-05 1.369230727100000e-03 1.573007993800000e-03 8.055118592000000e-05 1.575168394600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.930000000000000e+02 -2.294147937703182e+06 -9.760486080635128e+05 6.393889841946007e+06 -7.237013290853322e+03 3.047333258147071e+01 -2.586420455944234e+03 5.023238074400000e-03 1.783776147500000e-05 1.369230727100000e-03 1.573007993800000e-03 8.055118592000000e-05 1.575168394600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.940000000000000e+02 -2.294292677398818e+06 -9.760479981460582e+05 6.393838111962780e+06 -7.236957025848611e+03 3.051839900546298e+01 -2.586578142493151e+03 5.023238074400000e-03 1.783776147500000e-05 1.369230727100000e-03 1.573007993800000e-03 8.055118592000000e-05 1.575168394600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.950000000000000e+02 -2.294437415905899e+06 -9.760473873260852e+05 6.393786378848707e+06 -7.236900757970584e+03 3.056346446907867e+01 -2.586735825478288e+03 5.023238074400000e-03 1.783776147500000e-05 1.369230727100000e-03 1.573007993800000e-03 8.055118592000000e-05 1.575168394600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.960000000000000e+02 -2.294582153418332e+06 -9.760467756072703e+05 6.393734642533642e+06 -7.236844484845044e+03 3.060853102638055e+01 -2.586893511585223e+03 5.022617315300000e-03 1.766567690700000e-05 1.370021853100000e-03 1.573057237000000e-03 8.048461465400000e-05 1.575783434900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.970000000000000e+02 -2.294726889677539e+06 -9.760461629847207e+05 6.393682903111126e+06 -7.236788209591698e+03 3.065359604871011e+01 -2.587051192033140e+03 5.022617315300000e-03 1.766567690700000e-05 1.370021853100000e-03 1.573057237000000e-03 8.048461465400000e-05 1.575783434900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.980000000000000e+02 -2.294871624877435e+06 -9.760455494621064e+05 6.393631160511006e+06 -7.236731929901989e+03 3.069866210566656e+01 -2.587208873352524e+03 5.022617315300000e-03 1.766567690700000e-05 1.370021853100000e-03 1.573057237000000e-03 8.048461465400000e-05 1.575783434900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.990000000000000e+02 -2.295016358985462e+06 -9.760449350388256e+05 6.393579414745055e+06 -7.236675646093920e+03 3.074372746846029e+01 -2.587366554570927e+03 5.022617315300000e-03 1.766567690700000e-05 1.370021853100000e-03 1.573057237000000e-03 8.048461465400000e-05 1.575783434900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.000000000000000e+02 -2.295161091936836e+06 -9.760443197136567e+05 6.393527665836710e+06 -7.236619358959299e+03 3.078879250905226e+01 -2.587524233515053e+03 5.022617315300000e-03 1.766567690700000e-05 1.370021853100000e-03 1.573057237000000e-03 8.048461465400000e-05 1.575783434900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.010000000000000e+02 -2.295305823734731e+06 -9.760437034897252e+05 6.393475913793887e+06 -7.236563210611585e+03 3.083370137248011e+01 -2.587681508449275e+03 5.022617315300000e-03 1.766567690700000e-05 1.370021853100000e-03 1.573057237000000e-03 8.048461465400000e-05 1.575783434900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.020000000000000e+02 -2.295450554388224e+06 -9.760430863809088e+05 6.393424158653639e+06 -7.236507691514919e+03 3.087791296513731e+01 -2.587836992923308e+03 5.022617315300000e-03 1.766567690700000e-05 1.370021853100000e-03 1.573057237000000e-03 8.048461465400000e-05 1.575783434900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.030000000000000e+02 -2.295595284056861e+06 -9.760424683734763e+05 6.393372400308819e+06 -7.236451392176989e+03 3.092297795193818e+01 -2.587994671478064e+03 5.022617315300000e-03 1.766567690700000e-05 1.370021853100000e-03 1.573057237000000e-03 8.048461465400000e-05 1.575783434900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.040000000000000e+02 -2.295740012472176e+06 -9.760418494623333e+05 6.393320638856594e+06 -7.236395090851075e+03 3.096804253527199e+01 -2.588152344048434e+03 5.022617315300000e-03 1.766567690700000e-05 1.370021853100000e-03 1.573057237000000e-03 8.048461465400000e-05 1.575783434900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.050000000000000e+02 -2.295884739827454e+06 -9.760412296511510e+05 6.393268874227008e+06 -7.236338784991539e+03 3.101310716756853e+01 -2.588310017706264e+03 5.022617315300000e-03 1.766567690700000e-05 1.370021853100000e-03 1.573057237000000e-03 8.048461465400000e-05 1.575783434900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.060000000000000e+02 -2.296029465961111e+06 -9.760406089368826e+05 6.393217106478547e+06 -7.236282476676600e+03 3.105817060508667e+01 -2.588467686632862e+03 5.021996240100000e-03 1.749362126200000e-05 1.370812695800000e-03 1.573106497300000e-03 8.041795444800000e-05 1.576398830400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.070000000000000e+02 -2.296174191099301e+06 -9.760399873238052e+05 6.393165335529345e+06 -7.236226163094817e+03 3.110323511085139e+01 -2.588625358729942e+03 5.021996240100000e-03 1.749362126200000e-05 1.370812695800000e-03 1.573106497300000e-03 8.041795444800000e-05 1.576398830400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.080000000000000e+02 -2.296318914983477e+06 -9.760393648070358e+05 6.393113561472998e+06 -7.236169847393219e+03 3.114829841111899e+01 -2.588783025166774e+03 5.021996240100000e-03 1.749362126200000e-05 1.370812695800000e-03 1.573106497300000e-03 8.041795444800000e-05 1.576398830400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.090000000000000e+02 -2.296463637872025e+06 -9.760387413914617e+05 6.393061784215954e+06 -7.236113526439421e+03 3.119336251797836e+01 -2.588940694719135e+03 5.021996240100000e-03 1.749362126200000e-05 1.370812695800000e-03 1.573106497300000e-03 8.041795444800000e-05 1.576398830400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.100000000000000e+02 -2.296608359474371e+06 -9.760381170715974e+05 6.393010003863432e+06 -7.236057203784588e+03 3.123842545742923e+01 -2.589098357454976e+03 5.021996240100000e-03 1.749362126200000e-05 1.370812695800000e-03 1.573106497300000e-03 8.041795444800000e-05 1.576398830400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.110000000000000e+02 -2.296753080084058e+06 -9.760374918561256e+05 6.392958220320317e+06 -7.236001051903615e+03 3.128332921469996e+01 -2.589255527808722e+03 5.021996240100000e-03 1.749362126200000e-05 1.370812695800000e-03 1.573106497300000e-03 8.041795444800000e-05 1.576398830400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.120000000000000e+02 -2.296897799616606e+06 -9.760368657573452e+05 6.392906433667007e+06 -7.235945680012991e+03 3.132752336964239e+01 -2.589410491302286e+03 5.021996240100000e-03 1.749362126200000e-05 1.370812695800000e-03 1.573106497300000e-03 8.041795444800000e-05 1.576398830400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.130000000000000e+02 -2.297042517886498e+06 -9.760362387547339e+05 6.392854643909698e+06 -7.235889346013307e+03 3.137258598967952e+01 -2.589568151307526e+03 5.021996240100000e-03 1.749362126200000e-05 1.370812695800000e-03 1.573106497300000e-03 8.041795444800000e-05 1.576398830400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.140000000000000e+02 -2.297187235095473e+06 -9.760356108521180e+05 6.392802850975322e+06 -7.235833007526532e+03 3.141764840220623e+01 -2.589725812256739e+03 5.021996240100000e-03 1.749362126200000e-05 1.370812695800000e-03 1.573106497300000e-03 8.041795444800000e-05 1.576398830400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.150000000000000e+02 -2.297331951179355e+06 -9.760349820482755e+05 6.392751054887115e+06 -7.235776665327678e+03 3.146271119006934e+01 -2.589883472036084e+03 5.021996240100000e-03 1.749362126200000e-05 1.370812695800000e-03 1.573106497300000e-03 8.041795444800000e-05 1.576398830400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.160000000000000e+02 -2.297476666137875e+06 -9.760343523432106e+05 6.392699255645178e+06 -7.235720319439543e+03 3.150777372445521e+01 -2.590041130549449e+03 5.021374848300000e-03 1.732159448200000e-05 1.371603255200000e-03 1.573155774700000e-03 8.035120528800000e-05 1.577014581100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.170000000000000e+02 -2.297621380002997e+06 -9.760337217375438e+05 6.392647453237933e+06 -7.235663969526699e+03 3.155283553382151e+01 -2.590198788699860e+03 5.021374848300000e-03 1.732159448200000e-05 1.371603255200000e-03 1.573155774700000e-03 8.035120528800000e-05 1.577014581100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.180000000000000e+02 -2.297766092710560e+06 -9.760330902300513e+05 6.392595647688617e+06 -7.235607616267703e+03 3.159789792104684e+01 -2.590356444678804e+03 5.021374848300000e-03 1.732159448200000e-05 1.371603255200000e-03 1.573155774700000e-03 8.035120528800000e-05 1.577014581100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.190000000000000e+02 -2.297910804292535e+06 -9.760324578213510e+05 6.392543838985648e+06 -7.235551259330372e+03 3.164295973286852e+01 -2.590514099344590e+03 5.021374848300000e-03 1.732159448200000e-05 1.371603255200000e-03 1.573155774700000e-03 8.035120528800000e-05 1.577014581100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.200000000000000e+02 -2.298055514651875e+06 -9.760318245096196e+05 6.392492027164192e+06 -7.235494899919402e+03 3.168802052275547e+01 -2.590671749342333e+03 5.021374848300000e-03 1.732159448200000e-05 1.371603255200000e-03 1.573155774700000e-03 8.035120528800000e-05 1.577014581100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.210000000000000e+02 -2.298200224082076e+06 -9.760311903033106e+05 6.392440212126990e+06 -7.235438677349632e+03 3.173293409504456e+01 -2.590829001771826e+03 5.021374848300000e-03 1.732159448200000e-05 1.371603255200000e-03 1.573155774700000e-03 8.035120528800000e-05 1.577014581100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.220000000000000e+02 -2.298344932302782e+06 -9.760305552101495e+05 6.392388394016127e+06 -7.235383088658174e+03 3.177718440178595e+01 -2.590984455353287e+03 5.021374848300000e-03 1.732159448200000e-05 1.371603255200000e-03 1.573155774700000e-03 8.035120528800000e-05 1.577014581100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.230000000000000e+02 -2.298489639389528e+06 -9.760299192156357e+05 6.392336572754644e+06 -7.235326717079159e+03 3.182224581918928e+01 -2.591142104885861e+03 5.021374848300000e-03 1.732159448200000e-05 1.371603255200000e-03 1.573155774700000e-03 8.035120528800000e-05 1.577014581100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.240000000000000e+02 -2.298634345285808e+06 -9.760292823187136e+05 6.392284748363018e+06 -7.235270342587253e+03 3.186730634701280e+01 -2.591299750972697e+03 5.021374848300000e-03 1.732159448200000e-05 1.371603255200000e-03 1.573155774700000e-03 8.035120528800000e-05 1.577014581100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.250000000000000e+02 -2.298779050184865e+06 -9.760286445230371e+05 6.392232920771204e+06 -7.235213962854798e+03 3.191236717216555e+01 -2.591457400111187e+03 5.021374848300000e-03 1.732159448200000e-05 1.371603255200000e-03 1.573155774700000e-03 8.035120528800000e-05 1.577014581100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.260000000000000e+02 -2.298923753893520e+06 -9.760280058249605e+05 6.392181090049224e+06 -7.235157580216531e+03 3.195742794732149e+01 -2.591615045828348e+03 5.020753139600000e-03 1.714959650700000e-05 1.372393531200000e-03 1.573205069100000e-03 8.028436716200000e-05 1.577630687100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.270000000000000e+02 -2.299068456379248e+06 -9.760273662238794e+05 6.392129256208871e+06 -7.235101195131421e+03 3.200248784460427e+01 -2.591772686812657e+03 5.020753139600000e-03 1.714959650700000e-05 1.372393531200000e-03 1.573205069100000e-03 8.028436716200000e-05 1.577630687100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.280000000000000e+02 -2.299213157835276e+06 -9.760267257234468e+05 6.392077419180094e+06 -7.235044805076574e+03 3.204754776421592e+01 -2.591930330085002e+03 5.020753139600000e-03 1.714959650700000e-05 1.372393531200000e-03 1.573205069100000e-03 8.028436716200000e-05 1.577630687100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.290000000000000e+02 -2.299357858197436e+06 -9.760260843224470e+05 6.392025578986151e+06 -7.234988411029499e+03 3.209260818900003e+01 -2.592087972968332e+03 5.020753139600000e-03 1.714959650700000e-05 1.372393531200000e-03 1.573205069100000e-03 8.028436716200000e-05 1.577630687100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.300000000000000e+02 -2.299502557400950e+06 -9.760254420196683e+05 6.391973735650529e+06 -7.234932013643483e+03 3.213766806890573e+01 -2.592245613602176e+03 5.020753139600000e-03 1.714959650700000e-05 1.372393531200000e-03 1.573205069100000e-03 8.028436716200000e-05 1.577630687100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.310000000000000e+02 -2.299647255480698e+06 -9.760247988186900e+05 6.391921889169828e+06 -7.234875758073320e+03 3.218257916735200e+01 -2.592402843132475e+03 5.020753139600000e-03 1.714959650700000e-05 1.372393531200000e-03 1.573205069100000e-03 8.028436716200000e-05 1.577630687100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.320000000000000e+02 -2.299791952487081e+06 -9.760241547334178e+05 6.391870039566969e+06 -7.234820146374444e+03 3.222683060912212e+01 -2.592558247726564e+03 5.020753139600000e-03 1.714959650700000e-05 1.372393531200000e-03 1.573205069100000e-03 8.028436716200000e-05 1.577630687100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.330000000000000e+02 -2.299936648420820e+06 -9.760235097480015e+05 6.391818186791234e+06 -7.234763737210457e+03 3.227189011201574e+01 -2.592715886784233e+03 5.020753139600000e-03 1.714959650700000e-05 1.372393531200000e-03 1.573205069100000e-03 8.028436716200000e-05 1.577630687100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.340000000000000e+02 -2.300081343163576e+06 -9.760228638602195e+05 6.391766330885543e+06 -7.234707325143291e+03 3.231694934494567e+01 -2.592873522402964e+03 5.020753139600000e-03 1.714959650700000e-05 1.372393531200000e-03 1.573205069100000e-03 8.028436716200000e-05 1.577630687100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.350000000000000e+02 -2.300226036715068e+06 -9.760222170700709e+05 6.391714471850006e+06 -7.234650910261606e+03 3.236200794692300e+01 -2.593031154319448e+03 5.020753139600000e-03 1.714959650700000e-05 1.372393531200000e-03 1.573205069100000e-03 8.028436716200000e-05 1.577630687100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.360000000000000e+02 -2.300370729139518e+06 -9.760215693787773e+05 6.391662609661322e+06 -7.234594491633615e+03 3.240706614629158e+01 -2.593188785120072e+03 5.020131113400000e-03 1.697762722800000e-05 1.373183523700000e-03 1.573254380600000e-03 8.021744003500000e-05 1.578247148300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.370000000000000e+02 -2.300515420566265e+06 -9.760209207887572e+05 6.391610744272572e+06 -7.234538067779573e+03 3.245212538057694e+01 -2.593346418967174e+03 5.020131113400000e-03 1.697762722800000e-05 1.373183523700000e-03 1.573254380600000e-03 8.021744003500000e-05 1.578247148300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.380000000000000e+02 -2.300660110833783e+06 -9.760202712969959e+05 6.391558875742348e+06 -7.234481640606480e+03 3.249718387586299e+01 -2.593504050500144e+03 5.020131113400000e-03 1.697762722800000e-05 1.373183523700000e-03 1.573254380600000e-03 8.021744003500000e-05 1.578247148300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.390000000000000e+02 -2.300804799941776e+06 -9.760196209034873e+05 6.391507004070750e+06 -7.234425210064124e+03 3.254224184045728e+01 -2.593661679868741e+03 5.020131113400000e-03 1.697762722800000e-05 1.373183523700000e-03 1.573254380600000e-03 8.021744003500000e-05 1.578247148300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.400000000000000e+02 -2.300949487922850e+06 -9.760189696088424e+05 6.391455129245961e+06 -7.234368775944558e+03 3.258730027331984e+01 -2.593819307699521e+03 5.020131113400000e-03 1.697762722800000e-05 1.373183523700000e-03 1.573254380600000e-03 8.021744003500000e-05 1.578247148300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.410000000000000e+02 -2.301094174747752e+06 -9.760183174156197e+05 6.391403251288996e+06 -7.234312502456978e+03 3.263220007603206e+01 -2.593976472250044e+03 5.020131113400000e-03 1.697762722800000e-05 1.373183523700000e-03 1.573254380600000e-03 8.021744003500000e-05 1.578247148300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.420000000000000e+02 -2.301238860419793e+06 -9.760176643376765e+05 6.391351370245011e+06 -7.234256955853776e+03 3.267639628745516e+01 -2.594131581676538e+03 5.020131113400000e-03 1.697762722800000e-05 1.373183523700000e-03 1.573254380600000e-03 8.021744003500000e-05 1.578247148300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.430000000000000e+02 -2.301383545014137e+06 -9.760170103595363e+05 6.391299486029962e+06 -7.234200510341783e+03 3.272145429543352e+01 -2.594289206863173e+03 5.020131113400000e-03 1.697762722800000e-05 1.373183523700000e-03 1.573254380600000e-03 8.021744003500000e-05 1.578247148300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.440000000000000e+02 -2.301528228448805e+06 -9.760163554796703e+05 6.391247598673602e+06 -7.234144061562250e+03 3.276651160733459e+01 -2.594446829596317e+03 5.020131113400000e-03 1.697762722800000e-05 1.373183523700000e-03 1.573254380600000e-03 8.021744003500000e-05 1.578247148300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.450000000000000e+02 -2.301672910820268e+06 -9.760156996998999e+05 6.391195708140914e+06 -7.234087608286742e+03 3.281156885219096e+01 -2.594604453300289e+03 5.020131113400000e-03 1.697762722800000e-05 1.373183523700000e-03 1.573254380600000e-03 8.021744003500000e-05 1.578247148300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.460000000000000e+02 -2.301817591903123e+06 -9.760150430159904e+05 6.391143814513717e+06 -7.234031153342731e+03 3.285662551118131e+01 -2.594762070142385e+03 5.019508769700000e-03 1.680568669000000e-05 1.373973232300000e-03 1.573303709100000e-03 8.015042393500000e-05 1.578863964400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.470000000000000e+02 -2.301962271954871e+06 -9.760143854327915e+05 6.391091917698540e+06 -7.233974693509971e+03 3.290168199751173e+01 -2.594919689034170e+03 5.019508769700000e-03 1.680568669000000e-05 1.373973232300000e-03 1.573303709100000e-03 8.015042393500000e-05 1.578863964400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.480000000000000e+02 -2.302106950911362e+06 -9.760137269490858e+05 6.391040017718662e+06 -7.233918229630690e+03 3.294673914343315e+01 -2.595077307693565e+03 5.019508769700000e-03 1.680568669000000e-05 1.373973232300000e-03 1.573303709100000e-03 8.015042393500000e-05 1.578863964400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.490000000000000e+02 -2.302251628707810e+06 -9.760130675636790e+05 6.390988114597604e+06 -7.233861762391188e+03 3.299179539746572e+01 -2.595234924145538e+03 5.019508769700000e-03 1.680568669000000e-05 1.373973232300000e-03 1.573303709100000e-03 8.015042393500000e-05 1.578863964400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.500000000000000e+02 -2.302396305376188e+06 -9.760124072771736e+05 6.390936208323758e+06 -7.233805291545704e+03 3.303685142915310e+01 -2.595392539103342e+03 5.019508769700000e-03 1.680568669000000e-05 1.373973232300000e-03 1.573303709100000e-03 8.015042393500000e-05 1.578863964400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.510000000000000e+02 -2.302540980919675e+06 -9.760117460927095e+05 6.390884298904980e+06 -7.233748958670242e+03 3.308175087610030e+01 -2.595549753762369e+03 5.019508769700000e-03 1.680568669000000e-05 1.373973232300000e-03 1.573303709100000e-03 8.015042393500000e-05 1.578863964400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.520000000000000e+02 -2.302685655343970e+06 -9.760110840241499e+05 6.390832386379334e+06 -7.233693253195255e+03 3.312595080405259e+01 -2.595705189518026e+03 5.019508769700000e-03 1.680568669000000e-05 1.373973232300000e-03 1.573303709100000e-03 8.015042393500000e-05 1.578863964400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.530000000000000e+02 -2.302830328659843e+06 -9.760104210548747e+05 6.390780470693761e+06 -7.233636770973645e+03 3.317100649882238e+01 -2.595862801772251e+03 5.019508769700000e-03 1.680568669000000e-05 1.373973232300000e-03 1.573303709100000e-03 8.015042393500000e-05 1.578863964400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.540000000000000e+02 -2.302975000783268e+06 -9.760097571833066e+05 6.390728551878775e+06 -7.233580285786195e+03 3.321606215106934e+01 -2.596020410775433e+03 5.019508769700000e-03 1.680568669000000e-05 1.373973232300000e-03 1.573303709100000e-03 8.015042393500000e-05 1.578863964400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.550000000000000e+02 -2.303119671746221e+06 -9.760090924100579e+05 6.390676629922768e+06 -7.233523797424321e+03 3.326111704583005e+01 -2.596178017066318e+03 5.019508769700000e-03 1.680568669000000e-05 1.373973232300000e-03 1.573303709100000e-03 8.015042393500000e-05 1.578863964400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.560000000000000e+02 -2.303264341709640e+06 -9.760084267381456e+05 6.390624704767272e+06 -7.233467303645565e+03 3.330617231240166e+01 -2.596335626889870e+03 5.018886108000000e-03 1.663377478100000e-05 1.374762657100000e-03 1.573353054600000e-03 8.008331882600000e-05 1.579481135400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.570000000000000e+02 -2.303409010415908e+06 -9.760077601627480e+05 6.390572776505874e+06 -7.233410807938605e+03 3.335122717111173e+01 -2.596493230581415e+03 5.018886108000000e-03 1.663377478100000e-05 1.374762657100000e-03 1.573353054600000e-03 8.008331882600000e-05 1.579481135400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.580000000000000e+02 -2.303553678154747e+06 -9.760070926892975e+05 6.390520845033318e+06 -7.233354306418226e+03 3.339628225006695e+01 -2.596650838890849e+03 5.018886108000000e-03 1.663377478100000e-05 1.374762657100000e-03 1.573353054600000e-03 8.008331882600000e-05 1.579481135400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.590000000000000e+02 -2.303698344604038e+06 -9.760064243117662e+05 6.390468910466627e+06 -7.233297803276848e+03 3.344133668730038e+01 -2.596808440209386e+03 5.018886108000000e-03 1.663377478100000e-05 1.374762657100000e-03 1.573353054600000e-03 8.008331882600000e-05 1.579481135400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.600000000000000e+02 -2.303843009989225e+06 -9.760057550343777e+05 6.390416972723898e+06 -7.233241295681996e+03 3.348639122742989e+01 -2.596966042388359e+03 5.018886108000000e-03 1.663377478100000e-05 1.374762657100000e-03 1.573353054600000e-03 8.008331882600000e-05 1.579481135400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.610000000000000e+02 -2.303987674248873e+06 -9.760050848591599e+05 6.390365031838028e+06 -7.233184951153392e+03 3.353128379276615e+01 -2.597123175074384e+03 5.018886108000000e-03 1.663377478100000e-05 1.374762657100000e-03 1.573353054600000e-03 8.008331882600000e-05 1.579481135400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.620000000000000e+02 -2.304132337399315e+06 -9.760044138004952e+05 6.390313087850197e+06 -7.233129345977893e+03 3.357545878505539e+01 -2.597278220524346e+03 5.018886108000000e-03 1.663377478100000e-05 1.374762657100000e-03 1.573353054600000e-03 8.008331882600000e-05 1.579481135400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.630000000000000e+02 -2.304276999405974e+06 -9.760037418405013e+05 6.390261140715275e+06 -7.233072827403797e+03 3.362051256433864e+01 -2.597435818906247e+03 5.018886108000000e-03 1.663377478100000e-05 1.374762657100000e-03 1.573353054600000e-03 8.008331882600000e-05 1.579481135400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.640000000000000e+02 -2.304421660283534e+06 -9.760030689794616e+05 6.390209190427921e+06 -7.233016305136201e+03 3.366556600214747e+01 -2.597593416029368e+03 5.018886108000000e-03 1.663377478100000e-05 1.374762657100000e-03 1.573353054600000e-03 8.008331882600000e-05 1.579481135400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.650000000000000e+02 -2.304566320032335e+06 -9.760023952173759e+05 6.390157236988008e+06 -7.232959779124208e+03 3.371061979206698e+01 -2.597751012069913e+03 5.018886108000000e-03 1.663377478100000e-05 1.374762657100000e-03 1.573353054600000e-03 8.008331882600000e-05 1.579481135400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.660000000000000e+02 -2.304710978652103e+06 -9.760017205542516e+05 6.390105280395642e+06 -7.232903249524650e+03 3.375567314394053e+01 -2.597908606554642e+03 5.018263127900000e-03 1.646189144500000e-05 1.375551797800000e-03 1.573402417100000e-03 8.001612469600000e-05 1.580098661500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.670000000000000e+02 -2.304855636078063e+06 -9.760010449888910e+05 6.390053320674362e+06 -7.232846716921988e+03 3.380072561475990e+01 -2.598066197849610e+03 5.018263127900000e-03 1.646189144500000e-05 1.375551797800000e-03 1.573402417100000e-03 8.001612469600000e-05 1.580098661500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.680000000000000e+02 -2.305000292504015e+06 -9.760003685248996e+05 6.390001357753716e+06 -7.232790179141709e+03 3.384577920270254e+01 -2.598223792052215e+03 5.018263127900000e-03 1.646189144500000e-05 1.375551797800000e-03 1.573402417100000e-03 8.001612469600000e-05 1.580098661500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.690000000000000e+02 -2.305144947736228e+06 -9.759996911586766e+05 6.389949391704139e+06 -7.232733638513234e+03 3.389083207028264e+01 -2.598381382646376e+03 5.018263127900000e-03 1.646189144500000e-05 1.375551797800000e-03 1.573402417100000e-03 8.001612469600000e-05 1.580098661500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.700000000000000e+02 -2.305289601838896e+06 -9.759990128914282e+05 6.389897422502275e+06 -7.232677093988549e+03 3.393588443860386e+01 -2.598538972532311e+03 5.018263127900000e-03 1.646189144500000e-05 1.375551797800000e-03 1.573402417100000e-03 8.001612469600000e-05 1.580098661500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.710000000000000e+02 -2.305434254815036e+06 -9.759983337261686e+05 6.389845450155530e+06 -7.232620679596188e+03 3.398078651740127e+01 -2.598696184633669e+03 5.018263127900000e-03 1.646189144500000e-05 1.375551797800000e-03 1.573402417100000e-03 8.001612469600000e-05 1.580098661500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.720000000000000e+02 -2.305578906673605e+06 -9.759976536762562e+05 6.389793474698432e+06 -7.232564856106836e+03 3.402501798416407e+01 -2.598851722526878e+03 5.018263127900000e-03 1.646189144500000e-05 1.375551797800000e-03 1.573402417100000e-03 8.001612469600000e-05 1.580098661500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.730000000000000e+02 -2.305723557424678e+06 -9.759969727257353e+05 6.389741496081029e+06 -7.232508300275673e+03 3.407007053351742e+01 -2.599009309559314e+03 5.018263127900000e-03 1.646189144500000e-05 1.375551797800000e-03 1.573402417100000e-03 8.001612469600000e-05 1.580098661500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.740000000000000e+02 -2.305868206949405e+06 -9.759962908724044e+05 6.389689514346557e+06 -7.232451742136782e+03 3.411512199289439e+01 -2.599166891476089e+03 5.018263127900000e-03 1.646189144500000e-05 1.375551797800000e-03 1.573402417100000e-03 8.001612469600000e-05 1.580098661500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.750000000000000e+02 -2.306012855376469e+06 -9.759956081186660e+05 6.389637529448207e+06 -7.232395179782359e+03 3.416017325231181e+01 -2.599324473579984e+03 5.018263127900000e-03 1.646189144500000e-05 1.375551797800000e-03 1.573402417100000e-03 8.001612469600000e-05 1.580098661500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.760000000000000e+02 -2.306157502738447e+06 -9.759949244651252e+05 6.389585541374129e+06 -7.232338613014128e+03 3.420522524026012e+01 -2.599482056464748e+03 5.017639829100000e-03 1.629003662300000e-05 1.376340654400000e-03 1.573451796600000e-03 7.994884153100000e-05 1.580716542400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.770000000000000e+02 -2.306302148938335e+06 -9.759942399099814e+05 6.389533550159602e+06 -7.232282042920642e+03 3.425027659133721e+01 -2.599639637060999e+03 5.017639829100000e-03 1.629003662300000e-05 1.376340654400000e-03 1.573451796600000e-03 7.994884153100000e-05 1.580716542400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.780000000000000e+02 -2.306446794008099e+06 -9.759935544538414e+05 6.389481555793001e+06 -7.232225469144749e+03 3.429532751864599e+01 -2.599797216363729e+03 5.017639829100000e-03 1.629003662300000e-05 1.376340654400000e-03 1.573451796600000e-03 7.994884153100000e-05 1.580716542400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.790000000000000e+02 -2.306591437948074e+06 -9.759928680967103e+05 6.389429558274202e+06 -7.232168891696190e+03 3.434037866281784e+01 -2.599954794379061e+03 5.017639829100000e-03 1.629003662300000e-05 1.376340654400000e-03 1.573451796600000e-03 7.994884153100000e-05 1.580716542400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.800000000000000e+02 -2.306736080757986e+06 -9.759921808385875e+05 6.389377557603304e+06 -7.232112310624472e+03 3.438542955266476e+01 -2.600112370946413e+03 5.017639829100000e-03 1.629003662300000e-05 1.376340654400000e-03 1.573451796600000e-03 7.994884153100000e-05 1.580716542400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.810000000000000e+02 -2.306880722441456e+06 -9.759914926823219e+05 6.389325553791297e+06 -7.232055920844881e+03 3.443033786482727e+01 -2.600269401968038e+03 5.017639829100000e-03 1.629003662300000e-05 1.376340654400000e-03 1.573451796600000e-03 7.994884153100000e-05 1.580716542400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.820000000000000e+02 -2.307025363119745e+06 -9.759908036424856e+05 6.389273546848882e+06 -7.232000395190915e+03 3.447461454458838e+01 -2.600424009625004e+03 5.017639829100000e-03 1.629003662300000e-05 1.376340654400000e-03 1.573451796600000e-03 7.994884153100000e-05 1.580716542400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.830000000000000e+02 -2.307170002591421e+06 -9.759901137002571e+05 6.389221536782218e+06 -7.231943803096415e+03 3.451966461308064e+01 -2.600581582536063e+03 5.017639829100000e-03 1.629003662300000e-05 1.376340654400000e-03 1.573451796600000e-03 7.994884153100000e-05 1.580716542400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.840000000000000e+02 -2.307314640868469e+06 -9.759894228558550e+05 6.389169523586949e+06 -7.231887208119981e+03 3.456471463671934e+01 -2.600739151969119e+03 5.017639829100000e-03 1.629003662300000e-05 1.376340654400000e-03 1.573451796600000e-03 7.994884153100000e-05 1.580716542400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.850000000000000e+02 -2.307459278144036e+06 -9.759887311128780e+05 6.389117507192772e+06 -7.231830607864847e+03 3.460976477226782e+01 -2.600896724531353e+03 5.017639829100000e-03 1.629003662300000e-05 1.376340654400000e-03 1.573451796600000e-03 7.994884153100000e-05 1.580716542400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.860000000000000e+02 -2.307603914127703e+06 -9.759880384659404e+05 6.389065487705395e+06 -7.231774005916011e+03 3.465481376557278e+01 -2.601054290288031e+03 5.017016211000000e-03 1.611821020400000e-05 1.377129227100000e-03 1.573501193200000e-03 7.988146929600000e-05 1.581334778300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.870000000000000e+02 -2.307748549109946e+06 -9.759873449204298e+05 6.389013465019081e+06 -7.231717398699397e+03 3.469986377513990e+01 -2.601211859189825e+03 5.017016211000000e-03 1.611821020400000e-05 1.377129227100000e-03 1.573501193200000e-03 7.988146929600000e-05 1.581334778300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.880000000000000e+02 -2.307893182929296e+06 -9.759866504733636e+05 6.388961439192609e+06 -7.231660788197129e+03 3.474491300317368e+01 -2.601369425687496e+03 5.017016211000000e-03 1.611821020400000e-05 1.377129227100000e-03 1.573501193200000e-03 7.988146929600000e-05 1.581334778300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.890000000000000e+02 -2.308037815553240e+06 -9.759859551241413e+05 6.388909410237816e+06 -7.231604174828954e+03 3.478996168694732e+01 -2.601526988638191e+03 5.017016211000000e-03 1.611821020400000e-05 1.377129227100000e-03 1.573501193200000e-03 7.988146929600000e-05 1.581334778300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.900000000000000e+02 -2.308182447207774e+06 -9.759852588769560e+05 6.388857378072411e+06 -7.231547555696520e+03 3.483501145103153e+01 -2.601684556102601e+03 5.017016211000000e-03 1.611821020400000e-05 1.377129227100000e-03 1.573501193200000e-03 7.988146929600000e-05 1.581334778300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.910000000000000e+02 -2.308327077637313e+06 -9.759845617303624e+05 6.388805342797697e+06 -7.231491063611123e+03 3.487989340249192e+01 -2.601841753922066e+03 5.017016211000000e-03 1.611821020400000e-05 1.377129227100000e-03 1.573501193200000e-03 7.988146929600000e-05 1.581334778300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.920000000000000e+02 -2.308471706840635e+06 -9.759838636989928e+05 6.388753304450812e+06 -7.231435145628209e+03 3.492403167255549e+01 -2.601997322448986e+03 5.017016211000000e-03 1.611821020400000e-05 1.377129227100000e-03 1.573501193200000e-03 7.988146929600000e-05 1.581334778300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.930000000000000e+02 -2.308616334964999e+06 -9.759831647676412e+05 6.388701262933206e+06 -7.231378516810354e+03 3.496908034197929e+01 -2.602154882496796e+03 5.017016211000000e-03 1.611821020400000e-05 1.377129227100000e-03 1.573501193200000e-03 7.988146929600000e-05 1.581334778300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.940000000000000e+02 -2.308760961958274e+06 -9.759824649353505e+05 6.388649218263859e+06 -7.231321884333040e+03 3.501412868617993e+01 -2.602312441193087e+03 5.017016211000000e-03 1.611821020400000e-05 1.377129227100000e-03 1.573501193200000e-03 7.988146929600000e-05 1.581334778300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.950000000000000e+02 -2.308905587852407e+06 -9.759817642027236e+05 6.388597170431125e+06 -7.231265247639813e+03 3.505917658934621e+01 -2.602470000062866e+03 5.017016211000000e-03 1.611821020400000e-05 1.377129227100000e-03 1.573501193200000e-03 7.988146929600000e-05 1.581334778300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.960000000000000e+02 -2.309050212551035e+06 -9.759810625679693e+05 6.388545119470113e+06 -7.231208608191666e+03 3.510422464935658e+01 -2.602627555117187e+03 5.016392273600000e-03 1.594641223400000e-05 1.377917515100000e-03 1.573550606700000e-03 7.981400801700001e-05 1.581953368800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.970000000000000e+02 -2.309194836182614e+06 -9.759803600334852e+05 6.388493065334026e+06 -7.231151964240817e+03 3.514927210006482e+01 -2.602785111125289e+03 5.016392273600000e-03 1.594641223400000e-05 1.377917515100000e-03 1.573550606700000e-03 7.981400801700001e-05 1.581953368800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.980000000000000e+02 -2.309339458650781e+06 -9.759796565974763e+05 6.388441008057968e+06 -7.231095317006145e+03 3.519432001280950e+01 -2.602942664788770e+03 5.016392273600000e-03 1.594641223400000e-05 1.377917515100000e-03 1.573550606700000e-03 7.981400801700001e-05 1.581953368800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.990000000000000e+02 -2.309484079987488e+06 -9.759789522605491e+05 6.388388947630296e+06 -7.231038666089721e+03 3.523936725764017e+01 -2.603100217144557e+03 5.016392273600000e-03 1.594641223400000e-05 1.377917515100000e-03 1.573550606700000e-03 7.981400801700001e-05 1.581953368800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.000000000000000e+02 -2.309628700160214e+06 -9.759782470221096e+05 6.388336884062854e+06 -7.230982011814405e+03 3.528441405942357e+01 -2.603257767316165e+03 5.016392273600000e-03 1.594641223400000e-05 1.377917515100000e-03 1.573550606700000e-03 7.981400801700001e-05 1.581953368800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.010000000000000e+02 -2.309773319236608e+06 -9.759775408863425e+05 6.388284817339966e+06 -7.230925495053384e+03 3.532931173331093e+01 -2.603414920287308e+03 5.016392273600000e-03 1.594641223400000e-05 1.377917515100000e-03 1.573550606700000e-03 7.981400801700001e-05 1.581953368800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.020000000000000e+02 -2.309917937223480e+06 -9.759768338664833e+05 6.388232747499057e+06 -7.230869604082289e+03 3.537354258631362e+01 -2.603570306977359e+03 5.016392273600000e-03 1.594641223400000e-05 1.377917515100000e-03 1.573550606700000e-03 7.981400801700001e-05 1.581953368800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.030000000000000e+02 -2.310062554039746e+06 -9.759761259450067e+05 6.388180674520799e+06 -7.230812938512145e+03 3.541858879774819e+01 -2.603727854211665e+03 5.016392273600000e-03 1.594641223400000e-05 1.377917515100000e-03 1.573550606700000e-03 7.981400801700001e-05 1.581953368800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.040000000000000e+02 -2.310207169724392e+06 -9.759754171226243e+05 6.388128598390975e+06 -7.230756269215600e+03 3.546363562182268e+01 -2.603885400326497e+03 5.016392273600000e-03 1.594641223400000e-05 1.377917515100000e-03 1.573550606700000e-03 7.981400801700001e-05 1.581953368800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.050000000000000e+02 -2.310351784277136e+06 -9.759747073993445e+05 6.388076519109693e+06 -7.230699596304546e+03 3.550868181967897e+01 -2.604042944950919e+03 5.016392273600000e-03 1.594641223400000e-05 1.377917515100000e-03 1.573550606700000e-03 7.981400801700001e-05 1.581953368800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.060000000000000e+02 -2.310496397633235e+06 -9.759739967739804e+05 6.388024436700549e+06 -7.230642920488226e+03 3.555372732928259e+01 -2.604200486131962e+03 5.015768016400000e-03 1.577464260100000e-05 1.378705518600000e-03 1.573600037200000e-03 7.974645766000000e-05 1.582572314100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.070000000000000e+02 -2.310641009986426e+06 -9.759732852501053e+05 6.387972351092925e+06 -7.230586239348503e+03 3.559877379111251e+01 -2.604358030601300e+03 5.015768016400000e-03 1.577464260100000e-05 1.378705518600000e-03 1.573600037200000e-03 7.974645766000000e-05 1.582572314100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.080000000000000e+02 -2.310785621175052e+06 -9.759725728247452e+05 6.387920262345740e+06 -7.230529554973450e+03 3.564381947846778e+01 -2.604515572530116e+03 5.015768016400000e-03 1.577464260100000e-05 1.378705518600000e-03 1.573600037200000e-03 7.974645766000000e-05 1.582572314100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.090000000000000e+02 -2.310930231167224e+06 -9.759718594973132e+05 6.387868170470624e+06 -7.230472867724651e+03 3.568886495837396e+01 -2.604673110953750e+03 5.015768016400000e-03 1.577464260100000e-05 1.378705518600000e-03 1.573600037200000e-03 7.974645766000000e-05 1.582572314100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.100000000000000e+02 -2.311074840027132e+06 -9.759711452690018e+05 6.387816075444176e+06 -7.230416176784405e+03 3.573391010707431e+01 -2.604830648113772e+03 5.015768016400000e-03 1.577464260100000e-05 1.378705518600000e-03 1.573600037200000e-03 7.974645766000000e-05 1.582572314100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.110000000000000e+02 -2.311219447757964e+06 -9.759704301431099e+05 6.387763977276184e+06 -7.230359655337860e+03 3.577879016293315e+01 -2.604987699663997e+03 5.015768016400000e-03 1.577464260100000e-05 1.378705518600000e-03 1.573600037200000e-03 7.974645766000000e-05 1.582572314100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.120000000000000e+02 -2.311364054435110e+06 -9.759697141354021e+05 6.387711875987923e+06 -7.230303900893686e+03 3.582293755070236e+01 -2.605142594833091e+03 5.015768016400000e-03 1.577464260100000e-05 1.378705518600000e-03 1.573600037200000e-03 7.974645766000000e-05 1.582572314100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.130000000000000e+02 -2.311508659923722e+06 -9.759689972257973e+05 6.387659771568845e+06 -7.230247198590308e+03 3.586798214419187e+01 -2.605300129302379e+03 5.015768016400000e-03 1.577464260100000e-05 1.378705518600000e-03 1.573600037200000e-03 7.974645766000000e-05 1.582572314100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.140000000000000e+02 -2.311653264247335e+06 -9.759682794147303e+05 6.387607664010365e+06 -7.230190492984709e+03 3.591302640449283e+01 -2.605457661438313e+03 5.015768016400000e-03 1.577464260100000e-05 1.378705518600000e-03 1.573600037200000e-03 7.974645766000000e-05 1.582572314100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.150000000000000e+02 -2.311797867470748e+06 -9.759675607033941e+05 6.387555553288857e+06 -7.230133783396086e+03 3.595807108637078e+01 -2.605615193150070e+03 5.015768016400000e-03 1.577464260100000e-05 1.378705518600000e-03 1.573600037200000e-03 7.974645766000000e-05 1.582572314100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.160000000000000e+02 -2.311942469561457e+06 -9.759668410911999e+05 6.387503439416168e+06 -7.230077070045540e+03 3.600311534174566e+01 -2.605772723786839e+03 5.015143439100000e-03 1.560290124800000e-05 1.379493237500000e-03 1.573649484600000e-03 7.967881821100000e-05 1.583191614000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.170000000000000e+02 -2.312087070551411e+06 -9.759661205787475e+05 6.387451322380641e+06 -7.230020352567044e+03 3.604815927816733e+01 -2.605930254359602e+03 5.015143439100000e-03 1.560290124800000e-05 1.379493237500000e-03 1.573649484600000e-03 7.967881821100000e-05 1.583191614000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.180000000000000e+02 -2.312231670312022e+06 -9.759653991636629e+05 6.387399202229189e+06 -7.229963632764319e+03 3.609320297731247e+01 -2.606087779917531e+03 5.015143439100000e-03 1.560290124800000e-05 1.379493237500000e-03 1.573649484600000e-03 7.967881821100000e-05 1.583191614000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.190000000000000e+02 -2.312376269004173e+06 -9.759646768489161e+05 6.387347078903116e+06 -7.229906908326152e+03 3.613824676423371e+01 -2.606245306826282e+03 5.015143439100000e-03 1.560290124800000e-05 1.379493237500000e-03 1.573649484600000e-03 7.967881821100000e-05 1.583191614000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.200000000000000e+02 -2.312520866530881e+06 -9.759639536327353e+05 6.387294952437805e+06 -7.229850180716039e+03 3.618328974476913e+01 -2.606402831020254e+03 5.015143439100000e-03 1.560290124800000e-05 1.379493237500000e-03 1.573649484600000e-03 7.967881821100000e-05 1.583191614000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.210000000000000e+02 -2.312665462992350e+06 -9.759632295197702e+05 6.387242822806677e+06 -7.229793606656806e+03 3.622819000416681e+01 -2.606559914867565e+03 5.015143439100000e-03 1.560290124800000e-05 1.379493237500000e-03 1.573649484600000e-03 7.967881821100000e-05 1.583191614000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.220000000000000e+02 -2.312810058371404e+06 -9.759625045222543e+05 6.387190690060458e+06 -7.229737732735483e+03 3.627244999832391e+01 -2.606715032152024e+03 5.015143439100000e-03 1.560290124800000e-05 1.379493237500000e-03 1.573649484600000e-03 7.967881821100000e-05 1.583191614000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.230000000000000e+02 -2.312954652543192e+06 -9.759617786225353e+05 6.387138554190260e+06 -7.229680993737282e+03 3.631749332441922e+01 -2.606872553683168e+03 5.015143439100000e-03 1.560290124800000e-05 1.379493237500000e-03 1.573649484600000e-03 7.967881821100000e-05 1.583191614000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.240000000000000e+02 -2.313099245452779e+06 -9.759610518196196e+05 6.387086415216139e+06 -7.229624252702236e+03 3.636253531926511e+01 -2.607030069356574e+03 5.015143439100000e-03 1.560290124800000e-05 1.379493237500000e-03 1.573649484600000e-03 7.967881821100000e-05 1.583191614000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.250000000000000e+02 -2.313243837422158e+06 -9.759603241194346e+05 6.387034273020567e+06 -7.229567505415195e+03 3.640757800273047e+01 -2.607187590848961e+03 5.015143439100000e-03 1.560290124800000e-05 1.379493237500000e-03 1.573649484600000e-03 7.967881821100000e-05 1.583191614000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.260000000000000e+02 -2.313388428226072e+06 -9.759595955178342e+05 6.386982127685765e+06 -7.229510754956326e+03 3.645262085937856e+01 -2.607345109676281e+03 5.014518541200000e-03 1.543118811600000e-05 1.380280671700000e-03 1.573698949000000e-03 7.961108965500000e-05 1.583811268500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.270000000000000e+02 -2.313533017864252e+06 -9.759588660148230e+05 6.386929979211821e+06 -7.229454001146535e+03 3.649766311850584e+01 -2.607502626291375e+03 5.014518541200000e-03 1.543118811600000e-05 1.380280671700000e-03 1.573698949000000e-03 7.961108965500000e-05 1.583811268500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.280000000000000e+02 -2.313677606368627e+06 -9.759581356109991e+05 6.386877827587086e+06 -7.229397243752951e+03 3.654270471436584e+01 -2.607660141330364e+03 5.014518541200000e-03 1.543118811600000e-05 1.380280671700000e-03 1.573698949000000e-03 7.961108965500000e-05 1.583811268500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.290000000000000e+02 -2.313822193804006e+06 -9.759574043075449e+05 6.386825672787897e+06 -7.229340481820148e+03 3.658774739013674e+01 -2.607817657504198e+03 5.014518541200000e-03 1.543118811600000e-05 1.380280671700000e-03 1.573698949000000e-03 7.961108965500000e-05 1.583811268500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.300000000000000e+02 -2.313966780041195e+06 -9.759566721021034e+05 6.386773514861416e+06 -7.229283716970972e+03 3.663278892011795e+01 -2.607975170245367e+03 5.014518541200000e-03 1.543118811600000e-05 1.380280671700000e-03 1.573698949000000e-03 7.961108965500000e-05 1.583811268500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.310000000000000e+02 -2.314111365082827e+06 -9.759559389976606e+05 6.386721353815856e+06 -7.229227094293210e+03 3.667768061103249e+01 -2.608132273838357e+03 5.014518541200000e-03 1.543118811600000e-05 1.380280671700000e-03 1.573698949000000e-03 7.961108965500000e-05 1.583811268500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.320000000000000e+02 -2.314255949105063e+06 -9.759552050105124e+05 6.386669189627738e+06 -7.229171112688761e+03 3.672190787476899e+01 -2.608287573212318e+03 5.014518541200000e-03 1.543118811600000e-05 1.380280671700000e-03 1.573698949000000e-03 7.961108965500000e-05 1.583811268500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.330000000000000e+02 -2.314400531998451e+06 -9.759544701226633e+05 6.386617022287006e+06 -7.229114336897303e+03 3.676694892079161e+01 -2.608445082075900e+03 5.014518541200000e-03 1.543118811600000e-05 1.380280671700000e-03 1.573698949000000e-03 7.961108965500000e-05 1.583811268500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.340000000000000e+02 -2.314545113758016e+06 -9.759537343340225e+05 6.386564851795480e+06 -7.229057557452365e+03 3.681198996042735e+01 -2.608602589587993e+03 5.014518541200000e-03 1.543118811600000e-05 1.380280671700000e-03 1.573698949000000e-03 7.961108965500000e-05 1.583811268500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.350000000000000e+02 -2.314689694383482e+06 -9.759529976445903e+05 6.386512678153257e+06 -7.229000774281849e+03 3.685703087472359e+01 -2.608760095940437e+03 5.014518541200000e-03 1.543118811600000e-05 1.380280671700000e-03 1.573698949000000e-03 7.961108965500000e-05 1.583811268500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.360000000000000e+02 -2.314834273874562e+06 -9.759522600543746e+05 6.386460501360440e+06 -7.228943987450961e+03 3.690207118168360e+01 -2.608917600929932e+03 5.013893322200000e-03 1.525950309600000e-05 1.381067821200000e-03 1.573748430400000e-03 7.954327195800000e-05 1.584431277800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.370000000000000e+02 -2.314978852231599e+06 -9.759515215633751e+05 6.386408321416903e+06 -7.228887196911525e+03 3.694711187002676e+01 -2.609075104738632e+03 5.013893322200000e-03 1.525950309600000e-05 1.381067821200000e-03 1.573748430400000e-03 7.954327195800000e-05 1.584431277800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.380000000000000e+02 -2.315123429454317e+06 -9.759507821715970e+05 6.386356138322752e+06 -7.228830402766495e+03 3.699215204970903e+01 -2.609232607039125e+03 5.013893322200000e-03 1.525950309600000e-05 1.381067821200000e-03 1.573748430400000e-03 7.954327195800000e-05 1.584431277800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.390000000000000e+02 -2.315268005477977e+06 -9.759500418778670e+05 6.386303952101626e+06 -7.228773605678754e+03 3.703719139850242e+01 -2.609390105996894e+03 5.013893322200000e-03 1.525950309600000e-05 1.381067821200000e-03 1.573748430400000e-03 7.954327195800000e-05 1.584431277800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.400000000000000e+02 -2.315412580431830e+06 -9.759493006845433e+05 6.386251762706314e+06 -7.228716804167813e+03 3.708223164056056e+01 -2.609547605760160e+03 5.013893322200000e-03 1.525950309600000e-05 1.381067821200000e-03 1.573748430400000e-03 7.954327195800000e-05 1.584431277800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.410000000000000e+02 -2.315557154254355e+06 -9.759485585937091e+05 6.386199570169432e+06 -7.228660159481625e+03 3.712710847436003e+01 -2.609704655791827e+03 5.013893322200000e-03 1.525950309600000e-05 1.381067821200000e-03 1.573748430400000e-03 7.954327195800000e-05 1.584431277800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.420000000000000e+02 -2.315701726917855e+06 -9.759478156190991e+05 6.386147374546272e+06 -7.228604226624469e+03 3.717125995618821e+01 -2.609859705768127e+03 5.013893322200000e-03 1.525950309600000e-05 1.381067821200000e-03 1.573748430400000e-03 7.954327195800000e-05 1.584431277800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.430000000000000e+02 -2.315846298446430e+06 -9.759470717437207e+05 6.386095175772714e+06 -7.228547413756826e+03 3.721629972192900e+01 -2.610017202767103e+03 5.013893322200000e-03 1.525950309600000e-05 1.381067821200000e-03 1.573748430400000e-03 7.954327195800000e-05 1.584431277800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.440000000000000e+02 -2.315990868808021e+06 -9.759463269669970e+05 6.386042973860471e+06 -7.228490597611812e+03 3.726133876159784e+01 -2.610174697346895e+03 5.013893322200000e-03 1.525950309600000e-05 1.381067821200000e-03 1.573748430400000e-03 7.954327195800000e-05 1.584431277800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.450000000000000e+02 -2.316135438099017e+06 -9.759455812906998e+05 6.385990768774306e+06 -7.228433776860507e+03 3.730637787547974e+01 -2.610332193191845e+03 5.013893322200000e-03 1.525950309600000e-05 1.381067821200000e-03 1.573748430400000e-03 7.954327195800000e-05 1.584431277800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.460000000000000e+02 -2.316280006126419e+06 -9.759448347112971e+05 6.385938560584768e+06 -7.228376954175531e+03 3.735141642381319e+01 -2.610489682941653e+03 5.013267782100000e-03 1.508784623100000e-05 1.381854685500000e-03 1.573797928700000e-03 7.947536514400000e-05 1.585051641400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.470000000000000e+02 -2.316424573083079e+06 -9.759440872323287e+05 6.385886349221366e+06 -7.228320126994247e+03 3.739645475554491e+01 -2.610647173640420e+03 5.013267782100000e-03 1.508784623100000e-05 1.381854685500000e-03 1.573797928700000e-03 7.947536514400000e-05 1.585051641400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.480000000000000e+02 -2.316569138904891e+06 -9.759433388526171e+05 6.385834134707528e+06 -7.228263296071756e+03 3.744149345786249e+01 -2.610804663247269e+03 5.013267782100000e-03 1.508784623100000e-05 1.381854685500000e-03 1.573797928700000e-03 7.947536514400000e-05 1.585051641400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.490000000000000e+02 -2.316713703591573e+06 -9.759425895721697e+05 6.385781917043357e+06 -7.228206461470396e+03 3.748653151109380e+01 -2.610962151539936e+03 5.013267782100000e-03 1.508784623100000e-05 1.381854685500000e-03 1.573797928700000e-03 7.947536514400000e-05 1.585051641400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.500000000000000e+02 -2.316858267142848e+06 -9.759418393909899e+05 6.385729696228951e+06 -7.228149623218682e+03 3.753156934898473e+01 -2.611119638462124e+03 5.013267782100000e-03 1.508784623100000e-05 1.381854685500000e-03 1.573797928700000e-03 7.947536514400000e-05 1.585051641400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.510000000000000e+02 -2.317002829562374e+06 -9.759410883122401e+05 6.385677472273436e+06 -7.228092947142383e+03 3.757644925138530e+01 -2.611276661592819e+03 5.013267782100000e-03 1.508784623100000e-05 1.381854685500000e-03 1.573797928700000e-03 7.947536514400000e-05 1.585051641400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.520000000000000e+02 -2.317147390862561e+06 -9.759403363499828e+05 6.385625245218847e+06 -7.228037005704234e+03 3.762062409201405e+01 -2.611431624652499e+03 5.013267782100000e-03 1.508784623100000e-05 1.381854685500000e-03 1.573797928700000e-03 7.947536514400000e-05 1.585051641400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.530000000000000e+02 -2.317291951053375e+06 -9.759395834874806e+05 6.385573015004500e+06 -7.227980156036621e+03 3.766566156479567e+01 -2.611589109005121e+03 5.013267782100000e-03 1.508784623100000e-05 1.381854685500000e-03 1.573797928700000e-03 7.947536514400000e-05 1.585051641400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.540000000000000e+02 -2.317436510076676e+06 -9.759388297236719e+05 6.385520781651654e+06 -7.227923303166681e+03 3.771069895387353e+01 -2.611746590766071e+03 5.013267782100000e-03 1.508784623100000e-05 1.381854685500000e-03 1.573797928700000e-03 7.947536514400000e-05 1.585051641400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.550000000000000e+02 -2.317581067899981e+06 -9.759380750579701e+05 6.385468545172197e+06 -7.227866447413829e+03 3.775573589972933e+01 -2.611904069042311e+03 5.013267782100000e-03 1.508784623100000e-05 1.381854685500000e-03 1.573797928700000e-03 7.947536514400000e-05 1.585051641400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.560000000000000e+02 -2.317725624651868e+06 -9.759373194927353e+05 6.385416305519095e+06 -7.227809587164827e+03 3.780077239531991e+01 -2.612061548253979e+03 5.012641920500000e-03 1.491621741200000e-05 1.382641264700000e-03 1.573847444000000e-03 7.940736918000000e-05 1.585672359500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.570000000000000e+02 -2.317870180332690e+06 -9.759365630279657e+05 6.385364062692213e+06 -7.227752722389743e+03 3.784580971302483e+01 -2.612219028546523e+03 5.012641920500000e-03 1.491621741200000e-05 1.382641264700000e-03 1.573847444000000e-03 7.940736918000000e-05 1.585672359500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.580000000000000e+02 -2.318014734748631e+06 -9.759358056601401e+05 6.385311816762450e+06 -7.227695855620659e+03 3.789084574630530e+01 -2.612376502877120e+03 5.012641920500000e-03 1.491621741200000e-05 1.382641264700000e-03 1.573847444000000e-03 7.940736918000000e-05 1.585672359500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.590000000000000e+02 -2.318159288093361e+06 -9.759350473927901e+05 6.385259567658961e+06 -7.227638984324425e+03 3.793588233807913e+01 -2.612533978278260e+03 5.012641920500000e-03 1.491621741200000e-05 1.382641264700000e-03 1.573847444000000e-03 7.940736918000000e-05 1.585672359500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.600000000000000e+02 -2.318303840366594e+06 -9.759342882259187e+05 6.385207315381845e+06 -7.227582108531044e+03 3.798091871477840e+01 -2.612691454628470e+03 5.012641920500000e-03 1.491621741200000e-05 1.382641264700000e-03 1.573847444000000e-03 7.940736918000000e-05 1.585672359500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.610000000000000e+02 -2.318448391377700e+06 -9.759335281589850e+05 6.385155060010185e+06 -7.227525378732546e+03 3.802580512882668e+01 -2.612848512242600e+03 5.012641920500000e-03 1.491621741200000e-05 1.382641264700000e-03 1.573847444000000e-03 7.940736918000000e-05 1.585672359500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.620000000000000e+02 -2.318592941329747e+06 -9.759327672087252e+05 6.385102801511308e+06 -7.227469304077137e+03 3.807002829397496e+01 -2.613003731103108e+03 5.012641920500000e-03 1.491621741200000e-05 1.382641264700000e-03 1.573847444000000e-03 7.940736918000000e-05 1.585672359500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.630000000000000e+02 -2.318737490163624e+06 -9.759320053581048e+05 6.385050539855875e+06 -7.227412417756923e+03 3.811506412727337e+01 -2.613161202441135e+03 5.012641920500000e-03 1.491621741200000e-05 1.382641264700000e-03 1.573847444000000e-03 7.940736918000000e-05 1.585672359500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.640000000000000e+02 -2.318882037828844e+06 -9.759312426062180e+05 6.384998275062354e+06 -7.227355528095961e+03 3.816009922605775e+01 -2.613318671534826e+03 5.012641920500000e-03 1.491621741200000e-05 1.382641264700000e-03 1.573847444000000e-03 7.940736918000000e-05 1.585672359500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.650000000000000e+02 -2.319026584357971e+06 -9.759304789536498e+05 6.384946007118835e+06 -7.227298634828107e+03 3.820513476887757e+01 -2.613476139172173e+03 5.012641920500000e-03 1.491621741200000e-05 1.382641264700000e-03 1.573847444000000e-03 7.940736918000000e-05 1.585672359500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.660000000000000e+02 -2.319171129718510e+06 -9.759297143998202e+05 6.384893736037212e+06 -7.227241738327835e+03 3.825016975178835e+01 -2.613633604277618e+03 5.012015736800000e-03 1.474461658000000e-05 1.383427558600000e-03 1.573896976100000e-03 7.933928405100000e-05 1.586293432000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.670000000000000e+02 -2.319315674006819e+06 -9.759289489464939e+05 6.384841461782206e+06 -7.227184837207956e+03 3.829520438166981e+01 -2.613791070659602e+03 5.012015736800000e-03 1.474461658000000e-05 1.383427558600000e-03 1.573896976100000e-03 7.933928405100000e-05 1.586293432000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.680000000000000e+02 -2.319460217126605e+06 -9.759281825919142e+05 6.384789184389071e+06 -7.227127932911129e+03 3.834023929967813e+01 -2.613948534400289e+03 5.012015736800000e-03 1.474461658000000e-05 1.383427558600000e-03 1.573896976100000e-03 7.933928405100000e-05 1.586293432000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.690000000000000e+02 -2.319604759045357e+06 -9.759274153354953e+05 6.384736903869699e+06 -7.227071025678954e+03 3.838527368900509e+01 -2.614105994797709e+03 5.012015736800000e-03 1.474461658000000e-05 1.383427558600000e-03 1.573896976100000e-03 7.933928405100000e-05 1.586293432000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.700000000000000e+02 -2.319749299891667e+06 -9.759266471795939e+05 6.384684620177025e+06 -7.227014114068533e+03 3.843030746694845e+01 -2.614263455797721e+03 5.012015736800000e-03 1.474461658000000e-05 1.383427558600000e-03 1.573896976100000e-03 7.933928405100000e-05 1.586293432000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.710000000000000e+02 -2.319893839668846e+06 -9.759258781274150e+05 6.384632333319188e+06 -7.226957346122954e+03 3.847518171134618e+01 -2.614420504259974e+03 5.012015736800000e-03 1.474461658000000e-05 1.383427558600000e-03 1.573896976100000e-03 7.933928405100000e-05 1.586293432000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.720000000000000e+02 -2.320038378253927e+06 -9.759251081908121e+05 6.384580043382908e+06 -7.226901235771167e+03 3.851933925752058e+01 -2.614575705902015e+03 5.012015736800000e-03 1.474461658000000e-05 1.383427558600000e-03 1.573896976100000e-03 7.933928405100000e-05 1.586293432000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.730000000000000e+02 -2.320182915633167e+06 -9.759243373523038e+05 6.384527750322158e+06 -7.226844313948519e+03 3.856437292890834e+01 -2.614733161025995e+03 5.012015736800000e-03 1.474461658000000e-05 1.383427558600000e-03 1.573896976100000e-03 7.933928405100000e-05 1.586293432000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.740000000000000e+02 -2.320327451939879e+06 -9.759235656143212e+05 6.384475454088126e+06 -7.226787387665785e+03 3.860940647450582e+01 -2.614890617000307e+03 5.012015736800000e-03 1.474461658000000e-05 1.383427558600000e-03 1.573896976100000e-03 7.933928405100000e-05 1.586293432000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.750000000000000e+02 -2.320471987109344e+06 -9.759227929756967e+05 6.384423154704500e+06 -7.226730457595314e+03 3.865443966696114e+01 -2.615048071973394e+03 5.012015736800000e-03 1.474461658000000e-05 1.383427558600000e-03 1.573896976100000e-03 7.933928405100000e-05 1.586293432000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.760000000000000e+02 -2.320616521141908e+06 -9.759220194364323e+05 6.384370852171158e+06 -7.226673523956693e+03 3.869947314984606e+01 -2.615205525376515e+03 5.011389230800000e-03 1.457304367700000e-05 1.384213567200000e-03 1.573946525200000e-03 7.927110974100000e-05 1.586914858900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.770000000000000e+02 -2.320761054037295e+06 -9.759212449965358e+05 6.384318546488198e+06 -7.226616586551999e+03 3.874450611753863e+01 -2.615362977711024e+03 5.011389230800000e-03 1.457304367700000e-05 1.384213567200000e-03 1.573946525200000e-03 7.927110974100000e-05 1.586914858900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.780000000000000e+02 -2.320905585795215e+06 -9.759204696560072e+05 6.384266237655725e+06 -7.226559645506180e+03 3.878953875020423e+01 -2.615520428644049e+03 5.011389230800000e-03 1.457304367700000e-05 1.384213567200000e-03 1.573946525200000e-03 7.927110974100000e-05 1.586914858900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.790000000000000e+02 -2.321050116416015e+06 -9.759196934148526e+05 6.384213925673612e+06 -7.226502700808236e+03 3.883457162237076e+01 -2.615677878234368e+03 5.011389230800000e-03 1.457304367700000e-05 1.384213567200000e-03 1.573946525200000e-03 7.927110974100000e-05 1.586914858900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.800000000000000e+02 -2.321194645899412e+06 -9.759189162730728e+05 6.384161610541960e+06 -7.226445752418489e+03 3.887960412581634e+01 -2.615835326560180e+03 5.011389230800000e-03 1.457304367700000e-05 1.384213567200000e-03 1.573946525200000e-03 7.927110974100000e-05 1.586914858900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.810000000000000e+02 -2.321339174248659e+06 -9.759181382334278e+05 6.384109292270661e+06 -7.226388976806701e+03 3.892449848198825e+01 -2.615992284087559e+03 5.011389230800000e-03 1.457304367700000e-05 1.384213567200000e-03 1.573946525200000e-03 7.927110974100000e-05 1.586914858900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.820000000000000e+02 -2.321483701579554e+06 -9.759173593099791e+05 6.384056970866665e+06 -7.226332982595113e+03 3.896878107180277e+01 -2.616147062786037e+03 5.011389230800000e-03 1.457304367700000e-05 1.384213567200000e-03 1.573946525200000e-03 7.927110974100000e-05 1.586914858900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.830000000000000e+02 -2.321628227631025e+06 -9.759165794833530e+05 6.384004646365160e+06 -7.226276024026059e+03 3.901381241213932e+01 -2.616304505147950e+03 5.011389230800000e-03 1.457304367700000e-05 1.384213567200000e-03 1.573946525200000e-03 7.927110974100000e-05 1.586914858900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.840000000000000e+02 -2.321772752641649e+06 -9.759157987578671e+05 6.383952318678729e+06 -7.226219060571468e+03 3.905884461800619e+01 -2.616461949571530e+03 5.011389230800000e-03 1.457304367700000e-05 1.384213567200000e-03 1.573946525200000e-03 7.927110974100000e-05 1.586914858900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.850000000000000e+02 -2.321917276450078e+06 -9.759150171306088e+05 6.383899987866498e+06 -7.226162094273640e+03 3.910387594093058e+01 -2.616619390384504e+03 5.011389230800000e-03 1.457304367700000e-05 1.384213567200000e-03 1.573946525200000e-03 7.927110974100000e-05 1.586914858900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.860000000000000e+02 -2.322061799152672e+06 -9.759142346033342e+05 6.383847653893148e+06 -7.226105123858139e+03 3.914890712266478e+01 -2.616776831108911e+03 5.010762402000000e-03 1.440149859300000e-05 1.384999290400000e-03 1.573996091200000e-03 7.920284621400000e-05 1.587536640300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.870000000000000e+02 -2.322206320749770e+06 -9.759134511760431e+05 6.383795316758558e+06 -7.226048149410134e+03 3.919393872755896e+01 -2.616934271539712e+03 5.010762402000000e-03 1.440149859300000e-05 1.384999290400000e-03 1.573996091200000e-03 7.920284621400000e-05 1.587536640300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.880000000000000e+02 -2.322350841176664e+06 -9.759126668475760e+05 6.383742976486436e+06 -7.225991171607494e+03 3.923896960658760e+01 -2.617091709766346e+03 5.010762402000000e-03 1.440149859300000e-05 1.384999290400000e-03 1.573996091200000e-03 7.920284621400000e-05 1.587536640300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.890000000000000e+02 -2.322495360465291e+06 -9.759118816185168e+05 6.383690633065080e+06 -7.225934190174847e+03 3.928400031500578e+01 -2.617249146569388e+03 5.010762402000000e-03 1.440149859300000e-05 1.384999290400000e-03 1.573996091200000e-03 7.920284621400000e-05 1.587536640300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.900000000000000e+02 -2.322639878551560e+06 -9.759110954877068e+05 6.383638286517983e+06 -7.225877205876867e+03 3.932903078512524e+01 -2.617406579855267e+03 5.010762402000000e-03 1.440149859300000e-05 1.384999290400000e-03 1.573996091200000e-03 7.920284621400000e-05 1.587536640300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.910000000000000e+02 -2.322784395630855e+06 -9.759103084620122e+05 6.383585936781062e+06 -7.225820335237469e+03 3.937389314295484e+01 -2.617563682789234e+03 5.010762402000000e-03 1.440149859300000e-05 1.384999290400000e-03 1.573996091200000e-03 7.920284621400000e-05 1.587536640300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.920000000000000e+02 -2.322928911415012e+06 -9.759095205510545e+05 6.383533583993557e+06 -7.225763992902139e+03 3.941800356889243e+01 -2.617719293174605e+03 5.010762402000000e-03 1.440149859300000e-05 1.384999290400000e-03 1.573996091200000e-03 7.920284621400000e-05 1.587536640300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.930000000000000e+02 -2.323073426113770e+06 -9.759087317404744e+05 6.383481228037434e+06 -7.225706996832875e+03 3.946303388274586e+01 -2.617876724779950e+03 5.010762402000000e-03 1.440149859300000e-05 1.384999290400000e-03 1.573996091200000e-03 7.920284621400000e-05 1.587536640300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.940000000000000e+02 -2.323217939674097e+06 -9.759079420293190e+05 6.383428868932130e+06 -7.225649997048406e+03 3.950806395783118e+01 -2.618034155191225e+03 5.010762402000000e-03 1.440149859300000e-05 1.384999290400000e-03 1.573996091200000e-03 7.920284621400000e-05 1.587536640300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.950000000000000e+02 -2.323362452095711e+06 -9.759071514175984e+05 6.383376506677750e+06 -7.225592993641593e+03 3.955309323457496e+01 -2.618191584126911e+03 5.010762402000000e-03 1.440149859300000e-05 1.384999290400000e-03 1.573996091200000e-03 7.920284621400000e-05 1.587536640300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.960000000000000e+02 -2.323506963411167e+06 -9.759063599058946e+05 6.383324141262352e+06 -7.225535986071357e+03 3.959812315956518e+01 -2.618349013137258e+03 5.010135250200000e-03 1.422998137200000e-05 1.385784727800000e-03 1.574045674100000e-03 7.913449349800000e-05 1.588158775800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.970000000000000e+02 -2.323651473555561e+06 -9.759055674930507e+05 6.383271772709741e+06 -7.225478975284985e+03 3.964315223991585e+01 -2.618506439559745e+03 5.010135250200000e-03 1.422998137200000e-05 1.385784727800000e-03 1.574045674100000e-03 7.913449349800000e-05 1.588158775800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.980000000000000e+02 -2.323795982561438e+06 -9.759047741796452e+05 6.383219401007975e+06 -7.225421960795238e+03 3.968818175655329e+01 -2.618663864789289e+03 5.010135250200000e-03 1.422998137200000e-05 1.385784727800000e-03 1.574045674100000e-03 7.913449349800000e-05 1.588158775800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.990000000000000e+02 -2.323940490428519e+06 -9.759039799656905e+05 6.383167026157161e+06 -7.225364942640086e+03 3.973321055720331e+01 -2.618821288665063e+03 5.010135250200000e-03 1.422998137200000e-05 1.385784727800000e-03 1.574045674100000e-03 7.913449349800000e-05 1.588158775800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.000000000000000e+02 -2.324084997156525e+06 -9.759031848511851e+05 6.383114648157395e+06 -7.225307920790548e+03 3.977823918616591e+01 -2.618978711293205e+03 5.010135250200000e-03 1.422998137200000e-05 1.385784727800000e-03 1.574045674100000e-03 7.913449349800000e-05 1.588158775800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.010000000000000e+02 -2.324229502749423e+06 -9.759023888391803e+05 6.383062267018606e+06 -7.225251076527232e+03 3.982311564497002e+01 -2.619135629993162e+03 5.010135250200000e-03 1.422998137200000e-05 1.385784727800000e-03 1.574045674100000e-03 7.913449349800000e-05 1.588158775800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.020000000000000e+02 -2.324374007218814e+06 -9.759015919431784e+05 6.383009882787234e+06 -7.225195035991683e+03 3.986731286136927e+01 -2.619290308646294e+03 5.010135250200000e-03 1.422998137200000e-05 1.385784727800000e-03 1.574045674100000e-03 7.913449349800000e-05 1.588158775800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.030000000000000e+02 -2.324518510571880e+06 -9.759007941470533e+05 6.382957495398560e+06 -7.225138002759471e+03 3.991234121172513e+01 -2.619447728636639e+03 5.010135250200000e-03 1.422998137200000e-05 1.385784727800000e-03 1.574045674100000e-03 7.913449349800000e-05 1.588158775800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.040000000000000e+02 -2.324663012657150e+06 -9.758999954480693e+05 6.382905104908164e+06 -7.225080967551755e+03 3.995736888695205e+01 -2.619605142660158e+03 5.010135250200000e-03 1.422998137200000e-05 1.385784727800000e-03 1.574045674100000e-03 7.913449349800000e-05 1.588158775800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.050000000000000e+02 -2.324807513635399e+06 -9.758991958491363e+05 6.382852711257055e+06 -7.225023928255569e+03 4.000239637851655e+01 -2.619762556512054e+03 5.010135250200000e-03 1.422998137200000e-05 1.385784727800000e-03 1.574045674100000e-03 7.913449349800000e-05 1.588158775800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.060000000000000e+02 -2.324952013635171e+06 -9.758983953525769e+05 6.382800314398050e+06 -7.224966883145725e+03 4.004742434508083e+01 -2.619919974935362e+03 5.009507775100000e-03 1.405849190500000e-05 1.386569879500000e-03 1.574095273900000e-03 7.906605155500001e-05 1.588781265600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.070000000000000e+02 -2.325096512399139e+06 -9.758975939537524e+05 6.382747914425584e+06 -7.224909835689009e+03 4.009245197139222e+01 -2.620077388423012e+03 5.009507775100000e-03 1.405849190500000e-05 1.386569879500000e-03 1.574095273900000e-03 7.906605155500001e-05 1.588781265600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.080000000000000e+02 -2.325241010087867e+06 -9.758967916555689e+05 6.382695511280732e+06 -7.224852783687190e+03 4.013747944032681e+01 -2.620234802986336e+03 5.009507775100000e-03 1.405849190500000e-05 1.386569879500000e-03 1.574095273900000e-03 7.906605155500001e-05 1.588781265600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.090000000000000e+02 -2.325385506508442e+06 -9.758959884545483e+05 6.382643105034295e+06 -7.224795729631708e+03 4.018250651405799e+01 -2.620392211811517e+03 5.009507775100000e-03 1.405849190500000e-05 1.386569879500000e-03 1.574095273900000e-03 7.906605155500001e-05 1.588781265600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.100000000000000e+02 -2.325530001853830e+06 -9.758951843541756e+05 6.382590695615448e+06 -7.224738671105022e+03 4.022753332366943e+01 -2.620549621505348e+03 5.009507775100000e-03 1.405849190500000e-05 1.386569879500000e-03 1.574095273900000e-03 7.906605155500001e-05 1.588781265600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.110000000000000e+02 -2.325674496062605e+06 -9.758943793564704e+05 6.382538283057000e+06 -7.224681772144231e+03 4.027240110634071e+01 -2.620706576477587e+03 5.009507775100000e-03 1.405849190500000e-05 1.386569879500000e-03 1.574095273900000e-03 7.906605155500001e-05 1.588781265600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.120000000000000e+02 -2.325818989177233e+06 -9.758935734760596e+05 6.382485867389064e+06 -7.224625595888793e+03 4.031656276290161e+01 -2.620861512798772e+03 5.009507775100000e-03 1.405849190500000e-05 1.386569879500000e-03 1.574095273900000e-03 7.906605155500001e-05 1.588781265600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.130000000000000e+02 -2.325963481068443e+06 -9.758927666936480e+05 6.382433448603135e+06 -7.224568526827668e+03 4.036158889898044e+01 -2.621018917471079e+03 5.009507775100000e-03 1.405849190500000e-05 1.386569879500000e-03 1.574095273900000e-03 7.906605155500001e-05 1.588781265600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.140000000000000e+02 -2.326107971851755e+06 -9.758919590113173e+05 6.382381026656787e+06 -7.224511453594610e+03 4.040661481579519e+01 -2.621176322196825e+03 5.009507775100000e-03 1.405849190500000e-05 1.386569879500000e-03 1.574095273900000e-03 7.906605155500001e-05 1.588781265600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.150000000000000e+02 -2.326252461430902e+06 -9.758911504273347e+05 6.382328601585382e+06 -7.224454377660337e+03 4.045164072402079e+01 -2.621333722972692e+03 5.009507775100000e-03 1.405849190500000e-05 1.386569879500000e-03 1.574095273900000e-03 7.906605155500001e-05 1.588781265600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.160000000000000e+02 -2.326396949998826e+06 -9.758903409451761e+05 6.382276173318054e+06 -7.224397296287028e+03 4.049666684626951e+01 -2.621491127280859e+03 5.008879976200000e-03 1.388703013200000e-05 1.387354745300000e-03 1.574144890600000e-03 7.899752037100000e-05 1.589404109500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.170000000000000e+02 -2.326541437297611e+06 -9.758895305602202e+05 6.382223741949519e+06 -7.224340212848892e+03 4.054169187329913e+01 -2.621648525849311e+03 5.008879976200000e-03 1.388703013200000e-05 1.387354745300000e-03 1.574144890600000e-03 7.899752037100000e-05 1.589404109500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.180000000000000e+02 -2.326685923617430e+06 -9.758887192776694e+05 6.382171307373213e+06 -7.224283123800617e+03 4.058671805263717e+01 -2.621805928462379e+03 5.008879976200000e-03 1.388703013200000e-05 1.387354745300000e-03 1.574144890600000e-03 7.899752037100000e-05 1.589404109500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.190000000000000e+02 -2.326830408668176e+06 -9.758879070923283e+05 6.382118869695680e+06 -7.224226032624277e+03 4.063174315804190e+01 -2.621963325509798e+03 5.008879976200000e-03 1.388703013200000e-05 1.387354745300000e-03 1.574144890600000e-03 7.899752037100000e-05 1.589404109500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.200000000000000e+02 -2.326974892578378e+06 -9.758870940065117e+05 6.382066428869713e+06 -7.224168937800196e+03 4.067676780468705e+01 -2.622120721168335e+03 5.008879976200000e-03 1.388703013200000e-05 1.387354745300000e-03 1.574144890600000e-03 7.899752037100000e-05 1.589404109500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.210000000000000e+02 -2.327119375447767e+06 -9.758862800248914e+05 6.382013984867407e+06 -7.224111976804436e+03 4.072164652799955e+01 -2.622277733289216e+03 5.008879976200000e-03 1.388703013200000e-05 1.387354745300000e-03 1.574144890600000e-03 7.899752037100000e-05 1.589404109500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.220000000000000e+02 -2.327263857125132e+06 -9.758854651575980e+05 6.381961537783202e+06 -7.224055630928875e+03 4.076587159950986e+01 -2.622433024264548e+03 5.008879976200000e-03 1.388703013200000e-05 1.387354745300000e-03 1.574144890600000e-03 7.899752037100000e-05 1.589404109500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.230000000000000e+02 -2.327408337586335e+06 -9.758846493884786e+05 6.381909087578344e+06 -7.223998525593432e+03 4.081089619492747e+01 -2.622590414874304e+03 5.008879976200000e-03 1.388703013200000e-05 1.387354745300000e-03 1.574144890600000e-03 7.899752037100000e-05 1.589404109500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.240000000000000e+02 -2.327552816971318e+06 -9.758838327200547e+05 6.381856634201414e+06 -7.223941415694476e+03 4.085592037062804e+01 -2.622747806594812e+03 5.008879976200000e-03 1.388703013200000e-05 1.387354745300000e-03 1.574144890600000e-03 7.899752037100000e-05 1.589404109500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.250000000000000e+02 -2.327697295215391e+06 -9.758830151511743e+05 6.381804177676183e+06 -7.223884302191692e+03 4.090094426197194e+01 -2.622905196815168e+03 5.008879976200000e-03 1.388703013200000e-05 1.387354745300000e-03 1.574144890600000e-03 7.899752037100000e-05 1.589404109500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.260000000000000e+02 -2.327841772383299e+06 -9.758821966829952e+05 6.381751717978849e+06 -7.223827184128008e+03 4.094596876842357e+01 -2.623062588189365e+03 5.008251853200000e-03 1.371559599500000e-05 1.388139325000000e-03 1.574194524100000e-03 7.892889993000000e-05 1.590027307600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.270000000000000e+02 -2.327986248378160e+06 -9.758813773137907e+05 6.381699255145013e+06 -7.223770062797892e+03 4.099099261424215e+01 -2.623219977124691e+03 5.008251853200000e-03 1.371559599500000e-05 1.388139325000000e-03 1.574194524100000e-03 7.892889993000000e-05 1.590027307600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.280000000000000e+02 -2.328130723103083e+06 -9.758805570418343e+05 6.381646789210291e+06 -7.223712939414432e+03 4.103601550437247e+01 -2.623377360299465e+03 5.008251853200000e-03 1.371559599500000e-05 1.388139325000000e-03 1.574194524100000e-03 7.892889993000000e-05 1.590027307600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.290000000000000e+02 -2.328275196783825e+06 -9.758797358711648e+05 6.381594320091710e+06 -7.223655811180830e+03 4.108103913253373e+01 -2.623534745422604e+03 5.008251853200000e-03 1.371559599500000e-05 1.388139325000000e-03 1.574194524100000e-03 7.892889993000000e-05 1.590027307600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.300000000000000e+02 -2.328419669355698e+06 -9.758789138006313e+05 6.381541847813038e+06 -7.223598678839398e+03 4.112606253590067e+01 -2.623692130422553e+03 5.008251853200000e-03 1.371559599500000e-05 1.388139325000000e-03 1.574194524100000e-03 7.892889993000000e-05 1.590027307600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.310000000000000e+02 -2.328564140821944e+06 -9.758780908333105e+05 6.381489372384110e+06 -7.223541718217116e+03 4.117093218090361e+01 -2.623849028488937e+03 5.008251853200000e-03 1.371559599500000e-05 1.388139325000000e-03 1.574194524100000e-03 7.892889993000000e-05 1.590027307600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.320000000000000e+02 -2.328708611045008e+06 -9.758772669801088e+05 6.381436893904637e+06 -7.223485539045451e+03 4.121511883359960e+01 -2.624003751851202e+03 5.008251853200000e-03 1.371559599500000e-05 1.388139325000000e-03 1.574194524100000e-03 7.892889993000000e-05 1.590027307600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.330000000000000e+02 -2.328853080213177e+06 -9.758764422280297e+05 6.381384412245222e+06 -7.223428396152764e+03 4.126014119070615e+01 -2.624161131892568e+03 5.008251853200000e-03 1.371559599500000e-05 1.388139325000000e-03 1.574194524100000e-03 7.892889993000000e-05 1.590027307600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.340000000000000e+02 -2.328997548272392e+06 -9.758756165761016e+05 6.381331927425737e+06 -7.223371249138632e+03 4.130516411187662e+01 -2.624318511886180e+03 5.008251853200000e-03 1.371559599500000e-05 1.388139325000000e-03 1.574194524100000e-03 7.892889993000000e-05 1.590027307600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.350000000000000e+02 -2.329142015157977e+06 -9.758747900231760e+05 6.381279439469964e+06 -7.223314098864079e+03 4.135018645240314e+01 -2.624475889429303e+03 5.008251853200000e-03 1.371559599500000e-05 1.388139325000000e-03 1.574194524100000e-03 7.892889993000000e-05 1.590027307600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.360000000000000e+02 -2.329286480901844e+06 -9.758739625698384e+05 6.381226948366171e+06 -7.223256944963812e+03 4.139520816766779e+01 -2.624633265515398e+03 5.007623405400000e-03 1.354418938500000e-05 1.388923618800000e-03 1.574244174500000e-03 7.886019019600000e-05 1.590650860000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.370000000000000e+02 -2.329430945472138e+06 -9.758731342155092e+05 6.381174454126064e+06 -7.223199787702901e+03 4.144023024776325e+01 -2.624790639470712e+03 5.007623405400000e-03 1.354418938500000e-05 1.388923618800000e-03 1.574244174500000e-03 7.886019019600000e-05 1.590650860000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.380000000000000e+02 -2.329575408932974e+06 -9.758723049613509e+05 6.381121956726069e+06 -7.223142626458056e+03 4.148525176934436e+01 -2.624948012948455e+03 5.007623405400000e-03 1.354418938500000e-05 1.388923618800000e-03 1.574244174500000e-03 7.886019019600000e-05 1.590650860000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.390000000000000e+02 -2.329719871251877e+06 -9.758714748067828e+05 6.381069456178123e+06 -7.223085461448836e+03 4.153027327079968e+01 -2.625105385376627e+03 5.007623405400000e-03 1.354418938500000e-05 1.388923618800000e-03 1.574244174500000e-03 7.886019019600000e-05 1.590650860000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.400000000000000e+02 -2.329864332525774e+06 -9.758706437535408e+05 6.381016952446575e+06 -7.223028291551220e+03 4.157529519514532e+01 -2.625262759838952e+03 5.007623405400000e-03 1.354418938500000e-05 1.388923618800000e-03 1.574244174500000e-03 7.886019019600000e-05 1.590650860000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.410000000000000e+02 -2.330008792499505e+06 -9.758698118001226e+05 6.380964445633736e+06 -7.222971254335313e+03 4.162016134982758e+01 -2.625419753957240e+03 5.007623405400000e-03 1.354418938500000e-05 1.388923618800000e-03 1.574244174500000e-03 7.886019019600000e-05 1.590650860000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.420000000000000e+02 -2.330153251303915e+06 -9.758689789624468e+05 6.380911935729114e+06 -7.222914811618097e+03 4.166433750249263e+01 -2.625575083803445e+03 5.007623405400000e-03 1.354418938500000e-05 1.388923618800000e-03 1.574244174500000e-03 7.886019019600000e-05 1.590650860000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.430000000000000e+02 -2.330297709046353e+06 -9.758681452258043e+05 6.380859422647126e+06 -7.222857631682121e+03 4.170935864483752e+01 -2.625732451867127e+03 5.007623405400000e-03 1.354418938500000e-05 1.388923618800000e-03 1.574244174500000e-03 7.886019019600000e-05 1.590650860000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.440000000000000e+02 -2.330442165614505e+06 -9.758673105881989e+05 6.380806906429085e+06 -7.222800448335213e+03 4.175437937338111e+01 -2.625889817899190e+03 5.007623405400000e-03 1.354418938500000e-05 1.388923618800000e-03 1.574244174500000e-03 7.886019019600000e-05 1.590650860000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.450000000000000e+02 -2.330586621040285e+06 -9.758664750502149e+05 6.380754387063256e+06 -7.222743261378973e+03 4.179939947429156e+01 -2.626047182429646e+03 5.007623405400000e-03 1.354418938500000e-05 1.388923618800000e-03 1.574244174500000e-03 7.886019019600000e-05 1.590650860000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.460000000000000e+02 -2.330731075324024e+06 -9.758656386118509e+05 6.380701864549512e+06 -7.222686070791344e+03 4.184441985310153e+01 -2.626204545562812e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.470000000000000e+02 -2.330875528433051e+06 -9.758648012725416e+05 6.380649338899872e+06 -7.222628876831359e+03 4.188943941124748e+01 -2.626361906539786e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.480000000000000e+02 -2.331019980432092e+06 -9.758639630334310e+05 6.380596810090523e+06 -7.222571678918149e+03 4.193445962821528e+01 -2.626519267014467e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.490000000000000e+02 -2.331164431320873e+06 -9.758631238945295e+05 6.380544278121558e+06 -7.222514476810963e+03 4.197947930051271e+01 -2.626676627583463e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.500000000000000e+02 -2.331308881034708e+06 -9.758622838546906e+05 6.380491743016778e+06 -7.222457271426703e+03 4.202449861605690e+01 -2.626833985759496e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.510000000000000e+02 -2.331453329606141e+06 -9.758614429144881e+05 6.380439204764211e+06 -7.222400062441921e+03 4.206951818311299e+01 -2.626991342452918e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.520000000000000e+02 -2.331597777034898e+06 -9.758606010739326e+05 6.380386663363959e+06 -7.222342849751345e+03 4.211453713305846e+01 -2.627148697908019e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.530000000000000e+02 -2.331742223256299e+06 -9.758597583318817e+05 6.380334118839827e+06 -7.222285634176315e+03 4.215955542886972e+01 -2.627306049887438e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.540000000000000e+02 -2.331886668463859e+06 -9.758589146917696e+05 6.380281571120574e+06 -7.222228413324499e+03 4.220457477289921e+01 -2.627463404985591e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.550000000000000e+02 -2.332031112464127e+06 -9.758580701501688e+05 6.380229020277416e+06 -7.222171189595133e+03 4.224959332053531e+01 -2.627620756582338e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.560000000000000e+02 -2.332175555289021e+06 -9.758572247076561e+05 6.380176466298607e+06 -7.222113962583345e+03 4.229461117508528e+01 -2.627778105784971e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.570000000000000e+02 -2.332319996971063e+06 -9.758563783648058e+05 6.380123909172165e+06 -7.222056731895892e+03 4.233962936908991e+01 -2.627935453713952e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.580000000000000e+02 -2.332464437574171e+06 -9.758555311227647e+05 6.380071348874559e+06 -7.221999496785375e+03 4.238464733119012e+01 -2.628092802375128e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.590000000000000e+02 -2.332608877002088e+06 -9.758546829798189e+05 6.380018785441221e+06 -7.221942258250110e+03 4.242966540366751e+01 -2.628250149068578e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.600000000000000e+02 -2.332753315286737e+06 -9.758538339365517e+05 6.379966218860408e+06 -7.221885016186149e+03 4.247468283348761e+01 -2.628407494040628e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.610000000000000e+02 -2.332897752427839e+06 -9.758529839929612e+05 6.379913649132215e+06 -7.221827770379682e+03 4.251970007260222e+01 -2.628564837894966e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.620000000000000e+02 -2.333042188425724e+06 -9.758521331490491e+05 6.379861076256520e+06 -7.221770520924001e+03 4.256471755760745e+01 -2.628722180398993e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.630000000000000e+02 -2.333186623215735e+06 -9.758512814036821e+05 6.379808500257142e+06 -7.221713268601577e+03 4.260973415147866e+01 -2.628879519369224e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.640000000000000e+02 -2.333331056926359e+06 -9.758504287591475e+05 6.379755921086743e+06 -7.221656011740828e+03 4.265475073770008e+01 -2.629036859395360e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.650000000000000e+02 -2.333475489590127e+06 -9.758495752160145e+05 6.379703338733332e+06 -7.221598750034971e+03 4.269976818800363e+01 -2.629194201353544e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.660000000000000e+02 -2.333619920981420e+06 -9.758487207702964e+05 6.379650753280042e+06 -7.221541486266658e+03 4.274478443955933e+01 -2.629351537575815e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.670000000000000e+02 -2.333764351260909e+06 -9.758478654248468e+05 6.379598164667663e+06 -7.221484218336425e+03 4.278980063484963e+01 -2.629508873827467e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.680000000000000e+02 -2.333908780396736e+06 -9.758470091791030e+05 6.379545572907941e+06 -7.221426946849388e+03 4.283481674776614e+01 -2.629666208461613e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.690000000000000e+02 -2.334053208388644e+06 -9.758461520330659e+05 6.379492978000969e+06 -7.221369671643189e+03 4.287983277688231e+01 -2.629823541919671e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.700000000000000e+02 -2.334197635236333e+06 -9.758452939867396e+05 6.379440379946852e+06 -7.221312392733720e+03 4.292484821754275e+01 -2.629980874133994e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.710000000000000e+02 -2.334342060972341e+06 -9.758444350407002e+05 6.379387778733598e+06 -7.221255109789268e+03 4.296986405711921e+01 -2.630138206054115e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.720000000000000e+02 -2.334486485531795e+06 -9.758435751938093e+05 6.379335174385112e+06 -7.221197823480133e+03 4.301487917424802e+01 -2.630295535803486e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.730000000000000e+02 -2.334630908947233e+06 -9.758427144466379e+05 6.379282566889409e+06 -7.221140533580143e+03 4.305989467986197e+01 -2.630452864050790e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.740000000000000e+02 -2.334775331153989e+06 -9.758418527980536e+05 6.379229956270322e+06 -7.221083240798124e+03 4.310490929512362e+01 -2.630610188807652e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.750000000000000e+02 -2.334919752280538e+06 -9.758409902503402e+05 6.379177342480486e+06 -7.221025943562202e+03 4.314992370632483e+01 -2.630767514379754e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.760000000000000e+02 -2.335064172262855e+06 -9.758401268023615e+05 6.379124725543504e+06 -7.220968642541400e+03 4.319493851863292e+01 -2.630924838977727e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.770000000000000e+02 -2.335208591100649e+06 -9.758392624541179e+05 6.379072105459485e+06 -7.220911337998127e+03 4.323995302138992e+01 -2.631082161854125e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.780000000000000e+02 -2.335353008890205e+06 -9.758383972073221e+05 6.379019482192912e+06 -7.220854028401914e+03 4.328496745060473e+01 -2.631239487179063e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.790000000000000e+02 -2.335497425342170e+06 -9.758375310568599e+05 6.378966855850498e+06 -7.220796717618958e+03 4.332998118526983e+01 -2.631396804417158e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.800000000000000e+02 -2.335641840745955e+06 -9.758366640078499e+05 6.378914226325510e+06 -7.220739401975281e+03 4.337499505354890e+01 -2.631554123591476e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.810000000000000e+02 -2.335786255004719e+06 -9.758357960585937e+05 6.378861593653661e+06 -7.220682082671458e+03 4.342000849090799e+01 -2.631711441412533e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.820000000000000e+02 -2.335930668150987e+06 -9.758349272096612e+05 6.378808957822952e+06 -7.220624759230646e+03 4.346502225707798e+01 -2.631868759212325e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.830000000000000e+02 -2.336075080119898e+06 -9.758340574599237e+05 6.378756318857305e+06 -7.220567432535579e+03 4.351003524088343e+01 -2.632026074539257e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.840000000000000e+02 -2.336219490943982e+06 -9.758331868099438e+05 6.378703676744719e+06 -7.220510102128381e+03 4.355504874174909e+01 -2.632183388699817e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.850000000000000e+02 -2.336363900558580e+06 -9.758323152585984e+05 6.378651031509056e+06 -7.220452768960427e+03 4.360006120412073e+01 -2.632340699035179e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.860000000000000e+02 -2.336508309156538e+06 -9.758314428092981e+05 6.378598383079155e+06 -7.220395430410918e+03 4.364507388883659e+01 -2.632498012724054e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.870000000000000e+02 -2.336652716577257e+06 -9.758305694591990e+05 6.378545731514271e+06 -7.220338088571542e+03 4.369008698906360e+01 -2.632655324094624e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.880000000000000e+02 -2.336797122788271e+06 -9.758296952077462e+05 6.378493076826381e+06 -7.220280743875334e+03 4.373509907002440e+01 -2.632812631902199e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.890000000000000e+02 -2.336941527885864e+06 -9.758288200566435e+05 6.378440418979963e+06 -7.220223395142537e+03 4.378011102173571e+01 -2.632969939393374e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.900000000000000e+02 -2.337085931838182e+06 -9.758279440053258e+05 6.378387757986768e+06 -7.220166042758612e+03 4.382512317712795e+01 -2.633127245537395e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.910000000000000e+02 -2.337230334677139e+06 -9.758270670543645e+05 6.378335093835010e+06 -7.220108686237540e+03 4.387013515919118e+01 -2.633284551635619e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.920000000000000e+02 -2.337374736305890e+06 -9.758261892020656e+05 6.378282426560435e+06 -7.220051326816164e+03 4.391514619676180e+01 -2.633441854293138e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.930000000000000e+02 -2.337519136853523e+06 -9.758253104506959e+05 6.378229756115397e+06 -7.219993962973327e+03 4.396015803386727e+01 -2.633599157723316e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.940000000000000e+02 -2.337663536158830e+06 -9.758244307974249e+05 6.378177082559402e+06 -7.219936596669182e+03 4.400516907707902e+01 -2.633756456528783e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.950000000000000e+02 -2.337807934382449e+06 -9.758235502450966e+05 6.378124405833145e+06 -7.219879225823483e+03 4.405017957483588e+01 -2.633913756368148e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.960000000000000e+02 -2.337952331460359e+06 -9.758226687925721e+05 6.378071725960263e+06 -7.219821851394071e+03 4.409519080817162e+01 -2.634071054702934e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.970000000000000e+02 -2.338096727392069e+06 -9.758217864398642e+05 6.378019042940932e+06 -7.219764473159872e+03 4.414020113064996e+01 -2.634228352054106e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.980000000000000e+02 -2.338241122177920e+06 -9.758209031869686e+05 6.377966356775030e+06 -7.219707091370103e+03 4.418521187119931e+01 -2.634385647809088e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.990000000000000e+02 -2.338385515881999e+06 -9.758200190350242e+05 6.377913667438883e+06 -7.219649705043596e+03 4.423022239340496e+01 -2.634542944599693e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.000000000000000e+02 -2.338529908310927e+06 -9.758191339806470e+05 6.377860975003910e+06 -7.219592316635973e+03 4.427523185826944e+01 -2.634700235722672e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.010000000000000e+02 -2.338674299690322e+06 -9.758182480277867e+05 6.377808279386780e+06 -7.219534923351437e+03 4.432024222164166e+01 -2.634857528857650e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.020000000000000e+02 -2.338818689955534e+06 -9.758173611753214e+05 6.377755580611369e+06 -7.219477525973693e+03 4.436525233724271e+01 -2.635014821822975e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.030000000000000e+02 -2.338963079009742e+06 -9.758164734215650e+05 6.377702878713439e+06 -7.219420125740097e+03 4.441026142864349e+01 -2.635172111224751e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.040000000000000e+02 -2.339107466853290e+06 -9.758155847665168e+05 6.377650173692872e+06 -7.219362722699654e+03 4.445527074563230e+01 -2.635329396990374e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.050000000000000e+02 -2.339251853614619e+06 -9.758146952124375e+05 6.377597465502209e+06 -7.219305315107360e+03 4.450027986248512e+01 -2.635486683832841e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.060000000000000e+02 -2.339396239293452e+06 -9.758138047593377e+05 6.377544754141550e+06 -7.219247903017277e+03 4.454528886004573e+01 -2.635643971608922e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.070000000000000e+02 -2.339540623697033e+06 -9.758129134038286e+05 6.377492039682114e+06 -7.219190488924012e+03 4.459029748464131e+01 -2.635801253540910e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.080000000000000e+02 -2.339685006953610e+06 -9.758120211481743e+05 6.377439322076520e+06 -7.219133071143292e+03 4.463530549390487e+01 -2.635958534185421e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.090000000000000e+02 -2.339829389224423e+06 -9.758111279951939e+05 6.377386601265170e+06 -7.219075647630040e+03 4.468031470797675e+01 -2.636115819174736e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.100000000000000e+02 -2.339973770219562e+06 -9.758102339398217e+05 6.377333877355208e+06 -7.219018222095590e+03 4.472532251759530e+01 -2.636273098320301e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.110000000000000e+02 -2.340118150131841e+06 -9.758093389854447e+05 6.377281150275373e+06 -7.218960792049232e+03 4.477033049117136e+01 -2.636430378450713e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.120000000000000e+02 -2.340262528832860e+06 -9.758084431298034e+05 6.377228420073115e+06 -7.218903359135230e+03 4.481533849806851e+01 -2.636587655101675e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.130000000000000e+02 -2.340406906418896e+06 -9.758075463745999e+05 6.377175686712855e+06 -7.218845922194367e+03 4.486034602373462e+01 -2.636744931391482e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.140000000000000e+02 -2.340551282825301e+06 -9.758066487187125e+05 6.377122950218483e+06 -7.218788481932406e+03 4.490535296135843e+01 -2.636902205401821e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.150000000000000e+02 -2.340695658181133e+06 -9.758057501643905e+05 6.377070210542286e+06 -7.218731036751496e+03 4.495036091274432e+01 -2.637059481540131e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.160000000000000e+02 -2.340840032260861e+06 -9.758048507077014e+05 6.377017467767646e+06 -7.218673589555139e+03 4.499536753460987e+01 -2.637216751824782e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.170000000000000e+02 -2.340984405321635e+06 -9.758039503531525e+05 6.376964721799486e+06 -7.218616137050899e+03 4.504037454441222e+01 -2.637374025261297e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.180000000000000e+02 -2.341128777170718e+06 -9.758030490973677e+05 6.376911972709067e+06 -7.218558681700323e+03 4.508538140839548e+01 -2.637531295152814e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.190000000000000e+02 -2.341273147872192e+06 -9.758021469414766e+05 6.376859220472693e+06 -7.218501222649264e+03 4.513038795425842e+01 -2.637688563806064e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.200000000000000e+02 -2.341417517361416e+06 -9.758012438843634e+05 6.376806465114269e+06 -7.218443760750911e+03 4.517539358344617e+01 -2.637845828880857e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.210000000000000e+02 -2.341561885831806e+06 -9.758003399293988e+05 6.376753706562263e+06 -7.218386293530558e+03 4.522040039036455e+01 -2.638003097182101e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.220000000000000e+02 -2.341706253057620e+06 -9.757994350726566e+05 6.376700944900164e+06 -7.218328823903374e+03 4.526540569370060e+01 -2.638160360683665e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.230000000000000e+02 -2.341850619167917e+06 -9.757985293163848e+05 6.376648180080234e+06 -7.218271350137224e+03 4.531041179404879e+01 -2.638317624188023e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.240000000000000e+02 -2.341994984130237e+06 -9.757976226600283e+05 6.376595412114483e+06 -7.218213872776792e+03 4.535541720384357e+01 -2.638474886148710e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.250000000000000e+02 -2.342139347944295e+06 -9.757967151035885e+05 6.376542641003008e+06 -7.218156391625097e+03 4.540042239822345e+01 -2.638632147121942e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.260000000000000e+02 -2.342283710674790e+06 -9.757958066481934e+05 6.376489866721871e+06 -7.218098906032134e+03 4.544542809869364e+01 -2.638789408902399e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.270000000000000e+02 -2.342428072192729e+06 -9.757948972915981e+05 6.376437089318804e+06 -7.218041417640545e+03 4.549043312310526e+01 -2.638946666984835e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.280000000000000e+02 -2.342572432497845e+06 -9.757939870338136e+05 6.376384308793899e+06 -7.217983926258447e+03 4.553543727355358e+01 -2.639103921879990e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.290000000000000e+02 -2.342716791751342e+06 -9.757930758776406e+05 6.376331525087508e+06 -7.217926430127005e+03 4.558044229940485e+01 -2.639261178433995e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.300000000000000e+02 -2.342861149824247e+06 -9.757921638208457e+05 6.376278738247354e+06 -7.217868930624765e+03 4.562544671378126e+01 -2.639418432842992e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.310000000000000e+02 -2.343005506716276e+06 -9.757912508634330e+05 6.376225948273540e+06 -7.217811427855875e+03 4.567045036136383e+01 -2.639575684817829e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.320000000000000e+02 -2.343149862492124e+06 -9.757903370065194e+05 6.376173155142127e+06 -7.217753921110674e+03 4.571545480102716e+01 -2.639732936353952e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.330000000000000e+02 -2.343294217119119e+06 -9.757894222495599e+05 6.376120358865201e+06 -7.217696410587216e+03 4.576045822168248e+01 -2.639890186829145e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.340000000000000e+02 -2.343438570597607e+06 -9.757885065925468e+05 6.376067559442632e+06 -7.217638896391858e+03 4.580546225716567e+01 -2.640047436032911e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.350000000000000e+02 -2.343582922959487e+06 -9.757875900360510e+05 6.376014756862612e+06 -7.217581378151042e+03 4.585046577316805e+01 -2.640204684922604e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.360000000000000e+02 -2.343727274140127e+06 -9.757866725789574e+05 6.375961951149065e+06 -7.217523856593080e+03 4.589546874433174e+01 -2.640361931525623e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.370000000000000e+02 -2.343871624107687e+06 -9.757857542207021e+05 6.375909142313783e+06 -7.217466332256663e+03 4.594047183576936e+01 -2.640519174415738e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.380000000000000e+02 -2.344015973054938e+06 -9.757848349646545e+05 6.375856330285390e+06 -7.217408802604309e+03 4.598547496517639e+01 -2.640676420456512e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.390000000000000e+02 -2.344160320788549e+06 -9.757839148074605e+05 6.375803515135461e+06 -7.217351269956735e+03 4.603047738725671e+01 -2.640833663331858e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.400000000000000e+02 -2.344304667373214e+06 -9.757829937502369e+05 6.375750696840047e+06 -7.217293733788878e+03 4.607548024604162e+01 -2.640990904516995e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.410000000000000e+02 -2.344449012744311e+06 -9.757820717918753e+05 6.375697875423080e+06 -7.217236194707629e+03 4.612048214926917e+01 -2.641148142304124e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.420000000000000e+02 -2.344593357030238e+06 -9.757811489346131e+05 6.375645050837001e+06 -7.217178651103162e+03 4.616548405212814e+01 -2.641305381094207e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.430000000000000e+02 -2.344737700166995e+06 -9.757802251773375e+05 6.375592223105520e+06 -7.217121103912810e+03 4.621048613403750e+01 -2.641462618359473e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.440000000000000e+02 -2.344882042186483e+06 -9.757793005206088e+05 6.375539392216809e+06 -7.217063552542428e+03 4.625548813276447e+01 -2.641619855694812e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.450000000000000e+02 -2.345026382991894e+06 -9.757783749627566e+05 6.375486558206733e+06 -7.217005998346728e+03 4.630048927041871e+01 -2.641777089398808e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.460000000000000e+02 -2.345170722712256e+06 -9.757774485060194e+05 6.375433721027493e+06 -7.216948439678539e+03 4.634549094051488e+01 -2.641934323992899e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.470000000000000e+02 -2.345315061250573e+06 -9.757765211487245e+05 6.375380880715020e+06 -7.216890877751429e+03 4.639049194871625e+01 -2.642091556138123e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.480000000000000e+02 -2.345459398639351e+06 -9.757755928914311e+05 6.375328037257263e+06 -7.216833312047928e+03 4.643549321438687e+01 -2.642248787277503e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.490000000000000e+02 -2.345603734878319e+06 -9.757746637341498e+05 6.375275190654337e+06 -7.216775742854112e+03 4.648049386793096e+01 -2.642406016596366e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.500000000000000e+02 -2.345748069967183e+06 -9.757737336768800e+05 6.375222340906332e+06 -7.216718169768664e+03 4.652549425895711e+01 -2.642563245196491e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.510000000000000e+02 -2.345892403938463e+06 -9.757728027201827e+05 6.375169488001207e+06 -7.216660592769607e+03 4.657049515090013e+01 -2.642720473173136e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.520000000000000e+02 -2.346036736695368e+06 -9.757718708623881e+05 6.375116631974830e+06 -7.216603012866974e+03 4.661549522508997e+01 -2.642877697733267e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.530000000000000e+02 -2.346181068366291e+06 -9.757709381057355e+05 6.375063772779609e+06 -7.216545428410376e+03 4.666049508172641e+01 -2.643034923367378e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.540000000000000e+02 -2.346325398822904e+06 -9.757700044479964e+05 6.375010910463115e+06 -7.216487841169982e+03 4.670549495595976e+01 -2.643192145300764e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.550000000000000e+02 -2.346469728161423e+06 -9.757690698908403e+05 6.374958044989679e+06 -7.216430249831989e+03 4.675049475878617e+01 -2.643349367081079e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.560000000000000e+02 -2.346614056349408e+06 -9.757681344337246e+05 6.374905176371326e+06 -7.216372654816444e+03 4.679549382534844e+01 -2.643506587541460e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.570000000000000e+02 -2.346758383419362e+06 -9.757671980772004e+05 6.374852304595998e+06 -7.216315055689179e+03 4.684049360779940e+01 -2.643663807923667e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.580000000000000e+02 -2.346902709242123e+06 -9.757662608190542e+05 6.374799429711589e+06 -7.216257454164247e+03 4.688549196390976e+01 -2.643821023494373e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.590000000000000e+02 -2.347047034043217e+06 -9.757653226631747e+05 6.374746551634474e+06 -7.216199847254726e+03 4.693049158265325e+01 -2.643978242452491e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.600000000000000e+02 -2.347191357565010e+06 -9.757643836051233e+05 6.374693670460185e+06 -7.216142238383018e+03 4.697548984583310e+01 -2.644135455426031e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.610000000000000e+02 -2.347335680064572e+06 -9.757634436493496e+05 6.374640786093391e+06 -7.216084624163485e+03 4.702048843191160e+01 -2.644292671642860e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.620000000000000e+02 -2.347480001349233e+06 -9.757625027925189e+05 6.374587898605541e+06 -7.216027007116661e+03 4.706548711042333e+01 -2.644449884281140e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.630000000000000e+02 -2.347624321483043e+06 -9.757615610357512e+05 6.374535007972877e+06 -7.215969386330756e+03 4.711048510860783e+01 -2.644607095768410e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.640000000000000e+02 -2.347768640465730e+06 -9.757606183790512e+05 6.374482114195505e+06 -7.215911761894598e+03 4.715548278545022e+01 -2.644764305881542e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.650000000000000e+02 -2.347912958265466e+06 -9.757596748218630e+05 6.374429217285231e+06 -7.215854134226134e+03 4.720048069636367e+01 -2.644921513517577e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.660000000000000e+02 -2.348057274946300e+06 -9.757587303653021e+05 6.374376317218289e+06 -7.215796502501815e+03 4.724547817290126e+01 -2.645078720869922e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.670000000000000e+02 -2.348201590540122e+06 -9.757577850099282e+05 6.374323413982846e+06 -7.215738866194251e+03 4.729047573994058e+01 -2.645235929387401e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.680000000000000e+02 -2.348345904854268e+06 -9.757568387524174e+05 6.374270507650383e+06 -7.215681227902825e+03 4.733547260586616e+01 -2.645393132012194e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.690000000000000e+02 -2.348490218145797e+06 -9.757558915972074e+05 6.374217598125523e+06 -7.215623584282036e+03 4.738047008832054e+01 -2.645550337841646e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.700000000000000e+02 -2.348634530221425e+06 -9.757549435409766e+05 6.374164685479980e+06 -7.215565937833369e+03 4.742546663854675e+01 -2.645707540047375e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.710000000000000e+02 -2.348778841081495e+06 -9.757539945837299e+05 6.374111769713629e+06 -7.215508288510982e+03 4.747046305746665e+01 -2.645864738791134e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.720000000000000e+02 -2.348923150918509e+06 -9.757530447287954e+05 6.374058850755027e+06 -7.215450633828053e+03 4.751545961612169e+01 -2.646021940800500e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.730000000000000e+02 -2.349067459507657e+06 -9.757520939722962e+05 6.374005928687613e+06 -7.215392976825654e+03 4.756045592637776e+01 -2.646179137845998e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.740000000000000e+02 -2.349211766977313e+06 -9.757511423164569e+05 6.373953003463732e+06 -7.215335315608363e+03 4.760545186798649e+01 -2.646336335039746e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.750000000000000e+02 -2.349356073295041e+06 -9.757501897607268e+05 6.373900075095430e+06 -7.215277650804020e+03 4.765044744954339e+01 -2.646493530687004e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.760000000000000e+02 -2.349500378461170e+06 -9.757492363051040e+05 6.373847143582576e+06 -7.215219982294277e+03 4.769544336512521e+01 -2.646650725139714e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.770000000000000e+02 -2.349644682475421e+06 -9.757482819495944e+05 6.373794208925273e+06 -7.215162310095297e+03 4.774043885741683e+01 -2.646807918318849e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.780000000000000e+02 -2.349788985305359e+06 -9.757473266936542e+05 6.373741271135568e+06 -7.215104634653078e+03 4.778543364930006e+01 -2.646965109007762e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.790000000000000e+02 -2.349933287047801e+06 -9.757463705389403e+05 6.373688330177505e+06 -7.215046954700246e+03 4.783042915138738e+01 -2.647122300692855e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.800000000000000e+02 -2.350077587605989e+06 -9.757454134837989e+05 6.373635386087012e+06 -7.214989271492951e+03 4.787542403205843e+01 -2.647279489921712e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.810000000000000e+02 -2.350221886947480e+06 -9.757444555276866e+05 6.373582438876145e+06 -7.214931585478921e+03 4.792041803814409e+01 -2.647436675474651e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.820000000000000e+02 -2.350366185201256e+06 -9.757434966728077e+05 6.373529488496991e+06 -7.214873894881693e+03 4.796541289533640e+01 -2.647593862225854e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.830000000000000e+02 -2.350510482366832e+06 -9.757425369191740e+05 6.373476534949733e+06 -7.214816199841262e+03 4.801040723792865e+01 -2.647751049733436e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.840000000000000e+02 -2.350654778348063e+06 -9.757415762651290e+05 6.373423578270074e+06 -7.214758501502855e+03 4.805540179585302e+01 -2.647908234941370e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.850000000000000e+02 -2.350799073048193e+06 -9.757406147090198e+05 6.373370618493963e+06 -7.214700801204491e+03 4.810039522951713e+01 -2.648065414177953e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.860000000000000e+02 -2.350943366756377e+06 -9.757396522558220e+05 6.373317655513979e+06 -7.214643095073776e+03 4.814538895074335e+01 -2.648222597955541e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.870000000000000e+02 -2.351087659279997e+06 -9.757386889022221e+05 6.373264689401679e+06 -7.214585385782763e+03 4.819038299032022e+01 -2.648379779067081e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.880000000000000e+02 -2.351231950618773e+06 -9.757377246482279e+05 6.373211720157160e+06 -7.214527673130327e+03 4.823537626556620e+01 -2.648536958004920e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.890000000000000e+02 -2.351376240708113e+06 -9.757367594927435e+05 6.373158747804435e+06 -7.214469958168310e+03 4.828036865898943e+01 -2.648694131927063e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.900000000000000e+02 -2.351520529773461e+06 -9.757357934396237e+05 6.373105772259723e+06 -7.214412237787939e+03 4.832536208406471e+01 -2.648851309306788e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.910000000000000e+02 -2.351664817653749e+06 -9.757348264861231e+05 6.373052793582877e+06 -7.214354514134873e+03 4.837035484914193e+01 -2.649008484278575e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.920000000000000e+02 -2.351809104445171e+06 -9.757338586338958e+05 6.372999811738146e+06 -7.214296786017533e+03 4.841534753142692e+01 -2.649165660082446e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.930000000000000e+02 -2.351953389955114e+06 -9.757328898796408e+05 6.372946826797117e+06 -7.214239055908769e+03 4.846033984758020e+01 -2.649322830037514e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.940000000000000e+02 -2.352097674376246e+06 -9.757319202266657e+05 6.372893838688173e+06 -7.214181321219538e+03 4.850533205561125e+01 -2.649480001136762e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.950000000000000e+02 -2.352241957643975e+06 -9.757309496738759e+05 6.372840847435332e+06 -7.214123582984915e+03 4.855032377807920e+01 -2.649637170571803e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.960000000000000e+02 -2.352386239790797e+06 -9.757299782218233e+05 6.372787853026502e+06 -7.214065840510313e+03 4.859531600547001e+01 -2.649794340261034e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.970000000000000e+02 -2.352530520655436e+06 -9.757290058677605e+05 6.372734855521642e+06 -7.214008096126671e+03 4.864030685862654e+01 -2.649951503834001e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.980000000000000e+02 -2.352674800559809e+06 -9.757280326171938e+05 6.372681854801072e+06 -7.213950345560700e+03 4.868529902520051e+01 -2.650108672934057e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.990000000000000e+02 -2.352819079214221e+06 -9.757270584651727e+05 6.372628850972490e+06 -7.213892592525601e+03 4.873029035890340e+01 -2.650265837452832e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.000000000000000e+02 -2.352963356682697e+06 -9.757260834128091e+05 6.372575844012093e+06 -7.213834836238039e+03 4.877528083048877e+01 -2.650422999500677e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.010000000000000e+02 -2.353107633029904e+06 -9.757251074611997e+05 6.372522833895840e+06 -7.213777075916443e+03 4.882027195336252e+01 -2.650580161254098e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.020000000000000e+02 -2.353251908191245e+06 -9.757241306092492e+05 6.372469820647747e+06 -7.213719312315969e+03 4.886526256215565e+01 -2.650737320624079e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.030000000000000e+02 -2.353396182230740e+06 -9.757231528580631e+05 6.372416804244001e+06 -7.213661544579059e+03 4.891025274915768e+01 -2.650894479925700e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.040000000000000e+02 -2.353540455084433e+06 -9.757221742065484e+05 6.372363784708396e+06 -7.213603773648843e+03 4.895524298182389e+01 -2.651051636639400e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.050000000000000e+02 -2.353684726848505e+06 -9.757211946563467e+05 6.372310762005148e+06 -7.213545998190874e+03 4.900023341792652e+01 -2.651208794367727e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.060000000000000e+02 -2.353828997490513e+06 -9.757202142069259e+05 6.372257736146323e+06 -7.213488218633417e+03 4.904522324657212e+01 -2.651365951919033e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.070000000000000e+02 -2.353973266914345e+06 -9.757192328566329e+05 6.372204707167671e+06 -7.213430436163590e+03 4.909021331471196e+01 -2.651523106134579e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.080000000000000e+02 -2.354117535183812e+06 -9.757182506065752e+05 6.372151675045460e+06 -7.213372650155825e+03 4.913520250067414e+01 -2.651680258647885e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.090000000000000e+02 -2.354261802267103e+06 -9.757172674562030e+05 6.372098639791518e+06 -7.213314860823693e+03 4.918019197844608e+01 -2.651837408938068e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.100000000000000e+02 -2.354406068292560e+06 -9.757162834077179e+05 6.372045601358094e+06 -7.213257066577566e+03 4.922518135879655e+01 -2.651994561268365e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.110000000000000e+02 -2.354550333099130e+06 -9.757152984583838e+05 6.371992559805111e+06 -7.213199269442689e+03 4.927017007619341e+01 -2.652151710158148e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.120000000000000e+02 -2.354694596751453e+06 -9.757143126092928e+05 6.371939515108516e+06 -7.213141468735123e+03 4.931515913901235e+01 -2.652308857496100e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.130000000000000e+02 -2.354838859184949e+06 -9.757133258593592e+05 6.371886467292342e+06 -7.213083665137231e+03 4.936014726021514e+01 -2.652466001385553e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.140000000000000e+02 -2.354983120527952e+06 -9.757123382107813e+05 6.371833416308827e+06 -7.213025856947512e+03 4.940513535612101e+01 -2.652623146450318e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.150000000000000e+02 -2.355127380716497e+06 -9.757113496624606e+05 6.371780362181781e+06 -7.212968045297007e+03 4.945012375358277e+01 -2.652780289659980e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.160000000000000e+02 -2.355271639750303e+06 -9.757103602144021e+05 6.371727304911297e+06 -7.212910229785196e+03 4.949511183371506e+01 -2.652937432064312e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.170000000000000e+02 -2.355415897629084e+06 -9.757093698666148e+05 6.371674244497485e+06 -7.212852410667678e+03 4.954009924313496e+01 -2.653094572958903e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.180000000000000e+02 -2.355560154353180e+06 -9.757083786190958e+05 6.371621180940215e+06 -7.212794587854762e+03 4.958508712331007e+01 -2.653251712637802e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.190000000000000e+02 -2.355704409922321e+06 -9.757073864718532e+05 6.371568114239588e+06 -7.212736761367684e+03 4.963007453986067e+01 -2.653408851000808e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.200000000000000e+02 -2.355848664336214e+06 -9.757063934248908e+05 6.371515044395714e+06 -7.212678931236312e+03 4.967506144634676e+01 -2.653565987965395e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.210000000000000e+02 -2.355992917627362e+06 -9.757053994787554e+05 6.371461971396484e+06 -7.212621097019462e+03 4.972004896820562e+01 -2.653723124770655e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.220000000000000e+02 -2.356137169698813e+06 -9.757044046318186e+05 6.371408895278003e+06 -7.212563259940295e+03 4.976503521146516e+01 -2.653880258037788e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.230000000000000e+02 -2.356281420679518e+06 -9.757034088862593e+05 6.371355815992246e+06 -7.212505418345628e+03 4.981002235748386e+01 -2.654037392315882e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.240000000000000e+02 -2.356425670504897e+06 -9.757024122409940e+05 6.371302733563263e+06 -7.212447573093838e+03 4.985500904829962e+01 -2.654194525232468e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.250000000000000e+02 -2.356569919046062e+06 -9.757014146938468e+05 6.371249648039061e+06 -7.212389725840597e+03 4.989999439486731e+01 -2.654351652292350e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.260000000000000e+02 -2.356714166624861e+06 -9.757004162502773e+05 6.371196559299757e+06 -7.212331872408469e+03 4.994498116178016e+01 -2.654508784861618e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.270000000000000e+02 -2.356858412919510e+06 -9.756994169048250e+05 6.371143467465206e+06 -7.212274016952370e+03 4.998996699310001e+01 -2.654665911653835e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.280000000000000e+02 -2.357002658122628e+06 -9.756984166607793e+05 6.371090372463663e+06 -7.212216157015296e+03 5.003495249310079e+01 -2.654823039306651e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.290000000000000e+02 -2.357146902202405e+06 -9.756974155175884e+05 6.371037274306970e+06 -7.212158293007516e+03 5.007993858403155e+01 -2.654980166758436e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.300000000000000e+02 -2.357291144997810e+06 -9.756964134725350e+05 6.370984173055120e+06 -7.212100426958260e+03 5.012492346329122e+01 -2.655137288468695e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.310000000000000e+02 -2.357435386701471e+06 -9.756954105288937e+05 6.370931068636348e+06 -7.212042556386415e+03 5.016990837978824e+01 -2.655294411168084e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.320000000000000e+02 -2.357579627185123e+06 -9.756944066844890e+05 6.370877961098445e+06 -7.211984683022912e+03 5.021489309286750e+01 -2.655451530190431e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.330000000000000e+02 -2.357723866544725e+06 -9.756934019409582e+05 6.370824850405650e+06 -7.211926805554960e+03 5.025987736871875e+01 -2.655608649055495e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.340000000000000e+02 -2.357868104812769e+06 -9.756923962988484e+05 6.370771736545855e+06 -7.211868923590961e+03 5.030486234631741e+01 -2.655765768868157e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.350000000000000e+02 -2.358012341956818e+06 -9.756913897576175e+05 6.370718619531134e+06 -7.211811037447618e+03 5.034984699936894e+01 -2.655922888729451e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.360000000000000e+02 -2.358156577880156e+06 -9.756903823156424e+05 6.370665499397549e+06 -7.211753148615070e+03 5.039483074863116e+01 -2.656080004606519e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.370000000000000e+02 -2.358300812647420e+06 -9.756893739740073e+05 6.370612376120996e+06 -7.211695255985540e+03 5.043981516431903e+01 -2.656237119549708e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.380000000000000e+02 -2.358445046194029e+06 -9.756883647316347e+05 6.370559249725555e+06 -7.211637360628987e+03 5.048479834390909e+01 -2.656394230595807e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.390000000000000e+02 -2.358589278680442e+06 -9.756873545912482e+05 6.370506120151405e+06 -7.211579460251144e+03 5.052978181089446e+01 -2.656551343981700e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.400000000000000e+02 -2.358733509946264e+06 -9.756863435501263e+05 6.370452987458341e+06 -7.211521557050851e+03 5.057476534833563e+01 -2.656708453786955e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.410000000000000e+02 -2.358877740087651e+06 -9.756853316099097e+05 6.370399851610515e+06 -7.211463649854527e+03 5.061974835109183e+01 -2.656865563138357e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.420000000000000e+02 -2.359021969104330e+06 -9.756843187705994e+05 6.370346712608020e+06 -7.211405738435985e+03 5.066473137676680e+01 -2.657022672669050e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.430000000000000e+02 -2.359166196900197e+06 -9.756833050305704e+05 6.370293570486696e+06 -7.211347824287048e+03 5.070971411861571e+01 -2.657179778356012e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.440000000000000e+02 -2.359310423603557e+06 -9.756822903919984e+05 6.370240425198691e+06 -7.211289905534529e+03 5.075469692002729e+01 -2.657336885248577e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.450000000000000e+02 -2.359454649053403e+06 -9.756812748521743e+05 6.370187276804055e+06 -7.211231984435304e+03 5.079967867474402e+01 -2.657493987232052e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.460000000000000e+02 -2.359598873410797e+06 -9.756802584138145e+05 6.370134125242715e+06 -7.211174058802815e+03 5.084466106687928e+01 -2.657651090258409e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.470000000000000e+02 -2.359743096610970e+06 -9.756792410758373e+05 6.370080970538828e+06 -7.211116129519242e+03 5.088964283025534e+01 -2.657808191899499e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.480000000000000e+02 -2.359887318622110e+06 -9.756782228377042e+05 6.370027812704257e+06 -7.211058196954776e+03 5.093462476734548e+01 -2.657965291197524e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.490000000000000e+02 -2.360031539604662e+06 -9.756772037021253e+05 6.369974651679145e+06 -7.211000259016255e+03 5.097960697473249e+01 -2.658122393779411e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.500000000000000e+02 -2.360175759333334e+06 -9.756761836653233e+05 6.369921487547543e+06 -7.210942318781923e+03 5.102458790111834e+01 -2.658279491305804e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.510000000000000e+02 -2.360319977937047e+06 -9.756751627294563e+05 6.369868320261345e+06 -7.210884374309703e+03 5.106956962225772e+01 -2.658436589087826e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.520000000000000e+02 -2.360464195319084e+06 -9.756741408929061e+05 6.369815149856643e+06 -7.210826427045891e+03 5.111455061004629e+01 -2.658593683171536e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.530000000000000e+02 -2.360608411543455e+06 -9.756731181567662e+05 6.369761976309557e+06 -7.210768476210480e+03 5.115953092501086e+01 -2.658750775654767e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.540000000000000e+02 -2.360752626642637e+06 -9.756720945215743e+05 6.369708799607948e+06 -7.210710521106275e+03 5.120451181144800e+01 -2.658907868466262e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.550000000000000e+02 -2.360896840584222e+06 -9.756710699867995e+05 6.369655619763933e+06 -7.210652562523770e+03 5.124949219847875e+01 -2.659064959434524e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.560000000000000e+02 -2.361041053367916e+06 -9.756700445524402e+05 6.369602436777600e+06 -7.210594600113982e+03 5.129447227235852e+01 -2.659222049505078e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.570000000000000e+02 -2.361185264994060e+06 -9.756690182185010e+05 6.369549250648830e+06 -7.210536634109998e+03 5.133945258988970e+01 -2.659379138077412e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.580000000000000e+02 -2.361329475462175e+06 -9.756679909849920e+05 6.369496061377800e+06 -7.210478664411002e+03 5.138443210224121e+01 -2.659536225374534e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.590000000000000e+02 -2.361473684772593e+06 -9.756669628519071e+05 6.369442868964383e+06 -7.210420691069026e+03 5.142941211723112e+01 -2.659693311316181e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.600000000000000e+02 -2.361617892957179e+06 -9.756659338197970e+05 6.369389673396680e+06 -7.210362713574526e+03 5.147439171345333e+01 -2.659850397228161e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.610000000000000e+02 -2.361762099919230e+06 -9.756649038870436e+05 6.369336474710795e+06 -7.210304733295175e+03 5.151937066666517e+01 -2.660007479429384e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.620000000000000e+02 -2.361906305787647e+06 -9.756638730558101e+05 6.369283272858602e+06 -7.210246748536376e+03 5.156435008124912e+01 -2.660164562518229e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.630000000000000e+02 -2.362050510465733e+06 -9.756628413244820e+05 6.369230067876203e+06 -7.210188760469236e+03 5.160932898193525e+01 -2.660321643307331e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.640000000000000e+02 -2.362194714049617e+06 -9.756618086946821e+05 6.369176859727692e+06 -7.210130767870441e+03 5.165430779228544e+01 -2.660478725098661e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.650000000000000e+02 -2.362338916314669e+06 -9.756607751626335e+05 6.369123648496967e+06 -7.210072773747078e+03 5.169928609913707e+01 -2.660635799804524e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.660000000000000e+02 -2.362483117549869e+06 -9.756597407332023e+05 6.369070434076103e+06 -7.210014774302307e+03 5.174426449220492e+01 -2.660792877639671e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.670000000000000e+02 -2.362627317529953e+06 -9.756587054026134e+05 6.369017216549224e+06 -7.209956772344894e+03 5.178924202756920e+01 -2.660949951025109e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.680000000000000e+02 -2.362771516480237e+06 -9.756576691746444e+05 6.368963995832179e+06 -7.209898765153433e+03 5.183422049199982e+01 -2.661107027342852e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.690000000000000e+02 -2.362915714143336e+06 -9.756566320449860e+05 6.368910772021103e+06 -7.209840755918809e+03 5.187919789185865e+01 -2.661264097942440e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.700000000000000e+02 -2.363059910711794e+06 -9.756555940168771e+05 6.368857545044068e+06 -7.209782742110800e+03 5.192417531809457e+01 -2.661421169660865e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.710000000000000e+02 -2.363204106185954e+06 -9.756545550903220e+05 6.368804314900947e+06 -7.209724723883814e+03 5.196915312825843e+01 -2.661578242099665e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.720000000000000e+02 -2.363348300436773e+06 -9.756535152631688e+05 6.368751081639945e+06 -7.209666702759757e+03 5.201413007226262e+01 -2.661735311120292e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.730000000000000e+02 -2.363492493528869e+06 -9.756524745364980e+05 6.368697845236924e+06 -7.209608678059202e+03 5.205910727110219e+01 -2.661892378595889e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.740000000000000e+02 -2.363636685494108e+06 -9.756514329108538e+05 6.368644605679968e+06 -7.209550649135351e+03 5.210408422583467e+01 -2.662049446238384e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.750000000000000e+02 -2.363780876203643e+06 -9.756503903840857e+05 6.368591363017230e+06 -7.209492617851684e+03 5.214906013259692e+01 -2.662206509014492e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.760000000000000e+02 -2.363925065818512e+06 -9.756493469588887e+05 6.368538117188532e+06 -7.209434582134209e+03 5.219403670056363e+01 -2.662363572562883e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.770000000000000e+02 -2.364069254274160e+06 -9.756483026341862e+05 6.368484868217991e+06 -7.209376542632412e+03 5.223901310466513e+01 -2.662520635104595e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.780000000000000e+02 -2.364213441634579e+06 -9.756472574110683e+05 6.368431616081689e+06 -7.209318498730191e+03 5.228398891209140e+01 -2.662677698271707e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.790000000000000e+02 -2.364357627771561e+06 -9.756462112873781e+05 6.368378360827545e+06 -7.209260451880990e+03 5.232896510359625e+01 -2.662834758211913e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.800000000000000e+02 -2.364501812749096e+06 -9.756451642641968e+05 6.368325102431639e+06 -7.209202401416919e+03 5.237394070131575e+01 -2.662991816671747e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.810000000000000e+02 -2.364645996502641e+06 -9.756441163404572e+05 6.368271840918106e+06 -7.209144348157073e+03 5.241891546074110e+01 -2.663148871444827e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.820000000000000e+02 -2.364790179161073e+06 -9.756430675183118e+05 6.368218576238759e+06 -7.209086290359485e+03 5.246389080192387e+01 -2.663305927264304e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.830000000000000e+02 -2.364934360691772e+06 -9.756420177972238e+05 6.368165308405787e+06 -7.209028228406488e+03 5.250886593034176e+01 -2.663462983069245e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.840000000000000e+02 -2.365078541030800e+06 -9.756409671761238e+05 6.368112037443099e+06 -7.208970163287570e+03 5.255384094884393e+01 -2.663620036212461e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.850000000000000e+02 -2.365222720210024e+06 -9.756399156555547e+05 6.368058763338780e+06 -7.208912094508993e+03 5.259881544074743e+01 -2.663777087998475e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.860000000000000e+02 -2.365366898229155e+06 -9.756388632355182e+05 6.368005486092930e+06 -7.208854021944453e+03 5.264378973880197e+01 -2.663934138780682e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.870000000000000e+02 -2.365511075088536e+06 -9.756378099160207e+05 6.367952205705428e+06 -7.208795945842331e+03 5.268876412362822e+01 -2.664091187906202e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.880000000000000e+02 -2.365655250787888e+06 -9.756367556970599e+05 6.367898922176373e+06 -7.208737866004789e+03 5.273373833357866e+01 -2.664248235893320e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.890000000000000e+02 -2.365799425262657e+06 -9.756357005775792e+05 6.367845635529909e+06 -7.208679783269744e+03 5.277871139484685e+01 -2.664405280453606e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.900000000000000e+02 -2.365943598641724e+06 -9.756346445597169e+05 6.367792345717832e+06 -7.208621696193658e+03 5.282368528302709e+01 -2.664562325543030e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.910000000000000e+02 -2.366087770924808e+06 -9.756335876434756e+05 6.367739052740232e+06 -7.208563604463862e+03 5.286865923789838e+01 -2.664719371964516e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.920000000000000e+02 -2.366231941983098e+06 -9.756325298267265e+05 6.367685756645306e+06 -7.208505509918995e+03 5.291363204436328e+01 -2.664876414738551e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.930000000000000e+02 -2.366376111881191e+06 -9.756314711105295e+05 6.367632457408882e+06 -7.208447411762761e+03 5.295860557162467e+01 -2.665033456082094e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.940000000000000e+02 -2.366520280554547e+06 -9.756304114938329e+05 6.367579155055111e+06 -7.208389310723300e+03 5.300357791173452e+01 -2.665190493959624e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.950000000000000e+02 -2.366664448195687e+06 -9.756293509798441e+05 6.367525849511954e+06 -7.208331204407613e+03 5.304855080991193e+01 -2.665347534857782e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.960000000000000e+02 -2.366808614580018e+06 -9.756282895648219e+05 6.367472540863448e+06 -7.208273095578083e+03 5.309352329625632e+01 -2.665504571335663e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.970000000000000e+02 -2.366952779835573e+06 -9.756272272509127e+05 6.367419229061680e+06 -7.208214982722943e+03 5.313849528608037e+01 -2.665661607437721e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.980000000000000e+02 -2.367096943930580e+06 -9.756261640375815e+05 6.367365914118543e+06 -7.208156866206295e+03 5.318346772922700e+01 -2.665818642231550e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.990000000000000e+02 -2.367241106864747e+06 -9.756250999248354e+05 6.367312596034142e+06 -7.208098745990227e+03 5.322843953332664e+01 -2.665975675769693e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.000000000000000e+03 -2.367385268637792e+06 -9.756240349126781e+05 6.367259274808578e+06 -7.208040622060276e+03 5.327341098070805e+01 -2.666132708103522e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.001000000000000e+03 -2.367529429314321e+06 -9.756229690021802e+05 6.367205950417669e+06 -7.207982493695538e+03 5.331838308289664e+01 -2.666289741207930e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.002000000000000e+03 -2.367673588701273e+06 -9.756219021901391e+05 6.367152622933694e+06 -7.207924363392581e+03 5.336335414845676e+01 -2.666446768324690e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.003000000000000e+03 -2.367817746991145e+06 -9.756208344797703e+05 6.367099292284572e+06 -7.207866228393421e+03 5.340832488212165e+01 -2.666603796867586e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.004000000000000e+03 -2.367961904152143e+06 -9.756197658705346e+05 6.367045958482210e+06 -7.207808089428920e+03 5.345329630313230e+01 -2.666760824925742e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.005000000000000e+03 -2.368106060119736e+06 -9.756186963613727e+05 6.366992621550773e+06 -7.207749947211109e+03 5.349826700839907e+01 -2.666917850530863e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.006000000000000e+03 -2.368250214893639e+06 -9.756176259522925e+05 6.366939281490363e+06 -7.207691801708744e+03 5.354323702075730e+01 -2.667074873767850e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.007000000000000e+03 -2.368394368538450e+06 -9.756165546443575e+05 6.366885938276794e+06 -7.207633652171407e+03 5.358820766137420e+01 -2.667231896703744e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.008000000000000e+03 -2.368538521053688e+06 -9.756154824375780e+05 6.366832591910237e+06 -7.207575498516278e+03 5.363317765279521e+01 -2.667388919502871e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.009000000000000e+03 -2.368682672375430e+06 -9.756144093308854e+05 6.366779242414634e+06 -7.207517341574222e+03 5.367814793037483e+01 -2.667545939983981e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.010000000000000e+03 -2.368826822599780e+06 -9.756133353258843e+05 6.366725889753983e+06 -7.207459180156741e+03 5.372311798441562e+01 -2.667702961303844e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.011000000000000e+03 -2.368970971533696e+06 -9.756122604193845e+05 6.366672534000602e+06 -7.207401016737784e+03 5.376808702202388e+01 -2.667859976809104e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.012000000000000e+03 -2.369115119370270e+06 -9.756111846145842e+05 6.366619175082151e+06 -7.207342848806440e+03 5.381305653558496e+01 -2.668016993283220e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.013000000000000e+03 -2.369259266044991e+06 -9.756101079104242e+05 6.366565813022802e+06 -7.207284677238870e+03 5.385802561532417e+01 -2.668174008341830e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.014000000000000e+03 -2.369403411557561e+06 -9.756090303069062e+05 6.366512447822653e+06 -7.207226501897377e+03 5.390299442234274e+01 -2.668331022360391e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.015000000000000e+03 -2.369547555908320e+06 -9.756079518040334e+05 6.366459079481589e+06 -7.207168323024823e+03 5.394796340042659e+01 -2.668488034709168e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.016000000000000e+03 -2.369691699097000e+06 -9.756068724018082e+05 6.366405707999705e+06 -7.207110140458917e+03 5.399293207832068e+01 -2.668645045801199e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.017000000000000e+03 -2.369835841123305e+06 -9.756057921002423e+05 6.366352333377103e+06 -7.207051954075660e+03 5.403790006715261e+01 -2.668802055950728e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.018000000000000e+03 -2.369979981955460e+06 -9.756047108988009e+05 6.366298955625703e+06 -7.206993764638736e+03 5.408286837349401e+01 -2.668959063160670e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.019000000000000e+03 -2.370124121721691e+06 -9.756036287996161e+05 6.366245574697434e+06 -7.206935570139558e+03 5.412783665517347e+01 -2.669116072785986e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.020000000000000e+03 -2.370268260196822e+06 -9.756025457989711e+05 6.366192190676698e+06 -7.206877373691386e+03 5.417280394865789e+01 -2.669273076460465e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.021000000000000e+03 -2.370412397573961e+06 -9.756014619000582e+05 6.366138803491114e+06 -7.206819172760005e+03 5.421777166289229e+01 -2.669430081021905e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.022000000000000e+03 -2.370556533756244e+06 -9.756003771012890e+05 6.366085413176988e+06 -7.206760968531630e+03 5.426273873268298e+01 -2.669587083251854e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.023000000000000e+03 -2.370700668808255e+06 -9.755992914037276e+05 6.366032019710111e+06 -7.206702760285090e+03 5.430770618034140e+01 -2.669744085123456e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.024000000000000e+03 -2.370844802793971e+06 -9.755982048084378e+05 6.365978623066483e+06 -7.206644547013650e+03 5.435267367565534e+01 -2.669901089312400e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.025000000000000e+03 -2.370988935456100e+06 -9.755971173111846e+05 6.365925223342577e+06 -7.206586332205773e+03 5.439763982731057e+01 -2.670058086433676e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.026000000000000e+03 -2.371133067051990e+06 -9.755960289162071e+05 6.365871820441903e+06 -7.206528112515261e+03 5.444260694958851e+01 -2.670215085532898e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.027000000000000e+03 -2.371277197452865e+06 -9.755949396213946e+05 6.365818414412743e+06 -7.206469889540267e+03 5.448757336406227e+01 -2.670372082264604e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.028000000000000e+03 -2.371421326658444e+06 -9.755938494267507e+05 6.365765005255206e+06 -7.206411663331184e+03 5.453253908194043e+01 -2.670529076494883e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.029000000000000e+03 -2.371565454829676e+06 -9.755927583349262e+05 6.365711592908917e+06 -7.206353431695064e+03 5.457750586772293e+01 -2.670686074161046e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.030000000000000e+03 -2.371709581645058e+06 -9.755916663406257e+05 6.365658177494469e+06 -7.206295199021306e+03 5.462247126360936e+01 -2.670843063426932e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.031000000000000e+03 -2.371853707393413e+06 -9.755905734486260e+05 6.365604758903529e+06 -7.206236961319997e+03 5.466743666779895e+01 -2.671000055014264e+03 5.006994633100000e-03 1.337281034600000e-05 1.389707626200000e-03 1.574293841800000e-03 7.879139119400000e-05 1.591274766300000e-03</EPHEMLIST>\n\t\t</EPHEMLISTList>\n\t</EPH>\n\t<ATT>\n\t\t<SATID>Imaginary1</SATID>\n\t\t<GENERATIONTIME>1959-11-15T23:10:43.000000Z</GENERATIONTIME>\n\t\t<STARTTIME>1959-11-15T22:23:59.803099Z</STARTTIME>\n\t\t<NUMPOINTS>1031</NUMPOINTS>\n\t\t<TIMEINTERVAL>2.000000000000000e-02</TIMEINTERVAL>\n\t\t<ATTLISTList>\n\t\t\t<ATTLIST>1.000000000000000e+00 2.308894118549610e-01 -8.990762562434501e-01 1.494696383953982e-01 -3.406035703724804e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.000000000000000e+00 2.308492020770009e-01 -8.991127309774625e-01 1.495516019293347e-01 -3.404985480953350e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.000000000000000e+00 2.308089902341199e-01 -8.991491841801299e-01 1.496335571642471e-01 -3.403935269444570e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.000000000000000e+00 2.307687763281080e-01 -8.991856158536370e-01 1.497155041012714e-01 -3.402885069255873e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.000000000000000e+00 2.307285604192713e-01 -8.992220259822782e-01 1.497974427417665e-01 -3.401834880519700e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.000000000000000e+00 2.306883424874052e-01 -8.992584145759258e-01 1.498793730874100e-01 -3.400784703237341e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.000000000000000e+00 2.306481225094515e-01 -8.992947816491049e-01 1.499612951370056e-01 -3.399734537318842e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.000000000000000e+00 2.306079005610273e-01 -8.993311271795466e-01 1.500432088930861e-01 -3.398684382961558e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.000000000000000e+00 2.305676765723902e-01 -8.993674511896107e-01 1.501251143584271e-01 -3.397634240167445e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.000000000000000e+01 2.305274506020569e-01 -8.994037536686000e-01 1.502070115320059e-01 -3.396584108959652e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.100000000000000e+01 2.304872226594778e-01 -8.994400346174009e-01 1.502889004151541e-01 -3.395533989377414e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.200000000000000e+01 2.304469927202688e-01 -8.994762940499997e-01 1.503707810071873e-01 -3.394483881351499e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.300000000000000e+01 2.304067608103468e-01 -8.995125319538942e-01 1.504526533138381e-01 -3.393433785144547e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.400000000000000e+01 2.303665269504526e-01 -8.995487483340324e-01 1.505345173322320e-01 -3.392383700630191e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.500000000000000e+01 2.303262911170911e-01 -8.995849431991954e-01 1.506163730643592e-01 -3.391333627859154e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.600000000000000e+01 2.302860533409442e-01 -8.996211165411750e-01 1.506982205127815e-01 -3.390283566962244e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.700000000000000e+01 2.302458136359687e-01 -8.996572683622930e-01 1.507800596772582e-01 -3.389233517917147e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.800000000000000e+01 2.302055719711680e-01 -8.996933986738531e-01 1.508618905597058e-01 -3.388183480758828e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.900000000000000e+01 2.301653283998280e-01 -8.997295074659423e-01 1.509437131596643e-01 -3.387133455523497e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.000000000000000e+01 2.301250829100820e-01 -8.997655947436747e-01 1.510255274798994e-01 -3.386083442276749e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.100000000000000e+01 2.300848355003111e-01 -8.998016605133887e-01 1.511073335198798e-01 -3.385033440996632e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.200000000000000e+01 2.300445862012883e-01 -8.998377047698745e-01 1.511891312808153e-01 -3.383983451740198e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.300000000000000e+01 2.300043349842962e-01 -8.998737275226939e-01 1.512709207651531e-01 -3.382933474570658e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.400000000000000e+01 2.299640819001276e-01 -8.999097287608179e-01 1.513527019735164e-01 -3.381883509566505e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.500000000000000e+01 2.299238269335729e-01 -8.999457084934267e-01 1.514344749070214e-01 -3.380833556715259e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.600000000000000e+01 2.298835700858401e-01 -8.999816667249317e-01 1.515162395656930e-01 -3.379783616024466e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.700000000000000e+01 2.298433113728034e-01 -9.000176034511378e-01 1.515979959525289e-01 -3.378733687617775e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.800000000000000e+01 2.298030508222436e-01 -9.000535186697274e-01 1.516797440674307e-01 -3.377683771501871e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.900000000000000e+01 2.297627883878651e-01 -9.000894124010627e-01 1.517614839099722e-01 -3.376633867584494e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.000000000000000e+01 2.297225241332041e-01 -9.001252846210382e-01 1.518432154857528e-01 -3.375583976184146e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.100000000000000e+01 2.296822580587850e-01 -9.001611353423585e-01 1.519249387912090e-01 -3.374534097108244e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.200000000000000e+01 2.296419901216817e-01 -9.001969645783855e-01 1.520066538291376e-01 -3.373484230413469e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.300000000000000e+01 2.296017204013964e-01 -9.002327723075633e-01 1.520883606012721e-01 -3.372434376259611e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.400000000000000e+01 2.295614488356576e-01 -9.002685585546394e-01 1.521700591075273e-01 -3.371384534544187e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.500000000000000e+01 2.295211754852434e-01 -9.003043233023146e-01 1.522517493502999e-01 -3.370334705438131e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.600000000000000e+01 2.294809003489005e-01 -9.003400665589960e-01 1.523334313286813e-01 -3.369284888863371e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.700000000000000e+01 2.294406233969273e-01 -9.003757883336136e-01 1.524151050455747e-01 -3.368235084904254e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.800000000000000e+01 2.294003446708202e-01 -9.004114886163227e-01 1.524967705026567e-01 -3.367185293667498e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.900000000000000e+01 2.293600642035009e-01 -9.004471674060155e-01 1.525784276983174e-01 -3.366135515099752e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.000000000000000e+01 2.293197819208796e-01 -9.004828247255421e-01 1.526600766354939e-01 -3.365085749215226e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.100000000000000e+01 2.292794979130939e-01 -9.005184605487431e-01 1.527417173164173e-01 -3.364035996223485e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.200000000000000e+01 2.292392121595090e-01 -9.005540748895517e-01 1.528233497404930e-01 -3.362986256029100e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.300000000000000e+01 2.291989246258878e-01 -9.005896677652546e-01 1.529049739067952e-01 -3.361936528540764e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.400000000000000e+01 2.291586353857804e-01 -9.006252391503853e-01 1.529865898200752e-01 -3.360886814051653e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.500000000000000e+01 2.291183444289115e-01 -9.006607890544261e-01 1.530681974803833e-01 -3.359837112511848e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.600000000000000e+01 2.290780517110294e-01 -9.006963174941237e-01 1.531497968887997e-01 -3.358787423903505e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.700000000000000e+01 2.290377573234469e-01 -9.007318244469139e-01 1.532313880457337e-01 -3.357737748341247e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.800000000000000e+01 2.289974611982641e-01 -9.007673099394223e-01 1.533129709509062e-01 -3.356688085709674e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.900000000000000e+01 2.289571633857536e-01 -9.008027739530313e-01 1.533945456093615e-01 -3.355638436276632e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.000000000000000e+01 2.289168638978387e-01 -9.008382164936758e-01 1.534761120192709e-01 -3.354588799944336e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.100000000000000e+01 2.288765627060905e-01 -9.008736375737706e-01 1.535576701813471e-01 -3.353539176704579e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.200000000000000e+01 2.288362598510320e-01 -9.009090371818700e-01 1.536392200983933e-01 -3.352489566709856e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.300000000000000e+01 2.287959553395181e-01 -9.009444153207390e-01 1.537207617711923e-01 -3.351439969970121e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.400000000000000e+01 2.287556491449151e-01 -9.009797720031660e-01 1.538022951999299e-01 -3.350390386457154e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.500000000000000e+01 2.287153413034640e-01 -9.010151072220647e-01 1.538838203857627e-01 -3.349340816243304e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.600000000000000e+01 2.286750318456321e-01 -9.010504209683966e-01 1.539653373319234e-01 -3.348291259483580e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.700000000000000e+01 2.286347207055850e-01 -9.010857132690624e-01 1.540468460375301e-01 -3.347241716042535e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.800000000000000e+01 2.285944079807784e-01 -9.011209841023743e-01 1.541283465015993e-01 -3.346192185977502e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.900000000000000e+01 2.285540935922069e-01 -9.011562334870054e-01 1.542098387300032e-01 -3.345142669433174e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.000000000000000e+01 2.285137776151513e-01 -9.011914614095998e-01 1.542913227207110e-01 -3.344093166399171e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.100000000000000e+01 2.284734600386710e-01 -9.012266678779165e-01 1.543727984747985e-01 -3.343043676871194e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.200000000000000e+01 2.284331408358278e-01 -9.012618528990183e-01 1.544542659956163e-01 -3.341994200962399e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.300000000000000e+01 2.283928200641718e-01 -9.012970164635473e-01 1.545357252819850e-01 -3.340944738672195e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.400000000000000e+01 2.283524977100913e-01 -9.013321585782165e-01 1.546171763360017e-01 -3.339895290037957e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.500000000000000e+01 2.283121737558622e-01 -9.013672792528318e-01 1.546986191579301e-01 -3.338845855050068e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.600000000000000e+01 2.282718482490026e-01 -9.014023784775136e-01 1.547800537486034e-01 -3.337796433781504e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.700000000000000e+01 2.282315211949859e-01 -9.014374562506439e-01 1.548614801114584e-01 -3.336747026357852e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.800000000000000e+01 2.281911925523044e-01 -9.014725125919364e-01 1.549428982453311e-01 -3.335697632671091e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.900000000000000e+01 2.281508623898268e-01 -9.015075474824252e-01 1.550243081524572e-01 -3.334648252887447e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.000000000000000e+01 2.281105306968765e-01 -9.015425609288161e-01 1.551057098344290e-01 -3.333598887026744e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.100000000000000e+01 2.280701974427602e-01 -9.015775529481680e-01 1.551871032896935e-01 -3.332549534980210e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.200000000000000e+01 2.280298626912333e-01 -9.016125235194308e-01 1.552684885228014e-01 -3.331500196995136e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.300000000000000e+01 2.279895264045469e-01 -9.016474726639646e-01 1.553498655310191e-01 -3.330450872900098e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.400000000000000e+01 2.279491886218353e-01 -9.016824003659851e-01 1.554312343198999e-01 -3.329401562964052e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.500000000000000e+01 2.279088493366654e-01 -9.017173066365933e-01 1.555125948878840e-01 -3.328352267073331e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.600000000000000e+01 2.278685085455387e-01 -9.017521914808375e-01 1.555939472354268e-01 -3.327302985248539e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.700000000000000e+01 2.278281662843085e-01 -9.017870548908180e-01 1.556752913643080e-01 -3.326253717585483e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.800000000000000e+01 2.277878225474481e-01 -9.018218968676485e-01 1.557566272783169e-01 -3.325204464209868e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.900000000000000e+01 2.277474773219202e-01 -9.018567174292514e-01 1.558379549724133e-01 -3.324155224884253e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.000000000000000e+01 2.277071306398798e-01 -9.018915165602589e-01 1.559192744531291e-01 -3.323105999910311e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.100000000000000e+01 2.276667825297102e-01 -9.019262942562478e-01 1.560005857216081e-01 -3.322056789344175e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.200000000000000e+01 2.276264329300378e-01 -9.019610505484073e-01 1.560818887736019e-01 -3.321007592915521e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.300000000000000e+01 2.275860819157970e-01 -9.019957854061734e-01 1.561631836171321e-01 -3.319958411038891e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.400000000000000e+01 2.275457294529367e-01 -9.020304988535253e-01 1.562444702473319e-01 -3.318909243455180e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.500000000000000e+01 2.275053755732782e-01 -9.020651908761904e-01 1.563257486702097e-01 -3.317860090441764e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.600000000000000e+01 2.274650202784912e-01 -9.020998614835187e-01 1.564070188837957e-01 -3.316810951878419e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.700000000000000e+01 2.274246635627925e-01 -9.021345106793968e-01 1.564882808895608e-01 -3.315761827828199e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.800000000000000e+01 2.273843054540360e-01 -9.021691384595830e-01 1.565695346886553e-01 -3.314712718346152e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>8.900000000000000e+01 2.273439459552609e-01 -9.022037448252392e-01 1.566507802833999e-01 -3.313663623505077e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.000000000000000e+01 2.273035850449646e-01 -9.022383297884106e-01 1.567320176733800e-01 -3.312614543262731e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.100000000000000e+01 2.272632227706302e-01 -9.022728933373279e-01 1.568132468606372e-01 -3.311565477740380e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.200000000000000e+01 2.272228591413087e-01 -9.023074354730778e-01 1.568944678465360e-01 -3.310516426976299e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.300000000000000e+01 2.271824941003548e-01 -9.023419562165601e-01 1.569756806316125e-01 -3.309467390923438e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.400000000000000e+01 2.271421277408804e-01 -9.023764555465444e-01 1.570568852155585e-01 -3.308418369659251e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.500000000000000e+01 2.271017600289642e-01 -9.024109334726971e-01 1.571380816021496e-01 -3.307369363271641e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.600000000000000e+01 2.270613909549660e-01 -9.024453900040622e-01 1.572192697906354e-01 -3.306320371720071e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.700000000000000e+01 2.270210205597379e-01 -9.024798251311715e-01 1.573004497831998e-01 -3.305271395108554e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.800000000000000e+01 2.269806488256975e-01 -9.025142388637961e-01 1.573816215800093e-01 -3.304222433426889e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>9.900000000000000e+01 2.269402757761213e-01 -9.025486311982713e-01 1.574627851826934e-01 -3.303173486744131e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.000000000000000e+02 2.268999014261082e-01 -9.025830021336675e-01 1.575439405927323e-01 -3.302124555111638e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.010000000000000e+02 2.268595257470780e-01 -9.026173516834319e-01 1.576250878100695e-01 -3.301075638495227e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.020000000000000e+02 2.268191487818678e-01 -9.026516798373662e-01 1.577062268367185e-01 -3.300026737006468e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.030000000000000e+02 2.267787705440897e-01 -9.026859865960027e-01 1.577873576736031e-01 -3.298977850669729e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.040000000000000e+02 2.267383909922869e-01 -9.027202719732419e-01 1.578684803225331e-01 -3.297928979517886e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.050000000000000e+02 2.266980101796506e-01 -9.027545359602429e-01 1.579495947830754e-01 -3.296880123566155e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.060000000000000e+02 2.266576281145961e-01 -9.027887785563894e-01 1.580307010576523e-01 -3.295831282898973e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.070000000000000e+02 2.266172447597033e-01 -9.028229997800067e-01 1.581117991449383e-01 -3.294782457415085e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.080000000000000e+02 2.265768601771996e-01 -9.028571996087290e-01 1.581928890507955e-01 -3.293733647408182e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.090000000000000e+02 2.265364743240973e-01 -9.028913780665899e-01 1.582739707716453e-01 -3.292684852669599e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.100000000000000e+02 2.264960872520458e-01 -9.029255351385356e-01 1.583550443107866e-01 -3.291636073377974e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.110000000000000e+02 2.264556989574077e-01 -9.029596708318259e-01 1.584361096682655e-01 -3.290587309496257e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.120000000000000e+02 2.264153094101776e-01 -9.029937851555798e-01 1.585171668466072e-01 -3.289538561105754e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.130000000000000e+02 2.263749186719728e-01 -9.030278780952676e-01 1.585982158472060e-01 -3.288489828311763e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.140000000000000e+02 2.263345267302740e-01 -9.030619496639966e-01 1.586792566683216e-01 -3.287441110986375e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.150000000000000e+02 2.262941335539853e-01 -9.030959998702920e-01 1.587602893129718e-01 -3.286392409232203e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.160000000000000e+02 2.262537392150850e-01 -9.031300286942483e-01 1.588413137838595e-01 -3.285343723224960e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.170000000000000e+02 2.262133436960753e-01 -9.031640361496733e-01 1.589223300796641e-01 -3.284295052849594e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.180000000000000e+02 2.261729469656500e-01 -9.031980222499667e-01 1.590033382007226e-01 -3.283246398089076e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.190000000000000e+02 2.261325490907524e-01 -9.032319869749883e-01 1.590843381507197e-01 -3.282197759155911e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.200000000000000e+02 2.260921500600669e-01 -9.032659303345620e-01 1.591653299295246e-01 -3.281149135996107e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.210000000000000e+02 2.260517498451678e-01 -9.032998523401684e-01 1.592463135380557e-01 -3.280100528622666e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.220000000000000e+02 2.260113485107555e-01 -9.033337529753727e-01 1.593272889786086e-01 -3.279051937168809e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.230000000000000e+02 2.259709460114244e-01 -9.033676322611585e-01 1.594082562495924e-01 -3.278003361514978e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.240000000000000e+02 2.259305423854644e-01 -9.034014901831258e-01 1.594892153562206e-01 -3.276954801906414e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.250000000000000e+02 2.258901376498703e-01 -9.034353267445270e-01 1.595701662973877e-01 -3.275906258279634e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.260000000000000e+02 2.258497317753174e-01 -9.034691419609769e-01 1.596511090718433e-01 -3.274857730550200e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.270000000000000e+02 2.258093247876409e-01 -9.035029358212805e-01 1.597320436850627e-01 -3.273809218959928e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.280000000000000e+02 2.257689167326978e-01 -9.035367083200190e-01 1.598129701360737e-01 -3.272760723484922e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.290000000000000e+02 2.257285075328280e-01 -9.035704594841432e-01 1.598938884251612e-01 -3.271712244053541e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.300000000000000e+02 2.256880972689268e-01 -9.036041892927150e-01 1.599747985542908e-01 -3.270663780814236e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.310000000000000e+02 2.256476859386232e-01 -9.036378977506594e-01 1.600557005245803e-01 -3.269615333780101e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.320000000000000e+02 2.256072735071238e-01 -9.036715848706289e-01 1.601365943372820e-01 -3.268566902973604e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.330000000000000e+02 2.255668600256648e-01 -9.037052506426118e-01 1.602174799933967e-01 -3.267518488451172e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.340000000000000e+02 2.255264454711699e-01 -9.037388950791800e-01 1.602983574923177e-01 -3.266470090165642e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.350000000000000e+02 2.254860298804758e-01 -9.037725181683604e-01 1.603792268382106e-01 -3.265421708311803e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.360000000000000e+02 2.254456132456498e-01 -9.038061199188467e-01 1.604600880309865e-01 -3.264373342842701e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.370000000000000e+02 2.254051955576450e-01 -9.038397003375781e-01 1.605409410708927e-01 -3.263324993765853e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.380000000000000e+02 2.253647768549280e-01 -9.038732594139562e-01 1.606217859610819e-01 -3.262276661232033e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.390000000000000e+02 2.253243571335272e-01 -9.039067971572640e-01 1.607026227004933e-01 -3.261228345155280e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.400000000000000e+02 2.252839363788981e-01 -9.039403135734095e-01 1.607834512908293e-01 -3.260180045602453e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.410000000000000e+02 2.252435146337346e-01 -9.039738086561190e-01 1.608642717321700e-01 -3.259131762590643e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.420000000000000e+02 2.252030918978883e-01 -9.040072824048069e-01 1.609450840283314e-01 -3.258083496256971e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.430000000000000e+02 2.251626681419598e-01 -9.040407348360634e-01 1.610258881774482e-01 -3.257035246492249e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.440000000000000e+02 2.251222434208357e-01 -9.040741659338269e-01 1.611066841831087e-01 -3.255987013483763e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.450000000000000e+02 2.250818177356854e-01 -9.041075757018505e-01 1.611874720465026e-01 -3.254938797252271e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.460000000000000e+02 2.250413910460068e-01 -9.041409641594673e-01 1.612682517660020e-01 -3.253890597687710e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.470000000000000e+02 2.250009634262089e-01 -9.041743312851411e-01 1.613490233454103e-01 -3.252842414993818e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.480000000000000e+02 2.249605348218896e-01 -9.042076771028360e-01 1.614297867827374e-01 -3.251794249029646e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.490000000000000e+02 2.249201052867583e-01 -9.042410015921282e-01 1.615105420842294e-01 -3.250746100099434e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.500000000000000e+02 2.248796748333138e-01 -9.042743047606233e-01 1.615912892471164e-01 -3.249697968058097e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.510000000000000e+02 2.248392433987138e-01 -9.043075866331863e-01 1.616720282702221e-01 -3.248649852793446e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.520000000000000e+02 2.247988110762783e-01 -9.043408471771598e-01 1.617527591603132e-01 -3.247601754673968e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.530000000000000e+02 2.247583778306900e-01 -9.043740864094076e-01 1.618334819170882e-01 -3.246553673615424e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.540000000000000e+02 2.247179436581624e-01 -9.044073043389339e-01 1.619141965387736e-01 -3.245505609541191e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.550000000000000e+02 2.246775085865939e-01 -9.044405009586891e-01 1.619949030283154e-01 -3.244457562579045e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.560000000000000e+02 2.246370726521809e-01 -9.044736762617176e-01 1.620756013872978e-01 -3.243409532803686e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.570000000000000e+02 2.245966357879474e-01 -9.045068302733079e-01 1.621562916149142e-01 -3.242361520117217e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.580000000000000e+02 2.245561980666496e-01 -9.045399629715483e-01 1.622369737155533e-01 -3.241313524744262e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.590000000000000e+02 2.245157594582064e-01 -9.045730743732480e-01 1.623176476872635e-01 -3.240265546573445e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.600000000000000e+02 2.244753199839536e-01 -9.046061644744997e-01 1.623983135322956e-01 -3.239217585694149e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.610000000000000e+02 2.244348796692358e-01 -9.046392332710161e-01 1.624789712524871e-01 -3.238169642180859e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.620000000000000e+02 2.243944384760956e-01 -9.046722807774734e-01 1.625596208483077e-01 -3.237121716023925e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.630000000000000e+02 2.243539964605100e-01 -9.047053069841393e-01 1.626402623197842e-01 -3.236073807246732e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.640000000000000e+02 2.243135536112907e-01 -9.047383118950887e-01 1.627208956698758e-01 -3.235025915937824e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.650000000000000e+02 2.242731099111618e-01 -9.047712955209639e-01 1.628015208980154e-01 -3.233978042061912e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.660000000000000e+02 2.242326654043892e-01 -9.048042578511847e-01 1.628821380065774e-01 -3.232930185735796e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.670000000000000e+02 2.241922200896362e-01 -9.048371988903483e-01 1.629627469966664e-01 -3.231882346974421e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.680000000000000e+02 2.241517739456388e-01 -9.048701186494763e-01 1.630433478681252e-01 -3.230834525757387e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.690000000000000e+02 2.241113270216638e-01 -9.049030171163283e-01 1.631239406234864e-01 -3.229786722212791e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.700000000000000e+02 2.240708793134708e-01 -9.049358942964694e-01 1.632045252637703e-01 -3.228738936349059e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.710000000000000e+02 2.240304307870408e-01 -9.049687502070621e-01 1.632851017873808e-01 -3.227691168069305e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.720000000000000e+02 2.239899815191802e-01 -9.050015848229833e-01 1.633656702000140e-01 -3.226643417655971e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.730000000000000e+02 2.239495314522033e-01 -9.050343981673739e-01 1.634462305004473e-01 -3.225595685006920e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.740000000000000e+02 2.239090806423519e-01 -9.050671902313685e-01 1.635267826882597e-01 -3.224547970122622e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.750000000000000e+02 2.238686290767930e-01 -9.050999610177051e-01 1.636073267673971e-01 -3.223500273135591e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.760000000000000e+02 2.238281767417444e-01 -9.051327105349189e-01 1.636878627378910e-01 -3.222452594041973e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.770000000000000e+02 2.237877236835232e-01 -9.051654387746062e-01 1.637683906006427e-01 -3.221404932891813e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.780000000000000e+02 2.237472699051987e-01 -9.051981457399043e-01 1.638489103568783e-01 -3.220357289709835e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.790000000000000e+02 2.237068153680171e-01 -9.052308314495456e-01 1.639294220048208e-01 -3.219309664388158e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.800000000000000e+02 2.236663601390179e-01 -9.052634958797162e-01 1.640099255507795e-01 -3.218262057238749e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.810000000000000e+02 2.236259042032932e-01 -9.052961390423744e-01 1.640904209938499e-01 -3.217214468174148e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.820000000000000e+02 2.235854475304530e-01 -9.053287609487398e-01 1.641709083351387e-01 -3.216166897224738e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.830000000000000e+02 2.235449901937572e-01 -9.053613615862548e-01 1.642513875739740e-01 -3.215119344378681e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.840000000000000e+02 2.235045321496182e-01 -9.053939409667434e-01 1.643318587131818e-01 -3.214071809732330e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.850000000000000e+02 2.234640734228127e-01 -9.054264990880224e-01 1.644123217535782e-01 -3.213024293311351e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.860000000000000e+02 2.234236140525130e-01 -9.054590359431254e-01 1.644927766964319e-01 -3.211976795173924e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.870000000000000e+02 2.233831539714562e-01 -9.054915515526950e-01 1.645732235432854e-01 -3.210929315338940e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.880000000000000e+02 2.233426932493050e-01 -9.055240459024677e-01 1.646536622947568e-01 -3.209881853861549e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.890000000000000e+02 2.233022318954889e-01 -9.055565189944188e-01 1.647340929517387e-01 -3.208834410756840e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.900000000000000e+02 2.232617698578591e-01 -9.055889708470033e-01 1.648145155146224e-01 -3.207786986005804e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.910000000000000e+02 2.232213072124431e-01 -9.056214014400680e-01 1.648949299863760e-01 -3.206739579773885e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.920000000000000e+02 2.231808439302228e-01 -9.056538107864756e-01 1.649753363677421e-01 -3.205692192037142e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.930000000000000e+02 2.231403800053746e-01 -9.056861988930678e-01 1.650557346584288e-01 -3.204644822785361e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.940000000000000e+02 2.230999154906678e-01 -9.057185657483666e-01 1.651361248601688e-01 -3.203597472107650e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.950000000000000e+02 2.230594503712542e-01 -9.057509113586414e-01 1.652165069752026e-01 -3.202550140059914e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.960000000000000e+02 2.230189846182527e-01 -9.057832357383928e-01 1.652968810024963e-01 -3.201502826579687e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.970000000000000e+02 2.229785183084750e-01 -9.058155388682289e-01 1.653772469448040e-01 -3.200455531807542e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.980000000000000e+02 2.229380513813789e-01 -9.058478207665662e-01 1.654576048037784e-01 -3.199408255776890e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>1.990000000000000e+02 2.228975838957542e-01 -9.058800814237062e-01 1.655379545792557e-01 -3.198360998494869e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.000000000000000e+02 2.228571158404180e-01 -9.059123208447037e-01 1.656182962735805e-01 -3.197313760025589e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.010000000000000e+02 2.228166471957429e-01 -9.059445390438133e-01 1.656986298844098e-01 -3.196266540255518e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.020000000000000e+02 2.227761780131056e-01 -9.059767360015503e-01 1.657789554182482e-01 -3.195219339486491e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.030000000000000e+02 2.227357082865583e-01 -9.060089117287713e-01 1.658592728733668e-01 -3.194172157602826e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.040000000000000e+02 2.226952380035607e-01 -9.060410662345509e-01 1.659395822492399e-01 -3.193124994578874e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.050000000000000e+02 2.226547671835319e-01 -9.060731995156708e-01 1.660198835481492e-01 -3.192077850500230e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.060000000000000e+02 2.226142958689505e-01 -9.061053115574969e-01 1.661001767752735e-01 -3.191030725600834e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.070000000000000e+02 2.225738239865559e-01 -9.061374023958486e-01 1.661804619243396e-01 -3.189983619549152e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.080000000000000e+02 2.225333516329866e-01 -9.061694719991232e-01 1.662607390020496e-01 -3.188936532675309e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.090000000000000e+02 2.224928787329093e-01 -9.062015203925373e-01 1.663410080083983e-01 -3.187889464930468e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.100000000000000e+02 2.224524053634943e-01 -9.062335475602964e-01 1.664212689439241e-01 -3.186842416364036e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.110000000000000e+02 2.224119315031609e-01 -9.062655535109161e-01 1.665015218105944e-01 -3.185795387016284e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.120000000000000e+02 2.223714571351574e-01 -9.062975382558111e-01 1.665817666071881e-01 -3.184748376827781e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.130000000000000e+02 2.223309823073429e-01 -9.063295017832752e-01 1.666620033364477e-01 -3.183701385925106e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.140000000000000e+02 2.222905070289412e-01 -9.063614440944239e-01 1.667422319998011e-01 -3.182654414346794e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.150000000000000e+02 2.222500312486702e-01 -9.063933652064923e-01 1.668224525980038e-01 -3.181607462098400e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.160000000000000e+02 2.222095550345786e-01 -9.064252651029605e-01 1.669026651334534e-01 -3.180560529304742e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.170000000000000e+02 2.221690783889361e-01 -9.064571437900708e-01 1.669828696057496e-01 -3.179513615916548e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.180000000000000e+02 2.221286012672856e-01 -9.064890012846714e-01 1.670630660148043e-01 -3.178466721906829e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.190000000000000e+02 2.220881237332467e-01 -9.065208375717145e-01 1.671432543628869e-01 -3.177419847390440e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.200000000000000e+02 2.220476457894645e-01 -9.065526526488730e-01 1.672234346543726e-01 -3.176372992534780e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.210000000000000e+02 2.220071673902770e-01 -9.065844465399640e-01 1.673036068854050e-01 -3.175326157142076e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.220000000000000e+02 2.219666886126675e-01 -9.066162192237019e-01 1.673837710600421e-01 -3.174279341402816e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.230000000000000e+02 2.219262094104197e-01 -9.066479707212709e-01 1.674639271759886e-01 -3.173232545189831e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.240000000000000e+02 2.218857298217798e-01 -9.066797010185438e-01 1.675440752388811e-01 -3.172185768752019e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.250000000000000e+02 2.218452498586035e-01 -9.067114101185845e-01 1.676242152486578e-01 -3.171139012061969e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.260000000000000e+02 2.218047694701558e-01 -9.067430980412624e-01 1.677043472044196e-01 -3.170092275053905e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.270000000000000e+02 2.217642887481013e-01 -9.067747647631796e-01 1.677844711089856e-01 -3.169045557883431e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.280000000000000e+02 2.217238076522590e-01 -9.068064102980944e-01 1.678645869641152e-01 -3.167998860571695e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.290000000000000e+02 2.216833261682507e-01 -9.068380346556960e-01 1.679446947691512e-01 -3.166952183088218e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.300000000000000e+02 2.216428443657672e-01 -9.068696378217486e-01 1.680247945250885e-01 -3.165905525490374e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.310000000000000e+02 2.216023622104419e-01 -9.069012198062111e-01 1.681048862349372e-01 -3.164858887860527e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.320000000000000e+02 2.215618797002905e-01 -9.069327806146663e-01 1.681849698984909e-01 -3.163812270196627e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.330000000000000e+02 2.215213968831396e-01 -9.069643202383212e-01 1.682650455172512e-01 -3.162765672550845e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.340000000000000e+02 2.214809137123154e-01 -9.069958386928917e-01 1.683451130920010e-01 -3.161719094938343e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.350000000000000e+02 2.214404302429016e-01 -9.070273359671166e-01 1.684251726242895e-01 -3.160672537431115e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.360000000000000e+02 2.213999464726758e-01 -9.070588120649842e-01 1.685052241156553e-01 -3.159626000065338e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.370000000000000e+02 2.213594623823140e-01 -9.070902669978242e-01 1.685852675652402e-01 -3.158579482798961e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.380000000000000e+02 2.213189780044676e-01 -9.071217007562022e-01 1.686653029769433e-01 -3.157532985796490e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.390000000000000e+02 2.212784933609110e-01 -9.071531133398973e-01 1.687453303510913e-01 -3.156486509053351e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.400000000000000e+02 2.212380083897078e-01 -9.071845047724861e-01 1.688253496862561e-01 -3.155440052477118e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.410000000000000e+02 2.211975231811331e-01 -9.072158750273209e-01 1.689053609874809e-01 -3.154393616317306e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.420000000000000e+02 2.211570377154623e-01 -9.072472241179256e-01 1.689853642535184e-01 -3.153347200473582e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.430000000000000e+02 2.211165519575312e-01 -9.072785520590089e-01 1.690653594839392e-01 -3.152300804915153e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.440000000000000e+02 2.210760659578969e-01 -9.073098588333510e-01 1.691453466844067e-01 -3.151254429896071e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.450000000000000e+02 2.210355797460459e-01 -9.073411444419111e-01 1.692253258534460e-01 -3.150208075333562e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.460000000000000e+02 2.209950932558976e-01 -9.073724089068373e-01 1.693052969910037e-01 -3.149161741197308e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.470000000000000e+02 2.209546065715346e-01 -9.074036522054765e-01 1.693852601011247e-01 -3.148115427671855e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.480000000000000e+02 2.209141196301770e-01 -9.074348743626155e-01 1.694652151817523e-01 -3.147069134638297e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.490000000000000e+02 2.208736324860719e-01 -9.074660753626225e-01 1.695451622371381e-01 -3.146022862287389e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.500000000000000e+02 2.208331451618891e-01 -9.074972552087094e-01 1.696251012655576e-01 -3.144976610520593e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.510000000000000e+02 2.207926575919656e-01 -9.075284139163655e-01 1.697050322706234e-01 -3.143930379476456e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.520000000000000e+02 2.207521698525456e-01 -9.075595514719998e-01 1.697849552521910e-01 -3.142884169156527e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.530000000000000e+02 2.207116819420223e-01 -9.075906678812696e-01 1.698648702107515e-01 -3.141837979550178e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.540000000000000e+02 2.206711938227875e-01 -9.076217631569006e-01 1.699447771473057e-01 -3.140791810692613e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.550000000000000e+02 2.206307055471661e-01 -9.076528372848403e-01 1.700246760655409e-01 -3.139745662746382e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.560000000000000e+02 2.205902171211319e-01 -9.076838902701012e-01 1.701045669651901e-01 -3.138699535670345e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.570000000000000e+02 2.205497285032364e-01 -9.077149221304037e-01 1.701844498449678e-01 -3.137653429394483e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.580000000000000e+02 2.205092397649834e-01 -9.077459328444872e-01 1.702643247101131e-01 -3.136607344147015e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.590000000000000e+02 2.204687508688814e-01 -9.077769224296948e-01 1.703441915589663e-01 -3.135561279843042e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.600000000000000e+02 2.204282618391633e-01 -9.078078908812764e-01 1.704240503941069e-01 -3.134515236579988e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.610000000000000e+02 2.203877726950160e-01 -9.078388381989423e-01 1.705039012163325e-01 -3.133469214371442e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.620000000000000e+02 2.203472834077072e-01 -9.078697643971353e-01 1.705837440243194e-01 -3.132423213152705e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.630000000000000e+02 2.203067940170254e-01 -9.079006694631750e-01 1.706635788228773e-01 -3.131377233129635e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.640000000000000e+02 2.202663045407925e-01 -9.079315533972259e-01 1.707434056127563e-01 -3.130331274312695e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.650000000000000e+02 2.202258149224295e-01 -9.079624162220118e-01 1.708232243919963e-01 -3.129285336596204e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.660000000000000e+02 2.201853252356105e-01 -9.079932579173663e-01 1.709030351647084e-01 -3.128239420168898e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.670000000000000e+02 2.201448354746725e-01 -9.080240784875077e-01 1.709828379327863e-01 -3.127193525082714e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.680000000000000e+02 2.201043456132650e-01 -9.080548779498038e-01 1.710626326928654e-01 -3.126147651182031e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.690000000000000e+02 2.200638556889891e-01 -9.080856562923092e-01 1.711424194496907e-01 -3.125101798667813e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.700000000000000e+02 2.200233657190614e-01 -9.081164135144628e-01 1.712221982045240e-01 -3.124055967573182e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.710000000000000e+02 2.199828756600056e-01 -9.081471496346535e-01 1.713019689559082e-01 -3.123010157822704e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.720000000000000e+02 2.199423855874556e-01 -9.081778646321416e-01 1.713817317083257e-01 -3.121964369607030e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.730000000000000e+02 2.199018954379995e-01 -9.082085585319067e-01 1.714614864594658e-01 -3.120918602804016e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.740000000000000e+02 2.198614052746941e-01 -9.082392313173081e-01 1.715412332130633e-01 -3.119872857578069e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.750000000000000e+02 2.198209150881464e-01 -9.082698829956553e-01 1.716209719697834e-01 -3.118827133924153e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.760000000000000e+02 2.197804248581610e-01 -9.083005135776420e-01 1.717007027291295e-01 -3.117781431821053e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.770000000000000e+02 2.197399346379958e-01 -9.083311230489441e-01 1.717804254949706e-01 -3.116735751434506e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.780000000000000e+02 2.196994444159893e-01 -9.083617114194755e-01 1.718601402668128e-01 -3.115690092705926e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.790000000000000e+02 2.196589541638267e-01 -9.083922787016864e-01 1.719398470443260e-01 -3.114644455619064e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.800000000000000e+02 2.196184639433182e-01 -9.084228248793574e-01 1.720195458312390e-01 -3.113598840335736e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.810000000000000e+02 2.195779737513631e-01 -9.084533499577218e-01 1.720992366284800e-01 -3.112553246865558e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.820000000000000e+02 2.195374835455929e-01 -9.084838539557250e-01 1.721789194340390e-01 -3.111507675111027e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.830000000000000e+02 2.194969934044070e-01 -9.085143368489591e-01 1.722585942542054e-01 -3.110462125342257e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.840000000000000e+02 2.194565032744605e-01 -9.085447986618467e-01 1.723382610854267e-01 -3.109416597387725e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.850000000000000e+02 2.194160131996881e-01 -9.085752393831573e-01 1.724179199312106e-01 -3.108371091391562e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.860000000000000e+02 2.193755231902307e-01 -9.086056590137509e-01 1.724975707930613e-01 -3.107325607394454e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.870000000000000e+02 2.193350332083635e-01 -9.086360575701133e-01 1.725772136696710e-01 -3.106280145333657e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.880000000000000e+02 2.192945433134246e-01 -9.086664350368555e-01 1.726568485647191e-01 -3.105234705365575e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.890000000000000e+02 2.192540535029514e-01 -9.086967914190029e-01 1.727364754791529e-01 -3.104189287501232e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.900000000000000e+02 2.192135637363773e-01 -9.087271267349023e-01 1.728160944109917e-01 -3.103143891646948e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.910000000000000e+02 2.191730725401924e-01 -9.087574414716281e-01 1.728957052972007e-01 -3.102098514441726e-01 1.860000000000000e-10 2.250000000000000e-11 -3.770000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.920000000000000e+02 2.191325845382991e-01 -9.087877341123974e-01 1.729753083432086e-01 -3.101053166651483e-01 1.860000000000000e-10 2.250000000000000e-11 -3.780000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.930000000000000e+02 2.190920950584809e-01 -9.088180062006632e-01 1.730549033413756e-01 -3.100007837374675e-01 1.860000000000000e-10 2.250000000000000e-11 -3.780000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.940000000000000e+02 2.190516057029482e-01 -9.088482572100332e-01 1.731344903656375e-01 -3.098962530445900e-01 1.860000000000000e-10 2.250000000000000e-11 -3.780000000000000e-11 4.450000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.950000000000000e+02 2.190111164762024e-01 -9.088784871441590e-01 1.732140694167223e-01 -3.097917245868442e-01 1.860000000000000e-10 2.250000000000000e-11 -3.780000000000000e-11 4.460000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.820000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.960000000000000e+02 2.189706273526352e-01 -9.089086960182917e-01 1.732936404922406e-01 -3.096871983535451e-01 1.860000000000000e-10 2.240000000000000e-11 -3.790000000000000e-11 4.460000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.810000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.970000000000000e+02 2.189301383785509e-01 -9.089388838195767e-01 1.733732035966299e-01 -3.095826743618136e-01 1.860000000000000e-10 2.240000000000000e-11 -3.790000000000000e-11 4.460000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.810000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.980000000000000e+02 2.188896495247935e-01 -9.089690505635122e-01 1.734527587278601e-01 -3.094781526025304e-01 1.860000000000000e-10 2.240000000000000e-11 -3.790000000000000e-11 4.460000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.810000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>2.990000000000000e+02 2.188491608188548e-01 -9.089991962406317e-01 1.735323058908677e-01 -3.093736330959166e-01 1.860000000000000e-10 2.240000000000000e-11 -3.800000000000000e-11 4.460000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.810000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.000000000000000e+02 2.188086722782314e-01 -9.090293208530628e-01 1.736118450853936e-01 -3.092691158381359e-01 1.860000000000000e-10 2.240000000000000e-11 -3.800000000000000e-11 4.460000000000000e-11 1.750000000000000e-11 3.100000000000000e-11 -1.810000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.160000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.010000000000000e+02 2.187681896454637e-01 -9.090594225097781e-01 1.736913765774022e-01 -3.091646021912636e-01 1.860000000000000e-10 2.240000000000000e-11 -3.800000000000000e-11 4.470000000000000e-11 1.740000000000000e-11 3.090000000000000e-11 -1.810000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.150000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.020000000000000e+02 2.187283911966451e-01 -9.090888526171280e-01 1.737707389882590e-01 -3.090616106915828e-01 1.860000000000000e-10 2.240000000000000e-11 -3.810000000000000e-11 4.470000000000000e-11 1.740000000000000e-11 3.090000000000000e-11 -1.810000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.150000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.030000000000000e+02 2.186878209857443e-01 -9.091189716151923e-01 1.738503273875531e-01 -3.089569485690247e-01 1.860000000000000e-10 2.230000000000000e-11 -3.810000000000000e-11 4.470000000000000e-11 1.740000000000000e-11 3.090000000000000e-11 -1.810000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.150000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.040000000000000e+02 2.186472567115229e-01 -9.091490721149922e-01 1.739299003670912e-01 -3.088522811365780e-01 1.860000000000000e-10 2.230000000000000e-11 -3.810000000000000e-11 4.470000000000000e-11 1.740000000000000e-11 3.090000000000000e-11 -1.810000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.150000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.050000000000000e+02 2.186066979668279e-01 -9.091791531845845e-01 1.740094578519534e-01 -3.087476114833460e-01 1.860000000000000e-10 2.230000000000000e-11 -3.810000000000000e-11 4.470000000000000e-11 1.740000000000000e-11 3.090000000000000e-11 -1.800000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.150000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.060000000000000e+02 2.185661443498866e-01 -9.092092139565390e-01 1.740889997864909e-01 -3.086429424981175e-01 1.860000000000000e-10 2.230000000000000e-11 -3.820000000000000e-11 4.480000000000000e-11 1.740000000000000e-11 3.090000000000000e-11 -1.800000000000000e-11 1.680000000000000e-10 -2.360000000000000e-11 7.150000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.070000000000000e+02 2.185255954697113e-01 -9.092392536426981e-01 1.741685261449475e-01 -3.085382768156557e-01 1.860000000000000e-10 2.230000000000000e-11 -3.820000000000000e-11 4.480000000000000e-11 1.740000000000000e-11 3.090000000000000e-11 -1.800000000000000e-11 1.670000000000000e-10 -2.360000000000000e-11 7.150000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.080000000000000e+02 2.184850509567223e-01 -9.092692715430465e-01 1.742480369448701e-01 -3.084336167749477e-01 1.860000000000000e-10 2.230000000000000e-11 -3.830000000000000e-11 4.480000000000000e-11 1.740000000000000e-11 3.090000000000000e-11 -1.800000000000000e-11 1.670000000000000e-10 -2.360000000000000e-11 7.150000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.090000000000000e+02 2.184445104761907e-01 -9.092992670492093e-01 1.743275322587385e-01 -3.083289643922002e-01 1.870000000000000e-10 2.230000000000000e-11 -3.830000000000000e-11 4.480000000000000e-11 1.740000000000000e-11 3.090000000000000e-11 -1.800000000000000e-11 1.670000000000000e-10 -2.360000000000000e-11 7.150000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.100000000000000e+02 2.184039737347347e-01 -9.093292396457033e-01 1.744070122275358e-01 -3.082243213442263e-01 1.870000000000000e-10 2.230000000000000e-11 -3.830000000000000e-11 4.480000000000000e-11 1.740000000000000e-11 3.090000000000000e-11 -1.800000000000000e-11 1.670000000000000e-10 -2.360000000000000e-11 7.150000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.110000000000000e+02 2.183634712922895e-01 -9.093591787469733e-01 1.744864785365781e-01 -3.081196962897959e-01 1.870000000000000e-10 2.220000000000000e-11 -3.840000000000000e-11 4.490000000000000e-11 1.730000000000000e-11 3.090000000000000e-11 -1.800000000000000e-11 1.670000000000000e-10 -2.360000000000000e-11 7.139999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.120000000000000e+02 2.183229413375034e-01 -9.093891043347664e-01 1.745659285586194e-01 -3.080150755878994e-01 1.870000000000000e-10 2.220000000000000e-11 -3.840000000000000e-11 4.490000000000000e-11 1.730000000000000e-11 3.090000000000000e-11 -1.790000000000000e-11 1.670000000000000e-10 -2.360000000000000e-11 7.139999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.130000000000000e+02 2.182824145175236e-01 -9.094190059883994e-01 1.746453641446036e-01 -3.079104672502554e-01 1.870000000000000e-10 2.220000000000000e-11 -3.840000000000000e-11 4.490000000000000e-11 1.730000000000000e-11 3.090000000000000e-11 -1.790000000000000e-11 1.670000000000000e-10 -2.360000000000000e-11 7.139999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.140000000000000e+02 2.182418907014378e-01 -9.094488835218212e-01 1.747247857591377e-01 -3.078058716876565e-01 1.870000000000000e-10 2.220000000000000e-11 -3.840000000000000e-11 4.490000000000000e-11 1.730000000000000e-11 3.090000000000000e-11 -1.790000000000000e-11 1.670000000000000e-10 -2.360000000000000e-11 7.139999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.150000000000000e+02 2.182013697741260e-01 -9.094787368155478e-01 1.748041939353540e-01 -3.077012890640893e-01 1.870000000000000e-10 2.220000000000000e-11 -3.850000000000000e-11 4.490000000000000e-11 1.730000000000000e-11 3.090000000000000e-11 -1.790000000000000e-11 1.670000000000000e-10 -2.360000000000000e-11 7.139999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.160000000000000e+02 2.181608516231709e-01 -9.095085658092504e-01 1.748835892620452e-01 -3.075967193347119e-01 1.870000000000000e-10 2.220000000000000e-11 -3.850000000000000e-11 4.500000000000000e-11 1.730000000000000e-11 3.080000000000000e-11 -1.790000000000000e-11 1.670000000000000e-10 -2.360000000000000e-11 7.139999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.170000000000000e+02 2.181203361266777e-01 -9.095383704944475e-01 1.749629723683466e-01 -3.074921622843806e-01 1.870000000000000e-10 2.220000000000000e-11 -3.850000000000000e-11 4.500000000000000e-11 1.730000000000000e-11 3.080000000000000e-11 -1.790000000000000e-11 1.670000000000000e-10 -2.360000000000000e-11 7.139999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.180000000000000e+02 2.180798231473371e-01 -9.095681509058914e-01 1.750423439086247e-01 -3.073876175655729e-01 1.870000000000000e-10 2.220000000000000e-11 -3.860000000000000e-11 4.500000000000000e-11 1.730000000000000e-11 3.080000000000000e-11 -1.790000000000000e-11 1.670000000000000e-10 -2.360000000000000e-11 7.139999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.190000000000000e+02 2.180393125344187e-01 -9.095979071113059e-01 1.751217045477113e-01 -3.072830847354840e-01 1.870000000000000e-10 2.210000000000000e-11 -3.860000000000000e-11 4.500000000000000e-11 1.730000000000000e-11 3.080000000000000e-11 -1.790000000000000e-11 1.670000000000000e-10 -2.360000000000000e-11 7.139999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.200000000000000e+02 2.179988041268932e-01 -9.096276392023134e-01 1.752010549493006e-01 -3.071785632870930e-01 1.870000000000000e-10 2.210000000000000e-11 -3.860000000000000e-11 4.500000000000000e-11 1.730000000000000e-11 3.080000000000000e-11 -1.790000000000000e-11 1.670000000000000e-10 -2.360000000000000e-11 7.139999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.210000000000000e+02 2.179583309185672e-01 -9.096573363563061e-01 1.752803973888566e-01 -3.070740605905148e-01 1.870000000000000e-10 2.210000000000000e-11 -3.870000000000000e-11 4.510000000000000e-11 1.730000000000000e-11 3.080000000000000e-11 -1.780000000000000e-11 1.670000000000000e-10 -2.360000000000000e-11 7.130000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.220000000000000e+02 2.179178264412829e-01 -9.096870205434086e-01 1.753597292580436e-01 -3.069695602637316e-01 1.870000000000000e-10 2.210000000000000e-11 -3.870000000000000e-11 4.510000000000000e-11 1.720000000000000e-11 3.080000000000000e-11 -1.780000000000000e-11 1.670000000000000e-10 -2.360000000000000e-11 7.130000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.230000000000000e+02 2.178773237164017e-01 -9.097166809446092e-01 1.754390527850335e-01 -3.068650696628613e-01 1.870000000000000e-10 2.210000000000000e-11 -3.870000000000000e-11 4.510000000000000e-11 1.720000000000000e-11 3.080000000000000e-11 -1.780000000000000e-11 1.660000000000000e-10 -2.360000000000000e-11 7.130000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.240000000000000e+02 2.178368226343742e-01 -9.097463176637610e-01 1.755183685476988e-01 -3.067605882510685e-01 1.870000000000000e-10 2.210000000000000e-11 -3.870000000000000e-11 4.510000000000000e-11 1.720000000000000e-11 3.080000000000000e-11 -1.780000000000000e-11 1.660000000000000e-10 -2.360000000000000e-11 7.130000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.250000000000000e+02 2.177963231189962e-01 -9.097759307943918e-01 1.755976770879213e-01 -3.066561155176429e-01 1.870000000000000e-10 2.210000000000000e-11 -3.880000000000000e-11 4.510000000000000e-11 1.720000000000000e-11 3.080000000000000e-11 -1.780000000000000e-11 1.660000000000000e-10 -2.360000000000000e-11 7.130000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.260000000000000e+02 2.177558251307198e-01 -9.098055204182185e-01 1.756769789070850e-01 -3.065516509827569e-01 1.870000000000000e-10 2.200000000000000e-11 -3.880000000000000e-11 4.510000000000000e-11 1.720000000000000e-11 3.080000000000000e-11 -1.780000000000000e-11 1.660000000000000e-10 -2.360000000000000e-11 7.130000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.270000000000000e+02 2.177153286656720e-01 -9.098350866066860e-01 1.757562744619077e-01 -3.064471941961178e-01 1.870000000000000e-10 2.200000000000000e-11 -3.880000000000000e-11 4.520000000000000e-11 1.720000000000000e-11 3.080000000000000e-11 -1.780000000000000e-11 1.660000000000000e-10 -2.360000000000000e-11 7.130000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.280000000000000e+02 2.176748337540152e-01 -9.098646294228609e-01 1.758355641603455e-01 -3.063427447350024e-01 1.870000000000000e-10 2.200000000000000e-11 -3.890000000000000e-11 4.520000000000000e-11 1.720000000000000e-11 3.080000000000000e-11 -1.770000000000000e-11 1.660000000000000e-10 -2.360000000000000e-11 7.130000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.290000000000000e+02 2.176343404588909e-01 -9.098941489235323e-01 1.759148483573692e-01 -3.062383022013221e-01 1.870000000000000e-10 2.200000000000000e-11 -3.890000000000000e-11 4.520000000000000e-11 1.720000000000000e-11 3.080000000000000e-11 -1.770000000000000e-11 1.660000000000000e-10 -2.360000000000000e-11 7.130000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.300000000000000e+02 2.175938488729382e-01 -9.099236451620892e-01 1.759941273504324e-01 -3.061338662182886e-01 1.870000000000000e-10 2.200000000000000e-11 -3.890000000000000e-11 4.520000000000000e-11 1.720000000000000e-11 3.070000000000000e-11 -1.770000000000000e-11 1.660000000000000e-10 -2.360000000000000e-11 7.130000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.310000000000000e+02 2.175533966719647e-01 -9.099531058191375e-01 1.760734032673062e-01 -3.060294454271762e-01 1.870000000000000e-10 2.200000000000000e-11 -3.900000000000000e-11 4.520000000000000e-11 1.720000000000000e-11 3.070000000000000e-11 -1.770000000000000e-11 1.660000000000000e-10 -2.360000000000000e-11 7.120000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.320000000000000e+02 2.175129088728016e-01 -9.099825556956482e-01 1.761526725121108e-01 -3.059250214842686e-01 1.870000000000000e-10 2.200000000000000e-11 -3.900000000000000e-11 4.520000000000000e-11 1.720000000000000e-11 3.070000000000000e-11 -1.770000000000000e-11 1.660000000000000e-10 -2.360000000000000e-11 7.120000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.330000000000000e+02 2.174724231825521e-01 -9.100119824784821e-01 1.762319370846305e-01 -3.058206030536382e-01 1.870000000000000e-10 2.200000000000000e-11 -3.900000000000000e-11 4.530000000000000e-11 1.710000000000000e-11 3.070000000000000e-11 -1.770000000000000e-11 1.660000000000000e-10 -2.360000000000000e-11 7.120000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.340000000000000e+02 2.174319397503923e-01 -9.100413862326702e-01 1.763111970366545e-01 -3.057161898225277e-01 1.870000000000000e-10 2.200000000000000e-11 -3.900000000000000e-11 4.530000000000000e-11 1.710000000000000e-11 3.070000000000000e-11 -1.770000000000000e-11 1.660000000000000e-10 -2.360000000000000e-11 7.120000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.350000000000000e+02 2.173914587176851e-01 -9.100707670286665e-01 1.763904523557502e-01 -3.056117815042242e-01 1.870000000000000e-10 2.190000000000000e-11 -3.910000000000000e-11 4.530000000000000e-11 1.710000000000000e-11 3.070000000000000e-11 -1.770000000000000e-11 1.660000000000000e-10 -2.360000000000000e-11 7.120000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.360000000000000e+02 2.173509802071697e-01 -9.101001249426995e-01 1.764697029672214e-01 -3.055073778436879e-01 1.870000000000000e-10 2.190000000000000e-11 -3.910000000000000e-11 4.530000000000000e-11 1.710000000000000e-11 3.070000000000000e-11 -1.760000000000000e-11 1.660000000000000e-10 -2.360000000000000e-11 7.120000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.370000000000000e+02 2.173105043112678e-01 -9.101294600568106e-01 1.765489487366417e-01 -3.054029786244194e-01 1.870000000000000e-10 2.190000000000000e-11 -3.910000000000000e-11 4.530000000000000e-11 1.710000000000000e-11 3.070000000000000e-11 -1.760000000000000e-11 1.660000000000000e-10 -2.360000000000000e-11 7.120000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.380000000000000e+02 2.172700310835878e-01 -9.101587724578684e-01 1.766281894741904e-01 -3.052985836750521e-01 1.870000000000000e-10 2.190000000000000e-11 -3.920000000000000e-11 4.540000000000000e-11 1.710000000000000e-11 3.070000000000000e-11 -1.760000000000000e-11 1.660000000000000e-10 -2.360000000000000e-11 7.120000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.390000000000000e+02 2.172295605350784e-01 -9.101880622354965e-01 1.767074249416822e-01 -3.051941928743213e-01 1.870000000000000e-10 2.190000000000000e-11 -3.920000000000000e-11 4.540000000000000e-11 1.710000000000000e-11 3.070000000000000e-11 -1.760000000000000e-11 1.650000000000000e-10 -2.360000000000000e-11 7.120000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.400000000000000e+02 2.171890926344787e-01 -9.102173294799029e-01 1.767866548619069e-01 -3.050898061519315e-01 1.870000000000000e-10 2.190000000000000e-11 -3.920000000000000e-11 4.540000000000000e-11 1.710000000000000e-11 3.070000000000000e-11 -1.760000000000000e-11 1.650000000000000e-10 -2.360000000000000e-11 7.120000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.410000000000000e+02 2.171486606655229e-01 -9.102465632994049e-01 1.768658806530744e-01 -3.049854315104322e-01 1.870000000000000e-10 2.190000000000000e-11 -3.930000000000000e-11 4.540000000000000e-11 1.710000000000000e-11 3.070000000000000e-11 -1.760000000000000e-11 1.650000000000000e-10 -2.360000000000000e-11 7.110000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>3.420000000000000e+02 2.171081978263163e-01 -9.102757857396032e-01 1.769450985583689e-01 -3.048810529188828e-01 1.870000000000000e-10 2.190000000000000e-11 -3.930000000000000e-11 4.540000000000000e-11 1.710000000000000e-11 3.070000000000000e-11 -1.760000000000000e-11 1.650000000000000e-10 -2.360000000000000e-11 7.110000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>3.430000000000000e+02 2.170677373541053e-01 -9.103049858956359e-01 1.770243099838546e-01 -3.047766784520353e-01 1.870000000000000e-10 2.180000000000000e-11 -3.930000000000000e-11 4.540000000000000e-11 1.710000000000000e-11 3.070000000000000e-11 -1.760000000000000e-11 1.650000000000000e-10 -2.360000000000000e-11 7.110000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>3.440000000000000e+02 2.170272791317583e-01 -9.103341638353911e-01 1.771035146327541e-01 -3.046723081796432e-01 1.870000000000000e-10 2.180000000000000e-11 -3.930000000000000e-11 4.550000000000000e-11 1.700000000000000e-11 3.070000000000000e-11 -1.760000000000000e-11 1.650000000000000e-10 -2.360000000000000e-11 7.110000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>3.450000000000000e+02 2.169868230526116e-01 -9.103633196162755e-01 1.771827122376346e-01 -3.045679421785643e-01 1.870000000000000e-10 2.180000000000000e-11 -3.930000000000000e-11 4.550000000000000e-11 1.700000000000000e-11 3.070000000000000e-11 -1.750000000000000e-11 1.650000000000000e-10 -2.360000000000000e-11 7.110000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>3.460000000000000e+02 2.169463690312184e-01 -9.103924532858891e-01 1.772619025696176e-01 -3.044635805177204e-01 1.880000000000000e-10 2.180000000000000e-11 -3.940000000000000e-11 4.550000000000000e-11 1.700000000000000e-11 3.060000000000000e-11 -1.750000000000000e-11 1.650000000000000e-10 -2.360000000000000e-11 7.110000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>3.470000000000000e+02 2.169059170093831e-01 -9.104215648840243e-01 1.773410854442297e-01 -3.043592232443528e-01 1.880000000000000e-10 2.180000000000000e-11 -3.940000000000000e-11 4.550000000000000e-11 1.700000000000000e-11 3.060000000000000e-11 -1.750000000000000e-11 1.650000000000000e-10 -2.360000000000000e-11 7.110000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>3.480000000000000e+02 2.168654669575414e-01 -9.104506544465453e-01 1.774202607228874e-01 -3.042548703704966e-01 1.880000000000000e-10 2.180000000000000e-11 -3.940000000000000e-11 4.550000000000000e-11 1.700000000000000e-11 3.060000000000000e-11 -1.750000000000000e-11 1.650000000000000e-10 -2.360000000000000e-11 7.110000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>3.490000000000000e+02 2.168250188731149e-01 -9.104797220095192e-01 1.774994283088090e-01 -3.041505218640737e-01 1.880000000000000e-10 2.180000000000000e-11 -3.950000000000000e-11 4.550000000000000e-11 1.700000000000000e-11 3.060000000000000e-11 -1.750000000000000e-11 1.650000000000000e-10 -2.360000000000000e-11 7.110000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>3.500000000000000e+02 2.167845727754137e-01 -9.105087676149153e-01 1.775785881401927e-01 -3.040461776393281e-01 1.880000000000000e-10 2.180000000000000e-11 -3.950000000000000e-11 4.560000000000000e-11 1.700000000000000e-11 3.060000000000000e-11 -1.750000000000000e-11 1.650000000000000e-10 -2.360000000000000e-11 7.110000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>3.510000000000000e+02 2.167441623363327e-01 -9.105377802483298e-01 1.776577419629997e-01 -3.039418456780410e-01 1.880000000000000e-10 2.170000000000000e-11 -3.950000000000000e-11 4.560000000000000e-11 1.700000000000000e-11 3.060000000000000e-11 -1.750000000000000e-11 1.650000000000000e-10 -2.360000000000000e-11 7.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.520000000000000e+02 2.167037203130810e-01 -9.105667821183517e-01 1.777368861980951e-01 -3.038375095173496e-01 1.880000000000000e-10 2.170000000000000e-11 -3.960000000000000e-11 4.560000000000000e-11 1.700000000000000e-11 3.060000000000000e-11 -1.750000000000000e-11 1.650000000000000e-10 -2.360000000000000e-11 7.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.530000000000000e+02 2.166632803748638e-01 -9.105957622495946e-01 1.778160226108076e-01 -3.037331770043498e-01 1.880000000000000e-10 2.170000000000000e-11 -3.960000000000000e-11 4.560000000000000e-11 1.700000000000000e-11 3.060000000000000e-11 -1.740000000000000e-11 1.650000000000000e-10 -2.360000000000000e-11 7.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.540000000000000e+02 2.166228425361718e-01 -9.106247207613007e-01 1.778951511862917e-01 -3.036288477967112e-01 1.880000000000000e-10 2.170000000000000e-11 -3.960000000000000e-11 4.560000000000000e-11 1.700000000000000e-11 3.060000000000000e-11 -1.740000000000000e-11 1.650000000000000e-10 -2.360000000000000e-11 7.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.550000000000000e+02 2.165824067891789e-01 -9.106536577995543e-01 1.779742719013193e-01 -3.035245214919119e-01 1.880000000000000e-10 2.170000000000000e-11 -3.960000000000000e-11 4.560000000000000e-11 1.690000000000000e-11 3.060000000000000e-11 -1.740000000000000e-11 1.650000000000000e-10 -2.360000000000000e-11 7.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.560000000000000e+02 2.165419730966231e-01 -9.106825735375957e-01 1.780533847198659e-01 -3.034201976338463e-01 1.880000000000000e-10 2.170000000000000e-11 -3.970000000000000e-11 4.570000000000000e-11 1.690000000000000e-11 3.060000000000000e-11 -1.740000000000000e-11 1.640000000000000e-10 -2.360000000000000e-11 7.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.570000000000000e+02 2.165015413861694e-01 -9.107114681741025e-01 1.781324895933974e-01 -3.033158757217332e-01 1.880000000000000e-10 2.170000000000000e-11 -3.970000000000000e-11 4.570000000000000e-11 1.690000000000000e-11 3.060000000000000e-11 -1.740000000000000e-11 1.640000000000000e-10 -2.360000000000000e-11 7.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.580000000000000e+02 2.164611115460240e-01 -9.107403419302263e-01 1.782115864604446e-01 -3.032115552223004e-01 1.880000000000000e-10 2.170000000000000e-11 -3.970000000000000e-11 4.570000000000000e-11 1.690000000000000e-11 3.060000000000000e-11 -1.740000000000000e-11 1.640000000000000e-10 -2.360000000000000e-11 7.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.590000000000000e+02 2.164206834224635e-01 -9.107691950447356e-01 1.782906752480441e-01 -3.031072355852207e-01 1.880000000000000e-10 2.160000000000000e-11 -3.980000000000000e-11 4.570000000000000e-11 1.690000000000000e-11 3.060000000000000e-11 -1.740000000000000e-11 1.640000000000000e-10 -2.360000000000000e-11 7.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.600000000000000e+02 2.163802568171380e-01 -9.107980277691926e-01 1.783697558741395e-01 -3.030029162580762e-01 1.880000000000000e-10 2.160000000000000e-11 -3.980000000000000e-11 4.570000000000000e-11 1.690000000000000e-11 3.060000000000000e-11 -1.740000000000000e-11 1.640000000000000e-10 -2.360000000000000e-11 7.100000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.610000000000000e+02 2.163398657243938e-01 -9.108268291041610e-01 1.784488301082418e-01 -3.028986050073699e-01 1.880000000000000e-10 2.160000000000000e-11 -3.980000000000000e-11 4.580000000000000e-11 1.690000000000000e-11 3.050000000000000e-11 -1.730000000000000e-11 1.640000000000000e-10 -2.360000000000000e-11 7.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.620000000000000e+02 2.162994413843868e-01 -9.108556218273125e-01 1.785278941399967e-01 -3.027942847154158e-01 1.880000000000000e-10 2.160000000000000e-11 -3.980000000000000e-11 4.580000000000000e-11 1.690000000000000e-11 3.050000000000000e-11 -1.730000000000000e-11 1.640000000000000e-10 -2.360000000000000e-11 7.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.630000000000000e+02 2.162590177066572e-01 -9.108843949370709e-01 1.786069497225553e-01 -3.026899632156351e-01 1.880000000000000e-10 2.160000000000000e-11 -3.990000000000000e-11 4.580000000000000e-11 1.690000000000000e-11 3.050000000000000e-11 -1.730000000000000e-11 1.640000000000000e-10 -2.360000000000000e-11 7.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.640000000000000e+02 2.162185943276806e-01 -9.109131486835732e-01 1.786859967455111e-01 -3.025856400912039e-01 1.880000000000000e-10 2.160000000000000e-11 -3.990000000000000e-11 4.580000000000000e-11 1.690000000000000e-11 3.050000000000000e-11 -1.730000000000000e-11 1.640000000000000e-10 -2.360000000000000e-11 7.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.650000000000000e+02 2.161781708553064e-01 -9.109418833061852e-01 1.787650350869194e-01 -3.024813149842599e-01 1.880000000000000e-10 2.160000000000000e-11 -3.990000000000000e-11 4.580000000000000e-11 1.690000000000000e-11 3.050000000000000e-11 -1.730000000000000e-11 1.640000000000000e-10 -2.360000000000000e-11 7.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.660000000000000e+02 2.161377468757480e-01 -9.109705990315995e-01 1.788440646120605e-01 -3.023769875974714e-01 1.880000000000000e-10 2.160000000000000e-11 -4.000000000000000e-11 4.590000000000000e-11 1.680000000000000e-11 3.050000000000000e-11 -1.730000000000000e-11 1.640000000000000e-10 -2.360000000000000e-11 7.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.670000000000000e+02 2.160973219620285e-01 -9.109992960730345e-01 1.789230851715730e-01 -3.022726576916295e-01 1.880000000000000e-10 2.150000000000000e-11 -4.000000000000000e-11 4.590000000000000e-11 1.680000000000000e-11 3.050000000000000e-11 -1.730000000000000e-11 1.640000000000000e-10 -2.360000000000000e-11 7.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.680000000000000e+02 2.160568956821439e-01 -9.110279746304546e-01 1.790020966013879e-01 -3.021683250793081e-01 1.880000000000000e-10 2.150000000000000e-11 -4.000000000000000e-11 4.590000000000000e-11 1.680000000000000e-11 3.050000000000000e-11 -1.730000000000000e-11 1.640000000000000e-10 -2.360000000000000e-11 7.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.690000000000000e+02 2.160164676062664e-01 -9.110566348916899e-01 1.790810987249911e-01 -3.020639896150996e-01 1.880000000000000e-10 2.150000000000000e-11 -4.000000000000000e-11 4.590000000000000e-11 1.680000000000000e-11 3.050000000000000e-11 -1.730000000000000e-11 1.640000000000000e-10 -2.360000000000000e-11 7.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.700000000000000e+02 2.159760373124623e-01 -9.110852770340511e-01 1.791600913570709e-01 -3.019596511845887e-01 1.880000000000000e-10 2.150000000000000e-11 -4.010000000000000e-11 4.590000000000000e-11 1.680000000000000e-11 3.050000000000000e-11 -1.730000000000000e-11 1.640000000000000e-10 -2.360000000000000e-11 7.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.710000000000000e+02 2.159356380495989e-01 -9.111138901650111e-01 1.792390761847360e-01 -3.018553178874525e-01 1.880000000000000e-10 2.150000000000000e-11 -4.010000000000000e-11 4.590000000000000e-11 1.680000000000000e-11 3.050000000000000e-11 -1.720000000000000e-11 1.640000000000000e-10 -2.360000000000000e-11 7.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.720000000000000e+02 2.158952021105797e-01 -9.111424965682120e-01 1.793180492906146e-01 -3.017509732406616e-01 1.880000000000000e-10 2.150000000000000e-11 -4.010000000000000e-11 4.600000000000000e-11 1.680000000000000e-11 3.050000000000000e-11 -1.720000000000000e-11 1.630000000000000e-10 -2.360000000000000e-11 7.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.730000000000000e+02 2.158547627772681e-01 -9.111710853355596e-01 1.793970123898314e-01 -3.016466253422878e-01 1.880000000000000e-10 2.150000000000000e-11 -4.010000000000000e-11 4.600000000000000e-11 1.680000000000000e-11 3.050000000000000e-11 -1.720000000000000e-11 1.630000000000000e-10 -2.360000000000000e-11 7.090000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.740000000000000e+02 2.158143196918478e-01 -9.111996566144281e-01 1.794759653604341e-01 -3.015422740838064e-01 1.880000000000000e-10 2.150000000000000e-11 -4.020000000000000e-11 4.600000000000000e-11 1.680000000000000e-11 3.050000000000000e-11 -1.720000000000000e-11 1.630000000000000e-10 -2.360000000000000e-11 7.080000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.750000000000000e+02 2.157738725147198e-01 -9.112282105444959e-01 1.795549081224838e-01 -3.014379193416178e-01 1.880000000000000e-10 2.150000000000000e-11 -4.020000000000000e-11 4.600000000000000e-11 1.680000000000000e-11 3.050000000000000e-11 -1.720000000000000e-11 1.630000000000000e-10 -2.360000000000000e-11 7.080000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.760000000000000e+02 2.157334209235156e-01 -9.112567472567632e-01 1.796338406446092e-01 -3.013335609767496e-01 1.880000000000000e-10 2.140000000000000e-11 -4.020000000000000e-11 4.600000000000000e-11 1.680000000000000e-11 3.050000000000000e-11 -1.720000000000000e-11 1.630000000000000e-10 -2.360000000000000e-11 7.080000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.770000000000000e+02 2.156929646123120e-01 -9.112852668716376e-01 1.797127629480714e-01 -3.012291988387091e-01 1.880000000000000e-10 2.140000000000000e-11 -4.030000000000000e-11 4.600000000000000e-11 1.670000000000000e-11 3.050000000000000e-11 -1.720000000000000e-11 1.630000000000000e-10 -2.360000000000000e-11 7.080000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.780000000000000e+02 2.156525032910667e-01 -9.113137694972642e-01 1.797916751044323e-01 -3.011248327722675e-01 1.880000000000000e-10 2.140000000000000e-11 -4.030000000000000e-11 4.610000000000000e-11 1.670000000000000e-11 3.050000000000000e-11 -1.720000000000000e-11 1.630000000000000e-10 -2.360000000000000e-11 7.080000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.790000000000000e+02 2.156120366850946e-01 -9.113422552281745e-01 1.798705772268759e-01 -3.010204626270460e-01 1.880000000000000e-10 2.140000000000000e-11 -4.030000000000000e-11 4.610000000000000e-11 1.670000000000000e-11 3.040000000000000e-11 -1.710000000000000e-11 1.630000000000000e-10 -2.360000000000000e-11 7.080000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.800000000000000e+02 2.155715645344290e-01 -9.113707241439025e-01 1.799494694590829e-01 -3.009160882687926e-01 1.880000000000000e-10 2.140000000000000e-11 -4.030000000000000e-11 4.610000000000000e-11 1.670000000000000e-11 3.040000000000000e-11 -1.710000000000000e-11 1.630000000000000e-10 -2.360000000000000e-11 7.080000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.810000000000000e+02 2.155311215691209e-01 -9.113991648209151e-01 1.800283539534974e-01 -3.008117181422452e-01 1.880000000000000e-10 2.140000000000000e-11 -4.040000000000000e-11 4.610000000000000e-11 1.670000000000000e-11 3.040000000000000e-11 -1.710000000000000e-11 1.630000000000000e-10 -2.360000000000000e-11 7.080000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.820000000000000e+02 2.154906376138305e-01 -9.114276002814898e-01 1.801072268887756e-01 -3.007073350757256e-01 1.880000000000000e-10 2.140000000000000e-11 -4.040000000000000e-11 4.610000000000000e-11 1.670000000000000e-11 3.040000000000000e-11 -1.710000000000000e-11 1.630000000000000e-10 -2.360000000000000e-11 7.080000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.830000000000000e+02 2.154501474373766e-01 -9.114560190687157e-01 1.801860903999001e-01 -3.006029475887106e-01 1.880000000000000e-10 2.130000000000000e-11 -4.040000000000000e-11 4.610000000000000e-11 1.670000000000000e-11 3.040000000000000e-11 -1.710000000000000e-11 1.630000000000000e-10 -2.360000000000000e-11 7.080000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.840000000000000e+02 2.154096508568382e-01 -9.114844211964777e-01 1.802649446058164e-01 -3.004985557038822e-01 1.890000000000000e-10 2.130000000000000e-11 -4.040000000000000e-11 4.620000000000000e-11 1.670000000000000e-11 3.040000000000000e-11 -1.710000000000000e-11 1.630000000000000e-10 -2.360000000000000e-11 7.080000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.850000000000000e+02 2.153691477199001e-01 -9.115128066605271e-01 1.803437895901500e-01 -3.003941594980102e-01 1.890000000000000e-10 2.130000000000000e-11 -4.050000000000000e-11 4.620000000000000e-11 1.670000000000000e-11 3.040000000000000e-11 -1.710000000000000e-11 1.630000000000000e-10 -2.360000000000000e-11 7.080000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.860000000000000e+02 2.153286379102649e-01 -9.115411754382022e-01 1.804226253974313e-01 -3.002897591013535e-01 1.890000000000000e-10 2.130000000000000e-11 -4.050000000000000e-11 4.620000000000000e-11 1.670000000000000e-11 3.040000000000000e-11 -1.710000000000000e-11 1.630000000000000e-10 -2.360000000000000e-11 7.070000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.870000000000000e+02 2.152881213546416e-01 -9.115695274870989e-01 1.805014520345464e-01 -3.001853546959891e-01 1.890000000000000e-10 2.130000000000000e-11 -4.050000000000000e-11 4.620000000000000e-11 1.670000000000000e-11 3.040000000000000e-11 -1.710000000000000e-11 1.630000000000000e-10 -2.360000000000000e-11 7.070000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.880000000000000e+02 2.152475980285121e-01 -9.115978627440556e-01 1.805802694758064e-01 -3.000809465118889e-01 1.890000000000000e-10 2.130000000000000e-11 -4.060000000000000e-11 4.620000000000000e-11 1.670000000000000e-11 3.040000000000000e-11 -1.700000000000000e-11 1.630000000000000e-10 -2.360000000000000e-11 7.070000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.890000000000000e+02 2.152070679610745e-01 -9.116261811245339e-01 1.806590776710576e-01 -2.999765348205404e-01 1.890000000000000e-10 2.130000000000000e-11 -4.060000000000000e-11 4.620000000000000e-11 1.670000000000000e-11 3.040000000000000e-11 -1.700000000000000e-11 1.630000000000000e-10 -2.360000000000000e-11 7.070000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.900000000000000e+02 2.151665312374387e-01 -9.116544825223736e-01 1.807378765548228e-01 -2.998721199287543e-01 1.890000000000000e-10 2.130000000000000e-11 -4.060000000000000e-11 4.630000000000000e-11 1.660000000000000e-11 3.040000000000000e-11 -1.700000000000000e-11 1.630000000000000e-10 -2.360000000000000e-11 7.070000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.910000000000000e+02 2.151260187495662e-01 -9.116827567161417e-01 1.808166678498101e-01 -2.997677097205587e-01 1.890000000000000e-10 2.120000000000000e-11 -4.070000000000000e-11 4.630000000000000e-11 1.660000000000000e-11 3.040000000000000e-11 -1.700000000000000e-11 1.620000000000000e-10 -2.360000000000000e-11 7.070000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.920000000000000e+02 2.150854691915414e-01 -9.117110237475623e-01 1.808954479074705e-01 -2.996632894536504e-01 1.890000000000000e-10 2.120000000000000e-11 -4.070000000000000e-11 4.630000000000000e-11 1.660000000000000e-11 3.040000000000000e-11 -1.700000000000000e-11 1.620000000000000e-10 -2.360000000000000e-11 7.070000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.930000000000000e+02 2.150449135563752e-01 -9.117392733555317e-01 1.809742184660836e-01 -2.995588670449406e-01 1.890000000000000e-10 2.120000000000000e-11 -4.070000000000000e-11 4.630000000000000e-11 1.660000000000000e-11 3.040000000000000e-11 -1.700000000000000e-11 1.620000000000000e-10 -2.360000000000000e-11 7.070000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.940000000000000e+02 2.150043521262560e-01 -9.117675053600933e-01 1.810529794902979e-01 -2.994544428688393e-01 1.890000000000000e-10 2.120000000000000e-11 -4.070000000000000e-11 4.630000000000000e-11 1.660000000000000e-11 3.040000000000000e-11 -1.700000000000000e-11 1.620000000000000e-10 -2.360000000000000e-11 7.070000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.950000000000000e+02 2.149637852159065e-01 -9.117957195701204e-01 1.811317309641906e-01 -2.993500172994351e-01 1.890000000000000e-10 2.120000000000000e-11 -4.070000000000000e-11 4.630000000000000e-11 1.660000000000000e-11 3.040000000000000e-11 -1.700000000000000e-11 1.620000000000000e-10 -2.360000000000000e-11 7.070000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.960000000000000e+02 2.149232131630979e-01 -9.118239157873579e-01 1.812104728913868e-01 -2.992455907049240e-01 1.890000000000000e-10 2.120000000000000e-11 -4.080000000000000e-11 4.640000000000000e-11 1.660000000000000e-11 3.030000000000000e-11 -1.690000000000000e-11 1.620000000000000e-10 -2.360000000000000e-11 7.070000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>3.970000000000000e+02 2.148826363201363e-01 -9.118520938105252e-01 1.812892052935981e-01 -2.991411634420865e-01 1.890000000000000e-10 2.120000000000000e-11 -4.080000000000000e-11 4.640000000000000e-11 1.660000000000000e-11 3.030000000000000e-11 -1.690000000000000e-11 1.620000000000000e-10 -2.360000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.980000000000000e+02 2.148420550464780e-01 -9.118802534387060e-01 1.813679282067696e-01 -2.990367358535599e-01 1.890000000000000e-10 2.120000000000000e-11 -4.080000000000000e-11 4.640000000000000e-11 1.660000000000000e-11 3.030000000000000e-11 -1.690000000000000e-11 1.620000000000000e-10 -2.360000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>3.990000000000000e+02 2.148014697031842e-01 -9.119083944746404e-01 1.814466416737507e-01 -2.989323082661913e-01 1.890000000000000e-10 2.120000000000000e-11 -4.080000000000000e-11 4.640000000000000e-11 1.660000000000000e-11 3.030000000000000e-11 -1.690000000000000e-11 1.620000000000000e-10 -2.360000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.000000000000000e+02 2.147608806477787e-01 -9.119365167268884e-01 1.815253457376655e-01 -2.988278809921210e-01 1.890000000000000e-10 2.110000000000000e-11 -4.090000000000000e-11 4.640000000000000e-11 1.660000000000000e-11 3.030000000000000e-11 -1.690000000000000e-11 1.620000000000000e-10 -2.360000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.010000000000000e+02 2.147203302451869e-01 -9.119646062283709e-01 1.816040429404275e-01 -2.987234646856888e-01 1.890000000000000e-10 2.110000000000000e-11 -4.090000000000000e-11 4.650000000000000e-11 1.650000000000000e-11 3.030000000000000e-11 -1.690000000000000e-11 1.620000000000000e-10 -2.360000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.020000000000000e+02 2.146797348145186e-01 -9.119926903687600e-01 1.816827282959747e-01 -2.986190389322995e-01 1.890000000000000e-10 2.110000000000000e-11 -4.090000000000000e-11 4.650000000000000e-11 1.650000000000000e-11 3.030000000000000e-11 -1.690000000000000e-11 1.620000000000000e-10 -2.360000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.030000000000000e+02 2.146391367041284e-01 -9.120207551949994e-01 1.817614043081148e-01 -2.985146143698695e-01 1.890000000000000e-10 2.110000000000000e-11 -4.100000000000000e-11 4.650000000000000e-11 1.650000000000000e-11 3.030000000000000e-11 -1.690000000000000e-11 1.620000000000000e-10 -2.360000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.040000000000000e+02 2.145985362382892e-01 -9.120488005454360e-01 1.818400709540139e-01 -2.984101912861803e-01 1.890000000000000e-10 2.110000000000000e-11 -4.100000000000000e-11 4.650000000000000e-11 1.650000000000000e-11 3.030000000000000e-11 -1.690000000000000e-11 1.620000000000000e-10 -2.360000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.050000000000000e+02 2.145579337306491e-01 -9.120768262650355e-01 1.819187281837091e-01 -2.983057699736238e-01 1.890000000000000e-10 2.110000000000000e-11 -4.100000000000000e-11 4.650000000000000e-11 1.650000000000000e-11 3.030000000000000e-11 -1.690000000000000e-11 1.620000000000000e-10 -2.360000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.060000000000000e+02 2.145173294825937e-01 -9.121048322050187e-01 1.819973759219210e-01 -2.982013507304190e-01 1.890000000000000e-10 2.110000000000000e-11 -4.100000000000000e-11 4.650000000000000e-11 1.650000000000000e-11 3.030000000000000e-11 -1.680000000000000e-11 1.620000000000000e-10 -2.360000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.070000000000000e+02 2.144767237804532e-01 -9.121328182233250e-01 1.820760140733436e-01 -2.980969338580012e-01 1.890000000000000e-10 2.110000000000000e-11 -4.110000000000000e-11 4.660000000000000e-11 1.650000000000000e-11 3.030000000000000e-11 -1.680000000000000e-11 1.620000000000000e-10 -2.360000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.080000000000000e+02 2.144361168934635e-01 -9.121607841846419e-01 1.821546425288389e-01 -2.979925196586369e-01 1.890000000000000e-10 2.100000000000000e-11 -4.110000000000000e-11 4.660000000000000e-11 1.650000000000000e-11 3.030000000000000e-11 -1.680000000000000e-11 1.610000000000000e-10 -2.360000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.090000000000000e+02 2.143955090710365e-01 -9.121887299613245e-01 1.822332611745966e-01 -2.978881084289678e-01 1.890000000000000e-10 2.100000000000000e-11 -4.110000000000000e-11 4.660000000000000e-11 1.650000000000000e-11 3.030000000000000e-11 -1.680000000000000e-11 1.610000000000000e-10 -2.360000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.100000000000000e+02 2.143549005399750e-01 -9.122166554343584e-01 1.823118699007181e-01 -2.977837004537935e-01 1.890000000000000e-10 2.100000000000000e-11 -4.110000000000000e-11 4.660000000000000e-11 1.650000000000000e-11 3.030000000000000e-11 -1.680000000000000e-11 1.610000000000000e-10 -2.360000000000000e-11 7.059999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>4.110000000000000e+02 2.143143221097160e-01 -9.122445504590905e-01 1.823904704764568e-01 -2.976793035730264e-01 1.890000000000000e-10 2.100000000000000e-11 -4.120000000000000e-11 4.660000000000000e-11 1.650000000000000e-11 3.030000000000000e-11 -1.680000000000000e-11 1.610000000000000e-10 -2.360000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.120000000000000e+02 2.142737127420025e-01 -9.122724350067698e-01 1.824690590942859e-01 -2.975749028863535e-01 1.890000000000000e-10 2.100000000000000e-11 -4.120000000000000e-11 4.660000000000000e-11 1.650000000000000e-11 3.030000000000000e-11 -1.680000000000000e-11 1.610000000000000e-10 -2.360000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.130000000000000e+02 2.142331031928296e-01 -9.123002989525865e-01 1.825476375633389e-01 -2.974705061807574e-01 1.890000000000000e-10 2.100000000000000e-11 -4.120000000000000e-11 4.660000000000000e-11 1.650000000000000e-11 3.030000000000000e-11 -1.680000000000000e-11 1.610000000000000e-10 -2.360000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.140000000000000e+02 2.141924935847028e-01 -9.123281422180822e-01 1.826262058504056e-01 -2.973661136470582e-01 1.890000000000000e-10 2.100000000000000e-11 -4.120000000000000e-11 4.670000000000000e-11 1.640000000000000e-11 3.030000000000000e-11 -1.680000000000000e-11 1.610000000000000e-10 -2.360000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.150000000000000e+02 2.141518840163105e-01 -9.123559647346818e-01 1.827047639405996e-01 -2.972617254520376e-01 1.890000000000000e-10 2.100000000000000e-11 -4.130000000000000e-11 4.670000000000000e-11 1.640000000000000e-11 3.030000000000000e-11 -1.670000000000000e-11 1.610000000000000e-10 -2.360000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.160000000000000e+02 2.141112745661899e-01 -9.123837664432296e-01 1.827833118314676e-01 -2.971573417407493e-01 1.890000000000000e-10 2.090000000000000e-11 -4.130000000000000e-11 4.670000000000000e-11 1.640000000000000e-11 3.030000000000000e-11 -1.670000000000000e-11 1.610000000000000e-10 -2.360000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.170000000000000e+02 2.140706652949507e-01 -9.124115472937915e-01 1.828618495267000e-01 -2.970529626393271e-01 1.890000000000000e-10 2.090000000000000e-11 -4.130000000000000e-11 4.670000000000000e-11 1.640000000000000e-11 3.020000000000000e-11 -1.670000000000000e-11 1.610000000000000e-10 -2.360000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.180000000000000e+02 2.140300562481309e-01 -9.124393072459083e-01 1.829403770307945e-01 -2.969485882553741e-01 1.890000000000000e-10 2.090000000000000e-11 -4.140000000000000e-11 4.670000000000000e-11 1.640000000000000e-11 3.020000000000000e-11 -1.670000000000000e-11 1.610000000000000e-10 -2.360000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.190000000000000e+02 2.139894474579803e-01 -9.124670462689096e-01 1.830188943447575e-01 -2.968442186783208e-01 1.890000000000000e-10 2.090000000000000e-11 -4.140000000000000e-11 4.670000000000000e-11 1.640000000000000e-11 3.020000000000000e-11 -1.670000000000000e-11 1.610000000000000e-10 -2.360000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.200000000000000e+02 2.139488389421184e-01 -9.124947643435051e-01 1.830974014655919e-01 -2.967398539757658e-01 1.890000000000000e-10 2.090000000000000e-11 -4.140000000000000e-11 4.680000000000000e-11 1.640000000000000e-11 3.020000000000000e-11 -1.670000000000000e-11 1.610000000000000e-10 -2.360000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.210000000000000e+02 2.139082628463446e-01 -9.125224509300776e-01 1.831759003937811e-01 -2.966355021732076e-01 1.890000000000000e-10 2.090000000000000e-11 -4.140000000000000e-11 4.680000000000000e-11 1.640000000000000e-11 3.020000000000000e-11 -1.670000000000000e-11 1.610000000000000e-10 -2.360000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.220000000000000e+02 2.138676548603585e-01 -9.125501271042262e-01 1.832543871298031e-01 -2.965311473087975e-01 1.890000000000000e-10 2.090000000000000e-11 -4.150000000000000e-11 4.680000000000000e-11 1.640000000000000e-11 3.020000000000000e-11 -1.670000000000000e-11 1.610000000000000e-10 -2.360000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.230000000000000e+02 2.138270470784839e-01 -9.125777823561128e-01 1.833328636960949e-01 -2.964267973322997e-01 1.900000000000000e-10 2.090000000000000e-11 -4.150000000000000e-11 4.680000000000000e-11 1.640000000000000e-11 3.020000000000000e-11 -1.670000000000000e-11 1.610000000000000e-10 -2.360000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.240000000000000e+02 2.137864394134291e-01 -9.126054167272981e-01 1.834113301416488e-01 -2.963224521675566e-01 1.900000000000000e-10 2.090000000000000e-11 -4.150000000000000e-11 4.680000000000000e-11 1.640000000000000e-11 3.020000000000000e-11 -1.670000000000000e-11 1.610000000000000e-10 -2.360000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.250000000000000e+02 2.137458317362290e-01 -9.126330302757859e-01 1.834897865522606e-01 -2.962181116947953e-01 1.900000000000000e-10 2.080000000000000e-11 -4.150000000000000e-11 4.680000000000000e-11 1.640000000000000e-11 3.020000000000000e-11 -1.660000000000000e-11 1.610000000000000e-10 -2.360000000000000e-11 7.050000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.260000000000000e+02 2.137052238726536e-01 -9.126606230744346e-01 1.835682330571135e-01 -2.961137757538698e-01 1.900000000000000e-10 2.080000000000000e-11 -4.160000000000000e-11 4.690000000000000e-11 1.630000000000000e-11 3.020000000000000e-11 -1.660000000000000e-11 1.600000000000000e-10 -2.360000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.270000000000000e+02 2.136646156019474e-01 -9.126881952085992e-01 1.836466698324114e-01 -2.960094441500256e-01 1.900000000000000e-10 2.080000000000000e-11 -4.160000000000000e-11 4.690000000000000e-11 1.630000000000000e-11 3.020000000000000e-11 -1.660000000000000e-11 1.600000000000000e-10 -2.360000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.280000000000000e+02 2.136240066622251e-01 -9.127157467725725e-01 1.837250970988370e-01 -2.959051166623953e-01 1.900000000000000e-10 2.080000000000000e-11 -4.160000000000000e-11 4.690000000000000e-11 1.630000000000000e-11 3.020000000000000e-11 -1.660000000000000e-11 1.600000000000000e-10 -2.360000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.290000000000000e+02 2.135833967615262e-01 -9.127432778647369e-01 1.838035151124351e-01 -2.958007930565046e-01 1.900000000000000e-10 2.080000000000000e-11 -4.160000000000000e-11 4.690000000000000e-11 1.630000000000000e-11 3.020000000000000e-11 -1.660000000000000e-11 1.600000000000000e-10 -2.360000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.300000000000000e+02 2.135427855917116e-01 -9.127707885836752e-01 1.838819241530242e-01 -2.956964730933555e-01 1.900000000000000e-10 2.080000000000000e-11 -4.160000000000000e-11 4.690000000000000e-11 1.630000000000000e-11 3.020000000000000e-11 -1.660000000000000e-11 1.600000000000000e-10 -2.360000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.310000000000000e+02 2.135022062382492e-01 -9.127982680886525e-01 1.839603266345856e-01 -2.955921648661431e-01 1.900000000000000e-10 2.080000000000000e-11 -4.170000000000000e-11 4.690000000000000e-11 1.630000000000000e-11 3.020000000000000e-11 -1.660000000000000e-11 1.600000000000000e-10 -2.360000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.320000000000000e+02 2.134615916348458e-01 -9.128257383379647e-01 1.840387185905960e-01 -2.954878514998542e-01 1.900000000000000e-10 2.080000000000000e-11 -4.170000000000000e-11 4.700000000000000e-11 1.630000000000000e-11 3.020000000000000e-11 -1.660000000000000e-11 1.600000000000000e-10 -2.360000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.330000000000000e+02 2.134209749310924e-01 -9.128531884757674e-01 1.841171024015930e-01 -2.953835410992435e-01 1.900000000000000e-10 2.070000000000000e-11 -4.170000000000000e-11 4.700000000000000e-11 1.630000000000000e-11 3.020000000000000e-11 -1.660000000000000e-11 1.600000000000000e-10 -2.360000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.340000000000000e+02 2.133803559420676e-01 -9.128806185721233e-01 1.841954782915670e-01 -2.952792334559864e-01 1.900000000000000e-10 2.070000000000000e-11 -4.180000000000000e-11 4.700000000000000e-11 1.630000000000000e-11 3.020000000000000e-11 -1.650000000000000e-11 1.600000000000000e-10 -2.360000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.350000000000000e+02 2.133397345538799e-01 -9.129080286876924e-01 1.842738464420637e-01 -2.951749283653315e-01 1.900000000000000e-10 2.070000000000000e-11 -4.180000000000000e-11 4.700000000000000e-11 1.630000000000000e-11 3.020000000000000e-11 -1.650000000000000e-11 1.600000000000000e-10 -2.360000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.360000000000000e+02 2.132991107299178e-01 -9.129354188747623e-01 1.843522069909684e-01 -2.950706256192706e-01 1.900000000000000e-10 2.070000000000000e-11 -4.180000000000000e-11 4.700000000000000e-11 1.630000000000000e-11 3.020000000000000e-11 -1.650000000000000e-11 1.600000000000000e-10 -2.360000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.370000000000000e+02 2.132584845118135e-01 -9.129627891785964e-01 1.844305600352059e-01 -2.949663250000966e-01 1.900000000000000e-10 2.070000000000000e-11 -4.180000000000000e-11 4.700000000000000e-11 1.630000000000000e-11 3.020000000000000e-11 -1.650000000000000e-11 1.600000000000000e-10 -2.360000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.380000000000000e+02 2.132178560129392e-01 -9.129901396383477e-01 1.845089056387653e-01 -2.948620262773445e-01 1.900000000000000e-10 2.070000000000000e-11 -4.190000000000000e-11 4.710000000000000e-11 1.630000000000000e-11 3.020000000000000e-11 -1.650000000000000e-11 1.600000000000000e-10 -2.360000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.390000000000000e+02 2.131772254078527e-01 -9.130174702876632e-01 1.845872438423668e-01 -2.947577292075723e-01 1.900000000000000e-10 2.070000000000000e-11 -4.190000000000000e-11 4.710000000000000e-11 1.620000000000000e-11 3.020000000000000e-11 -1.650000000000000e-11 1.600000000000000e-10 -2.360000000000000e-11 7.040000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.400000000000000e+02 2.131365929167681e-01 -9.130447811546988e-01 1.846655746735108e-01 -2.946534335393058e-01 1.900000000000000e-10 2.070000000000000e-11 -4.190000000000000e-11 4.710000000000000e-11 1.620000000000000e-11 3.020000000000000e-11 -1.650000000000000e-11 1.600000000000000e-10 -2.360000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>4.410000000000000e+02 2.130959958218327e-01 -9.130720601406312e-01 1.847439005630707e-01 -2.945491482927547e-01 1.900000000000000e-10 2.060000000000000e-11 -4.190000000000000e-11 4.710000000000000e-11 1.620000000000000e-11 3.010000000000000e-11 -1.650000000000000e-11 1.600000000000000e-10 -2.360000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>4.420000000000000e+02 2.130553603175974e-01 -9.130993315050986e-01 1.848222167248805e-01 -2.944448546838311e-01 1.900000000000000e-10 2.060000000000000e-11 -4.200000000000000e-11 4.710000000000000e-11 1.620000000000000e-11 3.010000000000000e-11 -1.650000000000000e-11 1.600000000000000e-10 -2.360000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>4.430000000000000e+02 2.130147236906870e-01 -9.131265831330676e-01 1.849005255909141e-01 -2.943405617697176e-01 1.900000000000000e-10 2.060000000000000e-11 -4.200000000000000e-11 4.710000000000000e-11 1.620000000000000e-11 3.010000000000000e-11 -1.650000000000000e-11 1.600000000000000e-10 -2.360000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>4.440000000000000e+02 2.129740861774179e-01 -9.131538150247405e-01 1.849788271854042e-01 -2.942362693750867e-01 1.900000000000000e-10 2.060000000000000e-11 -4.200000000000000e-11 4.710000000000000e-11 1.620000000000000e-11 3.010000000000000e-11 -1.640000000000000e-11 1.600000000000000e-10 -2.360000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>4.450000000000000e+02 2.129334479887373e-01 -9.131810271719604e-01 1.850571215193142e-01 -2.941319773771240e-01 1.900000000000000e-10 2.060000000000000e-11 -4.200000000000000e-11 4.720000000000000e-11 1.620000000000000e-11 3.010000000000000e-11 -1.640000000000000e-11 1.600000000000000e-10 -2.360000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>4.460000000000000e+02 2.128928093062224e-01 -9.132082195591096e-01 1.851354085787164e-01 -2.940276857130595e-01 1.900000000000000e-10 2.060000000000000e-11 -4.210000000000000e-11 4.720000000000000e-11 1.620000000000000e-11 3.010000000000000e-11 -1.640000000000000e-11 1.590000000000000e-10 -2.360000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>4.470000000000000e+02 2.128521702817279e-01 -9.132353921645868e-01 1.852136883119308e-01 -2.939233943840514e-01 1.900000000000000e-10 2.060000000000000e-11 -4.210000000000000e-11 4.720000000000000e-11 1.620000000000000e-11 3.010000000000000e-11 -1.640000000000000e-11 1.590000000000000e-10 -2.360000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>4.480000000000000e+02 2.128115310418726e-01 -9.132625449633127e-01 1.852919606184164e-01 -2.938191034513088e-01 1.900000000000000e-10 2.060000000000000e-11 -4.210000000000000e-11 4.720000000000000e-11 1.620000000000000e-11 3.010000000000000e-11 -1.640000000000000e-11 1.590000000000000e-10 -2.360000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>4.490000000000000e+02 2.127708916947870e-01 -9.132896779290858e-01 1.853702253416998e-01 -2.937148130284877e-01 1.900000000000000e-10 2.060000000000000e-11 -4.210000000000000e-11 4.720000000000000e-11 1.620000000000000e-11 3.010000000000000e-11 -1.640000000000000e-11 1.590000000000000e-10 -2.360000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>4.500000000000000e+02 2.127302523376192e-01 -9.133167910370320e-01 1.854484822686873e-01 -2.936105232692313e-01 1.900000000000000e-10 2.060000000000000e-11 -4.210000000000000e-11 4.720000000000000e-11 1.620000000000000e-11 3.010000000000000e-11 -1.640000000000000e-11 1.590000000000000e-10 -2.360000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>4.510000000000000e+02 2.126896465990910e-01 -9.133438732963082e-01 1.855267333612420e-01 -2.935062427785108e-01 1.900000000000000e-10 2.050000000000000e-11 -4.220000000000000e-11 4.730000000000000e-11 1.620000000000000e-11 3.010000000000000e-11 -1.640000000000000e-11 1.590000000000000e-10 -2.360000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>4.520000000000000e+02 2.126490074993357e-01 -9.133709466331422e-01 1.856049738741958e-01 -2.934019548830313e-01 1.900000000000000e-10 2.050000000000000e-11 -4.220000000000000e-11 4.730000000000000e-11 1.610000000000000e-11 3.010000000000000e-11 -1.640000000000000e-11 1.590000000000000e-10 -2.360000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>4.530000000000000e+02 2.126083686672195e-01 -9.133980000692656e-01 1.856832057127334e-01 -2.932976681775228e-01 1.900000000000000e-10 2.050000000000000e-11 -4.220000000000000e-11 4.730000000000000e-11 1.610000000000000e-11 3.010000000000000e-11 -1.630000000000000e-11 1.590000000000000e-10 -2.360000000000000e-11 7.030000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>4.540000000000000e+02 2.125677301930212e-01 -9.134250336051886e-01 1.857614285652939e-01 -2.931933828061751e-01 1.900000000000000e-10 2.050000000000000e-11 -4.230000000000000e-11 4.730000000000000e-11 1.610000000000000e-11 3.010000000000000e-11 -1.630000000000000e-11 1.590000000000000e-10 -2.360000000000000e-11 7.020000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.550000000000000e+02 2.125270921601258e-01 -9.134520472483028e-01 1.858396421484255e-01 -2.930890988794891e-01 1.900000000000000e-10 2.050000000000000e-11 -4.230000000000000e-11 4.730000000000000e-11 1.610000000000000e-11 3.010000000000000e-11 -1.630000000000000e-11 1.590000000000000e-10 -2.360000000000000e-11 7.020000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.560000000000000e+02 2.124864546364480e-01 -9.134790410121354e-01 1.859178462271990e-01 -2.929848164697649e-01 1.900000000000000e-10 2.050000000000000e-11 -4.230000000000000e-11 4.730000000000000e-11 1.610000000000000e-11 3.010000000000000e-11 -1.630000000000000e-11 1.590000000000000e-10 -2.360000000000000e-11 7.020000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.570000000000000e+02 2.124458176656069e-01 -9.135060149148192e-01 1.859960406320561e-01 -2.928805356114270e-01 1.900000000000000e-10 2.050000000000000e-11 -4.230000000000000e-11 4.740000000000000e-11 1.610000000000000e-11 3.010000000000000e-11 -1.630000000000000e-11 1.590000000000000e-10 -2.360000000000000e-11 7.020000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.580000000000000e+02 2.124051812588746e-01 -9.135329689772216e-01 1.860742252678211e-01 -2.927762563068046e-01 1.900000000000000e-10 2.050000000000000e-11 -4.240000000000000e-11 4.740000000000000e-11 1.610000000000000e-11 3.010000000000000e-11 -1.630000000000000e-11 1.590000000000000e-10 -2.360000000000000e-11 7.020000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.590000000000000e+02 2.123645453891723e-01 -9.135599032214524e-01 1.861524001134625e-01 -2.926719785351136e-01 1.900000000000000e-10 2.040000000000000e-11 -4.240000000000000e-11 4.740000000000000e-11 1.610000000000000e-11 3.010000000000000e-11 -1.630000000000000e-11 1.590000000000000e-10 -2.360000000000000e-11 7.020000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.600000000000000e+02 2.123239099897476e-01 -9.135868176691277e-01 1.862305652155093e-01 -2.925677022628667e-01 1.900000000000000e-10 2.040000000000000e-11 -4.240000000000000e-11 4.740000000000000e-11 1.610000000000000e-11 3.010000000000000e-11 -1.630000000000000e-11 1.590000000000000e-10 -2.360000000000000e-11 7.020000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.610000000000000e+02 2.122833108932798e-01 -9.136137005917935e-01 1.863087231063780e-01 -2.924634365209212e-01 1.900000000000000e-10 2.040000000000000e-11 -4.240000000000000e-11 4.740000000000000e-11 1.610000000000000e-11 3.010000000000000e-11 -1.630000000000000e-11 1.590000000000000e-10 -2.360000000000000e-11 7.020000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.620000000000000e+02 2.122426760895036e-01 -9.136405755057455e-01 1.863868690619740e-01 -2.923591631489789e-01 1.900000000000000e-10 2.040000000000000e-11 -4.250000000000000e-11 4.740000000000000e-11 1.610000000000000e-11 3.010000000000000e-11 -1.630000000000000e-11 1.590000000000000e-10 -2.360000000000000e-11 7.020000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.630000000000000e+02 2.122020413569772e-01 -9.136674306786543e-01 1.864650056604196e-01 -2.922548911909910e-01 1.900000000000000e-10 2.040000000000000e-11 -4.250000000000000e-11 4.740000000000000e-11 1.610000000000000e-11 3.000000000000000e-11 -1.620000000000000e-11 1.590000000000000e-10 -2.360000000000000e-11 7.020000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.640000000000000e+02 2.121614065256751e-01 -9.136942661277602e-01 1.865431330433501e-01 -2.921506206405737e-01 1.900000000000000e-10 2.040000000000000e-11 -4.250000000000000e-11 4.750000000000000e-11 1.610000000000000e-11 3.000000000000000e-11 -1.620000000000000e-11 1.590000000000000e-10 -2.360000000000000e-11 7.020000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.650000000000000e+02 2.121207714272484e-01 -9.137210818720056e-01 1.866212513234860e-01 -2.920463515030057e-01 1.910000000000000e-10 2.040000000000000e-11 -4.250000000000000e-11 4.750000000000000e-11 1.610000000000000e-11 3.000000000000000e-11 -1.620000000000000e-11 1.590000000000000e-10 -2.360000000000000e-11 7.020000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.660000000000000e+02 2.120801359033226e-01 -9.137478779345483e-01 1.866993605695825e-01 -2.919420837910273e-01 1.910000000000000e-10 2.040000000000000e-11 -4.260000000000000e-11 4.750000000000000e-11 1.600000000000000e-11 3.000000000000000e-11 -1.620000000000000e-11 1.580000000000000e-10 -2.360000000000000e-11 7.020000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.670000000000000e+02 2.120394998122928e-01 -9.137746543452540e-01 1.867774607979178e-01 -2.918378175176182e-01 1.910000000000000e-10 2.030000000000000e-11 -4.260000000000000e-11 4.750000000000000e-11 1.600000000000000e-11 3.000000000000000e-11 -1.620000000000000e-11 1.580000000000000e-10 -2.360000000000000e-11 7.020000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.680000000000000e+02 2.119988630313380e-01 -9.138014111430363e-01 1.868555519684404e-01 -2.917335526897537e-01 1.910000000000000e-10 2.030000000000000e-11 -4.260000000000000e-11 4.750000000000000e-11 1.600000000000000e-11 3.000000000000000e-11 -1.620000000000000e-11 1.580000000000000e-10 -2.360000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.690000000000000e+02 2.119582254554341e-01 -9.138281483770876e-01 1.869336339878906e-01 -2.916292893033351e-01 1.910000000000000e-10 2.030000000000000e-11 -4.260000000000000e-11 4.750000000000000e-11 1.600000000000000e-11 3.000000000000000e-11 -1.620000000000000e-11 1.580000000000000e-10 -2.360000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.700000000000000e+02 2.119175869918158e-01 -9.138548661071972e-01 1.870117067197001e-01 -2.915250273399314e-01 1.910000000000000e-10 2.030000000000000e-11 -4.260000000000000e-11 4.750000000000000e-11 1.600000000000000e-11 3.000000000000000e-11 -1.620000000000000e-11 1.580000000000000e-10 -2.360000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.710000000000000e+02 2.118769790271567e-01 -9.138815541190733e-01 1.870897721696459e-01 -2.914207747377379e-01 1.910000000000000e-10 2.030000000000000e-11 -4.270000000000000e-11 4.760000000000000e-11 1.600000000000000e-11 3.000000000000000e-11 -1.620000000000000e-11 1.580000000000000e-10 -2.360000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.720000000000000e+02 2.118363385310320e-01 -9.139082330563840e-01 1.871678258166281e-01 -2.913165155095063e-01 1.910000000000000e-10 2.030000000000000e-11 -4.270000000000000e-11 4.760000000000000e-11 1.600000000000000e-11 3.000000000000000e-11 -1.620000000000000e-11 1.580000000000000e-10 -2.360000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.730000000000000e+02 2.117956968838400e-01 -9.139348927138140e-01 1.872458696520068e-01 -2.912122575715891e-01 1.910000000000000e-10 2.030000000000000e-11 -4.270000000000000e-11 4.760000000000000e-11 1.600000000000000e-11 3.000000000000000e-11 -1.610000000000000e-11 1.580000000000000e-10 -2.360000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.740000000000000e+02 2.117550539856020e-01 -9.139615331694758e-01 1.873239035137134e-01 -2.911080008698513e-01 1.910000000000000e-10 2.030000000000000e-11 -4.270000000000000e-11 4.760000000000000e-11 1.600000000000000e-11 3.000000000000000e-11 -1.610000000000000e-11 1.580000000000000e-10 -2.360000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.750000000000000e+02 2.117144097302885e-01 -9.139881544955156e-01 1.874019272653820e-01 -2.910037453567523e-01 1.910000000000000e-10 2.030000000000000e-11 -4.280000000000000e-11 4.760000000000000e-11 1.600000000000000e-11 3.000000000000000e-11 -1.610000000000000e-11 1.580000000000000e-10 -2.360000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.760000000000000e+02 2.116737640078089e-01 -9.140147567549287e-01 1.874799408019713e-01 -2.908994909962619e-01 1.910000000000000e-10 2.020000000000000e-11 -4.280000000000000e-11 4.770000000000000e-11 1.600000000000000e-11 3.000000000000000e-11 -1.610000000000000e-11 1.580000000000000e-10 -2.360000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.770000000000000e+02 2.116331167089270e-01 -9.140413399994598e-01 1.875579440513557e-01 -2.907952377658309e-01 1.910000000000000e-10 2.020000000000000e-11 -4.280000000000000e-11 4.770000000000000e-11 1.600000000000000e-11 3.000000000000000e-11 -1.610000000000000e-11 1.580000000000000e-10 -2.360000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.780000000000000e+02 2.115924677306679e-01 -9.140679042695500e-01 1.876359369714014e-01 -2.906909856544984e-01 1.910000000000000e-10 2.020000000000000e-11 -4.280000000000000e-11 4.770000000000000e-11 1.600000000000000e-11 3.000000000000000e-11 -1.610000000000000e-11 1.580000000000000e-10 -2.360000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.790000000000000e+02 2.115518169807493e-01 -9.140944495963769e-01 1.877139195421980e-01 -2.905867346582532e-01 1.910000000000000e-10 2.020000000000000e-11 -4.290000000000000e-11 4.770000000000000e-11 1.590000000000000e-11 3.000000000000000e-11 -1.610000000000000e-11 1.580000000000000e-10 -2.360000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.800000000000000e+02 2.115111643800902e-01 -9.141209760059141e-01 1.877918917580307e-01 -2.904824847706201e-01 1.910000000000000e-10 2.020000000000000e-11 -4.290000000000000e-11 4.770000000000000e-11 1.590000000000000e-11 3.000000000000000e-11 -1.610000000000000e-11 1.580000000000000e-10 -2.360000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.810000000000000e+02 2.114705425888019e-01 -9.141474728367343e-01 1.878698559240533e-01 -2.903782442926562e-01 1.910000000000000e-10 2.020000000000000e-11 -4.290000000000000e-11 4.770000000000000e-11 1.590000000000000e-11 3.000000000000000e-11 -1.610000000000000e-11 1.580000000000000e-10 -2.360000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.820000000000000e+02 2.114298861038105e-01 -9.141739614914240e-01 1.879478074456937e-01 -2.902739965438905e-01 1.910000000000000e-10 2.020000000000000e-11 -4.290000000000000e-11 4.770000000000000e-11 1.590000000000000e-11 3.000000000000000e-11 -1.610000000000000e-11 1.580000000000000e-10 -2.360000000000000e-11 7.010000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.830000000000000e+02 2.113892276090870e-01 -9.142004313222458e-01 1.880257486279421e-01 -2.901697497568541e-01 1.910000000000000e-10 2.020000000000000e-11 -4.300000000000000e-11 4.780000000000000e-11 1.590000000000000e-11 3.000000000000000e-11 -1.600000000000000e-11 1.580000000000000e-10 -2.360000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.840000000000000e+02 2.113485670702293e-01 -9.142268823793529e-01 1.881036794785066e-01 -2.900655038072210e-01 1.910000000000000e-10 2.010000000000000e-11 -4.300000000000000e-11 4.780000000000000e-11 1.590000000000000e-11 3.000000000000000e-11 -1.600000000000000e-11 1.580000000000000e-10 -2.360000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.850000000000000e+02 2.113079044609893e-01 -9.142533147242996e-01 1.881816000087860e-01 -2.899612585261511e-01 1.910000000000000e-10 2.010000000000000e-11 -4.300000000000000e-11 4.780000000000000e-11 1.590000000000000e-11 3.000000000000000e-11 -1.600000000000000e-11 1.580000000000000e-10 -2.360000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.860000000000000e+02 2.112672397634393e-01 -9.142797284282158e-01 1.882595102372706e-01 -2.898570137036343e-01 1.910000000000000e-10 2.010000000000000e-11 -4.300000000000000e-11 4.780000000000000e-11 1.590000000000000e-11 3.000000000000000e-11 -1.600000000000000e-11 1.570000000000000e-10 -2.360000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.870000000000000e+02 2.112265729712821e-01 -9.143061235673619e-01 1.883374101941120e-01 -2.897527690970467e-01 1.910000000000000e-10 2.010000000000000e-11 -4.310000000000000e-11 4.780000000000000e-11 1.590000000000000e-11 3.000000000000000e-11 -1.600000000000000e-11 1.570000000000000e-10 -2.360000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.880000000000000e+02 2.111859040944933e-01 -9.143325002172727e-01 1.884152999234226e-01 -2.896485244446952e-01 1.910000000000000e-10 2.010000000000000e-11 -4.310000000000000e-11 4.780000000000000e-11 1.590000000000000e-11 3.000000000000000e-11 -1.600000000000000e-11 1.570000000000000e-10 -2.360000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.890000000000000e+02 2.111452331642737e-01 -9.143588584460893e-01 1.884931794806791e-01 -2.895442794849066e-01 1.910000000000000e-10 2.010000000000000e-11 -4.310000000000000e-11 4.780000000000000e-11 1.590000000000000e-11 2.990000000000000e-11 -1.600000000000000e-11 1.570000000000000e-10 -2.360000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.900000000000000e+02 2.111045602363482e-01 -9.143851983082412e-01 1.885710489303931e-01 -2.894400339751020e-01 1.910000000000000e-10 2.010000000000000e-11 -4.310000000000000e-11 4.790000000000000e-11 1.590000000000000e-11 2.990000000000000e-11 -1.600000000000000e-11 1.570000000000000e-10 -2.360000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.910000000000000e+02 2.110639199150464e-01 -9.144115085725826e-01 1.886489108158282e-01 -2.893357965204276e-01 1.910000000000000e-10 2.010000000000000e-11 -4.320000000000000e-11 4.790000000000000e-11 1.590000000000000e-11 2.990000000000000e-11 -1.600000000000000e-11 1.570000000000000e-10 -2.360000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.920000000000000e+02 2.110232432601153e-01 -9.144378117885380e-01 1.887267602562271e-01 -2.892315493485474e-01 1.910000000000000e-10 2.000000000000000e-11 -4.320000000000000e-11 4.790000000000000e-11 1.590000000000000e-11 2.990000000000000e-11 -1.600000000000000e-11 1.570000000000000e-10 -2.360000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.930000000000000e+02 2.109825649136318e-01 -9.144640966788530e-01 1.888045997793789e-01 -2.891273011839995e-01 1.910000000000000e-10 2.000000000000000e-11 -4.320000000000000e-11 4.790000000000000e-11 1.580000000000000e-11 2.990000000000000e-11 -1.590000000000000e-11 1.570000000000000e-10 -2.360000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.940000000000000e+02 2.109418849994488e-01 -9.144903632145863e-01 1.888824294263712e-01 -2.890230520123356e-01 1.910000000000000e-10 2.000000000000000e-11 -4.320000000000000e-11 4.790000000000000e-11 1.580000000000000e-11 2.990000000000000e-11 -1.590000000000000e-11 1.570000000000000e-10 -2.360000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.950000000000000e+02 2.109012036334170e-01 -9.145166113494912e-01 1.889602492198081e-01 -2.889188018918249e-01 1.910000000000000e-10 2.000000000000000e-11 -4.320000000000000e-11 4.790000000000000e-11 1.580000000000000e-11 2.990000000000000e-11 -1.590000000000000e-11 1.570000000000000e-10 -2.360000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.960000000000000e+02 2.108605209090383e-01 -9.145428410251655e-01 1.890380591640143e-01 -2.888145509476464e-01 1.910000000000000e-10 2.000000000000000e-11 -4.330000000000000e-11 4.800000000000000e-11 1.580000000000000e-11 2.990000000000000e-11 -1.590000000000000e-11 1.570000000000000e-10 -2.360000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.970000000000000e+02 2.108198368835641e-01 -9.145690521772808e-01 1.891158592478649e-01 -2.887102993605872e-01 1.910000000000000e-10 2.000000000000000e-11 -4.330000000000000e-11 4.800000000000000e-11 1.580000000000000e-11 2.990000000000000e-11 -1.590000000000000e-11 1.570000000000000e-10 -2.360000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.980000000000000e+02 2.107791515695114e-01 -9.145952447411335e-01 1.891936494504976e-01 -2.886060473520007e-01 1.910000000000000e-10 2.000000000000000e-11 -4.330000000000000e-11 4.800000000000000e-11 1.580000000000000e-11 2.990000000000000e-11 -1.590000000000000e-11 1.570000000000000e-10 -2.360000000000000e-11 7.000000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>4.990000000000000e+02 2.107384649302406e-01 -9.146214186567253e-01 1.892714297467299e-01 -2.885017951674369e-01 1.910000000000000e-10 2.000000000000000e-11 -4.330000000000000e-11 4.800000000000000e-11 1.580000000000000e-11 2.990000000000000e-11 -1.590000000000000e-11 1.570000000000000e-10 -2.360000000000000e-11 6.990000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.000000000000000e+02 2.106977768803538e-01 -9.146475738730780e-01 1.893492001130408e-01 -2.883975430587455e-01 1.910000000000000e-10 2.000000000000000e-11 -4.340000000000000e-11 4.800000000000000e-11 1.580000000000000e-11 2.990000000000000e-11 -1.590000000000000e-11 1.570000000000000e-10 -2.360000000000000e-11 6.990000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.010000000000000e+02 2.106571240710444e-01 -9.146736983546171e-01 1.894269632196007e-01 -2.882933006883850e-01 1.910000000000000e-10 1.990000000000000e-11 -4.340000000000000e-11 4.800000000000000e-11 1.580000000000000e-11 2.990000000000000e-11 -1.590000000000000e-11 1.570000000000000e-10 -2.360000000000000e-11 6.990000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.020000000000000e+02 2.106164327899247e-01 -9.146998160681388e-01 1.895047136968949e-01 -2.881890494283537e-01 1.910000000000000e-10 1.990000000000000e-11 -4.340000000000000e-11 4.800000000000000e-11 1.580000000000000e-11 2.990000000000000e-11 -1.590000000000000e-11 1.570000000000000e-10 -2.360000000000000e-11 6.990000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.030000000000000e+02 2.105757396419524e-01 -9.147259150024866e-01 1.895824542393226e-01 -2.880847988730117e-01 1.910000000000000e-10 1.990000000000000e-11 -4.340000000000000e-11 4.810000000000000e-11 1.580000000000000e-11 2.990000000000000e-11 -1.580000000000000e-11 1.570000000000000e-10 -2.360000000000000e-11 6.990000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.040000000000000e+02 2.105350444539993e-01 -9.147519951558232e-01 1.896601848742445e-01 -2.879805491498704e-01 1.910000000000000e-10 1.990000000000000e-11 -4.340000000000000e-11 4.810000000000000e-11 1.580000000000000e-11 2.990000000000000e-11 -1.580000000000000e-11 1.570000000000000e-10 -2.360000000000000e-11 6.990000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.050000000000000e+02 2.104943470688501e-01 -9.147780565358953e-01 1.897379056414059e-01 -2.878763003362413e-01 1.910000000000000e-10 1.990000000000000e-11 -4.350000000000000e-11 4.810000000000000e-11 1.580000000000000e-11 2.990000000000000e-11 -1.580000000000000e-11 1.570000000000000e-10 -2.360000000000000e-11 6.990000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.060000000000000e+02 2.104536473581357e-01 -9.148040991578585e-01 1.898156165903000e-01 -2.877720524583314e-01 1.910000000000000e-10 1.990000000000000e-11 -4.350000000000000e-11 4.810000000000000e-11 1.580000000000000e-11 2.990000000000000e-11 -1.580000000000000e-11 1.560000000000000e-10 -2.360000000000000e-11 6.990000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.070000000000000e+02 2.104129452311448e-01 -9.148301230417492e-01 1.898933177769523e-01 -2.876678054948707e-01 1.910000000000000e-10 1.990000000000000e-11 -4.350000000000000e-11 4.810000000000000e-11 1.570000000000000e-11 2.990000000000000e-11 -1.580000000000000e-11 1.560000000000000e-10 -2.360000000000000e-11 6.990000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.080000000000000e+02 2.103722406405669e-01 -9.148561282098636e-01 1.899710092591715e-01 -2.875635593843160e-01 1.910000000000000e-10 1.990000000000000e-11 -4.350000000000000e-11 4.810000000000000e-11 1.570000000000000e-11 2.990000000000000e-11 -1.580000000000000e-11 1.560000000000000e-10 -2.360000000000000e-11 6.990000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.090000000000000e+02 2.103315335834890e-01 -9.148821146842003e-01 1.900486910912594e-01 -2.874593140357125e-01 1.920000000000000e-10 1.990000000000000e-11 -4.360000000000000e-11 4.810000000000000e-11 1.570000000000000e-11 2.990000000000000e-11 -1.580000000000000e-11 1.560000000000000e-10 -2.360000000000000e-11 6.990000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.100000000000000e+02 2.102908240989648e-01 -9.149080824840736e-01 1.901263633190123e-01 -2.873550693413658e-01 1.920000000000000e-10 1.980000000000000e-11 -4.360000000000000e-11 4.820000000000000e-11 1.570000000000000e-11 2.990000000000000e-11 -1.580000000000000e-11 1.560000000000000e-10 -2.360000000000000e-11 6.990000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.110000000000000e+02 2.102501446631871e-01 -9.149340210616737e-01 1.902040283859198e-01 -2.872508335214963e-01 1.920000000000000e-10 1.980000000000000e-11 -4.360000000000000e-11 4.820000000000000e-11 1.570000000000000e-11 2.990000000000000e-11 -1.580000000000000e-11 1.560000000000000e-10 -2.360000000000000e-11 6.990000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.120000000000000e+02 2.102094305818122e-01 -9.149599515501777e-01 1.902816814957546e-01 -2.871465898124421e-01 1.920000000000000e-10 1.980000000000000e-11 -4.360000000000000e-11 4.820000000000000e-11 1.570000000000000e-11 2.990000000000000e-11 -1.580000000000000e-11 1.560000000000000e-10 -2.360000000000000e-11 6.990000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.130000000000000e+02 2.101687143845973e-01 -9.149858633857054e-01 1.903593250547215e-01 -2.870423464629420e-01 1.920000000000000e-10 1.980000000000000e-11 -4.370000000000000e-11 4.820000000000000e-11 1.570000000000000e-11 2.990000000000000e-11 -1.580000000000000e-11 1.560000000000000e-10 -2.360000000000000e-11 6.990000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.140000000000000e+02 2.101279962158747e-01 -9.150117565584521e-01 1.904369590435877e-01 -2.869381034236274e-01 1.920000000000000e-10 1.980000000000000e-11 -4.370000000000000e-11 4.820000000000000e-11 1.570000000000000e-11 2.990000000000000e-11 -1.570000000000000e-11 1.560000000000000e-10 -2.360000000000000e-11 6.990000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.150000000000000e+02 2.100872762295232e-01 -9.150376310485984e-01 1.905145834238531e-01 -2.868338606829132e-01 1.920000000000000e-10 1.980000000000000e-11 -4.370000000000000e-11 4.820000000000000e-11 1.570000000000000e-11 2.990000000000000e-11 -1.570000000000000e-11 1.560000000000000e-10 -2.360000000000000e-11 6.990000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.160000000000000e+02 2.100465545837565e-01 -9.150634868262999e-01 1.905921981400640e-01 -2.867296182694171e-01 1.920000000000000e-10 1.980000000000000e-11 -4.370000000000000e-11 4.830000000000000e-11 1.570000000000000e-11 2.980000000000000e-11 -1.570000000000000e-11 1.560000000000000e-10 -2.360000000000000e-11 6.979999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.170000000000000e+02 2.100058314350223e-01 -9.150893238530152e-01 1.906698031258922e-01 -2.866253762482485e-01 1.920000000000000e-10 1.980000000000000e-11 -4.380000000000000e-11 4.830000000000000e-11 1.570000000000000e-11 2.980000000000000e-11 -1.570000000000000e-11 1.560000000000000e-10 -2.360000000000000e-11 6.979999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.180000000000000e+02 2.099651069342621e-01 -9.151151420834104e-01 1.907473983114465e-01 -2.865211347128827e-01 1.920000000000000e-10 1.970000000000000e-11 -4.380000000000000e-11 4.830000000000000e-11 1.570000000000000e-11 2.980000000000000e-11 -1.570000000000000e-11 1.560000000000000e-10 -2.360000000000000e-11 6.979999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.190000000000000e+02 2.099243812235525e-01 -9.151409414675159e-01 1.908249836325857e-01 -2.864168937745826e-01 1.920000000000000e-10 1.970000000000000e-11 -4.380000000000000e-11 4.830000000000000e-11 1.570000000000000e-11 2.980000000000000e-11 -1.570000000000000e-11 1.560000000000000e-10 -2.360000000000000e-11 6.979999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.200000000000000e+02 2.098836544323458e-01 -9.151667219539623e-01 1.909025590407555e-01 -2.863126535482732e-01 1.920000000000000e-10 1.970000000000000e-11 -4.380000000000000e-11 4.830000000000000e-11 1.570000000000000e-11 2.980000000000000e-11 -1.570000000000000e-11 1.560000000000000e-10 -2.360000000000000e-11 6.979999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.210000000000000e+02 2.098429603680682e-01 -9.151924725157441e-01 1.909801270636490e-01 -2.862084228341942e-01 1.920000000000000e-10 1.970000000000000e-11 -4.390000000000000e-11 4.830000000000000e-11 1.560000000000000e-11 2.980000000000000e-11 -1.570000000000000e-11 1.560000000000000e-10 -2.360000000000000e-11 6.979999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.220000000000000e+02 2.098022317438388e-01 -9.152182150637327e-01 1.910576826160957e-01 -2.861041843179288e-01 1.920000000000000e-10 1.970000000000000e-11 -4.390000000000000e-11 4.830000000000000e-11 1.560000000000000e-11 2.980000000000000e-11 -1.570000000000000e-11 1.560000000000000e-10 -2.360000000000000e-11 6.979999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.230000000000000e+02 2.097615023338574e-01 -9.152439385820565e-01 1.911352282963865e-01 -2.859999467334496e-01 1.920000000000000e-10 1.970000000000000e-11 -4.390000000000000e-11 4.840000000000000e-11 1.560000000000000e-11 2.980000000000000e-11 -1.570000000000000e-11 1.560000000000000e-10 -2.360000000000000e-11 6.979999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.240000000000000e+02 2.097207722023860e-01 -9.152696430423370e-01 1.912127641951138e-01 -2.858957100777340e-01 1.920000000000000e-10 1.970000000000000e-11 -4.390000000000000e-11 4.840000000000000e-11 1.560000000000000e-11 2.980000000000000e-11 -1.570000000000000e-11 1.560000000000000e-10 -2.360000000000000e-11 6.979999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.250000000000000e+02 2.096800413991837e-01 -9.152953284256289e-01 1.912902904377876e-01 -2.857914743047520e-01 1.920000000000000e-10 1.970000000000000e-11 -4.390000000000000e-11 4.840000000000000e-11 1.560000000000000e-11 2.980000000000000e-11 -1.560000000000000e-11 1.560000000000000e-10 -2.360000000000000e-11 6.979999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.260000000000000e+02 2.096393099614649e-01 -9.153209947223664e-01 1.913678071760637e-01 -2.856872393299425e-01 1.920000000000000e-10 1.960000000000000e-11 -4.400000000000000e-11 4.840000000000000e-11 1.560000000000000e-11 2.980000000000000e-11 -1.560000000000000e-11 1.560000000000000e-10 -2.360000000000000e-11 6.979999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.270000000000000e+02 2.095985779162438e-01 -9.153466419311483e-01 1.914453145768403e-01 -2.855830050395735e-01 1.920000000000000e-10 1.960000000000000e-11 -4.400000000000000e-11 4.840000000000000e-11 1.560000000000000e-11 2.980000000000000e-11 -1.560000000000000e-11 1.550000000000000e-10 -2.360000000000000e-11 6.979999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.280000000000000e+02 2.095578452811533e-01 -9.153722700571493e-01 1.915228128082756e-01 -2.854787713045365e-01 1.920000000000000e-10 1.960000000000000e-11 -4.400000000000000e-11 4.840000000000000e-11 1.560000000000000e-11 2.980000000000000e-11 -1.560000000000000e-11 1.550000000000000e-10 -2.360000000000000e-11 6.979999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.290000000000000e+02 2.095171120643738e-01 -9.153978791100641e-01 1.916003020256502e-01 -2.853745379964392e-01 1.920000000000000e-10 1.960000000000000e-11 -4.400000000000000e-11 4.840000000000000e-11 1.560000000000000e-11 2.980000000000000e-11 -1.560000000000000e-11 1.550000000000000e-10 -2.360000000000000e-11 6.979999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.300000000000000e+02 2.094763782623643e-01 -9.154234691019451e-01 1.916777823608764e-01 -2.852703050032718e-01 1.920000000000000e-10 1.960000000000000e-11 -4.400000000000000e-11 4.850000000000000e-11 1.560000000000000e-11 2.980000000000000e-11 -1.560000000000000e-11 1.550000000000000e-10 -2.360000000000000e-11 6.979999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>5.310000000000000e+02 2.094356769749172e-01 -9.154490292609312e-01 1.917552564675641e-01 -2.851660808236771e-01 1.920000000000000e-10 1.960000000000000e-11 -4.410000000000000e-11 4.850000000000000e-11 1.560000000000000e-11 2.980000000000000e-11 -1.560000000000000e-11 1.550000000000000e-10 -2.360000000000000e-11 6.970000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.320000000000000e+02 2.093949419203982e-01 -9.154745811692190e-01 1.918327193180991e-01 -2.850618482544087e-01 1.920000000000000e-10 1.960000000000000e-11 -4.410000000000000e-11 4.850000000000000e-11 1.560000000000000e-11 2.980000000000000e-11 -1.560000000000000e-11 1.550000000000000e-10 -2.360000000000000e-11 6.970000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.330000000000000e+02 2.093542061473903e-01 -9.155001140538329e-01 1.919101735020247e-01 -2.849576158698653e-01 1.920000000000000e-10 1.960000000000000e-11 -4.410000000000000e-11 4.850000000000000e-11 1.560000000000000e-11 2.980000000000000e-11 -1.560000000000000e-11 1.550000000000000e-10 -2.360000000000000e-11 6.970000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.340000000000000e+02 2.093134695481628e-01 -9.155256279261753e-01 1.919876190405189e-01 -2.848533837103672e-01 1.920000000000000e-10 1.960000000000000e-11 -4.410000000000000e-11 4.850000000000000e-11 1.560000000000000e-11 2.980000000000000e-11 -1.560000000000000e-11 1.550000000000000e-10 -2.360000000000000e-11 6.970000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.350000000000000e+02 2.092727319754983e-01 -9.155511227975456e-01 1.920650559423283e-01 -2.847491518539346e-01 1.920000000000000e-10 1.960000000000000e-11 -4.410000000000000e-11 4.850000000000000e-11 1.560000000000000e-11 2.980000000000000e-11 -1.550000000000000e-11 1.550000000000000e-10 -2.360000000000000e-11 6.970000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.360000000000000e+02 2.092319932421161e-01 -9.155765986800173e-01 1.921424842138585e-01 -2.846449204071433e-01 1.920000000000000e-10 1.950000000000000e-11 -4.420000000000000e-11 4.860000000000000e-11 1.550000000000000e-11 2.980000000000000e-11 -1.550000000000000e-11 1.550000000000000e-10 -2.360000000000000e-11 6.970000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.370000000000000e+02 2.091912531247283e-01 -9.156020555870812e-01 1.922199038677825e-01 -2.845406894942756e-01 1.920000000000000e-10 1.950000000000000e-11 -4.420000000000000e-11 4.860000000000000e-11 1.550000000000000e-11 2.980000000000000e-11 -1.550000000000000e-11 1.550000000000000e-10 -2.360000000000000e-11 6.970000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.380000000000000e+02 2.091505113719812e-01 -9.156274935347620e-01 1.922973149284786e-01 -2.844364592442145e-01 1.920000000000000e-10 1.950000000000000e-11 -4.420000000000000e-11 4.860000000000000e-11 1.550000000000000e-11 2.980000000000000e-11 -1.550000000000000e-11 1.550000000000000e-10 -2.360000000000000e-11 6.970000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.390000000000000e+02 2.091097677188676e-01 -9.156529125416272e-01 1.923747174323720e-01 -2.843322297795513e-01 1.920000000000000e-10 1.950000000000000e-11 -4.420000000000000e-11 4.860000000000000e-11 1.550000000000000e-11 2.980000000000000e-11 -1.550000000000000e-11 1.550000000000000e-10 -2.360000000000000e-11 6.970000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.400000000000000e+02 2.090690219010850e-01 -9.156783126292405e-01 1.924521114251365e-01 -2.842280012064213e-01 1.920000000000000e-10 1.950000000000000e-11 -4.430000000000000e-11 4.860000000000000e-11 1.550000000000000e-11 2.980000000000000e-11 -1.550000000000000e-11 1.550000000000000e-10 -2.360000000000000e-11 6.970000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.410000000000000e+02 2.090283074679510e-01 -9.157036828238563e-01 1.925294996043108e-01 -2.841237823942655e-01 1.920000000000000e-10 1.950000000000000e-11 -4.430000000000000e-11 4.860000000000000e-11 1.550000000000000e-11 2.980000000000000e-11 -1.550000000000000e-11 1.550000000000000e-10 -2.360000000000000e-11 6.970000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.420000000000000e+02 2.089875566186891e-01 -9.157290451504778e-01 1.926068767223660e-01 -2.840195558154403e-01 1.920000000000000e-10 1.950000000000000e-11 -4.430000000000000e-11 4.860000000000000e-11 1.550000000000000e-11 2.980000000000000e-11 -1.550000000000000e-11 1.550000000000000e-10 -2.360000000000000e-11 6.970000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.430000000000000e+02 2.089468029809717e-01 -9.157543886389425e-01 1.926842454592589e-01 -2.839153302735583e-01 1.920000000000000e-10 1.950000000000000e-11 -4.430000000000000e-11 4.870000000000000e-11 1.550000000000000e-11 2.980000000000000e-11 -1.550000000000000e-11 1.550000000000000e-10 -2.360000000000000e-11 6.970000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.440000000000000e+02 2.089060464401835e-01 -9.157797133222740e-01 1.927616058307150e-01 -2.838111057475898e-01 1.920000000000000e-10 1.940000000000000e-11 -4.440000000000000e-11 4.870000000000000e-11 1.550000000000000e-11 2.980000000000000e-11 -1.550000000000000e-11 1.550000000000000e-10 -2.360000000000000e-11 6.970000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.450000000000000e+02 2.088652869361649e-01 -9.158050192370315e-01 1.928389578282156e-01 -2.837068821813485e-01 1.920000000000000e-10 1.940000000000000e-11 -4.440000000000000e-11 4.870000000000000e-11 1.550000000000000e-11 2.980000000000000e-11 -1.550000000000000e-11 1.550000000000000e-10 -2.360000000000000e-11 6.970000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.460000000000000e+02 2.088245244584397e-01 -9.158303064244538e-01 1.929163014168351e-01 -2.836026594847910e-01 1.920000000000000e-10 1.940000000000000e-11 -4.440000000000000e-11 4.870000000000000e-11 1.550000000000000e-11 2.980000000000000e-11 -1.540000000000000e-11 1.550000000000000e-10 -2.360000000000000e-11 6.970000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.470000000000000e+02 2.087837590376029e-01 -9.158555749320035e-01 1.929936365350300e-01 -2.834984375355218e-01 1.920000000000000e-10 1.940000000000000e-11 -4.440000000000000e-11 4.870000000000000e-11 1.550000000000000e-11 2.980000000000000e-11 -1.540000000000000e-11 1.550000000000000e-10 -2.360000000000000e-11 6.970000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.480000000000000e+02 2.087429907345323e-01 -9.158808248144924e-01 1.930709630963229e-01 -2.833942161819581e-01 1.920000000000000e-10 1.940000000000000e-11 -4.440000000000000e-11 4.870000000000000e-11 1.550000000000000e-11 2.980000000000000e-11 -1.540000000000000e-11 1.550000000000000e-10 -2.360000000000000e-11 6.970000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.490000000000000e+02 2.087022196282028e-01 -9.159060561351158e-01 1.931482809903128e-01 -2.832899952482733e-01 1.920000000000000e-10 1.940000000000000e-11 -4.450000000000000e-11 4.870000000000000e-11 1.550000000000000e-11 2.980000000000000e-11 -1.540000000000000e-11 1.550000000000000e-10 -2.360000000000000e-11 6.970000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.500000000000000e+02 2.086614458061604e-01 -9.159312689655869e-01 1.932255900854487e-01 -2.831857745390872e-01 1.920000000000000e-10 1.940000000000000e-11 -4.450000000000000e-11 4.870000000000000e-11 1.550000000000000e-11 2.970000000000000e-11 -1.540000000000000e-11 1.540000000000000e-10 -2.360000000000000e-11 6.970000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.510000000000000e+02 2.086207064342790e-01 -9.159564513260644e-01 1.933028931864565e-01 -2.830815635232554e-01 1.920000000000000e-10 1.940000000000000e-11 -4.450000000000000e-11 4.880000000000000e-11 1.540000000000000e-11 2.970000000000000e-11 -1.540000000000000e-11 1.540000000000000e-10 -2.360000000000000e-11 6.960000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.520000000000000e+02 2.085799274553594e-01 -9.159816274194711e-01 1.933801842216235e-01 -2.829773426320652e-01 1.920000000000000e-10 1.930000000000000e-11 -4.450000000000000e-11 4.880000000000000e-11 1.540000000000000e-11 2.970000000000000e-11 -1.540000000000000e-11 1.540000000000000e-10 -2.360000000000000e-11 6.960000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.530000000000000e+02 2.085391460394756e-01 -9.160067852713345e-01 1.934574659625187e-01 -2.828731213271471e-01 1.920000000000000e-10 1.930000000000000e-11 -4.460000000000000e-11 4.880000000000000e-11 1.540000000000000e-11 2.970000000000000e-11 -1.540000000000000e-11 1.540000000000000e-10 -2.360000000000000e-11 6.960000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.540000000000000e+02 2.084983622917498e-01 -9.160319249635650e-01 1.935347382191887e-01 -2.827688994066250e-01 1.920000000000000e-10 1.930000000000000e-11 -4.460000000000000e-11 4.880000000000000e-11 1.540000000000000e-11 2.970000000000000e-11 -1.540000000000000e-11 1.540000000000000e-10 -2.360000000000000e-11 6.960000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.550000000000000e+02 2.084575763355901e-01 -9.160570465684127e-01 1.936120007961654e-01 -2.826646766901636e-01 1.930000000000000e-10 1.930000000000000e-11 -4.460000000000000e-11 4.880000000000000e-11 1.540000000000000e-11 2.970000000000000e-11 -1.540000000000000e-11 1.540000000000000e-10 -2.360000000000000e-11 6.960000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.560000000000000e+02 2.084167883188247e-01 -9.160821501431045e-01 1.936892534983684e-01 -2.825604530278389e-01 1.930000000000000e-10 1.930000000000000e-11 -4.460000000000000e-11 4.880000000000000e-11 1.540000000000000e-11 2.970000000000000e-11 -1.530000000000000e-11 1.540000000000000e-10 -2.360000000000000e-11 6.960000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.570000000000000e+02 2.083759984174736e-01 -9.161072357248247e-01 1.937664961406917e-01 -2.824562283071506e-01 1.930000000000000e-10 1.930000000000000e-11 -4.460000000000000e-11 4.890000000000000e-11 1.540000000000000e-11 2.970000000000000e-11 -1.530000000000000e-11 1.540000000000000e-10 -2.360000000000000e-11 6.960000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.580000000000000e+02 2.083352068357988e-01 -9.161323033268366e-01 1.938437285573794e-01 -2.823520024592054e-01 1.930000000000000e-10 1.930000000000000e-11 -4.470000000000000e-11 4.890000000000000e-11 1.540000000000000e-11 2.970000000000000e-11 -1.530000000000000e-11 1.540000000000000e-10 -2.360000000000000e-11 6.960000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.590000000000000e+02 2.082944138005784e-01 -9.161573529376221e-01 1.939209506115182e-01 -2.822477754593080e-01 1.930000000000000e-10 1.930000000000000e-11 -4.470000000000000e-11 4.890000000000000e-11 1.540000000000000e-11 2.970000000000000e-11 -1.530000000000000e-11 1.540000000000000e-10 -2.360000000000000e-11 6.960000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.600000000000000e+02 2.082536195511764e-01 -9.161823845211938e-01 1.939981622042557e-01 -2.821435473270025e-01 1.930000000000000e-10 1.930000000000000e-11 -4.470000000000000e-11 4.890000000000000e-11 1.540000000000000e-11 2.970000000000000e-11 -1.530000000000000e-11 1.540000000000000e-10 -2.360000000000000e-11 6.960000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.610000000000000e+02 2.082128589858885e-01 -9.162073867532563e-01 1.940753660909977e-01 -2.820393272016098e-01 1.930000000000000e-10 1.920000000000000e-11 -4.470000000000000e-11 4.890000000000000e-11 1.540000000000000e-11 2.970000000000000e-11 -1.530000000000000e-11 1.540000000000000e-10 -2.360000000000000e-11 6.960000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.620000000000000e+02 2.081720630096352e-01 -9.162323820956372e-01 1.941525566548932e-01 -2.819350970099951e-01 1.930000000000000e-10 1.920000000000000e-11 -4.480000000000000e-11 4.890000000000000e-11 1.540000000000000e-11 2.970000000000000e-11 -1.530000000000000e-11 1.540000000000000e-10 -2.360000000000000e-11 6.960000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.630000000000000e+02 2.081312664788284e-01 -9.162573591961047e-01 1.942297367490557e-01 -2.818308659378739e-01 1.930000000000000e-10 1.920000000000000e-11 -4.480000000000000e-11 4.890000000000000e-11 1.540000000000000e-11 2.970000000000000e-11 -1.530000000000000e-11 1.540000000000000e-10 -2.360000000000000e-11 6.960000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.640000000000000e+02 2.080904695527254e-01 -9.162823179676138e-01 1.943069064663514e-01 -2.817266340989070e-01 1.930000000000000e-10 1.920000000000000e-11 -4.480000000000000e-11 4.900000000000000e-11 1.540000000000000e-11 2.970000000000000e-11 -1.530000000000000e-11 1.540000000000000e-10 -2.360000000000000e-11 6.960000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.650000000000000e+02 2.080496723499803e-01 -9.163072583258566e-01 1.943840659360061e-01 -2.816224016029346e-01 1.930000000000000e-10 1.920000000000000e-11 -4.480000000000000e-11 4.900000000000000e-11 1.540000000000000e-11 2.970000000000000e-11 -1.530000000000000e-11 1.540000000000000e-10 -2.360000000000000e-11 6.960000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.660000000000000e+02 2.080088749491293e-01 -9.163321801951453e-01 1.944612153118654e-01 -2.815181685444860e-01 1.930000000000000e-10 1.920000000000000e-11 -4.480000000000000e-11 4.900000000000000e-11 1.530000000000000e-11 2.970000000000000e-11 -1.530000000000000e-11 1.540000000000000e-10 -2.360000000000000e-11 6.950000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>5.670000000000000e+02 2.079680773939598e-01 -9.163570835128514e-01 1.945383547578702e-01 -2.814139349943114e-01 1.930000000000000e-10 1.920000000000000e-11 -4.490000000000000e-11 4.900000000000000e-11 1.530000000000000e-11 2.970000000000000e-11 -1.530000000000000e-11 1.540000000000000e-10 -2.360000000000000e-11 6.950000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>5.680000000000000e+02 2.079272797022357e-01 -9.163819682325579e-01 1.946154844314728e-01 -2.813097009940373e-01 1.930000000000000e-10 1.920000000000000e-11 -4.490000000000000e-11 4.900000000000000e-11 1.530000000000000e-11 2.970000000000000e-11 -1.520000000000000e-11 1.540000000000000e-10 -2.360000000000000e-11 6.950000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>5.690000000000000e+02 2.078864818754669e-01 -9.164068343252179e-01 1.946926044679359e-01 -2.812054665559790e-01 1.930000000000000e-10 1.920000000000000e-11 -4.490000000000000e-11 4.900000000000000e-11 1.530000000000000e-11 2.970000000000000e-11 -1.520000000000000e-11 1.540000000000000e-10 -2.360000000000000e-11 6.950000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>5.700000000000000e+02 2.078456839065942e-01 -9.164316817797343e-01 1.947697149653619e-01 -2.811012316658893e-01 1.930000000000000e-10 1.910000000000000e-11 -4.490000000000000e-11 4.900000000000000e-11 1.530000000000000e-11 2.970000000000000e-11 -1.520000000000000e-11 1.540000000000000e-10 -2.360000000000000e-11 6.950000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>5.710000000000000e+02 2.078049217290539e-01 -9.164564989244293e-01 1.948468189353401e-01 -2.809970057405206e-01 1.930000000000000e-10 1.910000000000000e-11 -4.490000000000000e-11 4.910000000000000e-11 1.530000000000000e-11 2.970000000000000e-11 -1.520000000000000e-11 1.540000000000000e-10 -2.360000000000000e-11 6.950000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>5.720000000000000e+02 2.077641234480311e-01 -9.164813091368235e-01 1.949239104577974e-01 -2.808927698296381e-01 1.930000000000000e-10 1.910000000000000e-11 -4.500000000000000e-11 4.910000000000000e-11 1.530000000000000e-11 2.970000000000000e-11 -1.520000000000000e-11 1.530000000000000e-10 -2.360000000000000e-11 6.950000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>5.730000000000000e+02 2.077233249917857e-01 -9.165061007729706e-01 1.950009924328763e-01 -2.807885333315372e-01 1.930000000000000e-10 1.910000000000000e-11 -4.500000000000000e-11 4.910000000000000e-11 1.530000000000000e-11 2.970000000000000e-11 -1.520000000000000e-11 1.530000000000000e-10 -2.360000000000000e-11 6.950000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>5.740000000000000e+02 2.076825263352942e-01 -9.165308738783126e-01 1.950780647528851e-01 -2.806842962032541e-01 1.930000000000000e-10 1.910000000000000e-11 -4.500000000000000e-11 4.910000000000000e-11 1.530000000000000e-11 2.970000000000000e-11 -1.520000000000000e-11 1.530000000000000e-10 -2.360000000000000e-11 6.950000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>5.750000000000000e+02 2.076417274368310e-01 -9.165556285050902e-01 1.951551272695053e-01 -2.805800584202502e-01 1.930000000000000e-10 1.910000000000000e-11 -4.500000000000000e-11 4.910000000000000e-11 1.530000000000000e-11 2.970000000000000e-11 -1.520000000000000e-11 1.530000000000000e-10 -2.360000000000000e-11 6.950000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>5.760000000000000e+02 2.076009282300014e-01 -9.165803647087010e-01 1.952321798081127e-01 -2.804758199843246e-01 1.930000000000000e-10 1.910000000000000e-11 -4.510000000000000e-11 4.910000000000000e-11 1.530000000000000e-11 2.970000000000000e-11 -1.520000000000000e-11 1.530000000000000e-10 -2.360000000000000e-11 6.950000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>5.770000000000000e+02 2.075601286179220e-01 -9.166050825435772e-01 1.953092221858799e-01 -2.803715809288458e-01 1.930000000000000e-10 1.910000000000000e-11 -4.510000000000000e-11 4.910000000000000e-11 1.530000000000000e-11 2.970000000000000e-11 -1.520000000000000e-11 1.530000000000000e-10 -2.360000000000000e-11 6.950000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>5.780000000000000e+02 2.075193284710072e-01 -9.166297820587929e-01 1.953862542305725e-01 -2.802673413217072e-01 1.930000000000000e-10 1.900000000000000e-11 -4.510000000000000e-11 4.920000000000000e-11 1.530000000000000e-11 2.970000000000000e-11 -1.520000000000000e-11 1.530000000000000e-10 -2.360000000000000e-11 6.950000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>5.790000000000000e+02 2.074785276295641e-01 -9.166544632938124e-01 1.954632757978648e-01 -2.801631012652607e-01 1.930000000000000e-10 1.900000000000000e-11 -4.510000000000000e-11 4.920000000000000e-11 1.530000000000000e-11 2.970000000000000e-11 -1.510000000000000e-11 1.530000000000000e-10 -2.360000000000000e-11 6.950000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>5.800000000000000e+02 2.074377259081046e-01 -9.166791262756440e-01 1.955402867866015e-01 -2.800588608917950e-01 1.930000000000000e-10 1.900000000000000e-11 -4.510000000000000e-11 4.920000000000000e-11 1.530000000000000e-11 2.970000000000000e-11 -1.510000000000000e-11 1.530000000000000e-10 -2.360000000000000e-11 6.950000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>5.810000000000000e+02 2.073969458197532e-01 -9.167037636397817e-01 1.956172890509768e-01 -2.799546263551375e-01 1.930000000000000e-10 1.900000000000000e-11 -4.520000000000000e-11 4.920000000000000e-11 1.520000000000000e-11 2.970000000000000e-11 -1.510000000000000e-11 1.530000000000000e-10 -2.360000000000000e-11 6.950000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>5.820000000000000e+02 2.073561417223713e-01 -9.167283901352278e-01 1.956942788018970e-01 -2.798503858390961e-01 1.930000000000000e-10 1.900000000000000e-11 -4.520000000000000e-11 4.920000000000000e-11 1.520000000000000e-11 2.970000000000000e-11 -1.510000000000000e-11 1.530000000000000e-10 -2.360000000000000e-11 6.950000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>5.830000000000000e+02 2.073153361242422e-01 -9.167529983674073e-01 1.957712580066773e-01 -2.797461455150795e-01 1.930000000000000e-10 1.900000000000000e-11 -4.520000000000000e-11 4.920000000000000e-11 1.520000000000000e-11 2.970000000000000e-11 -1.510000000000000e-11 1.530000000000000e-10 -2.360000000000000e-11 6.950000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>5.840000000000000e+02 2.072745288276367e-01 -9.167775883070046e-01 1.958482267807345e-01 -2.796419055580109e-01 1.930000000000000e-10 1.900000000000000e-11 -4.520000000000000e-11 4.920000000000000e-11 1.520000000000000e-11 2.970000000000000e-11 -1.510000000000000e-11 1.530000000000000e-10 -2.360000000000000e-11 6.950000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>5.850000000000000e+02 2.072337196532762e-01 -9.168021599175269e-01 1.959251852728768e-01 -2.795376661292959e-01 1.930000000000000e-10 1.900000000000000e-11 -4.520000000000000e-11 4.920000000000000e-11 1.520000000000000e-11 2.970000000000000e-11 -1.510000000000000e-11 1.530000000000000e-10 -2.360000000000000e-11 6.950000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>5.860000000000000e+02 2.071929084452257e-01 -9.168267131606788e-01 1.960021336489276e-01 -2.794334273669903e-01 1.930000000000000e-10 1.890000000000000e-11 -4.530000000000000e-11 4.930000000000000e-11 1.520000000000000e-11 2.960000000000000e-11 -1.510000000000000e-11 1.530000000000000e-10 -2.360000000000000e-11 6.940000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.870000000000000e+02 2.071520950737109e-01 -9.168512480021772e-01 1.960790720741770e-01 -2.793291893768935e-01 1.930000000000000e-10 1.890000000000000e-11 -4.530000000000000e-11 4.930000000000000e-11 1.520000000000000e-11 2.960000000000000e-11 -1.510000000000000e-11 1.530000000000000e-10 -2.360000000000000e-11 6.940000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.880000000000000e+02 2.071112794360490e-01 -9.168757644169221e-01 1.961560006965973e-01 -2.792249522266306e-01 1.930000000000000e-10 1.890000000000000e-11 -4.530000000000000e-11 4.930000000000000e-11 1.520000000000000e-11 2.960000000000000e-11 -1.510000000000000e-11 1.530000000000000e-10 -2.360000000000000e-11 6.940000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.890000000000000e+02 2.070704614562775e-01 -9.169002623930337e-01 1.962329196332089e-01 -2.791207159422191e-01 1.930000000000000e-10 1.890000000000000e-11 -4.530000000000000e-11 4.930000000000000e-11 1.520000000000000e-11 2.960000000000000e-11 -1.510000000000000e-11 1.530000000000000e-10 -2.360000000000000e-11 6.940000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.900000000000000e+02 2.070296410836544e-01 -9.169247419342899e-01 1.963098289613296e-01 -2.790164805073040e-01 1.930000000000000e-10 1.890000000000000e-11 -4.530000000000000e-11 4.930000000000000e-11 1.520000000000000e-11 2.960000000000000e-11 -1.500000000000000e-11 1.530000000000000e-10 -2.360000000000000e-11 6.940000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.910000000000000e+02 2.069888611512369e-01 -9.169491891511464e-01 1.963867323608960e-01 -2.789122572189663e-01 1.930000000000000e-10 1.890000000000000e-11 -4.540000000000000e-11 4.930000000000000e-11 1.520000000000000e-11 2.960000000000000e-11 -1.500000000000000e-11 1.530000000000000e-10 -2.360000000000000e-11 6.940000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.920000000000000e+02 2.069480359318673e-01 -9.169736318995820e-01 1.964636225408664e-01 -2.788080232757880e-01 1.930000000000000e-10 1.890000000000000e-11 -4.540000000000000e-11 4.940000000000000e-11 1.520000000000000e-11 2.960000000000000e-11 -1.500000000000000e-11 1.530000000000000e-10 -2.360000000000000e-11 6.940000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.930000000000000e+02 2.069072082933734e-01 -9.169980563149668e-01 1.965405031048862e-01 -2.787037899098144e-01 1.930000000000000e-10 1.890000000000000e-11 -4.540000000000000e-11 4.940000000000000e-11 1.520000000000000e-11 2.960000000000000e-11 -1.500000000000000e-11 1.530000000000000e-10 -2.360000000000000e-11 6.940000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.940000000000000e+02 2.068663782538808e-01 -9.170224624526540e-01 1.966173739909519e-01 -2.785995569815130e-01 1.930000000000000e-10 1.890000000000000e-11 -4.540000000000000e-11 4.940000000000000e-11 1.520000000000000e-11 2.960000000000000e-11 -1.500000000000000e-11 1.530000000000000e-10 -2.360000000000000e-11 6.940000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.950000000000000e+02 2.068255458367831e-01 -9.170468503711329e-01 1.966942351244182e-01 -2.784953243458891e-01 1.930000000000000e-10 1.890000000000000e-11 -4.540000000000000e-11 4.940000000000000e-11 1.520000000000000e-11 2.960000000000000e-11 -1.500000000000000e-11 1.520000000000000e-10 -2.360000000000000e-11 6.940000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.960000000000000e+02 2.067847110650573e-01 -9.170712201272033e-01 1.967710864290042e-01 -2.783910918648315e-01 1.930000000000000e-10 1.880000000000000e-11 -4.550000000000000e-11 4.940000000000000e-11 1.520000000000000e-11 2.960000000000000e-11 -1.500000000000000e-11 1.520000000000000e-10 -2.360000000000000e-11 6.940000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.970000000000000e+02 2.067438739549096e-01 -9.170955717717038e-01 1.968479278360502e-01 -2.782868594193795e-01 1.930000000000000e-10 1.880000000000000e-11 -4.550000000000000e-11 4.940000000000000e-11 1.510000000000000e-11 2.960000000000000e-11 -1.500000000000000e-11 1.520000000000000e-10 -2.360000000000000e-11 6.940000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.980000000000000e+02 2.067030345119235e-01 -9.171199053458867e-01 1.969247592918639e-01 -2.781826269193606e-01 1.930000000000000e-10 1.880000000000000e-11 -4.550000000000000e-11 4.940000000000000e-11 1.510000000000000e-11 2.960000000000000e-11 -1.500000000000000e-11 1.520000000000000e-10 -2.360000000000000e-11 6.940000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>5.990000000000000e+02 2.066621927290031e-01 -9.171442208787636e-01 1.970015807605821e-01 -2.780783943116724e-01 1.930000000000000e-10 1.880000000000000e-11 -4.550000000000000e-11 4.950000000000000e-11 1.510000000000000e-11 2.960000000000000e-11 -1.500000000000000e-11 1.520000000000000e-10 -2.360000000000000e-11 6.940000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.000000000000000e+02 2.066213485874662e-01 -9.171685183855003e-01 1.970783922254113e-01 -2.779741615839322e-01 1.930000000000000e-10 1.880000000000000e-11 -4.560000000000000e-11 4.950000000000000e-11 1.510000000000000e-11 2.960000000000000e-11 -1.500000000000000e-11 1.520000000000000e-10 -2.360000000000000e-11 6.940000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.010000000000000e+02 2.065805364168351e-01 -9.171927867236679e-01 1.971551966562401e-01 -2.778699378976507e-01 1.930000000000000e-10 1.880000000000000e-11 -4.560000000000000e-11 4.950000000000000e-11 1.510000000000000e-11 2.960000000000000e-11 -1.490000000000000e-11 1.520000000000000e-10 -2.360000000000000e-11 6.930000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.020000000000000e+02 2.065396874795343e-01 -9.172170481679413e-01 1.972319881410343e-01 -2.777657050463211e-01 1.930000000000000e-10 1.880000000000000e-11 -4.560000000000000e-11 4.950000000000000e-11 1.510000000000000e-11 2.960000000000000e-11 -1.490000000000000e-11 1.520000000000000e-10 -2.360000000000000e-11 6.930000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.030000000000000e+02 2.064988361126767e-01 -9.172412915485728e-01 1.973087696797622e-01 -2.776614722461050e-01 1.930000000000000e-10 1.880000000000000e-11 -4.560000000000000e-11 4.950000000000000e-11 1.510000000000000e-11 2.960000000000000e-11 -1.490000000000000e-11 1.520000000000000e-10 -2.360000000000000e-11 6.930000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.040000000000000e+02 2.064579823160168e-01 -9.172655168301298e-01 1.973855413211930e-01 -2.775572395915729e-01 1.930000000000000e-10 1.870000000000000e-11 -4.560000000000000e-11 4.950000000000000e-11 1.510000000000000e-11 2.960000000000000e-11 -1.490000000000000e-11 1.520000000000000e-10 -2.360000000000000e-11 6.930000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.050000000000000e+02 2.064171261179741e-01 -9.172897239694791e-01 1.974623031263783e-01 -2.774530071727822e-01 1.940000000000000e-10 1.870000000000000e-11 -4.570000000000000e-11 4.950000000000000e-11 1.510000000000000e-11 2.960000000000000e-11 -1.490000000000000e-11 1.520000000000000e-10 -2.360000000000000e-11 6.930000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.060000000000000e+02 2.063762675828462e-01 -9.173139129190614e-01 1.975390551685905e-01 -2.773487750591214e-01 1.940000000000000e-10 1.870000000000000e-11 -4.570000000000000e-11 4.960000000000000e-11 1.510000000000000e-11 2.960000000000000e-11 -1.490000000000000e-11 1.520000000000000e-10 -2.360000000000000e-11 6.930000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.070000000000000e+02 2.063354068156576e-01 -9.173380836303324e-01 1.976157975336725e-01 -2.772445432840418e-01 1.940000000000000e-10 1.870000000000000e-11 -4.570000000000000e-11 4.960000000000000e-11 1.510000000000000e-11 2.960000000000000e-11 -1.490000000000000e-11 1.520000000000000e-10 -2.360000000000000e-11 6.930000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.080000000000000e+02 2.062945439622351e-01 -9.173622360572512e-01 1.976925303192113e-01 -2.771403118339903e-01 1.940000000000000e-10 1.870000000000000e-11 -4.570000000000000e-11 4.960000000000000e-11 1.510000000000000e-11 2.960000000000000e-11 -1.490000000000000e-11 1.520000000000000e-10 -2.360000000000000e-11 6.930000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.090000000000000e+02 2.062536792053908e-01 -9.173863701597305e-01 1.977692536329592e-01 -2.770360806408724e-01 1.940000000000000e-10 1.870000000000000e-11 -4.570000000000000e-11 4.960000000000000e-11 1.510000000000000e-11 2.960000000000000e-11 -1.490000000000000e-11 1.520000000000000e-10 -2.360000000000000e-11 6.930000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.100000000000000e+02 2.062128127577829e-01 -9.174104859065595e-01 1.978459675891347e-01 -2.769318495802406e-01 1.940000000000000e-10 1.870000000000000e-11 -4.580000000000000e-11 4.960000000000000e-11 1.510000000000000e-11 2.960000000000000e-11 -1.490000000000000e-11 1.520000000000000e-10 -2.360000000000000e-11 6.930000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.110000000000000e+02 2.061719798342692e-01 -9.174345719373196e-01 1.979226753721881e-01 -2.768276278100154e-01 1.940000000000000e-10 1.870000000000000e-11 -4.580000000000000e-11 4.960000000000000e-11 1.510000000000000e-11 2.960000000000000e-11 -1.490000000000000e-11 1.520000000000000e-10 -2.360000000000000e-11 6.930000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.120000000000000e+02 2.061311107137579e-01 -9.174586509262502e-01 1.979993709602723e-01 -2.767233964373701e-01 1.940000000000000e-10 1.860000000000000e-11 -4.580000000000000e-11 4.960000000000000e-11 1.500000000000000e-11 2.960000000000000e-11 -1.480000000000000e-11 1.520000000000000e-10 -2.360000000000000e-11 6.930000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.130000000000000e+02 2.060902406161317e-01 -9.174827115375017e-01 1.980760575191598e-01 -2.766191645389828e-01 1.940000000000000e-10 1.860000000000000e-11 -4.580000000000000e-11 4.970000000000000e-11 1.500000000000000e-11 2.960000000000000e-11 -1.480000000000000e-11 1.520000000000000e-10 -2.360000000000000e-11 6.930000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.140000000000000e+02 2.060493697668507e-01 -9.175067537893031e-01 1.981527351296349e-01 -2.765149318397542e-01 1.940000000000000e-10 1.860000000000000e-11 -4.590000000000000e-11 4.970000000000000e-11 1.500000000000000e-11 2.960000000000000e-11 -1.480000000000000e-11 1.520000000000000e-10 -2.360000000000000e-11 6.930000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.150000000000000e+02 2.060084983707846e-01 -9.175307777105833e-01 1.982294038459204e-01 -2.764106980630776e-01 1.940000000000000e-10 1.860000000000000e-11 -4.590000000000000e-11 4.970000000000000e-11 1.500000000000000e-11 2.960000000000000e-11 -1.480000000000000e-11 1.520000000000000e-10 -2.360000000000000e-11 6.930000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.160000000000000e+02 2.059676266066142e-01 -9.175547833380860e-01 1.983060636921268e-01 -2.763064629471602e-01 1.940000000000000e-10 1.860000000000000e-11 -4.590000000000000e-11 4.970000000000000e-11 1.500000000000000e-11 2.960000000000000e-11 -1.480000000000000e-11 1.520000000000000e-10 -2.360000000000000e-11 6.920000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.170000000000000e+02 2.059267546237383e-01 -9.175787707129375e-01 1.983827146606510e-01 -2.762022262599270e-01 1.940000000000000e-10 1.860000000000000e-11 -4.590000000000000e-11 4.970000000000000e-11 1.500000000000000e-11 2.960000000000000e-11 -1.480000000000000e-11 1.520000000000000e-10 -2.360000000000000e-11 6.920000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.180000000000000e+02 2.058858825413097e-01 -9.176027398769472e-01 1.984593567135607e-01 -2.760979878111126e-01 1.940000000000000e-10 1.860000000000000e-11 -4.590000000000000e-11 4.970000000000000e-11 1.500000000000000e-11 2.960000000000000e-11 -1.480000000000000e-11 1.510000000000000e-10 -2.360000000000000e-11 6.920000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.190000000000000e+02 2.058450104489463e-01 -9.176266908686110e-01 1.985359897873229e-01 -2.759937474617202e-01 1.940000000000000e-10 1.860000000000000e-11 -4.600000000000000e-11 4.970000000000000e-11 1.500000000000000e-11 2.960000000000000e-11 -1.480000000000000e-11 1.510000000000000e-10 -2.360000000000000e-11 6.920000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.200000000000000e+02 2.058041384086948e-01 -9.176506237194675e-01 1.986126137984336e-01 -2.758895051307340e-01 1.940000000000000e-10 1.860000000000000e-11 -4.600000000000000e-11 4.970000000000000e-11 1.500000000000000e-11 2.960000000000000e-11 -1.480000000000000e-11 1.510000000000000e-10 -2.360000000000000e-11 6.920000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.210000000000000e+02 2.057632958205930e-01 -9.176745289373023e-01 1.986892312675352e-01 -2.757852686621668e-01 1.940000000000000e-10 1.850000000000000e-11 -4.600000000000000e-11 4.980000000000000e-11 1.500000000000000e-11 2.960000000000000e-11 -1.480000000000000e-11 1.510000000000000e-10 -2.360000000000000e-11 6.920000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.220000000000000e+02 2.057224239734511e-01 -9.176984255593457e-01 1.987658368712464e-01 -2.756810223668991e-01 1.940000000000000e-10 1.850000000000000e-11 -4.600000000000000e-11 4.980000000000000e-11 1.500000000000000e-11 2.950000000000000e-11 -1.480000000000000e-11 1.510000000000000e-10 -2.360000000000000e-11 6.920000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.230000000000000e+02 2.056815522237266e-01 -9.177223040674155e-01 1.988424331306157e-01 -2.755767742004562e-01 1.940000000000000e-10 1.850000000000000e-11 -4.600000000000000e-11 4.980000000000000e-11 1.500000000000000e-11 2.950000000000000e-11 -1.470000000000000e-11 1.510000000000000e-10 -2.360000000000000e-11 6.920000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.240000000000000e+02 2.056406805472448e-01 -9.177461644451735e-01 1.989190199645699e-01 -2.754725243042830e-01 1.940000000000000e-10 1.850000000000000e-11 -4.610000000000000e-11 4.980000000000000e-11 1.500000000000000e-11 2.950000000000000e-11 -1.470000000000000e-11 1.510000000000000e-10 -2.360000000000000e-11 6.920000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.250000000000000e+02 2.055998089056101e-01 -9.177700066652581e-01 1.989955973054239e-01 -2.753682728577970e-01 1.940000000000000e-10 1.850000000000000e-11 -4.610000000000000e-11 4.980000000000000e-11 1.500000000000000e-11 2.950000000000000e-11 -1.470000000000000e-11 1.510000000000000e-10 -2.360000000000000e-11 6.920000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.260000000000000e+02 2.055589372495067e-01 -9.177938306921950e-01 1.990721651003146e-01 -2.752640200652333e-01 1.940000000000000e-10 1.850000000000000e-11 -4.610000000000000e-11 4.980000000000000e-11 1.500000000000000e-11 2.950000000000000e-11 -1.470000000000000e-11 1.510000000000000e-10 -2.360000000000000e-11 6.920000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.270000000000000e+02 2.055180655224563e-01 -9.178176364864615e-01 1.991487233102756e-01 -2.751597661399650e-01 1.940000000000000e-10 1.850000000000000e-11 -4.610000000000000e-11 4.990000000000000e-11 1.500000000000000e-11 2.950000000000000e-11 -1.470000000000000e-11 1.510000000000000e-10 -2.360000000000000e-11 6.920000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.280000000000000e+02 2.054771936649053e-01 -9.178414240089612e-01 1.992252719079752e-01 -2.750555112881600e-01 1.940000000000000e-10 1.850000000000000e-11 -4.620000000000000e-11 4.990000000000000e-11 1.490000000000000e-11 2.950000000000000e-11 -1.470000000000000e-11 1.510000000000000e-10 -2.360000000000000e-11 6.920000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.290000000000000e+02 2.054363216186834e-01 -9.178651932261594e-01 1.993018108733967e-01 -2.749512556913947e-01 1.940000000000000e-10 1.840000000000000e-11 -4.620000000000000e-11 4.990000000000000e-11 1.490000000000000e-11 2.950000000000000e-11 -1.470000000000000e-11 1.510000000000000e-10 -2.360000000000000e-11 6.920000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.300000000000000e+02 2.053954493307614e-01 -9.178889441146847e-01 1.993783401913558e-01 -2.748469994902328e-01 1.940000000000000e-10 1.840000000000000e-11 -4.620000000000000e-11 4.990000000000000e-11 1.490000000000000e-11 2.950000000000000e-11 -1.470000000000000e-11 1.510000000000000e-10 -2.360000000000000e-11 6.920000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.310000000000000e+02 2.053546104325411e-01 -9.179126657601328e-01 1.994548628926316e-01 -2.747427518237880e-01 1.940000000000000e-10 1.840000000000000e-11 -4.620000000000000e-11 4.990000000000000e-11 1.490000000000000e-11 2.950000000000000e-11 -1.470000000000000e-11 1.510000000000000e-10 -2.370000000000000e-11 6.910000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.320000000000000e+02 2.053137375381454e-01 -9.179363799796888e-01 1.995313728806317e-01 -2.746384946147794e-01 1.940000000000000e-10 1.840000000000000e-11 -4.620000000000000e-11 4.990000000000000e-11 1.490000000000000e-11 2.950000000000000e-11 -1.470000000000000e-11 1.510000000000000e-10 -2.360000000000000e-11 6.910000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.330000000000000e+02 2.052728642998436e-01 -9.179600758939552e-01 1.996078731849206e-01 -2.745342368621710e-01 1.940000000000000e-10 1.840000000000000e-11 -4.630000000000000e-11 4.990000000000000e-11 1.490000000000000e-11 2.950000000000000e-11 -1.470000000000000e-11 1.510000000000000e-10 -2.360000000000000e-11 6.910000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.340000000000000e+02 2.052319907003811e-01 -9.179837535462416e-01 1.996843637970387e-01 -2.744299784522160e-01 1.940000000000000e-10 1.840000000000000e-11 -4.630000000000000e-11 4.990000000000000e-11 1.490000000000000e-11 2.950000000000000e-11 -1.460000000000000e-11 1.510000000000000e-10 -2.360000000000000e-11 6.910000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.350000000000000e+02 2.051911167279737e-01 -9.180074129951029e-01 1.997608447126511e-01 -2.743257192128616e-01 1.940000000000000e-10 1.840000000000000e-11 -4.630000000000000e-11 5.000000000000000e-11 1.490000000000000e-11 2.950000000000000e-11 -1.460000000000000e-11 1.510000000000000e-10 -2.360000000000000e-11 6.910000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.360000000000000e+02 2.051502423701060e-01 -9.180310543108260e-01 1.998373159355193e-01 -2.742214589271376e-01 1.940000000000000e-10 1.840000000000000e-11 -4.630000000000000e-11 5.000000000000000e-11 1.490000000000000e-11 2.950000000000000e-11 -1.460000000000000e-11 1.510000000000000e-10 -2.370000000000000e-11 6.910000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.370000000000000e+02 2.051093676076473e-01 -9.180546775706143e-01 1.999137774808936e-01 -2.741171973511086e-01 1.940000000000000e-10 1.830000000000000e-11 -4.630000000000000e-11 5.000000000000000e-11 1.490000000000000e-11 2.950000000000000e-11 -1.460000000000000e-11 1.510000000000000e-10 -2.370000000000000e-11 6.910000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.380000000000000e+02 2.050684924095982e-01 -9.180782828530257e-01 1.999902293784036e-01 -2.740129342342579e-01 1.940000000000000e-10 1.830000000000000e-11 -4.640000000000000e-11 5.000000000000000e-11 1.490000000000000e-11 2.950000000000000e-11 -1.460000000000000e-11 1.510000000000000e-10 -2.370000000000000e-11 6.910000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.390000000000000e+02 2.050276167290923e-01 -9.181018702324626e-01 2.000666716736144e-01 -2.739086693397735e-01 1.940000000000000e-10 1.830000000000000e-11 -4.640000000000000e-11 5.000000000000000e-11 1.490000000000000e-11 2.950000000000000e-11 -1.460000000000000e-11 1.510000000000000e-10 -2.360000000000000e-11 6.910000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.400000000000000e+02 2.049867404993994e-01 -9.181254397740584e-01 2.001431044290376e-01 -2.738044024639325e-01 1.940000000000000e-10 1.830000000000000e-11 -4.640000000000000e-11 5.000000000000000e-11 1.490000000000000e-11 2.950000000000000e-11 -1.460000000000000e-11 1.510000000000000e-10 -2.360000000000000e-11 6.910000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.410000000000000e+02 2.049458999434498e-01 -9.181489797782654e-01 2.002195310543179e-01 -2.737001432460144e-01 1.940000000000000e-10 1.830000000000000e-11 -4.640000000000000e-11 5.000000000000000e-11 1.490000000000000e-11 2.950000000000000e-11 -1.460000000000000e-11 1.500000000000000e-10 -2.370000000000000e-11 6.910000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.420000000000000e+02 2.049050223449134e-01 -9.181725137827438e-01 2.002959449862906e-01 -2.735958719969228e-01 1.940000000000000e-10 1.830000000000000e-11 -4.650000000000000e-11 5.010000000000000e-11 1.490000000000000e-11 2.950000000000000e-11 -1.460000000000000e-11 1.500000000000000e-10 -2.370000000000000e-11 6.910000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.430000000000000e+02 2.048641438958001e-01 -9.181960300501502e-01 2.003723496612479e-01 -2.734915984764710e-01 1.940000000000000e-10 1.830000000000000e-11 -4.650000000000000e-11 5.010000000000000e-11 1.490000000000000e-11 2.950000000000000e-11 -1.460000000000000e-11 1.500000000000000e-10 -2.370000000000000e-11 6.910000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.440000000000000e+02 2.048232644752784e-01 -9.182195285775494e-01 2.004487451963888e-01 -2.733873227084728e-01 1.940000000000000e-10 1.830000000000000e-11 -4.650000000000000e-11 5.010000000000000e-11 1.480000000000000e-11 2.950000000000000e-11 -1.460000000000000e-11 1.500000000000000e-10 -2.370000000000000e-11 6.910000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.450000000000000e+02 2.047823839648886e-01 -9.182430093443560e-01 2.005251317141901e-01 -2.732830447702247e-01 1.940000000000000e-10 1.830000000000000e-11 -4.650000000000000e-11 5.010000000000000e-11 1.480000000000000e-11 2.950000000000000e-11 -1.450000000000000e-11 1.500000000000000e-10 -2.360000000000000e-11 6.910000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.460000000000000e+02 2.047415022540329e-01 -9.182664723153487e-01 2.006015093387917e-01 -2.731787647810227e-01 1.940000000000000e-10 1.820000000000000e-11 -4.650000000000000e-11 5.010000000000000e-11 1.480000000000000e-11 2.950000000000000e-11 -1.450000000000000e-11 1.500000000000000e-10 -2.370000000000000e-11 6.899999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>6.470000000000000e+02 2.047006192442798e-01 -9.182899174443450e-01 2.006778781930176e-01 -2.730744828888538e-01 1.940000000000000e-10 1.820000000000000e-11 -4.660000000000000e-11 5.010000000000000e-11 1.480000000000000e-11 2.950000000000000e-11 -1.450000000000000e-11 1.500000000000000e-10 -2.370000000000000e-11 6.899999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>6.480000000000000e+02 2.046597348508542e-01 -9.183133446788961e-01 2.007542383959454e-01 -2.729701992553417e-01 1.940000000000000e-10 1.820000000000000e-11 -4.660000000000000e-11 5.010000000000000e-11 1.480000000000000e-11 2.950000000000000e-11 -1.450000000000000e-11 1.500000000000000e-10 -2.370000000000000e-11 6.899999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>6.490000000000000e+02 2.046188490004509e-01 -9.183367539651520e-01 2.008305900610036e-01 -2.728659140424615e-01 1.940000000000000e-10 1.820000000000000e-11 -4.660000000000000e-11 5.020000000000000e-11 1.480000000000000e-11 2.950000000000000e-11 -1.450000000000000e-11 1.500000000000000e-10 -2.370000000000000e-11 6.899999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>6.500000000000000e+02 2.045779616262418e-01 -9.183601452529216e-01 2.009069332955264e-01 -2.727616273995878e-01 1.940000000000000e-10 1.820000000000000e-11 -4.660000000000000e-11 5.020000000000000e-11 1.480000000000000e-11 2.950000000000000e-11 -1.450000000000000e-11 1.500000000000000e-10 -2.370000000000000e-11 6.899999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>6.510000000000000e+02 2.045371063876368e-01 -9.183835075901949e-01 2.009832713413696e-01 -2.726573485857741e-01 1.940000000000000e-10 1.820000000000000e-11 -4.660000000000000e-11 5.020000000000000e-11 1.480000000000000e-11 2.950000000000000e-11 -1.450000000000000e-11 1.500000000000000e-10 -2.370000000000000e-11 6.899999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>6.520000000000000e+02 2.044962157560330e-01 -9.184068627654151e-01 2.010595980231706e-01 -2.725530594390955e-01 1.940000000000000e-10 1.820000000000000e-11 -4.670000000000000e-11 5.020000000000000e-11 1.480000000000000e-11 2.950000000000000e-11 -1.450000000000000e-11 1.500000000000000e-10 -2.370000000000000e-11 6.899999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>6.530000000000000e+02 2.044553233681914e-01 -9.184301998500842e-01 2.011359165749080e-01 -2.724487691536055e-01 1.940000000000000e-10 1.810000000000000e-11 -4.670000000000000e-11 5.020000000000000e-11 1.480000000000000e-11 2.950000000000000e-11 -1.450000000000000e-11 1.500000000000000e-10 -2.370000000000000e-11 6.899999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>6.540000000000000e+02 2.044144291153950e-01 -9.184535188398562e-01 2.012122270952132e-01 -2.723444777620752e-01 1.940000000000000e-10 1.810000000000000e-11 -4.670000000000000e-11 5.020000000000000e-11 1.480000000000000e-11 2.950000000000000e-11 -1.450000000000000e-11 1.500000000000000e-10 -2.370000000000000e-11 6.899999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>6.550000000000000e+02 2.043735328727030e-01 -9.184768197426889e-01 2.012885296839018e-01 -2.722401852669427e-01 1.940000000000000e-10 1.810000000000000e-11 -4.670000000000000e-11 5.020000000000000e-11 1.480000000000000e-11 2.950000000000000e-11 -1.450000000000000e-11 1.500000000000000e-10 -2.370000000000000e-11 6.899999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>6.560000000000000e+02 2.043326345031643e-01 -9.185001025767507e-01 2.013648244426946e-01 -2.721358916436003e-01 1.940000000000000e-10 1.810000000000000e-11 -4.680000000000000e-11 5.030000000000000e-11 1.480000000000000e-11 2.950000000000000e-11 -1.440000000000000e-11 1.500000000000000e-10 -2.370000000000000e-11 6.899999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>6.570000000000000e+02 2.042917338659315e-01 -9.185233673668826e-01 2.014411114750794e-01 -2.720315968462844e-01 1.940000000000000e-10 1.810000000000000e-11 -4.680000000000000e-11 5.030000000000000e-11 1.480000000000000e-11 2.950000000000000e-11 -1.440000000000000e-11 1.500000000000000e-10 -2.370000000000000e-11 6.899999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>6.580000000000000e+02 2.042508308269726e-01 -9.185466141411022e-01 2.015173908833368e-01 -2.719273008139880e-01 1.940000000000000e-10 1.810000000000000e-11 -4.680000000000000e-11 5.030000000000000e-11 1.480000000000000e-11 2.950000000000000e-11 -1.440000000000000e-11 1.500000000000000e-10 -2.370000000000000e-11 6.899999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>6.590000000000000e+02 2.042099252708324e-01 -9.185698429266660e-01 2.015936627651479e-01 -2.718230034774339e-01 1.940000000000000e-10 1.810000000000000e-11 -4.680000000000000e-11 5.030000000000000e-11 1.470000000000000e-11 2.950000000000000e-11 -1.440000000000000e-11 1.500000000000000e-10 -2.370000000000000e-11 6.890000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.600000000000000e+02 2.041690171086266e-01 -9.185930537473942e-01 2.016699272076612e-01 -2.717187047665122e-01 1.940000000000000e-10 1.810000000000000e-11 -4.680000000000000e-11 5.030000000000000e-11 1.470000000000000e-11 2.950000000000000e-11 -1.440000000000000e-11 1.500000000000000e-10 -2.370000000000000e-11 6.890000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.610000000000000e+02 2.041281393798777e-01 -9.186162359217985e-01 2.017461874069010e-01 -2.716144136104625e-01 1.940000000000000e-10 1.800000000000000e-11 -4.690000000000000e-11 5.030000000000000e-11 1.470000000000000e-11 2.940000000000000e-11 -1.440000000000000e-11 1.500000000000000e-10 -2.370000000000000e-11 6.890000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.620000000000000e+02 2.040872258657944e-01 -9.186394108631240e-01 2.018224371667000e-01 -2.715101119729250e-01 1.950000000000000e-10 1.800000000000000e-11 -4.690000000000000e-11 5.030000000000000e-11 1.470000000000000e-11 2.940000000000000e-11 -1.440000000000000e-11 1.500000000000000e-10 -2.370000000000000e-11 6.890000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.630000000000000e+02 2.040463096647783e-01 -9.186625678778350e-01 2.018986796308216e-01 -2.714058088096469e-01 1.950000000000000e-10 1.800000000000000e-11 -4.690000000000000e-11 5.030000000000000e-11 1.470000000000000e-11 2.940000000000000e-11 -1.440000000000000e-11 1.500000000000000e-10 -2.370000000000000e-11 6.890000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.640000000000000e+02 2.040053907943298e-01 -9.186857069707950e-01 2.019749147876417e-01 -2.713015041074198e-01 1.950000000000000e-10 1.800000000000000e-11 -4.690000000000000e-11 5.040000000000000e-11 1.470000000000000e-11 2.940000000000000e-11 -1.440000000000000e-11 1.500000000000000e-10 -2.370000000000000e-11 6.890000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.650000000000000e+02 2.039644692775023e-01 -9.187088281470579e-01 2.020511425869723e-01 -2.711971978769432e-01 1.950000000000000e-10 1.800000000000000e-11 -4.690000000000000e-11 5.040000000000000e-11 1.470000000000000e-11 2.940000000000000e-11 -1.440000000000000e-11 1.490000000000000e-10 -2.370000000000000e-11 6.890000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.660000000000000e+02 2.039235451299880e-01 -9.187319314152255e-01 2.021273629376846e-01 -2.710928901530343e-01 1.950000000000000e-10 1.800000000000000e-11 -4.700000000000000e-11 5.040000000000000e-11 1.470000000000000e-11 2.940000000000000e-11 -1.430000000000000e-11 1.490000000000000e-10 -2.370000000000000e-11 6.890000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.670000000000000e+02 2.038826183478741e-01 -9.187550167910952e-01 2.022035757060678e-01 -2.709885809927978e-01 1.950000000000000e-10 1.800000000000000e-11 -4.700000000000000e-11 5.040000000000000e-11 1.470000000000000e-11 2.940000000000000e-11 -1.430000000000000e-11 1.490000000000000e-10 -2.370000000000000e-11 6.890000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.680000000000000e+02 2.038416889004520e-01 -9.187780843002230e-01 2.022797807162458e-01 -2.708842704721173e-01 1.950000000000000e-10 1.800000000000000e-11 -4.700000000000000e-11 5.040000000000000e-11 1.470000000000000e-11 2.940000000000000e-11 -1.430000000000000e-11 1.490000000000000e-10 -2.370000000000000e-11 6.890000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.690000000000000e+02 2.038007567267231e-01 -9.188011339799174e-01 2.023559777517268e-01 -2.707799586804306e-01 1.950000000000000e-10 1.800000000000000e-11 -4.700000000000000e-11 5.040000000000000e-11 1.470000000000000e-11 2.940000000000000e-11 -1.430000000000000e-11 1.490000000000000e-10 -2.370000000000000e-11 6.890000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.700000000000000e+02 2.037598217358180e-01 -9.188241658799829e-01 2.024321665587740e-01 -2.706756457154247e-01 1.950000000000000e-10 1.790000000000000e-11 -4.700000000000000e-11 5.040000000000000e-11 1.470000000000000e-11 2.940000000000000e-11 -1.430000000000000e-11 1.490000000000000e-10 -2.370000000000000e-11 6.890000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.710000000000000e+02 2.037189213173530e-01 -9.188471679439457e-01 2.025083504433304e-01 -2.705713419033984e-01 1.950000000000000e-10 1.790000000000000e-11 -4.710000000000000e-11 5.050000000000000e-11 1.470000000000000e-11 2.940000000000000e-11 -1.430000000000000e-11 1.490000000000000e-10 -2.370000000000000e-11 6.880000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.720000000000000e+02 2.036779803303213e-01 -9.188701644811863e-01 2.025845219182164e-01 -2.704670268887625e-01 1.950000000000000e-10 1.790000000000000e-11 -4.710000000000000e-11 5.050000000000000e-11 1.470000000000000e-11 2.940000000000000e-11 -1.430000000000000e-11 1.490000000000000e-10 -2.370000000000000e-11 6.880000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.730000000000000e+02 2.036370361411783e-01 -9.188931434518828e-01 2.026606842467611e-01 -2.703627109817265e-01 1.950000000000000e-10 1.790000000000000e-11 -4.710000000000000e-11 5.050000000000000e-11 1.470000000000000e-11 2.940000000000000e-11 -1.430000000000000e-11 1.490000000000000e-10 -2.370000000000000e-11 6.880000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.740000000000000e+02 2.035960886145241e-01 -9.189161049392778e-01 2.027368371011060e-01 -2.702583942569275e-01 1.950000000000000e-10 1.790000000000000e-11 -4.710000000000000e-11 5.050000000000000e-11 1.470000000000000e-11 2.940000000000000e-11 -1.430000000000000e-11 1.490000000000000e-10 -2.370000000000000e-11 6.880000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.750000000000000e+02 2.035551376290850e-01 -9.189390490257304e-01 2.028129801613671e-01 -2.701540767757454e-01 1.950000000000000e-10 1.790000000000000e-11 -4.710000000000000e-11 5.050000000000000e-11 1.460000000000000e-11 2.940000000000000e-11 -1.430000000000000e-11 1.490000000000000e-10 -2.370000000000000e-11 6.880000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.760000000000000e+02 2.035141830870780e-01 -9.189619757880040e-01 2.028891131296686e-01 -2.700497585847175e-01 1.950000000000000e-10 1.790000000000000e-11 -4.720000000000000e-11 5.050000000000000e-11 1.460000000000000e-11 2.940000000000000e-11 -1.430000000000000e-11 1.490000000000000e-10 -2.370000000000000e-11 6.880000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.770000000000000e+02 2.034732249208674e-01 -9.189848852929112e-01 2.029652357436448e-01 -2.699454397151462e-01 1.950000000000000e-10 1.780000000000000e-11 -4.720000000000000e-11 5.050000000000000e-11 1.460000000000000e-11 2.940000000000000e-11 -1.420000000000000e-11 1.490000000000000e-10 -2.370000000000000e-11 6.880000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.780000000000000e+02 2.034322630995917e-01 -9.190077775930996e-01 2.030413477881831e-01 -2.698411201835788e-01 1.950000000000000e-10 1.780000000000000e-11 -4.720000000000000e-11 5.060000000000000e-11 1.460000000000000e-11 2.940000000000000e-11 -1.420000000000000e-11 1.490000000000000e-10 -2.370000000000000e-11 6.880000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.790000000000000e+02 2.033912976336521e-01 -9.190306527242180e-01 2.031174491043840e-01 -2.697367999912605e-01 1.950000000000000e-10 1.780000000000000e-11 -4.720000000000000e-11 5.060000000000000e-11 1.460000000000000e-11 2.940000000000000e-11 -1.420000000000000e-11 1.490000000000000e-10 -2.370000000000000e-11 6.880000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.800000000000000e+02 2.033503285778989e-01 -9.190535107028714e-01 2.031935395945342e-01 -2.696324791248865e-01 1.950000000000000e-10 1.780000000000000e-11 -4.730000000000000e-11 5.060000000000000e-11 1.460000000000000e-11 2.940000000000000e-11 -1.420000000000000e-11 1.490000000000000e-10 -2.370000000000000e-11 6.880000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.810000000000000e+02 2.033093801895025e-01 -9.190763437250157e-01 2.032696215673147e-01 -2.695281641682328e-01 1.950000000000000e-10 1.780000000000000e-11 -4.730000000000000e-11 5.060000000000000e-11 1.460000000000000e-11 2.940000000000000e-11 -1.420000000000000e-11 1.490000000000000e-10 -2.370000000000000e-11 6.870000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>6.820000000000000e+02 2.032684042986552e-01 -9.190991673727983e-01 2.033456903543852e-01 -2.694238418603782e-01 1.950000000000000e-10 1.780000000000000e-11 -4.730000000000000e-11 5.060000000000000e-11 1.460000000000000e-11 2.940000000000000e-11 -1.420000000000000e-11 1.490000000000000e-10 -2.370000000000000e-11 6.870000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>6.830000000000000e+02 2.032274252492234e-01 -9.191219738086027e-01 2.034217483640325e-01 -2.693195187528558e-01 1.950000000000000e-10 1.780000000000000e-11 -4.730000000000000e-11 5.060000000000000e-11 1.460000000000000e-11 2.940000000000000e-11 -1.420000000000000e-11 1.490000000000000e-10 -2.370000000000000e-11 6.870000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>6.840000000000000e+02 2.031864432614503e-01 -9.191447629857551e-01 2.034977956904161e-01 -2.692151947787555e-01 1.950000000000000e-10 1.780000000000000e-11 -4.730000000000000e-11 5.060000000000000e-11 1.460000000000000e-11 2.940000000000000e-11 -1.420000000000000e-11 1.490000000000000e-10 -2.370000000000000e-11 6.870000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>6.850000000000000e+02 2.031454585833190e-01 -9.191675348509604e-01 2.035738324394394e-01 -2.691108698638927e-01 1.950000000000000e-10 1.780000000000000e-11 -4.740000000000000e-11 5.060000000000000e-11 1.460000000000000e-11 2.940000000000000e-11 -1.420000000000000e-11 1.490000000000000e-10 -2.370000000000000e-11 6.870000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>6.860000000000000e+02 2.031044714801959e-01 -9.191902893499001e-01 2.036498587102226e-01 -2.690065439295184e-01 1.950000000000000e-10 1.770000000000000e-11 -4.740000000000000e-11 5.070000000000000e-11 1.460000000000000e-11 2.940000000000000e-11 -1.420000000000000e-11 1.490000000000000e-10 -2.370000000000000e-11 6.870000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>6.870000000000000e+02 2.030634822243564e-01 -9.192130264318931e-01 2.037258745785049e-01 -2.689022168968891e-01 1.950000000000000e-10 1.770000000000000e-11 -4.740000000000000e-11 5.070000000000000e-11 1.460000000000000e-11 2.940000000000000e-11 -1.420000000000000e-11 1.490000000000000e-10 -2.370000000000000e-11 6.870000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>6.880000000000000e+02 2.030224910855694e-01 -9.192357460534030e-01 2.038018800848331e-01 -2.687978886913752e-01 1.950000000000000e-10 1.770000000000000e-11 -4.740000000000000e-11 5.070000000000000e-11 1.460000000000000e-11 2.940000000000000e-11 -1.410000000000000e-11 1.480000000000000e-10 -2.370000000000000e-11 6.870000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>6.890000000000000e+02 2.029814983238329e-01 -9.192584481802956e-01 2.038778752274818e-01 -2.686935592456474e-01 1.950000000000000e-10 1.770000000000000e-11 -4.740000000000000e-11 5.070000000000000e-11 1.460000000000000e-11 2.940000000000000e-11 -1.410000000000000e-11 1.480000000000000e-10 -2.370000000000000e-11 6.870000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>6.900000000000000e+02 2.029405041841254e-01 -9.192811327889208e-01 2.039538599612854e-01 -2.685892285008913e-01 1.950000000000000e-10 1.770000000000000e-11 -4.750000000000000e-11 5.070000000000000e-11 1.460000000000000e-11 2.940000000000000e-11 -1.410000000000000e-11 1.480000000000000e-10 -2.370000000000000e-11 6.870000000000001e-11</ATTLIST>\n\t\t\t<ATTLIST>6.910000000000000e+02 2.028995541179263e-01 -9.193037852689074e-01 2.040298386552564e-01 -2.684849088260182e-01 1.950000000000000e-10 1.770000000000000e-11 -4.750000000000000e-11 5.070000000000000e-11 1.450000000000000e-11 2.940000000000000e-11 -1.410000000000000e-11 1.480000000000000e-10 -2.370000000000000e-11 6.860000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.920000000000000e+02 2.028585578963082e-01 -9.193264348072591e-01 2.041058023037717e-01 -2.683805753379671e-01 1.950000000000000e-10 1.770000000000000e-11 -4.750000000000000e-11 5.070000000000000e-11 1.450000000000000e-11 2.940000000000000e-11 -1.410000000000000e-11 1.480000000000000e-10 -2.370000000000000e-11 6.860000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.930000000000000e+02 2.028175609438579e-01 -9.193490668039136e-01 2.041817552358375e-01 -2.682762404097132e-01 1.950000000000000e-10 1.760000000000000e-11 -4.750000000000000e-11 5.080000000000000e-11 1.450000000000000e-11 2.940000000000000e-11 -1.410000000000000e-11 1.480000000000000e-10 -2.370000000000000e-11 6.860000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.940000000000000e+02 2.027765634562881e-01 -9.193716812591618e-01 2.042576973386960e-01 -2.681719039896869e-01 1.950000000000000e-10 1.760000000000000e-11 -4.760000000000000e-11 5.080000000000000e-11 1.450000000000000e-11 2.940000000000000e-11 -1.410000000000000e-11 1.480000000000000e-10 -2.370000000000000e-11 6.860000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.950000000000000e+02 2.027355656262566e-01 -9.193942781729627e-01 2.043336285213083e-01 -2.680675660133740e-01 1.950000000000000e-10 1.760000000000000e-11 -4.760000000000000e-11 5.080000000000000e-11 1.450000000000000e-11 2.940000000000000e-11 -1.410000000000000e-11 1.480000000000000e-10 -2.370000000000000e-11 6.860000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.960000000000000e+02 2.026945676449032e-01 -9.194168575437328e-01 2.044095487280499e-01 -2.679632263958027e-01 1.950000000000000e-10 1.760000000000000e-11 -4.760000000000000e-11 5.080000000000000e-11 1.450000000000000e-11 2.930000000000000e-11 -1.410000000000000e-11 1.480000000000000e-10 -2.370000000000000e-11 6.860000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.970000000000000e+02 2.026535696997324e-01 -9.194394193679104e-01 2.044854579493932e-01 -2.678588850263937e-01 1.950000000000000e-10 1.760000000000000e-11 -4.760000000000000e-11 5.080000000000000e-11 1.450000000000000e-11 2.930000000000000e-11 -1.410000000000000e-11 1.480000000000000e-10 -2.370000000000000e-11 6.860000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.980000000000000e+02 2.026125719702950e-01 -9.194619636410025e-01 2.045613562259794e-01 -2.677545417654044e-01 1.950000000000000e-10 1.760000000000000e-11 -4.760000000000000e-11 5.080000000000000e-11 1.450000000000000e-11 2.930000000000000e-11 -1.410000000000000e-11 1.480000000000000e-10 -2.370000000000000e-11 6.860000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>6.990000000000000e+02 2.025715746211443e-01 -9.194844903589223e-01 2.046372436480008e-01 -2.676501964450089e-01 1.950000000000000e-10 1.760000000000000e-11 -4.770000000000000e-11 5.080000000000000e-11 1.450000000000000e-11 2.930000000000000e-11 -1.400000000000000e-11 1.480000000000000e-10 -2.370000000000000e-11 6.860000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.000000000000000e+02 2.025305777930677e-01 -9.195069995203032e-01 2.047131203500201e-01 -2.675458488718024e-01 1.950000000000000e-10 1.760000000000000e-11 -4.770000000000000e-11 5.080000000000000e-11 1.450000000000000e-11 2.930000000000000e-11 -1.400000000000000e-11 1.480000000000000e-10 -2.370000000000000e-11 6.860000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.010000000000000e+02 2.024896106598300e-01 -9.195294817524393e-01 2.047889894013712e-01 -2.674415068438067e-01 1.950000000000000e-10 1.750000000000000e-11 -4.770000000000000e-11 5.090000000000000e-11 1.450000000000000e-11 2.930000000000000e-11 -1.400000000000000e-11 1.480000000000000e-10 -2.370000000000000e-11 6.860000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.020000000000000e+02 2.024486151692182e-01 -9.195519558151065e-01 2.048648452000430e-01 -2.673371541216083e-01 1.950000000000000e-10 1.750000000000000e-11 -4.770000000000000e-11 5.090000000000000e-11 1.450000000000000e-11 2.930000000000000e-11 -1.400000000000000e-11 1.480000000000000e-10 -2.370000000000000e-11 6.860000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.030000000000000e+02 2.024076204187637e-01 -9.195744123460294e-01 2.049406908485491e-01 -2.672327984911054e-01 1.950000000000000e-10 1.750000000000000e-11 -4.780000000000000e-11 5.090000000000000e-11 1.450000000000000e-11 2.930000000000000e-11 -1.400000000000000e-11 1.480000000000000e-10 -2.370000000000000e-11 6.850000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.040000000000000e+02 2.023666264072428e-01 -9.195968513641719e-01 2.050165265508740e-01 -2.671284397413867e-01 1.950000000000000e-10 1.750000000000000e-11 -4.780000000000000e-11 5.090000000000000e-11 1.450000000000000e-11 2.930000000000000e-11 -1.400000000000000e-11 1.480000000000000e-10 -2.370000000000000e-11 6.850000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.050000000000000e+02 2.023256331031492e-01 -9.196192728922212e-01 2.050923524971602e-01 -2.670240776817192e-01 1.950000000000000e-10 1.750000000000000e-11 -4.780000000000000e-11 5.090000000000000e-11 1.450000000000000e-11 2.930000000000000e-11 -1.400000000000000e-11 1.480000000000000e-10 -2.370000000000000e-11 6.850000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.060000000000000e+02 2.022846404545959e-01 -9.196416769541382e-01 2.051681688559620e-01 -2.669197121484795e-01 1.950000000000000e-10 1.750000000000000e-11 -4.780000000000000e-11 5.090000000000000e-11 1.440000000000000e-11 2.930000000000000e-11 -1.400000000000000e-11 1.480000000000000e-10 -2.370000000000000e-11 6.850000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.070000000000000e+02 2.022436483989501e-01 -9.196640635735607e-01 2.052439757673269e-01 -2.668153430087342e-01 1.950000000000000e-10 1.750000000000000e-11 -4.780000000000000e-11 5.100000000000000e-11 1.440000000000000e-11 2.930000000000000e-11 -1.400000000000000e-11 1.480000000000000e-10 -2.370000000000000e-11 6.850000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.080000000000000e+02 2.022026568736133e-01 -9.196864327719192e-01 2.053197733392179e-01 -2.667109701614207e-01 1.950000000000000e-10 1.750000000000000e-11 -4.790000000000000e-11 5.100000000000000e-11 1.440000000000000e-11 2.930000000000000e-11 -1.400000000000000e-11 1.480000000000000e-10 -2.370000000000000e-11 6.850000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.090000000000000e+02 2.021616658239828e-01 -9.197087845675304e-01 2.053955616475283e-01 -2.666065935345274e-01 1.950000000000000e-10 1.740000000000000e-11 -4.790000000000000e-11 5.100000000000000e-11 1.440000000000000e-11 2.930000000000000e-11 -1.400000000000000e-11 1.480000000000000e-10 -2.370000000000000e-11 6.850000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.100000000000000e+02 2.021206752075700e-01 -9.197311189759080e-01 2.054713407363417e-01 -2.665022130808123e-01 1.950000000000000e-10 1.740000000000000e-11 -4.790000000000000e-11 5.100000000000000e-11 1.440000000000000e-11 2.930000000000000e-11 -1.390000000000000e-11 1.480000000000000e-10 -2.370000000000000e-11 6.850000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.110000000000000e+02 2.020797193736983e-01 -9.197534249263574e-01 2.055471140981055e-01 -2.663978382795612e-01 1.950000000000000e-10 1.740000000000000e-11 -4.790000000000000e-11 5.100000000000000e-11 1.440000000000000e-11 2.930000000000000e-11 -1.390000000000000e-11 1.470000000000000e-10 -2.380000000000000e-11 6.850000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.120000000000000e+02 2.020387295506398e-01 -9.197757245996806e-01 2.056228747789345e-01 -2.662934501003407e-01 1.950000000000000e-10 1.740000000000000e-11 -4.800000000000000e-11 5.100000000000000e-11 1.440000000000000e-11 2.930000000000000e-11 -1.390000000000000e-11 1.470000000000000e-10 -2.370000000000000e-11 6.850000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.130000000000000e+02 2.019977401042129e-01 -9.197980069232267e-01 2.056986262294430e-01 -2.661890580399026e-01 1.950000000000000e-10 1.740000000000000e-11 -4.800000000000000e-11 5.100000000000000e-11 1.440000000000000e-11 2.930000000000000e-11 -1.390000000000000e-11 1.470000000000000e-10 -2.370000000000000e-11 6.840000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.140000000000000e+02 2.019567510220833e-01 -9.198202719111060e-01 2.057743684172243e-01 -2.660846620917403e-01 1.950000000000000e-10 1.740000000000000e-11 -4.800000000000000e-11 5.100000000000000e-11 1.440000000000000e-11 2.930000000000000e-11 -1.390000000000000e-11 1.470000000000000e-10 -2.370000000000000e-11 6.840000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.150000000000000e+02 2.019157622856266e-01 -9.198425195797206e-01 2.058501013049270e-01 -2.659802622500338e-01 1.950000000000000e-10 1.740000000000000e-11 -4.800000000000000e-11 5.110000000000000e-11 1.440000000000000e-11 2.930000000000000e-11 -1.390000000000000e-11 1.470000000000000e-10 -2.370000000000000e-11 6.840000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.160000000000000e+02 2.018747738657819e-01 -9.198647499477696e-01 2.059258248568156e-01 -2.658758585077009e-01 1.950000000000000e-10 1.740000000000000e-11 -4.800000000000000e-11 5.110000000000000e-11 1.440000000000000e-11 2.930000000000000e-11 -1.390000000000000e-11 1.470000000000000e-10 -2.380000000000000e-11 6.840000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.170000000000000e+02 2.018337857223981e-01 -9.198869630358730e-01 2.060015390426414e-01 -2.657714508551783e-01 1.950000000000000e-10 1.730000000000000e-11 -4.810000000000000e-11 5.110000000000000e-11 1.440000000000000e-11 2.930000000000000e-11 -1.390000000000000e-11 1.470000000000000e-10 -2.380000000000000e-11 6.840000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.180000000000000e+02 2.017927978073676e-01 -9.199091588658508e-01 2.060772438402661e-01 -2.656670392784872e-01 1.950000000000000e-10 1.730000000000000e-11 -4.810000000000000e-11 5.110000000000000e-11 1.440000000000000e-11 2.930000000000000e-11 -1.390000000000000e-11 1.470000000000000e-10 -2.380000000000000e-11 6.840000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.190000000000000e+02 2.017518100746440e-01 -9.199313374600879e-01 2.061529392335252e-01 -2.655626237554469e-01 1.950000000000000e-10 1.730000000000000e-11 -4.810000000000000e-11 5.110000000000000e-11 1.440000000000000e-11 2.930000000000000e-11 -1.390000000000000e-11 1.470000000000000e-10 -2.370000000000000e-11 6.840000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.200000000000000e+02 2.017108224927356e-01 -9.199534988413858e-01 2.062286252076712e-01 -2.654582042502180e-01 1.950000000000000e-10 1.730000000000000e-11 -4.810000000000000e-11 5.110000000000000e-11 1.440000000000000e-11 2.930000000000000e-11 -1.390000000000000e-11 1.470000000000000e-10 -2.370000000000000e-11 6.840000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.210000000000000e+02 2.016698687514061e-01 -9.199756321781414e-01 2.063043051913728e-01 -2.653537900534392e-01 1.950000000000000e-10 1.730000000000000e-11 -4.810000000000000e-11 5.110000000000000e-11 1.430000000000000e-11 2.930000000000000e-11 -1.380000000000000e-11 1.470000000000000e-10 -2.380000000000000e-11 6.840000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.220000000000000e+02 2.016288815315399e-01 -9.199977592099400e-01 2.063799722407439e-01 -2.652493623723523e-01 1.950000000000000e-10 1.730000000000000e-11 -4.820000000000000e-11 5.120000000000000e-11 1.430000000000000e-11 2.930000000000000e-11 -1.380000000000000e-11 1.470000000000000e-10 -2.380000000000000e-11 6.840000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.230000000000000e+02 2.015878946553503e-01 -9.200198691134613e-01 2.064556297202230e-01 -2.651449304091993e-01 1.950000000000000e-10 1.730000000000000e-11 -4.820000000000000e-11 5.120000000000000e-11 1.430000000000000e-11 2.930000000000000e-11 -1.380000000000000e-11 1.470000000000000e-10 -2.380000000000000e-11 6.830000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.240000000000000e+02 2.015469083607520e-01 -9.200419619321649e-01 2.065312774852862e-01 -2.650404939523980e-01 1.950000000000000e-10 1.730000000000000e-11 -4.820000000000000e-11 5.120000000000000e-11 1.430000000000000e-11 2.930000000000000e-11 -1.380000000000000e-11 1.470000000000000e-10 -2.380000000000000e-11 6.830000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.250000000000000e+02 2.015059230137426e-01 -9.200640377234308e-01 2.066069153085985e-01 -2.649360527091445e-01 1.950000000000000e-10 1.720000000000000e-11 -4.820000000000000e-11 5.120000000000000e-11 1.430000000000000e-11 2.930000000000000e-11 -1.380000000000000e-11 1.470000000000000e-10 -2.380000000000000e-11 6.830000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.260000000000000e+02 2.014649391268396e-01 -9.200860965628324e-01 2.066825428601526e-01 -2.648316062920941e-01 1.950000000000000e-10 1.720000000000000e-11 -4.830000000000000e-11 5.120000000000000e-11 1.430000000000000e-11 2.930000000000000e-11 -1.380000000000000e-11 1.470000000000000e-10 -2.380000000000000e-11 6.830000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.270000000000000e+02 2.014239573747010e-01 -9.201081385469985e-01 2.067581596913758e-01 -2.647271542100054e-01 1.950000000000000e-10 1.720000000000000e-11 -4.830000000000000e-11 5.120000000000000e-11 1.430000000000000e-11 2.930000000000000e-11 -1.380000000000000e-11 1.470000000000000e-10 -2.380000000000000e-11 6.830000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.280000000000000e+02 2.013829785989995e-01 -9.201301637956538e-01 2.068337652259242e-01 -2.646226958642168e-01 1.960000000000000e-10 1.720000000000000e-11 -4.830000000000000e-11 5.120000000000000e-11 1.430000000000000e-11 2.930000000000000e-11 -1.380000000000000e-11 1.470000000000000e-10 -2.380000000000000e-11 6.830000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.290000000000000e+02 2.013420038055166e-01 -9.201521724516927e-01 2.069093587583220e-01 -2.645182305517521e-01 1.960000000000000e-10 1.720000000000000e-11 -4.830000000000000e-11 5.120000000000000e-11 1.430000000000000e-11 2.930000000000000e-11 -1.380000000000000e-11 1.470000000000000e-10 -2.380000000000000e-11 6.830000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.300000000000000e+02 2.013010341489408e-01 -9.201741646794942e-01 2.069849394637437e-01 -2.644137574751970e-01 1.960000000000000e-10 1.720000000000000e-11 -4.830000000000000e-11 5.130000000000000e-11 1.430000000000000e-11 2.930000000000000e-11 -1.380000000000000e-11 1.470000000000000e-10 -2.380000000000000e-11 6.830000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.310000000000000e+02 2.012601012222353e-01 -9.201961308978642e-01 2.070605095628001e-01 -2.643092842035824e-01 1.960000000000000e-10 1.720000000000000e-11 -4.840000000000000e-11 5.130000000000000e-11 1.430000000000000e-11 2.930000000000000e-11 -1.370000000000000e-11 1.470000000000000e-10 -2.380000000000000e-11 6.830000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.320000000000000e+02 2.012186475482414e-01 -9.202180247658108e-01 2.071362182037556e-01 -2.642052798170624e-01 1.960000000000000e-10 1.710000000000000e-11 -4.840000000000000e-11 5.130000000000000e-11 1.430000000000000e-11 2.930000000000000e-11 -1.370000000000000e-11 1.470000000000000e-10 -2.380000000000000e-11 6.830000000000000e-11</ATTLIST>\n\t\t\t<ATTLIST>7.330000000000000e+02 2.011776156480479e-01 -9.202399562583287e-01 2.072117844411100e-01 -2.641008637936777e-01 1.960000000000000e-10 1.710000000000000e-11 -4.840000000000000e-11 5.130000000000000e-11 1.430000000000000e-11 2.930000000000000e-11 -1.370000000000000e-11 1.470000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.340000000000000e+02 2.011365824309081e-01 -9.202618702765664e-01 2.072873410074230e-01 -2.639964461525257e-01 1.960000000000000e-10 1.710000000000000e-11 -4.840000000000000e-11 5.130000000000000e-11 1.430000000000000e-11 2.930000000000000e-11 -1.370000000000000e-11 1.470000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.350000000000000e+02 2.010955479510183e-01 -9.202837668082289e-01 2.073628879049363e-01 -2.638920269035462e-01 1.960000000000000e-10 1.710000000000000e-11 -4.840000000000000e-11 5.130000000000000e-11 1.430000000000000e-11 2.920000000000000e-11 -1.370000000000000e-11 1.470000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.360000000000000e+02 2.010545122258517e-01 -9.203056458503637e-01 2.074384251336456e-01 -2.637876060538909e-01 1.960000000000000e-10 1.710000000000000e-11 -4.850000000000000e-11 5.130000000000000e-11 1.430000000000000e-11 2.920000000000000e-11 -1.370000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.370000000000000e+02 2.010134751978394e-01 -9.203275074257292e-01 2.075139526839861e-01 -2.636831835857196e-01 1.960000000000000e-10 1.710000000000000e-11 -4.850000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.370000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.380000000000000e+02 2.009724369420715e-01 -9.203493515119944e-01 2.075894705624926e-01 -2.635787595247400e-01 1.960000000000000e-10 1.710000000000000e-11 -4.850000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.370000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.390000000000000e+02 2.009313974284759e-01 -9.203711781231735e-01 2.076649787631445e-01 -2.634743338598741e-01 1.960000000000000e-10 1.710000000000000e-11 -4.850000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.370000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.400000000000000e+02 2.008903566634206e-01 -9.203929872581303e-01 2.077404772851393e-01 -2.633699066010417e-01 1.960000000000000e-10 1.710000000000000e-11 -4.850000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.370000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.410000000000000e+02 2.008493204776031e-01 -9.204147770501098e-01 2.078159667348621e-01 -2.632654793578842e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.370000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.420000000000000e+02 2.008083089928490e-01 -9.204365410230766e-01 2.078914492319834e-01 -2.631610577671638e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.430000000000000e+02 2.007672645288495e-01 -9.204582977438427e-01 2.079669187064803e-01 -2.630566257136336e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.440000000000000e+02 2.007262188552832e-01 -9.204800369921285e-01 2.080423784945334e-01 -2.629521920680030e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.450000000000000e+02 2.006851719954693e-01 -9.205017587631110e-01 2.081178285967719e-01 -2.628477568390740e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.460000000000000e+02 2.006441239032550e-01 -9.205234630750463e-01 2.081932690052881e-01 -2.627433200146311e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.470000000000000e+02 2.006030746442069e-01 -9.205451499112050e-01 2.082686997243605e-01 -2.626388816100392e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.480000000000000e+02 2.005620241506893e-01 -9.205668192951040e-01 2.083441207448353e-01 -2.625344416120202e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.490000000000000e+02 2.005209725062420e-01 -9.205884712033733e-01 2.084195320732075e-01 -2.624300000437689e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.500000000000000e+02 2.004799196849431e-01 -9.206101056495182e-01 2.084949337033293e-01 -2.623255568928543e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.510000000000000e+02 2.004388656649617e-01 -9.206317226431437e-01 2.085703256303627e-01 -2.622211121563359e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.520000000000000e+02 2.003978105066921e-01 -9.206533221683323e-01 2.086457078583742e-01 -2.621166658509430e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.530000000000000e+02 2.003567541998761e-01 -9.206749042335494e-01 2.087210803828740e-01 -2.620122179686301e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.540000000000000e+02 2.003156967057261e-01 -9.206964688497332e-01 2.087964431998136e-01 -2.619077685141066e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.550000000000000e+02 2.002746380845312e-01 -9.207180160059544e-01 2.088717963101384e-01 -2.618033174891900e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.560000000000000e+02 2.002335783459752e-01 -9.207395457017900e-01 2.089471397130520e-01 -2.616988648988802e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.570000000000000e+02 2.001925174448911e-01 -9.207610579543559e-01 2.090224734012010e-01 -2.615944107336708e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.580000000000000e+02 2.001514554384623e-01 -9.207825527471655e-01 2.090977973796209e-01 -2.614899550140879e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.590000000000000e+02 2.001103922906925e-01 -9.208040300976822e-01 2.091731116398451e-01 -2.613854977232611e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.600000000000000e+02 2.000693280543852e-01 -9.208254899916204e-01 2.092484161857081e-01 -2.612810388783154e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.610000000000000e+02 2.000282627146072e-01 -9.208469324373036e-01 2.093237110132451e-01 -2.611765784748468e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.620000000000000e+02 1.999871962500590e-01 -9.208683574449976e-01 2.093989961171187e-01 -2.610721165075573e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.630000000000000e+02 1.999461287164221e-01 -9.208897650019656e-01 2.094742714999289e-01 -2.609676529869448e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.640000000000000e+02 1.999050601064920e-01 -9.209111551107568e-01 2.095495371606266e-01 -2.608631879207156e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.650000000000000e+02 1.998639903824522e-01 -9.209325277861280e-01 2.096247930925997e-01 -2.607587213013985e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.660000000000000e+02 1.998229196087411e-01 -9.209538830166430e-01 2.097000392968082e-01 -2.606542531295492e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.670000000000000e+02 1.997818477727236e-01 -9.209752208057780e-01 2.097752757721308e-01 -2.605497834138258e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.680000000000000e+02 1.997407748684763e-01 -9.209965411596820e-01 2.098505025143622e-01 -2.604453121507711e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.690000000000000e+02 1.996997009065617e-01 -9.210178440784860e-01 2.099257195222827e-01 -2.603408393431567e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.700000000000000e+02 1.996586259228451e-01 -9.210391295541902e-01 2.100009267974337e-01 -2.602363650008966e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.710000000000000e+02 1.996175498733018e-01 -9.210603976035493e-01 2.100761243324991e-01 -2.601318891147496e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.720000000000000e+02 1.995764728153478e-01 -9.210816482133152e-01 2.101513121305577e-01 -2.600274116954457e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.730000000000000e+02 1.995353946950570e-01 -9.211028814034242e-01 2.102264901831978e-01 -2.599229327309366e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.740000000000000e+02 1.994943155783001e-01 -9.211240971578799e-01 2.103016584942112e-01 -2.598184522346524e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.750000000000000e+02 1.994532354670089e-01 -9.211452954763119e-01 2.103768170635367e-01 -2.597139702168815e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.760000000000000e+02 1.994121543171352e-01 -9.211664763779446e-01 2.104519658822578e-01 -2.596094866608956e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.770000000000000e+02 1.993710721706042e-01 -9.211876398528397e-01 2.105271049526032e-01 -2.595050015783400e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.780000000000000e+02 1.993299890556073e-01 -9.212087858930155e-01 2.106022342768739e-01 -2.594005149844482e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.790000000000000e+02 1.992889049265041e-01 -9.212299145239431e-01 2.106773538423103e-01 -2.592960268446199e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.800000000000000e+02 1.992478198251929e-01 -9.212510257283216e-01 2.107524636558504e-01 -2.591915371928881e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.810000000000000e+02 1.992067337639367e-01 -9.212721195082071e-01 2.108275637149176e-01 -2.590870460250613e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.820000000000000e+02 1.991656467157335e-01 -9.212931958748900e-01 2.109026540140070e-01 -2.589825533366742e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.830000000000000e+02 1.991245587321425e-01 -9.213142548170179e-01 2.109777345556327e-01 -2.588780591368562e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.840000000000000e+02 1.990834697538417e-01 -9.213352963562627e-01 2.110528053307025e-01 -2.587735634119718e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.850000000000000e+02 1.990423798570335e-01 -9.213563204733248e-01 2.111278663442469e-01 -2.586690661784478e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.860000000000000e+02 1.990012890341639e-01 -9.213773271692636e-01 2.112029175961952e-01 -2.585645674488671e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.870000000000000e+02 1.989601972325498e-01 -9.213983164685275e-01 2.112779590750360e-01 -2.584600671965320e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.880000000000000e+02 1.989191045333436e-01 -9.214192883494141e-01 2.113529907869011e-01 -2.583555654417843e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.890000000000000e+02 1.988780109174424e-01 -9.214402428191482e-01 2.114280127288638e-01 -2.582510621864599e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.900000000000000e+02 1.988369163631769e-01 -9.214611798889472e-01 2.115030248949363e-01 -2.581465574226089e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.910000000000000e+02 1.987958209105186e-01 -9.214820995487042e-01 2.115780272877287e-01 -2.580420511638716e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.920000000000000e+02 1.987547245830499e-01 -9.215030017968435e-01 2.116530199059472e-01 -2.579375434092821e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.930000000000000e+02 1.987136273192986e-01 -9.215238866532789e-01 2.117280027417494e-01 -2.578330341520098e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.940000000000000e+02 1.986725291749603e-01 -9.215447541077578e-01 2.118029757963889e-01 -2.577285233952413e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.950000000000000e+02 1.986314301895499e-01 -9.215656041470622e-01 2.118779390745427e-01 -2.576240111624663e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.960000000000000e+02 1.985903302720630e-01 -9.215864368054845e-01 2.119528925618961e-01 -2.575194974234949e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.970000000000000e+02 1.985492295314261e-01 -9.216072520516428e-01 2.120278362685471e-01 -2.574149822088359e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.980000000000000e+02 1.985081278898578e-01 -9.216280499139522e-01 2.121027701826924e-01 -2.573104654970293e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>7.990000000000000e+02 1.984670254141037e-01 -9.216488303729109e-01 2.121776943105211e-01 -2.572059473118659e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.000000000000000e+02 1.984259221038637e-01 -9.216695934370563e-01 2.122526086465018e-01 -2.571014276381167e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.010000000000000e+02 1.983848179144274e-01 -9.216903391184845e-01 2.123275131861820e-01 -2.569969064811563e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.020000000000000e+02 1.983437129019676e-01 -9.217110674043526e-01 2.124024079324930e-01 -2.568923838518178e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.030000000000000e+02 1.983026070903794e-01 -9.217317782929902e-01 2.124772928842089e-01 -2.567878597492470e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.040000000000000e+02 1.982615004115043e-01 -9.217524718097200e-01 2.125521680305494e-01 -2.566833341546815e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.050000000000000e+02 1.982203929370233e-01 -9.217731479318418e-01 2.126270333793586e-01 -2.565788070983416e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.060000000000000e+02 1.981792846672668e-01 -9.217938066628074e-01 2.127018889283037e-01 -2.564742785801197e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.070000000000000e+02 1.981381755668102e-01 -9.218144480223199e-01 2.127767346671716e-01 -2.563697485756413e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.080000000000000e+02 1.980970656949007e-01 -9.218350719917078e-01 2.128515706026463e-01 -2.562652171112960e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.090000000000000e+02 1.980559549977299e-01 -9.218556785876271e-01 2.129263967281460e-01 -2.561606841848512e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.100000000000000e+02 1.980148435506708e-01 -9.218762677967768e-01 2.130012130452056e-01 -2.560561497952351e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.110000000000000e+02 1.979737313246924e-01 -9.218968396271506e-01 2.130760195512636e-01 -2.559516139488865e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.120000000000000e+02 1.979326182966437e-01 -9.219173940928861e-01 2.131508162385262e-01 -2.558470766299029e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.130000000000000e+02 1.978915045296888e-01 -9.219379311748493e-01 2.132256031134175e-01 -2.557425378636380e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.140000000000000e+02 1.978503900206205e-01 -9.219584508792551e-01 2.133003801721553e-01 -2.556379976439858e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.150000000000000e+02 1.978092747181991e-01 -9.219789532227529e-01 2.133751474078825e-01 -2.555334559669268e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.160000000000000e+02 1.977681587005932e-01 -9.219994381895212e-01 2.134499048235564e-01 -2.554289128372098e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.170000000000000e+02 1.977270419482473e-01 -9.220199057829032e-01 2.135246524187245e-01 -2.553243682689636e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.180000000000000e+02 1.976859244431220e-01 -9.220403560170185e-01 2.135993901851214e-01 -2.552198222427527e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.190000000000000e+02 1.976448062213888e-01 -9.220607888822127e-01 2.136741181255822e-01 -2.551152747737307e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.200000000000000e+02 1.976036873052129e-01 -9.220812043765673e-01 2.137488362392502e-01 -2.550107258630684e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.210000000000000e+02 1.975625676344340e-01 -9.221016025179758e-01 2.138235445192388e-01 -2.549061755091472e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.220000000000000e+02 1.975214473067685e-01 -9.221219832843868e-01 2.138982429710579e-01 -2.548016237220692e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.230000000000000e+02 1.974803262330727e-01 -9.221423467046062e-01 2.139729315834038e-01 -2.546970704868934e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.240000000000000e+02 1.974392044947869e-01 -9.221626927569091e-01 2.140476103628235e-01 -2.545925158243215e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.250000000000000e+02 1.973980820751730e-01 -9.221830214502306e-01 2.141222793049954e-01 -2.544879597293366e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.260000000000000e+02 1.973569589529891e-01 -9.222033327932354e-01 2.141969384054330e-01 -2.543834022015125e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.270000000000000e+02 1.973158351668339e-01 -9.222236267803617e-01 2.142715876641607e-01 -2.542788432417661e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.280000000000000e+02 1.972747107395192e-01 -9.222439034078705e-01 2.143462270814624e-01 -2.541742828564594e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.290000000000000e+02 1.972335856143123e-01 -9.222641626933760e-01 2.144208566502641e-01 -2.540697210424241e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.300000000000000e+02 1.971924598542704e-01 -9.222844046234805e-01 2.144954763734627e-01 -2.539651578076326e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.310000000000000e+02 1.971513334724085e-01 -9.223046291975888e-01 2.145700862502058e-01 -2.538605931556306e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.320000000000000e+02 1.971102063995946e-01 -9.223248364397141e-01 2.146446862703758e-01 -2.537560270721780e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.330000000000000e+02 1.970690787447340e-01 -9.223450263193818e-01 2.147192764440647e-01 -2.536514595856650e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.340000000000000e+02 1.970279504156671e-01 -9.223651988695982e-01 2.147938567573945e-01 -2.535468906702116e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.350000000000000e+02 1.969868214941148e-01 -9.223853540669547e-01 2.148684272181055e-01 -2.534423203516772e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.360000000000000e+02 1.969456919715396e-01 -9.224054919193796e-01 2.149429878217722e-01 -2.533377486224040e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.370000000000000e+02 1.969045618029813e-01 -9.224256124455652e-01 2.150175385595125e-01 -2.532331754676091e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.380000000000000e+02 1.968634310577009e-01 -9.224457156220661e-01 2.150920794402383e-01 -2.531286009220579e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.390000000000000e+02 1.968222997333635e-01 -9.224658014580525e-01 2.151666104581656e-01 -2.530240249698977e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.400000000000000e+02 1.967811677807478e-01 -9.224858699711610e-01 2.152411316054543e-01 -2.529194476025893e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.410000000000000e+02 1.967400352748509e-01 -9.225059211425689e-01 2.153156428875500e-01 -2.528148688366092e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.420000000000000e+02 1.966989022024411e-01 -9.225259549768722e-01 2.153901443025911e-01 -2.527102886779120e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.430000000000000e+02 1.966577685381148e-01 -9.225459714873081e-01 2.154646358434583e-01 -2.526057071148514e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.440000000000000e+02 1.966166343175987e-01 -9.225659706652155e-01 2.155391175125259e-01 -2.525011241600518e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.450000000000000e+02 1.965754995620469e-01 -9.225859525098229e-01 2.156135893083614e-01 -2.523965398119390e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.460000000000000e+02 1.965343642336358e-01 -9.226059170335128e-01 2.156880512254878e-01 -2.522919540702455e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.470000000000000e+02 1.964932283814127e-01 -9.226258642266147e-01 2.157625032660202e-01 -2.521873669411753e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.480000000000000e+02 1.964520919699309e-01 -9.226457941031665e-01 2.158369454231897e-01 -2.520827784176505e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.490000000000000e+02 1.964109550498010e-01 -9.226657066505551e-01 2.159113777006520e-01 -2.519781885141314e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.500000000000000e+02 1.963698176166880e-01 -9.226856018737575e-01 2.159858000955055e-01 -2.518735972291558e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.510000000000000e+02 1.963286796321643e-01 -9.227054797877667e-01 2.160602126006048e-01 -2.517690045547696e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.520000000000000e+02 1.962875411577103e-01 -9.227253403789071e-01 2.161346152193614e-01 -2.516644105011052e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.530000000000000e+02 1.962464022019614e-01 -9.227451836447920e-01 2.162090079525156e-01 -2.515598150804581e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.540000000000000e+02 1.962052627172800e-01 -9.227650096073806e-01 2.162833907891943e-01 -2.514552182697002e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.550000000000000e+02 1.961641227453612e-01 -9.227848182545122e-01 2.163577637335810e-01 -2.513506200882221e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.560000000000000e+02 1.961229823221872e-01 -9.228046095790700e-01 2.164321267871013e-01 -2.512460205437758e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.570000000000000e+02 1.960818413788847e-01 -9.228243836057924e-01 2.165064799389113e-01 -2.511414196195389e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.580000000000000e+02 1.960407000087855e-01 -9.228441403116516e-01 2.165808231960180e-01 -2.510368173321381e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.590000000000000e+02 1.959995581284091e-01 -9.228638797212452e-01 2.166551565489260e-01 -2.509322136754861e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.600000000000000e+02 1.959584158202497e-01 -9.228836018181951e-01 2.167294800010421e-01 -2.508276086533764e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.610000000000000e+02 1.959172730690445e-01 -9.229033066045651e-01 2.168037935523078e-01 -2.507230022811588e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.620000000000000e+02 1.958761298376709e-01 -9.229229941005495e-01 2.168780971920236e-01 -2.506183945337227e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.630000000000000e+02 1.958349861989246e-01 -9.229426642848574e-01 2.169523909276722e-01 -2.505137854370553e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.640000000000000e+02 1.957938421358872e-01 -9.229623171664997e-01 2.170266747548127e-01 -2.504091749860259e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.650000000000000e+02 1.957526976130680e-01 -9.229819527611388e-01 2.171009486655372e-01 -2.503045631684840e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.660000000000000e+02 1.957115526949432e-01 -9.230015710501529e-01 2.171752126663430e-01 -2.501999500080143e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.670000000000000e+02 1.956704073691949e-01 -9.230211720402827e-01 2.172494667538620e-01 -2.500953355033213e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.680000000000000e+02 1.956292616298434e-01 -9.230407557417568e-01 2.173237109211678e-01 -2.499907196383533e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.690000000000000e+02 1.955881154818315e-01 -9.230603221501943e-01 2.173979451706403e-01 -2.498861024343463e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.700000000000000e+02 1.955469689658295e-01 -9.230798712609957e-01 2.174721695017302e-01 -2.497814838879610e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.710000000000000e+02 1.955058220425354e-01 -9.230994030902423e-01 2.175463839065607e-01 -2.496768639884173e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.720000000000000e+02 1.954646747587981e-01 -9.231189176217924e-01 2.176205883918318e-01 -2.495722427638950e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.730000000000000e+02 1.954235270748220e-01 -9.231384148774835e-01 2.176947829459406e-01 -2.494676201859541e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.740000000000000e+02 1.953823790475702e-01 -9.231578948395138e-01 2.177689675755738e-01 -2.493629962810389e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.750000000000000e+02 1.953412306682811e-01 -9.231773575150911e-01 2.178431422767421e-01 -2.492583710438832e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.760000000000000e+02 1.953000819057170e-01 -9.231968029177213e-01 2.179173070425290e-01 -2.491537444660432e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.770000000000000e+02 1.952589328104448e-01 -9.232162310348497e-01 2.179914618767660e-01 -2.490491165621023e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.780000000000000e+02 1.952177833949766e-01 -9.232356418668850e-01 2.180656067780840e-01 -2.489444873330174e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.790000000000000e+02 1.951766336118297e-01 -9.232550354301328e-01 2.181397417391144e-01 -2.488398567730877e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.800000000000000e+02 1.951354835172122e-01 -9.232744117126330e-01 2.182138667628399e-01 -2.487352248910571e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.810000000000000e+02 1.950943331221869e-01 -9.232937707152602e-01 2.182879818477167e-01 -2.486305916874606e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.820000000000000e+02 1.950531823724512e-01 -9.233131124557029e-01 2.183620869860319e-01 -2.485259571570875e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.830000000000000e+02 1.950120313512169e-01 -9.233324369110151e-01 2.184361821859310e-01 -2.484213213238221e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.840000000000000e+02 1.949708799964213e-01 -9.233517441069458e-01 2.185102674350737e-01 -2.483166841626536e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.850000000000000e+02 1.949297283627470e-01 -9.233710340320270e-01 2.185843427362901e-01 -2.482120456819026e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.860000000000000e+02 1.948885764616219e-01 -9.233903066790556e-01 2.186584080933068e-01 -2.481074059072471e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.870000000000000e+02 1.948474242369843e-01 -9.234095620742508e-01 2.187324634929348e-01 -2.480027648079055e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.880000000000000e+02 1.948062717638402e-01 -9.234288001972676e-01 2.188065089421259e-01 -2.478981224056922e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.890000000000000e+02 1.947651190312310e-01 -9.234480210568146e-01 2.188805444360754e-01 -2.477934786921774e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.900000000000000e+02 1.947239660041619e-01 -9.234672246620348e-01 2.189545699709876e-01 -2.476888336752969e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.910000000000000e+02 1.946828127397424e-01 -9.234864110022835e-01 2.190285855489953e-01 -2.475841873591092e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.920000000000000e+02 1.946416592373178e-01 -9.235055800790045e-01 2.191025911691875e-01 -2.474795397507298e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.930000000000000e+02 1.946005054642233e-01 -9.235247319109359e-01 2.191765868212625e-01 -2.473748908262202e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.940000000000000e+02 1.945593514705344e-01 -9.235438664809371e-01 2.192505725122340e-01 -2.472702406151289e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.950000000000000e+02 1.945181972609973e-01 -9.235629837927047e-01 2.193245482392584e-01 -2.471655891136410e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.960000000000000e+02 1.944770428002909e-01 -9.235820838602625e-01 2.193985139953401e-01 -2.470609363145568e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.970000000000000e+02 1.944358881519350e-01 -9.236011666709487e-01 2.194724697836905e-01 -2.469562822235500e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.980000000000000e+02 1.943947332615978e-01 -9.236202322377138e-01 2.195464155996061e-01 -2.468516268503597e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>8.990000000000000e+02 1.943535781777928e-01 -9.236392805558367e-01 2.196203514421059e-01 -2.467469701865279e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.000000000000000e+02 1.943124229262792e-01 -9.236583116191323e-01 2.196942773130924e-01 -2.466423122444550e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.010000000000000e+02 1.942712674423649e-01 -9.236773254502092e-01 2.197681932023528e-01 -2.465376530107699e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.020000000000000e+02 1.942301117839887e-01 -9.236963220357850e-01 2.198420991137695e-01 -2.464329924973410e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.030000000000000e+02 1.941889559715620e-01 -9.237153013713867e-01 2.199159950485755e-01 -2.463283307149991e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.040000000000000e+02 1.941477999627318e-01 -9.237342634756647e-01 2.199898809972800e-01 -2.462236676469284e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.050000000000000e+02 1.941066437849625e-01 -9.237532083411046e-01 2.200637569625274e-01 -2.461190033085443e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.060000000000000e+02 1.940654874825817e-01 -9.237721359579828e-01 2.201376229470327e-01 -2.460143377102320e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.070000000000000e+02 1.940243309857128e-01 -9.237910463545242e-01 2.202114789372610e-01 -2.459096708245211e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.080000000000000e+02 1.939831743803655e-01 -9.238099395053552e-01 2.202853249430313e-01 -2.458050026813364e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.090000000000000e+02 1.939420175997304e-01 -9.238288154361377e-01 2.203591609522263e-01 -2.457003332591142e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.100000000000000e+02 1.939008607089000e-01 -9.238476741265683e-01 2.204329869728368e-01 -2.455956625869257e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.110000000000000e+02 1.938597037017539e-01 -9.238665155861908e-01 2.205068029990709e-01 -2.454909906502229e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.120000000000000e+02 1.938185465409118e-01 -9.238853398289023e-01 2.205806090241099e-01 -2.453863174436489e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.130000000000000e+02 1.937773892932340e-01 -9.239041468385866e-01 2.206544050530659e-01 -2.452816429817760e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.140000000000000e+02 1.937362319497686e-01 -9.239229366185749e-01 2.207281910844795e-01 -2.451769672717806e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.150000000000000e+02 1.936950744718713e-01 -9.239417091863318e-01 2.208019671092664e-01 -2.450722902978929e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.160000000000000e+02 1.936539169120575e-01 -9.239604645287419e-01 2.208757331317628e-01 -2.449676120754662e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.170000000000000e+02 1.936127592912225e-01 -9.239792026427790e-01 2.209494891522564e-01 -2.448629326104929e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.180000000000000e+02 1.935716015511431e-01 -9.239979235505728e-01 2.210232351601712e-01 -2.447582518864020e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.190000000000000e+02 1.935304437525829e-01 -9.240166272363818e-01 2.210969711609275e-01 -2.446535699210094e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.200000000000000e+02 1.934892859038999e-01 -9.240353137011814e-01 2.211706971532020e-01 -2.445488867165923e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.210000000000000e+02 1.934481279556446e-01 -9.240539829635146e-01 2.212444131280480e-01 -2.444442022616757e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.220000000000000e+02 1.934069699977839e-01 -9.240726350007250e-01 2.213181190933484e-01 -2.443395165749406e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.230000000000000e+02 1.933658119461331e-01 -9.240912698400668e-01 2.213918150372171e-01 -2.442348296421133e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.240000000000000e+02 1.933246538674122e-01 -9.241098874654852e-01 2.214655009648400e-01 -2.441301414777906e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.250000000000000e+02 1.932834957828379e-01 -9.241284878770115e-01 2.215391768744800e-01 -2.440254520780409e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.260000000000000e+02 1.932423376310149e-01 -9.241470710899078e-01 2.216128427603058e-01 -2.439207614503983e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.270000000000000e+02 1.932011794629074e-01 -9.241656370994478e-01 2.216864986213052e-01 -2.438160695847167e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.280000000000000e+02 1.931600213047772e-01 -9.241841858961811e-01 2.217601444616237e-01 -2.437113765036641e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.290000000000000e+02 1.931188630998520e-01 -9.242027175025627e-01 2.218337802702636e-01 -2.436066821885307e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.300000000000000e+02 1.930777049146809e-01 -9.242212319049594e-01 2.219074060508779e-01 -2.435019866463712e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.310000000000000e+02 1.930365467382174e-01 -9.242397291058205e-01 2.219810218027520e-01 -2.433972898887532e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.320000000000000e+02 1.929953885520859e-01 -9.242582091177201e-01 2.220546275183143e-01 -2.432925919008571e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.330000000000000e+02 1.929542304060092e-01 -9.242766719261269e-01 2.221282232034467e-01 -2.431878927045243e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.340000000000000e+02 1.929130722485347e-01 -9.242951175502269e-01 2.222018088488528e-01 -2.430831922876237e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.350000000000000e+02 1.928719141393318e-01 -9.243135459754421e-01 2.222753844594161e-01 -2.429784906652308e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.360000000000000e+02 1.928307560847222e-01 -9.243319572057672e-01 2.223489500319946e-01 -2.428737878314983e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.370000000000000e+02 1.927895980246216e-01 -9.243503512623522e-01 2.224225055566554e-01 -2.427690837742123e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.380000000000000e+02 1.927484400525781e-01 -9.243687281206123e-01 2.224960510422387e-01 -2.426643785160666e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.390000000000000e+02 1.927072821375675e-01 -9.243870877901627e-01 2.225695864848672e-01 -2.425596720601537e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.400000000000000e+02 1.926661242492035e-01 -9.244054302881867e-01 2.226431118748399e-01 -2.424549643855342e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.410000000000000e+02 1.926249664557030e-01 -9.244237555942524e-01 2.227166272203041e-01 -2.423502555199178e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.420000000000000e+02 1.925838087361582e-01 -9.244420637186782e-01 2.227901325160910e-01 -2.422455454568540e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.430000000000000e+02 1.925426510811869e-01 -9.244603546703858e-01 2.228636277563096e-01 -2.421408341866979e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.440000000000000e+02 1.925014935195584e-01 -9.244786284407328e-01 2.229371129444377e-01 -2.420361217278939e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.450000000000000e+02 1.924603360714028e-01 -9.244968850308849e-01 2.230105880781206e-01 -2.419314080737025e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.460000000000000e+02 1.924191786939442e-01 -9.245151244541320e-01 2.230840531512149e-01 -2.418266932245791e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.470000000000000e+02 1.923780214478014e-01 -9.245333466964201e-01 2.231575081685263e-01 -2.417219771931400e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.480000000000000e+02 1.923368642842560e-01 -9.245515517776326e-01 2.232309531199773e-01 -2.416172599629798e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.490000000000000e+02 1.922957072511437e-01 -9.245697396822833e-01 2.233043880121204e-01 -2.415125415607846e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.500000000000000e+02 1.922545503762607e-01 -9.245879104106635e-01 2.233778128425918e-01 -2.414078219770951e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.510000000000000e+02 1.922133935886207e-01 -9.246060639858341e-01 2.234512276009372e-01 -2.413031012013807e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.520000000000000e+02 1.921722369513625e-01 -9.246242003937006e-01 2.235246322915875e-01 -2.411983792448240e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.530000000000000e+02 1.921310804847355e-01 -9.246423196299161e-01 2.235980269158811e-01 -2.410936561183251e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.540000000000000e+02 1.920899241385413e-01 -9.246604217132721e-01 2.236714114645467e-01 -2.409889318100336e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.550000000000000e+02 1.920487679635165e-01 -9.246785066320630e-01 2.237447859414288e-01 -2.408842063324572e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.560000000000000e+02 1.920076119635396e-01 -9.246965743887212e-01 2.238181503446340e-01 -2.407794796865584e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.570000000000000e+02 1.919664561069139e-01 -9.247146249969304e-01 2.238915046668254e-01 -2.406747518635134e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.580000000000000e+02 1.919253004638823e-01 -9.247326584380235e-01 2.239648489152344e-01 -2.405700228839220e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.590000000000000e+02 1.918841449630620e-01 -9.247506747383167e-01 2.240381830771873e-01 -2.404652927270279e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.600000000000000e+02 1.918429896764997e-01 -9.247686738777681e-01 2.241115071604712e-01 -2.403605614167992e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.610000000000000e+02 1.918018345927074e-01 -9.247866558660449e-01 2.241848211595602e-01 -2.402558289420365e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.620000000000000e+02 1.917606796916806e-01 -9.248046207099915e-01 2.242581250707605e-01 -2.401510953074773e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.630000000000000e+02 1.917195250107918e-01 -9.248225684037250e-01 2.243314188951236e-01 -2.400463605166182e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.640000000000000e+02 1.916783705589655e-01 -9.248404989457409e-01 2.244047026330070e-01 -2.399416245794894e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.650000000000000e+02 1.916372162993277e-01 -9.248584123568271e-01 2.244779762726815e-01 -2.398368874680778e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.660000000000000e+02 1.915960622890402e-01 -9.248763086154562e-01 2.245512398241589e-01 -2.397321492220331e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.670000000000000e+02 1.915549085268749e-01 -9.248941877311472e-01 2.246244932812025e-01 -2.396274098231779e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.680000000000000e+02 1.915137549754367e-01 -9.249120497139497e-01 2.246977366393104e-01 -2.395226692785463e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.690000000000000e+02 1.914726016865879e-01 -9.249298945572679e-01 2.247709698989162e-01 -2.394179275834443e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.700000000000000e+02 1.914314486595435e-01 -9.249477222603584e-01 2.248441930606305e-01 -2.393131847525280e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.710000000000000e+02 1.913902958762154e-01 -9.249655328325822e-01 2.249174061189052e-01 -2.392084407810391e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.720000000000000e+02 1.913491433822377e-01 -9.249833262662367e-01 2.249906090756622e-01 -2.391036956721814e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.730000000000000e+02 1.913079911334654e-01 -9.250011025774153e-01 2.250638019228441e-01 -2.389989494183580e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.740000000000000e+02 1.912668391804337e-01 -9.250188617529465e-01 2.251369846654395e-01 -2.388942020371423e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.750000000000000e+02 1.912256875344205e-01 -9.250366037960336e-01 2.252101573004829e-01 -2.387894535216747e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.760000000000000e+02 1.911845361483457e-01 -9.250543287213736e-01 2.252833198210633e-01 -2.386847038710098e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.770000000000000e+02 1.911433850626791e-01 -9.250720365213316e-01 2.253564722292414e-01 -2.385799530921399e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.780000000000000e+02 1.911022343225613e-01 -9.250897271836845e-01 2.254296145298269e-01 -2.384752012035521e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.790000000000000e+02 1.910610838448572e-01 -9.251074007415856e-01 2.255027467062470e-01 -2.383704481707286e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.800000000000000e+02 1.910199337079387e-01 -9.251250571722458e-01 2.255758687678678e-01 -2.382656940222101e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.810000000000000e+02 1.909787839141067e-01 -9.251426964801702e-01 2.256489807115444e-01 -2.381609387534605e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.820000000000000e+02 1.909376344259235e-01 -9.251603186777744e-01 2.257220825311303e-01 -2.380561823639138e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.830000000000000e+02 1.908964852876767e-01 -9.251779237554638e-01 2.257951742299912e-01 -2.379514248639606e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.840000000000000e+02 1.908553364774898e-01 -9.251955117253607e-01 2.258682558009784e-01 -2.378466662426360e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.850000000000000e+02 1.908141880373272e-01 -9.252130825770375e-01 2.259413272479753e-01 -2.377419065149744e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.860000000000000e+02 1.907730399570422e-01 -9.252306363174087e-01 2.260143885671612e-01 -2.376371456776993e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.870000000000000e+02 1.907318922207910e-01 -9.252481729551295e-01 2.260874397532539e-01 -2.375323837267041e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.880000000000000e+02 1.906907448550208e-01 -9.252656924854833e-01 2.261604808074812e-01 -2.374276206698062e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.890000000000000e+02 1.906495979043538e-01 -9.252831948995277e-01 2.262335117325546e-01 -2.373228565153119e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.900000000000000e+02 1.906084512915214e-01 -9.253006802223450e-01 2.263065325167690e-01 -2.372180912505409e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.910000000000000e+02 1.905673050749804e-01 -9.253181484390511e-01 2.263795431657971e-01 -2.371133248930370e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.920000000000000e+02 1.905261592907671e-01 -9.253355995449818e-01 2.264525436801315e-01 -2.370085574434737e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.930000000000000e+02 1.904850138536860e-01 -9.253530335692869e-01 2.265255340458867e-01 -2.369037888817001e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.940000000000000e+02 1.904438688657915e-01 -9.253704504847781e-01 2.265985142737798e-01 -2.367990192334920e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.950000000000000e+02 1.904027242844704e-01 -9.253878503040539e-01 2.266714843585945e-01 -2.366942485008145e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.960000000000000e+02 1.903615801116169e-01 -9.254052330355487e-01 2.267444442938400e-01 -2.365894766673027e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.970000000000000e+02 1.903204363919690e-01 -9.254225986656782e-01 2.268173940856428e-01 -2.364847037561455e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.980000000000000e+02 1.902792930684052e-01 -9.254399472169902e-01 2.268903337224114e-01 -2.363799297481393e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>9.990000000000000e+02 1.902381502121831e-01 -9.254572786705464e-01 2.269632632116728e-01 -2.362751546647733e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.000000000000000e+03 1.901970078133985e-01 -9.254745930331922e-01 2.270361825496216e-01 -2.361703785028353e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.001000000000000e+03 1.901558658353094e-01 -9.254918903186869e-01 2.271090917290607e-01 -2.360656012568720e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.002000000000000e+03 1.901147243274908e-01 -9.255091705196117e-01 2.271819907513694e-01 -2.359608229266614e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.003000000000000e+03 1.900735833171244e-01 -9.255264336264077e-01 2.272548796210762e-01 -2.358560435354181e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.004000000000000e+03 1.900324427341577e-01 -9.255436796657290e-01 2.273277583247255e-01 -2.357512630599606e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.005000000000000e+03 1.899913026514139e-01 -9.255609086196916e-01 2.274006268690738e-01 -2.356464815172550e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.006000000000000e+03 1.899501630746052e-01 -9.255781204901852e-01 2.274734852525029e-01 -2.355416989088482e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.007000000000000e+03 1.899090239495533e-01 -9.255953152965094e-01 2.275463334653312e-01 -2.354369152239462e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.008000000000000e+03 1.898678853593107e-01 -9.256124930160200e-01 2.276191715170566e-01 -2.353321304874045e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.009000000000000e+03 1.898267472370994e-01 -9.256296536750982e-01 2.276919993941170e-01 -2.352273446744865e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.010000000000000e+03 1.897856096455444e-01 -9.256467972552579e-01 2.277648171044916e-01 -2.351225578116870e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.011000000000000e+03 1.897444725821337e-01 -9.256639237656195e-01 2.278376246422641e-01 -2.350177698829101e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.012000000000000e+03 1.897033360221854e-01 -9.256810332130437e-01 2.279104220039814e-01 -2.349129808964431e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.013000000000000e+03 1.896622000056324e-01 -9.256981255901010e-01 2.279832091918221e-01 -2.348081908592529e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.014000000000000e+03 1.896210645326502e-01 -9.257152009004441e-01 2.280559862033835e-01 -2.347033997711952e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.015000000000000e+03 1.895799295779779e-01 -9.257322591557350e-01 2.281287530319817e-01 -2.345986076252397e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.016000000000000e+03 1.895387951794362e-01 -9.257493003476793e-01 2.282015096805542e-01 -2.344938144327611e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.017000000000000e+03 1.894976613690882e-01 -9.257663244698123e-01 2.282742561512350e-01 -2.343890202033817e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.018000000000000e+03 1.894565280768793e-01 -9.257833315487808e-01 2.283469924304330e-01 -2.342842249138228e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.019000000000000e+03 1.894153953746271e-01 -9.258003215624353e-01 2.284197185280341e-01 -2.341794285959789e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.020000000000000e+03 1.893742632551705e-01 -9.258172945221335e-01 2.284924344369293e-01 -2.340746312297943e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.021000000000000e+03 1.893331316992362e-01 -9.258342504330364e-01 2.285651401544073e-01 -2.339698328252041e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.022000000000000e+03 1.892920007490240e-01 -9.258511892877904e-01 2.286378356827159e-01 -2.338650333870780e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.023000000000000e+03 1.892508703671516e-01 -9.258681111003743e-01 2.287105210144570e-01 -2.337602329096979e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.024000000000000e+03 1.892097406020262e-01 -9.258850158576133e-01 2.287831961551698e-01 -2.336554314127670e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.025000000000000e+03 1.891686114632737e-01 -9.259019035663011e-01 2.288558610996232e-01 -2.335506288788515e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.026000000000000e+03 1.891274828966536e-01 -9.259187742411684e-01 2.289285158411207e-01 -2.334458253121910e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.027000000000000e+03 1.890863549712076e-01 -9.259356278670949e-01 2.290011603850426e-01 -2.333410207236935e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.028000000000000e+03 1.890452276913399e-01 -9.259524644464028e-01 2.290737947295957e-01 -2.332362151145186e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.029000000000000e+03 1.890041010094339e-01 -9.259692839940250e-01 2.291464188674456e-01 -2.331314084833566e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.030000000000000e+03 1.889629749773837e-01 -9.259860865048734e-01 2.292190327983936e-01 -2.330266008207113e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t\t<ATTLIST>1.031000000000000e+03 1.889218496090159e-01 -9.260028719713975e-01 2.292916365267090e-01 -2.329217921533654e-01 1.960000000000000e-10 1.700000000000000e-11 -4.860000000000000e-11 5.140000000000000e-11 1.420000000000000e-11 2.920000000000000e-11 -1.360000000000000e-11 1.460000000000000e-10 -2.380000000000000e-11 6.819999999999999e-11</ATTLIST>\n\t\t</ATTLISTList>\n\t</ATT>\n\t<TIL>Today I learned</TIL>\n\t<GEO>\n\t\t<EFFECTIVETIME>1960-03-18T00:00:00.000000Z</EFFECTIVETIME>\n\t\t<MODELGENERATIONTIME>1958-12-16T00:00:00.000000Z</MODELGENERATIONTIME>\n\t\t<SATID>Imaginary1</SATID>\n\t\t<PRINCIPAL_DISTANCE>\n\t\t\t<GENERATIONTIME>1958-12-05T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<PD>7.949165000000000e+03</PD>\n\t\t</PRINCIPAL_DISTANCE>\n\t\t<OPTICAL_DISTORTION>\n\t\t\t<GENERATIONTIME>1958-01-01T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<POLYORDER>0</POLYORDER>\n\t\t\t<ALIST>0.000000000000000e+00</ALIST>\n\t\t\t<BLIST>0.000000000000000e+00</BLIST>\n\t\t</OPTICAL_DISTORTION>\n\t\t<PERSPECTIVE_CENTER>\n\t\t\t<GENERATIONTIME>1956-01-01T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<CX>0.000000000000000e+00</CX>\n\t\t\t<CY>0.000000000000000e+00</CY>\n\t\t\t<CZ>0.000000000000000e+00</CZ>\n\t\t</PERSPECTIVE_CENTER>\n\t\t<CAMERA_ATTITUDE>\n\t\t\t<GENERATIONTIME>1958-06-08T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<QCS1>0.000000000000000e+00</QCS1>\n\t\t\t<QCS2>0.000000000000000e+00</QCS2>\n\t\t\t<QCS3>0.000000000000000e+00</QCS3>\n\t\t\t<QCS4>1.000000000000000e+00</QCS4>\n\t\t</CAMERA_ATTITUDE>\n\t\t<DETECTOR_MOUNTING>\n\t\t\t<GENERATIONTIME>1958-12-16T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<BAND_P>\n\t\t\t\t<BANDID>P</BANDID>\n\t\t\t\t<DETECTOR_ARRAY>\n\t\t\t\t\t<DETARRID>1</DETARRID>\n\t\t\t\t\t<DETORIGINX>5.372000000000000e-02</DETORIGINX>\n\t\t\t\t\t<DETORIGINY>1.407119300000001e+02</DETORIGINY>\n\t\t\t\t\t<DETROTANGLE>0.000000000000000e+00</DETROTANGLE>\n\t\t\t\t\t<DETPITCH>8.000000000000000e-03</DETPITCH>\n\t\t\t\t</DETECTOR_ARRAY>\n\t\t\t</BAND_P>\n\t\t</DETECTOR_MOUNTING>\n\t</GEO>\n\t<RPB>\n\t\t<SATID>Imaginary1</SATID>\n\t\t<BANDID>P</BANDID>\n\t\t<SPECID>RPC00B</SPECID>\n\t\t<IMAGE>\n\t\t\t<ERRBIAS>2.248000000000000e+01</ERRBIAS>\n\t\t\t<ERRRAND>1.700000000000000e-01</ERRRAND>\n\t\t\t<LINEOFFSET>26709</LINEOFFSET>\n\t\t\t<SAMPOFFSET>17600</SAMPOFFSET>\n\t\t\t<LATOFFSET>6.936799999999999e+01</LATOFFSET>\n\t\t\t<LONGOFFSET>-1.503627000000000e+02</LONGOFFSET>\n\t\t\t<HEIGHTOFFSET>171</HEIGHTOFFSET>\n\t\t\t<LINESCALE>26801</LINESCALE>\n\t\t\t<SAMPSCALE>18028</SAMPSCALE>\n\t\t\t<LATSCALE>1.452000000000000e-01</LATSCALE>\n\t\t\t<LONGSCALE>3.025000000000000e-01</LONGSCALE>\n\t\t\t<HEIGHTSCALE>500</HEIGHTSCALE>\n\t\t\t<LINENUMCOEFList>\n\t\t\t\t<LINENUMCOEF>-2.642488000000000e-03 4.073312000000000e-02 -1.037927000000000e+00 -2.908791000000000e-03 2.527253000000000e-03 1.720480000000000e-05 -2.298363000000000e-04 -1.931314000000000e-03 1.414244000000000e-03 -4.137852000000000e-07 1.168644000000000e-06 4.706566000000000e-06 -4.094229000000000e-05 -5.476480000000000e-07 1.895910000000000e-05 4.507786000000000e-05 1.392624000000000e-05 -4.610817000000000e-07 -3.069979000000000e-07 4.819229000000000e-08</LINENUMCOEF>\n\t\t\t</LINENUMCOEFList>\n\t\t\t<LINEDENCOEFList>\n\t\t\t\t<LINEDENCOEF>1.000000000000000e+00 2.809603000000000e-03 -1.385344000000000e-03 -2.469585000000000e-04 -2.351781000000000e-05 1.305840000000000e-06 -6.348779000000000e-07 -8.182297000000000e-06 2.742548000000000e-05 -1.350941000000000e-05 -2.416994000000000e-08 -2.417287000000000e-07 -3.325114000000000e-06 -6.310966000000000e-08 7.676432000000000e-07 2.579810000000000e-05 0.000000000000000e+00 0.000000000000000e+00 -3.465923000000000e-08 -2.079038000000000e-08</LINEDENCOEF>\n\t\t\t</LINEDENCOEFList>\n\t\t\t<SAMPNUMCOEFList>\n\t\t\t\t<SAMPNUMCOEF>1.060367000000000e-02 9.771339000000000e-01 8.255671000000000e-06 2.407707000000000e-02 -6.094459000000000e-04 1.710430000000000e-04 -2.064366000000000e-04 -1.078889000000000e-02 -3.772612000000000e-04 7.264004000000000e-06 8.476389000000001e-06 8.267796999999999e-05 -1.021893000000000e-04 -2.022639000000000e-05 8.934325000000001e-05 -1.632024000000000e-05 -1.763215000000000e-07 -7.503294000000000e-06 -3.476233000000000e-06 -4.905996000000000e-07</SAMPNUMCOEF>\n\t\t\t</SAMPNUMCOEFList>\n\t\t\t<SAMPDENCOEFList>\n\t\t\t\t<SAMPDENCOEF>1.000000000000000e+00 1.784514000000000e-04 6.009599000000000e-04 -4.226862000000000e-04 -5.705897000000000e-05 4.452041000000000e-06 -4.490610000000000e-06 -1.681007000000000e-05 8.248283000000000e-05 -2.083347000000000e-05 -1.470603000000000e-08 4.739356000000000e-07 -3.430188000000000e-06 -2.083383000000000e-07 3.598836000000000e-06 1.034853000000000e-06 -4.322756000000000e-08 -1.689295000000000e-07 1.725840000000000e-07 0.000000000000000e+00</SAMPDENCOEF>\n\t\t\t</SAMPDENCOEFList>\n\t\t</IMAGE>\n\t</RPB>\n</isd>\n"
  },
  {
    "path": "src/asp/Sessions/tests/dg_example4.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<isd>\n\t<IMD>\n\t\t<VERSION>AA</VERSION>\n\t\t<BANDID>P</BANDID>\n\t\t<NUMROWS>23708</NUMROWS>\n\t\t<NUMCOLUMNS>35170</NUMCOLUMNS>\n\t\t<RADIOMETRICLEVEL>Corrected</RADIOMETRICLEVEL>\n\t\t<BITSPERPIXEL>16</BITSPERPIXEL>\n\t\t<COMPRESSIONTYPE>None</COMPRESSIONTYPE>\n\t\t<OUTPUTFORMAT>GeoTIFF</OUTPUTFORMAT>\n\t\t<IMAGE>\n\t\t\t<SATID>Imaginary1</SATID>\n\t\t\t<MODE>FullSwath</MODE>\n\t\t\t<SCANDIRECTION>Forward</SCANDIRECTION>\n\t\t\t<TLCTIME>1959-11-25T17:39:48.740958Z</TLCTIME>\n\t\t\t<NUMTLC>2</NUMTLC>\n\t\t\t<TLCLISTList>\n\t\t\t\t<TLCLIST>0.000000000000000e+00 0.000000000000000e+00</TLCLIST>\n\t\t\t\t<TLCLIST>2.370800000000000e+04 1.975667000000000e+00</TLCLIST>\n\t\t\t</TLCLISTList>\n\t\t\t<FIRSTLINETIME>1959-11-25T17:39:48.740958Z</FIRSTLINETIME>\n\t\t\t<AVGLINERATE>1.200000000000000e+04</AVGLINERATE>\n\t\t\t<EXPOSUREDURATION>2.666670000000000e-03</EXPOSUREDURATION>\n\t\t\t<MINCOLLECTEDROWGSD>7.290000000000000e-01</MINCOLLECTEDROWGSD>\n\t\t\t<MAXCOLLECTEDROWGSD>7.320000000000000e-01</MAXCOLLECTEDROWGSD>\n\t\t\t<MEANCOLLECTEDROWGSD>7.310000000000000e-01</MEANCOLLECTEDROWGSD>\n\t\t\t<MINCOLLECTEDCOLGSD>6.720000000000000e-01</MINCOLLECTEDCOLGSD>\n\t\t\t<MAXCOLLECTEDCOLGSD>6.720000000000000e-01</MAXCOLLECTEDCOLGSD>\n\t\t\t<MEANCOLLECTEDCOLGSD>6.720000000000000e-01</MEANCOLLECTEDCOLGSD>\n\t\t\t<MEANCOLLECTEDGSD>7.010000000000000e-01</MEANCOLLECTEDGSD>\n\t\t\t<ROWUNCERTAINTY>5.732000000000000e+01</ROWUNCERTAINTY>\n\t\t\t<COLUNCERTAINTY>3.417000000000000e+01</COLUNCERTAINTY>\n\t\t\t<MINSUNAZ>1.619000000000000e+02</MINSUNAZ>\n\t\t\t<MAXSUNAZ>1.620000000000000e+02</MAXSUNAZ>\n\t\t\t<MEANSUNAZ>1.619000000000000e+02</MEANSUNAZ>\n\t\t\t<MINSUNEL>2.750000000000000e+01</MINSUNEL>\n\t\t\t<MAXSUNEL>2.770000000000000e+01</MAXSUNEL>\n\t\t\t<MEANSUNEL>2.760000000000000e+01</MEANSUNEL>\n\t\t\t<MINSATAZ>2.660000000000000e+01</MINSATAZ>\n\t\t\t<MAXSATAZ>2.720000000000000e+01</MAXSATAZ>\n\t\t\t<MEANSATAZ>2.690000000000000e+01</MEANSATAZ>\n\t\t\t<MINSATEL>5.200000000000000e+01</MINSATEL>\n\t\t\t<MAXSATEL>5.320000000000000e+01</MAXSATEL>\n\t\t\t<MEANSATEL>5.260000000000000e+01</MEANSATEL>\n\t\t\t<MININTRACKVIEWANGLE>3.240000000000000e+01</MININTRACKVIEWANGLE>\n\t\t\t<MAXINTRACKVIEWANGLE>3.270000000000000e+01</MAXINTRACKVIEWANGLE>\n\t\t\t<MEANINTRACKVIEWANGLE>3.260000000000000e+01</MEANINTRACKVIEWANGLE>\n\t\t\t<MINCROSSTRACKVIEWANGLE>1.170000000000000e+01</MINCROSSTRACKVIEWANGLE>\n\t\t\t<MAXCROSSTRACKVIEWANGLE>1.210000000000000e+01</MAXCROSSTRACKVIEWANGLE>\n\t\t\t<MEANCROSSTRACKVIEWANGLE>1.190000000000000e+01</MEANCROSSTRACKVIEWANGLE>\n\t\t\t<MINOFFNADIRVIEWANGLE>3.440000000000000e+01</MINOFFNADIRVIEWANGLE>\n\t\t\t<MAXOFFNADIRVIEWANGLE>3.440000000000000e+01</MAXOFFNADIRVIEWANGLE>\n\t\t\t<MEANOFFNADIRVIEWANGLE>3.440000000000000e+01</MEANOFFNADIRVIEWANGLE>\n\t\t\t<PNIIRS>4.200000000000000e+00</PNIIRS>\n\t\t\t<CLOUDCOVER>0.000000000000000e+00</CLOUDCOVER>\n\t\t\t<RESAMPLINGKERNEL>CC</RESAMPLINGKERNEL>\n\t\t\t<TDILEVEL>32</TDILEVEL>\n\t\t\t<POSITIONKNOWLEDGESRC>R</POSITIONKNOWLEDGESRC>\n\t\t\t<ATTITUDEKNOWLEDGESRC>R</ATTITUDEKNOWLEDGESRC>\n\t\t</IMAGE>\n\t</IMD>\n\t<EPH>\n\t\t<SATID>Imaginary1</SATID>\n\t\t<GENERATIONTIME>1959-11-25T19:05:33.862633Z</GENERATIONTIME>\n\t\t<STARTTIME>1959-11-25T17:39:40.987511Z</STARTTIME>\n\t\t<NUMPOINTS>840</NUMPOINTS>\n\t\t<TIMEINTERVAL>2.000000000000000e-02</TIMEINTERVAL>\n\t\t<EPHEMLISTList>\n\t\t\t<EPHEMLIST>1.000000000000000e+00 -1.150529111070304e+06 -4.900037170821411e+06 4.673402253879593e+06 -2.844266339347013e+03 -4.580208925894603e+03 -5.486888667664808e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.000000000000000e+00 -1.150585995837413e+06 -4.900128772944907e+06 4.673292515863864e+06 -2.844251584254513e+03 -4.580080713915985e+03 -5.487003834508436e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.000000000000000e+00 -1.150642880303100e+06 -4.900220372492305e+06 4.673182775558697e+06 -2.844236826943937e+03 -4.579952496310532e+03 -5.487119001767498e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.000000000000000e+00 -1.150699764494275e+06 -4.900311969514028e+06 4.673073032904602e+06 -2.844222067857655e+03 -4.579824274595800e+03 -5.487234167951268e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.000000000000000e+00 -1.150756648380619e+06 -4.900403563953296e+06 4.672963287968581e+06 -2.844207307142466e+03 -4.579696052627004e+03 -5.487349329716501e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.000000000000000e+00 -1.150813531973219e+06 -4.900495155830931e+06 4.672853540726059e+06 -2.844192543983192e+03 -4.579567828490194e+03 -5.487464489059428e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.000000000000000e+00 -1.150870415294624e+06 -4.900586745189165e+06 4.672743791127197e+06 -2.844177779207410e+03 -4.579439598388071e+03 -5.487579648831945e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.000000000000000e+00 -1.150927298277373e+06 -4.900678331901664e+06 4.672634039321106e+06 -2.844163013479430e+03 -4.579311373453886e+03 -5.487694799271948e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.000000000000000e+00 -1.150984180988860e+06 -4.900769916094676e+06 4.672524285158779e+06 -2.844148245986792e+03 -4.579183142428841e+03 -5.487809950315375e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.000000000000000e+01 -1.151041063417754e+06 -4.900861497747016e+06 4.672414528665220e+06 -2.844133475840487e+03 -4.579054907747178e+03 -5.487925100296267e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.100000000000000e+01 -1.151097945507887e+06 -4.900953076753495e+06 4.672304769964599e+06 -2.844118705172034e+03 -4.578926677823406e+03 -5.488040241099258e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.200000000000000e+01 -1.151154827371495e+06 -4.901044653324357e+06 4.672195008808733e+06 -2.844103931308538e+03 -4.578798434954264e+03 -5.488155388977065e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.300000000000000e+01 -1.151211708907560e+06 -4.901136227270410e+06 4.672085245420964e+06 -2.844089156197057e+03 -4.578670195508489e+03 -5.488270529139892e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.400000000000000e+01 -1.151268590149601e+06 -4.901227798654475e+06 4.671975479727124e+06 -2.844074379018060e+03 -4.578541953612254e+03 -5.488385666949694e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.500000000000000e+01 -1.151325471075321e+06 -4.901319367434779e+06 4.671865711776550e+06 -2.844059601800196e+03 -4.578413712984060e+03 -5.488500798328534e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.600000000000000e+01 -1.151382351740661e+06 -4.901410933716147e+06 4.671755941445468e+06 -2.844044821060139e+03 -4.578285464949879e+03 -5.488615932223071e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.700000000000000e+01 -1.151439232123080e+06 -4.901502497456396e+06 4.671646168783685e+06 -2.844030037785475e+03 -4.578157213251616e+03 -5.488731065006846e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.800000000000000e+01 -1.151496112155442e+06 -4.901594058529757e+06 4.671536393939713e+06 -2.844015255598032e+03 -4.578028967718285e+03 -5.488846186690504e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.900000000000000e+01 -1.151552991938527e+06 -4.901685617125041e+06 4.671426616690597e+06 -2.844000469617523e+03 -4.577900713024012e+03 -5.488961312502534e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.000000000000000e+01 -1.151609871416160e+06 -4.901777173137079e+06 4.671316837160538e+06 -2.843985681735768e+03 -4.577772458286071e+03 -5.489076433841945e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.100000000000000e+01 -1.151666750610898e+06 -4.901868726608082e+06 4.671207055299672e+06 -2.843970892771224e+03 -4.577644199024388e+03 -5.489191554142876e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.200000000000000e+01 -1.151723629500114e+06 -4.901960277495755e+06 4.671097271157968e+06 -2.843956101303744e+03 -4.577515939868817e+03 -5.489306670116709e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.300000000000000e+01 -1.151780508061520e+06 -4.902051825758324e+06 4.670987484784760e+06 -2.843941310398315e+03 -4.577387683219245e+03 -5.489421778337507e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.400000000000000e+01 -1.151837386373473e+06 -4.902143371542585e+06 4.670877696006669e+06 -2.843926515631169e+03 -4.577259417541747e+03 -5.489536890603293e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.500000000000000e+01 -1.151894264402217e+06 -4.902234914785371e+06 4.670767904898304e+06 -2.843911718023092e+03 -4.577131148313282e+03 -5.489652001800463e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.600000000000000e+01 -1.151951142103047e+06 -4.902326455402927e+06 4.670658111558600e+06 -2.843896921042729e+03 -4.577002881675212e+03 -5.489767105143569e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.700000000000000e+01 -1.152008019509473e+06 -4.902417993458058e+06 4.670548315913371e+06 -2.843882121649303e+03 -4.576874612858939e+03 -5.489882206058975e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.800000000000000e+01 -1.152064896632588e+06 -4.902509528971580e+06 4.670438517938030e+06 -2.843867319682478e+03 -4.576746340501584e+03 -5.489997305776314e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.900000000000000e+01 -1.152121773472520e+06 -4.902601061943715e+06 4.670328717632309e+06 -2.843852516488502e+03 -4.576618063637789e+03 -5.490112404505194e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.000000000000000e+01 -1.152178649973106e+06 -4.902692592269323e+06 4.670218915120433e+06 -2.843837712704800e+03 -4.576489791849443e+03 -5.490227493822896e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.100000000000000e+01 -1.152235526246320e+06 -4.902784120158154e+06 4.670109110154591e+06 -2.843822904164006e+03 -4.576361507616246e+03 -5.490342590489337e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.200000000000000e+01 -1.152292402191408e+06 -4.902875645421492e+06 4.669999302957743e+06 -2.843808096122985e+03 -4.576233225949493e+03 -5.490457679381193e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.300000000000000e+01 -1.152349277796962e+06 -4.902967168038044e+06 4.669889493555067e+06 -2.843793286913500e+03 -4.576104949464185e+03 -5.490572759035058e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.400000000000000e+01 -1.152406153186410e+06 -4.903058688238930e+06 4.669779681673459e+06 -2.843778474140327e+03 -4.575976658274283e+03 -5.490687847413945e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.500000000000000e+01 -1.152463028269964e+06 -4.903150205856049e+06 4.669669867511555e+06 -2.843763659399241e+03 -4.575848366705903e+03 -5.490802931635549e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.600000000000000e+01 -1.152519903036292e+06 -4.903241720868234e+06 4.669560051094379e+06 -2.843748843207369e+03 -4.575720076748883e+03 -5.490918009777291e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.700000000000000e+01 -1.152576777496739e+06 -4.903333233296691e+06 4.669450232396863e+06 -2.843734026809636e+03 -4.575591785692230e+03 -5.491033083576515e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.800000000000000e+01 -1.152633651662393e+06 -4.903424743162243e+06 4.669340411394418e+06 -2.843719207983936e+03 -4.575463492932561e+03 -5.491148154551486e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.900000000000000e+01 -1.152690525544347e+06 -4.903516250485696e+06 4.669230588062446e+06 -2.843704386635668e+03 -4.575335196288773e+03 -5.491263224595757e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.000000000000000e+01 -1.152747399142728e+06 -4.903607755267271e+06 4.669120762400682e+06 -2.843689563948833e+03 -4.575206895288075e+03 -5.491378293574211e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.100000000000000e+01 -1.152804272434999e+06 -4.903699257464811e+06 4.669010934458954e+06 -2.843674739451556e+03 -4.575078594068126e+03 -5.491493358189720e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.200000000000000e+01 -1.152861145409841e+06 -4.903790757057165e+06 4.668901104262288e+06 -2.843659913643468e+03 -4.574950294300805e+03 -5.491608416797939e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.300000000000000e+01 -1.152918018134627e+06 -4.903882254170460e+06 4.668791271661562e+06 -2.843645085271854e+03 -4.574821984989120e+03 -5.491723479295699e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.400000000000000e+01 -1.152974890530784e+06 -4.903973748657627e+06 4.668681436830656e+06 -2.843630255873566e+03 -4.574693678917060e+03 -5.491838534141622e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.500000000000000e+01 -1.153031762631818e+06 -4.904065240581444e+06 4.668571599695355e+06 -2.843615424267048e+03 -4.574565370809171e+03 -5.491953586346244e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.600000000000000e+01 -1.153088634482690e+06 -4.904156730026064e+06 4.668461760156151e+06 -2.843600590214636e+03 -4.574437053293622e+03 -5.492068642270134e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.700000000000000e+01 -1.153145505993540e+06 -4.904248216823312e+06 4.668351918411899e+06 -2.843585755024012e+03 -4.574308740734860e+03 -5.492183689136757e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.800000000000000e+01 -1.153202377242944e+06 -4.904339701120278e+06 4.668242074288663e+06 -2.843570917922168e+03 -4.574180420390991e+03 -5.492298738103873e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.900000000000000e+01 -1.153259248152341e+06 -4.904431182769935e+06 4.668132227960333e+06 -2.843556080060214e+03 -4.574052105153576e+03 -5.492413777716386e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.000000000000000e+01 -1.153316118788852e+06 -4.904522661897971e+06 4.668022379278250e+06 -2.843541239267616e+03 -4.573923784110380e+03 -5.492528818211897e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.100000000000000e+01 -1.153372989130191e+06 -4.904614138462659e+06 4.667912528291783e+06 -2.843526397590566e+03 -4.573795460904361e+03 -5.492643855574530e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.200000000000000e+01 -1.153429859187451e+06 -4.904705612484806e+06 4.667802674976319e+06 -2.843511553215319e+03 -4.573667133734673e+03 -5.492758892152260e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.300000000000000e+01 -1.153486728926893e+06 -4.904797083901284e+06 4.667692819406519e+06 -2.843496707544644e+03 -4.573538808049596e+03 -5.492873922690167e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.400000000000000e+01 -1.153543598382262e+06 -4.904888552775256e+06 4.667582961507676e+06 -2.843481860526524e+03 -4.573410477939130e+03 -5.492988952223373e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.500000000000000e+01 -1.153600467531033e+06 -4.904980019064590e+06 4.667473101329635e+06 -2.843467011793300e+03 -4.573282147756354e+03 -5.493103977227182e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.600000000000000e+01 -1.153657336395500e+06 -4.905071482811065e+06 4.667363238822975e+06 -2.843452160288984e+03 -4.573153813781507e+03 -5.493219001333411e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.700000000000000e+01 -1.153714204964581e+06 -4.905162943993925e+06 4.667253374012247e+06 -2.843437307982118e+03 -4.573025477108835e+03 -5.493334022723365e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.800000000000000e+01 -1.153771073238083e+06 -4.905254402612862e+06 4.667143506897822e+06 -2.843422453017709e+03 -4.572897138747175e+03 -5.493449041381165e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.900000000000000e+01 -1.153827941216130e+06 -4.905345858668094e+06 4.667033637479442e+06 -2.843407597158233e+03 -4.572768797866286e+03 -5.493564057213151e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.000000000000000e+01 -1.153884808909815e+06 -4.905437312180419e+06 4.666923765732494e+06 -2.843392738801496e+03 -4.572640452983973e+03 -5.493679072200657e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.100000000000000e+01 -1.153941676296602e+06 -4.905528763107707e+06 4.666813891706831e+06 -2.843377878402196e+03 -4.572512107970349e+03 -5.493794082857313e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.200000000000000e+01 -1.153998543387832e+06 -4.905620211471166e+06 4.666704015377372e+06 -2.843363017441559e+03 -4.572383760459086e+03 -5.493909090518860e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.300000000000000e+01 -1.154055410183384e+06 -4.905711657270607e+06 4.666594136744323e+06 -2.843348153923399e+03 -4.572255410789019e+03 -5.494024095801255e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.400000000000000e+01 -1.154112276694348e+06 -4.905803100526833e+06 4.666484255783088e+06 -2.843333288033959e+03 -4.572127057540642e+03 -5.494139099823244e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.500000000000000e+01 -1.154169142876027e+06 -4.905894541156168e+06 4.666374372592675e+06 -2.843318422338207e+03 -4.571998706797271e+03 -5.494254096268891e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.600000000000000e+01 -1.154226008784337e+06 -4.905985979263305e+06 4.666264487049202e+06 -2.843303553799633e+03 -4.571870350720647e+03 -5.494369093154796e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.700000000000000e+01 -1.154282874396747e+06 -4.906077414806122e+06 4.666154599202517e+06 -2.843288682830397e+03 -4.571741992438925e+03 -5.494484087643367e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.800000000000000e+01 -1.154339739713385e+06 -4.906168847784837e+06 4.666044709052360e+06 -2.843273811176478e+03 -4.571613631705432e+03 -5.494599079153784e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.900000000000000e+01 -1.154396604745338e+06 -4.906260278220244e+06 4.665934816574119e+06 -2.843258936751139e+03 -4.571485267252272e+03 -5.494714069704265e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.000000000000000e+01 -1.154453469458874e+06 -4.906351706049254e+06 4.665824921842472e+06 -2.843244060987852e+03 -4.571356904121445e+03 -5.494829054374317e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.100000000000000e+01 -1.154510333887738e+06 -4.906443131335001e+06 4.665715024782693e+06 -2.843229183998753e+03 -4.571228536773508e+03 -5.494944037806771e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.200000000000000e+01 -1.154567198031729e+06 -4.906534554077177e+06 4.665605125395147e+06 -2.843214303794174e+03 -4.571100165869832e+03 -5.495059020341043e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.300000000000000e+01 -1.154624061868566e+06 -4.906625974234062e+06 4.665495223729224e+06 -2.843199423239261e+03 -4.570971794176063e+03 -5.495173998338155e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.400000000000000e+01 -1.154680925409340e+06 -4.906717391826447e+06 4.665385319760310e+06 -2.843184540549422e+03 -4.570843420385077e+03 -5.495288973712725e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.500000000000000e+01 -1.154737788665132e+06 -4.906808806875126e+06 4.665275413463791e+06 -2.843169655036500e+03 -4.570715042893835e+03 -5.495403948133842e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.600000000000000e+01 -1.154794651613666e+06 -4.906900219338380e+06 4.665165504889054e+06 -2.843154769233221e+03 -4.570586664482401e+03 -5.495518918101102e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.700000000000000e+01 -1.154851514266028e+06 -4.906991629237007e+06 4.665055594011488e+06 -2.843139881116995e+03 -4.570458284256192e+03 -5.495633885287098e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.800000000000000e+01 -1.154908376622101e+06 -4.907083036570825e+06 4.664945680831304e+06 -2.843124990803692e+03 -4.570329901775607e+03 -5.495748850011772e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.900000000000000e+01 -1.154965238659604e+06 -4.907174441298127e+06 4.664835765397899e+06 -2.843110100459730e+03 -4.570201520461547e+03 -5.495863808398282e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.000000000000000e+01 -1.155022100434441e+06 -4.907265843523558e+06 4.664725847587340e+06 -2.843095206624067e+03 -4.570073131690681e+03 -5.495978769314877e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.100000000000000e+01 -1.155078961890472e+06 -4.907357243142126e+06 4.664615927523985e+06 -2.843080311355226e+03 -4.569944744603838e+03 -5.496093724089453e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.200000000000000e+01 -1.155135823072649e+06 -4.907448640237903e+06 4.664506005108253e+06 -2.843065414629913e+03 -4.569816351275252e+03 -5.496208679444347e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.300000000000000e+01 -1.155192683935948e+06 -4.907540034726722e+06 4.664396080439836e+06 -2.843050515736385e+03 -4.569687959721338e+03 -5.496323628913139e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.400000000000000e+01 -1.155249544525319e+06 -4.907631426692662e+06 4.664286153419144e+06 -2.843035615414764e+03 -4.569559561987407e+03 -5.496438578896835e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.500000000000000e+01 -1.155306404807031e+06 -4.907722816072658e+06 4.664176224120885e+06 -2.843020713163069e+03 -4.569431164083182e+03 -5.496553524533780e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.600000000000000e+01 -1.155363264769761e+06 -4.907814202845571e+06 4.664066292570105e+06 -2.843005809429155e+03 -4.569302767773566e+03 -5.496668464127544e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.700000000000000e+01 -1.155420124469661e+06 -4.907905587116427e+06 4.663956358642382e+06 -2.842990903844056e+03 -4.569174363438064e+03 -5.496783405989848e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.800000000000000e+01 -1.155476983861794e+06 -4.907996968801212e+06 4.663846422437257e+06 -2.842975996279350e+03 -4.569045959131432e+03 -5.496898343359439e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.900000000000000e+01 -1.155533842979658e+06 -4.908088347962614e+06 4.663736483880439e+06 -2.842961085763979e+03 -4.568917548917253e+03 -5.497013281700698e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.000000000000000e+01 -1.155590701756154e+06 -4.908179724475113e+06 4.663626543120671e+06 -2.842946175802107e+03 -4.568789143443045e+03 -5.497128210416423e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.100000000000000e+01 -1.155647560258395e+06 -4.908271098464282e+06 4.663516600009158e+06 -2.842931263162876e+03 -4.568660732213298e+03 -5.497243139851564e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.200000000000000e+01 -1.155704418475052e+06 -4.908362469908987e+06 4.663406654570953e+06 -2.842916347579419e+03 -4.568532317509039e+03 -5.497358068195705e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.300000000000000e+01 -1.155761276372644e+06 -4.908453838746571e+06 4.663296706880289e+06 -2.842901432037963e+03 -4.568403903549264e+03 -5.497472990528127e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.400000000000000e+01 -1.155818133995873e+06 -4.908545205060690e+06 4.663186756838045e+06 -2.842886513584070e+03 -4.568275484064951e+03 -5.497587913490115e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.500000000000000e+01 -1.155874991322208e+06 -4.908636568809252e+06 4.663076804494101e+06 -2.842871592728384e+03 -4.568147062727805e+03 -5.497702833743227e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.600000000000000e+01 -1.155931848329377e+06 -4.908727929950567e+06 4.662966849897867e+06 -2.842856672016299e+03 -4.568018642278726e+03 -5.497817747817630e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.700000000000000e+01 -1.155988705050784e+06 -4.908819288547194e+06 4.662856892975205e+06 -2.842841748015673e+03 -4.567890218193316e+03 -5.497932661093408e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.800000000000000e+01 -1.156045561464160e+06 -4.908910644557439e+06 4.662746933775521e+06 -2.842826823819952e+03 -4.567761793118867e+03 -5.498047569932273e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>9.900000000000000e+01 -1.156102417614191e+06 -4.909001998064948e+06 4.662636972199687e+06 -2.842811895910526e+03 -4.567633361174029e+03 -5.498162480900789e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.000000000000000e+02 -1.156159273444750e+06 -4.909093348964773e+06 4.662527008372096e+06 -2.842796966748417e+03 -4.567504930416047e+03 -5.498277386069291e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.010000000000000e+02 -1.156216128955963e+06 -4.909184697257137e+06 4.662417042292492e+06 -2.842782037507791e+03 -4.567376500664933e+03 -5.498392285059853e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.020000000000000e+02 -1.156272984192528e+06 -4.909276043025675e+06 4.662307073861729e+06 -2.842767105266476e+03 -4.567248065530181e+03 -5.498507184599629e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.030000000000000e+02 -1.156329839165524e+06 -4.909367386291160e+06 4.662197103055177e+06 -2.842752169526072e+03 -4.567119623048505e+03 -5.498622086574209e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.040000000000000e+02 -1.156386693751856e+06 -4.909458726823345e+06 4.662087130145821e+06 -2.842737236159083e+03 -4.566991191890783e+03 -5.498736972535802e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.050000000000000e+02 -1.156443548108242e+06 -4.909550064915373e+06 4.661977154786103e+06 -2.842722298301765e+03 -4.566862748430161e+03 -5.498851865572372e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.060000000000000e+02 -1.156500402178548e+06 -4.909641400462311e+06 4.661867177100432e+06 -2.842707357553832e+03 -4.566734301078247e+03 -5.498966757845177e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.070000000000000e+02 -1.156557255906893e+06 -4.909732733359624e+06 4.661757197212764e+06 -2.842692417785086e+03 -4.566605858096571e+03 -5.499081640618123e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.080000000000000e+02 -1.156614109360295e+06 -4.909824063732712e+06 4.661647214974411e+06 -2.842677474416332e+03 -4.566477409952301e+03 -5.499196524023264e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.090000000000000e+02 -1.156670962550078e+06 -4.909915391602735e+06 4.661537230360270e+06 -2.842662529114237e+03 -4.566348953955546e+03 -5.499311409581958e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.100000000000000e+02 -1.156727815408916e+06 -4.910006716843826e+06 4.661427243519608e+06 -2.842647582587687e+03 -4.566220501066961e+03 -5.499426287704412e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.110000000000000e+02 -1.156784667947893e+06 -4.910098039476763e+06 4.661317254427799e+06 -2.842632634722024e+03 -4.566092049832412e+03 -5.499541159672718e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.120000000000000e+02 -1.156841520211948e+06 -4.910189359585556e+06 4.661207262985204e+06 -2.842617685353838e+03 -4.565963592481087e+03 -5.499656032131907e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.130000000000000e+02 -1.156898372178557e+06 -4.910280677128133e+06 4.661097269241722e+06 -2.842602733558466e+03 -4.565835133179066e+03 -5.499770901976718e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.140000000000000e+02 -1.156955223858803e+06 -4.910371992125261e+06 4.660987273172718e+06 -2.842587779243282e+03 -4.565706669957761e+03 -5.499885770913411e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.150000000000000e+02 -1.157012075252817e+06 -4.910463304577160e+06 4.660877274777933e+06 -2.842572823660461e+03 -4.565578202608126e+03 -5.500000638552833e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.160000000000000e+02 -1.157068926315674e+06 -4.910554614399873e+06 4.660767274156960e+06 -2.842557867008848e+03 -4.565449738346610e+03 -5.500115498704139e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.170000000000000e+02 -1.157125777080865e+06 -4.910645921656067e+06 4.660657271235478e+06 -2.842542908243628e+03 -4.565321272091635e+03 -5.500230356135726e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.180000000000000e+02 -1.157182627559714e+06 -4.910737226366895e+06 4.660547265988373e+06 -2.842527948095325e+03 -4.565192801678863e+03 -5.500345212347203e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.190000000000000e+02 -1.157239477740908e+06 -4.910828528511248e+06 4.660437258440705e+06 -2.842512985838483e+03 -4.565064329017664e+03 -5.500460066052059e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.200000000000000e+02 -1.157296327613124e+06 -4.910919828067995e+06 4.660327248617536e+06 -2.842498021559147e+03 -4.564935856224390e+03 -5.500574915422580e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.210000000000000e+02 -1.157353177221297e+06 -4.911011125121132e+06 4.660217236419208e+06 -2.842483055570052e+03 -4.564807375712488e+03 -5.500689766729941e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.220000000000000e+02 -1.157410026486819e+06 -4.911102419523763e+06 4.660107222020037e+06 -2.842468088076580e+03 -4.564678900309353e+03 -5.500804609039477e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.230000000000000e+02 -1.157466875488228e+06 -4.911193711422692e+06 4.659997205245812e+06 -2.842453118884190e+03 -4.564550417147433e+03 -5.500919453314606e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.240000000000000e+02 -1.157523724180601e+06 -4.911285000733973e+06 4.659887186196138e+06 -2.842438147717739e+03 -4.564421933365905e+03 -5.501034293645719e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.250000000000000e+02 -1.157580572563824e+06 -4.911376287457443e+06 4.659777164871238e+06 -2.842423174714715e+03 -4.564293449781891e+03 -5.501149129280417e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.260000000000000e+02 -1.157637420671623e+06 -4.911467571656134e+06 4.659667141196298e+06 -2.842408200157342e+03 -4.564164959991508e+03 -5.501263965502825e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.270000000000000e+02 -1.157694268447879e+06 -4.911558853225172e+06 4.659557115295780e+06 -2.842393224428646e+03 -4.564036473365310e+03 -5.501378794221748e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.280000000000000e+02 -1.157751115970878e+06 -4.911650132310958e+06 4.659447086995930e+06 -2.842378244950554e+03 -4.563907977732702e+03 -5.501493626885192e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.290000000000000e+02 -1.157807963173548e+06 -4.911741408788074e+06 4.659337056445612e+06 -2.842363265453650e+03 -4.563779483125079e+03 -5.501608453332415e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.300000000000000e+02 -1.157864810078170e+06 -4.911832682698227e+06 4.659227023595320e+06 -2.842348283688554e+03 -4.563650986509332e+03 -5.501723277142027e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.310000000000000e+02 -1.157921656673430e+06 -4.911923954020308e+06 4.659116988470130e+06 -2.842333300081384e+03 -4.563522489660076e+03 -5.501838096622433e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.320000000000000e+02 -1.157978503004253e+06 -4.912015222838267e+06 4.659006950970355e+06 -2.842318314476045e+03 -4.563393984836485e+03 -5.501952918383498e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.330000000000000e+02 -1.158035349014441e+06 -4.912106489047130e+06 4.658896911220641e+06 -2.842303326923101e+03 -4.563265481785996e+03 -5.502067734167819e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.340000000000000e+02 -1.158092194715323e+06 -4.912197752668047e+06 4.658786869195876e+06 -2.842288338997628e+03 -4.563136977960232e+03 -5.502182545417339e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.350000000000000e+02 -1.158149040117984e+06 -4.912289013721783e+06 4.658676824871410e+06 -2.842273348822791e+03 -4.563008472083676e+03 -5.502297354056945e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.360000000000000e+02 -1.158205885244700e+06 -4.912380272250024e+06 4.658566778197742e+06 -2.842258355489071e+03 -4.562879960628598e+03 -5.502412163476751e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.370000000000000e+02 -1.158262730062005e+06 -4.912471528190184e+06 4.658456729249188e+06 -2.842243361971740e+03 -4.562751448545757e+03 -5.502526968151961e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.380000000000000e+02 -1.158319574580980e+06 -4.912562781563034e+06 4.658346678001096e+06 -2.842228365996533e+03 -4.562622934344506e+03 -5.502641770368349e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.390000000000000e+02 -1.158376418801509e+06 -4.912654032368389e+06 4.658236624453678e+06 -2.842213367906349e+03 -4.562494418115616e+03 -5.502756569894454e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.400000000000000e+02 -1.158433262701320e+06 -4.912745280564608e+06 4.658126568656394e+06 -2.842198369709035e+03 -4.562365902873752e+03 -5.502871363278264e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.410000000000000e+02 -1.158490106336292e+06 -4.912836526256173e+06 4.658016510485158e+06 -2.842183368138239e+03 -4.562237380381233e+03 -5.502986158950476e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.420000000000000e+02 -1.158546949683911e+06 -4.912927769401041e+06 4.657906449989897e+06 -2.842168363896095e+03 -4.562108854062119e+03 -5.503100953702363e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.430000000000000e+02 -1.158603792688309e+06 -4.913019009894783e+06 4.657796387294654e+06 -2.842153360457620e+03 -4.561980332222231e+03 -5.503215738952478e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.440000000000000e+02 -1.158660635450158e+06 -4.913110247925587e+06 4.657686322175892e+06 -2.842138352708486e+03 -4.561851799613107e+03 -5.503330529883975e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.450000000000000e+02 -1.158717477857356e+06 -4.913201483283999e+06 4.657576254882442e+06 -2.842123344794960e+03 -4.561723273881315e+03 -5.503445309726495e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.460000000000000e+02 -1.158774319988419e+06 -4.913292716116721e+06 4.657466185240003e+06 -2.842108335234259e+03 -4.561594741796339e+03 -5.503560090319568e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.470000000000000e+02 -1.158831161809555e+06 -4.913383946360675e+06 4.657356113323534e+06 -2.842093323381529e+03 -4.561466209790116e+03 -5.503674866524151e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.480000000000000e+02 -1.158888003376882e+06 -4.913475174120710e+06 4.657246039008463e+06 -2.842078309124447e+03 -4.561337668387877e+03 -5.503789646389006e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.490000000000000e+02 -1.158944844589497e+06 -4.913566399208312e+06 4.657135962518764e+06 -2.842063294502320e+03 -4.561209133503902e+03 -5.503904415560080e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.500000000000000e+02 -1.159001685503280e+06 -4.913657621727939e+06 4.657025883730334e+06 -2.842048277761278e+03 -4.561080596594672e+03 -5.504019182040975e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.510000000000000e+02 -1.159058526140752e+06 -4.913748841721660e+06 4.656915802593191e+06 -2.842033259542652e+03 -4.560952053848240e+03 -5.504133948759569e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.520000000000000e+02 -1.159115366490593e+06 -4.913840059168374e+06 4.656805719132397e+06 -2.842018238280638e+03 -4.560823507267878e+03 -5.504248714731303e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.530000000000000e+02 -1.159172206552689e+06 -4.913931274067899e+06 4.656695633348170e+06 -2.842003214660535e+03 -4.560694956781908e+03 -5.504363479707200e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.540000000000000e+02 -1.159229046304774e+06 -4.914022486378607e+06 4.656585545289976e+06 -2.841988190576093e+03 -4.560566405556490e+03 -5.504478240160712e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.550000000000000e+02 -1.159285885713142e+06 -4.914113696037565e+06 4.656475455032634e+06 -2.841973165872654e+03 -4.560437859482440e+03 -5.504592991190972e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.560000000000000e+02 -1.159342724867248e+06 -4.914204903211967e+06 4.656365362377415e+06 -2.841958137253684e+03 -4.560309304135315e+03 -5.504707746457514e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.570000000000000e+02 -1.159399563711236e+06 -4.914296107797430e+06 4.656255267448400e+06 -2.841943108250072e+03 -4.560180748200602e+03 -5.504822497037966e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.580000000000000e+02 -1.159456402256106e+06 -4.914387309814564e+06 4.656145170221085e+06 -2.841928076547665e+03 -4.560052190310143e+03 -5.504937245130940e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.590000000000000e+02 -1.159513240501984e+06 -4.914478509263587e+06 4.656035070695212e+06 -2.841913044054540e+03 -4.559923629941019e+03 -5.505051990316801e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.600000000000000e+02 -1.159570078448758e+06 -4.914569706144325e+06 4.655924968870988e+06 -2.841898009308997e+03 -4.559795067451519e+03 -5.505166732952694e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.610000000000000e+02 -1.159626916096302e+06 -4.914660900456604e+06 4.655814864748633e+06 -2.841882972135561e+03 -4.559666503195977e+03 -5.505281472818868e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.620000000000000e+02 -1.159683753444752e+06 -4.914752092200642e+06 4.655704758327880e+06 -2.841867934470212e+03 -4.559537936207125e+03 -5.505396209857956e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.630000000000000e+02 -1.159740590505184e+06 -4.914843281397182e+06 4.655594649584064e+06 -2.841852893898874e+03 -4.559409365406308e+03 -5.505510946068770e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.640000000000000e+02 -1.159797427232697e+06 -4.914934467962373e+06 4.655484538616895e+06 -2.841837852513516e+03 -4.559280797862085e+03 -5.505625674545290e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.650000000000000e+02 -1.159854263683395e+06 -4.915025652001026e+06 4.655374425301747e+06 -2.841822809226096e+03 -4.559152224456187e+03 -5.505740403469651e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.660000000000000e+02 -1.159911099834778e+06 -4.915116833471132e+06 4.655264309688574e+06 -2.841807763930031e+03 -4.559023648840441e+03 -5.505855129809542e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.670000000000000e+02 -1.159967935686723e+06 -4.915208012372514e+06 4.655154191777592e+06 -2.841792716331181e+03 -4.558895071195907e+03 -5.505969853544923e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.680000000000000e+02 -1.160024771239355e+06 -4.915299188705390e+06 4.655044071568538e+06 -2.841777667871725e+03 -4.558766491207622e+03 -5.506084574290964e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.690000000000000e+02 -1.160081606526152e+06 -4.915390362532332e+06 4.654933948986996e+06 -2.841762616025784e+03 -4.558637903791051e+03 -5.506199297474513e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.700000000000000e+02 -1.160138441457423e+06 -4.915481533685839e+06 4.654823824232176e+06 -2.841747563762891e+03 -4.558509323062311e+03 -5.506314009852463e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.710000000000000e+02 -1.160195276089283e+06 -4.915572702270715e+06 4.654713697179453e+06 -2.841732511029155e+03 -4.558380739991208e+03 -5.506428719064448e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.720000000000000e+02 -1.160252110466310e+06 -4.915663868370302e+06 4.654603567729681e+06 -2.841717453670260e+03 -4.558252148015572e+03 -5.506543432516855e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.730000000000000e+02 -1.160308944532654e+06 -4.915755031880246e+06 4.654493436006983e+06 -2.841702396043576e+03 -4.558123555121537e+03 -5.506658141510594e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.740000000000000e+02 -1.160365778254614e+06 -4.915846192737643e+06 4.654383302086201e+06 -2.841687337659920e+03 -4.557994967361794e+03 -5.506772841163612e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.750000000000000e+02 -1.160422611721639e+06 -4.915937351109614e+06 4.654273165768533e+06 -2.841672275667749e+03 -4.557866370503402e+03 -5.506887544761498e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.760000000000000e+02 -1.160479444877868e+06 -4.916028506891811e+06 4.654163027178105e+06 -2.841657212883795e+03 -4.557737772920202e+03 -5.507002243974164e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.770000000000000e+02 -1.160536277734397e+06 -4.916119660104981e+06 4.654052886290241e+06 -2.841642148264060e+03 -4.557609173136513e+03 -5.507116940516494e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.780000000000000e+02 -1.160593110291093e+06 -4.916210810748943e+06 4.653942743105166e+06 -2.841627081059322e+03 -4.557480571645950e+03 -5.507231634310219e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.790000000000000e+02 -1.160649942548095e+06 -4.916301958823916e+06 4.653832597622608e+06 -2.841612013298626e+03 -4.557351967338244e+03 -5.507346325376352e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.800000000000000e+02 -1.160706774505279e+06 -4.916393104329723e+06 4.653722449842788e+06 -2.841596943104002e+03 -4.557223361231730e+03 -5.507461013703274e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.810000000000000e+02 -1.160763606151337e+06 -4.916484247245287e+06 4.653612299790794e+06 -2.841581871148091e+03 -4.557094754722674e+03 -5.507575697810995e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.820000000000000e+02 -1.160820437542369e+06 -4.916575387675351e+06 4.653502147341957e+06 -2.841566796843717e+03 -4.556966138613009e+03 -5.507690385716120e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.830000000000000e+02 -1.160877268588619e+06 -4.916666525452365e+06 4.653391992695702e+06 -2.841551721291274e+03 -4.556837527893202e+03 -5.507805064289034e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.840000000000000e+02 -1.160934099346189e+06 -4.916757660681075e+06 4.653281835727354e+06 -2.841536644613062e+03 -4.556708912633122e+03 -5.507919741843364e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.850000000000000e+02 -1.160990929792571e+06 -4.916848793319498e+06 4.653171676486894e+06 -2.841521565994612e+03 -4.556580297362415e+03 -5.508034414929202e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.860000000000000e+02 -1.161047759972429e+06 -4.916939923451077e+06 4.653061514874998e+06 -2.841506484020091e+03 -4.556451674615382e+03 -5.508149090475548e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.870000000000000e+02 -1.161104589829916e+06 -4.917031050971502e+06 4.652951351015825e+06 -2.841491402120867e+03 -4.556323052831034e+03 -5.508263759824675e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.880000000000000e+02 -1.161161419364916e+06 -4.917122175880610e+06 4.652841184909587e+06 -2.841476318559175e+03 -4.556194432795372e+03 -5.508378423098125e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.890000000000000e+02 -1.161218248599702e+06 -4.917213298220025e+06 4.652731016506728e+06 -2.841461232902410e+03 -4.556065810511246e+03 -5.508493083858846e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.900000000000000e+02 -1.161275077590370e+06 -4.917304418094483e+06 4.652620845682560e+06 -2.841446144423438e+03 -4.555937176866660e+03 -5.508607750110782e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.910000000000000e+02 -1.161331906269638e+06 -4.917395535378386e+06 4.652510672586603e+06 -2.841431054039296e+03 -4.555808543126577e+03 -5.508722411949972e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.920000000000000e+02 -1.161388734615005e+06 -4.917486650029767e+06 4.652400497268844e+06 -2.841415962565876e+03 -4.555679912641251e+03 -5.508837066186855e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.930000000000000e+02 -1.161445562660177e+06 -4.917577762111539e+06 4.652290319654368e+06 -2.841400870417292e+03 -4.555551279600870e+03 -5.508951717529146e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.940000000000000e+02 -1.161502390416234e+06 -4.917668871644435e+06 4.652180139718493e+06 -2.841385775612106e+03 -4.555422642657485e+03 -5.509066368005160e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.950000000000000e+02 -1.161559217849475e+06 -4.917759978565578e+06 4.652069957536095e+06 -2.841370679225754e+03 -4.555294007253090e+03 -5.509181012546589e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.960000000000000e+02 -1.161616045038385e+06 -4.917851083021482e+06 4.651959772932701e+06 -2.841355580199527e+03 -4.555165360637401e+03 -5.509295662369158e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.970000000000000e+02 -1.161672871870827e+06 -4.917942184802851e+06 4.651849586157556e+06 -2.841340480232637e+03 -4.555036720946046e+03 -5.509410301433109e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.980000000000000e+02 -1.161729698425290e+06 -4.918033284056189e+06 4.651739397036187e+06 -2.841325379007723e+03 -4.554908075046583e+03 -5.509524940941537e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>1.990000000000000e+02 -1.161786524690456e+06 -4.918124380760428e+06 4.651629205593686e+06 -2.841310274798608e+03 -4.554779425509763e+03 -5.509639579507056e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.000000000000000e+02 -1.161843350643823e+06 -4.918215474873597e+06 4.651519011880050e+06 -2.841295168751823e+03 -4.554650775890122e+03 -5.509754213619808e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.010000000000000e+02 -1.161900176296716e+06 -4.918306566416807e+06 4.651408815870123e+06 -2.841280062142756e+03 -4.554522123348437e+03 -5.509868845095965e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.020000000000000e+02 -1.161957001649014e+06 -4.918397655389889e+06 4.651298617564120e+06 -2.841264953102658e+03 -4.554393469117082e+03 -5.509983473739898e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.030000000000000e+02 -1.162013826700602e+06 -4.918488741792665e+06 4.651188416962255e+06 -2.841249841903648e+03 -4.554264812697756e+03 -5.510098099848559e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.040000000000000e+02 -1.162070651451606e+06 -4.918579825625350e+06 4.651078214064261e+06 -2.841234729801721e+03 -4.554136153771807e+03 -5.510212723124317e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.050000000000000e+02 -1.162127475901913e+06 -4.918670906887776e+06 4.650968008870349e+06 -2.841219615513253e+03 -4.554007492740412e+03 -5.510327343807761e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.060000000000000e+02 -1.162184300051402e+06 -4.918761985579765e+06 4.650857801380741e+06 -2.841204499003339e+03 -4.553878830014973e+03 -5.510441961568291e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.070000000000000e+02 -1.162241123911393e+06 -4.918853061722425e+06 4.650747591570271e+06 -2.841189381236472e+03 -4.553750162617042e+03 -5.510556578478550e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.080000000000000e+02 -1.162297947436923e+06 -4.918944135231888e+06 4.650637379538893e+06 -2.841174261944863e+03 -4.553621498963415e+03 -5.510671187574417e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.090000000000000e+02 -1.162354770706460e+06 -4.919035206254608e+06 4.650527165112078e+06 -2.841159140300288e+03 -4.553492825527375e+03 -5.510785800614703e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.100000000000000e+02 -1.162411593641547e+06 -4.919126274644172e+06 4.650416948464304e+06 -2.841144017641710e+03 -4.553364155466382e+03 -5.510900405921655e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.110000000000000e+02 -1.162468416275639e+06 -4.919217340463081e+06 4.650306729521099e+06 -2.841128892558820e+03 -4.553235483315887e+03 -5.511015008730119e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.120000000000000e+02 -1.162525238631247e+06 -4.919308403753331e+06 4.650196508232411e+06 -2.841113765950585e+03 -4.553106805200430e+03 -5.511129611896557e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.130000000000000e+02 -1.162582060697067e+06 -4.919399464493859e+06 4.650086284623339e+06 -2.841098636758805e+03 -4.552978123264001e+03 -5.511244214092967e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.140000000000000e+02 -1.162638882417021e+06 -4.919490522580034e+06 4.649976058818587e+06 -2.841083506902005e+03 -4.552849446256258e+03 -5.511358807092464e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.150000000000000e+02 -1.162695703836001e+06 -4.919581578095647e+06 4.649865830718308e+06 -2.841068376159833e+03 -4.552720766917384e+03 -5.511473397103791e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.160000000000000e+02 -1.162752524998660e+06 -4.919672631124066e+06 4.649755600223115e+06 -2.841053241721418e+03 -4.552592078399603e+03 -5.511587991154567e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.170000000000000e+02 -1.162809345826539e+06 -4.919763681518903e+06 4.649645367507511e+06 -2.841038106044193e+03 -4.552463393124023e+03 -5.511702577686662e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.180000000000000e+02 -1.162866166386912e+06 -4.919854729405695e+06 4.649535132421841e+06 -2.841022968508459e+03 -4.552334700107473e+03 -5.511817166220058e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.190000000000000e+02 -1.162922986601331e+06 -4.919945774638067e+06 4.649424895140611e+06 -2.841007830360738e+03 -4.552206012037203e+03 -5.511931745519352e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.200000000000000e+02 -1.162979806525626e+06 -4.920036817320275e+06 4.649314655539539e+06 -2.840992689391856e+03 -4.552077320270445e+03 -5.512046323850840e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.210000000000000e+02 -1.163036626182310e+06 -4.920127857494300e+06 4.649204413568556e+06 -2.840977546573228e+03 -4.551948620578250e+03 -5.512160904334190e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.220000000000000e+02 -1.163093445515226e+06 -4.920218895055420e+06 4.649094169352540e+06 -2.840962401575019e+03 -4.551819922866901e+03 -5.512275478784592e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.230000000000000e+02 -1.163150264535701e+06 -4.920309930024729e+06 4.648983922866325e+06 -2.840947256531522e+03 -4.551691223979411e+03 -5.512390048896862e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.240000000000000e+02 -1.163207083277185e+06 -4.920400962464715e+06 4.648873674035423e+06 -2.840932108200295e+03 -4.551562519849387e+03 -5.512504619551278e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.250000000000000e+02 -1.163263901705989e+06 -4.920491992312543e+06 4.648763422934745e+06 -2.840916958136983e+03 -4.551433815238222e+03 -5.512619186042509e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.260000000000000e+02 -1.163320719811052e+06 -4.920583019547557e+06 4.648653169588941e+06 -2.840901807919180e+03 -4.551305111861482e+03 -5.512733746217690e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.270000000000000e+02 -1.163377537659400e+06 -4.920674044294869e+06 4.648542913848794e+06 -2.840886654061033e+03 -4.551176399175538e+03 -5.512848310513376e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.280000000000000e+02 -1.163434355172580e+06 -4.920765066408133e+06 4.648432655888853e+06 -2.840871498950579e+03 -4.551047690101062e+03 -5.512962866988415e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.290000000000000e+02 -1.163491172417864e+06 -4.920856086012857e+06 4.648322395559419e+06 -2.840856341942467e+03 -4.550918972901047e+03 -5.513077425803320e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.300000000000000e+02 -1.163547989316804e+06 -4.920947102962696e+06 4.648212133035045e+06 -2.840841184272019e+03 -4.550790260777059e+03 -5.513191975301028e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.310000000000000e+02 -1.163604805936425e+06 -4.921038117382763e+06 4.648101868166510e+06 -2.840826023595991e+03 -4.550661543125591e+03 -5.513306525452610e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.320000000000000e+02 -1.163661622265660e+06 -4.921129129252391e+06 4.647991600978463e+06 -2.840810861595468e+03 -4.550532821370392e+03 -5.513421074303834e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.330000000000000e+02 -1.163718438281937e+06 -4.921220138529520e+06 4.647881331521076e+06 -2.840795697418383e+03 -4.550404099407493e+03 -5.513535618962638e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.340000000000000e+02 -1.163775253985376e+06 -4.921311145214363e+06 4.647771059794094e+06 -2.840780532663925e+03 -4.550275376538245e+03 -5.513650159296721e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.350000000000000e+02 -1.163832069409439e+06 -4.921402149369385e+06 4.647660785723004e+06 -2.840765365081456e+03 -4.550146648256850e+03 -5.513764700107045e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.360000000000000e+02 -1.163888884520431e+06 -4.921493150931775e+06 4.647550509382746e+06 -2.840750195457035e+03 -4.550017919827124e+03 -5.513879236614668e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.370000000000000e+02 -1.163945699329676e+06 -4.921584149922628e+06 4.647440230748145e+06 -2.840735025126626e+03 -4.549889188602994e+03 -5.513993770442671e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.380000000000000e+02 -1.164002513848240e+06 -4.921675146362652e+06 4.647329949794509e+06 -2.840719852034787e+03 -4.549760454059056e+03 -5.514108302957738e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.390000000000000e+02 -1.164059328031255e+06 -4.921766140168156e+06 4.647219666621682e+06 -2.840704678088866e+03 -4.549631722184866e+03 -5.514222828267240e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.400000000000000e+02 -1.164116141934793e+06 -4.921857131443746e+06 4.647109381104860e+06 -2.840689502391848e+03 -4.549502984646141e+03 -5.514337353779854e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.410000000000000e+02 -1.164172955525167e+06 -4.921948120126623e+06 4.646999093318983e+06 -2.840674324861493e+03 -4.549374246882589e+03 -5.514451874960729e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.420000000000000e+02 -1.164229768835831e+06 -4.922039106279232e+06 4.646888803189528e+06 -2.840659144343034e+03 -4.549245503439986e+03 -5.514566396913211e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.430000000000000e+02 -1.164286581833341e+06 -4.922130089839163e+06 4.646778510790969e+06 -2.840643963342353e+03 -4.549116759165489e+03 -5.514680914436035e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.440000000000000e+02 -1.164343394528777e+06 -4.922221070827122e+06 4.646668216098604e+06 -2.840628780193780e+03 -4.548988012991344e+03 -5.514795429176187e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.450000000000000e+02 -1.164400206933201e+06 -4.922312049263806e+06 4.646557919087737e+06 -2.840613594276181e+03 -4.548859263102077e+03 -5.514909942938601e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.460000000000000e+02 -1.164457018990804e+06 -4.922403025045071e+06 4.646447619882673e+06 -2.840598409233281e+03 -4.548730517616822e+03 -5.515024447261867e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.470000000000000e+02 -1.164513830813271e+06 -4.922493998379327e+06 4.646337318234636e+06 -2.840583219019079e+03 -4.548601759766613e+03 -5.515138958955755e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.480000000000000e+02 -1.164570642300033e+06 -4.922584969078952e+06 4.646227014367600e+06 -2.840568029234033e+03 -4.548473004729972e+03 -5.515253462747403e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.490000000000000e+02 -1.164627453462164e+06 -4.922675937164646e+06 4.646116708256858e+06 -2.840552837932941e+03 -4.548344251034975e+03 -5.515367960749245e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.500000000000000e+02 -1.164684264377865e+06 -4.922766902782318e+06 4.646006399728222e+06 -2.840537642578651e+03 -4.548215486715839e+03 -5.515482464154799e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.510000000000000e+02 -1.164741074968940e+06 -4.922857865786097e+06 4.645896088955829e+06 -2.840522446919258e+03 -4.548086723255349e+03 -5.515596961631279e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.520000000000000e+02 -1.164797885235281e+06 -4.922948826175817e+06 4.645785775939899e+06 -2.840507250040388e+03 -4.547957961389874e+03 -5.515711452971970e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.530000000000000e+02 -1.164854695221517e+06 -4.923039784034774e+06 4.645675460580978e+06 -2.840492050075385e+03 -4.547829193953856e+03 -5.515825945035536e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.540000000000000e+02 -1.164911504871838e+06 -4.923130739258849e+06 4.645565143003391e+06 -2.840476850375020e+03 -4.547700429320879e+03 -5.515940429281403e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.550000000000000e+02 -1.164968314242070e+06 -4.923221691952203e+06 4.645454823082759e+06 -2.840461647867241e+03 -4.547571659014412e+03 -5.516054914211055e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.560000000000000e+02 -1.165025123309712e+06 -4.923312642072924e+06 4.645344500869130e+06 -2.840446442853996e+03 -4.547442886760027e+03 -5.516169396559521e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.570000000000000e+02 -1.165081932052525e+06 -4.923403589579501e+06 4.645234176412083e+06 -2.840431238033108e+03 -4.547314115435612e+03 -5.516283872696538e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.580000000000000e+02 -1.165138740503868e+06 -4.923494534534230e+06 4.645123849637235e+06 -2.840416029933083e+03 -4.547185340838482e+03 -5.516398347713130e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.590000000000000e+02 -1.165195548697434e+06 -4.923585476999911e+06 4.645013520469550e+06 -2.840400819589738e+03 -4.547056556268590e+03 -5.516512826768972e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.600000000000000e+02 -1.165252356554792e+06 -4.923676416830327e+06 4.644903189083688e+06 -2.840385608044455e+03 -4.546927775188814e+03 -5.516627298090944e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.610000000000000e+02 -1.165309164120576e+06 -4.923767354108753e+06 4.644792855380180e+06 -2.840370393975649e+03 -4.546798990231342e+03 -5.516741768460078e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.620000000000000e+02 -1.165365971373467e+06 -4.923858288793362e+06 4.644682519408756e+06 -2.840355225785978e+03 -4.546670188576375e+03 -5.516856226868937e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.630000000000000e+02 -1.165422778307146e+06 -4.923949220876525e+06 4.644572181179011e+06 -2.840339963335913e+03 -4.546541420424878e+03 -5.516970694202174e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.640000000000000e+02 -1.165479584964677e+06 -4.924040150436529e+06 4.644461840597177e+06 -2.840324743968192e+03 -4.546412628915295e+03 -5.517085156424979e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.650000000000000e+02 -1.165536391297093e+06 -4.924131077382049e+06 4.644351497772365e+06 -2.840309524524399e+03 -4.546283838399535e+03 -5.517199612504527e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.660000000000000e+02 -1.165593197349026e+06 -4.924222001796350e+06 4.644241152605093e+06 -2.840294302059045e+03 -4.546155042542819e+03 -5.517314069083206e+03 1.916916464200000e-03 7.340166553200000e-04 1.158923257300000e-03 2.445653841400000e-03 1.868156487400000e-03 3.271484450300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.670000000000000e+02 -1.165650003109170e+06 -4.924312923658396e+06 4.644130805120492e+06 -2.840279076866794e+03 -4.546026242593492e+03 -5.517428524980293e+03 1.916870120600000e-03 7.337122999400000e-04 1.159096367800000e-03 2.444819232100000e-03 1.868036280500000e-03 3.272469259000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.680000000000000e+02 -1.165706808521722e+06 -4.924403842864110e+06 4.644020455442934e+06 -2.840263852539814e+03 -4.545897447455306e+03 -5.517542971107204e+03 1.916870120600000e-03 7.337122999400000e-04 1.159096367800000e-03 2.444819232100000e-03 1.868036280500000e-03 3.272469259000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.690000000000000e+02 -1.165763613653685e+06 -4.924494759538471e+06 4.643910103423076e+06 -2.840248625185939e+03 -4.545768646651914e+03 -5.517657418007521e+03 1.916870120600000e-03 7.337122999400000e-04 1.159096367800000e-03 2.444819232100000e-03 1.868036280500000e-03 3.272469259000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.700000000000000e+02 -1.165820418482567e+06 -4.924585673639591e+06 4.643799749110977e+06 -2.840233395524254e+03 -4.545639843864918e+03 -5.517771862267744e+03 1.916870120600000e-03 7.337122999400000e-04 1.159096367800000e-03 2.444819232100000e-03 1.868036280500000e-03 3.272469259000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.710000000000000e+02 -1.165877222986126e+06 -4.924676585125968e+06 4.643689392556232e+06 -2.840218165950092e+03 -4.545511041939851e+03 -5.517886300422885e+03 1.916870120600000e-03 7.337122999400000e-04 1.159096367800000e-03 2.444819232100000e-03 1.868036280500000e-03 3.272469259000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.720000000000000e+02 -1.165934027205992e+06 -4.924767494089013e+06 4.643579033665133e+06 -2.840202786895663e+03 -4.545382648720954e+03 -5.518000457471592e+03 1.916870120600000e-03 7.337122999400000e-04 1.159096367800000e-03 2.444819232100000e-03 1.868036280500000e-03 3.272469259000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.730000000000000e+02 -1.165990831087042e+06 -4.924858400435004e+06 4.643468672559977e+06 -2.840187311450798e+03 -4.545254530555154e+03 -5.518114421727834e+03 1.916870120600000e-03 7.337122999400000e-04 1.159096367800000e-03 2.444819232100000e-03 1.868036280500000e-03 3.272469259000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.740000000000000e+02 -1.166047634708204e+06 -4.924949304288351e+06 4.643358309066248e+06 -2.840172073952302e+03 -4.545125713568120e+03 -5.518228860065032e+03 1.916870120600000e-03 7.337122999400000e-04 1.159096367800000e-03 2.444819232100000e-03 1.868036280500000e-03 3.272469259000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.750000000000000e+02 -1.166104437992551e+06 -4.925040205505672e+06 4.643247943355346e+06 -2.840156835485618e+03 -4.544996900133768e+03 -5.518343290514320e+03 1.916870120600000e-03 7.337122999400000e-04 1.159096367800000e-03 2.444819232100000e-03 1.868036280500000e-03 3.272469259000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.760000000000000e+02 -1.166161240973770e+06 -4.925131104149744e+06 4.643137575352211e+06 -2.840141596251096e+03 -4.544868083785215e+03 -5.518457718411961e+03 1.916870120600000e-03 7.337122999400000e-04 1.159096367800000e-03 2.444819232100000e-03 1.868036280500000e-03 3.272469259000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.770000000000000e+02 -1.166218043629377e+06 -4.925222000178695e+06 4.643027205106924e+06 -2.840126355667363e+03 -4.544739269083874e+03 -5.518572140192507e+03 1.916823711500000e-03 7.334078665900000e-04 1.159269326400000e-03 2.443984690900000e-03 1.867915683200000e-03 3.273454095500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.780000000000000e+02 -1.166274846026357e+06 -4.925312893717471e+06 4.642916832470113e+06 -2.840111110926993e+03 -4.544610445512106e+03 -5.518686565941822e+03 1.916823711500000e-03 7.334078665900000e-04 1.159269326400000e-03 2.443984690900000e-03 1.867915683200000e-03 3.273454095500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.790000000000000e+02 -1.166331648086550e+06 -4.925403784620310e+06 4.642806457616026e+06 -2.840095866796953e+03 -4.544481624367292e+03 -5.518800984039082e+03 1.916823711500000e-03 7.334078665900000e-04 1.159269326400000e-03 2.443984690900000e-03 1.867915683200000e-03 3.273454095500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.800000000000000e+02 -1.166388449854576e+06 -4.925494672970454e+06 4.642696080445157e+06 -2.840080620070802e+03 -4.544352799734383e+03 -5.518915400888013e+03 1.916823711500000e-03 7.334078665900000e-04 1.159269326400000e-03 2.443984690900000e-03 1.867915683200000e-03 3.273454095500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.810000000000000e+02 -1.166445251307949e+06 -4.925585558726020e+06 4.642585701007579e+06 -2.840065371344765e+03 -4.544223974616518e+03 -5.519029813701432e+03 1.916823711500000e-03 7.334078665900000e-04 1.159269326400000e-03 2.443984690900000e-03 1.867915683200000e-03 3.273454095500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.820000000000000e+02 -1.166502052478665e+06 -4.925676441956272e+06 4.642475319232903e+06 -2.840050036618713e+03 -4.544095467661826e+03 -5.519143992948872e+03 1.916823711500000e-03 7.334078665900000e-04 1.159269326400000e-03 2.443984690900000e-03 1.867915683200000e-03 3.273454095500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.830000000000000e+02 -1.166558853326205e+06 -4.925767322592112e+06 4.642364935211979e+06 -2.840034643639323e+03 -4.543967175035474e+03 -5.519258013264394e+03 1.916823711500000e-03 7.334078665900000e-04 1.159269326400000e-03 2.443984690900000e-03 1.867915683200000e-03 3.273454095500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.840000000000000e+02 -1.166615653864806e+06 -4.925858200644052e+06 4.642254548911585e+06 -2.840019390244958e+03 -4.543838341321183e+03 -5.519372419330269e+03 1.916823711500000e-03 7.334078665900000e-04 1.159269326400000e-03 2.443984690900000e-03 1.867915683200000e-03 3.273454095500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.850000000000000e+02 -1.166672454077510e+06 -4.925949076080530e+06 4.642144160369478e+06 -2.840004135341224e+03 -4.543709509387291e+03 -5.519486819240626e+03 1.916823711500000e-03 7.334078665900000e-04 1.159269326400000e-03 2.443984690900000e-03 1.867915683200000e-03 3.273454095500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.860000000000000e+02 -1.166729254020125e+06 -4.926039949005619e+06 4.642033769461199e+06 -2.839988877160108e+03 -4.543580669905296e+03 -5.519601221613322e+03 1.916823711500000e-03 7.334078665900000e-04 1.159269326400000e-03 2.443984690900000e-03 1.867915683200000e-03 3.273454095500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.870000000000000e+02 -1.166786053636852e+06 -4.926130819315278e+06 4.641923376311160e+06 -2.839973618800369e+03 -4.543451831386440e+03 -5.519715617917904e+03 1.916777237000000e-03 7.331033551700000e-04 1.159442133400000e-03 2.443150217600000e-03 1.867794695500000e-03 3.274438960700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.880000000000000e+02 -1.166842852961130e+06 -4.926221687071898e+06 4.641812980844765e+06 -2.839958357800975e+03 -4.543322989359393e+03 -5.519830013010094e+03 1.916777237000000e-03 7.331033551700000e-04 1.159442133400000e-03 2.443150217600000e-03 1.867794695500000e-03 3.274438960700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.890000000000000e+02 -1.166899651992842e+06 -4.926312552275287e+06 4.641702583062227e+06 -2.839943094260792e+03 -4.543194143280063e+03 -5.519944407301464e+03 1.916777237000000e-03 7.331033551700000e-04 1.159442133400000e-03 2.443150217600000e-03 1.867794695500000e-03 3.274438960700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.900000000000000e+02 -1.166956450709745e+06 -4.926403414883974e+06 4.641592183013158e+06 -2.839927830234144e+03 -4.543065296629653e+03 -5.520058796949835e+03 1.916777237000000e-03 7.331033551700000e-04 1.159442133400000e-03 2.443150217600000e-03 1.867794695500000e-03 3.274438960700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.910000000000000e+02 -1.167013249134093e+06 -4.926494274939477e+06 4.641481780647893e+06 -2.839912563588357e+03 -4.542936446028258e+03 -5.520173185747494e+03 1.916777237000000e-03 7.331033551700000e-04 1.159442133400000e-03 2.443150217600000e-03 1.867794695500000e-03 3.274438960700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.920000000000000e+02 -1.167070047232581e+06 -4.926585132388047e+06 4.641371376049115e+06 -2.839897313451336e+03 -4.542808044682814e+03 -5.520287185139953e+03 1.916777237000000e-03 7.331033551700000e-04 1.159442133400000e-03 2.443150217600000e-03 1.867794695500000e-03 3.274438960700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.930000000000000e+02 -1.167126845007805e+06 -4.926675987239993e+06 4.641260969216676e+06 -2.839882074955960e+03 -4.542679939136136e+03 -5.520400926003512e+03 1.916777237000000e-03 7.331033551700000e-04 1.159442133400000e-03 2.443150217600000e-03 1.867794695500000e-03 3.274438960700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.940000000000000e+02 -1.167183642487466e+06 -4.926766839533217e+06 4.641150560074680e+06 -2.839866803445793e+03 -4.542551083979373e+03 -5.520515304795755e+03 1.916777237000000e-03 7.331033551700000e-04 1.159442133400000e-03 2.443150217600000e-03 1.867794695500000e-03 3.274438960700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.950000000000000e+02 -1.167240439663165e+06 -4.926857689252108e+06 4.641040148641804e+06 -2.839851529672712e+03 -4.542422226824200e+03 -5.520629680940214e+03 1.916777237000000e-03 7.331033551700000e-04 1.159442133400000e-03 2.443150217600000e-03 1.867794695500000e-03 3.274438960700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.960000000000000e+02 -1.167297236535031e+06 -4.926948536396886e+06 4.640929734917783e+06 -2.839836255090182e+03 -4.542293366952744e+03 -5.520744054385536e+03 1.916777237000000e-03 7.331033551700000e-04 1.159442133400000e-03 2.443150217600000e-03 1.867794695500000e-03 3.274438960700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.970000000000000e+02 -1.167354033080494e+06 -4.927039380925559e+06 4.640819318952872e+06 -2.839820978494224e+03 -4.542164508905134e+03 -5.520858421867362e+03 1.916730697200000e-03 7.327987657500000e-04 1.159614788800000e-03 2.442315812500000e-03 1.867673317500000e-03 3.275423854800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.980000000000000e+02 -1.167410829355605e+06 -4.927130222942557e+06 4.640708900622107e+06 -2.839805700065937e+03 -4.542035643028407e+03 -5.520972791395001e+03 1.916730697200000e-03 7.327987657500000e-04 1.159614788800000e-03 2.442315812500000e-03 1.867673317500000e-03 3.275423854800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>2.990000000000000e+02 -1.167467625337872e+06 -4.927221062406025e+06 4.640598479975575e+06 -2.839790418715379e+03 -4.541906773493767e+03 -5.521087159961718e+03 1.916730697200000e-03 7.327987657500000e-04 1.159614788800000e-03 2.442315812500000e-03 1.867673317500000e-03 3.275423854800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.000000000000000e+02 -1.167524420960092e+06 -4.927311899190725e+06 4.640488057163144e+06 -2.839775137564015e+03 -4.541777910421434e+03 -5.521201517683911e+03 1.916730697200000e-03 7.327987657500000e-04 1.159614788800000e-03 2.442315812500000e-03 1.867673317500000e-03 3.275423854800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.010000000000000e+02 -1.167581216323027e+06 -4.927402733484466e+06 4.640377631960077e+06 -2.839759853587550e+03 -4.541649038200998e+03 -5.521315879002683e+03 1.916730697200000e-03 7.327987657500000e-04 1.159614788800000e-03 2.442315812500000e-03 1.867673317500000e-03 3.275423854800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.020000000000000e+02 -1.167638011367999e+06 -4.927493565189105e+06 4.640267204495324e+06 -2.839744435115327e+03 -4.541520477759975e+03 -5.521430034130097e+03 1.916730697200000e-03 7.327987657500000e-04 1.159614788800000e-03 2.442315812500000e-03 1.867673317500000e-03 3.275423854800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.030000000000000e+02 -1.167694806077752e+06 -4.927584394279960e+06 4.640156774806090e+06 -2.839728927258385e+03 -4.541392126038913e+03 -5.521544049175813e+03 1.916730697200000e-03 7.327987657500000e-04 1.159614788800000e-03 2.442315812500000e-03 1.867673317500000e-03 3.275423854800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.040000000000000e+02 -1.167751600509837e+06 -4.927675220845649e+06 4.640046342767142e+06 -2.839713637947765e+03 -4.541263247272046e+03 -5.521658402340074e+03 1.916730697200000e-03 7.327987657500000e-04 1.159614788800000e-03 2.442315812500000e-03 1.867673317500000e-03 3.275423854800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.050000000000000e+02 -1.167808394626511e+06 -4.927766044815863e+06 4.639935908462640e+06 -2.839698347157437e+03 -4.541134367939999e+03 -5.521772751303821e+03 1.916730697200000e-03 7.327987657500000e-04 1.159614788800000e-03 2.442315812500000e-03 1.867673317500000e-03 3.275423854800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.060000000000000e+02 -1.167865188438829e+06 -4.927856866211262e+06 4.639825471867855e+06 -2.839683053735073e+03 -4.541005486782760e+03 -5.521887097640480e+03 1.916730697200000e-03 7.327987657500000e-04 1.159614788800000e-03 2.442315812500000e-03 1.867673317500000e-03 3.275423854800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.070000000000000e+02 -1.167921981969292e+06 -4.927947685073739e+06 4.639715032932631e+06 -2.839667759080832e+03 -4.540876599440735e+03 -5.522001444373384e+03 1.916684092000000e-03 7.324940982599999e-04 1.159787292700000e-03 2.441481475500000e-03 1.867551549200000e-03 3.276408778400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.080000000000000e+02 -1.167978775150603e+06 -4.928038501277970e+06 4.639604591807020e+06 -2.839652463048036e+03 -4.540747717460427e+03 -5.522115781895379e+03 1.916684092000000e-03 7.324940982599999e-04 1.159787292700000e-03 2.441481475500000e-03 1.867551549200000e-03 3.276408778400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.090000000000000e+02 -1.168035568061169e+06 -4.928129314970030e+06 4.639494148316131e+06 -2.839637165177146e+03 -4.540618827615805e+03 -5.522230121492788e+03 1.916684092000000e-03 7.324940982599999e-04 1.159787292700000e-03 2.441481475500000e-03 1.867551549200000e-03 3.276408778400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.100000000000000e+02 -1.168092360644957e+06 -4.928220126045564e+06 4.639383702584909e+06 -2.839621865624315e+03 -4.540489939329622e+03 -5.522344455202048e+03 1.916684092000000e-03 7.324940982599999e-04 1.159787292700000e-03 2.441481475500000e-03 1.867551549200000e-03 3.276408778400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.110000000000000e+02 -1.168149152935402e+06 -4.928310934566902e+06 4.639273254538730e+06 -2.839606563730941e+03 -4.540361047171467e+03 -5.522458787867845e+03 1.916684092000000e-03 7.324940982599999e-04 1.159787292700000e-03 2.441481475500000e-03 1.867551549200000e-03 3.276408778400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.120000000000000e+02 -1.168205944931243e+06 -4.928401740542039e+06 4.639162804183202e+06 -2.839591190951622e+03 -4.540232539404275e+03 -5.522572825065521e+03 1.916684092000000e-03 7.324940982599999e-04 1.159787292700000e-03 2.441481475500000e-03 1.867551549200000e-03 3.276408778400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.130000000000000e+02 -1.168262736603401e+06 -4.928492543923707e+06 4.639052351585020e+06 -2.839575770428658e+03 -4.540104289182313e+03 -5.522686662666879e+03 1.916684092000000e-03 7.324940982599999e-04 1.159787292700000e-03 2.441481475500000e-03 1.867551549200000e-03 3.276408778400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.140000000000000e+02 -1.168319527965100e+06 -4.928583344719361e+06 4.638941896709986e+06 -2.839560463088232e+03 -4.539975390561541e+03 -5.522800987164927e+03 1.916684092000000e-03 7.324940982599999e-04 1.159787292700000e-03 2.441481475500000e-03 1.867551549200000e-03 3.276408778400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.150000000000000e+02 -1.168376318999931e+06 -4.928674142898409e+06 4.638831439594741e+06 -2.839545155739224e+03 -4.539846492955506e+03 -5.522915305479598e+03 1.916684092000000e-03 7.324940982599999e-04 1.159787292700000e-03 2.441481475500000e-03 1.867551549200000e-03 3.276408778400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.160000000000000e+02 -1.168433109763684e+06 -4.928764938564839e+06 4.638720980114744e+06 -2.839529844892784e+03 -4.539717588096503e+03 -5.523029626101293e+03 1.916684092000000e-03 7.324940982599999e-04 1.159787292700000e-03 2.441481475500000e-03 1.867551549200000e-03 3.276408778400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.170000000000000e+02 -1.168489900233880e+06 -4.928855731676806e+06 4.638610518320111e+06 -2.839514531459401e+03 -4.539588679383663e+03 -5.523143945774246e+03 1.916637421700000e-03 7.321893526300000e-04 1.159959645300000e-03 2.440647206400000e-03 1.867429390700000e-03 3.277393732300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.180000000000000e+02 -1.168546690354740e+06 -4.928946522130374e+06 4.638500054335333e+06 -2.839499218891026e+03 -4.539459775280196e+03 -5.523258255861896e+03 1.916637421700000e-03 7.321893526300000e-04 1.159959645300000e-03 2.440647206400000e-03 1.867429390700000e-03 3.277393732300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.190000000000000e+02 -1.168603480204414e+06 -4.929037310071184e+06 4.638389587985964e+06 -2.839483902687131e+03 -4.539330863720520e+03 -5.523372568488076e+03 1.916637421700000e-03 7.321893526300000e-04 1.159959645300000e-03 2.440647206400000e-03 1.867429390700000e-03 3.277393732300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.200000000000000e+02 -1.168660269726883e+06 -4.929128095394914e+06 4.638279119396971e+06 -2.839468585194058e+03 -4.539201953757956e+03 -5.523486875018888e+03 1.916637421700000e-03 7.321893526300000e-04 1.159959645300000e-03 2.440647206400000e-03 1.867429390700000e-03 3.277393732300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.210000000000000e+02 -1.168717058933451e+06 -4.929218878122605e+06 4.638168648543150e+06 -2.839453267288825e+03 -4.539073042983393e+03 -5.523601177077907e+03 1.916637421700000e-03 7.321893526300000e-04 1.159959645300000e-03 2.440647206400000e-03 1.867429390700000e-03 3.277393732300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.220000000000000e+02 -1.168773847870052e+06 -4.929309658345157e+06 4.638058175332256e+06 -2.839438015362064e+03 -4.538944518597977e+03 -5.523715120694993e+03 1.916637421700000e-03 7.321893526300000e-04 1.159959645300000e-03 2.440647206400000e-03 1.867429390700000e-03 3.277393732300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.230000000000000e+02 -1.168830636484562e+06 -4.929400435968916e+06 4.637947699887505e+06 -2.839422809760101e+03 -4.538816253992560e+03 -5.523828820716756e+03 1.916637421700000e-03 7.321893526300000e-04 1.159959645300000e-03 2.440647206400000e-03 1.867429390700000e-03 3.277393732300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.240000000000000e+02 -1.168887424743925e+06 -4.929491210923617e+06 4.637837222265426e+06 -2.839407486316265e+03 -4.538687338701432e+03 -5.523943113030855e+03 1.916637421700000e-03 7.321893526300000e-04 1.159959645300000e-03 2.440647206400000e-03 1.867429390700000e-03 3.277393732300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.250000000000000e+02 -1.168944212754170e+06 -4.929581983406818e+06 4.637726742229323e+06 -2.839392158839987e+03 -4.538558412726428e+03 -5.524057410762072e+03 1.916637421700000e-03 7.321893526300000e-04 1.159959645300000e-03 2.440647206400000e-03 1.867429390700000e-03 3.277393732300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.260000000000000e+02 -1.169001000425978e+06 -4.929672753252119e+06 4.637616259978573e+06 -2.839376831626690e+03 -4.538429489427224e+03 -5.524171700799097e+03 1.916637421700000e-03 7.321893526300000e-04 1.159959645300000e-03 2.440647206400000e-03 1.867429390700000e-03 3.277393732300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.270000000000000e+02 -1.169057787803962e+06 -4.929763520542650e+06 4.637505775413565e+06 -2.839361501883073e+03 -4.538300562325876e+03 -5.524285989818241e+03 1.916590686300000e-03 7.318845289300000e-04 1.160131846800000e-03 2.439813005600000e-03 1.867306842000000e-03 3.278378716600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.280000000000000e+02 -1.169114574876813e+06 -4.929854285257414e+06 4.637395288559468e+06 -2.839346169662939e+03 -4.538171633234626e+03 -5.524400276278435e+03 1.916590686300000e-03 7.318845289300000e-04 1.160131846800000e-03 2.439813005600000e-03 1.867306842000000e-03 3.278378716600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.290000000000000e+02 -1.169171361644669e+06 -4.929945047396624e+06 4.637284799416019e+06 -2.839330836911925e+03 -4.538042701580508e+03 -5.524514559785822e+03 1.916590686300000e-03 7.318845289300000e-04 1.160131846800000e-03 2.439813005600000e-03 1.867306842000000e-03 3.278378716600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.300000000000000e+02 -1.169228148107405e+06 -4.930035806960110e+06 4.637174307983432e+06 -2.839315501715297e+03 -4.537913768106537e+03 -5.524628840578085e+03 1.916590686300000e-03 7.318845289300000e-04 1.160131846800000e-03 2.439813005600000e-03 1.867306842000000e-03 3.278378716600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.310000000000000e+02 -1.169284934264909e+06 -4.930126563947693e+06 4.637063814261919e+06 -2.839300164358477e+03 -4.537784832380954e+03 -5.524743118888424e+03 1.916590686300000e-03 7.318845289300000e-04 1.160131846800000e-03 2.439813005600000e-03 1.867306842000000e-03 3.278378716600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.320000000000000e+02 -1.169341720123623e+06 -4.930217318387037e+06 4.636953318229603e+06 -2.839284582443540e+03 -4.537656223267795e+03 -5.524857228321160e+03 1.916590686300000e-03 7.318845289300000e-04 1.160131846800000e-03 2.439813005600000e-03 1.867306842000000e-03 3.278378716600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.330000000000000e+02 -1.169398505656603e+06 -4.930308070238420e+06 4.636842819941572e+06 -2.839268836683422e+03 -4.537527833272874e+03 -5.524971222610785e+03 1.916590686300000e-03 7.318845289300000e-04 1.160131846800000e-03 2.439813005600000e-03 1.867306842000000e-03 3.278378716600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.340000000000000e+02 -1.169455290858296e+06 -4.930398819465403e+06 4.636732319422763e+06 -2.839253495830934e+03 -4.537398894377855e+03 -5.525085489119494e+03 1.916590686300000e-03 7.318845289300000e-04 1.160131846800000e-03 2.439813005600000e-03 1.867306842000000e-03 3.278378716600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.350000000000000e+02 -1.169512075777055e+06 -4.930489566158090e+06 4.636621816565169e+06 -2.839238151890624e+03 -4.537269949981590e+03 -5.525199756281616e+03 1.916590686300000e-03 7.318845289300000e-04 1.160131846800000e-03 2.439813005600000e-03 1.867306842000000e-03 3.278378716600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.360000000000000e+02 -1.169568860412762e+06 -4.930580310316293e+06 4.636511311368992e+06 -2.839222804780890e+03 -4.537140999787455e+03 -5.525314024381477e+03 1.916590686300000e-03 7.318845289300000e-04 1.160131846800000e-03 2.439813005600000e-03 1.867306842000000e-03 3.278378716600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.370000000000000e+02 -1.169625644698471e+06 -4.930671051815315e+06 4.636400803983746e+06 -2.839207458709298e+03 -4.537012054289997e+03 -5.525428282751129e+03 1.916543885900000e-03 7.315796270600000e-04 1.160303897300000e-03 2.438978872800000e-03 1.867183903200000e-03 3.279363732100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.380000000000000e+02 -1.169682428712318e+06 -4.930761790800725e+06 4.636290294234910e+06 -2.839192108921598e+03 -4.536883101654281e+03 -5.525542543425067e+03 1.916543885900000e-03 7.315796270600000e-04 1.160303897300000e-03 2.438978872800000e-03 1.867183903200000e-03 3.279363732100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.390000000000000e+02 -1.169739212409470e+06 -4.930852527189062e+06 4.636179782222545e+06 -2.839176757521561e+03 -4.536754148506706e+03 -5.525656799915781e+03 1.916543885900000e-03 7.315796270600000e-04 1.160303897300000e-03 2.438978872800000e-03 1.867183903200000e-03 3.279363732100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.400000000000000e+02 -1.169795995801233e+06 -4.930943261001368e+06 4.636069267921425e+06 -2.839161405078297e+03 -4.536625193022366e+03 -5.525771053494503e+03 1.916543885900000e-03 7.315796270600000e-04 1.160303897300000e-03 2.438978872800000e-03 1.867183903200000e-03 3.279363732100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.410000000000000e+02 -1.169852778887492e+06 -4.931033992237468e+06 4.635958751331761e+06 -2.839146050626973e+03 -4.536496235303352e+03 -5.525885304508794e+03 1.916543885900000e-03 7.315796270600000e-04 1.160303897300000e-03 2.438978872800000e-03 1.867183903200000e-03 3.279363732100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.420000000000000e+02 -1.169909561646211e+06 -4.931124720863192e+06 4.635848232510258e+06 -2.839130716289931e+03 -4.536367660639112e+03 -5.525999220776214e+03 1.916543885900000e-03 7.315796270600000e-04 1.160303897300000e-03 2.438978872800000e-03 1.867183903200000e-03 3.279363732100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.430000000000000e+02 -1.169966344113333e+06 -4.931215446949970e+06 4.635737711381677e+06 -2.839115394832157e+03 -4.536239332781837e+03 -5.526112919523269e+03 1.916543885900000e-03 7.315796270600000e-04 1.160303897300000e-03 2.438978872800000e-03 1.867183903200000e-03 3.279363732100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.440000000000000e+02 -1.170023126236293e+06 -4.931306170388632e+06 4.635627188050807e+06 -2.839100035731153e+03 -4.536110372308300e+03 -5.526227158916675e+03 1.916543885900000e-03 7.315796270600000e-04 1.160303897300000e-03 2.438978872800000e-03 1.867183903200000e-03 3.279363732100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.450000000000000e+02 -1.170079908098244e+06 -4.931396891334045e+06 4.635516662331912e+06 -2.839084672892321e+03 -4.535981402652804e+03 -5.526341402331580e+03 1.916543885900000e-03 7.315796270600000e-04 1.160303897300000e-03 2.438978872800000e-03 1.867183903200000e-03 3.279363732100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.460000000000000e+02 -1.170136689632235e+06 -4.931487609661536e+06 4.635406134374523e+06 -2.839069309969312e+03 -4.535852434081943e+03 -5.526455639542997e+03 1.916543885900000e-03 7.315796270600000e-04 1.160303897300000e-03 2.438978872800000e-03 1.867183903200000e-03 3.279363732100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.470000000000000e+02 -1.170193470838072e+06 -4.931578325370803e+06 4.635295604179007e+06 -2.839053945078582e+03 -4.535723467291401e+03 -5.526569870814719e+03 1.916497020500000e-03 7.312746470800000e-04 1.160475796800000e-03 2.438144808300000e-03 1.867060574400000e-03 3.280348779100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.480000000000000e+02 -1.170250251760596e+06 -4.931669038545320e+06 4.635185071645238e+06 -2.839038578720682e+03 -4.535594494182935e+03 -5.526684102693697e+03 1.916497020500000e-03 7.312746470800000e-04 1.160475796800000e-03 2.438144808300000e-03 1.867060574400000e-03 3.280348779100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.490000000000000e+02 -1.170307032410866e+06 -4.931759749205721e+06 4.635074536748463e+06 -2.839023208754726e+03 -4.535465514149155e+03 -5.526798336647696e+03 1.916497020500000e-03 7.312746470800000e-04 1.160475796800000e-03 2.438144808300000e-03 1.867060574400000e-03 3.280348779100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.500000000000000e+02 -1.170363812699344e+06 -4.931850457185335e+06 4.634963999688632e+06 -2.839007838709218e+03 -4.535336540698760e+03 -5.526912559799483e+03 1.916497020500000e-03 7.312746470800000e-04 1.160475796800000e-03 2.438144808300000e-03 1.867060574400000e-03 3.280348779100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.510000000000000e+02 -1.170420592704399e+06 -4.931941162630064e+06 4.634853460290707e+06 -2.838992466877366e+03 -4.535207561157114e+03 -5.527026783511716e+03 1.916497020500000e-03 7.312746470800000e-04 1.160475796800000e-03 2.438144808300000e-03 1.867060574400000e-03 3.280348779100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.520000000000000e+02 -1.170477372401133e+06 -4.932031865507069e+06 4.634742918611214e+06 -2.838976971124473e+03 -4.535079027235198e+03 -5.527140684938235e+03 1.916497020500000e-03 7.312746470800000e-04 1.160475796800000e-03 2.438144808300000e-03 1.867060574400000e-03 3.280348779100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.530000000000000e+02 -1.170534151780964e+06 -4.932122565809376e+06 4.634632374669896e+06 -2.838961392216275e+03 -4.534950788275323e+03 -5.527254371763398e+03 1.916497020500000e-03 7.312746470800000e-04 1.160475796800000e-03 2.438144808300000e-03 1.867060574400000e-03 3.280348779100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.540000000000000e+02 -1.170590930858405e+06 -4.932213263541541e+06 4.634521828432781e+06 -2.838946014756458e+03 -4.534821800409837e+03 -5.527368588940945e+03 1.916497020500000e-03 7.312746470800000e-04 1.160475796800000e-03 2.438144808300000e-03 1.867060574400000e-03 3.280348779100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.550000000000000e+02 -1.170647709596315e+06 -4.932303958634463e+06 4.634411279982796e+06 -2.838930636351082e+03 -4.534692816000457e+03 -5.527482798320735e+03 1.916497020500000e-03 7.312746470800000e-04 1.160475796800000e-03 2.438144808300000e-03 1.867060574400000e-03 3.280348779100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.560000000000000e+02 -1.170704488050465e+06 -4.932394651192022e+06 4.634300729195303e+06 -2.838915254730054e+03 -4.534563826172359e+03 -5.527597008339188e+03 1.916497020500000e-03 7.312746470800000e-04 1.160475796800000e-03 2.438144808300000e-03 1.867060574400000e-03 3.280348779100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.570000000000000e+02 -1.170761266198627e+06 -4.932485341172813e+06 4.634190176119980e+06 -2.838899872479760e+03 -4.534434833601692e+03 -5.527711215599239e+03 1.916450090400000e-03 7.309695889300000e-04 1.160647545600000e-03 2.437310812100000e-03 1.866936855500000e-03 3.281333858200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.580000000000000e+02 -1.170818044062957e+06 -4.932576028618138e+06 4.634079620707254e+06 -2.838884486504292e+03 -4.534305835691168e+03 -5.527825423659955e+03 1.916450090400000e-03 7.309695889300000e-04 1.160647545600000e-03 2.437310812100000e-03 1.866936855500000e-03 3.281333858200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.590000000000000e+02 -1.170874821587698e+06 -4.932666713424184e+06 4.633969063081723e+06 -2.838869101176789e+03 -4.534176840540276e+03 -5.527939623791080e+03 1.916450090400000e-03 7.309695889300000e-04 1.160647545600000e-03 2.437310812100000e-03 1.866936855500000e-03 3.281333858200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.600000000000000e+02 -1.170931598806262e+06 -4.932757395653203e+06 4.633858503168681e+06 -2.838853713361925e+03 -4.534047843550857e+03 -5.528053821241768e+03 1.916450090400000e-03 7.309695889300000e-04 1.160647545600000e-03 2.437310812100000e-03 1.866936855500000e-03 3.281333858200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.610000000000000e+02 -1.170988375729713e+06 -4.932848075325825e+06 4.633747940943372e+06 -2.838838323045793e+03 -4.533918842785497e+03 -5.528168017637177e+03 1.916450090400000e-03 7.309695889300000e-04 1.160647545600000e-03 2.437310812100000e-03 1.866936855500000e-03 3.281333858200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.620000000000000e+02 -1.171045152347420e+06 -4.932938752427900e+06 4.633637376436062e+06 -2.838822952783026e+03 -4.533790161190530e+03 -5.528281933011269e+03 1.916450090400000e-03 7.309695889300000e-04 1.160647545600000e-03 2.437310812100000e-03 1.866936855500000e-03 3.281333858200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.630000000000000e+02 -1.171101928645328e+06 -4.933029426937067e+06 4.633526809682422e+06 -2.838807594472756e+03 -4.533661692998925e+03 -5.528395659397963e+03 1.916450090400000e-03 7.309695889300000e-04 1.160647545600000e-03 2.437310812100000e-03 1.866936855500000e-03 3.281333858200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.640000000000000e+02 -1.171158704664810e+06 -4.933120098920972e+06 4.633416240579143e+06 -2.838792198020894e+03 -4.533532682185984e+03 -5.528509850946482e+03 1.916450090400000e-03 7.309695889300000e-04 1.160647545600000e-03 2.437310812100000e-03 1.866936855500000e-03 3.281333858200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.650000000000000e+02 -1.171215480355670e+06 -4.933210768286148e+06 4.633305669238415e+06 -2.838776801570437e+03 -4.533403672320815e+03 -5.528624036370416e+03 1.916450090400000e-03 7.309695889300000e-04 1.160647545600000e-03 2.437310812100000e-03 1.866936855500000e-03 3.281333858200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.660000000000000e+02 -1.171272255728966e+06 -4.933301435053229e+06 4.633195095635482e+06 -2.838761403273365e+03 -4.533274662215284e+03 -5.528738217491405e+03 1.916450090400000e-03 7.309695889300000e-04 1.160647545600000e-03 2.437310812100000e-03 1.866936855500000e-03 3.281333858200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.670000000000000e+02 -1.171329030795759e+06 -4.933392099242846e+06 4.633084519745574e+06 -2.838746002632724e+03 -4.533145650037216e+03 -5.528852396063012e+03 1.916403095400000e-03 7.306644525399999e-04 1.160819143800000e-03 2.436476883900000e-03 1.866812746700000e-03 3.282318970100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.680000000000000e+02 -1.171385805567351e+06 -4.933482760876016e+06 4.632973941543460e+06 -2.838730600964762e+03 -4.533016633575247e+03 -5.528966573342265e+03 1.916403095400000e-03 7.306644525399999e-04 1.160819143800000e-03 2.436476883900000e-03 1.866812746700000e-03 3.282318970100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.690000000000000e+02 -1.171442580043626e+06 -4.933573419952565e+06 4.632863361029346e+06 -2.838715196480159e+03 -4.532887613417141e+03 -5.529080749640234e+03 1.916403095400000e-03 7.306644525399999e-04 1.160819143800000e-03 2.436476883900000e-03 1.866812746700000e-03 3.282318970100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.700000000000000e+02 -1.171499354179764e+06 -4.933664076389114e+06 4.632752778303358e+06 -2.838699791080532e+03 -4.532758596525911e+03 -5.529194918288372e+03 1.916403095400000e-03 7.306644525399999e-04 1.160819143800000e-03 2.436476883900000e-03 1.866812746700000e-03 3.282318970100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.710000000000000e+02 -1.171556128031773e+06 -4.933754730289883e+06 4.632642193240344e+06 -2.838684384085841e+03 -4.532629573471685e+03 -5.529309087468044e+03 1.916403095400000e-03 7.306644525399999e-04 1.160819143800000e-03 2.436476883900000e-03 1.866812746700000e-03 3.282318970100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.720000000000000e+02 -1.171612901573593e+06 -4.933845381620971e+06 4.632531605895728e+06 -2.838668798704362e+03 -4.532500948585298e+03 -5.529422998731588e+03 1.916403095400000e-03 7.306644525399999e-04 1.160819143800000e-03 2.436476883900000e-03 1.866812746700000e-03 3.282318970100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.730000000000000e+02 -1.171669674795743e+06 -4.933936030374351e+06 4.632421016288907e+06 -2.838653096208484e+03 -4.532372586324184e+03 -5.529536737829148e+03 1.916403095400000e-03 7.306644525399999e-04 1.160819143800000e-03 2.436476883900000e-03 1.866812746700000e-03 3.282318970100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.740000000000000e+02 -1.171726447694254e+06 -4.934026676518496e+06 4.632310424433276e+06 -2.838637683481681e+03 -4.532243556987539e+03 -5.529650898802573e+03 1.916403095400000e-03 7.306644525399999e-04 1.160819143800000e-03 2.436476883900000e-03 1.866812746700000e-03 3.282318970100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.750000000000000e+02 -1.171783220297155e+06 -4.934117320105628e+06 4.632199830266129e+06 -2.838622267962735e+03 -4.532114523909561e+03 -5.529765058821041e+03 1.916403095400000e-03 7.306644525399999e-04 1.160819143800000e-03 2.436476883900000e-03 1.866812746700000e-03 3.282318970100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.760000000000000e+02 -1.171839992571041e+06 -4.934207961073571e+06 4.632089233862150e+06 -2.838606852344837e+03 -4.531985492000168e+03 -5.529879212577314e+03 1.916403095400000e-03 7.306644525399999e-04 1.160819143800000e-03 2.436476883900000e-03 1.866812746700000e-03 3.282318970100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.770000000000000e+02 -1.171896764560510e+06 -4.934298599505340e+06 4.631978635121617e+06 -2.838591433981583e+03 -4.531856454351886e+03 -5.529993367025540e+03 1.916356035800000e-03 7.303592379900000e-04 1.160990591400000e-03 2.435643024100000e-03 1.866688248000000e-03 3.283304115100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.780000000000000e+02 -1.171953536209556e+06 -4.934389235296768e+06 4.631868034169662e+06 -2.838576014284956e+03 -4.531727420126997e+03 -5.530107513882613e+03 1.916356035800000e-03 7.303592379900000e-04 1.160990591400000e-03 2.435643024100000e-03 1.866688248000000e-03 3.283304115100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.790000000000000e+02 -1.172010307596540e+06 -4.934479868593663e+06 4.631757430831142e+06 -2.838560592371788e+03 -4.531598376298026e+03 -5.530221664421426e+03 1.916356035800000e-03 7.303592379900000e-04 1.160990591400000e-03 2.435643024100000e-03 1.866688248000000e-03 3.283304115100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.800000000000000e+02 -1.172067078654292e+06 -4.934570499271062e+06 4.631646825256165e+06 -2.838545168846176e+03 -4.531469334051521e+03 -5.530335809031350e+03 1.916356035800000e-03 7.303592379900000e-04 1.160990591400000e-03 2.435643024100000e-03 1.866688248000000e-03 3.283304115100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.810000000000000e+02 -1.172123849393871e+06 -4.934661127349591e+06 4.631536217419959e+06 -2.838529743609350e+03 -4.531340291335026e+03 -5.530449949470507e+03 1.916356035800000e-03 7.303592379900000e-04 1.160990591400000e-03 2.435643024100000e-03 1.866688248000000e-03 3.283304115100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.820000000000000e+02 -1.172180619839827e+06 -4.934751752878908e+06 4.631425607279762e+06 -2.838514420495992e+03 -4.531211636655004e+03 -5.530563714882419e+03 1.916356035800000e-03 7.303592379900000e-04 1.160990591400000e-03 2.435643024100000e-03 1.866688248000000e-03 3.283304115100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.830000000000000e+02 -1.172237389946290e+06 -4.934842375776360e+06 4.631314994946084e+06 -2.838499164614165e+03 -4.531083245071190e+03 -5.530677225237603e+03 1.916356035800000e-03 7.303592379900000e-04 1.160990591400000e-03 2.435643024100000e-03 1.866688248000000e-03 3.283304115100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.840000000000000e+02 -1.172294159787169e+06 -4.934932996172830e+06 4.631204380233576e+06 -2.838483734207314e+03 -4.530954192350823e+03 -5.530791360370473e+03 1.916356035800000e-03 7.303592379900000e-04 1.160990591400000e-03 2.435643024100000e-03 1.866688248000000e-03 3.283304115100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.850000000000000e+02 -1.172350929332166e+06 -4.935023614011976e+06 4.631093763209921e+06 -2.838468301057922e+03 -4.530825135543493e+03 -5.530905494813764e+03 1.916356035800000e-03 7.303592379900000e-04 1.160990591400000e-03 2.435643024100000e-03 1.866688248000000e-03 3.283304115100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.860000000000000e+02 -1.172407698547638e+06 -4.935114229231242e+06 4.630983143950303e+06 -2.838452866506072e+03 -4.530696080315432e+03 -5.531019623237642e+03 1.916356035800000e-03 7.303592379900000e-04 1.160990591400000e-03 2.435643024100000e-03 1.866688248000000e-03 3.283304115100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.870000000000000e+02 -1.172464467433714e+06 -4.935204841830851e+06 4.630872522454459e+06 -2.838437432004209e+03 -4.530567026239581e+03 -5.531133745348128e+03 1.916308911700000e-03 7.300539451700000e-04 1.161161888700000e-03 2.434809232500000e-03 1.866563359400000e-03 3.284289293800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.880000000000000e+02 -1.172521236046152e+06 -4.935295451914587e+06 4.630761898597664e+06 -2.838421994136050e+03 -4.530437964708826e+03 -5.531247869859329e+03 1.916308911700000e-03 7.300539451700000e-04 1.161161888700000e-03 2.434809232500000e-03 1.866563359400000e-03 3.284289293800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.890000000000000e+02 -1.172578004362481e+06 -4.935386059440690e+06 4.630651272430108e+06 -2.838406553386064e+03 -4.530308899615299e+03 -5.531361993305560e+03 1.916308911700000e-03 7.300539451700000e-04 1.161161888700000e-03 2.434809232500000e-03 1.866563359400000e-03 3.284289293800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.900000000000000e+02 -1.172634772326963e+06 -4.935476664305428e+06 4.630540644076464e+06 -2.838391113701064e+03 -4.530179838825577e+03 -5.531476107353968e+03 1.916308911700000e-03 7.300539451700000e-04 1.161161888700000e-03 2.434809232500000e-03 1.866563359400000e-03 3.284289293800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.910000000000000e+02 -1.172691540006521e+06 -4.935567266633363e+06 4.630430013387017e+06 -2.838375670749730e+03 -4.530050772561325e+03 -5.531590222105180e+03 1.916308911700000e-03 7.300539451700000e-04 1.161161888700000e-03 2.434809232500000e-03 1.866563359400000e-03 3.284289293800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.920000000000000e+02 -1.172748307350982e+06 -4.935657866347280e+06 4.630319380464622e+06 -2.838359958130226e+03 -4.529922013117632e+03 -5.531704196330925e+03 1.916308911700000e-03 7.300539451700000e-04 1.161161888700000e-03 2.434809232500000e-03 1.866563359400000e-03 3.284289293800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.930000000000000e+02 -1.172805074392089e+06 -4.935748463516862e+06 4.630208745232150e+06 -2.838344066361132e+03 -4.529793449767618e+03 -5.531818081870466e+03 1.916308911700000e-03 7.300539451700000e-04 1.161161888700000e-03 2.434809232500000e-03 1.866563359400000e-03 3.284289293800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.940000000000000e+02 -1.172861841135118e+06 -4.935839058125239e+06 4.630098107693218e+06 -2.838328617324733e+03 -4.529664373641889e+03 -5.531932191557493e+03 1.916308911700000e-03 7.300539451700000e-04 1.161161888700000e-03 2.434809232500000e-03 1.866563359400000e-03 3.284289293800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.950000000000000e+02 -1.172918607525960e+06 -4.935929650071779e+06 4.629987467968798e+06 -2.838313167700806e+03 -4.529535302286453e+03 -5.532046292199363e+03 1.916308911700000e-03 7.300539451700000e-04 1.161161888700000e-03 2.434809232500000e-03 1.866563359400000e-03 3.284289293800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.960000000000000e+02 -1.172975373631787e+06 -4.936020239481434e+06 4.629876825908691e+06 -2.838297716587480e+03 -4.529406225200061e+03 -5.532160392961131e+03 1.916308911700000e-03 7.300539451700000e-04 1.161161888700000e-03 2.434809232500000e-03 1.866563359400000e-03 3.284289293800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.970000000000000e+02 -1.173032139430047e+06 -4.936110826312316e+06 4.629766181563242e+06 -2.838282262485241e+03 -4.529277146135861e+03 -5.532274491383416e+03 1.916261723000000e-03 7.297485741300000e-04 1.161333035700000e-03 2.433975509300000e-03 1.866438081100000e-03 3.285274506600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.980000000000000e+02 -1.173088904920877e+06 -4.936201410564650e+06 4.629655534932193e+06 -2.838266807859823e+03 -4.529148064547033e+03 -5.532388586817739e+03 1.916261723000000e-03 7.297485741300000e-04 1.161333035700000e-03 2.433975509300000e-03 1.866438081100000e-03 3.285274506600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>3.990000000000000e+02 -1.173145670126497e+06 -4.936291992279826e+06 4.629544885965766e+06 -2.838251349979527e+03 -4.529018977515313e+03 -5.532502682921848e+03 1.916261723000000e-03 7.297485741300000e-04 1.161333035700000e-03 2.433975509300000e-03 1.866438081100000e-03 3.285274506600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.000000000000000e+02 -1.173202434990930e+06 -4.936382571353746e+06 4.629434234789144e+06 -2.838235891166943e+03 -4.528889893618796e+03 -5.532616771500427e+03 1.916261723000000e-03 7.297485741300000e-04 1.161333035700000e-03 2.433975509300000e-03 1.866438081100000e-03 3.285274506600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.010000000000000e+02 -1.173259199558994e+06 -4.936473147869769e+06 4.629323581302088e+06 -2.838220431066320e+03 -4.528760805534964e+03 -5.532730858820491e+03 1.916261723000000e-03 7.297485741300000e-04 1.161333035700000e-03 2.433975509300000e-03 1.866438081100000e-03 3.285274506600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.020000000000000e+02 -1.173315963810116e+06 -4.936563721794691e+06 4.629212925562739e+06 -2.838205063292064e+03 -4.528632143417418e+03 -5.532844544198377e+03 1.916261723000000e-03 7.297485741300000e-04 1.161333035700000e-03 2.433975509300000e-03 1.866438081100000e-03 3.285274506600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.030000000000000e+02 -1.173372727749885e+06 -4.936654293142287e+06 4.629102267566605e+06 -2.838189755543937e+03 -4.528503762107792e+03 -5.532957963193769e+03 1.916261723000000e-03 7.297485741300000e-04 1.161333035700000e-03 2.433975509300000e-03 1.866438081100000e-03 3.285274506600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.040000000000000e+02 -1.173429491359338e+06 -4.936744861868904e+06 4.628991607335920e+06 -2.838174291087234e+03 -4.528374671054363e+03 -5.533072038954011e+03 1.916261723000000e-03 7.297485741300000e-04 1.161333035700000e-03 2.433975509300000e-03 1.866438081100000e-03 3.285274506600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.050000000000000e+02 -1.173486254683374e+06 -4.936835428058102e+06 4.628880944770175e+06 -2.838158823483017e+03 -4.528245574408880e+03 -5.533186115459751e+03 1.916261723000000e-03 7.297485741300000e-04 1.161333035700000e-03 2.433975509300000e-03 1.866438081100000e-03 3.285274506600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.060000000000000e+02 -1.173543017699528e+06 -4.936925991668137e+06 4.628770279919581e+06 -2.838143353618029e+03 -4.528116475808305e+03 -5.533300189280877e+03 1.916261723000000e-03 7.297485741300000e-04 1.161333035700000e-03 2.433975509300000e-03 1.866438081100000e-03 3.285274506600000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.070000000000000e+02 -1.173599780407931e+06 -4.937016552699233e+06 4.628659612783877e+06 -2.838127883035237e+03 -4.527987374828289e+03 -5.533414260080197e+03 1.916214469900000e-03 7.294431248400000e-04 1.161504032700000e-03 2.433141854400000e-03 1.866312412900000e-03 3.286259754100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.080000000000000e+02 -1.173656542819552e+06 -4.937107111171862e+06 4.628548943338433e+06 -2.838112409122952e+03 -4.527858270014689e+03 -5.533528330239678e+03 1.916214469900000e-03 7.294431248400000e-04 1.161504032700000e-03 2.433141854400000e-03 1.866312412900000e-03 3.286259754100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.090000000000000e+02 -1.173713304912180e+06 -4.937197667044679e+06 4.628438271632981e+06 -2.838096935040533e+03 -4.527729164601804e+03 -5.533642395647862e+03 1.916214469900000e-03 7.294431248400000e-04 1.161504032700000e-03 2.433141854400000e-03 1.866312412900000e-03 3.286259754100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.100000000000000e+02 -1.173770066696867e+06 -4.937288220338293e+06 4.628327597642740e+06 -2.838081458589359e+03 -4.527600057128318e+03 -5.533756458507765e+03 1.916214469900000e-03 7.294431248400000e-04 1.161504032700000e-03 2.433141854400000e-03 1.866312412900000e-03 3.286259754100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.110000000000000e+02 -1.173826828173498e+06 -4.937378771052533e+06 4.628216921367922e+06 -2.838065979941718e+03 -4.527470947749088e+03 -5.533870518613145e+03 1.916214469900000e-03 7.294431248400000e-04 1.161504032700000e-03 2.433141854400000e-03 1.866312412900000e-03 3.286259754100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.120000000000000e+02 -1.173883589337707e+06 -4.937469319194195e+06 4.628106242811725e+06 -2.838050275725150e+03 -4.527342164688628e+03 -5.533984402373073e+03 1.916214469900000e-03 7.294431248400000e-04 1.161504032700000e-03 2.433141854400000e-03 1.866312412900000e-03 3.286259754100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.130000000000000e+02 -1.173940350172330e+06 -4.937559864741279e+06 4.627995562008154e+06 -2.838034421005966e+03 -4.527213598711318e+03 -5.534098167246038e+03 1.916214469900000e-03 7.294431248400000e-04 1.161504032700000e-03 2.433141854400000e-03 1.866312412900000e-03 3.286259754100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.140000000000000e+02 -1.173997110705166e+06 -4.937650407720714e+06 4.627884878905904e+06 -2.838018937076555e+03 -4.527084482855391e+03 -5.534212219120732e+03 1.916214469900000e-03 7.294431248400000e-04 1.161504032700000e-03 2.433141854400000e-03 1.866312412900000e-03 3.286259754100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.150000000000000e+02 -1.174053870918791e+06 -4.937740948100082e+06 4.627774193543977e+06 -2.838003452511045e+03 -4.526955366209408e+03 -5.534326266612436e+03 1.916214469900000e-03 7.294431248400000e-04 1.161504032700000e-03 2.433141854400000e-03 1.866312412900000e-03 3.286259754100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.160000000000000e+02 -1.174110630846614e+06 -4.937831485941540e+06 4.627663505847583e+06 -2.837987965255639e+03 -4.526826243983796e+03 -5.534440314632566e+03 1.916214469900000e-03 7.294431248400000e-04 1.161504032700000e-03 2.433141854400000e-03 1.866312412900000e-03 3.286259754100000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.170000000000000e+02 -1.174167390454993e+06 -4.937922021182586e+06 4.627552815891935e+06 -2.837972475897496e+03 -4.526697121400866e+03 -5.534554358565700e+03 1.916167152500000e-03 7.291375972000000e-04 1.161674879600000e-03 2.432308267800000e-03 1.866186355100000e-03 3.287245037000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.180000000000000e+02 -1.174224149766401e+06 -4.938012553864981e+06 4.627442123626774e+06 -2.837956985450230e+03 -4.526567994666313e+03 -5.534668401120146e+03 1.916167152500000e-03 7.291375972000000e-04 1.161674879600000e-03 2.432308267800000e-03 1.866186355100000e-03 3.287245037000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.190000000000000e+02 -1.174280908758380e+06 -4.938103083947008e+06 4.627331429102315e+06 -2.837941493097833e+03 -4.526438867828841e+03 -5.534782439287274e+03 1.916167152500000e-03 7.291375972000000e-04 1.161674879600000e-03 2.432308267800000e-03 1.866186355100000e-03 3.287245037000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.200000000000000e+02 -1.174337667430813e+06 -4.938193611428494e+06 4.627220732318763e+06 -2.837925998936802e+03 -4.526309740271295e+03 -5.534896473538370e+03 1.916167152500000e-03 7.291375972000000e-04 1.161674879600000e-03 2.432308267800000e-03 1.866186355100000e-03 3.287245037000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.210000000000000e+02 -1.174394425795000e+06 -4.938284136330433e+06 4.627110033250868e+06 -2.837910503947951e+03 -4.526180610848811e+03 -5.535010504388450e+03 1.916167152500000e-03 7.291375972000000e-04 1.161674879600000e-03 2.432308267800000e-03 1.866186355100000e-03 3.287245037000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.220000000000000e+02 -1.174451183886796e+06 -4.938374658722389e+06 4.626999331831391e+06 -2.837895131995696e+03 -4.526051851254866e+03 -5.535124166682923e+03 1.916167152500000e-03 7.291375972000000e-04 1.161674879600000e-03 2.432308267800000e-03 1.866186355100000e-03 3.287245037000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.230000000000000e+02 -1.174507941621227e+06 -4.938465178448201e+06 4.626888628259265e+06 -2.837879845022010e+03 -4.525923346694341e+03 -5.535237573130557e+03 1.916167152500000e-03 7.291375972000000e-04 1.161674879600000e-03 2.432308267800000e-03 1.866186355100000e-03 3.287245037000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.240000000000000e+02 -1.174564699055478e+06 -4.938555695609552e+06 4.626777922384628e+06 -2.837864343831934e+03 -4.525794208717712e+03 -5.535351597888840e+03 1.916167152500000e-03 7.291375972000000e-04 1.161674879600000e-03 2.432308267800000e-03 1.866186355100000e-03 3.287245037000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.250000000000000e+02 -1.174621456147667e+06 -4.938646210128611e+06 4.626667214301202e+06 -2.837848841775130e+03 -4.525665074295453e+03 -5.535465614748939e+03 1.916167152500000e-03 7.291375972000000e-04 1.161674879600000e-03 2.432308267800000e-03 1.866186355100000e-03 3.287245037000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.260000000000000e+02 -1.174678212976112e+06 -4.938736722150980e+06 4.626556503833670e+06 -2.837833337025443e+03 -4.525535930218221e+03 -5.535579635532459e+03 1.916167152500000e-03 7.291375972000000e-04 1.161674879600000e-03 2.432308267800000e-03 1.866186355100000e-03 3.287245037000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.270000000000000e+02 -1.174734969507190e+06 -4.938827231614182e+06 4.626445791057263e+06 -2.837817829842948e+03 -4.525406782303596e+03 -5.535693655276204e+03 1.916119770900000e-03 7.288319913100000e-04 1.161845576800000e-03 2.431474749700000e-03 1.866059907600000e-03 3.288230355500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.280000000000000e+02 -1.174791725696099e+06 -4.938917738434958e+06 4.626335076072223e+06 -2.837802321524310e+03 -4.525277637752196e+03 -5.535807667401987e+03 1.916119770900000e-03 7.288319913100000e-04 1.161845576800000e-03 2.431474749700000e-03 1.866059907600000e-03 3.288230355500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.290000000000000e+02 -1.174848481609988e+06 -4.939008242738143e+06 4.626224358728247e+06 -2.837786811216121e+03 -4.525148485451136e+03 -5.535921681548255e+03 1.916119770900000e-03 7.288319913100000e-04 1.161845576800000e-03 2.431474749700000e-03 1.866059907600000e-03 3.288230355500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.300000000000000e+02 -1.174905237192892e+06 -4.939098744419720e+06 4.626113639150579e+06 -2.837771299441619e+03 -4.525019334506330e+03 -5.536035689896309e+03 1.916119770900000e-03 7.288319913100000e-04 1.161845576800000e-03 2.431474749700000e-03 1.866059907600000e-03 3.288230355500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.310000000000000e+02 -1.174961992444691e+06 -4.939189243479520e+06 4.626002917339445e+06 -2.837755786199863e+03 -4.524890185355167e+03 -5.536149692082727e+03 1.916119770900000e-03 7.288319913100000e-04 1.161845576800000e-03 2.431474749700000e-03 1.866059907600000e-03 3.288230355500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.320000000000000e+02 -1.175018747371381e+06 -4.939279739948890e+06 4.625892193275807e+06 -2.837740007177711e+03 -4.524761553069987e+03 -5.536263377442824e+03 1.916119770900000e-03 7.288319913100000e-04 1.161845576800000e-03 2.431474749700000e-03 1.866059907600000e-03 3.288230355500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.330000000000000e+02 -1.175075502041684e+06 -4.939370233969095e+06 4.625781466801972e+06 -2.837724046670771e+03 -4.524633252222796e+03 -5.536376862709598e+03 1.916119770900000e-03 7.288319913100000e-04 1.161845576800000e-03 2.431474749700000e-03 1.866059907600000e-03 3.288230355500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.340000000000000e+02 -1.175132256344472e+06 -4.939460725299857e+06 4.625670738176171e+06 -2.837708529150790e+03 -4.524504096065987e+03 -5.536490856686933e+03 1.916119770900000e-03 7.288319913100000e-04 1.161845576800000e-03 2.431474749700000e-03 1.866059907600000e-03 3.288230355500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.350000000000000e+02 -1.175189010371948e+06 -4.939551214112623e+06 4.625560007191903e+06 -2.837693008167270e+03 -4.524374932630046e+03 -5.536604852951354e+03 1.916119770900000e-03 7.288319913100000e-04 1.161845576800000e-03 2.431474749700000e-03 1.866059907600000e-03 3.288230355500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.360000000000000e+02 -1.175245764079316e+06 -4.939641700324162e+06 4.625449273949430e+06 -2.837677485394799e+03 -4.524245768905388e+03 -5.536718844932573e+03 1.916119770900000e-03 7.288319913100000e-04 1.161845576800000e-03 2.431474749700000e-03 1.866059907600000e-03 3.288230355500000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.370000000000000e+02 -1.175302517500209e+06 -4.939732183996984e+06 4.625338538373453e+06 -2.837661960942601e+03 -4.524116599190371e+03 -5.536832837328963e+03 1.916072325100000e-03 7.285263070500000e-04 1.162016124200000e-03 2.430641299900000e-03 1.865933070500000e-03 3.289215710400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.380000000000000e+02 -1.175359270589836e+06 -4.939822665047858e+06 4.625227800564227e+06 -2.837646434994882e+03 -4.523987430989592e+03 -5.536946823809834e+03 1.916072325100000e-03 7.285263070500000e-04 1.162016124200000e-03 2.430641299900000e-03 1.865933070500000e-03 3.289215710400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.390000000000000e+02 -1.175416023359248e+06 -4.939913143497380e+06 4.625117060496962e+06 -2.837630907363830e+03 -4.523858262570667e+03 -5.537060805901870e+03 1.916072325100000e-03 7.285263070500000e-04 1.162016124200000e-03 2.430641299900000e-03 1.865933070500000e-03 3.289215710400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.400000000000000e+02 -1.175472775819741e+06 -4.940003619366527e+06 4.625006318146381e+06 -2.837615378746794e+03 -4.523729091691795e+03 -5.537174785159496e+03 1.916072325100000e-03 7.285263070500000e-04 1.162016124200000e-03 2.430641299900000e-03 1.865933070500000e-03 3.289215710400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.410000000000000e+02 -1.175529527982371e+06 -4.940094092675887e+06 4.624895573487679e+06 -2.837599847672433e+03 -4.523599916912130e+03 -5.537288763440370e+03 1.916072325100000e-03 7.285263070500000e-04 1.162016124200000e-03 2.430641299900000e-03 1.865933070500000e-03 3.289215710400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.420000000000000e+02 -1.175586279826104e+06 -4.940184563387034e+06 4.624784826574453e+06 -2.837584385726535e+03 -4.523470905342116e+03 -5.537402569595098e+03 1.916072325100000e-03 7.285263070500000e-04 1.162016124200000e-03 2.430641299900000e-03 1.865933070500000e-03 3.289215710400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.430000000000000e+02 -1.175643031354351e+06 -4.940275031506700e+06 4.624674077403424e+06 -2.837568970195571e+03 -4.523341999474260e+03 -5.537516261656926e+03 1.916072325100000e-03 7.285263070500000e-04 1.162016124200000e-03 2.430641299900000e-03 1.865933070500000e-03 3.289215710400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.440000000000000e+02 -1.175699782570332e+06 -4.940365497039879e+06 4.624563325956458e+06 -2.837553433676062e+03 -4.523212818345023e+03 -5.537630231644457e+03 1.916072325100000e-03 7.285263070500000e-04 1.162016124200000e-03 2.430641299900000e-03 1.865933070500000e-03 3.289215710400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.450000000000000e+02 -1.175756533488222e+06 -4.940455960012961e+06 4.624452572201746e+06 -2.837537894435288e+03 -4.523083633303375e+03 -5.537744200782526e+03 1.916072325100000e-03 7.285263070500000e-04 1.162016124200000e-03 2.430641299900000e-03 1.865933070500000e-03 3.289215710400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.460000000000000e+02 -1.175813284085815e+06 -4.940546420384654e+06 4.624341816189062e+06 -2.837522354975728e+03 -4.522954447721712e+03 -5.537858165144890e+03 1.916072325100000e-03 7.285263070500000e-04 1.162016124200000e-03 2.430641299900000e-03 1.865933070500000e-03 3.289215710400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.470000000000000e+02 -1.175870034385253e+06 -4.940636878196166e+06 4.624231057868741e+06 -2.837506812428144e+03 -4.522825258399477e+03 -5.537972128678703e+03 1.916024815300000e-03 7.282205444900000e-04 1.162186522100000e-03 2.429807918700000e-03 1.865805843800000e-03 3.290201102000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.480000000000000e+02 -1.175926784353150e+06 -4.940727333385437e+06 4.624120297315572e+06 -2.837491269670093e+03 -4.522696069936750e+03 -5.538086086268673e+03 1.916024815300000e-03 7.282205444900000e-04 1.162186522100000e-03 2.429807918700000e-03 1.865805843800000e-03 3.290201102000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.490000000000000e+02 -1.175983534022897e+06 -4.940817786014574e+06 4.624009534454722e+06 -2.837475724315399e+03 -4.522566878207052e+03 -5.538200042416177e+03 1.916024815300000e-03 7.282205444900000e-04 1.162186522100000e-03 2.429807918700000e-03 1.865805843800000e-03 3.290201102000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.500000000000000e+02 -1.176040283372046e+06 -4.940908236041889e+06 4.623898769336433e+06 -2.837460177259643e+03 -4.522437685830378e+03 -5.538313994540504e+03 1.916024815300000e-03 7.282205444900000e-04 1.162186522100000e-03 2.429807918700000e-03 1.865805843800000e-03 3.290201102000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.510000000000000e+02 -1.176097032423054e+06 -4.940998683509102e+06 4.623788001910406e+06 -2.837444628799514e+03 -4.522308489127788e+03 -5.538427945570066e+03 1.916024815300000e-03 7.282205444900000e-04 1.162186522100000e-03 2.429807918700000e-03 1.865805843800000e-03 3.290201102000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.520000000000000e+02 -1.176153781149712e+06 -4.941089128385573e+06 4.623677232234369e+06 -2.837428890370758e+03 -4.522179843691722e+03 -5.538541517585916e+03 1.916024815300000e-03 7.282205444900000e-04 1.162186522100000e-03 2.429807918700000e-03 1.865805843800000e-03 3.290201102000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.530000000000000e+02 -1.176210529557112e+06 -4.941179570692773e+06 4.623566460296229e+06 -2.837413024479209e+03 -4.522051561990952e+03 -5.538654838696844e+03 1.916024815300000e-03 7.282205444900000e-04 1.162186522100000e-03 2.429807918700000e-03 1.865805843800000e-03 3.290201102000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.540000000000000e+02 -1.176267277654430e+06 -4.941270010417743e+06 4.623455686077037e+06 -2.837397470922285e+03 -4.521922358788325e+03 -5.538768781463265e+03 1.916024815300000e-03 7.282205444900000e-04 1.162186522100000e-03 2.429807918700000e-03 1.865805843800000e-03 3.290201102000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.550000000000000e+02 -1.176324025442219e+06 -4.941360447561554e+06 4.623344909575502e+06 -2.837381915053363e+03 -4.521793153725582e+03 -5.538882721489161e+03 1.916024815300000e-03 7.282205444900000e-04 1.162186522100000e-03 2.429807918700000e-03 1.865805843800000e-03 3.290201102000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.560000000000000e+02 -1.176380772953865e+06 -4.941450882186297e+06 4.623234130716769e+06 -2.837366355553218e+03 -4.521663941443398e+03 -5.538996663822491e+03 1.916024815300000e-03 7.282205444900000e-04 1.162186522100000e-03 2.429807918700000e-03 1.865805843800000e-03 3.290201102000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.570000000000000e+02 -1.176437520100156e+06 -4.941541314126167e+06 4.623123349700763e+06 -2.837350797517883e+03 -4.521534735541898e+03 -5.539110594871401e+03 1.915977241500000e-03 7.279147035700000e-04 1.162356770500000e-03 2.428974605900000e-03 1.865678227700000e-03 3.291186530900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.580000000000000e+02 -1.176494266981400e+06 -4.941631743567626e+06 4.623012566302639e+06 -2.837335234974877e+03 -4.521405520468032e+03 -5.539224530243863e+03 1.915977241500000e-03 7.279147035700000e-04 1.162356770500000e-03 2.428974605900000e-03 1.865678227700000e-03 3.291186530900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.590000000000000e+02 -1.176551013530722e+06 -4.941722170386386e+06 4.622901780672283e+06 -2.837319672518042e+03 -4.521276306801448e+03 -5.539338459085668e+03 1.915977241500000e-03 7.279147035700000e-04 1.162356770500000e-03 2.428974605900000e-03 1.865678227700000e-03 3.291186530900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.600000000000000e+02 -1.176607759748004e+06 -4.941812594582275e+06 4.622790992809899e+06 -2.837304108499238e+03 -4.521147094350264e+03 -5.539452382293842e+03 1.915977241500000e-03 7.279147035700000e-04 1.162356770500000e-03 2.428974605900000e-03 1.865678227700000e-03 3.291186530900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.610000000000000e+02 -1.176664505677799e+06 -4.941903016238119e+06 4.622680202615617e+06 -2.837288541632617e+03 -4.521017876557835e+03 -5.539566305896398e+03 1.915977241500000e-03 7.279147035700000e-04 1.162356770500000e-03 2.428974605900000e-03 1.865678227700000e-03 3.291186530900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.620000000000000e+02 -1.176721251301090e+06 -4.941993435318035e+06 4.622569410145113e+06 -2.837273133080033e+03 -4.520888925877040e+03 -5.539679931244406e+03 1.915977241500000e-03 7.279147035700000e-04 1.162356770500000e-03 2.428974605900000e-03 1.865678227700000e-03 3.291186530900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.630000000000000e+02 -1.176777996615867e+06 -4.942083851817995e+06 4.622458615411481e+06 -2.837257827662698e+03 -4.520760151997376e+03 -5.539793358128603e+03 1.915977241500000e-03 7.279147035700000e-04 1.162356770500000e-03 2.428974605900000e-03 1.865678227700000e-03 3.291186530900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.640000000000000e+02 -1.176834741603062e+06 -4.942174265703481e+06 4.622347818435727e+06 -2.837242255897207e+03 -4.520630929545761e+03 -5.539907271805603e+03 1.915977241500000e-03 7.279147035700000e-04 1.162356770500000e-03 2.428974605900000e-03 1.865678227700000e-03 3.291186530900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.650000000000000e+02 -1.176891486313956e+06 -4.942264677069750e+06 4.622237019102933e+06 -2.837226681849956e+03 -4.520501699083946e+03 -5.540021187842368e+03 1.915977241500000e-03 7.279147035700000e-04 1.162356770500000e-03 2.428974605900000e-03 1.865678227700000e-03 3.291186530900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.660000000000000e+02 -1.176948230670268e+06 -4.942355085771396e+06 4.622126217588506e+06 -2.837211107448246e+03 -4.520372473692245e+03 -5.540135094501279e+03 1.915977241500000e-03 7.279147035700000e-04 1.162356770500000e-03 2.428974605900000e-03 1.865678227700000e-03 3.291186530900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.670000000000000e+02 -1.177004974761213e+06 -4.942445491974228e+06 4.622015413692438e+06 -2.837195528999207e+03 -4.520243239320646e+03 -5.540249005115114e+03 1.915929603700000e-03 7.276087842200000e-04 1.162526869600000e-03 2.428141361500000e-03 1.865550222000000e-03 3.292171997700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.680000000000000e+02 -1.177061718508750e+06 -4.942535895533228e+06 4.621904607589664e+06 -2.837179951039190e+03 -4.520114007722080e+03 -5.540362907884318e+03 1.915929603700000e-03 7.276087842200000e-04 1.162526869600000e-03 2.428141361500000e-03 1.865550222000000e-03 3.292171997700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.690000000000000e+02 -1.177118461957433e+06 -4.942626296531216e+06 4.621793799180274e+06 -2.837164370424090e+03 -4.519984772368730e+03 -5.540476809641661e+03 1.915929603700000e-03 7.276087842200000e-04 1.162526869600000e-03 2.428141361500000e-03 1.865550222000000e-03 3.292171997700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.700000000000000e+02 -1.177175205084810e+06 -4.942716694926518e+06 4.621682988514555e+06 -2.837148787912166e+03 -4.519855536734469e+03 -5.540590707160273e+03 1.915929603700000e-03 7.276087842200000e-04 1.162526869600000e-03 2.428141361500000e-03 1.865550222000000e-03 3.292171997700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.710000000000000e+02 -1.177231947924504e+06 -4.942807090781593e+06 4.621572175517143e+06 -2.837133203792161e+03 -4.519726295081897e+03 -5.540704605080367e+03 1.915929603700000e-03 7.276087842200000e-04 1.162526869600000e-03 2.428141361500000e-03 1.865550222000000e-03 3.292171997700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.720000000000000e+02 -1.177288690405333e+06 -4.942897483980070e+06 4.621461360343771e+06 -2.837117418739598e+03 -4.519597478193144e+03 -5.540818234425570e+03 1.915929603700000e-03 7.276087842200000e-04 1.162526869600000e-03 2.428141361500000e-03 1.865550222000000e-03 3.292171997700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.730000000000000e+02 -1.177345432607189e+06 -4.942987874680838e+06 4.621350542812869e+06 -2.837101498768670e+03 -4.519468929983126e+03 -5.540931695453717e+03 1.915929603700000e-03 7.276087842200000e-04 1.162526869600000e-03 2.428141361500000e-03 1.865550222000000e-03 3.292171997700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.740000000000000e+02 -1.177402174499048e+06 -4.943078262800012e+06 4.621239723000194e+06 -2.837085908313816e+03 -4.519339680416045e+03 -5.541045586829892e+03 1.915929603700000e-03 7.276087842200000e-04 1.162526869600000e-03 2.428141361500000e-03 1.865550222000000e-03 3.292171997700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.750000000000000e+02 -1.177458916035933e+06 -4.943168648254064e+06 4.621128901006553e+06 -2.837070317594600e+03 -4.519210435670449e+03 -5.541159468997357e+03 1.915929603700000e-03 7.276087842200000e-04 1.162526869600000e-03 2.428141361500000e-03 1.865550222000000e-03 3.292171997700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.760000000000000e+02 -1.177515657284958e+06 -4.943259031167667e+06 4.621018076681493e+06 -2.837054724987367e+03 -4.519081185082334e+03 -5.541273351544738e+03 1.915929603700000e-03 7.276087842200000e-04 1.162526869600000e-03 2.428141361500000e-03 1.865550222000000e-03 3.292171997700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.770000000000000e+02 -1.177572398234844e+06 -4.943349411519905e+06 4.620907250050247e+06 -2.837039129831022e+03 -4.518951930445373e+03 -5.541387233276538e+03 1.915881902200000e-03 7.273027865200000e-04 1.162696819600000e-03 2.427308185800000e-03 1.865421826900000e-03 3.293157502900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.780000000000000e+02 -1.177629138885474e+06 -4.943439789310598e+06 4.620796421113043e+06 -2.837023531995026e+03 -4.518822672354131e+03 -5.541501113756790e+03 1.915881902200000e-03 7.273027865200000e-04 1.162696819600000e-03 2.427308185800000e-03 1.865421826900000e-03 3.293157502900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.790000000000000e+02 -1.177685879181149e+06 -4.943530164436262e+06 4.620685589994780e+06 -2.837007935082991e+03 -4.518693418609746e+03 -5.541614984892848e+03 1.915881902200000e-03 7.273027865200000e-04 1.162696819600000e-03 2.427308185800000e-03 1.865421826900000e-03 3.293157502900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.800000000000000e+02 -1.177742619199909e+06 -4.943620537041910e+06 4.620574756520431e+06 -2.836992334586223e+03 -4.518564157735580e+03 -5.541728858236012e+03 1.915881902200000e-03 7.273027865200000e-04 1.162696819600000e-03 2.427308185800000e-03 1.865421826900000e-03 3.293157502900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.810000000000000e+02 -1.177799358885810e+06 -4.943710907023667e+06 4.620463920815385e+06 -2.836976732674644e+03 -4.518434898317739e+03 -5.541842725682380e+03 1.915881902200000e-03 7.273027865200000e-04 1.162696819600000e-03 2.427308185800000e-03 1.865421826900000e-03 3.293157502900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.820000000000000e+02 -1.177856098249895e+06 -4.943801274410027e+06 4.620353082860474e+06 -2.836961117609916e+03 -4.518306014487479e+03 -5.541956281632905e+03 1.915881902200000e-03 7.273027865200000e-04 1.162696819600000e-03 2.427308185800000e-03 1.865421826900000e-03 3.293157502900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.830000000000000e+02 -1.177912837297382e+06 -4.943891639216062e+06 4.620242242647623e+06 -2.836945491336409e+03 -4.518177378691284e+03 -5.542069631214431e+03 1.915881902200000e-03 7.273027865200000e-04 1.162696819600000e-03 2.427308185800000e-03 1.865421826900000e-03 3.293157502900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.840000000000000e+02 -1.177969576047804e+06 -4.943982001464706e+06 4.620131400123787e+06 -2.836929884783249e+03 -4.518048110459461e+03 -5.542183492085639e+03 1.915881902200000e-03 7.273027865200000e-04 1.162696819600000e-03 2.427308185800000e-03 1.865421826900000e-03 3.293157502900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.850000000000000e+02 -1.178026314487637e+06 -4.944072361130900e+06 4.620020555319245e+06 -2.836914275769487e+03 -4.517918840570239e+03 -5.542297350114528e+03 1.915881902200000e-03 7.273027865200000e-04 1.162696819600000e-03 2.427308185800000e-03 1.865421826900000e-03 3.293157502900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.860000000000000e+02 -1.178083052650261e+06 -4.944162718276668e+06 4.619909708159095e+06 -2.836898663530790e+03 -4.517789563162539e+03 -5.542411210511034e+03 1.915881902200000e-03 7.273027865200000e-04 1.162696819600000e-03 2.427308185800000e-03 1.865421826900000e-03 3.293157502900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.870000000000000e+02 -1.178139790468811e+06 -4.944253072777820e+06 4.619798858793299e+06 -2.836883051424940e+03 -4.517660288773413e+03 -5.542525063022260e+03 1.915834136900000e-03 7.269967103700000e-04 1.162866620500000e-03 2.426475078500000e-03 1.865293042500000e-03 3.294143047000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.880000000000000e+02 -1.178196527943181e+06 -4.944343424634185e+06 4.619688007222073e+06 -2.836867438675885e+03 -4.517531017471477e+03 -5.542638907938633e+03 1.915834136900000e-03 7.269967103700000e-04 1.162866620500000e-03 2.426475078500000e-03 1.865293042500000e-03 3.294143047000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.890000000000000e+02 -1.178253265151395e+06 -4.944433773990729e+06 4.619577153270361e+06 -2.836851821716134e+03 -4.517401737209934e+03 -5.542752756859652e+03 1.915834136900000e-03 7.269967103700000e-04 1.162866620500000e-03 2.426475078500000e-03 1.865293042500000e-03 3.294143047000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.900000000000000e+02 -1.178310002048925e+06 -4.944524120764730e+06 4.619466297038053e+06 -2.836836204064289e+03 -4.517272454456023e+03 -5.542866602841618e+03 1.915834136900000e-03 7.269967103700000e-04 1.162866620500000e-03 2.426475078500000e-03 1.865293042500000e-03 3.294143047000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.910000000000000e+02 -1.178366738624491e+06 -4.944614464935280e+06 4.619355438550401e+06 -2.836820584542579e+03 -4.517143171340818e+03 -5.542980444640980e+03 1.915834136900000e-03 7.269967103700000e-04 1.162866620500000e-03 2.426475078500000e-03 1.865293042500000e-03 3.294143047000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.920000000000000e+02 -1.178423474873752e+06 -4.944704806507966e+06 4.619244577810504e+06 -2.836804751757510e+03 -4.517014175719457e+03 -5.543094137639641e+03 1.915834136900000e-03 7.269967103700000e-04 1.162866620500000e-03 2.426475078500000e-03 1.865293042500000e-03 3.294143047000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.930000000000000e+02 -1.178480210788637e+06 -4.944795145476801e+06 4.619133714832102e+06 -2.836788778408086e+03 -4.516885369739545e+03 -5.543207730627068e+03 1.915834136900000e-03 7.269967103700000e-04 1.162866620500000e-03 2.426475078500000e-03 1.865293042500000e-03 3.294143047000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.940000000000000e+02 -1.178536946411622e+06 -4.944885481898083e+06 4.619022849530850e+06 -2.836773153142477e+03 -4.516756078372077e+03 -5.543321565861787e+03 1.915834136900000e-03 7.269967103700000e-04 1.162866620500000e-03 2.426475078500000e-03 1.865293042500000e-03 3.294143047000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.950000000000000e+02 -1.178593681712423e+06 -4.944975815715623e+06 4.618911981974638e+06 -2.836757526168096e+03 -4.516626787094574e+03 -5.543435396467550e+03 1.915834136900000e-03 7.269967103700000e-04 1.162866620500000e-03 2.426475078500000e-03 1.865293042500000e-03 3.294143047000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.960000000000000e+02 -1.178650416691165e+06 -4.945066146929625e+06 4.618801112163201e+06 -2.836741898713377e+03 -4.516497494688285e+03 -5.543549222907779e+03 1.915834136900000e-03 7.269967103700000e-04 1.162866620500000e-03 2.426475078500000e-03 1.865293042500000e-03 3.294143047000000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.970000000000000e+02 -1.178707151381142e+06 -4.945156475601991e+06 4.618690240021783e+06 -2.836726267713366e+03 -4.516368197305806e+03 -5.543663049745724e+03 1.915786308000000e-03 7.266905558200000e-04 1.163036272500000e-03 2.425642039900000e-03 1.865163868700000e-03 3.295128630400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.980000000000000e+02 -1.178763885748991e+06 -4.945246801670735e+06 4.618579365625247e+06 -2.836710636373125e+03 -4.516238898888639e+03 -5.543776872277394e+03 1.915786308000000e-03 7.266905558200000e-04 1.163036272500000e-03 2.425642039900000e-03 1.865163868700000e-03 3.295128630400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>4.990000000000000e+02 -1.178820619805758e+06 -4.945337125156416e+06 4.618468488948768e+06 -2.836695002782878e+03 -4.516109598518797e+03 -5.543890692118001e+03 1.915786308000000e-03 7.266905558200000e-04 1.163036272500000e-03 2.425642039900000e-03 1.865163868700000e-03 3.295128630400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.000000000000000e+02 -1.178877353562489e+06 -4.945427446079592e+06 4.618357609967509e+06 -2.836679366456229e+03 -4.515980294424697e+03 -5.544004510955315e+03 1.915786308000000e-03 7.266905558200000e-04 1.163036272500000e-03 2.425642039900000e-03 1.865163868700000e-03 3.295128630400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.010000000000000e+02 -1.178934086974659e+06 -4.945517764357566e+06 4.618246728781398e+06 -2.836663730619545e+03 -4.515850993220522e+03 -5.544118321858204e+03 1.915786308000000e-03 7.266905558200000e-04 1.163036272500000e-03 2.425642039900000e-03 1.865163868700000e-03 3.295128630400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.020000000000000e+02 -1.178990820100996e+06 -4.945608080101999e+06 4.618135845273538e+06 -2.836648242746400e+03 -4.515722095507655e+03 -5.544231726450035e+03 1.915786308000000e-03 7.266905558200000e-04 1.163036272500000e-03 2.425642039900000e-03 1.865163868700000e-03 3.295128630400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.030000000000000e+02 -1.179047552902790e+06 -4.945698393242766e+06 4.618024959540632e+06 -2.836632853309185e+03 -4.515593469056472e+03 -5.544344856635176e+03 1.915786308000000e-03 7.266905558200000e-04 1.163036272500000e-03 2.425642039900000e-03 1.865163868700000e-03 3.295128630400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.040000000000000e+02 -1.179104285384221e+06 -4.945788703783333e+06 4.617914071548514e+06 -2.836617211860006e+03 -4.515464159593885e+03 -5.544458660947841e+03 1.915786308000000e-03 7.266905558200000e-04 1.163036272500000e-03 2.425642039900000e-03 1.865163868700000e-03 3.295128630400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.050000000000000e+02 -1.179161017565519e+06 -4.945879011761302e+06 4.617803181251728e+06 -2.836601567515332e+03 -4.515334846283374e+03 -5.544572464430699e+03 1.915786308000000e-03 7.266905558200000e-04 1.163036272500000e-03 2.425642039900000e-03 1.865163868700000e-03 3.295128630400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.060000000000000e+02 -1.179217749435410e+06 -4.945969317155782e+06 4.617692288675538e+06 -2.836585921146353e+03 -4.515205531046840e+03 -5.544686265099603e+03 1.915786308000000e-03 7.266905558200000e-04 1.163036272500000e-03 2.425642039900000e-03 1.865163868700000e-03 3.295128630400000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.070000000000000e+02 -1.179274481016344e+06 -4.946059620008434e+06 4.617581393769584e+06 -2.836570273122324e+03 -4.515076209697882e+03 -5.544800066263574e+03 1.915738415600000e-03 7.263843228300000e-04 1.163205775800000e-03 2.424809070000000e-03 1.865034305600000e-03 3.296114253800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.080000000000000e+02 -1.179331212252306e+06 -4.946149920215328e+06 4.617470496659478e+06 -2.836554623420290e+03 -4.514946891823211e+03 -5.544913859977736e+03 1.915738415600000e-03 7.263843228300000e-04 1.163205775800000e-03 2.424809070000000e-03 1.865034305600000e-03 3.296114253800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.090000000000000e+02 -1.179387943210405e+06 -4.946240217901031e+06 4.617359597194665e+06 -2.836538971862989e+03 -4.514817566249520e+03 -5.545027655592620e+03 1.915738415600000e-03 7.263843228300000e-04 1.163205775800000e-03 2.424809070000000e-03 1.865034305600000e-03 3.296114253800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.100000000000000e+02 -1.179444673812386e+06 -4.946330512920301e+06 4.617248695550702e+06 -2.836523319658999e+03 -4.514688245502964e+03 -5.545141442175250e+03 1.915738415600000e-03 7.263843228300000e-04 1.163205775800000e-03 2.424809070000000e-03 1.865034305600000e-03 3.296114253800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.110000000000000e+02 -1.179501404136263e+06 -4.946420805418034e+06 4.617137791552464e+06 -2.836507663861179e+03 -4.514558917809058e+03 -5.545255230810923e+03 1.915738415600000e-03 7.263843228300000e-04 1.163205775800000e-03 2.424809070000000e-03 1.865034305600000e-03 3.296114253800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.120000000000000e+02 -1.179558134131700e+06 -4.946511095320180e+06 4.617026885304419e+06 -2.836491716620339e+03 -4.514430020347598e+03 -5.545368787313014e+03 1.915738415600000e-03 7.263843228300000e-04 1.163205775800000e-03 2.424809070000000e-03 1.865034305600000e-03 3.296114253800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.130000000000000e+02 -1.179614863804942e+06 -4.946601382651261e+06 4.616915976786871e+06 -2.836475574133062e+03 -4.514301406848834e+03 -5.545482190104914e+03 1.915738415600000e-03 7.263843228300000e-04 1.163205775800000e-03 2.424809070000000e-03 1.865034305600000e-03 3.296114253800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.140000000000000e+02 -1.179671593147573e+06 -4.946691667363383e+06 4.616805066032812e+06 -2.836459913873271e+03 -4.514172075945923e+03 -5.545595967445537e+03 1.915738415600000e-03 7.263843228300000e-04 1.163205775800000e-03 2.424809070000000e-03 1.865034305600000e-03 3.296114253800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.150000000000000e+02 -1.179728322178642e+06 -4.946781949491885e+06 4.616694152999526e+06 -2.836444253051437e+03 -4.514042742686719e+03 -5.545709741676553e+03 1.915738415600000e-03 7.263843228300000e-04 1.163205775800000e-03 2.424809070000000e-03 1.865034305600000e-03 3.296114253800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.160000000000000e+02 -1.179785050898026e+06 -4.946872229036590e+06 4.616583237687218e+06 -2.836428589705368e+03 -4.513913407285834e+03 -5.545823513495914e+03 1.915738415600000e-03 7.263843228300000e-04 1.163205775800000e-03 2.424809070000000e-03 1.865034305600000e-03 3.296114253800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.170000000000000e+02 -1.179841779327937e+06 -4.946962506038766e+06 4.616472320046000e+06 -2.836412923419011e+03 -4.513784066538607e+03 -5.545937285747275e+03 1.915690459700000e-03 7.260780113200000e-04 1.163375130400000e-03 2.423976168500000e-03 1.864904353300000e-03 3.297099917900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.180000000000000e+02 -1.179898507457337e+06 -4.947052780477899e+06 4.616361400100656e+06 -2.836397255949466e+03 -4.513654721274525e+03 -5.546051056957935e+03 1.915690459700000e-03 7.260780113200000e-04 1.163375130400000e-03 2.423976168500000e-03 1.864904353300000e-03 3.297099917900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.190000000000000e+02 -1.179955235241466e+06 -4.947143052270955e+06 4.616250477951618e+06 -2.836381587418128e+03 -4.513525379478318e+03 -5.546164820451521e+03 1.915690459700000e-03 7.260780113200000e-04 1.163375130400000e-03 2.423976168500000e-03 1.864904353300000e-03 3.297099917900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.200000000000000e+02 -1.180011962747172e+06 -4.947233321542062e+06 4.616139553448774e+06 -2.836365915326659e+03 -4.513396030429691e+03 -5.546278586234052e+03 1.915690459700000e-03 7.260780113200000e-04 1.163375130400000e-03 2.423976168500000e-03 1.864904353300000e-03 3.297099917900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.210000000000000e+02 -1.180068689885298e+06 -4.947323588125701e+06 4.616028626792297e+06 -2.836350244603025e+03 -4.513266687493000e+03 -5.546392341022969e+03 1.915690459700000e-03 7.260780113200000e-04 1.163375130400000e-03 2.423976168500000e-03 1.864904353300000e-03 3.297099917900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.220000000000000e+02 -1.180125416756416e+06 -4.947413852215947e+06 4.615917697763773e+06 -2.836334585451822e+03 -4.513137732076208e+03 -5.546505763977629e+03 1.915690459700000e-03 7.260780113200000e-04 1.163375130400000e-03 2.423976168500000e-03 1.864904353300000e-03 3.297099917900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.230000000000000e+02 -1.180182143297591e+06 -4.947504113700830e+06 4.615806766509421e+06 -2.836318936423188e+03 -4.513009038376073e+03 -5.546618960089306e+03 1.915690459700000e-03 7.260780113200000e-04 1.163375130400000e-03 2.423976168500000e-03 1.864904353300000e-03 3.297099917900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.240000000000000e+02 -1.180238869512725e+06 -4.947594372575447e+06 4.615695833008092e+06 -2.836303258577156e+03 -4.512879684098427e+03 -5.546732711503298e+03 1.915690459700000e-03 7.260780113200000e-04 1.163375130400000e-03 2.423976168500000e-03 1.864904353300000e-03 3.297099917900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.250000000000000e+02 -1.180295595393459e+06 -4.947684628824324e+06 4.615584897278509e+06 -2.836287579399519e+03 -4.512750331218651e+03 -5.546846457038570e+03 1.915690459700000e-03 7.260780113200000e-04 1.163375130400000e-03 2.423976168500000e-03 1.864904353300000e-03 3.297099917900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.260000000000000e+02 -1.180352320984560e+06 -4.947774882530528e+06 4.615473959220178e+06 -2.836271898574284e+03 -4.512620972368536e+03 -5.546960202945169e+03 1.915690459700000e-03 7.260780113200000e-04 1.163375130400000e-03 2.423976168500000e-03 1.864904353300000e-03 3.297099917900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.270000000000000e+02 -1.180409046274753e+06 -4.947865133673173e+06 4.615363018858367e+06 -2.836256215163332e+03 -4.512491609629081e+03 -5.547073947916141e+03 1.915642440400000e-03 7.257716213700000e-04 1.163544336500000e-03 2.423143335900000e-03 1.864774011800000e-03 3.298085622700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.280000000000000e+02 -1.180465771230436e+06 -4.947955382189950e+06 4.615252076268471e+06 -2.836240530165366e+03 -4.512362248637341e+03 -5.547187686832634e+03 1.915642440400000e-03 7.257716213700000e-04 1.163544336500000e-03 2.423143335900000e-03 1.864774011800000e-03 3.298085622700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.290000000000000e+02 -1.180522495874062e+06 -4.948045628122496e+06 4.615141131400106e+06 -2.836224844566760e+03 -4.512232885012952e+03 -5.547301422885980e+03 1.915642440400000e-03 7.257716213700000e-04 1.163544336500000e-03 2.423143335900000e-03 1.864774011800000e-03 3.298085622700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.300000000000000e+02 -1.180579220216674e+06 -4.948135871491353e+06 4.615030184228424e+06 -2.836209156205276e+03 -4.512103517564804e+03 -5.547415158028307e+03 1.915642440400000e-03 7.257716213700000e-04 1.163544336500000e-03 2.423143335900000e-03 1.864774011800000e-03 3.298085622700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.310000000000000e+02 -1.180635944246992e+06 -4.948226112275633e+06 4.614919234778703e+06 -2.836193465565452e+03 -4.511974148286271e+03 -5.547528890390966e+03 1.915642440400000e-03 7.257716213700000e-04 1.163544336500000e-03 2.423143335900000e-03 1.864774011800000e-03 3.298085622700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.320000000000000e+02 -1.180692667954652e+06 -4.948316350459358e+06 4.614808283079760e+06 -2.836177807691172e+03 -4.511845003549788e+03 -5.547642416700411e+03 1.915642440400000e-03 7.257716213700000e-04 1.163544336500000e-03 2.423143335900000e-03 1.864774011800000e-03 3.298085622700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.330000000000000e+02 -1.180749391368812e+06 -4.948406586098884e+06 4.614697329069703e+06 -2.836162168214490e+03 -4.511716003053260e+03 -5.547755809936136e+03 1.915642440400000e-03 7.257716213700000e-04 1.163544336500000e-03 2.423143335900000e-03 1.864774011800000e-03 3.298085622700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.340000000000000e+02 -1.180806114465930e+06 -4.948496819145043e+06 4.614586372792236e+06 -2.836146472849588e+03 -4.511586624981178e+03 -5.547869535734055e+03 1.915642440400000e-03 7.257716213700000e-04 1.163544336500000e-03 2.423143335900000e-03 1.864774011800000e-03 3.298085622700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.350000000000000e+02 -1.180862837228375e+06 -4.948587049565166e+06 4.614475414286915e+06 -2.836130776058893e+03 -4.511457248634894e+03 -5.547983255424837e+03 1.915642440400000e-03 7.257716213700000e-04 1.163544336500000e-03 2.423143335900000e-03 1.864774011800000e-03 3.298085622700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.360000000000000e+02 -1.180919559700674e+06 -4.948677277441917e+06 4.614364453453697e+06 -2.836115076217179e+03 -4.511327866617715e+03 -5.548096975863334e+03 1.915642440400000e-03 7.257716213700000e-04 1.163544336500000e-03 2.423143335900000e-03 1.864774011800000e-03 3.298085622700000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.370000000000000e+02 -1.180976281815991e+06 -4.948767502651258e+06 4.614253490442704e+06 -2.836099377167701e+03 -4.511198489305595e+03 -5.548210686736835e+03 1.915594357800000e-03 7.254651528800000e-04 1.163713394300000e-03 2.422310571900000e-03 1.864643281100000e-03 3.299071369300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.380000000000000e+02 -1.181033003652330e+06 -4.948857725337978e+06 4.614142525078696e+06 -2.836083674768109e+03 -4.511069104515569e+03 -5.548324399988710e+03 1.915594357800000e-03 7.254651528800000e-04 1.163713394300000e-03 2.422310571900000e-03 1.864643281100000e-03 3.299071369300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.390000000000000e+02 -1.181089725187249e+06 -4.948947945460476e+06 4.614031557412020e+06 -2.836067969484307e+03 -4.510939716129131e+03 -5.548438112194475e+03 1.915594357800000e-03 7.254651528800000e-04 1.163713394300000e-03 2.422310571900000e-03 1.864643281100000e-03 3.299071369300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.400000000000000e+02 -1.181146446376247e+06 -4.949038162936158e+06 4.613920587542672e+06 -2.836052264863758e+03 -4.510810330578602e+03 -5.548551816442293e+03 1.915594357800000e-03 7.254651528800000e-04 1.163713394300000e-03 2.422310571900000e-03 1.864643281100000e-03 3.299071369300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.410000000000000e+02 -1.181203167297318e+06 -4.949128377909779e+06 4.613809615295399e+06 -2.836036556208428e+03 -4.510680935812330e+03 -5.548665524812778e+03 1.915594357800000e-03 7.254651528800000e-04 1.163713394300000e-03 2.422310571900000e-03 1.864643281100000e-03 3.299071369300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.420000000000000e+02 -1.181259887880271e+06 -4.949218590266990e+06 4.613698640827733e+06 -2.836020690059407e+03 -4.510552044827615e+03 -5.548778880764256e+03 1.915594357800000e-03 7.254651528800000e-04 1.163713394300000e-03 2.422310571900000e-03 1.864643281100000e-03 3.299071369300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.430000000000000e+02 -1.181316608115535e+06 -4.949308800000509e+06 4.613587664161148e+06 -2.836004720519096e+03 -4.510423487706306e+03 -5.548892000961408e+03 1.915594357800000e-03 7.254651528800000e-04 1.163713394300000e-03 2.422310571900000e-03 1.864643281100000e-03 3.299071369300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.440000000000000e+02 -1.181373328054015e+06 -4.949399007178499e+06 4.613476685181388e+06 -2.835989006956538e+03 -4.510294088541461e+03 -5.549005699224931e+03 1.915594357800000e-03 7.254651528800000e-04 1.163713394300000e-03 2.422310571900000e-03 1.864643281100000e-03 3.299071369300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.450000000000000e+02 -1.181430047668550e+06 -4.949489211750600e+06 4.613365703949413e+06 -2.835973291664693e+03 -4.510164688715359e+03 -5.549119393495495e+03 1.915594357800000e-03 7.254651528800000e-04 1.163713394300000e-03 2.422310571900000e-03 1.864643281100000e-03 3.299071369300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.460000000000000e+02 -1.181486766959265e+06 -4.949579413717040e+06 4.613254720464971e+06 -2.835957575821585e+03 -4.510035288595015e+03 -5.549233082943897e+03 1.915594357800000e-03 7.254651528800000e-04 1.163713394300000e-03 2.422310571900000e-03 1.864643281100000e-03 3.299071369300000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.470000000000000e+02 -1.181543485948285e+06 -4.949669613118911e+06 4.613143734678287e+06 -2.835941857122855e+03 -4.509905884466622e+03 -5.549346771673976e+03 1.915546211900000e-03 7.251586059200000e-04 1.163882303800000e-03 2.421477876700000e-03 1.864512161300000e-03 3.300057157800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.480000000000000e+02 -1.181600204613416e+06 -4.949759809915034e+06 4.613032746639243e+06 -2.835926137832332e+03 -4.509776479913313e+03 -5.549460455708379e+03 1.915546211900000e-03 7.251586059200000e-04 1.163882303800000e-03 2.421477876700000e-03 1.864512161300000e-03 3.300057157800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.490000000000000e+02 -1.181656922976858e+06 -4.949850004146636e+06 4.612921756297910e+06 -2.835910415818971e+03 -4.509647071448647e+03 -5.549574138884992e+03 1.915546211900000e-03 7.251586059200000e-04 1.163882303800000e-03 2.421477876700000e-03 1.864512161300000e-03 3.300057157800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.500000000000000e+02 -1.181713641049655e+06 -4.949940195834244e+06 4.612810763629426e+06 -2.835894690884847e+03 -4.509517657482999e+03 -5.549687822608204e+03 1.915546211900000e-03 7.251586059200000e-04 1.163882303800000e-03 2.421477876700000e-03 1.864512161300000e-03 3.300057157800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.510000000000000e+02 -1.181770358776142e+06 -4.950030384874567e+06 4.612699768758890e+06 -2.835878966420944e+03 -4.509388246354422e+03 -5.549801498460985e+03 1.915546211900000e-03 7.251586059200000e-04 1.163882303800000e-03 2.421477876700000e-03 1.864512161300000e-03 3.300057157800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.520000000000000e+02 -1.181827076190261e+06 -4.950120571335440e+06 4.612588771616427e+06 -2.835863268599706e+03 -4.509259127905632e+03 -5.549914914761768e+03 1.915546211900000e-03 7.251586059200000e-04 1.163882303800000e-03 2.421477876700000e-03 1.864512161300000e-03 3.300057157800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.530000000000000e+02 -1.181883793309267e+06 -4.950210755252114e+06 4.612477772167491e+06 -2.835847586928969e+03 -4.509130199422803e+03 -5.550028161259942e+03 1.915546211900000e-03 7.251586059200000e-04 1.163882303800000e-03 2.421477876700000e-03 1.864512161300000e-03 3.300057157800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.540000000000000e+02 -1.181940510097566e+06 -4.950300936550512e+06 4.612366770481372e+06 -2.835831856792655e+03 -4.509000779976563e+03 -5.550141830586941e+03 1.915546211900000e-03 7.251586059200000e-04 1.163882303800000e-03 2.421477876700000e-03 1.864512161300000e-03 3.300057157800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.550000000000000e+02 -1.181997226550494e+06 -4.950391115222046e+06 4.612255766568510e+06 -2.835816125096045e+03 -4.508871362273376e+03 -5.550255493855854e+03 1.915546211900000e-03 7.251586059200000e-04 1.163882303800000e-03 2.421477876700000e-03 1.864512161300000e-03 3.300057157800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.560000000000000e+02 -1.182053942712561e+06 -4.950481291349311e+06 4.612144760328823e+06 -2.835800390328036e+03 -4.508741938796325e+03 -5.550369157963890e+03 1.915546211900000e-03 7.251586059200000e-04 1.163882303800000e-03 2.421477876700000e-03 1.864512161300000e-03 3.300057157800000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.570000000000000e+02 -1.182110658561580e+06 -4.950571464891138e+06 4.612033751812193e+06 -2.835784654749568e+03 -4.508612512875321e+03 -5.550482819145923e+03 1.915498003000000e-03 7.248519804199999e-04 1.164051065200000e-03 2.420645250300000e-03 1.864380652400000e-03 3.301042988900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.580000000000000e+02 -1.182167374108511e+06 -4.950661635867918e+06 4.611922740993922e+06 -2.835768916039362e+03 -4.508483083485960e+03 -5.550596479284886e+03 1.915498003000000e-03 7.248519804199999e-04 1.164051065200000e-03 2.420645250300000e-03 1.864380652400000e-03 3.301042988900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.590000000000000e+02 -1.182224089331165e+06 -4.950751804238480e+06 4.611811727923891e+06 -2.835753176898750e+03 -4.508353653321613e+03 -5.550710134946797e+03 1.915498003000000e-03 7.248519804199999e-04 1.164051065200000e-03 2.420645250300000e-03 1.864380652400000e-03 3.301042988900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.600000000000000e+02 -1.182280804240589e+06 -4.950841970023338e+06 4.611700712577236e+06 -2.835737435671434e+03 -4.508224220929723e+03 -5.550823788072574e+03 1.915498003000000e-03 7.248519804199999e-04 1.164051065200000e-03 2.420645250300000e-03 1.864380652400000e-03 3.301042988900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.610000000000000e+02 -1.182337518836660e+06 -4.950932133222325e+06 4.611589694954180e+06 -2.835721692024967e+03 -4.508094786834610e+03 -5.550937438376462e+03 1.915498003000000e-03 7.248519804199999e-04 1.164051065200000e-03 2.420645250300000e-03 1.864380652400000e-03 3.301042988900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.620000000000000e+02 -1.182394233117115e+06 -4.951022293842166e+06 4.611478675058762e+06 -2.835705827900856e+03 -4.507965675340050e+03 -5.551050870067017e+03 1.915498003000000e-03 7.248519804199999e-04 1.164051065200000e-03 2.420645250300000e-03 1.864380652400000e-03 3.301042988900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.630000000000000e+02 -1.182450947076843e+06 -4.951112451880679e+06 4.611367652901721e+06 -2.835689882248852e+03 -4.507836777596686e+03 -5.551164155883229e+03 1.915498003000000e-03 7.248519804199999e-04 1.164051065200000e-03 2.420645250300000e-03 1.864380652400000e-03 3.301042988900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.640000000000000e+02 -1.182507660694067e+06 -4.951202607279319e+06 4.611256628533734e+06 -2.835674134160605e+03 -4.507707340439318e+03 -5.551277794747827e+03 1.915498003000000e-03 7.248519804199999e-04 1.164051065200000e-03 2.420645250300000e-03 1.864380652400000e-03 3.301042988900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.650000000000000e+02 -1.182564374042586e+06 -4.951292760174941e+06 4.611145601788930e+06 -2.835658383640359e+03 -4.507577893870630e+03 -5.551391437175108e+03 1.915498003000000e-03 7.248519804199999e-04 1.164051065200000e-03 2.420645250300000e-03 1.864380652400000e-03 3.301042988900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.660000000000000e+02 -1.182621087066503e+06 -4.951382910463909e+06 4.611034572792907e+06 -2.835642631294573e+03 -4.507448446787894e+03 -5.551505075531671e+03 1.915498003000000e-03 7.248519804199999e-04 1.164051065200000e-03 2.420645250300000e-03 1.864380652400000e-03 3.301042988900000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.670000000000000e+02 -1.182677799765700e+06 -4.951473058146060e+06 4.610923541545887e+06 -2.835626877008485e+03 -4.507318999817590e+03 -5.551618709350490e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.680000000000000e+02 -1.182734512129150e+06 -4.951563203200911e+06 4.610812508072685e+06 -2.835611122997490e+03 -4.507189553513253e+03 -5.551732337186389e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.690000000000000e+02 -1.182791224212513e+06 -4.951653345731745e+06 4.610701472248116e+06 -2.835595365223696e+03 -4.507060100244728e+03 -5.551845967152312e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.700000000000000e+02 -1.182847935959898e+06 -4.951743485634938e+06 4.610590434197788e+06 -2.835579606181724e+03 -4.506930648212766e+03 -5.551959591351218e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.710000000000000e+02 -1.182904647404897e+06 -4.951833622972775e+06 4.610479393846205e+06 -2.835563845915562e+03 -4.506801192080821e+03 -5.552073214178678e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.720000000000000e+02 -1.182961358536154e+06 -4.951923757724263e+06 4.610368351218816e+06 -2.835548082852867e+03 -4.506671734203429e+03 -5.552186834387498e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.730000000000000e+02 -1.183018069342644e+06 -4.952013889868930e+06 4.610257306340437e+06 -2.835532319459702e+03 -4.506542275369926e+03 -5.552300450225736e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.740000000000000e+02 -1.183074779880028e+06 -4.952104019510039e+06 4.610146259085874e+06 -2.835516552185143e+03 -4.506412807659775e+03 -5.552414069827518e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.750000000000000e+02 -1.183131490070100e+06 -4.952194146502611e+06 4.610035209630915e+06 -2.835500783881256e+03 -4.506283343200482e+03 -5.552527681890203e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.760000000000000e+02 -1.183188199946451e+06 -4.952284270908915e+06 4.609924157900051e+06 -2.835485014683748e+03 -4.506153876219801e+03 -5.552641291128044e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.770000000000000e+02 -1.183244909486655e+06 -4.952374392687417e+06 4.609813103943663e+06 -2.835469244157086e+03 -4.506024410791017e+03 -5.552754894366382e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.780000000000000e+02 -1.183301618757531e+06 -4.952464511962051e+06 4.609702047611455e+06 -2.835453469673595e+03 -4.505894936330933e+03 -5.552868501528769e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.790000000000000e+02 -1.183358327669960e+06 -4.952554628567550e+06 4.609590989103852e+06 -2.835437696147023e+03 -4.505765466417645e+03 -5.552982099196392e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.800000000000000e+02 -1.183415036290757e+06 -4.952644742627856e+06 4.609479928270545e+06 -2.835421919372389e+03 -4.505635991123298e+03 -5.553095697453233e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.810000000000000e+02 -1.183471744597499e+06 -4.952734854101421e+06 4.609368865161923e+06 -2.835406140558807e+03 -4.505506513548865e+03 -5.553209293196016e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.820000000000000e+02 -1.183528452601463e+06 -4.952824963009141e+06 4.609257799752633e+06 -2.835390360423624e+03 -4.505377031764720e+03 -5.553322887700587e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.830000000000000e+02 -1.183585160280144e+06 -4.952915069309358e+06 4.609146732093226e+06 -2.835374577883274e+03 -4.505247550084093e+03 -5.553436477883326e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.840000000000000e+02 -1.183641867622513e+06 -4.953005172981602e+06 4.609035662208526e+06 -2.835358795527759e+03 -4.505118069360503e+03 -5.553550061884945e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.850000000000000e+02 -1.183698574706538e+06 -4.953095274170467e+06 4.608924589923126e+06 -2.835343008740520e+03 -4.504988577860300e+03 -5.553663651462966e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.860000000000000e+02 -1.183755281442864e+06 -4.953185372710330e+06 4.608813515437949e+06 -2.835327220978447e+03 -4.504859089446896e+03 -5.553777233615714e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.870000000000000e+02 -1.183811987842773e+06 -4.953275468622098e+06 4.608702438727647e+06 -2.835311433273252e+03 -4.504729602403207e+03 -5.553890809303637e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.880000000000000e+02 -1.183868693950768e+06 -4.953365561988314e+06 4.608591359692071e+06 -2.835295642433844e+03 -4.504600109680853e+03 -5.554004385774911e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.890000000000000e+02 -1.183925399744419e+06 -4.953455652767438e+06 4.608480278381614e+06 -2.835279849338261e+03 -4.504470614868670e+03 -5.554117959671570e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.900000000000000e+02 -1.183982105223860e+06 -4.953545740959696e+06 4.608369194796020e+06 -2.835264055620423e+03 -4.504341117764305e+03 -5.554231530433046e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.910000000000000e+02 -1.184038810388969e+06 -4.953635826564905e+06 4.608258108935491e+06 -2.835248259441471e+03 -4.504211618317237e+03 -5.554345098920187e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.920000000000000e+02 -1.184095515273092e+06 -4.953725909644932e+06 4.608147020724975e+06 -2.835232459841948e+03 -4.504082112070611e+03 -5.554458669243618e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.930000000000000e+02 -1.184152219775972e+06 -4.953815990013903e+06 4.608035930390032e+06 -2.835216661871476e+03 -4.503952613528027e+03 -5.554572227167880e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.940000000000000e+02 -1.184208924009032e+06 -4.953906067878400e+06 4.607924837679950e+06 -2.835200860123191e+03 -4.503823106069001e+03 -5.554685788836906e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.950000000000000e+02 -1.184265627927538e+06 -4.953996143155552e+06 4.607813742695317e+06 -2.835185056023103e+03 -4.503693596628809e+03 -5.554799347883946e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.960000000000000e+02 -1.184322331509309e+06 -4.954086215804216e+06 4.607702645486057e+06 -2.835169251957958e+03 -4.503564088166191e+03 -5.554912900801305e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.970000000000000e+02 -1.184379034787613e+06 -4.954176285886129e+06 4.607591545977260e+06 -2.835153444861574e+03 -4.503434576199308e+03 -5.555026452658010e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.980000000000000e+02 -1.184435737740265e+06 -4.954266353360152e+06 4.607480444218851e+06 -2.835137637149818e+03 -4.503305063420639e+03 -5.555140000153462e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>5.990000000000000e+02 -1.184492440411764e+06 -4.954356418308799e+06 4.607369340110661e+06 -2.835121826212222e+03 -4.503175543368515e+03 -5.555253549788747e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.000000000000000e+02 -1.184549142712768e+06 -4.954446480566522e+06 4.607258233853676e+06 -2.835106014925196e+03 -4.503046030198390e+03 -5.555367088588171e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.010000000000000e+02 -1.184605844743781e+06 -4.954536540319587e+06 4.607147125221761e+06 -2.835090201145738e+03 -4.502916507453676e+03 -5.555480631101649e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.020000000000000e+02 -1.184662546460076e+06 -4.954626597485130e+06 4.607036014315515e+06 -2.835074385345786e+03 -4.502786982605692e+03 -5.555594170946484e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.030000000000000e+02 -1.184719247839227e+06 -4.954716652021641e+06 4.606924901185349e+06 -2.835058567806065e+03 -4.502657459465302e+03 -5.555707704849893e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.040000000000000e+02 -1.184775948925975e+06 -4.954806704012010e+06 4.606813785730608e+06 -2.835042748901541e+03 -4.502527930174691e+03 -5.555821239135660e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.050000000000000e+02 -1.184832649664441e+06 -4.954896753352725e+06 4.606702668076999e+06 -2.835026928865947e+03 -4.502398404324148e+03 -5.555934765778393e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.060000000000000e+02 -1.184889350132575e+06 -4.954986800188289e+06 4.606591548049038e+06 -2.835011104926083e+03 -4.502268869274367e+03 -5.556048296452121e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.070000000000000e+02 -1.184946050263587e+06 -4.955076844394906e+06 4.606480425797061e+06 -2.834995281038226e+03 -4.502139335270410e+03 -5.556161820933687e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.080000000000000e+02 -1.185002750090740e+06 -4.955166886034283e+06 4.606369301246142e+06 -2.834979454030092e+03 -4.502009797795366e+03 -5.556275344365936e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.090000000000000e+02 -1.185059449569552e+06 -4.955256925023964e+06 4.606258174496419e+06 -2.834963627497009e+03 -4.501880263021574e+03 -5.556388860051152e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.100000000000000e+02 -1.185116148755666e+06 -4.955346961467110e+06 4.606147045422599e+06 -2.834947797749811e+03 -4.501750722744409e+03 -5.556502376407114e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.110000000000000e+02 -1.185172847615507e+06 -4.955436995301551e+06 4.606035914100206e+06 -2.834931966240316e+03 -4.501621182336520e+03 -5.556615888350943e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.120000000000000e+02 -1.185229546182661e+06 -4.955527026589499e+06 4.605924780453663e+06 -2.834916133115528e+03 -4.501491635761296e+03 -5.556729400801565e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.130000000000000e+02 -1.185286244434706e+06 -4.955617055289445e+06 4.605813644533390e+06 -2.834900297734315e+03 -4.501362087207242e+03 -5.556842910585834e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.140000000000000e+02 -1.185342942360378e+06 -4.955707081380563e+06 4.605702506364703e+06 -2.834884460526418e+03 -4.501232538546498e+03 -5.556956415966879e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.150000000000000e+02 -1.185399639993248e+06 -4.955797104925045e+06 4.605591365872030e+06 -2.834868621567091e+03 -4.501102983768602e+03 -5.557069921873272e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.160000000000000e+02 -1.185456337244002e+06 -4.955887125757426e+06 4.605480223256416e+06 -2.834852783158236e+03 -4.500973437465482e+03 -5.557183415234455e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.170000000000000e+02 -1.185513034246329e+06 -4.955977144125482e+06 4.605369078216823e+06 -2.834836939581801e+03 -4.500843878878758e+03 -5.557296915731852e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.180000000000000e+02 -1.185569730888848e+06 -4.956067159822805e+06 4.605257931004039e+06 -2.834821097221281e+03 -4.500714324678936e+03 -5.557410406762974e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.190000000000000e+02 -1.185626427260653e+06 -4.956157173014519e+06 4.605146781417423e+06 -2.834805250805939e+03 -4.500584761370629e+03 -5.557523901813231e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.200000000000000e+02 -1.185683123283568e+06 -4.956247183555814e+06 4.605035629632946e+06 -2.834789403460582e+03 -4.500455201504136e+03 -5.557637389132836e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.210000000000000e+02 -1.185739819024623e+06 -4.956337191570878e+06 4.604924475499691e+06 -2.834773553921240e+03 -4.500325633762617e+03 -5.557750878624736e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.220000000000000e+02 -1.185796514405569e+06 -4.956427196914784e+06 4.604813319193787e+06 -2.834757703448626e+03 -4.500196071276311e+03 -5.557864358891381e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.230000000000000e+02 -1.185853209504584e+06 -4.956517199732367e+06 4.604702160539214e+06 -2.834741850783837e+03 -4.500066500914286e+03 -5.557977841329775e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.240000000000000e+02 -1.185909904276953e+06 -4.956607199940817e+06 4.604590999636625e+06 -2.834725996518061e+03 -4.499936930545743e+03 -5.558091319182658e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.250000000000000e+02 -1.185966598733708e+06 -4.956697197560618e+06 4.604479836461118e+06 -2.834710139795038e+03 -4.499807357908405e+03 -5.558204794697997e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.260000000000000e+02 -1.186023292874977e+06 -4.956787192591992e+06 4.604368671012432e+06 -2.834694282332877e+03 -4.499677783061226e+03 -5.558318267062622e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.270000000000000e+02 -1.186079986678340e+06 -4.956877184993447e+06 4.604257503341003e+06 -2.834678423479754e+03 -4.499548209613634e+03 -5.558431733588609e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.280000000000000e+02 -1.186136680210585e+06 -4.956967174888750e+06 4.604146333296379e+06 -2.834662560661855e+03 -4.499418627096731e+03 -5.558545204058617e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.290000000000000e+02 -1.186193373404937e+06 -4.957057162154176e+06 4.604035161028961e+06 -2.834646697928679e+03 -4.499289045543746e+03 -5.558658668392814e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.300000000000000e+02 -1.186250066261279e+06 -4.957147146789561e+06 4.603923986538963e+06 -2.834630833715718e+03 -4.499159465715838e+03 -5.558772126659802e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.310000000000000e+02 -1.186306758857543e+06 -4.957237128939312e+06 4.603812809650821e+06 -2.834614965206970e+03 -4.499029875055428e+03 -5.558885590471648e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.320000000000000e+02 -1.186363451082363e+06 -4.957327108397099e+06 4.603701630615385e+06 -2.834599098086605e+03 -4.498900290423857e+03 -5.558999043390144e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.330000000000000e+02 -1.186420143035881e+06 -4.957417085348509e+06 4.603590449207023e+06 -2.834583226383228e+03 -4.498770697316288e+03 -5.559112500036813e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.340000000000000e+02 -1.186476834640185e+06 -4.957507059649178e+06 4.603479265601254e+06 -2.834567355329365e+03 -4.498641106740446e+03 -5.559225949004075e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.350000000000000e+02 -1.186533525928599e+06 -4.957597031360902e+06 4.603368079722960e+06 -2.834551481760559e+03 -4.498511514319513e+03 -5.559339395310025e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.360000000000000e+02 -1.186590216912161e+06 -4.957687000504148e+06 4.603256891547236e+06 -2.834535605773746e+03 -4.498381918022916e+03 -5.559452840586182e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.370000000000000e+02 -1.186646907590996e+06 -4.957776967079140e+06 4.603145701073818e+06 -2.834519728413668e+03 -4.498252317610361e+03 -5.559566284565750e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.380000000000000e+02 -1.186703597942691e+06 -4.957866931044402e+06 4.603034508353149e+06 -2.834503849314627e+03 -4.498122716841976e+03 -5.559679724310488e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.390000000000000e+02 -1.186760287978275e+06 -4.957956892420404e+06 4.602923313360326e+06 -2.834487967861758e+03 -4.497993114023221e+03 -5.559793161491390e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.400000000000000e+02 -1.186816977675579e+06 -4.958046851166074e+06 4.602812116145327e+06 -2.834472086541658e+03 -4.497863512517785e+03 -5.559906592228946e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.410000000000000e+02 -1.186873667090236e+06 -4.958136807384483e+06 4.602700916582776e+06 -2.834456201842854e+03 -4.497733903537714e+03 -5.560020025331159e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.420000000000000e+02 -1.186930356177525e+06 -4.958226760992859e+06 4.602589714773351e+06 -2.834440314914816e+03 -4.497604294347030e+03 -5.560133454297150e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.430000000000000e+02 -1.186987044948727e+06 -4.958316712012060e+06 4.602478510691675e+06 -2.834424427656299e+03 -4.497474682540998e+03 -5.560246880265211e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.440000000000000e+02 -1.187043733403723e+06 -4.958406660441926e+06 4.602367304337963e+06 -2.834408537690877e+03 -4.497345068997906e+03 -5.560360303568162e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.450000000000000e+02 -1.187100421553548e+06 -4.958496606302924e+06 4.602256095687309e+06 -2.834392645415006e+03 -4.497215451649224e+03 -5.560473725734900e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.460000000000000e+02 -1.187157109364882e+06 -4.958586549533334e+06 4.602144884814803e+06 -2.834376753014521e+03 -4.497085835125098e+03 -5.560587141976484e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.470000000000000e+02 -1.187213796882122e+06 -4.958676490215432e+06 4.602033671620348e+06 -2.834360857121454e+03 -4.496956213492605e+03 -5.560700558681368e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.480000000000000e+02 -1.187270484094241e+06 -4.958766428328787e+06 4.601922456128786e+06 -2.834344959887534e+03 -4.496826587440089e+03 -5.560813974324961e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.490000000000000e+02 -1.187327170945393e+06 -4.958856363770004e+06 4.601811238465945e+06 -2.834329062308998e+03 -4.496696966358184e+03 -5.560927380724334e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.500000000000000e+02 -1.187383857513486e+06 -4.958946296683430e+06 4.601700018456195e+06 -2.834313160969988e+03 -4.496567338417543e+03 -5.561040789148439e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.510000000000000e+02 -1.187440543742914e+06 -4.959036226966055e+06 4.601588796224872e+06 -2.834297259775101e+03 -4.496437711202875e+03 -5.561154191609859e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.520000000000000e+02 -1.187497229655855e+06 -4.959126154658990e+06 4.601477571721946e+06 -2.834281356359813e+03 -4.496308081925850e+03 -5.561267591458117e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.530000000000000e+02 -1.187553915263340e+06 -4.959216079782711e+06 4.601366344922513e+06 -2.834265450172898e+03 -4.496178449160160e+03 -5.561380990113622e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.540000000000000e+02 -1.187610600554348e+06 -4.959306002316784e+06 4.601255115851426e+06 -2.834249543320177e+03 -4.496048813611380e+03 -5.561494386058546e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.550000000000000e+02 -1.187667285517614e+06 -4.959395922240401e+06 4.601143884534028e+06 -2.834233634465480e+03 -4.495919178061697e+03 -5.561607777594497e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.560000000000000e+02 -1.187723970186466e+06 -4.959485839615311e+06 4.601032650895161e+06 -2.834217722769267e+03 -4.495789536943752e+03 -5.561721169681998e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.570000000000000e+02 -1.187780654538736e+06 -4.959575754400442e+06 4.600921414984804e+06 -2.834201810076647e+03 -4.495659893311195e+03 -5.561834558984518e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.580000000000000e+02 -1.187837338563076e+06 -4.959665666574857e+06 4.600810176828453e+06 -2.834185895109717e+03 -4.495530249522943e+03 -5.561947944126759e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.590000000000000e+02 -1.187894022248469e+06 -4.959755576118133e+06 4.600698936450983e+06 -2.834169980232286e+03 -4.495400606774479e+03 -5.562061323073318e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.600000000000000e+02 -1.187950705661680e+06 -4.959845483153935e+06 4.600587693701841e+06 -2.834154061334624e+03 -4.495270955266605e+03 -5.562174705723680e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.610000000000000e+02 -1.188007388713416e+06 -4.959935387516976e+06 4.600476448782258e+06 -2.834138141977394e+03 -4.495141308591981e+03 -5.562288079297694e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.620000000000000e+02 -1.188064071492980e+06 -4.960025289372575e+06 4.600365201490952e+06 -2.834122220086052e+03 -4.495011652425687e+03 -5.562401456517518e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.630000000000000e+02 -1.188120753922227e+06 -4.960115188576098e+06 4.600253952004028e+06 -2.834106297208342e+03 -4.494881999437611e+03 -5.562514826258879e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.640000000000000e+02 -1.188177436045627e+06 -4.960205085209923e+06 4.600142700221191e+06 -2.834090371632749e+03 -4.494752342934001e+03 -5.562628194796129e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.650000000000000e+02 -1.188234117874455e+06 -4.960294979294896e+06 4.600031446117040e+06 -2.834074444469512e+03 -4.494622680105803e+03 -5.562741563949056e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.660000000000000e+02 -1.188290799330571e+06 -4.960384870686407e+06 4.599920189867704e+06 -2.834058517146123e+03 -4.494493024436124e+03 -5.562854921979098e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.670000000000000e+02 -1.188347480525316e+06 -4.960474759590620e+06 4.599808931222097e+06 -2.834042585441969e+03 -4.494363357814595e+03 -5.562968285676762e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.680000000000000e+02 -1.188404161380799e+06 -4.960564645863314e+06 4.599697670355863e+06 -2.834026653814038e+03 -4.494233692129250e+03 -5.563081643271028e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.690000000000000e+02 -1.188460841941484e+06 -4.960654529586851e+06 4.599586407168690e+06 -2.834010718993634e+03 -4.494104021041500e+03 -5.563195001434173e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.700000000000000e+02 -1.188517522140382e+06 -4.960744410637263e+06 4.599475141811591e+06 -2.833994783775228e+03 -4.493974355131869e+03 -5.563308350212285e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.710000000000000e+02 -1.188574202044491e+06 -4.960834289138556e+06 4.599363874133503e+06 -2.833978846780316e+03 -4.493844682930939e+03 -5.563421699661939e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.720000000000000e+02 -1.188630881609035e+06 -4.960924165007902e+06 4.599252604235332e+06 -2.833962907963492e+03 -4.493715012514966e+03 -5.563535043153743e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.730000000000000e+02 -1.188687560901013e+06 -4.961014038369314e+06 4.599141331966016e+06 -2.833946966621455e+03 -4.493585332785875e+03 -5.563648390137139e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.740000000000000e+02 -1.188744239831144e+06 -4.961103909057557e+06 4.599030057526832e+06 -2.833931024796927e+03 -4.493455657754952e+03 -5.563761728169390e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.750000000000000e+02 -1.188800918477329e+06 -4.961193777216885e+06 4.598918780742065e+06 -2.833915079360252e+03 -4.493325975882571e+03 -5.563875068140996e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.760000000000000e+02 -1.188857596795113e+06 -4.961283642764981e+06 4.598807501711980e+06 -2.833899133531012e+03 -4.493196292904746e+03 -5.563988403899361e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.770000000000000e+02 -1.188914274806671e+06 -4.961373505742935e+06 4.598696220386524e+06 -2.833883185127600e+03 -4.493066606292719e+03 -5.564101738495337e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.780000000000000e+02 -1.188970952511885e+06 -4.961463366150577e+06 4.598584936765910e+06 -2.833867233925175e+03 -4.492936916093168e+03 -5.564215071990196e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.790000000000000e+02 -1.189027629844016e+06 -4.961553223864353e+06 4.598473651000692e+06 -2.833851284241157e+03 -4.492807231850115e+03 -5.564328394610790e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.800000000000000e+02 -1.189084306903247e+06 -4.961643079069744e+06 4.598362362864855e+06 -2.833835330361532e+03 -4.492677538947462e+03 -5.564441720925342e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.810000000000000e+02 -1.189140983633740e+06 -4.961732931663429e+06 4.598251072484299e+06 -2.833819374890296e+03 -4.492547845602759e+03 -5.564555043013685e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.820000000000000e+02 -1.189197660046765e+06 -4.961822781666261e+06 4.598139779833621e+06 -2.833803418404165e+03 -4.492418149934865e+03 -5.564668362167813e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.830000000000000e+02 -1.189254336142127e+06 -4.961912629077934e+06 4.598028484913194e+06 -2.833787459386873e+03 -4.492288452248554e+03 -5.564781678810505e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.840000000000000e+02 -1.189311011897662e+06 -4.962002473857419e+06 4.597917187773036e+06 -2.833771500282563e+03 -4.492158755744090e+03 -5.564894989222830e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.850000000000000e+02 -1.189367687357831e+06 -4.962092316087035e+06 4.597805888312797e+06 -2.833755538092219e+03 -4.492029053615060e+03 -5.565008300337527e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.860000000000000e+02 -1.189424362511374e+06 -4.962182155745985e+06 4.597694586557837e+06 -2.833739573258033e+03 -4.491899347914650e+03 -5.565121610268497e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.870000000000000e+02 -1.189481037358417e+06 -4.962271992834485e+06 4.597583282507882e+06 -2.833723607239174e+03 -4.491769637774035e+03 -5.565234919082214e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.880000000000000e+02 -1.189537711843126e+06 -4.962361827249249e+06 4.597471976288860e+06 -2.833707640633540e+03 -4.491639932702376e+03 -5.565348218690084e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.890000000000000e+02 -1.189594386043385e+06 -4.962451659134465e+06 4.597360667724992e+06 -2.833691670413173e+03 -4.491510220497054e+03 -5.565461520475940e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.900000000000000e+02 -1.189651059914754e+06 -4.962541488407850e+06 4.597249356916580e+06 -2.833675700015682e+03 -4.491380507364098e+03 -5.565574817807449e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.910000000000000e+02 -1.189707733468255e+06 -4.962631315089870e+06 4.597138043838700e+06 -2.833659727153275e+03 -4.491250792590944e+03 -5.565688112286964e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.920000000000000e+02 -1.189764406681489e+06 -4.962721139139096e+06 4.597026728541849e+06 -2.833643753104388e+03 -4.491121078968587e+03 -5.565801401051168e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.930000000000000e+02 -1.189821079588009e+06 -4.962810960617613e+06 4.596915410950335e+06 -2.833627777682704e+03 -4.490991361305139e+03 -5.565914688453347e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.940000000000000e+02 -1.189877752221129e+06 -4.962900779587097e+06 4.596804090988936e+06 -2.833611798284886e+03 -4.490861634570463e+03 -5.566027979786266e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.950000000000000e+02 -1.189934424480444e+06 -4.962990595861815e+06 4.596692768884172e+06 -2.833595818864827e+03 -4.490731914768494e+03 -5.566141260131896e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.960000000000000e+02 -1.189991096455228e+06 -4.963080409606922e+06 4.596581444434610e+06 -2.833579837324563e+03 -4.490602186950593e+03 -5.566254542715884e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.970000000000000e+02 -1.190047768122994e+06 -4.963170220780884e+06 4.596470117690919e+06 -2.833563852669016e+03 -4.490472455589514e+03 -5.566367824301419e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.980000000000000e+02 -1.190104439450440e+06 -4.963260029322062e+06 4.596358788728277e+06 -2.833547867958630e+03 -4.490342725619816e+03 -5.566481099471865e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>6.990000000000000e+02 -1.190161110437454e+06 -4.963349835230291e+06 4.596247457546890e+06 -2.833531881958196e+03 -4.490212996730227e+03 -5.566594369032082e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.000000000000000e+02 -1.190217781139629e+06 -4.963439638608471e+06 4.596136124021243e+06 -2.833515892408691e+03 -4.490083260718791e+03 -5.566707640729014e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.010000000000000e+02 -1.190274451512521e+06 -4.963529439374355e+06 4.596024788251661e+06 -2.833499902426734e+03 -4.489953524021570e+03 -5.566820907886882e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.020000000000000e+02 -1.190331121567161e+06 -4.963619237548389e+06 4.595913450213211e+06 -2.833483910322122e+03 -4.489823785448742e+03 -5.566934172234485e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.030000000000000e+02 -1.190387791303428e+06 -4.963709033130402e+06 4.595802109906103e+06 -2.833467915796457e+03 -4.489694044744981e+03 -5.567047434114201e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.040000000000000e+02 -1.190444460721449e+06 -4.963798826120608e+06 4.595690767330077e+06 -2.833451920585022e+03 -4.489564301597943e+03 -5.567160693012411e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.050000000000000e+02 -1.190501129821110e+06 -4.963888616518831e+06 4.595579422485341e+06 -2.833435923066557e+03 -4.489434556387528e+03 -5.567273949336566e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.060000000000000e+02 -1.190557798613435e+06 -4.963978404345516e+06 4.595468075346968e+06 -2.833419922903903e+03 -4.489304807496786e+03 -5.567387204565384e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.070000000000000e+02 -1.190614467053981e+06 -4.964068189518428e+06 4.595356726015292e+06 -2.833403923195379e+03 -4.489175061479471e+03 -5.567500451936699e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.080000000000000e+02 -1.190671135220549e+06 -4.964157972181544e+06 4.595245374314628e+06 -2.833387919101121e+03 -4.489045306431574e+03 -5.567613703383120e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.090000000000000e+02 -1.190727803024126e+06 -4.964247752170195e+06 4.595134020445924e+06 -2.833371915905623e+03 -4.488915556054557e+03 -5.567726945297774e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.100000000000000e+02 -1.190784470531449e+06 -4.964337529607871e+06 4.595022664258483e+06 -2.833355909528671e+03 -4.488785800124559e+03 -5.567840187894520e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.110000000000000e+02 -1.190841137720118e+06 -4.964427304453177e+06 4.594911305802825e+06 -2.833339900956510e+03 -4.488656042273434e+03 -5.567953427750675e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.120000000000000e+02 -1.190897804601400e+06 -4.964517076726940e+06 4.594799945053532e+06 -2.833323891211543e+03 -4.488526280161385e+03 -5.568066666335110e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.130000000000000e+02 -1.190954471130614e+06 -4.964606846346547e+06 4.594688582111430e+06 -2.833307880359090e+03 -4.488396521135288e+03 -5.568179897581862e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.140000000000000e+02 -1.191011137363350e+06 -4.964696613414879e+06 4.594577216850968e+06 -2.833291866519207e+03 -4.488266756887202e+03 -5.568293129152032e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.150000000000000e+02 -1.191067803299736e+06 -4.964786377932140e+06 4.594465849271879e+06 -2.833275851069927e+03 -4.488136986651105e+03 -5.568406361062994e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.160000000000000e+02 -1.191124468895087e+06 -4.964876139815724e+06 4.594354479474988e+06 -2.833259834052346e+03 -4.488007217526985e+03 -5.568519587463019e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.170000000000000e+02 -1.191181134160431e+06 -4.964965899086078e+06 4.594243107435373e+06 -2.833243815349977e+03 -4.487877448657900e+03 -5.568632809108190e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.180000000000000e+02 -1.191237799140458e+06 -4.965055655825836e+06 4.594131733052131e+06 -2.833227794544246e+03 -4.487747671801980e+03 -5.568746032955068e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.190000000000000e+02 -1.191294463745925e+06 -4.965145409869988e+06 4.594020356526729e+06 -2.833211773562288e+03 -4.487617901759012e+03 -5.568859245990649e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.200000000000000e+02 -1.191351128076981e+06 -4.965235161403794e+06 4.593908977632976e+06 -2.833195748702369e+03 -4.487488122826196e+03 -5.568972462756934e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.210000000000000e+02 -1.191407792078051e+06 -4.965324910324456e+06 4.593797596496388e+06 -2.833179723371267e+03 -4.487358343004473e+03 -5.569085675169728e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.220000000000000e+02 -1.191464455737798e+06 -4.965414656611074e+06 4.593686213142504e+06 -2.833163696318671e+03 -4.487228564938155e+03 -5.569198881612172e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.230000000000000e+02 -1.191521119134328e+06 -4.965504400408068e+06 4.593574827394942e+06 -2.833147666123492e+03 -4.487098775637595e+03 -5.569312093383428e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.240000000000000e+02 -1.191577782156124e+06 -4.965594141509252e+06 4.593463439505511e+06 -2.833131635971351e+03 -4.486968993106814e+03 -5.569425294283289e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.250000000000000e+02 -1.191634444903332e+06 -4.965683880099872e+06 4.593352049247987e+06 -2.833115601821959e+03 -4.486839201583357e+03 -5.569538499049623e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.260000000000000e+02 -1.191691107309236e+06 -4.965773616056526e+06 4.593240656773067e+06 -2.833099567718309e+03 -4.486709410979157e+03 -5.569651697748512e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.270000000000000e+02 -1.191747769396002e+06 -4.965863349420247e+06 4.593129262030641e+06 -2.833083531398782e+03 -4.486579618425807e+03 -5.569764893739063e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.280000000000000e+02 -1.191804431152372e+06 -4.965953080170270e+06 4.593017865046090e+06 -2.833067493182864e+03 -4.486449825804359e+03 -5.569878085335040e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.290000000000000e+02 -1.191861092589612e+06 -4.966042808327402e+06 4.592906465793988e+06 -2.833051454195161e+03 -4.486320030553612e+03 -5.569991274140659e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.300000000000000e+02 -1.191917753729887e+06 -4.966132533932676e+06 4.592795064224220e+06 -2.833035412100495e+03 -4.486190229905104e+03 -5.570104463464729e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.310000000000000e+02 -1.191974414539662e+06 -4.966222256924116e+06 4.592683660412489e+06 -2.833019368262399e+03 -4.486060428875964e+03 -5.570217648583060e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.320000000000000e+02 -1.192031075041339e+06 -4.966311977343136e+06 4.592572254308210e+06 -2.833003323102899e+03 -4.485930623787845e+03 -5.570330832328324e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.330000000000000e+02 -1.192087735201305e+06 -4.966401695127642e+06 4.592460845987242e+06 -2.832987276115752e+03 -4.485800820166460e+03 -5.570444010388862e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.340000000000000e+02 -1.192144395053107e+06 -4.966491410339639e+06 4.592349435373831e+06 -2.832971227895309e+03 -4.485671012490280e+03 -5.570557187033830e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.350000000000000e+02 -1.192201054574346e+06 -4.966581122937768e+06 4.592238022518519e+06 -2.832955177802863e+03 -4.485541204627742e+03 -5.570670359371053e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.360000000000000e+02 -1.192257713787185e+06 -4.966670832963039e+06 4.592126607371187e+06 -2.832939125045031e+03 -4.485411392727632e+03 -5.570783530913622e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.370000000000000e+02 -1.192314372702892e+06 -4.966760540436264e+06 4.592015189906411e+06 -2.832923070667751e+03 -4.485281575135911e+03 -5.570896702554915e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.380000000000000e+02 -1.192371031310210e+06 -4.966850245336680e+06 4.591903770149563e+06 -2.832907013679409e+03 -4.485151753632621e+03 -5.571009873273438e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.390000000000000e+02 -1.192427689542185e+06 -4.966939947540548e+06 4.591792348251864e+06 -2.832890956389175e+03 -4.485021939030776e+03 -5.571123033171106e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.400000000000000e+02 -1.192484347476925e+06 -4.967029647192238e+06 4.591680924036879e+06 -2.832874897630216e+03 -4.484892118388840e+03 -5.571236193386537e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.410000000000000e+02 -1.192541005069750e+06 -4.967119344209211e+06 4.591569497605494e+06 -2.832858837325472e+03 -4.484762299256955e+03 -5.571349347757988e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.420000000000000e+02 -1.192597662365103e+06 -4.967209038673662e+06 4.591458068857251e+06 -2.832842774094901e+03 -4.484632474733791e+03 -5.571462502560673e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.430000000000000e+02 -1.192654319351970e+06 -4.967298730565204e+06 4.591346637817048e+06 -2.832826709491727e+03 -4.484502645731523e+03 -5.571575656356981e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.440000000000000e+02 -1.192710976007959e+06 -4.967388419842497e+06 4.591235204535441e+06 -2.832810643103478e+03 -4.484372816767994e+03 -5.571688805622844e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.450000000000000e+02 -1.192767632332953e+06 -4.967478106505360e+06 4.591123769012650e+06 -2.832794574923185e+03 -4.484242987553228e+03 -5.571801950599508e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.460000000000000e+02 -1.192824288338218e+06 -4.967567790574599e+06 4.591012331223235e+06 -2.832778505919911e+03 -4.484113155692581e+03 -5.571915092822054e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.470000000000000e+02 -1.192880944034694e+06 -4.967657472070507e+06 4.590900891142400e+06 -2.832762433750108e+03 -4.483983320272836e+03 -5.572028234078685e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.480000000000000e+02 -1.192937599433642e+06 -4.967747151013881e+06 4.590789448744708e+06 -2.832746359878689e+03 -4.483853478972089e+03 -5.572141375624351e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.490000000000000e+02 -1.192994254468124e+06 -4.967836827281024e+06 4.590678004181401e+06 -2.832730285537595e+03 -4.483723642601006e+03 -5.572254508044847e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.500000000000000e+02 -1.193050909238261e+06 -4.967926501057046e+06 4.590566557226146e+06 -2.832714206856594e+03 -4.483593795471827e+03 -5.572367645924354e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.510000000000000e+02 -1.193107563632802e+06 -4.968016172136299e+06 4.590455108130411e+06 -2.832698129453857e+03 -4.483463954882560e+03 -5.572480772583524e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.520000000000000e+02 -1.193164217729597e+06 -4.968105840662717e+06 4.590343656718188e+06 -2.832682048885656e+03 -4.483334108440981e+03 -5.572593900156881e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.530000000000000e+02 -1.193220871517386e+06 -4.968195506615532e+06 4.590232203014874e+06 -2.832665965609068e+03 -4.483204258490821e+03 -5.572707026519211e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.540000000000000e+02 -1.193277524962892e+06 -4.968285169933210e+06 4.590120747095722e+06 -2.832649882715756e+03 -4.483074409485763e+03 -5.572820146647507e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.550000000000000e+02 -1.193334178077130e+06 -4.968374830636170e+06 4.590009288935777e+06 -2.832633797552604e+03 -4.482944560407060e+03 -5.572933262553670e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.560000000000000e+02 -1.193390830915671e+06 -4.968464488827149e+06 4.589897828409368e+06 -2.832617708695573e+03 -4.482814702001085e+03 -5.573046382457025e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.570000000000000e+02 -1.193447483422954e+06 -4.968554144403446e+06 4.589786365642115e+06 -2.832601619373866e+03 -4.482684843037093e+03 -5.573159497734963e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.580000000000000e+02 -1.193504135598786e+06 -4.968643797364764e+06 4.589674900634391e+06 -2.832585527873580e+03 -4.482554984039341e+03 -5.573272608717546e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.590000000000000e+02 -1.193560787454426e+06 -4.968733447731895e+06 4.589563433360755e+06 -2.832569435357809e+03 -4.482425122577517e+03 -5.573385716882040e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.600000000000000e+02 -1.193617438967489e+06 -4.968823095463511e+06 4.589451963871776e+06 -2.832553341625110e+03 -4.482295262690120e+03 -5.573498819006828e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.610000000000000e+02 -1.193674090193541e+06 -4.968912740662343e+06 4.589340492041781e+06 -2.832537244407338e+03 -4.482165395434683e+03 -5.573611923428578e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.620000000000000e+02 -1.193730741088157e+06 -4.969002383246279e+06 4.589229017971217e+06 -2.832521146546066e+03 -4.482035527504810e+03 -5.573725023400162e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.630000000000000e+02 -1.193787391662363e+06 -4.969092023235733e+06 4.589117541635117e+06 -2.832505046692121e+03 -4.481905657509191e+03 -5.573838120660193e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.640000000000000e+02 -1.193844041927175e+06 -4.969181660651103e+06 4.589006063008519e+06 -2.832488943999188e+03 -4.481775783870496e+03 -5.573951216876624e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.650000000000000e+02 -1.193900691849315e+06 -4.969271295430876e+06 4.588894582166699e+06 -2.832472841545429e+03 -4.481645911268421e+03 -5.574064306849519e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.660000000000000e+02 -1.193957341473209e+06 -4.969360927657190e+06 4.588783099009144e+06 -2.832456735865773e+03 -4.481516033092517e+03 -5.574177397532713e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.670000000000000e+02 -1.194013990765331e+06 -4.969450557268139e+06 4.588671613611620e+06 -2.832440628311527e+03 -4.481386154771479e+03 -5.574290483877836e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.680000000000000e+02 -1.194070639736946e+06 -4.969540184284517e+06 4.588560125948674e+06 -2.832424520070049e+03 -4.481256273902262e+03 -5.574403567328338e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.690000000000000e+02 -1.194127288387937e+06 -4.969629808706149e+06 4.588448636020519e+06 -2.832408409526511e+03 -4.481126390935542e+03 -5.574516648230404e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.700000000000000e+02 -1.194183936718187e+06 -4.969719430532866e+06 4.588337143827378e+06 -2.832392296743628e+03 -4.480996506324699e+03 -5.574629726184723e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.710000000000000e+02 -1.194240584716687e+06 -4.969809049744310e+06 4.588225649394165e+06 -2.832376183447659e+03 -4.480866620809060e+03 -5.574742799820687e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.720000000000000e+02 -1.194297232405511e+06 -4.969898666381324e+06 4.588114152670885e+06 -2.832360067220346e+03 -4.480736731648170e+03 -5.574855872455326e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.730000000000000e+02 -1.194353879762519e+06 -4.969988280402975e+06 4.588002653707646e+06 -2.832343950621813e+03 -4.480606841786715e+03 -5.574968940541538e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.740000000000000e+02 -1.194410526843264e+06 -4.970077891911963e+06 4.587891152378735e+06 -2.832327829886046e+03 -4.480476943016462e+03 -5.575082012472863e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.750000000000000e+02 -1.194467173547414e+06 -4.970167500722952e+06 4.587779648911035e+06 -2.832311709040235e+03 -4.480347051049705e+03 -5.575195073592115e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.760000000000000e+02 -1.194523819964181e+06 -4.970257107000739e+06 4.587668143102792e+06 -2.832295586313148e+03 -4.480217151084222e+03 -5.575308136811115e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.770000000000000e+02 -1.194580466037771e+06 -4.970346710642298e+06 4.587556635080157e+06 -2.832279462027178e+03 -4.480087252931987e+03 -5.575421193948729e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.780000000000000e+02 -1.194637111812606e+06 -4.970436311729737e+06 4.587445124742592e+06 -2.832263334620004e+03 -4.479957349167289e+03 -5.575534251780093e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.790000000000000e+02 -1.194693757255411e+06 -4.970525910201557e+06 4.587333612165399e+06 -2.832247206989733e+03 -4.479827444647837e+03 -5.575647305042115e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.800000000000000e+02 -1.194750402388337e+06 -4.970615506098728e+06 4.587222097298411e+06 -2.832231076558416e+03 -4.479697536434939e+03 -5.575760357283840e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.810000000000000e+02 -1.194807047177863e+06 -4.970705099359369e+06 4.587110580217417e+06 -2.832214944755815e+03 -4.479567629856808e+03 -5.575873403507914e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.820000000000000e+02 -1.194863691646386e+06 -4.970794690024840e+06 4.586999060871769e+06 -2.832198812120036e+03 -4.479437720748836e+03 -5.575986446887141e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.830000000000000e+02 -1.194920335804847e+06 -4.970884278115398e+06 4.586887539236651e+06 -2.832182676465116e+03 -4.479307807808530e+03 -5.576099489456348e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.840000000000000e+02 -1.194976979664498e+06 -4.970973863651830e+06 4.586776015286610e+06 -2.832166538956822e+03 -4.479177889226293e+03 -5.576212532180844e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.850000000000000e+02 -1.195033623169561e+06 -4.971063446531123e+06 4.586664489147810e+06 -2.832150400746743e+03 -4.479047973703023e+03 -5.576325567425440e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.860000000000000e+02 -1.195090266364448e+06 -4.971153026835380e+06 4.586552960719702e+06 -2.832134259548620e+03 -4.478918054555903e+03 -5.576438601675291e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.870000000000000e+02 -1.195146909238158e+06 -4.971242604544245e+06 4.586441430027218e+06 -2.832118117678859e+03 -4.478788132892778e+03 -5.576551632997259e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.880000000000000e+02 -1.195203551779439e+06 -4.971332179636982e+06 4.586329897095759e+06 -2.832101974138831e+03 -4.478658211047827e+03 -5.576664659922516e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.890000000000000e+02 -1.195260194021573e+06 -4.971421752175113e+06 4.586218361849966e+06 -2.832085827243856e+03 -4.478528283640059e+03 -5.576777687602713e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.900000000000000e+02 -1.195316835931289e+06 -4.971511322097157e+06 4.586106824365148e+06 -2.832069680171095e+03 -4.478398355461970e+03 -5.576890710707085e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.910000000000000e+02 -1.195373477497334e+06 -4.971600889382386e+06 4.585995284666719e+06 -2.832053531517447e+03 -4.478268429070834e+03 -5.577003727763722e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.920000000000000e+02 -1.195430118764130e+06 -4.971690454112876e+06 4.585883742654115e+06 -2.832037379943932e+03 -4.478138496919414e+03 -5.577116745543990e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.930000000000000e+02 -1.195486759709533e+06 -4.971780016247715e+06 4.585772198377462e+06 -2.832021227479374e+03 -4.478008562443484e+03 -5.577229760336784e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.940000000000000e+02 -1.195543400344562e+06 -4.971869575807290e+06 4.585660651811775e+06 -2.832005072425618e+03 -4.477878624086255e+03 -5.577342774168238e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.950000000000000e+02 -1.195600040669100e+06 -4.971959132791433e+06 4.585549102957269e+06 -2.831988914559586e+03 -4.477748682150289e+03 -5.577455786889248e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.960000000000000e+02 -1.195656680638738e+06 -4.972048687118113e+06 4.585437551914465e+06 -2.831972757177445e+03 -4.477618742763433e+03 -5.577568792025101e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.970000000000000e+02 -1.195713320286685e+06 -4.972138238848713e+06 4.585325998608147e+06 -2.831956597253673e+03 -4.477488801773055e+03 -5.577681794314361e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.980000000000000e+02 -1.195769959624193e+06 -4.972227788004011e+06 4.585214443012858e+06 -2.831940435901017e+03 -4.477358856582357e+03 -5.577794795389504e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>7.990000000000000e+02 -1.195826598651151e+06 -4.972317334583830e+06 4.585102885128805e+06 -2.831924271947571e+03 -4.477228907514786e+03 -5.577907795504430e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.000000000000000e+02 -1.195883237345172e+06 -4.972406878546878e+06 4.584991325006602e+06 -2.831908106098477e+03 -4.477098958240183e+03 -5.578020791343844e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.010000000000000e+02 -1.195939875717522e+06 -4.972496419913931e+06 4.584879762620789e+06 -2.831891939653796e+03 -4.476969006532398e+03 -5.578133784153961e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.020000000000000e+02 -1.195996513745816e+06 -4.972585958643706e+06 4.584768198021976e+06 -2.831875771636827e+03 -4.476839056500075e+03 -5.578246771005504e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.030000000000000e+02 -1.196053151496731e+06 -4.972675494859369e+06 4.584656631059177e+06 -2.831859599638956e+03 -4.476709097168979e+03 -5.578359761943640e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.040000000000000e+02 -1.196109788881336e+06 -4.972765028396678e+06 4.584545061933731e+06 -2.831843428662674e+03 -4.476579142558302e+03 -5.578472743283953e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.050000000000000e+02 -1.196166425999706e+06 -4.972854559440474e+06 4.584433490419045e+06 -2.831827253258851e+03 -4.476449177104859e+03 -5.578585730171028e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.060000000000000e+02 -1.196223062740403e+06 -4.972944087785022e+06 4.584321916767349e+06 -2.831811077752956e+03 -4.476319218460188e+03 -5.578698706249754e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.070000000000000e+02 -1.196279699192605e+06 -4.973033613594980e+06 4.584210340776762e+06 -2.831794900048782e+03 -4.476189252115694e+03 -5.578811684316922e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.080000000000000e+02 -1.196336335311595e+06 -4.973123136787830e+06 4.584098762548467e+06 -2.831778720288800e+03 -4.476059285697593e+03 -5.578924658070936e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.090000000000000e+02 -1.196392971097491e+06 -4.973212657363789e+06 4.583987182082202e+06 -2.831762539827600e+03 -4.475929318668168e+03 -5.579037627352336e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.100000000000000e+02 -1.196449606583582e+06 -4.973302175384344e+06 4.583875599302566e+06 -2.831746356572789e+03 -4.475799345904607e+03 -5.579150597277155e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.110000000000000e+02 -1.196506241736351e+06 -4.973391690787660e+06 4.583764014285388e+06 -2.831730171328343e+03 -4.475669373189983e+03 -5.579263562759545e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.120000000000000e+02 -1.196562876567054e+06 -4.973481203594508e+06 4.583652427005203e+06 -2.831713985344990e+03 -4.475539397765919e+03 -5.579376525502060e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.130000000000000e+02 -1.196619511075579e+06 -4.973570713804713e+06 4.583540837462217e+06 -2.831697797070093e+03 -4.475409420500119e+03 -5.579489485482170e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.140000000000000e+02 -1.196676145272937e+06 -4.973660221438658e+06 4.583429245631448e+06 -2.831681606092501e+03 -4.475279439469099e+03 -5.579602444454697e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.150000000000000e+02 -1.196732779103602e+06 -4.973749726393803e+06 4.583317651638656e+06 -2.831665416097846e+03 -4.475149462992021e+03 -5.579715393986156e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.160000000000000e+02 -1.196789412656508e+06 -4.973839228834378e+06 4.583206055282407e+06 -2.831649222187447e+03 -4.475019477374125e+03 -5.579828347442379e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.170000000000000e+02 -1.196846045898138e+06 -4.973928728698560e+06 4.583094456638533e+06 -2.831633025439332e+03 -4.474889488260987e+03 -5.579941299729648e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.180000000000000e+02 -1.196902678772971e+06 -4.974018225883820e+06 4.582982855832808e+06 -2.831616829664339e+03 -4.474759503632669e+03 -5.580054242637455e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.190000000000000e+02 -1.196959311325414e+06 -4.974107720472183e+06 4.582871252764613e+06 -2.831600631751227e+03 -4.474629516776406e+03 -5.580167183031062e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.200000000000000e+02 -1.197015943610998e+06 -4.974197212566207e+06 4.582759647308125e+06 -2.831584429278199e+03 -4.474499519418016e+03 -5.580280128745911e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.210000000000000e+02 -1.197072575540810e+06 -4.974286702001737e+06 4.582648039664746e+06 -2.831568227395378e+03 -4.474369524757249e+03 -5.580393066712381e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.220000000000000e+02 -1.197129207159176e+06 -4.974376188860655e+06 4.582536429734015e+06 -2.831552022406670e+03 -4.474239526627294e+03 -5.580506003607064e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.230000000000000e+02 -1.197185838443957e+06 -4.974465673102083e+06 4.582424817566082e+06 -2.831535816906799e+03 -4.474109527523739e+03 -5.580618936242077e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.240000000000000e+02 -1.197242469395038e+06 -4.974555154725849e+06 4.582313203161168e+06 -2.831519609599047e+03 -4.473979528549980e+03 -5.580731864289402e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.250000000000000e+02 -1.197299100023436e+06 -4.974644633752334e+06 4.582201586494276e+06 -2.831503400165733e+03 -4.473849527380830e+03 -5.580844789790187e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.260000000000000e+02 -1.197355730340405e+06 -4.974734110202286e+06 4.582089967539930e+06 -2.831487189379915e+03 -4.473719521947240e+03 -5.580957714093379e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.270000000000000e+02 -1.197412360356960e+06 -4.974823584096084e+06 4.581978346273127e+06 -2.831470975600319e+03 -4.473589511036673e+03 -5.581070638915631e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.280000000000000e+02 -1.197468990006203e+06 -4.974913055310296e+06 4.581866722845365e+06 -2.831454761187219e+03 -4.473459505464424e+03 -5.581183554374575e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.290000000000000e+02 -1.197525619355042e+06 -4.975002523968391e+06 4.581755097105094e+06 -2.831438545147369e+03 -4.473329493469458e+03 -5.581296470520757e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.300000000000000e+02 -1.197582248392230e+06 -4.975091990049653e+06 4.581643469077744e+06 -2.831422326419899e+03 -4.473199477960758e+03 -5.581409385445994e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.310000000000000e+02 -1.197638877084261e+06 -4.975181453492290e+06 4.581531838839177e+06 -2.831406106345656e+03 -4.473069464048606e+03 -5.581522294381699e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.320000000000000e+02 -1.197695505453520e+06 -4.975270914337598e+06 4.581420206338692e+06 -2.831389885369461e+03 -4.472939447562026e+03 -5.581635200539326e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.330000000000000e+02 -1.197752133510945e+06 -4.975360372605816e+06 4.581308571551454e+06 -2.831373661402753e+03 -4.472809427527359e+03 -5.581748105638005e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.340000000000000e+02 -1.197808761267783e+06 -4.975449828317692e+06 4.581196934451975e+06 -2.831357435611624e+03 -4.472679401399629e+03 -5.581861011240906e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.350000000000000e+02 -1.197865388679408e+06 -4.975539281390899e+06 4.581085295141338e+06 -2.831341208597335e+03 -4.472549376786358e+03 -5.581973910867112e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.360000000000000e+02 -1.197922015745697e+06 -4.975628731825273e+06 4.580973653619763e+06 -2.831324979957078e+03 -4.472419354093826e+03 -5.582086804363325e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.370000000000000e+02 -1.197978642522428e+06 -4.975718179723715e+06 4.580862009760893e+06 -2.831308749406481e+03 -4.472289323226652e+03 -5.582199700101884e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.380000000000000e+02 -1.198035268964968e+06 -4.975807625003905e+06 4.580750363665812e+06 -2.831292517029972e+03 -4.472159292314049e+03 -5.582312591404961e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.390000000000000e+02 -1.198091895106584e+06 -4.975897067727273e+06 4.580638715259084e+06 -2.831276281525874e+03 -4.472029255827311e+03 -5.582425483363900e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t\t<EPHEMLIST>8.400000000000000e+02 -1.198148520891759e+06 -4.975986507791362e+06 4.580527064666537e+06 -2.831260046398957e+03 -4.471899222303998e+03 -5.582538367455914e+03 1.915449731000000e-03 7.245452763200000e-04 1.164219678600000e-03 2.419812692600000e-03 1.864248754500000e-03 3.302028863200000e-03</EPHEMLIST>\n\t\t</EPHEMLISTList>\n\t</EPH>\n\t<ATT>\n\t\t<SATID>Imaginary1</SATID>\n\t\t<GENERATIONTIME>1959-11-30T00:18:13.000000Z</GENERATIONTIME>\n\t\t<STARTTIME>1959-11-25T17:39:40.987511Z</STARTTIME>\n\t\t<NUMPOINTS>840</NUMPOINTS>\n\t\t<TIMEINTERVAL>2.000000000000000e-02</TIMEINTERVAL>\n\t\t<ATTLISTList>\n\t\t\t<ATTLIST>1.000000000000000e+00 6.795012901179663e-01 -7.039793799103053e-01 -2.023917199358860e-01 -4.157668926833060e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.000000000000000e+00 6.795031921696149e-01 -7.039852730262131e-01 -2.023634939866958e-01 -4.158321169664750e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.000000000000000e+00 6.795050940076900e-01 -7.039911671585269e-01 -2.023352617254185e-01 -4.158973001693780e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.000000000000000e+00 6.795069956282339e-01 -7.039970623085654e-01 -2.023070231575671e-01 -4.159624423340190e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.000000000000000e+00 6.795088970622606e-01 -7.040029584543205e-01 -2.022787782519255e-01 -4.160275435235960e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.000000000000000e+00 6.795107983244882e-01 -7.040088555841620e-01 -2.022505269954615e-01 -4.160926038219470e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.000000000000000e+00 6.795126993442279e-01 -7.040147537480659e-01 -2.022222694541582e-01 -4.161576229965050e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.000000000000000e+00 6.795146002014344e-01 -7.040206528897818e-01 -2.021940055491108e-01 -4.162226012287550e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>9.000000000000000e+00 6.795165008206093e-01 -7.040265530611999e-01 -2.021657353543056e-01 -4.162875383594130e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.000000000000000e+01 6.795184012613739e-01 -7.040324542188404e-01 -2.021374588139688e-01 -4.163524346048480e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.100000000000000e+01 6.795203015174702e-01 -7.040383563686955e-01 -2.021091759287698e-01 -4.164172898266690e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.200000000000000e+01 6.795222015273501e-01 -7.040442595509356e-01 -2.020808867636002e-01 -4.164821040134950e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.300000000000000e+01 6.795241013689588e-01 -7.040501637119229e-01 -2.020525912387455e-01 -4.165468772698050e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.400000000000000e+01 6.795260010190228e-01 -7.040560688668507e-01 -2.020242893776136e-01 -4.166116095744060e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.500000000000000e+01 6.795279004301762e-01 -7.040619750503345e-01 -2.019959812213390e-01 -4.166763006948090e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.600000000000000e+01 6.795297996610842e-01 -7.040678822172045e-01 -2.019676667204161e-01 -4.167409509825730e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.700000000000000e+01 6.795316987072143e-01 -7.040737903710086e-01 -2.019393458766498e-01 -4.168055603755300e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.800000000000000e+01 6.795335975150002e-01 -7.040796995524565e-01 -2.019110187332267e-01 -4.168701285238810e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.900000000000000e+01 6.795354961360811e-01 -7.040856097198989e-01 -2.018826852506496e-01 -4.169346558437880e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.000000000000000e+01 6.795373945807668e-01 -7.040915208672780e-01 -2.018543454144770e-01 -4.169991422628810e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.100000000000000e+01 6.795392927722119e-01 -7.040974330490690e-01 -2.018259992963614e-01 -4.170635875234390e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.200000000000000e+01 6.795411908128990e-01 -7.041033461910222e-01 -2.017976468003938e-01 -4.171279919900170e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.300000000000000e+01 6.795430886004499e-01 -7.041092603677667e-01 -2.017692880179178e-01 -4.171923552104290e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.400000000000000e+01 6.795449862043442e-01 -7.041151755254639e-01 -2.017409228913374e-01 -4.172566776259380e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.500000000000000e+01 6.795468836354301e-01 -7.041210916568698e-01 -2.017125514075215e-01 -4.173209592126210e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.600000000000000e+01 6.795487808108983e-01 -7.041270088231787e-01 -2.016841736381700e-01 -4.173851995499380e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.700000000000000e+01 6.795506778088990e-01 -7.041329269658226e-01 -2.016557895141527e-01 -4.174493990213870e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.800000000000000e+01 6.795525746226287e-01 -7.041388460888128e-01 -2.016273990420547e-01 -4.175135576251040e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.900000000000000e+01 6.795544711875586e-01 -7.041447662384701e-01 -2.015990022805154e-01 -4.175776751059130e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.000000000000000e+01 6.795563675697758e-01 -7.041506873681586e-01 -2.015705991641825e-01 -4.176417516142380e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.100000000000000e+01 6.795582637705441e-01 -7.041566094724618e-01 -2.015421897003983e-01 -4.177057873886140e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.200000000000000e+01 6.795601597194840e-01 -7.041625326055196e-01 -2.015137739450329e-01 -4.177697819421850e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.300000000000000e+01 6.795620555097833e-01 -7.041684566994181e-01 -2.014853518115018e-01 -4.178337356262010e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.400000000000000e+01 6.795639510474406e-01 -7.041743818175766e-01 -2.014569233952892e-01 -4.178976483219710e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.500000000000000e+01 6.795658464051249e-01 -7.041803079097471e-01 -2.014284886223090e-01 -4.179615201370400e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.600000000000000e+01 6.795677415806715e-01 -7.041862349773556e-01 -2.014000474931086e-01 -4.180253510417940e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.700000000000000e+01 6.795696364968842e-01 -7.041921630755553e-01 -2.013716000788236e-01 -4.180891407532190e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.800000000000000e+01 6.795715312385208e-01 -7.041980921417377e-01 -2.013431463024344e-01 -4.181528896355330e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.900000000000000e+01 6.795734257882386e-01 -7.042040221875822e-01 -2.013146861801534e-01 -4.182165976446780e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.000000000000000e+01 6.795753200928879e-01 -7.042099532511444e-01 -2.012862197602649e-01 -4.182802645705700e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.100000000000000e+01 6.795772142114155e-01 -7.042158852897767e-01 -2.012577469866033e-01 -4.183438906049140e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.200000000000000e+01 6.795791081393254e-01 -7.042218183066008e-01 -2.012292678618453e-01 -4.184074757087550e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.300000000000000e+01 6.795810018215931e-01 -7.042277523386692e-01 -2.012007824414075e-01 -4.184710198032180e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.400000000000000e+01 6.795828953184365e-01 -7.042336873443790e-01 -2.011722906634436e-01 -4.185345229695360e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.500000000000000e+01 6.795847886270806e-01 -7.042396233240191e-01 -2.011437925326658e-01 -4.185979852681810e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.600000000000000e+01 6.795866816859607e-01 -7.042455603201958e-01 -2.011152881086695e-01 -4.186614065477190e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.700000000000000e+01 6.795885745799152e-01 -7.042514982738010e-01 -2.010867773061127e-01 -4.187247869648390e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.800000000000000e+01 6.795904672174917e-01 -7.042574372480126e-01 -2.010582602146097e-01 -4.187881263177330e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.900000000000000e+01 6.795923596757100e-01 -7.042633771889883e-01 -2.010297367569464e-01 -4.188514247551360e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.000000000000000e+01 6.795942519378680e-01 -7.042693181059694e-01 -2.010012069532644e-01 -4.189146823511180e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.100000000000000e+01 6.795961439552599e-01 -7.042752600345781e-01 -2.009726708460155e-01 -4.189778988667740e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.200000000000000e+01 6.795980357844214e-01 -7.042812029327177e-01 -2.009441283839045e-01 -4.190410745539760e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.300000000000000e+01 6.795999274203595e-01 -7.042871468046601e-01 -2.009155795682612e-01 -4.191042093254690e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.400000000000000e+01 6.796018188080356e-01 -7.042930916886662e-01 -2.008870244518403e-01 -4.191673030325510e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.500000000000000e+01 6.796037100041895e-01 -7.042990375436710e-01 -2.008584629804457e-01 -4.192303558586010e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.600000000000000e+01 6.796056010159021e-01 -7.043049843631807e-01 -2.008298951488766e-01 -4.192933678804790e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.700000000000000e+01 6.796074917731262e-01 -7.043109321979667e-01 -2.008013210200126e-01 -4.193563387966340e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.800000000000000e+01 6.796093823611057e-01 -7.043168809854401e-01 -2.007727405152986e-01 -4.194192689510570e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.900000000000000e+01 6.796112726996719e-01 -7.043228307833497e-01 -2.007441537077760e-01 -4.194821580246480e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.000000000000000e+01 6.796131628397541e-01 -7.043287815536684e-01 -2.007155605512496e-01 -4.195450062470620e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.100000000000000e+01 6.796150527998679e-01 -7.043347332831532e-01 -2.006869610264543e-01 -4.196078136485220e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.200000000000000e+01 6.796169424965223e-01 -7.043406860315834e-01 -2.006583552103851e-01 -4.196705799195700e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.300000000000000e+01 6.796188320142774e-01 -7.043466397368305e-01 -2.006297430251785e-01 -4.197333054018500e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.400000000000000e+01 6.796207213316237e-01 -7.043525944136150e-01 -2.006011244908768e-01 -4.197959900343160e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.500000000000000e+01 6.796226104022928e-01 -7.043585500965851e-01 -2.005724996459374e-01 -4.198586335411420e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.600000000000000e+01 6.796244992744610e-01 -7.043645067481321e-01 -2.005438684502678e-01 -4.199212362336900e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.700000000000000e+01 6.796263879612657e-01 -7.043704643589256e-01 -2.005152308895167e-01 -4.199837981206470e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.800000000000000e+01 6.796282763888346e-01 -7.043764229821449e-01 -2.004865870310055e-01 -4.200463189077510e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.900000000000000e+01 6.796301646299087e-01 -7.043823825638621e-01 -2.004579368085549e-01 -4.201087989126120e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.000000000000000e+01 6.796320526743754e-01 -7.043883431120742e-01 -2.004292802281825e-01 -4.201712380273550e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.100000000000000e+01 6.796339404640521e-01 -7.043943046673543e-01 -2.004006173455687e-01 -4.202336360900710e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.200000000000000e+01 6.796358280863000e-01 -7.044002671655367e-01 -2.003719480801510e-01 -4.202959934540350e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.300000000000000e+01 6.796377154506369e-01 -7.044062306726971e-01 -2.003432725126685e-01 -4.203583097116940e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.400000000000000e+01 6.796396026170802e-01 -7.044121951441673e-01 -2.003145905885660e-01 -4.204205851297100e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.500000000000000e+01 6.796414895980506e-01 -7.044181605699508e-01 -2.002859022968422e-01 -4.204828197833920e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.600000000000000e+01 6.796433763167853e-01 -7.044241270061340e-01 -2.002572077056954e-01 -4.205450133201960e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.700000000000000e+01 6.796452628469613e-01 -7.044300943980907e-01 -2.002285067480556e-01 -4.206071660618740e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.800000000000000e+01 6.796471491794277e-01 -7.044360627519347e-01 -2.001997994317655e-01 -4.206692779737960e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.900000000000000e+01 6.796490352585286e-01 -7.044420321083782e-01 -2.001710858057136e-01 -4.207313487882250e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.000000000000000e+01 6.796509211421690e-01 -7.044480024227050e-01 -2.001423658208579e-01 -4.207933788561480e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.100000000000000e+01 6.796528068342278e-01 -7.044539736935043e-01 -2.001136394686103e-01 -4.208553680796570e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.200000000000000e+01 6.796546922590817e-01 -7.044599459736781e-01 -2.000849068215534e-01 -4.209173162493760e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.300000000000000e+01 6.796565775227883e-01 -7.044659191869860e-01 -2.000561677783481e-01 -4.209792237019010e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.400000000000000e+01 6.796584625182990e-01 -7.044718934092341e-01 -2.000274224403609e-01 -4.210410901012060e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.500000000000000e+01 6.796603473237741e-01 -7.044778685840885e-01 -1.999986707327806e-01 -4.211029156948910e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.600000000000000e+01 6.796622319377462e-01 -7.044838447124563e-01 -1.999699126555146e-01 -4.211647004561090e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.700000000000000e+01 6.796641162823588e-01 -7.044898218484826e-01 -1.999411482841119e-01 -4.212264441894000e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.800000000000000e+01 6.796660004402233e-01 -7.044957999329756e-01 -1.999123775387696e-01 -4.212881471373130e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.900000000000000e+01 6.796678843935604e-01 -7.045017789771568e-01 -1.998836004379378e-01 -4.213498092998230e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>9.000000000000000e+01 6.796697681018203e-01 -7.045077590123142e-01 -1.998548170131007e-01 -4.214114303771320e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>9.100000000000000e+01 6.796716515954266e-01 -7.045137400133533e-01 -1.998260272412535e-01 -4.214730106329730e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>9.200000000000000e+01 6.796735349070104e-01 -7.045197219563238e-01 -1.997972310910624e-01 -4.215345501780120e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>9.300000000000000e+01 6.796754179552619e-01 -7.045257049010482e-01 -1.997684286340649e-01 -4.215960486174000e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>9.400000000000000e+01 6.796773008000128e-01 -7.045316888017777e-01 -1.997396198185027e-01 -4.216575062872800e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>9.500000000000000e+01 6.796791834556047e-01 -7.045376736482865e-01 -1.997108046288966e-01 -4.217189232014360e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>9.600000000000000e+01 6.796810658444614e-01 -7.045436594972865e-01 -1.996819831342765e-01 -4.217802990030720e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>9.700000000000000e+01 6.796829480627019e-01 -7.045496462769856e-01 -1.996531552486250e-01 -4.218416341516560e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>9.800000000000000e+01 6.796848300095097e-01 -7.045556340610444e-01 -1.996243210622798e-01 -4.219029281964820e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>9.900000000000000e+01 6.796867117714123e-01 -7.045616227842402e-01 -1.995954804989941e-01 -4.219641815816980e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.000000000000000e+02 6.796885933255380e-01 -7.045676124646588e-01 -1.995666335746971e-01 -4.220253941013960e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.010000000000000e+02 6.796904746220614e-01 -7.045736031379983e-01 -1.995377803348005e-01 -4.220865655569230e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.020000000000000e+02 6.796923557182968e-01 -7.045795947603323e-01 -1.995089207298232e-01 -4.221476962745790e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.030000000000000e+02 6.796942366154390e-01 -7.045855873298367e-01 -1.994800547590306e-01 -4.222087862845600e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.040000000000000e+02 6.796961172538162e-01 -7.045915808937199e-01 -1.994511824669762e-01 -4.222698350936580e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.050000000000000e+02 6.796979976852925e-01 -7.045975754080924e-01 -1.994223038181599e-01 -4.223308432377840e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.060000000000000e+02 6.796998779255191e-01 -7.046035708629457e-01 -1.993934187931938e-01 -4.223918106666610e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.070000000000000e+02 6.797017578961645e-01 -7.046095673167410e-01 -1.993645274591496e-01 -4.224527369504360e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.080000000000000e+02 6.797036376917659e-01 -7.046155646976316e-01 -1.993356297340957e-01 -4.225136226123380e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.090000000000000e+02 6.797055172182811e-01 -7.046215630731820e-01 -1.993067257049162e-01 -4.225744672978040e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.100000000000000e+02 6.797073965522089e-01 -7.046275623893914e-01 -1.992778152955133e-01 -4.226352711795160e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.110000000000000e+02 6.797092756839871e-01 -7.046335626522799e-01 -1.992488985150173e-01 -4.226960342441640e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.120000000000000e+02 6.797111545451996e-01 -7.046395639095456e-01 -1.992199754295197e-01 -4.227567563101480e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.130000000000000e+02 6.797130332134302e-01 -7.046455661048171e-01 -1.991910459655104e-01 -4.228174376472930e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.140000000000000e+02 6.797149116732815e-01 -7.046515692483717e-01 -1.991621101374741e-01 -4.228780782186530e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.150000000000000e+02 6.797167898714911e-01 -7.046575733784293e-01 -1.991331679940133e-01 -4.229386778112310e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.160000000000000e+02 6.797186678692761e-01 -7.046635784513378e-01 -1.991042194748240e-01 -4.229992365824300e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.170000000000000e+02 6.797205456600242e-01 -7.046695844701800e-01 -1.990752645881302e-01 -4.230597545771560e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.180000000000000e+02 6.797224231929014e-01 -7.046755914710134e-01 -1.990463033812120e-01 -4.231202316153090e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.190000000000000e+02 6.797243005156455e-01 -7.046815994188381e-01 -1.990173358088236e-01 -4.231806678692700e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.200000000000000e+02 6.797261776449124e-01 -7.046876083013288e-01 -1.989883618542364e-01 -4.232410633855860e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.210000000000000e+02 6.797280544946541e-01 -7.046936181790645e-01 -1.989593815997579e-01 -4.233014179108430e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.220000000000000e+02 6.797299311798736e-01 -7.046996289703368e-01 -1.989303949329057e-01 -4.233617317510400e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.230000000000000e+02 6.797318075843050e-01 -7.047056407566004e-01 -1.989014019664283e-01 -4.234220045996710e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.240000000000000e+02 6.797336837877276e-01 -7.047116534806431e-01 -1.988724026229552e-01 -4.234822366896840e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.250000000000000e+02 6.797355597921615e-01 -7.047176671404248e-01 -1.988433969000887e-01 -4.235424280315040e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.260000000000000e+02 6.797374355242299e-01 -7.047236817876797e-01 -1.988143848676253e-01 -4.236025783996730e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.270000000000000e+02 6.797393110583803e-01 -7.047296973694713e-01 -1.987853664521773e-01 -4.236626879825200e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.280000000000000e+02 6.797411863821243e-01 -7.047357138916002e-01 -1.987563416709577e-01 -4.237227568937300e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.290000000000000e+02 6.797430614399738e-01 -7.047417313962825e-01 -1.987273105692628e-01 -4.237827847718480e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.300000000000000e+02 6.797449362940748e-01 -7.047477498368057e-01 -1.986982730912777e-01 -4.238427719175490e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.310000000000000e+02 6.797468109439584e-01 -7.047537692133381e-01 -1.986692292359904e-01 -4.239027183080040e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.320000000000000e+02 6.797486853211984e-01 -7.047597895736176e-01 -1.986401790695730e-01 -4.239626237607330e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.330000000000000e+02 6.797505595173958e-01 -7.047658108521972e-01 -1.986111225027640e-01 -4.240224885338540e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.340000000000000e+02 6.797524334436709e-01 -7.047718331129262e-01 -1.985820596178356e-01 -4.240823122922970e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.350000000000000e+02 6.797543071639158e-01 -7.047778563082016e-01 -1.985529903564512e-01 -4.241420953208690e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.360000000000000e+02 6.797561806809566e-01 -7.047838804346076e-01 -1.985239147172657e-01 -4.242018376796050e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.370000000000000e+02 6.797580539211397e-01 -7.047899055464529e-01 -1.984948327649853e-01 -4.242615390024520e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.380000000000000e+02 6.797599269624665e-01 -7.047959315858279e-01 -1.984657444282991e-01 -4.243211996316710e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.390000000000000e+02 6.797617997916312e-01 -7.048019585618789e-01 -1.984366497188867e-01 -4.243808195154290e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.400000000000000e+02 6.797636723557344e-01 -7.048079865133727e-01 -1.984075486832945e-01 -4.244403983950480e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.410000000000000e+02 6.797655447081312e-01 -7.048140153988206e-01 -1.983784412764372e-01 -4.244999366054020e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.420000000000000e+02 6.797674168530146e-01 -7.048200452153767e-01 -1.983493274921200e-01 -4.245594341194520e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.430000000000000e+02 6.797692887287506e-01 -7.048260760093651e-01 -1.983202073822311e-01 -4.246188905734140e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.440000000000000e+02 6.797711603963520e-01 -7.048321077321323e-01 -1.982910808982288e-01 -4.246783064260640e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.450000000000000e+02 6.797730318568528e-01 -7.048381403862743e-01 -1.982619480296380e-01 -4.247376814522210e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.460000000000000e+02 6.797749030429507e-01 -7.048441740175544e-01 -1.982328088443416e-01 -4.247970155428780e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.470000000000000e+02 6.797767740425864e-01 -7.048502085623766e-01 -1.982036632581659e-01 -4.248563089884010e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.480000000000000e+02 6.797786447688474e-01 -7.048562440816140e-01 -1.981745113552329e-01 -4.249155615536030e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.490000000000000e+02 6.797805152918426e-01 -7.048622805270170e-01 -1.981453530624595e-01 -4.249747733175350e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.500000000000000e+02 6.797823856004088e-01 -7.048683179042089e-01 -1.981161883940513e-01 -4.250339443528250e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.510000000000000e+02 6.797842556315041e-01 -7.048743562578088e-01 -1.980870174095032e-01 -4.250930744517820e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.520000000000000e+02 6.797861254679065e-01 -7.048803955271700e-01 -1.980578400312500e-01 -4.251521639305070e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.530000000000000e+02 6.797879950808270e-01 -7.048864357327520e-01 -1.980286562852194e-01 -4.252112126740020e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.540000000000000e+02 6.797898644234995e-01 -7.048924769088557e-01 -1.979994662123582e-01 -4.252702204480930e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.550000000000000e+02 6.797917335587214e-01 -7.048985190102082e-01 -1.979702697516701e-01 -4.253291874413050e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.560000000000000e+02 6.797936024814468e-01 -7.049045620367884e-01 -1.979410669144260e-01 -4.253881138206560e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.570000000000000e+02 6.797954711314728e-01 -7.049106060338930e-01 -1.979118577512490e-01 -4.254469992276370e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.580000000000000e+02 6.797973395895273e-01 -7.049166509416007e-01 -1.978826421881329e-01 -4.255058440165000e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.590000000000000e+02 6.797992077727463e-01 -7.049226968198082e-01 -1.978534203010406e-01 -4.255646478521280e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.600000000000000e+02 6.798010757438010e-01 -7.049287436221506e-01 -1.978241920317650e-01 -4.256234109922370e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.610000000000000e+02 6.798029435130043e-01 -7.049347913405176e-01 -1.977949573702664e-01 -4.256821334811320e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.620000000000000e+02 6.798048109921104e-01 -7.049408400387458e-01 -1.977657163974766e-01 -4.257408149615750e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.630000000000000e+02 6.798066782686570e-01 -7.049468896519006e-01 -1.977364690331906e-01 -4.257994558159980e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.640000000000000e+02 6.798085453254362e-01 -7.049529401935497e-01 -1.977072152891063e-01 -4.258580558837690e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.650000000000000e+02 6.798104121186409e-01 -7.049589916930997e-01 -1.976779552097546e-01 -4.259166151046600e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.660000000000000e+02 6.798122786875559e-01 -7.049650441220499e-01 -1.976486887566367e-01 -4.259751335948540e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.670000000000000e+02 6.798141450456567e-01 -7.049710974699759e-01 -1.976194159167985e-01 -4.260336114115990e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.680000000000000e+02 6.798160111310448e-01 -7.049771517814684e-01 -1.975901367469469e-01 -4.260920483048780e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.690000000000000e+02 6.798178769972170e-01 -7.049832070156776e-01 -1.975608511999767e-01 -4.261504445648290e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.700000000000000e+02 6.798197426591834e-01 -7.049892631641861e-01 -1.975315592543420e-01 -4.262088000696420e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.710000000000000e+02 6.798216080319331e-01 -7.049953202865271e-01 -1.975022609925256e-01 -4.262671145906310e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.720000000000000e+02 6.798234732209134e-01 -7.050013783035031e-01 -1.974729563203813e-01 -4.263253886532880e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.730000000000000e+02 6.798253381257020e-01 -7.050074372898302e-01 -1.974436453256216e-01 -4.263836217341660e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.740000000000000e+02 6.798272028242294e-01 -7.050134971891345e-01 -1.974143279332440e-01 -4.264418140844000e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.750000000000000e+02 6.798290672951102e-01 -7.050195580133446e-01 -1.973850041695649e-01 -4.264999658042160e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.760000000000000e+02 6.798309315042805e-01 -7.050256197886668e-01 -1.973556740611991e-01 -4.265580766411970e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.770000000000000e+02 6.798327954797303e-01 -7.050316824936707e-01 -1.973263375827155e-01 -4.266161467351580e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.780000000000000e+02 6.798346592564191e-01 -7.050377461022169e-01 -1.972969947013596e-01 -4.266741762312860e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.790000000000000e+02 6.798365227410014e-01 -7.050438106819047e-01 -1.972676455028438e-01 -4.267321647505450e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.800000000000000e+02 6.798383860193378e-01 -7.050498761693755e-01 -1.972382899075223e-01 -4.267901126463060e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.810000000000000e+02 6.798402490773372e-01 -7.050559425747454e-01 -1.972089279269271e-01 -4.268480198400300e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.820000000000000e+02 6.798421118500496e-01 -7.050620099429011e-01 -1.971795596251077e-01 -4.269058861845190e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.830000000000000e+02 6.798439744368735e-01 -7.050680782037289e-01 -1.971501849026640e-01 -4.269637119032000e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.840000000000000e+02 6.798458367370194e-01 -7.050741474283274e-01 -1.971208038566758e-01 -4.270214967021480e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.850000000000000e+02 6.798476988269346e-01 -7.050802175609912e-01 -1.970914164143522e-01 -4.270792408501470e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.860000000000000e+02 6.798495606920428e-01 -7.050862886102385e-01 -1.970620225921574e-01 -4.271369443824960e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.870000000000000e+02 6.798514222739783e-01 -7.050923606200558e-01 -1.970326224391282e-01 -4.271946069470040e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.880000000000000e+02 6.798532836506548e-01 -7.050984335328769e-01 -1.970032158829008e-01 -4.272522288649730e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.890000000000000e+02 6.798551448009553e-01 -7.051045073627854e-01 -1.969738029441770e-01 -4.273098100985320e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.900000000000000e+02 6.798570056664353e-01 -7.051105821499222e-01 -1.969443836810372e-01 -4.273673505268180e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.910000000000000e+02 6.798588663180682e-01 -7.051166578441354e-01 -1.969149580221255e-01 -4.274248503037880e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.920000000000000e+02 6.798607267547637e-01 -7.051227344464227e-01 -1.968855259661000e-01 -4.274823093809000e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.930000000000000e+02 6.798625869035370e-01 -7.051288120083469e-01 -1.968560875826636e-01 -4.275397275312360e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.940000000000000e+02 6.798644468316455e-01 -7.051348904797335e-01 -1.968266428101466e-01 -4.275971050558920e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.950000000000000e+02 6.798663065475848e-01 -7.051409698549571e-01 -1.967971916374721e-01 -4.276544419224420e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.960000000000000e+02 6.798681659713435e-01 -7.051470501891645e-01 -1.967677341444176e-01 -4.277117379677370e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.970000000000000e+02 6.798700252083145e-01 -7.051531314085940e-01 -1.967382702241842e-01 -4.277689933943110e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.980000000000000e+02 6.798718841447217e-01 -7.051592135931014e-01 -1.967087999876984e-01 -4.278262079004330e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>1.990000000000000e+02 6.798737428751541e-01 -7.051652966732846e-01 -1.966793233462688e-01 -4.278833818531920e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.000000000000000e+02 6.798756013870554e-01 -7.051713806585288e-01 -1.966498403091284e-01 -4.279405151570000e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.010000000000000e+02 6.798774596011082e-01 -7.051774656058257e-01 -1.966203509500633e-01 -4.279976075122290e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.020000000000000e+02 6.798793176047739e-01 -7.051835514505909e-01 -1.965908551878366e-01 -4.280546592800730e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.030000000000000e+02 6.798811753820057e-01 -7.051896382039839e-01 -1.965613530366951e-01 -4.281116703969420e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.040000000000000e+02 6.798830328785108e-01 -7.051957259050775e-01 -1.965318445464533e-01 -4.281686406426270e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.050000000000000e+02 6.798848901500238e-01 -7.052018145124993e-01 -1.965023296651326e-01 -4.282255702482280e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.060000000000000e+02 6.798867472016763e-01 -7.052079040219095e-01 -1.964728083874397e-01 -4.282824592370850e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.070000000000000e+02 6.798886039654499e-01 -7.052139944820403e-01 -1.964432807767602e-01 -4.283393073556980e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.080000000000000e+02 6.798904605329755e-01 -7.052200858268264e-01 -1.964137467443024e-01 -4.283961148898780e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.090000000000000e+02 6.798923168074383e-01 -7.052261781237396e-01 -1.963842063854064e-01 -4.284528816068030e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.100000000000000e+02 6.798941728609138e-01 -7.052322713221690e-01 -1.963546596267274e-01 -4.285096076426350e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.110000000000000e+02 6.798960286978132e-01 -7.052383654171293e-01 -1.963251064663201e-01 -4.285662930873390e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.120000000000000e+02 6.798978842441032e-01 -7.052444604613733e-01 -1.962955469740358e-01 -4.286229376856430e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.130000000000000e+02 6.798997395631307e-01 -7.052505564083331e-01 -1.962659810899465e-01 -4.286795416770520e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.140000000000000e+02 6.799015946610585e-01 -7.052566532548605e-01 -1.962364088033276e-01 -4.287361049732730e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.150000000000000e+02 6.799034494766948e-01 -7.052627510435318e-01 -1.962068301739770e-01 -4.287926274180850e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.160000000000000e+02 6.799053040579373e-01 -7.052688497371346e-01 -1.961772451606945e-01 -4.288491093034770e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.170000000000000e+02 6.799071584244262e-01 -7.052749493234310e-01 -1.961476537385194e-01 -4.289055505502580e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.180000000000000e+02 6.799090124953324e-01 -7.052810498586009e-01 -1.961180559871833e-01 -4.289619509676460e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.190000000000000e+02 6.799108663419909e-01 -7.052871512925548e-01 -1.960884518339890e-01 -4.290183106891620e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.200000000000000e+02 6.799127199705892e-01 -7.052932536182239e-01 -1.960588412771350e-01 -4.290746298584930e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.210000000000000e+02 6.799145733007834e-01 -7.052993568929989e-01 -1.960292243923389e-01 -4.291309081939600e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.220000000000000e+02 6.799164264410558e-01 -7.053054610388255e-01 -1.959996010742728e-01 -4.291871460284140e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.230000000000000e+02 6.799182792742511e-01 -7.053115661404445e-01 -1.959699714317722e-01 -4.292433429053130e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.240000000000000e+02 6.799201318924670e-01 -7.053176721286518e-01 -1.959403353818848e-01 -4.292994992757770e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.250000000000000e+02 6.799219842782368e-01 -7.053237790168198e-01 -1.959106929375021e-01 -4.293556150005920e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.260000000000000e+02 6.799238363838389e-01 -7.053298868396233e-01 -1.958810441415389e-01 -4.294116898626830e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.270000000000000e+02 6.799256882489312e-01 -7.053359955650910e-01 -1.958513889621641e-01 -4.294677241668230e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.280000000000000e+02 6.799275399007848e-01 -7.053421051753849e-01 -1.958217273673531e-01 -4.295237178653950e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.290000000000000e+02 6.799293912523900e-01 -7.053482157312343e-01 -1.957920594425984e-01 -4.295796707415940e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.300000000000000e+02 6.799312423804701e-01 -7.053543271785773e-01 -1.957623851101765e-01 -4.296355829516520e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.310000000000000e+02 6.799330932777483e-01 -7.053604395198165e-01 -1.957327043816172e-01 -4.296914546069910e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.320000000000000e+02 6.799349438895221e-01 -7.053665527947474e-01 -1.957030173063042e-01 -4.297472854615510e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.330000000000000e+02 6.799367942876130e-01 -7.053726669509697e-01 -1.956733238154107e-01 -4.298030757673090e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.340000000000000e+02 6.799386444002338e-01 -7.053787820404068e-01 -1.956436239750128e-01 -4.298588252308550e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.350000000000000e+02 6.799404942750004e-01 -7.053848980264166e-01 -1.956139177432166e-01 -4.299145341204710e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.360000000000000e+02 6.799423439304839e-01 -7.053910148959684e-01 -1.955842050996064e-01 -4.299702024455190e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.370000000000000e+02 6.799441932868407e-01 -7.053971327065053e-01 -1.955544861186160e-01 -4.300258299023900e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.380000000000000e+02 6.799460424220555e-01 -7.054032513999069e-01 -1.955247607284734e-01 -4.300814168384420e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.390000000000000e+02 6.799478913162851e-01 -7.054093709916773e-01 -1.954950289433865e-01 -4.301369630812860e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.400000000000000e+02 6.799497399253909e-01 -7.054154915115455e-01 -1.954652908083617e-01 -4.301924685673470e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.410000000000000e+02 6.799515883048342e-01 -7.054216129194452e-01 -1.954355462688653e-01 -4.302479334583630e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.420000000000000e+02 6.799534364486993e-01 -7.054277352179514e-01 -1.954057953324866e-01 -4.303033578017730e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.430000000000000e+02 6.799552843018397e-01 -7.054338584479759e-01 -1.953760380472673e-01 -4.303587413029110e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.440000000000000e+02 6.799571319212289e-01 -7.054399825667831e-01 -1.953462743608417e-01 -4.304140842226400e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.450000000000000e+02 6.799589793143376e-01 -7.054461075679146e-01 -1.953165042666282e-01 -4.304693866173220e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.460000000000000e+02 6.799608264114252e-01 -7.054522335037593e-01 -1.952867278243909e-01 -4.305246480854950e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.470000000000000e+02 6.799626732958443e-01 -7.054583603087674e-01 -1.952569449652997e-01 -4.305798692057540e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.480000000000000e+02 6.799645198865102e-01 -7.054644880452009e-01 -1.952271557560460e-01 -4.306350494368820e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.490000000000000e+02 6.799663662478446e-01 -7.054706166648559e-01 -1.951973601373549e-01 -4.306901890707300e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.500000000000000e+02 6.799682123672300e-01 -7.054767461736650e-01 -1.951675581265924e-01 -4.307452882197600e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.510000000000000e+02 6.799700582031040e-01 -7.054828766041455e-01 -1.951377497556802e-01 -4.308003465524490e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.520000000000000e+02 6.799719037993398e-01 -7.054890079235407e-01 -1.951079349834540e-01 -4.308553642525750e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.530000000000000e+02 6.799737491623745e-01 -7.054951401249805e-01 -1.950781138069646e-01 -4.309103414418460e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.540000000000000e+02 6.799755942368141e-01 -7.055012732503474e-01 -1.950482862727311e-01 -4.309652777778040e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.550000000000000e+02 6.799774390652883e-01 -7.055074072658489e-01 -1.950184523451998e-01 -4.310201735551260e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.560000000000000e+02 6.799792836711779e-01 -7.055135421545229e-01 -1.949886120003735e-01 -4.310750288265310e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.570000000000000e+02 6.799811279726711e-01 -7.055196779764594e-01 -1.949587653119178e-01 -4.311298432096380e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.580000000000000e+02 6.799829720696676e-01 -7.055258146566715e-01 -1.949289121893675e-01 -4.311846171898520e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.590000000000000e+02 6.799848158555376e-01 -7.055319522715081e-01 -1.948990527338428e-01 -4.312393503978870e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.600000000000000e+02 6.799866594173840e-01 -7.055380907592211e-01 -1.948691868578758e-01 -4.312940430344600e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.610000000000000e+02 6.799885027376091e-01 -7.055442301305632e-01 -1.948393145807669e-01 -4.313486951217600e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.620000000000000e+02 6.799903437330825e-01 -7.055503719134103e-01 -1.948094378296771e-01 -4.314032979820430e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.630000000000000e+02 6.799921885598681e-01 -7.055565115924540e-01 -1.947795509023465e-01 -4.314578771245710e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.640000000000000e+02 6.799940311106697e-01 -7.055626536447086e-01 -1.947496594578396e-01 -4.315124073250150e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.650000000000000e+02 6.799958733666632e-01 -7.055687966182198e-01 -1.947197616570699e-01 -4.315668966962220e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.660000000000000e+02 6.799977153858934e-01 -7.055749404682642e-01 -1.946898574492786e-01 -4.316213455739350e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.670000000000000e+02 6.799995571682322e-01 -7.055810851947246e-01 -1.946599468331228e-01 -4.316757539367460e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.680000000000000e+02 6.800013986536546e-01 -7.055872308428952e-01 -1.946300298594589e-01 -4.317301214224540e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.690000000000000e+02 6.800032398987002e-01 -7.055933773683748e-01 -1.946001064806982e-01 -4.317844484070730e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.700000000000000e+02 6.800050809094393e-01 -7.055995247668866e-01 -1.945701766888613e-01 -4.318387348717150e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.710000000000000e+02 6.800069216160569e-01 -7.056056730897458e-01 -1.945402405465657e-01 -4.318929804830290e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.720000000000000e+02 6.800087719761647e-01 -7.056118150292564e-01 -1.945102888288200e-01 -4.319472266742780e-02 3.720000000000000e-12 3.510000000000000e-12 1.110000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.730000000000000e+02 6.800106285608964e-01 -7.056179531014544e-01 -1.944803247074674e-01 -4.320014591186370e-02 3.720000000000000e-12 3.510000000000000e-12 1.110000000000000e-13 6.540000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.180000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.740000000000000e+02 6.800124685148802e-01 -7.056241040720422e-01 -1.944503693701792e-01 -4.320555830709490e-02 3.720000000000000e-12 3.510000000000000e-12 1.120000000000000e-13 6.530000000000000e-13 3.860000000000000e-12 -1.920000000000000e-12 8.170000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.750000000000000e+02 6.800143082323805e-01 -7.056302559152922e-01 -1.944204076167761e-01 -4.321096664370000e-02 3.700000000000000e-12 3.500000000000000e-12 1.160000000000000e-13 6.510000000000000e-13 3.850000000000000e-12 -1.920000000000000e-12 8.150000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.760000000000000e+02 6.800161476428638e-01 -7.056364086811139e-01 -1.943904395150271e-01 -4.321637089962240e-02 3.700000000000000e-12 3.500000000000000e-12 1.170000000000000e-13 6.500000000000000e-13 3.850000000000000e-12 -1.920000000000000e-12 8.140000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.770000000000000e+02 6.800179868134718e-01 -7.056425623204187e-01 -1.943604650003440e-01 -4.322177109833850e-02 3.700000000000000e-12 3.500000000000000e-12 1.190000000000000e-13 6.490000000000000e-13 3.850000000000000e-12 -1.910000000000000e-12 8.130000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.780000000000000e+02 6.800198257563828e-01 -7.056487168213401e-01 -1.943304840662219e-01 -4.322716725906180e-02 3.700000000000000e-12 3.500000000000000e-12 1.180000000000000e-13 6.490000000000000e-13 3.850000000000000e-12 -1.910000000000000e-12 8.130000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.790000000000000e+02 6.800216643871712e-01 -7.056548722478666e-01 -1.943004967843931e-01 -4.323255933074930e-02 3.700000000000000e-12 3.500000000000000e-12 1.190000000000000e-13 6.480000000000000e-13 3.850000000000000e-12 -1.910000000000000e-12 8.120000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.800000000000000e+02 6.800235027783970e-01 -7.056610285445999e-01 -1.942705030905896e-01 -4.323794735306230e-02 3.700000000000000e-12 3.490000000000000e-12 1.230000000000000e-13 6.450000000000000e-13 3.840000000000000e-12 -1.910000000000000e-12 8.060000000000000e-13 7.880000000000000e-12 -2.380000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.810000000000000e+02 6.800253409346203e-01 -7.056671857083662e-01 -1.942405029782267e-01 -4.324333132348980e-02 3.700000000000000e-12 3.490000000000000e-12 1.240000000000000e-13 6.440000000000000e-13 3.840000000000000e-12 -1.910000000000000e-12 8.050000000000000e-13 7.880000000000000e-12 -2.380000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.820000000000000e+02 6.800271853035798e-01 -7.056733390051212e-01 -1.942104904705938e-01 -4.324871393030960e-02 3.700000000000000e-12 3.490000000000000e-12 1.230000000000000e-13 6.440000000000000e-13 3.840000000000000e-12 -1.900000000000000e-12 8.050000000000000e-13 7.880000000000000e-12 -2.380000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.830000000000000e+02 6.800290337684854e-01 -7.056794899887119e-01 -1.941804675260357e-01 -4.325409428645660e-02 3.700000000000000e-12 3.490000000000000e-12 1.230000000000000e-13 6.440000000000000e-13 3.840000000000000e-12 -1.900000000000000e-12 8.050000000000000e-13 7.880000000000000e-12 -2.380000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.840000000000000e+02 6.800308710951687e-01 -7.056856498393206e-01 -1.941504482732636e-01 -4.325946605880240e-02 3.700000000000000e-12 3.490000000000000e-12 1.240000000000000e-13 6.420000000000000e-13 3.840000000000000e-12 -1.900000000000000e-12 8.040000000000000e-13 7.880000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.850000000000000e+02 6.800327081877929e-01 -7.056918105541162e-01 -1.941204225983502e-01 -4.326483377834180e-02 3.700000000000000e-12 3.490000000000000e-12 1.250000000000000e-13 6.410000000000000e-13 3.840000000000000e-12 -1.900000000000000e-12 8.020000000000000e-13 7.880000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.860000000000000e+02 6.800345450279224e-01 -7.056979721440877e-01 -1.940903905222845e-01 -4.327019744924040e-02 3.700000000000000e-12 3.490000000000000e-12 1.260000000000000e-13 6.400000000000000e-13 3.840000000000000e-12 -1.900000000000000e-12 8.010000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.870000000000000e+02 6.800363815718353e-01 -7.057041346425851e-01 -1.940603520808704e-01 -4.327555704198350e-02 3.700000000000000e-12 3.490000000000000e-12 1.270000000000000e-13 6.390000000000000e-13 3.840000000000000e-12 -1.900000000000000e-12 8.000000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.880000000000000e+02 6.800382178757998e-01 -7.057102980065399e-01 -1.940303072240221e-01 -4.328091258717610e-02 3.700000000000000e-12 3.490000000000000e-12 1.270000000000000e-13 6.390000000000000e-13 3.840000000000000e-12 -1.900000000000000e-12 8.000000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.890000000000000e+02 6.800400539303699e-01 -7.057164622422814e-01 -1.940002559599285e-01 -4.328626408111950e-02 3.700000000000000e-12 3.490000000000000e-12 1.280000000000000e-13 6.380000000000000e-13 3.840000000000000e-12 -1.900000000000000e-12 7.990000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.900000000000000e+02 6.800418896856781e-01 -7.057226273865107e-01 -1.939701983327810e-01 -4.329161149869400e-02 3.700000000000000e-12 3.490000000000000e-12 1.300000000000000e-13 6.370000000000000e-13 3.840000000000000e-12 -1.900000000000000e-12 7.980000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.910000000000000e+02 6.800437251952343e-01 -7.057287933985669e-01 -1.939401342941489e-01 -4.329695486704600e-02 3.700000000000000e-12 3.490000000000000e-12 1.310000000000000e-13 6.360000000000000e-13 3.840000000000000e-12 -1.900000000000000e-12 7.960000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.920000000000000e+02 6.800455640215590e-01 -7.057349576634192e-01 -1.939100605350644e-01 -4.330229566315500e-02 3.700000000000000e-12 3.490000000000000e-12 1.300000000000000e-13 6.360000000000000e-13 3.840000000000000e-12 -1.890000000000000e-12 7.960000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.930000000000000e+02 6.800474048929434e-01 -7.057411211137069e-01 -1.938799782350156e-01 -4.330763335869410e-02 3.700000000000000e-12 3.490000000000000e-12 1.300000000000000e-13 6.360000000000000e-13 3.840000000000000e-12 -1.890000000000000e-12 7.960000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.940000000000000e+02 6.800492396130379e-01 -7.057472897657984e-01 -1.938498950018737e-01 -4.331296454552660e-02 3.700000000000000e-12 3.490000000000000e-12 1.310000000000000e-13 6.340000000000000e-13 3.830000000000000e-12 -1.890000000000000e-12 7.950000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.950000000000000e+02 6.800510740907735e-01 -7.057534592811132e-01 -1.938198053511975e-01 -4.331829168320820e-02 3.700000000000000e-12 3.490000000000000e-12 1.320000000000000e-13 6.330000000000000e-13 3.830000000000000e-12 -1.890000000000000e-12 7.940000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.960000000000000e+02 6.800529082602366e-01 -7.057596297073655e-01 -1.937897093438714e-01 -4.332361474455530e-02 3.700000000000000e-12 3.490000000000000e-12 1.330000000000000e-13 6.320000000000000e-13 3.830000000000000e-12 -1.890000000000000e-12 7.920000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.970000000000000e+02 6.800547422135207e-01 -7.057658009771285e-01 -1.937596068919702e-01 -4.332893376351720e-02 3.700000000000000e-12 3.490000000000000e-12 1.330000000000000e-13 6.320000000000000e-13 3.830000000000000e-12 -1.890000000000000e-12 7.920000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.980000000000000e+02 6.800565758502106e-01 -7.057719731615167e-01 -1.937294980928684e-01 -4.333424871012740e-02 3.700000000000000e-12 3.490000000000000e-12 1.330000000000000e-13 6.320000000000000e-13 3.830000000000000e-12 -1.890000000000000e-12 7.920000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>2.990000000000000e+02 6.800584092542421e-01 -7.057781461990635e-01 -1.936993828662977e-01 -4.333955961496180e-02 3.700000000000000e-12 3.490000000000000e-12 1.340000000000000e-13 6.310000000000000e-13 3.830000000000000e-12 -1.890000000000000e-12 7.910000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.700000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.000000000000000e+02 6.800602423965444e-01 -7.057843201128331e-01 -1.936692612333187e-01 -4.334486645220950e-02 3.700000000000000e-12 3.490000000000000e-12 1.370000000000000e-13 6.290000000000000e-13 3.830000000000000e-12 -1.890000000000000e-12 7.890000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.010000000000000e+02 6.800620752489481e-01 -7.057904949193428e-01 -1.936391332278207e-01 -4.335016923129100e-02 3.700000000000000e-12 3.490000000000000e-12 1.360000000000000e-13 6.290000000000000e-13 3.830000000000000e-12 -1.890000000000000e-12 7.890000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.020000000000000e+02 6.800644394734375e-01 -7.057960240025316e-01 -1.936093530548097e-01 -4.335607311087000e-02 3.700000000000000e-12 3.490000000000000e-12 1.370000000000000e-13 6.280000000000001e-13 3.830000000000000e-12 -1.880000000000000e-12 7.870000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.030000000000000e+02 6.800662099626688e-01 -7.058022743575298e-01 -1.935791808418024e-01 -4.336127677278720e-02 3.700000000000000e-12 3.490000000000000e-12 1.370000000000000e-13 6.280000000000001e-13 3.830000000000000e-12 -1.880000000000000e-12 7.870000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.040000000000000e+02 6.800679823561149e-01 -7.058085232968602e-01 -1.935490019777740e-01 -4.336648070798970e-02 3.700000000000000e-12 3.490000000000000e-12 1.370000000000000e-13 6.280000000000001e-13 3.830000000000000e-12 -1.880000000000000e-12 7.870000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.050000000000000e+02 6.800697572740785e-01 -7.058147706185546e-01 -1.935188149694217e-01 -4.337168512617530e-02 3.700000000000000e-12 3.490000000000000e-12 1.390000000000000e-13 6.250000000000000e-13 3.830000000000000e-12 -1.880000000000000e-12 7.850000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.060000000000000e+02 6.800715348115959e-01 -7.058210162409955e-01 -1.934886196787965e-01 -4.337689046396430e-02 3.700000000000000e-12 3.490000000000000e-12 1.390000000000000e-13 6.250000000000000e-13 3.830000000000000e-12 -1.880000000000000e-12 7.850000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.070000000000000e+02 6.800733146676580e-01 -7.058272601562531e-01 -1.934584170540734e-01 -4.338209732359600e-02 3.700000000000000e-12 3.490000000000000e-12 1.400000000000000e-13 6.240000000000000e-13 3.830000000000000e-12 -1.880000000000000e-12 7.840000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.080000000000000e+02 6.800750963970092e-01 -7.058335023457607e-01 -1.934282085873377e-01 -4.338730631888740e-02 3.700000000000000e-12 3.490000000000000e-12 1.400000000000000e-13 6.240000000000000e-13 3.830000000000000e-12 -1.880000000000000e-12 7.830000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.090000000000000e+02 6.800768796934054e-01 -7.058397426907372e-01 -1.933979956928406e-01 -4.339251786595870e-02 3.700000000000000e-12 3.490000000000000e-12 1.400000000000000e-13 6.240000000000000e-13 3.830000000000000e-12 -1.880000000000000e-12 7.830000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.100000000000000e+02 6.800786646053507e-01 -7.058459809165807e-01 -1.933677791939897e-01 -4.339773199255140e-02 3.700000000000000e-12 3.490000000000000e-12 1.420000000000000e-13 6.220000000000000e-13 3.830000000000000e-12 -1.880000000000000e-12 7.810000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.110000000000000e+02 6.800804515977056e-01 -7.058522166070010e-01 -1.933375590727444e-01 -4.340294825743240e-02 3.700000000000000e-12 3.490000000000000e-12 1.420000000000000e-13 6.220000000000000e-13 3.830000000000000e-12 -1.880000000000000e-12 7.810000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.120000000000000e+02 6.800822588065927e-01 -7.058584365326280e-01 -1.933073183873061e-01 -4.340817308002680e-02 3.700000000000000e-12 3.490000000000000e-12 1.430000000000000e-13 6.210000000000000e-13 3.820000000000000e-12 -1.880000000000000e-12 7.800000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.130000000000000e+02 6.800840522858849e-01 -7.058646658638073e-01 -1.932770881414288e-01 -4.341339091750420e-02 3.700000000000000e-12 3.490000000000000e-12 1.430000000000000e-13 6.210000000000000e-13 3.820000000000000e-12 -1.880000000000000e-12 7.800000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.140000000000000e+02 6.800858499148742e-01 -7.058708917723857e-01 -1.932468508586869e-01 -4.341860807557950e-02 3.700000000000000e-12 3.490000000000000e-12 1.430000000000000e-13 6.210000000000000e-13 3.820000000000000e-12 -1.880000000000000e-12 7.800000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.150000000000000e+02 6.800876516570992e-01 -7.058771146110748e-01 -1.932166055230281e-01 -4.342382389926380e-02 3.700000000000000e-12 3.490000000000000e-12 1.440000000000000e-13 6.200000000000000e-13 3.820000000000000e-12 -1.870000000000000e-12 7.780000000000000e-13 7.890000000000000e-12 -2.390000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.160000000000000e+02 6.800894568475073e-01 -7.058833351635689e-01 -1.931863516630958e-01 -4.342903814640470e-02 3.700000000000000e-12 3.490000000000000e-12 1.450000000000000e-13 6.190000000000000e-13 3.820000000000000e-12 -1.870000000000000e-12 7.770000000000000e-13 7.890000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.170000000000000e+02 6.800912643221110e-01 -7.058895545116237e-01 -1.931560893868945e-01 -4.343425096506160e-02 3.700000000000000e-12 3.490000000000000e-12 1.450000000000000e-13 6.190000000000000e-13 3.820000000000000e-12 -1.870000000000000e-12 7.770000000000000e-13 7.890000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.180000000000000e+02 6.800930727187896e-01 -7.058957737833765e-01 -1.931258192714218e-01 -4.343946276631000e-02 3.700000000000000e-12 3.490000000000000e-12 1.450000000000000e-13 6.190000000000000e-13 3.820000000000000e-12 -1.870000000000000e-12 7.770000000000000e-13 7.890000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.190000000000000e+02 6.800948808447127e-01 -7.059019938571479e-01 -1.930955421893178e-01 -4.344467405715620e-02 3.700000000000000e-12 3.480000000000000e-12 1.460000000000000e-13 6.180000000000000e-13 3.820000000000000e-12 -1.870000000000000e-12 7.760000000000000e-13 7.890000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.200000000000000e+02 6.800966879858228e-01 -7.059082151169886e-01 -1.930652591494158e-01 -4.344988527753310e-02 3.700000000000000e-12 3.480000000000000e-12 1.470000000000000e-13 6.160000000000000e-13 3.820000000000000e-12 -1.870000000000000e-12 7.750000000000000e-13 7.890000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.210000000000000e+02 6.800984940569759e-01 -7.059144373489267e-01 -1.930349711758078e-01 -4.345509667388730e-02 3.700000000000000e-12 3.480000000000000e-12 1.470000000000000e-13 6.160000000000000e-13 3.820000000000000e-12 -1.870000000000000e-12 7.740000000000000e-13 7.890000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.220000000000000e+02 6.801003020370210e-01 -7.059206579863587e-01 -1.930046769274401e-01 -4.346030926481870e-02 3.700000000000000e-12 3.480000000000000e-12 1.480000000000000e-13 6.150000000000000e-13 3.820000000000000e-12 -1.870000000000000e-12 7.730000000000000e-13 7.890000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.230000000000000e+02 6.801021078577804e-01 -7.059268796031856e-01 -1.929743818578749e-01 -4.346552067656540e-02 3.700000000000000e-12 3.480000000000000e-12 1.480000000000000e-13 6.150000000000000e-13 3.820000000000000e-12 -1.870000000000000e-12 7.730000000000000e-13 7.890000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.240000000000000e+02 6.801039149963756e-01 -7.059330992606205e-01 -1.929440843497088e-01 -4.347073141034490e-02 3.700000000000000e-12 3.480000000000000e-12 1.480000000000000e-13 6.150000000000000e-13 3.820000000000000e-12 -1.870000000000000e-12 7.730000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.250000000000000e+02 6.801057243103703e-01 -7.059393160402793e-01 -1.929137848951576e-01 -4.347594077503440e-02 3.700000000000000e-12 3.480000000000000e-12 1.500000000000000e-13 6.130000000000000e-13 3.820000000000000e-12 -1.870000000000000e-12 7.710000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.260000000000000e+02 6.801075363507137e-01 -7.059455293769104e-01 -1.928834837823045e-01 -4.348114804967640e-02 3.700000000000000e-12 3.480000000000000e-12 1.510000000000000e-13 6.120000000000000e-13 3.820000000000000e-12 -1.860000000000000e-12 7.700000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.270000000000000e+02 6.801093513191596e-01 -7.059517390925577e-01 -1.928531810928108e-01 -4.348635260410910e-02 3.700000000000000e-12 3.480000000000000e-12 1.510000000000000e-13 6.120000000000000e-13 3.820000000000000e-12 -1.860000000000000e-12 7.700000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.710000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.280000000000000e+02 6.801111691377855e-01 -7.059579453254369e-01 -1.928228767002737e-01 -4.349155397262000e-02 3.700000000000000e-12 3.480000000000000e-12 1.520000000000000e-13 6.110000000000000e-13 3.820000000000000e-12 -1.860000000000000e-12 7.680000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.290000000000000e+02 6.801129895795008e-01 -7.059641484040237e-01 -1.927925702686442e-01 -4.349675186292970e-02 3.700000000000000e-12 3.480000000000000e-12 1.520000000000000e-13 6.110000000000000e-13 3.820000000000000e-12 -1.860000000000000e-12 7.680000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.300000000000000e+02 6.801148124070654e-01 -7.059703487146184e-01 -1.927622612561160e-01 -4.350194611383860e-02 3.700000000000000e-12 3.480000000000000e-12 1.530000000000000e-13 6.100000000000000e-13 3.820000000000000e-12 -1.860000000000000e-12 7.670000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.310000000000000e+02 6.801166374723390e-01 -7.059765465972978e-01 -1.927319489590141e-01 -4.350713663679110e-02 3.700000000000000e-12 3.480000000000000e-12 1.530000000000000e-13 6.100000000000000e-13 3.820000000000000e-12 -1.860000000000000e-12 7.670000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.320000000000000e+02 6.801184993492909e-01 -7.059827168493201e-01 -1.927016004199913e-01 -4.351233788818200e-02 3.700000000000000e-12 3.480000000000000e-12 1.540000000000000e-13 6.080000000000000e-13 3.810000000000000e-12 -1.860000000000000e-12 7.660000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.330000000000000e+02 6.801203289352233e-01 -7.059889104477063e-01 -1.926712793077983e-01 -4.351752088297940e-02 3.700000000000000e-12 3.480000000000000e-12 1.540000000000000e-13 6.090000000000000e-13 3.810000000000000e-12 -1.860000000000000e-12 7.650000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.340000000000000e+02 6.801221609731459e-01 -7.059951019419735e-01 -1.926409529417248e-01 -4.352270024785650e-02 3.700000000000000e-12 3.480000000000000e-12 1.540000000000000e-13 6.090000000000000e-13 3.810000000000000e-12 -1.860000000000000e-12 7.650000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.350000000000000e+02 6.801239956176084e-01 -7.060012912206600e-01 -1.926106211194158e-01 -4.352787626215090e-02 3.700000000000000e-12 3.480000000000000e-12 1.550000000000000e-13 6.070000000000000e-13 3.810000000000000e-12 -1.860000000000000e-12 7.640000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.360000000000000e+02 6.801258329907574e-01 -7.060074781139022e-01 -1.925802839342549e-01 -4.353304934964170e-02 3.700000000000000e-12 3.480000000000000e-12 1.550000000000000e-13 6.070000000000000e-13 3.810000000000000e-12 -1.860000000000000e-12 7.640000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.370000000000000e+02 6.801276731500231e-01 -7.060136624505002e-01 -1.925499416972246e-01 -4.353822000451810e-02 3.700000000000000e-12 3.480000000000000e-12 1.560000000000000e-13 6.060000000000000e-13 3.810000000000000e-12 -1.860000000000000e-12 7.630000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.380000000000000e+02 6.801295160474115e-01 -7.060198441369843e-01 -1.925195948200177e-01 -4.354338866278710e-02 3.700000000000000e-12 3.480000000000000e-12 1.560000000000000e-13 6.060000000000000e-13 3.810000000000000e-12 -1.860000000000000e-12 7.630000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.390000000000000e+02 6.801313614774970e-01 -7.060260232454797e-01 -1.924892437082617e-01 -4.354855556228500e-02 3.700000000000000e-12 3.480000000000000e-12 1.550000000000000e-13 6.060000000000000e-13 3.810000000000000e-12 -1.860000000000000e-12 7.630000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.400000000000000e+02 6.801332090266611e-01 -7.060322000869281e-01 -1.924588886956475e-01 -4.355372063951040e-02 3.700000000000000e-12 3.480000000000000e-12 1.570000000000000e-13 6.050000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.610000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.410000000000000e+02 6.801350580620289e-01 -7.060383752329706e-01 -1.924285300092317e-01 -4.355888350077100e-02 3.700000000000000e-12 3.480000000000000e-12 1.560000000000000e-13 6.050000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.610000000000000e-13 7.900000000000000e-12 -2.400000000000000e-12 7.720000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.420000000000000e+02 6.801369151651825e-01 -7.060445440378701e-01 -1.923981608769439e-01 -4.356404658792890e-02 3.700000000000000e-12 3.480000000000000e-12 1.570000000000000e-13 6.050000000000000e-13 3.810000000000000e-12 -1.860000000000000e-12 7.630000000000000e-13 7.910000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.430000000000000e+02 6.801387647563755e-01 -7.060507182148600e-01 -1.923677949636090e-01 -4.356920293958800e-02 3.700000000000000e-12 3.480000000000000e-12 1.570000000000000e-13 6.050000000000000e-13 3.810000000000000e-12 -1.860000000000000e-12 7.630000000000000e-13 7.910000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.440000000000000e+02 6.801406135260747e-01 -7.060568931226953e-01 -1.923374251072434e-01 -4.357435495124470e-02 3.700000000000000e-12 3.480000000000000e-12 1.560000000000000e-13 6.050000000000000e-13 3.810000000000000e-12 -1.860000000000000e-12 7.630000000000000e-13 7.910000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.450000000000000e+02 6.801424610737332e-01 -7.060630693323596e-01 -1.923070507392924e-01 -4.357950212529070e-02 3.700000000000000e-12 3.480000000000000e-12 1.580000000000000e-13 6.040000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.620000000000000e-13 7.910000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.460000000000000e+02 6.801443073457261e-01 -7.060692471347370e-01 -1.922766710300751e-01 -4.358464423831640e-02 3.700000000000000e-12 3.480000000000000e-12 1.570000000000000e-13 6.040000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.620000000000000e-13 7.910000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.470000000000000e+02 6.801461525871760e-01 -7.060754265624326e-01 -1.922462849855272e-01 -4.358978131172920e-02 3.700000000000000e-12 3.480000000000000e-12 1.580000000000000e-13 6.030000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.610000000000000e-13 7.910000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.480000000000000e+02 6.801479972114610e-01 -7.060816074762175e-01 -1.922158916139338e-01 -4.359491351177890e-02 3.700000000000000e-12 3.480000000000000e-12 1.580000000000000e-13 6.030000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.600000000000000e-13 7.910000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.490000000000000e+02 6.801498416365545e-01 -7.060877896807292e-01 -1.921854901090596e-01 -4.360004102168940e-02 3.700000000000000e-12 3.480000000000000e-12 1.580000000000000e-13 6.030000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.600000000000000e-13 7.910000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.500000000000000e+02 6.801516861526294e-01 -7.060939730226484e-01 -1.921550799812269e-01 -4.360516394000830e-02 3.700000000000000e-12 3.480000000000000e-12 1.580000000000000e-13 6.030000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.600000000000000e-13 7.920000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.510000000000000e+02 6.801535308504425e-01 -7.061001574578133e-01 -1.921246610761919e-01 -4.361028222892130e-02 3.700000000000000e-12 3.480000000000000e-12 1.580000000000000e-13 6.030000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.600000000000000e-13 7.920000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.520000000000000e+02 6.801554001039072e-01 -7.061063250660442e-01 -1.920942106598000e-01 -4.361540601906740e-02 3.700000000000000e-12 3.480000000000000e-12 1.590000000000000e-13 6.020000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.590000000000000e-13 7.920000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.530000000000000e+02 6.801572446539955e-01 -7.061125121322184e-01 -1.920637744903463e-01 -4.362051448039410e-02 3.700000000000000e-12 3.480000000000000e-12 1.590000000000000e-13 6.020000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.590000000000000e-13 7.920000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.540000000000000e+02 6.801590885724863e-01 -7.061187010483723e-01 -1.920333297755846e-01 -4.362561767248610e-02 3.700000000000000e-12 3.480000000000000e-12 1.590000000000000e-13 6.020000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.590000000000000e-13 7.920000000000000e-12 -2.410000000000000e-12 7.730000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.550000000000000e+02 6.801609313471219e-01 -7.061248923784263e-01 -1.920028762938195e-01 -4.363071541324870e-02 3.700000000000000e-12 3.480000000000000e-12 1.630000000000000e-13 6.040000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.570000000000000e-13 7.930000000000000e-12 -2.400000000000000e-12 7.740000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>3.560000000000000e+02 6.801627724101943e-01 -7.061310868066147e-01 -1.919724135575382e-01 -4.363580760661090e-02 3.700000000000000e-12 3.480000000000000e-12 1.630000000000000e-13 6.040000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.570000000000000e-13 7.930000000000000e-12 -2.400000000000000e-12 7.740000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>3.570000000000000e+02 6.801646112014484e-01 -7.061372850557405e-01 -1.919419408921662e-01 -4.364089423738440e-02 3.700000000000000e-12 3.480000000000000e-12 1.640000000000000e-13 6.030000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.550000000000000e-13 7.930000000000000e-12 -2.400000000000000e-12 7.740000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>3.580000000000000e+02 6.801664472598314e-01 -7.061434877568908e-01 -1.919114575967263e-01 -4.364597534221030e-02 3.700000000000000e-12 3.480000000000000e-12 1.640000000000000e-13 6.030000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.550000000000000e-13 7.930000000000000e-12 -2.400000000000000e-12 7.740000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>3.590000000000000e+02 6.801682803280756e-01 -7.061496952973384e-01 -1.918809631407742e-01 -4.365105097467090e-02 3.700000000000000e-12 3.480000000000000e-12 1.640000000000000e-13 6.030000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.550000000000000e-13 7.930000000000000e-12 -2.400000000000000e-12 7.740000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>3.600000000000000e+02 6.801701104290790e-01 -7.061559077022543e-01 -1.918504573352982e-01 -4.365612117832780e-02 3.700000000000000e-12 3.480000000000000e-12 1.640000000000000e-13 6.030000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.550000000000000e-13 7.930000000000000e-12 -2.400000000000000e-12 7.740000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>3.610000000000000e+02 6.801719378710744e-01 -7.061621246060932e-01 -1.918199404230304e-01 -4.366118597359400e-02 3.700000000000000e-12 3.480000000000000e-12 1.640000000000000e-13 6.030000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.550000000000000e-13 7.930000000000000e-12 -2.400000000000000e-12 7.740000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>3.620000000000000e+02 6.801737691071448e-01 -7.061683409708717e-01 -1.917894074939692e-01 -4.366624785963960e-02 3.710000000000000e-12 3.490000000000000e-12 1.650000000000000e-13 5.980000000000000e-13 3.820000000000000e-12 -1.850000000000000e-12 7.510000000000000e-13 7.930000000000000e-12 -2.400000000000000e-12 7.750000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>3.630000000000000e+02 6.801755927532240e-01 -7.061745648166142e-01 -1.917588705339414e-01 -4.367130179434690e-02 3.710000000000000e-12 3.490000000000000e-12 1.650000000000000e-13 5.980000000000000e-13 3.820000000000000e-12 -1.850000000000000e-12 7.500000000000000e-13 7.930000000000000e-12 -2.400000000000000e-12 7.750000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>3.640000000000000e+02 6.801774151031481e-01 -7.061807911800915e-01 -1.917283249311070e-01 -4.367635024783870e-02 3.710000000000000e-12 3.490000000000000e-12 1.650000000000000e-13 5.980000000000000e-13 3.820000000000000e-12 -1.850000000000000e-12 7.500000000000000e-13 7.930000000000000e-12 -2.400000000000000e-12 7.750000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>3.650000000000000e+02 6.801792361594092e-01 -7.061870198433671e-01 -1.916977714849323e-01 -4.368139317898700e-02 3.710000000000000e-12 3.490000000000000e-12 1.640000000000000e-13 5.990000000000000e-13 3.820000000000000e-12 -1.850000000000000e-12 7.540000000000000e-13 7.940000000000000e-12 -2.420000000000000e-12 7.759999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>3.660000000000000e+02 6.801810555277493e-01 -7.061932510359407e-01 -1.916672107545939e-01 -4.368643054771070e-02 3.710000000000000e-12 3.490000000000000e-12 1.640000000000000e-13 5.990000000000000e-13 3.820000000000000e-12 -1.850000000000000e-12 7.530000000000000e-13 7.940000000000000e-12 -2.420000000000000e-12 7.759999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>3.670000000000000e+02 6.801828724913421e-01 -7.061994853641913e-01 -1.916366430558360e-01 -4.369146231322840e-02 3.710000000000000e-12 3.490000000000000e-12 1.650000000000000e-13 5.980000000000000e-13 3.820000000000000e-12 -1.850000000000000e-12 7.520000000000000e-13 7.940000000000000e-12 -2.420000000000000e-12 7.759999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>3.680000000000000e+02 6.801846862046709e-01 -7.062057236062526e-01 -1.916060685283139e-01 -4.369648843495330e-02 3.710000000000000e-12 3.490000000000000e-12 1.650000000000000e-13 5.980000000000000e-13 3.820000000000000e-12 -1.850000000000000e-12 7.520000000000000e-13 7.940000000000000e-12 -2.420000000000000e-12 7.759999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>3.690000000000000e+02 6.801864959373461e-01 -7.062119664532197e-01 -1.915754872232734e-01 -4.370150887459910e-02 3.710000000000000e-12 3.490000000000000e-12 1.650000000000000e-13 5.980000000000000e-13 3.820000000000000e-12 -1.850000000000000e-12 7.520000000000000e-13 7.940000000000000e-12 -2.420000000000000e-12 7.759999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>3.700000000000000e+02 6.801883012909300e-01 -7.062182142840798e-01 -1.915448991616742e-01 -4.370652360356150e-02 3.710000000000000e-12 3.490000000000000e-12 1.660000000000000e-13 5.970000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.510000000000000e-13 7.950000000000001e-12 -2.420000000000000e-12 7.759999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>3.710000000000000e+02 6.801901023146560e-01 -7.062244670488351e-01 -1.915143043496762e-01 -4.371153262270760e-02 3.710000000000000e-12 3.490000000000000e-12 1.660000000000000e-13 5.970000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.510000000000000e-13 7.950000000000001e-12 -2.420000000000000e-12 7.759999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>3.720000000000000e+02 6.801919285068792e-01 -7.062307029180814e-01 -1.914836757033568e-01 -4.371654822898150e-02 3.710000000000000e-12 3.490000000000000e-12 1.660000000000000e-13 5.970000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.500000000000000e-13 7.950000000000001e-12 -2.420000000000000e-12 7.759999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>3.730000000000000e+02 6.801937226254594e-01 -7.062369638605401e-01 -1.914530673190127e-01 -4.372154608550890e-02 3.710000000000000e-12 3.490000000000000e-12 1.660000000000000e-13 5.970000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.500000000000000e-13 7.950000000000001e-12 -2.420000000000000e-12 7.759999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>3.740000000000000e+02 6.801955146018881e-01 -7.062432276131284e-01 -1.914224521275256e-01 -4.372653870990670e-02 3.710000000000000e-12 3.490000000000000e-12 1.650000000000000e-13 5.970000000000000e-13 3.810000000000000e-12 -1.840000000000000e-12 7.500000000000000e-13 7.950000000000001e-12 -2.420000000000000e-12 7.759999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>3.750000000000000e+02 6.801973053107719e-01 -7.062494932801145e-01 -1.913918302260797e-01 -4.373152652557850e-02 3.710000000000000e-12 3.490000000000000e-12 1.690000000000000e-13 6.000000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.520000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.760000000000000e+02 6.801990954756447e-01 -7.062557600607223e-01 -1.913612018674053e-01 -4.373651009200950e-02 3.710000000000000e-12 3.490000000000000e-12 1.690000000000000e-13 6.000000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.520000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.770000000000000e+02 6.802008856196530e-01 -7.062620273028956e-01 -1.913305674546980e-01 -4.374149002614150e-02 3.710000000000000e-12 3.490000000000000e-12 1.690000000000000e-13 6.000000000000000e-13 3.810000000000000e-12 -1.850000000000000e-12 7.510000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.780000000000000e+02 6.802026760627290e-01 -7.062682945362354e-01 -1.912999274617662e-01 -4.374646686422570e-02 3.720000000000000e-12 3.500000000000000e-12 1.710000000000000e-13 5.960000000000000e-13 3.820000000000000e-12 -1.850000000000000e-12 7.470000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.790000000000000e+02 6.802044669429620e-01 -7.062745614976668e-01 -1.912692822987938e-01 -4.375144090226060e-02 3.720000000000000e-12 3.500000000000000e-12 1.710000000000000e-13 5.960000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.470000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.800000000000000e+02 6.802062582397056e-01 -7.062808281513652e-01 -1.912386321853256e-01 -4.375641207007920e-02 3.720000000000000e-12 3.500000000000000e-12 1.710000000000000e-13 5.960000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.470000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.810000000000000e+02 6.802080497998825e-01 -7.062870946838381e-01 -1.912079770820723e-01 -4.376137989923880e-02 3.720000000000000e-12 3.500000000000000e-12 1.710000000000000e-13 5.960000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.470000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.820000000000000e+02 6.802098402435032e-01 -7.062933622898558e-01 -1.911773177679569e-01 -4.376634314456770e-02 3.720000000000000e-12 3.500000000000000e-12 1.720000000000000e-13 5.950000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.450000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.830000000000000e+02 6.802116314901038e-01 -7.062996297857557e-01 -1.911466517663737e-01 -4.377130188354560e-02 3.720000000000000e-12 3.500000000000000e-12 1.710000000000000e-13 5.950000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.450000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.840000000000000e+02 6.802134220469110e-01 -7.063058984866772e-01 -1.911159798039798e-01 -4.377625490746310e-02 3.720000000000000e-12 3.500000000000000e-12 1.710000000000000e-13 5.950000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.450000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.850000000000000e+02 6.802152115236040e-01 -7.063121688228459e-01 -1.910853017684443e-01 -4.378120181914800e-02 3.720000000000000e-12 3.500000000000000e-12 1.710000000000000e-13 5.950000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.450000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.860000000000000e+02 6.802169995375121e-01 -7.063184411126199e-01 -1.910546178355632e-01 -4.378614264958230e-02 3.720000000000000e-12 3.500000000000000e-12 1.710000000000000e-13 5.950000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.450000000000000e-13 7.969999999999999e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.870000000000000e+02 6.802187857635544e-01 -7.063247155260187e-01 -1.910239284347045e-01 -4.379107782205750e-02 3.720000000000000e-12 3.500000000000000e-12 1.710000000000000e-13 5.950000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.450000000000000e-13 7.980000000000000e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.880000000000000e+02 6.802205700179722e-01 -7.063309920503870e-01 -1.909932341104011e-01 -4.379600800975710e-02 3.720000000000000e-12 3.500000000000000e-12 1.710000000000000e-13 5.950000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.450000000000000e-13 7.980000000000000e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.890000000000000e+02 6.802223523626676e-01 -7.063372704514413e-01 -1.909625353388405e-01 -4.380093394402210e-02 3.720000000000000e-12 3.500000000000000e-12 1.710000000000000e-13 5.950000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.450000000000000e-13 7.980000000000000e-12 -2.420000000000000e-12 7.780000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.900000000000000e+02 6.802241331925430e-01 -7.063435502433074e-01 -1.909318323677224e-01 -4.380585623906630e-02 3.720000000000000e-12 3.500000000000000e-12 1.730000000000000e-13 5.990000000000000e-13 3.820000000000000e-12 -1.850000000000000e-12 7.470000000000000e-13 8.000000000000000e-12 -2.420000000000000e-12 7.800000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.910000000000000e+02 6.802259132479141e-01 -7.063498307049770e-01 -1.909011251377613e-01 -4.381077527536250e-02 3.720000000000000e-12 3.500000000000000e-12 1.730000000000000e-13 5.990000000000000e-13 3.820000000000000e-12 -1.850000000000000e-12 7.470000000000000e-13 8.000000000000000e-12 -2.420000000000000e-12 7.800000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.920000000000000e+02 6.802277300521115e-01 -7.063560840505319e-01 -1.908703791748643e-01 -4.381570661980990e-02 3.720000000000000e-12 3.500000000000000e-12 1.740000000000000e-13 5.980000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.460000000000000e-13 8.000000000000000e-12 -2.420000000000000e-12 7.810000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.930000000000000e+02 6.802295115937508e-01 -7.063623632619583e-01 -1.908396621669644e-01 -4.382061920954230e-02 3.720000000000000e-12 3.500000000000000e-12 1.740000000000000e-13 5.980000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.460000000000000e-13 8.000000000000000e-12 -2.420000000000000e-12 7.810000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.940000000000000e+02 6.802312952915669e-01 -7.063686407597149e-01 -1.908089393521965e-01 -4.382552818300820e-02 3.720000000000000e-12 3.500000000000000e-12 1.740000000000000e-13 5.980000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.450000000000000e-13 8.000000000000000e-12 -2.420000000000000e-12 7.800000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.950000000000000e+02 6.802330816816051e-01 -7.063749162250748e-01 -1.907782100979862e-01 -4.383043310046160e-02 3.720000000000000e-12 3.500000000000000e-12 1.740000000000000e-13 5.980000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.450000000000000e-13 8.000000000000000e-12 -2.420000000000000e-12 7.800000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.960000000000000e+02 6.802348708755319e-01 -7.063811897329385e-01 -1.907474738372137e-01 -4.383533347823560e-02 3.720000000000000e-12 3.500000000000000e-12 1.740000000000000e-13 5.980000000000000e-13 3.820000000000000e-12 -1.840000000000000e-12 7.450000000000000e-13 8.000000000000000e-12 -2.420000000000000e-12 7.800000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.970000000000000e+02 6.802366626172719e-01 -7.063874616847539e-01 -1.907167300998881e-01 -4.384022885310550e-02 3.730000000000000e-12 3.510000000000000e-12 1.740000000000000e-13 5.950000000000000e-13 3.830000000000000e-12 -1.840000000000000e-12 7.420000000000000e-13 8.000000000000000e-12 -2.420000000000000e-12 7.810000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.980000000000000e+02 6.802384564385460e-01 -7.063937326485615e-01 -1.906859785353562e-01 -4.384511884977200e-02 3.730000000000000e-12 3.510000000000000e-12 1.740000000000000e-13 5.950000000000000e-13 3.830000000000000e-12 -1.840000000000000e-12 7.420000000000000e-13 8.000000000000000e-12 -2.420000000000000e-12 7.810000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>3.990000000000000e+02 6.802402518470395e-01 -7.064000031677929e-01 -1.906552189334111e-01 -4.385000325053290e-02 3.730000000000000e-12 3.510000000000000e-12 1.740000000000000e-13 5.950000000000000e-13 3.830000000000000e-12 -1.840000000000000e-12 7.420000000000000e-13 8.000000000000000e-12 -2.420000000000000e-12 7.810000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.000000000000000e+02 6.802420484814161e-01 -7.064062736029311e-01 -1.906244512462664e-01 -4.385488204621590e-02 3.730000000000000e-12 3.510000000000000e-12 1.730000000000000e-13 5.960000000000000e-13 3.830000000000000e-12 -1.850000000000000e-12 7.450000000000000e-13 8.020000000000000e-12 -2.430000000000000e-12 7.820000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.010000000000000e+02 6.802438461925319e-01 -7.064125440497465e-01 -1.905936755979732e-01 -4.385975545315480e-02 3.730000000000000e-12 3.510000000000000e-12 1.730000000000000e-13 5.960000000000000e-13 3.830000000000000e-12 -1.850000000000000e-12 7.450000000000000e-13 8.020000000000000e-12 -2.430000000000000e-12 7.820000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.020000000000000e+02 6.802456458038937e-01 -7.064188137855374e-01 -1.905628915571316e-01 -4.386462419835680e-02 3.730000000000000e-12 3.510000000000000e-12 1.730000000000000e-13 5.960000000000000e-13 3.830000000000000e-12 -1.850000000000000e-12 7.450000000000000e-13 8.020000000000000e-12 -2.430000000000000e-12 7.820000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.030000000000000e+02 6.802474460071875e-01 -7.064250835867260e-01 -1.905321009419303e-01 -4.386948815338650e-02 3.730000000000000e-12 3.510000000000000e-12 1.730000000000000e-13 5.960000000000000e-13 3.830000000000000e-12 -1.840000000000000e-12 7.440000000000000e-13 8.020000000000000e-12 -2.430000000000000e-12 7.820000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.040000000000000e+02 6.802492478494531e-01 -7.064313524611116e-01 -1.905013034914019e-01 -4.387434818085840e-02 3.730000000000000e-12 3.510000000000000e-12 1.730000000000000e-13 5.960000000000000e-13 3.830000000000000e-12 -1.840000000000000e-12 7.440000000000000e-13 8.020000000000000e-12 -2.430000000000000e-12 7.820000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.050000000000000e+02 6.802510516157936e-01 -7.064376199848340e-01 -1.904704996464725e-01 -4.387920475798640e-02 3.740000000000000e-12 3.510000000000000e-12 1.760000000000000e-13 5.990000000000000e-13 3.830000000000000e-12 -1.850000000000000e-12 7.430000000000000e-13 8.030000000000000e-12 -2.420000000000000e-12 7.830000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.060000000000000e+02 6.802528575401868e-01 -7.064438858073744e-01 -1.904396897833301e-01 -4.388405825600820e-02 3.740000000000000e-12 3.510000000000000e-12 1.760000000000000e-13 5.990000000000000e-13 3.830000000000000e-12 -1.850000000000000e-12 7.430000000000000e-13 8.030000000000000e-12 -2.420000000000000e-12 7.830000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.070000000000000e+02 6.802546657741058e-01 -7.064501496950181e-01 -1.904088741663710e-01 -4.388890893086110e-02 3.750000000000000e-12 3.520000000000000e-12 1.760000000000000e-13 5.960000000000000e-13 3.840000000000000e-12 -1.840000000000000e-12 7.400000000000000e-13 8.030000000000000e-12 -2.420000000000000e-12 7.830000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.080000000000000e+02 6.802564763724911e-01 -7.064564115528399e-01 -1.903780529140825e-01 -4.389375693432620e-02 3.750000000000000e-12 3.520000000000000e-12 1.760000000000000e-13 5.960000000000000e-13 3.840000000000000e-12 -1.840000000000000e-12 7.400000000000000e-13 8.030000000000000e-12 -2.420000000000000e-12 7.830000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.090000000000000e+02 6.802582892833321e-01 -7.064626714398087e-01 -1.903472259760865e-01 -4.389860233141870e-02 3.750000000000000e-12 3.520000000000000e-12 1.760000000000000e-13 5.960000000000000e-13 3.840000000000000e-12 -1.840000000000000e-12 7.400000000000000e-13 8.030000000000000e-12 -2.420000000000000e-12 7.830000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.100000000000000e+02 6.802601043407317e-01 -7.064689295760400e-01 -1.903163931272641e-01 -4.390344511595710e-02 3.750000000000000e-12 3.520000000000000e-12 1.750000000000000e-13 5.970000000000000e-13 3.840000000000000e-12 -1.850000000000000e-12 7.430000000000000e-13 8.040000000000000e-12 -2.430000000000000e-12 7.840000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>4.110000000000000e+02 6.802619212649104e-01 -7.064751863358286e-01 -1.902855539902404e-01 -4.390828522450710e-02 3.750000000000000e-12 3.520000000000000e-12 1.750000000000000e-13 5.970000000000000e-13 3.840000000000000e-12 -1.850000000000000e-12 7.430000000000000e-13 8.040000000000000e-12 -2.430000000000000e-12 7.840000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>4.120000000000000e+02 6.802637721074779e-01 -7.064814183017823e-01 -1.902546777612606e-01 -4.391313633033190e-02 3.750000000000000e-12 3.520000000000000e-12 1.750000000000000e-13 5.970000000000000e-13 3.840000000000000e-12 -1.850000000000000e-12 7.430000000000000e-13 8.040000000000000e-12 -2.430000000000000e-12 7.840000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>4.130000000000000e+02 6.802655915507858e-01 -7.064876738714381e-01 -1.902238246395407e-01 -4.391797080113560e-02 3.750000000000000e-12 3.520000000000000e-12 1.750000000000000e-13 5.970000000000000e-13 3.840000000000000e-12 -1.850000000000000e-12 7.430000000000000e-13 8.040000000000000e-12 -2.430000000000000e-12 7.840000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>4.140000000000000e+02 6.802674115316771e-01 -7.064939296988663e-01 -1.901929639553983e-01 -4.392280237536900e-02 3.750000000000000e-12 3.520000000000000e-12 1.750000000000000e-13 5.970000000000000e-13 3.840000000000000e-12 -1.850000000000000e-12 7.420000000000000e-13 8.040000000000000e-12 -2.430000000000000e-12 7.840000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>4.150000000000000e+02 6.802692315605059e-01 -7.065001862801269e-01 -1.901620955966321e-01 -4.392763112805400e-02 3.750000000000000e-12 3.520000000000000e-12 1.780000000000000e-13 6.000000000000000e-13 3.840000000000000e-12 -1.850000000000000e-12 7.420000000000000e-13 8.060000000000001e-12 -2.420000000000000e-12 7.850000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>4.160000000000000e+02 6.802710512089848e-01 -7.065064439727169e-01 -1.901312197150202e-01 -4.393245726940230e-02 3.750000000000000e-12 3.520000000000000e-12 1.780000000000000e-13 6.000000000000000e-13 3.840000000000000e-12 -1.850000000000000e-12 7.420000000000000e-13 8.060000000000001e-12 -2.420000000000000e-12 7.850000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>4.170000000000000e+02 6.802728701677373e-01 -7.065127029536329e-01 -1.901003366799004e-01 -4.393728112991470e-02 3.760000000000000e-12 3.540000000000000e-12 1.780000000000000e-13 5.980000000000000e-13 3.860000000000000e-12 -1.850000000000000e-12 7.410000000000000e-13 8.069999999999999e-12 -2.430000000000000e-12 7.859999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.180000000000000e+02 6.802746882974433e-01 -7.065189632039591e-01 -1.900694469660521e-01 -4.394210310213120e-02 3.760000000000000e-12 3.540000000000000e-12 1.780000000000000e-13 5.980000000000000e-13 3.860000000000000e-12 -1.850000000000000e-12 7.410000000000000e-13 8.069999999999999e-12 -2.430000000000000e-12 7.859999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.190000000000000e+02 6.802765056648097e-01 -7.065252245174817e-01 -1.900385510136808e-01 -4.394692355124710e-02 3.760000000000000e-12 3.540000000000000e-12 1.770000000000000e-13 5.980000000000000e-13 3.860000000000000e-12 -1.850000000000000e-12 7.410000000000000e-13 8.069999999999999e-12 -2.430000000000000e-12 7.859999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.200000000000000e+02 6.802783225387664e-01 -7.065314865404763e-01 -1.900076491151806e-01 -4.395174272391700e-02 3.760000000000000e-12 3.540000000000000e-12 1.780000000000000e-13 5.980000000000000e-13 3.860000000000000e-12 -1.850000000000000e-12 7.410000000000000e-13 8.069999999999999e-12 -2.430000000000000e-12 7.859999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.210000000000000e+02 6.802801393378579e-01 -7.065377488374247e-01 -1.899767413728930e-01 -4.395656068831830e-02 3.760000000000000e-12 3.540000000000000e-12 1.770000000000000e-13 5.980000000000000e-13 3.860000000000000e-12 -1.850000000000000e-12 7.410000000000000e-13 8.069999999999999e-12 -2.430000000000000e-12 7.859999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.220000000000000e+02 6.802819525251127e-01 -7.065440139322317e-01 -1.899458314848123e-01 -4.396137562331650e-02 3.760000000000000e-12 3.540000000000000e-12 1.770000000000000e-13 5.980000000000000e-13 3.860000000000000e-12 -1.850000000000000e-12 7.410000000000000e-13 8.069999999999999e-12 -2.430000000000000e-12 7.859999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.230000000000000e+02 6.802837704595793e-01 -7.065502756113528e-01 -1.899149118966115e-01 -4.396619067104030e-02 3.760000000000000e-12 3.540000000000000e-12 1.770000000000000e-13 5.980000000000000e-13 3.860000000000000e-12 -1.850000000000000e-12 7.410000000000000e-13 8.069999999999999e-12 -2.430000000000000e-12 7.859999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.240000000000000e+02 6.802855892643807e-01 -7.065565367099876e-01 -1.898839864069531e-01 -4.397100382987110e-02 3.760000000000000e-12 3.540000000000000e-12 1.770000000000000e-13 5.980000000000000e-13 3.860000000000000e-12 -1.850000000000000e-12 7.400000000000000e-13 8.069999999999999e-12 -2.430000000000000e-12 7.859999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.250000000000000e+02 6.802874087251581e-01 -7.065627973659192e-01 -1.898530553261513e-01 -4.397581485068910e-02 3.770000000000000e-12 3.550000000000000e-12 1.810000000000000e-13 5.970000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.390000000000000e-13 8.100000000000000e-12 -2.430000000000000e-12 7.890000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.260000000000000e+02 6.802892282868032e-01 -7.065690579557221e-01 -1.898221192658409e-01 -4.398062361920790e-02 3.770000000000000e-12 3.550000000000000e-12 1.810000000000000e-13 5.970000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.380000000000000e-13 8.100000000000000e-12 -2.430000000000000e-12 7.890000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.270000000000000e+02 6.802910471598365e-01 -7.065753190113121e-01 -1.897911790571878e-01 -4.398543020499480e-02 3.770000000000000e-12 3.550000000000000e-12 1.810000000000000e-13 5.970000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.380000000000000e-13 8.100000000000000e-12 -2.430000000000000e-12 7.890000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.280000000000000e+02 6.802928645164167e-01 -7.065815810870441e-01 -1.897602355410413e-01 -4.399023487081920e-02 3.770000000000000e-12 3.550000000000000e-12 1.810000000000000e-13 5.970000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.380000000000000e-13 8.100000000000000e-12 -2.430000000000000e-12 7.890000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.290000000000000e+02 6.802946797156906e-01 -7.065878446162231e-01 -1.897292892971905e-01 -4.399503806009420e-02 3.770000000000000e-12 3.550000000000000e-12 1.810000000000000e-13 5.980000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.380000000000000e-13 8.100000000000000e-12 -2.430000000000000e-12 7.890000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.300000000000000e+02 6.802964924828465e-01 -7.065941098048144e-01 -1.896983404063894e-01 -4.399984036039130e-02 3.770000000000000e-12 3.550000000000000e-12 1.800000000000000e-13 5.980000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.410000000000000e-13 8.110000000000000e-12 -2.450000000000000e-12 7.900000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.310000000000000e+02 6.802983029757570e-01 -7.066003765969556e-01 -1.896673883543656e-01 -4.400464243895090e-02 3.770000000000000e-12 3.550000000000000e-12 1.800000000000000e-13 5.980000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.410000000000000e-13 8.110000000000000e-12 -2.450000000000000e-12 7.900000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.320000000000000e+02 6.803001533380484e-01 -7.066066140030287e-01 -1.896363931612669e-01 -4.400946266643310e-02 3.780000000000000e-12 3.550000000000000e-12 1.840000000000000e-13 6.000000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.390000000000000e-13 8.120000000000000e-12 -2.440000000000000e-12 7.910000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.330000000000000e+02 6.803019611034552e-01 -7.066128830087639e-01 -1.896054315308723e-01 -4.401426608303030e-02 3.780000000000000e-12 3.550000000000000e-12 1.840000000000000e-13 6.010000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.390000000000000e-13 8.120000000000000e-12 -2.440000000000000e-12 7.910000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.340000000000000e+02 6.803037686768679e-01 -7.066191524283109e-01 -1.895744633869473e-01 -4.401907060692340e-02 3.780000000000000e-12 3.550000000000000e-12 1.840000000000000e-13 6.010000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.390000000000000e-13 8.120000000000000e-12 -2.440000000000000e-12 7.910000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.350000000000000e+02 6.803055767518681e-01 -7.066254217928893e-01 -1.895434880307972e-01 -4.402387603844530e-02 3.780000000000000e-12 3.550000000000000e-12 1.840000000000000e-13 6.010000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.390000000000000e-13 8.130000000000000e-12 -2.440000000000000e-12 7.910000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.360000000000000e+02 6.803073858539772e-01 -7.066316906779148e-01 -1.895125052941892e-01 -4.402868178039780e-02 3.780000000000000e-12 3.550000000000000e-12 1.840000000000000e-13 6.010000000000000e-13 3.870000000000000e-12 -1.850000000000000e-12 7.390000000000000e-13 8.130000000000000e-12 -2.440000000000000e-12 7.910000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.370000000000000e+02 6.803091963301170e-01 -7.066379587255932e-01 -1.894815154687763e-01 -4.403348694406500e-02 3.790000000000000e-12 3.560000000000000e-12 1.840000000000000e-13 5.980000000000000e-13 3.880000000000000e-12 -1.850000000000000e-12 7.390000000000000e-13 8.140000000000000e-12 -2.450000000000000e-12 7.920000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.380000000000000e+02 6.803110083621803e-01 -7.066442256763065e-01 -1.894505190952507e-01 -4.403829054478440e-02 3.790000000000000e-12 3.560000000000000e-12 1.840000000000000e-13 5.980000000000000e-13 3.880000000000000e-12 -1.850000000000000e-12 7.380000000000000e-13 8.140000000000000e-12 -2.450000000000000e-12 7.920000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.390000000000000e+02 6.803128219705727e-01 -7.066504914192853e-01 -1.894195167105630e-01 -4.404309172225810e-02 3.790000000000000e-12 3.560000000000000e-12 1.840000000000000e-13 5.980000000000000e-13 3.880000000000000e-12 -1.850000000000000e-12 7.380000000000000e-13 8.140000000000000e-12 -2.450000000000000e-12 7.920000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.400000000000000e+02 6.803146370035202e-01 -7.066567560436259e-01 -1.893885086538902e-01 -4.404788992134960e-02 3.790000000000000e-12 3.560000000000000e-12 1.840000000000000e-13 5.980000000000000e-13 3.880000000000000e-12 -1.850000000000000e-12 7.380000000000000e-13 8.140000000000000e-12 -2.450000000000000e-12 7.920000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.410000000000000e+02 6.803164531387218e-01 -7.066630198532664e-01 -1.893574949844595e-01 -4.405268497857830e-02 3.790000000000000e-12 3.560000000000000e-12 1.830000000000000e-13 5.980000000000000e-13 3.880000000000000e-12 -1.850000000000000e-12 7.380000000000000e-13 8.140000000000000e-12 -2.450000000000000e-12 7.920000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.420000000000000e+02 6.803182664650349e-01 -7.066692858714224e-01 -1.893264787655951e-01 -4.405747562224080e-02 3.790000000000000e-12 3.560000000000000e-12 1.840000000000000e-13 5.970000000000000e-13 3.880000000000000e-12 -1.850000000000000e-12 7.370000000000000e-13 8.140000000000000e-12 -2.450000000000000e-12 7.920000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.430000000000000e+02 6.803200833919300e-01 -7.066755495237650e-01 -1.892954532433296e-01 -4.406226526501960e-02 3.790000000000000e-12 3.560000000000000e-12 1.840000000000000e-13 5.970000000000000e-13 3.880000000000000e-12 -1.850000000000000e-12 7.370000000000000e-13 8.140000000000000e-12 -2.450000000000000e-12 7.920000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.440000000000000e+02 6.803219000057933e-01 -7.066818138184671e-01 -1.892644214571921e-01 -4.406705301269040e-02 3.790000000000000e-12 3.560000000000000e-12 1.840000000000000e-13 5.970000000000000e-13 3.880000000000000e-12 -1.850000000000000e-12 7.370000000000000e-13 8.140000000000000e-12 -2.450000000000000e-12 7.920000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.450000000000000e+02 6.803237159759746e-01 -7.066880790344341e-01 -1.892333834231832e-01 -4.407183941563450e-02 3.790000000000000e-12 3.560000000000000e-12 1.870000000000000e-13 6.010000000000000e-13 3.880000000000000e-12 -1.850000000000000e-12 7.390000000000000e-13 8.169999999999999e-12 -2.450000000000000e-12 7.940000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.460000000000000e+02 6.803255311253283e-01 -7.066943452343719e-01 -1.892023394442672e-01 -4.407662488914970e-02 3.790000000000000e-12 3.560000000000000e-12 1.860000000000000e-13 6.010000000000000e-13 3.880000000000000e-12 -1.850000000000000e-12 7.390000000000000e-13 8.169999999999999e-12 -2.450000000000000e-12 7.940000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.470000000000000e+02 6.803273454047817e-01 -7.067006123017689e-01 -1.891712900767801e-01 -4.408140965843110e-02 3.800000000000000e-12 3.570000000000000e-12 1.880000000000000e-13 5.970000000000000e-13 3.890000000000000e-12 -1.850000000000000e-12 7.350000000000000e-13 8.169999999999999e-12 -2.450000000000000e-12 7.940000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.480000000000000e+02 6.803291588421839e-01 -7.067068800227996e-01 -1.891402360111027e-01 -4.408619374805630e-02 3.800000000000000e-12 3.570000000000000e-12 1.880000000000000e-13 5.970000000000000e-13 3.890000000000000e-12 -1.850000000000000e-12 7.340000000000000e-13 8.169999999999999e-12 -2.450000000000000e-12 7.940000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.490000000000000e+02 6.803309714939706e-01 -7.067131481749768e-01 -1.891091779080065e-01 -4.409097700937710e-02 3.800000000000000e-12 3.570000000000000e-12 1.880000000000000e-13 5.970000000000000e-13 3.890000000000000e-12 -1.850000000000000e-12 7.340000000000000e-13 8.169999999999999e-12 -2.450000000000000e-12 7.940000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.500000000000000e+02 6.803327834150843e-01 -7.067194165915641e-01 -1.890781162542221e-01 -4.409575917158480e-02 3.800000000000000e-12 3.570000000000000e-12 1.890000000000000e-13 5.960000000000000e-13 3.890000000000000e-12 -1.850000000000000e-12 7.330000000000000e-13 8.169999999999999e-12 -2.450000000000000e-12 7.940000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.510000000000000e+02 6.803345946534085e-01 -7.067256851867987e-01 -1.890470512746948e-01 -4.410053989890760e-02 3.800000000000000e-12 3.570000000000000e-12 1.890000000000000e-13 5.960000000000000e-13 3.890000000000000e-12 -1.850000000000000e-12 7.330000000000000e-13 8.169999999999999e-12 -2.450000000000000e-12 7.940000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.520000000000000e+02 6.803364394377216e-01 -7.067319287058482e-01 -1.890159508673926e-01 -4.410533344858510e-02 3.800000000000000e-12 3.570000000000000e-12 1.890000000000000e-13 5.950000000000000e-13 3.890000000000000e-12 -1.850000000000000e-12 7.350000000000000e-13 8.179999999999999e-12 -2.460000000000000e-12 7.959999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.530000000000000e+02 6.803382495328318e-01 -7.067381976175982e-01 -1.889848788136730e-01 -4.411011029925720e-02 3.800000000000000e-12 3.570000000000000e-12 1.890000000000000e-13 5.950000000000000e-13 3.890000000000000e-12 -1.850000000000000e-12 7.350000000000000e-13 8.179999999999999e-12 -2.460000000000000e-12 7.959999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.540000000000000e+02 6.803400592993639e-01 -7.067444666503566e-01 -1.889538025843840e-01 -4.411488479575560e-02 3.800000000000000e-12 3.570000000000000e-12 1.890000000000000e-13 5.950000000000000e-13 3.890000000000000e-12 -1.850000000000000e-12 7.350000000000000e-13 8.179999999999999e-12 -2.460000000000000e-12 7.959999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.550000000000000e+02 6.803418690541270e-01 -7.067507356732268e-01 -1.889227215701331e-01 -4.411965675097470e-02 3.800000000000000e-12 3.570000000000000e-12 1.920000000000000e-13 5.990000000000000e-13 3.890000000000000e-12 -1.850000000000000e-12 7.340000000000000e-13 8.190000000000000e-12 -2.450000000000000e-12 7.969999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.560000000000000e+02 6.803436792623270e-01 -7.067570044260013e-01 -1.888916350920696e-01 -4.412442605665890e-02 3.800000000000000e-12 3.570000000000000e-12 1.920000000000000e-13 5.990000000000000e-13 3.890000000000000e-12 -1.850000000000000e-12 7.340000000000000e-13 8.190000000000000e-12 -2.450000000000000e-12 7.969999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.570000000000000e+02 6.803454905143478e-01 -7.067632725234611e-01 -1.888605424693584e-01 -4.412919268352170e-02 3.810000000000000e-12 3.580000000000000e-12 1.940000000000000e-13 5.940000000000000e-13 3.900000000000000e-12 -1.850000000000000e-12 7.290000000000000e-13 8.190000000000000e-12 -2.450000000000000e-12 7.969999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.580000000000000e+02 6.803473034519605e-01 -7.067695395029227e-01 -1.888294431080919e-01 -4.413395667692460e-02 3.810000000000000e-12 3.580000000000000e-12 1.940000000000000e-13 5.940000000000000e-13 3.900000000000000e-12 -1.850000000000000e-12 7.290000000000000e-13 8.190000000000000e-12 -2.450000000000000e-12 7.969999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.590000000000000e+02 6.803491186622448e-01 -7.067758048968200e-01 -1.887983366158546e-01 -4.413871814003550e-02 3.810000000000000e-12 3.580000000000000e-12 1.940000000000000e-13 5.940000000000000e-13 3.900000000000000e-12 -1.850000000000000e-12 7.290000000000000e-13 8.190000000000000e-12 -2.450000000000000e-12 7.969999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.600000000000000e+02 6.803509365731008e-01 -7.067820683077765e-01 -1.887672229035642e-01 -4.414347720742450e-02 3.810000000000000e-12 3.580000000000000e-12 1.940000000000000e-13 5.940000000000000e-13 3.900000000000000e-12 -1.850000000000000e-12 7.310000000000000e-13 8.210000000000000e-12 -2.460000000000000e-12 7.980000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.610000000000000e+02 6.803527573764295e-01 -7.067883294700855e-01 -1.887361022380261e-01 -4.414823402099550e-02 3.810000000000000e-12 3.580000000000000e-12 1.940000000000000e-13 5.940000000000000e-13 3.900000000000000e-12 -1.850000000000000e-12 7.310000000000000e-13 8.210000000000000e-12 -2.460000000000000e-12 7.980000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.620000000000000e+02 6.803545708357642e-01 -7.067945957983303e-01 -1.887049847384032e-01 -4.415298436161800e-02 3.810000000000000e-12 3.580000000000000e-12 1.950000000000000e-13 5.930000000000000e-13 3.900000000000000e-12 -1.850000000000000e-12 7.300000000000000e-13 8.210000000000000e-12 -2.460000000000000e-12 7.980000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.630000000000000e+02 6.803563969492094e-01 -7.068008523799267e-01 -1.886738520916976e-01 -4.415773705908380e-02 3.810000000000000e-12 3.580000000000000e-12 1.950000000000000e-13 5.930000000000000e-13 3.900000000000000e-12 -1.850000000000000e-12 7.300000000000000e-13 8.210000000000000e-12 -2.460000000000000e-12 7.980000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.640000000000000e+02 6.803582249837111e-01 -7.068071070564178e-01 -1.886427146044410e-01 -4.416248790794260e-02 3.810000000000000e-12 3.580000000000000e-12 1.950000000000000e-13 5.930000000000000e-13 3.900000000000000e-12 -1.850000000000000e-12 7.300000000000000e-13 8.210000000000000e-12 -2.460000000000000e-12 7.980000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.650000000000000e+02 6.803600541606709e-01 -7.068133604016299e-01 -1.886115728910247e-01 -4.416723708608340e-02 3.810000000000000e-12 3.580000000000000e-12 1.990000000000000e-13 5.950000000000000e-13 3.900000000000000e-12 -1.850000000000000e-12 7.280000000000000e-13 8.220000000000000e-12 -2.450000000000000e-12 7.990000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.660000000000000e+02 6.803618835539779e-01 -7.068196131942610e-01 -1.885804273235806e-01 -4.417198480093930e-02 3.810000000000000e-12 3.580000000000000e-12 1.990000000000000e-13 5.950000000000000e-13 3.890000000000000e-12 -1.850000000000000e-12 7.270000000000000e-13 8.220000000000000e-12 -2.450000000000000e-12 7.990000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.670000000000000e+02 6.803637122207733e-01 -7.068258662962895e-01 -1.885492780265805e-01 -4.417673124308570e-02 3.830000000000000e-12 3.590000000000000e-12 2.000000000000000e-13 5.910000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.260000000000000e-13 8.230000000000000e-12 -2.460000000000000e-12 8.010000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.680000000000000e+02 6.803655394111383e-01 -7.068321204408440e-01 -1.885181249350094e-01 -4.418147650180370e-02 3.830000000000000e-12 3.590000000000000e-12 2.000000000000000e-13 5.910000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.260000000000000e-13 8.230000000000000e-12 -2.460000000000000e-12 8.010000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.690000000000000e+02 6.803673648158205e-01 -7.068383759788941e-01 -1.884869678739297e-01 -4.418622046281020e-02 3.830000000000000e-12 3.590000000000000e-12 2.000000000000000e-13 5.910000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.260000000000000e-13 8.240000000000000e-12 -2.460000000000000e-12 8.010000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.700000000000000e+02 6.803691887579600e-01 -7.068446326807400e-01 -1.884558066296656e-01 -4.419096272799490e-02 3.830000000000000e-12 3.590000000000000e-12 2.010000000000000e-13 5.900000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.250000000000000e-13 8.240000000000000e-12 -2.470000000000000e-12 8.010000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.710000000000000e+02 6.803710122222661e-01 -7.068508896981386e-01 -1.884246409905228e-01 -4.419570259868910e-02 3.830000000000000e-12 3.590000000000000e-12 2.010000000000000e-13 5.900000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.250000000000000e-13 8.240000000000000e-12 -2.470000000000000e-12 8.010000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.720000000000000e+02 6.803728686876107e-01 -7.068571220725769e-01 -1.883934406845775e-01 -4.420045289464950e-02 3.830000000000000e-12 3.590000000000000e-12 2.040000000000000e-13 5.930000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.260000000000000e-13 8.260000000000001e-12 -2.470000000000000e-12 8.030000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.730000000000000e+02 6.803746956145477e-01 -7.068633757872791e-01 -1.883622656994435e-01 -4.420518520033690e-02 3.830000000000000e-12 3.590000000000000e-12 2.040000000000000e-13 5.930000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.260000000000000e-13 8.260000000000001e-12 -2.470000000000000e-12 8.030000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.740000000000000e+02 6.803765261844503e-01 -7.068696261476821e-01 -1.883310858131882e-01 -4.420991250208020e-02 3.830000000000000e-12 3.590000000000000e-12 2.040000000000000e-13 5.930000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.260000000000000e-13 8.260000000000001e-12 -2.470000000000000e-12 8.030000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.750000000000000e+02 6.803783608264738e-01 -7.068758727928139e-01 -1.882999009065380e-01 -4.421463446717630e-02 3.840000000000000e-12 3.600000000000000e-12 2.070000000000000e-13 5.870000000000000e-13 3.920000000000000e-12 -1.850000000000000e-12 7.200000000000000e-13 8.260000000000001e-12 -2.470000000000000e-12 8.030000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.760000000000000e+02 6.803801991461443e-01 -7.068821161140445e-01 -1.882687108892860e-01 -4.421935128504470e-02 3.840000000000000e-12 3.600000000000000e-12 2.080000000000000e-13 5.860000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.190000000000000e-13 8.260000000000001e-12 -2.470000000000000e-12 8.030000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.770000000000000e+02 6.803820401074957e-01 -7.068883570808240e-01 -1.882375157116770e-01 -4.422406360152890e-02 3.840000000000000e-12 3.600000000000000e-12 2.080000000000000e-13 5.860000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.190000000000000e-13 8.260000000000001e-12 -2.470000000000000e-12 8.030000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.780000000000000e+02 6.803838824298796e-01 -7.068945968701824e-01 -1.882063153735754e-01 -4.422877229686940e-02 3.840000000000000e-12 3.600000000000000e-12 2.120000000000000e-13 5.890000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.200000000000000e-13 8.290000000000000e-12 -2.470000000000000e-12 8.060000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>4.790000000000000e+02 6.803857250455710e-01 -7.069008364431604e-01 -1.881751099313517e-01 -4.423347818673940e-02 3.840000000000000e-12 3.600000000000000e-12 2.120000000000000e-13 5.890000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.200000000000000e-13 8.290000000000000e-12 -2.470000000000000e-12 8.060000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>4.800000000000000e+02 6.803875674548957e-01 -7.069070762198838e-01 -1.881438994973934e-01 -4.423818175490420e-02 3.840000000000000e-12 3.600000000000000e-12 2.130000000000000e-13 5.880000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.190000000000000e-13 8.290000000000000e-12 -2.470000000000000e-12 8.060000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>4.810000000000000e+02 6.803894098561737e-01 -7.069133159634268e-01 -1.881126842355853e-01 -4.424288303041550e-02 3.840000000000000e-12 3.600000000000000e-12 2.140000000000000e-13 5.870000000000000e-13 3.910000000000000e-12 -1.850000000000000e-12 7.180000000000000e-13 8.290000000000000e-12 -2.470000000000000e-12 8.060000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>4.820000000000000e+02 6.803912639514307e-01 -7.069195468184943e-01 -1.880814540762603e-01 -4.424758634173140e-02 3.850000000000000e-12 3.610000000000000e-12 2.140000000000000e-13 5.840000000000000e-13 3.930000000000000e-12 -1.850000000000000e-12 7.170000000000000e-13 8.300000000000000e-12 -2.480000000000000e-12 8.069999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.830000000000000e+02 6.803931088853072e-01 -7.069257839480435e-01 -1.880502298073997e-01 -4.425228175150710e-02 3.850000000000000e-12 3.610000000000000e-12 2.140000000000000e-13 5.840000000000000e-13 3.930000000000000e-12 -1.850000000000000e-12 7.170000000000000e-13 8.300000000000000e-12 -2.480000000000000e-12 8.069999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.840000000000000e+02 6.803949564346709e-01 -7.069320184084023e-01 -1.880190014450611e-01 -4.425697349443240e-02 3.850000000000000e-12 3.610000000000000e-12 2.150000000000000e-13 5.830000000000000e-13 3.920000000000000e-12 -1.850000000000000e-12 7.160000000000000e-13 8.300000000000000e-12 -2.480000000000000e-12 8.069999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.850000000000000e+02 6.803968069423726e-01 -7.069382497896975e-01 -1.879877693261727e-01 -4.426166140886420e-02 3.850000000000000e-12 3.610000000000000e-12 2.160000000000000e-13 5.820000000000000e-13 3.920000000000000e-12 -1.850000000000000e-12 7.150000000000000e-13 8.300000000000000e-12 -2.480000000000000e-12 8.069999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.860000000000000e+02 6.803986601013317e-01 -7.069444782772060e-01 -1.879565338110631e-01 -4.426634572011170e-02 3.850000000000000e-12 3.610000000000000e-12 2.160000000000000e-13 5.820000000000000e-13 3.920000000000000e-12 -1.840000000000000e-12 7.150000000000000e-13 8.300000000000000e-12 -2.480000000000000e-12 8.069999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>4.870000000000000e+02 6.804005150458041e-01 -7.069507045881674e-01 -1.879252952073051e-01 -4.427102696962610e-02 3.850000000000000e-12 3.610000000000000e-12 2.200000000000000e-13 5.840000000000000e-13 3.920000000000000e-12 -1.840000000000000e-12 7.130000000000000e-13 8.320000000000000e-12 -2.470000000000000e-12 8.080000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.880000000000000e+02 6.804023706504176e-01 -7.069569297294003e-01 -1.878940536421642e-01 -4.427570583048060e-02 3.850000000000000e-12 3.610000000000000e-12 2.200000000000000e-13 5.840000000000000e-13 3.920000000000000e-12 -1.840000000000000e-12 7.130000000000000e-13 8.320000000000000e-12 -2.470000000000000e-12 8.080000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.890000000000000e+02 6.804042259214623e-01 -7.069631546749781e-01 -1.878628089106905e-01 -4.428038288456980e-02 3.850000000000000e-12 3.610000000000000e-12 2.200000000000000e-13 5.840000000000000e-13 3.920000000000000e-12 -1.840000000000000e-12 7.120000000000000e-13 8.320000000000000e-12 -2.470000000000000e-12 8.080000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.900000000000000e+02 6.804060803357034e-01 -7.069693800786994e-01 -1.878315603707232e-01 -4.428505845139280e-02 3.850000000000000e-12 3.610000000000000e-12 2.210000000000000e-13 5.830000000000000e-13 3.920000000000000e-12 -1.840000000000000e-12 7.130000000000000e-13 8.330000000000000e-12 -2.480000000000000e-12 8.100000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.910000000000000e+02 6.804079340040512e-01 -7.069756061183868e-01 -1.878003069515258e-01 -4.428973252110370e-02 3.850000000000000e-12 3.610000000000000e-12 2.210000000000000e-13 5.830000000000000e-13 3.920000000000000e-12 -1.840000000000000e-12 7.130000000000000e-13 8.330000000000000e-12 -2.480000000000000e-12 8.100000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.920000000000000e+02 6.804098174966778e-01 -7.069818104037153e-01 -1.877690192113430e-01 -4.429441767122830e-02 3.860000000000000e-12 3.620000000000000e-12 2.230000000000000e-13 5.780000000000000e-13 3.930000000000000e-12 -1.840000000000000e-12 7.090000000000000e-13 8.330000000000000e-12 -2.480000000000000e-12 8.100000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.930000000000000e+02 6.804116720343808e-01 -7.069880365587891e-01 -1.877377520462600e-01 -4.429908778681280e-02 3.860000000000000e-12 3.620000000000000e-12 2.230000000000000e-13 5.780000000000000e-13 3.930000000000000e-12 -1.840000000000000e-12 7.090000000000000e-13 8.330000000000000e-12 -2.480000000000000e-12 8.100000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.940000000000000e+02 6.804135284959884e-01 -7.069942617995010e-01 -1.877064763980241e-01 -4.430375537644200e-02 3.860000000000000e-12 3.620000000000000e-12 2.230000000000000e-13 5.780000000000000e-13 3.930000000000000e-12 -1.840000000000000e-12 7.080000000000000e-13 8.330000000000000e-12 -2.480000000000000e-12 8.100000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.950000000000000e+02 6.804153875696328e-01 -7.070004855633120e-01 -1.876751919267832e-01 -4.430842027146590e-02 3.870000000000000e-12 3.620000000000000e-12 2.280000000000000e-13 5.800000000000000e-13 3.930000000000000e-12 -1.840000000000000e-12 7.090000000000000e-13 8.360000000000001e-12 -2.480000000000000e-12 8.120000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.960000000000000e+02 6.804172494894142e-01 -7.070067075283486e-01 -1.876438989760214e-01 -4.431308254072470e-02 3.870000000000000e-12 3.620000000000000e-12 2.280000000000000e-13 5.800000000000000e-13 3.930000000000000e-12 -1.840000000000000e-12 7.090000000000000e-13 8.360000000000001e-12 -2.480000000000000e-12 8.120000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.970000000000000e+02 6.804191140311587e-01 -7.070129276594594e-01 -1.876125984225085e-01 -4.431774245838540e-02 3.860000000000000e-12 3.620000000000000e-12 2.280000000000000e-13 5.790000000000000e-13 3.930000000000000e-12 -1.840000000000000e-12 7.070000000000000e-13 8.360000000000001e-12 -2.490000000000000e-12 8.120000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.980000000000000e+02 6.804209806186307e-01 -7.070191461952581e-01 -1.875812913617432e-01 -4.432240041299860e-02 3.860000000000000e-12 3.620000000000000e-12 2.280000000000000e-13 5.790000000000000e-13 3.930000000000000e-12 -1.840000000000000e-12 7.070000000000000e-13 8.360000000000001e-12 -2.490000000000000e-12 8.120000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>4.990000000000000e+02 6.804228484731202e-01 -7.070253636083783e-01 -1.875499787396011e-01 -4.432705680440600e-02 3.860000000000000e-12 3.620000000000000e-12 2.280000000000000e-13 5.790000000000000e-13 3.930000000000000e-12 -1.840000000000000e-12 7.070000000000000e-13 8.360000000000001e-12 -2.490000000000000e-12 8.120000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.000000000000000e+02 6.804247167509674e-01 -7.070315805567897e-01 -1.875186610578563e-01 -4.433171195433680e-02 3.880000000000000e-12 3.630000000000000e-12 2.300000000000000e-13 5.740000000000000e-13 3.940000000000000e-12 -1.840000000000000e-12 7.030000000000000e-13 8.360000000000001e-12 -2.490000000000000e-12 8.120000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.010000000000000e+02 6.804265846554490e-01 -7.070377978113996e-01 -1.874873382524493e-01 -4.433636605698650e-02 3.880000000000000e-12 3.630000000000000e-12 2.310000000000000e-13 5.730000000000000e-13 3.940000000000000e-12 -1.840000000000000e-12 7.020000000000000e-13 8.360000000000001e-12 -2.490000000000000e-12 8.120000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.020000000000000e+02 6.804284457956532e-01 -7.070440203922262e-01 -1.874560151564688e-01 -4.434101669297690e-02 3.880000000000000e-12 3.630000000000000e-12 2.330000000000000e-13 5.770000000000000e-13 3.940000000000000e-12 -1.840000000000000e-12 7.040000000000000e-13 8.379999999999999e-12 -2.490000000000000e-12 8.150000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.030000000000000e+02 6.804303111768971e-01 -7.070502404805854e-01 -1.874246801654535e-01 -4.434566870546690e-02 3.880000000000000e-12 3.630000000000000e-12 2.330000000000000e-13 5.770000000000000e-13 3.940000000000000e-12 -1.840000000000000e-12 7.040000000000000e-13 8.379999999999999e-12 -2.490000000000000e-12 8.150000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.040000000000000e+02 6.804321748860434e-01 -7.070564627194242e-01 -1.873933378655103e-01 -4.435031939194290e-02 3.880000000000000e-12 3.630000000000000e-12 2.340000000000000e-13 5.760000000000000e-13 3.940000000000000e-12 -1.840000000000000e-12 7.020000000000000e-13 8.379999999999999e-12 -2.490000000000000e-12 8.150000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.050000000000000e+02 6.804340370307466e-01 -7.070626871720161e-01 -1.873619877137878e-01 -4.435496836958380e-02 3.880000000000000e-12 3.630000000000000e-12 2.360000000000000e-13 5.750000000000000e-13 3.940000000000000e-12 -1.840000000000000e-12 7.010000000000000e-13 8.379999999999999e-12 -2.490000000000000e-12 8.150000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.060000000000000e+02 6.804358979687370e-01 -7.070689135627078e-01 -1.873306295686791e-01 -4.435961512606940e-02 3.880000000000000e-12 3.630000000000000e-12 2.370000000000000e-13 5.740000000000000e-13 3.940000000000000e-12 -1.840000000000000e-12 7.000000000000000e-13 8.379999999999999e-12 -2.490000000000000e-12 8.150000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.070000000000000e+02 6.804377582037535e-01 -7.070751413725604e-01 -1.872992636922413e-01 -4.436425908282890e-02 3.880000000000000e-12 3.630000000000000e-12 2.360000000000000e-13 5.740000000000000e-13 3.940000000000000e-12 -1.840000000000000e-12 7.030000000000000e-13 8.400000000000000e-12 -2.500000000000000e-12 8.160000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.080000000000000e+02 6.804396182491000e-01 -7.070813699927277e-01 -1.872678906381760e-01 -4.436889971764570e-02 3.880000000000000e-12 3.630000000000000e-12 2.350000000000000e-13 5.740000000000000e-13 3.940000000000000e-12 -1.840000000000000e-12 7.030000000000000e-13 8.400000000000000e-12 -2.500000000000000e-12 8.160000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.090000000000000e+02 6.804414784981926e-01 -7.070875988822702e-01 -1.872365110885500e-01 -4.437353672502190e-02 3.880000000000000e-12 3.630000000000000e-12 2.370000000000000e-13 5.730000000000000e-13 3.940000000000000e-12 -1.840000000000000e-12 7.020000000000000e-13 8.400000000000000e-12 -2.500000000000000e-12 8.160000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.100000000000000e+02 6.804433391438437e-01 -7.070938276792915e-01 -1.872051256936050e-01 -4.437817015905710e-02 3.890000000000000e-12 3.640000000000000e-12 2.390000000000000e-13 5.690000000000000e-13 3.950000000000000e-12 -1.840000000000000e-12 6.970000000000000e-13 8.400000000000000e-12 -2.500000000000000e-12 8.160000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.110000000000000e+02 6.804452001695896e-01 -7.071000562381442e-01 -1.871737349519128e-01 -4.438280047869550e-02 3.890000000000000e-12 3.640000000000000e-12 2.390000000000000e-13 5.690000000000000e-13 3.950000000000000e-12 -1.840000000000000e-12 6.970000000000000e-13 8.400000000000000e-12 -2.500000000000000e-12 8.160000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.120000000000000e+02 6.804471034366796e-01 -7.071062534855720e-01 -1.871422995800814e-01 -4.438744658244870e-02 3.890000000000000e-12 3.640000000000000e-12 2.420000000000000e-13 5.720000000000000e-13 3.950000000000000e-12 -1.840000000000000e-12 6.980000000000000e-13 8.420000000000000e-12 -2.500000000000000e-12 8.190000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.130000000000000e+02 6.804489647120614e-01 -7.071124817441781e-01 -1.871108987606872e-01 -4.439207304059260e-02 3.890000000000000e-12 3.640000000000000e-12 2.420000000000000e-13 5.720000000000000e-13 3.950000000000000e-12 -1.840000000000000e-12 6.980000000000000e-13 8.420000000000000e-12 -2.500000000000000e-12 8.190000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.140000000000000e+02 6.804508259103161e-01 -7.071187100141300e-01 -1.870794927818112e-01 -4.439669859822580e-02 3.890000000000000e-12 3.640000000000000e-12 2.420000000000000e-13 5.720000000000000e-13 3.950000000000000e-12 -1.840000000000000e-12 6.980000000000000e-13 8.420000000000000e-12 -2.500000000000000e-12 8.190000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.150000000000000e+02 6.804526871032610e-01 -7.071249382973606e-01 -1.870480813402299e-01 -4.440132339068760e-02 3.890000000000000e-12 3.640000000000000e-12 2.430000000000000e-13 5.710000000000000e-13 3.950000000000000e-12 -1.840000000000000e-12 6.970000000000000e-13 8.420000000000000e-12 -2.500000000000000e-12 8.190000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.160000000000000e+02 6.804545485690342e-01 -7.071311664598303e-01 -1.870166640316401e-01 -4.440594698177390e-02 3.890000000000000e-12 3.640000000000000e-12 2.440000000000000e-13 5.700000000000000e-13 3.950000000000000e-12 -1.840000000000000e-12 6.960000000000000e-13 8.420000000000000e-12 -2.500000000000000e-12 8.190000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.170000000000000e+02 6.804564107329627e-01 -7.071373942640587e-01 -1.869852404170683e-01 -4.441056847217940e-02 3.900000000000000e-12 3.660000000000000e-12 2.440000000000000e-13 5.660000000000000e-13 3.960000000000000e-12 -1.840000000000000e-12 6.920000000000000e-13 8.420000000000000e-12 -2.500000000000000e-12 8.190000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.180000000000000e+02 6.804582740277767e-01 -7.071436214673144e-01 -1.869538100930558e-01 -4.441518678245570e-02 3.900000000000000e-12 3.660000000000000e-12 2.440000000000000e-13 5.660000000000000e-13 3.960000000000000e-12 -1.840000000000000e-12 6.920000000000000e-13 8.430000000000000e-12 -2.500000000000000e-12 8.190000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.190000000000000e+02 6.804601387148121e-01 -7.071498479544605e-01 -1.869223727551841e-01 -4.441980101007110e-02 3.900000000000000e-12 3.650000000000000e-12 2.450000000000000e-13 5.650000000000000e-13 3.960000000000000e-12 -1.830000000000000e-12 6.910000000000000e-13 8.430000000000000e-12 -2.500000000000000e-12 8.190000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.200000000000000e+02 6.804620047249804e-01 -7.071560738611651e-01 -1.868909282409560e-01 -4.442441072380310e-02 3.900000000000000e-12 3.650000000000000e-12 2.480000000000000e-13 5.690000000000000e-13 3.960000000000000e-12 -1.840000000000000e-12 6.930000000000000e-13 8.450000000000001e-12 -2.500000000000000e-12 8.210000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.210000000000000e+02 6.804638715878522e-01 -7.071622996319363e-01 -1.868594765370707e-01 -4.442901609572860e-02 3.900000000000000e-12 3.650000000000000e-12 2.490000000000000e-13 5.680000000000000e-13 3.960000000000000e-12 -1.840000000000000e-12 6.920000000000000e-13 8.450000000000001e-12 -2.500000000000000e-12 8.210000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.220000000000000e+02 6.804657468579826e-01 -7.071685197822557e-01 -1.868280098581551e-01 -4.443362144168260e-02 3.900000000000000e-12 3.650000000000000e-12 2.490000000000000e-13 5.680000000000000e-13 3.960000000000000e-12 -1.840000000000000e-12 6.920000000000000e-13 8.450000000000001e-12 -2.500000000000000e-12 8.210000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.230000000000000e+02 6.804676128318610e-01 -7.071747475383846e-01 -1.867965441021969e-01 -4.443822051350210e-02 3.900000000000000e-12 3.650000000000000e-12 2.480000000000000e-13 5.680000000000000e-13 3.960000000000000e-12 -1.840000000000000e-12 6.920000000000000e-13 8.450000000000001e-12 -2.500000000000000e-12 8.210000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.240000000000000e+02 6.804694769925534e-01 -7.071809774728639e-01 -1.867650714649811e-01 -4.444281789767960e-02 3.900000000000000e-12 3.650000000000000e-12 2.500000000000000e-13 5.670000000000000e-13 3.960000000000000e-12 -1.830000000000000e-12 6.910000000000000e-13 8.450000000000001e-12 -2.500000000000000e-12 8.210000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.250000000000000e+02 6.804713387700733e-01 -7.071872101007519e-01 -1.867335919061132e-01 -4.444741428047780e-02 3.920000000000000e-12 3.670000000000000e-12 2.550000000000000e-13 5.650000000000000e-13 3.970000000000000e-12 -1.840000000000000e-12 6.880000000000000e-13 8.479999999999999e-12 -2.510000000000000e-12 8.240000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.260000000000000e+02 6.804731980370196e-01 -7.071934455708004e-01 -1.867021052564498e-01 -4.445200994083620e-02 3.920000000000000e-12 3.670000000000000e-12 2.550000000000000e-13 5.660000000000000e-13 3.970000000000000e-12 -1.840000000000000e-12 6.880000000000000e-13 8.479999999999999e-12 -2.510000000000000e-12 8.240000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.270000000000000e+02 6.804750550979983e-01 -7.071996836573675e-01 -1.866706112812963e-01 -4.445660477547360e-02 3.920000000000000e-12 3.670000000000000e-12 2.550000000000000e-13 5.660000000000000e-13 3.970000000000000e-12 -1.830000000000000e-12 6.880000000000000e-13 8.479999999999999e-12 -2.510000000000000e-12 8.240000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.280000000000000e+02 6.804769105518069e-01 -7.072059238521039e-01 -1.866391098014493e-01 -4.446119844182430e-02 3.920000000000000e-12 3.670000000000000e-12 2.550000000000000e-13 5.650000000000000e-13 3.970000000000000e-12 -1.840000000000000e-12 6.900000000000000e-13 8.490000000000000e-12 -2.520000000000000e-12 8.250000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.290000000000000e+02 6.804787650873577e-01 -7.072121655091635e-01 -1.866076008413017e-01 -4.446579055046080e-02 3.920000000000000e-12 3.670000000000000e-12 2.550000000000000e-13 5.650000000000000e-13 3.970000000000000e-12 -1.840000000000000e-12 6.890000000000000e-13 8.490000000000000e-12 -2.520000000000000e-12 8.250000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.300000000000000e+02 6.804806192923739e-01 -7.072184079886291e-01 -1.865760847431044e-01 -4.447038083298010e-02 3.920000000000000e-12 3.660000000000000e-12 2.560000000000000e-13 5.640000000000000e-13 3.970000000000000e-12 -1.840000000000000e-12 6.880000000000000e-13 8.490000000000000e-12 -2.520000000000000e-12 8.250000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.310000000000000e+02 6.804824735366802e-01 -7.072246507599401e-01 -1.865445621806901e-01 -4.447496922648460e-02 3.920000000000000e-12 3.660000000000000e-12 2.560000000000000e-13 5.640000000000000e-13 3.970000000000000e-12 -1.830000000000000e-12 6.880000000000000e-13 8.490000000000000e-12 -2.520000000000000e-12 8.250000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.320000000000000e+02 6.804843301541184e-01 -7.072308918192621e-01 -1.865130319755352e-01 -4.447955681574660e-02 3.920000000000000e-12 3.660000000000000e-12 2.570000000000000e-13 5.630000000000000e-13 3.970000000000000e-12 -1.830000000000000e-12 6.870000000000000e-13 8.490000000000000e-12 -2.520000000000000e-12 8.250000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.330000000000000e+02 6.804861847334052e-01 -7.072371341863908e-01 -1.864814991615314e-01 -4.448414195264290e-02 3.920000000000000e-12 3.660000000000000e-12 2.570000000000000e-13 5.630000000000000e-13 3.970000000000000e-12 -1.830000000000000e-12 6.870000000000000e-13 8.490000000000000e-12 -2.520000000000000e-12 8.250000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.340000000000000e+02 6.804880393992045e-01 -7.072433761168424e-01 -1.864499623126039e-01 -4.448872584268990e-02 3.920000000000000e-12 3.660000000000000e-12 2.570000000000000e-13 5.630000000000000e-13 3.970000000000000e-12 -1.830000000000000e-12 6.870000000000000e-13 8.490000000000000e-12 -2.520000000000000e-12 8.250000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.350000000000000e+02 6.804898941164037e-01 -7.072496175776053e-01 -1.864184216420885e-01 -4.449330864578800e-02 3.930000000000000e-12 3.680000000000000e-12 2.580000000000000e-13 5.590000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.860000000000000e-13 8.500000000000000e-12 -2.530000000000000e-12 8.269999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.360000000000000e+02 6.804917489208079e-01 -7.072558585928699e-01 -1.863868769202563e-01 -4.449789038455780e-02 3.930000000000000e-12 3.680000000000000e-12 2.580000000000000e-13 5.600000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.860000000000000e-13 8.500000000000000e-12 -2.530000000000000e-12 8.269999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.370000000000000e+02 6.804936038904005e-01 -7.072620992192971e-01 -1.863553276634038e-01 -4.450247098345640e-02 3.930000000000000e-12 3.680000000000000e-12 2.620000000000000e-13 5.620000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.830000000000000e-13 8.520000000000000e-12 -2.520000000000000e-12 8.279999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.380000000000000e+02 6.804954590820982e-01 -7.072683395082562e-01 -1.863237734829476e-01 -4.450705037355140e-02 3.930000000000000e-12 3.680000000000000e-12 2.620000000000000e-13 5.620000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.830000000000000e-13 8.520000000000000e-12 -2.520000000000000e-12 8.279999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.390000000000000e+02 6.804973144598477e-01 -7.072745794679552e-01 -1.862922144610335e-01 -4.451162862181950e-02 3.930000000000000e-12 3.680000000000000e-12 2.620000000000000e-13 5.620000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.830000000000000e-13 8.520000000000000e-12 -2.520000000000000e-12 8.279999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.400000000000000e+02 6.804991698544183e-01 -7.072808190293802e-01 -1.862606514046339e-01 -4.451620602542600e-02 3.930000000000000e-12 3.680000000000000e-12 2.630000000000000e-13 5.610000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.820000000000000e-13 8.520000000000000e-12 -2.520000000000000e-12 8.279999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.410000000000000e+02 6.805012867909005e-01 -7.072867527392439e-01 -1.862293183242573e-01 -4.452065893477910e-02 3.930000000000000e-12 3.680000000000000e-12 2.630000000000000e-13 5.610000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.820000000000000e-13 8.520000000000000e-12 -2.520000000000000e-12 8.279999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.420000000000000e+02 6.805031799178527e-01 -7.072929563598265e-01 -1.861977466990716e-01 -4.452521902984450e-02 3.930000000000000e-12 3.680000000000000e-12 2.630000000000000e-13 5.600000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.840000000000000e-13 8.530000000000000e-12 -2.530000000000000e-12 8.290000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.430000000000000e+02 6.805050809828308e-01 -7.072991540833821e-01 -1.861661626019244e-01 -4.452977982830140e-02 3.930000000000000e-12 3.680000000000000e-12 2.630000000000000e-13 5.600000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.840000000000000e-13 8.530000000000000e-12 -2.530000000000000e-12 8.290000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.440000000000000e+02 6.805069643946929e-01 -7.073053648728441e-01 -1.861345901826797e-01 -4.453433024015160e-02 3.930000000000000e-12 3.680000000000000e-12 2.630000000000000e-13 5.600000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.840000000000000e-13 8.530000000000000e-12 -2.530000000000000e-12 8.290000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.450000000000000e+02 6.805088484871842e-01 -7.073115751425622e-01 -1.861030121403158e-01 -4.453887821101840e-02 3.930000000000000e-12 3.680000000000000e-12 2.630000000000000e-13 5.610000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.840000000000000e-13 8.530000000000000e-12 -2.530000000000000e-12 8.290000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.460000000000000e+02 6.805107332163123e-01 -7.073177849245140e-01 -1.860714285159732e-01 -4.454342372226410e-02 3.930000000000000e-12 3.680000000000000e-12 2.630000000000000e-13 5.610000000000000e-13 3.970000000000000e-12 -1.830000000000000e-12 6.840000000000000e-13 8.530000000000000e-12 -2.530000000000000e-12 8.290000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.470000000000000e+02 6.805126186383037e-01 -7.073239941757525e-01 -1.860398392575891e-01 -4.454796680331320e-02 3.940000000000000e-12 3.690000000000000e-12 2.670000000000000e-13 5.600000000000000e-13 3.990000000000000e-12 -1.830000000000000e-12 6.820000000000000e-13 8.560000000000001e-12 -2.530000000000000e-12 8.320000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.480000000000000e+02 6.805145046966103e-01 -7.073302029383208e-01 -1.860082444163940e-01 -4.455250742541880e-02 3.940000000000000e-12 3.690000000000000e-12 2.670000000000000e-13 5.600000000000000e-13 3.990000000000000e-12 -1.830000000000000e-12 6.810000000000000e-13 8.560000000000001e-12 -2.530000000000000e-12 8.320000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.490000000000000e+02 6.805163914426786e-01 -7.073364111727845e-01 -1.859766439449270e-01 -4.455704561595780e-02 3.940000000000000e-12 3.690000000000000e-12 2.660000000000000e-13 5.600000000000000e-13 3.990000000000000e-12 -1.830000000000000e-12 6.810000000000000e-13 8.560000000000001e-12 -2.530000000000000e-12 8.320000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.500000000000000e+02 6.805182788688150e-01 -7.073426188839199e-01 -1.859450378506618e-01 -4.456158137431390e-02 3.940000000000000e-12 3.690000000000000e-12 2.680000000000000e-13 5.590000000000000e-13 3.990000000000000e-12 -1.830000000000000e-12 6.800000000000000e-13 8.560000000000001e-12 -2.530000000000000e-12 8.320000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.510000000000000e+02 6.805201669190556e-01 -7.073488261144781e-01 -1.859134261816430e-01 -4.456611466499450e-02 3.940000000000000e-12 3.690000000000000e-12 2.670000000000000e-13 5.590000000000000e-13 3.990000000000000e-12 -1.830000000000000e-12 6.800000000000000e-13 8.560000000000001e-12 -2.530000000000000e-12 8.320000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.520000000000000e+02 6.805220573093533e-01 -7.073550315906878e-01 -1.858818073197795e-01 -4.457064624071170e-02 3.940000000000000e-12 3.690000000000000e-12 2.680000000000000e-13 5.580000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.790000000000000e-13 8.560000000000001e-12 -2.530000000000000e-12 8.320000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.530000000000000e+02 6.805239494795332e-01 -7.073612357265610e-01 -1.858501817943947e-01 -4.457517586236790e-02 3.940000000000000e-12 3.690000000000000e-12 2.680000000000000e-13 5.580000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.790000000000000e-13 8.560000000000001e-12 -2.530000000000000e-12 8.320000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.540000000000000e+02 6.805258395218137e-01 -7.073674414197361e-01 -1.858185532921351e-01 -4.457970182543620e-02 3.940000000000000e-12 3.690000000000000e-12 2.680000000000000e-13 5.580000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.790000000000000e-13 8.560000000000001e-12 -2.530000000000000e-12 8.320000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.550000000000000e+02 6.805277302574784e-01 -7.073736465783308e-01 -1.857869191482154e-01 -4.458422535487440e-02 3.940000000000000e-12 3.690000000000000e-12 2.670000000000000e-13 5.590000000000000e-13 3.990000000000000e-12 -1.830000000000000e-12 6.820000000000000e-13 8.569999999999999e-12 -2.550000000000000e-12 8.330000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.560000000000000e+02 6.805296216745166e-01 -7.073798512091868e-01 -1.857552793768310e-01 -4.458874645517210e-02 3.940000000000000e-12 3.690000000000000e-12 2.670000000000000e-13 5.590000000000000e-13 3.980000000000000e-12 -1.830000000000000e-12 6.820000000000000e-13 8.569999999999999e-12 -2.550000000000000e-12 8.330000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.570000000000000e+02 6.805315137141127e-01 -7.073860553560423e-01 -1.857236340313879e-01 -4.459326509655990e-02 3.950000000000000e-12 3.700000000000000e-12 2.690000000000000e-13 5.550000000000000e-13 4.000000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.569999999999999e-12 -2.550000000000000e-12 8.330000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.580000000000000e+02 6.805334064588721e-01 -7.073922589567497e-01 -1.856919830339849e-01 -4.459778131764620e-02 3.950000000000000e-12 3.700000000000000e-12 2.690000000000000e-13 5.550000000000000e-13 4.000000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.569999999999999e-12 -2.550000000000000e-12 8.330000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.590000000000000e+02 6.805352998263100e-01 -7.073984620725992e-01 -1.856603264603890e-01 -4.460229507836520e-02 3.950000000000000e-12 3.700000000000000e-12 2.690000000000000e-13 5.550000000000000e-13 4.000000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.569999999999999e-12 -2.550000000000000e-12 8.330000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.600000000000000e+02 6.805371938683505e-01 -7.074046646641636e-01 -1.856286642617684e-01 -4.460680640401320e-02 3.950000000000000e-12 3.700000000000000e-12 2.710000000000000e-13 5.590000000000000e-13 4.000000000000000e-12 -1.830000000000000e-12 6.800000000000000e-13 8.590000000000000e-12 -2.550000000000000e-12 8.350000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.610000000000000e+02 6.805390886029358e-01 -7.074108667175882e-01 -1.855969964205011e-01 -4.461131530278950e-02 3.950000000000000e-12 3.700000000000000e-12 2.710000000000000e-13 5.590000000000000e-13 4.000000000000000e-12 -1.830000000000000e-12 6.790000000000000e-13 8.590000000000000e-12 -2.550000000000000e-12 8.350000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.620000000000000e+02 6.805409918404088e-01 -7.074170624399340e-01 -1.855653155572003e-01 -4.461582517318450e-02 3.950000000000000e-12 3.700000000000000e-12 2.720000000000000e-13 5.580000000000000e-13 4.000000000000000e-12 -1.830000000000000e-12 6.780000000000000e-13 8.600000000000000e-12 -2.550000000000000e-12 8.350000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.630000000000000e+02 6.805429009851827e-01 -7.074232537550383e-01 -1.855336241221036e-01 -4.462033488695880e-02 3.950000000000000e-12 3.700000000000000e-12 2.720000000000000e-13 5.580000000000000e-13 4.000000000000000e-12 -1.830000000000000e-12 6.780000000000000e-13 8.600000000000000e-12 -2.550000000000000e-12 8.350000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.640000000000000e+02 6.805447977018727e-01 -7.074294542616685e-01 -1.855019394368551e-01 -4.462483646043270e-02 3.950000000000000e-12 3.700000000000000e-12 2.720000000000000e-13 5.580000000000000e-13 4.000000000000000e-12 -1.830000000000000e-12 6.780000000000000e-13 8.600000000000000e-12 -2.550000000000000e-12 8.350000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.650000000000000e+02 6.805466950362852e-01 -7.074356542817831e-01 -1.854702491810835e-01 -4.462933558548260e-02 3.950000000000000e-12 3.700000000000000e-12 2.730000000000000e-13 5.570000000000000e-13 3.990000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.600000000000000e-12 -2.550000000000000e-12 8.360000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.660000000000000e+02 6.805485930491795e-01 -7.074418537716606e-01 -1.854385532922979e-01 -4.463383227730270e-02 3.950000000000000e-12 3.700000000000000e-12 2.730000000000000e-13 5.570000000000000e-13 3.990000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.600000000000000e-12 -2.550000000000000e-12 8.360000000000001e-12</ATTLIST>\n\t\t\t<ATTLIST>5.670000000000000e+02 6.805504917507675e-01 -7.074480527231749e-01 -1.854068517601737e-01 -4.463832654073590e-02 3.950000000000000e-12 3.700000000000000e-12 2.720000000000000e-13 5.580000000000000e-13 3.990000000000000e-12 -1.830000000000000e-12 6.800000000000000e-13 8.610000000000000e-12 -2.560000000000000e-12 8.369999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.680000000000000e+02 6.805523910575262e-01 -7.074542511980290e-01 -1.853751446623895e-01 -4.464281833753750e-02 3.950000000000000e-12 3.700000000000000e-12 2.710000000000000e-13 5.580000000000000e-13 3.990000000000000e-12 -1.830000000000000e-12 6.800000000000000e-13 8.610000000000000e-12 -2.560000000000000e-12 8.369999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.690000000000000e+02 6.805542910572175e-01 -7.074604491286851e-01 -1.853434319197339e-01 -4.464730771795980e-02 3.950000000000000e-12 3.700000000000000e-12 2.710000000000000e-13 5.580000000000000e-13 3.990000000000000e-12 -1.830000000000000e-12 6.790000000000000e-13 8.610000000000000e-12 -2.560000000000000e-12 8.369999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.700000000000000e+02 6.805561917285031e-01 -7.074666465323102e-01 -1.853117135472950e-01 -4.465179466146390e-02 3.970000000000000e-12 3.710000000000000e-12 2.760000000000000e-13 5.570000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.750000000000000e-13 8.620000000000000e-12 -2.550000000000000e-12 8.379999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.710000000000000e+02 6.805580930180705e-01 -7.074728434466908e-01 -1.852799895977349e-01 -4.465627915226250e-02 3.970000000000000e-12 3.710000000000000e-12 2.760000000000000e-13 5.570000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.740000000000000e-13 8.620000000000000e-12 -2.550000000000000e-12 8.379999999999999e-12</ATTLIST>\n\t\t\t<ATTLIST>5.720000000000000e+02 6.805599950109590e-01 -7.074790398085944e-01 -1.852482599890111e-01 -4.466076122545080e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.730000000000000e+02 6.805618976158928e-01 -7.074852356854846e-01 -1.852165248061569e-01 -4.466524083938010e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.740000000000000e+02 6.805638008983755e-01 -7.074914310263259e-01 -1.851847839909751e-01 -4.466971803463320e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.750000000000000e+02 6.805657048604445e-01 -7.074976258316985e-01 -1.851530375346965e-01 -4.467419279619480e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.760000000000000e+02 6.805676094409745e-01 -7.075038201451924e-01 -1.851212854973860e-01 -4.467866510485430e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.770000000000000e+02 6.805695146960570e-01 -7.075100139253930e-01 -1.850895278235674e-01 -4.468313498080430e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.780000000000000e+02 6.805714206288039e-01 -7.075162071671730e-01 -1.850577645149062e-01 -4.468760243977380e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.790000000000000e+02 6.805733271728232e-01 -7.075223999221897e-01 -1.850259956267711e-01 -4.469206743462320e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.800000000000000e+02 6.805752344004763e-01 -7.075285921339283e-01 -1.849942210953318e-01 -4.469653001128730e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.810000000000000e+02 6.805771422928842e-01 -7.075347838166015e-01 -1.849624409360073e-01 -4.470099015726920e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.820000000000000e+02 6.805790508025281e-01 -7.075409750044676e-01 -1.849306551942538e-01 -4.470544785461200e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.830000000000000e+02 6.805809600136632e-01 -7.075471656352235e-01 -1.848988637878261e-01 -4.470990313580800e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.840000000000000e+02 6.805828698307244e-01 -7.075533557795428e-01 -1.848670668058809e-01 -4.471435595726460e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.850000000000000e+02 6.805847803251571e-01 -7.075595453812051e-01 -1.848352641863081e-01 -4.471880636687220e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.860000000000000e+02 6.805866914915339e-01 -7.075657344467025e-01 -1.848034559265214e-01 -4.472325434402590e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.870000000000000e+02 6.805886032718196e-01 -7.075719230181050e-01 -1.847716420819424e-01 -4.472769986616110e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.880000000000000e+02 6.805905157254911e-01 -7.075781110492009e-01 -1.847398225991315e-01 -4.473214296896920e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.890000000000000e+02 6.805924288515512e-01 -7.075842985409305e-01 -1.847079974765933e-01 -4.473658364775430e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.900000000000000e+02 6.805943425824637e-01 -7.075904855427991e-01 -1.846761667778728e-01 -4.474102187345890e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.910000000000000e+02 6.805962569908148e-01 -7.075966720003660e-01 -1.846443304335873e-01 -4.474545767819880e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.920000000000000e+02 6.805981720717642e-01 -7.076028579155387e-01 -1.846124884502809e-01 -4.474989106724630e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.930000000000000e+02 6.806000877625229e-01 -7.076090433376953e-01 -1.845806408790939e-01 -4.475432199264100e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.940000000000000e+02 6.806020041191391e-01 -7.076152282208984e-01 -1.845487876750901e-01 -4.475875050257690e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.950000000000000e+02 6.806039211508469e-01 -7.076214125592438e-01 -1.845169288253257e-01 -4.476317659217400e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.960000000000000e+02 6.806058387904138e-01 -7.076275964027753e-01 -1.844850643913227e-01 -4.476760022782080e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.970000000000000e+02 6.806077571168555e-01 -7.076337796911591e-01 -1.844531943001218e-01 -4.477202145144800e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.980000000000000e+02 6.806096760592454e-01 -7.076399624771855e-01 -1.844213186167506e-01 -4.477644022782020e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>5.990000000000000e+02 6.806115956594206e-01 -7.076461447277239e-01 -1.843894373044297e-01 -4.478085658495750e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.000000000000000e+02 6.806135159379672e-01 -7.076523264299429e-01 -1.843575503359406e-01 -4.478527051363270e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.010000000000000e+02 6.806154368222731e-01 -7.076585076337463e-01 -1.843256577876024e-01 -4.478968200348310e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.020000000000000e+02 6.806173583647662e-01 -7.076646883011479e-01 -1.842937596055554e-01 -4.479409106853670e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.030000000000000e+02 6.806192805904152e-01 -7.076708684137979e-01 -1.842618557637039e-01 -4.479849771546850e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.040000000000000e+02 6.806212034085927e-01 -7.076770480368718e-01 -1.842299463510489e-01 -4.480290191436160e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.050000000000000e+02 6.806231269015282e-01 -7.076832271106166e-01 -1.841980312846037e-01 -4.480730368998010e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.060000000000000e+02 6.806250510583440e-01 -7.076894056399192e-01 -1.841661105801514e-01 -4.481170305426870e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.070000000000000e+02 6.806269758190756e-01 -7.076955836709498e-01 -1.841341842888569e-01 -4.481609996742830e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.080000000000000e+02 6.806289012665798e-01 -7.077017611404951e-01 -1.841022523340594e-01 -4.482049447313670e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.090000000000000e+02 6.806308273162907e-01 -7.077079381122506e-01 -1.840703147920051e-01 -4.482488652546510e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.100000000000000e+02 6.806327540363198e-01 -7.077141145331748e-01 -1.840383716018563e-01 -4.482927616631790e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.110000000000000e+02 6.806346814199060e-01 -7.077202904088615e-01 -1.840064227667008e-01 -4.483366338614220e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.120000000000000e+02 6.806366094029825e-01 -7.077264657851488e-01 -1.839744683495275e-01 -4.483804816428820e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.130000000000000e+02 6.806385380508827e-01 -7.077326406136876e-01 -1.839425082859625e-01 -4.484243052514650e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.140000000000000e+02 6.806404673640545e-01 -7.077388148939621e-01 -1.839105425740186e-01 -4.484681046698540e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.150000000000000e+02 6.806423972815441e-01 -7.077449886695021e-01 -1.838785712737441e-01 -4.485118797050810e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.160000000000000e+02 6.806443278510637e-01 -7.077511619073037e-01 -1.838465943321854e-01 -4.485556303840600e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.170000000000000e+02 6.806462591012522e-01 -7.077573345810102e-01 -1.838146117320522e-01 -4.485993571161200e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.180000000000000e+02 6.806481909370581e-01 -7.077635067643873e-01 -1.837826235543106e-01 -4.486430592555760e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.190000000000000e+02 6.806501234388842e-01 -7.077696783941123e-01 -1.837506297290610e-01 -4.486867373457920e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.200000000000000e+02 6.806520566020791e-01 -7.077758494757149e-01 -1.837186302538764e-01 -4.487303912072410e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.210000000000000e+02 6.806539903682228e-01 -7.077820200497232e-01 -1.836866251890621e-01 -4.487740207277580e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.220000000000000e+02 6.806559248125247e-01 -7.077881900623336e-01 -1.836546144563401e-01 -4.488176260783480e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.230000000000000e+02 6.806578598589749e-01 -7.077943595667765e-01 -1.836225981335875e-01 -4.488612070928050e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.240000000000000e+02 6.806597955590322e-01 -7.078005285257449e-01 -1.835905761677870e-01 -4.489047639079790e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.250000000000000e+02 6.806617319248200e-01 -7.078066969292897e-01 -1.835585485476301e-01 -4.489482966044730e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.260000000000000e+02 6.806636688880379e-01 -7.078128648275482e-01 -1.835265153375409e-01 -4.489918048866720e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.270000000000000e+02 6.806656065089071e-01 -7.078190321759418e-01 -1.834944764779350e-01 -4.490352889766620e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.280000000000000e+02 6.806675447893018e-01 -7.078251989702612e-01 -1.834624319716208e-01 -4.490787490265400e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.290000000000000e+02 6.806694836636518e-01 -7.078313652608742e-01 -1.834303818751729e-01 -4.491221846127150e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.300000000000000e+02 6.806714232012057e-01 -7.078375309957319e-01 -1.833983261221829e-01 -4.491655960437200e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.310000000000000e+02 6.806733633934785e-01 -7.078436961779525e-01 -1.833662647261695e-01 -4.492089834494080e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.320000000000000e+02 6.806753041752375e-01 -7.078498608591596e-01 -1.833341977398859e-01 -4.492523463142980e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.330000000000000e+02 6.806772456449776e-01 -7.078560249621955e-01 -1.833021250769521e-01 -4.492956852853420e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.340000000000000e+02 6.806791876994079e-01 -7.078621885658611e-01 -1.832700468288954e-01 -4.493389997494180e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.350000000000000e+02 6.806811304222570e-01 -7.078683516062020e-01 -1.832379629181729e-01 -4.493822901489690e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.360000000000000e+02 6.806830737898589e-01 -7.078745140998804e-01 -1.832058733674463e-01 -4.494255564071590e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.370000000000000e+02 6.806850177579234e-01 -7.078806760791975e-01 -1.831737782183893e-01 -4.494687983335490e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.380000000000000e+02 6.806869623766859e-01 -7.078868375069791e-01 -1.831416774208552e-01 -4.495120161067370e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.390000000000000e+02 6.806889076540393e-01 -7.078929983764155e-01 -1.831095709675389e-01 -4.495552097888330e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.400000000000000e+02 6.806908535227985e-01 -7.078991587375911e-01 -1.830774589201096e-01 -4.495983790418430e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.410000000000000e+02 6.806928000382613e-01 -7.079053185469351e-01 -1.830453412297512e-01 -4.496415242299260e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.420000000000000e+02 6.806947472238813e-01 -7.079114777879364e-01 -1.830132178699826e-01 -4.496846453672560e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.430000000000000e+02 6.806966949806493e-01 -7.079176365332347e-01 -1.829810889353541e-01 -4.497277420453460e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.440000000000000e+02 6.806986434112186e-01 -7.079237947058986e-01 -1.829489543276551e-01 -4.497708147207000e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.450000000000000e+02 6.807005924796364e-01 -7.079299523317365e-01 -1.829168140812343e-01 -4.498138632621690e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.460000000000000e+02 6.807025421428867e-01 -7.079361094432369e-01 -1.828846682339453e-01 -4.498568874147190e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.470000000000000e+02 6.807044924778166e-01 -7.079422659811857e-01 -1.828525167154901e-01 -4.498998876143240e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.480000000000000e+02 6.807064434050233e-01 -7.079484220043960e-01 -1.828203596000608e-01 -4.499428634920480e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.490000000000000e+02 6.807083949744324e-01 -7.079545774770304e-01 -1.827881968351337e-01 -4.499858151555730e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.500000000000000e+02 6.807103472083096e-01 -7.079607323793300e-01 -1.827560284050028e-01 -4.500287428703820e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.510000000000000e+02 6.807123000235670e-01 -7.079668867743577e-01 -1.827238543838677e-01 -4.500716461578460e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.520000000000000e+02 6.807142534872245e-01 -7.079730406109251e-01 -1.826916747090908e-01 -4.501145253643870e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.530000000000000e+02 6.807162076071777e-01 -7.079791938822150e-01 -1.826594893733536e-01 -4.501573805522380e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.540000000000000e+02 6.807181623060411e-01 -7.079853466455538e-01 -1.826272984489629e-01 -4.502002113610010e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.550000000000000e+02 6.807201176632410e-01 -7.079914988416366e-01 -1.825951018588372e-01 -4.502430181221130e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.560000000000000e+02 6.807220736585090e-01 -7.079976504838594e-01 -1.825628996241920e-01 -4.502858008200500e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.570000000000000e+02 6.807240302473074e-01 -7.080038016054792e-01 -1.825306917852352e-01 -4.503285592160440e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.580000000000000e+02 6.807259875027123e-01 -7.080099521519357e-01 -1.824984782708074e-01 -4.503712936134690e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.590000000000000e+02 6.807279453417535e-01 -7.080161021847218e-01 -1.824662591585503e-01 -4.504140036269920e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.600000000000000e+02 6.807299038336975e-01 -7.080222516494622e-01 -1.824340343871619e-01 -4.504566897066450e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.610000000000000e+02 6.807318629667408e-01 -7.080284005573719e-01 -1.824018039601574e-01 -4.504993516177940e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.620000000000000e+02 6.807338226858302e-01 -7.080345489457980e-01 -1.823695679365381e-01 -4.505419893081690e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.630000000000000e+02 6.807357830503799e-01 -7.080406967725612e-01 -1.823373262529522e-01 -4.505846028812930e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.640000000000000e+02 6.807377440639806e-01 -7.080468440329223e-01 -1.823050789088007e-01 -4.506271924503720e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.650000000000000e+02 6.807397056552275e-01 -7.080529907790288e-01 -1.822728259725109e-01 -4.506697577275010e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.660000000000000e+02 6.807416678960652e-01 -7.080591369593643e-01 -1.822405673687968e-01 -4.507122988717470e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.670000000000000e+02 6.807436307805834e-01 -7.080652825740191e-01 -1.822083031113624e-01 -4.507548160941980e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.680000000000000e+02 6.807455942449967e-01 -7.080714276724660e-01 -1.821760332543794e-01 -4.507973089539750e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.690000000000000e+02 6.807475583582121e-01 -7.080775722013274e-01 -1.821437577350872e-01 -4.508397778533580e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.700000000000000e+02 6.807495231100620e-01 -7.080837161698509e-01 -1.821114765572078e-01 -4.508822226114910e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.710000000000000e+02 6.807514884451850e-01 -7.080898596163767e-01 -1.820791897783101e-01 -4.509246431277890e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.720000000000000e+02 6.807534544423335e-01 -7.080960024832067e-01 -1.820468973191290e-01 -4.509670396615490e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.730000000000000e+02 6.807554210228176e-01 -7.081021448260580e-01 -1.820145992594473e-01 -4.510094120088160e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.740000000000000e+02 6.807573882392532e-01 -7.081082866081659e-01 -1.819822955414662e-01 -4.510517602201180e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.750000000000000e+02 6.807593561051585e-01 -7.081144278162731e-01 -1.819499861577594e-01 -4.510940845226630e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.760000000000000e+02 6.807613245471359e-01 -7.081205685059022e-01 -1.819176711743164e-01 -4.511363845025670e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.770000000000000e+02 6.807632936272958e-01 -7.081267086294700e-01 -1.818853505330568e-01 -4.511786604857500e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.780000000000000e+02 6.807652633546568e-01 -7.081328481796877e-01 -1.818530242246962e-01 -4.512209125162740e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.790000000000000e+02 6.807672336486459e-01 -7.081389872181768e-01 -1.818206923203216e-01 -4.512631401016290e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.800000000000000e+02 6.807692045960232e-01 -7.081451256763670e-01 -1.817883547444964e-01 -4.513053438404330e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.810000000000000e+02 6.807711761716351e-01 -7.081512635742973e-01 -1.817560115161019e-01 -4.513475235086060e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.820000000000000e+02 6.807731483341586e-01 -7.081574009417341e-01 -1.817236626749872e-01 -4.513896789508200e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.830000000000000e+02 6.807751211464188e-01 -7.081635377313235e-01 -1.816913081605091e-01 -4.514318104496230e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.840000000000000e+02 6.807770945415387e-01 -7.081696739929957e-01 -1.816589480342367e-01 -4.514739176662900e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.850000000000000e+02 6.807790685731693e-01 -7.081758096847086e-01 -1.816265822478663e-01 -4.515160009362310e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.860000000000000e+02 6.807810432430113e-01 -7.081819448049966e-01 -1.815942107982048e-01 -4.515580602477600e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.870000000000000e+02 6.807830184844125e-01 -7.081880794028822e-01 -1.815618337483745e-01 -4.516000953096380e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.880000000000000e+02 6.807849943642746e-01 -7.081942134298039e-01 -1.815294510295447e-01 -4.516421063063060e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.890000000000000e+02 6.807869708857051e-01 -7.082003468802595e-01 -1.814970626441921e-01 -4.516840934189250e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.900000000000000e+02 6.807889479711839e-01 -7.082064798128702e-01 -1.814646686623046e-01 -4.517260562145490e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.910000000000000e+02 6.807909257043773e-01 -7.082126121643321e-01 -1.814322690043164e-01 -4.517679950921920e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.920000000000000e+02 6.807929040608919e-01 -7.082187439530008e-01 -1.813998636910308e-01 -4.518099099009130e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.930000000000000e+02 6.807948829980202e-01 -7.082248752089418e-01 -1.813674527653983e-01 -4.518518005255610e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.940000000000000e+02 6.807968625706520e-01 -7.082310058895476e-01 -1.813350361770212e-01 -4.518936672841060e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.950000000000000e+02 6.807988427745676e-01 -7.082371360007492e-01 -1.813026139213409e-01 -4.519355099519470e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.960000000000000e+02 6.808008235496430e-01 -7.082432655837332e-01 -1.812701860623031e-01 -4.519773284530540e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.970000000000000e+02 6.808028049778222e-01 -7.082493945776093e-01 -1.812377525192185e-01 -4.520191231089780e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.980000000000000e+02 6.808047869844066e-01 -7.082555230385364e-01 -1.812053133603006e-01 -4.520608935222300e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>6.990000000000000e+02 6.808067696151456e-01 -7.082616509318331e-01 -1.811728685412241e-01 -4.521026399003330e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.000000000000000e+02 6.808087528808324e-01 -7.082677782470129e-01 -1.811404180553752e-01 -4.521443624120280e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.010000000000000e+02 6.808107367189448e-01 -7.082739050315358e-01 -1.811079619584937e-01 -4.521860606904870e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.020000000000000e+02 6.808127211848252e-01 -7.082800312431887e-01 -1.810755001979677e-01 -4.522277350093610e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.030000000000000e+02 6.808147062875297e-01 -7.082861568746440e-01 -1.810430327644590e-01 -4.522693854130610e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.040000000000000e+02 6.808166919547797e-01 -7.082922819791505e-01 -1.810105597265315e-01 -4.523110115844970e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.050000000000000e+02 6.808186782542116e-01 -7.082984065056950e-01 -1.809780810189561e-01 -4.523526138288520e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.060000000000000e+02 6.808206651833549e-01 -7.083045304551714e-01 -1.809455966442655e-01 -4.523941921625540e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.070000000000000e+02 6.808226526815658e-01 -7.083106538736483e-01 -1.809131066564336e-01 -4.524357462268660e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.080000000000000e+02 6.808246408266715e-01 -7.083167766999217e-01 -1.808806109865182e-01 -4.524772765356300e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.090000000000000e+02 6.808266295396548e-01 -7.083228989952568e-01 -1.808481097025336e-01 -4.525187825548610e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.100000000000000e+02 6.808286188842521e-01 -7.083290207093024e-01 -1.808156027482012e-01 -4.525602647125950e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.110000000000000e+02 6.808306088556996e-01 -7.083351418457807e-01 -1.807830901256167e-01 -4.526017229450540e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.120000000000000e+02 6.808325993906527e-01 -7.083412624509203e-01 -1.807505718957297e-01 -4.526431569978880e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.130000000000000e+02 6.808345905564706e-01 -7.083473824753863e-01 -1.807180479900354e-01 -4.526845670821170e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.140000000000000e+02 6.808365823478467e-01 -7.083535019206981e-01 -1.806855184172763e-01 -4.527259532948540e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.150000000000000e+02 6.808385747024017e-01 -7.083596208327423e-01 -1.806529832366167e-01 -4.527673153625900e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.160000000000000e+02 6.808405676861033e-01 -7.083657391632148e-01 -1.806204423808666e-01 -4.528086534902890e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.170000000000000e+02 6.808425612949469e-01 -7.083718569141539e-01 -1.805878958540248e-01 -4.528499676875270e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.180000000000000e+02 6.808445554663316e-01 -7.083779741301267e-01 -1.805553437189790e-01 -4.528912577730150e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.190000000000000e+02 6.808465502650366e-01 -7.083840907651980e-01 -1.805227859061624e-01 -4.529325238532250e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.200000000000000e+02 6.808485456872755e-01 -7.083902068182659e-01 -1.804902224263644e-01 -4.529737661253660e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.210000000000000e+02 6.808505416740982e-01 -7.083963223345281e-01 -1.804576533311229e-01 -4.530149842143130e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.220000000000000e+02 6.808525383000187e-01 -7.084024372581978e-01 -1.804250785475814e-01 -4.530561784332790e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.230000000000000e+02 6.808545354967350e-01 -7.084085516369897e-01 -1.803924981467175e-01 -4.530973486453200e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.240000000000000e+02 6.808565333097875e-01 -7.084146654400594e-01 -1.803599120755737e-01 -4.531384948245440e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.250000000000000e+02 6.808585317482313e-01 -7.084207786567212e-01 -1.803273203326689e-01 -4.531796172255330e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.260000000000000e+02 6.808605307461827e-01 -7.084268913377275e-01 -1.802947229753115e-01 -4.532207154186230e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.270000000000000e+02 6.808625303655046e-01 -7.084330034355817e-01 -1.802621199454352e-01 -4.532617897309750e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.280000000000000e+02 6.808645306111482e-01 -7.084391149463797e-01 -1.802295112367289e-01 -4.533028401655080e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.290000000000000e+02 6.808665314136469e-01 -7.084452259209501e-01 -1.801968969160628e-01 -4.533438664397530e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.300000000000000e+02 6.808685328387164e-01 -7.084513363089135e-01 -1.801642769216742e-01 -4.533848688982390e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.310000000000000e+02 6.808705348799348e-01 -7.084574461156008e-01 -1.801316512563733e-01 -4.534258474463640e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.320000000000000e+02 6.808725374849748e-01 -7.084635553786779e-01 -1.800990199715337e-01 -4.534668019014930e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.330000000000000e+02 6.808745407264242e-01 -7.084696640445132e-01 -1.800663829943334e-01 -4.535077325221610e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.340000000000000e+02 6.808765445274881e-01 -7.084757721686717e-01 -1.800337404004194e-01 -4.535486390395650e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.350000000000000e+02 6.808785489501280e-01 -7.084818797050537e-01 -1.800010921280964e-01 -4.535895216883330e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.360000000000000e+02 6.808805539885986e-01 -7.084879866566256e-01 -1.799684381839022e-01 -4.536303804935630e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.370000000000000e+02 6.808825595851908e-01 -7.084940930654516e-01 -1.799357786234989e-01 -4.536712152250130e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.380000000000000e+02 6.808845657958876e-01 -7.085001988895191e-01 -1.799031133917713e-01 -4.537120261140240e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.390000000000000e+02 6.808865726322215e-01 -7.085063041218627e-01 -1.798704424717370e-01 -4.537528130763220e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.400000000000000e+02 6.808885800162574e-01 -7.085124088174284e-01 -1.798377659436623e-01 -4.537935759310230e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.410000000000000e+02 6.808905880228995e-01 -7.085185129211795e-01 -1.798050837316965e-01 -4.538343149243010e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.420000000000000e+02 6.808925966404363e-01 -7.085246164397966e-01 -1.797723958498352e-01 -4.538750301011960e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.430000000000000e+02 6.808946058156794e-01 -7.085307194127197e-01 -1.797397023476891e-01 -4.539157212047940e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.440000000000000e+02 6.808966156077765e-01 -7.085368217959314e-01 -1.797070031662165e-01 -4.539563884575310e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.450000000000000e+02 6.808986260138759e-01 -7.085429235909795e-01 -1.796742983074390e-01 -4.539970318507640e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.460000000000000e+02 6.809006369722996e-01 -7.085490248429075e-01 -1.796415878308517e-01 -4.540376511360940e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.470000000000000e+02 6.809026485667781e-01 -7.085551254882401e-01 -1.796088716563944e-01 -4.540782467161120e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.480000000000000e+02 6.809046607166711e-01 -7.085612255861896e-01 -1.795761498617157e-01 -4.541188182573490e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.490000000000000e+02 6.809066734762103e-01 -7.085673250978856e-01 -1.795434223889629e-01 -4.541593658670240e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.500000000000000e+02 6.809086868482833e-01 -7.085734240172480e-01 -1.795106892425292e-01 -4.541998897723170e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.510000000000000e+02 6.809107007753857e-01 -7.085795223902923e-01 -1.794779504683220e-01 -4.542403894865620e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.520000000000000e+02 6.809127153146730e-01 -7.085856201711339e-01 -1.794452060170373e-01 -4.542808654336990e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.530000000000000e+02 6.809147304700425e-01 -7.085917173566478e-01 -1.794124558833610e-01 -4.543213176120150e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.540000000000000e+02 6.809167461612653e-01 -7.085978140072384e-01 -1.793797001410882e-01 -4.543617455961240e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.550000000000000e+02 6.809187624832950e-01 -7.086039100509950e-01 -1.793469386994671e-01 -4.544021498396970e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.560000000000000e+02 6.809207794036682e-01 -7.086100055097396e-01 -1.793141715932427e-01 -4.544425303178730e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.570000000000000e+02 6.809227968779552e-01 -7.086161004178703e-01 -1.792813988601950e-01 -4.544828867191410e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.580000000000000e+02 6.809248149786700e-01 -7.086221947206348e-01 -1.792486204300674e-01 -4.545232193730730e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.590000000000000e+02 6.809268336361344e-01 -7.086282884690779e-01 -1.792158363700675e-01 -4.545635279947880e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.600000000000000e+02 6.809288528965587e-01 -7.086343816288192e-01 -1.791830466334801e-01 -4.546038127492950e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.610000000000000e+02 6.809308727638658e-01 -7.086404741944884e-01 -1.791502512202048e-01 -4.546440737751010e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.620000000000000e+02 6.809328931891661e-01 -7.086465662034507e-01 -1.791174501731815e-01 -4.546843107638470e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.630000000000000e+02 6.809349142121880e-01 -7.086526576250545e-01 -1.790846434545153e-01 -4.547245239215630e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.640000000000000e+02 6.809369358509707e-01 -7.086587484448578e-01 -1.790518310470846e-01 -4.547647133568360e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.650000000000000e+02 6.809389580280220e-01 -7.086648387212425e-01 -1.790190130221216e-01 -4.548048786559470e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.660000000000000e+02 6.809409808169218e-01 -7.086709283971335e-01 -1.789861893119021e-01 -4.548450202472730e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.670000000000000e+02 6.809430042157032e-01 -7.086770174745259e-01 -1.789533599149803e-01 -4.548851380560880e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.680000000000000e+02 6.809450281540091e-01 -7.086831060049913e-01 -1.789205248992581e-01 -4.549252317939930e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.690000000000000e+02 6.809470526996855e-01 -7.086891939372164e-01 -1.788876841989991e-01 -4.549653017703370e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.700000000000000e+02 6.809490778541782e-01 -7.086952812695326e-01 -1.788548378121055e-01 -4.550053479957960e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.710000000000000e+02 6.809511035558852e-01 -7.087013680477118e-01 -1.788219857963538e-01 -4.550453701745240e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.720000000000000e+02 6.809531298739107e-01 -7.087074542187775e-01 -1.787891280864303e-01 -4.550853686681940e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.730000000000000e+02 6.809551567347115e-01 -7.087135398378043e-01 -1.787562647506948e-01 -4.551253431037690e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.740000000000000e+02 6.809571842084384e-01 -7.087196248498925e-01 -1.787233957255401e-01 -4.551652939180000e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.750000000000000e+02 6.809592122855965e-01 -7.087257092648864e-01 -1.786905210115027e-01 -4.552052208621420e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.760000000000000e+02 6.809612408943675e-01 -7.087317931328768e-01 -1.786576406840331e-01 -4.552451238042590e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.770000000000000e+02 6.809632701153938e-01 -7.087378763948103e-01 -1.786247546607199e-01 -4.552850029950050e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.780000000000000e+02 6.809652999391334e-01 -7.087439590557560e-01 -1.785918629534919e-01 -4.553248584889750e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.790000000000000e+02 6.809673302969796e-01 -7.087500411674791e-01 -1.785589656251333e-01 -4.553646899116820e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.800000000000000e+02 6.809693612624313e-01 -7.087561226736718e-01 -1.785260626061762e-01 -4.554044976452320e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.810000000000000e+02 6.809713928294867e-01 -7.087622035793449e-01 -1.784931538990471e-01 -4.554442815966870e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.820000000000000e+02 6.809734249366683e-01 -7.087682839290854e-01 -1.784602395640665e-01 -4.554840415403300e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.830000000000000e+02 6.809754576576139e-01 -7.087743636668711e-01 -1.784273195306426e-01 -4.555237778355030e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.840000000000000e+02 6.809774909284921e-01 -7.087804428394224e-01 -1.783943938604884e-01 -4.555634902224500e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.850000000000000e+02 6.809795247865806e-01 -7.087865214201099e-01 -1.783614625127611e-01 -4.556031787566800e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.860000000000000e+02 6.809815592580190e-01 -7.087925993873060e-01 -1.783285254651504e-01 -4.556428436537280e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.870000000000000e+02 6.809835942614045e-01 -7.087986768016250e-01 -1.782955827945016e-01 -4.556824845276870e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.880000000000000e+02 6.809856298581493e-01 -7.088047536168951e-01 -1.782626344402904e-01 -4.557221016364830e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.890000000000000e+02 6.809876660630629e-01 -7.088108298203344e-01 -1.782296803902026e-01 -4.557616951212150e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.900000000000000e+02 6.809897027959312e-01 -7.088169054724142e-01 -1.781967207182155e-01 -4.558012645544500e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.910000000000000e+02 6.809917401362764e-01 -7.088229805134013e-01 -1.781637553464046e-01 -4.558408102760380e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.920000000000000e+02 6.809937780645423e-01 -7.088290549558639e-01 -1.781307842963182e-01 -4.558803322952690e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.930000000000000e+02 6.809958165329454e-01 -7.088351288356377e-01 -1.780978076116843e-01 -4.559198303543690e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.940000000000000e+02 6.809978555933653e-01 -7.088412021129333e-01 -1.780648252428481e-01 -4.559593047151980e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.950000000000000e+02 6.809998952571137e-01 -7.088472747786925e-01 -1.780318371782307e-01 -4.559987554330640e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.960000000000000e+02 6.810019354521004e-01 -7.088533468876873e-01 -1.779988434831693e-01 -4.560381820935310e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.970000000000000e+02 6.810039762578107e-01 -7.088594183787453e-01 -1.779658440831257e-01 -4.560775851298640e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.980000000000000e+02 6.810060176050697e-01 -7.088654893026132e-01 -1.779328390450043e-01 -4.561169642575130e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>7.990000000000000e+02 6.810080595429023e-01 -7.088715596219997e-01 -1.778998283210010e-01 -4.561563197022770e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.000000000000000e+02 6.810101020781255e-01 -7.088776293319464e-01 -1.778668119021065e-01 -4.561956514524570e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.010000000000000e+02 6.810121451376883e-01 -7.088836984861102e-01 -1.778337898589654e-01 -4.562349592057990e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.020000000000000e+02 6.810141887990662e-01 -7.088897670266296e-01 -1.778007621146855e-01 -4.562742432701820e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.030000000000000e+02 6.810162330521961e-01 -7.088958349582328e-01 -1.777677286834468e-01 -4.563135037444490e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.040000000000000e+02 6.810182778329679e-01 -7.089019023312081e-01 -1.777346896194735e-01 -4.563527401563940e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.050000000000000e+02 6.810203232075799e-01 -7.089079690920732e-01 -1.777016448662802e-01 -4.563919530200060e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.060000000000000e+02 6.810223691734331e-01 -7.089140352458700e-01 -1.776685944169317e-01 -4.564311420941110e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.070000000000000e+02 6.810244156743013e-01 -7.089201008310853e-01 -1.776355383320309e-01 -4.564703073158420e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.080000000000000e+02 6.810264627770446e-01 -7.089261657985555e-01 -1.776024765430099e-01 -4.565094488984420e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.090000000000000e+02 6.810285104226231e-01 -7.089322301918273e-01 -1.775694091062104e-01 -4.565485665793490e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.100000000000000e+02 6.810305586443592e-01 -7.089382939842455e-01 -1.775363359914986e-01 -4.565876605837320e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.110000000000000e+02 6.810326074653478e-01 -7.089443571590238e-01 -1.775032571733386e-01 -4.566267309503310e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.120000000000000e+02 6.810346568094643e-01 -7.089504197721435e-01 -1.774701727253826e-01 -4.566657773623850e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.130000000000000e+02 6.810367067459103e-01 -7.089564817711747e-01 -1.774370825803762e-01 -4.567048001376540e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.140000000000000e+02 6.810387572721706e-01 -7.089625431570388e-01 -1.774039867408901e-01 -4.567437992923030e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.150000000000000e+02 6.810408083217846e-01 -7.089686039806952e-01 -1.773708852660710e-01 -4.567827744130390e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.160000000000000e+02 6.810428599569692e-01 -7.089746641919925e-01 -1.773377781023370e-01 -4.568217259730110e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.170000000000000e+02 6.810449121886879e-01 -7.089807237832272e-01 -1.773046652358094e-01 -4.568606539560540e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.180000000000000e+02 6.810469649423324e-01 -7.089867828114678e-01 -1.772715467334860e-01 -4.568995579117810e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.190000000000000e+02 6.810490182762355e-01 -7.089928412309413e-01 -1.772384225420232e-01 -4.569384382024000e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.200000000000000e+02 6.810510722065449e-01 -7.089988990271111e-01 -1.772052926495194e-01 -4.569772950222150e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.210000000000000e+02 6.810531266556628e-01 -7.090049562603973e-01 -1.771721571232530e-01 -4.570161278370090e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.220000000000000e+02 6.810551817101914e-01 -7.090110128638626e-01 -1.771390158825626e-01 -4.570549371372280e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.230000000000000e+02 6.810572372911720e-01 -7.090170688967409e-01 -1.771058690012700e-01 -4.570937225225740e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.240000000000000e+02 6.810592934599027e-01 -7.090231243124995e-01 -1.770727164196713e-01 -4.571324842754930e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.250000000000000e+02 6.810613502063598e-01 -7.090291791176860e-01 -1.770395581475625e-01 -4.571712223780550e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.260000000000000e+02 6.810634074798574e-01 -7.090352333492478e-01 -1.770063942341844e-01 -4.572099366282570e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.270000000000000e+02 6.810654653331903e-01 -7.090412869666515e-01 -1.769732246288753e-01 -4.572486272934330e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.280000000000000e+02 6.810675237761251e-01 -7.090473399641873e-01 -1.769400493162878e-01 -4.572872942819650e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.290000000000000e+02 6.810695827351571e-01 -7.090533923940712e-01 -1.769068683719928e-01 -4.573259374049080e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.300000000000000e+02 6.810716422795037e-01 -7.090594442041902e-01 -1.768736817277645e-01 -4.573645569576060e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.310000000000000e+02 6.810737024046939e-01 -7.090654953984015e-01 -1.768404893845741e-01 -4.574031528538560e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.320000000000000e+02 6.810757630529478e-01 -7.090715460186111e-01 -1.768072913993834e-01 -4.574417248825620e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.330000000000000e+02 6.810778242969725e-01 -7.090775960093723e-01 -1.767740877022290e-01 -4.574802734016340e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.340000000000000e+02 6.810798860660643e-01 -7.090836454226515e-01 -1.767408783616552e-01 -4.575187981177660e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.350000000000000e+02 6.810819484087633e-01 -7.090896942229294e-01 -1.767076633267141e-01 -4.575572991624150e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.360000000000000e+02 6.810840113444374e-01 -7.090957423950847e-01 -1.766744425780280e-01 -4.575957766279200e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.370000000000000e+02 6.810860747875246e-01 -7.091017900007616e-01 -1.766412162019485e-01 -4.576342302466930e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.380000000000000e+02 6.810881388119088e-01 -7.091078369854313e-01 -1.766079841231059e-01 -4.576726602656120e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.390000000000000e+02 6.810902034157582e-01 -7.091138833487657e-01 -1.765747463451501e-01 -4.577110667506850e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t\t<ATTLIST>8.400000000000000e+02 6.810922685419595e-01 -7.091199291347565e-01 -1.765415029183413e-01 -4.577494493299320e-02 3.970000000000000e-12 3.710000000000000e-12 2.750000000000000e-13 5.580000000000000e-13 4.010000000000000e-12 -1.830000000000000e-12 6.770000000000000e-13 8.630000000000000e-12 -2.560000000000000e-12 8.390000000000000e-12</ATTLIST>\n\t\t</ATTLISTList>\n\t</ATT>\n\t<TIL>monkey</TIL>\n\t<GEO>\n\t\t<EFFECTIVETIME>1959-09-18T00:00:00.000000Z</EFFECTIVETIME>\n\t\t<MODELGENERATIONTIME>1959-12-16T00:00:00.000000Z</MODELGENERATIONTIME>\n\t\t<SATID>Imaginary1</SATID>\n\t\t<PRINCIPAL_DISTANCE>\n\t\t\t<GENERATIONTIME>1959-12-05T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<PD>7.949165000000000e+03</PD>\n\t\t</PRINCIPAL_DISTANCE>\n\t\t<OPTICAL_DISTORTION>\n\t\t\t<GENERATIONTIME>1958-01-01T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<POLYORDER>0</POLYORDER>\n\t\t\t<ALIST>0.000000000000000e+00</ALIST>\n\t\t\t<BLIST>0.000000000000000e+00</BLIST>\n\t\t</OPTICAL_DISTORTION>\n\t\t<PERSPECTIVE_CENTER>\n\t\t\t<GENERATIONTIME>1958-01-01T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<CX>0.000000000000000e+00</CX>\n\t\t\t<CY>0.000000000000000e+00</CY>\n\t\t\t<CZ>0.000000000000000e+00</CZ>\n\t\t</PERSPECTIVE_CENTER>\n\t\t<CAMERA_ATTITUDE>\n\t\t\t<GENERATIONTIME>1959-06-08T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<QCS1>0.000000000000000e+00</QCS1>\n\t\t\t<QCS2>0.000000000000000e+00</QCS2>\n\t\t\t<QCS3>0.000000000000000e+00</QCS3>\n\t\t\t<QCS4>1.000000000000000e+00</QCS4>\n\t\t</CAMERA_ATTITUDE>\n\t\t<DETECTOR_MOUNTING>\n\t\t\t<GENERATIONTIME>1959-12-16T00:00:00.000000Z</GENERATIONTIME>\n\t\t\t<BAND_P>\n\t\t\t\t<BANDID>P</BANDID>\n\t\t\t\t<DETECTOR_ARRAY>\n\t\t\t\t\t<DETARRID>1</DETARRID>\n\t\t\t\t\t<DETORIGINX>5.372000000000000e-02</DETORIGINX>\n\t\t\t\t\t<DETORIGINY>1.407119300000000e+02</DETORIGINY>\n\t\t\t\t\t<DETROTANGLE>0.000000000000000e+00</DETROTANGLE>\n\t\t\t\t\t<DETPITCH>8.000000000000000e-03</DETPITCH>\n\t\t\t\t</DETECTOR_ARRAY>\n\t\t\t</BAND_P>\n\t\t</DETECTOR_MOUNTING>\n\t</GEO>\n        \t<RPB>\n\t\t<SATID>IMAGINE01</SATID>\n\t\t<BANDID>P</BANDID>\n\t\t<SPECID>RPC00Y</SPECID>\n\t\t<IMAGE>\n\t\t\t<LINEOFFSET>11856</LINEOFFSET>\n\t\t\t<SAMPOFFSET>17564</SAMPOFFSET>\n\t\t\t<LATOFFSET>3.774540000000000e+01</LATOFFSET>\n\t\t\t<LONGOFFSET>-1.032903000000000e+02</LONGOFFSET>\n\t\t\t<HEIGHTOFFSET>2287</HEIGHTOFFSET>\n\t\t\t<LINESCALE>12383</LINESCALE>\n\t\t\t<SAMPSCALE>17929</SAMPSCALE>\n\t\t\t<LATSCALE>1.003050000000000e-01</LATSCALE>\n\t\t\t<LONGSCALE>1.345060000000000e-01</LONGSCALE>\n\t\t\t<HEIGHTSCALE>638</HEIGHTSCALE>\n\t\t\t<LINENUMCOEFList>\n\t\t\t\t<LINENUMCOEF>4.64662000000000e-03 2.746477000000000e-01 -1.231100000000000e+00 4.273921000000000e-02 1.233612000000000e-04 2.079892000000000e-05 2.803797000000000e-05 -1.625616000000000e-03 -3.560082000000000e-03 9.375819999999999e-06 -2.546898000000000e-06 2.437124000000000e-06 2.683441000000000e-05 2.832873000000000e-06 -1.765243000000000e-05 -6.187956999999999e-05 -1.335746000000000e-05 4.754263000000000e-07 8.598401000000000e-06 4.395393000000000e-06</LINENUMCOEF>\n\t\t\t</LINENUMCOEFList>\n\t\t\t<LINEDENCOEFList>\n\t\t\t\t<LINEDENCOEF>1.000000000000000e+00 -7.927463000000000e-04 1.274485000000000e-03 -1.732948000000000e-04 3.733725000000000e-05 -2.416451000000000e-06 5.358107000000000e-06 5.2042993000000000e-06 -5.045604000000000e-05 1.005969000000000e-05 -1.014973000000000e-05 3.421277000000000e-06 2.035450000000000e-04 -8.247975000000000e-08 -4.562828000000000e-05 -3.053413000000000e-04 3.611736000000000e-07 1.162165000000000e-06 2.272529000000000e-05 -3.711560000000000e-08</LINEDENCOEF>\n\t\t\t</LINEDENCOEFList>\n\t\t\t<SAMPNUMCOEFList>\n\t\t\t\t<SAMPNUMCOEF>-7.306375000000000e-03 9.830429000000001e-01 3.542948000000000e-03 -1.894230000000000e-02 -6.090531000000000e-04 5.183200000000000e-04 -1.865072000000000e-04 7.436490000000000e-03 -6.180940000000000e-04 -7.676881000000001e-06 -4.251489000000000e-06 3.392046000000000e-05 7.682103000000000e-06 -3.827847000000000e-06 1.743396000000000e-05 -8.450706000000000e-05 -8.998127000000000e-07 7.975684000000000e-06 9.288044000000000e-06 -1.585929000000000e-06</SAMPNUMCOEF>\n\t\t\t</SAMPNUMCOEFList>\n\t\t\t<SAMPDENCOEFList>\n\t\t\t\t<SAMPDENCOEF>1.000000000000000e+00 -1.162718000000000e-04 6.204958000000000e-04 -6.463894000000000e-04 -1.800104000000000e-05 -3.829136000000000e-06 2.878440000000000e-06 1.192222000000000e-05 -1.355693000000000e-05 -5.064440000000000e-06 -4.852090000000000e-08 -4.637834000000000e-08 5.601284000000000e-07 2.741121000000000e-08 -8.104437000000000e-07 7.045655000000000e-07 0.000000000000000e+00 -5.420071000000000e-08 -5.402048000000000e-08 -1.211995000000000e-07</SAMPDENCOEF>\n\t\t\t</SAMPDENCOEFList>\n\t\t</IMAGE>\n\t</RPB>\n</isd>\n"
  },
  {
    "path": "src/asp/SfS/CMakeLists.txt",
    "content": "# Use wrapper function at this level to avoid code duplication\n\nadd_library_wrapper(AspSfS \"${ASP_SfS_SRC_FILES}\" \"${ASP_SfS_TEST_FILES}\"\n    \"${ASP_SfS_LIB_DEPENDENCIES}\")\n"
  },
  {
    "path": "src/asp/SfS/SfsArgs.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/SfS/SfsArgs.h>\n#include <asp/Core/AspProgramOptions.h>\n#include <asp/Core/AspLog.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/SfS/SfsUtils.h>\n#include <asp/Core/FileUtils.h>\n#include <asp/SfS/SfsModel.h>\n\n#include <vw/FileIO/FileUtils.h>\n\n#include <boost/program_options.hpp>\n#include <boost/filesystem.hpp>\n\nnamespace po = boost::program_options;\nnamespace fs = boost::filesystem;\n\nnamespace asp {\n\nvoid handleSfsArgs(int argc, char *argv[], SfsOptions& opt) {\n  double nan = std::numeric_limits<double>::quiet_NaN();\n  po::options_description general_options(\"\");\n  general_options.add_options()\n  (\"input-dem,i\",\n  po::value(&opt.input_dem),\n   \"The input DEM to refine using SfS.\")\n  (\"image-list\",\n  po::value(&opt.image_list)->default_value(\"\"),\n   \"A file containing the list of images, when they are too many to specify on the \"\n   \"command line. Use space or newline as separator. See also --camera-list and \"\n   \"--mapprojected-data-list.\")\n  (\"camera-list\",\n  po::value(&opt.camera_list)->default_value(\"\"),\n   \"A file containing the list of cameras, when they are too many to specify on the \"\n   \"command line. If the images have embedded camera information, such as for ISIS, \"\n   \"this file must be empty but must be specified if --image-list is specified.\")\n  (\"output-prefix,o\",\n  po::value(&opt.out_prefix),\n   \"Prefix for output filenames.\")\n  (\"max-iterations,n\",\n  po::value(&opt.max_iterations)->default_value(10),\n   \"Set the maximum number of iterations. Normally 5-10 iterations is enough, even \"\n   \"when convergence is not reached, as the solution usually improves quickly at \"\n   \"first and only very fine refinements happen later.\")\n  (\"reflectance-type\",\n  po::value(&opt.reflectance_type)->default_value(1),\n   \"Reflectance type: 0 = Lambertian, 1 = Lunar-Lambert, 2 = Hapke, 3 = Experimental \"\n   \"extension of Lunar-Lambert, 4 = Charon model (a variation of Lunar-Lambert).\")\n  (\"smoothness-weight\",\n  po::value(&opt.smoothness_weight)->default_value(0.04),\n   \"The weight given to the cost function term which consists of sums of squares of \"\n   \"second-order derivatives. A larger value will result in a smoother solution with \"\n   \"fewer artifacts. See also --gradient-weight.\")\n  (\"initial-dem-constraint-weight\",\n  po::value(&opt.initial_dem_constraint_weight)->default_value(0),\n   \"A larger value will try harder to keep the SfS-optimized DEM closer to the initial \"\n   \"guess DEM. A value between 0.0001 and 0.001 may work, unless your initial DEM is \"\n   \"very unreliable.\")\n  (\"bundle-adjust-prefix\",\n  po::value(&opt.bundle_adjust_prefix),\n   \"Use the camera adjustments obtained by previously running bundle_adjust with this \"\n   \"output prefix.\")\n  (\"input-albedo\",\n  po::value(&opt.input_albedo),\n   \"The input albedo image, if known. Must have same dimensions as the input DEM. \"\n   \"Otherwise it is initialized to 1. Can be refined with --float-albedo.\")\n  (\"float-albedo\",  \n  po::bool_switch(&opt.float_albedo)->default_value(false)->implicit_value(true),\n   \"Float the albedo for each pixel. Will give incorrect results if only one image is \"\n   \"present. The albedo is normalized, its nominal value is 1.\")\n  (\"float-exposure\",  \n  po::bool_switch(&opt.float_exposure)->default_value(false)->implicit_value(true),\n   \"Float the exposure for each image. Will give incorrect results if only one image is \"\n   \"present. It usually gives marginal results.\")\n  (\"model-shadows\",  \n  po::bool_switch(&opt.model_shadows)->default_value(false)->implicit_value(true),\n   \"Model the fact that some points on the DEM are in the shadow (occluded from the Sun).\")\n  (\"save-sim-intensity-only\",  \n  po::bool_switch(&opt.save_sim_intensity_only)->default_value(false)->implicit_value(true),\n   \"Save the simulated image intensities at each DEM pixel for the given DEM, images, \"\n   \"cameras, and reflectance model, without refining the DEM. The output files are \"\n   \"of the form <output prefix>-*-sim-intensity.tif. The image exposures \"\n   \"will be computed along the way unless specified via --image-exposures-prefix, and \"\n   \"will be saved in either case to <output prefix>-exposures.txt. Same for haze, if \"\n   \"applicable. See also: --save-meas-intensity-only.\")\n  (\"save-meas-intensity-only\",\n  po::bool_switch(&opt.save_meas_intensity_only)->default_value(false)->implicit_value(true),\n    \"Save the measured image intensities at each DEM pixel for the given DEM, \"\n    \"images, and cameras, without refining the DEM. The output files are \"\n    \"of the form <output prefix>-*-meas-intensity.tif. See also: \"\n    \"--save-sim-intensity-only.\")\n  (\"ref-map\", po::value(&opt.ref_map)->default_value(\"\"),\n    \"Save the simulated or measured intensity images to the extent given by this \"\n    \"mapprojected image. For use with --save-sim-intensity-only and \"\n    \"--save-meas-intensity-only.\")\n  (\"estimate-exposure-haze-albedo\",\n  po::bool_switch(&opt.estim_exposure_haze_albedo)->default_value(false)->implicit_value(true),\n   \"Estimate the exposure for each image, the haze for each image (if --num-haze-coeffs \"\n   \"is positive), and the global low-resolution albedo (if --float-albedo is on), then \"\n   \"quit. This operation samples the input DEM based on --num-samples-for-estim. The \"\n   \"produced estimated exposure, haze, and initial albedo are described in the doc. This \"\n   \"is invoked automatically by parallel_sfs before running sfs proper, unless these \"\n   \"quantities are provided as inputs.\")\n  (\"compute-exposures-only\",\n  po::bool_switch(&opt.compute_exposures_only)->default_value(false)->implicit_value(true),\n   \"This older option is equivalent to --estimate-exposure-haze-albedo.\")\n  (\"estimate-height-errors\",\n  po::bool_switch(&opt.estimate_height_errors)->default_value(false)->implicit_value(true),\n   \"Estimate the SfS DEM height uncertainty (in meters). This option is obsolete. Use \"\n   \"--save-variances instead. This older implementation works by finding the height \"\n   \"perturbation at each grid point which will make at least one of the simulated \"\n   \"images at that point change by more than twice the discrepancy between the \"\n   \"unperturbed simulated image and the measured image. The SfS DEM must be provided \"\n   \"via the -i option. The number of iterations, blending parameters (--blending-dist, \"\n   \"etc.), and smoothness weight are ignored. Results are not computed at image pixels \"\n   \"in shadow. This produces <output prefix>-height-error.tif. No SfS DEM is computed. \"\n   \"See also --height-error-params. This uncertainty may be overly optimistic.\")\n  (\"height-error-params\", \n  po::value(&opt.height_error_params)->default_value(vw::Vector2(5.0, 100.0), \"5.0 100\"),\n   \"Specify the largest height deviation to examine (in meters), and how many samples to use from 0 to that height.\")\n  (\"sun-positions\",\n  po::value(&opt.sun_positions_list)->default_value(\"\"),\n   \"A file having on each line an image name and three values in double precision \"\n   \"specifying the Sun position in meters in ECEF coordinates (origin is planet center). \"\n   \"Use a space as separator. If not provided, these will be read from the camera files \"\n   \"for ISIS and CSM models.\")\n  (\"sun-angles\",\n  po::value(&opt.sun_angles_list)->default_value(\"\"),\n   \"A file having on each line an image name and two values in double precision \"\n   \"specifying the Sun azimuth and elevation in degrees, relative to the center point of \"\n   \"the input DEM. Use a space as separator. This is an alternative to --sun-positions.\")\n  (\"shadow-thresholds\",\n  po::value(&opt.shadow_thresholds)->default_value(\"\"),\n   \"Optional shadow thresholds for the input images (a list of real values in quotes, \"\n   \"one per image). See also --shadow-threshold.\")\n  (\"shadow-threshold\",\n  po::value(&opt.shadow_threshold)->default_value(-1),\n   \"A shadow threshold to apply to all images. Must be positive. Areas that \"\n   \"are in shadow in all images will result in a blurred version of the input DEM, \"\n   \"influenced by the --smoothness-weight.\")\n  (\"custom-shadow-threshold-list\", \n  po::value(&opt.custom_shadow_threshold_list)->default_value(\"\"),\n   \"A list having one image and one shadow threshold per line. For the images specified \"\n   \"here, override the shadow threshold supplied by other means with this value.\")\n  (\"low-light-threshold\", \n  po::value(&opt.low_light_threshold)->default_value(-1.0),\n   \"A threshold for low-light pixels. If positive, pixels with intensity between \"\n   \"this and the shadow threshold will be given less weight, if other images have higher \"\n   \"intensity values at the same ground point. This helps fix seams. See also \"\n   \"--low-light-weight-power and --low-light-blur-sigma.\")\n  (\"low-light-weight-power\", \n  po::value(&opt.low_light_weight_power)->default_value(4.0),\n   \"With the option --low-light-threshold, the weight of a low-light pixel is inversely \"\n   \"proportional with the discrepancy between the simulated and observed pixel value, \"\n   \"raised to this power.\")\n  (\"low-light-blur-sigma\", \n  po::value(&opt.low_light_blur_sigma)->default_value(3.0),\n   \"With the option --low-light-threshold, apply a Gaussian blur with this sigma to the \"\n   \"low-light weight image, to make it continuous.\")\n  (\"erode-seams\",\n  po::bool_switch(&opt.erode_seams)->default_value(false)->implicit_value(true),\n   \"Be more aggressive in removing seam artifacts, even if this results in erosion of valid \"\n   \"terrain.\")\n  (\"max-valid-image-vals\",\n  po::value(&opt.max_valid_image_vals)->default_value(\"\"),\n   \"Optional values for the largest valid image value in each image (a list of real \"\n   \"values in quotes, one per image).\")\n  (\"robust-threshold\",\n  po::value(&opt.robust_threshold)->default_value(-1.0),\n   \"If positive, set the threshold for the robust measured-to-simulated intensity \"\n   \"difference (using the Cauchy loss). Any difference much larger than this will be \"\n   \"penalized. A good value may be 5% to 25% of the average image value or the same \"\n   \"fraction of the computed image exposure values.\")\n  (\"albedo-constraint-weight\", \n  po::value(&opt.albedo_constraint_weight)->default_value(0),\n   \"If floating the albedo, a larger value will try harder to keep the optimized albedo \"\n   \"close to the initial albedo. See also --input-albedo and --albedo-robust-threshold.\")\n  (\"albedo-robust-threshold\",\n  po::value(&opt.albedo_robust_threshold)->default_value(0),\n   \"If floating the albedo and this threshold is positive, apply a Cauchy loss with this \"\n   \"threshold to the product of the albedo difference and the albedo constraint weight.\")\n  (\"skip-images\",\n  po::value(&opt.skip_images_str)->default_value(\"\"), \n   \"Skip images with these indices (indices start from 0).\")\n  (\"save-dem-with-nodata\",  \n  po::bool_switch(&opt.save_dem_with_nodata)->default_value(false)->implicit_value(true),\n   \"Save a copy of the DEM while using a no-data value at a DEM grid point where all \"\n   \"images show shadows. To be used if shadow thresholds are set.\")\n  (\"use-approx-camera-models\",  \n  po::bool_switch(&opt.use_approx_camera_models)->default_value(false)->implicit_value(true),\n   \"Use approximate camera models for speed. Only with ISIS .cub cameras.\")\n  (\"crop-input-images\",  \n  po::bool_switch(&opt.crop_input_images)->default_value(false)->implicit_value(true),\n   \"Crop the images to a region that was computed to be large enough, and keep them \"\n   \"fully in memory, for speed. This is the default in the latest builds.\")\n  (\"blending-dist\",\n  po::value(&opt.blending_dist)->default_value(0),\n   \"Give less weight to image pixels close to no-data or boundary values. Enabled only \"\n   \"when crop-input-images is true, for performance reasons. Blend over this many pixels.\")\n  (\"blending-power\",\n  po::value(&opt.blending_power)->default_value(2.0),\n   \"A higher value will result in smoother blending.\")\n  (\"min-blend-size\",\n  po::value(&opt.min_blend_size)->default_value(0),\n   \"Do not apply blending in shadowed areas for which both the width and height are less \"\n   \"than this.\")\n  (\"allow-borderline-data\",  \n  po::bool_switch(&opt.allow_borderline_data)->default_value(false)->implicit_value(true),\n   \"At the border of the region where there are no lit pixels in any images, do not let \"\n   \"the blending weights decay to 0. This noticeably improves the level of detail. The \"\n   \"sfs_blend tool may need to be used to further tune this region.\")\n  (\"steepness-factor\",\n  po::value(&opt.steepness_factor)->default_value(1.0),\n   \"Try to make the terrain steeper by this factor. This is not recommended in regular use.\")\n  (\"curvature-in-shadow\",\n  po::value(&opt.curvature_in_shadow)->default_value(0.0),\n   \"Attempt to make the curvature of the DEM (the Laplacian) at points in shadow in all \"\n   \"images equal to this value, which should make the DEM curve down.\")\n  (\"curvature-in-shadow-weight\", \n  po::value(&opt.curvature_in_shadow_weight)->default_value(0.0),\n   \"The weight to give to the curvature in shadow constraint.\")\n  (\"lit-curvature-dist\",\n  po::value(&opt.lit_curvature_dist)->default_value(0.0),\n   \"If using a curvature in shadow, start phasing it in this far from the shadow boundary \"\n   \"in the lit region (in units of pixels).\")\n  (\"shadow-curvature-dist\",\n  po::value(&opt.shadow_curvature_dist)->default_value(0.0),\n   \"If using a curvature in shadow, have it fully phased in this far from shadow boundary \"\n   \"in the shadow region (in units of pixels).\")\n  (\"image-exposures-prefix\",\n  po::value(&opt.image_exposures_prefix)->default_value(\"\"),\n   \"Use this prefix to optionally read initial exposures (filename is \"\n   \"<prefix>-exposures.txt).\")\n  (\"model-coeffs-prefix\",\n  po::value(&opt.model_coeffs_prefix)->default_value(\"\"),\n   \"Use this prefix to optionally read model coefficients from a file (filename is <prefix>-model_coeffs.txt).\")\n  (\"model-coeffs\",\n  po::value(&opt.model_coeffs)->default_value(\"\"),\n   \"Use the reflectance model coefficients specified as a list of numbers in quotes. \"\n   \"Lunar-Lambertian: O, A, B, C, e.g., '1 -0.019 0.000242 -0.00000146'. Hapke: omega, b, \"\n   \"c, B0, h, e.g., '0.68 0.17 0.62 0.52 0.52'. Charon: A, f(alpha), e.g., '0.7 0.63'.\")\n  (\"num-haze-coeffs\",\n  po::value(&opt.num_haze_coeffs)->default_value(0),\n   \"Set this to 1 to model the problem as image = exposure * albedo * reflectance + \"\n   \"haze, where haze is a single value for each image.\")\n  (\"float-haze\",\n  po::bool_switch(&opt.float_haze)->default_value(false)->implicit_value(true),\n   \"If specified, float the haze coefficients as part of the optimization, if \"\n   \"--num-haze-coeffs is 1.\")\n  (\"haze-prefix\",\n  po::value(&opt.image_haze_prefix)->default_value(\"\"),\n   \"Use this prefix to read initial haze values (filename is <haze-prefix>-haze.txt). \"\n   \"The file format is the same as what the tool writes itself, when triggered by the \"\n   \"earlier options. If haze is modeled, it will be initially set to 0 unless read from \"\n   \"such a file, and will be floated or not depending on whether --float-haze is on. \"\n   \"The final haze values will be saved to <output prefix>-haze.txt.\")\n  (\"num-samples-for-estim\",\n  po::value(&opt.num_samples_for_estim)->default_value(200),\n   \"Number of samples to use for estimating the exposure, haze, and albedo. A large \"\n   \"value will result in a more accurate estimate, but will take a lot more memory.\")\n  (\"init-dem-height\",\n  po::value(&opt.init_dem_height)->default_value(nan),\n   \"Use this value for initial DEM heights (measured in meters, relative to the datum). \"\n   \"An input DEM still needs to be provided for georeference information.\")\n  (\"crop-win\", \n  po::value(&opt.crop_win)->default_value(vw::BBox2i(0, 0, 0, 0), \"xoff yoff xsize ysize\"),\n   \"Crop the input DEM to this region before continuing.\")\n  (\"nodata-value\",\n  po::value(&opt.nodata_val)->default_value(nan),\n   \"Use this as the DEM no-data value, over-riding what is in the initial guess DEM.\")\n  (\"fix-dem\",  \n  po::bool_switch(&opt.fix_dem)->default_value(false)->implicit_value(true),\n   \"Do not float the DEM at all. Useful when floating the model params.\")\n  (\"read-exposures\",\n  po::bool_switch(&opt.read_exposures)->default_value(false)->implicit_value(true),\n   \"If specified, read the image exposures with the current output prefix. Useful with a \"\n   \"repeat invocation.\")\n  (\"read-haze\",\n  po::bool_switch(&opt.read_haze)->default_value(false)->implicit_value(true),\n   \"If specified, read the haze values with the current output prefix.\")\n  (\"read-albedo\",\n  po::bool_switch(&opt.read_albedo)->default_value(false)->implicit_value(true),\n   \"If specified, read the computed albedo with the current output prefix.\")\n  (\"float-reflectance-model\",  \n  po::bool_switch(&opt.float_reflectance_model)->default_value(false)->implicit_value(true),\n   \"Allow the coefficients of the reflectance model to float (not recommended).\")\n  (\"integrability-constraint-weight\", \n  po::value(&opt.integrability_weight)->default_value(0.0),\n   \"Use the integrability constraint from Horn 1990 with this value of its weight.\")\n  (\"smoothness-weight-pq\",\n  po::value(&opt.smoothness_weight_pq)->default_value(0.00),\n   \"Smoothness weight for p and q, when the integrability constraint \"\n   \"is used. A larger value will result in a smoother solution \"\n   \"(experimental).\")\n  (\"query\",  \n  po::bool_switch(&opt.query)->default_value(false)->implicit_value(true),\n   \"Print some info and exit. Invoked from parallel_sfs.\")\n  (\"session-type,t\",\n  po::value(&opt.stereo_session)->default_value(\"\"),\n   \"Select the stereo session type to use for processing. Usually the program can select \"\n   \"this automatically by the file extension, except for xml cameras. See the doc for \"\n   \"options.\")\n  (\"gradient-weight\", \n  po::value(&opt.gradient_weight)->default_value(0.0),\n   \"The weight given to the cost function term which consists of sums of squares of \"\n   \"first-order derivatives. A larger value will result in shallower slopes but less \"\n   \"noise. This can be used in conjunction with --smoothness-weight. It is suggested to \"\n   \"experiment with this with a value of 0.0001 - 0.01, while reducing the smoothness \"\n   \"weight to a very small value.\")\n  (\"save-sparingly\",  \n  po::bool_switch(&opt.save_sparingly)->default_value(false)->implicit_value(true),\n   \"Avoid saving any results except the adjustments and the DEM, as that's a lot of files.\")\n  (\"save-variances\",\n  po::bool_switch(&opt.save_variances)->default_value(false)->implicit_value(true),\n   \"Save the variance of the DEM for each pixel. If --float-albedo is on, also save the \"\n   \"variance of the albedo. Note that computing the albedo variance can be ill-posed if \"\n   \"--float-haze and/or --float-exposure is also on.\")\n  (\"save-covariances\",\n   po::bool_switch(&opt.save_covariances)->default_value(false)->implicit_value(true),\n   \"In addition to saving the variance of the DEM (and albedo) at each pixel (as for \"\n   \"--save-variances), also save the covariance between each DEM pixel and its four \"\n   \"horizontal and vertical neighbors, and the same for the albedo if --float-albedo \"\n   \"is on.\")\n  (\"camera-position-step-size\",\n  po::value(&opt.camera_position_step_size)->default_value(1.0),\n   \"Larger step size will result in more aggressiveness in varying the camera position \"\n   \"if it is being floated (which may result in a better solution or in divergence).\");\n\n  general_options.add(vw::GdalWriteOptionsDescription(opt));\n\n  po::options_description positional(\"\");\n  positional.add_options() \n    (\"input-images\", po::value(&opt.input_images));\n\n  po::positional_options_description positional_desc;\n  positional_desc.add(\"input-images\", -1);\n\n  std::string usage(\"-i <input DEM> -n <max iterations> -o <output prefix> <images> [other options]\");\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line(argc, argv, opt, general_options, general_options,\n                            positional, positional_desc, usage,\n                            allow_unregistered, unregistered);\n\n\n  // Sanity checks. Put this early, before separating images from cameras, as that\n  // function can print a message not reflecting the true issue of missing the DEM.\n  if (opt.input_dem.empty())\n    vw::vw_throw(vw::ArgumentErr() << \"Missing the input DEM.\\n\");\n\n  // Always crop the input images. This has been validated enough that it works well.\n  // There is no reason to fully load images in memory except for computing exposures,\n  // when this option will be disabled automatically.\n  opt.crop_input_images = true;\n\n  // Separate the cameras from the images\n  std::vector<std::string> inputs = opt.input_images;\n\n  if (!opt.image_list.empty()) {\n    // Read the images and cameras and put them in 'inputs' to be parsed later\n    if (opt.camera_list.empty())\n      vw::vw_throw(vw::ArgumentErr()\n               << \"The option --image-list must be invoked together with --camera-list.\\n\");\n    if (!inputs.empty())\n      vw::vw_throw(vw::ArgumentErr() << \"The option --image-list was specified, but also \"\n               << \"images or cameras on the command line.\\n\");\n    asp::read_list(opt.image_list, inputs);\n    std::vector<std::string> tmp;\n    asp::read_list(opt.camera_list, tmp);\n    for (size_t it = 0; it < tmp.size(); it++)\n      inputs.push_back(tmp[it]);\n  }\n\n  bool ensure_equal_sizes = true;\n  asp::separate_images_from_cameras(inputs,\n                                    opt.input_images, opt.input_cameras, // outputs\n                                    ensure_equal_sizes);\n\n  if (opt.out_prefix.empty())\n    vw::vw_throw(vw::ArgumentErr() << \"Missing output prefix.\\n\"\n              << usage << general_options);\n\n  if (opt.max_iterations < 0)\n    vw::vw_throw(vw::ArgumentErr() << \"The number of iterations must be non-negative.\\n\"\n              << usage << general_options);\n\n  if (opt.input_images.empty())\n    vw::vw_throw(vw::ArgumentErr() << \"Missing input images.\\n\"\n              << usage << general_options);\n\n  if (opt.smoothness_weight < 0)\n    vw::vw_throw(vw::ArgumentErr() << \"Expecting a non-negative smoothness weight.\\n\");\n\n  if (opt.gradient_weight < 0)\n    vw::vw_throw(vw::ArgumentErr() << \"Expecting a non-negative gradient weight.\\n\");\n\n  if (opt.integrability_weight < 0)\n    vw::vw_throw(vw::ArgumentErr() << \"Expecting a non-negative integrability weight.\\n\");\n\n  if (opt.float_haze && opt.num_haze_coeffs == 0)\n    vw::vw_throw(vw::ArgumentErr() << \"Haze cannot be floated unless there is at least one haze coefficient.\\n\");\n  if (opt.image_haze_prefix != \"\" && opt.num_haze_coeffs == 0)\n    vw::vw_throw(vw::ArgumentErr() << \"Haze cannot be read unless there is at least one haze coefficient.\\n\");\n\n  // There can be 0 or 1 haze coefficients. The modeling of more than one haze\n  // coefficient needs to be looked into.\n  if (opt.num_haze_coeffs < 0 || opt.num_haze_coeffs > g_max_num_haze_coeffs)\n    vw::vw_throw(vw::ArgumentErr() << \"Expecting up to \" << g_max_num_haze_coeffs\n             << \" haze coefficients.\\n\");\n\n  // Curvature in shadow params\n  if (opt.curvature_in_shadow < 0.0 || opt.curvature_in_shadow_weight < 0.0)\n    vw::vw_throw(vw::ArgumentErr() << \"Cannot have negative curvature in shadow or its weight.\\n\");\n  if (opt.lit_curvature_dist < 0.0 || opt.shadow_curvature_dist < 0.0)\n    vw::vw_throw(vw::ArgumentErr() << \"Cannot have negative curvature distances.\\n\");\n  if (opt.curvature_in_shadow > 0.0 &&\n      opt.shadow_curvature_dist + opt.lit_curvature_dist <= 0.0)\n    vw::vw_throw(vw::ArgumentErr() << \"When modeling curvature in shadow, expecting a \"\n             << \"positive value of shadow-curvature-dist or list-curvature-dist.\\n\");\n\n  if (opt.steepness_factor <= 0.0)\n    vw::vw_throw(vw::ArgumentErr() << \"The steepness factor must be positive.\\n\");\n\n  // The options --compute-exposures-only and --estimate-exposure-haze-albedo\n  // are equivalent.\n  if (opt.compute_exposures_only)\n    opt.estim_exposure_haze_albedo = true;\n  if (opt.estim_exposure_haze_albedo)\n    opt.compute_exposures_only = true;\n\n  if (opt.compute_exposures_only || opt.estim_exposure_haze_albedo) {\n    if (opt.use_approx_camera_models || opt.crop_input_images) {\n      vw::vw_out(vw::WarningMessage) \n        << \"When computing exposures only, not using approximate camera models or \"\n        << \"cropping input images.\\n\";\n      // Turn off various settings that are needed only when doing iterations  \n      opt.use_approx_camera_models = false;\n      opt.crop_input_images = false;\n      opt.blending_dist = 0;\n      opt.allow_borderline_data = false;\n      opt.low_light_threshold = -1.0;\n      opt.erode_seams = false;\n    }\n\n    if (!opt.crop_win.empty()) {\n      vw::vw_throw(vw::ArgumentErr() << \"When computing exposures only, cannot crop the \"\n               << \"input DEM as that will give wrong results. Use the full DEM.\\n\");\n    }\n  }\n\n  if (opt.blending_dist > 0 && !opt.crop_input_images)\n    vw::vw_throw(vw::ArgumentErr()\n             << \"A blending distance is only supported with --crop-input-images.\\n\");\n\n  if (opt.allow_borderline_data && !opt.crop_input_images)\n    vw::vw_throw(vw::ArgumentErr() << \"Option --allow-borderline-data needs option \"\n             << \"--crop-input-images.\\n\");\n\n  if (opt.allow_borderline_data && opt.blending_dist <= 0)\n    vw::vw_throw(vw::ArgumentErr()\n                 << \"Option --allow-borderline-data needs a positive --blending-dist.\\n\");\n\n  // Create the output directory\n  vw::create_out_dir(opt.out_prefix);\n\n  // Turn on logging to file\n  asp::log_to_file(argc, argv, \"\", opt.out_prefix);\n\n  // Parse the shadow thresholds\n  std::istringstream ist(opt.shadow_thresholds);\n  opt.shadow_threshold_vec.clear();\n  float val;\n  while (ist >> val)\n    opt.shadow_threshold_vec.push_back(val);\n  if (!opt.shadow_threshold_vec.empty() &&\n      opt.shadow_threshold_vec.size() != opt.input_images.size())\n    vw::vw_throw(vw::ArgumentErr()\n             << \"If specified, there must be as many shadow thresholds as images.\\n\");\n\n  // See if to use opt.shadow_threshold.\n  if (opt.shadow_threshold > 0) {\n    if (!opt.shadow_threshold_vec.empty())\n      vw::vw_throw(vw::ArgumentErr()\n               << \"Cannot specify both --shadow-threshold and --shadow-thresholds.\\n\");\n    while (opt.shadow_threshold_vec.size() < opt.input_images.size())\n      opt.shadow_threshold_vec.push_back(opt.shadow_threshold);\n  }\n\n  // Default thresholds are the smallest float.\n  // Maybe it should be 0?\n  if (opt.shadow_threshold_vec.empty()) {\n    for (size_t i = 0; i < opt.input_images.size(); i++) {\n      opt.shadow_threshold_vec.push_back(-std::numeric_limits<float>::max());\n    }\n  }\n\n  // Override some shadow thresholds with custom versions\n  if (!opt.custom_shadow_threshold_list.empty()) {\n    std::map<std::string, double> custom_thresh;\n    std::ifstream ifs(opt.custom_shadow_threshold_list);\n    std::string image;\n    double val;\n    while (ifs >> image >> val)\n      custom_thresh[image] = val;\n\n    if (custom_thresh.empty())\n      vw::vw_throw(vw::ArgumentErr() << \"Could not read any data from: \"\n               << opt.custom_shadow_threshold_list << \"\\n\");\n\n    for (size_t it = 0; it < opt.input_images.size(); it++) {\n      auto key = custom_thresh.find(opt.input_images[it]);\n      if (key != custom_thresh.end()) {\n        vw::vw_out() << \"Over-riding the shadow threshold for \" << opt.input_images[it]\n                 << \" with: \" << key->second << std::endl;\n        opt.shadow_threshold_vec[it] = key->second;\n      }\n    }\n  }\n  \n  // If the low-light-threshold is specified, ensure it is above all shadow thresholds,\n  // and that the shadow thresholds are positive.\n  if (opt.low_light_threshold > 0) {\n    for (size_t i = 0; i < opt.input_images.size(); i++) {\n      if (opt.shadow_threshold_vec[i] < 0)\n        vw::vw_throw(vw::ArgumentErr() << \"When --low-light-threshold is set, all shadow thresholds \"\n                 << \"must be set and non-negative.\\n\");\n      if (opt.low_light_threshold <= opt.shadow_threshold_vec[i])\n        vw::vw_throw(vw::ArgumentErr() << \"The low-light-threshold must be larger than all \"\n                 << \"shadow thresholds.\\n\");\n    }\n    if (!opt.allow_borderline_data)\n      vw::vw_throw(vw::ArgumentErr()\n        << \"When using --low-light-threshold, must set --allow-borderline-data.\\n\");\n  }\n        \n  if (opt.low_light_weight_power <= 0.0)\n    vw::vw_throw(vw::ArgumentErr() << \"Expecting a positive --low-light-weight-power.\\n\");\n  if (opt.low_light_blur_sigma <= 0.0)\n    vw::vw_throw(vw::ArgumentErr() << \"Expecting a positive --low-light-blur-sigma.\\n\");\n  if (opt.erode_seams && opt.low_light_threshold <= 0.0)\n   vw::vw_throw(vw::ArgumentErr()\n     << \"When using --erode-seams, must set a positive --low-light-threshold.\\n\");\n   \n  // Parse max valid image vals\n  std::istringstream ism(opt.max_valid_image_vals);\n  opt.max_valid_image_vals_vec.clear();\n  while (ism >> val)\n    opt.max_valid_image_vals_vec.push_back(val);\n  if (!opt.max_valid_image_vals_vec.empty() &&\n      opt.max_valid_image_vals_vec.size() != opt.input_images.size())\n    vw::vw_throw(vw::ArgumentErr()\n             << \"If specified, there must be as many max valid image vals as images.\\n\");\n\n  if (opt.max_valid_image_vals_vec.empty()) {\n    for (size_t i = 0; i < opt.input_images.size(); i++) {\n      opt.max_valid_image_vals_vec.push_back(std::numeric_limits<float>::max());\n    }\n  }\n\n  // --read-exposures defines where exposures are read from. Put this as a warning,\n  // otherwise parallel_sfs won't run.\n  if (opt.image_exposures_prefix != \"\" && opt.read_exposures &&\n      opt.image_exposures_prefix != opt.out_prefix)\n      vw::vw_out(vw::WarningMessage) << \"Reading exposures with prefix: \"\n        << opt.out_prefix << \" rather than: \" << opt.image_exposures_prefix << \".\\n\";\n  if (opt.read_exposures)\n    opt.image_exposures_prefix = opt.out_prefix;\n\n  // Same for haze. This one parallel_sfs does not precompute. This may change.\n  if (opt.image_haze_prefix != \"\" && opt.read_haze)\n    vw::vw_throw(vw::ArgumentErr()\n             << \"Cannot specify both --haze-prefix and --read-haze.\\n\");\n  // If have opt.read_haze, use the current prefix\n  if (opt.read_haze)\n    opt.image_haze_prefix = opt.out_prefix;\n\n  // Same for albedo\n  if (opt.input_albedo != \"\" && opt.read_albedo)\n    vw::vw_throw(vw::ArgumentErr()\n             << \"Cannot specify both --input-albedo and --read-albedo.\\n\");\n  // If have opt.read_albedo, use the current prefix albedo\n  if (opt.read_albedo)\n    opt.input_albedo = opt.out_prefix + \"-albedo-final.tif\";\n\n  // Initial image exposures, if provided. First read them in a map,\n  // as perhaps the initial exposures were created using more images\n  // than what we have here.\n  // TODO(oalexan1): This must be a function.\n  std::string exposure_file = asp::exposureFileName(opt.image_exposures_prefix);\n  opt.image_exposures_vec.clear();\n  std::map<std::string, double> img2exp;\n  std::string name;\n  double dval;\n  std::ifstream ise(exposure_file.c_str());\n  int exp_count = 0;\n  while (ise >> name >> dval) {\n    img2exp[name] = dval;\n    exp_count++;\n  }\n  ise.close();\n  if (exp_count > 0) {\n    vw::vw_out() << \"Reading exposures from: \" << exposure_file << std::endl;\n    for (size_t i = 0; i < opt.input_images.size(); i++) {\n      std::string img = opt.input_images[i];\n      std::map<std::string, double>::iterator it = img2exp.find(img);\n      if (it == img2exp.end()) {\n        vw::vw_throw(vw::ArgumentErr()\n                 << \"Could not find the exposure for image: \" << img << \".\\n\");\n      }\n      double exp_val = it->second;\n      // vw::vw_out() << \"Exposure for \" << img << \": \" << exp_val << std::endl;\n      opt.image_exposures_vec.push_back(exp_val);\n    }\n  }\n  if (opt.image_exposures_prefix != \"\" && exp_count == 0)\n    vw::vw_throw(vw::ArgumentErr()\n             << \"Could not find the exposures file: \" << exposure_file << \".\\n\");\n\n  if (opt.steepness_factor != 1.0)\n    vw::vw_out() << \"Making the terrain artificially steeper by factor: \" << opt.steepness_factor\n             << \".\\n\";\n\n  // Initial image haze, if provided. First read them in a map,\n  // as perhaps the initial haze were created using more images\n  // than what we have here.\n  // TODO(oalexan1): This must be a function.\n  if (opt.num_haze_coeffs > 0) {\n    std::string haze_file = asp::hazeFileName(opt.image_haze_prefix);\n    opt.image_haze_vec.clear();\n    std::map<std::string, std::vector<double>> img2haze;\n    std::ifstream ish(haze_file.c_str());\n    int haze_count = 0;\n    while (1) {\n      std::string line;\n      std::getline(ish, line);\n      std::istringstream hstream(line);\n      if (! (hstream >> name)) break;\n      std::vector<double> haze_vec;\n      while (hstream >> dval)\n        haze_vec.push_back(dval);\n      if (haze_vec.empty()) break;\n      haze_count++;\n\n      // Pad the haze vec\n      while (haze_vec.size() < g_max_num_haze_coeffs) haze_vec.push_back(0);\n\n      img2haze[name] = haze_vec;\n\n      // All haze coefficients beyond the first num_haze_coeffs must\n      // be zero, as that means we are reading results written with\n      // different number of haze coeffs.\n      for (size_t hiter = opt.num_haze_coeffs; hiter < g_max_num_haze_coeffs; hiter++) {\n        if (haze_vec[hiter] != 0)\n          vw::vw_throw(vw::ArgumentErr()\n                   << \"Found unexpected non-zero haze coefficient: \" << haze_vec[hiter] << \".\\n\");\n      }\n    }\n    ish.close();\n    if (opt.image_haze_prefix != \"\" && haze_count == 0)\n      vw::vw_throw(vw::ArgumentErr()\n               << \"Could not find the haze file: \" << haze_file << \".\\n\");\n\n    if (haze_count > 0) {\n      vw::vw_out() << \"Reading haze file: \" << haze_file << std::endl;\n      for (size_t i = 0; i < opt.input_images.size(); i++) {\n        std::string img = opt.input_images[i];\n        std::map< std::string, std::vector<double>>::iterator it = img2haze.find(img);\n        if (it == img2haze.end()) {\n          vw::vw_throw(vw::ArgumentErr()\n                   << \"Could not find the haze for image: \" << img << \".\\n\");\n        }\n        std::vector<double> haze_vec = it->second;\n        // vw::vw_out() << \"Haze for \" << img << \":\";\n        //for (size_t hiter = 0; hiter < haze_vec.size(); hiter++)\n        //  vw::vw_out() << \" \" << haze_vec[hiter];\n        //vw::vw_out() << \"\\n\";\n        opt.image_haze_vec.push_back(haze_vec);\n      }\n    }\n  }\n\n  // Initial model coeffs, if passed on the command line\n  if (opt.model_coeffs != \"\") {\n    vw::vw_out() << \"Parsing model coefficients: \" << opt.model_coeffs << std::endl;\n    std::istringstream is(opt.model_coeffs);\n    double val;\n    while (is >> val)\n      opt.model_coeffs_vec.push_back(val);\n  }\n\n  // Initial model coefficients, if provided in the file\n  if (opt.model_coeffs_prefix != \"\") {\n    std::string model_coeffs_file = asp::modelCoeffsFileName(opt.model_coeffs_prefix);\n    vw::vw_out() << \"Reading model coefficients from file: \" << model_coeffs_file << std::endl;\n    std::ifstream ism(model_coeffs_file.c_str());\n    opt.model_coeffs_vec.clear();\n    while (ism >> dval)\n      opt.model_coeffs_vec.push_back(dval);\n    ism.close();\n    if (opt.model_coeffs_vec.empty()) {\n      vw::vw_throw(vw::ArgumentErr() << \"Could not read model coefficients from: \" << model_coeffs_file << \".\\n\");\n    }\n  }\n\n  if (!opt.model_coeffs_vec.empty()) {\n    // Pad with zeros if needed, as the Lunar Lambertian has 4 params, while Hapke has 5 of them.\n    // the Charon one has 2.\n    while (opt.model_coeffs_vec.size() < g_num_model_coeffs)\n      opt.model_coeffs_vec.push_back(0);\n\n    if (opt.model_coeffs_vec.size() != g_num_model_coeffs)\n      vw::vw_throw(vw::ArgumentErr()\n               << \"If specified, there must be \" << g_num_model_coeffs << \" coefficients.\\n\");\n  }\n\n  // Sanity check\n  if (opt.camera_position_step_size <= 0) {\n    vw::vw_throw(vw::ArgumentErr() << \"Expecting a positive value for camera-position-step-size.\\n\");\n  }\n\n  // Need this to be able to load adjusted camera models. That will happen\n  // in the stereo session.\n  asp::stereo_settings().bundle_adjust_prefix = opt.bundle_adjust_prefix;\n\n  if (opt.input_images.size() <= 1 && opt.float_albedo &&\n      opt.initial_dem_constraint_weight <= 0 && opt.albedo_constraint_weight <= 0.0)\n    vw::vw_throw(vw::ArgumentErr()\n             << \"Floating the albedo is ill-posed for just one image without \"\n             << \"the initial DEM constraint or the albedo constraint.\\n\");\n\n  if (opt.input_images.size() <= 1 && opt.float_exposure &&\n      opt.initial_dem_constraint_weight <= 0)\n    vw::vw_throw(vw::ArgumentErr()\n             << \"Floating the exposure is ill-posed for just one image.\\n\");\n\n  // Start with given images to skip. Later, for each dem clip, we may\n  // skip more, if those images do not overlap with the clip.\n  opt.skip_images.clear();\n  if (opt.skip_images_str != \"\") {\n    std::istringstream is(opt.skip_images_str);\n    int val;\n    while (is >> val)\n      opt.skip_images.insert(val);\n  }\n\n  // estimate height errors and integrability constraint are mutually exclusive\n  if (opt.estimate_height_errors && opt.integrability_weight > 0)\n    vw::vw_throw(vw::ArgumentErr()\n       << \"Cannot estimate height errors when using the integrability constraint.\\n\");\n\n  if (opt.estimate_height_errors && opt.model_shadows)\n    vw::vw_throw(vw::ArgumentErr() << \"Cannot estimate height error when modeling shadows.\");\n\n  if (opt.estimate_height_errors && opt.save_variances)\n    vw::vw_throw(vw::ArgumentErr() << \"Cannot estimate height errors with --save-variances.\");\n\n  if (opt.estimate_height_errors && opt.save_covariances)\n    vw::vw_throw(vw::ArgumentErr() << \"Cannot estimate height errors with --save-covariances.\");\n\n  if (opt.save_sim_intensity_only || opt.save_meas_intensity_only || \n      opt.estimate_height_errors) {\n\n    // No iterations\n    opt.max_iterations = 0;\n\n    // Need the exact cameras as they span the full DEM\n    if (opt.use_approx_camera_models || opt.crop_input_images) {\n      opt.use_approx_camera_models = false;\n      opt.crop_input_images = false;\n    }\n\n    if (opt.num_haze_coeffs > 0 && opt.image_haze_vec.empty())\n      vw::vw_throw(vw::ArgumentErr()\n                << \"Expecting the haze to be computed and passed in.\\n\");\n  }\n\n  // Cannot have both sun positions and sun angles\n  if (opt.sun_positions_list.size() > 0 && opt.sun_angles_list.size() > 0)\n    vw::vw_throw(vw::ArgumentErr() << \"Cannot specify both sun positions and sun angles.\\n\");\n    \n  if (!opt.ref_map.empty()) {\n    // --ref-map is to be used only with --save-sim-intensity-only or\n    // --save-meas-intensity-only\n    if (!opt.save_sim_intensity_only && !opt.save_meas_intensity_only)\n      vw::vw_throw(vw::ArgumentErr()\n               << \"--ref-map is to be used only with --save-sim-intensity-only or \"\n               << \"--save-meas-intensity-only.\\n\");\n      \n     // This is also incompatible with non-empty crop win\n     if (!opt.crop_win.empty())\n      vw::vw_throw(vw::ArgumentErr()\n               << \"--ref-map is incompatible with --crop-win.\\n\");\n      \n  }\n\n  // If --save-covariances is on, also turn on --save-variances\n  if (opt.save_covariances)\n    opt.save_variances = true;\n\n  // If --save-variances is on and --float-albedo is on, warn if either --float-haze\n  // or --float-exposures is also on, as this may make the albedo variance ill-posed.\n  if (opt.save_variances && opt.float_albedo) {\n    if (opt.float_haze || opt.float_exposure)\n      vw::vw_out(vw::WarningMessage)\n        << \"Computing the albedo variance may be ill-posed when \"\n        << \"floating haze or exposures.\\n\";\n  }\n  \n} // end function handleSfsArgs\n    \n} // end namespace asp\n"
  },
  {
    "path": "src/asp/SfS/SfsArgs.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#ifndef __ASP_SFS_SFS_ARGS_H__\n#define __ASP_SFS_SFS_ARGS_H__\n\n#include <asp/SfS/SfsOptions.h>\n\nnamespace asp {\n\n// Function to handle command line arguments\nvoid handleSfsArgs(int argc, char *argv[], SfsOptions& opt);\n\n} // end namespace asp\n\n#endif // __ASP_SFS_SFS_ARGS_H__\n"
  },
  {
    "path": "src/asp/SfS/SfsCamera.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// \\file SfsCamera.cc\n// A camera approximation used by SfS around a small DEM region. It works\n// by tabulation.\n\n#include <asp/SfS/SfsCamera.h>\n#include <vw/Image/Interpolation.h>\n\nnamespace asp {\n\nusing namespace vw;\n\nApproxCameraModel::ApproxCameraModel(vw::CamPtr const& exact_camera,\n                                     BBox2i img_bbox,\n                                     ImageView<double> const& dem,\n                                     vw::cartography::GeoReference const& geo,\n                                     double nodata_val,\n                                     vw::Mutex & camera_mutex):\n    m_geo(geo),\n    m_camera_mutex(camera_mutex),\n    m_exact_camera(exact_camera),\n    m_img_bbox(img_bbox),\n    m_model_is_valid(true) {\n\n  int big = 1e+8;\n  m_uncompValue = Vector2(-big, -big);\n\n  // Compute the mean DEM height. We expect all DEM entries to be valid.\n  m_mean_ht = 0;\n  double num = 0.0;\n  for (int col = 0; col < dem.cols(); col++) {\n    for (int row = 0; row < dem.rows(); row++) {\n      if (dem(col, row) == nodata_val)\n        vw_throw(ArgumentErr()\n                  << \"ApproxCameraModel: Expecting a DEM without nodata values.\\n\");\n      m_mean_ht += dem(col, row);\n      num += 1.0;\n    }\n  }\n  if (num > 0) m_mean_ht /= num;\n\n  // The area we're supposed to work around\n  m_point_box = m_geo.pixel_to_point_bbox(bounding_box(dem));\n  double wx = m_point_box.width(), wy = m_point_box.height();\n  m_approx_table_gridx = wx/std::max(dem.cols(), 1);\n  m_approx_table_gridy = wy/std::max(dem.rows(), 1);\n\n  if (m_approx_table_gridx == 0 || m_approx_table_gridy == 0) {\n    vw_throw(ArgumentErr()\n              << \"ApproxCameraModel: Expecting a positive grid size.\\n\");\n  }\n\n  // Expand the box, as later the DEM will change.\n  double extra = 0.5;\n  m_point_box.min().x() -= extra*wx; m_point_box.max().x() += extra*wx;\n  m_point_box.min().y() -= extra*wy; m_point_box.max().y() += extra*wy;\n  wx = m_point_box.width();\n  wy = m_point_box.height();\n\n  vw_out() << \"Approximation proj box: \" << m_point_box << std::endl;\n\n  // We will tabulate the point_to_pixel function at a multiple of\n  // the grid, and we'll use interpolation for anything in\n  // between.\n  //m_approx_table_gridx /= 2.0; m_approx_table_gridy /= 2.0; // fine\n  m_approx_table_gridx *= 2.0; m_approx_table_gridy *= 2.0; // Coarse. Good enough.\n\n  int numx = wx/m_approx_table_gridx;\n  int numy = wy/m_approx_table_gridy;\n\n  vw_out() << \"Lookup table dimensions: \" << numx << ' ' << numy << std::endl;\n\n  m_begX = 0; m_endX = numx-1;\n  m_begY = 0; m_endY = numy-1;\n\n  // Mark all values as uncomputed and invalid\n  m_pixel_to_vec_mat.set_size(numx, numy);\n  m_point_to_pix_mat.set_size(numx, numy);\n  for (int x = 0; x < numx; x++) {\n    for (int y = 0; y < numy; y++) {\n      m_point_to_pix_mat(x, y) = m_uncompValue;\n      m_point_to_pix_mat(x, y).invalidate();\n    }\n  }\n\n  // Fill in the table. Find along the way the mean direction from\n  // the camera to the ground. Invalid values will be masked.\n  m_count = 0;\n  m_mean_dir = Vector3();\n  comp_entries_in_table();\n  m_mean_dir /= std::max(1, m_count);\n  m_mean_dir = m_mean_dir/norm_2(m_mean_dir);\n\n  m_crop_box.crop(m_img_bbox);\n\n  return;\n} // End constructor\n\nvoid ApproxCameraModel::comp_entries_in_table() const {\n  for (int x = m_begX; x <= m_endX; x++) {\n    for (int y = m_begY; y <= m_endY; y++) {\n\n      // This will be useful when we invoke this function repeatedly\n      if (m_point_to_pix_mat(x, y).child() != m_uncompValue) {\n        continue;\n      }\n\n      Vector2 pt(m_point_box.min().x() + x*m_approx_table_gridx,\n                  m_point_box.min().y() + y*m_approx_table_gridy);\n      Vector2 lonlat = m_geo.point_to_lonlat(pt);\n      Vector3 xyz = m_geo.datum().geodetic_to_cartesian\n        (Vector3(lonlat[0], lonlat[1], m_mean_ht));\n      bool success = true;\n      Vector2 pix;\n      Vector3 vec;\n      try {\n        pix = m_exact_camera->point_to_pixel(xyz);\n        //if (true || m_img_bbox.contains(pix))  // Need to think more here\n        vec = m_exact_camera->pixel_to_vector(pix);\n        //else\n        // success = false;\n\n      } catch(...) {\n        success = false;\n      }\n      if (success) {\n        m_pixel_to_vec_mat(x, y) = vec;\n        m_point_to_pix_mat(x, y) = pix;\n        m_pixel_to_vec_mat(x, y).validate();\n        m_point_to_pix_mat(x, y).validate();\n        m_mean_dir += vec; // only when the point projects inside the camera?\n        if (m_img_bbox.contains(pix))\n          m_crop_box.grow(pix);\n        m_count++;\n      } else {\n        m_pixel_to_vec_mat(x, y).invalidate();\n        m_point_to_pix_mat(x, y).invalidate();\n      }\n    }\n  }\n\n   return;\n}\n\n// We have tabulated point_to_pixel at the mean dem height.\n// Look-up point_to_pixel for the current point by first\n// intersecting the ray from the current point to the camera\n// with the datum at that height. We don't know that ray,\n// so we iterate to find it.\nvw::Vector2 ApproxCameraModel::point_to_pixel(Vector3 const& xyz) const {\n\n  // TODO: What happens if we use bicubic interpolation?\n  InterpolationView<EdgeExtensionView<ImageView<PixelMask<Vector3>>, ConstantEdgeExtension>, BilinearInterpolation> pixel_to_vec_interp\n    = interpolate(m_pixel_to_vec_mat, BilinearInterpolation(),\n                  ConstantEdgeExtension());\n\n  InterpolationView<EdgeExtensionView<ImageView<PixelMask<Vector2>>, ConstantEdgeExtension>, BilinearInterpolation> point_to_pix_interp\n    = interpolate(m_point_to_pix_mat, BilinearInterpolation(),\n                  ConstantEdgeExtension());\n\n  Vector3 dir = m_mean_dir;\n  Vector2 pix;\n  double major_radius = m_geo.datum().semi_major_axis() + m_mean_ht;\n  double minor_radius = m_geo.datum().semi_minor_axis() + m_mean_ht;\n  for (size_t i = 0; i < 10; i++) {\n\n    Vector3 S = xyz - 1.1*major_radius*dir; // push the point outside the sphere\n    if (norm_2(S) <= major_radius) // point is inside the sphere\n      return m_exact_camera->point_to_pixel(xyz);\n\n    Vector3 datum_pt\n      = vw::cartography::datum_intersection(major_radius, minor_radius, S, dir);\n    Vector3 llh = m_geo.datum().cartesian_to_geodetic(datum_pt);\n    Vector2 pt = m_geo.lonlat_to_point(subvector(llh, 0, 2));\n\n    // Indices\n    double x = (pt.x() - m_point_box.min().x())/m_approx_table_gridx;\n    double y = (pt.y() - m_point_box.min().y())/m_approx_table_gridy;\n\n    bool out_of_range = (x < m_begX || x >= m_endX-1 ||\n                         y < m_begY || y >= m_endY-1);\n\n    // If out of range, return the exact result. This should be very slow.\n    // The hope is that it will be very rare.\n    if (out_of_range)\n      return m_exact_camera->point_to_pixel(xyz);\n\n    PixelMask<Vector3> masked_dir = pixel_to_vec_interp(x, y);\n    PixelMask<Vector2> masked_pix = point_to_pix_interp(x, y);\n    if (is_valid(masked_dir) && is_valid(masked_pix)) {\n      dir = masked_dir.child();\n      pix = masked_pix.child();\n    } else {\n      return m_exact_camera->point_to_pixel(xyz);\n    }\n  }\n\n  return pix;\n}\n\nstd::string ApproxCameraModel::type() const{\n  return \"ApproxSfSCamera\";\n}\n\n// This is used rarely. Return the exact camera vector.\nVector3 ApproxCameraModel::pixel_to_vector(Vector2 const& pix) const {\n  vw::Mutex::Lock lock(m_camera_mutex);\n  return m_exact_camera->pixel_to_vector(pix);\n}\n\n// Return the exact camera center\nVector3 ApproxCameraModel::camera_center(Vector2 const& pix) const {\n  vw::Mutex::Lock lock(m_camera_mutex);\n  return m_exact_camera->camera_center(pix);\n}\n\n// Return the exact camera pose\nQuat ApproxCameraModel::camera_pose(Vector2 const& pix) const {\n  vw::Mutex::Lock lock(m_camera_mutex);\n  return m_exact_camera->camera_pose(pix);\n}\n\n// The range of pixels in the image we are actually expected to use.\n// Note that the function returns an alias, so that we can modify the\n// crop box from outside.\nBBox2 & ApproxCameraModel::crop_box() {\n  m_crop_box.crop(m_img_bbox);\n  return m_crop_box;\n}\n\nbool ApproxCameraModel::model_is_valid() {\n  return m_model_is_valid;\n}\n\nvw::CamPtr ApproxCameraModel::exact_camera() const {\n  return m_exact_camera;\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/SfS/SfsCamera.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// \\file SfsCamera.h\n// A camera approximation used by SfS around a small DEM region\n\n#ifndef __ASP_SFS_SFS_CAMERA_H__\n#define __ASP_SFS_SFS_CAMERA_H__\n\n#include <vw/Image/ImageView.h>\n#include <vw/Image/PixelMask.h>\n#include <vw/Camera/CameraModel.h>\n#include <vw/Core/Thread.h>\n#include <vw/Cartography/GeoReference.h>\n\nnamespace asp {\n\nclass ApproxCameraModel: public vw::camera::CameraModel {\nprivate:\n  mutable vw::Vector3 m_mean_dir;  // mean vector from camera to ground\n  vw::cartography::GeoReference m_geo;\n  double m_mean_ht;\n  mutable vw::ImageView<vw::PixelMask<vw::Vector3>> m_pixel_to_vec_mat;\n  mutable vw::ImageView<vw::PixelMask<vw::Vector2>> m_point_to_pix_mat;\n  double m_approx_table_gridx, m_approx_table_gridy;\n  vw::Mutex& m_camera_mutex;\n  vw::Vector2 m_uncompValue;\n  mutable int m_begX, m_endX, m_begY, m_endY;\n  mutable int m_count;\n  vw::BBox2i m_img_bbox;\n  mutable vw::BBox2 m_point_box, m_crop_box;\n  bool m_model_is_valid;\n  vw::CamPtr m_exact_camera;\n\n  void comp_entries_in_table() const;\n\npublic:\n\n  ApproxCameraModel(vw::CamPtr const& exact_camera,\n                    vw::BBox2i img_bbox,\n                    vw::ImageView<double> const& dem,\n                    vw::cartography::GeoReference const& geo,\n                    double nodata_val,\n                    vw::Mutex& camera_mutex);\n\n  virtual ~ApproxCameraModel() {}\n\n  virtual vw::Vector2 point_to_pixel(vw::Vector3 const& xyz) const override;\n  virtual vw::Vector3 pixel_to_vector(vw::Vector2 const& pix) const override;\n  virtual vw::Vector3 camera_center(vw::Vector2 const& pix) const override;\n  virtual vw::Quat camera_pose(vw::Vector2 const& pix) const override;\n  virtual std::string type() const override;\n\n  vw::BBox2& crop_box();\n  bool model_is_valid();\n  vw::CamPtr exact_camera() const;\n};\n\n} // end namespace asp\n\n#endif // __ASP_SFS_SFS_CAMERA_H__\n"
  },
  {
    "path": "src/asp/SfS/SfsCostFun.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// \\file SfsCostFun.cc\n// Cost function logic for SfS\n\n#include <asp/SfS/SfsCostFun.h>\n#include <asp/SfS/SfsUtils.h>\n#include <asp/Core/BaseCameraUtils.h>\n#include <asp/SfS/SfsOptions.h>\n#include <asp/SfS/SfsImageProc.h>\n\n#include <asp/asp_config.h> // defines ASP_HAVE_PKG_ISIS\n#if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1\n#include <asp/IsisIO/IsisCameraModel.h>\n#endif // ASP_HAVE_PKG_ISIS\n\n#include <vw/Cartography/GeoReferenceUtils.h>\n#include <vw/Image/ImageChannels.h>\n#include <vw/Core/ProgressCallback.h>\n#include <vw/Core/Thread.h>\n\n#include <boost/filesystem/path.hpp>\n\n#include <set>\n\nnamespace fs = boost::filesystem;\n\nnamespace asp {\n\n// A callback to invoke at every iteration of ceres\n\n// Constructor to initialize references to the necessary data\nSfsCallback::\nSfsCallback(asp::SfsOptions const& opt,\n            vw::ImageView<double>& dem,\n            vw::ImageView<vw::Vector2>& pq,\n            vw::ImageView<double>& albedo,\n            vw::cartography::GeoReference const& geo,\n            asp::ReflParams const& refl_params,\n            std::vector<vw::Vector3> const& sunPosition,\n            std::vector<vw::BBox2i> const& crop_boxes,\n            std::vector<asp::MaskedImgRefT> const& masked_images,\n            std::vector<asp::DblImgT> const& blend_weights,\n            bool blend_weight_is_ground_weight,\n            std::vector<vw::CamPtr>& cameras,\n            double& dem_nodata_val, float& img_nodata_val,\n            std::vector<double>& exposures,\n            std::vector<std::vector<double>>& haze,\n            double& max_dem_height, double& gridx, double& gridy,\n            std::vector<double> & refl_coeffs):\n  opt(opt), dem(dem), pq(pq), albedo(albedo), geo(geo), refl_params(refl_params),\n  sunPosition(sunPosition), crop_boxes(crop_boxes), masked_images(masked_images),\n  blend_weights(blend_weights), blend_weight_is_ground_weight(blend_weight_is_ground_weight),\n  cameras(cameras), dem_nodata_val(dem_nodata_val),\n  img_nodata_val(img_nodata_val), exposures(exposures), haze(haze),\n  max_dem_height(max_dem_height), gridx(gridx), gridy(gridy),\n  refl_coeffs(refl_coeffs),\n  iter(-1), final_iter(false) {}\n\nceres::CallbackReturnType\nSfsCallback::operator()(const ceres::IterationSummary& summary) {\n\n  iter++;\n\n  vw::vw_out() << \"Finished iteration: \" << iter << \"\\n\";\n\n  if (!opt.save_sim_intensity_only && !opt.save_meas_intensity_only)\n    asp::saveExposures(opt.out_prefix, opt.input_images, exposures);\n\n  if (opt.num_haze_coeffs > 0 && !opt.save_sim_intensity_only && !opt.save_meas_intensity_only)\n    asp::saveHaze(opt.out_prefix, opt.input_images, haze);\n\n  std::string model_coeffs_file = asp::modelCoeffsFileName(opt.out_prefix);\n  if (!opt.save_sim_intensity_only && !opt.save_meas_intensity_only) {\n    // Not needed, usually\n    // vw::vw_out() << \"Writing: \" << model_coeffs_file << \"\\n\";\n    // std::ofstream mcf(model_coeffs_file.c_str());\n    // mcf.precision(17);\n    // for (size_t coeff_iter = 0; coeff_iter < refl_coeffs.size(); coeff_iter++)\n    //   mcf << refl_coeffs[coeff_iter] << \" \";\n    // mcf << \"\\n\";\n    // mcf.close();\n  }\n\n  std::ostringstream os;\n  if (!final_iter)\n    os << \"-iter\" << iter;\n  else\n    os << \"-final\";\n\n  std::string iter_str = os.str();\n\n  // The DEM with no-data where there are no valid image pixels\n  vw::ImageView<double> dem_nodata;\n  if (opt.save_dem_with_nodata) {\n    dem_nodata = vw::ImageView<double>(dem.cols(), dem.rows());\n    vw::fill(dem_nodata, dem_nodata_val);\n  }\n\n  bool has_georef = true, has_nodata = true;\n  vw::TerminalProgressCallback tpc(\"asp\", \": \");\n  if ((!opt.save_sparingly || final_iter) && !opt.save_sim_intensity_only && \n      !opt.save_meas_intensity_only) {\n    std::string out_dem_file = opt.out_prefix + \"-DEM\"\n      + iter_str + \".tif\";\n    vw::vw_out() << \"Writing: \" << out_dem_file << \"\\n\";\n    vw::cartography::block_write_gdal_image(out_dem_file,\n                                            vw::pixel_cast<float>(dem),\n                                            has_georef, geo,\n                                            has_nodata, dem_nodata_val,\n                                            opt, tpc);\n  }\n\n  if ((!opt.save_sparingly || (final_iter && opt.float_albedo)) &&\n      !opt.save_sim_intensity_only && !opt.save_meas_intensity_only) {\n    std::string out_albedo_file;\n    // For the final albedo do not use comp-albedo, as there is only one.\n    // Only for intermediate iterations we contrast the computed albedo vs \n    // the measured one.\n    if (!final_iter)\n     out_albedo_file = opt.out_prefix + \"-comp-albedo\" + iter_str + \".tif\";\n    else\n     out_albedo_file = opt.out_prefix + \"-albedo\" + iter_str + \".tif\";\n    \n    vw::vw_out() << \"Writing: \" << out_albedo_file << \"\\n\";\n    vw::cartography::block_write_gdal_image(out_albedo_file,\n                                            vw::pixel_cast<float>(albedo),\n                                            has_georef, geo,\n                                            has_nodata, dem_nodata_val,\n                                            opt, tpc);\n  }\n\n  // Print reflectance and other things\n  for (size_t image_iter = 0; image_iter < masked_images.size(); image_iter++) {\n\n    if (opt.skip_images.find(image_iter) != opt.skip_images.end())\n      continue;\n\n    MaskedDblImgT reflectance, intensity, sim_intensity;\n    vw::ImageView<double> ground_weight;\n\n    std::string out_camera_file\n      = asp::bundle_adjust_file_name(opt.out_prefix,\n                                     opt.input_images[image_iter],\n                                     opt.input_cameras[image_iter]);\n\n    if (opt.save_sparingly && !opt.save_dem_with_nodata)\n      continue; // don't write too many things\n\n    // Manufacture an output prefix for the other data associated with this camera\n    std::string iter_str2 = fs::path(out_camera_file).replace_extension(\"\").string();\n    iter_str2 += iter_str;\n\n    // Compute reflectance and intensity with optimized DEM\n    int sample_col_rate = 1, sample_row_rate = 1;\n    bool show_progress = false;\n    computeReflectanceAndIntensity(dem, pq, geo,\n                                  opt.model_shadows, show_progress,\n                                  max_dem_height,\n                                  gridx, gridy,\n                                  sample_col_rate, sample_row_rate,\n                                  sunPosition[image_iter],\n                                  refl_params,\n                                  crop_boxes[image_iter],\n                                  masked_images[image_iter],\n                                  blend_weights[image_iter],\n                                  blend_weight_is_ground_weight,\n                                  cameras[image_iter],\n                                  reflectance, intensity, ground_weight,\n                                  &refl_coeffs[0], opt);\n\n    // dem_nodata equals to dem if the image has valid pixels and no shadows\n    if (opt.save_dem_with_nodata) {\n      for (int col = 0; col < reflectance.cols(); col++) {\n        for (int row = 0; row < reflectance.rows(); row++) {\n          if (vw::is_valid(reflectance(col, row)))\n            dem_nodata(col, row) = dem(col, row);\n        }\n      }\n    }\n\n    if (opt.save_sparingly)\n      continue;\n\n    // Find the simulated intensity\n    sim_intensity.set_size(reflectance.cols(), reflectance.rows());\n    for (int col = 0; col < sim_intensity.cols(); col++) {\n      for (int row = 0; row < sim_intensity.rows(); row++) {\n        sim_intensity(col, row) \n          = calcSimIntensity(albedo(col, row), reflectance(col, row),\n                             exposures[image_iter], opt.steepness_factor,\n                             &haze[image_iter][0], opt.num_haze_coeffs);\n      }\n    }\n\n    std::string out_meas_intensity_file = iter_str2 + \"-meas-intensity.tif\";\n    vw::vw_out() << \"Writing: \" << out_meas_intensity_file << \"\\n\";\n    vw::cartography::block_write_gdal_image(out_meas_intensity_file,\n                                            vw::apply_mask(intensity, img_nodata_val),\n                                            has_georef, geo, has_nodata, img_nodata_val,\n                                            opt, tpc);\n\n    std::string out_sim_intensity_file = iter_str2 + \"-sim-intensity.tif\";\n    vw::vw_out() << \"Writing: \" << out_sim_intensity_file << \"\\n\";\n    vw::cartography::block_write_gdal_image(out_sim_intensity_file,\n                                            vw::apply_mask(sim_intensity, img_nodata_val),\n                                            has_georef, geo, has_nodata, img_nodata_val,\n                                            opt, tpc);\n\n    if (opt.save_sim_intensity_only || opt.save_meas_intensity_only)\n      continue; // don't write too many things\n    \n    // Not needed usually  \n    // std::string out_weight_file = iter_str2 + \"-blending-weight.tif\";\n    // vw::vw_out() << \"Writing: \" << out_weight_file << \"\\n\";\n    // vw::cartography::block_write_gdal_image(out_weight_file, ground_weight,\n    //                                         has_georef, geo, has_nodata, img_nodata_val,\n    //                                         opt, tpc);\n\n    std::string out_reflectance_file = iter_str2 + \"-reflectance.tif\";\n    vw::vw_out() << \"Writing: \" << out_reflectance_file << \"\\n\";\n    vw::cartography::block_write_gdal_image(out_reflectance_file,\n                                            vw::apply_mask(reflectance, img_nodata_val),\n                                            has_georef, geo, has_nodata, img_nodata_val,\n                                            opt, tpc);\n\n    // Find the measured normalized albedo, after correcting for\n    // reflectance. Do not save this for the final iteration. This is a debug product\n    // that is enabled only if not saving sparingly.\n    if (!final_iter) {\n      vw::ImageView<double> measured_albedo;\n      measured_albedo.set_size(reflectance.cols(), reflectance.rows());\n      for (int col = 0; col < measured_albedo.cols(); col++) {\n        for (int row = 0; row < measured_albedo.rows(); row++) {\n          if (!vw::is_valid(reflectance(col, row)))\n            measured_albedo(col, row) = 1;\n          else\n            measured_albedo(col, row)\n              = calcAlbedo(intensity(col, row), reflectance(col, row),\n                          exposures[image_iter], opt.steepness_factor,\n                          &haze[image_iter][0], opt.num_haze_coeffs);\n        }\n      }\n      std::string out_albedo_file = iter_str2 + \"-meas-albedo.tif\";\n      vw::vw_out() << \"Writing: \" << out_albedo_file << \"\\n\";\n      vw::cartography::block_write_gdal_image(out_albedo_file, measured_albedo,\n                                              has_georef, geo, has_nodata, 0, opt, tpc);\n    }\n    \n    vw::vw_out() << \"Exposure for image \" << image_iter << \": \"\n             << exposures[image_iter] << \"\\n\";\n\n    if (opt.num_haze_coeffs > 0) {\n      vw::vw_out() << \"Haze for image \" << image_iter << \":\";\n      for (size_t hiter = 0; hiter < haze[image_iter].size(); hiter++) {\n        vw::vw_out() << \" \" << haze[image_iter][hiter];\n      }\n      vw::vw_out() << \"\\n\";\n    }\n  } // end loop through images\n\n  if (opt.save_dem_with_nodata && (!opt.save_sparingly || final_iter)) {\n    std::string out_dem_nodata_file = opt.out_prefix + \"-DEM-nodata\"\n      + iter_str + \".tif\";\n    vw::vw_out() << \"Writing: \" << out_dem_nodata_file << \"\\n\";\n    vw::TerminalProgressCallback tpc(\"asp\", \": \");\n    vw::cartography::block_write_gdal_image(out_dem_nodata_file,\n                                            vw::pixel_cast<float>(dem_nodata),\n                                            has_georef, geo,\n                                            has_nodata, dem_nodata_val, opt, tpc);\n  }\n\n  return ceres::SOLVER_CONTINUE;\n} // end callback function\n\nvoid SfsCallback::set_final_iter(bool is_final_iter) {\n  final_iter = is_final_iter;\n}\n\n// See SmoothnessError() for the definitions of bottom, top, etc.\ntemplate <typename F, typename G>\ninline bool\ncalc_intensity_residual(SfsOptions const& opt,\n                        const F* const exposure, const F* const haze,\n                        const G* const left, const G* const center, const G* const right,\n                        const G* const bottom, const G* const top,\n                        bool use_pq, const G* const pq, // dem partial derivatives\n                        const G* const albedo,\n                        const G* const refl_coeffs,\n                        int col, int row,\n                        vw::ImageView<double>         const & dem,            // alias\n                        vw::cartography::GeoReference const & geo,            // alias\n                        bool                              model_shadows,\n                        double                            camera_position_step_size,\n                        double                    const & max_dem_height, // alias\n                        double                            gridx,\n                        double                            gridy,\n                        ReflParams              const & refl_params,  // alias\n                        vw::Vector3               const & sunPosition,   // alias\n                        vw::BBox2i                            crop_box,\n                        MaskedImgRefT                const & image,          // alias\n                        DblImgT                const & blend_weight,   // alias\n                        bool                              blend_weight_is_ground_weight,\n                        vw::CamPtr                const & camera,         // alias\n                        F* residuals) {\n\n  // Default residuals. Using here 0 rather than some big number tuned out to\n  // work better than the alternative.\n  residuals[0] = F(0.0);\n  try {\n    vw::PixelMask<double> reflectance(0), intensity(0);\n    double ground_weight = 0;\n\n    // Need to be careful not to access an array which does not exist\n    G p = 0, q = 0;\n    if (use_pq) {\n      p = pq[0];\n      q = pq[1];\n    }\n\n    bool success =\n      calcPixReflectanceInten(left[0], center[0], right[0],\n                              bottom[0], top[0],\n                              use_pq, p, q,\n                              col, row,  dem, geo,\n                              model_shadows, max_dem_height,\n                              gridx, gridy,\n                              sunPosition,  refl_params, crop_box, image,\n                              blend_weight, blend_weight_is_ground_weight,\n                              camera, reflectance, intensity, ground_weight,\n                              refl_coeffs, opt);\n\n    if (success && vw::is_valid(intensity) && vw::is_valid(reflectance))\n      residuals[0] = ground_weight * (intensity -\n                      calcSimIntensity(albedo[0], reflectance.child(), exposure[0],\n                                       opt.steepness_factor, haze, opt.num_haze_coeffs));\n\n  } catch (...) {\n    // To be able to handle robustly DEMs that extend beyond the camera,\n    // always return true when we fail to project, but with zero residual.\n    // This needs more study.\n    residuals[0] = F(0.0);\n    return true;\n  }\n\n  return true;\n}\n\n// Discrepancy between measured and computed intensity. See the formula above.\nstruct IntensityError {\n  IntensityError(SfsOptions const& opt, int col, int row,\n                 vw::ImageView<double> const& dem,\n                 vw::cartography::GeoReference const& geo,\n                 bool model_shadows,\n                 double camera_position_step_size,\n                 double const& max_dem_height, // note: this is an alias\n                 double gridx, double gridy,\n                 ReflParams const& refl_params,\n                 vw::Vector3 const& sunPosition,\n                 vw::BBox2i const& crop_box,\n                 MaskedImgRefT const& image,\n                 DblImgT const& blend_weight,\n                 bool blend_weight_is_ground_weight,\n                 vw::CamPtr const& camera):\n    m_opt(opt),\n    m_col(col), m_row(row), m_dem(dem), m_geo(geo),\n    m_model_shadows(model_shadows),\n    m_camera_position_step_size(camera_position_step_size),\n    m_max_dem_height(max_dem_height),\n    m_gridx(gridx), m_gridy(gridy),\n    m_refl_params(refl_params),\n    m_sunPosition(sunPosition),\n    m_crop_box(crop_box),\n    m_image(image), m_blend_weight(blend_weight),\n    m_blend_weight_is_ground_weight(blend_weight_is_ground_weight),\n    m_camera(camera) {}\n\n  // See SmoothnessError() for the definitions of bottom, top, etc.\n  template <typename F>\n  bool operator()(const F* const exposure, const F* const haze,\n                  const F* const left, const F* const center, const F* const right,\n                  const F* const bottom, const F* const top,\n                  const F* const albedo, const F* const refl_coeffs,\n                  F* residuals) const {\n\n    // For this error we do not use p and q, hence just use a placeholder.\n    bool use_pq = false;\n    const F * const pq = NULL;\n    return calc_intensity_residual(m_opt, exposure, haze,\n                                   left, center, right, bottom, top,\n                                   use_pq, pq, albedo,\n                                   refl_coeffs,\n                                   m_col, m_row,\n                                   m_dem,  // alias\n                                   m_geo,  // alias\n                                   m_model_shadows,\n                                   m_camera_position_step_size,\n                                   m_max_dem_height,  // alias\n                                   m_gridx, m_gridy,\n                                   m_refl_params,   // alias\n                                   m_sunPosition,    // alias\n                                   m_crop_box,\n                                   m_image,           // alias\n                                   m_blend_weight,    // alias\n                                   m_blend_weight_is_ground_weight,\n                                   m_camera,          // alias\n                                   residuals);\n  }\n\n  // Factory to hide the construction of the CostFunction object from\n  // the client code.\n  static ceres::CostFunction* Create(SfsOptions const& opt, int col, int row,\n                                     vw::ImageView<double> const& dem,\n                                     vw::cartography::GeoReference const& geo,\n                                     bool model_shadows,\n                                     double camera_position_step_size,\n                                     double const& max_dem_height, // alias\n                                     double gridx, double gridy,\n                                     ReflParams const& refl_params,\n                                     vw::Vector3 const& sunPosition,\n                                     vw::BBox2i const& crop_box,\n                                     MaskedImgRefT const& image,\n                                     DblImgT const& blend_weight,\n                                     bool blend_weight_is_ground_weight,\n                                     vw::CamPtr const& camera) {\n    return (new ceres::NumericDiffCostFunction<IntensityError,\n            ceres::CENTRAL, 1, 1, g_max_num_haze_coeffs, 1, 1, 1, 1, 1, 1, g_num_model_coeffs>\n            (new IntensityError(opt, col, row, dem, geo,\n                                model_shadows,\n                                camera_position_step_size,\n                                max_dem_height,\n                                gridx, gridy,\n                                refl_params, sunPosition,\n                                crop_box, image, blend_weight, blend_weight_is_ground_weight,\n                                camera)));\n  }\n\n  SfsOptions                         const& m_opt;\n  int                                       m_col, m_row;\n  vw::ImageView<double>             const & m_dem;            // alias\n  vw::cartography::GeoReference     const & m_geo;            // alias\n  bool                                      m_model_shadows;\n  double                                    m_camera_position_step_size;\n  double                            const & m_max_dem_height; // alias\n  double                                    m_gridx, m_gridy;\n  asp::ReflParams                   const & m_refl_params;    // alias\n  vw::Vector3                       const & m_sunPosition;    // alias\n  vw::BBox2i                                m_crop_box;\n  MaskedImgRefT                        const & m_image;          // alias\n  DblImgT                        const & m_blend_weight;   // alias\n  bool                                      m_blend_weight_is_ground_weight;\n  vw::CamPtr                        const & m_camera;         // alias\n};\n\n// A variation of the intensity error where only the DEM is floated. This\n// produces the same results as IntensityError (when most quantities are passed\n// as variables that are later fixed), but uses notably less memory.\nstruct IntensityErrorFloatDemOnly {\n  IntensityErrorFloatDemOnly(SfsOptions const& opt, int col, int row,\n                             vw::ImageView<double> const& dem,\n                             double albedo,\n                             double * refl_coeffs,\n                             double * exposure,\n                             double * haze,\n                             vw::cartography::GeoReference const& geo,\n                             bool model_shadows,\n                             double camera_position_step_size,\n                             double const& max_dem_height, // note: this is an alias\n                             double gridx, double gridy,\n                             ReflParams const& refl_params,\n                             vw::Vector3 const& sunPosition,\n                             vw::BBox2i const& crop_box,\n                             MaskedImgRefT const& image,\n                             DblImgT const& blend_weight,\n                             bool blend_weight_is_ground_weight,\n                             vw::CamPtr const& camera):\n    m_opt(opt), m_col(col), m_row(row), m_dem(dem),\n    m_albedo(albedo), m_refl_coeffs(refl_coeffs),\n    m_exposure(exposure), m_haze(haze), m_geo(geo),\n    m_model_shadows(model_shadows),\n    m_camera_position_step_size(camera_position_step_size),\n    m_max_dem_height(max_dem_height),\n    m_gridx(gridx), m_gridy(gridy),\n    m_refl_params(refl_params),\n    m_sunPosition(sunPosition),\n    m_crop_box(crop_box),\n    m_image(image), m_blend_weight(blend_weight),\n    m_blend_weight_is_ground_weight(blend_weight_is_ground_weight),\n    m_camera(camera) {}\n\n  // See SmoothnessError() for the definitions of bottom, top, etc.\n  template <typename F>\n  bool operator()(const F* const left,\n                  const F* const center,\n                  const F* const right,\n                  const F* const bottom,\n                  const F* const top,\n                  F* residuals) const {\n\n    // For this error we do not use p and q, hence just use a placeholder.\n    bool use_pq = false;\n    const F * const pq = NULL;\n\n    return calc_intensity_residual(m_opt, m_exposure, m_haze,\n                                   left, center, right, bottom, top,\n                                   use_pq, pq,\n                                   &m_albedo,\n                                   m_refl_coeffs,\n                                   m_col, m_row,\n                                   m_dem,  // alias\n                                   m_geo,  // alias\n                                   m_model_shadows,\n                                   m_camera_position_step_size,\n                                   m_max_dem_height,  // alias\n                                   m_gridx, m_gridy,\n                                   m_refl_params,   // alias\n                                   m_sunPosition,    // alias\n                                   m_crop_box,\n                                   m_image,           // alias\n                                   m_blend_weight,    // alias\n                                   m_blend_weight_is_ground_weight,\n                                   m_camera,          // alias\n                                   residuals);\n  }\n\n  // Factory to hide the construction of the CostFunction object from\n  // the client code.\n  static ceres::CostFunction* Create(SfsOptions const& opt, int col, int row,\n                                     vw::ImageView<double> const& dem,\n                                     double albedo,\n                                     double * refl_coeffs,\n                                     double * exposure,\n                                     double * haze,\n                                     vw::cartography::GeoReference const& geo,\n                                     bool model_shadows,\n                                     double camera_position_step_size,\n                                     double const& max_dem_height, // alias\n                                     double gridx, double gridy,\n                                     ReflParams const& refl_params,\n                                     vw::Vector3 const& sunPosition,\n                                     vw::BBox2i const& crop_box,\n                                     MaskedImgRefT const& image,\n                                     DblImgT const& blend_weight,\n                                     bool blend_weight_is_ground_weight,\n                                     vw::CamPtr const& camera) {\n    return (new ceres::NumericDiffCostFunction<IntensityErrorFloatDemOnly,\n            ceres::CENTRAL, 1, 1, 1, 1, 1, 1>\n            (new IntensityErrorFloatDemOnly(opt, col, row, dem,\n                                            albedo, refl_coeffs,\n                                            exposure, haze, geo,\n                                            model_shadows,\n                                            camera_position_step_size,\n                                            max_dem_height,\n                                            gridx, gridy,\n                                            refl_params, sunPosition,\n                                            crop_box, image, blend_weight,\n                                            blend_weight_is_ground_weight,\n                                            camera)));\n  }\n\n  SfsOptions                const & m_opt;\n  int                               m_col, m_row;\n  vw::ImageView<double>     const & m_dem;            // alias\n  double                            m_albedo;\n  double                          * m_refl_coeffs;\n  double                          * m_exposure;\n  double                          * m_haze;\n  vw::cartography::GeoReference const & m_geo;            // alias\n  bool                              m_model_shadows;\n  double                            m_camera_position_step_size;\n  double                    const & m_max_dem_height; // alias\n  double                            m_gridx, m_gridy;\n  asp::ReflParams           const & m_refl_params;  // alias\n  vw::Vector3               const & m_sunPosition;   // alias\n  vw::BBox2i                        m_crop_box;\n  MaskedImgRefT             const & m_image;          // alias\n  DblImgT                   const & m_blend_weight;   // alias\n  bool                              m_blend_weight_is_ground_weight;\n  vw::CamPtr                const & m_camera;         // alias\n}; // end class IntensityErrorFloatDemOnly\n\n// A variant of the intensity error when we float the partial derivatives\n// in x and in y of the dem, which we call p and q.\n// TODO(oalexan1): Validate again if this gives better results as compared to\n// usual intensity error.\nstruct IntensityErrorPQ {\n  IntensityErrorPQ(SfsOptions const& opt, int col, int row,\n                   vw::ImageView<double> const& dem,\n                   vw::cartography::GeoReference const& geo,\n                   bool model_shadows,\n                   double camera_position_step_size,\n                   double const& max_dem_height, // note: this is an alias\n                   double gridx, double gridy,\n                   ReflParams const& refl_params,\n                   vw::Vector3 const& sunPosition,\n                   vw::BBox2i const& crop_box,\n                   MaskedImgRefT const& image,\n                   DblImgT const& blend_weight,\n                   bool blend_weight_is_ground_weight,\n                   vw::CamPtr const& camera):\n    m_opt(opt), m_col(col), m_row(row), m_dem(dem), m_geo(geo),\n    m_model_shadows(model_shadows),\n    m_camera_position_step_size(camera_position_step_size),\n    m_max_dem_height(max_dem_height),\n    m_gridx(gridx), m_gridy(gridy),\n    m_refl_params(refl_params),\n    m_sunPosition(sunPosition),\n    m_crop_box(crop_box),\n    m_image(image), m_blend_weight(blend_weight),\n    m_blend_weight_is_ground_weight(blend_weight_is_ground_weight),\n    m_camera(camera) {}\n\n  // See SmoothnessError() for the definitions of bottom, top, etc.\n  template <typename F>\n  bool operator()(const F* const exposure,\n                  const F* const haze,\n                  const F* const center_h,\n                  const F* const pq,                 // array of length 2\n                  const F* const albedo,\n                  const F* const refl_coeffs,\n                  F* residuals) const {\n\n    bool use_pq = true;\n\n    F v = 0;\n    return calc_intensity_residual(m_opt, exposure, haze, &v, center_h, &v, &v, &v,\n                                   use_pq, pq, albedo,\n                                   refl_coeffs,\n                                   m_col, m_row,\n                                   m_dem,  // alias\n                                   m_geo,  // alias\n                                   m_model_shadows,\n                                   m_camera_position_step_size,\n                                   m_max_dem_height,  // alias\n                                   m_gridx, m_gridy,\n                                   m_refl_params,   // alias\n                                   m_sunPosition,    // alias\n                                   m_crop_box,\n                                   m_image,           // alias\n                                   m_blend_weight,    // alias\n                                   m_blend_weight_is_ground_weight,\n                                   m_camera,          // alias\n                                   residuals);\n  }\n\n  // Factory to hide the construction of the CostFunction object from the client\n  // code.\n  static ceres::CostFunction* Create(SfsOptions const& opt, int col, int row,\n                                     vw::ImageView<double> const& dem,\n                                     vw::cartography::GeoReference const& geo,\n                                     bool model_shadows,\n                                     double camera_position_step_size,\n                                     double const& max_dem_height, // alias\n                                     double gridx, double gridy,\n                                     ReflParams const& refl_params,\n                                     vw::Vector3 const& sunPosition,\n                                     vw::BBox2i const& crop_box,\n                                     MaskedImgRefT const& image,\n                                     DblImgT const& blend_weight,\n                                     bool blend_weight_is_ground_weight,\n                                     vw::CamPtr const& camera) {\n    return (new ceres::NumericDiffCostFunction<IntensityErrorPQ,\n            ceres::CENTRAL, 1, 1, g_max_num_haze_coeffs, 1, 2, 1, g_num_model_coeffs>\n            (new IntensityErrorPQ(opt, col, row, dem, geo,\n                                  model_shadows,\n                                  camera_position_step_size,\n                                  max_dem_height,\n                                  gridx, gridy,\n                                  refl_params, sunPosition,\n                                  crop_box, image, blend_weight,\n                                  blend_weight_is_ground_weight,\n                                  camera)));\n  }\n\n  SfsOptions                    const & m_opt;\n  int m_col, m_row;\n  vw::ImageView<double>         const & m_dem;            // alias\n  vw::cartography::GeoReference const & m_geo;            // alias\n  bool                                  m_model_shadows;\n  double                                m_camera_position_step_size;\n  double                        const & m_max_dem_height; // alias\n  double                                m_gridx, m_gridy;\n  ReflParams                    const & m_refl_params;  // alias\n  vw::Vector3                   const & m_sunPosition;   // alias\n  vw::BBox2i                            m_crop_box;\n  MaskedImgRefT                 const & m_image;          // alias\n  DblImgT                       const & m_blend_weight;   // alias\n  bool                                  m_blend_weight_is_ground_weight;\n  vw::CamPtr                    const & m_camera;         // alias\n};\n\n// Discrepancy between measured and computed intensity. Assume fixed reflectance,\n// as this is only an initial estimate. See calcSimIntensity() for the formula.\nstruct IntensityErrorFixedReflectance {\n  IntensityErrorFixedReflectance(vw::PixelMask<float> const& intensity,\n                                 vw::PixelMask<float> const& reflectance,\n                                 int num_haze_coeffs,\n                                 double steepness_factor):\n    m_intensity(intensity), m_reflectance(reflectance),\n    m_num_haze_coeffs(num_haze_coeffs), m_steepness_factor(steepness_factor) {}\n\n  template <typename F>\n  bool operator()(const F* const exposure, const F* const haze, const F* const albedo,\n                  F* residuals) const {\n\n    if (!vw::is_valid(m_intensity) || !vw::is_valid(m_reflectance)) {\n      residuals[0] = 0;\n      return true;\n    }\n    \n    residuals[0] = calcSimIntensity(albedo[0], m_reflectance, exposure[0],\n                                    m_steepness_factor, haze, m_num_haze_coeffs)\n                 - m_intensity;\n\n    return true;\n  }\n\n  // Factory to hide the construction of the CostFunction object from\n  // the client code.\n  static ceres::CostFunction* Create(vw::PixelMask<float> const& intensity,\n                                     vw::PixelMask<float> const& reflectance,\n                                     int num_haze_coeffs,\n                                     double steepness_factor) {\n    return (new ceres::NumericDiffCostFunction<IntensityErrorFixedReflectance,\n            ceres::CENTRAL,\n            // residual, exposure, haze, albedo\n            1, 1, g_max_num_haze_coeffs, 1>\n            (new IntensityErrorFixedReflectance(intensity, reflectance,\n                                                num_haze_coeffs, steepness_factor)));\n  }\n\n  vw::PixelMask<float> m_intensity, m_reflectance;\n  int m_num_haze_coeffs;\n  double m_steepness_factor;\n};\n\n// The smoothness error is the sum of squares of\n// the 4 second order partial derivatives, with a weight:\n// error = smoothness_weight * (u_xx^2 + u_xy^2 + u_yx^2 + u_yy^2)\n\n// We will use finite differences to compute these.\n// Consider a grid point and its neighbors, 9 points in all.\n//\n// bl   = u(c-1, r+1)  bottom = u(c, r+1) br    = u(c+1,r+1)\n// left = u(c-1, r)  center = u(c, r) right = u(c+1,r)\n// tl   = u(c-1, r-1)  top    = u(c, r-1) tr    = u(c+1,r-1)\n//\n// See https://en.wikipedia.org/wiki/Finite_difference\n// for the obtained formulas.\nstruct SmoothnessError {\n  SmoothnessError(double smoothness_weight, double gridx, double gridy):\n    m_smoothness_weight(smoothness_weight),\n    m_gridx(gridx), m_gridy(gridy) {}\n\n  template <typename T>\n  bool operator()(const T* const bl,   const T* const bottom,    const T* const br,\n                  const T* const left, const T* const center,    const T* const right,\n                  const T* const tl,   const T* const top,       const T* const tr,\n                  T* residuals) const {\n\n    // Normalize by grid size seems to make the functional less\n    // sensitive to the actual grid size used.\n    residuals[0] = (left[0] + right[0] - 2*center[0])/m_gridx/m_gridx;   // u_xx\n    residuals[1] = (br[0] + tl[0] - bl[0] - tr[0])/4.0/m_gridx/m_gridy; // u_xy\n    residuals[2] = residuals[1];                                         // u_yx\n    residuals[3] = (bottom[0] + top[0] - 2*center[0])/m_gridy/m_gridy;   // u_yy\n\n    for (int i = 0; i < 4; i++)\n      residuals[i] *= m_smoothness_weight;\n\n    return true;\n  }\n\n  // Factory to hide the construction of the CostFunction object from\n  // the client code.\n  static ceres::CostFunction* Create(double smoothness_weight,\n                                     double gridx, double gridy) {\n    return (new ceres::NumericDiffCostFunction<SmoothnessError,\n            ceres::CENTRAL, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1>\n            (new SmoothnessError(smoothness_weight, gridx, gridy)));\n  }\n\n  double m_smoothness_weight, m_gridx, m_gridy;\n};\n\n// The gradient error is the sum of squares of\n// the first order partial derivatives, with a weight:\n// error = gradient_weight * (u_x^2 + u_y^2)\n\n// We will use finite differences to compute these. See\n// SmoothnessError() for more details.\nstruct GradientError {\n  GradientError(double gradient_weight, double gridx, double gridy):\n    m_gradient_weight(gradient_weight), m_gridx(gridx), m_gridy(gridy) {}\n\n  template <typename T>\n  bool operator()(const T* const bottom, const T* const left, const T* const center,\n                  const T* const right, const T* const top, T* residuals) const {\n\n    // This results in a smoother solution than using centered differences\n    residuals[0] = (right[0]  - center[0])/m_gridx; // u_x\n    residuals[1] = (center[0] - left[0])/m_gridx; // u_x\n    residuals[2] = (top[0]    - center[0])/m_gridy; // u_y\n    residuals[3] = (center[0] - bottom[0])/m_gridy; // u_y\n\n    for (int i = 0; i < 4; i++)\n      residuals[i] *= m_gradient_weight;\n\n    return true;\n  }\n\n  // Factory to hide the construction of the CostFunction object from\n  // the client code.\n  static ceres::CostFunction* Create(double gradient_weight,\n                                     double gridx, double gridy) {\n    return (new ceres::NumericDiffCostFunction<GradientError,\n            ceres::CENTRAL, 4, 1, 1, 1, 1, 1>\n            (new GradientError(gradient_weight, gridx, gridy)));\n  }\n\n  double m_gradient_weight, m_gridx, m_gridy;\n};\n\n// Try to make the DEM in shadow have positive curvature. The error term is\n// (curvature_weight *(terrain_xx + terrain_xy - curvature))^2 in the shadow,\n// and not used in lit areas.\nstruct CurvatureInShadowError {\n  CurvatureInShadowError(double curvature_in_shadow, double curvature_in_shadow_weight,\n                         double gridx, double gridy):\n    m_curvature_in_shadow(curvature_in_shadow),\n    m_curvature_in_shadow_weight(curvature_in_shadow_weight),\n    m_gridx(gridx), m_gridy(gridy) {}\n\n  template <typename T>\n  bool operator()(const T* const bottom, const T* const left, const T* const center,\n                  const T* const right, const T* const top, T* residuals) const {\n\n    // Normalize by grid size seems to make the functional less\n    // sensitive to the actual grid size used.\n    double u_xx = (left[0] + right[0] - 2*center[0])/m_gridx/m_gridx;   // u_xx\n    double u_yy = (bottom[0] + top[0] - 2*center[0])/m_gridy/m_gridy;   // u_yy\n\n    residuals[0] = m_curvature_in_shadow_weight*(u_xx + u_yy - m_curvature_in_shadow);\n\n    return true;\n  }\n\n  // Factory to hide the construction of the CostFunction object from\n  // the client code.\n  static ceres::CostFunction* Create(double curvature_in_shadow,\n                                     double curvature_in_shadow_weight,\n                                     double gridx, double gridy) {\n    return (new ceres::NumericDiffCostFunction<CurvatureInShadowError,\n            ceres::CENTRAL, 1, 1, 1, 1, 1, 1>\n            (new CurvatureInShadowError(curvature_in_shadow, curvature_in_shadow_weight,\n                                        gridx, gridy)));\n  }\n\n  double m_curvature_in_shadow, m_curvature_in_shadow_weight, m_gridx, m_gridy;\n};\n\nstruct SmoothnessErrorPQ {\n  SmoothnessErrorPQ(double smoothness_weight_pq, double gridx, double gridy):\n    m_smoothness_weight_pq(smoothness_weight_pq),\n    m_gridx(gridx), m_gridy(gridy) {}\n\n  template <typename T>\n  bool operator()(const T* const bottom_pq, const T* const left_pq, const T* const right_pq,\n                  const T* const top_pq, T* residuals) const {\n\n    // Normalize by grid size seems to make the functional less\n    // sensitive to the actual grid size used.\n    residuals[0] = (right_pq[0] - left_pq[0])/(2*m_gridx);   // p_x\n    residuals[1] = (top_pq[0] - bottom_pq[0])/(2*m_gridy);   // p_y\n    residuals[2] = (right_pq[1] - left_pq[1])/(2*m_gridx);   // q_x\n    residuals[3] = (top_pq[1] - bottom_pq[1])/(2*m_gridy);   // q_y\n\n    for (int i = 0; i < 4; i++)\n      residuals[i] *= m_smoothness_weight_pq;\n\n    return true;\n  }\n\n  // Factory to hide the construction of the CostFunction object from\n  // the client code.\n  static ceres::CostFunction* Create(double smoothness_weight_pq,\n                                     double gridx, double gridy) {\n    return (new ceres::NumericDiffCostFunction<SmoothnessErrorPQ,\n            ceres::CENTRAL, 4, 2, 2, 2, 2>\n            (new SmoothnessErrorPQ(smoothness_weight_pq, gridx, gridy)));\n  }\n\n  double m_smoothness_weight_pq, m_gridx, m_gridy;\n};\n\n// The integrability error is the discrepancy between the\n// independently optimized gradients p and q, and the partial\n// derivatives of the dem, here denoted by u.\n// error = integrability_weight * ((u_x - p)^2 + (u_y - q)^2)\n// See SmoothnessError for the notation below.\nstruct IntegrabilityError {\n  IntegrabilityError(double integrability_weight, double gridx, double gridy):\n    m_integrability_weight(integrability_weight),\n    m_gridx(gridx), m_gridy(gridy) {}\n\n  template <typename T>\n  bool operator()(const T* const bottom, const T* const left, const T* const right,\n                  const T* const top, const T* const pq,\n                  T* residuals) const {\n\n    residuals[0] = (right[0] - left[0])/(2*m_gridx) - pq[0];\n    residuals[1] = (top[0] - bottom[0])/(2*m_gridy) - pq[1];\n\n    for (int i = 0; i < 2; i++)\n      residuals[i] *= m_integrability_weight;\n\n    return true;\n  }\n\n  // Factory to hide the construction of the CostFunction object from\n  // the client code.\n  static ceres::CostFunction* Create(double integrability_weight,\n                                     double gridx, double gridy) {\n    return (new ceres::NumericDiffCostFunction<IntegrabilityError,\n            ceres::CENTRAL, 2, 1, 1, 1, 1, 2>\n            (new IntegrabilityError(integrability_weight, gridx, gridy)));\n  }\n\n  double m_integrability_weight, m_gridx, m_gridy;\n};\n\n// A cost function that will penalize deviating too much from the original DEM height.\nstruct HeightChangeError {\n  HeightChangeError(double orig_height, double initial_dem_constraint_weight):\n    m_orig_height(orig_height),\n    m_initial_dem_constraint_weight(initial_dem_constraint_weight) {}\n\n  template <typename T>\n  bool operator()(const T* const center, T* residuals) const {\n    residuals[0] = (center[0] - m_orig_height)*m_initial_dem_constraint_weight;\n    return true;\n  }\n\n  // Factory to hide the construction of the CostFunction object from\n  // the client code.\n  static ceres::CostFunction* Create(double orig_height,\n                                     double initial_dem_constraint_weight) {\n    return (new ceres::NumericDiffCostFunction<HeightChangeError,\n            ceres::CENTRAL, 1, 1>\n            (new HeightChangeError(orig_height, initial_dem_constraint_weight)));\n  }\n\n  double m_orig_height, m_initial_dem_constraint_weight;\n};\n\n// A cost function that will penalize deviating too much from the initial albedo.\nstruct AlbedoChangeError {\n  AlbedoChangeError(double initial_albedo, double albedo_constraint_weight):\n    m_initial_albedo(initial_albedo), m_albedo_constraint_weight(albedo_constraint_weight) {}\n\n  template <typename T>\n  bool operator()(const T* const center, T* residuals) const {\n    residuals[0] = (center[0] - m_initial_albedo)*m_albedo_constraint_weight;\n    return true;\n  }\n\n  // Factory to hide the construction of the CostFunction object from\n  // the client code.\n  static ceres::CostFunction* Create(double initial_albedo,\n                                     double albedo_constraint_weight) {\n    return (new ceres::NumericDiffCostFunction<AlbedoChangeError, ceres::CENTRAL, 1, 1>\n            (new AlbedoChangeError(initial_albedo, albedo_constraint_weight)));\n  }\n\n  double m_initial_albedo, m_albedo_constraint_weight;\n};\n\n// TODO(oalexan1): This should be modularized\nvoid sfsCostFun(// Fixed quantities\n                double                                gridx,\n                double                                gridy,\n                double                                smoothness_weight,\n                double                                max_dem_height,\n                double                                dem_nodata_val,\n                float                                 img_nodata_val,\n                bool                                  blend_weight_is_ground_weight,\n                vw::cartography::GeoReference const & geo,\n                std::vector<vw::BBox2i>       const & crop_boxes,\n                std::vector<MaskedImgRefT>    const & masked_images,\n                std::vector<DblImgT>          const & blend_weights,\n                asp::ReflParams               const & refl_params,\n                std::vector<vw::Vector3>      const & sunPosition,\n                vw::ImageView<double>         const & orig_dem,\n                vw::ImageView<int>            const & lit_image_mask,\n                vw::ImageView<double>         const & curvature_in_shadow_weight,\n                // Variable quantities\n                asp::SfsOptions                     & opt,\n                vw::ImageView<double>               & dem,\n                vw::ImageView<double>               & albedo,\n                std::vector<vw::CamPtr>             & cameras,\n                std::vector<double>                 & exposures,\n                std::vector<std::vector<double>>    & haze,\n                std::vector<double>                 & refl_coeffs,\n                vw::ImageView<vw::Vector2>          & pq,\n                ceres::Problem                      & problem) {\n\n  int num_images = opt.input_images.size();\n\n  // See if a given image is used in at least one clip or skipped in\n  // all of them\n  std::vector<bool> use_image(num_images, false);\n  int num_used = 0;\n  for (int image_iter = 0; image_iter < num_images; image_iter++) {\n    if (opt.skip_images.find(image_iter) == opt.skip_images.end()) {\n      use_image[image_iter] = true;\n      num_used++;\n    }\n  }\n\n  // We define p and q as the partial derivatives in x in y of the dem.\n  // When using the integrability constraint, they are floated as variables\n  // in their own right, while constrained to not go too far from the DEM.\n  if (opt.integrability_weight > 0) {\n    pq.set_size(dem.cols(), dem.rows());\n    for (int col = 1; col < dem.cols()-1; col++) {\n      for (int row = 1; row < dem.rows()-1; row++) {\n        pq(col, row)[0] = (dem(col+1, row) - dem(col-1, row))/(2*gridx); // right - left\n        pq(col, row)[1] = (dem(col, row-1) - dem(col, row+1))/(2*gridy); // top - bottom\n      }\n    }\n  }\n\n  // Use a simpler cost function if only the DEM is floated. This results in\n  // notably reduced memory usage but no gain in speed.\n  bool float_dem_only = true;\n  if (opt.float_albedo || opt.float_exposure || opt.fix_dem || opt.float_reflectance_model ||\n      opt.float_haze || opt.integrability_weight > 0) {\n    float_dem_only = false;\n  }\n\n  // Add a residual block for every grid point not at the boundary\n  int bd = 1;\n  for (int col = bd; col < dem.cols() - bd; col++) {\n    for (int row = bd; row < dem.rows() - bd; row++) {\n\n      // Intensity error for each image\n      for (int image_iter = 0; image_iter < num_images; image_iter++) {\n\n        if (opt.skip_images.find(image_iter) != opt.skip_images.end())\n          continue;\n\n        ceres::LossFunction* loss_function_img = NULL;\n        if (opt.robust_threshold > 0)\n          loss_function_img = new ceres::CauchyLoss(opt.robust_threshold);\n\n        if (float_dem_only) {\n          ceres::CostFunction* cost_function_img =\n            IntensityErrorFloatDemOnly::Create(opt, col, row,\n                                               dem,\n                                               albedo(col, row),\n                                               &refl_coeffs[0],\n                                               &exposures[image_iter], &haze[image_iter][0],\n                                               geo,\n                                               opt.model_shadows,\n                                               opt.camera_position_step_size,\n                                               max_dem_height,\n                                               gridx, gridy,\n                                               refl_params, sunPosition[image_iter],\n                                               crop_boxes[image_iter],\n                                               masked_images[image_iter],\n                                               blend_weights[image_iter],\n                                               blend_weight_is_ground_weight,\n                                               cameras[image_iter]);\n          problem.AddResidualBlock(cost_function_img, loss_function_img,\n                                    &dem(col-1, row),  // left\n                                    &dem(col, row),    // center\n                                    &dem(col+1, row),  // right\n                                    &dem(col, row+1),  // bottom\n                                    &dem(col, row-1)); // top\n        } else if (opt.integrability_weight == 0) {\n          ceres::CostFunction* cost_function_img =\n            IntensityError::Create(opt, col, row, dem, geo,\n                                   opt.model_shadows,\n                                   opt.camera_position_step_size,\n                                   max_dem_height,\n                                   gridx, gridy,\n                                   refl_params, sunPosition[image_iter],\n                                   crop_boxes[image_iter],\n                                   masked_images[image_iter],\n                                   blend_weights[image_iter],\n                                   blend_weight_is_ground_weight,\n                                   cameras[image_iter]);\n          problem.AddResidualBlock(cost_function_img, loss_function_img,\n                                   &exposures[image_iter],       // exposure\n                                   &haze[image_iter][0],         // haze\n                                   &dem(col-1, row),  // left\n                                   &dem(col, row),    // center\n                                   &dem(col+1, row),  // right\n                                   &dem(col, row+1),  // bottom\n                                   &dem(col, row-1),  // top\n                                   &albedo(col, row), // albedo\n                                   &refl_coeffs[0]);\n        } else {\n          // Use the integrability constraint\n          ceres::CostFunction* cost_function_img =\n            IntensityErrorPQ::Create(opt, col, row, dem, geo,\n                                      opt.model_shadows,\n                                      opt.camera_position_step_size,\n                                      max_dem_height,\n                                      gridx, gridy,\n                                      refl_params, sunPosition[image_iter],\n                                      crop_boxes[image_iter],\n                                      masked_images[image_iter],\n                                      blend_weights[image_iter],\n                                      blend_weight_is_ground_weight,\n                                      cameras[image_iter]);\n          problem.AddResidualBlock(cost_function_img, loss_function_img,\n                                    &exposures[image_iter],          // exposure\n                                    &haze[image_iter][0],            // haze\n                                    &dem(col, row),       // center\n                                    &pq(col, row)[0],      // pq\n                                    &albedo(col, row),    // albedo\n                                    &refl_coeffs[0]);   // reflectance\n        }\n\n      } // end iterating over images\n\n      // Smoothness penalty. We always add this, even if the smoothness weight is 0,\n      // to make Ceres not complain about blocks not being set.\n      ceres::LossFunction* loss_function_sm = NULL;\n      ceres::CostFunction* cost_function_sm =\n        SmoothnessError::Create(smoothness_weight, gridx, gridy);\n      problem.AddResidualBlock(cost_function_sm, loss_function_sm,\n                                &dem(col-1, row+1),  // bottom left\n                                &dem(col, row+1),    // bottom\n                                &dem(col+1, row+1),  // bottom right\n                                &dem(col-1, row),    // left\n                                &dem(col, row),      // center\n                                &dem(col+1, row),    // right\n                                &dem(col-1, row-1),  // top left\n                                &dem(col, row-1),    // top\n                                &dem(col+1, row-1)); // top right\n\n      // Add curvature in shadow. Note that we use a per-pixel curvature_in_shadow_weight,\n      // to gradually phase it in to avoid artifacts.\n      if (opt.curvature_in_shadow_weight > 0.0 &&\n          curvature_in_shadow_weight(col, row) > 0) {\n        ceres::LossFunction* loss_function_cv = NULL;\n        ceres::CostFunction* cost_function_cv =\n          CurvatureInShadowError::Create(opt.curvature_in_shadow,\n                                          curvature_in_shadow_weight(col, row),\n                                          gridx, gridy);\n        problem.AddResidualBlock(cost_function_cv, loss_function_cv,\n                                  &dem(col,   row+1),  // bottom\n                                  &dem(col-1, row),    // left\n                                  &dem(col,   row),    // center\n                                  &dem(col+1, row),    // right\n                                  &dem(col,   row-1)); // top\n      }\n\n      // Add gradient weight\n      if (opt.gradient_weight > 0.0) {\n        ceres::LossFunction* loss_function_grad = NULL;\n        ceres::CostFunction* cost_function_grad =\n          GradientError::Create(opt.gradient_weight, gridx, gridy);\n        problem.AddResidualBlock(cost_function_grad, loss_function_grad,\n                                  &dem(col,   row+1),  // bottom\n                                  &dem(col-1, row),    // left\n                                  &dem(col,   row),    // center\n                                  &dem(col+1, row),    // right\n                                  &dem(col,   row-1)); // top\n      }\n\n      if (opt.integrability_weight > 0) {\n        ceres::LossFunction* loss_function_int = NULL;\n        ceres::CostFunction* cost_function_int =\n          IntegrabilityError::Create(opt.integrability_weight, gridx, gridy);\n        problem.AddResidualBlock(cost_function_int, loss_function_int,\n                                  &dem(col,   row+1),   // bottom\n                                  &dem(col-1, row),     // left\n                                  &dem(col+1, row),     // right\n                                  &dem(col,   row-1),   // top\n                                  &pq  (col,   row)[0]); // pq\n\n        if (opt.smoothness_weight_pq > 0) {\n          ceres::LossFunction* loss_function_sm_pq = NULL;\n          ceres::CostFunction* cost_function_sm_pq =\n            SmoothnessErrorPQ::Create(opt.smoothness_weight_pq, gridx, gridy);\n          problem.AddResidualBlock(cost_function_sm_pq, loss_function_sm_pq,\n                                    &pq(col, row+1)[0],  // bottom\n                                    &pq(col-1, row)[0],  // left\n                                    &pq(col+1, row)[0],  // right\n                                    &pq(col, row-1)[0]); // top\n        }\n      }\n\n      // Deviation from prescribed height constraint\n      if (opt.initial_dem_constraint_weight > 0) {\n        ceres::LossFunction* loss_function_hc = NULL;\n        ceres::CostFunction* cost_function_hc =\n          HeightChangeError::Create(orig_dem(col, row),\n                                    opt.initial_dem_constraint_weight);\n        problem.AddResidualBlock(cost_function_hc, loss_function_hc,\n                                  &dem(col, row));\n      }\n\n      // Deviation from prescribed albedo\n      if (opt.float_albedo > 0 && opt.albedo_constraint_weight > 0) {\n        ceres::LossFunction* loss_function_hc = NULL;\n        if (opt.albedo_robust_threshold > 0)\n          loss_function_hc = new ceres::CauchyLoss(opt.albedo_robust_threshold);\n        ceres::CostFunction* cost_function_hc =\n          AlbedoChangeError::Create(albedo(col, row), opt.albedo_constraint_weight);\n        problem.AddResidualBlock(cost_function_hc, loss_function_hc, &albedo(col, row));\n      } // end if float albedo\n\n    } // end row iter\n  } // end col iter\n\n  // DEM at the boundary must be fixed\n  for (int col = 0; col < dem.cols(); col++) {\n    for (int row = 0; row < dem.rows(); row++) {\n      if (col == 0 || col == dem.cols() - 1 || row == 0 || row == dem.rows() - 1) {\n          problem.SetParameterBlockConstant(&dem(col, row));\n      }\n    }\n  }\n\n  if (opt.fix_dem) {\n    for (int col = 0; col < dem.cols(); col++) {\n      for (int row = 0; row < dem.rows(); row++)\n        problem.SetParameterBlockConstant(&dem(col, row));\n    }\n  }\n\n  if (opt.initial_dem_constraint_weight <= 0 && num_used <= 1) {\n\n    if (opt.float_albedo && opt.albedo_constraint_weight <= 0) {\n      vw::vw_out() << \"No DEM or albedo constraint is used, and there is at most one \"\n                   << \"usable image. Fixing the albedo.\\n\";\n\n      opt.float_albedo = false;\n    }\n\n    // If there's just one image, don't float the exposure, as the\n    // problem is under-determined. If we float the albedo, we will\n    // implicitly float the exposure, hence keep the exposure itself\n    // fixed.\n    if (opt.float_exposure) {\n      vw::vw_out() << \"No DEM constraint is used, and there is at most one \"\n                << \"usable image. Fixing the exposure.\\n\";\n      opt.float_exposure = false;\n    }\n  }\n\n  // If to float the albedo\n  if (!float_dem_only) {\n    for (int col = 1; col < dem.cols() - 1; col++) {\n      for (int row = 1; row < dem.rows() - 1; row++) {\n        if (!opt.float_albedo && num_used > 0)\n          problem.SetParameterBlockConstant(&albedo(col, row));\n      }\n    }\n  }\n\n  if (!float_dem_only) {\n\n    // If floating the DEM only, none of the below parameters are even added to the problem,\n    // it does not make sense to check to keep them fixed or floating them.\n\n    if (!opt.float_exposure) {\n      for (int image_iter = 0; image_iter < num_images; image_iter++) {\n        if (use_image[image_iter])\n          problem.SetParameterBlockConstant(&exposures[image_iter]);\n      }\n    }\n    if (!opt.float_haze) {\n      for (int image_iter = 0; image_iter < num_images; image_iter++) {\n        if (use_image[image_iter])\n          problem.SetParameterBlockConstant(&haze[image_iter][0]);\n      }\n    }\n\n    // If to float the reflectance model coefficients\n    if (!opt.float_reflectance_model && num_used > 0)\n      problem.SetParameterBlockConstant(&refl_coeffs[0]);\n  }\n\n} // end function formCostFun()\n\n// Find the best-fit exposure and haze given the input sampled image and reflectance.\n// Also find the sampled albedo along the way. The albedo will be optimized\n// only if --float-albedo is on. Otherwise it will be kept at the nominal value.\nvoid estimExposureHazeAlbedo(SfsOptions & opt,\n                             std::vector<MaskedImgRefT> const& masked_images,\n                             std::vector<DblImgT> const& blend_weights,\n                             bool blend_weight_is_ground_weight,\n                             vw::ImageView<double> const& dem,\n                             double mean_albedo,\n                             vw::cartography::GeoReference const& geo,\n                             std::vector<vw::CamPtr> const& cameras,\n                             double & max_dem_height,\n                             std::vector<vw::BBox2i> const& crop_boxes,\n                             std::vector<vw::Vector3> const& sunPosition,\n                             asp::ReflParams const& refl_params,\n                             double gridx, double gridy) {\n\n  vw::vw_out() << \"Estimating the exposure, haze, albedo.\\n\";\n  if (!opt.float_albedo)\n    vw::vw_out() << \"The albedo is fixed.\\n\";\n\n  // Sample large DEMs\n  int sample_col_rate = 0, sample_row_rate = 0;\n  asp::calcSampleRates(dem, opt.num_samples_for_estim, sample_col_rate, sample_row_rate);\n\n  int num_images = opt.input_images.size();\n  std::vector<double> local_exposures_vec(num_images, 0), local_haze_vec(num_images, 0);\n\n  std::vector<MaskedDblImgT> reflectance(num_images), intensity(num_images);\n  int num_sampled_cols = 0, num_sampled_rows = 0;\n  for (int image_iter = 0; image_iter < num_images; image_iter++) {\n\n    if (opt.skip_images.find(image_iter) != opt.skip_images.end())\n      continue;\n\n    vw::ImageView<double> ground_weight;\n    vw::ImageView<vw::Vector2> pq; // no need for these just for initialization\n    bool show_progress = false;\n    computeReflectanceAndIntensity(dem, pq, geo,\n                                   opt.model_shadows, show_progress, max_dem_height,\n                                   gridx, gridy, sample_col_rate, sample_row_rate,\n                                   sunPosition[image_iter],\n                                   refl_params,\n                                   crop_boxes[image_iter],\n                                   masked_images[image_iter],\n                                   blend_weights[image_iter],\n                                   blend_weight_is_ground_weight,\n                                   cameras[image_iter],\n                                   reflectance[image_iter], intensity[image_iter],\n                                   ground_weight,\n                                   &opt.model_coeffs_vec[0], opt);\n\n    num_sampled_cols = reflectance[image_iter].cols();\n    num_sampled_rows = reflectance[image_iter].rows();\n  }\n\n  // Create the inital albedo image, of same size as sampled intensity\n  vw::ImageView<double> albedo(num_sampled_cols, num_sampled_rows);\n  for (int col = 0; col < albedo.cols(); col++) {\n    for (int row = 0; row < albedo.rows(); row++) {\n      albedo(col, row) = mean_albedo;\n    }\n  }\n  \n  // Create the image of valid pixels, so where albedo was solved for\n  vw::ImageView<int> valid_mask(num_sampled_cols, num_sampled_rows);\n  for (int col = 0; col < valid_mask.cols(); col++) {\n    for (int row = 0; row < valid_mask.rows(); row++) {\n      valid_mask(col, row) = 0;\n    }\n  }\n\n  // Create the problem\n  ceres::Problem problem;\n\n  // Add a residual block for every pixel in each image\n  for (int image_iter = 0; image_iter < num_images; image_iter++) {\n    for (int col = 0; col < intensity[image_iter].cols(); col++) {\n      for (int row = 0; row < intensity[image_iter].rows(); row++) {\n        \n        // Skip invalid pixels, such as at boundary. The albedo will be kept\n        // to its initial value at these pixels.\n        if (!vw::is_valid(intensity[image_iter](col, row)) ||\n            !vw::is_valid(reflectance[image_iter](col, row)))\n          continue;\n        \n        // Mark this albedo pixel as valid\n        valid_mask(col, row) = 1;\n\n        ceres::CostFunction* cost_function_img =\n          IntensityErrorFixedReflectance::Create(intensity[image_iter](col, row),\n                                                  reflectance[image_iter](col, row),\n                                                  opt.num_haze_coeffs,\n                                                  opt.steepness_factor);\n\n        ceres::LossFunction* loss_function_img = NULL;\n        if (opt.robust_threshold > 0)\n          loss_function_img = new ceres::CauchyLoss(opt.robust_threshold);\n\n        problem.AddResidualBlock(cost_function_img,\n                                loss_function_img,\n                                &opt.image_exposures_vec[image_iter],\n                                &opt.image_haze_vec[image_iter][0],\n                                &albedo(col, row));\n\n        // If zero haze coefficients are used, fix the haze\n        if (opt.num_haze_coeffs == 0)\n          problem.SetParameterBlockConstant(&opt.image_haze_vec[image_iter][0]);\n\n        if (!opt.float_albedo)\n          problem.SetParameterBlockConstant(&albedo(col, row));\n          \n      } // end row\n    } // end col\n  } // end image_iter\n\n  // Deviation from prescribed albedo at each albedo pixel\n  if (opt.float_albedo > 0 && opt.albedo_constraint_weight > 0) {\n    for (int col = 0; col < albedo.cols(); col++) {\n      for (int row = 0; row < albedo.rows(); row++) {\n        ceres::LossFunction* loss_function_hc = NULL;\n        if (opt.albedo_robust_threshold > 0)\n          loss_function_hc = new ceres::CauchyLoss(opt.albedo_robust_threshold);\n        ceres::CostFunction* cost_function_hc =\n          AlbedoChangeError::Create(albedo(col, row), opt.albedo_constraint_weight);\n        problem.AddResidualBlock(cost_function_hc, loss_function_hc, &albedo(col, row));\n      } // end row\n    } // end col\n  }\n\n  // Ceres options\n  ceres::Solver::Options options;\n  options.gradient_tolerance = 1e-16;\n  options.function_tolerance = 1e-16;\n  options.max_num_iterations = opt.max_iterations;\n  options.minimizer_progress_to_stdout = 1;\n  options.num_threads = opt.num_threads;\n  options.linear_solver_type = ceres::SPARSE_SCHUR;\n\n  // Solve the problem\n  ceres::Solver::Summary summary;\n  ceres::Solve(options, &problem, &summary);\n  vw::vw_out() << summary.FullReport() << \"\\n\";\n\n  if (opt.float_albedo) {\n    \n    // In-fill the albedo image to reduce boundary artifacts\n    inFillImage3x3(albedo, valid_mask);\n    \n    // Up-sample the estimated albedo to full-res dimensions with bilinear\n    // interpolation. This is not needed and not used if albedo is not floated.\n    bool has_georef = true;\n    bool has_nodata = true;\n    double albedo_nodata_val = -1e+6; // large but reasonable\n    vw::TerminalProgressCallback tpc(\"asp\", \": \");\n    std::string albedo_file = opt.out_prefix + \"-albedo-estim.tif\";\n    vw::vw_out() << \"Up-sampling the estimated albedo to input DEM dimensions.\\n\";\n    vw::vw_out() << \"Writing: \" << albedo_file << \"\\n\";\n    // Note: This logic produces junk if the SfsInterpView is initialized on a\n    // separate line and then passed to block_write_gdal_image(). Not clear why.\n    vw::cartography::block_write_gdal_image(albedo_file, \n                           SfsInterpView(dem.cols(), dem.rows(), sample_col_rate,\n                                         sample_row_rate, albedo),\n                           has_georef, geo, has_nodata, albedo_nodata_val, opt, tpc);\n  }\n\n  // The haze and exposures will be saved outside this function.\n  return;\n}\n\n// Check if a parameter block is valid (exists and is not constant)\nbool isValidBlock(ceres::Problem const& problem, double const* block) {\n  return problem.HasParameterBlock(block) && !problem.IsParameterBlockConstant(block);\n}\n\n// Setup the blocks for covariance calculation. Keep on appending to\n// parameter_blocks. Need dx and dy for when doing covariances with neighbors.\n// Use a set to avoid duplicates.\nvoid setupCovarCalc(vw::ImageView<double> const& image,\n                    ceres::Problem const& problem,\n                    std::vector<int> const& dx,\n                    std::vector<int> const& dy,\n                    std::set<const double*> &block_set) {\n  for (int col = 0; col < image.cols(); col++) {\n    for (int row = 0; row < image.rows(); row++) {\n      for (size_t i = 0; i < dx.size(); i++) {\n        int c = col + dx[i];\n        int r = row + dy[i];\n        if (c < 0 || c >= image.cols() || r < 0 || r >= image.rows())\n          continue;\n        // Add to a set, to avoid duplicates\n        if (isValidBlock(problem, &image(c, r)))\n          block_set.insert(&image(c, r));\n      }\n    }\n  }\n}\n\n// Compute the DEM covariance for the given problem, and also the albedo covariance,\n// if --float-albedo is on. If --save-covariances is on, also save covariances\n// of each DEM pixel with the four horizontal and vertical neighbors. Same for\n// albedo.\nbool calcSfsCovariances(SfsOptions const& opt,\n                        vw::ImageView<double> const& dem,\n                        vw::ImageView<double> const& albedo,\n                        ceres::Problem &problem,\n                        std::vector<int> const& dx,\n                        std::vector<int> const& dy,\n                        ceres::Covariance &covariance) { // output\n\n  if (opt.save_covariances)\n    vw::vw_out() << \"Computing covariances.\\n\";\n  else\n    vw::vw_out() << \"Computing variances.\\n\";\n\n  // Collect unique parameter blocks using a set\n  std::set<const double*> block_set;\n  setupCovarCalc(dem, problem, dx, dy, block_set);\n  if (opt.float_albedo)\n    setupCovarCalc(albedo, problem, dx, dy, block_set);\n\n  // Convert the set of pointers to a vector for CERES\n  std::vector<const double*> parameter_blocks(block_set.begin(), block_set.end());\n\n  if (!covariance.Compute(parameter_blocks, &problem)) {\n    vw::vw_out(vw::WarningMessage)\n      << \"The CERES solver failed to compute the covariances. If --float-albedo is on, \"\n      << \"consider disabling one or both of --float-haze and --float-exposures, \"\n      << \"and perhaps increasing --albedo-constraint-weight, to make the problem better \"\n      << \"determined.\\n\";\n    return false;\n  }\n  \n  return true;\n}\n\n// Save the variances and/or covariances of a given parameter set. Cast to float\n// upon saving.\nvoid saveSfsCovariances(SfsOptions const& opt,\n                        vw::ImageView<double> const& values,\n                        std::string const& file_prefix,\n                        std::vector<std::string> const& suffixes,\n                        std::vector<int> const& dx,\n                        std::vector<int> const& dy,\n                        vw::cartography::GeoReference const& geo,\n                        double nodata_val,\n                        ceres::Problem &problem,\n                        ceres::Covariance &covariance) {\n\n  bool has_georef = true, has_nodata = true;\n\n  // Iterate over all the files we need to save\n  for (size_t i = 0; i < suffixes.size(); i++) {\n    vw::ImageView<double> cov_image(values.cols(), values.rows());\n    vw::fill(cov_image, nodata_val);\n\n    for (int col = 0; col < values.cols(); col++) {\n      for (int row = 0; row < values.rows(); row++) {\n        int c = col + dx[i];\n        int r = row + dy[i];\n        if (c < 0 || c >= values.cols() || r < 0 || r >= values.rows())\n          continue;\n        if (!isValidBlock(problem, &values(col, row)) || !isValidBlock(problem, &values(c, r)))\n          continue;\n        double cov = 0.0;\n        if (covariance.GetCovarianceBlock(&values(col, row), &values(c, r), &cov))\n          cov_image(col, row) = cov;\n      }\n    }\n    \n    // Set variance to nodata within 3 pixels of the boundary as it is somewhat\n    // inaccurate due to boundary conditions, and can result in tiling artifacts in\n    // parallel_sfs.\n    int margin = 3;\n    for (int col = 0; col < cov_image.cols(); col++) {\n      for (int row = 0; row < cov_image.rows(); row++) {\n        if (col < margin || col >= cov_image.cols() - margin ||\n            row < margin || row >= cov_image.rows() - margin)\n          cov_image(col, row) = nodata_val;\n      }\n    }\n\n    std::string out_file = file_prefix + suffixes[i];\n    vw::vw_out() << \"Writing: \" << out_file << \"\\n\";\n    vw::TerminalProgressCallback tpc(\"asp\", \": \");\n    vw::cartography::block_write_gdal_image(out_file,\n                                            vw::pixel_cast<float>(cov_image),\n                                            has_georef, geo,\n                                            has_nodata, nodata_val, opt, tpc);\n  }\n}\n\n// Compute and save the covariances\nvoid calcSaveSfsCovariances(SfsOptions const& opt,\n                            vw::ImageView<double> const& dem,\n                            vw::ImageView<double> const& albedo,\n                            ceres::Problem &problem,\n                            vw::cartography::GeoReference const& geo,\n                            double dem_nodata_val) {\n\n  // The variance is for a pixel with itself. For covariance will need the neighbors.\n  std::vector<int> dx = {0}, dy = {0};\n  if (opt.save_covariances) {\n    dx = {0, 2, -1, 1, 0}; // central-difference\n    dy = {0, 0, 1, 1, 2}; // self, dr0_dc2, dr1_dcn1, dr1_dc1, dr2_dc0\n  }\n\n  ceres::Covariance::Options covariance_options;\n  covariance_options.num_threads = opt.num_threads;\n  ceres::Covariance covariance(covariance_options);\n\n  // Set up the calculation for all covariances. But then save them individually.\n  if (!calcSfsCovariances(opt, dem, albedo, problem, dx, dy, covariance))\n    return;\n    \n  // File name suffixes for variance and covariances. Indices match dx/dy.\n  std::vector<std::string> suffixes = {\"-variance.tif\"};\n  if (opt.save_covariances)\n    suffixes = { // self, dr0_dc2, dr1_dcn1, dr1_dc1, dr2_dc0\n                 \"-variance.tif\",\n                 \"-dr0_dc2-covariance.tif\",\n                 \"-dr1_dcn1-covariance.tif\",\n                 \"-dr1_dc1-covariance.tif\",\n                 \"-dr2_dc0-covariance.tif\",\n               };\n\n  // Save DEM variance and covariances\n  saveSfsCovariances(opt, dem, opt.out_prefix + \"-DEM\", suffixes, dx, dy,\n                     geo, dem_nodata_val, problem, covariance);\n\n  // Save albedo variance and covariances\n  if (opt.float_albedo)\n    saveSfsCovariances(opt, albedo, opt.out_prefix + \"-albedo\", suffixes, dx, dy,\n                       geo, dem_nodata_val, problem, covariance);\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/SfS/SfsCostFun.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// \\file SfsCostFun.h\n// Cost function logic for SfS\n\n#ifndef __ASP_SFS_SFS_COST_FUN_H__\n#define __ASP_SFS_SFS_COST_FUN_H__\n\n#include <asp/SfS/SfsErrorEstim.h>\n#include <asp/SfS/SfsModel.h>\n\n#include <vw/Image/ImageView.h>\n#include <vw/Image/PixelMask.h>\n#include <vw/Camera/CameraModel.h>\n#include <vw/Cartography/GeoReference.h>\n\n#include <ceres/ceres.h>\n#include <ceres/loss_function.h>\n\nnamespace asp {\n\nclass SfsOptions;\n\n// A function to invoke at every iteration of ceres.\nclass SfsCallback: public ceres::IterationCallback {\n\npublic:\n\n  // Constructor to initialize references to the necessary data\n  SfsCallback(asp::SfsOptions const& opt, \n              vw::ImageView<double>& dem,\n              vw::ImageView<vw::Vector2>& pq,\n              vw::ImageView<double>& albedo, \n              vw::cartography::GeoReference const& geo, \n              asp::ReflParams const& refl_params, \n              std::vector<vw::Vector3> const& sunPosition,\n              std::vector<vw::BBox2i> const& crop_boxes, \n              std::vector<asp::MaskedImgRefT> const& masked_images,\n              std::vector<asp::DblImgT> const& blend_weights,\n              bool blend_weight_is_ground_weight,\n              std::vector<vw::CamPtr>& cameras, \n              double& dem_nodata_val, float& img_nodata_val,\n              std::vector<double>& exposures, \n              std::vector<std::vector<double>>& haze,\n              double& max_dem_height, double& gridx, double& gridy,\n              std::vector<double> & refl_coeffs);\n\n  virtual ceres::CallbackReturnType \n  operator()(const ceres::IterationSummary& summary) override;\n\n  void set_final_iter(bool is_final_iter);\n\nprivate:\n\n  // Class members storing references to the data\n  asp::SfsOptions const& opt;\n  vw::ImageView<double>& dem;\n  vw::ImageView<vw::Vector2>& pq;\n  vw::ImageView<double>& albedo;\n  vw::cartography::GeoReference const& geo;\n  asp::ReflParams const& refl_params;\n  std::vector<vw::Vector3> const& sunPosition;\n  std::vector<vw::BBox2i> const& crop_boxes;\n  std::vector<asp::MaskedImgRefT> const& masked_images;\n  std::vector<asp::DblImgT> const& blend_weights;\n  bool blend_weight_is_ground_weight;\n  std::vector<vw::CamPtr>& cameras;\n  double& dem_nodata_val;\n  float& img_nodata_val;\n  std::vector<double>& exposures;\n  std::vector<std::vector<double>>& haze;\n  double& max_dem_height;\n  double& gridx;\n  double& gridy;\n  std::vector<double> refl_coeffs;\n  int iter;\n  bool final_iter;\n};\n\n// Form the SfS cost function\nvoid sfsCostFun(// Fixed quantities\n                double                                gridx,\n                double                                gridy,\n                double                                smoothness_weight,\n                double                                max_dem_height,\n                double                                dem_nodata_val,\n                float                                 img_nodata_val,\n                bool                                  blend_weight_is_ground_weight,\n                vw::cartography::GeoReference const & geo,\n                std::vector<vw::BBox2i>       const & crop_boxes,\n                std::vector<MaskedImgRefT>    const & masked_images,\n                std::vector<DblImgT>          const & blend_weights,\n                asp::ReflParams               const & refl_params,\n                std::vector<vw::Vector3>      const & sunPosition,\n                vw::ImageView<double>         const & orig_dem,\n                vw::ImageView<int>            const & lit_image_mask,\n                vw::ImageView<double>         const & curvature_in_shadow_weight,\n                // Variable quantities\n                asp::SfsOptions                     & opt,\n                vw::ImageView<double>               & dem,\n                vw::ImageView<double>               & albedo,\n                std::vector<vw::CamPtr>             & cameras,\n                std::vector<double>                 & exposures,\n                std::vector<std::vector<double>>    & haze,\n                std::vector<double>                 & refl_coeffs,\n                vw::ImageView<vw::Vector2>          & pq,\n                ceres::Problem                      & problem);\n\n// Find the best-fit exposure and haze given the input sampled image and reflectance.\n// Also find the sampled albedo along the way. The albedo will be optimized\n// only if --float-albedo is on. Otherwise it will be kept at the nominal value.\nvoid estimExposureHazeAlbedo(SfsOptions & opt,\n                             std::vector<MaskedImgRefT> const& masked_images,\n                             std::vector<DblImgT> const& blend_weights,\n                             bool blend_weight_is_ground_weight,\n                             vw::ImageView<double> const& dem,\n                             double mean_albedo,\n                             vw::cartography::GeoReference const& geo,\n                             std::vector<vw::CamPtr> const& cameras,\n                             double & max_dem_height,\n                             std::vector<vw::BBox2i> const& crop_boxes,\n                             std::vector<vw::Vector3> const& sunPosition,\n                             asp::ReflParams const& refl_params,\n                             double gridx, double gridy);\n\n// Compute and save the covariances\nvoid calcSaveSfsCovariances(SfsOptions const& opt,\n                            vw::ImageView<double> const& dem,\n                            vw::ImageView<double> const& albedo,\n                            ceres::Problem &problem,\n                            vw::cartography::GeoReference const& geo,\n                            double dem_nodata_val);\n\n} // end namespace asp\n\n#endif // __ASP_SFS_SFS_COST_FUN_H__\n"
  },
  {
    "path": "src/asp/SfS/SfsErrorEstim.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// \\file SfsErrorEstim.cc\n// SfS error estimation methods\n\n#include <asp/SfS/SfsErrorEstim.h>\n#include <asp/SfS/SfsModel.h>\n\n#include <vw/Cartography/GeoReferenceUtils.h>\n#include <vw/Core/Log.h>\n#include <vw/Core/ProgressCallback.h>\n#include <vw/FileIO/FileUtils.h>\n\n#include <string>\n#include <map>\n\nnamespace asp {\n\n// Use this struct to keep track of height errors.\nHeightErrEstim::\nHeightErrEstim(int num_cols, int num_rows, int num_height_samples_in,\n               double max_height_error_in, double nodata_height_val_in,\n               vw::ImageView<double> const* albedo_in) {\n\n  num_height_samples = num_height_samples_in; // TODO(oalexan1): This must be a parameter\n  max_height_error   = max_height_error_in;   // TODO(oalexan1): This must be a parameter\n  nodata_height_val  = nodata_height_val_in;\n\n  albedo = albedo_in;\n\n  image_iter = 0; // will be modified later\n\n  height_error_vec.set_size(num_cols, num_rows);\n  for (int col = 0; col < num_cols; col++) {\n    for (int row = 0; row < num_rows; row++) {\n      height_error_vec(col, row)[0] = -max_height_error;\n      height_error_vec(col, row)[1] =  max_height_error;\n    }\n  }\n\n} // end constructor\n\n// Given the normal (height) to the SfS DEM, find how different\n// a height can be from this before the computed intensity\n// due to that height is bigger than max_intensity_err.\nvoid estimateHeightError(vw::ImageView<double> const& dem,\n                         vw::cartography::GeoReference const& geo,\n                         vw::Vector3 const& cameraPosition,\n                         vw::Vector3 const& sunPosition,\n                         asp::ReflParams const& refl_params,\n                         const double * refl_coeffs,\n                         double meas_intensity,\n                         double max_intensity_err,\n                         int col, int row,\n                         double grid_x, double grid_y,\n                         int image_iter,\n                         asp::SfsOptions const& opt,\n                         vw::ImageView<double> const& albedo,\n                         asp::HeightErrEstim * heightErrEstim) {\n\n  // Look at the neighbors\n  int cols[] = {col - 1, col,     col,     col + 1};\n  int rows[] = {row,     row - 1, row + 1, row};\n  for (int it = 0; it < 4; it++) {\n\n    int colx = cols[it], rowx = rows[it];\n\n    // Can't be at edges as need to compute normals\n    if (colx <= 0 || rowx <= 0 || colx >= dem.cols() - 1 || rowx >= dem.rows() - 1)\n      continue;\n\n    // Perturb the height down and up\n    for (int sign = -1; sign <= 1; sign += 2) {\n      for (int height_it = 0; height_it < heightErrEstim->num_height_samples; height_it++) {\n        double dh = sign * heightErrEstim->max_height_error\n          * double(height_it)/double(heightErrEstim->num_height_samples);\n\n        if (sign == -1) {\n          if (dh < heightErrEstim->height_error_vec(colx, rowx)[0]) {\n            // We already determined dh can't go as low, so stop here\n            break;\n          }\n        } else if (sign == 1) {\n          if (dh > heightErrEstim->height_error_vec(colx, rowx)[1]) {\n            break;\n          }\n        }\n\n        // Determine where to add the dh. Recall that we compute the intensity\n        // at (col, row), while perturbing the dem height at (colx, rowx)\n        double left_dh = 0, center_dh = 0, right_dh = 0, bottom_dh = 0, top_dh = 0;\n        if (colx == col - 1 && rowx == row) left_dh   = dh;\n        else if (colx == col     && rowx == row) center_dh = dh; // won't be reached\n        else if (colx == col + 1 && rowx == row) right_dh  = dh;\n        else if (colx == col     && rowx == row + 1) bottom_dh = dh;\n        else if (colx == col     && rowx == row - 1) top_dh    = dh;\n\n        double left_h   = dem(col - 1, row)     + left_dh;\n        double center_h = dem(col,     row)     + center_dh;\n        double right_h  = dem(col + 1, row)     + right_dh;\n        double bottom_h = dem(col,     row + 1) + bottom_dh;\n        double top_h    = dem(col,     row - 1) + top_dh;\n\n        vw::Vector3 xyz, normal;\n        bool use_pq = false;\n        double p = 0.0, q = 0.0;\n        calcPointAndNormal(col, row, left_h, center_h, right_h, bottom_h, top_h,\n                           use_pq, p, q, geo, grid_x, grid_y, xyz, normal);\n\n        vw::PixelMask<double> reflectance\n           = asp::calcReflectance(cameraPosition, normal, xyz, sunPosition,\n                                  refl_params, refl_coeffs);\n        reflectance.validate();\n        double sim_intensity\n          = asp::calcSimIntensity(albedo(col, row), reflectance,\n                                  opt.image_exposures_vec[image_iter],\n                                  opt.steepness_factor, &opt.image_haze_vec[image_iter][0],\n                                  opt.num_haze_coeffs);\n\n        if (std::abs(sim_intensity - meas_intensity) > max_intensity_err) {\n          // We exceeded the error budget, record the dh at which it happens\n          if (sign == -1) {\n            heightErrEstim->height_error_vec(colx, rowx)[0] = dh;\n          } else if (sign == 1) {\n            heightErrEstim->height_error_vec(colx, rowx)[1] = dh;\n          }\n\n          break;\n        }\n\n      }\n    }\n  }\n\n  return;\n} // end function estimateHeightError\n\n// Estimate the height error at each DEM pixel based on estimates for each image\nvoid combineHeightErrors(boost::shared_ptr<HeightErrEstim> const& heightErrEstim,\n                         SfsOptions const& opt, vw::cartography::GeoReference const& geo) {\n\n  // Find the height error from the range of heights\n  vw::ImageView<float> height_error;\n  height_error.set_size(heightErrEstim->height_error_vec.cols(),\n                        heightErrEstim->height_error_vec.rows());\n  for (int col = 0; col < height_error.cols(); col++) {\n    for (int row = 0; row < height_error.rows(); row++) {\n      height_error(col, row)\n        = std::max(-heightErrEstim->height_error_vec(col, row)[0],\n                    heightErrEstim->height_error_vec(col, row)[1]);\n\n      // When we are stuck at the highest error that means we could not find it\n      if (height_error(col, row) == heightErrEstim->max_height_error)\n        height_error(col, row) = heightErrEstim->nodata_height_val;\n    }\n  }\n  \n  vw::TerminalProgressCallback tpc(\"asp\", \": \");\n  bool has_georef = true, has_nodata = true;\n  std::string height_error_file = opt.out_prefix + \"-height-error.tif\";\n  vw::vw_out() << \"Writing: \" << height_error_file << std::endl;\n  vw::cartography::block_write_gdal_image(height_error_file,\n                                          height_error,\n                                          has_georef, geo,\n                                          has_nodata, heightErrEstim->nodata_height_val,\n                                          opt, tpc);\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/SfS/SfsErrorEstim.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// \\file SfsErrorEstim.h\n// SfS error estimation methods\n\n#ifndef __ASP_SFS_SFS_ERROR_ESTIM_H__\n#define __ASP_SFS_SFS_ERROR_ESTIM_H__\n\n#include <asp/SfS/SfsOptions.h>\n\n#include <vw/Image/ImageView.h>\n#include <vw/Cartography/GeoReference.h>\n#include <boost/shared_ptr.hpp>\n\nnamespace asp {\n\nclass ReflParams;\n\n// Use this struct to keep track of height errors.\nstruct HeightErrEstim {\n\n  HeightErrEstim(int num_cols, int num_rows, int num_height_samples_in,\n                 double max_height_error_in, double nodata_height_val_in,\n                 vw::ImageView<double> const* albedo_in);\n\n  int num_height_samples;\n  vw::ImageView<double> const* albedo;\n  vw::ImageView<vw::Vector2> height_error_vec;\n  int image_iter;\n  double max_height_error;\n  double nodata_height_val;\n};\n\n// Given the normal (height) to the SfS DEM, find how different\n// a height can be from this before the computed intensity\n// due to that height is bigger than max_intensity_err.\nvoid estimateHeightError(vw::ImageView<double> const& dem,\n                         vw::cartography::GeoReference const& geo,\n                         vw::Vector3 const& cameraPosition,\n                         vw::Vector3 const& sunPosition,\n                         asp::ReflParams const& refl_params,\n                         const double * refl_coeffs,\n                         double meas_intensity,\n                         double max_intensity_err,\n                         int col, int row,\n                         double grid_x, double grid_y,\n                         int image_iter,\n                         asp::SfsOptions const& opt,\n                         vw::ImageView<double> const& albedo,\n                         asp::HeightErrEstim * heightErrEstim);\n\n// Estimate the height error at each DEM pixel based on estimates for each image\nvoid combineHeightErrors(boost::shared_ptr<HeightErrEstim> const& heightErrEstim,\n                         SfsOptions const& opt, vw::cartography::GeoReference const& geo);\n\n} // end namespace asp\n\n#endif // __ASP_SFS_SFS_ERROR_ESTIM_H__\n"
  },
  {
    "path": "src/asp/SfS/SfsImageProc.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file SfsImageProc.cc\n/// Image processing routines for SfS\n\n#include <asp/SfS/SfsImageProc.h>\n#include <asp/SfS/SfsOptions.h>\n#include <asp/Core/BaseCameraUtils.h>\n\n#include <vw/Core/Log.h>\n#include <vw/Camera/CameraModel.h>\n#include <vw/Cartography/GeoReference.h>\n#include <vw/FileIO/DiskImageIO.h>\n#include <vw/FileIO/DiskImageView.h>\n#include <vw/FileIO/GdalWriteOptions.h>\n#include <vw/Cartography/GeoReferenceUtils.h>\n#include <vw/Image/Transform.h>\n#include <vw/Image/InpaintView.h>\n#include <vw/Image/Filter.h>\n#include <vw/Image/NoDataAlg.h>\n#include <vw/Image/DistanceFunction.h>\n#include <vw/Core/ProgressCallback.h>\n\n#include <boost/filesystem.hpp>\n\n#include <string>\n\nnamespace fs = boost::filesystem;\nusing namespace vw;\n\nnamespace asp {\n\n// Calculate exposure and haze, and decide if an image should be skipped.\nvoid calcExposureHazeSkipImages(// Inputs\n                                asp::MaskedDblImgT const& intensity,\n                                asp::MaskedDblImgT const& reflectance,\n                                double mean_albedo,\n                                int image_iter,\n                                std::vector<std::string> const& input_images,\n                                // In-out\n                                std::vector<double>      & local_exposures_vec,\n                                std::vector<double>      & local_haze_vec,\n                                std::set<int>            & skip_images) {\n\n  // TODO: Below is not the optimal way of finding the exposure!\n  // Find it as the analytical minimum using calculus.\n  double imgmean, imgstd, refmean, refstd;\n  asp::calcJointStats(intensity, reflectance, imgmean, imgstd, refmean, refstd);\n  double haze = 0.0;\n  if (imgmean > 0 && refmean > 0) {\n    double exposure = imgmean/refmean/mean_albedo;\n    local_exposures_vec[image_iter] = exposure;\n    local_haze_vec[image_iter] = haze;\n\n  } else {\n    // Skip images with bad exposure. Apparently there is no good\n    // imagery in the area.\n    skip_images.insert(image_iter);\n    // log out the skipped image path and the image_iter for it\n    vw_out() << \"Skipped image \" << image_iter << \": \" << input_images[image_iter]\n             << \" with no data for this DEM.\\n\";\n  }\n}\n\n// Compute mean and standard deviation of two images. Do it where both are valid.\nvoid calcJointStats(MaskedDblImgT const& I1,\n                    MaskedDblImgT const& I2,\n                    double & mean1, double & std1,\n                    double & mean2, double & std2) {\n\n  if (I1.cols() != I2.cols() || I1.rows() != I2.rows())\n    vw_throw(ArgumentErr() << \"Expecting two input images of same size.\\n\");\n\n  mean1 = 0; std1 = 0;\n  mean2 = 0; std2 = 0;\n\n  double sum1 = 0.0, sum2 = 0.0, sum1_sq = 0.0, sum2_sq = 0.0, count = 0.0;\n  for (int col = 0; col < I1.cols(); col++) {\n    for (int row = 0; row < I1.rows(); row++) {\n\n      if (!is_valid(I1(col, row)) || !is_valid(I2(col, row))) continue;\n\n      count++;\n\n      double val1 = I1(col, row); sum1 += val1; sum1_sq += val1*val1;\n      double val2 = I2(col, row); sum2 += val2; sum2_sq += val2*val2;\n    }\n  }\n\n  if (count > 0) {\n    mean1 = sum1/count; std1 = sqrt(sum1_sq/count - mean1*mean1);\n    mean2 = sum2/count; std2 = sqrt(sum2_sq/count - mean2*mean2);\n  }\n\n  return;\n}\n\n// Given a set of images of same dimensions, find the per-pixel maximum.\nvoid maxImage(int cols, int rows,\n              std::set<int> const& skip_images,\n              std::vector<vw::ImageView<double>> const& images,\n              ImageView<double> & max_image) {\n\n  int num_images = images.size();\n\n  max_image.set_size(cols, rows);\n  for (int col = 0; col < cols; col++) {\n    for (int row = 0; row < rows; row++) {\n      max_image(col, row) = 0.0;\n    }\n  }\n\n  for (int image_iter = 0; image_iter < num_images; image_iter++) {\n\n    if (skip_images.find(image_iter) != skip_images.end())\n      continue;\n\n    auto & img = images[image_iter]; // alias\n    if (img.cols() <= 0 || img.rows() <= 0)\n      continue;\n\n    if (img.cols() != cols || img.rows() != rows)\n      vw::vw_throw(vw::ArgumentErr() << \"The input DEM and computed extended images \"\n                   << \"must have the same dimensions.\\n\");\n\n    for (int col = 0; col < img.cols(); col++) {\n      for (int row = 0; row < img.rows(); row++) {\n        max_image(col, row) = std::max(max_image(col, row), img(col, row));\n      }\n    }\n  }\n\n  return;\n}\n\n// Max image function, but with masked pixels\nvoid maxImage(int cols, int rows,\n              std::set<int> const& skip_images,\n              std::vector<MaskedDblImgT> const& images,\n              vw::ImageView<double> & max_image) {\n\n  int num_images = images.size();\n\n  max_image.set_size(cols, rows);\n  for (int col = 0; col < cols; col++) {\n    for (int row = 0; row < rows; row++) {\n\n      // Initialize to 0\n      max_image(col, row) = 0.0;\n\n      // Iterate over images, except the skipped ones\n      for (int image_iter = 0; image_iter < num_images; image_iter++) {\n\n        if (skip_images.find(image_iter) != skip_images.end())\n          continue;\n\n        // Skip if meas intensity is invalid\n        if (!is_valid(images[image_iter](col, row)))\n          continue;\n\n        double inten = images[image_iter](col, row).child();\n        if (inten > max_image(col, row))\n          max_image(col, row) = inten;\n      }\n    }\n  }\n}\n\ndouble maxDemHeight(vw::ImageView<double> const& dem) {\n\n  double max_dem_height = -std::numeric_limits<double>::max();\n  for (int col = 0; col < dem.cols(); col++) {\n    for (int row = 0; row < dem.rows(); row++) {\n      if (dem(col, row) > max_dem_height) {\n        max_dem_height = dem(col, row);\n      }\n    }\n  }\n\n  return max_dem_height;\n}\n\n// TODO(oalexan1): The albedo must have its own no-data value.\n// Must check the albedo has everywhere valid values.\ndouble meanAlbedo(vw::ImageView<double> const& dem,\n                  vw::ImageView<double> const& albedo,\n                  double dem_nodata_val) {\n\n  double mean_albedo = 0.0, albedo_count = 0.0;\n  for (int col = 0; col < dem.cols(); col++) {\n    for (int row = 0; row < dem.rows(); row++) {\n      if (dem(col, row) != dem_nodata_val) {\n        mean_albedo += albedo(col, row);\n        albedo_count += 1.0;\n      }\n    }\n  }\n\n  if (albedo_count > 0)\n    mean_albedo /= albedo_count;\n  else\n    mean_albedo = 0.0; // Or some other sensible default\n\n  return mean_albedo;\n}\n\n// Given an image with float pixels, find the pixels where the image\n// value is non-positive but some of its neighbors have positive\n// values. Create an image which has the value 1 at such pixels and\n// whose values linearly decrease to 0 both in the direction of pixels\n// with positive and non-positive input values.\nvoid boundaryWeight(int blending_dist, ImageView<double> const & image, // inputs\n                    ImageView<double> & boundary_weight) { // output\n\n  double blending_dist_sq = blending_dist * blending_dist;\n  int max_dist_int = ceil(blending_dist); // an int overestimate\n\n  // Initialize the output to 0\n  int cols = image.cols(), rows = image.rows();\n  boundary_weight.set_size(cols, rows);\n  for (int col = 0; col < cols; col++) {\n    for (int row = 0; row < rows; row++) {\n      boundary_weight(col, row) = 0.0;\n    }\n  }\n\n  for (int col = 0; col < cols; col++) {\n    for (int row = 0; row < rows; row++) {\n\n      // Look for a boundary pixel, which is a pixel with non-positive\n      // value but with neighbors with positive value\n      if (image(col, row) > 0)\n        continue;\n\n      bool is_bd_pix = false;\n      for (int c = col - 1; c <= col + 1; c++) {\n        for (int r = row - 1; r <= row + 1; r++) {\n          if (c < 0 || c >= cols || r < 0 || r >= rows)\n            continue;\n          if (image(c, r) > 0) {\n            is_bd_pix = true;\n            break; // found it\n          }\n        }\n        if (is_bd_pix)\n          break; // found it\n      }\n      if (!is_bd_pix)\n        continue; // did not find it\n\n      // Found the boundary pixel. Increase the weight in the circular\n      // neighborhood. It will decay to 0 at the boundary of this\n      // neighborhood.\n      for (int c = col - max_dist_int; c <= col + max_dist_int; c++) {\n        for (int r = row - max_dist_int; r <= row + max_dist_int; r++) {\n          if (c < 0 || c >= cols || r < 0 || r >= rows)\n            continue;\n\n          // Cast to double before multiplying to avoid integer overflow\n          double dsq = double(c - col) * double(c - col) +\n            double(r - row) * double(r - row);\n\n          // Too far\n          if (dsq >= blending_dist_sq)\n            continue;\n\n          double d = sqrt(dsq);\n          d = blending_dist - d; // get a cone pointing up, with base at height 0.\n          d /= double(blending_dist); // make it between 0 and 1\n          d = std::max(d, 0.0); // should not be necessary\n          // Add its contribution\n          boundary_weight(c, r) = std::max(boundary_weight(c, r), d);\n        }\n      }\n    }\n  }\n\n  return;\n}\n\n// Given an image with non-negative values, create another image\n// which is 1 where the input image has positive values, and decays\n// to 0 linearly beyond that.\nvoid extendedWeight(int blending_dist, ImageView<double> const & image, // inputs\n                    ImageView<double> & extended_weight) { // output\n\n  int cols = image.cols(), rows = image.rows();\n  extended_weight.set_size(cols, rows);\n  for (int col = 0; col < image.cols(); col++) {\n    for (int row = 0; row < image.rows(); row++) {\n      extended_weight(col, row) = (image(col, row) > 0);\n    }\n  }\n\n  double blending_dist_sq = blending_dist * blending_dist;\n  int max_dist_int = ceil(blending_dist); // an int overestimate\n\n  for (int col = 0; col < cols; col++) {\n    for (int row = 0; row < rows; row++) {\n\n      // Look for a boundary pixel, which is a pixel with zero\n          // weight but with neighbors with positive weight\n      if (image(col, row) > 0)\n            continue;\n      bool is_bd_pix = false;\n      for (int c = col - 1; c <= col + 1; c++) {\n        for (int r = row - 1; r <= row + 1; r++) {\n          if (c < 0 || c >= cols || r < 0 || r >= rows)\n            continue;\n          if (image(c, r) > 0) {\n            is_bd_pix = true;\n            break; // found it\n          }\n        }\n        if (is_bd_pix)\n          break; // found it\n      }\n      if (!is_bd_pix)\n        continue; // did not find it\n\n      // Found the boundary pixel. Increase the weight in the\n      // circular neighborhood.  It will still be below 1\n      // and decay to 0 at the boundary of this neighborhood.\n      for (int c = col - max_dist_int; c <= col + max_dist_int; c++) {\n        for (int r = row - max_dist_int; r <= row + max_dist_int; r++) {\n          if (c < 0 || c >= cols || r < 0 || r >= rows)\n            continue;\n\n          // Cast to double before multiplying to avoid integer overflow\n          double dsq = double(c - col) * double(c - col) +\n            double(r - row) * double(r - row);\n\n          // Too far\n          if (dsq >= blending_dist_sq)\n            continue;\n\n          double d = sqrt(dsq);\n          d = blending_dist - d; // get a cone pointing up, with base at height 0.\n          d /= double(blending_dist); // make it between 0 and 1\n          d = std::max(d, 0.0); // should not be necessary\n          // Add its contribution\n          extended_weight(c, r) = std::max(extended_weight(c, r), d);\n        }\n      }\n    }\n  }\n\n  return;\n}\n\n// Saves the weights corresponding to mapprojected images\nvoid saveWeights(std::set<int> const& skip_images,\n                 std::string const& out_prefix,\n                 std::vector<std::string> const& input_images,\n                 std::vector<std::string> const& input_cameras,\n                 std::string const& tag, \n                 std::vector<vw::ImageView<double>> const& ground_weights,\n                 vw::cartography::GeoReference const& geo,\n                 vw::GdalWriteOptions const& opt) {\n\n  int num_images = input_images.size();\n  float img_nodata_val = -std::numeric_limits<float>::max(); // part of api\n\n  for (int image_iter = 0; image_iter < num_images; image_iter++) {\n\n    if (skip_images.find(image_iter) != skip_images.end())\n      continue;\n\n    std::string out_camera_file\n      = asp::bundle_adjust_file_name(out_prefix,\n                                      input_images[image_iter],\n                                      input_cameras[image_iter]);\n    std::string local_prefix = fs::path(out_camera_file).replace_extension(\"\").string();\n\n    bool has_georef = true, has_nodata = false;\n    std::string ground_weight_file = local_prefix + \"-\" + tag + \"_weight.tif\";\n    vw_out() << \"Writing: \" << ground_weight_file << std::endl;\n    vw::cartography::block_write_gdal_image(ground_weight_file,\n                                            ground_weights[image_iter],\n                                            has_georef, geo, has_nodata,\n                                            img_nodata_val, opt,\n                                            TerminalProgressCallback(\"asp\", \": \"));\n\n  }\n}\n\n// Adjust the weights at the boundary of the max-lit region\n// so they don't decay to 0, as there we need all the image data\n// we get, and there's no concern that we'll create a seam\n// with some other better data. Weights which are already 0 by then\n// but are non-zero close to that interface get grown too, depending,\n// on how close they get to that interface.\n// We do not recompute these weights as the DEM changes, which is an approximation.\nvoid adjustBorderlineDataWeights(int cols, int rows,\n                                 int blending_dist, double blending_power,\n                                 vw::GdalWriteOptions const& opt,\n                                 vw::cartography::GeoReference const& geo,\n                                 std::set<int> const& skip_images,\n                                 std::string const& out_prefix, // for debug data\n                                 std::vector<std::string> const& input_images,\n                                 std::vector<std::string> const& input_cameras,\n                                 std::vector<vw::ImageView<double>> & ground_weights) {\n\n  int num_images = ground_weights.size();\n\n  // Find the max per-pixel weight\n  ImageView<double> max_weight;\n  maxImage(cols, rows, skip_images, ground_weights,\n           max_weight); // output\n\n  // Find a weight which is 1 at the max-lit/unlit interface and decaying linearly\n  // to 0.\n  ImageView<double> boundary_weight;\n  boundaryWeight(blending_dist, max_weight, // inputs\n                 boundary_weight); // output\n\n  // Weights at the boundary of the max lit mosaic are not allowed to decay\n  // all the way to 0 as they are not needed for blending there, and\n  // just result in blur.\n  for (int col = 0; col < cols; col++) {\n    for (int row = 0; row < rows; row++) {\n\n      if (max_weight(col, row) <= 0 || boundary_weight(col, row) <= 0)\n        continue; // not in the region of interest\n\n      for (int image_iter = 0; image_iter < num_images; image_iter++) {\n\n        if (skip_images.find(image_iter) != skip_images.end())\n          continue;\n\n        // Undo the power in the weight being passed in\n        double ground_wt = ground_weights[image_iter](col, row);\n        if (ground_wt <= 0.0)\n          continue;\n\n        double max_wt = max_weight(col, row);\n        ground_wt = pow(ground_wt, 1.0/blending_power);\n        max_wt = pow(max_wt, 1.0/blending_power);\n\n        // The closer one is to the max-lit boundary, the more this\n        // weight is important\n        ground_wt = std::max(ground_wt, ground_wt / max_wt);\n        ground_wt = std::min(ground_wt, 1.0); // not necessary\n\n        // put back the power\n        ground_wt = pow(ground_wt, blending_power);\n\n        // Put back the weight\n        ground_weights[image_iter](col, row) = ground_wt;\n      }\n    }\n  }\n\n  // TODO(oalexan1): Must make sure to make the images have\n  // non-negative but valid values where the weights are positive and\n  // invalid values where they are zero.\n\n  bool save_debug_info = false;\n  if (save_debug_info) {\n    bool has_georef = true, has_nodata = false;\n    float img_nodata_val = -std::numeric_limits<float>::max(); // part of api\n    std::string max_weight_file = out_prefix + \"-max_weight.tif\";\n    vw_out() << \"Writing: \" << max_weight_file << std::endl;\n    vw::cartography::block_write_gdal_image(max_weight_file,\n                                            max_weight,\n                                            has_georef, geo, has_nodata,\n                                            img_nodata_val, opt,\n                                            TerminalProgressCallback(\"asp\", \": \"));\n\n    std::string boundary_weight_file = out_prefix + \"-boundary_weight.tif\";\n    vw_out() << \"Writing: \" << boundary_weight_file << std::endl;\n    vw::cartography::block_write_gdal_image(boundary_weight_file,\n                                            boundary_weight,\n                                            has_georef, geo, has_nodata,\n                                            img_nodata_val, opt,\n                                            TerminalProgressCallback(\"asp\", \": \"));\n\n    // Save the adjusted ground weights\n    saveWeights(skip_images, out_prefix, input_images,\n                input_cameras, \"ground\", ground_weights, geo, opt);\n  } // end saving debug info\n\n  return;\n}\n\n// Find the blending weight for an image. This is 1 inside the lit area and away\n// from any edges or shadows, then linearly decrease to 0 towards such edges,\n// and then is raised to a power to change how it decays to 0.\n// Do not make these decrease around holes smaller than min_blend_size,\n// TODO(oalexan1): Grassfire weights use the Manhattan distance, which\n// result in noisy weights. The Euclidean distance to boundary would work\n// better.\nvw::ImageView<double> blendingWeights(MaskedImgRefT const& img,\n                                      double blending_dist,\n                                      double blending_power,\n                                      int min_blend_size) {\n\n  //   if (img.cols() <= 2 || img.rows() <= 2) {\n  //     // The image is too small to have good weights. grassfire crashes.\n  //     ImageView<double> weights(img.cols(), img.rows());\n  //     for (int col = 0; col < weights.cols(); col++) {\n  //       for (int row = 0; row < weights.rows(); row++) {\n  //     weights(col, row) = 0;\n  //       }\n  //     }\n  //     return weights;\n  //   }\n\n  ImageView<double> weights;\n\n  // The copying seems necessary at each stage to get the correct answer\n  if (min_blend_size <= 0)\n    weights = grassfire(img);\n  else\n    weights = vw::copy(grassfire(vw::copy(vw::fill_holes_grass(vw::copy(img), min_blend_size))));\n\n  // We will later count on this precise logic.\n  for (int col = 0; col < weights.cols(); col++) {\n    for (int row = 0; row < weights.rows(); row++) {\n      weights(col, row) = pow(std::min(weights(col, row)/blending_dist, 1.0),\n                              blending_power);\n    }\n  }\n  return weights;\n}\n\n// Find the points on a given DEM that are shadowed by other points of\n// the DEM.  Start marching from the point on the DEM on a ray towards\n// the sun in small increments, until hitting the maximum DEM height.\nbool isInShadow(int col, int row, Vector3 const& sunPos,\n                ImageView<double> const& dem, double max_dem_height,\n                double gridx, double gridy,\n                cartography::GeoReference const& geo) {\n\n  // Here bicubic interpolation won't work. It is easier to interpret\n  // the DEM as piecewise-linear when dealing with rays intersecting\n  // it.\n  InterpolationView<EdgeExtensionView< ImageView<double>,\n    ConstantEdgeExtension >, BilinearInterpolation>\n    interp_dem = interpolate(dem, BilinearInterpolation(),\n                             ConstantEdgeExtension());\n\n  // The xyz position at the center grid point\n  Vector2 dem_llh = geo.pixel_to_lonlat(Vector2(col, row));\n  Vector3 dem_lonlat_height = Vector3(dem_llh(0), dem_llh(1), dem(col, row));\n  Vector3 xyz = geo.datum().geodetic_to_cartesian(dem_lonlat_height);\n\n  // Normalized direction from the view point\n  Vector3 dir = sunPos - xyz;\n  if (dir == Vector3())\n    return false;\n  dir = dir/norm_2(dir);\n\n  // The projection of dir onto the tangent plane at xyz,\n  // that is, the \"horizontal\" component at the current sphere surface.\n  Vector3 dir2 = dir - dot_prod(dir, xyz)*xyz/dot_prod(xyz, xyz);\n\n  // Ensure that we advance by at most half a grid point each time\n  double delta = 0.5*std::min(gridx, gridy)/std::max(norm_2(dir2), 1e-16);\n\n  // Go along the ray. Don't allow the loop to go forever.\n  for (int i = 1; i < 10000000; i++) {\n    Vector3 ray_P = xyz + i * delta * dir;\n    Vector3 ray_llh = geo.datum().cartesian_to_geodetic(ray_P);\n    if (ray_llh[2] > max_dem_height) {\n      // We're above the highest terrain, no point in continuing\n      return false;\n    }\n\n    // Compensate for any longitude 360 degree offset, e.g., 270 deg vs -90 deg\n    ray_llh[0] += 360.0*round((dem_llh[0] - ray_llh[0])/360.0);\n\n    Vector2 ray_pix = geo.lonlat_to_pixel(Vector2(ray_llh[0], ray_llh[1]));\n\n    if (ray_pix[0] < 0 || ray_pix[0] > dem.cols() - 1 ||\n        ray_pix[1] < 0 || ray_pix[1] > dem.rows() - 1) {\n      return false; // got out of the DEM, no point continuing\n    }\n\n    // Dem height at the current point on the ray\n    double dem_h = interp_dem(ray_pix[0], ray_pix[1]);\n\n    if (ray_llh[2] < dem_h) {\n      // The ray goes under the DEM, so we are in shadow.\n      return true;\n    }\n  }\n\n  return false;\n}\n\nvoid areInShadow(Vector3 const& sunPos, ImageView<double> const& dem,\n                 double gridx, double gridy,\n                 cartography::GeoReference const& geo,\n                 ImageView<float> & shadow) {\n\n  // Find the max DEM height\n  double max_dem_height = -std::numeric_limits<double>::max();\n  for (int col = 0; col < dem.cols(); col++) {\n    for (int row = 0; row < dem.rows(); row++) {\n      if (dem(col, row) > max_dem_height) {\n        max_dem_height = dem(col, row);\n      }\n    }\n  }\n\n  shadow.set_size(dem.cols(), dem.rows());\n  for (int col = 0; col < dem.cols(); col++) {\n    for (int row = 0; row < dem.rows(); row++) {\n      shadow(col, row) = isInShadow(col, row, sunPos, dem,\n                                    max_dem_height, gridx, gridy, geo);\n    }\n  }\n}\n\n// Prototype code to identify permanently shadowed areas\n// and deepen the craters there. Needs to be integrated\n// and tested with various shapes of the deepened crater.\nvoid deepenCraters(std::string const& dem_file,\n                   std::vector<std::string> const& image_files,\n                   double sigma,\n                   std::string const& max_img_file,\n                   std::string const& grass_file,\n                   std::string const& out_dem_file) {\n\n  float dem_nodata_val = -std::numeric_limits<float>::max();\n  if (vw::read_nodata_val(dem_file, dem_nodata_val))\n    vw_out() << \"Dem nodata: \" << dem_nodata_val << \"\\n\";\n\n  ImageView<PixelMask<float>> dem (create_mask(DiskImageView<float>(dem_file), dem_nodata_val));\n  vw::cartography::GeoReference georef;\n  if (!read_georeference(georef, dem_file))\n    vw_throw(ArgumentErr() << \"The input DEM \" << dem_file << \" has no georeference.\\n\");\n\n  // The maximum of all valid pixel values with no-data where there is no-valid data.\n  ImageView<PixelMask<float>> max_img(dem.cols(), dem.rows());\n  for (int col = 0; col < dem.cols(); col++) {\n    for (int row = 0; row < dem.rows(); row++) {\n      max_img(col, row) = dem_nodata_val;\n      max_img(col, row).invalidate();\n    }\n  }\n\n  for (int i = 1; i < image_files.size(); i++) {\n\n    std::string img_file = image_files[i];\n    float img_nodata_val = -std::numeric_limits<float>::max();\n    if (vw::read_nodata_val(img_file, img_nodata_val)) {\n      vw_out() << \"Img nodata: \" << img_nodata_val << std::endl;\n    }\n\n    ImageView<PixelMask<float>> img(create_mask(DiskImageView<float>(img_file),\n                                                img_nodata_val));\n    if (img.cols() != dem.cols() || img.rows() != dem.rows()) {\n      vw_throw(ArgumentErr() << \"Images and DEM must have same size.\\n\");\n    }\n\n    for (int col = 0; col < img.cols(); col++) {\n      for (int row = 0; row < img.rows(); row++) {\n\n        // Nothing to do if the current image has invalid data\n        if (!is_valid(img(col, row)))\n          continue;\n\n        // If the output image is not valid yet, copy the current image's valid pixel\n        if (!is_valid(max_img(col, row) && img(col, row).child() > 0)) {\n          max_img(col, row) = img(col, row);\n          continue;\n        }\n\n        // Now both the current image and the output image are valid\n        if (img(col, row).child() > max_img(col, row).child() &&\n            img(col, row).child() > 0) {\n          max_img(col, row) = img(col, row);\n        }\n\n      }\n    }\n  }\n\n  // At the boundary the intensity is always invalid, but that is due to\n  // computational limitations. Make it valid if we can.\n  // TODO: Test here that the image has at least 3 rows and 3 cols!\n  for (int col = 0; col < max_img.cols(); col++) {\n    for (int row = 0; row < max_img.rows(); row++) {\n      if ((col == 0 || col == max_img.cols() - 1) ||\n           (row == 0 || row == max_img.rows() - 1)) {\n        int next_col = col, next_row = row;\n        if (col == 0) next_col = 1;\n        if (col == max_img.cols() - 1) next_col = max_img.cols() - 2;\n        if (row == 0) next_row = 1;\n        if (row == max_img.rows() - 1) next_row = max_img.rows() - 2;\n\n        if (!is_valid(max_img(col, row)) && is_valid(max_img(next_col, next_row)))\n          max_img(col, row) = max_img(next_col, next_row);\n      }\n    }\n  }\n\n  GdalWriteOptions opt;\n  bool has_nodata = true, has_georef = true;\n  TerminalProgressCallback tpc(\"\", \"\\t--> \");\n\n  vw_out() << \"Writing: \" << max_img_file << \"\\n\";\n  block_write_gdal_image(max_img_file, apply_mask(max_img, dem_nodata_val),\n                         has_georef, georef,\n                         has_nodata, dem_nodata_val,\n                         opt, tpc);\n\n  ImageView<double> grass = grassfire(notnodata(select_channel(max_img, 0), dem_nodata_val));\n\n  // Scale as craters are shallow.\n  // TODO: Need to think of a better algorithm!\n  for (int col = 0; col < grass.cols(); col++) {\n    for (int row = 0; row < grass.rows(); row++) {\n      grass(col, row) *= 0.2;\n    }\n  }\n\n  // Blur with a given sigma\n  ImageView<double> blurred_grass;\n  if (sigma > 0)\n    blurred_grass = gaussian_filter(grass, sigma);\n  else\n    blurred_grass = copy(grass);\n\n  vw_out() << \"Writing: \" << grass_file << \"\\n\";\n\n  bool grass_has_nodata = false;\n  block_write_gdal_image(grass_file, blurred_grass,\n                         has_georef, georef,\n                         grass_has_nodata, dem_nodata_val,\n                         opt, tpc);\n\n  // Bias the DEM by that grassfire height deepening the craters\n  for (int col = 0; col < dem.cols(); col++) {\n    for (int row = 0; row < dem.rows(); row++) {\n      if (is_valid(dem(col, row))) {\n        dem(col, row).child() -= blurred_grass(col, row);\n      }\n    }\n  }\n\n  vw_out() << \"Writing: \" << out_dem_file << \"\\n\";\n  block_write_gdal_image(out_dem_file, apply_mask(dem, dem_nodata_val),\n                         has_georef, georef,\n                         has_nodata, dem_nodata_val,\n                         opt, tpc);\n\n}\n\n// Sample large DEMs. Keep about num_samples row and column samples.\nvoid calcSampleRates(vw::ImageViewRef<double> const& dem, int num_samples,\n                     int & sample_col_rate, int & sample_row_rate) {\n\n  if (num_samples <= 0)\n    vw_throw(ArgumentErr() << \"Expecting a positive number of samples.\\n\");\n\n  sample_col_rate = std::max((int)round(dem.cols()/double(num_samples)), 1);\n  sample_row_rate = std::max((int)round(dem.rows()/double(num_samples)), 1);\n}\n\n// Compute a full-resolution image by specific interpolation into a low-resolution\n// one. The full-res image may not fit in memory, so we need to compute it in tiles.\n// See computeReflectanceAndIntensity() for low-res vs full-res relationship.\nSfsInterpView::SfsInterpView(int full_res_cols, int full_res_rows,\n                             int sample_col_rate, int sample_row_rate,\n                             vw::ImageView<float> const& lowres_img):\n    m_full_res_cols(full_res_cols), m_full_res_rows(full_res_rows),\n    m_sample_col_rate(sample_col_rate), m_sample_row_rate(sample_row_rate),\n    m_lowres_img(lowres_img) {\n  }\n\n// Per-pixel operation not implemented\nSfsInterpView::pixel_type\nSfsInterpView::operator()(double/*i*/, double/*j*/, vw::int32/*p*/) const {\n  vw::vw_throw(vw::NoImplErr() << \"SfsInterpView::operator()(...) is not implemented\");\n  return SfsInterpView::pixel_type();\n}\n\n// Per-tile operation\nSfsInterpView::prerasterize_type SfsInterpView::prerasterize(vw::BBox2i const& bbox) const {\n\n  vw::InterpolationView<vw::EdgeExtensionView<vw::ImageView<float>,\n    vw::ConstantEdgeExtension>, vw::BilinearInterpolation>\n    interp_lowres_img\n      = vw::interpolate(m_lowres_img,\n                        vw::BilinearInterpolation(),\n                        vw::ConstantEdgeExtension());\n\n  // Great care is needed here to reverse the resampling done in \n  // computeReflectanceAndIntensity.\n  vw::ImageView<result_type> tile(bbox.width(), bbox.height());\n  for (int col = bbox.min().x(); col < bbox.max().x(); col++) {\n    for (int row = bbox.min().y(); row < bbox.max().y(); row++) {\n      double valx = (col - 1.0) / double(m_sample_col_rate) + 1.0;\n      double valy = (row - 1.0) / double(m_sample_row_rate) + 1.0;\n      tile(col - bbox.min().x(), row - bbox.min().y())\n        = interp_lowres_img(valx, valy);\n    }\n  }\n\n  return prerasterize_type(tile, -bbox.min().x(), -bbox.min().y(),\n                           cols(), rows());\n}\n\n// Factor out the logic for updating masks and weights\nvoid updateMasksWeights(SfsOptions const& opt,\n                        int num_images,\n                        std::vector<vw::BBox2i> const& crop_boxes,\n                        std::vector<vw::ImageView<double>> & ground_weights,\n                        float & img_nodata_val,\n                        std::vector<MaskedImgRefT> & masked_images,\n                        std::vector<vw::ImageView<double>> & blend_weights) {\n\n  // Redo the image masks. Unlike before, the shadow threshold is set to 0\n  // to allow shadow pixels. The weights will control how much of these\n  // are actually used. This approach is better than a hard cutoff with the mask.\n  for (int image_iter = 0; image_iter < num_images; image_iter++) {\n    if (opt.skip_images.find(image_iter) != opt.skip_images.end())\n      continue;\n\n    std::string img_file = opt.input_images[image_iter];\n    vw::read_nodata_val(img_file, img_nodata_val);\n    float shadow_thresh = 0.0; // Note how the shadow thresh is now 0, unlike before\n    // Make a copy in memory for faster access\n    if (!crop_boxes[image_iter].empty()) {\n      vw::ImageView<float> cropped_img =\n        crop(DiskImageView<float>(img_file), crop_boxes[image_iter]);\n      masked_images[image_iter]\n        = create_pixel_range_mask2(cropped_img,\n                                   std::max(img_nodata_val, shadow_thresh),\n                                   opt.max_valid_image_vals_vec[image_iter]);\n\n      // Overwrite the blending weights with ground weights\n      blend_weights[image_iter] = copy(ground_weights[image_iter]);\n    }\n  }\n\n  ground_weights.clear(); // not needed anymore\n}\n\n// Pixels in low-light are given less weight if at the same location\n// there exist pixels in other images with stronger light. This if a fix\n// for seams. Must be used only in clips known to have seams.\nvoid handleLowLight(SfsOptions const& opt,\n                    vw::ImageView<double> const& dem,\n                    vw::cartography::GeoReference const& geo,\n                    std::vector<MaskedDblImgT> const& meas_intensities,\n                    std::vector<MaskedDblImgT> const& sim_intensities,\n                    std::vector<vw::ImageView<double>> & blend_weights) {\n\n  int num_images = meas_intensities.size();\n\n  // Find the max meas image\n  vw::ImageView<double> max_intensity;\n  maxImage(dem.cols(), dem.rows(), opt.skip_images, meas_intensities,\n            max_intensity); // output\n \n  // Find the error images and median error\n  std::vector<ImageView<double>> err(num_images);\n  std::vector<double> errs;\n  for (int image_iter = 0; image_iter < num_images; image_iter++) {\n\n    if (opt.skip_images.find(image_iter) != opt.skip_images.end())\n      continue;\n    err[image_iter].set_size(dem.cols(), dem.rows());\n    for (int col = 0; col < dem.cols(); col++) {\n      for (int row = 0; row < dem.rows(); row++) {\n\n        // Initalize these to 0, except for skipped images\n        err[image_iter](col, row) = 0.0;\n\n        // Find the meas and comp intensities\n        auto meas_intensity = meas_intensities[image_iter](col, row);\n        auto sim_intensity = sim_intensities[image_iter](col, row);\n\n        // Set to zero if either intensity is invalid or meas intensity is below\n        // shadow threshold\n        if (!is_valid(meas_intensity) || !is_valid(sim_intensity) ||\n            meas_intensity.child() <= opt.shadow_threshold_vec[image_iter]) {\n          err[image_iter](col, row) = 0.0;\n          continue;\n        }\n\n        double curr_err = std::abs(meas_intensity.child() - sim_intensity.child());\n        errs.push_back(curr_err);\n        err[image_iter](col, row) = curr_err;\n      }\n    }\n  }\n  double median_err = 0.0;\n  if (!errs.empty())\n    median_err = vw::math::destructive_median(errs);\n  \n  // Find the adjustment weights for low light\n  std::vector<ImageView<double>> adj_weights(num_images);\n  for (int image_iter = 0; image_iter < num_images; image_iter++) {\n    if (opt.skip_images.find(image_iter) != opt.skip_images.end())\n      continue;\n    adj_weights[image_iter].set_size(dem.cols(), dem.rows());\n    for (int col = 0; col < adj_weights[image_iter].cols(); col++) {\n      for (int row = 0; row < adj_weights[image_iter].rows(); row++) {\n\n        // Initalize these to 1, except for skipped images\n        adj_weights[image_iter](col, row) = 1.0;\n\n        // Where the blend weights are 0, this weight will be 0 too\n        if (blend_weights[image_iter](col, row) == 0.0) {\n          adj_weights[image_iter](col, row) = 0.0;\n          continue;\n        }\n\n        // Find the curr intensity\n        double curr_intensity = meas_intensities[image_iter](col, row).child();\n\n        // Skip if curr intensity equals max intensity, to respect\n        // --adjust-borderline-data\n        if (curr_intensity == max_intensity(col, row) && !opt.erode_seams)\n          continue;\n          \n        // Skip if meas intensity is above the low light threshold\n        if (curr_intensity > opt.low_light_threshold)\n          continue;\n\n        double err_ratio = 1.0;\n        double curr_err = err[image_iter](col, row);\n        if (curr_err > 0.0 && curr_err >= median_err)\n          err_ratio = median_err / curr_err;\n        \n        // Need to raise this to a power, to greatly decrease the weight\n        adj_weights[image_iter](col, row) = pow(err_ratio, opt.low_light_weight_power);\n      }\n    }\n  }\n\n  // Blur the adjustment weights. This may cause some erosion\n  // TODO(oalexan1): How to do a more surgical job here? Now the adjusted weights\n  // attenuated due to this blur multiply weights attenuated in the blend_weights.\n  for (int image_iter = 0; image_iter < num_images; image_iter++) {\n    if (opt.skip_images.find(image_iter) != opt.skip_images.end())\n      continue;\n    adj_weights[image_iter] \n      = gaussian_filter(adj_weights[image_iter], opt.low_light_blur_sigma);\n  }  \n\n  // Adjust the blending weights by multiplying them with the adj weights for low light.\n  for (int image_iter = 0; image_iter < num_images; image_iter++) {\n    if (opt.skip_images.find(image_iter) != opt.skip_images.end())\n      continue;\n    for (int col = 0; col < blend_weights[image_iter].cols(); col++) {\n      for (int row = 0; row < blend_weights[image_iter].rows(); row++) {\n        blend_weights[image_iter](col, row) *= adj_weights[image_iter](col, row);\n      }\n    }\n  }\n\n  // This is helpful for debugging seams issues\n  if (false) {\n    asp::saveWeights(opt.skip_images, opt.out_prefix,\n                     opt.input_images, opt.input_cameras,\n                     \"adj\", adj_weights,\n                     geo, vw::GdalWriteOptions(opt));\n    asp::saveWeights(opt.skip_images, opt.out_prefix,\n                     opt.input_images, opt.input_cameras,\n                     \"blend\", blend_weights,\n                     geo, vw::GdalWriteOptions(opt));\n  }\n\n} // end function handleLowLight\n\n// This will adjust the weights to account for borderline pixels and low-light conditions.\n// The blend weights and masked images are modified in place.\nvoid handleBorderlineAndLowLight(SfsOptions & opt,\n                                 int num_images,\n                                 vw::ImageView<double> const& dem,\n                                 vw::cartography::GeoReference const& geo,\n                                 std::vector<BBox2i> const& crop_boxes,\n                                 std::vector<MaskedDblImgT> const& meas_intensities,\n                                 std::vector<MaskedDblImgT> const& sim_intensities,\n                                 // Outputs\n                                 float & img_nodata_val,\n                                 std::vector<MaskedImgRefT> & masked_images,\n                                 std::vector<vw::ImageView<double>> & blend_weights,\n                                 bool & blend_weight_is_ground_weight,\n                                 std::vector<ImageView<double>> & ground_weights) {\n\n  // Use the ground weights from now on instead of in-camera blending weights.\n  // Will overwrite the weights below.\n  blend_weight_is_ground_weight = true;\n\n  // TODO(oalexan1): These weights should be created before any calculation\n  // of intensity. As of now, they kick after that, and before iterative\n  // SfS. Must check the effect of that. Should result in minor changes to\n  // exposure only.\n  int cols = dem.cols(), rows = dem.rows();\n  asp::adjustBorderlineDataWeights(cols, rows, opt.blending_dist, opt.blending_power,\n                                   vw::GdalWriteOptions(opt), // slice\n                                   geo, opt.skip_images, opt.out_prefix,\n                                   opt.input_images, opt.input_cameras,\n                                   ground_weights); // output\n\n  // Recreate the the masked images and overwrite the blending weights\n  asp::updateMasksWeights(opt, num_images, crop_boxes, ground_weights,\n                          img_nodata_val, masked_images, blend_weights);\n\n  // Handle --low-light-threshold option\n  if (opt.low_light_threshold > 0.0)\n    handleLowLight(opt, dem, geo, meas_intensities, sim_intensities, blend_weights);\n\n} // end function handleBorderlineAndLowLight\n\n// Find the clamped signed distance to the boundary. Here it is assumed that\n// there is a region in which lit_grass_dist is positive, while in its\n// complement the shadow_grass_dist is positive. The boundary is where both are\n// no more than 1 in value. Likely this logic could be made more generic.\nvw::ImageView<double> calcClampedBdDist(vw::ImageView<float> const& lit_grass_dist,\n                                        vw::ImageView<float> const& shadow_grass_dist,\n                                        double lit_blend_length,\n                                        double shadow_blend_length) {\n\n  if (lit_grass_dist.cols() != shadow_grass_dist.cols() ||\n      lit_grass_dist.rows() != shadow_grass_dist.rows())\n    vw::vw_throw(vw::ArgumentErr() \n             << \"Input images to calcClampedBdDist must have the same dimensions.\");\n\n  vw::ImageView<double> dist_to_bd;\n  dist_to_bd.set_size(lit_grass_dist.cols(), lit_grass_dist.rows());\n  for (int col = 0; col < lit_grass_dist.cols(); col++) {\n    for (int row = 0; row < lit_grass_dist.rows(); row++) {\n\n      if (lit_grass_dist(col, row) > 1.5 * lit_blend_length) {\n        // Too far in the lit region\n        dist_to_bd(col, row) = lit_blend_length; // clamp at the blending length\n        continue;\n      }\n\n      if (shadow_grass_dist(col, row) > 1.5 * shadow_blend_length) {\n        // Too far in the shadow region\n        dist_to_bd(col, row) = -shadow_blend_length;\n        continue;\n      }\n\n      // Find the shortest Euclidean distance to the no-data region.\n      double max_dist = std::max(lit_blend_length, shadow_blend_length);\n      double signed_dist = 0.0;\n      if (lit_grass_dist(col, row) > 0) {\n        signed_dist = lit_blend_length;\n      } else if (shadow_grass_dist(col, row) > 0) {\n        signed_dist = -shadow_blend_length;\n      }\n\n      for (int col2 = std::max(0.0, col - max_dist);\n           col2 <= std::min(lit_grass_dist.cols() - 1.0, col + max_dist);\n           col2++) {\n\n        // Estimate the range of rows for the circle with given radius\n        // at given col value.\n        double ht_val = ceil(sqrt(double(max_dist * max_dist) -\n                                  double((col - col2) * (col - col2))));\n\n        for (int row2 = std::max(0.0, row - ht_val);\n             row2 <= std::min(lit_grass_dist.rows() - 1.0, row + ht_val);\n             row2++) {\n\n          if (lit_grass_dist(col2, row2) > 1 || shadow_grass_dist(col2, row2) > 1)\n            continue; // not at the boundary\n\n          // See if the current point is closer than anything so far\n          double curr_dist = sqrt(double(col - col2) * (col - col2) +\n                                  double(row - row2) * (row - row2));\n          if (lit_grass_dist(col, row) > 0) {\n            if (curr_dist < signed_dist)\n              signed_dist = curr_dist;\n          } else if (shadow_grass_dist(col, row) > 0) {\n            if (curr_dist < -signed_dist)\n              signed_dist = -curr_dist;\n          }\n\n        }\n      }\n\n      // The closest we've got\n      dist_to_bd(col, row) = signed_dist;\n    }\n  }\n  return dist_to_bd;\n}\n\n// Calc the weight for option --curvature-in-shadow-weight\nvoid calcCurvatureInShadowWeight(asp::SfsOptions const& opt,\n                                 vw::ImageView<int> const& lit_image_mask,\n                                 vw::cartography::GeoReference const& geo,\n                                 vw::ImageView<double> & curvature_in_shadow_weight) {\n\n  TerminalProgressCallback tpc(\"asp\", \": \");\n  bool has_georef = true, has_nodata = false;\n  double nodata_val = -1; // will not be used\n  std::string lit_image_mask_file = opt.out_prefix + \"-lit_image_mask.tif\";\n  vw_out() << \"Writing: \" << lit_image_mask_file << std::endl;\n  block_write_gdal_image(lit_image_mask_file, lit_image_mask,\n                          has_georef, geo, has_nodata, nodata_val, opt, tpc);\n\n  // Form the curvature_in_shadow_weight image. It will start at 0\n  // at distance opt.lit_curvature_dist from the shadow\n  // boundary in the lit area, and then reach value\n  // opt.curvature_in_shadow_weight when at distance\n  // opt.shadow_curvature_dist from the boundary in the shadowed\n  // area. This is done to avoid boundary artifacts.\n  double max_dist = std::max(opt.lit_curvature_dist, opt.shadow_curvature_dist);\n  vw::bounded_signed_dist<int>(vw::create_mask(lit_image_mask, 0), max_dist,\n                                curvature_in_shadow_weight);\n  // Do further adjustments\n  for (int col = 0; col < curvature_in_shadow_weight.cols(); col++) {\n    for (int row = 0; row < curvature_in_shadow_weight.rows(); row++) {\n      double val = curvature_in_shadow_weight(col, row);\n      val = std::min(val, opt.lit_curvature_dist);\n      val = std::max(val, -opt.shadow_curvature_dist);\n      val = (opt.lit_curvature_dist - val) /\n        (opt.lit_curvature_dist + opt.shadow_curvature_dist);\n      curvature_in_shadow_weight(col, row) = val * opt.curvature_in_shadow_weight;\n    }\n  }\n\n  std::string curvature_in_shadow_weight_file = opt.out_prefix\n    + \"-curvature_in_shadow_weight.tif\";\n  vw_out() << \"Writing: \" << curvature_in_shadow_weight_file << std::endl;\n  block_write_gdal_image(curvature_in_shadow_weight_file, curvature_in_shadow_weight,\n                          has_georef, geo, has_nodata, nodata_val, opt, tpc);\n} // end computing curvature_in_shadow_weight\n\n// Save the measured and computed intensity images\nvoid saveIntensities(SfsOptions const& opt,\n                     std::string const& input_image,\n                     std::string const& input_camera,\n                     vw::cartography::GeoReference const& geo,\n                     MaskedDblImgT const& meas_intensity,\n                     MaskedDblImgT const& sim_intensity,\n                     float img_nodata_val) {\n\n  bool has_georef = true, has_nodata = true;\n  std::string out_camera_file\n    = asp::bundle_adjust_file_name(opt.out_prefix,\n                                   input_image,\n                                   input_camera);\n  std::string local_prefix = fs::path(out_camera_file).replace_extension(\"\").string();\n  if (opt.save_meas_intensity_only) {\n    std::string out_meas_intensity_file = local_prefix + \"-meas-intensity.tif\";\n    vw::vw_out() << \"Writing: \" << out_meas_intensity_file << \"\\n\";\n    vw::TerminalProgressCallback tpc(\"asp\", \": \");\n    vw::cartography::block_write_gdal_image(out_meas_intensity_file,\n                                            vw::apply_mask(meas_intensity, img_nodata_val),\n                                            has_georef, geo, has_nodata,\n                                            img_nodata_val, opt, tpc);\n  }\n  if (opt.save_sim_intensity_only) {\n    std::string out_sim_intensity_file = local_prefix + \"-sim-intensity.tif\";\n    vw::vw_out() << \"Writing: \" << out_sim_intensity_file << \"\\n\";\n    vw::TerminalProgressCallback tpc(\"asp\", \": \");\n    vw::cartography::block_write_gdal_image(out_sim_intensity_file,\n                                            vw::apply_mask(sim_intensity, img_nodata_val),\n                                            has_georef, geo, has_nodata, img_nodata_val,\n                                            opt, tpc);\n  }\n}\n\n// Given the albedo image, and the valid mask, in-fill from valid pixels to\n// invalid ones using 3x3 neighborhood averaging. Do a single pass. This is\n// mostly to resolve boundary issues. This updates the mask as well.\nvoid inFillImage3x3(vw::ImageView<double> & image, vw::ImageView<int>  & valid_mask) {\n\n  // Check that these two have the same size\n  if (image.cols() != valid_mask.cols() || image.rows() != valid_mask.rows()) {\n    vw::vw_throw(vw::ArgumentErr() \n                 << \"inFillImage3x3(): image and valid_mask must have the same size.\\n\");\n  }\n  \n  int cols = image.cols();\n  int rows = image.rows();\n\n  // Make a copy of the input that will be kept constant during the iterations\n  vw::ImageView<double> image_copy = image;\n  vw::ImageView<int>    valid_mask_copy = valid_mask;\n\n  for (int col = 0; col < cols; col++) {\n    for (int row = 0; row < rows; row++) {\n\n      if (valid_mask_copy(col, row) == 1)\n        continue;\n\n      double sum = 0.0;\n      int count = 0;\n\n      // Check the 3x3 neighborhood\n      for (int ncol = -1; ncol <= 1; ncol++) {\n        for (int nrow = -1; nrow <= 1; nrow++) {\n          int c = col + ncol;\n          int r = row + nrow;\n          if (c < 0 || c >= cols || r < 0 || r >= rows)\n            continue;\n          if (valid_mask_copy(c, r) == 1) {\n            sum += image_copy(c, r);\n            count++;\n          }\n        }\n      }\n\n      if (count > 0) {\n        image(col, row) = sum / double(count);\n        valid_mask(col, row) = 1;\n      }\n\n    } // end row\n  } // end col\n\n} // end function inFillImage3x3()\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/SfS/SfsImageProc.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file SfsImageProc.h\n/// Image processing routines for SfS\n\n#ifndef __SFS_IMAGE_PROC_H__\n#define __SFS_IMAGE_PROC_H__\n\n#include <vw/Image/ImageViewRef.h>\n#include <vw/Image/PerPixelViews.h>\n\n#include <string>\n#include <vector>\n#include <set>\n\nnamespace vw {\n  class GdalWriteOptions;\n  namespace cartography {\n    class GeoReference;\n  }\n}\n\nnamespace asp {\n\nclass SfsOptions;\n\ntypedef vw::ImageViewRef<vw::PixelMask<float>> MaskedImgRefT;\ntypedef vw::ImageView<vw::PixelMask<double>> MaskedDblImgT;\ntypedef vw::ImageView<double> DblImgT;\n\n// Calculate exposure and haze, and decide if an image should be skipped.\nvoid calcExposureHazeSkipImages(// Inputs\n                                asp::MaskedDblImgT const& intensity,\n                                asp::MaskedDblImgT const& reflectance,\n                                double mean_albedo,\n                                int image_iter,\n                                std::vector<std::string> const& input_images,\n                                // In-out\n                                std::vector<double>      & local_exposures_vec,\n                                std::vector<double>      & local_haze_vec,\n                                std::set<int>            & skip_images);\n\n// Compute mean and standard deviation of two images. Do it where both are valid.\nvoid calcJointStats(MaskedDblImgT const& I1,\n                    MaskedDblImgT const& I2,\n                    double & mean1, double & std1,\n                    double & mean2, double & std2);\n\nvoid maxImage(int cols, int rows,\n              std::set<int> const& skip_images,\n              std::vector<vw::ImageView<double>> const& images,\n              vw::ImageView<double> & max_image);\n\n// Find the per-pixel maximum of a set of masked images\nvoid maxImage(int cols, int rows,\n              std::set<int> const& skip_images,\n              std::vector<MaskedDblImgT> const& meas_intensities,\n              vw::ImageView<double> & max_intensity);\n\n// See the .cc file for the documentation.\nvoid adjustBorderlineDataWeights(int cols, int rows,\n                                 int blending_dist, double blending_power,\n                                 vw::GdalWriteOptions const& opt,\n                                 vw::cartography::GeoReference const& geo,\n                                 std::set<int> const& skip_images,\n                                 std::string const& out_prefix, // for debug data\n                                 std::vector<std::string> const& input_images,\n                                 std::vector<std::string> const& input_cameras,\n                                 std::vector<vw::ImageView<double>> & ground_weights);\n\n// This will adjust the weights to account for borderline pixels and low-light conditions.\n// The blend weights and masked images are modified in place.\nvoid handleBorderlineAndLowLight(SfsOptions & opt,\n                                 int num_images,\n                                 vw::ImageView<double> const& dem,\n                                 vw::cartography::GeoReference const& geo,\n                                 std::vector<vw::BBox2i> const& crop_boxes,\n                                 std::vector<MaskedDblImgT> const& meas_intensities,\n                                 std::vector<MaskedDblImgT> const& sim_intensities,\n                                 // Outputs\n                                 float & img_nodata_val,\n                                 std::vector<MaskedImgRefT> & masked_images,\n                                 std::vector<vw::ImageView<double>> & blend_weights,\n                                 bool & blend_weight_is_ground_weight,\n                                 std::vector<vw::ImageView<double>> & ground_weights);\n\n// See the .cc file for the documentation.\nvw::ImageView<double> blendingWeights(MaskedImgRefT const& img,\n                                      double blending_dist,\n                                      double blending_power,\n                                      int min_blend_size);\n\n// Find the points on a given DEM that are shadowed by other points of\n// the DEM.  Start marching from the point on the DEM on a ray towards\n// the sun in small increments, until hitting the maximum DEM height.\nbool isInShadow(int col, int row, vw::Vector3 const& sunPos,\n                vw::ImageView<double> const& dem, double max_dem_height,\n                double gridx, double gridy,\n                vw::cartography::GeoReference const& geo);\n\nvoid areInShadow(vw::Vector3 const& sunPos, vw::ImageView<double> const& dem,\n                 double gridx, double gridy,\n                 vw::cartography::GeoReference const& geo,\n                 vw::ImageView<float> & shadow);\n\n// Prototype code to identify permanently shadowed areas\n// and deepen the craters there. Needs to be integrated\n// and tested with various shapes of the deepened crater.\nvoid deepenCraters(std::string const& dem_file,\n                   std::vector<std::string> const& image_files,\n                   double sigma,\n                   std::string const& max_img_file,\n                   std::string const& grass_file,\n                   std::string const& out_dem_file);\n\n// Sample large DEMs. Keep about num_samples row and column samples.\nvoid calcSampleRates(vw::ImageViewRef<double> const& dem, int num_samples,\n                     int & sample_col_rate, int & sample_row_rate);\n\n// TODO(oalexan1): The albedo must have its own no-data value.\n// Must check the albedo has everywhere valid values.\ndouble meanAlbedo(vw::ImageView<double> const& dem,\n                  vw::ImageView<double> const& albedo,\n                  double dem_nodata_val);\n\ndouble maxDemHeight(vw::ImageView<double> const& dem);\n\n// Find the clamped signed distance to the boundary. Here it is assumed that\n// there is a region in which lit_grass_dist is positive, while in its\n// complement the shadow_grass_dist is positive. The boundary is where both are\n// no more than 1 in value. Likely this logic could be made more generic.\nvw::ImageView<double> calcClampedBdDist(vw::ImageView<float> const& lit_grass_dist,\n                                        vw::ImageView<float> const& shadow_grass_dist,\n                                        double lit_blend_length,\n                                        double shadow_blend_length);\n\n// Calc the weight for option --curvature-in-shadow-weight\nvoid calcCurvatureInShadowWeight(asp::SfsOptions const& opt,\n                                 vw::ImageView<int> const& lit_image_mask,\n                                 vw::cartography::GeoReference const& geo,\n                                 vw::ImageView<double> & curvature_in_shadow_weight);\n\n// Save the measured and computed intensity images\nvoid saveIntensities(SfsOptions const& opt,\n                     std::string const& input_image,\n                     std::string const& input_camera,\n                     vw::cartography::GeoReference const& geo,\n                     MaskedDblImgT const& meas_intensity,\n                     MaskedDblImgT const& sim_intensity,\n                     float img_nodata_val);\n\n// Given the albedo image, and the valid mask, in-fill from valid pixels to\n// invalid ones using 3x3 neighborhood averaging. Do a single pass. This is\n// mostly to resolve boundary issues. This updates the mask as well.\nvoid inFillImage3x3(vw::ImageView<double> & image, vw::ImageView<int>  & valid_mask);\n\n// Compute a full-resolution image by specific interpolation into a low-resolution\n// one. The full-res image may not fit in memory, so we need to compute it in tiles.\n// See computeReflectanceAndIntensity() for low-res vs full-res relationship.\nclass SfsInterpView: public vw::ImageViewBase<SfsInterpView> {\n  int m_full_res_cols, m_full_res_rows;\n  int m_sample_col_rate, m_sample_row_rate;\n  vw::ImageView<float> const& m_lowres_img;\n  typedef float PixelT;\n\npublic:\n  SfsInterpView(int full_res_cols, int full_res_rows,\n                int sample_col_rate, int sample_row_rate,\n                vw::ImageView<float> const& lowres_img);\n\n  typedef PixelT pixel_type;\n  typedef PixelT result_type;\n  typedef vw::ProceduralPixelAccessor<SfsInterpView> pixel_accessor;\n\n  inline vw::int32 cols() const { return m_full_res_cols; }\n  inline vw::int32 rows() const { return m_full_res_rows; }\n  inline vw::int32 planes() const { return 1; }\n\n  inline pixel_accessor origin() const { return pixel_accessor(*this, 0, 0); }\n\n  pixel_type operator()(double/*i*/, double/*j*/, vw::int32/*p*/ = 0) const;\n\n  typedef vw::CropView<vw::ImageView<pixel_type>> prerasterize_type;\n  prerasterize_type prerasterize(vw::BBox2i const& bbox) const;\n\n  template <class DestT>\n  inline void rasterize(DestT const& dest, vw::BBox2i bbox) const {\n    vw::rasterize(prerasterize(bbox), dest, bbox);\n  }\n};\n\n} // end namespace asp\n\n#endif // __SFS_IMAGE_PROC_H__\n"
  },
  {
    "path": "src/asp/SfS/SfsModel.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// \\file SfsModel.cc\n// Modeling reflectance, intensity, albedo for SfS\n\n#include <asp/SfS/SfsModel.h>\n#include <asp/SfS/SfsOptions.h>\n#include <asp/SfS/SfsErrorEstim.h>\n#include <asp/SfS/SfsImageProc.h>\n\n#include <vw/Cartography/GeoReference.h>\n#include <vw/Image/Interpolation.h>\n\nnamespace asp {\n\nusing namespace vw;\n\n// Computes the Lambertian reflectance model (cosine of the light\n// direction and the normal to the Moon) Vector3 sunpos: the 3D\n// coordinates of the Sun relative to the center of the Moon Vector2\n// lon_lat is a 2D vector. First element is the longitude and the\n// second the latitude.\n// Author: Ara Nefian\ndouble\nLambertianReflectance(Vector3 sunPos, Vector3 xyz, Vector3 normal) {\n  double reflectance;\n  Vector3 sunDirection = normalize(sunPos-xyz);\n\n  reflectance\n   = sunDirection[0]*normal[0] + sunDirection[1]*normal[1] + sunDirection[2]*normal[2];\n\n  return reflectance;\n}\n\ndouble LunarLambertianReflectance(Vector3 const& sunPos,\n                                  Vector3 const& viewPos,\n                                  Vector3 const& xyz,\n                                  Vector3 const& normal,\n                                  double phaseCoeffC1,\n                                  double phaseCoeffC2,\n                                  double & alpha,\n                                  const double * refl_coeffs) {\n\n  double len = dot_prod(normal, normal);\n  if (abs(len - 1.0) > 1.0e-4)\n    vw::vw_throw(vw::ArgumentErr()\n                 << \"Expecting unit normal in the reflectance computation.\\n\");\n\n  // Compute mu_0 = cosine of the angle between the light direction and the surface normal.\n  //sun coordinates relative to the xyz point on the Moon surface\n  Vector3 sunDirection = normalize(sunPos-xyz);\n  double mu_0 = dot_prod(sunDirection, normal);\n\n  // Compute mu = cosine of the angle between the viewer direction and the surface normal.\n  // viewer coordinates relative to the xyz point on the Moon surface\n  Vector3 viewDirection = normalize(viewPos-xyz);\n  double mu = dot_prod(viewDirection,normal);\n\n  // Compute the phase angle (alpha) between the viewing direction and the light\n  // source direction\n  double deg_alpha;\n  double cos_alpha;\n\n  double tol = 1e-8;\n  cos_alpha = dot_prod(sunDirection, viewDirection);\n  if ((cos_alpha > 1 + tol) || (cos_alpha < -1 - tol))\n    vw::vw_throw(vw::ArgumentErr() << \"cos(alpha) error.\\n\");\n\n  alpha     = acos(cos_alpha);  // phase angle in radians\n  deg_alpha = alpha*180.0/M_PI; // phase angle in degrees\n\n  // Bob Gaskell's model\n  // L = exp(-deg_alpha/60.0);\n\n  // Alfred McEwen's model\n  double O = refl_coeffs[0]; // 1\n  double A = refl_coeffs[1]; //-0.019;\n  double B = refl_coeffs[2]; // 0.000242;//0.242*1e-3;\n  double C = refl_coeffs[3]; // -0.00000146;//-1.46*1e-6;\n  double L = O + A*deg_alpha + B*deg_alpha*deg_alpha + C*deg_alpha*deg_alpha*deg_alpha;\n\n  double reflectance = 2*L*mu_0/(mu_0+mu) + (1-L)*mu_0;\n  if (mu_0 + mu == 0 || reflectance != reflectance)\n    return 0.0;\n\n  // Attempt to compensate for points on the terrain being too bright\n  // if the sun is behind the spacecraft as seen from those points.\n  reflectance *= (exp(-phaseCoeffC1*alpha) + phaseCoeffC2);\n\n  return reflectance;\n}\n\n// Hapke's model. See: An Experimental Study of Light Scattering by Large,\n// Irregular Particles Audrey F. McGuire, Bruce W. Hapke. 1995. The reflectance\n// used is R(g), in equation above Equation 21. The p(g) function is given by\n// Equation (14), yet this one uses an old convention. The updated p(g) is given\n// in: Spectrophotometric properties of materials observed by Pancam on the Mars\n// Exploration Rovers: 1. Spirit. JR Johnson, 2006. We Use the two-term p(g),\n// and the parameter c, not c'=1-c. We also use the values of w(=omega), b, and\n// c from that table.\n\n// Note that we use the updated Hapke model, having the term B(g). This one is\n// given in \"Modeling spectral and bidirectional reflectance\", Jacquemoud, 1992.\n// It has the params B0 and h. The ultimate reference is probably Hapke, 1986,\n// having all pieces in one place, but that one is not available.\n\n// We use mostly the parameter values for omega, b, c, B0 and h from: Surface\n// reflectance of Mars observed by CRISM/MRO: 2. Estimation of surface\n// photometric properties in Gusev Crater and Meridiani Planum by J. Fernando.\n// See equations (1), (2) and (4) in that paper.\n\n// Example values for the params: w=omega=0.68, b=0.17, c=0.62, B0=0.52, h=0.52.\n\n// We don't use equation (3) from that paper, we use instead what they call\n// the formula H93, which is the H(x) from McGuire and Hapke 1995 mentioned\n// above. See the complete formulas below.\n\n// The Fernando paper has a factor S, which is not present in the 1992\n// Jacquemoud paper, so we don't use it either here.\ndouble HapkeReflectance(Vector3 const& sunPos,\n                        Vector3 const& viewPos,\n                        Vector3 const& xyz,\n                        Vector3 const& normal,\n                        double phaseCoeffC1,\n                        double phaseCoeffC2,\n                        double & alpha,\n                        const double * refl_coeffs) {\n\n  double len = dot_prod(normal, normal);\n  if (abs(len - 1.0) > 1.0e-4)\n    vw::vw_throw(vw::ArgumentErr()\n                 << \"Expecting unit normal in the reflectance computation.\\n\");\n\n  //compute mu_0 = cosine of the angle between the light direction and the surface normal.\n  //sun coordinates relative to the xyz point on the Moon surface\n  Vector3 sunDirection = normalize(sunPos-xyz);\n  double mu_0 = dot_prod(sunDirection, normal);\n\n  //compute mu = cosine of the angle between the viewer direction and the surface normal.\n  //viewer coordinates relative to the xyz point on the Moon surface\n  Vector3 viewDirection = normalize(viewPos-xyz);\n  double mu = dot_prod(viewDirection,normal);\n\n  //compute the phase angle (g) between the viewing direction and the light source direction\n  // in radians\n  double cos_g = dot_prod(sunDirection, viewDirection);\n  double g = acos(cos_g);  // phase angle in radians\n\n  // Hapke params\n  double omega = std::abs(refl_coeffs[0]); // also known as w\n  double b     = std::abs(refl_coeffs[1]);\n  double c     = std::abs(refl_coeffs[2]);\n  // The older Hapke model lacks the B0 and h terms\n  double B0    = std::abs(refl_coeffs[3]);\n  double h     = std::abs(refl_coeffs[4]);\n\n  // Does not matter, we'll factor out the constant scale as camera exposures anyway\n  double J = 1.0;\n\n  // The P(g) term\n  double Pg\n    = (1.0 - c) * (1.0 - b*b) / pow(1.0 + 2.0*b*cos_g + b*b, 1.5)\n    + c         * (1.0 - b*b) / pow(1.0 - 2.0*b*cos_g + b*b, 1.5);\n\n  // The B(g) term\n  double Bg = B0 / (1.0 + (1.0/h)*tan(g/2.0));\n\n  double H_mu0 = (1.0 + 2*mu_0) / (1.0 + 2*mu_0 * sqrt(1.0 - omega));\n  double H_mu  = (1.0 + 2*mu) / (1.0 + 2*mu   * sqrt(1.0 - omega));\n\n  // The reflectance\n  double R = (J*omega/4.0/M_PI) * (mu_0/(mu_0+mu)) * ((1.0 + Bg)*Pg + H_mu0*H_mu - 1.0);\n\n  return R;\n}\n\n// Use the following model:\n// Reflectance = f(alpha) * A * mu_0 /(mu_0 + mu) + (1-A) * mu_0\n// The value of A is either 1 (the so-called lunar-model), or A=0.7.\n// f(alpha) = 0.63.\ndouble CharonReflectance(Vector3 const& sunPos,\n                         Vector3 const& viewPos,\n                         Vector3 const& xyz,\n                         Vector3 const& normal,\n                         double phaseCoeffC1,\n                         double phaseCoeffC2,\n                         double & alpha,\n                         const double * refl_coeffs) {\n\n  double len = dot_prod(normal, normal);\n  if (abs(len - 1.0) > 1.0e-4)\n    vw::vw_throw(vw::ArgumentErr()\n                 << \"Expecting unit normal in the reflectance computation.\\n\");\n\n  //compute mu_0 = cosine of the angle between the light direction and the surface normal.\n  //sun coordinates relative to the xyz point on the Moon surface\n  Vector3 sunDirection = normalize(sunPos-xyz);\n  double mu_0 = dot_prod(sunDirection, normal);\n\n  //compute mu = cosine of the angle between the viewer direction and the surface normal.\n  //viewer coordinates relative to the xyz point on the Moon surface\n  Vector3 viewDirection = normalize(viewPos-xyz);\n  double mu = dot_prod(viewDirection,normal);\n\n  // Charon model params\n  double A       = std::abs(refl_coeffs[0]); // albedo\n  double f_alpha = std::abs(refl_coeffs[1]); // phase function\n\n  double reflectance = f_alpha*A*mu_0 / (mu_0 + mu) + (1.0 - A)*mu_0;\n\n  if (mu_0 + mu == 0 || reflectance != reflectance) {\n    return 0.0;\n  }\n\n  return reflectance;\n}\n\n// Lunar-Lambertian with duplicated coefficients that could be optimized separately.\n// This is experimental.\ndouble ExperimentalLunarLambertianReflectance(Vector3 const& sunPos,\n                                              Vector3 const& viewPos,\n                                              Vector3 const& xyz,\n                                              Vector3 const& normal,\n                                              double phaseCoeffC1,\n                                              double phaseCoeffC2,\n                                              double & alpha,\n                                              const double * refl_coeffs) {\n  double reflectance;\n\n  double len = dot_prod(normal, normal);\n  if (std::abs(len - 1.0) > 1.0e-4)\n    vw::vw_throw(vw::ArgumentErr()\n                 << \"Expecting unit normal in the reflectance computation.\\n\");\n\n  // Compute mu_0 = cosine of the angle between the light direction and the surface normal.\n  // sun coordinates relative to the xyz point on the Moon surface\n  // Vector3 sunDirection = -normalize(sunPos-xyz);\n  Vector3 sunDirection = normalize(sunPos-xyz);\n  double mu_0 = dot_prod(sunDirection, normal);\n\n  //compute mu = cosine of the angle between the viewer direction and the surface normal.\n  //viewer coordinates relative to the xyz point on the Moon surface\n  Vector3 viewDirection = normalize(viewPos-xyz);\n  double mu = dot_prod(viewDirection,normal);\n\n  //compute the phase angle (alpha) between the viewing direction and the light source direction\n  double deg_alpha;\n  double cos_alpha;\n\n  double tol = 1e-8;\n  cos_alpha = dot_prod(sunDirection,viewDirection);\n  if (cos_alpha > 1 + tol || cos_alpha < -1 - tol)\n    vw::vw_throw(vw::ArgumentErr() << \"cos_alpha error\\n\");\n\n  alpha     = acos(cos_alpha);  // phase angle in radians\n  deg_alpha = alpha*180.0/M_PI; // phase angle in degrees\n\n  //Alfred McEwen's model\n  double O1 = refl_coeffs[0]; // 1\n  double A1 = refl_coeffs[1]; // -0.019;\n  double B1 = refl_coeffs[2]; // 0.000242;//0.242*1e-3;\n  double C1 = refl_coeffs[3]; // -0.00000146;//-1.46*1e-6;\n  double D1 = refl_coeffs[4];\n  double E1 = refl_coeffs[5];\n  double F1 = refl_coeffs[6];\n  double G1 = refl_coeffs[7];\n\n  double O2 = refl_coeffs[8];  // 1\n  double A2 = refl_coeffs[9];  // -0.019;\n  double B2 = refl_coeffs[10]; // 0.000242;//0.242*1e-3;\n  double C2 = refl_coeffs[11]; // -0.00000146;//-1.46*1e-6;\n  double D2 = refl_coeffs[12];\n  double E2 = refl_coeffs[13];\n  double F2 = refl_coeffs[14];\n  double G2 = refl_coeffs[15];\n\n  double L1 = O1 + A1*deg_alpha + B1*deg_alpha*deg_alpha + C1*deg_alpha*deg_alpha*deg_alpha;\n  double K1 = D1 + E1*deg_alpha + F1*deg_alpha*deg_alpha + G1*deg_alpha*deg_alpha*deg_alpha;\n  if (K1 == 0) K1 = 1;\n\n  double L2 = O2 + A2*deg_alpha + B2*deg_alpha*deg_alpha + C2*deg_alpha*deg_alpha*deg_alpha;\n  double K2 = D2 + E2*deg_alpha + F2*deg_alpha*deg_alpha + G2*deg_alpha*deg_alpha*deg_alpha;\n  if (K2 == 0) K2 = 1;\n\n  reflectance = 2*L1*mu_0/(mu_0+mu)/K1 + (1-L2)*mu_0/K2;\n\n  if (mu_0 + mu == 0 || reflectance != reflectance)\n    return 0.0;\n\n  // Attempt to compensate for points on the terrain being too bright\n  // if the sun is behind the spacecraft as seen from those points.\n  reflectance *= (exp(-phaseCoeffC1*alpha) + phaseCoeffC2);\n\n  return reflectance;\n}\n\n// Computes the ground reflectance with a desired reflectance model.\ndouble calcReflectance(vw::Vector3 const& cameraPosition,\n                       vw::Vector3 const& normal, Vector3 const& xyz,\n                       vw::Vector3 const& sun_position,\n                       ReflParams const& refl_params,\n                       const double * refl_coeffs) {\n\n  double phase_angle = 0.0;\n\n  double input_img_reflectance = 0.0;\n\n  switch (refl_params.reflectanceType) {\n    case LUNAR_LAMBERT:\n      input_img_reflectance\n        = LunarLambertianReflectance(sun_position,\n                                     cameraPosition,\n                                     xyz,  normal,\n                                     refl_params.phaseCoeffC1,\n                                     refl_params.phaseCoeffC2,\n                                     phase_angle, // output\n                                     refl_coeffs);\n      break;\n    case ARBITRARY_MODEL:\n      input_img_reflectance\n        = ExperimentalLunarLambertianReflectance(sun_position,\n                                                 cameraPosition,\n                                                 xyz,  normal,\n                                                 refl_params.phaseCoeffC1,\n                                                 refl_params.phaseCoeffC2,\n                                                 phase_angle, // output\n                                                 refl_coeffs);\n      break;\n    case HAPKE:\n      input_img_reflectance\n        = HapkeReflectance(sun_position,\n                           cameraPosition,\n                           xyz,  normal,\n                           refl_params.phaseCoeffC1,\n                           refl_params.phaseCoeffC2,\n                           phase_angle, // output\n                           refl_coeffs);\n      break;\n    case CHARON:\n      input_img_reflectance\n        = CharonReflectance(sun_position,\n                            cameraPosition,\n                            xyz,  normal,\n                            refl_params.phaseCoeffC1,\n                            refl_params.phaseCoeffC2,\n                            phase_angle, // output\n                            refl_coeffs);\n      break;\n    case LAMBERT:\n      input_img_reflectance = LambertianReflectance(sun_position, xyz, normal);\n      break;\n\n    default:\n      input_img_reflectance = 1;\n    }\n\n  return input_img_reflectance;\n}\n\n// Simulated model-based intensity:\n// albedo * nonlinReflectance(reflectance_i, exposures[i], haze, num_haze_coeffs) + haze[0]\n// Cost function is the squared difference between measured and computed intensity:\n// sum_i | I_i - sim_intensity_i|^2\ndouble calcSimIntensity(double albedo, double reflectance, double exposure,\n                        double steepness_factor, double const* haze, int num_haze_coeffs) {\n  return albedo\n    * nonlinReflectance(reflectance, exposure, steepness_factor, haze, num_haze_coeffs)\n    + haze[0];\n}\n\n// Calc albedo given the intensity.\n// albedo = (intensity - haze[0]) / nonlin_ref.\n// See also calcSimIntensity().\ndouble calcAlbedo(double intensity, double reflectance, double exposure,\n                  double steepness_factor, double const* haze, int num_haze_coeffs) {\n\n  // First, subtract the base haze coefficient\n  double adjusted_intensity = intensity - haze[0];\n\n  // Calculate the nonlinear reflectance first\n  double nonlin_ref = nonlinReflectance(reflectance, exposure,\n                                        steepness_factor, haze, num_haze_coeffs);\n\n  // Protect against division by zero\n  if (nonlin_ref == 0.0)\n      return 0.0;\n\n  return adjusted_intensity / nonlin_ref;\n}\n\n// Reflectance formula that is nonlinear if there is more than one haze coefficient\n// (that is experimental).\ndouble nonlinReflectance(double reflectance, double exposure,\n                         double steepness_factor,\n                         double const* haze, int num_haze_coeffs) {\n\n  // Make the exposure smaller. This will result in higher reflectance\n  // to compensate, as intensity = exposure * reflectance, hence\n  // steeper terrain. Things become more complicated if the haze\n  // and nonlinear reflectance is modeled. This is not on by default.\n  exposure /= steepness_factor;\n\n  double r = reflectance; // for short\n  if (num_haze_coeffs == 0)\n    return exposure * r; // Linear model\n  if (num_haze_coeffs == 1)\n    return exposure * r; // Also linear model, haze[0] is added after albedo multiplication\n  if (num_haze_coeffs == 2)\n    return exposure * r /(haze[1]*r + 1);\n  if (num_haze_coeffs == 3)\n    return exposure * (r + haze[2])/(haze[1]*r + 1);\n  if (num_haze_coeffs == 4)\n    return exposure * (haze[3]*r*r + r + haze[2])/(haze[1]*r + 1);\n  if (num_haze_coeffs == 5)\n    return exposure * (haze[3]*r*r + r + haze[2])/(haze[4]*r*r + haze[1]*r + 1);\n  if (num_haze_coeffs == 6)\n    return exposure * (haze[5]*r*r*r + haze[3]*r*r + r + haze[2])/(haze[4]*r*r + haze[1]*r + 1);\n\n  vw_throw(ArgumentErr() << \"Invalid value for the number of haze coefficients.\\n\");\n  return 0;\n}\n\n// Calculate current ECEF position and normal vector for a given DEM pixel.\n// This is an auxiliary function needed to compute the reflectance.\nvoid calcPointAndNormal(int col, int row,\n                        double left_h, double center_h, double right_h,\n                        double bottom_h, double top_h,\n                        bool use_pq, double p, double q, // dem partial derivatives\n                        vw::cartography::GeoReference const& geo,\n                        double gridx, double gridy,\n                        // Outputs\n                        vw::Vector3 & xyz, vw::Vector3 & normal) {\n\n  if (use_pq) {\n    // p is defined as (right_h - left_h)/(2*gridx)\n    // so, also, p = (right_h - center_h)/gridx\n    // Hence, we get the formulas below in terms of p and q.\n    right_h  = center_h + gridx*p;\n    left_h   = center_h - gridx*p;\n    top_h    = center_h + gridy*q;\n    bottom_h = center_h - gridy*q;\n  }\n\n  // The xyz position at the center grid point\n  vw::Vector2 lonlat = geo.pixel_to_lonlat(Vector2(col, row));\n  double h = center_h;\n  vw::Vector3 lonlat3(lonlat(0), lonlat(1), h);\n  xyz = geo.datum().geodetic_to_cartesian(lonlat3);\n\n  // The xyz position at the left grid point\n  lonlat = geo.pixel_to_lonlat(Vector2(col-1, row));\n  h = left_h;\n  lonlat3 = vw::Vector3(lonlat(0), lonlat(1), h);\n  vw::Vector3 left = geo.datum().geodetic_to_cartesian(lonlat3);\n\n  // The xyz position at the right grid point\n  lonlat = geo.pixel_to_lonlat(Vector2(col+1, row));\n  h = right_h;\n  lonlat3 = vw::Vector3(lonlat(0), lonlat(1), h);\n  vw::Vector3 right = geo.datum().geodetic_to_cartesian(lonlat3);\n\n  // The xyz position at the bottom grid point\n  lonlat = geo.pixel_to_lonlat(Vector2(col, row+1));\n  h = bottom_h;\n  lonlat3 = vw::Vector3(lonlat(0), lonlat(1), h);\n  vw::Vector3 bottom = geo.datum().geodetic_to_cartesian(lonlat3);\n\n  // The xyz position at the top grid point\n  lonlat = geo.pixel_to_lonlat(Vector2(col, row-1));\n  h = top_h;\n  lonlat3 = vw::Vector3(lonlat(0), lonlat(1), h);\n  vw::Vector3 top = geo.datum().geodetic_to_cartesian(lonlat3);\n\n  // four-point normal (centered)\n  vw::Vector3 dx = right - left;\n  vw::Vector3 dy = bottom - top;\n\n  normal = -normalize(cross_prod(dx, dy)); // so normal points up\n}\n\n\n// Compute the reflectance and intensity at a single pixel. Compute the slope and/or\n// height error estimation if the pointer is not NULL.\nbool calcPixReflectanceInten(double left_h, double center_h, double right_h,\n                             double bottom_h, double top_h,\n                             bool use_pq, double p, double q, // dem partial derivatives\n                             int col, int row,\n                             DblImgT         const& dem,\n                             vw::cartography::GeoReference const& geo,\n                             bool model_shadows,\n                             double max_dem_height,\n                             double gridx, double gridy,\n                             vw::Vector3       const & sunPosition,\n                             asp::ReflParams   const & refl_params,\n                             vw::BBox2i        const & crop_box,\n                             MaskedImgRefT     const & image,\n                             DblImgT        const & blend_weight,\n                             bool blend_weight_is_ground_weight,\n                             vw::CamPtr camera,\n                             vw::PixelMask<double>   & reflectance,\n                             vw::PixelMask<double>   & intensity,\n                             double                  & ground_weight,\n                             double            const * refl_coeffs,\n                             asp::SfsOptions   const & opt,\n                             asp::HeightErrEstim     * heightErrEstim) {\n\n  // Set output values\n  reflectance = 0.0; reflectance.invalidate();\n  intensity   = 0.0; intensity.invalidate();\n  ground_weight = 0.0;\n\n  if (col >= dem.cols() - 1 || row >= dem.rows() - 1) return false;\n  if (crop_box.empty()) return false;\n\n  vw::Vector3 xyz, normal;\n  asp::calcPointAndNormal(col, row, left_h, center_h, right_h, bottom_h, top_h,\n                          use_pq, p, q, geo, gridx, gridy, xyz, normal);\n\n  // Update the camera position for the given pixel (camera position\n  // is pixel-dependent for linescan cameras).\n  vw::Vector2 pix;\n  vw::Vector3 cameraPosition;\n  try {\n    pix = camera->point_to_pixel(xyz);\n\n    // Need camera center only for Lunar Lambertian\n    if (refl_params.reflectanceType != LAMBERT)\n      cameraPosition = camera->camera_center(pix);\n\n  } catch (...) {\n    reflectance = 0.0; reflectance.invalidate();\n    intensity   = 0.0; intensity.invalidate();\n    ground_weight = 0.0;\n    return false;\n  }\n\n  reflectance = asp::calcReflectance(cameraPosition, normal, xyz, sunPosition,\n                                     refl_params, refl_coeffs);\n  reflectance.validate();\n\n\n  // Since our image is cropped\n  pix -= crop_box.min();\n\n  // Check for out of range\n  if (pix[0] < 0 || pix[0] >= image.cols() - 1 || pix[1] < 0 || pix[1] >= image.rows() - 1) {\n    reflectance = 0.0; reflectance.invalidate();\n    intensity   = 0.0; intensity.invalidate();\n    ground_weight = 0.0;\n    return false;\n  }\n\n  vw::InterpolationView<vw::EdgeExtensionView<MaskedImgRefT, vw::ConstantEdgeExtension>, vw::BilinearInterpolation>\n    interp_image = vw::interpolate(image, vw::BilinearInterpolation(),\n                                   vw::ConstantEdgeExtension());\n  intensity = interp_image(pix[0], pix[1]); // this interpolates\n\n  if (blend_weight_is_ground_weight) {\n    if (blend_weight.cols() != dem.cols() || blend_weight.rows() != dem.rows())\n      vw::vw_throw(vw::ArgumentErr()\n                   << \"Ground weight must have the same size as the DEM.\\n\");\n    ground_weight = blend_weight(col, row);\n  } else {\n    vw::InterpolationView<vw::EdgeExtensionView<DblImgT, vw::ConstantEdgeExtension>, vw::BilinearInterpolation>\n      interp_weight = vw::interpolate(blend_weight, vw::BilinearInterpolation(),\n                                  vw::ConstantEdgeExtension());\n    if (blend_weight.cols() > 0 && blend_weight.rows() > 0) // The weight may not exist\n      ground_weight = interp_weight(pix[0], pix[1]); // this interpolates\n    else\n      ground_weight = 1.0;\n  }\n\n  // Note that we allow negative reflectance for valid intensity. It will hopefully guide\n  // the SfS solution the right way.\n  if (!is_valid(intensity)) {\n    reflectance = 0.0; reflectance.invalidate();\n    intensity   = 0.0; intensity.invalidate();\n    ground_weight = 0.0;\n    return false;\n  }\n\n  if (model_shadows) {\n    bool inShadow = asp::isInShadow(col, row, sunPosition,\n                                    dem, max_dem_height, gridx, gridy,\n                                    geo);\n\n    if (inShadow) {\n      // The reflectance is valid, it is just zero\n      reflectance = 0;\n      reflectance.validate();\n    }\n  }\n\n  if (heightErrEstim != NULL && is_valid(intensity) && is_valid(reflectance)) {\n\n    int image_iter = heightErrEstim->image_iter;\n    ImageView<double> const& albedo = *heightErrEstim->albedo; // alias\n    double sim_intensity \n      = calcSimIntensity(albedo(col, row), reflectance,\n                         opt.image_exposures_vec[image_iter],\n                         opt.steepness_factor, &opt.image_haze_vec[image_iter][0],\n                         opt.num_haze_coeffs);\n\n    // We use twice the discrepancy between the computed and measured intensity\n    // as a measure for how far is overall the computed intensity allowed\n    // to diverge from the measured intensity\n    double max_intensity_err = 2.0 * std::abs(intensity.child() - sim_intensity);\n    estimateHeightError(dem, geo, cameraPosition, sunPosition,  refl_params,\n                        refl_coeffs, intensity.child(), max_intensity_err,\n                        col, row, gridx, gridy, image_iter, opt, albedo,\n                        heightErrEstim);\n  }\n\n  return true;\n}\n\n// The value stored in the output intensity(i, j) is the one at entry\n// (i - 1) * sample_col_rate + 1, (j - 1) * sample_row_rate + 1\n// in the full image. For i = 0 or j = 0 invalid values are stored.\nvoid computeReflectanceAndIntensity(DblImgT const& dem,\n                                    vw::ImageView<vw::Vector2> const& pq,\n                                    vw::cartography::GeoReference const& geo,\n                                    bool model_shadows,\n                                    bool show_progress,\n                                    double & max_dem_height, // alias\n                                    double gridx, double gridy,\n                                    int sample_col_rate, int sample_row_rate,\n                                    vw::Vector3 const& sunPosition,\n                                    asp::ReflParams const& refl_params,\n                                    vw::BBox2i const& crop_box,\n                                    asp::MaskedImgRefT const  & image,\n                                    asp::DblImgT const  & blend_weight,\n                                    bool blend_weight_is_ground_weight,\n                                    vw::CamPtr camera,\n                                    MaskedDblImgT & reflectance,\n                                    MaskedDblImgT & intensity,\n                                    DblImgT & ground_weight,\n                                    double const * refl_coeffs,\n                                    asp::SfsOptions const & opt,\n                                    asp::HeightErrEstim * heightErrEstim) {\n\n  // Update max_dem_height. This can change as the DEM is being optimized.\n  max_dem_height = -std::numeric_limits<double>::max();\n  if (model_shadows) {\n    #pragma omp parallel for num_threads(opt.num_threads)\n    for (int col = 0; col < dem.cols(); col += sample_col_rate) {\n      for (int row = 0; row < dem.rows(); row += sample_row_rate) {\n        if (dem(col, row) > max_dem_height) {\n          max_dem_height = dem(col, row);\n        }\n      }\n    }\n  }\n\n  // See how many samples we end up having further down. Must start counting\n  // from 1, just as we do in that loop.\n  int num_sample_cols = 0, num_sample_rows = 0;\n  for (int col = 1; col < dem.cols() - 1; col += sample_col_rate)\n    num_sample_cols++;\n  for (int row = 1; row < dem.rows() - 1; row += sample_row_rate)\n    num_sample_rows++;\n\n  // Add 2 for book-keeping purposes, to ensure that when the sampling rate\n  // is 1, we get as many cols and rows as the DEM has.\n  num_sample_cols += 2;\n  num_sample_rows += 2;\n\n  // Important sanity check\n  if (sample_col_rate == 1 && num_sample_cols != dem.cols())\n    vw::vw_throw(vw::LogicErr()\n                  << \"Book-keeping error in computing reflectance and intensity.\\n\");\n  if (sample_row_rate == 1 && num_sample_rows != dem.rows())\n    vw::vw_throw(vw::LogicErr()\n                 << \"Book-keeping error in computing reflectance and intensity.\\n\");\n  \n  // Init the reflectance and intensity as invalid. Do it at all grid\n  // points, not just where we sample, to ensure that these quantities\n  // are fully initialized.\n  reflectance.set_size(num_sample_cols, num_sample_rows);\n  intensity.set_size(num_sample_cols, num_sample_rows);\n  ground_weight.set_size(num_sample_cols, num_sample_rows);\n  #pragma omp parallel for num_threads(opt.num_threads)\n  for (int col = 0; col < num_sample_cols; col++) {\n    for (int row = 0; row < num_sample_rows; row++) {\n      reflectance(col, row).invalidate();\n      intensity(col, row).invalidate();\n      ground_weight(col, row) = 0.0;\n    }\n  } // end iterations over cols\n\n  // Set up a terminal progress callback. Will be used only if showing progress.\n  vw::TerminalProgressCallback tpc(\"asp\", \"meas inten: \");\n  double inc = 1.0 / num_sample_cols;\n  if (show_progress)\n    tpc.report_incremental_progress(0.0);\n                                   \n  // Need to very carefully distinguish below between col and col_sample,\n  // and between row and row_sample. These are same only if the sampling\n  // rate is 1. Here we start at col and row equal to 1 to be able to properly\n  // find the neighbors and surface normal.\n  bool use_pq = (pq.cols() > 0 && pq.rows() > 0);\n  #pragma omp parallel for num_threads(opt.num_threads)\n  for (int col = 1; col < dem.cols() - 1; col += sample_col_rate) {\n    int col_sample = (col-1)/sample_col_rate + 1;\n\n    for (int row = 1; row < dem.rows() - 1; row += sample_row_rate) {\n      int row_sample = (row-1)/sample_row_rate + 1;\n\n      double pval = 0, qval = 0;\n      if (use_pq) {\n        pval = pq(col, row)[0];\n        qval = pq(col, row)[1];\n      }\n      asp::calcPixReflectanceInten(dem(col-1, row), dem(col, row), dem(col+1, row),\n                                   dem(col, row+1), dem(col, row-1),\n                                   use_pq, pval, qval,\n                                   col, row, dem, geo,\n                                   model_shadows, max_dem_height,\n                                   gridx, gridy, sunPosition, refl_params, crop_box, image,\n                                   blend_weight, blend_weight_is_ground_weight,\n                                   camera, reflectance(col_sample, row_sample),\n                                   intensity(col_sample, row_sample),\n                                   ground_weight(col_sample, row_sample),\n                                   refl_coeffs, opt, heightErrEstim);\n    }\n    \n    // Show progress if requested\n    if (show_progress) {\n      #pragma omp critical\n      { \n        tpc.report_incremental_progress(inc);\n      }\n    }\n    \n  } // end iterations over cols\n\n  if (show_progress)\n    tpc.report_finished();\n\n  return;\n}\n\n// Initalize the reflectance parameters based on user input\nvoid setupReflectance(asp::ReflParams & refl_params, asp::SfsOptions & opt) {\n  if (opt.reflectance_type == 0)\n    refl_params.reflectanceType = LAMBERT;\n  else if (opt.reflectance_type == 1)\n    refl_params.reflectanceType = LUNAR_LAMBERT;\n  else if (opt.reflectance_type == 2)\n    refl_params.reflectanceType = HAPKE;\n  else if (opt.reflectance_type == 3)\n    refl_params.reflectanceType = ARBITRARY_MODEL;\n  else if (opt.reflectance_type == 4)\n    refl_params.reflectanceType = CHARON;\n  else\n    vw_throw(ArgumentErr() << \"Expecting Lambertian or Lunar-Lambertian reflectance.\");\n  refl_params.phaseCoeffC1 = 0;\n  refl_params.phaseCoeffC2 = 0;\n\n  // Default model coefficients, unless they were read already\n  if (opt.model_coeffs_vec.empty()) {\n    opt.model_coeffs_vec.resize(g_num_model_coeffs);\n    if (refl_params.reflectanceType == LUNAR_LAMBERT ||\n        refl_params.reflectanceType == ARBITRARY_MODEL) {\n      // Lunar lambertian or its crazy experimental generalization\n      opt.model_coeffs_vec.resize(g_num_model_coeffs);\n      opt.model_coeffs_vec[0] = 1;\n      opt.model_coeffs_vec[1] = -0.019;\n      opt.model_coeffs_vec[2] =  0.000242;   //0.242*1e-3;\n      opt.model_coeffs_vec[3] = -0.00000146; //-1.46*1e-6;\n      opt.model_coeffs_vec[4] = 1;\n      opt.model_coeffs_vec[5] = 0;\n      opt.model_coeffs_vec[6] = 0;\n      opt.model_coeffs_vec[7] = 0;\n      opt.model_coeffs_vec[8] = 1;\n      opt.model_coeffs_vec[9] = -0.019;\n      opt.model_coeffs_vec[10] =  0.000242;   //0.242*1e-3;\n      opt.model_coeffs_vec[11] = -0.00000146; //-1.46*1e-6;\n      opt.model_coeffs_vec[12] = 1;\n      opt.model_coeffs_vec[13] = 0;\n      opt.model_coeffs_vec[14] = 0;\n      opt.model_coeffs_vec[15] = 0;\n    } else if (refl_params.reflectanceType == HAPKE) {\n      opt.model_coeffs_vec[0] = 0.68; // omega (also known as w)\n      opt.model_coeffs_vec[1] = 0.17; // b\n      opt.model_coeffs_vec[2] = 0.62; // c\n      opt.model_coeffs_vec[3] = 0.52; // B0\n      opt.model_coeffs_vec[4] = 0.52; // h\n    } else if (refl_params.reflectanceType == CHARON) {\n      opt.model_coeffs_vec.resize(g_num_model_coeffs);\n      opt.model_coeffs_vec[0] = 0.7; // A\n      opt.model_coeffs_vec[1] = 0.63; // f(alpha)\n    } else if (refl_params.reflectanceType != LAMBERT) {\n      vw_throw(ArgumentErr() << \"The Hapke model coefficients were not set. \"\n                << \"Use the --model-coeffs option.\");\n    }\n  }\n}\n\n// TODO(oalexan1): Should one mark the no-data values rather than setting\n// them to 0?\nvoid calcSimIntensity(vw::ImageView<double> const& albedo,\n                      MaskedDblImgT const& reflectance,\n                      double exposure,\n                      double steepness_factor,\n                      std::vector<double> const& haze,\n                      int num_haze_coeffs,\n                      int num_threads,\n                      bool show_progress,\n                      MaskedDblImgT & sim_intensity) {\n\n  // Init the output image\n  sim_intensity.set_size(reflectance.cols(), reflectance.rows());\n  \n  // Set up a terminal progress callback. Will be used only if showing progress.\n  vw::TerminalProgressCallback tpc(\"asp\", \"sim inten: \");\n  double inc = 1.0 / sim_intensity.cols();\n  if (show_progress)\n    tpc.report_incremental_progress(0.0);\n\n  #pragma omp parallel for num_threads(num_threads)\n  for (int col = 0; col < sim_intensity.cols(); col++) {\n    for (int row = 0; row < sim_intensity.rows(); row++) {\n      sim_intensity(col, row) \n        = calcSimIntensity(albedo(col, row), reflectance(col, row),\n                           exposure, steepness_factor, \n                           &haze[0], num_haze_coeffs);\n    }\n    \n    // Show progress if requested\n    if (show_progress) {\n      #pragma omp critical\n      { \n        tpc.report_incremental_progress(inc);\n      }\n    }\n    \n  } // end iterations over cols\n\n  if (show_progress)\n    tpc.report_finished();\n\n} // end function calcSimIntensity\n\n// This function computes / saves measured and simulated intensities, and\n// handles related estimations. If opt.allow_borderline_data is true, create for\n// each image that will not be skipped a weight matrix with dimensions equal to\n// DEM dimensions, that will be used instead of weights in the camera image\n// space. These are balanced among each other and give more weight to barely lit\n// and unlit nearby pixels.\nvoid calcIntenEstimHeights(SfsOptions & opt,\n                           vw::ImageView<double> const& dem,\n                           vw::ImageView<double> const& albedo,\n                           vw::cartography::GeoReference const& geo,\n                           bool show_progress,\n                           double max_dem_height,\n                           double gridx, double gridy,\n                           std::vector<vw::Vector3> const& sunPosition,\n                           asp::ReflParams const& refl_params,\n                           std::vector<vw::BBox2i> const& crop_boxes,\n                           std::vector<MaskedImgRefT> const& masked_images,\n                           std::vector<vw::ImageView<double>> const& blend_weights,\n                           bool blend_weight_is_ground_weight,\n                           std::vector<vw::CamPtr> const& cameras,\n                           float img_nodata_val,\n                           // Outputs\n                           vw::ImageView<int> & lit_image_mask,\n                           std::vector<vw::ImageView<double>> & ground_weights,\n                           std::vector<MaskedDblImgT> & meas_intensities,\n                           std::vector<MaskedDblImgT> & sim_intensities) {\n\n  int num_images = opt.input_images.size();\n\n  // Save the computed and actual intensity, and for most of these quit\n  MaskedDblImgT reflectance, meas_intensity, sim_intensity;\n  vw::ImageView<double> ground_weight;\n  vw::ImageView<Vector2> pq; // no need for these just for initialization\n  int sample_col_rate = 1, sample_row_rate = 1;\n  \n  auto heightErrEstim = boost::shared_ptr<HeightErrEstim>(NULL);\n  if (opt.estimate_height_errors) {\n    double max_height_error  = opt.height_error_params[0];\n    int num_height_samples   = opt.height_error_params[1];\n    vw_out() << \"Maximum height error to examine: \" << max_height_error << \"\\n\";\n    vw_out() << \"Number of samples to use from 0 to that height: \"\n             << num_height_samples << \"\\n\";\n    \n    double nodata_height_val = -1.0;\n    heightErrEstim = boost::shared_ptr<HeightErrEstim>\n      (new HeightErrEstim(dem.cols(), dem.rows(),\n                          num_height_samples, max_height_error, nodata_height_val,\n                          &albedo));\n  }\n  \n  if (show_progress)\n    vw::vw_out() << \"Computing measured and simulated intensities.\\n\";\n  \n  for (int image_iter = 0; image_iter < num_images; image_iter++) {\n    \n    if (opt.estimate_height_errors)\n      heightErrEstim->image_iter = image_iter;\n    \n    // Find the reflectance and measured intensity. Note that this function is\n    // needed even if only saving the simulated intensity, as it computes\n    // the reflectance image which is a necessary input for the simulated\n    // intensity calculation.\n    asp::computeReflectanceAndIntensity(dem, pq, geo,\n                                        opt.model_shadows, show_progress, max_dem_height,\n                                        gridx, gridy, sample_col_rate, sample_row_rate,\n                                        sunPosition[image_iter],\n                                        refl_params,\n                                        crop_boxes[image_iter],\n                                        masked_images[image_iter],\n                                        blend_weights[image_iter],\n                                        blend_weight_is_ground_weight,\n                                        cameras[image_iter],\n                                        reflectance, meas_intensity, ground_weight,\n                                        &opt.model_coeffs_vec[0], opt,\n                                        heightErrEstim.get());\n    \n    // Find the simulated intensity only when needed\n    if (opt.save_sim_intensity_only || opt.low_light_threshold > 0.0)\n      asp::calcSimIntensity(albedo, reflectance,\n                            opt.image_exposures_vec[image_iter],\n                            opt.steepness_factor,\n                            opt.image_haze_vec[image_iter],\n                            opt.num_haze_coeffs,\n                            opt.num_threads,\n                            show_progress,\n                            sim_intensity);\n    \n    // Save some quantities if needed\n    if (opt.skip_images.find(image_iter) == opt.skip_images.end() &&\n        (opt.allow_borderline_data || opt.low_light_threshold > 0.0))\n      ground_weights[image_iter] = copy(ground_weight); // save the weight\n    if (opt.skip_images.find(image_iter) == opt.skip_images.end() &&\n        opt.low_light_threshold > 0.0) {\n      // Save the measured and computed intensities. Avoid doing this in \n      // general as they can be large, if the input DEM is large.\n      meas_intensities[image_iter] = copy(meas_intensity);\n      sim_intensities[image_iter] = copy(sim_intensity);\n    }\n    \n    if (opt.curvature_in_shadow_weight > 0.0) {\n      if (meas_intensity.cols() != lit_image_mask.cols() ||\n          meas_intensity.rows() != lit_image_mask.rows())\n        vw_throw(ArgumentErr()\n                 << \"Intensity image dimensions disagree with DEM clip dimensions.\\n\");\n        \n      for (int col = 0; col < lit_image_mask.cols(); col++) {\n        for (int row = 0; row < lit_image_mask.rows(); row++) {\n          if (is_valid(meas_intensity(col, row))           ||\n              col == 0 || col == lit_image_mask.cols() - 1 ||\n              row == 0 || row == lit_image_mask.rows() - 1) {\n            // Boundary pixels are declared lit. Otherwise they are always\n            // unlit due to the peculiarities of how the intensity is found\n            // at the boundary.\n            lit_image_mask(col, row) = 1;\n          }\n        }\n      }\n    }\n    \n    if (opt.save_sim_intensity_only || opt.save_meas_intensity_only)\n      asp::saveIntensities(opt, opt.input_images[image_iter],\n                           opt.input_cameras[image_iter],\n                           geo, meas_intensity,\n                           sim_intensity, img_nodata_val);\n    \n  } // End iterating over images\n  \n  if (opt.estimate_height_errors)\n    asp::combineHeightErrors(heightErrEstim, opt, geo);\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/SfS/SfsModel.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// \\file SfsModel.h\n// Modeling reflectance, intensity, albedo for SfS\n\n#ifndef __ASP_SFS_SFS_MODEL_H__\n#define __ASP_SFS_SFS_MODEL_H__\n\n#include <asp/SfS/SfsImageProc.h>\n\n#include <vw/Camera/CameraModel.h>\n#include <vw/Image/MaskViews.h>\n#include <vw/Image/ImageViewRef.h>\n#include <vw/Math/Vector.h>\n\nnamespace vw { namespace cartography {\n  class GeoReference;\n}} // namespace vw::cartography\n\nnamespace asp {\n\n// Maximum number of reflectance model and haze coefficients\nconst size_t g_num_model_coeffs = 16;\nconst size_t g_max_num_haze_coeffs = 6;\n\nenum REFL_TYPE {NO_REFL = 0, LAMBERT, LUNAR_LAMBERT, HAPKE, ARBITRARY_MODEL, CHARON};\n\nclass HeightErrEstim;\nclass SfsOptions;\n\nstruct ReflParams {\n  int reflectanceType;\n  // Two parameters used in the formula for the Lunar-Lambertian\n  // reflectance\n  double phaseCoeffC1, phaseCoeffC2;\n};\n\n// Reflectance formula that is nonlinear if there is more than one haze coefficient\n// (that is experimental).\ndouble nonlinReflectance(double reflectance, double exposure,\n                         double steepness_factor,\n                         double const* haze, int num_haze_coeffs);\n\n// Computes the ground reflectance with a desired reflectance model.\ndouble calcReflectance(vw::Vector3 const& cameraPosition, vw::Vector3 const& normal,\n                       vw::Vector3 const& xyz, vw::Vector3 const& sun_position,\n                       ReflParams const& refl_params,\n                       const double * refl_coeffs);\n\n// Computed intensity:\n// albedo * nonlinReflectance(reflectance_i, exposures[i], haze, num_haze_coeffs) + haze[0]\n// Cost function:\n// sum_i | I_i - sim_intensity_i|^2\ndouble calcSimIntensity(double albedo, double reflectance, double exposure,\n                     double steepness_factor, double const* haze, int num_haze_coeffs);\n\n// TODO(oalexan1): Should one mark the no-data values rather than setting\n// them to 0?\nvoid calcSimIntensity(vw::ImageView<double> const& albedo,\n                      MaskedDblImgT const& reflectance,\n                      double exposure,\n                      double steepness_factor,\n                      std::vector<double> const& haze,\n                      int num_haze_coeffs,\n                      int num_threads,\n                      bool show_progress,\n                      MaskedDblImgT & sim_intensity);\n\n// Calc albedo given the intensity. See calcSimIntensity().\ndouble calcAlbedo(double intensity, double reflectance, double exposure,\n                  double steepness_factor, double const* haze, int num_haze_coeffs);\n\n// Calculate current ECEF position and normal vector for a given DEM pixel.\n// This is an auxiliary function needed to compute the reflectance.\nvoid calcPointAndNormal(int col, int row,\n                        double left_h, double center_h, double right_h,\n                        double bottom_h, double top_h,\n                        bool use_pq, double p, double q, // dem partial derivatives\n                        vw::cartography::GeoReference const& geo,\n                        double gridx, double gridy,\n                        // Outputs\n                        vw::Vector3 & xyz, vw::Vector3 & normal);\n\n// Compute the reflectance and intensity at a single pixel. Compute the slope and/or\n// height error estimation if the pointer is not NULL.\nbool calcPixReflectanceInten(double left_h, double center_h, double right_h,\n                             double bottom_h, double top_h,\n                             bool use_pq, double p, double q, // dem partial derivatives\n                             int col, int row,\n                             DblImgT         const& dem,\n                             vw::cartography::GeoReference const& geo,\n                             bool model_shadows,\n                             double max_dem_height,\n                             double gridx, double gridy,\n                             vw::Vector3       const & sunPosition,\n                             asp::ReflParams   const & refl_params,\n                             vw::BBox2i        const & crop_box,\n                             MaskedImgRefT     const & image,\n                             DblImgT        const & blend_weight,\n                             bool blend_weight_is_ground_weight,\n                             vw::CamPtr camera,\n                             vw::PixelMask<double>   & reflectance,\n                             vw::PixelMask<double>   & intensity,\n                             double                  & ground_weight,\n                             double            const * refl_coeffs,\n                             asp::SfsOptions   const & opt,\n                             asp::HeightErrEstim     * heightErrEstim = NULL);\n\n// The value stored in the output intensity(i, j) is the one at entry\n// (i - 1) * sample_col_rate + 1, (j - 1) * sample_row_rate + 1\n// in the full image. For i = 0 or j = 0 invalid values are stored.\nvoid computeReflectanceAndIntensity(DblImgT const& dem,\n                                    vw::ImageView<vw::Vector2> const& pq,\n                                    vw::cartography::GeoReference const& geo,\n                                    bool model_shadows,\n                                    bool show_progress,\n                                    double & max_dem_height, // alias\n                                    double gridx, double gridy,\n                                    int sample_col_rate, int sample_row_rate,\n                                    vw::Vector3 const& sunPosition,\n                                    asp::ReflParams const& refl_params,\n                                    vw::BBox2i const& crop_box,\n                                    asp::MaskedImgRefT const  & image,\n                                    asp::DblImgT const  & blend_weight,\n                                    bool blend_weight_is_ground_weight,\n                                    vw::CamPtr camera,\n                                    MaskedDblImgT & reflectance,\n                                    MaskedDblImgT & intensity,\n                                    DblImgT & ground_weight,\n                                    double const * refl_coeffs,\n                                    asp::SfsOptions const & opt,\n                                    asp::HeightErrEstim * heightErrEstim = NULL);\n\n// Initalize the reflectance parameters based on user input\nvoid setupReflectance(asp::ReflParams & refl_params, asp::SfsOptions & opt);\n\n// This function computes / saves measured and simulated intensities, and\n// handles related estimations. If opt.allow_borderline_data is true, create for\n// each image that will not be skipped a weight matrix with dimensions equal to\n// DEM dimensions, that will be used instead of weights in the camera image\n// space. These are balanced among each other and give more weight to barely lit\n// and unlit nearby pixels.\nvoid calcIntenEstimHeights(SfsOptions & opt,\n                           vw::ImageView<double> const& dem,\n                           vw::ImageView<double> const& albedo,\n                           vw::cartography::GeoReference const& geo,\n                           bool show_progress,\n                           double max_dem_height,\n                           double gridx, double gridy,\n                           std::vector<vw::Vector3> const& sunPosition,\n                           asp::ReflParams const& refl_params,\n                           std::vector<vw::BBox2i> const& crop_boxes,\n                           std::vector<MaskedImgRefT> const& masked_images,\n                           std::vector<vw::ImageView<double>> const& blend_weights,\n                           bool blend_weight_is_ground_weight,\n                           std::vector<vw::CamPtr> const& cameras,\n                           float img_nodata_val,\n                           // Outputs\n                           vw::ImageView<int> & lit_image_mask,\n                           std::vector<vw::ImageView<double>> & ground_weights,\n                           std::vector<MaskedDblImgT> & meas_intensities,\n                           std::vector<MaskedDblImgT> & sim_intensities);\n\n} // end namespace asp\n\n#endif // __ASP_SFS_SFS_MODEL_H__\n"
  },
  {
    "path": "src/asp/SfS/SfsOptions.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// \\file SfsOptions.vv\n// Command-line options for sfs\n\n#include <asp/SfS/SfsOptions.h>\n\n#include <string>\n#include <map>\n\nnamespace asp {\n\nSfsOptions::SfsOptions():\n  max_iterations(0), reflectance_type(0),\n  blending_dist(0), blending_power(2.0),\n  min_blend_size(0), num_haze_coeffs(0),\n  num_samples_for_estim(0),\n  float_albedo(false), float_exposure(false), model_shadows(false),\n  save_sim_intensity_only(false), save_meas_intensity_only(false),\n  estimate_height_errors(false),\n  compute_exposures_only(false),\n  estim_exposure_haze_albedo(false),\n  save_dem_with_nodata(false),\n  use_approx_camera_models(false),\n  crop_input_images(false),\n  allow_borderline_data(false), fix_dem(false),\n  float_reflectance_model(false), query(false),\n  save_sparingly(false), float_haze(false),\n  save_variances(false), save_covariances(false),\n  smoothness_weight(0), steepness_factor(1.0),\n  curvature_in_shadow(0), curvature_in_shadow_weight(0.0),\n  lit_curvature_dist(0.0), shadow_curvature_dist(0.0),\n  gradient_weight(0.0), integrability_weight(0), smoothness_weight_pq(0),\n  initial_dem_constraint_weight(0.0),\n  albedo_constraint_weight(0.0), albedo_robust_threshold(0.0),\n  camera_position_step_size(1.0), low_light_threshold(0.0),\n  low_light_weight_power(4.0), low_light_blur_sigma(0.0),\n  crop_win(vw::BBox2i(0, 0, 0, 0)) {}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/SfS/SfsOptions.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// \\file SfsOptions.h\n// Command-line options for sfs\n\n#ifndef __ASP_SFS_SFS_OPTIONS_H__\n#define __ASP_SFS_SFS_OPTIONS_H__\n\n#include <vw/FileIO/GdalWriteOptions.h>\n\n#include <set>\n\nnamespace asp {\n\nstruct SfsOptions: public vw::GdalWriteOptions {\n  std::string input_dem, image_list, camera_list, out_prefix, stereo_session, bundle_adjust_prefix, input_albedo;\n  std::vector<std::string> input_images, input_cameras;\n  std::string shadow_thresholds, custom_shadow_threshold_list, max_valid_image_vals, skip_images_str, image_exposures_prefix, model_coeffs_prefix, model_coeffs, image_haze_prefix, sun_positions_list, sun_angles_list, ref_map;\n  std::vector<float> shadow_threshold_vec, max_valid_image_vals_vec;\n  std::vector<double> image_exposures_vec;\n  std::vector<std::vector<double>> image_haze_vec;\n  std::vector<double> model_coeffs_vec;\n  std::set<int> skip_images;\n  int max_iterations, reflectance_type, blending_dist, min_blend_size, num_haze_coeffs,\n    num_samples_for_estim;\n  bool float_albedo, float_exposure, model_shadows,\n    save_sim_intensity_only, save_meas_intensity_only, estimate_height_errors,\n    compute_exposures_only, estim_exposure_haze_albedo,\n    save_dem_with_nodata, use_approx_camera_models,\n    crop_input_images, allow_borderline_data, fix_dem, float_reflectance_model,\n    query, save_sparingly, float_haze, read_exposures, read_haze, read_albedo,\n    erode_seams, save_variances, save_covariances;\n\n  double smoothness_weight, steepness_factor, gradient_weight,\n    blending_power, integrability_weight, smoothness_weight_pq, init_dem_height,\n    nodata_val, initial_dem_constraint_weight, albedo_constraint_weight,\n    albedo_robust_threshold, camera_position_step_size, \n    robust_threshold, shadow_threshold, low_light_threshold,\n    low_light_weight_power, low_light_blur_sigma,\n    curvature_in_shadow, curvature_in_shadow_weight, lit_curvature_dist, \n    shadow_curvature_dist;\n    \n  vw::BBox2 crop_win;\n  vw::Vector2 height_error_params;\n\n  SfsOptions();\n};\n\n} // end namespace asp\n\n#endif // __ASP_SFS_SFS_OPTIONS_H__\n\n"
  },
  {
    "path": "src/asp/SfS/SfsUtils.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// \\file SfsUtils.cc\n// Basic utilities for SfS\n\n#include <asp/SfS/SfsUtils.h>\n#include <asp/Camera/CsmModel.h>\n#include <asp/asp_config.h> // defines ASP_HAVE_PKG_ISIS\n#if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1\n#include <asp/IsisIO/IsisCameraModel.h>\n#endif // ASP_HAVE_PKG_ISIS\n\n#include <vw/Core/CmdUtils.h>\n\n#include <string>\n#include <map>\n\nnamespace asp {\n\nusing namespace vw;\n\n// Find lon-lat-height in the center of the DEM\nvoid calcDemCenterLonLatHeight(vw::ImageView<double> const& dem,\n                               double nodata_val,\n                               vw::cartography::GeoReference const& georef,\n                               vw::Vector3 & llh) {\n\n  int cols = dem.cols(), rows = dem.rows();\n  if (cols <= 0 || rows <= 0)\n    vw_throw(ArgumentErr() << \"Expecting a non-empty DEM.\\n\");\n\n  vw::Vector2 ll = georef.pixel_to_lonlat(Vector2(cols/2.0, rows/2.0));\n  double height = dem(cols/2.0, rows/2.0);\n  if (height == nodata_val)\n    height = 0.0;\n\n  llh = vw::Vector3(ll[0], ll[1], height);\n}\n\n// Find the sun azimuth and elevation at the lon-lat position of the\n// center of the DEM. The result can change depending on the DEM.\nvoid sunAngles(ImageView<double> const& dem,\n               double nodata_val, vw::cartography::GeoReference const& georef,\n               vw::Vector3 const& sun_pos,\n               double & azimuth, double & elevation) {\n\n  // Find lon-lat-height in the center of the DEM\n  vw::Vector3 llh;\n  calcDemCenterLonLatHeight(dem, nodata_val, georef, llh);\n\n  vw::Vector3 xyz = georef.datum().geodetic_to_cartesian(llh); // point on the planet\n\n  vw::Vector3 sun_dir = sun_pos - xyz;\n  sun_dir = sun_dir / norm_2(sun_dir); // normalize\n\n  // Find the sun direction in the North-East-Down coordinate system\n  vw::Matrix3x3 Ned2Ecef = georef.datum().lonlat_to_ned_matrix(llh);\n  vw::Vector3 sun_dir_ned = inverse(Ned2Ecef) * sun_dir;\n\n  if (sun_dir_ned[0] == 0 && sun_dir_ned[1] == 0)\n    azimuth = 0;\n  else\n    azimuth = (180.0/M_PI) * atan2(sun_dir_ned[1], sun_dir_ned[0]);\n\n  // azimuth = atan(E/N) in the NED system\n  // So, when N = 1 and E = 0, azimuth is 0.\n\n  double L = norm_2(subvector(sun_dir_ned, 0, 2));\n  elevation = (180.0/M_PI) * atan2(-sun_dir_ned[2], L);\n}\n\n// Convert azimuth and elevation in degrees to Sun position in meters\nvw::Vector3 angelsToSunPosition(double azimuth, double elevation,\n                                const vw::Vector3& xyz,\n                                const vw::Matrix3x3& Ned2Ecef) {\n    // Convert to radians\n    azimuth   *= M_PI/180.0;\n    elevation *= M_PI/180.0;\n\n    // Find the Sun direction in NED\n    double n = cos(azimuth) * cos(elevation);\n    double e = sin(azimuth) * cos(elevation);\n    double d = -sin(elevation);\n\n    // Convert the direction to ECEF\n    vw::Vector3 sun_dir = Ned2Ecef * vw::Vector3(n, e, d);\n\n    // The distance to the Sun\n    double sun_dist = 149597870700.0; // meters\n\n    // Add to xyz the direction multiplied by the distance\n    return xyz + sun_dist * sun_dir;\n}\n\n// Read sun positions from a file\nvoid readSunPositions(std::string const& sun_positions_list,\n                      std::vector<std::string> const& input_images,\n                      vw::ImageView<double> const& dem,\n                      double nodata_val,\n                      vw::cartography::GeoReference const& georef,\n                      std::vector<vw::Vector3> & sun_positions) {\n\n  // Initialize the sun position with something (the planet center)\n  int num_images = input_images.size();\n  sun_positions.resize(num_images);\n  for (int it = 0; it < num_images; it++)\n    sun_positions[it] = vw::Vector3();\n\n  // First read the positions in a map, as they may be out of order\n  std::map<std::string, vw::Vector3> sun_positions_map;\n  std::ifstream ifs(sun_positions_list.c_str());\n  std::string filename;\n  double x, y, z;\n  while (ifs >> filename >> x >> y >> z)\n    sun_positions_map[filename] = vw::Vector3(x, y, z);\n\n  // Put the sun positions in sun_positions.\n  for (int it = 0; it < num_images; it++) {\n    auto map_it = sun_positions_map.find(input_images[it]);\n    if (map_it == sun_positions_map.end())\n      vw_throw(ArgumentErr() << \"Could not read the Sun position from file: \"\n               << sun_positions_list << \" for image: \" << input_images[it] << \".\\n\");\n\n    sun_positions[it] = map_it->second;\n  }\n}\n\n// Read the sun angles (azimuth and elevation) and convert them to sun positions.\nvoid readSunAngles(std::string const& sun_positions_list,\n                   std::vector<std::string> const& input_images,\n                   vw::ImageView<double> const& dem,\n                   double nodata_val,\n                   vw::cartography::GeoReference const& georef,\n                   std::vector<vw::Vector3> & sun_positions) {\n\n  // Find lon-lat-height in the center of the DEM\n  vw::Vector3 llh;\n  calcDemCenterLonLatHeight(dem, nodata_val, georef, llh);\n\n  // Point on the planet\n  vw::Vector3 xyz = georef.datum().geodetic_to_cartesian(llh);\n\n  // Find the sun direction in the North-East-Down coordinate system\n  vw::Matrix3x3 Ned2Ecef = georef.datum().lonlat_to_ned_matrix(llh);\n\n  // Initialize the sun position with something (the planet center)\n  int num_images = input_images.size();\n  sun_positions.resize(num_images);\n  for (int it = 0; it < num_images; it++)\n    sun_positions[it] = vw::Vector3();\n\n  // First read the positions in a map, as they may be out of order\n  std::map<std::string, vw::Vector3> sun_positions_map;\n  std::ifstream ifs(sun_positions_list.c_str());\n  std::string filename;\n  double azimuth, elevation;\n  while (ifs >> filename >> azimuth >> elevation)\n    sun_positions_map[filename] = angelsToSunPosition(azimuth, elevation, xyz, Ned2Ecef);\n\n  // Put the sun positions in sun_positions.\n  for (int it = 0; it < num_images; it++) {\n    auto map_it = sun_positions_map.find(input_images[it]);\n    if (map_it == sun_positions_map.end())\n      vw::vw_throw(vw::ArgumentErr() << \"Could not read the Sun position from file: \"\n               << sun_positions_list << \" for image: \" << input_images[it] << \".\\n\");\n\n    sun_positions[it] = map_it->second;\n  }\n}\n\n// Query an ISIS or CSM camera to find the Sun position\nvw::Vector3 sunPositionFromCamera(vw::CamPtr camera) {\n\n  // Remove any adjustment to get to the camera proper\n  vw::CamPtr ucam = unadjusted_model(camera);\n\n#if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1\n  // Try isis\n  vw::camera::IsisCameraModel* isis_cam\n    = dynamic_cast<vw::camera::IsisCameraModel*>(ucam.get());\n  if (isis_cam != NULL)\n    return isis_cam->sun_position();\n#endif // ASP_HAVE_PKG_ISIS\n\n  // Try csm\n  asp::CsmModel* csm_cam = dynamic_cast<asp::CsmModel*>(ucam.get());\n  if (csm_cam != NULL)\n    return csm_cam->sun_position();\n\n  // No luck. Later there will be a complaint.\n  return vw::Vector3();\n}\n\nstd::string exposureFileName(std::string const& prefix) {\n  return prefix + \"-exposures.txt\";\n}\n\nstd::string hazeFileName(std::string const& prefix) {\n  return prefix + \"-haze.txt\";\n}\n\nstd::string modelCoeffsFileName(std::string const& prefix) {\n  return prefix + \"-model_coeffs.txt\";\n}\n\nstd::string skippedImagesFileName(std::string const& prefix) {\n  return prefix + \"-skipped_images.txt\";\n}\n\nstd::string usedImagesFileName(std::string const& prefix) {\n  return prefix + \"-used_images.txt\";\n}\n\n// Save the exposures to a file\nvoid saveExposures(std::string const& out_prefix,\n                   std::vector<std::string> const& input_images,\n                   std::vector<double> const& exposures) {\n  std::string exposure_file = exposureFileName(out_prefix);\n  vw_out() << \"Writing: \" << exposure_file << std::endl;\n  std::ofstream exf(exposure_file.c_str());\n  exf.precision(17);\n  for (size_t image_iter = 0; image_iter < exposures.size(); image_iter++)\n    exf << input_images[image_iter] << \" \" << exposures[image_iter] << \"\\n\";\n  exf.close();\n}\n\n// Save the haze to a file\nvoid saveHaze(std::string const& out_prefix,\n              std::vector<std::string> const& input_images,\n              std::vector<std::vector<double>> const& haze) {\n\n  std::string haze_file = hazeFileName(out_prefix);\n  vw_out() << \"Writing: \" << haze_file << std::endl;\n  std::ofstream hzf(haze_file.c_str());\n  hzf.precision(17);\n  for (size_t image_iter = 0; image_iter < haze.size(); image_iter++) {\n    hzf << input_images[image_iter];\n    for (size_t hiter = 0; hiter < haze[image_iter].size(); hiter++)\n      hzf << \" \" << haze[image_iter][hiter];\n\n    hzf << \"\\n\";\n  }\n  hzf.close();\n}\n\n// Save the skipped images list, these images had no/bad exposure\n//  so no good data for the DEM in them\nvoid saveSkippedImages(std::string const& out_prefix,\n                       std::vector<std::string> const& input_images) {\n  std::string skipped_file = skippedImagesFileName(out_prefix);\n  vw_out() << \"Writing: \" << skipped_file << std::endl;\n  std::ofstream skippedfile(skipped_file.c_str());\n  for (const auto& image : input_images)\n    skippedfile << image << \"\\n\";\n}\n\n// Save the used images list, these images had good exposure\nvoid saveUsedImages(std::string const& out_prefix,\n                    std::vector<std::string> const& input_images) {\n  std::string used_file = usedImagesFileName(out_prefix);\n  vw_out() << \"Writing: \" << used_file << std::endl;\n  std::ofstream usedfile(used_file.c_str());\n  for (const auto& image : input_images)\n    usedfile << image << \"\\n\";\n}\n\n// Get the memory usage for the given process. This is for debugging, not used\n// in production code. It does not work on OSX.\nvoid callTop() {\n\n  std::ostringstream os;\n  int pid = getpid();\n  os << pid;\n\n  std::string cmd = \"top -b -n 1 | grep -i ' sfs' | grep -i '\" + os.str() + \"'\";\n  std::string ans = vw::exec_cmd(cmd.c_str());\n  vw_out() << \"Memory usage: \" << cmd << \" \" << ans << \"\\n\";\n}\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/SfS/SfsUtils.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// \\file SfsUtils.h\n// Basic utilities for SfS\n\n#ifndef __ASP_SFS_SFS_UTILS_H__\n#define __ASP_SFS_SFS_UTILS_H__\n\n#include <vw/Cartography/GeoReference.h>\n#include <vw/Image/ImageView.h>\n#include <vw/Camera/CameraModel.h>\n\nnamespace asp {\n\n// Find the Sun azimuth and elevation at the lon-lat position of the\n// center of the DEM. The result can change depending on the DEM.\nvoid sunAngles(vw::ImageView<double> const& dem,\n               double nodata_val,\n               vw::cartography::GeoReference const& georef,\n               vw::Vector3 const& sun_pos,\n               double & azimuth, double & elevation);\n\n// Read sun positions from a file\nvoid readSunPositions(std::string const& sun_positions_list,\n                      std::vector<std::string> const& input_images,\n                      vw::ImageView<double> const& dem,\n                      double nodata_val,\n                      vw::cartography::GeoReference const& georef,\n                      std::vector<vw::Vector3> & sun_positions);\n\n// Read the sun angles (azimuth and elevation) and convert them to sun positions.\nvoid readSunAngles(std::string const& sun_positions_list,\n                   std::vector<std::string> const& input_images,\n                   vw::ImageView<double> const& dem,\n                   double nodata_val,\n                   vw::cartography::GeoReference const& georef,\n                   std::vector<vw::Vector3> & sun_positions);\n\n// Query an ISIS or CSM camera to find the Sun position\nvw::Vector3 sunPositionFromCamera(vw::CamPtr camera);\n\nstd::string exposureFileName(std::string const& prefix);\nstd::string hazeFileName(std::string const& prefix);\nstd::string modelCoeffsFileName(std::string const& prefix);\nstd::string skippedImagesFileName(std::string const& prefix);\nstd::string usedImagesFileName(std::string const& prefix);\n\n// Save the exposures to a file\nvoid saveExposures(std::string const& out_prefix,\n                   std::vector<std::string> const& input_images,\n                   std::vector<double> const& exposures);\n\n// Save the haze to a file\nvoid saveHaze(std::string const& out_prefix,\n              std::vector<std::string> const& input_images,\n              std::vector<std::vector<double>> const& haze);\n\n// Save the skipped images list to a file\nvoid saveSkippedImages(std::string const& out_prefix,\n                       std::vector<std::string> const& input_images);\n\n// Save the used images list to a file\nvoid saveUsedImages(std::string const& out_prefix,\n                    std::vector<std::string> const& input_images);\n\n} // end namespace asp\n\n#endif // __ASP_SFS_SFS_UTILS_H__\n"
  },
  {
    "path": "src/asp/SfmView/CMakeLists.txt",
    "content": "# Use wrapper function at this level to avoid code duplication\nadd_library_wrapper(AspSfmView \"${ASP_SFMVIEW_SRC_FILES}\" \"${ASP_SFMVIEW_TEST_FILES}\" \"${ASP_SFMVIEW_LIB_DEPENDENCIES}\")\n\n# Need this for QT to work.\nset_target_properties(AspSfmView PROPERTIES AUTOMOC TRUE)\n"
  },
  {
    "path": "src/asp/SfmView/GlCommon.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Derived from MVE (Simon Fuhrmann, TU Darmstadt, BSD 3-Clause).\n\n#ifndef __ASP_SFMVIEW_GL_COMMON_H__\n#define __ASP_SFMVIEW_GL_COMMON_H__\n\n// OpenGL via Qt\n#include <QOpenGLExtraFunctions>\n#include <QOpenGLContext>\n\n#include <stdexcept>\n#include <string>\n\n// Get GL functions from the current Qt GL context (Qt6).\ninline QOpenGLExtraFunctions* glFunctions() {\n  return QOpenGLContext::currentContext()->extraFunctions();\n}\n\nnamespace sfm {\n\nenum MouseEventType {\n  MOUSE_EVENT_PRESS,\n  MOUSE_EVENT_RELEASE,\n  MOUSE_EVENT_MOVE,\n  MOUSE_EVENT_WHEEL_UP,\n  MOUSE_EVENT_WHEEL_DOWN\n};\n\nenum MouseButton {\n  MOUSE_BUTTON_NONE   = 0,\n  MOUSE_BUTTON_LEFT   = 1 << 0,\n  MOUSE_BUTTON_RIGHT  = 1 << 1,\n  MOUSE_BUTTON_MIDDLE = 1 << 2\n};\n\nstruct MouseEvent {\n  MouseEventType type;\n  MouseButton button;\n  int button_mask;\n  int x;\n  int y;\n};\n\n} // namespace sfm\n\n#endif // __ASP_SFMVIEW_GL_COMMON_H__\n"
  },
  {
    "path": "src/asp/SfmView/GlContext.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Derived from MVE (Simon Fuhrmann, TU Darmstadt, BSD 3-Clause).\n\n#include <asp/SfmView/GlContext.h>\n\n#include <algorithm>\n#include <iostream>\n\nnamespace sfm {\n\nvoid CamTrackball::set_camera(SfmCamera* camera) {\n  this->cam = camera;\n}\n\nEigen::Vector3f CamTrackball::get_campos(void) const {\n  return this->tb_center + this->tb_tocam * this->tb_radius;\n}\n\nEigen::Vector3f CamTrackball::get_viewdir(void) const {\n  return -this->tb_tocam;\n}\n\nEigen::Vector3f const& CamTrackball::get_upvec(void) const {\n  return this->tb_upvec;\n}\n\nCamTrackball::CamTrackball(void) {\n  this->cam = nullptr;\n  this->tb_radius = 1.0f;\n  this->tb_center = Eigen::Vector3f::Zero();\n  this->tb_tocam = Eigen::Vector3f(0.0f, 0.0f, 1.0f);\n  this->tb_upvec = Eigen::Vector3f(0.0f, 1.0f, 0.0f);\n}\n\nbool CamTrackball::consume_event(MouseEvent const& event) {\n  bool is_handled = false;\n\n  if (event.type == MOUSE_EVENT_PRESS) {\n    if (event.button == MOUSE_BUTTON_LEFT) {\n      this->rot_mouse_x = event.x;\n      this->rot_mouse_y = event.y;\n      this->rot_tb_tocam = this->tb_tocam;\n      this->rot_tb_upvec = this->tb_upvec;\n    } else if (event.button == MOUSE_BUTTON_MIDDLE) {\n      this->zoom_mouse_y = event.y;\n      this->zoom_tb_radius = this->tb_radius;\n    }\n    is_handled = true;\n  } else if (event.type == MOUSE_EVENT_MOVE) {\n    if (event.button_mask & MOUSE_BUTTON_LEFT) {\n      if (event.x == this->rot_mouse_x && event.y == this->rot_mouse_y) {\n        this->tb_tocam = this->rot_tb_tocam;\n        this->tb_upvec = this->rot_tb_upvec;\n      } else {\n        this->handle_tb_rotation(event.x, event.y);\n      }\n      is_handled = true;\n    }\n\n    if (event.button_mask & MOUSE_BUTTON_MIDDLE) {\n      int mouse_diff = this->zoom_mouse_y - event.y;\n      float zoom_speed = this->zoom_tb_radius / 100.0f;\n      float cam_diff = (float)mouse_diff * zoom_speed;\n      float new_radius = this->zoom_tb_radius + cam_diff;\n      this->tb_radius = sfm::clamp(new_radius, this->cam->z_near, this->cam->z_far);\n      is_handled = true;\n    }\n  } else if (event.type == MOUSE_EVENT_WHEEL_UP) {\n    this->tb_radius = this->tb_radius + this->tb_radius / 10.0f;\n    this->tb_radius = std::min(this->cam->z_far, this->tb_radius);\n    is_handled = true;\n  } else if (event.type == MOUSE_EVENT_WHEEL_DOWN) {\n    this->tb_radius = this->tb_radius - this->tb_radius / 10.0f;\n    this->tb_radius = std::max(this->cam->z_near, this->tb_radius);\n    is_handled = true;\n  }\n\n  return is_handled;\n}\n\nvoid CamTrackball::handle_tb_rotation(int x, int y) {\n  // Get ball normals.\n  Eigen::Vector3f bn_start = this->get_ball_normal(\n    this->rot_mouse_x, this->rot_mouse_y);\n  Eigen::Vector3f bn_now = this->get_ball_normal(x, y);\n\n  // Rotation axis and angle.\n  Eigen::Vector3f axis = bn_now.cross(bn_start);\n  float angle = std::acos(bn_now.dot(bn_start));\n\n  // Rotate axis to world coords. Build inverse viewing matrix from\n  // values stored at the time of mouse click.\n  Eigen::Matrix4f cam_to_world;\n  Eigen::Vector3f campos = this->tb_center + this->rot_tb_tocam * this->tb_radius;\n  Eigen::Vector3f viewdir = -this->rot_tb_tocam;\n  cam_to_world = sfm::matrix_inverse_viewtrans(\n    campos, viewdir, this->rot_tb_upvec);\n  axis = sfm::mult_homogeneous(cam_to_world, axis, 0.0f);\n  axis.normalize();\n\n  // Rotate camera and up vector around axis.\n  Eigen::Matrix3f rot = matrix_rotation_from_axis_angle(axis, angle);\n  this->tb_tocam = rot * this->rot_tb_tocam;\n  this->tb_upvec = rot * this->rot_tb_upvec;\n}\n\nEigen::Vector3f CamTrackball::get_ball_normal(int x, int y) {\n  // Calculate normal on unit sphere.\n  Eigen::Vector3f sn;\n  sn[0] = 2.0f * (float)x / (float)(this->cam->width - 1) - 1.0f;\n  sn[1] = 1.0f - 2.0f * (float)y / (float)(this->cam->height - 1);\n  float z2 = 1.0f - sn[0] * sn[0] - sn[1] * sn[1];\n  sn[2] = z2 > 0.0f ? std::sqrt(z2) : 0.0f;\n\n  return sn.normalized();\n}\n\n// GlContext\n\nvoid GlContext::init(void) {\n  this->controller.set_camera(&this->camera);\n  this->init_impl();\n}\n\nvoid GlContext::resize(int new_width, int new_height) {\n  std::swap(new_width, this->width);\n  std::swap(new_height, this->height);\n  this->resize_impl(new_width, new_height);\n}\n\nvoid GlContext::paint(void) {\n  this->paint_impl();\n}\n\nbool GlContext::mouse_event(MouseEvent const& event) {\n  bool is_handled = this->controller.consume_event(event);\n  this->update_camera();\n  return is_handled;\n}\n\nvoid GlContext::resize_impl(int /*old_width*/, int /*old_height*/) {\n  glFunctions()->glViewport(0, 0, this->width, this->height);\n  this->camera.width = this->width;\n  this->camera.height = this->height;\n\n  float aspect = (float)this->width / (float)this->height;\n  float minside = 0.05f;\n  if (this->width > this->height) {\n    this->camera.top = minside;\n    this->camera.right = minside * aspect;\n  } else {\n    this->camera.top = minside / aspect;\n    this->camera.right = minside;\n  }\n\n  this->camera.update_proj_mat();\n}\n\nvoid GlContext::update_camera(void) {\n  this->camera.pos = this->controller.get_campos();\n  this->camera.viewing_dir = this->controller.get_viewdir();\n  this->camera.up_vec = this->controller.get_upvec();\n  this->camera.update_view_mat();\n}\n\n}\n"
  },
  {
    "path": "src/asp/SfmView/GlContext.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Derived from MVE (Simon Fuhrmann, TU Darmstadt, BSD 3-Clause).\n\n#ifndef __ASP_SFMVIEW_GL_CONTEXT_H__\n#define __ASP_SFMVIEW_GL_CONTEXT_H__\n\n#include <asp/SfmView/SfmMath.h>\n#include <asp/SfmView/GlCommon.h>\n\nnamespace sfm {\n\n// Trackball camera control that consumes mouse events.\nclass CamTrackball {\npublic:\n  CamTrackball(void);\n\n  void set_camera(SfmCamera* camera);\n  bool consume_event(MouseEvent const& event);\n\n  Eigen::Vector3f get_campos(void) const;\n  Eigen::Vector3f get_viewdir(void) const;\n  Eigen::Vector3f const& get_upvec(void) const;\n\nprivate:\n  void handle_tb_rotation(int x, int y);\n  Eigen::Vector3f get_ball_normal(int x, int y);\n\n  SfmCamera* cam;\n\n  float tb_radius;\n  Eigen::Vector3f tb_center;\n  Eigen::Vector3f tb_tocam;\n  Eigen::Vector3f tb_upvec;\n\n  int rot_mouse_x;\n  int rot_mouse_y;\n  Eigen::Vector3f rot_tb_tocam;\n  Eigen::Vector3f rot_tb_upvec;\n\n  float zoom_tb_radius;\n  int zoom_mouse_y;\n};\n\n// Rendering context with trackball camera control.\n// Subclass and override init_impl, resize_impl, paint_impl.\nclass GlContext {\npublic:\n  virtual ~GlContext(void) {}\n\n  void init(void);\n  void resize(int new_width, int new_height);\n  void paint(void);\n  bool mouse_event(MouseEvent const& event);\n\nprotected:\n  virtual void init_impl(void) = 0;\n  virtual void resize_impl(int old_width, int old_height);\n  virtual void paint_impl(void) = 0;\n  void update_camera(void);\n\n  SfmCamera camera;\n  CamTrackball controller;\n  int width = 0;\n  int height = 0;\n};\n\n}\n\n#endif // __ASP_SFMVIEW_GL_CONTEXT_H__\n"
  },
  {
    "path": "src/asp/SfmView/GlWidget.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Derived from MVE (Simon Fuhrmann, TU Darmstadt, BSD 3-Clause).\n\n#include <asp/SfmView/GlCommon.h>\n#include <asp/SfmView/GlWidget.h>\n\n#include <QApplication>\n\n#include <ctime>\n#include <iostream>\n\nGlWidget::GlWidget(QWidget *parent):\n  QOpenGLWidget(parent),\n  context(nullptr),\n  gl_width(500),\n  gl_height(500),\n  cx_init(false) {\n  this->setFocusPolicy(Qt::StrongFocus);\n  this->makeCurrent();\n  this->device_pixel_ratio = static_cast<QGuiApplication*>(\n    QApplication::instance())->devicePixelRatio();\n\n  // This timer triggers a repaint after all events in the window system's\n  // event queue have been processed. Thus a snappy 3D view is provided.\n  this->repaint_timer = new QTimer(this);\n  this->repaint_timer->setSingleShot(true);\n  connect(this->repaint_timer, SIGNAL(timeout()), this, SLOT(repaint()));\n}\n\nGlWidget::~GlWidget(void) {\n}\n\nvoid GlWidget::initializeGL() {\n}\n\nvoid GlWidget::resizeGL(int width, int height) {\n  width *= this->device_pixel_ratio;\n  height *= this->device_pixel_ratio;\n\n  this->gl_width = width;\n  this->gl_height = height;\n  if (this->context != nullptr)\n    this->context->resize(width, height);\n}\n\nvoid GlWidget::paintGL() {\n  if (this->context == 0)\n    return;\n\n  // Current context may need initialization.\n  if (this->cx_init) {\n    if (this->init_set.find(this->context) == this->init_set.end()) {\n      this->context->init();\n      this->context->resize(this->gl_width, this->gl_height);\n      this->init_set.insert(this->context); // Mark initialized\n    }\n    this->cx_init = false;\n  }\n\n  // Paint it!\n  this->context->paint();\n}\n\nQSize GlWidget::minimumSizeHint() const {\n  return QSize(50, 50);\n}\n\nQSize GlWidget::sizeHint() const {\n  return QSize(400, 400);\n}\n\nvoid GlWidget::repaint_async(void) {\n  // Don't issue an immediate repaint but let the timer trigger\n  // a repaint after all events have been processed.\n  if (this->repaint_timer->isActive())\n    return;\n\n  this->repaint_timer->start();\n}\n\nvoid GlWidget::set_context(sfm::GlContext* context) {\n  this->context = context;\n  this->cx_init = true;\n}\n\nvoid GlWidget::mousePressEvent(QMouseEvent *event) {\n  this->makeCurrent();\n  sfm::MouseEvent e;\n  e.type = sfm::MOUSE_EVENT_PRESS;\n  e.button = (sfm::MouseButton)event->button();\n  e.button_mask = event->buttons();\n  e.x = event->localPos().x() * this->device_pixel_ratio;\n  e.y = event->localPos().y() * this->device_pixel_ratio;\n  this->context->mouse_event(e);\n  this->repaint_async();\n}\n\nvoid GlWidget::mouseReleaseEvent(QMouseEvent *event) {\n  this->makeCurrent();\n  sfm::MouseEvent e;\n  e.type = sfm::MOUSE_EVENT_RELEASE;\n  e.button = (sfm::MouseButton)event->button();\n  e.button_mask = event->buttons();\n  e.x = event->localPos().x() * this->device_pixel_ratio;\n  e.y = event->localPos().y() * this->device_pixel_ratio;\n  this->context->mouse_event(e);\n  this->repaint_async();\n}\n\nvoid GlWidget::mouseMoveEvent(QMouseEvent *event) {\n  this->makeCurrent();\n  sfm::MouseEvent e;\n  e.type = sfm::MOUSE_EVENT_MOVE;\n  e.button = (sfm::MouseButton)event->button();\n  e.button_mask = event->buttons();\n  e.x = event->localPos().x() * this->device_pixel_ratio;\n  e.y = event->localPos().y() * this->device_pixel_ratio;\n  this->context->mouse_event(e);\n  this->repaint_async();\n}\n\nvoid GlWidget::wheelEvent(QWheelEvent* event) {\n  this->makeCurrent();\n  sfm::MouseEvent e;\n  if (event->angleDelta().y() < 0)\n    e.type = sfm::MOUSE_EVENT_WHEEL_DOWN;\n  else\n    e.type = sfm::MOUSE_EVENT_WHEEL_UP;\n  e.button = sfm::MOUSE_BUTTON_NONE;\n  e.button_mask = event->buttons();\n  e.x = event->position().x() * this->device_pixel_ratio;\n  e.y = event->position().y() * this->device_pixel_ratio;\n  this->context->mouse_event(e);\n  this->repaint_async();\n}\n"
  },
  {
    "path": "src/asp/SfmView/GlWidget.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Derived from MVE (Simon Fuhrmann, TU Darmstadt, BSD 3-Clause).\n\n#ifndef __ASP_SFMVIEW_GL_WIDGET_H__\n#define __ASP_SFMVIEW_GL_WIDGET_H__\n\n#include <asp/SfmView/GlContext.h>\n\n#include <QtOpenGLWidgets/QOpenGLWidget>\n#include <QMouseEvent>\n#include <QTimer>\n\n#include <set>\n\nclass GlWidget: public QOpenGLWidget {\n  Q_OBJECT\n\npublic:\n  GlWidget(QWidget* parent = nullptr);\n  ~GlWidget();\n\n  void set_context(sfm::GlContext* context);\n\n  QSize minimumSizeHint() const;\n  QSize sizeHint() const;\n\npublic slots:\n  void repaint_async(void);\n\nprotected:\n  void initializeGL(void);\n  void paintGL(void);\n  void resizeGL(int width, int height);\n\n  void mousePressEvent(QMouseEvent *event);\n  void mouseReleaseEvent(QMouseEvent *event);\n  void mouseMoveEvent(QMouseEvent *event);\n  void wheelEvent(QWheelEvent* event);\n\nprivate:\n  sfm::GlContext* context;\n  int gl_width;\n  int gl_height;\n  qreal device_pixel_ratio;\n  bool cx_init;\n  std::set<sfm::GlContext*> init_set;\n  QTimer* repaint_timer;\n};\n\n#endif // __ASP_SFMVIEW_GL_WIDGET_H__\n"
  },
  {
    "path": "src/asp/SfmView/MeshRenderer.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Derived from MVE (Simon Fuhrmann, TU Darmstadt, BSD 3-Clause).\n\n#include <asp/SfmView/MeshRenderer.h>\n\n#include <stdexcept>\n\nnamespace sfm {\n\n// VertexBuffer\n\nVertexBuffer::Ptr VertexBuffer::create() {\n  Ptr vb(new VertexBuffer);\n  vb->buf.create();\n  return vb;\n}\n\nvoid VertexBuffer::set_data(GLfloat const* data, GLsizei elems, GLint vpv) {\n  this->datatype = GL_FLOAT;\n  this->vpv = vpv;\n  this->elems = elems;\n\n  this->buf.setUsagePattern(QOpenGLBuffer::StaticDraw);\n  this->buf.bind();\n  this->buf.allocate(data, elems * vpv * sizeof(GLfloat));\n}\n\nvoid VertexBuffer::set_indices(GLuint const* data, GLsizei num_indices) {\n  this->buf = QOpenGLBuffer(QOpenGLBuffer::IndexBuffer);\n  this->buf.create();\n  this->datatype = GL_UNSIGNED_INT;\n  this->vpv = 3;\n  this->elems = num_indices;\n\n  this->buf.setUsagePattern(QOpenGLBuffer::StaticDraw);\n  this->buf.bind();\n  this->buf.allocate(data, num_indices * sizeof(GLuint));\n}\n\n// VertexArray\n\nVertexArray::VertexArray(void) {\n  this->vao.create();\n  this->primitive = GL_TRIANGLES;\n}\n\nVertexArray::~VertexArray(void) {\n  this->vao.destroy();\n}\n\nvoid VertexArray::set_primitive(GLuint primitive) {\n  this->primitive = primitive;\n}\n\nvoid VertexArray::set_vertex_vbo(VertexBuffer::Ptr vbo) {\n  this->vert_vbo = vbo;\n}\n\nvoid VertexArray::set_index_vbo(VertexBuffer::Ptr vbo) {\n  this->index_vbo = vbo;\n}\n\nvoid VertexArray::add_vbo(VertexBuffer::Ptr vbo,\n                          std::string const& name) {\n  this->vbo_list.push_back(std::make_pair(vbo, name));\n}\n\nvoid VertexArray::set_shader(QOpenGLShaderProgram* shader) {\n  this->shader = shader;\n}\n\nvoid VertexArray::reset_vertex_array(void) {\n  this->vert_vbo.reset();\n  this->index_vbo.reset();\n  this->vbo_list.clear();\n  this->vao.destroy();\n  this->vao.create();\n}\n\nvoid VertexArray::assign_attrib(BoundVBO const& bound_vbo) {\n  VertexBuffer::Ptr vbo = bound_vbo.first;\n  std::string const& name = bound_vbo.second;\n\n  GLint location = this->shader->attributeLocation(name.c_str());\n  if (location < 0)\n    return;\n\n  vbo->buf.bind();\n  glFunctions()->glVertexAttribPointer(location, vbo->vpv,\n    vbo->datatype, GL_TRUE, 0, nullptr);\n  glFunctions()->glEnableVertexAttribArray(location);\n}\n\nvoid VertexArray::draw(void) {\n  if (this->vert_vbo == nullptr)\n    throw std::runtime_error(\"No vertex VBO set!\");\n\n  if (this->shader == nullptr)\n    throw std::runtime_error(\"No shader program set!\");\n\n  auto f = glFunctions();\n  this->vao.bind();\n\n  this->shader->bind();\n\n  this->assign_attrib(BoundVBO(this->vert_vbo, SFM_ATTRIB_POSITION));\n\n  for (std::size_t i = 0; i < this->vbo_list.size(); ++i)\n    this->assign_attrib(this->vbo_list[i]);\n\n  if (this->index_vbo != nullptr) {\n    this->index_vbo->buf.bind();\n    f->glDrawElements(this->primitive, this->index_vbo->elems,\n      GL_UNSIGNED_INT, nullptr);\n  } else {\n    f->glDrawArrays(this->primitive, 0, this->vert_vbo->elems);\n  }\n\n  this->shader->release();\n  this->vao.release();\n}\n\n// MeshRenderer\n\nvoid MeshRenderer::set_mesh(sfm::TriangleMesh::ConstPtr mesh) {\n  if (mesh == nullptr)\n    throw std::invalid_argument(\"Got null mesh\");\n\n  this->reset_vertex_array();\n\n  sfm::TriangleMesh::VertexList const& verts(mesh->get_vertices());\n  sfm::TriangleMesh::FaceList const& faces(mesh->get_faces());\n  sfm::TriangleMesh::NormalList const& vnormals(mesh->get_vertex_normals());\n  sfm::TriangleMesh::ColorList const& vcolors(mesh->get_vertex_colors());\n  sfm::TriangleMesh::TexCoordList const& vtexuv(mesh->get_vertex_texcoords());\n\n  {\n    VertexBuffer::Ptr vbo = VertexBuffer::create();\n    vbo->set_data(&verts[0][0], (GLsizei)verts.size(), 3);\n    this->set_vertex_vbo(vbo);\n  }\n\n  if (!faces.empty()) {\n    VertexBuffer::Ptr vbo = VertexBuffer::create();\n    vbo->set_indices(&faces[0], (GLsizei)faces.size());\n    this->set_index_vbo(vbo);\n  }\n\n  if (!vnormals.empty()) {\n    VertexBuffer::Ptr vbo = VertexBuffer::create();\n    vbo->set_data(&vnormals[0][0], (GLsizei)vnormals.size(), 3);\n    this->add_vbo(vbo, SFM_ATTRIB_NORMAL);\n  }\n\n  if (!vcolors.empty()) {\n    VertexBuffer::Ptr vbo = VertexBuffer::create();\n    vbo->set_data(&vcolors[0][0], (GLsizei)vcolors.size(), 4);\n    this->add_vbo(vbo, SFM_ATTRIB_COLOR);\n  }\n\n  if (!vtexuv.empty()) {\n    VertexBuffer::Ptr vbo = VertexBuffer::create();\n    vbo->set_data(&vtexuv[0][0], (GLsizei)vtexuv.size(), 2);\n    this->add_vbo(vbo, SFM_ATTRIB_TEXCOORD);\n  }\n}\n\nMeshRenderer::Ptr MeshRenderer::create(sfm::TriangleMesh::ConstPtr mesh) {\n  return Ptr(new MeshRenderer(mesh));\n}\n\nMeshRenderer::MeshRenderer(sfm::TriangleMesh::ConstPtr mesh) {\n  this->set_mesh(mesh);\n}\n\n}\n"
  },
  {
    "path": "src/asp/SfmView/MeshRenderer.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Derived from MVE (Simon Fuhrmann, TU Darmstadt, BSD 3-Clause).\n\n#ifndef __ASP_SFMVIEW_MESH_RENDERER_H__\n#define __ASP_SFMVIEW_MESH_RENDERER_H__\n\n#include <asp/SfmView/SfmMath.h>\n#include <asp/SfmView/GlCommon.h>\n\n#include <QOpenGLBuffer>\n#include <QOpenGLShaderProgram>\n#include <QOpenGLVertexArrayObject>\n\n#include <memory>\n#include <string>\n#include <utility>\n#include <vector>\n\n#define SFM_ATTRIB_POSITION \"pos\"\n#define SFM_ATTRIB_NORMAL \"normal\"\n#define SFM_ATTRIB_COLOR \"color\"\n#define SFM_ATTRIB_TEXCOORD \"texuv\"\n\nnamespace sfm {\n\n// VBO wrapper: QOpenGLBuffer plus metadata for vertex attributes.\nstruct VertexBuffer {\n  typedef std::shared_ptr<VertexBuffer> Ptr;\n\n  QOpenGLBuffer buf;\n  GLenum datatype = GL_FLOAT;\n  GLint vpv = 0;       // values per vertex\n  GLsizei elems = 0;   // number of elements\n\n  static Ptr create();\n  void set_data(GLfloat const* data, GLsizei elems, GLint vpv);\n  void set_indices(GLuint const* data, GLsizei num_indices);\n};\n\n// OpenGL vertex array object (VAO) abstraction.\nclass VertexArray {\npublic:\n  typedef std::shared_ptr<VertexArray> Ptr;\n\n  typedef std::pair<VertexBuffer::Ptr, std::string> BoundVBO;\n  typedef std::vector<BoundVBO> VBOList;\n\n  virtual ~VertexArray(void);\n\n  void set_primitive(GLuint primitive);\n  void set_shader(QOpenGLShaderProgram* shader);\n  void set_vertex_vbo(VertexBuffer::Ptr vbo);\n  void set_index_vbo(VertexBuffer::Ptr vbo);\n  void add_vbo(VertexBuffer::Ptr vbo, std::string const& name);\n  void reset_vertex_array(void);\n  void draw(void);\n\nprotected:\n  VertexArray(void);\n  void assign_attrib(BoundVBO const& bound_vbo);\n\nprivate:\n  QOpenGLVertexArrayObject vao;\n  GLuint primitive;\n  QOpenGLShaderProgram* shader;\n\n  VertexBuffer::Ptr vert_vbo;\n  VertexBuffer::Ptr index_vbo;\n  VBOList vbo_list;\n};\n\n// Takes a TriangleMesh and creates VBOs for rendering.\nclass MeshRenderer: public VertexArray {\npublic:\n  typedef std::shared_ptr<MeshRenderer> Ptr;\n\n  static Ptr create(sfm::TriangleMesh::ConstPtr mesh);\n  void set_mesh(sfm::TriangleMesh::ConstPtr mesh);\n\nprivate:\n  MeshRenderer(sfm::TriangleMesh::ConstPtr mesh);\n};\n\n}\n\n#endif // __ASP_SFMVIEW_MESH_RENDERER_H__\n"
  },
  {
    "path": "src/asp/SfmView/SceneManager.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Derived from MVE (Simon Fuhrmann, TU Darmstadt, BSD 3-Clause).\n\n#include <asp/SfmView/SceneManager.h>\n\nSceneManager::SceneManager(void) {\n}\n\nSceneManager::~SceneManager(void) {\n}\n\nSceneManager& SceneManager::get(void) {\n  static SceneManager instance;\n  return instance;\n}\n\nvoid SceneManager::select_scene(sfm::Scene::Ptr scene) {\n  this->scene = scene;\n  emit this->scene_selected(scene);\n}\n\nvoid SceneManager::select_view(sfm::View::Ptr view) {\n  this->view = view;\n  emit this->view_selected(view);\n}\n\nsfm::Scene::Ptr SceneManager::get_scene(void) {\n  return this->scene;\n}\n\nvoid SceneManager::reset_scene(void) {\n  this->select_scene(sfm::Scene::Ptr());\n}\n\nvoid SceneManager::reset_view(void) {\n  this->select_view(sfm::View::Ptr());\n}\n"
  },
  {
    "path": "src/asp/SfmView/SceneManager.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Derived from MVE (Simon Fuhrmann, TU Darmstadt, BSD 3-Clause).\n\n#ifndef __ASP_SFMVIEW_SCENE_MANAGER_H__\n#define __ASP_SFMVIEW_SCENE_MANAGER_H__\n\n#include <asp/SfmView/SfmUtils.h>\n\n#include <QObject>\n\n// Singleton signal hub for scene and view selection.\n// SfmMainWindow selects the scene, SceneOverview selects views.\nclass SceneManager: public QObject {\n  Q_OBJECT\n\nprivate:\n  sfm::Scene::Ptr scene;\n  sfm::View::Ptr view;\n\nsignals:\n  void scene_selected(sfm::Scene::Ptr scene);\n  void view_selected(sfm::View::Ptr view);\n\npublic:\n  SceneManager(void);\n  ~SceneManager(void);\n  static SceneManager& get(void);\n\n  void select_scene(sfm::Scene::Ptr scene);\n  void select_view(sfm::View::Ptr view);\n  sfm::Scene::Ptr get_scene(void);\n  void reset_scene(void);\n  void reset_view(void);\n};\n\n#endif // __ASP_SFMVIEW_SCENE_MANAGER_H__\n"
  },
  {
    "path": "src/asp/SfmView/SceneOverview.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Derived from MVE (Simon Fuhrmann, TU Darmstadt, BSD 3-Clause).\n\n#include <asp/SfmView/SceneManager.h>\n#include <asp/SfmView/SceneOverview.h>\n\n#include <QVBoxLayout>\n\nQSize SceneOverview::sizeHint(void) const {\n  return QSize(175, 0);\n}\n\nSceneOverview::SceneOverview(QWidget* parent): QWidget(parent) {\n  this->viewlist = new QListWidget();\n  this->viewlist->setEnabled(false);\n\n  QVBoxLayout* vbox = new QVBoxLayout(this);\n  vbox->setSpacing(0);\n  vbox->setContentsMargins(0, 0, 0, 0);\n  vbox->addWidget(this->viewlist);\n\n  this->connect(this->viewlist, SIGNAL(currentRowChanged(int)),\n    this, SLOT(on_row_changed(int)));\n  this->connect(&SceneManager::get(), SIGNAL(scene_selected(sfm::Scene::Ptr)),\n    this, SLOT(on_scene_changed(sfm::Scene::Ptr)));\n}\n\nvoid SceneOverview::on_scene_changed(sfm::Scene::Ptr scene) {\n  this->viewlist->clear();\n  this->viewlist->setEnabled(false);\n\n  if (scene == nullptr)\n    return;\n\n  sfm::Scene::ViewList& sl(scene->get_views());\n  if (sl.empty()) {\n    QListWidgetItem* item = new QListWidgetItem(\"Scene has no views!\");\n    item->setData(Qt::UserRole, -1);\n    this->viewlist->addItem(item);\n  } else {\n    this->viewlist->setEnabled(true);\n  }\n\n  for (std::size_t i = 0; i < sl.size(); ++i) {\n    sfm::View::Ptr view(sl[i]);\n    if (view == nullptr)\n      continue;\n    this->add_view_to_layout(i, view);\n  }\n}\n\nvoid SceneOverview::add_view_to_layout(std::size_t id, sfm::View::Ptr view) {\n  if (view == nullptr)\n    return;\n\n  std::string const& view_name = view->get_name();\n  bool cam_valid = view->get_camera().flen != 0.0f;\n\n  QString name = QString(view_name.c_str());\n\n  QListWidgetItem* item = new QListWidgetItem(name);\n  if (!cam_valid)\n    item->setBackground(QColor(255, 221, 221));\n  item->setData(Qt::UserRole, (int)id);\n  this->viewlist->addItem(item);\n}\n\nvoid SceneOverview::on_row_changed(int id) {\n  if (id < 0)\n    return;\n\n  QListWidgetItem* item = this->viewlist->item(id);\n  std::size_t view_id = (std::size_t)item->data(Qt::UserRole).toInt();\n\n  sfm::Scene::Ptr scene(SceneManager::get().get_scene());\n  sfm::View::Ptr view(scene->get_view_by_id(view_id));\n  SceneManager::get().select_view(view);\n}\n"
  },
  {
    "path": "src/asp/SfmView/SceneOverview.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Derived from MVE (Simon Fuhrmann, TU Darmstadt, BSD 3-Clause).\n\n#ifndef __ASP_SFMVIEW_SCENE_OVERVIEW_H__\n#define __ASP_SFMVIEW_SCENE_OVERVIEW_H__\n\n#include <asp/SfmView/SfmUtils.h>\n\n#include <QListWidget>\n\nclass SceneOverview: public QWidget {\n  Q_OBJECT\n\nprotected slots:\n  void on_scene_changed(sfm::Scene::Ptr scene);\n  void on_row_changed(int id);\n\nprivate:\n  void add_view_to_layout(std::size_t id, sfm::View::Ptr view);\n  QListWidget* viewlist;\n\npublic:\n  SceneOverview(QWidget* parent);\n  QSize sizeHint(void) const;\n};\n\n#endif // __ASP_SFMVIEW_SCENE_OVERVIEW_H__\n"
  },
  {
    "path": "src/asp/SfmView/SceneRenderer.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Derived from MVE (Simon Fuhrmann, TU Darmstadt, BSD 3-Clause).\n\n#include <asp/SfmView/SceneManager.h>\n#include <asp/SfmView/SceneRenderer.h>\n\n#include <QOpenGLShaderProgram>\n\n#include <iostream>\n#include <limits>\n\n// GLSL shaders. Colors are baked into mesh vertices: green for the ground grid,\n// white for camera frusta, yellow for view direction, RGB for camera coordinate\n// axes.\n\nstatic char const* const WIREFRAME_VERT =\n    \"#version 330 core\\n\"\n    \"in vec4 pos;\\n\"\n    \"in vec4 color;\\n\"\n    \"out vec4 ocolor;\\n\"\n    \"uniform mat4 viewmat;\\n\"\n    \"uniform mat4 projmat;\\n\"\n    \"void main(void) {\\n\"\n    \"    ocolor = color;\\n\"\n    \"    gl_Position = projmat * (viewmat * pos);\\n\"\n    \"}\\n\";\n\nstatic char const* const WIREFRAME_FRAG =\n    \"#version 330 core\\n\"\n    \"in vec4 ocolor;\\n\"\n    \"layout(location=0) out vec4 frag_color;\\n\"\n    \"void main(void) {\\n\"\n    \"    gl_FragDepth = gl_FragCoord.z;\\n\"\n    \"    frag_color = ocolor;\\n\"\n    \"}\\n\";\n\nvoid SceneRenderer::load_shaders(void) {\n  if (!this->wireframe_shader) {\n    this->wireframe_shader = new QOpenGLShaderProgram();\n    this->wireframe_shader->addShaderFromSourceCode(\n      QOpenGLShader::Vertex, WIREFRAME_VERT);\n    this->wireframe_shader->addShaderFromSourceCode(\n      QOpenGLShader::Fragment, WIREFRAME_FRAG);\n    this->wireframe_shader->link();\n  }\n}\n\nvoid SceneRenderer::send_uniform(sfm::SfmCamera const& cam) {\n  this->wireframe_shader->bind();\n  // Eigen column-major matches GL column-major, so transpose=false\n  GLint loc_view = this->wireframe_shader->uniformLocation(\"viewmat\");\n  if (loc_view >= 0)\n    glFunctions()->glUniformMatrix4fv(loc_view, 1, GL_FALSE, cam.view.data());\n  GLint loc_proj = this->wireframe_shader->uniformLocation(\"projmat\");\n  if (loc_proj >= 0)\n    glFunctions()->glUniformMatrix4fv(loc_proj, 1, GL_FALSE, cam.proj.data());\n}\n\nSceneRenderer::SceneRenderer(GlWidget* gl_widget) {\n  this->gl_widget = gl_widget;\n\n  this->action_frusta = new QAction(\"Draw camera frusta\");\n  this->action_frusta->setCheckable(true);\n  this->action_frusta->setChecked(true);\n\n  this->action_viewdir = new QAction(\"Draw viewing direction\");\n  this->action_viewdir->setCheckable(true);\n  this->action_viewdir->setChecked(true);\n\n  this->action_ground = new QAction(\"Draw ground plane\");\n  this->action_ground->setCheckable(true);\n  this->action_ground->setChecked(true);\n\n  this->frusta_size_slider = new QSlider();\n  this->frusta_size_slider->setMinimum(1);\n  this->frusta_size_slider->setMaximum(100);\n  this->frusta_size_slider->setValue(10);\n  this->frusta_size_slider->setOrientation(Qt::Horizontal);\n\n  this->connect(&SceneManager::get(), SIGNAL(scene_selected(sfm::Scene::Ptr)),\n    this, SLOT(on_scene_changed()));\n  this->connect(&SceneManager::get(), SIGNAL(view_selected(sfm::View::Ptr)),\n    this, SLOT(reset_viewdir_renderer()));\n  this->connect(this->frusta_size_slider, SIGNAL(valueChanged(int)),\n    this, SLOT(reset_frusta_renderer()));\n  this->connect(this->frusta_size_slider, SIGNAL(valueChanged(int)),\n    this->gl_widget, SLOT(repaint()));\n  this->connect(this->action_frusta, SIGNAL(toggled(bool)),\n    this->gl_widget, SLOT(repaint()));\n  this->connect(this->action_viewdir, SIGNAL(toggled(bool)),\n    this->gl_widget, SLOT(repaint()));\n  this->connect(this->action_ground, SIGNAL(toggled(bool)),\n    this->gl_widget, SLOT(repaint()));\n}\n\nQAction* SceneRenderer::get_action_frusta(void) {\n  return this->action_frusta;\n}\n\nQAction* SceneRenderer::get_action_viewdir(void) {\n  return this->action_viewdir;\n}\n\nQAction* SceneRenderer::get_action_ground(void) {\n  return this->action_ground;\n}\n\nQSlider* SceneRenderer::get_frusta_size_slider(void) {\n  return this->frusta_size_slider;\n}\n\nvoid SceneRenderer::set_scene(sfm::Scene::Ptr scene) {\n  this->scene = scene;\n  this->gl_widget->repaint();\n}\n\nvoid SceneRenderer::set_view(sfm::View::Ptr view) {\n  this->view = view;\n  this->gl_widget->repaint();\n}\n\nvoid SceneRenderer::reset_scene(void) {\n  this->scene = nullptr;\n  this->view = nullptr;\n  this->gl_widget->repaint();\n}\n\nvoid SceneRenderer::on_scene_changed(void) {\n  this->orig_cam_centers.clear();\n  this->orig_cam2world_vec.clear();\n  this->frusta_renderer.reset();\n  this->ground_renderer.reset();\n}\n\nvoid SceneRenderer::reset_frusta_renderer(void) {\n  this->frusta_renderer.reset();\n  this->ground_renderer.reset();\n}\n\nvoid SceneRenderer::reset_ground_renderer(void) {\n  this->ground_renderer.reset();\n}\n\nvoid SceneRenderer::reset_viewdir_renderer(void) {\n  this->viewdir_renderer.reset();\n}\n\nvoid SceneRenderer::init_impl(void) {\n  this->load_shaders();\n}\n\nvoid SceneRenderer::resize_impl(int old_width, int old_height) {\n  this->sfm::GlContext::resize_impl(old_width, old_height);\n}\n\nvoid SceneRenderer::paint_impl(void) {\n  this->update_camera();\n  glFunctions()->glClearColor(0.0f, 0.0f, 0.0f, 1.0f);\n\n  glFunctions()->glDepthFunc(GL_LESS);\n  glFunctions()->glEnable(GL_DEPTH_TEST);\n  glFunctions()->glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);\n  glFunctions()->glClearDepthf(1.0f);\n  glFunctions()->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n\n  this->send_uniform(this->camera);\n\n  if (this->action_frusta->isChecked()) {\n    if (this->frusta_renderer == nullptr)\n      this->create_frusta_renderer();\n    if (this->frusta_renderer != nullptr)\n      this->frusta_renderer->draw();\n  }\n\n  if (this->action_ground->isChecked()) {\n    if (this->ground_renderer == nullptr)\n      this->create_ground_renderer();\n    if (this->ground_renderer != nullptr)\n      this->ground_renderer->draw();\n  }\n\n  if (this->action_viewdir->isChecked()) {\n    if (this->viewdir_renderer == nullptr)\n      this->create_viewdir_renderer();\n    if (this->viewdir_renderer != nullptr)\n      this->viewdir_renderer->draw();\n  }\n}\n\n// Add a camera frustum wireframe to a mesh.\nvoid add_camera_to_mesh(sfm::SfmCameraInfo const& camera,\n  float size, sfm::TriangleMesh::Ptr mesh) {\n  Eigen::Vector4f const frustum_start_color(1.0f, 1.0f, 1.0f, 1.0f);\n  Eigen::Vector4f const frustum_end_color(1.0f, 1.0f, 1.0f, 1.0f);\n\n  sfm::TriangleMesh::VertexList& verts = mesh->get_vertices();\n  sfm::TriangleMesh::ColorList& colors = mesh->get_vertex_colors();\n  sfm::TriangleMesh::FaceList& faces = mesh->get_faces();\n\n  Eigen::Matrix4f ctw = camera.fill_cam_to_world();\n  Eigen::Vector3f cam_x = sfm::mult_homogeneous(ctw, Eigen::Vector3f(1.0f, 0.0f, 0.0f), 0.0f);\n  Eigen::Vector3f cam_y = sfm::mult_homogeneous(ctw, Eigen::Vector3f(0.0f, 1.0f, 0.0f), 0.0f);\n  Eigen::Vector3f cam_z = sfm::mult_homogeneous(ctw, Eigen::Vector3f(0.0f, 0.0f, 1.0f), 0.0f);\n  Eigen::Vector3f campos = sfm::mult_homogeneous(ctw,\n    Eigen::Vector3f(0.0f, 0.0f, 0.0f), 1.0f);\n\n  std::size_t idx = verts.size();\n  verts.push_back(campos);\n  colors.push_back(frustum_start_color);\n  for (int j = 0; j < 4; ++j) {\n    Eigen::Vector3f corner = campos + size * cam_z\n      + cam_x * size / (2.0f * camera.flen) * (j & 1 ? -1.0f : 1.0f)\n      + cam_y * size / (2.0f * camera.flen) * (j & 2 ? -1.0f : 1.0f);\n    verts.push_back(corner);\n    colors.push_back(frustum_end_color);\n    faces.push_back(idx + 0); faces.push_back(idx + 1 + j);\n  }\n  faces.push_back(idx + 1); faces.push_back(idx + 2);\n  faces.push_back(idx + 2); faces.push_back(idx + 4);\n  faces.push_back(idx + 4); faces.push_back(idx + 3);\n  faces.push_back(idx + 3); faces.push_back(idx + 1);\n\n  verts.push_back(campos);\n  verts.push_back(campos + (size * 0.5f) * cam_x);\n  verts.push_back(campos);\n  verts.push_back(campos + (size * 0.5f) * cam_y);\n  verts.push_back(campos);\n  verts.push_back(campos + (size * 0.5f) * cam_z);\n  colors.push_back(Eigen::Vector4f(1.0f, 0.0f, 0.0f, 1.0f));\n  colors.push_back(Eigen::Vector4f(1.0f, 0.0f, 0.0f, 1.0f));\n  colors.push_back(Eigen::Vector4f(0.0f, 1.0f, 0.0f, 1.0f));\n  colors.push_back(Eigen::Vector4f(0.0f, 1.0f, 0.0f, 1.0f));\n  colors.push_back(Eigen::Vector4f(0.0f, 0.0f, 1.0f, 1.0f));\n  colors.push_back(Eigen::Vector4f(0.0f, 0.0f, 1.0f, 1.0f));\n  faces.push_back(idx + 5); faces.push_back(idx + 6);\n  faces.push_back(idx + 7); faces.push_back(idx + 8);\n  faces.push_back(idx + 9); faces.push_back(idx + 10);\n}\n\n// Find shortest distance from camera center to the origin\ndouble find_shortest_distance(std::vector<Eigen::Vector3d> centers) {\n  if (centers.size() == 0)\n    return 1.0;\n\n  double shortest = centers[0].norm();\n  for (std::size_t i = 1; i < centers.size(); i++) {\n    double dist = centers[i].norm();\n    if (dist < shortest)\n      shortest = dist;\n  }\n  return shortest;\n}\n\n// Function to find the mean camera position\nEigen::Vector3d find_mean_camera_pos(std::vector<Eigen::Vector3d> const& centers) {\n  if (centers.size() == 0)\n    return Eigen::Vector3d::Zero();\n\n  Eigen::Vector3d mean = Eigen::Vector3d::Zero();\n  for (std::size_t i = 0; i < centers.size(); i++)\n    mean += centers[i];\n  mean /= (double)centers.size();\n  return mean;\n}\n\n// Collect the cam2world matrices and camera centers in vectors.\nvoid extractSfmCameraPoses(sfm::Scene::ViewList const& views,\n  // Outputs\n  std::vector<Eigen::Vector3d>& cam_centers,\n  std::vector<Eigen::Matrix3d>& cam2world_vec) {\n\n  cam_centers.clear();\n  cam2world_vec.clear();\n\n  for (std::size_t i = 0; i < views.size(); i++) {\n\n    if (views[i].get() == nullptr) {\n      std::cerr << \"Error: Empty camera.\\n\";\n      continue;\n    }\n\n    sfm::SfmCameraInfo const& cam = views[i]->get_camera(); // alias\n\n    // The cameras store trans = -inverse(camera2world) * camera_center\n    // and rot = inverse(camera2world).\n    // We need to invert the camera2world matrix to get the camera center.\n    // So, need to find:\n    // and camera2world = transpose(rot)\n    // camera_center = -camera2world * trans\n\n    // cam.rot is row-major double[9], map it as row-major then convert\n    Eigen::Map<const Eigen::Matrix<double, 3, 3, Eigen::RowMajor>>\n      world2cam_rm(cam.rot);\n    Eigen::Matrix3d world2cam = world2cam_rm; // copy to column-major\n    Eigen::Vector3d t = Eigen::Map<const Eigen::Vector3d>(cam.trans);\n    Eigen::Matrix3d cam2world = world2cam.transpose();\n    Eigen::Vector3d ctr = -(cam2world * t);\n\n    cam_centers.push_back(ctr);\n    cam2world_vec.push_back(cam2world);\n  }\n\n  return;\n}\n\n// Apply the camera2world transforms and camera centers to the cameras\nvoid applySfmCameraPoses(std::vector<Eigen::Vector3d> const& cam_centers,\n                      std::vector<Eigen::Matrix3d> const& cam2world_vec,\n                      sfm::Scene::ViewList& views) {\n\n  for (std::size_t i = 0; i < views.size(); i++) {\n    if (views[i].get() == nullptr) {\n      std::cerr << \"Error: Empty camera.\\n\";\n      continue;\n    }\n\n    sfm::SfmCameraInfo cam = views[i]->get_camera();\n\n    // Compute T = -cam2world^T * C and copy to the camera\n    Eigen::Vector3d t = -(cam2world_vec[i].transpose() * cam_centers[i]);\n    for (int coord = 0; coord < 3; coord++)\n      cam.trans[coord] = t[coord];\n\n    // Compute R = cam2world^T and copy to cam.rot (row-major double[9])\n    Eigen::Matrix3d R = cam2world_vec[i].transpose();\n    for (int row = 0; row < 3; row++)\n      for (int col = 0; col < 3; col++)\n        cam.rot[row * 3 + col] = R(row, col);\n\n    views[i]->set_camera(cam);\n    views[i]->set_dirty(false);\n  }\n  return;\n}\n\n// Given a vector, find a rotation matrix that rotates the vector to the y-axis.\nvoid completeVectorToRotation(Eigen::Vector3d& y, Eigen::Matrix3d& R) {\n\n  int largest_comp = 0;\n  for (int i = 1; i < 3; i++) {\n    if (std::abs(y[i]) > std::abs(y[largest_comp]))\n      largest_comp = i;\n  }\n\n  int j = largest_comp + 1;\n  if (j == 3)\n    j = 0;\n\n  Eigen::Vector3d x = Eigen::Vector3d::Zero();\n  x[j] = y[largest_comp];\n  x[largest_comp] = -y[j];\n\n  if (std::abs(y[largest_comp]) == 0.0) {\n    // Handle degenerate case, will return the identity matrix\n    x = Eigen::Vector3d(1.0, 0.0, 0.0);\n    y = Eigen::Vector3d(0.0, 1.0, 0.0);\n  }\n\n  x.normalize();\n  y.normalize();\n\n  // Find z as the cross product of x and y\n  Eigen::Vector3d z = x.cross(y);\n  z.normalize();\n\n  // Find the matrix with x, y, z as columns\n  for (int row = 0; row < 3; row++) {\n    R(row, 0) = x[row];\n    R(row, 1) = y[row];\n    R(row, 2) = z[row];\n  }\n\n  return;\n}\n\n// Find the bounding box of the camera centers\nvoid bdBox(Eigen::Matrix3d const& EcefToGL,\n           std::vector<Eigen::Vector3d>& cam_centers,\n           // Outputs\n           double& x_min, double& x_max,\n           double& y_min, double& y_max,\n           double& z_min, double& z_max) {\n\n  double big = std::numeric_limits<double>::max();\n  x_min = big; y_min = big; z_min = big;\n  x_max = -big; y_max = -big; z_max = -big;\n\n  for (std::size_t i = 0; i < cam_centers.size(); i++) {\n    Eigen::Vector3d trans_center = EcefToGL * cam_centers[i];\n    x_min = std::min(x_min, trans_center[0]);\n    x_max = std::max(x_max, trans_center[0]);\n    y_min = std::min(y_min, trans_center[1]);\n    y_max = std::max(y_max, trans_center[1]);\n    z_min = std::min(z_min, trans_center[2]);\n    z_max = std::max(z_max, trans_center[2]);\n  }\n}\n\n// Compute a ground plane, scale the orbital camera positions relative\n// to the plane, then plot the cameras and the ground plane.\nvoid SceneRenderer::create_frusta_renderer(void) {\n\n  if (this->scene == nullptr)\n    return;\n\n  sfm::Scene::ViewList& views(this->scene->get_views());\n\n  // Cache the original poses on first call. Cleared by on_scene_changed().\n  if (this->orig_cam_centers.empty())\n    extractSfmCameraPoses(views, this->orig_cam_centers,\n                       this->orig_cam2world_vec);\n  if (this->orig_cam_centers.empty()) {\n    std::cerr << \"Error: No cameras found.\\n\";\n    return;\n  }\n\n  // Work on copies so the originals are never modified.\n  // All position arithmetic is done in double. Camera centers start\n  // at orbital radii (millions of meters), which would lose precision\n  // in the float GL pipeline. We normalize by dividing by the orbital\n  // radius, rotate into the GL frame, then center and scale the\n  // bounding box to ~[-1, 1]. Float is used only at render time,\n  // when values are already O(1).\n  std::vector<Eigen::Vector3d> cam_centers = this->orig_cam_centers;\n  std::vector<Eigen::Matrix3d> cam2world_vec = this->orig_cam2world_vec;\n\n  // Divide by orbital radius to bring positions from millions to ~1.0\n  double shortest_dist = find_shortest_distance(cam_centers);\n  shortest_dist = std::max(shortest_dist, 0.0001); // avoid division by zero\n  for (size_t cam = 0; cam < cam_centers.size(); cam++)\n    cam_centers[cam] = cam_centers[cam] / shortest_dist;\n\n  // Use the mean camera direction (from planet center) as the ground\n  // plane normal. Build a rotation that maps this to the GL y-axis,\n  // so the ground plane becomes the x-z plane (GL convention: y up).\n  Eigen::Vector3d mean_cam_center = find_mean_camera_pos(cam_centers);\n  Eigen::Vector3d y = mean_cam_center; // will change below\n  Eigen::Matrix3d GLToEcef;\n  completeVectorToRotation(y, GLToEcef);\n  Eigen::Matrix3d EcefToGL = GLToEcef.transpose();\n\n  // Bounding box in the GL frame\n  double x_min = 0, x_max = 0, y_min = 0, y_max = 0, z_min = 0, z_max = 0;\n  bdBox(EcefToGL, cam_centers, x_min, x_max, y_min, y_max, z_min, z_max);\n\n  double len = std::max(x_max - x_min,\n                        std::max(y_max - y_min, z_max - z_min));\n  if (len == 0.0)\n    len = 1.0; // avoid division by zero\n  double x_mid = (x_min + x_max)/2.0;\n  double y_mid = (y_min + y_max)/2.0;\n  double z_mid = (z_min + z_max)/2.0;\n\n  // Center and scale to ~[-1, 1], then shift for visual placement\n  double GL_cam_shift_y = 0.2; // cameras above the ground plane\n  double GL_ground_shift_y = -0.8;\n  for (std::size_t i = 0; i < cam_centers.size(); i++) {\n    Eigen::Vector3d cam_center = cam_centers[i];\n    Eigen::Vector3d trans_center = EcefToGL * cam_center;\n    trans_center[0] = (trans_center[0] - x_mid)/len;\n    trans_center[1] = (trans_center[1] - y_mid)/len + GL_cam_shift_y;\n    trans_center[2] = (trans_center[2] - z_mid)/len;\n    cam_centers[i] = GLToEcef * trans_center;\n  }\n\n  if (z_max - z_min > x_max - x_min) {\n    // Rotate around the y axis by 90 degrees to show the cameras\n    // side-by-side as seen in the OpenGL default coordinate system.\n    Eigen::Matrix3d R90;\n    R90 << 0, 0, -1,\n           0, 1,  0,\n           1, 0,  0;\n    EcefToGL = R90 * EcefToGL;\n  }\n\n  // Rotate the camera positions and orientations\n  double GL_cam_shift_z = -0.5; // Move the cameras a bit to the back\n  for (std::size_t i = 0; i < cam_centers.size(); i++) {\n    cam_centers[i] = EcefToGL * cam_centers[i];\n    cam_centers[i][2] += GL_cam_shift_z;\n    cam2world_vec[i] = EcefToGL * cam2world_vec[i];\n  }\n\n  // Apply the camera positions and orientations to the views\n  applySfmCameraPoses(cam_centers, cam2world_vec, views);\n\n  // Plot the cameras as meshes\n  sfm::TriangleMesh::Ptr mesh = sfm::TriangleMesh::create();\n  sfm::TriangleMesh::VertexList& verts(mesh->get_vertices());\n  sfm::TriangleMesh::FaceList& faces(mesh->get_faces());\n  sfm::TriangleMesh::ColorList& colors(mesh->get_vertex_colors());\n  Eigen::Vector4f color(0.0f, 1.0f, 0.0f, 1.0f); // green\n  float size = this->frusta_size_slider->value() / 100.0f;\n  for (std::size_t i = 0; i < views.size(); i++) {\n    if (views[i].get() == nullptr) {\n      std::cerr << \"Error: Empty camera.\\n\";\n      continue;\n    }\n\n    sfm::SfmCameraInfo const& cam = views[i]->get_camera();\n    if (cam.flen == 0.0f) {\n      std::cerr << \"Error: SfmCamera focal length is 0.\\n\";\n      continue;\n    }\n    add_camera_to_mesh(cam, size, mesh);\n  }\n\n  this->frusta_renderer = sfm::MeshRenderer::create(mesh);\n  this->frusta_renderer->set_shader(this->wireframe_shader);\n  this->frusta_renderer->set_primitive(GL_LINES);\n}\n\nvoid SceneRenderer::create_ground_renderer(void) {\n\n  sfm::TriangleMesh::Ptr mesh = sfm::TriangleMesh::create();\n  sfm::TriangleMesh::VertexList& verts(mesh->get_vertices());\n  sfm::TriangleMesh::FaceList& faces(mesh->get_faces());\n  sfm::TriangleMesh::ColorList& colors(mesh->get_vertex_colors());\n  Eigen::Vector4f color(0.0f, 1.0f, 0.0f, 1.0f); // green\n\n  // Draw a ground plane as (x, z) in [-1, 1] x [-1, 1] at some height y.\n  double GL_ground_shift_y = -0.8;\n  double d = 10.0;\n  for (size_t i = 1; i <= 22; i++) {\n    double x[2], z[2];\n    if (i <= 11) {\n      z[0] = 2.0*(i - 6.0)/d; z[1] = z[0];\n      x[0] = -1.0; x[1] = 1.0;\n    } else {\n      x[0] = 2.0*(i - 11 - 6.0)/d; x[1] = x[0];\n      z[0] = -1.0; z[1] = 1.0;\n    }\n\n    Eigen::Vector3f v1((float)x[0], (float)GL_ground_shift_y, (float)z[0]);\n    Eigen::Vector3f v2((float)x[1], (float)GL_ground_shift_y, (float)z[1]);\n\n    verts.push_back(v1);\n    verts.push_back(v2);\n    faces.push_back(verts.size() - 2);\n    faces.push_back(verts.size() - 1);\n    colors.push_back(color);\n    colors.push_back(color);\n  }\n\n  this->ground_renderer = sfm::MeshRenderer::create(mesh);\n  this->ground_renderer->set_shader(this->wireframe_shader);\n  this->ground_renderer->set_primitive(GL_LINES);\n}\n\nvoid SceneRenderer::create_viewdir_renderer(void) {\n  if (this->view == nullptr)\n    return;\n\n  sfm::SfmCameraInfo const& cam(this->view->get_camera());\n  Eigen::Vector3f campos = cam.fill_camera_pos();\n  Eigen::Vector3f viewdir = cam.fill_viewing_direction();\n\n  sfm::TriangleMesh::Ptr mesh = sfm::TriangleMesh::create();\n  sfm::TriangleMesh::VertexList& verts = mesh->get_vertices();\n  sfm::TriangleMesh::ColorList& colors = mesh->get_vertex_colors();\n  verts.push_back(campos);\n  verts.push_back(campos + viewdir * 100.0f);\n  colors.push_back(Eigen::Vector4f(1.0f, 1.0f, 0.0f, 1.0f));\n  colors.push_back(Eigen::Vector4f(1.0f, 1.0f, 0.0f, 1.0f));\n\n  this->viewdir_renderer = sfm::MeshRenderer::create(mesh);\n  this->viewdir_renderer->set_shader(this->wireframe_shader);\n  this->viewdir_renderer->set_primitive(GL_LINES);\n}\n"
  },
  {
    "path": "src/asp/SfmView/SceneRenderer.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Derived from MVE (Simon Fuhrmann, TU Darmstadt, BSD 3-Clause).\n\n#ifndef __ASP_SFMVIEW_SCENE_RENDERER_H__\n#define __ASP_SFMVIEW_SCENE_RENDERER_H__\n\n#include <asp/SfmView/GlCommon.h>\n#include <asp/SfmView/SfmUtils.h>\n#include <asp/SfmView/GlContext.h>\n#include <asp/SfmView/MeshRenderer.h>\n#include <asp/SfmView/GlWidget.h>\n\n#include <QAction>\n#include <QSlider>\n\n// 3D renderer: draws camera frusta, ground plane, viewing direction.\nclass SceneRenderer: public QWidget, public sfm::GlContext {\n  Q_OBJECT\n\npublic:\n  SceneRenderer(GlWidget* gl_widget);\n  void set_scene(sfm::Scene::Ptr scene);\n  void set_view(sfm::View::Ptr view);\n  void reset_scene(void);\n\n  QAction* get_action_frusta(void);\n  QAction* get_action_viewdir(void);\n  QAction* get_action_ground(void);\n  QSlider* get_frusta_size_slider(void);\n\nprotected:\n  void init_impl(void);\n  void resize_impl(int old_width, int old_height);\n  void paint_impl(void);\n\nprivate slots:\n  void reset_viewdir_renderer(void);\n  void reset_frusta_renderer(void);\n  void reset_ground_renderer(void);\n  void on_scene_changed(void);\n\nprivate:\n  void load_shaders(void);\n  void send_uniform(sfm::SfmCamera const& cam);\n  void create_frusta_renderer(void);\n  void create_ground_renderer(void);\n  void create_viewdir_renderer(void);\n\n  GlWidget* gl_widget;\n  QOpenGLShaderProgram* wireframe_shader = nullptr;\n  sfm::Scene::Ptr scene;\n  sfm::View::Ptr view;\n\n  QAction* action_frusta;\n  QAction* action_viewdir;\n  QAction* action_ground;\n  QSlider* frusta_size_slider;\n  sfm::MeshRenderer::Ptr frusta_renderer;\n  sfm::MeshRenderer::Ptr ground_renderer;\n  sfm::MeshRenderer::Ptr viewdir_renderer;\n\n  // Cached original poses (before GL transformation).\n  // Cleared on scene change, preserved across slider changes.\n  std::vector<Eigen::Vector3d> orig_cam_centers;\n  std::vector<Eigen::Matrix3d> orig_cam2world_vec;\n};\n\n#endif // __ASP_SFMVIEW_SCENE_RENDERER_H__\n"
  },
  {
    "path": "src/asp/SfmView/SfmMainWindow.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Derived from MVE (Simon Fuhrmann, TU Darmstadt, BSD 3-Clause).\n\n#include <asp/SfmView/SceneManager.h>\n#include <asp/SfmView/SfmMainWindow.h>\n\n#include <QApplication>\n#include <QBoxLayout>\n#include <QDialog>\n#include <QDockWidget>\n#include <QMenuBar>\n#include <QMessageBox>\n#include <QSlider>\n\nSfmMainWindow::~SfmMainWindow(void) {\n}\n\nSfmMainWindow::SfmMainWindow(int width, int height) {\n  this->scene_overview = new SceneOverview(this);\n\n  // Create GL widget and scene renderer\n  this->gl_widget = new GlWidget();\n  this->scene_renderer = new SceneRenderer(this->gl_widget);\n  this->gl_widget->set_context(this->scene_renderer);\n\n  this->connect(&SceneManager::get(), SIGNAL(scene_selected(sfm::Scene::Ptr)),\n    this, SLOT(on_scene_selected(sfm::Scene::Ptr)));\n  this->connect(&SceneManager::get(), SIGNAL(view_selected(sfm::View::Ptr)),\n    this, SLOT(on_view_selected(sfm::View::Ptr)));\n\n  // Create dock widgets\n  this->dock_scene = new QDockWidget(tr(\"SfmCameras\"));\n  this->dock_scene->setWidget(this->scene_overview);\n  this->dock_scene->setFeatures(QDockWidget::NoDockWidgetFeatures);\n\n  // Use in-window menu bar to avoid macOS auto-injected menus\n  this->menuBar()->setNativeMenuBar(false);\n\n  this->create_actions();\n  this->create_menus();\n\n  QWidget* central_widget(new QWidget(this));\n  QLayout* central_layout(new QVBoxLayout(central_widget));\n  central_layout->addWidget(this->gl_widget);\n\n  this->setWindowTitle(tr(\"sfm_view\"));\n  this->setCentralWidget(central_widget);\n  this->addDockWidget(Qt::LeftDockWidgetArea, this->dock_scene);\n  this->resize(width, height);\n\n  this->show();\n}\n\nvoid SfmMainWindow::load_scene(std::vector<std::string> const& cameras) {\n  sfm::Scene::Ptr scene;\n  try {\n    scene = sfm::Scene::create(cameras);\n  } catch (std::exception& e) {\n    QMessageBox::information(this, tr(\"Error loading scene\"),\n      tr(\"Scene could not be loaded.\\n\"\n      \"Error: %1\").arg(e.what()));\n    return;\n  }\n\n  SceneManager::get().select_scene(scene);\n}\n\nvoid SfmMainWindow::create_actions(void) {\n  this->action_quit = new QAction(tr(\"&Quit\"), this);\n  this->action_quit->setShortcut(tr(\"Ctrl+Q\"));\n  this->connect(this->action_quit, SIGNAL(triggered()),\n    this, SLOT(close()));\n\n  this->action_about = new QAction(tr(\"&About\"), this);\n  this->connect(this->action_about, SIGNAL(triggered()),\n    this, SLOT(on_about()));\n}\n\nvoid SfmMainWindow::create_menus(void) {\n  this->menu_file = new QMenu(tr(\"&File\"), this);\n  this->menu_file->addAction(this->action_quit);\n\n  this->menu_view = new QMenu(tr(\"&View\"), this);\n  this->menu_view->addAction(this->scene_renderer->get_action_frusta());\n  this->menu_view->addAction(this->scene_renderer->get_action_ground());\n  this->menu_view->addAction(this->scene_renderer->get_action_viewdir());\n  QAction* action_frusta_size = new QAction(tr(\"Set frusta size\"), this);\n  this->connect(action_frusta_size, SIGNAL(triggered()),\n    this, SLOT(on_frusta_size()));\n  this->menu_view->addAction(action_frusta_size);\n\n  this->menu_help = new QMenu(tr(\"&Help\"), this);\n  this->menu_help->addAction(this->action_about);\n\n  this->menuBar()->addMenu(this->menu_file);\n  this->menuBar()->addMenu(this->menu_view);\n  this->menuBar()->addMenu(this->menu_help);\n  this->menuBar()->show();\n}\n\nvoid SfmMainWindow::on_scene_selected(sfm::Scene::Ptr scene) {\n  this->scene_renderer->set_scene(scene);\n}\n\nvoid SfmMainWindow::on_view_selected(sfm::View::Ptr view) {\n  this->scene_renderer->set_view(view);\n}\n\nvoid SfmMainWindow::perform_close_scene(void) {\n  SceneManager::get().reset_view();\n  SceneManager::get().reset_scene();\n  this->scene_renderer->reset_scene();\n}\n\nvoid SfmMainWindow::on_about(void) {\n  QMessageBox::about(this, tr(\"About sfm_view\"),\n    tr(\"SfmCamera pose viewer for ASP. Based on \"\n       \"<a href=\\\"https://github.com/simonfuhrmann/mve\\\">MVE</a>.\"));\n}\n\nvoid SfmMainWindow::on_frusta_size(void) {\n  QSlider* slider = this->scene_renderer->get_frusta_size_slider();\n\n  QDialog dlg(this);\n  dlg.setWindowTitle(tr(\"Frusta size\"));\n  QVBoxLayout* layout = new QVBoxLayout(&dlg);\n  layout->addWidget(slider);\n  dlg.resize(300, 60);\n  dlg.exec();\n\n  // Reparent slider back so it survives the dialog destruction\n  slider->setParent(nullptr);\n}\n\nvoid SfmMainWindow::closeEvent(QCloseEvent* event) {\n  this->perform_close_scene();\n  event->accept();\n}\n"
  },
  {
    "path": "src/asp/SfmView/SfmMainWindow.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Derived from MVE (Simon Fuhrmann, TU Darmstadt, BSD 3-Clause).\n\n#ifndef __ASP_SFMVIEW_SFM_MAIN_WINDOW_H__\n#define __ASP_SFMVIEW_SFM_MAIN_WINDOW_H__\n\n#include <asp/SfmView/GlWidget.h>\n#include <asp/SfmView/SceneRenderer.h>\n#include <asp/SfmView/SceneOverview.h>\n\n#include <QMainWindow>\n\n#include <string>\n#include <vector>\n\nclass SfmMainWindow: public QMainWindow {\n  Q_OBJECT\n\nprivate:\n  QDockWidget* dock_scene;\n\n  SceneOverview* scene_overview;\n  GlWidget* gl_widget;\n  SceneRenderer* scene_renderer;\n\n  QAction* action_quit;\n  QAction* action_about;\n\n  QMenu* menu_file;\n  QMenu* menu_view;\n  QMenu* menu_help;\n\n  void create_actions(void);\n  void create_menus(void);\n  void perform_close_scene(void);\n\nprivate slots:\n  void on_scene_selected(sfm::Scene::Ptr scene);\n  void on_view_selected(sfm::View::Ptr view);\n  void on_about(void);\n  void on_frusta_size(void);\n\n  void closeEvent(QCloseEvent* event);\n\npublic:\n  SfmMainWindow(int width, int height);\n  ~SfmMainWindow(void);\n\n  void load_scene(std::vector<std::string> const& cameras);\n};\n\n#endif // __ASP_SFMVIEW_SFM_MAIN_WINDOW_H__\n"
  },
  {
    "path": "src/asp/SfmView/SfmMath.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Derived from MVE (Simon Fuhrmann, TU Darmstadt, BSD 3-Clause).\n\n#ifndef __ASP_SFMVIEW_SFM_MATH_H__\n#define __ASP_SFMVIEW_SFM_MATH_H__\n\n#include <Eigen/Core>\n#include <Eigen/Geometry>\n\n#include <algorithm>\n#include <cmath>\n#include <memory>\n#include <vector>\n\nnamespace sfm {\n\n// Clamp value to range [lo, hi]\ntemplate <typename T>\nT clamp(T const& v, T const& lo, T const& hi) {\n  return std::min(hi, std::max(lo, v));\n}\n\n// Multiply a 4x4 matrix by a 3-vector with homogeneous w coordinate.\n// Returns upper-left 3x3 block times v, plus w times the translation column.\ntemplate <typename T>\nEigen::Matrix<T, 3, 1>\nmult_homogeneous(Eigen::Matrix<T, 4, 4> const& m,\n                 Eigen::Matrix<T, 3, 1> const& v, T w) {\n  return m.template block<3, 3>(0, 0) * v +\n         w * m.template block<3, 1>(0, 3);\n}\n\n// OpenGL symmetric projection matrix (column-major for GL)\ntemplate <typename T>\nEigen::Matrix<T, 4, 4>\nmatrix_gl_projection(T const& znear, T const& zfar,\n                     T const& top, T const& right) {\n  Eigen::Matrix<T, 4, 4> proj = Eigen::Matrix<T, 4, 4>::Zero();\n  proj(0, 0) = znear / right;\n  proj(1, 1) = znear / top;\n  proj(2, 2) = -(zfar + znear) / (zfar - znear);\n  proj(2, 3) = T(-2) * zfar * znear / (zfar - znear);\n  proj(3, 2) = T(-1);\n  return proj;\n}\n\n// View transformation matrix from camera pos, viewing direction, up vector\ntemplate <typename T>\nEigen::Matrix<T, 4, 4>\nmatrix_viewtrans(Eigen::Matrix<T, 3, 1> const& campos,\n                 Eigen::Matrix<T, 3, 1> const& viewdir,\n                 Eigen::Matrix<T, 3, 1> const& upvec) {\n  Eigen::Matrix<T, 3, 1> z = -viewdir;\n  Eigen::Matrix<T, 3, 1> x = upvec.cross(z).normalized();\n  Eigen::Matrix<T, 3, 1> y = z.cross(x);\n\n  // Start with identity, replace the rotation and translation parts\n  Eigen::Matrix<T, 4, 4> m = Eigen::Matrix<T, 4, 4>::Identity();\n  m(0, 0) = x[0]; m(0, 1) = x[1]; m(0, 2) = x[2];\n  m(1, 0) = y[0]; m(1, 1) = y[1]; m(1, 2) = y[2];\n  m(2, 0) = z[0]; m(2, 1) = z[1]; m(2, 2) = z[2];\n\n  Eigen::Matrix<T, 3, 1> t = -campos;\n  m(0, 3) = m(0, 0)*t[0] + m(0, 1)*t[1] + m(0, 2)*t[2];\n  m(1, 3) = m(1, 0)*t[0] + m(1, 1)*t[1] + m(1, 2)*t[2];\n  m(2, 3) = m(2, 0)*t[0] + m(2, 1)*t[1] + m(2, 2)*t[2];\n  return m;\n}\n\n// Inverse view transformation matrix\ntemplate <typename T>\nEigen::Matrix<T, 4, 4>\nmatrix_inverse_viewtrans(Eigen::Matrix<T, 3, 1> const& campos,\n                         Eigen::Matrix<T, 3, 1> const& viewdir,\n                         Eigen::Matrix<T, 3, 1> const& upvec) {\n  Eigen::Matrix<T, 3, 1> z = -viewdir;\n  Eigen::Matrix<T, 3, 1> x = upvec.cross(z).normalized();\n  Eigen::Matrix<T, 3, 1> y = z.cross(x);\n\n  // Start with identity, replace the rotation and translation parts\n  Eigen::Matrix<T, 4, 4> m = Eigen::Matrix<T, 4, 4>::Identity();\n  m(0, 0) = x[0]; m(0, 1) = y[0]; m(0, 2) = z[0]; m(0, 3) = campos[0];\n  m(1, 0) = x[1]; m(1, 1) = y[1]; m(1, 2) = z[1]; m(1, 3) = campos[1];\n  m(2, 0) = x[2]; m(2, 1) = y[2]; m(2, 2) = z[2]; m(2, 3) = campos[2];\n  return m;\n}\n\n// Rotation matrix from axis and angle (Rodrigues)\ntemplate <typename T>\nEigen::Matrix<T, 3, 3>\nmatrix_rotation_from_axis_angle(Eigen::Matrix<T, 3, 1> const& axis,\n                                T const& angle) {\n  return Eigen::AngleAxis<T>(angle, axis.normalized()).toRotationMatrix();\n}\n\n// TriangleMesh\n\nclass TriangleMesh {\npublic:\n  typedef std::shared_ptr<TriangleMesh> Ptr;\n  typedef std::shared_ptr<TriangleMesh const> ConstPtr;\n\n  typedef unsigned int VertexID;\n  typedef std::vector<Eigen::Vector3f> VertexList;\n  typedef std::vector<Eigen::Vector4f> ColorList;\n  typedef std::vector<Eigen::Vector3f> NormalList;\n  typedef std::vector<Eigen::Vector2f> TexCoordList;\n  typedef std::vector<VertexID> FaceList;\n\n  static Ptr create(void) { return Ptr(new TriangleMesh); }\n\n  VertexList const& get_vertices(void) const { return vertices; }\n  VertexList& get_vertices(void) { return vertices; }\n  ColorList const& get_vertex_colors(void) const { return vertex_colors; }\n  ColorList& get_vertex_colors(void) { return vertex_colors; }\n  NormalList const& get_vertex_normals(void) const { return vertex_normals; }\n  NormalList& get_vertex_normals(void) { return vertex_normals; }\n  TexCoordList const& get_vertex_texcoords(void) const { return vertex_texcoords; }\n  TexCoordList& get_vertex_texcoords(void) { return vertex_texcoords; }\n  FaceList const& get_faces(void) const { return faces; }\n  FaceList& get_faces(void) { return faces; }\n\nprivate:\n  VertexList vertices;\n  ColorList vertex_colors;\n  NormalList vertex_normals;\n  TexCoordList vertex_texcoords;\n  FaceList faces;\n};\n\n// Camera with viewing and projection matrices for OpenGL rendering.\nclass SfmCamera {\npublic:\n  Eigen::Vector3f pos;\n  Eigen::Vector3f viewing_dir;\n  Eigen::Vector3f up_vec;\n\n  float z_near;\n  float z_far;\n  float top;\n  float right;\n\n  int width;\n  int height;\n\n  Eigen::Matrix4f view;\n  Eigen::Matrix4f proj;\n\n  SfmCamera(void);\n  void update_view_mat(void);\n  void update_proj_mat(void);\n};\n\ninline SfmCamera::SfmCamera(void):\n  pos(0.0f, 0.0f, 5.0f),\n  viewing_dir(0.0f, 0.0f, -1.0f),\n  up_vec(0.0f, 1.0f, 0.0f),\n  z_near(0.1f), z_far(500.0f),\n  top(0.1f), right(0.1f),\n  width(0), height(0) {\n  view = Eigen::Matrix4f::Zero();\n  proj = Eigen::Matrix4f::Zero();\n}\n\ninline void SfmCamera::update_view_mat(void) {\n  this->view = sfm::matrix_viewtrans(this->pos,\n    this->viewing_dir, this->up_vec);\n}\n\ninline void SfmCamera::update_proj_mat(void) {\n  this->proj = sfm::matrix_gl_projection(this->z_near,\n    this->z_far, this->top, this->right);\n}\n\n} // namespace sfm\n\n#endif // __ASP_SFMVIEW_SFM_MATH_H__\n"
  },
  {
    "path": "src/asp/SfmView/SfmUtils.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Derived from MVE (Simon Fuhrmann, TU Darmstadt, BSD 3-Clause).\n\n#include <asp/SfmView/SfmUtils.h>\n\n#include <algorithm>\n#include <cstdio>\n#include <fstream>\n#include <iostream>\n#include <stdexcept>\n#include <string>\n\nnamespace sfm {\n\nSfmCameraInfo::SfmCameraInfo() {\n  flen = 0.0f;\n  std::fill(trans, trans + 3, 0.0);\n  std::fill(rot, rot + 9, 0.0);\n  rot[0] = rot[4] = rot[8] = 1.0; // identity\n}\n\nEigen::Vector3f SfmCameraInfo::fill_camera_pos() const {\n  Eigen::Vector3f pos;\n  pos[0] = float(-rot[0] * trans[0] - rot[3] * trans[1] - rot[6] * trans[2]);\n  pos[1] = float(-rot[1] * trans[0] - rot[4] * trans[1] - rot[7] * trans[2]);\n  pos[2] = float(-rot[2] * trans[0] - rot[5] * trans[1] - rot[8] * trans[2]);\n  return pos;\n}\n\nEigen::Vector3f SfmCameraInfo::fill_viewing_direction() const {\n  Eigen::Vector3f viewdir;\n  for (int i = 0; i < 3; ++i)\n    viewdir[i] = float(rot[6 + i]);\n  return viewdir;\n}\n\nEigen::Matrix4f SfmCameraInfo::fill_cam_to_world() const {\n  Eigen::Matrix4f m = Eigen::Matrix4f::Zero();\n  // 3x3 block is R^T (transpose of world-to-camera rotation)\n  m(0, 0) = float(rot[0]); m(0, 1) = float(rot[3]); m(0, 2) = float(rot[6]);\n  m(1, 0) = float(rot[1]); m(1, 1) = float(rot[4]); m(1, 2) = float(rot[7]);\n  m(2, 0) = float(rot[2]); m(2, 1) = float(rot[5]); m(2, 2) = float(rot[8]);\n  // Translation is -R^T * t\n  m(0, 3) = float(-(rot[0]*trans[0] + rot[3]*trans[1] + rot[6]*trans[2]));\n  m(1, 3) = float(-(rot[1]*trans[0] + rot[4]*trans[1] + rot[7]*trans[2]));\n  m(2, 3) = float(-(rot[2]*trans[0] + rot[5]*trans[1] + rot[8]*trans[2]));\n  m(3, 3) = 1.0f;\n  return m;\n}\n\n// Read camera parameters from a .tsai pinhole model file.\n// Only reads the extrinsic parameters (camera center C, rotation R)\n// and converts them to the world-to-camera convention (rot, trans).\nvoid SfmCameraInfo::read_tsai(std::string const& filename) {\n\n  std::ifstream cam_file(filename);\n  if (cam_file.fail())\n    throw std::invalid_argument(\n      \"SfmCameraInfo::read_tsai: Could not open file: \" + filename);\n\n  // Use a fixed focal length for frustum display.\n  // The true value is not needed for camera pose visualization.\n  this->flen = 1.0f;\n\n  std::string line;\n\n  // Check for version number on the first line\n  std::getline(cam_file, line);\n  if (line.find(\"VERSION\") != std::string::npos) {\n    int file_version = 1;\n    std::sscanf(line.c_str(), \"VERSION_%d\", &file_version);\n    std::getline(cam_file, line);\n    if (file_version == 4) {\n      if (line.find(\"PINHOLE\") == std::string::npos)\n        throw std::invalid_argument(\n          \"SfmCameraInfo::read_tsai: Expected PINHOLE type, got: \" + line);\n      std::getline(cam_file, line);\n    }\n  } else {\n    // First line should be fu = ...\n    float dummy = 0.0f;\n    if (std::sscanf(line.c_str(), \"fu = %f\", &dummy) != 1)\n      throw std::invalid_argument(\n        \"SfmCameraInfo::read_tsai: File must start with VERSION or fu = . \"\n        \"Got: \" + line);\n  }\n\n  // Parse fu, fv\n  double f_u = 0.0, f_v = 0.0;\n  if (std::sscanf(line.c_str(), \"fu = %lf\", &f_u) != 1)\n    throw std::invalid_argument(\n      \"SfmCameraInfo::read_tsai: Could not read x focal length.\");\n\n  std::getline(cam_file, line);\n  if (std::sscanf(line.c_str(), \"fv = %lf\", &f_v) != 1)\n    throw std::invalid_argument(\n      \"SfmCameraInfo::read_tsai: Could not read y focal length.\");\n\n  // cu, cv (principal point - not used for display)\n  double cu = 0.0, cv = 0.0;\n  std::getline(cam_file, line);\n  if (std::sscanf(line.c_str(), \"cu = %lf\", &cu) != 1)\n    throw std::invalid_argument(\n      \"SfmCameraInfo::read_tsai: Could not read x principal point.\");\n  std::getline(cam_file, line);\n  if (std::sscanf(line.c_str(), \"cv = %lf\", &cv) != 1)\n    throw std::invalid_argument(\n      \"SfmCameraInfo::read_tsai: Could not read y principal point.\");\n\n  // u_direction, v_direction, w_direction (not used for display)\n  double dummy3[3] = {0.0, 0.0, 0.0};\n  std::getline(cam_file, line);\n  if (std::sscanf(line.c_str(), \"u_direction = %lf %lf %lf\",\n      &dummy3[0], &dummy3[1], &dummy3[2]) != 3)\n    throw std::invalid_argument(\n      \"SfmCameraInfo::read_tsai: Could not read u direction.\");\n  std::getline(cam_file, line);\n  if (std::sscanf(line.c_str(), \"v_direction = %lf %lf %lf\",\n      &dummy3[0], &dummy3[1], &dummy3[2]) != 3)\n    throw std::invalid_argument(\n      \"SfmCameraInfo::read_tsai: Could not read v direction.\");\n  std::getline(cam_file, line);\n  if (std::sscanf(line.c_str(), \"w_direction = %lf %lf %lf\",\n      &dummy3[0], &dummy3[1], &dummy3[2]) != 3)\n    throw std::invalid_argument(\n      \"SfmCameraInfo::read_tsai: Could not read w direction.\");\n\n  // SfmCamera center in world coordinates\n  double camera_center[3] = {0.0, 0.0, 0.0};\n  std::getline(cam_file, line);\n  if (std::sscanf(line.c_str(), \"C = %lf %lf %lf\",\n      &camera_center[0], &camera_center[1], &camera_center[2]) != 3)\n    throw std::invalid_argument(\n      \"SfmCameraInfo::read_tsai: Could not read camera center C.\");\n\n  // Rotation matrix (camera-to-world, row-major)\n  double rotation[9] = {0.0};\n  std::getline(cam_file, line);\n  if (std::sscanf(line.c_str(), \"R = %lf %lf %lf %lf %lf %lf %lf %lf %lf\",\n      &rotation[0], &rotation[1], &rotation[2],\n      &rotation[3], &rotation[4], &rotation[5],\n      &rotation[6], &rotation[7], &rotation[8]) != 9)\n    throw std::invalid_argument(\n      \"SfmCameraInfo::read_tsai: Could not read rotation matrix R.\");\n\n  // Transpose: camera-to-world -> world-to-camera\n  this->rot[0] = rotation[0];\n  this->rot[1] = rotation[3];\n  this->rot[2] = rotation[6];\n  this->rot[3] = rotation[1];\n  this->rot[4] = rotation[4];\n  this->rot[5] = rotation[7];\n  this->rot[6] = rotation[2];\n  this->rot[7] = rotation[5];\n  this->rot[8] = rotation[8];\n\n  // trans = -world2camera * camera_center\n  this->trans[0] = -(rot[0]*camera_center[0] + rot[1]*camera_center[1]\n                   + rot[2]*camera_center[2]);\n  this->trans[1] = -(rot[3]*camera_center[0] + rot[4]*camera_center[1]\n                   + rot[5]*camera_center[2]);\n  this->trans[2] = -(rot[6]*camera_center[0] + rot[7]*camera_center[1]\n                   + rot[8]*camera_center[2]);\n}\n\n// View\n\nView::Ptr View::create() {\n  return Ptr(new View);\n}\n\nstd::string const& View::get_name() const {\n  return name_;\n}\n\nSfmCameraInfo const& View::get_camera() const {\n  return camera_;\n}\n\nvoid View::set_camera(SfmCameraInfo const& cam) {\n  camera_ = cam;\n}\n\nvoid View::set_dirty(bool /*dirty*/) {\n}\n\nvoid View::load_view(std::string const& camera_path) {\n  // Extract basename for the view name\n  std::string::size_type pos = camera_path.find_last_of(\"/\\\\\");\n  if (pos != std::string::npos)\n    name_ = camera_path.substr(pos + 1);\n  else\n    name_ = camera_path;\n\n  camera_ = SfmCameraInfo();\n  camera_.read_tsai(camera_path);\n}\n\n// Scene\n\nScene::ViewList const& Scene::get_views() const {\n  return views_;\n}\n\nScene::ViewList& Scene::get_views() {\n  return views_;\n}\n\nView::Ptr Scene::get_view_by_id(std::size_t id) {\n  if (id < views_.size())\n    return views_[id];\n  return View::Ptr();\n}\n\nScene::Ptr Scene::create(\n  std::vector<std::string> const& camera_files) {\n  Ptr scene(new Scene);\n  scene->views_.resize(camera_files.size());\n  for (std::size_t i = 0; i < camera_files.size(); ++i) {\n    scene->views_[i] = View::create();\n    scene->views_[i]->load_view(camera_files[i]);\n  }\n  return scene;\n}\n\n} // namespace sfm\n"
  },
  {
    "path": "src/asp/SfmView/SfmUtils.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Derived from MVE (Simon Fuhrmann, TU Darmstadt, BSD 3-Clause).\n//\n// Lightweight replacements for sfm::SfmCameraInfo, sfm::View, and sfm::Scene\n// used by sfm_view. These avoid pulling in the full MVE library for types\n// that are simple data containers in this application.\n\n#ifndef __ASP_SFMVIEW_SFM_UTILS_H__\n#define __ASP_SFMVIEW_SFM_UTILS_H__\n\n#include <asp/SfmView/SfmMath.h>\n\n#include <memory>\n#include <string>\n#include <vector>\n\nnamespace sfm {\n\n// SfmCamera intrinsic and extrinsic parameters.\n// Stores world-to-camera rotation and translation.\nstruct SfmCameraInfo {\n  SfmCameraInfo();\n\n  // Compute camera position: pos = -R^T * t.\n  Eigen::Vector3f fill_camera_pos() const;\n\n  // Return the viewing direction (third row of rotation).\n  Eigen::Vector3f fill_viewing_direction() const;\n\n  // Return the 4x4 camera-to-world matrix.\n  Eigen::Matrix4f fill_cam_to_world() const;\n\n  // Read camera parameters from a .tsai pinhole model file.\n  void read_tsai(std::string const& filename);\n\n  // Intrinsic parameters\n  float flen;\n\n  // Extrinsic parameters (double for large satellite orbit values)\n  double trans[3]; // SfmCamera translation: pos = -R^T * trans\n  double rot[9];   // World-to-camera rotation (row-major 3x3)\n};\n\n// A single camera view: holds a name and camera parameters.\nclass View {\npublic:\n  using Ptr = std::shared_ptr<View>;\n  static Ptr create();\n\n  // Load camera from a .tsai file. The view name is set to the\n  // basename of camera_path.\n  void load_view(std::string const& camera_path);\n\n  std::string const& get_name() const;\n\n  SfmCameraInfo const& get_camera() const;\n  void set_camera(SfmCameraInfo const& cam);\n\n  // No-op. Kept for API compatibility with code that prevents save prompts.\n  void set_dirty(bool dirty);\n\nprivate:\n  View() = default;\n  std::string name_;\n  SfmCameraInfo camera_;\n};\n\n// A collection of camera views.\nclass Scene {\npublic:\n  using Ptr = std::shared_ptr<Scene>;\n  using ViewList = std::vector<View::Ptr>;\n\n  // Create a scene from .tsai camera files.\n  static Ptr create(std::vector<std::string> const& camera_files);\n\n  ViewList const& get_views() const;\n  ViewList& get_views();\n  View::Ptr get_view_by_id(std::size_t id);\n\nprivate:\n  Scene() = default;\n  ViewList views_;\n};\n\n} // namespace sfm\n\n#endif // __ASP_SFMVIEW_SFM_UTILS_H__\n"
  },
  {
    "path": "src/asp/Tools/CMakeLists.txt",
    "content": "# ---------------------------------------------------------------\n# Define each of the tools to build\n\n#TODO: Turn them off when components are not present\n\n# Install all of the python files.\n# Note: When packaged, the files with a .py extension will\n# not get a shell script wrapper. See add_executable() \n# in BinaryDist.py.\nset(PYTHON_TOOLS dg_mosaic             parallel_stereo\n                 sparse_disp           stereo\n                 time_trials           camera_calibrate\n                 camera_solve          parallel_sfs\n                 mapproject            parallel_bundle_adjust\n                 extract_bag           list_timestamps\n                 rig_bracket           texrecon\n                 theia_sfm             multi_stereo\n                 sfm_proc              refr_index\n                 stereo_sweep          stereo_dist\n                 stereo_tile\n                 cam2map4stereo.py     hiedr2mosaic.py\n                 lronac2mosaic.py      parse_match_file.py\n                 historical_helper.py  bathy_threshold_calc.py \n                 scale_bathy_mask.py   orbit_plot.py)\n\nforeach(p ${PYTHON_TOOLS})\n  INSTALL(FILES ${p} PERMISSIONS\n    OWNER_READ OWNER_WRITE OWNER_EXECUTE\n    GROUP_READ GROUP_EXECUTE\n    WORLD_READ WORLD_EXECUTE\n    DESTINATION bin)\nendforeach()\n\nadd_executable(aster2asp aster2asp.cc)\ntarget_link_libraries(aster2asp AspSessions)\ninstall(TARGETS aster2asp DESTINATION bin)\n\nadd_executable(prism2asp prism2asp.cc)\ntarget_link_libraries(prism2asp AspSessions)\ninstall(TARGETS prism2asp DESTINATION bin)\n\nadd_executable(bundle_adjust bundle_adjust.cc)\ntarget_link_libraries(bundle_adjust AspSessions ${SOLVER_LIBRARIES})\ninstall(TARGETS bundle_adjust DESTINATION bin)\n\nadd_executable(opencv_calibrate opencv_calibrate.cc) \ntarget_link_libraries(opencv_calibrate AspCore AspSessions)\ninstall(TARGETS opencv_calibrate DESTINATION libexec)\n\nadd_executable(opencv_imagelist_creator opencv_imagelist_creator.cc)\ntarget_link_libraries(opencv_imagelist_creator AspCore AspSessions)\ninstall(TARGETS opencv_imagelist_creator DESTINATION libexec)\n\nadd_executable(camera_footprint camera_footprint.cc)\ntarget_link_libraries(camera_footprint AspSessions)\ninstall(TARGETS camera_footprint DESTINATION bin)\n\nadd_executable(coverage_fraction coverage_fraction.cc)\ntarget_link_libraries(coverage_fraction AspCore AspSessions)\ninstall(TARGETS coverage_fraction DESTINATION bin)\n\nadd_executable(disparitydebug disparitydebug.cc)\ntarget_link_libraries(disparitydebug AspCore AspSessions)\ninstall(TARGETS disparitydebug DESTINATION bin)\n\nadd_executable(geodiff geodiff.cc)\ntarget_link_libraries(geodiff AspCore AspSessions)\ninstall(TARGETS geodiff DESTINATION bin)\n\nadd_executable(lronacjitreg lronacjitreg.cc)\ntarget_link_libraries(lronacjitreg AspSessions)\ninstall(TARGETS lronacjitreg DESTINATION bin)\n\nadd_executable(mapproject_single mapproject_single.cc)\ntarget_link_libraries(mapproject_single AspSessions)\ninstall(TARGETS mapproject_single DESTINATION bin)\n\nadd_executable(mer2camera mer2camera.cc)\ntarget_link_libraries(mer2camera AspCore AspSessions)\ninstall(TARGETS mer2camera DESTINATION bin)\n\nadd_executable(orbitviz orbitviz.cc)\ntarget_link_libraries(orbitviz AspSessions)\ninstall(TARGETS orbitviz DESTINATION bin)\n\nadd_executable(pc_merge pc_merge.cc)\ntarget_link_libraries(pc_merge AspSessions)\ninstall(TARGETS pc_merge DESTINATION bin)\n\nadd_executable(pansharp pansharp.cc)\ntarget_link_libraries(pansharp AspSessions)\ninstall(TARGETS pansharp DESTINATION bin)\n\nadd_executable(image_calc image_calc.cc)\ntarget_link_libraries(image_calc AspCore AspSessions)\ninstall(TARGETS image_calc DESTINATION bin)\n\nadd_executable(point2dem point2dem.cc)\ntarget_link_libraries(point2dem AspCore AspSessions)\ninstall(TARGETS point2dem DESTINATION bin)\n\nadd_executable(point2las point2las.cc)\ntarget_link_libraries(point2las AspCore AspSessions)\ninstall(TARGETS point2las DESTINATION bin)\n\nadd_executable(point2mesh point2mesh.cc)\ntarget_link_libraries(point2mesh AspCore AspSessions)\ninstall(TARGETS point2mesh DESTINATION bin)\n\nadd_executable(add_spot_rpc add_spot_rpc.cc)\ntarget_link_libraries(add_spot_rpc AspCamera AspSessions)\ninstall(TARGETS add_spot_rpc DESTINATION bin)\n\nadd_executable(cam2rpc cam2rpc.cc)\ntarget_link_libraries(cam2rpc AspSessions)\ninstall(TARGETS cam2rpc DESTINATION bin)\n\nadd_executable(rpc_gen rpc_gen.cc)\ntarget_link_libraries(rpc_gen AspSessions)\ninstall(TARGETS rpc_gen DESTINATION libexec)\n\nadd_executable(sfs sfs.cc)\ntarget_link_libraries(sfs ${SOLVER_LIBRARIES} AspSfS AspSessions)\ninstall(TARGETS sfs DESTINATION bin)\n\nadd_executable(sfs_blend sfs_blend.cc)\ntarget_link_libraries(sfs_blend AspSfS AspSessions)\ninstall(TARGETS sfs_blend DESTINATION bin)\n\nadd_executable(image_subset image_subset.cc)\ntarget_link_libraries(image_subset AspCore AspSessions)\ninstall(TARGETS image_subset DESTINATION bin)\n\nadd_executable(stereo_blend stereo_blend.cc stereo.h stereo.cc)\ntarget_link_libraries(stereo_blend AspSessions)\ninstall(TARGETS stereo_blend DESTINATION bin)\n\nadd_executable(stereo_corr stereo_corr.cc stereo.h stereo.cc)\ntarget_link_libraries(stereo_corr AspSessions)\ninstall(TARGETS stereo_corr DESTINATION bin)\n\nadd_executable(stereo_fltr stereo_fltr.cc stereo.h stereo.cc)\ntarget_link_libraries(stereo_fltr AspSessions AspGotcha)\ninstall(TARGETS stereo_fltr DESTINATION bin)\n\nadd_executable(stereo_gui stereo_gui.cc stereo.h stereo.cc)\ntarget_link_libraries(stereo_gui AspGUI AspSessions AspRig)\ninstall(TARGETS stereo_gui DESTINATION bin)\n\nadd_executable(sfm_view sfm_view.cc)\ntarget_link_libraries(sfm_view AspSfmView)\nset_target_properties(sfm_view PROPERTIES AUTOMOC TRUE)\ninstall(TARGETS sfm_view DESTINATION bin)\n\nadd_executable(stereo_parse stereo_parse.cc stereo.h stereo.cc) \ntarget_link_libraries(stereo_parse AspSessions)\ninstall(TARGETS stereo_parse DESTINATION bin)\n\nadd_executable(stereo_pprc stereo_pprc.cc stereo.h stereo.cc) \ntarget_link_libraries(stereo_pprc AspSessions)\ninstall(TARGETS stereo_pprc DESTINATION bin)\n\nadd_executable(stereo_rfne stereo_rfne.cc stereo.h stereo.cc) \ntarget_link_libraries(stereo_rfne AspSessions)\ninstall(TARGETS stereo_rfne DESTINATION bin)\n\nadd_executable(stereo_tri stereo_tri.cc stereo.h stereo.cc) \ntarget_link_libraries(stereo_tri AspSessions ${SOLVER_LIBRARIES})\ninstall(TARGETS stereo_tri DESTINATION bin)\n\nadd_executable(jitter_solve jitter_solve.cc) \ntarget_link_libraries(jitter_solve AspSessions ${SOLVER_LIBRARIES})\ninstall(TARGETS jitter_solve DESTINATION bin)\n\nadd_executable(xyzi2csv xyzi2csv.cc) \ntarget_link_libraries(xyzi2csv AspCore AspSessions)\ninstall(TARGETS xyzi2csv DESTINATION bin)\n\nadd_executable(dem_mosaic dem_mosaic.cc) \ntarget_link_libraries(dem_mosaic AspCore AspSessions)\ninstall(TARGETS dem_mosaic DESTINATION bin)\n\nadd_executable(image_mosaic image_mosaic.cc) \ntarget_link_libraries(image_mosaic AspCore AspSessions)\ninstall(TARGETS image_mosaic DESTINATION bin)\n\nadd_executable(image_align image_align.cc) \ntarget_link_libraries(image_align AspCore AspSessions)\ninstall(TARGETS image_align DESTINATION bin)\n\nadd_executable(tif_mosaic tif_mosaic.cc) \ntarget_link_libraries(tif_mosaic AspCore AspSessions)\ninstall(TARGETS tif_mosaic DESTINATION libexec)\n\nadd_executable(wv_correct wv_correct.cc) \ntarget_link_libraries(wv_correct AspCamera AspSessions)\ninstall(TARGETS wv_correct DESTINATION bin)\n\nadd_executable(cam_gen cam_gen.cc) \ntarget_link_libraries(cam_gen AspSessions)\ninstall(TARGETS cam_gen DESTINATION bin)\n\nadd_executable(gcp_gen gcp_gen.cc) \ntarget_link_libraries(gcp_gen AspSessions)\ninstall(TARGETS gcp_gen DESTINATION bin)\n\nadd_executable(bathy_plane_calc bathy_plane_calc.cc) \ntarget_link_libraries(bathy_plane_calc AspSessions)\ninstall(TARGETS bathy_plane_calc DESTINATION bin)\n\nadd_executable(cam_test cam_test.cc) \ntarget_link_libraries(cam_test AspSessions)\ninstall(TARGETS cam_test DESTINATION bin)\n\nadd_executable(otsu_threshold otsu_threshold.cc) \ntarget_link_libraries(otsu_threshold AspCore AspSessions)\ninstall(TARGETS otsu_threshold DESTINATION bin)\n\nadd_executable(corr_eval corr_eval.cc) \ntarget_link_libraries(corr_eval AspCore AspSessions)\ninstall(TARGETS corr_eval DESTINATION bin)\n\nadd_executable(disp2ip disp2ip.cc)\ntarget_link_libraries(disp2ip AspCore AspSessions AspRig)\ninstall(TARGETS disp2ip DESTINATION bin)\n\nadd_executable(pc_filter pc_filter.cc)\ntarget_link_libraries(pc_filter AspPclIO AspSessions)\ninstall(TARGETS pc_filter DESTINATION bin)\n\nadd_executable(sfm_submap sfm_submap.cc)\ntarget_link_libraries(sfm_submap AspRig AspPclIO AspSessions)\ninstall(TARGETS sfm_submap DESTINATION bin)\n\nadd_executable(sfm_merge sfm_merge.cc)\ntarget_link_libraries(sfm_merge AspRig AspPclIO AspSessions)\ninstall(TARGETS sfm_merge DESTINATION bin)\n\nadd_executable(dem2gcp dem2gcp.cc)\ntarget_link_libraries(dem2gcp AspCore AspSessions)\ninstall(TARGETS dem2gcp DESTINATION bin)\n\nadd_executable(sat_sim sat_sim.cc) \ntarget_link_libraries(sat_sim AspSessions)\ninstall(TARGETS sat_sim DESTINATION bin)\n\nadd_executable(undistort_image_texrecon undistort_image_texrecon.cc)\ntarget_link_libraries(undistort_image_texrecon AspRig AspPclIO AspSessions)\ninstall(TARGETS undistort_image_texrecon DESTINATION bin)\n\nif (NOT CORE_ASP_ONLY)\n  add_executable(rig_calibrator rig_calibrator.cc)\n  target_link_libraries(rig_calibrator AspCore AspRig AspPclIO AspSessions)\n  install(TARGETS rig_calibrator DESTINATION bin)\n\n  add_executable(dem_geoid dem_geoid.cc)\n  target_link_libraries(dem_geoid ${GEOID_LIBRARIES} AspCore AspSessions)\n  install(TARGETS dem_geoid DESTINATION bin)\n  \n  add_executable(pc_align pc_align.cc)\n  target_link_libraries(pc_align \n    AspPcAlign AspSessions)\n  install(TARGETS pc_align DESTINATION bin)\n\n  add_executable(n_align n_align.cc)\n  target_link_libraries(n_align\n    AspPcAlign AspSessions)\n  install(TARGETS n_align DESTINATION bin)\n\n  # This must be built with C++14 as otherwise it fails. Must be set\n  # after the standard is set for the entire library.\n  # This is temporary\n  set_source_files_properties(\n      n_align.cc\n      PROPERTIES\n      CXX_STANDARD_REQUIRED ON\n      CXX_EXTENSIONS OFF # Keep consistent if desired\n      COMPILE_FLAGS \"-std=c++14\"\n  )\nendif()"
  },
  {
    "path": "src/asp/Tools/add_spot_rpc.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n/// Generate an approximate RPC model for a SPOT5 image.\n/// - The resulting model is appended to the end of the existing\n///   SPOT5 metadata file.\n/// - These files can then be used as input for stereo with -t rpc.\n\n\n#include <vw/FileIO/DiskImageView.h>\n#include <vw/Core/StringUtils.h>\n#include <vw/Cartography/Datum.h>\n#include <vw/Cartography/GeoReference.h>\n#include <vw/FileIO/DiskImageResourceRaw.h>\n#include <asp/Core/AspProgramOptions.h>\n#include <asp/Core/Macros.h>\n#include <asp/Core/FileUtils.h>\n#include <asp/Camera/CsmModel.h>\n#include <asp/Camera/SPOT_XML.h>\n#include <asp/Camera/LinescanSpotModel.h>\n#include <asp/Camera/RPCModel.h>\n#include <asp/Camera/RPCModelGen.h>\n#include <xercesc/util/PlatformUtils.hpp>\n\n#include <limits>\n#include <cstring>\n\n#include <boost/filesystem.hpp>\n#include <boost/algorithm/string.hpp>\n#include <boost/program_options.hpp>\n\nnamespace fs = boost::filesystem;\nnamespace po = boost::program_options;\n\nusing namespace vw;\nusing namespace vw::cartography;\nusing asp::RPCModel;\n\nstruct Options : public vw::GdalWriteOptions {\n  std::string input_path, output_path; \n  double min_height, max_height;\n  int    num_samples;\n  double penalty_weight;\n  Options(): min_height(-1), max_height(-1), num_samples(-1), penalty_weight(-1) {}\n};\n\nvoid handle_arguments(int argc, char *argv[], Options& opt) {\n  po::options_description general_options(\"\");\n  general_options.add_options()\n    (\"output-path,o\",   po::value(&opt.output_path), \"Specify the output path.\")\n    (\"min-height\",     po::value(&opt.min_height)->default_value(0),\n     \"The minimum height (in meters) above the WGS84 datum of the simulation box in which to compute the RPC approximation.\")\n    (\"max-height\",     po::value(&opt.max_height)->default_value(8000),\n     \"The maximum height (in meters) above the WGS84 datum of the simulation box in which to compute the RPC approximation.\")\n    (\"num-samples\",     po::value(&opt.num_samples)->default_value(100),\n     \"How many samples to use between the minimum and maximum heights.\")\n    (\"penalty-weight\",     po::value(&opt.penalty_weight)->default_value(0.1),\n     \"Penalty weight to use to keep the higher-order RPC coefficients small. Higher penalty weight results in smaller such coefficients.\");\n\n  general_options.add( vw::GdalWriteOptionsDescription(opt) );\n\n  po::options_description positional(\"\");\n  positional.add_options()\n    (\"input_path\", po::value(&opt.input_path), \"A SPOT5 Metadata file.\");\n\n  po::positional_options_description positional_desc;\n  positional_desc.add(\"input_path\", 1);\n\n  std::string usage(\"<input path>\");\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line(argc, argv, opt, general_options, general_options,\n\t\t\t    positional, positional_desc, usage,\n\t\t\t    allow_unregistered, unregistered);\n  \n  if ( opt.input_path.empty() )\n    vw_throw( ArgumentErr() << \"Missing input path.\\n\" << usage << general_options );\n\n  if ( opt.output_path.empty() ) {\n    vw_out() << \"Output path not provided, appending RPC model to the input metadata file.\\n\";\n    opt.output_path = opt.input_path;\n    \n  }\n}\n\n\n/// Generates the set of GDC/pixel pairs that will be fed into the solver.\nvoid generate_point_pairs(Options opt,\n                          Vector<double> &normalized_geodetics,\n                          Vector<double> &normalized_pixels,\n                          Vector3 &llh_scale, Vector3 &llh_offset,\n                          Vector2 &uv_scale,  Vector2 &uv_offset) {\n\n    // Load up the camera model from the camera file\n    xercesc::XMLPlatformUtils::Initialize();\n\n    // Load the input camera model (CSM linescan)\n    boost::shared_ptr<camera::CameraModel> cam_ptr\n      = boost::dynamic_pointer_cast<camera::CameraModel>(\n          asp::load_spot5_csm_camera_model_from_xml(opt.input_path));\n\n    // Load some image info\n    vw::ImageFormat format     = vw::DiskImageResourceRaw::image_format_from_spot5_DIM(opt.input_path);\n    Vector2         image_size = Vector2(format.cols, format.rows);\n\n    // Will have to change this if any SPOT5 data uses a different datum.\n    vw::cartography::Datum datum(\"WGS84\");\n\n    // Only generate point pairs up to this far from the valid boundaries.\n    // - There is no guarantee that a point right on the edge will safely project!\n    const double CONTRACTION = 0.10;\n\n    // Load the estimated image bounds from the XML file!\n    std::vector<vw::Vector2> lonlat_corners = asp::SpotXML::get_lonlat_corners(opt.input_path);\n    if (lonlat_corners.size() != 4)\n      vw::vw_throw(ArgumentErr() << \"Failed to parse lonlat corners of metadata file!\");\n\n    Vector2 top_left  = lonlat_corners[0]; // The corners should be loaded in this order.\n    Vector2 top_right = lonlat_corners[1];\n    //Vector2 bot_right = lonlat_corners[2];\n    Vector2 bot_left  = lonlat_corners[3];\n    \n    // These vectors are aligned with the image projected on to the ground and are \n    //  used to iterate through the coverage region of the image.\n    Vector2 col_axis = top_right - top_left;\n    Vector2 row_axis = bot_left  - top_left;\n    double  height_range = opt.max_height - opt.min_height;\n    \n    // Get a bounding box of the covered region (not all of the BBox has image coverage!)\n    BBox2 bounding_box;\n    for (std::size_t i=0; i<4; ++i)\n      bounding_box.grow(lonlat_corners[i]);\n    Vector3 min_llh_coord = Vector3(bounding_box.min()[0], bounding_box.min()[1], opt.min_height);\n    Vector3 max_llh_coord = Vector3(bounding_box.max()[0], bounding_box.max()[1], opt.max_height);\n    vw_out() << \"Min lon/lat/height coord: \" << min_llh_coord << std::endl;\n    vw_out() << \"Max lon/lat/height coord: \" << max_llh_coord << std::endl;\n\n    // Compute scale factors to describe the bounding box (aligned with ENU coordinate system)\n    llh_scale  = (max_llh_coord - min_llh_coord)/2.0; // half range\n    llh_offset = (max_llh_coord + min_llh_coord)/2.0; // center point\n    double pixel_max = vw::math::max(image_size);\n    uv_scale  = Vector2(pixel_max/2.0, pixel_max/2.0); // The long axis pixel is scaled to 1.0\n    uv_offset = image_size/2.0; // center point\n\n\n    // Number of points in x and y at which we will optimize the RPC\n    // model. Using 10 or 20 points gives roughly similar results.\n    // 20 points result in 20^3 input data for optimization, with the\n    // number of variable to optimize being just 78.\n    int num_pts = 20; // The number of points per axis\n    int num_total_pts = num_pts*num_pts*num_pts;\n    vw_out() << \"Attempting to project \" << num_total_pts << \" locations...\\n\";\n\n    // Initialize normalized data storage\n    normalized_geodetics.set_size(RPCModel::GEODETIC_COORD_SIZE*num_total_pts);\n    normalized_pixels.set_size(RPCModel::IMAGE_COORD_SIZE*num_total_pts\n                               + asp::RpcSolveLMA::NUM_PENALTY_TERMS);\n    for (std::size_t i = 0; i < normalized_pixels.size(); i++) {\n      // Important: The extra penalty terms are all set to zero here.\n      normalized_pixels[i] = 0.0; \n    }\n    \n    // Loop through the coverage area of the sattelite and generate pairs of \n    // normalized image/GDC training data using the SPOT5 camera model.\n    int success_count = 0;\n    int fail_count    = 0;\n    for (int x = 0; x < num_pts; x++){\n      for (int y = 0; y < num_pts; y++){\n        for (int z = 0; z < num_pts; z++){\n\n          // This is the test point location in our image normalized to 0 <> 1 range\n          Vector3 u( x/(num_pts - 1.0),\n                     y/(num_pts - 1.0),\n                     z/(num_pts - 1.0) );\n          // Shrink the point a little bit so we don't go all the way up to the valid boundaries.\n          u = elem_sum(elem_prod(u,1.0-CONTRACTION), (CONTRACTION/2.0));\n\n          // Obtain the lat/lon/height of this location\n          Vector2 lonlat = top_left + u[0]*col_axis + u[1]*row_axis;\n          Vector3 G      = Vector3(lonlat[0], lonlat[1], u[2]*height_range + opt.min_height);\n\n          // Convert the actual lonlat point to vector U in the -1 <> 1 range.\n          // - This vector is in a north-aligned coordinate system.\n          // - RPC expects inputs in this range so it can use them with the scaling values we computed.\n          Vector3 U = elem_quot((G - llh_offset), llh_scale);\n\n          // Convert from geodetic to geocentric coordinates\n          Vector3 P = datum.geodetic_to_cartesian(G); // xyz\n\n          Vector2 pxg;\n          try {\n            // Project the GCC coordinate into the SPOT5 camera model\n            pxg = cam_ptr->point_to_pixel(P);\n            //vw_out() << \"SUCESS location \" << G << \" === \" << u << \" === \" << U << \" into camera!  Skipping it.\\n\";\n          } catch (vw::camera::PointToPixelErr) {\n            //vw_out() << \"Failed to project location \" << G << \" === \" << u << \" === \" << U << \" into camera!  Skipping it.\\n\";\n            ++fail_count;\n            continue;\n          }\n\n          // Normalize the pixel to -1 <> 1 range\n          Vector2 pxn = elem_quot(pxg - uv_offset, uv_scale);\n\n          subvector(normalized_geodetics, RPCModel::GEODETIC_COORD_SIZE*success_count,\n                    RPCModel::GEODETIC_COORD_SIZE) = U;\n          subvector(normalized_pixels,    RPCModel::IMAGE_COORD_SIZE   *success_count,\n                    RPCModel::IMAGE_COORD_SIZE   ) = pxn;\n          success_count++;\n\n        } // End z loop\n      } // End y loop\n    } // End x loop\n\n    vw_out() << \"Successfully projected \" << success_count << \" locations.\\n\";\n    \n    // Update the sizes to reflect the number of successful point projections\n    const bool preserve = true;\n    normalized_geodetics.set_size(RPCModel::GEODETIC_COORD_SIZE*success_count, preserve);\n    normalized_pixels.set_size(RPCModel::IMAGE_COORD_SIZE*success_count\n                               + asp::RpcSolveLMA::NUM_PENALTY_TERMS, preserve);\n}\n\n\n// Save an XML file having all RPC information\nvoid save_xml(Vector3 const& llh_scale,\n              Vector3 const& llh_offset,\n              Vector2 const& pixel_scale,\n              Vector2 const& pixel_offset,\n              asp::RPCModel::CoeffVec const& line_num,\n              asp::RPCModel::CoeffVec const& line_den,\n              asp::RPCModel::CoeffVec const& samp_num,\n              asp::RPCModel::CoeffVec const& samp_den,\n              std::string const& out_cam_file){\n\n  std::string lineoffset   = vw::num_to_str(pixel_offset.y());\n  std::string sampoffset   = vw::num_to_str(pixel_offset.x());\n  std::string latoffset    = vw::num_to_str(llh_offset.y());\n  std::string longoffset   = vw::num_to_str(llh_offset.x());\n  std::string heightoffset = vw::num_to_str(llh_offset.z());\n  \n  std::string linescale   = vw::num_to_str(pixel_scale.y());\n  std::string sampscale   = vw::num_to_str(pixel_scale.x());\n  std::string latscale    = vw::num_to_str(llh_scale.y());\n  std::string longscale   = vw::num_to_str(llh_scale.x());\n  std::string heightscale = vw::num_to_str(llh_scale.z());\n\n  std::string linenumcoef = vw::vec_to_str(line_num);\n  std::string linedencoef = vw::vec_to_str(line_den);\n  std::string sampnumcoef = vw::vec_to_str(samp_num);\n  std::string sampdencoef = vw::vec_to_str(samp_den);\n\n  const std::string RPC_START_STR = \"<isd>\";\n  const std::string DIMAP_END_STR = \"</Dimap_Document>\";\n  bool dimap_file = false;\n  \n  vw_out() << \"Writing: \" << out_cam_file << std::endl;\n  // Try to open the file for read/write, if that fails just try\n  // to open it for writing.\n  std::fstream ofs;\n  ofs.open(out_cam_file.c_str(), std::fstream::in | std::fstream::out);\n  if (ofs.good()) {\n    // Navigate to the either the end of the file or \n    //  the correct location to insert the RPC info\n    std::string line;\n    while (std::getline(ofs, line)) {\n      if (line.find(\"Dimap_Document\") != std::string::npos)\n        dimap_file = true;\n      if (line.find(RPC_START_STR) != std::string::npos) {\n        ofs.seekg(-1*(RPC_START_STR.size()+1), std::ios_base::cur);\n        break;\n      }\n      if (line.find(DIMAP_END_STR) != std::string::npos) {\n        ofs.seekg(-1*(DIMAP_END_STR.size()+1), std::ios_base::cur);\n        break;\n      }\n    }\n  } else { // The file did not exist, create a new one.\n    ofs.open(out_cam_file.c_str(), std::fstream::out);\n  }\n  if (!ofs.good())\n    vw_throw( ArgumentErr() << \"Error writing to file:\" << out_cam_file);\n\n  // Write RPC to file in Digital Globe format  \n  ofs << \"<isd>\\n\";\n  ofs << \"    <RPB>\\n\";\n  ofs << \"        <SATID>SPOT5_PAN</SATID>\\n\";\n  ofs << \"        <IMAGE>\\n\";\n  ofs << \"            <LINEOFFSET>\"      << lineoffset   << \"</LINEOFFSET>\\n\";\n  ofs << \"            <SAMPOFFSET>\"      << sampoffset   << \"</SAMPOFFSET>\\n\";\n  ofs << \"            <LATOFFSET>\"       << latoffset    << \"</LATOFFSET>\\n\";\n  ofs << \"            <LONGOFFSET>\"      << longoffset   << \"</LONGOFFSET>\\n\";\n  ofs << \"            <HEIGHTOFFSET>\"    << heightoffset << \"</HEIGHTOFFSET>\\n\";\n  ofs << \"            <LINESCALE>\"       << linescale    << \"</LINESCALE>\\n\";\n  ofs << \"            <SAMPSCALE>\"       << sampscale    << \"</SAMPSCALE>\\n\";\n  ofs << \"            <LATSCALE>\"        << latscale     << \"</LATSCALE>\\n\";\n  ofs << \"            <LONGSCALE>\"       << longscale    << \"</LONGSCALE>\\n\";\n  ofs << \"            <HEIGHTSCALE>\"     << heightscale  << \"</HEIGHTSCALE>\\n\";\n  ofs << \"            <LINENUMCOEFList>\\n\";\n  ofs << \"                <LINENUMCOEF>\" << linenumcoef  << \"</LINENUMCOEF>\\n\";\n  ofs << \"            </LINENUMCOEFList>\\n\";\n  ofs << \"            <LINEDENCOEFList>\\n\";\n  ofs << \"                <LINEDENCOEF>\" << linedencoef  << \"</LINEDENCOEF>\\n\";\n  ofs << \"            </LINEDENCOEFList>\\n\";\n  ofs << \"            <SAMPNUMCOEFList>\\n\";\n  ofs << \"                <SAMPNUMCOEF>\" << sampnumcoef  << \"</SAMPNUMCOEF>\\n\";\n  ofs << \"            </SAMPNUMCOEFList>\\n\";\n  ofs << \"            <SAMPDENCOEFList>\\n\";\n  ofs << \"                <SAMPDENCOEF>\" << sampdencoef  << \"</SAMPDENCOEF>\\n\";\n  ofs << \"            </SAMPDENCOEFList>\\n\";\n  ofs << \"        </IMAGE>\\n\";\n  ofs << \"    </RPB>\\n\";\n  ofs << \"</isd>\\n\";\n  if (dimap_file) // Close of DIMAP files properly\n    ofs << DIMAP_END_STR;\n  ofs.close();\n}\n\n\nint main( int argc, char *argv[] ) {\n\n  Options opt;\n  try {\n    handle_arguments(argc, argv, opt);\n\n    // Generate all the point pairs using the input options\n    Vector<double> normalized_geodetics;\n    Vector<double> normalized_pixels;\n    Vector3 llh_scale, llh_offset;\n    Vector2 uv_scale,  uv_offset;\n    generate_point_pairs(opt, normalized_geodetics, normalized_pixels,\n                         llh_scale, llh_offset, uv_scale, uv_offset);\n\n    // Find the RPC coefficients\n    RPCModel::CoeffVec line_num, line_den, samp_num, samp_den;\n    bool refine_only = false;\n    asp::gen_rpc(// Inputs\n                 opt.penalty_weight,\n                 normalized_geodetics, normalized_pixels,  \n                 refine_only,\n                 // Outputs\n                 line_num, line_den, samp_num, samp_den);\n   \n    save_xml(llh_scale, llh_offset, uv_scale, uv_offset,  \n             line_num, line_den, samp_num, samp_den,  \n             opt.output_path);\n    \n  } ASP_STANDARD_CATCHES;\n  \n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/aster2asp.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// This program works with ASTER V004 data, in .hdf format, and with older V0003\n// data, when the inputs are expected to be a directory.\n\n// For V003, data. The workflow is as follows. Take as input a directory of\n// ASTER images. Apply radiometric correction to the VNIR_Band3N and VNIR_Band3B\n// images, writing <output-prefix>-Band3N.tif and <output-prefix>-Band3B.tif.\n// Generate RPC coefficients from input metadata and write\n// <output-prefix>-Band3N.xml and <output-prefix>-Band3B.xml. These files can\n// then be used as input for stereo with -t rpc.\n\n// References:\n// -----------\n// ASTER User Handbook Version 2\n// https://asterweb.jpl.nasa.gov/content/03_data/04_Documents/aster_user_guide_v2.pdf\n//\n// ASTER User Guide Version 4 (for V004 HDF format)\n// https://lpdaac.usgs.gov/documents/2265/ASTER_User_Guide_V4_pcP80n5.pdf\n//\n// https://lpdaac.usgs.gov/documents/175/ASTER_L1_Product_Specifications.pdf\n\n// IMPROVEMENT OF DEM GENERATION FROM ASTER IMAGES USING SATELLITE\n// JITTER ESTIMATION AND OPEN SOURCE IMPLEMENTATION\n// Luc Girod, Christopher Nutha, and Andreas Kaab\n// http://www.int-arch-photogramm-remote-sens-spatial-inf-sci.net/XL-1-W5/249/2015/isprsarchives-XL-1-W5-249-2015.pdf\n\n#include <asp/Camera/RPCModelGen.h>\n#include <asp/Core/AspProgramOptions.h>\n#include <asp/Core/AsterProc.h>\n#include <asp/Core/FileUtils.h>\n#include <asp/Core/Macros.h>\n\n#include <vw/Cartography/Datum.h>\n#include <vw/Cartography/GeoReference.h>\n#include <vw/Core/StringUtils.h>\n#include <vw/FileIO/DiskImageView.h>\n#include <vw/FileIO/FileUtils.h>\n\n#include <boost/algorithm/string.hpp>\n#include <boost/filesystem.hpp>\n#include <boost/program_options.hpp>\n\nnamespace fs = boost::filesystem;\nnamespace po = boost::program_options;\n\nusing namespace vw;\nusing namespace vw::cartography;\n\nstruct Options: public vw::GdalWriteOptions {\n  std::string input, output_prefix;\n  double min_height, max_height;\n  std::int64_t num_samples;\n  double penalty_weight;\n  bool keep_tmp_dir;\n  Options(): min_height(-1), max_height(-1), num_samples(-1), penalty_weight(-1),\n             keep_tmp_dir(false) {}\n};\n\nvoid handle_arguments(int argc, char *argv[], Options &opt) {\n\n  po::options_description general_options(\"\");\n  general_options.add_options()\n  (\"output-prefix,o\", po::value(&opt.output_prefix), \"Specify the output prefix.\")\n  (\"min-height\", po::value(&opt.min_height)->default_value(0),\n   \"The minimum height (in meters) above the WGS84 datum of the simulation \"\n   \"box in which to compute the RPC approximation.\")\n  (\"max-height\", po::value(&opt.max_height)->default_value(8.0e+3),\n   \"The maximum height (in meters) above the WGS84 datum of the simulation \"\n   \"box in which to compute the RPC approximation.\")\n  (\"num-samples\", po::value(&opt.num_samples)->default_value(100),\n   \"How many samples to use between the minimum and maximum heights.\")\n  (\"penalty-weight\", po::value(&opt.penalty_weight)->default_value(0.1),\n   \"Penalty weight to use to keep the higher-order RPC coefficients small. \"\n   \"Higher penalty weight results in smaller such coefficients.\")\n  (\"keep-tmp-dir\", po::bool_switch(&opt.keep_tmp_dir)->default_value(false),\n   \"Keep the temporary directory where HDF data is extracted (for debugging).\")\n  ;\n\n  general_options.add(vw::GdalWriteOptionsDescription(opt));\n\n  po::options_description positional(\"\");\n  positional.add_options()\n  (\"input\", po::value(&opt.input), \"An ASTER HDF file or input data directory.\");\n\n  po::positional_options_description positional_desc;\n  positional_desc.add(\"input\", 1);\n\n  std::string usage(\"<input hdf or directory> -o <output prefix>\");\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm = asp::check_command_line(argc, argv, opt, general_options,\n                                                 general_options, positional,\n                                                 positional_desc, usage,\n                                                 allow_unregistered, unregistered);\n\n  if (opt.input.empty())\n    vw_throw(ArgumentErr() << \"Missing input.\\n\"\n                           << usage << general_options);\n\n  if (opt.output_prefix.empty())\n    vw_throw(ArgumentErr() << \"Missing output prefix.\\n\"\n                           << usage << general_options);\n\n  // Create the output directory\n  vw::create_out_dir(opt.output_prefix);\n}\n\n// See if the input file matches the given pattern. If yes, store the result\n// in matched_file. If matched_file is not empty originally, that means\n// we have more than one match, which is not good.\nbool match_file(std::string const &input_file, std::string const &pattern,\n                std::string &matched_file) {\n\n  std::size_t it = input_file.find(pattern);\n\n  // No match\n  if (it == std::string::npos)\n    return false;\n\n  // Check if it does not match at the end of the string\n  if (it + pattern.size() != input_file.size())\n    return false;\n\n  // Must match L1A images\n  if (input_file.find(\"L1A\") == std::string::npos)\n    return false;\n\n  // We expect only one match\n  if (matched_file != \"\")\n    vw_throw(ArgumentErr() << \"Found two files matching: '\" << pattern\n                           << \"'. Those are: \" << matched_file << \" and \"\n                           << input_file << \"\\n\");\n\n  matched_file = input_file;\n\n  return true;\n}\n\n// Identify the appropriate inputs in the ASTER directory\nvoid locate_inputs(Options const &opt, std::string &nadir_image,\n                   std::string &back_image, std::string &nadir_sat_pos,\n                   std::string &back_sat_pos, std::string &nadir_sight_vec,\n                   std::string &back_sight_vec, std::string &nadir_corr_table,\n                   std::string &back_corr_table, std::string &nadir_longitude,\n                   std::string &back_longitude, std::string &nadir_latitude,\n                   std::string &back_latitude, std::string &nadir_lattice_point,\n                   std::string &back_lattice_point) {\n\n  // Iterate through all files\n  for (fs::directory_iterator itr(opt.input); itr != fs::directory_iterator(); itr++) {\n\n    std::string file = itr->path().string();\n\n    match_file(file, \"VNIR_Band3N.ImageData.tif\", nadir_image);\n    match_file(file, \"VNIR_Band3B.ImageData.tif\", back_image);\n\n    match_file(file, \"VNIR_Band3N.SatellitePosition.txt\", nadir_sat_pos);\n    match_file(file, \"VNIR_Band3B.SatellitePosition.txt\", back_sat_pos);\n\n    match_file(file, \"VNIR_Band3N.SightVector.txt\", nadir_sight_vec);\n    match_file(file, \"VNIR_Band3B.SightVector.txt\", back_sight_vec);\n\n    match_file(file, \"VNIR_Band3N.RadiometricCorrTable.txt\", nadir_corr_table);\n    match_file(file, \"VNIR_Band3B.RadiometricCorrTable.txt\", back_corr_table);\n\n    match_file(file, \"VNIR_Band3N.Longitude.txt\", nadir_longitude);\n    match_file(file, \"VNIR_Band3B.Longitude.txt\", back_longitude);\n\n    match_file(file, \"VNIR_Band3N.Latitude.txt\", nadir_latitude);\n    match_file(file, \"VNIR_Band3B.Latitude.txt\", back_latitude);\n\n    match_file(file, \"VNIR_Band3N.LatticePoint.txt\", nadir_lattice_point);\n    match_file(file, \"VNIR_Band3B.LatticePoint.txt\", back_lattice_point);\n  }\n\n  if (nadir_image == \"\")\n    vw_throw(ArgumentErr() << \"Could not locate the nadir-looking camera image \"\n                           << \"(VNIR_Band3N.ImageData.tif).\\n\");\n  if (back_image == \"\")\n    vw_throw(\n        ArgumentErr() << \"Could not locate the backward-looking camera image \"\n                      << \"(VNIR_Band3B.ImageData.tif).\\n\");\n\n  if (nadir_sat_pos == \"\")\n    vw_throw(ArgumentErr()\n             << \"Could not locate the nadir-looking satellite position \"\n             << \"(VNIR_Band3N.SatellitePosition.txt).\\n\");\n  if (back_sat_pos == \"\")\n    vw_throw(\n        ArgumentErr() << \"Could not locate the back-looking satellite position \"\n                      << \"(VNIR_Band3B.SatellitePosition.txt).\\n\");\n\n  if (nadir_sight_vec == \"\")\n    vw_throw(ArgumentErr() << \"Could not locate the nadir-looking sight vector \"\n                           << \"(VNIR_Band3N.SightVector.txt).\\n\");\n  if (back_sight_vec == \"\")\n    vw_throw(ArgumentErr() << \"Could not locate the back-looking sight vector \"\n                           << \"(VNIR_Band3B.SightVector.txt).\\n\");\n\n  if (nadir_corr_table == \"\")\n    vw_throw(\n        ArgumentErr()\n        << \"Could not locate the nadir-looking radiometric correction table \"\n        << \"(VNIR_Band3N.RadiometricCorrTable.txt).\\n\");\n  if (back_corr_table == \"\")\n    vw_throw(\n        ArgumentErr()\n        << \"Could not locate the back-looking radiometric correction table \"\n        << \"(VNIR_Band3B.RadiometricCorrTable.txt).\\n\");\n\n  if (nadir_longitude == \"\")\n    vw_throw(\n        ArgumentErr() << \"Could not locate the nadir-looking longitude file \"\n                      << \"(VNIR_Band3N.Longitude.txt).\\n\");\n  if (back_longitude == \"\")\n    vw_throw(\n        ArgumentErr() << \"Could not locate the back-looking longitude file \"\n                      << \"(VNIR_Band3B.Longitude.txt).\\n\");\n\n  if (nadir_latitude == \"\")\n    vw_throw(\n        ArgumentErr() << \"Could not locate the nadir-looking latitude file \"\n                      << \"(VNIR_Band3N.Latitude.txt).\\n\");\n  if (back_latitude == \"\")\n    vw_throw(ArgumentErr() << \"Could not locate the back-looking latitude file \"\n                           << \"(VNIR_Band3B.Latitude.txt).\\n\");\n\n  if (nadir_lattice_point == \"\")\n    vw_throw(ArgumentErr()\n             << \"Could not locate the nadir-looking lattice point file \"\n             << \"(VNIR_Band3N.LatticePoint.txt).\\n\");\n  if (back_lattice_point == \"\")\n    vw_throw(\n        ArgumentErr() << \"Could not locate the back-looking lattice point file \"\n                      << \"(VNIR_Band3B.LatticePoint.txt).\\n\");\n}\n\n// Generate lon-lat-height to image pixel correspondences that we will\n// use to create the RPC model.\nvoid generate_point_pairs(double min_height, double max_height,\n                          std::int64_t num_samples,\n                          double penalty_weight,\n                          std::string const &sat_pos_file,\n                          std::string const &sight_vec_file,\n                          std::string const &longitude_file,\n                          std::string const &latitude_file,\n                          std::string const &lattice_file,\n                          // Outputs\n                          std::vector<std::vector<vw::Vector3>> &world_sight_mat,\n                          Vector3 &llh_scale,\n                          Vector3 &llh_offset, Vector2 &pixel_scale,\n                          Vector2 &pixel_offset,\n                          Vector<double> &normalized_llh,\n                          Vector<double> &normalized_pixels) {\n\n  // Read the sight vectors\n  std::vector<Vector3> sight_vec;\n  asp::read_3d_points(sight_vec_file, sight_vec);\n\n  // Read the satellite positions\n  std::vector<Vector3> sat_pos;\n  asp::read_3d_points(sat_pos_file, sat_pos);\n\n  std::int64_t num_rows = sat_pos.size();\n  std::int64_t num_pts = sight_vec.size();\n  std::int64_t num_cols = num_pts / num_rows;\n\n  // Sight vector in world coordinates\n  world_sight_mat.clear();\n  world_sight_mat.resize(num_rows);\n\n  if (num_rows * num_cols != num_pts)\n    vw_throw(ArgumentErr() << \"Found \" << num_rows << \" satellite positions in \"\n                           << sat_pos_file << \" and \" << num_pts\n                           << \" sight vectors in \" << sight_vec_file\n                           << \". The latter must be a multiple of the former.\");\n\n  // For each satellite position there many sight vectors\n  // corresponding to pixel positions on that image line. Clone the\n  // satellite positions to make them one per each sight vector. It is\n  // easier to work with things that way later.\n  std::vector<Vector3> full_sat_pos(num_pts);\n  std::int64_t count = 0;\n  for (std::int64_t row = 0; row < num_rows; row++) {\n    for (std::int64_t col = 0; col < num_cols; col++) {\n      full_sat_pos[count] = sat_pos[row];\n      count++;\n    }\n  }\n  if (count != num_pts)\n    vw_throw(ArgumentErr() << \"Book-keeping failure!\\n\");\n\n  std::vector<double> longitude;\n  asp::read_vec(longitude_file, longitude);\n  if (std::int64_t(longitude.size()) != num_pts)\n    vw_throw(ArgumentErr() << \"Expecting \" << num_pts << \" longitude values in \"\n                           << longitude_file << \" but got instead \"\n                           << longitude.size() << \".\\n\");\n\n  std::vector<double> latitude;\n  asp::read_vec(latitude_file, latitude);\n  if (std::int64_t(latitude.size()) != num_pts)\n    vw_throw(ArgumentErr() << \"Expecting \" << num_pts << \" latitude values in \"\n                           << latitude_file << \" but got instead \"\n                           << latitude.size() << \".\\n\");\n\n  // Convert geocentric latitude to geodetic latitude.\n  // This applies to BOTH V003 (directory format) and V004 (HDF format) data:\n  //  - V003: ASTER provided geocentric lat/lon in text files\n  //  - V004: We compute geocentric lat/lon to match V003 convention\n  // Formula from pages 60 and 79 of ASTER V2 User Guide:\n  // https://asterweb.jpl.nasa.gov/content/03_data/04_Documents/aster_user_guide_v2.pdf\n  // Geodetic = Arctan [(tan (Latitude)) / 0.99330562]\n  double deg2rad = M_PI / 180.0;\n  for (std::size_t i = 0; i < latitude.size(); i++) {\n    latitude[i] = atan(tan(deg2rad * latitude[i]) / 0.99330562) / deg2rad;\n  }\n\n  std::vector<Vector2> pixels;\n  asp::read_2d_points(lattice_file, pixels);\n  if (std::int64_t(pixels.size()) != num_pts)\n    vw_throw(ArgumentErr() << \"Expecting \" << num_pts << \" pixels in \"\n                           << lattice_file << \" but got instead \"\n                           << pixels.size() << \".\\n\");\n\n  // Convert from geodetic coordinates to xyz\n  cartography::Datum datum;\n  datum.set_well_known_datum(\"WGS84\");\n  std::vector<Vector3> ground_xyz(num_pts);\n  for (std::int64_t i = 0; i < num_pts; i++)\n    ground_xyz[i] =\n        datum.geodetic_to_cartesian(Vector3(longitude[i], latitude[i], 0));\n\n  // Create the sight vectors, from the camera center to the ground, in world\n  // coordinates, rather than in spacecraft coordinates, like sight_vec.\n  for (std::int64_t pt = 0; pt < num_pts; pt++) {\n    Vector3 G = ground_xyz[pt];\n    Vector3 C = full_sat_pos[pt];\n    std::int64_t row = pt / num_cols;\n    world_sight_mat[row].push_back((G - C) / norm_2(G - C));\n  }\n  if (world_sight_mat.empty() ||\n      (std::int64_t)world_sight_mat[0].size() != num_cols)\n    vw_throw(ArgumentErr() << \"Incorrect number of world sight vectors.\\n\");\n\n  // Form num_samples layers between min_height and max_height.\n  // Each point there will have its corresponding pixel value.\n  std::int64_t num_total_pts = num_pts * num_samples;\n  std::vector<Vector3> all_llh(num_total_pts);\n  std::vector<Vector2> all_pixels(num_total_pts);\n  count = 0;\n  for (std::int64_t sample = 0; sample < num_samples; sample++) {\n    double height = min_height + double(sample) * (max_height - min_height) /\n                                     (num_samples - 1.0);\n\n    // Find an xyz position at roughly that height on the line\n    // connecting the original ground point and the satellite\n    // center. We need to solve a quadratic equation for that. We\n    // assume the Earth is a sphere.\n    for (std::int64_t pt = 0; pt < num_pts; pt++) {\n\n      Vector3 A = ground_xyz[pt];\n      Vector3 B = full_sat_pos[pt];\n      Vector3 D = B - A;\n\n      // Find t such that norm(A + t*D) = norm(A) + height\n      double d = dot_prod(A, D) * dot_prod(A, D) +\n                 dot_prod(D, D) * (height * height + 2 * norm_2(A) * height);\n      double t = (-dot_prod(A, D) + sqrt(d)) / dot_prod(D, D);\n      Vector3 P = A + t * D;\n\n      all_llh[count] = datum.cartesian_to_geodetic(P);\n      all_pixels[count] = pixels[pt];\n      count++;\n    }\n  }\n\n  // Find the range of lon-lat-heights\n  BBox3 llh_box;\n  for (std::size_t i = 0; i < all_llh.size(); i++)\n    llh_box.grow(all_llh[i]);\n\n  // Find the range of pixels\n  BBox2 pixel_box;\n  for (std::size_t i = 0; i < all_pixels.size(); i++)\n    pixel_box.grow(all_pixels[i]);\n\n  llh_scale = (llh_box.max() - llh_box.min()) / 2.0;  // half range\n  llh_offset = (llh_box.max() + llh_box.min()) / 2.0; // center point\n\n  pixel_scale = (pixel_box.max() - pixel_box.min()) / 2.0;  // half range\n  pixel_offset = (pixel_box.max() + pixel_box.min()) / 2.0; // center point\n\n  normalized_llh.set_size(asp::RPCModel::GEODETIC_COORD_SIZE * num_total_pts);\n  normalized_pixels.set_size(asp::RPCModel::IMAGE_COORD_SIZE * num_total_pts +\n                             asp::RpcSolveLMA::NUM_PENALTY_TERMS);\n  for (std::size_t i = 0; i < normalized_pixels.size(); i++) {\n    // Important: The extra penalty terms are all set to zero here.\n    normalized_pixels[i] = 0.0;\n  }\n\n  // Form the arrays of normalized pixels and normalized llh\n  for (std::int64_t pt = 0; pt < num_total_pts; pt++) {\n\n    // Normalize the pixel to -1 <> 1 range\n    Vector3 llh_n = elem_quot(all_llh[pt] - llh_offset, llh_scale);\n    Vector2 pixel_n = elem_quot(all_pixels[pt] - pixel_offset, pixel_scale);\n\n    subvector(normalized_llh, asp::RPCModel::GEODETIC_COORD_SIZE * pt,\n              asp::RPCModel::GEODETIC_COORD_SIZE) = llh_n;\n    subvector(normalized_pixels, asp::RPCModel::IMAGE_COORD_SIZE * pt,\n              asp::RPCModel::IMAGE_COORD_SIZE) = pixel_n;\n  }\n\n  return;\n}\n\n// Save an XML file having all RPC information\nvoid save_xml(std::int64_t image_cols, std::int64_t image_rows,\n              std::vector<std::vector<Vector2>> const &lattice_mat,\n              std::vector<std::vector<Vector3>> const &sight_mat,\n              std::vector<std::vector<Vector3>> const &world_sight_mat,\n              std::vector<Vector3> const &sat_pos, Vector3 const &llh_scale,\n              Vector3 const &llh_offset, Vector2 const &pixel_scale,\n              Vector2 const &pixel_offset,\n              asp::RPCModel::CoeffVec const &line_num,\n              asp::RPCModel::CoeffVec const &line_den,\n              asp::RPCModel::CoeffVec const &samp_num,\n              asp::RPCModel::CoeffVec const &samp_den,\n              std::string const &out_cam_file) {\n\n  std::string lineoffset = vw::num_to_str(pixel_offset.y());\n  std::string sampoffset = vw::num_to_str(pixel_offset.x());\n  std::string latoffset = vw::num_to_str(llh_offset.y());\n  std::string longoffset = vw::num_to_str(llh_offset.x());\n  std::string heightoffset = vw::num_to_str(llh_offset.z());\n\n  std::string linescale = vw::num_to_str(pixel_scale.y());\n  std::string sampscale = vw::num_to_str(pixel_scale.x());\n  std::string latscale = vw::num_to_str(llh_scale.y());\n  std::string longscale = vw::num_to_str(llh_scale.x());\n  std::string heightscale = vw::num_to_str(llh_scale.z());\n\n  std::string linenumcoef = vw::vec_to_str(line_num);\n  std::string linedencoef = vw::vec_to_str(line_den);\n  std::string sampnumcoef = vw::vec_to_str(samp_num);\n  std::string sampdencoef = vw::vec_to_str(samp_den);\n\n  vw_out() << \"Writing: \" << out_cam_file << std::endl;\n  std::ofstream ofs(out_cam_file.c_str());\n\n  ofs << \"<isd>\\n\";\n\n  // Rigorous camera model\n\n  // Lattice points\n  ofs << \"    <LATTICE_POINT>\\n\";\n  for (std::size_t row = 0; row < lattice_mat.size(); row++) {\n    for (std::size_t col = 0; col < lattice_mat[row].size(); col++) {\n      ofs << vw::vec_to_str(lattice_mat[row][col]) << std::endl;\n    }\n    ofs << std::endl;\n  }\n  ofs << \"    </LATTICE_POINT>\\n\";\n\n  // Sight vector\n  ofs << \"    <SIGHT_VECTOR>\\n\";\n  for (std::size_t row = 0; row < sight_mat.size(); row++) {\n    for (std::size_t col = 0; col < sight_mat[row].size(); col++) {\n      ofs << vw::vec_to_str(sight_mat[row][col]) << std::endl;\n    }\n    ofs << std::endl;\n  }\n  ofs << \"    </SIGHT_VECTOR>\\n\";\n\n  // Sight vector in world coordinates\n  ofs << \"    <WORLD_SIGHT_VECTOR>\\n\";\n  for (std::size_t row = 0; row < world_sight_mat.size(); row++) {\n    for (std::size_t col = 0; col < world_sight_mat[row].size(); col++) {\n      ofs << vw::vec_to_str(world_sight_mat[row][col]) << std::endl;\n    }\n    ofs << std::endl;\n  }\n  ofs << \"    </WORLD_SIGHT_VECTOR>\\n\";\n\n  // Satellite position\n  ofs << \"    <SAT_POS>\\n\";\n  for (std::size_t row = 0; row < sat_pos.size(); row++) {\n    ofs << vw::vec_to_str(sat_pos[row]) << std::endl;\n  }\n  ofs << \"    </SAT_POS>\\n\";\n\n  // Image size\n  ofs << \"    <IMAGE_COLS>\" << image_cols << \"</IMAGE_COLS>\\n\";\n  ofs << \"    <IMAGE_ROWS>\" << image_rows << \"</IMAGE_ROWS>\\n\";\n\n  // RPC\n  ofs << \"    <RPB>\\n\";\n  ofs << \"        <SATID>ASTER_L1A_VNIR_Band3</SATID>\\n\";\n  ofs << \"        <IMAGE>\\n\";\n  ofs << \"            <LINEOFFSET>\"         << lineoffset   << \"</LINEOFFSET>\\n\";\n  ofs << \"            <SAMPOFFSET>\"         << sampoffset   << \"</SAMPOFFSET>\\n\";\n  ofs << \"            <LATOFFSET>\"          << latoffset    << \"</LATOFFSET>\\n\";\n  ofs << \"            <LONGOFFSET>\"         << longoffset   << \"</LONGOFFSET>\\n\";\n  ofs << \"            <HEIGHTOFFSET>\"       << heightoffset << \"</HEIGHTOFFSET>\\n\";\n  ofs << \"            <LINESCALE>\"          << linescale    << \"</LINESCALE>\\n\";\n  ofs << \"            <SAMPSCALE>\"          << sampscale    << \"</SAMPSCALE>\\n\";\n  ofs << \"            <LATSCALE>\"           << latscale     << \"</LATSCALE>\\n\";\n  ofs << \"            <LONGSCALE>\"          << longscale    << \"</LONGSCALE>\\n\";\n  ofs << \"            <HEIGHTSCALE>\"        << heightscale  << \"</HEIGHTSCALE>\\n\";\n  ofs << \"            <LINENUMCOEFList>\\n\";\n  ofs << \"                <LINENUMCOEF>\"    << linenumcoef  << \"</LINENUMCOEF>\\n\";\n  ofs << \"            </LINENUMCOEFList>\\n\";\n  ofs << \"            <LINEDENCOEFList>\\n\";\n  ofs << \"                <LINEDENCOEF>\"    << linedencoef  << \"</LINEDENCOEF>\\n\";\n  ofs << \"            </LINEDENCOEFList>\\n\";\n  ofs << \"            <SAMPNUMCOEFList>\\n\";\n  ofs << \"                <SAMPNUMCOEF>\"    << sampnumcoef  << \"</SAMPNUMCOEF>\\n\";\n  ofs << \"            </SAMPNUMCOEFList>\\n\";\n  ofs << \"            <SAMPDENCOEFList>\\n\";\n  ofs << \"                <SAMPDENCOEF>\"    << sampdencoef  << \"</SAMPDENCOEF>\\n\";\n  ofs << \"            </SAMPDENCOEFList>\\n\";\n  ofs << \"        </IMAGE>\\n\";\n  ofs << \"    </RPB>\\n\";\n  ofs << \"</isd>\\n\";\n  ofs.close();\n}\n\n// Create XML files containing rigorous camera info, and compute the RPC\n// coefficients as well.\nvoid gen_xml(double min_height, double max_height, std::int64_t num_samples,\n             double penalty_weight, std::string const &image_file,\n             std::string const &sat_pos_file, std::string const &sight_vec_file,\n             std::string const &longitude_file,\n             std::string const &latitude_file, std::string const &lattice_file,\n             std::string const &out_cam_file) {\n\n  std::vector<std::vector<Vector2>> lattice_mat;\n  asp::read_matrix_from_file(lattice_file, lattice_mat);\n\n  std::vector<std::vector<Vector3>> sight_mat;\n  asp::read_matrix_from_file(sight_vec_file, sight_mat);\n\n  if (lattice_mat.empty() || sight_mat.empty() ||\n      lattice_mat.size() != sight_mat.size() ||\n      lattice_mat[0].size() != sight_mat[0].size()) {\n    vw_throw(ArgumentErr()\n             << \"Inconsistent lattice point and sight vector information.\\n\");\n  }\n\n  // Read the satellite positions\n  std::vector<Vector3> sat_pos;\n  asp::read_3d_points(sat_pos_file, sat_pos);\n  if (sat_pos.size() != sight_mat.size())\n    vw_throw(\n        ArgumentErr()\n        << \"Inconsistent satellite position and sight vector information.\\n\");\n\n  Vector3 llh_scale, llh_offset;\n  Vector2 pixel_scale, pixel_offset;\n  Vector<double> normalized_llh;\n  Vector<double> normalized_pixels;\n  std::vector<std::vector<vw::Vector3>>\n      world_sight_mat;  // sight dir in world coords\n  generate_point_pairs(min_height, max_height, num_samples, penalty_weight, sat_pos_file,\n                       sight_vec_file, longitude_file, latitude_file, lattice_file,\n                       // Outputs\n                       world_sight_mat, llh_scale, llh_offset, pixel_scale, pixel_offset,\n                       normalized_llh, normalized_pixels);\n\n  // Find the RPC coefficients\n  asp::RPCModel::CoeffVec line_num, line_den, samp_num, samp_den;\n  bool refine_only = false;\n  asp::gen_rpc(penalty_weight, normalized_llh, normalized_pixels, refine_only,\n               // Outputs\n               line_num, line_den, samp_num, samp_den);\n\n  DiskImageView<float> input_img(image_file);\n  std::int64_t image_cols = input_img.cols();\n  std::int64_t image_rows = input_img.rows();\n\n  save_xml(image_cols, image_rows, lattice_mat, sight_mat, world_sight_mat,\n           sat_pos, llh_scale, llh_offset, pixel_scale, pixel_offset, line_num,\n           line_den, samp_num, samp_den, out_cam_file);\n}\n\nint main(int argc, char *argv[]) {\n\n  Options opt;\n  try {\n    handle_arguments(argc, argv, opt);\n\n    // Track if we created a temp directory (for cleanup later)\n    std::string hdfOutDir = \"\";\n\n    // Check if input is an HDF file and extract data if so\n    if (boost::iends_with(opt.input, \".hdf\")) {\n      vw_out() << \"Reading HDF file: \" << opt.input << \"\\n\";\n      hdfOutDir = asp::genTmpDir(opt.output_prefix);\n      vw_out() << \"Creating directory \" << hdfOutDir\n               << \" for extracting data from HDF.\\n\";\n      asp::extractHdfData(opt.input, hdfOutDir);\n      vw_out() << \"HDF extraction complete.\\n\";\n      // Point the input to the temp directory so the rest of the code can find the files\n      opt.input = hdfOutDir;\n    }\n\n    std::string nadir_image, back_image, nadir_sat_pos, back_sat_pos;\n    std::string nadir_sight_vec, back_sight_vec;\n    std::string nadir_corr_table, back_corr_table;\n    std::string nadir_longitude, back_longitude;\n    std::string nadir_latitude, back_latitude;\n    std::string nadir_lattice_point, back_lattice_point;\n\n    locate_inputs(opt, nadir_image, back_image, nadir_sat_pos, back_sat_pos,\n                  nadir_sight_vec, back_sight_vec, nadir_corr_table,\n                  back_corr_table, nadir_longitude, back_longitude,\n                  nadir_latitude, back_latitude, nadir_lattice_point,\n                  back_lattice_point);\n\n    std::string out_nadir_image = opt.output_prefix + \"-Band3N.tif\";\n    std::string out_back_image = opt.output_prefix + \"-Band3B.tif\";\n\n    std::string out_nadir_cam = opt.output_prefix + \"-Band3N.xml\";\n    std::string out_back_cam = opt.output_prefix + \"-Band3B.xml\";\n\n    // Oddly, writing the xml files first, with output prefix \"run\", results in\n    // images later wiping the xml camera files. So write the images before the\n    // xml files.\n    asp::applyRadiometricCorrections(nadir_image, nadir_corr_table,\n                                     out_nadir_image, opt);\n    asp::applyRadiometricCorrections(back_image, back_corr_table,\n                                     out_back_image, opt);\n\n    vw_out() << \"Computing the camera models.\\n\";\n    gen_xml(opt.min_height, opt.max_height, opt.num_samples, opt.penalty_weight,\n            nadir_image, nadir_sat_pos, nadir_sight_vec, nadir_longitude,\n            nadir_latitude, nadir_lattice_point, out_nadir_cam);\n    gen_xml(opt.min_height, opt.max_height, opt.num_samples, opt.penalty_weight,\n            back_image, back_sat_pos, back_sight_vec, back_longitude,\n            back_latitude, back_lattice_point, out_back_cam);\n\n    // Clean up temporary directory if we created one\n    if (!hdfOutDir.empty()) {\n      if (opt.keep_tmp_dir) {\n        vw_out() << \"Keeping temporary directory: \" << hdfOutDir << \"\\n\";\n      } else {\n        vw_out() << \"Removing temporary directory: \" << hdfOutDir << \"\\n\";\n        fs::remove_all(hdfOutDir);\n      }\n    }\n  }\n  ASP_STANDARD_CATCHES;\n\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/bathy_plane_calc.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file bathy_plane_calc.cc\n\n#include <asp/Core/PointUtils.h>\n#include <asp/Core/Macros.h>\n#include <asp/Core/AspProgramOptions.h>\n#include <asp/Core/AspLog.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Sessions/StereoSessionFactory.h>\n#include <asp/Core/BathyPlaneCalc.h>\n\n#include <vw/FileIO/DiskImageUtils.h>\n#include <vw/Cartography/BathyStereoModel.h>\n#include <vw/Cartography/shapeFile.h>\n#include <vw/Camera/CameraModel.h>\n#include <vw/FileIO/FileUtils.h>\n\n#include <Eigen/Dense>\n\n#include <algorithm>\n#include <iostream>\n#include <iterator>\n#include <random>\n#include <set>\n#include <vector>\n\nnamespace po = boost::program_options;\n\nstruct Options: vw::GdalWriteOptions {\n  std::string shapefile, dem, mask, ortho_mask, camera, stereo_session, bathy_plane,\n    water_height_measurements, lon_lat_measurements, csv_format_str,\n    output_inlier_shapefile, bundle_adjust_prefix, output_outlier_shapefile,\n    mask_boundary_shapefile, dem_minus_plane;\n\n  double outlier_threshold;\n  int num_ransac_iterations, num_samples;\n  bool save_shapefiles_as_polygons;\n  Options(): outlier_threshold(0.5), num_ransac_iterations(1000) {}\n};\n\nvoid handle_arguments(int argc, char *argv[], Options& opt) {\n\n  po::options_description general_options(\"General Options\");\n  general_options.add_options()\n    (\"shapefile\",   po::value(&opt.shapefile),\n     \"The shapefile with vertices whose coordinates will be looked up in the DEM \"\n     \"with bilinear interpolation.\")\n    (\"dem\",   po::value(&opt.dem),\n     \"The DEM to use.\")\n    (\"mask\",   po::value(&opt.mask),\n     \"An input mask, created from a raw camera image and hence having the same dimensions. \"\n     \"Land pixels must have positive value. Water pixels must have non-positive value \"\n     \"or be no-data. The heights will be looked up in the DEM with bilinear \"\n     \"interpolation.\")\n    (\"camera\",   po::value(&opt.camera),\n     \"The camera file to use with the mask.\")\n    (\"bundle-adjust-prefix\", po::value(&opt.bundle_adjust_prefix),\n     \"Use the camera adjustment at this output prefix, if the cameras changed \"\n     \"based on bundle adjustment or alignment.\")\n    (\"session-type,t\",   po::value(&opt.stereo_session)->default_value(\"\"),\n     \"Select the stereo session type to use for processing. Usually the program can select \"\n     \"this automatically by the file extension, except for xml cameras. See the doc for options.\")\n    (\"bathy-plane\",   po::value(&opt.bathy_plane),\n     \"The output file storing the computed plane as four coefficients a, b, c, d, \"\n     \"with the plane being a*x + b*y + c*z + d = 0.\")\n    (\"outlier-threshold\",\n     po::value(&opt.outlier_threshold)->default_value(0.5),\n     \"A value, in meters, to determine the distance from a sampled point on the DEM to the \"\n     \"best-fit plane to determine if it will be marked as outlier and not \"\n     \"included in the calculation of that plane. Its value should be roughly the expected \"\n     \"vertical uncertainty of the DEM.\")\n    (\"num-ransac-iterations\",\n     po::value(&opt.num_ransac_iterations)->default_value(1000),\n     \"Number of RANSAC iterations to use to find the best-fitting plane.\")\n    (\"output-inlier-shapefile\", po::value(&opt.output_inlier_shapefile)->default_value(\"\"),\n     \"If specified, save at this location the shape file with the inlier vertices.\")\n    (\"output-outlier-shapefile\", po::value(&opt.output_outlier_shapefile)->default_value(\"\"),\n     \"If specified, save at this location the shape file with the outlier vertices.\")\n    (\"mask-boundary-shapefile\", po::value(&opt.mask_boundary_shapefile)->default_value(\"\"),\n     \"If specified, save the extracted points (before RANSAC) to this shapefile \"\n     \"and exit. When the input is a mask, a random sample is picked (their \"\n     \"number given by ``--num-samples``). The heights are looked up in the DEM \"\n     \"if not already present in the input.\")\n    (\"num-samples\",\n     po::value(&opt.num_samples)->default_value(10000),\n     \"Number of samples to pick at the water-land interface if using a mask.\")\n    (\"save-shapefiles-as-polygons\",\n     po::bool_switch(&opt.save_shapefiles_as_polygons)->default_value(false),\n     \"Save the inlier and outlier shapefiles as polygons, rather than \"\n     \"discrete vertices. May be more convenient for processing in a GIS tool.\")\n    (\"ortho-mask\",   po::value(&opt.ortho_mask),\n     \"An input mask, that is georeferenced and aligned with the DEM. Land pixels must \"\n     \"have positive value. Water pixels must have non-positive value or be no-data.\")\n    (\"lon-lat-measurements\",\n     po::value(&opt.lon_lat_measurements)->default_value(\"\"),\n     \"Use this CSV file having longitude and latitude measurements for the water surface. \"\n     \"The heights will be looked up in the DEM with bilinear interpolation. The option \"\n     \"--csv-format must be used.\")\n    (\"water-height-measurements\",\n     po::value(&opt.water_height_measurements)->default_value(\"\"),\n     \"Use this CSV file having longitude, latitude, and height measurements for the water \"\n     \"surface, in degrees and meters, respectively, relative to the WGS84 datum. The \"\n     \"option --csv-format must be used.\")\n    (\"csv-format\", po::value(&opt.csv_format_str)->default_value(\"\"),\n     \"Specify the format of the CSV file having water height measurements or lon and lat \"\n     \"values. The format should have a list of entries with syntax \"\n     \"column_index:column_type (indices start from 1). Example: '2:lon 3:lat \"\n     \"4:height_above_datum'.\")\n    (\"dem-minus-plane\",\n     po::value(&opt.dem_minus_plane),\n     \"If specified, subtract from the input DEM the best-fit plane and save the \"\n     \"obtained DEM to this GeoTiff file.\");\n\n  general_options.add(vw::GdalWriteOptionsDescription(opt));\n\n  po::options_description positional(\"\");\n  //positional.add_options()\n  //   (\"input-files\", po::value< std::vector<std::string> >(), \"Input files\");\n\n  po::positional_options_description positional_desc;\n  //positional_desc.add(\"input-files\", -1);\n\n  std::string usage(\"[options]\");\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line(argc, argv, opt, general_options, general_options,\n                            positional, positional_desc, usage,\n                            allow_unregistered, unregistered);\n\n  // Need this to be able to load adjusted camera models. This must be set\n  // before loading the cameras. \n  asp::stereo_settings().bundle_adjust_prefix = opt.bundle_adjust_prefix;\n\n  bool use_shapefile  = !opt.shapefile.empty();\n  bool use_mask       = !opt.mask.empty();\n  bool use_ortho_mask = !opt.ortho_mask.empty();\n  bool use_meas       = !opt.water_height_measurements.empty();\n  bool use_lon_lat    = !opt.lon_lat_measurements.empty();\n\n  if (use_mask && opt.camera.empty())\n    vw::vw_throw(vw::ArgumentErr() << \"If using a mask, must specify a camera.\\n\"\n             << usage << general_options);\n\n  if (use_shapefile + use_mask + use_ortho_mask + use_meas + use_lon_lat != 1)\n    vw::vw_throw(vw::ArgumentErr() \n              << \"Must use either a mask and camera, an ortho-mask, a shapefile, \"\n              << \"water height measurements, or lon-lat measurements, \"\n              << \"and just one of these.\\n\");\n\n  if (!use_meas && opt.dem == \"\")\n    vw::vw_throw(vw::ArgumentErr() << \"Missing the input dem.\\n\" << usage << general_options);\n\n  if (opt.bathy_plane.empty() && opt.mask_boundary_shapefile.empty())\n    vw::vw_throw(vw::ArgumentErr() << \"Must set either --bathy-plane or --mask-boundary-shapefile.\\n\"\n             << usage << general_options);\n\n  if ((use_meas || use_lon_lat) && opt.csv_format_str == \"\")\n    vw::vw_throw(vw::ArgumentErr() << \"Must set the option --csv-format.\\n\"\n             << usage << general_options);\n\n  if ((use_mask || use_ortho_mask) && opt.num_samples <= 0)\n    vw::vw_throw(vw::ArgumentErr() << \"A positive number of samples must be specified.\\n\"\n             << usage << general_options);\n\n  if (!opt.dem_minus_plane.empty() && opt.dem.empty())\n    vw::vw_throw(vw::ArgumentErr() << \"The option --dem must be set if using --dem-minus-plane.\\n\"\n             << usage << general_options);\n\n  // Create the output prefix  \n  std::string out_prefix = opt.bathy_plane;\n  if (opt.bathy_plane.empty())\n    out_prefix = opt.mask_boundary_shapefile;\n  // Remove the extension, which is the text after the last dot\n  size_t pos = out_prefix.rfind(\".\");\n  if (pos != std::string::npos)\n    out_prefix = out_prefix.substr(0, pos);\n\n  // Create the output directory and turn on logging to file\n  vw::create_out_dir(out_prefix);\n  asp::log_to_file(argc, argv, \"\", out_prefix);\n}\n\nint main(int argc, char *argv[]) {\n\n  Options opt;\n  try {\n    handle_arguments(argc, argv, opt);\n\n    // Load the camera if we use the mask and the camera\n    bool use_shapefile  = !opt.shapefile.empty();\n    bool use_mask       = !opt.mask.empty();\n    bool use_ortho_mask = !opt.ortho_mask.empty();\n    bool use_meas       = !opt.water_height_measurements.empty();\n    bool use_lon_lat    = !opt.lon_lat_measurements.empty();\n\n    vw::CamPtr camera_model;\n    if (use_mask) {\n      std::string out_prefix;\n      asp::SessionPtr\n        session(asp::StereoSessionFactory::create(opt.stereo_session, // may change\n                                                  opt,\n                                                  opt.mask, opt.mask,\n                                                  opt.camera, opt.camera,\n                                                  out_prefix));\n      camera_model = session->camera_model(opt.mask, opt.camera);\n    }\n\n    // Only WGS84 is supported. Note that dem_georef and shape_georef\n    // may or may not be overwritten below depending on the case.\n    vw::cartography::GeoReference dem_georef;\n    vw::cartography::Datum datum(\"WGS_1984\");\n    dem_georef.set_datum(datum);\n    dem_georef.set_geographic();\n    bool has_shape_georef = true;\n    vw::cartography::GeoReference shape_georef = dem_georef;\n\n    float dem_nodata_val = -std::numeric_limits<float>::max();\n    vw::ImageViewRef<float> dem;\n    vw::ImageViewRef<vw::PixelMask<float>> masked_dem;\n    vw::ImageViewRef<vw::PixelMask<float>> interp_dem;\n\n    if (use_shapefile || use_mask || use_ortho_mask || use_lon_lat || \n        !opt.dem_minus_plane.empty()) {\n      // Read the DEM and its associated data\n      // TODO(oalexan1): Think more about the interpolation method\n      vw::vw_out() << \"Reading the DEM: \" << opt.dem << \"\\n\";\n      if (!vw::cartography::read_georeference(dem_georef, opt.dem))\n        vw::vw_throw(vw::ArgumentErr() << \"The input DEM has no georeference.\\n\");\n\n      // We assume the WGS_1984 datum\n      if (dem_georef.datum().name() != \"WGS_1984\")\n        vw::vw_throw(vw::ArgumentErr() << \"The input DEM must be relative to the \"\n                  << \"WGS_1984 datum.\\n\" << \"Got: \" << dem_georef.datum().name() << \".\\n\");\n\n      // Note we use a float nodata\n      if (!vw::read_nodata_val(opt.dem, dem_nodata_val))\n        vw::vw_out() << \"Warning: Could not read the DEM nodata value. \"\n                 << \"Using: \" << dem_nodata_val << \".\\n\";\n      else\n        vw::vw_out() << \"Read DEM nodata value: \" << dem_nodata_val << \".\\n\";\n\n      // Read the DEM\n      dem = vw::DiskImageView<float>(opt.dem);\n      masked_dem = vw::create_mask(dem, dem_nodata_val);\n      vw::PixelMask<float> nodata_pix(0);\n      nodata_pix.invalidate();\n      vw::ValueEdgeExtension<vw::PixelMask<float>> ext_nodata(nodata_pix);\n      interp_dem = vw::interpolate(masked_dem, vw::BilinearInterpolation(), ext_nodata);\n      \n      shape_georef = dem_georef; // may get overwritten below\n    }\n\n    std::vector<Eigen::Vector3d> ecef_vec;\n    std::vector<vw::Vector3> llh_vec;\n    double proj_lat = -1.0, proj_lon = -1.0; \n    std::vector<vw::Vector2> shape_xy_vec;\n    vw::cartography::GeoReference stereographic_georef;\n    std::string poly_color = \"green\";\n\n    if (use_mask) {\n      // Use read_bathy_mask() which invalidates both nodata and non-positive\n      // pixels. Then apply_mask() converts to a plain float image with 0 for\n      // water, so the existing threshold logic works with threshold = 0.\n      vw::vw_out() << \"Reading the mask: \" << opt.mask << \"\\n\";\n      float mask_nodata_val = 0.0f;\n      {\n        float file_nodata = -std::numeric_limits<float>::max();\n        if (vw::read_nodata_val(opt.mask, file_nodata))\n          vw::vw_out() << \"Read mask nodata value: \" << file_nodata << \".\\n\";\n      }\n      auto masked = vw::read_bathy_mask(opt.mask, mask_nodata_val);\n      auto mask = vw::apply_mask(masked, 0.0f);\n      mask_nodata_val = 0.0f;\n      vw::vw_out() << \"Non-positive or nodata pixels are classified as water.\\n\";\n      shape_georef = dem_georef;\n      asp::sampleMaskBd(mask, mask_nodata_val,\n                        camera_model, shape_georef,\n                        dem_georef, masked_dem,\n                        opt.num_samples,\n                        ecef_vec, llh_vec,\n                        shape_xy_vec);\n\n    } else if (use_ortho_mask) {\n      // Read the ortho mask. Will overwrite shape_georef.\n      if (!vw::cartography::read_georeference(shape_georef, opt.ortho_mask))\n        vw::vw_throw(vw::ArgumentErr() << \"The input ortho-mask has no georeference.\\n\");\n      asp::sampleOrthoMaskBd(opt.ortho_mask, shape_georef, dem_georef, interp_dem,\n                             opt.num_samples, ecef_vec, llh_vec,\n                             shape_xy_vec);\n      \n    } else if (use_shapefile) {\n\n      // Read the shapefile, overwriting shape_georef\n      vw::vw_out() << \"Reading the shapefile: \" << opt.shapefile << \"\\n\";\n      std::vector<vw::geometry::dPoly> polyVec;\n      vw::geometry::read_shapefile(opt.shapefile, poly_color, has_shape_georef, \n                                   shape_georef, polyVec);\n      if (!has_shape_georef)\n        vw::vw_throw(vw::ArgumentErr() << \"The input shapefile has no georeference.\\n\");\n\n      // Find the ECEF coordinates of the shape corners\n      asp::find_points_at_shape_corners(polyVec, shape_georef, dem_georef, interp_dem, \n                                        ecef_vec, llh_vec, shape_xy_vec);\n    } else if (use_meas) {\n      asp::find_points_from_meas_csv(opt.water_height_measurements, opt.csv_format_str,\n                                     shape_georef,\n                                     // Outputs\n                                     ecef_vec, llh_vec, shape_xy_vec);\n    } else if (use_lon_lat) {\n      shape_georef = dem_georef;\n      has_shape_georef = true;\n      asp::find_points_from_lon_lat_csv(opt.lon_lat_measurements, opt.csv_format_str,\n                                        shape_georef, dem_georef, interp_dem,\n                                        // Outputs\n                                        ecef_vec, llh_vec, shape_xy_vec);\n    } else {\n      vw::vw_throw(vw::LogicErr() << \"Unhandled input case in bathy_plane_calc.cc.\\n\");\n    }\n\n    if (!opt.mask_boundary_shapefile.empty()) {\n      asp::saveShape(ecef_vec, opt.mask_boundary_shapefile);\n      return 0;\n    }\n\n    // See if to convert to local stereographic projection\n    std::vector<Eigen::Vector3d> local_proj_point_vec;\n    asp::find_projection(// Inputs\n                         dem_georef, llh_vec,\n                         // Outputs\n                         proj_lat, proj_lon,\n                         stereographic_georef,\n                         local_proj_point_vec);\n\n    // Compute the water surface using RANSAC\n    std::vector<size_t> inlier_indices;\n    double inlier_threshold = opt.outlier_threshold;\n    vw::Matrix<double> plane;\n    asp::calcBathyPlane(opt.num_ransac_iterations, inlier_threshold,\n                        local_proj_point_vec, plane, inlier_indices);\n    asp::calcPlaneProperties(local_proj_point_vec, inlier_indices,\n                             dem_georef, plane);\n    asp::saveBathyPlane(proj_lat, proj_lon,\n                        plane, opt.bathy_plane);\n\n    // Save the shape having the inliers.\n    if (opt.output_inlier_shapefile != \"\") {\n      vw::geometry::dPoly inlierPoly;\n      for (size_t inlier_it = 0; inlier_it < inlier_indices.size(); inlier_it++)\n        asp::addPointToPoly(inlierPoly, shape_xy_vec[inlier_indices[inlier_it]]);\n\n      if (opt.save_shapefiles_as_polygons) {\n        vw::geometry::dPoly localPoly;\n        asp::formSinglePoly(inlierPoly, localPoly);\n        inlierPoly = localPoly;\n      }\n\n      std::vector<vw::geometry::dPoly> inlierPolyVec;\n      inlierPolyVec.push_back(inlierPoly);\n      vw::vw_out() << \"Writing inlier shapefile: \" << opt.output_inlier_shapefile << \"\\n\";\n      vw::geometry::write_shapefile(opt.output_inlier_shapefile, has_shape_georef, \n                                     shape_georef, inlierPolyVec);\n    }\n\n    // Save the shape having the outliers.\n    if (opt.output_outlier_shapefile != \"\") {\n\n      // First put the inliers in a set so we can exclude them\n      std::set<int> inlier_set;\n      for (size_t inlier_it = 0; inlier_it < inlier_indices.size(); inlier_it++)\n        inlier_set.insert(inlier_indices[inlier_it]);\n\n      vw::geometry::dPoly outlierPoly;\n      for (size_t it = 0; it < shape_xy_vec.size(); it++) {\n\n        if (inlier_set.find(it) != inlier_set.end())\n          continue; // an inlier, skip it\n\n        asp::addPointToPoly(outlierPoly, shape_xy_vec[it]);\n      }\n\n      if (opt.save_shapefiles_as_polygons) {\n        vw::geometry::dPoly localPoly;\n        asp::formSinglePoly(outlierPoly, localPoly);\n        outlierPoly = localPoly;\n      }\n\n      std::vector<vw::geometry::dPoly> outlierPolyVec;\n      outlierPolyVec.push_back(outlierPoly);\n      vw::vw_out() << \"Writing outlier shapefile: \" << opt.output_outlier_shapefile << \"\\n\";\n      vw::geometry::write_shapefile(opt.output_outlier_shapefile, has_shape_georef, \n                                     shape_georef, outlierPolyVec);\n    }\n\n    if (opt.dem_minus_plane != \"\") {\n      bool has_nodata = true, has_georef = true;\n      vw::vw_out() << \"Writing: \" << opt.dem_minus_plane << \"\\n\";\n      vw::TerminalProgressCallback tpc(\"asp\", \": \");\n      auto dem_minus_plane \n        = asp::demMinusPlane(dem, dem_georef, plane, dem_nodata_val,\n                             stereographic_georef);\n      vw::cartography::block_write_gdal_image(opt.dem_minus_plane, dem_minus_plane, \n                                              has_georef, dem_georef, \n                                              has_nodata, dem_nodata_val, opt, tpc);\n    }\n\n  } ASP_STANDARD_CATCHES;\n\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/bathy_threshold_calc.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n'''\nFind the water-land threshold in an image (for example the band 7 of\na WorldView multispectral image by computing a kernel-density\nestimate using Gaussian kernels. A good threshold is usually the\nfirst minimum of this estimate.\n\nThis tool needs python 3, numpy, scipy, matplotlib, and osgeo.\n'''\n\nimport sys, time, math, argparse\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport scipy.stats as st\nfrom osgeo import gdal\nfrom scipy.signal import argrelextrema\n\n# Try to use sklearn as well, gives very similar results in very similar time.\n# Install this with:\n# conda install -c conda-forge scikit-learn\n\nuse_sklearn = False # off by default\nif use_sklearn:\n    from sklearn.neighbors import KernelDensity\n\nusage  = \"python bathy_threshold_calc.py --image <image> --num-samples <num>.\"\n\nparser = argparse.ArgumentParser(usage=usage,\n                                 formatter_class=argparse.RawTextHelpFormatter)\n\nparser.add_argument('--image',  dest = 'image', default = \"\", \n                    help='The single-channel image to use to find the water-land threshold.')\n\nparser.add_argument(\"--num-samples\",  dest=\"num_samples\", type=int, default = 1000000,\n                    help=\"The number of samples to pick from the image (more samples \" +\n                    \"will result in more accuracy but will be slower).\")\n\nparser.add_argument(\"--no-plot\", action=\"store_true\", default=False,\n                        dest=\"no_plot\",  help=\"Do not show the plot.\")\n\n(options, args) = parser.parse_known_args(sys.argv)\n\nif options.image == \"\":\n    parser.print_help()\n    sys.exit(1)\n\nprint(\"Image file is \" + options.image)\nprint(\"Number of samples is \" + str(options.num_samples))\n\n# Try to read the file using GDAL\ntry:\n    ds = gdal.Open(options.image, gdal.GA_ReadOnly)\n\n    if ds is None:\n        print(\"Could not read the file: \" + options.image)\n        sys.exit(1)\n\n    if ds.RasterCount != 1:\n        print(\"Expecting one band in \" + options.image + \", but got instead: \" +\n               str(ds.RasterCount) + \".\")\n        sys.exit(1)\n        \n    rb = ds.GetRasterBand(1)\n    image = rb.ReadAsArray()\n    \nexcept Exception as err:\n    print(\"Could not read the file: \" + options.image)\n    print(\"It must exist and be a single-band TIF file.\")\n    sys.exit(1)\n    \nnum_rows = image.shape[0]\nnum_cols = image.shape[1]\n\nif num_rows <= 0 or num_cols <= 0:\n    print(\"Expecting an image with positive dimensions\")\n    sys.exit(1)\n    \nnum_vals = num_rows * num_cols\nsamp_ratio = math.sqrt( float(num_vals) / float(options.num_samples) )\nif samp_ratio < 1.0:\n    samp_ratio = 1.0\n    \nnum_sub_rows = round(num_rows / samp_ratio)\n\nif num_sub_rows < 1:\n    num_sub_rows = 1\nif num_sub_rows > num_rows:\n    num_sub_rows = num_rows\n    \nnum_sub_cols = round(num_cols / samp_ratio)\nif num_sub_cols < 1:\n    num_sub_cols = 1\nif num_sub_cols > num_cols:\n    num_sub_cols = num_cols\n\nprint(\"Number of image rows and columns: \" + str(num_rows) + \", \" + str(num_cols))\nprint(\"Picking a uniform sample of dimensions \" + str(num_sub_rows) + \", \" + str(num_sub_cols))\nprint(\"Please be patient. It may take several minutes to find the answer.\")\n\n# Subsample uniformly the image\nsub_rows = np.round(np.array(range(num_sub_rows)) * float(num_rows - 1)/float(num_sub_rows - 1))\nsub_cols = np.round(np.array(range(num_sub_cols)) * float(num_cols - 1)/float(num_sub_cols - 1))\nsub_rows = sub_rows.astype(int)\nsub_cols = sub_cols.astype(int)\nsub_image = image[sub_rows, :][:, sub_cols]\n\n# Make it into an array\ndata = sub_image.reshape(-1)\nxvals = np.linspace(data.min(), data.max(), 1000)\n\nbeg = time.time()\nkde = st.gaussian_kde(data)\nyvals = kde(xvals)\nmin_pos  = argrelextrema(yvals, np.less)\nmin_vals = xvals[min_pos]\nend = time.time()\n\n# Note that it is not universal for it to be first minimum. Sometimes\n# the second minimum is better!\nprint(\"Positions of the minima: \", min_vals)\nprint(\"Suggested threshold is the position of the first minimum: \", min_vals[0])\nprint(\"Please verify with the graph. There is a chance subsequent minima may work better.\")\nprint(\"Elapsed time in seconds:\", round(10.0*(end - beg))/10.0)\n\n# sklearn, with similar results\nif use_sklearn:\n    beg2 = time.time()\n    kernel = 'gaussian'\n    kde2 = KernelDensity(kernel = kernel, bandwidth = 10).fit(data[:, np.newaxis])\n    log_dens = kde2.score_samples(xvals[:, np.newaxis])\n    yvals2 = np.exp(log_dens).reshape(-1)\n    min_pos2 = argrelextrema(yvals2, np.less); min_vals2 = xvals[min_pos2]\n    end2 = time.time()\n    print(\"Elapsed time for sklearn kernel estimation in seconds:\", round(10.0*(end2 - beg2))/10.0)\n    print(\"Suggested threshold is the position of the first minimum2: \", min_vals2[0])\n    print(\"Positions of the minima2: \", min_vals2)\n    \n# Plot the kernel-density estimate and highlight the minima\nif not options.no_plot:\n    plt.figure(1)\n    plt.hist(data, bins=100, density=True, label=\"Data histogram\")\n    plt.plot(xvals, yvals, label=\"KDE\", c=\"red\")\n    plt.vlines(min_vals, ymin=0, ymax=yvals.max(),colors='g', ls=\"--\", label=\"Minima\", alpha=0.7)\n    \n    if use_sklearn:\n        plt.plot(xvals, yvals2, color = 'green', lw = 2,\n                 linestyle='-', label=\"kernel = '{0}'\".format(kernel))\n    \n    plt.legend()\n    plt.show()\n"
  },
  {
    "path": "src/asp/Tools/bias_dg_cam.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n# A script to bias the EPH (positions) and ATT (orientations) fields\n# in a Maxar (DigitalGlobe) linescan camera.\n\nimport sys, os, re, optparse\n\ntry:\n    usage = \"Usage: bias_dg_cam.py --position-bias 'x y z' --orientation-bias 'x y z w' \" + \\\n            \"-i input.xml -o output.xml\" \n    \n    parser = optparse.OptionParser(usage=usage)\n    parser.add_option(\"--position-bias\", dest=\"position_bias\",\n                      help=\"A list of four numbers, in quotes, having the values to add \" + \\\n                      \"to positions, in meters.\")\n    parser.add_option(\"--orientation-bias\", dest=\"orientation_bias\",\n                      help=\"A list of four numbers, in quotes, having the values to \" + \\\n                      \"add to quaternions (orientations), in order x, y, z, w.\")\n    parser.add_option(\"-i\", \"--input-camera\", dest=\"in_cam\",\n                      help=\"Output camera.\", type=\"string\")\n    parser.add_option(\"-o\", \"--output-camera\", dest=\"out_cam\",\n                      help=\"Output camera.\", type=\"string\")\n\n    (opt, args) = parser.parse_args()\n    \nexcept optparse.OptionError as msg:\n    raise Usage(msg)\n\nif opt.in_cam is None or opt.out_cam is None:\n    print(\"Must specify input and output cameras.\\n\" + usage)\n    sys.exit(1)\n    \nif opt.position_bias is None or opt.orientation_bias is None:\n    print(\"Must specify the position and orientation bias.\\n\" + usage)\n    sys.exit(1)\n\nvals = opt.position_bias.split()\nif len(vals) != 3:\n    print(\"Must have three values for the position bias, enclosed in quotes.\")\n    sys.exit(1)\n\nposition_bias = []    \nfor val in vals:\n    position_bias.append(float(val))\n    \nvals = opt.orientation_bias.split()\nif len(vals) != 4:\n    print(\"Must have four values for the orientation bias, enclosed in quotes.\")\n    sys.exit(1)\n\norientation_bias = []    \nfor val in vals:\n    orientation_bias.append(float(val))\n\nprint(\"Reading: \" + opt.in_cam)\nhandle = open(opt.in_cam, 'r')\nlines = handle.readlines()\nhandle.close()\n\nfor count in range(len(lines)):\n    line = lines[count]\n    \n    m = re.search('^(.*?<EPHEMLIST>)(.*?)(</EPHEMLIST>.*?\\n)', line)\n    if m:\n        ephem = m.group(2)\n        vals = ephem.split()\n        # Modify values with index 1, 2, 3 (not 0) representing positions\n        for it in range(1, 4):\n            vals[it] = str(float(vals[it]) + position_bias[it - 1])\n        ephem = \" \".join(vals)\n        lines[count] = m.group(1) + ephem + m.group(3)\n\n    m = re.search('^(.*?<ATTLIST>)(.*?)(</ATTLIST>.*?\\n)', line)\n    if m:\n        att = m.group(2)\n        vals = att.split()\n        # Modify values with index 1, 2, 3, 4 (not 0), representing quaternions\n        for it in range(1, 5):\n            vals[it] = str(float(vals[it]) + orientation_bias[it - 1])\n        att = \" \".join(vals)\n        lines[count] = m.group(1) + att + m.group(3)\n\nprint(\"Writing: \" + opt.out_cam)\nhandle = open(opt.out_cam, 'w')\nhandle.writelines(lines)\nhandle.close()\n"
  },
  {
    "path": "src/asp/Tools/bundle_adjust.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file bundle_adjust.cc\n\n// TODO(oalexan1): Break this up into several files grouped by functionality.\n// See existing BundleAdjustCamera.cc, etc.\n#include <asp/Sessions/BundleAdjustParse.h>\n#include <asp/Sessions/StereoSession.h>\n#include <asp/Sessions/CameraUtils.h>\n#include <asp/Sessions/BundleAdjustSession.h>\n#include <asp/Camera/BundleAdjustOptions.h>\n#include <asp/Camera/BundleAdjustResiduals.h>\n#include <asp/Camera/BundleAdjustOutliers.h>\n#include <asp/Camera/BundleAdjustIsis.h>\n#include <asp/Camera/BundleAdjustEigen.h>\n#include <asp/Camera/BaseCostFuns.h>\n#include <asp/Camera/BundleAdjustCostFuns.h>\n#include <asp/Camera/LinescanUtils.h>\n#include <asp/Camera/CsmModel.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/Nvm.h>\n#include <asp/Core/PointUtils.h>\n#include <asp/Core/Macros.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/IpMatchingAlgs.h>\n#include <asp/Core/ImageUtils.h>\n#include <asp/Core/ImageNormalization.h>\n#include <asp/Core/OutlierProcessing.h>\n#include <asp/Core/BundleAdjustUtils.h>\n#include <asp/Core/InterestPointMatching.h>\n#include <asp/Core/FileUtils.h>\n\n#include <vw/Camera/CameraUtilities.h>\n#include <vw/Core/CmdUtils.h>\n#include <vw/FileIO/MatrixIO.h>\n#include <vw/InterestPoint/MatcherIO.h>\n#include <vw/Cartography/GeoTransform.h>\n#include <vw/Cartography/GeoReferenceBaseUtils.h>\n#include <vw/Cartography/DatumUtils.h>\n#include <vw/BundleAdjustment/ControlNetworkLoader.h>\n#include <vw/BundleAdjustment/CameraRelation.h>\n#include <vw/Camera/PinholeModel.h>\n#include <vw/Camera/LensDistortion.h>\n#include <vw/Camera/OpticalBarModel.h>\n#include <vw/FileIO/FileTypes.h>\n#include <vw/FileIO/FileUtils.h>\n\n// Can't do much about warnings in boost except to hide them\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wdeprecated-declarations\"\n#include <boost/algorithm/string.hpp>\n#include <boost/filesystem/operations.hpp>\n#include <boost/filesystem/fstream.hpp>\n#include <boost/foreach.hpp>\n#pragma GCC diagnostic pop\n\n#include <xercesc/util/PlatformUtils.hpp>\n\n#include <set>\n\nnamespace fs = boost::filesystem;\n\nusing namespace vw;\nusing namespace asp;\nusing namespace vw::camera;\nusing namespace vw::ba;\n\n// A callback to invoke at each iteration if desiring to save the cameras\n// at that time.\nclass BaCallback: public ceres::IterationCallback {\npublic:\n\n  BaCallback(asp::BaOptions const& opt, asp::BaParams const& param_storage):\n    m_opt(opt), m_param_storage(param_storage) {}\n\n  virtual ceres::CallbackReturnType operator() (const ceres::IterationSummary& summary) {\n    saveUpdatedCameras(m_opt, m_param_storage);\n    return ceres::SOLVER_CONTINUE;\n  }\n\nprivate:\n  asp::BaOptions const& m_opt;\n  asp::BaParams const& m_param_storage;\n};\n\n// One pass of bundle adjustment\nint baOnePass(asp::BaOptions                & opt,\n              asp::CRN                const & crn,\n              bool                            first_pass,\n              bool                            remove_outliers,\n              asp::BaParams                 & param_storage, // output\n              asp::BaParams const           & orig_parameters,\n              std::vector<vw::CamPtr>  const& orig_cams,\n              std::vector<std::vector<vw::Vector3>> const& orig_cam_positions,\n              bool                          & convergence_reached,\n              double                        & final_cost) {\n\n  ControlNetwork & cnet = *opt.cnet;\n  int num_cameras = param_storage.num_cameras();\n  int num_points  = param_storage.num_points();\n\n  if ((int)crn.size() != num_cameras)\n    vw_throw(ArgumentErr() << \"Book-keeping error, the size of CameraRelationNetwork \"\n             << \"must equal the number of images.\\n\");\n\n  convergence_reached = true;\n\n  if (opt.proj_win != BBox2(0, 0, 0, 0) && (!opt.proj_str.empty()))\n    asp::filterOutliersProjWin(opt, param_storage, cnet);\n\n  // How many times an xyz point shows up in the problem\n  std::vector<int> count_map(num_points);\n  for (int i = 0; i < num_points; i++) {\n    if (param_storage.get_point_outlier(i))\n      count_map[i] = 0; // skip outliers\n    else\n      count_map[i] = cnet[i].size(); // Get number of observations of this point.\n  }\n\n  // We will optimize multipliers of the intrinsics. This way each intrinsic\n  // changes by a scale specific to it. Note: See --min-distortion for initial\n  // values of the lens distortion coeffs when distortion is optimized.\n\n  // Prepare for the DEM constraint.\n  // TODO(oalexan1): Study how to best pass the DEM to avoid the code\n  // below not being slow. It is not clear if the DEM tiles are cached\n  // when passing around an ImageViewRef.\n  bool have_dem = (!opt.heights_from_dem.empty());\n  std::vector<Vector3> dem_xyz_vec;\n  vw::cartography::GeoReference dem_georef;\n  ImageViewRef<PixelMask<double>> masked_dem;\n  std::set<int> outliers;\n  if (have_dem) {\n    for (int ipt = 0; ipt < num_points; ipt++) {\n      if (param_storage.get_point_outlier(ipt))\n        outliers.insert(ipt);\n    }\n  }\n  if (opt.heights_from_dem != \"\") {\n    vw::vw_out() << \"Constraining against DEM: \" << opt.heights_from_dem << \"\\n\";\n    asp::create_masked_dem(opt.heights_from_dem, dem_georef, masked_dem);\n    asp::updateTriPtsFromDem(cnet, outliers, opt.camera_models,\n                             dem_georef, masked_dem,\n                             dem_xyz_vec); // output\n  }\n\n  // If to use a weight image\n  bool have_weight_image = (!opt.weight_image.empty());\n  vw::ImageViewRef<vw::PixelMask<float>> weight_image;\n  float weight_image_nodata = -std::numeric_limits<float>::max();\n  vw::cartography::GeoReference weight_image_georef;\n  if (have_weight_image)\n    vw::cartography::readGeorefImage(opt.weight_image,\n      weight_image_nodata, weight_image_georef, weight_image);\n\n  // Add the various cost functions the solver will optimize over.\n  ceres::Problem problem;\n\n  // Handle fixed distortion indices. Manually freeing up this pointer at the\n  // end results in a crash.\n  ceres::SubsetManifold *dist_opts = NULL;\n  if (!opt.fixed_distortion_indices.empty())\n    dist_opts = new ceres::SubsetManifold(param_storage.m_max_num_dist_params,\n                                          opt.fixed_distortion_indices);\n\n  // Pixel reprojection error\n  std::vector<size_t> cam_residual_counts, num_pixels_per_cam;\n  std::vector<std::vector<vw::Vector2>> pixels_per_cam;\n  std::vector<std::vector<vw::Vector3>> tri_points_per_cam;\n  std::vector<std::map<int, vw::Vector2>> pixel_sigmas;\n  asp::addPixelReprojCostFun(opt, crn, count_map, weight_image, weight_image_georef,\n                             dem_xyz_vec, have_weight_image, have_dem,\n                             // Outputs\n                             cnet, param_storage, dist_opts, problem, cam_residual_counts,\n                             num_pixels_per_cam, pixels_per_cam, tri_points_per_cam,\n                             pixel_sigmas);\n\n  // Add ground control points or points based on a DEM constraint\n  int num_gcp = 0, num_gcp_or_dem_residuals = 0;\n  asp::addGcpOrDemConstraint(opt, opt.cost_function, opt.use_llh_error, opt.fix_gcp_xyz,\n                             // Outputs\n                             cnet, num_gcp, num_gcp_or_dem_residuals,\n                             param_storage, problem);\n\n  // Add camera constraints\n  if (opt.camera_weight > 0) {\n    for (int icam = 0; icam < num_cameras; icam++) {\n      double const* orig_cam_ptr = orig_parameters.get_camera_ptr(icam);\n      ceres::CostFunction* cost_function = CamError::Create(orig_cam_ptr, opt.camera_weight);\n\n      // Don't use the same loss function as for pixels since that one discounts\n      //  outliers and the cameras should never be discounted.\n      // TODO(oalexan1): This will prevent convergence in some cases!\n      ceres::LossFunction* loss_function = new ceres::TrivialLoss();\n\n      double * camera  = param_storage.get_camera_ptr(icam);\n      problem.AddResidualBlock(cost_function, loss_function, camera);\n    } // End loop through cameras.\n  }\n\n  // Finer level control of only rotation. See also --camera-position-weight.\n  // Note: A strong constraint here can prevent convergence as the is no loss function.\n  // Camera position and tri constraints are suggested instead.\n  if (opt.rotation_weight > 0) {\n    for (int icam = 0; icam < num_cameras; icam++) {\n      double const* orig_cam_ptr = orig_parameters.get_camera_ptr(icam);\n      double translation_weight = 0.0; // This is handled separately\n      ceres::CostFunction* cost_function\n        = RotTransError::Create(orig_cam_ptr, opt.rotation_weight, translation_weight);\n      ceres::LossFunction* loss_function = new ceres::TrivialLoss();\n      double * camera  = param_storage.get_camera_ptr(icam);\n      problem.AddResidualBlock(cost_function, loss_function, camera);\n    }\n  }\n\n  int num_uncertainty_residuals = 0;\n  if (opt.camera_position_uncertainty.size() > 0) {\n    for (int icam = 0; icam < num_cameras; icam++) {\n      // orig_ctr has the actual camera center, but orig_cam_ptr may have only an adjustment.\n      // For linescan camera, pick the camera center from the middle of the array of \n      // centers. It will be used to determine horizontal and vertical components.\n      vw::Vector3 orig_ctr = orig_cams[icam]->camera_center(vw::Vector2());\n      double const* orig_cam_ptr = orig_parameters.get_camera_ptr(icam);\n      double * cam_ptr  = param_storage.get_camera_ptr(icam);\n      int param_len = 6; // bundle_adjust and jitter_solve expect different lengths\n      double weight = 1.0;\n      ceres::CostFunction* cost_function\n        = CamUncertaintyError::Create(orig_ctr, orig_cam_ptr, param_len,\n                                      opt.camera_position_uncertainty[icam],\n                                      weight, opt.datum,\n                                      opt.camera_position_uncertainty_power);\n      ceres::LossFunction* loss_function = new ceres::TrivialLoss();\n      problem.AddResidualBlock(cost_function, loss_function, cam_ptr);\n      num_uncertainty_residuals++;\n    }\n  }\n\n  // Add a soft constraint to keep the cameras near the original position. Add one\n  // constraint per reprojection error.\n  int num_cam_pos_residuals = 0;\n  if (opt.camera_position_weight > 0)\n    asp::addCamPosCostFun(opt, orig_parameters, pixels_per_cam,\n                          tri_points_per_cam, pixel_sigmas, orig_cams,\n                          param_storage, problem, num_cam_pos_residuals);\n\n  // Add a cost function meant to tie up to known disparity\n  // (option --reference-terrain).\n  std::vector<vw::Vector3> reference_vec; // must be persistent\n  std::vector<ImageViewRef<DispPixelT>> interp_disp; // must be persistent\n  if (opt.reference_terrain != \"\")\n    asp::addRefTerrainCostFun(opt, param_storage, problem,\n                              reference_vec, interp_disp);\n\n  // Add a ground constraints to keep points close to their initial positions\n  int num_tri_residuals = 0;\n  if (opt.tri_weight > 0)\n    asp::addTriConstraint(opt, cnet, crn, opt.image_files, orig_cams,\n                          opt.tri_weight, opt.cost_function, opt.tri_robust_threshold,\n                          // Outputs\n                          param_storage, problem, num_tri_residuals);\n\n  const size_t MIN_KML_POINTS = 50;\n  size_t kmlPointSkip = 30;\n  // Figure out a good KML point skip amount\n  if (num_points / kmlPointSkip < MIN_KML_POINTS)\n    kmlPointSkip = num_points / MIN_KML_POINTS;\n  if (kmlPointSkip < 1)\n    kmlPointSkip = 1;\n\n  if (first_pass) {\n    vw_out() << \"Writing initial condition files.\" << \"\\n\";\n    std::string residual_prefix = opt.out_prefix + \"-initial_residuals\";\n    write_residual_logs(residual_prefix, opt, param_storage,\n                        cam_residual_counts, pixel_sigmas,\n                        num_gcp_or_dem_residuals,\n                        num_uncertainty_residuals, num_tri_residuals,\n                        num_cam_pos_residuals,\n                        reference_vec, cnet, crn, problem);\n\n    std::string point_kml_path  = opt.out_prefix + \"-initial_points.kml\";\n    param_storage.record_points_to_kml(point_kml_path, opt.datum,\n                         kmlPointSkip, \"initial_points\");\n  }\n\n  // Solve the problem\n  ceres::Solver::Options options;\n  options.gradient_tolerance  = 1e-16;\n  options.function_tolerance  = 1e-16;\n  options.parameter_tolerance = opt.parameter_tolerance;\n  options.max_num_iterations  = opt.num_iterations;\n  options.max_num_consecutive_invalid_steps = std::max(5, opt.num_iterations/5); // try hard\n  options.minimizer_progress_to_stdout = true;\n\n  if (opt.single_threaded_cameras)\n    options.num_threads = 1;\n  else\n    options.num_threads = opt.num_threads;\n\n  // Use a callback function at every iteration, if desired to save the intermediate results\n  BaCallback callback(opt, param_storage);\n  if (opt.save_intermediate_cameras) {\n    options.callbacks.push_back(&callback);\n    options.update_state_every_iteration = true;\n  }\n\n  // Set solver options according to the recommendations in the Ceres solving FAQs\n  options.linear_solver_type = ceres::SPARSE_SCHUR;\n  if (num_cameras < 100)\n    options.linear_solver_type = ceres::DENSE_SCHUR;\n  if (num_cameras > 3500) {\n    // This is supposed to help with speed in a certain size range\n    options.use_explicit_schur_complement = true;\n    options.linear_solver_type  = ceres::ITERATIVE_SCHUR;\n    options.preconditioner_type = ceres::SCHUR_JACOBI;\n  }\n  if (num_cameras > 7000)\n    options.use_explicit_schur_complement = false; // Only matters with ITERATIVE_SCHUR\n\n  //options.ordering_type = ceres::SCHUR;\n  //options.eta = 1e-3; // FLAGS_eta;\n  //options->max_solver_time_in_seconds = FLAGS_max_solver_time;\n  //if (FLAGS_line_search) {\n  //  options->minimizer_type = ceres::LINE_SEARCH;\n  //}\n\n  vw_out() << \"Starting the Ceres optimizer.\" << \"\\n\";\n  ceres::Solver::Summary summary;\n  ceres::Solve(options, &problem, &summary);\n  final_cost = summary.final_cost;\n  vw_out() << summary.FullReport() << \"\\n\";\n  if (summary.termination_type == ceres::NO_CONVERGENCE) {\n    // Print a clarifying message, so the user does not think that the algorithm failed.\n    vw_out() << \"Found a valid solution, but did not reach the actual minimum. This is expected and likely the produced solution is good enough.\\n\";\n    convergence_reached = false;\n  }\n\n  // Write the condition files after each pass, as we never know which pass will be the last\n  // since we may stop the passes prematurely if no more outliers are present.\n  vw_out() << \"Writing final condition log files.\" << \"\\n\";\n  std::string residual_prefix = opt.out_prefix + \"-final_residuals\";\n  write_residual_logs(residual_prefix, opt, param_storage,\n                      cam_residual_counts, pixel_sigmas,\n                      num_gcp_or_dem_residuals,\n                      num_uncertainty_residuals, num_tri_residuals,\n                      num_cam_pos_residuals,\n                      reference_vec, cnet, crn, problem);\n\n  std::string point_kml_path = opt.out_prefix + \"-final_points.kml\";\n  param_storage.record_points_to_kml(point_kml_path, opt.datum, kmlPointSkip,\n                                     \"final_points\");\n\n  // Outlier filtering\n  if (remove_outliers)\n      add_to_outliers(cnet, crn,\n                      param_storage,   // in-out\n                      opt, cam_residual_counts, pixel_sigmas, num_gcp_or_dem_residuals,\n                      num_uncertainty_residuals, num_tri_residuals,\n                      num_cam_pos_residuals, reference_vec, problem);\n\n  return 0;\n} // End function baOnePass\n\n// Run several more passes with random initial parameter offsets. This flow is\n// only kicked in if opt.num_random_passes is positive, which is not the\nvoid runRandomPasses(asp::BaOptions & opt, asp::BaParams & param_storage,\n                     double & final_cost, asp::CRN const& crn,\n                     bool remove_outliers,\n                     asp::BaParams const& orig_parameters) {\n\n  // Record the parameters of the best result so far\n  double best_cost = final_cost;\n  boost::shared_ptr<asp::BaParams> best_params_ptr(new asp::BaParams(param_storage));\n\n  // Must recompute these, as what is passed in as orig_parameters is actually\n  // the latest parameters after optimization, not the original ones. \n  // TODO(oalexan1): Think of this more. All this runRundomPasses logic\n  // may need to go away.\n  std::vector<vw::CamPtr> orig_cams;\n  asp::calcOptimizedCameras(opt, orig_parameters, orig_cams); // orig cameras\n\n  std::vector<std::vector<vw::Vector3>> orig_cam_positions;\n  asp::calcCameraCenters(opt.stereo_session, orig_cams, orig_cam_positions);\n\n  // Back up the output prefix\n  std::string orig_out_prefix = opt.out_prefix;\n\n  for (int pass = 0; pass < opt.num_random_passes; pass++) {\n\n    vw_out() << \"\\n--> Running bundle adjust pass \" << pass\n             << \" with random initial parameter offsets.\\n\";\n\n    // Randomly distort the original inputs.\n    param_storage.randomize_cameras();\n    if (opt.solve_intrinsics)\n      param_storage.randomize_intrinsics(opt.intrinsics_limits);\n\n    // Write output files to a temporary prefix\n    opt.out_prefix = orig_out_prefix + \"_rand\";\n\n    // Do another pass of bundle adjustment.\n    bool first_pass = true; // this needs more thinking\n    bool convergence_reached = true;\n    double curr_cost = 0.0; // will be set\n    baOnePass(opt, crn, first_pass, remove_outliers,\n              param_storage, orig_parameters,\n              orig_cams, orig_cam_positions,\n              convergence_reached, curr_cost);\n\n    // Record the parameters of the best result.\n    if (curr_cost < best_cost) {\n      vw_out() << \"  --> Found a better solution using random passes.\\n\";\n      best_cost = curr_cost;\n      best_params_ptr = boost::make_shared<asp::BaParams>(param_storage);\n\n      // Get a list of all the files that were generated in the random step.\n      std::vector<std::string> rand_files;\n      get_files_with_prefix(opt.out_prefix, rand_files);\n\n      // Replace the existing output files with them.\n      for (size_t i = 0; i < rand_files.size(); i++) {\n        std::string new_path = rand_files[i];\n        boost::replace_all(new_path, opt.out_prefix, orig_out_prefix);\n        boost::filesystem::copy_file(rand_files[i], new_path,\n                                     fs::copy_options::overwrite_existing);\n      }\n    }\n\n    // Clear out the extra files that were generated\n    std::string cmd(\"rm -f \" + opt.out_prefix + \"*\");\n    vw_out() << \"Deleting temporary files: \" << cmd << \"\\n\";\n    vw::exec_cmd(cmd.c_str());\n  }\n  opt.out_prefix = orig_out_prefix; // So the cameras are written to the expected paths.\n\n  // Copy back to the original parameters\n  param_storage = *best_params_ptr;\n\n  // Copy back the best cost\n  final_cost = best_cost;\n}\n\n/// Use Ceres to do bundle adjustment.\nvoid do_ba_ceres(asp::BaOptions & opt, std::vector<Vector3> const& estimated_camera_gcc) {\n\n  // Try to set up the control network, ie the list of point coordinates.\n  // - This triangulates from the camera models to determine the initial\n  //   world coordinate estimate for each matched IP.\n  opt.cnet = boost::make_shared<ControlNetwork>(\"BundleAdjust\");\n  int num_gcp = 0;\n  ControlNetwork & cnet = *(opt.cnet.get()); // alias to ASP cnet\n  asp::IsisCnetData isisCnetData; // isis cnet (if loaded)\n  std::vector<Eigen::Affine3d> world_to_cam; // for nvm (if applicable)\n  std::map<std::string, Eigen::Vector2d> optical_offsets; // for nvm\n  if (!opt.apply_initial_transform_only) {\n    // TODO(oalexan1): This whole block must be a function\n    if (opt.isis_cnet != \"\") {\n      vw::vw_out() << \"Reading ISIS control network: \" << opt.isis_cnet << \"\\n\";\n      asp::loadIsisCnet(opt.isis_cnet, opt.image_files,\n                        cnet, isisCnetData); // outputs\n    } else if (opt.nvm != \"\") {\n      // Assume the features are stored shifted relative to optical center\n      bool nvm_no_shift = false;\n      asp::readNvmAsCnet(opt.nvm, opt.image_files, nvm_no_shift,\n                         cnet, world_to_cam, optical_offsets);// outputs\n      // For pinhole and csm frame cameras also read the poses from nvm unless told not to\n      if (!opt.no_poses_from_nvm)\n        asp::updateCameraPoses(world_to_cam, opt.camera_models);\n    } else {\n\n      // Read matches into a control network\n      bool triangulate_control_points = true;\n      bool success = vw::ba::build_control_network(triangulate_control_points,\n                                                   cnet, opt.camera_models,\n                                                   opt.image_files,\n                                                   opt.match_files,\n                                                   opt.min_matches,\n                                                   opt.min_triangulation_angle*(M_PI/180.0),\n                                                   opt.forced_triangulation_distance,\n                                                   opt.max_pairwise_matches,\n                                                   stereo_settings().matches_as_txt,\n                                                   opt.bathy_data);\n      vw_out() << \"Number of triangulated control points: \" << cnet.size() << \"\\n\";\n      if (!success) {\n        vw_out() << \"Failed to build a control network.\\n\"\n                 << \" - Consider removing all .vwip and .match files and \\n\"\n                 << \"   increasing the number of interest points per tile using\\n \"\n                 << \"   --ip-per-tile, or decreasing --min-matches.\\n\"\n                 << \" - Check if your images are similar enough in illumination,\\n\"\n                 << \"   and if they have enough overlap.\\n\"\n                 << \"Will continue if ground control points are present.\\n\";\n      }\n    }\n  }\n\n  if (!opt.gcp_files.empty()) {\n    num_gcp = vw::ba::add_ground_control_points(cnet, opt.gcp_files, opt.datum);\n    checkGcpRadius(opt.datum, cnet);\n    vw::vw_out() << \"Loaded \" << num_gcp << \" ground control points.\\n\";\n  }\n\n  // If we change the cameras, we must rebuild the control network\n  bool cameras_changed = false;\n\n  // If camera positions were provided for local inputs, align to them.\n  const bool have_est_camera_positions = (opt.camera_position_file != \"\");\n  if ((opt.camera_type == BaCameraType_Pinhole) && have_est_camera_positions) {\n    asp::init_pinhole_model_with_camera_positions(opt.cnet, opt.camera_models,\n                                                  opt.image_files, estimated_camera_gcc);\n    cameras_changed = true;\n  }\n\n  // If we have GPC's for pinhole cameras, try to do a simple affine\n  // initialization of the camera parameters.\n  // - This function also updates all the ControlNetwork world point\n  //   positions.\n  // - We could do this for other camera types too, but it would\n  //   require us to be able to adjust our camera model positions.\n  //   Otherwise we could init the adjustment values.\n  if (opt.gcp_files.size() > 0) {\n    if ((opt.camera_type == BaCameraType_Pinhole) &&\n        !have_est_camera_positions) {\n      if (opt.transform_cameras_using_gcp) {\n        asp::transform_cameras_with_indiv_image_gcp(opt.cnet, opt.camera_models);\n        cameras_changed = true;\n      } else if (opt.transform_cameras_with_shared_gcp) {\n        asp::transform_cameras_with_shared_gcp(opt.cnet, opt.camera_models);\n            cameras_changed = true;\n      } else if (opt.init_camera_using_gcp) {\n        asp::init_camera_using_gcp(opt.cnet, opt.camera_models);\n            cameras_changed = true;\n      }\n    }\n\n    // Issue a warning if the GCPs are far away from the camera coordinates.\n    // Do it only if the cameras did not change, as otherwise the cnet is outdated.\n    if (!cameras_changed)\n      check_gcp_dists(opt.camera_models, opt.cnet, opt.forced_triangulation_distance);\n  }\n\n  int num_points = cnet.size();\n  int num_cameras = opt.image_files.size();\n\n  // This is important to prevent a crash later\n  if (num_points == 0 && !opt.apply_initial_transform_only) {\n    vw_out() << \"No points to optimize (GCP or otherwise). Cannot continue.\\n\";\n    return;\n  }\n\n  // Calculate the max length of a distortion vector. It will be convenient to\n  // have all distortion vectors have this max length, even if fewer are needed\n  // for some cameras.\n  int max_num_dist_params\n    = asp::calcMaxNumDistParams(opt.camera_models, opt.camera_type,\n                                opt.intrinsics_options, opt.intrinsics_limits);\n\n  // This is needed to ensure distortion coefficients are not so small as to not\n  // get optimized. This modifies the cameras and must happen before\n  // param_storage is populated.\n  if (opt.solve_intrinsics && !opt.apply_initial_transform_only)\n    asp::ensureMinDistortion(opt.camera_models, opt.camera_type,\n                             opt.intrinsics_options,\n                             opt.fixed_distortion_indices,\n                             max_num_dist_params,\n                             opt.min_distortion);\n\n  // Create the storage arrays for the variables we will adjust.\n  asp::BaParams param_storage(num_points, num_cameras,\n                              // Distinguish when we solve for intrinsics\n                              opt.camera_type != BaCameraType_Other,\n                              max_num_dist_params,\n                              opt.intrinsics_options);\n\n  // Sync up any camera intrinsics that should be shared. Do this before\n  // populating the param storage values.\n  cameras_changed = cameras_changed ||\n    syncUpInitialSharedParams(opt.camera_type, param_storage, opt.camera_models);\n\n  // Fill in the camera and intrinsic parameters.\n  std::vector<vw::CamPtr> new_cam_models;\n  bool ans = false;\n  switch (opt.camera_type) {\n    case BaCameraType_Pinhole:\n      ans = init_cams_pinhole(opt, param_storage,\n                              opt.initial_transform_file, opt.initial_transform,\n                              new_cam_models); break;\n    case BaCameraType_OpticalBar:\n      ans = init_cams_optical_bar(opt, param_storage,\n                                  opt.initial_transform_file, opt.initial_transform,new_cam_models); break;\n    case BaCameraType_CSM: // CSM while optimizing intrinsics\n      ans = init_cams_csm(opt, param_storage,\n                          opt.initial_transform_file, opt.initial_transform,\n                          new_cam_models); break;\n    case BaCameraType_Other:\n      ans = init_cams(opt, param_storage,\n                      opt.initial_transform_file, opt.initial_transform,\n                      new_cam_models); break;\n    default:\n      vw_throw(ArgumentErr() << \"Unknown camera type.\\n\");\n  };\n\n  // Certain input options change the cameras inside init_cams and we\n  // need to update the point coordinates for the new cameras. It is\n  // ok to leave the original vector of camera models unchanged.\n  if (ans)\n    cameras_changed = true;\n\n  // When the cameras changed, must re-triangulate the points.\n  // This is much cheaper than rebuilding the control network.\n  if (!opt.apply_initial_transform_only && cameras_changed) {\n    vw_out() << \"Re-triangulating the control points as the cameras changed.\\n\";\n    // Do not triangulate the GCP or the height-from-dem points\n    vw::ba::triangulate_control_network(cnet, new_cam_models,\n                                        opt.min_triangulation_angle*(M_PI/180.0),\n                                        opt.forced_triangulation_distance,\n                                        opt.bathy_data);\n    check_gcp_dists(new_cam_models, opt.cnet, opt.forced_triangulation_distance);\n    if (num_points != cnet.size()) // Must not happen\n      vw_throw(ArgumentErr() << \"The number of points changed after re-triangulation.\\n\");\n  }\n\n  // Fill in the point vector with the starting values\n  for (int ipt = 0; ipt < num_points; ipt++)\n    param_storage.set_point(ipt, cnet[ipt].position());\n\n  // Flag any outliers read from an isis cnet\n  for (auto const& ipt: isisCnetData.isisOutliers) {\n    if (ipt < 0 || ipt >= num_points)\n      vw_throw(ArgumentErr() << \"Invalid point index.\\n\");\n    param_storage.set_point_outlier(ipt, true);\n  }\n\n  // Flag outliers in the cnet\n  for (int ipt = 0; ipt < num_points; ipt++) {\n    if (cnet[ipt].ignore())\n      param_storage.set_point_outlier(ipt, true);\n  }\n\n  // The camera positions and orientations before we float them\n  // This includes modifications from any initial transforms that were specified.\n  asp::BaParams orig_parameters(param_storage);\n\n  // TODO(oalexan1): Likely orig_cams have the info as new_cam_models. But need\n  // to test this.\n  std::vector<vw::CamPtr> orig_cams;\n  asp::calcOptimizedCameras(opt, orig_parameters, orig_cams); // orig cameras\n  std::vector<std::vector<vw::Vector3>> orig_cam_positions;\n  asp::calcCameraCenters(opt.stereo_session, orig_cams, orig_cam_positions);\n\n  // For nadirpinhole and pinhole cameras, save a report\n  bool has_datum = (opt.datum.name() != asp::UNSPECIFIED_DATUM);\n  if (has_datum && opt.stereo_session.find(\"pinhole\") != std::string::npos)\n    asp::saveCameraReport(opt, param_storage, opt.datum, \"initial\");\n\n  // TODO(oalexan1): Is it possible to avoid using CRNs?\n  asp::CRN crn;\n  crn.from_cnet(cnet);\n\n  if (opt.num_passes <= 0)\n    vw_throw(ArgumentErr() << \"Error: Expecting at least one bundle adjust pass.\\n\");\n\n  bool remove_outliers = (opt.num_passes > 1);\n  double final_cost = 0.0;\n  for (int pass = 0; pass < opt.num_passes; pass++) {\n\n    if (opt.apply_initial_transform_only)\n      continue;\n\n    vw_out() << \"--> Bundle adjust pass: \" << pass << \"\\n\";\n\n    bool first_pass = (pass == 0);\n    bool convergence_reached = true; // will change\n    baOnePass(opt, crn, first_pass, remove_outliers,\n              param_storage, orig_parameters,\n              orig_cams, orig_cam_positions,\n              convergence_reached, final_cost);\n    int num_points_remaining = num_points - param_storage.get_num_outliers();\n    if (num_points_remaining < opt.min_matches && num_gcp == 0) {\n      // Do not throw if there exist gcp, as maybe that's all there is, and there\n      // can be just a few of them. Also, do not throw if we are using an ISIS cnet,\n      // unless we have less than 10 points, as that one can make too few points.\n      std::ostringstream os;\n      os << \"Too few points remain after filtering. Number of remaining \"\n         << \"points is \" << num_points_remaining\n         << \", but value of --min-matches is \" << opt.min_matches << \".\\n\";\n      if (opt.isis_cnet != \"\" && num_points_remaining > 10)\n        vw_out(vw::WarningMessage) << os.str();\n      else\n        vw_throw(ArgumentErr() << \"Error: \" << os.str());\n    }\n  } // End loop through passes\n\n  // Running random passes is not the default\n  if (!opt.apply_initial_transform_only && opt.num_random_passes > 0)\n    runRandomPasses(opt, param_storage, final_cost, crn, remove_outliers, orig_parameters);\n\n  // Always save the updated cameras, even if we are not doing any optimization\n  saveUpdatedCameras(opt, param_storage);\n\n  // If we are only applying an initial transform, we are done\n  if (opt.apply_initial_transform_only)\n    return;\n\n  // Write the GCP stats to a file\n  if (num_gcp > 0)\n    param_storage.print_gcp_stats(opt.out_prefix, cnet, opt.datum);\n\n  // Find the cameras with the latest adjustments. Note that we do not modify\n  // opt.camera_models, but make copies as needed.\n  std::vector<vw::CamPtr> optimized_cams;\n  asp::calcOptimizedCameras(opt, param_storage, optimized_cams);\n\n  // Find the camera centers. For linescan, this will return all samples.\n  std::vector<std::vector<vw::Vector3>> opt_cam_positions;\n  asp::calcCameraCenters(opt.stereo_session, optimized_cams, opt_cam_positions);\n\n  // Fetch the latest outliers from param_storage and put them in the 'outliers' set\n  std::set<int> outliers;\n  updateOutliers(cnet, param_storage, outliers);\n\n  // Write clean matches and many types of stats. These are done together as\n  // they rely on reloading interest point matches, which is expensive.\n  bool save_clean_matches = true;\n  asp::matchFilesProcessing(cnet,\n                            asp::BaBaseOptions(opt), // note the slicing\n                            optimized_cams, remove_outliers, outliers, opt.mapproj_dem,\n                            opt.propagate_errors, opt.horizontal_stddev_vec,\n                            save_clean_matches, opt.match_files,\n                            stereo_settings().matches_as_txt);\n\n  // Compute the change in camera centers. For that, we need the original cameras.\n  std::string cam_offsets_file = opt.out_prefix + \"-camera_offsets.txt\";\n  if (opt.datum.name() != asp::UNSPECIFIED_DATUM)\n    asp::saveCameraOffsets(opt.datum, opt.image_files,\n                           orig_cam_positions, opt_cam_positions,\n                           cam_offsets_file);\n  else\n    vw::vw_out() << \"Cannot compute camera offsets as the datum is unspecified.\\n\";\n\n  std::string tri_offsets_file = opt.out_prefix + \"-triangulation_offsets.txt\";\n  asp::saveTriOffsetsPerCamera(opt.image_files, orig_parameters, param_storage, crn,\n                               tri_offsets_file);\n\n  if (has_datum &&\n      (opt.stereo_session == \"pinhole\") || (opt.stereo_session == \"nadirpinhole\"))\n    saveCameraReport(opt, param_storage, opt.datum, \"final\");\n\n  // Save the updated cnet to ISIS or nvm format. Note that param_storage has\n  // the latest triangulated points and outlier info, while the cnet has the\n  // initially triangulated points and the interest point matches.\n  if (opt.isis_cnet != \"\" && opt.output_cnet_type == \"isis-cnet\")\n    asp::saveUpdatedIsisCnet(opt.out_prefix, cnet, param_storage, isisCnetData);\n  else if (opt.output_cnet_type == \"isis-cnet\")\n    asp::saveIsisCnet(opt.out_prefix, opt.datum, cnet, param_storage);\n  else if (opt.output_cnet_type == \"nvm\") {\n    asp::saveNvm(opt, opt.no_poses_from_nvm, cnet, param_storage,\n                  world_to_cam, optical_offsets);\n  }\n\n  // Save the optimized control network in GCP format, after outlier filtering\n  if (opt.save_cnet_as_gcp) {\n    std::string gcp_file = opt.out_prefix + \"-cnet.gcp\";\n    asp::saveCnetAsGcp(cnet, param_storage, opt.datum, opt.image_files, gcp_file);\n  }\n\n} // end do_ba_ceres\n\nint main(int argc, char* argv[]) {\n\n  asp::BaOptions opt;\n  try {\n    xercesc::XMLPlatformUtils::Initialize();\n\n    // Process the bundle_adjust options and sanity checks\n    handleBaArgs(argc, argv, opt);\n\n    asp::load_cameras(opt.image_files, opt.camera_files, opt.out_prefix, opt,\n                      opt.approximate_pinhole_intrinsics,\n                      // Outputs\n                      opt.stereo_session,\n                      opt.single_threaded_cameras,\n                      opt.camera_models);\n\n    // Parse data needed for error propagation\n    if (opt.propagate_errors)\n      asp::setup_error_propagation(opt.stereo_session, opt.horizontal_stddev,\n                                   opt.camera_models,\n                                   opt.horizontal_stddev_vec); // output\n\n    bool need_no_matches = (opt.apply_initial_transform_only ||\n                            !opt.isis_cnet.empty()           ||\n                            !opt.nvm.empty());\n\n    // Read mapprojected images if using --mapprojected-data \n    std::vector<std::string> map_files;\n    std::string mapproj_dem;\n    asp::setupMapprojectedData(opt, need_no_matches, map_files, mapproj_dem);\n\n    // The stats need to be for the mapprojected image, if provided\n    std::vector<std::string> files_for_stats = opt.image_files;\n    if (!map_files.empty())\n      files_for_stats = map_files;\n\n    // The file having the image normalization bounds  \n    std::string boundsFile = opt.out_prefix + \"-normalization-bounds.txt\";\n\n    // Compute stats in the batch of images given by opt.job_id, etc.\n    // Skip this in several situations, including when we just want to accumulate\n    // the stats for the images in the list.\n    bool skip_stats = (need_no_matches || opt.skip_matching ||\n                       opt.clean_match_files_prefix != \"\"   ||\n                       opt.match_files_prefix != \"\"         ||\n                       opt.calc_normalization_bounds);\n\n    bool calcIp = false;\n    if (!skip_stats)\n      computeStatsOrIp(opt, files_for_stats, opt.dem_file_for_overlap,\n                       boundsFile, calcIp);\n\n    if (opt.stop_after_stats) {\n      vw_out() << \"Quitting after statistics computation.\\n\";\n      xercesc::XMLPlatformUtils::Terminate();\n      return 0;\n    }\n\n    // Compute normalization bounds if requested. This is done in a separate\n    // process in parallel_bundle_adjust.\n    if (opt.calc_normalization_bounds) {\n      calcNormalizationBounds(opt.out_prefix, files_for_stats, boundsFile);\n      vw_out() << \"Quitting after calculating normalization bounds.\\n\";\n      xercesc::XMLPlatformUtils::Terminate();\n      return 0;\n    }\n\n    // Compute ip if requested. This is done in multiple processes in \n    // parallel_bundle_adjust. For standalone bundle_adjust, this will\n    // happen when matching occurs, which is then serial.\n    if (opt.calc_ip) {\n      bool calcIp = true;\n      computeStatsOrIp(opt, files_for_stats, opt.dem_file_for_overlap,\n                       boundsFile, calcIp);\n      vw_out() << \"Quitting after computing interest points.\\n\";\n      xercesc::XMLPlatformUtils::Terminate();\n      return 0;\n    }\n\n    // Calculate which images overlap based on the DEM\n    if (opt.auto_overlap_params != \"\") {\n      opt.have_overlap_list = true;\n      asp::buildOverlapList(opt.out_prefix,\n                            opt.dem_file_for_overlap, opt.pct_for_overlap,\n                            opt.overlap_limit,\n                            opt.match_first_to_last,\n                            opt.image_files, opt.camera_models,\n                            opt.overlap_list); // output\n    }\n\n    // Load estimated camera positions if they were provided.\n    std::vector<Vector3> estimated_camera_gcc;\n    asp::loadEstimCameraPositions(opt, estimated_camera_gcc);\n\n    // Find or list matches\n    asp::findPairwiseMatches(opt, map_files, mapproj_dem,\n                             estimated_camera_gcc, need_no_matches);\n\n    if (opt.stop_after_matching) {\n      vw_out() << \"Quitting after matches computation.\\n\";\n      return 0;\n    }\n\n    // All the work happens here. It also writes out the results.\n    do_ba_ceres(opt, estimated_camera_gcc);\n\n    xercesc::XMLPlatformUtils::Terminate();\n\n  } ASP_STANDARD_CATCHES;\n}\n"
  },
  {
    "path": "src/asp/Tools/cam2map4stereo.py",
    "content": "#!/usr/bin/env python\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\nfrom __future__ import print_function\nimport os, optparse, subprocess, sys, tempfile\n\n# The path to the ASP python files.\nbasepath    = os.path.abspath(sys.path[0])\npythonpath  = os.path.abspath(basepath + '/../Python')  # for dev ASP\nlibexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP\nsys.path.insert(0, basepath) # prepend to Python path\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\n\nfrom asp_system_utils import get_asp_version\nfrom asp_system_utils import mkdir_p\n\nimport asp_system_utils\nasp_system_utils.verify_python_version_is_supported()\n\ndef man(option, opt, value, parser):\n    print (parser.usage, file=sys.stderr)\n    print ('''\\\nThis program takes similar arguments as the ISIS3 cam2map program,\nbut takes two input images.  With no arguments, the program determines\nthe minimum overlap of the two images, and the worst common resolution,\nand then map-projects the two images to this identical area and resolution.\n\nUsing the --lat and --lon options allows you to select portions of\nthe image, ideal for small initial test runs or cropping out just\nthat portion of the image you need.\n''', file=sys.stderr)\n    \n    sys.exit()\n\nclass Usage(Exception):\n    def __init__(self, msg):\n        self.msg = msg\n\nclass MapExists(Exception):\n    def __init__(self, msg):\n        self.msg = msg\n\nclass ImgInfo:\n    def __init__( self ):\n        self.resolution = None\n        self.minlat = None\n        self.maxlat = None\n        self.minlon = None\n        self.maxlon = None\n\ndef mapfile( cube, prefix, suffix ):\n    '''???'''\n    items = cube.split('.')\n    mapname = '.'.join([items[0], suffix, 'cub'])\n\n    # If the file exists, or it starts with a dot (say ../file.cub)\n    if( os.path.exists(mapname) or mapname[0] == \".\"):\n        items.insert(len(items)-1, suffix)\n        mapname = '.'.join(items)\n\n    # Make somedir/file.cub into myprefix-file.map.cub\n    if prefix != \"\":\n        mapname = prefix + \"-\" + os.path.basename(mapname)\n\n    # Ensure that any output directory exists\n    dirname = os.path.dirname(mapname)\n    mkdir_p(dirname)\n\n    if( os.path.exists(mapname) ):\n        raise MapExists( mapname )\n\n    return mapname\n\ndef camrange( cube, lonGroupName, options ):\n    '''run camrange on cube'''\n    info = ImgInfo();\n    try:\n        # Run the camrange function to write to a temp file\n        tmpfile = tempfile.NamedTemporaryFile(dir='.', prefix=\"camrange\",\n                                              suffix=\".txt\", mode=\"w\")\n        cmd = 'camrange from= '+ cube +' to= '+ tmpfile.name\n\n        print('Running ' + cmd)\n        result = subprocess.call(cmd, shell=True)\n        if not result == 0:\n            raise Exception('ProcessError', 'Non zero return code ('+str(result)+')')\n        os.system(\"cat %s\" % tmpfile.name )\n\n        # Path to the ISIS getkey tool\n        getkey_path = os.environ['ISISROOT']+'/bin/getkey'\n\n        # By default we get the longitude from the Universal field,\n        #   but if the user specified a longitude region we need to match it.\n        lonDomain    = '360'\n        lonDirection = 'PositiveEast'\n        if options.map:\n            # Read the pertinent values from the map file\n            lonDomainIn    = subprocess.Popen([getkey_path, 'from= '+options.map, \"grpname= Mapping\", \"keyword= LongitudeDomain\"   ], stdout=subprocess.PIPE,stderr=subprocess.PIPE, universal_newlines=True).communicate()[0].strip()\n            lonDirectionIn = subprocess.Popen([getkey_path, 'from= '+options.map, \"grpname= Mapping\", \"keyword= LongitudeDirection\"], stdout=subprocess.PIPE,stderr=subprocess.PIPE, universal_newlines=True).communicate()[0].strip()\n            if lonDomainIn:\n                lonDomain = lonDomainIn\n            if lonDirectionIn:\n                lonDirection = lonDirectionIn\n            # Determine the correct lon group\n            if (lonDomain == '360') and (lonDirection == 'PositiveWest'):\n                lonGroupName = 'PositiveWest360'\n            if (lonDomain == '180') and (lonDirection == 'PositiveEast'):\n                lonGroupName = 'PositiveEast180'\n            if (lonDomain == '180') and (lonDirection == 'PositiveWest'):\n                lonGroupName = 'PositiveWest180'\n        lonGroupString = 'grpname= ' + lonGroupName\n        fromString     = \"from= \"+ tmpfile.name\n\n        # extract information\n        info.resolution = subprocess.Popen([getkey_path, fromString, \"grpname= PixelResolution\",      \"keyword= Lowest\"          ], stdout=subprocess.PIPE, universal_newlines=True).communicate()[0].strip()\n        info.minlat     = subprocess.Popen([getkey_path, fromString, \"grpname= UniversalGroundRange\", \"keyword= MinimumLatitude\" ], stdout=subprocess.PIPE, universal_newlines=True).communicate()[0].strip()\n        info.maxlat     = subprocess.Popen([getkey_path, fromString, \"grpname= UniversalGroundRange\", \"keyword= MaximumLatitude\" ], stdout=subprocess.PIPE, universal_newlines=True).communicate()[0].strip()\n        info.minlon     = subprocess.Popen([getkey_path, fromString, lonGroupString,                  \"keyword= MinimumLongitude\"], stdout=subprocess.PIPE, universal_newlines=True).communicate()[0].strip()\n        info.maxlon     = subprocess.Popen([getkey_path, fromString, lonGroupString,                  \"keyword= MaximumLongitude\"], stdout=subprocess.PIPE, universal_newlines=True).communicate()[0].strip()\n\n    except OSError as e:\n        print (\"Execution failed:\", e, file=sys.stderr)\n        raise e\n\n    return info\n\ndef main():\n    try:\n        try:\n            usage = \"usage: cam2map4stereo.py [--help][--manual][--map mapfile][--pixres CAMERA|MAP|MPP|PPD][--resolution float][--interp NN|BI|CC][--lat min:max][--lon min:max][--prefix string] [--suffix string] image1.cub image2.cub\\n\" + get_asp_version()\n            parser = optparse.OptionParser(usage=usage)\n            parser.set_defaults(dryrun=False)\n            parser.set_defaults(pixres='MPP')\n            parser.set_defaults(prefix='')\n            parser.set_defaults(suffix='map')\n            parser.add_option(\"--manual\", action=\"callback\", callback=man,\n                              help=\"Read the manual.\")\n            parser.add_option(\"-m\", \"--map\", dest=\"map\",\n                              help=\"The mapfile to use for cam2map.\")\n            parser.add_option(\"-p\", \"--pixres\", dest=\"pixres\",\n                              help=\"The pixel resolution mode to use for cam2map.\")\n            parser.add_option(\"-r\", \"--resolution\", dest=\"resolution\",\n                              help=\"Resolution of final map for cam2map.\")\n            parser.add_option(\"-i\", \"--interp\", dest=\"interp\",\n                              help=\"Pixel interpolation scheme for cam2map.\")\n            parser.add_option(\"-a\", \"--lat\", dest=\"lat\",\n                              help=\"Latitude range for cam2map where LAT is minlat:maxlat.\")\n            parser.add_option(\"-o\", \"--lon\", dest=\"lon\",\n                              help=\"Longitude range for cam2map where LON is minlon:maxlon.\")\n            parser.add_option(\"--prefix\", dest=\"prefix\",\n                              help=\"Make all output files use this prefix. Default: no prefix.\")\n            parser.add_option(\"-s\", \"--suffix\", dest=\"suffix\",\n                              help=\"Suffix that gets inserted in the output file names.\")\n            parser.add_option(\"-n\", \"--dry-run\", dest=\"dryrun\",\n                              action=\"store_true\",\n                              help=\"Make calculations, but print cam2map command, but don't actually run it.\")\n\n            (options, args) = parser.parse_args()\n\n            if not args: parser.error(\"need .cub files\")\n\n\n        except optparse.OptionError as msg:\n            raise Usage(msg)\n\n        # Call camrange to get bounds. If the lon bounds come as [0, 360] then try a different group.\n        success = False\n        lonGroupNames = ['UniversalGroundRange',  'PositiveEast180',\n                         'PositiveWest180', 'PositiveWest360']\n        for lonGroupName in lonGroupNames:\n            image1 = camrange( args[0], lonGroupName, options)\n            image2 = camrange( args[1], lonGroupName, options)\n            lonRange = float(max(image1.maxlon, image2.maxlon)) - \\\n                       float(min(image1.minlon, image2.minlon))\n            if lonRange >= 360.0:\n                print(\"With lonGroupName = \" + lonGroupName + \" found a longitude range of \" + \\\n                      str(lonRange) + \". Will try the next group from: \" + (\" \".join(lonGroupNames)))\n            else:\n                success = True\n                break\n\n        if not success:\n            raise Exception('ProcessError', 'The longitude range keeps on coming as encompasing the entire planet. Something is wrong.')\n            \n        mapout = ImgInfo()\n\n        mapout.minlat     = max( image1.minlat,     image2.minlat )\n        mapout.maxlat     = min( image1.maxlat,     image2.maxlat )\n        mapout.minlon     = max( image1.minlon,     image2.minlon )\n        mapout.maxlon     = min( image1.maxlon,     image2.maxlon )\n        mapout.resolution = max( image1.resolution, image2.resolution )\n\n        if( options.resolution ): mapout.resolution = options.resolution\n        if( options.lat ):\n            latrange = options.lat.split(':')\n            if latrange[0]: mapout.minlat = latrange[0]\n            if latrange[1]: mapout.maxlat = latrange[1]\n        if( options.lon ):\n            lonrange = options.lon.split(':')\n            if lonrange[0]: mapout.minlon = lonrange[0]\n            if lonrange[1]: mapout.maxlon = lonrange[1]\n\n        # call cam2map with the arguments\n\n        cam2map = ['cam2map', 'from=' + args[0], 'to='\n                   + mapfile( args[0], options.prefix, options.suffix )]\n\n        if( options.map ):\n            cam2map.append( 'map=' + options.map )\n        if( options.interp):\n            cam2map.append( 'interp=' + options.interp)\n\n        cam2map.append( 'pixres=' + options.pixres )\n        cam2map.append( 'resolution=' + mapout.resolution )\n\n        cam2map.append( 'defaultrange=MAP' )\n        cam2map.append( 'minlat=' + mapout.minlat )\n        cam2map.append( 'maxlat=' + mapout.maxlat )\n        cam2map.append( 'minlon=' + mapout.minlon )\n        cam2map.append( 'maxlon=' + mapout.maxlon )\n\n        # Run for first image\n\n        # Need to put these together to keep ISIS from calling the GUI\n        cam2map_cmd = ' '.join(cam2map)\n        print(cam2map_cmd)\n        if( not options.dryrun ):\n            code = subprocess.call(cam2map_cmd, shell=True)\n            if not code == 0:\n                raise Exception('ProcessError', 'Non zero return code ('+str(code)+')')\n\n        # Run for second image\n        cam2map[1] = 'from=' + args[1]\n        cam2map[2] = 'to='+ mapfile( args[1], options.prefix, options.suffix )\n        cam2map_cmd = ' '.join(cam2map)\n        print(cam2map_cmd)\n        if( not options.dryrun ):\n            code = subprocess.call(cam2map_cmd, shell=True)\n            if not code == 0:\n                raise Exception('ProcessError', 'Non zero return code ('+str(code)+')')\n\n        print(\"Finished\")\n        return 0\n\n    except Usage as err:\n        print (err.msg, file=sys.stderr)\n        return 2\n\n    except MapExists as e:\n        print ('The file '+ e.msg +' already exists, delete first.', file=sys.stderr)\n        return 3\n\n    # # To more easily debug this program, comment out this catch block.\n    # except Exception as err:\n    #     sys.stderr.write( str(err) + '\\n' )\n    #     return 1\n\nif __name__ == \"__main__\":\n    sys.exit(main())\n"
  },
  {
    "path": "src/asp/Tools/cam2rpc.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Create an RPC model from point pairs obtained by sampling a given lon-lat-height box\n// or a given DEM. Imitate to some extent the DG WV camera\n// model. Optionally save a TIF version of the input image restricted to the same box.\n// The saved image and RPC file can be used for stereo with S2P, ASP, and SETSM\n// some work needs to be done for these packages to give correct results off-Earth.\n\n#include <asp/Sessions/StereoSessionFactory.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/AspProgramOptions.h>\n#include <asp/Core/Macros.h>\n#include <asp/Core/FileUtils.h>\n#include <asp/Camera/RPCModelGen.h>\n#include <asp/Core/PointUtils.h>\n#include <asp/Camera/RpcUtils.h>\n\n#include <vw/FileIO/DiskImageIO.h>\n#include <vw/FileIO/DiskImageView.h>\n#include <vw/Core/StringUtils.h>\n#include <vw/Camera/PinholeModel.h>\n#include <vw/Cartography/Datum.h>\n#include <vw/Cartography/GeoReference.h>\n#include <vw/Cartography/CameraBBox.h>\n#include <vw/FileIO/FileUtils.h>\n\n#include <limits>\n#include <cstring>\n#include <cmath>\n\n#include <boost/filesystem.hpp>\n#include <boost/algorithm/string.hpp>\n#include <boost/program_options.hpp>\n\nnamespace fs = boost::filesystem;\nnamespace po = boost::program_options;\n\nusing namespace vw;\nusing namespace vw::camera;\nusing namespace vw::cartography;\n\nstruct Options : public vw::GdalWriteOptions {\n  double penalty_weight;\n  std::string image_file, camera_file, output_rpc, stereo_session, bundle_adjust_prefix,\n    datum_str, dem_file, target_srs_string;\n  bool no_crop, skip_computing_rpc, save_tif, has_output_nodata;\n  BBox2 lon_lat_range;\n  BBox2i image_crop_box;\n  Vector2 height_range;\n  float input_nodata_value, output_nodata_value;\n  double semi_major, semi_minor;\n  double gsd;\n  int num_samples;\n  Datum datum;\n  Options(): penalty_weight(-1.0), no_crop(false),\n             skip_computing_rpc(false), save_tif(false), has_output_nodata(false),\n             gsd(-1.0), num_samples(-1) {}\n};\n\nvoid handle_arguments(int argc, char *argv[], Options& opt) {\n  po::options_description general_options(\"\");\n  float nan = std::numeric_limits<float>::quiet_NaN();\n  general_options.add_options()\n    (\"datum\", po::value(&opt.datum_str)->default_value(\"\"),\n     \"Use this datum to interpret the heights. Options: WGS_1984, D_MOON (1,737,400 \"\n     \"meters), D_MARS (3,396,190 meters), MOLA (3,396,000 meters), NAD83, WGS72, and \"\n     \"NAD27. Also accepted: Earth (=WGS_1984), Mars (=D_MARS), Moon (=D_MOON). The datum \"\n     \"from --t_srs or --dem-file takes priority, if set.\")\n    (\"semi-major-axis\", po::value(&opt.semi_major)->default_value(0), \n     \"Explicitly set the datum semi-major axis in meters. The datum from --t_srs or \"\n     \"--dem-file takes priority, if set.\")\n    (\"semi-minor-axis\", po::value(&opt.semi_minor)->default_value(0), \n     \"Explicitly set the datum semi-minor axis in meters. The datum from --t_srs or \"\n     \"--dem-file takes priority, if set.\")\n    (\"t_srs\", po::value(&opt.target_srs_string)->default_value(\"\"), \n     \"Specify a GDAL projection string instead of the datum (in WKT, GeoJSON, or PROJ \"\n     \"format). The datum from --dem-file takes priority, if set.\")\n    (\"lon-lat-range\", po::value(&opt.lon_lat_range)->default_value(BBox2(0,0,0,0), \"0 0 0 0\"),\n     \"The longitude-latitude range in which to compute the RPC model. Specify in the \"\n     \"format: lon_min lat_min lon_max lat_max.\")\n    (\"height-range\", po::value(&opt.height_range)->default_value(Vector2(0,0),\"0 0\"),\n     \"Minimum and maximum heights above the datum in which to compute the RPC model.\")\n    (\"dem-file\", po::value(&opt.dem_file)->default_value(\"\"),\n     \"Compute the longitude-latitude-height box in which to fit the RPC camera as the \"\n      \"bounding box of the portion of this DEM that is seen by the input camera.\")\n    (\"num-samples\", po::value(&opt.num_samples)->default_value(40),\n     \"How many samples to use in each direction in the longitude-latitude-height range.\")\n    (\"penalty-weight\", po::value(&opt.penalty_weight)->default_value(0.03), // check here!\n     \"A higher penalty weight will result in smaller higher-order RPC coefficients.\")\n    (\"save-tif-image\", po::bool_switch(&opt.save_tif)->default_value(false),\n     \"Save a TIF version of the input image that approximately corresponds to the input longitude-latitude-height range and which can be used for stereo together with the RPC model.\")\n    (\"input-nodata-value\", po::value(&opt.input_nodata_value)->default_value(nan),\n     \"Set the image input nodata value.\")\n    (\"output-nodata-value\", po::value(&opt.output_nodata_value)->default_value(nan),\n     \"Set the image output nodata value. If not specified, the input nodata value will be used.\")\n    (\"session-type,t\", po::value(&opt.stereo_session),\n     \"Select the stereo session type to use for processing. Usually the program can select this automatically by the file extension, except for xml cameras. See the doc for options.\")\n    (\"bundle-adjust-prefix\", po::value(&opt.bundle_adjust_prefix),\n     \"Use the camera adjustment obtained by previously running bundle_adjust with this output prefix.\")\n    (\"image-crop-box\", po::value(&opt.image_crop_box)->default_value(BBox2i(0,0,0,0), \"0 0 0 0\"),\n     \"The output image and RPC model should not exceed this box, specified in input image pixels as minx miny widx widy.\")\n    (\"no-crop\", po::bool_switch(&opt.no_crop)->default_value(false),\n      \"Try to create an RPC model over the entire input image, even if the input longitude-latitude-height box covers just a small portion of it. Not recommended.\")\n    (\"skip-computing-rpc\", po::bool_switch(&opt.skip_computing_rpc)->default_value(false),\n     \"Skip computing the RPC model.\")\n    (\"gsd\", po::value(&opt.gsd)->default_value(-1),\n     \"Expected resolution on the ground, in meters. This is needed for SETSM.\");\n\n  general_options.add(vw::GdalWriteOptionsDescription(opt));\n\n  po::options_description positional(\"\");\n  positional.add_options()\n    (\"camera-image\", po::value(&opt.image_file))\n    (\"camera-model\", po::value(&opt.camera_file))\n    (\"output-rpc\" , po::value(&opt.output_rpc));\n\n  po::positional_options_description positional_desc;\n  positional_desc.add(\"camera-image\",1);\n  positional_desc.add(\"camera-model\",1);\n  positional_desc.add(\"output-rpc\", 1);\n\n  std::string usage(\"[options] <camera-image> <camera-model> <output-rpc>\");\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line(argc, argv, opt, general_options, general_options,\n                            positional, positional_desc, usage,\n                            allow_unregistered, unregistered);\n\n  if (opt.image_file.empty())\n    vw_throw(ArgumentErr() << \"Missing input image.\\n\" << usage << general_options);\n\n  if (boost::iends_with(opt.image_file, \".cub\") && opt.stereo_session == \"\")\n    opt.stereo_session = \"isis\";\n\n  // Need this to be able to load adjusted camera models. That will happen\n  // in the stereo session.\n  asp::stereo_settings().bundle_adjust_prefix = opt.bundle_adjust_prefix;\n\n  // This is a bug fix. The user by mistake passed in an empty projection string.\n  if (!vm[\"t_srs\"].defaulted() && opt.target_srs_string.empty())\n    vw_throw(ArgumentErr() \n             << \"The value of --t_srs is empty. Then it must not be set at all.\\n\");\n\n  // Swap min and max if need be\n  if (opt.lon_lat_range.min().x() > opt.lon_lat_range.max().x())\n    std::swap(opt.lon_lat_range.min().x(), opt.lon_lat_range.max().x());\n  if (opt.lon_lat_range.min().y() > opt.lon_lat_range.max().y())\n    std::swap(opt.lon_lat_range.min().y(), opt.lon_lat_range.max().y());\n\n  // If we cannot read the data from a DEM, must specify a lot of things.\n  if (opt.dem_file.empty()) {\n\n    // See if the user specified the datum outside of the srs string\n    bool have_user_datum = asp::read_user_datum(opt.semi_major, opt.semi_minor,\n                                                opt.datum_str, opt.datum);\n    // Set the srs string into georef.\n    if (!opt.target_srs_string.empty()) {\n      vw::cartography::GeoReference georef;\n      vw::cartography::set_srs_string(opt.target_srs_string, have_user_datum, opt.datum, georef);\n      opt.datum = georef.datum();\n    }\n\n    if (opt.datum_str.empty() && !have_user_datum && opt.target_srs_string.empty())\n      vw_throw(ArgumentErr() << \"Missing input datum. Must set one of: \"\n                << \"--datum,  --t_srs, --semi-major-axis, and --semi-minor-axis, \"\n                << \"--t_srs, or --dem-file.\\n\" << usage << general_options);\n\n    if (opt.height_range[0] >= opt.height_range[1])\n      vw_throw(ArgumentErr() << \"Must specify a valid range of heights.\\n\"\n                << usage << general_options);\n\n    if (opt.lon_lat_range.empty())\n      vw_throw(ArgumentErr() << \"Must specify a valid range for longitude and latitude.\\n\"\n                << usage << general_options);\n\n    vw_out() << \"Height range is \" << opt.height_range[0] << ' ' << opt.height_range[1] \n             << \" meters.\\n\";\n    vw_out() << \"Lon-lat range is \" << opt.lon_lat_range.min() << ' ' \n             << opt.lon_lat_range.max() << \" degrees.\\n\";\n  }\n\n  // If the DEM file is provided, the lon-lat and height ranges must not be set \n  if (!opt.dem_file.empty()) {\n    if (opt.lon_lat_range != BBox2(0,0,0,0))\n      vw_throw(ArgumentErr() << \"Cannot specify both a DEM file and a lon-lat range.\\n\");\n    if (opt.height_range != Vector2(0,0))\n      vw_throw(ArgumentErr() << \"Cannot specify both a DEM file and a height range.\\n\");\n  }\n  \n  // If the dem file is set, cannot set --datum, --t_srs, --semi-major-axis, or\n  // --semi-minor-axis\n  if (!opt.dem_file.empty()) {\n    if (!opt.datum_str.empty() || !opt.target_srs_string.empty() ||\n        opt.semi_major != 0 || opt.semi_minor != 0)\n      vw_throw(ArgumentErr() << \"Cannot specify --datum, --t_srs, --semi-major-axis, or \"\n                << \"--semi-minor-axis together with --dem-file.\\n\");\n  }\n    \n  // Convert from width and height to min and max\n  if (!opt.image_crop_box.empty()) {\n    BBox2 b = opt.image_crop_box; // make a copy\n    opt.image_crop_box = BBox2i(b.min().x(), b.min().y(), b.max().x(), b.max().y());\n  }\n  \n  // There must be at least 2 samples in each dimension\n  if (opt.num_samples < 2)\n    vw_throw(ArgumentErr() << \"Must have at least 2 samples in each dimension.\\n\");\n}\n\n\n// Add pixel and llh samples along the perimeter and diagonals of image_box.\n// using the DEM.\nvoid sample_dem_perim_diag(BBox2 const& image_box, \n                           vw::CamPtr cam,\n                           ImageViewRef<PixelMask<float>> dem,\n                           GeoReference const& dem_geo,\n                           // Outputs (append to these)\n                           std::vector<Vector3> & all_llh,\n                           std::vector<Vector2> & all_pixels) {\n\n  // Reduce the max by 1, as sample_float_box() assumes the max is inclusive\n  BBox2 b = image_box;\n  b.max() -= Vector2(1, 1);\n\n  // Calc samples on box perimeter and diagonals\n  int num_steps = 100;\n  std::vector<vw::Vector2> points;\n  vw::cartography::sample_float_box(b, points, num_steps);\n  \n  double height_guess = vw::cartography::demHeightGuess(dem);\n  vw::Vector3 xyz_guess(0, 0, 0); // will be updated\n  \n  for (std::size_t j = 0; j < points.size(); j++) {\n    vw::Vector2 pix = points[j];\n    \n    // Intersect the ray going from the given camera pixel with a DEM\n    // Use xyz_guess as initial guess and overwrite it with the new value\n    bool treat_nodata_as_zero = false;\n    bool has_intersection = false;\n    double max_abs_tol = 1e-14;\n    double max_rel_tol = max_abs_tol;\n    double dem_height_error_tol = 1e-3; // 1 mm\n    int num_max_iter = 100;\n    vw::Vector3 xyz;\n    try {\n      \n      // Intersect with the DEM\n      xyz = vw::cartography::\n        camera_pixel_to_dem_xyz(cam->camera_center(pix), \n                                cam->pixel_to_vector(pix),\n                                dem,\n                                dem_geo, \n                                treat_nodata_as_zero,\n                                has_intersection, \n                                dem_height_error_tol, \n                                max_abs_tol, max_rel_tol, \n                                num_max_iter, \n                                xyz_guess, \n                                height_guess);\n    } catch (...) {\n      continue;\n    }\n\n    if (!has_intersection || xyz == vw::Vector3())\n      continue;\n\n    // Update the guess for nex time, now that we have a valid intersection point\n    xyz_guess = xyz;\n\n    vw::Vector3 llh = dem_geo.datum().cartesian_to_geodetic(xyz);\n      \n    all_llh.push_back(llh);\n    all_pixels.push_back(pix);\n    \n  } // end loop through points\n  \n  return;\n}\n\n// Compute the lon-lat box and height range from the DEM\nvoid calc_llh_bbox_from_dem(Options & opt, vw::CamPtr cam,\n                            vw::BBox2 const& image_box,\n                            ImageViewRef<PixelMask<float>> input_img) {\n  \n  vw::vw_out() << \"Estimating the lon-lat-height range from DEM: \" << opt.dem_file << \"\\n\";\n  \n  std::vector<Vector3> all_llh;\n  std::vector<Vector2> all_pixels;\n  \n  float dem_nodata_val = -std::numeric_limits<float>::max(); \n  vw::read_nodata_val(opt.dem_file, dem_nodata_val);\n\n  ImageViewRef<PixelMask<float>> dem \n    = create_mask(DiskImageView<float>(opt.dem_file), dem_nodata_val);\n\n  GeoReference dem_geo;\n  if (!read_georeference(dem_geo, opt.dem_file))\n    vw_throw(ArgumentErr() << \"Missing georef in DEM: \" << opt.dem_file << \".\\n\");\n\n  // Get the datum from the DEM\n  opt.datum = dem_geo.datum();\n\n  // If the DEM is too big, we need to skip points. About\n  // 40,000 points should be good enough to determine 78 RPC\n  // coefficients.\n  double delta_col = std::max(1.0, dem.cols()/double(opt.num_samples));\n  double delta_row = std::max(1.0, dem.rows()/double(opt.num_samples));\n  \n  vw::TerminalProgressCallback tpc(\"asp\", \"\\t--> \");  \n  double inc_amount = delta_col / dem.cols();\n  \n  tpc.report_progress(0);\n  for (double dcol = 0; dcol < dem.cols(); dcol += delta_col) {\n    for (double drow = 0; drow < dem.rows(); drow += delta_row) {\n      int col = dcol, row = drow; // cast to int\n\n      if (!is_valid(dem(col, row))) \n        continue;\n\n      Vector2 pix(col, row);\n      Vector2 lonlat = dem_geo.pixel_to_lonlat(pix);\n\n      // Lon lat height\n      Vector3 llh;\n      llh[0] = lonlat[0]; llh[1] = lonlat[1]; llh[2] = dem(col, row).child();\n      Vector3 xyz = opt.datum.geodetic_to_cartesian(llh);\n\n      // Go back to llh. This is a bugfix for the 360 deg offset problem.\n      llh = opt.datum.cartesian_to_geodetic(xyz);\n\n      Vector2 cam_pix;\n      try {\n        // The point_to_pixel function can be capricious\n        cam_pix = cam->point_to_pixel(xyz);\n      } catch(...) {\n        continue;\n      }\n\n      if (image_box.contains(cam_pix) && is_valid(input_img(cam_pix[0], cam_pix[1]))) {\n        all_llh.push_back(llh);\n        all_pixels.push_back(cam_pix);\n      }\n\n    }\n    tpc.report_incremental_progress(inc_amount);\n  } // end loop through DEM pixels\n  tpc.report_finished();\n\n  // Add pixel and llh samples along the perimeter and diagonals of image_box.\n  // using the DEM.\n  sample_dem_perim_diag(image_box, cam, dem, dem_geo, all_llh, all_pixels);\n\n  // Based on these, find th lon-lat and height ranges\n  opt.lon_lat_range = BBox2();\n  double big = std::numeric_limits<double>::max();\n  opt.height_range  = Vector2(big, -big);\n  for (std::size_t i = 0; i < all_llh.size(); i++) {\n    Vector3 llh = all_llh[i];\n    opt.lon_lat_range.grow(Vector2(llh[0], llh[1]));\n    opt.height_range[0] = std::min(opt.height_range[0], llh[2]);\n    opt.height_range[1] = std::max(opt.height_range[1], llh[2]);\n  }\n  \n  vw::vw_out() << \"Computed lon-lat range: \" << opt.lon_lat_range << \"\\n\";\n  vw::vw_out() << \"Computed height range: \" << opt.height_range << \"\\n\";\n  \n  return;\n}\n\nint main(int argc, char *argv[]) {\n\n  Options opt;\n  try {\n\n    handle_arguments(argc, argv, opt);\n    \n    bool allow_map_promote = false;\n    asp::SessionPtr session(asp::StereoSessionFactory::create\n                       (opt.stereo_session, // may change\n                        opt,\n                        opt.image_file, opt.image_file,\n                        opt.camera_file, opt.camera_file,\n                        opt.output_rpc,\n                        opt.dem_file,\n                        allow_map_promote));\n\n    // If the session was passed in or guessed isis or rpc, adjust for the fact\n    // that the isis .cub file also has camera info.\n    if (opt.output_rpc.empty() &&\n         ((session->name() == \"isis\"         ||\n           session->name() == \"isismapisis\") ||\n          session->name()  == \"rpc\")) {\n      // The user did not provide an output file. Then the camera\n      // information is contained within the image file and what is in\n      // the camera file is actually the output file.\n      opt.output_rpc  = opt.camera_file;\n      opt.camera_file = opt.image_file;\n    }\n\n    if (opt.camera_file.empty())\n      vw_throw(ArgumentErr() << \"Missing input camera.\\n\");\n\n    if (opt.output_rpc.empty())\n      vw_throw(ArgumentErr() << \"Missing output RPC file.\\n\");\n\n    // Create the output directory\n    vw::create_out_dir(opt.output_rpc);\n\n    vw::CamPtr cam = session->camera_model(opt.image_file, opt.camera_file);\n\n    // Get the input nodata value from the image file, unless the\n    // user overwrites it.\n    float val = std::numeric_limits<float>::quiet_NaN();\n    bool has_input_nodata = vw::read_nodata_val(opt.image_file, val);\n    if (has_input_nodata && std::isnan(opt.input_nodata_value))\n      opt.input_nodata_value = val;\n\n    if (!std::isnan(opt.input_nodata_value)) \n      vw_out() << \"Using input nodata value: \" << opt.input_nodata_value << \"\\n\";\n    else\n      has_input_nodata = false;\n\n    // If the output nodata value was not specified, use the input one\n    if (std::isnan(opt.output_nodata_value)) \n      opt.output_nodata_value = opt.input_nodata_value;\n\n    if (!std::isnan(opt.output_nodata_value)) {\n      opt.has_output_nodata = true;\n      vw_out() << \"Using output nodata value: \" << opt.output_nodata_value << \"\\n\";\n    }else{\n      opt.has_output_nodata = false;\n    }\n\n    // Masked input image\n    DiskImageView<float> disk_view(opt.image_file);\n    ImageViewRef<PixelMask<float>> input_img\n      = create_mask(disk_view, opt.input_nodata_value);\n\n    // The bounding box\n    BBox2 image_box = bounding_box(disk_view);\n    if (!opt.image_crop_box.empty()) \n      image_box.crop(opt.image_crop_box);\n\n    // Calc the lon-lat-height ranges based on the DEM rather than the user\n    // input. TODO(oalexan1): Consider explicitly setting opt.datum in main(),\n    // rather than inside this function.\n    if (!opt.dem_file.empty())\n      calc_llh_bbox_from_dem(opt, cam, image_box, input_img);\n\n    // Put this here, after peeking inside the DEM with calc_llh_bbox_from_dem()\n    vw_out() << \"Datum: \" << opt.datum << \"\\n\";\n\n    // Generate point pairs\n    std::vector<Vector3> all_llh;\n    std::vector<Vector2> all_pixels;\n    asp::sample_llh_pix_bbox(opt.lon_lat_range, opt.height_range, opt.num_samples,\n                             opt.datum, cam, image_box, \n                             all_llh, all_pixels); // outputs\n    // Add points for pixels along the perimeter and diagonals of image_box. Constrain\n    // by the ll box.\n    asp::add_perimeter_diag_points(image_box, opt.datum, cam, opt.lon_lat_range, \n                                   opt.height_range,\n                                   all_llh, all_pixels); // outputs\n\n    // The pixel box\n    BBox2 pixel_box;\n    for (std::size_t i = 0; i < all_pixels.size(); i++) \n      pixel_box.grow(all_pixels[i]);\n\n    // Below we assume pixel_box to be max-exclusive, so expand it by 1\n    pixel_box.max() += Vector2(1, 1);\n    \n    // Find the range of lon-lat-heights\n    BBox3 llh_box;\n    for (std::size_t i = 0; i < all_llh.size(); i++) \n      llh_box.grow(all_llh[i]);\n\n    // If cropping, adjust the pixels\n    BBox2 crop_box;\n    if (!opt.no_crop) {\n      // Cast to int so that we can crop properly\n      pixel_box.min() = floor(pixel_box.min());\n      pixel_box.max() = ceil(pixel_box.max());\n      pixel_box.crop(image_box);\n\n      crop_box = pixel_box; // save it before we modify pixel_box\n\n      // Shift all pixels by the crop corner, including the pixel box itself\n      for (std::size_t i = 0; i < all_pixels.size(); i++) \n        all_pixels[i] -= pixel_box.min();\n\n      // Need to first save the corner before subtracting it, otherwise get wrong result\n      Vector2 shift = pixel_box.min(); \n      pixel_box -= shift;\n    }\n\n    if (opt.save_tif) {\n      ImageViewRef<PixelMask<float>> output_img = input_img;\n      if (!opt.no_crop) \n        output_img = crop(input_img, crop_box);\n\n      std::string out_img_file = fs::path(opt.output_rpc).replace_extension(\"tif\").string();\n      vw_out() << \"Writing: \" << out_img_file << \"\\n\";\n\n      GeoReference img_geo;\n      bool has_img_geo = false;\n      vw::TerminalProgressCallback tpc(\"asp\", \"\\t-->: \");\n      vw::cartography::block_write_gdal_image(out_img_file,\n                                              apply_mask(output_img, opt.output_nodata_value),\n                                              has_img_geo, img_geo,\n                                              opt.has_output_nodata,\n                                              opt.output_nodata_value,\n                                              opt, tpc);\n    }\n\n    if (opt.skip_computing_rpc) \n      return 0;\n\n    Vector3 llh_scale  = (llh_box.max() - llh_box.min())/2.0; // half range\n    Vector3 llh_offset = (llh_box.max() + llh_box.min())/2.0; // center point\n\n    Vector2 pixel_scale  = (pixel_box.max() - pixel_box.min())/2.0; // half range \n    Vector2 pixel_offset = (pixel_box.max() + pixel_box.min())/2.0; // center point\n\n    vw_out() << \"Lon-lat-height box for the RPC approx: \" << llh_box   << \"\\n\";\n    vw_out() << \"Camera pixel box for the RPC approx (after crop): \" << pixel_box << \"\\n\";\n\n    // Form the vectors of normalized llh and pixel values\n    Vector<double> normalized_llh;\n    Vector<double> normalized_pixels;\n    asp::normalizeLlhPix(all_llh, all_pixels, llh_offset, llh_scale,\n                         pixel_offset, pixel_scale,\n                         normalized_llh, normalized_pixels); // outputs\n\n    // Find the RPC coefficients\n    asp::RPCModel::CoeffVec line_num, line_den, samp_num, samp_den;\n    vw_out() << \"Generating the RPC approximation using \" << all_llh.size()\n             << \" point pairs.\\n\";\n    bool refine_only = false;\n    asp::gen_rpc(// Inputs\n                 opt.penalty_weight, normalized_llh, normalized_pixels,\n                 refine_only,\n                 // Outputs\n                 line_num, line_den, samp_num, samp_den);\n\n    // Form and save the model\n    vw::vw_out() << \"Writing: \" << opt.output_rpc << \"\\n\";\n    vw::cartography::Datum datum(opt.datum);\n    asp::RPCModel rpc(datum, line_num, line_den, samp_num, samp_den,\n                      pixel_offset, pixel_scale, llh_offset, llh_scale);\n    rpc.saveXML(opt.output_rpc);\n\n  } ASP_STANDARD_CATCHES;\n\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/cam_gen.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Create a pinhole, optical bar, or csm camera model based on intrinsics, image\n// corner coordinates, and other attributes. See the doc for more info.\n\n#include <asp/Sessions/StereoSession.h>\n#include <asp/Sessions/StereoSessionFactory.h>\n#include <asp/Sessions/CameraUtils.h>\n#include <asp/Camera/CameraResectioning.h>\n#include <asp/Camera/CsmModel.h>\n#include <asp/Camera/LinescanUtils.h>\n#include <asp/Camera/CsmUtils.h>\n#include <asp/Camera/CsmModelFit.h>\n#include <asp/Camera/RPCModel.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/AspProgramOptions.h>\n#include <asp/Core/Macros.h>\n#include <asp/Core/FileUtils.h>\n#include <asp/Core/PointUtils.h>\n#include <asp/Core/EigenUtils.h>\n#include <asp/Core/ReportUtils.h>\n#include <asp/Core/CameraTransforms.h>\n\n#include <asp/asp_config.h> // defines ASP_HAVE_PKG_ISIS\n#if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1\n#include <asp/IsisIO/IsisCameraModel.h>\n#endif // ASP_HAVE_PKG_ISIS\n\n#include <vw/FileIO/DiskImageIO.h>\n#include <vw/FileIO/DiskImageView.h>\n#include <vw/Core/StringUtils.h>\n#include <vw/Camera/PinholeModel.h>\n#include <vw/Camera/CameraUtilities.h>\n#include <vw/Camera/LensDistortion.h>\n#include <vw/Cartography/CameraDatumFit.h>\n#include <vw/Cartography/Datum.h>\n#include <vw/Cartography/GeoReference.h>\n#include <vw/Cartography/CameraBBox.h>\n#include <vw/Math/LevenbergMarquardt.h>\n#include <vw/Math/Geometry.h>\n#include <vw/Stereo/StereoModel.h>\n#include <vw/Camera/OpticalBarModel.h>\n#include <vw/Cartography/DatumUtils.h>\n#include <vw/FileIO/FileTypes.h>\n#include <vw/FileIO/FileUtils.h>\n\n#include <boost/filesystem.hpp>\n#include <boost/algorithm/string.hpp>\n#include <boost/program_options.hpp>\n#include <boost/algorithm/string/predicate.hpp>\n\n#include <nlohmann/json.hpp>\n\n#include <cstring>\n#include <limits>\n#include <set>\n\nnamespace fs = boost::filesystem;\nnamespace po = boost::program_options;\nusing json = nlohmann::json;\n\nusing namespace vw;\nusing namespace vw::camera;\nusing namespace vw::cartography;\n\n/// Find the best camera that fits the current GCP\nvoid fit_camera_to_xyz_ht(Vector3 const& known_cam_ctr, // may not be known\n                          Vector3 const& estim_cam_ctr, // may not be known\n                          std::string const& camera_type,\n                          bool refine_camera,\n                          std::vector<Vector3> const& xyz_vec,\n                          std::vector<double> const& pixel_values,\n                          double cam_height, double cam_weight, double cam_ctr_weight,\n                          vw::cartography::Datum const& datum,\n                          bool verbose,\n                          boost::shared_ptr<CameraModel> & out_cam) {\n\n  // Create fake points in space at given distance from this camera's\n  // center and corresponding actual points on the ground.  Use 500\n  // km, just some height not too far from actual satellite height.\n  double ht = 500000.0;\n  int num_pts = pixel_values.size()/2;\n  vw::Matrix<double> in, out;\n  std::vector<vw::Vector2>  pixel_vec;\n  in.set_size(3, num_pts);\n  out.set_size(3, num_pts);\n  for (int col = 0; col < in.cols(); col++) {\n    if (estim_cam_ctr != Vector3(0, 0, 0)) {\n      // We know the camera center. Use that.\n      // TODO(oalexan1): Problem with RPC!\n      ht = norm_2(xyz_vec[col] - estim_cam_ctr);\n    }\n    Vector2 pix = Vector2(pixel_values[2*col], pixel_values[2*col+1]);\n    Vector3 a = out_cam->camera_center(Vector2(0, 0)) + ht * out_cam->pixel_to_vector(pix);\n    pixel_vec.push_back(pix);\n    for (int row = 0; row < in.rows(); row++) {\n      in(row, col)  = a[row];\n      out(row, col) = xyz_vec[col][row];\n    }\n  }\n\n  // Apply a transform to the camera so that the fake points are on top of the real points\n  Matrix<double, 3, 3> rotation;\n  Vector3 translation;\n  double scale;\n  find_3D_transform(in, out, rotation, translation, scale);\n  if (camera_type == \"opticalbar\") {\n    ((vw::camera::OpticalBarModel*)out_cam.get())->apply_transform(rotation,\n                                   translation, scale);\n    if (known_cam_ctr != Vector3(0, 0, 0))\n    ((vw::camera::OpticalBarModel*)out_cam.get())->set_camera_center(known_cam_ctr);\n  } else if (camera_type == \"pinhole\") {\n\n    // The logic based on fake points can give junk results. Use instead the\n    // state-of-the-art OpenCV solver. TODO(oalexan1): Need to consider using\n    // this solution also for OpticalBar.\n    try {\n      asp::findCameraPose(xyz_vec, pixel_vec, *(PinholeModel*)out_cam.get());\n    } catch(std::exception const& e) {\n      vw_out() << \"Failed to find the camera pose using OpenCV. Falling back \"\n                << \"to ASP's internal approach. This is not as robust. \"\n                << \"Check your inputs and validate the produced camera.\\n\";\n      // Fall back to previous logic\n      ((PinholeModel*)out_cam.get())->apply_transform(rotation, translation, scale);\n    }\n\n    // Overwrite the solved camera center with what is surely known\n    if (known_cam_ctr != Vector3(0, 0, 0))\n      ((PinholeModel*)out_cam.get())->set_camera_center(known_cam_ctr);\n  }\n\n  // Print out some errors\n  if (verbose) {\n    std::vector<double> errors;\n    for (size_t corner_it = 0; corner_it < num_pts; corner_it++) {\n      vw::Vector2 pix1 = out_cam.get()->point_to_pixel(xyz_vec[corner_it]);\n      vw::Vector2 pix2 = Vector2(pixel_values[2*corner_it], pixel_values[2*corner_it+1]);\n      errors.push_back(norm_2(pix1 - pix2));\n    }\n    vw::vw_out() << \"Median pixel projection error in the coarse camera: \"\n                 << vw::math::destructive_median(errors) << \"\\n\";\n  }\n\n  Vector3 xyz0 = out_cam.get()->camera_center(vw::Vector2());\n\n  // Solve a little optimization problem to make the points on the ground project\n  // as much as possible exactly into the image corners.\n  if (refine_camera) {\n    if (camera_type == \"opticalbar\")\n      fitOpticalBar(xyz_vec, cam_height, cam_weight, cam_ctr_weight, datum, pixel_values,\n                             *((vw::camera::OpticalBarModel*)out_cam.get()));\n    else if (camera_type == \"pinhole\")\n      fitPinhole(xyz_vec, cam_height, cam_weight, cam_ctr_weight, datum, pixel_values,\n                          *((PinholeModel*)out_cam.get()));\n    else\n      vw_throw(ArgumentErr() << \"Unknown camera type: \" << camera_type << \".\\n\");\n\n    if (verbose) {\n      std::vector<double> errors;\n      for (size_t corner_it = 0; corner_it < num_pts; corner_it++) {\n        vw::Vector2 pix1 = out_cam.get()->point_to_pixel(xyz_vec[corner_it]);\n        vw::Vector2 pix2 = Vector2(pixel_values[2*corner_it], pixel_values[2*corner_it+1]);\n        errors.push_back(norm_2(pix1 - pix2));\n      }\n      vw::vw_out() << \"Median pixel projection error in the refined camera: \"\n                   << vw::math::destructive_median(errors) << \"\\n\";\n    }\n\n  } // End camera refinement case\n}\n\n// Parse numbers or strings from a list where they are separated by commas or spaces.\ntemplate<class T>\nvoid parse_values(std::string list, std::vector<T> & values) {\n\n  values.clear();\n\n  // Replace commas with spaces\n  std::string oldStr = \",\", newStr = \" \";\n  size_t pos = 0;\n  while ((pos = list.find(oldStr, pos)) != std::string::npos) {\n    list.replace(pos, oldStr.length(), newStr);\n    pos += newStr.length();\n  }\n\n  // Read the values one by one\n  std::istringstream is(list);\n  T val;\n  while (is >> val)\n    values.push_back(val);\n}\n\n// Parse the frame index to extract lon_lat_values_str. Look for a line\n// having this image, and search for \"POLYGON\" followed by spaces and \"((\".\nvoid parseFrameIndex(std::string const& frame_index,\n                     std::string const& image_file,\n                     bool parse_eci, bool parse_ecef,\n                     double cam_weight, \n                     std::string & lon_lat_values_str,\n                     std::string & parsed_camera_center_str,\n                     std::string & parsed_cam_quat_str) { \n  \n  boost::filesystem::path p(image_file);\n  std::string image_base = p.stem().string(); // strip the directory name and suffix\n  std::ifstream file(frame_index.c_str());\n  std::string line;\n  std::string beg1 = \"POLYGON\";\n  std::string beg2 = \"((\";\n  std::string end = \"))\";\n  \n  while (getline(file, line, '\\n')) {\n    if (line.find(image_base) != std::string::npos) {\n      // Find POLYGON first.\n      int beg_pos = line.find(beg1);\n      if (beg_pos == std::string::npos)\n        vw_throw(ArgumentErr() << \"Cannot find \" << beg1 << \" in line: \" << line << \".\\n\");\n      beg_pos += beg1.size();\n\n      // Move forward skipping any spaces until finding \"((\"\n      beg_pos = line.find(beg2, beg_pos);\n      if (beg_pos == std::string::npos)\n        vw_throw(ArgumentErr() << \"Cannot find \" << beg2 << \" in line: \" << line << \".\\n\");\n      beg_pos += beg2.size();\n\n      // Find \"))\"\n      int end_pos = line.find(end, beg_pos);\n      if (end_pos == std::string::npos)\n        vw_throw(ArgumentErr() << \"Cannot find \" << end << \" in line: \" << line << \".\\n\");\n      lon_lat_values_str = line.substr(beg_pos, end_pos - beg_pos);\n      vw_out() << \"Parsed the lon-lat corner values: \"\n                << lon_lat_values_str << \"\\n\";\n\n      if (parse_eci && parse_ecef)\n        vw_throw(ArgumentErr() << \"Cannot parse both ECI end ECEF at the same time.\\n\");\n\n      // Also parse the camera height constraint, unless manually specified\n      if (cam_weight > 0 || parse_eci || parse_ecef) {\n        std::vector<std::string> vals;\n        parse_values<std::string>(line, vals);\n\n        if (vals.size() < 12)\n          vw_throw(ArgumentErr() << \"Could not parse 12 values from: \" << line << \".\\n\");\n\n        // Extract the ECI or ECEF coordinates of camera\n        // center. Keep them as string until we can convert to\n        // height above datum.\n\n        if (parse_eci) {\n          std::string x = vals[5];\n          std::string y = vals[6];\n          std::string z = vals[7];\n          parsed_camera_center_str = x + \" \" + y + \" \" + z;\n          vw_out() << \"Parsed the ECI camera center in km: \"\n                   << parsed_camera_center_str <<\".\\n\";\n\n          std::string q0 = vals[8];\n          std::string q1 = vals[9];\n          std::string q2 = vals[10];\n          std::string q3 = vals[11];\n          parsed_cam_quat_str = q0 + \" \" + q1 + \" \" + q2 + \" \" + q3;\n          vw_out() << \"Parsed the ECI quaternion: \" << parsed_cam_quat_str <<\".\\n\";\n        }\n\n        if (parse_ecef) {\n          if (vals.size() < 19)\n            vw_throw(ArgumentErr() << \"Could not parse 19 values from: \" << line << \".\\n\");\n\n          std::string x = vals[12];\n          std::string y = vals[13];\n          std::string z = vals[14];\n          parsed_camera_center_str = x + \" \" + y + \" \" + z;\n          vw_out() << \"Parsed the ECEF camera center in km: \" \n                   << parsed_camera_center_str <<\".\\n\";\n\n          std::string q0 = vals[15];\n          std::string q1 = vals[16];\n          std::string q2 = vals[17];\n          std::string q3 = vals[18];\n          parsed_cam_quat_str = q0 + \" \" + q1 + \" \" + q2 + \" \" + q3;\n          vw_out() << \"Parsed the ECEF quaternion: \"\n                   << parsed_cam_quat_str <<\".\\n\";\n        }\n      } // End parsing camera height constraint\n      \n      break;\n    } // end of if we found the image name in the line\n  } // end of loop through lines in frame index file\n\n  if (lon_lat_values_str == \"\")\n    vw_throw(ArgumentErr() << \"Could not parse the entry for \" << image_base\n              << \" in file: \" << frame_index << \".\\n\");\n}\n\nstruct Options : public vw::GdalWriteOptions {\n  std::string image_file, out_camera, lon_lat_values_str, pixel_values_str, datum_str,\n    reference_dem, frame_index, gcp_file, camera_type, sample_file, input_camera,\n    stereo_session, bundle_adjust_prefix, parsed_camera_center_str, parsed_cam_quat_str,\n    distortion_str, distortion_type, refine_intrinsics, extrinsics_file;\n  double focal_length, pixel_pitch, gcp_std, height_above_datum,\n    cam_height, cam_weight, cam_ctr_weight;\n  Vector2 optical_center;\n  vw::Vector3 camera_center, camera_center_llh;\n  std::vector<double> lon_lat_values, pixel_values, distortion;\n  bool refine_camera, parse_eci, parse_ecef, planet_pinhole;\n  int num_pixel_samples;\n  bool exact_tsai_to_csm_conv;\n  vw::cartography::Datum datum;\n  Options(): focal_length(-1), pixel_pitch(-1), gcp_std(1), height_above_datum(0), refine_camera(false), cam_height(0), cam_weight(0), cam_ctr_weight(0),\n  planet_pinhole(false), parse_eci(false), parse_ecef(false), num_pixel_samples(0),\n  exact_tsai_to_csm_conv(false) {}\n};\n\nvoid handle_arguments(int argc, char *argv[], Options& opt) {\n\n  double nan = std::numeric_limits<double>::quiet_NaN();\n  po::options_description general_options(\"\");\n  general_options.add_options()\n    (\"output-camera-file,o\", po::value(&opt.out_camera), \n     \"Specify the output camera file.\")\n    (\"camera-type\", po::value(&opt.camera_type)->default_value(\"pinhole\"), \"Specify the camera type. Options are: pinhole (default), opticalbar, linescan, and rpc.\")\n    (\"lon-lat-values\", po::value(&opt.lon_lat_values_str)->default_value(\"\"),\n    \"A (quoted) string listing numbers, separated by commas or spaces, \"\n    \"having the longitude and latitude (alternating and in this \"\n    \"order) of each image corner or some other list of pixels given \"\n    \"by ``--pixel-values``. If the corners are used, they are traversed \"\n    \"in the order (0, 0) (w, 0) (w, h), (0, h) where w and h are the \"\n     \"image width and height.\")\n    (\"pixel-values\", po::value(&opt.pixel_values_str)->default_value(\"\"), \"A (quoted) string listing numbers, separated by commas or spaces, having the column and row (alternating and in this order) of each pixel in the raw image at which the longitude and latitude is known and given by --lon-lat-values. By default this is empty, and will be populated by the image corners traversed as mentioned at the earlier option.\")\n    (\"reference-dem\", po::value(&opt.reference_dem)->default_value(\"\"),\n     \"Use this DEM to infer the heights above datum of the image corners.\")\n    (\"datum\", po::value(&opt.datum_str)->default_value(\"\"),\n     \"Use this datum to interpret the longitude and latitude, unless a DEM is given. Options: WGS_1984, D_MOON (1,737,400 meters), D_MARS (3,396,190 meters), MOLA (3,396,000 meters), NAD83, WGS72, and NAD27. Also accepted: Earth (=WGS_1984), Mars (=D_MARS), Moon (=D_MOON).\")\n    (\"height-above-datum\", po::value(&opt.height_above_datum)->default_value(0),\n     \"Assume this height above datum in meters for the image corners unless read from the DEM.\")\n    (\"sample-file\", po::value(&opt.sample_file)->default_value(\"\"),\n     \"Read the camera intrinsics from this file. Required for opticalbar bar cameras.\")\n    (\"focal-length\", po::value(&opt.focal_length)->default_value(0),\n     \"The camera focal length.\")\n    (\"optical-center\", po::value(&opt.optical_center)->default_value(Vector2(nan, nan),\"NaN NaN\"),\n     \"The camera optical center (horizontal and vertical components). If not specified for \"\n     \"pinhole cameras, it will be set to image center (half of image dimensions) times the \"\n     \"pixel pitch. The optical bar camera always uses the image center.\")\n    (\"pixel-pitch\", po::value(&opt.pixel_pitch)->default_value(0),\n      \"The camera pixel pitch, that is, the width of a pixel. It can be in millimeters, \"\n      \"and then the focal length and optical center must be in millimeters as well. \"\n      \"If set to 1, the focal length and optical center are in units of pixel.\")\n    (\"distortion\", po::value(&opt.distortion_str)->default_value(\"\"),\n     \"Distortion model parameters. It is best to leave this blank and have the program \"\n     \"determine them. By default, the OpenCV radial-tangential lens distortion \"\n     \"model is used. Then, can specify 5 numbers, in quotes, in the order \"\n     \"k1, k2, p1, p2, k3. Also supported are the radial distortion model with 3 \"\n     \"parameters, k1, k2, and k3, and the transverse model, which needs 20 values. The \"\n     \"latter are the coefficients of a pair of polynomials of degree 3 in x and y. Only \"\n     \"applicable when creating CSM cameras. The default is zero distortion. See also \"\n     \"--distortion-type.\")\n    (\"distortion-type\", po::value(&opt.distortion_type)->default_value(\"radtan\"),\n     \"Set the distortion type. Options: radtan, radial, and transverse. Only \"\n     \"applicable when creating CSM Frame cameras.\")\n    (\"camera-center\",\n     po::value(&opt.camera_center)->default_value(Vector3(nan, nan, nan),\"NaN NaN NaN\"),\n     \"The camera center in ECEF coordinates. If not set, the program will solve for it.\"\n     \"If setting --refine-camera, consider using --cam-ctr-weight.\")\n    (\"camera-center-llh\",\n     po::value(&opt.camera_center_llh)->default_value(Vector3(nan, nan, nan),\"NaN NaN NaN\"),\n     \"The camera center as lon-lat-height relative to the datum. See also --camera-center.\")\n    (\"refine-camera\", po::bool_switch(&opt.refine_camera)->default_value(false)->implicit_value(true),\n     \"After a rough initial camera is obtained, refine its pose using least squares. \"\n     \"Consider not refining the camera here, but having bundle_adjust take in the camera \"\n     \"as-is, together with GCP.\")\n    (\"refine-intrinsics\", po::value(&opt.refine_intrinsics)->default_value(\"\"),\n     \"Refine the camera intrinsics together with the camera pose. Specify, in quotes, or as comma as separator, one or more of: focal_length, optical_center, other_intrinsics (distortion). Also can set as 'all' or 'none'. In the latter mode only the camera pose is optimized. Applicable only with option --input-camera and when creating a CSM Frame camera model.\")\n    (\"num-pixel-samples\", po::value(&opt.num_pixel_samples)->default_value(10000),\n     \"Number of uniformly distributed pixel samples to use with option --refine-intrinsics.\")\n    (\"frame-index\", po::value(&opt.frame_index)->default_value(\"\"),\n     \"A file used to look up the longitude and latitude of image corners based on the image name, in the format provided by the SkySat video product.\")\n    (\"gcp-file\", po::value(&opt.gcp_file)->default_value(\"\"),\n     \"If provided, save the image corner coordinates and heights in the GCP format to this file.\")\n    (\"gcp-std\", po::value(&opt.gcp_std)->default_value(1),\n     \"The standard deviation for each GCP pixel, if saving a GCP file. A smaller value suggests a more reliable measurement, hence will be given more weight.\")\n    (\"cam-height\", po::value(&opt.cam_height)->default_value(0),\n     \"If both this and --cam-weight are positive, enforce that the output camera is at this height above datum. For SkySat, if not set, read this from the frame index. Highly experimental.\")\n    (\"cam-weight\", po::value(&opt.cam_weight)->default_value(0),\n     \"If positive, try to enforce the option --cam-height with this weight (bigger weight means try harder to enforce).\")\n    (\"cam-ctr-weight\", po::value(&opt.cam_ctr_weight)->default_value(0),\n     \"If positive, try to enforce that during camera refinement the camera center stays close to the initial value (bigger weight means try harder to enforce this; a value like 1000.0 is good enough).\")\n    (\"parse-eci\", po::bool_switch(&opt.parse_eci)->default_value(false)->implicit_value(true),\n     \"Create cameras based on ECI positions and orientations (not working).\")\n    (\"parse-ecef\", \n      po::bool_switch(&opt.parse_ecef)->default_value(false)->implicit_value(true),\n     \"Create cameras based on ECEF position (but not orientation).\")\n    (\"input-camera\", po::value(&opt.input_camera)->default_value(\"\"),\n     \"Create a camera approximating this camera. See the examples in the documentation \"\n     \"for various applications.\")\n    (\"session-type,t\",   po::value(&opt.stereo_session)->default_value(\"\"),\n     \"Select the input camera model type. Normally this is auto-detected, but may need to be specified if the input camera model is in XML format. See the doc for options.\")\n    (\"extrinsics\", po::value(&opt.extrinsics_file)->default_value(\"\"),\n     \"Read a file having on each line an image name and extrinsic parameters as \"\n     \"longitude, latitude, height above datum, roll, pitch, and yaw. Write one .tsai \"\n     \"camera file per image.\")\n    (\"bundle-adjust-prefix\", po::value(&opt.bundle_adjust_prefix),\n     \"Use the camera adjustment obtained by previously running bundle_adjust \"\n     \"when providing an input camera.\")\n  ;\n\n  general_options.add(vw::GdalWriteOptionsDescription(opt));\n\n  po::options_description positional(\"\");\n  positional.add_options()\n    (\"image-file\", po::value(&opt.image_file));\n\n  po::positional_options_description positional_desc;\n  positional_desc.add(\"image-file\",1);\n\n  std::string usage(\"[options] <image-file> -o <camera-file>\");\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line(argc, argv, opt, general_options, general_options,\n                            positional, positional_desc, usage,\n                            allow_unregistered, unregistered);\n\n  // If extrinsics file is set, must have datum and sample file\n  if (opt.extrinsics_file != \"\") {\n    if (opt.datum_str == \"\")\n      vw_throw(ArgumentErr() << \"Must provide a datum when reading extrinsics.\\n\");\n    if (opt.sample_file == \"\")\n      vw_throw(ArgumentErr() << \"Must provide a sample file when reading extrinsics.\\n\");\n    // The rest of the options do not apply\n    return;\n  }\n\n  if (opt.image_file.empty())\n    vw_throw(ArgumentErr() << \"Missing the input image.\\n\");\n\n  if (opt.out_camera.empty())\n    vw_throw(ArgumentErr() << \"Missing the output camera file name.\\n\");\n\n  boost::to_lower(opt.camera_type);\n\n  // Need this to be able to load adjusted camera models. That will happen\n  // in the stereo session.\n  asp::stereo_settings().bundle_adjust_prefix = opt.bundle_adjust_prefix;\n\n  if (opt.camera_type != \"pinhole\" && opt.camera_type != \"opticalbar\" &&\n      opt.camera_type != \"linescan\" && opt.camera_type != \"rpc\")\n    vw_throw(ArgumentErr() << \"Only pinhole, opticalbar, linescan, and rpc \"\n               << \"cameras are supported.\\n\");\n\n  if ((opt.camera_type == \"opticalbar\") && (opt.sample_file == \"\"))\n    vw_throw(ArgumentErr() << \"opticalbar type must use a sample camera file.\\n\");\n\n  std::string out_ext = vw::get_extension(opt.out_camera);\n  if (out_ext != \".tsai\" && out_ext != \".json\" && opt.camera_type != \"rpc\")\n    vw_throw(ArgumentErr() << \"For the given inputs, the output camera file must end \"\n             << \"with .tsai or .json.\\n\");\n\n  if (opt.camera_type == \"linescan\" && out_ext != \".json\")\n    vw_throw(ArgumentErr() << \"An output linescan camera must end with .json.\\n\");\n\n  if (opt.camera_type == \"opticalbar\" && out_ext != \".tsai\")\n    vw_throw(ArgumentErr() << \"An output optical bar camera must be in .tsai format.\\n\");\n\n  if (opt.camera_type == \"rpc\" && out_ext != \".xml\")\n    vw_throw(ArgumentErr() << \"An output RPC camera must be in .xml format.\\n\");\n    \n  // Create the output directory\n  vw::create_out_dir(opt.out_camera);\n\n  // This will be empty if an input camera is not specified\n  std::string input_ext = vw::get_extension(opt.input_camera);\n\n  // The rest of the logic does not apply to linescan and rpc cameras\n  if ((opt.camera_type == \"linescan\" && input_ext != \".tsai\") || opt.camera_type == \"rpc\")\n    return;\n\n  // Planet's custom format\n  opt.planet_pinhole = boost::algorithm::ends_with(opt.input_camera, \"_pinhole.json\");\n  if (opt.planet_pinhole && !opt.datum_str.empty()) {\n    // Can only use WGS84 for Planet cameras\n    vw::cartography::Datum datum1(opt.datum_str);\n    vw::cartography::Datum datum2(\"WG84\");\n    bool warn_only = false;\n    vw::checkDatumConsistency(datum1, datum2, warn_only);\n  }\n  if (opt.planet_pinhole && opt.datum_str.empty()) {\n    opt.datum_str = \"WGS84\";\n    vw::vw_out() << \"Setting the datum to: \" << opt.datum_str << \"\\n\";\n  }\n\n  if (opt.planet_pinhole && (opt.refine_camera || opt.refine_intrinsics != \"\"))\n    vw_throw(ArgumentErr() << \"Cannot refine the pose or intrinsics for a pinhole camera \"\n             \"read from a Planet JSON file. Consider running this tool to first convert \"\n             \"it to ASP's format, and later refine that using another invocation. \"\n             \"Note that camera refinement will not preserve the camera center.\\n\");\n\n  if ((opt.cam_weight > 0 || opt.cam_ctr_weight > 0) && opt.refine_intrinsics != \"\")\n   vw_throw(ArgumentErr() << \"The option for refining the intrinsics cannot, \"\n            \"for the time being, constrain either the camera height or camera center.\\n\");\n\n  // Set the datum from the string\n  if (!opt.datum_str.empty())\n    opt.datum.set_well_known_datum(opt.datum_str);\n\n  if (!opt.planet_pinhole && !opt.input_camera.empty()) {\n    // Guess the datum from the camera model\n    asp::SessionPtr session;\n    vw::cartography::Datum cam_datum;\n    bool found_cam_datum = asp::datum_from_camera(opt.image_file, opt.input_camera,\n                                                  // Outputs\n                                                  opt.stereo_session, session, cam_datum);\n    // For pinhole session the guessed datum may be unreliable, so warn only\n    bool warn_only = (opt.stereo_session.find(\"pinhole\") != std::string::npos);\n    if (found_cam_datum && !opt.datum_str.empty())\n      vw::checkDatumConsistency(cam_datum, opt.datum, warn_only);\n    // opt.datum is more general than opt.datum_str, but set both\n    if (found_cam_datum && opt.datum_str.empty()) {\n      opt.datum = cam_datum;\n      opt.datum_str = cam_datum.name();\n    }\n  }\n  \n  // Must do the same for opt.sample_file. This and opt.input_camera are used for\n  // different things. opt.sample_file may not even be an orbital camera.\n  if (!opt.sample_file.empty()) {\n    // Guess the datum from the camera model\n    asp::SessionPtr session;\n    std::string local_session_str = \"\"; // may be different than input camera session \n    vw::cartography::Datum cam_datum;\n    bool found_cam_datum = false;\n    found_cam_datum = asp::datum_from_camera(opt.image_file, opt.sample_file,\n                                          // Outputs\n                                          local_session_str, session, cam_datum);\n\n    if (found_cam_datum && local_session_str == \"opticalbar\")\n      opt.camera_type = local_session_str; // switch from default pinhole to opticalbar\n      \n    // For pinhole session the guessed datum may be unreliable, so warn only\n    bool warn_only = (opt.stereo_session.find(\"pinhole\") != std::string::npos);\n    if (found_cam_datum && !opt.datum_str.empty())\n      vw::checkDatumConsistency(cam_datum, opt.datum, warn_only);\n    // opt.datum is more general than opt.datum_str, but set both\n    if (found_cam_datum && opt.datum_str.empty()) {\n      opt.datum = cam_datum;\n      opt.datum_str = cam_datum.name();\n    }\n  }\n\n  vw::vw_out() << \"Using datum: \" << opt.datum << \"\\n\";\n  \n  // If we cannot read the data from a DEM, must know the datum\n  if (!opt.planet_pinhole && opt.reference_dem.empty() && opt.datum_str.empty())\n    vw_throw(ArgumentErr() << \"Must provide either a reference DEM or a datum.\\n\");\n\n  if (opt.gcp_std <= 0)\n    vw_throw(ArgumentErr() << \"The GCP standard deviation must be positive.\\n\");\n\n  if (!opt.planet_pinhole && opt.frame_index != \"\" && opt.lon_lat_values_str != \"\")\n    vw_throw(ArgumentErr() << \"Cannot specify both the frame index file \"\n          << \"and the lon-lat corners.\\n\");\n\n  if (opt.cam_weight > 0 && opt.cam_ctr_weight > 0)\n    vw::vw_throw(vw::ArgumentErr()\n                 << \"Cannot enforce the camera center constraint and camera \"\n                 << \"height constraint at the same time.\\n\");\n\n  if (!opt.planet_pinhole && opt.frame_index != \"\")\n    parseFrameIndex(opt.frame_index, opt.image_file,\n                    opt.parse_eci, opt.parse_ecef,\n                    opt.cam_weight,\n                    opt.lon_lat_values_str, \n                    opt.parsed_camera_center_str,\n                    opt.parsed_cam_quat_str);\n  \n  // Parse the pixel values\n  parse_values<double>(opt.pixel_values_str, opt.pixel_values);\n\n  // If none were provided, use the image corners\n  if (!opt.planet_pinhole && opt.pixel_values.empty()) {\n    DiskImageView<float> img(opt.image_file);\n    int wid = img.cols(), hgt = img.rows();\n    if (wid <= 0 || hgt <= 0)\n      vw_throw(ArgumentErr() << \"Could not read an image with positive dimensions from: \"\n                             << opt.image_file << \".\\n\");\n\n    if (opt.input_camera == \"\") {\n      // Populate the corners\n      double arr[] = {0.0, 0.0, wid-1.0, 0.0, wid-1.0, hgt-1.0, 0.0, hgt-1.0};\n      for (size_t it  = 0; it < sizeof(arr)/sizeof(double); it++)\n        opt.pixel_values.push_back(arr[it]);\n    } else {\n      // Sample the camera with 100 points\n      int num = 10;\n      for (int c = 0; c < num; c++) {\n        for (int r = 0; r < num; r++) {\n          opt.pixel_values.push_back((wid - 1.0) * c / double(num - 1));\n          opt.pixel_values.push_back((hgt - 1.0) * r / double(num - 1));\n        }\n      }\n    }\n  }\n\n  // Parse the lon-lat values\n  if (!opt.planet_pinhole && opt.input_camera == \"\") {\n    parse_values<double>(opt.lon_lat_values_str, opt.lon_lat_values);\n    // Bug fix for some frame_index files repeating the first point at the end\n    int len = opt.lon_lat_values.size();\n    if (opt.frame_index != \"\" && opt.lon_lat_values.size() == opt.pixel_values.size() + 2 &&\n        len >= 2 && opt.lon_lat_values[0] == opt.lon_lat_values[len - 2] &&\n        opt.lon_lat_values[1] == opt.lon_lat_values[len - 1]) {\n      opt.lon_lat_values.pop_back();\n      opt.lon_lat_values.pop_back();\n    }\n  }\n\n  // Note that optical center can be negative (for some SkySat products).\n  if (!opt.planet_pinhole &&\n      opt.sample_file == \"\" &&\n      (opt.focal_length <= 0 || opt.pixel_pitch <= 0)) {\n\n      // A pinhole camera can be its own sample file\n      if (input_ext == \".tsai\")\n        opt.sample_file = opt.input_camera;\n      else\n        vw_throw(ArgumentErr() << \"Must provide positive focal length \"\n                << \"and pixel pitch values, or a sample file to read these from.\\n\");\n  }\n\n  if (opt.sample_file != \"\" &&\n      (!vm[\"focal-length\"].defaulted() || !vm[\"optical-center\"].defaulted() ||\n        !vm[\"distortion\"].defaulted()))\n    vw::vw_throw(vw::ArgumentErr() << \"Cannot specify both a sample file and \"\n              << \"focal length, optical center, or distortion.\\n\");\n\n  if ((opt.parse_eci || opt.parse_ecef) && opt.camera_type == \"opticalbar\")\n    vw_throw(ArgumentErr() << \"Cannot parse ECI/ECEF data for an optical bar camera.\\n\");\n\n  // Parse the lens distortion\n  parse_values<double>(opt.distortion_str, opt.distortion);\n\n  // Sanity checks for lens distortion\n  if (opt.camera_type != \"pinhole\" || out_ext != \".json\") {\n    if (opt.distortion.size() != 0)\n      vw_throw(ArgumentErr()\n               << \"Distortion coefficients are only supported for CSM Frame cameras.\\n\");\n    if (opt.refine_intrinsics != \"\")\n      vw_throw(ArgumentErr()\n               << \"Refining intrinsics is only supported for CSM Frame cameras.\\n\");\n  }\n\n  // Populate the distortion parameters for CSM, if not set\n  if (opt.distortion.size() == 0 && opt.camera_type == \"pinhole\" && out_ext == \".json\") {\n    if (opt.distortion_type == \"radtan\") {\n\n      // Consider the special case when we can precisely convert tsai to json,\n      // if the distortion is radtan (tsai) or no distortion.\n      std::vector<double> local_distortion;\n      if (input_ext == \".tsai\") {\n        vw::camera::PinholeModel pin(opt.input_camera);\n        vw::camera::NullLensDistortion const* zero_dist =\n          dynamic_cast<vw::camera::NullLensDistortion const*>(pin.lens_distortion());\n        vw::camera::TsaiLensDistortion const* radtan_dist =\n          dynamic_cast<vw::camera::TsaiLensDistortion const*>(pin.lens_distortion());\n        if (zero_dist != NULL) {\n          // Zero distortion can be thought of as radtan distortion with all zeros\n          local_distortion.resize(5, 0.0);\n          opt.exact_tsai_to_csm_conv = true;\n        } else if (radtan_dist != NULL) {\n          vw::Vector<double> dist = radtan_dist->distortion_parameters();\n          // Must have 5 parameters, else throw an error\n          if (dist.size() != 5)\n            vw_throw(ArgumentErr() << \"Expecting 5 distortion coefficients for tsai \"\n                      << \"distortion, got: \" << dist.size() << \".\\n\");\n          // resize local dist to 5 elem and copy one by one\n          local_distortion.resize(5, 0.0);\n          for (size_t i = 0; i < 5; i++)\n            local_distortion[i] = dist[i];\n          opt.exact_tsai_to_csm_conv = true;\n        }\n      }\n\n      // See if can copy the exact distortion from the tsai file\n      if (!local_distortion.empty())\n        opt.distortion = local_distortion;\n      else\n        opt.distortion.resize(5, 0.0);\n\n    } else if (opt.distortion_type == \"radial\") {\n      opt.distortion.resize(3, 0.0);\n    } else if (opt.distortion_type == \"transverse\") {\n      // This distortion model is a pair of polynomials of degree 3 in x and y.\n      opt.distortion.resize(20, 0.0);\n      // Great care is needed below\n      // Free term for first polynomial\n      opt.distortion[0] = 0;\n      opt.distortion[1] = 1; // Set the x term coeff of first poly to 1.0\n      // Free term for second polynomial\n      opt.distortion[10] = 0;\n      opt.distortion[12] = 1; // Set the y term coeff of second poly to 1.0\n    } else {\n      vw_throw(ArgumentErr() << \"Unknown distortion type: \" << opt.distortion_type << \".\\n\");\n    }\n  }\n\n  if (opt.distortion.size() != 0) {\n    if (opt.distortion_type == \"radtan\" && opt.distortion.size() != 5)\n      vw_throw(ArgumentErr() << \"Expecting 5 distortion coefficients for radtan \"\n               << \"distortion, got: \" << opt.distortion.size() << \".\\n\");\n    if (opt.distortion_type == \"radial\" && opt.distortion.size() != 3)\n      vw_throw(ArgumentErr() << \"Expecting 3 distortion coefficients for radial \"\n               << \"distortion, got: \" << opt.distortion.size() << \".\\n\");\n    if (opt.distortion_type == \"transverse\" && opt.distortion.size() != 20)\n      vw_throw(ArgumentErr() << \"Expecting 20 distortion coefficients for transverse \"\n               << \"distortion, got: \" << opt.distortion.size() << \".\\n\");\n  }\n\n  if (opt.refine_intrinsics != \"\" && opt.input_camera == \"\")\n    vw_throw(ArgumentErr() << \"Must provide an input camera to refine its intrinsics.\\n\");\n\n  if (opt.num_pixel_samples <= 0)\n    vw_throw(ArgumentErr() << \"The number of pixel samples must be positive.\\n\");\n\n} // End function handle_arguments\n\n// Form a camera based on info the user provided\nvoid manufacture_cam(Options & opt, int wid, int hgt, vw::CamPtr & out_cam) {\n  if (opt.camera_type == \"opticalbar\") {\n    boost::shared_ptr<vw::camera::OpticalBarModel> opticalbar_cam =\n      boost::make_shared<vw::camera::OpticalBarModel>(opt.sample_file);\n    // Make sure the image size matches the input image file.\n    // TODO(oalexan1): This looks fishy if the pitch is not 1.\n    opticalbar_cam->set_image_size(Vector2i(wid, hgt));\n    opticalbar_cam->set_optical_center(Vector2(wid/2.0, hgt/2.0));\n    out_cam = opticalbar_cam;\n  } else if (opt.camera_type == \"pinhole\") { // csm frame comes here too\n    \n    std::string sample_ext = vw::get_extension(opt.sample_file);\n    if (opt.sample_file != \"\" && sample_ext == \".json\") {\n      // Read the intrinsics from the csm file. The distortion will be set later.\n      asp::CsmModel csm(opt.sample_file);\n      opt.focal_length = csm.focal_length();\n      opt.pixel_pitch = csm.frame_pixel_pitch();\n      opt.optical_center = csm.optical_center() * csm.frame_pixel_pitch();\n      // TODO(oalexan1): Must copy the target name from CSM\n      opt.distortion = csm.distortion();\n      if (opt.distortion.size() == 5)\n        opt.distortion_type = \"radtan\";\n      else if (opt.distortion.size() == 3)\n        opt.distortion_type = \"radial\";\n      else if (opt.distortion.size() == 20)\n        opt.distortion_type = \"transverse\";\n      else\n        vw_throw(ArgumentErr()\n                 << \"Unsupported distortion model in: \" << opt.sample_file << \".\\n\");\n    }\n\n    boost::shared_ptr<PinholeModel> pinhole_cam;\n    if (opt.sample_file != \"\" &&  sample_ext != \".json\") {\n      // Use the initial guess from file\n      pinhole_cam = boost::make_shared<PinholeModel>(opt.sample_file);\n    } else {\n      // Use the intrinsics from the command line or read from the CSM sample\n      // file. Use trivial rotation and translation.\n      Vector3 ctr(0, 0, 0);\n      Matrix<double, 3, 3> rotation;\n      rotation.set_identity();\n      // When the user does not set the optical center, use the image center\n      Vector2 opt_ctr = opt.optical_center;\n      if (std::isnan(opt_ctr[0]) || std::isnan(opt_ctr[1]))\n        opt_ctr = Vector2(opt.pixel_pitch * wid/2.0, opt.pixel_pitch * hgt/2.0);\n\n      vw::camera::LensDistortion const* distortion = NULL; // no distortion info yet\n      pinhole_cam = boost::make_shared<PinholeModel>\n                      (ctr, rotation, opt.focal_length, opt.focal_length,\n                       opt_ctr[0], opt_ctr[1], distortion, \n                       opt.pixel_pitch);\n    }\n    out_cam = pinhole_cam;\n  }\n}\n\n// Intersect a ray with the DEM or the datum. Return the zero vector on failure.\nvoid dem_or_datum_intersect(Options const& opt, vw::cartography::GeoReference const& geo,\n                            ImageViewRef<PixelMask<float>> const& interp_dem,\n                            vw::CamPtr input_camera_ptr,\n                            vw::Vector2 const& pix,\n                            vw::Vector3 & xyz) { // output\n\n  if (input_camera_ptr.get() == NULL)\n    vw_throw(ArgumentErr() << \"Input camera was not provided.\\n\");\n\n  Vector3 camera_ctr = input_camera_ptr->camera_center(pix);\n  Vector3 camera_vec = input_camera_ptr->pixel_to_vector(pix);\n\n  bool treat_nodata_as_zero = false;\n  bool has_intersection = false;\n  double height_error_tol = 0.01; // error in DEM height, in meters\n  double max_abs_tol = 1e-20; // this will not be reached due to height_error_tol\n  double max_rel_tol = 1e-20;\n  int num_max_iter   = 100;\n  Vector3 xyz_guess  = Vector3();\n\n  xyz = vw::cartography::camera_pixel_to_dem_xyz(camera_ctr, camera_vec,\n                                                 interp_dem, geo, treat_nodata_as_zero,\n                                                 has_intersection, height_error_tol,\n                                                 max_abs_tol, max_rel_tol, num_max_iter,\n                                                 xyz_guess);\n\n  // If we could not intersect the DEM, use the datum to estimate the height\n  if (xyz == Vector3() || !has_intersection)\n    xyz = datum_intersection(geo.datum().semi_major_axis() + opt.height_above_datum,\n                             geo.datum().semi_minor_axis() + opt.height_above_datum,\n                             camera_ctr, camera_vec);\n}\n\n// Trace rays from pixel corners to DEM to see where they intersect the DEM.\n// Save a pointer to the camera, georef, and interp_dem, as we may need these later.\nvoid extract_lon_lat_cam_ctr_from_camera(Options & opt,\n                                         ImageViewRef<PixelMask<float>> const& interp_dem,\n                                         GeoReference const& geo,\n                                         // Outputs\n                                         vw::CamPtr & input_camera_ptr,\n                                         std::vector<double> & cam_heights,\n                                         vw::Vector3 & cam_ctr) {\n\n  cam_heights.clear();\n  cam_ctr = Vector3(0, 0, 0);\n\n  // Load the camera. By now --bundle-adjust-prefix should be set.\n  // We will need it outside of this function.\n  std::string out_prefix;\n    asp::SessionPtr session(asp::StereoSessionFactory::create(opt.stereo_session, // may change\n                               opt,\n                               opt.image_file, opt.image_file,\n                               opt.input_camera, opt.input_camera,\n                               out_prefix));\n  input_camera_ptr = session->camera_model(opt.image_file, opt.input_camera);\n\n  // Store here pixel values for the rays emanating from the pixels at\n  // which we could intersect with the DEM.\n  std::vector<double> good_pixel_values;\n\n  int num_points = opt.pixel_values.size()/2;\n  opt.lon_lat_values.reserve(2*num_points);\n  opt.lon_lat_values.clear();\n\n  // Estimate camera center\n  std::vector<vw::Vector3> ctrs, dirs;\n  int fail_count = 0;\n\n  for (int it = 0; it < num_points; it++) {\n\n    Vector2 pix(opt.pixel_values[2*it], opt.pixel_values[2*it+1]);\n    vw::Vector3 xyz;\n    dem_or_datum_intersect(opt, geo, interp_dem, input_camera_ptr, pix, xyz);\n\n    if (xyz == Vector3()) {\n      fail_count++;\n      continue;\n    }\n                   \n    ctrs.push_back(input_camera_ptr->camera_center(pix));\n    dirs.push_back(input_camera_ptr->pixel_to_vector(pix));\n\n    Vector3 llh = geo.datum().cartesian_to_geodetic(xyz);\n    opt.lon_lat_values.push_back(llh[0]);\n    opt.lon_lat_values.push_back(llh[1]);\n    good_pixel_values.push_back(opt.pixel_values[2*it]);\n    good_pixel_values.push_back(opt.pixel_values[2*it+1]);\n    cam_heights.push_back(llh[2]); // will use it later\n  }\n\n  if (fail_count > 0)\n    vw::vw_out() << \"Number of failures when intersecting the ground with ray samples \"\n                 << \"from the camera: \" << fail_count << \" / \" << num_points << \".\\n\";\n\n  if (good_pixel_values.size() < 6) {\n    vw_throw(ArgumentErr() << \"Successful intersection happened for less than \"\n          << \"3 samples. Will not be able to create a camera. Consider checking \"\n          << \"your inputs, or passing different pixels in --pixel-values. DEM: \"\n          << opt.reference_dem << \".\\n\");\n  }\n\n  // Estimate camera center by triangulating back to the camera. This is necessary\n  // for RPC, which does not store a camera center\n  int num = 0;\n  for (size_t it1 = 0; it1 < ctrs.size(); it1++) {\n    for (size_t it2 = it1 + 1; it2 < ctrs.size(); it2++) {\n      vw::Vector3 err;\n      vw::Vector3 pt = vw::stereo::triangulate_pair(dirs[it1], ctrs[it1],\n                                                    dirs[it2], ctrs[it2], err);\n      if (pt != Vector3(0, 0, 0)) {\n        cam_ctr += pt;\n        num += 1;\n      }\n    }\n  }\n  if (num > 0)\n    cam_ctr = cam_ctr / num;\n\n  // Update with the values at which we were successful\n  opt.pixel_values = good_pixel_values;\n}\n\nvw::Matrix<double> vec2matrix(int rows, int cols, std::vector<double> const& vals) {\n  int len = vals.size();\n  if (len != rows * cols)\n    vw::vw_throw(vw::ArgumentErr() << \"Size mis-match.\\n\");\n\n  vw::Matrix<double> M;\n  M.set_size(rows, cols);\n\n  int count = 0;\n  for (int row = 0; row < rows; row++) {\n    for (int col = 0; col < cols; col++) {\n      M(row, col) = vals[count];\n      count++;\n    }\n  }\n  return M;\n}\n\n// Refine the camera intrinsics and pose. Only applicable to CSM Frame cameras.\nvoid refineIntrinsics(Options const& opt, vw::cartography::GeoReference const& geo,\n                      ImageViewRef<PixelMask<float>> & interp_dem,\n                      vw::CamPtr const& input_camera_ptr,\n                      int width, int height, asp::CsmModel & csm) {\n\n  // Sanity checks\n  if (opt.reference_dem.empty() && opt.datum_str.empty())\n    vw_throw(ArgumentErr() << \"Must provide a DEM or a datum to refine the camera.\\n\");\n  if (input_camera_ptr.get() == NULL)\n    vw_throw(ArgumentErr() << \"Must provide an input camera to refine its intrinsics.\\n\");\n\n  std::vector<vw::Vector2> all_pix_samples;\n  asp::createPixelSamples(width, height, opt.num_pixel_samples, all_pix_samples);\n\n  // Populate the corresponding ground points\n  std::vector<vw::Vector2> pix_samples;\n  std::vector<vw::Vector3> xyz_samples;\n  for (size_t i = 0; i < all_pix_samples.size(); i++) {\n\n    vw::Vector2 pix = all_pix_samples[i];\n    vw::Vector3 xyz;\n    dem_or_datum_intersect(opt, geo, interp_dem, input_camera_ptr, pix, xyz);\n    if (xyz == Vector3())\n      continue;\n\n    pix_samples.push_back(pix);\n    xyz_samples.push_back(xyz);\n  }\n\n  // Must have at least 1 pixel sample\n  if (pix_samples.empty())\n    vw_throw(ArgumentErr() << \"Could not find any valid pixel samples.\\n\");\n\n  asp::refineCsmFrameFit(pix_samples, xyz_samples, opt.refine_intrinsics, csm);\n}\n\n// Read a matrix in json format. This will throw an error if the json object\n// does not have the expected data.\nvw::Matrix<double> json_mat(json const& j, int rows, int cols) {\n\n  vw::Matrix<double> M;\n  M.set_size(rows, cols);\n  for (int row = 0; row < rows; row++) {\n    for (int col = 0; col < cols; col++) {\n      M(row, col) = j[row][col].get<double>();\n    }\n  }\n  return M;\n}\n\n// Create a camera using user-specified options. Keep record\n// of the georeference and the datum.\nvoid form_camera(Options & opt, vw::cartography::GeoReference & geo,\n                 ImageViewRef<PixelMask<float>> & interp_dem,\n                 vw::CamPtr & input_camera_ptr,\n                 boost::shared_ptr<CameraModel> & out_cam) {\n\n  ImageView<float> dem;\n  float nodata_value = -std::numeric_limits<float>::max();\n  bool has_dem = false;\n  if (opt.reference_dem != \"\") {\n    dem = DiskImageView<float>(opt.reference_dem);\n    bool ans = read_georeference(geo, opt.reference_dem);\n    if (!ans)\n      vw_throw(ArgumentErr() << \"Could not read the georeference from dem: \"\n                << opt.reference_dem << \".\\n\");\n    has_dem = true;\n    vw::read_nodata_val(opt.reference_dem, nodata_value);\n    vw_out() << \"Using nodata value: \" << nodata_value << \"\\n\";\n\n    // For pinhole the datum may be unreliable, so warn only\n    bool warn_only = (opt.stereo_session.find(\"pinhole\") != std::string::npos);\n    if (!opt.datum_str.empty())\n      vw::checkDatumConsistency(geo.datum(), opt.datum, warn_only);\n\n    if (opt.datum_str.empty()) {\n      // Set for completeness\n      opt.datum = geo.datum();\n      opt.datum_str = geo.datum().name();\n    }\n\n  } else {\n    // Keep track of the datum\n    geo.set_datum(opt.datum);\n    vw_out() << \"No reference DEM provided. Will use a height of \"\n             << opt.height_above_datum << \" above the datum:\\n\"\n             << geo.datum() << \"\\n\";\n  }\n\n  // Prepare the DEM for interpolation. It may be empty if not provided.\n  interp_dem = interpolate(create_mask(dem, nodata_value),\n                  BilinearInterpolation(), ZeroEdgeExtension());\n\n  // If we have camera center in ECI or ECEF coordinates in km, convert\n  // it to meters, then find the height above datum.\n  Vector3 known_cam_ctr(0, 0, 0);\n  if (opt.parsed_camera_center_str != \"\") {\n    std::vector<double> vals;\n    parse_values<double>(opt.parsed_camera_center_str, vals);\n    if (vals.size() != 3)\n      vw_throw(ArgumentErr() << \"Could not parse 3 values from: \"\n                << opt.parsed_camera_center_str << \".\\n\");\n\n    known_cam_ctr = Vector3(vals[0], vals[1], vals[2]);\n    known_cam_ctr *= 1000.0;  // convert to meters\n    vw_out() << \"Parsed camera center (meters): \" << known_cam_ctr << \"\\n\";\n  }\n\n  // The camera center can be also set on the command line\n  if (!std::isnan(opt.camera_center[0])) {\n    known_cam_ctr = opt.camera_center;\n    vw_out() << \"Camera center set on the command line: \"\n      << std::setprecision(17) << known_cam_ctr << \"\\n\";\n  }\n\n  if (!std::isnan(opt.camera_center_llh[0])) {\n    if (!std::isnan(opt.camera_center[0]))\n      vw::vw_throw(vw::ArgumentErr()\n        << \"Cannot set camera center in both ECEF and LLH coordinates.\\n\");\n    vw_out() << \"Camera center (lon-lat-height) set on the command line: \"\n      << std::setprecision(17) << opt.camera_center_llh << \"\\n\";\n    known_cam_ctr = geo.datum().geodetic_to_cartesian(opt.camera_center_llh);\n  }\n\n  if (known_cam_ctr != Vector3() && opt.cam_weight > 0) {\n    // If known_cam_ctr is in ECI coordinates, the lon and lat won't be accurate\n    // but the height will be.\n    Vector3 llh = geo.datum().cartesian_to_geodetic(known_cam_ctr);\n    opt.cam_height = llh[2];\n  }\n\n  vw::Quat parsed_cam_quat;\n  if (opt.parsed_cam_quat_str != \"\") {\n    std::vector<double> vals;\n    parse_values<double>(opt.parsed_cam_quat_str, vals);\n    if (vals.size() != 4)\n      vw_throw(ArgumentErr() << \"Could not parse 4 values from: \"\n                << opt.parsed_cam_quat_str << \".\\n\");\n\n    parsed_cam_quat = vw::Quat(vals[0], vals[1], vals[2], vals[3]);\n    vw_out() << \"Parsed camera quaternion: \" << parsed_cam_quat << \"\\n\";\n  }\n\n  if (opt.cam_weight > 0) {\n    vw_out() << \"Will attempt to find a camera center height above datum of \"\n             << opt.cam_height\n             << \" meters with a weight strength of \" << opt.cam_weight << \".\\n\";\n  }\n  if (opt.cam_ctr_weight > 0 && opt.refine_camera)\n    vw_out() << \"Will constrain the camera center with the camera center weight.\\n\";\n\n  Vector3 estim_cam_ctr(0, 0, 0); // estimated camera center from input camera\n  std::vector<double> cam_heights;\n  if (opt.input_camera != \"\") {\n    // Extract lon and lat from tracing rays from the camera to the ground.\n    // This can modify opt.pixel_values. Also calc the camera center.\n    extract_lon_lat_cam_ctr_from_camera(opt, create_mask(dem, nodata_value),\n                                        geo,\n                                        // Outputs\n                                        input_camera_ptr, cam_heights, estim_cam_ctr);\n  }\n\n  // Overwrite the estimated center with what is parsed from vendor's data,\n  // if this data exists.\n  if (known_cam_ctr != Vector3(0, 0, 0))\n    estim_cam_ctr = known_cam_ctr;\n\n  if (opt.lon_lat_values.size() < 3)\n    vw_throw(ArgumentErr() << \"Expecting at least three longitude-latitude pairs.\\n\");\n\n  if (opt.lon_lat_values.size() != opt.pixel_values.size()) {\n    vw_throw(ArgumentErr()\n              << \"The number of lon-lat pairs must equal the number of pixel pairs.\\n\");\n  }\n\n  size_t num_lon_lat_pairs = opt.lon_lat_values.size()/2;\n\n  Vector2 pix;\n  Vector3 llh, xyz;\n  std::vector<Vector3> xyz_vec;\n\n  // TODO(oalexan1): Use asp::writeGcp() instead of inline GCP writing.\n  // If to write a gcp file\n  std::ostringstream gcp;\n  gcp.precision(17);\n  bool write_gcp = (opt.gcp_file != \"\");\n\n  // TODO(oalexan1): Make this into a function\n  for (size_t corner_it = 0; corner_it < num_lon_lat_pairs; corner_it++) {\n\n    // Get the height from the DEM if possible\n    llh[0] = opt.lon_lat_values[2*corner_it+0];\n    llh[1] = opt.lon_lat_values[2*corner_it+1];\n\n    if (llh[1] < -90 || llh[1] > 90)\n      vw_throw(ArgumentErr() << \"Detected a latitude out of bounds. \"\n                << \"Perhaps the longitude and latitude are reversed?\\n\");\n\n    double height = opt.height_above_datum;\n    if (opt.input_camera != \"\") {\n      height = cam_heights[corner_it]; // already computed\n    } else {\n      if (has_dem) {\n        bool success = false;\n        pix = geo.lonlat_to_pixel(subvector(llh, 0, 2));\n        int len =  BilinearInterpolation::pixel_buffer;\n        if (pix[0] >= 0 && pix[0] <= interp_dem.cols() - 1 - len &&\n            pix[1] >= 0 && pix[1] <= interp_dem.rows() - 1 - len) {\n          PixelMask<float> masked_height = interp_dem(pix[0], pix[1]);\n          if (is_valid(masked_height)) {\n            height = masked_height.child();\n            success = true;\n          }\n        }\n        if (!success)\n          vw_out() << \"Could not determine a valid height value at lon-lat: \"\n                   << llh[0] << ' ' << llh[1] << \". Will use a height of \" << height << \".\\n\";\n      }\n    }\n\n    llh[2] = height;\n    xyz = geo.datum().geodetic_to_cartesian(llh);\n    xyz_vec.push_back(xyz);\n\n    if (write_gcp)\n      gcp << corner_it << ' ' << llh[1] << ' ' << llh[0] << ' ' << llh[2] << ' '\n          << 1 << ' ' << 1 << ' ' << 1 << ' ' << opt.image_file << ' '\n          << opt.pixel_values[2*corner_it] << ' ' << opt.pixel_values[2*corner_it+1] << ' '\n          << opt.gcp_std << ' ' << opt.gcp_std << \"\\n\";\n  } // End loop through lon-lat pairs\n\n  if (write_gcp) {\n    vw_out() << \"Writing: \" << opt.gcp_file << \"\\n\";\n    std::ofstream fs(opt.gcp_file.c_str());\n    fs << gcp.str();\n    fs.close();\n  }\n\n  // Form a camera based on info the user provided\n  DiskImageView<float> img(opt.image_file);\n  int wid = img.cols(), hgt = img.rows();\n  if (wid <= 0 || hgt <= 0)\n    vw_throw(ArgumentErr() << \"Could not read an image with positive dimensions from: \"\n              << opt.image_file << \".\\n\");\n  manufacture_cam(opt, wid, hgt, out_cam);\n  \n  // Transform it and optionally refine it\n  bool verbose = true;\n  fit_camera_to_xyz_ht(known_cam_ctr, estim_cam_ctr,\n                       opt.camera_type, opt.refine_camera,\n                       xyz_vec, opt.pixel_values,\n                       opt.cam_height, opt.cam_weight, opt.cam_ctr_weight, geo.datum(),\n                       verbose, out_cam);\n\n  return;\n}\n\n// Read a pinhole camera from Planet's json file format (*_pinhole.json). Then\n// the WGS84 datum is assumed.\nvoid read_pinhole_from_json(Options & opt, vw::cartography::GeoReference & geo,\n                            boost::shared_ptr<CameraModel> & out_cam) {\n\n  if (opt.datum_str.empty())\n    vw_throw(ArgumentErr() << \"Must provide a datum to read a pinhole camera.\\n\");\n\n  // Set the datum\n  geo.set_datum(opt.datum);\n\n  std::ifstream f(opt.input_camera);\n  json j = json::parse(f);\n\n  // Parse the focal length and optical center. Negate the focal\n  // length to make it positive. We adjust for that later.\n  json const& cam = j[\"P_camera\"];\n  double fx = -cam[0][0].get<double>();\n  double fy = -cam[1][1].get<double>();\n  double ox = cam[0][2].get<double>();\n  double oy = cam[1][2].get<double>();\n\n  json const& exterior = j[\"exterior_orientation\"];\n  double ecef_x = exterior[\"x_ecef_meters\"].get<double>();\n  double ecef_y = exterior[\"y_ecef_meters\"].get<double>();\n  double ecef_z = exterior[\"z_ecef_meters\"].get<double>();\n\n  // Following the Planet convention of naming things\n  vw::Matrix<double> extrinsic = json_mat(j[\"P_extrinsic\"], 4, 4);\n  vw::Matrix<double> intrinsic = json_mat(j[\"P_intrinsic\"], 4, 4);\n\n  // Adjust for the fact that Planet likes negative focal lengths, while\n  // vw::camera::PinholeModel uses positive values.\n  vw::Matrix<double> flip;\n  flip.set_identity(4);\n  flip(0, 0) = -1;\n  flip(1, 1) = -1;\n\n  // Create a blank pinhole model and get an alias to it\n  out_cam = boost::make_shared<vw::camera::PinholeModel>();\n  PinholeModel & pin = *((PinholeModel*)out_cam.get());\n\n  // Populate the model\n  pin.set_pixel_pitch(1.0); // not necessary, but better be explicit\n  pin.set_focal_length(vw::Vector2(fx, fy));\n  pin.set_point_offset(vw::Vector2(ox, oy));\n\n  pin.set_camera_center(vw::Vector3(ecef_x, ecef_y, ecef_z));\n\n  vw::Matrix<double> world2cam = flip * intrinsic * extrinsic;\n  vw::Matrix<double> cam2world = inverse(world2cam);\n  pin.set_camera_pose(submatrix(cam2world, 0, 0, 3, 3));\n}\n\nvoid save_linescan(Options & opt) {\n\n  // Load the cameras. For now load without any adjustment, which will be applied later.\n  auto local_prefix = asp::stereo_settings().bundle_adjust_prefix;\n  asp::stereo_settings().bundle_adjust_prefix = \"\";\n  std::string out_prefix;\n  asp::SessionPtr session(asp::StereoSessionFactory::create\n                   (opt.stereo_session, // may change\n                    opt,\n                    opt.image_file, opt.image_file,\n                    opt.input_camera, opt.input_camera,\n                    out_prefix));\n  vw::CamPtr camera_model = session->camera_model(opt.image_file, opt.input_camera);\n\n  // Get a pointer to the underlying CSM model. It is owned by camera_model.\n  asp::CsmModel * csm_cam = asp::csm_model(camera_model);\n\n  // Apply the adjustment from the base camera model to the CSM model.\n  asp::stereo_settings().bundle_adjust_prefix = local_prefix;\n  if (asp::stereo_settings().bundle_adjust_prefix != \"\")\n     asp::applyAdjustmentToCsmCamera(opt.image_file,\n                                     opt.input_camera,\n                                     asp::stereo_settings().bundle_adjust_prefix,\n                                     camera_model,\n                                     csm_cam);\n\n  vw_out() << \"Writing: \" << opt.out_camera << \"\\n\";\n  csm_cam->saveState(opt.out_camera);\n}\n\nvoid opticalbar2linescan(Options & opt) {\n  if (opt.bundle_adjust_prefix != \"\") \n    vw_throw(ArgumentErr() \n             << \"Option --bundle-adjust-prefix is not supported when converting \"\n             << \"an opticalbar camera to a linescan camera. Ensure the input camera \"\n             << \"is created with any adjustments applied to it internally.\\n\");\n  \n  vw::Vector2i image_size = vw::file_image_size(opt.image_file);\n  asp::CsmModel csm;\n  asp::fitCsmLinescanToOpticalBar(opt.input_camera, image_size, opt.datum, csm);\n\n  vw_out() << \"Writing: \" << opt.out_camera << \"\\n\";\n  csm.saveState(opt.out_camera);\n}\n\nvoid save_rpc(Options & opt) {\n\n  // Load the cameras. Must use the RPC session even if a linescan model exists as well\n  // in the file, such as for WorldView images.\n  opt.stereo_session = \"rpc\";\n  std::string out_prefix = \"\"; \n  asp::SessionPtr session(asp::StereoSessionFactory::create\n                     (opt.stereo_session, // may change\n                      opt,\n                      opt.image_file, opt.image_file,\n                      opt.input_camera, opt.input_camera,\n                      out_prefix));\n\n  boost::shared_ptr<CameraModel> camera_model \n    = session->camera_model(opt.image_file, opt.input_camera);\n  \n  asp::RPCModel const* rpc_cam \n    = dynamic_cast<const asp::RPCModel*>(vw::camera::unadjusted_model(camera_model.get()));\n  if (rpc_cam == NULL)\n    vw_throw(ArgumentErr() << \"Expecting an RPC camera.\\n\");\n  \n  vw::vw_out() << \"Writing: \" << opt.out_camera << \"\\n\";\n  rpc_cam->saveXML(opt.out_camera);\n}\n\n// See --extrinsics.\nvoid camerasFromExtrinsics(Options const& opt) {\n\n  // Read the extrinsics\n  std::set<std::string> str_col_names = {\"image\"};\n  std::set<std::string> num_col_names = {\"lon\", \"lat\", \"height_above_datum\",\n                                            \"roll\", \"pitch\", \"yaw\"};\n  std::map<std::string, std::vector<std::string>> str_map;\n  std::map<std::string, std::vector<double>> num_map;\n  asp::readReportFile(opt.extrinsics_file, str_col_names, num_col_names, str_map, num_map);\n\n  // Read the intrinsics\n  vw::camera::PinholeModel pinhole(opt.sample_file);\n\n  // Read the datum\n  vw::cartography::Datum datum(opt.datum_str);\n\n  int num_cameras = str_map[\"image\"].size();\n  if (num_cameras == 0)\n    vw_throw(ArgumentErr() << \"No extrinsics found in: \" << opt.extrinsics_file << \".\\n\");\n\n  // Iterate over cameras\n  for (int i = 0; i < num_cameras; i++) {\n\n    // Read the extrinsics\n    double lon = num_map[\"lon\"][i];\n    double lat = num_map[\"lat\"][i];\n    double height_above_datum = num_map[\"height_above_datum\"][i];\n    double roll = num_map[\"roll\"][i];\n    double pitch = num_map[\"pitch\"][i];\n    double yaw = num_map[\"yaw\"][i];\n\n    // Convert camera center to ECEF\n    vw::Vector3 llh(lon, lat, height_above_datum);\n    vw::Vector3 P = datum.geodetic_to_cartesian(llh);\n    // Camera-to-world rotation\n    vw::Matrix3x3 ned = datum.lonlat_to_ned_matrix(llh);\n    vw::Matrix3x3 R = ned * asp::rollPitchYaw(roll, pitch, yaw) * asp::rotationXY();\n    // Form the camera\n    pinhole.set_camera_center(P);\n    pinhole.set_camera_pose(R);\n\n    // Write the camera\n    std::string imageFile = str_map[\"image\"][i];\n    std::string camFile = fs::path(imageFile).replace_extension(\".tsai\").string();\n    vw::create_out_dir(camFile);\n    vw::vw_out() << \"Writing: \" << camFile << \"\\n\";\n    pinhole.write(camFile);\n  }\n}\n\n// Fetch metadata from an ISIS cube for saving to the output CSM camera.\nvoid isisCubMetadata(vw::CamPtr in_cam,\n                     double & ephem_time,\n                     vw::Vector3 & sun_pos,\n                     std::string & serial_number,\n                     std::string & target_name) { \n                \n\n  // Initialize the output variables\n  ephem_time    = 0.0;\n  sun_pos       = vw::Vector3(0, 0, 0);\n  serial_number = \"\";\n  target_name   = \"\";\n\n#if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1\n\n  if (in_cam.get() == NULL)\n    return;\n  \n  IsisCameraModel const * isis_cam\n    = dynamic_cast<IsisCameraModel const*>(vw::camera::unadjusted_model(in_cam.get()));\n  if (isis_cam == NULL)\n    return;\n  \n  ephem_time    = isis_cam->ephemeris_time();\n  sun_pos       = isis_cam->sun_position();\n  serial_number = isis_cam->serial_number();\n  target_name   = isis_cam->target_name();\n#endif  \n}\n\n// Save a pinhole camera, in tsai or csm format\nvoid save_pinhole(Options const& opt,\n                  vw::cartography::GeoReference const& geo,\n                  vw::CamPtr input_camera_ptr,\n                  ImageViewRef<PixelMask<float>> interp_dem,\n                  boost::shared_ptr<CameraModel> out_cam) {\n\n  vw::camera::PinholeModel* pin = NULL;\n  boost::shared_ptr<vw::camera::PinholeModel> input_pin;\n  std::string out_ext = vw::get_extension(opt.out_camera);\n  if (opt.exact_tsai_to_csm_conv) {\n    // Get the input pinhole model, to be converted below exactly to CSM\n    input_pin = boost::make_shared<vw::camera::PinholeModel>(opt.input_camera);\n    pin = input_pin.get();\n    // Must make another copy to satisfy another path in the logic below\n    // TODO(oalexan1): This looks like a hack.\n    input_camera_ptr = boost::make_shared<vw::camera::PinholeModel>(opt.input_camera);\n  } else {\n    // Use the manufactured camera\n    pin = (vw::camera::PinholeModel*)out_cam.get();\n  }\n\n  if (out_ext == \".tsai\") {\n    vw::Vector3 llh = geo.datum().cartesian_to_geodetic(out_cam->camera_center(Vector2()));\n    vw_out() << \"Output camera center lon, lat, and height above datum: \"\n              << llh << \"\\n\";\n    vw_out() << \"Writing: \" << opt.out_camera << \"\\n\";\n    pin->write(opt.out_camera);\n\n  } else if (out_ext == \".json\") {\n    DiskImageView<float> img(opt.image_file);\n    int width = img.cols(), height = img.rows();\n    asp::CsmModel csm;\n    \n    // For input ISIS cameras, save some metadata to the output camera\n    double ephem_time = 0.0;\n    vw::Vector3 sun_pos(0, 0, 0);\n    std::string serial_number = \"\", target_name = \"\";\n    isisCubMetadata(input_camera_ptr,\n                    ephem_time, sun_pos, serial_number, target_name);\n    \n    csm.createFrameModel(*pin, width, height,\n                          geo.datum().semi_major_axis(), geo.datum().semi_minor_axis(),\n                          opt.distortion_type, opt.distortion,\n                          ephem_time, sun_pos, serial_number, target_name);\n    if (opt.refine_intrinsics != \"\")\n      refineIntrinsics(opt, geo, interp_dem, input_camera_ptr, width, height, csm);\n\n    vw::Vector3 llh = geo.datum().cartesian_to_geodetic(csm.camera_center(Vector2()));\n    vw_out() << \"Output camera center lon, lat, and height above datum: \"\n              << llh << \"\\n\";\n    vw_out() << \"Writing: \" << opt.out_camera << \"\\n\";\n    csm.saveState(opt.out_camera);\n  } else {\n    vw_throw(ArgumentErr() << \"Unknown output camera file extension: \"\n              << out_ext << \".\\n\");\n  }\n\n}\n\nint main(int argc, char * argv[]) {\n\n  Options opt;\n  try {\n\n    handle_arguments(argc, argv, opt);\n    \n    if (opt.camera_type == \"linescan\") {\n      // The linescan workflow is very different than the rest of the code.\n      if (opt.stereo_session != \"opticalbar\")\n        save_linescan(opt);\n      else\n        opticalbar2linescan(opt);\n      \n      return 0;\n    }\n    \n    // Same for rpc\n    if (opt.camera_type == \"rpc\") {\n      save_rpc(opt);\n      return 0;\n    }\n\n    if (opt.extrinsics_file != \"\") {\n      camerasFromExtrinsics(opt);\n      return 0;\n    }\n\n    // Some of the numbers we print need high precision\n    vw_out().precision(17);\n\n    // Interpolated dem. May not always exist.\n    ImageViewRef<PixelMask<float>> interp_dem;\n  \n    // Georeference. At least the datum will exist.\n    vw::cartography::GeoReference geo;\n    geo.set_datum(opt.datum); // may change later\n\n    // Input camera\n    vw::CamPtr input_camera_ptr(NULL);\n    // Output camera\n    boost::shared_ptr<CameraModel> out_cam;\n\n    if (!opt.planet_pinhole && !opt.exact_tsai_to_csm_conv) {\n      // Create a camera using user-specified options. Read geo and interp_dem.\n      form_camera(opt, geo, interp_dem, input_camera_ptr, out_cam);\n    } else if (!opt.exact_tsai_to_csm_conv) {\n      // Read a pinhole camera from Planet's json file format (*_pinhole.json). Then\n      // the WGS84 datum is assumed. Ignore all other input options. Read geo datum.\n      read_pinhole_from_json(opt, geo, out_cam);\n    }\n\n    if (opt.camera_type == \"opticalbar\") {\n        vw::Vector3 llh\n         = geo.datum().cartesian_to_geodetic(out_cam->camera_center(Vector2()));\n        vw_out() << \"Output camera center lon, lat, and height above datum: \"\n                 << llh << \"\\n\";\n        vw_out() << \"Writing: \" << opt.out_camera << \"\\n\";\n      ((vw::camera::OpticalBarModel*)out_cam.get())->write(opt.out_camera);\n    } else if (opt.camera_type == \"pinhole\") {\n      save_pinhole(opt, geo, input_camera_ptr, interp_dem, out_cam);\n    }\n\n  } ASP_STANDARD_CATCHES;\n\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/cam_test.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Tool to compare two camera models for the same image. For example,\n// compare ISIS to CSM, linescan to RPC (for DG, PeruSat, or\n// Pleiades), Optical bar vs pinhole (with the latter created with\n// convert_pinhole_model).\n\n// For each camera model find the camera center and ray direction at a\n// set of sampled pixels, then by projecting pixels to the ground\n// using the cam1 camera and back-projecting the resulting points into\n// the cam2 camera, then doing this in reverse.\n\n#include <asp/Core/Macros.h>\n#include <asp/Core/AspProgramOptions.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Sessions/StereoSession.h>\n#include <asp/Sessions/StereoSessionFactory.h>\n#include <asp/Camera/RPCModel.h>\n#include <asp/Camera/CsmModel.h>\n#include <asp/Camera/Covariance.h>\n#include <asp/Sessions/CameraUtils.h>\n\n#include <asp/asp_config.h> // defines ASP_HAVE_PKG_ISIS\n#if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1\n#include <asp/IsisIO/IsisCameraModel.h>\n#endif // ASP_HAVE_PKG_ISIS\n\n#include <vw/Cartography/DatumUtils.h>\n#include <vw/Cartography/BathyStereoModel.h>\n#include <vw/Core/Stopwatch.h>\n\nusing namespace vw;\nusing namespace vw::cartography;\nnamespace po = boost::program_options;\nnamespace fs = boost::filesystem;\n\nstruct Options: vw::GdalWriteOptions {\n  std::string image_file, cam1_file, cam2_file, session1, session2, bundle_adjust_prefix,\n  cam1_bundle_adjust_prefix, cam2_bundle_adjust_prefix, datum, bathy_plane;\n  int sample_rate;\n  double subpixel_offset, height_above_datum, refraction_index;\n  bool print_per_pixel_results, test_error_propagation;\n  vw::Vector2 single_pixel;\n  std::vector<vw::BathyPlane> bathy_plane_vec;\n\n  Options() {}\n};\n\nvoid handle_arguments(int argc, char *argv[], Options& opt) {\n\n  double nan = std::numeric_limits<double>::quiet_NaN();\n  po::options_description general_options(\"General options\");\n  general_options.add_options()\n    (\"image\", po::value(&opt.image_file),  \"Image file.\")\n    (\"cam1\",  po::value(&opt.cam1_file),   \"Camera 1 file.\")\n    (\"cam2\",  po::value(&opt.cam2_file),   \"Camera 2 file.\")\n    (\"session1\", po::value(&opt.session1),\n     \"Session to use for camera 1 (if not provided it will be guessed).\")\n    (\"session2\", po::value(&opt.session2),\n     \"Session to use for camera 2 (if not provided it will be guessed).\")\n    (\"sample-rate\",   po::value(&opt.sample_rate)->default_value(100),\n     \"Use one out of these many pixels when sampling the image.\")\n    (\"subpixel-offset\",   po::value(&opt.subpixel_offset)->default_value(0.0),\n     \"Add to each integer pixel this offset (in x and y) when sampling the image.\")\n    (\"single-pixel\",   po::value(&opt.single_pixel)->default_value(Vector2(nan, nan)),\n     \"Instead of sampling pixels from the image use only this pixel.\")\n    (\"print-per-pixel-results\", po::bool_switch(&opt.print_per_pixel_results)->default_value(false)->implicit_value(true),\n     \"Print the results at each pixel.\")\n    (\"height-above-datum\",   po::value(&opt.height_above_datum)->default_value(0.0),\n     \"Let the ground surface be at this height above the datum (measured in meters).\")\n    (\"datum\", po::value(&opt.datum),\n     \"Set the datum. This will override the datum from the input cameras. Usually needed \"\n     \"only for Pinhole cameras, when the camera does not have the datum information. \"\n     \"Options: WGS_1984, D_MOON (1,737,400 meters), D_MARS (3,396,190 meters), MOLA \"\n     \"(3,396,000 meters), NAD83, WGS72, and NAD27. Also accepted: Earth (=WGS_1984), Mars \"\n     \"(=D_MARS), Moon (=D_MOON).\")\n    (\"bundle-adjust-prefix\", po::value(&opt.bundle_adjust_prefix),\n     \"Adjust the cameras using this prefix.\")\n    (\"cam1-bundle-adjust-prefix\", po::value(&opt.cam1_bundle_adjust_prefix),\n     \"Adjust the first camera using this prefix.\")\n    (\"cam2-bundle-adjust-prefix\", po::value(&opt.cam2_bundle_adjust_prefix),\n     \"Adjust the first camera using this prefix.\")\n    (\"test-error-propagation\", po::bool_switch(&opt.test_error_propagation)->default_value(false)->implicit_value(true),\n     \"Test computing the stddev (see --propagate-errors). This is an undocumented \"\n     \"developer option.\")\n    (\"bathy-plane\", po::value(&opt.bathy_plane),\n     \"Read from this file a bathy plane, so a water surface which is a plane in local \"\n     \"projected coordinates. A ray from the camera to the ellipsoid determined by \"\n     \"--height-above-datum that encounters this bathy plane along the way will get bent \"\n     \"according to Snell's law. Same for a ray going in reverse.\")\n    (\"refraction-index\", po::value(&opt.refraction_index)->default_value(1.0),\n     \"The index of refraction of water to be used in bathymetry correction. \"\n     \"Must be bigger than 1. This index can be computed with refr_index.\")\n    ;\n  general_options.add(vw::GdalWriteOptionsDescription(opt));\n\n  po::options_description positional(\"\");\n  po::positional_options_description positional_desc;\n\n  std::string usage(\"--image <image file> --cam1 <camera 1 file> --cam2 <camera 2 file> \"\n                    \"[other options]\");\n\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line(argc, argv, opt, general_options, general_options,\n                            positional, positional_desc, usage,\n                            allow_unregistered, unregistered);\n\n  if (opt.image_file == \"\" || opt.cam1_file == \"\" || opt.cam2_file == \"\")\n    vw_throw(ArgumentErr() << \"Not all inputs were specified.\\n\" << usage << general_options);\n\n  if (opt.sample_rate <= 0)\n    vw_throw(ArgumentErr() << \"The sample rate must be positive.\\n\" << usage << general_options);\n\n  // If either cam1_adjust_prefix or cam2_adjust_prefix is set, then\n  // must not set bundle_adjust_prefix. Throw an error then.\n  if (opt.cam1_bundle_adjust_prefix != \"\" || opt.cam2_bundle_adjust_prefix != \"\") {\n    if (opt.bundle_adjust_prefix != \"\")\n      vw_throw(ArgumentErr() << \"Cannot set both --bundle-adjust-prefix and \"\n               \"--cam1-bundle-adjust-prefix or --cam2-bundle-adjust-prefix.\\n\");\n  } else {\n    // Need this to be able to load adjusted camera models. This must be set\n    // before loading the cameras.\n    asp::stereo_settings().bundle_adjust_prefix = opt.bundle_adjust_prefix;\n  }\n\n  if (opt.test_error_propagation)\n    asp::stereo_settings().propagate_errors = true;\n\n  // Validate bathymetry options\n  bool have_bathy_plane = (opt.bathy_plane != \"\");\n  bool have_refraction = (opt.refraction_index > 1.0);\n\n  if (have_bathy_plane && !have_refraction)\n    vw_throw(ArgumentErr() << \"When --bathy-plane is set, --refraction-index must be \"\n             << \"specified and bigger than 1.\\n\");\n\n  if (!have_bathy_plane && have_refraction)\n    vw_throw(ArgumentErr() << \"When --refraction-index is set, --bathy-plane must \"\n             << \"also be specified.\\n\");\n\n  // Load bathy plane if specified\n  if (have_bathy_plane) {\n    int num_images = 1;\n    vw::readBathyPlanes(opt.bathy_plane, num_images, opt.bathy_plane_vec);\n    vw_out() << \"Refraction index: \" << opt.refraction_index << \"\\n\";\n  }\n\n}\n\n// Sort the diffs and print some stats\nvoid print_diffs(std::string const& tag, std::vector<double> & diffs) {\n  std::sort(diffs.begin(), diffs.end());\n\n  vw_out() << \"\\n\";\n\n  if (diffs.empty()) {\n    vw_out() << \"Empty list of diffs for: \" << tag << \"\\n\";\n    return;\n  }\n\n  vw_out() << tag << \"\\n\";\n  vw_out() << \"Min:    \" << diffs[0] << \"\\n\";\n  vw_out() << \"Median: \" << diffs[diffs.size()/2] << \"\\n\";\n  vw_out() << \"Max:    \" << diffs.back() << \"\\n\";\n}\n\nvoid testErrorPropagation(Options const& opt,\n                          vw::cartography::Datum const& datum,\n                          vw::CamPtr cam1_model,\n                          vw::CamPtr cam2_model) {\n\n  double major_axis = datum.semi_major_axis() + opt.height_above_datum;\n  double minor_axis = datum.semi_minor_axis() + opt.height_above_datum;\n\n  // Try to find a pair of pixels corresponding to same tri point,\n  // within image bounds\n  vw::Vector2 pix1, pix2;\n  Vector3 triPt;\n  for (int i = 0; i < 20; i++) {\n\n    pix1 = Vector2(i * 1000, i * 1000);\n    Vector3 cam1_dir = cam1_model->pixel_to_vector(pix1);\n    Vector3 cam1_ctr = cam1_model->camera_center(pix1);\n\n    // Shoot a ray from the cam1 camera, intersect it with the\n    // given height above datum\n    triPt = vw::cartography::datum_intersection(major_axis, minor_axis, cam1_ctr, cam1_dir);\n\n    // Skip invalid intersections\n    if (triPt == Vector3(0, 0, 0))\n      continue;\n\n    // Project to second camera\n    pix2 = cam2_model->point_to_pixel(triPt);\n\n    if (pix2.x() > 0 && pix2.y() > 0)\n      break;\n  }\n\n  vw::vw_out() << \"Left pixel:  \" << pix1 << std::endl;\n  vw::vw_out() << \"Right pixel: \" << pix2 << std::endl;\n  auto const& v = asp::stereo_settings().horizontal_stddev; // alias\n  vw::Vector2 ans = asp::propagateCovariance(triPt, datum,\n                                             v[0], v[1],\n                                             cam1_model.get(), cam2_model.get(),\n                                             pix1, pix2);\n  vw::vw_out() << \"Horizontal and vertical stddev: \" << ans << std::endl;\n}\n\n// This is an important sanity check for RPC cameras, which have only a limited\n// range of valid heights above datum.\nvoid rpc_datum_sanity_check(std::string const& cam_file,\n                            double height_above_datum,\n                            vw::camera::CameraModel const* cam) {\n  // Cast the camera to RPC\n  asp::RPCModel const* rpc_cam = dynamic_cast<asp::RPCModel const*>(cam);\n  if (rpc_cam == NULL)\n    vw::vw_throw(vw::ArgumentErr() << \"Expecting an RPC camera model.\\n\");\n\n  vw::Vector3 lonlatheight_offset = rpc_cam->lonlatheight_offset();\n  vw::Vector3 lonlatheight_scale  = rpc_cam->lonlatheight_scale();\n  double mid_ht = lonlatheight_offset[2];\n  double min_ht = mid_ht - lonlatheight_scale[2];\n  double max_ht = mid_ht + lonlatheight_scale[2];\n\n  if (height_above_datum < min_ht || height_above_datum > max_ht) {\n    vw::vw_out() << \"\\n\";\n    vw::vw_out(vw::WarningMessage)\n      << \"For RPC camera file: \" << cam_file\n      << \", the range of valid heights above datum is \"\n      << min_ht << \" to \" << max_ht\n      << \" meters. The provided height above datum is \"\n      << height_above_datum\n      << \" meters. The results may be inaccurate. Set appropriately \"\n      << \"the --height-above-datum option.\\n\\n\";\n  }\n}\n\nvoid run_cam_test(Options & opt) {\n\n  bool indiv_adjust_prefix = (opt.cam1_bundle_adjust_prefix != \"\" ||\n                              opt.cam2_bundle_adjust_prefix != \"\");\n\n  // Load cam1\n  std::string out_prefix;\n  std::string default_session1 = opt.session1; // save it before it changes\n  if (indiv_adjust_prefix)\n    asp::stereo_settings().bundle_adjust_prefix = opt.cam1_bundle_adjust_prefix;\n  asp::SessionPtr cam1_session(asp::StereoSessionFactory::create\n                              (opt.session1, // may change\n                              opt,\n                              opt.image_file, opt.image_file,\n                              opt.cam1_file, opt.cam1_file,\n                              out_prefix));\n  boost::shared_ptr<vw::camera::CameraModel> cam1_model\n    = cam1_session->camera_model(opt.image_file, opt.cam1_file);\n\n  // Load cam2\n  std::string default_session2 = opt.session2; // save it before it changes\n  if (indiv_adjust_prefix)\n    asp::stereo_settings().bundle_adjust_prefix = opt.cam2_bundle_adjust_prefix;\n  asp::SessionPtr cam2_session(asp::StereoSessionFactory::create\n                          (opt.session2, // may change\n                          opt,\n                          opt.image_file, opt.image_file,\n                          opt.cam2_file, opt.cam2_file,\n                          out_prefix));\n  boost::shared_ptr<vw::camera::CameraModel> cam2_model\n    = cam2_session->camera_model(opt.image_file, opt.cam2_file);\n\n  if (indiv_adjust_prefix)\n    asp::stereo_settings().bundle_adjust_prefix = \"\"; // reset\n\n  bool found_datum = false;\n  vw::cartography::Datum datum;\n  if (opt.datum != \"\") {\n    // Use the datum specified by the user\n    datum.set_well_known_datum(opt.datum);\n    found_datum = true;\n  }\n\n  // See if the first camera has a datum    \n  vw::cartography::Datum cam_datum;\n  bool warn_only = true; // warn about differences in the datums\n  bool found_cam_datum = asp::datum_from_camera(opt.image_file, opt.cam1_file,\n                                                // Outputs\n                                                opt.session1, cam1_session, cam_datum);\n  if (found_datum && found_cam_datum)\n    vw::checkDatumConsistency(datum, cam_datum, warn_only);\n\n    if (!found_datum && found_cam_datum) {\n    datum = cam_datum;\n    found_datum = true;\n  }\n\n  // Same for the second camera\n  found_cam_datum = asp::datum_from_camera(opt.image_file, opt.cam2_file,\n                                            // Outputs\n                                            opt.session2, cam2_session, cam_datum);\n  if (found_datum && found_cam_datum)\n    vw::checkDatumConsistency(datum, cam_datum, warn_only);\n\n  if (!found_datum && found_cam_datum) {\n    datum = cam_datum;\n    found_datum = true;\n  }\n\n  if (!found_datum)\n    vw_throw(ArgumentErr() << \"Could not find the datum. Set --datum or use \"\n              << \"the nadirpinhole session (for cameras relative to a planet).\\n\");\n  vw_out() << \"Using datum: \" << datum << std::endl;\n\n  // Sanity check\n  vw::Vector3 llh1 = datum.cartesian_to_geodetic(cam1_model->camera_center(Vector2()));\n  vw::Vector3 llh2 = datum.cartesian_to_geodetic(cam2_model->camera_center(Vector2()));\n  if (llh1[2] < 0 || llh2[2] < 0)\n          vw::vw_out(vw::WarningMessage) << \"First or second camera center is below \"\n          << \"the zero datum surface. Check your data. Consider using \"\n          << \"the --datum and/or --height-above-datum options.\\n\";\n\n  if (opt.session1 == opt.session2 && (default_session1 == \"\" || default_session2 == \"\") &&\n     (opt.session1 == \"dg\"))\n    vw::vw_out(vw::WarningMessage) << \"The session names for both cameras \"\n              << \"were guessed as: '\" << opt.session1 << \"'. It is suggested that they be \"\n              << \"explicitly specified using --session1 and --session2, as a DigitalGlobe \"\n              << \"camera file may contain both exact linescan and RPC cameras.\\n\";\n\n  // Sanity checks for RPC cameras\n  if (opt.session1 == \"rpc\")\n    rpc_datum_sanity_check(opt.cam1_file, opt.height_above_datum,\n                            vw::camera::unadjusted_model(cam1_model.get()));\n  if (opt.session2 == \"rpc\")\n    rpc_datum_sanity_check(opt.cam2_file, opt.height_above_datum,\n                            vw::camera::unadjusted_model(cam2_model.get()));\n\n  if (opt.test_error_propagation && opt.session1 == \"dg\" && opt.session2 == \"dg\") {\n    testErrorPropagation(opt, datum, cam1_model, cam2_model);\n    return;\n  }\n\n  // Find the input image dimensions\n  int image_cols = 0, image_rows = 0;\n  try {\n    DiskImageView<float> image(opt.image_file);\n    image_cols = image.cols();\n    image_rows = image.rows();\n  } catch(const std::exception& e) {\n    // For CSM-to-CSM ground-to-image and image-to-ground comparisons only,\n    // the camera has the dimensions if the .cub image is missing.\n    asp::CsmModel * csm_model\n      = dynamic_cast<asp::CsmModel*>(vw::camera::unadjusted_model(cam1_model.get()));\n    if (csm_model != NULL) {\n      image_cols = csm_model->get_image_size()[0];\n      image_rows = csm_model->get_image_size()[1];\n    } else {\n      vw::vw_throw(ArgumentErr() << e.what());\n    }\n  }\n  vw_out() << \"Image dimensions: \" << image_cols << ' ' << image_rows << std::endl;\n\n  Stopwatch sw;\n  sw.start();\n\n  double major_axis = datum.semi_major_axis() + opt.height_above_datum;\n  double minor_axis = datum.semi_minor_axis() + opt.height_above_datum;\n\n  bool have_bathy_plane = (opt.bathy_plane != \"\");\n\n  // Iterate over the image\n  bool single_pix = !std::isnan(opt.single_pixel[0]) && !std::isnan(opt.single_pixel[1]);\n  std::vector<double> ctr_diff, dir_diff, cam1_to_cam2_diff, cam2_to_cam1_diff;\n  int num_failed = 0;\n  for (int col = 0; col < image_cols; col += opt.sample_rate) {\n    for (int row = 0; row < image_rows; row += opt.sample_rate) {\n\n      try {\n        Vector2 image_pix(col + opt.subpixel_offset, row + opt.subpixel_offset);\n        if (single_pix)\n          image_pix = opt.single_pixel;\n\n        if (opt.print_per_pixel_results || single_pix)\n          vw_out() << \"Pixel: \" << image_pix << \"\\n\";\n\n        Vector3 cam1_ctr = cam1_model->camera_center(image_pix);\n        Vector3 cam2_ctr = cam2_model->camera_center(image_pix);\n        ctr_diff.push_back(norm_2(cam1_ctr - cam2_ctr));\n\n        if (opt.print_per_pixel_results)\n          vw_out() << \"Camera center diff: \" << ctr_diff.back() << std::endl;\n\n        Vector3 cam1_dir = cam1_model->pixel_to_vector(image_pix);\n        Vector3 cam2_dir = cam2_model->pixel_to_vector(image_pix);\n        dir_diff.push_back(norm_2(cam1_dir - cam2_dir));\n\n        if (opt.print_per_pixel_results)\n          vw_out() << \"Camera direction diff: \" << dir_diff.back() << std::endl;\n\n        // Shoot a ray from the cam1 camera, intersect it with the\n        // given height above datum, and project it back into the cam2\n        // camera.\n        Vector3 xyz;\n        if (!have_bathy_plane)\n          xyz = vw::cartography::datum_intersection(major_axis, minor_axis,\n                                                    cam1_ctr, cam1_dir);\n        else\n          xyz = vw::datumBathyIntersection(cam1_ctr, cam1_dir,\n                                           major_axis, minor_axis,\n                                           opt.bathy_plane_vec[0],\n                                           opt.refraction_index);\n        // Skip invalid intersections\n        if (xyz == Vector3(0, 0, 0))\n          continue;\n\n        Vector2 cam2_pix;\n        if (!have_bathy_plane)\n          cam2_pix = cam2_model->point_to_pixel(xyz);\n        else\n          cam2_pix = vw::point_to_pixel(cam2_model.get(), opt.bathy_plane_vec[0],\n                                        opt.refraction_index, xyz);\n        cam1_to_cam2_diff.push_back(norm_2(image_pix - cam2_pix));\n\n        if (opt.print_per_pixel_results)\n          vw_out() << \"cam1 to cam2 pixel diff: \" << image_pix - cam2_pix << std::endl;\n\n        // Shoot a ray from the cam2 camera, intersect it with the\n        // given height above the datum, and project it back into the\n        // cam1 camera.\n        if (!have_bathy_plane)\n          xyz = vw::cartography::datum_intersection(major_axis, minor_axis,\n                                                    cam2_ctr, cam2_dir);\n        else\n          xyz = vw::datumBathyIntersection(cam2_ctr, cam2_dir,\n                                           major_axis, minor_axis,\n                                           opt.bathy_plane_vec[0],\n                                           opt.refraction_index);\n        // Skip invalid intersections\n        if (xyz == Vector3(0, 0, 0))\n          continue;\n\n        Vector2 cam1_pix;\n        if (!have_bathy_plane)\n          cam1_pix = cam1_model->point_to_pixel(xyz);\n        else\n          cam1_pix = point_to_pixel(cam1_model.get(), opt.bathy_plane_vec[0],\n                                    opt.refraction_index, xyz);\n        cam2_to_cam1_diff.push_back(norm_2(image_pix - cam1_pix));\n\n        if (opt.print_per_pixel_results)\n          vw_out() << \"cam2 to cam1 pixel diff: \" << image_pix - cam1_pix << \"\\n\\n\";\n\n      } catch (...) {\n        // Failure to compute these operations can occur for pinhole cameras\n        num_failed++;\n      }\n\n      if (single_pix)\n        break;\n    }\n\n    if (single_pix)\n      break;\n  }\n\n  sw.stop();\n  vw_out() << \"Number of samples: \" << ctr_diff.size() << \"\\n\";\n  if (num_failed > 0)\n    vw_out() << \"Number of failed samples (not counted above): \" << num_failed << \"\\n\";\n\n  print_diffs(\"cam1 to cam2 camera direction diff norm\", dir_diff);\n  print_diffs(\"cam1 to cam2 camera center diff (meters)\", ctr_diff);\n  print_diffs(\"cam1 to cam2 pixel diff\", cam1_to_cam2_diff);\n  print_diffs(\"cam2 to cam1 pixel diff\", cam2_to_cam1_diff);\n  // If either session is rpc, warn that the camera center may not be accurate\n  if (opt.session1 == \"rpc\" || opt.session2 == \"rpc\") {\n    vw::vw_out() << \"\\n\"; // separate from the diffs\n    vw::vw_out(vw::WarningMessage)\n      << \"For RPC cameras, the concept of camera center is not well-defined, \"\n      << \"so the result for that should be ignored.\\n\";\n  }\n\n  double elapsed_sec = sw.elapsed_seconds();\n  vw_out() << \"\\nElapsed time per sample: \" << 1e+6 * elapsed_sec/ctr_diff.size()\n            << \" milliseconds. (More samples will increase the accuracy.)\\n\";\n}\n\nint main(int argc, char *argv[]) {\n\n  Options opt;\n  try {\n\n    handle_arguments(argc, argv, opt);\n    run_cam_test(opt);\n\n  } ASP_STANDARD_CATCHES;\n\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/camera_calibrate",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n'''\nA wrapper around the OpenCV checkerboard calibration tool.  Handy to use\nprior to camera_solve in order to generate intrinsic camera parameters.\n'''\n\nimport sys\nimport os, glob, re, shutil, subprocess, string, time, errno, optparse, math\n\n# The path to the ASP python files\nbasepath    = os.path.abspath(sys.path[0])\npythonpath  = os.path.abspath(basepath + '/../Python')  # for dev ASP\nlibexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP\nsys.path.insert(0, basepath) # prepend to Python path\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\n\nimport asp_file_utils, asp_system_utils, asp_cmd_utils, asp_image_utils\nimport asp_string_utils\n\nasp_system_utils.verify_python_version_is_supported()\n\n# Prepend to system PATH\nos.environ[\"PATH\"] = libexecpath + os.pathsep + os.environ[\"PATH\"]\n\ndef make_image_list(options):\n    '''Generate an OpenCV compatible image list'''\n\n    # Call in this manner so that the image wildcard does not get expanded  \n    cmd = ['opencv_imagelist_creator', \n            options.xml_list_path,\n            options.image_wildcard]\n\n    # Escape any spaces in the arguments.\n    cmd = asp_string_utils.argListToString(cmd)\n    \n    proc  = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)\n    output = proc.communicate()\n    \n    if not os.path.exists(options.xml_list_path):\n        print(cmd)\n        print(output[0])\n        raise Exception('Failed to generate xml image list file!')\n\ndef calibrate_camera(options):\n    '''Perform camera calibration using the input images'''\n\n    cmd = ['opencv_calibrate', '-pt', 'chessboard', \n           '-o', options.ocv_params_path,\n           '-p', options.xml_list_path, \n           '-w', str(options.board_size[0]), '-h', str(options.board_size[1])]\n            \n    if options.box_size_cm:\n        box_size_meters = options.box_size_cm/100.0\n        cmd += ['-s', str(box_size_meters)]\n    asp_system_utils.executeCommand(cmd, suppressOutput=options.suppress_output, \n                                    outputPath=options.ocv_params_path,\n                                    redo=options.overwrite)\n\n    if not os.path.exists(options.ocv_params_path):\n        raise Exception('Failed to calibrate the camera!')\n\ndef get_value_after_colon(s):\n    parts = s.split(':')\n    return parts[1]\n\ndef get_string_between_brackets(s):\n    start = s.find('[')\n    stop  = s.rfind(']')\n    return s[start+1:stop]\n\ndef read_lines_until_bracket_end(lines, start_index):\n    '''Keep appending lines from a list until we hit the one ending with \"]\", then strip brackets '''\n    index = start_index\n    s = ''\n    while index < len(lines):\n        s += lines[index].strip()\n        if s[-1] == ']':\n            return get_string_between_brackets(s)\n        index += 1\n    \n    raise Exception('Text parsing error!')\n\ndef parse_cv_yaml_file(path):\n    '''Reads the OpenCV parameter file into a nice dictionary'''\n\n    params  = dict()\n    cv_file = open(path)\n    linesIn = cv_file.read().split('\\n')\n    lines   = [x for x in linesIn if x != '---'] # Strip this line added in later OpenCV version\n    params['width' ] = int(get_value_after_colon(lines[2]))\n    params['height'] = int(get_value_after_colon(lines[3]))\n    \n    # Get the intrinsic params\n    s = read_lines_until_bracket_end(lines, 12).split(',')\n    intrinsics = [float(x) for x in s]\n\n    # Get the distortion params\n    s = read_lines_until_bracket_end(lines, 18).split(',')\n    distortion = [float(x) for x in s]\n\n    params['error' ] = float(get_value_after_colon(lines[-2]))\n\n    params['focal_length_x'] = intrinsics[0]\n    params['focal_length_y'] = intrinsics[4]\n    params['center_x'      ] = intrinsics[2]\n    params['center_y'      ] = intrinsics[5]\n    #params['focal_length_pixels'] = 0 # TODO: What units are used?\n    \n    params['k1'] = distortion[0]\n    params['k2'] = distortion[1]\n    params['p1'] = distortion[2]\n    params['p2'] = distortion[3]\n\n    params['skew'] = 0.0\n    params['aspect_ratio'] = 1.0\n    \n    return params\n\ndef write_vw_params_file(params, path):\n\n    vw_file = open(path, 'w')\n    vw_file.write('fu = '+ str(params['focal_length_x'])+'\\n')\n    vw_file.write('fv = '+ str(params['focal_length_y'])+'\\n')\n    vw_file.write('cu = '+ str(params['center_x'])+'\\n')\n    vw_file.write('cv = '+ str(params['center_y'])+'\\n')\n    vw_file.write('u_direction = 1  0  0\\n')\n    vw_file.write('v_direction = 0  1  0\\n')\n    vw_file.write('w_direction = 0  0  1\\n')\n    vw_file.write('C = 0 0 0\\n') # This tool only computes intrinsic parameters!\n    vw_file.write('R = 1 0 0 0 1 0 0 0 1\\n')\n    vw_file.write('k1 = '+ str(params['k1'])+'\\n')\n    vw_file.write('k2 = '+ str(params['k2'])+'\\n')\n    vw_file.write('p1 = '+ str(params['p1'])+'\\n')\n    vw_file.write('p2 = '+ str(params['p2'])+'\\n')\n    vw_file.close()\n\ndef get_full_image_list(options):\n    '''Make a list of all the images specified by the wildcard'''\n    \n    handle = file(options.xml_list_path, 'r')\n    text   = handle.read()\n    handle.close()\n    start      = text.find('<images>')\n    stop       = text.find('</images>')\n    image_text = text[start+len('<images>'):stop]\n    paths      = image_text.split()\n    return paths\n\ndef convert_outputs(options):\n    '''Translates the OpenCV output into some more useful formats'''\n    \n    # Parse the OpenCV output\n    params = parse_cv_yaml_file(options.ocv_params_path)\n    \n    # Write a .tsai file\n    write_vw_params_file(params, options.vw_params_path)\n\n    # If the user requested it, make a duplicate of the vw params file for each input image.\n    if options.duplicate_param_files:\n        all_images = get_full_image_list(options)\n        all_images = [os.path.basename(x) for x in all_images]\n        for name in all_images:\n            output_path = os.path.join(options.output_folder, name + '.tsai')\n            shutil.copy(options.vw_params_path, output_path)\n    \n    # Write the Theia output file\n    theia_file = open(options.theia_params_path, 'w')\n    mean_focal_length = (params['focal_length_x']+params['focal_length_y'])/2.0\n    param_list = [options.image_wildcard, mean_focal_length, params['center_x'], params['center_y'], \n                  params['aspect_ratio'], params['skew'], params['k1'], params['k2']]\n    param_list = [str(x) for x in param_list] # Cast to strings for output\n    s = \" \".join(param_list)\n    theia_file.write(s)\n    theia_file.close()\n\n\n#------------------------------------------------------------------------------\n\ndef main(argsIn):\n\n    try:\n\n        # Use parser that ignores unknown options\n        usage  = \"usage: camera_calibrate [options] <output folder> <board height> <board width> <image wildcard>\"\n        parser = optparse.OptionParser(usage=usage)\n\n        parser.add_option('--box-size-cm',  dest='box_size_cm', default=None, type=float,\n                                         help='Size of the checkerboard boxes in centimeters.  Required for the results to be in real world values.')\n        parser.add_option(\"--suppress-output\", action=\"store_true\", default=False,\n                                               dest=\"suppress_output\",  help=\"Suppress output of sub-calls.\")\n        parser.add_option(\"--duplicate-files\", action=\"store_true\", default=False,\n                                               dest=\"duplicate_param_files\",  \n                                               help=\"Makes duplicate copies of the VisionWorkbench parameter file for each input camera.\")\n        parser.add_option(\"--overwrite\",       action=\"store_true\", default=False,\n                                               dest=\"overwrite\",  \n                                               help=\"Overwrite any partial computation results on disk.\")\n\n        # This call handles all the parallel_mapproject specific options.\n        (options, args) = parser.parse_args(argsIn)\n\n        # Check the required positional arguments.\n        if len(args) < 1:\n            parser.print_help()\n            parser.error(\"Missing output folder.\\n\" );\n        if len(args) < 3:\n            parser.print_help()\n            parser.error(\"Missing the checkerboard internal corner counts, one in each dimension.\\n\" );\n        if len(args) < 4:\n            parser.print_help()\n            parser.error(\"Missing input image wildcard path.\\n\" );\n            \n        # Store the positional input parameters\n        options.output_folder  = args[0]\n        options.board_size     = (int(args[1]), int(args[2]))\n        options.image_wildcard = args[3]\n        #print args\n        #print options.image_wildcard\n        \n        # Store some other things in options to make passing arguments easier\n        options.xml_list_path     = os.path.join(options.output_folder, 'ocv_image_list.xml'  )\n        options.ocv_params_path   = os.path.join(options.output_folder, 'ocv_cam_params.yml'  )\n        options.vw_params_path    = os.path.join(options.output_folder, 'vw_cam_params.tsai'  )\n        options.theia_params_path = os.path.join(options.output_folder, 'solve_cam_params.txt')\n        \n    except optparse.OptionError as msg:\n        raise Usage(msg)\n\n    startTime = time.time()\n\n    if not (os.path.exists(options.output_folder)):\n        os.makedirs(options.output_folder)\n\n    # Call the image list generation tool\n    make_image_list(options)\n    \n    # Call the calibration tool\n    calibrate_camera(options)\n    \n    # Generate camera_solve and VW compatible camera files.\n    convert_outputs(options)\n\n    endTime = time.time()\n    print(\"Finished in \" + str(endTime - startTime) + \" seconds.\")\n\nif __name__ == \"__main__\":\n    sys.exit(main(sys.argv[1:]))\n"
  },
  {
    "path": "src/asp/Tools/camera_footprint.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// Compute the footprint of a camera on a DEM/datum, print it, and optionally\n///  write a KML file.\n\n#include <asp/Sessions/StereoSessionFactory.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/AspProgramOptions.h>\n#include <asp/Core/Macros.h>\n#include <asp/Core/FileUtils.h>\n\n#include <vw/FileIO/DiskImageIO.h>\n#include <vw/FileIO/DiskImageView.h>\n#include <vw/Core/StringUtils.h>\n#include <vw/Camera/PinholeModel.h>\n#include <vw/Cartography/Datum.h>\n#include <vw/Cartography/GeoReference.h>\n#include <vw/Cartography/CameraBBox.h>\n#include <vw/FileIO/KML.h>\n#include <vw/Cartography/shapeFile.h>\n\n#include <limits>\n#include <cstring>\n\n#include <boost/filesystem.hpp>\n#include <boost/algorithm/string.hpp>\n#include <boost/program_options.hpp>\n\nnamespace fs = boost::filesystem;\nnamespace po = boost::program_options;\n\nusing namespace vw;\nusing namespace vw::camera;\nusing namespace vw::cartography;\n\nstruct Options : public vw::GdalWriteOptions {\n  std::string image_file, camera_file, stereo_session, bundle_adjust_prefix,\n         datum_str, dem_file, target_srs_string, output_shp, output_kml;\n  bool quick;\n};\n\nvoid handle_arguments(int argc, char *argv[], Options& opt) {\n  po::options_description general_options(\"\");\n  general_options.add_options()\n    (\"datum\", po::value(&opt.datum_str)->default_value(\"\"),\n     \"Use this datum to interpret the heights. Options: WGS_1984, D_MOON (1,737,400 \"\n     \"meters), D_MARS (3,396,190 meters), MOLA (3,396,000 meters). Also accepted: Earth \"\n     \"(=WGS_1984), Mars (=D_MARS), Moon (=D_MOON).\")\n    (\"t_srs\", po::value(&opt.target_srs_string)->default_value(\"\"), \n     \"Specify the output projection (PROJ or WKT string).\")\n    (\"quick\", po::bool_switch(&opt.quick)->default_value(false),\n\t   \"Use a faster but less accurate computation.\")\n    (\"output-shp\", po::value(&opt.output_shp),\n     \"Save the convex hull of the points sampled on the camera footprint as a shapefile \"\n     \"with this name.\")\n    (\"output-kml\", po::value(&opt.output_kml),\n     \"Create an output KML file at this path.\")\n    (\"session-type,t\", po::value(&opt.stereo_session)->default_value(\"\"),\n     \"Select the stereo session type to use for processing. Usually the program can select \"\n     \"this automatically by the file extension, except for xml cameras. See the doc for \"\n     \"options.\")\n    (\"bundle-adjust-prefix\", po::value(&opt.bundle_adjust_prefix),\n     \"Use the camera adjustment obtained by previously running bundle_adjust with this \"\n     \"output prefix.\")\n    (\"dem-file\", po::value(&opt.dem_file)->default_value(\"\"),\n     \"Instead of using a longitude-latitude-height box, sample the surface of this DEM.\");\n\n  general_options.add(vw::GdalWriteOptionsDescription(opt));\n\n  po::options_description positional(\"\");\n  positional.add_options()\n    (\"camera-image\", po::value(&opt.image_file))\n    (\"camera-model\", po::value(&opt.camera_file));\n\n  po::positional_options_description positional_desc;\n  positional_desc.add(\"camera-image\",1);\n  positional_desc.add(\"camera-model\",1);\n\n  std::string usage(\"[options] <camera-image> <camera-model>\");\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line(argc, argv, opt, general_options, general_options,\n\t\t\t    positional, positional_desc, usage,\n\t\t\t    allow_unregistered, unregistered);\n\n  if (opt.image_file.empty())\n    vw_throw(ArgumentErr() << \"Missing input image.\\n\" << usage << general_options);\n\n  if (boost::iends_with(opt.image_file, \".cub\") && opt.stereo_session == \"\")\n    opt.stereo_session = \"isis\";\n\n  // Need this to be able to load adjusted camera models. That will happen\n  // in the stereo session.\n  asp::stereo_settings().bundle_adjust_prefix = opt.bundle_adjust_prefix;\n\n  // Must specify the DEM or the datum\n  if (opt.dem_file.empty() && opt.datum_str.empty() && opt.target_srs_string.empty())\n    vw_throw(ArgumentErr() << \"Need to provide a DEM, a datum, or a t_srs string.\\n\" \n             << usage << general_options);\n\n  // This is a bug fix. The user by mistake passed in an empty projection string.\n  if (!vm[\"t_srs\"].defaulted() && opt.target_srs_string.empty())\n    vw_throw(ArgumentErr()\n             << \"The value of --t_srs is empty. Then it must not be set at all.\\n\");\n}\n\nint main(int argc, char *argv[]) {\n\n  Options opt;\n  try {\n\n    handle_arguments(argc, argv, opt);\n\n        asp::SessionPtr session(asp::StereoSessionFactory::create\n\t\t       (opt.stereo_session, // may change inside\n                        opt,\n                        opt.image_file,  opt.image_file,\n                        opt.camera_file, opt.camera_file,\n                        \"\",\n                        \"\",\n                        false)); // Do not allow promotion from normal to map projected session\n\n    if (opt.camera_file.empty())\n      vw_throw(ArgumentErr() << \"Missing input camera.\\n\");\n\n    boost::shared_ptr<CameraModel> cam = session->camera_model(opt.image_file, opt.camera_file);\n\n    // The input nodata value\n    float input_nodata_value = -std::numeric_limits<float>::max();\n    vw::read_nodata_val(opt.image_file, input_nodata_value);\n\n    // Just get the image size\n    vw::Vector2i image_size = vw::file_image_size(opt.image_file);\n\n    // Perform the computation\n    GeoReference target_georef;\n\n    BBox2 footprint_bbox;\n    float mean_gsd = 0.0;\n    std::vector<Vector3> llh_coords;\n    if (opt.dem_file.empty()) { \n                               \n      // No DEM available, intersect with the datum.\n\n      // Initialize the georef/datum\n      bool have_user_datum = (opt.datum_str != \"\");\n      cartography::Datum datum(opt.datum_str);\n      target_georef = GeoReference(datum);\n      vw::cartography::set_srs_string(opt.target_srs_string, have_user_datum, datum, target_georef);\n      vw_out() << \"Using georef: \" << target_georef << \"\\n\";\n\n      std::vector<Vector2> coords2;\n      footprint_bbox = camera_bbox(target_georef, cam, image_size[0], image_size[1],\n                                   mean_gsd, &coords2);\n      for (std::size_t i=0; i<coords2.size(); ++i) {\n        Vector3 proj_coord(coords2[i][0], coords2[i][1], 0.0);\n        llh_coords.push_back(target_georef.point_to_geodetic(proj_coord));\n      }\n\n    } else { \n            \n      // DEM provided, intersect with it\n\n      // Load the DEM\n      float dem_nodata_val = -std::numeric_limits<float>::max();\n      vw::read_nodata_val(opt.dem_file, dem_nodata_val);\n      ImageViewRef<PixelMask<float>> dem\n        = create_mask(DiskImageView<float>(opt.dem_file), dem_nodata_val);\n\n      GeoReference dem_georef;\n      if (!read_georeference(dem_georef, opt.dem_file))\n        vw_throw(ArgumentErr() << \"Missing georef.\\n\");\n\n      target_georef = dem_georef; // return box in this projection\n      vw_out() << \"Using georef: \" << target_georef << \"\\n\";\n      int num_samples = 100; // should be enough\n      footprint_bbox = camera_bbox(dem, dem_georef,\n                                   target_georef, cam,\n                                   image_size[0], image_size[1],\n                                   mean_gsd, opt.quick, &llh_coords, num_samples);\n      for (std::size_t i = 0;  i < llh_coords.size(); i++) \n        llh_coords[i] = target_georef.datum().cartesian_to_geodetic(llh_coords[i]);\n    }\n\n    // Print out the results\n    vw_out() << \"Computed footprint bounding box:\\n\" << footprint_bbox << \"\\n\";\n    vw_out() << \"Computed mean gsd: \" << mean_gsd << \"\\n\";\n  \n    if (opt.output_shp != \"\") {\n      // Must convert to projected coordinates\n      std::vector<vw::Vector3> proj_coords(llh_coords.size());\n      for (std::size_t i = 0; i < llh_coords.size(); i++)\n        proj_coords[i] = target_georef.geodetic_to_point(llh_coords[i]);\n      \n      vw::geometry::dPoly poly;\n      vw::geometry::convexHull(proj_coords, poly);\n      bool has_geo = true;\n      vw::vw_out() << \"Writing: \" << opt.output_shp << \"\\n\";\n      vw::geometry::write_shapefile(opt.output_shp, has_geo, target_georef, poly);\n    }\n    \n    if (opt.output_kml != \"\") {\n      // Create the KML file if specified by the user\n      KMLFile kml(opt.output_kml, \"footprint\");\n      const bool HIDE_LABELS = true;\n      std::string base = \"http://maps.google.com/mapfiles/kml/shapes/\"; \n      std::string dot_cir = base + \"placemark_circle.png\"; \n      std::string dot_hlt = base + \"placemark_circle_highlight.png\"; \n      kml.append_style(\"dot\", \"\", 1.2, dot_cir,  HIDE_LABELS);\n      kml.append_style(\"dot_highlight\", \"\", 1.4, dot_hlt);\n      kml.append_stylemap(\"placemark\", \"dot\", \"dot_highlight\");\n      kml.append_line(llh_coords, \"intersections\", \"placemark\");\n      vw_out() << \"Writing: \" << opt.output_kml << \"\\n\";\n      kml.close_kml();\n    }\n    \n  } ASP_STANDARD_CATCHES;\n\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/camera_solve",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n'''\nA helper tool to streamline the process of solving for \npinhole camera models using Theia and ASP.\n'''\n\nimport sys, os, re\nimport shutil, subprocess, string, time, errno, optparse, glob, shlex, platform\n#import register_local_cameras\n\nif sys.version_info < (2, 6, 0):\n    print('\\nERROR: Must use Python 2.6 or greater.')\n    sys.exit(1)\n\n# The path to the ASP python files\nbasepath    = os.path.abspath(sys.path[0])\npythonpath  = os.path.abspath(basepath + '/../Python')  # for dev ASP\nlibexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP\nsys.path.insert(0, basepath) # prepend to Python path\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\n\nimport asp_file_utils, asp_system_utils, asp_cmd_utils, asp_image_utils\n\n# Prepend the path to build_reconstruction (for local dev builds)\nbase_dir = asp_system_utils.findTheiaInstallDir()\nos.environ[\"PATH\"] = os.path.join(base_dir, 'bin') + os.pathsep + os.environ[\"PATH\"]\n\n# Prepend libexecpath (for packaged ASP)\nos.environ[\"PATH\"] = libexecpath + os.pathsep + os.environ[\"PATH\"]\n\ndef get_paths_with_extension(input_list, output_folder, new_extension, prefix=\"\"):\n    '''Given a list of input files, generates a list of output paths with an extension appended'''\n\n    output_paths = []\n    for path in input_list:\n        filename    = os.path.basename(path)\n        output_path = os.path.join(output_folder, prefix + filename + new_extension)\n        output_paths.append(output_path)\n        \n    return output_paths\n\ndef prep_input_images(options):\n    '''Make sure all the input images can be loaded by Theia.\n       This is done by making symlinks or conversions of all input\n       images in the output directory.'''\n\n    # List of image types that Theia cannot read and must be translated\n    convert_ext_list = ['.cub']\n\n    # Set up the image wildcard string required by Theia.\n    common_ext = os.path.splitext(options.input_images[0])[1]\n    options.image_wildcard = os.path.join(os.path.abspath(options.output_folder), '*' + common_ext)\n    \n    for input_path in options.input_images:\n        ext = os.path.splitext(input_path)[1]\n        if not (ext == common_ext):\n            raise Exception('All input images must have the same extension!')\n\n        # If needed we could use gdal_translate to convert the file\n        if ext in convert_ext_list:\n            raise Exception('This image type is not yet supported!')\n            \n        # Make a symlink to this file in the output folder\n        filename     = os.path.basename(input_path)\n        symlink_path = os.path.join(options.output_folder, filename)\n        try:    os.remove(symlink_path) # Redo the symlink each time\n        except: pass\n        os.symlink(os.path.abspath(input_path), symlink_path)\n        \n    return\n\ndef generate_flagfile(options):\n    '''Generate a Theia config file based on user options'''\n\n    match_dir        = os.path.join(options.output_folder, 'match_dir')\n    match_path       = os.path.join(options.output_folder, 'theia_matches')\n    output_path      = os.path.join(options.output_folder, 'theia_reconstruction.dat')\n    flagfile_path    = os.path.join(options.output_folder, 'theia_flagfile.txt')\n    options.theia_output_path = output_path\n    options.flagfile_path     = flagfile_path\n    options.theia_match_dir   = match_dir\n\n    # Control solving for intrinsic parameters\n    intrinsics_options = 'NONE'\n    if options.solveIntrinsic:\n        # We read focal length and principal point so let those vary\n        # - Enabling radial distortion *significantly* changes the results!\n        intrinsics_options = 'FOCAL_LENGTH|PRINCIPAL_POINTS'\n        #intrinsics_options = 'FOCAL_LENGTH|PRINCIPAL_POINTS|RADIAL_DISTORTION'\n\n    # Make sure the output file has the latest options\n    if os.path.exists(options.flagfile_path):\n        os.remove(options.flagfile_path)\n\n    def pathPrint(value):\n        '''Simple function to print an absolute path or nothing'''\n        if value:\n            return os.path.abspath(value)\n        else:\n            return ''\n   \n    def tfPrint(value):\n        '''Simple function to convert boolean to 'true' or 'false' '''\n        if value:\n            return 'true'\n        else:\n            return 'false'\n\n    if options.existing_theia_flagfile:\n\n        # Replace the file path options\n        image_line        = '--images='               +options.image_wildcard\n        calib_line        = '--calibration_file='     +pathPrint(options.theia_camera_param_path)\n        output_match_line = '--output_matches_file='  +pathPrint(match_path)\n        output_line       = '--output_reconstruction='+pathPrint(output_path)\n\n        # Open the input file\n        input_handle = open(options.existing_theia_flagfile, 'r')\n        output_string = ''\n        for line in input_handle:\n            out_line = line\n            # Swap out specific file paths, leaving all the other options.\n            if '--images=' in line:\n                out_line = image_line +'\\n'\n            if '--calibration_file=' in line:\n                out_line = calib_line +'\\n'\n            if '--output_matches_file=' in line:\n                out_line = output_match_line +'\\n'\n            if '--output_reconstruction=' in line:\n                out_line = output_line +'\\n'\n            output_string += out_line\n            \n        input_handle.close()\n        \n    else: # The user did not provide a flag file, generate our own from defaults.\n\n        output_string =  '''\n############### Input/Output ###############\n# Input/output files.\n# Set these if a matches file is not present. Images should be a filepath with a\n# wildcard e.g., /home/my_username/my_images/*.jpg\n--images='''+options.image_wildcard+'''\n--output_matches_file='''+pathPrint(match_path)+'''\n\n# If a matches file has already been created, set the filepath here. This avoids\n# having to recompute all features and matches.\n--matches_file='''+options.match_wildcard+'''\n\n# The calibration file indicates possibly known calibration e.g., from EXIF or\n# explicit calibration. Theia attempts to extract EXIF focal lengths if calibration\n# is not supplied for a given image.\n--calibration_file='''+pathPrint(options.theia_camera_param_path)+'''\n--output_reconstruction='''+pathPrint(output_path)+'''\n\n############### Multithreading ###############\n# Set to the number of threads you want to use.\n--num_threads=16\n\n############### Feature Extraction ###############\n--descriptor=SIFT\n--feature_density=NORMAL\n\n############### Matching Options ###############\n# Perform matching out-of-core. If set to true, the matching_working_directory\n# must be set to a valid, writable directory (the directory will be created if\n# it does not exist). Set to false to perform all-in-memory matching.\n--match_out_of_core=true\n\n# During feature matching, features are saved to disk so that out-of-core\n# matching may be performed. This directory specifies which directory those\n# features should be saved to.\n# This should be left empty if specified on the command line.\n--matching_working_directory=''' + pathPrint(match_dir) + '''\n\n# During feature matching we utilize an LRU cache for out-of-core matching. The size\n# of that cache (in terms of number of images) is controlled by this parameter. The\n# higher this number the more memory is required.\n--matching_max_num_images_in_cache=128\n\n--matching_strategy=CASCADE_HASHING\n--lowes_ratio=0.75\n--min_num_inliers_for_valid_match=30\n--max_sampson_error_for_verified_match=4.0\n--bundle_adjust_two_view_geometry=true\n--keep_only_symmetric_matches=true\n\n# Global descriptor extractor settings. The global image descriptors are used to\n# speed up matching by selecting the K most similar images for each image, and\n# only performing feature matching with these images.                       \n--num_nearest_neighbors_for_global_descriptor_matching=100\n--num_gmm_clusters_for_fisher_vector=16\n--max_num_features_for_fisher_vector_training=1000000\n\n############### General SfM Options ###############\n--reconstruction_estimator=GLOBAL\n--min_track_length=2\n--max_track_length=50\n--reconstruct_largest_connected_component=false\n\n# Set to true if all views were captured with the same camera. If true, then a\n# single set of camera intrinsic parameters will be used for all views in the\n# reconstruction. --> Always true for ASP use, as solving for intrinsics from one\n#                     image is not very reliable.\n--shared_calibration=true\n\n# If set to true, only views with known calibration are reconstructed.\n--only_calibrated_views=false\n\n############### Global SfM Options ###############\n--global_position_estimator=NONLINEAR\n--global_rotation_estimator=ROBUST_L1L2\n--post_rotation_filtering_degrees=15.0\n\n# This refinement is very unstable for rotation-only motions so\n# it is advised that this is set to false for these motions.\n--refine_relative_translations_after_rotation_estimation=true\n\n# If true, only cameras that are well-conditioned for position estimation will\n# be used for global position estimation\n--extract_maximal_rigid_subgraph=false\n\n# Filter the relative translations with the 1DSfM filter to remove potential\n# outliers in the relative pose measurements.\n--filter_relative_translations_with_1dsfm=true\n\n# Nonlinear position estimation options\n--position_estimation_min_num_tracks_per_view=0\n--position_estimation_robust_loss_width=0.1\n\n# After estimating camera poses, we perform triangulation, then BA,\n# then filter out bad points. This controls how many times we repeat\n# this process.\n--num_retriangulation_iterations=1\n\n############### Incremental SfM Options ###############\n--absolute_pose_reprojection_error_threshold=8\n--partial_bundle_adjustment_num_views=20\n--full_bundle_adjustment_growth_percent=5\n--min_num_absolute_pose_inliers=30\n\n############### Bundle Adjustment Options ###############\n# Set this parameter to a value other than NONE if you want to utilize a robust\n# cost function during bundle adjustment. This can increase robustness to outliers\n# during the optimization.\n--bundle_adjustment_robust_loss_function=CAUCHY\n\n# Set this value to determine the reprojection error in pixels at which\n# robustness begins (if a robust cost function is being used).\n--bundle_adjustment_robust_loss_width=10.0\n\n# Set this parameter to change which camera intrinsics should be\n# optimized. Valid options are NONE, ALL, FOCAL_LENGTH, PRINCIPAL_POINTS,\n# RADIAL_DISTORTION, ASPECT_RATIO, and SKEW. This parameter can be set using a\n# bitmask (with no spaces) e.g., FOCAL_LENGTH|RADIAL_DISTORTION\n--intrinsics_to_optimize='''+intrinsics_options+'''\n\n# After BA, remove any points that have a reprojection error greater\n# than this.\n--max_reprojection_error_pixels=20.0\n\n############### Triangulation Options ###############\n--min_triangulation_angle_degrees=0.5\n--triangulation_reprojection_error_pixels=25.0\n--bundle_adjust_tracks=true\n\n############### Reconstruction Type ###############\n# It can be GLOBAL or INCREMENTAL. The second is more robust.\n--reconstruction_estimator=GLOBAL\n\n############### Logging Options ###############\n# Logging verbosity.\n--logtostderr\n# Increase this number to get more verbose logging.\n--v=3\n'''\n        # See if to overwrite some of the above\n        if options.theia_overrides != \"\":\n            lines = output_string.splitlines()\n            for count in range(len(lines)):\n                line = lines[count]\n                m = re.match(r\"(^.*?=)(.*?$)\", line)\n                if not m:\n                    continue\n                name = m.group(1)\n                old_val = m.group(2)\n                \n                for repl in options.theia_overrides.split():\n                    m = re.match(r\"(^.*?=)(.*?$)\", repl)\n                    curr_name = m.group(1)\n                    new_val = m.group(2)\n\n                    if name != curr_name:\n                        continue\n                    \n                    new_line = name + new_val\n                    if line != new_line:\n                        print(\"Overriding: \" + line)\n                        print(\"with:       \" + new_line)\n                        line = new_line\n                    lines[count] = line\n                    \n            output_string = \"\\n\".join(lines)\n                    \n\n    # Now have a string to write to the flag file, however we got it.\n\n    handle = open(flagfile_path, 'w')\n    handle.write(output_string)\n    handle.close()\n\n    return flagfile_path\n\ndef build_reconstruction(options):\n    '''Call Theia to generate a 3D camera reconstruction'''\n\n    # Make sure the input images are set up\n    prep_input_images(options)\n\n    # Create the Theia config file!\n    options.match_wildcard=''\n    flagfile_path = generate_flagfile(options)\n\n    if (not os.path.exists(options.theia_output_path)) or options.overwrite:\n        abs_flag_path = os.path.abspath(flagfile_path)\n        cmd = ['build_reconstruction', '--flagfile', abs_flag_path, '-v', '2']\n        if sys.platform == 'linux' or sys.platform == 'darwin':\n            cmd += ['--random_seed', '1']\n        if options.threads > 0:\n            cmd += ['--num_threads', str(options.threads)]\n        verbose = False\n        print (' '.join(cmd))\n        asp_system_utils.generic_run(cmd, verbose)\n\n        # Theia appends a tag to the requested output file, just rename the file.\n        theia_temp_output_path = options.theia_output_path + '-0'\n        if not os.path.exists(theia_temp_output_path):\n            raise Exception('Theia failed to generate a camera reconstruction')\n        shutil.move(theia_temp_output_path, options.theia_output_path)\n\n    return options.theia_output_path\n\n# This function is not being used but if we ever decide to support large image sets\n#  we may need to switch to using it.  Since we don't use it, it can sit in an incomplete state.\n\ndef guided_build_reconstruction(options):\n    '''Split the reconstruction over multiple Theia tool calls to provide\n       more control over the process'''\n       \n    # Make sure the input images are set up\n    prep_input_images(options)\n    \n    \n    # TODO: Skip existing files\n    # Extract features for all of the input images.\n    # - TODO: Can run this in parallel to use more CPUs, only hits 400% now.\n    # - match_features expects these to be in the same folder as the source images\n    # - TODO: Experiment with feature options and read these from the flagfile which\n    #         the user can currently pass in.\n    options.feature_folder = options.output_folder\n    #os.path.join(options.output_folder, 'features')\n    #if not os.path.exists(options.feature_folder):\n    #    os.makedirs(options.feature_folder)\n    cmd = ['extract_features', '--input_images',options.image_wildcard, \n           '--features_output_directory',options.feature_folder, \n           '--num_threads','12', '--descriptor','SIFT']\n    asp_system_utils.executeCommand(cmd, suppressOutput=options.suppressOutput)\n    \n    # TODO: Generate lists of images which we think should match\n    #       - Can even have \"primary\" images and \"backup\" images to reduce\n    #         the number of links.\n    #       - Once we have the lists, we need to selectively call match_features for each pairing.\n    \n    options.matches_folder = options.output_folder\n    #os.path.join(options.output_folder, 'matches')\n    #if not os.path.exists(options.matches_folder):\n    #    os.makedirs(options.matches_folder)\n    match_path        = os.path.join(os.path.abspath(options.matches_folder), 'A.match')\n    features_wildcard = os.path.join(os.path.abspath(options.feature_folder), '*.features')\n    cmd = ['match_features', '--input_features',features_wildcard, \n           '--output_matches_file',match_path, '--calibration_file',options.theia_camera_param_path,\n           '--num_threads','12', '--matching_strategy','BRUTE_FORCE', '--lowes_ratio','0.8']\n    asp_system_utils.executeCommand(cmd, suppressOutput=options.suppressOutput)    \n\n    # Set this so it can be included in the flag file\n    options.match_wildcard = os.path.join(os.path.abspath(options.feature_folder), '*.match')\n\n    # Create the Theia config file!\n    flagfile_path = generate_flagfile(options)\n       \n    if (not os.path.exists(options.theia_output_path)) or options.overwrite:\n        abs_flag_path = os.path.abspath(flagfile_path)\n        cmd = ['build_reconstruction', '--flagfile', abs_flag_path]\n        asp_system_utils.executeCommand(cmd, suppressOutput=options.suppressOutput)\n\n        # Theia appends a tag to the requested output file, just rename the file.\n        theia_temp_output_path = options.theia_output_path + '-0'\n        if not os.path.exists(theia_temp_output_path):\n            raise Exception('Theia failed to generate a camera reconstruction')\n        shutil.move(theia_temp_output_path, options.theia_output_path)\n\n    return options.theia_output_path\n\ndef update_tsai_file(input_camera_path, new_pose_path, output_camera_path):\n    '''Copies a .tsai camera file with an updated position from another .tsai camera file.'''\n\n    # Read in the lines of interest from new_pose_path\n    # - We never update the distortion parameters since we won't be using\n    #   exactly the same lens distortion model.\n    scaled_keys = ['fu', 'fv', 'cu', 'cv'] # keys that we will multiply by pitch \n    keys = []  # The values we want to copy\n    keys.extend(scaled_keys)\n    keys.extend(['C', 'R'])\n\n    # Skip non-existent files\n    if not os.path.exists(new_pose_path):\n        print('Skipping camera with failed reconstruction: ' + new_pose_path)\n        return\n        \n    f_in  = open(new_pose_path,  'r')\n    replacements = dict()\n    for line in f_in:\n        for k in keys: # Look for target values\n            if (k+' =') in line:\n                replacements[k] = line\n    f_in.close()\n\n    # Find the pitch to scale some values by\n    pitch = 1.0\n    f_in  = open(input_camera_path,  'r')\n    for line in f_in:\n        for k in keys: # Look for target values\n            matches = re.match(r'^pitch = (.*?)$', line)\n            if matches:\n                pitch = float(matches.group(1))\n    f_in.close()\n    \n    # Copy each line of the input file as-is except for the updated fields\n    f_in  = open(input_camera_path,  'r')\n    f_out = open(output_camera_path, 'w')\n    for line in f_in:\n        thisLine = line\n        for k in keys: # See if this is a line we should replace\n            if (k+' =') in line:\n                thisLine = replacements[k]\n\n                # See if to scale by the pitch\n                if k in scaled_keys:\n                    matches = re.match(r'^.*? = (.*?)$', thisLine)\n                    if matches:\n                        val = float(matches.group(1))\n                        thisLine = k + ' = ' + str(val*pitch) + \"\\n\"\n                        \n        f_out.write(thisLine)\n    f_in.close()\n    f_out.close()\n\ndef export_cameras_to_vw(options):\n    \"\"\"Convert from Theia's camera format to VW's pinhole format.\"\"\"\n\n    # Need to wrap the image wildcard in quotes so it does not get expanded too early!\n    cmd = ['export_reconstruction_to_vw',  '--reconstruction', options.theia_output_path, \n           '--output_directory', options.output_folder, '--images', options.image_wildcard]\n    asp_system_utils.executeCommand(cmd, suppressOutput=options.suppressOutput)\n\n    # Running the tool should generate a .tsai file for each input image\n    options.theia_camera_models = get_paths_with_extension(options.input_images, \n                                                           options.output_folder, '.tsai')\n    \n    all_found = True\n    good_images = []\n    good_cameras = []\n    for i in range(0,len(options.theia_camera_models)):\n        model_path = options.theia_camera_models[i]\n        if not os.path.exists(model_path):\n            all_found = False\n            print('Failed to generate model file: ' + model_path)\n            continue\n        \n        # Handle possibility of multiple camera files\n        if len(options.camera_param_paths) > 1:\n            this_vw_camera_path = options.camera_param_paths[i]\n        else:\n            this_vw_camera_path = options.camera_param_paths[0]\n\n        # Overwrite the file Theia wrote with a copy of the user's camera file with\n        #  position and orientation replaced with the Theia values.\n        update_tsai_file(this_vw_camera_path, model_path, model_path)\n        \n        good_images.append(options.input_images[i])\n        good_cameras.append(model_path)\n            \n    if not all_found:\n       print('Warning: Failed to extract camera models for all images.')\n       \n    return (good_images, good_cameras)\n\ndef run_bundle_adjust(options, good_images, good_cameras):\n    '''Run the ASP bundle adjust program to move the camera models into global coordinates'''\n\n    output_prefix = os.path.join(options.output_folder, 'asp_ba_out')\n\n    if True: # options.use_theia_matches\n        # Try to export Theia matches to VW so that matching only needs to happen once.\n        # If this fails, bundle_adjust will try to find matches.\n        cmd = ['export_matches_file_to_vw', '-theia_match_dir', options.theia_match_dir, \n               '-vw_output_prefix', output_prefix]\n        asp_system_utils.executeCommand(cmd, suppressOutput=options.suppressOutput)\n\n    # Some extra bundle adjust params\n    have_camera_positions = options.bundle_params and \\\n        ('camera-positions' in options.bundle_params)\n    cam_type = 'pinhole'\n    if len(options.gcp_files) > 0 or have_camera_positions:\n      cam_type = 'nadirpinhole' # This is better, but can only use with global coordinates.\n    ba_params = ['--inline-adjustments', '-t', cam_type, '--datum', options.datum]\n    \n    if options.solveIntrinsic:\n        # Add flag to bundle adjust but make sure it is not added twice\n        ba_params += ['--solve-intrinsics']\n        if options.bundle_params and ('--solve-intrinsics' in options.bundle_params):\n            options.bundle_params = options.bundle_params.replace('--solve-intrinsics', '')\n    \n    if options.bundle_params:\n        ba_params += shlex.split(options.bundle_params)\n        # Split on spaces but keep quoted parts together.\n        # Always run this step as otherwise there was no point to calling the tool.\n\n    # Run ASP's bundle_adjust tool. The --no-datum option is very important\n    # as we start with the cameras in some arbitrary coordinate system.    \n    cmd = ['bundle_adjust', '--no-datum'] + good_images + good_cameras\n\n    if len(options.gcp_files) > 0:\n      cmd += options.gcp_files\n      if '--transform-cameras-using-gcp' not in ba_params and \\\n             '--transform-cameras-with-shared-gcp' not in ba_params:\n          # Try to transform the cameras using GCP seen in at least two images\n          ba_params += ['--transform-cameras-with-shared-gcp']\n    cmd += ['-o', output_prefix]\n    cmd += ba_params\n    if '--threads' not in cmd:\n        cmd += ['--threads', str(options.threads)]\n    verbose = False\n    print (' '.join(cmd))\n    asp_system_utils.generic_run(cmd, verbose)\n\n    # The previous call should create a .tsai file for every input image in the output folder\n    ba_camera_models = get_paths_with_extension(options.input_images, options.output_folder,\n                                                '.tsai', prefix='asp_ba_out-')\n    output_paths = get_paths_with_extension(options.input_images, options.output_folder,\n                                            '.final.tsai', prefix='')\n\n    # Move the output files to their final location\n    all_found = True\n    finalCameras = []\n    for (model_path, output_path) in zip(ba_camera_models, output_paths):\n        if not os.path.exists(model_path):\n            all_found = False\n            print('Failed to generate model file: ' + model_path)\n            continue\n        shutil.move(model_path, output_path)\n        finalCameras.append(output_path)\n        print('--> Wrote output camera model: ' + output_path)\n    if not all_found:\n        print('Warning: Failed to produce camera models for all images. The resulting ' +\n              'subset is likely still usable. Inspect the input images. Consider ' +\n              'restricting the solving to a smaller group or adding more images with ' +\n              'intermediate properties.')\n    \n    # Write the final cameras list, for user convenience\n    finalCamList = output_prefix + '-final_camera_list.txt'\n    with open(finalCamList, 'w') as f:\n        for cam in finalCameras:\n            f.write(cam + '\\n')\n    print(\"List of successfully used images:      \" + output_prefix + '-image_list.txt')\n    print(\"List of final bundle-adjusted cameras: \" + finalCamList)\n\n# TODO: Move this somewhere else\ndef parse_vw_tsai_file(path):\n    '''Reads a Vision Workbench .tsai camera file and populates a dictionary with information'''\n\n    output = dict()\n    f = open(path, 'r')\n    for line in f:\n        # We are looking for lines in the form of NAME = BLAH BLAH BLAH\n        parts = line.split()\n        if len(parts) == 3: # One parameter\n            output[parts[0]] = float(parts[2])\n        else:\n            if len(parts) > 2: # List of parameters\n                output[parts[0]] = [float(x) for x in parts[2:]]\n            # Else don't read it.\n            \n    f.close()\n    return output\n\ndef generate_theia_camera_file(input_images, vw_cam_files, theia_cam_file_out):\n    '''Generate zero-distortion camera configs for Theia with one line per input file on disk.\n       Also strip out any folder paths which confuse Theia.  We use zero distortion because\n       Theia only supports one distortion model (unlike ASP) and we will run bundle_adjust to\n       fine-tune the Theia outputs by taking into account the distortion model.'''\n\n    # Make a list of parameters for each camera\n    params = []\n    for path in vw_cam_files:\n      # Read in the focal length and center point\n      tsai_data = parse_vw_tsai_file(path)\n      \n      pitch        = tsai_data['pitch'] # Use to convert other data to pixel units\n      focal_length = ((tsai_data['fu'] + tsai_data['fv']) / 2.0) / pitch\n      center_x     = tsai_data['cu'] / pitch\n      center_y     = tsai_data['cv'] / pitch\n      \n      params.append( (pitch, focal_length, center_x, center_y) )\n\n    # Write a nearly identical line for each input image\n    num_images = len(input_images)\n    with open(theia_cam_file_out, \"w\") as fh:\n\n        fh.write(\"{\\n\")\n        fh.write('\"priors\" : [\\n')\n\n        for i in range(0, num_images):\n\n            image = input_images[i]\n            if len(vw_cam_files) == 1:\n                theseParams = params[0]\n            else:\n                theseParams = params[i]\n\n            focal_length  = theseParams[1]\n            center_x      = theseParams[2]\n            center_y      = theseParams[3]\n            width, height = asp_image_utils.getImageSize(image)\n\n            base_image    = os.path.basename(image) # Strip the folder\n            fh.write('{\"CameraIntrinsicsPrior\" : {\\n')\n            fh.write('\"image_name\" : \"' + base_image + '\",\\n')\n            fh.write('\"width\" : '  + str(width) + \",\\n\")\n            fh.write('\"height\" : ' + str(height) + \",\\n\")\n            fh.write('\"focal_length\" : ' + str(focal_length) + \",\\n\")\n            fh.write('\"principal_point\" : [' + \\\n                     str(center_x) + \", \" + \\\n                     str(center_y) + \"],\\n\")\n\n            fh.write('\"camera_intrinsics_type\" : \"PINHOLE\"\\n')\n\n            if i < num_images - 1:\n                fh.write(\"}},\\n\")\n            else:\n                fh.write(\"}}\\n\")\n\n        fh.write(\"]\\n\")\n        fh.write(\"}\\n\")\n\n    return os.path.abspath(theia_cam_file_out) # Return the path to the Theia camera file\n    \n#------------------------------------------------------------------------------\n\ndef main(argsIn):\n\n    # Before anything else, make sure the required tools are installed.\n    try:\n        asp_system_utils.checkIfToolExists('build_reconstruction')\n        asp_system_utils.checkIfToolExists('export_reconstruction_to_vw')\n        asp_system_utils.checkIfToolExists('bundle_adjust')\n    except:\n        print('Did not detect required executables!  Check your PATH and ASP installation.')\n        return -1\n\n    try:\n\n        # Use parser that ignores unknown options\n        usage = \"usage: camera_solve [options] <output folder> <input images>\"\n        extra_info = (\"Don't forget that options to ASP's bundle_adjust tool (which is the \"\n                      \"final solution refinement step) can \"\n                      \"be passed in using the '--bundle-adjust-params' option. \"\n                      \"Significantly, the '--camera-positions' \"\n                      \"option is one of two ways to move the cameras to global \"\n                      \"coordinates (the other is via gcp files.\")\n        parser = optparse.OptionParser(usage=usage, epilog=extra_info)\n\n        parser.add_option(\"--suppress-output\", action=\"store_true\", default=False,\n          dest=\"suppressOutput\",  help=\"Suppress output of sub-calls.\")\n        parser.add_option(\"--overwrite\",       action=\"store_true\", default=False,\n          dest=\"overwrite\",  \n          help=\"Overwrite any partial computation results on disk.\")\n        parser.add_option(\"--reuse-theia-matches\", action=\"store_true\", default=False,\n          dest=\"use_theia_matches\",  \n          help=\"Pass the Theia IP matches to bundle adjustment instead \" + \\\n          \"of recreating them. This is ignored as it is the default.\")\n        \n        parser.add_option('--datum',  dest='datum', default='wgs84',\n          help='Datum to use.  Options: WGS_1984 (default), D_MOON (1,737,400 meters), D_MARS (3,396,190 meters), MOLA (3,396,000 meters), NAD83, WGS72, and NAD27. Also accepted: Earth (=WGS_1984), Mars (=D_MARS), Moon (=D_MOON)')\n                                         \n        parser.add_option('--calib-file',  dest='camera_param_paths', default=None,\n          help=('Path to an ASP compatible .tsai file containing camera model information.'+\n                 ' See the ASP documentation for details.  The position and pose information will be ignored.'+\n                 ' To use a unique file for each input image, pass a space-separated list of files'+\n                 ' surrounded by quotes.'))\n        parser.add_option('--gcp-file',  action=\"store_true\", default=False,\n          help='Obsolete option for specifying GCP. One or more GCP files will be ' + \\\n                'recognized and loaded if ending with .gcp, without this option.')\n        \n        # Solving for intrinsics is disabled until either Theia or our bundle adjustment tool supports it!\n        parser.add_option(\"--solve-intrinsics\", action=\"store_true\", default=False,\n          dest=\"solveIntrinsic\",  help=\"Use the optimizer to improve the intrinsic camera parameter estimates.\")\n\n        parser.add_option('--bundle-adjust-params',  dest='bundle_params', default=None,\n          help='Params string (in single quotes '') passed to the bundle_adjust tool')\n        parser.add_option('--theia-overrides',  dest='theia_overrides', default='',\n          help='Override any option in the auto-generated Theia flag file. Set as \"--option1=val1 --option2=val2 ...\". On Linux and Mac, the option --random_seed=1 is passed to Theia by default, to ensure reproducible results. This can be overridden with --theia-overrides \"--random_seed=0\", which seeds with current time, producing different results on each run.')\n\n        parser.add_option('--theia-flagfile',  dest='existing_theia_flagfile', default=None,\n          help='Path to a custom Theia flag file to fine-tune its operation. File paths specified in this file are ignored.')\n        \n        parser.add_option('--theia-retries', type=int, dest='theia_retries', default=3,\n          help='How many times to retry solving for cameras.')\n\n        parser.add_option('--threads', type=int, dest='threads', default=0,\n          help='Number of threads to use. If set to 0, will use 16 threads.')\n\n        # This call handles all the parallel_mapproject specific options.\n        (options, args) = parser.parse_args(argsIn)\n        \n        options.gcp_files = []\n        \n        # Collect all gcp files in args. They must end in .gcp or .GCP\n        args_no_gcp = [] # store here for the moment the non-gcp files\n        for arg in args:\n            if arg.lower().endswith('.gcp'):\n                options.gcp_files.append(arg)\n            else:\n                args_no_gcp.append(arg)\n        args = args_no_gcp[:]\n        args_no_gcp = None\n\n        # Remove continuation lines in the string (those are convenient\n        # for readability in docs)\n        if options.bundle_params is not None:\n            options.bundle_params = options.bundle_params.replace('\\\\', '')\n            options.bundle_params = options.bundle_params.replace('\\n', ' ')\n        \n        # Check the required positional arguments.\n        if len(args) < 1:\n            parser.print_help()\n            parser.error(\"Error: Missing output folder.\\n\" );\n        if len(args) < 3:\n            parser.print_help()\n            parser.error(\"Error: At least two input images are required.\\n\" );\n            \n        # Store the positional input parameters\n        options.output_folder = args[0]\n        options.input_images  = args[1:]\n\n        asp_system_utils.mkdir_p(options.output_folder)\n        \n        # If we don't have input camera params we have to solve for them.\n        if not options.camera_param_paths:\n            if not options.solveIntrinsic:\n                print ('Since no calib-file provided, setting --solve-intrinsics.')\n            options.solveIntrinsic = True\n            \n        else:\n            # Handle if a list of camera files were passed in.\n            options.camera_param_paths = options.camera_param_paths.split()\n\n            if (len(options.camera_param_paths) > 1):\n                # Num cameras must equal num images\n                if (len(options.camera_param_paths) != len(options.input_images)):\n                    print('Error: If multiple camera files are used, there must be one per input image.')\n                    return -1\n                    \n                # Don't use intrinsic solving with multiple models, it is too fragile.\n                if options.solveIntrinsic:\n                    print('Error: Solving for intrinsics is not supported with multiple camera models.')\n                    return -1\n            \n            # Otherwise rewrite a zero-distortion copy of the camera param file which Theia can read.\n            alt_param_path = os.path.join(options.output_folder, 'expanded_camera_configs.json')\n            options.theia_camera_param_path \\\n              = generate_theia_camera_file(options.input_images, options.camera_param_paths, \n                                           alt_param_path)\n        \n    except optparse.OptionError as msg:\n        raise Usage(msg)\n\n    startTime = time.time()\n\n    # Step 1: Call Theia's build_reconstruction tool.\n    # Theia's reconstruction tool sometimes fails for no apparent reason but\n    #  this does not happen often.  If it fails, try a few more times\n    #  to see if we can get it to succeed.\n    try_counter = 0\n    for i in range(0,options.theia_retries):\n        try:\n            build_reconstruction(options)\n            break\n        except: # Theia failed, but give it another shot.\n            if i == options.theia_retries-1:\n                print('Error: Theia failed to generate a camera reconstruction!')\n                return -1\n            else:\n                print('Retrying Theia solution...')\n    #guided_build_reconstruction(options)\n\n    print('Finished generating reconstruction using Theia')\n\n    # Step 2: Call an extra tool to export Theia's camera output.\n    (good_images, good_cameras) = export_cameras_to_vw(options)\n    \n    print('Finished extracting camera models')\n\n    # Step 3: Call ASP's bundle_adjust to adjust for lens distortion and \n    #          to move the cameras into global coordinates if possible.\n    run_bundle_adjust(options, good_images, good_cameras)\n\n    endTime = time.time()\n    print(\"Finished in \" + str(endTime - startTime) + \" seconds.\")\n\nif __name__ == \"__main__\":\n\n    sys.exit(main(sys.argv[1:]))\n"
  },
  {
    "path": "src/asp/Tools/corr_eval.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file corr_eval.cc\n\n// Evaluate the quality of produced correlation using several metrics.\n// See CorrEval.h and this tool's manual for more info.\n\n#include <asp/Core/Macros.h>\n#include <asp/Core/AspProgramOptions.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/GdalUtils.h>\n\n#include <vw/Stereo/PreFilter.h>\n#include <vw/Stereo/CorrEval.h>\n#include <vw/FileIO/FileUtils.h>\n\nnamespace po = boost::program_options;\nnamespace fs = boost::filesystem;\n\nstruct Options : vw::GdalWriteOptions {\n  std::string left_image, right_image, disparity, output_prefix, metric;\n  vw::Vector2i kernel_size;\n  bool round_to_int;\n  int prefilter_mode, sample_rate;\n  float prefilter_kernel_width;\n};\n\n// Create the selected prefilter class and apply the filter to an image.\n// Return an ImageRef, unlike prefilter_image() in VW, which returns\n// an in-memory image, which can be huge.\nnamespace vw {\nnamespace stereo {\ntemplate <class ImageT>\nImageViewRef<typename ImageT::pixel_type> \nprefilter_image_ref(ImageViewBase<ImageT> const& image,\n                    PrefilterModeType prefilter_mode,\n                    float             prefilter_width) {\n  \n  if (prefilter_mode == PREFILTER_LOG){  // LOG\n    stereo::LaplacianOfGaussian prefilter(prefilter_width);\n    return prefilter.filter(image);\n  }\n  if (prefilter_mode == PREFILTER_MEANSUB){  // Subtracted mean\n    stereo::SubtractedMean prefilter(prefilter_width);\n    return prefilter.filter(image);\n  }\n  //Default: PREFILTER_NONE\n  stereo::NullOperation prefilter;\n  return prefilter.filter(image);\n}\n}}\n\nvoid handle_arguments(int argc, char *argv[], Options& opt) {\n  \n  po::options_description general_options(\"\");\n  general_options.add_options()\n    (\"kernel-size\", po::value(&opt.kernel_size)->default_value(vw::Vector2i(21, 21),\"21 21\"),\n     \"The dimensions of image patches. These must be positive odd numbers.\")\n    (\"metric\", po::value(&opt.metric)->default_value(\"ncc\"),\n     \"The metric to use to evaluate the quality of correlation. Options: ncc, stddev.\")\n    (\"prefilter-mode\", po::value(&opt.prefilter_mode)->default_value(0),\n     \"Prefilter mode. This is the same prefilter as in stereo correlation with \"\n     \"the asp_bm method. Options: 0 (none), 1 (subtracted mean), 2 (LoG).\")\n    (\"prefilter-kernel-width\", po::value(&opt.prefilter_kernel_width)->default_value(1.5),\n     \"The diameter of the Gaussian convolution kernel \"\n     \"for prefilter modes 1 and 2. A value of 1.5 works \"\n     \"well for LoG and 25-30 is suggested for the subtracted mean.\")\n    (\"sample-rate\", po::value(&opt.sample_rate)->default_value(1),\n     \"Compute the quality image only at one out of this many rows and columns, for speed. \"\n     \"The output image size does not change. To shrink it, (say by 2x), run \"\n     \"gdal_translate -r average -outsize 50% 50% in.tif out.tif.\")\n    (\"round-to-int\", po::bool_switch(&opt.round_to_int)->default_value(false),\n     \"Round the disparity to integer and skip interpolation when finding the right image patches. This make the program faster by a factor of about 2, without changing significantly the output image.\");\n\n  general_options.add(vw::GdalWriteOptionsDescription(opt));\n  \n  po::options_description positional(\"\");\n  positional.add_options()\n    (\"left-image\", po::value(&opt.left_image))\n    (\"right-image\", po::value(&opt.right_image))\n    (\"disparity\", po::value(&opt.disparity))\n    (\"output-prefix\", po::value(&opt.output_prefix));\n\n  po::positional_options_description positional_desc;\n  positional_desc.add(\"left-image\", 1);\n  positional_desc.add(\"right-image\", 1);\n  positional_desc.add(\"disparity\", 1);\n  positional_desc.add(\"output-prefix\", 1);\n  \n  std::string usage(\"[options] <L.tif> <R.tif> <Disp.tif> <output.tif>\");\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line(argc, argv, opt, general_options, general_options,\n                             positional, positional_desc, usage,\n                             allow_unregistered, unregistered);\n\n  if (!vm.count(\"left-image\")  || !vm.count(\"right-image\") ||\n      !vm.count(\"disparity\")   || !vm.count(\"output-prefix\"))\n    vw::vw_throw(vw::ArgumentErr() << \"Not all required arguments were specified.\\n\\n\"\n                 << usage << general_options);\n\n  if (opt.metric != \"ncc\" && opt.metric != \"stddev\") \n    vw::vw_throw(vw::ArgumentErr() << \"Invalid value provided for --metric.\\n\\n\"\n                 << usage << general_options);\n\n  if (opt.sample_rate < 1)\n    vw::vw_throw(vw::ArgumentErr() << \"The value of --sample-rate must be positive.\\n\"\n                 << usage << general_options);\n\n  vw::create_out_dir(opt.output_prefix);\n}\n\nint main(int argc, char *argv[]) {\n\n  using namespace vw;\n  \n  Options opt;\n  try {\n    handle_arguments(argc, argv, opt);\n\n    DiskImageView<float> left(opt.left_image);\n    DiskImageView<float> right(opt.right_image);\n    DiskImageView<PixelMask<vw::Vector2f>> disp(opt.disparity);\n\n    float left_nodata = -32768.0;\n    vw::read_nodata_val(opt.left_image, left_nodata); // this may not succeed\n    \n    float right_nodata = -32768.0;\n    vw::read_nodata_val(opt.right_image, right_nodata); // this may not succeed\n\n    vw_out() << \"Left and right image no-data values: \" << left_nodata << ' '\n             << right_nodata << \"\\n\";\n    \n    // Use 256x256 as the final output tile size. Process with bigger\n    // tiles (512) internally via saveWithTempBigBlocks, so the prefilter\n    // and NCC kernel have enough padding at tile boundaries.\n    opt.raster_tile_size = Vector2i(asp::ASPGlobalOptions::rfne_tile_size(), // 256\n                                    asp::ASPGlobalOptions::rfne_tile_size());\n    int bigBlockSize = 512;\n\n    ImageViewRef<PixelMask<float>> masked_left  = create_mask(left, left_nodata);\n    ImageViewRef<PixelMask<float>> masked_right = create_mask(right, right_nodata);\n\n    int m = opt.prefilter_mode; // to write less below\n    if (m > 0) {\n      masked_left = vw::stereo::prefilter_image_ref(masked_left,\n                                                vw::stereo::PrefilterModeType(m),\n                                                opt.prefilter_kernel_width);\n      masked_right = vw::stereo::prefilter_image_ref(masked_right,\n                                                vw::stereo::PrefilterModeType(m),\n                                                opt.prefilter_kernel_width);\n    }\n    \n    vw::cartography::GeoReference left_georef;\n    bool has_left_georef = read_georeference(left_georef, opt.left_image);\n    bool has_nodata      = true;\n    std::string output_image = opt.output_prefix + \"-\" + opt.metric + \".tif\";\n    vw_out() << \"Writing: \" << output_image << \"\\n\";\n    asp::saveWithTempBigBlocks\n      (bigBlockSize, output_image,\n       apply_mask(vw::stereo::corr_eval(masked_left, masked_right,\n                                        disp, opt.kernel_size, opt.metric,\n                                        opt.sample_rate, opt.round_to_int,\n                                        opt.prefilter_mode,\n                                        opt.prefilter_kernel_width),\n                  left_nodata),\n       has_left_georef, left_georef,\n       has_nodata, left_nodata, opt,\n       TerminalProgressCallback(\"asp\", \"\\t--> Correlation quality:\"));\n    \n  } ASP_STANDARD_CATCHES;\n  \n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/coverage_fraction.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n/// \\file coverage_fraction.cc\n///\n/// This tool should provide the best estimate of how much coverage a stereo\n/// call provided of the theoretically possible coverage.  Currently it is \n/// based off of the percentage of the left input image.\n\n#include <asp/Core/PointUtils.h>\n#include <asp/Core/Macros.h>\n#include <asp/Core/AspProgramOptions.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/PointUtils.h>\n\n#include <vw/Core/StringUtils.h>\n#include <vw/Cartography/GeoReferenceUtils.h>\n#include <vw/FileIO/DiskImageUtils.h>\n#include <vw/Image/BlockImageOperator.h>\n#include <vw/Image/Filter.h>\n\n#include <limits>\n\nusing namespace vw;\nusing namespace vw::cartography;\nnamespace po = boost::program_options;\nnamespace fs = boost::filesystem;\n\n/// Compute the error norm from a point cloud image file.\n/// - This is a simpler version of the function in point2dem.cc\ntemplate<int num_ch>\nImageViewRef<double> error_norm(std::string const& pc_file){\n\n  // Read the error channels from the point cloud, and take the norm\n\n  const int beg_ech = 3; // errors start at this channel\n  const int num_ech = num_ch - beg_ech; // number of error channels\n\n  typedef Vector<double, num_ch > PixelInT;\n  typedef Vector<double, num_ech> PixelErrT;\n  vw::ImageViewRef<PixelInT> I = vw::DiskImageView<PixelInT>(pc_file);\n\n  ImageViewRef<PixelErrT> error_channels =\n    select_channels<num_ech, num_ch, double>(I, beg_ech);\n\n  return per_pixel_filter(error_channels, asp::VectorNorm<PixelErrT>());\n}\n\n\nclass Options : public vw::GdalWriteOptions {\npublic:\n  std::string input_prefix;\n  float error_cutoff;\n};\n\nvoid handle_arguments( int argc, char *argv[], Options& opt ) {\n\n  po::options_description general_options(\"General Options\");\n  general_options.add_options()\n    (\"error-cutoff\", po::value(&opt.error_cutoff)->default_value(0));\n\n  po::options_description positional(\"\");\n  positional.add_options()\n    (\"input-prefix\", po::value<std::string>(), \"Input prefix\");\n\n  po::positional_options_description positional_desc;\n  positional_desc.add(\"input-prefix\", -1);\n\n  std::string usage(\"[options] <input-prefix>\");\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line( argc, argv, opt, general_options, general_options,\n                             positional, positional_desc, usage,\n                             allow_unregistered, unregistered );\n\n  if (vm.count(\"input-prefix\") == 0)\n    vw_throw( ArgumentErr() << \"Missing input prefix.\\n\" << usage << general_options );\n  opt.input_prefix = vm[\"input-prefix\"].as<std::string>();\n\n}\n\n/// Count the number of pixels above a threshold on a per-block basis.\nclass ValidPixelCounterFunctor {\n  \n  double m_error_threshold;\n  uint64 m_masked_count;\n  uint64 m_invalid_count;\n  Mutex  m_mutex;\n  \npublic:\n  \n  ValidPixelCounterFunctor(double threshold)\n    : m_error_threshold(threshold), m_masked_count(0), m_invalid_count(0) {}\n\n  uint64 get_masked_count () const {return m_masked_count; }\n  uint64 get_invalid_count() const {return m_invalid_count;}\n\n  template <class T>\n  void operator()(ImageView<T> const& image, BBox2i const& bbox) {\n    // Count the pixels where the value is zero or >= the threshold.\n    uint64 local_invalid_count = 0;\n    uint64 local_masked_count  = 0;\n    for (std::int64_t r=0; r<bbox.height(); ++r) {\n      for (std::int64_t c=0; c<bbox.width(); ++c) {\n        typename ImageView<T>::pixel_type value = image(c,r);\n        if (value < 0.0) { // These pixels are outside the left mask.\n          ++local_masked_count;\n          continue;\n        }\n        if ((value == 0) || (value >= m_error_threshold)) {\n          ++local_invalid_count; // Bad triangulation\n        }\n      }\n    }\n    // Safely add to the shared totals.\n    m_mutex.lock();\n    m_masked_count  += local_masked_count;\n    m_invalid_count += local_invalid_count;\n    m_mutex.unlock();\n  }\n};\n\n\n//-----------------------------------------------------------------------------------\n\nint main( int argc, char *argv[] ) {\n\n  Options opt;\n  try {\n    handle_arguments( argc, argv, opt );\n\n    // Find the two required input files\n    std::string lmask_file = opt.input_prefix + \"-lMask.tif\";\n    std::string pc_file    = opt.input_prefix + \"-PC.tif\";\n\n    if (!boost::filesystem::exists(lmask_file)) {\n      vw_out() << \"Required left mask file not found: \"\n               << lmask_file << std::endl;\n      return 0;\n    }\n    if (!boost::filesystem::exists(pc_file)) {\n      vw_out() << \"Required point cloud file not found: \"\n               << pc_file << std::endl;\n      return 0;\n    }\n\n    // Each thread will process a block of this tile size.\n    std::int64_t tile_size = asp::ASPGlobalOptions::tri_tile_size();\n\n\n    // Compute the error norm from the PC file, and apply a mask to it copied from the lmask file.\n    // - Zero error values are a flag for a bad pixel, left over from stereo_tri.\n    // - Values outside the left mask are set to a flag value of -1, they are not counted\n    //   in the computations.\n    std::int64_t num_pc_channels = get_num_channels(pc_file);\n    ImageViewRef<double> masked_error_image;\n    switch(num_pc_channels) {\n      case 4:\n        masked_error_image = \n          apply_mask(copy_mask(error_norm<4>(pc_file), \n                              create_mask(DiskImageView<uint8>(lmask_file))), -1.0);\n        break;\n      case 6:\n        masked_error_image = \n          apply_mask(copy_mask(error_norm<6>(pc_file), \n                              create_mask(DiskImageView<uint8>(lmask_file))), -1.0);\n        break;\n      default:\n        vw_out() << \"Error: The point cloud file must have 4 or 6 channels!\\n\";\n      return 0;\n    };\n\n    // Use BlockImageOperator to count invalid pixels in parallel threads.\n    ValidPixelCounterFunctor functor(opt.error_cutoff);\n\n    //write_image(\"debug.tif\", masked_error_image);\n\n    const Vector2i block_size(tile_size, tile_size);\n    block_op_cache(masked_error_image, functor, block_size);\n\n    std::int64_t num_masked  = functor.get_masked_count();\n    std::int64_t num_invalid = functor.get_invalid_count();\n    std::int64_t num_rows    = masked_error_image.rows();\n    std::int64_t num_cols    = masked_error_image.cols();\n    std::int64_t num_pixels  = num_rows * num_cols;\n    std::int64_t num_unmasked_pixels = num_pixels - num_masked;\n    std::int64_t num_valid   = num_unmasked_pixels - num_invalid;\n\n    double percent_invalid = static_cast<double>(num_invalid) / static_cast<double>(num_unmasked_pixels);\n\n    std::cout << \"Total number of pixels:     \" << num_pixels      << std::endl;\n    std::cout << \"Number of valid pixels:     \" << num_valid       << std::endl;\n    std::cout << \"Percentage of valid pixels: \" << 1.0-percent_invalid << std::endl;\n\n  } ASP_STANDARD_CATCHES;\n\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/dem2gcp.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// \\file dem2gcp.cc\n// See the documentation on readthedocs.\n\n#include <asp/Core/Macros.h>\n#include <asp/Core/AspProgramOptions.h>\n#include <asp/Core/AspLog.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/ImageUtils.h>\n#include <asp/Core/FileUtils.h>\n#include <asp/Core/IpMatchingAlgs.h>\n#include <asp/Sessions/CameraUtils.h>\n#include <asp/Sessions/StereoSession.h>\n#include <asp/Sessions/StereoSessionFactory.h>\n#include <asp/Core/GCP.h>\n\n#include <vw/Core/Stopwatch.h>\n#include <vw/Camera/CameraModel.h>\n#include <vw/Camera/PinholeModel.h>\n#include <vw/BundleAdjustment/ControlNetworkLoader.h>\n#include <vw/Math/RandomSet.h>\n#include <vw/Image/Filter.h>\n#include <vw/Cartography/GeoReferenceBaseUtils.h>\n#include <vw/FileIO/FileUtils.h>\n\n#include <ogr_spatialref.h>\n#include <algorithm>\n#include <atomic>\n#include <omp.h>\n\nnamespace po = boost::program_options;\nnamespace fs = boost::filesystem;\n\ntypedef vw::PixelMask<vw::Vector2f> DpixT;\n\nnamespace asp {\n\n// Given a pixel (x, y), and a length l, enumerate all the pixels\n// on the boundary of the square of side length 2*l centered at (x, y).\nvoid enumerate_boundary_pixels(int x, int y, int l, std::vector<vw::Vector2> & pixels) {\n  pixels.clear();\n  for (int i = -l; i <= l; i++) {\n    pixels.push_back(vw::Vector2(x-l, y+i));\n    pixels.push_back(vw::Vector2(x+l, y+i));\n    pixels.push_back(vw::Vector2(x+i, y-l));\n    pixels.push_back(vw::Vector2(x+i, y+l));\n  }\n}\n\n// Invalidate disparity whose norm is more than this\nclass FilterDisp: public vw::ReturnFixedType<DpixT> {\npublic:\n\n  FilterDisp(double max_disp): m_max_disp(max_disp) {}\n  \n  DpixT operator()(DpixT const& disp) const {\n    if (is_valid(disp) && vw::math::norm_2(disp.child()) > m_max_disp) {\n      // Invalidate the disparity\n      DpixT invalid_disp = disp;\n      invalid_disp.invalidate();\n      return invalid_disp;\n    }\n    return disp;\n  }\n  double m_max_disp;\n};\n\n// Find the interpolated disparity value at a given pixel. If not valid, look in\n// a small neighborhood. That should not be overused. \nDpixT find_disparity(vw::ImageViewRef<DpixT> disparity,\n                     vw::ImageViewRef<DpixT> interp_disp,\n                     double x, double y, int max_l) {\n  if (x < 0 || y < 0 || x >= disparity.cols() || y >= disparity.rows())\n    return DpixT();\n\n  // Try to find the interpolated disparity\n  DpixT idisp = interp_disp(x, y);\n  \n  if (is_valid(idisp))\n    return idisp;\n  \n  // Otherwise try without interpolation. This casts x and y to integers.\n  if (is_valid(disparity(x, y)))\n    return disparity(x, y);  \n\n  // Otherwise search in the neighborhood. The default value of the neighborhood\n  // is 0. This is likely a desperate measure when the disparity has very few\n  // good values.\n  for (int l = 1; l <= max_l; l++) {\n\n    // Will keep the pixel closest to the center\n    double max_dist = std::numeric_limits<double>::max();\n    vw::Vector2 best_pix;\n    bool found = false;\n\n    std::vector<vw::Vector2> pixels;\n    enumerate_boundary_pixels(int(x), int(y), l, pixels);\n    \n    for (int i = 0; i < (int)pixels.size(); i++) {\n      int px = pixels[i].x(), py = pixels[i].y();\n      if (px < 0 || py < 0 || px >= disparity.cols() || py >= disparity.rows())\n        continue;\n      if (!is_valid(disparity(px, py)))\n        continue;\n      double dist = norm_2(vw::Vector2(px-x, py-y));\n      if (dist >= max_dist)\n        continue;\n      max_dist = dist;\n      best_pix = vw::Vector2(px, py);\n      found = true;\n    } // end loop over pixels on the boundary of the square of side length 2*l\n    \n    if (found)\n      return disparity(best_pix.x(), best_pix.y());\n\n  } // end loop over ever-growing squares\n  \n  // Give up\n  return DpixT();\n}\n\nvoid genWriteGcp(vw::cartography::GeoReference const& ref_dem_georef,\n                 vw::ba::ControlNetwork const& cnet,\n                 vw::ImageViewRef<DpixT> const& disparity,\n                 vw::ImageViewRef<vw::PixelMask<double>> const& interp_ref_dem,\n                 vw::cartography::GeoReference const& warped_dem_georef,\n                 std::vector<std::string> const& image_files,\n                 double gcp_sigma, int search_len,\n                 int max_num_gcp, int num_threads,\n                 vw::ImageViewRef<vw::PixelMask<float>> const& gcp_sigma_image,\n                 vw::cartography::GeoReference          const& gcp_sigma_image_georef,\n                 std::string const& gcpFile) {\n\n  int num_pts = cnet.size();\n\n  // Form the interpolated disparity\n  DpixT nodata_pix;\n  nodata_pix.invalidate();\n  vw::ImageViewRef<DpixT> interp_disp\n    = interpolate(disparity, vw::BilinearInterpolation(),\n                  vw::ValueEdgeExtension<DpixT>(nodata_pix));\n\n  bool have_gcp_sigma_image = (gcp_sigma_image.cols() > 0 &&\n                               gcp_sigma_image.rows() > 0);\n\n  // Use per-thread local vectors to avoid locking\n  int actual_threads = num_threads;\n  if (actual_threads <= 0)\n    actual_threads = vw::vw_settings().default_num_threads();\n  vw::vw_out() << \"Producing GCP using \" << actual_threads << \" threads.\\n\";\n\n  // Store (original_index, Gcp) pairs per thread for deterministic output\n  typedef std::pair<int, Gcp> IndexedGcp;\n  std::vector<std::vector<IndexedGcp>> thread_gcp(actual_threads);\n\n  // Atomic counter for progress reporting\n  std::atomic<int> progress_count(0);\n  int report_interval = std::max(num_pts / 100, 1);\n\n  vw::TerminalProgressCallback tpc(\"asp\", \"Producing GCP --> \");\n  tpc.report_progress(0);\n\n  #pragma omp parallel for num_threads(actual_threads) schedule(dynamic, 1000)\n  for (int ipt = 0; ipt < num_pts; ipt++) {\n\n    int tid = omp_get_thread_num();\n\n    // Report progress from thread 0\n    int count = progress_count.fetch_add(1);\n    if (tid == 0 && count % report_interval == 0)\n      tpc.report_progress(double(count) / std::max(num_pts, 1));\n\n    vw::ba::ControlPoint const& cp = cnet[ipt]; // alias\n\n    // Find the pixel in the warped DEM\n    vw::Vector3 xyz = cnet[ipt].position();\n    vw::Vector3 llh;\n    llh = warped_dem_georef.datum().cartesian_to_geodetic(xyz);\n    vw::Vector2 dem_pix = warped_dem_georef.lonlat_to_pixel(vw::Vector2(llh.x(), llh.y()));\n\n    // Find the corresponding pixel in the reference DEM\n    DpixT disp = find_disparity(disparity, interp_disp,\n                                dem_pix.x(), dem_pix.y(), search_len);\n    if (!is_valid(disp))\n      continue;\n    vw::Vector2 ref_pix = dem_pix + disp.child();\n\n    // Find height at the reference pixel\n    double ref_height = interp_ref_dem(ref_pix.x(), ref_pix.y());\n    if (!vw::is_valid(ref_height))\n      continue;\n\n    // Find lon-lat-height at the reference pixel\n    vw::Vector2 ref_lonlat = ref_dem_georef.pixel_to_lonlat(ref_pix);\n    vw::Vector3 ref_llh(ref_lonlat.x(), ref_lonlat.y(), ref_height);\n\n    // The case when the GCP sigma comes from a file\n    double local_gcp_sigma = gcp_sigma;\n    if (have_gcp_sigma_image) {\n      vw::PixelMask<float> img_gcp_sigma\n        = vw::cartography::closestPixelVal(gcp_sigma_image,\n                                           gcp_sigma_image_georef, xyz);\n\n      // Flag bad gcp_sigmas as outliers\n      if (!is_valid(img_gcp_sigma) || std::isnan(img_gcp_sigma.child()) ||\n          img_gcp_sigma.child() <= 0.0)\n        continue;\n\n      local_gcp_sigma = img_gcp_sigma.child();\n    }\n\n    // Set the GCP uncertainty for the ground point (in meters). The pixel sigmas\n    // from the input match file will be ignored and replaced with (1, 1) when the\n    // GCP file is written.\n    vw::Vector3 sigma(local_gcp_sigma, local_gcp_sigma, local_gcp_sigma);\n\n    Gcp gcp;\n    gcp.cp = cp;\n    gcp.llh = ref_llh;\n    gcp.sigma = sigma;\n    thread_gcp[tid].push_back(IndexedGcp(ipt, gcp));\n  }\n  tpc.report_finished();\n\n  // Merge per-thread results\n  std::vector<IndexedGcp> indexed_gcp;\n  for (int t = 0; t < actual_threads; t++) {\n    indexed_gcp.insert(indexed_gcp.end(),\n                       thread_gcp[t].begin(), thread_gcp[t].end());\n    std::vector<IndexedGcp>().swap(thread_gcp[t]);\n  }\n\n  // Sort by original cnet index for deterministic output\n  std::sort(indexed_gcp.begin(), indexed_gcp.end(),\n            [](IndexedGcp const& a, IndexedGcp const& b) {\n              return a.first < b.first;\n            });\n\n  // Extract the Gcp values\n  std::vector<Gcp> gcp_vec(indexed_gcp.size());\n  for (size_t i = 0; i < indexed_gcp.size(); i++)\n    gcp_vec[i] = indexed_gcp[i].second;\n  std::vector<IndexedGcp>().swap(indexed_gcp);\n\n  // See if to reduce the number of GCP\n  vw::vw_out() << \"Generated \" << gcp_vec.size() << \" GCP points.\\n\";\n  if (max_num_gcp > 0 && (int)gcp_vec.size() > max_num_gcp) {\n    vw::vw_out() << \"Reducing the number of GCP to \" << max_num_gcp << \".\\n\";\n    std::vector<int> indices;\n    vw::math::pick_random_indices_in_range(gcp_vec.size(), max_num_gcp, indices);\n    std::vector<Gcp> local_vec;\n    for (size_t i = 0; i < indices.size(); i++)\n      local_vec.push_back(gcp_vec[indices[i]]);\n    // Swap the two\n    gcp_vec.swap(local_vec);\n  }\n  \n  // Use pixel sigma of 1. TODO(oalexan1): Revisit.\n  bool ignore_pixel_sigma = true;\n  writeGcp(gcpFile, ref_dem_georef, gcp_vec, image_files, ignore_pixel_sigma);\n}\n\n// Put the variables below in a struct\nstruct Options: public vw::GdalWriteOptions {\n  std::string warped_dem_file, ref_dem_file, warped_to_ref_disp_file, left_img, right_img,\n    left_cam, right_cam,  match_file, out_gcp, gcp_sigma_image, image_list, camera_list,\n    match_files_prefix, clean_match_files_prefix;\n  int search_len, max_num_gcp, max_pairwise_matches;\n  double gcp_sigma, max_disp;\n};\n\nvoid handle_arguments(int argc, char *argv[], Options& opt) {\n\n  po::options_description general_options(\"\");\n  general_options.add_options()\n    (\"warped-dem\", po::value(&opt.warped_dem_file), \n     \"The DEM file produced by stereo, that may have warping due to unmodeled distortion.\")\n    (\"ref-dem\", po::value(&opt.ref_dem_file), \n     \"The reference DEM file, which is assumed to be accurate.\")\n    (\"warped-to-ref-disparity\", po::value(&opt.warped_to_ref_disp_file), \n     \"The stereo disparity from the warped DEM to the reference DEM (use the first band \"\n     \"of the hillshaded DEMs as inputs for the disparity).\")\n    (\"left-image\", po::value(&opt.left_img), \n     \"The left raw image that produced the warped DEM.\")\n    (\"right-image\", po::value(&opt.right_img), \n     \"The right raw image that produced the warped DEM.\")\n    (\"left-camera\", po::value(&opt.left_cam), \n     \"The left camera that was used for stereo.\")\n    (\"right-camera\", po::value(&opt.right_cam), \n     \"The right camera that was used for stereo.\")\n    (\"match-file\", \n     po::value(&opt.match_file), \n     \"A match file between the left and right raw images with many dense matches.\")\n    (\"gcp-sigma\", po::value(&opt.gcp_sigma)->default_value(1.0),\n     \"The sigma to use for the GCP points. A smaller value will give to GCP more weight. \"\n     \"This should be a fraction of the image ground sample distance. Measured in meters. \"\n     \"See also --gcp-sigma-image.\")\n    (\"max-num-gcp\", po::value(&opt.max_num_gcp)->default_value(-1),\n     \"The maximum number of GCP to write. If negative, all GCP are written. If more than \"\n     \"this number, a random subset will be picked. The same subset will be selected if the \"\n     \"program is called again.\")\n    (\"output-gcp\", po::value(&opt.out_gcp), \n     \"The produced GCP file with ground coordinates from the reference DEM.\")\n    (\"max-disp\", po::value(&opt.max_disp)->default_value(-1), \n     \"If positive, flag a disparity whose norm is larger than this as erroneous and do not \"\n     \"use it for creating GCP. Measured in pixels. See also option --max-gcp-reproj-err in \"\n     \"bundle_adjust.\")\n    (\"gcp-sigma-image\", po::value(&opt.gcp_sigma_image)->default_value(\"\"),\n     \"Given a georeferenced image with float values, for each GCP find its location in \"\n     \"this image and closest pixel value. Let the GCP sigma be that value. Skip GCP that \"\n     \"result in values that are are no-data or are not positive. This overrides --gcp-sigma.\")\n    (\"search-len\", po::value(&opt.search_len)->default_value(0), \n     \"How many DEM pixels to search around a given interest point to find a valid DEM \"\n     \"disparity (pick the closest). This may help with a spotty disparity but should not \"\n     \"be overused.\")\n    (\"image-list\", po::value(&opt.image_list)->default_value(\"\"),\n     \"A file containing the list of images. This can be used with more than two images.\")\n    (\"camera-list\", po::value(&opt.camera_list)->default_value(\"\"),\n      \"A file containing the list of cameras. This can be used with more than two images.\")\n    (\"match-files-prefix\",  po::value(&opt.match_files_prefix)->default_value(\"\"),\n     \"Use the match files with this prefix.\")\n    (\"clean-match-files-prefix\",  po::value(&opt.clean_match_files_prefix)->default_value(\"\"),\n     \"Use as input *-clean.match files with this prefix.\")\n    (\"max-pairwise-matches\", po::value(&opt.max_pairwise_matches)->default_value(-1),\n     \"If positive, reduce the number of matches to load from any given match file to at \"\n     \"most this value.\")\n    (\"help,h\", \"Display this help message\");\n\n  general_options.add(vw::GdalWriteOptionsDescription(opt));\n\n  po::options_description positional(\"\");\n  po::positional_options_description positional_desc;\n\n  std::string usage(\"[options]\");\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line(argc, argv, opt, general_options, general_options,\n                            positional, positional_desc, usage,\n                            allow_unregistered, unregistered);\n    \n  // Create the output directory\n  vw::create_out_dir(opt.out_gcp);\n\n  //  Only one of --match-file, --match-files-prefix, or\n  //  --clean-match-files-prefix can be used\n  int num = int(!opt.match_file.empty()) +\n            int(!opt.match_files_prefix.empty()) +\n            int(!opt.clean_match_files_prefix.empty());\n  if (num != 1)\n    vw::vw_throw(vw::ArgumentErr()\n                 << \"Exactly one of --match-file, --match-files-prefix, or \"\n                 << \"--clean-match-files-prefix must be specified.\\n\");\n  \n  //  Can have either left and right image, or image-list\n  if ((!opt.left_img.empty() || !opt.right_img.empty()) &&\n      !opt.image_list.empty())\n    vw::vw_throw(vw::ArgumentErr()\n                 << \"Either specify both --left-image and --right-image, \"\n                 << \"or --image-list, but not both options.\\n\");\n  // Same for left and right camera\n  if ((!opt.left_cam.empty() || !opt.right_cam.empty()) &&\n      !opt.camera_list.empty())\n    vw::vw_throw(vw::ArgumentErr()\n                 << \"Either specify both --left-camera and --right-camera, \"\n                 << \"or --camera-list, but not both options.\\n\");\n    \n  // Turn on logging to file\n  asp::log_to_file(argc, argv, \"\", opt.out_gcp);\n}\n\n// Check that two georefs have the same projection. Compare PROJ4 strings and\n// dynamic datum properties. WKT strings can differ in naming conventions while\n// representing the same projection (e.g., \"Moon (2015)\" vs \"D_MOON\"), so a\n// WKT mismatch alone is only a warning.\nvoid datumCheck(vw::cartography::GeoReference const& georef1,\n                vw::cartography::GeoReference const& georef2) {\n  std::string wkt1 = georef1.get_wkt();\n  std::string wkt2 = georef2.get_wkt();\n  OGRSpatialReference srs1, srs2;\n  srs1.SetFromUserInput(wkt1.c_str());\n  srs2.SetFromUserInput(wkt2.c_str());\n  // Export to PROJ4 for a parameter-level comparison\n  char *proj4_1 = nullptr, *proj4_2 = nullptr;\n  srs1.exportToProj4(&proj4_1);\n  srs2.exportToProj4(&proj4_2);\n  std::string p1 = (proj4_1 ? proj4_1 : \"\");\n  std::string p2 = (proj4_2 ? proj4_2 : \"\");\n  CPLFree(proj4_1);\n  CPLFree(proj4_2);\n  // Check if either uses a dynamic datum (epoch-based CRS)\n  bool dynamic_mismatch = (srs1.IsDynamic() != srs2.IsDynamic());\n  if (p1 != p2 || dynamic_mismatch)\n    vw::vw_throw(vw::ArgumentErr()\n                << \"The warped DEM and reference DEM have different projections. \"\n                << \"Use gdalwarp -t_srs to convert them to the same projection.\\n\"\n                << \"Warped DEM PROJ4: \" << p1 << \"\\n\"\n                << \"Ref DEM PROJ4:    \" << p2 << \"\\n\"\n                << \"Warped DEM WKT: \" << wkt1 << \"\\n\"\n                << \"Ref DEM WKT:    \" << wkt2 << \"\\n\");\n  // Warn if PROJ4 and dynamic datum agree but WKT strings differ\n  if (wkt1 != wkt2)\n    vw::vw_out(vw::WarningMessage)\n      << \"Found projections with same PROJ4 string and dynamic datum \"\n      << \"properties but different WKT. Continuing.\\n\"\n      << \"PROJ4: \" << p1 << \"\\n\"\n      << \"First WKT:  \" << wkt1 << \"\\n\"\n      << \"Second WKT: \" << wkt2 << \"\\n\";\n}\n\nint run_dem2gcp(int argc, char * argv[]) {\n  \n  Options opt;\n  \n  // Parse and validate the input options  \n  handle_arguments(argc, argv, opt);\n  \n  // Prepare the images  \n  std::vector<std::string> image_files;\n  // See if to read from image list\n  if (!opt.image_list.empty()) {\n    asp::read_list(opt.image_list, image_files);\n  } else {\n    image_files.push_back(opt.left_img);\n    image_files.push_back(opt.right_img);\n  }\n  // Prepare camera lists\n  std::vector<std::string> camera_files;\n  // See if to read from camera list\n  if (!opt.camera_list.empty()) {\n    asp::read_list(opt.camera_list, camera_files);\n  } else {\n    camera_files.push_back(opt.left_cam);\n    camera_files.push_back(opt.right_cam);\n  }\n\n  // Load the cameras  \n  std::string stereo_session, out_prefix;\n  std::vector<vw::CamPtr> camera_models;\n  bool approximate_pinhole_intrinsics = false, single_threaded_cameras = false;\n  asp::load_cameras(image_files, camera_files, out_prefix, opt,\n                      approximate_pinhole_intrinsics,\n                      // Outputs\n                      stereo_session, single_threaded_cameras, camera_models);\n    \n  // Load the DEM and georef, and prepare for interpolation  \n  vw::cartography::GeoReference warped_dem_georef;\n  vw::ImageViewRef<vw::PixelMask<double>> interp_warped_dem;\n  asp::create_interp_dem(opt.warped_dem_file, warped_dem_georef, interp_warped_dem);\n\n  // Load the reference DEM\n  vw::cartography::GeoReference ref_dem_georef;\n  vw::ImageViewRef<vw::PixelMask<double>> interp_ref_dem;\n  asp::create_interp_dem(opt.ref_dem_file, ref_dem_georef, interp_ref_dem);\n  \n  // Must ensure these have the same projection\n  datumCheck(warped_dem_georef, ref_dem_georef);\n\n  // Must have the same grid size, which is based on the transform\n  auto warped_trans = warped_dem_georef.transform();\n  auto ref_trans = ref_dem_georef.transform();\n  \n  double tol = 1e-6;\n  if (std::abs(warped_trans(0, 0) - ref_trans(0, 0)) > tol ||\n      std::abs(warped_trans(1, 1) - ref_trans(1, 1)) > tol)\n    vw::vw_throw( vw::ArgumentErr() \n                << \"The warped DEM and reference DEM have different grid sizes. Use \"\n                << \"gdalwarp -r cubicspline to resample the warped DEM.\\n\");\n  \n  // Load the disparity\n  vw::ImageViewRef<DpixT> disparity = vw::DiskImageView<DpixT>(opt.warped_to_ref_disp_file);\n  \n  if (opt.max_disp > 0) {\n    vw::vw_out() << \"Filtering the disparity to remove values larger than \"\n                 << opt.max_disp << \".\\n\";\n    disparity = vw::per_pixel_filter(disparity, FilterDisp(opt.max_disp));\n  }\n  \n  // Warped size must equal disparity size, otherwise there is a mistake\n  if (interp_warped_dem.cols() != disparity.cols() || \n      interp_warped_dem.rows() != disparity.rows())\n    vw::vw_throw( vw::ArgumentErr() \n                << \"Error: The warped DEM and disparity sizes do not match.\\n\" );\n  \n  // If to use a gcp_sigma image\n  bool have_gcp_sigma_image = (!opt.gcp_sigma_image.empty());\n  vw::ImageViewRef<vw::PixelMask<float>> gcp_sigma_image;\n  float gcp_sigma_image_nodata = -std::numeric_limits<float>::max();\n  vw::cartography::GeoReference gcp_sigma_image_georef;\n  if (have_gcp_sigma_image) {\n    vw::cartography::readGeorefImage(opt.gcp_sigma_image,\n      gcp_sigma_image_nodata, gcp_sigma_image_georef, gcp_sigma_image);\n    vw::vw_out() << \"Using GCP sigma image: \" << opt.gcp_sigma_image << \"\\n\";\n  }\n\n  // Load the control network. This can be slow so left for last. Consider the\n  // case of one match files or a prefix pointing to many match files.  \n  vw::ba::ControlNetwork cnet(\"asp\");\n  bool triangulate_control_points = true;\n  std::map<std::pair<int, int>, std::string> match_files;\n  if (!opt.match_file.empty()) {\n    match_files[std::make_pair(0, 1)] = opt.match_file;\n  } else {\n    // Load all match files with no constraints\n    int overlap_limit = image_files.size();\n    bool match_first_to_last = true;\n    asp::findMatchFiles(overlap_limit, match_first_to_last,\n                        image_files, opt.clean_match_files_prefix,\n                        opt.match_files_prefix, out_prefix,\n                        asp::stereo_settings().matches_as_txt,\n                        // Outputs\n                        match_files);\n  }\n  \n  int min_matches = 0; // Not used as we are just loading\n  double min_triangulation_angle = 1e-10;\n  double forced_triangulation_distance = -1.0;\n  bool success = vw::ba::build_control_network(triangulate_control_points,\n                                               cnet, camera_models,\n                                               image_files,\n                                               match_files,\n                                               min_matches,\n                                               min_triangulation_angle,\n                                               forced_triangulation_distance,\n                                               opt.max_pairwise_matches,\n                                               stereo_settings().matches_as_txt);\n  if (!success)\n    vw::vw_throw(vw::ArgumentErr() << \"Failed to load the interest points.\\n\");\n  \n  genWriteGcp(ref_dem_georef, cnet, disparity,\n              interp_ref_dem, warped_dem_georef, image_files,\n              opt.gcp_sigma, opt.search_len, opt.max_num_gcp,\n              opt.num_threads,\n              gcp_sigma_image, gcp_sigma_image_georef,\n              opt.out_gcp);\n  \n  return 0;\n}\n\n} // end namespace asp\n\nint main(int argc, char * argv[]) {\n  try {\n    asp::run_dem2gcp(argc, argv);    \n  } ASP_STANDARD_CATCHES;\n   \n  return 0;      \n\n}\n"
  },
  {
    "path": "src/asp/Tools/dem_geoid.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file dem_geoid.cc\n///\n\n/// Fortran function declaration from the \"geoid\" mini external library\n/// compiled using Binary Builder.\n/// TODO: Must put this into a C++ header file in that library, and include\n/// that header file here. Must also make sure that header file gets installed.\nextern \"C\" {\n  void egm2008_call_interp_(int* nriw2, int* nciw2, double* grid,\n                            double* flon, double* flat, double* val);\n}\n\n#include <asp/Core/Macros.h>\n#include <asp/Core/AspProgramOptions.h>\n#include <asp/Core/AspLog.h>\n\n#include <vw/Image/ImageChannels.h>\n#include <vw/Image/Interpolation.h>\n#include <vw/Cartography/GeoReferenceResourceGDAL.h>\n#include <vw/FileIO/FileUtils.h>\n\n#include <boost/filesystem.hpp>\n#include <boost/dll.hpp>\nnamespace po = boost::program_options;\nnamespace fs = boost::filesystem;\n\nusing namespace vw;\nusing namespace vw::cartography;\n\n/// Image view which adds or subtracts the ellipsoid/geoid difference\n///  from elevations in a DEM image.\ntemplate <class ImageT>\nclass DemGeoidView : public ImageViewBase<DemGeoidView<ImageT>> {\n  ImageT m_img;    // The DEM\n  GeoReference const& m_georef; // alias\n  bool m_is_egm2008;\n  std::vector<double> const& m_egm2008_grid; // Special variable storing EGM2008 data\n  ImageViewRef<PixelMask<double>> const& m_geoid; // Interpolation view of the geoid\n  GeoReference const& m_geoid_georef; // alias\n  bool     m_reverse_adjustment; // If true, convert from geoid to ellipsoid heights\n  double   m_correction;\n  double   m_nodata_val;\n\npublic:\n\n  typedef double pixel_type;\n  typedef double result_type;\n  typedef ProceduralPixelAccessor<DemGeoidView> pixel_accessor;\n\n  DemGeoidView(ImageT const& img, GeoReference const& georef,\n               bool is_egm2008, std::vector<double> const& egm2008_grid,\n               ImageViewRef<PixelMask<double>> const& geoid,\n               GeoReference const& geoid_georef, bool reverse_adjustment,\n               double correction, double nodata_val):\n    m_img(img), m_georef(georef),\n    m_is_egm2008(is_egm2008), m_egm2008_grid(egm2008_grid),\n    m_geoid(geoid), m_geoid_georef(geoid_georef),\n    m_reverse_adjustment(reverse_adjustment),\n    m_correction(correction),\n    m_nodata_val(nodata_val) {}\n\n  inline int32 cols  () const { return m_img.cols(); }\n  inline int32 rows  () const { return m_img.rows(); }\n  inline int32 planes() const { return 1; }\n\n  inline pixel_accessor origin() const { return pixel_accessor(*this); }\n\n  inline result_type operator()(size_t col, size_t row, size_t p=0) const {\n\n    if (m_img(col, row, p) == m_nodata_val)\n      return m_nodata_val; // Skip invalid pixels\n\n    Vector2 lonlat = m_georef.pixel_to_lonlat(Vector2(col, row));\n\n    // For testing (see the link to the reference web form belows).\n    //lonlat[0] = -121;   lonlat[1] = 37;   // mainland US\n    //lonlat[0] = -152;   lonlat[1] = 66;   // Alaska\n    //lonlat[0] = -155.5; lonlat[1] = 19.5; // Hawaii\n\n    // Need to carefully wrap lonlat to the [0, 360) x [-90, 90) box.\n    // Note that lon = 25, lat = 91 is the same as lon = 180 + 25, lat = 89\n    // as we go through the North pole and show up on the other side.\n    // TODO: Does the GeoRef class handle this now?\n    while (std::abs(lonlat[1]) > 90.0) {\n      if (lonlat[1] > 90.0) {\n        lonlat[1] = 180.0 - lonlat[1];\n        lonlat[0] += 180.0;\n      }\n      if (lonlat[1] < -90.0) {\n        lonlat[1] = -180.0 - lonlat[1];\n        lonlat[0] += 180.0;\n      }\n    }\n    while (lonlat[0] <   0.0)  lonlat[0] += 360.0;\n    while (lonlat[0] >= 360.0) lonlat[0] -= 360.0;\n\n    result_type geoid_height = 0.0;\n    if (m_is_egm2008) {\n      int nr = m_geoid.rows(), nc = m_geoid.cols();\n      // Call fortran function from \"geoid\" mini external library\n      egm2008_call_interp_(&nr, &nc, (double*)&m_egm2008_grid[0],\n                           &lonlat[0], &lonlat[1], &geoid_height);\n    } else {\n      // Use our own interpolation into the geoid image\n      Vector2  pix = m_geoid_georef.lonlat_to_pixel(lonlat);\n      PixelMask<double> interp_val = m_geoid(pix[0], pix[1]);\n      if (!is_valid(interp_val))\n        return m_nodata_val;\n      geoid_height = interp_val.child();\n    }\n\n    geoid_height += m_correction;\n\n    result_type height_above_ellipsoid = m_img(col, row, p);\n\n    // Compute height above the geoid\n    // - See the note in the main program about the formula below\n    if (m_reverse_adjustment)\n      return height_above_ellipsoid + geoid_height;\n    else\n      return height_above_ellipsoid - geoid_height;\n  }\n\n  /// \\cond INTERNAL\n  typedef DemGeoidView<typename ImageT::prerasterize_type> prerasterize_type;\n  inline prerasterize_type prerasterize(BBox2i const& bbox) const {\n    return prerasterize_type(m_img.prerasterize(bbox), m_georef,\n                              m_is_egm2008, m_egm2008_grid,\n                              m_geoid, m_geoid_georef, m_reverse_adjustment,\n                              m_correction, m_nodata_val);\n  }\n  template <class DestT> inline void rasterize(DestT const& dest, BBox2i const& bbox) const {\n    vw::rasterize(prerasterize(bbox), dest, bbox);\n  }\n  /// \\endcond\n};\n\n// Helper function which uses the class above.\ntemplate <class ImageT>\nDemGeoidView<ImageT>\ndem_geoid(ImageViewBase<ImageT> const& img, GeoReference const& georef,\n           bool is_egm2008, std::vector<double> & egm2008_grid,\n           ImageViewRef<PixelMask<double>> const& geoid,\n           GeoReference const& geoid_georef, bool reverse_adjustment,\n           double correction, double nodata_val) {\n  return DemGeoidView<ImageT>(img.impl(), georef,\n                               is_egm2008, egm2008_grid,\n                               geoid, geoid_georef,\n                               reverse_adjustment, correction, nodata_val);\n}\n\n/// Parameters for this tool\nstruct Options : vw::GdalWriteOptions {\n  std::string dem_path, geoid, geoid_path, out_prefix;\n  double nodata_value;\n  bool   use_double; // Otherwise use float\n  bool   reverse_adjustment;\n};\n\n// Get the absolute path to the geoid. It is normally in the share/geoids\n// directory of the ASP distribution, but in dev mode the directory\n// having the geoids can be set via the ASP_GEOID_DIR env var.\nstd::string get_geoid_full_path(std::string const& prog_name, std::string const& geoid_file) {\n\n  // Convert to absolute path first, to avoid issues when prog_name\n  // is simply \"dem_geoid\" with no path, when subsequent operations on\n  // it will fail.\n  char * geoid_dir_ptr = getenv(\"ASP_GEOID_DIR\");\n  fs::path geoid_dir;\n  if (geoid_dir_ptr != NULL && std::string(geoid_dir_ptr) != \"\")\n    geoid_dir = fs::path(std::string(geoid_dir_ptr));\n  else\n    geoid_dir = boost::dll::program_location().parent_path().parent_path() / fs::path(\"share\")\n      / fs::path(\"geoids\");\n\n  fs::path geoid_path = geoid_dir / fs::path(geoid_file);\n  if (!fs::exists(geoid_path))\n    vw_throw(ArgumentErr() << \"Could not find the geoid: \" << geoid_path.string()\n              << \". Set export ASP_GEOID_DIR=/path/to/share/geoids\\n\");\n\n  return geoid_path.string();\n}\n\nvoid handle_arguments(int argc, char *argv[], Options& opt) {\n\n  po::options_description general_options(\"\");\n  general_options.add_options()\n    (\"nodata_value\", po::value(&opt.nodata_value)->default_value(-32768),\n     \"The value of no-data pixels, unless specified in the DEM.\")\n    (\"geoid\", po::value(&opt.geoid),\n     \"Specify the geoid to use for the given datum. For WGS84 use EGM96 or EGM2008. \"\n     \"Default: EGM96. For Mars use MOLA or leave blank. For NAD83 use NAVD88 or leave \"\n     \"blank. When not specified it will be auto-detected.\")\n    (\"geoid-path\", po::value(&opt.geoid_path),\n     \"Specify the path to a custom GeoTiff file having the geoid correction. \"\n      \"Values from this file will be subtracted from the DEM values in order \"\n      \"to convert from ellipsoid to geoid heights.\")\n    (\"output-prefix,o\", po::value(&opt.out_prefix), \"Specify the output prefix.\")\n    (\"double\", po::bool_switch(&opt.use_double)->default_value(false)->implicit_value(true),\n     \"Output using double precision (64 bit) instead of float (32 bit).\")\n    (\"reverse-adjustment\",\n       po::bool_switch(&opt.reverse_adjustment)->default_value(false)->implicit_value(true),\n     \"Go from DEM relative to the geoid to DEM relative to the ellipsoid.\");\n\n  general_options.add(vw::GdalWriteOptionsDescription(opt));\n\n  po::options_description positional(\"\");\n  positional.add_options()\n    (\"dem\", po::value(&opt.dem_path), \"Explicitly specify the DEM.\");\n\n  po::positional_options_description positional_desc;\n  positional_desc.add(\"dem\", 1);\n\n  std::string usage(\"[options] <dem>\");\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line(argc, argv, opt, general_options, general_options,\n                             positional, positional_desc, usage,\n                             allow_unregistered, unregistered);\n\n  if (opt.dem_path.empty())\n    vw_throw(ArgumentErr() << \"Requires <dem> in order to proceed.\\n\\n\"\n              << usage << general_options);\n\n  boost::to_lower(opt.geoid);\n  \n  if (!opt.geoid.empty() && !opt.geoid_path.empty())\n    vw_throw(ArgumentErr() << \"Cannot specify both --geoid and --geoid-path.\\n\");\n\n  if (opt.out_prefix.empty())\n    opt.out_prefix = fs::path(opt.dem_path).stem().string();\n\n  // Create the output directory\n  vw::create_out_dir(opt.out_prefix);\n\n  // Turn on logging to file\n  asp::log_to_file(argc, argv, \"\", opt.out_prefix);\n}\n\n/// Given a DEM, with each height value relative to the datum\n/// ellipsoid, convert the heights to be relative to the geoid.\n\n// From: http://earth-info.nga.mil/GandG/wgs84/gravitymod/egm96/intpthel.html\n// Geoid heights can be used to convert between orthometric\n// heights (approximately mean sea level) and ellipsoid heights\n// according to the formula:\n// h   =   H   +   N\n// where,\n// h = WGS 84 Ellipsoid height\n// H = Orthometric height\n// N = EGM96 Geoid height (relative to the ellipsoid)\n// Therefore: H = h - N.\n\n// We support four geoids: EGM96, EGM2008, NAVD88 (Earth) and MOLA MEGDR (Mars).\n// Online tools for verification:\n// EGM96:  http://earth-info.nga.mil/GandG/wgs84/gravitymod/egm96/intpt.html\n// NAVD88: http://www.ngs.noaa.gov/cgi-bin/GEOID_STUFF/geoid09_prompt1.prl\n\n// EGM2008: http://earth-info.nga.mil/GandG/wgs84/gravitymod/egm2008/egm08_wgs84.html\n// MOLA MEGDR: http://geo.pds.nasa.gov/missions/mgs/megdr.html\n\n// Examples: At lat = 37 and lon = -121 (Basalt Hills, CA), we have\n// EGM96  geoid height = -32.69 m\n// NAVD88 geoid height = -32.931 m\n// At lat = 66 and lon = -152 (Alaska):\n// EGM96 geoid height  = 9.51 m\n// NAVD88 geoid height = 8.255 m\n// At lat = 19.5 and lon = -155.5 (Hawaii)\n// NAVD88 geoid height: 27.353\n// EGM96 geoid height:  26.58\n\n// For EGM2008, we use the tabulated values at 2.5', and the provided routine\n// for interpolation (interp_2p5min.f), as described at\n// http://earth-info.nga.mil/GandG/wgs84/gravitymod/egm2008/egm08_wgs84.html\n// We store the tabulated values as a tif file, and modified\n// the routine to be callable from this executable.\n\nint main(int argc, char *argv[]) {\n\n  Options opt;\n  try {\n    std::string prog_name = argv[0];\n    handle_arguments(argc, argv, opt);\n\n    bool reverse_adjustment = opt.reverse_adjustment;\n\n    // Read the DEM to adjust\n    DiskImageResourceGDAL dem_rsrc(opt.dem_path);\n    double dem_nodata_val = opt.nodata_value;\n    if (dem_rsrc.has_nodata_read()) {\n      dem_nodata_val = dem_rsrc.nodata_read();\n      vw_out() << \"\\tFound input nodata value for \" << opt.dem_path << \": \"\n               << dem_nodata_val << \"\\n\";\n    }\n    DiskImageView<double> dem_img(dem_rsrc);\n    GeoReference dem_georef;\n    bool has_georef = read_georeference(dem_georef, dem_rsrc);\n    if (!has_georef)\n      vw_throw(ArgumentErr() << \"Missing georeference for DEM: \" << opt.dem_path << \"\\n\");\n\n    // TODO: Improve this handling so it can read DEMs with relevant EPSG codes, etc.\n\n    // Find out the datum from the DEM. If we fail, we do an educated guess.\n    std::string datum_name = dem_georef.datum().name();\n    std::string lname      = boost::to_lower_copy(datum_name);\n    std::string geoid_file;\n    bool is_wgs84 = false, is_mola = false;\n    if (opt.geoid_path == \"\") {\n\n      if (lname == \"wgs_1984\" || lname == \"wgs 1984\" || lname == \"wgs1984\" ||\n          lname == \"wgs84\"    || lname == \"world geodetic system 1984\") {\n        is_wgs84 = true;\n      } else if (lname == \"north_american_datum_1983\") {\n        geoid_file = \"navd88.tif\";\n      } else if (lname == \"d_mars\") {\n        is_mola = true;\n      } else if (std::abs(dem_georef.datum().semi_major_axis() - 6378137.0) < 500.0) {\n        // Guess Earth\n        vw_out(WarningMessage) << \"Unknown datum: \" << datum_name \n          << \". Guessing: WGS_1984.\\n\";\n        is_wgs84 = true;\n      } else if (std::abs(dem_georef.datum().semi_major_axis() - 3396190.0) < 500.0) {\n        // Guess Mars\n        vw_out(WarningMessage) << \"Unknown datum: \" << datum_name << \". Guessing: D_MARS.\\n\";\n        is_mola = true;\n      } else if (opt.geoid_path == \"\") {\n        vw_throw(ArgumentErr() \n                << \"Cannot apply geoid adjustment to DEM relative to datum: \"\n                << datum_name << \"\\n\");\n      }\n    }\n    \n    // Ensure that the value of --geoid is compatible with the datum from the DEM.\n    // Only WGS_1984 datums can be used with EGM geoids, only the NAD83 datum\n    // can be used with NAVD88, and only MOLA can be used with Mars.\n    bool is_egm2008 = false;\n    if (opt.geoid_path == \"\") {\n      if (is_wgs84) {\n        if (opt.geoid == \"egm2008\") {\n          is_egm2008 = true;\n          geoid_file = \"egm2008.jp2\";\n        } else if (opt.geoid == \"egm96\" || opt.geoid == \"\")\n          geoid_file = \"egm96-5.jp2\"; // The default WGS84 geoid option\n        else\n          vw_throw(ArgumentErr() << \"The datum is WGS84. The only supported options for the geoid are EGM96 and EGM2008. Got instead: \" << opt.geoid << \".\\n\");\n      } else if (lname == \"north_american_datum_1983\") {\n        if (opt.geoid != \"\" && opt.geoid != \"navd88\")\n          vw_throw(ArgumentErr() << \"The datum is North_American_Datum_1983. \"\n                                  << \"Hence the value of the --geoid option must be either \"\n                                  << \"empty (auto-detected) or NAVD88. Got instead: \"\n                                  << opt.geoid << \".\\n\");\n      } else if (is_mola) {\n        if (opt.geoid != \"\" && opt.geoid != \"mola\")\n          vw_throw(ArgumentErr() << \"Detected a Mars DEM. In that case, the \"\n                                  << \"value of the --geoid option must be either empty \"\n                                  << \"(auto-detected) or MOLA. Got instead: \" << opt.geoid << \".\\n\");\n\n      } else if (opt.geoid != \"\")\n        vw_throw(ArgumentErr() << \"The geoid value: \" << opt.geoid\n                                << \" is applicable only for the WGS_1984 datum.\\n\");\n\n      if (is_mola)\n        geoid_file = \"mola_areoid.tif\";\n    }\n    \n    // Find where we keep the information for this geoid\n    if (opt.geoid_path == \"\")\n      geoid_file = get_geoid_full_path(prog_name, geoid_file);\n    else\n      geoid_file = opt.geoid_path;\n    vw_out() << \"Adjusting the DEM using the geoid correction: \" << geoid_file << \"\\n\";\n    \n    // These files usually go beyond [0, 360) in longitude, which can trigger\n    // a waring that is not helpful here.                                      \n    vw::cartography::silence_warning_for_non_normal_georef(geoid_file);\n\n    // Read the geoid containing the adjustments. Read it in memory\n    // entirely to dramatically speed up the computations.\n    double geoid_nodata_val = std::numeric_limits<float>::quiet_NaN();\n    DiskImageResourceGDAL geoid_rsrc(geoid_file);\n    if (geoid_rsrc.has_nodata_read())\n      geoid_nodata_val = geoid_rsrc.nodata_read();\n    ImageView<float> geoid_img = DiskImageView<float>(geoid_rsrc);\n    GeoReference geoid_georef;\n    bool has_geoid_georef = read_georeference(geoid_georef, geoid_rsrc);\n    if (!has_geoid_georef && !is_egm2008)\n      vw_throw(ArgumentErr() << \"Missing georeference for geoid correction file: \" \n               << geoid_file << \"\\n\");\n\n    if (is_wgs84 && !is_egm2008) {\n      // Convert the EGM96 int16 JPEG2000-encoded geoid to float.\n      double a =  0,\n             b =  65534, // TODO: What is this?\n             c = -108,\n             d =  86,\n             s = (d-c)/(b-a);\n      for (int col = 0; col < geoid_img.cols(); col++) {\n        for (int row = 0; row < geoid_img.rows(); row++) {\n          geoid_img(col, row) = s*(geoid_img(col, row) - a) + c;\n        }\n      }\n    }\n\n    // The EGM2008 case is special. Then, we don't do bicubic interpolation into\n    // geoid_img, rather, we invoke some Fortran routine, which gives more accurate results.\n    // And we scale the int16 JPEG2000-encoded geoid to float.\n    std::vector<double> egm2008_grid;\n    if (is_egm2008) {\n      double a  =  0,\n             b  =  65534, // TODO: What is this?\n             c  = -107,\n             d  =  86,\n             s  = (d-c)/(b-a);\n      int    nr = geoid_img.rows(),\n             nc = geoid_img.cols();\n      egm2008_grid.resize(nr*nc);\n      for (int col = 0; col < nc; col++) {\n        for (int row = 0; row < nr; row++) {\n          double val = geoid_img(col, row);\n          val = s*(val - a) + c;\n          egm2008_grid[row + col*nr] = val; // that is, egm2008_grid(row, col) = val;\n        }\n      }\n    }\n\n    // Need to apply an extra correction if the datum radius of the geoid is different\n    // than the datum radius of the DEM to correct. We do this only if the datum is\n    // a sphere, such on mars, as otherwise a uniform correction won't work.\n    double major_correction = 0.0;\n    double minor_correction = 0.0;\n    if (!is_egm2008) {\n      major_correction = geoid_georef.datum().semi_major_axis() - dem_georef.datum().semi_major_axis();\n      minor_correction = geoid_georef.datum().semi_minor_axis() - dem_georef.datum().semi_minor_axis();\n    }\n    \n    // The DEM and geoid correction are supposed to differ only in minor ways,\n    // such as a constant shift.\n    bool is_navd88 = (geoid_file.find(\"navd88.tif\") != std::string::npos);\n    if (major_correction != 0 || minor_correction != 0) {\n      double den = std::max(std::abs(major_correction),\n                            std::abs(minor_correction));\n      if ((std::abs(1.0 - minor_correction/den) > 1e-5 ||\n          std::abs(1.0 - major_correction/den) > 1e-5 ||\n          den > 1000.0) && !is_navd88) {\n        vw_throw(ArgumentErr() \n           << \"The input DEM and geoid datums are incompatible. \"\n           << \"Cannot apply geoid adjustment.\\n\"\n           << std::setprecision(17)\n           << \"DEM major semi-axis: \" << dem_georef.datum().semi_major_axis() << \"\\n\"\n           << \"DEM minor semi-axis: \" << dem_georef.datum().semi_minor_axis() << \"\\n\"\n           << \"Geoid major semi-axis: \" << geoid_georef.datum().semi_major_axis() << \"\\n\"\n           << \"Geoid minor semi-axis: \" << geoid_georef.datum().semi_minor_axis() << \"\\n\");\n      }\n      vw_out(WarningMessage)\n        << \"Will compensate for the fact that the input DEM and geoid correction datums \"\n        << \"axis lengths differ.\\n\";\n    }\n\n    // Put an interpolation and mask wrapper around the input geoid file\n    ImageViewRef<PixelMask<double>> geoid\n      = interpolate(create_mask(pixel_cast<double>(geoid_img),\n                                geoid_nodata_val),\n                    BicubicInterpolation(), ZeroEdgeExtension());\n\n    // Set up conversion image view\n    ImageViewRef<double> adj_dem = dem_geoid(dem_img, dem_georef,\n                                             is_egm2008, egm2008_grid,\n                                             geoid, geoid_georef,\n                                             reverse_adjustment, major_correction, dem_nodata_val);\n\n    std::string adj_dem_file = opt.out_prefix + \"-adj.tif\";\n    vw_out() << \"Writing adjusted DEM: \" << adj_dem_file << \"\\n\";\n\n    std::map<std::string, std::string> keywords;\n    if (opt.geoid_path == \"\")\n      keywords[\"GEOID\"] = opt.geoid;\n    else\n      keywords[\"GEOID\"] = opt.geoid_path;\n\n    auto tpc = TerminalProgressCallback(\"asp\", \"\\t--> Applying DEM adjustment: \");\n    bool have_georef = true, have_nodata = true;\n\n    if (opt.use_double) {\n      // Output as double\n      block_write_gdal_image(adj_dem_file, adj_dem,\n                             have_georef, dem_georef,\n                             have_nodata, dem_nodata_val,\n                             opt, tpc, keywords);\n    } else {\n      // Output as float\n      ImageViewRef<float> adj_dem_float = channel_cast<float>(adj_dem);\n      block_write_gdal_image(adj_dem_file, adj_dem_float,\n                             have_georef, dem_georef,\n                             have_nodata, dem_nodata_val,\n                             opt, tpc, keywords);\n    }\n\n  } ASP_STANDARD_CATCHES;\n\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/dem_mosaic.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file dem_mosaic.cc\n///\n\n// A program to merge several DEMs into one. The inputs are always read as float.\n// The processing happens in double precision.\n\n#include <asp/Core/Macros.h>\n#include <asp/Core/GdalUtils.h>\n#include <asp/Core/DemMosaic.h>\n#include <asp/Core/DemMosaicOptions.h>\n#include <asp/Core/DemMosaicParse.h>\n#include <asp/Core/FileUtils.h>\n\n#include <vw/FileIO/DiskImageManager.h>\n#include <vw/Image/InpaintView.h>\n#include <vw/Image/RoundAndClamp.h>\n#include <vw/Image/Filter.h>\n#include <vw/Cartography/GeoTransform.h>\n#include <vw/Image/NoDataAlg.h>\n#include <vw/FileIO/FileUtils.h>\n\n#include <cmath>\n#include <iostream>\n#include <fstream>\n#include <iomanip>\n#include <string>\n#include <vector>\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <unistd.h>\n#include <limits>\n#include <algorithm>\n\nnamespace asp {\n  \n// This is used for various tolerances\ndouble g_tol = 1e-6;\n\nstd::string tile_suffix(asp::DemMosaicOptions const& opt) {\n  std::string ans;\n  if (opt.first) ans     = \"-first\";\n  if (opt.last) ans      = \"-last\";\n  if (opt.min) ans       = \"-min\";\n  if (opt.max) ans       = \"-max\";\n  if (opt.block_max) ans = \"-block-max\";\n  if (opt.mean) ans      = \"-mean\";\n  if (opt.stddev) ans    = \"-stddev\";\n  if (opt.median) ans    = \"-median\";\n  if (opt.nmad) ans      = \"-nmad\";\n  if (opt.count) ans     = \"-count\";\n  if (opt.save_index_map)       ans += \"-index-map\";\n  if (opt.save_dem_weight >= 0) ans += \"-weight-dem-index-\" + vw::stringify(opt.save_dem_weight);\n\n  return ans;\n}\n\n// Initializations needed for various modes\nvoid initializeTileVector(int num_images,\n                          vw::BBox2i const& bbox, asp::DemMosaicOptions const& opt,\n                          // Outputs\n                          vw::ImageView<double> & tile,\n                          std::vector<vw::ImageView<double>>& tile_vec,\n                          std::vector<vw::ImageView<double>>& weight_vec) {\n\n  // Wipe the output vectors\n  tile_vec.clear();\n  weight_vec.clear();\n\n  if (opt.median || opt.nmad) // Store each input separately\n    tile_vec.reserve(num_images);\n\n  if (opt.stddev) { // Need one working image\n    tile_vec.push_back(vw::ImageView<double>(bbox.width(), bbox.height()));\n    // Each pixel starts at zero, nodata is handled later\n    vw::fill(tile_vec[0], 0.0);\n    vw::fill(tile,        0.0);\n  }\n\n  if (opt.priority_blending_len > 0) { // Store each weight separately\n    tile_vec.reserve  (num_images);\n    weight_vec.reserve(num_images);\n  }\n\n  return;\n}\n\n// Process block max: find DEM with max pixel sum and use it. Print the sum of\n// pixels per block.\nvoid processBlockMax(double out_nodata_value, vw::BBox2i const& bbox,\n                     std::vector<vw::ImageView<double>> const& tile_vec,\n                     std::vector<std::string> const& dem_vec,\n                     vw::ImageView<double> & tile) {\n\n  vw::fill(tile, out_nodata_value);\n  int num_tiles = tile_vec.size();\n  if (tile_vec.size() != dem_vec.size())\n    vw::vw_throw(vw::ArgumentErr() << \"Book-keeping error.\\n\");\n  std::vector<double> tile_sum(num_tiles, 0);\n  for (int i = 0; i < num_tiles; i++) {\n    for (int c = 0; c < tile_vec[i].cols(); c++) {\n      for (int r = 0; r < tile_vec[i].rows(); r++) {\n        if (tile_vec[i](c, r) != out_nodata_value)\n          tile_sum[i] += tile_vec[i](c, r);\n      }\n    }\n    // The whole purpose of --block-max is to print the sum of\n    // pixels for each mapprojected image/DEM when doing SfS.\n    // The documentation has a longer explanation.\n    vw::vw_out() << \"\\n\" << bbox << \" \" << dem_vec[i]\n             << \" pixel sum: \" << tile_sum[i] << \"\\n\";\n  }\n  int max_index = std::distance(tile_sum.begin(),\n                                std::max_element(tile_sum.begin(), tile_sum.end()));\n  if (max_index >= 0 && max_index < num_tiles)\n    tile = copy(tile_vec[max_index]);\n}\n\n// Use the weights created so far only to burn holes in\n// the DEMs where we don't want blending. Then we will have to\n// recreate the weights. That because the current weights have\n// been interpolated from a different grid, and won't handle\n// erosion and blur well.\nvoid priorityBlend(double out_nodata_value,\n                   double bias,\n                   double weights_blur_sigma,\n                   double weights_exp,\n                   bool no_border_blend,\n                   int save_dem_weight,\n                   std::vector<int> const& clip2dem_index,\n                   vw::cartography::GeoReference const& out_georef,\n                   vw::BBox2i const& bbox,\n                   // Outputs\n                   std::vector<vw::ImageView<double>> & tile_vec,\n                   std::vector<vw::ImageView<double>> & weight_vec,\n                   vw::ImageView<double> & tile,\n                   vw::ImageView<double> & weights,\n                   vw::ImageView<double> & saved_weight) {\n\n  if (tile_vec.size() != weight_vec.size() || tile_vec.size() != clip2dem_index.size())\n    vw::vw_throw(vw::ArgumentErr() << \"There must be as many dem tiles as weight tiles.\\n\");\n\n  // Set image values to nodata where weight is <= 0\n  for (size_t clip_iter = 0; clip_iter < weight_vec.size(); clip_iter++)\n    asp::setNoDataByWeight(out_nodata_value, tile_vec[clip_iter], weight_vec[clip_iter]);\n\n  // Update the weights given the created nodata regions\n  for (size_t clip_iter = 0; clip_iter < weight_vec.size(); clip_iter++)\n    weight_vec[clip_iter] = grassfire(notnodata(tile_vec[clip_iter], out_nodata_value),\n                                      no_border_blend);\n\n  // Don't allow the weights to become big, for uniqueness across tiles\n  for (size_t clip_iter = 0; clip_iter < weight_vec.size(); clip_iter++)\n    asp::clampWeights(bias, weight_vec[clip_iter]);\n\n  // Blur the weights\n  for (size_t clip_iter = 0; clip_iter < weight_vec.size(); clip_iter++)\n    asp::blurWeights(weight_vec[clip_iter], weights_blur_sigma);\n\n  // Raise to power\n  if (weights_exp != 1) {\n    for (size_t clip_iter = 0; clip_iter < weight_vec.size(); clip_iter++)\n      asp::raiseToPower(weights_exp, weight_vec[clip_iter]);\n  }\n\n  // Now we are ready for blending\n  vw::fill(tile, out_nodata_value);\n  vw::fill(weights, 0.0);\n\n  if (save_dem_weight >= 0)\n    vw::fill(saved_weight, 0.0);\n\n  // Accumulate weighted contributions from each DEM clip\n  for (size_t clip_iter = 0; clip_iter < weight_vec.size(); clip_iter++)\n    accumWeightedTiles(out_nodata_value, save_dem_weight, clip2dem_index[clip_iter],\n                       tile_vec[clip_iter], weight_vec[clip_iter],\n                       tile, weights, saved_weight);\n\n  // Compute the weighted average\n  computeWeightedAverage(save_dem_weight, tile, weights, saved_weight);\n\n  return;\n}\n\n// Process a DEM tile pixel by pixel. Take into account the various\n// blending options. \nvoid processDemTile(asp::DemMosaicOptions const& opt,\n                    vw::BBox2i const& bbox,\n                    vw::Vector2 const& in_box_min,\n                    vw::ImageView<asp::DoubleGrayA> const& dem,\n                    vw::ImageViewRef<asp::DoubleGrayA> const& interp_dem,\n                    vw::cartography::GeoTransform const& geotrans,\n                    std::vector<vw::ImageView<double>>& tile_vec,\n                    bool noblend,\n                    bool use_priority_blend,\n                    int dem_iter,\n                    double tol,\n                    // Outputs\n                    vw::ImageView<double>& tile,\n                    vw::ImageView<double>& weights,\n                    vw::ImageView<double>& weight_modifier,\n                    vw::ImageView<double>& saved_weight,\n                    vw::ImageView<double>& index_map) {\n\n  // Loop through each output pixel\n  for (int c = 0; c < bbox.width(); c++) {\n    for (int r = 0; r < bbox.height(); r++) {\n\n      // Coordinates in the output mosaic\n      vw::Vector2 out_pix(c + bbox.min().x(), r + bbox.min().y());\n      // Coordinate in this input DEM\n      vw::Vector2 in_pix = geotrans.reverse(out_pix);\n\n      // Input DEM pixel relative to loaded bbox\n      double x = in_pix[0] - in_box_min.x();\n      double y = in_pix[1] - in_box_min.y();\n\n      // Interpolate\n      asp::DoubleGrayA pval = asp::interpDem(x, y, dem, interp_dem, tol, opt.propagate_nodata);\n\n      // Separate the value and alpha for this pixel.\n      double val = pval.v();\n      double wt = pval.a();\n\n      if (use_priority_blend) {\n        // The priority blending, pixels from earlier DEMs at this location\n        // are used unmodified unless close to that DEM boundary.\n        wt = std::min(weight_modifier(c, r), wt);\n\n        // Now ensure that the current DEM values will be used\n        // unmodified unless close to the boundary for subsequent\n        // DEMs. The weight w2 will be 0 well inside the DEM, and\n        // increase towards the boundary.\n        double wt2 = wt;\n        wt2 = std::max(0.0, opt.priority_blending_len - wt2);\n        weight_modifier(c, r) = std::min(weight_modifier(c, r), wt2);\n      }\n\n      // If point is in-bounds and nodata, make sure this point stays \n      //  at nodata even if other DEMs contain it.\n      if (wt == 0 && opt.propagate_nodata) {\n        tile(c, r) = 0;\n        weights(c, r) = -1.0;\n      }\n\n      if (wt <= 0.0)\n        continue; // No need to continue if the weight is zero\n\n      // Check if the current output value at this pixel is nodata\n      bool is_nodata = ((tile(c, r) == opt.out_nodata_value));\n\n      // Initialize the tile if not done already.\n      // Init to zero not needed with some types.\n      if (!opt.stddev && !opt.median && !opt.nmad && !opt.min && !opt.max &&\n          !use_priority_blend) {\n        if (is_nodata) {\n          tile(c, r) = 0;\n          weights(c, r) = 0.0;\n        }\n      }\n\n      // Update the output value according to the commanded mode\n      if ((opt.first && is_nodata)                      ||\n           opt.last                                     ||\n           (opt.min && (val < tile(c, r) || is_nodata)) ||\n           (opt.max && (val > tile(c, r) || is_nodata)) ||\n           opt.median || opt.nmad ||\n           use_priority_blend || opt.block_max) {\n        // Conditions where we replace the current value\n        tile(c, r) = val;\n        weights(c, r) = wt;\n\n        // In these cases, the saved weight will be 1 or 0, since either\n        // a given DEM gives it all, or nothing at all.\n        if (opt.save_dem_weight >= 0 && (opt.first || opt.last ||\n                                         opt.min   || opt.max))\n          saved_weight(c, r) = (opt.save_dem_weight == dem_iter);\n\n        // In these cases, the saved weight will be 1 or 0, since either\n        // a given DEM gives it all, or nothing at all.\n        if (opt.save_index_map && (opt.first || opt.last ||\n                                   opt.min   || opt.max))\n          index_map(c, r) = dem_iter;\n\n      } else if (opt.mean) {\n        // For the mean, accumulate the value\n        tile(c, r) += val;\n        weights(c, r)++;\n        if (opt.save_dem_weight == dem_iter)\n          saved_weight(c, r) = 1;\n\n      } else if (opt.count) {\n        // Increment the count\n        tile(c, r)++;\n        weights(c, r) += wt;\n      } else if (opt.stddev) {\n        // Standard deviation: use Welford's online algorithm for numerical\n        // stability. Accumulate: count in weights, running mean in tile_vec[0],\n        // sum of squared deviations in tile. Final stddev computed later by\n        // finishStdDevCalc().\n        weights(c, r) += 1.0;\n        double currMean = tile_vec[0](c,r);\n        double delta = val - currMean;\n        currMean += delta / weights(c, r);\n        double sumSqDev = tile(c, r) + delta*(val - currMean);\n        tile(c, r) = sumSqDev;\n        tile_vec[0](c,r) = currMean;\n      } else if (!noblend) {\n        // For blending do the weighted average\n        tile(c, r) += wt*val;\n        weights(c, r) += wt;\n        if (opt.save_dem_weight == dem_iter)\n          saved_weight(c, r) = wt;\n      }\n\n    } // End col loop\n  } // End row loop\n\n  return;\n}\n\nvoid processMedianOrNmad(vw::BBox2i const& bbox,\n                         double out_nodata_value,\n                         bool is_median,\n                         bool save_index_map,\n                         std::vector<int> const& clip2dem_index,\n                         std::vector<vw::ImageView<double>> const& tile_vec,\n                         vw::ImageView<double> & tile,\n                         vw::ImageView<double> & index_map) {\n\n  // Init output pixels to nodata\n  vw::fill(tile, out_nodata_value);\n  std::vector<double> vals, vals_all(tile_vec.size());\n  // Iterate through all pixels\n  for (int c = 0; c < bbox.width(); c++) {\n    for (int r = 0; r < bbox.height(); r++) {\n      // Compute the median for this pixel\n      vals.clear();\n      for (int i = 0; i < (int)tile_vec.size(); i++) {\n        vw::ImageView<double> const& tile_ref = tile_vec[i];\n        double this_val = tile_ref(c, r);\n        vals_all[i] = this_val; // Record the original order.\n        if (this_val == out_nodata_value)\n          continue;\n        vals.push_back(this_val);\n      }\n\n      if (vals.empty())\n        continue;\n      if (is_median)\n        tile(c, r) = vw::math::destructive_median(vals);\n      else\n        tile(c, r) = vw::math::destructive_nmad(vals);\n\n      if (!save_index_map)\n        continue;\n\n      // Record the index of the image that is closest to the\n      // median value.  Note that the median can average two\n      // values, so the median value may not equal exactly any of\n      // the input values.\n      double min_dist = std::numeric_limits<double>::max();\n      for (size_t m = 0; m < vals_all.size(); m++) {\n        double dist = fabs(vals_all[m] - tile(c, r));\n        if (dist < min_dist) {\n          // Here we save the index not in the current array which\n          // is m, but in the full list of DEMs, some of which are\n          // likely skipped in this tile as they don't intersect\n          // it.\n          index_map(c, r) = clip2dem_index[m];\n          min_dist = dist;\n        }\n      }\n\n    }// End row loop\n  } // End col loop\n\n  return;\n}\n\n// Finish standard deviation calculation. At this point, tile contains sum of\n// squared deviations from mean, and weights contains the count of valid pixels\n// at each location.\nvoid finishStdDevCalc(double out_nodata_value,\n                      vw::ImageView<double> & tile,\n                      vw::ImageView<double> const& weights) {\n\n  for (int c = 0; c < tile.cols(); c++) {\n    for (int r = 0; r < tile.rows(); r++) {\n      if (weights(c, r) > 1.0)\n        tile(c, r) = sqrt(tile(c, r) / (weights(c, r) - 1.0));\n      else // Invalid pixel\n        tile(c, r) = out_nodata_value;\n    }\n  }\n}\n\n\n// Count valid pixels in tile and update global counter. Care to use a lock when\n// updating the global counter. Use int64 to not overflow for large images.\nvoid updateNumValidPixels(vw::ImageView<double> const& tile,\n                          double out_nodata_value,\n                          vw::BBox2i const& bbox,\n                          vw::BBox2i const& orig_box,\n                          std::int64_t & num_valid_pixels,\n                          vw::Mutex & count_mutex) {\n\n  std::int64_t num_valid_in_tile = 0;\n  for (int col = 0; col < tile.cols(); col++) {\n    for (int row = 0; row < tile.rows(); row++) {\n      vw::Vector2 pix = vw::Vector2(col, row) + bbox.min();\n      if (!orig_box.contains(pix))\n        continue; // in case the box got expanded, ignore the padding\n      if (tile(col, row) == out_nodata_value)\n        continue;\n      num_valid_in_tile++;\n    }\n  }\n  {\n    // Lock and update the total number of valid pixels\n    vw::Mutex::Lock lock(count_mutex);\n    num_valid_pixels += num_valid_in_tile;\n  }\n}\n\n// Check that all input DEMs have compatible datums with the output\n// Load and preprocess a single DEM for mosaicking. This includes cropping to the\n// region of interest, invalidating pixels by threshold, handling NaN values, filling\n// holes, and blurring if requested.\nvoid preprocessDem(int dem_iter,\n                   vw::BBox2i const& bbox,\n                   vw::BBox2i const& in_box,\n                   asp::DemMosaicOptions const& opt,\n                   vw::DiskImageManager<float> & imgMgr,\n                   std::vector<double> const& nodata_values,\n                   // Outputs\n                   vw::ImageView<asp::DoubleGrayA>& dem,\n                   double& nodata_value) {\n\n  // Load the DEM from disk and crop to region of interest. The DEM is 2-channel:\n  // first channel is elevation, second is alpha (used for weights later).\n  vw::ImageViewRef<double> disk_dem =\n    vw::pixel_cast<double>(imgMgr.get_handle(dem_iter, bbox));\n  dem = vw::crop(disk_dem, in_box);\n\n  // Determine the effective nodata value. If nodata_threshold is specified,\n  // all values <= threshold are invalidated and threshold becomes the nodata value.\n  nodata_value = nodata_values[dem_iter];\n  if (!std::isnan(opt.nodata_threshold)) {\n    nodata_value = opt.nodata_threshold;\n    asp::invalidateByThreshold(nodata_value, nodata_value, dem);\n  }\n\n  // NaN values get set to nodata. This is a bugfix for datasets with NaN.\n  asp::invalidateNaN(nodata_value, dem);\n\n  // Fill holes using grassfire algorithm. This happens on the expanded tile to\n  // ensure we catch holes partially outside the processing region.\n  if (opt.hole_fill_len > 0)\n    dem = vw::apply_mask(vw::fill_holes_grass(vw::create_mask(select_channel(dem, 0), \n                                                              nodata_value),\n                                              opt.hole_fill_len), nodata_value);\n\n  // Fill nodata based on search radius. Uses weighted interpolation from nearby\n  // valid pixels. Note: validation ensures this and hole_fill_len aren't both used.\n  if (opt.fill_search_radius > 0.0)\n    dem = vw::apply_mask(\n      fillNodataWithSearchRadius(vw::create_mask(select_channel(dem, 0),\n                                                  nodata_value),\n                                 opt.fill_search_radius, opt.fill_power,\n                                 opt.fill_percent, opt.fill_num_passes),\n      nodata_value);\n\n  // Blur the DEM if requested. First fill nodata slightly to avoid large holes\n  // around nodata regions when blurring (blurring can't handle nodata directly).\n  if (opt.dem_blur_sigma > 0.0) {\n    int kernel_size = vw::compute_kernel_size(opt.dem_blur_sigma);\n    dem = vw::apply_mask(gaussian_filter(fill_nodata_with_avg(\n                                           vw::create_mask(select_channel(dem, 0), \n                                                           nodata_value),\n                                           kernel_size), opt.dem_blur_sigma), nodata_value);\n  }\n\n  // Mark the image as not in use in the manager (but keep file open for performance)\n  imgMgr.release(dem_iter);\n}\n\n// Erode the DEM based on grassfire weights and recompute weights using centerline algorithm.\n// This is used for priority blending where weights follow the DEM centerline.\nvoid erodeCreateCenterlineWeights(vw::ImageView<asp::DoubleGrayA> const& dem,\n                                  double nodata_value, int erode_len, int bias,\n                                  // Outputs\n                                  vw::ImageView<double>& weights) {\n\n  // Create eroded DEM by invalidating pixels where grassfire weight <= erode_len\n  vw::ImageView<asp::DoubleGrayA> eroded_dem = copy(dem);\n  for (int col = 0; col < eroded_dem.cols(); col++) {\n    for (int row = 0; row < eroded_dem.rows(); row++) {\n      if (weights(col, row) <= erode_len)\n        eroded_dem(col, row) = asp::DoubleGrayA(nodata_value);\n    }\n  }\n\n  // Compute centerline weights on the eroded DEM\n  vw::ImageView<vw::PixelMask<double>> mask_img =\n    create_mask_less_or_equal(select_channel(eroded_dem, 0), nodata_value);\n  asp::centerlineWeightsWithHoles(mask_img, weights, bias);\n}\n\n// Compute weights for a DEM in the mosaic. This applies a pipeline of operations:\n// grassfire distance, erosion/centerline, clamping, blurring, power function.\n// Different steps are skipped depending on options (priority blend, centerline weights).\nvoid computeDemWeights(vw::ImageView<asp::DoubleGrayA> const& dem,\n                       double nodata_value,\n                       asp::DemMosaicOptions const& opt,\n                       int bias,\n                       bool use_priority_blend,\n                       int dem_iter,\n                       vw::BBox2i const& in_box,\n                       // Outputs\n                       vw::ImageView<double>& weights) {\n\n  // Compute linear weights using grassfire distance transform\n  weights = grassfire(notnodata(select_channel(dem, 0), nodata_value),\n                      opt.no_border_blend);\n\n  // Erode based on grassfire weights, and then overwrite the grassfire\n  // weights with centerline weights\n  if (opt.use_centerline_weights)\n    erodeCreateCenterlineWeights(dem, nodata_value, opt.erode_len, bias, weights);\n\n  // Clamp the weights to ensure the results agree across tiles. For\n  // priority blending length, we'll do this process later, as the bbox is\n  // obtained differently in that case. With centerline weights, that is\n  // handled before 1D weights are multiplied to get the 2D weights.\n  if (!use_priority_blend && !opt.use_centerline_weights)\n    asp::clampWeights(bias, weights);\n\n  // Erode. We already did that if centerline weights are used.\n  if (!opt.use_centerline_weights) {\n    int max_cutoff = max_pixel_value(weights);\n    int min_cutoff = opt.erode_len;\n    if (max_cutoff <= min_cutoff)\n      max_cutoff = min_cutoff + 1; // precaution\n    weights = clamp(weights - min_cutoff, 0.0, max_cutoff - min_cutoff);\n  }\n\n  // Blur the weights. If priority blending length is on, we'll do the blur later,\n  // after weights from different DEMs are combined.\n  if (opt.weights_blur_sigma > 0 && !use_priority_blend)\n    asp::blurWeights(weights, opt.weights_blur_sigma);\n\n  // Raise to the power. Note that when priority blending length is positive, we\n  // delay this process.\n  if (opt.weights_exp != 1 && !use_priority_blend)\n    asp::raiseToPower(opt.weights_exp, weights);\n\n  // Apply external weights\n  if (!opt.weight_files.empty())\n    asp::applyExternalWeights(opt.weight_files[dem_iter], opt.min_weight,\n                              opt.invert_weights, in_box, weights);\n    \n  // The weights must be zero where the DEM is no-data. This is a bugfix.\n  for (int col = 0; col < weights.cols(); col++) {\n    for (int row = 0; row < weights.rows(); row++) {\n      if (select_channel(dem, 0)(col, row) == nodata_value)\n        weights(col, row) = 0.0;\n    }\n  }\n}\n\n// Copy weights from separate weight image into the alpha channel of the DEM.\nvoid setWeightsAsAlphaChannel(vw::ImageView<double> const& weights,\n                              // Outputs\n                              vw::ImageView<asp::DoubleGrayA>& dem) {\n  for (int col = 0; col < dem.cols(); col++) {\n    for (int row = 0; row < dem.rows(); row++) {\n      dem(col, row).a() = weights(col, row);\n    }\n  }\n}\n\n/// Class that does the actual image processing work\nclass DemMosaicView: public vw::ImageViewBase<DemMosaicView> {\n  int m_cols, m_rows, m_bias;\n  asp::DemMosaicOptions  const& m_opt; // alias\n  vw::DiskImageManager<float> & m_imgMgr; // alias\n  std::vector<vw::cartography::GeoReference> const& m_georefs; // alias\n  vw::cartography::GeoReference m_out_georef;\n  std::vector<double> const& m_nodata_values; // alias\n  std::vector<vw::BBox2i> const& m_dem_pixel_bboxes; // alias\n  std::int64_t & m_num_valid_pixels; // alias, to populate on output\n  vw::Mutex & m_count_mutex; // alias, a lock for m_num_valid_pixels\n\npublic:\n  DemMosaicView(int cols, int rows, int bias,\n                asp::DemMosaicOptions                      const& opt,\n                std::vector<vw::cartography::GeoReference> const& georefs,\n                vw::cartography::GeoReference              const& out_georef,\n                std::vector<double>                        const& nodata_values,\n                std::vector<vw::BBox2i>                    const& dem_pixel_bboxes,\n                // Outputs\n                vw::DiskImageManager<float> & imgMgr,\n                std::int64_t                & num_valid_pixels,\n                vw::Mutex                   & count_mutex):\n    m_cols(cols), m_rows(rows), m_bias(bias), m_opt(opt),\n    m_imgMgr(imgMgr), m_georefs(georefs),\n    m_out_georef(out_georef), m_nodata_values(nodata_values),\n    m_dem_pixel_bboxes(dem_pixel_bboxes), m_num_valid_pixels(num_valid_pixels),\n    m_count_mutex(count_mutex) {\n\n    // How many valid pixels we will have\n    m_num_valid_pixels = 0;\n\n    if (imgMgr.size() != georefs.size()       ||\n        imgMgr.size() != nodata_values.size() ||\n        imgMgr.size() != dem_pixel_bboxes.size())\n      vw::vw_throw(vw::ArgumentErr() << \"Inputs expected to have the same size do not.\\n\");\n\n    // Sanity check, see if datums differ, then the tool won't work\n    asp::demMosaicDatumCheck(m_georefs, m_out_georef);\n  }\n\n  // Output image properties\n  typedef float      pixel_type;\n  typedef pixel_type result_type;\n  typedef vw::ProceduralPixelAccessor<DemMosaicView> pixel_accessor;\n  inline int cols  () const { return m_cols; }\n  inline int rows  () const { return m_rows; }\n  inline int planes() const { return 1; }\n  inline pixel_accessor origin() const { return pixel_accessor(*this, 0, 0); }\n\n  inline pixel_type operator()(double/*i*/, double/*j*/, int/*p*/ = 0) const {\n    vw::vw_throw(vw::NoImplErr() << \"DemMosaicView::operator()(...) is not implemented\");\n    return pixel_type();\n  }\n\n  typedef vw::CropView<vw::ImageView<pixel_type> > prerasterize_type;\n  inline prerasterize_type prerasterize(vw::BBox2i bbox) const {\n\n    vw::BBox2i orig_box = bbox;\n\n    // Get a shorthand for this\n    const bool use_priority_blend = (m_opt.priority_blending_len > 0);\n\n    // When doing priority blending, we will do all the work in the\n    // output pixels domain. Hence we need to take into account the\n    // bias here rather than later.\n    if (use_priority_blend)\n      bbox.expand(m_bias + vw::BilinearInterpolation::pixel_buffer + 1);\n\n    // We will do all computations in double precision, regardless of the\n    // precision of the inputs, for increased accuracy. The image data buffers\n    // are initialized here.\n    vw::ImageView<double> tile(bbox.width(), bbox.height()); // the output tile (most cases)\n    vw::ImageView<double> weights(bbox.width(), bbox.height()); // weights (most cases)\n    vw::fill(tile, m_opt.out_nodata_value);\n    vw::fill(weights, 0.0);\n\n    // True if we won't be doing any DEM blending.\n    bool noblend = (numNoBlendOptions(m_opt) > 0);\n\n    // A vector of tiles, each of the size of the output tile, \n    // is for median, nmad, and stddev calculation.\n    int num_images = m_imgMgr.size();\n    std::vector<vw::ImageView<double>> tile_vec, weight_vec;\n    std::vector<std::string> dem_vec;\n    initializeTileVector(num_images, bbox, m_opt, tile, tile_vec, weight_vec);\n\n    // This will ensure that pixels from earlier images are mostly used\n    // unmodified except being blended at the boundary.\n    vw::ImageView<double> weight_modifier;\n    if (use_priority_blend) {\n      weight_modifier = vw::ImageView<double>(bbox.width(), bbox.height());\n      vw::fill(weight_modifier, std::numeric_limits<double>::max());\n    }\n\n    // For saving the weights\n    std::vector<int> clip2dem_index;\n    vw::ImageView<double> saved_weight;\n    if (m_opt.save_dem_weight >= 0) {\n      saved_weight = vw::ImageView<double>(bbox.width(), bbox.height());\n      vw::fill(saved_weight, 0.0);\n    }\n\n    // For saving the index map\n    vw::ImageView<double> index_map;\n    if (m_opt.save_index_map) {\n      index_map = vw::ImageView<double>(bbox.width(), bbox.height());\n      vw::fill(index_map, m_opt.out_nodata_value);\n\n      // Sanity check: the output no-data value must not equal to\n      // any of the indices in the map, as then the two cannot be\n      // distinguished.\n      for (int dem_iter = 0; dem_iter < (int)m_imgMgr.size(); dem_iter++) {\n        if (dem_iter == m_opt.out_nodata_value)\n          vw::vw_throw(vw::ArgumentErr() << \"Cannot have the output no-data value equal to \"\n                   << m_opt.out_nodata_value\n                   << \" as this is one of the indices being saved in the index map.\\n\");\n      }\n    }\n\n    // Loop through all input DEMs\n    for (int dem_iter = 0; dem_iter < (int)m_imgMgr.size(); dem_iter++) {\n\n      // Load the information for this DEM\n      vw::cartography::GeoReference georef= m_georefs[dem_iter];\n      vw::BBox2i dem_pixel_box = m_dem_pixel_bboxes[dem_iter];\n\n      // The vw::cartography::GeoTransform will hide the messy details of conversions\n      // from pixels to points and lon-lat.\n      vw::cartography::GeoTransform geotrans(georef, m_out_georef, dem_pixel_box, bbox);\n\n      // Get the tile bbox in the frame of the current input DEM\n      vw::BBox2 in_box = geotrans.reverse_bbox(bbox);\n\n      // Grow to account for blending and erosion length, etc.  If\n      // priority blending length was positive, we've already expanded 'bbox'.\n      if (!use_priority_blend)\n        in_box.expand(m_bias + vw::BilinearInterpolation::pixel_buffer + 1);\n\n      in_box.crop(dem_pixel_box);\n\n      if (in_box.width() == 1 || in_box.height() == 1) {\n        // Grassfire likes to have width of at least 2\n        in_box.expand(1);\n        in_box.crop(dem_pixel_box);\n      }\n      if (in_box.width() <= 1 || in_box.height() <= 1)\n        continue; // No overlap with this tile, skip to the next DEM.\n\n      if (m_opt.median || m_opt.nmad || use_priority_blend || m_opt.block_max) {\n        // Must use a blank tile each time\n        vw::fill(tile, m_opt.out_nodata_value);\n        vw::fill(weights, 0.0);\n      }\n\n      // Load and preprocess this DEM (crop, threshold, fill, blur)\n      vw::ImageView<asp::DoubleGrayA> dem;\n      double nodata_value = -std::numeric_limits<double>::max(); // will change\n      preprocessDem(dem_iter, bbox, in_box, m_opt, m_imgMgr, m_nodata_values,\n                    dem, nodata_value);\n\n      // Compute weights for this DEM\n      vw::ImageView<double> local_wts;\n      computeDemWeights(dem, nodata_value, m_opt, m_bias, use_priority_blend,\n                        dem_iter, in_box, local_wts);\n\n      // Save the weights with georeference. Very useful for debugging\n      // non-uniqueness issues across tiles.\n      if (false)\n        saveTileWeight(dem_iter, bbox, local_wts, georef);\n\n      // Set the weights in the alpha channel\n      asp::setWeightsAsAlphaChannel(local_wts, dem);\n\n      // Prepare the DEM for interpolation\n      vw::ImageViewRef<asp::DoubleGrayA> interp_dem\n        = interpolate(dem, vw::BilinearInterpolation(), vw::ConstantEdgeExtension());\n\n      // Process the DEM tile pixel by pixel\n      processDemTile(m_opt, bbox, in_box.min(), dem, interp_dem, geotrans,\n                     tile_vec, noblend, use_priority_blend, dem_iter, g_tol,\n                     // Outputs\n                     tile, weights, weight_modifier, saved_weight, index_map);\n\n      // For the median option, keep a copy of the output tile for each input DEM.\n      // Also do it for max per block. This will be memory intensive. \n      if (m_opt.median || m_opt.nmad || m_opt.block_max) {\n        std::string dem_name = m_imgMgr.get_file_name(dem_iter);\n        tile_vec.push_back(copy(tile));\n        dem_vec.push_back(dem_name);\n      }\n\n      // For priority blending, need also to keep all tiles, but also the weights\n      if (use_priority_blend) {\n        tile_vec.push_back(copy(tile));\n        weight_vec.push_back(copy(weights));\n      }\n\n      if (use_priority_blend || m_opt.save_index_map)\n        clip2dem_index.push_back(dem_iter);\n\n    } // End iterating over DEMs\n\n    // Divide by the weights in blend, mean\n    if (!noblend || m_opt.mean)\n      asp::divideByWeight(tile, weights);\n\n    // Finish stddev calculations\n    if (m_opt.stddev)\n      finishStdDevCalc(m_opt.out_nodata_value, tile, weights);\n\n    // Median and nmad operations\n    if (m_opt.median || m_opt.nmad)\n      processMedianOrNmad(bbox, m_opt.out_nodata_value, m_opt.median, m_opt.save_index_map,\n                          clip2dem_index, tile_vec,\n                          // Outputs\n                          tile, index_map);\n\n    // For max per block, find the sum of values in each DEM\n    if (m_opt.block_max)\n      processBlockMax(m_opt.out_nodata_value, bbox, tile_vec, dem_vec, tile);\n\n    // For priority blending length, use the weights created so far only to burn holes in\n    // the DEMs where we don't want blending, then recreate the weights\n    if (use_priority_blend)\n      priorityBlend(m_opt.out_nodata_value, m_bias, m_opt.weights_blur_sigma,\n                    m_opt.weights_exp, m_opt.no_border_blend, m_opt.save_dem_weight,\n                    clip2dem_index, m_out_georef, bbox,\n                    // Outputs\n                    tile_vec, weight_vec, tile, weights, saved_weight);\n\n    // Save the weight instead\n    if (m_opt.save_dem_weight >= 0)\n      tile = saved_weight;\n\n    // Save the index map instead\n    if (m_opt.save_index_map)\n      tile = index_map;\n\n    // How many valid pixels are there in the tile\n    updateNumValidPixels(tile, m_opt.out_nodata_value, bbox, orig_box,\n                         m_num_valid_pixels, m_count_mutex);\n\n    // Return the tile we created with fake borders to make it look\n    // the size of the entire output image. So far we operated\n    // on doubles, here we cast to float.\n    return prerasterize_type(vw::pixel_cast<float>(tile),\n                             -bbox.min().x(), -bbox.min().y(),\n                             cols(), rows());\n  } // end function prerasterize\n\n  template <class DestT>\n  inline void rasterize(DestT const& dest, vw::BBox2i bbox) const {\n    vw::rasterize(prerasterize(bbox), dest, bbox);\n  }\n}; // End class DemMosaicView\n\n/// Find the bounding box of all DEMs in the projected space.\n/// - mosaic_bbox is the output bounding box in projected space\n/// - dem_proj_bboxes and dem_pixel_bboxes are the locations of\n///   each input DEM in the output DEM in projected and pixel coordinates.\nvoid loadDemBdBoxes(asp::DemMosaicOptions const& opt,\n                    vw::cartography::GeoReference const& mosaic_georef,\n                    vw::BBox2& mosaic_bbox, // Projected coordinates\n                    std::vector<vw::BBox2>& dem_proj_bboxes,\n                    std::vector<vw::BBox2i>& dem_pixel_bboxes) {\n\n  vw::vw_out() << \"Determining the bounding boxes of the inputs.\\n\";\n\n  // Initialize the outputs\n  mosaic_bbox = vw::BBox2();\n  dem_proj_bboxes.clear();\n  dem_pixel_bboxes.clear();\n\n  vw::TerminalProgressCallback tpc(\"\", \"\\t--> \");\n  tpc.report_progress(0);\n  double inc_amount = 1.0 / double(opt.dem_files.size());\n\n  // Loop through all DEMs\n  for (int dem_iter = 0; dem_iter < (int)opt.dem_files.size(); dem_iter++) {\n\n    // Open a handle to this DEM file\n    vw::DiskImageResourceGDAL in_rsrc(opt.dem_files[dem_iter]);\n    vw::DiskImageView<float> img(opt.dem_files[dem_iter]);\n    vw::cartography::GeoReference georef\n      = asp::readGeorefOrThrow(opt.dem_files[dem_iter]);\n    vw::BBox2i pixel_box = bounding_box(img);\n\n    dem_pixel_bboxes.push_back(pixel_box);\n\n    bool has_lonat\n      = (georef.proj4_str().find(\"+proj=longlat\") != std::string::npos ||\n         mosaic_georef.proj4_str().find(\"+proj=longlat\") != std::string::npos);\n\n    // Compute bounding box of this DEM. The simple case is when all DEMs have\n    // the same projection, and it is not longlat, as then we need to worry about\n    // a 360 degree shift.\n    if ((!has_lonat) && mosaic_georef.get_wkt() == georef.get_wkt()) {\n      vw::BBox2 proj_box = georef.pixel_to_point_bbox(vw::bounding_box(img));\n      mosaic_bbox.grow(proj_box);\n      dem_proj_bboxes.push_back(proj_box);\n    } else {\n      // Compute the bounding box of the current image in projected\n      // coordinates of the mosaic. There is always a worry that the\n      // lonlat of the mosaic so far and of the current DEM will be\n      // offset by 360 degrees. Try to deal with that.\n      vw::BBox2 proj_box;\n      vw::BBox2 imgbox = bounding_box(img);\n      vw::BBox2 mosaic_pixel_box;\n\n      // Get the bbox of current mosaic in pixels.\n      if (dem_iter == 0) {\n        // TODO: Not robust. How to estimate the pixel extent of the\n        // first DEM in the mosaic? Taking into account that\n        // the first DEM lonlat box and the mosaic lonlat box\n        // may be offset by 360 degrees?\n        mosaic_pixel_box = imgbox;\n      } else {\n        mosaic_pixel_box = mosaic_georef.point_to_pixel_bbox(mosaic_bbox);\n      }\n\n      vw::cartography::GeoTransform geotrans(georef, mosaic_georef,\n                                             imgbox, mosaic_pixel_box);\n      proj_box = geotrans.pixel_to_point_bbox(imgbox);\n\n      mosaic_bbox.grow(proj_box);\n      dem_proj_bboxes.push_back(proj_box);\n    } // End second case\n\n    tpc.report_incremental_progress(inc_amount);\n  } // End loop through DEM files\n  tpc.report_finished();\n\n} // End function loadDemBdBoxes\n\n// Load DEMs that intersect with the current tile batch. This filters the input DEMs\n// to only those needed for the tiles being processed, and prepares them for mosaicking.\nvoid loadDemsForTiles(asp::DemMosaicOptions const& opt,\n                      std::vector<vw::BBox2> const& demProjBboxes,\n                      std::vector<vw::BBox2i> const& demPixelBboxes,\n                      std::vector<vw::BBox2i> const& tilePixelBboxes,\n                      int startTile, int endTile,\n                      vw::cartography::GeoReference const& mosaicGeoref,\n                      vw::BBox2i const& outputDemBox,\n                      // Outputs\n                      vw::DiskImageManager<float>& imgMgr,\n                      std::vector<std::string>& loadedDems,\n                      std::vector<double>& nodataValues,\n                      std::vector<vw::cartography::GeoReference>& georefs,\n                      std::vector<vw::BBox2i>& loadedDemPixelBboxes) {\n\n  // Loop through all DEMs\n  for (int dem_iter = 0; dem_iter < (int)opt.dem_files.size(); dem_iter++) {\n\n    // Get the DEM bounding box that we previously computed (output projected coords)\n    vw::BBox2 dem_bbox = demProjBboxes[dem_iter];\n\n    // Go through each of the tile bounding boxes and see they intersect this DEM\n    bool use_this_dem = false;\n    for (int tile_id = startTile; tile_id < endTile; tile_id++) {\n\n      if (!opt.tile_list.empty() && opt.tile_list.find(tile_id) == opt.tile_list.end())\n        continue;\n\n      // Get tile bbox in pixels, then convert it to projected coords.\n      vw::BBox2i tile_pixel_box = tilePixelBboxes[tile_id - startTile];\n      vw::BBox2  tile_proj_box  = mosaicGeoref.pixel_to_point_bbox(tile_pixel_box);\n\n      if (tile_proj_box.intersects(dem_bbox)) {\n        use_this_dem = true;\n        break;\n      }\n    }\n    if (!use_this_dem)\n      continue; // Skip to the next DEM if we don't need this one.\n\n    // The vw::cartography::GeoTransform will hide the messy details of conversions\n    // from pixels to points and lon-lat.\n    vw::cartography::GeoReference georef = asp::readGeorefOrThrow(opt.dem_files[dem_iter]);\n    vw::BBox2i dem_pixel_box = demPixelBboxes[dem_iter];\n    vw::cartography::GeoTransform geotrans(georef, mosaicGeoref,\n                                           dem_pixel_box, outputDemBox);\n\n    // Get the current DEM bounding box in pixel units of the output mosaicked DEM\n    vw::BBox2 curr_box = geotrans.forward_bbox(dem_pixel_box);\n    curr_box.crop(outputDemBox);\n\n    // This is a fix for GDAL crashing when there are too many open\n    // file handles. In such situation, just selectively close the\n    // handles furthest from the current location.\n    imgMgr.add_file_handle_not_thread_safe(opt.dem_files[dem_iter], curr_box);\n\n    double curr_nodata_value = opt.out_nodata_value;\n    try {\n      // Get the nodata-value. Need a try block, in case we can't\n      // open more handles.\n      vw::DiskImageResourceGDAL in_rsrc(opt.dem_files[dem_iter]);\n      if (in_rsrc.has_nodata_read())\n        curr_nodata_value = float(in_rsrc.nodata_read());\n    } catch(std::exception const& e) {\n      // Try again\n      imgMgr.freeup_handles_not_thread_safe();\n      vw::DiskImageResourceGDAL in_rsrc(opt.dem_files[dem_iter]);\n      if (in_rsrc.has_nodata_read())\n        curr_nodata_value = float(in_rsrc.nodata_read());\n    }\n\n    loadedDems.push_back(opt.dem_files[dem_iter]);\n\n    if (!std::isnan(opt.nodata_threshold))\n      curr_nodata_value = opt.nodata_threshold;\n\n    // Add the info for this DEM to the appropriate vectors\n    nodataValues.push_back(curr_nodata_value);\n    georefs.push_back(georef);\n    loadedDemPixelBboxes.push_back(dem_pixel_box);\n  } // End loop through DEM files\n}\n\n// Determine the output nodata value. Read from first DEM if not user-specified,\n// and validate that it can be represented exactly as a float.\nvoid determineNodataValue(asp::DemMosaicOptions& opt) {\n  // Read nodata from first DEM, unless the user chooses to specify it.\n  // Cast nodata to float since DEMs are read as float.\n  if (!opt.has_out_nodata) {\n    vw::DiskImageResourceGDAL in_rsrc(opt.dem_files[0]);\n    if (in_rsrc.has_nodata_read())\n      opt.out_nodata_value = float(in_rsrc.nodata_read());\n  }\n\n  // Watch for underflow, if mixing doubles and float. Particularly problematic\n  // is when the nodata_value cannot be represented exactly as a float.\n  if (opt.out_nodata_value < static_cast<double>(-std::numeric_limits<float>::max()) ||\n      float(opt.out_nodata_value)  != double(opt.out_nodata_value)) {\n    vw::vw_out() << \"The no-data value cannot be represented exactly as a float. \"\n         << \"Changing it to the smallest float.\\n\";\n    opt.out_nodata_value = static_cast<double>(-std::numeric_limits<float>::max());\n  }\n\n  vw::vw_out() << \"Using output no-data value: \" << opt.out_nodata_value << \"\\n\";\n}\n\n// Compute the bias for reading from images beyond tile boundaries to avoid\n// tiling artifacts. This accounts for erosion, blurring, hole filling, etc.\nint computeTileBias(asp::DemMosaicOptions const& opt) {\n  // This bias is very important. This is how much we should read from\n  // the images beyond the current boundary to avoid tiling artifacts.\n  // The +1 is to ensure extra pixels beyond the hole fill length.\n  int bias = opt.erode_len + opt.extra_crop_len + opt.hole_fill_len\n    + opt.fill_search_radius\n    + 2*std::max(vw::compute_kernel_size(opt.weights_blur_sigma),\n                 vw::compute_kernel_size(opt.dem_blur_sigma)) + 1;\n\n  // If we just fill holes based on search radius, we do not need a large bias.\n  // Filling with large search radius is slow as it is.\n  if (opt.fill_search_radius > 0)\n    bias = opt.fill_search_radius + 10;\n\n  return bias;\n}\n\n// Save DEM tile with type conversion (template)\ntemplate<typename T>\nvoid saveDemTileAsType(int blockSize, std::string const& demTile,\n                       vw::ImageViewRef<float> const& outDem,\n                       vw::cartography::GeoReference const& cropGeoref,\n                       asp::DemMosaicOptions const& opt) {\n  bool hasGeoref = true, hasNodata = true;\n  vw::TerminalProgressCallback tpc(\"asp\", \"\\t--> \");\n  asp::saveWithTempBigBlocks(blockSize, demTile,\n                             per_pixel_filter(outDem, vw::RoundAndClamp<T, float>()),\n                             hasGeoref, cropGeoref,\n                             hasNodata, vw::round_and_clamp<T>(opt.out_nodata_value),\n                             opt, tpc);\n}\n\n// Specialization for Float32 (no conversion needed)\ntemplate<>\nvoid saveDemTileAsType<float>(int blockSize, std::string const& demTile,\n                              vw::ImageViewRef<float> const& outDem,\n                              vw::cartography::GeoReference const& cropGeoref,\n                              asp::DemMosaicOptions const& opt) {\n  bool hasGeoref = true, hasNodata = true;\n  vw::TerminalProgressCallback tpc(\"asp\", \"\\t--> \");\n  asp::saveWithTempBigBlocks(blockSize, demTile, outDem,\n                             hasGeoref, cropGeoref,\n                             hasNodata, opt.out_nodata_value, opt, tpc);\n}\n\n// Save DEM tile to disk with appropriate type conversion based on output_type option.\nvoid saveDemTile(int blockSize, std::string const& demTile,\n                 vw::ImageViewRef<float> const& outDem,\n                 vw::cartography::GeoReference const& cropGeoref,\n                 asp::DemMosaicOptions const& opt) {\n  vw::vw_out() << \"Writing: \" << demTile << \"\\n\";\n\n  if (opt.output_type == \"Float32\")\n    saveDemTileAsType<float>(blockSize, demTile, outDem, cropGeoref, opt);\n  else if (opt.output_type == \"Byte\")\n    saveDemTileAsType<vw::uint8>(blockSize, demTile, outDem, cropGeoref, opt);\n  else if (opt.output_type == \"UInt16\")\n    saveDemTileAsType<vw::uint16>(blockSize, demTile, outDem, cropGeoref, opt);\n  else if (opt.output_type == \"Int16\")\n    saveDemTileAsType<vw::int16>(blockSize, demTile, outDem, cropGeoref, opt);\n  else if (opt.output_type == \"UInt32\")\n    saveDemTileAsType<vw::uint32>(blockSize, demTile, outDem, cropGeoref, opt);\n  else if (opt.output_type == \"Int32\")\n    saveDemTileAsType<vw::int32>(blockSize, demTile, outDem, cropGeoref, opt);\n  else\n    vw::vw_throw(vw::NoImplErr() << \"Unsupported output type: \" << opt.output_type << \".\\n\");\n}\n\n// Compute block size for rasterization based on bias and user options.\n// Block size is set to next power of 2 >= 4*bias, with minimum of 256.\nint computeBlockSize(int bias, asp::DemMosaicOptions const& opt) {\n  // The next power of 2 >= 4*bias. We want to make the blocks big,\n  // to reduce overhead from this bias, but not so big that it may\n  // not fit in memory.\n  int block_size = vw::nextpow2(4.0*bias);\n  block_size = std::max(block_size, 256); // don't make them too small though\n  if (opt.block_size > 0)\n    block_size = opt.block_size;\n\n  // The block size must be a multiple of 16\n  if (block_size % 16 != 0)\n    vw::vw_throw(vw::ArgumentErr() << \"The block size must be a multiple of 16.\\n\");\n\n  return block_size;\n}\n\n// Setup tile grid parameters and validate configuration.\n// Determines number of tiles, checks for single-file output mode, validates tile index.\nvoid setupTileGrid(int cols, int rows, asp::DemMosaicOptions const& opt,\n                   // Outputs\n                   int& num_tiles_x,\n                   int& num_tiles_y,\n                   int& num_tiles,\n                   bool& write_to_precise_file) {\n  // See if to lump all mosaic in just a given file, rather than creating tiles.\n  write_to_precise_file = (opt.out_prefix.size() >= 4 &&\n                           opt.out_prefix.substr(opt.out_prefix.size()-4, 4) == \".tif\");\n\n  num_tiles_x = (int)ceil((double)cols/double(opt.tile_size));\n  num_tiles_y = (int)ceil((double)rows/double(opt.tile_size));\n  if (num_tiles_x <= 0) num_tiles_x = 1;\n  if (num_tiles_y <= 0) num_tiles_y = 1;\n  num_tiles = num_tiles_x*num_tiles_y;\n  vw::vw_out() << \"Number of tiles: \" << num_tiles_x << \" x \"\n           << num_tiles_y << \" = \" << num_tiles << \".\\n\";\n\n  if (opt.tile_index >= num_tiles)\n    vw::vw_throw(vw::ArgumentErr() << \"Tile with index \" << opt.tile_index\n                 << \" is out of bounds (valid range: 0-\" << num_tiles-1 << \").\\n\");\n\n  if (num_tiles > 1 && write_to_precise_file)\n    vw::vw_throw(vw::ArgumentErr() << \"Cannot fit all mosaic in the given output file name. \"\n         << \"Hence specify an output prefix instead, and then multiple \"\n         << \"tiles will be created.\\n\");\n}\n\n// Generate a single output tile. This creates a DemMosaicView, rasters it to disk,\n// and removes the tile if it contains no valid pixels.\nvoid generateTile(int tile_id, int start_tile, int cols, int rows, int bias,\n                  int block_size, int num_digits, bool write_to_precise_file,\n                  asp::DemMosaicOptions const& opt,\n                  std::vector<vw::BBox2i> const& tile_pixel_bboxes,\n                  std::vector<vw::cartography::GeoReference> const& georefs,\n                  vw::cartography::GeoReference const& mosaic_georef,\n                  std::vector<double> const& nodata_values,\n                  std::vector<vw::BBox2i> const& loaded_dem_pixel_bboxes,\n                  vw::DiskImageManager<float>& imgMgr) {\n\n  // Get the bounding box we previously computed\n  vw::BBox2i tile_box = tile_pixel_bboxes[tile_id - start_tile];\n\n  std::string dem_tile;\n  if (!write_to_precise_file) {\n    std::ostringstream os;\n    os << opt.out_prefix << \"-tile-\"\n        << std::setfill('0') << std::setw(num_digits) << tile_id\n        << tile_suffix(opt) << \".tif\";\n    dem_tile = os.str();\n  } else {\n    dem_tile = opt.out_prefix; // the file name was set by user\n  }\n\n  // Set up tile image and metadata\n  std::int64_t num_valid_pixels = 0; // Will be populated when saving to disk\n  vw::Mutex count_mutex; // to lock when updating num_valid_pixels\n\n  vw::ImageViewRef<float> out_dem\n    = vw::crop(DemMosaicView(cols, rows, bias, opt,\n                             georefs, mosaic_georef,\n                             nodata_values, loaded_dem_pixel_bboxes,\n                             imgMgr, num_valid_pixels, count_mutex), tile_box);\n  vw::cartography::GeoReference crop_georef\n    = vw::cartography::crop(mosaic_georef, tile_box.min().x(),\n                            tile_box.min().y());\n  // Update the lon-lat box given that we know the final georef and image size\n  crop_georef.ll_box_from_pix_box(vw::BBox2i(0, 0, cols, rows));\n\n  // Raster the tile to disk. Optionally cast to int (may be useful for\n  // mosaicking ortho images).\n  saveDemTile(block_size, dem_tile, out_dem, crop_georef, opt);\n\n  vw::vw_out() << \"Number of valid (not no-data) pixels written: \"\n               << num_valid_pixels << \".\\n\";\n  if (num_valid_pixels == 0) {\n    vw::vw_out() << \"Removing tile with no valid pixels: \" << dem_tile << \"\\n\";\n    boost::filesystem::remove(dem_tile);\n  }\n}\n\n// Set up output mosaic geometry: georef, dimensions (cols/rows), spacing.\n// Handles projection changes, resolution, alignment (tap/gdal-tap), and projwin cropping.\n// Arguments below get modified.\nvoid setupMosaicGeom(asp::DemMosaicOptions& opt,\n                     vw::cartography::GeoReference& mosaic_georef,\n                     vw::BBox2& mosaic_bbox,\n                     std::vector<vw::BBox2>& dem_proj_bboxes,\n                     std::vector<vw::BBox2i>& dem_pixel_bboxes,\n                     double& spacing,\n                     int& cols,\n                     int& rows) {\n\n  // By default the output georef is equal to the first input georef\n  mosaic_georef = asp::readGeorefOrThrow(opt.dem_files[0]);\n\n  spacing = opt.tr;\n  if (opt.target_srs_string != \"\" && spacing <= 0)\n    vw::vw_throw(vw::ArgumentErr()\n                 << \"Changing the projection was requested. The output DEM \"\n                 << \"resolution must be specified via the --tr option.\\n\");\n\n  if (opt.target_srs_string != \"\") {\n    // Set the srs string into georef.\n    bool have_user_datum = false;\n    vw::cartography::Datum user_datum;\n    vw::cartography::set_srs_string(opt.target_srs_string, have_user_datum,\n                                    user_datum, mosaic_georef);\n  }\n\n  // Use desired spacing if user-specified\n  if (spacing > 0.0) {\n    // Get lonlat bounding box of the first DEM.\n    vw::DiskImageView<float> dem0(opt.dem_files[0]);\n    vw::BBox2 llbox = mosaic_georef.pixel_to_lonlat_bbox(bounding_box(dem0));\n\n    // Reset transform with user provided spacing.\n    vw::math::Matrix<double,3,3> transform = mosaic_georef.transform();\n    transform.set_identity();\n    transform(0, 0) =  spacing;\n    transform(1, 1) = -spacing;\n    mosaic_georef.set_transform(transform);\n\n    // Set the translation part of the transform so that the origin\n    // maps to the lonlat box corner. This is still not fully\n    // reliable, but better than nothing. We will adjust mosaic_georef later on.\n    vw::Vector2 ul = mosaic_georef.lonlat_to_pixel(vw::Vector2(llbox.min().x(),\n                                                                llbox.max().y()));\n    mosaic_georef = vw::cartography::crop(mosaic_georef, ul.x(), ul.y());\n  } else {\n    // Update spacing variable from the current transform\n    spacing = mosaic_georef.transform()(0, 0);\n    if (spacing <= 0)\n      vw::vw_throw(vw::ArgumentErr() << \"The output grid size must be positive.\\n\");\n  }\n\n  if (opt.gdal_tap) {\n    // A first adjustment, will refine later\n    auto T = mosaic_georef.transform();\n    T(0, 2) = spacing * round(T(0, 2)/spacing);\n    T(1, 2) = spacing * round(T(1, 2)/spacing);\n    mosaic_georef.set_transform(T);\n  }\n\n  // If the user specified the tile size in georeferenced units\n  if (opt.geo_tile_size > 0) {\n    opt.tile_size = (int)round(opt.geo_tile_size/spacing);\n    vw::vw_out() << \"Tile size in pixels: \" << opt.tile_size << \"\\n\";\n  }\n  opt.tile_size = std::max(opt.tile_size, 1);\n\n  // Load the bounding boxes from all of the DEMs\n  loadDemBdBoxes(opt, mosaic_georef, mosaic_bbox,\n                 dem_proj_bboxes, dem_pixel_bboxes);\n\n  if (opt.tap) {\n    // Ensure that the grid is at integer multiples of grid size\n    mosaic_bbox.min() = spacing * floor(mosaic_bbox.min() / spacing);\n    mosaic_bbox.max() = spacing * ceil(mosaic_bbox.max()  / spacing);\n    if (opt.projwin != vw::BBox2()) {\n      opt.projwin.min() = spacing * floor(opt.projwin.min() / spacing);\n      opt.projwin.max() = spacing * ceil(opt.projwin.max()  / spacing);\n    }\n  }\n\n  if (opt.gdal_tap) {\n    // Conform to GDAL -tap. Ensure that the output bounds are at integer\n    // multiples of grid size.\n    mosaic_bbox.min() = spacing * round(mosaic_bbox.min() / spacing);\n    mosaic_bbox.max() = spacing * round(mosaic_bbox.max()  / spacing);\n    if (opt.projwin != vw::BBox2()) {\n      opt.projwin.min() = spacing * round(opt.projwin.min() / spacing);\n      opt.projwin.max() = spacing * round(opt.projwin.max()  / spacing);\n    }\n  }\n\n  if (opt.projwin != vw::BBox2()) {\n    // If to create the mosaic only in a given region\n    if (!opt.gdal_tap)\n      mosaic_bbox.crop(opt.projwin);\n    else\n      mosaic_bbox = opt.projwin; // GDAL --tap overrides the mosaic box\n\n    // Crop the proj boxes as well\n    for (int dem_iter = 0; dem_iter < (int)opt.dem_files.size(); dem_iter++)\n      dem_proj_bboxes[dem_iter].crop(opt.projwin);\n    if (opt.force_projwin)\n      mosaic_bbox = opt.projwin;\n  }\n\n  if (opt.gdal_tap) {\n    // Further adjustment of the georef. By now mosaic_bbox incorporates\n    // --projwin if given. The corners of mosaic_bbox are multiples of spacing.\n    auto T = mosaic_georef.transform();\n    if (T(0, 0) <= 0)\n      vw::vw_throw(vw::ArgumentErr()\n                   << \"The output grid size in x must be positive.\\n\");\n    if (T(1, 1) >= 0)\n      vw::vw_throw(vw::ArgumentErr()\n                   << \"The output grid size in y must be negative.\\n\");\n    T(0, 2) = mosaic_bbox.min().x();\n    T(1, 2) = mosaic_bbox.max().y();\n    mosaic_georef.set_transform(T);\n  }\n\n  // First-guess pixel box\n  vw::BBox2 pixel_box = asp::pointToPixelBboxSnapped(mosaic_georef, mosaic_bbox, g_tol);\n\n  // Take care of numerical artifacts\n  vw::Vector2 beg_pix = pixel_box.min();\n  if (norm_2(beg_pix - round(beg_pix)) < g_tol)\n    beg_pix = round(beg_pix);\n  mosaic_georef = vw::cartography::crop(mosaic_georef, beg_pix[0], beg_pix[1]);\n\n  // Image size\n  pixel_box = asp::pointToPixelBboxSnapped(mosaic_georef, mosaic_bbox, g_tol);\n  vw::Vector2 end_pix = pixel_box.max();\n  cols = (int)round(end_pix[0]); // end_pix is the last pix in the image\n  rows = (int)round(end_pix[1]);\n\n  vw::vw_out() << \"Mosaic size: \" << cols << \" x \" << rows << \" pixels.\\n\";\n}\n\n} // end namespace asp\n\nint main(int argc, char *argv[]) {\n\n  asp::DemMosaicOptions opt;\n\n  try {\n\n    asp::handleDemMosaicArgs(argc, argv, opt);\n\n    // Determine and validate output nodata value\n    asp::determineNodataValue(opt);\n\n    // Set up output mosaic geometry\n    vw::cartography::GeoReference mosaic_georef;\n    vw::BBox2 mosaic_bbox;\n    std::vector<vw::BBox2> dem_proj_bboxes;\n    std::vector<vw::BBox2i> dem_pixel_bboxes, loaded_dem_pixel_bboxes;\n    double spacing = 0.0; // will be updated\n    int cols = 0, rows = 0; // will be updated\n    asp::setupMosaicGeom(opt, mosaic_georef, mosaic_bbox, dem_proj_bboxes,\n                         dem_pixel_bboxes, spacing, cols, rows);\n\n    // Compute tile processing bias\n    int bias = asp::computeTileBias(opt);\n\n    // Compute block size for rasterization\n    int block_size = asp::computeBlockSize(bias, opt);\n\n    // Setup tile grid and validate configuration\n    int num_tiles_x = 0, num_tiles_y = 0, num_tiles = 0; // will be set\n    bool write_to_precise_file = false; // will be set\n    asp::setupTileGrid(cols, rows, opt, num_tiles_x, num_tiles_y,\n                       num_tiles, write_to_precise_file);\n\n    // If to use a range\n    if (!opt.tile_list.empty() && opt.tile_index >= 0)\n      vw::vw_throw(vw::ArgumentErr() << \"Cannot specify both tile index and tile range.\\n\");\n\n    // See if to save all tiles, or an individual tile.\n    int start_tile = opt.tile_index, end_tile = opt.tile_index + 1;\n    if (opt.tile_index < 0) {\n      start_tile = 0;\n      end_tile = num_tiles;\n    }\n\n    // Compute the bounding box of each output tile\n    std::vector<vw::BBox2i> tile_pixel_bboxes;\n    for (int tile_id = start_tile; tile_id < end_tile; tile_id++) {\n\n      int tile_index_y = tile_id / num_tiles_x;\n      int tile_index_x = tile_id - tile_index_y*num_tiles_x;\n      vw::BBox2i tile_box(tile_index_x*opt.tile_size,\n              tile_index_y*opt.tile_size,\n              opt.tile_size, opt.tile_size);\n\n      // Bounding box of this tile in pixels in the output image\n      tile_box.crop(vw::BBox2i(0, 0, cols, rows));\n      tile_pixel_bboxes.push_back(tile_box);\n    }\n\n    // Store the no-data values, pointers to images, and georeferences (for speed).\n    vw::vw_out() << \"Reading the input DEMs.\\n\";\n    std::vector<double>       nodata_values;\n    std::vector<vw::cartography::GeoReference> georefs;\n    std::vector<std::string>  loaded_dems;\n    vw::DiskImageManager<float>   imgMgr;\n\n    // Load DEMs that intersect with this tile batch. Also calc the output DEM box.\n    vw::BBox2i output_dem_box = vw::BBox2i(0, 0, cols, rows); // output DEM box\n    vw::vw_out() << \"Reading the input DEMs.\\n\";\n    asp::loadDemsForTiles(opt, dem_proj_bboxes, dem_pixel_bboxes, tile_pixel_bboxes,\n                          start_tile, end_tile, mosaic_georef, output_dem_box,\n                          // Outputs\n                          imgMgr, loaded_dems, nodata_values, georefs,\n                          loaded_dem_pixel_bboxes);\n\n    // If there are 17 tiles, let them be tile-00, ..., tile-16.\n    int num_digits = 1;\n    int tens = 10;\n    while (num_tiles - 1 >= tens) {\n      num_digits++;\n      tens *= 10;\n    }\n\n    // Time to generate each of the output tiles\n    for (int tile_id = start_tile; tile_id < end_tile; tile_id++) {\n\n      if (!opt.tile_list.empty() && opt.tile_list.find(tile_id) == opt.tile_list.end())\n        continue;\n\n      asp::generateTile(tile_id, start_tile, cols, rows, bias, block_size, num_digits,\n                        write_to_precise_file, opt, tile_pixel_bboxes, georefs,\n                        mosaic_georef, nodata_values, loaded_dem_pixel_bboxes, imgMgr);\n\n    } // End loop through tiles\n\n    // Write the name of each DEM file that was used together with its index\n    if (opt.save_index_map) {\n      std::string index_map = opt.out_prefix + \"-index-map.txt\";\n      vw::vw_out() << \"Writing: \" << index_map << \"\\n\";\n      std::ofstream ih(index_map.c_str());\n      for (int dem_iter = 0; dem_iter < (int)loaded_dems.size(); dem_iter++) {\n        ih << opt.dem_files[dem_iter] << ' ' << dem_iter << \"\\n\";\n      }\n    }\n\n  } ASP_STANDARD_CATCHES;\n\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/dg_mosaic",
    "content": "#!/usr/bin/env python\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n# To do: There is no need to round the corners of the images\n# which are combined into the mosaic. May improve accuracy\n# that way. This change would need very careful testing.\n\nfrom __future__ import print_function\nimport os, sys, string, subprocess, math, re, optparse, time, copy, tempfile\n\nfrom datetime import datetime, timedelta\n\n# The path to the ASP python files\nbasepath    = os.path.abspath(sys.path[0])\npythonpath  = os.path.abspath(basepath + '/../Python')  # for dev ASP\nlibexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP\nsys.path.insert(0, basepath) # prepend to Python path\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\n\nfrom asp_system_utils import * # must be after the path is altered above\nfrom asp_system_utils import get_asp_version\nverify_python_version_is_supported()\n\n# Prepend to system PATH\nos.environ[\"PATH\"] = libexecpath + os.pathsep + os.environ[\"PATH\"]\n\ndef write_tree(tree, filename):\n    '''A workarround for tree.write() not printing the string <?xml version=\"1.0\"...>'''\n    root = tree.getroot()\n    with open(filename, 'w') as fh:\n        fh.write(ET.tostring(root, encoding='utf8', method='xml').decode())\n    \ndef format_microsec(microsec):\n    # Ensure that we have 6 digits in a microsecond. Pre-pad with\n    # zeros if necessary.\n    if len(microsec) > 6:\n        raise Exception('InputError', \"The microsecond value: \" + microsec\n                        + \" has more than 6 digits.\")\n\n    microsec  = (6 - len(microsec)) * '0' + microsec\n    return microsec\n\ntry:\n    import xml.etree.ElementTree as ET\nexcept ImportError:\n    # python 2.4\n    import elementtree.ElementTree as ET\n\nif hasattr(datetime, 'strptime'):\n    def parse_time(date_string, fmt):\n        return datetime.strptime(date_string, fmt)\nelse:\n    # python 2.4\n    def parse_time(date_str, fmt):\n        m = re.match(r'^(.*?)T(.*?)\\.(\\d+)Z', date_str)\n        if m:\n            date_str  = m.group(1) + \" \" + m.group(2)\n            microsec  = format_microsec(m.group(3))\n        else:\n            raise Exception('InputError', \"Could not match string: \" + date_str)\n\n        m = re.match(r'^(.*?)T(.*?)\\.(.*?)Z', fmt)\n        if m:\n            fmt = m.group(1) + \" \" + m.group(2)\n        else:\n            raise Exception('InputError', \"Could not match string: \" + fmt)\n\n        parsed = datetime(*(time.strptime(date_str, fmt)[0:6]))\n        parsed = parsed.replace(microsecond=int(microsec))\n\n        return parsed\n\nclass Usage(Exception):\n    def __init__(self, msg):\n        self.msg = msg\n\n# TODO: Move this function into the utils file\ndef lonlat_point_distance(pt1, pt2):\n    '''Computes the great circle distance in meters between two lonlat coordinates'''\n\n    # This function uses a simple, less accurate calculation.\n\n    PI           =  3.141592653589793\n    EARTH_RADIUS = 6371.009 # In km\n    DEG2RAD      = PI / 180.0\n\n    lon1  = pt1[0] * DEG2RAD\n    lon2  = pt2[0] * DEG2RAD\n    lat1  = pt1[1] * DEG2RAD\n    lat2  = pt2[1] * DEG2RAD\n    theta = lon2 - lon1\n    dist  = math.acos(math.sin(lat1) * math.sin(lat2) + math.cos(lat1) * math.cos(lat2) * math.cos(theta))\n    if (dist < 0):\n        dist = dist + PI\n    dist = dist * EARTH_RADIUS\n    return dist * 1000.0 # Convert km to meters\n\n# We assume that the boxes are products of closed intervals, [a, b] x\n# [c, d]. As such, the box [0, 0] x [0, 0] of width 0 is not empty.\nclass BBox:\n    def __init__(self,\n                 minx =  sys.float_info.max, miny =  sys.float_info.max,\n                 maxx = -sys.float_info.max, maxy = -sys.float_info.max):\n        self.minx = minx\n        self.miny = miny\n        self.maxx = maxx\n        self.maxy = maxy\n\n    def empty(self):\n        return ( self.maxx < self.minx ) or ( self.maxy < self.miny )\n\n    def expand_with_box(self, box):\n        if box.empty(): return\n        if self.empty():\n            self.minx = box.minx\n            self.miny = box.miny\n            self.maxx = box.maxx\n            self.maxy = box.maxy\n            return\n        if box.minx < self.minx: self.minx = box.minx\n        if box.miny < self.miny: self.miny = box.miny\n        if box.maxx > self.maxx: self.maxx = box.maxx\n        if box.maxy > self.maxy: self.maxy = box.maxy\n\n    def add_point(self, pt):\n        self.expand_with_box(BBox(pt[0], pt[1], pt[0], pt[1]))\n\n    def extend (self, val):\n        # Note: val can be negative\n        if self.empty(): return\n        self.minx = self.minx - val\n        self.miny = self.miny - val\n        self.maxx = self.maxx + val\n        self.maxy = self.maxy + val\n        if self.empty():\n            # Ensure all empty boxes are identical. For some reason\n            # the line self = BBox() does not work.  So need to assign\n            # the members one by one.\n            b = BBox()\n            self.minx = b.minx\n            self.miny = b.miny\n            self.maxx = b.maxx\n            self.maxy = b.maxy\n\n    def width(self):\n        if self.empty(): return 0\n        return self.maxx - self.minx\n\n    def height(self):\n        if self.empty(): return 0\n        return self.maxy - self.miny\n\n    def __repr__(self):\n        return \"BBox %f %f -> %f %f\" % (self.minx,self.miny,self.maxx,self.maxy)\n\n# Create an object made of an image name and a box. Sort an array of\n# such objects by the min coordinate of the box.\nclass StrBox:\n    def __init__(self, img_str, box):\n        self.img_str = img_str\n        self.box     = box\n\n\n# Sort by miny. If miny is same, sort by height.\ndef minyCompare(P, Q):\n    val = int(round(P.box.miny - Q.box.miny))\n    if val != 0:\n        return val\n    val = int(round((P.box.maxy - P.box.miny) - (Q.box.maxy - Q.box.miny)))\n    return val\n\ndef sort_by_miny(imgVec, boxVec):\n\n    S = []\n    for i in range(len(imgVec)):\n        S.append(StrBox(copy.deepcopy(imgVec[i]), copy.deepcopy(boxVec[i])))\n\n    # Sorting changed in Python 3\n    if sys.version_info[0] < 3:\n        S.sort(minyCompare)\n    else:\n        from functools import cmp_to_key\n        S.sort(key=cmp_to_key(minyCompare))\n         \n    imgVec = []\n    for i in range(len(S)):\n        imgVec.append(S[i].img_str)\n    return imgVec\n\ndef set_or_wipe_image_tags(IMAGE, merged_vals):\n\n    # Wipe most image tags as they differ from image to image.\n    # Replace some tags with their average/min/max values across the images.\n\n    # Values we are supposed to keep, by borrowing them from one image.\n    keep_ar = [\"SATID\", \"MODE\", \"SCANDIRECTION\", \"CATID\", \"TLCTIME\",\n               \"NUMTLC\", \"TLCLISTList\", \"FIRSTLINETIME\", \"AVGLINERATE\",\n               \"EXPOSUREDURATION\", \"CLOUDCOVER\", \"RESAMPLINGKERNEL\",\n               \"POSITIONKNOWLEDGESRC\",\n               \"ATTITUDEKNOWLEDGESRC\", \"REVNUMBER\"]\n\n    # Values we will average\n    for key in merged_vals:\n        keep_ar.append(key)\n    \n    # Put in a set\n    keep_tags = set(keep_ar)\n\n    # Read existing tags.\n    tags = []\n    for i in range(len(IMAGE)):\n        tag = IMAGE[i].tag\n        tags.append(tag)\n\n    # Wipe some of the tags.\n    for tag in tags:\n        if not tag in keep_tags:\n            IMAGE.remove( IMAGE.find (tag) )\n\n    # Set the averages\n    for key in merged_vals:\n        if IMAGE.find(key) is not None and merged_vals[key] is not None:\n            IMAGE.find(key).text = str(merged_vals[key])\n                  \ndef get_corners(A, B, indices):\n    # Each corner of C will be picked either from A or from B,\n    # depending on the value of 'indices' for that corner.\n    C=[]\n    for i in range(len(indices)):\n        j = indices[i]\n        if j == 0:\n            C.append(A[i])\n        else:\n            C.append(B[i])\n\n    return C\n\ndef signed_triangle_area(P, Q, R):\n    return ( (Q[0]-P[0])*(R[1]-Q[1])-(Q[1]-P[1])*(R[0]-Q[0]) )/2.0\n\ndef find_combined_box(A, B):\n\n    # Given two boxes, A and B, find the rough box containing both A and B.\n    # Both A and B is a vector of 4 points, each point having two\n    # coordinates, x and y.\n\n    # Each of the corners of the new box will be one of the corresponding\n    # corners of either A or B. Pick the new corners as to maximize\n    # the area of the obtained box.\n\n    if len(A) == 0: return B\n    if len(A) != 4 or len(B) != 4:\n        raise Exception('Error', \"A box is supposed to have 4 corners.\")\n\n    max_area = 0\n    max_indices = []\n    for a in range(2):\n        for b in range(2):\n            for c in range(2):\n                for d in range(2):\n                    indices = [a, b, c, d]\n                    C = get_corners(A, B, indices)\n                    area = abs( signed_triangle_area(C[0], C[1], C[2]) +\n                                signed_triangle_area(C[2], C[3], C[0]))\n                    if area > max_area:\n                        max_area = area\n                        max_indices = indices\n\n    return get_corners(A, B, max_indices)\n\n# The lon-lat box for the combined camera is the union of the\n# lon-lat boxes for all the cameras. Also record the min and max\n# height values.\ndef adjust_camera_corners(BAND, all_ll_corners, ref_htbox):\n\n    if len(all_ll_corners) == 0: \n        return # no data\n\n    # Each camera is a rectangle. Find the rough bounding box of all rectangles.\n    out_corners = []\n    for corner_vec in all_ll_corners:\n        out_corners = find_combined_box(out_corners, corner_vec)\n\n    BAND.find(\"ULLON\").text = str(out_corners[0][0])\n    BAND.find(\"ULLAT\").text = str(out_corners[0][1])\n\n    BAND.find(\"URLON\").text = str(out_corners[1][0])\n    BAND.find(\"URLAT\").text = str(out_corners[1][1])\n\n    BAND.find(\"LRLON\").text = str(out_corners[2][0])\n    BAND.find(\"LRLAT\").text = str(out_corners[2][1])\n\n    BAND.find(\"LLLON\").text = str(out_corners[3][0])\n    BAND.find(\"LLLAT\").text = str(out_corners[3][1])\n\n    try: \n        # Distribute the min and max height values \n        BAND.find(\"ULHAE\").text = str(ref_htbox.minx)\n        BAND.find(\"URHAE\").text = str(ref_htbox.maxx)\n        BAND.find(\"LRHAE\").text = str(ref_htbox.minx)\n        BAND.find(\"LLHAE\").text = str(ref_htbox.maxx)\n        \n    except:\n        pass\n\ndef find_bands(node):\n\n    # Extract the bands at the current node. Usually we have\n    # panchromatic data, that corresponds to BAND_P. The\n    # other ones are for multispectral data.\n    bands = []\n    for b in [\"BAND_P\",                     # pan\n              \"BAND_B\", \"BAND_G\", \"BAND_R\", # rgb\n              \"BAND_N\", \"BAND_C\", \"BAND_Y\", \"BAND_RE\", \"BAND_N2\" # other\n              ]:\n        p = node.find(b)\n        if p is not None:\n            bands.append(p)\n\n    if len(bands) == 0:\n        raise Exception('InputError', \"XML files lack information on bands.\")\n\n    return bands\n\n# bugfix for the situations: ullon = -178.6 and urlon = 178.34\n#                            ullon =  178.6 and urlon = -178.34\ndef maybe_swap_add_360(a, b):\n    if b - a > 270: # ullon = -178.6 and urlon = 178.34\n        tmp = b\n        b   = a + 360\n        a   = tmp\n    if a - b > 270: # ullon = 178.6 and urlon = -178.34\n        b = b + 360\n    return [a, b]\n    \ndef read_corners(band):\n    '''Read in the corners from a DG XML file from one band.\n       The points are stored in clockwise order from the upper left.'''\n\n    llbox = BBox()\n    ll_corners = []\n\n    ullon = float(band.find(\"ULLON\").text)\n    ullat = float(band.find(\"ULLAT\").text)\n\n    urlon = float(band.find(\"URLON\").text)\n    urlat = float(band.find(\"URLAT\").text)\n\n    lrlon = float(band.find(\"LRLON\").text)\n    lrlat = float(band.find(\"LRLAT\").text)\n\n    lllon = float(band.find(\"LLLON\").text)\n    lllat = float(band.find(\"LLLAT\").text)\n\n    # Bugfix for the situation when ullon = +/-178.6 and urlon = +/-178.34\n    [ullon, urlon] = maybe_swap_add_360(ullon, urlon)\n    [lllon, lrlon] = maybe_swap_add_360(lllon, lrlon)\n    \n    llbox.add_point([ullon, ullat])\n    llbox.add_point([urlon, urlat])\n    llbox.add_point([lrlon, lrlat])\n    llbox.add_point([lllon, lllat])\n\n    ll_corners.append([ullon, ullat])\n    ll_corners.append([urlon, urlat])\n    ll_corners.append([lrlon, lrlat])\n    ll_corners.append([lllon, lllat])\n\n    return (llbox, ll_corners)\n\n# Provide the image files that make up the composite. We assume the XML\n# files are in the same directory and end with extension \".xml\" or \".XML\".\ndef read_xml(filename, options, xml_keys):\n\n    tree = ET.parse(filename)\n    root = tree.getroot()\n    IMD  = root.find(\"IMD\")\n    GEO  = root.find(\"GEO\")\n    EPH  = root.find(\"EPH\")\n    ATT  = root.find(\"ATT\")\n    RPB  = root.find(\"RPB\")\n\n    IMAGE = IMD.find(\"IMAGE\")\n    tlctime = parse_time(IMAGE.find(\"TLCTIME\").text.strip(),\n                         \"%Y-%m-%dT%H:%M:%S.%fZ\")\n    tlclist = []\n    for tlc_item in IMAGE.find(\"TLCLISTList\").findall(\"TLCLIST\"):\n        tokens = tlc_item.text.strip().split(' ')\n        tlclist.append([float(tokens[0]), float(tokens[1])])\n    if len(tlclist) == 1:\n        direction = 1.0\n        if IMAGE.find(\"SCANDIRECTION\").text.lower() != \"forward\":\n            direction = -1.0\n        linerate = float(IMAGE.find(\"AVGLINERATE\").text)\n        tlclist.append([(linerate+tlclist[0][0]), (tlclist[0][1]+direction)])\n    firstlinetime = parse_time(IMAGE.find(\"FIRSTLINETIME\").text,\n                               \"%Y-%m-%dT%H:%M:%S.%fZ\")\n\n    # Pull a bunch of values into a dictionary\n    xml_vals = {}\n    for key in xml_keys:\n        if IMAGE.find(key) is not None:\n            xml_vals[key] = float(IMAGE.find(key).text)\n        else:\n            xml_vals[key] = None\n\n    image_size = []\n    image_size.append( int(IMD.find(\"NUMCOLUMNS\").text) )\n    image_size.append( int(IMD.find(\"NUMROWS\").text) )\n\n    llbox = BBox()\n    htbox = BBox()\n    ll_corners = []\n\n    for band in find_bands(IMD):\n\n      # The longitude-latitude box. Note: Later when we create\n      # the adjusted box we will traverse the corners in\n      # exactly the same order as here, so this and that\n      # code blocks must be kept consistent.\n      # Verify that all bands have the same corners\n      try:\n          ll_box_curr, ll_corners_curr =  read_corners(band)\n          for i in range(0,4):\n              llbox.add_point( [ll_corners_curr[i][0], ll_corners_curr[i][1]] )\n\n      except Exception as e:\n          print(\"Warning: File \" + filename + \" lacks longitude/latitude information.\")\n\n      if len(ll_corners) == 0:\n          ll_corners = ll_corners_curr\n      if ll_corners != ll_corners_curr:\n          raise Exception('InputError', \"File \" + filename\n                          + \" has multiple bands with inconsistent LON/LAT info.\")\n\n    if not options.skip_rpc_gen:\n        # The height range, [ht_min, ht_max]. We store it as a 2D box\n        # as to not create an interval class.\n        try:\n            ht_scale  = float(RPB.find(\"IMAGE\").find(\"HEIGHTSCALE\").text)\n            ht_offset = float(RPB.find(\"IMAGE\").find(\"HEIGHTOFFSET\").text)\n            min_ht = -ht_scale + ht_offset\n            max_ht =  ht_scale + ht_offset\n            htbox = BBox(min_ht, min_ht, max_ht, max_ht)\n        except Exception as e:\n            raise Exception('InputError', \"File \" + filename\n                            + \" lacks RPC model information.\")\n\n    # Get the pitch, originx, and pd. Verify that all bands are consistent.\n    pitch = None; originx = None; pd = None\n    for band in find_bands(GEO.find(\"DETECTOR_MOUNTING\")):\n        DET_ARRAY      = band.find(\"DETECTOR_ARRAY\")\n        curr_pitch     = float(DET_ARRAY.find(\"DETPITCH\").text)\n        curr_originx   = DET_ARRAY.find(\"DETORIGINX\").text\n        curr_pd        = GEO.find(\"PRINCIPAL_DISTANCE\").find(\"PD\").text\n\n        if pitch   is None: pitch   = curr_pitch\n        if originx is None: originx = curr_originx\n        if pd      is None: pd      = curr_pd\n\n        if pitch != curr_pitch or originx != curr_originx or pd != curr_pd:\n            raise Exception('InputError', \"File \" + filename\n                            + \" has inconsistent info across bands.\")\n\n    # Note: We concatenate all eph values into one single array,\n    # the proper structure would be an array of arrays.\n    eph_list = []\n    for eph_item in EPH.find(\"EPHEMLISTList\").findall(\"EPHEMLIST\"):\n        tokens = eph_item.text.strip().split(' ')\n        eph_list.extend(tokens)\n\n    # Note: We concatenate all att values into one single array,\n    # the proper structure would be an array of arrays.\n    att_list = []\n    for att_item in ATT.find(\"ATTLISTList\").findall(\"ATTLIST\"):\n        tokens = att_item.text.strip().split(' ')\n        att_list.extend(tokens)\n\n    return [tlctime, tlclist, firstlinetime, image_size, pitch,\n            originx, pd, eph_list, att_list, llbox, htbox, ll_corners,\n            xml_vals]\n\ndef tlc_time_lookup( tlctime, tlclist, pixel_y ):\n    fraction = (pixel_y - tlclist[0][0]) / (tlclist[1][0] - tlclist[0][0])\n    seconds_off = fraction * ( tlclist[1][1] - tlclist[0][1]) + tlclist[0][1]\n    return tlctime + timedelta(seconds=seconds_off)\n\ndef tlc_pixel_lookup( tlctime, tlclist, time ):\n    difference = time - tlctime\n    seconds_since_ref = difference.microseconds /  10.0**6 + difference.seconds + difference.days*24.0*3600.0\n    fraction = ( seconds_since_ref - tlclist[0][1] ) / (tlclist[1][1] - tlclist[0][1]);\n    return fraction * ( tlclist[1][0] - tlclist[0][0] ) + tlclist[0][0]\n\n# Get the xml file name from the .ntf or .tif file name. The xml file\n# must exist and end in either '.xml' or '.XML'.\ndef xml_name( filename ):\n\n    path, ext = os.path.splitext(filename)\n    xml_file_l = path + \".xml\"\n    xml_file_u = path + \".XML\"\n\n    if os.path.isfile(xml_file_l):\n        xml_file = xml_file_l\n    elif os.path.isfile(xml_file_u):\n        xml_file = xml_file_u\n    else:\n        raise Exception('InputError', 'Cannot find any of: '\n                        + xml_file_l + ' ' + xml_file_u)\n\n    return xml_file\n\ndef estimate_ground_resolution( xml_tree ):\n    '''Parse the DG XML file to estimate the ground resolution in meters per pixel'''\n\n    # Retrieve the image size and the four corners from the XML file\n    root = xml_tree.getroot()\n    imd  = root.find(\"IMD\")\n    num_cols = float(imd.find(\"NUMCOLUMNS\").text)\n    num_rows = float(imd.find(\"NUMROWS\").text)\n\n    bands = find_bands(imd)\n    band  = bands[0]\n    ll_box, ll_corners = read_corners(band)\n\n    # Estimate meters per pixel in the X and Y directions of the image.\n    top_dist   = lonlat_point_distance(ll_corners[0], ll_corners[1])\n    bot_dist   = lonlat_point_distance(ll_corners[2], ll_corners[3])\n    left_dist  = lonlat_point_distance(ll_corners[3], ll_corners[0])\n    right_dist = lonlat_point_distance(ll_corners[1], ll_corners[2])\n\n    x_dist     = (top_dist  + bot_dist  ) / 2.0\n    y_dist     = (left_dist + right_dist) / 2.0\n    gsd_x      = x_dist / num_cols\n    gsd_y      = y_dist / num_rows\n\n    # Just take the average of the two sizes\n    return (gsd_x + gsd_y) / 2.0\n\ndef run_cmd( cmd, options ):\n    if options.dryrun or options.verbose: \n        print(cmd)\n    if options.dryrun: return\n    code = subprocess.call(cmd, shell=True)\n    if code:\n        raise Exception('ProcessError', 'Non zero return code ('+str(code)+')')\n\ndef scale_xml_element(elem, scale):\n    tokens = elem.text.strip().split(' ')\n    for i in range(len(tokens)):\n        tokens[i] = str(float(tokens[i]) * scale)\n    elem.text = \" \".join(tokens)\n\n# convert a list of lists to a string, to be able\n# to use it as a hash key.\ndef listlist_to_str(listlist):\n    ans = \"\"\n    for list_entry in listlist:\n        for val in list_entry:\n            ans += str(val) + \" \"\n    return ans\n\ndef examine_discrepancy_in_arrays(A, B, ignore_incon):\n\n    if len(A) != len(B):\n        raise Exception('InputError', 'Cannot process arrays of different lengths.')\n\n    max_err = 1.0e-8\n    print(\"Will go on if the relative discrepancies are less than %g.\" % max_err)\n\n    observed_max_err = 0\n    num_messages = 0\n    max_num_messages = 10\n    for i in range(len(A)):\n        if A[i] != B[i]:\n            a=float(A[i])\n            b=float(B[i])\n            if a != b:\n                err = abs( (a-b)/a )\n                num_messages = num_messages + 1\n\n                if err > observed_max_err:\n                    observed_max_err = err\n                    \n                if err > max_err and num_messages < max_num_messages:\n                    print(\"Warning: Disagreeing values and relative error: %0.18g %0.18g %0.18g\" \\\n                      % (a, b, err))\n                    continue\n                \n                if err > max_err and num_messages == max_num_messages:\n                    print(\"Will stop printing more warnings.\")\n                    \n    print('Maximum observed relative discrepancy is ' + str(observed_max_err))\n    if observed_max_err > max_err:\n        if not ignore_incon:\n            print(\"Error is too large. You can force dg_mosaic to continue working with these potentially inconsistent files by using the option --ignore-inconsistencies. You are doing this at your own risk.\")\n            raise Exception('InputError', 'Bailing out.')\n        else:\n            print(\"Will continue working with these inconsistent files. You are doing this at your own risk.\")\n\ndef main():\n\n    try:\n        try:\n            usage = 'dg_mosaic [--help] <all ntf or tif files that make up the observation>\\n' + get_asp_version()\n\n            parser = optparse.OptionParser(usage=usage)\n            parser.set_defaults(dryrun=False)\n            parser.set_defaults(preview=False)\n            parser.set_defaults(gdaldir=\"\")\n            parser.set_defaults(target_resolution=-1.0)\n            parser.set_defaults(reduce_percent=100.0)\n            parser.set_defaults(output_prefix=\"\")\n            parser.set_defaults(band=0)\n            parser.set_defaults(input_nodata_value=None)\n            parser.set_defaults(output_nodata_value=None)\n            parser.add_option(\"--target_resolution\", dest=\"target_resolution\", type=\"float\",\n                              help=\"Choose the output resolution in meters per pixel on the ground (note that a coarse resolution may result in aliasing).\")\n            parser.add_option(\"--reduce-percent\", dest=\"reduce_percent\", type=\"float\",\n                              help=\"Render a reduced resolution image and xml based on this percentage. This can result in aliasing artifacts.\")\n            parser.add_option(\"-o\", \"--output-prefix\", dest=\"output_prefix\", type=\"str\",\n                              help=\"The prefix for the output .tif and .xml files.\")\n            parser.add_option(\"--ot\", dest=\"output_type\", type=\"str\", default = \"Float32\",\n                              help=\"Output data type. Supported types: Byte, UInt16, Int16, UInt32, Int32, Float32. If the output type is a kind of integer, values are rounded and then clamped to the limits of that type.\")\n            parser.add_option(\"--cache-size\", dest=\"cache_size\", type=\"int\",\n                              default=1024,\n                              help=\"Set the system cache size, in MB, for each process.\")\n            parser.add_option(\"--threads\", dest=\"threads\", type=\"int\", default=4,\n                              help=\"How many threads to use.\")\n            parser.add_option(\"--band\", dest=\"band\", type=\"int\",\n                              help=\"Which band to use (for multi-spectral images).\")\n            parser.add_option(\"--input-nodata-value\", dest=\"input_nodata_value\", type=\"float\",\n                              help=\"Nodata value to use on input; input pixel values less than or equal to this are considered invalid.\")\n            parser.add_option(\"--output-nodata-value\", dest=\"output_nodata_value\", type=\"float\",\n                              help=\"Nodata value to use on output.\")\n            parser.add_option(\"--rpc-penalty-weight\", dest=\"penalty_weight\", type=\"float\",\n                              default=0.01,\n                              help=\"The weight to use to penalize higher order RPC coefficients when generating the combined RPC model. Higher penalty weight results in smaller such coefficients.\")\n            parser.add_option('--fix-seams', dest='fix_seams', default=False,\n                              action='store_true', help=\"Fix seams in the output mosaic due to inconsistencies between image and camera data using interest point matching.\")\n            parser.add_option('--ignore-inconsistencies', dest='ignore_incon', default=False,\n                              action='store_true', help=\"Ignore the fact that some of the files to be mosaicked have inconsistent EPH/ATT values. Do this at your own risk.\")\n            parser.add_option(\"--preview\", dest=\"preview\",\n                              action=\"store_true\",\n                              help=\"Render a small 8 bit png of the input for preview.\")\n            parser.add_option(\"-v\", \"--verbose\", dest=\"verbose\",\n                              action=\"store_true\", help=\"Increase verbosity.\")\n            parser.add_option(\"-n\", \"--dry-run\", dest=\"dryrun\",\n                              action=\"store_true\",\n                              help=\"Make the calculations, but just print out the commands.\")\n            parser.add_option('--skip-rpc-gen', dest='skip_rpc_gen', default=False,\n                              action='store_true', help=\"Skip RPC model generation\")\n            parser.add_option('--skip-tif-gen', dest='skip_tif_gen', default=False,\n                              action='store_true', help=\"Skip TIF file generation.\")\n            parser.add_option('--wipe-att-eph', dest='wipe_att_eph', default=False,\n                              action='store_true', help=\"Wipe ATT and EPH from final RPC.\")\n            # This option is obsolete. We now ship gdal_translate with ASP.\n            parser.add_option(\"--gdal-dir\", dest=\"gdaldir\", help=optparse.SUPPRESS_HELP)\n\n            (options, args) = parser.parse_args()\n\n            # Transform 50.0 into just 50\n            if options.reduce_percent == int(options.reduce_percent):\n                options.reduce_percent = int(options.reduce_percent)\n\n            # Quit if the user provided conflicting resolution options\n            if (options.reduce_percent != 100) and (options.target_resolution > 0):\n                raise_error('Cannot specify both --reduce-percent and --target-resolution!')\n\n            if not args:\n                parser.print_help()\n                raise_error('Need .ntf or .tif files.', code=2)\n\n            if len(options.gdaldir): options.gdaldir += \"/\"\n\n        except optparse.OptionError as msg:\n            raise Usage(msg)\n    \n        if options.output_prefix == \"\":\n            options.output_prefix = args[0].split('-')[-1].split('.')[0]\n        if options.output_prefix == \"\":\n            raise_error('Empty output prefix. Please set it via the ' + \\\n                '--output-prefix option', code=2)\n        out_dir=os.path.dirname(options.output_prefix)\n        if len(out_dir)==0: \n            out_dir='.'\n        if not os.path.exists(out_dir): \n            os.makedirs(out_dir)\n\n        # Read these fields from each XML, and then find the average\n        # or min or max value for each field.\n        xml_keys = [\"MEANPRODUCTGSD\", \"MEANCOLLECTEDGSD\",\n                    \"MINCOLLECTEDROWGSD\", \"MAXCOLLECTEDROWGSD\", \n                    \"MEANCOLLECTEDROWGSD\", \"MINCOLLECTEDCOLGSD\", \n                    \"MAXCOLLECTEDCOLGSD\", \"MEANCOLLECTEDCOLGSD\",\n                    \"MEANSUNEL\", \n                    \"MEANSUNAZ\", \"MEANSATAZ\", \"MEANSATEL\", \"MEANINTRACKVIEWANGLE\",\n                    \"MEANCROSSTRACKVIEWANGLE\", \"MEANOFFNADIRVIEWANGLE\"\n                    ]\n        \n        # Do a couple of passes at parsing the xml files and\n        # extracting and combining the data. At the second pass, the\n        # files (stored in args) and all other data will be in the\n        # order in which they need to be mosaiced.\n        for it in range(2):\n\n            all_ll_corners = []\n            tlclist_arr    = []\n\n            # Initialize merged_vals\n            merged_vals = {}\n            num_vals = {}\n            for key in xml_keys:\n                m = re.match(r'^.*?MEAN', key, re.IGNORECASE)\n                if m:\n                    merged_vals[key] = 0\n                    num_vals[key] = 0\n                else:\n                    merged_vals[key] = None\n                    num_vals[key] = None\n                    \n            # We reference everything from the perspective of the first\n            # image. So lets load it up first into our special variables.\n            [ref_tlctime, ref_tlclist, ref_firstlinetime, ref_image_size,\n             ref_pitch, ref_originx, ref_pd, ref_eph_list, ref_att_list,\n             ref_llbox, ref_htbox, ll_corners, xml_vals] \\\n             = read_xml( xml_name(args[0]), options, xml_keys)\n            all_ll_corners.append(ll_corners)\n            tlclist_arr.append(ref_tlclist)\n\n            for key in xml_keys:\n                if key in xml_vals and xml_vals[key] is not None:\n                    merged_vals[key] = xml_vals[key]\n                    num_vals[key] = 1\n             \n            # orig_sizes[i] holds the original size of i-th image. After\n            # we scale i-th image by i_th_image_pitch/0_th_image_pitch, we\n            # store the new image box in placements[i].\n            orig_sizes = []\n            placements = []\n            orig_sizes.append(ref_image_size)\n            shiftx = 0\n            shifty = tlc_pixel_lookup(ref_tlctime, ref_tlclist, ref_firstlinetime)\n            placement = BBox(shiftx, shifty,\n                             shiftx + ref_image_size[0],\n                             shifty + ref_image_size[1])\n            placements.append( placement )\n\n            for filename in args[1:]:\n\n                [tlctime, tlclist, firstlinetime, image_size, pitch, originx, pd,\n                 eph_list, att_list, llbox, htbox, ll_corners, xml_vals] \\\n                 = read_xml( xml_name(filename), options, xml_keys)\n                all_ll_corners.append(ll_corners)\n                tlclist_arr.append(tlclist)\n\n                # Sanity checks\n                if ref_originx != originx:\n                    raise Exception('InputError', 'Must have the same originx in: '\n                                    + xml_name(args[0]) + ' ' + xml_name(filename) )\n                if ref_pd != pd:\n                    raise Exception('InputError', 'Must have the same pd in: '\n                                    + xml_name(args[0]) + ' ' + xml_name(filename) )\n\n                if len(ref_eph_list) != len(eph_list):\n                    raise Exception('InputError', 'Must have the same number of ephem values in: '\n                                    + xml_name(args[0]) + ' and ' + xml_name(filename) )\n\n                if ref_eph_list != eph_list:\n                    # Normally we'd expect the same ephh in all files, as after all,\n                    # they are components of the same observation. Oddly, in practice\n                    # that is not always so. Print a warning if the discrepancies are\n                    # minor, and thow an error if they are major.\n                    print(\"Warning: ephem values must be identical in \" \\\n                          + xml_name(args[0]) + ' and ' + xml_name(filename))\n                    examine_discrepancy_in_arrays(ref_eph_list, eph_list, options.ignore_incon)\n\n                if len(ref_att_list) != len(att_list):\n                    raise Exception('InputError', 'Must have the same number of att values in: '\n                                    + xml_name(args[0]) + ' and ' + xml_name(filename) )\n\n                if ref_att_list != att_list:\n                    # Same thing as for ephem.\n                    print(\"Warning: att values must be identical in \" \\\n                          + xml_name(args[0]) + ' and ' + xml_name(filename))\n                    examine_discrepancy_in_arrays(ref_att_list, att_list, options.ignore_incon)\n\n                orig_sizes.append(image_size)\n\n                shiftx = 0\n                shifty = tlc_pixel_lookup(ref_tlctime, ref_tlclist, firstlinetime)\n\n                # We compensate for the fact that different images\n                # may have different physical pixel sizes.\n                pitch_ratio = pitch/ref_pitch\n                scaled_image_size = [image_size[0]*pitch_ratio,\n                                     image_size[1]*pitch_ratio]\n\n                placement = BBox(shiftx, shifty,\n                                 shiftx + scaled_image_size[0],\n                                 shifty + scaled_image_size[1])\n                placements.append( placement )\n\n                ref_llbox.expand_with_box(llbox)\n                ref_htbox.expand_with_box(htbox)\n\n                for key in xml_keys:\n                    if xml_vals[key] is None: continue\n                    m_mean = re.match(r'^.*?MEAN', key, re.IGNORECASE)\n                    m_max  = re.match(r'^.*?MAX',  key, re.IGNORECASE)\n                    m_min  = re.match(r'^.*?MIN',  key, re.IGNORECASE)\n                    if m_mean:\n                        # Mean of all means\n                        merged_vals[key] += xml_vals[key]\n                        num_vals[key] += 1\n                    elif m_max:\n                        # Max of all max\n                        if merged_vals[key] is not None:\n                            merged_vals[key] = max(merged_vals[key], xml_vals[key])\n                        else: \n                            merged_vals[key] = xml_vals[key]\n                    elif m_min:\n                        # Min of all min\n                        if merged_vals[key] is not None:\n                            merged_vals[key] = min(merged_vals[key], xml_vals[key])\n                        else: \n                            merged_vals[key] = xml_vals[key]\n\n            # Complete the process of computing the averages\n            for key in xml_keys:\n                m_mean = re.match(r'^.*?MEAN', key, re.IGNORECASE)\n                if m_mean and num_vals[key] != 0 and merged_vals[key] is not None:\n                    merged_vals[key] /= num_vals[key]\n\n            boundary = BBox()\n            for placement in placements:\n                boundary.expand_with_box(placement)\n\n            for i in range(len(args)):\n                placements[i].miny -= boundary.miny\n                placements[i].maxy -= boundary.miny\n\n            # Ensure that the images are placed in order, from top to\n            # bottom.  So the second image will partially cover the first\n            # image, etc.  This is a bug fix for the situation when some\n            # images have a black area at the bottom.\n            s_args = sort_by_miny(args, placements)\n\n            if it == 0:\n                args = s_args[:] # deep copy\n        # End passes loop\n\n        # Look for duplicate files that will insert at same location\n        # and with the same tlclist. Files that do this would be the\n        # R?C1 variants that have the same XML file due to download\n        # errors or simplying mixing of R?C1 and the other format.\n        seen = set()\n        for i in range(len(args)):\n\n            # form a tuple of a string and a number\n            val = listlist_to_str(tlclist_arr[i]), placements[i].miny\n\n            if val in seen:\n                raise Exception('InputError', 'Input images have same input ' +\n                                'location which could be caused by repeated ' +\n                                'XML file or invalid TLC information.')\n            seen.add(val)\n\n        if options.target_resolution > 0:\n            # Compute the reduce percentage based on GSD\n            current_gsd = estimate_ground_resolution(ET.parse(xml_name(args[0])))\n            options.reduce_percent = (current_gsd / options.target_resolution) * 100\n\n        # Compute scale factor for adjusting XML values\n        scale  = options.reduce_percent / 100.0\n        suffix = \".r\" + str(options.reduce_percent)\n\n        # The band to output\n        if options.band > 0:\n            suffix += \".b\" + str(options.band)\n\n        # Write a composite scaled XML file. We first create the xml at\n        # the original resolution and then we scale it.\n        tree = ET.parse(xml_name(args[0]))\n        root = tree.getroot()\n        imd = root.find(\"IMD\")\n        imd.find(\"NUMROWS\").text = str(int(boundary.height()))\n        imd.find(\"NUMCOLUMNS\").text = str(int(boundary.width()))\n        for tlc_item in imd.find(\"IMAGE\").find(\"TLCLISTList\").findall(\"TLCLIST\"):\n            tokens        = tlc_item.text.strip().split(' ')\n            tokens[0]     = str(float(tokens[0])- boundary.miny)\n            tlc_item.text = \" \".join(tokens)\n        first_line_item = root.find(\"IMD\").find(\"IMAGE\").find(\"FIRSTLINETIME\")\n        tlc_lookup      = tlc_time_lookup( ref_tlctime, ref_tlclist, boundary.miny )\n        # The verbose operation below is needed for python 2.4\n        first_line_item.text = tlc_lookup.strftime(\"%Y-%m-%dT%H:%M:%S\") + '.' \\\n                               + format_microsec(str(tlc_lookup.microsecond)) + \"Z\"\n\n        sep = \",\"\n        if not options.skip_rpc_gen:\n            # Find the best-fitting RPC coefficients.\n            # TODO(oalexan1): Using temporary files can be error-prone\n            # as users may delete those by mistake. Better use a filename\n            # derived from the input file name.\n            temp_xml_file = tempfile.NamedTemporaryFile(suffix = \".xml\",\n                                                        dir = out_dir)\n            write_tree(tree, temp_xml_file.name)\n            rpc_cmd = \"rpc_gen\"\n            rpc_args = ['--penalty-weight', str(options.penalty_weight),\n                        '--output-prefix', options.output_prefix,\n                        '--lon-lat-height-box',\n                        str(ref_llbox.minx), str(ref_llbox.miny),\n                        str(ref_htbox.minx), str(ref_llbox.maxx),\n                        str(ref_llbox.maxy), str(ref_htbox.maxx), temp_xml_file.name]\n            rpc_model = run_and_parse_output( rpc_cmd, rpc_args, sep,\n                                              options.verbose )\n            try:\n                # Set the RPC model info. Wipe all other outdated info.\n                RPI = root.find(\"RPB\").find(\"IMAGE\")\n\n                # TODO: Note that we keep the first encountered value.\n                # May need to do some tweaks.\n                # Need to keep them for SETSM to parse things properly.\n                #if RPI.find(\"ERRBIAS\") != None: RPI.remove( RPI.find (\"ERRBIAS\") )\n                #if RPI.find(\"ERRRAND\") != None: RPI.remove( RPI.find (\"ERRRAND\") )\n\n                RPI.find(\"SAMPSCALE\").text    = rpc_model[\"uv_scale\"][0]\n                RPI.find(\"LINESCALE\").text    = rpc_model[\"uv_scale\"][1]\n\n                RPI.find(\"SAMPOFFSET\").text   = rpc_model[\"uv_offset\"][0]\n                RPI.find(\"LINEOFFSET\").text   = rpc_model[\"uv_offset\"][1]\n\n                RPI.find(\"LONGSCALE\").text    = rpc_model[\"llh_scale\"][0]\n                RPI.find(\"LATSCALE\").text     = rpc_model[\"llh_scale\"][1]\n                RPI.find(\"HEIGHTSCALE\").text  = rpc_model[\"llh_scale\"][2]\n\n                RPI.find(\"LONGOFFSET\").text   = rpc_model[\"llh_offset\"][0]\n                RPI.find(\"LATOFFSET\").text    = rpc_model[\"llh_offset\"][1]\n                RPI.find(\"HEIGHTOFFSET\").text = rpc_model[\"llh_offset\"][2]\n\n                RPI.find(\"LINENUMCOEFList\").find(\"LINENUMCOEF\").text = \" \".join(rpc_model[\"line_num\"])\n                RPI.find(\"LINEDENCOEFList\").find(\"LINEDENCOEF\").text = \" \".join(rpc_model[\"line_den\"])\n                RPI.find(\"SAMPNUMCOEFList\").find(\"SAMPNUMCOEF\").text = \" \".join(rpc_model[\"samp_num\"])\n                RPI.find(\"SAMPDENCOEFList\").find(\"SAMPDENCOEF\").text = \" \".join(rpc_model[\"samp_den\"])\n            except Exception as e:\n                print('Caught exception: ' + str(e))\n                raise Exception('InputError', \"File \" + args[0] +\n                                \" lacks complete RPC model information.\")\n        else:\n            if root.find(\"RPB\") != None: root.remove( root.find (\"RPB\") )\n\n        # Wipe other outdated info\n        if root.find(\"TIL\")   != None: root.remove( root.find(\"TIL\") )\n\n        # Adjust image corners\n        for band in find_bands(imd):\n            adjust_camera_corners(band, all_ll_corners, ref_htbox)\n\n        # Adjust the GSD if images are reduced in resolution\n        if options.reduce_percent != 100:\n            for key in merged_vals:\n                m = re.match(r'^.*?GSD', key)\n                if m and merged_vals[key] is not None:\n                    merged_vals[key] *= 100.0/float(options.reduce_percent)\n\n        # Keep some values, average/combine some, and wipe the rest\n        set_or_wipe_image_tags(root.find(\"IMD\").find(\"IMAGE\"), merged_vals)\n\n        # Scale the xml file\n        # Update NUMROWS and NUMCOLUMNS\n        nrows = int(boundary.height() * scale)\n        ncols = int(boundary.width()  * scale)\n        imd = root.find(\"IMD\")\n        imd.find(\"NUMROWS\").text = str(nrows)\n        imd.find(\"NUMCOLUMNS\").text = str(ncols)\n        print(\"Output image size: %dx%d px\" % (nrows, ncols))\n\n        # Update TLCList, AVGLineRate, ExposureDur\n        image = imd.find(\"IMAGE\")\n        for tlc_item in image.find(\"TLCLISTList\").findall(\"TLCLIST\"):\n            tokens = tlc_item.text.strip().split(' ')\n            tokens[0] = str(float(tokens[0]) * scale)\n            tlc_item.text = \" \".join(tokens)\n        scale_xml_element(image.find(\"AVGLINERATE\"), scale)\n        scale_xml_element(image.find(\"EXPOSUREDURATION\"), 1.0/scale)\n        # Update detector pitch. Verify that pitch is consistent\n        # accross multiple bands.\n        first_pitch_val = None\n        for band in find_bands(root.find(\"GEO\").find(\"DETECTOR_MOUNTING\")):\n            pitch = band.find(\"DETECTOR_ARRAY\").find(\"DETPITCH\")\n            if first_pitch_val is None:\n                first_pitch_val = pitch.text\n            if first_pitch_val != pitch.text:\n                raise Exception('InputError', \"Found inconsistent pitch info across bands.\")\n            scale_xml_element(pitch, 1.0/scale)\n            \n        # Scale the RPC model\n        if not options.skip_rpc_gen:\n            RPI = root.find(\"RPB\").find(\"IMAGE\")\n            scale_xml_element(RPI.find(\"SAMPSCALE\" ), scale)\n            scale_xml_element(RPI.find(\"LINESCALE\" ), scale)\n            scale_xml_element(RPI.find(\"SAMPOFFSET\"), scale)\n            scale_xml_element(RPI.find(\"LINEOFFSET\"), scale)\n\n        if options.wipe_att_eph:\n            root = tree.getroot()\n            try: root.remove(root.find(\"ATT\"))\n            except: pass\n            try: root.remove(root.find(\"EPH\"))\n            except: pass\n\n        xml_file = options.output_prefix + suffix + \".xml\"\n        print(\"Writing: \" + xml_file)\n        write_tree(tree, xml_file)\n        \n        if not options.skip_tif_gen:\n\n            tif_mosaic_opts = \"%d,%d,\" % (boundary.width(), boundary.height())\n            for i in range(len(args)):\n                print(\"  Placing %s\" % args[i])\n                print(\"    Size %dx%d at column %d and line %d\" % \\\n                      (placements[i].width(),placements[i].height(),\n                       placements[i].minx, placements[i].miny))\n\n                tif_mosaic_opts += \\\n                                (\"%s,%0.16f,%0.16f,%0.16f,%0.16f,%0.16f,%0.16f,\" %\n                                 ( os.path.abspath(args[i]),\n                                   orig_sizes[i][0], orig_sizes[i][1],\n                                   placements[i].minx, placements[i].miny,\n                                   placements[i].width(), placements[i].height()\n                                ) )\n\n            tif_file = options.output_prefix + suffix + \".tif\";\n            mosaic_cmd = \"tif_mosaic\"\n            mosaic_args = ['--threads', str(options.threads),\n                           '--cache-size', str(options.cache_size),\n                           '--output-image', tif_file,\n                           '--ot', options.output_type,\n                           '--band', str(options.band),\n                           '--reduce-percent', str(options.reduce_percent),\n                           '--image-data', tif_mosaic_opts]\n            if options.input_nodata_value is not None:\n                mosaic_args += ['--input-nodata-value', str(options.input_nodata_value)]\n            if options.output_nodata_value is not None:\n                mosaic_args += ['--output-nodata-value', str(options.output_nodata_value)]\n            if options.fix_seams:\n                mosaic_args += ['--fix-seams']\n            print(mosaic_cmd + \" \" + \" \".join(mosaic_args))\n            subprocess.call([mosaic_cmd] +  mosaic_args)\n\n            # For some reason, the xml file goes missing when\n            # tif_mosaic is invoked. Very strange. Write it again, for now.\n            write_tree(tree, xml_file)\n            \n            # Make a preview image\n            if options.preview:\n\n                # The preview image size will be around 5% of the input image size.\n                small_scale = int(round(5.0/scale))\n\n                stif_file = options.output_prefix + \".small.png\"\n                print(\"Writing: \" + stif_file)\n                cmd = \"GDAL_CACHEMAX=256 %sgdal_translate -of PNG -ot Byte -scale -outsize %d%% %d%% %s %s\" % (options.gdaldir,small_scale,small_scale,tif_file,stif_file)\n                run_cmd( cmd, options )\n\n    except Usage as err:\n        print(err.msg, file=sys.stderr)\n        return 2\n\nif __name__ == \"__main__\":\n    sys.exit(main())\n"
  },
  {
    "path": "src/asp/Tools/disp2ip.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file disp2ip.cc\n\n// Produce additional interest points based on disparity maps. This is a\n// tool for a very specialized purpose.\n\n#include <asp/Core/AspProgramOptions.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/FileUtils.h>\n#include <asp/Core/Nvm.h>\n#include <asp/Core/Macros.h>\n#include <asp/Core/DisparityProcessing.h>\n#include <asp/Sessions/StereoSessionFactory.h>\n\n#include <vw/BundleAdjustment/ControlNetwork.h>\n#include <vw/FileIO/FileUtils.h>\n\n#include <boost/program_options.hpp>\n#include <boost/filesystem.hpp>\n\nnamespace po = boost::program_options;\nnamespace fs = boost::filesystem;\n\nnamespace asp {\n  \n// Given a cnet between a set of left images, and disparities from left\n// to right images, add more interest points to the cnet based on the\n// disparities. \nvoid completeCnetFromDisparities(vw::ba::ControlNetwork               & cnet,\n                                 std::map<int, int>              const& cnet_to_raw_index,\n                                 std::vector<asp::DispImageType> const& interp_disparities,\n                                 std::vector<vw::TransformPtr>   const& left_trans,\n                                 std::vector<vw::TransformPtr>   const& right_trans) {\n\n  // All input quantities must have the same size\n  size_t num_left_images = cnet_to_raw_index.size();  \n  if (interp_disparities.size() != num_left_images ||\n      left_trans.size()         != num_left_images ||\n      right_trans.size()        != num_left_images)\n    vw::vw_throw(vw::ArgumentErr() << \"Input datasets must have the same size.\\n\");\n    \n  int net_size = cnet.size();    \n  \n  for (int i = 0; i < net_size; i++) {\n    vw::ba::ControlPoint & cp = cnet[i]; // alias\n    \n    int num_measures = cp.size();\n    for (int j = 0; j < num_measures; j++) {\n      vw::ba::ControlMeasure & cm = cp[j];\n      int cid = cm.image_id();\n      vw::Vector2 pix = cm.position();\n      vw::Vector2 sigma = cm.sigma();\n      \n      // Find the raw image index corresponding to this cnet image index\n      auto it = cnet_to_raw_index.find(cid);\n      if (it == cnet_to_raw_index.end())\n        vw::vw_throw(vw::ArgumentErr() << \"Could not find an index in the raw image list.\\n\");\n      int raw_index = it->second;\n      \n      // Apply the alignment transform to the left pixel\n      pix = left_trans[raw_index]->forward(pix);\n      \n      // Find the interpolated disparity value\n      auto disp = interp_disparities[raw_index](pix[0], pix[1]);\n      \n      // Skip invalid disparities\n      if (!is_valid(disp))\n        continue;\n      \n      // Find the right transformed pixel\n      vw::Vector2 right_pix = pix + disp.child();\n      \n      // Undo the alignment transform in the right pixel\n      right_pix = right_trans[raw_index]->reverse(right_pix);\n      \n      // Add the measure\n      cp.add_measure(vw::ba::ControlMeasure(right_pix[0], right_pix[1], \n                                            sigma[0], sigma[1], \n                                            num_left_images + raw_index));\n    }\n  }\n}\n  \nstruct DispToIpOptions: vw::GdalWriteOptions {\n  std::string left_raw_image_list, left_filtered_image_list, right_filtered_image_list,\n  optical_center_list,\n  stereo_prefix_list, input_nvm, output_nvm;\n};\n\nvoid disp2ip(int argc, char *argv[], DispToIpOptions& opt) {\n  \n  po::options_description general_options(\"\");\n  general_options.add_options()\n  (\"left-raw-image-list\", po::value(&opt.left_raw_image_list)->default_value(\"\"),\n   \"List of raw left images, one per line.\")\n  (\"left-filtered-image-list\", po::value(&opt.left_filtered_image_list)->default_value(\"\"),\n   \"List of left images after applying a filter, one per line.\")\n  (\"right-filtered-image-list\", po::value(&opt.right_filtered_image_list)->default_value(\"\"),\n    \"List of right images after applying a filter, one per line.\")\n  (\"stereo-prefix-list\", po::value(&opt.stereo_prefix_list)->default_value(\"\"),\n   \"List of stereo prefixes, one per line. Each prefix is for a stereo run \"\n   \"with a left filtered and right filtered image, with affine epipolar alignment. \"\n   \"Stereo could have been run with --correlator-mode, so without cameras.\")\n  (\"optical-center-list\", po::value(&opt.optical_center_list)->default_value(\"\"),\n    \"List of optical centers for all filtered images. On each line must have the image name, \"\n    \"optical center column, then row. The order of images is not important.\")\n  (\"input-nvm\", po::value(&opt.input_nvm)->default_value(\"\"),\n    \"Input NVM file, having interest point matches between the left raw images.\")\n  (\"output-nvm\", po::value(&opt.output_nvm)->default_value(\"\"),\n    \"Output NVM file, having interest point matches between all filtered images, \"\n    \"produced with the help of disparity maps.\");\n\n  general_options.add(vw::GdalWriteOptionsDescription(opt));\n  \n  po::options_description positional(\"\");\n  po::positional_options_description positional_desc;\n  \n  std::string usage(\"[options]\");\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line(argc, argv, opt, general_options, general_options,\n                             positional, positional_desc, usage,\n                             allow_unregistered, unregistered);\n  \n  // All inputs must be non-empty\n  if (opt.left_raw_image_list.empty() || opt.left_filtered_image_list.empty() ||\n      opt.right_filtered_image_list.empty() || opt.stereo_prefix_list.empty() ||\n      opt.optical_center_list.empty() ||\n      opt.input_nvm.empty() || opt.output_nvm.empty())\n    vw::vw_throw(vw::ArgumentErr() << \"Must specify all input files.\\n\");\n\n  // Create the output directory  \n  vw::create_out_dir(opt.output_nvm);\n\n  // Read the lists \n  std::vector<std::string> left_raw_image_files, left_filtered_image_files, right_filtered_image_files, stereo_prefixes;\n  asp::read_list(opt.left_raw_image_list, left_raw_image_files);\n  asp::read_list(opt.left_filtered_image_list, left_filtered_image_files);\n  asp::read_list(opt.right_filtered_image_list, right_filtered_image_files);\n  asp::read_list(opt.stereo_prefix_list, stereo_prefixes);\n  \n  // All lists must have the same size\n  if (left_raw_image_files.size() != left_filtered_image_files.size() ||\n      left_raw_image_files.size() != right_filtered_image_files.size() ||\n      left_raw_image_files.size() != stereo_prefixes.size())\n    vw::vw_throw(vw::ArgumentErr() << \"All input lists must have the same size.\\n\");    \n\n  // Read the optical center offsets for the filtered images\n  std::map<std::string, Eigen::Vector2d>  offsets;\n  asp::readNvmOffsets(opt.optical_center_list, offsets); \n\n  // Number of offsets must equal the number of filtered images\n  if (offsets.size() != left_filtered_image_files.size() + right_filtered_image_files.size())\n    vw::vw_throw(vw::ArgumentErr() << \"Number of optical center offsets must equal \"\n                 << \"the number of filtered images.\\n\");\n\n  // Read the nvm and create the cnet\n  bool nvm_no_shift = false; // have an offsets file\n  asp::nvmData nvm;\n  asp::readNvm(opt.input_nvm, nvm_no_shift, nvm);\n  vw::ba::ControlNetwork cnet(\"raw\");\n  std::vector<Eigen::Affine3d> world_to_cam;\n  std::map<std::string, Eigen::Vector2d> raw_offsets;\n  asp::nvmToCnet(nvm, cnet, raw_offsets, world_to_cam);\n  \n  // Invalid disparity pixel\n  typedef typename DispImageType::pixel_type DispPixelT;\n  DispPixelT invalid_disp; invalid_disp.invalidate();\n  vw::ValueEdgeExtension<DispPixelT> invalid_ext(invalid_disp);\n\n  // Iterate over images, and read the transforms to undo the alignment\n  // in disparities. Also read the disparities and prepare for interpolation. \n  int num_runs = stereo_prefixes.size();\n  std::vector<asp::DispImageType> interp_disparities(num_runs);\n  std::vector<vw::TransformPtr> left_trans(num_runs), right_trans(num_runs);\n  for (int i = 0; i < num_runs; i++) {\n    stereo_settings().correlator_mode = true; // No cameras assumed\n    asp::stereo_settings().alignment_method = \"affineepipolar\";\n    std::string stereo_prefix = stereo_prefixes[i]; \n    std::string session_name = \"pinhole\"; \n    std::string input_dem = \"\"; // No DEM\n    bool allow_map_promote = false, quiet = true;\n    asp::SessionPtr \n      session(asp::StereoSessionFactory::create(session_name, // may change\n                                                opt, \n                                                left_filtered_image_files[i], \n                                                right_filtered_image_files[i],\n                                                \"\", \"\", // No cameras\n                                                stereo_prefix, input_dem,\n                                                allow_map_promote, quiet));\n    left_trans[i] = session->tx_left();\n    right_trans[i] = session->tx_right();\n    \n    // Check that the pointers are not null\n    if (left_trans[i].get() == NULL || right_trans[i].get() == NULL)\n      vw::vw_throw(vw::ArgumentErr() << \"Could not read the alignment transforms \"\n                   << \"for stereo prefix: \" << stereo_prefix);\n\n    // Read the disparity      \n    std::string dispFile = stereo_prefix + \"-F.tif\"; \n    asp::DispImageType disp = session->pre_pointcloud_hook(dispFile);\n    if (disp.cols() == 0 || disp.rows() == 0)\n      vw::vw_throw(vw::ArgumentErr() << \"Empty disparity image: \" << dispFile << \"\\n\");\n      \n    // Add the disparity with bilinear interpolation to the list. Care with no-data.\n    interp_disparities[i] = interpolate(disp, vw::BilinearInterpolation(), invalid_ext);\n  }\n  \n  // Red the raw image list from the cnet. The order is not the same as in list \n  // of raw images. \n  std::vector<std::string> & cnet_list = cnet.get_image_list(); // alias\n\n  // The map from each left raw image to its index in that list\n  std::map<std::string, int> left_raw_name_to_index;\n  for (size_t i = 0; i < left_raw_image_files.size(); i++)\n    left_raw_name_to_index[left_raw_image_files[i]] = i;\n \n  // The images in the cnet are in a random order usually, as produced by Theia \n  // Need to find correspondences between the cnet indices and raw image indices\n  std::map<int, int> cnet_to_raw_index;\n  for (size_t i = 0; i < cnet_list.size(); i++) {\n    // Look up in the raw image map\n    auto it = left_raw_name_to_index.find(cnet_list[i]);\n    if (it == left_raw_name_to_index.end())\n      vw::vw_throw(vw::ArgumentErr() << \"Could not find image \" << cnet_list[i] \n                   << \" in the raw image list.\\n\");\n    int raw_index = it->second;\n    cnet_to_raw_index[i] = raw_index;\n  }\n\n  // Replace in the cnet the left images with the left filtered images\n  for (size_t i = 0; i < cnet_list.size(); i++) {\n    // find corresponding raw image index\n    auto it = cnet_to_raw_index.find(i);\n    if (it == cnet_to_raw_index.end())\n      vw::vw_throw(vw::ArgumentErr() << \"Could not find image \" << cnet_list[i]\n                    << \" in the raw image list.\\n\");\n    int raw_index = it->second;\n    cnet_list[i] = left_filtered_image_files[raw_index];\n  }\n  \n  // Number of right filtered images (same as number of left filtered images)\n  int num_right_images = right_filtered_image_files.size();\n\n  // Add the right filtered images to the cnet. This will also update\n  // cnet_list, as it is an alias.\n  for (int i = 0; i < num_right_images; i++)\n    cnet.add_image_name(right_filtered_image_files[i]);\n\n  // Make fake camera poses for the right filtered images. Those won't be accurate,\n  // but have to create something. They will not be used.\n  for (int i = 0; i < num_right_images; i++)\n    world_to_cam.push_back(world_to_cam[i]);\n\n  // The core work  \n  asp::completeCnetFromDisparities(cnet, cnet_to_raw_index, interp_disparities,\n                                   left_trans, right_trans);\n  \n  // Convert the cnet to the nvm format\n  asp::cnetToNvm(cnet, offsets, world_to_cam, nvm);\n    \n  // Write the nvm to disk\n  asp::writeNvm(nvm, opt.output_nvm);\n}\n\n} // end namespace asp\n\nint main(int argc, char *argv[]) {\n\n  asp::DispToIpOptions opt;\n  try {\n    asp::disp2ip(argc, argv, opt);\n  } ASP_STANDARD_CATCHES;\n  \n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/disparitydebug.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file disparitydebug.cc\n\n#ifdef _MSC_VER\n#pragma warning(disable:4244)\n#pragma warning(disable:4267)\n#pragma warning(disable:4996)\n#endif\n\n#ifdef NDEBUG\n#undef NDEBUG\n#endif\n\n#include <asp/Core/Macros.h>\n#include <asp/Core/AspProgramOptions.h>\n\n#include <vw/Cartography/GeoReferenceUtils.h>\n#include <vw/Stereo/DisparityMap.h>\n#include <vw/Image/Algorithms.h>\n#include <vw/Image/Filter.h>\n#include <vw/FileIO/FileUtils.h>\n#include <vw/Image/PixelMask.h>\n\nusing namespace vw;\nusing namespace vw::stereo;\n\nnamespace po = boost::program_options;\nnamespace fs = boost::filesystem;\n\n// Disparity norm\ndouble disparity_norm(PixelMask<Vector2f> const& pix) {\n  if (!is_valid(pix))\n    return 0.0;\n  return norm_2(pix.child());\n}\n\n// To find the disparity norm of an image, use\n// per_pixel_filter(image, DisparityNorm()).\nclass DisparityNorm: public ReturnFixedType<double> {\n  public:\n  double operator()(PixelMask<Vector2f> const& pix) const {\n    return disparity_norm(pix);\n  }\n};\n\n// Find the maximum of the norms of differences between a disparity\n// at a pixel and its four left, right, top, and bottom neighbors.\n// For the disparity to result in a nice transform from left to\n// right image the norms better be less than 1.\nclass DispNormDiff: public ImageViewBase<DispNormDiff> {\n  ImageViewRef<PixelMask<Vector2f>> m_img;\n\npublic:\n  DispNormDiff(ImageViewRef<PixelMask<Vector2f>> const& img):\n    m_img(img) {}\n\n  typedef float result_type;\n  typedef result_type pixel_type;\n\n  typedef ProceduralPixelAccessor<DispNormDiff> pixel_accessor;\n\n  inline int32 cols() const { return m_img.cols(); }\n  inline int32 rows() const { return m_img.rows(); }\n  inline int32 planes() const { return 1; }\n\n  inline pixel_accessor origin() const { return pixel_accessor(*this, 0, 0); }\n\n  inline result_type operator()(double/*i*/, double/*j*/, int32/*p*/ = 0) const {\n    vw_throw(NoImplErr() << \"DispNormDiff::operator()(...) is not implemented\");\n    return result_type(0.0);\n  }\n\n  typedef CropView<ImageView<result_type>> prerasterize_type;\n  inline prerasterize_type prerasterize(BBox2i const& bbox) const {\n\n    ImageView<result_type> tile(bbox.width(), bbox.height());\n\n    // Need to see each pixel's neighbors\n    int extra = 1;\n    BBox2i biased_box = bbox;\n    biased_box.expand(extra);\n    biased_box.crop(bounding_box(m_img));\n\n    // Bring fully in memory a crop of the input for this tile\n    ImageView<PixelMask<Vector2f>> cropped_img = crop(m_img, biased_box);\n\n    for (int col = bbox.min().x(); col < bbox.max().x(); col++) {\n      for (int row = bbox.min().y(); row < bbox.max().y(); row++) {\n\n        // Find the disparity value at the current pixel and the neighbors.\n        // Need to be careful to account for the bias and for indices\n        // going out of range.\n        // Coordinates of a pixel and its neighbors.\n        std::vector<Vector2i> coords = {Vector2i(0, 0), Vector2i(1, 0), Vector2i(0, 1),\n                                        Vector2i(-1, 0), Vector2i(0, -1)};\n        std::vector<PixelMask<Vector2f>> vals(5);\n\n        for (int it = 0; it < 5; it++) {\n          Vector2i coord = Vector2i(col, row) + coords[it]; // pixel in uncropped image\n          if (biased_box.contains(coord)) {\n            // Take into account the bounds and the crop\n            vals[it] = cropped_img(coord.x() - biased_box.min().x(),\n                                   coord.y() - biased_box.min().y());\n          } else {\n            // Out of range\n            vals[it].child() = Vector2f(0, 0);\n            vals[it].invalidate();\n          }\n        }\n\n        double max_norm_diff = 0.0;\n        if (is_valid(vals[0])) {\n          // Need to have the center pixel valid\n          for (int it = 1; it < 5; it++) {\n            if (!is_valid(vals[it]))\n              continue;\n            max_norm_diff = std::max(max_norm_diff, norm_2(vals[it].child() - vals[0].child()));\n          }\n        }\n\n        tile(col - bbox.min().x(), row - bbox.min().y()) = max_norm_diff;\n      }\n    }\n\n    return prerasterize_type(tile, -bbox.min().x(), -bbox.min().y(),\n                             cols(), rows());\n  }\n\n  template <class DestT>\n  inline void rasterize(DestT const& dest, BBox2i bbox) const {\n    vw::rasterize(prerasterize(bbox), dest, bbox);\n  }\n};\n\nstruct Options : vw::GdalWriteOptions {\n  // Input\n  std::string input_file_name;\n  BBox2       normalization_range;\n  BBox2       roi; ///< Only generate output images in this region\n  bool        save_norm, save_norm_diff, raw;\n\n  // Output\n  std::string output_prefix, output_file_type;\n\n  Options(): save_norm(false), save_norm_diff(false) {}\n};\n\nvoid handle_arguments(int argc, char *argv[], Options& opt) {\n  po::options_description general_options(\"\");\n  general_options.add_options()\n    (\"normalization\", po::value(&opt.normalization_range)->default_value(BBox2(0, 0, 0, 0), \"auto\"),\n     \"Normalization range. Specify in the format: hmin vmin hmax vmax.\")\n    (\"roi\", po::value(&opt.roi)->default_value(BBox2(0,0,0,0), \"auto\"),\n     \"Region of interest. Specify in the format: xmin ymin xmax ymax.\")\n    (\"raw\", po::bool_switch(&opt.raw)->default_value(false),\n     \"Save the raw disparity values without any normalization. Invalid pixels are set to \"\n     \"no-data.\")\n    (\"save-norm\", po::bool_switch(&opt.save_norm)->default_value(false),\n     \"Save the norm of the disparity instead of its two bands.\")\n    (\"save-norm-diff\", po::bool_switch(&opt.save_norm_diff)->default_value(false),\n     \"Save the maximum of norms of differences between a disparity and its four neighbors.\")\n    (\"output-prefix, o\", po::value(&opt.output_prefix), \n     \"Specify the output prefix. This is set automatically if not provided.\")\n    (\"output-filetype, t\", po::value(&opt.output_file_type)->default_value(\"tif\"),\n     \"Specify the output file type.\");\n\n  general_options.add(vw::GdalWriteOptionsDescription(opt));\n\n  po::options_description positional(\"\");\n  positional.add_options()\n    (\"input-file\", po::value(&opt.input_file_name), \"Input disparity map.\");\n\n  po::positional_options_description positional_desc;\n  positional_desc.add(\"input-file\", 1);\n\n  std::string usage(\"[options] <input disparity map>\");\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line(argc, argv, opt, general_options, general_options,\n                            positional, positional_desc, usage,\n                            allow_unregistered, unregistered);\n\n  if (opt.input_file_name.empty())\n    vw_throw(ArgumentErr() << \"Missing input file.\\n\");\n\n  if (opt.output_prefix.empty())\n    opt.output_prefix = vw::prefix_from_filename(opt.input_file_name);\n\n  if (int(opt.save_norm) + int(opt.save_norm_diff) + int(opt.raw) > 1)\n    vw::vw_throw(vw::ArgumentErr() \n             << \"Cannot save more than one of: disparity norm, norm of differences, raw.\\n\");\n  \n  // Float data need to be saved to a tif file\n  if ((opt.save_norm || opt.save_norm_diff || opt.raw) && opt.output_file_type != \"tif\")\n    vw::vw_throw(vw::ArgumentErr()\n             << \"When saving either disparity norm, norm of differences, or raw disparity, \"\n             << \"the output file type must be tif.\\n\");\n}\n\nvoid process_disparity(Options& opt) {\n\n  cartography::GeoReference georef;\n  bool has_georef  = read_georeference(georef, opt.input_file_name);\n  bool has_nodata = false;\n  float output_nodata = -32768.0;\n\n  // Read as PixelMask<Vector2f> regardless of input type.\n  // Must handle int32 vs float and masked vs unmasked variants.\n  ImageFormat fmt = vw::image_format(opt.input_file_name);\n  bool has_mask = (fmt.pixel_format == VW_PIXEL_RGB ||\n                   fmt.pixel_format == VW_PIXEL_GENERIC_3_CHANNEL ||\n                   (fmt.pixel_format == VW_PIXEL_SCALAR && fmt.planes == 3));\n  bool is_int = (fmt.channel_type == VW_CHANNEL_INT32);\n\n  ImageViewRef<PixelMask<Vector2f>> disk_disparity_map;\n  if (has_mask && is_int)\n    disk_disparity_map =\n      pixel_cast<PixelMask<Vector2f>>\n        (DiskImageView<PixelMask<Vector2i>>(opt.input_file_name));\n  else if (has_mask)\n    disk_disparity_map =\n      DiskImageView<PixelMask<Vector2f>>(opt.input_file_name);\n  else if (is_int)\n    disk_disparity_map =\n      pixel_cast<PixelMask<Vector2f>>\n        (create_mask(DiskImageView<Vector2i>(opt.input_file_name)));\n  else\n    disk_disparity_map =\n      pixel_cast<PixelMask<Vector2f>>\n        (create_mask(DiskImageView<Vector2f>(opt.input_file_name)));\n\n  if (opt.save_norm) {\n    std::string norm_file = opt.output_prefix + \"-norm.\" + opt.output_file_type;\n    vw_out() << \"\\t--> Writing disparity norm: \" << norm_file << \"\\n\";\n    block_write_gdal_image(norm_file,\n                           per_pixel_filter(disk_disparity_map, DisparityNorm()),\n                           has_georef, georef,\n                           has_nodata, output_nodata,\n                           opt, TerminalProgressCallback(\"asp\",\"\\t    norm: \"));\n    return;\n  }\n\n  if (opt.save_norm_diff) {\n    std::string norm_file = opt.output_prefix + \"-norm-diff.\" + opt.output_file_type;\n    vw_out() << \"\\t--> Writing norm of disparity diff: \" << norm_file << \"\\n\";\n    block_write_gdal_image(norm_file,\n                           DispNormDiff(disk_disparity_map),\n                           has_georef, georef,\n                           has_nodata, output_nodata,\n                           opt, TerminalProgressCallback(\"asp\",\"\\t    norm: \"));\n    return;\n  }\n\n  // If no ROI passed in, use the full image\n  BBox2 roiToUse(opt.roi);\n  if (opt.roi == BBox2(0, 0, 0, 0))\n    roiToUse = BBox2(0, 0, disk_disparity_map.cols(), disk_disparity_map.rows());\n\n  if (has_georef)\n    georef = crop(georef, roiToUse);\n\n  // Crop to ROI and select channels\n  ImageViewRef<PixelMask<Vector2f>> disp = crop(disk_disparity_map, roiToUse);\n  ImageViewRef<float> horizontal = select_channel(disp, 0);\n  ImageViewRef<float> vertical   = select_channel(disp, 1);\n\n  // Set up output files\n  std::string h_file = opt.output_prefix + \"-H.\" + opt.output_file_type;\n  std::string v_file = opt.output_prefix + \"-V.\" + opt.output_file_type;\n\n  if (opt.raw) {\n    has_nodata = true;\n    // Pick as nodata a value that large and representable exactly as float\n    output_nodata = -1e+6;\n    // Set invalid pixels to nodata\n    ImageViewRef<float> horiz_out = apply_mask(copy_mask(horizontal, disp),\n                                               output_nodata);\n    ImageViewRef<float> vert_out  = apply_mask(copy_mask(vertical, disp),\n                                               output_nodata);\n\n    // Write both images to disk\n    vw_out() << \"\\t--> Writing raw horizontal disparity: \" << h_file << \"\\n\";\n    block_write_gdal_image(h_file, horiz_out, has_georef, georef,\n                           has_nodata, output_nodata,\n                           opt, TerminalProgressCallback(\"asp\",\"\\t    H : \"));\n    vw_out() << \"\\t--> Writing raw vertical disparity: \" << v_file << \"\\n\";\n    block_write_gdal_image(v_file, vert_out, has_georef, georef,\n                           has_nodata, output_nodata,\n                           opt, TerminalProgressCallback(\"asp\",\"\\t    V : \"));\n    return;\n  }\n\n  // Compute intensity display range if not passed in. For this purpose\n  // subsample the image.\n  vw_out() << \"\\t--> Computing disparity range.\\n\";\n  if (opt.normalization_range == BBox2(0,0,0,0)) {\n    float subsample_amt =\n      float(roiToUse.height())*float(roiToUse.width()) / (1000.f * 1000.f);\n    subsample_amt = std::max(subsample_amt, 1.0f);\n    opt.normalization_range\n      = get_disparity_range(subsample(disp, subsample_amt));\n  }\n\n  vw_out() << \"\\t    Horizontal: [\" << opt.normalization_range.min().x()\n           << \" \" << opt.normalization_range.max().x() << \"]    Vertical: [\"\n           << opt.normalization_range.min().y() << \" \"\n           << opt.normalization_range.max().y() << \"]\\n\";\n\n  // Generate value-normalized copies of the H and V channels.\n  // Normalize to [0,1] (float channel range), then rescale to uint8.\n  horizontal =\n    apply_mask(copy_mask(clamp(normalize(horizontal,\n                                         opt.normalization_range.min().x(),\n                                         opt.normalization_range.max().x(),\n                                         ChannelRange<float>::min(),\n                                         ChannelRange<float>::max())),\n                         disp));\n  vertical =\n    apply_mask(copy_mask(clamp(normalize(vertical,\n                                         opt.normalization_range.min().y(),\n                                         opt.normalization_range.max().y(),\n                                         ChannelRange<float>::min(),\n                                         ChannelRange<float>::max())),\n                         disp));\n\n  // Write both images to disk, casting as UINT8\n  vw_out() << \"\\t--> Writing horizontal disparity: \" << h_file << \"\\n\";\n  block_write_gdal_image(h_file,\n                         channel_cast_rescale<uint8>(horizontal),\n                         has_georef, georef,\n                         has_nodata, output_nodata,\n                         opt, TerminalProgressCallback(\"asp\",\"\\t    H : \"));\n  vw_out() << \"\\t--> Writing vertical disparity: \" << v_file << \"\\n\";\n  block_write_gdal_image(v_file,\n                         channel_cast_rescale<uint8>(vertical),\n                         has_georef, georef,\n                         has_nodata, output_nodata,\n                         opt, TerminalProgressCallback(\"asp\",\"\\t    V : \"));\n}\n\nint main(int argc, char *argv[]) {\n\n  Options opt;\n  try {\n    handle_arguments(argc, argv, opt);\n\n    vw_out() << \"Reading: \" << opt.input_file_name << \"\\n\";\n\n    // Validate that the input is a 2 or 3 channel image\n    ImageFormat fmt = vw::image_format(opt.input_file_name);\n    bool valid = (fmt.pixel_format == VW_PIXEL_GENERIC_2_CHANNEL ||\n                  fmt.pixel_format == VW_PIXEL_RGB ||\n                  fmt.pixel_format == VW_PIXEL_GENERIC_3_CHANNEL ||\n                  (fmt.pixel_format == VW_PIXEL_SCALAR &&\n                   (fmt.planes == 2 || fmt.planes == 3)));\n    if (!valid)\n      vw_throw(ArgumentErr() << \"Unsupported pixel format. Expected 2 or 3 channel image. \"\n                << \"Instead got [\" << pixel_format_name(fmt.pixel_format) << \"].\");\n\n    // All disparity data is read as float and processed uniformly\n    process_disparity(opt);\n\n  } ASP_STANDARD_CATCHES;\n\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/extract_bag",
    "content": "#!/usr/bin/env python\n\n\"\"\"\nFor a given list of topics and directory names, save the image and\npoint cloud messages for that topic to the specified directories. The\ncreated file names will be in the form: <timestamp>.<extension>, with\nthe timestamp being the double-precision number of seconds since epoch\nread from message header. Can specify a list of timestamps for which\nto extract the data.\n\"\"\"\n\nimport argparse, os, re, sys, rosbag, cv2, sensor_msgs, cv_bridge\nfrom sensor_msgs import point_cloud2\nimport numpy as np\n\ndef read_timestamps(filename):\n    \"\"\"Return a map of timestamps.\"\"\"\n\n    timestamp_map = {}\n    with open(filename, 'r') as f:\n        lines = f.readlines()\n\n    for line in lines:\n        m = re.match(\"^.*?(\\d+\\.\\d+).*?\\n\", line)\n        if m:\n            timestamp = float(m.group(1))\n            timestamp_map[timestamp] = line\n            \n    return timestamp_map\n\ndef sanity_checks(args, topic_list, dir_list):\n    # Sanity checks\n    if args.bag == \"\":\n        print(\"Must specify the input bag.\")\n        sys.exit(1)\n    if len(topic_list) != len(dir_list):\n        print(\"There must exists as many topics as output directories.\")\n        sys.exit(1)\n    if len(topic_list) == 0:\n        print(\"Must specify at least one topic and output directory.\")\n        sys.exit(1)\n    if args.timestamp_tol is not None and args.timestamp_tol <= 0:\n        print(\"The timestamp tolerance must be positive.\")\n        sys.exit(1)\n    if args.approx_timestamp and args.timestamp_tol is None:\n        print(\"When saving with an approximate timestamp, must specify the tolerance.\")\n        sys.exit(1)\n\ndef find_closest_messages_within_tol(args, topic_list, timestamp_map):\n    \"\"\"\n    Given a list of timestamps and a tolerance, find, for each input\n    topic, the closest message in the bag to every timestamp in the\n    list, within given tolerance.\n    \"\"\"\n    print(\"Doing a first pass through the bag to find the closest messages to \"\n          \"desired ones, with tolerance.\")\n\n    # The timestamps close to which need to find data in the bag, Must\n    # be sorted.\n    req_timestamps = sorted(list(timestamp_map.keys()))\n    min_list_time = req_timestamps[0]\n    max_list_time = req_timestamps[-1]\n\n    # This will travel forward in time, and we assume the messages travel\n    # forward in time too.\n    # Must depend on topic!\n    req_index = {}\n    closest_stamps = {}\n    first_good = {}\n    for topic in topic_list:\n        req_index[topic] = 0\n        first_good[topic] = -1\n        # Will keep the result here, starts as an array with values smaller\n        # than any timestamp\n        closest_stamps[topic] = [-1000.0] * len(req_timestamps)\n    \n    with rosbag.Bag(args.bag, \"r\") as bag:\n        \n        # Check image message type\n        for topic, msg, t in bag.read_messages(topic_list):\n            \n            # Read the header timestamp\n            try:\n                # Note that we search the bag exhaustively. We do not assume\n                # timestamps are in increasing order of time. Sometimes\n                # that assumption can be violated.\n                stamp = msg.header.stamp.to_sec()\n                if stamp < min_list_time - args.timestamp_tol:\n                    continue # too early\n                if stamp > max_list_time + args.timestamp_tol:\n                    break # past the desired times\n\n                # See if this timestamp is closer to any of the req_timestamps\n                # than the existing candidates. Note that we stop as soon as\n                # we can to keep the overall complexity linear and not quadratic.\n                first_good[topic] = -1\n                for it in range(req_index[topic], len(req_timestamps)):\n                    if req_timestamps[it] > stamp + args.timestamp_tol:\n                        break # no point in continuing\n\n                    curr_diff = abs(stamp - req_timestamps[it])\n                    prev_diff = abs(closest_stamps[topic][it] - req_timestamps[it])\n                    if curr_diff < args.timestamp_tol and curr_diff < prev_diff:\n                        closest_stamps[topic][it] = stamp\n\n                        if first_good[topic] < 0:\n                            first_good[topic] = 1\n                            # Found the first good fit index. There won't be good\n                            # fits going forward for indices to the left of this. \n                            req_index[topic] = it\n            except:\n                continue\n\n    # Put in a set and print some stats\n    closest_stamps_set = {}\n    exact_to_approx = {}\n    for topic in topic_list:\n        print(\"Topic is \" + str(topic))\n        closest_stamps_set[topic] = set()\n        exact_to_approx[topic] = {}\n        for it in range(len(closest_stamps[topic])):\n            diff = abs(closest_stamps[topic][it] - req_timestamps[it])\n            msg = \"\"\n            if diff > args.timestamp_tol:\n                diff = \"-1\"\n                msg = \" (failed)\"\n            else:\n                closest_stamps_set[topic].add(closest_stamps[topic][it])\n                exact_to_approx[topic][closest_stamps[topic][it]] = req_timestamps[it] \n            print(\"For timestamp \" + str(req_timestamps[it]) + \\\n                  \", closest found message is within \" + str(diff) + \" seconds\" + msg)\n        \n    return (closest_stamps_set, exact_to_approx)\n            \nparser = argparse.ArgumentParser(description = __doc__,\n                                 formatter_class = argparse.ArgumentDefaultsHelpFormatter)\nparser.add_argument(\"--bag\", dest = \"bag\", help = \"Input bag.\"),\nparser.add_argument(\"--topics\", dest = \"topics\", default = \"\",  \n                    help = \"A list of topics, in quotes, having image, compressed \" +\n                    \"image, or point cloud (depth) data.\")\nparser.add_argument(\"--dirs\", dest = \"dirs\", default = \"\",\n                    help = \"A list of directories, in quotes, one for each topic, \" +\n                    \"in which to save the data for that topic.\")\n\nparser.add_argument(\"--timestamp_list\", dest = \"timestamp_list\", default = \"\",  \n                    help = \"Extract data for the timestamps in this list. \" +\n                    \"If not set, extract all data. Each line in \" +\n                    \"this file must contain a number of the form \" +\n                    \"<digits>.<digits> (the timestamp), and perhaps other \" +\n                    \"text as well, or it will be ignored. So, a \" +\n                    \"filename containing a timestamp as part of \" +\n                    \"its name will be accepted.\")\n\nparser.add_argument(\"--timestamp_tol\", dest = \"timestamp_tol\", type = float,\n                    default = None,  \n                    help = \"If set, extract the data for each of the given topics \" +\n                    \"whose timestamps are closest to the \" +\n                    \"ones in the input list, within this \" +\n                    \"tolerance, in seconds. This should be kept small. It is assumed \" +\n                    \"the bag stores the data for each topic in increasing value of \" +\n                    \"timestamp.\")\n\nparser.add_argument('--approx_timestamp', dest='approx_timestamp', action='store_true',\n                    help = \"If using --timestamp_tol, change the timestamp of \" +\n                    \"the data being saved (which becomes part of the output filename) \" +\n                    \"to be the closest timestamp in the input list.\")\n\nargs = parser.parse_args()\n\ntopic_list = args.topics.split()\ndir_list = args.dirs.split()\nsanity_checks(args, topic_list, dir_list)\n\n# The map of all required timestamps, if specified\ntimestamp_map = {}\nif args.timestamp_list != \"\":\n    timestamp_map = read_timestamps(args.timestamp_list)\n    if len(timestamp_map) == 0:\n        print(\"No timestamps read from \" + args.timestamp_list)\n        sys.exit(1)\n\nif args.timestamp_tol > 0 and  len(timestamp_map) == 0:\n    print(\"When using a timestamp tolerance, an input list must be provided.\")\n    sys.exit(1)\n    \n# TODO(oalexan1): Make this a function.\n# Map from topic name to dir name.\ntopic_to_dir = {}\nfor it in range(len(topic_list)):\n    topic = topic_list[it]\n    path  = dir_list[it]\n    if topic in topic_to_dir:\n        print(\"Duplicate topic: \" + topic)\n        sys.exit(1)\n    topic_to_dir[topic] = path\n\n# TODO(oalexan1): Make this a function.\n# Create directories\nfor path in dir_list:\n    try:\n        os.makedirs(path)\n    except OSError:\n        if os.path.isdir(path):\n            pass\n        else:\n            raise Exception(\"Could not make directory: \" + path)\n\nif args.timestamp_tol > 0:\n    (closest_stamps_set, exact_to_approx)\\\n                         = find_closest_messages_within_tol(args, topic_list, timestamp_map)\n\nif args.approx_timestamp:\n    print(\"Replacing on saving the actual timestamps with the closest from the list.\")\n    \n# TODO(oalexan1): Make this a function\n# Read the bag\nprint(\"Reading: \" + args.bag)\nprint(\"Writing the data to: \" + args.dirs)\n\ncv_bridge = cv_bridge.CvBridge()\n\n# The timestamp format is consistent with what rig_calibrator uses\nfmt_str = \"{:10.7f}\"\n\n# Write the data\nwith rosbag.Bag(args.bag, \"r\") as bag:\n\n    info = bag.get_type_and_topic_info()\n\n    # Check image message type\n    for topic, msg, t in bag.read_messages(topic_list):\n\n        # Read the header timestamp\n        try:\n            # Note that we search the bag exhaustively. We do not assume\n            # timestamps are in increasing order of time. Sometimes\n            # that assumption can be violated.\n            stamp = msg.header.stamp.to_sec()\n            if len(timestamp_map) > 0:\n                # When extracting only a subset of the timestamps\n                if args.timestamp_tol is None:\n                    # exact timestamp\n                    if stamp not in timestamp_map:\n                        continue\n                else:\n                    # Nearby timestamp\n                    if stamp not in closest_stamps_set[topic]:\n                        continue\n        except:\n            continue\n\n        if args.approx_timestamp:\n            # Replacing with the apporox one\n            approx_stamp = exact_to_approx[topic][stamp]\n            print(\"Saving data for timestamp \" + str(stamp) + \" as if it were for \" + \\\n                  \"timestamp \" + str(approx_stamp))\n            stamp = approx_stamp\n            \n        if info.topics[topic].msg_type == \"sensor_msgs/Image\":\n            # Write an image\n            try:\n                \n                filename = topic_to_dir[topic] + \"/\" + fmt_str.format(stamp) + \".jpg\"\n                cv_image = cv_bridge.imgmsg_to_cv2(msg, desired_encoding = 'passthrough')\n                if len(cv_image.shape) == 2:\n                    # Try again, as mono. There should be a better way.\n                    cv_image = cv_bridge.imgmsg_to_cv2(msg, desired_encoding = 'mono8')\n                print(\"Writing: \" + filename)\n                cv2.imwrite(filename, cv_image)\n            except:\n                print(\"Failed to write: \" + filename)\n\n        if info.topics[topic].msg_type == \"sensor_msgs/CompressedImage\":\n            # Write a compressed image. It is assumed to be in color.\n            try:\n                filename = topic_to_dir[topic] + \"/\" + fmt_str.format(stamp) + \".jpg\"\n                cv_image = cv_bridge.compressed_imgmsg_to_cv2(msg, desired_encoding\n                                                              = 'passthrough')\n                print(\"Writing: \" + filename)\n                cv2.imwrite(filename, cv_image)\n            except:\n                print(\"Failed to write: \" + filename)\n\n        if info.topics[topic].msg_type == \"sensor_msgs/PointCloud2\":\n            try:\n                # Write a point cloud in the format at:\n                # https://stereopipeline.readthedocs.io/en/latest/tools/rig_calibrator.html\n                # (section on point cloud format). \n                # TODO(oalexan1): Test this!\n                filename = topic_to_dir[topic] + \"/\" + fmt_str.format(stamp) + \".pc\"\n                print(\"Writing: \" + filename)\n                fh = open(filename, \"wb\")\n\n                vals = np.array([msg.height, msg.width, 3], dtype=np.int32)\n                fh.write(vals.tobytes())\n\n                # TODO(oalexan1): This iteration may be slow.\n                cloud_points = list(\n                    point_cloud2.read_points(msg,\n                                             skip_nans = False, # read all\n                                             field_names = (\"x\", \"y\", \"z\")))\n                \n                for point in cloud_points:\n                    vals = np.array([point[0], point[1], point[2]], dtype=np.float32)\n                    fh.write(vals.tobytes())\n\n            except Exception as e:\n                print(\"Failed to write: \", filename)\n                print(\"Error is \", str(e))\n        \n            \n            \n"
  },
  {
    "path": "src/asp/Tools/fit_rpc.cc",
    "content": "/* Copyright (c) 2021, United States Government, as represented by the\n * Administrator of the National Aeronautics and Space Administration.\n *\n * All rights reserved.\n *\n * The \"ISAAC - Integrated System for Autonomous and Adaptive Caretaking\n * platform\" software is licensed under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n// TODO(oalexan1): Do not use -out_dir. Use -out_config.\n// TODO(oalexan1): Print an underestimate and overestimate for the undistorted win.\n// TODO(oalexan1): Must have sensor name as an option. For now it defaults to sensor 0.\n// TODO(oalexan1): Must document this tool.\n\n#include <ceres/ceres.h>\n#include <ceres/rotation.h>\n#include <ceres/problem.h>\n#include <ceres/solver.h>\n#include <ceres/cost_function.h>\n#include <ceres/loss_function.h>\n#include <ceres/dynamic_numeric_diff_cost_function.h>\n#include <ceres/numeric_diff_cost_function.h>\n#include <ceres/autodiff_cost_function.h>\n\n#include <opencv2/imgproc.hpp>\n#include <opencv2/imgcodecs.hpp>\n#include <opencv2/highgui.hpp>\n#include <opencv2/core/utility.hpp>\n\n#include <asp/Rig/RigRpcDistortion.h>\n#include <asp/Rig/RigCameraParams.h>\n#include <asp/Rig/RigUtils.h>\n#include <asp/Rig/RigConfig.h>\n\n#include <gflags/gflags.h>\n#include <glog/logging.h>\n\n#include <Eigen/Geometry>\n#include <Eigen/Core>\n\n#include <boost/filesystem.hpp>\n\n#include <string>\n#include <map>\n#include <iostream>\n#include <fstream>\n#include <iomanip>\n\nnamespace fs = boost::filesystem;\n\nDEFINE_int32(rpc_degree, -1,\n             \"The degree of the RPC model to fit.\");\n\nDEFINE_int32(num_samples, -1,\n             \"The number of row and column samples to use to fit the RPC model.\");\n\nDEFINE_int32(num_iterations, 20, \"How many solver iterations to perform in calibration.\");\n\nDECLARE_int32(num_threads); // declared externally\n\nDEFINE_double(parameter_tolerance, 1e-12, \"Stop when the optimization variables change by \"\n              \"less than this.\");\n\nDEFINE_string(camera_config, \"\",\n              \"Read the camera configuration from this file.\");\n\nDEFINE_string(out_dir, \"\",\n              \"Write here the camera configuration having the RPC fit.\");\n\nDEFINE_bool(verbose, false,\n            \"Print more information about what the tool is doing.\");\n\nint main(int argc, char** argv) {\n  google::InitGoogleLogging(argv[0]);\n  google::ParseCommandLineFlags(&argc, &argv, true);\n\n  if (FLAGS_camera_config.empty())\n    LOG(FATAL) << \"Camera config file was not specified.\";\n\n  if (FLAGS_out_dir.empty())\n    LOG(FATAL) << \"Output camera config directory was not specified.\";\n\n  if (FLAGS_rpc_degree <= 0)\n    LOG(FATAL) << \"The RPC degree must be positive.\";\n\n  if (FLAGS_num_samples <= 0)\n      LOG(FATAL) << \"The number of samples must be positive.\";\n\n  rig::RigSet R;\n  bool use_initial_rig_transforms = true; // dictated by the api\n  rig::readRigConfig(FLAGS_camera_config, use_initial_rig_transforms, R);\n\n  std::cout << \"Focal length is \" << R.cam_params[0].GetFocalVector().transpose() << std::endl;\n\n  Eigen::VectorXd rpc_dist_coeffs;\n  rig::fitRpcDist(FLAGS_rpc_degree, FLAGS_num_samples,\n                        R.cam_params[0],\n                        FLAGS_num_threads, FLAGS_num_iterations,\n                        FLAGS_parameter_tolerance,\n                        FLAGS_verbose,\n                        // Output\n                        rpc_dist_coeffs);\n\n  rig::RPCLensDistortion rpc;\n  rpc.set_distortion_parameters(rpc_dist_coeffs);\n\n  rig::evalRpcDistUndist(FLAGS_num_samples, R.cam_params[0], rpc);\n\n  // Create the model with RPC distortion. Note how we pass both the distortion\n  // and undistortion RPC coefficients.\n  R.cam_params[0].SetDistortion(rpc_dist_coeffs);\n\n  rig::writeRigConfig(FLAGS_out_dir + \"/rig_config.txt\", use_initial_rig_transforms, R);\n\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/gcp_gen.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2024, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file gcp_gen.cc\n///\n/// A program for finding GCP given a camera image, a similar looking\n/// orthoimage, and a DEM.\n\n#include <asp/Sessions/StereoSessionFactory.h>\n#include <asp/Core/InterestPointMatching.h>\n#include <asp/Core/ImageUtils.h>\n#include <asp/Core/MatchList.h>\n#include <asp/Core/GCP.h>\n#include <asp/Core/Macros.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/AspProgramOptions.h>\n#include <asp/Core/AspLog.h>\n#include <asp/Core/ImageUtils.h>\n#include <asp/Core/ImageNormalization.h>\n\n#include <vw/FileIO/DiskImageUtils.h>\n#include <vw/Image/Manipulation.h>\n#include <vw/Image/PixelTypeInfo.h>\n#include <vw/FileIO/MatrixIO.h>\n#include <vw/Math/Geometry.h>\n#include <vw/InterestPoint/MatcherIO.h>\n#include <vw/FileIO/FileUtils.h>\n\nusing namespace vw;\nnamespace po = boost::program_options;\n\nnamespace asp {\n\nstruct Options: vw::GdalWriteOptions {\n  std::string camera_image, ortho_image, mapproj_image, dem, output_gcp, output_prefix, match_file;\n  int min_matches;\n  double gcp_sigma;\n  Options() {}\n};\n\nvoid handle_arguments(int argc, char *argv[], Options& opt) {\n\n  const double g_nan_val = std::numeric_limits<double>::quiet_NaN();\n\n  po::options_description general_options(\"\");\n  general_options.add(vw::GdalWriteOptionsDescription(opt));\n\n  // Pass interest point matching options directly to stereo_settings\n  auto & ip_opt = asp::stereo_settings(); // alias\n  \n  general_options.add_options()\n    (\"camera-image\", po::value(&opt.camera_image)->default_value(\"\"),\n     \"The camera image.\")\n    (\"ortho-image\", po::value(&opt.ortho_image)->default_value(\"\"),\n     \"The ortho image to geolocate the interest points in.\")\n    (\"dem\", po::value(&opt.dem)->default_value(\"\"),\n     \"The DEM to infer the elevations from.\")\n    (\"output-gcp,o\", po::value(&opt.output_gcp)->default_value(\"\"),\n     \"The output GCP file.\")\n    (\"gcp-sigma\", po::value(&opt.gcp_sigma)->default_value(1.0),\n     \"The sigma (uncertainty, in meters) to use for the GCPs. A smaller sigma suggests \"\n      \"a more accurate GCP. See also option --fix-gcp-xyz in bundle adjustment.\")\n    (\"ip-detect-method\", po::value(&ip_opt.ip_detect_method)->default_value(0),\n     \"Interest point detection algorithm (0: Integral OBALoG (default), 1: OpenCV SIFT, 2: OpenCV ORB.\")\n    (\"ip-per-image\", po::value(&ip_opt.ip_per_image)->default_value(20000),\n     \"How many interest points to detect in each image (the resulting number of \"\n      \"matches will be much less).\")\n    (\"ip-per-tile\", po::value(&ip_opt.ip_per_tile)->default_value(0),\n     \"How many interest points to detect in each 1024^2 image tile (default: automatic \"\n     \"determination). This is before matching. Not all interest points will have a match. \"\n     \"See also --matches-per-tile.\")\n    (\"matches-per-tile\",  po::value(&ip_opt.matches_per_tile)->default_value(0),\n     \"How many interest point matches to compute in each image tile (of size \"\n     \"normally 1024^2 pixels). Use a value of --ip-per-tile a few times larger \"\n     \"than this. See also --matches-per-tile-params.\")\n    (\"matches-per-tile-params\",  \n     po::value(&ip_opt.matches_per_tile_params)->default_value(Vector2(1024, 1280), \n                                                               \"1024 1280\"),\n     \"To be used with --matches-per-tile. The first value is the image tile size for both \"\n     \"images. A larger second value allows each right tile to further expand to this size, \"\n     \"resulting in the tiles overlapping. This may be needed if the homography alignment \"\n     \"between these images is not great, as this transform is used to pair up left and \"\n     \"right image tiles.\")\n    (\"mapproj-image\", po::value(&opt.mapproj_image)->default_value(\"\"),\n     \"If interest point matching of the camera image to the orthoimage fails, and this \"\n     \"image is provided, which is produced by mapprojecting the camera image with a camera \"\n     \"model onto a DEM, use this for matching to the orthoimage instead, then transfer the \"\n     \"matches to the camera image. The camera model file and DEM must be available and \"\n     \"their names will be read from the geoheader of the mapprojected image.\")\n    (\"individually-normalize\",\n     po::bool_switch(&ip_opt.individually_normalize)->default_value(false)->implicit_value(true),\n     \"Individually normalize the input images instead of using common values.\")\n    (\"matches-as-txt\",\n     po::bool_switch(&ip_opt.matches_as_txt)->default_value(false)->implicit_value(true),\n     \"Read and write match files as plain text instead of binary. See the documentation \"\n     \"for details.\")\n    (\"num-ransac-iterations\", \n     po::value(&ip_opt.ip_num_ransac_iterations)->default_value(1000),\n     \"How many iterations to perform in RANSAC when finding interest point matches.\")\n    (\"inlier-threshold\", po::value(&ip_opt.epipolar_threshold)->default_value(0.0),\n     \"The inlier threshold (in pixels) to separate inliers from outliers when \"\n     \"computing interest point matches. A smaller threshold will result in fewer \"\n     \"inliers. The default is auto-determined.\")\n    (\"min-matches\", po::value(&opt.min_matches)->default_value(10),\n     \"Set the minimum  number of inlier matches between images for successful matching.\")\n    (\"nodata-value\", \n     po::value(&ip_opt.nodata_value)->default_value(g_nan_val),\n     \"Pixels with values less than or equal to this number are treated as no-data. This \"\n     \"overrides the no-data values from input images.\")\n    (\"output-prefix\", po::value(&opt.output_prefix)->default_value(\"\"),\n     \"Save intermediate data, including match files, in this directory. Ths will \"\n     \"cache any matches found, and those will be used to create the GCP file. \"\n     \"The match file needs to be deleted if desired to recompute it.\")\n    (\"match-file\", po::value(&opt.match_file)->default_value(\"\"),\n     \"If set, use this match file instead of creating one.\")\n  ;\n\n  po::options_description positional(\"\");\n  po::positional_options_description positional_desc;\n\n  std::string usage(\"--camera-image image.tif --ortho-image ortho.tif \"\n                    \"--dem dem.tif -o output.gcp\");\n\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line(argc, argv, opt, general_options, general_options,\n                            positional, positional_desc, usage,\n                            allow_unregistered, unregistered);\n\n  // Sanity checks\n  if (opt.camera_image == \"\")\n    vw_throw(ArgumentErr() << \"Missing camera image.\\n\");\n  if (opt.ortho_image == \"\")\n    vw_throw(ArgumentErr() << \"Missing ortho image.\\n\");\n  if (opt.dem == \"\")\n    vw_throw(ArgumentErr() << \"Missing DEM.\\n\");\n  if (opt.output_gcp == \"\")\n    vw_throw(ArgumentErr() << \"Missing output GCP file.\\n\");\n  if (opt.output_prefix == \"\")\n    vw::vw_throw(vw::ArgumentErr() << \"The output prefix must be non-empty.\\n\");\n\n  // GCP sigma must be positive\n  if (opt.gcp_sigma <= 0.0)\n    vw_throw(ArgumentErr() << \"The GCP sigma must be positive.\\n\");\n\n  // The ortho must have a geo reference\n  vw::cartography::GeoReference georef_ortho;\n  bool has_georef_ortho = vw::cartography::read_georeference(georef_ortho, opt.ortho_image);\n  if (!has_georef_ortho)\n    vw_throw(ArgumentErr() << \"The ortho image must have a georeference.\\n\");\n    \n  // Same for the DEM\n  vw::cartography::GeoReference georef_dem;\n  bool has_georef_dem = vw::cartography::read_georeference(georef_dem, opt.dem);\n  if (!has_georef_dem)\n    vw_throw(ArgumentErr() << \"The DEM must have a georeference.\\n\");\n\n  // Sanity checks  \n  if (ip_opt.ip_per_image > 0 && ip_opt.ip_per_tile > 0)\n    vw_throw(ArgumentErr() << \"Can set only one of --ip-per-image and --ip-per-tile.\\n\");\n\n  // Create the output directory\n  vw::create_out_dir(opt.output_prefix);\n  vw::create_out_dir(opt.output_gcp);\n\n  // Turn on logging to file\n  asp::log_to_file(argc, argv, \"\", opt.output_prefix);\n\n  return;\n}\n\n// If the matching is done with the mapprojected camera image, undo it. This applies\n// only to ip1, as ip2 is for the ortho image. Both of these may be modified if the\n// mapprojection is not undone successfully for all matches.\nvoid undo_mapproj(Options & opt,\n                  std::vector<vw::ip::InterestPoint> & ip1,\n                  std::vector<vw::ip::InterestPoint> & ip2) {\n  \n  // Read the needed information from the mapproj header\n  std::string adj_key, img_file_key, cam_type_key, cam_file_key, dem_file_key;\n  std::string adj_prefix, image_file, cam_type, cam_file, dem_file;\n  read_mapproj_header(opt.mapproj_image, \n                      adj_key, img_file_key, cam_type_key, cam_file_key, dem_file_key,\n                      adj_prefix, image_file, cam_type, cam_file, dem_file);  \n\n  // The image file must match\n  if (image_file != opt.camera_image)\n    vw_throw(ArgumentErr() << \"The image file in the mapproj header of \" \n              << opt.mapproj_image << \" does not match the camera image.\\n\");\n\n  // The dem file must be non-empty\n  if (dem_file == \"\")\n    vw_throw(ArgumentErr() << \"The DEM file in the mapproj header of \" \n              << opt.mapproj_image << \" is empty.\\n\");\n  \n  // Load the camera model  \n  asp::SessionPtr session(asp::StereoSessionFactory::create\n                          (cam_type, // may change\n                            opt, image_file, image_file, cam_file, cam_file,\n                            opt.output_prefix));\n  const Vector2 zero_pixel_offset(0,0);\n  vw::CamPtr map_proj_cam = session->load_camera_model(image_file, cam_file,\n                                                       adj_prefix, zero_pixel_offset);\n  \n  // Prepare the DEM for interpolation  \n  vw::cartography::GeoReference dem_georef;\n  ImageViewRef<PixelMask<double>> interp_dem;\n  asp::create_interp_dem(dem_file, dem_georef, interp_dem);\n\n  // Read the mapproj_image georef\n  vw::cartography::GeoReference map_georef;\n  bool has_mapproj_georef \n    = vw::cartography::read_georeference(map_georef, opt.mapproj_image);\n  if (!has_mapproj_georef)\n    vw_throw(ArgumentErr() << \"No georeference found in: \" << opt.mapproj_image << \".\\n\");\n  \n  // Undo the mapprojection. Skip the matches for which cannot do that.\n  std::vector<vw::ip::InterestPoint> local_ip1, local_ip2;\n  for (size_t ip_iter = 0; ip_iter < ip1.size(); ip_iter++) {\n    if (!asp::projected_ip_to_raw_ip(ip1[ip_iter], interp_dem, map_proj_cam,\n                                    map_georef, dem_georef))\n      continue;\n    local_ip1.push_back(ip1[ip_iter]);\n    local_ip2.push_back(ip2[ip_iter]);\n  }\n  \n  // Replace the old IP with the new ones\n  ip1 = local_ip1;\n  ip2 = local_ip2;\n}\n\nvoid gcp_gen(Options & opt) {\n\n  std::vector<vw::ip::InterestPoint> ip1, ip2;\n  if (opt.match_file == \"\") {\n\n    bool is_mapproj = false;\n    if (opt.mapproj_image == \"\") {\n      matchIpNoCams(opt.camera_image, opt.ortho_image, opt.output_prefix, ip1, ip2);\n    } else {\n      // Consider the advanced --mapproj-image option\n      is_mapproj = true;\n      matchIpNoCams(opt.mapproj_image, opt.ortho_image, opt.output_prefix, ip1, ip2);\n    }\n    \n  } else {\n    vw::vw_out() << \"Reading matches from: \" << opt.match_file << \"\\n\";\n    bool matches_as_txt = asp::stereo_settings().matches_as_txt;\n    vw::ip::read_match_file(opt.match_file, ip1, ip2, matches_as_txt);\n  }\n\n  // If too few matches, fail, rather than give incorrect results\n  if (int(ip1.size()) < opt.min_matches)\n    vw::vw_throw(ArgumentErr() << \"Found only \" << ip1.size() << \" matches, \"\n              << \"fewer than the minimum of \" << opt.min_matches\n              << \" (option --min-matches). Cannot create GCP file.\\n\");\n  \n  if (opt.mapproj_image != \"\")\n    undo_mapproj(opt, ip1, ip2);\n\n  // Populate from two vectors of matched interest points\n  asp::MatchList matchList;\n  matchList.populateFromIpPair(ip1, ip2);\n\n  // Write the GCP file\n  std::vector<std::string> image_files = {opt.camera_image, opt.ortho_image};\n  asp::genWriteGcp(image_files, opt.output_gcp, opt.dem, matchList, opt.gcp_sigma);\n\n  return;\n}\n\n} // end namespace asp\n\nint main(int argc, char *argv[]) {\n\n  asp::Options opt;\n\n  try {\n\n    // Process command line options\n    asp::handle_arguments(argc, argv, opt);\n\n    asp::gcp_gen(opt);\n\n  } ASP_STANDARD_CATCHES;\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/geodiff.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Core/Macros.h>\n#include <asp/Core/AspProgramOptions.h>\n#include <asp/Core/PointUtils.h>\n#include <asp/Core/DemUtils.h>\n\n#include <vw/FileIO/DiskImageView.h>\n#include <vw/FileIO/FileUtils.h>\n#include <vw/Image/ImageChannels.h>\n#include <vw/Image/PixelMath.h>\n#include <vw/Image/ImageMath.h>\n#include <vw/Cartography/GeoTransform.h>\n#include <vw/Cartography/PointImageManipulation.h>\n\nusing namespace vw;\nusing namespace vw::cartography;\nnamespace po = boost::program_options;\nnamespace fs = boost::filesystem;\n\nstruct Options: vw::GdalWriteOptions {\n  std::string dem1_file, dem2_file, output_prefix, csv_format_str, csv_srs, csv_proj4_str;\n  double nodata_value;\n\n  bool use_float, use_absolute;\n};\n\nvoid handle_arguments(int argc, char *argv[], Options& opt) {\n  po::options_description general_options(\"\");\n  general_options.add_options()\n    (\"nodata-value\", po::value(&opt.nodata_value)->default_value(-32768),\n     \"The no-data value to use, unless present in the DEM geoheaders.\")\n    (\"output-prefix,o\", po::value(&opt.output_prefix),\n     \"Specify the output prefix.\")\n    (\"float\", po::bool_switch(&opt.use_float)->default_value(false),\n     \"Output using float (32 bit) instead of using doubles (64 bit). This is now \"\n     \"the default, and this option is obsolete.\")\n    (\"absolute\", po::bool_switch(&opt.use_absolute)->default_value(false),\n     \"Output the absolute difference as opposed to just the difference.\")\n    (\"csv-format\", po::value(&opt.csv_format_str)->default_value(\"\"),\n     asp::csv_opt_caption().c_str())\n    (\"csv-srs\", po::value(&opt.csv_srs)->default_value(\"\"), \n     \"The projection string to use to interpret the entries in input CSV files. If not set, \"\n     \"it will be borrowed from the DEM.\")\n    (\"csv-proj4\", po::value(&opt.csv_proj4_str)->default_value(\"\"), \n     \"An alias for --csv-srs, for backward compatibility.\");\n  general_options.add(vw::GdalWriteOptionsDescription(opt));\n\n  po::options_description positional(\"\");\n  positional.add_options()\n    (\"dem1\", po::value(&opt.dem1_file), \"Explicitly specify the first DEM.\")\n    (\"dem2\", po::value(&opt.dem2_file), \"Explicitly specify the second DEM.\");\n\n  po::positional_options_description positional_desc;\n  positional_desc.add(\"dem1\", 1);\n  positional_desc.add(\"dem2\", 1);\n\n  std::string usage(\"[options] <dem1> <dem2>\");\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line(argc, argv, opt, general_options, general_options,\n                             positional, positional_desc, usage,\n                             allow_unregistered, unregistered);\n\n  if (opt.dem1_file.empty() || opt.dem2_file.empty())\n    vw_throw(ArgumentErr() << \"Requires <dem1> and <dem2> in order to proceed.\\n\\n\"\n             << usage << general_options);\n\n  if (opt.output_prefix.empty())\n    opt.output_prefix = fs::path(opt.dem1_file).stem().string()\n      + \"__\" + fs::path(opt.dem2_file).stem().string();\n\n  vw::create_out_dir(opt.output_prefix);\n\n  // Make this the default. There is no reason to have double-precision differences,\n  // and they are huge.\n  opt.use_float = true;\n    \n  // Must specify either csv_srs or csv_proj4_str, but not both. The latter is \n  // for backward compatibility.\n  if (!opt.csv_srs.empty() && !opt.csv_proj4_str.empty())\n    vw_throw(ArgumentErr() << \"Cannot specify both --csv-srs and --csv-proj4.\\n\");\n  if (!opt.csv_proj4_str.empty() && opt.csv_srs.empty())\n    opt.csv_srs = opt.csv_proj4_str;\n  \n}\n\nvoid georef_sanity_checks(GeoReference const& georef1, GeoReference const& georef2){\n\n  // We don't support datum changes!\n  if (std::abs(georef1.datum().semi_major_axis()\n               - georef2.datum().semi_major_axis()) > 0.1 ||\n      std::abs(georef1.datum().semi_minor_axis()\n               - georef2.datum().semi_minor_axis()) > 0.1 ||\n      georef1.datum().meridian_offset() != georef2.datum().meridian_offset()) {\n    vw_throw(NoImplErr() << \"geodiff can't difference DEMs which have differing \"\n             << \"datum radii or meridian offsets.\\n\");\n  }\n  if (georef1.datum().semi_major_axis() == georef2.datum().semi_major_axis() &&\n      georef1.datum().semi_minor_axis() == georef2.datum().semi_minor_axis() &&\n      georef1.datum().meridian_offset() == georef2.datum().meridian_offset() &&\n      georef1.datum().proj4_str()       != georef2.datum().proj4_str()) {\n    vw_out(WarningMessage) << \"Found DEMs with same datum radii and meridian offsets but \"\n                           << \"different projection strings. Use some caution.\\n\";\n  }\n  \n}\n\nvoid dem2dem_diff(Options& opt) {\n  \n  DiskImageResourceGDAL dem1_rsrc(opt.dem1_file), dem2_rsrc(opt.dem2_file);\n  double dem1_nodata = opt.nodata_value, dem2_nodata = opt.nodata_value;\n  if (dem1_rsrc.has_nodata_read()) {\n    dem1_nodata = dem1_rsrc.nodata_read();\n    opt.nodata_value = dem1_nodata;\n    vw_out() << \"\\tFound input nodata value for DEM 1: \" << dem1_nodata << \"\\n\";\n    vw_out() << \"Using this nodata value on output.\\n\";\n  }\n  if (dem2_rsrc.has_nodata_read()) {\n    dem2_nodata = dem2_rsrc.nodata_read();\n    vw_out() << \"\\tFound input nodata value for DEM 2: \" << dem2_nodata << \"\\n\";\n  }\n\n  if (dem1_rsrc.channels() != 1 || dem2_rsrc.channels() != 1)\n      vw_throw(ArgumentErr() << \"The input DEMs must have a single channel.\\n\");\n  \n  DiskImageView<double> dem1_disk_image_view(dem1_rsrc), dem2_disk_image_view(dem2_rsrc);\n\n  GeoReference dem1_georef, dem2_georef;\n  bool has_georef1 = read_georeference(dem1_georef, dem1_rsrc);\n  bool has_georef2 = read_georeference(dem2_georef, dem2_rsrc);\n  if (!has_georef1 || !has_georef2) \n    vw_throw(ArgumentErr() << \"geodiff cannot difference files without a georeference.\\n\");\n  \n  georef_sanity_checks(dem1_georef, dem2_georef);\n\n  // Generate a bounding box that is the minimum of the two BBox areas. For\n  // that, first transform the second DEM's bounding box to first DEM's\n  // coordinates.\n  BBox2i dem1_crop_box = bounding_box(dem1_disk_image_view);\n  GeoTransform gt(dem2_georef, dem1_georef);\n  BBox2i box21 = gt.forward_bbox(bounding_box(dem2_disk_image_view));\n  dem1_crop_box.crop(box21);\n  if (dem1_crop_box.empty()) \n    vw_throw(ArgumentErr() << \"The two DEMs do not have a common area.\\n\");\n\n  // Crop the first DEM to the shared box, then transform and crop the second DEM\n  // to same box. Use bilinear interpolation for the transform.\n  ImageViewRef<PixelMask<double>> dem1_crop \n    = crop(create_mask(dem1_disk_image_view, dem1_nodata), dem1_crop_box);\n  ImageViewRef<PixelMask<double>> dem2_trans \n    = asp::warpCrop(dem2_disk_image_view, dem2_nodata, dem2_georef,\n                    dem1_georef, dem1_crop_box, \"bilinear\");\n  \n  ImageViewRef<double> difference;\n  if (opt.use_absolute)\n    difference = apply_mask(abs(dem1_crop - dem2_trans), opt.nodata_value);\n  else\n    difference = apply_mask(dem1_crop - dem2_trans, opt.nodata_value);\n    \n  GeoReference crop_georef = crop(dem1_georef, dem1_crop_box);\n    \n  std::string output_file = opt.output_prefix + \"-diff.tif\";\n  vw_out() << \"Writing difference file: \" << output_file << \"\\n\";\n  \n  bool has_georef = true;\n  bool has_nodata = true;\n  auto tpc = TerminalProgressCallback(\"asp\", \"\\t--> Differencing: \");\n    \n  if (opt.use_float) {\n    ImageViewRef<float> difference_float = channel_cast<float>(difference);\n    vw::cartography::block_write_gdal_image(output_file, difference_float,\n                                            has_georef, crop_georef,\n                                            has_nodata, opt.nodata_value,\n                                            opt, tpc);\n  } else {\n    vw::cartography::block_write_gdal_image(output_file, difference,\n                                            has_georef, crop_georef,\n                                            has_nodata, opt.nodata_value,\n                                            opt, tpc);\n  }\n}\n\n// From a DEM, subtract a csv file. Reverse the sign is 'reverse' is true.\nvoid dem2csv_diff(Options & opt, std::string const& dem_file,\n                  std::string const & csv_file, bool reverse){\n  \n  if (opt.csv_format_str == \"\")\n    vw_throw(ArgumentErr() << \"CSV files were passed in, but the \"\n             << \"option --csv-format was not set.\\n\");\n\n  // Read the DEM\n  DiskImageView<double> dem(dem_file);\n\n  // Read the no-data\n  double dem_nodata = opt.nodata_value;\n  {\n    // Use a scope to free up fast this handle\n    DiskImageResourceGDAL dem_rsrc(dem_file);\n    if (dem_rsrc.has_nodata_read()) {\n      dem_nodata = dem_rsrc.nodata_read();\n      opt.nodata_value = dem_nodata;\n      vw_out() << \"\\tFound input nodata value for DEM: \" << dem_nodata << \"\\n\";\n    }\n    \n    if (dem_rsrc.channels() != 1)\n      vw_throw(ArgumentErr() << \"The input DEM must have a single channel.\\n\");\n  }\n  \n  // Read the DEM georef\n  GeoReference dem_georef;\n  bool has_georef = read_georeference(dem_georef, dem_file);\n  if (!has_georef) \n    vw_throw(ArgumentErr() << \"geodiff cannot load a georeference from: \" << dem_file << \".\\n\");\n\n  if (opt.csv_srs == \"\")\n    opt.csv_srs = dem_georef.get_wkt(); // Copy from the DEM\n  \n  // Configure a CSV converter object according to the input parameters\n  asp::CsvConv csv_conv;\n  csv_conv.parse_csv_format(opt.csv_format_str, opt.csv_srs); // Modifies csv_conv\n  if (!csv_conv.is_configured()) \n    vw_throw(ArgumentErr() << \"Could not configure the csv parser.\\n\");\n\n  // Set the georef for CSV files\n  GeoReference csv_georef = dem_georef;\n  csv_conv.parse_georef(csv_georef);\n\n  std::list<asp::CsvConv::CsvRecord> csv_records;\n  typedef std::list<asp::CsvConv::CsvRecord>::const_iterator RecordIter;\n  csv_conv.read_csv_file(csv_file, csv_records);\n  \n  std::vector<Vector3> csv_llh;\n  for (RecordIter iter = csv_records.begin(); iter != csv_records.end(); iter++) {\n    Vector3 xyz = csv_conv.csv_to_cartesian(*iter, csv_georef);\n    if (xyz == Vector3() || xyz != xyz)\n      continue; // invalid point\n    Vector3 llh = dem_georef.datum().cartesian_to_geodetic(xyz); // use the dem's datum\n    csv_llh.push_back(llh);\n  }\n\n  // We will interpolate into the DEM to find the difference\n  ImageViewRef<PixelMask<double>> interp_dem\n    = interpolate(create_mask(dem, dem_nodata),\n\t\t  BilinearInterpolation(), ConstantEdgeExtension());\n\n  // Save the diffs\n  int    count     = 0;\n  double diff_min  = std::numeric_limits<double>::max();\n  double diff_max  = -diff_min;\n  double diff_mean = 0.0;\n  double diff_std  = 0.0;\n\n  vw::TerminalProgressCallback tpc(\"Diff:\", \"\\t--> \");\n  tpc.report_progress(0);\n  double hundred = 100.0;\n  double inc_amount = hundred / std::max(csv_llh.size(), size_t(1));\n\n  std::vector<Vector3> csv_diff;\n  std::vector<double> csv_errs;\n  int prev_progress = 0;\n  for (size_t it = 0; it < csv_llh.size(); it++) {\n\n    Vector3 llh = csv_llh[it];\n    Vector2 ll  = subvector(llh, 0, 2);\n    Vector2 pix = dem_georef.lonlat_to_pixel(ll);\n    \n    // Check for out of range\n    if (pix[0] < 0 || pix[0] > dem.cols() - 1) continue;\n    if (pix[1] < 0 || pix[1] > dem.rows() - 1) continue;\n    PixelMask<double> dem_ht = interp_dem(pix[0], pix[1]);\n    if (!is_valid(dem_ht))\n      continue;\n\n    double diff = dem_ht.child() - llh[2];\n    if (reverse) \n      diff *= -1;\n    if (opt.use_absolute)\n      diff = std::abs(diff);\n\n    if (diff > diff_max) diff_max = diff;\n    if (diff < diff_min) diff_min = diff;\n\n    diff_mean += diff;\n    diff_std  += diff*diff;\n    count     += 1;\n    csv_diff.push_back(Vector3(ll[0], ll[1], diff));\n    csv_errs.push_back(diff);\n    \n    int percent_progress = (int)round(it * inc_amount);\n    if (percent_progress != prev_progress) {\n      tpc.report_incremental_progress(1.0 / hundred);\n      prev_progress = percent_progress;\n    }\n  }\n  \n  tpc.report_finished();\n  \n\n  if (count > 0) {\n    diff_mean /= count;\n    diff_std = diff_std/count - diff_mean*diff_mean;\n    if (diff_std < 0)\n      diff_std = 0; // just in case, for numerical noise\n    diff_std = std::sqrt(diff_std);\n  }\n\n  double diff_median = 0.0;\n  std::sort(csv_errs.begin(), csv_errs.end());\n  if (csv_errs.size() > 0) \n    diff_median = csv_errs[csv_errs.size()/2];\n\n  vw_out() << \"Max difference:       \" << diff_max    << \" meters\" << \"\\n\";\n  vw_out() << \"Min difference:       \" << diff_min    << \" meters\" << \"\\n\";\n  vw_out() << \"Mean difference:      \" << diff_mean   << \" meters\" << \"\\n\";\n  vw_out() << \"StdDev of difference: \" << diff_std    << \" meters\" << \"\\n\";\n  vw_out() << \"Median difference:    \" << diff_median << \" meters\" << \"\\n\";\n\n  std::string output_file = opt.output_prefix + \"-diff.csv\";\n  vw_out() << \"Writing difference file: \" << output_file << \"\\n\";\n  std::ofstream outfile( output_file.c_str() );\n  outfile.precision(16);\n  outfile << \"# longitude,latitude, height diff (m)\" << \"\\n\";\n  outfile << \"# \" << dem_georef.datum() << \"\\n\"; // dem's datum\n  outfile << \"# Max difference:       \" << diff_max    << \" meters\" << \"\\n\";\n  outfile << \"# Min difference:       \" << diff_min    << \" meters\" << \"\\n\";\n  outfile << \"# Mean difference:      \" << diff_mean   << \" meters\" << \"\\n\";\n  outfile << \"# StdDev of difference: \" << diff_std    << \" meters\" << \"\\n\";\n  outfile << \"# Median difference:    \" << diff_median << \" meters\" << \"\\n\";\n  for (size_t it = 0; it < csv_diff.size(); it++) {\n    Vector3 diff = csv_diff[it];\n    outfile << diff[0] << \",\" << diff[1] << \",\" << diff[2] << \"\\n\";\n  }\n}\n\n// Subtract from the first dem the second. One of them can be a CSV file.\nint main(int argc, char *argv[]) {\n\n  Options opt;\n  try {\n    handle_arguments(argc, argv, opt);\n\n    bool is_dem1_csv = asp::is_csv(opt.dem1_file);\n    bool is_dem2_csv = asp::is_csv(opt.dem2_file);\n\n    if (is_dem1_csv && is_dem2_csv) \n      vw_throw(ArgumentErr()\n               << \"Cannot do the diff of two csv files. One of them \"\n               << \"can be converted to a DEM using point2dem fist.\\n\");\n    \n    bool reverse = false; // true if first DEM is a csv\n    if (is_dem1_csv) {\n      reverse = true;\n      dem2csv_diff(opt, opt.dem2_file, opt.dem1_file, reverse);\n    }else if (is_dem2_csv){\n      reverse = false;\n      dem2csv_diff(opt, opt.dem1_file, opt.dem2_file, reverse);\n    }else{\n      // Both are regular DEMs\n      dem2dem_diff(opt);\n    }\n\n  } ASP_STANDARD_CATCHES;\n  \n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/hiedr2mosaic.py",
    "content": "#!/usr/bin/env python\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2020, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\nfrom __future__ import print_function\nimport os, glob, optparse, re, shutil, subprocess, sys, string\ntry:\n    from urllib2 import urlopen\nexcept ImportError:  \n    from urllib.request import urlopen\n\nlibexecpath = os.path.abspath(sys.path[0] + '/../libexec')\nsys.path.insert(0, libexecpath) # prepend to Python path\nfrom asp_system_utils import get_asp_version\n\nimport asp_system_utils\nasp_system_utils.verify_python_version_is_supported()\n\njob_pool = []\n\ndef man(option, opt, value, parser):\n    print(parser.usage, file=sys.stderr)\n    print('''\\\nThis program operates on HiRISE EDR (.IMG) channel files, and performs the\nfollowing ISIS 3 operations:\n * Converts to ISIS format (hi2isis)\n * Performs radiometric calibration (hical)\n * Stitches the channel files together into single CCD files (histitch)\n * Attaches SPICE information (spiceinit and spicefit)\n * Removes camera distortions from the CCD images (noproj)\n * Perfroms jitter analysis (hijitreg)\n * Mosaics individual CCDs into one unified image file (handmos)\n * Normalizes the mosaic (cubenorm)\n''', file=sys.stderr)\n    \n    sys.exit()\n\nclass Usage(Exception):\n    def __init__(self, msg):\n        self.msg = msg\n\nclass CCDs(dict):\n    ''''''\n    def __init__(self, cubes, match=5):\n        self.prefix = os.path.commonprefix( cubes )\n        dict.__init__(self)\n        for cub in cubes:\n            number = int( cub[len(self.prefix)] )\n            self[number] = cub\n        self.match = int(match)\n\n    def min(self):\n        return min( self.keys() )\n\n    def max(self):\n        return max( self.keys() )\n\n    def matchcube(self):\n        return self[self.match]\n\n\ndef add_job( cmd, num_working_threads=4 ):\n    if len(job_pool) >= num_working_threads:\n        job_pool[0].wait()\n        job_pool.pop(0)\n    print(cmd)\n    job_pool.append( subprocess.Popen(cmd, shell=True) )\n\ndef wait_on_all_jobs():\n    print(\"Waiting for jobs to finish\")\n    while len(job_pool) > 0:\n        job_pool[0].wait()\n        job_pool.pop(0)\n\ndef read_flatfile( flat ):\n    f = open(flat,'r')\n    averages = [0.0,0.0]\n    try:\n        for line in f:\n            if line.rfind(\"Average Sample Offset:\") > 0:\n                index       = line.rfind(\"Offset:\")\n                index_e     = line.rfind(\"StdDev:\")\n                crop        = line[index+7:index_e]\n                averages[0] = float(crop)\n            elif line.rfind(\"Average Line Offset:\") > 0:\n                index       = line.rfind(\"Offset:\")\n                index_e     = line.rfind(\"StdDev:\")\n                crop        = line[index+7:index_e]\n                averages[1] = float(crop)\n    except ValueError:\n        print(\"Could not extract valid offsets from the flat file (\" +\n              flat + \"). \"\n              \"This could be because no matches were found. \"\n              \"You may need to run hijitreg manually with a \"\n              \"custom REGDEF parameter.  In order for this program \"\n              \"to complete, we are returning zeros as the offset \"\n              \"but this may result in misaligned CCDs.\")\n    return averages\n\ndef check_output_files(file_list):\n    '''Verify the output files were created.'''\n    for f in file_list:\n        if not os.path.exists(f):\n            raise Exception('Failed to generate file: ' + f)\n\ndef hi2isis( img_files, threads ):\n    hi2isis_cubs = []\n    for img in img_files:\n        # Expect to end in .IMG, change to end in .cub\n        to_cub = os.path.splitext( os.path.basename(img) )[0] + '.cub'\n        if os.path.exists(to_cub):\n            print(to_cub + ' exists, skipping hi2isis.')\n        else:\n            cmd = 'hi2isis from= '+ img +' to= '+ to_cub\n            add_job(cmd, threads)\n        hi2isis_cubs.append( to_cub )\n    wait_on_all_jobs()\n    check_output_files(hi2isis_cubs)\n    return hi2isis_cubs\n\ndef hical( cub_files, threads, delete=False ):\n    hical_cubs = []\n    for cub in cub_files:\n        # Expect to end in .cub, change to end in .hical.cub\n        to_cub = os.path.splitext(cub)[0] + '.hical.cub'\n        if os.path.exists(to_cub):\n            print(to_cub + ' exists, skipping hical.')\n        else:\n            cmd = 'hical from=  '+ cub +' to= '+ to_cub\n            add_job(cmd, threads)\n        hical_cubs.append( to_cub )\n    wait_on_all_jobs()\n    check_output_files(hical_cubs)\n    if delete:\n        for cub in cub_files: os.remove( cub )\n        hical_log_files = glob.glob( os.path.commonprefix(cub_files) + '*.hical.log' )\n        for file in hical_log_files: os.remove( file )\n    return hical_cubs\n\ndef histitch( cub_files, threads, delete=False ):\n    histitch_cubs = []\n    to_del_cubs   = []\n    # Strictly, we should probably look in the image headers, but instead we'll\n    # assume that people have kept a sane naming convention for their files, such\n    # that the name consists of prefix + 'N_C' + suffix\n    # where prefix we extract below and the 'N_C' string is where N is the CCD number\n    # and C is the channel number.\n    prefix = os.path.commonprefix( cub_files )\n    channel_files = [[None]*2 for i in range(10)]\n    pattern = re.compile(r\"(\\d)_(\\d)\")\n    for cub in cub_files:\n        match = re.match( pattern, cub[len(prefix):] )\n        if match:\n            ccd     = match.group(1)\n            channel = match.group(2)\n            # print ('ccd: ' + ccd + ' channel: '+ channel)\n            channel_files[int(ccd)][int(channel)] = cub\n        else:\n            raise Exception( 'Could not find a CCD and channel identifier in ' + cub )\n\n    for i in range(10):\n        to_cub = prefix + str(i) + '.histitch.cub'\n\n        if channel_files[i][0] and channel_files[i][1]:\n            if os.path.exists(to_cub):\n                print(to_cub + ' exists, skipping histitch.')\n            else:\n                cmd = 'histitch balance= TRUE from1= '+ channel_files[i][0] \\\n                        +' from2= '+ channel_files[i][1] +' to= '+ to_cub\n                add_job(cmd, threads)\n                to_del_cubs.append( channel_files[i][0] )\n                to_del_cubs.append( channel_files[i][1] )\n            histitch_cubs.append( to_cub )\n        elif channel_files[i][0] or channel_files[i][1]:\n            if channel_files[i][0]:\n                found = channel_files[i][0]\n            else:\n                found = channel_files[i][1]\n            print('Found '+ found  +' but not the matching channel file.')\n            cmd = 'histitch from1= '+ found +' to= '+ to_cub\n            add_job(cmd, threads)\n            to_del_cubs.append( found )\n            histitch_cubs.append( to_cub )\n\n    wait_on_all_jobs()\n    check_output_files(histitch_cubs)\n    if delete:\n        for cub in to_del_cubs: os.remove( cub )\n    return histitch_cubs\n\ndef spice( cub_files, threads, web):\n    for cub in cub_files:\n        cmd = f'spiceinit WEB={web} from={cub}'\n        add_job(cmd, threads)\n    wait_on_all_jobs()\n    for cub in cub_files:\n        cmd = 'spicefit from= '+ cub\n        add_job(cmd, threads)\n    wait_on_all_jobs()\n    return\n\ndef noproj( CCD_object, threads, delete=False ):\n    noproj_CCDs = []\n    for i in CCD_object.keys():\n        to_cub = CCD_object.prefix + str(i) + '.noproj.cub'\n        if os.path.exists( to_cub ):\n            print(to_cub + ' exists, skipping noproj.')\n        else:\n            cmd = 'mkdir -p tmp_' + CCD_object[i] + '&& ' \\\n                + 'cd tmp_' + CCD_object[i] + '&& ' \\\n                + 'noproj from=../' + CCD_object[i] \\\n                + ' match=../' + CCD_object.matchcube() \\\n                + ' source= frommatch to=../'+ to_cub + '&& ' \\\n                + 'cd .. && rm -rf tmp_' + CCD_object[i]\n            # cmd = 'noproj from= '+ CCD_object[i]    \\\n            #     +' match= '+ CCD_object.matchcube() \\\n            #     +' source= frommatch to= '+ to_cub\n            add_job(cmd, threads)\n            # print (cmd)\n            # os.system(cmd)\n        noproj_CCDs.append( to_cub )\n    wait_on_all_jobs()\n    if delete:\n        for cub in CCD_object.values(): os.remove( cub )\n    return CCDs( noproj_CCDs, CCD_object.match )\n\n# Check for failure for hijitreg.  Sometimes bombs?  Default to zeros.\ndef hijitreg( noproj_CCDs, threads, delete=False ):\n    for i in noproj_CCDs.keys():\n        j = i + 1\n        if( j not in noproj_CCDs ): continue\n        cmd = 'hijitreg from= '+ noproj_CCDs[i]         \\\n            +' match= '+ noproj_CCDs[j]                 \\\n            + ' flatfile= flat_'+str(i)+'_'+str(j)+'.txt'\n        add_job(cmd, threads)\n    wait_on_all_jobs()\n\n    averages = dict()\n\n    for i in noproj_CCDs.keys():\n        j = i + 1\n        if( j not in noproj_CCDs ): continue\n        flat_file = 'flat_'+str(i)+'_'+str(j)+'.txt'\n        averages[i] = read_flatfile( flat_file )\n        if delete:\n            os.remove( flat_file )\n\n    return averages\n\ndef mosaic( noprojed_CCDs, averages ):\n    mosaic = noprojed_CCDs.prefix+'.mos_hijitreged.cub'\n    shutil.copy( noprojed_CCDs.matchcube(), mosaic )\n    sample_sum = 1\n    line_sum   = 1\n    for i in range( noprojed_CCDs.match-1, noprojed_CCDs.min()-1, -1):\n        if i not in noprojed_CCDs: continue\n        sample_sum  += averages[i][0]\n        line_sum    += averages[i][1]\n        handmos( noprojed_CCDs[i], mosaic,\n                 str( int(round( sample_sum )) ),\n                 str( int(round( line_sum )) ) )\n\n    sample_sum = 1\n    line_sum = 1\n    for i in range( noprojed_CCDs.match+1, noprojed_CCDs.max()+1, 1):\n        if i not in noprojed_CCDs: continue\n        sample_sum  -= averages[i-1][0]\n        line_sum    -= averages[i-1][1]\n        handmos( noprojed_CCDs[i], mosaic,\n                 str( int(round( sample_sum )) ),\n                 str( int(round( line_sum )) ) )\n\n    return mosaic\n\n\ndef handmos( fromcub, tocub, outsamp, outline ):\n    cmd = 'handmos from= '+ fromcub +' mosaic= '+ tocub \\\n            +' outsample= '+ outsamp \\\n            +' outline= '+   outline \\\n            +' priority= beneath'\n    os.system(cmd)\n    return\n\ndef cubenorm( fromcub, delete=False ):\n    tocub = os.path.splitext(fromcub)[0] + '.norm.cub'\n    cmd   = 'cubenorm from= '+ fromcub+' to= '+ tocub\n    print(cmd)\n    os.system(cmd)\n    if delete:\n        os.remove( fromcub )\n    return tocub\n\n\ndef fetch_files( url, output_folder, image_type='RED' ):\n    '''Fetch all the files for a HiRISE image and return the list of files.'''\n\n    os.system('mkdir -p ' + output_folder)\n\n    # The URL should look like this:\n    # https://hirise-pds.lpl.arizona.edu/PDS/EDR/ESP/ORB_052800_052899/ESP_052893_1835/\n\n    try:\n        # python2 \n        from BeautifulSoup import BeautifulSoup\n        parsedDataPage = BeautifulSoup(urlopen(url).read())\n    except:\n        # python3\n        try:\n            from bs4 import BeautifulSoup        \n            parsedDataPage = BeautifulSoup(urlopen(url).read(), \"html.parser\")\n        except Exception as e:\n            raise Exception(\"Error: \" + str(e) + \"\\n\" + \n                            \"If this is a missing module error, please install \" + \\\n                            \"BeautifulSoup for python 2 or bs4 for python 3.\\n\" +\n                            \"Or do not use the --download-folder option.\")\n        \n    # Loop through all the links on the page\n    image_list = []\n    for link in parsedDataPage.findAll('a'):\n        filename = link.string\n        if image_type not in filename:\n            continue # Skip types that don't match\n        \n        full_url   = os.path.join(url,           filename)\n        local_path = os.path.join(output_folder, filename)\n        image_list.append(local_path)\n\n        # Download the file if it is not already there        \n        if not os.path.exists(local_path):\n            cmd = 'wget ' + full_url + ' -O ' + local_path\n            print (cmd)\n            os.system(cmd)\n    \n    return image_list\n\ndef get_ccd(path):\n    '''Returns the CCD number of a filename.'''\n    \n    filename = os.path.basename(path)\n\n    # Out of 'ESP_023957_1755/ESP_023957_1755_RED5_1.IMG', pull '_RED5_1',\n    # and extract the number 5.\n    match = re.match(r\"^.*?RED(\\d)\", filename )\n    if not match:\n        raise Exception('Could not extract the CCD number from: ' + filename)\n    ccd = int(match.group(1))\n    return ccd\n\n#----------------------------\n\ndef main():\n    try:\n        try:\n            usage = \"usage: hiedr2mosaic.py [--help][--manual][--threads N][--keep][-m match][-w bool] HiRISE-EDR.IMG-files\\n  \" + get_asp_version()\n            parser = optparse.OptionParser(usage=usage)\n            parser.set_defaults(delete=True)\n            parser.set_defaults(match=5)\n            parser.set_defaults(threads=4)\n            parser.set_defaults(web=False)\n            parser.add_option(\"--manual\", action=\"callback\", callback=man,\n                              help=\"Read the manual.\")\n            parser.add_option(\"--stop-at-no-proj\", dest=\"stop_no_proj\", action=\"store_true\",\n                              help=\"Process the IMG files only to have SPICE attached. This allows jigsaw to happen\")\n            parser.add_option(\"--resume-at-no-proj\", dest=\"resume_no_proj\", action=\"store_true\",\n                              help=\"Pick back up after spiceinit has happened or jigsaw. This was noproj uses your new camera information\")\n            parser.add_option(\"-t\", \"--threads\", dest=\"threads\",\n                              help=\"Number of threads to use.\",type=\"int\")\n            parser.add_option(\"-m\", \"--match\", dest=\"match\",type=\"int\",\n                              help=\"CCD number of match CCD, passed as the match argument to noproj (default 5).\")\n            parser.add_option(\"-w\", \"--web\", action=\"store_true\", dest=\"web\",\n                              help=\"Invokes spiceinit with web=true, to fetch the kernels from the web.\")\n            parser.add_option(\"-k\", \"--keep\", action=\"store_false\",\n                              dest=\"delete\",\n                              help=\"Will not delete intermediate files.\")\n            parser.add_option(\"--download-folder\", dest=\"download_folder\", default=None,\n                              help=\"Download files to this folder. Hence the second argument to this is the URL of the page to download the files from.\")\n            \n\n            (options, args) = parser.parse_args()\n\n            if not args: \n                parser.error(\"need .IMG files or a URL\")\n            \n            if options.download_folder:\n                print ('Downloading HiRISE images from URL...')\n                # For now we only fetch RED images.\n                args = fetch_files(args[0], options.download_folder, image_type='RED')\n                print ('Finished downloading ' + str(len(args)) + ' images.')\n\n            # Verify that we have both of the specified match CCD's.\n            # This is applicable only when we start with initial IMG files.\n            if not options.resume_no_proj:            \n                matchCount = 0\n                for a in args:\n                    if get_ccd(a) == options.match:\n                        matchCount += 1\n                        \n                if matchCount != 2:\n                    print ('Error: Found ' + str(matchCount) + ' files for match CCD ' \n                           + str(options.match) + ' instead of 2.')\n                    return -1\n\n            numCcds = len(args) / 2\n\n        except optparse.OptionError as msg:\n            raise Usage(msg)\n\n        if not options.resume_no_proj:\n            # hi2isis\n            hi2isised = hi2isis( args, options.threads )\n\n            # hical\n            hicaled = hical( hi2isised, options.threads, options.delete )\n\n            # histitch\n            histitched = histitch( hicaled, options.threads, options.delete )\n\n            # attach spice\n            spice( histitched, options.threads, options.web)\n\n        if options.stop_no_proj:\n            print(\"Finished\")\n            return 0\n\n        if options.resume_no_proj:\n            histitched = args\n\n        CCD_files = CCDs( histitched, options.match )\n\n        # noproj\n        noprojed_CCDs = noproj( CCD_files, options.threads, options.delete )\n\n        # hijitreg\n        averages = hijitreg( noprojed_CCDs, options.threads, options.delete )\n\n        # mosaic handmos\n        mosaicked = mosaic( noprojed_CCDs, averages )\n\n        # Clean up noproj files\n        if options.delete:\n          for cub in noprojed_CCDs.values():\n              os.remove( cub )\n\n        # Run a final cubenorm across the image:\n        cubenorm( mosaicked, options.delete )\n\n        print(\"Finished\")\n        return 0\n\n    except Usage as err:\n        print (err.msg, file = sys.stderr)\n        return 2\n\n    # To more easily debug this program, comment out this catch block.\n    # except Exception as err:\n    #     sys.stderr.write( str(err) + '\\n' )\n    #     return 1\n\n\nif __name__ == \"__main__\":\n    sys.exit(main())\n"
  },
  {
    "path": "src/asp/Tools/historical_helper.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n'''\nPython tool for working with historical data products.\n'''\nfrom __future__ import print_function\nimport sys\nimport os, shutil, string, errno, argparse, subprocess\n#import simplekml, json\nimport numpy as np\n\n# The path to the ASP python files\nbasepath    = os.path.abspath(sys.path[0])\npythonpath  = os.path.abspath(basepath + '/../Python')  # for dev ASP\nlibexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP\nlibpath = os.path.abspath(basepath + '/../lib') # path to the lib directory\nsys.path.insert(0, basepath) # prepend to Python path\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\n\nfrom asp_alg_utils import *\n\nimport asp_file_utils, asp_system_utils, asp_cmd_utils, asp_image_utils, asp_string_utils\nasp_system_utils.verify_python_version_is_supported()\n\n# Prepend to system PATH\nos.environ[\"PATH\"] = libexecpath + os.pathsep + os.environ[\"PATH\"]\n\n# Prepend to system LD_LIBRARY_PATH\nif \"LD_LIBRARY_PATH\" not in os.environ:\n    os.environ[\"LD_LIBRARY_PATH\"] = \"\"\nos.environ[\"LD_LIBRARY_PATH\"] = libpath + os.pathsep + os.environ[\"LD_LIBRARY_PATH\"]\n\n#------------------------------------------------------------------------------\n\nclass BBox:\n    '''Simple bounding box class'''\n    def __init__(self):\n        self.minX = 999999999\n        self.maxX = 0\n        self.minY = 999999999\n        self.maxY = 0\n\n    def __str__(self):\n        return ('Min: (%lf, %lf), Max: (%lf, %lf)'\n                % (self.minX, self.minY, self.maxX, self.maxY))\n\n    def expandToContain(self, pt):\n        if pt[0] < self.minX: self.minX = pt[0]\n        if pt[0] > self.maxX: self.maxX = pt[0]\n        if pt[1] < self.minY: self.minY = pt[1]\n        if pt[1] > self.maxY: self.maxY = pt[1]\n\n    def width(self):\n        return self.maxX - self.minX\n    def height(self):\n        return self.maxY - self.minY\n\ndef parseInterestPoints(ipString):\n    '''Return the list of IP as a numpy array'''\n\n    parts = ipString.split()\n    if len(parts) % 2 == 1:\n        raise Exception('The number of IP numbers must be even!')\n    numIp = int(len(parts) / 2)\n\n    ip = np.ndarray(shape=(numIp,2), dtype=float)\n\n    for i in range(numIp):\n        ip[i,0] = float(parts[2*i  ])\n        ip[i,1] = float(parts[2*i+1])\n\n    return ip\n\n\ndef computeAngle(topLeft, topRight):\n    '''Compute the angle from the top left to the top right of an image.\n       Positive rotation = clockwise.'''\n    horizVec    = (1,0)\n    measuredVec = topRight - topLeft\n\n    denom   = np.linalg.norm(horizVec)*np.linalg.norm(measuredVec)\n    angle   = np.arccos(np.dot(measuredVec,horizVec) / denom)\n    degrees = np.rad2deg(angle)\n\n    return degrees\n\n\ndef rotateAndCrop(options):\n    '''Apply a rotation and crop to the image so that the output image is horizontal and cropped.'''\n\n    ip    = parseInterestPoints(options.interestPoints)\n    numIp = ip.shape[0]\n    if numIp != 4:\n        raise Exception('rotate-crop requires the following IP: top-left, top-right, bot-right, bot-left')\n\n    degrees = computeAngle(ip[0,:], ip[1,:])\n    radians = np.deg2rad(degrees)\n\n    box = BBox()\n    rotMatrix = np.array([[np.cos(radians), -np.sin(radians)],\n                          [np.sin(radians),  np.cos(radians)]], np.float32)\n    for i in range(numIp):\n        rotLoc = np.matmul(rotMatrix, ip[i,:])\n        box.expandToContain(rotLoc)\n\n    offsetX = box.minX\n    offsetY = box.minY\n    cropX   = box.width()\n    cropY   = box.height()\n\n    # All option to rotate without cropping\n    cropCmd = ''\n    if options.operation == 'rotate-crop':\n        cropCmd = (\"-crop '%dx%d+%d+%d'\" % (cropX, cropY, offsetX, offsetY))\n\n    cmd = (\"%s %s -define tiff:tile-geometry=256x256 -distort ScaleRotateTranslate '0,0 %lf' %s %s\"\n           % (options.convertPath, options.inputPath, degrees, cropCmd, options.outputPath))\n    print(cmd)\n    os.system(cmd)\n\ndef refineConvertPath(convertPath):\n    \"\"\"Returns the full path to a validated ImageMagic 'convert' executable. In particular, fail if the the embree tool with the same name is found.\"\"\"\n\n    if convertPath == \"\":\n        convertPath = \"convert\"\n\n    # Look for the tool using the 'which' command\n    cmd = ['which', convertPath]\n    p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,\n                         universal_newlines=True)\n    out, err = p.communicate()\n\n    # Check if that command failed to find the file\n    failString = 'no ' + convertPath + ' in ('\n    if out.find(failString) >= 0 or p.returncode != 0:\n        raise Exception('Failed to find \"convert\".')\n    \n    # So far so good, have a tool. Now check if it is the right one\n    convertPath = out.rstrip()\n\n    cmd = [convertPath, '--help']\n    p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,\n                         universal_newlines=True)\n    out, err = p.communicate()\n    if 'ImageMagick' not in out:\n        raise Exception('The tool \"' + convertPath + '\" does not appear to be ImageMagick convert.')\n\n    return convertPath\n\ndef main(argsIn):\n\n    try:\n\n        # Use parser that ignores unknown options\n        usage  = \"usage: historical_helper [options] <rotate or rotate-crop>\"\n        parser = argparse.ArgumentParser(usage=usage)\n\n        parser.add_argument(\"--input-path\", dest=\"inputPath\", default=None, required=True,\n                                              help=\"Path of the input file to process\")\n\n        parser.add_argument(\"--output-path\", dest=\"outputPath\", default=None, required=True,\n                                              help=\"The output file to write.\")\n\n        parser.add_argument(\"--interest-points\", dest=\"interestPoints\", default=None,\n                                          help=\"List of column and row pairs contained in quotes.\")\n        parser.add_argument('operation')\n\n        parser.add_argument(\"--convert-path\", dest=\"convertPath\", default=\"\", required=False,\n                                              help=\"Path to the ImageMagick 'convert' executable to use in processing. If not set, the directory having this tool must be prepended to the system path.\")\n\n        # This call handles all the parallel_mapproject specific options.\n        options = parser.parse_args(argsIn)\n\n    except argparse.ArgumentError as msg:\n        raise Usage(msg)\n\n    try:\n        options.convertPath = refineConvertPath(options.convertPath)\n    except Exception as e:\n        print('Cannot find the \"convert\" tool, or the wrong tool was found. Install the ImageMagick software, for example, with conda, and then prepend the directory having that tool to PATH, or pass it to this program as --convert-path /path/to/convert.')\n        # Uncomment below for further debug info. It can be too verbose for the user though.\n        #print(e)\n        return -1\n\n    # Make a directory having the output file\n    outDir = os.path.dirname(options.outputPath)\n    if outDir != \"\" and (not os.path.exists(outDir)):\n        os.makedirs(outDir)\n        \n    if options.operation == 'rotate-crop' or options.operation == 'rotate':\n        rotateAndCrop(options)\n\n    print('Script finished.')\n\nif __name__ == \"__main__\":\n    sys.exit(main(sys.argv[1:]))\n"
  },
  {
    "path": "src/asp/Tools/image_align.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file image_align.cc\n///\n/// Tool for aligning a second image to a first image.\n\n#include <asp/Core/AspProgramOptions.h>\n#include <asp/Core/AspLog.h>\n#include <asp/Core/Macros.h>\n#include <asp/Core/InterestPointMatching.h>\n#include <asp/Core/ImageUtils.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/ImageNormalization.h>\n#include <asp/Core/FileUtils.h>\n#include <asp/Sessions/StereoSession.h>\n\n#include <vw/Image/Interpolation.h>\n#include <vw/Image/Filter.h>\n#include <vw/Image/Transform.h>\n#include <vw/FileIO/DiskImageUtils.h>\n#include <vw/Image/Manipulation.h>\n#include <vw/Image/PixelTypeInfo.h>\n#include <vw/FileIO/MatrixIO.h>\n#include <vw/Math/Geometry.h>\n#include <vw/InterestPoint/MatcherIO.h>\n#include <vw/Math/RANSAC.h>\n#include <vw/FileIO/FileUtils.h>\n\nusing namespace vw;\nnamespace po = boost::program_options;\n\nstruct Options: vw::GdalWriteOptions {\n  std::vector<std::string> input_images;\n  std::string alignment_transform, output_image, output_prefix, output_data_string,\n    input_transform, disparity_params, ecef_transform_type, dem1, dem2;\n  int output_data_type, min_matches;\n  Options(): output_data_type(0){}\n};\n\n/// Get a list of matched IP based on an input disparity\nvoid find_matches_from_disp(std::vector<ip::InterestPoint> &matched_ip1,\n                            std::vector<ip::InterestPoint> &matched_ip2,\n                            Options const& opt) {\n\n  // Clear the outputs\n  matched_ip1.clear();\n  matched_ip2.clear();\n  \n  std::string disp_file;\n  int num_samples;\n  std::istringstream iss(opt.disparity_params);\n  if (!(iss >> disp_file >> num_samples)) \n    vw_throw(ArgumentErr() << \"Could not parse correctly the option --disparity-params.\\n\");\n\n  DiskImageView<PixelMask<Vector2f>> disp(disp_file);\n\n  if (num_samples <= 0) \n    vw_throw(ArgumentErr() \n            << \"Expecting a positive number of samples in --disparity-params.\\n\");\n\n  if (disp.cols() == 0 || disp.rows() == 0) \n    vw_throw(ArgumentErr() << \"Empty disparity specified in --disparity-params.\\n\");    \n  \n  // Careful here to not overflow an int32\n  double num_pixels = double(disp.cols()) * double(disp.rows());\n  int sample_rate = std::max(round(sqrt(num_pixels / double(num_samples))), 1.0);\n  \n  vw_out() << \"Creating interest point matches from disparity: \" << disp_file << \".\\n\";\n  vw_out() << \"Using a row and column sampling rate of: \" << sample_rate << \".\\n\";\n  \n  vw::TerminalProgressCallback tpc(\"asp\", \"\\t--> \");\n  double inc_amount = sample_rate / double(disp.cols());\n  tpc.report_progress(0);\n  \n  for (int col = 0; col < disp.cols(); col += sample_rate) {\n    for (int row = 0; row < disp.rows(); row += sample_rate) {\n      \n      vw::PixelMask<vw::Vector2f> d = disp(col, row);\n      if (!is_valid(d)) \n        continue;\n      \n      Vector2 left_pix(col, row);\n      Vector2 right_pix = left_pix + d.child();\n      \n      vw::ip::InterestPoint lip(left_pix.x(), left_pix.y());\n      vw::ip::InterestPoint rip(right_pix.x(), right_pix.y());\n      matched_ip1.push_back(lip); \n      matched_ip2.push_back(rip);\n    }\n\n    tpc.report_incremental_progress(inc_amount);\n  }\n  tpc.report_finished();\n  \n  return;\n}\n\ntemplate<class FunctorT>\nMatrix<double> do_ransac(std::vector<Vector3> const& ransac_ip1,\n                         std::vector<Vector3> const& ransac_ip2,\n                         Options const& opt,\n                         int min_num_output_inliers, bool reduce_num_inliers_if_no_fit,\n                         // Output\n                         std::vector<size_t> & indices) {\n\n  // Must reset the random seed for RANSAC to give same results with and without\n  // cached ip matches.\n  std::srand(0);\n\n  indices.clear();\n  Matrix<double> tf;\n  try {\n    vw::math::RandomSampleConsensus<FunctorT, vw::math::InterestPointErrorMetric>\n      ransac(FunctorT(), vw::math::InterestPointErrorMetric(),\n             asp::stereo_settings().ip_num_ransac_iterations, \n             asp::stereo_settings().epipolar_threshold,\n             min_num_output_inliers, reduce_num_inliers_if_no_fit);\n    tf = ransac(ransac_ip2, ransac_ip1);\n    indices = ransac.inlier_indices(tf, ransac_ip2, ransac_ip1);\n    return tf;\n  } catch (std::exception const& e) {\n    vw_throw(ArgumentErr() << e.what() << \"\\n\"\n             << \"Alignment transform computation failed.\\n\");\n  }\n}\n\n// Compute the ECEF transform (around planet center) given the\n// interest point matches\nvoid calc_ecef_transform(std::vector<ip::InterestPoint> const& inlier_ip1,\n                         std::vector<ip::InterestPoint> const& inlier_ip2,\n                         Options const& opt,\n                         Matrix<double> & ecef_transform) { // output\n\n  // Go from pixels to 3D points\n  int num_matches = inlier_ip1.size();\n  vw::Matrix<double> points_ref(3, num_matches), points_src(3, num_matches);\n\n  // The value of the invalid pixel used in interpolation\n  PixelMask<float> invalid_pix; invalid_pix.invalidate();\n  vw::ValueEdgeExtension<PixelMask<float>> invalid_ext(invalid_pix);\n\n  vw::cartography::GeoReference img1_geo, img2_geo, dem1_geo, dem2_geo;\n\n  // Read first image and DEM, and set up interpolation.  Out-of-range\n  // values are set to invalid.\n  bool has_img1_geo = vw::cartography::read_georeference(img1_geo, opt.input_images[0]);\n  if (!has_img1_geo)\n    vw::vw_throw(vw::ArgumentErr() << \"The first image does not have a georeference.\\n\");\n  bool has_dem1_geo = vw::cartography::read_georeference(dem1_geo, opt.dem1);\n  if (!has_dem1_geo)\n    vw::vw_throw(vw::ArgumentErr() << \"The first DEM does not have a georeference.\\n\");\n  double dem1_nodata = -std::numeric_limits<double>::max();\n  vw::read_nodata_val(opt.dem1, dem1_nodata);\n  DiskImageView<float> dem1(opt.dem1);\n  auto interp_dem1 = interpolate(create_mask(dem1, dem1_nodata),\n                                 BilinearInterpolation(), invalid_ext);\n\n  // Repeat for 2nd DEM and image\n  bool has_img2_geo = vw::cartography::read_georeference(img2_geo, opt.input_images[1]);\n  if (!has_img2_geo)\n    vw::vw_throw(vw::ArgumentErr() << \"The second image does not have a georeference.\\n\");\n  bool has_dem2_geo = vw::cartography::read_georeference(dem2_geo, opt.dem2);\n  if (!has_dem2_geo)\n    vw::vw_throw(vw::ArgumentErr() << \"The second DEM does not have a georeference.\\n\");\n  double dem2_nodata = -std::numeric_limits<double>::max();\n  vw::read_nodata_val(opt.dem2, dem2_nodata);\n  DiskImageView<float> dem2(opt.dem2);\n  auto interp_dem2 = interpolate(create_mask(dem2, dem2_nodata),\n                                 BilinearInterpolation(), invalid_ext);\n\n  // Find the 3D coordinates\n  for (size_t ip_it = 0; ip_it < inlier_ip1.size(); ip_it++) {\n\n    // ECEF point for first image ip\n    vw::Vector2 pix1(inlier_ip1[ip_it].x, inlier_ip1[ip_it].y);\n    vw::Vector2 img1_lonlat = img1_geo.pixel_to_lonlat(pix1);\n    vw::Vector2 dem1_pix = dem1_geo.lonlat_to_pixel(img1_lonlat);\n    PixelMask<float> dem1_val = interp_dem1(dem1_pix.x(), dem1_pix.y());\n    if (!is_valid(dem1_val)) \n      continue;\n    vw::Vector3 xyz1 = dem1_geo.datum().geodetic_to_cartesian\n      (vw::Vector3(img1_lonlat.x(), img1_lonlat.y(), dem1_val.child()));\n    \n    // ECEF point for second image ip\n    vw::Vector2 pix2(inlier_ip2[ip_it].x, inlier_ip2[ip_it].y);\n    vw::Vector2 img2_lonlat = img2_geo.pixel_to_lonlat(pix2);\n    vw::Vector2 dem2_pix = dem2_geo.lonlat_to_pixel(img2_lonlat);\n    PixelMask<float> dem2_val = interp_dem2(dem2_pix.x(), dem2_pix.y());\n    if (!is_valid(dem2_val)) \n      continue;\n    vw::Vector3 xyz2 = dem2_geo.datum().geodetic_to_cartesian\n      (vw::Vector3(img2_lonlat.x(), img2_lonlat.y(), dem2_val.child()));\n    \n    // Store in matrices\n    typedef vw::math::MatrixCol<vw::Matrix<double>> ColView;\n    ColView col_ref(points_ref, ip_it); \n    ColView col_src(points_src, ip_it);\n    col_ref = xyz1;\n    col_src = xyz2;\n  }\n\n  // Find the 3D transform from second to first set of ECEF points\n  vw::Matrix3x3 rotation;\n  vw::Vector3   translation;\n  double        scale;\n  bool filter_outliers = true;\n  Vector2 ransac_params;\n  ransac_params[0] = asp::stereo_settings().ip_num_ransac_iterations;\n  ransac_params[1] = 1.0; // factor; not the same as opt.inlier_threshold\n  vw::math::find_3D_transform(points_src, points_ref,\n                              rotation, translation, scale,\n                              opt.ecef_transform_type,\n                              filter_outliers,\n                              ransac_params);\n\n  // Convert to pc_align transform format\n  ecef_transform = identity_matrix(4);\n  submatrix(ecef_transform, 0, 0, 3, 3) = rotation * scale;\n  for (int row = 0; row < 3; row++)\n    ecef_transform(row, 3) = translation[row];\n}\n\n/// Compute a matrix transform between images, searching for IP in\n///  the specified regions.\nMatrix<double>\ncalc_alignment_transform(std::string const& image_file1,\n                         std::string const& image_file2,\n                         std::vector<ip::InterestPoint> &matched_ip1,\n                         std::vector<ip::InterestPoint> &matched_ip2,\n                         Options const& opt,\n                         Matrix<double> & ecef_transform) { // potential output\n  \n  // Convert to 3D points with the third coordinate being 1, obtaining\n  // homogeneous coordinates.\n  std::vector<Vector3> ransac_ip1 = iplist_to_vectorlist(matched_ip1);\n  std::vector<Vector3> ransac_ip2 = iplist_to_vectorlist(matched_ip2);\n\n  // RANSAC parameters.\n  const int    min_num_output_inliers = ransac_ip1.size()/2;\n  const bool   reduce_num_inliers_if_no_fit = true;\n\n  Matrix<double> tf;\n  std::vector<size_t> indices;\n  if (opt.alignment_transform == \"translation\") {\n    tf = do_ransac<vw::math::TranslationFittingFunctor>\n      (ransac_ip1, ransac_ip2, opt, min_num_output_inliers,\n       reduce_num_inliers_if_no_fit, indices);\n  } else if (opt.alignment_transform == \"rigid\") {\n    tf = do_ransac<vw::math::TranslationRotationFittingFunctorN<2>>\n      (ransac_ip1, ransac_ip2, opt, min_num_output_inliers,\n       reduce_num_inliers_if_no_fit, indices);\n  } else if (opt.alignment_transform == \"similarity\") {\n    tf = do_ransac<vw::math::SimilarityFittingFunctor>\n      (ransac_ip1, ransac_ip2, opt, min_num_output_inliers,\n       reduce_num_inliers_if_no_fit, indices);\n  } else if (opt.alignment_transform == \"affine\") {\n    tf = do_ransac<vw::math::AffineFittingFunctor>\n      (ransac_ip1, ransac_ip2, opt, min_num_output_inliers,\n       reduce_num_inliers_if_no_fit, indices);\n  } else if (opt.alignment_transform == \"homography\") {\n    tf = do_ransac<vw::math::HomographyFittingFunctor>\n      (ransac_ip1, ransac_ip2, opt, min_num_output_inliers,\n       reduce_num_inliers_if_no_fit, indices);\n  } else {\n    vw_throw(ArgumentErr() << \"Unknown alignment transform: \"\n             << opt.alignment_transform << \".\\n\");\n  }\n    \n  // Keeping only inliers\n  std::vector<ip::InterestPoint> inlier_ip1, inlier_ip2;\n  for (size_t i = 0; i < indices.size(); i++) {\n    inlier_ip1.push_back(matched_ip1[indices[i]]);\n    inlier_ip2.push_back(matched_ip2[indices[i]]);\n  } \n\n  vw_out() << \"Found \" << inlier_ip1.size() << \" / \" << ransac_ip1.size()\n           << \" inliers using RANSAC.\\n\";\n  \n  if (opt.output_prefix != \"\") {\n    // Write a match file for debugging\n    bool matches_as_txt = asp::stereo_settings().matches_as_txt;\n    std::string clean_match_file\n      = ip::clean_match_filename(ip::match_filename(opt.output_prefix, image_file1, image_file2,\n                                                    matches_as_txt), matches_as_txt);\n    vw_out() << \"Writing inlier matches after RANSAC to: \" << clean_match_file << std::endl;\n    ip::write_match_file(clean_match_file, inlier_ip1, inlier_ip2, matches_as_txt);\n  }\n\n  vw_out() << \"Alignment transform (in pixels):\\n\" << tf << std::endl;\n\n  if (opt.ecef_transform_type != \"\") \n    calc_ecef_transform(inlier_ip1, inlier_ip2, opt, ecef_transform);\n  \n  return tf;\n}\n\nvoid handle_arguments(int argc, char *argv[], Options& opt) {\n\n  po::options_description general_options(\"\");\n  general_options.add(vw::GdalWriteOptionsDescription(opt));\n  \n  // Pass interest point matching options directly to stereo_settings\n  auto & ip_opt = asp::stereo_settings(); // alias\n  \n  const double g_nan_val = std::numeric_limits<double>::quiet_NaN();\n  general_options.add_options()\n    (\"output-image,o\", po::value(&opt.output_image)->default_value(\"\"),\n     \"Specify the output image.\")\n    (\"alignment-transform\", po::value(&opt.alignment_transform)->default_value(\"rigid\"),\n     \"Specify the transform to use to align the second image to the first. Options: \"\n     \"translation, rigid (translation + rotation), similarity (translation + rotation + \"\n     \"scale), affine, homography.\")\n    (\"output-prefix\", po::value(&opt.output_prefix)->default_value(\"out_image_align/run\"),\n     \"Save the interest point matches, computed transform, and other auxiliary \"\n     \"data at this prefix. These are cached for future runs.\")\n    (\"output-data-type,d\",  po::value(&opt.output_data_string)->default_value(\"float32\"),\n     \"The data type of the output file. Options: uint8, uint16, uint32, int16, int32, \"\n     \"float32, float64. The values are clamped (and also rounded for integer types) to avoid \"\n     \"overflow.\")\n    (\"ip-detect-method\", po::value(&ip_opt.ip_detect_method)->default_value(0),\n     \"Interest point detection algorithm (0: Integral OBALoG (default), 1: OpenCV SIFT, 2: OpenCV ORB.\")\n    (\"ip-per-image\", po::value(&ip_opt.ip_per_image)->default_value(20000),\n     \"How many interest points to detect in each image (the resulting number of \"\n      \"matches will be much less).\")\n    (\"ip-per-tile\", po::value(&ip_opt.ip_per_tile)->default_value(0),\n     \"How many interest points to detect in each 1024^2 image tile (default: automatic \"\n     \"determination). This is before matching. Not all interest points will have a match. \"\n     \"See also --matches-per-tile.\")\n    (\"matches-per-tile\",  po::value(&ip_opt.matches_per_tile)->default_value(0),\n     \"How many interest point matches to compute in each image tile (of size \"\n     \"normally 1024^2 pixels). Use a value of --ip-per-tile a few times larger \"\n     \"than this. See also --matches-per-tile-params.\")\n    (\"matches-per-tile-params\",  \n     po::value(&ip_opt.matches_per_tile_params)->default_value(Vector2(1024, 1280), \n                                                               \"1024 1280\"),\n     \"To be used with --matches-per-tile. The first value is the image tile size for both \"\n     \"images. A larger second value allows each right tile to further expand to this size, \"\n     \"resulting in the tiles overlapping. This may be needed if the homography alignment \"\n     \"between these images is not great, as this transform is used to pair up left and \"\n     \"right image tiles.\")\n     (\"min-matches\", po::value(&opt.min_matches)->default_value(10),\n      \"Set the minimum  number of inlier matches between images for successful matching.\")\n    (\"individually-normalize\",\n     po::bool_switch(&ip_opt.individually_normalize)->default_value(false)->implicit_value(true),\n     \"Individually normalize the input images instead of using common values.\")\n    (\"matches-as-txt\",\n     po::bool_switch(&ip_opt.matches_as_txt)->default_value(false)->implicit_value(true),\n     \"Read and write match files as plain text instead of binary. See the documentation for details.\")\n    (\"num-ransac-iterations\",\n     po::value(&ip_opt.ip_num_ransac_iterations)->default_value(1000),\n     \"How many iterations to perform in RANSAC when finding interest point matches.\")\n    (\"inlier-threshold\", po::value(&ip_opt.epipolar_threshold)->default_value(50.0),\n     \"The inlier threshold (in pixels) to separate inliers from outliers when \"\n     \"computing interest point matches. A smaller threshold will result in fewer \"\n     \"inliers.\")\n    (\"input-transform\", po::value(&opt.input_transform)->default_value(\"\"),\n     \"Instead of computing an alignment transform, read and apply the one from this file. Must be stored as a 3x3 matrix.\")\n    (\"ecef-transform-type\", po::value(&opt.ecef_transform_type)->default_value(\"\"), \n     \"Save the ECEF transform corresponding to the image alignment transform to <output \"\n     \"prefix>-ecef-transform.txt. The type can be: 'translation', 'rigid' (rotation + \"\n     \"translation), or 'similarity' (rotation + translation + scale).\")\n    (\"dem1\", po::value(&opt.dem1)->default_value(\"\"), \n     \"The DEM associated with the first image. To be used with --ecef-transform-type.\")\n    (\"dem2\", po::value(&opt.dem2)->default_value(\"\"), \n     \"The DEM associated with the second image. To be used with --ecef-transform-type.\")\n    (\"disparity-params\", po::value(&opt.disparity_params)->default_value(\"\"),\n     \"Find the alignment transform by using, instead of interest points, a disparity, such \"\n     \"as produced by 'parallel_stereo --correlator-mode'. Specify as a string in quotes, \"\n     \"in the format: 'disparity.tif num_samples'.\")\n    (\"nodata-value\", \n     po::value(&ip_opt.nodata_value)->default_value(g_nan_val),\n     \"Pixels with values less than or equal to this number are treated as no-data. This \"\n     \"overrides the no-data values from input images.\")\n    ;\n\n  po::options_description positional(\"\");\n  positional.add_options()\n    (\"input-images\", po::value(&opt.input_images));\n\n  po::positional_options_description positional_desc;\n  positional_desc.add(\"input-images\", -1);\n\n  std::string usage(\"[options] <reference image> <source image> -o \"\n                    \" <aligned source image>\");\n  \n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line(argc, argv, opt, general_options, general_options,\n                            positional, positional_desc, usage,\n                            allow_unregistered, unregistered);\n  \n  if (opt.input_images.size() != 2)\n    vw_throw(ArgumentErr() << \"Expecting two input images.\\n\" << usage << general_options);\n\n  if (opt.output_image.empty())\n    vw_throw(ArgumentErr() << \"Missing output image name.\\n\" << usage << general_options);\n\n  if (ip_opt.ip_per_image > 0 && ip_opt.ip_per_tile > 0)\n    vw_throw(ArgumentErr() << \"Can set only one of --ip-per-image and --ip-per-tile.\\n\");\n\n  if (opt.alignment_transform != \"translation\" && opt.alignment_transform != \"rigid\" &&\n      opt.alignment_transform != \"similarity\" && opt.alignment_transform != \"affine\" &&\n      opt.alignment_transform != \"homography\") {\n    vw_throw(ArgumentErr() << \"The alignment transform must be one of: translation, \"\n             \"rigid, similarity, affine, homography.\\n\" << usage << general_options);    \n  }\n\n  if (opt.ecef_transform_type != \"\") {\n    if (opt.ecef_transform_type != \"translation\" && opt.ecef_transform_type != \"rigid\" &&\n        opt.ecef_transform_type != \"similarity\") \n      vw_throw(ArgumentErr() << \"The value of --ecef-transform-type must be one of: \"\n               << \"translation, rigid, or similarity.\\n\");    \n    if (opt.dem1 == \"\" || opt.dem2 == \"\") \n      vw::vw_throw(vw::ArgumentErr() << \"When using the option --ecef-transform-type, \"\n                   << \"the options --dem1 and --dem2 must be set.\\n\");\n    if (opt.output_prefix == \"\") \n      vw::vw_throw(vw::ArgumentErr() << \"When using the option --ecef-transform-type, \"\n                   << \"the option --output-prefix must be set.\\n\");\n  }\n    \n  // Determining the format of the second input image\n  boost::shared_ptr<vw::DiskImageResource>\n    rsrc(vw::DiskImageResourcePtr(opt.input_images[1]));\n  ChannelTypeEnum input_data_type = rsrc->channel_type();\n\n  // By default, use the same type on output as on input\n  opt.output_data_type = input_data_type;\n  if      (opt.output_data_string == \"uint8\"  ) opt.output_data_type = VW_CHANNEL_UINT8;\n  else if (opt.output_data_string == \"uint16\" ) opt.output_data_type = VW_CHANNEL_UINT16;\n  else if (opt.output_data_string == \"uint32\" ) opt.output_data_type = VW_CHANNEL_UINT32;\n  // GDAL does not support int8\n  //else if (opt.output_data_string == \"int8\"   ) opt.output_data_type = VW_CHANNEL_INT8;\n  else if (opt.output_data_string == \"int16\"  ) opt.output_data_type = VW_CHANNEL_INT16;\n  else if (opt.output_data_string == \"int32\"  ) opt.output_data_type = VW_CHANNEL_INT32;\n  else if (opt.output_data_string == \"float32\") opt.output_data_type = VW_CHANNEL_FLOAT32;\n  else if (opt.output_data_string == \"float64\") opt.output_data_type = VW_CHANNEL_FLOAT64;\n  else\n    vw_throw(ArgumentErr() << \"Invalid value for the output type: \" << opt.output_data_string\n             << \".\\n\");\n  \n  // Create the output directory\n  vw::create_out_dir(opt.output_image);\n\n  if (opt.output_prefix != \"\") // for saving match files, etc.\n    vw::create_out_dir(opt.output_prefix);\n\n  // Turn on logging to file\n  asp::log_to_file(argc, argv, \"\", opt.output_image);\n  \n  return;  \n}\n\n// Write the aligned image with the specified output data type, casting and\n// clamping as needed. Integer types are rounded before clamping.\n#define WRITE_ALIGNED_INT(T)                                   \\\n  vw::cartography::block_write_gdal_image(                     \\\n    opt.output_image,                                          \\\n    per_pixel_filter(apply_mask(aligned_image2, nodata2),      \\\n                     vw::ClampRoundAndCastToInt<T, double>()), \\\n    has_georef2, georef2, has_nodata2, nodata2, opt, tpc)\n\n#define WRITE_ALIGNED_FLOAT(T)                                 \\\n  vw::cartography::block_write_gdal_image(                     \\\n    opt.output_image,                                          \\\n    per_pixel_filter(apply_mask(aligned_image2, nodata2),      \\\n                     vw::ClampAndCast<T, double>()),           \\\n    has_georef2, georef2, has_nodata2, nodata2, opt, tpc)\n\nvoid save_output(ImageViewRef<PixelMask<double>> aligned_image2,\n                 bool has_nodata2, float nodata2,\n                 bool has_georef2, vw::cartography::GeoReference const& georef2,\n                 Options const& opt) {\n\n  vw_out() << \"Writing: \" << opt.output_image << \"\\n\";\n  TerminalProgressCallback tpc(\"asp\", \"\\t  Aligned image:  \");\n\n  switch (opt.output_data_type) {\n  case VW_CHANNEL_UINT8:   WRITE_ALIGNED_INT(vw::uint8);   break;\n  case VW_CHANNEL_UINT16:  WRITE_ALIGNED_INT(vw::uint16);  break;\n  case VW_CHANNEL_UINT32:  WRITE_ALIGNED_INT(vw::uint32);  break;\n  case VW_CHANNEL_INT16:   WRITE_ALIGNED_INT(vw::int16);   break;\n  case VW_CHANNEL_INT32:   WRITE_ALIGNED_INT(vw::int32);   break;\n  case VW_CHANNEL_FLOAT32: WRITE_ALIGNED_FLOAT(vw::float32); break;\n  case VW_CHANNEL_FLOAT64: WRITE_ALIGNED_FLOAT(vw::float64); break;\n  default:\n    vw_throw(ArgumentErr() << \"Invalid value for the output pixel format.\\n\");\n  }\n}\n\n#undef WRITE_ALIGNED_INT\n#undef WRITE_ALIGNED_FLOAT\n\nint main(int argc, char *argv[]) {\n\n  Options opt;\n  \n  try {\n\n    // Process command line options\n    handle_arguments(argc, argv, opt);\n\n    std::string image_file1 = opt.input_images[0], image_file2 = opt.input_images[1];\n    ImageViewRef<double> image1,  image2;\n    bool has_georef1 = false, has_georef2 = false;\n    double nodata1_double, nodata2_double; // part of api, will not be used\n    vw::cartography::GeoReference georef1, georef2;\n    asp::load_image(image_file1, image1, nodata1_double, has_georef1, georef1);\n    asp::load_image(image_file2, image2, nodata2_double, has_georef2, georef2);\n\n   // Set the no-data value while takeing into account the command line override\n   float nodata1, nodata2;\n   {\n     boost::shared_ptr<DiskImageResource> rsrc1(vw::DiskImageResourcePtr(image_file1));\n     boost::shared_ptr<DiskImageResource> rsrc2(vw::DiskImageResourcePtr(image_file2));\n     asp::get_nodata_values(rsrc1, rsrc2, asp::stereo_settings().nodata_value,\n                            nodata1, nodata2);\n   }\n   \n    Matrix<double> tf, ecef_transform;\n    if (opt.input_transform.empty()) {\n      std::vector<ip::InterestPoint> matched_ip1, matched_ip2;\n      if (opt.disparity_params == \"\")\n        asp::matchIpNoCams(image_file1, image_file2, opt.output_prefix,\n                           matched_ip1, matched_ip2);\n      else\n        find_matches_from_disp(matched_ip1, matched_ip2, opt);\n      \n      // Must have at least a minimum number of matches to ensure accurate transform\n      if ((int)matched_ip1.size() < opt.min_matches)\n        vw_throw(ArgumentErr() << \"Found only \" << matched_ip1.size()\n                 << \" matches, which is less than the minimum of \"\n                 << opt.min_matches << \" (option --min-matches).\\n\");\n\n      tf = calc_alignment_transform(image_file1, image_file2,  \n                                    matched_ip1, matched_ip2, opt, ecef_transform);\n    } else {\n      vw_out() << \"Reading the alignment transform from: \" << opt.input_transform << \"\\n\";\n      read_matrix_as_txt(opt.input_transform, tf);\n    }\n    \n    if (opt.output_prefix != \"\") {\n      std::string transform_file = opt.output_prefix + \"-transform.txt\";\n      vw_out() << \"Writing the transform to: \" << transform_file << std::endl;\n      write_matrix_as_txt(transform_file, tf);\n    }\n    \n    if (opt.output_prefix != \"\" && opt.ecef_transform_type != \"\") {\n      std::string ecef_transform_file = opt.output_prefix + \"-ecef-transform.txt\";\n      vw_out() << \"Writing the ECEF transform to: \" << ecef_transform_file << \"\\n\";\n      write_matrix_as_txt(ecef_transform_file, ecef_transform);\n      // Write the inverse too\n      std::string ecef_transform_inv_file = opt.output_prefix + \"-ecef-inverse-transform.txt\";\n      vw_out() << \"Writing the inverse of the ECEF transform to: \" \n        << ecef_transform_inv_file << \"\\n\";\n      write_matrix_as_txt(ecef_transform_inv_file, vw::math::inverse(ecef_transform));\n    }\n    \n    // Any transforms supported by this tool fit in a homography transform object\n    vw::HomographyTransform T(tf);\n\n    // Find the domain of the transformed image\n    BBox2i trans_box = T.forward_bbox(vw::bounding_box(image2));\n\n    // Adjust the box to consistent with what vw::transform expects below\n    trans_box.min() = vw::Vector2(0, 0);\n\n    PixelMask<double> nodata_mask = PixelMask<double>(); // invalid value for a PixelMask\n    ImageViewRef<PixelMask<double>> aligned_image2 =\n      vw::transform(create_mask(image2, nodata2), HomographyTransform(tf),\n                    trans_box.width(), trans_box.height(),\n                    ValueEdgeExtension<PixelMask<double>>(nodata_mask),\n                    BilinearInterpolation());\n\n    // Almost always the alignment will result in pixels with no data\n    bool has_nodata2 = true;\n\n    if (has_georef1) {\n      // Borrow the georef from the first image, since we are in its coordinates\n      // It is useful to print the data below, as it explains what is happening\n      // in the georeference domain. The pixel-only transform is only one part.\n      vw::vw_out() << \"\\nSecond image georeference before alignment:\\n\\t\" << georef2 << \"\\n\";\n      has_georef2 = has_georef1;\n      georef2 = georef1;\n      vw::vw_out() << \"Second image georeference after alignment:\\n\\t\" << georef2 << \"\\n\";\n    } else{\n      // Write no georef\n      has_georef1 = false;\n      has_georef2 = false;\n    }\n      \n    save_output(aligned_image2, has_nodata2, nodata2, has_georef2, georef2, opt);\n    \n  } ASP_STANDARD_CATCHES;\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/image_calc.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file image_calc.cc\n\n// Apply specified arithmetic operations to given input images and save the\n// output with desired pixel type.\n\n#include <asp/Core/AspProgramOptions.h>\n#include <asp/Core/Macros.h>\n#include <asp/Core/AspStringUtils.h>\n\n#include <vw/Core/FundamentalTypes.h>\n#include <vw/Core/Log.h>\n#include <vw/Image/Algorithms.h>\n#include <vw/Image/ImageIO.h>\n#include <vw/Image/ImageView.h>\n#include <vw/Image/ImageViewRef.h>\n#include <vw/Image/Manipulation.h>\n#include <vw/Image/MaskViews.h>\n#include <vw/Image/PixelMath.h>\n#include <vw/Image/Statistics.h>\n#include <vw/Image/Filter.h>\n#include <vw/FileIO/DiskImageView.h>\n#include <vw/FileIO/DiskImageUtils.h>\n#include <vw/FileIO/FileUtils.h>\n\n#include <boost/program_options.hpp>\n#include <boost/spirit/include/qi.hpp>\n#include <boost/spirit/include/phoenix.hpp>\n#include <boost/fusion/include/adapt_struct.hpp>\n#include <boost/math/special_functions/sign.hpp>\n\n#include <vector>\n#include <random>\n\nnamespace po = boost::program_options;\nnamespace b_s = boost::spirit;\n\n// The operations tree structure. Boost::Spirit requires the use of some\n// specific Boost types in order to store the parsed information.\nenum OperationType {\n  OP_pass,\n  // UNARY operations\n  OP_number,   // This is a leaf node containing a number.\n  OP_variable,\n  OP_negate,\n  OP_abs,\n  OP_sign,\n  OP_rand,\n  // BINARY operations\n  OP_add,\n  OP_subtract,\n  OP_divide,\n  OP_multiply,\n  OP_power,\n  // MULTI operations\n  OP_min,\n  OP_max,\n  OP_lt,\n  OP_gt,\n  OP_lte,\n  OP_gte,\n  OP_eq\n};\n\nstd::string getTagName(const OperationType op) {\n\n  switch(op) {\n\n    case OP_pass:     return \"PASS\";\n    case OP_number:   return \"NUMBER\";\n    case OP_variable: return \"VARIABLE\";\n    case OP_negate:   return \"NEGATE\";\n    case OP_abs:      return \"ABS\";\n    case OP_sign:     return \"SIGN\";\n    case OP_rand:     return \"RAND\";\n    case OP_add:      return \"ADD\";\n    case OP_subtract: return \"SUBTRACT\";\n    case OP_divide:   return \"DIVIDE\";\n    case OP_multiply: return \"MULTIPLY\";\n    case OP_power:    return \"POWER\";\n    case OP_min:      return \"MIN\";\n    case OP_max:      return \"MAX\";\n    case OP_lt:       return \"LESS_THAN\";\n    case OP_gt:       return \"GREATER_THAN\";\n    case OP_lte:      return \"LESS_THAN_EQ\";\n    case OP_gte:      return \"LESS_THAN_EQ\";\n    case OP_eq:       return \"EQUALS\";\n    default:          return \"ERROR\";\n  }\n}\n\nconst int TAB_SIZE = 4;\nvoid tab(int indent) {\n\n  for (int i = 0; i < indent; i++)\n    vw::vw_out() << ' ';\n}\n\n// TODO: Are there pixel functions for these?\ntemplate <typename T>\nT manual_min(std::vector<T> const& vec) {\n\n  T minVal = vec[0];\n  for (size_t i = 1; i < vec.size(); i++)\n    if (vec[i] < minVal)\n      minVal = vec[i];\n  return minVal;\n}\ntemplate <typename T>\nT manual_max(std::vector<T> const& vec) {\n\n  T maxVal = vec[0];\n  for (size_t i = 1; i < vec.size(); i++)\n    if (vec[i] > maxVal)\n      maxVal = vec[i];\n  return maxVal;\n}\n\n// Initialize the random number generator. Always use the same seed, so that\n// results are repeatable.\nstd::mt19937 mt(0);\n\n// Return a random number in the range [0, 1]\ntemplate <typename T>\nT custom_rand_0_1(T val) {\n  return double(mt() - mt.min())/double(mt.max() - mt.min());\n}\n\n// This type represents an operation performed on one or more inputs.\nstruct calc_operation {\n\n  OperationType opType; // The operation to be performed on the children\n  double        value; // If this is a leaf node, the number is stored here.  Ignored unless OP_number.\n  int           varName;\n  std::vector<calc_operation> inputs; // The inputs to the operation\n\n  calc_operation(): opType(OP_pass) {}\n\n  /// Recursive function to print out the contents of this object\n  void print(const int indent=0) {\n\n    if (opType == OP_number) {\n      tab(indent);\n      vw::vw_out() << \"Node: \" << getTagName(opType) << \" = \" << value << \"\\n\";\n    } else if (opType == OP_variable) {\n      tab(indent);\n      vw::vw_out() << \"Node: \" << getTagName(opType) << \" = \" << varName << \"\\n\";\n    } else {\n      vw::vw_out() << \"\\n\";\n      tab(indent);\n      vw::vw_out() << \"tag: \" << getTagName(opType) << \"\\n\";\n      tab(indent);\n      vw::vw_out() << \"value: \" << value << \"\\n\";\n      tab(indent);\n      vw::vw_out() << \"varName: \" << varName << \"\\n\";\n      tab(indent);\n      vw::vw_out() << '{' << \"\\n\";\n\n      for (size_t i = 0; i < inputs.size(); i++)\n        inputs[i].print(indent+TAB_SIZE);\n\n      tab(indent);\n      vw::vw_out() << '}' << \"\\n\";\n    }\n\n  }\n\n  /// Recursive function to eliminate extraneous nodes created by our parsing technique\n  void clearEmptyNodes() {\n    // Recursively call this function on all inputs\n    for (size_t i = 0; i < inputs.size(); i++)\n      inputs[i].clearEmptyNodes();\n\n    if (opType != OP_pass)\n      return;\n\n    // Check for errors\n    if (inputs.size() != 1) {\n      vw::vw_out() << \"ERROR: pass node with \" << inputs.size() << \" Nodes!\\n\";\n      return;\n    }\n\n    // Replace this node with its input node\n    value   = inputs[0].value;\n    opType  = inputs[0].opType;\n    varName = inputs[0].varName;\n    std::vector<calc_operation> temp = inputs[0].inputs;\n    inputs = temp;\n  }\n\n  /// Apply the operation tree to the input parameters and return a result\n  template <typename T>\n  T applyOperation(std::vector<T> const& params) const {\n    // Get the results from each input node.\n    // - This is a recursive call.\n    size_t numInputs = inputs.size();\n    std::vector<T> inputResults(numInputs);\n    for (size_t i = 0; i < numInputs; i++)\n      inputResults[i] = inputs[i].applyOperation(params);\n\n    // Now perform the operation for this node\n    switch(opType) {\n      // Unary\n      case OP_number:   return T(value);\n      case OP_variable: if (varName >= static_cast<int>(params.size()))\n        vw::vw_throw(vw::ArgumentErr()\n                  << \"Unrecognized variable input. Note that the first variable is var_0.\\n\");\n        return params[varName];\n      if (numInputs < 1)\n        vw::vw_throw(vw::LogicErr() << \"Insufficient inputs for this operation.\\n\");\n      case OP_negate:   return T(-1 * inputResults[0]);\n      case OP_abs:      return T(std::abs(inputResults[0])); // regular abs casts to integer.\n      case OP_sign:     return T(boost::math::sign(inputResults[0]));\n      case OP_rand:     return T(custom_rand_0_1(inputResults[0]));\n\n      // Binary\n      if (numInputs < 2)\n        vw::vw_throw(vw::LogicErr() << \"Insufficient inputs for this operation.\\n\");\n      case OP_add:      return (inputResults[0] + inputResults[1]);\n      case OP_subtract: return (inputResults[0] - inputResults[1]);\n      case OP_divide:   return (inputResults[0] / inputResults[1]);\n      case OP_multiply: return (inputResults[0] * inputResults[1]);\n      case OP_power:    return (pow(inputResults[0], inputResults[1]));\n\n      // Multi\n      case OP_min:      return manual_min(inputResults); // TODO: Do these functions exist?\n      case OP_max:      return manual_max(inputResults);\n\n      case OP_lt:   return (inputResults[0] <  inputResults[1]) ? inputResults[2]: inputResults[3];\n      case OP_gt:   return (inputResults[0] >  inputResults[1]) ? inputResults[2]: inputResults[3];\n      case OP_lte:  return (inputResults[0] <= inputResults[1]) ? inputResults[2]: inputResults[3];\n      case OP_gte:  return (inputResults[0] >= inputResults[1]) ? inputResults[2]: inputResults[3];\n      case OP_eq:   return (inputResults[0] == inputResults[1]) ? inputResults[2]: inputResults[3];\n\n      default:\n        vw::vw_throw(vw::LogicErr() << \"Unexpected operation type.\\n\");\n    }\n  }\n};\n\n// We need to tell fusion about our calc_operation struct to make it a\n// first-class fusion citizen\nBOOST_FUSION_ADAPT_STRUCT(\n    calc_operation,\n    (OperationType, opType)\n    (double, value)\n    (int, varName)\n    (std::vector<calc_operation>, inputs)\n)\n\n// Boost::Spirit equation parsing\n\n// Helper constants to aid in accessing a calc_operation struct\nconst int OP  = 0;\nconst int NUM = 1;\nconst int VAR = 2;\nconst int IN  = 3;\n\ntemplate <typename ITER>\nstruct calc_grammar: b_s::qi::grammar<ITER, calc_operation(), b_s::ascii::space_type> {\n  // Constructor function\n  calc_grammar(): calc_grammar::base_type(expression) {\n    // Definitions\n    using boost::phoenix::at;\n    using boost::phoenix::at_c;\n    using boost::phoenix::push_back;\n    using b_s::qi::double_;\n    using b_s::qi::int_;\n    using b_s::qi::eps;\n    using b_s::qi::_val;\n    using b_s::qi::_1; // This is required to avoid namespace mixups with other Boost modules.\n    using b_s::qi::_2;\n    using b_s::qi::_3;\n\n    // Map from function names to operation types\n    func_map.add\n      (\"min\", OP_min)\n      (\"max\", OP_max)\n      (\"lt\",  OP_lt)\n      (\"gt\",  OP_gt)\n      (\"lte\", OP_lte)\n      (\"gte\", OP_gte)\n      (\"eq\",  OP_eq)\n      (\"abs\", OP_abs)\n      (\"sign\", OP_sign)\n      (\"rand\", OP_rand);\n\n    // This approach works but it processes expressions right to left. To get a\n    // desired order, use parenthesis.\n\n    // An outer expression\n    expression =\n      (term [push_back(at_c<IN>(_val), _1)])\n        >> *((\n    // Addition\n    '+' >> expression [push_back(at_c<IN>(_val), _1), at_c<OP>(_val)=OP_add]) |  \n    // Subtraction         \n    ('-' >> expression [push_back(at_c<IN>(_val), _1), at_c<OP>(_val)=OP_subtract]));    \n\n    // Middle priority\n    term =\n        (factor [push_back(at_c<IN>(_val), _1)])\n        >> *((\n    // Multiplication\n    '*' >> term [push_back(at_c<IN>(_val), _1), at_c<OP>(_val)=OP_multiply]) |  \n    // Division\n    ('/' >> term [push_back(at_c<IN>(_val), _1), at_c<OP>(_val)=OP_divide  ]));    \n\n    // The highest priority\n    // TODO: An additional layer to prevent double signs?\n    factor =\n      // Just a number\n      (double_ [at_c<NUM>(_val)=_1, at_c<OP>(_val)=OP_number]) | \n      // Handle all operations specified in func_map\n      (func_map [at_c<OP>(_val)=_1] > '(' > expression [push_back(at_c<IN>(_val), _1)] % ',' > ')') |\n      // Power function\n      ((\"pow(\" > expression > ',' > expression > ')')\n        [push_back(at_c<IN>(_val), _1), push_back(at_c<IN>(_val), _2), \n         at_c<OP>(_val)= OP_power]) |\n      // Something in parenthesis\n      ('(' > expression [push_back(at_c<IN>(_val), _1), at_c<OP>(_val)=OP_pass] > ')') | \n      // Negative sign\n      ('-' >> factor [push_back(at_c<IN>(_val), _1), at_c<OP>(_val)=OP_negate]) | \n      // Variable\n      (\"var_\" > int_ [at_c<VAR>(_val)=_1, at_c<OP>(_val)=OP_variable]);\n\n  } // End constructor\n\n  // Grammar rules\n  b_s::qi::rule<ITER, calc_operation(), b_s::ascii::space_type> expression, term, factor;\n  b_s::qi::symbols<char, OperationType> func_map;\n\n}; // End struct calc_grammar\n\n/// Image view class which applies the calc_operation tree to each pixel location.\ntemplate <class ImageT, typename OutputPixelT>\nclass ImageCalcView: public vw::ImageViewBase<ImageCalcView<ImageT, OutputPixelT>> {\n\npublic: // Definitions\n  typedef typename ImageT::pixel_type  input_pixel_type;\n  typedef OutputPixelT pixel_type;  // Output pixel type\n  typedef OutputPixelT result_type;\n\nprivate: // Variables\n  std::vector<ImageT> const& m_image_vec;\n  std::vector<bool> m_has_nodata_vec;\n  std::vector<double> m_nodata_vec; // nodata is always double\n  double              m_output_nodata;\n  calc_operation m_operation_tree;\n  int m_num_rows;\n  int m_num_cols;\n  int m_num_channels;\n\npublic: // Functions\n\n  // Constructor\n  ImageCalcView(std::vector<ImageT> const& imageVec,\n                std::vector<bool>   const& has_nodata_vec,\n                std::vector<double> const& nodata_vec,\n                double outputNodata,\n                calc_operation const& operation_tree):\n    m_image_vec(imageVec),   m_has_nodata_vec(has_nodata_vec),\n    m_nodata_vec(nodata_vec), m_output_nodata(outputNodata),\n    m_operation_tree(operation_tree) {\n    size_t numImages = imageVec.size();\n    VW_ASSERT((numImages > 0), vw::ArgumentErr()\n              << \"ImageCalcView: One or more images required.\");\n    VW_ASSERT((has_nodata_vec.size() == numImages),\n              vw::LogicErr() << \"ImageCalcView: Incorrect hasNodata count passed in.\");\n    VW_ASSERT((nodata_vec.size() == numImages),\n              vw::LogicErr() << \"ImageCalcView: Incorrect nodata count passed in.\");\n\n    // Make sure all images are the same size\n    m_num_rows     = imageVec[0].rows();\n    m_num_cols     = imageVec[0].cols();\n    m_num_channels = imageVec[0].planes();\n    for (size_t i = 1; i < numImages; i++) {\n      if ((imageVec[i].rows()   != m_num_rows) ||\n          (imageVec[i].cols()   != m_num_cols) ||\n          (imageVec[i].planes() != m_num_channels))\n        vw::vw_throw(vw::ArgumentErr()\n           << \"Error: Input images must all have the same size and number of channels.\");\n    }\n  }\n\n  inline vw::int32 cols  () const { return m_num_cols; }\n  inline vw::int32 rows  () const { return m_num_rows; }\n  inline vw::int32 planes() const { return m_num_channels; }\n\n  inline result_type operator()(vw::int32 i, vw::int32 j, vw::int32 p=0) const {\n    return 0; // NOT IMPLEMENTED.\n  }\n\n  typedef vw::ProceduralPixelAccessor<ImageCalcView<ImageT, OutputPixelT>> pixel_accessor;\n  inline pixel_accessor origin() const { return pixel_accessor(*this, 0, 0); }\n\n  typedef vw::CropView<vw::ImageView<result_type>> prerasterize_type;\n  inline prerasterize_type prerasterize(vw::BBox2i const& bbox) const {\n    typedef typename vw::ImageChannelType<vw::ImageView<result_type>>::type output_channel_type;\n\n    // Set up the output image tile\n    vw::ImageView<result_type> tile(bbox.width(), bbox.height());\n\n    // TODO: Left to right processing.\n\n    // Set up for pixel calculations\n    size_t num_images = m_image_vec.size();\n    std::vector<input_pixel_type> input_pixels(num_images);\n    std::vector<double>           input_doubles(num_images);\n\n    // Rasterize all the input images at this particular tile\n    std::vector<vw::ImageView<input_pixel_type>> input_tiles(num_images);\n    for (size_t i = 0; i < num_images; i++)\n      input_tiles[i] = crop(m_image_vec[i], bbox);\n\n    // Loop through each output pixel and compute each output value\n    for (int c = 0; c < bbox.width(); c++) {\n      for (int r = 0; r < bbox.height(); r++) {\n        // Fetch all the input pixels for this location\n        bool isNodata = false;\n        for (size_t i = 0; i < num_images; i++) {\n          input_pixels[i] = (input_tiles[i])(c,r);\n\n          // If any of the input pixels are nodata, the output is nodata.\n          if (m_has_nodata_vec[i] && (m_nodata_vec[i] == input_pixels[i])) {\n            isNodata = true;\n            break;\n          }\n        } // End image loop\n\n        if (isNodata) { // Output is nodata, move on to the next pixel\n          tile(c, r) = m_output_nodata;\n          continue;\n        }\n\n        for (int chan = 0; chan < m_num_channels; chan++) {\n          for (size_t i = 0; i < num_images; i++) {\n            input_doubles[i] = input_pixels[i][chan];\n          } // End image loop\n\n          // Apply the operation tree to this pixel and store in the output\n          // pixel. Note that this does not round the output value when the\n          // output type is integral. Not sure if that is desired behavior.\n          double newVal = m_operation_tree.applyOperation<double>(input_doubles);\n          tile(c, r, chan) = vw::clamp_and_cast<output_channel_type>(newVal);\n\n        } // End channel loop\n      } // End row loop\n    } // End column loop\n\n  // Return the tile we created with fake borders to make it look the\n  // size of the entire output image\n  return prerasterize_type(tile, -bbox.min().x(), -bbox.min().y(), cols(), rows());\n\n  } // End prerasterize function\n\n template <class DestT>\n inline void rasterize(DestT const& dest, vw::BBox2i const& bbox) const {\n   vw::rasterize(prerasterize(bbox), dest, bbox);\n }\n\n}; // End class ImageCalcView\n\nstruct Options: vw::GdalWriteOptions {\n  Options(): out_nodata_value(-1), percentile_stretch(false), \n    percentile_range(vw::Vector2(2, 98)) {}\n  // Input\n  std::vector<std::string> input_files;\n  bool        has_in_nodata;\n  double      in_nodata_value, lon_offset;\n\n  // Settings\n  std::string output_data_string;\n  int         output_data_type;\n  bool        has_out_nodata;\n  bool        no_georef;\n  bool        percentile_stretch;\n  vw::Vector2 percentile_range;\n  double      out_nodata_value;\n  std::string calc_string;\n  std::string output_file, metadata;\n};\n\n// Handling input\nvoid handle_arguments(int argc, char * argv[], Options & opt) {\n\n  const std::string calc_string_help =\n    \"The operation to be performed on the input images. Input images must all be the \"\n    \"same size and type. Currently only single channel images are supported. \"\n    \"Recognized operators: +, -, /, *, (), pow(), abs(), sign(), rand(), min(), max(), \"\n    \"var_0, var_1, etc. Use var_n to refer to the pixel of the n-th input image \"\n    \"(n starts from 0). Note that the order of operations is parsed with right-to-left \"\n    \"associativity, so, 'a * b * c' becomes 'a * (b * c)'. Use parentheses to \"\n    \"enforce the desired order. Surround the entire string with quotes. For a \"\n    \"single input image, if the operation is not set, it defaults to 'var_0' so the \"\n    \"identity operation.\";\n\n  const std::string data_type_string =\n    \"The data type of the output file:\\n\"\n    \"  uint8   \\n\"\n    \"  uint16  \\n\"\n    \"  uint32  \\n\"\n    \"  int16   \\n\"\n    \"  int32   \\n\"\n    \"  float32 (default)\\n\"\n    \"  float64 \\n\";\n\n  double nan = std::numeric_limits<double>::quiet_NaN();\n  po::options_description general_options(\"\");\n  general_options.add_options()\n    (\"output-file,o\", po::value(&opt.output_file), \"Output file name.\")\n    (\"calc,c\", po::value(&opt.calc_string), calc_string_help.c_str())\n    (\"output-data-type,d\",\n     po::value(&opt.output_data_string)->default_value(\"float32\"), data_type_string.c_str())\n    (\"input-nodata-value\",  po::value(&opt.in_nodata_value), \"Set the nodata value for the input images, overriding the value in the images, if present.\")\n    (\"output-nodata-value\", po::value(&opt.out_nodata_value),\n     \"Manually specify a nodata value for the output image. By default it is read from the \"\n     \"first input which has it, or, if missing, it is set to data type min.\")\n    (\"mo\",  po::value(&opt.metadata)->default_value(\"\"),\n     \"Write metadata to the output file. Provide as a string in quotes if more than one \"\n     \"item, separated by a space, such as 'VAR1=VALUE1 VAR2=VALUE2'. Neither the variable \"\n     \"names nor the values should contain spaces.\")\n    (\"no-georef\", po::bool_switch(&opt.no_georef)->default_value(false),\n     \"Remove any georeference information (useful with subsequent GDAL-based processing).\")\n    (\"stretch\", po::bool_switch(&opt.percentile_stretch)->default_value(false),\n     \"Linearly stretch, round, and clamp the input values to the 0 - 255 range (uint8) \"\n     \"based on the specified percentiles. See --percentile-range.\")\n    (\"percentile-range\", \n     po::value(&opt.percentile_range)->default_value(vw::Vector2(2, 98), \"2 98\"),\n     \"The percentiles to use for stretching the image to 8-bit. These are double values.\")\n    (\"longitude-offset\",  po::value(&opt.lon_offset)->default_value(nan),\n     \"Add this value to the longitudes in the geoheader (can be used to offset the \"\n     \"longitudes by 360 degrees).\")\n    (\"help,h\", \"Display this help message.\");\n\n  general_options.add(vw::GdalWriteOptionsDescription(opt));\n\n  po::options_description positional(\"\");\n  positional.add_options()\n    (\"input-files\", po::value<std::vector<std::string>>(&opt.input_files));\n\n  po::positional_options_description positional_desc;\n  positional_desc.add(\"input-files\", -1);\n\n  std::string usage(\"[options] <image-files>\");\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line(argc, argv, opt, general_options, general_options,\n                            positional, positional_desc, usage,\n                            allow_unregistered, unregistered);\n\n  if (opt.input_files.empty())\n    vw::vw_throw(vw::ArgumentErr() << \"Missing input files.\\n\" << usage << general_options);\n\n  if (opt.percentile_stretch && opt.input_files.size() != 1)\n    vw::vw_throw(vw::ArgumentErr() \n             << \"The --stretch option works only with a single input image.\\n\");\n\n  if (opt.percentile_range[0] < 0.0 || opt.percentile_range[0] >= opt.percentile_range[1] || \n      opt.percentile_range[1] > 100.0)\n    vw::vw_throw(vw::ArgumentErr() << \"The --percentile-range values must be between 0 and 100, \"\n             << \"and the first value must be less than the second.\\n\");\n\n  if (opt.calc_string.empty()) {\n    if (opt.input_files.size() == 1) {\n      opt.calc_string = \"var_0\";\n    } else {\n      vw::vw_throw(vw::ArgumentErr() << \"Missing operation string.\\n\" << usage << general_options);\n    }\n  }\n\n  if (opt.output_data_string == \"uint8\") opt.output_data_type = vw::VW_CHANNEL_UINT8;\n  else if (opt.output_data_string == \"uint16\") opt.output_data_type = vw::VW_CHANNEL_UINT16;\n  else if (opt.output_data_string == \"uint32\") opt.output_data_type = vw::VW_CHANNEL_UINT32;\n  // GDAL does not support int8\n  //else if (opt.output_data_string == \"int8\") opt.output_data_type  = VW_CHANNEL_INT8;\n  else if (opt.output_data_string == \"int16\") opt.output_data_type = vw::VW_CHANNEL_INT16;\n  else if (opt.output_data_string == \"int32\") opt.output_data_type = vw::VW_CHANNEL_INT32;\n  else if (opt.output_data_string == \"float32\") opt.output_data_type = vw::VW_CHANNEL_FLOAT32;\n  else if (opt.output_data_string == \"float64\") opt.output_data_type = vw::VW_CHANNEL_FLOAT64;\n  else\n    vw::vw_throw(vw::ArgumentErr()\n             << \"Unsupported output data type: \" << opt.output_data_string << \".\\n\");\n\n  // Fill out opt.has_in_nodata and opt.has_out_nodata depending if the user\n  // specified these options\n  if (!vm.count(\"input-nodata-value\")) {\n    opt.has_in_nodata = false;\n  } else\n    opt.has_in_nodata = true;\n\n  if (!vm.count(\"output-nodata-value\")) {\n    opt.has_out_nodata   = false;\n    opt.out_nodata_value = vw::get_default_nodata(opt.output_data_type);\n  } else\n    opt.has_out_nodata = true;\n\n  if (opt.output_file.empty())\n    vw::vw_throw(vw::ArgumentErr() << \"The output file was not specified.\\n\");\n\n  vw::create_out_dir(opt.output_file);\n}\n\n// Implement option --stretch\nvoid image_calc_stretch(Options const& opt, bool have_georef,\n                        vw::cartography::GeoReference const& georef,\n                        std::map<std::string, std::string> const& keywords,\n                        bool has_nodata, double nodata_val) {\n  \n  // Check that the input image has only one channel\n  const std::string firstFile = opt.input_files[0];\n  auto rsrc = vw::DiskImageResourcePtr(firstFile);\n  if (rsrc->channels() != 1)\n    vw::vw_throw(vw::ArgumentErr() \n             << \"The --stretch option works only with single-channel images.\\n\");\n\n  // Read the image\n  vw::DiskImageView<double> image(firstFile);\n\n  // Handle nodata. Mask it before doing stats.\n  vw::ImageViewRef<vw::PixelMask<double>> masked_image;\n  if (has_nodata)\n    masked_image = vw::create_mask(image, nodata_val);\n  else\n    masked_image = vw::pixel_cast<vw::PixelMask<double>>(image);\n\n  // Compute statistics at a reduced resolution. Use double and int64 to avoid overflow.\n  const double numPixelSamples = 1000000;\n  double num_pixels = double(image.cols()) * double(image.rows());\n  vw::int64 stat_scale = vw::int64(ceil(sqrt(num_pixels / numPixelSamples)));\n  vw::math::CDFAccumulator<double> accumulator;\n  vw::int64 num_valid_pixels = 0;\n  vw::ImageView<vw::PixelMask<double>> sub_image = vw::subsample(masked_image, stat_scale);\n  vw::vw_out() << \"Computing image percentiles with subsampled image size: \" \n    << sub_image.cols() << \" x \" << sub_image.rows() << \"\\n\";\n  vw::TerminalProgressCallback tp(\"asp\", \": \");\n  for (vw::int64 col = 0; col < sub_image.cols(); col++) {\n    for (vw::int64 row = 0; row < sub_image.rows(); row++) {\n      if (vw::is_valid(sub_image(col, row))) {\n        accumulator(sub_image(col, row).child());\n        num_valid_pixels++;\n      }\n    }\n    tp.report_fractional_progress(col, sub_image.cols());\n  }\n  tp.report_finished();\n\n  double min_val = 0.0, max_val = 1.0;\n  if (num_valid_pixels == 0) {\n    vw::vw_out(vw::WarningMessage) << \"No valid pixels found in the input image.\\n\";\n  } else {\n    min_val = accumulator.quantile(opt.percentile_range[0] / 100.0);\n    max_val = accumulator.quantile(opt.percentile_range[1] / 100.0);\n  }\n  vw::vw_out() << \"  \" << opt.percentile_range[0] << \"%: \" << min_val << \"\\n\"\n               << \"  \" << opt.percentile_range[1] << \"%: \" << max_val << \"\\n\";\n\n  // Create the stretched view. Pixels below min_val and nodata are clamped to\n  // 0. Pixels above max_val are clamped to 255. Round, then cast to uint8.\n  vw::ImageViewRef<double> normalized_image\n    = vw::normalize(vw::apply_mask(masked_image, min_val), min_val, max_val, 0.0, 255.0);\n  vw::ImageViewRef<vw::uint8> cast_image \n    = vw::channel_cast_round_and_clamp<vw::uint8>(normalized_image);\n\n  bool has_out_nodata = false;\n  double out_nodata = 0.0;\n  auto tpc = vw::TerminalProgressCallback(\"asp\", \": \");\n  vw::vw_out() << \"Writing: \" << opt.output_file << \"\\n\";\n  vw::cartography::block_write_gdal_image(opt.output_file, cast_image, have_georef, georef,\n                                          has_out_nodata, out_nodata, opt, tpc, \n                                          keywords);\n}\n\n/// This function call is just to clean up the case statement in proc_img\ntemplate <typename PixelT, typename OutputT>\nvoid write_out(std::string const& output_file,\n               Options const& opt,\n               calc_operation const& calc_tree,\n               bool have_georef,\n               vw::cartography::GeoReference const& georef,\n               std::vector<vw::ImageViewRef<PixelT>> const& input_images,\n               std::vector<bool> const& has_nodata_vec,\n               std::vector<double> const& nodata_vec) {\n\n  // Read previous keywords and append any new keywords from --mo. Overwrite\n  // any previous value of a keyword.\n  std::map<std::string, std::string> keywords;\n  if (opt.metadata != \"\") {\n    if (!opt.input_files.empty()) {\n      auto rsrc = vw::DiskImageResourcePtr(opt.input_files[0]);\n      vw::cartography::read_header_strings(*rsrc.get(), keywords);\n    }\n    asp::parse_append_metadata(opt.metadata, keywords);\n  }\n\n  if (opt.percentile_stretch) {\n    image_calc_stretch(opt, have_georef, georef, keywords, \n                       has_nodata_vec[0], nodata_vec[0]);\n  } else {\n    if (opt.has_out_nodata)\n      vw::vw_out() << \"\\t--> Writing output nodata value: \" << opt.out_nodata_value << \"\\n\";\n    vw::vw_out() << \"Writing: \" << output_file << \"\\n\";\n    auto tpc = vw::TerminalProgressCallback(\"image_calc\", \"Writing:\");\n    vw::cartography::block_write_gdal_image\n      (output_file,\n      ImageCalcView<vw::ImageViewRef<PixelT>, OutputT>\n        (input_images, has_nodata_vec, nodata_vec, opt.out_nodata_value, calc_tree),\n      have_georef, georef, opt.has_out_nodata, opt.out_nodata_value, opt, tpc, keywords);\n  }\n}\n\nvoid handleGeoref(Options const& opt, bool & have_georef, \n                  vw::cartography::GeoReference & georef) {\n  have_georef = false;\n  size_t numInputFiles = opt.input_files.size();\n  for (size_t i = 0; i < numInputFiles; i++) {\n    std::string input = opt.input_files[i];\n\n    // If desired to not use a georef, skip reading it. Else read it.\n    if (!opt.no_georef) {\n      if (!have_georef) {\n        have_georef = vw::cartography::read_georeference(georef, input);\n        if (have_georef) {\n          vw::vw_out() << \"\\t--> Copying georef from input image \" << input << \"\\n\";\n\n          if (!std::isnan(opt.lon_offset)) {\n            if (!georef.is_projected()) {\n              vw::vw_out() << \"\\t--> Adding \" << opt.lon_offset\n                           << \" to the longitude bounds in the geoheader.\\n\";\n              vw::Matrix<double,3,3> T = georef.transform();\n              T(0, 2) += opt.lon_offset;\n              georef.set_transform(T);\n            } else {\n              vw::vw_throw(vw::ArgumentErr() \n                << \"Can apply a longitude offset only to georeferenced \"\n                << \"images in the longitude-latitude projection.\\n\");\n            }\n          }\n        }\n      }\n    }\n  }\n}\n\n// Read all images as double. Disable rescaling on the resource so integer\n// pixels (uint8, uint16, etc.) keep their original values when read as double.\ntypedef vw::PixelGray<double> DoublePixelT;\nvoid loadImagesNodata(Options & opt,\n                      std::vector<vw::ImageViewRef<DoublePixelT>> & input_images,\n                      std::vector<bool> & has_nodata_vec,\n                      std::vector<double> & nodata_vec) {\n\n  size_t numInputFiles = input_images.size();\n  for (size_t i = 0; i < numInputFiles; i++) {\n    std::string input = opt.input_files[i];\n\n    // Open the resource and disable rescaling\n    auto rsrc = vw::DiskImageResourcePtr(input);\n    rsrc->set_rescale(false);\n\n    // Check for nodata value in the file\n    if (opt.has_in_nodata) {\n      // User has specified a default nodata value, override its value in the file\n      has_nodata_vec[i]  = true;\n      nodata_vec[i]      = opt.in_nodata_value;\n      opt.has_out_nodata = true;\n      vw::vw_out() << \"\\t--> Using as nodata value: \" << nodata_vec[i] << \"\\n\";\n    } else if (rsrc->has_nodata_read()) {\n      nodata_vec[i] = rsrc->nodata_read();\n      has_nodata_vec[i] = true;\n\n      if (!opt.has_out_nodata) {\n        opt.has_out_nodata   = true;\n        opt.out_nodata_value = nodata_vec[i];\n      }\n      vw::vw_out() << \"\\t--> Extracted nodata value from \" << input << \": \"\n                << nodata_vec[i] << \"\\n\";\n    } else {\n      vw::vw_out() << \"\\t--> No nodata value present in: \" << input << \"\\n\";\n      has_nodata_vec[i] = false;\n    }\n\n    vw::DiskImageView<DoublePixelT> disk_image(rsrc);\n    input_images[i] = disk_image;\n  }\n}\n\n/// This function loads the input images and calls the main processing function\nvoid proc_img(Options & opt, std::string const& output_file,\n              calc_operation const& calc_tree) {\n\n  // Read the georef from the first file, they should all have the same value.\n  size_t numInputFiles = opt.input_files.size();\n  std::vector<vw::ImageViewRef<DoublePixelT>> input_images(numInputFiles);\n  std::vector<bool> has_nodata_vec(numInputFiles);\n  std::vector<double> nodata_vec(numInputFiles);\n\n  bool have_georef = false;\n  vw::cartography::GeoReference georef;\n  handleGeoref(opt, have_georef, georef);\n\n  // Load images and nodata values\n  loadImagesNodata(opt, input_images, has_nodata_vec, nodata_vec);\n\n  // Write out the selected data type\n  switch(opt.output_data_type) {\n    case vw::VW_CHANNEL_UINT8:\n      write_out<DoublePixelT, vw::PixelGray<vw::uint8>>(output_file, opt, calc_tree, have_georef, georef, input_images, has_nodata_vec, nodata_vec); break;\n    case vw::VW_CHANNEL_INT16:\n      write_out<DoublePixelT, vw::PixelGray<vw::int16>>(output_file, opt, calc_tree, have_georef, georef, input_images, has_nodata_vec, nodata_vec); break;\n    case vw::VW_CHANNEL_UINT16:\n      write_out<DoublePixelT, vw::PixelGray<vw::uint16>>(output_file, opt, calc_tree, have_georef, georef, input_images, has_nodata_vec, nodata_vec); break;\n    case vw::VW_CHANNEL_INT32:\n      write_out<DoublePixelT, vw::PixelGray<vw::int32>>(output_file, opt, calc_tree, have_georef, georef, input_images, has_nodata_vec, nodata_vec); break;\n    case vw::VW_CHANNEL_UINT32:\n      write_out<DoublePixelT, vw::PixelGray<vw::uint32>>(output_file, opt, calc_tree, have_georef, georef, input_images, has_nodata_vec, nodata_vec); break;\n    case vw::VW_CHANNEL_FLOAT32:\n      write_out<DoublePixelT, vw::PixelGray<vw::float32>>(output_file, opt, calc_tree, have_georef, georef, input_images, has_nodata_vec, nodata_vec); break;\n  default:\n    write_out<DoublePixelT, vw::PixelGray<vw::float64>>(output_file, opt, calc_tree, have_georef, georef, input_images, has_nodata_vec, nodata_vec); break;\n  };\n\n}\n\nvoid image_calc(Options & opt) {\n  std::string exp(opt.calc_string);\n\n  calc_grammar<std::string::const_iterator> grammarParser;\n  calc_operation calc_tree;\n\n  std::string::const_iterator iter = exp.begin();\n  std::string::const_iterator end = exp.end();\n  bool r = phrase_parse(iter, end, grammarParser, boost::spirit::ascii::space, calc_tree);\n\n  if (r && iter == end) {// Successfully parsed the calculation expression\n    calc_tree.clearEmptyNodes();\n  } else { // Failed to parse the calculation expression\n    std::string::const_iterator some = iter+30;\n    std::string context(iter, (some>end)?end:some);\n    vw::vw_out() << \"Parsing calculation expression failed\\n\";\n    vw::vw_out() << \"stopped at: \\\": \" << context << \"...\\\"\\n\";\n    vw::vw_throw(vw::ArgumentErr() << \"Parsing calculation expression failed\\n\");\n  }\n\n  // Use a default output file if none provided\n  const std::string firstFile = opt.input_files[0];\n  std::string output_file = opt.output_file;\n\n  // All inputs are read in native type and cast to double without rescaling.\n  // The computation is done in double precision, and the output is cast to\n  // the requested type.\n  proc_img(opt, output_file, calc_tree);\n}\n\n/// The main function calls the cmd line parsers and figures out the input image type\nint main(int argc, char * argv[]) {\n\n  Options opt;\n  try {\n    handle_arguments(argc, argv, opt);\n    image_calc(opt);\n\n  } ASP_STANDARD_CATCHES;\n\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/image_mosaic.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// \\file image_mosaic.cc\n//\n// Tool for creating mosaics of images on disk. Currently supports one line of\n// images.\n\n#include <asp/Core/AspProgramOptions.h>\n#include <asp/Core/AspLog.h>\n#include <asp/Core/Macros.h>\n#include <asp/Core/InterestPointMatching.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/GdalUtils.h>\n\n#include <vw/FileIO/DiskImageUtils.h>\n#include <vw/FileIO/ImageChannelRead.h>\n#include <vw/Image/RoundAndClamp.h>\n#include <vw/Image/AlgorithmFunctions.h>\n#include <vw/Image/Grassfire.h>\n#include <vw/Image/Manipulation.h>\n#include <vw/Image/Interpolation.h>\n#include <vw/FileIO/FileUtils.h>\n#include <vw/InterestPoint/MatcherIO.h>\n#include <vw/Math/Geometry.h>\n#include <vw/Math/RANSAC.h>\n#include <vw/Image/Filter.h>\n#include <vw/Image/Transform.h>\n\n#include <boost/algorithm/string.hpp>\n#include <boost/program_options.hpp>\n#include <boost/filesystem.hpp>\n\n#include <limits>\n\nusing namespace vw;\nnamespace po = boost::program_options;\nnamespace fs = boost::filesystem;\n\n/// GDAL block write sizes must be a multiple to 16 so if the input value is\n///  not a multiple of 16 increase it until it is.\nvoid fix_tile_multiple(int &size) {\n  const int TILE_MULTIPLE = 16;\n  if (size % TILE_MULTIPLE != 0)\n    size = ((size / TILE_MULTIPLE) + 1) * TILE_MULTIPLE;\n}\n\nstruct Options: vw::GdalWriteOptions {\n  std::vector<std::string> image_files;\n  std::string orientation, output_image, output_type, out_prefix;\n  int    overlap_width, band, blend_radius, ip_per_tile, num_ransac_iterations;\n  bool   has_input_nodata_value, has_output_nodata_value, reverse, rotate,\n         use_affine_transform, rotate90, rotate90ccw;\n  double input_nodata_value, output_nodata_value, inlier_threshold;\n  Vector2 big_tile_size;\n  Options(): has_input_nodata_value(false), has_output_nodata_value(false),\n             input_nodata_value (std::numeric_limits<double>::quiet_NaN()),\n             output_nodata_value(std::numeric_limits<double>::quiet_NaN()){}\n};\n\n/// Load an input image, respecting the user parameters.\nvoid get_input_image(std::string const& path,\n                     Options const& opt,\n                     ImageViewRef<float> &image,\n                     double &nodata) {\n\n  // Extract the desired band. // In VW, bands start from 0, not 1.\n  image = vw::read_float_channel(path, opt.band - 1);\n  \n  // Read the nodata-value from disk\n  DiskImageResourceGDAL in_rsrc(path);\n  bool has_nodata = in_rsrc.has_nodata_read();\n  if (has_nodata)\n    nodata = in_rsrc.nodata_read();\n  else\n    nodata = std::numeric_limits<double>::quiet_NaN();\n}\n\n/// Get a list of matched IP, looking in certain image regions.\nvoid match_ip_in_regions(std::string const& image_file1,\n                         std::string const& image_file2,\n                         BBox2i const& roi1,\n                         BBox2i const& roi2,\n                         std::vector<ip::InterestPoint> &matched_ip1,\n                         std::vector<ip::InterestPoint> &matched_ip2,\n                         Options const& opt) {\n\n  // Load the input images\n  ImageViewRef<float> image1,  image2;\n  double              nodata1, nodata2;\n  get_input_image(image_file1, opt, image1, nodata1);\n  get_input_image(image_file2, opt, image2, nodata2);\n\n  vw_out() << \"Matching interest points between: \" << image_file1 << \" and \"\n           << image_file2 << std::endl;\n  \n  std::string match_file;\n  bool matches_as_txt = false;\n  if (opt.out_prefix != \"\") {\n    // Write a match file for debugging\n    match_file = ip::match_filename(opt.out_prefix, image_file1, image_file2, matches_as_txt);\n\n    // If the match file already exists, load it instead of finding new points.\n    if (fs::exists(match_file)) {\n      vw_out() << \"Reading matched interest points from file: \" << match_file << std::endl;\n      ip::read_match_file(match_file, matched_ip1, matched_ip2, matches_as_txt);\n      vw_out() << \"Read in \" << matched_ip1.size() << \" matched IP.\\n\";\n    }\n  }\n\n  if (matched_ip1.empty()) {\n    // Now find and match interest points in the selected regions\n    size_t number_of_jobs = 1;\n    bool use_cached_ip = false;    \n    asp::detect_match_ip(matched_ip1, matched_ip2,\n                        crop(image1, roi1),\n                        crop(image2, roi2), opt.ip_per_tile, number_of_jobs,\n                        \"\", \"\", use_cached_ip,\n                        nodata1, nodata2, match_file);\n  }\n\n  // TODO: This should be a function!\n  // Adjust the IP to account for the search ROIs.\n  for (size_t i=0; i<matched_ip1.size(); ++i) {\n    matched_ip1[i].x  += roi1.min()[0];\n    matched_ip1[i].ix += roi1.min()[0];\n    matched_ip1[i].y  += roi1.min()[1];\n    matched_ip1[i].iy += roi1.min()[1];\n    \n    matched_ip2[i].x  += roi2.min()[0];\n    matched_ip2[i].ix += roi2.min()[0];\n    matched_ip2[i].y  += roi2.min()[1];\n    matched_ip2[i].iy += roi2.min()[1];\n  }\n} // End function match_ip_in_regions\n\n/// Compute a matrix transform between images, searching for IP in\n///  the specified regions.\nMatrix<double> compute_ip_matching(std::string const& image_file1,\n                                   std::string const& image_file2,\n                                   BBox2i const& roi1,\n                                   BBox2i const& roi2,\n                                   Options & opt) {\n\n  // Find IP, looking in only the specified regions.\n  std::vector<ip::InterestPoint> matched_ip1, matched_ip2;\n  match_ip_in_regions(image_file1, image_file2, roi1, roi2,\n                      matched_ip1,  matched_ip2, opt);\n\n  // Clean up lists.\n  std::vector<Vector3> ransac_ip1 = iplist_to_vectorlist(matched_ip1);\n  std::vector<Vector3> ransac_ip2 = iplist_to_vectorlist(matched_ip2);\n\n  // RANSAC parameters\n  int min_num_output_inliers = ransac_ip1.size()/2;\n  bool reduce_min_num_output_inliers_if_no_fit = true;\n  vw_out() << \"Number of RANSAC iterations: \" << opt.num_ransac_iterations << \"\\n\";\n  vw_out() << \"Inlier threshold in pixels: \" << opt.inlier_threshold << \"\\n\";\n\n  Matrix<double> tf;\n  std::vector<size_t> indices;\n  try {\n    if (opt.use_affine_transform) {\n      vw::math::RandomSampleConsensus<vw::math::AffineFittingFunctor,\n                                      vw::math::InterestPointErrorMetric>\n                                        ransac(vw::math::AffineFittingFunctor(),\n                                              vw::math::InterestPointErrorMetric(),\n                                              opt.num_ransac_iterations,\n                                              opt.inlier_threshold,\n                                              min_num_output_inliers,\n                                              reduce_min_num_output_inliers_if_no_fit);\n      tf      = ransac(ransac_ip2, ransac_ip1);\n      indices = ransac.inlier_indices(tf, ransac_ip2, ransac_ip1);\n    } else { // More restricted transform\n      vw::math::RandomSampleConsensus<vw::math::TranslationRotationFittingFunctorN<2>,\n                                      vw::math::InterestPointErrorMetric>\n                                      ransac(vw::math::TranslationRotationFittingFunctorN<2>(),\n                                             vw::math::InterestPointErrorMetric(),\n                                             opt.num_ransac_iterations,\n                                             opt.inlier_threshold,\n                                             min_num_output_inliers,\n                                             reduce_min_num_output_inliers_if_no_fit);\n      tf      = ransac(ransac_ip2, ransac_ip1);\n      indices = ransac.inlier_indices(tf, ransac_ip2, ransac_ip1);\n    }\n  } catch (...) {\n    vw_throw( ArgumentErr() << \"Automatic alignment failed in the RANSAC fit.\");\n  }\n\n  // Keeping only inliers\n  std::vector<ip::InterestPoint> inlier_ip1, inlier_ip2;\n  for ( size_t i = 0; i < indices.size(); i++ ) {\n    inlier_ip1.push_back( matched_ip1[indices[i]] );\n    inlier_ip2.push_back( matched_ip2[indices[i]] );\n  } \n\n  std::string match_file;\n  bool matches_as_txt = false;\n  if (opt.out_prefix != \"\") {\n    // Write a match file for debugging\n    match_file = ip::clean_match_filename(opt.out_prefix, image_file1, image_file2,\n                                          matches_as_txt);\n    vw_out() << \"Writing inlier matches after RANSAC to: \" << match_file << std::endl;\n    ip::write_match_file(match_file, inlier_ip1, inlier_ip2, matches_as_txt);\n  }\n  \n  return tf;\n}\n\n// TODO: Pass in image ref instead of paths?\n/// Compute the transform from image1 to image2\n///  (the top left corner of image1 is (0,0))\nMatrix<double> compute_relative_transform(std::string const& image1,\n                                          std::string const& image2,\n                                          Options& opt) {\n\n  Vector2i size1 = file_image_size(image1);\n  Vector2i size2 = file_image_size(image2);\n\n  // Set up the ROIs for the two images based on the selected orientation.\n  // - Currently only horizontal orientation is supported.\n  BBox2i roi1, roi2;\n  if (opt.orientation == \"horizontal\") {\n    roi1.min() = Vector2(std::max(size1[0] - opt.overlap_width, 0), 0);\n    roi1.max() = size1; // Bottom right corner\n    roi2.min() = Vector2(0, 0); // Top left corner\n    roi2.max() = Vector2(std::min(opt.overlap_width, size2[0]), size2[1]); // Bottom right\n  }\n\n  if (roi1.empty() || roi2.empty())\n    vw_throw( ArgumentErr() << \"Unrecognized image orientation!\");\n\n  Matrix<double> tf;\n  \n  // Try several times, with ever-larger value of ip-per-tile. Normally this value \n  // is computed internally, or passed in by the user via --ip-per-tile. In \n  // either case, it will be recorded in asp::stereo_settings().ip_per_tile,\n  // which we will increase in subsequent attempts.\n  int num_attempts = 3;\n  for (int attempt = 1; attempt <= num_attempts; attempt++) {\n    try {\n      tf = compute_ip_matching(image1, image2, roi1, roi2, opt);\n      break;\n    } catch (std::exception const& e) {\n      vw_out() << \"Failed with error: \" << e.what() << \"\\n\";\n      if (attempt == num_attempts)\n        vw_throw(ArgumentErr()\n                 << \"Failed to compute the relative transform. Inspect your images.\\n\");\n    }\n\n    // Wipe any old match file to force it to be regenerated\n    std::string match_file;\n    bool matches_as_txt = false;\n    if (opt.out_prefix != \"\")\n      match_file = ip::match_filename(opt.out_prefix, image1, image2, matches_as_txt);\n    if (!match_file.empty() && fs::exists(match_file)) {\n      vw::vw_out() << \"Removing old match file: \" << match_file << \"\\n\";\n      fs::remove(match_file);\n    }\n      \n    // Multiply the number of IP per tile by 4 and try again.\n    asp::stereo_settings().ip_per_tile *= 4;\n    opt.ip_per_tile = asp::stereo_settings().ip_per_tile;\n    vw_out() << \"Increasing --ip-per-tile to: \" << asp::stereo_settings().ip_per_tile \n             << \"\\n\";\n  }\n  \n  return tf;\n\n} // End function compute_relative_transform\n\n/// Compute the positions of each image relative to the first image.\n/// - The top left corner of the first image is coordinate 0,0 in the output image.\nvoid compute_all_image_positions(Options & opt,\n                                 std::vector<boost::shared_ptr<vw::Transform>> & transforms,\n                                 std::vector<BBox2i>          & bboxes,\n                                 Vector2i                     & output_image_size) {\n\n  const size_t num_images = opt.image_files.size();\n\n  transforms.resize(num_images);\n  bboxes.resize(num_images);\n\n  // Init the bounding box to contain the first image\n  BBox2i output_bbox;\n  Vector2i image_size = file_image_size(opt.image_files[0]);\n  output_bbox.grow(Vector2i(0,0));\n  output_bbox.grow(image_size);\n\n  // Init values for the first image\n  \n  Vector2   to(0, 0);\n  Matrix2x2 mo;\n  mo(0,0) = 1;\n  mo(0,1) = 0;\n  mo(1,0) = 0;\n  mo(1,1) = 1;\n  transforms[0] = boost::shared_ptr<vw::Transform>(new AffineTransform(mo, to));\n  bboxes    [0] = output_bbox;\n  \n  // This approach only works for serial pairs, if we add another type of\n  //  orientation it will need to be changed.\n  Matrix<double> last_transform = identity_matrix(3);\n  \n  for (size_t i=1; i<num_images; ++i) {\n\n    Matrix<double> relative_transform = \n        compute_relative_transform(opt.image_files[i-1], opt.image_files[i], opt);\n\n    image_size = file_image_size(opt.image_files[i]);\n\n    Matrix<double> absolute_transform;\n    if (i == 0) { // First transform\n      absolute_transform = relative_transform;\n    } else { // Chain from the last transform\n      absolute_transform = last_transform * relative_transform;\n    }\n    last_transform = absolute_transform;\n    \n    Vector2   t(absolute_transform(0,2), absolute_transform(1,2));\n    Matrix2x2 m;\n    m(0,0) = absolute_transform(0,0);\n    m(0,1) = absolute_transform(0,1);\n    m(1,0) = absolute_transform(1,0);\n    m(1,1) = absolute_transform(1,1);\n    boost::shared_ptr<vw::Transform> tf_ptr(new AffineTransform(m, t));\n\n    Matrix<double> inv_absolute_transform = inverse(absolute_transform);\n    Vector2   ti(inv_absolute_transform(0,2), inv_absolute_transform(1,2));\n    Matrix2x2 mi;\n    mi(0,0) = inv_absolute_transform(0,0);\n    mi(0,1) = inv_absolute_transform(0,1);\n    mi(1,0) = inv_absolute_transform(1,0);\n    mi(1,1) = inv_absolute_transform(1,1);\n    boost::shared_ptr<vw::Transform> inv_tf_ptr(new AffineTransform(mi, ti));\n    \n    transforms[i] = tf_ptr; // Record transfrom from output to input\n\n    vw_out() << \"relative_transform: \" << relative_transform << std::endl;\n    vw_out() << \"absolute_transform: \" << absolute_transform << std::endl;\n\n    // Update the overall output bbox with the new image added\n    // TODO: Add other corners!\n    Vector2 new_bot_right_corner = tf_ptr->forward(image_size);\n    output_bbox.grow(new_bot_right_corner);\n    \n    // Update this image's bbox in output image\n    BBox2f this_bbox = compute_transformed_bbox_fast(\n                                BBox2i(0,0,image_size[0],image_size[1]),\n                                *tf_ptr);\n    this_bbox.expand(1);\n    this_bbox.crop(output_bbox); // TODO: Should not be needed!\n    bboxes[i] = this_bbox;\n  } // End loop through images\n  \n  output_image_size = output_bbox.size();\n}\n\n\n/// A class to mosaic and rescale images using bilinear interpolation.\ntemplate <class T>\nclass ImageMosaicView: public ImageViewBase<ImageMosaicView<T> >{\nprivate:\n  std::vector<ImageViewRef<T> > const& m_images;\n  std::vector<boost::shared_ptr<vw::Transform> > const& m_transforms;\n  std::vector<BBox2i>          const& m_bboxes;\n  int            m_blend_radius;\n  Vector2i const m_output_image_size;\n  double         m_output_nodata_value;\n\npublic:\n  ImageMosaicView(std::vector<ImageViewRef<T> > const& images,\n                  std::vector<boost::shared_ptr<vw::Transform> > const& transforms,\n                  std::vector<BBox2i>          const& bboxes,\n                  int      blend_radius,\n                  Vector2i output_image_size, \n                  double   output_nodata_value):\n    m_images(images), m_transforms(transforms),\n    m_bboxes(bboxes), m_blend_radius(blend_radius),\n    m_output_image_size(output_image_size),\n    m_output_nodata_value(output_nodata_value){}\n\n  typedef float pixel_type;\n  typedef float result_type;\n  typedef ProceduralPixelAccessor<ImageMosaicView> pixel_accessor;\n\n  inline int32 cols  () const { return m_output_image_size[0]; }\n  inline int32 rows  () const { return m_output_image_size[1]; }\n  inline int32 planes() const { return 1; }\n\n  inline pixel_accessor origin() const { return pixel_accessor( *this, 0, 0 ); }\n\n  inline result_type operator()( double/*i*/, double/*j*/, int32/*p*/ = 0 ) const {\n    vw_throw(NoImplErr() << \"ImageMosaicView::operator()(...) is not implemented\");\n    return result_type();\n  }\n\n  typedef CropView<ImageView<result_type> > prerasterize_type;\n  inline prerasterize_type prerasterize(BBox2i const& bbox) const {\n\n    // Initialize the output tile\n    ImageView<result_type> tile   (bbox.width(), bbox.height());\n    ImageView<float      > weights(bbox.width(), bbox.height());\n    fill(tile,    m_output_nodata_value);\n    fill(weights, 0);\n\n    // Loop through the intersecting input images and paste them in\n    //  to the output image.\n    for (size_t i=0; i<m_images.size(); ++i) {\n\n      // Get the intersection (if any) of this image with the current bbox.\n      if (!m_bboxes[i].intersects(bbox)) {\n        continue;\n      }\n      BBox2i intersect = m_bboxes[i];\n      intersect.crop(bbox);\n\n      typedef ImageView<T> ImageT;\n      typedef InterpolationView<ImageT, BilinearInterpolation> InterpT;\n      \n      // Find the required section of the input image.\n      //BBox2f temp_bbox = compute_transformed_bbox_fast(intersect, inv_trans);\n      BBox2i temp_bbox = m_transforms[i]->reverse_bbox(intersect);\n      temp_bbox.expand(BilinearInterpolation::pixel_buffer);\n      BBox2i input_bbox = temp_bbox;\n      input_bbox.crop(bounding_box(m_images[i]));\n      \n      BBox2i tile_bbox = intersect - bbox.min(); // ROI of this input in the output tile\n\n      // TODO: Clean up\n      AffineTransform* temp = dynamic_cast<AffineTransform*>(m_transforms[i].get());\n\n      // --> Requires loading a larger section of the input image,\n      //     calling grassfire on it, and then extracting out the section we need.\n\n      /// This sets the extra area we work with to improve the blending weights.\n      BBox2i expanded_intersect = intersect;\n      expanded_intersect.expand(m_blend_radius);\n      \n      // Get the cropped piece of the transformed input image that we need\n      ImageView<T> trans_input = crop(transform(m_images[i], *temp,\n                                                ZeroEdgeExtension(),\n                                                BilinearInterpolation()),\n                                      expanded_intersect);\n      ImageView<double> input_weights;\n      //  = grassfire(notnodata(apply_mask(trans_input,0), 0));\n      bool fill_holes  = false; // Don't fill holes\n      bool min_weights = true;  // This option works better with the applied cutoffs\n      centerline_weights(trans_input, input_weights, BBox2i(), fill_holes, min_weights);\n      \n      double dist = std::min(intersect.height(), intersect.width()) / 2.0;\n      double denom = dist + m_blend_radius;\n      \n      double cutoff = (m_blend_radius/denom);//*(dist/denom);\n      for (int r=0; r<input_weights.rows(); ++r) {\n        for (int c=0; c<input_weights.cols(); ++c) {\n          if (input_weights(c,r) > cutoff)\n            input_weights(c,r) = cutoff;\n        }\n      }\n\n      // Copy that piece to the output tile, applying the mask.\n      for (int r=0; r<intersect.height(); ++r) {\n        for (int c=0; c<intersect.width(); ++c) {\n\n          double weight = input_weights(c+m_blend_radius,r+m_blend_radius);\n          //if (weight > cutoff)\n          //  weight = cutoff;\n          \n          T pixel = trans_input(c+m_blend_radius,r+m_blend_radius);\n          if (is_valid(pixel)) {\n            float value = remove_mask(pixel);\n            int o_c = c+tile_bbox.min()[0];\n            int o_r = r+tile_bbox.min()[1];\n            if (weights(o_c, o_r) == 0)\n              tile(o_c, o_r) = value * weight;\n            else\n              tile(o_c, o_r) += value * weight;\n            weights(o_c, o_r) += weight;\n          }\n        }\n      } // End loop through tile intersection\n    } // End loop through input images\n\n    //std::string fix = \"_\"+num2str(bbox.min()[0])+\"_\"+num2str(bbox.min()[1])+\".tif\";\n    //write_image(\"tile\"+fix, tile);\n    //write_image(\"tile_weights\"+fix, weights);\n    \n    // Normalize output by the weight.\n    for (int c = 0; c < bbox.width(); c++){\n      for (int r = 0; r < bbox.height(); r++){\n        if ( weights(c, r) > 0 )\n          tile(c, r) /= weights(c, r);\n      } // End row loop\n    } // End col loop\n    \n    //write_image(\"tile_norm\"+fix, tile);\n    \n    return prerasterize_type(tile, -bbox.min().x(), -bbox.min().y(),\n                             cols(), rows() );\n  } // End function prerasterize\n\n  template <class DestT>\n  inline void rasterize(DestT const& dest, BBox2i bbox) const {\n    vw::rasterize(prerasterize(bbox), dest, bbox);\n  }\n}; // End class ImageMosaicView\n\n\n// Write the image out, converting to the specified data type.\nvoid write_selected_image_type(ImageViewRef<float> const& out_img,\n                               double output_nodata_value,\n                               Options & opt) {\n  \n  // Set up our output image object\n  TerminalProgressCallback tpc(\"asp\", \"\\t    Mosaic:\");\n\n  // Since we blend large portions, it is convenient to use large\n  // tiles upon writing.  Yet, those are hard to process later, for\n  // example, by stereo_gui. So, later we will rewrite the tiles\n  // with smaller blocks.\n  int min_tile_size = 2*opt.blend_radius;\n  min_tile_size = std::max(opt.raster_tile_size[0], min_tile_size);\n  min_tile_size = std::max(opt.raster_tile_size[1], min_tile_size);\n  fix_tile_multiple(min_tile_size);\n  \n  vw_out() << \"Using temporary block size: \" << min_tile_size << std::endl;\n  \n  bool has_georef = false;\n  bool has_nodata = true;\n  vw::cartography::GeoReference georef;\n  \n  boost::algorithm::to_lower(opt.output_type);\n  \n  // Write to disk using the specified output data type.\n  if (opt.output_type == \"float32\") \n    asp::saveWithTempBigBlocks(min_tile_size, opt.output_image, out_img,\n                               has_georef, georef, has_nodata,\n                               output_nodata_value, opt, tpc);\n  else if (opt.output_type == \"byte\") \n    asp::saveWithTempBigBlocks(min_tile_size, opt.output_image,\n                               per_pixel_filter(out_img,\n                                                RoundAndClamp<uint8, float>()),\n                               has_georef, georef, has_nodata, \n                               vw::round_and_clamp<uint8>(output_nodata_value),\n                               opt, tpc);\n  else if (opt.output_type == \"uint16\") \n    asp::saveWithTempBigBlocks(min_tile_size, opt.output_image,\n                               per_pixel_filter(out_img,\n                                                RoundAndClamp<uint16, float>()),\n                               has_georef, georef, has_nodata, \n                               vw::round_and_clamp<uint16>(output_nodata_value),\n                               opt, tpc);\n  else if (opt.output_type == \"int16\") \n    asp::saveWithTempBigBlocks(min_tile_size, opt.output_image,\n                               per_pixel_filter(out_img,\n                                                RoundAndClamp<int16, float>()),\n                               has_georef, georef, has_nodata, \n                               vw::round_and_clamp<int16>(output_nodata_value),\n                               opt, tpc);\n  \n  else if (opt.output_type == \"uint32\") \n    asp::saveWithTempBigBlocks(min_tile_size, opt.output_image,\n                               per_pixel_filter(out_img,\n                                                RoundAndClamp<uint32, float>()),\n                               has_georef, georef, has_nodata, \n                               vw::round_and_clamp<uint32>(output_nodata_value),\n                               opt, tpc);\n  else if (opt.output_type == \"int32\") \n    asp::saveWithTempBigBlocks(min_tile_size, opt.output_image,\n                               per_pixel_filter(out_img,\n                                                RoundAndClamp<int32, float>()),\n                               has_georef, georef, has_nodata, \n                               vw::round_and_clamp<int32>(output_nodata_value),\n                               opt, tpc);\n  else\n    vw_throw( NoImplErr() << \"Unsupported output type: \" << opt.output_type << \".\\n\" );\n  \n} // End function write_selected_image_type\n\nvoid handle_arguments(int argc, char *argv[], Options& opt) {\n  po::options_description general_options(\"\");\n  // Add the reverse option\n  general_options.add( vw::GdalWriteOptionsDescription(opt) );\n  general_options.add_options()\n    (\"orientation\", po::value(&opt.orientation)->default_value(\"horizontal\"),\n     \"Choose a supported image layout from [horizontal].\")\n    (\"reverse\", po::bool_switch(&opt.reverse)->default_value(false),\n     \"Mosaic the images in reverse order.\")\n    (\"rotate\", po::bool_switch(&opt.rotate)->default_value(false),\n     \"After mosaicking, rotate the image by 180 degrees around its center.\")\n    (\"rotate-90\", po::bool_switch(&opt.rotate90)->default_value(false),\n     \"After mosaicking, rotate the image by 90 degrees clockwise around its center.\")\n    (\"rotate-90-ccw\", po::bool_switch(&opt.rotate90ccw)->default_value(false),\n     \"After mosaicking, rotate the image by 90 degrees counter-clockwise around its center.\")\n    (\"use-affine-transform\", po::bool_switch(&opt.use_affine_transform)->default_value(false),\n     \"Solve for full affine transforms between segments instead of a simpler rotate+translate transform.\")\n    (\"overlap-width\", po::value(&opt.overlap_width)->default_value(2000),\n          \"Select the size of the overlap region to use.\")\n    (\"blend-radius\", po::value(&opt.blend_radius)->default_value(0),\n          \"Size to perform blending over.  Default is the overlap width.\")\n    (\"output-image,o\", po::value(&opt.output_image)->default_value(\"\"),\n     \"Specify the output image.\")\n    (\"ip-per-tile\",          po::value(&opt.ip_per_tile)->default_value(0),\n     \"How many interest points to detect in each 1024^2 image tile (default: automatic determination).\")\n    (\"ot\",  po::value(&opt.output_type)->default_value(\"Float32\"),\n     \"Output data type. Supported types: Byte, UInt16, Int16, UInt32, Int32, Float32. If the output type is a kind of integer, values are rounded and then clamped to the limits of that type.\")\n    (\"band\", po::value(&opt.band)->default_value(1), \n     \"Which band (channel) to use (for multi-spectral images). The band count starts from 1.\")\n    (\"input-nodata-value\", po::value(&opt.input_nodata_value),\n     \"Nodata value to use on input; input pixel values less than or equal to this are considered invalid.\")\n    (\"output-nodata-value\", po::value(&opt.output_nodata_value),\n     \"Nodata value to use on output.\")\n    (\"output-prefix\", po::value(&opt.out_prefix)->default_value(\"\"),\n     \"If specified, save here the interest point matches used in mosaicking.\")\n    (\"num-ransac-iterations\", po::value(&opt.num_ransac_iterations)->default_value(1000),\n     \"How many iterations to perform in RANSAC when finding interest point matches.\")\n    (\"inlier-threshold\", po::value(&opt.inlier_threshold)->default_value(10.0),\n     \"The inlier threshold (in pixels) to separate inliers from outliers when computing \"\n     \"interest point matches. A smaller threshold will result in fewer inliers.\");\n \n  po::options_description positional(\"\");\n  positional.add_options()\n    (\"input-files\", po::value(&opt.image_files));\n\n  po::positional_options_description positional_desc;\n  positional_desc.add(\"input-files\", -1);\n\n  std::string usage(\"image_mosaic <images> [options]\");\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line( argc, argv, opt, general_options, general_options,\n                             positional, positional_desc, usage,\n                             allow_unregistered, unregistered );\n\n  opt.has_input_nodata_value  = vm.count(\"input-nodata-value\" );\n  opt.has_output_nodata_value = vm.count(\"output-nodata-value\");\n\n  if ( opt.image_files.empty() )\n    vw_throw( ArgumentErr() << \"No images to mosaic.\\n\" << usage << general_options );\n\n  if ( opt.output_image.empty() )\n    vw_throw( ArgumentErr() << \"Missing output image name.\\n\" << usage << general_options );\n\n  if ( opt.blend_radius == 0 ) {\n    opt.blend_radius = opt.overlap_width;\n    vw_out() << \"Using blend radius: \" << opt.blend_radius << std::endl;\n  }\n\n  int check = 0; // Count the number of rotate options specified.\n  if (opt.rotate     ) ++check;\n  if (opt.rotate90   ) ++check;\n  if (opt.rotate90ccw) ++check;\n  if (check > 1)\n    vw_throw( ArgumentErr() << \"Cannot specify more than one rotate option.\\n\"\n                            << usage << general_options );\n\n  // Reverse the order of files\n  if (opt.reverse) {\n    size_t len = opt.image_files.size();\n    for (size_t it = 0; it < len; it++) {\n      size_t it2 = len-1-it;\n      if (it < it2)\n        std::swap(opt.image_files[it], opt.image_files[it2]);\n    }\n  }\n  \n  // Create the output directory\n  vw::create_out_dir(opt.output_image);\n\n  // Turn on logging to file\n  asp::log_to_file(argc, argv, \"\", opt.output_image);\n}\n\nint main( int argc, char *argv[] ) {\n\n  Options opt;\n  \n  try {\n\n    // Find command line options\n    handle_arguments( argc, argv, opt );\n\n    // Compute the transforms between all of the images on disk\n    std::vector<boost::shared_ptr<vw::Transform> > transforms;\n    std::vector<BBox2i>          bboxes;\n    Vector2i                     output_image_size;\n    compute_all_image_positions(opt, transforms, bboxes, output_image_size);\n\n    // Get handles to all of the input images.\n    size_t num_images = opt.image_files.size();\n    std::vector<ImageViewRef<PixelMask<float>>> images(num_images);\n    double nodata = -std::numeric_limits<float>::max();\n    for (size_t i = 0; i < num_images; i++) {\n      // Apply a nodata mask here\n      ImageViewRef<float> temp;\n      get_input_image(opt.image_files[i], opt, temp, nodata);\n      images[i] = create_mask(temp, nodata);\n    }\n\n    // If nodata was not provided, take one from the input images.\n    double output_nodata_value = nodata;\n    if (opt.has_output_nodata_value)\n      output_nodata_value = opt.output_nodata_value;\n\n    // Set up our output image object\n    vw_out() << \"Writing: \" << opt.output_image << std::endl;\n    TerminalProgressCallback tpc(\"asp\", \"\\t    Mosaic:\");\n    ImageViewRef<float> out_img = \n        ImageMosaicView<PixelMask<float>>(images, transforms, bboxes,\n                                          opt.blend_radius, output_image_size,\n                                          opt.output_nodata_value);\n\n    if (opt.rotate)\n      //write_selected_image_type(ImageRotateView<float>(out_img), opt.output_nodata_value, opt);\n      write_selected_image_type(vw::rotate_180(out_img), opt.output_nodata_value, opt);\n    else\n      if (opt.rotate90)\n        write_selected_image_type(vw::rotate_90_cw(out_img), opt.output_nodata_value, opt);\n      else\n        if (opt.rotate90ccw)\n          write_selected_image_type(vw::rotate_90_ccw(out_img), opt.output_nodata_value, opt);\n        else\n          write_selected_image_type(out_img, opt.output_nodata_value, opt);\n\n  } ASP_STANDARD_CATCHES;\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/image_subset.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Given a set of overlapping georeferenced images, find a small\n// subset with almost the same coverage. This is used in SfS.\n\n#include <asp/Core/AspProgramOptions.h>\n#include <asp/Core/AspLog.h>\n#include <asp/Core/Macros.h>\n#include <asp/Core/FileUtils.h>\n\n#include <vw/Cartography/GeoTransform.h>\n#include <vw/Core/Stopwatch.h>\n#include <vw/FileIO/FileUtils.h>\n\n#include <omp.h>\n\n#include <vector>\n#include <string>\n#include <iostream>\n#include <limits>\n\n#include <boost/filesystem.hpp>\n#include <boost/program_options.hpp>\n\nnamespace fs = boost::filesystem;\nnamespace po = boost::program_options;\n\nstruct Options : public vw::GdalWriteOptions {\n  std::string image_list_file, out_list; \n  double threshold;\n  vw::BBox2   target_projwin;\n};\n\nvoid handle_arguments(int argc, char *argv[], Options& opt) {\n  \n double nan = std::numeric_limits<double>::quiet_NaN();\n\n  po::options_description general_options(\"\");\n  general_options.add_options()\n   (\"image-list\", po::value(&opt.image_list_file)->default_value(\"\"),\n    \"The list of input images.\")\n   (\"output-list,o\", po::value(&opt.out_list)->default_value(\"\"),\n    \"The file having the produced image subset, and for each image the number \"\n    \"of contributing pixels (sorted in decreasing order of contribution).\")\n   (\"threshold\", po::value(&opt.threshold)->default_value(nan),\n    \"The image threshold. Pixels no less than this will contribute to the coverage.\")\n   (\"t_projwin\", po::value(&opt.target_projwin)->default_value(vw::BBox2(), \"0 0 0 0\"),\n     \"Specify a custom extent in projected coordinates in which to evaluate the coverage. \"\n     \"The format is min_x min_y max_x max_y or min_x max_y max_x min_y, with no quotes. \"\n     \"In this mode all input images must use the same projection.\")\n  ;\n\n  general_options.add(vw::GdalWriteOptionsDescription(opt));\n  po::options_description positional(\"\");\n  po::positional_options_description positional_desc;\n\n  std::string usage(\"[options]\");\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line(argc, argv, opt, general_options, general_options,\n                            positional, positional_desc, usage,\n                            allow_unregistered, unregistered);\n\n  // Validate inputs\n  if (opt.image_list_file == \"\")\n    vw::vw_throw(vw::ArgumentErr() << \"Missing image list.\\n\");\n  if (opt.out_list == \"\")\n    vw::vw_throw(vw::ArgumentErr() << \"Missing output list.\\n\");\n  if (std::isnan(opt.threshold))\n    vw::vw_throw(vw::ArgumentErr() << \"The threshold must be set.\\n\");\n    \n  // For compatibility with GDAL, we allow the proj win y coordinate to be flipped.\n  // Correct that here.\n  if (opt.target_projwin != vw::BBox2()) {\n    if (opt.target_projwin.min().y() > opt.target_projwin.max().y())\n      std::swap(opt.target_projwin.min().y(), opt.target_projwin.max().y());\n\n    vw::vw_out() << \"The overlap analysis restricted to projection box: \" \n      << opt.target_projwin << \".\\n\";\n  }\n\n  // Create the output directory\n  vw::create_out_dir(opt.out_list);\n\n  // Turn on logging to file\n  asp::log_to_file(argc, argv, \"\", opt.out_list);\n    \n  return;\n}\n\n// Calc the score of adding a new image. Apply the new image pixels to the output image if\n// requested.\ndouble calc_score_apply(Options const& opt, std::string const& image_file, \n                        double threshold, bool apply, \n                        vw::cartography::GeoReference const& out_georef,\n                        // Output\n                        vw::ImageView<vw::PixelMask<float>> & out_img) {\n  \n  // Read the image\n  vw::DiskImageResourceGDAL in_rsrc(image_file);\n  \n  // Read the georef\n  vw::cartography::GeoReference georef;\n  bool is_good = read_georeference(georef, in_rsrc);\n  if (!is_good)\n    vw::vw_throw(vw::ArgumentErr() << \"No georeference found in \" << image_file << \".\\n\");\n    \n  // Read the no-data\n  double nodata = -std::numeric_limits<float>::max();\n  if (in_rsrc.has_nodata_read())\n    nodata = in_rsrc.nodata_read();\n  \n  // Read the image in memory (for speed) and mask the no-data\n  vw::ImageView<vw::PixelMask<float>> img \n    = create_mask(vw::DiskImageView<float>(in_rsrc), nodata);\n  \n  // Bounds of the output and input images\n  vw::BBox2 out_box = vw::bounding_box(out_img);\n  vw::BBox2 img_box = vw::bounding_box(img);\n  \n  // Form the geo transform from the output to the input image\n  vw::cartography::GeoTransform geotrans(out_georef, georef,\n                                         out_box, img_box);\n  \n  // Find the current image bounding box in the output image coordinates\n  vw::BBox2 trans_box = geotrans.reverse_bbox(vw::bounding_box(img));\n  \n  // See if to crop to an area\n  if (opt.target_projwin != vw::BBox2()) {\n    vw::BBox2 proj_pix_box = out_georef.point_to_pixel_bbox(opt.target_projwin);\n    trans_box.crop(proj_pix_box);\n  }\n  \n  // Grow to int\n  trans_box = vw::grow_bbox_to_int(trans_box);\n  \n  // trans_box must be contained within out_box, as out_box is a union of such\n  // boxes. As a precaution, do a crop however, in case numerical issues are\n  // encountered.\n  trans_box.crop(out_box);\n\n  // Prepare the image for interpolation   \n  vw::PixelMask<float> no_data;\n  no_data.invalidate();\n  typedef vw::ValueEdgeExtension<vw::PixelMask<float>> NoDataType;\n  NoDataType no_data_ext(no_data);\n  vw::InterpolationView<vw::EdgeExtensionView<vw::ImageView<vw::PixelMask<float>>, NoDataType>, vw::BilinearInterpolation> interp_img \n    = interpolate(img, vw::BilinearInterpolation(), no_data_ext);\n \n  // Iterate over the transformed box and calculate the score or apply the\n  // image. Extract bounds to integer variables to satisfy OpenMP canonical form.\n  int beg_col = trans_box.min().x();\n  int end_col = trans_box.max().x();\n  int beg_row = trans_box.min().y();\n  int end_row = trans_box.max().y();\n  double score = 0.0;\n\n  // Use reduction(+:score) to handle the sum efficiently without locking\n  #pragma omp parallel for num_threads(opt.num_threads) reduction(+:score)\n  for (int col = beg_col; col < end_col; col++) {\n    for (int row = beg_row; row < end_row; row++) {\n      \n      vw::Vector2 out_pix(col, row);\n      \n      // If already above threshold, skip\n      vw::PixelMask<float> out_val = out_img(col, row);\n      if (is_valid(out_val) && out_val.child() >= threshold)\n        continue;\n      \n      // Interpolated pixel  \n      vw::Vector2 img_pix = geotrans.forward(out_pix);\n      vw::PixelMask<float> val = interp_img(img_pix.x(), img_pix.y());\n      \n      // If not above threshold, it does not add to the score\n      if (!is_valid(val) || val.child() < threshold)\n        continue;\n\n      // No need for critical section; reduction handles this safely and fast\n      score += 1.0;\n      \n      if (apply)\n        out_img(col, row) = val;\n    }  \n  }\n     \n  return score;\n}\n                           \nvoid run_image_subset(Options const& opt) {\n  \n  vw::vw_out() << \"Reading: \" << opt.image_list_file << \"\\n\";\n  std::vector<std::string> image_files;\n  asp::read_list(opt.image_list_file, image_files);\n  \n  vw::vw_out() << \"Reading input georeferences.\\n\";\n  vw::cartography::GeoReference out_georef;\n\n  // Loop through all input images\n  int num_images = image_files.size();  \n  vw::BBox2 out_box;\n  for (int image_iter = 0; image_iter < num_images; image_iter++) {\n\n    std::string image_file = image_files[image_iter]; \n    vw::DiskImageResourceGDAL in_rsrc(image_file);\n    vw::DiskImageView<float> img(in_rsrc);\n    vw::cartography::GeoReference georef;\n    bool is_good = read_georeference(georef, in_rsrc);\n    if (!is_good)\n      vw::vw_throw(vw::ArgumentErr() << \"No georeference found in \" << image_file << \".\\n\");\n    \n    // Input image bounding box\n    vw::BBox2 img_box = vw::bounding_box(img);\n\n    // Borrow the geo info from the first image\n    if (image_iter == 0) {\n      out_georef = georef;\n      out_box = img_box;\n    }\n    \n   if (opt.target_projwin != vw::BBox2() && \n       georef.get_wkt() != out_georef.get_wkt())\n      vw::vw_throw(vw::ArgumentErr() \n                   << \"All images must have the same projection with the \"\n                   << \"--t_projwin option.\\n\");\n\n    // The georef transform from current to output image\n    vw::cartography::GeoTransform geotrans(out_georef, georef,\n                                           out_box, img_box);\n\n    // Convert the bounding box of current image to output pixel coordinates\n    vw::BBox2 trans_img_box = geotrans.reverse_bbox(img_box);\n    \n    // See if to crop to an area\n    if (opt.target_projwin != vw::BBox2()) {\n      vw::BBox2 proj_pix_box = out_georef.point_to_pixel_bbox(opt.target_projwin);\n      trans_img_box.crop(proj_pix_box);\n    }\n\n    // Grow to int\n    trans_img_box = vw::grow_bbox_to_int(trans_img_box);\n    \n    out_box.grow(trans_img_box);\n  } // End loop through DEM files\n\n  // grow this to int\n  out_box = vw::grow_bbox_to_int(out_box);\n  \n  // The box must be non-empty\n  if (out_box.empty())\n    vw::vw_throw(vw::ArgumentErr() << \"The region of interest is empty.\\n\");\n\n  // Crop the georef to the output box. Adjust the box.\n  out_georef = crop(out_georef, out_box);\n  out_box.max() -= out_box.min();\n  out_box.min() = vw::Vector2(0, 0);\n  \n  // Create the output image as a pixel mask, with all pixels being float and invalid\n  vw::ImageView<vw::PixelMask<float>> out_img(out_box.width(), out_box.height());\n  // invalidate all pixels\n  for (int col = 0; col < out_img.cols(); col++) {\n    for (int row = 0; row < out_img.rows(); row++) {\n      out_img(col, row).invalidate();\n    }\n  }\n  \n  // Now process the images  \n  vw::vw_out() << \"Processing the images.\\n\";\n  vw::Stopwatch sw;\n  sw.start();\n  vw::TerminalProgressCallback tpc(\"\", \"\\t--> \");\n  tpc.report_progress(0);\n  double inc_amount = 2.0 / (double(num_images) * double(num_images));\n  \n  // The no-data score is lower than any possible score\n  double nodata_inspected_score = -std::numeric_limits<float>::max();\n\n  // Do as many passes as images\n  std::map<std::string, double> inspected;\n  for (int pass = 0; pass < num_images; pass++) {\n        \n    // Skip inspected images\n    if (inspected.find(image_files[pass]) != inspected.end())\n      continue;\n\n    double best_score = 0;\n    int best_index = 0;\n    \n    // Inner iteration over all images. Skip the inspected ones.\n    for (int inner = 0; inner < num_images; inner++) {\n     \n      if (inspected.find(image_files[inner]) != inspected.end())\n        continue;\n      \n      tpc.report_incremental_progress(inc_amount);\n      \n      bool apply = false;\n      double score = calc_score_apply(opt, image_files[inner], opt.threshold, apply, \n                                      out_georef, out_img);\n      \n      // If the image being inspected now adds nothing, it won't add anything\n      // after we add other images either. So do not look at it again.\n      if (score == 0.0) {\n        inspected[image_files[inner]] = nodata_inspected_score;\n        continue;\n      }\n\n      // Update the best score\n      if (score > best_score) {\n        best_score = score;\n        best_index = inner;\n      }\n    }\n\n    // If the score is 0, we are done, as more passes won't help\n    if (best_score == 0.0) {\n      break;\n    }\n    \n    // Add the contribution of the best image\n    bool apply = true;\n    calc_score_apply(opt, image_files[best_index], opt.threshold, apply, \n                     out_georef, out_img);\n    \n    // Flag the current image as inspected and store its score\n    inspected[image_files[best_index]] = best_score;\n  }  \n\n  tpc.report_finished();\n  sw.stop();\n  vw::vw_out() << \"Elapsed time: \" << sw.elapsed_seconds() << \" s.\\n\";\n  \n  // Save in decreasing order of score\n  std::vector<std::pair<double, std::string>> sorted;\n  for (auto const& p: inspected)\n    sorted.push_back(std::make_pair(p.second, p.first));\n  std::sort(sorted.begin(), sorted.end());\n  vw::vw_out() << \"Writing: \" << opt.out_list << \"\\n\";\n  std::ofstream ofs(opt.out_list.c_str());\n  for (int i = int(sorted.size()) - 1; i >= 0; i--) {\n    // Skip images with nodata score\n    if (sorted[i].first == nodata_inspected_score)\n      continue;\n    ofs << sorted[i].second << \" \" << sorted[i].first << \"\\n\";\n  }\n  ofs.close();\n  \n} // End function run_image_subset()\n\nint main(int argc, char *argv[]) {\n\n  Options opt;\n  try {\n    handle_arguments(argc, argv, opt);\n    run_image_subset(opt);\n  } ASP_STANDARD_CATCHES;\n\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/jitter_solve.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file jitter_adjust.cc\n///\n/// Use n adjustments for every camera, placed at several lines in the image\n// with interpolation between them. The pdf doc has more info.\n\n// TODO(oalexan1): Move some UsgsAstroLsSensorModel functions from\n// here and from LinescanDGModel.cc to CsmUtils.cc.\n\n// TODO(oalexan1): Why jitter_solve does not use all threads?\n\n#include <asp/Sessions/StereoSessionFactory.h>\n#include <asp/Sessions/CameraUtils.h>\n#include <asp/Camera/CsmModel.h>\n#include <asp/Camera/CsmUtils.h>\n#include <asp/Camera/BundleAdjustCamera.h>\n#include <asp/Camera/BundleAdjustOutliers.h>\n#include <asp/Camera/BundleAdjustIsis.h>\n#include <asp/Camera/JitterSolveCostFuns.h>\n#include <asp/Camera/JitterSolveUtils.h>\n#include <asp/Rig/RigConfig.h>\n#include <asp/Camera/JitterSolveRigUtils.h>\n#include <asp/Camera/LinescanUtils.h>\n#include <asp/Camera/BundleAdjustResiduals.h>\n#include <asp/Core/Macros.h>\n#include <asp/Core/AspProgramOptions.h>\n#include <asp/Core/AspLog.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/BaseCameraUtils.h>\n#include <asp/Core/BundleAdjustUtils.h>\n#include <asp/Core/IpMatchingAlgs.h>\n#include <asp/Core/CameraTransforms.h>\n#include <asp/Core/ImageUtils.h>\n#include <asp/Core/PointUtils.h>\n#include <asp/Core/FileUtils.h>\n#include <asp/Core/Nvm.h>\n#include <asp/Core/Bathymetry.h>\n\n#include <vw/BundleAdjustment/ControlNetwork.h>\n#include <vw/Image/ImageChannels.h>\n#include <vw/BundleAdjustment/ControlNetworkLoader.h>\n#include <vw/Core/Stopwatch.h>\n#include <vw/Cartography/CameraBBox.h>\n#include <vw/Cartography/GeoReferenceBaseUtils.h>\n#include <vw/Camera/CameraImage.h>\n#include <vw/Cartography/DatumUtils.h>\n#include <vw/FileIO/FileTypes.h>\n#include <vw/FileIO/FileUtils.h>\n\n#include <usgscsm/UsgsAstroLsSensorModel.h>\n#include <usgscsm/UsgsAstroFrameSensorModel.h>\n#include <usgscsm/Utilities.h>\n\n#include <xercesc/util/PlatformUtils.hpp>\n\n#include <set>\n\nnamespace po = boost::program_options;\nnamespace fs = boost::filesystem;\n\nusing namespace vw;\nusing namespace vw::math;\n\nnamespace asp {\n\nstruct Options: public asp::BaBaseOptions {\n  int num_lines_per_position, num_lines_per_orientation, num_anchor_points_per_image,\n    num_anchor_points_per_tile;\n  std::string anchor_weight_image;\n  std::string anchor_dem, rig_config;\n  int num_anchor_points_extra_lines;\n  bool initial_camera_constraint, fix_rig_translations, fix_rig_rotations,\n    use_initial_rig_transforms;\n  double quat_norm_weight, anchor_weight, roll_weight, yaw_weight, smoothness_weight;\n  std::map<int, int> cam2group;\n};\n\nvoid handle_arguments(int argc, char *argv[], Options& opt, rig::RigSet & rig) {\n\n  po::options_description general_options(\"\");\n  general_options.add_options()\n    (\"output-prefix,o\",  po::value(&opt.out_prefix), \"Prefix for output filenames.\")\n    (\"session-type,t\",   po::value(&opt.stereo_session)->default_value(\"\"),\n     \"Select the stereo session type to use for processing. Usually the program \"\n     \"can select this automatically by the file extension, except for xml cameras. \"\n     \"See the doc for options.\")\n    (\"input-adjustments-prefix\",  po::value(&opt.input_prefix),\n     \"Prefix to read initial adjustments from, written by bundle_adjust. \"\n     \"Not required. Cameras in .json files in ISD or model state format \"\n     \"can be passed in with no adjustments.\")\n    (\"num-lines-per-position\", po::value(&opt.num_lines_per_position)->default_value(-1),\n     \"Resample the input camera positions and velocities, using this many lines per \"\n     \"produced position and velocity. If not set, use the positions and velocities \"\n     \"from the CSM file as they are.\")\n    (\"num-lines-per-orientation\", po::value(&opt.num_lines_per_orientation)->default_value(-1),\n     \"Resample the input camera orientations, using this many lines per produced \"\n     \"orientation. If not set, use the orientations from the CSM file as they are.\")\n    (\"match-first-to-last\",\n     po::bool_switch(&opt.match_first_to_last)->default_value(false)->implicit_value(true),\n     \"Match first several images to last several images by extending the logic of \"\n     \"--overlap-limit past the last image to the earliest ones.\")\n    (\"overlap-limit\",        po::value(&opt.overlap_limit)->default_value(0),\n     \"Limit the number of subsequent images to search for matches to the current image \"\n     \"to this value. By default match all images.\")\n    (\"match-files-prefix\",  po::value(&opt.match_files_prefix)->default_value(\"\"),\n     \"Use the match files from this prefix. The order of images in each interest point \"\n     \"match file need not be the same as for input images.\")\n    (\"clean-match-files-prefix\",  po::value(&opt.clean_match_files_prefix)->default_value(\"\"),\n     \"Use as input match files the *-clean.match files from this prefix. The order of \"\n     \"images in each interest point match file need not be the same as for input images.\")\n    (\"matches-as-txt\",\n     po::bool_switch(&asp::stereo_settings().matches_as_txt)->default_value(false)->implicit_value(true),\n     \"Read and write match files as plain text instead of binary. See the documentation \"\n     \"for details.\")\n    (\"isis-cnet\", po::value(&opt.isis_cnet)->default_value(\"\"),\n     \"Read a control network having interest point matches from this binary file \"\n     \"in the ISIS jigsaw format. This can be used with any images and cameras \"\n     \"supported by ASP.\")\n    (\"nvm\", po::value(&opt.nvm)->default_value(\"\"),\n     \"Read a control network having interest point matches from this file in the NVM \"\n     \"format. This can be used with any images and cameras supported by ASP.\")\n    (\"min-matches\", po::value(&opt.min_matches)->default_value(30),\n     \"Set the minimum  number of matches between images that will be considered.\")\n    (\"max-pairwise-matches\", po::value(&opt.max_pairwise_matches)->default_value(10000),\n     \"Reduce the number of matches per pair of images to at most this \"\n     \"number, by selecting a random subset, if needed. This happens \"\n     \"when setting up the optimization, and before outlier filtering. \"\n     \"Set to 0 to load no matches (use with GCP only).\")\n    (\"min-triangulation-angle\", po::value(&opt.min_triangulation_angle)->default_value(0.1),\n     \"The minimum angle, in degrees, at which rays must meet at a triangulated point to \"\n     \"accept this point as valid. It must be a positive value.\")\n    (\"max-initial-reprojection-error\",\n     po::value(&opt.max_init_reproj_error)->default_value(20),\n     \"Filter as outliers any triangulated points that have a reprojection error \"\n     \"(in pixels) of more than this value, with the initial cameras. Since jitter \"\n     \"corrections are supposed to be small and cameras bundle-adjusted by now, \"\n     \"this value need not be too big. Does not apply to GCP.\")\n    (\"max-gcp-reproj-err\",\n     po::value(&opt.max_gcp_reproj_err)->default_value(-1.0),\n     \"If positive, after each pass remove GCPs whose mean reprojection error \"\n     \"(averaged over all cameras seeing that point) is more than this, in pixels.\")\n    (\"robust-threshold\", po::value(&opt.robust_threshold)->default_value(0.5),\n     \"Set the threshold for the Cauchy robust cost function. Increasing this makes \"\n     \"the solver focus harder on the larger errors.\")\n    (\"image-list\", po::value(&opt.image_list)->default_value(\"\"),\n     \"A file containing the list of images, when they are too many to specify on the \"\n     \"command line. Use space or newline as separator. See also --camera-list.\")\n    (\"camera-list\", po::value(&opt.camera_list)->default_value(\"\"),\n     \"A file containing the list of cameras, when they are too many to specify on \"\n     \"the command line. If the images have embedded camera information, such as for ISIS, \"\n     \"this file may be omitted, or specify the image names instead of camera names.\")\n    (\"parameter-tolerance\",  po::value(&opt.parameter_tolerance)->default_value(1e-12),\n     \"Stop when the relative error in the variables being optimized is less than this.\")\n    (\"num-iterations\",       po::value(&opt.num_iterations)->default_value(500),\n     \"Set the maximum number of iterations.\")\n    (\"tri-weight\", po::value(&opt.tri_weight)->default_value(0.1),\n     \"The weight to give to the constraint that optimized triangulated points stay \"\n      \"close to original triangulated points. A positive value will help ensure the \"\n      \"cameras do not move too far, but a large value may prevent convergence. It is \"\n      \"suggested to use here 0.1 to 0.5. This will be divided by ground sample distance \"\n      \"(GSD) to convert this constraint to pixel units, since the reprojection errors \"\n      \"are in pixels. See also --tri-robust-threshold. Does not apply to GCP or points \"\n      \"constrained by a DEM.\")\n    (\"tri-robust-threshold\",\n     po::value(&opt.tri_robust_threshold)->default_value(0.1),\n     \"The robust threshold to attenuate large differences between initial and \"\n     \"optimized triangulation points, after multiplying them by --tri-weight and \"\n     \"dividing by GSD. This is less than --robust-threshold, as the primary goal \"\n     \"is to reduce pixel reprojection errors, even if that results in big differences \"\n      \"in the triangulated points. It is suggested to not modify this value, \"\n      \"and adjust instead --tri-weight.\")\n    (\"heights-from-dem\",   po::value(&opt.heights_from_dem)->default_value(\"\"),\n     \"Assuming the cameras have already been bundle-adjusted and aligned to a \"\n     \"known DEM, constrain the triangulated points to be close to this DEM. See also \"\n     \"--heights-from-dem-uncertainty.\")\n    (\"heights-from-dem-uncertainty\",\n     po::value(&opt.heights_from_dem_uncertainty)->default_value(-1.0),\n     \"The DEM uncertainty (1 sigma, in meters). Must be positive. A smaller value \"\n     \"constrains more the triangulated points to the DEM specified via --heights-from-dem.\")\n    (\"heights-from-dem-robust-threshold\",\n     po::value(&opt.heights_from_dem_robust_threshold)->default_value(0.1),\n     \"The robust threshold to use to keep the triangulated points close to the DEM if \"\n      \"specified via --heights-from-dem. This is applied after the point differences \"\n      \"are divided by --heights-from-dem-uncertainty. It will attenuate large height \"\n      \"difference outliers. It is suggested to not modify this value, and adjust instead \"\n      \"--heights-from-dem-uncertainty.\")\n    (\"num-anchor-points\", po::value(&opt.num_anchor_points_per_image)->default_value(0),\n     \"How many anchor points to create per image. They will be uniformly distributed.\")\n    (\"num-anchor-points-per-tile\",\n     po::value(&opt.num_anchor_points_per_tile)->default_value(0),\n     \"How many anchor points to create per 1024 x 1024 image tile. They will be uniformly \"\n     \"distributed. Useful when images of vastly different sizes (such as frame and \"\n     \"linescan) are used together.\")\n    (\"anchor-weight\", po::value(&opt.anchor_weight)->default_value(0.0),\n     \"How much weight to give to each anchor point. Anchor points are \"\n     \"obtained by intersecting rays from initial cameras with the DEM given by \"\n     \"--heights-from-dem. A larger weight will make it harder for \"\n     \"the cameras to move, hence preventing unreasonable changes. \"\n     \"Set also --anchor-weight and --anchor-dem.\")\n    (\"anchor-dem\",  po::value(&opt.anchor_dem)->default_value(\"\"),\n     \"Use this DEM to create anchor points.\")\n    (\"num-anchor-points-extra-lines\",\n     po::value(&opt.num_anchor_points_extra_lines)->default_value(0),\n     \"Start placing anchor points this many lines before first image line \"\n     \"and after last image line. Applies only to linescan cameras.\")\n    (\"camera-position-uncertainty\",\n     po::value(&opt.camera_position_uncertainty_str)->default_value(\"\"),\n     \"A file having on each line the image name and the horizontal and vertical camera \"\n     \"position uncertainty (1 sigma, in meters). This strongly constrains the movement of \"\n     \"cameras, potentially at the expense of accuracy. To have the same uncertainties for \"\n     \"all cameras, pass instead of a file name two values separated by a comma (no \"\n     \"spaces).\")\n    (\"camera-position-uncertainty-power\",\n     po::value(&opt.camera_position_uncertainty_power)->default_value(2.0),\n     \"A higher value makes the cost function rise more steeply when \"\n     \"--camera-position-uncertainty is close to being violated. This is an advanced \"\n      \"option. The default should be good enough.\")\n    (\"camera-position-weight\", po::value(&opt.camera_position_weight)->default_value(0.0),\n     \"A soft constraint to keep the camera positions close to the original values. \"\n     \"It is meant to prevent a wholesale shift of the cameras. It can impede \"\n     \"the reduction in reprojection errors. It adjusts to the ground sample distance \"\n     \"and the number of interest points in the images. The computed \"\n     \"discrepancy is attenuated with --camera-position-robust-threshold.\")\n    (\"camera-position-robust-threshold\",\n     po::value(&opt.camera_position_robust_threshold)->default_value(0.1),\n     \"The robust threshold to attenuate large discrepancies between initial and \"\n     \"optimized camera positions with the option --camera-position-weight. \"\n     \"This is less than --robust-threshold, as the primary goal \"\n     \"is to reduce pixel reprojection errors, even if that results in big differences \"\n     \"in the camera positions. It is suggested to not modify this value, \"\n     \"and adjust instead --camera-position-weight.\")\n    (\"reference-terrain\", po::value(&opt.reference_terrain)->default_value(\"\"),\n     \"An externally provided trustworthy reference terrain to use as a constraint. It can \"\n     \"be either a DEM or a point cloud in CSV format. It must be well-aligned with the \"\n     \"input cameras.\")\n    (\"max-num-reference-points\",\n     po::value(&opt.max_num_reference_points)->default_value(50000),\n     \"Maximum number of (randomly picked) points from the --reference-terrain dataset.\")\n    (\"stereo-prefix-list\", po::value(&opt.stereo_prefix_list)->default_value(\"\"),\n     \"List of stereo prefixes (one per line) having disparities for the \"\n     \"--reference-terrain option.\")\n    (\"reference-terrain-uncertainty\",\n     po::value(&opt.reference_terrain_uncertainty)->default_value(1.0),\n     \"The uncertainty (1 sigma, in meters), for the dataset in --reference-terrain. \"\n     \"A smaller value will result in a stronger constraint. It is suggested to not \"\n     \"not make this too small as it may prevent convergence.\")\n    (\"reference-terrain-robust-threshold\",\n     po::value(&opt.reference_terrain_robust_threshold)->default_value(0.1),\n     \"The robust threshold, in pixels, for the option --reference-terrain. It is suggested \"\n     \"to not modify this value, and adjust instead --reference-terrain-uncertainty.\")\n    (\"csv-format\",\n     po::value(&opt.csv_format_str)->default_value(\"\"), asp::csv_opt_caption().c_str())\n    (\"csv-srs\",\n     po::value(&opt.csv_srs)->default_value(\"\"),\n     \"The PROJ or WKT string for interpreting the entries in input CSV files.\")\n    (\"rotation-weight\", po::value(&opt.rotation_weight)->default_value(0.0),\n     \"A higher weight will penalize more deviations from the original camera \"\n     \"orientations. This is not recommended. Use instead ground constraints and \"\n     \"--camera-position-uncertainty.\")\n    (\"mapproj-dem\", po::value(&opt.mapproj_dem)->default_value(\"\"),\n     \"If specified, mapproject every pair of matched interest points onto this DEM \"\n     \"and compute their distance, then percentiles of such distances for each image \"\n     \"vs the rest and each image pair. This is done after bundle adjustment \"\n     \"and outlier removal. Measured in meters.\")\n    (\"ip-side-filter-percent\",  po::value(&opt.ip_edge_buffer_percent)->default_value(-1.0),\n     \"Remove matched IPs this percentage from the image left/right sides.\")\n    (\"forced-triangulation-distance\",\n     po::value(&opt.forced_triangulation_distance)->default_value(-1),\n     \"When triangulation fails, for example, when input cameras are inaccurate, \"\n     \"artificially create a triangulation point this far ahead of the camera, in units \"\n     \"of meter.\")\n    (\"update-isis-cubes-with-csm-state\",\n     po::bool_switch(&opt.update_isis_cubes_with_csm_state)->default_value(false)->implicit_value(true),\n     \"Save the model state of optimized CSM cameras as part of the .cub files. Any prior \"\n     \"version and any SPICE data will be deleted. Mapprojected images obtained with prior \"\n     \"version of the cameras must no longer be used in stereo.\")\n    (\"num-passes\",\n     po::value(&opt.num_passes)->default_value(2),\n     \"How many passes of jitter solving to do, with given number of iterations in each \"\n     \"pass.\")\n    (\"rig-config\", po::value(&opt.rig_config)->default_value(\"\"),\n     \"Assume that the cameras are acquired with a set of rigs with this configuration \"\n     \"file. The intrinsics will be read, but not the transforms between sensors, as those \"\n     \"will be auto-computed (unless --use-initial-rig-transforms is set). The optimized \"\n     \"rig, including the sensor transforms, will be saved.\")\n    (\"fix-rig-translations\",\n     po::bool_switch(&opt.fix_rig_translations)->default_value(false)->implicit_value(true),\n     \"Fix the translation component of the transforms between the sensors on a \"\n     \"rig.\")\n     (\"fix-rig-rotations\",\n      po::bool_switch(&opt.fix_rig_rotations)->default_value(false)->implicit_value(true),\n     \"Fix the rotation component of the transforms between the sensors on a \"\n     \"rig.\")\n    (\"use-initial-rig-transforms\",\n     po::bool_switch(&opt.use_initial_rig_transforms)->default_value(false)->implicit_value(true),\n     \"Use the transforms between the sensors (ref_to_sensor_transform) of the rig \"\n     \"given by --rig-config, instead of computing them from the poses of individual \"\n     \"cameras.\")\n    (\"quat-norm-weight\", po::value(&opt.quat_norm_weight)->default_value(1.0),\n     \"How much weight to give to the constraint that the norm of each quaternion must be 1.\")\n    (\"weight-image\", po::value(&opt.weight_image)->default_value(\"\"),\n     \"Given a georeferenced image with float values, for each initial triangulated \"\n     \"point find its location in the image and closest pixel value. Multiply the \"\n     \"reprojection errors in the cameras for this point by this weight value. The solver \"\n     \"will focus more on optimizing points with a higher weight. Points that fall \"\n     \"outside the image and weights that are non-positive, NaN, or equal to nodata \"\n     \"will be ignored.\")\n     (\"anchor-weight-image\", po::value(&opt.anchor_weight_image)->default_value(\"\"),\n     \"Weight image for anchor points. Limits where anchor points are placed and their \"\n     \"weight. These weights are additionally multiplied by --anchor-weight. See also \"\n     \"--weight-image.\")\n    (\"roll-weight\", po::value(&opt.roll_weight)->default_value(0.0),\n     \"A weight to penalize the deviation of camera roll orientation as measured from the \"\n     \"along-track direction. Pass in a large value, such as 1e+5. This is best used only \"\n     \"with linescan cameras created with sat_sim. With non-synthetic cameras, add the \"\n     \"--initial-camera-constraint option. Use with --camera-position-weight 1e+6 or so, to \"\n     \"tightly constrain the camera positions.\")\n    (\"yaw-weight\", po::value(&opt.yaw_weight)->default_value(0.0),\n     \"A weight to penalize the deviation of camera yaw orientation as measured from the \"\n     \"along-track direction. Pass in a large value, such as 1e+5. This is best used only \"\n     \"with linescan cameras created with sat_sim. With non-synthetic cameras, add the \"\n     \"--initial-camera-constraint option. Use with --camera-position-weight 1e+6 or so, to \"\n     \"tightly constrain the camera positions.\")\n     (\"smoothness-weight\", po::value(&opt.smoothness_weight)->default_value(0.0),\n      \"A weight to penalize high-frequency changes in the sequence of orientations \"\n      \"in the linescan cameras being optimized. This is internally adjusted based \"\n      \"on the initial curvature of the sequence of orientations. A value of 0.01 \"\n      \"to 0.1 is recommended. This may impede convergence if high. Use with \"\n      \"--camera-position-weight 1e+6 or so, to tightly constrain the camera positions.\")\n    (\"initial-camera-constraint\",\n     po::bool_switch(&opt.initial_camera_constraint)->default_value(false),\n     \"When constraining roll and yaw, measure these not in the satellite along-track/ \"\n     \"across-track/down coordinate system, but relative to the initial camera poses. This \"\n     \"is experimental. Internally, the roll weight will then be applied to the camera \"\n     \"pitch angle (rotation around the camera y axis), because the camera coordinate \"\n     \"system is rotated by 90 degrees in the sensor plane relative to the satellite \"\n     \"coordinate system. The goal is the same, to penalize deviations that are not \"\n     \"aligned with satellite pitch.\")\n    (\"fix-gcp-xyz\",\n     po::bool_switch(&opt.fix_gcp_xyz)->default_value(false)->implicit_value(true),\n     \"If the GCP are highly accurate, use this option to not float them during the optimization.\")\n    (\"use-lon-lat-height-gcp-error\",\n     po::bool_switch(&opt.use_llh_error)->default_value(false)->implicit_value(true),\n     \"Constrain the triangulated points tied to GCP in the longitude, latitude, and height \"\n     \"space, instead of ECEF. The standard deviations in the GCP file are applied \"\n     \"accordingly.\")\n    (\"accept-provided-mapproj-dem\",\n     po::bool_switch(&asp::stereo_settings().accept_provided_mapproj_dem)->default_value(false)->implicit_value(true),\n     \"Accept the DEM provided on the command line as the one mapprojection was done with, \"\n     \"even if it disagrees with the DEM recorded in the geoheaders of input images.\")\n    // For bathymetry correction\n    (\"bathy-mask-list\",\n     po::value(&asp::stereo_settings().bathy_mask_list)->default_value(\"\"),\n     \"List of masks to use for bathymetry. Must be one per input image and 1-to-1 with \"\n     \"the images. Pixels classified as water must have non-positive value or be no-data \"\n     \"in the mask, while land pixels must have positive value. This is preliminary work. \"\n     \"This program does not yet model bathymetry.\")\n    (\"bathy-plane\",\n     po::value(&asp::stereo_settings().bathy_plane),\n      \"Path to a file containing a plane approximating the water surface, for \"\n      \"bathymetry correction with underwater terrain. This corrects camera rays passing \"\n      \"through water using Snell's law. If multiple images are used and they have \"\n      \"different water surfaces use --bathy-plane-list. Use together with \"\n      \"--refraction-index. See also --bathy-mask-list.\")\n    (\"bathy-plane-list\", \n     po::value(&asp::stereo_settings().bathy_plane_list)->default_value(\"\"),\n     \"Path to a file containing a list of bathy plane files for bathymetry correction, \"\n     \"if more than one. Set one plane file per line. Must specify one plane per input \"\n     \"image, in the same order. Use with --bathy-mask-list and --refraction-index.\")\n    (\"refraction-index\",\n     po::value(&asp::stereo_settings().refraction_index)->default_value(0),\n      \"The index of refraction of water to be used in bathymetry correction. \"\n      \"Must be specified and bigger than 1. This index can be computed with \"\n      \"the refr_index program.\")\n    (\"save-cnet-as-gcp\",\n      po::bool_switch(&opt.save_cnet_as_gcp)->default_value(false)->implicit_value(true),\n     \"Save the optimized control network, after outlier filtering, in the \"\n     \"format used by ground control points (GCP), including any input GCP. \"\n     \"The xyz sigma is 1 meter for regular non-GCP triangulated points and the \"\n     \"value of --heights-from-dem-uncertainty for DEM-constrained points.\")\n    ;\n    general_options.add(vw::GdalWriteOptionsDescription(opt));\n  po::options_description positional(\"\");\n  positional.add_options()\n    (\"input-files\", po::value(&opt.image_files));\n\n  po::positional_options_description positional_desc;\n  positional_desc.add(\"input-files\", -1);\n\n  std::string usage(\"<images> <cameras> -o <output prefix> [options]\");\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line(argc, argv, opt, general_options, general_options,\n                            positional, positional_desc, usage,\n                            allow_unregistered, unregistered);\n\n  // Stereo settings must be set after the command line arguments are parsed.\n\n  // TODO(oalexan1): This old option may need to be wiped given the newer\n  // recent outlier filtering.\n  asp::stereo_settings().ip_edge_buffer_percent = opt.ip_edge_buffer_percent;\n\n  // Do this check first, as the output prefix is needed to log to file. This\n  // will be triggered when called with no arguments, so print the general\n  // options, which functions as the help message.\n  if (opt.out_prefix == \"\")\n    vw_throw(ArgumentErr() << \"Missing the output prefix.\\n\" << usage\n             << general_options);\n\n  // Create the output directory\n  vw::create_out_dir(opt.out_prefix);\n\n  // Turn on logging to file (after the output directory is created)\n  asp::log_to_file(argc, argv, \"\", opt.out_prefix);\n\n  // For Glog\n  google::InitGoogleLogging(argv[0]);\n\n  // This must be done early\n  boost::to_lower(opt.stereo_session);\n\n  // Separate out GCP files\n  bool rm_from_input_list = true;\n  opt.gcp_files = vw::get_files_with_ext(opt.image_files, \".gcp\", rm_from_input_list);\n\n  if (!opt.image_list.empty()) {\n    // Read the images and cameras and put them in 'images_or_cams' to be parsed later\n    if (!opt.image_files.empty())\n      vw_throw(ArgumentErr() << \"The option --image-list was specified, but also \"\n               << \"images or cameras on the command line.\\n\");\n    asp::IntrinsicOptions intr_opts;\n    read_image_cam_lists(opt.image_list, opt.camera_list,\n      opt.image_files, opt.camera_files, intr_opts); // outputs\n    if (intr_opts.num_sensors != 0 || !intr_opts.cam2sensor.empty())\n      vw::vw_throw(vw::ArgumentErr() << \"Cannot handle intrinsics with jitter_solve.\\n\");\n  } else {\n    std::vector<std::string> images_or_cams = opt.image_files;\n    bool ensure_equal_sizes = true;\n    asp::separate_images_from_cameras(images_or_cams,\n                                      opt.image_files, opt.camera_files, // outputs\n                                      ensure_equal_sizes);\n\n    // This is needed when several frame camera images are acquired in quick succession\n    asp::readGroupStructure(images_or_cams, opt.cam2group);\n  }\n\n  // Throw if there are duplicate camera file names.\n  asp::check_for_duplicates(opt.image_files, opt.camera_files, opt.out_prefix);\n\n  // Sanity check\n  const int num_images = opt.image_files.size();\n  if (opt.image_files.size() != opt.camera_files.size())\n    vw_throw(ArgumentErr() << \"Must have as many cameras as  have images.\\n\");\n\n  if (opt.image_files.empty())\n    vw_throw(ArgumentErr() << \"Missing input image files.\\n\");\n\n  // Must have this early check to print a clear message about unsupported\n  // camera before any error thrown by StereoSessionFactory.\n  std::string err_str;\n  try {\n    std::string input_dem = \"\"; // No DEM\n    bool allow_map_promote = false, quiet = true;\n    asp::SessionPtr session;\n      session = asp::StereoSessionFactory::create\n                      (opt.stereo_session, // may change\n                      opt, opt.image_files[0], opt.image_files[0],\n                      opt.camera_files[0], opt.camera_files[0],\n                      opt.out_prefix, input_dem,\n                      allow_map_promote, quiet);\n  } catch (const std::exception& e) {\n    // Catch and record any error\n    err_str = e.what();\n  }\n  // First check for unexpected sessions.\n  if (!asp::isLinescanCsmSession(opt.stereo_session))\n    vw_throw(ArgumentErr() << \"Session \" << opt.stereo_session\n             << \" is not supported in jitter_solve. Check your camera files and/or \"\n             << \"specify the -t (--session-type) option.\\n\");\n  // Throw any other errors\n  if (err_str != \"\")\n    vw_throw(ArgumentErr() << err_str << \"\\n\");\n\n  if (opt.overlap_limit < 0)\n    vw_throw(ArgumentErr() << \"Must allow search for matches between \"\n             << \"at least each image and its subsequent one.\\n\");\n\n  // By default, try to match all of the images\n  if (opt.overlap_limit == 0)\n    opt.overlap_limit = opt.image_files.size();\n\n  int num_pref = int(!opt.match_files_prefix.empty())\n      + int(!opt.clean_match_files_prefix.empty())\n      + int(!opt.isis_cnet.empty()) + int(!opt.nvm.empty());\n  if (num_pref > 1)\n    vw_throw(ArgumentErr() << \"Must specify no more than one of: --match-files-prefix, \"\n             << \"--clean-match-files-prefix, --isis-cnet, --nvm.\\n\");\n if (num_pref == 0 && opt.gcp_files.empty())\n    vw_throw(ArgumentErr() << \"Neither interest point matches nor GCP were passed in.\\n\");\n\n  if (opt.max_init_reproj_error <= 0.0)\n    vw_throw(ArgumentErr() << \"Must have a positive --max-initial-reprojection-error.\\n\");\n\n  if (opt.tri_weight < 0.0)\n    vw_throw(ArgumentErr() << \"The value of --tri-weight must be non-negative.\\n\");\n\n  if (opt.robust_threshold <= 0.0)\n    vw_throw(ArgumentErr() << \"The value of --robust-threshold must be positive.\\n\");\n\n  if (opt.tri_robust_threshold <= 0.0)\n    vw_throw(ArgumentErr() << \"The value of --tri-robust-threshold must be positive.\\n\");\n\n  // This is a bug fix. The user by mistake passed in an empty height-from-dem string.\n  if (!vm[\"heights-from-dem\"].defaulted() && opt.heights_from_dem.empty())\n    vw_throw(ArgumentErr()\n             << \"The value of --heights-from-dem is empty. \"\n             << \"Then it must not be set at all.\\n\");\n\n   // Same for opt.anchor_dem\n   if (!vm[\"anchor-dem\"].defaulted() && opt.anchor_dem.empty())\n    vw_throw(ArgumentErr()\n             << \"The value of --anchor-dem is empty. Then it must not be set at all.\\n\");\n\n  if (!vm[\"heights-from-dem-uncertainty\"].defaulted() &&\n      vm[\"heights-from-dem\"].defaulted())\n    vw_throw(ArgumentErr()\n             << \"The value of --heights-from-dem-uncertainty is set, \"\n             << \"but --heights-from-dem is not set.\\n\");\n\n  if (!vm[\"heights-from-dem\"].defaulted() && opt.heights_from_dem_uncertainty <= 0.0)\n    vw_throw(ArgumentErr()\n             << \"The value of --heights-from-dem-uncertainty must be positive.\\n\");\n\n  if (opt.heights_from_dem_robust_threshold <= 0.0)\n    vw_throw(ArgumentErr()\n             << \"The value of --heights-from-robust-threshold must be positive.\\n\");\n\n  // Options for reference terrain\n  if (!vm[\"reference-terrain\"].defaulted() && opt.reference_terrain.empty())\n    vw_throw(ArgumentErr()\n             << \"The value of --reference-terrain is set and empty. \"\n             << \"Then it must not be set at all.\\n\");\n  if (!vm[\"reference-terrain-uncertainty\"].defaulted() &&\n      vm[\"reference-terrain\"].defaulted())\n    vw_throw(ArgumentErr()\n             << \"The value of --reference-terrain-uncertainty is set, \"\n             << \"but --reference-terrain is not set.\\n\");\n  if (opt.reference_terrain_uncertainty <= 0.0)\n    vw_throw(ArgumentErr() << \"The value of --reference-terrain-uncertainty must be \"\n              << \"positive.\\n\");\n  if (opt.reference_terrain_robust_threshold <= 0.0)\n    vw_throw(ArgumentErr() << \"The value of --heights-from-robust-threshold must be \"\n              << \"positive.\\n\");\n  if (!opt.reference_terrain.empty()) {\n\n    if (opt.stereo_prefix_list.empty())\n      vw_throw(ArgumentErr()\n               << \"Must set --stereo-prefix-list when --reference-terrain is set.\\n\");\n    if (!opt.rig_config.empty())\n      vw_throw(ArgumentErr()\n               << \"Cannot use --rig-config with --reference-terrain.\\n\");\n\n    // Must have --csv-format unless the reference terrain is a DEM\n    if (opt.csv_format_str.empty()) {\n      vw::cartography::GeoReference georef;\n      bool has_georef = vw::has_image_extension(opt.reference_terrain) &&\n                        vw::cartography::read_georeference(georef, opt.reference_terrain);\n      if (!has_georef)\n        vw_throw(ArgumentErr()\n                 << \"Must set --csv-format when --reference-terrain is set \"\n                 << \"the terrain is not a DEM.\\n\");\n    }\n  }\n\n  bool have_camera_position_uncertainty = !opt.camera_position_uncertainty_str.empty();\n  bool have_datum = true; // Jitter solving always expects a datum\n  if (have_camera_position_uncertainty)\n   asp::handleCameraPositionUncertainty(opt, have_datum);\n\n  if (opt.rotation_weight < 0)\n    vw_throw(ArgumentErr() << \"The rotation weight must be non-negative.\\n\");\n\n  if (opt.camera_position_weight < 0)\n    vw_throw(ArgumentErr() << \"The value of --camera-position-weight must be n\"\n                           << \"non-negative.\\n\");\n\n  if (opt.camera_position_robust_threshold <= 0.0)\n    vw_throw(ArgumentErr() << \"The value of --camera-position-robust-threshold \"\n                            << \"must be positive.\\n\");\n\n  if (opt.quat_norm_weight <= 0)\n    vw_throw(ArgumentErr() << \"The quaternion norm weight must be positive.\\n\");\n\n  if (opt.roll_weight < 0.0)\n    vw_throw(ArgumentErr() << \"The roll weight must be non-negative.\\n\");\n\n  if (opt.yaw_weight < 0.0)\n    vw_throw(ArgumentErr() << \"The yaw weight must be non-negative.\\n\");\n\n  // The smoothness weight must be non-negative\n  if (opt.smoothness_weight < 0.0)\n    vw_throw(ArgumentErr() << \"The smoothness weight must be non-negative.\\n\");\n\n  // Handle the roll/yaw constraint DEM\n  if ((opt.roll_weight > 0 || opt.yaw_weight > 0) &&\n     opt.heights_from_dem == \"\" && opt.anchor_dem == \"\")\n      vw::vw_throw(ArgumentErr() << \"Cannot use the roll/yaw constraint without a DEM. \"\n        << \"Set either --heights-from-dem or --anchor-dem.\\n\");\n\n  if (opt.num_anchor_points_per_image < 0)\n    vw_throw(ArgumentErr() << \"The number of anchor points must be non-negative.\\n\");\n  if (opt.num_anchor_points_per_tile < 0)\n    vw_throw(ArgumentErr() << \"The number of anchor points per tile must be non-negative.\\n\");\n\n  // Cannot have anchor points both per image and per tile\n  if (opt.num_anchor_points_per_image > 0 && opt.num_anchor_points_per_tile > 0)\n    vw_throw(ArgumentErr() << \"Cannot have anchor points both per image and per tile.\\n\");\n\n  if (opt.anchor_weight < 0)\n    vw_throw(ArgumentErr() << \"The anchor weight must be non-negative.\\n\");\n\n  if ((opt.anchor_weight > 0  || opt.num_anchor_points_per_image > 0 ||\n       opt.num_anchor_points_per_tile > 0 || opt.num_anchor_points_extra_lines > 0) &&\n      opt.anchor_dem.empty())\n    vw::vw_throw(vw::ArgumentErr() << \"Anchor points parameters have been specified. \"\n                 << \"Must set  --anchor-dem.\\n\");\n\n  // Must have at least one pass\n  if (opt.num_passes < 1)\n    vw_throw(ArgumentErr() << \"Must have at least one pass.\\n\");\n\n  bool have_rig = !opt.rig_config.empty();\n  if (have_rig) {\n    bool have_rig_transforms = opt.use_initial_rig_transforms;\n    rig::readRigConfig(opt.rig_config, have_rig_transforms, rig);\n\n    for (size_t i = 0; i < rig.cam_params.size(); i++) {\n      auto const& params = rig.cam_params[i];\n      if (params.GetDistortion().size() != 0)\n        vw::vw_throw(vw::ArgumentErr() << \"Distortion is not supported in jitter_solve.\\n\");\n    }\n\n    if (opt.roll_weight > 0 || opt.yaw_weight > 0)\n      vw::vw_throw(vw::ArgumentErr() << \"Cannot use the roll/yaw constraint with a rig.\\n\");\n  }\n\n  if (!have_rig &&\n      (opt.use_initial_rig_transforms || opt.fix_rig_translations || opt.fix_rig_rotations))\n    vw::vw_throw(vw::ArgumentErr() << \"Cannot use --use-initial-rig-transforms, \"\n                 << \"--fix-rig-translations, or --fix-rig-rotations without a rig.\\n\");\n\n  // If have both anchor DEM and height-from-dem, and these are difrerent, print\n  // a warming that the user should check for their agreement.\n  if (!opt.anchor_dem.empty() && !opt.heights_from_dem.empty() &&\n      opt.anchor_dem != opt.heights_from_dem)\n    vw::vw_out(vw::WarningMessage)\n      << \"The values of --anchor-dem and --heights-from-dem are different. \"\n      << \"Check (with geodiff) that these are in agreement.\\n\";\n\n  asp::bathyChecks(opt.stereo_session, asp::stereo_settings(), opt.image_files.size());\n\n  return;\n}\n\n// Calculate a set of anchor points uniformly distributed over the image\n// Will use opt.num_anchor_points_extra_lines. We append to weight_vec and\n// other quantities that were used for reprojection errors for match points.\nvoid calcAnchorPoints(Options                         const & opt,\n                      ImageViewRef<PixelMask<double>>         interp_anchor_dem,\n                      vw::cartography::GeoReference   const & anchor_georef,\n                      std::vector<asp::CsmModel*>     const & csm_models,\n                      // Append to these, they already have entries\n                      std::vector<std::vector<Vector2>>     & pixel_vec,\n                      std::vector<std::vector<double>>      & weight_vec,\n                      std::vector<std::vector<int>>         & isAnchor_vec,\n                      std::vector<std::vector<int>>         & pix2xyz_index,\n                      std::vector<double>                   & orig_tri_points_vec,\n                      std::vector<double>                   & tri_points_vec) {\n\n  vw::vw_out() << \"Calculating anchor points.\\n\";\n  vw::Stopwatch sw;\n  sw.start();\n\n  if (opt.num_anchor_points_per_image <= 0 && opt.num_anchor_points_per_tile <= 0)\n    vw::vw_throw(vw::ArgumentErr() << \"Expecting a positive number of anchor points.\\n\");\n\n  bool warning_printed = false;\n\n  // If to use an anchor weight image\n  bool have_anchor_weight_image = (!opt.anchor_weight_image.empty());\n  vw::ImageViewRef<vw::PixelMask<float>> anchor_weight_image;\n  float anchor_weight_image_nodata = -std::numeric_limits<float>::max();\n  vw::cartography::GeoReference anchor_weight_image_georef;\n  if (have_anchor_weight_image)\n    vw::cartography::readGeorefImage(opt.anchor_weight_image,\n      anchor_weight_image_nodata, anchor_weight_image_georef, anchor_weight_image);\n\n  int num_cams = opt.camera_models.size();\n  for (int icam = 0; icam < num_cams; icam++) {\n\n    vw::Vector2 dims = vw::file_image_size(opt.image_files[icam]);\n    int numLines   = dims[1];\n    int numSamples = dims[0];\n    int extra = opt.num_anchor_points_extra_lines;\n\n    UsgsAstroLsSensorModel * ls_model\n      = dynamic_cast<UsgsAstroLsSensorModel*>((csm_models[icam]->m_gm_model).get());\n    if (ls_model == NULL)\n       extra = 0; // extra lines are only for linescan\n\n    // Find how much image area will be taken by each anchor point  \n    // Convert to double early on to avoid integer overflow\n    double area = double(numSamples) * double(numLines + 2 * extra);\n    double area_per_point = 0.0;\n    if (opt.num_anchor_points_per_image > 0)\n      area_per_point = area / double(opt.num_anchor_points_per_image);\n    else\n      area_per_point = 1024.0 * 1024.0 / double(opt.num_anchor_points_per_tile);\n\n    double bin_len = sqrt(area_per_point);\n    bin_len = std::max(bin_len, 1.0);\n    int lenx = ceil(double(numSamples) / bin_len); lenx = std::max(1, lenx);\n    int leny = ceil(double(numLines + 2 * extra) / bin_len); leny = std::max(1, leny);\n\n    vw_out() << \"Image file: \" << opt.image_files[icam] << \"\\n\";\n    vw::TerminalProgressCallback tpc(\"asp\", \"\\t--> \");\n    double inc_amount = 1.0/lenx;\n    tpc.report_progress(0);\n\n    int numAnchorPoints = 0;\n    for (int binx = 0; binx <= lenx; binx++) {\n\n      tpc.report_incremental_progress(inc_amount);\n      double posx = binx * bin_len;\n\n      for (int biny = 0; biny <= leny; biny++) {\n        double posy = biny * bin_len - extra;\n\n        if (posx > numSamples - 1 || posy < -extra || posy > numLines - 1 + extra)\n          continue;\n\n        Vector2 pix(posx, posy);\n        Vector3 xyz_guess(0, 0, 0);\n\n        bool treat_nodata_as_zero = false;\n        bool has_intersection = false;\n        double height_error_tol = 0.001; // 1 mm should be enough\n        double max_abs_tol      = 1e-14; // abs cost fun change b/w iterations\n        double max_rel_tol      = 1e-14;\n        int num_max_iter        = 50;   // Using many iterations can be very slow\n\n        Vector3 dem_xyz = vw::cartography::camera_pixel_to_dem_xyz\n          (opt.camera_models[icam]->camera_center(pix),\n           opt.camera_models[icam]->pixel_to_vector(pix),\n           vw::pixel_cast<vw::PixelMask<float>>(interp_anchor_dem), anchor_georef,\n           treat_nodata_as_zero, has_intersection,\n           height_error_tol, max_abs_tol, max_rel_tol, num_max_iter, xyz_guess);\n\n        if (!has_intersection || dem_xyz == Vector3())\n          continue;\n\n        Vector2 pix_out;\n        try {\n          pix_out = opt.camera_models[icam]->point_to_pixel(dem_xyz);\n        } catch (...) {\n          continue;\n        }\n\n        if (norm_2(pix - pix_out) > 10 * height_error_tol)\n          continue; // this is likely a bad point\n\n        // If we have a weight image, use it to multiply the weight\n        double anchor_weight_from_image = 1.0;\n        if (have_anchor_weight_image) {\n          vw::PixelMask<float> img_wt\n            = vw::cartography::closestPixelVal(anchor_weight_image,\n                                               anchor_weight_image_georef,\n                                               dem_xyz);\n\n          // Skip bad weights\n          if (!is_valid(img_wt) || std::isnan(img_wt.child()) || img_wt.child() <= 0.0)\n            continue;\n\n          anchor_weight_from_image = img_wt.child();\n        }\n\n        if (ls_model != NULL) {\n          // Anchor points must not be outside the range of tabulated positions and orientations\n          csm::ImageCoord imagePt;\n          asp::toCsmPixel(pix, imagePt);\n          double time    = ls_model->getImageTime(imagePt);\n          int numPos     = ls_model->m_positions.size() / NUM_XYZ_PARAMS;\n          double posT0   = ls_model->m_t0Ephem;\n          double posDt   = ls_model->m_dtEphem;\n          int pos_index  = static_cast<int>((time - posT0) / posDt);\n          int numQuat    = ls_model->m_quaternions.size() / NUM_QUAT_PARAMS;\n          double quatT0  = ls_model->m_t0Quat;\n          double quatDt  = ls_model->m_dtQuat;\n          int quat_index = static_cast<int>((time - quatT0) / quatDt);\n          if (pos_index < 0  || pos_index >= numPos ||\n              quat_index < 0 || quat_index >= numQuat) {\n            if (!warning_printed) {\n              vw::vw_out(vw::WarningMessage) << \"Not placing anchor points outside \"\n                << \"the range of tabulated positions and orientations.\\n\";\n              warning_printed = true;\n            }\n            continue;\n          }\n        }\n\n        pixel_vec[icam].push_back(pix);\n        weight_vec[icam].push_back(opt.anchor_weight * anchor_weight_from_image);\n        isAnchor_vec[icam].push_back(1);\n\n        // The current number of points in tri_points_vec is the index of the next point\n        pix2xyz_index[icam].push_back(tri_points_vec.size() / 3);\n\n        // Append every coordinate of dem_xyz to tri_points_vec\n        for (int it = 0; it < 3; it++) {\n          orig_tri_points_vec.push_back(dem_xyz[it]);\n          tri_points_vec.push_back(dem_xyz[it]);\n        }\n\n        numAnchorPoints++;\n      }\n    }\n\n    tpc.report_finished();\n    vw_out() << \"Lines and samples: \" << numLines << ' ' << numSamples << std::endl;\n    vw_out() << \"Num anchor points per image: \" << numAnchorPoints     << std::endl;\n  }\n\n  sw.stop();\n  vw::vw_out() << \"Elapsed time in calculating anchor points: \" << sw.elapsed_seconds()\n               << \" seconds.\\n\";\n}\n\n// Apply the input adjustments to the CSM cameras. Resample linescan models.\n// Get pointers to the underlying CSM cameras, as need to manipulate\n// those directly. This modifies camera_models in place.\nvoid initResampleCsmCams(Options                     const& opt,\n                         std::vector<vw::CamPtr>     const& camera_models,\n                         std::vector<asp::CsmModel*>      & csm_models) {\n\n  // Wipe the output\n  csm_models.clear();\n\n  for (size_t icam = 0; icam < camera_models.size(); icam++) {\n    asp::CsmModel * csm_cam = asp::csm_model(camera_models[icam]);\n\n    // Sanity check\n    if (csm_cam == NULL)\n      vw::vw_throw(vw::ArgumentErr() << \"Expecting CSM cameras.\\n\");\n\n    if (!opt.input_prefix.empty())\n      asp::applyAdjustmentToCsmCamera(opt.image_files[icam],\n                                      opt.camera_files[icam],\n                                      opt.input_prefix,\n                                      camera_models[icam],\n                                      csm_cam);\n\n    // Get the underlying linescan model or frame model\n    UsgsAstroLsSensorModel * ls_model\n      = dynamic_cast<UsgsAstroLsSensorModel*>((csm_cam->m_gm_model).get());\n    UsgsAstroFrameSensorModel * frame_model\n      = dynamic_cast<UsgsAstroFrameSensorModel*>((csm_cam->m_gm_model).get());\n\n    if (ls_model == NULL && frame_model == NULL)\n      vw_throw(ArgumentErr()\n               << \"Expecting the cameras to be of CSM linescan or frame type.\\n\");\n\n    // Normalize quaternions. Later, the quaternions being optimized will\n    // be kept close to being normalized.  This makes it easy to ensure\n    // that quaternion interpolation gives good results, especially that\n    // some quaternions may get optimized and some not.\n    if (ls_model != NULL) {\n      asp::normalizeQuaternions(ls_model);\n      // The provided tabulated positions, velocities and quaternions may be too few,\n      // so resample them with --num-lines-per-position and --num-lines-per-orientation,\n      // if those are set.\n      resampleModel(opt.num_lines_per_position, opt.num_lines_per_orientation, ls_model);\n    } else if (frame_model != NULL) {\n      normalizeQuaternions(frame_model);\n    } else {\n      vw::vw_throw(vw::ArgumentErr()\n        << \"Expecting the cameras to be of CSM linescan or frame type.\\n\");\n    }\n\n    csm_models.push_back(csm_cam);\n  }\n}\n\n// Create structures for pixels, xyz, and weights, to be used in optimization.\n// Later there will be another pass to add weights for the anchor points.\n// Here more points may be flagged as outliers.\nvoid createProblemStructure(Options                      const& opt,\n                            asp::CRN                    const& crn,\n                            vw::ba::ControlNetwork       const& cnet,\n                            std::vector<double>          const& tri_points_vec,\n                            // Outputs\n                            std::set<int>                     & outliers,\n                            std::vector<std::vector<Vector2>> & pixel_vec,\n                            std::vector<std::vector<double>>  & weight_vec,\n                            std::vector<std::vector<int>>     & isAnchor_vec,\n                            std::vector<std::vector<int>>     & pix2xyz_index) {\n\n  // If to use a weight image\n  bool have_weight_image = (!opt.weight_image.empty());\n  vw::ImageViewRef<vw::PixelMask<float>> weight_image;\n  float weight_image_nodata = -std::numeric_limits<float>::max();\n  vw::cartography::GeoReference weight_image_georef;\n  if (have_weight_image)\n    vw::cartography::readGeorefImage(opt.weight_image,\n      weight_image_nodata, weight_image_georef, weight_image);\n\n  int num_cameras = opt.camera_models.size();\n\n  // Wipe\n  pixel_vec.resize(0);\n  weight_vec.resize(0);\n  isAnchor_vec.resize(0);\n  pix2xyz_index.resize(0);\n  // Resize\n  pixel_vec.resize(num_cameras);\n  weight_vec.resize(num_cameras);\n  isAnchor_vec.resize(num_cameras);\n  pix2xyz_index.resize(num_cameras);\n\n  for (int icam = 0; icam < (int)crn.size(); icam++) {\n    for (auto fiter = crn[icam].begin(); fiter != crn[icam].end(); fiter++) {\n\n      // The index of the 3D point\n      int ipt = (**fiter).m_point_id;\n\n      if (outliers.find(ipt) != outliers.end())\n        continue; // Skip outliers\n\n      // The observed value for the projection of point with index ipt into\n      // the camera with index icam.\n      Vector2 observation = (**fiter).m_location;\n\n      // Unlike in bundle adjustment, the weight of a pixel is 1.0, rather\n      // than 1.0 / pixel_sigma.\n      double weight = 1.0;\n\n      // If we have a weight image, use it to set the weight\n      if (have_weight_image) {\n        const double * tri_point = &tri_points_vec[0] + ipt * NUM_XYZ_PARAMS;\n        Vector3 ecef(tri_point[0], tri_point[1], tri_point[2]);\n        vw::PixelMask<float> img_wt\n          = vw::cartography::closestPixelVal(weight_image, weight_image_georef, ecef);\n\n        // Flag bad weights as outliers\n        if (!is_valid(img_wt) || std::isnan(img_wt.child()) || img_wt.child() <= 0.0) {\n          outliers.insert(ipt);\n          continue;\n        }\n\n        weight = img_wt.child();\n      }\n\n      pixel_vec[icam].push_back(observation);\n      weight_vec[icam].push_back(weight);\n      isAnchor_vec[icam].push_back(0);\n      pix2xyz_index[icam].push_back(ipt);\n    }\n  }\n\n  return;\n}\n\n// Run one pass of solving for jitter. At each pass the cameras we have so far\n// are used to triangulate the points and the DEM constraint is refreshed if\n// applicable, and then the cameras are optimized. More than one pass\n// was shown to improve the accuracy.\nvoid jitterSolvePass(int                                 pass,\n                     bool                                have_rig,\n                     Options                      const& opt,\n                     asp::CRN                     const& crn,\n                     std::vector<RigCamInfo>      const& rig_cam_info,\n                     TimestampMap                 const& timestamp_map,\n                     // Outputs\n                     ba::ControlNetwork                & cnet,\n                     std::set<int>                     & outliers,\n                     std::vector<asp::CsmModel*>       & csm_models,\n                     std::vector<std::vector<vw::Vector3>> & orig_cam_positions,\n                     std::vector<double>               & orig_tri_points_vec,\n                     std::vector<std::vector<double>>  & orig_curvatures,\n                     rig::RigSet                       & rig,\n                     std::vector<double>               & ref_to_curr_sensor_vec) {\n\n  vw::vw_out() << \"\\nJitter solving pass: \" << pass << \"\\n\";\n\n  // If some of the input cameras are frame, need to store position and\n  // quaternion variables for them outside the camera model.\n  // TODO(oalexan1): Revisit this decision now that frame camera\n  // params are no longer private.\n  std::vector<double> frame_params;\n  initFrameCameraParams(csm_models, frame_params);\n\n  // Update tri points from DEM and create anchor xyz from DEM.\n  bool have_dem = (!opt.heights_from_dem.empty());\n  std::vector<Vector3> dem_xyz_vec;\n  vw::cartography::GeoReference dem_georef, anchor_georef;\n  ImageViewRef<PixelMask<double>>  masked_dem, interp_anchor_dem;\n  bool warn_only = false; // for jitter solving we always know well the datum\n  if (have_dem) {\n    vw::vw_out() << \"Reading the DEM for the --heights-from-dem constraint.\\n\";\n    asp::create_masked_dem(opt.heights_from_dem, dem_georef,  masked_dem);\n    vw::checkDatumConsistency(opt.datum, dem_georef.datum(), warn_only);\n    asp::updateTriPtsFromDem(cnet, outliers, opt.camera_models,\n                             dem_georef,  masked_dem,\n                             dem_xyz_vec); // output\n  }\n  if (opt.anchor_dem != \"\") {\n    vw::vw_out() << \"Reading the DEM for the --anchor-dem constraint.\\n\";\n    asp::create_interp_dem(opt.anchor_dem, anchor_georef, interp_anchor_dem);\n    vw::checkDatumConsistency(opt.datum, anchor_georef.datum(), warn_only);\n  }\n\n  // Handle the roll/yaw constraint DEM. We already checked that one of thse cases should work\n  vw::cartography::GeoReference roll_yaw_georef;\n  if (opt.roll_weight > 0 || opt.yaw_weight > 0) {\n    if (opt.heights_from_dem != \"\") {\n      roll_yaw_georef = dem_georef;\n      vw::vw_out() << \"Using the DEM from --heights-from-dem \"\n                   << \"for the roll/yaw constraint.\\n\";\n    } else if (opt.anchor_dem != \"\") {\n      roll_yaw_georef = anchor_georef;\n      vw::vw_out() << \"Using the DEM from --anchor-dem for the roll/yaw constraint.\\n\";\n    }\n  }\n\n  int num_cameras = opt.camera_models.size();\n  if (num_cameras < 1)\n    vw_throw(ArgumentErr() << \"Expecting at least one input camera.\\n\");\n\n  // Put the triangulated points in a vector. Update the cnet from the DEM,\n  // if we have one. Later will add here the anchor points.\n  std::vector<double> local_orig_tri_points_vec, tri_points_vec;\n  asp::formTriVec(dem_xyz_vec, have_dem, opt.heights_from_dem_uncertainty,\n    cnet, local_orig_tri_points_vec, tri_points_vec); // outputs\n\n  // Create structures for pixels, xyz, and weights, to be used in optimization\n  std::vector<std::vector<Vector2>> pixel_vec;\n  std::vector<std::vector<double>> weight_vec;\n  std::vector<std::vector<int>> isAnchor_vec;\n  std::vector<std::vector<int>> pix2xyz_index;\n  createProblemStructure(opt, crn, cnet, tri_points_vec,\n                         // Outputs\n                         outliers, pixel_vec,\n                         weight_vec, isAnchor_vec, pix2xyz_index);\n\n  // Find anchor points and append to pixel_vec, weight_vec, xyz_vec, etc.\n  if ((opt.num_anchor_points_per_image > 0 || opt.num_anchor_points_per_tile > 0) &&\n       opt.anchor_weight > 0)\n    calcAnchorPoints(opt, interp_anchor_dem, anchor_georef, csm_models,\n                     // Append to these\n                     pixel_vec, weight_vec, isAnchor_vec, pix2xyz_index,\n                     local_orig_tri_points_vec, tri_points_vec);\n\n  // Save the original camera positions and triangulated points for the initial pass\n  if (pass == 0) {\n    orig_tri_points_vec = local_orig_tri_points_vec;\n    asp::calcCameraCenters(opt.stereo_session, opt.camera_models, orig_cam_positions);\n  }\n\n  // The above structures must not be resized anymore, as we will get pointers\n  // to individual blocks within them.\n\n  // Need this in order to undo the multiplication by weight before saving the residuals\n  std::vector<double> weight_per_residual;\n\n  // The problem to solve\n  ceres::Problem problem;\n\n  // In order to add a proportional camera constraint, we need to know the\n  // median weight per camera and their count. These are different for anchor\n  // and non-anchor points.  \n  std::vector<std::vector<double>> weight_per_cam(2);\n  std::vector<std::vector<double>> count_per_cam(2);\n\n  // Add reprojection errors. Get back weights_per_cam, count_per_cam.\n  addReprojCamErrs(opt, crn, pixel_vec, weight_vec,\n                   isAnchor_vec, pix2xyz_index, csm_models,\n                   have_rig, rig, rig_cam_info, opt.cam2group, timestamp_map,\n                   opt.fix_rig_translations, opt.fix_rig_rotations,\n                   // Outputs\n                   tri_points_vec, frame_params, weight_per_residual,\n                   weight_per_cam, count_per_cam, ref_to_curr_sensor_vec,\n                   problem);\n\n  // Add the DEM constraint. We check earlier that only one\n  // of the two options below can be set at a time.\n  if (have_dem)\n    addDemConstraint(opt, dem_xyz_vec, outliers, cnet,\n                     // Outputs\n                     tri_points_vec,\n                     weight_per_residual,  // append\n                     problem);\n\n  // Add the constraint to keep triangulated points close to initial values\n  // This does not need a DEM or alignment.\n  // This must happen after any DEM-based constraint is set, and won't\n  // apply to tri points already constrained by the DEM (so it will\n  // work only where the DEM is missing).\n  if (opt.tri_weight > 0)\n    addTriConstraint(opt, outliers, cnet, crn,\n                     // Outputs\n                     tri_points_vec,\n                     weight_per_residual,  // append\n                     problem);\n\n  // Add a cost function meant to tie up to known disparities (option\n  // --reference-terrain). The structures below must persist until the end.\n  std::vector<int> left_indices, right_indices;\n  std::vector<asp::SessionPtr> sessions;\n  std::vector<vw::TransformPtr> left_trans, right_trans;\n  std::vector<std::string> disp_files;\n  std::vector<DispPtr> disp_vec;\n  std::vector<vw::Vector3> reference_vec;\n  std::vector<std::vector<int>> ref_indices;\n  vw::ImageView<float> mapproj_dem;\n  if (opt.reference_terrain != \"\") {\n    asp::parseStereoRuns(opt.stereo_prefix_list, opt.image_files,\n                         // Outputs\n                         left_indices, right_indices, sessions, left_trans, right_trans,\n                         disp_files);\n    asp::addRefTerrainCostFun(opt, csm_models, left_indices, right_indices,\n                              left_trans, right_trans, disp_files,\n                              // Outputs\n                              problem, disp_vec, mapproj_dem,\n                              weight_per_residual, // append\n                                         reference_vec, ref_indices);\n  }\n\n  // Add the GCP constraint. GCP can come from GCP files or ISIS cnet.\n  addGcpConstraint(opt, outliers, opt.use_llh_error, opt.fix_gcp_xyz,\n                   cnet, tri_points_vec, weight_per_residual, problem); // outputs\n\n  // Add the constraint to keep the camera positions close to initial values.\n  // Note that in the second pass the initial values are the ones optimized in\n  // the first pass. \n  // TODO(oalexan1): It is not clear how to best handle this. Also revisit\n  // for bundle adjustment.\n  if (opt.camera_position_uncertainty.size() > 0)\n    addHardCamPositionConstraint(opt, outliers, crn, csm_models, count_per_cam,\n                                 opt.anchor_weight,\n                                 have_rig, rig, rig_cam_info,\n                                 // Outputs\n                                 frame_params, weight_per_residual, problem);\n\n  // Add another type of constraint to keep the camera positions close to initial values.\n  // The earlier one is recommended as this one was not fully sorted out.\n  // TODO(oalexan1): Need to wipe this option. The above does better.\n  if (opt.camera_position_weight > 0)\n    addSoftCamPositionConstraint(opt, outliers, crn, csm_models,\n                                 weight_per_cam, count_per_cam,\n                                 have_rig, rig, rig_cam_info,\n                                 // Outputs\n                                 frame_params, weight_per_residual, problem);\n\n  // Add constraints to keep quat norm close to 1, and make rotations \n  // not change too much.\n  // TODO(oalexan1): Need to parameterize the rotations with axis angle, then\n  // convert from / to quaternions.\n  addQuatNormRotationConstraints(opt, outliers, crn, csm_models,\n                                 have_rig, rig, rig_cam_info,\n                                 opt.quat_norm_weight,\n                                 // Outputs\n                                 frame_params,\n                                 weight_per_residual,  // append\n                                 problem);\n\n  if (opt.roll_weight > 0 || opt.yaw_weight > 0)\n    addRollYawConstraint(opt, crn, csm_models, roll_yaw_georef,\n                         opt.cam2group,\n                         opt.initial_camera_constraint,\n                         opt.roll_weight, opt.yaw_weight,\n                         // Outputs\n                         frame_params, weight_per_residual, problem); // outputs\n\n  // Add the smoothness constraint. This is a constraint on the curvature of the\n  // sequence of poses.\n  if (opt.smoothness_weight > 0)\n    asp::addSmoothnessConstraint(opt, csm_models, opt.smoothness_weight,\n                                 have_rig, rig, rig_cam_info,\n                                 // Outputs\n                                 weight_per_residual, orig_curvatures,\n                                 problem);\n\n  // Save residuals before optimization\n  std::vector<double> mean_pixel_residuals;\n  if (pass == 0) {\n    std::string residual_prefix = opt.out_prefix + \"-initial_residuals\";\n    saveJitterResiduals(problem, residual_prefix, opt, cnet, crn, opt.datum,\n                   tri_points_vec, outliers, weight_per_residual,\n                   pixel_vec, weight_vec, isAnchor_vec, pix2xyz_index,\n                   reference_vec, ref_indices,\n                   mean_pixel_residuals);\n  }\n\n  // Set up the problem\n  ceres::Solver::Options options;\n  options.gradient_tolerance  = 1e-16;\n  options.function_tolerance  = 1e-16;\n  options.parameter_tolerance = opt.parameter_tolerance; // default is 1e-12\n  options.max_num_iterations                = opt.num_iterations;\n  options.max_num_consecutive_invalid_steps = std::max(20, opt.num_iterations/5); // try hard\n  options.minimizer_progress_to_stdout      = true;\n  if (opt.single_threaded_cameras)\n    options.num_threads = 1;\n  else\n    options.num_threads = opt.num_threads;\n  // This is supposed to help with speed in a certain size range\n  options.linear_solver_type = ceres::SPARSE_SCHUR;\n  options.use_explicit_schur_complement = true;\n  options.linear_solver_type  = ceres::ITERATIVE_SCHUR;\n  options.preconditioner_type = ceres::SCHUR_JACOBI;\n  options.use_explicit_schur_complement = false; // Only matters with ITERATIVE_SCHUR\n\n  // Solve the problem\n  vw_out() << \"Starting the Ceres optimizer.\\n\";\n\n  ceres::Solver::Summary summary;\n  ceres::Solve(options, &problem, &summary);\n  vw_out() << summary.FullReport() << \"\\n\";\n  if (summary.termination_type == ceres::NO_CONVERGENCE)\n    vw_out() << \"Found a valid solution, but did not reach the actual minimum. \"\n             << \"This is expected, and likely the produced solution is good enough.\\n\";\n\n  // Update the cameras given the optimized parameters\n  updateCameras(have_rig, rig, rig_cam_info,\n                opt.cam2group, timestamp_map, ref_to_curr_sensor_vec,\n                csm_models, frame_params);\n\n  // By now camera_models has been updated in-place. Compute the optimized\n  // camera centers.\n  std::vector<std::vector<vw::Vector3>> opt_cam_positions;\n  asp::calcCameraCenters(opt.stereo_session, opt.camera_models, opt_cam_positions);\n\n  // Save residuals after optimization\n  std::string residual_prefix = opt.out_prefix + \"-final_residuals\";\n  saveJitterResiduals(problem, residual_prefix, opt, cnet, crn, opt.datum,\n                 tri_points_vec, outliers, weight_per_residual,\n                 pixel_vec, weight_vec, isAnchor_vec, pix2xyz_index,\n                 reference_vec, ref_indices,\n                 mean_pixel_residuals);\n\n  // Filter GCP outliers based on mean reprojection error\n  if (opt.max_gcp_reproj_err > 0)\n    asp::filterGcpOutliers(cnet, mean_pixel_residuals,\n                           opt.max_gcp_reproj_err, outliers);\n\n  // Save the optimized camera models\n  saveCsmCameras(opt.out_prefix, opt.stereo_session,\n                 opt.image_files, opt.camera_files,\n                 opt.camera_models, opt.update_isis_cubes_with_csm_state);\n\n  if (have_rig) {\n    // Update the rig with the optimized transforms and save it\n    asp::updateRig(ref_to_curr_sensor_vec, rig);\n    std::string rig_config = opt.out_prefix + \"-rig_config.txt\";\n    rig::writeRigConfig(rig_config, have_rig, rig);\n  }\n\n  // Write many types of stats. These are done together as they rely on\n  // reloading interest point matches, which is expensive.\n  bool remove_outliers = true, propagate_errors = false, save_clean_matches = false;\n  vw::Vector<double> horizontal_stddev_vec; // not used\n  asp::matchFilesProcessing(cnet,\n                            asp::BaBaseOptions(opt), // note the slicing\n                            opt.camera_models, // these have been updated\n                            remove_outliers, outliers, opt.mapproj_dem,\n                            propagate_errors, horizontal_stddev_vec,\n                            save_clean_matches, opt.match_files,\n                            stereo_settings().matches_as_txt);\n\n  // Compute the change in camera centers\n  std::string cam_offsets_file = opt.out_prefix + \"-camera_offsets.txt\";\n  if (opt.datum.name() != asp::UNSPECIFIED_DATUM)\n    asp::saveCameraOffsets(opt.datum, opt.image_files,\n                           orig_cam_positions, opt_cam_positions,\n                           cam_offsets_file);\n\n  // Resize the tri_points_vec to eliminate the anchor points that were appended.\n  // The number of those can be variable in each pass and those do not contribute\n  // to the triangulation offsets. This must be at the end.\n  int num_tri_points = cnet.size();\n  size_t tri_len = num_tri_points*NUM_XYZ_PARAMS;\n  if (orig_tri_points_vec.size() < tri_len || tri_points_vec.size() < tri_len)\n    vw_throw(ArgumentErr() << \"Expecting more triangulated points.\\n\");\n  orig_tri_points_vec.resize(tri_len);\n  tri_points_vec.resize(tri_len);\n  std::string tri_offsets_file = opt.out_prefix + \"-triangulation_offsets.txt\";\n  asp::saveTriOffsetsPerCamera(opt.image_files, outliers,\n                               orig_tri_points_vec, tri_points_vec,\n                               crn, tri_offsets_file);\n\n  // Save the optimized control network in GCP format, after outlier filtering\n  if (opt.save_cnet_as_gcp) {\n    std::string gcp_file = opt.out_prefix + \"-cnet.gcp\";\n    asp::saveCnetAsGcp(cnet, tri_points_vec, outliers, opt.datum,\n                       opt.image_files, gcp_file);\n  }\n\n} // end jitterSolvePass\n\nvoid run_jitter_solve(int argc, char* argv[]) {\n\n  // Parse arguments and perform validation\n  Options opt;\n  rig::RigSet rig;\n  handle_arguments(argc, argv, opt, rig);\n\n  // Load the cameras  \n  bool approximate_pinhole_intrinsics = false;\n  asp::load_cameras(opt.image_files, opt.camera_files, opt.out_prefix, opt,\n                    approximate_pinhole_intrinsics,\n                    // Outputs\n                    opt.stereo_session,  // may change\n                    opt.single_threaded_cameras,\n                    opt.camera_models);\n\n  // Find the datum.\n  // TODO(oalexan1): Integrate this into load_cameras, to avoid loading\n  // the cameras twice. Do this also in bundle_adjust.cc.\n  asp::SessionPtr session(NULL);\n  bool found_datum = asp::datum_from_camera(opt.image_files[0], opt.camera_files[0],\n                                             // Outputs\n                                             opt.stereo_session, session, opt.datum);\n  if (!found_datum)\n    vw_throw(ArgumentErr() << \"No datum was found in the input cameras.\\n\");\n\n  // Apply the input adjustments to the cameras. Resample linescan models.\n  // Get pointers to the underlying CSM cameras, as need to manipulate\n  // those directly. These will result in changes to the input cameras.\n  std::vector<asp::CsmModel*> csm_models;\n  initResampleCsmCams(opt, opt.camera_models, csm_models);\n\n  // Preparations if having a rig \n  // TODO(oalexan1): Must check that there exist images for all rig sensors, and\n  // there are no images without a rig. Otherwise the results are quietly bad.\n  bool have_rig = (opt.rig_config != \"\");\n  std::vector<RigCamInfo> rig_cam_info;\n  std::vector<double> ref_to_curr_sensor_vec;\n  TimestampMap timestamp_map;\n  if (have_rig)\n    populateRigCamInfo(rig, opt.image_files, opt.camera_files, csm_models,\n                       opt.cam2group, opt.use_initial_rig_transforms,\n                       // Outputs\n                       rig_cam_info, ref_to_curr_sensor_vec, timestamp_map);\n\n  // Make a list of all the image pairs to find matches for. Some quantities\n  // below are not needed but are part of the API.\n  if (opt.isis_cnet.empty() && opt.nvm.empty())\n    asp::findMatchFiles(opt.overlap_limit, opt.match_first_to_last,\n                        opt.image_files, opt.clean_match_files_prefix,\n                        opt.match_files_prefix, opt.out_prefix,\n                        asp::stereo_settings().matches_as_txt,\n                        // Outputs\n                        opt.match_files);\n\n  // Build control network and perform triangulation with adjusted input cameras\n  ba::ControlNetwork cnet(\"jitter_solve\");\n  if (opt.isis_cnet != \"\") {\n    asp::IsisCnetData isisCnetData; // isis cnet (if loaded)\n    vw::vw_out() << \"Reading ISIS control network: \" << opt.isis_cnet << \"\\n\";\n    asp::loadIsisCnet(opt.isis_cnet, opt.image_files,\n                      cnet, isisCnetData); // outputs\n  } else if (opt.nvm != \"\") {\n      // Assume the features are stored shifted relative to optical center\n      bool nvm_no_shift = false;\n      std::vector<Eigen::Affine3d> world_to_cam; // poses will not be used\n      std::map<std::string, Eigen::Vector2d> optical_offsets;\n      asp::readNvmAsCnet(opt.nvm, opt.image_files, nvm_no_shift,\n                         cnet, world_to_cam, optical_offsets); // outputs\n  } else {\n    bool triangulate_control_points = true;\n    vw::ba::build_control_network(triangulate_control_points,\n                                  cnet, // output\n                                  opt.camera_models, opt.image_files,\n                                  opt.match_files, opt.min_matches,\n                                  opt.min_triangulation_angle*(M_PI/180.0),\n                                  opt.forced_triangulation_distance,\n                                  opt.max_pairwise_matches,\n                                  stereo_settings().matches_as_txt);\n  }\n\n  vw::vw_out() << \"Number of triangulated control points: \" << cnet.size() << \"\\n\";\n\n  if (!opt.gcp_files.empty()) {\n    int num_gcp = vw::ba::add_ground_control_points(cnet, opt.gcp_files, opt.datum);\n    checkGcpRadius(opt.datum, cnet);\n    vw::vw_out() << \"Loaded \" << num_gcp << \" ground control points.\\n\";\n  }\n\n  if (cnet.empty())\n      vw::vw_throw(vw::ArgumentErr()\n              << \"Failed to build a control network. Check the bundle adjustment directory \"\n              << \"for matches and if the match files satisfy the naming convention \"\n              << \"<prefix>-<image1>__<image2>.match. \"\n              << \"Or, if using an .nvm file, ISIS cnet, or GCP, check those.\\n\");\n\n  // TODO(oalexan1): Is it possible to avoid using CRNs?\n  asp::CRN crn;\n  crn.from_cnet(cnet);\n\n  if ((int)crn.size() != opt.camera_models.size())\n    vw_throw(ArgumentErr() << \"Book-keeping error, the size of CameraRelationNetwork \"\n             << \"must equal the number of images.\\n\");\n\n  // Flag as outliers points with initial reprojection error bigger than\n  // a certain amount. This assumes that the input cameras are very accurate.\n  std::set<int> outliers;\n  flag_initial_outliers(cnet, crn, opt.camera_models, opt.max_init_reproj_error,\n                        // Output\n                        outliers);\n  vw_out() << \"Removed \" << outliers.size()\n    << \" outliers based on initial reprojection error.\\n\";\n\n  // It is convenient to compute these inside the first pass rather than outside.\n  // They should not go out of scope until the end of the program.\n  std::vector<std::vector<vw::Vector3>> orig_cam_positions;\n  std::vector<double> orig_tri_points_vec;\n  std::vector<std::vector<double>> orig_curvatures;\n\n  // Do this many passes\n  for (int pass = 0; pass < opt.num_passes; pass++)\n    jitterSolvePass(pass, have_rig, opt, crn, rig_cam_info,\n                    timestamp_map,\n                    // Outputs\n                    cnet, outliers, csm_models,\n                    orig_cam_positions,\n                    orig_tri_points_vec, orig_curvatures,\n                    rig, ref_to_curr_sensor_vec);\n\n  return;\n}\n\n} // end namespace asp\n\nint main(int argc, char* argv[]) {\n\n  try {\n    xercesc::XMLPlatformUtils::Initialize();\n\n    asp::run_jitter_solve(argc, argv);\n\n    xercesc::XMLPlatformUtils::Terminate();\n  } ASP_STANDARD_CATCHES;\n\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/list_timestamps",
    "content": "#!/usr/bin/env python\n\n\"\"\"\nFor each message in the bag having a header, add to the output list\nthe header timestamp (in double-precision seconds since epoch) and the\ntopic name. Do this for all topics in the bag or for those passed on\ninput.\n\"\"\"\n\nimport argparse, os, re, sys,rosbag\n  \nif __name__ == \"__main__\":\n    \n    parser = argparse.ArgumentParser(description=__doc__,\n                                     formatter_class=argparse.ArgumentDefaultsHelpFormatter)\n    parser.add_argument(\"--bag\", dest = \"bag\", help=\"Input bag.\"),\n    parser.add_argument(\"--list\", dest = \"list\", default=\"\",\n                        help=\"Output list having a timestamp and topic for each message.\")\n    parser.add_argument(\"--topics\", dest=\"topics\", default = \"\",  \n                        help=\"Print the timestamps only for these topics.\")\n\n    args = parser.parse_args()\n\n    if args.bag == \"\" or args.list == \"\":\n        print(\"Must specify the input bag and the output list.\")\n        sys.exit(1)\n\n    topic_list = None\n    if args.topics != \"\":\n        topic_list = args.topics.split()\n\n    print(\"Listing timestamps in: \" + args.bag)\n    print(\"This can be slow for large bags.\")\n    print(\"Writing: \" + args.list)\n    with open(args.list, \"w\") as fh:\n        with rosbag.Bag(args.bag, \"r\") as bag:\n            for topic, msg, t in bag.read_messages(topic_list):\n                try:\n                    # The timestamp format is consistent with what rig_calibrator uses\n                    fh.write(\"{0:10.7f} {1:s}\\n\".format(msg.header.stamp.to_sec(), topic))\n                except:\n                    pass\n                \n"
  },
  {
    "path": "src/asp/Tools/lronac2mosaic.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\nfrom __future__ import print_function\nimport os, glob, optparse, re, shutil, subprocess, sys, string, time\n\nlibexecpath = os.path.abspath(sys.path[0] + '/../libexec')\nsys.path.insert(0, libexecpath) # prepend to Python path\nfrom asp_system_utils import get_asp_version\n\nimport asp_system_utils\nasp_system_utils.verify_python_version_is_supported()\n\njob_pool = []\n\n# Global output folder variable\noutputFolder = \"\"\n\ndef man(option, opt, value, parser):\n    print(parser.usage, file=sys.stderr)\n    print('''\\\nThis program operates on LRO (.IMG) files, and performs the\nfollowing ISIS 3 operations:\n * Converts to ISIS format (lronac2isis)\n * Attaches SPICE information (spiceinit and spicefit)\n * Performs radiometric calibration (lronaccal)\n * Runs lronacecho\n * Applies an optional crop\n * Removes camera distortions from the CCD images (noproj)\n * Performs jitter analysis (lrojitreg)\n * Mosaics individual CCDs into one unified image file (handmos)\n * Normalizes the mosaic (cubenorm)\n''', file=sys.stderr)\n\n    sys.exit()\n\nclass Usage(Exception):\n    def __init__(self, msg):\n        self.msg = msg\n\ndef add_job(cmd, num_working_threads=4):\n    if ( len(job_pool) >= num_working_threads):\n        job_pool[0].wait();\n        job_pool.pop(0)\n    print(cmd)\n    job_pool.append(subprocess.Popen(cmd, shell=True, env=os.environ))\n\ndef wait_on_all_jobs():\n    print(\"Waiting for jobs to finish\")\n    while len(job_pool) > 0:\n        job_pool[0].wait()\n        job_pool.pop(0)\n\n# Go through a list of cubes and sort them into left/right pairs\ndef build_cube_pairs(cubePaths):\n    pairDict = dict();\n\n    for cube in cubePaths:\n        print(cube)\n        m = re.search(r'\\D*(\\d+)(.).*',os.path.basename(cube))\n        number     = m.group(1)\n        sideLetter = m.group(2)\n\n        if (number not in pairDict):\n            pairDict[number] = ['', ''];\n        # Store the path in the spot for either the left or right cube\n        if (sideLetter == \"L\"):\n            pairDict[number][0] = cube; # Left\n        else:\n            pairDict[number][1] = cube; # Right\n    return pairDict\n\ndef read_flatfile( flat ):\n    # Fail if the input file is not present\n    if not os.path.isfile(flat):\n        raise Exception('File ' + flat + ' is missing!')\n\n    averages = [0.0,0.0]\n\n    f = open(flat,'r')\n    for line in f:\n        if ( line.rfind(\"Average Sample Offset:\") >= 0 ):\n            index       = line.rfind(\"Offset:\");\n            index_e     = line.rfind(\"StdDev:\");\n            crop        = line[index+7:index_e];\n            if crop == \" NULL \": # Check for null value\n                raise Exception('Null sample offset in file ' + flat)\n            averages[0] = float(crop);\n        elif ( line.rfind(\"Average Line Offset:\") >= 0 ):\n            index       = line.rfind(\"Offset:\");\n            index_e     = line.rfind(\"StdDev:\");\n            crop        = line[index+7:index_e];\n            if crop == \"   NULL \": # Check for null value\n                raise Exception('Null sample offset in file ' + flat)\n            averages[1] = float(crop);\n        elif ( line.rfind(\"Using IpFind result only:\") >= 0 ):\n            index       = line.rfind(\"only:\");\n            if (line[index + 7] == 1):\n                print(\"Warning: This result based only on IpFind search.\")\n    print(str(averages))\n    return averages\n\n# Call lronac2isis on each input file, return list of output files.\ndef lronac2isis( img_files, threads, outputFolder ):\n    lronac2isis_cubs = []\n    for img in img_files:\n        # Expect to end in .IMG, change to end in .cub and move to output folder\n        newExtension = os.path.splitext(img)[0] + '.cub'\n        cubFilePath  = os.path.join(outputFolder, os.path.basename(newExtension))\n        if( os.path.exists(cubFilePath) ):\n            print(cubFilePath + ' exists, skipping lronac2isis.')\n        else:\n            cmd = 'lronac2isis from='+ img +' to='+ cubFilePath\n            add_job(cmd, threads)\n        lronac2isis_cubs.append( cubFilePath )\n    wait_on_all_jobs()\n    return lronac2isis_cubs\n\n\n# Call lronaccal on each input file, return list of output files.\ndef lronaccal( cub_files, threads, delete=False ):\n    lronaccal_cubs = []\n    for cub in cub_files:\n        # Expect to end in .cub, change to end in .lronaccal.cub\n        to_cub = os.path.splitext(cub)[0] + '.lronaccal.cub'\n        if( os.path.exists(to_cub) ):\n            print(to_cub + ' exists, skipping lronaccal.')\n        else:\n            cmd = 'lronaccal from=' + cub + ' to=' + to_cub\n            add_job(cmd, threads)\n        lronaccal_cubs.append( to_cub )\n    wait_on_all_jobs()\n\n    if (delete): # Delete all input .cub files and log files\n        for cub in cub_files:\n          os.remove( cub )\n        lronaccal_log_files = glob.glob( os.path.commonprefix(cub_files) + '*.lronaccal.log' )\n        for file in lronaccal_log_files:\n          os.remove( file )\n    return lronaccal_cubs\n\n\n# Call lronacecho on each input file, return list of output files.\ndef lronacecho( cub_files, threads, delete=False ):\n    lronacecho_cubs = []\n    for cub in cub_files:\n        # Expect to end in .cub, change to end in .lronaccal.cub\n        to_cub = os.path.splitext(cub)[0] + '.lronacecho.cub'\n        if( os.path.exists(to_cub) ):\n            print(to_cub + ' exists, skipping lronacecho.')\n        else:\n            cmd = 'lronacecho from='+ cub +' to='+ to_cub\n            add_job(cmd, threads)\n        lronacecho_cubs.append( to_cub )\n    wait_on_all_jobs()\n\n    if( delete ): # Delete all input .cub files and log files\n        for cub in cub_files:\n          os.remove( cub )\n    return lronacecho_cubs\n\n# Call spiceinit and spicefit on each input file\ndef spice(cub_files, spiceinit_options, threads):\n    for cub in cub_files:\n        cmd = 'spiceinit ' + spiceinit_options + ' from=' + cub\n        add_job(cmd, threads)\n    wait_on_all_jobs()\n    for cub in cub_files:\n        cmd = 'spicefit from='+ cub\n        add_job(cmd, threads)\n    wait_on_all_jobs()\n    return\n\n# Returns true if the .cub LRONAC file has CROSSTRACK_SUMMING = 1\ndef isFileHalfRes(cubFilePath):\n\n    return False; # It looks like the normal pvl file works so use it in all cases\n\n    f = open(cubFilePath, 'r')\n    for line in f:\n        if ( line.rfind(\"CROSSTRACK_SUMMING\") >= 0 ):\n            index       = line.rfind(\"=\");\n            crop        = line[index+2];\n            result      = (crop == \"2\")\n    f.close()\n\n    return result;\n\n\n# Left file is/home/smcmich1 in index 0, right is in index 1\ndef noproj( file_pairs, threads, delete, fakePvl, outputFolder):\n    if fakePvl: # Generate temporary PVL files containing LRONAC definition\n                # - We need one for full-res mode, one for half-X-res mode.\n\n       fullResFilePath = os.path.join(outputFolder, 'noprojInstruments_fullRes.pvl')\n       if os.path.exists(fullResFilePath):\n          print(fullResFilePath + ' exists, using existing file.')\n       else: # Need to write the file\n          print('Generating LRONAC compatible .pvl file ' + fullResFilePath)\n          f = open(fullResFilePath, 'w')\n          f.write('Object = IdealInstrumentsSpecifications\\n');\n          f.write('  UserName     = auto\\n');\n          f.write('  Created      = 2013-07-18T13:42:00\\n');\n          f.write('  LastModified = 2013-07-18T13:42:00\\n\\n');\n          f.write('  Group = \"LUNAR RECONNAISSANCE ORBITER/NACL\"\\n');\n          f.write('     TransY = 16.8833\\n')\n          f.write('     ItransS = -2411.9\\n')\n          f.write('     TransX = 0.6475\\n')\n          f.write('     ItransL = -92.5\\n')\n          f.write('     DetectorSamples = 10000\\n')\n          f.write('  End_Group\\n\\n')\n          f.write('End_Object\\n')\n          f.write('End')\n          f.close()\n\n       halfResFilePath = os.path.join(outputFolder, 'noprojInstruments_halfRes.pvl')\n       if os.path.exists(halfResFilePath):\n          print(halfResFilePath + ' exists, using existing file.')\n       else: # Need to write the file\n          print('Generating LRONAC compatible .pvl file ' + halfResFilePath)\n          f = open(halfResFilePath, 'w')\n          f.write('Object = IdealInstrumentsSpecifications\\n');\n          f.write('  UserName     = auto\\n');\n          f.write('  Created      = 2013-07-18T13:42:00\\n');\n          f.write('  LastModified = 2013-07-18T13:42:00\\n\\n');\n          f.write('  Group = \"LUNAR RECONNAISSANCE ORBITER/NACL\"\\n');\n          f.write('     TransY = 16.8833\\n')\n          f.write('     ItransS = -4823.8\\n')     # Halved\n          f.write('     TransX = 0.6475\\n')\n          f.write('     ItransL = -185\\n')       # Halved\n          f.write('     DetectorSamples = 5000\\n') # Halved\n          f.write('  End_Group\\n\\n')\n          f.write('End_Object\\n')\n          f.write('End')\n          f.close()\n\n    noproj_pairs = dict();\n    for k, v in file_pairs.items():\n\n        noproj_pairs[k] = ['', ''];\n        for i in range(2): # Process left and right image\n          to_cub = os.path.splitext(v[i])[0] + '.noproj.cub'\n\n          noproj_pairs[k][i] = to_cub; # Add file to output list\n          if os.path.exists( to_cub ):\n              print(to_cub + ' exists, skipping noproj.')\n          else:\n\n              # Generate pvl command if needed\n              if fakePvl:\n\n                  fileIsHalfRes = isFileHalfRes(v[0])\n                  if fileIsHalfRes:\n                      specsLine = ' specs=' + os.path.abspath(halfResFilePath) + ' ';\n                  else: # Full resolution\n                      specsLine = ' specs=' + os.path.abspath(fullResFilePath) + ' ';\n              else: # Use the default file\n                  specsLine = '';\n\n              # Multiple noproj threads will create clashing temporary files\n              #  so we need to make temporary directories to run each thread in.\n              tempDir = 'temp_' + str(k) + '_' + str(i)\n              tempDir = os.path.join(outputFolder, tempDir)\n              cmd = 'mkdir -p ' + tempDir + ' && ' \\\n                  + 'cd ' + tempDir + ' && ' \\\n                  + 'noproj from=' + os.path.abspath(v[i]) \\\n                  + ' match=' + os.path.abspath(v[0]) \\\n                  + specsLine \\\n                  + ' to=' + os.path.abspath(to_cub) + ' && ' \\\n                  + 'cd .. && rm -rf ' + tempDir\n\n              add_job(cmd, threads)\n    wait_on_all_jobs()\n\n    if( delete ): # Clean up input cube files\n        for v in file_pairs.values():\n           os.remove( v[0] );\n           os.remove( v[1] );\n#        if fakePvl: # These are not deleted in case this program is running in multiple threads\n#           os.remove( halfResFilePath );\n#           os.remove( fullResFilePath );\n    return noproj_pairs;\n\n\ndef lronacjitreg( noproj_pairs, threads, delete=False ):\n    boundsCommands = '--correlator-type 2 --kernel 15 15'\n    for k,v in noproj_pairs.items():\n        cmd = 'lronacjitreg ' + boundsCommands    \\\n            + ' --output-log outputLog_'+str(k)+'.txt' \\\n            + ' '+ v[0] \\\n            + ' '+ v[1];\n        add_job(cmd, threads)\n    wait_on_all_jobs()\n\n    # Read in all the shift values from the output text files\n    averages = dict()\n    for k,v in noproj_pairs.items():\n        flat_file = 'outputLog_'+str(k)+'.txt'\n        print('Reading log file ' + flat_file)\n        averages[k] = read_flatfile( flat_file )\n        if delete:\n            os.remove( flat_file )\n\n    return averages\n\n\ndef mosaic( noproj_pairs, averages, threads ):\n    mosaicList = dict();\n    for k,v in noproj_pairs.items():\n\n        # Create mosaic output file\n        mosaicPath = os.path.splitext(v[0])[0] + '.mosaic.cub'\n        shutil.copy( v[0], mosaicPath ) # Copy the LE image to the output path\n\n        xOffset = -1*averages[k][0] # Sign convention changes here\n        yOffset = -1*averages[k][1]\n\n        handmos( v[1], mosaicPath,\n                 str( int(round( xOffset )) ),\n                 str( int(round( yOffset )) ),\n                 threads )\n        mosaicList[k] = mosaicPath;\n\n    wait_on_all_jobs()\n\n    return mosaicList\n\n\ndef handmos( fromcub, tocub, outsamp, outline, threads ):\n    cmd = 'handmos from='+ fromcub +' mosaic='+ tocub \\\n            +' outsample = '+ str(outsamp) \\\n            +' outline = '  + str(outline) \\\n            +' matchbandbin=FALSE priority=ontop';\n    add_job(cmd, threads);\n    return\n\n\ndef cubenorm( mosaicList, threads, delete=False ):\n    normedList = dict();\n    for k,v in mosaicList.items():\n\n        normedPath = os.path.splitext(v)[0] + '.norm.cub'\n\n        cmd = 'cubenorm from='+ v +' to='+ normedPath\n        add_job(cmd, threads);\n\n        normedList[k] = normedPath;\n\n    wait_on_all_jobs()\n\n    if( delete ): # Clean up input cube files\n        for v in mosaicList.values():\n           os.remove(v);\n\n    return normedList\n\ndef cropInputs(inputFiles, outputFolder, cropAmount, threads, delete=False):\n\n    outputPaths = []\n    for path in inputFiles:\n        # Expect to end in .IMG, change to end in .cub and move to output folder\n        newExtension = os.path.splitext(path)[0] + '.cropped.cub'\n        croppedPath  = os.path.join(outputFolder, os.path.basename(newExtension))\n        cmd = 'crop from='+ path +' to='+ croppedPath + ' nlines=' + str(cropAmount)\n        add_job(cmd, threads)\n        outputPaths.append( croppedPath )\n\n    wait_on_all_jobs()\n\n    if delete:\n        for path in inputFiles:\n            os.remove(path)\n\n    return outputPaths\n\n\n#--------------------------------------------------------------------------------\n\n#TODO: Support for file based logging of results\n\ndef main():\n    try:\n        try:\n            usage = \"usage: lronac2mosaic.py [--help][--manual][--crop][--threads N]\" \\\n                    \"[--keep] LRONAC.IMG-files\\n  \" + get_asp_version()\n            parser = optparse.OptionParser(usage=usage)\n            parser.set_defaults(delete =True)\n            parser.set_defaults(cropAmount=0)\n            parser.set_defaults(threads=4)\n            parser.set_defaults(fakePvl=True)\n            parser.add_option(\"--manual\", action=\"callback\", callback=man,\n                              help=\"Read the manual.\")\n            parser.add_option(\"-o\", \"--output-dir\", dest=\"outputFolder\",\n                              help=\"Output folder (default to input folder).\",type=\"string\")\n            parser.add_option(\"--stop-at-no-proj\", dest=\"stop_no_proj\", action=\"store_true\",\n                              help=\"Process the IMG files only to have SPICE attached.\")\n            parser.add_option(\"--resume-at-no-proj\", dest=\"resume_no_proj\", \n                              action=\"store_true\",\n                              help=\"Start after spiceinit, lronaccal, lronacecho, and the optional crop. This allows for custom preparation of the inputs.\")\n            parser.add_option(\"--spiceinit-options\", dest=\"spiceinit_options\",\n                              help=\"Options to pass to spiceinit. Use quotes.\", type=\"string\",\n                                default=\"web=false spksmithed=true\")\n            parser.add_option(\"-c\", \"--crop\", dest=\"cropAmount\",\n                              help=\"Process only this many first lines of the images.\",type=\"int\")\n            parser.add_option(\"-t\", \"--threads\", dest=\"threads\",\n                              help=\"Number of threads to use.\",type=\"int\")\n            parser.add_option(\"-k\", \"--keep\", action=\"store_false\",\n                              dest=\"delete\",\n                              help=\"Will not delete intermediate files.\")\n            parser.add_option(\"--p\", dest=\"fakePvl\", action=\"store_true\",\n                              help=\"Don't automatically create a LRONAC pvl file\")\n            (options, args) = parser.parse_args()\n\n            if not args: parser.error(\"need .IMG files\")\n\n        except optparse.OptionError as msg:\n            raise Usage(msg)\n\n        # Make sure only one pair of cubes was passed in\n        input_file_pair = build_cube_pairs(args)\n        if len(input_file_pair) > 1:\n            raise Usage('Input error: Only one pair of input files are allowed, ' +\n                        'with names like M1127782730LE.IMG and M1127782730RE.IMG.')\n\n        if not options.outputFolder: # Set the output folder equal to the input folder\n            options.outputFolder = os.path.dirname(args[0])\n        print('Using output folder: ' + options.outputFolder)\n        if not os.path.exists(options.outputFolder) and len(options.outputFolder) > 1:\n            os.makedirs(options.outputFolder)\n\n        print(\"Start processing.\")\n\n        if not options.resume_no_proj: # If not skipping to later point\n\n            print(\"lronac2isis\") # Per-file operation, returns list of new files\n            lronac2isised = lronac2isis( args, options.threads, options.outputFolder )\n\n            # Attach spice info to cubes (adds to existing files). This\n            # must happen before calibration.\n            print(\"spiceinit\")\n            spice(lronac2isised, options.spiceinit_options, options.threads)\n\n            print(\"lronaccal\")   # Per-file operation, returns list of new files\n            lronaccaled = lronaccal(lronac2isised, options.threads, options.delete)\n\n            print(\"lronacecho\")  # Per-file operation, returns list of new files\n            lronacechod = lronacecho( lronaccaled, options.threads, options.delete )\n\n            if (options.cropAmount > 0): # Crop the input files as soon as ISIS calls allow it\n                lronacechod = cropInputs(lronacechod, options.outputFolder, options.cropAmount,\n                                         options.threads, options.delete)\n\n\n        if options.stop_no_proj: # Stop early if requested\n            print(\"Finished\")\n            return 0\n\n        if options.resume_no_proj: # If resume option was set\n            lronacechod = args\n\n        print(\"build_cube_pairs\") # Detected corresponding pairs of cubes\n        lronac_file_pairs = build_cube_pairs(lronacechod)\n\n        print(\"noproj\")       # Per-file operation\n        noprojed_file_pairs = noproj( lronac_file_pairs, options.threads, options.delete, options.fakePvl, options.outputFolder)\n\n        print(\"lronacjitreg\") # Determines mean shift for each file pair\n        averages = lronacjitreg( noprojed_file_pairs, options.threads, options.delete )\n\n        print(\"mosaic\")       # handmos - Use mean shifts to combine the file pairs\n        mosaicked = mosaic( noprojed_file_pairs, averages, options.threads )\n\n        # Clean up noproj files\n        if( options.delete ):\n          for cub in noprojed_file_pairs.values():\n              os.remove( cub[0] )\n              os.remove( cub[1] )\n\n        # Run a final cubenorm across the image:\n        cubenorm( mosaicked, options.threads, options.delete )\n\n        print(\"Finished\")\n        return 0\n\n    except Usage as err:\n        print(err.msg, file=sys.stderr)\n        return 2\n\n    # To more easily debug this program, comment out this catch block.\n    # except Exception as err:\n    #     sys.stderr.write( str(err) + '\\n' )\n    #     return 1\n\n\nif __name__ == \"__main__\":\n    sys.exit(main())\n"
  },
  {
    "path": "src/asp/Tools/lronacjitreg.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file lronacjitreg.cc\n///\n#include <asp/Core/DemDisparity.h>\n#include <asp/Core/InterestPointMatching.h>\n#include <asp/Core/Macros.h>\n#include <asp/Core/AspProgramOptions.h>\n\n#include <vw/Math/Functors.h>\n#include <vw/Image/ImageView.h>\n#include <vw/Image/ImageMath.h>\n#include <vw/Image/MaskViews.h>\n#include <vw/Image/Manipulation.h>\n#include <vw/FileIO/DiskImageResource.h>\n#include <vw/FileIO/DiskImageView.h>\n#include <vw/FileIO/DiskCacheImageView.h>\n#include <vw/FileIO/GdalWriteOptions.h>\n#include <vw/Stereo/PrefilterEnum.h>\n#include <vw/Stereo/CorrelationView.h>\n#include <vw/Stereo/CostFunctions.h>\n#include <vw/Stereo/DisparityMap.h>\n#include <vw/Stereo/Correlate.h>\n#include <vw/Math/RANSAC.h>\n#include <vw/Math/Geometry.h>\n#include <vw/Core/Log.h>\n\n#include <iomanip>\n\n// Can't do much about warnings in boost except to hide them\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wdeprecated-declarations\"\n#include <boost/accumulators/accumulators.hpp>\n#include <boost/accumulators/statistics.hpp>\n#pragma GCC diagnostic pop\n\nnamespace po = boost::program_options;\n\n// - Use the correlate tool to determine the mean X and Y offset\n//   between the two cubes (which should be almost parallel with\n//   some overlap)\n// - Output those two values.\n\nstruct Parameters: vw::GdalWriteOptions {\n\n  // Input paths\n  std::string leftFilePath;\n  std::string rightFilePath;\n  std::string rowLogFilePath;\n\n  // Settings\n  float log;\n  int   h_corr_min, h_corr_max;\n  int   v_corr_min, v_corr_max;\n  vw::Vector2i kernel;\n  int   lrthresh;\n  int   correlator_type;\n  int   cropWidth;\n};\n\nbool handle_arguments(int argc, char* argv[], Parameters& opt) {\n  po::options_description general_options(\"Options\");\n  general_options.add_options()\n    (\"output-log\", po::value(&opt.rowLogFilePath)->default_value(\"\"),\n     \"Explicitly specify the per row output text file\")\n    (\"log\", po::value(&opt.log)->default_value(1.4),\n     \"Apply LOG filter with the given sigma, or 0 to disable\")\n    (\"crop-width\", po::value(&opt.cropWidth)->default_value(200),\n     \"Crop images to this width before disparity search\")\n    (\"h-corr-min\", po::value(&opt.h_corr_min)->default_value(0),\n     \"Minimum horizontal disparity - computed automatically if not set.\")\n    (\"h-corr-max\", po::value(&opt.h_corr_max)->default_value(-1),\n     \"Maximum horizontal disparity - computed automatically if not set.\")\n    (\"v-corr-min\", po::value(&opt.v_corr_min)->default_value(0),\n     \"Minimum vertical disparity - computed automatically if not set.\")\n    (\"v-corr-max\", po::value(&opt.v_corr_max)->default_value(-1),\n     \"Maximum vertical disparity - computed automatically if not set.\")\n    (\"kernel\", po::value(&opt.kernel)->default_value(vw::Vector2i(15,15)),\n     \"Correlation kernel size\")\n    (\"lrthresh\", po::value(&opt.lrthresh)->default_value(2),\n     \"Left/right correspondence threshold\")\n    (\"correlator-type\", po::value(&opt.correlator_type)->default_value(0),\n     \"0 - Abs difference; 1 - Sq Difference; 2 - NormXCorr\");\n\n  general_options.add(vw::GdalWriteOptionsDescription(opt));\n\n  po::options_description positional(\"\");\n  positional.add_options()\n    (\"left\",  po::value(&opt.leftFilePath))\n    (\"right\", po::value(&opt.rightFilePath));\n\n  po::positional_options_description positional_desc;\n  positional_desc.add(\"left\",  1);\n  positional_desc.add(\"right\", 1);\n\n  std::string usage(\"[options] <left> <right>\");\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line(argc, argv, opt, general_options, general_options,\n                            positional, positional_desc, usage,\n                            allow_unregistered, unregistered);\n\n  if (!vm.count(\"left\") || !vm.count(\"right\"))\n    vw::vw_throw(vw::ArgumentErr()\n                 << \"Requires <left> and <right> input in order to proceed.\\n\\n\"\n                 << usage << general_options);\n\n  return true;\n}\n\nbool determineShifts(Parameters & params, double &dX, double &dY) {\n\n  // Verify images are present\n  boost::filesystem::path leftBoostPath (params.leftFilePath);\n  boost::filesystem::path rightBoostPath(params.rightFilePath);\n\n  if (!boost::filesystem::exists(boost::filesystem::path(params.leftFilePath))) {\n    vw::vw_out() << \"Error: input file \" << params.leftFilePath << \" is missing!\\n\";\n    return false;\n  } if (!boost::filesystem::exists(boost::filesystem::path(params.rightFilePath))) {\n    vw::vw_out() << \"Error: input file \" << params.rightFilePath << \" is missing!\\n\";\n    return false;\n  }\n\n\n  // Load both images\n  vw::vw_out() << \"Loading images left=\" << params.leftFilePath\n               << \" and right=\" << params.rightFilePath << \".\\n\";\n  vw::DiskImageView<vw::PixelGray<float>> left_disk_image (params.leftFilePath);\n  vw::DiskImageView<vw::PixelGray<float>> right_disk_image(params.rightFilePath);\n\n  const int imageWidth      = std::min(left_disk_image.cols(), right_disk_image.cols());\n  const int imageHeight     = std::min(left_disk_image.rows(), right_disk_image.rows());\n  const int imageTopRow     = 0;\n  const int imageMidPointX  = imageWidth / 2;\n  const int cropStartX      = imageMidPointX - (params.cropWidth/2);\n\n  // Restrict processing to the border of the images\n  // - Since both images were nproj'd the overlap areas should be in about the same spots.\n  const vw::BBox2i crop_roi(cropStartX, imageTopRow,\n                            params.cropWidth, imageHeight);\n  vw::vw_out() << \"Expected overlap ROI = \" << crop_roi << \"\\n\";\n\n  const int SEARCH_RANGE_EXPANSION = 5;\n  int  ipFindXOffset = 0;\n  int  ipFindYOffset = 0;\n  bool ransacSuccess = false;\n\n  // If the search box was not fully populated use ipfind to estimate a search region\n  if ((params.h_corr_min > params.h_corr_max) ||\n      (params.v_corr_min > params.v_corr_max)) {\n    vw::vw_out() << \"Gathering interest points...\\n\";\n\n    int points_per_tile = 500;\n    double nodata1 = 0, nodata2 = 0;\n    vw::ImageViewRef<vw::PixelGray<float>> left_crop =\n      vw::crop(left_disk_image, crop_roi);\n    vw::ImageViewRef<vw::PixelGray<float>> right_crop =\n      vw::crop(right_disk_image, crop_roi);\n\n    // Gather interest points and match them\n    std::vector<vw::ip::InterestPoint> matched_ip1, matched_ip2;\n    size_t number_of_jobs = 1;\n    bool use_cached_ip = false;\n    asp::detect_match_ip(matched_ip1, matched_ip2,\n                         vw::pixel_cast<float>(left_crop),\n                         vw::pixel_cast<float>(right_crop),\n                         points_per_tile,\n                         number_of_jobs, \"\", \"\", use_cached_ip,\n                         nodata1, nodata2);\n\n    if (matched_ip1.empty() || matched_ip2.empty()) {\n      ransacSuccess = false;\n      vw::vw_out() << \"Failed to find any matching interest points, \"\n                   << \"defaulting to large search range.\\n\";\n    } else {\n      vw::vw_out() << \"Found \" << matched_ip1.size() << \", \" << matched_ip2.size()\n                   << \" matched interest points.\\n\";\n\n      // Filter interest point matches\n      vw::math::RandomSampleConsensus<vw::math::SimilarityFittingFunctor,\n                                      vw::math::InterestPointErrorMetric>\n        ransac(vw::math::SimilarityFittingFunctor(),\n               vw::math::InterestPointErrorMetric(),\n               100, 5, 100, true);\n      std::vector<vw::Vector3> ransac_ip1 = vw::ip::iplist_to_vectorlist(matched_ip1);\n      std::vector<vw::Vector3> ransac_ip2 = vw::ip::iplist_to_vectorlist(matched_ip2);\n\n      // Finding offset using RANSAC.\n      try {\n        vw::math::Matrix<double> H(ransac(ransac_ip1, ransac_ip2));\n        vw::vw_out() << \"ipfind based similarity: \" << H << \"\\n\";\n\n        ipFindXOffset = static_cast<int>(H[0][2]);\n        ipFindYOffset = static_cast<int>(H[1][2]);\n        ransacSuccess = true;\n      } catch (...) {\n        vw::vw_out() << \"RANSAC solution failed, defaulting to large search range.\\n\";\n        ransacSuccess = false;\n      }\n    }\n\n  }\n\n  vw::BBox2i searchRegion(ipFindXOffset, ipFindYOffset, 1, 1);\n  searchRegion.expand(SEARCH_RANGE_EXPANSION);\n\n  if (!ransacSuccess) { // Default to a large search radius\n    searchRegion.min()[0] = -100;\n    searchRegion.max()[0] =  100;\n    searchRegion.min()[1] = -100;\n    searchRegion.max()[1] =  100;\n  }\n\n  // Factor in user bounds overrides\n  if (params.h_corr_min < params.h_corr_max) {\n    searchRegion.min()[0] = params.h_corr_min;\n    searchRegion.max()[0] = params.h_corr_max;\n  }\n  if (params.v_corr_min < params.v_corr_max) {\n    searchRegion.min()[1] = params.v_corr_min;\n    searchRegion.max()[1] = params.v_corr_max;\n  }\n\n  vw::vw_out() << \"Disparity search image size = \" << params.cropWidth\n               << \" by \" << imageHeight << \"\\n\";\n  vw::vw_out() << \"Offset search region = \" << searchRegion << \"\\n\";\n\n  // Use correlation function to compute image disparity\n  vw::stereo::CostFunctionType corr_type = vw::stereo::ABSOLUTE_DIFFERENCE;\n  if (params.correlator_type == 1)\n    corr_type = vw::stereo::SQUARED_DIFFERENCE;\n  else if (params.correlator_type == 2)\n    corr_type = vw::stereo::CROSS_CORRELATION;\n\n  vw::vw_out() << \"Running stereo correlation.\\n\";\n\n  // Pyramid Correlation works best rasterizing in 1024^2 chunks\n  vw::vw_settings().set_default_tile_size(1024);\n\n  int    filter_kernel_size = 5;\n  int    max_pyramid_levels = 5;\n  int    corr_timeout       = 0;\n  int    min_lr_level = 0;\n  double seconds_per_op     = 0.0;\n  vw::DiskCacheImageView<vw::PixelMask<vw::Vector2f>>\n    disparity_map(\n      vw::stereo::pyramid_correlate(\n         vw::apply_mask(vw::create_mask_less_or_equal(\n           vw::crop(left_disk_image, crop_roi), 0)),\n         vw::apply_mask(vw::create_mask_less_or_equal(\n           vw::crop(right_disk_image, crop_roi), 0)),\n         vw::constant_view(vw::uint8(255), left_disk_image),\n         vw::constant_view(vw::uint8(255), right_disk_image),\n         vw::stereo::PREFILTER_LOG, params.log,\n         searchRegion,\n         params.kernel,\n         corr_type, corr_timeout, seconds_per_op,\n         params.lrthresh, min_lr_level, filter_kernel_size, max_pyramid_levels));\n\n  // Compute the mean horizontal and vertical shifts\n  // - Currently disparity_map contains the per-pixel shifts\n\n  vw::vw_out() << \"Accumulating offsets.\\n\";\n\n  std::ofstream out;\n  const bool writeLogFile = !params.rowLogFilePath.empty();\n  if (writeLogFile) {\n    out.open(params.rowLogFilePath.c_str());\n    if (out.fail()) {\n      vw::vw_out() << \"Failed to create output log file \"\n                   << params.rowLogFilePath << \"!\\n\";\n      return false;\n    }\n\n    vw::vw_out() << \"Created output log file: \" << params.rowLogFilePath << \"\\n\";\n\n    out << \"#       Lronacjitreg ISIS Application Results\" << \"\\n\";\n    out << \"#    Coordinates are (Sample, Line) unless indicated\" << \"\\n\";\n    out << \"#\\n#    ****  Image Input Information ****\\n\";\n    out << \"#  FROM:  \" << params.leftFilePath << \"\\n\";\n    out << \"#    Lines:       \" << std::setprecision(0) << imageHeight << \"\\n\";\n    out << \"#    Samples:     \" << std::setprecision(0) << imageWidth << \"\\n\";\n    out << \"#    SampOffset:  \" << cropStartX << \"\\n\";\n    out << \"#    TopLeft:     \" << std::setw(7) << std::setprecision(0)\n        << cropStartX << \" \"\n        << std::setw(7) << std::setprecision(0)\n        << 0 << \"\\n\";\n    out << \"#    LowerRight:  \" << std::setw(7) << std::setprecision(0)\n        << cropStartX + params.cropWidth << \" \"\n        << std::setw(7) << std::setprecision(0)\n        << imageHeight << \"\\n\";\n    out << \"\\n\";\n    out << \"#  MATCH: \" << params.rightFilePath << \"\\n\";\n    out << \"#    Lines:       \" << std::setprecision(0) << imageHeight << \"\\n\";\n    out << \"#    Samples:     \" << std::setprecision(0) << imageWidth << \"\\n\";\n    out << \"#    SampOffset:  \" << cropStartX << \"\\n\";\n    out << \"#    TopLeft:     \" << std::setw(7) << std::setprecision(0)\n        << cropStartX << \" \"\n        << std::setw(7) << std::setprecision(0)\n        << 0 << \"\\n\";\n    out << \"#    LowerRight:  \" << std::setw(7) << std::setprecision(0)\n        << cropStartX+params.cropWidth  << \" \"\n        << std::setw(7) << std::setprecision(0)\n        << imageHeight << \"\\n\";\n    out << \"\\n\";\n\n  }\n\n  double meanVertOffset      = 0.0;\n  double meanHorizOffset     = 0.0;\n  int    numValidRows        = 0;\n  int    totalNumValidPixels = 0;\n\n  vw::StdDevAccumulator<float> stdCalcX, stdCalcY;\n\n  std::vector<double> rowOffsets(disparity_map.rows());\n  std::vector<double> colOffsets(disparity_map.rows());\n  for (int row=0; row<disparity_map.rows(); row++) {\n\n    // Accumulate the shifts for this row\n    vw::StdDevAccumulator<float> stdDevCalcRow;\n    double rowSum        = 0.0;\n    double colSum        = 0.0;\n    double stdDevRow     = 0.0;\n    int    numValidInRow = 0;\n    for (int col=0; col<disparity_map.cols(); col++) {\n\n      if (vw::is_valid(disparity_map(col,row))) {\n        float dY = disparity_map(col,row)[1]; // Y\n        float dX = disparity_map(col,row)[0]; // X\n        rowSum += dY;\n        colSum += dX;\n        ++numValidInRow;\n\n        stdCalcX(dX);\n        stdCalcY(dY);\n\n        stdDevCalcRow(dY);\n      }\n    } // End loop through cols\n\n    // Compute mean shift for this row\n    if (numValidInRow == 0) {\n      rowOffsets[row] = 0;\n      colOffsets[row] = 0;\n      stdDevRow       = 0;\n    } else { // At least one valid pixel\n      rowOffsets[row] = rowSum / static_cast<double>(numValidInRow);\n      colOffsets[row] = colSum / static_cast<double>(numValidInRow);\n      stdDevRow = stdDevCalcRow.value();\n      totalNumValidPixels += numValidInRow;\n      ++numValidRows;\n    }\n\n    if (writeLogFile) {\n      out << std::setprecision(4)\n          << std::setw(5) << row             << \", \"\n          << std::setw(6) << rowOffsets[row] << \", \"\n          << std::setw(6) << colOffsets[row] << \" Count = \"\n          << std::setw(3) << numValidInRow   << \" Std = \"\n          << std::setw(4) << stdDevRow << \"\\n\";\n    }\n\n  } // End loop through rows\n\n  if (writeLogFile) {\n    out << \"\\n#  **** Registration Data ****\\n\";\n    out << \"#   RegFile: \" << \"\" << \"\\n\";\n    out << \"#   OverlapSize:      \" << std::setw(7) << params.cropWidth << \" \"\n        << std::setw(7) << imageHeight << \"\\n\";\n    out << \"#   Sample Spacing:   \" << std::setprecision(1) << 1 << \"\\n\";\n    out << \"#   Line Spacing:     \" << std::setprecision(1) << 1 << \"\\n\";\n    out << \"#   Columns, Rows:    \" << params.kernel[0] << \" \"\n        << params.kernel[1] << \"\\n\";\n    out << \"#   Corr. Algorithm:  \";\n    switch(params.correlator_type) {\n      case 1:  out << \"SQUARED_DIFFERENCE\"  << \"\\n\"; break;\n      case 2:  out << \"CROSS_CORRELATION\"   << \"\\n\"; break;\n      default: out << \"ABSOLUTE_DIFFERENCE\" << \"\\n\"; break;\n    };\n    if (numValidRows > 0) {\n      out << \"#   Using IpFind result only:   0\" << \"\\n\";\n      out << \"#   Average Sample Offset: \" << std::setprecision(4) << stdCalcX.mean()\n          << \"  StdDev: \" << std::setprecision(4) << stdCalcX.value() << \"\\n\";\n      out << \"#   Average Line Offset:   \" << std::setprecision(4) << stdCalcY.mean()\n          << \" StdDev: \" << std::setprecision(4) << stdCalcY.value() << \"\\n\";\n    } else {\n      if (ransacSuccess) {\n        vw::vw_out() << \"Pixel correlation search failed, using IpFind results.\\n\";\n        out << \"#   Using IpFind result only:   1\" << \"\\n\";\n        out << \"#   Average Sample Offset: \" << std::setprecision(4) << ipFindXOffset\n            << \"  StdDev: 0.0\" << \"\\n\";\n        out << \"#   Average Line Offset:   \" << std::setprecision(4) << ipFindYOffset\n            << \" StdDev: 0.0\" << \"\\n\";\n      } else {\n        out << \"#   Using IpFind result only:   0\" << \"\\n\";\n        out << \"#   Average Sample Offset: NULL StdDev: NULL\\n\";\n        out << \"#   Average Line Offset:   NULL StdDev: NULL\\n\";\n      }\n    }\n\n    out.close();\n  }\n\n  if ((numValidRows == 0) && (!ransacSuccess)) {\n      vw::vw_out() << \"Error: No valid pixel matches found!\\n\";\n    return false;\n  }\n\n  // Compute overall mean shift\n  meanVertOffset  = stdCalcY.mean();\n  meanHorizOffset = stdCalcX.mean();\n\n  dX = meanHorizOffset;\n  dY = meanVertOffset;\n\n  vw::vw_out() << \"Found \" << totalNumValidPixels << \" valid pixels in \"\n               << numValidRows << \" rows\\n\";\n  return true;\n}\n\nint main(int argc, char* argv[]) {\n  try  {\n    // Parse the input parameters\n    Parameters params;\n    if (!handle_arguments(argc, argv, params)) {\n      vw::vw_out() << \"Failed to parse input parameters!\\n\";\n      return 1;\n    }\n\n    double dX, dY;\n    if (determineShifts(params, dX, dY)) {\n      // Success, print the results\n      vw::vw_out() << \"Mean sample offset = \" << dX << \"\\n\";\n      vw::vw_out() << \"Mean line   offset = \" << dY << \"\\n\";\n    }\n\n  } ASP_STANDARD_CATCHES;\n\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/mapproject",
    "content": "#!/usr/bin/env python\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n'''\nThis tool implements a multi-process version of mapproject to\ngreatly increase the speed of map projecting ISIS images.\n'''\n\nimport sys\nimport os, glob, re, shutil, subprocess, string, time, errno, argparse, math\n\n# The path to the ASP python files\nbasepath    = os.path.abspath(sys.path[0])\npythonpath  = os.path.abspath(basepath + '/../Python')  # for dev ASP\nlibexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP\nsys.path.insert(0, basepath) # prepend to Python path\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\n\nfrom asp_alg_utils import *\n\nimport asp_file_utils, asp_system_utils, asp_cmd_utils, asp_image_utils, asp_string_utils\nasp_system_utils.verify_python_version_is_supported()\n\n# Prepend to system PATH. First try to find things in libexec,\n# and if that fails, then in bin. Otherwise mapproject_single\n# cannot be found.\nos.environ[\"PATH\"] = libexecpath + os.pathsep + \\\n                     basepath + os.pathsep    + \\\n                     os.environ[\"PATH\"]\n\n# This is explained in asp_system_utils.\nif 'ASP_LIBRARY_PATH' in os.environ:\n    os.environ['LD_LIBRARY_PATH'] = os.environ['ASP_LIBRARY_PATH']\n\ndef generateTileList(fullWidth, fullHeight, tileSize):\n    \"\"\"Generate a full list of tiles for this image\"\"\"\n\n    numTilesX = int(math.ceil(fullWidth  / float(tileSize)))\n    numTilesY = int(math.ceil(fullHeight / float(tileSize)))\n\n    tileList = []\n    for r in range(0, numTilesY):\n        for c in range(0, numTilesX):\n\n            # Starting pixel positions for the tile\n            tileStartY = r * tileSize\n            tileStartX = c * tileSize\n\n            # Determine the size of this tile\n            thisWidth  = tileSize\n            thisHeight = tileSize\n            if (r == numTilesY-1): # If the last row\n                thisHeight = fullHeight - tileStartY # Height is last remaining pixels\n            if (c == numTilesX-1): # If the last col\n                thisWidth  = fullWidth  - tileStartX # Width is last remaining pixels\n\n            # Get the end pixels for this tile\n            tileStopY  = tileStartY + thisHeight # Stop values are exclusive\n            tileStopX  = tileStartX + thisWidth\n\n            # Create a name for this tile\n            # - Tile format is tile_col_row_width_height_.tif\n            tileString = generateTileName(tileStartX, tileStartY, tileStopX, tileStopY)\n\n            tileList.append((tileStartX, tileStartY, tileStopX, tileStopY, tileString))\n\n    return (numTilesX, numTilesY, tileList)\n\ndef writeSingleTile(options):\n    \"\"\"Writes a single tile according to the options\"\"\"\n\n    # Determine the name of the tile we need to write\n    tileName = generateTileName(options.pixelStartX, options.pixelStartY,\n                                options.pixelStopX, options.pixelStopY)\n    tilePath = os.path.join(options.workDir, tileName)\n\n    # Bounds for this tile\n    startX = int(options.pixelStartX)\n    stopX  = int(options.pixelStopX)\n    startY = int(options.pixelStartY)\n    stopY  = int(options.pixelStopY)\n\n    # If the user passed in the t_pixelwin argument, reconcile it with the internal ROI we need.\n    extraArgs = []\n    i = 0\n    while i < len(options.extraArgs):\n        arg = options.extraArgs[i]\n\n        if arg == '--t_pixelwin':\n            # Skip this element and grab the user provided pixel bounds\n            userStartX = int(options.extraArgs[i+1])\n            userStartY = int(options.extraArgs[i+2])\n            userStopX  = int(options.extraArgs[i+3])\n            userStopY  = int(options.extraArgs[i+4])\n\n            # Reconcile the bounding box\n            if (startX < userStartX): startX = userStartX\n            if (stopX  > userStopX ): stopX  = userStopX\n            if (startY < userStartY): startY = userStartY\n            if (stopY  > userStopY ): stopY  = userStopY\n\n            # If there is no tile left to generate then we can just return here\n            if ((startX > stopX) or (startY > stopY)):\n                return 0\n            i += 5\n        else:\n            extraArgs.append(arg)\n            i += 1\n\n    # Just call the command for a single tile.\n    cmd = ['mapproject_single', '--t_pixelwin', \n           str(startX), str(startY), str(stopX), str(stopY),\n           options.demPath, options.imagePath, options.cameraPath, tilePath]\n    if options.noGeoHeaderInfo:\n        cmd += ['--no-geoheader-info']\n    cmd = cmd + extraArgs # Append other options\n    asp_system_utils.executeCommand(cmd, suppressOutput=options.suppressOutput,\n                                    realTimeOutput = True)\n\n    if options.convertTiles: # Make uint8 version of the tile for debugging\n        tilePathU8 = os.path.splitext(tilePath)[0] + 'U8.tif'\n        cmd = ['gdal_translate', '-ot', 'byte', '-scale', tilePath, tilePathU8]\n        asp_system_utils.executeCommand(cmd, suppressOutput=options.suppressOutput)\n\n    return 0\n\ndef parse_gdal_metadata(filename, meta_label):\n    \"\"\"\n    Seek out the metadata for the given label in a tif file and return\n    that metadata as a map having key and value pairs. Use gdalinfo\n    to query the tif file.\n    \"\"\"\n    args = [filename]\n    sep = \"\"\n    verbose = False\n    gdal_settings = asp_system_utils.run_and_parse_output(\"gdalinfo\", args, sep,\n                                                          verbose, return_full_lines = True)\n    meta_dict = {}\n    parseBlock = False\n    \n    for v in sorted(gdal_settings.keys()):\n\n        if gdal_settings[v] == meta_label + ':':\n            # Just reached the line with the label, so need to parse\n            # the block of next several lines which start with a\n            # space. Notice how above there is a column at the end of\n            # the label line.\n            parseBlock = True \n            continue\n        \n        if len(gdal_settings[v]) == 0 or gdal_settings[v][0] != \" \":\n            # Another block started\n            if parseBlock:\n                # Past the current block, time to stop\n                break\n            else:\n                # Did not reach the desired block yet\n                continue\n\n        if len(gdal_settings[v]) > 0 and parseBlock:\n            # In the desired block\n            m = re.match(r\"^\\s*(.*?)\\s*=\\s*(.*?)\\s*$\", gdal_settings[v])\n            if not m:\n                continue\n            meta_dict[m.group(1)] = m.group(2)\n\n    return meta_dict\n\ndef format_metadata(meta_label, meta_dict):\n    \"\"\"\n    Format the metadata with given label and entries as the GDAL VRT\n    format expects it.\n    \"\"\"\n\n    # From meta_label = \"RPC Metadata\" extract \"RPC\".\n    vrt_domain = \"\"\n    m = re.match(r\"^([\\w]+)\\s+Metadata\", meta_label)\n    if m:\n        vrt_domain = m.group(1)\n\n    # The VRT format is quite particular\n    # https://gdal.org/drivers/raster/vrt.html\n    if vrt_domain == \"\":\n        meta_lines = [\"  <Metadata>\\n\"]\n    else:\n        meta_lines = [\"  <Metadata domain=\\\"\" + vrt_domain + \"\\\">\\n\"]\n        \n    for v in sorted(meta_dict.keys()):\n        line = \"    <MDI key=\\\"\" + v + \"\\\">\" + meta_dict[v] + \"</MDI>\\n\"\n        meta_lines.append(line)\n    meta_lines.append(\"  </Metadata>\\n\")\n\n    return meta_lines\n    \n#------------------------------------------------------------------------------\n\n# If there is an input _RPC.TXT or .RPB, create such an output file as well,\n# to store there the RPC coefficients. Need this for stereo later on. \n# For some reason, this function must be invoked after the writing\n# of the output tif file has been competed. Otherwise something wipes it.\ndef maybe_copy_rpc(inputPath, outputPath):\n    for ext in ['_RPC.TXT', '_rpc.txt', '.RPB', '.rpb']:\n        input_rpc  = os.path.splitext(inputPath )[0] + ext\n        output_rpc = os.path.splitext(outputPath)[0] + ext\n        if os.path.exists(input_rpc):\n            print(\"Copied \" + input_rpc + \" to \" + output_rpc)\n            shutil.copy(input_rpc, output_rpc)\n\ndef main(argsIn):\n\n    relOutputPath = \"\"\n    try:\n        # Get the help text from the base C++ tool so we can append it to the python help\n        cmd = ['mapproject_single',  '--help']\n        p = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True)\n        baseHelp, err = p.communicate()\n    except OSError:\n        print(\"Error: Unable to find required mapproject_single tool!\")\n        return -1\n\n    # Extract the version and help text\n    vStart  = baseHelp.find('[ASP')\n    vEnd    = baseHelp.find(']', vStart)+1\n    version = baseHelp[vStart:vEnd]\n    baseHelpText = \"Help options for the underlying 'mapproject_single' program:\\n\" + \\\n                   baseHelp[vEnd:]\n\n    # Use a parser that ignores unknown options. Those will be passed to mapproject_single.\n    usage  = \"mapproject [options] <dem> <camera-image> <camera-model> <output-image>\\n\" + \\\n             \"Instead of the DEM file, a datum can be provided, such as\\n\" + \\\n             \"WGS84, NAD83, NAD27, D_MOON, D_MARS, and MOLA.\"\n    parser = argparse.ArgumentParser(usage=usage, epilog=baseHelpText,\n                                     formatter_class=argparse.RawTextHelpFormatter)\n\n    parser.add_argument(\"--processes\",  dest=\"numProcesses\", type=int, default=None,\n      help=\"Number of processes to use on each node (the default is for the \" + \\\n      \"program to choose).\")\n\n    parser.add_argument(\"--num-processes\",  dest=\"numProcesses2\", type=int, default=None,\n      help=\"Same as --processes. Used for backwards compatibility.\")\n\n    parser.add_argument('--nodes-list',  dest='nodesListPath', default=None,\n      help='The list of computing nodes, one per line. ' + \\\n      'If not provided, run on the local machine.')\n    \n    parser.add_argument('--parallel-options', dest='parallel_options', \n      default='--sshdelay 0.2',\n      help='Options to pass directly to GNU Parallel.')\n    \n    parser.add_argument('--tile-size',  dest='tileSize', default=None, type=int,\n      help = 'Size of square tiles to break up processing up '   + \\\n      'into. Each tile is run by an individual process. The '    + \\\n      'default is 1024 pixels for ISIS cameras, as then each '   + \\\n      'process is single-threaded, and 5120 for other cameras, ' + \\\n      'as such a process is multi-threaded, and disk I/O '       + \\\n      'becomes a bigger consideration.')\n    \n    # Directory where the job is running\n    parser.add_argument('--work-dir',  dest='workDir', default=None,\n      help='Working directory to assemble the tiles in.')\n\n    parser.add_argument('--run-dir', dest='runDir', default=None,\n      help='Directory in which the script is running.')\n\n    parser.add_argument(\"--suppress-output\", action=\"store_true\", default=False,\n      dest=\"suppressOutput\",  help=\"Suppress output of sub-calls.\")\n\n    parser.add_argument(\"--no-geoheader-info\", action=\"store_true\", default=False,\n      dest=\"noGeoHeaderInfo\",\n      help=\"Suppress writing some auxiliary information in geoheaders.\")\n\n    # DEBUG options\n    parser.add_argument(\"--keep\", action=\"store_true\", dest=\"keep\", default=False,\n      help=\"Do not delete the temporary files.\")\n    parser.add_argument(\"--convert-tiles\",  action=\"store_true\", dest=\"convertTiles\",\n      help=\"Generate a uint8 version of each tile\")\n    parser.add_argument(\"--cog\", action=\"store_true\", dest=\"cog\", default=False,\n      help=\"Write a cloud-optimized GeoTIFF (COG).\")\n    parser.add_argument('-v', '--version', dest='version',  default=False, action='store_true',\n      help='Display the version of software.')\n    \n    # PRIVATE options\n    # These specify the tile location to request, bypassing the need to query mapproject.\n    parser.add_argument('--pixelStartX', dest='pixelStartX', default=None, type=int,\n      help=argparse.SUPPRESS)\n    parser.add_argument('--pixelStartY', dest='pixelStartY', default=None, type=int,\n      help=argparse.SUPPRESS)\n    parser.add_argument('--pixelStopX',  dest='pixelStopX', default=None, type=int,\n      help=argparse.SUPPRESS)\n    parser.add_argument('--pixelStopY',  dest='pixelStopY', default=None, type=int,\n      help=argparse.SUPPRESS)\n\n    # This call handles all the parallel_mapproject specific options.\n    (options, args) = parser.parse_known_args(argsIn)\n\n    if options.version:\n        asp_system_utils.print_version_and_exit()\n    \n    if not args and not options.version:\n        parser.print_help()\n        sys.exit(1)\n\n    # This can handle spaces in directory names, unlike when GNU parallel is in charge    \n    if options.runDir is not None:\n      os.chdir(options.runDir)\n\n    # Run an initial query to parse and validate the user input\n    sep = \",\"\n    verbose = False\n    progName = 'mapproject_single'\n    settings = asp_system_utils.run_and_parse_output(progName, args + ['--parse-options'],\n                                                     sep, verbose)\n    options.demPath    = settings[\"dem\"][0]\n    options.imagePath  = settings[\"image\"][0]\n    options.cameraPath = settings[\"camera\"][0]\n    options.outputPath = settings[\"output_file\"][0]\n\n    # Remove these entries from the arguments.\n    # TODO(oalexan1): This is fragile. What if we have the image file both on its own\n    # and as an argument to some option? That is not the case for now.\n    for v in [options.demPath, options.imagePath, options.cameraPath, options.outputPath]:\n        if v != \"\" and v in args:\n            args.remove(v)\n    \n    # This may contain --t_pixelwin, to be parsed later.\n    options.extraArgs = args\n\n    startTime = time.time()\n\n    # Determine if this is a main copy or a spawned copy\n    spawnedCopy = ((options.pixelStartX is not None) and \\\n                   (options.pixelStartY is not None) and \\\n                   (options.pixelStopX  is not None) and \\\n                   (options.pixelStopY  is not None) and \\\n                    options.workDir is not None)\n    \n    if spawnedCopy: \n        # This copy was spawned to process a single tile\n        return writeSingleTile(options) \n\n    # Now we are in the main process, not in a spawned copy\n\n    # See if this is the ISIS session. The image file or camera file\n    # must end in .cub (both are possible), but the camera file must\n    # not end in .json, as then the CSM session is used.\n    camExt =  os.path.splitext(options.cameraPath)[1].lower()\n    isIsis = (asp_image_utils.isIsisFile(options.imagePath) or\n              asp_image_utils.isIsisFile(options.cameraPath)) \\\n              and (camExt != '.json')\n    \n    # If the user did not set the tile size, then for ISIS use small\n    # tiles, to have them run in parallel as individual processes,\n    # since each process is necessarily single-threaded. For other\n    # cameras use bigger tiles, as each process is multi-threaded, and\n    # then file I/O is a bigger consideration.\n    if options.tileSize is None:\n        if isIsis:\n            options.tileSize = 1024\n        else:\n            options.tileSize = 5120\n            \n    # See if the input tif file has RPC coefficients embedded in it.\n    # In that case need to save them later in the output mapprojected\n    # image.\n    rpc_label = 'RPC Metadata'\n    rpc_dict  = parse_gdal_metadata(options.imagePath, rpc_label)\n    rpc_lines = format_metadata(rpc_label, rpc_dict)\n     \n    # Handle --query-pixel \n    if '--query-pixel' in options.extraArgs:\n      cmd = ['mapproject_single', options.demPath, options.imagePath, options.cameraPath,\n              options.outputPath] + options.extraArgs\n      p = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True)\n      ans, err = p.communicate()\n      print(ans)\n      return 0\n\n    # Handle --query-projection        \n    query_only = False\n    if '--query-projection' in options.extraArgs:\n        query_only = True\n        # Wipe this, it will be added later right below\n        asp_cmd_utils.wipe_option(options.extraArgs, '--query-projection', 0)\n\n    # Create the output folder if needed, before --query-projection writes the\n    # WKT file there\n    outputFolder = os.path.dirname(options.outputPath)\n    if outputFolder == '':\n        outputFolder = './'\n    asp_file_utils.createFolder(outputFolder)\n\n    # Run mapproject_single --query-projection to get image size and projection\n    queryArgs = ['--query-projection', options.demPath,\n                 options.imagePath, options.cameraPath, options.outputPath]\n    queryArgs = queryArgs + options.extraArgs\n    if options.noGeoHeaderInfo:\n        queryArgs += ['--no-geoheader-info']\n    sep = \",\"\n    queryVerbose = (query_only or not options.suppressOutput)\n    querySettings = asp_system_utils.run_and_parse_output(\n        'mapproject_single', queryArgs, sep, queryVerbose)\n\n    if query_only:\n        return 0\n\n    fullWidth  = int(querySettings['image_width'][0])\n    fullHeight = int(querySettings['image_height'][0])\n    print('Output image size is ' + str(fullWidth) + ' by ' + str(fullHeight) + ' pixels.')\n\n    # For now we just break up the image into a user-specified tile size (default 1000x1000)\n    numTilesX, numTilesY, tileList = generateTileList(fullWidth, fullHeight, options.tileSize)\n    numTiles = numTilesX * numTilesY\n\n    print('Splitting into ' + str(numTilesX) + ' by ' + str(numTilesY) + ' tiles.')\n\n    outputName = os.path.basename(options.outputPath)\n\n    # Make a temporary directory to store the tiles\n    if options.workDir:\n        tempFolder = options.workDir\n    else: # No folder provided, create a default one\n        tempFolder = os.path.join(outputFolder, outputName.replace('.', '_') + '_tiles/')\n    asp_file_utils.createFolder(tempFolder)\n\n    # Generate a text file that contains the boundaries for each tile\n    argumentFilePath = os.path.join(tempFolder, 'argumentList.txt')\n    with open(argumentFilePath, 'w') as argumentFile:\n        for tile in tileList:\n            argumentFile.write(str(tile[0]) + '\\t' + str(tile[1]) + '\\t'\n                               + str(tile[2]) + '\\t' + str(tile[3]) + '\\n')\n\n    # Indicate to GNU Parallel that there are multiple tab-separated\n    # variables in the text file we just wrote\n    parallelArgs = ['--colsep', \"\\\\t\"]\n\n    if options.parallel_options is not None:\n        parallelArgs += options.parallel_options.split(' ')\n\n    # Get the number of available nodes and CPUs per node\n    numNodes = asp_system_utils.getNumNodesInList(options.nodesListPath)\n\n    # We assume all machines have the same number of CPUs (cores)\n    cpusPerNode = asp_system_utils.get_num_cpus()\n\n    processesPerCpu = 1\n\n    # Handle the situation that both --processes and --num-processes can happen\n    if (options.numProcesses is not None) and (options.numProcesses2 is not None):\n        raise Exception(\"Cannot set both --processes and --num-processes.\")\n    if options.numProcesses is None and (options.numProcesses2 is not None):\n        # Copy over --num-processes to --processes\n        options.numProcesses = options.numProcesses2\n    \n    # Set the optimal number of processes if the user did not specify\n    if not options.numProcesses:\n        options.numProcesses = cpusPerNode * processesPerCpu\n\n    # Note: mapproject can run with multiple threads on non-ISIS data but we don't use that\n    # functionality here since we call mapproject with one tile at a time.\n\n    # No need for more processes than their are tiles!\n    if options.numProcesses > numTiles:\n        options.numProcesses = numTiles\n\n    # Build the command line that will be passed to GNU parallel\n    # - The numbers in braces will receive the values from the text file we wrote earlier\n    # - The output path used here does not matter since spawned copies compute the correct tile path.\n    python_path = sys.executable # children must use same Python as parent\n    # We use below the libexec_path to call python, not the shell script\n    mapproject_path = asp_system_utils.libexec_path('mapproject')\n    commandList   = [python_path, mapproject_path,\n                     '--pixelStartX', '{1}',\n                     '--pixelStartY', '{2}',\n                     '--pixelStopX',  '{3}',\n                     '--pixelStopY',  '{4}',\n                     '--work-dir', tempFolder,\n                     options.demPath,\n                     options.imagePath, options.cameraPath,\n                     options.outputPath]\n    if '--threads' not in options.extraArgs:\n        commandList = commandList + ['--threads', '8'] # If not specified use 8 threads\n    if options.convertTiles:\n        commandList = commandList + ['--convert-tiles']\n    if options.suppressOutput:\n        commandList = commandList + ['--suppress-output']\n    commandList = commandList + options.extraArgs # Append other options\n\n    # Append the run directory\n    runDir = asp_system_utils.escape_token(os.getcwd())\n    commandList = commandList + ['--run-dir', runDir]\n     \n    # Prepend the parallel arguments\n    commandList = parallelArgs + commandList\n\n    # Use GNU parallel call to distribute the work across computers\n    # - This call will wait until all processes are finished\n    verbose = True\n    asp_system_utils.runInGnuParallel(options.numProcesses, \n                                      argumentFilePath, commandList, \n                                      options.nodesListPath, verbose)\n\n    # Find the tiles that were generated\n    tiles = []\n    for tile in tileList:\n        outTile = os.path.join(tempFolder, tile[4])\n        if os.path.exists(outTile):\n            tiles.append(outTile)\n        else:\n            print(\"Warning: Skipping non-existing file: \", outTile)\n    if len(tiles) == 0:\n        print(\"Removing: \" + tempFolder)\n        asp_file_utils.removeFolderIfExists(tempFolder)\n        raise Exception(\"No mapprojected tif tiles were generated. Examine the \" + \\\n                        \"output above for more information.\")\n\n    # Build a gdal VRT file which is composed of all the processed tiles\n    vrtPath = os.path.join(tempFolder, 'mosaic.vrt')\n    cmd = \"gdalbuildvrt -resolution highest \" + vrtPath + \" \" + \" \".join(tiles)\n    ret = subprocess.call([\"gdalbuildvrt\", \"-resolution\", \"highest\", vrtPath]+tiles)\n    if ret != 0:\n        print(\"gdalbuildvrt error \", ret)\n        exit(1)\n\n    # Modify the vrt to append some metadata from the original tiles or the input file\n    if not options.noGeoHeaderInfo:\n        meta_label = 'Metadata'\n        meta_dict  = parse_gdal_metadata(tiles[0], meta_label)\n        meta_lines = format_metadata(meta_label, meta_dict)\n\n        # Insert the metadata after the first line in the vrt.\n        f = open(vrtPath, \"r\")\n        lines = f.readlines()\n        lines_before = [ lines[0] ]\n        lines_after  = lines[1:len(lines)]\n        f.close()\n\n        lines = lines_before + meta_lines\n\n        if len(rpc_dict) > 0:\n            lines += rpc_lines\n\n        lines += lines_after\n        \n        f = open(vrtPath, \"w\")\n        f.writelines(lines)\n        f.close()\n\n    # Convert VRT file to final output file\n    cmd = \"gdal_translate -co BIGTIFF=IF_SAFER \"\n    if options.cog:\n        # Use GDAL COG driver for cloud-optimized output. This ignores the\n        # INTERLEAVE, TILED options.\n        cmd += \"-of COG -co COMPRESS=DEFLATE -co BLOCKSIZE=512 \"\n    else:\n        # Standard tiled GeoTIFF\n        cmd += \"-co INTERLEAVE=BAND -co TILED=yes -co compress=lzw -co BLOCKXSIZE=256 -co BLOCKYSIZE=256 \"\n    cmd += vrtPath + \" \" + options.outputPath\n    print(cmd)\n    ans = os.system(cmd)\n\n    # Clean up temporary files\n    if not options.keep:\n        print(\"Removing: \" + tempFolder)\n        asp_file_utils.removeFolderIfExists(tempFolder)\n\n    if ans == 0: \n        print(\"Wrote: \" + options.outputPath)\n        maybe_copy_rpc(options.imagePath, options.outputPath)\n\n    endTime = time.time()\n    print(\"Finished in \" + str(endTime - startTime) + \" seconds.\")\n\nif __name__ == \"__main__\":\n    sys.exit(main(sys.argv[1:]))\n"
  },
  {
    "path": "src/asp/Tools/mapproject_single.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file mapproject.cc\n///\n/// This program will project a camera image onto a DEM using the\n/// camera model.\n/// TODO: This creates an RGBA output for an RGB input.\n/// It should create an RBG output for RGB input,\n/// and same for RGBA.\n\n#include <asp/Core/Macros.h>\n#include <asp/Core/AspProgramOptions.h>\n#include <asp/Sessions/StereoSessionFactory.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Camera/MapprojectImage.h>\n#include <asp/Sessions/CameraUtils.h>\n#include <asp/Core/DemUtils.h>\n#include <asp/Core/CartographyUtils.h>\n\n#include <vw/Cartography/CameraBBox.h>\n#include <vw/Cartography/DatumUtils.h>\n#include <vw/Camera/PinholeModel.h>\n#include <vw/Cartography/PointImageManipulation.h>\n#include <vw/FileIO/FileTypes.h>\n#include <vw/Image/ImageChannels.h>\n\n#include <fstream>\n#include <iomanip>\n\nusing namespace vw;\nusing namespace vw::cartography;\nnamespace po = boost::program_options;\nnamespace fs = boost::filesystem;\n\n/// The pixel type used for the DEM data\ntypedef PixelMask<float> DemPixelT;\n\nvoid handle_arguments(int argc, char *argv[], asp::MapprojOptions& opt) {\n  po::options_description general_options(\"\");\n  double NaN = std::numeric_limits<double>::quiet_NaN();\n  general_options.add_options()\n    (\"nodata-value\",     po::value(&opt.nodata_value)->default_value(-32768),\n     \"No-data value to use unless specified in the input image.\")\n    (\"t_srs\",            po::value(&opt.target_srs_string)->default_value(\"\"),\n     \"Specify the output projection as a GDAL projection string (WKT, GeoJSON, or PROJ). If not provided, use the one from the DEM.\")\n    (\"tr\",              po::value(&opt.tr)->default_value(NaN),\n     \"Set the output file resolution (ground sample distance) in target georeferenced \"\n     \"units per pixel. This may be in meters or degrees, depending on the projection. The \"\n     \"center of each output pixel will be at integer multiples of this grid size, unless \"\n     \"--gdal-tap is set.\")\n    (\"mpp\",              po::value(&opt.mpp)->default_value(NaN),\n     \"Set the output file resolution in meters per pixel.\")\n    (\"ppd\",              po::value(&opt.ppd)->default_value(NaN),\n     \"Set the output file resolution in pixels per degree.\")\n    (\"datum-offset\",     po::value(&opt.datum_offset)->default_value(0),\n     \"When projecting to a datum instead of a DEM, use this elevation in meters from the datum.\")\n    (\"query-projection\", po::bool_switch(&opt.query_projection)->default_value(false),\n     \"Display the computed projection information, estimated ground sample \"\n     \"distance, and projected bounding box. Quit afterwards.\")\n    (\"write-wkt\", po::bool_switch(&opt.write_wkt)->default_value(false),\n     \"When used with --query-projection, save the projection as a WKT \"\n     \"file named <output image>.wkt.\")\n    (\"session-type,t\",      po::value(&opt.stereo_session),\n     \"Select the stereo session type to use for processing. Usually the program can select this automatically by the file extension, except for xml cameras. See the doc for options.\")\n    (\"t_projwin\",        po::value(&opt.target_projwin),\n     \"Limit the mapprojected image to this region, with the corners given in georeferenced \"\n     \"coordinates (xmin ymin xmax ymax). See also --gdal-tap.\")\n    (\"t_pixelwin\",       po::value(&opt.target_pixelwin),\n     \"Limit the mapprojected image to this region, with the corners given in pixels (xmin ymin xmax ymax). Max is exclusive.\")\n    (\"gdal-tap\", po::bool_switch(&opt.gdal_tap)->default_value(false),\n     \"Ensure that the output image bounds (as printed by gdalinfo) are integer multiples \"\n     \"of the grid size (as set with --tr). When --t_projwin is set and its entries are \"\n     \"integer multiples of the grid size, that precise extent will be produced on output. \"\n     \"This functions as the GDAL -tap option.\")\n    (\"bundle-adjust-prefix\", po::value(&opt.bundle_adjust_prefix),\n     \"Use the camera adjustment obtained by previously running bundle_adjust with this output prefix.\")\n    (\"ref-map\", po::value(&opt.ref_map)->default_value(\"\"),\n     \"Read the projection and grid size from this mapprojected image.\")\n    (\"ot\",  po::value(&opt.output_type)->default_value(\"Float32\"), \n     \"Output data type, when the input is single channel. Supported types: Byte, UInt16, \"\n     \"Int16, UInt32, Int32, Float32. If the output type is a kind of integer, values are \"\n     \"rounded and then clamped to the limits of that type. This option will be ignored for \"\n     \"multi-channel images, when the output type is set to be the same as the input type.\")\n    (\"nearest-neighbor\", po::bool_switch(&opt.nearest_neighbor)->default_value(false),\n     \"Use nearest neighbor interpolation.  Useful for classification images.\")\n    (\"mo\",  po::value(&opt.metadata)->default_value(\"\"), \"Write metadata to the output file. Provide as a string in quotes if more than one item, separated by a space, such as 'VAR1=VALUE1 VAR2=VALUE2'. Neither the variable names nor the values should contain spaces.\")\n    (\"no-geoheader-info\", po::bool_switch(&opt.noGeoHeaderInfo)->default_value(false),\n     \"Do not write metadata information in the geoheader. See the doc for more info.\")\n    (\"query-pixel\", po::value(&opt.query_pixel)->default_value(vw::Vector2(NaN, NaN)),\n     \"Trace a ray from this input image pixel (values start from 0) to the ground. \"\n     \"Print the intersection point with the DEM as lon, lat, height, then \"\n     \"as DEM column, row, height. Quit afterwards.\")\n    (\"parse-options\", po::bool_switch(&opt.parseOptions)->default_value(false),\n     \"Parse the options and print the results. Used by the mapproject script.\")\n    ;\n  general_options.add(vw::GdalWriteOptionsDescription(opt));\n\n  po::options_description positional(\"\");\n  positional.add_options()\n    (\"dem\",          po::value(&opt.dem_file))\n    (\"camera-image\", po::value(&opt.image_file))\n    (\"camera-model\", po::value(&opt.camera_file))\n    (\"output-image\", po::value(&opt.output_file));\n\n  po::positional_options_description positional_desc;\n  positional_desc.add(\"dem\",          1);\n  positional_desc.add(\"camera-image\", 1);\n  positional_desc.add(\"camera-model\", 1);\n  positional_desc.add(\"output-image\", 1);\n\n  std::string usage(\"[options] <dem> <camera-image> <camera-model> <output-image>\\nInstead of the DEM file, a datum can be provided, such as\\nWGS84, NAD83, NAD27, D_MOON, D_MARS, and MOLA.\");\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line(argc, argv, opt, general_options, general_options,\n                            positional, positional_desc, usage,\n                            allow_unregistered, unregistered);\n\n  if (!vm.count(\"dem\") || !vm.count(\"camera-image\") || !vm.count(\"camera-model\"))\n    vw_throw(ArgumentErr() << \"Not all of the input DEM, image, and camera were specified.\\n\"\n             << usage << general_options);\n\n  // If exactly three files were passed in, the last one must be the output file and the image file\n  // must contain the camera model.\n  if (!vm.count(\"output-image\") && vm.count(\"camera-model\")) {\n    opt.output_file = opt.camera_file;\n    opt.camera_file = \"\";\n  }\n\n  // This is a bug fix. The user by mistake passed in an empty projection string.\n  if (!vm[\"t_srs\"].defaulted() && opt.target_srs_string.empty())\n    vw_throw(ArgumentErr()\n             << \"The value of --t_srs is empty. Then it must not be set at all.\\n\");\n\n  if (vw::has_cam_extension(opt.output_file))\n    vw_throw(ArgumentErr() << \"The output file is a camera. Check your inputs.\\n\");\n\n  if (opt.parseOptions) {\n    // For the benefit of mapproject\n    vw_out() << \"dem,\" << opt.dem_file << \"\\n\";\n    vw_out() << \"image,\" << opt.image_file << \"\\n\";\n    vw_out() << \"camera,\" << opt.camera_file << \"\\n\";\n    vw_out() << \"output_file,\" << opt.output_file << \"\\n\";\n    exit(0);\n  }\n\n  // Need this to be able to load adjusted camera models. That will happen\n  // in the stereo session.\n  asp::stereo_settings().bundle_adjust_prefix = opt.bundle_adjust_prefix;\n  if (!opt.ref_map.empty()) {\n    // Ensure that --ref-map and --t_srs are not both set\n    if (!opt.target_srs_string.empty())\n      vw_throw(ArgumentErr() << \"Cannot specify both --ref-map and --t_srs.\\n\");\n    if (!std::isnan(opt.tr))\n      vw_throw(ArgumentErr() << \"Cannot specify both --ref-map and --tr.\\n\");\n\n    // Read the georeference from the reference map and get its wkt\n    GeoReference ref_map_georef;\n    bool has_georef = vw::cartography::read_georeference(ref_map_georef, opt.ref_map);\n    if (!has_georef)\n      vw_throw(ArgumentErr() << \"The reference map has no georeference.\\n\");\n    opt.target_srs_string = ref_map_georef.get_wkt();\n    \n    // Set opt.tr\n    opt.tr = ref_map_georef.transform()(0, 0);\n  }\n\n  if (fs::path(opt.dem_file).extension() != \"\") {\n    // A path to a real DEM file was provided, load it!\n    GeoReference dem_georef;\n    bool has_georef = vw::cartography::read_georeference(dem_georef, opt.dem_file);\n    if (!has_georef)\n      vw_throw(ArgumentErr() << \"There is no georeference information in: \"\n                             << opt.dem_file << \".\\n\");\n\n    // Make sure the user did not actually pass in an RGB image\n    boost::shared_ptr<DiskImageResource> dem_rsrc = vw::DiskImageResourcePtr(opt.dem_file);\n    ImageFormat dem_fmt = dem_rsrc->format();\n    const int num_input_channels = num_channels(dem_fmt.pixel_format);\n    if (num_input_channels > 2)\n      vw_throw(ArgumentErr() << \"Too many channels in: \" << opt.dem_file << \".\\n\");\n\n    // Store the datum from the DEM\n    // TODO (oalexan1): Storing the datum name is fragile.\n    asp::stereo_settings().datum = dem_georef.datum().name();\n  }\n\n  return;\n}\n\n/// Compute which camera pixel observes a DEM pixel.\nVector2 demPixToCamPix(Vector2i const& dem_pixel,\n                      boost::shared_ptr<camera::CameraModel> const& camera_model,\n                      ImageViewRef<DemPixelT> const& dem,\n                      GeoReference const &dem_georef) {\n  Vector2 lonlat = dem_georef.point_to_lonlat(dem_georef.pixel_to_point(dem_pixel));\n  DemPixelT height = dem(dem_pixel[0], dem_pixel[1]);\n  Vector3 xyz = dem_georef.datum().geodetic_to_cartesian\n                    (Vector3(lonlat[0], lonlat[1], height.child()));\n  // Throws if the projection fails ???\n  Vector2i camera_pixel = camera_model->point_to_pixel(xyz);\n  return camera_pixel;\n}\n\n/// Expand the ground BBox to contain all the corners of the DEM if they intersect the camera.\n/// - TODO: This method still does not guarantee all points will be included in the bbox.\n/// - TODO: This should probably take pixel validity into account!\nvoid expandBboxToContainCornerIntersections(vw::CamPtr camera_model,\n                                            ImageViewRef<DemPixelT> const& dem,\n                                            GeoReference const &dem_georef,\n                                            Vector2i const& image_size,\n                                            BBox2 & bbox_on_ground) {\n  // Each of the corners of the DEM\n  std::vector<Vector2> dem_pixel_list(4);\n  dem_pixel_list[0] = Vector2(0,            0);\n  dem_pixel_list[1] = Vector2(dem.cols()-1, 0);\n  dem_pixel_list[2] = Vector2(dem.cols()-1, dem.rows()-1);\n  dem_pixel_list[3] = Vector2(0,            dem.rows()-1);\n\n  for (int i=0; i<4; i++) {\n    try{\n      // Project the DEM corner into the input image\n      Vector2 dem_pixel = dem_pixel_list[i];\n      Vector2 cam_pixel = demPixToCamPix(dem_pixel, camera_model, dem, dem_georef);\n\n      // Get the point on the ground\n      Vector2 groundLoc = dem_georef.pixel_to_point(dem_pixel);\n\n      // If there was in intersection\n      if (cam_pixel.x() >= 0 && cam_pixel.y() > 0 &&\n          cam_pixel.x() < image_size.x() && cam_pixel.y() < image_size.y()) {\n        bbox_on_ground.grow(groundLoc);\n      }\n    } catch(...) {} // projection failed\n  } // End loop through DEM points\n\n}\n\n/// Compute output georeference to use\nvoid calc_target_geom(// Inputs\n                      bool calc_target_res,\n                      Vector2i const& image_size,\n                      boost::shared_ptr<camera::CameraModel> const& camera_model,\n                      ImageViewRef<DemPixelT> const& dem,\n                      GeoReference const& dem_georef,\n                      bool proj_on_datum,\n                      asp::MapprojOptions const & opt,\n                      // Outputs\n                      BBox2 & cam_box, GeoReference & target_georef,\n                      int & outCols, int & outRows) {\n\n  // Find the camera bbox and the target resolution unless user-supplied.\n  // - This call returns the bounding box of the camera view on the ground.\n  // - The bounding box is in units defined by dem_georef and might not be meters.\n  // - auto_res is an estimate of the ground resolution visible by the camera.\n  //   This is in a unit defined by dem_georef and also might not be meters.\n  // - This call WILL intersect pixels outside the dem valid area!\n  // - TODO: Modify this function to optionally disable intersection outside the DEM\n  float auto_res = -1.0;  // will be updated\n  bool quick = proj_on_datum; // Quick mode when no actual DEM\n  try {\n    cam_box = camera_bbox(dem, dem_georef, target_georef, camera_model,\n                          image_size.x(), image_size.y(), auto_res, quick);\n  } catch (std::exception const& e) {\n    if (opt.target_projwin == BBox2() || calc_target_res) {\n      vw_throw(ArgumentErr()\n                << e.what() << \"\\n\"\n                << \"Check your inputs. Or try specifying --t_projwin and --tr values.\\n\");\n    }\n  }\n\n  // Use auto-calculated ground resolution if that option was selected\n  double current_resolution;\n  if (calc_target_res) {\n    current_resolution = auto_res;\n  } else {\n    // Set the resolution from input options\n    if (target_georef.is_projected()) {\n      current_resolution = opt.mpp; // Use units of meters\n    } else { // Not projected, GDC coordinates only.\n      // Use units of degrees. Lat/lon degrees are different so, this should be avoided.\n      current_resolution = 1/opt.ppd;\n    }\n  }\n\n  // Important sanity checks\n  if (current_resolution < 0.001 * auto_res)\n        vw::vw_throw(vw::ArgumentErr() \n          << \"The user-set grid size (option --tr) is so small that likely it is in degrees, \"\n          << \"while meters are expected.\\n\");\n  // For a lesser discrepancy, just print a warning.\n  if (current_resolution < 0.1 * auto_res)\n    vw_out(vw::WarningMessage) \n          << \"The user-provided grid size (--tr) is \" << current_resolution << \", \"\n          << \"which is smaller than the auto-estimated grid size of \" \n          << auto_res << \". Likely the resulting mapprojected image will not be accurate.\\n\";\n\n  // If an image bounding box (projected coordinates) was passed in,\n  // override the camera's view on the ground with the custom box.\n  // The user needs to know the georeference projected coordinate\n  // system (using the query command) to do this.\n  if (opt.target_projwin != BBox2()) {\n    cam_box = opt.target_projwin;\n    if (cam_box.min().y() > cam_box.max().y())\n      std::swap(cam_box.min().y(), cam_box.max().y());\n  }\n\n  // When projwin is set without --gdal-tap, convert pixel edges to centers,\n  // then round to nearest grid multiples. When edges are at half-grid points\n  // (the normal case from a previous mapproject), the inset lands exactly on\n  // grid centers and round is a no-op. Unlike floor/ceil, round tolerates\n  // float noise without overshooting by a grid step.\n  // For auto-computed bbox (no projwin), use floor/ceil to expand outward.\n  if (opt.target_projwin != BBox2() && !opt.gdal_tap) {\n    vw::Vector2 half(0.5 * current_resolution, 0.5 * current_resolution);\n    cam_box.min() += half;\n    cam_box.max() -= half;\n    double s = current_resolution;\n    cam_box.min() = s * round(cam_box.min() / s);\n    cam_box.max() = s * round(cam_box.max() / s);\n  } else {\n    asp::snapBBox2ToGrid(cam_box, current_resolution);\n  }\n\n  // Compute output image dimensions directly from the snapped extent.\n  // Without --gdal-tap, min and max are pixel centers at grid multiples,\n  // so +1 to include both endpoints. With --gdal-tap, min and max are pixel\n  // edges, so the count is (max - min) / res with no +1.\n  int endpointAdj = opt.gdal_tap ? 0 : 1;\n  outCols = (int)round((cam_box.max().x() - cam_box.min().x()) / current_resolution)\n            + endpointAdj;\n  outRows = (int)round((cam_box.max().y() - cam_box.min().y()) / current_resolution)\n            + endpointAdj;\n\n  // Set the geotransform. Pixel centers are at integer multiples of the grid\n  // size (PixelAsArea convention). The GDAL geotransform origin is the upper-left\n  // pixel edge, which is half a pixel before the first pixel center.\n  double delta = 0.0;\n  if (target_georef.pixel_interpretation() == GeoReference::PixelAsArea &&\n      !opt.gdal_tap)\n    delta = 0.5 * current_resolution;\n\n  Matrix3x3 T = target_georef.transform();\n  // Check polarity before overwriting T(0,0)\n  bool x_flipped = (T(0, 0) < 0);\n  T(0,0) = current_resolution;\n  T(1,1) = -current_resolution;\n  if (x_flipped)\n    T(0,2) = cam_box.max().x() + delta;\n  else\n    T(0,2) = cam_box.min().x() - delta;\n  T(1,2) = cam_box.max().y() + delta;\n  target_georef.set_transform(T);\n\n  // cam_box stays as the snapped projected extent (pixel-center grid).\n  // Downstream code uses outCols/outRows for image dimensions.\n\n  return;\n}\n\n// Automatic projection determination\nvoid calcAutoProj(GeoReference const& dem_georef,\n                  vw::CamPtr camera_model,\n                  Vector2i const& image_size,\n                  bool proj_on_datum,\n                  vw::ImageViewRef<DemPixelT> const& dem,\n                  GeoReference& target_georef) {\n\n  float auto_res = false; \n  bool quick = proj_on_datum; // Quick mode when no actual DEM\n  std::vector<vw::Vector3> *coords = NULL;\n  int num_samples = 100; // enough for projection center determination\n  BBox2 cam_box = camera_bbox(dem, dem_georef, target_georef, camera_model,\n                    image_size.x(), image_size.y(), auto_res, quick, coords, num_samples);\n  \n  BBox2 ll_box = target_georef.point_to_lonlat_bbox(cam_box);\n  if (ll_box.empty())\n    vw_throw(ArgumentErr() << \"Failed to determine the output projection.\\n\");\n\n  // The projection center is the box center\n  vw::Vector2 lonlat_ctr = (ll_box.min() + ll_box.max()) / 2.0;\n\n  asp::setAutoProj(lonlat_ctr.y(), lonlat_ctr.x(), target_georef);\n}                               \n\nint main(int argc, char* argv[]) {\n\n  asp::MapprojOptions opt;\n  try {\n    handle_arguments(argc, argv, opt);\n\n    // TODO: Replace this using the new CameraModelLoader functions. But those\n    // may not have the session guessing logic.\n    // We create a stereo session where both of the cameras and images\n    // are the same, because we want to take advantage of the stereo\n    // pipeline's ability to generate camera models for various\n    // missions.  Hence, we create two identical camera models, but only one is used.\n    asp::SessionPtr session(asp::StereoSessionFactory::create\n                       (opt.stereo_session, // in-out\n                        opt,\n                        opt.image_file, opt.image_file, // The same file is passed in twice\n                        opt.camera_file, opt.camera_file,\n                        opt.output_file,\n                        \"\", // Do not use a DEM to not make the session mapprojected\n                        false)); // Do not allow promotion from normal to map projected session\n\n    if (opt.output_file.empty())\n      vw_throw(ArgumentErr() << \"Missing output filename.\\n\");\n\n    // Additional checks once the stereo session is determined.\n\n    if (opt.stereo_session == \"perusat\")\n      vw_out(WarningMessage) << \"Images mapprojected using the '\" << opt.stereo_session\n                             << \"' camera model cannot be used later for stereo. \"\n                             << \"If that is desired, please run mapproject with \"\n                             << \"'-t rpc' and a camera file having an RPC model.\\n\";\n\n    // If nothing else works\n    // TODO(oalexan1): Likely StereoSessionFactory already have this logic.\n    if (boost::iends_with(boost::to_lower_copy(opt.camera_file), \".xml\") &&\n         opt.stereo_session == \"\")\n      opt.stereo_session = \"rpc\";\n\n    // Initialize the camera model\n    opt.camera_model = session->camera_model(opt.image_file, opt.camera_file);\n\n    opt.multithreaded_model = session->supports_multi_threading();\n\n    {\n      // Safety check that the users are not trying to map project map\n      // projected images. This should not be an error as sometimes\n      // even raw images have some half-baked georeference attached to them.\n      GeoReference dummy_georef;\n      bool has_georef = vw::cartography::read_georeference(dummy_georef, opt.image_file);\n      if (has_georef)\n        vw_out(WarningMessage) << \"Your input camera image is already map-\"\n                               << \"projected. The expected input is required \"\n                               << \"to be unprojected or raw camera imagery.\\n\";\n    }\n\n    // If the query pixel option was set, run the query and exit\n    if (!std::isnan(opt.query_pixel[0]) && !std::isnan(opt.query_pixel[1])) {\n      asp::queryPixel(opt.dem_file, opt.camera_model, opt.query_pixel);\n      return 0;\n    }\n\n    // Load the DEM\n    bool proj_on_datum = false;\n    GeoReference dem_georef;\n    ImageViewRef<DemPixelT> dem;\n    if (fs::path(opt.dem_file).extension() != \"\") {\n      // A path to a real DEM file was provided, load it!\n\n      bool has_georef = vw::cartography::read_georeference(dem_georef, opt.dem_file);\n      if (!has_georef)\n        vw_throw(ArgumentErr() << \"There is no georeference information in: \"\n                  << opt.dem_file << \".\\n\");\n\n      boost::shared_ptr<DiskImageResource> dem_rsrc(DiskImageResourcePtr(opt.dem_file));\n\n      // If we have a nodata value, create a mask.\n      DiskImageView<float> dem_disk_image(opt.dem_file);\n      if (dem_rsrc->has_nodata_read()) {\n        dem = create_mask(dem_disk_image, dem_rsrc->nodata_read());\n      } else {\n        dem = pixel_cast<DemPixelT>(dem_disk_image);\n      }\n    } else {\n      // Projecting to a datum instead of a DEM\n      proj_on_datum = true;\n      std::string datum_name = opt.dem_file;\n\n      // Use the camera center to determine whether to center the fake DEM on 0 or 180.\n      Vector3 cam_ctr = opt.camera_model->camera_center(Vector2());\n      Vector3 llr_camera_loc = cartography::XYZtoLonLatRadEstimateFunctor::apply(cam_ctr);\n      float lonstart = 0;\n      if ((llr_camera_loc[0] < 0) && (llr_camera_loc[0] > -180))\n        lonstart = -180;\n      dem_georef = GeoReference(Datum(datum_name),\n                                // Need adjustments to work at boundaries\n                                vw::Matrix3x3(1,  0, lonstart-0.5,\n                                              0, -1, 90+0.5,\n                                              0,  0,  1));\n      dem = constant_view(PixelMask<float>(opt.datum_offset), 360.0, 180.0);\n      vw_out() << \"\\t--> Using flat datum: \" << datum_name << \" as elevation model.\\n\";\n    }\n    // Finished setting up the datum\n\n    Vector2i image_size = vw::file_image_size(opt.image_file);\n\n    // Read projection. Work out output bounding box in points using original camera model.\n    GeoReference target_georef = dem_georef;\n\n    if ((opt.target_srs_string.empty() && !target_georef.is_projected()) ||\n        boost::to_lower_copy(opt.target_srs_string) == \"auto\") {\n       // Automatic projection determination\n       calcAutoProj(dem_georef, opt.camera_model, image_size, proj_on_datum, dem, \n                    target_georef); // output\n    } else if (!opt.target_srs_string.empty()) {\n      // Use specified proj4 string for the output georeference\n      bool have_user_datum = false;\n      Datum user_datum;\n      vw::cartography::set_srs_string(opt.target_srs_string, have_user_datum, user_datum,\n                          target_georef);\n    }\n\n    // The user datum and DEM datum must agree\n    bool warn_only = false;\n    vw::checkDatumConsistency(dem_georef.datum(), target_georef.datum(), warn_only);\n\n    // Find the target resolution based --tr, --mpp, and --ppd if provided. Do\n    // the math to convert pixel-per-degree to meter-per-pixel and vice-versa.\n    int sum = (!std::isnan(opt.tr)) + (!std::isnan(opt.mpp)) + (!std::isnan(opt.ppd));\n    if (sum >= 2)\n      vw::vw_throw(vw::ArgumentErr()\n               << \"Must specify at most one of the options: --tr, --mpp, --ppd.\\n\");\n\n    double radius = target_georef.datum().semi_major_axis();\n    if (!std::isnan(opt.tr)) { // --tr was set\n      if (target_georef.is_projected()) {\n        if (std::isnan(opt.mpp)) \n          opt.mpp = opt.tr; // User must have provided be m / pixel\n      } else {\n        if (std::isnan(opt.ppd)) \n          opt.ppd = 1.0/opt.tr; // User must have provided degrees per pixel\n      }\n    }\n\n    if (!std::isnan(opt.mpp) && std::isnan(opt.ppd)) // Meters per pixel was set\n      opt.ppd = 2.0*M_PI*radius/(360.0*opt.mpp);\n    if (!std::isnan(opt.ppd) && std::isnan(opt.mpp)) // Pixels per degree was set\n      opt.mpp = 2.0*M_PI*radius/(360.0*opt.ppd);\n\n    bool user_provided_resolution = (!std::isnan(opt.ppd));\n    bool     calc_target_res = !user_provided_resolution;\n    BBox2 cam_box;\n    // Output image dimensions. The full image is never realized in memory\n    // because it is written in tiles.\n    int outCols = 0, outRows = 0;\n    calc_target_geom(// Inputs\n                     calc_target_res, image_size, opt.camera_model,\n                     dem, dem_georef, proj_on_datum, opt,\n                     // Outputs\n                     cam_box, target_georef, outCols, outRows);\n\n    // Set a high precision, as the numbers can come out big for UTM\n    vw_out() << std::setprecision(17) << \"Projected space bounding box: \" << cam_box << \"\\n\";\n\n    // Shrink output image BB if an output image BB was passed in\n    GeoReference crop_georef = target_georef;\n    BBox2i crop_bbox(0, 0, outCols, outRows);\n    if (opt.target_pixelwin != BBox2()) {\n      // Replace with passed-in bounding box\n      crop_bbox = opt.target_pixelwin;\n\n      // Update output georeference to match the reduced image size\n      crop_georef = vw::cartography::crop(target_georef, crop_bbox);\n    }\n\n    // Print an explanation for a potential problem.\n    if (outCols <= 0 || outRows <= 0)\n      vw_throw(ArgumentErr() << \"Computed output image size is not positive. \"\n                << \"This can happen if the projection is in meters while the \"\n                << \"grid size is either in degrees or too large for the given input.\\n\");\n\n    // Form the lon-lat bounding box of the output image. This helps with\n    // geotransform operations and should be done any time a georef is modified.\n    BBox2 image_bbox(0, 0, outCols, outRows);\n    crop_georef.ll_box_from_pix_box(image_bbox);\n\n    if (opt.query_projection) {\n\n      std::string wkt_file = opt.output_file + \".wkt\";\n\n      // Optionally save the projection to a WKT file named <output>.wkt\n      if (opt.write_wkt) {\n        std::ofstream ofs(wkt_file.c_str());\n        if (!ofs.good())\n          vw_throw(ArgumentErr() << \"Failed to open for writing: \"\n                   << wkt_file << \"\\n\");\n        ofs << crop_georef.get_wkt() << \"\\n\";\n        ofs.close();\n      }\n\n      // Structured output for the Python mapproject wrapper to parse.\n      // The comma separator must be in sync with the Python side.\n      vw_out() << std::setprecision(17)\n               << \"Query results:\\n\"\n               << \"image_width,\" << outCols << \"\\n\"\n               << \"image_height,\" << outRows << \"\\n\"\n               << \"pixel_size,\" << crop_georef.transform()(0, 0) << \"\\n\"\n               << \"proj_box_xmin,\" << cam_box.min().x() << \"\\n\"\n               << \"proj_box_ymin,\" << cam_box.min().y() << \"\\n\"\n               << \"proj_box_xmax,\" << cam_box.max().x() << \"\\n\"\n               << \"proj_box_ymax,\" << cam_box.max().y() << \"\\n\";\n      if (opt.write_wkt)\n        vw_out() << \"projection_wkt_file,\" << wkt_file << \"\\n\";\n\n      return 0;\n    }\n\n    // For certain pinhole camera models the reverse check can make map\n    // projection very slow, so we disable it here.  The check is very important\n    // for computing the bounding box safely but we don't really need it when\n    // projecting the pixels back in to the camera.\n    auto pinhole_ptr = boost::dynamic_pointer_cast<vw::camera::PinholeModel>(opt.camera_model);\n    if (pinhole_ptr)\n      pinhole_ptr->set_do_point_to_pixel_check(false);\n\n    // Project the image depending on image format.\n    project_image(opt, dem_georef, target_georef, crop_georef, image_size,\n                  outCols, outRows, crop_bbox);\n\n  } ASP_STANDARD_CATCHES;\n\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/mer2camera.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n#include <vw/Camera/CAHVModel.h>\n#include <vw/Camera/CAHVORModel.h>\n#include <vw/Camera/CAHVOREModel.h>\n\n#include <asp/Core/Macros.h>\n#include <asp/Core/AspProgramOptions.h>\n\n#include <boost/filesystem/path.hpp>\n#include <boost/lexical_cast.hpp>\nnamespace fs = boost::filesystem;\n#include <boost/program_options.hpp>\nnamespace po = boost::program_options;\n#include <boost/foreach.hpp>\n\nusing namespace vw;\n\nstruct Options : public vw::GdalWriteOptions {\n  // Input\n  std::string img_file;\n\n  // Output\n  std::string output_prefix;\n};\n\nvoid handle_arguments( int argc, char *argv[], Options& opt ) {\n  po::options_description general_options(\"\");\n  general_options.add_options()\n    (\"output-prefix,o\", po::value(&opt.output_prefix), \"Output prefix for new control network.\");\n  general_options.add( vw::GdalWriteOptionsDescription(opt) );\n\n  po::options_description positional(\"\");\n  positional.add_options()\n    (\"img-file\", po::value(&opt.img_file) );\n\n  po::positional_options_description positional_desc;\n  positional_desc.add(\"img-file\", 1);\n\n  std::string usage(\"[options] <img_file>\");\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line( argc, argv, opt, general_options, general_options,\n                             positional, positional_desc, usage,\n                             allow_unregistered, unregistered );\n\n  if ( opt.img_file.empty() )\n    vw_throw( ArgumentErr() << \"Missing required input file.\\n\"\n              << usage << general_options );\n  if ( opt.output_prefix.empty() )\n    opt.output_prefix = fs::path(opt.img_file).stem().string();\n}\n\nint main( int argc, char** argv ) {\n\n  Options opt;\n  try {\n    handle_arguments( argc, argv, opt );\n\n    std::string camera_type;\n    std::vector<std::string> camera_params;\n    { // Extracting important keys I need\n      std::ifstream image( opt.img_file.c_str(), std::ios::in );\n      std::list<std::string> objects;\n\n      std::string line;\n      while ( image.good() ) {\n        std::getline(image,line);\n        if ( line.empty() )\n          continue; // Skip blank lines\n        if ( line[0] == '/' && line[1] == '*' )\n          continue; // Skip comments\n\n        // Splitting\n        std::vector<std::string> tokens;\n        boost::split( tokens, line, boost::is_any_of(\"=\"),\n                      boost::token_compress_on );\n        if ( tokens.size() != 2 )\n          continue; // Handle only easy tokens\n        boost::trim(tokens[0]);\n        boost::trim(tokens[1]);\n        boost::to_lower(tokens[0]);\n        boost::to_lower(tokens[1]);\n        if ( tokens[0] == \"group\" ) {\n          objects.push_back(tokens[1]);\n          continue;\n        } else if ( tokens[0] == \"end_group\" ) {\n          if ( objects.back() != tokens[1] )\n            vw_throw( IOErr() << \"Object parsing error!\" );\n          if ( objects.back() == \"geometric_camera_model\" )\n            break; // I don't care to read anymore\n          objects.pop_back();\n          continue;\n        }\n\n        if ( objects.empty() )\n          continue; // Labels not in a group is useless\n\n        // For now .. only extracting camera model. However we could pull more.\n        if ( objects.back() == \"geometric_camera_model\" ) {\n          if ( tokens[0] == \"model_type\" )\n            camera_type = tokens[1];\n          if ( boost::starts_with(tokens[0],\"model_component_\") &&\n               boost::is_digit()(tokens[0][tokens[0].size()-1]) )\n            camera_params.push_back( tokens[1] );\n        }\n      }\n      image.close();\n    }\n\n    vw_out() << \"Found camera type: \" << camera_type << std::endl;\n    if ( camera_type != \"cahv\" && camera_type != \"cahvor\" &&\n         camera_type != \"cahvore\" )\n      vw_throw( IOErr() << \"Unknown camera type: \" << camera_type << \"\\n\" );\n\n    // Convert the camera properties to Vector3\n    std::vector<Vector3> camera_vectors;\n    BOOST_FOREACH( std::string const& str, camera_params ) {\n      std::vector<std::string> tokens;\n      boost::split( tokens, str, boost::is_any_of(\"(), \"),\n                    boost::token_compress_on );\n\n      // Hack to remove starting empty token. I don't understand why\n      // this happens.\n      if ( tokens[0].empty() )\n        tokens.erase(tokens.begin());\n      if ( tokens[tokens.size()-1].empty() )\n        tokens.erase(tokens.begin()+(tokens.size()-1));\n\n      if ( tokens.size() == 3 ) {\n        Vector3 temp;\n        temp[0] = boost::lexical_cast<double>(tokens[0]);\n        temp[1] = boost::lexical_cast<double>(tokens[1]);\n        temp[2] = boost::lexical_cast<double>(tokens[2]);\n        camera_vectors.push_back(temp);\n      } else if ( tokens.size() == 1 ) {\n        camera_vectors.push_back(Vector3(boost::lexical_cast<double>(tokens[0]),0,0));\n      } else {\n        vw_throw( IOErr() << \"Error parsing vector: \" << str << \"\\n\" );\n      }\n    }\n\n    // Writing out our results\n    if ( camera_type == \"cahv\" ) {\n      camera::CAHVModel camera( camera_vectors[0],\n                                camera_vectors[1],\n                                camera_vectors[2],\n                                camera_vectors[3] );\n      camera.write( opt.output_prefix + \".cahv\" );\n    } else if ( camera_type == \"cahvor\" ) {\n      camera::CAHVORModel camera( camera_vectors[0],\n                                  camera_vectors[1],\n                                  camera_vectors[2],\n                                  camera_vectors[3],\n                                  camera_vectors[4],\n                                  camera_vectors[5] );\n      camera.write( opt.output_prefix + \".cahvor\" );\n    } else if ( camera_type == \"cahvore\" ) {\n      camera::CAHVOREModel camera( camera_vectors[0],\n                                   camera_vectors[1],\n                                   camera_vectors[2],\n                                   camera_vectors[3],\n                                   camera_vectors[4],\n                                   camera_vectors[5],\n                                   camera_vectors[6],\n                                   camera_vectors[8][0]);\n      camera.write( opt.output_prefix + \".cahvore\" );\n    }\n  } ASP_STANDARD_CATCHES;\n\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/multi_stereo",
    "content": "#!/usr/bin/env python\n\n# Copyright (c) 2021, United States Government, as represented by the\n# Administrator of the National Aeronautics and Space Administration.\n#\n# All rights reserved.\n#\n# The \"ISAAC - Integrated System for Autonomous and Adaptive Caretaking\n# platform\" software is licensed under the Apache License, Version 2.0\n# (the \"License\"); you may not use this file except in compliance with the\n# License. You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n# License for the specific language governing permissions and limitations\n# under the License.\n\n\"\"\"\nPrepare for and then run stereo on many image pairs, and produce a fuse mesh.\n\"\"\"\n\nimport argparse, os, re, shutil, subprocess, sys, glob, shlex\nimport numpy as np\n\n# Set up the path to Python modules about to load\nbasepath    = os.path.abspath(sys.path[0])\npythonpath  = os.path.abspath(basepath + '/../Python')  # for dev ASP\nlibexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP\nsys.path.insert(0, basepath) # prepend to Python path\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\n\nimport asp_rig_utils\n\ndef process_args(args):\n    \"\"\"\n    Set up the parser and parse the args.\n    \"\"\"\n\n    parser = argparse.ArgumentParser(description = \"Parameters for multi_stereo.\")\n    \n    parser.add_argument(\"--rig_config\",  dest=\"rig_config\", default=\"\",\n                        help = \"Rig configuration file.\")\n    \n    parser.add_argument(\"--rig_sensor\", dest=\"rig_sensor\", default=\"\",\n                        help=\"Which rig sensors to use. Must be among the \"       + \\\n                        \"sensors specified via --rig_config. To use images from \" + \\\n                        \"several sensors, pass in a quoted list of them, \"        + \\\n                        \"separated by a space.\")\n\n    parser.add_argument(\"--camera_poses\", dest=\"camera_poses\",\n                        default=\"\", help= \"Read images and camera poses for this \" + \\\n                        \"sensor from this list.\")\n\n    parser.add_argument(\"--out_dir\", dest=\"out_dir\",\n                        default=\"\", help=\"The directory where to write the stereo \" + \\\n                        \"output, textured mesh, and other data.\")\n    \n    parser.add_argument(\"--stereo_options\", dest=\"stereo_options\",\n                        default=\"\", help=\"Options to pass to parallel_stereo. Use \" + \\\n                        \"double quotes around the full list and simple quotes \"   + \\\n                        \"if needed by an individual option, or vice-versa.\")\n    \n    parser.add_argument(\"--pc_filter_options\", dest=\"pc_filter_options\",\n                        default=\"\", help=\"Options to pass to pc_filter.\")\n\n    parser.add_argument(\"--mesh_gen_options\", dest=\"mesh_gen_options\",\n                        default=\"\", help=\"Options to pass to voxblox for mesh generation.\")\n    \n    # Note how the percent sign below is escaped, by writing: %%\n    parser.add_argument(\"--undistorted_crop_win\", dest=\"undistorted_crop_win\",\n                        default = \"\",\n                        help = \"The dimensions of the central image region to keep \" + \\\n                        \"after the internal undistortion step and before using \"     + \\\n                        \"it in stereo. Normally 85%% - 90%% of distorted (actual) \"  + \\\n                        \"image dimensions would do. Suggested the Astrobee images:\"  + \\\n                        \" sci_cam: '1250 1000' nav_cam: '1100 776'. haz_cam: '250 200'.\")\n    \n    parser.add_argument(\"--first_step\",  dest=\"first_step\", default=\"stereo\",\n                        help  = \"Let the first step run by this tool be one of: \" + \\\n                        \"'stereo', 'pc_filter', or 'mesh_gen'. \" + \\\n                        \"This allows resuming a run at a desired step. \" + \\\n                        \"The stereo subdirectories are deleted before that \" + \\\n                        \"step takes place.\")\n    \n    parser.add_argument(\"--left\",  dest=\"left\", default=\"\",\n                        help  = \"Instead of running pairwise stereo between every \" + \\\n                        \"image and the next one given in --camera_poses, use every \" + \\\n                        \"image from this list and corresponding one from the list \" + \\\n                        \"given by the --right option.\")\n\n    parser.add_argument(\"--right\",  dest=\"right\", default=\"\",\n                        help  = \"To be used with --left.\")\n    \n    parser.add_argument(\"--last_step\",  dest=\"last_step\", default=\"mesh_gen\",\n                        help  = \"The last step run by this tool. See ``--first_step`` \" + \\\n                        \"for allowed values.\")\n    \n    parser.add_argument(\"--first-image-index\",  dest=\"first_image_index\", default = None,\n                        type = int,\n                        help = \"The index of the first image to use for stereo, in the \"\n                        \"list of images. Indices start from 1. By default, use \" + \\\n                        \"all the images.\")\n    \n    parser.add_argument(\"--last-image-index\",  dest=\"last_image_index\", default = None,\n                        type = int, \n                        help = \"The index of the last image to use for stereo, in the \"\n                        \"list of images. Indices start from 1. By default, \" + \\\n                        \"use all the images.\")\n\n    args = parser.parse_args()\n\n    return args\n\ndef gen_pairs(args, all_distorted_images):\n    \"\"\"\n    Create pairs of indices for the images to run stereo on. By\n    default, use each image and the next in the list. Otherwise, if\n    args.left and args.right are specified, use pairs made up of one\n    image from the left list and corresponding one from the right\n    list.\n    \"\"\"\n    \n    index_pairs = []\n    if args.left == \"\" or args.right == \"\":\n        for t in range(len(all_distorted_images) - 1):\n            index_pairs.append((t, t + 1))\n        return index_pairs\n\n    dist_indices = asp_rig_utils.create_index_dict(all_distorted_images)\n    image_pairs = asp_rig_utils.read_image_pairs(args.left, args.right)\n    for pair in image_pairs:\n        left_index = dist_indices[pair[0]]\n        right_index = dist_indices[pair[1]]\n        index_pairs.append((left_index, right_index))\n    \n    return index_pairs\n\n# Assign to each step a number, given the order in which they should be done\nstep_dict = {\"stereo\": 0, \"pc_filter\": 1, \"mesh_gen\": 2}\n\ndef sanity_checks(args):\n\n    if args.camera_poses == \"\":\n        raise Exception(\"The path to the list having input images and poses was not specified.\")\n\n    if args.rig_config == \"\":\n        raise Exception(\"The path to the rig configuration was not specified.\")\n\n    if args.rig_sensor == \"\":\n        raise Exception(\"The rig sensor to use for texturing was not specified.\")\n\n    if args.out_dir == \"\":\n        raise Exception(\"The path to the output directory was not specified.\")\n\n    if args.undistorted_crop_win == \"\":\n        raise Exception(\"The undistorted crop win was not specified.\")\n\n    for step in [args.first_step, args.last_step]:\n        if step not in step_dict:\n            raise Exception(\"Invalid values specified for --first_step or --last_step.\")\n\n    if (args.first_image_index is not None or args.last_image_index is not None) and \\\n       (args.left != \"\" or args.right != \"\"):\n        raise Exception(\"Cannot use --first_image_index, --last_image_index \" +\n                        \"together with --left, --right.\")\n\n    if int(args.left == \"\") + int(args.right == \"\") == 1:\n        raise Exception(\"Must specify either both --left and --right, or none of them.\")\n        \ndef write_asp_and_voxblox_cameras(undist_intrinsics_file, distorted_images,\n                                  undistorted_images,\n                                  world_to_cam):\n\n    if len(undistorted_images) != len(world_to_cam):\n        raise Exception(\"Expecting as many undistorted images as cameras.\")\n    \n    (widx, widy, f, cx, cy) = asp_rig_utils.read_intrinsics(undist_intrinsics_file)\n    undist_image_dict = {}\n    for image in undistorted_images:\n        # Use the image name without dir and extension as a key\n        base = os.path.basename(image)\n        base = os.path.splitext(base)[0]\n        undist_image_dict[base] = image\n\n    # Collect the undistorted images for which camera info is present\n    undistorted_images_out = []\n    cameras = []\n    cam_to_world_files = []\n    count = 0\n    for dist_image in distorted_images:\n\n        base = os.path.basename(dist_image)\n        base = os.path.splitext(base)[0]\n        if base not in undist_image_dict:\n            raise Exception(\"Cannot find undistorted image for: \"  + dist_image)\n        undist_image = undist_image_dict[base]\n        tsai_file = os.path.splitext(undist_image)[0] + \".tsai\"\n\n        # Find the camera-to-world transform\n        cam_to_world = np.linalg.inv(world_to_cam[count])\n        asp_rig_utils.write_tsai_camera_file(tsai_file, f, cx, cy, cam_to_world)\n        \n        # For use with voxblox later\n        cam_to_world_file = os.path.splitext(undist_image)[0] + \"_cam2world.txt\"\n        asp_rig_utils.write_cam_to_world_matrix(cam_to_world_file, cam_to_world)\n\n        undistorted_images_out.append(undist_image)\n        cameras.append(tsai_file)\n        cam_to_world_files.append(cam_to_world_file)\n        \n        count = count + 1\n        \n    print(\"Found \" + str(len(undistorted_images)) + \" undistorted image(s).\")\n    print(\"Wrote: \" + str(count) + \" camera(s).\")\n\n    return (undistorted_images_out, cameras, cam_to_world_files)\n\ndef run_pair(left_image, right_image, left_cam, right_cam, args, sensor_dir, tool_base_dir,\n             first_step, last_step):\n\n    out_dir = args.out_dir + \"/\" + sensor_dir\n\n    left_prefix = os.path.basename(os.path.basename(left_image))\n    left_prefix, ext = os.path.splitext(left_prefix)\n\n    right_prefix = os.path.basename(os.path.basename(right_image))\n    right_prefix, ext = os.path.splitext(right_prefix)\n\n    stereo_dir = out_dir + \"/stereo/\" + left_prefix + \"_\" + right_prefix\n    stereo_prefix = stereo_dir + \"/run\"\n    pcd_file = stereo_prefix + '-PC-filter.pcd'\n    \n    if first_step <= 0 and last_step >= 0:\n        # Run stereo\n        if os.path.isdir(stereo_dir):\n            print(\"Will run stereo in existing directory: \" + stereo_dir)\n            ## Wipe the existing directory\n            #print(\"Removing recursively old directory: \" + stereo_dir)\n            #shutil.rmtree(stereo_dir)\n\n        # Split on spaces but keep quoted parts together. Wipe stray\n        # continuation lines.\n        args.stereo_options = args.stereo_options.replace('\\\\', ' ')\n        stereo_options = shlex.split(args.stereo_options)\n\n        # Run stereo\n        tool_path = asp_rig_utils.find_tool(tool_base_dir, 'parallel_stereo')\n        cmd = [tool_path] + stereo_options + \\\n              [left_image, right_image, left_cam, right_cam, stereo_prefix]\n        \n        # Allow this to fail, as perhaps not all stereo pairs are good\n        asp_rig_utils.run_cmd(cmd, quit_on_failure = False)\n\n    if first_step <= 1 and last_step >= 1:\n\n        # Split on spaces but keep quoted parts together\n        args.pc_filter_options = args.pc_filter_options.replace('\\\\', ' ')\n        pc_filter_options = shlex.split(args.pc_filter_options)\n\n        # Run pc_filter\n        tool_path = asp_rig_utils.find_tool(tool_base_dir, 'pc_filter')\n        cmd = [tool_path,\n               '--input-cloud',   stereo_prefix + '-PC.tif',\n               '--input-texture', stereo_prefix + '-L.tif',\n               '--output-cloud',  stereo_prefix + '-PC-filter.tif',\n               '--camera', left_cam] + \\\n               pc_filter_options\n\n        # Allow this to fail, as perhaps not all stereo pairs are good\n        asp_rig_utils.run_cmd(cmd, quit_on_failure = False)\n\n        # Run point2mesh. This is for debugging purposes, to be able\n        # to inspect each cloud.\n        # If we use -s 1 the .obj file is too big. But -s 4 is too coarse.\n        # TODO(oalexan1): Make creating these debug meshes optional.\n        # Run point2mesh\n        tool_path = asp_rig_utils.find_tool(tool_base_dir, 'point2mesh')\n        cmd = [tool_path, \"-s\", \"4\",\n               \"--texture-step-size\", \"1\",\n               stereo_prefix + '-PC-filter.tif',\n               stereo_prefix + '-L.tif']\n        asp_rig_utils.run_cmd(cmd, quit_on_failure = False)\n \n        # Write this in PCD format and in left camera's coordinates,\n        # so it can be merged later with voxblox\n        tool_path = asp_rig_utils.find_tool(tool_base_dir, 'pc_filter')\n        cmd = [tool_path,\n               '--input-cloud',   stereo_prefix + '-PC.tif',\n               '--input-texture', stereo_prefix + '-L.tif',\n               '--output-cloud',  pcd_file,\n               '--camera', left_cam,\n               '--transform-to-camera-coordinates',\n               '--output-weight', stereo_prefix + 'PC-weight.tif'] + \\\n               pc_filter_options\n        asp_rig_utils.run_cmd(cmd, quit_on_failure = False)\n\n    return pcd_file\n\ndef fuse_clouds(args, pairs, sensor_dir, tool_base_dir, undistorted_images, \n                cam_to_world_files):\n    \"\"\"\n    Fuse the results in a mesh with voxblox.\n    \"\"\"\n    \n    voxblox_index =  args.out_dir + \"/\" + sensor_dir + \"/voxblox_index.txt\"\n    fused_mesh = args.out_dir + \"/\" + sensor_dir + \"/fused_mesh.ply\"\n    print(\"Writing: \" + voxblox_index)\n    with open(voxblox_index, \"w\") as handle:\n        for t in range(len(pairs)):\n            L=pairs[t][0]\n            R=pairs[t][1]\n            handle.write(cam_to_world_files[L] + \"\\n\")\n            handle.write(pcd_files[t] + \"\\n\")\n\n    args.mesh_gen_options = args.mesh_gen_options.replace('\\\\', ' ')\n    mesh_gen_options = shlex.split(args.mesh_gen_options)\n    tool_path = asp_rig_utils.find_tool(tool_base_dir, 'voxblox_mesh')\n    cmd = [tool_path, '--index', voxblox_index,\n           '--output_mesh', fused_mesh] + \\\n           mesh_gen_options\n    asp_rig_utils.run_cmd(cmd, quit_on_failure = True)\n\nif __name__ == \"__main__\":\n\n    args = process_args(sys.argv)\n    sanity_checks(args)\n    asp_rig_utils.mkdir_p(args.out_dir)\n\n    sensors = args.rig_sensor.split()\n    sensor_dir = \"_\".join(sensors) # for when there are multiple sensors\n    tool_base_dir = os.path.dirname(os.path.dirname(os.path.abspath(sys.argv[0])))\n\n    # Read the images and camera poses\n    # TODO(oalexan1): Make the block below a function\n    all_distorted_images = []\n    all_undistorted_images = []\n    all_cams = []\n    all_cam_to_world_files = []\n    for sensor in sensors:\n\n        # For the case when only a subset of images is used, and those\n        # are set via lists\n        # TODO(oalexan1): Make this a function called parse_all_cameras()\n        lists = [\"\"]\n        if args.left != \"\" and args.right != \"\":\n            lists = [args.left, args.right]\n        distorted_images = []\n        world_to_cam = []\n        for subset_list in lists:\n            (local_distorted_images, local_world_to_cam) \\\n                                 = asp_rig_utils.parse_cameras(args.camera_poses,\n                                                           subset_list,\n                                                           sensor,\n                                                           args.first_image_index,\n                                                           args.last_image_index)\n            distorted_images += local_distorted_images\n            world_to_cam += local_world_to_cam\n            \n        # Write undistorted images\n        extension = '.tif' # use lossless .tif extension for undistorted images\n        extra_opts = []\n        suff = \"\"\n        (undist_intrinsics_file, undistorted_images, undist_dir) \\\n                                 = asp_rig_utils.undistort_images(args, sensor,\n                                                              distorted_images,\n                                                              tool_base_dir,\n                                                              extension, extra_opts, suff)\n        # Write camera poses in the format of ASP and voxblox\n        (undistorted_images, cameras, cam_to_world_files) \\\n                             = write_asp_and_voxblox_cameras(undist_intrinsics_file,\n                                                             distorted_images,\n                                                             undistorted_images,\n                                                             world_to_cam)\n        all_distorted_images += distorted_images\n        all_undistorted_images += undistorted_images\n        all_cams += cameras\n        all_cam_to_world_files += cam_to_world_files\n\n    # TODO(oalexan1): This must be parallelized like done for icebridge\n    # Run for each pair parallel_stereo and/or filtering. Even if desired\n    # to skip these steps, must go through the motions to produce\n    # some lists of files neded for mesh generation later.\n    pcd_files = []\n    pairs = gen_pairs(args, all_distorted_images)\n    for pair in pairs:\n        L = pair[0]\n        R = pair[1]\n        pcd_file = run_pair(all_undistorted_images[L], all_undistorted_images[R],\n                            all_cams[L], all_cams[R],\n                            args, sensor_dir, tool_base_dir,\n                            step_dict[args.first_step], step_dict[args.last_step])\n        print(\"got pcd file: \" + pcd_file)\n        pcd_files.append(pcd_file)\n        \n    if step_dict[args.first_step] <= 2 and step_dict[args.last_step] >= 2:\n        fuse_clouds(args, pairs, sensor_dir, tool_base_dir,\n                    all_undistorted_images, all_cam_to_world_files)\n"
  },
  {
    "path": "src/asp/Tools/n_align.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2018, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Joint n-cloud joint alignment. Reimplementing the Matlab code at\n// https://searchcode.com/file/13619767/Code/matlab/GlobalProcrustesICP/globalProcrustes.m\n// One tiny change is that that code had a little bug, when invoked\n// with 10 iterations it would actually do only 9. So, before\n// comparing this code's result to that one, un-comment the line which\n// says \"original incorrect logic\".  Based on the paper: Global\n// registration of multiple point clouds embedding the Generalized\n// Procrustes Analysis into an ICP framework by Toldo, Roberto and\n// Beinat, Alberto and Crosilla, Fabio.\n\n#include <asp/PcAlign/pc_align_utils.h>\n#include <asp/Core/AspProgramOptions.h>\n#include <asp/Core/AspLog.h>\n#include <asp/Core/Macros.h>\n#include <asp/Core/PointUtils.h>\n#include <asp/Core/EigenUtils.h>\n#include <asp/Core/PdalUtils.h>\n\n#include <vw/Cartography/GeoReference.h>\n#include <vw/Core/Stopwatch.h>\n#include <vw/FileIO/FileUtils.h>\n\n// Turn off warnings about things we can't control\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wdeprecated-declarations\"\n#include <flann/flann.hpp>\n#pragma GCC diagnostic pop\n\n#include <boost/filesystem.hpp>\n#include <boost/algorithm/string.hpp>\n\n#include <Eigen/Core>\n#include <Eigen/Geometry>\n\n#include <fstream>\n#include <iostream>\n#include <set>\n#include <vector>\n\nnamespace fs = boost::filesystem;\nnamespace po = boost::program_options;\n\nusing namespace vw;\nusing namespace vw::cartography;\nusing namespace asp;\n\ntypedef PointMatcher<double> PM;\ntypedef PM::DataPoints DP;\n\n// TODO: Figure out these magic numbers\n#define FIFTEEN 15\n#define ONE_TWO_EIGHT 128\n\ntypedef flann::Index<flann::L2<double>> KDTree_double;\n\n/// Options container\nstruct Options : public vw::GdalWriteOptions {\n  // Input\n  std::string in_prefix, in_transforms, datum, csv_format_str, csv_srs, csv_proj4_str; \n  int    num_iter, max_num_points;\n  double semi_major_axis, semi_minor_axis, rel_error_tol;\n  bool   save_transformed_clouds, align_to_first_cloud, verbose;\n  std::vector<std::string> cloud_files;\n  // Output\n  std::string out_prefix;\n\n  Options() {}\n};\n\nvoid handle_arguments(int argc, char *argv[], Options& opt) {\n  po::options_description general_options(\"\");\n  general_options.add_options()\n    (\"num-iterations\",           po::value(&opt.num_iter)->default_value(100),\n     \"Maximum number of iterations.\")\n    (\"max-num-points\", po::value(&opt.max_num_points)->default_value(1000000),\n     \"Maximum number of (randomly picked) points from each cloud to use.\")\n    (\"csv-format\",               po::value(&opt.csv_format_str)->default_value(\"\"), asp::csv_opt_caption().c_str())\n    (\"csv-srs\",      po::value(&opt.csv_srs)->default_value(\"\"), \n     \"The projection string to use to interpret the entries in input CSV files.\")\n    (\"datum\",                    po::value(&opt.datum)->default_value(\"\"),\n     \"Use this datum for CSV files instead of auto-detecting it. Options: WGS_1984, D_MOON (1,737,400 meters), D_MARS (3,396,190 meters), MOLA (3,396,000 meters), NAD83, WGS72, and NAD27. Also accepted: Earth (=WGS_1984), Mars (=D_MARS), Moon (=D_MOON).\")\n    (\"semi-major-axis\",          po::value(&opt.semi_major_axis)->default_value(0),\n     \"Explicitly set the datum semi-major axis in meters.\")\n    (\"semi-minor-axis\",          po::value(&opt.semi_minor_axis)->default_value(0),\n     \"Explicitly set the datum semi-minor axis in meters.\")\n    (\"output-prefix,o\",          po::value(&opt.out_prefix)->default_value(\"\"),\n     \"Specify the output prefix. The computed alignment transforms and, if desired, the transformed clouds, will be saved to names starting with this prefix.\")\n    (\"save-transformed-clouds\", po::bool_switch(&opt.save_transformed_clouds)->default_value(false)->implicit_value(true),\n     \"Apply the obtained alignment transforms to the input clouds and save them.\")\n    (\"initial-transforms-prefix\", po::value(&opt.in_prefix)->default_value(\"\"),\n     \"The prefix of the transforms to be used as initial guesses. The naming convention is the same as for the transforms written on output.\")\n    (\"initial-transforms\", po::value(&opt.in_transforms)->default_value(\"\"),\n     \"Specify the initial transforms as a list of files separated by spaces and in quotes, that is, as 'trans1.txt ... trans_n.txt'.\")\n    (\"relative-error-tolerance\", po::value(&opt.rel_error_tol)->default_value(1e-10),\n     \"Stop when the change in the error divided by the error itself is less than this.\")\n    (\"align-to-first-cloud\", po::bool_switch(&opt.align_to_first_cloud)->default_value(false)->implicit_value(true),\n     \"Align the other clouds to the first one, rather than to their common centroid.\")\n    (\"csv-proj4\", po::value(&opt.csv_proj4_str)->default_value(\"\"), \n     \"An alias for --csv-srs, for backward compatibility.\")\n    (\"verbose\", po::bool_switch(&opt.verbose)->default_value(false)->implicit_value(true),\n     \"Print the alignment error after each iteration.\")\n    ;\n\n  general_options.add(vw::GdalWriteOptionsDescription(opt));\n\n  po::options_description positional(\"\");\n  positional.add_options()\n    (\"cloud-files\", po::value<std::vector<std::string>>(&opt.cloud_files));\n  po::positional_options_description positional_desc;\n  positional_desc.add(\"cloud-files\", -1);\n  std::string usage(\"[options] <cloud-files> -o <output prefix>\");\n  \n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line(argc, argv, opt, general_options, general_options,\n                            positional, positional_desc, usage,\n                            allow_unregistered, unregistered);\n\n  if (opt.out_prefix.empty())\n    vw_throw(ArgumentErr() << \"Missing output prefix.\\n\" << usage << general_options);\n\n  // Create the output directory\n  vw::create_out_dir(opt.out_prefix);\n\n  // Turn on logging to file\n  asp::log_to_file(argc, argv, \"\", opt.out_prefix);\n\n  if (opt.num_iter < 0)\n    vw_throw(ArgumentErr() << \"The number of iterations must be non-negative.\\n\"\n              << usage << general_options);\n\n  // Must specify either csv_srs or csv_proj4_str, but not both. The latter is \n  // for backward compatibility.\n  if (!opt.csv_srs.empty() && !opt.csv_proj4_str.empty())\n    vw_throw(ArgumentErr() << \"Cannot specify both --csv-srs and --csv-proj4.\\n\");\n  if (!opt.csv_proj4_str.empty() && opt.csv_srs.empty())\n    opt.csv_srs = opt.csv_proj4_str;\n\n  if ((opt.semi_major_axis != 0 && opt.semi_minor_axis == 0) ||\n       (opt.semi_minor_axis != 0 && opt.semi_major_axis == 0)) {\n    vw_throw(ArgumentErr() << \"One of the semi-major or semi-minor axes\"\n              << \" was specified, but not the other one.\\n\"\n              << usage << general_options);\n  }\n\n  if (opt.semi_major_axis < 0 || opt.semi_minor_axis < 0) {\n    vw_throw(ArgumentErr() << \"The semi-major and semi-minor axes cannot \"\n                            << \"be negative.\\n\" << usage << general_options);\n  }\n\n  if (opt.datum != \"\" && opt.semi_major_axis != 0 && opt.semi_minor_axis != 0) {\n    vw_throw(ArgumentErr() << \"Both the datum string and datum semi-axes were \"\n                            << \"specified. At most one needs to be set.\\n\"\n                            << usage << general_options);\n  }\n\n  if (opt.cloud_files.size() < 2)\n    vw_throw(ArgumentErr() << \"Must have at least two clouds to align.\\n\"\n              << usage << general_options);\n\n  if (opt.in_prefix != \"\" && opt.in_transforms != \"\")\n    vw_throw(ArgumentErr() << \"Cannot specify both the initial transforms prefix \"\n              << \"and the list of initial transforms.\\n\" << usage << general_options);\n}\n\nbool triplet_less(vw::Vector3 const& p, vw::Vector3 const& q) {\n\n  if (p.x() < q.x()) return true;\n  if (p.x() > q.x()) return false;\n  \n  if (p.y() < q.y()) return true;\n  if (p.y() > q.y()) return false;\n    \n  if (p.z() < q.z()) return true;\n  if (p.z() > q.z()) return false;\n\n  return false;\n}\n\n// Define equality for pairs of integers\nbool operator==(std::pair<int, int> const& p, std::pair<int, int> const& q) {\n  return (p.first == q.first) && (p.second == q.second);\n}\n\n// An operator used to sort pairs of integers\nstruct CustomCompare {\n  bool operator()(std::pair<int, int> const& p, std::pair<int, int> const& q) const {\n    if (p.first < q.first) return true;\n    if (p.first > q.first) return false;\n    \n    if (p.second < q.second) return true;\n    if (p.second > q.second) return false;\n    \n    return false;\n  }\n};\n\nbool vector_less(Eigen::VectorXd const& p, Eigen::VectorXd const& q) {\n  for (int i = 0; i < p.size(); i++) {\n    if (p[i] < q[i]) return true;\n    if (p[i] > q[i]) return false;\n  }\n  return false;\n}\n\n// Convert a cloud from libpointmatcher's format to a vector of points\nvoid convert_cloud(DP const& in_cloud, std::vector<vw::Vector3> & out_cloud) {\n  out_cloud.clear();\n  for (int col = 0; col < in_cloud.features.cols(); col++) {\n    vw::Vector3 p;\n    for (int row = 0; row < 3; row++) \n      p[row] = in_cloud.features(row, col);\n    out_cloud.push_back(p);\n  }\n}\n\n// Apply a rotation + transform to a cloud\nvoid apply_transform_to_cloud(std::vector<vw::Vector3> & cloud, Eigen::MatrixXd const& T) {\n  for (std::size_t pointIter = 0; pointIter < cloud.size(); pointIter++) {\n    Eigen::VectorXd v(4);\n    v << cloud[pointIter][0], cloud[pointIter][1], cloud[pointIter][2], 1.0;\n    v = T*v;\n    for (int it = 0; it < 3; it++) \n      cloud[pointIter][it] = v[it];\n  }\n}\n\nvoid print_cloud(std::vector<vw::Vector3> const& cloud) {\n  for (std::size_t it = 0; it < cloud.size(); it++) {\n    vw_out() << cloud[it].x() << ' ' << cloud[it].y() << ' ' << cloud[it].z() << std::endl;\n  }\n}\n\nvoid sort_and_make_unique(std::vector<vw::Vector3> & cloud) {\n  std::sort(cloud.begin(), cloud.end(), triplet_less);\n  std::vector<vw::Vector3>::iterator it = std::unique(cloud.begin(), cloud.end());\n  cloud.resize(distance(cloud.begin(), it));\n}\n\nvoid BuildKDTree_double(std::vector<vw::Vector3> const& cloud, KDTree_double* tree) {\n  int rows = cloud.size();\n  int dim = vw::Vector3().size();\n\n  // Need to have this to avoid a seg fault later\n  if (rows*dim <= 0) \n    vw_throw(ArgumentErr() << \"Cannot operate on empty clouds.\\n\");\n  \n  std::vector<double> dataset(rows * dim);\n  flann::Matrix<double> dataset_mat(&dataset[0], rows, dim);\n  \n  for (int i = 0; i < rows; i++) {\n    for (int j = 0; j < dim; j++) {\n      dataset[i * dim + j] = cloud[i][j];\n    }\n  }\n\n  // Using the default leaf_max_size = 10 in flann::KDTreeSingleIndexParams()\n  KDTree_double temp_tree(dataset_mat, flann::KDTreeSingleIndexParams(FIFTEEN));\n  temp_tree.buildIndex();\n  *tree = temp_tree;\n}\n\nvoid SearchKDTree_double(KDTree_double* tree, const vw::Vector3& input, \n                         std::vector<int>& indices,\n                         std::vector<double>& dists, int nn) {\n  int rows_t = 1;\n  int dim = input.size();\n  \n  std::vector<double> query;\n  query.resize(rows_t*dim);\n  for (int i = 0; i < dim; i++)\n    query[i] = input[i];\n  flann::Matrix<double> query_mat(&query[0], rows_t, dim);\n  \n  indices.resize(rows_t*nn);\n  dists.resize(rows_t*nn);\n  flann::Matrix<int> indices_mat(&indices[0], rows_t, nn);\n  flann::Matrix<double> dists_mat(&dists[0], rows_t, nn);\n  \n  tree->knnSearch(query_mat, indices_mat, dists_mat, nn, flann::SearchParams(ONE_TWO_EIGHT));\n}\n\nstd::string transform_file(std::string const& out_prefix, int index) {\n  std::ostringstream os;\n  os << out_prefix << \"-transform-\" << index << \".txt\";\n  std::string transFile = os.str();\n  return transFile;\n}\n\n/// Save the transforms\nvoid write_n_transforms(std::vector<Eigen::MatrixXd> const& transVec,\n                        std::string const& out_prefix) {\n\n  for (std::size_t it = 0; it < transVec.size(); it++) {\n    std::string transFile = transform_file(out_prefix, it);\n    vw_out() << \"Writing: \" << transFile << std::endl;\n    write_transform(transVec[it], transFile);\n  }\n}\n\n/// Read the transforms. We assume we know their number.\nvoid read_transforms(std::vector<Eigen::MatrixXd> & transVec,\n\t\t     std::string const& in_prefix) {\n\n  for (std::size_t it = 0; it < transVec.size(); it++) {\n    std::string transFile = transform_file(in_prefix, it);\n    read_transform(transVec[it], transFile);\n  }\n}\n\n/// Read the transforms from a list. We assume we know their numbers.\nvoid read_transforms_from_list(std::vector<Eigen::MatrixXd> & transVec,\n                               std::string const& transform_list) {\n  std::istringstream is(transform_list);\n  for (std::size_t it = 0; it < transVec.size(); it++) {\n    std::string transFile;\n    if (!(is >> transFile))\n      vw_throw(ArgumentErr() << \"Cannot parse enough transform files from: \" << transform_list);\n    read_transform(transVec[it], transFile);\n  }\n}\n\nint main(int argc, char *argv[]) {\n\n  Options opt;\n  try {\n    handle_arguments(argc, argv, opt);\n\n    // Parse the csv format string and csv projection string\n    asp::CsvConv csv_conv;\n    csv_conv.parse_csv_format(opt.csv_format_str, opt.csv_srs);\n    \n    // Try to read the georeference/datum info\n    vw::cartography::GeoReference geo;\n    asp::read_georef(opt.cloud_files, opt.datum, opt.csv_srs,  \n                     opt.semi_major_axis, opt.semi_minor_axis,  \n                     opt.csv_format_str,  csv_conv, geo);\n\n    int numClouds = opt.cloud_files.size();\n\n    // The vector of transforms among the clouds\n    std::vector<Eigen::MatrixXd> transVec(numClouds);\n    for (int cloudIter = 0; cloudIter < numClouds; cloudIter++)\n      transVec[cloudIter] = Eigen::MatrixXd::Identity(4, 4);\n\n\n    // Check for COPC files, as those cannot be read\n    for (int cloudIter = 0; cloudIter < numClouds; cloudIter++) {\n       if (asp::isCopc(opt.cloud_files[cloudIter])) \n         vw::vw_throw(vw::ArgumentErr() << \"Cannot read LAZ COPC files.\\n\");\n    }\n\n    // Load the first subsampled point cloud. Calculate the shift to apply to\n    // all clouds. Then load the other clouds.\n    std::vector<std::vector<vw::Vector3>> clouds(numClouds);\n    vw::Vector3 shift;\n    bool   calc_shift = true; // Shift points so the first point is (0,0,0)\n    bool   is_lola_rdr_format = false;   // may get overwritten\n    double mean_ref_longitude    = 0.0;  // may get overwritten\n    double mean_source_longitude = 0.0;  // may get overwritten\n    BBox2 empty_box, copc_win;           // will not be used, part of the API\n    bool copc_read_all = false;          // will not be used, part of the API\n    DP in_cloud;\n    bool verbose = true;\n    load_cloud(opt.cloud_files[0], opt.max_num_points, empty_box,\n                copc_win, copc_read_all,\n                calc_shift, shift, geo, csv_conv, is_lola_rdr_format,\n                mean_ref_longitude, verbose, in_cloud);\n    convert_cloud(in_cloud, clouds[0]);\n    \n    vw_out() << \"Data shifted internally by subtracting: \" << shift << std::endl;\n    \n    calc_shift = false; // We will use the same shift from here on\n      \n    for (int cloudIter = 1; cloudIter < numClouds; cloudIter++) {\n      load_cloud(opt.cloud_files[cloudIter], opt.max_num_points, empty_box,\n                 copc_win, copc_read_all,\n                 calc_shift, shift, geo, csv_conv, is_lola_rdr_format,\n                 mean_ref_longitude, verbose, in_cloud);\n      convert_cloud(in_cloud, clouds[cloudIter]);\n    }\n    \n    // Read the clouds\n    for (int cloudIter = 0; cloudIter < numClouds; cloudIter++) {\n      sort_and_make_unique(clouds[cloudIter]);\n    }\n\n    // Read any initial transforms, either using a prefix or an explicit list\n    bool has_init_transform = false;\n    if (opt.in_prefix != \"\" || opt.in_transforms != \"\") {\n      has_init_transform = true;\n      if (opt.in_prefix != \"\") \n        read_transforms(transVec, opt.in_prefix);\n      else if (opt.in_transforms != \"\")\n        read_transforms_from_list(transVec, opt.in_transforms);\n      \n      // The point clouds are shifted, so shift the initial transforms as well.\n      for (int cloudIter = 0; cloudIter < numClouds; cloudIter++) \n        transVec[cloudIter] = apply_shift(transVec[cloudIter], shift);\n    }\n\n    // Apply the initial transforms to the clouds\n    if (has_init_transform) {\n      for (int cloudIter = 0; cloudIter < numClouds; cloudIter++) \n        apply_transform_to_cloud(clouds[cloudIter], transVec[cloudIter]);\n    }\n    \n    // Build the trees\n    std::vector<boost::shared_ptr<KDTree_double>> Trees;\n    for (int it = 0; it < numClouds; it++) {\n      boost::shared_ptr<KDTree_double>\n        tree(new KDTree_double(flann::KDTreeSingleIndexParams(FIFTEEN)));\n      BuildKDTree_double(clouds[it], tree.get());\n      Trees.push_back(tree);\n    }\n\n    std::string errCaption = std::string(\"Computing the error, defined as the mean of \") +\n      \"pairwise distances from each cloud to the centroid cloud.\\n\";\n    if (opt.verbose) vw_out() << errCaption;\n\n    // Mean error from the centroid cloud points to all matching\n    // points in all clouds.  We don't use the mean square error like\n    // the Matlab code, which had bugs in how it was computed anyway.\n    double initError = -1, errAfter = -1, prevError = -1; \n\n    Stopwatch sw1;\n    sw1.start();\n\n    vw::TerminalProgressCallback tpc(\"asp\", \"Performing alignment\\t--> \");\n    double inc_amount = 1.0 / std::max(opt.num_iter, 1);\n\n    // Don't display the progress in verbose mode, as then it interferes with\n    // printing of errors.\n    if (!opt.verbose)\n      tpc.report_progress(0);\n    \n    int step = 0; // Starting step\n    // int step = 1; // original incorrect logic in the Matlab code\n    while (step < opt.num_iter) {\n\n      bool firstStep = (step == 0);\n      bool lastStep  = (step == opt.num_iter - 1);\n      \n      std::vector<int> modelSpan(numClouds+1);\n      int numOfPoints = 0;\n      for (int it = 0; it < numClouds; it++) {\n        modelSpan[it] = numOfPoints;\n        numOfPoints += clouds[it].size();\n      }\n      modelSpan[numClouds] = numOfPoints;\n\n      // This will record for each point in each cloud which point in\n      // every other cloud is closest to it. This matrix will store the\n      // indices of these points.\n      std::vector<Eigen::VectorXd> CentroidPtsBelMod(numOfPoints);\n      for (std::size_t row = 0; row < CentroidPtsBelMod.size(); row++) {\n        CentroidPtsBelMod[row] = Eigen::VectorXd(numClouds);\n        for (int cloudIter = 0; cloudIter < numClouds; cloudIter++) {\n          CentroidPtsBelMod[row][cloudIter] = -1;\n        }\n      }\n    \n      for (std::size_t i = 0; i < numClouds; i++) {\n\n        //spanI = modelSpan(i)+1:modelSpan(i+1); \n        std::vector<int> spanI;\n        int beg = modelSpan[i], end = modelSpan[i+1] - 1;\n        for (int it = beg; it <= end; it++) spanI.push_back(it);\n        \n        //CentroidPtsBelMod(spanI,i) = 1:length(spanI);\n        for (std::size_t it = 0; it < spanI.size(); it++) {\n          CentroidPtsBelMod[spanI[it]][i] = it;\n        }\n\n        for (std::size_t j = i + 1; j < numClouds; j++) {\n        \n          //spanJ = modelSpan(j)+1:modelSpan(j+1); \n          std::vector<int> spanJ;\n          int beg = modelSpan[j], end = modelSpan[j+1] - 1;\n          for (int it = beg; it <= end; it++) spanJ.push_back(it);\n        \n          std::vector<int> match, match2;\n          std::vector<double> dist;\n          typedef std::set<std::pair<int, int>, CustomCompare> PairType;\n\n          // For each point in cloud i, find a match in cloud j\n          PairType Corr1;\n          for (std::size_t index_i = 0; index_i < clouds[i].size(); index_i++) {\n            SearchKDTree_double(Trees[j].get(), clouds[i][index_i], match, dist, 1);\n            if (match.empty()) continue; // should not happen\n            int index_j = match[0];\n            Corr1.insert(std::pair<int, int>(index_j, index_i));\n          }\n\n          // Now do it in reverse\n          PairType Corr2;\n          for (std::size_t index_j = 0; index_j < clouds[j].size(); index_j++) {\n            SearchKDTree_double(Trees[i].get(), clouds[j][index_j], match, dist, 1);\n            if (match.empty()) continue; // should not happen\n            int index_i = match[0];\n            Corr2.insert(std::pair<int, int>(index_j, index_i));\n          }\n\n          std::vector<std::pair<int, int>> Corr;\n          for (PairType::iterator it = Corr1.begin(); it != Corr1.end(); it++) {\n            PairType::iterator it2 = Corr2.find(*it);\n            if (it2 == Corr2.end()) continue;\n\n            Corr.push_back(*it);\n          }\n\n          for (std::size_t it = 0; it < Corr.size(); it++) {\n            // CentroidPtsBelMod(spanI(Corr(:,2)),j) = Corr(:,1)';\n            CentroidPtsBelMod[spanI[Corr[it].second]][j] = Corr[it].first;\n\n            // CentroidPtsBelMod(spanJ(Corr(:,1)),i) = Corr(:,2)';\n            CentroidPtsBelMod[spanJ[Corr[it].first]][i] = Corr[it].second;\n          }\n\n        }\n      }\n\n      std::sort(CentroidPtsBelMod.begin(), CentroidPtsBelMod.end(), vector_less);\n\n      // Remove non-unique elements, and remove entries which exist only in one cloud\n      int pos = 0;\n      for (std::size_t row = 0; row < CentroidPtsBelMod.size(); row++) {\n\n        int num_good = 0;\n        for (int cloudIter = 0; cloudIter < CentroidPtsBelMod[row].size(); cloudIter++) {\n          if (CentroidPtsBelMod[row][cloudIter] >= 0)\n            num_good++;\n        }\n        if (num_good < 2) continue;\n        if (row > 0 && CentroidPtsBelMod[row - 1] == CentroidPtsBelMod[row]) \n          continue;\n      \n        CentroidPtsBelMod[pos] = CentroidPtsBelMod[row];\n        pos++;\n      }\n      CentroidPtsBelMod.resize(pos);\n\n      // We connected the clouds. Find the average cloud.\n      std::vector<vw::Vector3> centroid(CentroidPtsBelMod.size());\n      for (std::size_t row = 0; row < CentroidPtsBelMod.size(); row++) {\n        vw::Vector3 pt(0, 0, 0);\n        int num = 0;\n        for (int cloudIter = 0; cloudIter < CentroidPtsBelMod[row].size(); cloudIter++) {\n          int idx = CentroidPtsBelMod[row][cloudIter];\n          if (idx < 0) continue;\n          vw::Vector3 curr = clouds[cloudIter][idx];\n          pt += curr;\n          num++;\n        }\n        pt /= num;\n        centroid[row] = pt;\n      }\n\n      double errBefore = 0;\n      errAfter = 0;\n      int numErrors = 0;\n      \n      // Find the transform from each cloud to the centroid, and apply it to each cloud\n      for (std::size_t cloudIter = 0; cloudIter < numClouds; cloudIter++) {\n\n        std::vector<Eigen::Vector3d> src, dst; \n        Eigen::Matrix3d rot;\n        Eigen::Vector3d trans;\n      \n        for (int row = 0; row < CentroidPtsBelMod.size(); row++) {\n          int pointIter = CentroidPtsBelMod[row][cloudIter];\n          if (pointIter < 0) continue;\n        \n          vw::Vector3 curr = clouds[cloudIter][pointIter];\n          vw::Vector3 ctr  = centroid[row];\n\n          Eigen::Vector3d p;\n          p[0] = curr[0]; p[1] = curr[1]; p[2] = curr[2];\n          src.push_back(p);\n        \n          p[0] = ctr[0]; p[1] = ctr[1]; p[2] = ctr[2];\n          dst.push_back(p);\n          \n          errBefore += norm_2(curr - ctr);\n          numErrors++;\n        }\n\t\n        computeRigidTransform(src, dst, rot, trans);\n\n        // Update the output transforms\n        Eigen::MatrixXd currT = Eigen::MatrixXd::Identity(4, 4);;\n        for (int row = 0; row < 3; row++)\n          for (int col = 0; col < 3; col++) \n            currT(row, col) = rot(row, col);\n        for (int row = 0; row < 3; row++)\n          currT(row, 3) = trans(row);\n        transVec[cloudIter] = currT*transVec[cloudIter];\n\n        // Move the clouds to the new location for the next iteration\n        apply_transform_to_cloud(clouds[cloudIter], currT);\n        \n        // Compute the error after the transform is applied\n        for (int row = 0; row < CentroidPtsBelMod.size(); row++) {\n          int pointIter = CentroidPtsBelMod[row][cloudIter];\n          if (pointIter < 0) continue;\n          vw::Vector3 curr = clouds[cloudIter][pointIter];\n          vw::Vector3 ctr  = centroid[row];\n          errAfter += norm_2(curr - ctr);\n        }\n\n      }\n\n      errBefore /= numErrors;\n      errAfter /= numErrors;\n\n      if (firstStep) {\n        initError = errBefore;\n        if (opt.verbose) {\n          vw_out() << \"Error before alignment: \" << initError  << std::endl;\n        }\n      }\n      \n      if (opt.verbose) \n        vw_out() << \"Error at iteration \" << step << \": \" << errAfter << \"\\n\";\n      else\n        tpc.report_incremental_progress(inc_amount);\n\n      if (!firstStep) {\n        if (errAfter > 0 && std::abs(errAfter - prevError)/errAfter < opt.rel_error_tol) {\n          break;\n        }\n      }\n      \n      prevError = errAfter;\n      \n      step++;\n    } // End of iterations refining the transforms\n\n    if (!verbose) {\n      tpc.report_finished();\n    }\n    \n    sw1.stop();\n    \n    if (!opt.verbose) {\n      vw_out() << \"\\n\" << errCaption;\n      vw_out() << \"Error before alignment: \" << initError  << std::endl;\n    }\n    vw_out() << \"Error after alignment:  \" << errAfter << std::endl;\n    \n    vw_out() << \"Performed: \" << step + 1 << \" iterations.\\n\";\n\n    vw_out() << \"\\nAlignment took \" << sw1.elapsed_seconds() << \" [s]\" << std::endl;\n\n    if (opt.align_to_first_cloud) {\n      // Make the first transform be the identity\n      for (int cloudIter = 1; cloudIter < numClouds; cloudIter++) \n        transVec[cloudIter] = transVec[0].inverse() * transVec[cloudIter];\n      transVec[0] = Eigen::MatrixXd::Identity(4, 4);\n    }\n  \n    // Undo the shift when the clouds were read\n    for (int cloudIter = 0; cloudIter < numClouds; cloudIter++) \n      transVec[cloudIter] = apply_shift(transVec[cloudIter], -shift);\n    \n    for (int cloudIter = 0; cloudIter < numClouds; cloudIter++)\n      vw_out() << \"Final transform for cloud: \" << cloudIter << \":\\n\"\n               << transVec[cloudIter] << std::endl;\n    write_n_transforms(transVec, opt.out_prefix);\n\n    if (opt.save_transformed_clouds) {\n      for (int cloudIter = 0; cloudIter < numClouds; cloudIter++) {\n        std::ostringstream os;\n        os << opt.out_prefix << \"-trans_cloud-\" << cloudIter;\n        std::string trans_prefix = os.str();\n        vw::BBox2 copc_win; bool copc_read_all = false; // not used, part of the API\n        save_trans_point_cloud(opt, opt.cloud_files[cloudIter], trans_prefix,\n                               copc_win, copc_read_all,\n                               geo, csv_conv, transVec[cloudIter]);\n      }\n    }\n  \n  } ASP_STANDARD_CATCHES;\n  \n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/nonlin_trans_corr.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file nonlin_trans_corr.cc\n///\n\n// Use VTK's thin plate transform to warp left and right images based\n// on disparity to make them more similar, compute the disparity among\n// the warped images, and then unwarp the disparity.\n\n#include <vtkMath.h>\n#include <vtkNew.h>\n#include <vtkPoints.h>\n#include <vtkThinPlateSplineTransform.h>\n\n#include <vw/FileIO/DiskImageView.h>\n#include <vw/Image/PixelMask.h>\n#include <vw/Core/Exception.h>\n#include <vw/Core/Stopwatch.h>\n#include <vw/Image/Interpolation.h>\n#include <vw/Image/MaskViews.h>\n#include <vw/Image/ImageViewRef.h>\n\n#include <asp/Core/Macros.h>\n#include <asp/Core/AspProgramOptions.h>\n\n#include <iostream>\n\n// Find the max error between two arrays of points. Note that\n// cannot use const here as GetPoint() is not const.\ndouble max_error(vtkNew<vtkPoints> & a, vtkNew<vtkPoints> & b) {\n\n  int npoints = a->GetNumberOfPoints();\n  double max_err = 0.0;\n\n  for (int i = 0; i < npoints; i++) {\n    double testDstPoint[3] = {0.0};\n    a->GetPoint(i, testDstPoint);\n    double transSrcPoint[3] = {0.0};\n    b->GetPoint(i, transSrcPoint);\n    double d = vtkMath::Distance2BetweenPoints(testDstPoint, transSrcPoint);\n    max_err = std::max(max_err, d);\n  }\n  return max_err;\n}\n\nvoid TestThinPlateSplineTransform() {\n\n  int npoints = 20;\n\n  const double P[20][3] = {\n    { -0.8316301300814422, -0.06992580859519772, -1.6034524068257419 },\n    { -2.151893827785692, 0.38244721645095636, -0.9275967632551845 },\n    { 0.8147291118075928, -0.7016483698682392, 0.15003863332602096 },\n    { 0.918239421266975, 0.5515514723709805, -1.0230600499321258 },\n    { -0.4977939747967184, 1.5000786176083494, 0.892455159403953 },\n    { 2.137759080794324, -0.7876029858279091, 0.23676951564894347 },\n    { 0.07659657475437548, 0.37528421293358666, 1.061745743663681 },\n    { -0.7908820649026604, 1.4270955106455065, 2.2665387247459576 },\n    { -0.5663930529602919, 1.9402635876094498, 1.1531767242062774 },\n    { 0.22529528853908187, -1.5938090446587108, -0.7004997748768814 },\n    { 0.6165064084492409, -0.2761336076050157, -0.7930056820043028 },\n    { -1.6122391974605947, -1.4200010952872733, 1.0567292903013055 },\n    { 0.17993263043615856, -0.9038514957133562, -2.1611068227229695 },\n    { -1.4186794357559613, 0.85026116269838, -1.7600646313947719 },\n    { 0.9690209792801024, 0.7018737798529897, 0.3923799957082836 },\n    { -0.6586203767750309, -2.1468680342265904, 0.762954972139701 },\n    { 1.2872860659137344, 0.8557080868402649, 0.3905931440107816 },\n    { -0.18996464681200217, 0.8315184491297033, -1.0227889589485941 },\n    { 1.0636210067525393, -0.24736478911115908, -0.7581101375259237 },\n    { -0.09448165336394657, -1.1381967760924927, -0.7171168342666931 },\n  };\n\n  const double noise[20][3] = {\n    { 1.5137019295427425, 0.6858246680960894, 0.07331883771349512 },\n    { -0.34081703057234036, 0.47987804772801446, 0.982197518178181 },\n    { -0.1106079068591361, 1.0523148414328571, 0.17910578196163454 },\n    { 0.05724784633562011, -0.08459760939107724, -0.7665637643588622 },\n    { -0.4333381262791796, 0.018412807528038692, 0.6889623031683394 },\n    { -1.1692454358073843, -0.6875830563599973, 0.9077463799204326 },\n    { -1.9329042505569662, 1.0529789607437061, -0.29738186972471486 },\n    { -0.12079407626315326, 0.9261998453458427, 1.0938543547601083 },\n    { -0.6384715430732077, -0.2606527602354865, 1.417882645305744 },\n    { -0.10127708027623447, -0.7470111486643078, 0.726100633329295 },\n    { 0.36659507636859245, 1.4194144006017144, 0.41878644928947467 },\n    { 1.0325034539790547, -0.2291631905797599, -1.3490582933020208 },\n    { -0.7186165872334461, 0.4613954758072554, -1.1318559861004829 },\n    { 2.455035378196603, -0.01476716688473253, -0.0890030227805104 },\n    { 1.6498918075463915, 2.7557006973876508, -0.6466098561563114 },\n    { 1.16764314555201, -1.5226214641344893, 0.13000979083980121 },\n    { -0.9640219699623079, 1.3071375444488553, 0.5668689159057715 },\n    { 0.40366181757487013, 2.308315254377135, 0.8202651493656881 },\n    { -1.0267515231555335, -0.2853656137629097, -1.1599391275129292 },\n    { -0.09199656043877075, 0.35274602605225164, 2.5626579880899327 },\n  };\n\n  // Good API\n  //sourceTransform->TransformPoint(src, src);\n  \n  // create the two point sets\n  vtkNew<vtkPoints> srcPoints, dstPoints;\n  vtkNew<vtkPoints> testSrcPoints, testDstPoints;\n  double s = 0.1;\n  double a = 0.1, b = 0.1;\n\n  // Create a set of points to find the transform for, and a set of new test\n  // points to verify how well it generalized\n  for (int i = 0; i < npoints; i++) {\n    double src[3] = {P[i][0], P[i][1], 0};\n    double testSrc[3] = {src[0] + s * noise[i][0], src[1] + s * noise[i][1], 0};\n\n    double dst[3] = {src[0] + a * src[1] *src[0] * src[0],\n                     src[1] + b * src[0] * src[1],\n                     0};\n    double testDst[3] = {testSrc[0] + a * testSrc[1] * testSrc[0] * testSrc[0],\n                         testSrc[1] + b * testSrc[0] * testSrc[1],\n                         0};\n    \n    srcPoints->InsertNextPoint(src);\n    testSrcPoints->InsertNextPoint(testSrc);\n    dstPoints->InsertNextPoint(dst);\n    testDstPoints->InsertNextPoint(testDst);\n  }\n\n  // Set up the transform\n  vtkNew<vtkThinPlateSplineTransform> trans;\n  //trans->SetBasisToR(); // 3D\n  trans->SetBasisToR2LogR(); // 2D\n  trans->SetRegularizeBulkTransform(true);\n  trans->SetSourceLandmarks(srcPoints);\n  trans->SetTargetLandmarks(dstPoints);\n  trans->Update();\n\n  // Test the forward transform on the points used to create it\n  vtkNew<vtkPoints> transSrcPoints;\n  trans->TransformPoints(srcPoints, transSrcPoints);\n  std::cout << \"Error using forward transform on points which defined it: \"\n            << max_error(dstPoints, transSrcPoints) << \"\\n\";\n  \n  // Test the forward transform on a new set of points for which we\n  // know the answer\n  vtkNew<vtkPoints> transTestSrcPoints;\n  trans->TransformPoints(testSrcPoints, transTestSrcPoints);\n  std::cout << \"Error using forward transform on additional test points: \"\n            << max_error(testDstPoints, transTestSrcPoints) << \"\\n\";\n  \n  // Compute the inverse transform. This changes the direction\n  // in which TransformPoints() is applied.\n  trans->Inverse();\n\n  // Test how reliably the inverse brings one back\n\n  vtkNew<vtkPoints> srcPoints2;\n  trans->TransformPoints(transSrcPoints, srcPoints2);\n  std::cout << \"Error after forward then inverse transform on orig points: \"\n            << max_error(srcPoints, srcPoints2) << \"\\n\";\n\n  vtkNew<vtkPoints> testSrcPoints2;\n  trans->TransformPoints(transTestSrcPoints, testSrcPoints2);\n  std::cout << \"Error after forward then inverse transform on additional points: \"\n            << max_error(testSrcPoints, testSrcPoints2) << \"\\n\";\n\n  vtkNew<vtkPoints> transTestDstPoints;\n  trans->TransformPoints(testDstPoints, transTestDstPoints);\n  std::cout << \"Error using inverse transform on additional test points: \"\n            << max_error(testSrcPoints, transTestDstPoints) << \"\\n\";\n\n  return;\n}\n\nstruct Options : vw::GdalWriteOptions {\n};\n\nusing namespace vw;\n\n// Testcase:\n// cd projects/grand_mesa\n// nonlin_trans_corr stereo_rpc_local_epi_2_1_rpc_v2/run 1000\n// Then run:\n// parallel_stereo --correlator-mode run-L_sub.tif aligned-R_sub.tif\n\nint main(int argc, char ** argv) {\n\n  Options opt;\n  try {\n\n    // TestThinPlateSplineTransform();\n\n    std::string prefix = argv[1];\n    \n    int num_samples = atof(argv[2]);\n    std::cout << \"Num samples is \" << num_samples << std::endl;\n  \n    std::string left_file = prefix + \"-L_sub.tif\";\n    std::string right_file = prefix + \"-R_sub.tif\";\n    std::string disp_file = prefix + \"-D_sub.tif\";\n    //std::string disp_file = prefix + \"-D_sub_asp_bm.tif\";\n  \n    DiskImageView<float> left(left_file);\n    DiskImageView<float> right(right_file);\n    DiskImageView<PixelMask<Vector2f>> disp(disp_file);\n\n    float right_nodata = -32768.0;\n    if (read_nodata_val(right_file, right_nodata)) {\n      std::cout << \"Read right image nodata value: \" << right_nodata << std::endl;\n    }\n    ImageViewRef<PixelMask<float>> masked_right  = create_mask(right, right_nodata);\n  \n    std::cout << \"L cols and rows \" << left.cols() << ' ' << left.rows() << std::endl;\n    std::cout << \"R cols and rows \" << right.cols() << ' ' << right.rows() << std::endl;\n    std::cout << \"D cols and rows \" << disp.cols() << ' ' << disp.rows() << std::endl;\n\n    if (left.cols() != disp.cols() || left.rows() != disp.rows())\n      vw_throw( ArgumentErr() << \"Left image and disparity must have same dims.\");\n\n    double area = double(left.cols()) * double(left.rows()); // careful to not overflow\n    int sample_rate = round(sqrt(double(area) / double(num_samples)));\n    if (sample_rate < 1) \n      sample_rate = 1;\n    std::cout << \"Sample rate \" << sample_rate << std::endl;\n  \n    Stopwatch sw;\n    sw.start();\n\n    // Create a set of points to find the transform for, and a set of new test\n    // points to verify how well it generalized\n    int max_points = 1000, count = 0;\n    vtkNew<vtkPoints> srcPoints, dstPoints;\n    for (int col = 0; col < disp.cols(); col += sample_rate) {\n      for (int row = 0; row < disp.rows(); row += sample_rate) {\n        PixelMask<Vector2f> pix = disp(col, row);\n        if (!is_valid(pix))\n          continue;\n\n        double src[3] = {double(col), double(row), 0.0};\n        double dst[3] = {col + pix.child().x(), row + pix.child().y(), 0.0};\n        srcPoints->InsertNextPoint(src);\n        dstPoints->InsertNextPoint(dst);\n        count++;\n\n        if (count >= max_points) \n          break;\n      }\n      if (count >= max_points) \n        break;\n    }\n    sw.stop();\n    vw_out() << \"Elapsed time to add points: \" << sw.elapsed_seconds() << \" seconds.\\n\";\n\n    int npoints = srcPoints->GetNumberOfPoints();\n    std::cout << \"Num points \" << npoints << std::endl;\n    sw.start();\n\n    // Set up the transform\n    vtkNew<vtkThinPlateSplineTransform> trans;\n    //trans->SetBasisToR(); // 3D\n    trans->SetBasisToR2LogR(); // 2D\n    trans->SetRegularizeBulkTransform(true);\n    trans->SetSourceLandmarks(srcPoints);\n    trans->SetTargetLandmarks(dstPoints);\n    trans->Update();\n  \n    sw.stop();\n    vw_out() << \"Elapsed time to calc transform: \" << sw.elapsed_seconds() << \" seconds.\\n\";\n\n    // An invalid pixel value used for edge extension\n    PixelMask<float> nodata_pix(0); nodata_pix.invalidate();\n    ValueEdgeExtension<PixelMask<float>> nodata_ext(nodata_pix); \n  \n    // Interpolate into the right image. Avoid using an ImageViewRef to\n    // avoid a per-pixel virtual function overhead. The 'auto' keyword\n    // will use the exact type.\n    auto interp_right = interpolate(create_mask(right, right_nodata),\n                                    BilinearInterpolation(), nodata_ext);\n\n    vw_out() << \"Warping the image.\\n\";\n    TerminalProgressCallback tpc(\"asp\", \"\\t--> \");\n    \n    // Warp the right image to make it more similar to the left one\n    ImageView<PixelMask<float>> trans_right(left.cols(), left.rows());\n    //#pragma omp parallel for\n    for (int col = 0; col < left.cols(); col++) {\n      tpc.report_fractional_progress(col, left.cols());\n\n      for (int row = 0; row < left.rows(); row++) {\n      \n        double src[3] = {double(col), double(row), 0.0};\n        double dst[3] = {0.0, 0.0, 0.0};\n        trans->TransformPoint(src, dst);\n\n        trans_right(col, row) = interp_right(dst[0], dst[1]);\n      }\n    }\n\n    tpc.report_finished();\n    \n    vw::cartography::GeoReference left_georef;\n    bool has_left_georef = read_georeference(left_georef, left_file);\n    bool has_nodata      = true;\n    std::string output_image = prefix + \"-trans_right.tif\";\n    vw_out() << \"Writing: \" << output_image << \"\\n\";\n    vw::cartography::block_write_gdal_image\n      (output_image,\n       apply_mask(trans_right, right_nodata),\n       has_left_georef, left_georef,\n       has_nodata, right_nodata, opt,\n       TerminalProgressCallback(\"asp\", \"\\t--> Nonlinear warping:\"));\n    \n  } ASP_STANDARD_CATCHES;\n  \n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/opencv_calibrate.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file opencv_calibrate.cpp\n///\n/// Camera calibration tool using OpenCV's chessboard/circle grid pattern detection.\n/// Computes intrinsic camera parameters and distortion coefficients from a set of\n/// calibration images.\n\n#include <vw/Image/ImageView.h>\n#include <vw/Image/ImageIO.h>\n#include <vw/FileIO/DiskImageIO.h>\n#include <vw/FileIO/DiskImageResource.h>\n#include <vw/Core/Log.h>\n\n#include <opencv2/core/core.hpp>\n#include <opencv2/imgproc/imgproc.hpp>\n#include <opencv2/calib3d/calib3d.hpp>\n\n#include <cctype>\n#include <stdio.h>\n#include <string.h>\n#include <time.h>\n#include <iostream>\n\nconst char * usage =\n\" \\nexample command line for calibration from a list of stored images:\\n\"\n\"   imagelist_creator image_list.xml *.png\\n\"\n\"   calibration -w 4 -h 5 -s 0.025 -o camera.yml -op -oe image_list.xml\\n\"\n\" where image_list.xml is the standard OpenCV XML/YAML\\n\"\n\" use imagelist_creator to create the xml or yaml list\\n\"\n\" file consisting of the list of strings, e.g.:\\n\"\n\" \\n\"\n\"<?xml version=\\\"1.0\\\"?>\\n\"\n\"<opencv_storage>\\n\"\n\"<images>\\n\"\n\"view000.png\\n\"\n\"view001.png\\n\"\n\"<!-- view002.png -->\\n\"\n\"view003.png\\n\"\n\"view010.png\\n\"\n\"one_extra_view.jpg\\n\"\n\"</images>\\n\"\n\"</opencv_storage>\\n\";\n\n\nstatic void help() {\n  vw::vw_out() << \"This is a camera calibration sample.\\n\"\n    \"Usage: calibration\\n\"\n    \"     -w <board_width>         # the number of inner corners per one of\\n\"\n    \"                              #   board dimension\\n\"\n    \"     -h <board_height>        # the number of inner corners per another\\n\"\n    \"                              #   board dimension\\n\"\n    \"     [-pt <pattern>]          # the type of pattern: chessboard or\\n\"\n    \"                              #   circles' grid\\n\"\n    \"     [-n <number_of_frames>]  # the number of frames to use for\\n\"\n    \"                              #   calibration (if not specified, it\\n\"\n    \"                              #   will be set to the number of board\\n\"\n    \"                              #   views actually available)\\n\"\n    \"     [-s <squareSize>]       # square size in some user-defined units\\n\"\n    \"                              #   (1 by default)\\n\"\n    \"     [-o <out_camera_params>] # the output filename for intrinsic\\n\"\n    \"                              #   [and extrinsic] parameters\\n\"\n    \"     [-op]                    # write detected feature points\\n\"\n    \"     [-oe]                    # write extrinsic parameters\\n\"\n    \"     [-zt]                    # assume zero tangential distortion\\n\"\n    \"     [-a <aspectRatio>]      # fix aspect ratio (fx/fy)\\n\"\n    \"     [-p]                     # fix the principal point at the center\\n\"\n    \"     [-v]                     # flip the captured images around the\\n\"\n    \"                              #   horizontal axis\\n\"\n    \"     [input_data]             # input data, one of the following:\\n\"\n    \"                              #  - text file with a list of the images\\n\"\n    \"                              #    of the board\\n\"\n    \"                              #    the text file can be generated with\\n\"\n    \"                              #    imagelist_creator\\n\"\n    \"\\n\";\n  vw::vw_out() << \"\\n\" << usage;\n}\n\nenum { DETECTION = 0, CAPTURING = 1, CALIBRATED = 2 };\nenum BoardPattern { CHESSBOARD, CIRCLES_GRID, ASYMMETRIC_CIRCLES_GRID };\n\nstatic double computeReprojectionErrors(\n    const std::vector<std::vector<cv::Point3f>>& objectPoints,\n    const std::vector<std::vector<cv::Point2f>>& imagePoints,\n    const std::vector<cv::Mat>& rvecs, const std::vector<cv::Mat>& tvecs,\n    const cv::Mat& cameraMatrix, const cv::Mat& distCoeffs,\n    std::vector<float>& perViewErrors) {\n\n  std::vector<cv::Point2f> imagePoints2;\n  int i, totalPoints = 0;\n  double totalErr = 0, err;\n  perViewErrors.resize(objectPoints.size());\n\n  for (i = 0; i < (int)objectPoints.size(); i++) {\n    cv::projectPoints(cv::Mat(objectPoints[i]), rvecs[i], tvecs[i],\n                      cameraMatrix, distCoeffs, imagePoints2);\n    err = cv::norm(cv::Mat(imagePoints[i]), cv::Mat(imagePoints2), cv::NORM_L2);\n    int n = (int)objectPoints[i].size();\n    perViewErrors[i] = (float)std::sqrt(err*err/n);\n    totalErr += err*err;\n    totalPoints += n;\n  }\n\n  return std::sqrt(totalErr/totalPoints);\n}\n\nstatic void calcChessboardCorners(cv::Size boardSize, float squareSize,\n                                  std::vector<cv::Point3f>& corners,\n                                  BoardPattern patternType = CHESSBOARD) {\n  corners.resize(0);\n\n  switch (patternType) {\n    case CHESSBOARD:\n    case CIRCLES_GRID:\n      for (int i = 0; i < boardSize.height; i++)\n        for (int j = 0; j < boardSize.width; j++)\n          corners.push_back(cv::Point3f(float(j*squareSize),\n                                        float(i*squareSize), 0));\n      break;\n\n    case ASYMMETRIC_CIRCLES_GRID:\n      for (int i = 0; i < boardSize.height; i++)\n        for (int j = 0; j < boardSize.width; j++)\n          corners.push_back(cv::Point3f(float((2*j + i % 2)*squareSize),\n                                        float(i*squareSize), 0));\n      break;\n\n    default:\n      CV_Error(cv::Error::StsBadArg, \"Unknown pattern type\\n\");\n  }\n}\n\nbool runCalibration(std::vector<std::vector<cv::Point2f>> imagePoints,\n                    cv::Size imageSize, cv::Size boardSize, BoardPattern patternType,\n                    float squareSize, float aspectRatio,\n                    int flags, cv::Mat& cameraMatrix, cv::Mat& distCoeffs,\n                    std::vector<cv::Mat>& rvecs, std::vector<cv::Mat>& tvecs,\n                    std::vector<float>& reprojErrs,\n                    double& totalAvgErr) {\n  cameraMatrix = cv::Mat::eye(3, 3, CV_64F);\n  if (flags & cv::CALIB_FIX_ASPECT_RATIO)\n    cameraMatrix.at<double>(0,0) = aspectRatio;\n\n  const int NUM_DISTORTION_COEFFS = 4;\n  distCoeffs = cv::Mat::zeros(NUM_DISTORTION_COEFFS, 1, CV_64F);\n\n  std::vector<std::vector<cv::Point3f>> objectPoints(1);\n  calcChessboardCorners(boardSize, squareSize, objectPoints[0], patternType);\n\n  objectPoints.resize(imagePoints.size(), objectPoints[0]);\n\n  double rms = cv::calibrateCamera(objectPoints, imagePoints, imageSize, cameraMatrix,\n                                    distCoeffs, rvecs, tvecs, flags|cv::CALIB_FIX_K3);\n  vw::vw_out() << \"RMS error reported by calibrateCamera: \" << rms << \"\\n\";\n\n  bool ok = cv::checkRange(cameraMatrix) && cv::checkRange(distCoeffs);\n\n  totalAvgErr = computeReprojectionErrors(objectPoints, imagePoints, rvecs, tvecs,\n                                          cameraMatrix, distCoeffs, reprojErrs);\n\n  return ok;\n}\n\nstatic void saveCameraParams(const std::string& filename,\n                             cv::Size imageSize, cv::Size boardSize,\n                             float squareSize, float aspectRatio, int flags,\n                             const cv::Mat& cameraMatrix,\n                             const cv::Mat& distCoeffs,\n                             const std::vector<cv::Mat>& rvecs,\n                             const std::vector<cv::Mat>& tvecs,\n                             const std::vector<float>& reprojErrs,\n                             const std::vector<std::vector<cv::Point2f>>& imagePoints,\n                             double totalAvgErr) {\n  cv::FileStorage fs(filename, cv::FileStorage::WRITE);\n\n  time_t tt;\n  time(&tt);\n  struct tm *t2 = localtime(&tt);\n  char buf[1024];\n  strftime(buf, sizeof(buf)-1, \"%c\", t2);\n\n  fs << \"calibration_time\" << buf;\n\n  if (!rvecs.empty() || !reprojErrs.empty())\n    fs << \"nframes\" << (int)std::max(rvecs.size(), reprojErrs.size());\n  fs << \"image_width\" << imageSize.width;\n  fs << \"image_height\" << imageSize.height;\n  fs << \"board_width\" << boardSize.width;\n  fs << \"board_height\" << boardSize.height;\n  fs << \"square_size\" << squareSize;\n\n  if (flags & cv::CALIB_FIX_ASPECT_RATIO)\n    fs << \"aspectRatio\" << aspectRatio;\n\n  if (flags != 0) {\n    sprintf(buf, \"flags: %s%s%s%s\",\n            flags & cv::CALIB_USE_INTRINSIC_GUESS ? \"+use_intrinsic_guess\" : \"\",\n            flags & cv::CALIB_FIX_ASPECT_RATIO ? \"+fix_aspectRatio\" : \"\",\n            flags & cv::CALIB_FIX_PRINCIPAL_POINT ? \"+fix_principal_point\" : \"\",\n            flags & cv::CALIB_ZERO_TANGENT_DIST ? \"+zero_tangent_dist\" : \"\");\n  }\n\n  fs << \"flags\" << flags;\n\n  fs << \"camera_matrix\" << cameraMatrix;\n  fs << \"distortion_coefficients\" << distCoeffs;\n\n  fs << \"avg_reprojection_error\" << totalAvgErr;\n  if (!reprojErrs.empty())\n    fs << \"per_view_reprojection_errors\" << cv::Mat(reprojErrs);\n\n  if (!rvecs.empty() && !tvecs.empty()) {\n    CV_Assert(rvecs[0].type() == tvecs[0].type());\n    cv::Mat bigmat((int)rvecs.size(), 6, rvecs[0].type());\n    for (int i = 0; i < (int)rvecs.size(); i++) {\n      cv::Mat r = bigmat(cv::Range(i, i+1), cv::Range(0,3));\n      cv::Mat t = bigmat(cv::Range(i, i+1), cv::Range(3,6));\n\n      CV_Assert(rvecs[i].rows == 3 && rvecs[i].cols == 1);\n      CV_Assert(tvecs[i].rows == 3 && tvecs[i].cols == 1);\n      r = rvecs[i].t();\n      t = tvecs[i].t();\n    }\n    fs << \"extrinsic_parameters\" << bigmat;\n  }\n\n  if (!imagePoints.empty()) {\n    cv::Mat imagePtMat((int)imagePoints.size(), (int)imagePoints[0].size(), CV_32FC2);\n    for (int i = 0; i < (int)imagePoints.size(); i++) {\n      cv::Mat r = imagePtMat.row(i).reshape(2, imagePtMat.cols);\n      cv::Mat imgpti(imagePoints[i]);\n      imgpti.copyTo(r);\n    }\n    fs << \"image_points\" << imagePtMat;\n  }\n}\n\nstatic bool readStringList(const std::string& filename, const std::string& tempFile,\n                           std::vector<std::string>& l) {\n  l.resize(0);\n  cv::FileStorage fs(filename, cv::FileStorage::READ);\n  if (!fs.isOpened())\n    return false;\n  cv::FileNode n = fs.getFirstTopLevelNode();\n  if (n.type() != cv::FileNode::SEQ)\n    return false;\n  cv::FileNodeIterator it = n.begin(), it_end = n.end();\n  for (; it != it_end; ++it)\n    l.push_back((std::string)*it);\n\n  return true;\n}\n\nbool runAndSave(const std::string& outputFilename,\n                const std::vector<std::vector<cv::Point2f>>& imagePoints,\n                cv::Size imageSize, cv::Size boardSize, BoardPattern patternType,\n                float squareSize, float aspectRatio, int flags, cv::Mat& cameraMatrix,\n                cv::Mat& distCoeffs, bool writeExtrinsics, bool writePoints) {\n  std::vector<cv::Mat> rvecs, tvecs;\n  std::vector<float> reprojErrs;\n  double totalAvgErr = 0;\n\n  bool ok = runCalibration(imagePoints, imageSize, boardSize, patternType, squareSize,\n                           aspectRatio, flags, cameraMatrix, distCoeffs,\n                           rvecs, tvecs, reprojErrs, totalAvgErr);\n  vw::vw_out() << (ok ? \"Calibration succeeded\" : \"Calibration failed\")\n               << \". avg reprojection error = \" << totalAvgErr << \"\\n\";\n\n  if (ok)\n    saveCameraParams(outputFilename, imageSize,\n                     boardSize, squareSize, aspectRatio,\n                     flags, cameraMatrix, distCoeffs,\n                     writeExtrinsics ? rvecs : std::vector<cv::Mat>(),\n                     writeExtrinsics ? tvecs : std::vector<cv::Mat>(),\n                     writeExtrinsics ? reprojErrs : std::vector<float>(),\n                     writePoints ? imagePoints : std::vector<std::vector<cv::Point2f>>(),\n                     totalAvgErr);\n  return ok;\n}\n\ncv::Mat vw_imread(const std::string fileName,\n                  vw::ImageView<vw::uint8> &gray_buffer) {\n  vw::read_image(gray_buffer, fileName);\n\n  // Figure out the image buffer parameters\n  void*   raw_data_ptr = reinterpret_cast<void*>(gray_buffer.data());\n  size_t  pixel_size   = sizeof(vw::uint8);\n  size_t  step_size    = gray_buffer.cols() * pixel_size;\n\n  // Create an OpenCV wrapper for the buffer image\n  cv::Mat cv_image(gray_buffer.rows(), gray_buffer.cols(), CV_8UC1,\n                   raw_data_ptr, step_size);\n  return cv_image;\n}\n\nint main(int argc, char** argv) {\n  cv::Size boardSize, imageSize;\n  float squareSize = 1.f, aspectRatio = 1.f;\n  cv::Mat cameraMatrix, distCoeffs;\n  const char* outputFilename = \"out_camera_data.yml\";\n  const char* inputFilename = 0;\n\n  int i, nframes = 10;\n  bool writeExtrinsics = false, writePoints = false;\n  int flags = 0;\n  int mode = DETECTION;\n  std::vector<std::vector<cv::Point2f>> imagePoints;\n  std::vector<std::string> imageList;\n  BoardPattern pattern = CHESSBOARD;\n\n  if (argc < 2) {\n    help();\n    return 0;\n  }\n\n  for (i = 1; i < argc; i++) {\n    const char* s = argv[i];\n    if (strcmp(s, \"-w\") == 0) {\n      if (sscanf(argv[++i], \"%u\", &boardSize.width) != 1 || boardSize.width <= 0) {\n        vw::vw_out() << \"Invalid board width\\n\";\n        return -1;\n      }\n    } else if (strcmp(s, \"-h\") == 0) {\n      if (sscanf(argv[++i], \"%u\", &boardSize.height) != 1 || boardSize.height <= 0) {\n        vw::vw_out() << \"Invalid board height\\n\";\n        return -1;\n      }\n    } else if (strcmp(s, \"-pt\") == 0) {\n      i++;\n      if (!strcmp(argv[i], \"circles\"))\n        pattern = CIRCLES_GRID;\n      else if (!strcmp(argv[i], \"acircles\"))\n        pattern = ASYMMETRIC_CIRCLES_GRID;\n      else if (!strcmp(argv[i], \"chessboard\"))\n        pattern = CHESSBOARD;\n      else {\n        vw::vw_out() << \"Invalid pattern type: must be chessboard or circles\\n\";\n        return -1;\n      }\n    } else if (strcmp(s, \"-s\") == 0) {\n      if (sscanf(argv[++i], \"%f\", &squareSize) != 1 || squareSize <= 0) {\n        vw::vw_out() << \"Invalid board square width\\n\";\n        return -1;\n      }\n    } else if (strcmp(s, \"-n\") == 0) {\n      if (sscanf(argv[++i], \"%u\", &nframes) != 1 || nframes <= 3) {\n        vw::vw_out() << \"Invalid number of images\\n\";\n        return -1;\n      }\n    } else if (strcmp(s, \"-a\") == 0) {\n      if (sscanf(argv[++i], \"%f\", &aspectRatio) != 1 || aspectRatio <= 0) {\n        vw::vw_out() << \"Invalid aspect ratio\\n\";\n        return -1;\n      }\n      flags |= cv::CALIB_FIX_ASPECT_RATIO;\n    } else if (strcmp(s, \"-op\") == 0) {\n      writePoints = true;\n    } else if (strcmp(s, \"-oe\") == 0) {\n      writeExtrinsics = true;\n    } else if (strcmp(s, \"-zt\") == 0) {\n      flags |= cv::CALIB_ZERO_TANGENT_DIST;\n    } else if (strcmp(s, \"-p\") == 0) {\n      flags |= cv::CALIB_FIX_PRINCIPAL_POINT;\n    } else if (strcmp(s, \"-o\") == 0) {\n      outputFilename = argv[++i];\n    } else if (s[0] != '-') {\n      inputFilename = s;\n    } else {\n      vw::vw_out() << \"Unknown option \" << s << \"\\n\";\n      return -1;\n    }\n  }\n\n  std::string tempFile = outputFilename;\n  tempFile += \".temp\";\n\n  if (inputFilename) {\n    if (readStringList(inputFilename, tempFile, imageList))\n      mode = CAPTURING;\n    else {\n      vw::vw_out() << \"Error openening file \" << inputFilename << \"\\n\";\n      return -1;\n    }\n  } else {\n    vw::vw_out() << \"Missing input filename.\\n\";\n    return -1;\n  }\n\n  if (!imageList.empty())\n    nframes = (int)imageList.size();\n\n  for (i = 0; ; i++) {\n    cv::Mat view;\n    vw::ImageView<vw::uint8> gray_buffer;\n\n    if (i < (int)imageList.size()) {\n      view = vw_imread(imageList[i], gray_buffer);\n      if (!view.data) {\n        vw::vw_out() << \"Failed to read image data from input file \"\n                     << imageList[i] << \"\\n\";\n        return -1;\n      }\n    }\n\n    if (!view.data) {\n      if (imagePoints.size() > 0)\n        runAndSave(outputFilename, imagePoints, imageSize,\n                   boardSize, pattern, squareSize, aspectRatio,\n                   flags, cameraMatrix, distCoeffs,\n                   writeExtrinsics, writePoints);\n      break;\n    }\n\n    imageSize = view.size();\n\n    std::vector<cv::Point2f> pointbuf;\n    cv::Mat viewGray;\n    if (view.channels() > 1)\n      cv::cvtColor(view, viewGray, cv::COLOR_BGR2GRAY);\n    else\n      view.copyTo(viewGray);\n\n    bool found;\n    switch (pattern) {\n      case CHESSBOARD:\n        found = cv::findChessboardCorners(view, boardSize, pointbuf,\n                                          cv::CALIB_CB_ADAPTIVE_THRESH |\n                                          cv::CALIB_CB_FAST_CHECK |\n                                          cv::CALIB_CB_NORMALIZE_IMAGE);\n        break;\n      case CIRCLES_GRID:\n        found = cv::findCirclesGrid(view, boardSize, pointbuf);\n        break;\n      case ASYMMETRIC_CIRCLES_GRID:\n        found = cv::findCirclesGrid(view, boardSize, pointbuf,\n                                    cv::CALIB_CB_ASYMMETRIC_GRID);\n        break;\n      default:\n        vw::vw_out() << \"Unknown pattern type\\n\";\n        return -1;\n    }\n\n    int winSize = 11;\n    if (pattern == CHESSBOARD && found)\n      cv::cornerSubPix(viewGray, pointbuf, cv::Size(winSize, winSize),\n                       cv::Size(-1, -1),\n                       cv::TermCriteria(cv::TermCriteria::EPS +\n                                        cv::TermCriteria::COUNT, 30, 0.0001));\n\n    if (mode == CAPTURING && found) {\n      imagePoints.push_back(pointbuf);\n    }\n\n    if (found)\n      cv::drawChessboardCorners(view, boardSize, cv::Mat(pointbuf), found);\n\n    std::string msg = mode == CAPTURING ? \"100/100\" :\n        mode == CALIBRATED ? \"Calibrated\" : \"Press 'g' to start\";\n    int baseLine = 0;\n    cv::Size textSize = cv::getTextSize(msg, 1, 1, 1, &baseLine);\n    cv::Point textOrigin(view.cols - 2*textSize.width - 10, view.rows - 2*baseLine - 10);\n\n    if (mode == CAPTURING) {\n      msg = cv::format(\"%d/%d\", (int)imagePoints.size(), nframes);\n    }\n\n    cv::putText(view, msg, textOrigin, 1, 1,\n                mode != CALIBRATED ? cv::Scalar(0, 0, 255) : cv::Scalar(0, 255, 0));\n\n    if (mode == CAPTURING && imagePoints.size() >= (unsigned)nframes) {\n      if (runAndSave(outputFilename, imagePoints, imageSize,\n                     boardSize, pattern, squareSize, aspectRatio,\n                     flags, cameraMatrix, distCoeffs,\n                     writeExtrinsics, writePoints))\n        mode = CALIBRATED;\n      else\n        mode = DETECTION;\n      break;\n    }\n  }\n\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/opencv_imagelist_creator.cc",
    "content": "/*this creates a yaml or xml list of files from the command line args\n */\n\n#include <opencv2/core/core.hpp>\n#include <string>\n#include <iostream>\n\nusing std::string;\nusing std::cout;\nusing std::endl;\n\nusing namespace cv;\n\nstatic void help(char** av)\n{\n  cout << \"\\nThis creates a yaml or xml list of files from the command line args\\n\"\n      \"usage:\\n./\" << av[0] << \" imagelist.yaml *.png\\n\"\n      << \"Try using different extensions.(e.g. yaml yml xml xml.gz etc...)\\n\"\n      << \"This will serialize this list of images or whatever with opencv's FileStorage framework\" << endl;\n}\n\nint main(int ac, char** av)\n{\n  if (ac < 3)\n  {\n    help(av);\n    return 1;\n  }\n\n  string outputname = av[1];\n\n  FileStorage fs(outputname, FileStorage::WRITE);\n  fs << \"images\" << \"[\";\n  for(int i = 2; i < ac; i++){\n    fs << string(av[i]);\n  }\n  fs << \"]\";\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/orbit_plot.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n# Plot roll, pitch, and yaw of ASP Pinhole .tsai cameras, and/or of CSM \n# Frame/Linescan .json cameras, before and after bundle adjustment.\n# See the documentation for more info.\n\nimport sys, os, re, math, json, argparse, shutil, glob\nimport numpy as np\nimport matplotlib.pyplot as plt\nfrom pyproj import Proj, transform, Transformer\nfrom scipy.spatial.transform import Rotation as R\n\n# Add this value to an ASP pixel to get a CSM pixel\nASP_TO_CSM_SHIFT = 0.5\n\ndef toCsmPixel(asp_pix):\n    \"\"\"\n    Convert an ASP pixel to a CSM pixel. Code copied from CsmModel.cc.\n    \"\"\"\n    \n    # Explicitly ensure csm_pix has float values even if the input may be int \n    csm_pix = np.array([float(asp_pix[0]), float(asp_pix[1])])\n    \n    # Add the shift\n    csm_pix[0] += ASP_TO_CSM_SHIFT\n    csm_pix[1] += ASP_TO_CSM_SHIFT\n  \n    return csm_pix\n\ndef getTimeAtLine(model, line):\n    \"\"\"\n    Find the time at a given line. The line count starts from 0. Code copied\n    from get_time_at_line() in CsmUtils.cc and getImageTime() in\n    UsgsAstroLsSensorModel.cpp.\n    \"\"\"\n    \n    # Covert the line to a CSM pixel    \n    asp_pix = np.array([0.0, float(line)])\n    csm_pix = toCsmPixel(asp_pix)\n    \n    referenceIndex = 0\n    time = model['m_intTimeStartTimes'][referenceIndex] + \\\n           model['m_intTimes'][referenceIndex] * \\\n           (csm_pix[1] - model['m_intTimeLines'][referenceIndex] + 0.5)\n    \n    return time\n\ndef getLineAtTime(time, model):\n    \"\"\"\n    Get the line number at a given time. This assumes a linear relationship\n    between them (rather than piecewise linear). Code copied from\n    get_line_at_time() in CsmUtils.cc.\n    \"\"\"\n\n    # All dt values in model['intTimes'] (slopes) must be equal, or else\n    # the model is not linear in time.\n    for i in range(1, len(model['m_intTimeLines'])):\n        if abs(model['m_intTimes'][i] - model['m_intTimes'][0]) > 1e-10:\n            raise Exception(\"Expecting a linear relation between time and image lines.\\n\")\n\n    line0 = 0.0\n    line1 = float(model['m_nLines']) - 1.0\n    time0 = getTimeAtLine(model, line0)\n    time1 = getTimeAtLine(model, line1)\n\n    return line0 + (line1 - line0) * (time - time0) / (time1 - time0)\n            \n# TODO(oalexan1): Fix this to be aware of the fact that the Earth is not a sphere.\n# See the relevant WV code.\ndef produce_m(lon, lat, m_meridian_offset=0):\n    \"\"\"\n    Produce M matrix which facilitates conversion from Lon-lat (NED) to ECEF coordinates\n    From https://github.com/visionworkbench/visionworkbench/blob/master/src/vw/Cartography/Datum.cc#L249\n    This is known as direction cosine matrix\n    \n    Parameters\n    ------------\n    lon: numeric\n        longitude of spacecraft\n    lat: numeric\n        latitude of spacecraft\n    m_meridian_offset: numeric\n        set to zero\n    Returns\n    -----------\n    R: np.array\n        3 x 3 rotation matrix representing the m-matrix aka direction cosine matrix\n    \"\"\"\n    if lat < -90:\n        lat = -90\n    if lat > 90:\n        lat = 90\n    \n    rlon = (lon + m_meridian_offset) * (np.pi/180)\n    rlat = lat * (np.pi/180)\n    slat = np.sin(rlat)\n    clat = np.cos(rlat)\n    slon = np.sin(rlon)\n    clon = np.cos(rlon)\n    \n    R = np.ones((3,3),dtype=float)\n    R[0,0] = -slat*clon\n    R[1,0] = -slat*slon\n    R[2,0] = clat\n    R[0,1] = -slon\n    R[1,1] = clon\n    R[2,1] = 0.0\n    R[0,2] = -clon*clat\n    R[1,2] = -slon*clat\n    R[2,2] = -slat\n    return R\n\ndef convert_ecef2NED(asp_rotation,lon,lat):\n    \"\"\"\n    convert rotation matrices from ECEF to North-East-Down convention\n    Parameters\n    -------------\n    asp_rotation: np.array\n        3 x 3 rotation matrix from ASP\n    lon: numeric\n        longitude for computing m matrix\n    lat: numeric\n        latitude for computing m matrix\n    \n    Returns\n    --------------\n    r_ned: np.array\n        3 x 3 NED rotation matrix \n    \"\"\"\n    m = produce_m(lon,lat)\n    r_ned = np.matmul(np.linalg.inv(m),asp_rotation)  # this is the cam to ned transform\n    #r_ned = np.matmul(np.transpose(m),asp_rotation)\n    #r_ned = np.matmul(m,asp_rotation)\n    return r_ned\n\ndef read_csm_cam(json_file):\n    \"\"\"\n    Read a CSM model state file in JSON format.\n    \"\"\"\n    \n    print(\"Reading CSM camera: \" + json_file)\n    \n    with open(json_file, 'r') as f:\n        data = f.read()\n\n    # Find first occurrence of open brace. This is needed because the CSM\n    # state has some text before the JSON object.\n    pos = data.find('{')\n    # do substring from pos to the end, if pos was found\n    if pos != -1:\n        data = data[pos:]\n\n    # parse the json from data\n    j = json.loads(data)\n\n    return j\n\ndef read_tsai_cam(tsai):\n    \"\"\"\n    read tsai frame model from asp and return a python dictionary containing the parameters\n    See ASP's frame camera implementation here: https://stereopipeline.readthedocs.io/en/latest/pinholemodels.html\n    Parameters\n    ----------\n    tsai: str\n        path to ASP frame camera model\n    Returns\n    ----------\n    output: dictionary\n        dictionary containing camera model parameters\n    #TODO: support distortion model\n    \"\"\"\n    print(\"Reading Pinhole camera: \" + tsai)\n        \n    camera = os.path.basename(tsai)\n    with open(tsai, 'r') as f:\n        content = f.readlines()\n    content = [x.strip() for x in content]\n    fu = np.float64(content[2].split(' = ', 4)[1]) # focal length in x\n    fv = np.float64(content[3].split(' = ', 4)[1]) # focal length in y\n    cu = np.float64(content[4].split(' = ', 4)[1]) # optical center in x\n    cv = np.float64(content[5].split(' = ', 4)[1]) # optical center in y\n    cam = content[9].split(' = ', 10)[1].split(' ')\n    cam_cen = [np.float64(x) for x in cam] # camera center coordinates in ECEF\n    rot = content[10].split(' = ', 10)[1].split(' ')\n    rot_mat = [np.float64(x) for x in rot] # rotation matrix for camera to world coordinates transformation\n\n    # Reshape as 3x3 matrix\n    rot_mat = np.reshape(rot_mat,(3,3))\n\n    pitch = np.float64(content[11].split(' = ', 10)[1]) # pixel pitch\n    tsai_dict = {\n      'camera': camera, \n      'focal_length': (fu, fv),\n      'optical_center': (cu, cv), \n      'cam_cen_ecef': cam_cen, \n      'rotation_matrix': rot_mat, \n      'pitch': pitch}\n    return tsai_dict\n\ndef read_frame_cam_dict(cam):\n\n    # Invoke the appropriate reader for .tsai and .json frame cameras\n    if cam.endswith('.tsai'):\n        return read_tsai_cam(cam)\n    elif cam.endswith('.json'):\n        return read_frame_csm_cam(cam)\n    else:\n        raise Exception('Unknown camera file extension: ' + cam)\n\ndef estim_satellite_orientation(positions):\n    \"\"\"\n    Given a list of satellite positions, estimate the satellite\n    orientation at each position. The x axis is the direction of\n    motion, z points roughly down while perpendicular to x, and\n    y is the cross product of z and x.\n    \"\"\"\n    num = len(positions)\n    \n    rotations = []\n    for i in range(num):\n        prev_i = i - 1\n        if prev_i < 0:\n            prev_i = 0\n        next_i = i + 1\n        if next_i >= num:\n            next_i = num - 1\n\n        # x is tangent to orbit, z goes down    \n        x = np.array(positions[next_i]) - np.array(positions[prev_i])\n        z = -np.array(positions[i])\n\n        # Normalize\n        z = z / np.linalg.norm(z)\n        x = x / np.linalg.norm(x)\n\n        # Make sure z is perpendicular to x\n        z = z - np.dot(z, x) * x\n        z = z / np.linalg.norm(z)\n\n        # Find y as the cross product\n        y = np.cross(z, x)\n\n        # Make these as columns in a matrix r\n        r = np.column_stack((x, y, z))\n        rotations.append(r)\n    \n    return rotations\n\ndef read_frame_csm_cam(json_file):\n    \"\"\"\n    Read rotation from a CSM Frame json state file.\n    \"\"\"\n\n    j = read_csm_cam(json_file)\n\n    # Read the entry having the translation and rotation\n    params = j['m_currentParameterValue']\n\n    # First three entries are the translation\n    dict = {}\n    dict['cam_cen_ecef'] = params[0:3]\n    \n    # Next four entries are the quaternion\n    quat = params[3:7]\n\n    # Convert the quaternion to rotation matrix\n    r = R.from_quat(quat)\n    mat = r.as_matrix()\n    dict['rotation_matrix'] = mat\n\n    return dict\n\ndef read_linescan_pos_rot(json_file):\n    \"\"\"\n    Read positions and rotations from a CSM linescan json state file.\n    \"\"\"\n    \n    j = read_csm_cam(json_file)\n\n    # Read the positions\n    positions_vec = j['m_positions']\n\n    # Reshape to Nx3 matrix using the reshape function\n    positions_vec = np.reshape(positions_vec, (-1, 3))\n\n    # Create a vector of vectors\n    positions = []\n    for i in range(positions_vec.shape[0]):\n        positions.append(positions_vec[i, :])\n\n    # Read the quaternions\n    quats = j['m_quaternions']\n\n    # Reshape to Nx4 matrix using the reshape function\n    quats = np.reshape(quats, (-1, 4))\n    \n    # Iterate over the rows and convert to rotation matrix\n    rotations = []\n    for i in range(quats.shape[0]):\n        r = R.from_quat(quats[i, :])\n        rotations.append(r.as_matrix())\n\n    return (positions, rotations)\n\ndef Rroll(theta):\n  return np.matrix([[ 1, 0           , 0           ],\n                   [ 0, math.cos(theta),-math.sin(theta)],\n                   [ 0, math.sin(theta), math.cos(theta)]])\n  \ndef Rpitch(theta):\n  return np.matrix([[ math.cos(theta), 0, math.sin(theta)],\n                   [ 0           , 1, 0           ],\n                   [-math.sin(theta), 0, math.cos(theta)]])\n  \ndef Ryaw(theta):\n  return np.matrix([[ math.cos(theta), -math.sin(theta), 0 ],\n                   [ math.sin(theta), math.cos(theta) , 0 ],\n                   [ 0           , 0            , 1 ]])\n\ndef isLinescan(cam_file):\n    \"\"\"\n    Read the first line from cam_file which tells if the sensor is linescan.\n    \"\"\"\n    lineScan = False\n    with open(cam_file, 'r') as f:\n        line = f.readline()\n        if 'LINE_SCAN' in line:\n            lineScan = True\n    \n    return lineScan\n\ndef roll_pitch_yaw(rot_mat, ref_rot_mat):\n\n    # Rotate about z axis by 90 degrees. This must be synched up with \n    # sat_sim. This will be a problem for non-sat_sim cameras.\n    T = np.zeros((3,3),float)\n    T[0, 1] = -1\n    T[1, 0] = 1\n    T[2, 2] = 1\n    Tinv = np.linalg.inv(T)\n\n    inv_ref_rot_mat = np.linalg.inv(ref_rot_mat)\n    N = np.matmul(inv_ref_rot_mat, rot_mat)\n    \n    return R.from_matrix(np.matmul(N, Tinv)).as_euler('XYZ', degrees=True)\n\n# Return at most this many elements from an array\ndef getFirstN(arr, N):\n    if N >= 0 and len(arr) > N:\n        return arr[:N]\n    else:\n        return arr\n\ndef poly_fit(X, Y):\n    \"\"\"\n    Fit a polynomial of degree 1 and return the fitted Y values.\n    \"\"\"\n    fit = np.poly1d(np.polyfit(X, Y, 1))\n    return fit(X)\n\n# Read a list. Return only the files that match the given pattern and have the given extension.\ndef read_list(list_file, pattern, extensions):\n    files = []\n    with open(list_file, 'r') as f:\n        for line in f:\n            line = line.strip()\n            for ext in extensions:\n              if pattern in line and line.endswith(ext):\n                files.append(line)\n    return files\n    \ndef multi_glob(prefix, extensions):\n    \"\"\"\n    Return a list of files matching the given prefix and extensions.\n    \"\"\"\n    files = []\n    for ext in extensions:\n        files += glob.glob(prefix + '*' + ext)  \n    return files\n\n# Read the positions and rotations from the given files. For linescan we will\n# have a single camera, but with many poses in it. For Pinhole we we will have\n# many cameras, each with a single pose.\ndef read_positions_rotations_from_file(cam_file):\n    \n  # Read the first line from cam_file\n  lineScan = isLinescan(cam_file)\n\n  positions = []\n  rotations = []\n\n  if lineScan:\n      # Read linescan data\n      (positions, rotations) = read_linescan_pos_rot(cam_file)\n  else:   \n      # read Pinhole (Frame) files in ASP .tsai or CSM .json format\n      asp_dict = read_frame_cam_dict(cam_file)\n      # get camera rotation\n      position = asp_dict['cam_cen_ecef']\n      rot_mat = asp_dict['rotation_matrix']\n      positions.append(position)\n      rotations.append(rot_mat)\n\n  return (positions, rotations)\n\n# Read the positions and rotations from the given files\ndef read_positions_rotations(cams):\n\n  (positions, rotations) = ([], [])\n  for i in range(len(cams)):\n      (p, r) = read_positions_rotations_from_file(cams[i])\n      positions += p\n      rotations += r\n\n  # Must have as many rotations as positions. That is needed as later\n  # we build ref rotations from positions.\n  if len(rotations) != len(positions):\n    print(\"Number of camera positions and orientations must be the same.\")\n    sys.exit(1)\n\n  return (positions, rotations)\n\ndef exclude_ref_cams(all_cams, ref_cams):\n\n    cams = []\n    camMap = set()\n    # Add ref_cams to camMap set\n    for c in ref_cams:\n        camMap.add(c)\n    \n    for c in all_cams:\n        if c not in camMap:\n            cams.append(c) \n    \n    return cams\n\n# Get rotations, then convert to NED.  That's why the loops below. \ndef read_angles(orig_cams, opt_cams, ref_cams):\n\n  # orig_cams and ref_cams must be the same size\n  if len(ref_cams) > 0 and len(orig_cams) != len(ref_cams):\n      print(\"Number of input and reference cameras must be the same. Got: \", \\\n           len(ref_cams), \" and \", len(opt_cams))\n      sys.exit(1)\n\n  (orig_positions, orig_rotations) = read_positions_rotations(orig_cams)\n  (opt_positions, opt_rotations)   = read_positions_rotations(opt_cams)\n  (ref_positions, ref_rotations)   = read_positions_rotations(ref_cams)\n  \n  # If we do not have ref cameras that determine the satellite orientation,\n  # estimate them from the camera positions\n  if len(ref_cams) == 0:\n    orig_ref_rotations = estim_satellite_orientation(orig_positions)\n    opt_ref_rotations  = estim_satellite_orientation(opt_positions)\n  else:\n    orig_ref_rotations = ref_rotations[:]\n    opt_ref_rotations  = ref_rotations[:]\n\n  orig_rotation_angles = []\n  opt_rotation_angles = []\n  for i in range(len(orig_rotations)):\n      angles = roll_pitch_yaw(orig_rotations[i], orig_ref_rotations[i])\n      orig_rotation_angles.append(angles)\n  for i in range(len(opt_rotations)):\n      angles = roll_pitch_yaw(opt_rotations[i], opt_ref_rotations[i])\n      opt_rotation_angles.append(angles)\n\n  return (orig_rotation_angles, opt_rotation_angles)\n\ndef findRange(orig, opt):\n  \"\"\"\n    Concatenate the orig and opt arrays and find the min and max values.\n  \"\"\"\n  concat = np.sort(np.concatenate((orig, opt)))\n  return (concat.min(), concat.max())\n    \ndef err_fun(vals, opt):\n  ''' Find the standard deviation or RMSE of the given values. '''\n  if opt.use_rmse:\n    return np.sqrt(np.multiply(vals, vals).mean())\n  return np.std(vals)\n\ndef setupLinescanPlot(rotation_angles, trim_ratio, cam_files):\n    \"\"\"\n       Prepare the linescan poses for plotting. \n    \"\"\"\n\n    # Remove the first and last few poses, based on the trim ratio\n    totalNum = len(rotation_angles)\n    removeNum = int(trim_ratio * totalNum)\n    removeNumBefore = int(removeNum / 2)\n    removeNumAfter = removeNum - removeNumBefore\n    b = removeNumBefore\n    e = totalNum - removeNumAfter\n    rotation_angles = rotation_angles[b:e]\n    \n    if len(rotation_angles) < totalNum:\n        print(\"Plotting the most central %d out of %d poses for linescan cameras.\" % \\\n            (len(rotation_angles), totalNum))  \n\n    # Read the json file\n    j = read_csm_cam(cam_files[0])\n    t0 = j['m_t0Quat']\n    dt = j['m_dtQuat']\n    numLines = j['m_nLines']\n    firstLine = 0\n    lastLine = numLines - 1\n\n    # These correspond to the poses that are being plotted, which can go beyond\n    # the first and last image lines\n    begPlotTime = t0 + removeNumBefore * dt\n    endPlotTime = begPlotTime + len(rotation_angles) * dt\n    begPlotLine = getLineAtTime(begPlotTime, j)\n    endPlotLine = getLineAtTime(endPlotTime, j)\n    \n    # The X axis for the plot\n    x_vals = np.linspace(begPlotLine, endPlotLine, len(rotation_angles))\n  \n    return (rotation_angles, firstLine, lastLine, x_vals)\n\ndef resampleVals(out_x, in_x, in_y):\n    \"\"\"\n    Given x and y values, and a new grid out_x, find the y values on the new grid.\n    Use linear interpolation.\n    \"\"\"\n\n    # If in_x and out_x are the same, return in_y\n    if np.array_equal(in_x, out_x):\n        return in_y\n    \n    out_y = np.interp(out_x, in_x, in_y)\n    return out_y\n\n# Load and plot each row in the figure given by 'ax'\ndef plot_row(ax, row, orbits, hasList, datasets, orbit_labels, dataset_labels,\n             ref_list, opt):\n\n  # We assume we have one or two datasets that we want to plot on top of each other.\n  numSets = len(datasets)\n  if numSets < 1:\n    print(\"Must specify at least one dataset.\")\n    sys.exit(1)\n\n  origPrefix = datasets[0]\n  origTag = dataset_labels[0]\n  optPrefix = \"\"\n  optTag = \"\"\n  if numSets == 2:\n      optPrefix  = datasets[1]\n      optTag  = dataset_labels[1]\n\n  camType = orbits[row]\n  camLabel = orbit_labels[row]\n\n  # This tool can mix and match ASP Pinhole .tsai files and CSM frame/linescan .json files.\n  extensions = ['.tsai', '.json']\n\n  # Read the opt cameras and their ref cameras. The latter may not exist as\n  # bundle adjusted does not create them. We will use the ref cams for orig cams.\n  opt_cams = []\n  ref_cams = []\n  print_ref_cam_warning = False\n  if numSets == 2:\n    if hasList:\n      opt_cams = read_list(optPrefix, camType, extensions)\n      ref_cams = []\n      if ref_list != \"\":\n        ref_cams = read_list(ref_list, camType, extensions)\n    else:\n      all_opt_cams = sorted(multi_glob(optPrefix + '*' + camType, extensions))\n      # Exclude any opt ref cams. We will use the orig ref cams later.\n      ref_cams     = sorted(multi_glob(optPrefix + '*' + camType + '*-ref', extensions))\n      opt_cams     = exclude_ref_cams(all_opt_cams, ref_cams)\n      if (not opt.use_ref_cams) and len(ref_cams) > 0:\n          print_ref_cam_warning = True\n\n  # Same for orig cams. Overwrite the earlier ref cams, if present,\n  # as we will use the orig ref cams\n  if hasList:\n    orig_cams = read_list(origPrefix, camType, extensions)\n    ref_cams = []\n    if ref_list != \"\":\n      ref_cams = read_list(ref_list, camType, extensions)\n\n  else: \n    all_orig_cams = sorted(multi_glob(origPrefix + '*' + camType, extensions))\n    ref_cams      = sorted(multi_glob(origPrefix + '*' + camType + '*-ref', extensions))\n    orig_cams     = exclude_ref_cams(all_orig_cams, ref_cams)\n  \n  if (not opt.use_ref_cams) and len(ref_cams) > 0:\n      print_ref_cam_warning = True\n\n  # If not using ref cams, wipe them\n  if not opt.use_ref_cams:\n      if (print_ref_cam_warning):\n          print(\"Found reference cameras but will not use them.\")\n      ref_cams = []\n\n  # Reduce the number of cameras to opt.num_cameras\n  orig_cams = getFirstN(orig_cams, opt.num_cameras)\n  if opt.use_ref_cams:\n      ref_cams  = getFirstN(ref_cams, opt.num_cameras)\n  if numSets == 2:\n      opt_cams  = getFirstN(opt_cams, opt.num_cameras)\n\n  # Check that these sets are the same size\n  if opt.use_ref_cams and len(orig_cams) != len(ref_cams):\n      print(\"Number of input and reference cameras must be thee same. See the \" + \\\n            \"option --use-ref-cams for more info. For these numbers, got: \", \\\n              len(ref_cams), \" and \", len(orig_cams))\n      sys.exit(1)\n  if numSets == 2 and opt.use_ref_cams and len(orig_cams) != len(opt_cams):\n      print(\"Number of cameras in both datasets must be the same when using \" + \\\n        \"reference cameras. Got: \", len(orig_cams), \" and \", len(opt_cams))\n      sys.exit(1)\n\n  # Throw an error if no cameras are found\n  if len(orig_cams) == 0:\n        print(\"No cameras found for orbit id \" + camType)\n        sys.exit(1)\n\n  # Read the rotations and convert them to roll, pitch, yaw\n  (orig_rotation_angles, opt_rotation_angles) = read_angles(orig_cams, opt_cams, ref_cams)\n\n  print(\"Number of rotations for orbit id \" + camType + ': ' + str(len(orig_rotation_angles)))\n  if numSets == 2 and (not isLinescan(orig_cams[0])):\n    # For linescan can handle different number of rotations but not for frame\n    if len(orig_rotation_angles) != len(opt_rotation_angles):\n        print(\"Number of rotations in the two datasets must be the same, got: \", \\\n              len(orig_rotation_angles), \" and \", len(opt_rotation_angles))\n        sys.exit(1)\n\n  # X axes for the plots (will change for linescan)\n  X1 = np.arange(len(orig_rotation_angles))\n  X2 = np.arange(len(opt_rotation_angles))\n  x_label = 'Frame index'\n\n  # For linescan, we will plot against image line. Number of rotations can differ.\n  if isLinescan(orig_cams[0]):\n      x_label = 'Image line'\n      (orig_rotation_angles, firstLine, lastLine, X1) = \\\n            setupLinescanPlot(orig_rotation_angles, opt.trim_ratio, orig_cams)\n      if numSets == 2:\n          (opt_rotation_angles, _, _, X2) = \\\n            setupLinescanPlot(opt_rotation_angles, opt.trim_ratio, opt_cams)\n  \n  # The order is roll, pitch, yaw, as returned by\n  # R.from_matrix().as_euler('XYZ',degrees=True)\n  orig_roll  = [r[0] for r in orig_rotation_angles]\n  orig_pitch = [r[1] for r in orig_rotation_angles]\n  orig_yaw   = [r[2] for r in orig_rotation_angles]\n  opt_roll   = [r[0] for r in opt_rotation_angles]\n  opt_pitch  = [r[1] for r in opt_rotation_angles]\n  opt_yaw    = [r[2] for r in opt_rotation_angles]\n\n  residualTag = ''\n  if opt.subtract_line_fit:\n      # Same line fit will be subtracted from all datasets\n      residualTag = ' residual'\n      F1          = np.arange(len(orig_roll))\n      fit_roll    = poly_fit(F1, orig_roll)\n      fit_pitch   = poly_fit(F1, orig_pitch)\n      fit_yaw     = poly_fit(F1, orig_yaw)\n      orig_roll   = orig_roll  - fit_roll\n      orig_pitch  = orig_pitch - fit_pitch\n      orig_yaw    = orig_yaw   - fit_yaw\n      \n      if numSets == 2:\n        if isLinescan(orig_cams[0]):\n          L1 = max(len(orig_roll) - 1.0, 1.0)\n          L2 = max(len(opt_roll) - 1.0, 1.0)\n          F2 = np.arange(len(opt_roll)) * L1 / L2\n          opt_roll  = opt_roll  - resampleVals(F2, F1, fit_roll)\n          opt_pitch = opt_pitch - resampleVals(F2, F1, fit_pitch)\n          opt_yaw   = opt_yaw   - resampleVals(F2, F1, fit_yaw)\n        else:\n          # There is no resampling with frame cameras, and these will have same size \n          opt_roll  = opt_roll  - fit_roll\n          opt_pitch = opt_pitch - fit_pitch\n          opt_yaw   = opt_yaw   - fit_yaw\n\n  if isLinescan(orig_cams[0]):\n    minVal = [0, 0, 0]\n    maxVal = [0, 0, 0]\n    (minVal[0], maxVal[0]) = findRange(orig_roll, opt_roll)\n    (minVal[1], maxVal[1]) = findRange(orig_pitch, opt_pitch)\n    (minVal[2], maxVal[2]) = findRange(orig_yaw, opt_yaw)\n    \n  fmt = \"{:.2e}\" # 2 digits of precision are enough for display \n  orig_roll_err = fmt.format(err_fun(orig_roll, opt))\n  orig_pitch_err = fmt.format(err_fun(orig_pitch, opt))\n  orig_yaw_err = fmt.format(err_fun(orig_yaw, opt))\n  err_str = 'StDev: '\n  if opt.use_rmse:\n        err_str = ' RMSE: '\n  print(origTag + \" \" + camType + \" roll \" + err_str + orig_roll_err + \" degrees\")\n  print(origTag + \" \" + camType + \" pitch \" + err_str + orig_pitch_err + \" degrees\")\n  print(origTag + \" \" + camType + \" yaw \" + err_str + orig_yaw_err + \" degrees\")\n  (opt_roll_err, opt_pitch_err, opt_yaw_err) = (0, 0, 0) # initialize\n  if numSets == 2:\n      opt_roll_err = fmt.format(err_fun(opt_roll, opt))\n      opt_pitch_err = fmt.format(err_fun(opt_pitch, opt))\n      opt_yaw_err = fmt.format(err_fun(opt_yaw, opt))\n      print(optTag + \" \" + camType + \" roll \" + err_str + opt_roll_err + \" degrees\")\n      print(optTag + \" \" + camType + \" pitch \" + err_str + opt_pitch_err + \" degrees\")\n      print(optTag + \" \" + camType + \" yaw \" + err_str + opt_yaw_err + \" degrees\")\n\n  # Find the handle to the axis object for the current row\n  if len(ax.shape) == 1:\n      A = ax # otherwise get an indexing error\n  else:\n      A = ax[row]\n\n  # Plot residuals\n  lw = opt.line_width\n  A[0].plot(X1, orig_roll, label=origTag, color = 'r', linewidth = lw)\n  A[1].plot(X1, orig_pitch, label=origTag, color = 'r', linewidth = lw)\n  A[2].plot(X1, orig_yaw, label=origTag, color = 'r', linewidth = lw)\n  if numSets == 2:\n      A[0].plot(X2, opt_roll, label=optTag, color = 'b', linewidth = lw)\n      A[1].plot(X2, opt_pitch, label=optTag, color = 'b', linewidth = lw)\n      A[2].plot(X2, opt_yaw, label=optTag, color = 'b', linewidth = lw)\n\n  if isLinescan(orig_cams[0]):\n    # Plot vertical lines showing where the first and last image lines are\n    for index in range(3):\n        A[index].plot([firstLine, firstLine], [minVal[index], maxVal[index]],\n                  label = 'First image line', color = 'black', linestyle = '--')\n        A[index].plot([lastLine, lastLine], [minVal[index], maxVal[index]],\n                    label = 'Last image line', color = 'black', linestyle = '--')\n\n  A[0].set_title(camLabel + ' roll'  + residualTag)\n  A[1].set_title(camLabel + ' pitch' + residualTag)\n  A[2].set_title(camLabel + ' yaw '  + residualTag)\n\n  A[0].set_ylabel('Degrees')\n  #A[1].set_ylabel('Degrees') # don't repeat this as it takes space\n  #A[2].set_ylabel('Degrees')\n\n  err = ((orig_roll_err, opt_roll_err), (orig_pitch_err, opt_pitch_err), (orig_yaw_err, opt_yaw_err))\n  for index in range(3):\n      A[index].set_xlabel(x_label)\n      # Calc err text\n      if numSets == 1:\n          txt = err_str + err[index][0]\n      else: \n          txt = err_str + err[index][0] + \", \" + err[index][1]\n          \n      # Make the margin bigger so that the text does not overlap with the data    \n      (x1, x2, y1, y2) = A[index].axis()\n      A[index].axis((x1, x2, y1 - 0.025*(y2-y1), y2))\n      \n      # Add err values as text. Careful to not put text on top of data. \n      A[index].text(0.05, 0.05, txt,\n          va='top', color='k', transform=A[index].transAxes, fontsize=fs)    \n      \n      # Legend\n      A[index].legend()\n      # Se the font size\n      ac = A[index]\n      for item in ([ac.title, ac.xaxis.label, ac.yaxis.label] +\n                      ac.get_xticklabels() + ac.get_yticklabels()):\n          item.set_fontsize(fs)\n\n# Main function. Set up the arguments.\nusage = \"python orbit_plot.py <options>\\n\"\n\nparser = argparse.ArgumentParser(usage=usage,\n                                 formatter_class=argparse.RawTextHelpFormatter)\n\nparser.add_argument('--dataset', dest = 'dataset', default = '',\n                    help='The dataset to plot. Only one or two datasets are supported '\n                    '(for example, before and after optimization). Each dataset can have '\n                    'several types of images, given by --orbit-id. The dataset is the prefix '\n                    'of the cameras, such as \"cameras/\" or \"opt/run-\". It is to be followed '\n                    'by the orbit id, such as, \"nadir\" or \"aft\". If more than one dataset, '\n                    'they will be plotted on top of each other.')\n\nparser.add_argument('--orbit-id', dest = 'orbit_id', default = '',\n                    help='The id (a string) that determines an orbital group of ' + \n                    'cameras. If more than one, separate them by comma, with no ' + \n                    'spaces in between.') \n\nparser.add_argument('--dataset-label', dest = 'dataset_label', default = '',\n                    help='The label to use for each dataset in the legend. If more than ' + \n                    'one, separate them by comma, with no spaces in between. If not '     + \n                    'set, will use the dataset name.')\n\nparser.add_argument('--list', dest = 'list', default = '',\n                    help='Instead of specifying --dataset, load the cameras listed '     + \n                    'in this file (one per line). Only the names matching --orbit-id '   + \n                    'will be read. If more than one list, separate them by comma, with ' + \n                    'no spaces in between.')\n\nparser.add_argument('--ref-list', dest = 'ref_list', default = '',\n                    help='When --list is specified, read the ref cams from here.')\n\nparser.add_argument('--orbit-label', dest = 'orbit_label', default = '',\n                    help='The label to use for each orbital group (will be shown as '\n                    'part of the title). If more than one, separate them by comma, with ' + \n                    'no spaces in between. If not set, will use the orbit id.')\n\nparser.add_argument('--use-ref-cams', dest = 'use_ref_cams', action='store_true',\n                    help='Read from disk reference cameras that determine the satellite ' + \n                    'orientation. This assumes the first dataset was created with '       + \n                    'sat_sim with the option --save-ref-cams. The naming convention '     +\n                    'assumes the additional -ref string as part of the reference camera ' +\n                    'names, before the filename extension. Without this option, the '     +\n                    'satellite orientations are estimated based on camera positions.')\n\nparser.add_argument('--subtract-line-fit', dest = 'subtract_line_fit', action='store_true',\n                    help='If set, subtract the best line fit from the curves being '    + \n                    'plotted. If more than one dataset is present, the same line '      +\n                    'fit (for the first one) will be subtracted from all of them. '     +\n                    'This is useful for inspecting subtle changes.')\n\nparser.add_argument('--use-rmse', dest = 'use_rmse', action='store_true',\n                    help='Compute and display the root mean square error (RMSE) ' +\n                    'rather than the standard deviation. This is useful when a '  +\n                    'systematic shift is present. See also --subtract-line-fit.')\n\nparser.add_argument('--num-cameras',  dest='num_cameras', type=int, default = -1,\n                    help='Plot only the first this many cameras from each orbital ' + \n                    'sequence. By default, plot all of them.')\n\nparser.add_argument('--trim-ratio',  dest='trim_ratio', type=float, default = 0.0,\n                    help='Trim ratio. Given a value between 0 and 1 (inclusive), '        + \n                    'remove this fraction of camera poses from each sequence, with half ' + \n                    'of this amount for poses at the beginning and half at the end of '   + \n                    'the sequence. This is used only for linescan cameras, to not plot '  + \n                    'camera poses beyond image lines. For cameras created with sat_sim, ' + \n                    'a value of 0.5 should be used.')\n\nparser.add_argument('--figure-size', dest = 'figure_size', default = '15,15',\n                    help='Specify the width and height of the figure having the plots, ' + \n                    'in inches. Use two numbers with comma as separator (no spaces).')\n\nparser.add_argument('--title', dest = 'title', default = '',\n                    help='Set this as the figure title, to be shown on top of all plots.')\n\nparser.add_argument('--line-width', dest = 'line_width', type=float, default = 1.5,\n                    help='Line width for the plots.')\n\nparser.add_argument('--font-size', dest = 'font_size', type=int, default = 14,\n                    help='Font size for the plots.')\n\nparser.add_argument('--output-file', dest = 'out_file', type=str, default = '',\n                    help='Save the figure to this image file, instead of showing it on ' +\n                    'the screen. A png extension is recommended.')\n\n(opt, args) = parser.parse_known_args(sys.argv)\n\n# Throw an error if not all args have been parsed\nif len(args) > 1:\n    print(\"Not all arguments were parsed. Unprocessed values:\", args[1:])\n    sys.exit(1)\n\nif opt.dataset == \"\" and opt.list == \"\": \n    print(\"Must set --dataset or --list.\")\n    parser.print_help()\n    sys.exit(1)\n\nif opt.dataset != \"\" and opt.list != \"\": \n    print(\"Cannot set both --dataset and --list.\")\n    parser.print_help()\n    sys.exit(1)\n\nhasList = False\nif opt.dataset == \"\":\n    # If the dataset label is not set, use the list\n    hasList = True\n    opt.dataset = opt.list\n\nif hasList and opt.use_ref_cams and opt.ref_list == \"\":\n    print(\"Must set --ref-list when using --use-ref-cams with --list.\")\n    parser.print_help()\n    sys.exit(1)\n\nif opt.orbit_id == \"\":\n    print(\"Must set --orbit-id.\")\n    parser.print_help()\n    sys.exit(1)\n\nif opt.trim_ratio < 0:\n    print(\"The value of --trim-ratio must be non-negative.\")\n    parser.print_help()\n    sys.exit(1)\n\nif opt.line_width <= 0:\n    print(\"The value of --line-width must be positive.\")\n    parser.print_help()\n    sys.exit(1)\n\nif opt.font_size <= 0:\n    print(\"The value of --font-size must be positive.\")\n    parser.print_help()\n    sys.exit(1)\n\n# Parse the datasets and their labels. Split by comma.\ndatasets = opt.dataset.split(',')\ndataset_labels = opt.dataset_label.split(',')\nif len(dataset_labels) == 0 or (len(dataset_labels) == 1 and dataset_labels[0] == \"\"):\n    dataset_labels = datasets[:]\nif len(dataset_labels) != len(datasets):\n    print(\"Number of datasets/lists and dataset_labels must agree. Got \", datasets, \" and \", dataset_labels)\n    sys.exit(1)\n\n# Parse the orbits and their labels. Split by comma.\norbits = opt.orbit_id.split(',')\norbit_labels = opt.orbit_label.split(',')\nif len(orbit_labels) == 0 or (len(orbit_labels) == 1 and orbit_labels[0] == \"\"):\n    orbit_labels = orbits[:]\nif len(orbit_labels) != len(orbits):\n    print(\"Number of orbits and orbit_labels must agree. Got \", orbits, \" and \", orbit_labels)\n    sys.exit(1)\n\n# Read the figure dimensions\nfigure_size = opt.figure_size.split(',')\nif len(figure_size) != 2:\n    print(\"The --figure-size option must have two values. Got: \", figure_size)\n    sys.exit(1)\nfigure_size = [float(x) for x in figure_size]\n\n# We assume we have one or two datasets that we want to plot on top of each other.\nnumSets = len(datasets)\nif numSets < 1:\n    print(\"Must specify at least one dataset.\")\n    sys.exit(1)\n\nf, ax = plt.subplots(len(orbits), 3, sharex=False, sharey = False, \n                     figsize = (figure_size[0], figure_size[1]))\n\n# Set up the legend in the upper right corner. We will have text in upper-left\nplt.rcParams[\"legend.loc\"] = 'upper right' \n\n# Set up the font for all elements\nfs = opt.font_size\nplt.rcParams.update({'font.size': fs})\nplt.rc('axes', titlesize = fs)   # fontsize of the axes title\nplt.rc('axes', labelsize = fs)   # fontsize of the x and y labels\nplt.rc('xtick', labelsize = fs)  # fontsize of the tick labels\nplt.rc('ytick', labelsize = fs)  # fontsize of the tick labels\nplt.rc('legend', fontsize = fs)  # legend fontsize\nplt.rc('figure', titlesize = fs) # fontsize of the figure title\n\n# Plot each row in the figure\nfor row in range(len(orbits)):\n  plot_row(ax, row, orbits, hasList, datasets, orbit_labels, dataset_labels, \n           opt.ref_list, opt)\n\n# Show a title if set\nif opt.title != \"\":\n    f.suptitle(opt.title, fontsize=fs)\n\nplt.tight_layout()\n\nif opt.out_file == \"\":\n    plt.show()\nelse:\n    # Create the parent directory for this file, then save it. \n    print(\"Saving the figure to: \" + opt.out_file)\n    parent = os.path.dirname(opt.out_file)\n    if parent != \"\" and not os.path.exists(parent):\n        os.makedirs(parent)\n    plt.ioff()\n    plt.savefig(opt.out_file)\n"
  },
  {
    "path": "src/asp/Tools/orbitviz.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n/// \\file orbitviz.cc\n/// Show the positions of the cameras above the planet in kml format.\n\n#include <asp/Core/Macros.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Sessions/StereoSessionFactory.h>\n#include <asp/Core/FileUtils.h>\n#include <asp/Core/AspProgramOptions.h>\n#include <asp/asp_config.h> // defines ASP_HAVE_PKG_ISIS\n\n#if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1\n#include <asp/IsisIO/IsisCameraModel.h>\n#endif\n\n#include <vw/FileIO/KML.h>\n#include <vw/FileIO/FileUtils.h>\n#include <vw/InterestPoint/InterestPoint.h>\n#include <vw/InterestPoint/MatcherIO.h>\n#include <vw/FileIO/FileTypes.h>\n#include <vw/FileIO/FileUtils.h>\n\n#include <iomanip>\n\n#include <boost/algorithm/string.hpp>\n#include <boost/program_options.hpp>\n#include <boost/filesystem/path.hpp>\n#include <boost/filesystem/operations.hpp>\n#include <boost/filesystem/fstream.hpp>\nusing namespace vw;\nusing namespace vw::camera;\nusing namespace vw::cartography;\nnamespace po = boost::program_options;\nnamespace fs = boost::filesystem;\n\nstruct Options : public vw::GdalWriteOptions {\n  Options() : separate_camera_files(true) {}\n  // Input\n  std::vector<std::string> input_files;\n  std::string stereo_session, path_to_outside_model, bundle_adjust_prefix;\n\n  // Settings\n  bool separate_camera_files, write_csv, load_camera_solve, hide_labels;\n  std::string datum;\n  double model_scale; ///< Size scaling applied to 3D models\n  int    linescan_line; ///< Show the camera position at this line\n  int    linescan_sample;\n\n  // Output\n  std::string out_file;\n};\n\n\n// TODO: Eliminate bool input and move somewhere else.\n/// Separates a list of files into camera files and image files.\n/// - The camera files may be the same as the image files.\nsize_t split_files_list(std::vector<std::string> const& input_files,\n                        std::vector<std::string>      & image_files, \n                        std::vector<std::string>      & camera_files,\n                        const bool separate_camera_files) {\n\n  size_t num_cameras = separate_camera_files ? input_files.size()/2 : input_files.size();\n  vw_out() << \"Number of cameras: \" << num_cameras << std::endl;\n  \n  // Split the list of image files and camera files\n  image_files.resize (num_cameras);\n  camera_files.resize(num_cameras);\n  for (size_t i = 0, store=0; store < num_cameras; ++store) {\n    image_files[store] = input_files[i];\n    if (separate_camera_files){ // Camera file comes after the image file\n      camera_files[store] = input_files[i+1];\n      i += 2;\n    } else { // Camera file is the same as the image file\n      camera_files[store] = camera_files[store];\n      i += 1;\n    }\n  } // End loop through cameras\n  \n  return num_cameras;\n}\n\n/// Get a list of the files in the solver output folder\nsize_t get_files_from_solver_folder(std::string                 const& solver_folder,\n                                      std::vector<std::string>       & image_files, \n                                      std::vector<std::string>       & camera_files,\n                                      std::vector<std::vector<int> > & matched_cameras) {\n  image_files.clear();\n  camera_files.clear();\n  matched_cameras.clear();\n  std::vector<std::string> solver_files;\n  get_files_in_folder(solver_folder, solver_files);\n  \n  // Identify the image extension\n  std::string image_ext = \"\";\n  for (size_t i=0; i<solver_files.size(); ++i) {\n    if (vw::has_image_extension(solver_files[i])) {\n      image_ext = get_extension(solver_files[i], false);\n      break;\n    }\n  }\n  vw_out() << \"image_ext: \" << image_ext << std::endl;\n  if (image_ext == \"\")\n    vw_throw( ArgumentErr() << \"Failed to find any image files in the camera_solve directory: \"\n                            << solver_folder);\n  \n  // Grab a list of just the image files\n  size_t num_images = get_files_in_folder(solver_folder, image_files, image_ext);\n  vw_out() << \"Number of cameras: \" << num_images << std::endl;\n  \n  // Make a list of the camera model files\n  camera_files.resize(num_images);\n  for (size_t i=0; i<num_images; ++i)\n    camera_files[i] = solver_folder + \"/\" + image_files[i] + \".final.tsai\";\n    \n  // Search for IP match files\n  std::vector<std::string> match_files;\n  size_t num_matches = get_files_in_folder(solver_folder, match_files, \".match\");\n  matched_cameras.resize(num_images);\n  \n  // Ignore any match files where there are not many matches\n  const size_t MIN_MATCHES = 30; // This is the default value, but it could be made an option.\n  std::vector<ip::InterestPoint> ip1, ip2;\n  for (size_t m=0; m<num_matches; ++m) {\n    vw::ip::read_binary_match_file(solver_folder+ \"/\"+match_files[m], ip1, ip2);\n    if (ip1.size() < MIN_MATCHES)\n      match_files[m] = \"\";\n  }\n  \n  // Figure out which image pairs are matched\n  std::string f1, f2;\n  for (size_t i=0; i<num_images; ++i) {\n    matched_cameras[i].clear(); // Start with empty list of matches\n    f1 = strip_directory_and_extension(image_files[i]);\n    for (size_t j=0; j<num_images; ++j) {\n      if (i == j) // No self-matching!\n        continue;\n      f2 = strip_directory_and_extension(image_files[j]);\n      for (size_t m=0; m<num_matches; ++m) {\n        // If both file names are contained in the match file name,\n        //  make a match between image files i and j\n        if ( (match_files[m].find(f1) != std::string::npos) && \n             (match_files[m].find(f2) != std::string::npos)   ) {\n          matched_cameras[i].push_back(j);\n          match_files[m] = \"\"; // Clear this name so we don't use the match twice\n        }\n      }\n    }\n  } // End nested loops for setting up file matches\n    \n  return num_images;\n}\n\nvoid handle_arguments( int argc, char *argv[], Options& opt ) {\n  po::options_description general_options(\"\");\n  general_options.add_options()\n    (\"output,o\",                po::value(&opt.out_file)->default_value(\"orbit.kml\"),\n          \"The output kml file that will be written.\")\n    (\"reference-spheroid,r\",    po::value(&opt.datum)->default_value(\"WGS_1984\"),\n     \"Use this reference spheroid (datum). Options: WGS_1984, D_MOON (1,737,400 meters), D_MARS (3,396,190 meters), MOLA (3,396,000 meters), NAD83, WGS72, and NAD27. Also accepted: Earth (=WGS_1984), Mars (=D_MARS), Moon (=D_MOON).\")\n    (\"use-path-to-dae-model,u\", po::value(&opt.path_to_outside_model),\n          \"Instead of using an icon to mark a camera, use a 3D model with extension .dae.\")\n    (\"linescan-line\",          po::value(&opt.linescan_line)->default_value(0),\n          \"Show the position of the camera when this line was captured.\")\n    (\"linescan-sample\",          po::value(&opt.linescan_sample)->default_value(0),\n          \"Show the position of the camera when this sample was captured.\")\n    (\"hide-labels\",             po::bool_switch(&opt.hide_labels)->default_value(false)->implicit_value(true),\n          \"Hide image names unless the camera is highlighted.\")\n    // The KML class applies a model scale of 3000 * this value.\n    (\"model-scale\",             po::value(&opt.model_scale)->default_value(1.0/30.0),\n          \"Scale factor applied to 3D model size.\")\n    (\"session-type,t\",   po::value(&opt.stereo_session)->default_value(\"\"),\n     \"Select the stereo session type to use for processing. Usually the program can select this automatically by the file extension, except for xml cameras. See the doc for options.\")\n    (\"load-camera-solve\",       po::bool_switch(&opt.load_camera_solve)->default_value(false)->implicit_value(true),\n          \"Load the results from a run of the camera-solve tool. The only positional argument must be the path to the camera-solve output folder.\")\n    (\"write-csv\", po::bool_switch(&opt.write_csv)->default_value(false),\n     \"Write a csv file with the orbital data.\")\n    (\"bundle-adjust-prefix\",    po::value(&opt.bundle_adjust_prefix),\n     \"Use the camera adjustment obtained by previously running bundle_adjust with this output prefix.\");\n  general_options.add(vw::GdalWriteOptionsDescription(opt));\n\n  po::options_description positional(\"\");\n  positional.add_options()\n    (\"input-files\", po::value(&opt.input_files) );\n\n  po::positional_options_description positional_desc;\n  positional_desc.add(\"input-files\", -1);\n\n  std::string usage(\"[options] <input images and cameras>\\nNote: All cameras and their images must be of the same session type.\");\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line(argc, argv, opt, general_options, general_options,\n                            positional, positional_desc, usage,\n                            allow_unregistered, unregistered);\n\n  // Need this to be able to load adjusted camera models. That will happen\n  // in the stereo session.\n  asp::stereo_settings().bundle_adjust_prefix = opt.bundle_adjust_prefix;\n}\n\nint main(int argc, char* argv[]) {\n\n  Options opt;\n  try {\n    handle_arguments(argc, argv, opt);\n\n\n    // Get the list of image files and camera model files\n    size_t num_cameras = 0;\n    std::vector<std::string> image_files, camera_files;\n    std::vector<std::vector<int> > matched_cameras;\n    if (!opt.load_camera_solve) {\n      bool ensure_equal_sizes = true;\n      asp::separate_images_from_cameras(opt.input_files,\n\t\t\t\t\timage_files, camera_files, // outputs\n\t\t\t\t\tensure_equal_sizes);\n      num_cameras = image_files.size();\n    }else{\n      num_cameras = get_files_from_solver_folder(opt.input_files[0], image_files, \n                                                 camera_files, matched_cameras);\n    }\n\n    if ( image_files.empty() )\n      vw_throw( ArgumentErr() << \"No image files detected.\\n\" );\n    \n    std::string first_image = image_files[0];\n    std::string first_camera = first_image;\n    if (!camera_files.empty()) \n      first_camera = camera_files[0];\n        asp::SessionPtr session\n      (asp::StereoSessionFactory::create(opt.stereo_session, // may change inside\n                                         opt,\n                                         first_image, first_image,\n                                         first_camera, first_camera\n                                         ) );\n\n    // Prepare output directory\n    vw::create_out_dir(opt.out_file);\n    \n    // Create the KML file. The KML title comes from the output file name.\n    KMLFile kml( opt.out_file, strip_directory_and_extension(opt.out_file));\n\n    // Style listing\n    if ( opt.path_to_outside_model.empty() ) {\n      // Placemark Style\n      kml.append_style( \"plane\", \"\", 1.2,\n                        \"http://maps.google.com/mapfiles/kml/shapes/airports.png\", \n                        opt.hide_labels);\n      kml.append_style( \"plane_highlight\", \"\", 1.4,\n                        \"http://maps.google.com/mapfiles/kml/shapes/airports.png\");\n      kml.append_stylemap( \"camera_placemark\", \"plane\",\n                           \"plane_highlight\" );\n    }\n\n    // Load up the datum\n    cartography::Datum datum(opt.datum);\n    vw_out() << \"Using datum: \" << datum << std::endl;\n\n    std::string csv_file = fs::path(opt.out_file).replace_extension(\"csv\").string();\n    std::ofstream csv_handle;\n    if ( opt.write_csv ) {\n      csv_handle.open(csv_file.c_str());\n    \n      if ( !csv_handle.is_open() )\n        vw_throw( IOErr() << \"Unable to open output file.\\n\" );\n    }\n    \n    Vector2 camera_pixel(opt.linescan_sample, opt.linescan_line);\n\n    // Building Camera Models and then writing to KML\n    std::vector<Vector3> camera_positions(num_cameras);\n    for (size_t i=0; i < num_cameras; i++) {\n      boost::shared_ptr<camera::CameraModel> current_camera;\n\n      // This is so clumsy, a new stereo session needs to be loaded for each\n      // input camera.\n      asp::SessionPtr session\n        (asp::StereoSessionFactory::create(opt.stereo_session, // may change inside\n                                           opt,\n                                           image_files[i],  image_files[i],\n                                           camera_files[i], camera_files[i]\n                                           ) );\n      current_camera = session->camera_model(image_files[i], camera_files[i]);\n\n      if ( opt.write_csv ) {\n        csv_handle << image_files[i] << \", \";\n\n        // Add the ISIS camera serial number if applicable\n#if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1\n        boost::shared_ptr<IsisCameraModel> isis_cam =\n          boost::dynamic_pointer_cast<IsisCameraModel>(current_camera);\n        if ( isis_cam != NULL ) {\n          csv_handle << isis_cam->serial_number() << \", \";\n        }\n#endif\n\n        Vector3 xyz = current_camera->camera_center(camera_pixel);\n        csv_handle << std::setprecision(12);\n        csv_handle << xyz[0] << \", \"\n                   << xyz[1] << \", \" << xyz[2] << \"\\n\";\n      } // End csv write condition\n      \n      // Compute and record the GDC coordinates\n      Vector3 lon_lat_alt = datum.cartesian_to_geodetic(\n                                current_camera->camera_center(camera_pixel));\n      camera_positions[i] = lon_lat_alt;\n\n      // Adding Placemarks\n      std::string display_name = strip_directory(image_files[i]);\n      if (!opt.path_to_outside_model.empty()) {\n        kml.append_model( opt.path_to_outside_model,\n                          lon_lat_alt.x(), lon_lat_alt.y(),\n                          inverse(current_camera->camera_pose(camera_pixel)),\n                          display_name, \"\",\n                          lon_lat_alt[2], opt.model_scale );\n      } else {\n        kml.append_placemark( lon_lat_alt.x(), lon_lat_alt.y(),\n                              display_name, \"\", \"camera_placemark\",\n                              lon_lat_alt[2], true );\n      }\n      \n    } // End loop through cameras\n\n    // Draw lines between camera positions representing camera\n    //  pairs with match files.\n    const std::string style_id = \"ip_match_style\";\n    kml.append_line_style(style_id, \"FF00FF00\", 1.0); // Green line with default size\n    std::vector<Vector3> line_ends(2);\n    for (size_t i=0; i<matched_cameras.size(); ++i) {\n      line_ends[0] = camera_positions[i];\n      for (size_t j=0; j<matched_cameras[i].size(); ++j) {\n        int index = matched_cameras[i][j];\n        line_ends[1] = camera_positions[index];\n        kml.append_line(line_ends, \"\", style_id);\n      }\n    }\n\n\n    // Put the Writing: messages here, so that they show up after all other info.\n    vw_out() << \"Writing: \" << opt.out_file << std::endl; \n    kml.close_kml();\n\n    if (opt.write_csv){\n      vw_out() << \"Writing: \" << csv_file << std::endl;\n      csv_handle.close();\n    }\n    \n  } ASP_STANDARD_CATCHES;\n\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/otsu_threshold.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file otsu_thresh.cc\n///\n/// Tool for finding the Otsu image threshold\n/// https://en.wikipedia.org/wiki/Otsu%27s_method\n\n#include <limits>\n\n#include <vw/FileIO/DiskImageUtils.h>\n#include <vw/Image/Statistics.h>\n\n#include <asp/Core/AspProgramOptions.h>\n#include <asp/Core/Macros.h>\n\nnamespace po = boost::program_options;\n\nusing namespace vw;\n\nstruct Options: vw::GdalWriteOptions {\n  std::vector<std::string> image_files;\n  bool has_nodata_value;\n  std::int64_t num_samples, num_bins;\n  double nodata_value;\n  Options(): has_nodata_value(false), num_samples(-1),\n             nodata_value(std::numeric_limits<double>::quiet_NaN()){}\n};\n\nvoid handle_arguments(int argc, char *argv[], Options& opt) {\n  po::options_description general_options(\"\");\n  // Add the reverse option\n  general_options.add(vw::GdalWriteOptionsDescription(opt));\n  general_options.add_options()\n    (\"num-samples\", po::value(&opt.num_samples)->default_value(-1),\n     \"The number of samples to pick from the image. If not specified, hence set to -1, \"\n     \"the full image will be used.\")\n    (\"num-bins\", po::value(&opt.num_bins)->default_value(256),\n     \"Number of bins to use for the histogram. A larger value is \"\n     \"suggested if the image has outlying pixel values.\")\n    (\"nodata-value\", po::value(&opt.nodata_value),\n     \"Use this nodata value instead of what is read from the file, if present.\");\n  \n  po::options_description positional(\"\");\n  positional.add_options()\n    (\"image-files\", po::value(&opt.image_files));\n  \n  po::positional_options_description positional_desc;\n  positional_desc.add(\"image-files\", -1);\n\n  std::string usage(\"[options] <images>\");\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line(argc, argv, opt, general_options, general_options,\n                            positional, positional_desc, usage,\n                            allow_unregistered, unregistered);\n  \n  opt.has_nodata_value  = vm.count(\"nodata-value\");\n\n  if (opt.image_files.empty())\n    vw_throw(ArgumentErr() << \"No input images were specified.\\n\" << usage << general_options);\n\n  if (opt.num_bins <= 100) \n    vw_throw(ArgumentErr() << \"At least 100 bins should be used, and ideally more.\\n\"\n             << usage << general_options);\n}\n\nint main( int argc, char *argv[] ) {\n\n  Options opt;\n  \n  try {\n\n    // Find command line options\n    handle_arguments(argc, argv, opt);\n\n    for (size_t it = 0; it < opt.image_files.size(); it++) {\n      std::string image_file = opt.image_files[it];\n\n      std::cout << \"Reading image: \" << image_file << std::endl;\n      DiskImageView<float> image(image_file);\n      \n      boost::shared_ptr<vw::DiskImageResource> rsrc(vw::DiskImageResourcePtr(image_file));\n      \n      // Check for nodata value in the file\n      if (opt.has_nodata_value) {\n        std::cout << \"Using as nodata value: \" << opt.nodata_value << \".\\n\";\n      }else if (rsrc->has_nodata_read()) {\n        opt.nodata_value = rsrc->nodata_read();\n        opt.has_nodata_value = true;\n        std::cout << \"Extracted nodata value from file: \" << opt.nodata_value << \".\\n\";\n      } else {\n        std::cout << \"No nodata value present in the file.\" << std::endl;\n      }\n\n      // Use a 64 bit int to not run into an overflow\n      std::int64_t num_rows = image.rows(), num_cols = image.cols();\n      std::int64_t num_vals = num_rows * num_cols;\n\n      if (num_vals <= 0) \n        vw_throw(ArgumentErr() << \"Found empty image: \" << image_file << \"\\n\");\n      \n      double samp_ratio = 1.0;\n      if (opt.num_samples > 0) \n        samp_ratio = sqrt(double(num_vals) / double(opt.num_samples));\n      samp_ratio = std::max(samp_ratio, 1.0);\n\n      std::int64_t num_sample_rows = round(num_rows / samp_ratio);\n      num_sample_rows = std::max(std::int64_t(1), num_sample_rows);\n      num_sample_rows = std::min(num_rows, num_sample_rows);\n      \n      std::int64_t num_sample_cols = round(num_cols / samp_ratio);\n      num_sample_cols = std::max(std::int64_t(1), num_sample_cols);\n      num_sample_cols = std::min(num_cols, num_sample_cols);\n      \n      std::cout << \"Number of image rows and columns: \"\n                << num_rows << \", \" << num_cols << \"\\n\";\n      std::cout << \"Picking a uniform sample of dimensions \"\n                << num_sample_rows << \", \" << num_sample_cols << \"\\n\";\n      std::cout << \"Number of bins in the histogram: \" << opt.num_bins << std::endl;\n      std::cout << \"It may take several minutes to find the answer.\\n\";\n\n      // The mask creation can handle a NaN for the opt.nodata_value.\n      double threshold = vw::otsu_threshold(create_mask(image, opt.nodata_value),\n                                               num_sample_rows, num_sample_cols,\n                                               opt.num_bins);\n\n\n      // A different implementation, which gives the same result\n      // if above the full image is sampled and 256 bins are used.\n      //double threshold2 = vw::otsu_threshold(create_mask(image, opt.nodata_value));\n      \n      vw_out() << std::setprecision(16)\n        << \"Otsu threshold for image \" << image_file << \": \" << threshold << \"\\n\";\n    }\n    \n  } ASP_STANDARD_CATCHES;\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/pansharp.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n#include <asp/Core/Macros.h>\n#include <asp/Core/AspProgramOptions.h>\n#include <asp/Camera/RPC_XML.h>\n\n#include <vw/Image/ImageChannels.h>\n#include <vw/Image/ImageView.h>\n#include <vw/Cartography/GeoTransform.h>\n#include <vw/FileIO/FileUtils.h>\n\nusing std::endl;\nusing std::string;\n\nusing namespace vw;\nusing namespace vw::cartography;\nnamespace po = boost::program_options;\nnamespace fs = boost::filesystem;\n\n\n\n// TODO: Move these to vw/PixelType.h ??\n// - These don't follow the existing pixel color conventions!\n\n/// Convert an RGB pixel to a YCbCr pixel\n/// - So far this only works for unsigned char and unsigned short.\ntemplate <typename T>\nT rgbToYCbCr(T const& rgb, double min_val, double max_val) {\n  // Convert\n  double mean_val = (min_val + max_val+1) / 2.0;\n  double temp[3];\n  temp[0] =            0.299   *rgb[0] + 0.587   *rgb[1] + 0.114   *rgb[2];\n  temp[1] = mean_val - 0.168736*rgb[0] - 0.331264*rgb[1] + 0.5     *rgb[2];\n  temp[2] = mean_val + 0.5     *rgb[0] - 0.418688*rgb[1] - 0.081312*rgb[2];\n  // Copy and constrain\n  T ycbcr;\n  for (int i=0; i<3; ++i)\n  {\n    ycbcr[i] = temp[i];\n    if (temp[i] < min_val) ycbcr[i] = min_val;\n    if (temp[i] > max_val) ycbcr[i] = max_val;\n  }\n  return ycbcr;\n}\n\n\n/// Converts a single YCbCr pixel to RGB\n/// - So far this only works for unsigned char and unsigned short.\ntemplate <typename T>\nT ycbcrToRgb(T const& ycbcr, double min_val, double max_val) {\n  // Convert\n  double mean_val = (min_val + max_val+1) / 2.0;\n  double temp[3];\n  temp[0] = ycbcr[0]                                   + 1.402   * (ycbcr[2] - mean_val);\n  temp[1] = ycbcr[0] - 0.34414 * (ycbcr[1] - mean_val) - 0.71414 * (ycbcr[2] - mean_val);\n  temp[2] = ycbcr[0] + 1.772   * (ycbcr[1] - mean_val);\n\n  // Copy and constrain\n  T rgb;\n  for (int i=0; i<3; ++i)\n  {\n    rgb[i] = temp[i];\n    if (temp[i] < min_val) rgb[i] = min_val;\n    if (temp[i] > max_val) rgb[i] = max_val;\n  }\n  return rgb;\n}\n\n\n\n/// Image view class which applies a pan sharp algorithm.\n/// - This takes a gray and an RGB image as input and generates an RGB image as output.\n/// - This operation is not particularly useful unless the gray image is higher\n///   resolution than the RGB image.\ntemplate <class ImageGrayT, class ImageColorT, typename DataTypeT>\nclass PanSharpView : public ImageViewBase<PanSharpView<ImageGrayT, ImageColorT, DataTypeT> > {\n\npublic: // Definitions\n\n  typedef PixelRGB<DataTypeT> pixel_type;  // This is what controls the type of image that is written to disk.\n  typedef pixel_type          result_type;\n\nprivate: // Variables\n\n  // TODO: These should be Ref views and masked?\n  ImageGrayT  const& m_gray_image;\n  ImageColorT const& m_color_image;\n\n  DataTypeT m_output_nodata;\n  DataTypeT m_min_val;\n  DataTypeT m_max_val;\n\n  int m_num_rows;\n  int m_num_cols;\n\npublic: // Functions\n\n  // Constructor\n  PanSharpView( ImageGrayT  const& gray_image,\n                ImageColorT const& color_image,\n                DataTypeT          outputNodata,\n                DataTypeT          min_value,\n                DataTypeT          max_value)\n                  : m_gray_image(gray_image), m_color_image(color_image),\n                    m_output_nodata(outputNodata),\n                    m_min_val(min_value),\n                    m_max_val(max_value) {\n    // The images are assumed to be the same size (possibly due to transforms)\n    m_num_rows     = m_gray_image.rows();\n    m_num_cols     = m_gray_image.cols();\n  }\n\n  inline int32 cols  () const { return m_num_cols; }\n  inline int32 rows  () const { return m_num_rows; }\n  inline int32 planes() const { return 1; }\n\n  inline result_type operator()( int32 i, int32 j, int32 p=0 ) const\n  {\n    return 0; // NOT IMPLEMENTED!\n  }\n\n  typedef ProceduralPixelAccessor<PanSharpView<ImageGrayT, ImageColorT, DataTypeT> > pixel_accessor;\n  inline pixel_accessor origin() const { return pixel_accessor( *this, 0, 0 ); }\n\n\n  /// Apply pansharp algorithm to a single pair of pixels.\n  /// - Any required interpolation etc. will have already happened by now.\n  template <class P1, class P2>\n  result_type convert_pixel(P1 const& gray_pixel, P2 const& color_pixel) const {\n    // Convert RGB to YCbCr\n    P2 temp = rgbToYCbCr(color_pixel, m_min_val, m_max_val);\n    result_type ycbcr_pixel(temp[0], temp[1], temp[2]); // Extra step breaks any type dependency from the inputs\n\n    // Replace Y channel with gray value\n    ycbcr_pixel[0] = gray_pixel[0];\n\n    // Convert YCbCr back to RGB\n    return ycbcrToRgb(ycbcr_pixel, m_min_val, m_max_val);\n  }\n\n\n  typedef CropView<ImageView<result_type> > prerasterize_type;\n  inline prerasterize_type prerasterize( BBox2i const& bbox ) const {\n\n    // Set up the output image tile\n    ImageView<result_type> tile(bbox.width(), bbox.height());\n\n    // Loop through each output pixels and compute each output value\n    for (int c = 0; c < bbox.width(); c++) {\n      int source_c = c + bbox.min()[0];\n      for (int r = 0; r < bbox.height(); r++) {\n        int source_r = r + bbox.min()[1];\n\n        // Check for a masked pixel\n        if ( !is_valid(m_gray_image (source_c, source_r)) ||\n             !is_valid(m_color_image(source_c, source_r))  ) {\n          tile(c, r) = m_output_nodata;\n          continue;\n        }\n\n        // Pass the two input pixels into the conversion function\n        //result_type output_pixel = convert_pixel(m_gray_image(source_c, r), m_color_image(source_c, r));\n        tile(c,r) = convert_pixel(m_gray_image (source_c, source_r),\n                                  m_color_image(source_c, source_r));\n\n      } // End row loop\n    } // End column loop\n\n    // Return the tile we created with fake borders to make it look the size of the entire output image\n    return prerasterize_type(tile,\n                             -bbox.min().x(), -bbox.min().y(),\n                             cols(), rows() );\n\n  } // End prerasterize function\n\n template <class DestT>\n inline void rasterize( DestT const& dest, BBox2i const& bbox ) const {\n   vw::rasterize( prerasterize(bbox), dest, bbox );\n }\n\n}; // End class PanSharpView\n\n\n/// Convenience function\ntemplate <class ImageGrayT, class ImageColorT, typename DataTypeT>\nPanSharpView<ImageGrayT, ImageColorT, DataTypeT>\ninline pansharp_view( ImageGrayT  const& gray_image,\n                      ImageColorT const& color_image,\n                      DataTypeT          output_nodata,\n                      DataTypeT          min_value,\n                      DataTypeT          max_value ) {\n  return PanSharpView<ImageGrayT, ImageColorT, DataTypeT>\n    (gray_image, color_image, output_nodata, min_value, max_value);\n}\n\n\n\n//-------------------------------------------------------------------------------------\n\nstruct Options : vw::GdalWriteOptions {\n  string gray_file,\n         gray_xml_file,\n         color_file,\n         color_xml_file,\n         output_file;\n  double nodata_value,\n         min_value,\n         max_value;\n  bool has_nodata;\n};\n\nconst double DEFAULT_NODATA = -std::numeric_limits<double>::max();\n\nvoid handle_arguments( int argc, char *argv[], Options& opt ) {\n  po::options_description general_options(\"\");\n  general_options.add_options()\n    (\"min-value\", po::value(&opt.min_value)->default_value(0),\n             \"Set this as the minimum legal image value, overriding the data type default.\")\n    (\"max-value\", po::value(&opt.max_value)->default_value(0),\n             \"Set this as the maximum legal image value, overriding the data type default.\")\n\n    (\"gray-xml\", po::value(&opt.gray_xml_file)->default_value(\"\"),\n             \"Path to a WV XML file for the gray image.  Can be used to obtain the geo data.\")\n    (\"color-xml\", po::value(&opt.color_xml_file)->default_value(\"\"),\n             \"Path to a WV XML file for the color image.  Can be used to obtain the geo data.\")\n    (\"nodata-value\", po::value(&opt.nodata_value)->default_value(DEFAULT_NODATA),\n             \"The no-data value to use, unless present in the color image header.\");\n  general_options.add( vw::GdalWriteOptionsDescription(opt) );\n\n  po::options_description positional(\"\");\n  positional.add_options()\n    (\"gray_file\",   po::value(&opt.gray_file),   \"The gray image file\")\n    (\"color_file\",  po::value(&opt.color_file),  \"The color image file\")\n    (\"output_file\", po::value(&opt.output_file), \"The output file\");\n\n  po::positional_options_description positional_desc;\n  positional_desc.add(\"gray_file\",   1);\n  positional_desc.add(\"color_file\",  1);\n  positional_desc.add(\"output_file\", 1);\n\n  std::string usage(\"[options] <gray file> <color file> <output file>\");\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line( argc, argv, opt, general_options, general_options,\n                             positional, positional_desc, usage,\n                             allow_unregistered, unregistered );\n\n  if ( opt.gray_file.empty() || opt.color_file.empty() || opt.output_file.empty())\n    vw_throw( ArgumentErr()\n         << \"Requires <gray file>, <color file>, and <output file> in order to proceed.\\n\\n\"\n         << usage << general_options );\n\n  if (opt.min_value > opt.max_value)\n    vw_throw( ArgumentErr() << \"The minimum value cannot be greater than the maximum value!\\n\\n\");\n\n  // Determine if the user entered a nodata value\n  opt.has_nodata = vm.count(\"output-nodata-value\");\n\n  vw::create_out_dir(opt.output_file);\n}\n\n\n/// Load and process the images with the correct data type\ntemplate <typename T>\nvoid load_inputs_and_process(Options           & opt,\n                             GeoReference const& gray_georef,\n                             GeoReference const& color_georef,\n                             double       const& gray_nodata,\n                             double       const& color_nodata) {\n\n  // If the user left max_value at the default, make it the data type max.\n  // - min_value defaults to zero so no need to change that.\n  if (opt.max_value == 0)\n    opt.max_value = std::numeric_limits<T>::max();\n\n  // TODO: How to handle nonexistant nodata value?\n  std::cout << \"Min value: \" << (double)opt.min_value << std::endl;\n  std::cout << \"Max value: \" << (double)opt.max_value << std::endl;\n  std::cout << \"Gray  nodata: \" << (double)gray_nodata << std::endl;\n  std::cout << \"Color nodata: \" << (double)color_nodata << std::endl;\n  std::cout << \"Out   nodata: \" << (double)opt.nodata_value << std::endl;\n\n  // Set up file handles\n  DiskImageResourceGDAL gray_rsrc(opt.gray_file),\n                        color_rsrc(opt.color_file);\n  DiskImageView<PixelGray<T> > gray_img (gray_rsrc);\n  DiskImageView<PixelRGB <T> > color_img(color_rsrc);\n\n  // Generate a bounding box that is the minimum of the two BBox areas\n  BBox2 crop_box = bounding_box( gray_img );\n  crop_box.crop(gray_georef.lonlat_to_pixel_bbox(color_georef.pixel_to_lonlat_bbox(bounding_box( color_img ))));\n\n  // Processing is done on doubles to handle nodata values, then converted to the desired output type.\n\n  // Generate a view of the color image from the pixel coordinate system of the gray image\n  typedef PixelMask<PixelRGB<double> > PixelRGBMaskD;\n  typedef PixelMask<PixelRGB<T     > > PixelRGBMask;\n  ImageViewRef<PixelRGBMaskD> color_trans =\n    crop(geo_transform( create_mask(pixel_cast<PixelRGBMaskD>(color_img),\n                                                  color_nodata),\n                        color_georef, gray_georef,\n                        ValueEdgeExtension<PixelRGBMaskD>(PixelRGBMaskD()) ),\n         crop_box );\n\n\n  // WorldView convention is to mask <= a value, but this may not be a universal standard!\n  // - create_mask_less_or_equal seems to break on PixelRGB types.\n\n  vw_out() << \"Writing: \" << opt.output_file << std::endl;\n  vw::cartography::block_write_gdal_image( opt.output_file,\n                               // The final output image is set up in these few lines:\n                               pixel_cast<PixelRGBMask>\n                               (apply_mask(pansharp_view\n                                           (crop(create_mask_less_or_equal\n                                                 (pixel_cast<double>(gray_img),\n                                                  gray_nodata),\n                                                 crop_box),\n                                            color_trans,\n                                            opt.nodata_value,\n                                            opt.min_value,\n                                            opt.max_value),\n                                           opt.nodata_value)\n                                ),\n                               true, gray_georef, // The output is written in the gray coordinate system\n                               opt.has_nodata, opt.nodata_value,\n                               opt,\n                               TerminalProgressCallback(\"pansharp\",\"\\t--> Writing:\"));\n}\n\nint main( int argc, char *argv[] ) {\n\n  Options opt;\n  try {\n    handle_arguments( argc, argv, opt );\n\n    DiskImageResourceGDAL gray_rsrc(opt.gray_file),\n                          color_rsrc(opt.color_file);\n\n    double gray_nodata  = opt.nodata_value;\n    double color_nodata = opt.nodata_value;\n    if ( gray_rsrc.has_nodata_read() ) {\n      gray_nodata = gray_rsrc.nodata_read();\n      vw_out() << \"\\tFound input nodata value for the gray image: \" << gray_nodata << endl;\n    }\n    if ( color_rsrc.has_nodata_read() ) {\n      color_nodata = color_rsrc.nodata_read();\n      vw_out() << \"\\tFound input nodata value for the color image: \" << color_nodata << endl;\n      // If we read in color nodata and the user did not provide nodata,\n      //  set this as the output nodata value.\n      if (opt.nodata_value == DEFAULT_NODATA) {\n        opt.nodata_value = color_nodata;\n        opt.has_nodata   = true;\n      }\n    }\n\n    // Read in geo information\n    GeoReference gray_georef, color_georef;\n    if (!asp::read_wv_georeference(gray_georef,  opt.gray_file,  opt.gray_xml_file ) ||\n        !asp::read_wv_georeference(color_georef, opt.color_file, opt.color_xml_file)   ) {\n      vw_throw(ArgumentErr() << \"Could not read a georeference from an input image!\\n\");\n    }\n\n    // Transform the color image into the same perspective as the grayscale image. However, we\n    // don't support datum changes!\n    if ( gray_georef.datum().proj4_str() != color_georef.datum().proj4_str() )\n      vw_throw( NoImplErr() << \"Pansharp can't operate on images which are on different datums!\\n\" );\n\n    // Check the input data type\n    ChannelTypeEnum input_data_type = gray_rsrc.channel_type();\n    ChannelTypeEnum color_data_type = color_rsrc.channel_type();\n    if (input_data_type != color_data_type)\n      vw_throw( NoImplErr() << \"Pansharp can't operate on images which are different data types!\\n\" );\n\n    // Redirect to another function with the correct template type\n    switch(input_data_type) {\n      //case VW_CHANNEL_INT8   : load_inputs_and_process<vw::int8   >(opt);  break;\n      case VW_CHANNEL_UINT8  : load_inputs_and_process<vw::uint8  >(opt, gray_georef, color_georef, gray_nodata, color_nodata);  break;\n      //case VW_CHANNEL_INT16  : load_inputs_and_process<vw::int16  >(opt);  break;\n      case VW_CHANNEL_UINT16 : load_inputs_and_process<vw::uint16 >(opt, gray_georef, color_georef, gray_nodata, color_nodata);  break;\n      //case VW_CHANNEL_INT32  : load_inputs_and_process<vw::int32  >(opt);  break;\n      //case VW_CHANNEL_UINT32 : load_inputs_and_process<vw::uint32 >(opt);  break;\n      //case VW_CHANNEL_FLOAT32: load_inputs_and_process<vw::float32>(opt);  break;\n      //case VW_CHANNEL_FLOAT64: load_inputs_and_process<vw::float64>(opt);  break;\n      default : vw_throw(ArgumentErr() << \"Input image format \" << input_data_type << \" is not supported!\\n\");\n    };\n\n  } ASP_STANDARD_CATCHES;\n\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/parallel_bundle_adjust",
    "content": "#!/usr/bin/env python\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\nimport sys, argparse, subprocess, re, os, math, time, glob, shutil, math, copy\nimport os.path as P\n\n# The path to the ASP python files\nbasepath    = os.path.abspath(sys.path[0])\npythonpath  = os.path.abspath(basepath + '/../Python')  # for dev ASP\nlibexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP\nsys.path.insert(0, basepath) # prepend to Python path\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\n\nimport asp_system_utils, asp_cmd_utils\nasp_system_utils.verify_python_version_is_supported()\n\n# Prepend to system PATH\nos.environ[\"PATH\"] = libexecpath + os.pathsep + os.environ[\"PATH\"]\n\n# This is explained below\nif 'ASP_LIBRARY_PATH' in os.environ:\n    os.environ['LD_LIBRARY_PATH'] = os.environ['ASP_LIBRARY_PATH']\n\ndef get_output_prefix(args):\n    '''Parse the output prefix from the argument list'''\n    prefix = asp_cmd_utils.get_option(args, '-o', 1)\n    if not prefix:\n        prefix = asp_cmd_utils.get_option(args, '--output-prefix', 1)\n    if len(prefix) < 2:\n        raise Exception('Failed to parse the output prefix.')\n    return prefix[1]\n\ndef get_num_nodes(nodes_list):\n\n    if nodes_list is None:\n        return 1 # local machine\n\n    # Count the number of nodes without repetition (need this for\n    # Pleiades).\n    nodes = {}\n    num_nodes = 0\n    try:\n        fh = open(nodes_list, \"r\")\n        for line in fh:\n            if re.match(r'^\\s*$', line): continue # skip empty lines\n            matches = re.match(r'^\\s*([^\\s]*)', line)\n            if matches:\n                nodes[matches.group(1)] = 1\n\n        num_nodes = len(nodes)\n    except Exception as e:\n        asp_system_utils.raise_error(e)\n    if num_nodes == 0:\n        raise Exception('The list of computing nodes is empty')\n\n    return num_nodes\n\ndef get_best_procs_threads():\n    # Decide the best number of processes to use on a node, and how\n    # many threads to use for each process. Too many processes\n    # may result in too much memory usage.\n\n    # We assume all machines have the same number of CPUs (cores)\n    num_cpus = asp_system_utils.get_num_cpus()\n    \n    # Auto-compute the number of processes unless set.\n    if opt.processes is not None:\n        num_procs = opt.processes\n    else:\n        num_procs = int(round(num_cpus/4.0))\n    if num_procs < 1:\n        num_procs = 1\n    \n    # Same for the number of threads.\n    if opt.threads is not None:\n        num_threads = opt.threads\n    else:\n        num_threads = int(math.ceil(float(num_cpus)/num_procs))\n    if num_threads < 1:\n        num_threads = 1\n    \n    print(\"Using %d threads and %d processes.\" % (num_threads, num_procs))\n\n    return (num_procs, num_threads)\n\ndef get_num_images(args):\n    '''Return the number of input images. There are several cases to consider.'''\n\n    count = 0\n\n    # TODO(oalexan1): This is very fragile logic.\n    IMAGE_EXTENSIONS = ['.tif', '.tiff', '.ntf', '.nitf', '.png', '.jpeg', '.jpg',\n                        '.jp2', '.img', '.cub', '.bip', '.bil', '.bsq']\n    for a in args:\n        lc = a.lower()\n        for e in IMAGE_EXTENSIONS:\n            if lc.endswith(e):\n                count += 1\n\n    # Handle --image-list\n    if count == 0:\n        if '--image-list' not in args:\n            raise Exception(\"No input images found, and neither was \" + \\\n                            \"--image-list specified. Supported image extensions: \" + \\\n                            \" \".join(IMAGE_EXTENSIONS))\n\n    # Parse --image-list\n    if '--image-list' in args:\n        count = 0\n        for v in range(len(args)):\n            if args[v] == '--image-list' and v + 1 < len(args):\n                image_list = args[v + 1]\n                \n                # If image_list has commas, that means it is a list of lists.\n                # Then split by comma and collect in an array.\n                if ',' in image_list:\n                    image_lists = image_list.split(',')\n                else:\n                    image_lists = [image_list]\n                    \n                for image_list in image_lists:    \n                    # Check if image_list exists\n                    if not os.path.isfile(image_list):\n                        raise Exception(\"Could not find image list: \" + image_list)\n                    with open(image_list, \"r\") as fh:\n                        lines = fh.readlines()\n                        lines = (\" \".join(lines)).split()\n                        \n                        for line in lines:\n                            line = line.strip()\n                            if len(line) == 0:\n                                continue\n                            count = count + 1\n\n    return count\n\n# Launch the jobs with GNU Parallel. It will take care of distributing the jobs\n# across the nodes and load balancing. The way we accomplish this is by calling\n# this same script but with --job-id <num>.\ndef spawn_to_nodes(step, num_nodes, output_prefix, argsIn):\n\n    args = copy.copy(argsIn)\n\n    if opt.processes is None or opt.threads is None:\n        # The user did not specify these. We will find the best\n        # for their system.\n        (num_procs, num_threads) = get_best_procs_threads()\n    else:\n        num_procs   = opt.processes\n        num_threads = opt.threads\n\n    # Number of jobs to run in parallel to ensure all nodes are busy.\n    num_parallel_jobs = num_nodes * num_procs\n    \n    # Need not have more processes than jobs to run on them.\n    # TODO(oalexan1): Wipe this\n    #if num_procs > num_parallel_jobs:\n    #     num_procs = num_parallel_jobs\n\n    asp_cmd_utils.wipe_option(args, '--processes', 1)\n    asp_cmd_utils.wipe_option(args, '--threads', 1)\n    args.extend(['--processes', str(num_procs)])\n    args.extend(['--threads', str(num_threads)])\n    args.extend(['--num-parallel-jobs', str(num_parallel_jobs)])\n\n    # For convenience store the list of job ids in a file that\n    # will be passed to GNU parallel. Keep this in the run directory.\n    asp_system_utils.mkdir_p(os.path.dirname(output_prefix))\n    job_list = output_prefix + '-job-list.txt'\n    f = open(job_list, 'w')\n    for i in range(num_parallel_jobs):\n        f.write(\"%d\\n\" % i)\n    f.close()\n\n    # Use GNU parallel with given number of processes.\n    # TODO(oalexan1): Run 'parallel' using the runInGnuParallel() function call,\n    # when the ASP_LIBRARY_PATH trick can be fully encapsulated in the\n    # asp_system_utils.py code rather than being needed for each tool.\n    cmd = ['parallel', '--will-cite', '--env', 'PATH', '--env', 'LD_LIBRARY_PATH', '--env', 'ASP_LIBRARY_PATH', '--env', 'ASP_DEPS_DIR', '--env', 'ISISROOT', '-u', '--max-procs', str(num_procs), '-a', job_list]\n    if asp_system_utils.which(cmd[0]) is None:\n        raise Exception('Need GNU Parallel to distribute the jobs.')\n\n    if opt.nodes_list is not None:\n        cmd += ['--sshloginfile', opt.nodes_list]\n\n    if opt.parallel_options is not None:\n        cmd += opt.parallel_options.split(' ')\n\n    # Add the options which we want GNU parallel to not mess\n    # with. Put them into a single string. Before that, put in quotes\n    # any quantities having spaces, to avoid issues later.\n    # Don't quote quantities already quoted.\n    # TODO(oalexan1): Unify this across all tools.\n    # Improve and use the function argListToString.\n    args_copy = args[:] # deep copy\n    args_copy += [\"--work-dir\", opt.work_dir]\n    if opt.isisroot  is not None: \n        args_copy += [\"--isisroot\",  opt.isisroot]\n    if opt.isisdata is not None: \n        args_copy += [\"--isisdata\", opt.isisdata]\n    \n    for index, arg in enumerate(args_copy):\n        if re.search(r\"[ \\t]\", arg) and arg[0] != '\\'':\n            args_copy[index] = '\\'' + arg + '\\''\n    python_path = sys.executable # children must use same Python as parent\n    start    = step; stop = start + 1\n    args_str = python_path + \" \"              + \\\n               \" \".join(args_copy)            + \\\n               \" --entry-point \" + str(start) + \\\n               \" --stop-point \" + str(stop) \n    args_str += \" --job-id {}\"\n    cmd += [args_str]\n\n    # This is a bugfix for RHEL 8. The 'parallel' program fails to start with ASP's\n    # libs, so temporarily hide them.\n    if 'LD_LIBRARY_PATH' in os.environ:\n        os.environ['ASP_LIBRARY_PATH'] = os.environ['LD_LIBRARY_PATH']\n        os.environ['LD_LIBRARY_PATH'] = ''\n\n    try:\n        asp_system_utils.generic_run(cmd, opt.verbose)\n    except Exception as e:\n        exception_len = len(str(e))\n        # This may fail because the command line is too long. It does not seem\n        # possible to catch this error, which comes from parallel. So we\n        # have to guess.\n        if exception_len > 50000:\n            print(\"If the command line is too long, consider using --image-list, etc.\")\n\n        raise Exception(str(e))\n\n    # Undo the above\n    if 'ASP_LIBRARY_PATH' in os.environ:\n        os.environ['LD_LIBRARY_PATH'] = os.environ['ASP_LIBRARY_PATH']\n\ndef run_job(prog, args, job_id, **kw):\n    '''Wrapper to run a command. Set job_id=-1 if only one job will be called.'''\n\n    binpath = asp_system_utils.bin_path(prog)\n    call    = [binpath]\n    call.extend(args)\n\n    if job_id < 0: # Only one job will process everything\n        if opt.threads is not None:\n            asp_cmd_utils.wipe_option(call, '--threads', 1)\n            call.extend(['--threads', str(opt.threads)])\n\n    else: # One of the parallel jobs\n\n        if opt.threads is not None:\n            asp_cmd_utils.wipe_option(call, '--threads', 1)\n            call.extend(['--threads', str(opt.threads)])\n\n    if opt.dryrun:\n        print('%s' % ' '.join(call))\n        return\n    if opt.verbose:\n        print('%s' % ' '.join(call))\n    try:\n        code = subprocess.call(call)\n    except OSError as e:\n        raise Exception('%s: %s' % (binpath, e))\n    if code != 0:\n        raise Exception('Bundle adjust step ' + kw['msg'] + ' failed')\n\nclass ParallelBaStep:\n    # The ids of individual parallel_bundle_adjust steps. What the user\n    # sets as the statistics step, internally has 3 sub-steps:\n    # A. Compute image statistics\n    # B. Compute normalization bounds.\n    # C. Compute interest points per image.\n    statistics     = 0\n    bounds         = 0.1\n    interest_point = 0.2\n    matching       = 1\n    optimization   = 2\n    all            = 3\n\nif __name__ == '__main__':\n\n    # Fix for this failing in a subprocess. There, need not know the ASP version.\n    asp_version = ''\n    if 'ISISROOT' in os.environ:\n       asp_version = asp_system_utils.get_asp_version()\n       \n    usage = '''parallel_bundle_adjust <images> <cameras> <optional ground control points> -o <output prefix> [options]\n        Camera model arguments may be optional for some stereo\n        session types (e.g. isis). See bundle_adjust for all options.\\n''' + asp_version\n    \n    # A wrapper for bundle_adjust which computes image statistics and IP matches\n    #  in parallel across multiple machines.  The final bundle_adjust step is\n    #  performed on a single machine.\n\n    # Algorithm: When the script is started, it starts one copy of\n    # itself on each node during steps before optimization. \n    # Those scripts in turn start actual jobs on those nodes.\n    # For the optimization step, the script does the work itself.\n\n    p = argparse.ArgumentParser(usage=usage)\n    p.add_argument('--nodes-list', dest='nodes_list', default=None,\n                 help='The list of computing nodes, one per line. ' + \\\n                 'If not provided, run on the local machine.')\n    p.add_argument('--processes', dest='processes', default=None, type=int, \n                   help='The number of processes to use per node. The default is ' + \\\n                   'a quarter of the number of cores on the head node.')\n    p.add_argument('--threads', dest='threads', default=None,\n                 type=int, help='The number of threads  per process. The default is ' + \\\n                 'the number of cores on the head node over the number of processes.')\n    p.add_argument('-e', '--entry-point', \n                   dest='entry_point', default=0, type = float,\n                   help = \"Bundle adjustment entry point (start at this stage). \" + \\\n                   \"Options: statistics and interest points per image = 0, \" + \\\n                   \"interest point matching = 1, optimization = 2.\")\n    p.add_argument('--stop-point', dest='stop_point',  default=3, type = float,\n                   help = \"Bundle adjustment stop point (stop *before* this stage). \" + \\\n                   \"Options: statistics = 0, matching = 1, optimization = 2, all = 3.\")\n    p.add_argument('--parallel-options', dest='parallel_options', default='--sshdelay 0.2',\n                   help='Options to pass directly to GNU Parallel.')\n    p.add_argument('-v', '--version', dest='version', default=False,\n                 action='store_true', help='Display the version of software.')\n    p.add_argument('--verbose', dest='verbose', default=False, action='store_true',\n                 help='Display the commands being executed.')\n\n    # Internal variables below.\n    # The index of the spawned process, 0 <= job_id < processes.\n    p.add_argument('--job-id', dest='job_id', default=None, type=int,\n                 help=argparse.SUPPRESS)\n    # Directory where the job is running\n    p.add_argument('--work-dir', dest='work_dir', default=None,\n                 help=argparse.SUPPRESS)\n    # ISIS settings\n    p.add_argument('--isisroot', dest='isisroot', default=None,\n                 help=argparse.SUPPRESS)\n    p.add_argument('--isisdata', dest='isisdata', default=None,\n                 help=argparse.SUPPRESS)\n    # Debug options\n    p.add_argument('--dry-run', dest='dryrun', default=False, action='store_true',\n                 help=argparse.SUPPRESS)\n\n    global opt\n    (opt, args) = p.parse_known_args()\n\n    if opt.version:\n        asp_system_utils.print_version_and_exit()\n\n    if not args and not opt.version:\n        p.print_help()\n        sys.exit(1)\n\n    try:\n        args = asp_cmd_utils.clean_args(args)\n        output_prefix = get_output_prefix(args)\n    except Exception as e:\n        # Print the error message and exit.\n        print('\\nERROR: ' + str(e) + '\\n')\n        p.print_help()\n        sys.exit(1)\n    \n    # Setting ISISROOT and ISISDATA must happen in both parent and \n    # child processes, and before checking parallel version.\n    if opt.isisroot is not None: os.environ['ISISROOT'] = opt.isisroot\n    if opt.isisdata is not None: os.environ['ISISDATA'] = opt.isisdata\n    \n    # Ensure our 'parallel' is not out of date\n    asp_system_utils.check_parallel_version()\n\n    if opt.job_id is None:\n        # When the script is started, set some options from the\n        # environment which we will pass to the scripts we spawn\n        # 1. Set the work directory\n        opt.work_dir = os.getcwd()\n        # 2. Set the ISIS settings if any\n        if 'ISISROOT' in os.environ: opt.isisroot  = os.environ['ISISROOT']\n        if 'ISISDATA' in os.environ: opt.isisdata = os.environ['ISISDATA']\n        # 3. Fix for Pleiades, copy the nodes_list to the run directory\n        # to ensure it can be seen on any node.\n        if opt.nodes_list is not None:\n            if not os.path.isfile(opt.nodes_list):\n                asp_system_utils.raise_error('No such nodes-list file: ' + opt.nodes_list, code=2)\n            local_nodes_list = output_prefix + \"-nodes-list.txt\"\n            if opt.nodes_list != local_nodes_list:\n                asp_system_utils.mkdir_p(os.path.dirname(output_prefix))\n                shutil.copy2(opt.nodes_list, local_nodes_list)\n                opt.nodes_list = local_nodes_list\n            asp_cmd_utils.wipe_option(sys.argv, '--nodes-list', 1)\n            sys.argv.extend(['--nodes-list', opt.nodes_list])\n            print(\"Nodes list: \" + opt.nodes_list)\n            \n    else:\n        # After the script spawns itself to nodes, it starts in the\n        # home dir. Make it go to the right place.\n        os.chdir(opt.work_dir)\n\n    if opt.version:\n        args.append('-v')\n\n    if opt.job_id is None:\n\n        # We get here when the script is started. The current running\n        # process has become the management process that spawns other\n        # copies of itself on other machines. This block will only do\n        # actual work during the optimization step.\n\n        # Wipe options which we will override.\n        self_args = sys.argv # shallow copy\n        asp_cmd_utils.wipe_option(self_args, '-e', 1)\n        asp_cmd_utils.wipe_option(self_args, '--entry-point', 1)\n        asp_cmd_utils.wipe_option(self_args, '--stop-point',  1)\n\n        output_folder = os.path.dirname(output_prefix)\n\n        # Create the main output folder\n        if (not os.path.exists(output_folder)) and (output_folder != \"\"):\n            os.makedirs(output_folder)\n\n        if '--isis-cnet' in args or '--match-files-prefix' in args or          \\\n          '--clean-match-files-prefix' in args or '--skip-matching' in args or \\\n          '--nvm' in args:\n           print(\"Skipping statistics and matching based on input options.\")\n           if opt.entry_point < ParallelBaStep.optimization:\n              opt.entry_point = ParallelBaStep.optimization\n        \n        # Sanity check\n        if (opt.entry_point < ParallelBaStep.statistics or \n            opt.stop_point  < ParallelBaStep.statistics):\n          raise Exception(\"Invalid entry or stop point.\")\n\n        num_nodes = get_num_nodes(opt.nodes_list)\n        \n        # Statistics, bounds per image, interest points per image\n        step = ParallelBaStep.interest_point\n        if (opt.entry_point <= step):\n            if (opt.stop_point <= step):\n                sys.exit()\n\n            # Spawn statistics processes to nodes\n            # num_images = get_num_images(self_args)\n            spawn_to_nodes(ParallelBaStep.statistics, num_nodes, output_prefix, self_args)\n            \n            # Run the bounds step as a single process\n            if '--skip-matching' not in args:\n                args.extend(['--skip-matching']) # this will also skip stats\n            run_job('bundle_adjust', args + ['--calc-normalization-bounds'],\n                    job_id=-1, \n                    msg='%d: Normalization bounds' % step)\n            \n            # Spawn interest point processes to nodes\n            spawn_to_nodes(ParallelBaStep.interest_point, num_nodes, output_prefix,\n                           self_args)\n            \n        # Matching\n        step = ParallelBaStep.matching\n        if (opt.entry_point <= step):\n            if (opt.stop_point <= step):\n                sys.exit()\n\n            # Will run as many processes as we have nodes times processes per node.\n            # This seems to be the best approach at load-balancing.\n            \n            # The commented-out logic below will be deleted at some point.\n            # To do load-balancing properly, need to know how many pairs of\n            # images we expect to match. This depends on --auto-overlap-params,\n            # etc.\n            #sep = \",\"\n            #settings = run_and_parse_output(\"bundle_adjust\", \n            #                                args + ['--query-num-image-pairs'], \n            #                                sep, opt.verbose)\n            #num_image_pairs = int(settings[\"num_image_pairs\"][0])\n       \n            # Spawn matching to nodes\n            spawn_to_nodes(step, num_nodes, output_prefix, self_args)\n\n        # Optimization\n        step = ParallelBaStep.optimization\n        if (opt.entry_point <= step):\n            if (opt.stop_point <= step):\n                sys.exit()\n            if '--skip-matching' not in args:\n                args.extend(['--skip-matching'])\n            run_job('bundle_adjust', args, job_id=-1, msg='%d: Optimizing' % step)\n\n            # End main process case\n    else:\n\n        # This process was spawned by GNU Parallel with a given\n        # value of job_id. It will do the actual work.\n        if opt.verbose:\n            print(\"Running on machine: \", os.uname())\n\n        try:\n            args.extend(['--job-id', str(opt.job_id)])\n\n            if (opt.entry_point == ParallelBaStep.statistics):\n                args.extend(['--stop-after-statistics'])\n                run_job('bundle_adjust', args, opt.job_id,\n                        msg='%d: Statistics' % opt.entry_point)\n                \n            # The bounds step will not be done in parallel so is not here\n\n            if (opt.entry_point == ParallelBaStep.interest_point):\n                args.extend(['--calc-ip'])\n                run_job('bundle_adjust', args, opt.job_id,\n                        msg='%d: Interest point' % opt.entry_point)\n\n            if (opt.entry_point == ParallelBaStep.matching):\n                args.extend(['--stop-after-matching'])\n                run_job('bundle_adjust', args, opt.job_id,\n                        msg='%d: Matching' % opt.entry_point)\n            \n            # The optimization step will not be done in parallel so is not here\n\n        except Exception as e:\n            asp_system_utils.raise_error(e)\n            raise\n"
  },
  {
    "path": "src/asp/Tools/parallel_sfs",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n'''\nThis tool implements a multi-process and multi-machine version of sfs. The input\nDEM gets split into tiles with padding, sfs runs on each tile, and the outputs\nare mosaicked.\n'''\n\nimport sys\nimport os, glob, re, shutil, subprocess, string, time, errno, argparse, math\n\n# The path to the ASP python files\nbasepath    = os.path.abspath(sys.path[0])\npythonpath  = os.path.abspath(basepath + '/../Python')  # for dev ASP\nlibexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP\nsys.path.insert(0, basepath) # prepend to Python path\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\n\nfrom asp_alg_utils import *\n\nimport asp_file_utils, asp_system_utils, asp_cmd_utils, asp_image_utils, asp_string_utils\nasp_system_utils.verify_python_version_is_supported()\n\n# Prepend to system PATH\nos.environ[\"PATH\"] = libexecpath + os.pathsep + os.environ[\"PATH\"]\n\n# This is explained in asp_system_utils.py.\nif 'ASP_LIBRARY_PATH' in os.environ:\n    os.environ['LD_LIBRARY_PATH'] = os.environ['ASP_LIBRARY_PATH']\n\n# Measure the memory usage on Linux and elapsed time\ntimeCmd = []\nif 'linux' in sys.platform:\n    timeCmd = ['/usr/bin/time', '-f', 'elapsed=%E memory=%M (kb)']\n\ndef generateTileList(sizeX, sizeY, tileSize, padding):\n    \"\"\"Generate a full list of tiles for this image\"\"\"\n\n    Lx = genSegmentList(sizeX, tileSize, padding)\n    Ly = genSegmentList(sizeY, tileSize, padding)\n\n    tileList = []\n    for x in range(0, len(Lx)-1):\n        for y in range(0, len(Ly)-1):\n\n            begX = Lx[x]; endX = Lx[x+1]\n            begY = Ly[y]; endY = Ly[y+1]\n\n            # apply the padding\n            begX = begX - padding\n            if (begX < 0): begX = 0\n            begY = begY - padding\n            if (begY < 0): begY = 0\n            endX = endX + padding\n            if (endX > sizeX): endX = sizeX\n            endY = endY + padding\n            if (endY > sizeY): endY = sizeY\n            \n            # Create a name for this tile\n            # - Tile format is tile_col_row_width_height_.tif\n            tileString = generateTileDir(begX, begY, endX, endY)\n            tileList.append((begX, begY, endX, endY, tileString))\n            \n    return (len(Lx)-1, len(Ly)-1, tileList)\n\ndef generateTilePrefix(outputFolder, tileName, outputName):\n    return os.path.join(outputFolder, tileName, outputName)\n\ndef runSfs(options, outputFolder, outputName, baseFileNames):\n    \"\"\"Run sfs in a single tile.\"\"\"\n\n    # Determine the name of the tile we need to write\n    tileName = generateTileDir(options.pixelStartX, options.pixelStartY,\n                               options.pixelStopX, options.pixelStopY)\n    tilePrefix = generateTilePrefix(outputFolder, tileName, outputName)\n\n    # Bounds for this tile\n    startX = int(options.pixelStartX)\n    stopX  = int(options.pixelStopX)\n    startY = int(options.pixelStartY)\n    stopY  = int(options.pixelStopY)\n\n    extraArgs = []\n    i = 0\n    while i < len(options.extraArgs):\n        arg = options.extraArgs[i]\n\n        if arg == '--crop-win':\n            # If the user passed in the crop-win argument, reconcile\n            # it with the internal ROI we need.  Skip this element and\n            # grab the user provided pixel bounds.\n            userStartX = int(options.extraArgs[i+1])\n            userStopX  = int(options.extraArgs[i+2])\n            userStartY = int(options.extraArgs[i+3])\n            userStopY  = int(options.extraArgs[i+4])\n\n            # Reconcile the bounding box\n            if (startX < userStartX): startX = userStartX\n            if (stopX  > userStopX ): stopX  = userStopX\n            if (startY < userStartY): startY = userStartY\n            if (stopY  > userStopY ): stopY  = userStopY\n\n            # If there is no tile left to generate then we can just return here\n            if ((startX > stopX) or (startY > stopY)):\n                return 0\n            i += 5\n        if arg == '-o' and i + 1 < len(options.extraArgs):\n            # Replace the final output directory with the one for the given tile\n            extraArgs.append(arg)\n            extraArgs.append(tilePrefix)\n            i += 2\n        else:\n            extraArgs.append(arg)\n            i += 1\n\n    # Call the command for a single tile\n    cmd = timeCmd + ['sfs',  '--crop-win', str(startX), str(startY), str(stopX), str(stopY)]\n\n    cmd = cmd + extraArgs # Append other options\n    willRun = True\n    \n    if options.resume:\n        # If all files that need to be computed exist, skip this tile\n        willRun = False\n        for baseFileName in baseFileNames:\n\n            fullFilePath = tilePrefix + '-' + baseFileName\n            if (not asp_system_utils.is_valid_image(fullFilePath)):\n                willRun = True\n\n        if not willRun:\n            print(\"Will skip tile: \" + tileName + \", as found valid: \" + \" \".join(baseFileNames))\n        else:\n            print(\"Will run tile: \" + tileName)\n            \n    if willRun:\n        (out, err, status) = asp_system_utils.executeCommand(cmd,\n                                                             suppressOutput=options.suppressOutput)\n        write_cmd_output(tilePrefix, cmd, out, err, status)\n        \n    return 0\n\ndef mosaic_results(tileList, outputFolder, outputName, options, baseFile):\n\n    # Final mosaicked result\n    mosaicFile = options.output_prefix + '-' + baseFile\n    \n    # Create the list of DEMs to mosaic\n    demList = mosaicFile\n    demList = re.sub(r'\\.\\w+$', '', demList)\n    demList += '-list.txt'\n    with open(demList, 'w') as f:\n        for tile in tileList:\n            tileName = tile[4]\n            tilePrefix = generateTilePrefix(outputFolder, tileName, outputName)\n            demFile = tilePrefix + '-' + baseFile\n            f.write(demFile + '\\n')\n                 \n    # Mosaic the outputs using dem_mosaic\n    dem_mosaic_path = asp_system_utils.bin_path('dem_mosaic')\n    dem_mosaic_args = ['--weights-exponent', '2', '--use-centerline-weights',\n                       '--dem-list', demList, '-o', mosaicFile]\n    cmd = timeCmd + [dem_mosaic_path] + dem_mosaic_args\n    asp_system_utils.executeCommand(cmd, suppressOutput=options.suppressOutput)\n\ndef write_cmd_output(output_prefix, cmd, out, err, status):\n    logFile = output_prefix + '-cmd-log.txt'\n    print(\"Saving log in: \" + logFile)\n    with open(logFile, 'w') as f:\n        f.write(\" \".join(cmd))\n        f.write(out)\n        f.write(err)\n        f.write('Command return status: ' + str(status))\n\ndef main(argsIn):\n\n    sfsPath = asp_system_utils.bin_path('sfs')\n\n    try:\n        # Get the help text from the base C++ tool so we can append it to the python help\n        cmd = [sfsPath,  '--help']\n        p = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True)\n        baseHelp, err = p.communicate()\n    except OSError:\n        print(\"Error: Unable to find the required sfs program.\")\n        return -1\n\n    # Extract the version and help text\n    vStart  = baseHelp.find('[ASP')\n    vEnd    = baseHelp.find(']', vStart)+1\n    version = baseHelp[vStart:vEnd]\n    baseHelpText = \"Help options for the underlying 'sfs' program:\\n\" + baseHelp[vEnd:]\n\n    # Use parser that ignores unknown options\n    usage  = \"parallel_sfs -i <input DEM> -n <max iterations> -o <output prefix> <images> [other options]\"\n\n    parser = argparse.ArgumentParser(usage=usage, epilog=baseHelpText,\n                                     formatter_class=argparse.RawTextHelpFormatter)\n\n    parser.add_argument('-i', '--input-dem',  dest='input_dem', default='',\n      help = 'The input DEM to refine using SfS.')\n\n    parser.add_argument('-o', '--output-prefix',  dest='output_prefix', default='', \n      help = 'Prefix for output filenames.')\n\n    parser.add_argument('--tile-size',  dest='tileSize', default=300, type=int, \n      help = 'Size of approximately square tiles to break ' +\n             'up processing into (not counting the padding).')\n\n    parser.add_argument('--padding',  dest='padding', default=50, type=int,\n      help = 'How much to expand a tile in each direction. This ' +\n             'helps with reducing artifacts in the final mosaicked ' +\n             'SfS output.')\n\n    parser.add_argument(\"--processes\",  dest=\"numProcesses\", type=int, default=None, \n      help = \"Number of processes to use on each node \" +\n             \"(the default is for the program to choose).\")\n\n    parser.add_argument(\"--num-processes\",  dest=\"numProcesses2\", type=int, default=None, \n      help = \"Same as --processes. Used for backwards compatibility.\")\n\n    parser.add_argument('--nodes-list', dest='nodesListPath', default=None,\n      help = 'A file containing the list of computing nodes, one ' +\n             'per line. If not provided, run on the local machine.')\n\n    parser.add_argument('--parallel-options', dest='parallel_options', \n      default='--sshdelay 0.2',\n      help = 'Options to pass directly to GNU Parallel.')\n\n    parser.add_argument('--threads',  dest='threads', default=8, type=int,\n      help = 'How many threads each process should use. This will be ' +\n             'changed to 1 for ISIS cameras when ' +\n             '--use-approx-camera-models is not set, as ISIS is ' +\n             'single-threaded. Not all parts of the computation ' +\n             'benefit from parallelization.')\n\n    parser.add_argument(\"--resume\", action=\"store_true\", default=False, dest=\"resume\", \n      help = \"Resume a partially done run. Only \" +\n             \"process the tiles for which the desired \" +\n             \"per-tile output files are missing or \" \n             \"invalid (as checked by gdalinfo).\")\n    \n    parser.add_argument('--run-dir', dest='runDir', default=None,\n      help = 'Directory in which the script is running.')\n    \n    parser.add_argument(\"--suppress-output\", action=\"store_true\", default=False, \n      dest = \"suppressOutput\", \n      help = \"Suppress output of sub-calls.\")\n\n    parser.add_argument('-v', '--version',  dest='version', default=False,\n      action = 'store_true', \n      help = 'Display the version of software.')\n    \n    # Private options\n    parser.add_argument('--pixelStartX', dest='pixelStartX', default=None, type=int,\n      help=argparse.SUPPRESS)\n    parser.add_argument('--pixelStartY', dest='pixelStartY', default=None, type=int,\n      help=argparse.SUPPRESS)\n    parser.add_argument('--pixelStopX',  dest='pixelStopX', default=None, type=int,\n      help=argparse.SUPPRESS)\n    parser.add_argument('--pixelStopY',  dest='pixelStopY', default=None, type=int,\n      help=argparse.SUPPRESS)\n\n    # This call handles all the parallel_sfs specific options.\n    (options, args) = parser.parse_known_args(argsIn)\n    \n    if options.version:\n        asp_system_utils.print_version_and_exit()\n\n    if not args and not options.version:\n        parser.print_help()\n        sys.exit(1)\n\n    # This can handle spaces in directory names, unlike when GNU parallel is in charge    \n    if options.runDir is not None:\n      os.chdir(options.runDir)\n        \n    # The parallel_sfs tool must not take the option --crop-win as it will\n    # work on the entire input DEM.\n    if '--crop-win' in argsIn:\n        parser.print_help()\n        parser.error(\"parallel_sfs cannot take the --crop-win option. \" +\n                      \"Crop the input DEM using gdal_translate.\\n\" );\n\n    if  '--float-exposure'          in argsIn or \\\n        '--float-haze'              in argsIn or \\\n        '--float-reflectance-model' in argsIn:\n        print(\"Warning: Floating exposures and other quantities per tile may result \" +\n              \"in non-globally consistent results.\")\n        \n    # Any additional arguments need to be forwarded to the sfs function\n    options.extraArgs = args\n\n    # Pass to the sfs executable the -i and -o options we filtered out\n    options.extraArgs = ['-i', options.input_dem, '-o', options.output_prefix,\n                         '--threads', str(options.threads) ] + options.extraArgs\n\n    # If --save-covariances is on, also turn on --save-variances\n    if '--save-covariances' in argsIn and '--save-variances' not in argsIn:\n        argsIn.append('--save-variances')\n        options.extraArgs.append('--save-variances')\n\n    # See what kind of outputs to generate\n    baseFileNames = []\n    if '--estimate-height-errors' not in argsIn:\n        # Computed DEM\n        baseFileNames  += ['DEM-final.tif']\n        \n        # Albedo\n        if '--float-albedo' in argsIn:\n            baseFileNames  += ['albedo-final.tif']\n             \n        # Dem with nodata\n        if '--save-dem-with-nodata' in argsIn:\n            baseFileNames  += ['DEM-nodata-final.tif']\n        \n        # Variances and covariances\n        if '--save-variances' in argsIn:\n            prefixes = ['DEM']\n            if '--float-albedo' in argsIn:\n                prefixes += ['albedo']\n            suffixes = ['-variance.tif']\n            if '--save-covariances' in argsIn:\n                suffixes += ['-dr0_dc2-covariance.tif',\n                             '-dr1_dcn1-covariance.tif',\n                             '-dr1_dc1-covariance.tif',\n                             '-dr2_dc0-covariance.tif']\n            for prefix in prefixes:\n                for suffix in suffixes:\n                    baseFileNames += [prefix + suffix]\n            \n    elif '--estimate-height-errors' in argsIn:\n        # Here we just mosaic the height errors\n        baseFileNames  += ['height-error.tif']\n\n    if options.resume:\n        if '--compute-exposures-only' in options.extraArgs \\\n        or '--estimate-exposure-haze-albedo' in options.extraArgs:\n            parser.print_help()\n            parser.error(\"The --resume option cannot be used to compute the \" + \\\n                         \"exposures, haze, albedo.\\n\")\n\n    # Handle the situation that both --processes and --num-processes can happen\n    if (options.numProcesses is not None) and (options.numProcesses2 is not None):\n        raise Exception(\"Cannot set both --processes and --num-processes.\")\n    if options.numProcesses is None and (options.numProcesses2 is not None):\n        # Copy over --num-processes to --processes\n        options.numProcesses = options.numProcesses2\n\n    # Set up output folder\n    outputFolder = os.path.dirname(options.output_prefix)\n    if outputFolder == '':\n        outputFolder = './' # Handle calls in same directory\n    outputName = os.path.basename(options.output_prefix)\n    asp_file_utils.createFolder(outputFolder)\n\n    startTime = time.time()\n\n    # Determine if this is a main copy or a spawned copy\n    spawnedCopy = ((options.pixelStartX is not None) and (options.pixelStartY is not None) and\n                   (options.pixelStopX  is not None) and (options.pixelStopY  is not None) and\n                   outputFolder)\n\n    if spawnedCopy:\n        # This copy was spawned to process a single tile. Just call a\n        # function to handle this and then we are done.\n        return runSfs(options, outputFolder, outputName, baseFileNames) \n\n    # Otherwise this is the original called process and there are multiple steps to go through\n\n    # Compute the exposures, haze, initial albedo based on the full DEM if not\n    # specified and missing. Save them to disk. They will be read when SfS runs\n    # on each small DEM tile.\n    estimatedExposureHazeAlbedo = False\n    if '--image-exposures-prefix' not in options.extraArgs:\n        print(\"Computing exposures (and haze and initial albedo, if applicable).\\n\")\n        cmd = timeCmd + [sfsPath] + options.extraArgs\n        # Add the option to compute the exposures, if not there already\n        # TODO(oalexan1): Must handle the case when there is also haze\n        # and albedo to compute. Must also test if only haze or if only\n        # floating albedo is enabled.\n        if '--compute-exposures-only' not in options.extraArgs:\n            cmd += ['--compute-exposures-only']\n        if '--estimate-exposure-haze-albedo' not in options.extraArgs:\n            # Not strictly needed as it is equivalent to the above.\n            cmd += ['--estimate-exposure-haze-albedo']\n        asp_system_utils.executeCommand(cmd, suppressOutput=options.suppressOutput)\n        options.extraArgs += ['--image-exposures-prefix', options.output_prefix]\n        estimatedExposureHazeAlbedo = True\n\n    # If the haze prefix is not set, and have a non-zero number of haze coeffs,\n    # must estimate the haze, unless done already\n    if '--haze-prefix' not in options.extraArgs:\n      # TODO(oalexan1): Must test!\n      numHazeCoeffs = asp_cmd_utils.option_val(options.extraArgs, '--num-haze-coeffs')\n      if numHazeCoeffs is not None and numHazeCoeffs != '0':\n        if not estimatedExposureHazeAlbedo:\n            print(\"Estimating haze.\\n\")\n            cmd = timeCmd + [sfsPath] + options.extraArgs\n            if '--estimate-exposure-haze-albedo' not in options.extraArgs:\n              cmd += ['--estimate-exposure-haze-albedo']\n            asp_system_utils.executeCommand(cmd, suppressOutput=options.suppressOutput)\n            estimatedExposureHazeAlbedo = True \n        # By now the haze should have been computed in either case\n        options.extraArgs += ['--haze-prefix', options.output_prefix]\n     \n    # Same about estimating albedo, if we want to float albedo and was not provided\n    if '--input-albedo' not in options.extraArgs and '--float-albedo' in options.extraArgs:\n        if not estimatedExposureHazeAlbedo:\n            print(\"Estimating albedo.\\n\")\n            cmd = timeCmd + [sfsPath] + options.extraArgs\n            if '--estimate-exposure-haze-albedo' not in options.extraArgs:\n                cmd += ['--estimate-exposure-haze-albedo']\n            asp_system_utils.executeCommand(cmd, suppressOutput=options.suppressOutput)\n            estimatedExposureHazeAlbedo = True\n        # By now the albedo should have been computed in either case\n        options.extraArgs += ['--input-albedo', options.output_prefix + \"-albedo-estim.tif\"]\n        \n    if '--compute-exposures-only' in options.extraArgs or \\\n       '--estimate-exposure-haze-albedo' in options.extraArgs:\n        print(\"Finished computing exposure, haze, albedo.\")\n        return\n    \n    # What is the size of the DEM on which to do SfS\n    sep = \",\"\n    verbose = False\n    print(\"Running initial query\")\n    settings = asp_system_utils.run_and_parse_output(sfsPath, \n                                                     options.extraArgs + ['--query'],\n                                                     sep, verbose)\n    sizeX = int(settings['dem_cols'][0])\n    sizeY = int(settings['dem_rows'][0])\n\n    # Compute the number and size of tiles in x and y (width and height).\n    # Make all tiles about the same size.\n    # For now we just break up the image into a user-specified tile size\n    print(\"Generating the list of tiles\") # this can take a while so print a note\n    numTilesX, numTilesY, tileList = generateTileList(sizeX, sizeY,\n                                                      options.tileSize, options.padding)\n    numTiles = numTilesX * numTilesY\n\n    print('Splitting into ' + str(numTilesX) + ' by ' + str(numTilesY) + \\\n          ' = ' + str(numTilesX*numTilesY) + ' tiles.\\n')\n    \n    # Generate a text file that contains the boundaries for each tile\n    argumentFilePath = os.path.join(outputFolder, 'argumentList.txt')\n    argumentFile     = open(argumentFilePath, 'w')\n    for tile in tileList:\n        argumentFile.write(str(tile[0]) + '\\t' + str(tile[1]) + '\\t' \\\n                           + str(tile[2]) + '\\t' + str(tile[3]) + '\\n')\n    argumentFile.close()\n\n    # Indicate to GNU Parallel that there are multiple tab-separated\n    # variables in the text file we just wrote\n    parallelArgs = ['--colsep', \"\\\\t\", '--will-cite', '--env', 'ASP_DEPS_DIR',\n                    '--env', 'PATH', '--env', 'LD_LIBRARY_PATH',\n                    '--env', 'ASP_LIBRARY_PATH', '--env', 'ISISROOT']\n\n    if options.parallel_options is not None:\n        parallelArgs += options.parallel_options.split(' ')\n\n    # Get the number of available nodes and CPUs per node\n    numNodes = asp_system_utils.getNumNodesInList(options.nodesListPath)\n\n    # We assume all machines have the same number of CPUs (cores)\n    cpusPerNode = asp_system_utils.get_num_cpus()\n\n    # TODO: What is a good number here?\n    processesPerCpu = 2\n\n    # Set the optimal number of processes if the user did not specify\n    if not options.numProcesses:\n        options.numProcesses = cpusPerNode * processesPerCpu\n\n    # Note: sfs can run with multiple threads on non-ISIS data but we don't use that\n    #       functionality here since we call sfs with one tile at a time.\n\n    # No need for more processes than tiles\n    if options.numProcesses > numTiles:\n        options.numProcesses = numTiles\n\n    # Build the command line that will be passed to GNU parallel\n    # - The numbers in braces will receive the values from the text file we wrote earlier\n    # - The output path used here does not matter since spawned copies compute the correct tile path.\n    python_path = sys.executable # children must use same Python as parent\n    # We use below the libexec_path to call python, not the shell script\n    parallel_sfs_path = asp_system_utils.libexec_path('parallel_sfs')\n    commandList = [python_path, parallel_sfs_path,\n                     '--pixelStartX', '{1}',\n                     '--pixelStartY', '{2}',\n                     '--pixelStopX',  '{3}',\n                     '--pixelStopY',  '{4}',\n                     '--threads', str(options.threads)]\n    if options.suppressOutput:\n        commandList = commandList + ['--suppress-output']\n\n    if options.resume:\n        commandList.append('--resume')\n        \n    # Prepend the parallel arguments and append the extra arguments\n    commandList = parallelArgs + commandList + options.extraArgs\n\n    # Append the run directory\n    runDir = asp_system_utils.escape_token(os.getcwd())\n    commandList = commandList + ['--run-dir', runDir]\n\n    # Use GNU parallel call to distribute the work across computers. Wait until\n    # all processes are finished.\n    verbose = True\n    asp_system_utils.runInGnuParallel(options.numProcesses, \n                                      argumentFilePath, \n                                      commandList,\n                                      options.nodesListPath, verbose)\n\n    # Mosaic the results\n    for it in range(len(baseFileNames)):\n        mosaic_results(tileList, outputFolder, outputName, options,\n                       baseFileNames[it])\n        \n    endTime = time.time()\n    print(\"Finished in \" + str(endTime - startTime) + \" seconds.\")\n\nif __name__ == \"__main__\":\n    sys.exit(main(sys.argv[1:]))\n"
  },
  {
    "path": "src/asp/Tools/parallel_stereo",
    "content": "#!/usr/bin/env python\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2026, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\nimport sys, argparse, subprocess, re, os, math, time, glob, shutil, math, platform\nimport os.path as P\n\n# Set up the path to Python modules about to load\nbasepath    = os.path.abspath(sys.path[0])\npythonpath  = os.path.abspath(basepath + '/../Python')  # for dev ASP\nlibexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP\nsys.path.insert(0, basepath) # prepend to Python path\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\n\nimport asp_system_utils, asp_string_utils, asp_cmd_utils\nasp_system_utils.verify_python_version_is_supported()\nfrom asp_stereo_utils import * # must be after the path is altered above\n\n# Prepend to system PATH\nos.environ[\"PATH\"] = libexecpath + os.pathsep + os.environ[\"PATH\"]\n\n# This is explained below\nif 'ASP_LIBRARY_PATH' in os.environ:\n    os.environ['LD_LIBRARY_PATH'] = os.environ['ASP_LIBRARY_PATH']\n\ndef check_system_memory(opt, args, settings):\n    '''Issue a warning when doing correlation if our selected options\n    are estimated to exceed available RAM. Currently only the ASP SGM\n    and MGM have large memory requirements.'''\n\n    if asp_system_utils.run_with_return_code(['which', 'free']) != 0:\n        # No 'free' exists. This is the case on OSX.\n        return\n\n    try:\n        alg = stereo_alg_to_num(settings['stereo_algorithm'][0])\n        if alg == VW_CORRELATION_BM or alg >= VW_CORRELATION_OTHER:\n            return\n\n        # This is the processor count code, won't work if other\n        #  machines have a different processor count.\n        num_procs = opt.processes\n        if opt.processes is None:\n            num_procs = get_num_cpus()\n\n        # Memory usage calculations\n        bytes_per_mb        = 1024*1024\n        est_bytes_per_pixel = 8 # This is a very rough estimate!\n\n        num_tile_pixels = pow(int(settings['corr_tile_size'][0]), 2)\n        baseline_mem    = (num_tile_pixels*est_bytes_per_pixel) / bytes_per_mb\n        sgm_ram_limit   = int(settings['corr_memory_limit_mb'][0])\n        ram_per_process = baseline_mem + sgm_ram_limit\n        est_ram_usage   = int(num_procs * ram_per_process)\n\n        print('Warning: Estimated maximum memory consumption is '\n                  + str(est_ram_usage) + ' MB. To lower memory use, '\n                  + 'consider reducing the number of processes or lowering '\n                  + '--corr-memory-limit-mb.')\n\n    except:\n        # Don't let an error here prevent the tool from running.\n        print('Warning: Error checking system memory, skipping the memory test!')\n        return\n\ndef sym_link_prev_run(prev_run_prefix, out_prefix):\n    '''Sym link files from a previous run up to triangulation to the\n    output directory of this run. We must not symlink directories from\n    the previous run as then the new results will be written there.\n    Do not sym link the previous point cloud, DEM, etc., also not\n    VRT files as those will not be valid.\n    '''\n\n    # Ensure we do not wipe the run we want to reuse    \n    if prev_run_prefix == out_prefix:\n      raise Exception('The previous run prefix is the same as the current run prefix.')\n      \n    curr_dir = os.path.dirname(out_prefix)\n    mkdir_p(curr_dir)\n    \n    for ext in ['L.tif', 'R.tif', 'L-cropped.tif', 'R-cropped.tif', 'L.tsai', 'R.tsai',\n                'L_cropped.tif', 'R_cropped.tif', \n                'L_sub.tif', 'R_sub.tif', 'Mask_sub.tif', 'D_sub.tif', 'D_sub_spread.tif',\n                '.vwip', 'L.txt', 'R.txt', '.exr', '.match', 'GoodPixelMap.tif',\n                'F.tif', 'stats.tif', 'Mask.tif', 'bathy_mask.tif']:\n        files = glob.glob(prev_run_prefix + '*' + ext)\n        for f in files:\n            if os.path.isdir(f): continue # Skip folders\n            dst_f = f[len(prev_run_prefix):] # strip the prefix\n            dst_f = out_prefix + dst_f\n            rel_src = os.path.relpath(f, curr_dir)\n            if os.path.exists(dst_f):\n                os.remove(dst_f) # this could be some dangling thing\n            os.symlink(rel_src, dst_f)\n\ndef create_symlinks_for_multiview(opt, args, settings):\n    \"\"\"\n    Running parallel_stereo for each pair in a multiview run\n    creates files like:\n      out-prefix-pair2/2-4096_4096_1629_1629/4096_4096_1629_1629-F.tif\n    To run parallel_stereo for tri, we expect this at\n      out-prefix-4096_4096_1629_1629/4096_4096_1629_1629-pair2/2-F.tif\n    Create the latter as a sym link.\n    \"\"\"\n    subdirs = create_subdirs_symlink(opt, args, settings) # symlink L.tif, etc\n    \n    for s in sorted(settings.keys()):\n        \n        # Find the settings for each stereo command that together comprise the\n        # multiview run.\n        # TODO(oalexan1): This should be factored out as a function, and the above\n        # loop should iterate over the output of this function.\n        m = re.match(r'multiview_command', s)\n        if not m:\n            continue\n        local_settings=run_and_parse_output(\"stereo_parse\", settings[s][1:],\n                                            sep, opt.verbose)\n        local_prefix = local_settings['out_prefix'][0]\n        m = re.match(r'^(.*?)-pair(\\d+)\\/', local_prefix)\n        if not m:\n            continue\n        base_prefix = m.group(1)\n        index       = str(m.group(2))\n        \n        for tile_id in range(len(subdirs)):\n            subdir = subdirs[tile_id]\n            tile = dirToTile(subdir)\n            tile_str = tile.name_str()\n            src_pref = tile_dir(base_prefix + '-pair' + index + '/' + index, tile) + '/' + tile_str\n            dst_dir  = tile_dir(base_prefix, tile) + '/' + tile_str + '-pair' + index\n            mkdir_p(dst_dir)\n\n            dst_pref = dst_dir + '/' + index\n            files = glob.glob(src_pref + '*')\n            for f in files:\n                m = re.match(skip_symlink_expr, f)\n                if m:\n                    continue # won't sym link certain patterns\n                m = re.match(r'^' + src_pref + '(.*?)$', f)\n                if not m:\n                    continue\n                suff    = m.group(1)\n                src_f   = src_pref + suff\n                dst_f   = dst_pref + suff\n                rel_src = os.path.relpath(src_f, dst_dir)\n                if os.path.lexists(dst_f):\n                    continue\n                os.symlink(rel_src, dst_f)\n\ndef get_num_nodes(nodes_list):\n\n    if nodes_list is None:\n        return 1 # local machine\n\n    # Count the number of nodes without repetition (need this for\n    # Pleiades).\n    nodes = {}\n    num_nodes = 0\n    try:\n        fh = open(nodes_list, \"r\")\n        for line in fh:\n            if re.match(r'^\\s*$', line): continue # skip empty lines\n            matches = re.match(r'^\\s*([^\\s]*)', line)\n            if matches:\n                nodes[matches.group(1)] = 1\n\n        num_nodes = len(nodes)\n    except Exception as e:\n        raise_error(e)\n    if num_nodes == 0:\n        raise Exception('The list of computing nodes is empty')\n\n    return num_nodes\n\ndef get_best_procs_threads(step, opt, settings):\n    # Decide the best number of processes to use on a node, and how\n    # many threads to use for each process.  There used to be some\n    # fancy logic, see below, but it does not work well. For now,\n    # use many processes and one thread per process.\n\n    # We assume all machines have the same number of CPUs (cores)\n    num_cpus = get_num_cpus()\n\n    # Respect user's choice for the number of processes\n    num_procs = num_cpus\n    if opt.processes is not None:\n        num_procs = opt.processes\n\n    # Same for the number of threads.\n    num_threads = 1\n    if opt.threads_multi is not None:\n        num_threads = opt.threads_multi\n        \n    # Old code, now turned off.\n    if 0:\n        if step == Step.corr:\n            tile_size = int(settings['corr_tile_size'][0])\n        elif step == Step.rfne:\n            tile_size = int(settings['rfne_tile_size'][0])\n        elif step == Step.tri:\n            tile_size = int(settings['tri_tile_size'][0])\n        else:\n            raise Exception('Stereo step %d must be executed on a single machine.' \\\n                            % step)\n\n        # We use the observation that each tile uses one thread,\n        # so we need to find how many tiles are in the given job.\n        num_threads = int(opt.job_size_w*opt.job_size_h/tile_size/tile_size)\n        if num_threads > num_cpus: num_threads = num_cpus\n        if num_threads <= 0: num_threads = 1\n\n        # For triangulation, we need to consider the case of ISIS cameras\n        # when we must use 1 thread unless CSM sensor models have been provided.\n        if step == Step.tri:\n            cam_info = \" \".join(settings['in_file1'] + settings['in_file2'] + \\\n                                settings['cam_file1'] + settings['cam_file2'])\n            m1 = re.search('\\\\.cub\\\\b',  cam_info, re.IGNORECASE)\n            m2 = re.search('\\\\.json\\\\b', cam_info, re.IGNORECASE)\n            m3 = re.search('\\\\.isd\\\\b',  cam_info, re.IGNORECASE)\n            if m1 and not (m2 or m3):\n                num_threads = 1\n\n        num_procs = int(math.ceil(float(num_cpus)/num_threads))\n\n    if opt.verbose:\n        print(\"For stage %d, using %d threads and %d processes.\" %\n              (step, num_threads, num_procs))\n\n    return (num_procs, num_threads)\n\n# Launch GNU Parallel for all tiles, it will take care of distributing\n# the jobs across the nodes and load balancing. The way we accomplish\n# this is by calling this same script but with --tile-id <num>.\ndef spawn_to_nodes(step, opt, settings, args, subdirs):\n\n    if opt.processes is None or opt.threads_multi is None:\n        # The user did not specify these. We will find the best\n        # for their system.\n        (procs, threads) = get_best_procs_threads(step, opt, settings)\n    else:\n        procs = opt.processes\n        threads = opt.threads_multi\n\n    asp_cmd_utils.wipe_option(args, '--processes', 1)\n    asp_cmd_utils.wipe_option(args, '--threads-multiprocess', 1)\n    args.extend(['--processes', str(procs)])\n    args.extend(['--threads-multiprocess', str(threads)])\n\n    # Each tile has an index in the list of tiles. There can be a huge amount of\n    # tiles, and for that reason we store their indices in a file, rather than\n    # putting them on the command line. Keep this file in the run directory.\n    out_prefix = settings['out_prefix'][0]\n    tiles_index = stereoTilesIndex(out_prefix)\n    mkdir_p(os.path.dirname(tiles_index))\n    f = open(tiles_index, 'w')\n    for i in range(len(subdirs)):\n        f.write(\"%d\\n\" % i)\n    f.close()\n\n    # Reset number of done tiles for this step\n    reset = True\n    updateNumDoneTiles(out_prefix, stereoProgName(step), reset)\n    \n    # Use GNU parallel with given number of processes.\n    # TODO(oalexan1): Run 'parallel' using the runInGnuParallel() function call,\n    # when the ASP_LIBRARY_PATH trick can be fully encapsulated in the\n    # asp_system_utils.py code rather than being needed for each tool.\n    cmd = ['parallel', '--will-cite', '--env', 'ASP_DEPS_DIR', '--env', 'PATH', '--env', 'LD_LIBRARY_PATH', '--env', 'ASP_LIBRARY_PATH', '--env', 'PYTHONHOME', '--env', 'ISISROOT', '-u', '-P', str(procs), '-a', tiles_index]\n    if which(cmd[0]) is None:\n        raise Exception('Need GNU Parallel to distribute the jobs.')\n\n    if opt.nodes_list is not None:\n        cmd += ['--sshloginfile', opt.nodes_list]\n    if opt.ssh is not None:\n        cmd += ['--ssh', opt.ssh]\n    if opt.parallel_options is not None:\n        cmd += opt.parallel_options.split(' ')\n        \n    # Assemble the options which we want GNU parallel to not mess up\n    # with. \n    args_copy = args[:] # deep copy\n    args_copy += [\"--work-dir\", opt.work_dir]\n    if opt.isisroot  is not None: \n        args_copy += [\"--isisroot\",  opt.isisroot]\n    if opt.isisdata is not None: \n        args_copy += [\"--isisdata\", opt.isisdata]\n    \n    # Quote entities that have spaces in them. Don't quote quantities\n    # already quoted.\n    for index, arg in enumerate(args_copy):\n        if re.search(r\"[ \\t]\", arg) and arg[0] != '\\'':\n            args_copy[index] = '\\'' + arg + '\\''\n            \n    python_path = sys.executable # children must use same Python as parent\n    start = step; stop = start + 1\n    \n    # Put options in a single string.\n    args_str = python_path + \" \"              + \\\n               \" \".join(args_copy)            + \\\n               \" --entry-point \" + str(start) + \\\n               \" --stop-point \" + str(stop) \n    args_str += \" --tile-id {}\"\n    cmd += [args_str]\n\n    # This is a bugfix for RHEL 8. The 'parallel' program fails to start with ASP's\n    # libs, so temporarily hide them.\n    if 'LD_LIBRARY_PATH' in os.environ:\n        os.environ['ASP_LIBRARY_PATH'] = os.environ['LD_LIBRARY_PATH']\n        os.environ['LD_LIBRARY_PATH'] = ''\n\n    asp_system_utils.generic_run(cmd, opt.verbose)\n\n    # Undo the above\n    if 'ASP_LIBRARY_PATH' in os.environ:\n        os.environ['LD_LIBRARY_PATH'] = os.environ['ASP_LIBRARY_PATH']\n\ndef tile_run(prog, args, opt, settings, tile, **kw):\n    '''Job launch wrapper for a single tile'''\n\n    if prog != 'stereo_blend':  # Set collar_size argument to zero in almost all cases.\n        asp_cmd_utils.set_option(args, '--sgm-collar-size', [0])\n\n    # Get tool path and output prefix\n    binpath = asp_system_utils.bin_path(prog)\n    out_prefix = settings['out_prefix'][0]\n\n    # Measure the memory usage on Linux and elapsed time\n    timeCmd = []\n    if 'linux' in sys.platform and os.path.exists('/usr/bin/time'):\n        timeCmd = ['/usr/bin/time', '-f', prog + \\\n                   ': elapsed=%E ([hours:]minutes:seconds), memory=%M (kb)']\n\n    try:\n        # Get tile folder\n        tile_dir_prefix = tile_dir(out_prefix, tile) + \"/\" + tile.name_str()\n\n        # When using SGM correlation, increase the output tile size.\n        # - The output image will contain more populated pixels but\n        #   there will be no other change.\n        adjusted_tile = grow_crop_tile_maybe(settings, prog, tile)\n        if adjusted_tile.width <= 0 or adjusted_tile.height <= 0:\n            return # the produced tile is empty\n\n        # Increase the processing block size for the tile so we process\n        # the entire tile in one go.\n        if use_padded_tiles(settings) and prog == 'stereo_corr':\n            curr_tile_size = max(adjusted_tile.width, adjusted_tile.height)\n            asp_cmd_utils.set_option(args, '--corr-tile-size', [curr_tile_size])\n\n        # Set up the call string\n        call = [binpath]\n        call.extend(args)\n\n        if opt.threads_multi is not None:\n            asp_cmd_utils.wipe_option(call, '--threads', 1)\n            call.extend(['--threads', str(opt.threads_multi)])\n\n        cmd = call + ['--trans-crop-win'] + adjusted_tile.as_array() # append the tile\n\n        # This is a bugfix for when the output prefix is the same as the\n        # bundle-adjust-prefix. Let the stereo executables parse these as it is\n        # better equipped for that.\n        cmd += ['--output-prefix-override', tile_dir_prefix]\n\n        if opt.dryrun:\n            print(\" \".join(cmd))\n            return\n        if opt.verbose:\n            print(\" \".join(cmd))\n\n        resetStatus = False # for updating the status of done tiles\n\n        # See if perhaps we can skip correlation\n        if prog == 'stereo_corr' and opt.resume_at_corr:\n\n            D = tile_dir_prefix + '-D.tif'\n            if (not os.path.islink(D)) and asp_system_utils.is_valid_image(D):\n                # The disparity D.tif is valid and not a symlink. No need\n                # to recreate it.\n                updateNumDoneTiles(out_prefix, prog, resetStatus)\n                return\n\n            Dnosym = tile_dir_prefix + '-Dnosym.tif'\n            if (not os.path.islink(Dnosym)) and asp_system_utils.is_valid_image(Dnosym):\n                # In a previous run D.tif was renamed to Dnosym.tif\n                # and D.tif was made into a symlink. Still good.\n                # Just undo the rename.\n                if os.path.exists(D):\n                    os.remove(D)\n                os.rename(Dnosym, D)\n                updateNumDoneTiles(out_prefix, prog, resetStatus)\n                return\n\n            # We are left with the situation that there is no image which is both\n            # valid and not a symlink. Perhaps D does not exist or is corrupted.\n            # Then wipe D and Dnosym, if present, and redo the correlation.\n            print(\"Will run correlation to create a valid image for \" + D)\n            if os.path.exists(D):\n                os.remove(D)\n            if os.path.exists(Dnosym):\n                os.remove(Dnosym)\n\n        cmd = timeCmd + cmd\n        (out, err, status) = asp_system_utils.executeCommand(cmd, realTimeOutput = True)\n\n        if len(timeCmd) > 0:\n            print(err)\n            usage_file = tile_dir_prefix + \"-\" + prog + \"-resource-usage.txt\"\n            with open(usage_file, 'w') as f:\n                f.write(err)\n\n        if status != 0:\n            raise Exception('Stereo step ' + kw['msg'] + ' failed')\n\n        if status == 0:\n          updateNumDoneTiles(out_prefix, prog, resetStatus)\n\n    except OSError as e:\n        raise Exception('%s: %s' % (binpath, e))\n\ndef keepOnlySpecified(keep_only, out_prefix, subdirs, settings):\n    \"\"\"\n    Merge all VRTs and wipe any files the user does not want to keep.\n    \"\"\"\n    \n    if keep_only == \"unchanged\":\n      return # keep everything unchanged\n    elif keep_only == \"essential\":\n      keep_only = \"L.txt R.txt .exr -L.tif -F.tif disp-diff.tif -PC.tif\"\n    \n    # List all the files stereo may create. We will not attempt to delete\n    # any files except these (and subdirs). In particular log files in the \n    # top-most directory are not deleted.\n    all_files = set()\n    for ext in \".vwip .match cropped.tif -L.tif -R.tif ask.tif L.txt R.txt .exr sub.tif -D.tif -RD.tif -B.tif disp-diff.tif -F.tif -PC.tif\".split():\n        for f in glob.glob(out_prefix + \"*\" + ext):\n            all_files.add(f)\n\n    # List all the files with the suffixes the user wants to keep. Must also keep\n    # the aux.xml files, as those can have CRS information.    \n    keep_files = set()\n    if keep_only == \"all_combined\":\n            keep_files = all_files.copy()\n    else:\n        for keep in keep_only.split():\n            for f in glob.glob(out_prefix + \"*\" + keep) + \\\n                     glob.glob(out_prefix + \"*\" + keep + \".aux.xml\"): \n                keep_files.add(f)\n\n    if len(keep_files) == 0:\n        # Sometimes the user can make a mistake here. If not sure, don't do anything.\n        print(\"No files to keep. This is likely a user error. Not deleting any files.\")\n        return\n        \n    for f in keep_files:\n    \n        if int(settings['correlator_mode'][0]) != 0 and 'PC.tif' in f:\n           # No PC.tif in correlator-mode \n           continue\n\n        print(\"Keeping: \" + f)\n        if isVrt(f):\n            f_merged = os.path.splitext(f)[0] + \"_merged.tif\"\n            print(\"Convert \" + f + \" from VRT to TIF format.\")\n            cmd = ['gdal_translate', '-co', 'compress=lzw', '-co', 'TILED=yes', '-co',\n                   'INTERLEAVE=BAND', '-co', 'BLOCKXSIZE=256', '-co', 'BLOCKYSIZE=256',\n                   '-co', 'BIGTIFF=IF_SAFER', f, f_merged]\n            (out, err, status) = asp_system_utils.executeCommand(cmd, realTimeOutput = True)\n            if status != 0:\n                raise Exception('Failed converting VRT to TIF. Qutting. ' + \\\n                                'Likely this run is partially wiped now.')\n                \n            print(\"Renaming: \" + f_merged + \" to \" + f)\n            shutil.move(f_merged, f)\n            \n            # If _merged.aux.xml exists, rename it to .xml. This is for 3D CRS.\n            merged_aux = f_merged + \".aux.xml\"\n            aux = f + \".aux.xml\"\n            if os.path.exists(merged_aux):\n                print(\"Renaming: \" + merged_aux + \" to \" + aux)\n                shutil.move(merged_aux, aux)\n\n    # Delete the other files and directories\n    for f in list(all_files) + subdirs:\n        if f not in keep_files:\n            print(\"Deleting: \" + f)\n            if os.path.isdir(f):\n                shutil.rmtree(f)\n            else:\n                os.remove(f)\n    \n    # It looks useful to print the final cloud, as the messages above\n    # can be quite verbose.\n    pc_file = glob.glob(out_prefix + \"-PC.tif\")\n    if len(pc_file) > 0 and int(settings['correlator_mode'][0]) == 0:\n        print(\"Output point cloud: \" + pc_file[0])\n\ndef parallel_stereo_args(p, opt, parallel_args, args):\n    \"\"\"\n    Find the options used by parallel_stereo which are not\n    passed to the stereo executables. This is fragile.\n    \"\"\"\n\n    # Map from option, say --job-size-w, to the variable name, say, job_size_w.\n    opt2var = {}\n    for x in p._actions:\n        # For cases like ['-l', '--long'] get the second entry\n        opt_str = getattr(x, 'option_strings')[-1]\n        opt2var[opt_str] = getattr(x, 'dest')\n\n    extra_args = []\n    option_dict = vars(opt) # Each option understood by python, and its parsed value\n    for arg in parallel_args[1:]:\n\n        if arg in args:\n            # This is an option passed to stereo\n            continue\n\n        if len(arg) >= 2 and arg[0] == '-' and arg[1] != '-':\n            # We expect two dashes\n            raise Exception('Failed to parse: ' + arg)\n\n        if not arg in opt2var.keys():\n            # Does not start with dash\n            continue \n\n        var = opt2var[arg]\n\n        if option_dict[var] is None:\n            # This option was not specified\n            continue\n\n        if isinstance(option_dict[var], bool):\n            # This is a bool flag, append it with no value\n            extra_args.append(arg)\n            continue\n\n        if (isinstance(option_dict[var], int)    or\n            isinstance(option_dict[var], float)  or\n            asp_string_utils.isString(option_dict[var])):\n            # For int, float, and string, append together with value\n            extra_args.append(arg)\n            extra_args.append(str(option_dict[var]))\n            continue\n\n        # We cannot currently parse other options than int, string, float, and bool.\n        # Should be simple to fix if need be. \n        raise Exception('Could not parse: ' + arg)\n\n    return extra_args\n\ndef setup_run_multiview(opt, settings, parallel_args, args):\n    '''\n    Prepare and run multiview stereo. Triangulation is joint, but\n    the steps before that are done separately for each pair.\n    '''\n \n    # TODO(oalexan1): This function calls parallel_stereo again. This is\n    # confusing.\n    \n    if opt.keep_only == \"all_combined\":\n        # Change the default to \"unchanged\"\n        opt.keep_only = \"unchanged\"\n    if opt.keep_only != \"unchanged\":\n        # If the user specified something else\n        raise Exception('Option --keep-only does not work with multiview stereo.')\n\n    # TODO(oalexan1): avoid confusing the logic below\n    asp_cmd_utils.wipe_option(parallel_args, '-s', 1)\n    if os.path.exists(opt.stereo_file):\n        parallel_args.extend(['--stereo-file', opt.stereo_file])\n\n    # Args only for parallel_stereo\n    extra_args = parallel_stereo_args(p, opt, parallel_args, args)\n\n    if opt.entry_point < Step.tri:\n        run_multiview(__file__, args, extra_args, opt.entry_point,\n                        opt.stop_point, opt.verbose, settings)\n        # Everything is done.\n        sys.exit(0)\n    else:\n        # We will arrive here after this script invokes itself\n        # for multiview.  Set up the directories. After this\n        # exits, triangulation will run.\n        create_symlinks_for_multiview(opt, args, settings)\n                \nif __name__ == '__main__':\n    usage = '''parallel_stereo [options] <images> [<cameras>]\n                  <output_prefix> [DEM]\n        Extensions are automatically added to the output files.\n        Camera model arguments may be optional for some stereo\n        session types (e.g. isis). Stereo parameters should be\n        set in the stereo.default file.\\n''' + asp_system_utils.get_asp_version()\n\n    # What makes this program different from stereo is that it\n    # tries to treat ASP as a multi-process system instead of a\n    # multi-threaded executable. This has benefits on the super\n    # computer by allowing a single stereo pair use multiple\n    # computers. It also allows us to get past the single-threaded\n    # constraints of ISIS.\n\n    # Algorithm: When this script is started, it calls itself on each node if\n    # doing steps 1, 2, or 4 (corr, rfne, tri). Those scripts in turn start\n    # actual jobs on those nodes. For the other steps, the script does the work\n    # itself.\n\n    # Python does not know how to disambiguate between two options which start\n    # with a similar prefix.\n    if '--threads' in sys.argv:\n        print(\"Ignoring the option --threads. Use --threads-multiprocess \" + \\\n              \"and --threads-singleprocess.\")\n        asp_cmd_utils.wipe_option(sys.argv, '--threads', 1)\n\n    p = argparse.ArgumentParser(usage=usage)\n    p.add_argument('--nodes-list', dest='nodes_list', default=None,\n        help='The list of computing nodes, one per line. If not provided, run ' + \\\n        'on the local machine.')\n    p.add_argument('--ssh', dest='ssh', default=None,\n        help='The path to the ssh program to use to connect to other nodes')\n    p.add_argument('--processes', dest='processes', default=None, type=int,\n        help='The number of processes to use per node.')\n    p.add_argument('--threads-multiprocess', dest='threads_multi', default=None, type=int,\n        help='The number of threads to use per process when running multiple ' + \\\n        'processes.')\n    p.add_argument('--threads-singleprocess', dest='threads_single', default=None, type=int,\n        help='The number of threads to use when running a single process (PPRC ' + \\\n        'and FLTR).')\n    p.add_argument('--corr-seed-mode', dest='seed_mode', default=None, type=int,\n        help='Correlation seed strategy. See stereo_corr for options.')\n    p.add_argument('-e', '--entry-point', dest='entry_point', default=0, type=int,\n        help='Stereo Pipeline entry point (an integer from 0-6).')\n    p.add_argument('--stop-point', dest='stop_point', default=7, type=int,\n        help='Stereo Pipeline stop point (an integer from 1-7). Stop before this ' + \\\n        'step.')\n    p.add_argument('--job-size-w', dest='job_size_w', default=-1, type=int,\n        help='Pixel width of input image tile for a single process. Set ' + \\\n        'automatically.')\n    p.add_argument('--job-size-h', dest='job_size_h', default=-1, type=int,\n        help='Pixel height of input image tile for a single process. Set ' + \\\n        'automatically.')\n    p.add_argument('--sgm-collar-size', dest='sgm_collar_size', default=-1, type=int,\n        help='The padding around each tile to process. Set automatically.')\n    p.add_argument('--resume-at-corr', dest='resume_at_corr', default=False,\n        action='store_true',\n        help='Start at the correlation stage and skip recomputing the valid low ' + \\\n        'and full-res disparities for that stage. Do not change ' + \\\n        '--left-image-crop-win, etc., when running this.')\n    p.add_argument('--prev-run-prefix', dest='prev_run_prefix', default=None,\n        help='Start at the triangulation stage while reusing the data from this ' + \\\n        'prefix. The new run can use different cameras, bundle adjustment prefix, ' + \\\n        'or bathy planes (if applicable). Do not change crop windows, as that ' + \\\n        'would invalidate the run.')\n    p.add_argument('--keep-only', dest='keep_only', default=\"all_combined\",\n        help='If set to \"all_combined\", which is the default, at the end of a ' + \\\n        'successful run combine the results from subdirectories into .tif files ' + \\\n        'with the given output prefix, and delete the subdirectories. If set to ' + \\\n        '\"essential\", keep only PC.tif and the files needed to recreate it (those ' + \\\n        'ending with L.txt, R.txt, .exr, L.tif, -F.tif). If set to \"unchanged\", ' + \\\n        'keep the run directory as it is. For fine-grained control, specify a ' + \\\n        'quoted list of suffixes of files to keep, such as \"L.txt R.txt .exr ' + \\\n        '.match -L.tif -PC.tif\".')\n    p.add_argument('--sparse-disp-options', dest='sparse_disp_options',\n        help='Options to pass directly to sparse_disp. Use quotes around this ' + \\\n        'string.')\n    p.add_argument('-v', '--version', dest='version', default=False, action='store_true',\n        help='Display the version of software.')\n    p.add_argument('-s', '--stereo-file', dest='stereo_file', default='./stereo.default',\n        help='Explicitly specify the stereo.default file to use. ' + \\\n        '[default: ./stereo.default]')\n    p.add_argument('--verbose', dest='verbose', default=False, action='store_true',\n        help='Display the commands being executed.')\n    p.add_argument('--parallel-options', dest='parallel_options', default='--sshdelay 0.2',\n        help='Options to pass directly to GNU Parallel.')\n    # Internal variables below.\n    # The id of the tile to process, 0 <= tile_id < num_tiles.\n    p.add_argument('--tile-id', dest='tile_id', default=None, type=int,\n                   help=argparse.SUPPRESS)\n    # Directory where the job is running\n    p.add_argument('--work-dir', dest='work_dir', default=None,\n                   help=argparse.SUPPRESS)\n    # ISIS settings\n    p.add_argument('--isisroot', dest='isisroot', default=None,\n                   help=argparse.SUPPRESS)\n    p.add_argument('--isisdata', dest='isisdata', default=None,\n                   help=argparse.SUPPRESS)\n    # Debug option\n    p.add_argument('--dry-run', dest='dryrun', default=False, action='store_true',\n                   help=\"Do not launch the jobs, only print the commands that should be run.\")\n\n    (opt, args) = p.parse_known_args()\n    args = asp_cmd_utils.clean_args(args)\n    \n    if opt.version:\n        asp_system_utils.print_version_and_exit()\n\n    if not args and not opt.version:\n        p.print_help()\n        raise_error('Missing input files', code=2)\n\n    # Ensure our 'parallel' is not out of date\n    asp_system_utils.check_parallel_version()\n\n    if opt.tile_id is None and opt.resume_at_corr:\n        print(\"Resuming at the correlation stage.\")\n        opt.entry_point = Step.corr\n        if opt.stop_point <= Step.corr:\n            raise Exception('Cannot resume at correlation if --stop-point ' + \\\n                            'is set to stop before that.')\n\n    if opt.threads_single is None:\n        opt.threads_single = get_num_cpus()\n\n    # Resolve corr-seed-mode from CLI, stereo file, or default\n    resolve_seed_mode(opt, args)\n\n    if os.path.exists(opt.stereo_file):\n        args.extend(['--stereo-file', opt.stereo_file])\n\n    if opt.tile_id is None:\n        # When the script is started, set some options from the\n        # environment which we will pass to the scripts we spawn\n        # 1. Set the work directory\n        opt.work_dir = os.getcwd()\n        # 2. Set the ISIS settings if any\n        if 'ISISROOT' in os.environ: opt.isisroot = os.environ['ISISROOT']\n        if 'ISISDATA' in os.environ: opt.isisdata = os.environ['ISISDATA']\n    else:\n        # After the script spawns itself to nodes, it starts in the\n        # home dir. Make it go to the right place.\n        os.chdir(opt.work_dir)\n        # Set the ISIS settings\n        if opt.isisroot  is not None: os.environ['ISISROOT' ] = opt.isisroot\n        if opt.isisdata is not None: os.environ['ISISDATA'] = opt.isisdata\n\n    # This command needs to be run after we switch to the work directory,\n    # hence no earlier than this point.\n    sep = \",\"\n    settings = run_and_parse_output(\"stereo_parse\", args, sep, opt.verbose)\n    out_prefix = settings['out_prefix'][0]\n\n    if settings['stereo_algorithm'][0].lower() == 'libelas' and \\\n       platform.system() == \"Darwin\" and platform.machine() == \"arm64\":\n       raise Exception('The stereo algorithm ' + \\\n                        settings['stereo_algorithm'][0] + ' is not supported on Mac Arm.')\n\n    # In the master process, need to create the list of nodes. Must happen\n    # after we are in the work dir and have out_prefix. This ensures\n    # the list is not in a temp dir of one of the nodes.\n    if opt.tile_id is None and opt.nodes_list is not None:\n        if not os.path.isfile(opt.nodes_list):\n            raise_error('No such nodes-list file: ' + opt.nodes_list, code=2)\n        local_nodes_list = out_prefix + \"-nodes-list.txt\"\n        mkdir_p(os.path.dirname(local_nodes_list))\n        if opt.nodes_list != local_nodes_list:\n            shutil.copy2(opt.nodes_list, local_nodes_list)\n            opt.nodes_list = local_nodes_list\n        asp_cmd_utils.wipe_option(sys.argv, '--nodes-list', 1)\n        sys.argv.extend(['--nodes-list', opt.nodes_list])\n        print(\"Nodes list: \" + opt.nodes_list)\n      \n    # Padded tiles are needed if later we do blending \n    using_padded_tiles = use_padded_tiles(settings)\n\n    # By default use 8 threads for SGM/MGM. Then use proportionately fewer\n    # processes to not run out of RAM. Otherwise see the function\n    # get_best_procs_threads().\n    # TODO(oalexan1): This logic needs to be all in one place.\n    # For ISIS needs to use more processes in triangulation.\n    alg = stereo_alg_to_num(settings['stereo_algorithm'][0])\n    if alg > VW_CORRELATION_BM and alg < VW_CORRELATION_OTHER:\n        if opt.threads_multi is None:\n            opt.threads_multi = 8\n        if opt.processes is None:\n            num_cpus = get_num_cpus()\n            opt.processes = int(float(num_cpus) / float(opt.threads_multi) + 0.5)\n            if opt.processes <= 0:\n                opt.processes = 1\n\n    if opt.version:\n        args.append('-v')\n\n    # TODO(oalexan1): This block must be a function called setup_job_size().\n    if int(opt.job_size_h < 0) + int(opt.job_size_w < 0) == 1:\n        raise Exception('Must set neither or both of --job-size-h and --job-size-w.')\n    # If --job-size-h and --job-size-w are not set, set them depending on the algorithm\n    localEpi = (settings['alignment_method'][0] == 'local_epipolar')\n    if opt.job_size_h < 0:\n        if alg >= VW_CORRELATION_OTHER or localEpi:\n            # Local alignment needs small tiles\n            opt.job_size_w = 512\n            opt.job_size_h = 512\n        elif alg == VW_CORRELATION_BM:\n            # Regular block matching\n            opt.job_size_w = 2048\n            opt.job_size_h = 2048\n        elif alg > VW_CORRELATION_BM:\n            # SGM, MGM, etc.\n            opt.job_size_w = 2048\n            opt.job_size_h = 2048\n    if opt.sgm_collar_size < 0:\n        if alg >= VW_CORRELATION_OTHER or localEpi:\n            # Local alignment\n            opt.sgm_collar_size = 128\n        elif alg == VW_CORRELATION_BM:\n            # Regular block matching\n            opt.sgm_collar_size = 0\n        elif alg > VW_CORRELATION_BM:\n            # SGM, MGM, etc.\n            opt.sgm_collar_size = 256\n    # Update the collar size in the settings and args\n    (settings, args) = set_collar_size(opt.sgm_collar_size, args, settings)\n\n    # A string unlikely to be in the output. This should be in sync with stereo_parse.\n    sep2 = '--non-comma-separator--'\n    \n    georef=run_and_parse_output(\"stereo_parse\", args, sep2, opt.verbose)\n    georef[\"WKT\"] = \"\".join(georef[\"WKT\"])\n    georef[\"GeoTransform\"] = \"\".join(georef[\"GeoTransform\"])\n\n    print ('Using tiles (before collar addition) of ' + str(opt.job_size_w) + \\\n           ' x ' + str(opt.job_size_h) + ' pixels.')\n    print('Using a collar (padding) for each tile of ' + settings['collar_size'][0] + \\\n          ' pixels.')\n    \n    # parallel_args is what we will pass to spawned copies of parallel_stereo,\n    # while 'args' is what we pass to plain stereo.\n    parallel_args = sys.argv # shallow copy\n    \n    # Individual tools may use these options, but then they confuse parallel_stereo.\n    # They are usually encountered in log files and can be passed in by mistake.\n    if '--compute-point-cloud-center-only' in parallel_args:\n      raise Exception('Option --compute-point-cloud-center-only is not ' + \\\n                      'supported in parallel_stereo. Use stereo_tri instead.')\n    if '--compute-low-res-disparity-only' in parallel_args:\n        raise Exception('Option --compute-low-res-disparity-only is not ' + \\\n                        'supported in parallel_stereo. Use stereo_corr instead.')\n\n    # See if to resume at triangulation. This logic must happen after we figured\n    # if we need padded tiles, otherwise the bookkeeping will be wrong.\n    if opt.tile_id is None and opt.prev_run_prefix is not None:\n        print(\"Starting at the triangulation stage while reusing a previous run.\")\n        opt.entry_point = Step.tri\n        if opt.stop_point <= Step.tri:\n            raise Exception('Cannot resume at triangulation if --stop-point ' + \\\n                            'is set to stop before that.')\n        sym_link_prev_run(opt.prev_run_prefix, out_prefix)\n\n        # Now that we have data, update the settings value\n        settings = run_and_parse_output(\"stereo_parse\", args, sep, opt.verbose)\n\n        # Create the directory tree for this run\n        subdirs = create_subdirs_symlink(opt, args, settings)\n\n    # TODO(oalexan1): The giant block below needs to be broken up into two\n    # functions, called main_run() and and tile_run(). Careful testing will be\n    # needed, including for multiview stereo.\n    if opt.tile_id is None:\n\n        # We get here when the script is started. The current running process\n        # has become the management process that spawns other copies of itself\n        # on other machines. This block will only do actual work when we hit a\n        # non-multiprocess step like pprc or fltr.\n\n        # Wipe options which we will override.\n        asp_cmd_utils.wipe_option(parallel_args, '-e', 1)\n        asp_cmd_utils.wipe_option(parallel_args, '--entry-point', 1)\n        asp_cmd_utils.wipe_option(parallel_args, '--stop-point', 1)\n        \n        num_pairs = int(settings['num_stereo_pairs'][0])\n        if num_pairs > 1:\n            # Multiview stereo needs special treatment\n            setup_run_multiview(opt, settings, parallel_args, args)\n\n        # Preprocessing\n        step = Step.pprc\n        if (opt.entry_point <= step):\n            if (opt.stop_point <= step):\n                sys.exit()\n            normal_run('stereo_pprc', opt, args, out_prefix, msg='%d: Preprocessing' % step)\n            # Now that L.tif is saved, recompute trans_left_image_size.\n            settings = run_and_parse_output(\"stereo_parse\", args, sep, opt.verbose)\n\n        # Correlation\n        step = Step.corr\n        if (opt.entry_point <= step):\n            if (opt.stop_point <= step):\n                sys.exit()\n\n            # Do low-res correlation, this happens just once.\n            calc_lowres_disp(args, opt, sep, resume = opt.resume_at_corr)\n\n            # symlink D_sub, D_sub_spread, etc.\n            subdirs = create_subdirs_symlink(opt, args, settings)\n\n            # Run full-res stereo using multiple processes.\n            check_system_memory(opt, args, settings)\n            parallel_args.extend(['--skip-low-res-disparity-comp'])\n            spawn_to_nodes(step, opt, settings, parallel_args, subdirs)\n            # Low-res disparity is done, so wipe that option\n            asp_cmd_utils.wipe_option(parallel_args, '--skip-low-res-disparity-comp', 0)\n            \n            # Bugfix: When doing refinement for a given tile, we must see\n            # the result of correlation for all tiles. To achieve that,\n            # rename all correlation tiles to something else,\n            # build the vrt of all correlation tiles, and sym link\n            # that vrt from all tile directories.\n            rename_files(settings, subdirs, \"-D.tif\", \"-Dnosym.tif\")\n            build_vrt('stereo_corr', opt, args, settings, georef, \n                      \"-D.tif\", \"-Dnosym.tif\", \n                      contract_tiles = using_padded_tiles)\n            subdirs = create_subdirs_symlink(opt, args, settings) # symlink D.tif\n\n        skip_refine_step = (int(settings['subpixel_mode'][0]) > 6)\n\n        # Blending (when using local_epipolar alignment, or SGM/MGM, or external algorithms)\n        step = Step.blend\n        if (opt.entry_point <= step):\n            if (opt.stop_point <= step):\n                sys.exit()\n            \n            if not using_padded_tiles:\n                print(\"No work to do at the blending step.\")\n            else:\n                subdirs = create_subdirs_symlink(opt, args, settings)\n                spawn_to_nodes(step, opt, settings, parallel_args, subdirs)\n\n                if not skip_refine_step:\n                    # Do the same trick as after stereo_corr\n                    rename_files(settings, subdirs, \"-B.tif\", \"-Bnosym.tif\")\n                    build_vrt('stereo_blend', opt, args, settings, georef, \n                              \"-B.tif\", \"-Bnosym.tif\", \n                              contract_tiles = False)\n                    create_subdirs_symlink(opt, args, settings) # symlink B.tif\n\n            # At the blending step, make a vrt from the per-tile lr-disp differences.\n            if settings['save_lr_disp_diff'][0] != '0':\n                if using_padded_tiles:\n                    build_vrt('stereo_blend', opt, args, settings, georef,\n                            \"-L-R-disp-diff.tif\", \"-L-R-disp-diff-blend.tif\")\n                else:\n                    build_vrt('stereo_blend', opt, args, settings, georef,\n                            \"-L-R-disp-diff.tif\", \"-L-R-disp-diff.tif\")\n\n        # Refinement\n        step = Step.rfne\n        if (opt.entry_point <= step):\n            if (opt.stop_point <= step):\n                sys.exit()\n            # If we used SGM/MGM or some other method making use of\n            # tiles, need to read from the blend file.\n            if using_padded_tiles:\n                parallel_args.extend(['--subpix-from-blend'])\n            if not skip_refine_step:\n                subdirs = create_subdirs_symlink(opt, args, settings)\n                spawn_to_nodes(step, opt, settings, parallel_args, subdirs)\n\n            try:\n                build_vrt('stereo_rfne', opt, args, settings, georef, \"-RD.tif\", \"-RD.tif\")\n            except Exception as e:\n                # Make the error message more informative\n                raise Exception('Failed to build a VRT from */*RD.tif files. Must redo at least the refinement step. Additional error message: ' + str(e))\n                \n        # Filtering\n        step = Step.fltr\n        if (opt.entry_point <= step):\n            if (opt.stop_point <= step):\n                sys.exit()\n                \n            normal_run('stereo_fltr', opt, args, out_prefix, msg='%d: Filtering' % step)\n            create_subdirs_symlink(opt, args, settings) # symlink F.tif\n\n        # Triangulation\n        # TODO(oalexan1): For stereo we do not need to pad the tiles, which should\n        # be a nice speed up. But then must ensure both the padded and non-padded\n        # tiles are wiped after the run is done.\n        step = Step.tri\n        subdirs = []\n        if (opt.entry_point <= step):\n            if (opt.stop_point <= step):\n                sys.exit()\n\n            # TODO(oalexan1): Must wipe the subdirs in all cases.\n            if int(settings['correlator_mode'][0]) != 0 and \\\n                '--num-matches-from-disparity' not in parallel_args and \\\n                '--num-matches-from-disp-triplets' not in parallel_args:\n                # Skip triangulation, but continue further down with cleanup.\n                print(\"Skipping triangulation with --correlator-mode.\")\n            else:\n                # Compute the cloud center. Done once per run.\n                tmp_args = args[:] # deep copy\n                tmp_args.append('--compute-point-cloud-center-only')\n                normal_run('stereo_tri', opt, tmp_args, out_prefix, \n                           msg='%d: Triangulation' % step)\n                # Point cloud center computation was done\n                parallel_args.extend(['--skip-point-cloud-center-comp'])\n\n                # Wipe options that should have been done when the\n                # the center of point cloud was computed\n                asp_cmd_utils.wipe_option(parallel_args, '--unalign-disparity', 0)\n                asp_cmd_utils.wipe_option(parallel_args, '--num-matches-from-disparity', 1)\n                asp_cmd_utils.wipe_option(parallel_args, '--num-matches-from-disp-triplets', 1)\n                \n                # Create subdirs and symlink the files just created\n                subdirs = create_subdirs_symlink(opt, args, settings)\n                # Run triangulation on multiple machines\n                spawn_to_nodes(step, opt, settings, parallel_args, subdirs)\n                if int(settings['correlator_mode'][0]) == 0:\n                  build_vrt('stereo_tri', opt, args, settings, georef, \"-PC.tif\", \"-PC.tif\")\n\n        # If the run concluded successfully, merge and wipe\n        step = Step.clean\n        subdirs = []\n        if (opt.entry_point <= step):\n            if (opt.stop_point <= step):\n                sys.exit()\n        if (opt.stop_point > Step.clean):\n          if len(subdirs) == 0:\n            # If this was not created by now, do it now\n            subdirs = create_subdirs_symlink(opt, args, settings)\n          keepOnlySpecified(opt.keep_only, out_prefix, subdirs, settings)\n                \n       # End main process case\n    else:\n\n        # This process was spawned by GNU Parallel with a given\n        # value of opt.tile_id. Launch the job for that tile.\n        if opt.verbose:\n            print(\"Running on machine: \", os.uname())\n\n        try:\n            # Pick the tile we want from the list of tiles\n            tiles = readTiles(out_prefix)\n            tile  = tiles[opt.tile_id]\n            prog_name = stereoProgName(opt.entry_point)\n\n            if (opt.entry_point == Step.corr):\n                check_system_memory(opt, args, settings)\n                tile_run(prog_name, args, opt, settings, tile,\n                         msg='%d: Correlation' % opt.entry_point)\n\n            if (opt.entry_point == Step.blend):\n                tile_run(prog_name, args, opt, settings, tile,\n                         msg='%d: Blending' % opt.entry_point)\n\n            if (opt.entry_point == Step.rfne):\n                tile_run(prog_name, args, opt, settings, tile,\n                         msg='%d: Refinement' % opt.entry_point)\n\n            if (opt.entry_point == Step.tri):\n                tile_run(prog_name, args, opt, settings, tile,\n                         msg='%d: Triangulation' % opt.entry_point)\n\n        except Exception as e:\n            raise_error(e)\n            raise\n"
  },
  {
    "path": "src/asp/Tools/parse_match_file.py",
    "content": "#!/usr/bin/env python\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n# Thanks to Amaury Dehecq for contributing this tool.\n# Bugfix by PicoJr.\n\nimport argparse, os, struct\nimport numpy as np\n\ndef read_ip_record(mf):\n    \"\"\"\n    Read one IP record from the binary match file. Information contained are x,\n    y, xi, yi, orientation, scale, interest, polarity, octave, scale_lvl, desc.\n     \n    Inputs: mf, file handle to the in put binary file (in 'rb' mode) \n    Outputs: iprec, array containing the IP record\n    \"\"\"\n    x, y = np.frombuffer(mf.read(8), dtype=np.float32)\n    xi, yi = np.frombuffer(mf.read(8), dtype=np.int32)\n    orientation, scale, interest = np.frombuffer(mf.read(12), dtype=np.float32)\n    polarity, = np.frombuffer(mf.read(1), dtype=np.int8)  # or np.bool?\n    octave, scale_lvl = np.frombuffer(mf.read(8), dtype=np.uint32)\n    ndesc, = np.frombuffer(mf.read(8), dtype=np.uint64)\n    desc = np.frombuffer(mf.read(int(ndesc * 4)), dtype=np.float32)\n    iprec = [x, y, xi, yi, orientation, scale, interest, polarity, octave, scale_lvl, ndesc]\n    iprec.extend(desc)\n    return iprec\n\ndef write_ip_record(out, iprec):\n    \"\"\"\n    The reverse operation of read_ip_record.\n    Inputs:\n    - out: file handle to the output binary file (in 'wb' mode)\n    - iprec: 1D array containing one IP record\n    \"\"\"\n    out.write(struct.pack('f',iprec[0]))  # x, y\n    out.write(struct.pack('f',iprec[1]))  \n    out.write(struct.pack('i',iprec[2]))  # xi, yi\n    out.write(struct.pack('i',iprec[3]))\n    out.write(struct.pack('f',iprec[4]))  # orientation, scale, interest\n    out.write(struct.pack('f',iprec[5]))\n    out.write(struct.pack('f',iprec[6]))\n    out.write(struct.pack('?',iprec[7]))  # polarity  # use fmt ? instead?\n    out.write(struct.pack('I',iprec[8]))  # octave, scale_lvl\n    out.write(struct.pack('I',iprec[9]))\n\n    ndesc = iprec[10]\n\n    # If the descriptors were not read, their true number\n    # is less than specified.\n    ndesc = len(iprec) - 11\n    \n    out.write(struct.pack('Q', ndesc))  # ndesc\n    \n    for k in range(ndesc):\n        out.write(struct.pack('f',iprec[11+k]))  # desc\n    return\n\ndef read_match_file(match_file):\n    \"\"\"\n    Read a full binary match file. The first two 8-bit fields contain the number\n    of IPs in each image. Next are the records for each IP, first for image1 and\n    then for image2.\n    \n    Input: match_file: str, path to the match file.\n    Outputs: two arrays, containing the IP records for image1 and image2.\n    \"\"\"\n\n    # Open binary file in read mode\n    print(\"Reading: \" + match_file)\n    mf = open(match_file,'rb')\n\n    # Read record length\n    size1 = np.frombuffer(mf.read(8), dtype=np.uint64)[0]\n    size2 = np.frombuffer(mf.read(8), dtype=np.uint64)[0]\n\n    # Read record for each image\n    im1_ip = [read_ip_record(mf) for i in range(size1)]\n    im2_ip = [read_ip_record(mf) for i in range(size2)]\n\n    # Close file\n    mf.close()\n    \n    return im1_ip, im2_ip\n\ndef write_match_file(outfile, im1_ip, im2_ip):\n    \"\"\"\n    Write the full binary match file. \n    Inputs:\n    - outfile: str, path to the output match file\n    - im1_ip: array containing all the records for image1\n    - im2_ip: array containing all the records for image2\n    \"\"\"\n\n    # Open binary file in write mode\n    print(\"Writing: \" + outfile)\n\n    try:\n        os.makedirs(os.path.dirname(outfile))\n    except OSError:\n        pass\n    \n    out = open(outfile, 'wb')\n\n    # Read records lengths\n    size1 = len(im1_ip)\n    size2 = len(im2_ip)\n\n    # Write record length\n    out.write(struct.pack('q',size1))\n    out.write(struct.pack('q',size2))\n\n    # Write records for both images\n    for k in range(size1):\n        write_ip_record(out, im1_ip[k])\n    for k in range(size2):\n        write_ip_record(out, im2_ip[k])\n    return\n        \nif __name__ == '__main__':\n\n    #Set up the arguments\n    parser = argparse.ArgumentParser(description = \\\n       'Convert an ASP binary match file to a text file. ' + \\\n       'Use the -rev option to do the reverse operation.')\n    \n    parser.add_argument('infile', type=str, \n      help='Path to the input file.')\n    parser.add_argument('outfile', type=str, \n      help='Path to the output file.')\n    parser.add_argument('-rev', '--reverse', dest='rev', \n      help='Convert a text file having matches into an ASP binary match file.',\n      action='store_true')\n    parser.add_argument('--save-descriptors', dest='save_descriptors', \n      help='When converting a binary match file to text, save the ' +\n           'interest point descriptors as well.',\n      action='store_true')\n    args = parser.parse_args()\n\n    if args.rev==False:\n\n        # Read match file\n        im1_ip, im2_ip = read_match_file(args.infile)\n\n        # Save to text file\n        print(\"Writing: \" + args.outfile)\n\n        try:\n            os.makedirs(os.path.dirname(args.outfile))\n        except OSError:\n            pass\n        \n        with open(args.outfile, 'w') as out:\n\n            # Write number of records\n            out.write('%i %i\\n' %(len(im1_ip), len(im2_ip)))\n\n            # Write IPs for image1\n            for i in range(len(im1_ip)):\n                iprec = im1_ip[i]\n                \n                if args.save_descriptors:\n                    # Save the full record, including descriptors\n                    iprec_to_write = iprec\n                else:\n                    # Keep only the first 11 fields, and set ndesc (at index 10) to 0.\n                    iprec_to_write = iprec[:11]\n                    iprec_to_write[10] = 0\n                \n                iprec_str = [str(a) for a in iprec_to_write]\n                out.write(' '.join(iprec_str) + '\\n')\n\n            # Write IPs for image2\n            for i in range(len(im2_ip)):\n                iprec = im2_ip[i]\n\n                if args.save_descriptors:\n                    # Save the full record, including descriptors\n                    iprec_to_write = iprec\n                else:\n                    # Keep only the first 11 fields, and set ndesc (at index 10) to 0.\n                    iprec_to_write = iprec[:11]\n                    iprec_to_write[10] = 0\n\n                iprec_str = [str(a) for a in iprec_to_write]\n                out.write(' '.join(iprec_str) + '\\n')\n\n    else:\n\n        # Read number of records\n        f = open(args.infile,'r')\n        print(\"Reading: \" + args.infile)\n        out = f.readline()\n        size1, size2 = np.uint64(out.strip().split(' '))\n        f.close()\n\n        # Read each image IPs records. Note how we don't bother to read the\n        # descriptors, which are a handful of values on each row beyond the\n        # specified fields.\n        try:\n            im1_ipb = np.genfromtxt(args.infile,skip_header=1,dtype='float32, float32, int32, int32, float32, float32, float32, int8, uint32, uint32, uint64', max_rows=size1)\n            im1_ipb = im1_ipb.reshape((size1,))\n            im2_ipb = np.genfromtxt(args.infile,skip_header=1+int(size1),dtype='float32, float32, int32, int32, float32, float32, float32, int8, uint32, uint32, uint64', max_rows=size2)\n            im2_ipb = im2_ipb.reshape((size2,))\n        except Exception as e:\n            print(\"Your numpy version (\" + str(np.__version__) + \") may be too old. \" +\n                  \"Got the error: \" + str(e))\n\n        # Save to output file\n        write_match_file(args.outfile, im1_ipb, im2_ipb)\n"
  },
  {
    "path": "src/asp/Tools/pc_align.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// This tool uses libpointmatcher for alignment.\n// https://github.com/ethz-asl/libpointmatcher\n// Released under the BSD 3-Clause.\n\n#include <asp/Core/AspProgramOptions.h>\n#include <asp/Core/AspLog.h>\n#include <asp/Core/Macros.h>\n#include <asp/Core/PointUtils.h>\n#include <asp/Core/PdalUtils.h>\n#include <asp/Core/InterestPointMatching.h>\n#include <asp/Core/EigenUtils.h>\n#include <asp/PcAlign/pc_align_utils.h>\n#include <asp/PcAlign/pc_align_ceres.h>\n#include <asp/PcAlign/pc_align_fgr.h>\n#include <asp/PcAlign/NuthAlignment.h>\n\n#include <vw/Core/Stopwatch.h>\n#include <vw/Math/EulerAngles.h>\n#include <vw/FileIO/DiskImageView.h>\n#include <vw/Cartography/Datum.h>\n#include <vw/Cartography/GeoReference.h>\n#include <vw/Cartography/PointImageManipulation.h>\n#include <vw/FileIO/DiskImageUtils.h>\n#include <vw/Core/CmdUtils.h>\n#include <vw/Math/Geometry.h>\n#include <vw/Math/Functors.h>\n#include <vw/InterestPoint/MatcherIO.h>\n#include <vw/FileIO/FileUtils.h>\n\n#include <limits>\n#include <cstring>\n#include <thread>\n#include <omp.h>\n\n#include <boost/filesystem.hpp>\n#include <boost/algorithm/string.hpp>\nnamespace fs = boost::filesystem;\nnamespace po = boost::program_options;\n\nusing namespace vw;\nusing namespace vw::cartography;\nusing namespace asp;\n\nconst double BIG_NUMBER = 1e+300; // libpointmatcher does not like here the largest double\n\n/// Options container for the pc_align tool\nstruct Options: public vw::GdalWriteOptions {\n  // Input\n  std::string reference, source, init_transform_file, alignment_method,\n    datum, csv_format_str, csv_srs, match_file, hillshade_command, hillshade_options,\n    ipfind_options, ipmatch_options, nuth_options, fgr_options, csv_proj4_str;\n  Vector2 initial_transform_ransac_params;\n  Eigen::MatrixXd init_transform;\n  int    num_iter,\n         max_num_reference_points,\n         max_num_source_points;\n  double diff_translation_err, diff_rotation_err,\n         max_disp, outlier_ratio, semi_major_axis,\n         semi_minor_axis, initial_rotation_angle;\n  bool   compute_translation_only, dont_use_dem_distances,\n         save_trans_source, save_trans_ref,\n         highest_accuracy, verbose, skip_shared_box_estimation;\n  std::string initial_ned_translation, hillshading_transform;\n  vw::BBox2 ref_copc_win, src_copc_win;\n  bool ref_copc_read_all, src_copc_read_all;\n\n  // Output\n  std::string out_prefix;\n\n  Options() : max_disp(-1.0), verbose(true) {}\n\n  /// Return true if the reference file is a DEM file and this option is not disabled\n  bool use_dem_distances() const {\n    return (asp::get_cloud_type(this->reference) == \"DEM\") && !dont_use_dem_distances;\n  }\n\n};\n\nvoid handle_arguments(int argc, char *argv[], Options& opt) {\n  po::options_description general_options(\"\");\n  general_options.add_options()\n    (\"initial-transform\", po::value(&opt.init_transform_file)->default_value(\"\"),\n      \"The file containing the transform to be used as an initial guess. It can come from a previous run of the tool.\")\n    (\"num-iterations\", po::value(&opt.num_iter)->default_value(1000),\n      \"Maximum number of iterations.\")\n    (\"diff-rotation-error\", po::value(&opt.diff_rotation_err)->default_value(1e-5),\n      \"Change in rotation amount below which the algorithm will stop (if translation \"\n      \"error is also below bound), in degrees. A small value can result in numerical \"\n      \"precision issues and many iterations.\")\n    (\"diff-translation-error\",   po::value(&opt.diff_translation_err)->default_value(1e-3),\n      \"Change in translation amount below which the algorithm will stop (if rotation error is also below bound), in meters.\")\n    (\"max-displacement\", po::value(&opt.max_disp)->default_value(0.0),\n      \"Maximum expected displacement of source points as result of alignment, in meters (after the initial guess transform is applied to the source points). Used for removing gross outliers in the source point cloud.\")\n    (\"outlier-ratio\", po::value(&opt.outlier_ratio)->default_value(0.75),\n      \"Fraction of source (movable) points considered inliers (after gross outliers further than max-displacement from reference points are removed).\")\n    (\"max-num-reference-points\",\n     po::value(&opt.max_num_reference_points)->default_value(100000000),\n     \"Maximum number of (randomly picked) reference points to use.\")\n    (\"max-num-source-points\", po::value(&opt.max_num_source_points)->default_value(100000),\n      \"Maximum number of (randomly picked) source points to use (after discarding gross outliers).\")\n    (\"alignment-method\", po::value(&opt.alignment_method)->default_value(\"point-to-plane\"),\n     \"Alignment method. Options: point-to-plane, point-to-point, \"\n     \"similarity-point-to-plane, similarity-point-to-point, nuth, fgr, least-squares, \"\n     \"similarity-least-squares.\")\n    (\"highest-accuracy\",\n     po::bool_switch(&opt.highest_accuracy)->default_value(false)->implicit_value(true),\n     \"Compute with highest accuracy for point-to-plane (can be much slower).\")\n    (\"csv-format\", po::value(&opt.csv_format_str)->default_value(\"\"),\n     asp::csv_opt_caption().c_str())\n    (\"csv-srs\", po::value(&opt.csv_srs)->default_value(\"\"),\n     \"The PROJ or WKT string to use to interpret the entries in input CSV files.\")\n    (\"datum\", po::value(&opt.datum)->default_value(\"\"),\n     \"Use this datum for CSV files instead of auto-detecting it. Options: WGS_1984, D_MOON (1,737,400 meters), D_MARS (3,396,190 meters), MOLA (3,396,000 meters), NAD83, WGS72, and NAD27. Also accepted: Earth (=WGS_1984), Mars (=D_MARS), Moon (=D_MOON).\")\n    (\"semi-major-axis\", po::value(&opt.semi_major_axis)->default_value(0),\n     \"Explicitly set the datum semi-major axis in meters.\")\n    (\"semi-minor-axis\", po::value(&opt.semi_minor_axis)->default_value(0),\n     \"Explicitly set the datum semi-minor axis in meters.\")\n    (\"output-prefix,o\", po::value(&opt.out_prefix)->default_value(\"\"),\n     \"Specify the output prefix.\")\n    (\"compute-translation-only\",\n     po::bool_switch(&opt.compute_translation_only)->default_value(false)->implicit_value(true),\n     \"Compute the transform from source to reference point cloud as a translation only (no rotation).\")\n    (\"save-transformed-source-points\",\n     po::bool_switch(&opt.save_trans_source)->default_value(false)->implicit_value(true),\n      \"Apply the obtained transform to the source points so they match the reference points and save them.\")\n    (\"save-inv-transformed-reference-points\", po::bool_switch(&opt.save_trans_ref)->default_value(false)->implicit_value(true),\n     \"Apply the inverse of the obtained transform to the reference points so they match the source points and save them.\")\n    (\"initial-ned-translation\", po::value(&opt.initial_ned_translation)->default_value(\"\"),\n     \"Initialize the alignment transform based on a translation with this vector in the North-East-Down coordinate system around the centroid of the reference points. Specify it in quotes, separated by spaces or commas.\")\n    (\"initial-rotation-angle\", po::value(&opt.initial_rotation_angle)->default_value(0),\n     \"Initialize the alignment transform as the rotation with this angle (in degrees) around the axis going from the planet center to the centroid of the point cloud. If --initial-ned-translation is also specified, the translation gets applied after the rotation.\")\n    (\"initial-transform-from-hillshading\", po::value(&opt.hillshading_transform)->default_value(\"\"),\n     \"If both input clouds are DEMs, find interest point matches among their hillshaded \"\n     \"versions, and use them to compute an initial transform to apply to the source cloud \"\n     \"before proceeding with alignment. Specify here the type of transform, as one of: \"\n     \"'similarity' (rotation + translation + scale), 'rigid' (rotation + translation) or \"\n     \"'translation'. See the options further down for tuning this.\")\n    (\"hillshade-command\", po::value(&opt.hillshade_command)->default_value(\"\"),\n     \"The hillshade command and options to use when computing the transform from \"\n     \"hillshading. The default is: gdaldem hillshade -multidirectional -compute_edges -co TILED=yes -co BLOCKXSIZE=256 -co BLOCKYSIZE=256. An alternative is: \"\n     \"hillshade --azimuth 300 --elevation 20 --align-to-georef.\")\n    (\"hillshade-options\", po::value(&opt.hillshade_options)->default_value(\"\"),\n     \"Options to pass to the hillshade program when computing the transform from \"\n     \"hillshading. This is for backward compatibility. Use instead the --hillshade-command \"\n     \"option.\")\n    (\"ipfind-options\", po::value(&opt.ipfind_options)->default_value(\"--ip-per-image 1000000 --interest-operator sift --descriptor-generator sift\"), \"Options to pass to the ipfind program when computing the transform from hillshading.\")\n    (\"ipmatch-options\", po::value(&opt.ipmatch_options)->default_value(\"--inlier-threshold 100 --ransac-iterations 10000 --ransac-constraint similarity\"), \"Options to pass to the ipmatch program when computing the transform from hillshading.\")\n    (\"match-file\", po::value(&opt.match_file)->default_value(\"\"), \"Compute a translation + rotation + scale transform from the source to the reference point cloud using manually selected point correspondences from the reference to the source (obtained for example using stereo_gui). It may be desired to change --initial-transform-ransac-params if it rejects as outliers some manual matches.\")\n    (\"initial-transform-ransac-params\", po::value(&opt.initial_transform_ransac_params)->default_value(Vector2(10000, 1.0), \"num_iter factor\"),\n     \"When computing an initial transform based on hillshading, use \"\n     \"this number of RANSAC iterations and outlier factor. A smaller factor \"\n     \"will reject more outliers.\")\n    (\"nuth-options\", po::value(&opt.nuth_options)->default_value(\"\"),\n     \"Options to pass to the Nuth and Kaab algorithm.\")\n    (\"fgr-options\", po::value(&opt.fgr_options)->default_value(\"div_factor: 1.4 use_absolute_scale: 0 max_corr_dist: 0.025 iteration_number: 100 tuple_scale: 0.95 tuple_max_cnt: 10000\"),\n     \"Options to pass to the Fast Global Registration algorithm.\")\n    (\"no-dem-distances\", po::bool_switch(&opt.dont_use_dem_distances)->default_value(false)->implicit_value(true),\n     \"For reference point clouds that are DEMs, don't take advantage of the fact that it is possible to interpolate into this DEM when finding the closest distance to it from a point in the source cloud and hence the error metrics.\")\n    (\"skip-shared-box-estimation\", po::bool_switch(&opt.skip_shared_box_estimation)->default_value(false)->implicit_value(true),\n     \"Do not estimate the shared bounding box of the two clouds. This estimation \"\n     \"can be costly for large clouds but helps with eliminating outliers.\")\n    (\"ref-copc-win\", po::value(&opt.ref_copc_win)->default_value(vw::BBox2()),\n     \"Specify the region to read from the reference cloud, if it is a COPC LAZ file. The \"\n     \"units are based the projection in the file. This is required unless --ref-copc-read- \"\n     \"all is set. Specify as minx miny maxx maxy, or minx maxy maxx miny, with no quotes.\")\n    (\"src-copc-win\", po::value(&opt.src_copc_win)->default_value(vw::BBox2()),\n     \"Specify the region to read from the source cloud, if it is a COPC LAZ file. The \"\n     \"units are based the projection in the file. This is required unless \"\n     \"--src-copc-read-all all is set. Specify as minx miny maxx maxy, \"\n     \"or minx maxy maxx miny, with no quotes. If not set, the --ref-copc-win option will \"\n     \"be used, or otherwise it will be estimated based on the extent of reference points \"\n     \"and the --max-displacement option.\")\n    (\"ref-copc-read-all\", po::bool_switch(&opt.ref_copc_read_all)->default_value(false),\n     \"Read the full reference COPC file, ignoring the --ref-copc-win option.\")\n    (\"src-copc-read-all\", po::bool_switch(&opt.src_copc_read_all)->default_value(false),\n     \"Read the full source COPC file, ignoring the --src-copc-win option.\")\n    (\"csv-proj4\", po::value(&opt.csv_proj4_str)->default_value(\"\"),\n     \"An alias for --csv-srs, for backward compatibility.\");\n\n  general_options.add(vw::GdalWriteOptionsDescription(opt));\n\n  po::options_description positional(\"\");\n  positional.add_options()\n    (\"reference\", po::value(&opt.reference), \"The reference (fixed) point cloud/DEM.\")\n    (\"source\",    po::value(&opt.source),    \"The source (movable) point cloud/DEM.\");\n\n  po::positional_options_description positional_desc;\n  positional_desc.add(\"reference\", 1);\n  positional_desc.add(\"source\",    1);\n\n  std::string usage(\"--max-displacement arg [other options] <reference cloud> <source cloud> \"\n               \"-o <output prefix>\");\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line(argc, argv, opt, general_options, general_options,\n                            positional, positional_desc, usage,\n                            allow_unregistered, unregistered);\n\n  // If the user specifies no options at all, print the help message.\n  // Otherwise, print the specific error.\n  if (opt.reference.empty() && opt.source.empty() && opt.out_prefix.empty())\n    vw_throw(ArgumentErr() << \"No input arguments provided.\\n\"\n             << usage << general_options);\n\n  if (opt.reference.empty() || opt.source.empty())\n    vw_throw(ArgumentErr() << \"Missing input files.\\n\");\n\n  if (opt.out_prefix.empty())\n    vw_throw(ArgumentErr() << \"Missing output prefix.\\n\");\n\n  if (opt.max_disp == 0.0)\n    vw_throw(ArgumentErr() << \"The max-displacement option was not set. \"\n              << \"Use -1 if it is desired not to use it.\\n\");\n\n  if (opt.num_iter < 0)\n    vw_throw(ArgumentErr() << \"The number of iterations must be non-negative.\\n\");\n\n  if ((opt.semi_major_axis != 0 && opt.semi_minor_axis == 0) ||\n       (opt.semi_minor_axis != 0 && opt.semi_major_axis == 0)) {\n\n    vw_throw(ArgumentErr() << \"One of the semi-major or semi-minor axes\"\n              << \" was specified, but not the other one.\\n\");\n  }\n\n  if (opt.semi_major_axis < 0 || opt.semi_minor_axis < 0) {\n    vw_throw(ArgumentErr() << \"The semi-major and semi-minor axes cannot \"\n                            << \"be negative.\\n\");\n  }\n\n  if (opt.datum != \"\" && opt.semi_major_axis != 0 && opt.semi_minor_axis != 0) {\n    vw_throw(ArgumentErr() << \"Both the datum string and datum semi-axes were \"\n                            << \"specified. At most one needs to be set.\\n\");\n  }\n\n  if ((opt.initial_ned_translation != \"\" || opt.initial_rotation_angle != 0)\n      && opt.init_transform_file != \"\")\n    vw_throw(ArgumentErr()\n              << \"Cannot specify an initial transform both from a file \"\n              << \"and as a NED vector or rotation angle.\\n\");\n\n  if ((opt.hillshading_transform != \"\" || opt.match_file != \"\") &&\n       (opt.initial_ned_translation != \"\" || opt.init_transform_file != \"\" ||\n        opt.initial_rotation_angle != 0)) {\n    vw_throw(ArgumentErr() << \"Cannot both specify an initial transform \"\n              << \"and expect one to be computed automatically.\\n\");\n  }\n\n  // Must specify either csv_srs or csv_proj4_str, but not both. The latter is \n  // for backward compatibility.\n  if (!opt.csv_srs.empty() && !opt.csv_proj4_str.empty())\n    vw_throw(ArgumentErr() << \"Cannot specify both --csv-srs and --csv-proj4.\\n\");\n  if (!opt.csv_proj4_str.empty() && opt.csv_srs.empty())\n    opt.csv_srs = opt.csv_proj4_str;\n\n  // Create the output directory\n  vw::create_out_dir(opt.out_prefix);\n\n  // Turn on logging to file\n  asp::log_to_file(argc, argv, \"\", opt.out_prefix);\n\n  // Read the initial transform\n  opt.init_transform = Eigen::MatrixXd::Identity(DIM + 1, DIM + 1);\n  if (opt.init_transform_file != \"\") {\n    asp::read_transform(opt.init_transform, opt.init_transform_file);\n    vw_out() << std::setprecision(16) << \"Initial guess transform:\\n\"\n             << opt.init_transform << \"\\n\";\n    vw_out() << std::setprecision(8); // undo the higher precision\n  }\n\n  if (opt.alignment_method != \"point-to-plane\"            &&\n      opt.alignment_method != \"point-to-point\"            &&\n      opt.alignment_method != \"similarity-point-to-point\" &&\n      opt.alignment_method != \"similarity-point-to-plane\" &&\n      opt.alignment_method != \"nuth\"                      &&\n      opt.alignment_method != \"fgr\"                       &&\n      opt.alignment_method != \"least-squares\"             &&\n      opt.alignment_method != \"similarity-least-squares\")\n    vw_throw(ArgumentErr() << \"Only the following alignment methods are supported: \"\n        << \"point-to-plane, point-to-point, similarity-point-to-point, \"\n      << \"similarity-point-to-plane, fgr, least-squares, and similarity-least-squares.\\n\");\n\n  if (opt.alignment_method != \"point-to-plane\"            &&\n      opt.alignment_method != \"point-to-point\"            &&\n      opt.alignment_method != \"similarity-point-to-point\" &&\n      opt.alignment_method != \"similarity-point-to-plane\" &&\n      opt.alignment_method != \"nuth\"                      &&\n      opt.compute_translation_only) {\n    vw_throw(ArgumentErr() << \"The option --compute-translation-only is only applicable \"\n             << \"to point-to-plane, point-to-point, similarity-point-to-point, \"\n             << \"similarity-point-to-plane, and nuth alignment.\\n\");\n  }\n\n  if ((opt.alignment_method == \"least-squares\" ||\n    opt.alignment_method == \"similarity-least-squares\")\n       && asp::get_cloud_type(opt.reference) != \"DEM\")\n    vw_throw(ArgumentErr()\n          << \"Least squares alignment can be used only when the \"\n          << \"reference cloud is a DEM.\\n\");\n\n  if (opt.alignment_method == \"nuth\") {\n\n    if (asp::get_cloud_type(opt.reference) != \"DEM\" ||\n        asp::get_cloud_type(opt.source)    != \"DEM\")\n      vw_throw(ArgumentErr()\n          << \"Nuth and Kaab alignment can be used only when both \"\n          << \"the reference and source clouds are DEMs.\\n\");\n\n    if (!opt.init_transform_file.empty() ||\n        !opt.initial_ned_translation.empty() ||\n        !opt.hillshading_transform.empty())\n      vw_throw(ArgumentErr()\n          << \"Nuth and Kaab alignment cannot be used with an initial transform.\\n\");\n\n    if (opt.dont_use_dem_distances)\n      vw_throw(ArgumentErr()\n          << \"Nuth and Kaab alignment requires using DEM distances for statistics.\\n\");\n\n    if (!opt.match_file.empty())\n      vw_throw(ArgumentErr()\n          << \"Nuth and Kaab alignment cannot be used with a match file.\\n\");\n\n    if (opt.initial_rotation_angle != 0)\n      vw_throw(ArgumentErr()\n          << \"Nuth and Kaab alignment cannot be used with an initial rotation angle.\\n\");\n\n     opt.max_num_reference_points /= 25;\n     opt.max_num_reference_points = std::max(1000000, opt.max_num_reference_points);\n     vw::vw_out() << \"For Nuth and Kaab alignment, a smaller reference cloud is \"\n        << \"sufficient. Reducing --max-num-reference-points by about 25x, to: \"\n        << opt.max_num_reference_points << \".\\n\";\n  }\n\n  int num_iter  = opt.initial_transform_ransac_params[0];\n  double factor = opt.initial_transform_ransac_params[1];\n  if (num_iter < 1 || factor <= 0.0)\n    vw_throw(ArgumentErr() << \"Invalid values were provided for \"\n              << \"--initial-transform-ransac-params.\\n\");\n\n  // Support for minx maxy maxx miny format.\n  if (opt.ref_copc_win != BBox2()) {\n    if (opt.ref_copc_win.min().y() > opt.ref_copc_win.max().y())\n      std::swap(opt.ref_copc_win.min().y(), opt.ref_copc_win.max().y());\n  }\n  if (opt.src_copc_win != BBox2()) {\n    if (opt.src_copc_win.min().y() > opt.src_copc_win.max().y())\n      std::swap(opt.src_copc_win.min().y(), opt.src_copc_win.max().y());\n  }\n\n  // Use ref_copc_win, if src_copc_win is not set\n  if (asp::isCopc(opt.source) &&\n      opt.src_copc_win == BBox2() &&\n      opt.ref_copc_win != BBox2()) {\n    vw::vw_out() << \"Using --ref-copc-win for --src-copc-win.\\n\";\n    opt.src_copc_win = opt.ref_copc_win;\n  }\n\n}\n\n/// Compute output statistics for pc_align\nvoid calc_stats(std::string label, Eigen::MatrixXd const& dists) {\n\n  VW_ASSERT(dists.rows() == 1,\n            LogicErr() << \"Expecting only one row.\");\n\n  std::vector<double> errs(dists.cols()*dists.rows());\n  int count = 0;\n  for (int col = 0; col < dists.cols(); col++) {\n    errs[count] = dists(0, col);\n    count++;\n  }\n  std::sort(errs.begin(), errs.end());\n\n  int len = errs.size();\n  vw_out() << \"Number of errors: \" << len << \"\\n\";\n  if (len == 0)\n    return;\n\n  // Find the median. This operation re-sorts the vector internally. This does a\n  // more careful job than the code below for even-length vectors. It looks\n  // safer, if redundant, to work on a copy of the vector.\n  std::vector<double> errs_copy = errs;\n  double median = vw::math::destructive_median(errs_copy);\n  \n  // Find nmad. As before, copy the vector to be safe.\n  errs_copy = errs;\n  double nmad = vw::math::destructive_nmad(errs_copy);\n  \n  double p16 = errs[std::min(len-1, (int)round(len*0.16))];\n  double p84 = errs[std::min(len-1, (int)round(len*0.84))];\n  vw_out() << label << \": error percentile of smallest errors (meters):\"\n           << \" 16%: \" << p16 << \", 50%: \" << median << \", 84%: \" << p84 << \"\\n\";\n\n  double a25 = calc_mean(errs,   len/4), a50  = calc_mean(errs, len/2);\n  double a75 = calc_mean(errs, 3*len/4), a100 = calc_mean(errs, len);\n  vw_out() << label << \": mean of smallest errors (meters):\"\n           << \" 25%: \"  << a25 << \", 50%: \"  << a50\n           << \", 75%: \" << a75 << \", 100%: \" << a100 << \"\\n\";\n\n  // Mean, StdDev, RMSE, median, nmad\n  vw_out() << label      << \" stats (meters): \"\n           << \"Mean: \"   << calc_mean(errs, len) << \", \"\n           << \"StdDev: \" << calc_stddev(errs) << \", \"\n           << \"RMSE: \"   << calc_rmse(errs) << \", \"\n           << \"Median: \" << median << \", \"\n           << \"NMAD: \"   << nmad << \"\\n\";\n}\n\n// Save a cloud to disk for debugging\nvoid debug_save_point_cloud(DP const& point_cloud, GeoReference const& geo,\n                            Vector3 const& shift,\n                            std::string const& output_file) {\n\n  int numPts = point_cloud.features.cols();\n\n  vw_out() << \"Writing: \" << numPts << \" to \" << output_file << \"\\n\";\n  std::ofstream outfile(output_file.c_str());\n  outfile.precision(18);\n\n  for (int col = 0; col < numPts; col++) {\n    Vector3 P = get_cloud_gcc_coord(point_cloud, shift, col);\n\n    Vector3 llh = geo.datum().cartesian_to_geodetic(P); // lon-lat-height\n    outfile << llh[1] << ',' << llh[0] << ',' << llh[2] << \"\\n\";\n  }\n  outfile.close();\n}\n\n/// Save the transform and its inverse.\nvoid write_transforms(Options const& opt,\n                     Eigen::MatrixXd const& T) {\n\n  std::string transFile = opt.out_prefix + \"-transform.txt\";\n  vw_out() << \"Writing: \" << transFile << \"\\n\";\n  write_transform(T, transFile);\n\n  std::string iTransFile = opt.out_prefix + \"-inverse-transform.txt\";\n  Eigen::MatrixXd invT = T.inverse();\n  vw_out() << \"Writing: \" << iTransFile << \"\\n\";\n  write_transform(invT, iTransFile);\n}\n\n/// Save the lon, lat, radius/height, and error. Use a format\n/// consistent with the input CSV format.\nvoid save_errors(DP const& point_cloud,\n                 Eigen::MatrixXd const& errors,\n                 std::string const& output_file,\n                 Vector3 const& shift,\n                 GeoReference const& geo,\n                 asp::CsvConv const& csv_conv,\n                 bool is_lola_rdr_format,\n                 double median_longitude) {\n\n  vw_out() << \"Writing: \" << output_file << \"\\n\";\n\n  VW_ASSERT(point_cloud.features.cols() == errors.cols(),\n            ArgumentErr() << \"Expecting as many errors as source points.\");\n\n  std::ofstream outfile(output_file.c_str());\n  outfile.precision(16);\n\n  // Write the header line\n  if (csv_conv.is_configured()) {\n    outfile << \"# \" << csv_conv.write_header_string(\",\") << \"error (meters)\" << \"\\n\";\n  } else {\n    if (is_lola_rdr_format)\n      outfile << \"# longitude,latitude,radius (km),error (meters)\" << \"\\n\";\n    else\n      outfile << \"# latitude,longitude,height above datum (meters),error (meters)\" << \"\\n\";\n  }\n\n  // Save the datum, may be useful to know what it was\n  if (geo.datum().name() != UNSPECIFIED_DATUM) {\n    outfile << \"# \" << geo.datum() << \"\\n\";\n    outfile << \"# Projection: \" << geo.get_wkt() << \"\\n\";\n  }\n\n  int numPts = point_cloud.features.cols();\n  for (int col = 0; col < numPts; col++) {\n    Vector3 P = get_cloud_gcc_coord(point_cloud, shift, col);\n\n    if (csv_conv.is_configured()) {\n      Vector3 csv = csv_conv.cartesian_to_csv(P, geo, median_longitude);\n      outfile << csv[0] << ',' << csv[1] << ',' << csv[2]\n              << \",\" << errors(0, col) << \"\\n\";\n    } else {\n      Vector3 llh = geo.datum().cartesian_to_geodetic(P); // lon-lat-height\n      llh[0] += 360.0*round((median_longitude - llh[0])/360.0); // 360 deg adjustment\n\n      if (is_lola_rdr_format)\n        outfile << llh[0] << ',' << llh[1] << ',' << norm_2(P)/1000.0\n                << \",\" << errors(0, col) << \"\\n\";\n      else\n        outfile << llh[1] << ',' << llh[0] << ',' << llh[2]\n                << \",\" << errors(0, col) << \"\\n\";\n    }\n  }\n  outfile.close();\n}\n\n/// Like PM::ICP::filterGrossOutliersAndCalcErrors, except comparing to a DEM instead.\n/// - The point cloud is in GCC coordinates with point_cloud_shift subtracted from each point.\n/// - The output is put in the \"errors\" vector for each point.\n/// - If there is a problem computing the point error, a very large number is used as a flag.\nvoid calcErrorsWithDem(DP                                 const& point_cloud,\n                       vw::Vector3                        const& point_cloud_shift,\n                       vw::cartography::GeoReference      const& georef,\n                       vw::ImageViewRef<PixelMask<float>> const& dem,\n                       std::vector<double>                     & errors) {\n\n  // Initialize output error storage\n  const std::int64_t num_pts = point_cloud.features.cols();\n  errors.resize(num_pts);\n\n  // Loop through every point in the point cloud\n  double dem_height_here;\n  for (std::int64_t i = 0; i < num_pts; i++) {\n    // Extract and un-shift the point to get the real GCC coordinate\n    Vector3 gcc_coord = get_cloud_gcc_coord(point_cloud, point_cloud_shift, i);\n\n    // Convert from GDC to GCC\n    Vector3 llh = georef.datum().cartesian_to_geodetic(gcc_coord); // lon-lat-height\n\n    // Interpolate the point at this location\n    if (!interp_dem_height(dem, georef, llh, dem_height_here)) {\n      // If we did not intersect the DEM, record a flag error value here.\n      errors[i] = BIG_NUMBER;\n    } else { // Success, the error is the absolute height difference\n      errors[i] = std::abs(llh[2] - dem_height_here);\n    }\n\n  } // End loop through all points\n\n}\n\n// Updates an LPM error matrix to use the DEM-based error for each point if it is lower.\n// Note: The LPM matrix type used to store errors only ever has a single row.\nvoid update_best_error(std::vector<double>         const& dem_errors,\n                       Eigen::MatrixXd      & lpm_errors) {\n  std::int64_t num_points = lpm_errors.cols();\n  if (dem_errors.size() != static_cast<std::size_t>(num_points))\n    vw_throw(LogicErr() << \"Error: error size does not match point count size!\\n\");\n\n  // Loop through points\n  for (std::int64_t col = 0; col < num_points; col++) {\n    // Use the DEM error if it is less\n    if (dem_errors[col] < lpm_errors(0,col)) {\n      lpm_errors(0, col) = dem_errors[col];\n    }\n  }\n\n}\n\n/// Compute the distance from source_point_cloud to the reference points.\ndouble compute_registration_error(DP          const& ref_point_cloud,\n                                  DP               & source_point_cloud, // Should not be modified\n                                  PM::ICP          & pm_icp_object,\n                                  vw::Vector3 const& shift,\n                                  vw::cartography::GeoReference        const& dem_georef,\n                                  vw::ImageViewRef< PixelMask<float> > const& dem_ref,\n                                  Options const& opt,\n                                  Eigen::MatrixXd &error_matrix) {\n  Stopwatch sw;\n  sw.start();\n\n  // Always start by computing the error using LPM\n  // Use a big number to make sure no points are filtered!\n  pm_icp_object.filterGrossOutliersAndCalcErrors(ref_point_cloud, BIG_NUMBER,\n                                                 source_point_cloud, error_matrix);\n\n  if (opt.use_dem_distances()) {\n    // Compute the distance from each point to the DEM\n    std::vector<double> dem_errors;\n    calcErrorsWithDem(source_point_cloud, shift, dem_georef, dem_ref, dem_errors);\n\n    // For each point use the lower of the two calculated errors.\n    update_best_error(dem_errors, error_matrix);\n\n    // We compute the error in two passes for two reasons:\n    // 1 - Get the most accurate distance for each point in all cases.\n    // 2 - Help fill in distances where the DEM has holes.\n  }\n\n  sw.stop();\n  return sw.elapsed_seconds();\n}\n\n/// Points in source_point_cloud farther than opt.max_disp from the reference cloud are deleted.\nvoid filter_source_cloud(DP          const& ref_point_cloud,\n                         DP               & source_point_cloud,\n                         PM::ICP          & pm_icp_object, // Must already be initialized\n                         vw::Vector3 const& shift,\n                         vw::cartography::GeoReference        const& dem_georef,\n                         vw::ImageViewRef< PixelMask<float> > const& dem_ref,\n                         Options const& opt) {\n\n  // Filter gross outliers\n  Stopwatch sw;\n  sw.start();\n\n  if (opt.verbose)\n    vw_out() << \"Filtering gross outliers\" << \"\\n\";\n\n  Eigen::MatrixXd error_matrix;\n  try {\n    if (opt.use_dem_distances()) {\n      // Compute the registration error using the best available means\n      compute_registration_error(ref_point_cloud, source_point_cloud, pm_icp_object, shift,\n                                 dem_georef, dem_ref, opt, error_matrix);\n\n      filterPointsByError(source_point_cloud, error_matrix, opt.max_disp);\n    } else { // LPM only method\n        // Points in source_point_cloud further than opt.max_disp from ref_point_cloud are deleted!\n        pm_icp_object.filterGrossOutliersAndCalcErrors(ref_point_cloud, opt.max_disp,\n                                                       source_point_cloud, error_matrix);\n    }\n  } catch(const PointMatcher<double>::ConvergenceError & e) {\n    vw_throw(ArgumentErr() << \"Error: No points left in source cloud after filtering. Consider increasing --max-displacement and/or see the documentation.\\n\");\n  }\n\n\n  sw.stop();\n  if (opt.verbose)\n    vw_out() << \"Filtering gross outliers took \" << sw.elapsed_seconds() << \" s\\n\";\n}\n\nEigen::Matrix3d vw_matrix3_to_eigen(vw::Matrix3x3 const& vw_matrix) {\n  Eigen::Matrix3d out;\n  out(0,0) = vw_matrix(0,0);\n  out(0,1) = vw_matrix(0,1);\n  out(0,2) = vw_matrix(0,2);\n  out(1,0) = vw_matrix(1,0);\n  out(1,1) = vw_matrix(1,1);\n  out(1,2) = vw_matrix(1,2);\n  out(2,0) = vw_matrix(2,0);\n  out(2,1) = vw_matrix(2,1);\n  out(2,2) = vw_matrix(2,2);\n  return out;\n}\n\nEigen::Vector3d vw_vector3_to_eigen(vw::Vector3 const& vw_vector) {\n  return Eigen::Vector3d(vw_vector[0], vw_vector[1], vw_vector[2]);\n}\n\n// Need this to placate libpointmatcher.\nstd::string alignment_method_fallback(std::string const& alignment_method) {\n  if (alignment_method == \"least-squares\" || alignment_method == \"similarity-least-squares\" ||\n      alignment_method == \"fgr\" || alignment_method == \"nuth\")\n    return \"point-to-plane\";\n  return alignment_method;\n}\n\n// Hillshade the reference and source DEMs, and use them to find\n// interest point matches among the hillshaded images.  These will be\n// used later to find a rotation + translation + scale transform.\nstd::string find_matches_from_hillshading(Options & opt, std::string const& curr_exec_path) {\n\n  // First, this works only for DEMs\n  if (asp::get_cloud_type(opt.reference) != \"DEM\" ||\n      asp::get_cloud_type(opt.source) != \"DEM\")\n    vw_throw(ArgumentErr() << \"Cannot find an initial transform using hillshading \"\n              << \"unless both point clouds are DEMs. Use point2dem to first create \"\n              << \"DEMs from the input point clouds. Then this transform can be used \"\n              << \"with the original clouds.\\n\");\n\n  // Cannot have both opt.hillshade_command and opt.hillshade_options set\n  if (!opt.hillshade_command.empty() && !opt.hillshade_options.empty())\n    vw::vw_throw(vw::ArgumentErr() << \"Cannot have both --hillshade-command and \"\n              << \"--hillshade-options set.\\n\");\n\n  // This is to ensure backward compatibility\n  if (opt.hillshade_options.empty()) {\n    if (opt.hillshade_command.empty())\n       opt.hillshade_command = \"gdaldem hillshade -multidirectional -compute_edges \"\n                                \"-co TILED=yes -co BLOCKXSIZE=256 -co BLOCKYSIZE=256\";\n  } else {\n    std::string hillshade_path = vw::program_path(\"hillshade\", curr_exec_path);\n    opt.hillshade_command = hillshade_path + \" \" + opt.hillshade_options;\n  }\n\n  // ASP hillshade needs the \"-o\" switch.\n  std::string extra = \" \";\n  if (opt.hillshade_command.find(\"gdaldem\") == std::string::npos)\n    extra = \" -o \";\n\n  // Find the needed executables\n  std::string ipfind_path  = vw::program_path(\"ipfind\",    curr_exec_path);\n  std::string ipmatch_path = vw::program_path(\"ipmatch\",   curr_exec_path);\n\n  // Hillshade the reference\n  std::string ref_hillshade = opt.out_prefix + \"-reference_hillshade.tif\";\n  std::string cmd = opt.hillshade_command + \" \" + opt.reference + extra + ref_hillshade;\n  vw_out() << cmd << \"\\n\";\n  std::string ans = vw::exec_cmd(cmd.c_str());\n  vw_out() << ans << \"\\n\";\n\n  // Hillshade the source\n  std::string source_hillshade = opt.out_prefix + \"-source_hillshade.tif\";\n  cmd = opt.hillshade_command + \" \" + opt.source + extra + source_hillshade;\n  vw_out() << cmd << \"\\n\";\n  ans = vw::exec_cmd(cmd.c_str());\n  vw_out() << ans << \"\\n\";\n\n  // IP find\n  cmd = ipfind_path + \" \" + opt.ipfind_options + \" \" + ref_hillshade + \" \" + source_hillshade;\n  vw_out() << cmd << \"\\n\";\n  ans = vw::exec_cmd(cmd.c_str());\n  vw_out() << ans << \"\\n\";\n\n  // IP match\n  std::string ref_ip    = fs::path(ref_hillshade).replace_extension(\".vwip\").string();\n  std::string source_ip = fs::path(source_hillshade).replace_extension(\".vwip\").string();\n\n  cmd = ipmatch_path + \" \" + opt.ipmatch_options + \" \"\n    + ref_hillshade + \" \" + ref_ip + \" \" + source_hillshade + \" \" + source_ip + \" -o \"\n    + opt.out_prefix;\n  vw_out() << cmd << \"\\n\";\n  ans = vw::exec_cmd(cmd.c_str());\n  vw_out() << ans << \"\\n\";\n\n  // The name of the file where the matches are written to\n  bool matches_as_txt = false;\n  std::string match_file = vw::ip::match_filename(opt.out_prefix, ref_hillshade, source_hillshade,\n                                                  matches_as_txt);\n\n  return match_file;\n}\n\n// Compute an initial source to reference transform based on tie points (interest point matches).\nEigen::MatrixXd\ninitial_transform_from_match_file(std::string const& ref_file,\n                                  std::string const& source_file,\n                                  std::string const& match_file,\n                                  std::string const& hillshading_transform,\n                                  Vector2 initial_transform_ransac_params) {\n\n  if (asp::get_cloud_type(ref_file) != \"DEM\" || asp::get_cloud_type(source_file) != \"DEM\")\n    vw_throw(ArgumentErr()\n             << \"The alignment transform computation based on manually chosen \"\n             << \"point matches only works for DEMs. Use point2dem to first create \"\n             << \"DEMs from the input point clouds.\\n\");\n\n  std::vector<vw::ip::InterestPoint> ref_ip, source_ip;\n  vw_out() << \"Reading match file: \" << match_file << \"\\n\";\n  vw::ip::read_binary_match_file(match_file, ref_ip, source_ip);\n\n  DiskImageView<float> ref(ref_file);\n  vw::cartography::GeoReference ref_geo;\n  bool has_ref_geo = vw::cartography::read_georeference(ref_geo, ref_file);\n  double ref_nodata = -std::numeric_limits<double>::max();\n  vw::read_nodata_val(ref_file, ref_nodata);\n\n  DiskImageView<float> source(source_file);\n  vw::cartography::GeoReference source_geo;\n  bool has_source_geo = vw::cartography::read_georeference(source_geo, source_file);\n  double source_nodata = -std::numeric_limits<double>::max();\n  vw::read_nodata_val(source_file, source_nodata);\n\n  if (!has_ref_geo || !has_source_geo)\n    vw_throw(ArgumentErr() << \"One of the inputs is not a valid DEM.\\n\");\n\n  if (DIM != 3)\n    vw_throw(ArgumentErr() << \"Expecting DIM = 3.\\n\");\n\n  // Go from pixels to 3D points\n  int num_matches = ref_ip.size();\n  vw::Matrix<double> points_ref(DIM, num_matches), points_src(DIM, num_matches);\n  typedef vw::math::MatrixCol<vw::Matrix<double>> ColView;\n  int count = 0;\n  for (int match_id = 0; match_id < num_matches; match_id++) {\n    int ref_x = ref_ip[match_id].x;\n    int ref_y = ref_ip[match_id].y;\n    if (ref_x < 0 || ref_x >= ref.cols()) continue;\n    if (ref_y < 0 || ref_y >= ref.rows()) continue;\n    double ref_h = ref(ref_x, ref_y);\n    // Check for no-data and NaN pixels\n    if (ref_h <= ref_nodata || ref_h != ref_h) continue;\n\n    int source_x = source_ip[match_id].x;\n    int source_y = source_ip[match_id].y;\n    if (source_x < 0 || source_x >= source.cols()) continue;\n    if (source_y < 0 || source_y >= source.rows()) continue;\n    double source_h = source(source_x, source_y);\n    // Check for no-data and NaN pixels\n    if (source_h <= source_nodata || source_h != source_h) continue;\n\n    Vector2 ref_ll  = ref_geo.pixel_to_lonlat(Vector2(ref_x, ref_y));\n    Vector3 ref_xyz = ref_geo.datum()\n      .geodetic_to_cartesian(Vector3(ref_ll[0], ref_ll[1], ref_h));\n\n    Vector2 source_ll = source_geo.pixel_to_lonlat(Vector2(source_x, source_y));\n    Vector3 source_xyz = source_geo.datum()\n      .geodetic_to_cartesian(Vector3(source_ll[0], source_ll[1], source_h));\n\n    // Store in matrices\n    ColView col_ref(points_ref, count);\n    ColView col_src(points_src, count);\n    col_ref = ref_xyz;\n    col_src = source_xyz;\n\n    count++;\n  }\n\n  if (count < 3)\n    vw_throw(ArgumentErr() << \"Not enough valid matches were found.\\n\");\n\n  // Resize the matrix to keep only the valid points. Find the transform.\n  points_src.set_size(DIM, count, true);\n  points_ref.set_size(DIM, count, true);\n  vw::Matrix3x3 rotation;\n  vw::Vector3   translation;\n  double        scale;\n  bool filter_outliers = true;\n  vw::math::find_3D_transform(points_src, points_ref,\n                              rotation, translation, scale,\n                              hillshading_transform,\n                              filter_outliers,\n                              initial_transform_ransac_params);\n\n  // Convert to pc_align transform format.\n  Eigen::MatrixXd globalT = Eigen::MatrixXd::Identity(DIM+1, DIM+1);\n  globalT.block(0, 0, DIM, DIM) = vw_matrix3_to_eigen(rotation*scale);\n  globalT.block(0, DIM, DIM, 1) = vw_vector3_to_eigen(translation);\n\n  vw_out() << \"Transform computed from source to reference using a match file:\\n\"\n           << globalT << \"\\n\";\n\n  return globalT;\n}\n\nvoid apply_transform_to_cloud(Eigen::MatrixXd const& T, DP & point_cloud) {\n  for (int col = 0; col < point_cloud.features.cols(); col++) {\n    point_cloud.features.col(col) = T*point_cloud.features.col(col);\n  }\n}\n\n// Load, filter, transform, and resample the source point cloud. The input\n// clouds and transform have been shifted by the provided shift value. The \n// same shift will be applied to the produced source cloud.\nvoid processSourceCloud(Options                       const& opt,\n                        DP                            const& ref_point_cloud,\n                        Eigen::MatrixXd   const& shiftInitT,\n                        vw::cartography::GeoReference const& dem_georef,\n                        vw::cartography::GeoReference const& geo,\n                        asp::CsvConv                  const& csv_conv,\n                        BBox2                         const& source_box,\n                        vw::ImageViewRef<PixelMask<float>> reference_dem_ref,\n                        bool is_lola_rdr_format,\n                        double mean_source_longitude,\n                        // These won't change but cannot be const\n                        PM::ICP      & icp,\n                        vw::Vector3  & shift,\n                        // Output\n                        DP           & source_point_cloud) {\n\n  // Do two attempts, in case too few points are left after filtering. This can\n  // happen if the source cloud is very different from the reference cloud.\n  std::string tag = \"\";\n  for (int attempt = 1; attempt <= 2; attempt++) {\n\n    source_point_cloud = DP(); // Clear the output\n\n    int big_num = 1.0e+6;\n    if (attempt == 2) {\n      big_num = 50.0e+6;\n      tag = \"(second attempt) \";\n    }\n\n    int num_source_pts = opt.max_num_source_points;\n    if (opt.max_disp > 0.0)\n      num_source_pts = std::max((1+attempt) * num_source_pts, big_num);\n\n    // Use the same shift used for the reference point cloud    \n    bool calc_shift = false;\n    Stopwatch sw;\n    sw.start();\n    load_cloud(opt.source, num_source_pts, source_box,\n               opt.src_copc_win, opt.src_copc_read_all,\n               calc_shift, shift, geo, csv_conv, is_lola_rdr_format,\n               mean_source_longitude, opt.verbose, source_point_cloud);\n    sw.stop();\n    if (opt.verbose)\n      vw_out() << \"Loading the source point cloud \" << tag << \"took \"\n                << sw.elapsed_seconds() << \" s\\n\";\n\n    // Apply the initial guess transform to the source point cloud.\n    apply_transform_to_cloud(shiftInitT, source_point_cloud);\n\n    // Filter gross outliers in the source point cloud with max_disp\n    try {\n      // This can throw an exception if the resulting cloud is empty \n      if (opt.max_disp > 0.0)\n        filter_source_cloud(ref_point_cloud, source_point_cloud, icp,\n                          shift, dem_georef, reference_dem_ref, opt);\n    } catch (std::exception const& e) {\n      vw_out() << \"Not enough points left in the source cloud after filtering. \"\n               << \"Try loading more.\\n\";\n      continue;\n    }\n\n    random_pc_subsample(opt.max_num_source_points, source_point_cloud.features);\n    vw_out() << \"Reducing number of source points to: \"\n              << source_point_cloud.features.cols() << \"\\n\";\n\n    if (source_point_cloud.features.cols() >= opt.max_num_source_points)\n      break;\n\n    if (attempt == 1)\n      vw_out() << \"Not enough points left in the source cloud after filtering. \"\n               << \"Try loading more.\\n\";\n  }\n\n  // Write the point cloud to disk for debugging\n  //debug_save_point_cloud(ref_point_cloud, geo, shift, \"ref.csv\");\n}\n\n// Convert a north-east-down vector at a given location to a vector in reference\n// to the center of the Earth and create a translation matrix from that vector. \nEigen::MatrixXd\nned_to_cartesian_transform(vw::cartography::Datum const& datum,\n                           std::string& ned_str,\n                           vw::Vector3 const & location) {\n\n  vw::string_replace(ned_str, \",\", \" \"); // replace any commas\n  vw::Vector3 ned = vw::str_to_vec<vw::Vector3>(ned_str);\n\n  vw::Vector3 loc_llh = datum.cartesian_to_geodetic(location);\n  vw::Matrix3x3 NedToEcef = datum.lonlat_to_ned_matrix(loc_llh);\n  vw::Vector3 xyz_shift = NedToEcef * ned;\n\n  Eigen::MatrixXd T = Eigen::MatrixXd::Identity(DIM + 1, DIM + 1);\n\n  // Append the transform\n  for (int row = 0; row < DIM; row++)\n    T(row, DIM) = xyz_shift[row];\n\n  return T;\n}\n\n// Estimate the centroid of the reference points\nvw::Vector3 estimate_ref_cloud_centroid(Options const& opt,\n                                        vw::cartography::GeoReference const& geo,\n                                        CsvConv const& csv_conv,\n                                        std::string const& reference) {\n  Stopwatch sw;\n  sw.start();\n\n  PointMatcherSupport::validateFile(reference);\n  PointMatcher<double>::DataPoints points;\n\n  double median_longitude = 0.0; // to convert back from xyz to lonlat\n  bool verbose = false;\n  bool calc_shift = false; // won't shift the points\n  vw::Vector3 shift = vw::Vector3(0, 0, 0);\n  vw::BBox2 dummy_box;\n  bool is_lola_rdr_format;\n  // Load a sample of points, hopefully enough to estimate the centroid\n  // reliably.\n  int num_sample_pts = 1000000;\n  load_cloud(reference, num_sample_pts, dummy_box,\n             opt.ref_copc_win, opt.ref_copc_read_all,\n             calc_shift, shift, geo, csv_conv, is_lola_rdr_format,\n             median_longitude, verbose, points);\n\n  int numRefPts = points.features.cols();\n  Eigen::VectorXd meanRef = points.features.rowwise().sum() / numRefPts;\n\n  vw::Vector3 centroid;\n  for (int it = 0; it < 3; it++)\n    centroid[it] = meanRef[it];\n\n  sw.stop();\n  vw_out() << \"Centroid estimation took \" << sw.elapsed_seconds() << \" s\\n\";\n\n  return centroid;\n}\n\n// Intersect the reference and source boxes, making sure to handle well the potential\n// 360 degree offset among the two.\nvoid adjust_and_intersect_ref_source_boxes(BBox2 & ref_box, BBox2 & source_box,\n                                           std::string const& reference,\n                                           std::string const& source) {\n\n  double lon_offset = 0.0;\n\n  // Compute the longitude offset\n  double source_mean_lon = (source_box.min().x() + source_box.max().x())/2.0;\n  double ref_mean_lon    = (ref_box.min().x()    + ref_box.max().x())/2.0;\n  lon_offset = source_mean_lon - ref_mean_lon;\n  lon_offset = 360.0*round(lon_offset/360.0);\n\n  // Move the ref box in the domain of the source box\n  ref_box += Vector2(lon_offset, 0);\n\n  // Intersect them, as pc_align will operate on their common area\n  ref_box.crop(source_box);\n  source_box.crop(ref_box);\n\n  // Move back the ref box to its domain\n  ref_box -= Vector2(lon_offset, 0);\n\n  // Extra adjustments. These are needed since pixel_to_lonlat and\n  // cartesian_to_geodetic can disagree by 360 degrees. Adjust ref\n  // to source and vice-versa.\n  adjust_lonlat_bbox(reference, ref_box);\n  adjust_lonlat_bbox(source, source_box);\n}\n\n// See if we need to estimate the proj win of the source points\n// based on reference points and max disp. This is needed for COPC\n// files when this win is not set by the user.\nvoid checkNeeForSrcProjWin(Options const& opt,\n                           bool & need_src_projwin,\n                           vw::cartography::GeoReference & src_georef) {\n\n  need_src_projwin = false;\n  src_georef = vw::cartography::GeoReference();\n\n  if (asp::isCopc(opt.source) && opt.src_copc_win == vw::BBox2() &&\n      !opt.src_copc_read_all && opt.max_disp > 0.0) {\n\n    need_src_projwin = true;\n\n    // Sanity check\n    bool has_src_georef = asp::georef_from_las(opt.source, src_georef);\n    if (!has_src_georef)\n      vw_throw(ArgumentErr()\n                << \"Cannot read the georeference of the source point cloud.\\n\");\n\n    // Need this later when biasing by max_disp  \n    if (!src_georef.is_projected())\n      vw_throw(ArgumentErr()\n                << \"The source point cloud is not in projected coordinates. \"\n                << \"Set the option: --src-copc-win.\");\n  }\n\n}\n\nint main(int argc, char *argv[]) {\n\n  // Mandatory line for Eigen\n  Eigen::initParallel();\n\n  Options opt;\n  try {\n    handle_arguments(argc, argv, opt);\n\n    // Set the number of threads for OpenMP. \n    int processor_count = std::thread::hardware_concurrency();\n    omp_set_dynamic(0);\n    omp_set_num_threads(processor_count);\n\n    // Parse the csv format string and csv projection string\n    asp::CsvConv csv_conv;\n    csv_conv.parse_csv_format(opt.csv_format_str, opt.csv_srs);\n\n    // Try to read the georeference/datum info\n    GeoReference geo;\n    std::vector<std::string> clouds;\n    clouds.push_back(opt.reference);\n    clouds.push_back(opt.source);\n    read_georef(clouds, opt.datum, opt.csv_srs,\n                opt.semi_major_axis, opt.semi_minor_axis,\n                opt.csv_format_str,  csv_conv, geo);\n\n    // Use hillshading to create a match file\n    if (opt.hillshading_transform != \"\" && opt.match_file == \"\")\n      opt.match_file = find_matches_from_hillshading(opt, argv[0]);\n\n    // Create a transform based on a match file, either automatically generated, or\n    // user-made (normally with stereo_gui).\n    if (opt.match_file != \"\") {\n      if (opt.hillshading_transform == \"\")\n        opt.hillshading_transform = \"similarity\";\n      opt.init_transform\n        = initial_transform_from_match_file(opt.reference, opt.source,\n                                            opt.match_file, opt.hillshading_transform,\n                                            opt.initial_transform_ransac_params);\n    }\n\n    // See if to apply an initial north-east-down translation relative\n    // to the point cloud centroid, and/or a rotation around the axis\n    // going from the planet center to the centroid. The rotation\n    // happens first.\n    if (opt.initial_rotation_angle != 0 || opt.initial_ned_translation != \"\") {\n\n      vw::Vector3 centroid = estimate_ref_cloud_centroid(opt, geo, csv_conv, opt.reference);\n\n      // Ignore any other initializations so far\n      opt.init_transform = Eigen::MatrixXd::Identity(DIM + 1, DIM + 1);\n\n      // Form the rotation around the axis\n      Eigen::Vector3d axis(centroid[0], centroid[1], centroid[2]);\n      axis.normalize();\n      Eigen::Matrix3d rot\n        = Eigen::AngleAxisd(opt.initial_rotation_angle * M_PI/180.0, axis).matrix();\n      opt.init_transform.block(0, 0, DIM, DIM) = rot;\n\n      // The NED translation\n      if (opt.initial_ned_translation != \"\")\n        opt.init_transform =\n          ned_to_cartesian_transform(geo.datum(), opt.initial_ned_translation, centroid)\n          * opt.init_transform;\n    }\n\n    // Find the intersection of ref and source bounding boxs. This does not need\n    // a lot of samples as it is expanded by max_disp in either case.\n    BBox2 ref_box, source_box, trans_ref_box, trans_source_box;\n    if (!opt.skip_shared_box_estimation) {\n      Stopwatch sw0;\n      sw0.start();\n      int num_sample_pts = std::max(4000000,\n                                    std::max(opt.max_num_source_points,\n                                             opt.max_num_reference_points)/4);\n      num_sample_pts = std::min(1.0e+6, 1.0 * num_sample_pts); // avoid being slow\n\n      // Compute GDC bounding box of the source and reference clouds.\n      vw_out() << \"Computing the bounding boxes of the reference and source points using \"\n               << num_sample_pts << \" sample points.\\n\";\n\n      // See if we have to estimate the proj win of the src points\n      bool need_src_projwin = false, dummy_flag = false;\n      vw::cartography::GeoReference src_georef, dummy_georef;\n      vw::BBox2 src_projwin, dummy_projwin;\n      checkNeeForSrcProjWin(opt, need_src_projwin, src_georef);\n\n      Eigen::MatrixXd inv_init_trans = opt.init_transform.inverse();\n      calc_extended_lonlat_bbox(geo, num_sample_pts, csv_conv,\n                                opt.reference, opt.max_disp, inv_init_trans,\n                                opt.ref_copc_win, opt.ref_copc_read_all,\n                                need_src_projwin, src_georef,\n                                ref_box, trans_ref_box, src_projwin); // outputs\n\n      if (need_src_projwin) {\n        opt.src_copc_win = src_projwin;\n        vw::vw_out() << \"Estimated: --src-copc-win \"\n          << opt.src_copc_win.min().x() << \" \" << opt.src_copc_win.min().y() << \" \"\n          << opt.src_copc_win.max().x() << \" \" << opt.src_copc_win.max().y() << \"\\n\";\n      }\n\n      calc_extended_lonlat_bbox(geo, num_sample_pts, csv_conv,\n                                opt.source, opt.max_disp, opt.init_transform,\n                                opt.src_copc_win, opt.src_copc_read_all,\n                                dummy_flag, dummy_georef,\n                                source_box, trans_source_box, dummy_projwin); // outputs\n      sw0.stop();\n      vw_out() << \"Computation of bounding boxes took \"\n              << sw0.elapsed_seconds() << \" s\\n\";\n\n      // When boxes are huge, it is hard to do the optimization of intersecting\n      // them, as they may differ not by 0 or 360, but by 180. Better do nothing\n      // in that case. The solution may degrade a bit, as we may load points\n      // not in the intersection of the boxes, but at least it won't be wrong.\n      // In this case, there is a chance the boxes were computed wrong anyway.\n      if (ref_box.width() > 180.0 || source_box.width() > 180.0) {\n        vw_out() << \"Warning: Your input point clouds are spread over more than half \"\n                  << \"the planet. It is suggested that they be cropped, to get more \"\n                  << \"accurate results. Giving up on estimating their bounding boxes \"\n                  << \"and filtering outliers based on them.\\n\";\n\n        ref_box = BBox2();\n        source_box = BBox2();\n      }\n\n      // This is useful to point out issues when the reference and source\n      // boxes are shifted by 360 degrees relative to each other.\n      vw_out() << \"Reference points box: \" << ref_box << \"\\n\";\n      vw_out() << \"Source points box:    \" << source_box << \"\\n\";\n\n      if (!ref_box.empty() && !source_box.empty()) {\n        adjust_and_intersect_ref_source_boxes(ref_box, trans_source_box,\n                                              opt.reference, opt.source);\n        adjust_and_intersect_ref_source_boxes(trans_ref_box, source_box,\n                                              opt.reference, opt.source);\n      }\n      if (ref_box == source_box) {\n        // Leave some space here to align the text to the earlier printouts\n        vw_out() << \"Intersection box:     \" << ref_box    << \"\\n\";\n      } else {\n        // This can happen when the projections are offset by 360 degrees\n        vw_out() << \"Intersection reference box: \" << ref_box    << \"\\n\";\n        vw_out() << \"Intersection source    box: \" << source_box << \"\\n\";\n      }\n    }\n\n    // Load the point clouds. We will shift both point clouds by the\n    // centroid of the first one to bring them closer to origin.\n\n    // Load the subsampled reference point cloud.\n    Vector3 shift;\n    bool   calc_shift = true; // Shift points so the first point is (0,0,0)\n    bool   is_lola_rdr_format = false;   // may get overwritten\n    double mean_ref_longitude    = 0.0;  // may get overwritten\n    double mean_source_longitude = 0.0;  // may get overwritten\n    Stopwatch sw1;\n    sw1.start();\n    DP ref_point_cloud;\n    load_cloud(opt.reference, opt.max_num_reference_points, ref_box,\n               opt.ref_copc_win, opt.ref_copc_read_all,\n               calc_shift, shift, geo, csv_conv, is_lola_rdr_format,\n               mean_ref_longitude, opt.verbose, ref_point_cloud);\n    sw1.stop();\n    if (opt.verbose)\n      vw_out() << \"Loading the reference point cloud took \"\n               << sw1.elapsed_seconds() << \" s\\n\";\n    //ref_point_cloud.save(outputBaseFile + \"_ref.vtk\");\n\n    // So far we shifted by first point in reference point cloud to reduce\n    // the magnitude of all loaded points. Now that we have loaded all\n    // points, shift one more time, to place the centroid of the\n    // reference at the origin.\n    // Note: If this code is ever converting to using floats,\n    // the operation below needs to be re-implemented to be accurate.\n    int numRefPts = ref_point_cloud.features.cols();\n    Eigen::VectorXd meanRef = ref_point_cloud.features.rowwise().sum() / numRefPts;\n    ref_point_cloud.features.topRows(DIM).colwise()    -= meanRef.head(DIM);\n    for (int row = 0; row < DIM; row++)\n      shift[row] += meanRef(row); // Update the shift variable as well as the points\n    if (opt.verbose)\n      vw_out() << \"Data shifted internally by subtracting: \" << shift << \"\\n\";\n\n    // The point clouds are shifted, so shift the initial transform as well.\n    Eigen::MatrixXd shiftInitT = apply_shift(opt.init_transform, shift);\n\n    // If the reference point cloud came from a DEM, also load the data in DEM format.\n    cartography::GeoReference dem_georef;\n    vw::ImageViewRef<PixelMask<float>> reference_dem_ref;\n    if (opt.use_dem_distances()) {\n      // Load the dem, then wrap it inside an ImageViewRef object. This is done\n      // because the actual DEM type cannot be created without being\n      // initialized.\n      InterpolationReadyDem\n      reference_dem(load_interpolation_ready_dem(opt.reference, dem_georef));\n      reference_dem_ref.reset(reference_dem);\n    }\n\n    // Filter the reference and initialize the reference tree\n    double elapsed_time;\n    PM::ICP icp; // libpointmatcher object\n\n    Stopwatch sw3;\n    if (opt.verbose)\n      vw_out() << \"Building the reference cloud tree.\\n\";\n    sw3.start();\n    icp.initRefTree(ref_point_cloud, alignment_method_fallback(opt.alignment_method),\n            opt.highest_accuracy, false /*opt.verbose*/);\n    sw3.stop();\n    if (opt.verbose)\n      vw_out() << \"Reference point cloud processing took \" << sw3.elapsed_seconds() << \" s\\n\";\n\n   // Load, filter, transform, and resample the source point cloud\n   DP source_point_cloud;\n   processSourceCloud(opt, ref_point_cloud, shiftInitT, dem_georef, geo, csv_conv,\n                      source_box, reference_dem_ref, is_lola_rdr_format,\n                      mean_source_longitude, icp, shift,\n                      source_point_cloud); // output\n\n    // Make the libpointmatcher error message clearer\n    std::string libpointmatcher_error = \"no point to minimize\";\n    std::string pc_align_error =\n       \"This likely means that the clouds are too far. Consider increasing the \"\n       \"--max-displacement value to something somewhat larger than the expected \"\n       \"length of the displacement that may be needed to align the clouds.\\n\";\n\n    Eigen::MatrixXd beg_errors;\n    try {\n      elapsed_time = compute_registration_error(ref_point_cloud, source_point_cloud, icp,\n                                                shift, dem_georef, reference_dem_ref,\n                                                opt, beg_errors);\n    } catch(std::exception const& e) {\n      std::string error = e.what();\n      if (error.find(libpointmatcher_error) != std::string::npos)\n        error += \".\\n\" + pc_align_error; // clarify the error\n      vw_throw(ArgumentErr() << error);\n    }\n\n    calc_stats(\"Input\", beg_errors);\n    if (opt.verbose)\n      vw_out() << \"Initial error computation took \" << elapsed_time << \" s\\n\";\n\n    // Set up the ICP object\n    Stopwatch sw4;\n    sw4.start();\n    bool verbose = false;\n    Eigen::MatrixXd Id = Eigen::MatrixXd::Identity(DIM + 1, DIM + 1);\n    icp.setParams(opt.out_prefix, opt.num_iter, opt.outlier_ratio,\n                  (2.0*M_PI/360.0)*opt.diff_rotation_err, // convert to radians\n                  opt.diff_translation_err,\n                  alignment_method_fallback(opt.alignment_method),\n                  verbose);\n\n    // Compute the transformation to align the source to reference.\n    // We bypass calling ICP if the user explicitly asks for 0 iterations.\n    Eigen::MatrixXd T = Id;\n    if (opt.num_iter > 0) {\n      if (opt.alignment_method == \"nuth\") {\n        T = asp::nuthAlignment(opt.reference, opt.source, opt.out_prefix,\n                               opt.max_disp, opt.num_iter,\n                               opt.num_threads, opt.compute_translation_only,\n                               opt.nuth_options);\n        // Nuth does not use the shift, so apply it after it is returned.\n        T = apply_shift(T, shift);\n      } else if (opt.alignment_method == \"fgr\") {\n        T = fgr_alignment(source_point_cloud, ref_point_cloud, opt.fgr_options);\n      } else if (opt.alignment_method == \"point-to-plane\" ||\n                 opt.alignment_method == \"point-to-point\" ||\n                 opt.alignment_method == \"similarity-point-to-point\" ||\n                 opt.alignment_method == \"similarity-point-to-plane\") {\n        // Use libpointmatcher\n        try {\n          T = icp(source_point_cloud, ref_point_cloud, Id, opt.compute_translation_only);\n        } catch(std::exception const& e) {\n          std::string error = e.what();\n          if (error.find(libpointmatcher_error) != std::string::npos)\n            error += \".\\n\" + pc_align_error; // clarify the error\n          vw_throw(ArgumentErr() << error);\n        }\n\n        vw_out() << \"Match ratio: \"\n                 << icp.errorMinimizer->getWeightedPointUsedRatio() << \"\\n\";\n      } else if (opt.alignment_method == \"least-squares\" ||\n                opt.alignment_method == \"similarity-least-squares\") {\n        // Compute alignment using least squares\n        T = least_squares_alignment(source_point_cloud, shift,\n                                    dem_georef, reference_dem_ref, opt.alignment_method,\n                                    opt.num_iter, opt.num_threads);\n      } else\n        vw_throw(ArgumentErr() << \"Unknown alignment method: \" << opt.alignment_method);\n    }\n    sw4.stop();\n    if (opt.verbose)\n      vw_out() << \"Alignment took \" << sw4.elapsed_seconds() << \" s\\n\";\n\n    // Transform the source to make it close to reference.\n    DP trans_source_point_cloud(source_point_cloud);\n    apply_transform_to_cloud(T, trans_source_point_cloud);\n\n    // Calculate by how much points move as result of T\n    double max_obtained_disp = calc_max_displacement(source_point_cloud, trans_source_point_cloud);\n    Vector3 source_ctr_vec, source_ctr_llh;\n    Vector3 trans_xyz, trans_ned, trans_llh;\n    vw::Matrix3x3 NedToEcef;\n    calc_translation_vec(shiftInitT, source_point_cloud, trans_source_point_cloud, shift,\n                         geo.datum(), source_ctr_vec, source_ctr_llh,\n                         trans_xyz, trans_ned, trans_llh, NedToEcef);\n\n    // For each point, compute the distance to the nearest reference point.\n    Eigen::MatrixXd end_errors;\n    elapsed_time\n      = compute_registration_error(ref_point_cloud, trans_source_point_cloud, icp,\n                                   shift, dem_georef, reference_dem_ref, opt,\n                                   end_errors);\n    calc_stats(\"Output\", end_errors);\n    if (opt.verbose)\n      vw_out() << \"Final error computation took \" << elapsed_time << \" s\\n\";\n\n    // Go back to the original coordinate system, by applying the shifted initial\n    // transform to the shifted computed transform and then undoing the shift.\n    Eigen::MatrixXd globalT = apply_shift(T * shiftInitT, -shift);\n\n    // Print statistics\n    vw_out() << std::setprecision(16)\n             << \"Alignment transform (origin is planet center):\\n\" << globalT << \"\\n\";\n    vw_out() << std::setprecision(8); // undo the higher precision\n\n    vw_out() << \"Centroid of source points (Cartesian, meters): \" << source_ctr_vec << \"\\n\";\n    // Swap lat and lon, as we want to print lat first\n    std::swap(source_ctr_llh[0], source_ctr_llh[1]);\n    vw_out() << \"Centroid of source points (lat,lon,z): \" << source_ctr_llh << \"\\n\";\n    vw_out() << \"\\n\";\n\n    vw_out() << \"Translation vector (Cartesian, meters): \" << trans_xyz << \"\\n\";\n    vw_out() << \"Translation vector (North-East-Down, meters): \"\n             << trans_ned << \"\\n\";\n    vw_out() << \"Translation vector magnitude (meters): \" << norm_2(trans_xyz)\n             << \"\\n\";\n    vw::vw_out() << \"Maximum displacement of points between the source \"\n                 << \"cloud with any initial transform applied to it and the \"\n                 << \"source cloud after alignment to the reference: \"\n                 << max_obtained_disp << \" m\" << \"\\n\";\n    if (opt.max_disp > 0 && opt.max_disp < max_obtained_disp)\n      vw_out() << \"Warning: The input --max-displacement value is smaller than the \"\n               << \"final observed displacement. It may be advised to increase the former \"\n               << \"and rerun the tool.\\n\";\n\n    // Swap lat and lon, as we want to print lat first\n    std::swap(trans_llh[0], trans_llh[1]);\n    vw_out() << \"Translation vector (lat,lon,z): \" << trans_llh << \"\\n\";\n    vw_out() << \"\\n\";\n\n    Matrix3x3 rot;\n    for (int r = 0; r < DIM; r++)\n      for (int c = 0; c < DIM; c++)\n        rot(r, c) = globalT(r, c);\n\n    double scale = pow(det(rot), 1.0/3.0);\n    for (int r = 0; r < DIM; r++)\n      for (int c = 0; c < DIM; c++)\n        rot(r, c) /= scale;\n\n    // Subtract one before printing the scale, to see a lot of digits of precision\n    vw_out() << \"Transform scale - 1 = \" << (scale-1.0) << \"\\n\";\n\n    Matrix3x3 rot_NED = inverse(NedToEcef) * rot * NedToEcef;\n\n    Vector3 euler_angles = math::rotation_matrix_to_euler_xyz(rot) * 180/M_PI;\n    Vector3 euler_angles_NED = math::rotation_matrix_to_euler_xyz(rot_NED) * 180/M_PI;\n    Vector3 axis_angles = math::matrix_to_axis_angle(rot) * 180/M_PI;\n    vw_out() << \"Euler angles (degrees): \" << euler_angles  << \"\\n\";\n    vw_out() << \"Euler angles (North-East-Down, degrees): \" << euler_angles_NED  << \"\\n\";\n    vw_out() << \"Axis of rotation and angle (degrees): \"\n             << axis_angles/norm_2(axis_angles) << ' ' << norm_2(axis_angles) << \"\\n\";\n\n    Stopwatch sw5;\n    sw5.start();\n    write_transforms(opt, globalT);\n\n    if (opt.save_trans_ref) {\n      std::string trans_ref_prefix = opt.out_prefix + \"-trans_reference\";\n      save_trans_point_cloud(opt, opt.reference, trans_ref_prefix,\n                             opt.ref_copc_win, opt.ref_copc_read_all,\n                             geo, csv_conv, globalT.inverse());\n    }\n\n    if (opt.save_trans_source) {\n      std::string trans_source_prefix = opt.out_prefix + \"-trans_source\";\n      save_trans_point_cloud(opt, opt.source, trans_source_prefix,\n                             opt.src_copc_win, opt.src_copc_read_all,\n                             geo, csv_conv, globalT);\n    }\n\n    save_errors(source_point_cloud, beg_errors,  opt.out_prefix + \"-beg_errors.csv\",\n                shift, geo, csv_conv, is_lola_rdr_format, mean_source_longitude);\n    save_errors(trans_source_point_cloud, end_errors,  opt.out_prefix + \"-end_errors.csv\",\n                shift, geo, csv_conv, is_lola_rdr_format, mean_source_longitude);\n\n    if (opt.verbose) \n      vw_out() << \"Writing: \" << opt.out_prefix + \"-iterationInfo.csv\" << \"\\n\";\n\n    sw5.stop();\n    if (opt.verbose)\n      vw_out() << \"Saving to disk took \" << sw5.elapsed_seconds() << \" s\\n\";\n\n  } ASP_STANDARD_CATCHES;\n\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/pc_filter.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n/// \\file pc_filter.cc.\n\n/// Apply some filtering operations to a point cloud.\n\n// TODO(oalexan1): Add ability to remove blobs\n// Add median filter based on a window of given size and threshold.\n// Make it apply a blur and fill in from neighbors\n// See if saving .pcd as binary will speed up voxblox\n// Save weight image via --weight-image\n// Save the computed weight for each cloud point.\n// Replace max_camera_dir_to_camera_ray_angle with\n// --max-horizontal-camera-dir-to-camera-ray-angle\n// --max-vertical-camera-dir-to-camera-ray-angle\n\n#include <asp/Core/Macros.h>\n#include <asp/Core/AspProgramOptions.h>\n#include <asp/Core/AspLog.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/EigenUtils.h>\n#include <asp/PclIO/PclIO.h>\n#include <asp/Core/PointUtils.h>\n#include <asp/Core/PointCloudRead.h>\n\n#include <vw/FileIO/DiskImageUtils.h>\n#include <vw/FileIO/MatrixIO.h>\n#include <vw/Image/DistanceFunction.h>\n#include <vw/Camera/PinholeModel.h>\n#include <vw/Cartography/GeoReference.h>\n#include <vw/FileIO/FileUtils.h>\n\n#include <boost/filesystem.hpp>\n#include <boost/algorithm/string.hpp>\n\n#include <limits>\n\nusing namespace vw;\nusing namespace vw::cartography;\nnamespace po = boost::program_options;\nnamespace fs = boost::filesystem;\n\nstruct Options: vw::GdalWriteOptions {\n  bool transform_to_camera_coordinates;\n  std::string input_cloud, input_texture, output_cloud, output_weight, camera_file;\n  double max_valid_triangulation_error, max_distance_from_camera,\n    max_camera_ray_to_surface_normal_angle, max_camera_dir_to_surface_normal_angle,\n    max_camera_dir_to_camera_ray_angle, reliable_surface_resolution,\n    distance_from_camera_weight_power, blending_dist, blending_power;\n\n  // The class members will be initialized when parsing happens\n  Options() {}\n};\n\nvoid handle_arguments(int argc, char *argv[], Options& opt) {\n\n  po::options_description general_options(\"General options\");\n  general_options.add_options()\n    (\"input-cloud\", po::value(&opt.input_cloud)->default_value(\"\"),\n     \"Input cloud name. A four-band .tif file as produced by stereo triangulation.\")\n    (\"output-cloud\", po::value(&opt.output_cloud)->default_value(\"\"),\n     \"Output cloud name. If having a .tif extension, the same format will be used as the input. Can also save .pcd and .ply files (only vertices are saved, not faces). In those cases the points will be saved with float32 values, so there may be some precision loss. The .pcd file will store in the field for the cloud normal the values image_texture, blending_weight, intersection_error, assuming these are computed.\")\n    (\"input-texture\", po::value(&opt.input_texture)->default_value(\"\"),\n     \"If specified, read the texture from this file. Normally this is the file L.tif from the same run which produced the input point cloud.\")\n    (\"camera\", po::value(&opt.camera_file)->default_value(\"\"),\n     \"The left or right camera used to produce this cloud. Used for some filtering operations.\")\n    (\"max-distance-from-camera\", po::value(&opt.max_distance_from_camera)->default_value(0),\n     \"If positive, remove points further from camera center than this value. Measured in meters.\")\n    (\"max-valid-triangulation-error\", po::value(&opt.max_valid_triangulation_error)->default_value(0),\n     \"If positive, points with triangulation error larger than this will be removed from the cloud. Measured in meters.\")\n    (\"max-camera-ray-to-surface-normal-angle\", po::value(&opt.max_camera_ray_to_surface_normal_angle)->default_value(0),\n     \"If positive, points whose surface normal makes an angle with the ray back to the camera center greater than this will be removed as outliers. Measured in degrees.\")\n    (\"max-camera-dir-to-surface-normal-angle\", po::value(&opt.max_camera_dir_to_surface_normal_angle)->default_value(0),\n     \"If positive, points whose surface normal makes an angle with the camera direction greater than this will be removed as outliers. This eliminates surfaces almost parallel to camera view direction. Measured in degrees.\")\n      (\"max-camera-dir-to-camera-ray-angle\", po::value(&opt.max_camera_dir_to_camera_ray_angle)->default_value(0),\n       \"If positive, and a ray emanating from the camera and ending at the current point makes an angle with the camera direction bigger than this, remove the point as an outlier. In effect, this narrows the camera field of view.\")\n    (\"distance-from-camera-weight-power\", po::value(&opt.distance_from_camera_weight_power)->default_value(0),\n     \"If positive, let the weight of a point be inversely proportional to the distance from the camera center to the point, raised to this power.\")\n    (\"blending-dist\", po::value(&opt.blending_dist)->default_value(0.0),\n     \"If positive and closer to any boundary of valid points than this (measured in point cloud pixels), decrease the weight assigned to the given point proportionally to remaining distance to boundary raised to a power. In effect, points closer to boundary are given less weight. Used in VoxBlox.\")\n    (\"blending-power\", po::value(&opt.blending_power)->default_value(1.0),\n     \"Use this as the power when setting --blending-dist.\")\n    (\"reliable-surface-resolution\", po::value(&opt.reliable_surface_resolution)->default_value(0),\n     \"If positive, let each point's weight be proportional to exp(-curr_surface_resolution/reliable_surface_resolution). This should be set to about half the expected surface resolution, to have the weight of points at lower resolution decrease rather fast. A point's surface resolution is the maximum distance between it and its immediate neighbors.\")\n    (\"transform-to-camera-coordinates\",         po::bool_switch(&opt.transform_to_camera_coordinates)->default_value(false),\n     \"Transform the point cloud to the coordinate system of the camera provided with --camera. For use with VoxBlox.\")\n    (\"output-weight\", po::value(&opt.output_weight)->default_value(\"\"),\n     \"If specified, Save the per-pixel weight to this file. This has the same dimensions as the point cloud and ``L.tif``.(Use the .tif extension.)\");\n\n  general_options.add(vw::GdalWriteOptionsDescription(opt));\n\n  po::options_description positional(\"\");\n  po::positional_options_description positional_desc;\n\n  std::string usage(\"--input-cloud input.tif --output-cloud output.tif [other options]\");\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line(argc, argv, opt, general_options, general_options,\n                             positional, positional_desc, usage,\n                            allow_unregistered, unregistered);\n\n  // Validation\n  \n  if ((opt.transform_to_camera_coordinates            ||\n       opt.max_camera_ray_to_surface_normal_angle > 0 ||\n       opt.max_camera_dir_to_surface_normal_angle > 0 ||\n       opt.max_camera_dir_to_camera_ray_angle > 0)  && opt.camera_file.empty()) \n    vw_throw(ArgumentErr() << \"Some of the requested operations require \"\n              << \"a camera model specified via --camera.\");\n\n  if (opt.input_cloud.empty() || opt.output_cloud.empty()) \n    vw_throw(ArgumentErr() << \"The input and output point clouds must be specified.\");\n\n  if (opt.blending_dist > 0 && opt.blending_power <= 0) \n    vw_throw(ArgumentErr() << \"When setting --blending-dist, a \"\n              << \"positive value of blending power must be used.\");\n\n    // Create the output directory\n    vw::create_out_dir(opt.output_cloud);\n\n    // Turn on logging to file\n    std::string prog_name = asp::extract_prog_name(argv[0]);\n    asp::log_to_file(argc, argv, \"\", opt.output_cloud);\n  \n  return;\n}\n\n// Apply a rigid transforms to a point cloud in-place. Points at\n// origin are considered outliers and are unchanged.\nvoid applyAffineTransform(ImageView<Vector<double, 4>> & pc, vw::Matrix<double> const& T) {\n\n  if (T.rows() != 4 && T.cols() != 4 && T(3, 3) != 1.0)\n    vw_throw(ArgumentErr() << \"Expecting a 4x4 affine transform.\");\n\n  for (int col = 0; col < pc.cols(); col++) {\n    for (int row = 0; row < pc.rows(); row++) {\n      \n      if (subvector(pc(col, row), 0, 3) == Vector3())\n        continue; // outlier\n      \n      // Create homogeneous coordinates\n      Vector<double, 4> Q;\n      subvector(Q, 0, 3) = subvector(pc(col, row), 0, 3);\n      Q[3] = 1; \n        \n      // Apply transform\n      Q = T * Q;\n\n      // Copy back\n      subvector(pc(col, row), 0, 3) = subvector(Q, 0, 3);\n    }\n  }\n}\n\n// Find the surface normal at a given pixel based on the 3x3 neighborhood.\n// Return true on success.\nbool surfaceNormal(ImageView<Vector<double, 4>> const& point_image,\n                   int col, int row, Vector3 & N) {\n\n  // Initialize the output\n  N = Vector3();\n\n  // Find the nearby points\n  std::vector<Eigen::Vector3d> near_points;\n  for (int c = col - 1; c <= col + 1; c++) {\n    for (int r = row - 1; r <= row + 1; r++) {\n      if (c < 0 || c >= point_image.cols()) \n        continue;\n      if (r < 0 || r >= point_image.rows()) \n        continue;\n      \n      Vector<double, 4> const& Q = point_image(c, r);\n      if (Q == Vector<double, 4>()) \n        continue; // outlier\n\n      near_points.push_back(Eigen::Vector3d(Q[0], Q[1], Q[2]));\n    }\n  }\n  \n  if (near_points.size() < 5) \n    return false;\n  \n  Eigen::Vector3d plane_normal, centroid;\n  asp::bestFitPlane(near_points, centroid, plane_normal);\n  N = Vector3(plane_normal[0], plane_normal[1], plane_normal[2]);\n\n  if (N != N) \n    return false; // NaN\n  \n  return true;\n}\n\n// Estimate surface resolution by looking at four immediate neighbors. \n// Return 0 if at least 2 neighbors are missing or the current point.\nvoid estimate_surface_res(ImageView<Vector<double, 4>> const& point_image,\n                          ImageView<float> & surface_res) {\n\n  int offset_x[] = {-1, 0, 0, 1};\n  int offset_y[] = {0, -1, 1, 0};\n  \n  surface_res = ImageView<float>(point_image.cols(), point_image.rows());\n  for (int col = 0; col < surface_res.cols(); col++) {\n    for (int row = 0; row < surface_res.rows(); row++) {\n\n      surface_res(col, row) = 0.0;\n\n      Vector<double, 4> const& P = point_image(col, row); // alias\n      if (P == Vector<double, 4>()) \n        continue; // outlier\n\n      int count = 0;\n      double dist = 0.0;\n      for (int it = 0; it < 4; it++) {\n        int c = col + offset_x[it];\n        int r = row + offset_y[it];\n\n        if (c < 0 || c >= point_image.cols()) \n          continue;\n        if (r < 0 || r >= point_image.rows()) \n          continue;\n\n        Vector<double, 4> const& Q = point_image(c, r); // alias\n        if (Q == Vector<double, 4>()) \n          continue; // outlier\n\n        dist = std::max(dist, norm_2(subvector(P, 0, 3) - subvector(Q, 0, 3)));\n        count++;\n      }\n\n      if (count < 3)\n        continue; // too few neighbors\n\n      surface_res(col, row) = dist;\n    }\n  }\n}\n\nint main(int argc, char *argv[]) {\n  Options opt;\n  try {\n    handle_arguments(argc, argv, opt);\n\n    // For now only 4 channels are supported\n    // TODO(oalexan1): Support also 3 channels\n    int num_channels = get_num_channels(opt.input_cloud);\n    if (num_channels != 4) \n      vw_throw(ArgumentErr() << \"The input point cloud must have 4 channels.\");\n\n    std::string ext = fs::path(opt.output_cloud).extension().string();\n    boost::algorithm::to_lower(ext);\n    if (ext != \".tif\" && ext != \".pcd\" && ext != \".ply\") \n      vw_throw(ArgumentErr() << \"The output point cloud extension must be .tif, .pcd, or .ply.\");\n    \n    // Read the point cloud fully in memory, and remove any offset\n    ImageView<Vector<double, 4>> point_image = asp::read_asp_point_cloud_4(opt.input_cloud);\n    std::cout << \"Read point cloud: \" << opt.input_cloud << std::endl;\n\n    // Load the texture or set it to 1\n    ImageView<float> texture;\n    bool has_texture_nodata = false;\n    float texture_nodata = -32768.0;\n    if (opt.input_texture != \"\") {\n      std::cout << \"Read texture file: \" << opt.input_texture << std::endl;\n      texture = DiskImageView<float>(opt.input_texture);\n      if (vw::read_nodata_val(opt.input_texture, texture_nodata)) {\n        has_texture_nodata = true;\n        std::cout << \"Read texture nodata value: \" << texture_nodata << std::endl;\n      }\n    } else {\n      texture = ImageView<float>(point_image.cols(), point_image.rows());\n      for (int col = 0; col < texture.cols(); col++) {\n        for (int row = 0; row < texture.rows(); row++) {\n          texture(col, row) = 1.0;\n        }\n      }\n    }\n\n    // Sanity check\n    if (point_image.cols() != texture.cols() || point_image.rows() != texture.rows())\n    vw_throw(ArgumentErr() << \"The input point cloud and texture must have the same dimensions.\");\n\n    // Load the camera\n    vw::camera::PinholeModel cam;\n    vw::Matrix<double> cam2world = vw::math::identity_matrix(4);\n    if (opt.camera_file != \"\") {\n      vw_out() << \"Reading camera mode: \" << opt.camera_file << \"\\n\";\n      cam = vw::camera::PinholeModel(opt.camera_file);\n      vw::math::submatrix(cam2world, 0, 0, 3, 3) = cam.get_rotation_matrix();\n      for (int row = 0; row < 3; row++) \n        cam2world(row, 3) = cam.camera_center()[row];\n      vw_out() << \"Camera-to-world transform: \" << cam2world << \"\\n\";\n    }\n    vw::Matrix<double> world2cam = inverse(cam2world);\n\n    // Transform the cloud to camera coordinates (if world2cam is read)\n    applyAffineTransform(point_image, world2cam);\n\n    ImageView<float> weight(point_image.cols(), point_image.rows());\n    ImageView<float> out_texture(point_image.cols(), point_image.rows());\n    ImageView<Vector<double, 4>> clean_points(point_image.cols(), point_image.rows());\n    for (int col = 0; col < point_image.cols(); col++) {\n      for (int row = 0; row < point_image.rows(); row++) {\n        weight(col, row) = 0.0;\n        out_texture(col, row) = 0.0;\n        clean_points(col, row) = Vector<double, 4>();\n      }\n    }\n\n    ImageView<float> surface_res;\n    if (opt.reliable_surface_resolution > 0) \n      estimate_surface_res(point_image, surface_res);\n\n    // Camera direction, in camera's coordinate system\n    Vector3 cam_dir(0.0, 0.0, 1.0);\n\n    for (int col = 0; col < point_image.cols(); col++) {\n      for (int row = 0; row < point_image.rows(); row++) {\n        \n        Vector<double, 4> const& P = point_image(col, row); // alias\n        if (subvector(P, 0, 3) == Vector3() ||\n            (has_texture_nodata && texture(col, row) == texture_nodata) ||\n            (opt.max_valid_triangulation_error > 0 && P[3] > opt.max_valid_triangulation_error)) {\n          continue; // outlier\n        }\n\n        // The first 3 coordinates of P\n        Vector3 Q = subvector(P, 0, 3);\n\n        if (opt.max_distance_from_camera > 0 &&\n            norm_2(Q) > opt.max_distance_from_camera) {\n          continue; // outlier\n        }\n        \n        // All points are given equal weight for now\n        double wt = 1.0;\n        if (opt.distance_from_camera_weight_power > 0) {\n          double dist = norm_2(Q);\n          if (dist == 0.0) \n            continue; // outlier\n          \n          wt = 1.0 / pow(dist, opt.distance_from_camera_weight_power);\n        }\n\n        if (opt.max_camera_ray_to_surface_normal_angle > 0 ||\n            opt.max_camera_dir_to_surface_normal_angle > 0) {\n\n          // Find the surface normal\n          Vector3 N;\n          if (!surfaceNormal(point_image, col, row, N))\n            continue; // outlier\n            \n          if (opt.max_camera_ray_to_surface_normal_angle > 0) {\n            // Use abs as the normal can point in either direction\n            double prod = std::abs(dot_prod(Q, N) / norm_2(Q) / norm_2(N));\n            double angle = acos(prod) * (180.0 / M_PI);\n            if (std::isnan(angle) || std::isinf(angle) ||\n                angle > opt.max_camera_ray_to_surface_normal_angle)\n              continue; // something went wrong\n            \n          } else if (opt.max_camera_dir_to_surface_normal_angle > 0) {\n            double prod = std::abs(dot_prod(cam_dir, N) / norm_2(cam_dir) / norm_2(N));\n            double angle = acos(prod) * (180.0 / M_PI);\n            if (std::isnan(angle) || std::isinf(angle) ||\n                angle > opt.max_camera_dir_to_surface_normal_angle)\n              continue; // something went wrong\n          }\n        }\n        \n        if (opt.max_camera_dir_to_camera_ray_angle > 0) {\n\n          double prod = std::abs(dot_prod(Q, cam_dir)/ norm_2(Q) / norm_2(cam_dir));\n          double angle = acos(prod) * (180.0 / M_PI);\n          if (std::isnan(angle) || std::isinf(angle))\n            continue; // something went wrong\n          \n          if (angle > opt.max_camera_dir_to_camera_ray_angle) \n            continue; // outlier\n        }\n        \n        // The input texture is usually between 0 and 1.\n        // TODO(oalexan1): What is the max color?\n        double t = 255.0 * texture(col, row);\n        if (t <= 0.0) t = 1.0;  // Ensure a positive value for the color\n\n        // Note how we add back the triangulation error\n        clean_points(col, row) = Vector<double, 4>(Q[0], Q[1], Q[2], P[3]);\n        out_texture(col, row) = t;\n        weight(col, row) = wt;\n      }\n    }\n\n    if (opt.blending_dist > 0 && opt.blending_power > 0) {\n      ImageView<int> mask(clean_points.cols(), clean_points.rows());\n      for (int col = 0; col < clean_points.cols(); col++) {\n        for (int row = 0; row < clean_points.rows(); row++) {\n          mask(col, row) = (subvector(clean_points(col, row), 0, 3) != Vector3());\n        }\n      }\n      ImageView<double> dist;\n      vw::bounded_dist(mask, opt.blending_dist, dist);\n      \n      // Adjust the weight by the normalized distance raised to given power\n      for (int col = 0; col < dist.cols(); col++) {\n        for (int row = 0; row < dist.rows(); row++) {\n          dist(col, row) = pow(dist(col, row) / opt.blending_dist, opt.blending_power);\n          weight(col, row) *= dist(col, row);\n        }\n      }\n\n    }\n\n    if (opt.reliable_surface_resolution > 0) {\n      for (int col = 0; col < weight.cols(); col++) {\n        for (int row = 0; row < weight.rows(); row++) {\n          if (weight(col, row) <= 0) \n            continue;\n          \n          if (surface_res(col, row) <= 0) {\n            weight(col, row) = 0.0;\n            continue;\n          }\n\n          weight(col, row) *= exp(-surface_res(col, row) / opt.reliable_surface_resolution);\n        }\n      }\n    }\n    \n    if (!opt.transform_to_camera_coordinates)\n      applyAffineTransform(clean_points, cam2world); // convert back to world\n    \n    // Save as .tif, .pcd, or .pcl\n    if (ext == \".tif\") {\n      vw::cartography::GeoReference georef;\n      bool has_georef = vw::cartography::read_georeference(georef, opt.input_cloud);\n      bool has_nodata = false;\n      double nodata = 0.0;\n      vw_out() << \"Writing: \" << opt.output_cloud << \"\\n\";\n      vw::cartography::block_write_gdal_image\n        (opt.output_cloud, clean_points, has_georef, georef, has_nodata, nodata, opt,\n         TerminalProgressCallback(\"asp\", \"\\t--> Filter: \"));\n    } else {\n      asp::writeCloud(clean_points, out_texture, weight, opt.output_cloud);\n    }\n\n    if (opt.output_weight != \"\") {\n      vw::cartography::GeoReference georef;\n      bool has_georef = false;\n      bool has_nodata = false;\n      double nodata = 0;\n      vw_out() << \"Writing weights: \" << opt.output_weight << \"\\n\";\n      vw::cartography::block_write_gdal_image\n        (opt.output_weight, weight, has_georef, georef, has_nodata, nodata, opt,\n       TerminalProgressCallback(\"asp\", \"\\t--> Weight per point:\"));\n    }\n    \n    return 0;\n    \n  } ASP_STANDARD_CATCHES;\n\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/pc_merge.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n/// \\file pc_merge.cc\n///\n/// A simple tool to merge multiple point cloud files into a single file. The clouds\n/// can have 1 channel (plain raster images) or 3 to 6 channels.\n\n#include <asp/Core/Macros.h>\n#include <asp/Core/AspProgramOptions.h>\n#include <asp/Core/PointUtils.h>\n#include <asp/Core/OrthoRasterizer.h>\n#include <asp/Core/GdalUtils.h>\n\n#include <vw/Core/Stopwatch.h>\n#include <vw/Mosaic/ImageComposite.h>\n#include <vw/FileIO/DiskImageUtils.h>\n#include <vw/Cartography/PointImageManipulation.h>\n#include <vw/FileIO/FileUtils.h>\n\n#include <limits>\n\nusing namespace vw;\nusing namespace vw::cartography;\nnamespace po = boost::program_options;\nnamespace fs = boost::filesystem;\n\nstruct Options : vw::GdalWriteOptions {\n  // Input\n  std::vector<std::string> pointcloud_files;\n\n  // Settings\n  bool  write_double;  ///< If true, output file is double instead of float\n\n  // Output\n  std::string out_file;\n\n  Options() : write_double(false) {}\n};\n\n\nvoid handle_arguments( int argc, char *argv[], Options& opt ) {\n\n  po::options_description general_options(\"General Options\");\n  general_options.add_options()\n    (\"output-file,o\",  po::value(&opt.out_file)->default_value(\"\"),        \"Specify the output file.\")\n    (\"write-double,d\", po::value(&opt.write_double)->default_value(false), \"Write a double precision output file.\");\n\n  general_options.add( vw::GdalWriteOptionsDescription(opt) );\n\n  po::options_description positional(\"\");\n  positional.add_options()\n    (\"input-files\", po::value< std::vector<std::string> >(), \"Input files\");\n\n  po::positional_options_description positional_desc;\n  positional_desc.add(\"input-files\", -1);\n\n  std::string usage(\"[options] <point-clouds> \");\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line( argc, argv, opt, general_options, general_options,\n                             positional, positional_desc, usage,\n                             allow_unregistered, unregistered );\n\n  if (vm.count(\"input-files\") == 0)\n    vw_throw( ArgumentErr() << \"Missing input point clouds.\\n\"\n                            << usage << general_options );\n  opt.pointcloud_files = vm[\"input-files\"].as< std::vector<std::string> >();\n\n  if (opt.out_file == \"\")\n    vw_throw( ArgumentErr() << \"The output file must be specified!\\n\"\n              << usage << general_options );\n\n  vw::create_out_dir(opt.out_file);\n}\n\n\n/// Throws if the input point clouds do not have the same number of channels.\n/// - Returns the number of channels.\nint check_num_channels(std::vector<std::string> const& pc_files){\n  VW_ASSERT(pc_files.size() >= 1,\n            ArgumentErr() << \"Expecting at least one file.\\n\");\n\n  int target_num = get_num_channels(pc_files[0]);\n  for (int i = 1; i < (int)pc_files.size(); ++i){\n    int num_channels = get_num_channels(pc_files[i]);\n    if (num_channels != target_num)\n      vw_throw( ArgumentErr() << \"Input point clouds must all have the same number of channels!.\\n\" );\n  }\n  return target_num;\n}\n\n/// Determine the common shift value to use for the output files\nVector3 determine_output_shift(std::vector<std::string> const& pc_files, Options const& opt){\n\n  // If writing to double format, no shift is needed.\n  if (opt.write_double)\n    return Vector3(0,0,0);\n\n  // As an approximation, compute the mean shift vector of the input files.\n  // - If none of the input files have a shift, the output file will be written as a double.\n  vw::Vector3 shift(0,0,0), shiftIn;\n  double shift_count = 0;\n  for (size_t i=0; i<pc_files.size(); ++i) {\n    // Read in the shift from each cloud and accumulate them\n    std::string shift_str;\n    boost::shared_ptr<vw::DiskImageResource> \n      rsrc(new vw::DiskImageResourceGDAL(pc_files[i]));\n    if (vw::cartography::read_header_string(*rsrc.get(), asp::ASP_POINT_OFFSET_TAG_STR, shift_str)) {\n      //std::cout << \"shift string = \" << shift_str << std::endl;\n      shift += vw::str_to_vec<vw::Vector3>(shift_str);\n      shift_count += 1.0;\n    }\n  }\n  if (shift_count < 0.9) // If no shifts read, don't use a shift.\n    return Vector3(0,0,0);\n\n  // Compute the mean shift\n  // - It would be more accurate to weight the shift according to the number of input points\n  shift /= shift_count;\n  return shift;\n}\n\n\n// Do the actual work of loading, merging, and saving the point clouds\n\n// Case 1: Single-channel cloud.\ntemplate <class PixelT>\ntypename boost::enable_if<boost::is_same<PixelT, vw::PixelGray<float> >, void >::type\ndo_work(Vector3 const& shift, Options const& opt) {\n  // The spacing is selected to be compatible with the point2dem convention.\n  const int spacing = ASP_MAX_SUBBLOCK_SIZE;\n  ImageViewRef<PixelT> merged_cloud = asp::form_point_cloud_composite<PixelT>(opt.pointcloud_files, spacing);\n\n  vw_out() << \"Writing image: \" << opt.out_file << \"\\n\";\n\n  bool has_georef = false;\n  bool has_nodata = false;\n  double nodata = -std::numeric_limits<float>::max(); // smallest float\n  GeoReference georef;\n  vw::cartography::block_write_gdal_image(opt.out_file, merged_cloud, has_georef,\n                              georef,  has_nodata, nodata, opt,\n                              TerminalProgressCallback(\"asp\", \"\\t--> Merging: \"));\n}\n\n// Case 2: Multi-channel cloud.\ntemplate <class PixelT>\ntypename boost::disable_if<boost::is_same<PixelT, vw::PixelGray<float> >, void >::type\ndo_work(Vector3 const& shift, Options const& opt) {\n  // The spacing is selected to be compatible with the point2dem convention.\n  const int spacing = ASP_MAX_SUBBLOCK_SIZE;\n  ImageViewRef<PixelT> merged_cloud = asp::form_point_cloud_composite<PixelT>(opt.pointcloud_files, spacing);\n\n  // See if we can pull a georeference from somewhere. Of course it will be wrong\n  // when applied to the merged cloud, but it will at least have the correct datum\n  // and projection.\n  bool has_georef = false;\n  cartography::GeoReference georef;\n  for (size_t i = 0; i < opt.pointcloud_files.size(); i++){\n    cartography::GeoReference local_georef;\n\n    if (read_georeference(local_georef, opt.pointcloud_files[i])){\n      georef = local_georef;\n      has_georef = true;\n    }\n  }\n\n  bool has_nodata = false;\n  double nodata = -std::numeric_limits<float>::max(); // smallest float\n\n  vw_out() << \"Writing point cloud: \" << opt.out_file << \"\\n\";\n\n  // If shift != zero then this will cast the output data to type float.\n  //  Otherwise it will keep its data type.\n  double point_cloud_rounding_error = 0.0;\n  asp::block_write_approx_gdal_image(opt.out_file, shift,\n                                     point_cloud_rounding_error,\n                                     merged_cloud,\n                                     has_georef, georef, has_nodata, nodata,\n                                     opt, TerminalProgressCallback(\"asp\", \"\\t--> Merging: \"));\n}\n\n//-----------------------------------------------------------------------------------\n\nint main( int argc, char *argv[] ) {\n\n  Options opt;\n  try {\n    handle_arguments( argc, argv, opt );\n\n    // Determine the number of channels\n    int num_channels = check_num_channels(opt.pointcloud_files);\n\n    // Determine the output shift (if any)\n    Vector3 shift = determine_output_shift(opt.pointcloud_files, opt);\n\n    // The code has to branch here depending on the number of channels\n    switch (num_channels)\n    {\n      // The input point clouds have their shift incorporated and are stored as doubles.\n      // If the output file is stored as float, it needs to have a single shift value applied.\n      case 1:  do_work< vw::PixelGray<float> >(shift, opt); break;\n      case 3:  do_work<Vector3>(shift, opt); break;\n      case 4:  do_work<Vector4>(shift, opt); break;\n      case 6:  do_work<Vector6>(shift, opt); break;\n      default: vw_throw( ArgumentErr() << \"Unsupported number of channels!.\\n\" );\n    }\n\n  } ASP_STANDARD_CATCHES;\n\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/point2dem.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// \\file point2dem.cc\n//\n\n#include <asp/Core/PointToDem.h>\n#include <asp/Core/PointUtils.h>\n#include <asp/Core/OrthoRasterizer.h>\n#include <asp/Core/Macros.h>\n#include <asp/Core/AspProgramOptions.h>\n#include <asp/Core/AspLog.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/OutlierProcessing.h>\n#include <asp/Core/PointCloudProcessing.h>\n\n#include <vw/Image/InpaintView.h>\n#include <vw/Core/Stopwatch.h>\n#include <vw/Core/StringUtils.h>\n#include <vw/Cartography/GeoReferenceUtils.h>\n#include <vw/Mosaic/ImageComposite.h>\n#include <vw/FileIO/DiskImageUtils.h>\n#include <vw/Math/EulerAngles.h>\n#include <vw/Cartography/PointImageManipulation.h>\n#include <vw/Cartography/DatumUtils.h>\n#include <vw/Core/StringUtils.h>\n#include <vw/FileIO/FileUtils.h>\n\n#include <pdal/PDALUtils.hpp>\n#include <boost/math/special_functions/fpclassify.hpp>\n#include <limits>\n\nusing namespace vw;\nusing namespace asp;\nusing namespace vw::cartography;\nnamespace po = boost::program_options;\nnamespace fs = boost::filesystem;\n\n/// To help with compression, round to about 1mm, but\n/// use for rounding a number with few digits in binary.\nconst double APPROX_ONE_MM = 1.0/1024.0;\n\nvoid handle_arguments(int argc, char *argv[], DemOptions& opt) {\n\n  std::string dem_spacing1, dem_spacing2;\n  double nan = std::numeric_limits<double>::quiet_NaN();\n  po::options_description manipulation_options(\"Manipulation options\");\n  manipulation_options.add_options()\n    (\"x-offset\",       po::value(&opt.lon_offset)->default_value(0), \n     \"Add a longitude offset (in degrees) to the DEM.\")\n    (\"y-offset\",       po::value(&opt.lat_offset)->default_value(0), \n     \"Add a latitude offset (in degrees) to the DEM.\")\n    (\"z-offset\",       po::value(&opt.height_offset)->default_value(0), \n     \"Add a vertical offset (in meters) to the DEM.\");\n\n  po::options_description projection_options(\"Projection options\");\n  projection_options.add_options()\n    (\"t_srs\", po::value(&opt.target_srs_string)->default_value(\"\"), \n     \"Specify the output projection as a GDAL projection string (WKT, GeoJSON, or PROJ). If not provided, will be read from the point cloud, if available, or auto-determined.\")\n    (\"t_projwin\", po::value(&opt.target_projwin),\n     \"Specify a custom extent in georeferenced coordinates. This will be adjusted \"\n      \"to ensure that the grid points are placed at integer multiples of the grid \"\n      \"size, unless --gdal-tap is on.\")\n    (\"dem-spacing,s\", po::value(&dem_spacing1)->default_value(\"\"),\n     \"Set output DEM resolution (in target georeferenced units per pixel). These units may \"\n     \"be in meters or degrees, depending on the projection. If not specified, it will be \"\n     \"computed automatically (except for LAS and CSV files). Multiple spacings can be set \"\n     \"(in quotes) to generate multiple output files. This is the same as the --tr option.\")\n    (\"tr\", po::value(&dem_spacing2)->default_value(\"\"), \n     \"This is identical to the --dem-spacing option.\")\n    (\"gdal-tap\", po::bool_switch(&opt.gdal_tap)->default_value(false),\n     \"Ensure that the bounds of output products (as printed by gdalinfo) are integer \"\n     \"multiples of the grid size (as set with --tr). This implies that the centers of \"\n     \"output pixels are offset by 0.5 times the grid size. When --t_projwin is set and its \"\n     \"entries are integer multiples of the grid size, that precise extent will be produced \"\n     \"on output. This functions as the GDAL -tap option.\")\n    (\"datum\", po::value(&opt.datum)->default_value(\"\"),\n     \"Set the datum. This will override the datum from the input images and also --t_srs, --semi-major-axis, and --semi-minor-axis. Options: WGS_1984, D_MOON (1,737,400 meters), D_MARS (3,396,190 meters), MOLA (3,396,000 meters), NAD83, WGS72, and NAD27. Also accepted: Earth (=WGS_1984), Mars (=D_MARS), Moon (=D_MOON).\")\n    (\"reference-spheroid,r\", po::value(&opt.reference_spheroid)->default_value(\"\"),\n     \"This is identical to the datum option.\")\n    (\"semi-major-axis\",      po::value(&opt.semi_major)->default_value(0),\n     \"Explicitly set the datum semi-major axis in meters.\")\n    (\"semi-minor-axis\", po::value(&opt.semi_minor)->default_value(0),\n     \"Explicitly set the datum semi-minor axis in meters.\")\n    (\"sinusoidal\",        \n       \"Save using a sinusoidal projection.\")\n    (\"mercator\",            \n     \"Save using a Mercator projection.\")\n    (\"transverse-mercator\", \n     \"Save using a transverse Mercator projection.\")\n    (\"orthographic\",        \n     \"Save using an orthographic projection.\")\n    (\"stereographic\",       \n     \"Save using a stereographic projection. See also --auto-proj-center.\")\n    (\"oblique-stereographic\", \n     \"Save using an oblique stereographic projection.\")\n    (\"gnomonic\",            \n     \"Save using a gnomonic projection.\")\n    (\"lambert-azimuthal\",   \n     \"Save using a Lambert azimuthal projection.\")\n    (\"utm\",        po::value(&opt.utm_zone),\n     \"Save using a UTM projection with the given zone.\")\n    (\"geographic\", \"Save using the geographic projection (longitude and latitude). \"\n      \"Recommended only close to the equator.\")\n    (\"proj-lon\",   po::value(&opt.proj_lon)->default_value(nan),\n     \"The center of projection longitude. If not specified, it will be computed \"\n     \"automatically based on the estimated point cloud median.\")\n    (\"proj-lat\",   po::value(&opt.proj_lat)->default_value(nan),\n     \"The center of projection latitude. See also --proj-lon.\")\n    (\"proj-scale\", po::value(&opt.proj_scale)->default_value(1),\n     \"The projection scale (if applicable).\")\n    (\"false-easting\", po::value(&opt.false_easting)->default_value(0),\n     \"The projection false easting (if applicable).\")\n    (\"false-northing\", po::value(&opt.false_northing)->default_value(0),\n     \"The projection false northing (if applicable).\")\n    (\"auto-proj-center\", po::bool_switch(&opt.auto_proj_center)->default_value(false),\n     \"Automatically compute the projection center, unless --proj-lon and --proj-lat \"\n     \"are set. This is now the default, so this option is obsolete.\");\n\n  po::options_description general_options(\"General options\");\n  general_options.add_options()\n    (\"nodata-value\",      po::value(&opt.nodata_value)->default_value(-1e+6),\n      \"Set the nodata value.\")\n    (\"use-alpha\",         po::bool_switch(&opt.has_alpha)->default_value(false),\n      \"Create images that have an alpha channel.\")\n    (\"normalized,n\",      po::bool_switch(&opt.do_normalize)->default_value(false),\n      \"Also write a normalized version of the DEM (for debugging).\")\n    (\"orthoimage\",        po::bool_switch(&opt.do_ortho)->default_value(false),\n      \"Write an orthoimage based on the texture files passed in as inputs \"\n      \"(after the point clouds).\")\n    (\"output-prefix,o\",   po::value(&opt.out_prefix),\n     \"Specify the output prefix.\")\n    (\"output-filetype,t\", po::value(&opt.output_file_type)->default_value(\"tif\"), \"Specify the output file.\")\n    (\"errorimage\",        po::bool_switch(&opt.do_error)->default_value(false),\n    \"Write an additional image, whose values represent the triangulation ray \"\n    \"intersection error in meters (the closest distance between the rays \"\n    \"emanating from the two cameras corresponding to the same point on the \"\n    \"ground). Filename is <output prefix>-IntersectionErr.tif. If stereo \"\n    \"triangulation was done with the option --compute-error-vector, this \"\n    \"intersection error will instead have 3 bands, corresponding to the \"\n    \"coordinates of that vector, unless the option --scalar-error is set.\")\n    (\"scalar-error\", po::bool_switch(&opt.scalar_error)->default_value(false),\n     \"If the point cloud has a vector triangulation error, ensure that \"\n     \"the intersection error produced by this program is the rasterized \"\n     \"norm of that vector. See also --error-image.\")\n    (\"dem-hole-fill-len\", po::value(&opt.dem_hole_fill_len)->default_value(0),\n     \"Maximum dimensions of a hole in the output DEM to fill in, in pixels.\")\n    (\"orthoimage-hole-fill-len\",      po::value(&opt.ortho_hole_fill_len)->default_value(0),\n     \"Maximum dimensions of a hole in the output orthoimage to fill in, in pixels.\")\n    (\"orthoimage-hole-fill-extra-len\", po::value(&opt.ortho_hole_fill_extra_len)->default_value(0),\n     \"This value, in pixels, will make orthoimage hole filling more aggressive by first extrapolating the point cloud. A small value is suggested to avoid artifacts. Hole-filling also works better when less strict with outlier removal, such as in --remove-outliers-params, etc.\")\n    (\"remove-outliers\", po::bool_switch(&opt.remove_outliers_with_pct)->default_value(true),\n      \"Turn on outlier removal based on percentage of triangulation error. Obsolete, as this is the default.\")\n    (\"remove-outliers-params\",        po::value(&opt.remove_outliers_params)->default_value(Vector2(75.0, 3.0), \"pct factor\"),\n      \"Outlier removal based on percentage. Points with triangulation error larger than pct-th percentile times factor and points too far from the cluster of most points will be removed as outliers. [default: pct=75.0, factor=3.0]\")\n    (\"use-tukey-outlier-removal\", po::bool_switch(&opt.use_tukey_outlier_removal)->default_value(false)->implicit_value(true),\n     \"Remove outliers above Q3 + 1.5*(Q3 - Q1). Takes precedence over \"\n     \"--remove-outliers-params.\")\n    (\"max-valid-triangulation-error\", po::value(&opt.max_valid_triangulation_error)->default_value(0),\n      \"Outlier removal based on threshold. If positive, points with triangulation error larger than this will be removed from the cloud. Measured in meters. This option takes precedence over --remove-outliers-params and --use-tukey-outlier-removal.\")\n    (\"max-output-size\", po::value(&opt.max_output_size)->default_value(Vector2(9999999, 9999999)),\n      \"Don't write the output DEM if it is calculated to be this size or greater.\")\n    (\"median-filter-params\", po::value(&opt.median_filter_params)->default_value(Vector2(0, 0), \"window_size threshold\"), \n     \"If the point cloud height at the current point differs by more than the given threshold from the median of heights in the window of given size centered at the point, remove it as an outlier. Use for example 11 and 40.0.\")\n    (\"erode-length\",   po::value<int>(&opt.erode_len)->default_value(0),\n     \"Erode input point clouds by this many pixels at boundary (after outliers are removed, but before filling in holes).\")\n    (\"csv-format\",     po::value(&opt.csv_format_str)->default_value(\"\"), asp::csv_opt_caption().c_str())\n    (\"csv-srs\",      po::value(&opt.csv_srs)->default_value(\"\"), \n     \"The projection string to use to interpret the entries in input CSV files. If not set, --t_srs will be used.\")\n    (\"filter\",      po::value(&opt.filter)->default_value(\"weighted_average\"), \n     \"The filter to apply to the heights of the cloud points within a given circular neighborhood when gridding (its radius is controlled via --search-radius-factor). Options: weighted_average (default), min, max, mean, median, stddev, count (number of points), nmad (= 1.4826 * median(abs(X - median(X)))), n-pct (where n is a real value between 0 and 100, for example, 80-pct, meaning, 80th percentile). Except for the default, the name of the filter will be added to the obtained DEM file name, e.g., output-min-DEM.tif.\")\n    (\"rounding-error\", po::value(&opt.rounding_error)->default_value(APPROX_ONE_MM),\n     \"How much to round the output DEM and errors, in meters (more rounding means less precision but potentially smaller size on disk). The inverse of a power of 2 is suggested. Default: 1/2^10.\")\n    (\"search-radius-factor\", po::value(&opt.search_radius_factor)->default_value(0.0),\n     \"Multiply this factor by --dem-spacing to get the search radius. The \"\n     \"DEM height at a given grid point is obtained as the weighted average of heights \"\n     \"of all points in the cloud within search radius of the grid point, with the \"\n     \"weight given by the Gaussian of the distance from the grid point to the cloud \"\n     \"point (see --gaussian-sigma-factor). If not specified, the default search radius \"\n     \"is the maximum of user-set --dem-spacing and internally estimated median DEM \"\n     \"spacing, so the default factor is about 1.\")\n    (\"gaussian-sigma-factor\", po::value(&opt.sigma_factor)->default_value(0.0),\n     \"The value s to be used in the Gaussian exp(-s*(x/grid_size)^2) when computing the \"\n     \"weight to give to a cloud point contribution to a given DEM grid point, \"\n     \"with x the distance in meters between the two. The default is -log(0.25) = 1.3863. \"\n     \"A smaller value will result in a smoother terrain.\")\n    (\"default-grid-size-multiplier\", po::value(&opt.default_grid_size_multiplier)->default_value(1.0),\n     \"If the output DEM grid size (--dem-spacing) is not specified, compute it automatically (as the mean ground sample distance), and then multiply it by this number. It is suggested that this number be set to 4 though the default is 1.\")\n    (\"propagate-errors\", po::bool_switch(&opt.propagate_errors)->default_value(false),  \n     \"Write files with names {output-prefix}-HorizontalStdDev.tif and {output-prefix}-VerticalStdDev.tif having the gridded stddev produced from bands 5 and 6 of the input point cloud, if this cloud was created with the option --propagate-errors. The same gridding algorithm is used as for creating the DEM.\")\n    (\"no-dem\", po::bool_switch(&opt.no_dem)->default_value(false),\n     \"Skip writing a DEM.\")\n    (\"input-is-projected\", po::bool_switch(&opt.input_is_projected)->default_value(false), \n     \"Input data is already in projected coordinates, or is a point cloud in Cartesian \"\n     \"coordinates that is small in extent. See the doc for more info.\")\n    (\"csv-proj4\", po::value(&opt.csv_proj4_str)->default_value(\"\"), \n     \"An alias for --csv-srs, for backward compatibility.\")\n    (\"copc-win\", po::value(&opt.copc_win)->default_value(vw::BBox2()),\n     \"Specify the region to read from a COPC LAZ file. The units are based the projection \" \n     \"in the file. This is required unless --copc-read-all is set. Specify as minx miny \"\n     \"maxx maxy, or minx maxy maxx miny, with no quotes.\")\n    (\"copc-read-all\", po::bool_switch(&opt.copc_read_all)->default_value(false), \n     \"Read the full COPC file, ignoring the --copc-win option.\")\n    ;\n\n  general_options.add(manipulation_options);\n  general_options.add(projection_options);\n  general_options.add(vw::GdalWriteOptionsDescription(opt));\n\n  po::options_description positional(\"\");\n  positional.add_options()\n    (\"input-files\", po::value<std::vector<std::string>>(), \"Input files\");\n\n  po::positional_options_description positional_desc;\n  positional_desc.add(\"input-files\", -1);\n\n  std::string usage(\"[options] <point-clouds> [ --orthoimage <textures> ]\");\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line(argc, argv, opt, general_options, general_options,\n                            positional, positional_desc, usage,\n                            allow_unregistered, unregistered);\n\n  if (vm.count(\"input-files\") == 0)\n    vw_throw(ArgumentErr() << \"Missing input point clouds.\\n\" << usage << general_options);\n    \n  std::vector<std::string> input_files = vm[\"input-files\"].as<std::vector<std::string>>();\n  parse_input_clouds_textures(input_files, opt);\n\n  // This is a bug fix. The user by mistake passed in an empty projection string.\n  if (!vm[\"t_srs\"].defaulted() && opt.target_srs_string.empty())\n    vw_throw(ArgumentErr() \n             << \"The value of --t_srs is empty. Then it must not be set at all.\\n\");\n  \n  if (opt.median_filter_params[0] < 0 || opt.median_filter_params[1] < 0)\n    vw_throw(ArgumentErr() << \"The parameters for median-based filtering \"\n                            << \"must be non-negative.\\n\");\n\n  // If opt.target_srs is upper-case \"auto\", make it lowercase. Do not touch\n  // this string otherwise as PROJ complains.\n  if (boost::to_lower_copy(opt.target_srs_string) == \"auto\")\n    opt.target_srs_string = \"auto\";\n  \n  if (opt.has_las_or_csv_or_pcd && opt.median_filter_params[0] > 0 &&\n      opt.median_filter_params[1] > 0)\n    vw_throw(ArgumentErr() \n             << \"Median-based filtering cannot handle CSV or LAS files.\\n\");\n\n  if (opt.erode_len < 0)\n    vw_throw(ArgumentErr() << \"Erode length must be non-negative.\\n\");\n\n  if ((dem_spacing1.size() > 0) && (dem_spacing2.size() > 0))\n    vw_throw(ArgumentErr() << \"The DEM spacing was specified twice.\\n\");\n\n  // Consolidate the dem_spacing and tr parameters\n  if (dem_spacing1.size() < dem_spacing2.size())\n    dem_spacing1 = dem_spacing2; // Now we can just use dem_spacing1\n\n  // Extract the list of numbers from the input string\n  vw::split_number_string(dem_spacing1, opt.dem_spacing);\n  \n  // Check for for non-positive input\n  for (size_t i = 0; i < opt.dem_spacing.size(); i++) {\n    if (opt.dem_spacing[i] <= 0.0)\n      vw_throw(ArgumentErr() << \"The DEM spacing must be positive.\\n\" );\n  }\n      \n  // Make sure we have a number      \n  if (opt.dem_spacing.size() == 0)\n    opt.dem_spacing.push_back(0.0);\n\n  bool spacing_provided = false;\n  for (size_t i = 0; i < opt.dem_spacing.size(); i++) {\n    if (opt.dem_spacing[i] > 0)\n      spacing_provided = true;\n  }\n\n  if (opt.has_las_or_csv_or_pcd && !spacing_provided)\n    vw_throw(ArgumentErr() << \"When inputs are not PC.tif files, the \"\n                            << \"output DEM resolution must be set.\\n\");\n\n  if (opt.out_prefix.empty()) {\n    std::string input_file = opt.pointcloud_files[0];\n    if (asp::is_las(input_file) && pdal::Utils::isRemote(input_file))\n     input_file = fs::path(input_file).filename().string(); // rm the remote path\n    opt.out_prefix = asp::prefix_from_pointcloud_filename(input_file);\n  }\n  \n  if (opt.dem_hole_fill_len < 0)\n    vw_throw(ArgumentErr() << \"The value of --dem-hole-fill-len must be non-negative.\\n\");\n  if (opt.ortho_hole_fill_len < 0)\n    vw_throw(ArgumentErr() << \"The value of --orthoimage-hole-fill-len must be non-negative.\\n\");\n  if (opt.ortho_hole_fill_extra_len < 0)\n    vw_throw(ArgumentErr() << \"The value of --orthoimage-hole-fill-extra-len must be non-negative.\\n\");\n  if (!opt.do_ortho && opt.ortho_hole_fill_len > 0)\n    vw_throw(ArgumentErr() << \"The value of --orthoimage-hole-fill-len is positive, \"\n                           << \"but orthoimage generation was not requested.\\n\");\n\n  if (opt.dem_hole_fill_len > 200)\n    vw::vw_out(WarningMessage) << \"The value of --dem-hole-fill-len is large, \"\n                               << \"this may result in the program running out of memory. \"\n                               << \"Consider using dem_mosaic with the option \"\n                               << \"--fill-search-radius instead.\\n\";\n\n  if (opt.ortho_hole_fill_len > 200)\n    vw::vw_out(WarningMessage) << \"The value of --orthoimage-hole-fill-len is large, \"\n                               << \"this may result in the program running out of memory. \"\n                               << \"Consider using the mapproject program instead.\\n\";\n\n  if (opt.ortho_hole_fill_len > 0) {\n    // We do hole-filling before erosion and outlier removal, for performance reason,\n    // and the two may not play nicely together.\n    if (opt.erode_len > 0) \n      vw_out(WarningMessage) << \"Erosion may interfere with filling \"\n                             << \"holes in ortho images.\\n\";\n    if (opt.median_filter_params[0] > 0 && opt.median_filter_params[1] > 0)\n      vw_out(WarningMessage) << \"Removing outliers using a median filter may interfere \"\n                             << \"with filling holes in ortho images.\\n\";\n    if (opt.remove_outliers_params[0] < 100)\n      vw_out(WarningMessage) << \"Removing outliers using a percentile filter may interfere \"\n                             << \"with filling holes in ortho images.\\n\";\n  }\n\n  double pct = opt.remove_outliers_params[0], factor = opt.remove_outliers_params[1];\n  if (pct <= 0.0 || pct > 100.0 || factor <= 0.0){\n    vw_throw(ArgumentErr()\n              << \"Invalid values were provided for outlier removal params.\\n\");\n  }\n\n  // opt.proj_lon and opt.proj_lat must either both be set or not\n  if (std::isnan(opt.proj_lon) != std::isnan(opt.proj_lat))\n    vw_throw(ArgumentErr() << \"Must set both or neither of --proj-lon and --proj-lat.\\n\");\n    \n  if (opt.max_valid_triangulation_error > 0) {\n    // Since the user passed in a threshold, will use that to rm\n    // outliers, instead of using the percentage.\n    opt.remove_outliers_with_pct = false;\n    opt.use_tukey_outlier_removal = false;\n  }\n\n  // For compatibility with GDAL, we allow the proj win y coordinate to be flipped.\n  // Correct that here.\n  if (opt.target_projwin != BBox2()) {\n    if (opt.target_projwin.min().y() > opt.target_projwin.max().y())\n      std::swap(opt.target_projwin.min().y(), opt.target_projwin.max().y());\n    vw_out() << \"Cropping to projection box \" << opt.target_projwin << \".\\n\";\n  }\n  if (opt.copc_win != BBox2()) {\n    if (opt.copc_win.min().y() > opt.copc_win.max().y())\n      std::swap(opt.copc_win.min().y(), opt.copc_win.max().y());\n    vw_out() << \"Reading COPC LAZ file with bounding box \" << opt.copc_win << \".\\n\";\n  }\n  \n  // Must specify either csv_srs or csv_proj4_str, but not both. The latter is \n  // for backward compatibility.\n  if (!opt.csv_srs.empty() && !opt.csv_proj4_str.empty())\n    vw_throw(ArgumentErr() << \"Cannot specify both --csv-srs and --csv-proj4.\\n\");\n  if (!opt.csv_proj4_str.empty() && opt.csv_srs.empty())\n    opt.csv_srs = opt.csv_proj4_str;\n      \n  // If the user specified an srs to interpret the input in CSV files, use the\n  // same string to create output DEMs, unless the user explicitly sets the\n  // output t_srs string.\n  if (!opt.csv_srs.empty() && opt.target_srs_string.empty()) {\n    vw_out() << \"The --csv-srs option was set, but not --t_srs. Will use the former \"\n             << \"as a substitute for the latter.\\n\";\n    opt.target_srs_string = opt.csv_srs;\n  }\n\n  // If csv_srs is empty, use --t_srs as a substitute.\n  if (opt.csv_srs.empty() && !opt.target_srs_string.empty() && \n      opt.target_srs_string != \"auto\")\n    opt.csv_srs = opt.target_srs_string;\n\n  // This option is now the default so it is obsolete\n  if (opt.auto_proj_center)\n    vw::vw_out(WarningMessage) \n      << \"The --auto-proj-center option is now the default and need not be set.\\n\";\n    \n  // Create the output directory\n  vw::create_out_dir(opt.out_prefix);\n\n  // Turn on logging to file\n  asp::log_to_file(argc, argv, \"\", opt.out_prefix);\n\n  // reference_spheroid and datum are aliases.\n  boost::to_lower(opt.reference_spheroid);\n  boost::to_lower(opt.datum);\n  if (opt.datum != \"\" && opt.reference_spheroid != \"\")\n    vw_throw(ArgumentErr() << \"Both --datum and --reference-spheroid were specified.\\n\");\n  if (opt.datum == \"\")\n    opt.datum = opt.reference_spheroid;\n\n  if      (vm.count(\"sinusoidal\"))            opt.projection = SINUSOIDAL;\n  else if (vm.count(\"mercator\"))              opt.projection = MERCATOR;\n  else if (vm.count(\"transverse-mercator\"))   opt.projection = TRANSVERSEMERCATOR;\n  else if (vm.count(\"orthographic\"))          opt.projection = ORTHOGRAPHIC;\n  else if (vm.count(\"stereographic\"))         opt.projection = STEREOGRAPHIC;\n  else if (vm.count(\"oblique-stereographic\")) opt.projection = OSTEREOGRAPHIC;\n  else if (vm.count(\"gnomonic\"))              opt.projection = GNOMONIC;\n  else if (vm.count(\"lambert-azimuthal\"))     opt.projection = LAMBERTAZIMUTHAL;\n  else if (vm.count(\"utm\"))                   opt.projection = UTM;\n  else if (vm.count(\"geographic\"))            opt.projection = GEOGRAPHIC;\n  else                                        opt.projection = AUTO_DETERMINED;\n\n} // end function handle_arguments()\n\n// Wrapper for rasterize_cloud that goes through all spacing values\nvoid rasterize_cloud_multi_spacing(const ImageViewRef<Vector3>& proj_points,\n                                   DemOptions& opt,\n                                   cartography::GeoReference& georef,\n                                   ImageViewRef<double> const& error_image,\n                                   double estim_max_error,\n                                   vw::BBox3 const& estim_proj_box) {\n\n  asp::OutlierRemovalMethod outlier_removal_method = asp::NO_OUTLIER_REMOVAL_METHOD;\n  if (opt.remove_outliers_with_pct)\n    outlier_removal_method = asp::PERCENTILE_OUTLIER_METHOD;\n  if (opt.use_tukey_outlier_removal) \n    outlier_removal_method = asp::TUKEY_OUTLIER_METHOD; // takes precedence\n  \n  // Perform the slow initialization that can be shared by all output resolutions\n  vw::Mutex count_mutex; // Need to pass in by pointer due to C++ class restrictions\n  \n  // Need to pass in by pointer because we can't get back the number from\n  //  the original rasterizer object otherwise for some reason.\n  std::int64_t num_invalid_pixels = 0;\n  asp::OrthoRasterizerView\n    rasterizer(proj_points.impl(), select_channel(proj_points.impl(),2),\n               opt.search_radius_factor, opt.sigma_factor,\n               asp::ASPGlobalOptions::tri_tile_size(), // to efficiently process the cloud\n               opt.target_projwin, opt.gdal_tap,\n               outlier_removal_method, opt.remove_outliers_params,\n               error_image, estim_max_error, estim_proj_box, opt.max_valid_triangulation_error,\n               opt.median_filter_params, opt.erode_len, opt.has_las_or_csv_or_pcd,\n               opt.filter, opt.default_grid_size_multiplier,\n               &num_invalid_pixels, &count_mutex,\n               TerminalProgressCallback(\"asp\", \"Point cloud extent estimation: \"));\n\n  // Perform other rasterizer configuration\n  rasterizer.set_use_alpha(opt.has_alpha);\n  rasterizer.set_use_min_z_as_default(false);\n  rasterizer.set_default_value(opt.nodata_value);\n\n  std::string base_out_prefix = opt.out_prefix;\n\n  // Call the function for each dem spacing\n  for (size_t i = 0; i < opt.dem_spacing.size(); i++) {\n    double this_spacing = opt.dem_spacing[i];\n\n    // Required second init step for each spacing\n    rasterizer.initialize_spacing(this_spacing);\n\n    // Each spacing gets a variation of the output prefix\n    if (i == 0)\n      opt.out_prefix = base_out_prefix;\n    else // Write later iterations to a different path.\n      opt.out_prefix = base_out_prefix + \"_\" + vw::num_to_str(i);\n    rasterize_cloud(rasterizer, opt, georef, &num_invalid_pixels);\n  } // End loop through spacings\n\n  opt.out_prefix = base_out_prefix; // Restore the original value\n}\n\nint main(int argc, char *argv[]) {\n  \n  DemOptions opt;\n  try {\n    handle_arguments(argc, argv, opt);\n\n    // Need to know for both CSV and point cloud parsing if have the user datum\n    cartography::Datum user_datum;\n    bool have_user_datum = asp::read_user_datum(opt.semi_major, opt.semi_minor,\n                                                opt.datum, user_datum);\n\n    // Configure a CSV converter object according to the input parameters\n    asp::CsvConv csv_conv;\n    csv_conv.parse_csv_format(opt.csv_format_str, opt.csv_srs); // Modifies csv_conv\n    vw::cartography::GeoReference csv_georef;\n    // TODO(oalexan1): The logic below is fragile. Check all locations\n    // where parse_georef is called and see if a datum is always set before being used.\n    if (have_user_datum)\n      csv_georef.set_datum(user_datum); // Set the datum\n    csv_conv.parse_georef(csv_georef); // This alone may not set the datum always\n\n    // Convert any input LAS, CSV, PCD, or unorganized projected TIF files to\n    // ASP's point cloud tif format\n    // - The output and input datum will match unless the input data files\n    //   themselves specify a different datum.\n    // - Should all be XYZ format when finished, unless option \n    //  --input-is-projected is set.\n    // - The names of converted clouds will be updated in opt.pointcloud_files.\n    // - The vector conv_files holds the names of the new files that got created,\n    //   so they can be deleted later.\n    std::vector<std::string> conv_files;\n    chip_convert_to_tif(opt, csv_conv, csv_georef, \n                        opt.pointcloud_files, conv_files); // outputs\n\n    // Generate a merged xyz point cloud consisting of all inputs. By now, each\n    // input exists in xyz tif format.\n    ImageViewRef<Vector3> point_image\n      = asp::form_point_cloud_composite<Vector3>(opt.pointcloud_files,\n                                                 ASP_MAX_SUBBLOCK_SIZE);\n    \n    // Set up the error image\n    ImageViewRef<double> error_image;\n    if (opt.remove_outliers_with_pct || opt.use_tukey_outlier_removal ||\n        opt.max_valid_triangulation_error > 0.0) {\n      error_image = asp::point_cloud_error_image(opt.pointcloud_files);\n      \n      if (error_image.rows() == 0 || error_image.cols() == 0) {\n        vw_out() << \"The point cloud files must have an equal number of channels which \"\n                 << \"must be 4 or 6 to be able to remove outliers.\\n\";\n        opt.remove_outliers_with_pct      = false;\n        opt.use_tukey_outlier_removal     = false;\n        opt.max_valid_triangulation_error = 0.0;\n      }\n    }\n    \n    // Set up the georeferencing information. We specify everything\n    // here except for the affine transform, which is defined later once\n    // we know the bounds of the orthorasterizer view.  However, we can\n    // still reproject the points in the point image without the affine\n    // transform because this projection never requires us to convert to\n    // or from pixel space.\n    GeoReference output_georef;\n\n    // See if we can get a georef from any of the input pc files\n    GeoReference pc_georef;\n    bool have_input_georef = asp::georef_from_pc_files(opt.pointcloud_files, pc_georef);\n    if (have_input_georef)\n      output_georef = pc_georef;\n\n    // If the user set --t_srs, set the output georef to that. If not, set up\n    // the datum for now, and then will set the projection later.\n    if (opt.target_srs_string.empty() || opt.target_srs_string == \"auto\") {\n      if (have_user_datum)\n        output_georef.set_datum(user_datum);\n      else if (!have_input_georef && opt.datum == \"\")\n        vw::vw_throw(vw::ArgumentErr()\n                     << \"A datum, projection, or semi-axes must be set.\\n\");\n    } else {\n      vw::cartography::set_srs_string(opt.target_srs_string, have_user_datum, user_datum, output_georef);\n    }\n\n    // Determine if we should be using a longitude range between [-180, 180] or\n    // [0, 360]. The former is used, unless the latter results in a tighter\n    // range of longitudes, such as when crossing the international date line.\n    // This logic needs the datum only, which is set up by now.\n    vw::BBox2 lonlat_box;\n    if (!opt.input_is_projected) {\n      lonlat_box = asp::estim_lonlat_box(point_image, output_georef.datum());\n      output_georef.set_image_ll_box(lonlat_box);\n    }\n    \n    // Finalize setting the projection. The doc spells out the logic.\n    if (!opt.input_is_projected) {\n      bool good_input_geo = have_input_georef && output_georef.is_projected();\n      if ((opt.target_srs_string.empty() && !good_input_geo) ||\n           opt.target_srs_string == \"auto\") {\n        \n        if (std::isnan(opt.proj_lon) && std::isnan(opt.proj_lat)) // estimate proj center\n          asp::median_lon_lat(point_image, output_georef, opt.proj_lon, opt.proj_lat);\n        // Auto-determine the projection\n        setProjection(opt, output_georef);\n      }\n    }\n    \n    // The provided datums must not be too different  \n    bool warn_only = false; \n    if (!opt.csv_srs.empty())\n      vw::checkDatumConsistency(output_georef.datum(), csv_georef.datum(), warn_only);\n\n    // Convert xyz points to projected points\n    // - The cartesian_to_geodetic call converts invalid (0,0,0,0) points to NaN,\n    //   which is checked for in the OrthoRasterizer class.\n    ImageViewRef<Vector3> proj_points;\n\n    if (opt.input_is_projected) {\n      vw_out() << \"\\t--> Assuming the input cloud is already projected.\\n\";\n      proj_points = point_image;\n    } else {\n      // TODO(oalexan1): Wipe the --x-offset, etc, not used.\n      if (opt.lon_offset != 0 || opt.lat_offset != 0 || opt.height_offset != 0) {\n        vw_out() << \"\\t--> Applying offset: \" << opt.lon_offset\n                << \" \" << opt.lat_offset << \" \" << opt.height_offset << \"\\n\";\n        proj_points\n          = geodetic_to_point         // GDC to XYZ\n          (asp::point_image_offset    // Add user coordinate offset\n            (cartesian_to_geodetic(point_image, output_georef),\n            Vector3(opt.lon_offset, opt.lat_offset, opt.height_offset)\n          ),\n          output_georef);\n      } else {\n        proj_points = geodetic_to_point(cartesian_to_geodetic(point_image, output_georef),\n                                        output_georef);\n      }\n    }\n\n    // Estimate the proj box size, and the max intersection error (if having an error iamge)\n    double estim_max_error = 0.0;\n    BBox3 estim_proj_box;\n    estim_max_error \n      = asp::estim_max_tri_error_and_proj_box(proj_points, error_image,\n                                              opt.remove_outliers_params,\n                                              estim_proj_box);\n\n    // Create the DEM\n    rasterize_cloud_multi_spacing(proj_points, opt, output_georef, error_image,\n                                  estim_max_error, estim_proj_box);\n    // Wipe the temporary converted files\n    for (size_t i = 0; i < conv_files.size(); i++)\n      if (fs::exists(conv_files[i])) \n        fs::remove(conv_files[i]);\n    \n  } ASP_STANDARD_CATCHES;\n\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/point2las.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Convert an ASP point cloud to LAS 1.2 format using PDAL.\n\n/// \\file point2las.cc\n///\n\n#include <asp/Core/Macros.h>\n#include <asp/Core/AspProgramOptions.h>\n#include <asp/Core/AspLog.h>\n#include <asp/Core/PointUtils.h>\n#include <asp/Core/PointCloudRead.h>\n#include <asp/Core/PdalUtils.h>\n\n#include <vw/Cartography/PointImageManipulation.h>\n#include <vw/Core/Stopwatch.h>\n#include <vw/Math/Statistics.h>\n#include <vw/FileIO/DiskImageIO.h>\n#include <vw/FileIO/FileUtils.h>\n#include <vw/Image/ImageChannels.h>\n#include <vw/Image/Statistics.h>\n#include <vw/Cartography/PointImageManipulation.h>\n\n#include <fstream>\n#include <iostream>\n#include <string>\n#include <boost/program_options.hpp>\n\nusing namespace vw;\nnamespace po = boost::program_options;\n\n// A class to collect some positive errors, and return the error at\n// given percentile multiplied by given factor.\nclass PercentileErrorAccum : public ReturnFixedType<void> {\n  typedef double accum_type;\n  std::vector<accum_type> m_vals;\npublic:\n  typedef accum_type value_type;\n  \n  PercentileErrorAccum() { m_vals.clear(); }\n  \n  void operator()( accum_type const& value ) {\n    // Don't add zero errors, those most likely came from invalid points\n    if (value > 0)\n      m_vals.push_back(value);\n  }\n  \n  int size() {\n    return m_vals.size();\n  }\n  \n  value_type value(Vector2 const& outlier_removal_params, bool use_tukey_outlier_removal){\n\n    // Care here with empty sets\n    if (m_vals.empty()) {\n      vw_out() << \"Found no positive triangulation errors in the sample.\\n\";\n      return 0.0;\n    }\n    \n    std::sort(m_vals.begin(), m_vals.end());\n    int len = m_vals.size();\n    vw_out() << \"Collected a sample of \" << len << \" positive triangulation errors.\\n\";\n\n    double mean = vw::math::mean(m_vals);\n    vw_out() << \"For this sample: \"\n             << \"min = \"     << m_vals.front()\n             << \", mean = \"  << mean\n             << \", stdev = \" << vw::math::standard_deviation(m_vals, mean)\n             << \", max = \" << m_vals.back() << \".\" << std::endl;\n\n    int i25 = round((len - 1) * 0.25);\n    int i50 = round((len - 1) * 0.50);\n    int i75 = round((len - 1) * 0.75);\n\n    double Q1 = m_vals[i25];\n    double Q2 = m_vals[i50];\n    double Q3 = m_vals[i75];\n    vw_out() << \"Error percentiles: \" \n             << \"Q1 (25%): \" << Q1 << \", \"\n             << \"Q2 (50%): \" << Q2 << \", \"\n             << \"Q3 (75%): \" << Q3 << \".\"\n             << std::endl;\n\n    if (use_tukey_outlier_removal) {\n      vw_out() << \"Using as outlier cutoff the Tukey formula Q3 + 1.5*(Q3 - Q1).\" << std::endl;\n      return Q3 + 1.5*(Q3 - Q1);\n    }\n    \n    double pct    = outlier_removal_params[0]/100.0; // e.g., 0.75\n    double factor = outlier_removal_params[1];\n    int k         = (int)round((len - 1) * pct);\n    \n    vw_out() << \"Using as outlier cutoff the \" << outlier_removal_params[0] << \" percentile times \"\n             << factor << \".\" << std::endl;\n    \n    return m_vals[k] * factor;\n  }\n\n};\n\nstruct Options: vw::GdalWriteOptions {\n  // Input\n  std::string reference_spheroid, datum;\n  std::string pointcloud_file, intensity_file;\n  std::string target_srs_string;\n  bool        compressed, use_tukey_outlier_removal, ecef, no_input_georef;\n  Vector2     outlier_removal_params;\n  double      max_valid_triangulation_error;\n  int         num_samples;\n  bool save_triangulation_error, save_stddev, dem;\n  \n  // Output\n  std::string out_prefix;\n  Options() : compressed(false), max_valid_triangulation_error(0.0), num_samples(0) {}\n};\n\nvoid handle_arguments(int argc, char *argv[], Options& opt) {\n\n  po::options_description general_options(\"General Options\");\n  general_options.add_options()\n    (\"compressed,c\", \n     po::bool_switch(&opt.compressed)->default_value(false)->implicit_value(true),\n     \"Compress using laszip.\")\n    (\"output-prefix,o\", \n     po::value(&opt.out_prefix), \"Specify the output prefix.\")\n    (\"datum\", po::value(&opt.datum)->default_value(\"\"),\n     \"Create a geo-referenced LAS file in respect to this datum. Options: WGS_1984, D_MOON (1,737,400 meters), D_MARS (3,396,190 meters), MOLA (3,396,000 meters), NAD83, WGS72, and NAD27. Also accepted: Earth (=WGS_1984), Mars (=D_MARS), Moon (=D_MOON).\")\n    (\"reference-spheroid,r\", \n     po::value(&opt.reference_spheroid)->default_value(\"\"),\n     \"This is identical to the datum option.\")\n    (\"t_srs\", po::value(&opt.target_srs_string)->default_value(\"\"),\n     \"Specify the output projection as a GDAL projection string (WKT, GeoJSON, or PROJ). If not provided, will be read from the point cloud, if available.\")\n    (\"remove-outliers-params\", \n     po::value(&opt.outlier_removal_params)->default_value(Vector2(75.0, 3.0), \"pct factor\"),\n     \"Outlier removal based on percentage. Points with triangulation error larger than pct-th percentile times factor will be removed as outliers. [default: pct=75.0, factor=3.0]\")\n    (\"use-tukey-outlier-removal\", \n     po::bool_switch(&opt.use_tukey_outlier_removal)->default_value(false)->implicit_value(true),\n     \"Remove outliers above Q3 + 1.5*(Q3 - Q1). Takes precedence over \"\n     \"--remove-outliers-params.\")\n    (\"max-valid-triangulation-error\", \n     po::value(&opt.max_valid_triangulation_error)->default_value(0.0),\n     \"Outlier removal based on threshold. Points with triangulation error larger than this, if positive (measured in meters) will be removed from the cloud. Takes precedence over the above methods.\")\n    (\"save-intensity-from-image\", po::value(&opt.intensity_file)->default_value(\"\"),\n     \"Save the intensity of each triangulated point, as borrowed from the aligned left \"\n     \"image L.tif specified via this option, in the W field of the LAS file, in double \"\n     \"precision. This bumps the LAS file version from 1.2 to 1.4.\")\n    (\"save-triangulation-error\", \n     po::bool_switch(&opt.save_triangulation_error)->default_value(false),\n     \"Save the triangulation error from the input point cloud as the TextureU field \"\n     \"in the LAS file, in double precision. Take into account the outlier filtering.\"\n     \"This bumps the LAS file version from 1.2 to 1.4\")\n    (\"save-stddev\", \n      po::bool_switch(&opt.save_stddev)->default_value(false),\n      \"Save the standard deviations of the horizontal and vertical components of uncertainty \"\n      \"from the ASP point cloud file to the TextureV and TextureW fields in the LAS file, \"\n      \"in double precision. This bumps the LAS file version from 1.2 to 1.4.\")\n    (\"num-samples-for-outlier-estimation\", \n     po::value(&opt.num_samples)->default_value(1000000),\n     \"Approximate number of samples to pick from the input cloud to find the outlier cutoff based on triangulation error.\")\n    (\"ecef\", \n     po::bool_switch(&opt.ecef)->default_value(false)->implicit_value(true),\n     \"Save the point cloud in ECEF, rather than with a projection relative to a datum.\")\n    (\"dem\", \n      po::bool_switch(&opt.dem)->default_value(false)->implicit_value(true),\n      \"Assume the input file is a DEM.\")\n    (\"no-input-georef\",\n      po::bool_switch(&opt.no_input_georef)->default_value(false)->implicit_value(true),\n      \"Do not attempt to read the georeference from the input point cloud.\")\n    (\"help,h\", \"Display this help message\");\n  \n  general_options.add( vw::GdalWriteOptionsDescription(opt) );\n\n  po::options_description positional(\"\");\n  positional.add_options()\n    (\"input-file\", po::value(&opt.pointcloud_file), \"Input point cloud\");\n\n  po::positional_options_description positional_desc;\n  positional_desc.add(\"input-file\", 1);\n\n  std::string usage(\"[options] <point-cloud>\");\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line(argc, argv, opt, general_options, general_options,\n                            positional, positional_desc, usage,\n                            allow_unregistered, unregistered);\n\n  if (opt.pointcloud_file.empty())\n    vw_throw(ArgumentErr() << \"Missing point cloud.\\n\"\n              << usage << general_options);\n\n  if (opt.out_prefix.empty())\n    opt.out_prefix =\n      vw::prefix_from_filename(opt.pointcloud_file);\n\n  // This is a bug fix. The user by mistake passed in an empty projection string.\n  if (!vm[\"t_srs\"].defaulted() && opt.target_srs_string.empty())\n    vw_throw(ArgumentErr() \n             << \"The value of --t_srs is empty. Then it must not be set at all.\\n\");\n\n  // reference_spheroid and datum are aliases\n  boost::to_lower(opt.reference_spheroid);\n  boost::to_lower(opt.datum);\n  if (opt.datum != \"\" && opt.reference_spheroid != \"\")\n    vw_throw( ArgumentErr() << \"Both --datum and --reference-spheroid were specified.\\n\");\n  if (opt.datum == \"\")\n    opt.datum = opt.reference_spheroid;\n\n  double pct = opt.outlier_removal_params[0], factor = opt.outlier_removal_params[1];\n  if (pct <= 0.0 || pct > 100.0 || factor <= 0.0)\n    vw_throw( ArgumentErr() \n             << \"Invalid values were provided for outlier removal parameters.\\n\");\n\n  if (opt.max_valid_triangulation_error < 0.0) \n    vw_throw( ArgumentErr() \n             << \"The maximum valid triangulation error must be non-negative.\\n\");\n\n  if (opt.num_samples <= 0) \n    vw_throw( ArgumentErr() << \"Must pick a positive number of samples.\\n\");\n\n  // Create the output directory\n  vw::create_out_dir(opt.out_prefix);\n\n  // Turn on logging to file\n  asp::log_to_file(argc, argv, \"\", opt.out_prefix);\n}\n\nvoid find_error_image_and_do_stats(Options& opt, ImageViewRef<double> & error_image) {\n      \n  std::vector<std::string> pointcloud_files;\n  pointcloud_files.push_back(opt.pointcloud_file);\n  error_image = asp::point_cloud_error_image(pointcloud_files);\n  \n  if (error_image.rows() == 0 || error_image.cols() == 0) {\n    vw_out() << \"The point cloud files must have an equal number of channels which \"\n             << \"must be 4 or 6 to be able to remove outliers.\\n\";\n    opt.max_valid_triangulation_error = 0.0;\n    return;\n  }\n\n  if (opt.max_valid_triangulation_error > 0.0) {\n    vw_out() << \"Using the set maximum valid triangulation error as outlier cutoff: \"\n             << opt.max_valid_triangulation_error << \".\" << std::endl;\n    return;\n  }\n    \n  vw_out() << \"Estimating the maximum valid triangulation error (outlier cutoff).\\n\";\n    \n  int num_err_cols = error_image.cols();\n  int num_err_rows = error_image.rows();\n    \n  double area = std::max(num_err_cols * num_err_rows, 1);\n  int sample_rate = round(sqrt(double(area) / double(opt.num_samples)));\n  if (sample_rate < 1) \n    sample_rate = 1;\n    \n  Stopwatch sw;\n  sw.start();\n  PixelAccumulator<PercentileErrorAccum> error_accum;\n  for_each_pixel(subsample(error_image, sample_rate),\n                 error_accum,\n                 TerminalProgressCallback\n                 (\"asp\", \"Error estim: \"));\n\n  opt.max_valid_triangulation_error = error_accum.value(opt.outlier_removal_params,\n                                                        opt.use_tukey_outlier_removal);\n  \n  sw.stop();\n  vw_out(DebugMessage, \"asp\") << \"Elapsed time: \" << sw.elapsed_seconds() << std::endl;\n  vw_out() << \"Found the maximum valid triangulation error (outlier cutoff): \"\n           << opt.max_valid_triangulation_error << \".\" << std::endl;\n}\n\n// Read a DEM and convert it to having projected points and elevation\nvoid read_dem(std::string const& pointcloud_file, \n              bool ecef, bool no_input_georef,\n              bool & has_georef,\n              cartography::GeoReference & georef,\n              ImageViewRef<Vector3> & point_image) {\n\n  has_georef = vw::cartography::read_georeference(georef, pointcloud_file);\n  \n  // Sanity checks\n  if (!has_georef)\n    vw::vw_throw(vw::ArgumentErr() \n              << \"The input DEM file does not have a georeference.\\n\");\n  if (ecef)\n    vw::vw_throw(vw::ArgumentErr() \n              << \"Options --ecef and --dem are not compatible.\\n\");\n    if (no_input_georef) \n    vw::vw_throw(vw::ArgumentErr() \n              << \"Options --no-input-georef and --dem are not compatible.\\n\");\n    \n  double nodata_val = -std::numeric_limits<double>::max();\n  vw::read_nodata_val(pointcloud_file, nodata_val);\n  \n  // Form the point image as projected coordinates and elevation\n  vw::DiskImageView<double> dem(pointcloud_file);\n  point_image = vw::cartography::dem_to_proj(vw::create_mask(dem, nodata_val), georef);\n}\n\nint main(int argc, char *argv[]) {\n  \n  // TODO(oalexan1): need to understand what is the optimal strategy\n  // for traversing the input point cloud file to minimize the reading\n  // time.\n\n  Options opt;\n  try {\n    handle_arguments(argc, argv, opt);\n\n    cartography::Datum datum;\n    cartography::GeoReference georef;\n    bool have_user_datum = false, have_input_georef = false;\n    bool have_out_georef = false;\n    ImageViewRef<Vector3> point_image;\n    \n    if (!opt.dem) {\n      if (!opt.ecef) {\n        have_user_datum = asp::read_user_datum(0, 0, opt.datum, datum);\n        if (!opt.no_input_georef)\n          have_input_georef = vw::cartography::read_georeference(georef, opt.pointcloud_file);\n        if (have_input_georef && opt.target_srs_string.empty())\n          opt.target_srs_string = georef.get_wkt();\n      \n        if (have_user_datum || !opt.target_srs_string.empty()) {\n          // Set the srs string into georef\n          vw::cartography::set_srs_string(opt.target_srs_string,\n                              have_user_datum, datum, georef);\n          have_out_georef = true;\n          datum = georef.datum();\n        }\n      }\n\n      // Save the las file with given georeference, if present\n      point_image = asp::read_asp_point_cloud_3(opt.pointcloud_file);\n      \n      if (have_out_georef) {\n        // See if to use [-180, 180] or [0, 360]\n        vw::BBox2 lonlat_box = asp::estim_lonlat_box(point_image, georef.datum());\n        georef.set_image_ll_box(lonlat_box);\n        // Convert cartesian to projected coordinates via geodetic\n        point_image = cartesian_to_geodetic(point_image, datum);\n        point_image = geodetic_to_point(point_image, georef);\n      }\n    } else {\n      // The input is a DEM. Resulting point_image will be in projected_coordinates.\n      read_dem(opt.pointcloud_file, opt.ecef, opt.no_input_georef,\n              have_out_georef, georef, point_image);\n      datum = georef.datum();\n      have_out_georef = true; \n    }\n    \n    // The error image, if provided\n    ImageViewRef<double> error_image;\n    if (opt.outlier_removal_params[0] < 100.0 || opt.max_valid_triangulation_error > 0.0)\n      find_error_image_and_do_stats(opt, error_image);\n\n    // The intensity image, if provided\n    vw::ImageViewRef<float> intensity;\n    if (opt.intensity_file != \"\")\n      intensity = DiskImageView<float>(opt.intensity_file);\n\n    // For saving the stddev\n    vw::ImageViewRef<vw::Vector6> full_point_image; \n    vw::ImageViewRef<double> horizontal_stddev, vertical_stddev;\n    if (opt.save_stddev) {\n      std::vector<std::string> pointcloud_files;\n      pointcloud_files.push_back(opt.pointcloud_file);\n\n      bool has_sd = asp::has_stddev(pointcloud_files);\n      if (!has_sd)\n        vw_throw(ArgumentErr() << \"The input point cloud file does not have \"\n                 << \"standard deviations.\\n\");\n\n      full_point_image \n        = asp::form_point_cloud_composite<vw::Vector6>(pointcloud_files, \n                                                       ASP_MAX_SUBBLOCK_SIZE);\n      // Channel 3 is the error image, 4 and 5 are the stddevs\n      horizontal_stddev = vw::select_channel(full_point_image, 4);\n      vertical_stddev   = vw::select_channel(full_point_image, 5);\n    }\n\n    BBox3 cloud_bbox = asp::pointcloud_bbox(point_image, have_out_georef);\n\n    // The las format stores the values as 32 bit integers. So, for a\n    // given point, we store round((point-offset)/scale), as well as\n    // the offset and scale values. Here we decide the values for\n    // offset and scale to lose minimum amount of precision. We make\n    // the scale almost as large as it can be without causing integer overflow.\n    // TODO(oalexan1): This can have its own issues if later\n    // this cloud is shifted a lot. Better pick more sensible\n    // scale. 1 mm should be enough. Note that sometimes\n    // the coordinates are in degrees, not in meters.\n    Vector3 offset = (cloud_bbox.min() + cloud_bbox.max())/2.0;\n    double  maxInt = std::numeric_limits<int32>::max();\n    maxInt *= 0.95; // Just in case stay a bit away\n    Vector3 scale  = cloud_bbox.size()/(2.0*maxInt);\n    for (size_t i = 0; i < scale.size(); i++)\n      if (scale[i] <= 0.0) scale[i] = 1.0e-16; // avoid degeneracy\n\n    asp::write_las(have_out_georef, georef, \n                   point_image, error_image, intensity,\n                   horizontal_stddev, vertical_stddev,\n                   offset, scale, opt.compressed, \n                   opt.save_triangulation_error,\n                   opt.max_valid_triangulation_error,\n                   opt.out_prefix);\n    return 0;\n    \n  } ASP_STANDARD_CATCHES;\n\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/point2mesh.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n/// \\file point2mesh2.cc\n///\n\n#include <asp/Core/AspLog.h>\n#include <asp/Core/AspProgramOptions.h>\n#include <asp/Core/Macros.h>\n#include <asp/Core/PointCloudRead.h>\n#include <asp/Core/PointUtils.h>\n\n#include <vw/Cartography/PointImageManipulation.h>\n#include <vw/FileIO/DiskImageUtils.h>\n#include <vw/FileIO/FileUtils.h>\n#include <vw/Image/Algorithms.h>\n#include <vw/Image/Filter.h>\n#include <vw/Image/Manipulation.h>\n#include <vw/Image/MaskViews.h>\n#include <vw/Image/Transform.h>\n\n#include <stdlib.h>\n#include <string.h>\n#include <assert.h>\n#include <stdio.h>\n#include <stddef.h>\n#include <math.h>\n\n#include <boost/filesystem.hpp>\n\nusing namespace vw;\nusing namespace vw::cartography;\nnamespace po = boost::program_options;\n\nstruct Options : vw::GdalWriteOptions {\n  Options() {};\n  // Input\n  std::string pointcloud_filename, texture_file_name;\n\n  // Settings\n  int point_cloud_step_size, texture_step_size, precision;\n  bool center;\n\n  // Output\n  std::string output_prefix, output_file_type;\n};\n\n// Create a blank float image of given size\nclass BlankImage: public ReturnFixedType<float> {\npublic:\n  float operator()(Vector3 const& v) const {\n    return 1.0;\n  }\n};\n\n// Form the mtl file having the given png texture\nvoid save_mtl(std::string const& output_prefix, std::string const& output_prefix_no_dir) {\n  \n  std::string mtl_file = output_prefix + \".mtl\";\n  std::cout << \"Writing: \" << mtl_file << std::endl;\n\n  std::ofstream ofs(mtl_file.c_str());\n  ofs << \"newmtl material0000\\n\";\n  ofs << \"Ka 1.000000 1.000000 1.000000\\n\";\n  ofs << \"Kd 1.000000 1.000000 1.000000\\n\";\n  ofs << \"Ks 0.000000 0.000000 0.000000\\n\";\n  ofs << \"Tr 0.000000\\n\";\n  ofs << \"illum 1\\n\";\n  ofs << \"Ns 1.000000\\n\";\n  ofs << \"map_Kd \" << output_prefix_no_dir << \".png\\n\";\n  ofs.close();\n}\n\nvoid save_texture(std::string const& output_prefix, ImageViewRef<float> texture_image) {\n  std::string texture_file = output_prefix + \".png\";\n  std::cout << \"Writing: \" << texture_file << std::endl;\n  //DiskImageView<PixelGray<uint8> > new_texture(tex_file+\".tif\");\n\n  double image_min = 0.0, image_max = 1.0;\n  ImageViewRef<float> normalized_image =\n    normalize(texture_image, image_min, image_max, 0.0, 1.0);\n\n  write_image(texture_file, normalized_image);\n}\n\n// A point at the center of the planet or which has NaN elements cannot be valid\ninline bool is_valid_pt(Vector3 const& P) {\n  if (P != P || P == Vector3()) \n    return false;\n  return true;\n}\n\n// Add a given vertex to the .obj file unless already present\ninline void add_vertex(Vector3 const& V, std::pair<int, int> const& pix,\n                       int cloud_cols, int cloud_rows,\n                       std::ofstream & ofs,\n                       std::map<std::pair<int, int>, int> & pix_to_vertex,\n                       int & vertex_count) {\n  if (pix_to_vertex.find(pix) == pix_to_vertex.end()) {\n    ofs << \"v \" << V[0] << \" \" << V[1] << \" \" << V[2] << '\\n';\n\n    double u = double(pix.first)/cloud_cols;\n    \n    // TODO(oalexan1). Study this. The second option looks more accurate.\n    // In the second option the lower-left pixel (0, cloud_rows - 1)\n    // gets mapped to (u, v) = (0, 0). This seems correct per:\n    // https://computergraphics.stackexchange.com/questions/9339/convert-image-pixel-dimensions-to-uv\n    // In some places on the net I even saw a subpixel shift of (0.5, 0.5)\n    // which makes things even more complicated.\n#if 0\n    double v = double(pix.second)/cloud_rows;\n    ofs << \"vt \" << u  << ' ' << 1.0 - v << std::endl;\n#else\n    double v = double(cloud_rows - 1 - pix.second)/cloud_rows;\n    ofs << \"vt \" << u  << ' ' << v << std::endl;\n#endif\n    \n    pix_to_vertex[pix] = vertex_count;\n    vertex_count++;\n  }\n}\n\nvoid save_mesh(std::string const& output_prefix,\n               std::string const& output_prefix_no_dir,\n               ImageViewRef<Vector3> point_cloud,\n               Vector3 C, int precision) {\n\n  std::string mesh_file = output_prefix + \".obj\";\n  std::cout << \"Writing: \" << mesh_file << std::endl;\n  std::ofstream ofs(mesh_file.c_str());\n  ofs.precision(precision);\n  ofs << \"mtllib \" << output_prefix_no_dir << \".mtl\\n\";\n\n  // Some constants for the calculation in here\n  int cloud_cols = point_cloud.cols();\n  int cloud_rows = point_cloud.rows();\n  \n  TerminalProgressCallback vertex_progress(\"asp\", \"\\tVertices:   \");\n  double vertex_progress_mult = 1.0/double(std::max(cloud_cols - 1, 1));\n\n  // Make sure we we save a vertex only once even if we encounter it\n  // multiple times.\n  std::map<std::pair<int, int>, int> pix_to_vertex;\n    \n  std::vector<Vector3i> faces;\n  int vertex_count = 1; // The obj spec calls for the starting vertex to have index 1.\n  for (int col = 0; col < cloud_cols - 1; col++) {\n    vertex_progress.report_progress(col*vertex_progress_mult);\n    \n    for (int row = 0; row < cloud_rows - 1; row++) {\n      // We have a square that needs to be split into two triangles.\n      // Here the image is viewed as having the origin on the upper-left,\n      // the column axis going right, and the row axis going down.\n      std::pair<int, int> pix_ul = std::make_pair(col,     row);\n      std::pair<int, int> pix_ur = std::make_pair(col + 1, row);\n      std::pair<int, int> pix_ll = std::make_pair(col,     row + 1);\n      std::pair<int, int> pix_lr = std::make_pair(col + 1, row + 1);\n      Vector3 UL = point_cloud(pix_ul.first, pix_ul.second);\n      Vector3 UR = point_cloud(pix_ur.first, pix_ur.second);\n      Vector3 LL = point_cloud(pix_ll.first, pix_ll.second);\n      Vector3 LR = point_cloud(pix_lr.first, pix_lr.second);\n\n      if (is_valid_pt(UL) && is_valid_pt(LL) && is_valid_pt(UR)) {\n\n        add_vertex(UL - C, pix_ul, cloud_cols, cloud_rows, ofs, pix_to_vertex, vertex_count);\n        add_vertex(LL - C, pix_ll, cloud_cols, cloud_rows, ofs, pix_to_vertex, vertex_count);\n        add_vertex(UR - C, pix_ur, cloud_cols, cloud_rows, ofs, pix_to_vertex, vertex_count);\n\n        Vector3 face(pix_to_vertex[pix_ul], pix_to_vertex[pix_ll], pix_to_vertex[pix_ur]);\n        faces.push_back(face);\n      }\n      \n      if (is_valid_pt(UR) && is_valid_pt(LL) && is_valid_pt(LR)) {\n\n        add_vertex(UR - C, pix_ur, cloud_cols, cloud_rows, ofs, pix_to_vertex, vertex_count);\n        add_vertex(LL - C, pix_ll, cloud_cols, cloud_rows, ofs, pix_to_vertex, vertex_count);\n        add_vertex(LR - C, pix_lr, cloud_cols, cloud_rows, ofs, pix_to_vertex, vertex_count);\n\n        Vector3 face(pix_to_vertex[pix_ur], pix_to_vertex[pix_ll], pix_to_vertex[pix_lr]);\n        faces.push_back(face);\n      }\n      \n    }\n  }\n  vertex_progress.report_finished();\n\n  TerminalProgressCallback face_progress(\"asp\", \"\\tFaces:   \");\n  double face_progress_mult = 1.0/double(std::max(faces.size(), size_t(1)));\n  for (size_t face_iter = 0; face_iter < faces.size(); face_iter++) {\n    face_progress.report_progress(face_iter*face_progress_mult);\n\n    Vector3 const& F = faces[face_iter]; // alias\n    ofs << \"f \"\n        << F[0] << \"/\" << F[0] << \" \"\n        << F[1] << \"/\" << F[1] << \" \"\n        << F[2] << \"/\" << F[2]\n        << std::endl;\n  }\n  face_progress.report_finished();\n}\n\nvoid handle_arguments( int argc, char *argv[], Options& opt ) {\n  po::options_description general_options(\"\");\n  general_options.add_options()\n    (\"point-cloud-step-size,s\", po::value(&opt.point_cloud_step_size)->default_value(10),\n     \"Sampling step for the point cloud. Pick one out of these many samples.\")\n    (\"texture-step-size\", po::value(&opt.texture_step_size)->default_value(2),\n     \"Sampling step for the texture. Pick one out of these many samples.\")\n    (\"output-prefix,o\", po::value(&opt.output_prefix),\n     \"Specify the output prefix.\")\n    (\"center\", po::bool_switch(&opt.center)->default_value(false),\n     \"Let the origin be the midpoint of the bounding box of the cloud. Use this option if you are experiencing numerical precision issues.\")\n    (\"precision\", po::value(&opt.precision)->default_value(17),\n     \"How many digits of precision to save.\");\n  \n  general_options.add( vw::GdalWriteOptionsDescription(opt) );\n\n  po::options_description positional(\"\");\n  positional.add_options()\n    (\"input-file\", po::value(&opt.pointcloud_filename),\n       \"Explicitly specify the input file\")\n    (\"texture-file\", po::value(&opt.texture_file_name),\n       \"Explicity specify the texture file\");\n\n  po::positional_options_description positional_desc;\n  positional_desc.add(\"input-file\", 1);\n  positional_desc.add(\"texture-file\", 1);\n\n  std::string usage(\"[options] <pointcloud> <texture-file>\");\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line(argc, argv, opt, general_options, general_options,\n                             positional, positional_desc, usage,\n                             allow_unregistered, unregistered);\n\n  if (opt.pointcloud_filename.empty())\n    vw_throw(ArgumentErr() << \"Missing point cloud.\\n\"\n              << usage << general_options);\n  if ( opt.output_prefix.empty() )\n    opt.output_prefix =\n      asp::prefix_from_pointcloud_filename( opt.pointcloud_filename );\n\n  if (opt.point_cloud_step_size <= 0)\n    vw_throw(ArgumentErr() << \"Step size must be positive.\\n\"\n             << usage << general_options);\n  \n  if (opt.precision <= 0)\n    vw_throw(ArgumentErr() << \"Precision must be positive.\\n\"\n             << usage << general_options);\n\n  // It is useful to have this to make the p\n  if (opt.point_cloud_step_size % opt.texture_step_size != 0) \n    vw_throw(ArgumentErr() << \"--point-cloud-step-size must be a multiple \"\n             << \"of --texture-step-size.\\n\"\n             << usage << general_options);\n\n  // Create the output directory\n  vw::create_out_dir(opt.output_prefix);\n\n  // Turn on logging to file\n  asp::log_to_file(argc, argv, \"\", opt.output_prefix);\n}\n\nint main(int argc, char *argv[]){\n\n  Options opt;\n  try {\n    handle_arguments(argc, argv, opt);\n\n    std::string input_file = opt.pointcloud_filename;\n    int num_channels = get_num_channels(input_file);\n    GeoReference georef;\n    bool has_georef = read_georeference(georef, input_file);\n    double nodata_val = -std::numeric_limits<double>::max();\n    vw::read_nodata_val(input_file, nodata_val);\n\n    Vector2 image_size = vw::file_image_size(input_file);\n    \n    vw_out() << \"\\t--> Original cloud size: \"\n             << image_size[0] << \" x \" << image_size[1] << \"\\n\";\n    \n    // Loading point cloud\n    ImageViewRef<Vector3> point_cloud;\n    if (num_channels == 1 && has_georef) {\n      // The input is a DEM. Convert it to a point cloud.\n      DiskImageView<double> dem(input_file);\n      point_cloud = vw::subsample(geodetic_to_cartesian(dem_to_geodetic\n                                                        (create_mask(dem, nodata_val), georef),\n                                                        georef.datum()),\n                                  opt.point_cloud_step_size);\n    }else if (num_channels >= 3){\n      // The input DEM is a point cloud\n      point_cloud = vw::subsample(asp::read_asp_point_cloud_3(input_file),\n                                  opt.point_cloud_step_size);\n    }else{\n      vw_throw( ArgumentErr() << \"The input must be a point cloud or a DEM.\\n\");\n    }\n\n    vw_out() << \"\\t--> Subsampled cloud size:   \"\n             << point_cloud.cols() << \" x \" << point_cloud.rows() << \"\\n\";\n    \n    // Centering option (helpful if you are experiencing round-off error)\n    Vector3 C(0, 0, 0);\n    if (opt.center) {\n      bool is_geodetic = false; // raw xyz values\n      BBox3 bbox = asp::pointcloud_bbox(point_cloud, is_geodetic);\n      vw_out() << \"\\t--> Setting as the origin the bounding box midpoint.\\n\";\n      vw_out() << std::setprecision(17) << \"\\t    Bounding box: \" << bbox << \"\\n\";\n      C = (bbox.max() + bbox.min()) / 2.0;\n      vw_out() << std::setprecision(17) << \"\\t    Midpoint: \" << C << \"\\n\";\n    }\n    \n    ImageViewRef<float> texture_image;\n    \n    // Resample the image if it is too fine.\n    if ( !opt.texture_file_name.empty() ) {\n      texture_image = vw::subsample(DiskImageView<float>(opt.texture_file_name),\n                                    opt.texture_step_size);\n    } else {\n      // Use a blank texture image with each pixel being white\n      texture_image = per_pixel_filter(point_cloud, BlankImage());\n    }\n    \n    boost::filesystem::path p(opt.output_prefix);\n    std::string output_prefix_no_dir = p.filename().string();\n  \n    save_mesh(opt.output_prefix, output_prefix_no_dir,\n              point_cloud, C, opt.precision);\n    \n    save_texture(opt.output_prefix, texture_image);\n    \n    save_mtl(opt.output_prefix, output_prefix_no_dir);\n    \n  } ASP_STANDARD_CATCHES;\n\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/prism2asp.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2024, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Parse PRISM data and produce CSM camera files\n// Reference: https://elib.dlr.de/57440/1/Schneider.pdf\n\n// TODO(oalexan1): Many of these need to go when the code is modularized\n#include <asp/Sessions/StereoSession.h>\n#include <asp/Sessions/StereoSessionFactory.h>\n#include <asp/Camera/PRISM_XML.h>\n#include <asp/Camera/CsmModel.h>\n#include <asp/Camera/LinescanUtils.h>\n#include <asp/Camera/CsmUtils.h>\n#include <asp/Camera/CsmModelFit.h>\n#include <asp/Camera/SatSim.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/AspProgramOptions.h>\n#include <asp/Core/AspLog.h>\n#include <asp/Core/Macros.h>\n#include <asp/Core/CamPoseUtils.h>\n#include <asp/Core/CameraTransforms.h>\n\n#include <vw/FileIO/DiskImageView.h>\n#include <vw/Cartography/Datum.h>\n#include <vw/Cartography/GeoReference.h>\n#include <vw/Cartography/GeoReferenceBaseUtils.h>\n#include <vw/FileIO/FileUtils.h>\n\n#include <boost/filesystem.hpp>\n#include <boost/program_options.hpp>\n\nnamespace po = boost::program_options;\nnamespace fs = boost::filesystem;\n\nstruct Options: public vw::GdalWriteOptions {\n  std::string dim_file, csm_file, dem;\n  int ccd;\n\n  // Constructor\n  Options() {}\n};\n\nvoid handle_arguments(int argc, char *argv[], Options& opt) {\n\n  po::options_description general_options(\"\");\n  general_options.add_options()\n    (\"dim\", po::value(&opt.dim_file)->default_value(\"\"),\n     \"The input PRISM .DIMA file.\")\n    (\"ccd\", po::value(&opt.ccd)->default_value(-1),\n     \"The CCD id to use. Must be between 1 and 6 or 8, depending on view (F, N, A).\")\n    (\"csm\", po::value(&opt.csm_file)->default_value(\"\"),\n     \"The output CSM camera file.\")\n    (\"dem\", po::value(&opt.dem)->default_value(\"\"),\n     \"A reference DEM for the site.\")\n  ;\n\n  general_options.add(vw::GdalWriteOptionsDescription(opt));\n\n  po::options_description positional(\"\");\n  po::positional_options_description positional_desc;\n\n  std::string usage(\"[options]\");\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line(argc, argv, opt, general_options, general_options,\n                            positional, positional_desc, usage,\n                            allow_unregistered, unregistered);\n\n  // The dim file is required\n  if (opt.dim_file.empty())\n    vw::vw_throw(vw::ArgumentErr() << \"Missing the input .DIMA file.\\n\"\n                 << usage << general_options);\n\n  // The output file is required\n  if (opt.csm_file.empty())\n    vw::vw_throw(vw::ArgumentErr() << \"Missing the output CSM file.\\n\");\n\n  // The CCD must be positive\n  if (opt.ccd < 1)\n    vw::vw_throw(vw::ArgumentErr() << \"The CCD id must be positive.\\n\");\n\n  // The reference DEM is required\n  if (opt.dem.empty())\n    vw::vw_throw(vw::ArgumentErr() << \"Missing the reference DEM.\\n\");\n\n  // Create the output directory\n  vw::create_out_dir(opt.csm_file);\n\n  // Turn on logging to file\n  std::string out_prefix = opt.csm_file;\n  // Remove the extension, which is the text after the last dot\n  size_t pos = out_prefix.rfind(\".\");\n  if (pos != std::string::npos)\n    out_prefix = out_prefix.substr(0, pos);\n  asp::log_to_file(argc, argv, \"\", out_prefix);\n\n} // End function handle_arguments\n\n// Given a vector of values and a spacing, check that the values have\n// that spacing, with given tolerance.\nvoid checkSpacing(std::vector<double> const& vals, double spacing, double tol,\n                  std::string const& tag) {\n\n  // The spacing must be positive\n  if (spacing <= 0)\n    vw::vw_throw(vw::ArgumentErr() << \"Expecting positive time spacing between samples.\\n\");\n\n  for (size_t i = 1; i < vals.size(); i++) {\n    double diff = vals[i] - vals[i-1];\n    double err = std::abs(diff - spacing);\n    if (err > tol)\n      vw::vw_throw(vw::ArgumentErr() << \"Expecting all \" << tag\n        << \" values to be spaced by \" << spacing << \". Found a discrepancy of \"\n        << err << \" seconds at index \" << i << \".\\n\");\n  }\n\n  return;\n}\n\n// A function to create a georeference in stereographic coordinates\n// at given position with given datum.\nvoid produceStereographicGeoref(vw::Vector3 const& pos,\n                                vw::cartography::Datum const& datum,\n                                vw::cartography::GeoReference & georef) {\n\n  // Create a georeference at the last position\n  vw::Vector3 llh = datum.cartesian_to_geodetic(pos);\n  georef.set_datum(datum);\n  double scale  = 1.0, false_easting = 0.0, false_northing = 0.0;\n  georef.set_stereographic(llh[1], llh[0], scale, false_easting, false_northing);\n\n  return;\n}\n\n// TODO(oalexan1): Move this to a better place\n// Given a set of orbital positions acquired at with uniform time spacing,\n// corresponding velocities, the times, the time spacing, extrapolate one more\n// position by fitting a parabola. This was shown to given results to within 1\n// km. Do this in projected coordinates, where the curvature is less, and the\n// error was validated to be half as much. Do this for velocity in ECEF. Add to\n// the time by incrementing the last time by the time interval.\nvoid extrapolatePosition(vw::cartography::Datum const& datum,\n                         double                        dt,\n                         std::vector<double>         & times,\n                         std::vector<vw::Vector3>    & positions,\n                         std::vector<vw::Vector3>    & velocities) {\n\n  // Must have at least 3 positions\n  if (positions.size() < 3)\n    vw::vw_throw(vw::ArgumentErr() << \"Expecting at least 3 positions for parabola \"\n                  \"extrapolation.\\n\");\n\n  // The time spacing must be positive\n  if (dt <= 0)\n    vw::vw_throw(vw::ArgumentErr() << \"Expecting positive time spacing between samples.\\n\");\n\n  // Sanity check for spacing\n  double tol = 1e-6;\n  checkSpacing(times, dt, tol, \"position\");\n\n  // Produce a georef at the last position\n  vw::cartography::GeoReference georef;\n  produceStereographicGeoref(positions.back(), datum, georef);\n\n  // Find projected coordinates\n  std::vector<vw::Vector3> projections(positions.size());\n  for (size_t i = 0; i < positions.size(); i++)\n    projections[i]\n      = georef.geodetic_to_point(georef.datum().cartesian_to_geodetic(positions[i]));\n\n  // We do the extrapolation at every position, to be able to check how we are\n  // doing before the final extrapolation.\n  int num_pos = positions.size(); // the position size will grow, but this will not\n\n  for (int i = 2; i < num_pos; i++) {\n\n    vw::Vector3 u = projections[i-2];\n    vw::Vector3 v = projections[i-1];\n    vw::Vector3 w = projections[i];\n\n    // Extrapolate by fitting a parabola\n    vw::Vector3 next_proj = u - 3 * v + 3 * w;\n    vw::Vector3 next_pos\n      = georef.datum().geodetic_to_cartesian(georef.point_to_geodetic(next_proj));\n\n    // Do this for velocity as well\n    u = velocities[i-2];\n    v = velocities[i-1];\n    w = velocities[i];\n    vw::Vector3 next_vel = u - 3 * v + 3 * w;\n\n    // if we are not at the end, see how this prediction compares\n    #if 0\n    if (i < num_pos - 1) {\n      std::cout << \"Error in extrapolation at position \" << i << \" is = \"\n        << vw::math::norm_2(positions[i+1] - next_pos) << std::endl;\n\n      std::cout << \"Error in extrapolation at velocity \" << i << \" is = \"\n        << vw::math::norm_2(velocities[i+1] - next_vel) << std::endl;\n    }\n    #endif\n\n    if (i == num_pos - 1) {\n      // Append the new position, last velocity, and a new time\n      positions.push_back(next_pos);\n      velocities.push_back(next_vel);\n      times.push_back(times.back() + dt);\n    }\n  }\n\n  return;\n}\n\nvoid createCsmModel(double first_line_time, double dt_line,\n                    double t0_ephem, double dt_ephem, double focal_length,\n                    double roll, double pitch, double yaw,\n                    std::string              const& view,\n                    vw::Vector2              const& optical_center,\n                    vw::Vector2              const& image_size,\n                    vw::cartography::Datum   const& datum,\n                    std::vector<vw::Vector3> const& positions,\n                    std::vector<vw::Vector3>const & velocities,\n                    std::vector<vw::Vector3> const& rpy,\n                    asp::CsmModel& model) {\n\n  // Create a georeference at the last position\n  vw::cartography::GeoReference georef;\n  produceStereographicGeoref(positions.back(), datum, georef);\n\n  // TODO(oalexan1): This is wrong. The positions and rpy arrays\n  // have different sizes and are at different times.\n\n  // Assemble the cam2world matrices\n  std::vector<vw::Matrix3x3> cam2world(positions.size());\n  for (size_t i = 0; i < positions.size(); i++) {\n\n    vw::Vector3 beg_pos = positions[i];\n    // Normalized velocity\n    vw::Vector3 vel = velocities[i];\n    vel = vel / vw::math::norm_2(vel);\n    vw::Vector3 end_pos = beg_pos + asp::satSimDelta() * vel;\n\n    vw::Vector3 llh = georef.datum().cartesian_to_geodetic(beg_pos);\n\n    vw::Vector3 beg_proj\n      = georef.geodetic_to_point(georef.datum().cartesian_to_geodetic(beg_pos));\n    vw::Vector3 end_proj\n      = georef.geodetic_to_point(georef.datum().cartesian_to_geodetic(end_pos));\n\n    vw::Vector3 proj_along, proj_across;\n    asp::calcProjAlongAcross(beg_proj, end_proj, proj_along, proj_across);\n\n    vw::Vector3 along, across; // ECEF\n    asp::calcEcefAlongAcross(georef, asp::satSimDelta(),\n                              proj_along, proj_across, beg_proj,\n                              along, across);\n\n    vw::Vector3 down = vw::math::cross_prod(along, across);\n    down = down / vw::math::norm_2(down);\n\n    // The satellite orientation if perfectly aligned with the trajectory\n    vw::Matrix3x3 sat2world;\n    asp::assembleCam2WorldMatrix(along, across, down, sat2world);\n\n    // Adjust for the measured roll-pitch-yaw of the satellite from the PRISM data\n    vw::Matrix3x3 sat2sat = asp::rollPitchYaw(rpy[i][0], rpy[i][1], rpy[i][2]);\n\n    // Go from satellite orientation to sensor orientation\n    vw::Matrix3x3 cam2sat = asp::rollPitchYaw(roll, pitch, yaw);\n\n    // It looks that the PRISM camera is mounted in reverse, so need to use\n    // the inverse of the rotation matrix.\n    vw::Matrix3x3 cam2cam = vw::math::inverse(asp::rotationXY());\n\n    // Put it all together\n    cam2world[i] = sat2world * sat2sat * cam2sat * cam2cam;\n  }\n\n  // Form and save the camera\n  asp::populateCsmLinescan(first_line_time, dt_line,\n                            t0_ephem, dt_ephem,\n                            t0_ephem, dt_ephem,  // for poses\n                            //t0_quat, dt_quat, // for later\n                            focal_length, optical_center, image_size, datum, view,\n                            positions, velocities, cam2world, model);\n}\n\n// Put this in a function and compute the total error\ndouble calcCornersError(vw::cartography::GeoReference const& dem_georef,\n                        vw::ImageViewRef<vw::PixelMask<float>> const& interp_dem,\n                        std::vector<vw::Vector2> const& lonlat_vec,\n                        std::vector<vw::Vector2> const& raw_pix_vec,\n                        asp::CsmModel const& model) {\n\n  // Check that lonlat and raw_pix have the same size\n  if (lonlat_vec.size() != raw_pix_vec.size())\n    vw::vw_throw(vw::ArgumentErr()\n                 << \"Expecting the same number of lonlat and raw pixel corners.\\n\");\n  // Must have at least one element\n  if (lonlat_vec.empty())\n    vw::vw_throw(vw::ArgumentErr() << \"Expecting at least one corner.\\n\");\n\n  double total_err = 0;\n  for (int i = 0; i < lonlat_vec.size(); i++) {\n    vw::Vector2 lonlat = lonlat_vec[i];\n    vw::Vector2 raw_pix = raw_pix_vec[i];\n    vw::Vector2 dem_pix = dem_georef.lonlat_to_pixel(lonlat);\n    auto dem_ht = interp_dem(dem_pix[0], dem_pix[1]);\n    if (!vw::is_valid(dem_ht))\n      vw::vw_throw(vw::ArgumentErr() << \"Could not interpolate into the DEM.\\n\");\n    vw::Vector3 llh(lonlat[0], lonlat[1], dem_ht.child());\n    vw::Vector3 xyz = dem_georef.datum().geodetic_to_cartesian(llh);\n    vw::Vector2 cam_pix = model.point_to_pixel(xyz);\n    double err = vw::math::norm_2(cam_pix - raw_pix);\n    total_err += err;\n  }\n\n  return total_err;\n}\n\n#if 0\n// A bare-bone minimizer to make the lon-lat corners project to the raw pixel corners.\n//  This does grid search, than makes a smaller grid around the most promising point.\nvoid findBestParams() {\n  \n  // Put ul_lonlat and ur_lonlat into a vector, and same for raw pixel corners\n  std::vector<vw::Vector2> lonlat_vec = {ul_lonlat, ur_lonlat, ll_lonlat, lr_lonlat};\n  std::vector<vw::Vector2> raw_pix_vec = {ul_raw_pix, ur_raw_pix, ll_raw_pix, lr_raw_pix};\n  calcCornersError(dem_georef, interp_dem, lonlat_vec, raw_pix_vec, model);\n\n  double best_roll = roll, best_pitch = pitch, best_yaw = yaw;\n  double best_cost = std::numeric_limits<double>::max();\n  for (int pass = 0; pass < 20; pass++) {\n\n    int num = 7;  // must be odd to include the initial guess\n    double max_angle = 2.0 / pow(double(num - 1.0), double(pass));\n    double spacing = 2.0 * max_angle / (num - 1);\n    std::vector<double> samples(num);\n    for (int i = 0; i < num; i++)\n      samples[i] = i * spacing - max_angle;\n\n    // Find the best roll and pitch\n    for (int ir = 0; ir < num; ir++) {\n      double curr_roll = roll + samples[ir];\n\n      for (int ip = 0; ip < num; ip++) {\n        double curr_pitch = pitch + samples[ip];\n\n        for (int iy = 0; iy < num; iy++) {\n          double curr_yaw = yaw + samples[iy];\n\n          createCsmModel(first_line_time, dt_line, t0_ephem, dt_ephem, focal_length,\n                        curr_roll, curr_pitch, curr_yaw, view, optical_center, image_size,\n                        datum, positions, velocities, rpy, model);\n\n          double err = calcCornersError(dem_georef, interp_dem, lonlat_vec,\n                                        raw_pix_vec, model);\n\n          if (err < best_cost) {\n            best_cost = err;\n            best_roll = curr_roll;\n            best_pitch = curr_pitch;\n            best_yaw = curr_yaw;\n          }\n        }\n      }\n    }\n    std::cout << \"roll = \" << best_roll << \";\\n\";\n    std::cout << \"pitch = \" << best_pitch << \";\\n\";\n    std::cout << \"yaw = \" << best_yaw << \";\\n\";\n    std::cout << \"Error = \" << best_cost << std::endl;\n\n    roll = best_roll;\n    pitch = best_pitch;\n    yaw = best_yaw;\n  }\n\n  createCsmModel(first_line_time, dt_line, t0_ephem, dt_ephem, focal_length,\n                 roll, pitch, yaw, view, optical_center, image_size, datum,\n                 positions, velocities, rpy, model);\n\n}\n#endif\n\n// TODO(oalexan1): This needs to be modularized\n\nvoid prism2asp(Options const& opt) {\n\n  int ncols = -1, nrows = -1;\n  double first_line_time = -1, last_line_time = -1;\n  std::string view;\n  std::vector<vw::Vector3> positions, velocities, rpy; // rpy = roll-pitch-yaw\n  std::vector<double> position_times, rpy_times;\n  asp::parsePrismXml(opt.dim_file, ncols, nrows, view, first_line_time, last_line_time,\n                      positions, velocities, position_times, rpy, rpy_times);\n\n  // TODO(oalexan1): Modularize the block below\n\n  // Shift all values closer to the origin to avoid numerical issues with interpolation\n  double time_shift = first_line_time;\n  first_line_time -= time_shift;\n  last_line_time  -= time_shift;\n  for (size_t i = 0; i < position_times.size(); i++)\n    position_times[i] -= time_shift;\n  for (size_t i = 0; i < rpy_times.size(); i++)\n    rpy_times[i] -= time_shift;\n\n  // WGS84 datum\n  vw::cartography::Datum datum(\"WGS84\");\n\n  // Position sampling\n  double t0_ephem = position_times[0];\n  double dt_ephem = position_times[1] - position_times[0];\n\n  // The tolerance should not be too small as the times in seconds can be large.\n  // A satellite velocity under 10 km / s would result in movement of less\n  // than 1e-2 m in 1e-6 seconds.\n  double tol = 1e-6;\n  checkSpacing(position_times, dt_ephem, tol, \"position\");\n\n  // Roll-pitch-yaw sampling\n  double t0_quat = rpy_times[0];\n  double dt_quat = rpy_times[1] - rpy_times[0];\n  checkSpacing(rpy_times, dt_quat, tol, \"roll-pitch-yaw\");\n\n  double dt_line = (last_line_time - first_line_time) / (nrows - 1.0);\n  vw::Vector2 image_size(ncols, nrows);\n\n  // This is a fix for the range of the position times not encompassing the\n  // range of the image lines times. This is a temporary fix, to be refined later.\n  // TODO(oalexan1): Must ensure we extrapolate somewhat beyond the last line time.\n  // Say for another 5000 lines or so.\n  while (position_times.back() < last_line_time - tol)\n    extrapolatePosition(datum, dt_ephem, position_times, positions, velocities);\n\n  // TODO(oalexan1): Must resample positions and rpy, say every 1000 lines,\n  // using Lagrange interpolation. For positions, may need to convert to projected\n  // coordinates first.\n\n  // Sanity check to ensure interpolation works later\n  if (position_times[0] > first_line_time + tol ||\n      position_times.back() < last_line_time - tol)\n    vw::vw_throw(vw::ArgumentErr()\n      << \"The position time range must encompass the image lines time range.\\n\");\n  if (rpy_times[0] > first_line_time + tol ||\n      rpy_times.back() < last_line_time - tol)\n    vw::vw_throw(vw::ArgumentErr()\n      << \"The roll-pitch-yaw time range must encompass the image lines time range.\\n\");\n\n  // Nadir view\n  // Upper-left corner, and other corners, in lon-lat and raw pixel coordinates\n  // will read from xml <Dataset_Frame>\n  vw::Vector2 ul_lonlat(0, 0), ur_lonlat(0, 0), ll_lonlat(0, 0), lr_lonlat(0, 0);\n  // The corner pixel is based on NDUMMY_LEFT of first band\n  vw::Vector2 ul_raw_pix(0, 0), ur_raw_pix(0, 0), ll_raw_pix(0, 0), lr_raw_pix(0, 0);\n\n  // Optical offset and other heuristics per view\n  // TODO(oalexan1): These need refinement. The [Schneider] doc has better values.\n  // Offset for the merged image. Subtract 32 as that is the overlap amount\n  // between CCDs. Heuristics for now.\n  double roll = 0.0, pitch = 0, yaw = 0.0;\n  double offset_factor = 0.0;\n  if (view == \"PRISM forward\") {\n    offset_factor = 7.3; //4.81; // (latter is before adding rpy)\n    //roll = 0; pitch = 23.8; yaw = 0.0; // nominal\n    roll = -0.58428750997244516;\n    pitch = 23.831397378838467;\n    yaw = -1.4942372009731513;\n\n    ul_lonlat = vw::Vector2(-108.1339846, 39.3750293); // from xml, wrong\n    ul_raw_pix = vw::Vector2(2304, 0); // from xml, wrong\n    // From inspection\n    ul_lonlat = vw::Vector2(-108.13184312172825, 39.381410562321079);\n    ur_lonlat = vw::Vector2(-107.67580895904177, 39.303613241935807);\n    ll_lonlat = vw::Vector2(-108.23937126681177, 39.031311463460831);\n    lr_lonlat = vw::Vector2(-107.78713723922995, 38.949143632121732);\n    ul_raw_pix = vw::Vector2(2325, 0);\n    ur_raw_pix = vw::Vector2(16820, 0);\n    ll_raw_pix = vw::Vector2(2325, 15999);\n    lr_raw_pix = vw::Vector2(16820, 15999);\n\n  } else if (view == \"PRISM nadir\") {\n    // Heuristics\n    offset_factor = 5.8; // (latter is before adding rpy)\n    //roll = 0; pitch = 0; // nominal\n    roll = -0.017892244040000001;\n    pitch = -0.036843287040000006;\n    yaw = 0.0;\n    // Read from xml\n    ul_lonlat = vw::Vector2(-108.1266445, 39.3974048);\n    ul_raw_pix = vw::Vector2(3520, 0);\n  } else if (view == \"PRISM backward\") {\n    offset_factor = 6.0; // 3.31; // (latter is before adding rpy)\n    //roll = 0.0; pitch = -23.8; // nominal\n    roll = 0.038117781239999982;\n    pitch = -23.802336706320002; // empirical\n    ul_lonlat = vw::Vector2(-108.1360601, 39.4241022); // from xml, wrong\n    ul_raw_pix = vw::Vector2(4000, 0); // from xml, wrong\n    ul_lonlat = vw::Vector2(-108.13848057684356, 39.415530627090277); // visual inspection\n    ul_raw_pix = vw::Vector2(4021, 0); // based on visual inspection\n  } else {\n    vw::vw_throw(vw::ArgumentErr() << \"Expecting forward, nadir or backward view. \"\n                  << \"Got: \" << view << \".\\n\");\n  }\n\n  // CCD strip image width\n  int w = image_size[0];\n  int global_offset = (w-32) * offset_factor; // experimentally found\n  // Adapt to current CCD\n  int local_offset = global_offset - (opt.ccd - 1) * (w-32);\n  vw::Vector2 optical_center(local_offset, 0); // 0 offset in y\n\n  // Focal length\n  // TODO(oalexan1): Use honest focal length and optical offset\n  // The doc says 1.939 m focal length.\n  double ht = 689880; // height above Earth's surface, in meters\n  double dx = 2.5; // resolution in meters\n  double focal_length = ht / dx; // focal length in pixels\n\n  // Read and interpolate the DEM\n  vw::ImageViewRef<vw::PixelMask<float>> dem;\n  float dem_nodata_val = -std::numeric_limits<float>::max(); // will change\n  vw::cartography::GeoReference dem_georef;\n  vw::cartography::readGeorefImage(opt.dem, dem_nodata_val, dem_georef, dem);\n  vw::PixelMask<float> nodata_pix(0); nodata_pix.invalidate();\n  vw::ValueEdgeExtension<vw::PixelMask<float>> nodata_ext(nodata_pix);\n  auto interp_dem = interpolate(dem, vw::BicubicInterpolation(), nodata_ext);\n\n  // Create the CSM model\n  asp::CsmModel model;\n  createCsmModel(first_line_time, dt_line, t0_ephem, dt_ephem, focal_length,\n                 roll, pitch, yaw, view, optical_center, image_size, datum,\n                 positions, velocities, rpy, model);\n\n  vw::vw_out() << \"Writing: \" << opt.csm_file << \"\\n\";\n  model.saveState(opt.csm_file);\n\n}\n\nint main(int argc, char * argv[]) {\n\n  Options opt;\n  try {\n\n    handle_arguments(argc, argv, opt);\n    prism2asp(opt);\n\n  } ASP_STANDARD_CATCHES;\n\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/refr_index",
    "content": "#!/usr/bin/env python\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2026, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n\"\"\"\nCompute the effective refractive index of water for a given temperature, salinity,\nand wavelength or spectral response. Uses the Quan and Fry (1995) or Parrish (2020)\nempirical equations.\n\nReferences:\n  Quan and Fry (1995): https://github.com/geojames/global_refractive_index_532\n  Parrish (2020):\n    https://research.engr.oregonstate.edu/parrish/\n      index-refraction-seawater-and-freshwater-function-wavelength-and-temperature\n\"\"\"\n\nimport sys\nimport os\nimport argparse\nimport numpy as np\n\n# Set up the path to Python modules about to load\nbasepath    = os.path.abspath(sys.path[0])\npythonpath  = os.path.abspath(basepath + '/../Python')  # for dev ASP\nlibexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP\nsys.path.insert(0, basepath) # prepend to Python path\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\n\nimport asp_system_utils\n\n# Prepend to system PATH\nos.environ[\"PATH\"] = libexecpath + os.pathsep + os.environ[\"PATH\"]\n\n# Define wavelength limits (in nm). The first range is from the Parrish equation\n# documentation, the second is a hard error for sanity checking. The spectral\n# response tables from vendors usually go beyond the strict Parrish limits, but\n# have small responses outside the valid range.\nmin_wl_warn = 400\nmax_wl_warn = 700\nmin_wl_err  = 300\nmax_wl_err  = 1100\n\ndef read_csv(filename):\n    wavelengths = []\n    responses = []\n    warn_range = False\n    skipped_extreme = False\n    try:\n        with open(filename, 'r') as f:\n            lines = f.readlines()\n            if not lines:\n                print(\"Error: Empty spectral response file.\")\n                sys.exit(1)\n\n            # Skip header\n            if len(lines) > 0:\n                print(f\"Skipping first line: {lines[0].strip()}\", file=sys.stderr)\n\n            for line in lines[1:]:\n                line = line.strip()\n                if not line:\n                    continue\n                # Handle comma or space delimiters\n                parts = line.replace(',', ' ').split()\n                if len(parts) < 2:\n                    continue\n\n                try:\n                    wl = float(parts[0])\n                    resp = float(parts[1])\n                except ValueError:\n                    print(f\"Warning: Skipping invalid line: {line}\", file=sys.stderr)\n                    continue\n\n                # Only include positive responses\n                if resp <= 0:\n                    continue\n\n                # Skip wavelengths outside extreme range (don't include in computation)\n                if wl < min_wl_err or wl > max_wl_err:\n                    skipped_extreme = True\n                    continue\n\n                # Check wavelength range for warning\n                if wl < min_wl_warn or wl > max_wl_warn:\n                    warn_range = True\n\n                wavelengths.append(wl)\n                responses.append(resp)\n\n        if skipped_extreme:\n            print(f\"Warning: Wavelengths outside {min_wl_err}-{max_wl_err} nm \" +\n                  f\"were skipped.\", file=sys.stderr)\n\n        if warn_range:\n            print(f\"Warning: Some wavelengths are outside the valid range of \" +\n                  f\"{min_wl_warn}-{max_wl_warn} nm for the Parrish equation. \" +\n                  f\"Results may still be accurate if the spectral response \" +\n                  \"for those is small.\", file=sys.stderr)\n\n    except Exception as e:\n        print(f\"Error reading spectral response file: {e}\")\n        sys.exit(1)\n\n    if not wavelengths:\n        print(\"Error: No valid data found in spectral response file.\")\n        sys.exit(1)\n\n    if not responses:\n        print(\"Error: No valid responses found in spectral response file.\")\n        sys.exit(1)\n\n    return np.array(wavelengths), np.array(responses)\n\ndef main():\n    usage = (\"refr_index --salinity <val> --temperature <val> \" +\n             \"[--spectral-response <file> | --wavelength <val>]\")\n    parser = argparse.ArgumentParser(usage=usage,\n                                     description=\"Compute effective refraction index.\")\n\n    parser.add_argument('--salinity', type=float, default=-1.0,\n                        help='Salinity in parts per thousand (ppt).')\n    parser.add_argument('--temperature', type=float, default=-1.0,\n                        help='Temperature in degrees Celsius.')\n    parser.add_argument('--mode', type=str, default='Quan-Fry',\n                        help='Refractive index equation: Quan-Fry (default) or Parrish.')\n\n    group = parser.add_mutually_exclusive_group(required=True)\n    group.add_argument('--spectral-response', type=str, default=\"\",\n                        help='CSV file containing the spectral response.')\n    group.add_argument('--wavelength', type=float, default=-1.0,\n                        help='Calculate refraction index for single wavelength (nm).')\n\n    parser.add_argument('-v', '--version', action='store_true',\n                        help='Display the version of software.')\n\n    args = parser.parse_args()\n\n    if args.version:\n        asp_system_utils.print_version_and_exit()\n\n    # Normalize mode to lowercase\n    args.mode = args.mode.lower()\n\n    # Validate mode\n    if args.mode not in ['quan-fry', 'parrish']:\n        print(f\"Error: Invalid mode '{args.mode}'. Must be 'Quan-Fry' or 'Parrish'.\")\n        sys.exit(1)\n\n    # Input validation\n    if args.salinity == -1.0:\n        print(\"Error: --salinity must be specified.\")\n        sys.exit(1)\n    if args.temperature == -1.0:\n        print(\"Error: --temperature must be specified.\")\n        sys.exit(1)\n\n    if args.salinity < 0:\n        print(\"Error: Salinity must be non-negative.\")\n        sys.exit(1)\n\n    if not (0 <= args.temperature <= 30):\n        print(\"Error: Temperature must be between 0 and 30 degrees Celsius.\")\n        sys.exit(1)\n\n    # Coefficients for Parrish (2020) empirical equation (used only if mode is Parrish)\n    # n = a*T^2 + b*lambda^2 + c*T + d*lambda + e\n\n    if args.mode == 'parrish':\n        # Seawater (S = 35)\n        params_35 = {\n            'a': -1.50156e-6,\n            'b': 1.07085e-7,\n            'c': -4.27594e-5,\n            'd': -1.60476e-4,\n            'e': 1.39807\n        }\n\n        # Freshwater (S = 0)\n        params_0 = {\n            'a': -1.97812e-6,\n            'b': 1.03223e-7,\n            'c': -8.58125e-6,\n            'd': -1.54834e-4,\n            'e': 1.38919\n        }\n\n        # Linearly interpolate coefficients based on salinity\n        s_factor = args.salinity / 35.0\n        params = {}\n        for key in params_0:\n            params[key] = params_0[key] + s_factor * (params_35[key] - params_0[key])\n\n    if args.spectral_response:\n        if not os.path.exists(args.spectral_response):\n            print(f\"Error: Spectral response file not found: {args.spectral_response}\")\n            sys.exit(1)\n        # Read spectral response\n        wavelengths, responses = read_csv(args.spectral_response)\n    else:\n        # Single wavelength case\n        wl = args.wavelength\n        wavelengths = np.array([wl])\n        responses = np.array([1.0])\n\n    if np.sum(responses) == 0:\n        print(\"Error: Sum of spectral responses is zero.\")\n        sys.exit(1)\n\n    # Compute effective wavelength using spectral response weights\n    eff_wl = np.sum(wavelengths * responses) / np.sum(responses)\n\n    # Validate effective wavelength\n    if eff_wl < min_wl_warn or eff_wl > max_wl_warn:\n        print(f\"Warning: Effective wavelength {eff_wl:.2f} nm is \" +\n              f\"outside the valid range of {min_wl_warn}-{max_wl_warn} nm for \" +\n              f\"the Parrish equation. Result may be inaccurate.\", file=sys.stderr)\n    if eff_wl < min_wl_err or eff_wl > max_wl_err:\n        print(f\"Error: Effective wavelength {eff_wl:.2f} nm is \" +\n              f\"out of supported range ({min_wl_err}-{max_wl_err} nm).\")\n        sys.exit(1)\n\n    # Compute refractive index using the effective wavelength\n    T = args.temperature\n    S = args.salinity\n    lam = eff_wl\n\n    if args.mode == 'quan-fry':\n        # Quan and Fry (1995) equation\n        effective_index = (1.31405 +\n                          (0.0001779 + -0.00000105 * T + 0.000000016 * T**2) * S +\n                          -0.00000202 * T**2 +\n                          ((15.868 + 0.01155*S + -0.00423 *T)/lam) +\n                          (-4382/lam**2) + (1145500/lam**3))\n    else:\n        # Parrish (2020) empirical equation\n        # n = a*T^2 + b*lambda^2 + c*T + d*lambda + e\n        effective_index = (params['a'] * T**2 +\n                          params['b'] * lam**2 +\n                          params['c'] * T +\n                          params['d'] * lam +\n                          params['e'])\n\n    print(f\"Effective index: {effective_index:.6f}\")\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "src/asp/Tools/rig_bracket",
    "content": "#!/usr/bin/env python\n\n\"\"\"\nGiven a list of ref cam timestamps, one per line, grouped in pairs,\nwith each pair very close in time, forming a bracket, and a second\nlist of timestamps for another camera, for each ref cam bracket pick a\ntimestamp from the second camera list. A timestamp is a float number\nin the form <digits>.<digits>. Other data on each line having a timestamp\nwill be read as well. The output list will have a subset\nof lines from the other list.\nCan handle correctly the case when both input lists are identical,\nwhen bracketing needs some care, as each timestamp is its own bracket.\n\"\"\"\n\nimport argparse, os, re, sys, rosbag, cv2, sensor_msgs, cv_bridge\nfrom sensor_msgs import point_cloud2\nimport numpy as np\n\ndef read_timestamps(filename):\n    \"\"\"Return a list of timestamps and lines corresponding to them.\"\"\"\n\n    timestamps_map = {}\n    with open(filename, 'r') as f:\n        lines = f.readlines()\n\n    for line in lines:\n        m = re.match(\"^.*?(\\d+\\.\\d+).*?\\n\", line)\n        if m:\n            timestamp = float(m.group(1))\n            timestamps_map[timestamp] = line\n\n    # Return arrays of timestamps and lines, in sorted order of timestamp.\n    # Those are easier to parse.\n    timestamps = sorted(timestamps_map)\n    lines = []\n    for t in timestamps:\n        lines.append(timestamps_map[t])\n\n    return (timestamps, lines)\n\nparser = argparse.ArgumentParser(description = __doc__,\n                                 formatter_class = argparse.ArgumentDefaultsHelpFormatter)\nparser.add_argument(\"--ref_list\", dest = \"ref_list\", help = \"List of bracketing reference camera timestamps.\"),\nparser.add_argument(\"--other_list\", dest = \"other_list\", default = \"\",  \n                    help = \"List of timestamps for another camera. Pick one of those between each ref cam bracketing timestamps.\")\nparser.add_argument(\"--out_list\", dest = \"out_list\", default = \"\",\n                    help = \"Output list of timestamps in other camera bracketed by ref cam.\")\n\nparser.add_argument(\"--bracket_len\", dest = \"bracket_len\", type = float, default = -1,\n                    help = \"Maximum distance in time, in seconds, between two ref cam timestamps forming a bracket.\")\n\nargs = parser.parse_args()\n\n# Sanity checks\nif args.ref_list == \"\" or args.other_list == \"\" or args.out_list == \"\":\n    print(\"Not all arguments were specified.\")\n    sys.exit(1)\nif args.bracket_len <= 0:\n    print(\"The bracket length must be positive.\")\n    sys.exit(1)\n    \n(ref_timestamps, ref_lines) = read_timestamps(args.ref_list)\n(other_timestamps, other_lines) = read_timestamps(args.other_list)\n\n# Advance simultaneously in both sorted arrays, for effeciency\nother_count = 0\n\nfound_it = []\nfor ref_count in range(len(ref_timestamps)):\n\n    ref_count2 = ref_count + 1\n    if ref_count == len(ref_timestamps) - 1:\n        # Handle the case when we are at the end\n        ref_count2 = ref_count\n\n    t1 = ref_timestamps[ref_count]\n    t2 = ref_timestamps[ref_count2]\n    \n    # Search for t such that t1 <= t < t2. When last t1 and t2 are reached,\n    # can have t == t2.\n    for it in range(other_count, len(other_timestamps)):\n        t = other_timestamps[it]\n        if t < t1:\n            other_count = it + 1 # surely next time need to start searching further\n            continue # too early\n        if t > t2:\n            break # there is no point in continuing\n        \n        # Now t1 <= t <= t2\n        if (t == t1) or (t2 - t1 <= args.bracket_len and t < t2) or \\\n               (t == t2 and ref_count == len(ref_timestamps) - 1):\n            found_it.append(it)\n            other_count = it + 1\n            break\n\n# Save the lines corresponding to bracketed timestamps\nprint(\"Writing: \" + args.out_list)\nwith open(args.out_list, 'w') as f:\n    for it in found_it:\n        f.write(other_lines[it])\n"
  },
  {
    "path": "src/asp/Tools/rig_calibrator.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#include <asp/Core/AspLog.h>\n#include <asp/Core/Macros.h>\n#include <asp/Core/BundleAdjustUtils.h>\n#include <asp/Core/ImageUtils.h>\n#include <asp/Core/Nvm.h>\n#include <asp/Camera/BundleAdjustCamera.h>\n#include <asp/Rig/RigOptions.h>\n#include <asp/Rig/RigParseOptions.h>\n#include <asp/Rig/RigTypeDefs.h>\n#include <asp/Rig/Triangulation.h>\n#include <asp/Rig/RigThread.h>\n#include <asp/Rig/RigParseUtils.h>\n#include <asp/Rig/BasicAlgs.h>\n#include <asp/Rig/RigUtils.h>\n#include <asp/Rig/ImageLookup.h>\n#include <asp/Rig/SystemUtils.h>\n#include <asp/Rig/TransformUtils.h>\n#include <asp/Rig/InterpolationUtils.h>\n#include <asp/Rig/InterestPoint.h>\n#include <asp/Rig/RigOutlier.h>\n#include <asp/Rig/TextureProcessing.h>\n#include <asp/Rig/CameraImage.h>\n#include <asp/Rig/RigConfig.h>\n#include <asp/Rig/RigCameraUtils.h>\n#include <asp/Rig/RigData.h>\n#include <asp/Rig/RigIo.h>\n#include <asp/Rig/RigImageIO.h>\n#include <asp/Rig/RigOptimizer.h>\n\n#include <vw/FileIO/FileUtils.h>\n#include <vw/Core/Log.h>\n#include <vw/Cartography/GeoReference.h>\n\n#include <opencv2/imgproc.hpp>\n#include <opencv2/imgcodecs.hpp>\n#include <opencv2/highgui.hpp>\n#include <opencv2/core/utility.hpp>\n\n#include <glog/logging.h>\n\n#include <Eigen/Geometry>\n#include <Eigen/Core>\n\n#include <oneapi/tbb/task_arena.h>\n#include <boost/filesystem.hpp>\n\n#include <string>\n#include <map>\n#include <iostream>\n#include <fstream>\n\nvoid run_rig_calibrator(int argc, char** argv) {\n\n  // Some dependencies may still use google logging\n  google::InitGoogleLogging(argv[0]);\n  // Force linking to tbb for some dependencies\n  tbb::task_arena schedule(tbb::task_arena::automatic);\n\n  rig::RigOptions opt;\n  rig::handleRigArgs(argc, argv, opt);\n  rig::parameterValidation(opt);\n\n  // Create the output directory, turn on logging\n  std::string out_prefix = opt.out_prefix + \"/run\"; // part of the api\n  vw::create_out_dir(out_prefix);\n  asp::log_to_file(argc, argv, \"\", out_prefix);\n\n  // Rig configuration. The rig transforms may not exist yet.\n  rig::RigSet R;\n  rig::readRigConfig(opt.rig_config, opt.use_initial_rig_transforms, R);\n\n  // Parse auxiliary rig options that depend on R\n  rig::parseAuxRigOptions(opt, R);\n\n  // Sanity check\n  size_t max_num_sensors_per_rig = 0;\n  for (size_t rig_it = 0; rig_it < R.cam_set.size(); rig_it++)\n    max_num_sensors_per_rig = std::max(max_num_sensors_per_rig, R.cam_set[rig_it].size());\n  if (opt.extra_list != \"\" && opt.num_overlaps < max_num_sensors_per_rig)\n    LOG(FATAL) << \"If inserting extra images, must have --num_overlaps be at least \"\n                << \"the number of sensors in the rig, and ideally more, to be able \"\n                << \"to tie well the new images with the existing ones.\\n\";\n\n  // Optionally load the mesh\n  mve::TriangleMesh::Ptr mesh;\n  std::shared_ptr<mve::MeshInfo> mesh_info;\n  std::shared_ptr<tex::Graph> graph;\n  std::shared_ptr<BVHTree> bvh_tree;\n  if (opt.mesh != \"\")\n    rig::loadMeshBuildTree(opt.mesh, mesh, mesh_info, graph, bvh_tree);\n\n  // Read camera poses from nvm file or a list.\n  std::vector<rig::MsgMap> image_maps;\n  std::vector<rig::MsgMap> depth_maps;\n  asp::nvmData nvm;\n  rig::readListOrNvm(opt.camera_poses, opt.nvm,\n                     opt.image_sensor_list, opt.extra_list,\n                     opt.use_initial_rig_transforms,\n                     opt.bracket_len, opt.nearest_neighbor_interp,\n                     opt.read_nvm_no_shift, opt.num_overlaps, R,\n                     nvm, image_maps, depth_maps); // out\n\n  // Poses for all the cameras (extrinsics)\n  rig::Extrinsics cams;\n  // Keep here the images, timestamps, and bracketing information\n  std::vector<rig::cameraImage> imgData;\n  //  The range of R.ref_to_cam_timestamp_offsets[cam_type] before\n  //  getting out of the bracket.\n  std::vector<double> min_timestamp_offset, max_timestamp_offset;\n  std::vector<double> ref_timestamps; // Timestamps for the ref cameras\n  // Select the images to use. If the rig is used, keep non-ref images\n  // only within the bracket.\n  rig::lookupImages(// Inputs\n                    opt.no_rig, opt.bracket_len,\n                    opt.timestamp_offsets_max_change,\n                    opt.bracket_single_image,\n                    R, image_maps, depth_maps,\n                    // Outputs\n                    ref_timestamps, cams.world_to_ref,\n                    imgData, cams.world_to_cam, min_timestamp_offset, max_timestamp_offset);\n  // De-allocate data we no longer need\n  image_maps = std::vector<rig::MsgMap>();\n  depth_maps = std::vector<rig::MsgMap>();\n\n  if (opt.no_rig && opt.use_initial_rig_transforms)\n    LOG(FATAL) << \"Cannot use initial rig transforms without a rig.\\n\";\n\n  // If we can use the initial rig transform, compute and overwrite\n  // cams.world_to_cam, the transforms from the world to each non-reference camera.\n  // TODO(oalexan1): Test if this works with --no_rig. For now this combination\n  // is not allowed.\n  if (!opt.no_rig && opt.use_initial_rig_transforms)\n    rig::calcWorldToCamWithRig(// Inputs\n                               !opt.no_rig,\n                               imgData, cams.world_to_ref, ref_timestamps,\n                               R.ref_to_cam_trans,\n                               R.ref_to_cam_timestamp_offsets,\n                               // Output\n                               cams.world_to_cam);\n\n  // If desired, initalize the rig based on median of transforms for the sensors\n  if (!opt.no_rig && !opt.use_initial_rig_transforms)\n    rig::calc_rig_trans(imgData, cams.world_to_ref, cams.world_to_cam, ref_timestamps,\n                        R); // out\n\n  // Determine if a given camera type has any depth information\n  int num_cam_types = R.cam_names.size();\n  std::vector<bool> has_depth(num_cam_types, false);\n  for (size_t cid = 0; cid < imgData.size(); cid++) {\n    int cam_type = imgData[cid].camera_type;\n    if (imgData[cid].depth_cloud.cols > 0 && imgData[cid].depth_cloud.rows > 0)\n      has_depth[cam_type] = true;\n  }\n\n  // Transform to world coordinates if control points were provided. Note:\n  // applyRegistration modifies cams.world_to_ref (Affine3d), which will then be\n  // converted to state.world_to_ref_vec (primary storage) below.\n  Eigen::Affine3d registration_trans;\n  registration_trans.matrix() = Eigen::Matrix4d::Identity(); // default\n  bool registration_applied = false;\n  if (opt.registration && opt.hugin_file != \"\" && opt.xyz_file != \"\") {\n    // Keep user's R.depth_to_image transforms, and only transform only the image\n    // cameras from Theia's abstract coordinate system to world coordinates.\n    bool scale_depth = false;\n    registration_applied = true;\n    applyRegistration(opt.no_rig, scale_depth, opt.hugin_file, opt.xyz_file,\n                      has_depth, imgData,\n                      // Outputs\n                      registration_trans, cams.world_to_ref, cams.world_to_cam, R);\n  }\n\n  int num_ref_cams = cams.world_to_ref.size();\n  if (cams.world_to_ref.size() != ref_timestamps.size())\n    LOG(FATAL) << \"Must have as many ref cam timestamps as ref cameras.\\n\";\n\n  // Set up the variable blocks to optimize for BracketedDepthError\n  int num_depth_params = rig::NUM_RIGID_PARAMS;\n  if (opt.affine_depth_to_image)\n    num_depth_params = rig::NUM_AFFINE_PARAMS;\n\n  // Separate the initial scale. This is convenient if cam_depth_to_image is\n  // scale * rotation + translation and if it is desired to keep the scale\n  // fixed. In either case, the scale will be multiplied back when needed.\n  // TODO(oalexan1): affine_depth_to_image must allow fixing the scale. \n  std::vector<double> depth_to_image_scales;\n  for (int cam_type = 0; cam_type < num_cam_types; cam_type++) {\n    double depth_to_image_scale\n      = pow(R.depth_to_image[cam_type].matrix().determinant(), 1.0 / 3.0);\n    R.depth_to_image[cam_type].linear() /= depth_to_image_scale;\n    depth_to_image_scales.push_back(depth_to_image_scale);\n  }\n\n  // Detect and match features if --num_overlaps > 0. Append the features\n  // read from the nvm. Triangulate all points.\n  rig::KeypointVec keypoint_vec;\n  rig::PidCidFid pid_to_cid_fid;\n  bool filter_matches_using_cams = true;\n  std::vector<std::pair<int, int>> input_image_pairs; // will use num_overlaps instead\n  // Do not save these matches. Only inlier matches will be saved later.\n  bool local_save_matches = false;\n  std::vector<Eigen::Vector3d> xyz_vec;\n  rig::detectAddFeatures(// Inputs\n                         imgData, R.cam_params, opt.out_prefix,\n                         local_save_matches,\n                         filter_matches_using_cams, cams.world_to_cam,\n                         opt.num_overlaps, input_image_pairs,\n                         opt.initial_max_reprojection_error,\n                         opt.num_match_threads,\n                         opt.read_nvm_no_shift, opt.no_nvm_matches,\n                         opt.verbose,\n                         // Outputs\n                         keypoint_vec, pid_to_cid_fid, xyz_vec, nvm);\n  if (pid_to_cid_fid.empty())\n    LOG(FATAL) << \"No interest points were found. Must specify either \"\n               << \"--nvm or positive --num_overlaps.\\n\";\n\n  // Inlier flag. Once an inlier becomes an outlier, it stays that way\n  rig::PidCidFidMap pid_cid_fid_inlier;\n\n  // TODO(oalexan1): Must initialize all points as inliers outside this function,\n  // as now this function resets those.\n  rig::flagOutlierByExclusionDist(// Inputs\n                                  R.cam_params, imgData, pid_to_cid_fid,\n                                  keypoint_vec,\n                                  // Outputs\n                                  pid_cid_fid_inlier);\n\n  // Ensure that the triangulated points are kept in sync with the cameras\n  if (opt.use_initial_triangulated_points && registration_applied)\n    rig::transformInlierTriPoints(registration_trans, pid_to_cid_fid,\n                                  pid_cid_fid_inlier, xyz_vec);\n\n  // Run several optimization passes with outlier filtering\n  for (int pass = 0; pass < opt.num_passes; pass++) {\n    std::cout << \"\\nOptimization pass \" << pass + 1 << \" / \" << opt.num_passes << \"\\n\";\n    runOptPass(pass, num_depth_params, opt, imgData, ref_timestamps,\n               keypoint_vec, pid_to_cid_fid,\n               min_timestamp_offset, max_timestamp_offset, mesh, bvh_tree,\n               depth_to_image_scales, cams, R, xyz_vec, pid_cid_fid_inlier); // out\n  }  // End optimization passes\n\n  // Put back the scale in R.depth_to_image\n  for (int cam_type = 0; cam_type < num_cam_types; cam_type++)\n    R.depth_to_image[cam_type].linear() *= depth_to_image_scales[cam_type];\n\n  if (opt.save_matches)\n    rig::saveInlierMatchPairs(imgData, opt.num_overlaps, pid_to_cid_fid,\n                              keypoint_vec, pid_cid_fid_inlier, opt.out_prefix);\n\n  // Redo the registration unless told not to.\n  // Note: applyRegistration modifies cams.world_to_ref (Affine3d form), which was updated\n  // from state.world_to_ref_vec after the optimization loop above.\n  if (!opt.skip_post_registration && opt.registration &&\n      opt.hugin_file != \"\" && opt.xyz_file != \"\") {\n    // This time adjust the depth-to-image scale to be consistent with optimized cameras\n    bool scale_depth = true;\n    Eigen::Affine3d registration_trans;\n    applyRegistration(opt.no_rig, scale_depth, opt.hugin_file, opt.xyz_file,\n                      has_depth, imgData,\n                      // Outputs\n                      registration_trans, cams.world_to_ref, cams.world_to_cam, R);\n\n    // Transform accordingly the triangulated points\n    rig::transformInlierTriPoints(registration_trans, pid_to_cid_fid,\n                                        pid_cid_fid_inlier, xyz_vec);\n  }\n\n  if (opt.out_texture_dir != \"\")\n    rig::meshProjectCameras(R.cam_names, R.cam_params, imgData, cams.world_to_cam,\n                            mesh, bvh_tree, opt.out_texture_dir);\n\n  rig::saveCameraPoses(opt.out_prefix, imgData, cams.world_to_cam);\n\n  bool model_rig = (!opt.no_rig);\n  rig::writeRigConfig(opt.out_prefix + \"/rig_config.txt\", model_rig, R);\n\n  std::string nvm_file = opt.out_prefix + \"/cameras.nvm\";\n  bool shift_keypoints = true;\n  rig::writeInliersToNvm(nvm_file, shift_keypoints, R.cam_params, imgData,\n                         cams.world_to_cam, keypoint_vec,\n                         pid_to_cid_fid, pid_cid_fid_inlier, xyz_vec);\n\n  if (opt.save_nvm_no_shift) {\n    std::string nvm_file = opt.out_prefix + \"/cameras_no_shift.nvm\";\n    bool shift_keypoints = false;\n    rig::writeInliersToNvm(nvm_file, shift_keypoints, R.cam_params, imgData,\n                           cams.world_to_cam, keypoint_vec,\n                           pid_to_cid_fid, pid_cid_fid_inlier, xyz_vec);\n  }\n\n  if (opt.export_to_voxblox)\n    rig::exportToVoxblox(R.cam_names, imgData, R.depth_to_image,\n                         cams.world_to_cam, opt.out_prefix);\n\n  if (opt.save_transformed_depth_clouds)\n    rig::saveTransformedDepthClouds(R.cam_names, imgData, R.depth_to_image,\n                                    cams.world_to_cam, opt.out_prefix);\n\n  // Save the list of images (useful for bundle_adjust)\n  std::string image_list = opt.out_prefix + \"/image_list.txt\";\n  rig::saveImageList(imgData, image_list);\n\n  if (opt.save_pinhole_cameras)\n    rig::writePinholeCameras(R.cam_names, R.cam_params, imgData,\n                             cams.world_to_cam, opt.out_prefix);\n\n  std::string conv_angles_file = opt.out_prefix + \"/convergence_angles.txt\";\n  rig::savePairwiseConvergenceAngles(pid_to_cid_fid, keypoint_vec,\n                                     imgData, cams.world_to_cam,\n                                     xyz_vec,  pid_cid_fid_inlier,\n                                     conv_angles_file);\n  return;\n}\n\nint main(int argc, char * argv[]) {\n\n  try {\n    run_rig_calibrator(argc, argv);\n  } ASP_STANDARD_CATCHES;\n\n  return 0;\n\n}\n"
  },
  {
    "path": "src/asp/Tools/rpc_gen.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file rpc_gen.cc\n///\n/// This program will generate an RPC model from a DG model.\n/// It will work by creating a 3D grid in the provided lon-lat-height box,\n/// at each of those points finding the corresponding pixel value, and\n/// then finding the best-fitting RPC transform. For increased\n/// accuracy, both lon-lat-height and pixel values are normalized.\n///\n/// Reference: The Cubic Rational Polynomial Camera Model, Hartley, 2001.\n\n#include <fstream>\n\n#include <asp/Camera/RPCModelGen.h>\n#include <asp/Camera/RPC_XML.h>\n#include <asp/Sessions/StereoSessionFactory.h>\n#include <asp/Core/Macros.h>\n#include <asp/Core/AspProgramOptions.h>\n#include <xercesc/util/PlatformUtils.hpp>\n\n\nnamespace po = boost::program_options;\nnamespace fs = boost::filesystem;\n\nusing namespace vw;\nusing namespace asp;\nusing namespace xercesc;\n\n/// Structure for storing user options\nstruct RPC_gen_Options : vw::GdalWriteOptions {\n  // Input\n  std::string camera_model;\n  // Settings\n  double penalty_weight;\n  BBox3  lon_lat_height_box;\n  std::string output_prefix;\n};\n\n/// Parse input arguments\nvoid handle_arguments( int argc, char *argv[], RPC_gen_Options& opt ) {\n  po::options_description general_options(\"\");\n  general_options.add_options()\n    (\"output-prefix\",      po::value(&opt.output_prefix)->default_value(\"\"),\n             \"Write diagnostic/report files to this location.  If not set then no files will be written.\")\n    (\"penalty-weight\",     po::value(&opt.penalty_weight)->default_value(0.1),\n             \"Penalty weight to use to keep the higher-order RPC coefficients small. Higher penalty weight results in smaller such coefficients.\")\n    (\"lon-lat-height-box\", po::value(&opt.lon_lat_height_box)->default_value(BBox3(0,0,0,0,0,0)),\n             \"The 3D region in which to solve for the RPC model [lon_min lat_min height_min lon_max lat_max height_max].\");\n  general_options.add( vw::GdalWriteOptionsDescription(opt) );\n\n  po::options_description positional(\"\");\n  positional.add_options()\n    (\"camera-model\", po::value(&opt.camera_model));\n  po::positional_options_description positional_desc;\n  positional_desc.add(\"camera-model\", 1);\n\n  std::string usage(\"[options] <camera_model>\");\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line( argc, argv, opt, general_options, general_options,\n                             positional, positional_desc, usage,\n                             allow_unregistered, unregistered );\n\n  if ( !vm.count(\"camera-model\") )\n    vw_throw( ArgumentErr() << \"Requires <camera_model> input in order to proceed.\\n\\n\"\n              << usage << general_options );\n\n}\n\nvoid compute_scale_factors(vw::BBox3   const& gdc_box, \n                           vw::Vector2 const& image_size,\n                           Vector3 &llh_scale, Vector3 &llh_offset,\n                           Vector2 &uv_scale,  Vector2 &uv_offset) {\n\n  Vector3 min_llh_coord = gdc_box.min();\n  Vector3 max_llh_coord = gdc_box.max();\n\n  // Use matched axis scaling for pixels so one axis does not get higher error weighting\n  llh_scale  = (max_llh_coord - min_llh_coord)/2.0; // half range\n  llh_offset = (max_llh_coord + min_llh_coord)/2.0; // center point\n\n  // Prevent divide by zero for any dimension with no variation\n  for (int i = 0; i < 3; i++) {\n    if (llh_scale[i] == 0.0)\n      llh_scale[i] = 1.0;\n  }\n\n  double pixel_max = vw::math::max(image_size);\n  uv_scale  = Vector2(pixel_max/2.0, pixel_max/2.0); // The long axis pixel is scaled to 1.0\n  uv_offset = image_size/2.0; // center point \n}\n  \n\n/// Loads in the points from a text file\nvoid load_pairs_from_file(std::string const& path,\n                          Vector<double> &normalized_geodetics,\n                          Vector<double> &normalized_pixels,\n                          Vector3 &llh_scale, Vector3 &llh_offset,\n                          Vector2 &uv_scale,  Vector2 &uv_offset) {\n  // For now this only loads files from Geocam Space.\n  \n  const double HEIGHT = 0; // Might want to change this!\n  \n  vw_out() << \"Reading point pairs from file...\\n\";\n  \n  // Read through the file and extract all the points\n  \n  std::ifstream infile(path.c_str());\n  \n  std::vector<Vector3> gdc_temp;\n  std::vector<Vector2> pixel_temp;\n  \n  vw::BBox2 pixel_bbox;\n  vw::BBox3 gdc_bbox;\n  \n  std::string line;\n  while (std::getline(infile, line)) {\n  \n    size_t colon_pos = line.find(':');\n    size_t start_pos = colon_pos + 1;\n    size_t comma_pos = line.find(',');\n    size_t num1_len = comma_pos - start_pos;\n    std::string num1_str = line.substr(start_pos, num1_len);\n    std::string num2_str = line.substr(comma_pos+1);\n    float num1 = atof(num1_str.c_str());\n    float num2 = atof(num2_str.c_str());\n\n    if (line[0] == 'u') { // = GDC\n      Vector3 gdc(num1, num2, HEIGHT);\n      gdc_temp.push_back(gdc);\n      gdc_bbox.grow(gdc);\n    }else { // v = pixel\n      Vector2 pixel(num1, num2);\n      pixel_temp.push_back(pixel);\n      pixel_bbox.grow(pixel);\n    }\n  } // End loop through file\n  \n  // Check that we loaded the correct number of points\n  size_t num_points = gdc_temp.size();\n  if (pixel_temp.size() != num_points)\n    vw_throw( ArgumentErr() << \"Error reading input file: counts\\n\");\n  \n  // Automatically compute the scale factors\n  compute_scale_factors(gdc_bbox, pixel_bbox.size(), llh_scale, llh_offset, uv_scale, uv_offset);\n  \n  // Initialize normalized data storage\n  normalized_geodetics.set_size(RPCModel::GEODETIC_COORD_SIZE*num_points);\n  normalized_pixels.set_size   (RPCModel::IMAGE_COORD_SIZE   *num_points + RpcSolveLMA::NUM_PENALTY_TERMS);\n  for (size_t i = 0; i < normalized_pixels.size(); i++)\n    normalized_pixels[i] = 0.0; // Important: The extra penalty terms are all set to zero here.\n      \n  for (size_t i=0; i<num_points; ++i) {\n  \n    // Normalize the points\n    Vector3 gdc   = elem_quot(gdc_temp  [i] - llh_offset, llh_scale);\n    Vector2 pixel = elem_quot(pixel_temp[i] - uv_offset,  uv_scale );\n  \n    // Pack them in the output vectors\n    subvector(normalized_geodetics, RPCModel::GEODETIC_COORD_SIZE*i, RPCModel::GEODETIC_COORD_SIZE) = gdc;\n    subvector(normalized_pixels,    RPCModel::IMAGE_COORD_SIZE   *i, RPCModel::IMAGE_COORD_SIZE   ) = pixel;\n   \n  }\n  vw_out() << \"Loaded \"<< num_points <<\" processing point pairs from file\\n\";\n}\n\n/// Generates the set of GDC/pixel pairs that will be fed into the solver.\nvoid generate_point_pairs(RPC_gen_Options opt,\n                          Vector<double> &normalized_geodetics,\n                          Vector<double> &normalized_pixels,\n                          Vector3 &llh_scale, Vector3 &llh_offset,\n                          Vector2 &uv_scale,  Vector2 &uv_offset) {\n\n    // If the user provided a text file instead of a camera model, load the points\n    // straight from the file.\n    if ( (opt.camera_model.find(\".csv\") != std::string::npos) ||\n         (opt.camera_model.find(\".txt\") != std::string::npos)   ) {\n      load_pairs_from_file(opt.camera_model, normalized_geodetics, normalized_pixels,\n                          llh_scale, llh_offset, uv_scale, uv_offset);\n      return;\n    }\n    \n    // Otherwise use the camera model information to generate the point pairs.\n\n    // Load up the Digital Globe camera model from the camera file\n    XMLPlatformUtils::Initialize();\n\n    // TODO: Replace with direct call?\n    // Load the DG camera model. The API is kind of ugly.\n    std::string session_name = \"DG\";\n        asp::SessionPtr session(asp::StereoSessionFactory::create\n                       (session_name, opt, \"\", \"\", opt.camera_model, opt.camera_model, \"\"));\n    boost::shared_ptr<camera::CameraModel> cam_dg(session->camera_model(\"\", opt.camera_model));\n\n    // Load up the RPC camera model from the camera file\n    RPCXML xml;\n    xml.read_from_file( opt.camera_model );\n    boost::shared_ptr<RPCModel> cam_rpc( new RPCModel( *xml.rpc_ptr() ) );\n    Vector2 image_size = xml_image_size(opt.camera_model);\n\n    // Normalization in the lon-lat-height and pixel domains\n    // - Compute an offset and scale to place all values in the\n    //   zero to one range centered on the center coordinate/pixel.\n    // - The input RPC model has similar numbers loaded but we will use different\n    //   values unless the input options exactly match the input XML file.\n    Vector3 min_llh_coord = opt.lon_lat_height_box.min();\n    Vector3 max_llh_coord = opt.lon_lat_height_box.max();\n\n    // Use matched axis scaling for pixels so one axis does not get higher error weighting\n    llh_scale  = (max_llh_coord - min_llh_coord)/2.0; // half range\n    llh_offset = (max_llh_coord + min_llh_coord)/2.0; // center point\n    double pixel_max = vw::math::max(image_size);\n    uv_scale  = Vector2(pixel_max/2.0, pixel_max/2.0); // The long axis pixel is scaled to 1.0\n    uv_offset = image_size/2.0; // center point\n\n    // Number of points in x and y at which we will optimize the RPC\n    // model. Using 10 or 20 points gives roughly similar results.\n    // 20 points result in 20^3 input data for optimization, with the\n    // number of variable to optimize being just 78.\n    int num_pts = 20; // The number of points per axis\n    int num_total_pts = num_pts*num_pts*num_pts;\n\n    // Initialize normalized data storage\n    normalized_geodetics.set_size(RPCModel::GEODETIC_COORD_SIZE*num_total_pts);\n    normalized_pixels.set_size(RPCModel::IMAGE_COORD_SIZE*num_total_pts\n                               + RpcSolveLMA::NUM_PENALTY_TERMS);\n    for (size_t i = 0; i < normalized_pixels.size(); i++) {\n      // Important: The extra penalty terms are all set to zero here.\n      normalized_pixels[i] = 0.0; \n    }\n    \n    // Loop through all test points and generate the \"correct\" pairs / training data\n    //  using the trusted DG camera model.\n    int count = 0;\n    for (int x = 0; x < num_pts; x++){\n      for (int y = 0; y < num_pts; y++){\n        for (int z = 0; z < num_pts; z++){\n\n          // Test points are evenly spaced through the x/y/z -1 <> 1 range\n          Vector3 U( x/(num_pts - 1.0),\n                     y/(num_pts - 1.0),\n                     z/(num_pts - 1.0) );\n                  U = 2.0*U - Vector3(1, 1, 1); // in the box [-1, 1]^3.\n\n          // Linear conversion from x/y/z to lat/lon/height\n          Vector3 G   = elem_prod(U, llh_scale) + llh_offset; // geodetic\n\n          // Convert from geodetic to geocentric coordinates\n          Vector3 P   = cam_rpc->datum().geodetic_to_cartesian(G); // xyz\n\n          // Project the GCC coordinate into the DG camera model\n          Vector2 pxg = cam_dg->point_to_pixel(P);\n          //Vector2 pxg = cam_rpc->point_to_pixel(P); // DEBUG -> Try fitting to RPC!\n\n          // Normalize the pixel to -1 <> 1 range\n          Vector2 pxn = elem_quot(pxg - uv_offset, uv_scale);\n\n          // It is a useful exercise to compare DG and RPC cameras\n          //Vector2 pxr = cam_rpc->point_to_pixel(P);\n          //std::cout << U << ' ' << P << ' ' << pxg << ' ' << pxr  << ' '\n          //          << norm_2(pxg-pxr)<< std::endl;\n\n          subvector(normalized_geodetics, RPCModel::GEODETIC_COORD_SIZE*count,\n                    RPCModel::GEODETIC_COORD_SIZE) = U;\n          subvector(normalized_pixels,    RPCModel::IMAGE_COORD_SIZE   *count,\n                    RPCModel::IMAGE_COORD_SIZE   ) = pxn;\n          count++;\n\n        } // End z loop\n      } // End y loop\n    } // End x loop\n\n}\n\nint main( int argc, char* argv[] ) {\n\n  RPC_gen_Options opt;\n  try {\n    handle_arguments( argc, argv, opt );\n\n    // Generate all the point pairs using the input options\n    Vector<double> normalized_geodetics;\n    Vector<double> normalized_pixels;\n    Vector3 llh_scale, llh_offset;\n    Vector2 uv_scale,  uv_offset;\n    generate_point_pairs(opt, normalized_geodetics, normalized_pixels,\n                         llh_scale, llh_offset, uv_scale, uv_offset);\n\n    // Find the RPC coefficients\n    RPCModel::CoeffVec line_num, line_den, samp_num, samp_den;\n    bool refine_only = false;\n    gen_rpc(// Inputs\n            opt.penalty_weight,\n            normalized_geodetics, normalized_pixels,  \n            refine_only,\n            // Outputs\n            line_num, line_den, samp_num, samp_den);\n    \n    // Dump the output to stdout, to be parsed by python\n    print_vec(\"uv_scale\",   uv_scale  );\n    print_vec(\"uv_offset\",  uv_offset );\n    print_vec(\"llh_scale\",  llh_scale );\n    print_vec(\"llh_offset\", llh_offset);\n    print_vec(\"line_num\",   line_num  );\n    print_vec(\"line_den\",   line_den  );\n    print_vec(\"samp_num\",   samp_num  );\n    print_vec(\"samp_den\",   samp_den  );\n\n  } ASP_STANDARD_CATCHES;\n\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/runWithLog.py",
    "content": "#!/usr/bin/env python\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\nfrom __future__ import print_function\nimport sys\nimport datetime\nimport os\n\nif len(sys.argv) != 3:\n    raise Exception('usage: %s <dir> \"<cmd> [arg1] [arg2] ...\"' % sys.argv[0])\n\nlogDir = sys.argv[1]\nfullCmd = sys.argv[2]\n\ntimeStr = datetime.datetime.now().strftime('%Y%m%d_%H%M%S_%f')\ncmdArgv = fullCmd.split(' ')\ncmdShort = os.path.splitext(os.path.basename(cmdArgv[0]))[0]\nlogFname = '%s/%s_%s.txt' % (logDir, timeStr, cmdShort)\nprint('%s: logging to %s' % (sys.argv[0], logFname), file=sys.stderr)\n\n# open log\nif not os.path.exists(logDir):\n    os.system('mkdir -p %s' % logDir)\nlogFile = open(logFname, 'w')\n\n# close stdin\ndevNull = open('/dev/null', 'rw')\nos.dup2(devNull.fileno(), 0)\n\n# redirect stdout and stderr to log\nos.dup2(logFile.fileno(), 1)\nos.dup2(logFile.fileno(), 2)\n\nquotedArgs = ['\"%s\"' % arg for arg in cmdArgv]\nprint('%s: running: %s' % (sys.argv[0], ' '.join(quotedArgs)), file=sys.stderr)\n\n# run desired command\nos.execvp(cmdArgv[0], cmdArgv)\n"
  },
  {
    "path": "src/asp/Tools/sat_sim.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Tool to create simulated satellite images and/or pinhole cameras for them.\n// See the manual for details.\n\n#include <asp/Core/Macros.h>\n#include <asp/Core/AspProgramOptions.h>\n#include <asp/Core/AspLog.h>\n#include <asp/Camera/SyntheticLinescan.h>\n#include <asp/Camera/SatSim.h>\n#include <asp/Rig/RigConfig.h>\n\n#include <vw/Cartography/GeoReferenceBaseUtils.h>\n#include <vw/Cartography/CameraBBox.h>\n#include <vw/Camera/PinholeModel.h>\n#include <vw/Core/StringUtils.h>\n#include <vw/Core/Stopwatch.h>\n#include <vw/FileIO/FileUtils.h>\n\n#include <glog/logging.h>\n\nnamespace po = boost::program_options;\nnamespace fs = boost::filesystem;\nvoid handle_arguments(int argc, char *argv[], asp::SatSimOptions& opt,\n                      rig::RigSet & rig) {\n\n  double NaN = std::numeric_limits<double>::quiet_NaN();\n  po::options_description general_options(\"General options\");\n  general_options.add_options()\n    (\"dem\", po::value(&opt.dem_file)->default_value(\"\"), \"Input DEM file.\")\n    (\"ortho\", po::value(&opt.ortho_file)->default_value(\"\"), \n     \"Input georeferenced image file.\")\n    (\"output-prefix,o\", po::value(&opt.out_prefix), \"Specify the output prefix. All the \"\n    \"files that are saved will start with this prefix.\")\n    (\"camera-list\", po::value(&opt.camera_list)->default_value(\"\"),\n     \"A file containing the list of pinhole cameras to create synthetic images for. \"\n     \"Then these cameras will be used instead of generating them. Specify one file \"\n     \"per line. The options --first, --last, --num, --focal-length, \"\n     \"and --optical-center will be ignored.\")\n    (\"first\", po::value(&opt.first)->default_value(vw::Vector3(), \"\"),\n    \"First camera position, specified as DEM pixel column and row, and height above \"\n    \"the DEM datum. See the doc for more info.\")\n    (\"last\", po::value(&opt.last)->default_value(vw::Vector3(), \"\"),\n    \"Last camera position, specified as DEM pixel column and row, and height above \"\n    \"the DEM datum.\")\n    (\"num\", po::value(&opt.num_cameras)->default_value(0),\n    \"Number of cameras to generate, including the first and last ones. Must be positive. \"\n    \"The cameras are uniformly distributed along the straight edge from first to last (in \"\n    \"projected coordinates).\")\n    (\"first-ground-pos\", po::value(&opt.first_ground_pos)->default_value(vw::Vector2(NaN, NaN), \"\"),\n    \"Coordinates of first camera ground footprint center (DEM column and row). \"\n    \"If not set, the cameras will look straight down (perpendicular to along \"\n    \"and across track directions).\")\n    (\"last-ground-pos\", po::value(&opt.last_ground_pos)->default_value(vw::Vector2(NaN, NaN), \"\"),\n    \"Coordinates of last camera ground footprint center (DEM column and row). \"\n    \"If not set, the cameras will look straight down (perpendicular to along \"\n    \"and across track directions).\")\n    (\"focal-length\", po::value(&opt.focal_length)->default_value(NaN),\n     \"Output camera focal length in units of pixel.\")\n    (\"optical-center\", po::value(&opt.optical_center)->default_value(vw::Vector2(NaN, NaN),\"NaN NaN\"),\n     \"Output camera optical center (image column and row). Units of pixel.\")\n    (\"image-size\", po::value(&opt.image_size)->default_value(vw::Vector2(NaN, NaN),\n      \"NaN NaN\"),\n      \"Output camera image size (width and height).\")\n    (\"roll\", po::value(&opt.roll)->default_value(NaN),\n    \"Camera roll angle, in degrees. See the documentation for more details.\")\n    (\"pitch\", po::value(&opt.pitch)->default_value(NaN),\n     \"Camera pitch angle, in degrees.\")\n    (\"yaw\", po::value(&opt.yaw)->default_value(NaN),\n     \"Camera yaw angle, in degrees.\")\n    (\"velocity\", po::value(&opt.velocity)->default_value(NaN),\n     \"Satellite velocity, in meters per second. Used for modeling jitter. A value of \"\n     \"around 8000 m/s is typical for a satellite like SkySat in Sun-synchronous orbit \"\n     \"(90 minute period) at an altitude of about 450 km. For WorldView, the velocity \"\n     \"is around 7500 m/s, with a higher altitude and longer period.\")\n    (\"jitter-frequency\", po::value(&opt.jitter_frequency_str)->default_value(\"\"),\n     \"Jitter frequency, in Hz. Used for modeling jitter (satellite vibration). \"\n     \"Several frequencies can be specified. Use a quoted list, with spaces \"\n     \"as separators (or separated by commas with no quotes). See also \"\n     \"--jitter-amplitude and --horizontal-uncertainty.\")\n    (\"jitter-phase\", po::value(&opt.jitter_phase_str)->default_value(\"\"),\n     \"Jitter phase, in radians. Measures the jitter phase offset from the start of \"\n     \"the orbit as set by --first. Specify as a quoted list of numbers (or \"\n     \"separated by commas with no quotes). The number \"\n     \"of values must be 3 times the number of frequencies. The order in this list \"\n     \"corresponds to phase for roll, pitch, and yaw for first frequency, then \"\n     \"second frequency, etc. If not specified, will be set to 0.\")\n    (\"horizontal-uncertainty\", po::value(&opt.horizontal_uncertainty_str)->default_value(\"\"),\n     \"Camera horizontal uncertainty on the ground, in meters, at nadir orientation. \"\n     \"Specify as a quoted list of three numbers (or separated by commas with no quotes), \"\n     \"used for roll, pitch, and yaw. The jitter amplitude for each of these angles \"\n     \"is found as \"\n     \"= atan(horizontal_uncertainty / satellite_elevation_above_datum), then converted \"\n     \"to degrees. See also --jitter-amplitude.\")\n    (\"jitter-amplitude\", po::value(&opt.jitter_amplitude_str)->default_value(\"\"),\n     \"Jitter amplitude, in micro radians. Specify as a quoted list having \"\n     \"amplitude in roll, pitch, yaw for first frequency, then for second, and so on. \"\n     \"Separate the values by spaces (or commas with no quotes).\")\n    (\"first-index\", po::value(&opt.first_index)->default_value(-1),\n     \"Index of first camera and/or image to generate, starting from 0. If not set, will \"\n     \"create all images/cameras. This is used for parallelization.\")\n    (\"last-index\", po::value(&opt.last_index)->default_value(-1),\n     \"Index of last image and/or camera to generate, starting from 0. Stop before \"\n     \"this index. If not set, will create all images/cameras. This is used for \"\n     \"parallelization.\")\n    (\"frame-rate\", po::value(&opt.frame_rate)->default_value(NaN), \n     \"Camera frame rate, per second. Can be in double precision. If set, it will override \"\n     \"--num. The cameras will start from --first (after any position adjustment, if \"\n     \"applicable, per the doc). Set the --velocity value. The last camera will be no further \"\n     \"than the (adjusted) value of --last along the orbit.\")\n     (\"sensor-type\", po::value(&opt.sensor_type)->default_value(\"pinhole\"),\n      \"Sensor type for created cameras and images. Can be one of: pinhole, linescan. \"\n      \"Can use 'frame' instead of 'pinhole'. With a rig, this can be a list of values, \"\n      \"separated by commas, with no spaces, one per sensor, if desired to have different \"\n      \"types for different sensors.\")\n    (\"non-square-pixels\", po::bool_switch(&opt.non_square_pixels)->default_value(false)->implicit_value(true),\n      \"When creating linescan cameras and images, use the provided image height in pixels, \"\n      \"even if that results in non-square pixels. The default is to auto-compute the image \"\n      \"height.\")\n    (\"no-images\", po::bool_switch(&opt.no_images)->default_value(false)->implicit_value(true),\n     \"Create only cameras, and no images. Cannot be used with --camera-list.\")\n     (\"save-ref-cams\", po::bool_switch(&opt.save_ref_cams)->default_value(false)->implicit_value(true),\n     \"For each created camera, save also the 'reference' camera that has no roll, pitch, \"\n     \"yaw, jitter, or 90 degree in-sensor-plane rotation from camera to satellite \" \n     \"coordinates. Their names have '-ref-' after the output prefix.\")\n    (\"save-as-csm\", \n      po::bool_switch(&opt.save_as_csm)->default_value(false)->implicit_value(true),\n      \"Save Pinhole (frame) cameras in the CSM format, as done for linescan cameras. \"\n      \"Can be used to combine these sensors in bundle adjustment and solving for jitter.\")\n     (\"rig-config\", po::value(&opt.rig_config)->default_value(\"\"),\n     \"Simulate a frame camera rig with this configuration file. Then do not set the image \"\n     \"size, focal length, optical center on the command line, as those are set by the rig. \"\n     \"The transforms on this rig may be adjusted via --rig-sensor-ground-offsets \"\n     \"and --rig-sensor-rotation-angles.\")\n     (\"rig-sensor-ground-offsets\",\n      po::value(&opt.rig_sensor_ground_offsets)->default_value(\"\"),\n     \"Modify the input rig so that each sensor center has the given horizontal offsets \"\n     \"from the rig center in the rig plane, and the sensor ground footprint centers have \"\n     \"the given ground plane offsets from the nominal ground footprint center at nadir. \"\n     \"Specify as a quoted list of values, separated by spaces or commas. The order is \"\n     \"sensor1_x sensor1_y ground1_x ground1_y followed by sensor 2, etc. The units are in \"\n     \"meter. These will determine the sensor orientations. If not set, use 0 for all \"\n     \"sensors.\")\n     (\"rig-sensor-rotation-angles\",\n      po::value(&opt.rig_sensor_rotation_angles)->default_value(\"\"),\n      \"Modify the input rig by rotating each sensor by the given angle in the sensor \"\n      \"plane. Specify as one number per sensor, in degrees, separated by commas, or \"\n      \"in quotes and separated by spaces.\")\n     (\"sensor-name\", po::value(&opt.sensor_name)->default_value(\"all\"),\n       \"Name of the sensor in the rig to simulate. If not set, will simulate all sensors. \"\n       \"If more than one, list them separated by commas (no spaces).\")\n     (\"model-time\", \n      po::bool_switch(&opt.model_time)->default_value(false)->implicit_value(true),\n       \"Model time at each camera position. See also --start-time.\")\n     (\"reference-time\", po::value(&opt.ref_time)->default_value(10000),\n       \"The measured time, in seconds,  when the satellite is along given orbit, in nadir \"\n       \"orientation, with the center view direction closest to the ground point at \"\n       \"--first-ground-pos. A unique value for each orbit is suggested. A large value \"\n       \"(millions), may result in numerical issues.\")\n     (\"perturb-cameras\",\n      po::bool_switch(&opt.perturb_cameras)->default_value(false)->implicit_value(true),\n      \"Apply a jitter perturbation to existing cameras.\")\n     (\"random-pose-perturbation\",\n       po::bool_switch(&opt.random_pose_perturbation)->default_value(false)->implicit_value(true),\n       \"Apply a random pose perturbation to existing cameras, with the amplitude \" \n       \"specified by --horizontal-uncertainty.\")\n     (\"random-position-perturbation\", po::value(&opt.random_position_perturbation)->default_value(NaN),\n      \"Apply a random position perturbation to existing camera centers, with the given \"\n      \"magnitude, in meters.\")\n     (\"dem-height-error-tol\", po::value(&opt.dem_height_error_tol)->default_value(0.001),\n      \"When intersecting a ray with a DEM, use this as the height error tolerance \"\n      \"(measured in meters). It is expected that the default will be always good enough.\")\n     (\"blur-sigma\", po::value(&opt.blur_sigma)->default_value(0.0),\n      \"When creating images, blur them with a Gaussian with this sigma. The sigma is \"\n      \"in input orthoimage pixel units.\")\n     (\"help,h\", \"Display this help message.\")\n    ;\n  general_options.add(vw::GdalWriteOptionsDescription(opt));\n\n  po::options_description positional(\"\");\n  po::positional_options_description positional_desc;\n\n  std::string usage(\"--dem <dem file> --ortho <ortho image file> \"\n                    \"[other options]\");\n\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line(argc, argv, opt, general_options, general_options,\n                            positional, positional_desc, usage,\n                            allow_unregistered, unregistered);\n\n  // When invoked with no arguments or no output prefix, display the help message.\n  if (opt.out_prefix == \"\")\n    vw::vw_throw(vw::ArgumentErr() << \"Missing output prefix.\\n\"\n                 << usage << general_options);\n\n  // Create the output directory based on the output prefix\n  vw::create_out_dir(opt.out_prefix);\n\n  // Turn on logging to file\n  asp::log_to_file(argc, argv, \"\", opt.out_prefix);\n\n  // Some functions use google logging\n  google::InitGoogleLogging(argv[0]);\n\n  bool have_perturb = opt.perturb_cameras || opt.random_pose_perturbation ||\n                      !std::isnan(opt.random_position_perturbation);\n  \n  // Only one of the three options above must be set\n  if (int(opt.perturb_cameras) + int(opt.random_pose_perturbation) +\n      int(!std::isnan(opt.random_position_perturbation)) > 1)\n    vw::vw_throw(vw::ArgumentErr() << \"Only one of --perturb-cameras, \"\n                 \"--random-pose-perturbation, and --random-position-perturbation \"\n                 \"can be set.\\n\");\n    \n  if (opt.dem_file == \"\")\n    vw::vw_throw(vw::ArgumentErr() << \"Missing input DEM.\\n\");\n    \n  if (opt.ortho_file == \"\" && !have_perturb)\n    vw::vw_throw(vw::ArgumentErr() << \"Missing input ortho image.\\n\");\n  \n  bool have_rig = !opt.rig_config.empty();\n  if (have_rig && opt.camera_list != \"\")\n    vw::vw_throw(vw::ArgumentErr() \n                 << \"Cannot specify both --rig-config and --camera-list.\\n\");\n  \n  if (have_rig && \n      (!vm[\"image-size\"].defaulted() || !vm[\"focal-length\"].defaulted() ||\n       !vm[\"optical-center\"].defaulted()))\n      vw::vw_throw(vw::ArgumentErr() << \"Cannot specify image size, focal length, or \"\n        \"optical center when using a rig. Those are set in the rig configuration file.\\n\");\n\n  if (have_rig && !opt.model_time) {\n    opt.model_time = true;\n    vw::vw_out() << \"Will model time as a rig was specified.\\n\";\n  }\n\n  if (!have_rig && (!have_perturb || opt.save_as_csm)) {\n    if (std::isnan(opt.image_size[0]) || std::isnan(opt.image_size[1]))\n      vw::vw_throw(vw::ArgumentErr() << \"The image size must be specified.\\n\");\n    if (opt.image_size[0] <= 1 || opt.image_size[1] <= 1)\n      vw::vw_throw(vw::ArgumentErr() << \"The image size must be at least 2 x 2.\\n\");\n  }\n  \n  if (opt.camera_list != \"\" && opt.no_images && !have_perturb)\n    vw::vw_throw(vw::ArgumentErr() << \"The --camera-list and --no-images options \"\n      \"cannot be used together.\\n\");\n  \n  if (opt.camera_list == \"\") {\n    if (opt.first == vw::Vector3() || opt.last == vw::Vector3())\n      vw::vw_throw(vw::ArgumentErr() << \"The first and last camera positions must be \"\n        \"specified.\\n\");\n\n    if (opt.first[2] != opt.last[2])\n      vw::vw_out() << \"Warning: The first and last camera positions have different \"\n                   << \"heights above the datum. This is supported but is not usual. \"\n                   << \"Check your inputs.\\n\";\n    \n    if (std::isnan(opt.frame_rate)) {\n      if (opt.num_cameras < 1)\n        vw::vw_throw(vw::ArgumentErr() << \"The number of cameras must be at least 1.\\n\");\n    } else {\n      // Frame rate is set. Then need not set num cameras.\n      if (opt.num_cameras > 0)\n        vw::vw_throw(vw::ArgumentErr() << \"Cannot set both --num and --frame-rate.\\n\");\n      // Must have a positive velocity\n      if (std::isnan(opt.velocity) || opt.velocity <= 0.0)\n        vw::vw_throw(vw::ArgumentErr() << \"The velocity must be positive if using \"\n         << \" --frame-rate.\\n\");\n    }\n\n    // Validate focal length, optical center, and image size\n    if (!have_rig) {\n      if (std::isnan(opt.focal_length))\n        vw::vw_throw(vw::ArgumentErr() << \"The focal length must be positive.\\n\");\n      if (std::isnan(opt.optical_center[0]) || std::isnan(opt.optical_center[1]))\n        vw::vw_throw(vw::ArgumentErr() << \"The optical center must be specified.\\n\");\n    \n      // If the optical center is large, the images will show up very oblique.\n      // The current logic implicitly assumes that the optical center is close to\n      // the image center.\n      if (opt.optical_center[0] < 0 || opt.optical_center[1] < 0 ||\n          opt.optical_center[0] >= opt.image_size[0] || \n          opt.optical_center[1] >= opt.image_size[1])\n        vw::vw_throw(vw::ArgumentErr() << \"The optical center must be non-negative and \"\n                    << \"within the image bounds. It is suggested to have it close to \"\n                    << \"the image center.\\n\");\n    }\n      \n    // Either both first and last ground positions are specified, or none.\n    if (std::isnan(norm_2(opt.first_ground_pos)) != \n      std::isnan(norm_2(opt.last_ground_pos)))\n      vw::vw_throw(vw::ArgumentErr() << \"Either both first and last ground positions \"\n        \"must be specified, or none.\\n\");\n\n    // Check that either all of roll, pitch, and yaw are specified, or none.\n    int ans = int(std::isnan(opt.roll)) +\n              int(std::isnan(opt.pitch)) +\n              int(std::isnan(opt.yaw));\n    if (ans != 0 && ans != 3)\n      vw::vw_throw(vw::ArgumentErr() << \"Either all of roll, pitch, and yaw must be \"\n        \"specified, or none.\\n\");\n  }\n\n  // Parse jitter frequency\n  // Convert from string to vector of doubles\n  std::string sep = \", \\t\\n\"; // separators: comma, space, tab, newline\n  opt.jitter_frequency = vw::str_to_std_vec(opt.jitter_frequency_str, sep);\n  if (opt.jitter_frequency.empty())\n    opt.jitter_frequency.push_back(NaN);\n\n  // Horizontal uncertainty must be 3 values. Must specify either this or \n  // jitter amplitude.\n  opt.horizontal_uncertainty \n    = vw::str_to_std_vec(opt.horizontal_uncertainty_str, sep);\n  if (!opt.horizontal_uncertainty.empty() && opt.horizontal_uncertainty.size() != 3)\n    vw::vw_throw(vw::ArgumentErr() << \"The horizontal uncertainty must be specified \"\n      \"as three values, separated by commas or spaces.\\n\");\n\n  // Number of jitter amplitudes must be 3x the number of frequencies. It can \n  // be empty, if horizontal uncertainty is specified.\n  opt.jitter_amplitude = vw::str_to_std_vec(opt.jitter_amplitude_str, sep);\n  if (opt.jitter_amplitude.empty() && opt.horizontal_uncertainty.empty()) {\n    // Default amplitude is 0\n    for (size_t i = 0; i < opt.jitter_frequency.size() * 3; i++)\n      opt.jitter_amplitude.push_back(0.0);\n  }\n\n  // Number of jitter phases must be 3x the number of frequencies.\n  opt.jitter_phase = vw::str_to_std_vec(opt.jitter_phase_str, sep);\n  if (opt.jitter_phase.empty()) {\n    // Default phase is 0\n    for (size_t i = 0; i < opt.jitter_frequency.size() * 3; i++)\n      opt.jitter_phase.push_back(0.0);\n  }\n\n  // Sanity checks\n  if (!opt.horizontal_uncertainty_str.empty() && !opt.jitter_amplitude_str.empty()) \n    vw::vw_throw(vw::ArgumentErr() \n      << \"Cannot specify both jitter uncertainty and jitter amplitude.\\n\");\n  if (!opt.horizontal_uncertainty.empty() && !opt.jitter_amplitude.empty()) \n    vw::vw_throw(vw::ArgumentErr() \n      << \"Cannot specify both jitter uncertainty and jitter amplitude.\\n\");\n\n  bool have_pose_perturb = opt.random_pose_perturbation || opt.perturb_cameras;\n  bool model_jitter = (!std::isnan(opt.jitter_frequency[0]) || have_pose_perturb);\n  if (model_jitter) {\n\n    bool have_roll_pitch_yaw = !std::isnan(opt.roll) && !std::isnan(opt.pitch) &&\n      !std::isnan(opt.yaw);\n    if (!have_roll_pitch_yaw && !have_pose_perturb)\n      vw::vw_throw(vw::ArgumentErr() << \"Modelling jitter requires specifying --roll, --pitch, and --yaw.\\n\");\n    \n    if (opt.camera_list != \"\" && !have_pose_perturb)\n      vw::vw_throw(vw::ArgumentErr() << \"The --camera-list option must not be set \"\n        << \"when modeling jitter.\\n\");\n\n    // See if the user specified either horizontal uncertainty or jitter amplitude\n    if (opt.horizontal_uncertainty_str.empty() && opt.jitter_amplitude_str.empty() &&\n        std::isnan(opt.random_position_perturbation))\n      vw::vw_throw(vw::ArgumentErr() << \"Must specify either horizontal uncertainty \"\n        << \"or jitter amplitude.\\n\");\n\n    if (3 * opt.jitter_frequency.size() != opt.jitter_phase.size())\n      vw::vw_throw(vw::ArgumentErr() << \"The number of jitter phases must be \"\n        << \"three times the number of jitter frequencies.\\n\");\n\n    if (opt.horizontal_uncertainty.empty()) {\n      // Jitter amplitude was specified\n      if (3 * opt.jitter_frequency.size() != opt.jitter_amplitude.size())\n        vw::vw_throw(vw::ArgumentErr() << \"The number of jitter amplitudes must be \"\n          << \"three times the number of jitter frequencies.\\n\");\n    } else {\n      // Horizontal uncertainty was specified.\n      if (opt.horizontal_uncertainty.size() != 3)\n        vw::vw_throw(vw::ArgumentErr() << \"The number of horizontal uncertainty values \"\n          << \"must be 3.\\n\");\n      \n      if (opt.horizontal_uncertainty[0] < 0 || opt.horizontal_uncertainty[1] < 0 ||\n          opt.horizontal_uncertainty[2] < 0)\n        vw::vw_throw(vw::ArgumentErr() \n                     << \"The horizontal uncertainty must be non-negative.\\n\");\n    }\n\n    // Check that all jitter frequencies are not NaN and positive\n    for (size_t i = 0; i < opt.jitter_frequency.size(); i++) {\n      if (std::isnan(opt.jitter_frequency[i]) && !opt.random_pose_perturbation &&\n          std::isnan(opt.random_position_perturbation))\n        vw::vw_throw(vw::ArgumentErr() << \"The jitter frequency must be specified.\\n\");\n      if (opt.jitter_frequency[i] <= 0)\n        vw::vw_throw(vw::ArgumentErr() << \"The jitter frequency must be positive.\\n\");\n    }\n    \n  } // end if model jitter\n\n  if (opt.velocity <= 0)\n    vw::vw_throw(vw::ArgumentErr() << \"The satellite velocity must be positive.\\n\");\n\n  // Checks for linescan cameras\n  bool have_linescan = (opt.sensor_type.find(\"linescan\") != std::string::npos);\n  if (have_linescan && std::isnan(opt.velocity))\n    vw::vw_throw(vw::ArgumentErr() << \"The satellite velocity must be specified \"\n      << \"in order to create linescan cameras.\\n\");\n  if (opt.non_square_pixels && !have_linescan)\n    vw::vw_throw(vw::ArgumentErr() << \"Cannot specify --non-square-pixels unless creating \"\n      << \"linescan cameras.\\n\");\n\n  // Sanity check the first and last indices\n  int ans = int(opt.first_index < 0) + int(opt.last_index < 0);\n  if (ans != 0 && ans != 2)\n    vw::vw_throw(vw::ArgumentErr() << \"Either both first and last indices must be \"\n      \"specified, or none.\\n\");\n  if (ans == 0 && opt.first_index >= opt.last_index)\n    vw::vw_throw(vw::ArgumentErr() << \"The first index must be less than \"\n      \"the last index.\\n\");\n\n  // Check for sensor type. With a rig, it will be checked later, per sensor.\n  if (!have_rig) {\n    if (opt.sensor_type == \"frame\")\n      opt.sensor_type = \"pinhole\"; // pinhole is same as frame\n    if (opt.sensor_type != \"pinhole\" && opt.sensor_type != \"linescan\")\n      vw::vw_throw(vw::ArgumentErr() \n                 << \"The sensor type must be either pinhole/frame or linescan.\\n\");\n  }\n\n  if (opt.model_time) {\n    // Must have the velocity set\n    if (std::isnan(opt.velocity))\n      vw::vw_throw(vw::ArgumentErr() << \"Must set the velocity to model time.\\n\");\n      \n     // Must have first ground pos\n    if (std::isnan(norm_2(opt.first_ground_pos)))\n      vw::vw_throw(vw::ArgumentErr() \n                   << \"Must set the first ground position to model time.\\n\"); \n      \n    if (opt.camera_list != \"\")\n      vw::vw_throw(vw::ArgumentErr() << \"Cannot model time with --camera-list.\\n\");\n  }\n  \n  // Check the reference time. We want the time accurate to within 1e-8 seconds,\n  // and that is tricky when the time is large.\n  if (opt.ref_time <= 0 || opt.ref_time >= 1e+6)\n    vw::vw_throw(vw::ArgumentErr() << \"The reference time is not positive or is too large. \"\n                 << \"This can cause numerical issues.\\n\");\n    \n  if (have_rig) {\n    // Read the rig configuration\n    bool have_rig_transforms = true; // dictated by the api\n    rig::readRigConfig(opt.rig_config, have_rig_transforms, rig);\n    // Must have just one rig\n    if (rig.cam_set.size() != 1)\n      vw::vw_throw(vw::ArgumentErr() << \"Only one rig (reference sensor) is supported \"\n                   << \"in sat_sim.\\n\");  \n\n    for (size_t i = 0; i < rig.cam_params.size(); i++) {\n      auto const& params = rig.cam_params[i];\n    \n      // If the optical center is large, the images will show up very oblique.\n      // The current sat_sim logic implicitly assumes that the optical center is close to\n      // the image center, as we shoot rays to the ground not through the optical\n      // center but through the middle of the image.\n      if (params.GetOpticalOffset()[0] < 0 || params.GetOpticalOffset()[1] < 0 ||\n          params.GetOpticalOffset()[0] >= params.GetDistortedSize()[0] || \n          params.GetOpticalOffset()[1] >= params.GetDistortedSize()[1])\n        vw::vw_throw(vw::ArgumentErr() << \"The optical center must be non-negative and \"\n                    << \"within the image bounds. It is suggested to have it close to \"\n                    << \"the image center.\\n\");\n    \n      if (params.GetDistortion().size() != 0)\n        vw::vw_throw(vw::ArgumentErr() << \"Distortion is not supported in sat_sim.\\n\");\n    }\n  }\n\n  if (have_perturb) {\n    // must have camera list\n    if (opt.camera_list.empty())\n      vw::vw_throw(vw::ArgumentErr() << \"Must have camera list to perturb cameras.\\n\");\n      \n    // Sensor type must be pinhole\n    if (opt.sensor_type != \"pinhole\")\n      vw::vw_throw(vw::ArgumentErr() \n                   << \"Perturbing cameras is only supported for pinhole cameras.\\n\");\n      \n    // Must not have a rig\n    if (!opt.rig_config.empty())\n      vw::vw_throw(vw::ArgumentErr() \n                   << \"Perturbing cameras is not supported for rigs.\\n\");\n    \n    // Must set the satellite velocity\n    if (std::isnan(opt.velocity) && opt.perturb_cameras)\n      vw::vw_throw(vw::ArgumentErr() \n                   << \"Must set the satellite velocity to perturb cameras.\\n\");\n    \n    // The jitter frequency must be set and not NaN\n    if ((opt.jitter_frequency.empty() || std::isnan(opt.jitter_frequency[0])) &&\n         opt.perturb_cameras)\n      vw::vw_throw(vw::ArgumentErr() \n                   << \"Must set the jitter frequency to perturb cameras.\\n\");\n    \n    if ((std::isnan(opt.velocity) || opt.velocity <= 0.0) && \n        std::isnan(opt.random_position_perturbation))\n      vw::vw_throw(vw::ArgumentErr() << \"The satellite velocity must be set and positive if \"\n                   << \"perturbing existing cameras.\\n\");\n  \n    // No images will be created\n    opt.no_images = true;\n  }\n  \n // Blur sigma must be non-negative\n if (opt.blur_sigma < 0)\n   vw::vw_throw(vw::ArgumentErr() << \"The blur sigma must be non-negative.\\n\");\n   \n  return;\n}\n\nint main(int argc, char *argv[]) {\n\n  asp::SatSimOptions opt;\n  rig::RigSet rig;\n  try {\n    handle_arguments(argc, argv, opt, rig);\n\n    // Read the DEM\n    vw::ImageViewRef<vw::PixelMask<float>> dem;\n    float dem_nodata_val = -std::numeric_limits<float>::max(); // will change\n    vw::cartography::GeoReference dem_georef;\n    vw::cartography::readGeorefImage(opt.dem_file, dem_nodata_val, dem_georef, dem);\n    double height_guess = vw::cartography::demHeightGuess(dem); // for image-to-ground\n\n    // Read the ortho image\n    vw::ImageViewRef<vw::PixelMask<float>> ortho;\n    float ortho_nodata_val = -std::numeric_limits<float>::max(); // will change\n    vw::cartography::GeoReference ortho_georef;\n    bool have_perturb = opt.perturb_cameras || opt.random_pose_perturbation ||\n                        !std::isnan(opt.random_position_perturbation);\n\n    if (!have_perturb)\n      vw::cartography::readGeorefImage(opt.ortho_file, ortho_nodata_val, ortho_georef, ortho);\n\n    std::vector<std::string> cam_names;\n    std::vector<vw::CamPtr> cams;\n    bool external_cameras = false;\n    std::string suffix = \"\"; \n    if (!opt.camera_list.empty()) {\n      // Read the cameras\n      external_cameras = true;\n      if (opt.sensor_type == \"pinhole\")\n        asp::readPinholeCameras(opt, cam_names, cams);\n      else\n        asp::readLinescanCameras(opt, cam_names, cams);\n      \n      if (have_perturb)\n        asp::perturbCameras(opt, suffix, dem_georef, cam_names, cams);\n        \n      // Generate images\n      if (!opt.no_images)\n        asp::genImages(opt, external_cameras, cam_names, cams, suffix, dem_georef, dem, \n          height_guess, ortho_georef, ortho, ortho_nodata_val);\n      \n    } else if (opt.rig_config.empty()) {\n      // Generate the cameras   \n      // The matrix cam2world_no_jitter is only needed with linescan cameras,\n      // but compute it for consistency in all cases.\n      bool have_rig = false;\n      int rig_sensor_index = -1;\n      asp::genCamerasImages(ortho_nodata_val, have_rig, rig_sensor_index,\n                            dem, height_guess, ortho_georef, ortho, opt, \n                            rig, dem_georef, suffix); \n\n    } else {\n      // The rig needs special treatment \n      asp::genRigCamerasImages(opt, rig, dem_georef, dem, height_guess, \n                               ortho_georef, ortho, ortho_nodata_val);\n    }\n\n    if (!opt.rig_config.empty())\n      asp::writeRelRig(opt.out_prefix, rig);\n\n  } ASP_STANDARD_CATCHES;\n\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/scale_bathy_mask.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n'''\nA tool which takes as input a multispectral mask and a PAN image,\nand scales and crops the former to agree with the latter. Used\nduring shallow-water bathymetry. See:\nhttps://stereopipeline.readthedocs.io/en/latest\n'''\nfrom __future__ import print_function\nimport sys, os, subprocess\n\n# The path to the ASP python files\nbasepath    = os.path.abspath(sys.path[0])\npythonpath  = os.path.abspath(basepath + '/../Python')  # for dev ASP\nlibexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP\nsys.path.insert(0, basepath) # prepend to Python path\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\n\nimport asp_system_utils, asp_image_utils\nasp_system_utils.verify_python_version_is_supported()\n\n# Prepend to system PATH\nos.environ[\"PATH\"] = libexecpath + os.pathsep + os.environ[\"PATH\"]\n\nif len(sys.argv) < 4:\n    print(\"Usage: \" + sys.argv[0] + \" ms_mask.tif pan_image.tif output_pan_mask.tif [num_left_cols_crop]\")\n    sys.exit(1)\n\nms_mask = sys.argv[1]\npan_image = sys.argv[2]\n\nif not os.path.exists(ms_mask):\n    print(\"Missing file: \" + ms_mask)\n    sys.exit(1)\n\nif not os.path.exists(pan_image):\n    print(\"Missing file: \" + pan_image)\n    sys.exit(1)\n\n# It is not clear how much to crop on the left\n# A value of 50 seems to work better with WV03 and 48 with WV02.\ncrop_len = 50\nif len(sys.argv) >= 5:\n    crop_len = sys.argv[4]\nprint(\"Will remove \" + str(crop_len) + \" columns on the left after scaling the mask.\")\n\noutput_pan_mask = sys.argv[3]\ntmp_pan_mask = os.path.splitext(output_pan_mask)[0]+'_tmp.tif'\n\nms_width, ms_height = asp_image_utils.getImageSize(ms_mask)\npan_width, pan_height = asp_image_utils.getImageSize(pan_image)\n\n# gdal_translate with options\ngdt = 'gdal_translate -co compress=lzw -co TILED=yes -co INTERLEAVE=BAND ' + \\\n      '-co BLOCKXSIZE=256 -co BLOCKYSIZE=256 -co BIGTIFF=YES '\n\n# Scale up the mask. Cast to float32.\ncmd = gdt + '-outsize 400% 400% -ot float32 ' + ms_mask + \" \" + tmp_pan_mask\n\nprint(cmd)\nos.system(cmd)\n\nscaled_width, scaled_height = asp_image_utils.getImageSize(tmp_pan_mask)\n\n# Remove crop_len pixels from the left edge, then adjust the other dimensions\n# so that the resulting PAN mask dimensions agree with the PAN image.\ncmd = gdt + \"-srcwin \" + str(crop_len) + \" 0 \" + str(pan_width) + \" \" + str(pan_height) + \\\n      \" \" + tmp_pan_mask + \" \" + output_pan_mask\nprint(cmd)\nos.system(cmd)\n\n# Wipe the temporary file\nprint(\"Removing: \" + tmp_pan_mask)\nos.remove(tmp_pan_mask)\n"
  },
  {
    "path": "src/asp/Tools/sfm_merge.cc",
    "content": "/* Copyright (c) 2017, United States Government, as represented by the\n * Administrator of the National Aeronautics and Space Administration.\n *\n * All rights reserved.\n *\n * The Astrobee platform is licensed under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n#include <asp/Rig/RigThread.h>\n#include <asp/Rig/InterestPoint.h>\n#include <asp/Rig/RigConfig.h>\n#include <asp/Rig/MergeMaps.h>\n#include <asp/Rig/BasicAlgs.h>\n#include <asp/Core/Nvm.h>\n\n#include <opencv2/features2d/features2d.hpp>\n\n#include <gflags/gflags.h>\n#include <glog/logging.h>\n\n#include <iostream>\n#include <fstream>\n#include <algorithm>\n#include <thread>\n\n// Merge n maps by merging second into the first, then the third into\n// the merged map, etc. It works by finding matches among the maps\n// using -num_image_overlaps_at_endpoints and then bringing the second\n// map in the coordinate system of the first map. It is suggested that\n// bundle adjustment and registration to real-world coordinate systems\n// be (re-)done after maps are merged, using rig_calibrator.\n\nDEFINE_string(rig_config, \"\",\n              \"Read the configuration of sensors from this file in the format used for \"\n              \"rig_calibrator, even though this tool does not use the rig structure. \"\n              \"The output of this program can be passed back to rig_calibrator, \"\n              \"with or without the rig constraint.\");\n\nDEFINE_string(output_map, \"\",\n              \"Output file containing the merged map.\");\n\nDEFINE_int32(num_threads, rig::defaultNumThreads(), \"Number of threads to use.\");\n\nDEFINE_int32(num_image_overlaps_at_endpoints, 10,\n             \"Search this many images at the beginning and end of the first map \"\n             \"for matches to this many images at the beginning and end of the \"\n             \"second map.\");\n\nDEFINE_bool(fix_first_map, false,\n            \"If true, after merging the maps and reconciling the camera poses for the \"\n            \"shared images, overwrite the shared poses with those from the first map.\");\n\nDEFINE_bool(fast_merge, false,\n            \"When merging maps that have shared images, use their camera poses to \"\n            \"find the transform from other maps to first map, and skip finding \"\n            \"additional matches among the images.\");\n\nDEFINE_bool(no_shift, false,\n            \"Assume that in the input .nvm files the features are not shifted \"\n            \"relative to the optical center. The merged map will then be saved \"\n            \"the same way. The usual behavior is that .nvm file features are \"\n            \"shifted, then this tool internally undoes the shift.\");\n\nDEFINE_bool(no_transform, false,\n            \"Do not compute and apply a transform from the other \"\n            \"maps to the first one. This keeps the camera poses as \"\n            \"they are (shared poses and features will be reconciled). \"\n            \"This will succeed even when the two maps do not overlap.\");\n\nDEFINE_double(close_dist, -1.0,\n              \"Two triangulated points are considered to be close if no further \"\n              \"than this distance, in meters. Used as inlier threshold when \"\n              \"identifying triangulated points after the maps are \"\n              \"aligned. Auto-computed, taking into account the extent of \"\n              \"a tight subset of the triangulated points and printed on screen if \"\n              \"not set. This is an advanced option. \");\n\nDEFINE_string(image_sensor_list, \"\",\n              \"Read image name, sensor name, and timestamp, from each line in this list. \"\n              \"Alternatively, a directory structure can be used.\");\n\nvoid parameterValidation(int argc, char** argv) {\n\n  if (argc < 3)\n    LOG(FATAL) << \"Usage: \" << argv[0] << \" <input maps> -output-map <output map>\";\n\n  // Ensure we don't over-write one of the inputs\n  for (int i = 1; i < argc; i++) {\n    if (argv[i] == FLAGS_output_map)\n      LOG(FATAL) << \"The input and output maps must have different names.\";\n  }\n  \n  if (FLAGS_rig_config == \"\")\n    LOG(FATAL) << \"The rig configuration was not specified.\";\n\n  if (FLAGS_output_map == \"\")\n    LOG(FATAL) << \"No output map was specified.\";\n  \n  if (!FLAGS_fast_merge && FLAGS_num_image_overlaps_at_endpoints <= 0)\n    LOG(FATAL) << \"Must have num_image_overlaps_at_endpoints > 0.\";\n\n  if (FLAGS_fix_first_map && argc != 3)\n    LOG(FATAL) << \"Keeping the first map fixed works only when there are two input maps.\";\n}\n\n// Merge offsets read from different nvm files. Any duplicate offsets must be the same.\nvoid mergeOffsets(std::vector<std::map<std::string, Eigen::Vector2d>> const& offsets,\n                  std::map<std::string, Eigen::Vector2d> & combined_offsets) {\n\n  // Wipe the output\n  combined_offsets.clear();\n  \n  for (size_t i = 0; i < offsets.size(); i++) {\n    for (auto const& it: offsets[i]) {\n      auto pos = combined_offsets.find(it.first);\n      if (pos == combined_offsets.end()) {\n        combined_offsets[it.first] = it.second;\n      } else {\n        if (pos->second != it.second) {\n          LOG(FATAL) << \"The same image has different offsets in different maps.\";\n        }\n      }\n    }\n  }\n}\n\nint main(int argc, char** argv) {\n  google::InitGoogleLogging(argv[0]);\n  google::ParseCommandLineFlags(&argc, &argv, true);\n  parameterValidation(argc, argv);\n\n  rig::RigSet R;\n  bool use_initial_rig_transforms = false; // not used, part of the API\n  rig::readRigConfig(FLAGS_rig_config, use_initial_rig_transforms, R);\n\n  // Store the offsets for all maps that we will merge\n  std::vector<std::map<std::string, Eigen::Vector2d>> offsets(argc - 1);\n\n  asp::nvmData in0;\n  asp::readNvm(argv[1],\n               in0.cid_to_keypoint_map,\n               in0.cid_to_filename,\n               in0.pid_to_cid_fid,\n               in0.pid_to_xyz,\n               in0.world_to_cam,\n               in0.focal_lengths);\n  if (!FLAGS_no_shift) {\n    bool undo_shift = true; // remove the shift relative to the optical center\n    std::string offsets_file = asp::offsetsFilename(argv[1]);\n    asp::readNvmOffsets(offsets_file, in0.optical_centers);\n    offsets[0] = in0.optical_centers;\n    // TODO(oalexan1): Undoing shift of keypoints should happen on reading the nvm\n    rig::shiftKeypoints(undo_shift, R, in0);\n  }\n  \n  // Successively append the maps\n  asp::nvmData out_map;\n  for (int i = 2; i < argc; i++) {\n    \n    asp::nvmData in1;\n    asp::readNvm(argv[i],\n                 in1.cid_to_keypoint_map,\n                 in1.cid_to_filename,\n                 in1.pid_to_cid_fid,\n                 in1.pid_to_xyz,\n                 in1.world_to_cam,\n                 in1.focal_lengths);\n    if (!FLAGS_no_shift) {\n      bool undo_shift = true; // remove the shift relative to the optical center\n      std::string offsets_file = asp::offsetsFilename(argv[i]);\n      asp::readNvmOffsets(offsets_file, in1.optical_centers); \n      offsets[i - 1] = in1.optical_centers;\n      // TODO(oalexan1): Undoing shift of keypoints should happen on reading the nvm\n      rig::shiftKeypoints(undo_shift, R, in1);\n    }\n    \n    // TODO(oalexan1): Add flag to not have to transform second map, then use\n    // this code to merge the theia nvm and produced nvm.\n    rig::MergeMaps(in0, in1, R,\n                         FLAGS_num_image_overlaps_at_endpoints,\n                         FLAGS_fast_merge,\n                         FLAGS_no_transform,\n                         FLAGS_close_dist,\n                         FLAGS_image_sensor_list,\n                         FLAGS_num_threads,\n                         out_map);\n    \n    if (i + 1 < argc) {\n      // There are more maps to marge. Let in0 be what we have so far,\n      // and will merge onto it at the next iteration\n      // TODO(oalexan1): Test this!\n      in0 = out_map;\n    }\n  }\n\n  if (FLAGS_fix_first_map) {\n    // TODO(oalexan1): Make this work with N maps\n    // Poses shared among the two input maps were averaged after\n    // merging in out_map. Now, replace all poses in out_map which\n    // exist in the first map with the originals from that map.\n    std::map<std::string, int> in0_name_to_cid;\n    for (size_t in0_cid = 0; in0_cid < in0.cid_to_filename.size(); in0_cid++)\n      in0_name_to_cid[in0.cid_to_filename[in0_cid]] = in0_cid;\n    \n    for (size_t out_cid = 0; out_cid < out_map.cid_to_filename.size(); out_cid++) {\n      auto pos = in0_name_to_cid.find(out_map.cid_to_filename[out_cid]);\n      if (pos == in0_name_to_cid.end()) continue;  // was not in in0\n      \n      int in0_cid = pos->second;\n      out_map.world_to_cam[out_cid] = in0.world_to_cam[in0_cid];\n    }\n  }\n\n  if (!FLAGS_no_shift) {\n    bool undo_shift = false; // put back the shift\n    // TODO(oalexan1): This must happen in MergeMaps\n    mergeOffsets(offsets, out_map.optical_centers);\n    // TODO(oalexan1): Shifting the keypoints should happen on writing the nvm\n    rig::shiftKeypoints(undo_shift, R, out_map);\n  }\n  \n  // TODO(oalexan1): Throw out outliers!\n  asp::writeNvm(out_map.cid_to_keypoint_map,\n                      out_map.cid_to_filename,\n                      out_map.pid_to_cid_fid,\n                      out_map.pid_to_xyz,\n                      out_map.world_to_cam,\n                      FLAGS_output_map);\n\n  // Save the optical offsets\n  if (!FLAGS_no_shift) {\n    // Write the optical center offsets to a file\n    std::string offsets_file = asp::offsetsFilename(FLAGS_output_map);\n    asp::writeNvmOffsets(offsets_file, out_map.optical_centers);\n  }\n  \n  return 0;\n}\n\n"
  },
  {
    "path": "src/asp/Tools/sfm_proc",
    "content": "#!/usr/bin/env python\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n\"\"\"\n    Documentation:\n    https://stereopipeline.readthedocs.io/en/latest/tools/sfm_proc.html\n\"\"\"\n\nimport argparse, glob, os, re, subprocess, sys\n\n# Set up the path to Python modules about to load\nbasepath    = os.path.abspath(sys.path[0])\npythonpath  = os.path.abspath(basepath + '/../Python')  # for dev ASP\nlibexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP\nsys.path.insert(0, basepath) # prepend to Python path\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\n\nimport asp_system_utils, asp_string_utils, asp_cmd_utils\nasp_system_utils.verify_python_version_is_supported()\n\ndef sanityChecks(args):\n\n    if args.image_list == \"\":\n        raise Exception(\"The path to the image list was not specified.\")\n\n    if args.out_dir == \"\":\n        raise Exception(\"The path to the output directory was not specified.\")\n\ndef processArgs(args):\n    \"\"\"\n    Set up the parser and parse the args.\n    \"\"\"\n\n    # Number of arguments before starting to parse them\n    num_input_args = len(sys.argv)\n\n    parser = argparse.ArgumentParser(description=\"\")\n    parser.add_argument(\"--image-list\",  dest=\"image_list\", default=\"\",\n      help = \"A file listing the input images with EXIF data, one per line.\")\n\n    parser.add_argument(\"--out-dir\", dest=\"out_dir\", default=\"\",\n      help=\"The output directory that will contain the processed data.\")\n\n    args, other = parser.parse_known_args()\n\n    # Print the help message if called with no arguments\n    if num_input_args <= 1:\n        parser.print_help()\n        sys.exit(1)\n\n    sanityChecks(args)\n    \n    return args\n\ndef extractExif(jpg_file_path):\n    \"\"\"\n    Extract some EXIF metadata from a JPG file using gdalinfo.\n\n    Args:\n        jpg_file_path (str): Path to the JPG file\n\n    Returns:\n        dict: A dictionary of GPS-related EXIF metadata\n    \"\"\"\n    try:\n        # Run gdalinfo and capture its output\n        result = subprocess.run(\n            ['gdalinfo', jpg_file_path], \n            capture_output=True, \n            text=True, \n            check=True\n        )\n        \n        # Dictionary to store GPS metadata\n        gps_metadata = {}\n        \n        # Regex patterns for specific GPS fields\n        patterns = {\n            'GPSAltitude': r'EXIF_GPSAltitude=\\(([^)]+)\\)',\n            'GPSImgDirection': r'EXIF_GPSImgDirection=\\(([^)]+)\\)',\n            'GPSLatitude': r'EXIF_GPSLatitude=\\(([^)]+)\\) \\(([^)]+)\\) \\(([^)]+)\\)',\n            'GPSLongitude': r'EXIF_GPSLongitude=\\(([^)]+)\\) \\(([^)]+)\\) \\(([^)]+)\\)',\n            'GPSLongitudeRef': r'EXIF_GPSLongitudeRef=(\\w+)'\n        }\n        \n        # Extract each GPS field\n        for key, pattern in patterns.items():\n            \n            match = re.search(pattern, result.stdout)\n            if match:\n                if key in ['GPSLatitude', 'GPSLongitude']:\n                    # For latitude and longitude, store as a tuple of three values\n                    deg = float(match.group(1))\n                    min = float(match.group(2))\n                    sec = float(match.group(3))\n                    # sec must be 0\n                    if sec != 0:\n                        raise Exception(f\"Unexpected third value for key: \" + key)\n                    gps_metadata[key] = deg + min/60.0 + sec/3600.0\n                    \n                else:\n                    # For other fields, store the first match group\n                    gps_metadata[key] = match.group(1)\n        \n        # Check that all fields were present by iterating over the keys of patterns\n        for key in patterns.keys():\n            if key not in gps_metadata:\n                print(f\"Missing EXIF field: {key} in file {jpg_file_path}\")\n        \n        # If the lowercase value of GPSLongitudeRef is 'w', make the longitude negative\n        if 'GPSLongitudeRef' in gps_metadata and \\\n            gps_metadata['GPSLongitudeRef'].lower() == 'w':\n            gps_metadata['GPSLongitude'] = -gps_metadata['GPSLongitude']\n        \n        return gps_metadata\n    \n    except subprocess.CalledProcessError as e:\n        print(f\"Error running gdalinfo: {e}\")\n        print(f\"stderr: {e.stderr}\")\n        return {}\n    except FileNotFoundError:\n        print(\"gdalinfo command not found. Make sure GDAL is installed.\")\n        return {}\n    except Exception as e:\n        print(f\"Unexpected error extracting GPS metadata: {e}\")\n        return {}\n \n# Read the input image list. Iterate over images.\ndef processImageList(image_list_path, out_dir):\n    print(\"Extracting EXIF data from images in: \" + image_list_path)\n    \n    # Read all image from image_list_path into an array\n    image_list = []\n    with open(image_list_path, 'r') as f:\n        for line in f:\n            image_list.append(line.strip())\n    \n    # Create the output directory if it does not exist\n    if not os.path.exists(out_dir):\n        os.makedirs(out_dir)\n        \n    # Save the results in 'extrinsics.txt' in the output directory\n    extrinsics_path = os.path.join(out_dir, 'extrinsics.txt')\n    \n    # Open this for writing\n    with open(extrinsics_path, 'w') as f:\n        f.write(\"# image, lon, lat, height_above_datum, roll, pitch, yaw\\n\")\n        f.write(\"# datum: WGS84\\n\") # assume the WG84 datum\n        \n        numImages = 0\n        for line in image_list:\n            jpg_file_path = line.strip()\n            print(f\"Processing: {jpg_file_path}\")\n            \n            # File must exist\n            if not os.path.exists(jpg_file_path):\n                print(f\"File does not exist: {jpg_file_path}\")\n                continue\n            \n            gps_metadata = extractExif(jpg_file_path)\n            numImages += 1\n            \n            lon = gps_metadata.get('GPSLongitude', 0)\n            lat = gps_metadata.get('GPSLatitude', 0)\n            alt = float(gps_metadata.get('GPSAltitude', 0))\n            \n            # The exif metadata lack the roll and pitch, so we set them to 0\n            roll = 0\n            pitch = 0\n            yaw = float(gps_metadata.get('GPSImgDirection', 0))\n\n            # Append the GPS metadata to the extrinsics file. Use double precision\n            # with 17 digits of precision.\n            f.write(f\"{jpg_file_path}, {lon:.17f}, {lat:.17f}, {alt:.17f}, {roll:.17f}, {pitch:.17f}, {yaw:.17f}\\n\")\n    \n    # Error out if no images were processed\n    if numImages == 0:\n        raise Exception(\"Could not process any images in the list \" + image_list_path)\n    \n    print(\"Wrote: \" + extrinsics_path)\n\nif __name__ == \"__main__\":\n\n    args = processArgs(sys.argv)\n    \n    processImageList(args.image_list, args.out_dir)\n    \n"
  },
  {
    "path": "src/asp/Tools/sfm_submap.cc",
    "content": "/* Copyright (c) 2017, United States Government, as represented by the\n * Administrator of the National Aeronautics and Space Administration.\n *\n * All rights reserved.\n *\n * The Astrobee platform is licensed under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n#include <asp/Rig/RigThread.h>\n#include <asp/Rig/RigConfig.h>\n#include <asp/Rig/BasicAlgs.h>\n#include <asp/Core/Nvm.h>\n\n#include <opencv2/features2d/features2d.hpp>\n\n#include <gflags/gflags.h>\n#include <glog/logging.h>\n\n#include <iostream>\n#include <fstream>\n#include <algorithm>\n#include <thread>\n\n#include <boost/filesystem.hpp>\nnamespace fs = boost::filesystem;\n\n// Given a map, extract a submap with only specified images. Works\n// with nvm files where features are either shifted relative\n// to the optical center or not, and saves the submap in the same format.\n\n// Can be useful if the map failed to build properly, but parts of it\n// are still salvageable. Those can be extracted, new small maps can\n// be created of the region that failed, then all maps can be merged\n// together.\n\n// It is suggested that each extracted submap consist only of consecutive\n// images (each image overlaps with the one before and after it). Such\n// submaps are easier to merge.\n\n// Usage:\n// sfm_submap -input_map <input map> -output_map <output map> <images to keep>\n//\n// sfm_submap -input_map <input map> -output_map <output map> -image_list <file>\n\nDEFINE_string(input_map, \"\",\n              \"The input map, in .nvm format.\");\n\nDEFINE_string(output_map, \"\",\n              \"The output map, in .nvm format.\");\n\nDEFINE_string(image_list, \"\",\n              \"A file having the names of the images to be included in \"\n              \"the submap, one per line.\");\n\nvoid parameterValidation() {\n  if (FLAGS_input_map == \"\")\n    LOG(FATAL) << \"Must specify the input map.\\n\";\n  \n  if (FLAGS_output_map == \"\")\n    LOG(FATAL) << \"Must specify the output map.\\n\";\n}\n\nint main(int argc, char** argv) {\n  google::InitGoogleLogging(argv[0]);\n  google::ParseCommandLineFlags(&argc, &argv, true);\n  parameterValidation();\n\n  std::vector<std::string> images_to_keep;\n  if (FLAGS_image_list == \"\") {\n    // Get the images from the command line\n    for (int i = 1; i < argc; i++)\n      images_to_keep.push_back(argv[i]);\n  } else {\n    // Get the images from a file\n    std::string image;\n    std::ifstream image_handle(FLAGS_image_list);\n    while (image_handle >> image)\n      images_to_keep.push_back(image);\n  }\n\n  asp::nvmData nvm;\n  asp::readNvm(FLAGS_input_map,\n               nvm.cid_to_keypoint_map,\n               nvm.cid_to_filename,\n               nvm.pid_to_cid_fid,\n               nvm.pid_to_xyz,\n               nvm.world_to_cam,\n               nvm.focal_lengths);\n \n  std::string offsets_file = asp::offsetsFilename(FLAGS_input_map);\n  if (!fs::exists(offsets_file))\n    std::cout << \"WARNING: No offsets file found. Will not write offsets for the submap.\\n\";\n  else \n    asp::readNvmOffsets(offsets_file, nvm.optical_centers);\n\n  // Extract the submap. Will also extract a subset of the optical centers.\n  asp::ExtractSubmap(images_to_keep, nvm);\n\n  asp::writeNvm(nvm.cid_to_keypoint_map,\n                nvm.cid_to_filename,\n                nvm.pid_to_cid_fid,\n                nvm.pid_to_xyz,\n                nvm.world_to_cam,\n                FLAGS_output_map);\n\n  if (std::ifstream(offsets_file)) {\n    std::string output_offsets_file = asp::offsetsFilename(FLAGS_output_map);\n    asp::writeNvmOffsets(output_offsets_file, nvm.optical_centers);\n  }\n\n  return 0;\n}\n\n"
  },
  {
    "path": "src/asp/Tools/sfm_view.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Derived from MVE (Simon Fuhrmann, TU Darmstadt, BSD 3-Clause).\n\n#include <asp/SfmView/GlCommon.h>\n#include <asp/SfmView/SfmMainWindow.h>\n\n#include <QApplication>\n#include <QStyleFactory>\n\n#include <cstdlib>\n#include <iostream>\n#include <string>\n#include <vector>\n\nvoid print_usage_and_exit() {\n  std::cerr << \"Usage: sfm_view [OPTIONS] cameras.tsai ...\\n\"\n            << \"Options:\\n\"\n            << \"  -h, --help      Print this help and exit\\n\"\n            << \"  --width VALUE   Window width in pixels\\n\"\n            << \"  --height VALUE  Window height in pixels\\n\";\n  std::exit(EXIT_FAILURE);\n}\n\nint main(int argc, char** argv) {\n\n  std::vector<std::string> cameras;\n  int width = 1400, height = 1200; // default window size\n\n  for (int i = 1; i < argc; i++) {\n    std::string arg = argv[i];\n    if (arg == \"-h\" || arg == \"--help\")\n      print_usage_and_exit();\n    else if (arg == \"--width\" && i + 1 < argc)\n      width = std::atoi(argv[++i]);\n    else if (arg == \"--height\" && i + 1 < argc)\n      height = std::atoi(argv[++i]);\n    else\n      cameras.push_back(arg);\n  }\n\n  if (cameras.empty()) {\n    std::cerr << \"No camera files specified.\\n\";\n    print_usage_and_exit();\n  }\n\n  if (width < 10 || height < 10) {\n    std::cerr << \"Invalid width or height. Must be at least 10.\\n\";\n    std::exit(EXIT_FAILURE);\n  }\n\n  // Set OpenGL version that Qt should use when creating a context.\n  QSurfaceFormat fmt;\n  fmt.setVersion(3, 3);\n  fmt.setDepthBufferSize(24);\n  fmt.setStencilBufferSize(8);\n  fmt.setProfile(QSurfaceFormat::CoreProfile);\n  QSurfaceFormat::setDefaultFormat(fmt);\n\n  // Create application.\n  QApplication app(argc, argv);\n  QStyle* style = QStyleFactory::create(\"Cleanlooks\");\n  if (style != nullptr)\n    QApplication::setStyle(style);\n\n  // Create main window.\n  SfmMainWindow win(width, height);\n\n  // Load camera files\n  win.load_scene(cameras);\n\n  return app.exec();\n}\n"
  },
  {
    "path": "src/asp/Tools/sfs.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// Deal with outliers in image intensity.\n// TODO: Ensure the output DEM is float. Check its no-data value.\n// TODO: Must specify in the SfS doc that the Lunar-Lambertian model fails at poles\n// TODO: Study the effect of using bicubic interpolation.\n// TODO: Find a good automatic value for the smoothness weight.\n// TODO: Check that we are within image boundaries when interpolating.\n// TODO: Study the normal computation formula.\n\n/// \\file sfs.cc\n\n// Turn off warnings from boost and other packages\n#if defined(__GNUC__) || defined(__GNUG__)\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wunused-local-typedefs\"\n#endif\n\n#include <asp/SfS/SfsImageProc.h>\n#include <asp/SfS/SfsUtils.h>\n#include <asp/SfS/SfsOptions.h>\n#include <asp/SfS/SfsArgs.h>\n#include <asp/SfS/SfsCamera.h>\n#include <asp/SfS/SfsModel.h>\n#include <asp/SfS/SfsErrorEstim.h>\n#include <asp/SfS/SfsCostFun.h>\n#include <asp/Sessions/StereoSessionFactory.h>\n#include <asp/Camera/CsmModel.h>\n#include <asp/Core/Macros.h>\n#include <asp/Core/DemUtils.h>\n#include <asp/Core/BaseCameraUtils.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/FileUtils.h>\n\n#include <asp/asp_config.h> // defines ASP_HAVE_PKG_ISIS\n#if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1\n#include <asp/IsisIO/IsisCameraModel.h>\n#endif // ASP_HAVE_PKG_ISIS\n\n#include <vw/Image/MaskViews.h>\n#include <vw/Image/AntiAliasing.h>\n#include <vw/Cartography/GeoReferenceUtils.h>\n#include <vw/FileIO/FileUtils.h>\n#include <vw/FileIO/DiskImageIO.h>\n#include <vw/FileIO/DiskImageView.h>\n#include <vw/Core/Stopwatch.h>\n#include <vw/Cartography/GeoTransform.h>\n\n#include <ceres/ceres.h>\n#include <ceres/loss_function.h>\n\n#include <cmath>\n#include <iostream>\n#include <set>\n#include <string>\n\n#if defined(__GNUC__) || defined(__GNUG__)\n#pragma GCC diagnostic pop\n#undef LOCAL_GCC_VERSION\n#endif\n\nnamespace fs = boost::filesystem;\n\nusing namespace vw::camera;\nusing namespace vw::cartography;\nusing namespace asp;\n\n// Run sfs\nvoid runSfs(// Fixed quantities\n            int                                num_iterations,\n            double                             gridx,\n            double                             gridy,\n            SfsOptions                       & opt,\n            GeoReference               const & geo,\n            double                             smoothness_weight,\n            double                             max_dem_height,\n            double                             dem_nodata_val,\n            float                              img_nodata_val,\n            std::vector<vw::BBox2i>    const & crop_boxes,\n            std::vector<MaskedImgRefT> const & masked_images,\n            std::vector<DblImgT>       const & blend_weights,\n            bool                               blend_weight_is_ground_weight,\n            asp::ReflParams            const & refl_params,\n            std::vector<vw::Vector3>   const & sunPosition,\n            vw::ImageView<double>      const & orig_dem,\n            vw::ImageView<int>         const & lit_image_mask,\n            vw::ImageView<double>      const & curvature_in_shadow_weight,\n            // Variable quantities\n            vw::ImageView<double>            & dem,\n            vw::ImageView<double>            & albedo,\n            std::vector<vw::CamPtr>          & cameras,\n            std::vector<double>              & exposures,\n            std::vector<std::vector<double>> & haze,\n            std::vector<double>              & refl_coeffs) {\n\n  // Set up the cost function \n  int num_images = opt.input_images.size();\n  ceres::Problem problem;\n  vw::ImageView<vw::Vector2> pq;\n  asp::sfsCostFun(gridx, gridy, smoothness_weight, max_dem_height, dem_nodata_val,\n                  img_nodata_val, blend_weight_is_ground_weight, geo,\n                  crop_boxes, masked_images, blend_weights, refl_params, sunPosition,\n                  orig_dem, lit_image_mask, curvature_in_shadow_weight, opt,\n                  // Outputs\n                  dem, albedo, cameras, exposures, haze, refl_coeffs, pq, problem);\n\n  // Solver options and the callback\n  ceres::Solver::Options options;\n  options.gradient_tolerance = 1e-16;\n  options.function_tolerance = 1e-16;\n  options.max_num_iterations = num_iterations;\n  options.minimizer_progress_to_stdout = 1;\n  options.num_threads = opt.num_threads;\n  options.linear_solver_type = ceres::SPARSE_SCHUR;\n  SfsCallback callback(opt, dem, pq, albedo, geo, refl_params, sunPosition,\n                       crop_boxes, masked_images, blend_weights,\n                       blend_weight_is_ground_weight, cameras,\n                       dem_nodata_val, img_nodata_val, exposures, haze,\n                       max_dem_height, gridx, gridy, refl_coeffs);\n  options.callbacks.push_back(&callback);\n  options.update_state_every_iteration = true;\n\n  // Solve the problem if asked to do iterations. Otherwise\n  // just keep the DEM at the initial guess, while saving\n  // all the output data as if iterations happened.\n  ceres::Solver::Summary summary;\n  if (options.max_num_iterations > 0)\n    ceres::Solve(options, &problem, &summary);\n\n  // Save the final results\n  callback.set_final_iter(true);\n  ceres::IterationSummary callback_summary;\n  callback(callback_summary);\n\n  vw::vw_out() << summary.FullReport() << \"\\n\\n\";\n\n  // Save the covariances\n  if (opt.save_variances)\n    asp::calcSaveSfsCovariances(opt, dem, albedo, problem, geo, dem_nodata_val);\n}\n\n// Load cameras and sun positions\nvoid loadCamerasSunPos(SfsOptions &opt,\n                       vw::ImageView<double> const& dem,\n                       double dem_nodata_val,\n                       vw::cartography::GeoReference const& geo,\n                       std::vector<vw::CamPtr> &cameras,\n                       std::vector<vw::Vector3> &sunPosition) {\n\n  // Initialize outputs\n  int num_images = opt.input_images.size();\n  cameras.resize(num_images);  \n   sunPosition.resize(num_images, vw::Vector3());\n\n  // Read from list or from angles\n  if (opt.sun_positions_list != \"\")\n    asp::readSunPositions(opt.sun_positions_list, opt.input_images,\n                          dem, dem_nodata_val, geo, sunPosition);\n  if (opt.sun_angles_list != \"\")\n    asp::readSunAngles(opt.sun_angles_list, opt.input_images,\n                        dem, dem_nodata_val, geo, sunPosition);\n\n  // Read cameras and compute sun positions if not read from file\n  for (int image_iter = 0; image_iter < num_images; image_iter++) {\n\n    if (opt.skip_images.find(image_iter) != opt.skip_images.end())\n      continue;\n\n    asp::SessionPtr \n      session(asp::StereoSessionFactory::create(opt.stereo_session, // in-out\n                                                opt,\n                                                opt.input_images[image_iter],\n                                                opt.input_images[image_iter],\n                                                opt.input_cameras[image_iter],\n                                                opt.input_cameras[image_iter],\n                                                opt.out_prefix));\n    cameras[image_iter] = session->camera_model(opt.input_images[image_iter],\n                                                opt.input_cameras[image_iter]);\n\n    // Read the sun position from the camera if it is was not read from the list\n    if (sunPosition[image_iter] == vw::Vector3())\n      sunPosition[image_iter] = asp::sunPositionFromCamera(cameras[image_iter]);\n\n    // Sanity check\n    if (sunPosition[image_iter] == vw::Vector3())\n      vw::vw_throw(vw::ArgumentErr()\n                << \"Could not read sun positions from list or from camera model files.\\n\");\n\n    // Compute the azimuth and elevation\n    double azimuth = 0.0, elevation = 0.0;\n    asp::sunAngles(dem, dem_nodata_val, geo, sunPosition[image_iter],\n                    azimuth, elevation);\n\n    // Print this. It will be used to organize the images by illumination\n    // for bundle adjustment.\n    // Since the sun position has very big values and we want to sort uniquely\n    // the images by azimuth angle, use high precision below.\n    vw::vw_out().precision(17);\n    vw::vw_out() << \"Sun position for: \" << opt.input_images[image_iter] << \" is \"\n                 << sunPosition[image_iter] << \"\\n\";\n    vw::vw_out() << \"Sun azimuth and elevation for: \"\n                 << opt.input_images[image_iter] << \" are \" << azimuth\n                 << \" and \" << elevation << \" degrees.\\n\";\n    vw::vw_out().precision(6); // Go back to usual precision\n  }\n    \n} // end function loadCamerasSunPos\n\nvoid calcApproxCamsCropBoxes(vw::ImageView<double> const& dem,\n                             vw::cartography::GeoReference const& geo,\n                             double dem_nodata_val,\n                             // Outputs\n                             SfsOptions &opt,\n                             std::vector<vw::CamPtr> &cameras, \n                             std::vector<vw::BBox2i> &crop_boxes,\n                             vw::Mutex &camera_mutex) {\n\n  double max_approx_err = 0.0;\n  int num_images = opt.input_images.size();\n  \n  for (int image_iter = 0; image_iter < num_images; image_iter++) {\n\n    if (opt.skip_images.find(image_iter) != opt.skip_images.end()) continue;\n\n    // Here we make a copy, since soon cameras[image_iter] will be overwritten\n    vw::CamPtr exact_camera = cameras[image_iter];\n\n    vw::vw_out() << \"Creating an approximate camera model for \"\n                 << opt.input_images[image_iter] << \"\\n\";\n    vw::BBox2i img_bbox = crop_boxes[image_iter];\n    vw::Stopwatch sw;\n    sw.start();\n    boost::shared_ptr<CameraModel> apcam;\n    apcam.reset(new asp::ApproxCameraModel(exact_camera, img_bbox, dem, geo,\n                                           dem_nodata_val, camera_mutex));\n    cameras[image_iter] = apcam;\n\n    sw.stop();\n    vw::vw_out() << \"Approximate model generation time: \" << sw.elapsed_seconds() << \" s.\\n\";\n\n    // Cast the pointer back to ApproxCameraModel as we need that.\n    asp::ApproxCameraModel* cam_ptr\n      = dynamic_cast<asp::ApproxCameraModel*>(apcam.get());\n    if (cam_ptr == NULL)\n      vw::vw_throw(vw::ArgumentErr() << \"Expecting an ApproxCameraModel.\");\n\n    bool model_is_valid = cam_ptr->model_is_valid();\n\n    // Compared original and approximate models\n    double max_curr_err = 0.0;\n\n    if (model_is_valid) {\n      for (int col = 0; col < dem.cols(); col++) {\n        for (int row = 0; row < dem.rows(); row++) {\n          vw::Vector2 ll = geo.pixel_to_lonlat(vw::Vector2(col, row));\n          vw::Vector3 xyz = geo.datum().geodetic_to_cartesian\n            (vw::Vector3(ll[0], ll[1], dem(col, row)));\n\n          // Test how the exact and approximate models compare\n          vw::Vector2 pix3 = exact_camera->point_to_pixel(xyz);\n          vw::Vector2 pix4 = cameras[image_iter]->point_to_pixel(xyz);\n          max_curr_err = std::max(max_curr_err, norm_2(pix3 - pix4));\n\n          cam_ptr->crop_box().grow(pix3);\n          cam_ptr->crop_box().grow(pix4);\n        }\n      }\n\n      cam_ptr->crop_box().crop(img_bbox);\n    } else {\n      vw::vw_out() << \"Invalid camera model.\\n\";\n    }\n\n    if (max_curr_err > 2.0 || !model_is_valid) {\n      // This is a bugfix. When the DEM clip does not intersect the image,\n      // the approx camera model has incorrect values.\n      if (model_is_valid)\n        vw::vw_out() << \"Error of camera approximation is too big.\\n\";\n      vw::vw_out() << \"Skip image \" << image_iter << \"\\n\";\n      opt.skip_images.insert(image_iter);\n      cam_ptr->crop_box() = vw::BBox2();\n      max_curr_err = 0.0;\n    }\n\n    max_approx_err = std::max(max_approx_err, max_curr_err);\n\n    cam_ptr->crop_box().crop(img_bbox);\n    vw::vw_out() << \"Crop box dimensions: \" << cam_ptr->crop_box() << std::endl;\n\n    // Copy the crop box\n    if (opt.crop_input_images)\n      crop_boxes[image_iter].crop(cam_ptr->crop_box());\n\n    // Skip images which result in empty crop boxes\n    if (crop_boxes[image_iter].empty()) {\n      opt.skip_images.insert(image_iter);\n    }\n\n  } // end iterating over images\n  vw::vw_out() << \"Max error of approximating cameras: \" << max_approx_err << \" pixels.\\n\";\n  \n} // end function calcApproxCamsCropBoxes\n\nvoid calcCropBoxes(vw::ImageView<double> const& dem,\n                   vw::cartography::GeoReference const& geo,\n                   std::vector<vw::CamPtr> const& cameras,\n                   // Outputs\n                   SfsOptions &opt,\n                   std::vector<vw::BBox2i> &crop_boxes) {\n\n  int num_images = opt.input_images.size();\n  for (int image_iter = 0; image_iter < num_images; image_iter++) {\n    if (opt.skip_images.find(image_iter) != opt.skip_images.end()) continue;\n\n    // Store the full image box, and initialize the crop box to an empty box\n    vw::BBox2i img_bbox = crop_boxes[image_iter];\n    crop_boxes[image_iter] = vw::BBox2i();\n\n    for (int col = 0; col < dem.cols(); col++) {\n      for (int row = 0; row < dem.rows(); row++) {\n        vw::Vector2 ll = geo.pixel_to_lonlat(vw::Vector2(col, row));\n        vw::Vector3 xyz = geo.datum().geodetic_to_cartesian\n          (vw::Vector3(ll[0], ll[1], dem(col, row)));\n\n        vw::Vector2 pix = cameras[image_iter]->point_to_pixel(xyz);\n        crop_boxes[image_iter].grow(pix);\n      }\n    }\n\n    // Double the box dimensions, just in case. Later the SfS heights\n    // may change, and we may need to see beyond the given box.\n    // TODO(oalexan1): This is likely excessive.\n    double extraFactor = 0.5;\n    double extrax = extraFactor * crop_boxes[image_iter].width();\n    double extray = extraFactor * crop_boxes[image_iter].height();\n    crop_boxes[image_iter].min() -= vw::Vector2(extrax, extray);\n    crop_boxes[image_iter].max() += vw::Vector2(extrax, extray);\n\n    // Crop to the bounding box of the image\n    crop_boxes[image_iter].crop(img_bbox);\n\n    //vw_out() << \"Estimated crop box for image \" << opt.input_images[image_iter] << \"\\n\";\n\n    if (crop_boxes[image_iter].empty())\n      opt.skip_images.insert(image_iter);\n  }\n\n} // end function calcCropBoxes\n\n// Load masked images and compute blending weights. These weights will be adjusted\n// later.\nvoid loadMaskedImagesCalcWeights(SfsOptions const& opt,\n                                 std::vector<vw::BBox2i> const& crop_boxes,\n                                 // Outputs\n                                 std::vector<MaskedImgRefT> &masked_images,\n                                 std::vector<vw::ImageView<double>> &blend_weights,\n                                 float &img_nodata_val) {\n    \n  // Initialize outputs\n  int num_images = opt.input_images.size();\n  img_nodata_val = -std::numeric_limits<float>::max();\n  masked_images.resize(num_images);\n  blend_weights.resize(num_images);\n  \n  for (int image_iter = 0; image_iter < num_images; image_iter++) {\n\n    if (opt.skip_images.find(image_iter) != opt.skip_images.end())\n      continue;\n\n    std::string img_file = opt.input_images[image_iter];\n    vw::read_nodata_val(img_file, img_nodata_val);\n\n    // Model the shadow threshold\n    float shadow_thresh = opt.shadow_threshold_vec[image_iter];\n    if (opt.crop_input_images) {\n      // Make a copy in memory for faster access\n      if (!crop_boxes[image_iter].empty()) {\n        vw::ImageView<float> cropped_img =\n          vw::crop(vw::DiskImageView<float>(img_file), crop_boxes[image_iter]);\n        masked_images[image_iter]\n          = vw::create_pixel_range_mask2(cropped_img,\n                                      std::max(img_nodata_val, shadow_thresh),\n                                      opt.max_valid_image_vals_vec[image_iter]);\n\n        // Compute blending weights only when cropping the images. Otherwise\n        // the weights are too huge.\n        if (opt.blending_dist > 0)\n          blend_weights[image_iter]\n            = asp::blendingWeights(masked_images[image_iter],\n                                   opt.blending_dist, opt.blending_power,\n                                   opt.min_blend_size);\n      }\n    } else {\n      masked_images[image_iter]\n        = vw::create_pixel_range_mask2(vw::DiskImageView<float>(img_file),\n                                       std::max(img_nodata_val, shadow_thresh),\n                                       opt.max_valid_image_vals_vec[image_iter]);\n    }\n  }\n\n} // end function loadMaskedImagesCalcWeights\n\n// Heuristics for setting up the no-data value\ndouble setupDemNodata(SfsOptions const& opt) {\n  double dem_nodata_val = -1e+6;\n  \n  if (vw::read_nodata_val(opt.input_dem, dem_nodata_val)) {\n    vw::vw_out() << \"Found DEM nodata value: \" << dem_nodata_val << std::endl;\n    if (std::isnan(dem_nodata_val)) {\n      dem_nodata_val = -1e+6; // bugfix for NaN\n      vw::vw_out() << \"Overwriting the nodata value with: \" << dem_nodata_val << \"\\n\";\n    }\n  }\n  if (!std::isnan(opt.nodata_val)) {\n    dem_nodata_val = opt.nodata_val;\n    vw::vw_out() << \"Over-riding the DEM nodata value with: \" << dem_nodata_val << \"\\n\";\n  }\n\n  return dem_nodata_val;\n}\n\n// Read the georeference for the DEM and albedo\nvoid loadGeoref(SfsOptions const& opt,\n                vw::cartography::GeoReference &geo,\n                vw::cartography::GeoReference &albedo_geo) {\n\n  if (!vw::cartography::read_georeference(geo, opt.input_dem))\n      vw::vw_throw(vw::ArgumentErr() << \"The input DEM has no georeference.\\n\");\n      \n  if (!opt.input_albedo.empty()) {\n    if (!vw::cartography::read_georeference(albedo_geo, opt.input_albedo))\n      vw::vw_throw(vw::ArgumentErr() << \"The input albedo has no georeference.\\n\");\n  } else {\n    // Ensure initialization\n    albedo_geo = geo;\n  }\n\n  // This is a bug fix. The georef pixel size in y must be negative\n  // for the DEM to be oriented correctly.\n  if (geo.transform()(1, 1) > 0)\n    vw::vw_throw(vw::ArgumentErr() << \"The input DEM has a positive pixel size in y. \"\n              << \"This is unexpected. Normally it is negative since the (0, 0) \"\n              << \"pixel is in the upper-left. Check your DEM pixel size with \"\n              << \"gdalinfo. Cannot continue.\\n\");\n    \n  // The albedo and georef must have same wkt\n  if (geo.get_wkt() != albedo_geo.get_wkt())\n    vw::vw_throw(vw::ArgumentErr()\n                  << \"The input DEM has a different georeference \"\n                  << \"from the input albedo image.\\n\");\n}\n\n\n\n// If --ref-map is passed in, crop to its extent. This will create opt.crop_win.\nvoid setupRefMap(vw::ImageViewRef<double> const& full_dem,\n                 vw::cartography::GeoReference const& geo,\n                 SfsOptions & opt) {\n\n  if (opt.ref_map.empty())\n    return;\n\n  // Read the georeference from the reference map\n  vw::cartography::GeoReference ref_map_georef;\n  bool has_ref_map_georef = vw::cartography::read_georeference(ref_map_georef, opt.ref_map);\n  if (!has_ref_map_georef)\n    vw::vw_throw(vw::ArgumentErr() << \"The image in --ref-map has no georeference.\\n\");\n      \n  // Find the bounding box of the reference map \n  vw::Vector2 ref_size = vw::file_image_size(opt.ref_map);\n  vw::BBox2i ref_map_box(0, 0, ref_size.x(), ref_size.y());\n    \n  // Convert this to dem pixel coordinates via GeoTransform. If the georefs are\n  // same, do not use forward_bbox, as that expands the box by a pixel\n  std::string dem_wkt = geo.get_wkt();\n  std::string ref_wkt = ref_map_georef.get_wkt();\n  vw::cartography::GeoTransform ref2dem(ref_map_georef, geo);\n  if (dem_wkt == ref_wkt) {\n    vw::Vector2 beg = ref2dem.forward(vw::Vector2(0, 0));\n    vw::Vector2 end = ref2dem.forward(vw::Vector2(ref_size.x(), ref_size.y()));\n    ref_map_box.min() = round(beg);\n    ref_map_box.max() = round(end);\n  } else {\n    ref_map_box = ref2dem.forward_bbox(ref_map_box);\n  }\n\n  // Crop to dem pixel coordinates\n  ref_map_box.crop(vw::bounding_box(full_dem));\n    \n  // Assign to opt.crop_win. It is checked by now that opt.crop_win would be\n  // empty otherwise.\n  opt.crop_win = ref_map_box;\n\n  // Must be non-empty\n  if (opt.crop_win.empty())\n    vw::vw_throw(vw::ArgumentErr() << \"The --ref-map does not overlap with the input DEM.\\n\");\n}\n\nvoid prepareDemAndAlbedo(SfsOptions& opt,\n                         vw::ImageView<double>& dem,\n                         vw::ImageView<double>& albedo,\n                         vw::cartography::GeoReference& geo,\n                         double& dem_nodata_val) {\n\n  // Manage no-data. Use here a value that is not overly large in magnitude,\n  // and easy to represent as float.\n  dem_nodata_val = setupDemNodata(opt);\n\n  // Read the handle to the DEM. Here we don't load the DEM into memory yet. We\n  // will later load into memory only a crop, if cropping is specified. This is\n  // to save on memory.\n  vw::ImageViewRef<double> full_dem = vw::DiskImageView<double>(opt.input_dem);\n  vw::ImageViewRef<double> full_albedo;\n\n  // Read the albedo\n  if (!opt.input_albedo.empty()) {\n    vw::vw_out() << \"Reading albedo from: \" << opt.input_albedo << \"\\n\";\n    full_albedo = vw::DiskImageView<double>(opt.input_albedo);\n    // Must have the same size as dem\n    if (full_albedo.cols() != full_dem.cols() || full_albedo.rows() != full_dem.rows())\n      vw::vw_throw(vw::ArgumentErr()\n                << \"The input albedo must have the same dimensions as the DEM.\\n\");\n  }\n\n  // This must be done before the DEM is cropped. This stats is\n  // queried from parallel_sfs.\n  if (opt.query) {\n    vw::vw_out() << \"dem_cols, \" << full_dem.cols() << \"\\n\";\n    vw::vw_out() << \"dem_rows, \" << full_dem.rows() << \"\\n\";\n  }\n\n  // Read the georeference\n  vw::cartography::GeoReference albedo_geo;\n  loadGeoref(opt, geo, albedo_geo);\n\n  // If --ref-map is passed in, need to crop to its extent. This modifies\n  // opt.crop_win.\n  setupRefMap(full_dem, geo, opt);\n  \n  // Adjust the crop win\n  opt.crop_win.crop(vw::bounding_box(full_dem));\n\n  // Crop the DEM and georef if requested to given box. Same for albedo.\n  // In either case, read the needed portion fully in memory.\n  if (!opt.crop_win.empty()) {\n    dem = vw::crop(full_dem, opt.crop_win);\n    geo = vw::cartography::crop(geo, opt.crop_win);\n    if (!opt.input_albedo.empty()) {\n      albedo = vw::crop(full_albedo, opt.crop_win);\n      albedo_geo = vw::cartography::crop(albedo_geo, opt.crop_win);\n    }\n  } else {\n    // No cropping\n    dem = full_dem;\n    if (!opt.input_albedo.empty())\n      albedo = full_albedo;\n  }\n\n  // Initialize the albedo if not read from disk\n  if (opt.input_albedo.empty()) {\n    double initial_albedo = 1.0;\n    albedo.set_size(dem.cols(), dem.rows());\n    for (int col = 0; col < albedo.cols(); col++) {\n      for (int row = 0; row < albedo.rows(); row++) {\n        albedo(col, row) = initial_albedo;\n      }\n    }\n    albedo_geo = geo;\n  }\n\n  // Albedo and DEM must have same dimensions and georef\n  if (albedo.cols() != dem.cols() || albedo.rows() != dem.rows())\n    vw::vw_throw(vw::ArgumentErr()\n              << \"The albedo image must have the same dimensions as the DEM.\\n\");\n  if (geo.get_wkt() != albedo_geo.get_wkt())\n    vw::vw_throw(vw::ArgumentErr()\n                  << \"The input DEM has a different georeference \"\n                  << \"from the input albedo image.\\n\");\n}\n\nvoid sfsSanityChecks(asp::SfsOptions const& opt, \n                     vw::ImageView<double> const& dem, \n                     double dem_nodata_val) {\n\n  // Refuse to run if there are no-data values or if the DEM is too small\n  int min_dem_size = 5;\n  for (int col = 0; col < dem.cols(); col++) {\n    for (int row = 0; row < dem.rows(); row++) {\n      if (dem(col, row) == dem_nodata_val ||\n          std::isnan(dem(col, row))) {\n        vw::vw_throw(vw::ArgumentErr()\n                  << \"Found a no-data or NaN pixel in the DEM. Cannot continue. \"\n                  << \"The dem_mosaic tool can be used to fill in holes. Then \"\n                  << \"crop and use a clip from this DEM having only valid data.\");\n      }\n    }\n  }\n  if (dem.cols() < min_dem_size || dem.rows() < min_dem_size)\n    vw::vw_throw(vw::ArgumentErr() << \"The input DEM is too small.\\n\");\n\n  // This check must happen before loading images but after we know the DEM size\n  if ((dem.cols() > 500 || dem.rows() > 500) && !opt.compute_exposures_only &&\n      !opt.estim_exposure_haze_albedo && !opt.save_sim_intensity_only &&\n      !opt.save_meas_intensity_only)\n    vw::vw_out(vw::WarningMessage) << \"The input DEM is large and this program \"\n      << \"may run out of memory. Use parallel_sfs instead, with small tiles.\\n\";\n}\n\n// Initialize the exposure as mean(intensity)/mean(reflectance)/albedo.\n// Initialize the haze to 0. Skip images with zero exposure. If the user\n// provided initial exposures and haze, use those, but still go through the\n// motions to find the images to skip.\nvoid estimExposuresHazeSkipVec(asp::SfsOptions const& opt,\n                               vw::ImageView<double> const& dem,\n                               vw::cartography::GeoReference const& geo,\n                               double max_dem_height,\n                               double gridx, double gridy,\n                               std::vector<vw::Vector3>   const& sunPosition,\n                               asp::ReflParams            const& refl_params,\n                               std::vector<vw::BBox2i>    const& crop_boxes,\n                               std::vector<MaskedImgRefT> const& masked_images,\n                               std::vector<vw::ImageView<double>> const& blend_weights,\n                               bool blend_weight_is_ground_weight,\n                               std::vector<vw::CamPtr>    const& cameras,\n                               double mean_albedo,\n                               // Outputs\n                               std::vector<double> & local_exposures_vec,\n                               std::vector<double> & local_haze_vec,\n                               std::set<int>       & skip_images) {\n\n    // Initialize outputs\n    int num_images = opt.input_images.size();\n    local_exposures_vec.resize(num_images, 0);\n    local_haze_vec.resize(num_images, 0);\n    \n    for (int image_iter = 0; image_iter < num_images; image_iter++) {\n\n      if (skip_images.find(image_iter) != skip_images.end())\n        continue;\n\n      // Sample large DEMs. Keep about 200 row and column samples.\n      int sample_col_rate = 0, sample_row_rate = 0;\n      asp::calcSampleRates(dem, opt.num_samples_for_estim, sample_col_rate, sample_row_rate);\n      \n      MaskedDblImgT reflectance, intensity;\n      vw::ImageView<double> ground_weight;\n      vw::ImageView<vw::Vector2> pq; // no need for these just for initialization\n      bool show_progress = false;\n      computeReflectanceAndIntensity(dem, pq, geo,\n                                     opt.model_shadows, show_progress, max_dem_height,\n                                     gridx, gridy, sample_col_rate, sample_row_rate,\n                                     sunPosition[image_iter],\n                                     refl_params,\n                                     crop_boxes[image_iter],\n                                     masked_images[image_iter],\n                                     blend_weights[image_iter],\n                                     blend_weight_is_ground_weight,\n                                     cameras[image_iter],\n                                     reflectance, intensity, ground_weight,\n                                     &opt.model_coeffs_vec[0], opt);\n      asp::calcExposureHazeSkipImages(intensity, reflectance, mean_albedo,\n                                      image_iter, opt.input_images,\n                                      local_exposures_vec, local_haze_vec,\n                                      skip_images);\n    }\n}\n\nint main(int argc, char* argv[]) {\n\n  vw::Stopwatch sw_total;\n  sw_total.start();\n\n  asp::SfsOptions opt;\n  try {\n    asp::handleSfsArgs(argc, argv, opt);\n\n    // Set up model information\n    ReflParams refl_params;\n    setupReflectance(refl_params, opt);\n\n    double dem_nodata_val = -1e+6; // Will change\n    vw::ImageView<double> dem, albedo;\n    vw::cartography::GeoReference geo;\n    prepareDemAndAlbedo(opt, dem, albedo, geo, dem_nodata_val);\n\n    // See if to use provided initial DEM height\n    if (!std::isnan(opt.init_dem_height)) {\n      for (int col = 0; col < dem.cols(); col++) {\n        for (int row = 0; row < dem.rows(); row++) {\n          dem(col, row) = opt.init_dem_height;\n        }\n      }\n    }\n\n    // Read in the camera models and the sun positions\n    std::vector<vw::CamPtr> cameras;\n    std::vector<vw::Vector3> sunPosition;\n    loadCamerasSunPos(opt, dem, dem_nodata_val, geo, cameras, sunPosition);\n\n    // Stop here if all we wanted was some information\n    if (opt.query)\n      return 0;\n\n    // Do the sanity checks after the query, as that one better not fail  \n    sfsSanityChecks(opt, dem, dem_nodata_val);\n\n    // This check must be here, after we find the session\n    if (opt.stereo_session != \"isis\" && opt.use_approx_camera_models) {\n      vw::vw_out() << \"Computing approximate models works only with ISIS cameras. \"\n                   << \"Ignoring this option.\\n\";\n      opt.use_approx_camera_models = false;\n    }\n\n    if (opt.num_threads > 1 && opt.stereo_session == \"isis\" && \n        !opt.use_approx_camera_models) {\n      vw::vw_out() << \"Using exact ISIS camera models. Can run with only a single thread.\\n\";\n      opt.num_threads = 1;\n    }\n    vw::vw_out() << \"Using: \" << opt.num_threads << \" thread(s).\\n\";\n    \n    // We won't load the full images, just portions restricted to the area we we\n    // will compute the DEM.\n    int num_images = opt.input_images.size();    \n    std::vector<vw::BBox2i> crop_boxes(num_images);\n\n    // The crop box starts as the original image bounding box. We'll shrink it later.\n    for (int image_iter = 0; image_iter < num_images; image_iter++) {\n      std::string img_file = opt.input_images[image_iter];\n      crop_boxes[image_iter] = vw::bounding_box(vw::DiskImageView<float>(img_file));\n    }\n\n    // Ensure that no two threads can access an ISIS camera at the same time.\n    // Declare the lock here, as we want it to live until the end of the program.\n    vw::Mutex camera_mutex;\n    if (opt.use_approx_camera_models) // calc approx camera models and crop boxes\n      calcApproxCamsCropBoxes(dem, geo, dem_nodata_val,\n                              opt, cameras, crop_boxes, camera_mutex); // outputs\n    else if (opt.crop_input_images) // calc crop boxes with the exact camera models\n      calcCropBoxes(dem, geo, cameras, opt, crop_boxes);\n\n    // Masked images and weights\n    float img_nodata_val = -std::numeric_limits<float>::max(); // will change\n    std::vector<MaskedImgRefT> masked_images;\n    std::vector<vw::ImageView<double>> blend_weights;\n    loadMaskedImagesCalcWeights(opt, crop_boxes,\n                                masked_images, blend_weights, img_nodata_val); // outputs\n\n    // Find the grid sizes in meters. Note that dem heights are in meters too,\n    // so we treat both horizontal and vertical measurements in same units.\n    // Sample large DEMs. Keep about 200 row and column samples.\n    int sample_col_rate = 0, sample_row_rate = 0;\n    asp::calcSampleRates(dem, opt.num_samples_for_estim, sample_col_rate, sample_row_rate);\n    double gridx = 0.0, gridy = 0.0;\n    asp::calcGsd(dem, geo, dem_nodata_val, sample_col_rate, sample_row_rate,\n                 gridx, gridy); // outputs\n    vw::vw_out() << \"DEM grid in x and y in meters: \" << gridx << ' ' << gridy << \"\\n\";\n\n    // Find the max DEM height\n    double max_dem_height = asp::maxDemHeight(dem);\n\n    // Find the mean albedo\n    double mean_albedo = asp::meanAlbedo(dem, albedo, dem_nodata_val);\n\n    // Initalize the exposure, haze, and skip images\n    bool blend_weight_is_ground_weight = false; // will change later\n    std::vector<double> local_exposures_vec, local_haze_vec;\n    estimExposuresHazeSkipVec(opt, dem, geo, max_dem_height, gridx, gridy,\n                              sunPosition, refl_params, crop_boxes, masked_images,\n                              blend_weights, blend_weight_is_ground_weight,\n                              cameras, mean_albedo,\n                              // Outputs\n                              local_exposures_vec, local_haze_vec,\n                              opt.skip_images);\n    \n    // Only overwrite the exposures if we don't have them supplied\n    if (opt.image_exposures_vec.empty())\n      opt.image_exposures_vec = local_exposures_vec;\n\n    // Initialize the haze as 0. If computed above, initialize its first coeff.\n    if ((!opt.image_haze_vec.empty()) && (int)opt.image_haze_vec.size() != num_images)\n      vw::vw_throw(vw::ArgumentErr() << \"Expecting as many haze values as images.\\n\");\n    if (opt.image_haze_vec.empty()) {\n      for (int image_iter = 0; image_iter < num_images; image_iter++) {\n        // Pad the haze vec with zeros\n        std::vector<double> curr_image_haze_vec;\n        while (curr_image_haze_vec.size() < g_max_num_haze_coeffs)\n          curr_image_haze_vec.push_back(0);\n        curr_image_haze_vec[0] = local_haze_vec[image_iter];\n        opt.image_haze_vec.push_back(curr_image_haze_vec);\n      }\n    }\n\n    // TODO(oalexan1): Check if --num-haze-coeffs is non-zero.\n    // TODO(oalexan1): This should work even if albedo is not modeled.\n    if (opt.estim_exposure_haze_albedo && (opt.float_albedo || opt.num_haze_coeffs > 0))\n      estimExposureHazeAlbedo(opt, masked_images, blend_weights,\n                              blend_weight_is_ground_weight,\n                              dem, mean_albedo,\n                              geo, cameras, max_dem_height,\n                              crop_boxes, sunPosition,\n                              refl_params, gridx, gridy);\n\n    if (opt.compute_exposures_only || opt.estim_exposure_haze_albedo) {\n      asp::saveExposures(opt.out_prefix, opt.input_images, opt.image_exposures_vec);\n      // TODO(oalexan1): Think of this more\n      if (opt.num_haze_coeffs > 0)\n        asp::saveHaze(opt.out_prefix, opt.input_images, opt.image_haze_vec);\n      return 0; // all done\n    }\n\n    // Need to compute the valid data image to be able to find the grid points always\n    // in shadow, so when this image is zero.\n    vw::ImageView<int> lit_image_mask;\n    if (opt.curvature_in_shadow_weight > 0.0) {\n      lit_image_mask.set_size(dem.cols(), dem.rows());\n      for (int col = 0; col < lit_image_mask.cols(); col++) {\n        for (int row = 0; row < lit_image_mask.rows(); row++) {\n          lit_image_mask(col, row) = 0; // no valid points originally\n        }\n      }\n    }\n\n    // Compute and/or save the intensities, and/or estimate height errors,\n    // and/or compute weights for borderline data.\n    // Show progress when the DEM is big\n    std::vector<vw::ImageView<double>> ground_weights(num_images);\n    std::vector<MaskedDblImgT> meas_intensities(num_images);\n    std::vector<MaskedDblImgT> sim_intensities(num_images);\n    bool show_progress = (opt.save_sim_intensity_only || opt.save_meas_intensity_only);\n    if (opt.save_sim_intensity_only || opt.save_meas_intensity_only ||\n        opt.estimate_height_errors || opt.curvature_in_shadow_weight > 0.0 ||\n        opt.allow_borderline_data || opt.low_light_threshold > 0.0)\n      asp::calcIntenEstimHeights(opt, dem, albedo, geo, show_progress, max_dem_height,\n                                 gridx, gridy, sunPosition, refl_params, crop_boxes,\n                                 masked_images, blend_weights, blend_weight_is_ground_weight,\n                                 cameras, img_nodata_val,\n                                 // Outputs\n                                 lit_image_mask, ground_weights,\n                                 meas_intensities, sim_intensities);\n\n    if (opt.save_sim_intensity_only || opt.save_meas_intensity_only ||\n        opt.estimate_height_errors) {\n      asp::saveExposures(opt.out_prefix, opt.input_images, opt.image_exposures_vec);\n      return 0; // All done\n    }\n\n    // Print and make global the exposures and haze\n    if (opt.num_haze_coeffs > 0) {\n      for (size_t image_iter = 0; image_iter < opt.image_haze_vec.size(); image_iter++) {\n        vw::vw_out() << \"Image haze for \" << opt.input_images[image_iter] << ':';\n        for (size_t haze_it = 0; haze_it < opt.image_haze_vec[image_iter].size(); haze_it++)\n          vw::vw_out() << \" \" << opt.image_haze_vec[image_iter][haze_it];\n        vw::vw_out() << \"\\n\";\n      }\n    }\n\n    if (opt.allow_borderline_data)\n      asp::handleBorderlineAndLowLight(opt, num_images, dem, geo, crop_boxes,\n                                       meas_intensities, sim_intensities,\n                                       img_nodata_val,\n                                       // Outputs\n                                       masked_images, blend_weights,\n                                       blend_weight_is_ground_weight,\n                                       ground_weights);\n    \n    // Calc the weight for option --curvature-in-shadow-weight\n    vw::ImageView<double> curvature_in_shadow_weight;\n    if (opt.curvature_in_shadow_weight > 0.0)\n      asp::calcCurvatureInShadowWeight(opt, lit_image_mask, geo,\n                                       curvature_in_shadow_weight); // output\n\n    // For images that we don't use, wipe the cameras and all other\n    // info, as those take up memory (the camera is a table).\n    for (int image_iter = 0; image_iter < num_images; image_iter++) {\n      if (opt.skip_images.find(image_iter) != opt.skip_images.end()) {\n        masked_images[image_iter] = vw::ImageView<vw::PixelMask<float>>();\n        blend_weights[image_iter] = vw::ImageView<double>();\n        cameras[image_iter] = boost::shared_ptr<CameraModel>();\n      }\n    }\n\n    // orig_dem will keep the input DEMs and won't change. Keep to the optimized\n    // DEMs close to orig_dem. Make a deep copy below. Then run sfs.\n    vw::ImageView<double> orig_dem = vw::copy(dem);\n    runSfs(opt.max_iterations, gridx, gridy, opt, geo, opt.smoothness_weight,\n           max_dem_height, dem_nodata_val, img_nodata_val,  crop_boxes, masked_images,\n           blend_weights, blend_weight_is_ground_weight,\n           refl_params, sunPosition, orig_dem,\n           lit_image_mask, curvature_in_shadow_weight,\n           // Variable quantities\n           dem, albedo, cameras, opt.image_exposures_vec, opt.image_haze_vec,\n           opt.model_coeffs_vec);\n\n  } ASP_STANDARD_CATCHES;\n\n  sw_total.stop();\n  vw::vw_out() << \"Total elapsed time: \" << sw_total.elapsed_seconds() << \" s.\\n\";\n\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/sfs_blend.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file sfs_blend.cc\n///\n\n// A tool to take an SfS-produced DEM, and replace in the areas in\n// permanent shadow this DEM with the original LOLA DEM, with a\n// transition at the boundary.\n\n// It uses the Euclidean distance to the boundary, which is better\n// than the Manhattan distance employed by grassfire.\n\n#include <asp/Core/Macros.h>\n#include <asp/Core/AspProgramOptions.h>\n#include <asp/Core/GdalUtils.h>\n#include <asp/SfS/SfsImageProc.h>\n\n#include <vw/FileIO/DiskImageManager.h>\n#include <vw/Image/InpaintView.h>\n#include <vw/Image/RoundAndClamp.h>\n#include <vw/Image/Filter.h>\n#include <vw/Cartography/GeoTransform.h>\n#include <vw/FileIO/FileUtils.h>\n\n#include <boost/math/special_functions/fpclassify.hpp>\n#include <boost/math/special_functions/erf.hpp>\n#include <boost/program_options.hpp>\n\n#include <iostream>\n#include <fstream>\n#include <iomanip>\n#include <string>\n#include <vector>\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <unistd.h>\n#include <time.h>\n#include <limits>\n#include <algorithm>\n\nusing namespace vw;\nusing namespace vw::cartography;\nnamespace po = boost::program_options;\nnamespace fs = boost::filesystem;\n\nGeoReference read_georef(std::string const& file) {\n  // Read a georef, and check for success\n  GeoReference geo;\n  bool is_good = read_georeference(geo, file);\n  if (!is_good)\n    vw_throw(ArgumentErr() << \"No georeference found in \" << file << \".\\n\");\n\n  // This is a bug fix. The georef pixel size in y must be negative\n  // for the image to be oriented correctly.\n  if (geo.transform()(1, 1) > 0)\n    vw_throw(ArgumentErr() << \"The georeference in \" << file\n              << \" has a positive pixel size in y. \"\n              << \"This is unexpected. Normally it is negative since the (0, 0) \"\n              << \"pixel is in the upper-left. Check your DEM pixel size with \"\n              << \"gdalinfo. Cannot continue.\\n\");\n\n  return geo;\n}\n\nstruct Options: vw::GdalWriteOptions {\n  std::string sfs_dem, lola_dem, max_lit_image_mosaic, output_dem, output_weight;\n  double image_threshold, weight_blur_sigma, lit_blend_length,\n    shadow_blend_length, min_blend_size;\n  Options(): image_threshold(0.0), weight_blur_sigma(0.0), lit_blend_length(0.0),\n             shadow_blend_length(0.0), min_blend_size(0.0) {}\n};\n\n\n\n// The workhorse of this code, do the blending\nclass SfsBlendView: public ImageViewBase<SfsBlendView>{\n\n  ImageViewRef<float> m_sfs_dem, m_lola_dem, m_image_mosaic;\n  float m_sfs_nodata, m_lola_nodata, m_weight_nodata;\n  int m_extra;\n  bool m_save_weight;\n  Options const& m_opt;\n\n  typedef float PixelT;\n\npublic:\n  SfsBlendView(ImageViewRef<float> sfs_dem, ImageViewRef<float> lola_dem,\n               ImageViewRef<float> image_mosaic,\n               float sfs_nodata, float lola_nodata, float weight_nodata, int extra,\n               bool save_weight, Options const& opt):\n    m_sfs_dem(sfs_dem), m_lola_dem(lola_dem), m_image_mosaic(image_mosaic),\n    m_sfs_nodata(sfs_nodata), m_lola_nodata(lola_nodata),\n    m_weight_nodata(weight_nodata), m_extra(extra),\n    m_save_weight(save_weight), m_opt(opt) {}\n\n  typedef PixelT pixel_type;\n  typedef PixelT result_type;\n  typedef ProceduralPixelAccessor<SfsBlendView> pixel_accessor;\n\n  inline int32 cols() const { return m_sfs_dem.cols(); }\n  inline int32 rows() const { return m_sfs_dem.rows(); }\n  inline int32 planes() const { return 1; }\n\n  inline pixel_accessor origin() const { return pixel_accessor(*this, 0, 0); }\n\n  inline pixel_type operator()(double/*i*/, double/*j*/, int32/*p*/ = 0) const {\n    vw_throw(NoImplErr() << \"SfsBlendView::operator()(...) is not implemented\");\n    return pixel_type();\n  }\n\n  typedef CropView<ImageView<pixel_type>> prerasterize_type;\n  inline prerasterize_type prerasterize(BBox2i const& bbox) const {\n    \n    BBox2i biased_box = bbox;\n    biased_box.expand(m_extra);\n    biased_box.crop(bounding_box(m_sfs_dem));\n\n    // Make crops in memory (from references)\n    ImageView<pixel_type> sfs_dem_crop = crop(m_sfs_dem, biased_box);\n    ImageView<pixel_type> lola_dem_crop = crop(m_lola_dem, biased_box);\n    ImageView<pixel_type> image_mosaic_crop = crop(m_image_mosaic, biased_box);\n\n    // The mask of lit pixels\n    ImageView<PixelMask<pixel_type>> mask\n      = create_mask_less_or_equal(image_mosaic_crop, m_opt.image_threshold);\n\n    // The mask of unlit pixels\n    ImageView<PixelMask<pixel_type>> inv_mask = vw::copy(mask);\n    for (int col = 0; col < inv_mask.cols(); col++) {\n      for (int row = 0; row < inv_mask.rows(); row++) {\n        if (is_valid(mask(col, row))) {\n          inv_mask(col, row) = 0;\n          inv_mask(col, row).invalidate();\n        } else {\n          inv_mask(col, row) = 1;\n          inv_mask(col, row).validate();\n        }\n      }\n    }\n\n    // The grassfire weight positive in the lit region, with zero at the light-shadow\n    // boundary\n    bool no_zero_at_border = true; // don't decrease the weights to zero at image border\n\n    // Fill small holes that we don't blend in those, then compute the distance\n    // to the remaining holes\n    ImageView<pixel_type> lit_grass_dist\n      = vw::grassfire(vw::copy(vw::fill_holes_grass(mask, m_opt.min_blend_size)),\n                      no_zero_at_border);\n\n    // The grassfire weights are positive in the shadow region, with\n    // zero at the light-shadow boundary\n    ImageView<pixel_type> shadow_grass_dist = vw::grassfire(inv_mask, no_zero_at_border);\n\n    // Note that our boundary is in fact two pixel wide at the light-shadow\n    // interface, given how lit_grass_dist and shadow_grass_dist are defined as\n    // the negation of each other. The boundary is the set of pixels where both\n    // of these are <= 1. Here must use double pixels as otherwise there's not\n    // enough precision for the final weights (even though they are float).\n    ImageView<double> dist_to_bd \n      = asp::calcClampedBdDist(lit_grass_dist, shadow_grass_dist,\n                               m_opt.lit_blend_length, m_opt.shadow_blend_length);\n\n    // Apply the blur\n    if (m_opt.weight_blur_sigma > 0)\n      dist_to_bd = vw::gaussian_filter(dist_to_bd, m_opt.weight_blur_sigma);\n\n    // Do the blending\n    ImageView<float> blended_dem;\n    blended_dem.set_size(sfs_dem_crop.cols(), sfs_dem_crop.rows());\n    for (int col = 0; col < sfs_dem_crop.cols(); col++) {\n      for (int row = 0; row < sfs_dem_crop.rows(); row++) {\n\n        if (!m_save_weight)\n          blended_dem(col, row) = m_sfs_nodata;\n        else\n          blended_dem(col, row) = m_weight_nodata;\n\n        // The signed distance to the boundary is modified so that the smallest\n        // value is 0, the largest is 1, and in a band close to the boundary it\n        // transitions from 0 to 1. Must use here a double value, for precision.\n        double weight = (dist_to_bd(col, row) + m_opt.shadow_blend_length) /\n          (m_opt.shadow_blend_length + m_opt.lit_blend_length);\n\n        // These are not strictly necessary but enforce them\n        if (weight > 1.0)\n          weight = 1.0;\n        if (weight < 1e-7) // take into account the float error\n          weight = 0.0;\n        \n        // Handle no-data values. These are not meant to happen, but do this just in case.\n        if (sfs_dem_crop(col, row) == m_sfs_nodata)\n          weight = 0.0; // Use LOLA\n\n        if (lola_dem_crop(col, row) == m_lola_nodata)\n          continue;\n\n        if (!m_save_weight)\n          blended_dem(col, row)\n            = weight * sfs_dem_crop(col, row) + (1.0 - weight) * lola_dem_crop(col, row);\n        else\n          blended_dem(col, row) = weight;\n      }\n    }\n\n    return prerasterize_type(blended_dem, -biased_box.min().x(), -biased_box.min().y(),\n                             cols(), rows());\n  }\n\n  template <class DestT>\n  inline void rasterize(DestT const& dest, BBox2i bbox) const {\n    vw::rasterize(prerasterize(bbox), dest, bbox);\n  }\n};\n\nvoid handle_arguments(int argc, char *argv[], Options& opt) {\n\n  po::options_description general_options(\"Options\");\n  general_options.add_options()\n    (\"sfs-dem\", po::value<std::string>(&opt.sfs_dem),\n     \"The SfS DEM to process.\")\n    (\"lola-dem\", po::value<std::string>(&opt.lola_dem),\n     \"The LOLA DEM to use to fill in the regions in permanent shadow.\")\n    (\"max-lit-image-mosaic\", po::value<std::string>(&opt.max_lit_image_mosaic),\n     \"The maximally lit image mosaic to use to determine the permanently shadowed regions.\")\n    (\"image-threshold\",  po::value<double>(&opt.image_threshold)->default_value(0.0),\n     \"The value separating permanently shadowed pixels from lit pixels in the maximally lit image mosaic.\")\n    (\"lit-blend-length\", po::value<double>(&opt.lit_blend_length)->default_value(0.0),\n     \"The length, in pixels, over which to blend the SfS and LOLA DEMs at the boundary of the permanently shadowed region towards the lit region.\")\n    (\"shadow-blend-length\", po::value<double>(&opt.shadow_blend_length)->default_value(0.0),\n     \"The length, in pixels, over which to blend the SfS and LOLA DEMs at the boundary of the permanently shadowed region towards the shadowed region.\")\n    (\"weight-blur-sigma\", po::value<double>(&opt.weight_blur_sigma)->default_value(0.0),\n     \"The standard deviation of the Gaussian used to blur the weight that performs the transition from the SfS to the LOLA DEM. A higher value results in a smoother transition (this does not smooth the DEMs). The extent of the blur is about 7 times this deviation, though it tapers fast to 0 before that. Set to 0 to not use this operation.\")\n    (\"min-blend-size\", po::value<double>(&opt.min_blend_size)->default_value(0.0),\n     \"Do not apply blending in shadowed areas of dimensions less than this, hence keeping there the SfS DEM.\")\n    (\"output-dem\", po::value(&opt.output_dem), \"The blended output DEM to save.\")\n    (\"output-weight\", po::value(&opt.output_weight), \"The weight showing the proportion of the SfS DEM in the blend with the LOLA DEM (1 is for purely SfS and 0 is for purely LOLA).\");\n\n  general_options.add(vw::GdalWriteOptionsDescription(opt));\n\n  po::options_description positional(\"\");\n  po::positional_options_description positional_desc;\n\n  std::string usage(\"[options]\");\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line(argc, argv, opt, general_options, general_options,\n                            positional, positional_desc, usage,\n                            allow_unregistered, unregistered);\n\n  // Error checking\n  if (opt.sfs_dem == \"\" || opt.lola_dem == \"\" ||\n      opt.max_lit_image_mosaic == \"\" || opt.output_dem == \"\" || opt.output_weight == \"\")\n    vw_throw(ArgumentErr() << \"Not all input or output files were specified.\\n\"\n                           << usage << general_options);\n  if (opt.lit_blend_length <= 0)\n    vw_throw(ArgumentErr() << \"The lit blending length must be positive.\\n\"\n                           << usage << general_options);\n  if (opt.shadow_blend_length <= 0)\n    vw_throw(ArgumentErr() << \"The shadow blending length must be positive.\\n\"\n                           << usage << general_options);\n  if (opt.image_threshold <= 0)\n    vw_throw(ArgumentErr() << \"The image threshold must be positive.\\n\"\n                           << usage << general_options);\n\n  // Create the output directory\n  vw::create_out_dir(opt.output_dem);\n} // End function handle_arguments\n\nint main(int argc, char *argv[]) {\n\n  Options opt;\n\n  try{\n\n    handle_arguments(argc, argv, opt);\n\n    vw_out() << \"Reading SfS DEM: \" << opt.sfs_dem << std::endl;\n    DiskImageView<float> sfs_dem(opt.sfs_dem);\n\n\n    vw_out() << \"Reading LOLA DEM: \" << opt.lola_dem << std::endl;\n    DiskImageView<float> lola_dem(opt.lola_dem);\n\n    vw_out() << \"Reading maximally-lit image mosaic: \" << opt.max_lit_image_mosaic << std::endl;\n    DiskImageView<float> image_mosaic(opt.max_lit_image_mosaic);\n\n    if (sfs_dem.cols() != lola_dem.cols() || sfs_dem.rows() != lola_dem.rows())\n      vw_throw(ArgumentErr() << \"The SfS DEM and LOLA DEM must have the same dimensions.\");\n\n    if (sfs_dem.cols() != image_mosaic.cols() || sfs_dem.rows() != image_mosaic.rows())\n      vw_throw(ArgumentErr() << \"The SfS DEM and image mosaic must have the same dimensions.\");\n\n    GeoReference sfs_georef   = read_georef(opt.sfs_dem);\n    GeoReference lola_georef  = read_georef(opt.lola_dem);\n    GeoReference image_georef = read_georef(opt.max_lit_image_mosaic);\n    if (sfs_georef.proj4_str() != lola_georef.proj4_str() ||\n        sfs_georef.proj4_str() != image_georef.proj4_str())\n      vw_throw(ArgumentErr() << \"The SfS DEM, LOLA DEM, and image mosaic \"\n               << \"must have the same PROJ4 string.\");\n\n    // All these must be on the same grid, or else the blending will be wrong.\n    // Allow some tolerance here as sometimes products created with different\n    // tools can differ a bit. 1e-10 degrees is about 0.01 mm on Earth's surface.\n    vw::Vector2 sfs_corner = sfs_georef.pixel_to_point(Vector2(0, 0));\n    vw::Vector2 lola_corner = lola_georef.pixel_to_point(Vector2(0, 0));\n    vw::Vector2 image_corner = image_georef.pixel_to_point(Vector2(0, 0));\n    if (norm_2(sfs_corner - lola_corner) > 1e-10 || norm_2(sfs_corner - image_corner) > 1e-10)\n      vw_throw(ArgumentErr() << \"The SfS DEM, LOLA DEM, and image mosaic \"\n               << \"must be on the same grid.\");\n\n    float sfs_nodata = -1.0, lola_nodata = -1.0, image_nodata = -1.0;\n    DiskImageResourceGDAL sfs_rsrc(opt.sfs_dem);\n    if (sfs_rsrc.has_nodata_read())\n      sfs_nodata = sfs_rsrc.nodata_read();\n    else\n      vw_throw(ArgumentErr() << \"The SfS DEM does not have a no-data value.\");\n    DiskImageResourceGDAL lola_rsrc(opt.lola_dem);\n    if (lola_rsrc.has_nodata_read())\n      lola_nodata = lola_rsrc.nodata_read();\n    else\n      vw_throw(ArgumentErr() << \"The LOLA DEM does not have a no-data value.\");\n    DiskImageResourceGDAL image_rsrc(opt.max_lit_image_mosaic);\n    if (image_rsrc.has_nodata_read())\n      image_nodata = image_rsrc.nodata_read();\n    else\n      vw_throw(ArgumentErr() << \"The maximally-lit mosaic does not have a no-data value.\");\n\n    // When processing the DEM tile by tile, need to see further in\n    // each tile because of blending and blurring\n    int extra = 2*opt.lit_blend_length + 2*opt.shadow_blend_length + opt.min_blend_size;\n    if (opt.weight_blur_sigma > 0)\n      extra += vw::compute_kernel_size(opt.weight_blur_sigma);\n\n    // Write bigger tiles to make the processing with the extra margin\n    // more efficient.\n    int block_size = 256 + 2 * extra;\n    block_size = 16*std::ceil(block_size/16.0); // internal constraint\n\n    vw_out() << \"Writing: \" << opt.output_dem << std::endl;\n    bool has_georef = true, has_nodata = true;\n    TerminalProgressCallback tpc(\"asp\", \": \");\n    float weight_nodata = -1.0;\n    bool save_weight = false;\n    asp::saveWithTempBigBlocks(block_size,\n                               opt.output_dem,\n                               SfsBlendView(sfs_dem, lola_dem, image_mosaic,\n                                            sfs_nodata, lola_nodata,\n                                            weight_nodata, extra,\n                                            save_weight, opt),\n                               has_georef, sfs_georef,\n                               has_nodata, sfs_nodata, opt, tpc);\n\n    // Write the weight. Have to rerun the same logic due to ASP's limitations,\n    // it cannot write two large files at the same time.\n    vw_out() << \"Writing the blending weight: \"\n             << opt.output_weight << std::endl;\n    save_weight = true;\n    asp::saveWithTempBigBlocks(block_size,\n                               opt.output_weight,\n                               SfsBlendView(sfs_dem, lola_dem, image_mosaic,\n                                            sfs_nodata, lola_nodata,\n                                            weight_nodata, extra,\n                                            save_weight, opt),\n                               has_georef, sfs_georef,\n                               has_nodata, weight_nodata, opt, tpc);\n\n\n  } ASP_STANDARD_CATCHES;\n\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/skysat_helper.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n'''\nPython tools for working with SkySat data products.\n'''\nfrom __future__ import print_function\nimport sys\nimport os, glob, re, shutil, subprocess, string, time, errno, argparse\nimport simplekml, json\n\n# The path to the ASP python files\nbasepath    = os.path.abspath(sys.path[0])\npythonpath  = os.path.abspath(basepath + '/../Python')  # for dev ASP\nlibexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP\nsys.path.insert(0, basepath) # prepend to Python path\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\n\nfrom asp_alg_utils import *\n\nimport asp_file_utils, asp_system_utils, asp_cmd_utils, asp_image_utils, asp_string_utils\nasp_system_utils.verify_python_version_is_supported()\n\n# Prepend to system PATH\nos.environ[\"PATH\"] = libexecpath + os.pathsep + os.environ[\"PATH\"]\n\n\n#------------------------------------------------------------------------------\n\n\ndef addJsonFileToKml(path, kml, color = simplekml.Color.white):\n    '''Add one JSON frame bounding box to the KML object'''\n\n    with open(path, 'r') as f:\n        contents = f.read()\n    parts  = json.loads(contents)\n    coords = parts['geometry']['coordinates'][0]\n    pol = kml.newpolygon(name=os.path.basename(path),\n                         outerboundaryis=coords)\n    pol.style.linestyle.color = color\n    pol.style.linestyle.width = 5\n    pol.style.polystyle.fill  = 0\n\n\ndef convertToTsai(path, demPath):\n    '''Given the json metadata, generate a .tsai camera file'''\n\n    # Get the other file paths\n    tifPath    = path.replace('metadata.json', 'basic_panchromatic_dn.tif')\n    outputPath = tifPath.replace('.tif', '.tsai')\n\n    # Get the image size (for the center coordinate)\n    width, height = asp_image_utils.getImageSize(tifPath)\n\n    # Set up the required coordinate string\n    with open(path, 'r') as f:\n        contents = f.read()\n    parts  = json.loads(contents)\n    coords = parts['geometry']['coordinates'][0]\n    coordString = (('%f %f  %f %f  %f %f  %f %f') % (coords[0][0],  coords[0][1],\n                                                     coords[3][0],  coords[3][1],\n                                                     coords[2][0],  coords[2][1],\n                                                     coords[1][0],  coords[1][1]))\n\n    cmd = (('cam_gen %s  --reference-dem %s  --focal-length 553846.153846  --optical-center %f %f --pixel-pitch 1  --refine-camera  --lon-lat-values \"%s\"  -o %s') % (tifPath, demPath, width/2.0, height/2.0, coordString, outputPath))\n    asp_system_utils.executeCommand(cmd, outputPath=outputPath)\n\ndef splitSkysatName(path):\n    '''Extract parts of the skysat name'''\n\n    # 20181215_074403_ssc10d3_0004_metadata.json\n    result   = dict()\n    name     = os.path.basename(path)\n    parts    = name.split('_')\n    result['date'    ] = parts[0]\n    result['imageId' ] = parts[1]\n    result['sat'], result['ccd'] = parts[2].split('d')\n    result['frameNum'] = parts[3]\n\n    return result\n\ndef main(argsIn):\n\n    try:\n\n        # Use parser that ignores unknown options\n        usage  = \"usage: skysat_helper [options]\"\n        parser = argparse.ArgumentParser(usage=usage)\n\n        parser.add_argument(\"--input-prefix\", dest=\"inputPrefix\", default=None,\n                                              help=\"Input prefix of files to process\")\n\n        parser.add_argument(\"--output-path\", dest=\"outputPath\", default=None,\n                                              help=\"The output kml file to write.\")\n\n        parser.add_argument(\"--kml-name\", dest=\"kmlName\", default='footprint',\n                                              help=\"The name assigned to the kml tree.\")\n\n\n        parser.add_argument(\"--dem-path\", dest=\"demPath\", default=None,\n                                          help=\"DEM file to use for tsai conversion.\")\n\n        # This call handles all the parallel_mapproject specific options.\n        options = parser.parse_args(argsIn)\n\n        # Check the required positional arguments.\n\n    except argparse.ArgumentError as msg:\n        raise Usage(msg)\n\n\n    kml = simplekml.Kml()\n    kml.document.name = options.kmlName\n\n    colorList = ['ffffffff', 'ff000000', 'ffff0000', 'ff008000', 'ff00ffff', 'orange', 'ff00a5ff']\n\n    count = 0\n    imageIdList = []\n    paths = glob.glob(options.inputPrefix)\n    for path in paths:\n        if (os.path.splitext(path)[1] != '.json') or ('metadata' not in path):\n            continue\n        frameInfo = splitSkysatName(path)\n        fid       = frameInfo['imageId']\n        if fid not in imageIdList:\n            imageIdList.append(fid)\n        colorIndex = imageIdList.index(fid) % len(colorList)\n        color      = colorList[colorIndex]\n\n        try:\n            addJsonFileToKml(path, kml, color)\n            count += 1\n        except:\n            print('Failed to add file: ' + path + ' to the kml footprint.')\n\n        if options.demPath:\n            try:\n                convertToTsai(path, options.demPath)\n            except:\n                print('Failed to generate .tsai model for file: ' + path)\n\n    print('Wrote ' + str(count) + ' polygons to file: ' + options.outputPath)\n    kml.save(options.outputPath)\n\n\n    print('Script is finished.')\n\nif __name__ == \"__main__\":\n    sys.exit(main(sys.argv[1:]))\n"
  },
  {
    "path": "src/asp/Tools/sparse_disp",
    "content": "#!/usr/bin/env python\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n# This program depends on a variety of Python modules that can be\n# installed following the instructions in the documentation where the\n# use of this tool is shown.\n\n# The purpose of this program is to generate a good initial disparity\n# estimate for stereo processing by matching interest points taken\n# full resolution at sampled regions across the input images.  This\n# helps out in cases where there is high resolution detail such as ice\n# and snow patterns but no low resolution detail.\n\nfrom __future__ import print_function\nimport sys, optparse, subprocess, re, os, math, time, datetime\n\n# The path to the ASP python files\nbasepath    = os.path.abspath(sys.path[0])\npythonpath  = os.path.abspath(basepath + '/../Python')  # for dev ASP\nlibexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP\nsys.path.insert(0, basepath) # prepend to Python path\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\n\nimport asp_system_utils\nasp_system_utils.verify_python_version_is_supported()\n\ntry:\n    from osgeo import gdal, gdalconst\nexcept ImportError:    \n    import gdal, gdalconst\ngdal.UseExceptions()\n    \nimport numpy as np\nimport scipy.ndimage as sf\nimport scipy.stats as ss\nimport scipy.spatial as spatial\nfrom scipy.ndimage import convolve, binary_dilation, convolve1d\nfrom scipy.sparse import coo_matrix\nfrom scipy.interpolate import griddata\nfrom multiprocessing import Pool, cpu_count\nfrom optparse import OptionParser\n\n# The path to the ASP python files\nbasepath    = os.path.abspath(sys.path[0])\npythonpath  = os.path.abspath(basepath + '/../Python')  # for dev ASP\nlibexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP\nsys.path.insert(0, basepath) # prepend to Python path\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\n\nfrom asp_system_utils import get_asp_version\n\n#==============================================================================\n# Start of supporting functions\n#==============================================================================\ndef prevpow2(i):\n    \"\"\" Find largest 2^n that is <= given number. \"\"\"\n    n = 1\n    while 2*n <= i: n *= 2\n    return n\n\nclass im_subset:\n    def __init__(self, c0, r0, Nc, Nr, source, user_nodata, pad_val=0, Bands=(1,2,3)):\n        self.source = source\n        self.c0 = c0\n        self.r0 = r0\n        self.Nc = Nc\n        self.Nr = Nr\n        self.z  = []\n        # if the level is zero, this is a copy of a file, if it's >0, it's a copy of a copy of a file\n        self.level = 0\n        self.Bands = Bands\n        self.pad_val = pad_val\n        # get the nodata value from the source\n        if hasattr(self.source, 'level'):\n            self.level=self.source.level+1\n            if user_nodata is not None:\n                self.noData = user_nodata\n            else:\n                self.noData = self.source.noData\n        else:\n            band=self.source.GetRasterBand(self.Bands[0])\n            if user_nodata is not None:\n                self.noData = user_nodata\n            else:\n                self.noData = band.GetNoDataValue()\n            if self.noData is None:\n                self.noData = 0.0\n\n    def setBounds(self, c0, r0, Nc, Nr, update=0):\n        self.c0 = np.int64(c0)\n        self.r0 = np.int64(r0)\n        self.Nc = np.int64(Nc)\n        self.Nr = np.int64(Nr)\n        if update > 0:\n            self.copySubsetFrom(pad_val=self.pad_val)\n\n    def copySubsetFrom(self, pad_val=0):\n        if hasattr(self.source, 'level'):  # copy data from another subset\n            self.z = np.zeros((self.source.z.shape[0], self.Nr, self.Nc), self.source.z.dtype) + pad_val\n            (sr0, sr1, dr0, dr1, vr) = match_range(self.source.r0, self.source.Nr, self.r0, self.Nr)\n            (sc0, sc1, dc0, dc1, vc) = match_range(self.source.c0, self.source.Nc, self.c0, self.Nc)\n            if (vr & vc):\n                self.z[:, dr0:dr1, dc0:dc1]=self.source.z[:,sr0:sr1, sc0:sc1]\n            self.level=self.source.level+1\n        else:  # read data from a file\n            band   = self.source.GetRasterBand(self.Bands[0])\n            src_NB = self.source.RasterCount\n            dt     = gdal.GetDataTypeName(band.DataType)\n            self.z = np.zeros((src_NB, self.Nr, self.Nc)) + pad_val\n            (sr0, sr1, dr0, dr1, vr) = match_range(0, band.YSize, self.r0, self.Nr)\n            (sc0, sc1, dc0, dc1, vc) = match_range(0, band.XSize, self.c0, self.Nc)\n            if (vr & vc):\n                self.z[:, dr0:dr1, dc0:dc1]=self.source.ReadAsArray(int(sc0),  int(sr0), int(sc1-sc0), int(sr1-sr0))\n            self.level=0\n\n    def trim_from_edges(self, x_trim, y_trim):\n        self.z  = self.z[:, y_trim[0]:-y_trim[1], x_trim[0]:-x_trim[1]]\n        self.r0 = self.r0+y_trim[0]\n        self.c0 = self.c0+x_trim[0]\n        self.Nr = self.Nr-np.sum(y_trim)\n        self.Nc = self.Nc-np.sum(x_trim)\n\n    def writeSubsetTo(self, bands, target):\n        if hasattr(target, 'level') and target.level > 0:\n            (sr0, sr1, dr0, dr1, vr) = match_range(target.source.r0, target.source.Nr, self.r0, self.Nr)\n            (sc0, sc1, dc0, dc1, vc) = match_range(target.source.c0, target.source.Nc, self.c0, self.Nc)\n            if (vr & vc):\n                for b in bands:\n                    target.source.z[b,sr0:sr1, sc0:sc1]=self.z[b, dr0:dr1, dc0:dc1]\n        else:\n            band=target.source.GetRasterBand(1)\n            (sr0, sr1, dr0, dr1, vr) = match_range(0, band.YSize, self.r0, self.Nr)\n            (sc0, sc1, dc0, dc1, vc) = match_range(0, band.XSize, self.c0, self.Nc)\n            if (vr & vc):\n                for bb in (bands):\n                    band=target.source.GetRasterBand(int(bb))\n                    band.WriteArray( self.z[bb-1, dr0:dr1, dc0:dc1], int(sc0), int(sr0))\n\ndef match_range(s0, ns, d0, nd):\n    i0  = max(s0, d0)\n    i1  = min(s0+ns, d0+nd)\n    si0 = max(0, i0-s0)\n    si1 = min(ns, i1-s0)\n    di0 = max(0, i0-d0)\n    di1 = min(nd,i1-d0)\n    any_valid=(di1>di0) & (si1 > si0)\n    return (si0, si1, di0, di1, any_valid)\n\n\n# Try and use the faster Fourier transform functions from the pyFFTW\n# module if available. Otherwise use the normal scipy fftpack ones\n# instead (~2-3x slower!).\ntry:\n    from pyfftw.interfaces.scipy_fftpack import fftn, ifftn\n\nexcept ImportError:\n    print(\"Module 'pyfftw' (FFTW Python bindings) could not be imported.\\n\"\\\n          \"To install it, try running 'easy_install anfft' from the terminal.\\n\"\\\n          \"Falling back on the slower 'fftpack' module for ND Fourier transforms.\")\n    from scipy.fftpack import fftn, ifftn\n\nclass TemplateMatch(object):\n    \"\"\"\n    N-dimensional template search by normalized cross-correlation or sum of\n    squared differences.\n\n    Arguments:\n    ------------------------\n        template    The template to search for\n\n    \"\"\"\n    def __init__(self,template):\n\n        self.template = template\n\n    def __call__(self,a):\n\n        if a.ndim != self.template.ndim:\n            raise Exception('Input array must have the same number of dimensions as the template (%i)'\n                            %self.template.ndim)\n\n        C = norm_xcorr(self.template, a, trim=True)\n        return  C\n\ndef norm_xcorr(t, a, trim=True):\n    \"\"\"\n    Fast normalized cross-correlation for n-dimensional arrays\n\n    Inputs:\n    ----------------\n        t   The template. Must have at least 2 elements, which\n            cannot all be equal.\n\n        a   The search space. Its dimensionality must match that of\n            the template.\n\n        trim    If True (default), the output array is trimmed down to\n            the size of the search space. Otherwise, its size will\n            be (f.shape[dd] + t.shape[dd] -1) for dimension dd.\n\n    Output:\n    ----------------\n        nxcorr  An array of cross-correlation coefficients, which may\n            vary from -1.0 to 1.0.\n\n    Wherever the search space has zero  variance under the template,\n    normalized  cross-correlation is undefined. In such regions, the\n    correlation coefficients are set to zero.\n\n    References:\n        Hermosillo et al 2002: Variational Methods for Multimodal Image\n        Matching, International Journal of Computer Vision 50(3),\n        329-343, 2002\n        <http://www.springerlink.com/content/u4007p8871w10645/>\n\n        Lewis 1995: Fast Template Matching, Vision Interface,\n        p.120-123, 1995\n        <http://www.idiom.com/~zilla/Papers/nvisionInterface/nip.html>\n\n        <http://en.wikipedia.org/wiki/Cross-correlation#Normalized_cross-correlation>\n\n    Alistair Muldal\n    Department of Pharmacology\n    University of Oxford\n    <alistair.muldal@pharm.ox.ac.uk>\n\n    Sept 2012\n\n    \"\"\"\n\n    if t.size < 2:\n        raise Exception('Invalid template')\n    if t.size > a.size:\n        raise Exception('The input array must be smaller than the template')\n\n    std_t,mean_t = np.std(t),np.mean(t)\n\n    if std_t == 0:\n        #raise Exception('The values of the template must not all be equal (they are equal to %f)' % mean_t)\n        #warnings.warn('The values of the template are all the same, correlation failed')\n        return None\n\n    t = np.float64(t)\n    a = np.float64(a)\n\n    # output dimensions of xcorr need to match those of local_sum\n    outdims = np.array([a.shape[dd]+t.shape[dd]-1 for dd in range(a.ndim)])\n    # hack by BS 1/15/2013-- the direct method appears not to work\n\n    af = fftn(a,shape=outdims)\n    tf = fftn(ndflip(t),shape=outdims)\n    # 'non-normalized' cross-correlation\n    xcorr = np.real(ifftn(tf*af))\n\n    # local linear and quadratic sums of input array in the region of the\n    # template\n    ls_a  = local_sum(a,t.shape, 0)\n    ls2_a = local_sum(a**2,t.shape, np.mean(a**2))\n\n    # now we need to make sure xcorr is the same size as ls_a\n    xcorr = procrustes(xcorr,ls_a.shape,side='both')\n\n    # local standard deviation of the input array\n    ls_diff = ls2_a - (ls_a**2)/t.size\n    ls_diff = np.where(ls_diff < 0,0,ls_diff)\n    sigma_a = np.sqrt(ls_diff)\n\n    # standard deviation of the template\n    sigma_t = np.sqrt(t.size-1.)*std_t\n\n    # denominator: product of standard deviations\n    denom = sigma_t*sigma_a\n\n    # numerator: local mean corrected cross-correlation\n    numer = (xcorr - ls_a*mean_t)\n\n    # sigma_t cannot be zero, so wherever the denominator is zero, this must\n    # be because sigma_a is zero (and therefore the normalized cross-\n    # correlation is undefined), so set nxcorr to zero in these regions\n    tol    = np.sqrt(np.finfo(denom.dtype).eps)\n    nxcorr = np.zeros(numer.shape)\n    good   = denom>tol\n    nxcorr[good]=numer[good]/denom[good]\n    #nxcorr = np.where(denom < tol,0,numer/denom)\n\n    # if any of the coefficients are outside the range [-1 1], they will be\n    # unstable to small variance in a or t, so set them to zero to reflect\n    # the undefined 0/0 condition\n    bad = nxcorr-1. >  np.sqrt(np.finfo(nxcorr.dtype).eps);\n    nxcorr[bad] = 0.\n\n    if trim:\n        nxcorr  = procrustes(nxcorr,a.shape,side='both')\n        sigma_a = procrustes(sigma_a,a.shape,side='both')\n    return nxcorr\n\ndef local_sum(a, tshape, padval):\n    \"\"\"For each element in an n-dimensional input array, calculate\n    the sum of the elements within a surrounding region the size of\n    the template\"\"\"\n\n    # zero-padding\n    a = ndpad(a, tshape, padval)\n\n    # difference between shifted copies of an array along a given dimension\n    def shiftdiff(a,tshape,shiftdim):\n        ind1 = [slice(None,None),]*a.ndim\n        ind2 = [slice(None,None),]*a.ndim\n        ind1[shiftdim] = slice(tshape[shiftdim], a.shape[shiftdim]-1)\n        ind2[shiftdim] = slice(0,a.shape[shiftdim]-tshape[shiftdim]-1)\n        return a[tuple(ind1)] - a[tuple(ind2)]\n\n    # take the cumsum along each dimension and subtracting a shifted version\n    # from itself. this reduces the number of computations to 2*N additions\n    # and 2*N subtractions for an N-dimensional array, independent of its\n    # size.\n    #\n    # See:\n    # <http://www.idiom.com/~zilla/Papers/nvisionInterface/nip.html>\n    for dd in range(a.ndim):\n        a = np.cumsum(a,dd)\n        a = shiftdiff(a,tshape,dd)\n    return a\n\n\ndef ndpad(a,npad=None,padval=0):\n    \"\"\"\n    Pads the edges of an n-dimensional input array with a constant value\n    across all of its dimensions.\n\n    Inputs:\n    ----------------\n        a   The array to pad\n\n        npad*   The pad width. Can either be array-like, with one\n            element per dimension, or a scalar, in which case the\n            same pad width is applied to all dimensions.\n\n        padval  The value to pad with. Must be a scalar (default is 0).\n\n    Output:\n    ----------------\n        b   The padded array\n\n    *If npad is not a whole number, padding will be applied so that the\n    'left' edge of the output is padded less than the 'right', e.g.:\n\n        a       == np.array([1,2,3,4,5,6])\n        ndpad(a,1.5)    == np.array([0,1,2,3,4,5,6,0,0])\n\n    In this case, the average pad width is equal to npad (but if npad was\n    not a multiple of 0.5 this would not still hold). This is so that ndpad\n    can be used to pad an array out to odd final dimensions.\n    \"\"\"\n\n    if npad == None:\n        npad = np.ones(a.ndim)\n    elif np.isscalar(npad):\n        npad = (npad,)*a.ndim\n    elif len(npad) != a.ndim:\n        raise Exception('Length of npad (%i) does not match the '\\\n                'dimensionality of the input array (%i)'\n                %(len(npad),a.ndim))\n\n    # initialise padded output\n    padsize = [a.shape[dd]+2*npad[dd] for dd in range(a.ndim)]\n    b = np.ones(padsize,a.dtype)*padval\n\n    # construct an N-dimensional list of slice objects\n    ind = [slice(int(np.floor(npad[dd])), int(a.shape[dd]+np.floor(npad[dd]))) for dd in range(a.ndim)]\n\n    # fill in the non-pad part of the array\n    b[tuple(ind)] = a\n    return b\n\ndef procrustes(a,target,side='both',padval=0):\n    \"\"\"\n    Forces an array to a target size by either padding it with a constant or\n    truncating it\n\n    Arguments:\n        a   Input array of any type or shape\n        target  Dimensions to pad/trim to, must be a list or tuple\n    \"\"\"\n\n    try:\n        if len(target) != a.ndim:\n            raise TypeError('Target shape must have the same number of dimensions as the input')\n    except TypeError:\n        raise TypeError('Target must be array-like')\n\n    try:\n        b = np.ones(target,a.dtype)*padval\n    except TypeError:\n        raise TypeError('Pad value must be numeric')\n    except ValueError:\n        raise ValueError('Pad value must be scalar')\n\n    aind = [slice(None,None)]*a.ndim\n    bind = [slice(None,None)]*a.ndim\n\n    # pad/trim comes after the array in each dimension\n    if side == 'after':\n        for dd in range(a.ndim):\n            if a.shape[dd] > target[dd]:\n                aind[dd] = slice(None, int(target[dd]))\n            elif a.shape[dd] < target[dd]:\n                bind[dd] = slice(None, int(a.shape[dd]))\n\n    # pad/trim comes before the array in each dimension\n    elif side == 'before':\n        for dd in range(a.ndim):\n            if a.shape[dd] > target[dd]:\n                aind[dd] = slice(int(a.shape[dd]-target[dd]), None)\n            elif a.shape[dd] < target[dd]:\n                bind[dd] = slice(int(target[dd]-a.shape[dd]), None)\n\n    # pad/trim both sides of the array in each dimension\n    elif side == 'both':\n        for dd in range(a.ndim):\n            if a.shape[dd] > target[dd]:\n                diff = (a.shape[dd]-target[dd])/2.\n                aind[dd] = slice(int(np.floor(diff)), int(a.shape[dd]-np.ceil(diff)))\n            elif a.shape[dd] < target[dd]:\n                diff = (target[dd]-a.shape[dd])/2.\n                bind[dd] = slice(int(np.floor(diff)), int(target[dd]-np.ceil(diff)))\n\n    else:\n        raise Exception('Invalid choice of pad type: %s' %side)\n\n    b[tuple(bind)] = a[tuple(aind)]\n\n    return b\n\ndef ndflip(a):\n    \"\"\"Inverts an n-dimensional array along each of its axes\"\"\"\n    ind = (slice(None,None,-1),)*a.ndim\n    return a[ind]\n\ndef log_filter(img, noData):\n    \"\"\"\n    performs a separable Laplacian of Gaussian filter on the input image.\n    Returns a copy of the original image, converted to float64\n    \"\"\"\n    img1 = np.float64(img.copy())\n    img1 = sf.laplace( img1, mode='constant')\n    if np.sum(img<=noData) > 0 : #zero the filtered image at  data-nodata boundaries\n        mask = np.float64(img.copy())\n        mask[:] = 1.\n        mask[img<=noData] = 0.0\n        mask=sf.laplace(mask, mode='constant')\n        img1[mask != 0.] = 0.   # set the borders to zero\n    img1 = sf.gaussian_filter(img1, (1.4, 1.4), mode='constant')\n    return img1\n\n#==============================================================================\n# Start of sparse_disp functions\n#==============================================================================\n\ndef run_one_block(template_size, KW, min_template_sigma, Xc, Yc,\n                  search_range_x, search_range_y, dx0, dy0, T_img, S_img, noData):\n\n    # Do template matching for a single block in the left image.\n    # LOG filter the images\n    T_filt = log_filter(T_img, noData)\n    S_filt = log_filter(S_img, noData)\n    std_T  = np.std(T_filt)\n    if min_template_sigma is not None:\n        if std_T <= min_template_sigma:\n            return(-2, Xc, Yc, -1, 0, 0)\n\n    # Run the feature match.\n    TT = T_filt[KW:template_size+KW,  KW:template_size+KW ]\n    SS = S_filt[KW:search_range_y+KW, KW:search_range_x+KW]\n    # If the search image is large, do an initial search at 2x lower resolution\n    if (SS.shape[0] > 32+TT.shape[0]) or (SS.shape[1] >32+TT.shape[1]):\n        low_res_template = TT[1:-1:2, 1:-1:2]\n        low_res_image    = SS[1:-1:2, 1:-1:2]\n        template_matcher = TemplateMatch(low_res_template) # Perform template search\n        result = template_matcher(low_res_image)\n        if result is None:\n            #warnings.warn('run_one_block: TemplateMatch returned None at xc=%d, yc=%d' % (Xc, Yc))\n            return(-3., Xc, Yc, 0., np.NaN, np.NaN)\n\n        result = result[int(template_size/4):int(search_range_y/2-template_size/4), int(template_size/4):int(search_range_x/2-template_size/4)]\n        ijC    = 2*(np.array(np.unravel_index(np.argmax(result), result.shape))-[result.shape[0]/2., result.shape[1]/2.]).astype(int)\n\n        t_xr = np.array(ijC[1]+[-template_size/2-16, template_size/2+16]+SS.shape[1]/2, dtype=np.int16)\n        t_yr = np.array(ijC[0]+[-template_size/2-16, template_size/2+16]+SS.shape[0]/2, dtype=np.int16)\n        if t_xr[0] >= 0 and t_yr[0] >= 0 and t_xr[1] <= SS.shape[1] and t_yr[1] <= SS.shape[0] :\n            dx0 = dx0+ijC[1]\n            dy0 = dy0+ijC[0]\n            SS  = SS[t_yr[0]:t_yr[1], t_xr[0]:t_xr[1]]\n\n    template_matcher = TemplateMatch(TT)\n    result = template_matcher(SS)\n\n    # trim off edges of result\n    result=result[int(template_size/2):int(SS.shape[0]-template_size/2),\n                  int(template_size/2):int(SS.shape[1]-template_size/2)]\n\n    ij  = np.unravel_index(np.argmax(result), result.shape)\n    ijC = ij-np.array([result.shape[0]/2, result.shape[1]/2])\n\n    return (result[ij], Xc, Yc, std_T, ijC[1]+dx0, ijC[0]+dy0)\n\ndef run_blocks(param):\n\n    # Run template matching for a set of blocks. This function is being\n    # distributed across multiple processors.\n\n    (Tfile, Sfile, processes, xgi, ygi, these_ind, template_size, search_range_xy_i,\n     dxy0_i, XYc_i, min_template_sigma, user_nodata) = param\n    matcher = fft_matcher(Tfile, Sfile, processes, user_nodata)\n\n    KW=matcher.KW\n\n    s_x_bounds=np.c_[XYc_i[:,0]+dxy0_i[:,0]-search_range_xy_i[:,0]-KW-1000,\n                     XYc_i[:,0]+dxy0_i[:,0]+search_range_xy_i[:,0]+KW+1000]\n    s_y_bounds=np.c_[XYc_i[:,1]+dxy0_i[:,1]-search_range_xy_i[:,1]-KW-1000,\n                     XYc_i[:,1]+dxy0_i[:,1]+search_range_xy_i[:,1]+KW+1000]\n    matcher.T_sub.setBounds(xgi-template_size, ygi-template_size, matcher.blocksize+2*template_size,\n                            matcher.blocksize+2*template_size, update=1)\n    matcher.S_sub.setBounds(s_x_bounds[:,0].min(),\n                            s_y_bounds[:,0].min(),\n                            s_x_bounds[:,1].max()-s_x_bounds[:,0].min(),\n                            s_y_bounds[:,1].max()-s_y_bounds[:,0].min(),\n                            update=1)\n    indices = []; c = []; x = []; y = []; sigma = []; dx = []; dy = [];\n\n    # loop over the sub-blocks\n\n    count=-1\n    T_buffer=im_subset(0, 0, 0, 0, matcher.T_sub, user_nodata, pad_val=matcher.T_sub.noData)\n    S_buffer=im_subset(0, 0, 0, 0, matcher.S_sub, user_nodata, pad_val=matcher.S_sub.noData)\n\n    for Xc, Yc, search_range_x, search_range_y, dx0, dy0 in \\\n          zip(XYc_i[:,0], XYc_i[:,1], search_range_xy_i[:,0], search_range_xy_i[:,1], dxy0_i[:,0],dxy0_i[:,1]):\n        #print(\"S_buffer.Nodata=%f, T_buffer.noData\"% (matcher.S_sub.noData, matcher.T_sub.noData)\n        count=count+1\n        t_xr=[Xc-(template_size/2-1)-KW,      Xc+(template_size/2) +KW]\n        t_yr=[Yc-(template_size/2-1)-KW,      Xc+(template_size/2) +KW]\n        s_xr=[Xc+dx0-(search_range_x/2-1)-KW, Xc+(search_range_x/2)+KW]\n        s_yr=[Yc+dy0-(search_range_y/2-1)-KW, Yc+(search_range_y/2)+KW]\n\n        # Read in the data for this block. Use the im_subset objects:\n        # read nodata if we read past the image edges.\n\n        # Read T\n        T_buffer.setBounds(t_xr[0]-KW, t_yr[0]-KW, template_size+2.*KW,\n                           template_size+2.*KW, update=1)\n        T_img=T_buffer.z[0,:,:]\n        if np.mean(T_img<=T_buffer.noData)>.1: # bail if > 10% 0, flag with C=-2\n            continue\n\n        # Read S\n        S_buffer.setBounds(s_xr[0]-KW, s_yr[0]-KW, search_range_x+2.*KW,\n                           search_range_y+2.*KW, update=1)\n        S_img=S_buffer.z[0,:,:]\n        if np.mean(S_img<=S_buffer.noData) > .25: # bail if > 25% 0\n            continue\n        out = run_one_block(template_size, KW, min_template_sigma, Xc, Yc, int(search_range_x),\n                            int(search_range_y), dx0, dy0, T_img, S_img, T_buffer.noData)\n\n        indices.append(these_ind[count])\n        c.append(out[0])\n        x.append(out[1])\n        y.append(out[2])\n        sigma.append(out[3])\n        dx.append(out[4])\n        dy.append(out[5])\n\n    return(indices[:], c[:], x[:], y[:], sigma[:], dx[:], dy[:])\n\nclass fft_matcher(object):\n    \"\"\"\n    class to perform fft matches on a pair of image files.  Uses the GDAL\n    API for reads and writes, and the norm_xcorr package to do the matching\n    Arguments:\n        For initialization:\n            Tfile  The template file -- small images are extracted from this file\n                and correlated against sub-images of Sfile\n            Sfile  The search file.\n\n        For correlation:\n            template_size : Size of the square template\n            search_range_xy_i  : [2, N], array-like  search windows in x and y\n                        to use at each center (n_columns, n_rows)\n            dxy0_i   : [2, N], array-like  initial offset estimates\n                        (delta_col,  delta_row)\n            XYc_i    : [2,N] pixel centers to search in the template image\n                        (col, row)\n\n        Outputs from correlation:\n            xyC     :  Pixel centers in the template image\n            dxy     :  pixel offsets needed to shift the template to match the search image\n            C       :  Correlation value for the best match (0<C<1).\n                        -1 indicates invalid search or template data\n    \"\"\"\n    def __init__(self, Tfile, Sfile, processes, user_nodata):\n        self.Tfile  = Tfile\n        self.Sfile  = Sfile\n        self.processes = processes\n        self.T_ds   = gdal.Open(Tfile, gdalconst.GA_ReadOnly)\n        self.T_band = self.T_ds.GetRasterBand(1)\n        self.S_ds   = gdal.Open(Sfile, gdalconst.GA_ReadOnly)\n        self.S_band = self.S_ds.GetRasterBand(1)\n        self.Nx     = self.T_band.XSize\n        self.Ny     = self.T_band.YSize\n        self.KW     = 13  # pad the edges by this amount to avoid edge effects\n        self.S_sub  = im_subset(0, 0, self.S_band.XSize, self.S_band.YSize,\n                                self.S_ds, user_nodata, pad_val=0, Bands=[1])\n        self.T_sub  = im_subset(0, 0, self.T_band.XSize, self.S_band.YSize,\n                                self.T_ds, user_nodata, pad_val=0, Bands=[1])\n\n        search_geotransform      = self.S_sub.source.GetGeoTransform()\n        self.search_geotransform = search_geotransform\n        self.UL_S = np.array([search_geotransform[0], search_geotransform[3]])\n        LL_S      = np.array([search_geotransform[0], \n                              search_geotransform[3]+self.S_sub.Nr*search_geotransform[5]])\n        UR_S      = np.array([search_geotransform[0]+self.S_sub.Nc*search_geotransform[1], \n                              search_geotransform[3]])\n\n        template_geotransform      = self.T_sub.source.GetGeoTransform()\n        self.template_geotransform = template_geotransform\n        self.UL_T = np.array([template_geotransform[0], template_geotransform[3]])\n        LL_T      = np.array([template_geotransform[0], \n                              template_geotransform[3]+self.T_sub.Nr*template_geotransform[5]])\n        UR_T      = np.array([template_geotransform[0]+self.T_sub.Nc*template_geotransform[1],  \n                              template_geotransform[3]])\n\n        XR = [np.max([LL_S[0], LL_T[0]]), np.min([UR_S[0], UR_T[0]])]\n        YR = [np.max([LL_S[1], LL_T[1]]), np.min([UR_S[1], UR_T[1]])]\n        self.XR = XR\n        self.YR = YR\n        self.T_c0c1 = np.array([max([0, (LL_T[0]-XR[0])/template_geotransform[1]]),\n                                min(self.T_sub.Nc, (XR[1]-LL_T[0])/template_geotransform[1])]).astype(int)\n        self.T_r0r1 = np.array([max([0 , (YR[1]-UR_T[1])/template_geotransform[5]]),\n                                min([self.T_sub.Nr, (LL_T[1]-YR[1])/template_geotransform[5]])]).astype(int)\n\n        self.blocksize   = 2048\n        self.user_nodata = user_nodata\n\n    def __call__(self, template_size, search_range_xy_i, dxy0_i, XYc_i, min_template_sigma):\n\n        # loop over pixel centers\n        self.C   = np.zeros([XYc_i.shape[0], 1])-1\n        self.sigma_template = (self.C).copy()\n        self.dxy = np.zeros([XYc_i.shape[0], 2])\n        self.xyC = np.zeros([XYc_i.shape[0], 2])\n\n        xg0, yg0 = np.meshgrid(np.arange(0, self.T_band.XSize, self.blocksize),\n                               np.arange(0, self.T_band.YSize, self.blocksize))\n\n        TaskParams = []\n        for xgi, ygi in zip(xg0.ravel(), yg0.ravel()):\n            these = np.logical_and(np.logical_and(XYc_i[:,0] > xgi,\n                                                  XYc_i[:,0] <= xgi+self.blocksize),\n                                   np.logical_and(XYc_i[:,1] > ygi,\n                                                  XYc_i[:,1] <= ygi+self.blocksize))\n            if ~np.any(these):\n                continue\n            XYc  = XYc_i[these,:]\n            dxy0 = dxy0_i[these,:]\n            search_range_xy = search_range_xy_i[these,:]\n            these_ind = np.array(np.nonzero(these)).ravel()\n            param = (self.Tfile, self.Sfile, self.processes, xgi.copy(), ygi.copy(), these_ind.copy(),\n                     template_size, search_range_xy.copy(), dxy0.copy(), XYc.copy(), min_template_sigma,\n                     self.user_nodata)\n            TaskParams.append(param)\n\n        if self.processes > 1: # Run using multiple processes\n            pool = Pool(processes=self.processes)\n            Out = pool.map(run_blocks, TaskParams, chunksize=1)\n        else: # Run using single process (for debugging)\n            Out = [run_blocks(TP) for TP in TaskParams]\n\n        for out in Out:\n            (indices, c, x, y, sigma, dx, dy) = out\n\n            for i in range(len(indices)):\n                ind = indices[i]\n                self.C[ind] = c[i]\n                self.xyC[ind] = [x[i], y[i]]\n                self.sigma_template[ind] = sigma[i]\n                self.dxy[ind,:] = [dx[i], dy[i]]\n\n        return (self.xyC).copy(), (self.dxy).copy(), (self.C).copy(), (self.sigma_template).copy()\n\ndef make_pt_2_neighbors(tri):\n    \"\"\" make a dictionary of the neighbors of each point in triangulation tri \"\"\"\n    pt_dict=dict()\n    for vlist in tri.simplices:\n        for i in vlist:\n            if not i in pt_dict:\n                pt_dict[i]=list()\n            for k in vlist:\n                if k != i:\n                    pt_dict[i].insert(0,k)\n    for i in range(tri.points.shape[0]):\n        pt_dict[i]=np.unique(pt_dict[i]).tolist()\n    return pt_dict\n\n\ndef unique_rows(data):\n    \"\"\" return the indices for the unique rows of matrix (data) \"\"\"\n\n    udict = dict()\n    for row in range(len(data)):\n        row_data = tuple(data[row,:])\n        if not row_data in udict:\n            udict[row_data] = row\n    uInd=udict.values()\n\n    new_ind = []\n    for key in udict:\n        new_ind.append(udict[key])\n\n    new_rows = data[new_ind, :]\n    \n    return new_ind, new_rows\n\ndef search_new_pts(xy, dxy, t_size, matcher, min_template_sigma=0., mask=None):\n    \"\"\"\n    use an image matcher object to perform a template match between\n    two images at the points defined by xy, using search windows that\n    span the range in dxy\n    \"\"\"\n\n    if mask is not None:\n        x_geo    = matcher.template_geotransform[0] + matcher.template_geotransform[1]*xy[:,0]\n        y_geo    = matcher.template_geotransform[3] + matcher.template_geotransform[5]*xy[:,1]\n        good_pts = img_interpolate_linear(x_geo, y_geo, mask['Z'], mask['GT'])\n        good_pts = (~np.isnan(good_pts)) & (good_pts > 0)\n        if ~np.any(good_pts):\n            return np.zeros(0), np.zeros(0), np.zeros(0), np.zeros(0)\n        xy  = xy [good_pts,:]\n        dxy = dxy[good_pts,:]\n\n    dxy0 = np.c_[dxy[:,0]+dxy[:,1], dxy[:,2]+dxy[:,3]]/2.\n    dxyR = np.c_[dxy[:,1]-dxy[:,0], dxy[:,3]-dxy[:,2]]\n    sw   = np.array(2.**np.ceil(np.log2(np.maximum(dxyR+t_size, t_size+16))))\n    xy_new, dxy_new, C_new, Pt_new = matcher(t_size, sw, dxy0, xy,\n                                             min_template_sigma=min_template_sigma)\n    xy_bad_mask = xy_new [C_new.ravel()==-2,:]\n    good        = C_new>0\n    xy_new      = xy_new [good.ravel(),:]\n    dxy_new     = dxy_new[good.ravel(),:]\n    C_new       = C_new  [good.ravel()  ]\n    Pt_new      = Pt_new [good.ravel()  ]\n    return xy_new, dxy_new, C_new, xy_bad_mask\n\ndef neighborhood_range(pt_list, dx_mat, dy_mat, tri, pt_dict, max_dist=None, calc_min_slope=None):\n    \"\"\"\n    for each point in pt_list, return the maximum and minimum offset to its neighbors.\n    inputs:\n        pt_list:  list of points to be searched\n        dx_mat: sparse matrix with x disparity values for each pixel in the\n                template image\n        dy_may: ditto, but for y\n        tri:    a triangulation.  th points field in this triangulation is\n                used to get the x and y offsets for the point indices\n        pt_dict:  a dictionary giving the neighbor point numbers for each\n                  point in tri\n    output:\n        dx_range: an Nx4 martix.  columns 0 and 1 give the min and max x\n        offsets around each point, columns 2 and 3 give the min and max y.\n    \"\"\"\n    dxy_range = np.zeros([len(pt_list), 4])\n    if calc_min_slope is not None:\n        dxy_slope = np.zeros([len(pt_list), 2])\n    for row, pt in enumerate(pt_list):\n        neighbors = pt_dict[pt]\n        nbhd_pts  = tri.points[neighbors,:]\n        this_pt   = tri.points[pt,:]\n        if max_dist is not None:\n            dist2    = (nbhd_pts[:,1]-this_pt[1])**2 + (nbhd_pts[:,0]-this_pt[0])**2\n            nbhd_pts = nbhd_pts[dist2 < max_dist**2,:]\n        if nbhd_pts is None or min(nbhd_pts.shape) < 1:\n            continue\n        dx_vals = np.append(np.array(dx_mat[nbhd_pts[:,1], nbhd_pts[:,0]]), dx_mat[int(this_pt[1]), int(this_pt[0])])\n        dy_vals = np.append(np.array(dy_mat[nbhd_pts[:,1], nbhd_pts[:,0]]), dy_mat[int(this_pt[1]), int(this_pt[0])])\n        if calc_min_slope is not None:\n            dist     = np.sqrt((nbhd_pts[:,1]-this_pt[1])**2 + (nbhd_pts[:,0]-this_pt[0])**2)\n            dx_slope = np.abs(dx_vals[0:-1]-dx_vals[-1])/dist\n            dy_slope = np.abs(dy_vals[0:-1]-dy_vals[-1])/dist\n            dxy_slope[row,:] = [np.min(dx_slope), np.min(dy_slope)];\n\n        dxy_range[row,[0,1]] = [np.min(dx_vals), np.max(dx_vals)]\n        dxy_range[row,[2,3]] = [np.min(dy_vals), np.max(dy_vals)]\n    if calc_min_slope is not None:\n        return dxy_range, dxy_slope\n    else:\n        return dxy_range ##, dxy_bar\n\ndef test_epipolar(dxy_0, ep_vec, dxy, tol):\n    \"\"\"\n    given an origin vector and an epipolar unit vector, projects a set of\n    points against the epipolar vector and gives their perpendicular offset\n    WRT that vector, and a boolean array that shows whether this offset is\n    smaller that tol.\n    \"\"\"\n    delta=np.abs(np.dot((dxy-dxy_0), [ep_vec[1], -ep_vec[0]]))\n    disp_mag=np.sqrt((dxy[:,0]-dxy_0[0])**2 +(dxy[:,1]-dxy_0[1])**2)\n    good=(delta < tol) | (delta < 0.02 * disp_mag )\n    return good, delta\n\ndef est_epipolar_vec(dxy, C, C_tol, ep_vec_initial, F_use):\n    \"\"\"\n    given a set of offsets and correlation values:\n        For those point with  C>C_tol, find the median offset and the\n        eigenvectors of the distribution of the points around that median\n        offset.  The eigenvector corresponding to the largest eigenvalue is\n        assumed to be the epipolar vector.\n\n    \"\"\"\n    if ep_vec_initial is not None:\n        return ep_vec_initial, np.zeros([1,2])\n\n    P_use   =100*np.array([(1-F_use)/2., (F_use+1.)/2.])\n    ctr_vals=((dxy[:,0] >= np.percentile(dxy[:,0], P_use[0])) & \n              (dxy[:,0] <= np.percentile(dxy[:,0], P_use[1])) & \n              (dxy[:,1] >= np.percentile(dxy[:,1], P_use[0])) & \n              (dxy[:,1] <= np.percentile(dxy[:,1], P_use[1]))  )\n    good        = ctr_vals & np.array(C.ravel()>C_tol, dtype=bool)\n    dxy1        = np.array(dxy[good.ravel(),:])\n    dxy_ctr     = np.array([np.median(dxy1[:,0]), np.median(dxy1[:,1])])\n    dxy_0       = dxy1.copy()\n    dxy_0[:,0]  = dxy_0[:,0]-dxy_ctr[0]\n    dxy_0[:,1]  = dxy_0[:,1]-dxy_ctr[1]\n    vals, vecs  = np.linalg.eig(np.dot(dxy_0.transpose(), dxy_0))\n    biggest_vec = vecs[:,np.argmax(abs(vals)) ]\n    return biggest_vec, dxy_ctr\n\ndef img_interpolate_linear( x, y, I, GT, nodata_val=np.NaN):\n    result=np.zeros_like(x)+nodata_val\n    # get the col and row in the image\n    col  = (x-GT[0])/GT[1]\n    row  = (y-GT[3])/GT[5]\n    good = (row > 0) & (row < I.shape[0]-1) & (col > 0) & (col<I.shape[1]-1)\n    if ~np.any(good):\n        return result\n    # perform interpolation only for in-bounds xy\n    row = row[good]\n    col = col[good]\n    rx  = row-np.floor(row)\n    ry  = col-np.floor(col)\n    row = np.floor(row).astype('int')\n    col = np.floor(col).astype('int')\n    # add the contributions of each neighbor\n    ztemp = np.zeros_like(row)\n    ztemp =         (1-ry)*(1-rx)*I[(row, col)]\n    ztemp = ztemp + (ry)*(1-rx)*I[(row+1,col)]\n    ztemp = ztemp + (1-ry)*(rx)*I[(row,col+1)]\n    ztemp = ztemp + (ry)*(rx)*I[(row+1,col+1)]\n    result[good] = ztemp\n    return result\n\ndef grid_disp(xg, yg, xy, dx, dy, ex, ey, L_valid, N_coarse, dispDs, spreadDs, downscale, cr_out):\n    grid_spacing = xg[0,1]-xg[0,0]\n    # valid kernel dilates the distance mask, which tells whether to correlate\n    sigma_valid  = L_valid/3;\n    N_valid      = np.ceil(sigma_valid*3/grid_spacing)\n    kernel_valid = np.exp(-0.5*(grid_spacing*np.arange(-N_valid, N_valid+1)/(sigma_valid))**2)\n    # smoothing kernel is used to make a large-scale smoothed version of the disparities\n    # set its smoothing width to 512 pixels, make sure the whole kernel is at least 1024 pixels wider than the valid kernel\n    N_sm      = 2048/downscale+np.ceil(L_valid/grid_spacing);\n    sigma_sm  = N_sm/4.\n    kernel_sm = np.exp(-0.5*(np.arange(-N_sm, N_sm+1)/sigma_sm)**2)\n\n    row  = np.floor((xy[:,1]-yg[0,0])/(yg[1,0]-yg[0,0])).astype('int')\n    col  = np.floor((xy[:,0]-xg[0,0])/(xg[0,1]-xg[0,0])).astype('int')\n    \n    good = (row>=0) & (row < xg.shape[0]-1) & (col >=0) & (col < xg.shape[1]-1)\n    dist_mask = np.zeros_like(xg)\n    dist_mask[row[good], col[good]] = 1.\n    dist_mask = convolve1d(convolve1d(dist_mask, kernel_valid, axis=0, mode='constant'), \n                           kernel_valid, axis=1, mode='constant')\n    dist_mask = dist_mask > np.exp(-0.5*(L_valid/sigma_valid)**2)\n\n    # take a subset of points from dist_mask to limit the interpolation distance for each quantity\n    # Otherwise, the triangulation makes long skinny triangles along concave boundaries of the data points\n    mask1 = dist_mask[0::N_coarse, 0::N_coarse].ravel()\n    xg1   = xg[0::N_coarse, 0::N_coarse].ravel()\n    yg1   = yg[0::N_coarse, 0::N_coarse].ravel()\n    xg1   = xg1[mask1==0]\n    yg1   = yg1[mask1==0]\n    for count, z in enumerate((dx, dy)):\n        zi = griddata(np.append(xy, np.c_[xg1, yg1], 0), np.append(z, np.NaN+np.zeros([len(xg1),1]),0), (xg, yg), method='linear')\n        zi_smooth = convolve1d(convolve1d(np.nan_to_num(zi), kernel_sm, axis=0, mode='constant'), kernel_sm, axis=1, mode='constant')\n        if count<1:\n            mask_smooth=convolve1d(convolve1d((~np.isnan(zi)).astype('float32'), kernel_sm, axis=0, mode='constant'), kernel_sm, axis=1, mode='constant')\n        zi_smooth[mask_smooth>1e-5 ] = zi_smooth[mask_smooth>1e-5]/mask_smooth[mask_smooth>1e-5]\n        zi_smooth[mask_smooth<=1e-5] = 0\n        zi[np.isnan(zi)] = zi_smooth[np.isnan(zi)]\n        zi = np.nan_to_num(zi)\n        # ... and write it out to the disparity file\n        dispDs.GetRasterBand(count+1).WriteArray(zi[:,:,0], int(cr_out[0]), int(cr_out[1]))\n        if count==0:\n            dx_g = zi\n        if count==1:\n            dy_g = zi\n    dispDs.GetRasterBand(3).WriteArray(dist_mask.astype('float32'), int(cr_out[0]), int(cr_out[1]))\n    zi = np.nan_to_num(griddata(np.append(xy, np.c_[xg1, yg1], 0), np.append(ex, np.NaN+np.zeros([len(xg1),1]),0), (xg, yg), method='linear'))\n    zi[dist_mask==0] = 0\n    spreadDs.GetRasterBand(1).WriteArray(zi[:,:,0], int(cr_out[0]), int(cr_out[1]))\n    zi = np.nan_to_num(griddata(np.append(xy, np.c_[xg1, yg1], 0), np.append(ey, np.NaN+np.zeros([len(xg1),1]),0), (xg, yg), method='linear'))\n    zi[dist_mask==0] = 0\n    spreadDs.GetRasterBand(2).WriteArray(zi[:,:,0],                   int(cr_out[0]), int(cr_out[1]))\n    spreadDs.GetRasterBand(3).WriteArray(dist_mask.astype('float32'), int(cr_out[0]), int(cr_out[1]))\n    return\n\n#==============================================================================\n# Main program\n#==============================================================================\n\ndef main():\n    \"\"\" For a pair of images, perform a sparse image match using the full\n    resolution of the images.  Begin at resolution coarse_skip.  For each\n    point in a grid spanning the image 1, extract a template image of\n    size template_size, and use fft-based correlation to find its match in image 2,\n    over a wide search window (size xsearch by ysearch).  Based on matches from\n    this coarse grid, estimate an epipolar vector (the largest eigenvector of\n    the disparity vectors) and a tolerance for disparities to be parallel to\n    this vector (use max (16 pix, 90th percentile of differeces)).\n\n    Next, refine points for which the range of disparities among the\n    neighbors are larger than tolerance refine_tol.  Refinement consists\n    of adding the eight grid neighbors of a point, at half the previous\n    point spacing.  During refinment, the search windows are selected to span\n    the neighbors' x and y disparities, and are padded by 16 pixels and padded\n    again to give a power-of-two search size.\n\n    After each refinement, the new matches are checked againt the epipolar\n    vector, and all the matched points are checked for convergence.  Refinment\n    continues until the point spacing reaches fine_skip, or until no points\n    need to be refined.\n\n    Writes the output disparity image files:\n      [output_prefix]/-D_sub.tif\n      [output_prefix]/-D_sub_spread.tif\n\n    ???\n    Results are written to oufile:\n        pixel_x\n        pixel_y\n        x_disparity\n        y_diparity\n        correlation value\n        (max-min) neighbor x disparity\n        (max-min) neighbor y disparity\n     \"\"\"\n\n    usage = '''%prog [options] left_image right_image output_prefix\n\n  ''' + get_asp_version()\n\n    parser = OptionParser(usage=usage)\n    parser.set_defaults(epipolar_fltr=True)\n    parser.add_option(\"-x\", \"--xsearch\",   dest=\"search_range_x\", default=1024-56, type=\"int\",\n                      help=\"initial x search range, pixels (%default)\")\n    parser.add_option(\"-y\", \"--ysearch\",   dest=\"search_range_y\", default=1024-56, type=\"int\",\n                      help=\"initial y search range, pixels (%default)\")\n    parser.add_option(\"-t\", \"--template\",  dest=\"template_size\",  default=56,      type=\"int\",\n                      help=\"template size, pixels (%default)\")\n    parser.add_option(\"-c\", \"--coarse\",    dest=\"coarse_skip\",    default=None,    type=\"int\",\n                      help=\"initial search-point spacing, pixels (%default)\")\n    parser.add_option(\"-f\", \"--fine\",      dest=\"fine_skip\",      default=64,      type=\"int\",\n                      help=\"final search-point spacing, pixels (%default)\")\n    parser.add_option(\"-r\",\"--refine_tol\", dest=\"refine_tol\",     default=8,       type=\"int\",\n                      help=\"pixel range tolerance for refinement (%default)\")\n    parser.add_option(\"-d\",\"--output_dec_scale\", dest=\"output_scale\",  default=8,  type=\"int\",\n                      help=\"if set, output a second copy of the offsets scaled by this amount (%default), to file called OUTFILE_(OUTPUT_SCALE)\")\n    parser.add_option(\"-p\",\"--output_pad\",   dest=\"output_pad\",  default=2, type=\"int\",\n                      help=\"pad the output search range by this amount (%default)\")\n    parser.add_option(\"-s\", \"--sigma_t_min\", dest=\"sigma_t_min\", default=0., type=\"float\",\n                       help=\"matches will not be calculated if the standard deviation of the template is less than this value (%default)\")\n    parser.add_option(\"-R\", \"--R_lim_min\", dest=\"R_lim_min\",  default=32., type=\"float\",\n                       help=\"The minimum-neighbor-disparity parameter is set to the maximum of this parameter and the 98th percentile of all minimum neighbor disparities.\\n  Points whose neighbors have a minimum disparity range larger than this parameter will be removed (%default)\")\n    parser.add_option(\"-l\", \"--R_limax_disp_range\", dest=\"R_limax_disp_range\",  default=128., type=\"float\",\n                       help=\"The minimum-neighbor-disparity parameter is set to the minimum of this parameter and the 98th percentile of all minimum neighbor disparities.\\n  Points whose neighbors have a minimum disparity range larger than this parameter will be removed (%default)\")\n    parser.add_option(\"-m\", \"--mask_file\", dest=\"mask_file\", default=None, type=\"string\",\n                      help=\"if specified, use this geotif mask file to reject template-image points that should not be searched (1=search, 0=don't)\")\n    parser.add_option(\"-M\", \"--Max_disp_range\", dest=\"max_disp_range\",  default=64.,       type=\"float\",\n                       help=\"Un-scaled disparity range in output limited to this value (%default)\")\n    parser.add_option(\"-P\", \"--processes\",      dest=\"processes\",     default=cpu_count(), type=\"int\",\n                      help=\"The number of processes to use (%default)\")\n    parser.add_option(\"--no_epipolar_fltr\",     action=\"store_false\", dest=\"epipolar_fltr\",\n                      help=\"Disable filtering of disparities by distance from epipolar vector\")\n    parser.add_option(\"-e\", \"--epipolar_axis\",  dest=\"epipolar_axis\", default=None,  type=\"int\",\n                      help=\"If set, specify the axis that is epipolar 0=x, 1=y (%default)\")\n    parser.add_option(\"-n\", \"--nodata-value\",   dest=\"user_nodata\",   default=None,  type=\"int\",\n                      help=\"The no-data value (pixel values <= nodata are not not used. (%default)\")\n    parser.add_option(\"-w\", \"--fill-dist\",      dest=\"fill_dist\",     default=1000., type=\"float\",\n                      help=\"Fill in gaps of this size or more with smoothed values. (%default)\")\n    parser.add_option(\"-D\", \"--Debug\",          dest=\"Debug\",         default=False, action=\"store_true\",\n                      help=\"Output deugging info and text file of correlation-estimate points\")\n    (options, args) = parser.parse_args()\n\n    if len(args) < 3:\n        parser.print_help()\n        asp_system_utils.raise_error('Missing input files or output prefix', code=2)\n\n    if options.mask_file is not None:\n        mask_file=gdal.Open(options.mask_file)\n        in_mask={'GT': np.array(mask_file.GetGeoTransform()), 'Z': np.array(mask_file.ReadAsArray())}\n    else:\n        in_mask=None\n\n    # undocumented options #\n    F_ep_pts_to_use = 0.9\n    ep_tol_max      = 24\n    ep_tol_min      = 4\n    dxy_slope_tol   = 3.0\n    corr_score_tolerance = 0.4  # minimum quality needed in defining the epipolar vector estimate\n\n    template_file = args[0]\n    search_file   = args[1]\n    output_prefix = args[2]\n    sys.stdout.flush()\n    print(\"Start: \" + str(datetime.datetime.now()))\n    print(\"template_file = \" + template_file)\n    print(\"search_file   = \" + search_file  )\n    print(\"output_prefix = \" + output_prefix)\n\n    # Minimum number of coarse points in any dimension\n    min_npts = 8\n\n    # Adjust the input parameters based on the images. This\n    # may need to become more advanced.\n    T_ds   = gdal.Open(template_file, gdalconst.GA_ReadOnly)\n    T_band = T_ds.GetRasterBand(1)\n    # Limit search range to less than a quarter of the image size\n    # - This appears to be a hard limitation imposed by the FFT usage??\n    prev2x = prevpow2( T_band.XSize)\n    if options.search_range_x > prev2x/4:\n        options.search_range_x = prev2x/4\n        print(\"Warning: Decreasing xsearch value to: %d\" % options.search_range_x)\n    prev2y = prevpow2(T_band.YSize)\n    if options.search_range_y > prev2y/4:\n        options.search_range_y = prev2y/4\n        print(\"Warning: Decreasing ysearch value to: %d\" % options.search_range_y)\n\n    # Automatically set coarse_skip if not specified\n    if options.coarse_skip is None:\n        options.coarse_skip = np.min([prev2x/min_npts, prev2y/min_npts])\n        print(\"Setting coarse skip to: %d\" % options.coarse_skip)\n    else:\n        # Check to make sure coarse_skip isn't TOO coarse\n        # Minimum of 4 points in smallest dimension\n        if options.coarse_skip > np.min([prev2x/min_npts, prev2y/min_npts]):\n            options.coarse_skip = np.min([prev2x/min_npts, prev2y/min_npts])\n            print(\"Warning: decreasing coarse skip to: %d\" % options.coarse_skip)\n\n    search_range_x = options.search_range_x\n    search_range_y = options.search_range_y\n    template_size  = options.template_size\n\n    # If the user specified an epipolar axis, limit the search range to primarily along that axis\n    #  with only a small search range perpendicular to that axis.\n    if options.epipolar_axis is not None: # Handle user epipolar axis input\n        ep_vec_initial = np.zeros([1,2])\n        ep_vec_initial[options.epipolar_axis] = 1.\n        if options.epipolar_axis == 0: # X axis\n            search_range_y = np.min([search_range_y, search_range_x/10.]);\n        else: # Y axis\n            search_range_x = np.min([search_range_x, search_range_y/10.]);\n    else:\n        ep_vec_initial = None\n\n    # Create the output directory\n    out_dir = os.path.dirname(output_prefix)\n    if len(out_dir) == 0: \n        out_dir = '.'\n    if not os.path.exists(out_dir): \n        os.makedirs(out_dir)\n\n    # Generate a list of skip distances from the course level to the fine level.\n    skip_vals = 2.**np.arange(np.floor(np.log2(options.coarse_skip/2.)),\n                              np.floor(np.log2(options.fine_skip  /2.)), -1)\n\n    # Initialize the matcher object\n    matcher = fft_matcher(template_file, search_file, options.processes, options.user_nodata)\n\n    # Define the initial search points\n    # ??\n    edge_pad = np.array([search_range_x/4.+template_size/2, \n                         search_range_y/4.+template_size/2])\n    x_centers = np.arange(matcher.T_c0c1[0]+edge_pad[0], \n                          matcher.T_c0c1[1]-edge_pad[0], options.coarse_skip)\n    if x_centers[-1] < matcher.T_c0c1[1]:\n        x_centers = np.append(x_centers, int((x_centers[-1]+matcher.T_c0c1[1])/2.))\n    y_centers = np.arange(matcher.T_r0r1[0]+edge_pad[1], \n                          matcher.T_r0r1[1]-edge_pad[1], options.coarse_skip)\n    if y_centers[-1] < matcher.T_r0r1[1]:\n        y_centers = np.append(y_centers, int((y_centers[-1]+matcher.T_r0r1[1])/2.))\n    [x_centers_grid, y_centers_grid] = np.meshgrid(x_centers, y_centers)\n    xy_centers0 = np.c_[x_centers_grid.ravel(), y_centers_grid.ravel()]\n\n    # Find the offset that matches the origins of the two images\n    geotransform      = matcher.search_geotransform\n    origin_diff       = np.c_[matcher.UL_T - matcher.UL_S].transpose()\n    origin_diff[0][0] = np.floor(origin_diff[0][0]/np.abs(geotransform[1]))\n    origin_diff[0][1] = np.floor(origin_diff[0][1]/np.abs(geotransform[5]))\n    print(\"Running initial search: \" + str(datetime.datetime.now()))\n\n    # Find best correlation matches in the search image for each center in the template image\n    # ???\n    dxy0      = np.dot(np.c_[np.ones_like(xy_centers0[:,0])], origin_diff*[1, -1])\n    dxy_score = np.c_[dxy0[:,0]-search_range_x/2., \n                      dxy0[:,0]+search_range_x/2, \n                      dxy0[:,1]-search_range_y/2, \n                      dxy0[:,1]+search_range_y/2]\n    xy, dxy, corr_scores, xy_bad_mask = search_new_pts(xy_centers0, dxy_score, template_size, matcher,\n                                             min_template_sigma=options.sigma_t_min, mask=in_mask)\n\n    if options.epipolar_fltr:\n        # Throw out disparity results which are too far from the epipolar line\n        \n        # Fit an epipolar line to the detected offsets\n        ep_vec, dxy_ctr = est_epipolar_vec(dxy, corr_scores, corr_score_tolerance, \n                                           ep_vec_initial, F_ep_pts_to_use)\n        # Compare the offsets to the fit line\n        tolerance = 32\n        good_indices, ep_dist = test_epipolar(dxy_ctr, ep_vec, dxy, tolerance)\n        \n        # Get the 90th percentile distance from the epipolar line\n        ep_f90 = np.percentile(ep_dist[corr_scores.ravel() > corr_score_tolerance], 90)\n        # Use the 90th percentile dist as the tolerance unless it falls out of bounds\n        ep_tol = np.minimum(ep_tol_max, np.maximum(ep_tol_min, ep_f90))\n        \n        # If any points were marked as bad in the first epipolar test...\n        if (ep_vec_initial is not None) and np.any(~good_indices):\n            # Run the fit again with just good points and recompute the epipolar tolerance.\n            ep_vec, dxy_ctr = est_epipolar_vec(dxy        [good_indices,:], \n                                               corr_scores[good_indices,:], \n                                               corr_score_tolerance, None, F_ep_pts_to_use)\n            ep_f90          = np.percentile(ep_dist[corr_scores.ravel() > corr_score_tolerance], 90)\n            ep_tol          = np.minimum(ep_tol_max,np.maximum(ep_tol_min, ep_f90))\n            good_indices, ep_dist   = test_epipolar(dxy_ctr, ep_vec, dxy, ep_tol)\n        print(\" --- ep vec estimated at(%f,%f), tolerance=%f, ep_dist_f90=%f\" \n              % (ep_vec[0], ep_vec[1], ep_tol, ep_f90))\n    else:\n        # Create boolean array with True for all values in dx, don't filter the points.\n        good_indices = (dxy != np.nan)[:,0]\n    if len(good_indices) == 0:\n        print('No correlation matches detected!')\n        return -1\n\n    # Make sparse matrices for storing dx and dy values, store initial values\n    im_shape     = [matcher.Ny, matcher.Nx]\n    dx_mat       = coo_matrix((dxy[good_indices,0], (xy[good_indices,1], xy[good_indices,0])), shape=im_shape).tocsr()\n    dy_mat       = coo_matrix((dxy[good_indices,1], (xy[good_indices,1], xy[good_indices,0])), shape=im_shape).tocsr()\n    score_mat    = coo_matrix(((corr_scores[good_indices]).ravel(), \n                               (xy[good_indices,1], xy[good_indices,0])), shape=im_shape).tocsr()\n    bad_mask_mat = coo_matrix((np.ones_like(xy_bad_mask[:,0]), \n                              (xy_bad_mask[:,1], xy_bad_mask[:,0])), shape=im_shape).tocsr()\n    xy_list = xy[good_indices,:]\n    \n    # Points tested so far are the nozero members of score_mat\n    all_pts = np.c_[score_mat.nonzero()];\n    all_pts = all_pts[:,[1,0]];\n    \n    # ???\n    # Perform triangulation of points, then get min/max dx and dy differences with the neighboring points.\n    tri        = spatial.Delaunay(all_pts)\n    pt_dict    = make_pt_2_neighbors(tri)\n    dxy_score  = neighborhood_range(np.arange(0, all_pts.shape[0]), dx_mat, dy_mat, tri, pt_dict)\n    indices_to_refine = np.arange(0, xy_list.shape[0] )\n       \n    # Indices into the vales in the dxy_score variable\n    OFFSET_MIN_X = 0\n    OFFSET_MAX_X = 1\n    OFFSET_MIN_Y = 2\n    OFFSET_MAX_Y = 3\n    \n    # Define the pattern of pixel centers to refine at each step.  Duplicates will be deleted.\n    refine_x = np.array([-1.,  0.,  1., -1.,  1., -1., 0., 1.])\n    refine_y = np.array([-1., -1., -1.,  0.,  0.,  1., 1., 1.]);\n    \n    # Iterate through our disparity search coarseness levels, low to high res.\n    recalc_neighborhood_range = False\n    for delta_x in skip_vals:\n        print(\"----------refining to pixel skip length %d---------\" % delta_x)\n        print(\"Refining start time: \" + str(datetime.datetime.now()))\n        if len(indices_to_refine)==0:\n            print(\"    No refinement points for scale: %d\" % delta_x)\n            recalc_neighborhood_range=True\n            break\n        \n        # Add neighbors of the last set of points to the list\n        #sc=plt.scatter(all_pts[indices_to_refine,0], all_pts[indices_to_refine,1], c=dxy_score[:,1]-dxy_score[:,0]); plt.axis('equal'); plt.colorbar(sc)\n        new_x = (np.tile(all_pts[indices_to_refine, 0], [8,1]).transpose()+refine_x*delta_x).ravel()\n        new_y = (np.tile(all_pts[indices_to_refine, 1], [8,1]).transpose()+refine_y*delta_x).ravel()\n        \n        # The search range for the new points is set based on the \n        #  min and max of the dxy_scores of the refine points\n        new_dxy_score = np.array([np.tile(dxy_score[:,OFFSET_MIN_X], [8,1]).transpose().ravel(),\n                                  np.tile(dxy_score[:,OFFSET_MAX_X], [8,1]).transpose().ravel(),\n                                  np.tile(dxy_score[:,OFFSET_MIN_Y], [8,1]).transpose().ravel(),\n                                  np.tile(dxy_score[:,OFFSET_MAX_Y], [8,1]).transpose().ravel()]).transpose()\n\n        # define min and max pt indices\n        num_image_rows = im_shape[0]\n        num_image_cols = im_shape[1]\n        x_lims         = np.array([1, num_image_cols-1])\n        y_lims         = np.array([1, num_image_rows-1])\n        # clamp range of x and y to these indices\n        new_x[new_x > x_lims[1]] = x_lims[1]\n        new_x[new_x < 0        ] = x_lims[0]\n        new_y[new_y > y_lims[1]] = y_lims[1]\n        new_y[new_y < 0        ] = y_lims[0]\n\n        # ??\n        not_dups      = np.squeeze(np.array(score_mat[new_y, new_x]==0))\n        new_xy        = np.c_[new_x[not_dups], new_y[not_dups]]\n        uRows, new_xy = unique_rows(new_xy)\n\n        new_dxy_score = new_dxy_score[uRows,:]\n        N_search      = new_xy.shape[0]\n\n        # Search for the best image correlation matches around our new points\n        new_xy, new_dxy, new_corr_scores, new_xy_bad = search_new_pts(new_xy, new_dxy_score, template_size, matcher, \n                                                                      min_template_sigma=options.sigma_t_min, mask=in_mask)\n        if len(new_xy)==0:\n            print(\"    no new points found\")\n            recalc_neighborhood_range = True\n            break\n\n        # Either epipolar filter the points or call them all good.\n        if options.epipolar_fltr:\n            good_indices, ep_dist = test_epipolar(dxy_ctr, ep_vec, new_dxy, ep_tol)\n            print(\"    searched %d points, found %d good matches\" % (N_search, np.sum(good_indices) ))\n        else:\n            good_indices = (new_dxy != np.nan)[:,0]\n\n        # TODO: Make a function out of this code?\n        # Add the new points to the sparse matrix of tested points\n        dx_mat       = dx_mat+coo_matrix((new_dxy[good_indices,0], \n                                          [new_xy[good_indices,1], new_xy[good_indices,0]]), im_shape).tocsr()\n        dy_mat       = dy_mat+coo_matrix((new_dxy[good_indices,1], \n                                          [new_xy[good_indices,1], new_xy[good_indices,0]]), im_shape).tocsr()\n        score_mat    = score_mat+coo_matrix(((new_corr_scores[good_indices]).ravel(), \n                                             [new_xy[good_indices,1], new_xy[good_indices,0]]), im_shape).tocsr()\n        bad_mask_mat = bad_mask_mat + coo_matrix((1*np.ones_like(new_xy_bad[:,0]), (new_xy_bad[:,1], new_xy_bad[:,0])), shape=im_shape).tocsr()\n        bad_indices  = ~good_indices\n        bad_mask_mat = bad_mask_mat + coo_matrix((2*np.ones_like(new_xy[bad_indices,1]), \n                                                  (new_xy[bad_indices,1], new_xy[bad_indices,0])), shape=im_shape).tocsr()\n\n        #ID_new_pts=lil_matrix((np.ones_like(new_dxy[good_indices,0]), [new_xy[good_indices,1], new_xy[good_indices,0]]), im_shape).tocsr()\n\n        all_pts = np.c_[score_mat.nonzero()];\n        all_pts = all_pts[:,[1,0]];\n        # Extract the dx and dy values, re-estimate the ep vector\n        dxy = np.array(np.c_[dx_mat[all_pts[:,1], all_pts[:,0]].transpose(), \n                             dy_mat[all_pts[:,1], all_pts[:,0]].transpose()])\n        C   = np.array(score_mat[all_pts[:,1], all_pts[:,0]].transpose())\n\n        if options.epipolar_fltr and ep_vec_initial is not None:\n            ep_vec, dxy_ctr = est_epipolar_vec(dxy, C, corr_score_tolerance)\n\n        # Triangulate all the good points so far\n        tri     = spatial.Delaunay(all_pts)\n        pt_dict = make_pt_2_neighbors(tri)\n        # Zero out points for which delta(disparity)/delta(dist) is too large\n        # - ie, delete points with too rapid rate of disparity change.\n        dxy_score, min_dxy_slope = neighborhood_range(range(all_pts.shape[0]), dx_mat, dy_mat, tri, pt_dict, calc_min_slope=True)\n        bad_indices = np.max(min_dxy_slope, axis=1) > dxy_slope_tol\n        \n        if options.Debug:\n            print(\"---deleting %d points that failed the d(disparity)/d(dist) test\" % np.sum(bad_indices))\n            \n        if (bad_indices is not None) and np.any(bad_indices):\n            # ???\n            score_mat    = score_mat.tolil()\n            score_mat[all_pts[bad_indices,1], all_pts[bad_indices,0]] = 0\n            score_mat    = score_mat.tocsr()\n            bad_mask_mat = bad_mask_mat + coo_matrix((4*np.ones_like(all_pts[bad_indices,1]), \n                                                      (all_pts[bad_indices,1], all_pts[bad_indices,0])), shape=im_shape).tocsr()\n\n            all_pts   = np.c_[score_mat.nonzero()]\n            all_pts   = all_pts[:,[1,0]];\n            tri       = spatial.Delaunay(all_pts)\n            pt_dict   = make_pt_2_neighbors(tri)\n            dxy_score = neighborhood_range(range(all_pts.shape[0]), dx_mat, dy_mat, tri, pt_dict)\n\n\n        # Don't refine if we're on the last value of the refinement list\n        if delta_x == skip_vals[-1]:\n            continue\n            \n        test_pts  = np.arange(0, all_pts.shape[0])\n        # Test the new points and their neighbors for convergence\n        to_refine = np.logical_or(((dxy_score[:,OFFSET_MAX_X]-dxy_score[:,OFFSET_MIN_X]) > options.refine_tol), \n                                  ((dxy_score[:,OFFSET_MAX_Y]-dxy_score[:,OFFSET_MIN_Y]) > options.refine_tol))\n        indices_to_refine = test_pts [to_refine]\n        dxy_score         = dxy_score[to_refine,:]\n        # N.B.  we can often end up refining more points than we searched on the\n        # last round, because points from previous rounds can get marked for refinement\n        print(\"    found %d points to refine\" %  len(indices_to_refine))\n\n    # END LOOP through pixel skip sizes\n\n    if recalc_neighborhood_range:\n        all_pts   = np.c_[score_mat.nonzero()];\n        all_pts   = all_pts[:,[1,0]];\n        dxy_score = neighborhood_range(range(all_pts.shape[0]), dx_mat, dy_mat, tri, pt_dict)\n\n    # Delete the 1% of matches with the greatest disparity range\n    R_dx = dxy_score[:,OFFSET_MAX_X]-dxy_score[:,OFFSET_MIN_X]\n    R_dy = dxy_score[:,OFFSET_MAX_Y]-dxy_score[:,OFFSET_MIN_Y]\n\n    R_dx_mat     = coo_matrix((R_dx, [all_pts[:,1], all_pts[:,0]]), im_shape).tocsr()\n    R_dy_mat     = coo_matrix((R_dy, [all_pts[:,1], all_pts[:,0]]), im_shape).tocsr()\n    R_dxy_score  = neighborhood_range(range(all_pts.shape[0]), R_dx_mat, R_dy_mat, tri, pt_dict)\n    P99          = (np.percentile(R_dxy_score[:,OFFSET_MIN_X], 99), \n                    np.percentile(R_dxy_score[:,OFFSET_MIN_Y], 99))\n    R_max        = np.maximum(P99,   options.R_lim_min)\n    R_max        = np.minimum(R_max, options.R_limax_disp_range)\n    bad_xy       = all_pts[np.logical_or((R_dxy_score[:,OFFSET_MIN_X] > R_max[0]),  \n                                         (R_dxy_score[:,OFFSET_MIN_Y] > R_max[1])),:]\n    bad_mask_mat = bad_mask_mat + coo_matrix((8*np.ones_like(bad_xy[:,1]), (bad_xy[:,1], bad_xy[:,0])), shape=im_shape).tocsr()\n    if options.Debug:\n        print(\"rejecting %d detected outliers using the minimum-disparity-difference test with R_max = %f, %f\" \n              % (bad_xy.shape[0], R_max[0], R_max[1]))\n        \n    # Delete the bad value, convert dx dy, and C to lil matrices\n    score_mat = score_mat.tolil()\n    dx_mat    = dx_mat.tolil()\n    dy_mat    = dy_mat.tolil()\n    for bad in bad_xy:\n        dx_mat   [bad[1], bad[0]] = 0\n        dy_mat   [bad[1], bad[0]] = 0\n        score_mat[bad[1], bad[0]] = 0\n    score_mat = score_mat.tocsr()\n    dx_mat    = dx_mat.tocsr()\n    dy_mat    = dy_mat.tocsr()\n    all_pts   = np.c_[score_mat.nonzero()];\n    all_pts   = all_pts[:,[1,0]];\n    if len(all_pts) == 0:\n        print('No points remaining after outlier rejection!')\n        return -1\n    \n    # Triangulate all the good points so far\n    tri       = spatial.Delaunay(all_pts)\n    pt_dict   = make_pt_2_neighbors(tri)\n\n    # Check the score for output, ignore differences for points separated by more than 2*coarse skip\n    dxy_score = neighborhood_range(range(all_pts.shape[0]), dx_mat, dy_mat, tri, pt_dict, max_dist= 2.*options.coarse_skip)\n    R_dx      = dxy_score[:,OFFSET_MAX_X]-dxy_score[:,OFFSET_MIN_X]\n    R_dy      = dxy_score[:,OFFSET_MAX_Y]-dxy_score[:,OFFSET_MIN_Y]\n\n    print(\"--------output stats------\")\n    for pct in (99, 95, 90, 84):\n        P = (pct, np.percentile(R_dx, pct), np.percentile(R_dy, pct))\n        print(\"%dth percetiles (rx,ry) = (%5.2f %5.2f)\" % P)\n\n    dx = dx_mat   [all_pts[:,1], all_pts[:,0]].transpose()\n    dy = dy_mat   [all_pts[:,1], all_pts[:,0]].transpose()\n    C  = score_mat[all_pts[:,1], all_pts[:,0]].transpose()\n\n    # transform the pixel centers to map coordinates\n    geotransform = matcher.search_geotransform\n    driver       = matcher.T_ds.GetDriver()\n    projection   = matcher.T_ds.GetProjection()\n    xy           = np.c_[geotransform[0]+all_pts[:,0]*geotransform[1]+all_pts[:,1]*geotransform[2], \n                         geotransform[3]+all_pts[:,0]*geotransform[4]+all_pts[:,1]*geotransform[5]]\n    out          = np.c_[xy, dx , dy , C, dxy_score[:,OFFSET_MAX_X]-dxy_score[:,OFFSET_MIN_X]+options.output_pad, \n                                          dxy_score[:,OFFSET_MAX_Y]-dxy_score[:,OFFSET_MIN_Y]+options.output_pad]\n    # spit out the good and bad masks\n    good_xy = np.c_[score_mat.nonzero()][:,[1, 0]]\n    good_xy = np.c_[geotransform[0]+good_xy[:,0]*geotransform[1]+good_xy[:,1]*geotransform[2], \n                    geotransform[3]+good_xy[:,0]*geotransform[4]+good_xy[:,1]*geotransform[5]]\n    bad_xy  = np.c_[bad_mask_mat.nonzero()][:,[1, 0]]\n    if np.min(bad_xy.shape) > 0:\n        bad_flag = bad_mask_mat[bad_xy[:,1], bad_xy[:,0]]\n        bad_xy   = np.c_[geotransform[0]+bad_xy[:,0]*geotransform[1]+bad_xy[:,1]*geotransform[2], \n                         geotransform[3]+bad_xy[:,0]*geotransform[4]+bad_xy[:,1]*geotransform[5]]\n    else:\n        bad_flag = None\n        bad_xy   = None\n    # cleanup memory before gridding starts\n    pt_dict    = None\n    tri        = None\n    dx         = None\n    dy         = None\n    dx_mat     = None\n    dy_mat     = None\n    R_dx_mat   = None\n    R_dy_mat   = None\n    xy         = None\n    matcher    = None\n    C          = None\n    indices_to_refine = None\n\n    if options.Debug:\n        print(\"--- Debug enabled-----\")\n        print(\" writing csv file: %s\" % output_prefix+'.csv')\n        outfile=open(output_prefix+'.csv','w')\n        outfile.write('%x, y, dx, dy, C, R_dx, R_dy\\n')\n        for line in out:\n            outfile.write(\"%7.0f, %7.0f, %7.0f, %7.0f, %4.2f, %7.0f, %7.0f\\n\" %  tuple(x for x in line.tolist()[0]))\n        outfile.close\n        print(\" writing bad points to file: %s\" % output_prefix+'_bad_pts.csv')\n        print(\" bad matches are flagged:\")\n        print(\"  1: failed signal strength test\")\n        print(\"  2: failed epipolar test\")\n        print(\"  4: failed d(disparity)/d(dist) test\")\n        print(\"  8: failed the total-delta-disparity test\")\n        print(\"-----\")\n        outfile = open(output_prefix+'_bad_pts.csv', 'w')\n        outfile.write('%x, y, flag\\n')\n        if bad_flag is not None:\n            out_bad = np.c_[bad_xy[:,0], bad_xy[:,1], bad_flag.transpose()]\n            for line in out_bad:\n                outfile.write(\"%7.2f, %7.2f, %3d\\n\" %  tuple(x for x in line.tolist()[0]))\n        outfile.close\n        out_bad  = None\n        bad_flag = None\n    # END IF (if options.Debug)\n\n    if options.output_scale > 0.:\n        out = out/options.output_scale\n        # scale x, y, and C back up by output_scale\n        for col in [0, 1, 4]:\n            out[:,col] = out[:,col]*options.output_scale\n        delta_x = options.output_scale*np.abs(geotransform[1])\n        x0      = geotransform[0]\n        y0      = geotransform[3]\n        x0      = delta_x*(np.ceil(x0/delta_x))\n        y0      = delta_x*(np.ceil(y0/delta_x))\n        Gdx     = geotransform[1]*options.output_scale\n        Gdy     = geotransform[5]*options.output_scale\n\n        GT1    = np.array(geotransform)\n        GT1[0] = x0;\n        GT1[3] = y0;\n        GT1[1] = Gdx\n        GT1[5] = Gdy\n        nx1    = int(im_shape[1]/options.output_scale)\n        ny1    = int(im_shape[0]/options.output_scale)\n        xg     = (np.arange(0, nx1)+0.5)*Gdx+x0\n        yg     = (np.arange(0, ny1)+0.5)*Gdy+y0\n        disp_file   = output_prefix + '-D_sub.tif'\n        spread_file = output_prefix + '-D_sub_spread.tif'\n        dispDs      = driver.Create(disp_file,   nx1, ny1, 3, gdalconst.GDT_Int32)\n        spreadDs    = driver.Create(spread_file, nx1, ny1, 3, gdalconst.GDT_Int32)\n        # interpolate the scaled dx and dy values\n        OutBlocksize = 1024\n        c0_out       = np.arange(0, xg.shape[0], OutBlocksize)\n        r0_out       = np.arange(0, yg.shape[0], OutBlocksize)\n        grid_pad     = options.fill_dist*2\n        for c0 in c0_out:\n            for r0 in r0_out:\n                if options.Debug:\n                    print(\"     gridding output for col %d out of %d, row %d out of %d\" % \n                          (int(c0/OutBlocksize)+1, int(c0_out[-1]/OutBlocksize)+1, \n                           int(r0/OutBlocksize)+1, int(r0_out[-1]/OutBlocksize)+1))\n                cols = np.arange(c0, np.minimum(c0+OutBlocksize, len(xg)))\n                rows = np.arange(r0, np.minimum(r0+OutBlocksize, len(yg)))\n                if (len(rows)==0) | (len(cols)==0):\n                    continue\n                [xg_sub, yg_sub] = np.meshgrid(xg[cols], yg[rows])\n                XR_out = np.array([np.amin(xg[cols])-grid_pad, np.amax(xg[cols])+grid_pad])\n                YR_out = np.array([np.amin(yg[rows])-grid_pad, np.amax(yg[rows])+grid_pad])\n                cr_out = [cols[0], rows[0]]\n                # make a 1-d array to populate with the truth values we'll use to select data points\n                ii     = np.zeros(out.shape[0]).astype('bool')  \n                ii[:] = ((out[:,0] > XR_out[0]) & (out[:,0] < XR_out[1]) & \n                         (out[:,1] > YR_out[0]) & (out[:,1] < YR_out[1])).ravel()\n                if np.sum(ii) < 4:\n                    continue\n                if options.Debug:\n                    print(\" ...based on %d points\" % np.sum(ii))\n                if (np.amax(out[ii,0])-np.amin(out[ii,0]) > 0) and (np.amax(out[ii,1])-np.amin(out[ii,1]) > 0 ) :\n                    grid_disp(xg_sub, yg_sub, out[ii,0:2], out[ii,2], out[ii,3], out[ii,5], out[ii,6], \n                              options.fill_dist, int(search_range_x), dispDs, spreadDs, options.output_scale, cr_out)\n\n        for Ds in (dispDs, spreadDs):\n            Ds.SetGeoTransform(tuple(GT1))\n            Ds.SetProjection(projection)\n        spreadDs = None\n        dispDs   = None\n    # END IF (if options.output_scale > 0.)\n\n    print(\"End: \" + str(datetime.datetime.now()))\n\nif __name__==\"__main__\":\n    main()\n"
  },
  {
    "path": "src/asp/Tools/stereo",
    "content": "#!/usr/bin/env python\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\nfrom __future__ import print_function\nimport sys, argparse, subprocess, re, os\nimport os.path as P\n\n# The path to the ASP python files\nbasepath    = os.path.abspath(sys.path[0])\npythonpath  = os.path.abspath(basepath + '/../Python')  # for dev ASP\nlibexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP\nsys.path.insert(0, basepath) # prepend to Python path\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\n\nfrom asp_stereo_utils import * # must be after the path is altered above\n\nimport asp_system_utils, asp_cmd_utils\nasp_system_utils.verify_python_version_is_supported()\n\n# Prepend to system PATH\nos.environ[\"PATH\"] = libexecpath + os.pathsep + os.environ[\"PATH\"]\n\nif __name__ == '__main__':\n\n    usage = '''stereo [options] <images> [<cameras>] <output_prefix> [DEM]\n        Extensions are automatically added to the output files.\n        Camera model arguments may be optional for some stereo\n        session types (e.g. isis). Stereo parameters should be\n        set in the stereo.default file.\\n''' + asp_system_utils.get_asp_version()\n\n    p = argparse.ArgumentParser(usage=usage)\n    p.add_argument('-t', '--session-type',   dest='session',\n                 help='Select the stereo session type to use for processing. Usually the program can select this automatically by the file extension, except for xml cameras. See the doc for options.')\n    p.add_argument('-s', '--stereo-file',    dest='stereo_file',    default='./stereo.default',\n                 help='Explicitly specify the stereo.default file to use. Default: ./stereo.default.')\n    p.add_argument('--corr-seed-mode',    dest='seed_mode', default=None,\n                 help='Correlation seed strategy. See stereo_corr for options.', type=int)\n    p.add_argument('-e', '--entry-point',    dest='entry_point', default=0,\n                 help='Pipeline entry point (an integer from 0-5)', type=int)\n    p.add_argument('--stop-point',           dest='stop_point',  default=6,\n                 help='Stereo Pipeline stop point (an integer from 1-6).',\n                 type=int)\n    p.add_argument('--sparse-disp-options', dest='sparse_disp_options',\n                 help='Options to pass directly to sparse_disp.')\n\n    p.add_argument('--threads',              dest='threads', default=0, type=int,\n                 help='Set the number of threads to use. 0 means use as many threads as there are cores.')\n    p.add_argument('--no-bigtiff',           dest='no_bigtiff',  default=False, action='store_true',\n                 help='Tell GDAL to not create bigtiffs.')\n\n    p.add_argument('--tif-compress',   dest='tif_compress', default = 'LZW',\n                 help='TIFF compression method. Options: None, LZW, Deflate, Packbits. Default: LZW.')\n\n    p.add_argument('-v', '--version',        dest='version',     default=False, action='store_true',\n                 help='Display the version of software.')\n\n    # This must not be used in production. Will not work on the mac. A temporary undocumented\n    # thing.\n    p.add_argument('--check-mem-usage',   dest='mem_usage',     default=False, action='store_true',\n                 help='Check stereo_corr run time and memory usage.')\n\n    # Debug options\n    p.add_argument('--dry-run',              dest='dryrun',      default=False, action='store_true',\n                 help=argparse.SUPPRESS)\n    p.add_argument('--verbose',                dest='verbose', default=False, action='store_true',\n                 help=argparse.SUPPRESS)\n\n    global opt\n    (opt, args) = p.parse_known_args()\n    args=asp_cmd_utils.unescape_vals(args) # to do: somehow, merge into the above call\n\n    if opt.version:\n        asp_system_utils.print_version_and_exit()\n\n    if not args and not opt.version:\n        p.print_help()\n        asp_system_utils.raise_error('Missing input files', code=2)\n\n    if opt.threads == 0:\n        opt.threads = asp_system_utils.get_num_cpus()\n    args.extend(['--threads', str(opt.threads)])\n\n    # If corr-seed-mode was not specified, read it from the file\n    if opt.seed_mode is None:\n        opt.seed_mode = parse_corr_seed_mode(opt.stereo_file)\n    # If not set in the file either, use 1.\n    if opt.seed_mode is None:\n        opt.seed_mode = 1\n    # Pass it to the subprocesses\n    args.extend(['--corr-seed-mode', str(opt.seed_mode)])\n\n    # Pass to sub-processes other stereo options. We wanted these\n    # set in this Python script so that they show up in the help message.\n    if opt.session is not None:\n        args.extend(['--session-type', opt.session])\n    if opt.stereo_file is not None and os.path.exists(opt.stereo_file):\n        args.extend(['--stereo-file', opt.stereo_file])\n\n    if opt.no_bigtiff:\n        args.append('--no-bigtiff')\n    if opt.tif_compress is not None and opt.tif_compress != \"LZW\":\n        # If it is LZW then don't pass it, as that is the default\n        args.extend(['--tif-compress', opt.tif_compress])\n\n    # Run stereo_parse with these options, to get the values of some\n    # internal fields.\n    sep = \",\"\n    settings = run_and_parse_output(\"stereo_parse\", args, sep, opt.verbose)\n\n    alg = stereo_alg_to_num(settings['stereo_algorithm'][0])\n    using_tiles = (alg > VW_CORRELATION_BM or \\\n                   settings['alignment_method'][0] == 'local_epipolar')\n    \n    if using_tiles:\n        raise Exception(\"Alignment method 'local_epipolar' and/or other algorithms \" +\n                        \"except ASP_BM can be used only with parallel_stereo.\")\n\n    try:\n\n        # These can be stray options if pasting the stereo command\n        # from a log file where these particular operations\n        # happened, and they will result in the overall stereo\n        # command misbehaving. They are needed only at a certain stage.\n        asp_cmd_utils.wipe_option(args, '--compute-low-res-disparity-only', 0)\n        asp_cmd_utils.wipe_option(args, '--compute-point-cloud-center-only', 0)\n\n        # Invoke itself for multiview if appropriate\n        num_pairs = int(settings['num_stereo_pairs'][0])\n        if num_pairs > 1 and opt.entry_point < Step.tri:\n            extra_args = []\n            run_multiview(__file__, args, extra_args, opt.entry_point,\n                          opt.stop_point, opt.verbose, settings)\n            sys.exit(0)\n\n        # Pre-processing\n        step = Step.pprc\n        if (opt.entry_point <= step):\n            if (opt.stop_point <= step): sys.exit()\n            stereo_run('stereo_pprc', args, opt, msg='%d: Preprocessing' % step)\n\n        # Correlation\n        step = Step.corr\n        if (opt.entry_point <= step):\n            if (opt.stop_point <= step): sys.exit()\n\n            if (opt.seed_mode == 0):\n                # No low resolution seed, go straight to full resolution correlation\n                stereo_run('stereo_corr', args, opt, msg='%d: Correlation' % step)           \n            else:\n                # Do low-res correlation, this happens just once.\n                calc_lowres_disp(args, opt, sep)\n\n                # Run full-resolution stereo correlation\n                args.extend(['--skip-low-res-disparity-comp'])\n                stereo_run('stereo_corr', args, opt, msg='%d: Correlation' % step)\n                # Low-res disparity is done, so wipe that option\n                asp_cmd_utils.wipe_option(args, '--skip-low-res-disparity-comp', 0)\n\n        # Note that blending is not done, as with stereo the only\n        # supported algorithm is block-matching, which does not use\n        # separately stored tiles which may need blending.\n        \n        # Refinement\n        step = Step.rfne\n        if (opt.entry_point <= step):\n            if (opt.stop_point <= step): sys.exit()\n            stereo_run('stereo_rfne', args, opt, msg='%d: Refinement' % step)\n\n        # Filtering\n        step = Step.fltr\n        if (opt.entry_point <= step):\n            if (opt.stop_point <= step): sys.exit()\n            stereo_run('stereo_fltr', args, opt, msg='%d: Filtering' % step)\n\n        # Triangulation\n        step = Step.tri\n        if (opt.entry_point <= step):\n            if (opt.stop_point <= step):\n                sys.exit()\n\n            if int(settings['correlator_mode'][0]) != 0 and \\\n                '--num-matches-from-disparity' not in args and \\\n                '--num-matches-from-disp-triplets' not in args:\n                print(\"Skipping triangulation with --correlator-mode.\")\n                sys.exit()\n                \n            stereo_run('stereo_tri',  args, opt, msg='%d: Triangulation' % step)\n            \n    except Exception as e:\n            asp_system_utils.raise_error(e)\n"
  },
  {
    "path": "src/asp/Tools/stereo.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file stereo.cc\n\n#include <asp/Sessions/StereoSessionFactory.h>\n#include <asp/Camera/CameraErrorPropagation.h>\n#include <asp/Core/FileUtils.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/Bathymetry.h>\n#include <asp/Core/AspStringUtils.h>\n#include <asp/Core/AspProgramOptions.h>\n#include <asp/Core/AspLog.h>\n#include <asp/Core/StereoSettingsParse.h>\n#include <asp/Core/IpMatchingAlgs.h>\n#include <asp/Core/StereoTiling.h>\n#include <asp/Core/ImageUtils.h>\n#include <asp/Tools/stereo.h>\n#include <asp/asp_config.h> // defines ASP_HAVE_PKG_ISIS\n\n// Support for ISIS image files\n#if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1\n#include <asp/IsisIO/DiskImageResourceIsis.h>\n#endif\n\n#include <vw/Cartography/PointImageManipulation.h>\n#include <vw/Cartography/GeoTransform.h>\n#include <vw/Cartography/GeoReferenceUtils.h>\n#include <vw/Stereo/StereoView.h>\n#include <vw/Stereo/CorrelationView.h>\n#include <vw/Stereo/CostFunctions.h>\n#include <vw/Stereo/DisparityMap.h>\n#include <vw/FileIO/MatrixIO.h>\n#include <vw/FileIO/DiskImageUtils.h>\n#include <vw/FileIO/FileTypes.h>\n#include <vw/FileIO/FileUtils.h>\n#include <vw/InterestPoint/MatcherIO.h>\n\nusing namespace vw;\nusing namespace vw::cartography;\n\nnamespace asp {\n\n// Transform the crop window to be in reference to L.tif. When --left-image-crop-win\n// is set, different logic is used, which may need to be integrated here.\nBBox2i transformed_crop_win(ASPGlobalOptions const& opt) {\n\n  bool crop_left  = (stereo_settings().left_image_crop_win  != BBox2i(0, 0, 0, 0));\n  if (crop_left)\n    vw::vw_throw(ArgumentErr() << \"Function transformed_crop_win() \"\n               << \"should not be called with --left-image-crop-win.\\n\");\n\n  BBox2i b;\n  boost::shared_ptr<vw::DiskImageResource> rsrc =\n          vw::DiskImageResourcePtr(opt.in_file1);\n  DiskImageView<PixelGray<float>> left_image(rsrc);\n  BBox2i full_box = bounding_box(left_image);\n\n  if (fs::exists(opt.out_prefix+\"-L.tif\")) {\n    DiskImageView<PixelGray<float>> L_img(opt.out_prefix+\"-L.tif\");\n    b = bounding_box(L_img);\n  } else {\n    b = full_box; // To not have an empty box\n  }\n\n  return b;\n}\n\n// Parse data needed for error propagation\nvoid setup_error_propagation(ASPGlobalOptions const& opt) {\n\n  // A bugfix for the propagated errors not being saved with enough digits\n  if (stereo_settings().point_cloud_rounding_error > 0) {\n    vw_out(WarningMessage) << \"Option --point-cloud-rounding-error is set to \" <<\n      stereo_settings().point_cloud_rounding_error << \" meters. If too coarse, \"\n      \"it may create artifacts in the propagated horizontal and vertical errors.\\n\";\n  } else {\n      stereo_settings().point_cloud_rounding_error = 1.0e-8;\n      vw_out() << \"Round triangulated points to \"\n                << stereo_settings().point_cloud_rounding_error << \" meters. \"\n                << \"(Option: --point-cloud-rounding-error.) \"\n                << \"This is much finer rounding than usual, motivated by the \"\n                << \"fact that the propagated errors vary slowly and will be \"\n                << \"saved with step artifacts otherwise.\\n\";\n  }\n\n  vw::Vector2 & v = asp::stereo_settings().horizontal_stddev; // alias, will modify\n  bool message_printed = false; // will print the message only once\n  if (v[0] == 0 && v[1] == 0) {\n    // This will not reload the cameras\n    boost::shared_ptr<camera::CameraModel> camera_model1, camera_model2;\n    opt.session->camera_models(camera_model1, camera_model2);\n    v[0] = asp::horizontalStDevFromCamera(camera_model1, message_printed);\n    v[1] = asp::horizontalStDevFromCamera(camera_model2, message_printed);\n  }\n\n  asp::horizontalStdDevCheck(v, opt.session->name());\n}\n\n// Save some info that will be useful for peeking at a run\nvoid saveRunInfo(ASPGlobalOptions const& opt,\n                 std::vector<std::string> const& images,\n                 std::vector<std::string> const& cameras,\n                 std::string const& input_dem) {\n\n  std::string info_file = opt.out_prefix + \"-info.txt\";\n  std::ofstream ostr(info_file.c_str());\n  if (!ostr.good())\n    vw_throw(ArgumentErr() << \"Failed to open: \" << info_file << \"\\n\");\n\n  // Print the images\n  ostr << \"images: \";\n  for (int i = 0; i < (int)images.size(); i++)\n    ostr << images[i] << \" \";\n  ostr << \"\\n\";\n\n  // Print the cameras\n  ostr << \"cameras: \";\n  for (int i = 0; i < (int)cameras.size(); i++)\n    ostr << cameras[i] << \" \";\n  ostr << \"\\n\";\n\n  // Print the DEM\n  ostr << \"input_dem: \" << input_dem << \"\\n\";\n\n  // Print the output prefix\n  ostr << \"output_prefix: \" << opt.out_prefix << \"\\n\";\n\n  // Print the alignment method\n  ostr << \"alignment_method: \" << stereo_settings().alignment_method << \"\\n\";\n\n  // Print the stereo session\n  ostr << \"stereo_session: \" << opt.stereo_session << \"\\n\";\n\n  // Print proj-win if set, otherwise print left/right crop windows\n  auto p = stereo_settings().proj_win;\n  bool has_proj_win = (p != BBox2(0, 0, 0, 0));\n  if (has_proj_win) {\n    // For proj-win, interpret as: minx miny maxx maxy (not width/height)\n    ostr << \"proj_win: \" << p.min().x() << \" \" << p.min().y() << \" \"\n         << p.max().x() << \" \" << p.max().y() << \"\\n\";\n  } else {\n    // Print left-image-crop-win\n    auto l = stereo_settings().left_image_crop_win;\n    ostr << \"left_image_crop_win: \" << l.min().x() << \" \" << l.min().y() << \" \"\n        << l.width() << \" \" << l.height() << \"\\n\";\n\n    // Print right-image-crop-win\n    auto r = stereo_settings().right_image_crop_win;\n    ostr << \"right_image_crop_win: \" << r.min().x() << \" \" << r.min().y() << \" \"\n        << r.width() << \" \" << r.height() << \"\\n\";\n  }\n}\n\n// See if user's request to skip image normalization can be\n// satisfied.  This option is a speedup switch which is only meant\n// to work with with mapprojected images. It is also not documented.\nbool skip_image_normalization(ASPGlobalOptions const& opt) {\n\n  if (!stereo_settings().skip_image_normalization)\n    return false;\n\n  bool crop_left  = (stereo_settings().left_image_crop_win  != BBox2i(0, 0, 0, 0));\n  bool crop_right = (stereo_settings().right_image_crop_win != BBox2i(0, 0, 0, 0));\n\n  // Respect user's choice for skipping the normalization of the input\n  // images, if feasible.\n  bool is_good = (!crop_left && !crop_right                    &&\n                  stereo_settings().alignment_method == \"none\" &&\n                  stereo_settings().cost_mode == 2             &&\n                  !asp::doBathy(asp::stereo_settings())        &&\n                  vw::has_tif_or_ntf_extension(opt.in_file1)   &&\n                  vw::has_tif_or_ntf_extension(opt.in_file2));\n\n  if (!is_good)\n    vw_throw(ArgumentErr()\n              << \"Cannot skip image normalization unless there is no alignment, \"\n              << \"no use of --left-image-crop-win and --right-image-crop-win, \"\n              << \"no bathymetry, --cost-mode is set to 2, and the input images have \"\n              << \".tif or .ntf extension.\");\n\n  return is_good;\n} // End function skip_image_normalization\n\n// Convert, for example, 'asp_mgm' to '2'. For ASP algorithms we\n// use the numbers 0 (BM), 1 (SGM), 2 (MGM), 3 (Final MGM).  For\n// external algorithms will have to examine closer the algorithm\n// string. This function has a Python analog in parallel_stereo.\nvw::stereo::CorrelationAlgorithm stereo_alg_to_num(std::string alg) {\n\n  // Make it lowercase first\n  boost::to_lower(alg);\n\n  // Sanity check\n  if (alg == \"\")\n    vw_throw(ArgumentErr() << \"No stereo algorithm was specified.\\n\");\n\n  if (alg.rfind(\"0\", 0) == 0 || alg.rfind(\"asp_bm\", 0) == 0)\n    return vw::stereo::VW_CORRELATION_BM;\n\n  if (alg.rfind(\"1\", 0) == 0 || alg.rfind(\"asp_sgm\", 0) == 0)\n    return vw::stereo::VW_CORRELATION_SGM;\n\n  if (alg.rfind(\"2\", 0) == 0 || alg.rfind(\"asp_mgm\", 0) == 0)\n    return vw::stereo::VW_CORRELATION_MGM;\n\n  if (alg.rfind(\"3\", 0) == 0 || alg.rfind(\"asp_final_mgm\", 0) == 0)\n    return vw::stereo::VW_CORRELATION_FINAL_MGM;\n\n  // Sanity check. Any numerical values except 0, 1, 2, 3 are not accepted.\n  int num = atof(alg.c_str());\n  if (num < 0 || num > 3)\n    vw_throw(ArgumentErr() << \"Unknown algorithm: \" << alg << \".\\n\");\n\n  // An external stereo algorithm\n  return vw::stereo::VW_CORRELATION_OTHER;\n}\n\n// Find the median angle in degrees at which rays emanating from\n// matching points meet\nvoid estimate_convergence_angle(ASPGlobalOptions const& opt) {\n\n  if (stereo_settings().correlator_mode)\n    return; // No camera can be assumed, hence no convergence angle.\n\n  // When having matches between L and R, need to do things a bit differently.\n  bool have_aligned_matches = (stereo_settings().alignment_method == \"none\" ||\n                               stereo_settings().alignment_method == \"epipolar\");\n\n  bool crop_left  = (stereo_settings().left_image_crop_win  != BBox2i(0, 0, 0, 0));\n  bool crop_right = (stereo_settings().right_image_crop_win != BBox2i(0, 0, 0, 0));\n  std::string match_filename;\n  bool matches_as_txt = stereo_settings().matches_as_txt;\n  if (have_aligned_matches)\n    match_filename = vw::ip::match_filename(opt.out_prefix, \"L.tif\", \"R.tif\",\n                                            matches_as_txt);\n  else\n    match_filename = asp::stereoMatchFile(opt.session->left_cropped_image(crop_left),\n                                          opt.session->right_cropped_image(crop_right),\n                                          opt.out_prefix, matches_as_txt);\n  // The interest points must exist by now. But be tolerant of failure, as\n  // this functionality is not critical.\n  if (!fs::exists(match_filename)) {\n    vw::vw_out(vw::WarningMessage)\n      << \"Cannot estimate the convergence angle, as cannot find the match file: \"\n      << match_filename << \".\\n\";\n    return;\n  }\n\n  std::vector<ip::InterestPoint> left_ip, right_ip;\n  ip::read_match_file(match_filename, left_ip, right_ip, stereo_settings().matches_as_txt);\n\n  if (have_aligned_matches) {\n    // Create the transforms ahead of time for clarity. When these are created\n    // as part of unalign_ip() arguments, the creation order seems in reverse.\n    auto left_tx = opt.session->tx_left();\n    auto right_tx = opt.session->tx_right();\n\n    // Unalign the interest point matches\n    std::vector<vw::ip::InterestPoint> unaligned_left_ip, unaligned_right_ip;\n    asp::unalign_ip(left_tx, right_tx, left_ip, right_ip,\n                    unaligned_left_ip, unaligned_right_ip);\n    left_ip  = unaligned_left_ip;\n    right_ip = unaligned_right_ip;\n  }\n\n  std::vector<double> sorted_angles;\n  boost::shared_ptr<camera::CameraModel> left_cam, right_cam;\n  opt.session->camera_models(left_cam, right_cam);\n  asp::convergence_angles(left_cam.get(), right_cam.get(), left_ip, right_ip, sorted_angles);\n\n  if (sorted_angles.empty()) {\n    vw_out(vw::WarningMessage) << \"Could not compute the stereo convergence angle.\\n\";\n    return;\n  }\n\n  int len = sorted_angles.size();\n  vw_out() << \"Convergence angle percentiles (in degrees) based on interest point matches:\\n\";\n  vw_out() << \"\\t\"\n           << \"25% \" << sorted_angles[0.25*len] << \", \"\n           << \"50% \" << sorted_angles[0.50*len] << \", \"\n           << \"75% \" << sorted_angles[0.75*len] << \".\\n\";\n\n   if (sorted_angles[0.50*len] < 5.0)\n      vw_out(vw::WarningMessage)\n        << \"The stereo convergence angle is: \" << sorted_angles[0.50*len] << \" degrees. \"\n        << \"This is quite low and may result in an empty or unreliable point cloud. \"\n        << \"Reduce --min-triangulation-angle to triangulate with very small angles.\\n\";\n}\n\n// Set up options for stereo. This will be used in a couple of places.\nvoid configStereoOpts(ASPGlobalOptions& opt,\n                      po::options_description const& additional_options,\n                      po::options_description& general_options,\n                      po::options_description& all_general_options,\n                      po::options_description& positional_options,\n                      po::positional_options_description& positional_desc) {\n\n  // Add options whose values are stored in ASPGlobalOptions rather than in stereo_settings()\n  po::options_description general_options_sub(\"\");\n  addAspGlobalOptions(general_options_sub, opt);\n\n  // Populate general_options (specific to the current tool)\n  general_options.add(general_options_sub);\n  general_options.add(additional_options);\n  general_options.add(vw::GdalWriteOptionsDescription(opt));\n\n  // Populate all_general_options (parsing fallback)\n  all_general_options.add(general_options_sub);\n  all_general_options.add(generate_config_file_options(opt));\n\n  // Populate positional options\n  positional_options.add_options()\n    (\"input-files\", po::value<std::vector<std::string>>(), \"Input files\");\n\n  positional_desc.add(\"input-files\", -1);\n}\n\n// Parse the command line arguments. Extract in a vector all the options and\n// their values, so everything apart from standalone files not associated with\n// options. This approach does not get confused by a file showing up both as a\n// value to an option and later as a standalone file. This is needed for later\n// reconstructing the command line with subsets of the input files, such when as\n// going from a multiview command to multiple pairwise commands.\nvoid parseStereoOptsVals(int argc, char *argv[],\n                         po::options_description const& additional_options,\n                         std::vector<std::string> & opts_and_vals) {\n\n  // Wipe the output\n  opts_and_vals.clear();\n\n  // We set up the option descriptions locally just to aid the parser\n  // in distinguishing flags from positional files.\n  po::options_description general_options(\"\");\n  po::options_description all_general_options(\"\");\n  po::options_description positional_options(\"\");\n  po::positional_options_description positional_desc;\n  ASPGlobalOptions local_opt;\n\n  // Configure the descriptions using your helper function\n  configStereoOpts(local_opt, additional_options, general_options, all_general_options,\n                   positional_options, positional_desc);\n\n  // Parse the command line\n  try {\n    po::options_description all_options;\n    all_options.add(all_general_options).add(positional_options);\n\n    // Pass positional_desc to the parser so it knows which args are positional\n    po::parsed_options parsed =\n      po::command_line_parser(argc, argv)\n        .options(all_options)\n        .positional(positional_desc)\n        .style(po::command_line_style::unix_style)\n        .run();\n\n    // Populate opts_and_vals\n    for (auto const& opt: parsed.options) {\n      // Position_key is -1 for named options, >= 0 for positional args (files)\n      if (opt.position_key == -1) {\n        opts_and_vals.insert(opts_and_vals.end(),\n                             opt.original_tokens.begin(),\n                             opt.original_tokens.end());\n      }\n    }\n\n  } catch (po::error const& e) {\n    // The main parser will catch errors, so this one can be silent.\n  }\n}\n\n// Handle the arguments for the multiview case. It creates multiple pairwise\n// invocations of stereo.\nvoid parseMultiviewHelper(int argc, char* argv[],\n                          int num_pairs,\n                          std::vector<std::string> const& files,\n                          std::vector<std::string> const& images,\n                          std::vector<std::string> const& cameras,\n                          std::string const& output_prefix,\n                          std::string const& input_dem,\n                          po::options_description const& additional_options,\n                          bool verbose, bool exit_early,\n                          // Outputs\n                          std::string & usage,\n                          std::vector<ASPGlobalOptions> & opt_vec) {\n\n  //  Parse all the options and their values, stored in a vector, to be \n  // used later for pairwise stereo. It skips the standalone input files.\n  std::vector<std::string> opts_vals;\n  parseStereoOptsVals(argc, argv, additional_options, opts_vals);\n\n  // Must signal to the children runs that they are part of a multiview run\n  std::string opt_str = \"--part-of-multiview-run\";\n  auto it = find(opts_vals.begin(), opts_vals.end(), opt_str);\n  if (it == opts_vals.end())\n    opts_vals.push_back(opt_str);\n\n  // Multiview is very picky about alignment method\n  if (stereo_settings().alignment_method != \"none\" &&\n      stereo_settings().alignment_method != \"homography\") {\n\n    std::string new_alignment;\n    if (input_dem == \"\")\n      new_alignment = \"homography\";\n    else\n      new_alignment = \"none\";\n\n    vw_out(WarningMessage)\n      << \"For multi-view stereo, only alignment method of 'none' or 'homography' \"\n      << \"is supported. Changing alignment method from '\"\n      << stereo_settings().alignment_method << \"' to '\" << new_alignment << \"'.\\n\";\n    stereo_settings().alignment_method = new_alignment;\n\n    // Set this for future pairwise runs as well\n    std::string align_opt = \"--alignment-method\";\n    auto it = std::find(opts_vals.begin(), opts_vals.end(), align_opt);\n    if (it != opts_vals.end() && it + 1 != opts_vals.end()) {\n      // Modify existing alignment\n      *(it+1) = new_alignment;\n    } else {\n      // Set new alignment\n      opts_vals.push_back(align_opt);\n      opts_vals.push_back(new_alignment);\n    }\n  }\n\n  // Generate the stereo command for each of the pairs made up of the first\n  // image and each subsequent image, with corresponding cameras.\n  opt_vec.resize(num_pairs);\n  std::string prog_name = extract_prog_name(argv[0]);\n  for (int p = 1; p <= num_pairs; p++) {\n\n    std::vector<std::string> cmd;\n    cmd.push_back(prog_name);\n\n    // The command line options go first\n    for (int t = 0; t < (int)opts_vals.size(); t++)\n      cmd.push_back(opts_vals[t]);\n\n    cmd.push_back(images[0]); // left image\n    cmd.push_back(images[p]); // right image\n\n    if (!cameras.empty()) {\n      // Don't append the camera names if they are the same as the image names\n      if ((images[0] != cameras[0]) && (images[p] != cameras[p])) {\n        cmd.push_back(cameras[0]); // left camera\n        cmd.push_back(cameras[p]); // right camera\n      }\n    }\n\n    // Need to have a separate output prefix for each pair\n    std::string local_prefix = output_prefix;\n    std::ostringstream os;\n    os << local_prefix << \"-pair\" << p << \"/\" << p;\n    local_prefix = os.str();\n    cmd.push_back(local_prefix);\n    if (!input_dem.empty())\n      cmd.push_back(input_dem);\n\n    // Create a local argc and argv for the given stereo pair and parse them.\n    int largc = cmd.size();\n    std::vector<char*> largv;\n    for (int t = 0; t < largc; t++)\n      largv.push_back((char*)cmd[t].c_str());\n    bool is_multiview = false; // single image and camera pair\n    std::vector<std::string> local_files;\n    bool override_out_prefix = false;\n    parseStereoHelper(largc, &largv[0], opt_vec[p-1], additional_options,\n                     is_multiview, override_out_prefix, local_files, usage, exit_early);\n\n    if (verbose) {\n      // Needed for stereo_parse\n      int big = 10000; // helps keep things in order in the python script\n      vw_out() << \"multiview_command_\" << big + p << \",\";\n      for (int t = 0; t < largc-1; t++)\n        vw_out() << cmd[t] << \",\";\n      if (largc > 0)\n        vw_out() << cmd[largc-1];\n      vw_out() << \"\\n\";\n    }\n\n  } // end loop through pairs\n\n  // Sanity checks specific to multiview\n\n  if (stereo_settings().propagate_errors)\n    vw::vw_throw(vw::ArgumentErr() << \"Error propagation is not \"\n                  << \"implemented for more than two images.\\n\");\n\n  if (prog_name != \"stereo_parse\" &&\n      prog_name != \"stereo_tri\" && prog_name != \"stereo_gui\")\n    vw_throw(ArgumentErr() << \"The executable \" << prog_name\n              << \" is not meant to be used directly with more than two images. Use \"\n              << \"instead the stereo/parallel_stereo scripts with desired entry points.\\n\");\n\n  // This must happen after StereoSession is initialized\n  if (asp::doBathy(asp::stereo_settings()))\n    vw_throw(ArgumentErr() << \"Bathymetry correction does not work with \"\n              << \"multiview stereo.\\n\");\n\n  return;\n}\n\n/// Parse the list of files and output prefix specified as positional arguments\n/// on the command line. Hence, parse the arguments that are not passed to options.\n// The format is:  <N image paths> [N camera model paths] <output prefix> [input DEM path]\nbool parseStereoFiles(bool override_out_prefix,\n                      std::vector<std::string> const &filesIn,\n                      std::vector<std::string>       &imageFiles,\n                      std::vector<std::string>       &camFiles,\n                      std::string                    &outPrefix,\n                      std::string                    &inputDem) {\n\n  // Init outputs\n  imageFiles.clear();\n  camFiles.clear();\n  outPrefix = \"\";\n  inputDem = \"\";\n\n  // Find the input DEM, if any\n  std::vector<std::string> files = filesIn; // Make a local copy to work with\n  std::string input_dem;\n  bool has_georef = false;\n  try{ // Just try to load the last file path as a dem\n    cartography::GeoReference georef;\n    has_georef = read_georeference(georef, files.back());\n  } catch (...) {}\n\n  if (has_georef) { // I guess it worked\n    inputDem = files.back();\n    files.pop_back();\n  } else { // We tried to load the prefix, there is no dem.\n    inputDem = \"\";\n  }\n  if (files.size() < 3) {\n    vw_throw(ArgumentErr() << \"Expecting at least three inputs to stereo.\\n\");\n    return false;\n  }\n\n  // Handle --dem option vs positional DEM. The --dem option is easier to use\n  // and will hopefully become the standard. \n  std::string optDem = asp::stereo_settings().dem;\n  if (!inputDem.empty() && !optDem.empty()) {\n    // Both are set, check if they are the same\n    if (!fs::equivalent(fs::path(inputDem), fs::path(optDem)))\n      vw_throw(ArgumentErr() << \"Cannot specify both a positional DEM and --dem \"\n               << \"with different values.\\n\");\n  } else if (inputDem.empty() && !optDem.empty()) {\n    // Only --dem is set, use it\n    inputDem = optDem;\n  }\n\n  // Find the output prefix\n  outPrefix = files.back(); // the dem, if present, was already popped off the back.\n  files.pop_back();\n\n  // parallel_stereo must be able to run with a tile output prefix. That program\n  // does not understand all the stereo options, so, it delegates to the\n  // underlying stereo executables to do this switch. Invoke this only\n  // if is_multiview is true, to do the replacement of the prefix just once.\n  // Do not do it later again, when the processing is per each stereo pair.\n  if (asp::stereo_settings().output_prefix_override != \"\" && override_out_prefix)\n    outPrefix = asp::stereo_settings().output_prefix_override;\n\n  // An output prefix cannot be an image or a camera\n  if (vw::has_image_extension(outPrefix) || vw::has_cam_extension(outPrefix) ||\n      outPrefix == \"\")\n    vw_throw(ArgumentErr() << \"Invalid output prefix: \" << outPrefix << \".\\n\");\n\n  // The output prefix must not exist as a file\n  if (fs::exists(outPrefix))\n      vw_out(WarningMessage)\n        << \"It appears that the output prefix exists as a file: \"\n        << outPrefix << \". Perhaps this was not intended.\\n\";\n\n  // Now there are N images and possibly N camera paths\n  bool ensure_equal_sizes = false;\n  asp::separate_images_from_cameras(files, imageFiles, camFiles, ensure_equal_sizes);\n\n  return true;\n}\n\n// If --trans-crop-win is in the input arguments, this is means that we are running\n// stereo for a tile\nbool is_tile_run(int argc, char* argv[]) {\n  for (int s = 1; s < argc; s++) {\n    if (std::string(argv[s]) == \"--trans-crop-win\")\n      return true;\n  }\n\n  return false;\n}\n\n// Convert the crop windows from (minx, miny, width, height) to (minx, miny,\n// maxx, maxy) format in any case. Handle proj_win conversion to crop windows for\n// mapprojected images.\nvoid handleCropWins(ASPGlobalOptions const& opt) {\n  \n  // Handle proj_win for mapprojected images\n  BBox2 proj_win = stereo_settings().proj_win; // local copy\n  bool use_proj_win = (proj_win != BBox2(0, 0, 0, 0));\n  if (use_proj_win) {\n    \n    // Check that input_dem is set\n    if (opt.input_dem.empty())\n      vw_throw(ArgumentErr() << \"The option --proj-win requires mapprojected images and \"\n                << \"an input DEM.\\n\");\n    \n    // Check that left or right crop win are not set\n    if (stereo_settings().left_image_crop_win != BBox2(0, 0, 0, 0) ||\n        stereo_settings().right_image_crop_win != BBox2(0, 0, 0, 0))\n      vw_throw(ArgumentErr() << \"Cannot use --proj-win together with \"\n                << \"--left-image-crop-win or --right-image-crop-win.\\n\");\n    \n    // Swap min and max if need be as some tools use (minx, maxy, maxx, miny)\n    if (proj_win.min().y() > proj_win.max().y())\n      std::swap(proj_win.min().y(), proj_win.max().y());\n    if (proj_win.min().x() > proj_win.max().x())\n      std::swap(proj_win.min().x(), proj_win.max().x());\n    \n    // Read georef from left and right images\n    GeoReference left_georef, right_georef;\n    bool has_left_georef = vw::cartography::read_georeference(left_georef, opt.in_file1);\n    bool has_right_georef = vw::cartography::read_georeference(right_georef, opt.in_file2);\n    if (!has_left_georef || !has_right_georef)\n      vw_throw(ArgumentErr() \n               << \"Cannot use --proj-win: input images must be georeferenced.\\n\");\n    \n    // Convert projection window to pixel coordinates for left and right images\n    stereo_settings().left_image_crop_win = left_georef.point_to_pixel_bbox(proj_win);\n    stereo_settings().right_image_crop_win = right_georef.point_to_pixel_bbox(proj_win);\n    \n  } else {\n\n    // There are two crop win boxes, in respect to original left image, named\n    // left_image_crop_win, and in respect to the transformed left image\n    // (L.tif), named trans_crop_win. We use the second if available, otherwise\n    // we transform and use the first. The box trans_crop_win is for internal\n    // use, invoked from parallel_stereo.\n\n    // Interpret the last two coordinates of the crop win boxes as\n    // width and height rather than max_x and max_y. This is needed because\n    // boost reads them as max_x and max_y but stores them in BBox2 constructor\n    // which expects width and height.\n    BBox2i bl = stereo_settings().left_image_crop_win;\n    BBox2i br = stereo_settings().right_image_crop_win;\n    stereo_settings().left_image_crop_win\n      = BBox2i(bl.min().x(), bl.min().y(), bl.max().x(), bl.max().y());\n    stereo_settings().right_image_crop_win\n      = BBox2i(br.min().x(), br.min().y(), br.max().x(), br.max().y());\n  }\n  \n  // This needs handling in either case. See the else block above for more info.\n  BBox2i bt = stereo_settings().trans_crop_win;\n  stereo_settings().trans_crop_win\n    = BBox2i(bt.min().x(), bt.min().y(), bt.max().x(), bt.max().y());\n}\n\n// If a stereo program is invoked as:\n// prog <images> <cameras> <output-prefix> [<input_dem>] <other options>\n// with the number of images n >= 2, create n-1 individual\n// ASPGlobalOptions entries, corresponding to n-1 stereo pairs between the\n// first image and each of the subsequent images.\n// TODO(oalexan1): The logic here is convoluted. parseStereoHelper() is called\n// multiple times: once initially to extract files, then again for each stereo\n// pair (1 time for single stereo, or n-1 times for multiview with n images).\n// This redundant parsing and argv reconstruction should be refactored.\nvoid parseStereoArgs(int argc, char* argv[],\n                     boost::program_options::options_description const&\n                     additional_options,\n                     bool verbose,\n                     std::string & output_prefix,\n                     std::vector<ASPGlobalOptions> & opt_vec,\n                     bool exit_early) {\n\n  // First reset the outputs\n  output_prefix.clear();\n  opt_vec.clear();\n\n  // Extract the images/cameras/output prefix, and perhaps the input DEM\n  std::vector<std::string> files;\n  bool is_multiview = true;\n  ASPGlobalOptions opt;\n  std::string usage;\n  bool override_out_prefix = true;\n  parseStereoHelper(argc, argv, opt, additional_options,\n                    is_multiview, override_out_prefix, files, usage, exit_early);\n\n  // Need this for the GUI, ensure that opt_vec is never empty, even on failures\n  opt_vec.push_back(opt);\n\n  if (files.size() < 3)\n    vw_throw(ArgumentErr() << \"Missing the input files and/or output prefix.\\n\");\n\n  // Add note on the alignment method. If done in parseStereoHelper, it will be\n  // printed twice.\n  if (stereo_settings().correlator_mode)\n    vw_out() << \"Running in correlator mode. The alignment method is: \"\n             << stereo_settings().alignment_method << \".\\n\";\n\n  // Extract all the positional elements\n  std::vector<std::string> images, cameras;\n  std::string input_dem;\n  if (!parseStereoFiles(override_out_prefix, files, images, cameras,\n                        output_prefix, input_dem))\n    vw_throw(ArgumentErr() << \"Missing the input files and/or output prefix.\\n\");\n\n  int num_pairs = (int)images.size() - 1;\n  if (num_pairs <= 0)\n    vw_throw(ArgumentErr() << \"Insufficient number of images provided.\\n\");\n\n  // Needed for stereo_parse\n  if (verbose)\n    vw_out() << \"num_stereo_pairs,\" << num_pairs << \"\\n\";\n\n  if (num_pairs == 1) {\n    bool is_multiview = false, override_out_prefix = true;\n    parseStereoHelper(argc, argv, opt_vec[0], additional_options,\n                      is_multiview, override_out_prefix, files, usage, exit_early);\n  } else {\n    parseMultiviewHelper(argc, argv, num_pairs, files, images, cameras, output_prefix, \n                         input_dem, additional_options, verbose, exit_early, usage,\n                         opt_vec); // output\n  }\n\n  // For each stereo command not in a tile, print the run info\n  if (!is_tile_run(argc, argv))\n    saveRunInfo(opt_vec[0], images, cameras, input_dem);\n\n  return;\n}\n\n// Parse input command line arguments\nvoid parseStereoHelper(int argc, char *argv[], ASPGlobalOptions& opt,\n                       boost::program_options::options_description const&\n                       additional_options,\n                       bool is_multiview, bool override_out_prefix,\n                       std::vector<std::string> & input_files,\n                       std::string & usage, bool exit_early) {\n\n  // Configure the stereo options\n  po::options_description general_options(\"\");\n  po::options_description all_general_options(\"\");\n  po::options_description positional_options(\"\");\n  po::positional_options_description positional_desc;\n  configStereoOpts(opt, additional_options, general_options, all_general_options,\n                   positional_options, positional_desc);\n\n  usage =\n   \"[options] <images> [<cameras>] <output_prefix> [DEM]\\n\"\n   \"  Extensions are automatically added to the output files.\\n\"\n   \"  Camera model arguments may be optional for some stereo session types (e.g., isis).\\n\"\n   \"  Stereo parameters should be set in the stereo.default file.\";\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm = asp::check_command_line(argc, argv, opt, general_options,\n                                                 all_general_options, positional_options,\n                                                 positional_desc, usage,\n                                                 allow_unregistered, unregistered);\n\n  // Read the config file\n  try {\n    // The user can specify the positional input from the\n    // stereo.default if they want to.\n    po::options_description cfg_options;\n    cfg_options.add(positional_options);\n    cfg_options.add(generate_config_file_options(opt));\n\n    // Append the options from the config file to vm. The Boost documentation\n    // says that an option already stored will not be changed. So, the settings\n    // in the config files will not overwrite the ones already set on the\n    // command line.\n    bool print_warnings = is_multiview; // print warnings just first time\n    po::store(parse_asp_config_file(print_warnings,\n                                    opt.stereo_default_filename,\n                                    cfg_options), vm);\n    po::notify(vm);\n  } catch (po::error const& e) {\n    vw::vw_throw(vw::ArgumentErr()\n                  << \"Error parsing configuration file:\\n\" << e.what() << \"\\n\");\n  }\n\n  // This must happen early\n  boost::to_lower(opt.stereo_session);\n  asp::stereo_settings().validate();\n\n  if (stereo_settings().correlator_mode) {\n    // Images are assumed aligned, unless alignment is explicitly requested.\n    if (vm[\"alignment-method\"].defaulted())\n      stereo_settings().alignment_method = \"none\";\n    opt.stereo_session = \"rpc\";  // since inputs are images this seems simpler\n    if (stereo_settings().propagate_errors)\n      vw::vw_throw(vw::ArgumentErr() << \"Cannot propagate errors in correlator mode.\\n\");\n  }\n\n  // Make sure that algorithm 0 is same as asp_bm, etc.\n  boost::to_lower(stereo_settings().stereo_algorithm);\n  if (stereo_settings().stereo_algorithm == \"0\")\n    stereo_settings().stereo_algorithm = \"asp_bm\";\n  else if (stereo_settings().stereo_algorithm == \"1\")\n    stereo_settings().stereo_algorithm = \"asp_sgm\";\n  else if (stereo_settings().stereo_algorithm == \"2\")\n    stereo_settings().stereo_algorithm = \"asp_mgm\";\n  else if (stereo_settings().stereo_algorithm == \"3\")\n    stereo_settings().stereo_algorithm = \"asp_final_mgm\";\n\n  // Add the options to the usage\n  std::ostringstream os;\n  os << usage << general_options;\n  usage = os.str();\n\n  // When called with no arguments, print the help message.\n  if (vm.count(\"input-files\") == 0)\n    vw_throw(ArgumentErr() << \"Missing input arguments.\\n\"\n      << usage << general_options);\n  input_files = vm[\"input-files\"].as<std::vector<std::string>>();\n\n  // For multiview, just store the files and return. Must happen after logging\n  // starts, as logging for multiview is done in subdirectories. In multiview\n  // mode, the logic further down will be later called for each pair.\n  if (is_multiview)\n    return;\n\n  // Re-use the logic in parseStereoFiles, but just for two images/cameras.\n  std::vector<std::string> images, cameras;\n  if (!parseStereoFiles(override_out_prefix, input_files, // inputs\n                        images, cameras, opt.out_prefix, opt.input_dem)) // outputs\n    vw_throw(ArgumentErr() << \"Missing the input files and/or output prefix.\\n\");\n  if (images.size() >= 1)\n    opt.in_file1 = images[0];\n  if (images.size() >= 2)\n    opt.in_file2 = images[1];\n  if (cameras.size() >= 1)\n    opt.cam_file1 = cameras[0];\n  if (cameras.size() >= 2)\n    opt.cam_file2 = cameras[1];\n  if (opt.in_file1.empty() || opt.in_file2.empty() || opt.out_prefix.empty())\n    vw_throw(ArgumentErr() << \"Missing the input files and/or output prefix.\\n\");\n\n  // Create the output directory\n  vw::create_out_dir(opt.out_prefix);\n\n  // Turn on logging to file, except for stereo_parse, as that one is called\n  // all the time.\n  std::string prog_name = extract_prog_name(argv[0]);\n  if (prog_name.find(\"stereo_parse\") == std::string::npos)\n    asp::log_to_file(argc, argv, opt.stereo_default_filename, opt.out_prefix);\n\n  // Handle crop wins and proj_win conversion\n  handleCropWins(opt);\n  \n  // Handle the crop wins for distributed stereo mode. This must be after the\n  // crop wins are adjusted for the regular stereo mode.\n  if (asp::stereo_settings().stereo_dist_mode) {\n    handleDistCropWins(opt.in_file1, opt.in_file2,\n                       stereo_settings().sgm_collar_size,\n                       stereo_settings().left_image_crop_win,\n                       stereo_settings().right_image_crop_win);\n    // Reset trans_crop_win in case user set it by mistake; it's not used in dist mode\n    stereo_settings().trans_crop_win = BBox2i(0, 0, 0, 0);\n  }\n\n  // Ensure the crop windows are always contained in the images.\n  boost::shared_ptr<vw::DiskImageResource> left_resource, right_resource;\n  left_resource  = vw::DiskImageResourcePtr(opt.in_file1);\n  right_resource = vw::DiskImageResourcePtr(opt.in_file2);\n\n  // For multi-band images, this will only read the first band. This is enough\n  // for now as we do only bounding box checks. During stereo preprocessing, the\n  // images will be opened again and the correct band will be used.\n  DiskImageView<float> left_image(left_resource);\n  DiskImageView<float> right_image(right_resource);\n  stereo_settings().left_image_crop_win.crop (bounding_box(left_image));\n  stereo_settings().right_image_crop_win.crop(bounding_box(right_image));\n\n  bool crop_left  = (stereo_settings().left_image_crop_win  != BBox2i(0, 0, 0, 0));\n  bool crop_right = (stereo_settings().right_image_crop_win != BBox2i(0, 0, 0, 0));\n\n  // If crops were specified, check that they are valid.\n  if (crop_left && stereo_settings().left_image_crop_win.empty())\n    vw_throw(ArgumentErr() << \"Invalid left crop window specified!\\n\");\n  if (crop_right && stereo_settings().right_image_crop_win.empty())\n    vw_throw(ArgumentErr() << \"Invalid right crop window specified!\\n\");\n\n  // Make sure the trans_crop_win value is correct going forwards.\n  if (!crop_left) {\n    // The crop window after transforming the left image via\n    // affine epipolar or homography alignment.\n    if (stereo_settings().trans_crop_win == BBox2i(0, 0, 0, 0))\n      stereo_settings().trans_crop_win = transformed_crop_win(opt);\n\n    // Intersect with L.tif which is the transformed and processed left image.\n    if (fs::exists(opt.out_prefix+\"-L.tif\")) {\n      DiskImageView<PixelGray<float>> L_img(opt.out_prefix+\"-L.tif\");\n      stereo_settings().trans_crop_win.crop(bounding_box(L_img));\n    }\n  } else {\n    // If left_image_crop_win is specified, as can be see in\n    // StereoSession::preprocessing_hook(), we actually\n    // physically crop the image.  The trans_crop_win as passed\n    // here from parallel_stereo will already be a tile in the\n    // cropped image. So we just use it as it is. If it is not defined,\n    // we set it to the entire cropped image.\n    if (stereo_settings().trans_crop_win == BBox2i(0, 0, 0, 0)) {\n      stereo_settings().trans_crop_win = bounding_box(left_image);\n      if (fs::exists(opt.out_prefix+\"-L.tif\")) {\n        DiskImageView<PixelGray<float>> L_img(opt.out_prefix+\"-L.tif\");\n        stereo_settings().trans_crop_win = bounding_box(L_img);\n      }\n    }\n  } // End crop checking case\n\n  // If not using crop wins but the crop image exists, then things won't go well.\n  if (!crop_left && !crop_right &&\n      (fs::exists(opt.out_prefix+\"-L-cropped.tif\") ||\n        fs::exists(opt.out_prefix+\"-R-cropped.tif\")))\n    vw_throw(ArgumentErr() << \"The current output prefix '\" << opt.out_prefix\n              << \"' has an old run which used --left-image-crop-win or \"\n              << \"--proj-win, but the current run does not. Results will be \"\n              << \"incorrect. Use a new output prefix.\");\n\n  // TODO: May need to update this check for individual crop cases.\n  // Sanity check. Don't run it if we have L-cropped.tif or R-cropped.tif,\n  // in that case we have ran the gui before, and the sizes of the subimages\n  // could be anything. We'll regenerate any of those anyway soon.\n  if ((stereo_settings().trans_crop_win.width () <= 0 ||\n        stereo_settings().trans_crop_win.height() <= 0) &&\n      !fs::exists(opt.out_prefix+\"-L-cropped.tif\")     &&\n      !fs::exists(opt.out_prefix+\"-R-cropped.tif\")) {\n    vw_throw(ArgumentErr() << \"Invalid region for doing stereo.\\n\\n\");\n  }\n\n  // For time being the crop wins are not taken into account when\n  // matches are produced from disparity, and the results are wrong.\n  // Therefore, disable this.\n  if ((crop_left || crop_right) &&\n      (stereo_settings().num_matches_from_disparity > 0 ||\n       stereo_settings().num_matches_from_disp_triplets > 0))\n    vw_throw(ArgumentErr() << \"Cannot use --num-matches-from-disparity or \"\n              << \"--num-matches-from-disp-triplets with --left-image-crop-win, \"\n              << \"--right-image-crop-win, or --proj-win. The alternative is to \"\n              << \"manually crop the left and right images while keeping the \"\n              << \"upper-left corner. Otherwise the results would be incorrect.\\n\");\n\n  // This does not work because tx_left() and tx_right() return the identity for\n  // this alignment method. See StereoSessionPinhole::tx_left() for more\n  // details.\n  if (asp::stereo_settings().alignment_method == \"epipolar\" &&\n      (stereo_settings().num_matches_from_disparity > 0 ||\n       stereo_settings().num_matches_from_disp_triplets > 0))\n    vw_throw(ArgumentErr() << \"Cannot use --num-matches-from-disparity or \"\n              << \"--num-matches-from-disp-triplets with epipolar alignment.\\n\");\n\n  // Cannot have both matches from disparity and triplets\n  if (stereo_settings().num_matches_from_disparity > 0 &&\n      stereo_settings().num_matches_from_disp_triplets > 0)\n    vw_throw(ArgumentErr() << \"Cannot have both --num-matches-from-disparity and \"\n              << \"--num-matches-from-disp-triplets.\\n\");\n\n  // In the latest ASP always create triplets\n  if (stereo_settings().num_matches_from_disparity > 0) {\n    vw::vw_out(vw::WarningMessage)\n      << \"The option --num-matches-from-disparity is equivalent to \"\n      << \"--num-matches-from-disp-triplets.\\n\";\n    stereo_settings().num_matches_from_disp_triplets\n      = stereo_settings().num_matches_from_disparity;\n   stereo_settings().num_matches_from_disparity = 0;\n  }\n\n  // Ensure good order\n  BBox2 & b = stereo_settings().lon_lat_limit; // alias\n  if (b != BBox2(0,0,0,0)) {\n    if (b.min().y() > b.max().y())\n      std::swap(b.min().y(), b.max().y());\n    if (b.min().x() > b.max().x())\n      std::swap(b.min().x(), b.max().x());\n  }\n\n  if (!stereo_settings().match_files_prefix.empty() &&\n      !stereo_settings().clean_match_files_prefix.empty())\n    vw_throw(ArgumentErr() << \"Cannot specify both --match-files-prefix and \"\n              << \"--clean-match-files-prefix.\\n\");\n\n  if (!stereo_settings().corr_search_limit.empty() && stereo_settings().max_disp_spread > 0)\n    vw_throw(ArgumentErr() << \"Cannot specify both --corr-search-limit and \"\n              << \"--max-disp-spread.\\n\");\n\n  // Get number of bands in input images\n  int num_left_bands = vw::get_num_channels(opt.in_file1);\n  int num_right_bands = vw::get_num_channels(opt.in_file2);\n\n  // Verify that there is only one channel per input image\n  if (asp::skip_image_normalization(opt) &&\n    (num_left_bands > 1 || num_right_bands > 1))\n    vw_throw(ArgumentErr()\n             << \"Error: Cannot skip image normalization if the input images \"\n             << \"have more than one band (channel).\\n\\n\");\n\n  // Print a warning if more than one band exists and the band was not set.\n  if (stereo_settings().band == -1 &&\n      (num_left_bands > 1 || num_right_bands > 1)) {\n    vw_out(WarningMessage) << \"The input images have more than one band (channel), \"\n                            << \"but the --band option was not set. Using band 1.\\n\";\n    stereo_settings().band = 1;\n  }\n\n  // Having printed the warning, set the band to 1 if it was not set.\n  if (stereo_settings().band == -1)\n    stereo_settings().band = 1;\n\n  // Sanity check\n  if (stereo_settings().band <= 0 ||\n      stereo_settings().band > num_left_bands ||\n      stereo_settings().band > num_right_bands)\n    vw_throw(ArgumentErr() << \"The value of --band is out of range.\\n\");\n\n  if ((stereo_settings().bundle_adjust_prefix != \"\") &&\n      (stereo_settings().alignment_method == \"epipolar\"))\n    vw_throw(ArgumentErr() << \"Error: Epipolar alignment does not support using a \"\n              << \"bundle adjust prefix.\\n\");\n\n  // Replace normal default values with these when SGM is enabled.\n  // - TODO: Move these somewhere easier to find!\n  const int SGM_DEFAULT_SUBPIXEL_MODE        = 12; // Blend\n  const int SGM_DEFAULT_COST_MODE            = 4;\n  const int SGM_DEFAULT_KERNELSIZE           = 5;\n  const int SGM_DEFAULT_RM_CLEANUP_PASSES    = 0;\n  const int SGM_DEFAULT_MEDIAN_FILTER_SIZE   = 3;\n  const int SGM_DEFAULT_TEXTURE_SMOOTH_SIZE  = 11;\n  const double SGM_DEFAULT_TEXTURE_SMOOTH_SCALE = 0.13;\n\n  // Increase the timeout for MGM, unless specified, as that one is slow.\n  // Need some care here, to make sure that even if the parent function is called\n  // twice, the increase happens just once.\n  if (stereo_settings().stereo_algorithm == \"mgm\" &&\n      stereo_settings().corr_timeout == stereo_settings().default_corr_timeout) {\n      stereo_settings().corr_timeout = 10 * stereo_settings().default_corr_timeout;\n    vw_out() << \"For the original mgm algorithm increasing the --corr-timeout to: \"\n             << stereo_settings().corr_timeout << \".\\n\";\n  }\n\n  // TODO: Modify SGM tile sizes?\n\n  vw::stereo::CorrelationAlgorithm stereo_alg\n    = asp::stereo_alg_to_num(stereo_settings().stereo_algorithm);\n\n  if (stereo_alg > vw::stereo::VW_CORRELATION_BM) {\n    // If these parameters were not specified by the user, override\n    // the normal default values.  Note that by setting\n    // subpixel_mode to SGM_DEFAULT_SUBPIXEL_MODE, we will do no\n    // further subpixel refinement than what all algorithms except\n    // ASP's block matching are intrinsically capable of.  if the\n    // user however explicitly specifies, for example,\n    // --subpixel-mode 3, that one will be used later on.\n    // TODO(oalexan1): Consider setting the default --subpixel-mode to 9\n    // with non-BM algorithms, as it results in nicer results.\n\n    // These are also useful with external algorithms, as the results are then\n    // smoother.\n    if (vm[\"rm-cleanup-passes\"].defaulted())\n      stereo_settings().rm_cleanup_passes = SGM_DEFAULT_RM_CLEANUP_PASSES;\n    if (vm[\"median-filter-size\"].defaulted())\n      stereo_settings().median_filter_size = SGM_DEFAULT_MEDIAN_FILTER_SIZE;\n    if (vm[\"texture-smooth-size\"].defaulted())\n      stereo_settings().disp_smooth_size = SGM_DEFAULT_TEXTURE_SMOOTH_SIZE;\n    if (vm[\"texture-smooth-scale\"].defaulted())\n      stereo_settings().disp_smooth_texture = SGM_DEFAULT_TEXTURE_SMOOTH_SCALE;\n    if (vm[\"subpixel-mode\"].defaulted())\n      stereo_settings().subpixel_mode = SGM_DEFAULT_SUBPIXEL_MODE;\n\n    // This is for the case when settings are read from stereo.default. Print\n    // some warnings.\n    if (stereo_settings().rm_cleanup_passes != SGM_DEFAULT_RM_CLEANUP_PASSES)\n      vw_out(WarningMessage) << \"When using a stereo algorithm rather than asp_bm, \"\n                              << \"the default suggested value for \"\n                              << \"rm-cleanup-passes is \"\n                              << SGM_DEFAULT_RM_CLEANUP_PASSES << \". \"\n                              << \"Got instead \" << stereo_settings().rm_cleanup_passes\n                              << \".\\n\";\n    if (stereo_settings().median_filter_size != SGM_DEFAULT_MEDIAN_FILTER_SIZE)\n      vw_out(WarningMessage) << \"When using a stereo algorithm rather than asp_bm, \"\n                              << \"the default suggested value for \"\n                              << \"median-filter-size is \"\n                              << SGM_DEFAULT_MEDIAN_FILTER_SIZE << \". \"\n                              << \"Got instead \" << stereo_settings().median_filter_size\n                              << \".\\n\";\n    if (stereo_settings().disp_smooth_size != SGM_DEFAULT_TEXTURE_SMOOTH_SIZE)\n      vw_out(WarningMessage) << \"When using a stereo algorithm rather than asp_bm, \"\n                              << \"the default suggested value for \"\n                              << \"texture-smooth-size is \"\n                              << SGM_DEFAULT_TEXTURE_SMOOTH_SIZE << \". \"\n                              << \"Got instead \" << stereo_settings().disp_smooth_size\n                              << \".\\n\";\n    if (stereo_settings().disp_smooth_texture != SGM_DEFAULT_TEXTURE_SMOOTH_SCALE)\n      vw_out(WarningMessage) << \"When using a stereo algorithm rather than asp_bm, \"\n                              << \"the default suggested value for \"\n                              << \"texture-smooth-scale is \"\n                              << SGM_DEFAULT_TEXTURE_SMOOTH_SCALE << \". \"\n                              << \"Got instead \" << stereo_settings().disp_smooth_texture\n                              << \".\\n\";\n  }\n\n  bool using_tiles = (stereo_alg > vw::stereo::VW_CORRELATION_BM ||\n                      stereo_settings().alignment_method == \"local_epipolar\");\n\n  // Settings for asp_mgm / asp_sgm. For external algorithms, the low-res\n  // disparity in stereo_corr will be created with asp_mgm, so override\n  // user's choice in that case.\n  if (stereo_alg > vw::stereo::VW_CORRELATION_BM) {\n\n    if (vm[\"cost-mode\"].defaulted() || stereo_alg >= vw::stereo::VW_CORRELATION_OTHER)\n      stereo_settings().cost_mode = SGM_DEFAULT_COST_MODE;\n    if (vm[\"corr-kernel\"].defaulted() || stereo_alg >= vw::stereo::VW_CORRELATION_OTHER)\n      stereo_settings().corr_kernel\n        = Vector2i(SGM_DEFAULT_KERNELSIZE, SGM_DEFAULT_KERNELSIZE);\n\n    // This is a fix for the user setting cost-mode in stereo.default, when\n    // it is not defaulted. Do not allow cost mode to be different than\n    // 3 or 4 for asp_sgm / asp_mgm, as it produced junk.\n    if (stereo_settings().cost_mode != 3 && stereo_settings().cost_mode != 4)\n      vw_throw(ArgumentErr() << \"When using the asp_sgm or asp_mgm \"\n              << \"stereo algorithm, cost-mode must be 3 or 4. \"\n              << \"Check your stereo.default or command-line options.\\n\");\n    // Also do not allow corr-kernel to be outside of [3, 9]\n    if (stereo_settings().corr_kernel[0] < 3 || stereo_settings().corr_kernel[0] > 9)\n      vw_throw(ArgumentErr() << \"For the asp_sgm / asp_mgm algorithm, \"\n        << \"the corr kernel size must be between 3 and 9 (inclusive). \"\n        << \"Check your stereo.default or command-line options.\\n\");\n  }\n\n  if (stereo_alg == vw::stereo::VW_CORRELATION_BM && stereo_settings().subpixel_mode > 6)\n    vw::vw_throw(vw::ArgumentErr() << \"Subpixel mode \" << stereo_settings().subpixel_mode\n              << \" is not supported with block matching. Use mode <= 6.\\n\");\n\n  if (!using_tiles && !stereo_settings().stereo_dist_mode) {\n    // No need for a collar when we are not using tiles.\n    stereo_settings().sgm_collar_size = 0;\n  }\n\n  if (stereo_alg >= vw::stereo::VW_CORRELATION_OTHER &&\n      stereo_settings().alignment_method != \"local_epipolar\") {\n    vw_throw(ArgumentErr() << \"External stereo algorithms can be \"\n              << \"used only with alignment method local_epipolar.\\n\");\n  }\n\n  if (exit_early)\n    return;\n\n  // The StereoSession call automatically determines the type of object to\n  // create from the input parameters. In correlator mode there are no cameras,\n  // so don't print the session.\n  bool allow_map_promote = true;\n  bool total_quiet = asp::stereo_settings().correlator_mode;\n  opt.session = asp::StereoSessionFactory::create(opt.stereo_session, // can change\n                                                  opt,\n                                                  opt.in_file1,   opt.in_file2,\n                                                  opt.cam_file1,  opt.cam_file2,\n                                                  opt.out_prefix, opt.input_dem,\n                                                  allow_map_promote, total_quiet);\n\n  // Load the cameras. They will be cached in the session.\n  boost::shared_ptr<camera::CameraModel> camera_model1, camera_model2;\n  opt.session->camera_models(camera_model1, camera_model2);\n\n  // Run a set of checks to make sure the settings are compatible.\n  validateStereoOptions(opt);\n\n  // This logic must happen after the cameras are loaded.\n  if (stereo_settings().propagate_errors)\n    setup_error_propagation(opt);\n\n  // The last thing we do before we get started is to copy the\n  // stereo.default settings over into the results directory so that\n  // we have a record of the most recent stereo.default that was used\n  // with this data set.\n  asp::stereo_settings().write_copy(argc, argv,\n                                    opt.stereo_default_filename,\n                                    opt.out_prefix + \"-stereo.default\");\n}\n\n// Register session types\nvoid stereo_register_sessions() {\n  // Register the Isis file handler with the Vision Workbench DiskImageResource system.\n#if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1\n  DiskImageResource::register_file_type(\".cub\",\n                                        DiskImageResourceIsis::type_static(),\n                                        &DiskImageResourceIsis::construct_open,\n                                        &DiskImageResourceIsis::construct_create);\n#endif\n}\n\n// Error checking for stereo\nvoid validateStereoOptions(ASPGlobalOptions const& opt) {\n\n  bool dem_provided = !opt.input_dem.empty();\n\n  vw::Vector2 heights = asp::stereo_settings().ortho_heights;\n  bool have_heights = (!std::isnan(heights[0]) && !std::isnan(heights[1]));\n  if (have_heights && dem_provided)\n    vw_throw(ArgumentErr()\n             << \"The option --ortho-heights expects no DEM as input argument.\\n\");\n\n  // We will work as if the images were mapprojected\n  if (have_heights)\n    dem_provided = true;\n\n  // Seed mode valid values\n  if (stereo_settings().seed_mode > 3)\n    vw_throw(ArgumentErr() << \"Invalid value for --corr-seed-mode: \"\n              << stereo_settings().seed_mode << \".\\n\");\n\n  if (stereo_settings().seed_mode == 2) {\n\n    if (stereo_settings().disparity_estimation_dem_error <= 0.0)\n      vw_throw(ArgumentErr()\n        << \"For --corr-seed-mode 2, the value of disparity-estimation-dem-error \"\n        << \"must be positive.\");\n\n    if (stereo_settings().disparity_estimation_dem.empty())\n      vw_throw(ArgumentErr()\n        << \"For --corr-seed-mode 2, must set --disparity-estimation-dem.\\n\");\n\n    if (stereo_settings().alignment_method == \"epipolar\")\n      vw_throw(ArgumentErr()\n        << \"For --corr-seed-mode 2, cannot use epipolar alignment.\\n\");\n  }\n\n  // Must use map-projected images if input DEM is provided\n  GeoReference georef1, georef2;\n  bool has_georef1 = vw::cartography::read_georeference(georef1, opt.in_file1);\n  bool has_georef2 = vw::cartography::read_georeference(georef2, opt.in_file2);\n  if (dem_provided && (!has_georef1 || !has_georef2)) {\n    vw_throw(ArgumentErr() << \"The images are not map-projected, \"\n              << \"cannot use the provided DEM: \" << opt.input_dem << \"\\n\");\n  }\n\n  // If the images are map-projected, they need to use the same projection.\n  if (dem_provided && georef1.get_wkt() != georef2.get_wkt())\n    vw_throw(ArgumentErr() << \"The left and right images must use the same projection.\\n\");\n\n  // Must check here for same resolution. This is an endless source of bugs.\n  if (dem_provided && !stereo_settings().allow_different_mapproject_gsd) {\n    auto M1 = georef1.transform();\n    auto M2 = georef2.transform();\n    // The diagonal terms of these must be equal.\n    double tol = 1e-10;\n    if (std::abs(M1(0, 0) - M2(0, 0)) > tol || std::abs(M1(1, 1) - M2(1, 1)) > tol)\n        vw::vw_throw(vw::ArgumentErr()\n               << \"The input mapprojected images must have the same ground resolution \"\n               << \"for best results. This can be overriden with the option \"\n               << \"--allow-different-mapproject-gsd, but is not recommended.\\n\");\n  }\n\n  // Read the mapprojection metadata to identify the DEM used. This is safe\n  // to call on any image; outputs stay empty if the metadata is absent.\n  bool corr_only = stereo_settings().correlator_mode;\n  std::string l_adj_key, l_img_key, l_cam_type_key, l_cam_file_key, l_dem_key;\n  std::string l_adj, l_img, l_cam_type, l_cam_file, l_dem_file;\n  std::string r_adj_key, r_img_key, r_cam_type_key, r_cam_file_key, r_dem_key;\n  std::string r_adj, r_img, r_cam_type, r_cam_file, r_dem_file;\n  if (has_georef1 && has_georef2 && !corr_only) {\n    asp::read_mapproj_header(opt.in_file1, l_adj_key, l_img_key,\n                             l_cam_type_key, l_cam_file_key, l_dem_key,\n                             l_adj, l_img, l_cam_type, l_cam_file, l_dem_file);\n    asp::read_mapproj_header(opt.in_file2, r_adj_key, r_img_key,\n                             r_cam_type_key, r_cam_file_key, r_dem_key,\n                             r_adj, r_img, r_cam_type, r_cam_file, r_dem_file);\n  }\n\n  // If the images are map-projected, we need an input DEM, as we use the ASP\n  // flow with map-projected images.\n  if (has_georef1 && has_georef2 && !dem_provided && !corr_only) {\n    if (!l_dem_file.empty() || !r_dem_file.empty())\n      vw_throw(ArgumentErr() << \"The input images appear to be mapprojected. \"\n                << \"Please provide a DEM.\\n\");\n\n    // Otherwise, just print a warning. Maybe the user got these from somewhere else.\n    vw_out(WarningMessage) << \"It appears that the input images are \"\n                            << \"map-projected. In that case a DEM needs to be \"\n                            << \"provided for stereo to give correct results.\\n\";\n  }\n\n  // Sanity check for .cub images produced with cam2map asp_map=true.\n  // These have the AspMapproject metadata group but no embedded camera model.\n  // RPC/DG .tif files also have DEM_FILE in their header but embed the camera\n  // coefficients, so this check is restricted to .cub inputs.\n  bool is_cub1 = (vw::get_extension(opt.in_file1) == \".cub\");\n  bool is_cub2 = (vw::get_extension(opt.in_file2) == \".cub\");\n  if (has_georef1 && has_georef2 && dem_provided && (is_cub1 || is_cub2) &&\n      (opt.cam_file1.empty() || opt.cam_file2.empty()) && !corr_only) {\n    if (!l_dem_file.empty() || !r_dem_file.empty())\n      vw_throw(ArgumentErr()\n               << \"The input .cub images were produced with cam2map asp_map=true \"\n               << \"and do not contain embedded camera models. Please provide \"\n               << \"the original camera files (unprojected .cub or .json ISD) \"\n               << \"as the 3rd and 4th arguments.\\n\");\n  }\n\n  // Check that if the user provided a dem that we are using a map projection method\n  if (dem_provided && !opt.session->isMapProjected() && !corr_only) {\n    vw_throw(ArgumentErr() << \"Cannot use map-projected images with a session of type: \"\n                            << opt.session->name() << \".\\n\");\n  }\n\n  // Validate proj_win option\n  bool use_proj_win = (stereo_settings().proj_win != BBox2i(0, 0, 0, 0));\n  if (use_proj_win && !dem_provided)\n    vw_throw(ArgumentErr() \n              << \"The option --proj-win can only be used with mapprojected images. \"\n              << \"Provide an input DEM.\\n\");\n\n  // No alignment must be set for map-projected images.\n  if (stereo_settings().alignment_method != \"none\" && dem_provided) {\n      stereo_settings().alignment_method  = \"none\";\n    vw_out(WarningMessage) << \"Changing the alignment method to 'none' \"\n                            << \"as the images are map-projected.\" << \"\\n\";\n  }\n\n  // Sanity check for distributed stereo mode\n  if (stereo_settings().stereo_dist_mode) {\n    if (asp::doBathy(stereo_settings()))\n      vw_throw(ArgumentErr() << \"Bathymetry correction is not supported in \"\n                << \"distributed stereo mode.\\n\");\n    if (stereo_settings().alignment_method != \"none\")\n      vw_throw(ArgumentErr() << \"In distributed stereo mode the alignment method \"\n                << \"must be 'none'.\\n\");\n    if (!opt.session->isMapProjected())\n      vw_throw(ArgumentErr() << \"In distributed stereo mode the session must be \"\n                << \"map-projected.\\n\");\n    if (stereo_settings().sgm_collar_size <= 0)\n      vw_throw(ArgumentErr() << \"In distributed stereo mode --sgm-collar-size \"\n                << \"must be positive.\\n\");\n    if (stereo_settings().proj_win != BBox2(0, 0, 0, 0))\n      vw_throw(ArgumentErr() << \"In distributed stereo mode --proj-win \"\n                << \"must not be set.\\n\");\n  }\n\n  if (stereo_settings().corr_kernel[0]%2 == 0 ||\n      stereo_settings().corr_kernel[1]%2 == 0) {\n    vw_throw(ArgumentErr() << \"The entries of corr-kernel must be odd numbers.\\n\");\n  }\n\n  if (stereo_settings().subpixel_kernel[0]%2 == 0 ||\n      stereo_settings().subpixel_kernel[1]%2 == 0) {\n    vw_throw(ArgumentErr() << \"The entries of subpixel-kernel must be odd numbers.\\n\");\n  }\n\n  // Check SGM-related settings\n\n  vw::stereo::CorrelationAlgorithm stereo_alg\n    = asp::stereo_alg_to_num(stereo_settings().stereo_algorithm);\n\n  // For external algorithms we will still use the MGM algorithm for low-res\n  // disparity, so cost mode of 3 and 4 is fine unless for regular block matching.\n  if (stereo_alg == vw::stereo::VW_CORRELATION_BM) {\n    if (stereo_settings().cost_mode == 3 || stereo_settings().cost_mode == 4)\n      vw_throw(ArgumentErr() << \"Cannot use the census transform with \"\n                << \"the ASP_BM block matching algorithm.\\n\");\n  }\n\n  if (stereo_settings().cost_mode > 4)\n    vw_throw(ArgumentErr() << \"Unknown value \" << stereo_settings().cost_mode\n              << \" for cost-mode.\\n\");\n\n  if (stereo_settings().min_triangulation_angle <= 0 &&\n      stereo_settings().min_triangulation_angle != -1) {\n    // This means the user modified it. Then it must be positive.\n    vw_throw(ArgumentErr() << \"The min triangulation angle must be positive.\\n\");\n  }\n  if (stereo_settings().min_triangulation_angle == -1) {\n    // This means that the user did not set it. Set it to 0.\n    // Deep inside StereoModel.cc it will be overwritten with some\n    // positive value.\n    // This is a bit awkward but is done so for backward compatibility.\n    stereo_settings().min_triangulation_angle = 0;\n  }\n\n  int num_images = 2;\n  asp::bathyChecks(opt.session->name(), asp::stereo_settings(), num_images);\n\n  // Need the percentage to be more than 50 as we look at the range [100 - pct, pct].\n  if (stereo_settings().outlier_removal_params[0] <= 50.0)\n    vw_throw(ArgumentErr()\n             << \"The --outlier-removal-params percentage must be more than 50.\\n\");\n  if (stereo_settings().outlier_removal_params[1] <= 0.0)\n    vw_throw(ArgumentErr() << \"The --outlier-removal-params factor must be positive.\\n\");\n\n  if (stereo_settings().save_lr_disp_diff) {\n\n    if (stereo_settings().xcorr_threshold < 0.0)\n      vw_throw(ArgumentErr() << \"Must have a non-negative value of --xcorr-threshold \"\n                << \"to be able to use --save-left-right-disparity-difference.\\n\");\n\n    if (stereo_alg >= vw::stereo::VW_CORRELATION_OTHER)\n      vw_throw(ArgumentErr() << \"Can use --save-left-right-disparity-difference \"\n                << \"only with stereo algorithms asp_bm, asp_sgm, asp_mgm, and \"\n                << \"asp_final_mgm.\\n\");\n  }\n\n  if (stereo_settings().propagate_errors && stereo_settings().compute_error_vector)\n    vw::vw_throw(vw::ArgumentErr() << \"Cannot use option --error-vector for computing \"\n                  << \"the triangulation error vector when propagating errors (covariances) \"\n                  << \"from cameras, as those are stored instead in \"\n                  << \"bands 5 and 6.\\n\");\n\n  // No cog\n  if (opt.cog)\n    vw_throw(ArgumentErr() << \"The --cog option is not supported for stereo programs, \"\n             << \"as these create only intermediate processing files.\\n\");\n\n  // Camera checks\n  if (!stereo_settings().correlator_mode) {\n    try {\n      // Note. Cameras are loaded just once, and repeated invocation of camera_models()\n      // will not reload them. Hence this check does not incur a performance hit\n      // due to loading of the cameras.\n      boost::shared_ptr<camera::CameraModel> camera_model1, camera_model2;\n      opt.session->camera_models(camera_model1, camera_model2);\n\n      Vector3 cam1_ctr = camera_model1->camera_center(Vector2());\n      Vector3 cam2_ctr = camera_model2->camera_center(Vector2());\n      Vector3 cam1_vec = camera_model1->pixel_to_vector(Vector2());\n      Vector3 cam2_vec = camera_model2->pixel_to_vector(Vector2());\n      // Do the cameras appear to be in the same location?\n      if (norm_2(cam1_ctr - cam2_ctr) < 1e-3)\n        vw_out(WarningMessage)\n          << \"Your cameras appear to be in the same location!\\n\"\n          << \"\\tYou should double check your given camera\\n\"\n          << \"\\tmodels as most likely stereo won't be able\\n\"\n          << \"\\tto triangulate or perform epipolar rectification.\\n\";\n\n      // Developer friendly help\n      VW_OUT(DebugMessage,\"asp\") << \"Camera 1 location: \" << cam1_ctr << \"\\n\"\n                                  << \"   in estimated Lon Lat Rad: \"\n                                  << cartography::xyz_to_lon_lat_radius_estimate(cam1_ctr) << \"\\n\";\n      VW_OUT(DebugMessage,\"asp\") << \"Camera 2 location: \" << cam2_ctr << \"\\n\"\n                                  << \"   in estimated Lon Lat Rad: \"\n                                  << cartography::xyz_to_lon_lat_radius_estimate(cam2_ctr) << \"\\n\";\n      VW_OUT(DebugMessage,\"asp\") << \"Camera 1 pointing dir: \" << cam1_vec << \"\\n\"\n                                  << \"      dot against pos: \" << dot_prod(cam1_vec, cam1_ctr)\n                                  << \"\\n\";\n      VW_OUT(DebugMessage,\"asp\") << \"Camera 2 pointing dir: \" << cam2_vec << \"\\n\"\n                                  << \"      dot against pos: \" << dot_prod(cam2_vec, cam2_ctr)\n                                  << \"\\n\";\n\n      // For RPC cameras the camera center is not accurate, so don't print it.\n      if (opt.stereo_session != \"rpc\" &&\n          opt.stereo_session.find(\"rpcmap\") == std::string::npos)\n        vw_out() << \"Distance between camera centers: \"\n                 << norm_2(cam1_ctr - cam2_ctr) << \" meters.\\n\";\n\n      // Can cameras triangulate to point at something in front of them?\n      stereo::StereoModel model(camera_model1.get(), camera_model2.get());\n      double error;\n      Vector3 point = model(Vector2(), Vector2(), error);\n      if (point != Vector3() && // triangulation succeeded\n          ((dot_prod(cam1_vec, point - cam1_ctr) < 0) ||\n           (dot_prod(cam2_vec, point - cam2_ctr) < 0))) {\n        vw::vw_out(vw::WarningMessage)\n          << \"Your cameras appear to not to be pointing at the same location. \"\n          << \"A test vector triangulated backwards through the camera models. \"\n          << \"You should double-check your input cameras as most likely stereo \"\n          << \"will not be able to triangulate.\\n\";\n      }\n\n    } catch (const std::exception& e) {\n      // Don't throw an error here. There are legitimate reasons as to\n      // why the first checks may fail. For example, the top left pixel\n      // might not be valid on a map projected image. But notify the\n      // user anyway.\n      vw_out(DebugMessage,\"asp\") << e.what() << \"\\n\";\n    }\n  } // end camera checks\n\n} // End validateStereoOptions\n\n} // end namespace asp\n"
  },
  {
    "path": "src/asp/Tools/stereo.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file stereo.h\n/// Logic needed  by the stereo executables.\n\n#ifndef __ASP_STEREO_H__\n#define __ASP_STEREO_H__\n\n#include <asp/Core/StereoSettingsDesc.h>\n\n#include <vw/FileIO/GdalWriteOptions.h>\n#include <vw/Math/BBox.h>\n\n#include <boost/algorithm/string.hpp>\n#include <boost/program_options.hpp>\n\n// This has only the definition of an enum\n#include <vw/Stereo/CorrelationAlgorithms.h>\n\n// Boost headers\n#include <boost/thread/xtime.hpp>\n// Posix time is not fully supported in the version of Boost for RHEL Workstation 4\n#ifdef __APPLE__\n#include <boost/date_time/posix_time/posix_time.hpp>\n#else\n#include <ctime>\n#endif\n\nnamespace po = boost::program_options;\nnamespace fs = boost::filesystem;\n\n/// The stereo pipeline has several stages, which are enumerated below.\nenum { PREPROCESSING = 0,\n       CORRELATION,\n       REFINEMENT,\n       FILTERING,\n       POINT_CLOUD,\n       WIRE_MESH,\n       NUM_STAGES};\n\n// Allows FileIO to correctly read/write these pixel types\nnamespace asp {\n\n  struct ASPGlobalOptions;\n  \n  /// Transform the crop window to be in reference to L.tif\n  vw::BBox2i transformed_crop_win(ASPGlobalOptions const& opt);\n\n  /// Parse the command line options for multi-view stereo\n  void parseStereoArgs(int argc, char* argv[],\n                       boost::program_options::options_description const&\n                       additional_options,\n                       bool verbose,\n                       std::string & output_prefix,\n                       std::vector<ASPGlobalOptions> & opt_vec,\n                       bool exit_early = false);\n\n  /// Extract only the named options (flags and their values) from the command\n  /// line, skipping positional arguments (images, cameras, output prefix).\n  void parseStereoOptsVals(int argc, char *argv[],\n                           boost::program_options::options_description const&\n                           additional_options,\n                           std::vector<std::string> & opts_and_vals);\n\n  /// Parse input command line arguments\n  void parseStereoHelper(int argc, char *argv[], ASPGlobalOptions& opt,\n                         boost::program_options::options_description const&\n                         additional_options,\n                         bool is_multiview, bool override_out_prefix,\n                         std::vector<std::string> & unregistered,\n                         std::string & usage, bool exit_early = false);\n\n  /// Register DiskImageResource types that are not included in Vision Workbench.\n  void stereo_register_sessions();\n\n  /// Checks for obvious user mistakes\n  /// - Throws if any incompatible settings are found.\n  void validateStereoOptions(ASPGlobalOptions const& opt);\n\n  bool skip_image_normalization(ASPGlobalOptions const& opt);\n\n  // Convert, for example, 'asp_mgm' to '2'. For ASP algorithms we\n  // use the numbers 0 (BM), 1 (SGM), 2 (MGM), 3 (Final MGM).  For\n  // external algorithms will have to examine closer the algorithm\n  // string. This function has a Python analog in parallel_stereo.\n  vw::stereo::CorrelationAlgorithm stereo_alg_to_num(std::string alg);\n  \n  // Find the median angle in degrees at which rays emanating from\n  // matching points meet\n  // TODO(oalexan1): Make this not take opt as an argument, as that requires\n  // including StereoSettings.h here.\n  void estimate_convergence_angle(ASPGlobalOptions const& opt);\n  \n} // end namespace vw\n\n#endif//__ASP_STEREO_H__\n"
  },
  {
    "path": "src/asp/Tools/stereo_blend.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n// \\file stereo_blend.cc\n\n// The purpose of this tool is to blend the boundaries of extra-large\n// stereo_corr tiles so that no seams are visible.  This is only\n// required when running local alignment or SGM/MGM on large data sets\n// using parallel_stereo.\n\n// ROI means region of interest. Each tile has a central area, the\n// ROI, extracted from the string, out-2048_0_1487_2048, and\n// outer/padding areas, called buffers, that are not in the tile\n// proper but rather in neighboring tiles. The buffer size is 0 at\n// image boundary, and it can be smaller closer to the boundary,\n// otherwise it is equal to the collar size, which is a fixed bias.\n\n// Hence, what this tool does, is, take the outer areas of neighboring\n// tiles which overlap with the inner area of the current tile, and\n// blend the results.\n\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/Macros.h>\n#include <asp/Core/AspLog.h>\n#include <asp/Tools/stereo.h>\n\n#include <vw/Image/Grassfire.h>\n#include <vw/Image/ImageMath.h>\n#include <vw/FileIO/DiskImageUtils.h>\n#include <vw/Cartography/GeoReference.h>\n#include <vw/Cartography/GeoReferenceUtils.h>\n#include <vw/Stereo/DisparityMap.h>\n#include <boost/filesystem.hpp>\n\nusing namespace vw;\nusing namespace vw::stereo;\nusing namespace asp;\n\ntypedef ImageView<double> WeightsType;\ntypedef PixelMask<Vector2f> MaskedPixType;\n\n// Every tile has 8 neighbors\nconst int NUM_NEIGHBORS = 8;\n\n// Enum for the tiles. We count later on on the fact that the\n// neighbors have indices in [0, 7]. TILE_M is the main tile and the\n// others are its neighbors.\nenum TilePosition {TILE_M = -1,\n                   TILE_TL = 0, TILE_T = 1, TILE_TR = 2,\n                   TILE_L  = 3,             TILE_R  = 4,\n                   TILE_BL = 5, TILE_B = 6, TILE_BR = 7};\n\n/// Given \"out-2048_0_1487_2048\" return \"2048_0_1487_2048\"\nstd::string extract_process_folder_bbox_string(std::string s, std::string const& in_file) {\n\n  // If the filename was included, throw it out first.\n  if (s.find(\"-\" + in_file) != std::string::npos) {\n    std::size_t pt = s.rfind(\"/\");\n    s = s.substr(0, pt);\n  }\n\n  std::size_t num_start = s.rfind(\"-\");\n  if (num_start == std::string::npos)\n    vw_throw(ArgumentErr() << \"Error parsing folder string: \" << s);\n  return s.substr(num_start+1);\n}\n  \n/// Constructs a BBox2i from a parallel_stereo formatted folder.\nBBox2i bbox_from_folder(std::string const& s, std::string const& in_file) {\n  std::string cropped = extract_process_folder_bbox_string(s, in_file);\n\n  int x, y, width, height;\n  sscanf(cropped.c_str(), \"%d_%d_%d_%d\", &x, &y, &width, &height);\n  return BBox2i(x, y, width, height);\n}\n\n// Load an image and form its weights\nbool load_image_and_weights(std::string const& file_path,\n                            ImageView<MaskedPixType> & image, WeightsType & weights,\n                            int & num_channels, bool & has_nodata, float& nodata_value) {\n\n  // Initialize the outputs to something\n  num_channels = 1;\n  has_nodata = false;\n  nodata_value = -32768.0;\n  \n  // Verify image exists\n  if (file_path == \"\")\n    return false;\n\n  vw_out() << \"Reading: \" << file_path << std::endl;\n\n  // Verify that the disparity has float pixels, as expected. Blending\n  // is done either after algorithms which are not the old ASP block\n  // matching (ASP_BM), when the disparity pixels are always float, or\n  // with local epipolar alignment, when the resulting disparity has\n  // float pixels even when ASP_BM is used.\n  boost::shared_ptr<DiskImageResource> rsrc(DiskImageResourcePtr(file_path));\n  ChannelTypeEnum disp_data_type = rsrc->channel_type();\n  if (disp_data_type != VW_CHANNEL_FLOAT32)\n    vw_throw(ArgumentErr() << \"Error: stereo_blend should only be called with float images.\");\n\n  num_channels = vw::get_num_channels(file_path);\n\n  if (rsrc->has_nodata_read()) {\n    has_nodata = true;\n    nodata_value = rsrc->nodata_read();\n  } else {\n    has_nodata = false;\n    if (num_channels == 1) {\n      vw_throw(ArgumentErr() << \"stereo_blend: For a single-channel image \"\n               << \"expecting to have a no-data value in order to keep track of invalid pixels.\");\n    }\n  }\n  \n  // Load the image from disk\n  if (num_channels == 3) {\n    // Load a disparity\n    image = DiskImageView<MaskedPixType>(file_path);\n  } else if (num_channels == 1) {\n    // Load a float image with a nodata value, and create a disparity. It is simpler\n    // to do it this way than to write some template-based logic.\n    ImageView<float> curr_image = DiskImageView<float>(file_path);\n    image.set_size(curr_image.cols(), curr_image.rows());\n    for (int col = 0; col < curr_image.cols(); col++) {\n      for (int row = 0; row < curr_image.rows(); row++) {\n        float val = curr_image(col, row);\n        if (val != nodata_value) {\n          image(col, row) = MaskedPixType(vw::Vector2f(val, val)); \n          image(col, row).validate();\n        } else{\n          image(col, row) = MaskedPixType(vw::Vector2f(0, 0)); \n          image(col, row).invalidate();\n        }\n      } \n    }\n  } else {\n    vw_throw(ArgumentErr() << \"stereo_blend: Expecting an image with 1 or 3 bands, but \"\n             << \"image \" << file_path << \" has \" << num_channels << \" channels.\\n\");\n  }\n  \n  // Compute the desired weights. Strictly speaking we need to compute the weights\n  // only on the portion of the image that we will use for blending, but weights\n  // computation is a cheap operation comparing to I/O time.\n  centerline_weights(image, weights);\n\n#if 0\n  // For debugging\n  std::string weights_file = file_path + \"_weight.tif\";\n  \n  vw_out() << \"Writing: \" << weights_file << std::endl;\n  write_image(weights_file, weights);\n#endif\n  \n  return true;\n}\n\nstruct BlendOptions {\n  std::string main_path;    // the path to the main disparity to blend\n  BBox2i      main_roi;     // the main region of interest without padding\n  BBox2i      padded_main;  // the main region of interest with padding\n  std::string neib_path  [NUM_NEIGHBORS]; // the path to the neighbor disparity to blend\n  BBox2i      neib_roi   [NUM_NEIGHBORS]; // neighbor region of interest without padding\n  BBox2i      padded_neib[NUM_NEIGHBORS]; // neighbor region of interest with padding\n  int         pad_size;\n  BBox2i      full_box; // The box in which all tiles must fit, including their padding\n\n  // Add padding to a box\n  BBox2i add_padding(BBox2i box) {\n    box.expand(pad_size);\n    box.crop(full_box);\n    return box;\n  }\n};\n\n// Check if the dimensions of a tile agree with the box it is supposed to fit in\nvoid check_size(BBox2i const& bbox, std::string const& image_file) {\n  Vector2i image_size = file_image_size(image_file);\n\n  bool is_good = (bbox.width() == image_size.x() && bbox.height() == image_size.y());\n  if (!is_good) \n    vw_throw(ArgumentErr() << \"stereo_blend: File: \" << image_file\n             << \" is expected to fit in box: \" << bbox);\n}\n\nvoid fill_blend_options(ASPGlobalOptions const& opt, std::string const& in_file,\n                        BlendOptions & blend_opt) {\n\n  std::string left_image = opt.out_prefix + \"-L.tif\";\n  Vector2i full_image_size = file_image_size(left_image);\n  blend_opt.full_box = BBox2i(0, 0, full_image_size.x(), full_image_size.y());\n  blend_opt.pad_size = stereo_settings().sgm_collar_size;\n  \n  blend_opt.main_path = opt.out_prefix + \"-\" + in_file;\n\n  // Get the top level output folder for parallel_stereo\n  boost::filesystem::path parallel_stereo_folder(opt.out_prefix);\n\n  // This wrong, as it assumes that out_prefix always looks like path1/path2.\n  // What if it is path1/path2/path3. \n  parallel_stereo_folder = parallel_stereo_folder.parent_path().parent_path();\n\n  // This must be sync-ed up with parallel_stereo. Read the list of\n  // dirs that parallel_stereo made.\n  std::vector<std::string> folder_list;\n  std::string dir;\n  std::string dirList = opt.out_prefix + \"-dirList.txt\";\n  std::ifstream ifs(dirList.c_str());\n  while (ifs >> dir)\n    folder_list.push_back(dir);\n  ifs.close();\n  if (folder_list.empty()) \n    vw_throw(ArgumentErr() << \"Something is corrupted. Found an empty file: \"\n             << dirList << \".\\n\");\n  \n  // Get the main tile bbox from the subfolder name\n  boost::filesystem::path mpath(blend_opt.main_path);\n  std::string mbb = mpath.parent_path().filename().string();\n\n  blend_opt.main_roi    = bbox_from_folder(mbb, in_file);\n  blend_opt.padded_main = blend_opt.add_padding(blend_opt.main_roi);\n  check_size(blend_opt.padded_main, blend_opt.main_path);\n  \n  BBox2i main_bbox = blend_opt.main_roi;\n\n  // Figure out where each folder goes\n  for (std::size_t i = 0; i < folder_list.size(); i++) {\n    BBox2i bbox = bbox_from_folder(folder_list[i], in_file);\n\n    std::string bbox_string = extract_process_folder_bbox_string(folder_list[i], in_file);\n    \n    // Note that folder_list[i] already has the output prefix relative to the\n    // directory parallel_stereo runs in.\n    const std::string abs_path =\n      folder_list[i] + \"/\" + bbox_string + \"-\" + in_file;\n\n    if (bbox.max().x() == main_bbox.min().x()) { // Tiles one column to left\n      if (bbox.max().y() == main_bbox.min().y()) { // Top left\n        blend_opt.neib_path[TILE_TL] = abs_path;\n        blend_opt.neib_roi [TILE_TL] = bbox;\n        continue;\n      }\n      if (bbox.min().y() == main_bbox.min().y()) { // Left\n        blend_opt.neib_path[TILE_L] = abs_path;\n        blend_opt.neib_roi [TILE_L] = bbox;\n        continue;\n      }\n      if (bbox.min().y() == main_bbox.max().y()) { // Bot left\n        blend_opt.neib_path[TILE_BL] = abs_path;\n        blend_opt.neib_roi [TILE_BL] = bbox;\n        continue;\n      }\n    } // End left tiles\n    \n    if (bbox.min().x() == main_bbox.max().x()) { // Tiles one column to right\n      if (bbox.max().y() == main_bbox.min().y()) { // Top right\n        blend_opt.neib_path[TILE_TR] = abs_path;\n        blend_opt.neib_roi [TILE_TR] = bbox;\n        continue;\n      }\n      if (bbox.min().y() == main_bbox.min().y()) { // Right\n        blend_opt.neib_path[TILE_R] = abs_path;\n        blend_opt.neib_roi [TILE_R] = bbox;\n        continue;\n      }\n      if (bbox.min().y() == main_bbox.max().y()) { // Bot right\n        blend_opt.neib_path[TILE_BR] = abs_path;\n        blend_opt.neib_roi [TILE_BR] = bbox;\n        continue;\n      }\n    } // End right tiles\n    \n    if (bbox.min().x() == main_bbox.min().x()) { // Tiles in same column\n      if (bbox.max().y() == main_bbox.min().y()) { // Top\n        blend_opt.neib_path[TILE_T] = abs_path;\n        blend_opt.neib_roi [TILE_T] = bbox;\n        continue;\n      }\n      if (bbox.min().y() == main_bbox.max().y()) { // Bottom\n        blend_opt.neib_path[TILE_B] = abs_path;\n        blend_opt.neib_roi [TILE_B] = bbox;\n        continue;\n      }\n    }\n  }\n\n  // Compute the padded box for each neighbor\n  for (int i = 0; i < NUM_NEIGHBORS; i++) {\n    \n    if (blend_opt.neib_path[i] == \"\") \n      continue; // no neighbor in that direction\n\n    blend_opt.padded_neib[i] = blend_opt.add_padding(blend_opt.neib_roi[i]);\n    check_size(blend_opt.padded_neib[i], blend_opt.neib_path[i]);\n  }\n\n}\n\n// See if a given image has only invalid pixels\nbool invalid_image(ImageView<MaskedPixType> const& image) {\n  for (int col = 0; col < image.cols(); col++) {\n    for (int row = 0; row < image.rows(); row++) {\n      if (is_valid(image(col, row))) {\n        // Found a valid pixel\n        return false;\n      }\n    }\n  }\n\n  return true;\n}\n\n/// Blend the borders of the main tile using the neighboring\n/// tiles.\n/// While all the main tile and neighbor tiles have padding, we will save\n/// the blended main tile without padding.\n\nImageView<MaskedPixType> tile_blend(ASPGlobalOptions const& opt,\n                                    BlendOptions & blend_opt,\n                                    // These will change\n                                    int & num_channels, bool & has_nodata, float & nodata_value) {\n\n  // Initialize the outputs to something\n  num_channels = 1;\n  has_nodata = false;\n  nodata_value = -32768.0;\n\n  // Start the output image as invalid and zero. It will be used to\n  // accumulate the weighted disparities.\n  ImageView<MaskedPixType> output_image(blend_opt.main_roi.width(), blend_opt.main_roi.height()); \n  for (int col = 0; col < output_image.cols(); col++) {\n    for (int row = 0; row < output_image.rows(); row++) {\n      output_image(col, row) = MaskedPixType(); \n      output_image(col, row).invalidate();\n    }\n  }\n  \n  // Accumulate here the weights\n  WeightsType output_weights(blend_opt.main_roi.width(), blend_opt.main_roi.height());\n  for (int col = 0; col < output_weights.cols(); col++) {\n    for (int row = 0; row < output_weights.rows(); row++) {\n      output_weights(col, row) = 0.0; \n    }\n  }\n\n  // Add the contribution from the main tile and neighboring tiles. Note\n  // that i = -1 corresponds to the main tile.\n  for (int i = -1; i < NUM_NEIGHBORS; i++) {\n\n    ImageView<MaskedPixType> image;\n    WeightsType weights;\n    BBox2i padded_box;\n    \n    if (i == -1) {\n      // Main tile\n      // The main tile better exist\n      int curr_num_channels = 1;\n      bool curr_has_nodata = false;\n      float curr_nodata_value = -32768.0;\n      bool ans = load_image_and_weights(blend_opt.main_path, image, weights,\n                                        curr_num_channels, curr_has_nodata, curr_nodata_value);\n      if (!ans) \n        vw_throw(ArgumentErr() << \"stereo_blend: main tile is missing.\");\n\n      // Since the image was loaded successfully, copy its other info\n      num_channels = curr_num_channels;\n      has_nodata   = curr_has_nodata;\n      nodata_value = curr_nodata_value;\n\n      padded_box = blend_opt.padded_main;\n      \n      // If there are no valid pixels in the main tile without its padding,\n      // return an invalid blended tile.\n      if (invalid_image(crop(image, blend_opt.main_roi - blend_opt.padded_main.min())))\n        return output_image;\n      \n    } else {\n      // A neighboring tile\n      int curr_num_channels = 1;\n      bool curr_has_nodata = false;\n      float curr_nodata_value = -32768.0;\n      bool ans = load_image_and_weights(blend_opt.neib_path[i], image, weights,\n                                        curr_num_channels, curr_has_nodata, curr_nodata_value);\n      if (!ans)\n        continue; // Nothing to blend\n\n      // Since the image was loaded successfully, copy its other info. Note we assume\n      // all inputs are consistent.\n      num_channels = curr_num_channels;\n      has_nodata   = curr_has_nodata;\n      nodata_value = curr_nodata_value;\n\n      padded_box = blend_opt.padded_neib[i];\n    }\n\n    // Do the blending, either with the main or neighboring tiles\n    for (int col = 0; col < output_image.cols(); col++) {\n      for (int row = 0; row < output_image.rows(); row++) {\n\n        // Convert the given pixel to the coordinate system of the full image\n        Vector2 pix = Vector2(col, row) + blend_opt.main_roi.min();\n\n        // Convert the pixel to the coordinate system of the current padded tile\n        pix = pix - padded_box.min();\n\n        // Padded tiles can overlap only partially with the central region of the main\n        // tile. If not in the overlap region, skip the work.\n        if (!vw::bounding_box(image).contains(pix)) \n          continue;\n\n        if (!is_valid(image(pix[0], pix[1])) || weights(pix[0], pix[1]) <= 0.0) \n          continue; // No useful info\n\n        output_image(col, row).validate();\n        output_image(col, row)   += weights(pix[0], pix[1]) * image(pix[0], pix[1]);\n        output_weights(col, row) += weights(pix[0], pix[1]);\n      }\n    }\n  }\n  \n  // Normalize\n  for (int col = 0; col < output_image.cols(); col++) {\n    for (int row = 0; row < output_image.rows(); row++) {\n      \n      if (!is_valid(output_image(col, row)))\n        continue;\n      \n      if (output_weights(col, row) <= 0) {\n        output_image(col, row).invalidate();\n        continue;\n      }\n      \n      output_image(col, row) /= output_weights(col, row);\n    }\n  }\n  \n  return output_image;\n}\n\nvoid stereo_blending(ASPGlobalOptions const& opt, std::string const& in_file,\n                     std::string const& out_file) {\n\n  BlendOptions blend_opt;\n  fill_blend_options(opt, in_file, blend_opt);\n\n  // Since this tool is only for follow-up processing of SGM results\n  // in parallel_stereo, it can be safely assumed that the input\n  // images are small enough to load entirely into memory.\n\n  cartography::GeoReference left_georef;\n  std::string left_image = opt.out_prefix + \"-L.tif\";\n  bool   has_left_georef = read_georeference(left_georef, left_image);\n  int num_channels       = 1;\n  bool has_nodata        = false;\n  float nodata           = -32768.0;\n\n  ImageView<MaskedPixType> blended_disp = tile_blend(opt, blend_opt,\n                                                     // These will change\n                                                     num_channels, has_nodata, nodata);\n\n  // Sanity check\n  if (num_channels == 1 && !has_nodata) {\n    vw_throw(ArgumentErr() << \"stereo_blend: For a single-channel image \"\n             << \"expecting to have a no-data value in order to keep track of invalid pixels.\");\n  }\n\n  std::string full_out_file = opt.out_prefix + \"-\" + out_file;\n  vw_out() << \"Writing: \" << full_out_file << \"\\n\";\n  if (num_channels == 3) {\n    // Write the blended disparity\n    vw::cartography::block_write_gdal_image(full_out_file, blended_disp,\n                                            has_left_georef, left_georef,\n                                            has_nodata, nodata, opt,\n                                            TerminalProgressCallback(\"asp\", \"\\t--> Blending :\"));\n  } else if (num_channels == 1) {\n    // Write a single-channel image with no-data\n    ImageView<float> image(blended_disp.cols(), blended_disp.rows());\n    for (int col = 0; col < image.cols(); col++) {\n      for (int row = 0; row < image.rows(); row++) {\n        if (is_valid(blended_disp(col, row))) \n          image(col, row) = blended_disp(col, row).child()[0];\n        else\n          image(col, row) = nodata;\n      }\n    }\n    vw::cartography::block_write_gdal_image(full_out_file, image,\n                                            has_left_georef, left_georef,\n                                            has_nodata, nodata, opt,\n                                            TerminalProgressCallback(\"asp\", \"\\t--> Blending:\"));\n  }\n}\n\nint main(int argc, char* argv[]) {\n\n  try {\n\n    vw_out() << \"\\n[ \" << current_posix_time_string() << \" ]: Stage 2 --> BLENDING\\n\";\n\n    stereo_register_sessions();\n\n    bool verbose = false;\n    std::vector<ASPGlobalOptions> opt_vec;\n    std::string output_prefix;\n    asp::parseStereoArgs(argc, argv, SubpixelDescription(),\n                         verbose, output_prefix, opt_vec);\n    ASPGlobalOptions opt = opt_vec[0];\n\n    // Subpixel refinement uses smaller tiles.\n    //---------------------------------------------------------\n    int ts = ASPGlobalOptions::rfne_tile_size();\n    opt.raster_tile_size = Vector2i(ts, ts);\n\n    // This tool is only intended to run as part of parallel_stereo, which\n    //  renames the normal -D.tif file to -Dnosym.tif.\n    std::string in_file =  \"Dnosym.tif\";\n\n    std::string out_file = \"B.tif\";\n    if (stereo_settings().subpixel_mode > 6){\n      // No further subpixel refinement, skip to the -RD output.\n      out_file = \"RD.tif\";\n    }\n    stereo_blending(opt, in_file, out_file);\n\n    // See if to also blend L-R disp differences\n    if (stereo_settings().save_lr_disp_diff) {\n      in_file  = \"L-R-disp-diff.tif\";\n      out_file = \"L-R-disp-diff-blend.tif\";\n      stereo_blending(opt, in_file, out_file);\n    }\n    \n    vw_out() << \"\\n[ \" << current_posix_time_string() << \" ]: BLENDING FINISHED\\n\";\n\n  } ASP_STANDARD_CATCHES;\n\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/stereo_corr.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file stereo_corr.cc\n///\n\n#include <asp/Core/DisparityProcessing.h>\n#include <asp/Core/DemDisparity.h>\n#include <asp/Core/InterestPointMatching.h>\n#include <asp/Core/IpMatchingAlgs.h>\n#include <asp/Core/LocalAlignment.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Sessions/StereoSession.h>\n#include <asp/Tools/stereo.h>\n#include <asp/Core/Macros.h>\n#include <asp/Core/EnvUtils.h>\n#include <asp/Core/FileUtils.h>\n#include <asp/Core/AspLog.h>\n\n#include <vw/Stereo/CorrelationView.h>\n#include <vw/Stereo/CostFunctions.h>\n#include <vw/Stereo/DisparityMap.h>\n#include <vw/Core/StringUtils.h>\n#include <vw/InterestPoint/MatcherIO.h>\n#include <vw/Stereo/Correlation.h>\n#include <vw/Core/Stopwatch.h>\n#include <vw/FileIO/DiskImageView.h>\n#include <vw/Cartography/GeoReferenceUtils.h>\n\n#include <xercesc/util/PlatformUtils.hpp>\n\nusing namespace vw;\nusing namespace vw::stereo;\nusing namespace asp;\n\ntypedef vw::ImageViewRef<vw::PixelMask<vw::Vector2f>> DispImageRef;\n\n/// Returns the properly cast cost mode type\nstereo::CostFunctionType get_cost_mode_value() {\n  switch(stereo_settings().cost_mode) {\n  case 0: return stereo::ABSOLUTE_DIFFERENCE;\n  case 1: return stereo::SQUARED_DIFFERENCE;\n  case 2: return stereo::CROSS_CORRELATION;\n  case 3: return stereo::CENSUS_TRANSFORM;\n  case 4: return stereo::TERNARY_CENSUS_TRANSFORM;\n  default: \n    vw_throw(ArgumentErr() << \"Unknown value \" << stereo_settings().cost_mode\n             << \" for cost-mode.\\n\");\n  };\n}\n\n/// Determine the proper subpixel mode to be used with SGM correlation\nSemiGlobalMatcher::SgmSubpixelMode get_sgm_subpixel_mode() {\n\n  switch(stereo_settings().subpixel_mode) {\n  case  7: return SemiGlobalMatcher::SUBPIXEL_NONE;\n  case  8: return SemiGlobalMatcher::SUBPIXEL_LINEAR;\n  case  9: return SemiGlobalMatcher::SUBPIXEL_POLY4;\n  case 10: return SemiGlobalMatcher::SUBPIXEL_COSINE;\n  case 11: return SemiGlobalMatcher::SUBPIXEL_PARABOLA;\n  case 12: return SemiGlobalMatcher::SUBPIXEL_LC_BLEND;\n  default: return SemiGlobalMatcher::SUBPIXEL_NONE; // This includes stereo_rfne subpixel modes\n  };\n}\n\n// Read the search range from D_sub, and scale it to the full image\nvoid read_search_range_from_D_sub(vw::ImageView<vw::PixelMask<vw::Vector2f>> const& sub_disp,\n                                  vw::Vector2 const& upsample_scale,\n                                  bool verbose) {\n\n  // No D_sub is generated or should be used for seed mode 0.\n  if (stereo_settings().seed_mode == 0)\n    return;\n\n  BBox2 search_range = stereo::get_disparity_range(sub_disp);\n  search_range.min() = floor(elem_prod(search_range.min(), upsample_scale));\n  search_range.max() = ceil (elem_prod(search_range.max(), upsample_scale));\n  \n  // If the width or height of the box is 0, expand it a bit, otherwise\n  // VisionWorkbench will think it is empty and print it with no width or height.\n  if (search_range.min().x() == search_range.max().x()) {\n    search_range.min().x() -= 0.5;\n    search_range.max().x() += 0.5;\n  }\n  if (search_range.min().y() == search_range.max().y()) {\n    search_range.min().y() -= 0.5;\n    search_range.max().y() += 0.5;\n  } \n  \n  stereo_settings().search_range = search_range;\n  \n  // This ensures the search range is not printed in the D_sub log but not in the \n  // full res correlation log, where it will be printed again anyway right before\n  // correlation starts.\n  if (verbose)\n    vw_out() << \"\\t--> Full-res search range based on D_sub: \" << search_range << \"\\n\";\n}\n\n/// Produces the low-resolution disparity file D_sub\nvoid produce_lowres_disparity(ASPGlobalOptions & opt) {\n\n  // Set up handles to read the input images\n  DiskImageView<vw::uint8> Lmask(opt.out_prefix + \"-lMask.tif\"),\n    Rmask(opt.out_prefix + \"-rMask.tif\");\n\n  DiskImageView<PixelGray<float>> left_sub (opt.out_prefix + \"-L_sub.tif\"),\n    right_sub(opt.out_prefix + \"-R_sub.tif\");\n\n  DiskImageView<uint8> left_mask_sub (opt.out_prefix+\"-lMask_sub.tif\"),\n    right_mask_sub(opt.out_prefix+\"-rMask_sub.tif\");\n\n  Vector2 downsample_scale(double(left_sub.cols()) / double(Lmask.cols()),\n                           double(left_sub.rows()) / double(Lmask.rows()));\n\n  double mean_scale = (downsample_scale[0] + downsample_scale[1]) / 2.0;\n\n  // Compute the initial search range in the subsampled image\n  BBox2 search_range(floor(elem_prod(downsample_scale, stereo_settings().search_range.min())),\n                     ceil(elem_prod(downsample_scale, stereo_settings().search_range.max())));\n\n  vw::stereo::CorrelationAlgorithm stereo_alg\n    = asp::stereo_alg_to_num(stereo_settings().stereo_algorithm);\n\n  std::string d_sub_file = opt.out_prefix + \"-D_sub.tif\";\n  std::string spread_file = opt.out_prefix + \"-D_sub_spread.tif\";\n\n  if (stereo_settings().seed_mode != 3 && fs::exists(spread_file)) {\n    // Wipe any potentially old spread file, unless seed_mode is 3, when \n    // sparse_disp does the work.\n    fs::remove(spread_file);\n  }\n\n  if (stereo_settings().seed_mode == 1) {\n\n    // For D_sub always use a cross-check even if it takes more time.\n    // The user-specified xcorr_threshold will be restored at the end.\n    int orig_xcorr_threshold = stereo_settings().xcorr_threshold;\n    if (orig_xcorr_threshold < 0) \n      stereo_settings().xcorr_threshold = 2;\n    \n    // Use low-res correlation to get the low-res disparity\n    Vector2 expansion(search_range.width(), search_range.height());\n    expansion *= stereo_settings().seed_percent_pad / 2.0f;\n    // Expand by the user selected amount. Default is 25%.\n    search_range.min() -= expansion;\n    search_range.max() += expansion;\n\n    //VW_OUT(DebugMessage,\"asp\") << \"D_sub search range: \" << search_range << \" px\\n\";\n    vw_out() << \"D_sub search range: \" << search_range << \" px\\n\";\n    stereo::CostFunctionType cost_mode = get_cost_mode_value();\n    Vector2i kernel_size  = stereo_settings().corr_kernel;\n    int corr_timeout      = 5*stereo_settings().corr_timeout; // 5x, so try hard\n    const int rm_half_kernel = 5; // Filter kernel size used by CorrelationView\n    double seconds_per_op = 0.0;\n    if (corr_timeout > 0)\n      seconds_per_op = calc_seconds_per_op(cost_mode, kernel_size);\n\n    SemiGlobalMatcher::SgmSubpixelMode sgm_subpixel_mode = get_sgm_subpixel_mode();\n    Vector2i sgm_search_buffer = stereo_settings().sgm_search_buffer;\n    \n    ImageView<PixelMask<float>> * lr_disp_diff = NULL;\n    Vector2i region_ul = Vector2i(0, 0);\n\n    int blob_filter_area = stereo_settings().corr_blob_filter_area * mean_scale;\n    if (stereo_settings().rm_quantile_multiple > 0.0) {\n      // Don't combine blob filtering with quantile filtering\n      blob_filter_area = 0;\n    }\n\n    // Process the entire D_sub in memory as it is small enough\n    int collar_size = 0; // Since there won't be tiles as the all the processing is done at once\n    vw::vw_out() << \"Computing the low-resolution disparity.\\n\";\n    // Use here a stop watch, as this takes forever.\n    vw::Stopwatch sw;\n    sw.start();\n    ImageView<PixelMask<Vector2f>> d_sub =\n      vw::stereo::pyramid_correlate\n      (// Compute image correlation using the PyramidCorrelationView class\n       left_sub, right_sub, left_mask_sub, right_mask_sub,\n       vw::stereo::PREFILTER_LOG, stereo_settings().slogW,\n       search_range, kernel_size, cost_mode, corr_timeout, seconds_per_op, \n       stereo_settings().xcorr_threshold, stereo_settings().min_xcorr_level,\n       rm_half_kernel, stereo_settings().corr_max_levels, stereo_alg, \n       collar_size, sgm_subpixel_mode, sgm_search_buffer, stereo_settings().corr_memory_limit_mb,\n       blob_filter_area, lr_disp_diff, region_ul, stereo_settings().stereo_debug);\n\n    if (stereo_settings().rm_quantile_multiple <= 0.0) {\n      // Filter D_sub using thresholds (the default)\n      d_sub = rm_outliers_using_thresh\n        (d_sub,\n         // To do: all these hard-coded values must be replaced with\n         // appropriate params from user's stereo.default, for\n         // consistency with how disparity is filtered in stereo_fltr,\n         // when invoking disparity_cleanup_using_thresh.\n         1, 1, // in stereo.default we have 5 5\n         // Changing below the hard-coded value from 2.0 to using a\n          // param.  The default value will still be 2.0 but is now\n          // modifiable. Need to get rid of the 2.0/3.0 factor and\n          // study how it affects the result.\n         stereo_settings().rm_threshold*2.0/3.0,\n         // Another change of hard-coded value to param. Get rid of 0.5/0.6\n          // and study the effect.\n         (stereo_settings().rm_min_matches/100.0)*0.5/0.6);\n    } else {\n      // Filter D_sub using quantiles\n      d_sub = rm_outliers_using_quantiles\n        (d_sub, stereo_settings().rm_quantile_percentile,\n         stereo_settings().rm_quantile_multiple);\n    }\n\n    vw_out() << \"Writing: \" << d_sub_file << std::endl;\n    vw::cartography::block_write_gdal_image\n      (// Write to disk\n       d_sub_file, d_sub, opt,\n       TerminalProgressCallback(\"asp\", \"\\t--> Low-resolution disparity:\"));\n    // Check elapsed time\n    sw.stop();\n    vw_out() << \"Low-resolution disparity computation took \" << sw.elapsed_seconds() << \" s.\\n\";\n    \n    // Restore the user xcorr_threshold\n    stereo_settings().xcorr_threshold = orig_xcorr_threshold;\n    \n    // Read D_sub back from disk, filter it, and write it back.\n    // Avoid the pinhole session as that one has no datum which we need.\n    // Avoid the correlator mode as then there are no cameras.\n    if (stereo_settings().outlier_removal_params[0] < 100.0 &&\n        opt.session->have_datum()                           &&\n        !stereo_settings().correlator_mode) {\n      \n      vw::TransformPtr tx_left = opt.session->tx_left();\n      vw::TransformPtr tx_right = opt.session->tx_right();\n      boost::shared_ptr<camera::CameraModel> left_camera_model, right_camera_model;\n      opt.session->camera_models(left_camera_model, right_camera_model);\n      const bool use_sphere_for_non_earth = true;\n      vw::cartography::Datum datum = opt.session->get_datum(left_camera_model.get(),\n                                                            use_sphere_for_non_earth);\n      \n      asp::filter_D_sub(opt, tx_left, tx_right,\n                        left_camera_model, right_camera_model, datum, d_sub_file,\n                        stereo_settings().outlier_removal_params);\n    }\n\n    if (stereo_settings().max_disp_spread > 0.0)\n      asp::dispSpreadFilterIO(opt, d_sub_file, stereo_settings().max_disp_spread);\n    \n  } else if (stereo_settings().seed_mode == 2) {\n\n    // Use a DEM to get the low-res disparity\n    boost::shared_ptr<camera::CameraModel> left_camera_model, right_camera_model;\n    opt.session->camera_models(left_camera_model, right_camera_model);\n    vw::TransformPtr tx_left = opt.session->tx_left();\n    vw::TransformPtr tx_right = opt.session->tx_right();\n    produce_dem_disparity(opt, tx_left, tx_right, left_camera_model, right_camera_model, \n                          opt.session->name());\n    \n  } else if (stereo_settings().seed_mode == 3) {\n    // D_sub is already generated by now by sparse_disp\n  }\n\n  // Read this to print some text while still in low-res disparity\n  // computation mode.  Next time we call this it will be per\n  // individual tile so it will go to different log files.\n  if (stereo_settings().seed_mode > 0) {\n    bool verbose = true;\n    ImageView<PixelMask<Vector2f>> sub_disp;\n    vw::Vector2 upsample_scale;\n    load_D_sub_and_scale(opt.out_prefix, d_sub_file, sub_disp, upsample_scale);\n    read_search_range_from_D_sub(sub_disp, upsample_scale, verbose);\n  }\n\n} // End produce_lowres_disparity\n\n// TODO(oalexan1): move this to InterestPointMatching.cc\nBBox2 get_search_range_from_ip_hists(vw::math::Histogram const& hist_x,\n                                     vw::math::Histogram const& hist_y,\n                                     double edge_discard_percentile,\n                                     double search_scale) {\n\n  const double min_percentile = edge_discard_percentile;\n  const double max_percentile = 1.0 - edge_discard_percentile;\n\n  const Vector2 FORCED_EXPANSION = Vector2(30,2); // Must expand range by at least this much\n  size_t min_bin_x = hist_x.get_percentile(min_percentile);\n  size_t min_bin_y = hist_y.get_percentile(min_percentile);\n  size_t max_bin_x = hist_x.get_percentile(max_percentile);\n  size_t max_bin_y = hist_y.get_percentile(max_percentile);\n  Vector2 search_min(hist_x.get_bin_center(min_bin_x), hist_y.get_bin_center(min_bin_y));\n  Vector2 search_max(hist_x.get_bin_center(max_bin_x), hist_y.get_bin_center(max_bin_y));\n  Vector2 search_center = (search_max + search_min) / 2.0;\n  Vector2 d_min = search_min - search_center; // TODO: Make into a bbox function!\n  Vector2 d_max = search_max - search_center;\n\n  // Enforce a minimum expansion on the search range in each direction\n  Vector2 min_expand = d_min*search_scale;\n  Vector2 max_expand = d_max*search_scale;\n\n  for (int i = 0; i < 2; ++i) {\n    if (min_expand[i] > -1*FORCED_EXPANSION[i])\n      min_expand[i] = -1*FORCED_EXPANSION[i];\n    if (max_expand[i] < FORCED_EXPANSION[i])\n      max_expand[i] = FORCED_EXPANSION[i];\n  }\n  \n  search_min = search_center + min_expand;\n  search_max = search_center + max_expand;\n\n  Vector2 search_minI(floor(search_min[0]), floor(search_min[1])); // Round outwards\n  Vector2 search_maxI(ceil (search_max[0]), ceil (search_max[1]));\n\n  return BBox2(search_minI, search_maxI);\n}\n\n/// Use existing interest points to compute a search range, when --seed-mode is 1.\nBBox2 approximate_search_range(ASPGlobalOptions & opt, std::string const& match_filename) {\n\n  vw_out() << \"\\t--> Using interest points to determine search window.\\n\";\n  std::vector<ip::InterestPoint> in_left_ip, in_right_ip, matched_left_ip, matched_right_ip;\n\n  // The interest points must have been created outside this function\n  if (!fs::exists(match_filename))\n    vw_throw(ArgumentErr() << \"Missing IP file: \" << match_filename);\n  \n  vw_out() << \"\\t    * Loading match file: \" << match_filename << \"\\n\";\n  ip::read_match_file(match_filename, in_left_ip, in_right_ip, stereo_settings().matches_as_txt);\n\n  // TODO(oalexan1): Add here filter_ip_using_cameras, but take into account\n  // that the datum may not exist!\n\n  // TODO(oalexan1): Add filter ip using reprojection error!\n  \n  // Align the ip, so go ip between left.tif and right.tif to ones between\n  // L.tif and R.tif. If the matches are already between L.tif and R.tif\n  // then do nothing.\n  // TODO(oalexan1): Having this as a special case is annoying. Do something about this.\n  bool matches_as_txt = stereo_settings().matches_as_txt;\n  std::string aligned_match_file = vw::ip::match_filename(opt.out_prefix, \"L.tif\", \"R.tif\",\n                                                          matches_as_txt);\n  if (match_filename != aligned_match_file)\n    align_ip(opt.session->tx_left(), opt.session->tx_right(), in_left_ip, in_right_ip);\n  \n  // Camera models\n  boost::shared_ptr<camera::CameraModel> left_camera_model, right_camera_model;\n  opt.session->camera_models(left_camera_model, right_camera_model);\n\n  // Filter out IPs which fall outside the specified elevation range\n  // TODO(oalexan1): This must go to stereo_pprc.\n  if (!stereo_settings().correlator_mode && opt.session->have_datum()) {\n    bool use_sphere_for_non_earth = true;\n    cartography::Datum datum = opt.session->get_datum(left_camera_model.get(),\n                                                      use_sphere_for_non_earth);\n    // Set up the transforms before the call to avoid indeterminate behavior\n    auto tx_left = opt.session->tx_left(); \n    auto tx_right = opt.session->tx_right();\n    asp::filter_ip_by_lonlat_and_elevation(tx_left, tx_right, \n                                           left_camera_model.get(),\n                                           right_camera_model.get(),\n                                           datum, in_left_ip, in_right_ip,\n                                           stereo_settings().elevation_limit,\n                                           stereo_settings().lon_lat_limit,\n                                           matched_left_ip, matched_right_ip);\n  } else {\n    // No cameras in this mode\n    matched_left_ip = in_left_ip;\n    matched_right_ip = in_right_ip;\n  }\n\n  // TODO(oalexan1): Consider adding filter_ip_using_cameras().\n  // Note that D_sub later on already filters based on cameras.\n  Vector2 disp_params = stereo_settings().outlier_removal_params;\n  bool quiet = false;\n  if (disp_params[0] < 100.0)\n    asp::filter_ip_by_disparity(disp_params[0], disp_params[1], quiet,\n                                matched_left_ip, matched_right_ip); \n\n  // Filter ip using DEM\n  if (stereo_settings().ip_filter_using_dem != \"\" &&\n      !stereo_settings().correlator_mode          &&\n      opt.session->have_datum()) {\n    auto tx_left = opt.session->tx_left();\n    auto tx_right = opt.session->tx_right();\n    ip_filter_using_dem(stereo_settings().ip_filter_using_dem,  \n                        tx_left, tx_right,\n                        left_camera_model, right_camera_model,  \n                        matched_left_ip,  matched_right_ip);\n  }\n  \n  // Quit if we don't have the requested number of IP.\n  if (static_cast<int>(matched_left_ip.size()) < stereo_settings().min_num_ip)\n    vw_throw(ArgumentErr() << \"Number of IPs left after filtering is \" \n             << matched_left_ip.size()\n             << \" which is less than the required amount of \" \n             << stereo_settings().min_num_ip << \". Aborting stereo_corr.\\n\"\n             << \" - Consider removing the run directory and restarting stereo,\\n\"\n             << \"   while setting --ip-per-tile 200 or some other larger number.\\n\"\n             << \" - Consider decreasing --min-num-ip to accept these matches.\\n\"\n             << \" - Check if your input images are similar enough in illumination\\n\"\n             << \"   and if they have enough overlap.\\n\");\n  \n  // Find search window based on interest point matches\n  size_t num_ip = matched_left_ip.size();\n  vw_out(InfoMessage, \"asp\") << \"Estimating search range with \" \n                             << num_ip << \" interest points.\\n\";\n\n  // Record the disparities for each point pair\n  const double BIG_NUM   =  99999999;\n  const double SMALL_NUM = -99999999;\n  std::vector<double> dx, dy;\n  double min_dx = BIG_NUM, max_dx = SMALL_NUM,\n    min_dy = BIG_NUM, max_dy = SMALL_NUM;\n  for (size_t i = 0; i < num_ip; i++) {\n    \n    double diffX = matched_right_ip[i].x - matched_left_ip[i].x;\n    double diffY = matched_right_ip[i].y - matched_left_ip[i].y;\n    dx.push_back(diffX);\n    dy.push_back(diffY);\n    if (diffX < min_dx) min_dx = diffX;\n    if (diffY < min_dy) min_dy = diffY;\n    if (diffX > max_dx) max_dx = diffX;\n    if (diffY > max_dy) max_dy = diffY;\n  }\n\n  BBox2 search_range(Vector2(min_dx, min_dy), Vector2(max_dx, max_dy));\n  vw_out(InfoMessage,\"asp\") << \"Initial search range: \" << search_range << std::endl;\n\n  const int MAX_SEARCH_WIDTH = 4000; // Try to avoid searching this width\n  const int MIN_SEARCH_WIDTH = 200;  // Under this width don't filter IP.\n  const Vector2i MINIMAL_EXPAND(10,1);\n\n  // If the input search range is too small, expand it a little. Likely there\n  // are not enough interest points to find it accurately.\n  bool filter_using_histogram = true;\n  if (std::max(search_range.width(), search_range.height()) <= MIN_SEARCH_WIDTH) {\n    search_range.min() -= MINIMAL_EXPAND; // BBox2.expand() function does not always work!!!!\n    search_range.max() += MINIMAL_EXPAND;\n    vw_out(InfoMessage, \"asp\") << \"Using expanded search range: \" << search_range << \"\\n\";\n    filter_using_histogram = false; // histogram filtering can be too aggressive\n  }\n\n  if (filter_using_histogram) {\n    // Compute histograms\n    const int NUM_BINS = 1000000; // Accuracy is important with scaled pixels\n    vw::math::Histogram hist_x(NUM_BINS, min_dx, max_dx);\n    vw::math::Histogram hist_y(NUM_BINS, min_dy, max_dy);\n    for (size_t i = 0; i < dx.size(); ++i){\n      hist_x.add_value(dx[i]);\n      hist_y.add_value(dy[i]);\n    }\n\n    // Gradually increase the filtering\n    const double PERCENTILE_CUTOFF = 1.0 - stereo_settings().outlier_removal_params[0]/100.0;\n    double search_scale = (2.0/3.0) * stereo_settings().outlier_removal_params[1]; // for bwd compat\n    const double PERCENTILE_CUTOFF_INC = 0.05; //  until the search width is reasonable.\n    const double MAX_PERCENTILE_CUTOFF = 0.201;\n\n    double current_percentile_cutoff = PERCENTILE_CUTOFF;\n    int search_width = MAX_SEARCH_WIDTH + 1;\n    while (current_percentile_cutoff > 0.0) { // no point in using a 0 cutoff\n      // Remove some outliers based on histogram and then multiply by a factor.\n      // This can be an overestimate.\n      BBox2 hist_search_range\n        = get_search_range_from_ip_hists(hist_x, hist_y, current_percentile_cutoff,\n                                         search_scale);\n\n      // Use the hist_search_range to perhaps narrow down the search range\n      search_range.crop(hist_search_range);\n\n      vw_out() << \"Refined search range using a histogram and --outlier-removal-params: \"\n               << search_range << \"\\n\";\n    \n      search_width = search_range.width();\n    \n      // Increase the percentile cutoff in case we need to filter out more IP\n      current_percentile_cutoff += PERCENTILE_CUTOFF_INC;\n      if (current_percentile_cutoff > MAX_PERCENTILE_CUTOFF) {\n        if (search_width < MAX_SEARCH_WIDTH)\n          vw_out() << \"Exceeded maximum filter cutoff of \" << MAX_PERCENTILE_CUTOFF\n                   << \", keeping current search range\\n\";\n        break; // No more filtering is possible, exit the loop.\n      }\n      \n      if (search_width < MAX_SEARCH_WIDTH)\n        break; // Happy with search range, exit the loop.\n      else\n        vw_out() << \"Search width of \" << search_width << \" is greater than desired limit of \"\n                 << MAX_SEARCH_WIDTH << \", retrying with more aggressive IP filter.\\n\";\n    } // End search range determination loop\n  }\n  \n  if (stereo_settings().max_disp_spread > 0.0) {\n    BBox2 spread_box = search_range_using_spread(stereo_settings().max_disp_spread,\n                                                 matched_left_ip, matched_right_ip);\n    search_range.crop(spread_box); // Need this because spread_box may be an overestimate\n    vw_out() << \"Refined search range using --max-disp-spread: \" << search_range << \"\\n\";\n  }\n  \n  // Prevent any dimension from being length zero, otherwise future parts to ASP will fail.\n  // TODO(oalexan1): Fix ASP and SGM handling of small boxes.\n  // The issue is that a box with one point is considered empty.\n  // See BBox.h.\n  // Currently code has a minimum search height of 5!\n  if (search_range.empty())\n    vw_throw(ArgumentErr() << \"Computed an empty search range!\");\n  \n  return search_range;\n} // End function approximate_search_range\n\n/// The first step of correlation computation.\nvoid lowres_correlation(ASPGlobalOptions & opt) {\n\n  vw_out() << \"\\n[ \" << current_posix_time_string()\n           << \" ]: Stage 1 --> LOW-RESOLUTION CORRELATION\\n\";\n\n  bool crop_left  = (stereo_settings().left_image_crop_win  != BBox2i(0, 0, 0, 0));\n  bool crop_right = (stereo_settings().right_image_crop_win != BBox2i(0, 0, 0, 0));\n\n  // Working out search range if need be\n  if (stereo_settings().is_search_defined()) {\n    vw_out() << \"\\t--> Using user-defined search range: \" \n      << stereo_settings().search_range << \"\\n\";\n\n    // Update user provided search range based on input crops\n    if (crop_left && !crop_right)\n      stereo_settings().search_range += stereo_settings().left_image_crop_win.min();\n    if (!crop_left && crop_right)\n      stereo_settings().search_range -= stereo_settings().right_image_crop_win.min();\n\n  } else if (stereo_settings().seed_mode == 2) {\n    // Do nothing as we will compute the search range based on D_sub\n  } else if (stereo_settings().seed_mode == 3) {\n    // Do nothing as low-res disparity (D_sub) is already provided by sparse_disp\n  } else { // Regular seed mode. Also arrives here fro seed-mode 0. See note in caller.\n\n    // Load IP from disk\n    std::string match_filename;\n    bool matches_as_txt = stereo_settings().matches_as_txt;\n    bool have_aligned_matches = (stereo_settings().alignment_method == \"none\" ||\n                                  stereo_settings().alignment_method == \"epipolar\");\n    if (have_aligned_matches)\n      match_filename = vw::ip::match_filename(opt.out_prefix, \"L.tif\", \"R.tif\",\n                                              matches_as_txt);\n    else\n      match_filename = asp::stereoMatchFile(opt.session->left_cropped_image(crop_left),\n                                            opt.session->right_cropped_image(crop_right),\n                                            opt.out_prefix, matches_as_txt);\n    // The interest points must exist by now\n    if (!fs::exists(match_filename))\n      vw_throw(ArgumentErr() << \"Missing IP matches file: \" << match_filename);\n      \n      // This function applies filtering to find good points\n      stereo_settings().search_range = approximate_search_range(opt, match_filename);\n\n  } // End of case where we had to calculate the search range\n\n  // If the user specified a search range limit, apply it here.\n  if ((stereo_settings().corr_search_limit.min() != Vector2i()) || \n      (stereo_settings().corr_search_limit.max() != Vector2i())) {     \n    stereo_settings().search_range.crop(stereo_settings().corr_search_limit);\n    vw_out() << \"\\t--> Search range constrained to: \"\n             << stereo_settings().search_range << \"\\n\";\n  }\n\n  // At this point stereo_settings().search_range is populated\n\n  DiskImageView<vw::uint8> Lmask(opt.out_prefix + \"-lMask.tif\"),\n    Rmask(opt.out_prefix + \"-rMask.tif\");\n\n  // Performing disparity on sub images\n  if (stereo_settings().seed_mode > 0) {\n\n    // Reuse prior existing D_sub if it exists, unless we\n    // are cropping the images each time, when D_sub must\n    // be computed anew each time.\n    bool crop_left  = (stereo_settings().left_image_crop_win  != BBox2i(0, 0, 0, 0));\n    bool crop_right = (stereo_settings().right_image_crop_win != BBox2i(0, 0, 0, 0));\n    \n    std::string sub_disp_file = opt.out_prefix + \"-D_sub.tif\";\n\n    // Also need to rebuild if the inputs changed after the mask files were produced.\n    bool inputs_changed = (!first_is_newer(sub_disp_file, opt.in_file1,  opt.in_file2,\n                                           opt.cam_file1, opt.cam_file2));\n\n    bool rebuild = crop_left || crop_right || inputs_changed || \n                   (asp::stereo_settings().max_disp_spread > 0.0);\n\n    try {\n      vw_log().console_log().rule_set().add_rule(-1,\"fileio\");\n      if (!fs::exists(sub_disp_file)) // Check for existence, or else an error will be printed \n        rebuild = true;\n      else\n        DiskImageView<PixelMask<Vector2f>> test(sub_disp_file);\n      vw_settings().reload_config();\n    } catch (vw::IOErr const& e) {\n      vw_settings().reload_config();\n      rebuild = true;\n    } catch (vw::ArgumentErr const& e) {\n      // Throws on a corrupted file.\n      vw_settings().reload_config();\n      rebuild = true;\n    }\n\n    if (rebuild) {\n      // It will be rebuilt except for seed-mode 3 when sparse_disp takes care of it.\n      produce_lowres_disparity(opt);\n    } else {\n      vw_out() << \"\\t--> Using cached low-resolution disparity: \" << sub_disp_file << \"\\n\";\n    }\n  }\n\n  vw_out() << \"\\n[ \" << current_posix_time_string()\n           << \" ]: LOW-RESOLUTION CORRELATION FINISHED\\n\";\n} // End lowres_correlation\n\n/// This correlator takes a low resolution disparity image as an input\n/// so that it may narrow its search range for each tile that is processed.\nclass SeededCorrelatorView: public ImageViewBase<SeededCorrelatorView> {\n  ImageViewRef<PixelGray<float>>   m_left_image;\n  ImageViewRef<PixelGray<float>>   m_right_image;\n  ImageViewRef<vw::uint8> m_left_mask;\n  ImageViewRef<vw::uint8> m_right_mask;\n  DispImageRef m_sub_disp;\n  DispImageRef m_sub_disp_spread;\n  ImageView<PixelMask<float>> * m_lr_disp_diff;\n\n  // Settings\n  Vector2  m_upscale_factor;\n  BBox2i   m_seed_bbox;\n  Vector2i m_kernel_size;\n  stereo::CostFunctionType m_cost_mode;\n  int      m_corr_timeout;\n  double   m_seconds_per_op;\n  Vector2  m_region_ul; // the upper-left corner of the region containing all pixels to process\npublic:\n\n  // Set these input types here instead of making them template arguments\n  typedef ImageViewRef<PixelGray<float>>    ImageType;\n  typedef ImageViewRef<vw::uint8>           MaskType;\n  typedef ImageType::pixel_type InputPixelType;\n\n  SeededCorrelatorView(ImageType             const& left_image,\n                       ImageType             const& right_image,\n                       MaskType              const& left_mask,\n                       MaskType              const& right_mask,\n                       DispImageRef          const& sub_disp,\n                       DispImageRef          const& sub_disp_spread,\n                       Vector2i              const& kernel_size,\n                       stereo::CostFunctionType cost_mode,\n                       int corr_timeout, double seconds_per_op,\n                       Vector2i const& region_ul,\n                       ImageView<PixelMask<float>> * lr_disp_diff):\n    m_left_image(left_image.impl()), m_right_image(right_image.impl()),\n    m_left_mask (left_mask.impl ()), m_right_mask (right_mask.impl ()),\n    m_sub_disp(sub_disp.impl()), m_sub_disp_spread(sub_disp_spread.impl()),\n    m_kernel_size(kernel_size),  m_cost_mode(cost_mode),\n    m_corr_timeout(corr_timeout), m_seconds_per_op(seconds_per_op),\n    m_region_ul(region_ul), m_lr_disp_diff(lr_disp_diff) {\n    m_upscale_factor[0] = double(m_left_image.cols()) / m_sub_disp.cols();\n    m_upscale_factor[1] = double(m_left_image.rows()) / m_sub_disp.rows();\n    m_seed_bbox = bounding_box(m_sub_disp);\n  }\n\n  // Image View interface\n  typedef PixelMask<Vector2f> pixel_type;\n  typedef pixel_type          result_type;\n  typedef ProceduralPixelAccessor<SeededCorrelatorView> pixel_accessor;\n\n  inline int32 cols  () const { return m_left_image.cols(); }\n  inline int32 rows  () const { return m_left_image.rows(); }\n  inline int32 planes() const { return 1; }\n\n  inline pixel_accessor origin() const { return pixel_accessor(*this, 0, 0); }\n\n  inline pixel_type operator()(double /*i*/, double /*j*/, int32 /*p*/ = 0) const {\n    vw_throw(NoImplErr() << \"SeededCorrelatorView::operator()(...) is not implemented\");\n    return pixel_type();\n  }\n\n  /// Does the work\n  typedef CropView<ImageView<pixel_type>> prerasterize_type;\n  inline prerasterize_type prerasterize(BBox2i const& bbox) const {\n\n    vw::stereo::CorrelationAlgorithm stereo_alg\n      = asp::stereo_alg_to_num(stereo_settings().stereo_algorithm);\n    \n    // User strategies\n    BBox2 local_search_range;\n    if (stereo_settings().seed_mode > 0) {\n\n      // The low-res version of bbox\n      BBox2i seed_bbox(elem_quot(bbox.min(), m_upscale_factor),\n                       elem_quot(bbox.max(), m_upscale_factor));\n      seed_bbox.expand(1);\n      seed_bbox.crop(m_seed_bbox);\n      // Get the disparity range in d_sub corresponding to this tile.\n      VW_OUT(DebugMessage, \"stereo\") \n        << \"\\nGetting disparity range for : \" << seed_bbox << \"\\n\";\n      DispImageRef disparity_in_box = crop(m_sub_disp, seed_bbox);\n\n      local_search_range = stereo::get_disparity_range(disparity_in_box);\n\n      bool has_sub_disp_spread = (m_sub_disp_spread.cols() != 0 &&\n                                  m_sub_disp_spread.rows() != 0);\n      // Sanity check: If m_sub_disp_spread was provided, it better have the same size as sub_disp.\n      if (has_sub_disp_spread &&\n          m_sub_disp_spread.cols() != m_sub_disp.cols() &&\n          m_sub_disp_spread.rows() != m_sub_disp.rows()){\n        vw_throw(ArgumentErr() << \"D_sub and D_sub_spread must have equal sizes.\\n\");\n      }\n\n      if (has_sub_disp_spread) {\n        // Expand the disparity range by m_sub_disp_spread.\n        DispImageRef spread_in_box = crop(m_sub_disp_spread, seed_bbox);\n        BBox2 spread = stereo::get_disparity_range(spread_in_box);\n        // The spread may be negative if the box is empty\n        spread.max()[0] = std::max(spread.max()[0], 0.0); \n        spread.max()[1] = std::max(spread.max()[1], 0.0);\n        local_search_range.min() -= spread.max();\n        local_search_range.max() += spread.max();\n      } //endif has_sub_disp_spread\n\n      local_search_range = grow_bbox_to_int(local_search_range);\n      // Expand local_search_range by 1. This is necessary since\n      // m_sub_disp is integer-valued, and perhaps the search\n      // range was supposed to be a fraction of integer bigger.\n      local_search_range.expand(1);\n\n      // Scale the search range to full-resolution\n      local_search_range.min() = floor(elem_prod(local_search_range.min(),m_upscale_factor));\n      local_search_range.max() = ceil (elem_prod(local_search_range.max(),m_upscale_factor));\n\n      // If the user specified a search range limit, apply it here.\n      if ((stereo_settings().corr_search_limit.min() != Vector2i()) || \n          (stereo_settings().corr_search_limit.max() != Vector2i())) {     \n        local_search_range.crop(stereo_settings().corr_search_limit);\n        vw_out() << \"\\t--> Local search range constrained to: \"\n                 << local_search_range << \"\\n\";\n      }\n    } else { // seed mode == 0\n      local_search_range = stereo_settings().search_range;\n    }\n\n    SemiGlobalMatcher::SgmSubpixelMode sgm_subpixel_mode = get_sgm_subpixel_mode();\n    Vector2i sgm_search_buffer = stereo_settings().sgm_search_buffer;\n\n    // Now we are ready to actually perform correlation. \n    const int rm_half_kernel = 5; // Filter kernel size used by CorrelationView\n    vw::stereo::PrefilterModeType prefilter_mode =\n      static_cast<vw::stereo::PrefilterModeType>(stereo_settings().pre_filter_mode);\n    DispImageRef disparity_map\n      = stereo::pyramid_correlate(m_left_image,   m_right_image,\n                                  m_left_mask,    m_right_mask,\n                                  prefilter_mode,\n                                  stereo_settings().slogW,\n                                  local_search_range,\n                                  m_kernel_size,  m_cost_mode,\n                                  m_corr_timeout, m_seconds_per_op,\n                                  stereo_settings().xcorr_threshold,\n                                  stereo_settings().min_xcorr_level,\n                                  rm_half_kernel,\n                                  stereo_settings().corr_max_levels,\n                                  stereo_alg,\n                                  stereo_settings().sgm_collar_size,\n                                  sgm_subpixel_mode, sgm_search_buffer,\n                                  stereo_settings().corr_memory_limit_mb,\n                                  stereo_settings().corr_blob_filter_area,\n                                  m_lr_disp_diff, m_region_ul, \n                                  stereo_settings().stereo_debug);\n\n    // Crop the disparity to given box, bringing all the computation in the box\n    // in memory. \n    ImageView<pixel_type> cropped_disp = crop(disparity_map, bbox);\n\n    // Place the result in the appropriate place in the virtual image\n    return CropView<ImageView<result_type>>(cropped_disp,\n                                            -bbox.min().x(), -bbox.min().y(),\n                                            cols(), rows());\n  } // End function prerasterize_helper\n\n  template <class DestT>\n  inline void rasterize(DestT const& dest, BBox2i bbox) const {\n    vw::rasterize(prerasterize(bbox), dest, bbox);\n  }\n}; // End class SeededCorrelatorView\n\n/// Stereo correlation function using ASP's block-matching and MGM/SGM\n/// algorithms which can handle a 2D disparity.\nvoid stereo_correlation_2D(ASPGlobalOptions& opt) {\n\n  // The first thing we will do is compute the low-resolution correlation.\n\n  // Note that even when we are told to skip low-resolution correlation,\n  // we must still go through the motions when seed_mode is 0, to be\n  // able to get a search range, even though we don't write D_sub then.\n  if (!stereo_settings().skip_low_res_disparity_comp || stereo_settings().seed_mode == 0)\n    lowres_correlation(opt);\n\n  if (stereo_settings().compute_low_res_disparity_only) \n    return; // Just computed the low-res disparity, so quit.\n\n  std::string d_sub_file  = opt.out_prefix + \"-D_sub.tif\";\n  std::string spread_file = opt.out_prefix + \"-D_sub_spread.tif\";\n\n  // Load D_sub\n  ImageView<PixelMask<Vector2f>> sub_disp;\n  vw::Vector2 upsample_scale;\n  if (stereo_settings().seed_mode > 0)\n    load_D_sub_and_scale(opt.out_prefix, d_sub_file, sub_disp, upsample_scale);\n  \n  // Load D_sub_spread\n  DispImageRef sub_disp_spread;\n  if (stereo_settings().seed_mode == 2 ||  stereo_settings().seed_mode == 3) {\n    // D_sub_spread is mandatory for seed_mode 2 and 3.\n    sub_disp_spread = DiskImageView<PixelMask<Vector2f>>(spread_file);\n  } else if (stereo_settings().seed_mode == 1) {\n    // D_sub_spread is optional for seed_mode 1, we use it only if it is provided.\n    if (fs::exists(spread_file)) {\n      try {\n        sub_disp_spread = DiskImageView<PixelMask<Vector2f>>(spread_file);\n      }\n      catch (...) {}\n    }\n  }\n\n  // If the user set --max-disp-spread, filter by it again in each process,\n  // as maybe the D_sub on disk was from an older run with this filter not\n  // applied.\n  if (asp::stereo_settings().seed_mode > 0 && asp::stereo_settings().max_disp_spread > 0.0)\n    asp::dispSpreadFilter(sub_disp, asp::stereo_settings().max_disp_spread, upsample_scale);\n    \n  bool verbose = false; // We already printed the message above\n  read_search_range_from_D_sub(sub_disp, upsample_scale, verbose);\n\n  // If the user specified a search range limit, apply it here.\n  if ((stereo_settings().corr_search_limit.min() != Vector2i()) || \n      (stereo_settings().corr_search_limit.max() != Vector2i())) {     \n    stereo_settings().search_range.crop(stereo_settings().corr_search_limit);\n    vw_out() << \"\\t--> Detected search range constrained to: \"\n             << stereo_settings().search_range << \"\\n\";\n  }\n\n  // Load data for full-resolution processing\n  std::string left_image_file = opt.out_prefix + \"-L.tif\";\n  std::string right_image_file = opt.out_prefix + \"-R.tif\";\n  \n  boost::shared_ptr<DiskImageResource>\n    left_rsrc (vw::DiskImageResourcePtr(left_image_file)),\n    right_rsrc(vw::DiskImageResourcePtr(right_image_file));\n\n  // Load the normalized images.\n  DiskImageView<PixelGray<float>> left_disk_image(left_rsrc), right_disk_image(right_rsrc);\n  \n  DiskImageView<vw::uint8> Lmask(opt.out_prefix + \"-lMask.tif\"),\n    Rmask(opt.out_prefix + \"-rMask.tif\");\n  \n  stereo::CostFunctionType cost_mode = get_cost_mode_value();\n  Vector2i kernel_size = stereo_settings().corr_kernel;\n  BBox2i left_trans_crop_win = stereo_settings().trans_crop_win;\n  int corr_timeout   = stereo_settings().corr_timeout;\n  double seconds_per_op = 0.0;\n  if (corr_timeout > 0)\n    seconds_per_op = calc_seconds_per_op(cost_mode, kernel_size);\n\n  // Prepare for saving the LR to RL disparity difference.\n  ImageView<PixelMask<float>> * lr_disp_diff_ptr = NULL;\n  ImageView<PixelMask<float>> lr_disp_diff;\n  Vector2i region_ul = left_trans_crop_win.min();\n  if (stereo_settings().save_lr_disp_diff) {\n    // This image is allocated fully in memory, so need to check if it fits.\n    if (left_trans_crop_win.width() > 20000 || left_trans_crop_win.height() > 20000)\n      vw_throw(ArgumentErr() << \"Detected an unreasonably large image. Use \"\n               << \"parallel_stereo (with reasonably-sized tiles) if desired to invoke \"\n               << \"--save-left-right-disparity-difference.\\n\");\n    \n    lr_disp_diff.set_size(left_trans_crop_win.width(), left_trans_crop_win.height());\n    for (int col = 0; col < lr_disp_diff.cols(); col++) {\n      for (int row = 0; row < lr_disp_diff.rows(); row++) {\n        lr_disp_diff(col, row) = 0;\n        lr_disp_diff(col, row).invalidate();\n      }\n    }\n    lr_disp_diff_ptr = &lr_disp_diff;\n  }\n\n  // Set up the reference to the stereo disparity code\n  // - Processing is limited to left_trans_crop_win for use with parallel_stereo.\n  DispImageRef fullres_disparity =\n    crop(SeededCorrelatorView(left_disk_image, right_disk_image, Lmask, Rmask,\n                              sub_disp, sub_disp_spread, kernel_size, \n                              cost_mode, corr_timeout, seconds_per_op,\n                              region_ul, lr_disp_diff_ptr), \n         left_trans_crop_win);\n\n  // With SGM, we must do the entire image chunk as one\n  // tile. Otherwise, if it gets done in smaller tiles, there will be\n  // artifacts at tile boundaries.\n  vw::stereo::CorrelationAlgorithm stereo_alg\n    = asp::stereo_alg_to_num(stereo_settings().stereo_algorithm);\n  \n  bool using_sgm = (stereo_alg > vw::stereo::VW_CORRELATION_BM &&\n                    stereo_alg < vw::stereo::VW_CORRELATION_OTHER);\n  if (using_sgm) {\n    Vector2i image_size = bounding_box(fullres_disparity).size();\n    int max_dim = std::max(image_size[0], image_size[1]);\n    if (stereo_settings().corr_tile_size_ovr < max_dim)\n      vw_throw(ArgumentErr()\n               << \"Error: SGM processing is not permitted with \"\n               << \"a tile size smaller than the image!\\n\"\n               << \"Value of --corr-tile-size is \" << stereo_settings().corr_tile_size_ovr\n               << \" but image size is \" << image_size << \".\\n\" \n               << \"Increase --corr-tile-size so the entire image fits in one tile, or \"\n               << \"use parallel_stereo. Note that making --corr-tile-size \"\n               << \"larger than 9000 or so may cause GDAL to crash.\\n\\n\");\n  }\n\n  // Provide the user with some feedback of what we are actually going to use.\n  // This does not make sense for local_epipolar alignment.\n  if (stereo_settings().alignment_method != \"local_epipolar\") {\n    vw_out() << \"\\t--------------------------------------------------\\n\";\n    vw_out() << \"\\t   Kernel size:    \" << stereo_settings().corr_kernel << \"\\n\";\n    vw_out() << \"\\t   Search range:   \" << stereo_settings().search_range << \"\\n\";\n    vw_out() << \"\\t   Cost mode:      \" << stereo_settings().cost_mode << \"\\n\";\n    vw_out(DebugMessage) << \"\\t   XCorr threshold: \"\n                         << stereo_settings().xcorr_threshold << \"\\n\";\n    vw_out(DebugMessage) << \"\\t   Prefilter:       \"\n                           << stereo_settings().pre_filter_mode << \"\\n\";\n    vw_out(DebugMessage) << \"\\t   Prefilter size:  \"\n                         << stereo_settings().slogW << \"\\n\";\n    vw_out() << \"\\t--------------------------------------------------\\n\";\n  }\n  \n  cartography::GeoReference left_georef;\n  bool   has_left_georef = read_georeference(left_georef,  opt.out_prefix + \"-L.tif\");\n  bool   has_nodata      = false;\n  double nodata          = -32768.0;\n\n  std::string d_file = opt.out_prefix + \"-D.tif\";\n  vw_out() << \"Writing: \" << d_file << \"\\n\";\n  auto tpc = TerminalProgressCallback(\"asp\", \"\\t--> Correlation :\");\n\n  if (stereo_alg > vw::stereo::VW_CORRELATION_BM) {\n    // SGM and external algorithms perform subpixel correlation in\n    // this step, so write out floats.\n    \n    // Rasterize the image first as one block, then write it out using multiple small blocks.\n    // - If we don't do this, the output image file is not tiled and handles very slowly.\n    // - This is possible because with SGM the image must be small enough to fit in memory.\n    ImageView<PixelMask<Vector2f>> result = fullres_disparity;\n    opt.raster_tile_size = Vector2i(ASPGlobalOptions::rfne_tile_size(), // small block size\n                                    ASPGlobalOptions::rfne_tile_size());\n    vw::cartography::block_write_gdal_image(d_file, result,\n                                            has_left_georef, left_georef,\n                                            has_nodata, nodata, opt, tpc);\n\n  } else {\n    // Otherwise cast back to integer results to save on storage space.\n    vw::cartography::block_write_gdal_image(d_file, \n                                            pixel_cast<PixelMask<Vector2i>>(fullres_disparity),\n                                            has_left_georef, left_georef,\n                                            has_nodata, nodata, opt, tpc);\n  }\n\n  if (stereo_settings().save_lr_disp_diff) {\n    bool has_lr_disp_nodata = true;\n    float lr_disp_nodata = -32768.0;\n    std::string lr_disp_diff_file = opt.out_prefix + \"-L-R-disp-diff.tif\";\n    vw_out() << \"Writing: \" << lr_disp_diff_file << \"\\n\";\n    opt.raster_tile_size = Vector2i(ASPGlobalOptions::rfne_tile_size(), // small block size\n                                    ASPGlobalOptions::rfne_tile_size());\n    auto tpc = TerminalProgressCallback(\"asp\", \"\\t--> L-R-disp-diff :\");\n    vw::cartography::block_write_gdal_image(lr_disp_diff_file,\n                                            apply_mask(lr_disp_diff, lr_disp_nodata),\n                                            has_left_georef, left_georef,\n                                            has_lr_disp_nodata, lr_disp_nodata, opt, tpc);\n  }\n  \n  return;\n} // End function stereo_correlation_2D\n\n// Adjust for the fact that tile_crop_win may not be the same as left_trans_crop_win.\ntemplate <class PixelT>\nvoid adjustForCropWin(ImageView<PixelMask<PixelT>> const& input_img,\n                      BBox2i const& tile_crop_win,\n                      BBox2i const& left_trans_crop_win,\n                      ImageView<PixelMask<PixelT>>& out_img) {\n\n  out_img = vw::ImageView<PixelMask<PixelT>>(tile_crop_win.width(), tile_crop_win.height());\n  \n  for (int col = 0; col < tile_crop_win.width(); col++) {\n    for (int row = 0; row < tile_crop_win.height(); row++) {\n      Vector2 pix = Vector2(col, row) + tile_crop_win.min();\n      if (left_trans_crop_win.contains(pix)) {\n        out_img(col, row)\n          = input_img(pix.x() - left_trans_crop_win.min().x(),\n                      pix.y() - left_trans_crop_win.min().y());\n      } else {\n        out_img(col, row) = PixelMask<PixelT>();\n        out_img(col, row).invalidate();\n      }\n    }\n  }\n}\n\n// A small function we will invoke repeatedly to save the disparity\nvoid save_disparity(ASPGlobalOptions& opt,\n                    ImageView<PixelMask<Vector2f>> unaligned_disp_2d,\n                    std::string const& out_disp_file) {\n  \n  vw::cartography::GeoReference georef;\n  bool   has_georef  = false;\n  bool   has_nodata  = false;\n  double nodata      = -32768.0;\n  vw_out() << \"Writing: \" << out_disp_file << \"\\n\";\n  opt.raster_tile_size = Vector2i(ASPGlobalOptions::rfne_tile_size(),\n                                  ASPGlobalOptions::rfne_tile_size());\n  opt.gdal_options[\"TILED\"] = \"YES\";\n  vw::cartography::block_write_gdal_image(out_disp_file, unaligned_disp_2d,\n                                          has_georef, georef,\n                                          has_nodata, nodata, opt,\n                                          TerminalProgressCallback\n                                          (\"asp\", \"\\t--> Correlation :\"));\n}\n\n// A small function to save the l-r-diff file\nvoid save_lr_disp_diff(ASPGlobalOptions& opt,\n                    vw::ImageView<vw::PixelMask<float>> unaligned_lr_disp_diff,\n                    std::string const& lr_disp_diff_file) {\n  \n  vw::cartography::GeoReference georef;\n  bool  has_georef  = false;\n  bool  has_lr_disp_nodata = true;\n  float lr_disp_nodata = -32768.0;\n  vw_out() << \"Writing: \" << lr_disp_diff_file << \"\\n\";\n  opt.raster_tile_size = Vector2i(ASPGlobalOptions::rfne_tile_size(), // small block size\n                                  ASPGlobalOptions::rfne_tile_size());\n  opt.gdal_options[\"TILED\"] = \"YES\";\n  auto tpc = TerminalProgressCallback(\"asp\", \"\\t--> L-R-disp-diff :\");\n  vw::cartography::block_write_gdal_image(lr_disp_diff_file,\n                                          apply_mask(unaligned_lr_disp_diff, lr_disp_nodata),\n                                          has_georef, georef,\n                                          has_lr_disp_nodata, lr_disp_nodata, \n                                          opt, tpc);\n}\n\n// Write an empty disparity of given dimensions\nvoid save_empty_disparity(ASPGlobalOptions& opt,\n                          vw::BBox2i const& crop_win,\n                          std::string const& out_disp_file) {\n\n  vw::ImageView<PixelMask<Vector2f>> disp;\n  disp.set_size(crop_win.width(), crop_win.height());\n  \n  for (int col = 0; col < disp.cols(); col++) {\n    for (int row = 0; row < disp.rows(); row++) {\n      disp(col, row) = PixelMask<Vector2f>();\n      disp(col, row).invalidate();\n    }\n  }\n\n  save_disparity(opt, disp, out_disp_file);\n}\n                    \n/// Stereo correlation function using 1D correlation algorithms\n/// (implemented in ASP and external ones). Local alignment will be\n/// performed before those algorithms are invoked.\n// TODO(oalexan1): This function is too long and needs to be split.\nvoid stereo_correlation_1D(ASPGlobalOptions& opt) {\n\n  // The low-res disparity computation, if desired, happens on the full images,\n  // which is incompatible with local alignment and stereo for pairs of tiles.\n  if (stereo_settings().compute_low_res_disparity_only) \n    return;\n  \n  // The dimensions of the tile and the final disparity\n  BBox2i tile_crop_win = stereo_settings().trans_crop_win;\n\n  // The left_trans_crop_win will be obtained by tile_crop_win by maybe growing it a bit\n  BBox2i left_trans_crop_win, right_trans_crop_win;\n  int max_tile_size = stereo_settings().corr_tile_size_ovr;\n  Matrix<double> left_local_mat  = math::identity_matrix<3>();\n  Matrix<double> right_local_mat = math::identity_matrix<3>();\n  std::string left_aligned_file, right_aligned_file;\n  int min_disp = -1, max_disp = -1;\n  std::string out_disp_file = opt.out_prefix + \"-D.tif\";\n\n  // Ensure the disparity is always recreated\n  if (fs::exists(out_disp_file)) \n    fs::remove(out_disp_file);  \n\n  std::string alg_name, user_opts;\n  asp::parse_stereo_alg_name_and_opts(stereo_settings().stereo_algorithm,  \n                                      alg_name, user_opts);\n  vw_out() << \"Using algorithm: \" << alg_name << std::endl;\n\n  // The msmw and msmw2 algorithms expects the input tif images to not\n  // be tiled.  Accommodate it, then revert to the original when this\n  // is no longer necessary.\n  Vector2 orig_tile_size = opt.raster_tile_size;\n  bool write_nodata = true;\n  if (alg_name == \"msmw\" || alg_name == \"msmw2\") {\n    opt.gdal_options[\"TILED\"] = \"NO\";\n    opt.raster_tile_size = vw::Vector2(-1, -1);\n    write_nodata = false; // To avoid warnings from the tif reader in msmw\n  }\n\n  double left_extra_factor = 1.0, right_extra_factor = 1.0;\n  bool success = false;\n  std::string err_msg;\n  boost::shared_ptr<camera::CameraModel> left_camera_model, right_camera_model;\n  opt.session->camera_models(left_camera_model, right_camera_model);\n  bool use_sphere_for_non_earth = true;\n  cartography::Datum datum = opt.session->get_datum(left_camera_model.get(),\n                                                    use_sphere_for_non_earth);\n  for (int attempt  = 1; attempt <= 1; attempt++) {\n    // TODO(oalexan1): The idea of the expansion of the domains need more thinking.\n    // In particular, need to proportionally expand how many interest points are\n    // found, as otherwise, if the density of interest points is different\n    // among the left and right images, the number of successful matches\n    // will actually go down. In either case, need to try without expansion\n    // first and only expand in subsequent attempts. A first attempt at\n    // expansion should expand the right box, in case it is not found\n    // accurately based on input disparity and interest points.\n    //if (attempt == 2) {\n    //   vw_out() << \"Local alignment attempt: \" << attempt << \".\\n\";\n    //  left_extra_factor = 1.0;\n    //  right_extra_factor = 2.0;\n    // }\n    try {\n      local_alignment(// Inputs\n                      opt, alg_name, opt.session->name(),\n                      max_tile_size, left_extra_factor, right_extra_factor,\n                      tile_crop_win, write_nodata,\n                      left_camera_model.get(),\n                      right_camera_model.get(),\n                      datum,\n                      // Outputs\n                      left_trans_crop_win, right_trans_crop_win,\n                      left_local_mat, right_local_mat,\n                      left_aligned_file, right_aligned_file,  \n                      min_disp, max_disp);\n      success = true;\n      break;\n    } catch(std::exception const& e){\n      err_msg = e.what();\n    }\n  }\n  if (!success) {\n    // If this tile fails, write an empty disparity\n    vw_out() << err_msg << std::endl;\n    save_empty_disparity(opt, tile_crop_win, out_disp_file);\n    return;\n  }\n\n  vw_out() << \"Min and max disparities: \" << min_disp << \", \" << max_disp << \".\\n\";\n\n  // If the user specified a search range limit, apply it here.\n  if ((stereo_settings().corr_search_limit.min() != Vector2i()) || \n      (stereo_settings().corr_search_limit.max() != Vector2i())) {     \n    int min_limit = stereo_settings().corr_search_limit.min().x();\n    int max_limit = stereo_settings().corr_search_limit.max().x();\n    min_disp = std::max(min_disp, min_limit);\n    max_disp = std::min(max_disp, max_limit);\n    vw_out() << \"Min and max_disparities constrained, based on \"\n             << \"--corr-search-limit, to: \" << min_disp << \", \" << max_disp << \".\\n\";\n  }\n  \n  vw::ImageView<PixelMask<Vector2f>> unaligned_disp_2d;\n  vw::ImageView<vw::PixelMask<float>> unaligned_lr_disp_diff;\n  vw::stereo::CorrelationAlgorithm stereo_alg\n    = asp::stereo_alg_to_num(stereo_settings().stereo_algorithm);\n  \n  if (stereo_alg < vw::stereo::VW_CORRELATION_OTHER) {\n\n    // ASP algorithms\n\n    // Mask the locally alignment images which were written with NaN nodata.\n    float nan  = std::numeric_limits<float>::quiet_NaN();\n    ImageView<PixelMask<PixelGray<float>>> left_image\n      = vw::create_mask(DiskImageView<PixelGray<float>>(left_aligned_file), nan);\n    ImageView<PixelMask<PixelGray<float>>> right_image\n      = vw::create_mask(DiskImageView<PixelGray<float>>(right_aligned_file), nan);\n    \n    ImageView<vw::uint8> left_mask\n      = channel_cast_rescale<vw::uint8>(select_channel(left_image, 1));\n    ImageView<vw::uint8> right_mask\n      = channel_cast_rescale<vw::uint8>(select_channel(right_image, 1));\n    \n    stereo::CostFunctionType cost_mode = get_cost_mode_value();\n    Vector2i kernel_size = stereo_settings().corr_kernel;\n    int corr_timeout = stereo_settings().corr_timeout;\n    stereo_settings().seed_mode = 0; // no seed\n\n    // The search range. Put here 2 for the upper limit in y as the\n    // interval in y is [lower_limit, upper_limit).\n    stereo_settings().search_range.min() = vw::Vector2i(min_disp, -1);\n    stereo_settings().search_range.max() = vw::Vector2i(max_disp, 2);\n    \n    double seconds_per_op = 0.0;\n    if (corr_timeout > 0)\n      seconds_per_op = calc_seconds_per_op(cost_mode, kernel_size);\n\n    // Start with no seed. The current tile is rather small, which, when coupled\n    // with pyramid levels is enough to get away without a seed. And the external\n    // methods can't use a seed anyway.\n    ImageView<PixelMask<Vector2f>> sub_disp;\n    ImageView<PixelMask<Vector2f>> sub_disp_spread;\n\n    // Prepare for saving the LR to RL disparity difference.\n    ImageView<PixelMask<float>> * lr_disp_diff_ptr = NULL;\n    ImageView<PixelMask<float>> lr_disp_diff;\n    Vector2i region_ul(0, 0); // We compute the disparity on the full tile below, not a crop\n    if (stereo_settings().save_lr_disp_diff) {\n      lr_disp_diff.set_size(left_image.cols(), left_image.rows());\n      for (int col = 0; col < lr_disp_diff.cols(); col++) {\n        for (int row = 0; row < lr_disp_diff.rows(); row++) {\n          lr_disp_diff(col, row) = 0;\n          lr_disp_diff(col, row).invalidate();\n        }\n      }\n      lr_disp_diff_ptr = &lr_disp_diff;\n    }\n    \n    // Find the disparity\n    ImageView<PixelMask<Vector2f> > aligned_disp_2d =\n      crop(SeededCorrelatorView(apply_mask(left_image, nan),    // left image\n                                apply_mask(right_image, nan),   // right image\n                                left_mask, right_mask,\n                                sub_disp, sub_disp_spread, kernel_size, \n                                cost_mode, corr_timeout, seconds_per_op,\n                                region_ul, lr_disp_diff_ptr), \n           bounding_box(left_image));\n\n    if (stereo_settings().local_alignment_debug) {\n      // Write the aligned 2D disparity to disk, for debugging\n      vw::cartography::GeoReference georef;\n      bool   has_georef = false;\n      bool   has_nodata = false;\n      double nodata = std::numeric_limits<float>::quiet_NaN();\n      std::string aligned_disp_file = opt.out_prefix + \"-aligned-disparity_2D.tif\";\n      vw_out() << \"Writing: \" << aligned_disp_file << \"\\n\";\n      vw::cartography::block_write_gdal_image(aligned_disp_file, aligned_disp_2d,\n                                              has_georef, georef,\n                                              has_nodata, nan, opt,\n                                              TerminalProgressCallback\n                                              (\"asp\", \"\\t--> Disparity :\"));\n    }\n    \n    // Undo the alignment\n    asp::unalign_2d_disparity(// Inputs\n                              aligned_disp_2d,\n                              left_trans_crop_win, right_trans_crop_win,  \n                              left_local_mat, right_local_mat,  \n                              // Output\n                              unaligned_disp_2d);\n\n    if (stereo_settings().save_lr_disp_diff)\n      asp::unalign_masked_image(// Inputs\n                                lr_disp_diff, left_trans_crop_win, left_local_mat,\n                                // Output\n                                unaligned_lr_disp_diff);\n      \n  } else if (stereo_alg == vw::stereo::VW_CORRELATION_OTHER) {\n\n    // External algorithms using 1D disparity\n    // TODO(oalexan1): Make this into a function\n\n    // Set the default options for all algorithms\n    std::string default_opts;\n    if (alg_name == \"mgm\") {\n      \n      default_opts = std::string(\"MEDIAN=1 CENSUS_NCC_WIN=5 \")\n        + \"USE_TRUNCATED_LINEAR_POTENTIALS=1 TSGM=3 -s vfit -t census -O 8 \"\n        + \"-r \" + vw::num_to_str(min_disp) + \" -R \" + vw::num_to_str(max_disp);\n      \n    } else if (alg_name == \"opencv_bm\") {\n      default_opts = std::string(\"-block_size 21 -texture_thresh 10 -prefilter_cap 31 \") +\n        \"-uniqueness_ratio 15 -speckle_size 100 -speckle_range 32 -disp12_diff 1\";\n      \n    } else if (alg_name == \"opencv_sgbm\") {\n      \n      default_opts = std::string(\"-mode sgbm -block_size 3 -P1 8 -P2 32 -prefilter_cap 63 \") +\n        \"-uniqueness_ratio 10 -speckle_size 100 -speckle_range 32 -disp12_diff 1\";\n      \n    } else if (alg_name == \"msmw\") {\n      default_opts = std::string(\"-i 1 -n 4 -p 4 -W 5 -x 9 -y 9 -r 1 -d 1 -t -1 \")\n        + \"-s 0 -b 0 -o 0.25 -f 0 -P 32 \"\n        + \"-m \" + vw::num_to_str(min_disp) + \" -M \" + vw::num_to_str(max_disp);\n      \n    } else if (alg_name == \"msmw2\") {\n      default_opts = std::string(\"-i 1 -n 4 -p 4 -W 5 -x 9 -y 9 -r 1 -d 1 -t -1 \")\n        + \"-s 0 -b 0 -o -0.25 -f 0 -P 32 -D 0 -O 25 -c 0 \"\n        + \"-m \" + vw::num_to_str(min_disp) + \" -M \" + vw::num_to_str(max_disp);\n      \n    } else if (alg_name == \"libelas\"){\n      // For some reasons libelas fails with a tight search range\n      int extra = 10 + std::max(0, min_disp);\n      vw_out() << \"For libelas, grow the search range on each end by \" << extra << \".\\n\";\n      default_opts = std::string(\"-support_threshold 0.85 -support_texture 10 \")\n        + \"-candidate_stepsize 5 -incon_window_size 5 \"\n        + \"-incon_threshold 5 -incon_min_support 5 \"\n        + \"-add_corners 0 -grid_size 20 \"\n        + \"-beta 0.02 -gamma 3 -sigma 1 -sradius 2 \"\n        + \"-match_texture 1 -lr_threshold 2 -speckle_sim_threshold 1 \"\n        + \"-speckle_size 200 -ipol_gap_width 3 -filter_median 0 \"\n        + \"-filter_adaptive_mean 1 -postprocess_only_left 0 \"\n        + \"-disp_min \" + vw::num_to_str(min_disp - extra) + \" \"\n        + \"-disp_max \" + vw::num_to_str(max_disp + extra);\n    }else {\n      // No defaults for other algorithms\n    }\n\n    // Parse the algorithm options and environmental variables from the default\n    // options and append the user options (the latter take precedence).\n    std::string options, env_vars;\n    std::map<std::string, std::string> option_map;\n    std::map<std::string, std::string> env_vars_map;\n    asp::extract_opts_and_env_vars(default_opts + \" \" + user_opts,  \n                                   options, option_map,\n                                   env_vars, env_vars_map);\n\n    std::string aligned_disp_file = opt.out_prefix + \"-aligned-disparity.tif\";\n    std::string mask_file = opt.out_prefix + \"-disparity-mask.tif\";\n\n    // Ensure the disparity is always recreated\n    if (fs::exists(aligned_disp_file)) \n      fs::remove(aligned_disp_file);  \n    if (fs::exists(mask_file)) \n      fs::remove(mask_file);  \n    \n    vw::ImageView<float> aligned_disp;\n    if (alg_name == \"opencv_bm\") {\n      // Call the OpenCV BM algorithm\n      std::string mode = \"bm\";\n      int dummy_p1 = -1, dummy_p2 = -1; // Only needed for SGBM\n      call_opencv_bm_or_sgbm(left_aligned_file, right_aligned_file,\n                             mode,\n                             atoi(option_map[\"-block_size\"].c_str()),  \n                             min_disp, max_disp,  \n                             atoi(option_map[\"-prefilter_cap\"].c_str()),  \n                             atoi(option_map[\"-uniqueness_ratio\"].c_str()),  \n                             atoi(option_map[\"-speckle_size\"].c_str()),  \n                             atoi(option_map[\"-speckle_range\"].c_str()),  \n                             atoi(option_map[\"-disp12_diff\"].c_str()),  \n                             atoi(option_map[\"-texture_thresh\"].c_str()),\n                             dummy_p1, dummy_p2,\n                             opt, aligned_disp_file,  \n                             // Output\n                             aligned_disp);\n\n    } else if (alg_name == \"opencv_sgbm\") {\n      // Call the OpenCV SGBM algorithm\n      int dummy_texture_thresh = -1; // only needed for BM\n      call_opencv_bm_or_sgbm(left_aligned_file, right_aligned_file,\n                             option_map[\"-mode\"],\n                             atoi(option_map[\"-block_size\"].c_str()),  \n                             min_disp, max_disp,  \n                             atoi(option_map[\"-prefilter_cap\"].c_str()),  \n                             atoi(option_map[\"-uniqueness_ratio\"].c_str()),  \n                             atoi(option_map[\"-speckle_size\"].c_str()),  \n                             atoi(option_map[\"-speckle_range\"].c_str()),  \n                             atoi(option_map[\"-disp12_diff\"].c_str()),  \n                             dummy_texture_thresh,\n                             atoi(option_map[\"-P1\"].c_str()),  \n                             atoi(option_map[\"-P2\"].c_str()),  \n                             opt, aligned_disp_file,  \n                             // Output\n                             aligned_disp);\n    } else {\n\n      // Read the list of plugins\n      std::map<std::string, std::string> plugins, plugin_libs;\n      asp::parse_plugins_list(plugins, plugin_libs);\n\n      auto it1 = plugins.find(alg_name);\n      auto it2 = plugin_libs.find(alg_name);\n      if (it1 == plugins.end() || it2 == plugin_libs.end()) \n        vw_throw(ArgumentErr() << \"Could not lookup plugin: \" << alg_name << \".\\n\");\n      \n      std::string plugin_path = it1->second;\n      std::string plugin_lib = it2->second;\n\n      // Set up the environemnt\n      asp::setEnvVar(\"LD_LIBRARY_PATH\", plugin_lib);   // For Linux\n      asp::setEnvVar(\"DYLD_LIBRARY_PATH\", plugin_lib); // For OSX\n      vw_out() << \"Path to libraries: \" << plugin_lib << std::endl;\n      for (auto it = env_vars_map.begin(); it != env_vars_map.end(); it++)\n        asp::setEnvVar(it->first, it->second);\n      \n      // Call an external program which will write the disparity to disk\n      std::string cmd = plugin_path + \" \" + options + \" \" \n        + left_aligned_file + \" \" + right_aligned_file + \" \" + aligned_disp_file;\n      \n      if (alg_name == \"msmw\" || alg_name == \"msmw2\")\n        cmd += \" \" + mask_file; // Provide the mask file\n\n      int timeout = stereo_settings().corr_timeout;\n\n      if (env_vars != \"\") \n        vw_out() << \"Using environmental variables: \" << env_vars << \"\\n\";\n\n      vw_out() << \"Executing: \" << cmd << \"\\n\";\n\n      // Use a system call\n      system(cmd.c_str());\n      \n      // Read the disparity from disk. This may fail, for example, the\n      // disparity may time out or it may not have good data. In that\n      // case just make an empty disparity, as we don't want\n      // the processing of the full image to fail because of a tile.\n      try {\n        aligned_disp = DiskImageView<float>(aligned_disp_file);\n      } catch(std::exception const& e){\n        // If this tile fails, write an empty disparity\n        vw_out() << e.what() << std::endl;\n        save_empty_disparity(opt, tile_crop_win, out_disp_file);\n        return;\n      }\n      \n      if (alg_name == \"msmw\" || alg_name == \"msmw2\") {\n        // TODO(oalexan1): Make this into a function\n        // Apply the mask, which for this algorithm is stored separately.\n        // For that need to read things in memory.\n        ImageView<float> local_disp(aligned_disp.cols(), aligned_disp.rows());\n        DiskImageView<vw::uint8> mask(mask_file);\n\n        if (local_disp.cols() != mask.cols() || local_disp.rows() != mask.rows()) \n          vw_throw(ArgumentErr() << \"Expecting that the following images would \"\n                   << \"have the same dimensions: \"\n                   << aligned_disp_file << ' ' << mask_file << \".\\n\");\n          \n        float nan = std::numeric_limits<float>::quiet_NaN();\n        for (int col = 0; col < local_disp.cols(); col++) {\n          for (int row = 0; row < local_disp.rows(); row++) {\n            if (mask(col, row) != 0) \n              local_disp(col, row) = aligned_disp(col, row);\n            else\n              local_disp(col, row) = nan;\n          }\n        }\n        \n        // Assign the image we just made to the handle\n        aligned_disp = local_disp;\n      }\n    }\n\n    try {\n      // Sanity check. Temporarily load the left image.\n      DiskImageView<float> left_image(left_aligned_file);\n      if (aligned_disp.cols() != left_image.cols() || \n          aligned_disp.rows() != left_image.rows() ) \n        vw_throw(ArgumentErr() << \"Expecting that the 1D disparity \" << aligned_disp_file\n                 << \" would have the same dimensions as the left image \" << left_aligned_file\n                 << \".\\n\");\n    } catch(std::exception const& e){\n      // If this tile fails, write an empty disparity\n      vw_out() << e.what() << std::endl;\n      save_empty_disparity(opt, tile_crop_win, out_disp_file);\n      return;\n    }\n\n    if (0) {\n      // TODO(oalexan1): Make this into a function. Filter the disparity.\n      // This needs more testing.\n      // Wipe disparities which map to an invalid pixel\n      float nan  = std::numeric_limits<float>::quiet_NaN();\n      ImageView<PixelMask<PixelGray<float>>> left_masked_image\n        = vw::create_mask(DiskImageView<PixelGray<float>>(left_aligned_file), nan);\n      ImageView<PixelMask<PixelGray<float>>> right_masked_image\n        = vw::create_mask(DiskImageView<PixelGray<float>>(right_aligned_file), nan);\n      \n      // invalid value for a PixelMask\n      PixelMask<PixelGray<float>> nodata_mask = PixelMask<PixelGray<float>>(); \n      ImageViewRef<PixelMask<PixelGray<float>>> interp_right_masked_image\n      = interpolate(right_masked_image, BilinearInterpolation(),\n                    ValueEdgeExtension<PixelMask<PixelGray<float>>>(nodata_mask));\n      \n      for (int col = 0; col < left_masked_image.cols(); col++) {\n        for (int row = 0; row < left_masked_image.rows(); row++) {\n\n          if (std::isnan(aligned_disp(col, row))) \n            continue;  // already nan\n\n          // If the left pixel is not valid, the disparity cannot be valid\n          if (!is_valid(left_masked_image(col, row))) {\n            aligned_disp(col, row) = nan;\n            continue;\n          }\n\n          // If the right pixel is not valid, the disparity cannot be valid\n          Vector2 right_pix(col + aligned_disp(col, row), row);\n          if (!is_valid(interp_right_masked_image(right_pix.x(), right_pix.y()))) \n            aligned_disp(col, row) = nan;\n        }\n      }\n    }\n    \n    // Undo the alignment\n    asp::unalign_1d_disparity(// Inputs\n                              aligned_disp,\n                              left_trans_crop_win, right_trans_crop_win,  \n                              left_local_mat, right_local_mat,  \n                              // Output\n                              unaligned_disp_2d);\n  }\n\n  // Undo the logic needed for msmw\n  if (alg_name == \"msmw\" || alg_name == \"msmw2\") {\n    opt.gdal_options[\"TILED\"] = \"YES\";\n    opt.raster_tile_size = orig_tile_size;\n  }\n\n  // Adjust for the fact that tile_crop_win may not be the same as left_trans_crop_win.\n  vw::ImageView<PixelMask<Vector2f>> cropped_disp;\n  adjustForCropWin(unaligned_disp_2d, tile_crop_win, left_trans_crop_win, cropped_disp);\n  save_disparity(opt, cropped_disp, out_disp_file);\n  \n  // If unaligned_lr_disp_diff is not empty, adjust it and save it\n  if (unaligned_lr_disp_diff.cols() > 0) {\n    vw::ImageView<vw::PixelMask<float>> cropped_diff;\n    adjustForCropWin(unaligned_lr_disp_diff, tile_crop_win, left_trans_crop_win, cropped_diff);\n    std::string lr_disp_diff_file = opt.out_prefix + \"-L-R-disp-diff.tif\";\n    save_lr_disp_diff(opt, cropped_diff, lr_disp_diff_file);\n  }\n\n} // End function stereo_correlation_1D\n\nint main(int argc, char* argv[]) {\n\n  try {\n    xercesc::XMLPlatformUtils::Initialize();\n    \n    stereo_register_sessions();\n\n    bool verbose = false;\n    std::vector<ASPGlobalOptions> opt_vec;\n    std::string output_prefix;\n    asp::parseStereoArgs(argc, argv, CorrelationDescription(),\n                         verbose, output_prefix, opt_vec);\n    ASPGlobalOptions opt = opt_vec[0];\n\n    // Leave the number of parallel block threads equal to the default unless we\n    //  are using SGM in which case only one block at a time should be processed.\n    // - Processing multiple blocks is possible, but it is better to use a larger blocks\n    //   with more threads applied to the single block.\n    // - Thread handling is still a little confusing because opt.num_threads is ONLY used\n    //   to control the number of parallel image blocks written at a time.  Everything else\n    //   reads directly from vw_settings().default_num_threads()\n    vw::stereo::CorrelationAlgorithm stereo_alg\n      = asp::stereo_alg_to_num(stereo_settings().stereo_algorithm);\n    bool using_sgm = (stereo_alg > vw::stereo::VW_CORRELATION_BM &&\n                      stereo_alg < vw::stereo::VW_CORRELATION_OTHER);\n    opt.num_threads = vw_settings().default_num_threads();\n    if (using_sgm)\n      opt.num_threads = 1;\n\n    if (stereo_alg != vw::stereo::VW_CORRELATION_BM) {\n      // SGM/MGM works best with no prefilter. That one is also turned\n      // off in CorrelationView.h.\n      vw_out() << \"\\t--> Using no pre-processing filter with stereo algorithm: \"\n               << stereo_settings().stereo_algorithm << std::endl;\n      stereo_settings().pre_filter_mode = 0;\n    } else {\n      switch (stereo_settings().pre_filter_mode){\n      case 2:\n        vw_out() << \"\\t--> Using LOG pre-processing filter with \"\n                 << stereo_settings().slogW << \" sigma blur.\\n\"; \n      break;\n      case 1:\n        vw_out() << \"\\t--> Using subtracted mean pre-processing filter with \"\n                 << stereo_settings().slogW << \" sigma blur.\\n\";\n        break;\n      default:\n        vw_out() << \"\\t--> Using No pre-processing filter.\" << std::endl;\n      }\n    }\n\n    // Integer correlator requires large tiles\n    //---------------------------------------------------------\n    int ts = stereo_settings().corr_tile_size_ovr;\n\n    // GDAL block write sizes must be a multiple to 16 so if the input value is\n    //  not a multiple of 16 increase it until it is.\n    const int TILE_MULTIPLE = 16;\n    if (ts % TILE_MULTIPLE != 0)\n      ts = ((ts / TILE_MULTIPLE) + 1) * TILE_MULTIPLE;\n      \n    opt.raster_tile_size = Vector2i(ts, ts);\n    vw_out() << \"\\n[ \" << current_posix_time_string() << \" ]: Stage 1 --> CORRELATION\\n\";\n\n    if (stereo_settings().alignment_method == \"local_epipolar\") {\n      // Need to have the low-res 2D disparity to later guide the\n      // per-tile correlation. Use here the ASP MGM algorithm as the\n      // most reliable one, unless we do good old block-matching\n      if (stereo_settings().compute_low_res_disparity_only) {\n        if (stereo_settings().stereo_algorithm != \"asp_bm\")\n          stereo_settings().stereo_algorithm = \"asp_mgm\";\n        stereo_correlation_2D(opt);\n        return 0;\n      }\n      // This will be invoked per-tile.\n      stereo_correlation_1D(opt);\n    } else {\n      // Do 2D correlation. The first time this is invoked it will\n      // compute the low-res disparity unless told not to.\n      stereo_correlation_2D(opt);\n    }\n\n    vw_out() << \"\\n[ \" << current_posix_time_string() << \" ]: CORRELATION FINISHED\\n\";\n    \n    xercesc::XMLPlatformUtils::Terminate();\n  } ASP_STANDARD_CATCHES;\n\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/stereo_dist",
    "content": "#!/usr/bin/env python\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2026, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n\"\"\"\nstereo_dist - Distributed stereo processing.\n\"\"\"\n\nimport sys, argparse, subprocess, re, os, time, glob, shutil, platform, math\nimport os.path as P\n\n# Set up the path to Python modules about to load\nbasepath    = os.path.abspath(sys.path[0])\npythonpath  = os.path.abspath(basepath + '/../Python')  # for dev ASP\nlibexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP\nsys.path.insert(0, basepath) # prepend to Python path\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\n\nimport asp_system_utils, asp_string_utils, asp_cmd_utils\nasp_system_utils.verify_python_version_is_supported()\nfrom asp_stereo_utils import * # must be after the path is altered above\nfrom asp_dist_utils import *\n\n# Prepend to system PATH\nos.environ[\"PATH\"] = libexecpath + os.pathsep + os.environ[\"PATH\"]\n\n# Ensure we can look up the ASP libraries\nif 'ASP_LIBRARY_PATH' in os.environ:\n    os.environ['LD_LIBRARY_PATH'] = os.environ['ASP_LIBRARY_PATH']\n\nif __name__ == '__main__':\n    usage = '''stereo_dist [options] <images> [<cameras>]\n                  <output_prefix>\n        Distributed stereo processing.\\n''' + asp_system_utils.get_asp_version()\n\n    p = argparse.ArgumentParser(usage=usage)\n    p.add_argument('-v', '--version', dest='version', default=False, action='store_true',\n                   help='Display the version of software.')\n    p.add_argument('--verbose', dest='verbose', default=False, action='store_true',\n                   help='Display the commands being executed.')\n    p.add_argument('--dry-run', dest='dryrun', default=False, action='store_true',\n                   help='Do not launch the jobs, only print the commands that should be run.')\n    p.add_argument('--tile-size', dest='tile_size', default=2048, type=int,\n                   help='Size of each tile for distributed processing. This is before the padding is added.')\n    p.add_argument('--tile-padding', dest='tile_padding', default=256, type=int,\n                   help='Padding around each tile to avoid boundary artifacts.')\n    p.add_argument('--threads-multiprocess', dest='threads_multi', default=None, type=int,\n                   help='The number of threads to use per process when running multiple '\n                   'processes.')\n    p.add_argument('--threads-singleprocess', dest='threads_single', default=None, type=int,\n                   help='The number of threads to use when running a single process '\n                   '(PPRC and FLTR).')\n    p.add_argument('-e', '--entry-point', dest='entry_point', default=0, type=int,\n                   help='Stereo pipeline entry point (default: 0). Values: 0=pprc, '\n                   '1=corr, 2=blend, 3=rfne, 4=fltr, 5=tri, 6=cleanup, 7=dem, '\n                   '8=mosaic.')\n    p.add_argument('--stop-point', dest='stop_point', default=9, type=int,\n                   help='Stereo pipeline stop point, stop before this step '\n                   '(default: 9).')\n    p.add_argument('--point2dem-options', dest='point2dem_options', default='',\n                   help='Options to pass to point2dem. Can pass --orthoimage '\n                   'with no argument, and the L.tif file for each tile '\n                   'will be autocompleted. Can also pass --errorimage.')\n    p.add_argument('--processes', dest='processes', default=None, type=int,\n                   help='The number of processes to use per node.')\n    p.add_argument('--nodes-list', dest='nodes_list', default=None,\n                   help='A file containing the list of computing nodes, one per line. '\n                   'If not provided, run on the local machine.')\n    p.add_argument('--dem', dest='dem', required=True,\n                   help='Input DEM. Required.')\n    p.add_argument('--mapproject', dest='mapproject', default=False,\n                   action='store_true',\n                   help='Mapproject the input images onto the DEM before '\n                   'running stereo. The projection, grid size, and bounding '\n                   'box are auto-determined to be consistent for both images. '\n                   'These can be overridden with --t_srs, --tr, and --t_projwin.')\n    p.add_argument('--t_srs', dest='t_srs', default=None,\n                   help='Output projection for mapprojection. A PROJ string, '\n                   'EPSG code, or path to a WKT file. Auto-determined if not set.')\n    p.add_argument('--tr', dest='tr', default=None, type=float,\n                   help='Output grid size (ground sample distance) for '\n                   'mapprojection, in units of the projection. '\n                   'Auto-determined as the finer of the two images if not set.')\n    p.add_argument('--t_projwin', dest='t_projwin', default=None, type=float,\n                   nargs=4, metavar=('XMIN', 'YMIN', 'XMAX', 'YMAX'),\n                   help='Bounding box for mapprojection in projected coordinates: '\n                   'xmin ymin xmax ymax. Auto-determined as the intersection of '\n                   'the two images if not set.')\n    p.add_argument('--parallel-options', dest='parallel_options', default='--sshdelay 0.2',\n                   help='Options to pass directly to GNU Parallel.')\n\n    # Warn about --threads being ignored\n    if '--threads' in sys.argv:\n        print(\"Ignoring the option --threads. Use --threads-multiprocess \"\n              \"and --threads-singleprocess.\")\n        asp_cmd_utils.wipe_option(sys.argv, '--threads', 1)\n\n    (opt, args) = p.parse_known_args()\n    args = asp_cmd_utils.clean_args(args)\n\n    if opt.version:\n        asp_system_utils.print_version_and_exit()\n\n    if not args and not opt.version:\n        p.print_help()\n        asp_system_utils.raise_error('Missing input files.', code=2)\n\n    # Validate --t_projwin if provided. Swap min/max if in wrong order,\n    # as some tools print bounding boxes with inverted y axis.\n    if opt.t_projwin is not None:\n        if opt.t_projwin[0] > opt.t_projwin[2]:\n            opt.t_projwin[0], opt.t_projwin[2] = opt.t_projwin[2], opt.t_projwin[0]\n        if opt.t_projwin[1] > opt.t_projwin[3]:\n            opt.t_projwin[1], opt.t_projwin[3] = opt.t_projwin[3], opt.t_projwin[1]\n\n    # Validate that --t_srs, --tr, --t_projwin are only used with --mapproject\n    if not opt.mapproject:\n        for name in ['--t_srs', '--tr', '--t_projwin']:\n            val = getattr(opt, name.lstrip('-').replace('-', '_'))\n            if val is not None:\n                asp_system_utils.raise_error(\n                    name + ' can only be used with --mapproject.')\n\n    # These are not supported as stereo_dist manages its own crop windows per tile\n    for bad_opt in ['--left-image-crop-win', '--right-image-crop-win']:\n        if bad_opt in args:\n            asp_system_utils.raise_error('The option ' + bad_opt +\n                                         ' is not supported by stereo_dist.')\n\n    # Pass the DEM to the stereo C++ tools. When mapprojecting, defer this\n    # until after mapprojection, as stereo_parse will complain about\n    # non-mapprojected images with --dem.\n    if not opt.mapproject:\n        args.extend(['--dem', opt.dem])\n\n    # Validate --tr is in point2dem options when DEM step will run\n    if opt.entry_point <= Step.dem < opt.stop_point and '--tr' not in opt.point2dem_options:\n        asp_system_utils.raise_error('The option --point2dem-options must include --tr to '\n                                     'ensure consistent grid size across all tiles.')\n\n    # Set default threads if not specified\n    if opt.threads_single is None:\n        opt.threads_single = asp_system_utils.get_num_cpus()\n\n    # Get the output prefix from stereo_parse\n    sep = \",\"\n    settings = asp_system_utils.run_and_parse_output(\"stereo_parse\", args, sep, opt.verbose)\n    outPrefix = settings['out_prefix'][0]\n\n    # Mapproject both images onto the DEM with consistent parameters\n    if opt.mapproject:\n        (args, settings, outPrefix) = \\\n            mapprojAndUpdateArgs(opt, settings, outPrefix, sep)\n\n    # Run stereo_tile on all tiles for pprc only (entry_point=0, stop_point=1)\n    if opt.entry_point <= Step.pprc < opt.stop_point:\n        # Run stereo_parse to generate the tile list\n        tile_params = ['--stereo-dist-tile-params', str(opt.tile_size), str(opt.tile_padding)]\n        stereo_run('stereo_parse', args, opt, extra_args=tile_params)\n        # The tile layout already accounts for --proj-win, so remove it to avoid\n        # conflict with per-tile --left-image-crop-win / --right-image-crop-win\n        asp_cmd_utils.wipe_option(args, '--proj-win', 4)\n        # Run stereo_pprc with full images and --stop-after-stats to compute statistics only\n        asp_cmd_utils.wipe_option(args, '--threads', 1)\n        pprc_args = ['--stop-after-stats', '--threads', str(opt.threads_single)]\n        stereo_run('stereo_pprc', args, opt, extra_args=pprc_args)\n        # Do the rest of preprocessing logic per tiles\n        runStereoTiles(opt, args, outPrefix, Step.pprc, Step.corr)\n\n    # Run stereo_tile on all tiles for corr only (entry_point=1, stop_point=2)\n    if opt.entry_point <= Step.corr < opt.stop_point:\n        runStereoTiles(opt, args, outPrefix, Step.corr, Step.blend)\n\n    # Skip blend - in distributed stereo each tile goes to point cloud/DEM independently,\n    # then only final DEMs are merged. No cross-talk needed until DEM merging.\n\n    # Run stereo_tile on all tiles for rfne only (entry_point=3, stop_point=4)\n    if opt.entry_point <= Step.rfne < opt.stop_point:\n        runStereoTiles(opt, args, outPrefix, Step.rfne, Step.fltr)\n\n    # Run stereo_tile on all tiles for fltr only (entry_point=4, stop_point=5)\n    if opt.entry_point <= Step.fltr < opt.stop_point:\n        runStereoTiles(opt, args, outPrefix, Step.fltr, Step.tri)\n\n    # Run stereo_tile on all tiles for tri only (entry_point=5, stop_point=6)\n    if opt.entry_point <= Step.tri < opt.stop_point:\n        runStereoTiles(opt, args, outPrefix, Step.tri, Step.clean)\n\n    # Cleanup step (entry_point=6, stop_point=7)\n    if opt.entry_point <= Step.clean < opt.stop_point:\n        runStereoTiles(opt, args, outPrefix, Step.clean, Step.dem)\n\n    # Run point2dem on all tiles (entry_point=7, stop_point=8)\n    if opt.entry_point <= Step.dem < opt.stop_point:\n        runStereoTiles(opt, args, outPrefix, Step.dem, Step.mosaic)\n\n    # Mosaic per-tile DEMs into final DEM (entry_point=8, stop_point=9)\n    if opt.entry_point <= Step.mosaic < opt.stop_point:\n        mosaicDems(opt, outPrefix)\n\n    sys.exit(0)\n"
  },
  {
    "path": "src/asp/Tools/stereo_fltr.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n/// \\file stereo_fltr.cc\n///\n#include <asp/Sessions/StereoSession.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/Macros.h>\n#include <asp/Core/ThreadedEdgeMask.h>\n#include <asp/Core/AspLog.h>\n#include <asp/Gotcha/CBatchProc.h>\n#include <asp/Tools/stereo.h>\n\n#include <vw/Stereo/DisparityMap.h>\n#include <vw/Stereo/Algorithms.h>\n#include <vw/Cartography/GeoReferenceUtils.h>\n#include <vw/FileIO/DiskImageView.h>\n#include <vw/Image/BlobIndex.h>\n#include <vw/Image/ErodeView.h>\n#include <vw/Image/InpaintView.h>\n#include <vw/Cartography/GeoReferenceUtils.h>\n\n#include <xercesc/util/PlatformUtils.hpp>\n\n#include <boost/dll.hpp>\n#include <vw/Image/Manipulation.h>\n\nusing namespace vw;\nusing namespace asp;\n\n\n/// Apply a set of smoothing filters to the subpixel disparity results.\ntemplate <class ImageT, class DispImageT>\nclass TextureAwareDisparityFilter: public ImageViewBase<TextureAwareDisparityFilter<ImageT, DispImageT> >{\n  ImageT     m_img;\n  DispImageT m_disp_img;\n  \n  int   m_median_filter_size;     ///< Step 1: Apply a median filter of this size\n  int   m_texture_smooth_range;   ///< Step 2: Compute texture measure of input image with this kernel size\n  float m_texture_max;            ///< Step 3: Perform texture-aware smoothing of the disparity.  m_texture_max\n  int   m_max_smooth_kernel_size; ///<         smooths more pixels, and the smooth_kernel_size increases the smoothing intensity.\n  \npublic:\n  TextureAwareDisparityFilter( ImageViewBase<ImageT    > const& img,\n                               ImageViewBase<DispImageT> const& disp_img,\n                               int   median_filter_size,\n                               int   texture_smooth_range,\n                               float texture_max,\n                               int   max_smooth_kernel_size):\n    m_img(img.impl()), m_disp_img(disp_img.impl()),\n    m_median_filter_size(median_filter_size),\n    m_texture_smooth_range(texture_smooth_range),\n    m_texture_max(texture_max),\n    m_max_smooth_kernel_size(max_smooth_kernel_size)\n     {}\n\n  // Image View interface\n  typedef typename DispImageT::pixel_type pixel_type;\n  typedef pixel_type                      result_type;\n  typedef ProceduralPixelAccessor<TextureAwareDisparityFilter> pixel_accessor;\n\n  inline int32 cols  () const { return m_disp_img.cols(); }\n  inline int32 rows  () const { return m_disp_img.rows(); }\n  inline int32 planes() const { return 1; }\n\n  inline pixel_accessor origin() const { return pixel_accessor( *this, 0, 0 ); }\n\n  inline pixel_type operator()( double /*i*/, double /*j*/, int32 /*p*/ = 0 ) const {\n    vw_throw(NoImplErr() << \"TextureAwareDisparityFilter::operator()(...) is not implemented\");\n    return pixel_type();\n  }\n\n  typedef CropView<ImageView<pixel_type> > prerasterize_type;\n  inline prerasterize_type prerasterize(BBox2i const& bbox) const {\n\n    // Figure out the largest kernel expansion we need to support the filtering\n    int max_half_kernel = m_texture_smooth_range;\n    if (m_max_smooth_kernel_size > max_half_kernel)\n      max_half_kernel = m_max_smooth_kernel_size;\n    max_half_kernel += m_median_filter_size; // Don't forget we apply two kernels in succession\n    max_half_kernel /= 2;\n\n    // Rasterize both input image regions\n    BBox2i bbox2 = bbox;\n    bbox2.expand(max_half_kernel);\n    bbox2.crop(bounding_box(m_img)); // Restrict to valid input area\n    ImageView<typename ImageT::pixel_type> input_tile      = crop(m_img,      bbox2);\n    ImageView<pixel_type                 > input_disp_tile = crop(m_disp_img, bbox2);\n\n    ImageView<float> texture_image;\n    vw::stereo::texture_measure(input_tile, texture_image, m_texture_smooth_range);\n    //write_image( \"texture_image.tif\", texture_image );\n\n\n    ImageView<pixel_type > disp_tile_median;\n    vw::stereo::disparity_median_filter(input_disp_tile, disp_tile_median, m_median_filter_size);\n    \n    ImageView<pixel_type > disp_tile_filtered;\n    vw::stereo::texture_preserving_disparity_filter(disp_tile_median, disp_tile_filtered, texture_image, \n                                                    m_texture_max, m_max_smooth_kernel_size);\n\n    // Fake the bounds on the returned image region\n    return prerasterize_type(disp_tile_filtered,\n                             -bbox2.min().x(), -bbox2.min().y(),\n                             cols(), rows() );\n  }\n\n  template <class DestT>\n  inline void rasterize(DestT const& dest, BBox2i bbox) const {\n    vw::rasterize(prerasterize(bbox), dest, bbox);\n  }\n};\n\ntemplate <class ImageT, class DispImageT>\nTextureAwareDisparityFilter<ImageT, DispImageT>\ntexture_aware_disparity_filter( ImageViewBase<ImageT    > const& img,\n                                ImageViewBase<DispImageT> const& disp_img,\n                                int   median_filter_size,\n                                int   texture_smooth_range,\n                                float texture_max,\n                                int   max_smooth_kernel_size) {\n  typedef TextureAwareDisparityFilter<ImageT, DispImageT> return_type;\n  return return_type(img.impl(), disp_img.impl(), median_filter_size, \n                     texture_smooth_range, texture_max, max_smooth_kernel_size);\n}\n\n// Erode blobs from given image by iterating through tiles, biasing\n// each tile by a factor of blob size, removing blobs in the tile,\n// then shrinking the tile back. The bias is necessary to help avoid\n// fragmenting (and then unnecessarily removing) blobs.\ntemplate <class ImageT>\nclass PerTileErode: public ImageViewBase<PerTileErode<ImageT> >{\n  ImageT m_img;\npublic:\n  PerTileErode( ImageViewBase<ImageT>   const& img):\n    m_img(img.impl()){}\n\n  // Image View interface\n  typedef typename ImageT::pixel_type pixel_type;\n  typedef pixel_type                  result_type;\n  typedef ProceduralPixelAccessor<PerTileErode> pixel_accessor;\n\n  inline int32 cols  () const { return m_img.cols(); }\n  inline int32 rows  () const { return m_img.rows(); }\n  inline int32 planes() const { return 1; }\n\n  inline pixel_accessor origin() const { return pixel_accessor( *this, 0, 0 ); }\n\n  inline pixel_type operator()( double /*i*/, double /*j*/, int32 /*p*/ = 0 ) const {\n    vw_throw(NoImplErr() << \"PerTileErode::operator()(...) is not implemented\");\n    return pixel_type();\n  }\n\n  typedef CropView<ImageView<pixel_type> > prerasterize_type;\n  inline prerasterize_type prerasterize(BBox2i const& bbox) const {\n\n    int area = stereo_settings().erode_max_size;\n\n    // We look a beyond the current tile, to avoid cutting blobs\n    // if possible. Skinny blobs will be cut though.\n    int bias = 2*int(std::ceil(sqrt(double(area))));\n\n    BBox2i bbox2 = bbox;\n    bbox2.expand(bias);\n    bbox2.crop(bounding_box(m_img));\n    ImageView<pixel_type> tile_img = crop(m_img, bbox2);\n\n    int tile_size = std::max(bbox2.width(), bbox2.height()); // don't subsplit\n    BlobIndexThreaded smallBlobIndex(tile_img, area, tile_size);\n    ImageView<pixel_type> clean_tile_img = applyErodeView(tile_img,\n                                                          smallBlobIndex);\n    return prerasterize_type(clean_tile_img,\n                             -bbox2.min().x(), -bbox2.min().y(),\n                             cols(), rows() );\n  }\n\n  template <class DestT>\n  inline void rasterize(DestT const& dest, BBox2i bbox) const {\n    vw::rasterize(prerasterize(bbox), dest, bbox);\n  }\n};\n\ntemplate <class ImageT>\nPerTileErode<ImageT>\nper_tile_erode( ImageViewBase<ImageT> const& img) {\n  typedef PerTileErode<ImageT> return_type;\n  return return_type( img.impl() );\n}\n\n// Run several cleanup passes with desired cleanup mode.\ntemplate <class ViewT>\nstruct MultipleDisparityCleanUp {\n  typedef ImageViewRef< typename ViewT::pixel_type > result_type;\n\n  inline result_type operator()( ImageViewBase<ViewT> const& input, int N) {\n\n    result_type out = input;\n    for (int i = 0; i < N; i++){\n      int mode = stereo_settings().filter_mode;\n      if (mode == 1){\n        out = stereo::disparity_cleanup_using_mean\n          (out.impl(),\n           stereo_settings().rm_half_kernel.x(),\n           stereo_settings().rm_half_kernel.y(),\n           stereo_settings().max_mean_diff);\n      }else if (mode == 2){\n        out = stereo::disparity_cleanup_using_thresh\n          (out.impl(),\n           stereo_settings().rm_half_kernel.x(),\n           stereo_settings().rm_half_kernel.y(),\n           stereo_settings().rm_threshold,\n           stereo_settings().rm_min_matches/100.0);\n      }else\n        vw_throw( ArgumentErr() << \"\\nExpecting value of 1 or 2 for filter-mode. \"\n                  << \"Got: \" << mode << \"\\n\" );\n    }\n\n    return out;\n  }\n};\n\ntemplate <class ImageT>\nvoid write_good_pixel_and_filtered(ImageViewBase<ImageT> const& inputview,\n                                   ASPGlobalOptions const& opt) {\n  // Write Good Pixel Map\n  // Sub-sampling so that the user can actually view it.\n  double sub_scale = double( std::min( inputview.impl().cols(),\n                                inputview.impl().rows() ) ) / 2048.0;\n  if (sub_scale < 1) // Don't use a sub_scale less than one.\n    sub_scale = 1;\n\n  // Write out the good pixel map\n  std::string goodPixelFile = opt.out_prefix + \"-GoodPixelMap.tif\";\n  vw_out() << \"Writing: \" << goodPixelFile << std::endl;\n  ImageViewRef<  PixelRGB<uint8> > goodPixelImage\n    = subsample(apply_mask\n                (copy_mask\n                 (stereo::missing_pixel_image(inputview.impl()),\n                  create_mask(DiskImageView<vw::uint8>(opt.out_prefix+\"-lMask.tif\"), 0)\n                  )\n                 ), sub_scale);\n\n  // Determine if we can attach geo information to the output image\n  cartography::GeoReference left_georef;\n  bool has_left_georef = read_georeference(left_georef,  opt.out_prefix + \"-L.tif\");\n  bool has_nodata = false;\n  double nodata = -32768.0;\n\n  vw::cartography::GeoReference good_pixel_georef;\n  if (has_left_georef) {\n    // Account for scale. Note that goodPixelImage is not guaranteed to respect\n    // the sub_scale factor above, hence this calculation.\n    double good_pixel_scale = 0.5*( double(goodPixelImage.cols())/inputview.impl().cols()\n                                    + double(goodPixelImage.rows())/inputview.impl().rows());\n    good_pixel_georef = resample(left_georef, good_pixel_scale);\n  }\n\n  vw::cartography::block_write_gdal_image\n    ( goodPixelFile, goodPixelImage, has_left_georef, good_pixel_georef,\n      has_nodata, nodata,\n      opt, TerminalProgressCallback(\"asp\", \"\\t--> Good pixel map: \") );\n\n  bool removeSmallBlobs = (stereo_settings().erode_max_size > 0);\n\n  std::string outF = opt.out_prefix + \"-F.tif\";\n\n  // Fill holes\n  if(stereo_settings().enable_fill_holes) {\n    // Generate a list of blobs below a maximum size\n    // - This requires the entire input image to be read in\n    //    and produces a single blob list for the entire image.\n    vw_out() << \"\\t--> Filling holes with inpainting method.\\n\";\n    BlobIndexThreaded smallHoleIndex( invert_mask( inputview.impl() ),\n                                      stereo_settings().fill_hole_max_size,\n                                      vw::vw_settings().default_tile_size(),\n                                      vw::vw_settings().default_num_threads()\n                                      );\n    vw_out() << \"\\t    * Identified \" << smallHoleIndex.num_blobs() << \" holes\\n\";\n    bool use_grassfire = true;\n    typename ImageT::pixel_type default_inpaint_val;\n\n\n    if (!removeSmallBlobs) { // Skip small blob removal\n      // Write out the image to disk, filling in the blobs in the process\n      vw_out() << \"Writing: \" << outF << std::endl;\n      vw::cartography::block_write_gdal_image( outF,\n                                   inpaint(inputview.impl(), smallHoleIndex,\n                                           use_grassfire, default_inpaint_val),\n                                   has_left_georef, left_georef,\n                                   has_nodata, nodata, opt,\n                                   TerminalProgressCallback\n                                   (\"asp\",\"\\t--> Filtering: \") );\n    }\n    else { // Add small blob removal step\n      // Write out the image to disk, filling in and removing blobs in the process\n      // - Blob removal is done second to make sure inner-blob holes are removed.\n      vw_out() << \"Writing: \" << outF << std::endl;\n      vw::cartography::block_write_gdal_image( outF,\n                                   per_tile_erode\n                                   (inpaint(inputview.impl(),\n                                            smallHoleIndex,\n                                            use_grassfire,\n                                            default_inpaint_val) ),\n                                   has_left_georef, left_georef,\n                                   has_nodata, nodata, opt,\n                                   TerminalProgressCallback\n                                   (\"asp\",\"\\t--> Filtering: \") );\n    }\n\n  } else { // No hole filling\n    if (!removeSmallBlobs) { // Skip small blob removal\n      vw_out() << \"Writing: \" << outF << std::endl;\n      vw::cartography::block_write_gdal_image( outF, inputview.impl(),\n                                   has_left_georef, left_georef,\n                                   has_nodata, nodata, opt,\n                                   TerminalProgressCallback\n                                   (\"asp\", \"\\t--> Filtering: \") );\n    }\n    else { // Add small blob removal step\n      vw_out() << \"\\t--> Removing small blobs.\\n\";\n      // Write out the image to disk, removing the blobs in the process\n      vw_out() << \"Writing: \" << outF << std::endl;\n      vw::cartography::block_write_gdal_image(outF, per_tile_erode(inputview.impl()),\n                                  has_left_georef, left_georef,\n                                  has_nodata, nodata, opt,\n                                  TerminalProgressCallback\n                                  (\"asp\",\"\\t--> Filtering: \") );\n    }\n\n  } // End no hole filling case\n} //end write_good_pixel_and_filtered\n\nvoid stereo_filtering(ASPGlobalOptions& opt) {\n\n  std::string post_correlation_fname = opt.out_prefix+\"-RD.tif\";\n\n  try {\n\n    // Rasterize the results so far to a temporary file on disk.\n    // This file is deleted once we complete the second half of the\n    // disparity map filtering process.\n\n    // Apply filtering for high frequencies\n    typedef DiskImageView<PixelMask<Vector2f> > input_type;\n    input_type disparity_disk_image(post_correlation_fname);\n\n    // Applying additional clipping from the edge. We make new\n    // mask files to avoid a weird and tricky segfault due to ownership issues.\n    DiskImageView<vw::uint8> left_mask ( opt.out_prefix+\"-lMask.tif\" );\n    DiskImageView<vw::uint8> right_mask( opt.out_prefix+\"-rMask.tif\" );\n    \n    // Erode at the edge. If not set, apply some logic as below.\n    int32 edge_buffer = stereo_settings().edge_buffer_size;\n    if (edge_buffer < 0) {\n      if (stereo_settings().subpixel_mode > 0 && stereo_settings().subpixel_mode <= 6)\n        edge_buffer = max(stereo_settings().subpixel_kernel); // max of the two entries\n      else \n        edge_buffer = 5; // should be enough\n    }  \n\n    DiskImageView<PixelGray<float>> left_disk_image (opt.out_prefix+\"-L.tif\");\n\n    vw_out() << \"\\t--> Cleaning up disparity map prior to filtering processes (\"\n             << stereo_settings().rm_cleanup_passes << \" pass).\\n\";\n\n    // If the user wants to do no filtering at all, that amounts\n    // to doing no passes.\n    if (stereo_settings().filter_mode == 0)\n      stereo_settings().rm_cleanup_passes = 0;\n\n    // No Erosion step\n    if ( stereo_settings().rm_cleanup_passes >= 1 ) {\n      // Apply an outlier removal filter\n      write_good_pixel_and_filtered\n        (stereo::disparity_mask\n          (MultipleDisparityCleanUp<input_type>()\n            (disparity_disk_image, stereo_settings().rm_cleanup_passes),\n              apply_mask(asp::threaded_edge_mask(left_mask, 0,edge_buffer,1024)),\n              apply_mask(asp::threaded_edge_mask(right_mask,0,edge_buffer,1024))),\n            opt);\n    } else { // No cleanup passes\n      write_good_pixel_and_filtered\n        (stereo::disparity_mask\n          (\n            texture_aware_disparity_filter(left_disk_image, disparity_disk_image, \n                                          stereo_settings().median_filter_size,\n                                          stereo_settings().disp_smooth_size+2, // Compute texture a little larger than smooth radius\n                                          stereo_settings().disp_smooth_texture, \n                                          stereo_settings().disp_smooth_size),\n            apply_mask(asp::threaded_edge_mask(left_mask, 0,edge_buffer,1024)),\n            apply_mask(asp::threaded_edge_mask(right_mask,0,edge_buffer,1024))),\n          opt);\n    } // End cleanup passes check\n\n  } catch (IOErr const& e) {\n    vw_throw( ArgumentErr() << \"\\nUnable to start at filtering stage -- could not read input files.\\n\"\n              << e.what() << \"\\nExiting.\\n\\n\" );\n  }\n} // end stereo_filtering()\n\nvoid gotcha_disparity_refinement(ASPGlobalOptions& opt) {\n\n  // Apply Gotcha on tiles of size 1024\n  opt.raster_tile_size = Vector2i(ASPGlobalOptions::corr_tile_size(),\n                                  ASPGlobalOptions::corr_tile_size());\n\n  // Use this much padding to ensure that the tiles processed by Gotcha overlap,\n  // to avoid help avoid seams.\n  int padding = ASPGlobalOptions::corr_tile_size()/4;\n  \n  if (stereo_settings().casp_go_param_file == \"\") {\n    // Use the default CASP-GO parameter file if not provided\n    std::string base_dir = boost::dll::program_location().parent_path().parent_path().string();\n    stereo_settings().casp_go_param_file = base_dir + \"/share/CASP-GO_params.xml\";\n  }\n\n  if (!fs::exists(stereo_settings().casp_go_param_file)) \n    vw_throw(ArgumentErr() << \"Cannot read CASP-GO parameter file: \"\n             << stereo_settings().casp_go_param_file << \"\\n\");\n  else\n    vw_out() << \"Refining the disparity using the Gotcha algorithm and parameter file: \"\n             << stereo_settings().casp_go_param_file << \"\\n\";\n\n  // First move the current F file out of the way, as it is not possible to overwrite\n  // it in place.\n  std::string disp_file = opt.out_prefix + \"-F.tif\";\n  std::string disp_file_nogotcha = opt.out_prefix + \"-F-nogotcha.tif\";\n  std::string cmd = \"mv \" + disp_file + \" \" + disp_file_nogotcha;\n  vw_out() << cmd << \"\\n\";\n  system(cmd.c_str());\n  \n  ImageViewRef<PixelMask<Vector2f>> filtered_disparity\n    = opt.session->pre_pointcloud_hook(disp_file_nogotcha);\n\n  // TODO(oalexan1): How about no-data pixels in the left and right images?\n  std::string L_file = opt.out_prefix + \"-L.tif\";\n  std::string R_file = opt.out_prefix + \"-R.tif\";\n  DiskImageView<float> left_image (L_file);\n  DiskImageView<float> right_image(R_file);\n  \n  // Determine if we can attach geo information to the output disparity\n  cartography::GeoReference left_georef;\n  bool has_left_georef = read_georeference(left_georef, L_file);\n  bool has_nodata = false;\n  double nodata = -32768.0;\n  vw_out() << \"Writing Gotcha-refined disparity: \" << disp_file << std::endl;\n  block_write_gdal_image(disp_file,\n                         gotcha::gotcha_refine(filtered_disparity,  \n                                               left_image, right_image,\n                                               padding, stereo_settings().casp_go_param_file),\n                         has_left_georef, left_georef,\n                         has_nodata, nodata, opt,\n                         TerminalProgressCallback(\"asp\",\"\\t  Gotcha:  \"));\n}\n\nint main(int argc, char* argv[]) {\n\n  try {\n    xercesc::XMLPlatformUtils::Initialize();\n\n    vw_out() << \"\\n[ \" << current_posix_time_string()\n             << \" ]: Stage 4 --> FILTERING\\n\";\n\n    stereo_register_sessions();\n\n    bool verbose = false;\n    std::vector<ASPGlobalOptions> opt_vec;\n    std::string output_prefix;\n    asp::parseStereoArgs(argc, argv, FilteringDescription(),\n                         verbose, output_prefix, opt_vec);\n    ASPGlobalOptions opt = opt_vec[0];\n\n    // Internal Processes\n    //---------------------------------------------------------\n    stereo_filtering(opt);\n\n    if (stereo_settings().gotcha_disparity_refinement)\n      gotcha_disparity_refinement(opt);\n    \n    vw_out() << \"\\n[ \" << current_posix_time_string()\n             << \" ]: FILTERING FINISHED\\n\";\n\n    xercesc::XMLPlatformUtils::Terminate();\n  } ASP_STANDARD_CATCHES;\n\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/stereo_gui.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file stereo_gui.cc\n///\n\n#include <QApplication>\n#include <QWidget>\n\n#include <asp/GUI/MainWindow.h>\n#include <asp/GUI/GuiUtilities.h>\n#include <asp/GUI/GuiArgs.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/DemDisparity.h>\n#include <asp/Core/AspProgramOptions.h>\n#include <asp/Core/Macros.h>\n#include <asp/Tools/stereo.h>\n\n#include <vw/Stereo/CorrelationView.h>\n#include <vw/Stereo/CostFunctions.h>\n#include <vw/Stereo/DisparityMap.h>\n#include <vw/Core/CmdUtils.h>\n#include <vw/FileIO/FileTypes.h>\n\n// Can't do much about warnings in boost except to hide them\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wdeprecated-declarations\"\n#include <boost/core/null_deleter.hpp>\n#include <boost/accumulators/accumulators.hpp>\n#include <boost/accumulators/statistics.hpp>\n#pragma GCC diagnostic pop\n\n#include <xercesc/util/PlatformUtils.hpp>\n#include <omp.h>\n#include <thread>\n\nusing namespace vw;\nusing namespace vw::stereo;\nusing namespace asp;\nnamespace fs = boost::filesystem;\n\nnamespace asp {\n\n// Parse the input command line arguments. We'll use this function\n// only when we failed to parse the arguments under the assumption\n// that the tool was being invoked with the stereo interface. Hence\n// we'll fallback to this when the tool is used as an image viewer.\nvoid parseStereoGuiArgs(int argc, char *argv[], ASPGlobalOptions& opt,\n                        std::vector<std::string> & input_files) {\n\n  // Options for which we will print the help message\n  po::options_description general_options(\"\");\n  general_options.add(GUIDescription());\n\n  // All options that we will parse\n  po::options_description all_general_options(\"\");\n\n  // The values for these options are stored in 'opt'\n  addAspGlobalOptions(all_general_options, opt);\n\n  // The values for these are stored in stereo_settings()\n  all_general_options.add(generate_config_file_options(opt));\n\n  po::options_description positional_options(\"\");\n  po::positional_options_description positional_desc;\n  positional_options.add_options()\n    (\"input-files\", po::value< std::vector<std::string> >(), \"Input files\");\n  positional_desc.add(\"input-files\", -1);\n\n  std::string usage = \"[options] <images> <output_prefix>\";\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm = asp::check_command_line(argc, argv, opt, general_options,\n                                                 all_general_options, positional_options,\n                                                 positional_desc, usage,\n                                                 allow_unregistered, unregistered);\n\n  // Add the options to the usage\n  std::ostringstream os;\n  os << usage << general_options;\n  usage = os.str();\n\n  // Store the files\n  if (vm.count(\"input-files\") > 0)\n    input_files = vm[\"input-files\"].as<std::vector<std::string>>();\n  else\n    input_files.clear(); // no input files, will be read from nvm later\n\n  // Interpret the the last two coordinates of the crop win boxes as\n  // width and height rather than max_x and max_y. \n  BBox2i bl = stereo_settings().left_image_crop_win;\n  BBox2i br = stereo_settings().right_image_crop_win;\n  stereo_settings().left_image_crop_win\n    = BBox2i(bl.min().x(), bl.min().y(), bl.max().x(), bl.max().y());\n  stereo_settings().right_image_crop_win\n    = BBox2i(br.min().x(), br.min().y(), br.max().x(), br.max().y());\n\n  // Adjust the zoom win dimensions\n  auto & zoom_win = asp::stereo_settings().zoom_proj_win; // alias\n  if (zoom_win.min().x() > zoom_win.max().x())\n    std::swap(zoom_win.min().x(), zoom_win.max().x());\n  if (zoom_win.min().y() > zoom_win.max().y())\n    std::swap(zoom_win.min().y(), zoom_win.max().y());\n\n  // Option --zoom-proj-win implies --zoom-all-to-same-region\n  if (!asp::stereo_settings().zoom_proj_win.empty())\n    asp::stereo_settings().zoom_all_to_same_region = true;\n}\n\n// Inherit from QApplication to be able to over-ride the notify() method\n// that throws exceptions.\nclass StereoApplication: public QApplication {\npublic:\n  StereoApplication(int& argc, char** argv): QApplication(argc, argv) {}\n  virtual bool notify(QObject *receiver, QEvent *e) {\n\n    try {\n      return QApplication::notify(receiver, e);\n    } catch (std::exception& ex) {\n      asp::popUp(ex.what());\n      return false;\n    }\n\n  }\n};\n\nvoid readImageNames(std::vector<std::string> const& all_files,\n                    std::vector<std::string> & images,\n                    std::string & output_prefix) {\n\n  output_prefix = \"\";\n  images.clear();\n\n  // Try to load each input file as a standalone image one at a time\n  for (size_t i = 0; i < all_files.size(); i++) {\n    std::string file = all_files[i];\n    bool is_image = false;\n    try {\n      DiskImageView<float> tmp(file);\n      is_image = true;\n    } catch(std::exception & e) {\n      if (file.empty() || file[0] == '-') continue;\n      if (vw::get_extension(file) == \".match\") {\n        // Found a match file\n        stereo_settings().match_file = file;\n        is_image = false;\n      } else if (vw::get_extension(file) == \".vwip\") {\n        // Found a vwip file\n        stereo_settings().vwip_files.push_back(file);\n        is_image = false;\n      } else if (vw::get_extension(file) == \".gcp\") {\n        // Found a gcp file\n        stereo_settings().gcp_file = file;\n        is_image = false;\n      } else if (vw::get_extension(file) == \".nvm\") {\n        // Found an nvm file\n        if (!stereo_settings().nvm.empty()) // sanity check\n          vw_out() << \"Multiple nvm files specified. Will load only: \" << file << \"\\n\";\n        stereo_settings().nvm  = file;\n        is_image = false;\n      } else if (vw::has_shp_extension(file)) {\n        // See if this is a shape file\n        is_image = true; // will load it in the same struct as for images\n      } else if (asp::hasCsv(file)) {\n        is_image = true; // will load it in the same struct as for images\n      } else if (vw::has_cam_extension(file)) {\n        // We will get here for all cameras except .cub, which\n        // is both an image and a camera and was picked up by\n        // now. Don't print an error in this case as this is\n        // expected to not be an image.\n        is_image = false;\n      } else {\n        if (!fs::exists(file)) {\n            vw_out() << \"Setting output prefix: \" << file << \"\\n\";\n            output_prefix = file;\n        } else {\n          vw_out() << \"Not a valid image: \" << file << \"\\n\";\n        }\n      }\n    }\n\n    if (is_image)\n      images.push_back(file);\n  }\n\n  return;\n}\n\n} // end namespace asp\n\nint main(int argc, char** argv) {\n\n  try {\n    xercesc::XMLPlatformUtils::Initialize();\n    stereo_register_sessions();\n\n    // Extract style and color for scattered points, curves, and polygons\n    std::vector<std::map<std::string, std::string>> properties;\n    asp::preprocessArgs(argc, argv, properties);\n\n    bool verbose = false;\n    ASPGlobalOptions opt;\n    std::string output_prefix;\n    std::vector<std::string> images;\n\n    std::vector<std::string> all_files;\n    asp::stereo_settings().vwip_files.clear();\n    asp::parseStereoGuiArgs(argc, argv, opt, all_files);\n\n    asp::readImageNames(all_files, images, output_prefix);\n\n    if (stereo_settings().create_image_pyramids_only) {\n      // Just create the image pyramids and exit. \n      for (size_t i = 0; i < images.size(); i++) {\n        asp::imageData img;\n        img.read(images[i], opt);\n        if (stereo_settings().hillshade) {\n          // Create hillshaded images. \n          std::string hillshaded_file;\n          bool have_gui = false; // so we don't use a pop up before the gui got started\n          bool success = asp::write_hillshade(opt, have_gui,\n                                              stereo_settings().hillshade_azimuth,\n                                              stereo_settings().hillshade_elevation,\n                                              images[i],\n                                              hillshaded_file); // output\n          if (success) // build the pyramids\n            img.read(hillshaded_file, opt, asp::HILLSHADED_VIEW);\n        }\n      }\n      return 0;\n    }\n\n    // Create the application. Must be done before trying to read\n    // images as that call uses pop-ups. Must not happen before\n    // building image pyramids as that does not need a gui.\n    asp::StereoApplication app(argc, argv);\n\n    // Set the font size\n    QFont f = app.font();\n    f.setPointSize(asp::stereo_settings().font_size);\n    app.setFont(f);\n\n    vw::create_out_dir(output_prefix);\n\n    // Use OpenMP to speed things up.\n    // TODO(oalexan1): This should be enabled in more places.\n    int processor_count = std::thread::hardware_concurrency();\n    omp_set_dynamic(0);\n    omp_set_num_threads(processor_count);\n\n    // Start up the Qt GUI\n    asp::MainWindow main_window(opt, images, output_prefix,\n                                stereo_settings().grid_cols,\n                                stereo_settings().window_size,\n                                stereo_settings().single_window,\n                                stereo_settings().use_georef,\n                                properties,\n                                argc, argv);\n\n    main_window.show();\n    app.exec();\n\n    xercesc::XMLPlatformUtils::Terminate();\n  } ASP_STANDARD_CATCHES;\n\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/stereo_parse.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file stereo_parse.cc\n///\n/// This program is to allow python access to stereo settings.\n\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/StereoTiling.h>\n#include <asp/Core/Macros.h>\n#include <asp/Tools/stereo.h>\n#include <asp/Sessions/StereoSession.h>\n#include <asp/Sessions/StereoSessionFactory.h>\n#include <asp/Core/DisparityProcessing.h>\n\n#include <vw/Stereo/DisparityMap.h>\n#include <vw/Cartography/GeoReferenceUtils.h>\n#include <vw/Stereo/CorrelationView.h>\n#include <vw/Cartography/shapeFile.h>\n#include <vw/FileIO/DiskImageIO.h>\n#include <vw/FileIO/DiskImageView.h>\n\n#include <xercesc/util/PlatformUtils.hpp>\n\nusing namespace vw;\nusing namespace asp;\nnamespace fs = boost::filesystem;\n\n// Find the tile at given location for a parallel_stereo run with local epipolar\n// alignment.\nvoid find_tile_at_loc(std::string const& tile_at_loc, ASPGlobalOptions const& opt) {\n\n  if (opt.input_dem != \"\") \n    vw_throw(ArgumentErr() << \"Option --tile-at-location does not work \"\n             << \"with mapprojected images.\\n\");\n\n  std::istringstream iss(tile_at_loc);\n  double lon, lat, h;\n  if (!(iss >> lon >> lat >> h))\n    vw_throw(ArgumentErr() << \"Could not parse --tile-at-location.\\n\");\n\n  vw::cartography::GeoReference georef = opt.session->get_georef();\n\n  vw::CamPtr left_camera_model, right_camera_model;\n  opt.session->camera_models(left_camera_model, right_camera_model);\n  \n  Vector3 xyz = georef.datum().geodetic_to_cartesian(Vector3(lon, lat, h));\n  Vector2 pix = left_camera_model->point_to_pixel(xyz);\n\n  vw::TransformPtr tx_left = opt.session->tx_left();\n\n  pix = tx_left->forward(pix);\n\n  // Read the tiles\n  std::string line;\n  std::string dir_list = opt.out_prefix + \"-dirList.txt\";\n  vw_out() << \"Reading list of tiles: \" << dir_list << \"\\n\";\n  std::ifstream ifs(dir_list);\n  std::vector<BBox2i> boxes;\n  bool success = false;\n  while (ifs >> line) {\n    std::string::size_type pos = line.find(opt.out_prefix);\n    if (pos == std::string::npos) \n      vw_throw(ArgumentErr() << \"Could not find the output prefix in \" << dir_list << \".\\n\");\n\n    std::string tile_name = line;\n    line.replace(pos, opt.out_prefix.size() + 1, \"\"); // add 1 to replace the dash\n\n    int start_x, start_y, wid_x, wid_y;\n    int ans = sscanf(line.c_str(), \"%d_%d_%d_%d\", &start_x, &start_y, &wid_x, &wid_y);\n    if (ans != 4) \n      vw_throw(ArgumentErr() << \"Error parsing 4 numbers from string: \" << line);\n\n    BBox2i box(start_x, start_y, wid_x, wid_y);\n    if (box.contains(pix)) {\n      vw::vw_out() << \"Tile with location: \" << tile_name << \"\\n\";\n      success = true;\n    }\n  }\n\n  if (!success)\n    vw_out() << \"No tile found at location.\\n\"; \n}\n\nint main(int argc, char* argv[]) {\n\n  try {\n    xercesc::XMLPlatformUtils::Initialize();\n    stereo_register_sessions();\n\n    bool verbose = true;\n    std::vector<ASPGlobalOptions> opt_vec;\n    std::string output_prefix;\n    asp::parseStereoArgs(argc, argv, ParseDescription(),\n                         verbose, output_prefix, opt_vec);\n    if (opt_vec.empty())\n      return 1;\n\n    ASPGlobalOptions opt = opt_vec[0];\n\n    // This is needed for the stereo_dist distributed processing program. Save\n    // the needed list of tiles to disk (and their mapprojected versions as a\n    // shapefile) and exit.\n    if (asp::stereo_settings().stereo_dist_tile_params != vw::Vector2i(0, 0)) {\n      produceDistTileList(opt.in_file1, opt.in_file2, output_prefix,\n                          asp::stereo_settings().stereo_dist_tile_params);\n      return 0;\n    }\n\n    // Use this as a small utility in debugging parallel_stereo runs\n    if (!stereo_settings().tile_at_loc.empty()) {\n      find_tile_at_loc(stereo_settings().tile_at_loc, opt);\n      return 0;\n    }\n    \n    vw_out() << \"in_file1,\"        << opt.in_file1        << \"\\n\";\n    vw_out() << \"in_file2,\"        << opt.in_file2        << \"\\n\";\n    vw_out() << \"cam_file1,\"       << opt.cam_file1       << \"\\n\";\n    vw_out() << \"cam_file2,\"       << opt.cam_file2       << \"\\n\";\n    vw_out() << \"input_dem,\"       << opt.input_dem       << \"\\n\";\n    vw_out() << \"extra_argument1,\" << opt.extra_argument1 << \"\\n\";\n    vw_out() << \"extra_argument2,\" << opt.extra_argument2 << \"\\n\";\n    vw_out() << \"extra_argument3,\" << opt.extra_argument3 << \"\\n\";\n\n    vw_out() << \"stereo_session,\"   << opt.stereo_session << \"\\n\";\n    vw_out() << \"stereo_default_filename,\" << opt.stereo_default_filename << \"\\n\";\n    vw_out() << \"left_image_crop_win,\"\n             << stereo_settings().left_image_crop_win.min().x() << \",\"\n             << stereo_settings().left_image_crop_win.min().y() << \",\"\n             << stereo_settings().left_image_crop_win.width()   << \",\"\n             << stereo_settings().left_image_crop_win.height()  << \"\\n\";\n\n    // This is different from opt.out_prefix for multiview\n    vw_out() << \"out_prefix,\" << output_prefix << \"\\n\";\n\n    // Output only the named options (no positional args) so that callers\n    // like stereo_dist can safely reconstruct command lines.\n    std::vector<std::string> opts_vals;\n    asp::parseStereoOptsVals(argc, argv, ParseDescription(), opts_vals);\n    vw_out() << \"named_options\";\n    for (size_t i = 0; i < opts_vals.size(); i++)\n      vw_out() << \",\" << opts_vals[i];\n    vw_out() << \"\\n\";\n\n    Vector2i left_image_size  = file_image_size(opt.in_file1),\n             right_image_size = file_image_size(opt.in_file2);\n    vw_out() << \"left_image_size,\"  << left_image_size.x()  << \",\" \n             << left_image_size.y()  << \"\\n\";\n    vw_out() << \"right_image_size,\" << right_image_size.x() << \",\" \n             << right_image_size.y() << \"\\n\";\n\n    std::string trans_left_image  = opt.out_prefix+\"-L.tif\";\n    std::string trans_right_image = opt.out_prefix+\"-R.tif\";\n    vw::vw_out() << \"trans_left_image,\"  << trans_left_image  << \"\\n\";\n    vw::vw_out() << \"trans_right_image,\" << trans_right_image << \"\\n\";\n    \n    // This is needed to create tiles in parallel_stereo\n    vw::Vector2 trans_left_image_size(0, 0);\n    if (fs::exists(trans_left_image))\n      trans_left_image_size = file_image_size(trans_left_image);\n    vw_out() << \"trans_left_image_size,\" << trans_left_image_size.x() << \",\" \n             << trans_left_image_size.y() << \"\\n\";\n\n    // This separator needs to be in sync with parallel_stereo. It is needed to\n    // extract from a line of text the portion after the separator.\n    std::string sep = \"--non-comma-separator--\";\n     \n    cartography::GeoReference georef = opt.session->get_georef();\n    vw_out() << \"WKT\" << sep << georef.get_wkt() << \"\\n\";\n\n    // Write the geotransform as a string as expected by GDAL's vrt xml format\n    // TODO: Not sure if this will be useful as a member function in GeoReference.\n    Matrix3x3 T = georef.transform();\n    std::ostringstream os;\n    os.precision(18);\n    os << \" \"  << T(0, 2) << \",  \" << T(0, 0) << \",  \" << T(0, 1) << \",  \"\n       << \" \"  << T(1, 2) << \",  \" << T(1, 0) << \",  \" << T(1, 1);\n    vw_out() << \"GeoTransform\" << sep << os.str() << \"\\n\";\n\n    // Some care is needed below. The transformed_window will be used\n    // by parallel_stereo to parallelize stereo on a given user-specified\n    // region. If both --left-image-crop-win and --right-image-crop-win\n    // is specified, we already chopped the input images to these windows,\n    // and created L.tif. Hence, we will work on the bd box on L.tif. However,\n    // if just left-image-crop-win was set, we still use the full images,\n    // but just the domain of computation is restricted. Hence we take user's\n    // crop window, transform it to be in the L.tif coordinates, and use that one.\n    bool crop_left = (stereo_settings().left_image_crop_win  != BBox2i(0, 0, 0, 0));\n    BBox2i transformed_window;\n    if (crop_left) {\n      transformed_window.min() = Vector2(0, 0);\n      transformed_window.max() = trans_left_image_size;\n    }else{\n      transformed_window = transformed_crop_win(opt);\n    }\n    vw_out() << \"transformed_window,\" << transformed_window.min().x() << \",\"\n             << transformed_window.min().y() << \",\"\n             << transformed_window.width()   << \",\"\n             << transformed_window.height()  << \"\\n\";\n\n    //vw_out() << \"corr_tile_size,\" << ASPGlobalOptions::corr_tile_size() << \"\\n\";\n    vw_out() << \"corr_tile_size,\" << stereo_settings().corr_tile_size_ovr << \"\\n\";\n    vw_out() << \"rfne_tile_size,\" << ASPGlobalOptions::rfne_tile_size() << \"\\n\";\n    vw_out() << \"tri_tile_size,\"  << ASPGlobalOptions::tri_tile_size()  << \"\\n\";\n    vw_out() << \"stereo_algorithm,\" << stereo_settings().stereo_algorithm << \"\\n\";\n    vw_out() << \"alignment_method,\"  << stereo_settings().alignment_method << \"\\n\";\n    vw_out() << \"subpixel_mode,\" << stereo_settings().subpixel_mode << \"\\n\";\n\n    // Apart from default block matching, correlation will be done tiles\n    // with padding, which is called here collar_size.\n    vw::stereo::CorrelationAlgorithm stereo_alg\n      = asp::stereo_alg_to_num(stereo_settings().stereo_algorithm);\n    bool using_tiles = (stereo_alg > vw::stereo::VW_CORRELATION_BM ||\n                        stereo_settings().alignment_method == \"local_epipolar\");\n    \n    int sgm_collar_size = 0;\n    if (using_tiles)\n      sgm_collar_size = stereo_settings().sgm_collar_size;\n    vw_out() << \"collar_size,\" << sgm_collar_size << \"\\n\";\n\n    vw_out() << \"corr_memory_limit_mb,\" << stereo_settings().corr_memory_limit_mb << \"\\n\";\n    vw_out() << \"save_lr_disp_diff,\" << stereo_settings().save_lr_disp_diff << \"\\n\";\n    vw_out() << \"correlator_mode,\" << stereo_settings().correlator_mode << \"\\n\";\n\n    if (asp::stereo_settings().parallel_tile_size != vw::Vector2i(0, 0))\n      produceTiles(opt.session->isMapProjected(), output_prefix, trans_left_image_size,\n                   asp::stereo_settings().parallel_tile_size, sgm_collar_size);\n    \n    // Attach a georeference to this disparity. \n    // TODO(oalexan1): Make this into a function\n    std::string left_image_file = opt.out_prefix + \"-L.tif\";\n    if (stereo_settings().attach_georeference_to_lowres_disparity &&\n        fs::exists(left_image_file)) {\n\n      cartography::GeoReference left_georef, left_sub_georef;\n      bool   has_left_georef = read_georeference(left_georef, left_image_file);\n      bool   has_nodata      = false;\n      double output_nodata   = -32768.0;\n      if (has_left_georef) {\n\n        DiskImageView<float> left_image(left_image_file);\n        for (int i = 0; i < 2; i++) {\n          std::string d_sub_file = opt.out_prefix + \"-D_sub.tif\";\n          if (i == 1) d_sub_file = opt.out_prefix + \"-D_sub_spread.tif\";\n          if (!fs::exists(d_sub_file)) \n            continue;\n\n          bool has_sub_georef = read_georeference(left_sub_georef, d_sub_file);\n          if (has_sub_georef) {\n            // If D_sub already has a georef, as with seed-mode 3, don't overwrite it.\n            continue;\n          }\n\n          vw::ImageView<PixelMask<Vector2f>> d_sub;\n          vw::read_image(d_sub, d_sub_file);\n          // Account for scale.\n          double left_scale = 0.5*(double(d_sub.cols())/left_image.cols() +\n                                   double(d_sub.rows())/left_image.rows());\n          left_sub_georef = resample(left_georef, left_scale);\n          vw::cartography::block_write_gdal_image(d_sub_file, d_sub,\n                                      has_left_georef, left_sub_georef,\n                                      has_nodata, output_nodata,\n                                      opt, TerminalProgressCallback(\"asp\", \"\\t    D_sub: \"));\n        } // End i loop\n      } // End has_left_georef\n    } // End georef attach \n\n    xercesc::XMLPlatformUtils::Terminate();\n  } ASP_STANDARD_CATCHES;\n\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/stereo_pprc.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file stereo_pprc.cc\n///\n#include <asp/Sessions/StereoSession.h>\n#include <asp/Sessions/StereoSessionFactory.h>\n#include <asp/Sessions/CameraUtils.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/Bathymetry.h>\n#include <asp/Core/Macros.h>\n#include <asp/Core/AspLog.h>\n#include <asp/Core/IpMatchingAlgs.h>\n#include <asp/Core/ImageNormalization.h>\n#include <asp/Core/FileUtils.h>\n#include <asp/Core/ThreadedEdgeMask.h>\n#include <asp/Core/ImageUtils.h>\n#include <asp/Tools/stereo.h>\n\n#include <vw/Core/Stopwatch.h>\n#include <vw/Image/AntiAliasing.h>\n#include <vw/Image/WindowAlgorithms.h>\n#include <vw/Image/UtilityViews.h>\n#include <vw/Cartography/GeoTransform.h>\n#include <vw/Cartography/GeoReferenceUtils.h>\n#include <vw/InterestPoint/MatcherIO.h>\n#include <vw/FileIO/DiskImageUtils.h>\n#include <vw/Math/Functors.h>\n\n#include <xercesc/util/PlatformUtils.hpp>\n#include <vw/Image/Manipulation.h>\n\nusing namespace vw;\nusing namespace asp;\n\n// Check that the images in file1 and file2 have same size, and throw\n// an exception if they don't.\nvoid check_image_sizes(std::string const& file1, std::string const& file2) {\n  DiskImageView<float> left_image (file1), right_image(file2);\n  if (left_image.cols() != right_image.cols() ||\n      left_image.rows() != right_image.rows())\n    vw_throw( ArgumentErr() << \"Expecting images: \" << file1 << \" and \" << file2\n              << \" to have the same dimensions. Delete this run and start all over.\\n\");\n}\n\n// Create subsampled images and masks\nvoid createSubsampledImages(ASPGlobalOptions const& opt,\n                            std::vector<std::string> const& in_file_list,\n                            bool crop_left, bool crop_right,\n                            DiskImageView<PixelGray<float>> const& left_image,\n                            DiskImageView<PixelGray<float>> const& right_image,\n                            std::string const& left_mask_file,\n                            std::string const& right_mask_file,\n                            bool has_left_georef, bool has_right_georef,\n                            cartography::GeoReference const& left_georef,\n                            cartography::GeoReference const& right_georef,\n                            float output_nodata) {\n\n  bool has_nodata = true;\n\n  std::string lsub  = opt.out_prefix+\"-L_sub.tif\";\n  std::string rsub  = opt.out_prefix+\"-R_sub.tif\";\n  std::string lmsub = opt.out_prefix+\"-lMask_sub.tif\";\n  std::string rmsub = opt.out_prefix+\"-rMask_sub.tif\";\n\n  bool inputs_changed = (!first_is_newer(lsub,  in_file_list) ||\n                    !first_is_newer(rsub,  in_file_list) ||\n                    !first_is_newer(lmsub, in_file_list) ||\n                    !first_is_newer(rmsub, in_file_list));\n\n  // We must always redo the subsampling if we are allowed to crop the images\n  bool rebuild = crop_left || crop_right || inputs_changed;\n\n  try {\n    // First try to see if the subsampled images exist.\n    if (!fs::exists(lsub)  || !fs::exists(rsub) ||\n        !fs::exists(lmsub) || !fs::exists(rmsub)) {\n      rebuild = true;\n    } else {\n      // See if the subsampled images are valid\n      DiskImageView<PixelGray<float>> testl(lsub);\n      DiskImageView<PixelGray<float>> testr(rsub);\n      DiskImageView<uint8> testlm(lmsub);\n      DiskImageView<uint8> testrm(rmsub);\n      vw_out() << \"\\t--> Using cached subsampled images.\\n\";\n    }\n  } catch (vw::Exception const& e) {\n    rebuild = true;\n  }\n\n  if (rebuild) {\n    // Produce subsampled images, these will be used later for auto\n    // search range detection.\n    double s = 1500.0;\n    float  sub_scale = sqrt(s * s / (float(left_image.cols ()) * float(left_image.rows ())))\n                     + sqrt(s * s / (float(right_image.cols()) * float(right_image.rows())));\n    sub_scale /= 2;\n    if ( sub_scale > 0.6 ) // ???\n      sub_scale = 0.6;\n\n    // Solving for the number of threads and the tile size to use for\n    // subsampling while only using 500 MiB of memory. (The cache code\n    // is a little slow on releasing so it will probably use 1.5GiB\n    // memory during subsampling) Also tile size must be a power of 2\n    // and greater than or equal to 64 px.\n    uint32 sub_threads = vw_settings().default_num_threads() + 1;\n    uint32 tile_power  = 0;\n    while (tile_power < 6 && sub_threads > 1) {\n      sub_threads--;\n      tile_power = boost::numeric_cast<uint32>\n        (log10(500e6*sub_scale*sub_scale/(4.0*float(sub_threads)))/(2*log10(2)));\n    }\n    uint32 sub_tile_size = 1u << tile_power;\n    if (sub_tile_size > vw_settings().default_tile_size())\n      sub_tile_size = vw_settings().default_tile_size();\n    Vector2 sub_tile_size_vec(sub_tile_size, sub_tile_size);\n    \n    vw_out() << \"Creating subimages and submasks. Subsampling by \" << sub_scale\n             << \" by using a tile of size \" << sub_tile_size << \" and \"\n             << sub_threads << \" threads.\\n\";\n\n    // Resample the images and the masks. We must use the masks when\n    // resampling the images to interpolate correctly around invalid pixels.\n\n    DiskImageView<uint8> left_mask(left_mask_file), right_mask(right_mask_file);\n    // Below we use ImageView instead of ImageViewRef as the output\n    // images are small.  Using an ImageViewRef would make the\n    // subsampling operations happen twice, once for L_sub.tif and\n    // second time for lMask_sub.tif.\n    ImageView<PixelMask<PixelGray<float>>> left_sub_image, right_sub_image;\n    if (sub_scale > 0.5) {\n      // When we are near the pixel input to output ratio, standard\n      // interpolation gives the best possible results.\n      left_sub_image  = block_rasterize(\n        resample(copy_mask(left_image, create_mask(left_mask)), sub_scale), \n                 sub_tile_size_vec, sub_threads);\n      right_sub_image = block_rasterize(\n        resample(copy_mask(right_image, create_mask(right_mask)), sub_scale), \n                 sub_tile_size_vec, sub_threads);\n    } else {\n      // When we heavily reduce the image size, super sampling seems\n      // like the best approach. The method below should be equivalent.\n      left_sub_image = block_rasterize(\n          cache_tile_aware_render(resample_aa(copy_mask(left_image, create_mask(left_mask)),\n                                              sub_scale), Vector2i(256,256) * sub_scale),\n         sub_tile_size_vec, sub_threads);\n      right_sub_image = block_rasterize(\n        cache_tile_aware_render(resample_aa(copy_mask(right_image, create_mask(right_mask)),\n                                             sub_scale), Vector2i(256,256) * sub_scale),\n         sub_tile_size_vec, sub_threads);\n    }\n\n    // Enforce no predictor in compression, it works badly with sub-images\n    vw::GdalWriteOptions opt_nopred = opt;\n    opt_nopred.gdal_options[\"PREDICTOR\"] = \"1\";\n    opt_nopred.cog = false;  // Do not use COG with preprocessing intermediates\n\n    vw::cartography::GeoReference left_sub_georef, right_sub_georef;\n    if (has_left_georef) {\n      // Account for scale.\n      double left_scale = 0.5 * (double(left_sub_image.cols())/left_image.cols() + \n                                 double(left_sub_image.rows())/left_image.rows());\n      left_sub_georef = resample(left_georef, left_scale);\n    }\n    if (has_right_georef) {\n      // Account for scale.\n      double right_scale = 0.5 * (double(right_sub_image.cols())/right_image.cols() + \n                                  double(right_sub_image.rows())/right_image.rows());\n      right_sub_georef = resample(right_georef, right_scale);\n    }\n\n    vw::cartography::block_write_gdal_image(\n      lsub, apply_mask(left_sub_image, output_nodata),\n      has_left_georef, left_sub_georef,\n      has_nodata, output_nodata,\n      opt_nopred, TerminalProgressCallback(\"asp\", \"\\t    Sub L: \") );\n    vw::cartography::block_write_gdal_image(\n      rsub, apply_mask(right_sub_image, output_nodata),\n      has_right_georef, right_sub_georef,\n      has_nodata, output_nodata,\n      opt_nopred, TerminalProgressCallback(\"asp\", \"\\t    Sub R: \") );\n    vw::cartography::block_write_gdal_image(\n      lmsub, channel_cast_rescale<uint8>(select_channel(left_sub_image, 1)),\n      has_left_georef, left_sub_georef,\n      has_nodata, output_nodata,\n      opt_nopred, TerminalProgressCallback(\"asp\", \"\\t    Sub L Mask: \") );\n    vw::cartography::block_write_gdal_image(\n      rmsub, channel_cast_rescale<uint8>(select_channel(right_sub_image, 1)),\n      has_right_georef, right_sub_georef,\n      has_nodata, output_nodata,\n      opt_nopred, TerminalProgressCallback(\"asp\", \"\\t    Sub R Mask: \") );\n  } // End rebuild check\n} // End function createSubsampledImages\n\n// Create the image masks for the left and right images\nvoid createImageMasks(ASPGlobalOptions & opt,\n                      boost::shared_ptr<DiskImageResource> left_rsrc,\n                      boost::shared_ptr<DiskImageResource> right_rsrc,\n                      DiskImageView<PixelGray<float>> const& left_image,\n                      DiskImageView<PixelGray<float>> const& right_image,\n                      bool skip_img_norm,\n                      bool has_left_georef, bool has_right_georef,\n                      cartography::GeoReference const& left_georef,\n                      cartography::GeoReference const& right_georef,\n                      bool has_nodata, float output_nodata,\n                      std::string const& left_mask_file,\n                      std::string const& right_mask_file) {\n\n  vw_out() << \"\\t--> Generating image masks.\\n\";\n\n  vw::Stopwatch sw;\n  sw.start();\n\n  // Read the no-data values of L.tif and R.tif.\n  float left_nodata_value  = std::numeric_limits<float>::quiet_NaN();\n  float right_nodata_value = std::numeric_limits<float>::quiet_NaN();\n  if (left_rsrc->has_nodata_read())\n    left_nodata_value  = left_rsrc->nodata_read();\n  if (right_rsrc->has_nodata_read())\n    right_nodata_value = right_rsrc->nodata_read();\n\n  // We need to treat the following special case: if the user\n  // skipped image normalization, so we are still using the original\n  // input images, and the user wants to use a custom no-data value,\n  // this is the time to apply it.\n  if (skip_img_norm && !std::isnan(stereo_settings().nodata_value)) {\n    left_nodata_value  = stereo_settings().nodata_value;\n    right_nodata_value = stereo_settings().nodata_value;\n  }\n\n  // TODO(oalexan1): Remove the ThreadedEdgeMask logic, as it is slow. But need\n  // to ensure results are acceptable with both raw and mapprojected images.\n  ImageViewRef<PixelMask<uint8>> left_mask\n    = copy_mask(constant_view(uint8(255),\n                              left_image.cols(), left_image.rows()),\n                asp::threaded_edge_mask(left_image, 0, 0, 1024));\n  ImageViewRef<PixelMask<uint8>> right_mask\n    = copy_mask(constant_view(uint8(255),\n                              right_image.cols(), right_image.rows()),\n                asp::threaded_edge_mask(right_image, 0, 0, 1024));\n\n  // Mask no-data pixels.\n  left_mask = intersect_mask(left_mask,\n                             create_mask_less_or_equal(left_image,\n                                                       left_nodata_value));\n  right_mask = intersect_mask(right_mask,\n                              create_mask_less_or_equal(right_image,\n                                                        right_nodata_value));\n\n  // Mask out regions with low input pixel value standard deviations if the\n  // user requested it.\n  if (stereo_settings().nodata_stddev_kernel > 0) {\n    Vector2i stddev_kernel(stereo_settings().nodata_stddev_kernel,\n                           stereo_settings().nodata_stddev_kernel);\n\n    // If the threshold value is negative write out a debug image\n    // instead, allowing the user to tune the threshold.\n    // TODO(oalexan1): See if to wipe this code.\n    if (stereo_settings().nodata_stddev_thresh < 0) {\n      vw::cartography::block_write_gdal_image\n        (opt.out_prefix + \"-L_stddev_filter_output.tif\",\n         vw::stddev_filter_view(left_image, stddev_kernel),\n         has_left_georef, left_georef,\n         false, output_nodata,\n         opt, TerminalProgressCallback\n         (\"asp\", \"\\t  StdDev filter raw output (left): \"));\n      vw::cartography::block_write_gdal_image\n        (opt.out_prefix + \"-R_stddev_filter_output.tif\",\n         vw::stddev_filter_view(right_image, stddev_kernel),\n         has_right_georef, right_georef,\n         false, output_nodata,\n         opt, TerminalProgressCallback(\"asp\", \"\\t  StdDev filter raw output (right): \"));\n    } else {\n      left_mask  = intersect_mask(left_mask,\n                                  create_mask_less_or_equal\n                                  (vw::stddev_filter_view(left_image, stddev_kernel),\n                                   stereo_settings().nodata_stddev_thresh));\n      right_mask = intersect_mask(right_mask,\n                                  create_mask_less_or_equal\n                                  (vw::stddev_filter_view(right_image, stddev_kernel),\n                                   stereo_settings().nodata_stddev_thresh));\n    }\n  }\n\n  // Intersect the left mask with the warped version of the right\n  // mask, and vice-versa to reduce noise, if the images\n  // are map-projected.\n  vw_out() << \"Writing masks: \" << left_mask_file << ' ' << right_mask_file << \".\\n\";\n  if (has_left_georef && has_right_georef && opt.session->isMapProjected()) {\n\n    // Write with big blocks. Small blocks results in slow writing and great\n    // memory usage. The latter is likely because there's a memory leak\n    // somewhere or the bookkeeping for small tiles takes too much memory.\n    // This is a bugfix.\n    Vector2 orig_tile_size = opt.raster_tile_size;\n    opt.raster_tile_size = Vector2(1024, 1024);\n\n    {\n      // Right image mask transformed into left coordinates. Keep this in its\n      // own scope to free up the memory of its bookkeeping as soon as\n      // possible.\n      ImageViewRef<PixelMask<uint8>> warped_right_mask\n        = crop(vw::cartography::geo_transform\n              (right_mask, right_georef, left_georef,\n                ConstantEdgeExtension(), NearestPixelInterpolation()),\n              bounding_box(left_mask));\n      vw::cartography::block_write_gdal_image(left_mask_file,\n                               apply_mask(intersect_mask(left_mask, warped_right_mask)),\n                               has_left_georef, left_georef,\n                               has_nodata, output_nodata,\n                               opt, TerminalProgressCallback(\"asp\", \"\\t    Mask L: \"));\n    }\n    {\n      // Left image mask transformed into right coordinates. Keep it in its\n      // own scope as per above.\n      ImageViewRef<PixelMask<uint8>> warped_left_mask\n        = crop(vw::cartography::geo_transform\n              (left_mask, left_georef, right_georef,\n                ConstantEdgeExtension(), NearestPixelInterpolation()),\n              bounding_box(right_mask));\n      vw::cartography::block_write_gdal_image(right_mask_file,\n                                  apply_mask(intersect_mask(right_mask, warped_left_mask)),\n                                  has_right_georef, right_georef,\n                                  has_nodata, output_nodata,\n                                  opt, TerminalProgressCallback(\"asp\", \"\\t    Mask R: \"));\n    }\n\n    // Put the original tile size back\n    opt.raster_tile_size = orig_tile_size;\n\n  } else {\n    // No DEM to map-project to.\n    // TODO: Even so, the trick above with intersecting the masks will still work,\n    // if the images are map-projected (such as with cam2map-ed cubes),\n    // but this would require careful research.\n    vw::cartography::block_write_gdal_image(left_mask_file, apply_mask(left_mask),\n                                 has_left_georef, left_georef,\n                                 has_nodata, output_nodata,\n                                 opt, TerminalProgressCallback(\"asp\", \"\\t Mask L: \"));\n    vw::cartography::block_write_gdal_image(right_mask_file, apply_mask(right_mask),\n                                 has_right_georef, right_georef,\n                                 has_nodata, output_nodata,\n                                 opt, TerminalProgressCallback(\"asp\", \"\\t Mask R: \"));\n  }\n\n  sw.stop();\n  vw_out(DebugMessage, \"asp\") << \"Mask creation elapsed time: \"\n                              << sw.elapsed_seconds() << \" s.\" << std::endl;\n}\n\n/// The main preprocessing function\nvoid stereo_preprocessing(bool adjust_left_image_size, ASPGlobalOptions& opt) {\n\n  // Perform image normalization and calc stats. Handle skip_image_normalization.\n  std::string left_image_file, right_image_file;\n  opt.session->preprocessing_hook(adjust_left_image_size,\n                                  opt.in_file1, opt.in_file2,\n                                  left_image_file, right_image_file);\n\n  boost::shared_ptr<DiskImageResource>\n    left_rsrc (vw::DiskImageResourcePtr(left_image_file)),\n    right_rsrc(vw::DiskImageResourcePtr(right_image_file));\n\n  // Load the normalized images\n  DiskImageView<PixelGray<float>> left_image (left_rsrc), right_image(right_rsrc);\n\n  // If we crop the images, we must always rebuild the masks\n  // and subsample the images and masks.\n  bool crop_left  = (stereo_settings().left_image_crop_win  != BBox2i(0, 0, 0, 0));\n  bool crop_right = (stereo_settings().right_image_crop_win != BBox2i(0, 0, 0, 0));\n\n  std::string left_mask_file  = opt.out_prefix+\"-lMask.tif\";\n  std::string right_mask_file = opt.out_prefix+\"-rMask.tif\";\n  \n  // Also need to rebuild if the inputs changed after the mask files were produced.\n  std::vector<std::string> in_file_list;\n  in_file_list.push_back(opt.in_file1);\n  in_file_list.push_back(opt.in_file2);\n  in_file_list.push_back(opt.cam_file1);\n  in_file_list.push_back(opt.cam_file2);\n  bool inputs_changed = (!first_is_newer(left_mask_file,  in_file_list) ||\n                         !first_is_newer(right_mask_file, in_file_list));\n\n  bool rebuild = crop_left || crop_right || inputs_changed;\n  try {\n    // If files do not exist, create them. Also if they exist\n    // but are invalid. The second check gives an ugly verbose\n    // message, hence first check for existence with boost.\n    if (!fs::exists(left_mask_file) || !fs::exists(right_mask_file)){\n      rebuild = true;\n    }else{\n      vw_log().console_log().rule_set().add_rule(-1,\"fileio\");\n      DiskImageView<PixelGray<uint8>> testa(left_mask_file );\n      DiskImageView<PixelGray<uint8>> testb(right_mask_file);\n      vw_settings().reload_config();\n    }\n  } catch (vw::IOErr const& e) {\n    vw_settings().reload_config();\n    rebuild = true;\n  } catch (vw::ArgumentErr const& e ) {\n    // Throws on a corrupted file.\n    vw_settings().reload_config();\n    rebuild = true;\n  }\n\n  cartography::GeoReference left_georef, right_georef;\n  bool has_left_georef  = read_georeference(left_georef,  left_image_file);\n  bool has_right_georef = read_georeference(right_georef, right_image_file);\n\n  // The output no-data value must be < 0 as the images are scaled to around [0, 1].\n  bool  has_nodata    = true;\n  float output_nodata = -32768.0;\n\n  // Create or reuse masks\n  if (!rebuild) {\n    vw_out() << \"\\t--> Using cached masks.\\n\";\n    // This is to safeguard against the case when masks produced with alignment\n    // or crop from a previous run are used with no alignment or no crop. \n    if (stereo_settings().alignment_method == \"none\") {\n      check_image_sizes(opt.in_file1, left_mask_file);\n      check_image_sizes(opt.in_file2, right_mask_file);\n    }\n  } else {\n    bool skip_img_norm = asp::skip_image_normalization(opt);\n    createImageMasks(opt, left_rsrc, right_rsrc, left_image, right_image,\n                     skip_img_norm, has_left_georef, has_right_georef,\n                     left_georef, right_georef, has_nodata, output_nodata,\n                     left_mask_file, right_mask_file);\n  }\n\n  // Create subsampled images and masks\n  createSubsampledImages(opt, in_file_list, crop_left, crop_right,\n                         left_image, right_image,\n                         left_mask_file, right_mask_file,\n                         has_left_georef, has_right_georef,\n                         left_georef, right_georef,\n                         output_nodata);\n\n  // When alignment method is none or epipolar, no ip were created so far, so\n  // produce them now.\n  if (stereo_settings().alignment_method == \"none\" ||\n      stereo_settings().alignment_method == \"epipolar\") {\n    try {\n        asp::compute_ip_LR(opt.out_prefix);\n      } catch (const std::exception& e) {\n        if (!asp::stereo_settings().search_range.empty() ||\n            stereo_settings().seed_mode == 2) {\n          // If the user provided a search range or disp from DEM, IP are not needed.\n          vw_out() << \"Could not compute interest points. The error was:\\n\";\n          vw_out() << e.what();\n          if (!asp::stereo_settings().search_range.empty())\n            vw_out() << \"Will continue, given that --corr-search was set.\\n\";\n          if (stereo_settings().seed_mode == 2)\n            vw_out() << \"Will continue, given the option --seed-mode 2.\\n\";\n      } else {\n        vw::vw_throw(vw::ArgumentErr() << e.what() << \"\\n\");\n      }\n    }\n  }\n    \n} // End function stereo_preprocessing\n\nint main(int argc, char* argv[]) {\n\n  try {\n    xercesc::XMLPlatformUtils::Initialize();\n  \n    vw_out() << \"\\n[ \" << current_posix_time_string() << \" ]: Stage 0 --> PREPROCESSING\\n\";\n\n    stereo_register_sessions();\n\n    bool verbose = false;\n    std::vector<ASPGlobalOptions> opt_vec;\n    std::string output_prefix;\n    asp::parseStereoArgs(argc, argv, PreProcessingDescription(),\n                         verbose, output_prefix, opt_vec);\n    ASPGlobalOptions opt = opt_vec[0];\n\n    vw_out() << \"Image files:  \" << opt.in_file1  << \", \" << opt.in_file2  << \"\\n\";\n    if (opt.cam_file1 != \"\" || opt.cam_file2 != \"\") \n      vw_out() << \"Camera files: \" << opt.cam_file1 << \", \" << opt.cam_file2 << \"\\n\";\n    if (!opt.input_dem.empty())\n      vw_out() << \"Input DEM: \" << opt.input_dem << \"\\n\";\n\n    // We will not adjust the left image size if we do multiview stereo,\n    // so we can keep one-to-one correspondence between the several\n    // pairwise runs that are part of the multiview run for the time\n    // when we need to combine all these runs to do simultaneous triangulation.\n    bool adjust_left_image_size = (opt_vec.size() == 1 &&\n                                   !stereo_settings().part_of_multiview_run);\n\n    stereo_preprocessing(adjust_left_image_size, opt);\n    if (!stereo_settings().stereo_dist_mode)\n      asp::estimate_convergence_angle(opt);\n\n    vw_out() << \"\\n[ \" << current_posix_time_string() << \" ]: PREPROCESSING FINISHED\\n\";\n\n    xercesc::XMLPlatformUtils::Terminate();\n  } ASP_STANDARD_CATCHES;\n\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/stereo_rfne.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2025, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file stereo_rfne.cc\n///\n\n#include <asp/Sessions/StereoSession.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/Macros.h>\n#include <asp/Core/ImageNormalization.h>\n#include <asp/Core/ImageUtils.h>\n#include <asp/Core/AspLog.h>\n#include <asp/Core/FileUtils.h>\n#include <asp/Tools/stereo.h>\n\n#include <vw/Stereo/PrefilterEnum.h>\n#include <vw/Stereo/CostFunctions.h>\n#include <vw/Stereo/ParabolaSubpixelView.h>\n#include <vw/Stereo/SubpixelView.h>\n#include <vw/Stereo/DisparityMap.h>\n#include <vw/FileIO/DiskImageResource.h>\n#include <vw/Image/InpaintView.h>\n#include <vw/FileIO/DiskImageUtils.h>\n#include <vw/Cartography/GeoReferenceUtils.h>\n\n#include <xercesc/util/PlatformUtils.hpp>\n\nusing namespace vw;\nusing namespace vw::stereo;\nusing namespace asp;\n\ntemplate <class Image1T, class Image2T>\nImageViewRef<PixelMask<Vector2f>>\nrefine_disparity(Image1T const& left_image,\n                 Image2T const& right_image,\n                 ImageViewRef<PixelMask<Vector2f>> const& integer_disp,\n                 ASPGlobalOptions const& opt, bool verbose) {\n\n  ImageViewRef<PixelMask<Vector2f>> refined_disp = integer_disp;\n\n  PrefilterModeType prefilter_mode =\n    static_cast<vw::stereo::PrefilterModeType>(stereo_settings().pre_filter_mode);\n\n  // Mode 0 and SGM modes 7-12: no refinement in this stage\n  if (stereo_settings().subpixel_mode == 0 ||\n      (stereo_settings().subpixel_mode >= 7 &&\n       stereo_settings().subpixel_mode <= 12)) {\n    if (verbose)\n      vw_out() << \"\\t--> Skipping subpixel mode.\\n\";\n    return refined_disp;\n  }\n\n  if (verbose) {\n    if (stereo_settings().pre_filter_mode == 2)\n      vw_out() << \"\\t--> Using LOG pre-processing filter with \"\n               << stereo_settings().slogW << \" sigma blur.\\n\";\n    else if (stereo_settings().pre_filter_mode == 1)\n      vw_out() << \"\\t--> Using Subtracted Mean pre-processing filter with \"\n               << stereo_settings().slogW << \" sigma blur.\\n\";\n    else\n      vw_out() << \"\\t--> NO preprocessing.\\n\";\n  }\n\n  if (stereo_settings().subpixel_mode == 1) {\n    // Parabola\n    if (verbose)\n      vw_out() << \"\\t--> Using parabola subpixel mode.\\n\";\n\n    refined_disp = parabola_subpixel(integer_disp,\n                                     left_image, right_image,\n                                     prefilter_mode, stereo_settings().slogW,\n                                     stereo_settings().subpixel_kernel);\n\n  } else if (stereo_settings().subpixel_mode == 2) {\n    // Bayes EM\n    if (verbose)\n      vw_out() << \"\\t--> Using affine adaptive subpixel mode\\n\";\n\n    refined_disp =\n      bayes_em_subpixel(integer_disp,\n                         left_image, right_image,\n                         prefilter_mode, stereo_settings().slogW,\n                         stereo_settings().subpixel_kernel,\n                         stereo_settings().subpixel_max_levels);\n\n  } else if (stereo_settings().subpixel_mode == 3) {\n    // Fast affine\n    if (verbose)\n      vw_out() << \"\\t--> Using affine subpixel mode\\n\";\n    refined_disp =\n      affine_subpixel(integer_disp,\n                      left_image, right_image,\n                      prefilter_mode, stereo_settings().slogW,\n                      stereo_settings().subpixel_kernel,\n                      stereo_settings().subpixel_max_levels);\n\n  } else if (stereo_settings().subpixel_mode == 4) {\n    // Phase correlation\n    if (verbose) {\n      vw_out() << \"\\t--> Using Phase Correlation subpixel mode\\n\";\n      vw_out() << \"\\t--> Forcing subpixel pyramid levels to zero\\n\";\n    }\n    // So far phase correlation has worked poorly with multiple levels.\n    stereo_settings().subpixel_max_levels = 0;\n\n    refined_disp =\n      phase_subpixel(integer_disp,\n                      left_image, right_image,\n                      prefilter_mode, stereo_settings().slogW,\n                      stereo_settings().subpixel_kernel,\n                      stereo_settings().subpixel_max_levels,\n                      stereo_settings().phase_subpixel_accuracy);\n\n  } else if (stereo_settings().subpixel_mode == 5) {\n    // Lucas-Kanade\n    if (verbose)\n      vw_out() << \"\\t--> Using Lucas-Kanade subpixel mode\\n\";\n\n    refined_disp =\n      lk_subpixel(integer_disp,\n                   left_image, right_image,\n                   prefilter_mode, stereo_settings().slogW,\n                   stereo_settings().subpixel_kernel,\n                   stereo_settings().subpixel_max_levels);\n\n  } else {\n    vw::vw_throw(vw::ArgumentErr() << \"Invalid subpixel mode: \"\n                 << stereo_settings().subpixel_mode << \".\\n\");\n  }\n\n  return refined_disp;\n}\n\n// Perform refinement in each tile. If using local homography,\n// apply the local homography transform for the given tile\n// to the right image before doing refinement in that tile.\ntemplate <class Image1T, class Image2T, class SeedDispT>\nclass PerTileRfne: public ImageViewBase<PerTileRfne<Image1T, Image2T, SeedDispT>> {\n  Image1T              m_left_image;\n  Image2T              m_right_image;\n  SeedDispT            m_integer_disp;\n  SeedDispT            m_sub_disp;\n  ASPGlobalOptions const&       m_opt;\n  Vector2              m_upscale_factor;\n\npublic:\n  PerTileRfne(ImageViewBase<Image1T>    const& left_image,\n               ImageViewBase<Image2T>   const& right_image,\n               ImageViewBase<SeedDispT> const& integer_disp,\n               ImageViewBase<SeedDispT> const& sub_disp,\n               ASPGlobalOptions         const& opt):\n    m_left_image(left_image.impl()), m_right_image(right_image.impl()),\n    m_integer_disp(integer_disp.impl()), m_sub_disp(sub_disp.impl()),\n    m_opt(opt) {\n\n    m_upscale_factor = Vector2(double(m_left_image.impl().cols()) / m_sub_disp.cols(),\n                               double(m_left_image.impl().rows()) / m_sub_disp.rows());\n  }\n\n  // Image View interface\n  typedef PixelMask<Vector2f>                  pixel_type;\n  typedef pixel_type                           result_type;\n  typedef ProceduralPixelAccessor<PerTileRfne> pixel_accessor;\n\n  inline int32 cols  () const { return m_left_image.cols(); }\n  inline int32 rows  () const { return m_left_image.rows(); }\n  inline int32 planes() const { return 1; }\n\n  inline pixel_accessor origin() const { return pixel_accessor(*this, 0, 0); }\n\n  inline pixel_type operator()(double /*i*/, double /*j*/, int32 /*p*/ = 0) const {\n    vw_throw(NoImplErr() << \"PerTileRfne::operator()(...) is not implemented\");\n    return pixel_type();\n  }\n\n  typedef CropView<ImageView<pixel_type>> prerasterize_type;\n  inline prerasterize_type prerasterize(BBox2i const& bbox) const {\n    ImageView<pixel_type> tile_disparity;\n    bool verbose = false;\n    tile_disparity = crop(refine_disparity(m_left_image, m_right_image,\n                                           m_integer_disp, m_opt, verbose), bbox);\n\n    prerasterize_type disparity = prerasterize_type(tile_disparity,\n                                                    -bbox.min().x(), -bbox.min().y(),\n                                                    cols(), rows());\n    return disparity;\n  }\n\n  template <class DestT>\n  inline void rasterize(DestT const& dest, BBox2i bbox) const {\n    vw::rasterize(prerasterize(bbox), dest, bbox);\n  }\n};\n\ntemplate <class Image1T, class Image2T, class SeedDispT>\nPerTileRfne<Image1T, Image2T, SeedDispT>\nper_tile_rfne(ImageViewBase<Image1T>   const& left,\n              ImageViewBase<Image2T>   const& right,\n              ImageViewBase<SeedDispT> const& integer_disp,\n              ImageViewBase<SeedDispT> const& sub_disp,\n              ASPGlobalOptions         const& opt) {\n  typedef PerTileRfne<Image1T, Image2T, SeedDispT> return_type;\n  return return_type(left.impl(), right.impl(), integer_disp.impl(), sub_disp.impl(), opt);\n}\n\n// Enable conversion from images with float pixels to images with\n// PixelGray<float> pixels.\nclass GrayCast: public ReturnFixedType<PixelGray<float>> {\npublic:\n  PixelGray<float> operator()(float v) const {\n    return PixelGray<float>(v);\n  }\n};\n\nvoid stereo_refinement(ASPGlobalOptions const& opt) {\n\n  ImageViewRef<float> left_image, right_image;\n  ImageViewRef<PixelMask<Vector2f>> input_disp;\n  ImageViewRef<PixelMask<Vector2f>> sub_disp;\n  std::string left_image_file  = opt.out_prefix+\"-L.tif\";\n  std::string right_image_file = opt.out_prefix+\"-R.tif\";\n  std::string left_mask_file   = opt.out_prefix+\"-lMask.tif\";\n  std::string right_mask_file  = opt.out_prefix+\"-rMask.tif\";\n\n  int kernel_size = std::max(stereo_settings().subpixel_kernel[0],\n                             stereo_settings().subpixel_kernel[1]);\n\n  left_image  = DiskImageView<float>(left_image_file);\n  right_image = DiskImageView<float>(right_image_file);\n\n  // It is better to fill no-data pixels with an average from\n  // neighbors than to use no-data values in processing. This is a\n  // temporary band-aid solution.\n  float left_nodata_val = -std::numeric_limits<float>::max();\n  if (vw::read_nodata_val(left_image_file, left_nodata_val))\n    vw_out() << \"Left image nodata: \" << left_nodata_val << \"\\n\";\n  float right_nodata_val = -std::numeric_limits<float>::max();\n  if (vw::read_nodata_val(right_image_file, right_nodata_val))\n    vw_out() << \"Right image nodata: \" << right_nodata_val << \"\\n\";\n\n  left_image = apply_mask(vw::fill_nodata_with_avg\n                          (create_mask(left_image, left_nodata_val), kernel_size));\n  right_image = apply_mask(vw::fill_nodata_with_avg\n                           (create_mask(right_image, right_nodata_val), kernel_size));\n\n  // Read the correct type of correlation file (float for SGM/MGM, otherwise integer)\n  std::string disp_file  = opt.out_prefix + \"-D.tif\";\n  std::string blend_file = opt.out_prefix + \"-B.tif\";\n\n  if (stereo_settings().subpix_from_blend) { // Read the stereo_blend output file\n    input_disp = DiskImageView<PixelMask<Vector2f>>(blend_file);\n  } else {\n    // Read the stereo_corr output file\n    boost::shared_ptr<DiskImageResource> rsrc(DiskImageResourcePtr(disp_file));\n    ChannelTypeEnum disp_data_type = rsrc->channel_type();\n    if (disp_data_type == VW_CHANNEL_INT32)\n      input_disp = pixel_cast<PixelMask<Vector2f>>\n        (DiskImageView< PixelMask<Vector2i>>(disp_file));\n    else // File on disk is float\n      input_disp = DiskImageView<PixelMask<Vector2f>>(disp_file);\n  }\n\n  bool skip_img_norm = asp::skip_image_normalization(opt);\n  if (skip_img_norm && \n      (stereo_settings().subpixel_mode == 2 ||\n       stereo_settings().subpixel_mode == 3)) {\n    // Images were not normalized in pre-processing. Must do so now\n    // as subpixel mode 2 and 3 assumes them to be normalized.\n    ImageViewRef<uint8> left_mask,  right_mask;\n    left_mask  = DiskImageView<uint8>(left_mask_file);\n    right_mask = DiskImageView<uint8>(right_mask_file);\n    ImageViewRef<PixelMask<float>> Limg\n      = copy_mask(left_image, create_mask(left_mask));\n    ImageViewRef<PixelMask<float>> Rimg\n      = copy_mask(right_image, create_mask(right_mask));\n    // By now the stats should be cached, but need to respect the API\n    Vector6f left_stats  = gather_stats(Limg, opt.out_prefix, left_image_file,\n                                        stereo_settings().force_reuse_match_files);\n    Vector6f right_stats = gather_stats(Rimg, opt.out_prefix, right_image_file,\n                                        stereo_settings().force_reuse_match_files);\n\n    bool use_percentile_stretch = false;\n    bool do_not_exceed_min_max = (opt.session->name() == \"isis\" ||\n                                  opt.session->name() == \"isismapisis\");\n    asp::normalize_images(stereo_settings().force_use_entire_range,\n                          stereo_settings().individually_normalize,\n                          use_percentile_stretch,\n                          do_not_exceed_min_max,\n                          left_stats, right_stats, Limg, Rimg);\n\n    // As above, fill no-data with average from neighbors\n    left_image  = apply_mask(vw::fill_nodata_with_avg(Limg, kernel_size));\n    right_image = apply_mask(vw::fill_nodata_with_avg(Rimg, kernel_size));\n  }\n\n  // The whole goal of this block it to go through the motions of\n  // refining disparity solely for the purpose of printing\n  // the relevant messages once, rather than per tile, as in the\n  // processing below.\n  bool verbose = true;\n  ImageView<PixelGray<float>> left_dummy(1, 1), right_dummy(1, 1);\n  ImageView<PixelMask<Vector2f>> dummy_disp(1, 1);\n  refine_disparity(left_dummy, right_dummy, dummy_disp, opt, verbose);\n\n  // The images must be explicitly converted to have PixelGray<float>\n  // pixels.\n  ImageViewRef<PixelGray<float>> left_gray\n    = per_pixel_filter(left_image, GrayCast());\n  ImageViewRef<PixelGray<float>> right_gray\n    = per_pixel_filter(right_image, GrayCast());\n\n  ImageViewRef<PixelMask<Vector2f>> refined_disp\n     = crop(per_tile_rfne(left_gray, right_gray,\n                          input_disp, sub_disp, opt),\n            stereo_settings().trans_crop_win);\n\n  cartography::GeoReference left_georef;\n  bool   has_left_georef = read_georeference(left_georef,  opt.out_prefix + \"-L.tif\");\n  bool   has_nodata      = false;\n  double nodata          = -32768.0;\n\n  std::string rd_file = opt.out_prefix + \"-RD.tif\";\n  vw_out() << \"Writing: \" << rd_file << \"\\n\";\n  vw::cartography::block_write_gdal_image(rd_file, refined_disp,\n                              has_left_georef, left_georef,\n                              has_nodata, nodata, opt,\n                              TerminalProgressCallback(\"asp\", \"\\t--> Refinement :\"));\n}\n\nint main(int argc, char* argv[]) {\n\n  try {\n    xercesc::XMLPlatformUtils::Initialize();\n\n    vw_out() << \"\\n[ \" << current_posix_time_string()\n             << \" ]: Stage 3 --> REFINEMENT\\n\";\n\n    stereo_register_sessions();\n\n    bool verbose = false;\n    std::vector<ASPGlobalOptions> opt_vec;\n    std::string output_prefix;\n    asp::parseStereoArgs(argc, argv, SubpixelDescription(),\n                         verbose, output_prefix, opt_vec);\n    ASPGlobalOptions opt = opt_vec[0];\n\n    // Subpixel refinement uses smaller tiles.\n    //---------------------------------------------------------\n    int ts = ASPGlobalOptions::rfne_tile_size();\n    opt.raster_tile_size = Vector2i(ts, ts);\n\n    // Internal Processes\n    //---------------------------------------------------------\n    stereo_refinement(opt);\n\n    vw_out() << \"\\n[ \" << current_posix_time_string()\n             << \" ]: REFINEMENT FINISHED\\n\";\n\n    xercesc::XMLPlatformUtils::Terminate();\n  } ASP_STANDARD_CATCHES;\n\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/stereo_sweep",
    "content": "#!/usr/bin/env python\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2025, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\nimport sys, argparse, os, subprocess, shlex, itertools\n\n# Set up the path to Python modules about to load\nbasepath    = os.path.abspath(sys.path[0])\npythonpath  = os.path.abspath(basepath + '/../Python')  # for dev ASP\nlibexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP\nsys.path.insert(0, basepath) # prepend to Python path\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\n\nimport asp_system_utils\n\ndef parseParamSweep(sweep_str):\n  \"\"\"Parse a --param-sweep string into a dict of {param_name: [values]}.\n  \n  Input format: \"--param1 val1 val2 --param2 val3 val4\"\n  Returns: {\"--param1\": [\"val1\", \"val2\"], \"--param2\": [\"val3\", \"val4\"]}\n  \n  Supports multiple separators: spaces, colons, semicolons, newlines.\n  A comma is used if a value itself has multiple parts (e.g., \"7,7\").\n  \"\"\"\n  \n  # Normalize all separators to spaces\n  normalized = sweep_str.replace(':', ' ').replace(';', ' ')\n  normalized = normalized.replace('\\n', ' ')\n  \n  # Split into tokens\n  tokens = normalized.split()\n  \n  params = {}\n  current_param = None\n  \n  for token in tokens:\n    if token.startswith('--'):\n      # Start of a new parameter\n      current_param = token\n      params[current_param] = []\n    elif current_param is not None:\n      # Value for current parameter\n      params[current_param].append(token)\n  \n  return params\n\ndef generateCombinations(parsed_params):\n  \"\"\"Generate all combinations from parsed parameters using Cartesian product.\n  \n  Args:\n    parsed_params: dict like {\"--param1\": [\"val1\", \"val2\"], \"--param2\": [\"val3\"]}\n  \n  Returns:\n    List of dicts, one for each combination:\n    [{\"--param1\": \"val1\", \"--param2\": \"val3\"}, {\"--param1\": \"val2\", \"--param2\": \"val3\"}]\n  \"\"\"\n  if not parsed_params:\n    return [{}]\n  \n  param_names = list(parsed_params.keys())\n  param_values = [parsed_params[name] for name in param_names]\n  \n  # Generate Cartesian product\n  combinations = []\n  for combo in itertools.product(*param_values):\n    combo_dict = {param_names[i]: combo[i] for i in range(len(param_names))}\n    combinations.append(combo_dict)\n  \n  return combinations\n\ndef runCombination(combo_dict, args, opt, out_prefix):\n  \"\"\"Run parallel_stereo and point2dem for a single parameter combination.\n  \n  Args:\n    combo_dict: Dict of parameters like {\"--stereo-algorithm\": \"asp_mgm\", etc}\n    args: Pass-through arguments (images, cameras, etc.)\n    opt: Parsed options object\n    out_prefix: Output prefix for this run\n  \n  Returns:\n    0 on success, non-zero on failure\n  \"\"\"\n  \n  # Build the parameter list from combo_dict\n  combo_args = []\n  for param, value in combo_dict.items():\n    # Handle multi-value parameters separated by commas (e.g., \"7,7\" -> \"7 7\")\n    if ',' in value:\n      combo_args.append(param)\n      combo_args.extend(value.replace(',', ' ').split())\n    else:\n      combo_args.extend([param, value])\n  \n  # Assemble parallel_stereo command with combination parameters\n  stereo_cmd = ['parallel_stereo'] + args + combo_args + [out_prefix]\n  \n  # Add DEM if provided\n  if opt.dem:\n    stereo_cmd.extend(['--dem', opt.dem])\n  \n  # Run the command using ASP utilities\n  if opt.dry_run:\n    print(' '.join(stereo_cmd))\n  else:\n    (out, err, status) = asp_system_utils.executeCommand(stereo_cmd, \n                                                         realTimeOutput = True)\n    if status != 0:\n      print(f\"ERROR: parallel_stereo failed with status {status}\")\n      return status\n    \n    print(f\"\\nparallel_stereo completed successfully.\")\n  \n  # Now run point2dem on the output point cloud\n  pc_file = out_prefix + \"-PC.tif\"\n  point2dem_cmd = ['point2dem', pc_file]\n  \n  # Add user-specified point2dem parameters\n  if opt.point2dem_params:\n    # Split the string into individual arguments\n    point2dem_cmd.extend(shlex.split(opt.point2dem_params))\n  \n  # If --orthoimage is requested, insert L.tif right after it\n  if opt.point2dem_params and '--orthoimage' in opt.point2dem_params:\n    l_file = out_prefix + \"-L.tif\"\n    # Find --orthoimage in the command and insert L.tif after it\n    try:\n      ortho_idx = point2dem_cmd.index('--orthoimage')\n      point2dem_cmd.insert(ortho_idx + 1, l_file)\n    except ValueError:\n      pass  # Should not happen since we checked for it\n  \n  if opt.dry_run:\n    print(' '.join(point2dem_cmd))\n  else:\n    (out, err, status) = asp_system_utils.executeCommand(point2dem_cmd,\n                                                         realTimeOutput = True)\n    if status != 0:\n      print(f\"ERROR: point2dem failed with status {status}\")\n      return status\n    \n    print(f\"\\npoint2dem completed successfully.\")\n\n  return 0\n\ndef generateRunIndex(parsed_sweeps, output_dir):\n  \"\"\"Generate run_index.csv mapping run directories to parameter values.\n  \n  Args:\n    parsed_sweeps: List of sweep dicts with combinations\n    output_dir: Output directory for the CSV file\n  \"\"\"\n  \n  # Collect all unique parameter names across all sweeps\n  all_params = set()\n  for sweep in parsed_sweeps:\n    for combo in sweep['combinations']:\n      all_params.update(combo.keys())\n  \n  # Sort parameter names for consistent column ordering\n  param_names = sorted(all_params)\n  \n  # Build CSV content\n  csv_lines = []\n  \n  # Header row\n  header = ['run_dir'] + param_names\n  csv_lines.append(', '.join(header))\n  \n  # Data rows\n  run_num = 0\n  for sweep in parsed_sweeps:\n    for combo in sweep['combinations']:\n      run_dir = f\"{output_dir}/run_{run_num:04d}\"\n      row = [run_dir]\n      \n      # Add parameter values, handling commas in values (convert to spaces)\n      for param in param_names:\n        if param in combo:\n          value = combo[param]\n          # Replace commas with spaces (multi-value parameters)\n          if ',' in value:\n            value = value.replace(',', ' ')\n          row.append(value)\n        else:\n          row.append('')  # Empty if parameter not in this combination\n      \n      csv_lines.append(', '.join(row))\n      run_num += 1\n  \n  # Write to file\n  csv_path = os.path.join(output_dir, 'run_index.csv')\n  with open(csv_path, 'w') as f:\n    f.write('\\n'.join(csv_lines) + '\\n')\n  \n  print(f\"Writing run index: {csv_path}\")\n\ndef main():\n  parser = argparse.ArgumentParser(\n    description='Run parallel_stereo on small patches with different ' + \\\n                'parameter combinations.')\n\n  parser.add_argument('--param-sweep', action='append', default=[],\n      help='Parameter sweep. Must be in quotes. Multiple such options can be ' + \\\n      'specified. Each defines a different set of parameter combinations to test.')\n  parser.add_argument('--dem', default='',\n    help='Input DEM for mapprojection. Required if using --proj-win.')\n  parser.add_argument('--output-dir', default='', \n    help='Output directory.')\n  parser.add_argument('--point2dem-params', default='',\n    help='Parameters to pass to point2dem. If --orthoimage (with no ' + \\\n    'argument) is passed in, the needed L.tif will be passed to each ' + \\\n    'created point2dem command.')\n  parser.add_argument('--dry-run', dest='dry_run', action='store_true',\n    help='Print commands without executing them.')\n\n  if len(sys.argv) == 1:\n    parser.print_help()\n    return 0\n\n  (opt, args) = parser.parse_known_args()\n  \n  # Check that output directory is provided\n  if not opt.output_dir:\n    print(\"ERROR: --output-dir is required\")\n    return 1\n  \n  # Check if --proj-win is used in any sweep, and if so, require --dem\n  has_proj_win = False\n  if opt.param_sweep:\n    for sweep_str in opt.param_sweep:\n      if '--proj-win' in sweep_str:\n        has_proj_win = True\n        break\n  \n  if has_proj_win and not opt.dem:\n    print(\"ERROR: --dem is required when using --proj-win in parameter sweeps\")\n    return 1\n  \n  # Parse parameter sweeps - each --param-sweep creates a separate experiment\n  parsed_sweeps = []\n  run_count = 0  # Running total of runs across all sweeps\n  if opt.param_sweep:\n    for sweep_num, sweep_str in enumerate(opt.param_sweep, start=1):\n      parsed = parseParamSweep(sweep_str)\n      combinations = generateCombinations(parsed)\n      parsed_sweeps.append({\n          'sweep_num': sweep_num,\n          'run_start': run_count,\n          'combinations': combinations\n      })\n      run_count += len(combinations)\n  \n  # If no sweeps specified, run once with no extra parameters\n  if not parsed_sweeps:\n    print(\"No parameter sweeps specified, running single instance\")\n    out_prefix = opt.output_dir + \"/run\"\n    os.makedirs(opt.output_dir, exist_ok=True)\n    status = runCombination({}, args, opt, out_prefix)\n    return status\n  \n  # Create output directory and generate run index before starting runs\n  os.makedirs(opt.output_dir, exist_ok=True)\n  generateRunIndex(parsed_sweeps, opt.output_dir)\n  \n  # Iterate over all sweeps and combinations\n  run_num = 0\n  \n  for sweep in parsed_sweeps:\n    print(f\"\\nProcessing sweep {sweep['sweep_num']}\")\n    \n    for combo in sweep['combinations']:\n      # Create run directory with zero-padded number\n      run_dir = f\"{opt.output_dir}/run_{run_num:04d}\"\n      os.makedirs(run_dir, exist_ok=True)\n      out_prefix = f\"{run_dir}/run\"\n      \n      print(f\"\\nRun {run_num:04d}\")\n      print(f\"Parameters: {combo}\")\n      \n      status = runCombination(combo, args, opt, out_prefix)\n      if status != 0:\n        print(f\"ERROR: Run {run_num:04d} failed, stopping\")\n        return 1\n      \n      run_num += 1\n  \n  print(f\"\\nAll {run_num} runs completed successfully\")\n  return 0\n\nif __name__ == '__main__':\n  sys.exit(main())\n"
  },
  {
    "path": "src/asp/Tools/stereo_tile",
    "content": "#!/usr/bin/env python\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2026, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\n\"\"\"\nstereo_tile - Process a single tile for distributed stereo.\n\"\"\"\n\nimport sys, argparse, subprocess, re, os, math, time, glob, shutil, platform, shlex\nimport os.path as P\n\n# Set up the path to Python modules about to load\nbasepath    = os.path.abspath(sys.path[0])\npythonpath  = os.path.abspath(basepath + '/../Python')  # for dev ASP\nlibexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP\nsys.path.insert(0, basepath) # prepend to Python path\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\n# Import after setting up the paths\nimport asp_system_utils, asp_string_utils, asp_cmd_utils, asp_stereo_utils, asp_alg_utils\nasp_system_utils.verify_python_version_is_supported()\n\n# Prepend to system PATH\nos.environ[\"PATH\"] = libexecpath + os.pathsep + os.environ[\"PATH\"]\n\n# Ensure we can look up the needed ASP libraries\nif 'ASP_LIBRARY_PATH' in os.environ:\n    os.environ['LD_LIBRARY_PATH'] = os.environ['ASP_LIBRARY_PATH']\n\ndef symlinkStatsFiles(outPrefix, tileSubdir, tilePrefix):\n    '''Symlink stats files from parent directory to tile subdir.'''\n    for f in glob.glob(outPrefix + '*stats.tif'):\n        if os.path.isdir(f):\n            continue\n        relSrc = os.path.relpath(f, tileSubdir)\n        dstF = f.replace(outPrefix, tilePrefix)\n        if not os.path.lexists(dstF):\n            os.symlink(relSrc, dstF)\n\ndef getTileByIndex(outPrefix, tileIndex):\n    '''Read the tile list and return (BBox, padding) for the given tile index.'''\n    tiles = asp_stereo_utils.readDistTileList(outPrefix)\n\n    if tileIndex < 0 or tileIndex >= len(tiles):\n        asp_system_utils.raise_error('Tile index ' + str(tileIndex) +\n                                     ' out of range [0, ' + str(len(tiles) - 1) + ']')\n\n    return tiles[tileIndex]\n\ndef runDemMosaicBlock(masterFile, blockIndex, opt):\n    '''Run dem_mosaic on a block of DEMs specified in a list. The master file\n    has the input list and output DEM name at the given index.'''\n    with open(masterFile, 'r') as f:\n        lines = [l.strip() for l in f if l.strip()]\n\n    if blockIndex < 0 or blockIndex >= len(lines):\n        asp_system_utils.raise_error('Block index ' + str(blockIndex) +\n                                     ' out of range [0, ' +\n                                     str(len(lines) - 1) + ']')\n\n    parts = lines[blockIndex].split()\n    if len(parts) != 2:\n        asp_system_utils.raise_error('Invalid master file line: ' +\n                                     lines[blockIndex])\n\n    demListFile = parts[0]\n    outputDem = parts[1]\n\n    demMosaicPath = asp_system_utils.bin_path('dem_mosaic')\n    commandList = [demMosaicPath, '--dem-list', demListFile, '-o', outputDem]\n\n    if opt.dryrun:\n        print('Command: ' + ' '.join(commandList))\n    else:\n        if opt.verbose:\n            print(' '.join(commandList))\n        subprocess.call(commandList)\n\ndef runPoint2dem(tilePrefix, opt):\n    '''Run point2dem on a tile's point cloud.'''\n    pcFile = tilePrefix + '-PC.tif'\n    commandList = [asp_system_utils.bin_path('point2dem')]\n    if opt.point2dem_options:\n        commandList += shlex.split(opt.point2dem_options)\n\n    # If --orthoimage is in the options with no argument, insert L.tif after it\n    if opt.point2dem_options and '--orthoimage' in opt.point2dem_options:\n        lFile = tilePrefix + '-L.tif'\n        try:\n            orthoIdx = commandList.index('--orthoimage')\n            commandList.insert(orthoIdx + 1, lFile)\n        except ValueError:\n            pass\n\n    commandList.append(pcFile)\n\n    if opt.dryrun:\n        print('Command: ' + ' '.join(commandList))\n    else:\n        if opt.verbose:\n            print(' '.join(commandList))\n        subprocess.call(commandList)\n\nif __name__ == '__main__':\n    usage = '''stereo_tile [options] <images> [<cameras>]\n                  <output_prefix>\n        Process a single tile for distributed stereo.\\n''' + asp_system_utils.get_asp_version()\n\n    p = argparse.ArgumentParser(usage=usage)\n    p.add_argument('--tile-index', dest='tile_index', default=None, type=int,\n                   help='Index of the tile to process (0-based).')\n    p.add_argument('-e', '--entry-point', dest='entry_point', default=0, type=int,\n                   help='Stereo pipeline entry point (default: 0). Values: 0=pprc, '\n                   '1=corr, 2=blend, 3=rfne, 4=fltr, 5=tri, 6=cleanup, 7=dem.')\n    p.add_argument('--stop-point', dest='stop_point', default=9, type=int,\n                   help='Stereo pipeline stop point, stop before this step '\n                   '(default: 9).')\n    p.add_argument('--dem', dest='dem', default=None,\n                   help='Input DEM for mapprojection. Required for tile processing.')\n    p.add_argument('--point2dem-options', dest='point2dem_options', default='',\n                   help='Options to pass to point2dem. Can pass --orthoimage '\n                   'with no argument, and the L.tif file for each tile '\n                   'will be autocompleted. Can also pass --errorimage.')\n    p.add_argument('-s', '--stereo-file', dest='stereo_file',\n                   default='./stereo.default',\n                   help='Explicitly specify the stereo.default file to use. '\n                   'This is optional.')\n    p.add_argument('--corr-seed-mode', dest='seed_mode', default=None, type=int,\n                   help='Correlation seed strategy. See stereo_corr for options.')\n    p.add_argument('--sparse-disp-options', dest='sparse_disp_options',\n                   default=None,\n                   help='Options to pass directly to sparse_disp. Use quotes '\n                   'around this string.')\n    p.add_argument('--dem-mosaic-index', dest='dem_mosaic_index', default=None,\n                   type=int,\n                   help='Index of the mosaic block to process (0-based). '\n                   'Requires --dem-mosaic-master. Invoked by stereo_dist for '\n                   'parallel DEM mosaicking.')\n    p.add_argument('--dem-mosaic-master', dest='dem_mosaic_master', default=None,\n                   help='Master file enumerating for each block to mosaic the '\n                   'input DEM list file and output DEM path, one block per line.')\n    p.add_argument('--run-dir', dest='runDir', default=None,\n                   help='Directory in which the script is running.')\n    p.add_argument('--verbose', dest='verbose', default=False, action='store_true',\n                   help='Display the commands being executed.')\n    p.add_argument('--dry-run', dest='dryrun', default=False, action='store_true',\n                   help='Do not launch the jobs, only print the commands that '\n                   'should be run.')\n    p.add_argument('-v', '--version', dest='version', default=False, action='store_true',\n                   help='Display the version of the software.')\n\n    (opt, args) = p.parse_known_args()\n    args = asp_cmd_utils.clean_args(args)\n\n    if opt.version:\n        asp_system_utils.print_version_and_exit()\n\n    # This can handle spaces in directory names, unlike when GNU parallel is in charge\n    if opt.runDir is not None:\n        os.chdir(opt.runDir)\n\n    # Handle dem mosaic mode. Runs dem_mosaic on one block and exits. Hence this\n    # aux tool does both mosaicking of DEMs or running stereo tiles depending on\n    # the options.\n    if opt.dem_mosaic_index is not None:\n        if opt.dem_mosaic_master is None:\n            asp_system_utils.raise_error('--dem-mosaic-master is required with ' +\n                                         '--dem-mosaic-index.')\n        runDemMosaicBlock(opt.dem_mosaic_master, opt.dem_mosaic_index, opt)\n        sys.exit(0)\n\n    # In tile processing mode there should be some positional arguments\n    if not args and not opt.version:\n        p.print_help()\n        asp_system_utils.raise_error('Missing input files.', code=2)\n\n    if opt.tile_index is None:\n        asp_system_utils.raise_error('The option --tile-index is required.', code=2)\n\n    if opt.dem is None:\n        asp_system_utils.raise_error('The option --dem is required for tile processing.',\n                                     code=2)\n\n    # These are not supported as stereo_tile manages its own crop windows per tile\n    for bad_opt in ['--left-image-crop-win', '--right-image-crop-win']:\n        if bad_opt in args:\n            asp_system_utils.raise_error('The option ' + bad_opt +\n                                         ' is not supported by stereo_tile.')\n\n    # Pass the DEM to the stereo C++ tools\n    args.extend(['--dem', opt.dem])\n\n    # Resolve corr-seed-mode from CLI, stereo file, or default\n    sep = \",\"\n    asp_stereo_utils.resolve_seed_mode(opt, args)\n\n    if os.path.exists(opt.stereo_file):\n        args.extend(['--stereo-file', opt.stereo_file])\n\n    # Run stereo_parse to get settings\n    settings = asp_system_utils.run_and_parse_output(\"stereo_parse\", args, sep,\n                                                     opt.verbose)\n    outPrefix = settings['out_prefix'][0]\n\n    print(\"Output prefix: \" + outPrefix)\n    print(\"Tile index: \" + str(opt.tile_index))\n\n    (tile, padding) = getTileByIndex(outPrefix, opt.tile_index)\n    print(\"Tile: \" + tile.name_str() + \", padding: \" + str(padding))\n\n    # Create tile subdir\n    tileSubdir = outPrefix + '-' + tile.name_str()\n    asp_system_utils.mkdir_p(tileSubdir)\n    tilePrefix = tileSubdir + '/' + os.path.basename(outPrefix)\n\n    # Symlink stats files to the subdir\n    symlinkStatsFiles(outPrefix, tileSubdir, tilePrefix)\n\n    # Common extra args for all steps\n    extraArgs = ['--output-prefix-override', tilePrefix,\n                  '--stereo-dist-mode',\n                  '--left-image-crop-win',\n                  str(tile.x), str(tile.y), str(tile.width), str(tile.height),\n                  '--sgm-collar-size', str(padding)]\n\n    Step = asp_stereo_utils.Step\n\n    # Validate --tr is in point2dem options when DEM step will run\n    if opt.entry_point <= Step.dem < opt.stop_point and '--tr' not in opt.point2dem_options:\n        asp_system_utils.raise_error('The option --point2dem-options must include --tr to '\n                                     'ensure consistent grid size across all tiles.')\n\n    if opt.entry_point <= Step.pprc < opt.stop_point:\n        asp_stereo_utils.stereo_run('stereo_pprc', args, opt, extra_args=extraArgs)\n\n    if opt.entry_point <= Step.corr < opt.stop_point:\n        # Compute low-res disparity (uses sparse_disp for seed mode 3)\n        tile_args = args + ['--output-prefix-override', tilePrefix]\n        asp_stereo_utils.calc_lowres_disp(tile_args, opt, sep)\n        # Run full-res correlation\n        asp_stereo_utils.stereo_run('stereo_corr', args, opt, extra_args=extraArgs)\n\n    # Skip blend - in distributed stereo each tile goes to point cloud/DEM independently,\n    # then only final DEMs are merged. No cross-talk needed until DEM merging.\n\n    if opt.entry_point <= Step.rfne < opt.stop_point:\n        asp_stereo_utils.stereo_run('stereo_rfne', args, opt, extra_args=extraArgs)\n\n    if opt.entry_point <= Step.fltr < opt.stop_point:\n        asp_stereo_utils.stereo_run('stereo_fltr', args, opt, extra_args=extraArgs)\n\n    if opt.entry_point <= Step.tri < opt.stop_point:\n        asp_stereo_utils.stereo_run('stereo_tri', args, opt, extra_args=extraArgs)\n\n    # TODO(oalexan1): Implement cleanup step (delete intermediate files per tile)\n    if opt.entry_point <= Step.clean < opt.stop_point:\n        pass\n\n    if opt.entry_point <= Step.dem < opt.stop_point:\n        runPoint2dem(tilePrefix, opt)\n\n    sys.exit(0)\n"
  },
  {
    "path": "src/asp/Tools/stereo_tri.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2026, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file stereo_tri.cc\n///\n\n// We must have the implementations of all sessions for triangulation\n#include <asp/Sessions/StereoSessionFactory.h>\n#include <asp/Sessions/StereoSessionMapProj.h>\n#include <asp/Sessions/StereoSessionIsis.h>\n#include <asp/Sessions/StereoSessionNadirPinhole.h>\n#include <asp/Sessions/StereoSessionPinhole.h>\n#include <asp/Sessions/StereoSessionRPC.h>\n#include <asp/Sessions/StereoSessionASTER.h>\n#include <asp/Camera/RPCModel.h>\n#include <asp/Camera/Covariance.h>\n#include <asp/Core/StereoSettings.h>\n#include <asp/Core/PointUtils.h>\n#include <asp/Core/DisparityProcessing.h>\n#include <asp/Core/Bathymetry.h>\n#include <asp/Core/Macros.h>\n#include <asp/Core/AspLog.h>\n#include <asp/Core/IpMatchingAlgs.h>\n#include <asp/Core/ImageUtils.h>\n#include <asp/Core/GdalUtils.h>\n#include <asp/Tools/stereo.h>\n\n#include <vw/Camera/CameraModel.h>\n#include <vw/Stereo/StereoView.h>\n#include <vw/Cartography/BathyStereoModel.h>\n#include <vw/Stereo/DisparityMap.h>\n#include <vw/Image/Filter.h>\n#include <vw/InterestPoint/MatcherIO.h>\n#include <vw/Cartography/Map2CamTrans.h>\n#include <vw/Core/Stopwatch.h>\n\n#include <xercesc/util/PlatformUtils.hpp>\n#include <ctime>\n\nusing namespace vw;\n\nnamespace asp {\n\nenum OUTPUT_CLOUD_TYPE {FULL_CLOUD, BATHY_CLOUD, TOPO_CLOUD}; // all, below water, above water\n\n/// The main class for taking in a set of disparities and returning a\n/// point cloud using triangulation. Will compute the triangulation\n/// error, and perhaps propagate covariances (creating stddev).\nclass StereoTriangulation:\n  public ImageViewBase<StereoTriangulation> {\n  std::vector<DispImageType>    m_disparity_maps;\n  std::vector<const vw::camera::CameraModel*> m_camera_ptrs;\n  std::vector<vw::TransformPtr> m_transforms; // e.g., map-projection or homography to undo\n  vw::cartography::Datum        m_datum;\n  vw::stereo::StereoModel       m_stereo_model;\n  vw::BathyStereoModel          m_bathy_model;\n  bool                          m_is_map_projected;\n  bool                          m_bathy_correct;\n  OUTPUT_CLOUD_TYPE             m_cloud_type;\n  ImageViewRef<PixelMask<float>> m_left_aligned_bathy_mask;\n  ImageViewRef<PixelMask<float>> m_right_aligned_bathy_mask;\n\n  typedef typename DispImageType::pixel_type DPixelT;\n\npublic:\n\n  typedef Vector6 pixel_type;\n  typedef Vector6 result_type;\n  typedef ProceduralPixelAccessor<StereoTriangulation> pixel_accessor;\n\n  /// Constructor\n  StereoTriangulation(std::vector<DispImageType>    const& disparity_maps,\n                      std::vector<const vw::camera::CameraModel*> const& camera_ptrs,\n                      std::vector<vw::TransformPtr> const& transforms,\n                      vw::cartography::Datum        const& datum,\n                      vw::stereo::StereoModel       const& stereo_model,\n                      vw::BathyStereoModel          const& bathy_model,\n                      bool is_map_projected,\n                      bool bathy_correct, OUTPUT_CLOUD_TYPE cloud_type,\n                      ImageViewRef<PixelMask<float>> left_aligned_bathy_mask,\n                      ImageViewRef<PixelMask<float>> right_aligned_bathy_mask):\n    m_disparity_maps(disparity_maps), m_camera_ptrs(camera_ptrs),\n    m_transforms(transforms), m_datum(datum),\n    m_stereo_model(stereo_model),\n    m_bathy_model(bathy_model),\n    m_is_map_projected(is_map_projected),\n    m_bathy_correct(bathy_correct),\n    m_cloud_type(cloud_type),\n    m_left_aligned_bathy_mask(left_aligned_bathy_mask),\n    m_right_aligned_bathy_mask(right_aligned_bathy_mask) {\n\n    // Sanity check\n    for (int p = 1; p < (int)m_disparity_maps.size(); p++) {\n      if (m_disparity_maps[0].cols() != m_disparity_maps[p].cols() ||\n          m_disparity_maps[0].rows() != m_disparity_maps[p].rows())\n        vw_throw(ArgumentErr() << \"In multi-view triangulation, all disparities \"\n                  << \"must have the same dimensions.\\n\");\n    }\n  }\n\n  inline int32 cols  () const { return m_disparity_maps[0].cols(); }\n  inline int32 rows  () const { return m_disparity_maps[0].rows(); }\n  inline int32 planes() const { return 1; }\n\n  inline pixel_accessor origin() const { return pixel_accessor(*this); }\n\n  /// Compute the 3D coordinate corresponding to a pixel location.\n  /// - p is not actually used here, it should always be zero!\n  inline result_type operator()(size_t i, size_t j, size_t p = 0) const {\n\n    // For each input image, de-warp the pixel in to the native camera coordinates\n    int num_disp = m_disparity_maps.size();\n    std::vector<Vector2> pixVec(num_disp + 1);\n    pixVec[0] = m_transforms[0]->reverse(Vector2(i,j)); // De-warp \"left\" pixel\n    for (int c = 0; c < num_disp; c++) {\n      Vector2 pix;\n      DPixelT disp = m_disparity_maps[c](i,j,p); // Disparity value at this pixel\n      if (is_valid(disp)) // De-warp the \"right\" pixel\n        pix = m_transforms[c+1]->reverse(Vector2(i,j) + stereo::DispHelper(disp));\n      else // Insert flag values\n        pix = Vector2(std::numeric_limits<double>::quiet_NaN(),\n                      std::numeric_limits<double>::quiet_NaN());\n      pixVec[c+1] = pix;\n    }\n\n    // Compute the location of the 3D point observed by each input pixel\n    // when no bathymetry correction is needed.\n    Vector3 errorVec;\n    pixel_type result;\n    if (!m_bathy_correct) {\n      try {\n        subvector(result, 0, 3) = m_stereo_model(pixVec, errorVec);\n        double errLen = norm_2(errorVec);\n        if (!stereo_settings().propagate_errors) {\n          subvector(result, 3, 3) = errorVec;\n        } else {\n          // Store intersection error norm in band 3, horizontal\n          // stddev in band 4, and vertical stddev in band 5 (if band\n          // index starts from 0).\n          result[3] = errLen;\n          auto const& v = asp::stereo_settings().horizontal_stddev; // alias\n          subvector(result, 4, 2)\n            = asp::propagateCovariance(subvector(result, 0, 3),\n                                       m_datum, v[0], v[1],\n                                       m_camera_ptrs[0], m_camera_ptrs[1],\n                                       pixVec[0], pixVec[1]);\n        }\n\n        // Filter by triangulation error, if desired\n        if (stereo_settings().max_valid_triangulation_error > 0.0 &&\n            errLen > stereo_settings().max_valid_triangulation_error) {\n          result = pixel_type();\n          errorVec = Vector3();\n        }\n      } catch(...) {\n        return pixel_type(); // The zero vector, it means that there is no valid data\n      }\n\n      return result; // Contains location and error vector\n    }\n\n    // Continue with bathymetry correction. Note how we assume no\n    // multi-view stereo happens.\n    Vector2 lpix(i, j);\n    DPixelT disp = m_disparity_maps[0](i, j, p);\n    if (!is_valid(disp)) {\n      subvector(result, 0, 3) = Vector3(0, 0, 0);\n      subvector(result, 3, 3) = Vector3(0, 0, 0);\n      return result;\n    }\n\n    // See if both the left and right aligned matching pixels are in the aligned\n    // bathymetry masks which means bathymetry correction should happen.\n    // Note that pixVec has the unwarped left and right pixels.\n    Vector2 rpix = lpix + stereo::DispHelper(disp);\n\n    // Do bathy only when the mask is invalid (under water)\n    bool do_bathy = vw::areMasked(m_left_aligned_bathy_mask, m_right_aligned_bathy_mask,\n                                  lpix, rpix);\n\n    if (m_cloud_type == TOPO_CLOUD) {\n      if (!do_bathy) {\n        // We are on dry land. Triangulate as before. In this mode\n        // the bathy plane may not even exist.\n        subvector(result, 0, 3) = m_stereo_model(pixVec, errorVec);\n        subvector(result, 3, 3) = errorVec;\n        return result;\n      } else {\n        // We are under water, but we are not interested in the bathy\n        // point cloud. Return no-data.\n        subvector(result, 0, 3) = Vector3(0, 0, 0);\n        subvector(result, 3, 3) = Vector3(0, 0, 0);\n        return result;\n      }\n    }\n\n    if ((m_cloud_type == BATHY_CLOUD && !do_bathy)) {\n      // There is no point in continuing, as we won't get what is asked\n      subvector(result, 0, 3) = Vector3(0, 0, 0);\n      subvector(result, 3, 3) = Vector3(0, 0, 0);\n      return result;\n    }\n\n    // Do the triangulation. The did_bathy variable may change. \n    bool did_bathy = false;\n    subvector(result, 0, 3) = m_bathy_model(pixVec, errorVec, do_bathy, did_bathy);\n    subvector(result, 3, 3) = errorVec;\n\n    // If we wanted to do bathy correction and it did not happen, or the opposite,\n    // don't return the computed answer\n    if ((m_cloud_type == BATHY_CLOUD && !did_bathy) ||\n        (m_cloud_type == TOPO_CLOUD && did_bathy)) {\n      subvector(result, 0, 3) = Vector3(0, 0, 0);\n      subvector(result, 3, 3) = Vector3(0, 0, 0);\n      return result;\n    }\n\n    // Filter by triangulation error, if desired\n    if (stereo_settings().max_valid_triangulation_error > 0.0 &&\n        norm_2(errorVec) > stereo_settings().max_valid_triangulation_error) {\n      result = pixel_type();\n      errorVec = Vector3();\n    }\n\n    return result; // Contains location and error vector\n  }\n\n  typedef StereoTriangulation prerasterize_type;\n  inline prerasterize_type prerasterize(BBox2i const& bbox) const {\n    return PreRasterHelper(bbox, m_transforms);\n  }\n  template <class DestT>\n  inline void rasterize(DestT const& dest, BBox2i const& bbox) const {\n    vw::rasterize(prerasterize(bbox), dest, bbox);\n  }\n\nprivate:\n\n  // Find the region associated with the right image that we need to bring in memory\n  // based on the disparity \n  BBox2i calc_right_bbox(BBox2i const& left_bbox, ImageView<DPixelT> const& disparity) const {\n      BBox2i disparity_range = stereo::get_disparity_range(disparity);\n      disparity_range.max() += Vector2i(1,1);\n      BBox2i right_bbox = left_bbox + disparity_range.min();\n      right_bbox.max() += disparity_range.size();\n      return right_bbox;\n  }\n\n  /// RPC Map Transform needs to be explicitly copied and told to cache for performance.\n  template <class T>\n  prerasterize_type PreRasterHelper(BBox2i const& bbox, std::vector<T> const& transforms) const {\n\n    ImageViewRef<PixelMask<float>> in_memory_left_aligned_bathy_mask;\n    ImageViewRef<PixelMask<float>> in_memory_right_aligned_bathy_mask;\n\n    // Code for NON-MAP-PROJECTED session types.\n    if (m_is_map_projected == false) {\n      // We explicitly bring in-memory the disparities for the current box\n      // to speed up processing later, and then we pretend this is the entire\n      // image by virtually enlarging it using a CropView.\n      std::vector<ImageViewRef<DPixelT>> disparity_cropviews;\n      for (int p = 0; p < (int)m_disparity_maps.size(); p++) {\n        ImageView<DPixelT> clip = crop(m_disparity_maps[p], bbox);\n        ImageViewRef<DPixelT> cropview_clip = crop(clip, -bbox.min().x(), -bbox.min().y(),\n                                                   cols(), rows());\n        disparity_cropviews.push_back(cropview_clip);\n\n        if (m_bathy_correct) {\n          // Bring the needed parts of the bathy masks in memory as well.\n          // We assume no multiview for stereo with bathy correction.\n          BBox2i right_bbox = calc_right_bbox(bbox, clip);\n\n          // Bring the needed parts of the bathy masks in memory as well\n          BBox2i cropped_right_bbox = right_bbox;\n          cropped_right_bbox.expand(1); // will be needed later during triangulation\n          cropped_right_bbox.crop(bounding_box(m_right_aligned_bathy_mask));\n          ImageView<PixelMask<float>> l_mask_clip = crop(m_left_aligned_bathy_mask, bbox);\n          ImageView<PixelMask<float>> r_mask_clip = crop(m_right_aligned_bathy_mask,\n                                                         cropped_right_bbox);\n          in_memory_left_aligned_bathy_mask\n            = crop(l_mask_clip, -bbox.min().x(), -bbox.min().y(), cols(), rows());\n          in_memory_right_aligned_bathy_mask\n            = crop(r_mask_clip, -cropped_right_bbox.min().x(),\n                   -cropped_right_bbox.min().y(), cols(), rows());\n        }\n      }\n\n      return prerasterize_type(disparity_cropviews, m_camera_ptrs, transforms, m_datum,\n                               m_stereo_model, m_bathy_model,\n                               m_is_map_projected, m_bathy_correct, m_cloud_type,\n                               in_memory_left_aligned_bathy_mask,\n                               in_memory_right_aligned_bathy_mask);\n    }\n\n    // Code for MAP-PROJECTED session types.\n\n    // This is to help any transforms (right now just Map2CamTrans)\n    // that must cache their side data. Normally this would happen if\n    // we were using a TransformView. Copies are made of the\n    // transforms so we are not having a race condition with setting\n    // the cache in both transforms while the other threads want to do the same.\n    // Without some sort of duplication function in the transform base class we need\n    // to manually copy the Map2CamTrans type which is pretty hacky.\n    std::vector<T> transforms_copy(transforms.size());\n    for (size_t i = 0; i < transforms.size(); ++i)\n      transforms_copy[i] = vw::cartography::mapproj_trans_copy(transforms[i]);\n\n    // As a side effect, this call makes transforms_copy create a local cache we\n    // want later. Caching is fast for dense rasterizing purposes, but slow for\n    // sparse pixels.\n    transforms_copy[0]->reverse_bbox(bbox);\n    if (transforms_copy.size() != m_disparity_maps.size() + 1) {\n      vw_throw(ArgumentErr() << \"In multi-view triangulation, \"\n                << \"the number of disparities must be one less \"\n                << \"than the number of images.\");\n    }\n\n    std::vector<ImageViewRef<DPixelT>> disparity_cropviews;\n    for (int p = 0; p < (int)m_disparity_maps.size(); p++) {\n\n      // We explicitly bring in-memory the disparities for the current\n      // box to speed up processing later, and then we pretend this is\n      // the entire image by virtually enlarging it using a CropView.\n\n      ImageView<DPixelT> clip(crop(m_disparity_maps[p], bbox));\n      ImageViewRef<DPixelT> cropview_clip = crop(clip, -bbox.min().x(), -bbox.min().y(),\n                                                 cols(), rows());\n      disparity_cropviews.push_back(cropview_clip);\n\n      // Calculate the bbox necessary to bring things into memory\n      BBox2i right_bbox = calc_right_bbox(bbox, clip);\n\n      if (m_bathy_correct) {\n        // Bring the needed parts of the bathy masks in memory as well\n        BBox2i cropped_right_bbox = right_bbox;\n        cropped_right_bbox.expand(1); // will be needed later during triangulation\n        cropped_right_bbox.crop(bounding_box(m_right_aligned_bathy_mask));\n        ImageView<PixelMask<float>> l_mask_clip = crop(m_left_aligned_bathy_mask, bbox);\n        ImageView<PixelMask<float>> r_mask_clip = crop(m_right_aligned_bathy_mask,\n                                                       cropped_right_bbox);\n\n        in_memory_left_aligned_bathy_mask\n          = crop(l_mask_clip, -bbox.min().x(), -bbox.min().y(), cols(), rows());\n        in_memory_right_aligned_bathy_mask\n          = crop(r_mask_clip, -cropped_right_bbox.min().x(),\n                 -cropped_right_bbox.min().y(), cols(), rows());\n      }\n\n      // Also cache the data for subsequent transforms\n      // As a side effect this call makes transforms_copy create a local cache we want later\n      transforms_copy[p+1]->reverse_bbox(right_bbox);\n    }\n\n    return prerasterize_type(disparity_cropviews, m_camera_ptrs, transforms_copy, m_datum,\n                             m_stereo_model, m_bathy_model, m_is_map_projected,\n                             m_bathy_correct, m_cloud_type,\n                             in_memory_left_aligned_bathy_mask,\n                             in_memory_right_aligned_bathy_mask);\n  } // End function PreRasterHelper() mapprojected version\n}; // End class StereoTriangulation\n\n/// A wrapper function for StereoTriangulation view construction\nStereoTriangulation\nstereo_triangulation(std::vector<DispImageType> const& disparities,\n                     std::vector<const vw::camera::CameraModel*> const& camera_ptrs,\n                     std::vector<vw::TransformPtr>  const& transforms,\n                     vw::cartography::Datum         const& datum,\n                     vw::stereo::StereoModel        const& stereo_model,\n                     vw::BathyStereoModel           const& bathy_model,\n                     bool is_map_projected,\n                     bool bathy_correct,\n                     OUTPUT_CLOUD_TYPE cloud_type,\n                     ImageViewRef<PixelMask<float>> left_aligned_bathy_mask,\n                     ImageViewRef<PixelMask<float>> right_aligned_bathy_mask) {\n\n  typedef StereoTriangulation result_type;\n  return result_type(disparities, camera_ptrs, transforms, datum, stereo_model, bathy_model,\n                     is_map_projected, bathy_correct, cloud_type,\n                     left_aligned_bathy_mask, right_aligned_bathy_mask);\n}\n\n// TODO(oalexan1): Move some of these functions to a class or something!\n\n// ImageView operator that takes the last three elements of a vector\n// (the error part) and replaces them with the norm of that 3-vector.\nstruct PointAndErrorNorm : public ReturnFixedType<Vector4> {\n  Vector4 operator() (Vector6 const& pt) const {\n    Vector4 result;\n    subvector(result,0,3) = subvector(pt,0,3);\n    result[3] = norm_2(subvector(pt,3,3));\n    return result;\n  }\n};\n\ntemplate <class ImageT>\nUnaryPerPixelView<ImageT, PointAndErrorNorm>\ninline point_and_error_norm(ImageViewBase<ImageT> const& image) {\n  return UnaryPerPixelView<ImageT, PointAndErrorNorm>(image.impl(), PointAndErrorNorm());\n}\n\ntemplate <class ImageT>\nvoid save_point_cloud(Vector3 const& shift, ImageT const& point_cloud,\n                      std::string const& point_cloud_file,\n                      vw::cartography::GeoReference const& georef,\n                      ASPGlobalOptions const& opt) {\n\n  vw_out() << \"Writing point cloud: \" << point_cloud_file << \"\\n\";\n  bool has_georef = true;\n  bool has_nodata = false;\n  double nodata = -std::numeric_limits<float>::max(); // smallest float\n\n  std::map<std::string, std::string> keywords; // will go to the geoheader\n  if (stereo_settings().propagate_errors) {\n    keywords[\"BAND1\"] = \"ECEF_X\";\n    keywords[\"BAND2\"] = \"ECEF_Y\";\n    keywords[\"BAND3\"] = \"ECEF_Z\";\n    keywords[\"BAND4\"] = \"IntersectionErr\";\n    keywords[\"BAND5\"] = \"HorizontalStdDev\";\n    keywords[\"BAND6\"] = \"VerticalStdDev\";\n  }\n\n  if (opt.session->supports_multi_threading()) {\n    asp::block_write_approx_gdal_image\n      (point_cloud_file, shift,\n       stereo_settings().point_cloud_rounding_error,\n       point_cloud,\n       has_georef, georef, has_nodata, nodata,\n       opt, TerminalProgressCallback(\"asp\", \"\\t--> Triangulating: \"),\n       keywords);\n  } else {\n    // ISIS does not support multi-threading\n    asp::write_approx_gdal_image\n      (point_cloud_file, shift,\n       stereo_settings().point_cloud_rounding_error,\n       point_cloud,\n       has_georef, georef, has_nodata, nodata,\n       opt, TerminalProgressCallback(\"asp\", \"\\t--> Triangulating: \"),\n       keywords);\n  }\n}\n\n// TODO(oalexan1): Move this to some low-level utils file  \nVector3 find_approx_points_median(std::vector<Vector3> const& points) {\n\n  // Find the median of the x coordinates of points, then of y, then of\n  // z. Perturb the median a bit to ensure it is never exactly on top\n  // of a real point, as in such a case after subtraction of that\n  // point from median we'd get the zero vector which by convention\n  // is invalid.\n\n  if (points.empty())\n    return Vector3();\n\n  Vector3 median;\n  std::vector<double> V(points.size());\n  for (int i = 0; i < (int)median.size(); i++) {\n    for (int p = 0; p < (int)points.size(); p++) V[p] = points[p][i];\n    sort(V.begin(), V.end());\n    median[i] = V[points.size()/2];\n\n    median[i] += median[i]*1e-10*rand()/double(RAND_MAX);\n  }\n\n  return median;\n}\n\n// Find the point cloud center\n// TODO(oalexan1): Move this to some low-level point cloud utils file\nVector3 find_point_cloud_center(Vector2i const& tile_size,\n                                ImageViewRef<Vector6> const& point_cloud) {\n\n  // Estimate the cloud center with coarse sampling\n  std::vector<Vector3> points;\n  for (int attempt = 1; attempt <= 4; attempt++) {\n    double numSamples = 25 * attempt;\n    int dcol = round(point_cloud.cols()/numSamples);\n    int drow = round(point_cloud.rows()/numSamples);\n    if (dcol < 1)\n      dcol = 1;\n    if (drow < 1)\n      drow = 1;\n\n    // Iterate over the cloud with this sampling rate\n    for (int col = 0; col < point_cloud.cols(); col += dcol) {\n      for (int row = 0; row < point_cloud.rows(); row += drow) {\n        Vector3 xyz = subvector(point_cloud(col, row), 0, 3);\n        if (xyz == Vector3())\n          continue; // skip invalid points\n        points.push_back(xyz);\n      }\n    }\n    if (points.size() > 1)\n      return find_approx_points_median(points);\n\n    vw::vw_out() << \"Failed to estimate the point cloud center in attempt: \"\n                 << attempt << \". Will try again with denser sampling.\\n\";\n  }\n\n  // If sampling fails, do a more thorough algorithm. This can be very slow\n  // if the point cloud has a big hole in the middle.\n\n  // Compute the point cloud in a tile around the center of the\n  // cloud. Find the median of all the points in that cloud.  That\n  // will be the cloud center. If the tile is too small, spiral away\n  // from the center adding other tiles.  Keep the tiles aligned to a\n  // multiple of tile_size, for consistency with how the point cloud\n  // is written to disk later on.\n  // The logic is done on tiles of pixels, rather than per individual\n  // pixel, as that's the only way we can access the point cloud structure.\n  int numx = (int)ceil(point_cloud.cols()/double(tile_size[0]));\n  int numy = (int)ceil(point_cloud.rows()/double(tile_size[1]));\n\n  // Trace an ever growing square \"ring\"\n  for (int r = 0; r <= std::max(numx/2, numy/2); r++) {\n\n    // We are now on the boundary of the square of size 2*r with\n    // center at (numx/2, numy/2). Iterate over that boundary.\n    for (int x = numx/2-r; x <= numx/2+r; x++) {\n      for (int y = numy/2-r; y <= numy/2+r; y++) {\n\n        if (x != numx/2-r && x != numx/2+r &&\n             y != numy/2-r && y != numy/2+r)\n          continue; // Skip inner points; we must keep on the \"ring\" for given r.\n\n        if (x < 0 || y < 0 || x >= numx || y >= numy)\n          continue; // out of bounds\n\n        BBox2i tile(x*tile_size[0], y*tile_size[1], tile_size[0], tile_size[1]);\n        tile.crop(bounding_box(point_cloud));\n\n        // Crop to the cloud area actually having points\n        tile.crop(stereo_settings().trans_crop_win);\n\n        // Triangulate in the existing tile. That will trigger\n        // many complicated calculations and the result will be\n        // in memory in cropped_cloud.\n        ImageView<Vector6> cropped_cloud = crop(point_cloud, tile);\n        for (int px = 0; px < cropped_cloud.cols(); px++) {\n          for (int py = 0; py < cropped_cloud.rows(); py++) {\n            Vector3 xyz = subvector(cropped_cloud(px, py), 0, 3);\n            if (xyz == Vector3())\n              continue;\n            points.push_back(xyz);\n          }\n        }\n\n        // Stop if we have enough points to do a reliable mean estimation\n        if (points.size() > 100)\n          return find_approx_points_median(points);\n\n      }// end y loop\n    }// end x loop\n  }// end r loop\n\n  // Have to use what we've got\n  return find_approx_points_median(points);\n}\n\n// TODO(oalexan1): Move this to some low-level new util file\nbool read_point(std::string const& file, Vector3 & point) {\n  point = Vector3();\n\n  std::ifstream fh(file.c_str());\n  if (!fh.good()) return false;\n\n  for (int c = 0; c < (int)point.size(); c++)\n    if (! (fh >> point[c])) return false;\n\n  return true;\n}\nvoid write_point(std::string const& file, Vector3 const& point) {\n  std::ofstream fh(file.c_str());\n  fh.precision(18); // precision(16) is not enough\n  for (int c = 0; c < (int)point.size(); c++)\n    fh << point[c] << \" \";\n  fh << \"\\n\";\n}\n\n// This is some logic unrelated to triangulation, but there seems to be no\n// good place to put it. Unalign the disparity, and/or create match points\n// from disparity, and/or solve for jitter.\nvoid disp_or_matches_work(std::string const& output_prefix,\n                          std::vector<ASPGlobalOptions> const& opt_vec,\n                          std::vector<vw::TransformPtr> const& transforms,\n                          std::vector<DispImageType> const& disparity_maps,\n                          std::vector<std::string> const& image_files,\n                          std::vector<std::string> const& camera_files,\n                          // Cameras can change\n                          std::vector<boost::shared_ptr<camera::CameraModel>> & cameras) {\n  // Sanity check for some of the operations below\n  VW_ASSERT(disparity_maps.size() == 1 && transforms.size() == 2,\n            vw::ArgumentErr() << \"Expecting two images and one disparity.\\n\");\n\n  ASPGlobalOptions opt = opt_vec[0];\n  bool is_map_projected = opt.session->isMapProjected();\n\n  // Transforms to compensate for alignment\n  vw::TransformPtr left_trans  = transforms[0];\n  vw::TransformPtr right_trans = transforms[1];\n\n  // Create a disparity map with between the original unaligned images\n  if (stereo_settings().unalign_disparity) {\n    bool matches_as_txt = stereo_settings().matches_as_txt;\n    std::string unaligned_disp_file = asp::unwarped_disp_file(output_prefix,\n                                                              opt.in_file1,\n                                                              opt.in_file2,\n                                                              matches_as_txt);\n    unalign_disparity(is_map_projected, disparity_maps[0], left_trans, right_trans,\n                      opt, unaligned_disp_file);\n  }\n\n  // If the images are mapprojected and we know the original image names,\n  // use those for the match file. That because the matches are between\n  // the original images, not the map-projected ones.\n  // Read the raw image names from the mapprojection metadata.\n  std::string left_raw_image = opt.in_file1, right_raw_image = opt.in_file2;\n  {\n    std::string adj_key, img_key, cam_type_key, cam_file_key, dem_key;\n    std::string adj, img, cam_type, cam_file, dem;\n    asp::read_mapproj_header(opt.in_file1, adj_key, img_key,\n                             cam_type_key, cam_file_key, dem_key,\n                             adj, img, cam_type, cam_file, dem);\n    if (!img.empty())\n      left_raw_image = img;\n  }\n  {\n    std::string adj_key, img_key, cam_type_key, cam_file_key, dem_key;\n    std::string adj, img, cam_type, cam_file, dem;\n    asp::read_mapproj_header(opt.in_file2, adj_key, img_key,\n                             cam_type_key, cam_file_key, dem_key,\n                             adj, img, cam_type, cam_file, dem);\n    if (!img.empty())\n      right_raw_image = img;\n  }\n  bool matches_as_txt = stereo_settings().matches_as_txt;\n  std::string match_file = ip::match_filename(output_prefix + \"-disp\",\n                                              left_raw_image, right_raw_image,\n                                              matches_as_txt);\n\n  // Pull matches from disparity.\n  if (stereo_settings().num_matches_from_disparity > 0 &&\n      stereo_settings().num_matches_from_disp_triplets > 0) {\n    vw_throw(ArgumentErr() << \"Cannot have both --num-matches-from-disparity and  \"\n              << \"--num-matches-from-disp-triplets.\\n\");\n  }\n\n  if (stereo_settings().num_matches_from_disparity > 0) {\n    bool gen_triplets = false;\n    matchesFromDisp(opt, disparity_maps[0],\n                    left_raw_image, right_raw_image,\n                    left_trans, right_trans, match_file,\n                    stereo_settings().num_matches_from_disparity,\n                    gen_triplets, is_map_projected,\n                    stereo_settings().matches_as_txt);\n  }\n  if (stereo_settings().num_matches_from_disp_triplets > 0) {\n    bool gen_triplets = true;\n    matchesFromDisp(opt, disparity_maps[0],\n                    left_raw_image, right_raw_image,\n                    left_trans, right_trans, match_file,\n                    stereo_settings().num_matches_from_disp_triplets,\n                    gen_triplets, is_map_projected,\n                    stereo_settings().matches_as_txt);\n  }\n\n  return;\n}\n\n/// Main triangulation function\nvoid stereo_triangulation(std::string const& output_prefix,\n                          std::vector<ASPGlobalOptions> const& opt_vec) {\n\n  try { // Outer try/catch\n\n    bool is_map_projected = opt_vec[0].session->isMapProjected();\n\n    // Collect the images, cameras, and transforms. The left image is\n    // the same in all n-1 stereo pairs forming the n images multiview\n    // system. Same for cameras and transforms.\n    std::vector<std::string> image_files, camera_files;\n    std::vector<boost::shared_ptr<camera::CameraModel>> cameras;\n    std::vector<vw::TransformPtr> transforms;\n    for (int p = 0; p < (int)opt_vec.size(); p++) {\n\n      boost::shared_ptr<camera::CameraModel> camera_model1, camera_model2;\n      opt_vec[p].session->camera_models(camera_model1, camera_model2);\n\n      boost::shared_ptr<StereoSession> sPtr = opt_vec[p].session;\n\n      if (p == 0) { // The first image is the \"left\" image for all pairs.\n        image_files.push_back(opt_vec[p].in_file1);\n        camera_files.push_back(opt_vec[p].cam_file1);\n        cameras.push_back(camera_model1);\n        transforms.push_back(sPtr->tx_left());\n      }\n\n      image_files.push_back(opt_vec[p].in_file2);\n      camera_files.push_back(opt_vec[p].cam_file2);\n      cameras.push_back(camera_model2);\n      transforms.push_back(sPtr->tx_right());\n    }\n\n    // If the distance from the left camera center to a point is greater than\n    // the universe radius, we remove that pixel and replace it with a zero\n    // vector, which is the missing pixel value in the point_image.\n    //\n    // We apply the universe radius here and then write the result directly to a\n    // file on disk.\n    stereo::UniverseRadiusFunc universe_radius_func(Vector3(), 0, 0);\n    try{\n      if (stereo_settings().universe_center == \"camera\") {\n        if (opt_vec[0].session->name() == \"rpc\") {\n          vw_throw(InputErr() << \"Stereo with RPC cameras cannot \"\n                              << \"have the camera as the universe center.\\n\");\n        }\n\n        universe_radius_func\n          = stereo::UniverseRadiusFunc(cameras[0]->camera_center(Vector2()),\n                                       stereo_settings().near_universe_radius,\n                                       stereo_settings().far_universe_radius);\n      } else if (stereo_settings().universe_center == \"zero\") {\n        universe_radius_func\n        = stereo::UniverseRadiusFunc(Vector3(),\n                                     stereo_settings().near_universe_radius,\n                                     stereo_settings().far_universe_radius);\n      }\n    } catch (std::exception &e) {\n      vw_out() << e.what() << \"\\n\";\n      vw_out(WarningMessage) << \"Could not find the camera center. \"\n                             << \"Will not be able to filter triangulated points by radius.\\n\";\n    } // End try/catch\n\n    std::vector<DispImageType> disparity_maps;\n    for (int p = 0; p < (int)opt_vec.size(); p++)\n      disparity_maps.push_back\n        (opt_vec[p].session->pre_pointcloud_hook(opt_vec[p].out_prefix+\"-F.tif\"));\n\n    bool do_disp_or_matches_work\n      = (stereo_settings().unalign_disparity                        ||\n         stereo_settings().num_matches_from_disparity > 0           ||\n         stereo_settings().num_matches_from_disp_triplets > 0);\n    if (do_disp_or_matches_work) {\n      disp_or_matches_work(output_prefix, opt_vec, transforms,\n                           disparity_maps, image_files, camera_files,\n                           // Cameras can change\n                           cameras);\n    }\n\n    // In correlator mode, can go no further\n    if (asp::stereo_settings().correlator_mode) {\n      vw_out() << \"\\t--> Skipping triangulation in correlator mode.\\n\";\n      return;\n    }\n\n    if (is_map_projected)\n      vw_out() << \"\\t--> Inputs are map projected.\" << \"\\n\";\n\n    // Strip the smart pointers and form the stereo model\n    std::vector<const vw::camera::CameraModel*> camera_ptrs;\n    int num_cams = cameras.size();\n    for (int c = 0; c < num_cams; c++)\n      camera_ptrs.push_back(cameras[c].get());\n\n    // Convert the angle tol to be in terms of dot product and pass it\n    // to the stereo model.\n    double angle_tol = vw::stereo::StereoModel::robust_1_minus_cos\n      (stereo_settings().min_triangulation_angle*M_PI/180);\n\n    // For bathymetry, apply alignment to masks, if it was not done already in preprocessing.\n    // This situation occurs when parallel_stereo is called with --prev-run-prefix,\n    // and the previous run was not a bathy run. Note that we do not do this\n    // when we skip the point cloud center computation. In that mode we are processing\n    // individual parallel_stereo tiles, and the stereo_tri call which aligns the bathy\n    // masks and computes the cloud center just finished. This is fragile logic.\n    bool bathy_correct = asp::doBathy(asp::stereo_settings());\n    if (bathy_correct && !stereo_settings().skip_point_cloud_center_comp)\n      opt_vec[0].session->align_bathy_masks(opt_vec[0]);\n\n    // Create both a regular stereo model and a bathy stereo\n    // model. Will use the latter only if we do bathymetry. This way\n    // the regular stereo model and bathy stereo model can have\n    // different interfaces and the former need not know about the\n    // latter. Templates are avoided too.\n    vw::stereo::StereoModel stereo_model(camera_ptrs, angle_tol);\n    vw::BathyStereoModel bathy_stereo_model(camera_ptrs, angle_tol);\n\n    // See if to return all triangulated points, the ones where bathy correction took\n    // place, or the ones were it did not take place. Switch to an enum\n    // as that is faster to check for later than a string.\n    OUTPUT_CLOUD_TYPE cloud_type;\n    if (stereo_settings().output_cloud_type == \"all\")\n      cloud_type = FULL_CLOUD;\n    else if (stereo_settings().output_cloud_type == \"bathy\")\n      cloud_type = BATHY_CLOUD;\n    else if (stereo_settings().output_cloud_type == \"topo\")\n      cloud_type = TOPO_CLOUD;\n    else\n      vw_throw(ArgumentErr() << \"Unknown value for --output-cloud-type.\\n\");\n\n    // Load the bathy plane and masks\n    std::vector<vw::BathyPlane> bathy_plane_vec;\n    ImageViewRef<PixelMask<float>> left_aligned_bathy_mask, right_aligned_bathy_mask;\n    if (bathy_correct) {\n\n      if (disparity_maps.size() != 1)\n        vw_throw(ArgumentErr()\n                 << \"Bathymetry correction does not work with multiview stereo.\\n\");\n\n      opt_vec[0].session->read_aligned_bathy_masks(left_aligned_bathy_mask,\n                                                   right_aligned_bathy_mask);\n\n      if (left_aligned_bathy_mask.cols() != disparity_maps[0].cols() ||\n          left_aligned_bathy_mask.rows() != disparity_maps[0].rows())\n        vw_throw(ArgumentErr() << \"The dimensions of disparity and left \"\n                  << \"aligned bathymetry mask must agree.\\n\");\n\n      // The bathy plane is needed only for the underwater component\n      if (asp::stereo_settings().output_cloud_type != \"topo\") {\n        int num_images = 2;\n        std::string planes_to_load \n          = asp::readBathyPlanesStrOrList(stereo_settings().bathy_plane, \n                                          stereo_settings().bathy_plane_list);\n        vw::readBathyPlanes(planes_to_load, num_images, bathy_plane_vec);\n        bathy_stereo_model.set_bathy(stereo_settings().refraction_index, bathy_plane_vec);\n      }\n    }\n\n    // Used to find the datum for the given planet\n    vw::cartography::GeoReference georef = opt_vec[0].session->get_georef();\n\n    // Apply radius function and stereo model in one go\n    vw_out() << \"\\t--> Generating a 3D point cloud.\" << \"\\n\";\n    ImageViewRef<Vector6> point_cloud = per_pixel_filter\n      (stereo_triangulation(disparity_maps, camera_ptrs, transforms, georef.datum(),\n                            stereo_model, bathy_stereo_model,\n                            is_map_projected, bathy_correct, cloud_type,\n                            left_aligned_bathy_mask, right_aligned_bathy_mask),\n         universe_radius_func);\n\n    // In correlator mode, can go no further\n    if (asp::stereo_settings().correlator_mode)\n      return;\n\n    // If we crop the left and right images, at each run we must\n    // recompute the cloud center, as the cropping windows may have changed.\n    bool crop_left  = (stereo_settings().left_image_crop_win  != BBox2i(0, 0, 0, 0));\n    bool crop_right = (stereo_settings().right_image_crop_win != BBox2i(0, 0, 0, 0));\n\n    // Compute the point cloud center, unless done by now\n    Vector3 cloud_center = Vector3();\n    if (!stereo_settings().save_double_precision_point_cloud) {\n      std::string cloud_center_file = output_prefix + \"-PC-center.txt\";\n      if (!read_point(cloud_center_file, cloud_center) || crop_left || crop_right) {\n        if (!stereo_settings().skip_point_cloud_center_comp) {\n          vw::Stopwatch sw;\n          sw.start();\n          cloud_center = find_point_cloud_center(opt_vec[0].raster_tile_size, point_cloud);\n          vw_out() << \"Writing point cloud center: \" << cloud_center_file << \"\\n\";\n          write_point(cloud_center_file, cloud_center);\n          sw.stop();\n          vw::vw_out() << \"Elapsed time in point cloud center estimation: \"\n            << sw.elapsed_seconds() << \" seconds.\\n\";\n        }\n      } else {\n        vw_out() << \"Reading existing point cloud center: \" << cloud_center_file << \"\\n\";\n      }\n    }\n    if (stereo_settings().compute_point_cloud_center_only) {\n      vw_out() << \"Computed the point cloud center.\\n\";\n      return;\n    }\n\n    // We are supposed to do the triangulation in trans_crop_win only\n    // so force rasterization in that box only using crop().\n    // The cloud has 4 bands unless computing the error vector or stddev,\n    // when it has 6.\n    BBox2i cbox = stereo_settings().trans_crop_win;\n    std::string point_cloud_file = output_prefix + \"-PC.tif\";\n    if (stereo_settings().compute_error_vector ||\n        stereo_settings().propagate_errors) {\n      // The case num_cams > 2 && stereo_settings().propagate_errors\n      // will throw an exception, so we won't get here.\n      if (num_cams > 2 && stereo_settings().compute_error_vector)\n        vw_out(WarningMessage) << \"For more than two cameras, the error \"\n                               << \"vector between rays is not meaningful. \"\n                               << \"Setting it to (err_len, 0, 0).\" << \"\\n\";\n\n      ImageViewRef<Vector6> crop_pc = crop(point_cloud, cbox);\n      save_point_cloud(cloud_center, crop_pc, point_cloud_file, georef, opt_vec[0]);\n    } else {\n      ImageViewRef<Vector4> crop_pc = crop(point_and_error_norm(point_cloud), cbox);\n      save_point_cloud(cloud_center, crop_pc, point_cloud_file, georef, opt_vec[0]);\n    } // End if/else\n\n    // Must print this at the end, as it contains statistics on the number of rejected points.\n    vw_out() << \"\\t--> \" << universe_radius_func;\n\n  } catch (IOErr const& e) {\n    vw_throw(ArgumentErr() << \"\\nUnable to start at the triangulation stage. \"\n              << \"Could not read input files.\\n\" << e.what() << \"\\n\");\n  } // End outer try/catch\n} // End function stereo_triangulation()\n\n} // End namespace asp\n\nint main(int argc, char* argv[]) {\n\n  if (asp::stereo_settings().correlator_mode &&\n      asp::stereo_settings().num_matches_from_disparity <= 0 &&\n      asp::stereo_settings().num_matches_from_disp_triplets <= 0) {\n    vw_out() << \"The triangulation step is skipped with --correlator-mode.\\n\";\n    return 0;\n  }\n\n  try {\n    xercesc::XMLPlatformUtils::Initialize();\n\n    vw_out() << \"\\n[ \" << asp::current_posix_time_string()\n             << \" ]: Stage 5 --> TRIANGULATION\\n\";\n\n    asp::stereo_register_sessions();\n\n    // Unlike other stereo executables, triangulation can handle multiple images and cameras.\n    bool verbose = false;\n    std::vector<asp::ASPGlobalOptions> opt_vec;\n    std::string output_prefix;\n    asp::parseStereoArgs(argc, argv, asp::TriangulationDescription(),\n                         verbose, output_prefix, opt_vec);\n\n    if (opt_vec.size() > 1) {\n      // For multiview, turn on logging to file in the run directory\n      // in output_prefix, not just in individual subdirectories.\n      asp::log_to_file(argc, argv, opt_vec[0].stereo_default_filename,\n                       output_prefix);\n    }\n\n    // Keep only those stereo pairs for which filtered disparity exists\n    std::vector<asp::ASPGlobalOptions> opt_vec_new;\n    for (int p = 0; p < (int)opt_vec.size(); p++) {\n      if (fs::exists(opt_vec[p].out_prefix+\"-F.tif\"))\n        opt_vec_new.push_back(opt_vec[p]);\n    }\n    opt_vec = opt_vec_new;\n    if (opt_vec.empty())\n      vw_throw(ArgumentErr() << \"No valid F.tif files found.\\n\");\n\n    // Triangulation uses small tiles.\n    //---------------------------------------------------------\n    int ts = asp::ASPGlobalOptions::tri_tile_size();\n    for (int s = 0; s < (int)opt_vec.size(); s++)\n      opt_vec[s].raster_tile_size = Vector2i(ts, ts);\n\n    // This is good info to have at triangulation. Also prints a warning regarding\n    // small triangulation angle and potentially an empty point cloud.\n    if (opt_vec.size() == 1 && !asp::stereo_settings().stereo_dist_mode)\n      asp::estimate_convergence_angle(opt_vec[0]);\n\n    asp::stereo_triangulation(output_prefix, opt_vec);\n\n    vw_out() << \"\\n[ \" << asp::current_posix_time_string() << \" ]: TRIANGULATION FINISHED\\n\";\n\n    xercesc::XMLPlatformUtils::Terminate();\n  } ASP_STANDARD_CATCHES;\n\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/texrecon",
    "content": "#!/usr/bin/env python\n\n# Copyright (c) 2021, United States Government, as represented by the\n# Administrator of the National Aeronautics and Space Administration.\n#\n# All rights reserved.\n#\n# The \"ISAAC - Integrated System for Autonomous and Adaptive Caretaking\n# platform\" software is licensed under the Apache License, Version 2.0\n# (the \"License\"); you may not use this file except in compliance with the\n# License. You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n# License for the specific language governing permissions and limitations\n# under the License.\n\n\"\"\"\nA wrapper around the tools that when run together produce a textured mesh.\n\"\"\"\nimport argparse, os, re, shutil, subprocess, sys, glob\nimport numpy as np\n\n# Set up the path to Python modules about to load\nbasepath    = os.path.abspath(sys.path[0])\npythonpath  = os.path.abspath(basepath + '/../Python')  # for dev ASP\nlibexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP\nsys.path.insert(0, basepath) # prepend to Python path\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\n\nimport asp_rig_utils, asp_system_utils\n\ndef process_args(args):\n    \"\"\"\n    Set up the parser and parse the args.\n    \"\"\"\n\n    parser = argparse.ArgumentParser(description = \"Parameters for texrecon.\")\n    \n    parser.add_argument(\"--rig_config\",  dest=\"rig_config\", default=\"\",\n                        help = \"Rig configuration file.\")\n    \n    parser.add_argument(\"--rig_sensor\", dest=\"rig_sensor\", default=\"\",\n                        help=\"Which rig sensor images to texture. Must be among the \" + \\\n                        \"sensors specified via --rig_config. To use images from \" +\n                        \"several sensors, pass in a quoted list of them, \" + \\\n                        \"separated by a space.\")\n\n    parser.add_argument(\"--camera_poses\", dest=\"camera_poses\",\n                        default=\"\", help= \"Read images and camera poses from this list.\")\n\n    parser.add_argument(\"--subset\", dest=\"subset\",\n                        default=\"\", help= \"Use only the subset of images from this list.\")\n    \n    parser.add_argument(\"--mesh\", dest=\"mesh\",\n                        default=\"\", help=\"The mesh to use for texturing, in .ply format.\")\n\n    parser.add_argument(\"--max_texture_size\", dest=\"max_texture_size\",\n                        default=\"2048\",\n                        help=\"The maximum size (in pixels) of each texture file \" + \\\n                        \"created for the produced textured mesh.\")\n\n    parser.add_argument(\"--texture_alg\", dest=\"texture_alg\",\n                        default=\"center\", help= \"Use one of the two texture creation modes: 'center' (for a surface patch choose the image in which the patch shows up closer to the image center), 'area' (for a surface patch choose the image whose camera view direction is most aligned with the surface normal).\")\n    parser.add_argument('--skip_local_seam_leveling', dest = \"skip_local_seam_leveling\",\n                        action='store_true')\n    \n    parser.add_argument(\"--out_dir\", dest=\"out_dir\",\n                        default=\"\", help=\"The directory where to write the textured mesh \" + \\\n                        \"and other data.\")\n    \n    # Note how the percent sign below is escaped, by writing: %%\n    parser.add_argument(\"--undistorted_crop_win\", dest=\"undistorted_crop_win\", default = \"\",\n                        help = \"The dimensions of the central image region to keep after \"   + \\\n                        \"undistorting an image and before using it in texturing. Normally \"  + \\\n                        \"85%% - 90%% of distorted (actual) image dimensions would do. \"      + \\\n                        \"Suggested the Astrobee images: \"        + \\\n                        \"sci_cam: '1250 1000' nav_cam: '1100 776'. haz_cam: '250 200'.\")\n    \n    args = parser.parse_args()\n\n    return args\n\ndef sanity_checks(args):\n\n    if args.camera_poses == \"\":\n        raise Exception(\"The path to the list having input images and poses was not specified.\")\n\n    if args.mesh == \"\":\n        raise Exception(\"The mesh to use for texturing was not specified.\")\n\n    if args.rig_config == \"\":\n        raise Exception(\"The path to the rig configuration was not specified.\")\n\n    if args.rig_sensor == \"\":\n        raise Exception(\"The rig sensor to use for texturing was not specified.\")\n\n    if args.out_dir == \"\":\n        raise Exception(\"The path to the output directory was not specified.\")\n\n    if args.undistorted_crop_win == \"\":\n        raise Exception(\"The undistorted crop win was not specified.\")\n\ndef convert_intrinsics_to_texrecon(undist_intrinsics_file):\n\n    (widx, widy, f, cx, cy) = asp_rig_utils.read_intrinsics(undist_intrinsics_file)\n\n    max_wid = widx\n    if widy > max_wid:\n        max_wid = widy\n\n    # normalize\n    nf = f / max_wid\n    ncx = cx / widx\n    ncy = cy / widy\n    d0 = 0.0\n    d1 = 0.0\n    paspect = 1.0\n\n    return (nf, d0, d1, paspect, ncx, ncy)\n\ndef create_texrecon_cameras(undistorted_images, world_to_cam, nf, d0, d1, paspect, ncx, ncy):\n    if len(undistorted_images) != len(world_to_cam):\n        raise Exception(\"Expecting as many images as cameras.\")\n\n    cams = []\n    for it in range(len(undistorted_images)):\n        path, ext = os.path.splitext(undistorted_images[it])\n        cam = path + \".cam\"\n        cams.append(cam)\n\n        print(\"Writing: \" + cam)\n        with open(cam, \"w\") as g:\n            M = world_to_cam[it]\n            # write translation\n            g.write(\"%0.17g %0.17g %0.17g \" % (M[0][3], M[1][3], M[2][3]))\n\n            # write rotation\n            g.write(\n                \"%0.17g %0.17g %0.17g %0.17g %0.17g %0.17g %0.17g %0.17g %0.17g\\n\"\n                % (M[0][0], M[0][1], M[0][2], M[1][0], M[1][1], M[1][2],\n                   M[2][0], M[2][1], M[2][2]))\n\n            # normalized inrinsics\n            g.write(\"%0.17g %0.17g %0.17g %0.17g %0.17g %0.17g\\n\"\n                % (nf, d0, d1, paspect, ncx, ncy))\n    return cams\n    \ndef run_texrecon(tools_base_dir, undistorted_images, cams, mesh,\n                 skip_local_seam_leveling, texture_dir):\n\n    # That is one long path\n    texrecon_path = tools_base_dir + \"/bin/texrecon_bin\"\n    if not os.path.exists(texrecon_path):\n        # Handle the case when the dev version of ASP is used\n        print(\"Warning: Cannot find texrecon at: \" + texrecon_path)\n        texrecon_path = asp_system_utils.which('texrecon_bin')\n        if texrecon_path is not None and os.path.exists(texrecon_path):\n            print(\"Will use: \" + texrecon_path)\n        else:\n            raise Exception(\"Cannot find: \" + texrecon_path)\n    \n    asp_rig_utils.mkdir_p(texture_dir)\n\n    # Form the list of images to pass in\n    index = texture_dir + \"/index.txt\"\n    if len(undistorted_images) != len(cams):\n        print(\"Must have as many images as cameras.\")\n        sys.exit(1)\n    print(\"Writing: \" + index)\n    with open(index, \"w\") as fh:\n        for it in range(len(undistorted_images)):\n            # texrecon likes the cameras first\n            fh.write(cams[it] + \"\\n\")\n            fh.write(undistorted_images[it] + \"\\n\")\n    \n    cmd = [texrecon_path, index, mesh, texture_dir,\n           \"-o\", \"gauss_clamping\",\n           \"-d\", args.texture_alg,\n           \"--keep_unseen_faces\",\n           # TODO(oalexan1): Need to understand why texrecon insists on an equal sign\n           # for the option below while it does not need that for other options.\n           \"--max_texture_size=\" + str(args.max_texture_size)]\n\n    if skip_local_seam_leveling:\n        cmd += ['--skip_local_seam_leveling']\n\n    log_file = os.path.join(texture_dir, \"texrecon_log.txt\")\n    print(\"Running texrecon.\\n\")\n    asp_rig_utils.run_cmd(cmd)\n\n    textured_mesh = texture_dir + \".obj\"\n\n    print(\"\\nWrote: \" + textured_mesh)\n    \n    return textured_mesh\n\nif __name__ == \"__main__\":\n\n    args = process_args(sys.argv)\n    tools_base_dir = os.path.dirname(os.path.dirname(os.path.abspath(sys.argv[0])))\n\n    sanity_checks(args)\n\n    asp_rig_utils.mkdir_p(args.out_dir)\n    all_undistorted_images = []\n    all_cams   = []\n\n    # Can handle multiple sensors\n    sensors = args.rig_sensor.split()\n    for sensor in sensors:\n        (images, world_to_cam) \\\n                 = asp_rig_utils.parse_cameras(args.camera_poses, args.subset,\n                                                           sensor)\n        \n        extension = '.jpg' # extension of undistorted images, as preferred by texrecon\n        extra_opts = [\"--save_bgr\"] # create color images\n        suff = \"_texrecon\"\n        (undist_intrinsics_file, undistorted_images, undist_dir) \\\n                                 = asp_rig_utils.undistort_images(args, sensor,\n                                                              images, tools_base_dir,\n                                                              extension, extra_opts, suff)\n        (nf, d0, d1, paspect, ncx, ncy) = convert_intrinsics_to_texrecon(undist_intrinsics_file)\n        cams = create_texrecon_cameras(undistorted_images, world_to_cam,\n                                       nf, d0, d1, paspect, ncx, ncy)\n\n        all_undistorted_images += undistorted_images\n        all_cams += cams\n\n    texture_dir = args.out_dir + \"/\" + \"_\".join(sensors) + \"/texture\"\n    run_texrecon(tools_base_dir, all_undistorted_images, all_cams, args.mesh,\n                 args.skip_local_seam_leveling, texture_dir)\n\n"
  },
  {
    "path": "src/asp/Tools/theia_sfm",
    "content": "#!/usr/bin/env python\n# Copyright (c) 2017, United States Government, as represented by the\n# Administrator of the National Aeronautics and Space Administration.\n#\n# All rights reserved.\n#\n# The Astrobee platform is licensed under the Apache License, Version 2.0\n# (the \"License\"); you may not use this file except in compliance with the\n# License. You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n# License for the specific language governing permissions and limitations\n# under the License.\n\n\"\"\"\nA wrapper around TheiaSfm.\n\"\"\"\n\nimport argparse, glob, os, re, shutil, subprocess, sys, platform\n\n# Set up the path to Python modules about to load\nbasepath    = os.path.abspath(sys.path[0])\npythonpath  = os.path.abspath(basepath + '/../Python')  # for dev ASP\nlibexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP\nsys.path.insert(0, basepath) # prepend to Python path\nsys.path.insert(0, pythonpath)\nsys.path.insert(0, libexecpath)\n\nimport asp_rig_utils, asp_system_utils\n\ndef sanityChecks(args):\n\n    if args.rig_config == \"\":\n        raise Exception(\"The path to the rig configuration file was not specified.\")\n\n    if args.theia_flags == \"\":\n        raise Exception(\"The path to the Theia flags was not specified.\")\n\n    if not os.path.exists(args.theia_flags):\n        raise Exception(\"Cannot find the Theia flags file: \" + args.theia_flags)\n\n    if args.out_dir == \"\":\n        raise Exception(\"The path to the output directory was not specified.\")\n    \ndef processArgs(args, base_dir):\n    \"\"\"\n    Set up the parser and parse the args.\n    \"\"\"\n\n    # Number of arguments before starting to parse them\n    num_input_args = len(sys.argv)\n\n    parser = argparse.ArgumentParser(description=\"\")\n    parser.add_argument(\"--rig-config\",  dest=\"rig_config\", default=\"\",\n                        help = \"Rig configuration file.\")\n\n    parser.add_argument(\"--images\",  dest=\"images\", default=\"\",\n                        help = \"Images, as individual wildcards. Example: \" + \\\n                        \"'dir/cam1/*tif dir/cam2/*tif.\")\n\n    parser.add_argument(\"--image-list\",  dest=\"image_list\", default=\"\",\n                        help = \"Use the images from this list, instead of setting \" + \\\n                        \"--images. Images must be separated by a newline.\")\n   \n    parser.add_argument(\"--image-sensor-list\",  dest=\"image_sensor_list\", default=\"\",\n                        help = \"An alternative way of listing the input images, \" + \\\n                        \"when the sensor name is specified separately in the same \" + \\\n                        \"file. See the naming convention in the documentation.\")\n        \n    parser.add_argument(\"--theia-flags\", dest=\"theia_flags\",\n                        default=\"\", help=\"The flags to pass to Theia. By default, \" + \\\n                        \"the file ``share/theia_flags.txt`` in the software \"       + \\\n                        \"distribution is used. On Linux and Mac, the option \"        + \\\n                        \"--random_seed=1 is passed to Theia by default, to \"       + \\\n                        \"ensure reproducible results.\")\n\n    parser.add_argument(\"--out-dir\", dest=\"out_dir\", default=\"\",\n                        help=\"The output directory (only the 'cameras.nvm' \" + \\\n                        \"file in it is needed afterwards).\")\n\n    args, other = parser.parse_known_args()\n\n    # Set the Theia path if missing\n    if args.theia_flags == \"\":\n        args.theia_flags = base_dir + \"/share/theia_flags.txt\"\n    \n    # Print the help message if called with no arguments\n    if num_input_args <= 1:\n        parser.print_help()\n        sys.exit(1)\n\n    # Remove continuation lines in the string (those are convenient\n    # for readability in docs)\n    args.images = args.images.replace('\\\\', '')\n    args.images = args.images.replace('\\n', ' ')\n\n    if int(args.images != \"\") + int(args.image_list != \"\") + int(len(other) > 0) + \\\n         int(args.image_sensor_list != \"\") != 1:\n        raise Exception(\"Must set the input images using --images \" + \\\n                        \"--image_list, --image_sensor_list, or individual images, \" + \\\n                        \"but using just one approach.\")\n    \n    # The inputs can be given as wildcards, file having an image list,\n    # or individually specified images\n    image_array = []\n    for image_wildcard in args.images.split():\n        # Expand all wildcards\n        image_array += glob.glob(image_wildcard)\n    # Use the image list, if provided\n    if args.image_list != \"\":\n        image_array = asp_rig_utils.read_list(args.image_list)\n    # Use images specified on the command line with no quotes\n    if len(other) > 0:\n        image_array = other[:]\n\n    # Error checking    \n    asp_rig_utils.check_for_sub_images(image_array)\n    sanityChecks(args)\n    \n    return (args, image_array)\n\ndef genTheiaInputs(rig_config, args, image_array):\n    '''\n    Create the inputs as Theia wants them.\n    '''\n    \n    # Find the sensor name for each image    \n    (image_array, img_sensor_dict) \\\n        = asp_rig_utils.findSensorNames(image_array, rig_config, args.image_sensor_list)\n    \n    # Initialize the data structure\n    images_by_sensor = {}\n    extensions = set()\n\n    # Parse the images for all cameras\n    image_set = set()\n    image_array = sorted(image_array)\n    for image in image_array:\n        image_set.add(image)\n\n        if image in img_sensor_dict:\n            sensor_name = img_sensor_dict[image]\n        else:\n            raise Exception(\"Could not find sensor name for image: \" + image)\n        \n        if sensor_name not in images_by_sensor:\n            images_by_sensor[sensor_name] = []\n        images_by_sensor[sensor_name].append(image)\n        ext = asp_rig_utils.imageExtension(images_by_sensor[sensor_name])\n        extensions.add(ext)\n\n    if len(image_set) != len(image_array):\n        raise Exception(\"Found duplicate input images.\")\n    if len(extensions) > 1:\n        raise Exception(\"Input images have a mix of filename extensions. Use just one. \" + \\\n                        \"Found: \", extensions)\n    if len(extensions) == 0:\n        raise Exception(\"The input image set is invalid.\")\n    extension = list(extensions)[0]\n\n    print(\"Output directory: \" + args.out_dir)    \n    asp_rig_utils.mkdir_p(args.out_dir)\n\n    # Remove old images in sym_image_dir\n    sym_image_dir = args.out_dir + \"/sym_images\"\n    old_images = glob.glob(sym_image_dir + \"/*\")\n    if len(old_images) > 0:\n        print(\"Removing old images from \" + sym_image_dir)\n        for image in old_images:\n            os.remove(image)\n\n    # Theia likes all images in the same dir, so do it with sym links\n    print(\"Creating sym links to the input images in: \" + sym_image_dir)\n    asp_rig_utils.mkdir_p(sym_image_dir)\n    sym_images = {}\n    nonempty_rig = []\n    for sensor_id in range(len(rig_config)):\n        sensor_name = rig_config[sensor_id]['sensor_name']\n        sym_images[sensor_name] = []\n        if sensor_name not in images_by_sensor:\n            print(\"Found a sensor name with no images: \" + sensor_name)\n            continue\n        \n        nonempty_rig.append(rig_config[sensor_id])\n        num_images = len(images_by_sensor[sensor_name])\n        \n        for it in range(num_images):\n            image = images_by_sensor[sensor_name][it]\n\n            # Sanity check. Each image file name must be /path/to/<timestamp>.extension.\n            # Also check if the timestamp is unique.\n            src_file = os.path.relpath(image, sym_image_dir)\n            base_file = os.path.basename(image)\n           \n            if image in img_sensor_dict:\n              sensor_name = img_sensor_dict[image]\n            else:\n              raise Exception(\"Could not find sensor name for image: \" + image)\n            \n            # If the sensor name is not part of the image name, add it, to ensure\n            # uniqueness.\n            dst_file = os.path.basename(image)\n            if sensor_name not in dst_file:\n                dst_file = sensor_name + \"_\" + dst_file\n            dst_file = sym_image_dir + \"/\" + dst_file\n            sym_images[sensor_name].append(dst_file)\n            os.symlink(src_file, dst_file)\n            \n    # Must use this later on, otherwise the syntax of the file created\n    # later is incorrect.\n    rig_config = nonempty_rig[:]\n    \n    calib_file = asp_rig_utils.genCalibrationFile(args, rig_config, sym_images)\n\n    return (calib_file, sym_image_dir, images_by_sensor, sym_images, extension)\n\ndef write_with_full_path(nvm_file, final_nvm_file,\n                    offset_file, final_offset_file,\n                    images, sym_images):\n    \"\"\"\n    Theia saves images without full path. Go back to original image names in the nvm\n    and offset files.\n    \"\"\"\n    # Make a dict for quick lookup\n    image_dict = {}\n    for key in images:\n        for i in range(len(images[key])):\n            image_dict[os.path.basename(sym_images[key][i])] = images[key][i]\n\n    in_files = [nvm_file, offset_file]\n    out_files = [final_nvm_file, final_offset_file]\n\n    for file_it in range(2):\n        lines = []\n        with open(in_files[file_it], 'r') as fh:\n            lines = fh.readlines()\n\n        for line_it in range(len(lines)):\n            vals = lines[line_it].split()\n            if len(vals) > 0 and vals[0] in image_dict:\n                vals[0] = image_dict[vals[0]]\n                lines[line_it] = \" \".join(vals) + \"\\n\"\n\n        print(\"Writing file with original image names: \" + out_files[file_it])\n        with open(out_files[file_it], 'w') as fh:\n            fh.writelines(lines)\n    \nif __name__ == \"__main__\":\n\n    base_dir = asp_system_utils.findTheiaInstallDir()\n    \n    # TODO(oalexan1): Setting the dynamic library path this way is fragile, but\n    # I can't think of any better solution, and otherwise it fails to find the lib.\n    if 'Darwin' in platform.system():\n        key = 'DYLD_LIBRARY_PATH'\n        if key not in os.environ:\n            os.environ[key] = base_dir + '/lib'\n        else:\n            os.environ[key] = base_dir + '/lib' + ':' + os.environ[key]\n    \n    (args, image_array) = processArgs(sys.argv, base_dir)\n\n    rig_config = asp_rig_utils.parseRigConfig(args.rig_config)\n\n    (calib_file, sym_image_dir, images, sym_images, image_extension) \\\n                 = genTheiaInputs(rig_config, args, image_array)\n\n    reconstruction_file = args.out_dir + \"/reconstruction\"\n    matching_dir = args.out_dir + \"/matches\"\n\n    # Wipe old data\n    for old_reconstruction in glob.glob(reconstruction_file + \"*\"):\n        print(\"Deleting old reconstruction: \" + old_reconstruction)\n        os.remove(old_reconstruction)\n\n    count = 0\n    for old_matches in glob.glob(matching_dir + \"/*\"):\n        if count == 0:\n            print(\"Wiping old matches in: \" + matching_dir)\n        count += 1\n        os.remove(old_matches)\n\n    cmd = [base_dir + \"/bin/build_reconstruction\", \"--flagfile\",\n           args.theia_flags, \"--images\",\n           sym_image_dir + \"/*\" + image_extension,\n           \"--calibration_file\", calib_file,\n           \"--output_reconstruction\", reconstruction_file,\n           \"--matching_working_directory\", matching_dir,\n           \"--intrinsics_to_optimize\", \"NONE\", \"-v\", \"2\"]\n    if sys.platform == 'linux' or sys.platform == 'darwin':\n        cmd += [\"--random_seed\", \"1\"]\n    asp_rig_utils.run_cmd(cmd)\n    \n    nvm_file = reconstruction_file + \".nvm\"\n    cmd = [base_dir + \"/bin/export_to_nvm_file\", \"-input_reconstruction_file\",\n           reconstruction_file + \"-0\", \"-output_nvm_file\", nvm_file]\n    asp_rig_utils.run_cmd(cmd)\n\n    final_nvm_file = args.out_dir + \"/cameras.nvm\"\n\n    offset_file = reconstruction_file + \"_offsets.txt\";\n    final_offset_file = args.out_dir + \"/cameras_offsets.txt\";\n    \n    write_with_full_path(nvm_file, final_nvm_file, offset_file, final_offset_file,\n                         images, sym_images)\n    \n    # Wipe the reconstruction.nvm file and its offsets, as it has relative paths.\n    # TODO(oalexan1): May need to write cameras.nvm to start with, then overwrite it\n    # in-place.\n    if os.path.exists(nvm_file):\n        #print(\"Removing: \" + nvm_file)\n        os.remove(nvm_file)\n    # Also wipe the offset file\n    if os.path.exists(offset_file):\n        #print(\"Removing: \" + offset_file)\n        os.remove(offset_file)\n    \n"
  },
  {
    "path": "src/asp/Tools/tif_mosaic.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n/// \\file tif_mosaic.cc\n///\n\n#include <asp/Core/AspProgramOptions.h>\n#include <asp/Core/Macros.h>\n#include <asp/Core/InterestPointMatching.h>\n\n#include <vw/FileIO/DiskImageUtils.h>\n#include <vw/FileIO/ImageChannelRead.h>\n#include <vw/Image/RoundAndClamp.h>\n#include <vw/Image/Interpolation.h>\n#include <vw/Image/Filter.h>\n\nusing namespace vw;\nnamespace po = boost::program_options;\n\n#include <limits>\n\n/// Simple class to store image info and compute the associated transform.\nstruct ImageData{\n  std::string src_file;\n  int    band;\n  ImageViewRef<float> src_img;\n  BBox2  src_box, dst_box;\n  double nodata_value;\n  AffineTransform transform; // Transform from src_box to dst_box.\n\n  ImageData(std::string const& src_file_in, int band_in,\n            BBox2 const& src_box_in, BBox2 const& dst_box_in,\n            bool has_input_nodata_value, double input_nodata_value\n           ):\n    src_file(src_file_in), band(band_in), src_box(src_box_in), dst_box(dst_box_in),\n    nodata_value(0.0),\n    // Compute the transform from the input bbox to the output bbox\n    transform(AffineTransform(Matrix2x2(dst_box.width()/src_box.width(),0,\n                                        0,dst_box.height()/src_box.height()),\n                              dst_box.min() - src_box.min())) {\n\n    // Extract the desired band\n    int num_bands = get_num_channels(src_file);\n    if (num_bands == 1){\n      src_img = DiskImageView<float>(src_file);\n    }else{\n      // Multi-band image. Pick the desired band. In principle, this\n      // block can handle the above case as well. We do it this way\n      // because reading multi-band images is a fragile process in\n      // ASP, so if we know for sure that just one band is present,\n      // don't come here.\n      int channel = band - 1;  // In VW, bands start from 0, not 1.\n      src_img = vw::read_float_channel(src_file, channel);\n    }\n\n    // Read nodata-value from disk, if available. Overwrite with\n    // user-provided nodata-value if given.\n    DiskImageResourceGDAL in_rsrc(src_file);\n    if ( in_rsrc.has_nodata_read() ) nodata_value = in_rsrc.nodata_read();\n    if ( has_input_nodata_value    ) nodata_value = input_nodata_value;\n\n  }\n}; // End class ImageData\n\n/// Fix seams by finding interest point matches and adjusting the\n/// transforms so that they map points from one image on top of\n/// matches from another image. We count on the fact\n/// that each image overlaps with the next one.\n/// - Uses a translation+scale transform.\nvoid fix_seams_using_ip(std::vector<ImageData> & img_data){\n\n  for (int img_index = 0; img_index < int(img_data.size())-1; img_index++) {\n\n    // The intersection of the image regions in the common\n    // destination domain.\n    BBox2 intersection_box = img_data[img_index].dst_box;\n    intersection_box.crop(img_data[img_index+1].dst_box);\n\n    // Pull into first image's pixel domain\n    BBox2 box0 = img_data[img_index].transform.reverse_bbox(intersection_box);\n    DiskImageView<vw::PixelGray<float>> img0(img_data[img_index].src_file);\n    box0.crop(bounding_box(img0));\n    ImageView<vw::PixelGray<float>> crop0 = crop(img0, box0);\n\n    // Pull into second image's pixel domain\n    BBox2 box1 = img_data[img_index+1].transform.reverse_bbox(intersection_box);\n    DiskImageView<vw::PixelGray<float>> img1(img_data[img_index+1].src_file);\n    box1.crop(bounding_box(img1));\n    ImageView<vw::PixelGray<float>> crop1 = crop(img1, box1);\n\n    // The transform from cropped image0 to cropped image1\n    int ip_per_tile = 0; // auto-determination\n    Matrix3x3 T = asp::translation_ip_matching(crop0, crop1,\n                                               ip_per_tile,\n                                               \"\", \"\", // TODO: Use IP files?\n                                               img_data[img_index].nodata_value,\n                                               img_data[img_index+1].nodata_value);\n    T = inverse(T); // originally it was going from image1 to image0\n\n    // The transform from image0 to cropped image0\n    Matrix3x3 T0;\n    T0.set_identity();\n    T0(0, 2) = -box0.min().x();\n    T0(1, 2) = -box0.min().y();\n\n    // The transform from cropped image1 to image1\n    Matrix3x3 T1;\n    T1.set_identity();\n    T1(0, 2) = box1.min().x();\n    T1(1, 2) = box1.min().y();\n\n    // The transform from image0 to image 1\n    T = T1*T*T0;\n\n    // The transform from image1 to image 0\n    Matrix3x3 TI = inverse(T);\n\n    Matrix3x3 N = affine2mat(img_data[img_index].transform)*TI;\n    Matrix3x3 N0 = affine2mat(img_data[img_index+1].transform);\n\n    vw_out() << \"Old transform for image \" << img_index+1 << \": \" << N0 << std::endl;\n    vw_out() << \"New transform for image \" << img_index+1 << \": \" << N  << std::endl;\n    \n    // Update the transform\n    img_data[img_index+1].transform = mat2affine(N);\n\n    // Update the dst box.\n    // TODO: forward_bbox() always give results as an int box. Must revisit this using\n    // a float box!\n    img_data[img_index+1].dst_box = img_data[img_index+1].transform.forward_bbox(img_data[img_index+1].src_box);\n  }\n} // End function fix_seams_using_ip\n\n\n/// Extract the tif files to mosaic, their dimensions, and for each\n/// of them the location to mosaic to in the output image.  The input\n/// is comma-separated.\nvoid parseImgData(std::string data, int band,\n                  bool has_input_nodata_value, double input_nodata_value,\n                  bool fix_seams,\n                  int& dst_cols, int& dst_rows,\n                  std::vector<ImageData> & img_data){\n\n  dst_cols = 0; dst_rows = 0;\n  img_data.clear();\n\n  // Replace commas with spaces.\n  std::string oldStr = \",\", newStr = \" \";\n  size_t pos = 0;\n  while((pos = data.find(oldStr, pos)) != std::string::npos){\n    data.replace(pos, oldStr.length(), newStr);\n    pos += newStr.length();\n  }\n\n  std::istringstream is(data);\n  is >> dst_cols >> dst_rows;\n\n  std::string src_file;\n  double src_lenx, src_leny, dst_minx, dst_miny, dst_lenx, dst_leny;\n  BBox2 src_box, dst_box;\n  bool warned_about_bands = false;\n  while( is >> src_file >> src_lenx >> src_leny >> dst_minx >> dst_miny\n         >> dst_lenx >> dst_leny){\n    src_box = BBox2(0,        0,        src_lenx, src_leny);\n    dst_box = BBox2(dst_minx, dst_miny, dst_lenx, dst_leny);\n\n    // If the user did not specify the band to use (band == 0), and there is\n    // more than one band, use the first band but warn the user about it.\n    if (!warned_about_bands){\n      int num_bands = get_num_channels(src_file);\n      if (num_bands > 1 && band <= 0)\n        vw_out(vw::WarningMessage) << \"Input images have \" << num_bands\n                                   << \" bands. Will use the first band only.\\n\";\n      band = std::max(band, 1);\n      warned_about_bands = true;\n    }\n\n    img_data.push_back(ImageData(src_file, band, src_box, dst_box,\n                                 has_input_nodata_value, input_nodata_value));\n  }\n\n  // Option to adjust position info using image data.\n  if (fix_seams)\n    fix_seams_using_ip(img_data);\n\n  // Later images will be on top of earlier images. For that\n  // reason, reduce each image to the part it does not overlap with later images.\n  for (int k = (int)img_data.size()-1; k >= 0; k--){ // Go down from last image to first\n\n    for (int l = k - 1; l >= 0; l--){ // Go down all images before (below) this one\n\n      img_data[l].dst_box.max().y() = std::min( img_data[l].dst_box.max().y(),\n                                                img_data[k].dst_box.min().y() );\n\n      // Make sure min of box is <= max of box after the above adjustment.\n      img_data[l].dst_box.min().y() = std::min( img_data[l].dst_box.min().y(),\n                                                img_data[l].dst_box.max().y() );\n    }\n\n    // Adjust the source box as well. Expand the box slightly before\n    // reversing as reverse_bbox casts its input to BBox2i which\n    // is a problem if the box has floating point corners.\n    // The ultimate references are always the destination box\n    // and the affine transform.\n    BBox2 box = img_data[k].dst_box;\n    box.expand(1);\n    img_data[k].src_box = img_data[k].transform.reverse_bbox(box);\n  }\n\n#if 0\n  for (int k = 0; k < (int)img_data.size(); k++){\n    std::cout << \"boxes: \" << img_data[k].src_file << \" \"\n              << img_data[k].src_box << ' '\n              << img_data[k].transform.reverse_bbox(img_data[k].dst_box)\n              << ' ' << img_data[k].dst_box << std::endl;\n  }\n#endif\n\n} // End function parseImgData\n\n\n/// A class to mosaic and rescale images using bilinear interpolation.\nclass TifMosaicView: public ImageViewBase<TifMosaicView>{\nprivate:\n  int m_dst_cols, m_dst_rows;\n  std::vector<ImageData> m_img_data;\n  double m_scale;\n  double m_output_nodata_value;\n\npublic:\n  TifMosaicView(int dst_cols, int dst_rows, std::vector<ImageData> & img_data,\n                double scale, double output_nodata_value):\n    m_dst_cols((int)(scale*dst_cols)),\n    m_dst_rows((int)(scale*dst_rows)),\n    m_img_data(img_data), m_scale(scale),\n    m_output_nodata_value(output_nodata_value){}\n\n  typedef float      pixel_type;\n  typedef pixel_type result_type;\n  typedef PixelMask<float> masked_pixel_type;\n  typedef ProceduralPixelAccessor<TifMosaicView> pixel_accessor;\n\n  inline int32 cols  () const { return m_dst_cols; }\n  inline int32 rows  () const { return m_dst_rows; }\n  inline int32 planes() const { return 1; }\n\n  inline pixel_accessor origin() const { return pixel_accessor( *this, 0, 0 ); }\n\n  inline pixel_type operator()( double/*i*/, double/*j*/, int32/*p*/ = 0 ) const {\n    vw_throw(NoImplErr() << \"TifMosaicView::operator()(...) is not implemented\");\n    return pixel_type();\n  }\n\n  typedef CropView<ImageView<pixel_type> > prerasterize_type;\n  inline prerasterize_type prerasterize(BBox2i const& bbox) const {\n\n    // Scaled box\n    Vector2i b = floor(bbox.min()/m_scale);\n    Vector2i e = ceil(elem_diff(bbox.max(),1)/m_scale) + Vector2i(1, 1);\n    BBox2i scaled_box(b[0], b[1], e[0] - b[0], e[1] - b[1]);\n\n    // The scaled box can potentially intersect several of the images\n    // to be mosaicked. So prepare to interpolate into all of them.\n    // Note 1: the cropped sub-images we get below are non-overlapping\n    // and no bigger than they need to be.\n    // Note 2: We mask each image using its individual nodata-value.\n    // The output mosaic uses the global m_output_nodata_value.\n    typedef ImageView<masked_pixel_type> ImageT;\n    typedef InterpolationView<ImageT, BilinearInterpolation> InterpT;\n\n    std::vector<BBox2i>  src_vec(m_img_data.size());  // Effective area of image tile\n    std::vector<InterpT> crop_vec(m_img_data.size(),\n                                  InterpT(ImageT())); // Image data but expanded a bit for interpolation's sake\n    int extra = BilinearInterpolation::pixel_buffer;\n    // Loop through the input images\n    for (int k = 0; k < (int)m_img_data.size(); k++){\n      BBox2 box = m_img_data[k].dst_box;\n      box.crop(scaled_box);\n      if (box.empty())\n        continue;\n      box.expand(1); // since reverse_bbox will truncate input box to BBox2i\n      box = m_img_data[k].transform.reverse_bbox(box);\n      box = grow_bbox_to_int(box);\n      box.crop(bounding_box(m_img_data[k].src_img));\n      if (box.empty())\n        continue;\n      src_vec[k] = ( box ); // Recording active area of the tile\n      box.expand( extra );  // Expanding to help interpolation\n      crop_vec[k] =\n        InterpT(create_mask_less_or_equal\n                (crop(edge_extend(m_img_data[k].src_img, ConstantEdgeExtension()),\n                      box),\n                 m_img_data[k].nodata_value));\n    }\n\n    ImageView<pixel_type> tile(bbox.width(), bbox.height());\n    fill( tile, m_output_nodata_value );\n\n    // TODO: Replace this code with the resample_aa function??\n\n    // TODO: This could possibly be performed entirely with a\n    // TransformView and apply_mask.\n    // -- or --\n    // Since we have no rotations, we can assume whole lines will come\n    // from a single image\n    \n    // Loop through the output image tile\n    for (int row = 0; row < bbox.height(); row++){\n      for (int col = 0; col < bbox.width(); col++){\n\n        Vector2 dst_pix = Vector2(col + bbox.min().x(),\n                                  row + bbox.min().y())/m_scale;\n\n        // See which src image we end up in. Start from the later\n        // images, as those are on top. Stop when we find an image\n        // with a valid pixel at given location.\n        for (int k = (int)m_img_data.size()-1; k >= 0; k--){\n          Vector2 src_pix = m_img_data[k].transform.reverse(dst_pix);\n          if (!src_vec[k].contains(src_pix))\n            continue;\n\n          // Go to the coordinate system of image crop_vec[k]. Note that\n          // we add back the 'extra' number used in expanding the image earlier.\n          src_pix += elem_diff(extra, src_vec[k].min());\n\n          masked_pixel_type r = crop_vec[k](src_pix[0], src_pix[1] );\n          if (is_valid(r)){\n            tile(col, row) = r.child();\n            break;\n          }\n        } // image stack iteration\n\n      } // col iteration\n    } // row iteration\n\n    return prerasterize_type(tile, -bbox.min().x(), -bbox.min().y(),\n                             cols(), rows() );\n  } // End function prerasterize\n\n  template <class DestT>\n  inline void rasterize(DestT const& dest, BBox2i bbox) const {\n    vw::rasterize(prerasterize(bbox), dest, bbox);\n  }\n}; // End class TifMosaicView\n\nstruct Options : vw::GdalWriteOptions {\n  std::string img_data, output_image, output_type;\n  int band;\n  bool has_input_nodata_value, has_output_nodata_value, fix_seams;\n  double percent, input_nodata_value, output_nodata_value;\n  Options(): band(0), has_input_nodata_value(false), has_output_nodata_value(false),\n             input_nodata_value (std::numeric_limits<double>::quiet_NaN()),\n             output_nodata_value(std::numeric_limits<double>::quiet_NaN()){}\n};\n\nvoid handle_arguments( int argc, char *argv[], Options& opt ) {\n  po::options_description general_options(\"\");\n  general_options.add( vw::GdalWriteOptionsDescription(opt) );\n  general_options.add_options()\n    (\"image-data\", po::value(&opt.img_data)->default_value(\"\"),\n         \"Information on the images to mosaic.\")\n    (\"output-image,o\", po::value(&opt.output_image)->default_value(\"\"),\n     \"Specify the output image.\")\n    (\"ot\",  po::value(&opt.output_type)->default_value(\"Float32\"), \"Output data type. Supported types: Byte, UInt16, Int16, UInt32, Int32, Float32. If the output type is a kind of integer, values are rounded and then clamped to the limits of that type.\")\n    (\"band\", po::value(&opt.band), \"Which band to use (for multi-spectral images).\")\n    (\"input-nodata-value\", po::value(&opt.input_nodata_value),\n         \"Nodata value to use on input; input pixel values less than or equal to this are considered invalid.\")\n    (\"output-nodata-value\", po::value(&opt.output_nodata_value),\n         \"Nodata value to use on output.\")\n    (\"reduce-percent\", po::value(&opt.percent)->default_value(100.0),\n     \"Reduce resolution using this percentage.\")\n    (\"fix-seams\",   po::bool_switch(&opt.fix_seams)->default_value(false),\n     \"Fix seams in the output mosaic due to inconsistencies between image and camera data using interest point matching.\");\n\n  po::options_description positional(\"\");\n  po::positional_options_description positional_desc;\n  std::string usage(\"\");\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line( argc, argv, opt, general_options, general_options,\n                             positional, positional_desc, usage,\n                             allow_unregistered, unregistered );\n\n  opt.has_input_nodata_value  = vm.count(\"input-nodata-value\" );\n  opt.has_output_nodata_value = vm.count(\"output-nodata-value\");\n\n  if ( opt.img_data.empty() )\n    vw_throw( ArgumentErr() << \"No images to mosaic.\\n\" << usage << general_options );\n\n  if ( opt.output_image.empty() )\n    vw_throw( ArgumentErr() << \"Missing output image name.\\n\" << usage << general_options );\n\n  if ( opt.percent > 100.0 || opt.percent <= 0.0 )\n    vw_throw( ArgumentErr() << \"The percent amount must be between 0% and 100%.\\n\"\n                            << usage << general_options );\n}\n\nint main( int argc, char *argv[] ) {\n\n  Options opt;\n\n  try {\n\n    // Find command line options\n    handle_arguments( argc, argv, opt );\n\n    double scale = opt.percent/100.0;\n\n    // Parse the information passed on the command line.\n    int dst_cols, dst_rows;\n    std::vector<ImageData> img_data;\n    parseImgData(opt.img_data, opt.band,\n                 opt.has_input_nodata_value, opt.input_nodata_value,\n                 opt.fix_seams, dst_cols, dst_rows, img_data);\n    if ( dst_cols <= 0 || dst_rows <= 0 || img_data.empty() )\n      vw_throw( ArgumentErr() << \"Invalid input data.\\n\");\n\n    // We can handle individual images having different nodata\n    // values. Pick the one of the first image as the output nodata\n    // value. Override with user's nodata value if provided.\n    double output_nodata_value = img_data[0].nodata_value;\n    if (opt.has_output_nodata_value)\n      output_nodata_value = opt.output_nodata_value;\n\n    // Set up our output image object\n    vw_out() << \"Writing: \" << opt.output_image << std::endl;\n    TerminalProgressCallback tpc(\"asp\", \"\\t    Mosaic:\");\n    ImageViewRef<float> out_img = TifMosaicView(dst_cols, dst_rows,\n                                                img_data, scale,\n                                                output_nodata_value);\n    \n    // Write to disk using the specified output data type.\n    if (opt.output_type == \"Float32\") \n      vw::cartography::block_write_gdal_image(opt.output_image, out_img,\n                                              output_nodata_value, opt, tpc);\n    else if (opt.output_type == \"Byte\") \n      vw::cartography::block_write_gdal_image(opt.output_image,\n\t\t\t\t\t      per_pixel_filter(out_img,\n\t\t\t\t\t\t\t       RoundAndClamp<uint8, float>()),\n                                              vw::round_and_clamp<uint8>(output_nodata_value),\n                                              opt, tpc);\n    else if (opt.output_type == \"UInt16\") \n      vw::cartography::block_write_gdal_image(opt.output_image,\n\t\t\t\t\t      per_pixel_filter(out_img,\n\t\t\t\t\t\t\t       RoundAndClamp<uint16, float>()),\n                                              vw::round_and_clamp<uint16>(output_nodata_value),\n                                              opt, tpc);\n    else if (opt.output_type == \"Int16\") \n      vw::cartography::block_write_gdal_image(opt.output_image,\n\t\t\t\t\t      per_pixel_filter(out_img,\n\t\t\t\t\t\t\t       RoundAndClamp<int16, float>()),\n                                              vw::round_and_clamp<int16>(output_nodata_value),\n                                              opt, tpc);\n    \n    else if (opt.output_type == \"UInt32\") \n      vw::cartography::block_write_gdal_image(opt.output_image,\n\t\t\t\t\t      per_pixel_filter(out_img,\n\t\t\t\t\t\t\t       RoundAndClamp<uint32, float>()),\n                                              vw::round_and_clamp<uint32>(output_nodata_value),\n                                              opt, tpc);\n    else if (opt.output_type == \"Int32\") \n      vw::cartography::block_write_gdal_image(opt.output_image,\n\t\t\t\t\t      per_pixel_filter(out_img,\n\t\t\t\t\t\t\t       RoundAndClamp<int32, float>()),\n                                              vw::round_and_clamp<int32>(output_nodata_value),\n                                              opt, tpc);\n    else\n      vw_throw( NoImplErr() << \"Unsupported output type: \" << opt.output_type << \".\\n\" );\n    \n  } ASP_STANDARD_CATCHES;\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/time_trials",
    "content": "#!/usr/bin/env python\n# __BEGIN_LICENSE__\n#  Copyright (c) 2009-2013, United States Government as represented by the\n#  Administrator of the National Aeronautics and Space Administration. All\n#  rights reserved.\n#\n#  The NGT platform is licensed under the Apache License, Version 2.0 (the\n#  \"License\"); you may not use this file except in compliance with the\n#  License. You may obtain a copy of the License at\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n# __END_LICENSE__\n\nfrom __future__ import print_function\nimport os, sys, optparse, string, subprocess, math\n\nfrom asp_system_utils import get_asp_version\n\nimport asp_system_utils\nasp_system_utils.verify_python_version_is_supported()\n\ndef convert_to_seconds( time ):\n    time = time.strip()\n    return float(time[:time.find(\"m\")]) * 60.0 + float(time[time.find(\"m\")+1:-1])\n\ndef main():\n    try:\n        usage = \"usage: time_trials [options] command\\n  \" + get_asp_version()\n        parser = optparse.OptionParser(usage=usage)\n        parser.set_defaults(trials=5)\n        parser.add_option(\"--trials\", dest=\"trials\",\n                          help=\"Number of trials to run.\", type=\"int\")\n\n        (options, args) = parser.parse_args()\n\n        if not args: raise Exception('No input command')\n\n    except optparse.OptionError as msg:\n        print(msg, file=sys.stderr)\n        return 2\n\n    print(\"Running command: [%s]\" % args[0])\n\n    real_mean   = 0.0\n    real_stddev = 0.0\n    user_mean   = 0.0\n    user_stddev = 0.0\n    sys_mean    = 0.0\n    sys_stddev  = 0.0\n\n    for i in range(0,options.trials):\n        print(\" -> trial %i / %i \" % (i+1,options.trials))\n        p = subprocess.Popen(\"( time %s ) 2>&1 | tail -n3 \"%args[0] , shell=True, stdout=subprocess.PIPE, universal_newlines=True)\n        output    = p.stdout.read().strip().split()\n        real_time = convert_to_seconds( output[1] )\n        user_time = convert_to_seconds( output[3] )\n        sys_time  = convert_to_seconds( output[5] )\n        print(\"r%.1f, u%.1f, s%.1f\" % (real_time, user_time, sys_time))\n\n        # Accumulate values\n        real_mean   += real_time / float(options.trials)\n        real_stddev += real_time * real_time  / float(options.trials)\n        user_mean   += user_time / float(options.trials)\n        user_stddev += user_time * user_time  / float(options.trials)\n        sys_mean    += sys_time / float(options.trials)\n        sys_stddev  += sys_time * sys_time  / float(options.trials)\n\n\n    real_stddev = real_stddev - real_mean*real_mean\n    real_stddev = math.sqrt(real_stddev)\n    user_stddev = user_stddev - user_mean*user_mean\n    user_stddev = math.sqrt(user_stddev)\n    sys_stddev  = sys_stddev - sys_mean*sys_mean\n    sys_stddev  = math.sqrt(sys_stddev)\n\n    print(\"Real:   %.3f +- %.3f\" % (real_mean, real_stddev))\n    print(\"User:   %.3f +- %.3f\" % (user_mean, user_stddev))\n    print(\"Sys:    %.3f +- %.3f\" % (sys_mean,  sys_stddev ))\n\nif __name__ == \"__main__\":\n    sys.exit(main())\n"
  },
  {
    "path": "src/asp/Tools/undistort_image_texrecon.cc",
    "content": "/* Copyright (c) 2017, United States Government, as represented by the\n * Administrator of the National Aeronautics and Space Administration.\n *\n * All rights reserved.\n *\n * The Astrobee platform is licensed under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n#include <asp/Rig/RigUtils.h>\n#include <asp/Rig/RigConfig.h>\n#include <asp/Rig/SystemUtils.h>\n#include <asp/Rig/RigParseUtils.h>\n\n#include <gflags/gflags.h>\n#include <glog/logging.h>\n#include <opencv2/highgui/highgui.hpp>\n#include <opencv2/imgproc/imgproc.hpp>\n#include <opencv2/core/types.hpp>\n\n#include <boost/filesystem.hpp>\n#include <string>\n#include <iostream>\n#include <fstream>\n\nnamespace fs = boost::filesystem;\n\n/*\n\nUndistort camera images. Taken from the Astrobee repo. Used to prepare\nimages for texrecon.\n\nProvide distorted images, and lists of distorted and to-be-produced\nundistorted images.\n\nUsage:\n\n  undistort_image_texrecon                                   \\\n    --image_list texrecon_out/sci_cam/distorted_index.txt    \\\n    --output_list texrecon_out/sci_cam/undistorted_index.txt \\\n    --rig_config rig_input/rig_config.txt                    \\\n    --undistorted_crop_win '1250 1000'                       \\\n    --rig_sensor sci_cam\n\n*/\n\nDEFINE_string(image_list, \"\", \"A file having the list of images to undistort, one per line. \"\n              \"If not specified, it is assumed they are passed in directly on the command line.\");\n\nDEFINE_string(output_list, \"\", \"Save the undistorted images with names given in this list, \"\n              \"instead of using the output directory.\");\n\nDEFINE_string(undistorted_intrinsics, \"\", \"Save to this file the undistorted camera intrinsics.\");\n\nDEFINE_double(scale, 1.0, \"Undistort images at different resolution, with their width \"\n              \"being a multiple of this scale compared to the camera model.\");\n\nDEFINE_string(undistorted_crop_win, \"\",\n              \"After undistorting, apply a crop window of these dimensions \"\n              \"centered at the undistorted image center. The adjusted \"\n              \"dimensions and optical center will be printed on screen. \"\n              \"Specify as: 'crop_x crop_y'.\");\n\nDEFINE_bool(save_bgr, false,\n            \"Save the undistorted images as BGR instead of grayscale. (Some tools expect BGR.)\");\n\nDEFINE_bool(histogram_equalization, false,\n            \"If true, do histogram equalization.\");\n\nDEFINE_string(rig_config, \"\",\n              \"Read the rig configuration from this file.\");\n\nDEFINE_string(rig_sensor, \"\",\n              \"Which rig sensor to use to undistort the images. Must be among the \"\n              \"sensors specified via --rig_config.\");\n\nint main(int argc, char ** argv) {\n\n  google::InitGoogleLogging(argv[0]);\n  google::ParseCommandLineFlags(&argc, &argv, true);\n\n  if (FLAGS_rig_config == \"\")\n    LOG(FATAL) << \"The rig configuration was not specified.\\n\";\n\n  if (FLAGS_rig_sensor == \"\")\n    LOG(FATAL) << \"The rig sensor to use for undistortion was not specified.\\n\";\n\n  // Load the correct camera model\n  rig::CameraParameters *cam_ptr = NULL; // use a pointer as there is no constructor\n  rig::RigSet R;\n  bool use_initial_rig_transforms = false;\n  if (FLAGS_rig_config != \"\")  // Read a plain text config file for n sensors\n    rig::readRigConfig(FLAGS_rig_config, use_initial_rig_transforms, R);\n  bool success = false;\n  for (size_t it = 0; it < R.cam_params.size(); it++) {\n    if (R.cam_names[it] == FLAGS_rig_sensor) {\n      std::cout << \"Using camera: \" << R.cam_names[it] << std::endl;\n      cam_ptr = &R.cam_params[it]; // note that R.cam_params still owns the resource\n      success = true;\n      break;\n    }\n  }\n  if (!success)\n    LOG(FATAL) << \"Could not find desired sensor in the rig configuration.\\n\";\n\n  // The images can either be in a list or passed in\n  std::vector<std::string> images;\n  {\n    std::ifstream ifs(FLAGS_image_list);\n    std::string image;\n    while (ifs >> image)\n      images.push_back(image);\n\n    if (images.empty())\n      LOG(FATAL) << \"Expecting at least one input image.\";\n  }\n\n  std::vector<std::string> undist_images;\n  {\n    std::ifstream ifs(FLAGS_output_list);\n    std::string image;\n    while (ifs >> image)\n      undist_images.push_back(image);\n  }\n\n  if (undist_images.size() != images.size())\n    LOG(FATAL) << \"There must be as many output undistorted \"\n                 << \"images as input distorted images.\\n\";\n\n  // Useful for over-riding any config files when debugging\n  // rig::CameraParameters cam_params(Eigen::Vector2i(776, 517),\n  //                                    Eigen::Vector2d::Constant(610.502),\n  //                                    Eigen::Vector2d(776/2.0, 517/2.0));\n\n  // Create the undistortion map\n  cv::Mat floating_remap, fixed_map, interp_map;\n  cam_ptr->GenerateRemapMaps(&floating_remap, FLAGS_scale);\n\n  // Make adjustments to floating_remap.\n  // TODO(oalexan1): This must be a function.\n\n  // We have to conform to the OpenCV API, which says:\n  // undist_image(x, y) = dist_image(floating_remap(x, y)).\n\n  // If floating_remap(x, y) is out of dist_image bounds, the above\n  // should return a black pixel, yet a straightforward application of\n  // this formula will result in a segfault.\n\n  // The solution is to grow dist_image by padding it with black pixels\n  // so that the above API succeeds.\n\n  // This can have the following problem though. floating_remap(x, y)\n  // can be huge for unreasonable distortion. So tame it. We only\n  // want to know that if this falls outside the image bounds, a black\n  // pixel is assigned to undist_image(x, y), so if it falls too\n  // much outside the image just assign it to a closer pixel outside\n  // the image.\n  float max_extra = 100.0f;  // the furthest floating_remap(x, y) can deviate\n\n  // The image dimensions\n  Eigen::Vector2i dims(round(FLAGS_scale*cam_ptr->GetDistortedSize()[0]),\n                       round(FLAGS_scale*cam_ptr->GetDistortedSize()[1]));\n  int img_cols = dims[0], img_rows = dims[1];\n\n  cv::Vec2f start = floating_remap.at<cv::Vec2f>(0, 0);\n  double min_x = 0.0, max_x = 0.0, min_y = 0.0, max_y = 0.0;  // will change very soon\n  for (int col = 0; col < floating_remap.cols; col++) {\n    for (int row = 0; row < floating_remap.rows; row++) {\n      cv::Vec2f pix = floating_remap.at<cv::Vec2f>(row, col);\n\n      // Tame floating_remap\n      pix[0] = std::max(pix[0], -max_extra);\n      pix[0] = std::min(pix[0], img_cols + max_extra);\n      pix[1] = std::max(pix[1], -max_extra);\n      pix[1] = std::min(pix[1], img_rows + max_extra);\n      floating_remap.at<cv::Vec2f>(row, col) = pix;\n\n      if (col == 0 && row == 0) {\n        // initialize with the potentially adjusted value of pix.\n        min_x = pix[0];\n        max_x = pix[0];\n        min_y = pix[1];\n        max_y = pix[1];\n      }\n\n      // Find the expanded (but tamed) image bounds\n      if (pix[0] < min_x)\n        min_x = pix[0];\n      if (pix[0] > max_x)\n        max_x = pix[0];\n      if (pix[1] < min_y)\n        min_y = pix[1];\n      if (pix[1] > max_y)\n        max_y = pix[1];\n    }\n  }\n\n  // Convert the bounds to int\n  min_x = floor(min_x); max_x = ceil(max_x);\n  min_y = floor(min_y); max_y = ceil(max_y);\n\n  // Ensure that the expanded image is not smaller than the old one,\n  // to make the logic simpler\n  if (min_x > 0)\n    min_x = 0;\n  if (max_x < img_cols)\n    max_x = img_cols;\n  if (min_y > 0)\n    min_y = 0;\n  if (max_y < img_rows)\n    max_y = img_rows;\n\n  // Convert the bounds to what cv::copyMakeBorder() will expect\n  int border_top  = -min_y, border_bottom = max_y - img_rows;\n  int border_left = -min_x, border_right  = max_x - img_cols;\n\n  // Adjust the remapping function to the expanded image.\n  // Now all its values will be within bounds of that image.\n  for (int col = 0; col < floating_remap.cols; col++) {\n    for (int row = 0; row < floating_remap.rows; row++) {\n      cv::Vec2f pix = floating_remap.at<cv::Vec2f>(row, col);\n      pix[0] += border_left;\n      pix[1] += border_top;\n      floating_remap.at<cv::Vec2f>(row, col) = pix;\n    }\n  }\n\n  // Convert the map for speed\n  cv::convertMaps(floating_remap, cv::Mat(), fixed_map, interp_map, CV_16SC2);\n\n  Eigen::Vector2i dist_size(round(FLAGS_scale*cam_ptr->GetDistortedSize()[0]),\n                            round(FLAGS_scale*cam_ptr->GetDistortedSize()[1]));\n  Eigen::Vector2i undist_size(round(FLAGS_scale*cam_ptr->GetUndistortedSize()[0]),\n                              round(FLAGS_scale*cam_ptr->GetUndistortedSize()[1]));\n  double focal_length            = FLAGS_scale*cam_ptr->GetFocalLength();\n  Eigen::Vector2d optical_center = FLAGS_scale*cam_ptr->GetUndistortedHalfSize();\n\n  // Handle the cropping\n  cv::Rect cropROI;\n  if (!FLAGS_undistorted_crop_win.empty()) {\n    std::vector<double> vals;\n    rig::strToVec(FLAGS_undistorted_crop_win, vals);\n    if (vals.size() != 2)\n      LOG(FATAL) << \"Could not parse --undistorted_crop_win.\";\n    int widx = vals[0];\n    int widy = vals[1];\n\n    // A couple of sanity checks\n    if (widx % 2 != 0 || widy % 2 != 0)\n      LOG(FATAL) << \"The cropped undistorted image dimensions must be even.\";\n    if (undist_size[0] % 2 != 0 || undist_size[1] % 2 != 0)\n      LOG(FATAL) << \"The undistorted image dimensions must be even.\";\n\n    // Ensure that the crop window is within the image bounds\n    int startx = std::max((undist_size[0] - widx)/2, 0);\n    int starty = std::max((undist_size[1] - widy)/2, 0);\n    widx = std::min(widx, undist_size[0] - startx);\n    widy = std::min(widy, undist_size[1] - starty);\n\n    // Update these quantities\n    undist_size[0]     = widx;\n    undist_size[1]     = widy;\n    optical_center[0] -= startx;\n    optical_center[1] -= starty;\n\n    cropROI = cv::Rect(startx, starty, widx, widy);\n    if (cropROI.width == 0 || cropROI.height == 0)\n      LOG(FATAL) << \"Empty crop region.\";\n\n    std::cout << \"Undistorted crop region: \" << cropROI << std::endl;\n  }\n\n  for (size_t i = 0; i < images.size(); i++) {\n    std::string filename(images[i]);\n\n    cv::Mat image = cv::imread(filename, cv::IMREAD_UNCHANGED);\n\n    if (FLAGS_histogram_equalization) {\n      cv::Mat tmp_image;\n      cv::equalizeHist(image, tmp_image);\n      image = tmp_image;\n    }\n\n    // Ensure that image dimensions are as expected\n    if (image.rows != img_rows || image.cols != img_cols)\n      LOG(FATAL) << \"The input image \" << filename << \" has wrong dimensions.\";\n\n    // Expand the image before interpolating into it\n    cv::Scalar paddingColor = 0;\n    cv::Mat expanded_image;\n    cv::copyMakeBorder(image, expanded_image, border_top, border_bottom,\n                       border_left, border_right,\n                       cv::BORDER_CONSTANT, paddingColor);\n\n    // Undistort it\n    cv::Mat undist_image;\n    cv::remap(expanded_image, undist_image, fixed_map, interp_map, cv::INTER_LINEAR);\n\n    // Crop, if desired\n    if (cropROI.width > 0 && cropROI.height > 0) {\n      cv::Mat cropped_image;\n      undist_image(cropROI).copyTo(cropped_image);  // without copyTo it is a shallow copy\n      undist_image = cropped_image;  // this makes a shallow copy\n    }\n\n    // The output file name\n    std::string undist_file = undist_images[i];\n\n    // Save to disk the undistorted image\n    std::cout << \"Writing: \" << undist_file << std::endl;\n    cv::Mat bgr_image;\n    if (FLAGS_save_bgr && undist_image.channels() == 1) {\n      // Convert from grayscale to color if needed\n#if (CV_VERSION_MAJOR >= 4)\n      cvtColor(undist_image, bgr_image, cv::COLOR_GRAY2BGR);\n#else\n      cvtColor(undist_image, bgr_image, CV_GRAY2BGR);\n#endif\n      undist_image = bgr_image;\n    }\n\n    cv::Mat gray_image;\n    if (!FLAGS_save_bgr && undist_image.channels() > 1) {\n#if (CV_VERSION_MAJOR >= 4)\n      cvtColor(undist_image, gray_image, cv::COLOR_BGR2GRAY);\n#else\n      cvtColor(undist_image, gray_image, CV_BGR2GRAY);\n#endif\n      undist_image = gray_image;\n    }\n\n    cv::imwrite(undist_file, undist_image);\n  } // end iterating over images\n\n  // Write some very useful info\n  std::cout << \"Distorted image size:       \" << dist_size.transpose()      << \"\\n\";\n  std::cout << \"Undistorted image size:     \" << undist_size.transpose()    << \"\\n\";\n  std::cout << \"Focal length:               \" << focal_length               << \"\\n\";\n  std::cout << \"Undistorted optical center: \" << optical_center.transpose() << \"\\n\";\n\n  std::string intrinsics_file = FLAGS_undistorted_intrinsics;\n  if (!intrinsics_file.empty()) {\n    std::cout << \"Writing: \" << intrinsics_file << std::endl;\n    rig::createDir(fs::path(intrinsics_file).parent_path().string()); // ensure the dir exists\n    std::ofstream ofs(intrinsics_file.c_str());\n    ofs.precision(17);\n    ofs << \"# Unidistored width and height, focal length, undistorted optical center\\n\";\n    ofs << undist_size.transpose() << \" \" << focal_length << \" \"\n        << optical_center.transpose() << \"\\n\";\n    ofs.close();\n  }\n\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/wv_correct.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n/// \\file wv_correct.cc\n///\n\n// Correct CCD artifacts in WorldView 1 and 2 images with given TDI.\n\n// The problem: A WV image is obtained by mosaicking from left to\n// right image blocks which are as tall is the entire image (each\n// block comes from an individual CCD image sensor). Blocks are\n// slightly misplaced in respect to each other by some unknown\n// subpixel offsets. We use tabulated values for the offsets and their\n// locations to undo them.\n\n#include <asp/Core/Macros.h>\n#include <asp/Core/AspProgramOptions.h>\n#include <asp/Core/FileUtils.h>\n#include <asp/Camera/RPC_XML.h>\n#include <asp/Camera/RPCModel.h>\n\n#include <vw/Image/RoundAndClamp.h>\n#include <vw/Image/Interpolation.h>\n#include <vw/Image/Filter.h>\n#include <vw/FileIO/DiskImageUtils.h>\n#include <vw/FileIO/FileUtils.h>\n\n#include <xercesc/parsers/XercesDOMParser.hpp>\n#include <xercesc/sax/HandlerBase.hpp>\n#include <xercesc/util/PlatformUtils.hpp>\n#include <boost/dll.hpp>\n\nnamespace po = boost::program_options;\nnamespace fs = boost::filesystem;\nusing namespace vw;\nusing namespace asp;\nusing namespace vw::cartography;\nusing namespace xercesc;\n\n\nstruct Options: vw::GdalWriteOptions {\n  int band;\n  std::string image_file, camera_file, output_image, output_type,\n    dx, dy;\n  bool print_per_column_corrections;\n};\n\n// See which table has the corrections for given MS data,\n// find the right row in that table, and read the values\nvoid parse_ms_correction_table(std::string const& sat_id, int band,\n                               int tdi, std::string const& scan_dir,\n                               std::vector<double> & corr_x,\n                               std::vector<double> & corr_y) {\n\n  // Clear the outputs\n  corr_x.clear();\n  corr_y.clear();\n\n  std::string data_path = boost::dll::program_location().parent_path().parent_path().string()\n    + \"/share/wv_correct\";\n\n  std::string lookup_path = data_path + \"/ms_correction_lookup.txt\";\n\n  std::ifstream handle;\n  handle.open(lookup_path.c_str());\n  if (handle.fail()) \n    vw_throw(vw::IOErr() << \"Unable to open file \\\"\" << lookup_path << \"\\\"\");\n\n  std::string line;\n  while (std::getline(handle, line, '\\n')){\n\n    if (line.size() == 0 || line[0] == '#')\n      continue; // skip comment and empty line\n\n    std::string l_sat_id, l_band, l_tdi, l_scan_dir, table_path, row_str;\n    std::istringstream is(line);\n\n    if (!(is >> l_sat_id >> l_band >> l_tdi >> l_scan_dir >> table_path >> row_str)) \n      continue;\n\n    if (sat_id != l_sat_id || atoi(l_band.c_str()) != band || atoi(l_tdi.c_str()) != tdi ||\n        scan_dir != l_scan_dir) {\n      continue;\n    }\n\n    table_path = data_path + \"/\" + table_path;\n    DiskImageView<float> lookup_table(table_path);\n    int row = atoi(row_str.c_str());\n    if (lookup_table.rows() <= row) \n      vw_throw(ArgumentErr() << \"Could not find at least \" << row + 1 << \" rows in \"\n                << table_path << \"\\n\");\n\n    int num_vals = lookup_table.cols() / 2;\n    if (2*num_vals != lookup_table.cols())\n      vw_throw(ArgumentErr() << \"Expecting an even number of columns in table \"\n                << table_path << \"\\n\");\n    \n    corr_x.resize(num_vals);\n    corr_y.resize(num_vals);\n    \n    for (int it = 0; it < num_vals; it++) {\n      corr_x[it] = lookup_table(it,            row);\n      corr_y[it] = lookup_table(it + num_vals, row);\n    }\n    \n    break;\n  }\n  \n}\n\nvoid handle_arguments(int argc, char *argv[], Options& opt) {\n  \n  po::options_description general_options(\"\");\n  general_options.add_options()\n    (\"ot\",  po::value(&opt.output_type)->default_value(\"Float32\"), \"Output data type. Supported types: Byte, UInt16, Int16, UInt32, Int32, Float32. If the output type is a kind of integer, values are rounded and then clamped to the limits of that type.\")\n    (\"band\",   po::value<int>(&opt.band)->default_value(0),\n     \"For multi-spectral images, specify the band to correct. Required unless --dx and --dy are set.\")\n    (\"dx\",  po::value(&opt.dx)->default_value(\"\"), \"For PAN or multi-spectral images, specify the plain text file having per-column corrections in the x direction, one per line, overriding the pre-computed table.\")\n    (\"dy\",  po::value(&opt.dy)->default_value(\"\"), \"As above, but for the y direction.\")\n    (\"print-per-column-corrections\", po::bool_switch(&opt.print_per_column_corrections)->default_value(false), \"Print on standard output the per-column corrections about to apply (for multispectral images).\");\n    \n  general_options.add(vw::GdalWriteOptionsDescription(opt));\n  \n  po::options_description positional(\"\");\n  positional.add_options()\n    (\"camera-image\", po::value(&opt.image_file))\n    (\"camera-model\", po::value(&opt.camera_file))\n    (\"output-image\", po::value(&opt.output_image));\n  \n  po::positional_options_description positional_desc;\n  positional_desc.add(\"camera-image\",1);\n  positional_desc.add(\"camera-model\",1);\n  positional_desc.add(\"output-image\",1);\n  \n  std::string usage(\"[options] <camera-image> <camera-model> <output-image>\");\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line(argc, argv, opt, general_options, general_options,\n                             positional, positional_desc, usage,\n                             allow_unregistered, unregistered);\n\n  if (!vm.count(\"camera-image\") || !vm.count(\"camera-model\") ||\n      !vm.count(\"output-image\") )\n    vw_throw(ArgumentErr() << \"Requires <camera-image>, <camera-model> \"\n             << \"and <output-image> in order to proceed.\\n\\n\"\n             << usage << general_options);\n  \n  vw::create_out_dir(opt.output_image);\n}\n\nvoid arr_to_vec(double arr[], int len, std::vector<double> & vec){\n  vec.clear();\n  for (int i = 0; i < len; i++) vec.push_back(arr[i]);\n}\n\nvoid get_offsets(int tdi, bool is_wv01, bool is_forward, \n                 std::vector<double> & posx, std::vector<double> & ccdx,\n                 std::vector<double> & posy, std::vector<double> & ccdy){\n\n  posx.clear();\n  ccdx.clear();\n  posy.clear();\n  ccdy.clear();\n  \n  // Here we tabulate all ccds offsets and their column pixel positions.\n  \n  if (!is_wv01){\n    \n    // Do WV02\n    \n    if (is_forward){\n\n      // Forward scan direction\n      \n      if (tdi == 8){\n\n        double posx_arr[] = {686,1389,2091,2796,3499,4203,4905,5608,6311,7018,7721,8425,9130,9833,10540,11246,11948,12653,13359,14060,14771,15476,16179,16879,17591,18296,18997,19704,20413,21119,21828,22528,23236,23938,24642,25347,26050,26757,27459,28165,28871,29571,30277,30980,31686,32388,33090,33795,34497};\n        arr_to_vec(posx_arr, sizeof(posx_arr)/sizeof(double), posx);\n        \n        double ccdx_arr[] = {0.61,-0.48,0.514877822,-0.42,0.34,-0.410974812,0.42,-0.407028856,0.351330898,-0.269074758,0.446291377,-0.352892991,0.422367495,-0.265900548,0.510878629,-0.356820535,0.418892319,-0.39445358,0.412768582,-0.448113279,0.402712242,-0.35025355,0.242418592,-0.361696305,0.575444199,-0.3860937,0.226599683,-0.469802842,0.516676937,-0.505506755,0.365395904,-0.381782384,0.359518867,-0.391200765,0.60056376,-0.582558262,0.474938955,-0.494872156,0.508981417,-0.596565804,0.449049865,-0.522175341,0.475590295,-0.507063514,0.690495494,-0.548603608,0.578229037,-0.52393122,0.522313869};\n        arr_to_vec(ccdx_arr, sizeof(ccdx_arr)/sizeof(double), ccdx);\n        \n        double posy_arr[] = {684,1387,2092,2794,3499,4200,4905,5609,6315,7017,7722,8425,9134,9836,10539,11245,11949,12655,13359,14064,14771,15474,16180,16886,17590,18296,19001,19707,20412,21117,21822,22527,23231,23937,24642,25346,26052,26757,27460,28164,28868,29573,30280,30982,31684,32390,33091,33847,34491};\n        arr_to_vec(posy_arr, sizeof(posy_arr)/sizeof(double), posy);\n        \n        double ccdy_arr[] = {-0.200805296,0.163312385,-0.303400156,0.190147254,-0.198682571,0.120534513,-0.165163269,0.260918209,-0.194916111,0.297224582,-0.341403643,0.293191264,-0.308569359,0.228048922,-0.275457494,0.281969391,-0.342623543,0.33506075,-0.373224866,0.309935892,-0.317169892,0.311384632,-0.337586901,0.304615757,-0.357728907,0.309898182,-0.348613341,0.321742737,-0.32319268,0.31302694,-0.351948867,0.323089155,-0.305167385,0.295114824,-0.373661156,0.299014159,-0.23710711,0.26189909,-0.197283063,0.252105538,-0.182082587,0.269410094,-0.204998056,0.108369017,-0.13,0.15,-0.12,0.1,-0.135375447};\n        arr_to_vec(ccdy_arr, sizeof(ccdy_arr)/sizeof(double), ccdy);\n        \n      } else if (tdi == 16){\n\n        double posx_arr[] = {6.8408061504396665e+02,1.3900000000000000e+03,2.0900000000000000e+03,2.7950000000000000e+03,3.4970000000000000e+03,4.2020000000000000e+03,4.9040000000000000e+03,5.6080000000000000e+03,6.3110000000000000e+03,7.0170000000000000e+03,7.7210000000000000e+03,8.4250000000000000e+03,9.1310000000000000e+03,9.8350000000000000e+03,1.0540000000000000e+04,1.1247000000000000e+04,1.1949000000000000e+04,1.2652000000000000e+04,1.3360000000000000e+04,1.4064000000000000e+04,1.4769000000000000e+04,1.5473000000000000e+04,1.6181000000000000e+04,1.6884000000000000e+04,1.7590000000000000e+04,1.8296000000000000e+04,1.8999000000000000e+04,1.9705000000000000e+04,2.0410000000000000e+04,2.1116000000000000e+04,2.1822000000000000e+04,2.2528000000000000e+04,2.3232000000000000e+04,2.3936000000000000e+04,2.4641000000000000e+04,2.5346000000000000e+04,2.6051000000000000e+04,2.6755000000000000e+04,2.7460000000000000e+04,2.8164000000000000e+04,2.8869000000000000e+04,2.9573000000000000e+04,3.0277000000000000e+04,3.0979000000000000e+04,3.1684000000000000e+04,3.2387000000000000e+04,3.3092000000000000e+04,3.3795000000000000e+04,3.4498000000000000e+04};\n        arr_to_vec(posx_arr, sizeof(posx_arr)/sizeof(double), posx);\n        \n        double ccdx_arr[] = {2.5390684887464610e-01,-3.5534887400077469e-01,3.5868058677238895e-01,-2.6279478351582913e-01,3.3640332758089347e-01,-2.8099414838325443e-01,2.7610787186160823e-01,-2.9878722178904282e-01,2.9693940932888430e-01,-2.7079842371083113e-01,2.1755335800347692e-01,-2.1726904398138858e-01,2.1541342670419822e-01,-2.4604265224190178e-01,3.0929860826737643e-01,-1.7972099657116622e-01,2.3823069349951079e-01,-2.7729730756480198e-01,2.4415317254242136e-01,-2.1686339721048109e-01,2.5411074470725709e-01,-2.0571384826445988e-01,1.7800440971482070e-01,-2.5430628778962583e-01,4.2017888553467031e-01,-2.3486773623023255e-01,2.0955271241184922e-01,-2.8602396363998506e-01,3.7096035067307642e-01,-3.5297017540846010e-01,2.9983024563792071e-01,-2.6074063994628921e-01,2.5778353693466827e-01,-3.3136385583421091e-01,4.3976987720553201e-01,-4.2001754859752821e-01,3.4814040067367447e-01,-3.6874250907110984e-01,3.8041983620849318e-01,-3.7355204481815735e-01,3.8370800707015251e-01,-3.9642530983566426e-01,4.3131666926206813e-01,-4.0424239752634772e-01,4.5564270925189820e-01,-3.7277358779385250e-01,4.2647796915821801e-01,-4.5096831816509353e-01,4.1310425985455690e-01};\n        arr_to_vec(ccdx_arr, sizeof(ccdx_arr)/sizeof(double), ccdx);\n        \n        double posy_arr[] ={6.8408061504396665e+02,1.3900000000000000e+03,2.0900000000000000e+03,2.7950000000000000e+03,3.4970000000000000e+03,4.2020000000000000e+03,4.9040000000000000e+03,5.6080000000000000e+03,6.3110000000000000e+03,7.0170000000000000e+03,7.7210000000000000e+03,8.4250000000000000e+03,9.1310000000000000e+03,9.8350000000000000e+03,1.0540000000000000e+04,1.1247000000000000e+04,1.1949000000000000e+04,1.2652000000000000e+04,1.3360000000000000e+04,1.4064000000000000e+04,1.4769000000000000e+04,1.5473000000000000e+04,1.6181000000000000e+04,1.6884000000000000e+04,1.7590000000000000e+04,1.8296000000000000e+04,1.8999000000000000e+04,1.9705000000000000e+04,2.0410000000000000e+04,2.1116000000000000e+04,2.1822000000000000e+04,2.2528000000000000e+04,2.3232000000000000e+04,2.3936000000000000e+04,2.4641000000000000e+04,2.5346000000000000e+04,2.6051000000000000e+04,2.6755000000000000e+04,2.7460000000000000e+04,2.8164000000000000e+04,2.8869000000000000e+04,2.9573000000000000e+04,3.0277000000000000e+04,3.0979000000000000e+04,3.1680099466622523e+04,3.2387000000000000e+04,3.3104012536780050e+04,3.3757337357205266e+04,3.4502797729228914e+04};\n        arr_to_vec(posy_arr, sizeof(posy_arr)/sizeof(double), posy);\n        \n        double ccdy_arr[] = {-1.4234418776605290e-01,2.0019542891130560e-01,-9.3196388852414311e-02,1.7714720253179089e-01,-2.3677412189404023e-01,1.4049177941600352e-01,-1.6861234263992159e-01,1.3685256177186800e-01,-1.5420364173682916e-01,1.2573054439204184e-01,-1.4400807716044600e-01,1.6999871227638616e-01,-1.6074734680673120e-01,1.4612135414520888e-01,-2.1672541026902764e-01,1.4724229848437181e-01,-2.1245257639792839e-01,1.9820095871647861e-01,-2.0126392418829669e-01,1.8868895909998856e-01,-1.9320276320211682e-01,1.9147336195991457e-01,-2.2624648578705292e-01,2.2829898658168546e-01,-2.8937659996897863e-01,2.2356864832573883e-01,-2.1086667379933821e-01,2.3843004515655380e-01,-2.5730142894125391e-01,2.3721948745093918e-01,-2.2286322028088668e-01,1.9492167752978881e-01,-1.9502127190666094e-01,1.9297124691620351e-01,-2.6490728340707226e-01,2.1718335242684822e-01,-1.8953228514405335e-01,1.6616123278351685e-01,-1.4978268915551907e-01,1.6141450520704365e-01,-9.9302156372836348e-02,1.2756970494274872e-01,-9.9998093884728467e-02,8.8737727682353107e-02,-5.6616895743647838e-02,5.4919615855584025e-02,-4.3574116086978226e-02,6.7289510994713364e-02,-4.0313421172810865e-02};\n        arr_to_vec(ccdy_arr, sizeof(ccdy_arr)/sizeof(double), ccdy);\n\n      }else if (tdi == 32){ // WV02, TDI 32, forward scan direction\n          \n        double posx_arr[] = {687,1386,2098,2795,3497,4204,4903,5602,6307,7011,7721,8435,9130,9845,10539,11239,11948,12656,13355,14061,14772,15476,16181,16893,17589,18296,19001,19704,20411,21119,21818,22526,23224,23936,24645,25346,26048,26752,27459,28171,28870,29572,30275,30982,31686,32392,33089,33794,34494};\n        arr_to_vec(posx_arr, sizeof(posx_arr)/sizeof(double), posx);\n        \n        double ccdx_arr[] = {0.23,-0.200870907,0.193869541,-0.252935963,0.156866694,-0.323477584,0.254999801,-0.164044311,0.137935927,-0.134198529,0.251196321,-0.127770636,0.192743363,-0.0817029972,0.279175392,-0.195373178,0.160454246,-0.187902874,0.185485025,-0.222631894,0.262762182,-0.183260502,0.153832087,-0.169862389,0.280372366,-0.178701578,0.165044079,-0.195968767,0.272389729,-0.198909335,0.22742834,-0.2793403,0.306560026,-0.284292223,0.376212463,-0.285305848,0.292147837,-0.414304838,0.342276557,-0.347423176,0.280371648,-0.36,0.32,-0.347601526,0.3,-0.21,0.19,-0.2,0.13};\n        \n        arr_to_vec(ccdx_arr, sizeof(ccdx_arr)/sizeof(double), ccdx);\n        \n        double posy_arr[] = {599,1450,2786,3502,4206,4911,5633,6318,7018,7723,8426,9130,9835,10537,11245,11948,12656,13359,14066,14771,15470,16181,16895,17590,18296,19002,19706,20411,21118,21818,22525,23231,23937,24643,25346,26045,26756,27455,28165,28876,29534,30286,30946,31685,32381,33092,33794,34495};\n        arr_to_vec(posy_arr, sizeof(posy_arr)/sizeof(double), posy);\n        \n        double ccdy_arr[] = {-0.179676025,0.15,0.0853180693,-0.164617487,0.0665333363,-0.0874214203,0.064026293,-0.0874982203,0.0785140517,-0.0802015105,0.0743760818,-0.138005942,0.110733611,-0.166057087,0.121906995,-0.140371862,0.179980823,-0.197258988,0.145376309,-0.128783256,0.163833408,-0.152976763,0.132341989,-0.153580946,0.105734243,-0.148236936,0.124184802,-0.19458627,0.102229409,-0.130355208,0.118469822,-0.125463552,0.146726178,-0.174620896,0.140067683,-0.128724518,0.152752943,-0.107566015,0.17,-0.0716320264,0.0552220226,-0.0432558069,0,0.0880390533,-0.102243106,0.11,-0.0928345189,0.19};\n        \n        arr_to_vec(ccdy_arr, sizeof(ccdy_arr)/sizeof(double), ccdy);\n        \n      }else if (tdi == 48){\n\n        double posx_arr[] = {6.8500000000000000e+02,1.3870000000000000e+03,2.0900000000000000e+03,2.7833949228956494e+03,3.5000000000000000e+03,4.2153146077502679e+03,4.9070000000000000e+03,5.6090000000000000e+03,6.3110000000000000e+03,6.9768739999698882e+03,7.7074452677528570e+03,8.3649594087575297e+03,9.7850000000000000e+03,1.0541000000000000e+04,1.1246000000000000e+04,1.2613000000000000e+04,1.3367000000000000e+04,1.3991000000000000e+04,1.4777000000000000e+04,1.5481000000000000e+04,1.6180000000000000e+04,1.6885000000000000e+04,1.7589000000000000e+04,1.8296000000000000e+04,1.8999000000000000e+04,1.9704000000000000e+04,2.0411000000000000e+04,2.1115000000000000e+04,2.1820000000000000e+04,2.2526000000000000e+04,2.3232000000000000e+04,2.3936000000000000e+04,2.4641000000000000e+04,2.5347000000000000e+04,2.6051000000000000e+04,2.6756000000000000e+04,2.7460000000000000e+04,2.8164000000000000e+04,2.8868000000000000e+04,2.9573000000000000e+04,3.0276000000000000e+04,3.0979000000000000e+04,3.1684000000000000e+04,3.2389000000000000e+04,3.3091000000000000e+04,3.3796000000000000e+04,3.4497000000000000e+04};\n        arr_to_vec(posx_arr, sizeof(posx_arr)/sizeof(double), posx);\n        \n        double ccdx_arr[] = {1.0341629610890941e-01,-6.6928763297078031e-02,3.0155477757583198e-02,-3.3155368927938744e-02,7.1943250755293967e-02,-1.7703590512652495e-02,5.8348735237027369e-02,-4.4654367132889700e-02,4.2694728692775158e-02,5.5760215995853679e-04,-3.6565192260286372e-03,-8.4710496870385454e-04,2.0735001573248923e-02,5.9200091656747472e-02,3.3390829775972596e-02,1.5924222690679547e-02,1.2433486962539811e-02,-1.2337818612879543e-02,1.4265422619318227e-02,-2.4921764890428022e-02,3.5826987996452911e-02,-3.3723843893140447e-02,1.1804641267464354e-01,-4.6969602098551944e-02,5.4881044253378072e-02,-7.9167766164993283e-02,1.0218507666437618e-01,-9.9476998959238588e-02,7.8008080879757566e-02,-8.6823563217757277e-02,8.1529385384335268e-02,-1.0772228088639324e-01,2.0563126095007117e-01,-1.5357029259986685e-01,1.4227549664685765e-01,-1.1902502159597986e-01,1.5687627887139308e-01,-1.2839514357461734e-01,1.2210711747626858e-01,-1.4178815963954489e-01,1.3029067012278395e-01,-1.2834516060064524e-01,1.7226295441862252e-01,-1.4154131492681182e-01,1.2301976757233268e-01,-5.5304505685741294e-02,9.3226657293811480e-02};\n        arr_to_vec(ccdx_arr, sizeof(ccdx_arr)/sizeof(double), ccdx);\n        \n        double posy_arr[] ={5.7700000000000000e+02,1.3560000000000000e+03,2.0930000000000000e+03,2.7930000000000000e+03,3.4990000000000000e+03,4.2020000000000000e+03,4.9030000000000000e+03,5.6070000000000000e+03,6.3130000000000000e+03,7.0170000000000000e+03,7.7190000000000000e+03,8.4270000000000000e+03,9.1310000000000000e+03,9.8350000000000000e+03,1.0520000000000000e+04,1.1242000000000000e+04,1.1884000000000000e+04,1.3358000000000000e+04,1.4770000000000000e+04,1.5475000000000000e+04,1.6181000000000000e+04,1.6888000000000000e+04,1.7590000000000000e+04,1.9001000000000000e+04,1.9708000000000000e+04,2.0411000000000000e+04,2.1120000000000000e+04,2.1822000000000000e+04,2.2528000000000000e+04,2.3234000000000000e+04,2.3937000000000000e+04,2.4641000000000000e+04,2.5350000000000000e+04,2.7395000000000000e+04,2.8871000000000000e+04,2.9570000000000000e+04,3.0277000000000000e+04,3.0981000000000000e+04,3.1683000000000000e+04,3.2388000000000000e+04,3.3092000000000000e+04,3.3794000000000000e+04,3.4497000000000000e+04};\n        arr_to_vec(posy_arr, sizeof(posy_arr)/sizeof(double), posy);\n        \n        double ccdy_arr[] = {1.0570213953611338e-02,2.0266889413527507e-02,-1.6386162678859423e-02,-2.9828468059933534e-02,-4.4952491140354663e-02,-4.9370914196828715e-02,2.7910792395426747e-02,-3.1050112108440567e-02,2.1360409733297950e-02,-2.7667853483971227e-02,1.1549886985667888e-02,-3.1661894928171418e-02,1.4036738189459722e-02,-2.2861716759744022e-02,1.0418560250149094e-02,-1.8484118071735597e-02,1.3002966471000757e-02,-2.7214589983848736e-02,-1.2675350294268143e-02,1.4253982497216024e-02,-2.8780593727833606e-02,-1.0814691554799964e-02,-6.0026795038763472e-02,-3.5757666784038064e-02,1.7968678091565892e-02,-4.1231799339921868e-02,1.4761135692591550e-02,-3.5891104296970983e-02,1.4837565362896002e-02,-3.4655284413776737e-02,2.5964357449015010e-02,-6.9484098821118209e-02,2.3409295762523191e-02,-1.1549734582821873e-02,2.8135367674027995e-02,-2.6530298882852830e-02,4.9870709188203688e-02,-5.9792391099903953e-02,1.5634482362369645e-01,-1.0730615249765883e-01,1.5157463886466002e-01,-1.5249469561113649e-01,1.9909194292256033e-01};\n        arr_to_vec(ccdy_arr, sizeof(ccdy_arr)/sizeof(double), ccdy);\n\n      }else if (tdi == 64){\n\n        double posx_arr[] = {5.8200000000000000e+02,1.3880000000000000e+03,2.0950000000000000e+03,2.7240000000000000e+03,3.4980000000000000e+03,4.2020000000000000e+03,4.9030000000000000e+03,5.6070000000000000e+03,6.3120000000000000e+03,7.0170000000000000e+03,7.7200000000000000e+03,8.4250000000000000e+03,9.1320000000000000e+03,9.8350000000000000e+03,1.0583443614712753e+04,1.1244000000000000e+04,1.1948000000000000e+04,1.2654000000000000e+04,1.3361000000000000e+04,1.4067000000000000e+04,1.4770000000000000e+04,1.5477000000000000e+04,1.6179000000000000e+04,1.6885000000000000e+04,1.7574494738325688e+04,1.8298000000000000e+04,1.8998000000000000e+04,1.9716000000000000e+04,2.0411000000000000e+04,2.1120000000000000e+04,2.1818089972892296e+04,2.2483000000000000e+04,2.3180000000000000e+04,2.3888000000000000e+04,2.4641000000000000e+04,2.6054000000000000e+04,2.6756000000000000e+04,2.7459000000000000e+04,2.8166000000000000e+04,2.8917951230724892e+04,2.9548000000000000e+04,3.0278077908470597e+04,3.1683000000000000e+04,3.2303000000000000e+04,3.3896014871274172e+04,3.4494470609482283e+04};\n        arr_to_vec(posx_arr, sizeof(posx_arr)/sizeof(double), posx);\n        \n        double ccdx_arr[] = {-2.5956471759746354e-02,4.4578766394764630e-02,-8.9827031879944549e-02,5.5791806377529674e-02,-9.1842370052754557e-02,9.8046038365362242e-02,-9.4535764013415610e-02,9.6096236241295041e-02,-1.1027807070090942e-01,1.2103349723362071e-01,-1.2288374951142525e-01,1.1183981058653035e-01,-1.2351319972822833e-01,1.1857903334290790e-01,-3.8374302604157862e-02,1.0431820384662552e-01,-1.0837656303530220e-01,1.1648716601192505e-01,-9.9990725363775013e-02,1.0167088854860895e-01,-7.2622679909949028e-02,6.9660056393154771e-02,-5.7251999767388762e-02,8.5497410837256149e-02,-5.4978509301553680e-04,3.1398926776652236e-02,-3.3534823655966488e-02,3.4747869881864457e-02,-1.8199410864362924e-02,1.6133228098641383e-02,-6.6017078947983032e-03,1.5989338758809264e-02,1.4495383888490173e-02,2.1650921936725430e-02,9.1564466855612342e-02,2.8398021789331582e-02,-1.7661309009325159e-02,3.2708593858028739e-02,-1.6400978423544536e-02,5.5021377087672574e-03,2.4145354413039066e-02,9.6319560743016175e-04,2.2218246784993852e-02,-1.0658027785738437e-02,5.3917520123029417e-02,-9.4354588520648486e-02}; \n        arr_to_vec(ccdx_arr, sizeof(ccdx_arr)/sizeof(double), ccdx);\n        \n        double posy_arr[] ={5.9200000000000000e+02,1.3170420560108732e+03,2.0930000000000000e+03,2.7950000000000000e+03,3.4603191398928402e+03,4.2020000000000000e+03,4.9060000000000000e+03,5.6100000000000000e+03,6.3130000000000000e+03,7.0150000000000000e+03,7.7210000000000000e+03,8.4250000000000000e+03,9.1280000000000000e+03,9.8350000000000000e+03,1.0535000000000000e+04,1.1245000000000000e+04,1.1946000000000000e+04,1.2656000000000000e+04,1.3354000000000000e+04,1.4064000000000000e+04,1.4772000000000000e+04,1.5472000000000000e+04,1.6178976571876621e+04,1.6886000000000000e+04,1.8296000000000000e+04,1.9703000000000000e+04,2.1109000000000000e+04,2.1816000000000000e+04,2.2524000000000000e+04,2.3941000000000000e+04,2.4498275779050047e+04,2.5345000000000000e+04,2.6050000000000000e+04,2.6757000000000000e+04,2.7463000000000000e+04,2.8164000000000000e+04,2.8871000000000000e+04,2.9573000000000000e+04,3.0277000000000000e+04,3.0980000000000000e+04,3.1684000000000000e+04,3.2389000000000000e+04,3.3091000000000000e+04,3.3795000000000000e+04,3.4499000000000000e+04};\n        arr_to_vec(posy_arr, sizeof(posy_arr)/sizeof(double), posy);\n        \n        double ccdy_arr[] = {2.0735639339753642e-02,-1.0545200904867574e-02,3.2849740270865541e-02,-4.6063848303733043e-02,1.1393361549998066e-02,-8.5227048213953785e-02,5.4846313905793621e-02,-7.0830913458622441e-02,5.8791095145657932e-02,-7.8803486624469218e-02,5.6202540000042336e-02,-8.0624083769682137e-02,7.2853151923653520e-02,-8.0857103112995279e-02,3.2073179099094629e-02,-8.2158082652905695e-02,3.6528864089062682e-02,-5.0344724044001858e-02,3.4218553836270697e-02,-6.7790889988649877e-02,3.8643824272193844e-02,-5.3116461931800592e-02,3.1664006294234437e-03,-4.6859464270032986e-02,-4.9473511205148687e-02,-4.3014298467437297e-02,-2.5493164396813435e-02,1.4764731428306827e-02,-2.4538664981630438e-02,-3.6412522449148846e-02,1.1393361549998066e-02,-3.2952895768327932e-02,3.0337303721746686e-02,-2.3391491162823966e-02,4.6542314256068334e-02,-5.4906963835417488e-02,3.6904469948493231e-02,-5.9839920680011705e-02,1.0706325427970893e-01,-1.1398690327458148e-01,2.0053486276127494e-01,-8.5213294686183508e-02,1.6964861601916248e-01,-1.5316083931449867e-01,1.6627374271198914e-01};\n        arr_to_vec(ccdy_arr, sizeof(ccdy_arr)/sizeof(double), ccdy);\n\n      }\n      \n    }else{\n      \n      // Reverse scan direction for WV02\n      \n      if (tdi == 8){\n\n        double posx_arr[] = {686,1390,2092,2796,3499,4203,4906,5611,6312,7019,7723,8428,9130,9836,10541,11247,11950,12655,13361,14064,14771,15478,16181,16882,17595,18298,19001,19707,20413,21118,21824,22526,23233,23939,24641,25349,26052,26759,27462,28165,28868,29576,30279,30980,31686,32389,33092,33797,34496};\n        arr_to_vec(posx_arr, sizeof(posx_arr)/sizeof(double), posx);\n        \n        double ccdx_arr[] = {-0.540629455,0.554006581,-0.704852099,0.357144541,-0.569714243,0.623382347,-0.363965624,0.505035172,-0.406574415,0.412216009,-0.588707536,0.46903767,-0.578869621,0.379630326,-0.481771777,0.542391759,-0.52123352,0.496852667,-0.568846495,0.557942156,-0.579475723,0.340925965,-0.278236397,0.38,-0.453814948,0.355614951,-0.270314932,0.404056203,-0.466882034,0.393031857,-0.335709262,0.224423693,-0.264509576,0.312079312,-0.265481695,0.402870354,-0.364294626,0.27,-0.46065139,0.410212171,-0.452024642,0.45,-0.562202119,0.563251952,-0.413924053,0.585742931,-0.601223106,0.440437984,-0.537681541};\n        arr_to_vec(ccdx_arr, sizeof(ccdx_arr)/sizeof(double), ccdx);\n        \n        double posy_arr[] = {685,1393,2093,2795,3500,4201,4907,5610,6319,7018,7723,8427,9133,9835,10541,11246,11951,12654,13360,14065,14770,15476,16181,16884,17593,18297,19002,19708,20412,21117,21823,22528,23233,23937,24643,25348,26053,26757,27462,28166,28870,29574,30278,30982,31685,32389,33092,33795,34500};\n        arr_to_vec(posy_arr, sizeof(posy_arr)/sizeof(double), posy);\n        \n        double ccdy_arr[] = {0.371317023,-0.425311806,0.421083454,-0.297024981,0.50172029,-0.618824514,0.361561999,-0.530163527,0.526409295,-0.558253425,0.525169894,-0.546126186,0.531177043,-0.558707992,0.487727402,-0.559893807,0.542065996,-0.564670797,0.529775034,-0.561113219,0.499900361,-0.513486006,0.57099431,-0.602553861,0.411532484,-0.52,0.514348735,-0.486603015,0.455814867,-0.488906582,0.44,-0.469926687,0.41,-0.479074967,0.380329556,-0.475231234,0.463364119,-0.441574787,0.429709868,-0.431819883,0.418603812,-0.427429724,0.463059469,-0.45427966,0.503635063,-0.401902633,0.415867899,-0.472805098,0.35};\n        arr_to_vec(ccdy_arr, sizeof(ccdy_arr)/sizeof(double), ccdy);\n      \n      }else if (tdi == 16){\n        \n        double posx_arr[] = {6.8500000000000000e+02,1.3890000000000000e+03,2.0920000000000000e+03,2.7940000000000000e+03,3.4970000000000000e+03,4.2010000000000000e+03,4.9040000000000000e+03,5.6090000000000000e+03,6.3130000000000000e+03,7.0170000000000000e+03,7.7200000000000000e+03,8.4250000000000000e+03,9.1300000000000000e+03,9.8340000000000000e+03,1.0540000000000000e+04,1.1244000000000000e+04,1.1949000000000000e+04,1.2653000000000000e+04,1.3358000000000000e+04,1.4064000000000000e+04,1.4770000000000000e+04,1.5475000000000000e+04,1.6179000000000000e+04,1.6884000000000000e+04,1.7591000000000000e+04,1.8298000000000000e+04,1.9001000000000000e+04,1.9705000000000000e+04,2.0410000000000000e+04,2.1118000000000000e+04,2.1819000000000000e+04,2.2526000000000000e+04,2.3232000000000000e+04,2.3936000000000000e+04,2.4640000000000000e+04,2.5346000000000000e+04,2.6051000000000000e+04,2.6756000000000000e+04,2.7459000000000000e+04,2.8164000000000000e+04,2.8869000000000000e+04,2.9572000000000000e+04,3.0276000000000000e+04,3.0981000000000000e+04,3.1684000000000000e+04,3.2387000000000000e+04,3.3091000000000000e+04,3.3794000000000000e+04,3.4499000000000000e+04};\n        arr_to_vec(posx_arr, sizeof(posx_arr)/sizeof(double), posx);\n        \n        double ccdx_arr[] = {-3.4574537886232626e-01,3.9787575470308928e-01,-4.6062745420999512e-01,4.1955176689302121e-01,-3.5614274665743240e-01,3.6729158428131403e-01,-3.8279502434997981e-01,3.8759439974250887e-01,-3.7326604349382575e-01,3.7313704319410057e-01,-3.9898415187989034e-01,3.6354729632866983e-01,-4.4133561450997227e-01,3.5214448130969339e-01,-2.6272163619996458e-01,4.6827596342248690e-01,-4.1290438039039595e-01,3.7016763294562566e-01,-3.6930953429008129e-01,3.9268416731026762e-01,-3.3817431093249156e-01,2.5585431813799275e-01,-2.5643817416222225e-01,3.5080143260171215e-01,-2.5976588367099607e-01,2.4713269956144188e-01,-2.3592859495433446e-01,3.1520335038929820e-01,-2.8307849084683534e-01,2.4136258106225661e-01,-2.0850772101202214e-01,1.9512720700781175e-01,-2.3093516146406431e-01,2.1325824410642835e-01,-1.4171210365838610e-01,2.8824308471069221e-01,-2.6423225693096053e-01,2.7277241665840968e-01,-2.8048664133071755e-01,2.7473492239417063e-01,-3.1488995425124794e-01,3.0609214859229761e-01,-3.2952946007350564e-01,3.5987606178036530e-01,-2.9850936546380741e-01,3.8190937729923380e-01,-4.3392059335259014e-01,4.5578053058836221e-01,-4.7502083692902891e-01};\n        arr_to_vec(ccdx_arr, sizeof(ccdx_arr)/sizeof(double), ccdx);\n        \n        double posy_arr[] ={6.8544485229142265e+02,1.3890000000000000e+03,2.0900000000000000e+03,2.7940000000000000e+03,3.4960000000000000e+03,4.2020000000000000e+03,4.9050000000000000e+03,5.6080000000000000e+03,6.3120000000000000e+03,7.0170000000000000e+03,7.7220000000000000e+03,8.4260000000000000e+03,9.1300000000000000e+03,9.8350000000000000e+03,1.0539000000000000e+04,1.1245000000000000e+04,1.1949000000000000e+04,1.2654000000000000e+04,1.3359000000000000e+04,1.4063000000000000e+04,1.4769000000000000e+04,1.5474000000000000e+04,1.6179000000000000e+04,1.6885000000000000e+04,1.7590000000000000e+04,1.8295000000000000e+04,1.9000000000000000e+04,1.9706000000000000e+04,2.0410000000000000e+04,2.1116000000000000e+04,2.1821000000000000e+04,2.2526000000000000e+04,2.3232000000000000e+04,2.3936000000000000e+04,2.4642000000000000e+04,2.5347000000000000e+04,2.6053000000000000e+04,2.6755000000000000e+04,2.7460000000000000e+04,2.8163000000000000e+04,2.8869000000000000e+04,2.9573000000000000e+04,3.0278000000000000e+04,3.0980000000000000e+04,3.1685000000000000e+04,3.2387000000000000e+04,3.3090000000000000e+04,3.3794000000000000e+04,3.4499000000000000e+04};\n        arr_to_vec(posy_arr, sizeof(posy_arr)/sizeof(double), posy);\n        \n        double ccdy_arr[] = {1.9189392751473355e-01,-2.5614129853806417e-01,3.0251687519198145e-01,-2.9742905281500542e-01,2.3671530170053012e-01,-3.4195103110980063e-01,3.5047636063573390e-01,-3.3739605133187045e-01,3.7027086489076466e-01,-3.6044455719675084e-01,3.4698390037376997e-01,-3.5331234102904263e-01,3.8280024278642000e-01,-3.8942022189477016e-01,3.3714093789523197e-01,-4.5248161663109643e-01,3.8389515519454398e-01,-3.6857860900251949e-01,3.4077281393335995e-01,-3.8652428467339339e-01,3.9057754518403609e-01,-3.5429366047249111e-01,3.1780820554455869e-01,-3.5706957583120041e-01,3.0014031223542564e-01,-3.4309023336086203e-01,3.1749209942510243e-01,-3.3333939125132828e-01,2.7640180833171257e-01,-3.0957752851321163e-01,3.0612309509314800e-01,-3.2342055745103887e-01,3.2908296306796858e-01,-3.1985521355344892e-01,2.3474495447902263e-01,-2.8828951456743407e-01,2.7538596857288555e-01,-2.7423470759589069e-01,2.7389183018973773e-01,-2.2677078495215713e-01,2.8624912447649808e-01,-2.7582565144260940e-01,2.5757900445335125e-01,-2.7787936224331067e-01,3.5449683027495543e-01,-2.7473552591979988e-01,2.8519062432246800e-01,-2.8286009130175926e-01,3.2715512617647990e-01};\n        arr_to_vec(ccdy_arr, sizeof(ccdy_arr)/sizeof(double), ccdy);\n\n      }else if (tdi == 32){ // WV02, TDI 32, reverse scan direction\n\n        double posx_arr[] = {699,1397,2103,2793,3494,4200,4899,5603,6308,7011,7716,8440,9125,9848,10545,11256,11944,12647,13355,14059,14766,15487,16187,16887,17585,18307,19012,19700,20406,21131,21827,22539,23226,23934,24652,25340,26045,26768,27455,28160,28876,29577,30271,30989,31679,32382,33099,33793,34509};\n        arr_to_vec(posx_arr, sizeof(posx_arr)/sizeof(double), posx);\n        \n        double ccdx_arr[] = {-0.335309154,0.38905987,-0.393934819,0.389559906,-0.28075494,0.406487641,-0.309601194,0.253437631,-0.246713878,0.326511227,-0.376625986,0.338550253,-0.365883965,0.284085525,-0.272803025,0.338328635,-0.34147743,0.294963716,-0.331045579,0.360597886,-0.336537411,0.288312408,-0.245688743,0.364856611,-0.22505144,0.270050828,-0.164612022,0.217985028,-0.239825283,0.251399055,-0.209751979,0.178159777,-0.157302691,0.144229942,-0.117036312,0.264435954,-0.1853822,0.219754018,-0.208041899,0.279225317,-0.250305903,0.218536,-0.259987289,0.312066587,-0.217581913,0.247862225,-0.329537891,0.43173011,-0.244665742};\n        \n        arr_to_vec(ccdx_arr, sizeof(ccdx_arr)/sizeof(double), ccdx);\n        \n        double posy_arr[] = {698,1380,2103,2792,3488,4195,4908,5619,6307,7018,7727,8421,9126,9848,10536,11256,11945,12649,13371,14068,14766,15473,16183,16888,17585,18306,19012,19716,20425,21131,21816,22539,23226,23935,24653,25341,26051,26767,27456,28159,28877,29577,30287,30989,31679,32382,33100,33789,34492};\n        arr_to_vec(posy_arr, sizeof(posy_arr)/sizeof(double), posy);\n        \n        double ccdy_arr[] = {0.0733006458,-0.191287907,0.169869401,-0.267955801,0.140960055,-0.219522246,0.226332504,-0.247717521,0.214147217,-0.246025264,0.230311045,-0.25224611,0.222460444,-0.293111714,0.212547912,-0.265809622,0.240435936,-0.241445645,0.226134242,-0.258601247,0.180333976,-0.270246202,0.291984931,-0.311268718,0.12243298,-0.197870885,0.204639961,-0.197677915,0.161499083,-0.182979548,0.167472594,-0.191336091,0.157932791,-0.172758497,0.111660405,-0.151111619,0.173739603,-0.167923426,0.166282476,-0.140580905,0.156935996,-0.175825537,0.167537666,-0.120138715,0.252559378,-0.209173921,0.221983862,-0.171931521,0.281420508};\n        \n        arr_to_vec(ccdy_arr, sizeof(ccdy_arr)/sizeof(double), ccdy);\n        \n    }else if (tdi == 48){\n\n        double posx_arr[] = {6.8500000000000000e+02,1.3890000000000000e+03,2.0910000000000000e+03,2.7930000000000000e+03,3.4970000000000000e+03,4.2010000000000000e+03,4.9050000000000000e+03,5.6080000000000000e+03,6.3130000000000000e+03,7.0160000000000000e+03,7.7210000000000000e+03,8.4260000000000000e+03,9.1300000000000000e+03,9.8340000000000000e+03,1.0539000000000000e+04,1.1244000000000000e+04,1.1949000000000000e+04,1.2654000000000000e+04,1.3359000000000000e+04,1.4064000000000000e+04,1.4769000000000000e+04,1.5475000000000000e+04,1.6180000000000000e+04,1.6885000000000000e+04,1.7589000000000000e+04,1.8295000000000000e+04,1.9001000000000000e+04,1.9706000000000000e+04,2.0411000000000000e+04,2.1117000000000000e+04,2.1820000000000000e+04,2.2527000000000000e+04,2.3232000000000000e+04,2.3936000000000000e+04,2.4643343208360497e+04,2.5345000000000000e+04,2.6053000000000000e+04,2.6756000000000000e+04,2.7461000000000000e+04,2.8164000000000000e+04,2.8868000000000000e+04,2.9573000000000000e+04,3.0276000000000000e+04,3.0981000000000000e+04,3.1681000000000000e+04,3.2387000000000000e+04,3.3092000000000000e+04,3.3794000000000000e+04,3.4496000000000000e+04};\n        arr_to_vec(posx_arr, sizeof(posx_arr)/sizeof(double), posx);\n        \n        double ccdx_arr[] = {-1.4300903327522471e-01,2.0244675851091773e-01,-1.7349218693053359e-01,1.8441668247656365e-01,-1.6516872608831479e-01,2.0092489294579371e-01,-2.1374568239690162e-01,1.9302217649944564e-01,-1.9495975909431931e-01,2.0062676355539916e-01,-2.2852962586985318e-01,1.6918596435176431e-01,-2.5012980361716841e-01,1.6248836817833354e-01,-7.5417410227573797e-02,2.2721227942885155e-01,-2.1968709262038072e-01,2.1202713814221866e-01,-1.9925209546088707e-01,2.0865906272043860e-01,-1.5452351199499684e-01,1.0852612751691323e-01,-1.1781600600694060e-01,1.5421549725393000e-01,-5.8999133115210607e-02,9.7238843433336622e-02,-8.2315444423758141e-02,1.1486116105909630e-01,-7.2037554538535831e-02,8.1788260499833967e-02,-1.0345192232339379e-01,6.9105658972570649e-02,-1.1157433062684349e-01,8.6787583321675174e-02,-2.1530306295830109e-03,4.7213600110020820e-02,-7.4601222881290508e-02,7.7415377695255416e-02,-6.2153530739940316e-02,8.2001767463922959e-02,-1.4291810497966040e-01,1.1760993227419325e-01,-1.1830233978026980e-01,1.3852895797281584e-01,-5.5702429300845215e-02,1.5620163835022466e-01,-1.6079049958998287e-01,1.6156756005608655e-01,-1.6949649184840465e-01};\n        arr_to_vec(ccdx_arr, sizeof(ccdx_arr)/sizeof(double), ccdx);\n        \n        double posy_arr[] ={6.1900000000000000e+02,1.3880000000000000e+03,2.0910000000000000e+03,2.7940000000000000e+03,3.4980000000000000e+03,4.2010000000000000e+03,4.9040000000000000e+03,5.6090000000000000e+03,6.3120000000000000e+03,7.0170000000000000e+03,7.7200000000000000e+03,8.4250000000000000e+03,9.1300000000000000e+03,9.8340000000000000e+03,1.0540000000000000e+04,1.1244000000000000e+04,1.1950000000000000e+04,1.2653000000000000e+04,1.3359000000000000e+04,1.4065000000000000e+04,1.4770000000000000e+04,1.5476000000000000e+04,1.6181000000000000e+04,1.6886000000000000e+04,1.7591000000000000e+04,1.8294000000000000e+04,1.8998000000000000e+04,1.9705000000000000e+04,2.0409000000000000e+04,2.1117000000000000e+04,2.1821000000000000e+04,2.2526000000000000e+04,2.3231000000000000e+04,2.3936000000000000e+04,2.4639000000000000e+04,2.5345000000000000e+04,2.6051000000000000e+04,2.6754000000000000e+04,2.7460000000000000e+04,2.8165000000000000e+04,2.8868000000000000e+04,2.9574000000000000e+04,3.0279000000000000e+04,3.0982000000000000e+04,3.1684000000000000e+04,3.2386000000000000e+04,3.3092000000000000e+04,3.3796000000000000e+04,3.4498000000000000e+04};\n        arr_to_vec(posy_arr, sizeof(posy_arr)/sizeof(double), posy);\n        \n        double ccdy_arr[] = {1.3107372288166254e-02,-4.4774223393362671e-02,3.0076638024842117e-02,-8.6135161020642934e-02,3.0369194236788175e-02,-1.2818010979865727e-01,9.4688714202052965e-02,-1.0540202465113455e-01,1.1731023589284088e-01,-1.0675122704840387e-01,9.3172407761417331e-02,-1.1473527861399281e-01,9.9088061518403103e-02,-1.2304067434790292e-01,1.0756213297575871e-01,-1.3819201579833401e-01,9.2013249937297772e-02,-1.1514096785202740e-01,7.3097984221020360e-02,-1.0907100257198538e-01,1.0834244803526043e-01,-8.8411909107346920e-02,7.9168787031505469e-02,-1.1231197490097258e-01,5.2334907575884340e-02,-1.3078536132023377e-01,5.1879883070260188e-02,-1.0376250633410414e-01,4.1507445777280015e-02,-8.8539222248880847e-02,9.0152758809091224e-02,-9.2523410067961318e-02,5.3738510279886756e-02,-5.9296263353887768e-02,3.7139553575117376e-02,-5.4500145534886857e-02,5.4769082338792012e-02,-4.4249066821494085e-02,5.2929184630848433e-02,-8.4648068287386760e-02,6.2385656069781491e-02,-9.4806448475208582e-02,9.2817019204868553e-02,-1.1126504107212210e-01,1.7820375403635824e-01,-1.0663810718022593e-01,1.6995684162678765e-01,-1.2078158881427919e-01,1.7499221706103876e-01};\n        arr_to_vec(ccdy_arr, sizeof(ccdy_arr)/sizeof(double), ccdy);\n        \n      }else if (tdi == 64){\n\n        double posx_arr[] = {6.2699186227874088e+02,1.3461675875707542e+03,2.0930000000000000e+03,2.7950000000000000e+03,3.4950000000000000e+03,4.2030000000000000e+03,4.9040000000000000e+03,5.6100000000000000e+03,6.3120000000000000e+03,7.0140000000000000e+03,7.7210000000000000e+03,8.4240000000000000e+03,9.1300000000000000e+03,9.8340000000000000e+03,1.1245000000000000e+04,1.1950000000000000e+04,1.2654000000000000e+04,1.3359000000000000e+04,1.4067000000000000e+04,1.4770000000000000e+04,1.6188000000000000e+04,1.6885000000000000e+04,1.7548000000000000e+04,1.8257000000000000e+04,1.8992000000000000e+04,1.9680000000000000e+04,2.0344000000000000e+04,2.1062000000000000e+04,2.1831000000000000e+04,2.3235000000000000e+04,2.3842000000000000e+04,2.4644000000000000e+04,2.5348000000000000e+04,2.6030000000000000e+04,2.6766000000000000e+04,2.7460000000000000e+04,2.8166000000000000e+04,2.8825000000000000e+04,2.9535000000000000e+04,3.0237000000000000e+04,3.0912280738464615e+04,3.1687000000000000e+04,3.3056000000000000e+04,3.3788983639632665e+04,3.4519000000000000e+04};\n        arr_to_vec(posx_arr, sizeof(posx_arr)/sizeof(double), posx);\n        \n        double ccdx_arr[] = {-1.2792609435887725e-02,4.0494240728929487e-02,-1.0273352691430539e-01,8.2229471277714114e-02,-5.4475529897062357e-02,7.2915037399568755e-02,-1.0103524435446153e-01,9.5778667499021697e-02,-9.5304881062583668e-02,1.0309000552364080e-01,-1.2828111750968413e-01,8.9488905322020015e-02,-1.3170504889741538e-01,9.4227250600038351e-02,1.1822042900765461e-01,-1.1334921334805237e-01,1.0119421868702914e-01,-6.4727334822871962e-02,8.0871507398435433e-02,-6.9872252666780432e-02,-6.0274378318823513e-02,3.9940351814570278e-02,-3.7475294553143516e-02,-3.6557268782466311e-02,-1.7750634661306372e-02,2.2263518250025437e-02,-2.0724443503512890e-02,-2.5508351624193539e-02,-2.1584991651836631e-02,-3.3704752318420475e-02,2.8146249683458420e-02,1.1343238652058059e-01,-9.3495349110702036e-02,2.6950548118281847e-02,-5.1586284783127122e-02,4.7866630814835179e-02,-4.3834106753798716e-02,3.5011613858667877e-02,-2.3395009628591333e-02,2.6682662730749450e-02,-9.8322288711756856e-03,9.5464566142484233e-02,-2.7065840532238712e-02,-9.8322288711756856e-03,-5.4894710994844831e-02};\n        arr_to_vec(ccdx_arr, sizeof(ccdx_arr)/sizeof(double), ccdx);\n        \n        double posy_arr[] ={6.3500000000000000e+02,1.2820000000000000e+03,2.1007299424320090e+03,2.7720000000000000e+03,3.3920000000000000e+03,4.2030000000000000e+03,4.8730000000000000e+03,5.6070000000000000e+03,6.3110000000000000e+03,7.0160000000000000e+03,7.7190000000000000e+03,8.4190000000000000e+03,9.1310000000000000e+03,9.8360000000000000e+03,1.0536000000000000e+04,1.1245000000000000e+04,1.1949000000000000e+04,1.2656000000000000e+04,1.3358000000000000e+04,1.4063000000000000e+04,1.5471000000000000e+04,1.6148000000000000e+04,1.6876000000000000e+04,1.7590000000000000e+04,1.8213000000000000e+04,1.9007000000000000e+04,1.9700000000000000e+04,2.1816000000000000e+04,2.2540000000000000e+04,2.3235000000000000e+04,2.3936000000000000e+04,2.4639000000000000e+04,2.5346000000000000e+04,2.6054000000000000e+04,2.6756000000000000e+04,2.7459000000000000e+04,2.8162000000000000e+04,2.8867000000000000e+04,2.9572000000000000e+04,3.0277000000000000e+04,3.0980000000000000e+04,3.1683000000000000e+04,3.2385000000000000e+04,3.3092000000000000e+04,3.3795000000000000e+04,3.4498000000000000e+04};\n        arr_to_vec(posy_arr, sizeof(posy_arr)/sizeof(double), posy);\n        \n        double ccdy_arr[] = {4.7837093818003780e-02,-4.1131383205127936e-02,1.5291105530093801e-02,2.6406219479828064e-02,1.7038892246400386e-02,-8.3893616118013131e-02,-3.0798558429673883e-02,-7.1296297311020024e-02,7.0237957959390321e-02,-8.8849543754364088e-02,5.3731177621167692e-02,-6.2127535561531590e-02,6.7979180999753724e-02,-7.1084761864264878e-02,2.0915654083241642e-02,-1.0161360190451210e-01,6.8181658529722286e-02,-6.8670109770611248e-02,5.8230917196948596e-02,-9.0710391178991531e-02,-6.6201593855869656e-02,-1.8387554893765402e-02,-2.5298629591160960e-02,-4.9787072084544734e-02,-1.3793659780506999e-02,2.9405784476530958e-02,-1.9392190296183390e-02,-1.3920797534325183e-02,1.2248721915121240e-02,2.0476225781268360e-02,-5.2621159173484582e-02,-6.9400960299884795e-02,-2.6735049295340201e-02,2.4508151834901338e-02,-2.9419616554539875e-02,4.6921057682914893e-02,-2.4728786996870374e-02,5.8759661611343217e-02,-7.0148392770484819e-02,6.9844448140139487e-02,-7.6779042671121636e-02,1.5075498789185876e-01,-1.1342676258290449e-01,1.3176756444011312e-01,-1.2380488764138615e-01,2.1154165394809354e-01};\n        arr_to_vec(ccdy_arr, sizeof(ccdy_arr)/sizeof(double), ccdy);\n        \n      }\n      \n    } // end reverse scan\n    \n  }else{\n\n    // Do WV01\n    \n    if (is_forward){\n\n      // Forward scan\n      \n      if (tdi == 8){\n\n        double posx_arr[] = {6.9000000000000000e+02,1.3820000000000000e+03,2.0770000000000000e+03,2.7720000000000000e+03,3.4670000000000000e+03,4.1680000000000000e+03,4.8670000000000000e+03,5.5670000000000000e+03,6.2680000000000000e+03,6.9720000000000000e+03,7.6750000000000000e+03,8.3790000000000000e+03,9.0860000000000000e+03,9.7910000000000000e+03,1.0497000000000000e+04,1.1204000000000000e+04,1.1913000000000000e+04,1.2622000000000000e+04,1.3331000000000000e+04,1.4041000000000000e+04,1.4750000000000000e+04,1.5459000000000000e+04,1.6169000000000000e+04,1.6878000000000000e+04,1.7590000000000000e+04,1.8301000000000000e+04,1.9009000000000000e+04,1.9725000000000000e+04,2.0435000000000000e+04,2.1141000000000000e+04,2.1875000000000000e+04,2.2579000000000000e+04,2.3267000000000000e+04,2.3975000000000000e+04,2.4683000000000000e+04,2.5388000000000000e+04,2.6094000000000000e+04,2.6799000000000000e+04,2.7503000000000000e+04,2.8207000000000000e+04,2.8908000000000000e+04,2.9610000000000000e+04,3.0310000000000000e+04,3.1010000000000000e+04,3.1707000000000000e+04,3.2404000000000000e+04,3.3098000000000000e+04,3.3792000000000000e+04,3.4484000000000000e+04};\n        arr_to_vec(posx_arr, sizeof(posx_arr)/sizeof(double), posx);\n        \n        double ccdx_arr[] = {0,0,0,0,3.9572899122610738e-01,-0.4,1.3571345876690324e-01,-1.3599568525285227e-01,2.1848597840209738e-01,-1.9302532491443239e-01,1.5373607383106744e-01,-2.7948565111193063e-01,1.8470511522813510e-01,-8.8010620304032103e-02,4.1712154427482312e-01,-1.6133955851477760e-01,1.6782370523021301e-01,-1.9071066562455274e-01,9.4139947899578386e-02,-1.8390507569972631e-01,1.0458337107311372e-01,-1.3184212217192476e-01,1.3748731085111202e-01,-1.6997707746371654e-01,4.0533794015827662e-01,-1.8414617591004279e-01,1.5844241125556013e-01,-1.3291686600523619e-01,1.0204979703149097e-01,-2.0664117331352239e-01,1.8094775320573228e-01,-2.0731801920342768e-01,7.1547167910899323e-02,-1.3458151098218407e-01,1.4946741303774508e-01,-9.1924110765654321e-02,6.8305981753759237e-02,0,0,0,0,0,0,0,0,1.9511982760486032e-01,-2.6781463372201086e-01,2.2508286764347213e-01,-2.1325412224027540e-01};\n        arr_to_vec(ccdx_arr, sizeof(ccdx_arr)/sizeof(double), ccdx);\n        \n        double posy_arr[] ={6.9000000000000000e+02,1.3820000000000000e+03,2.0770000000000000e+03,2.7720000000000000e+03,3.4670000000000000e+03,4.1680000000000000e+03,4.8670000000000000e+03,5.5670000000000000e+03,6.2680000000000000e+03,6.9720000000000000e+03,7.6750000000000000e+03,8.3790000000000000e+03,9.0860000000000000e+03,9.7910000000000000e+03,1.0497000000000000e+04,1.1204000000000000e+04,1.1913000000000000e+04,1.2622000000000000e+04,1.3331000000000000e+04,1.4041000000000000e+04,1.4750000000000000e+04,1.5459000000000000e+04,1.6169000000000000e+04,1.6878000000000000e+04,1.7590000000000000e+04,1.8301000000000000e+04,1.9009000000000000e+04,1.9725000000000000e+04,2.0435000000000000e+04,2.1141000000000000e+04,2.1875000000000000e+04,2.2579000000000000e+04,2.3267000000000000e+04,2.3975000000000000e+04,2.4683000000000000e+04,2.5388000000000000e+04,2.6094000000000000e+04,2.6799000000000000e+04,2.7503000000000000e+04,2.8207000000000000e+04,2.8908000000000000e+04,2.9610000000000000e+04,3.0310000000000000e+04,3.1010000000000000e+04,3.1707000000000000e+04,3.2404000000000000e+04,3.3098000000000000e+04,3.3792000000000000e+04,3.4484000000000000e+04};\n        arr_to_vec(posy_arr, sizeof(posy_arr)/sizeof(double), posy);\n        \n        double ccdy_arr[] = {0,0,0,0,2.7737184873656524e-01,-2.5199396985728040e-01,9.2651619425092591e-02,-1.2484085009254375e-01,9.1624371368929466e-02,-1.0163420477660505e-01,-8.5087919020240044e-02,-5.3278003593145037e-02,1.9474828198101091e-01,-5.5653320997682228e-02,1.4105791229907522e-01,-9.7756436532447491e-02,2.3515271743956914e-01,-2.4064621068353220e-01,1.9793293593058281e-01,-3.0417359707178432e-01,3.0974742641785702e-01,-2.8392516950893354e-01,4.3358586437052404e-01,-2.1286311036139788e-01,2.4607083739631108e-01,-2.8247520147602145e-01,3.5719728474354340e-01,-3.6362100039496115e-01,3.7045268711965218e-01,-3.3826985178248126e-01,4.2964452311943979e-01,-3.7778034342534478e-01,3.5082720318556498e-01,-4.6804694273970554e-01,3.2346002285296005e-01,-3.1529610028369914e-01,4.7169816490584404e-01,-4.7766860316648618e-01,4.1307927109971820e-01,-3.4825254544933831e-01,3.6562789909663967e-01,-4.8754456032180638e-01,3.9579963026130471e-01,-3.2165596442784983e-01,3.7812760195170941e-01,-3.8101306006307878e-01,4.9930246080447915e-01,-5.7700807932152287e-01,4.8434239761391673e-01};\n        arr_to_vec(ccdy_arr, sizeof(ccdy_arr)/sizeof(double), ccdy);\n\n      }else if (tdi == 16){\n        \n        double posx_arr[] = {6.2900000000000000e+02,1.3570000000000000e+03,2.0190000000000000e+03,2.7690000000000000e+03,3.4720000000000000e+03,4.1790000000000000e+03,4.8670000000000000e+03,5.5680000000000000e+03,6.2730000000000000e+03,6.9730000000000000e+03,7.6250000000000000e+03,8.3790000000000000e+03,9.0910000000000000e+03,9.7920000000000000e+03,1.0499000000000000e+04,1.1204000000000000e+04,1.1911000000000000e+04,1.2620000000000000e+04,1.3332000000000000e+04,1.4040000000000000e+04,1.4750000000000000e+04,1.5459000000000000e+04,1.6170000000000000e+04,1.6879000000000000e+04,1.7591000000000000e+04,1.8300000000000000e+04,1.9008000000000000e+04,1.9720000000000000e+04,2.0426000000000000e+04,2.1141000000000000e+04,2.1848000000000000e+04,2.2559000000000000e+04,2.3271000000000000e+04,2.3977000000000000e+04,2.4682000000000000e+04,2.5419000000000000e+04,2.6095000000000000e+04,2.6803000000000000e+04,2.7446000000000000e+04,2.8302000000000000e+04,2.8908000000000000e+04,2.9608000000000000e+04,3.0313000000000000e+04,3.1009000000000000e+04,3.1705000000000000e+04,3.2406000000000000e+04,3.3100000000000000e+04,3.3792000000000000e+04,3.4483000000000000e+04};\n        arr_to_vec(posx_arr, sizeof(posx_arr)/sizeof(double), posx);\n        \n        double ccdx_arr[] = {6.7322551801454480e-02,5.5941279131803634e-02,-6.3757124794674186e-02,-6.8350222655965132e-02,1.7691659140427704e-01,-6.5546000611674385e-02,6.3907733085781446e-02,-9.4966625926268172e-02,9.4161850926099605e-02,-1.0542259530055144e-01,-8.1558061694499709e-02,-6.3956300595019416e-02,4.1564490770397769e-02,-6.0005436499402910e-02,2.7687811096602116e-01,-6.7650615566507560e-02,8.9531829438824359e-02,-7.5787800987529685e-02,6.0918450645685199e-02,-4.9435252430723518e-02,7.8217062959282352e-02,-9.4972312086564092e-02,6.8771948144368461e-02,-5.5916563953937647e-02,2.5576397858317801e-01,-6.2953016311800947e-02,4.5986274236245760e-02,-5.2151312380337433e-02,3.5461672386768096e-02,-7.8840968976700190e-02,5.8279888571948685e-02,-5.6318493405969880e-02,-2.3130788594668883e-02,-2.5727892445735229e-02,6.7618551931374907e-02,-3.2635798235672329e-02,-6.7421171442540700e-02,8.6289010551310996e-02,-4.2940282592809562e-02,-6.7487297331515511e-02,-1.6954569447987194e-01,1.5768945188280239e-01,-1.3197137444641416e-01,2.2044168881490209e-01,-1.7686345973293444e-01,2.8571073037673689e-01,-2.5204743971722710e-01,2.9477986650443111e-01,-3.1357641656875035e-01};\n        arr_to_vec(ccdx_arr, sizeof(ccdx_arr)/sizeof(double), ccdx);\n        \n        double posy_arr[] ={5.5700000000000000e+02,1.3840000000000000e+03,2.0790000000000000e+03,2.7720000000000000e+03,4.9010000000000000e+03,5.6020000000000000e+03,6.8740000000000000e+03,7.6810000000000000e+03,8.3770000000000000e+03,9.0860000000000000e+03,9.7910000000000000e+03,1.0500000000000000e+04,1.1206000000000000e+04,1.1914000000000000e+04,1.2623000000000000e+04,1.3331000000000000e+04,1.4041000000000000e+04,1.4749000000000000e+04,1.5459000000000000e+04,1.6170000000000000e+04,1.6881000000000000e+04,1.7590000000000000e+04,1.8301000000000000e+04,1.9011000000000000e+04,1.9722000000000000e+04,2.0431000000000000e+04,2.1140000000000000e+04,2.1851000000000000e+04,2.2558000000000000e+04,2.3267000000000000e+04,2.3976000000000000e+04,2.4682000000000000e+04,2.5388000000000000e+04,2.6094000000000000e+04,2.6800000000000000e+04,2.7503000000000000e+04,2.8206000000000000e+04,2.8909000000000000e+04,2.9611000000000000e+04,3.0309000000000000e+04,3.1009000000000000e+04,3.1707000000000000e+04,3.2401000000000000e+04,3.3098000000000000e+04,3.3791000000000000e+04,3.4482000000000000e+04};\n        arr_to_vec(posy_arr, sizeof(posy_arr)/sizeof(double), posy);\n        \n        double ccdy_arr[] = {5.2874163366164850e-02,1.4813114779561809e-01,-1.3228522060801995e-01,5.1229840789382905e-02,4.1734055216619194e-02,-3.4922349728371403e-02,2.3489411511399848e-02,8.0756339158257071e-02,-4.1430846518602682e-02,1.3825891634375403e-01,-1.0281921942927558e-01,1.8102049531293241e-01,-1.4505660180914340e-01,1.8186344173432878e-01,-1.8620316464758269e-01,1.9090650984864999e-01,-2.8086787970093174e-01,2.7066109799278149e-01,-2.2564204861733023e-01,3.2153128507658019e-01,-2.5708859257733496e-01,2.6364737894970347e-01,-2.8693208660602365e-01,2.7970516529790845e-01,-3.5311023659542107e-01,3.4701280163120907e-01,-3.1032664634310730e-01,3.5125263768893017e-01,-3.3322268782288833e-01,3.6955614181826035e-01,-3.3683473663931718e-01,3.2182908581461295e-01,-2.8261547868377229e-01,3.4742873160768417e-01,-2.9435215444692314e-01,3.0697747027458971e-01,-2.9547216462701609e-01,3.2267414829365171e-01,-3.4291155301037418e-01,2.8631768612226638e-01,-2.6625338683543259e-01,3.4282658200878574e-01,-2.5735046181265991e-01,2.6016063755950836e-01,-2.7861330621270186e-01,2.4248759221995142e-01};\n        arr_to_vec(ccdy_arr, sizeof(ccdy_arr)/sizeof(double), ccdy);\n\n      }else if (tdi == 32){\n        \n         double posx_arr[] = {6.9100000000000000e+02,1.3830000000000000e+03,2.0770000000000000e+03,2.7730000000000000e+03,3.4580000000000000e+03,4.1690000000000000e+03,4.8670000000000000e+03,5.5680000000000000e+03,6.2700000000000000e+03,6.9720000000000000e+03,7.6770000000000000e+03,8.3800000000000000e+03,9.0860000000000000e+03,9.7920000000000000e+03,1.0505000000000000e+04,1.1206000000000000e+04,1.1913000000000000e+04,1.2622000000000000e+04,1.3331000000000000e+04,1.4041000000000000e+04,1.4750000000000000e+04,1.5460000000000000e+04,1.6170000000000000e+04,1.6881000000000000e+04,1.7591000000000000e+04,1.8301000000000000e+04,1.9012000000000000e+04,1.9720000000000000e+04,2.0432000000000000e+04,2.1140000000000000e+04,2.1849000000000000e+04,2.2558000000000000e+04,2.3266000000000000e+04,2.3974000000000000e+04,2.4682000000000000e+04,2.5388000000000000e+04,2.6094000000000000e+04,2.6799000000000000e+04,2.7503000000000000e+04,2.8207000000000000e+04,2.8910000000000000e+04,2.9610000000000000e+04,3.0310000000000000e+04,3.1009000000000000e+04,3.1707000000000000e+04,3.2402000000000000e+04,3.3099000000000000e+04,3.3792000000000000e+04,3.4484000000000000e+04};\n         arr_to_vec(posx_arr, sizeof(posx_arr)/sizeof(double), posx);\n        \n         double ccdx_arr[] = {-1.5815654418563752e-01,1.3826350530962050e-01,-1.6016106928636276e-01,1.7292351786151797e-01,-8.4251284556116038e-02,1.3523902369157348e-01,-1.3545886295780737e-01,1.3984628576111927e-01,-8.1532674525840704e-02,9.4697680166625067e-02,-1.0592758885259967e-01,4.6579834981628057e-02,-8.2313118665729212e-02,1.2002910740140957e-01,1.5536100300284500e-01,9.5570826053090252e-02,-8.5935714547473396e-02,7.1701504496924306e-02,-4.8261551539294886e-02,1.0887016101633357e-01,-6.0376640338178925e-02,5.0426384764782284e-02,-7.4629150917886147e-02,7.3333337683582994e-02,1.3473731928967686e-01,5.9902243380629411e-02,-1.0637719830921741e-01,1.2901431398998836e-01,-6.7279387139093816e-02,8.6465589898355108e-02,-7.9828628987704930e-02,1.0291510265774768e-01,-1.0434449874621080e-01,1.2679075861184977e-01,-4.1769763304420532e-02,1.8653481213510253e-01,-2.0958544403438775e-01,1.9791028244010830e-01,-2.4696221386197473e-01,2.2895773820335324e-01,-1.7850291944712204e-01,1.8711950573480507e-01,-3.3754429964928234e-01,2.5821884129030215e-01,-2.0434256714964005e-01,4.1418566014699210e-01,-3.9931658359979100e-01,3.7510088116850077e-01,-4.1403543054361425e-01};\n         arr_to_vec(ccdx_arr, sizeof(ccdx_arr)/sizeof(double), ccdx);\n        \n         double posy_arr[] ={6.9100000000000000e+02,1.3830000000000000e+03,2.0770000000000000e+03,2.7740000000000000e+03,3.4575000000000000e+03,4.1680000000000000e+03,4.8660000000000000e+03,5.5670000000000000e+03,6.2710000000000000e+03,6.9730000000000000e+03,7.4430000000000000e+03,8.4860000000000000e+03,9.1100000000000000e+03,9.7920000000000000e+03,1.0498000000000000e+04,1.1207000000000000e+04,1.1914000000000000e+04,1.2622000000000000e+04,1.3329000000000000e+04,1.4041000000000000e+04,1.4750000000000000e+04,1.5460000000000000e+04,1.6170000000000000e+04,1.6880000000000000e+04,1.7590000000000000e+04,1.8301000000000000e+04,1.9011000000000000e+04,1.9720000000000000e+04,2.0430000000000000e+04,2.1141000000000000e+04,2.1850000000000000e+04,2.2558000000000000e+04,2.3267000000000000e+04,2.3974000000000000e+04,2.4681000000000000e+04,2.5389000000000000e+04,2.6094000000000000e+04,2.6797000000000000e+04,2.7501000000000000e+04,2.8238000000000000e+04,2.8896000000000000e+04,2.9710000000000000e+04,3.0106000000000000e+04,3.1007000000000000e+04,3.1552000000000000e+04,3.2402000000000000e+04,3.3097000000000000e+04,3.3792000000000000e+04,3.4483000000000000e+04};\n         arr_to_vec(posy_arr, sizeof(posy_arr)/sizeof(double), posy);\n        \n         double ccdy_arr[] = {-2.5679384780785375e-01,2.1132524108212025e-01,-1.9890929041258171e-01,1.6743466645971244e-01,-3.0290900802832363e-02,1.2520084986428626e-01,-6.6310853481927404e-02,9.7787759335348293e-02,-4.7026742606632993e-02,-4.0719397722168357e-02,3.3620546875873569e-02,-3.0102129563891310e-02,5.1037911282746602e-02,-4.0388786002217299e-02,4.8061714461599923e-02,-5.5895642605816913e-02,7.1314129810702370e-02,-7.6604178475669069e-02,9.7449063613589945e-02,-1.0828765871885951e-01,1.1363625166513155e-01,-1.2841434371486909e-01,1.1913396821174335e-01,-1.6093971470699187e-01,1.6679734496194806e-01,-1.9561240122110690e-01,1.4561399603445646e-01,-1.8834366060830782e-01,1.4779996646048937e-01,-1.6694224556665363e-01,1.6887551340374002e-01,-1.6896325192069545e-01,1.7280986149540695e-01,-1.7481150806231555e-01,1.8974131057032312e-01,-1.6203523746941276e-01,1.2895698177790360e-01,-1.2814173545280660e-01,1.3614836986578066e-01,-1.5894266097567594e-01,1.4865193671756302e-01,-1.1977251781868413e-01,1.3054339999410874e-01,-9.6750535696703138e-02,1.6842720636109526e-01,-8.2351842567259040e-02,-5.9741317509331537e-02,-7.4004189893254774e-02,-6.0371436981168827e-02};\n         arr_to_vec(ccdy_arr, sizeof(ccdy_arr)/sizeof(double), ccdy);\n        \n      }else if (tdi == 48){\n        \n        double posx_arr[] = {6.9100000000000000e+02,1.3830000000000000e+03,2.0770000000000000e+03,2.7730000000000000e+03,3.4580000000000000e+03,4.1690000000000000e+03,4.8670000000000000e+03,5.5680000000000000e+03,6.2700000000000000e+03,6.9720000000000000e+03,7.6770000000000000e+03,8.3800000000000000e+03,9.0860000000000000e+03,9.7920000000000000e+03,1.0505000000000000e+04,1.1206000000000000e+04,1.1913000000000000e+04,1.2622000000000000e+04,1.3331000000000000e+04,1.4041000000000000e+04,1.4750000000000000e+04,1.5460000000000000e+04,1.6170000000000000e+04,1.6881000000000000e+04,1.7591000000000000e+04,1.8301000000000000e+04,1.9012000000000000e+04,1.9720000000000000e+04,2.0432000000000000e+04,2.1140000000000000e+04,2.1849000000000000e+04,2.2558000000000000e+04,2.3266000000000000e+04,2.3974000000000000e+04,2.4682000000000000e+04,2.5388000000000000e+04,2.6094000000000000e+04,2.6799000000000000e+04,2.7503000000000000e+04,2.8207000000000000e+04,2.8910000000000000e+04,2.9610000000000000e+04,3.0310000000000000e+04,3.1009000000000000e+04,3.1707000000000000e+04,3.2402000000000000e+04,3.3099000000000000e+04,3.3792000000000000e+04,3.4484000000000000e+04};\n        arr_to_vec(posx_arr, sizeof(posx_arr)/sizeof(double), posx);\n        \n        double ccdx_arr[] = {-3.2946263385876073e-01,2.6822672303060707e-01,-2.7219800277644979e-01,3.2114706103684659e-01,-1.1264051193844726e-01,2.1650365243094197e-01,-2.9850534257863964e-01,2.4690262924579376e-01,-3.0264558267838221e-01,1.9002513807042659e-01,-2.2269004121580999e-01,1.9360526493221386e-01,-2.4333024293404595e-01,2.3253426572925068e-01,2.5156939346654091e-02,2.3240995046557339e-01,-2.2672903386601889e-01,1.5590477088799856e-01,-1.5002686187069883e-01,2.0344831295675106e-01,-1.5000864041927442e-01,1.8004430049333014e-01,-1.8236695292080785e-01,1.8325510525277885e-01,3.3572343456822654e-02,1.6768958115164090e-01,-1.7656399543377982e-01,1.9586089774158649e-01,-1.7984311406510889e-01,1.9926780777821917e-01,-2.0358163540196328e-01,1.8788400881417389e-01,-2.6839931133109096e-01,2.4275915958519964e-01,-1.9419370826317078e-01,2.3213640634391663e-01,-2.0322722705876156e-01,2.5395023204178102e-01,-3.1352589198440872e-01,2.8813130768645712e-01,-3.2571760506100766e-01,3.7344440543148194e-01,-3.2440667961683478e-01,4.4966322933102876e-01,-3.5284854392228138e-01,4.5498566236612847e-01,-4.6890882370639664e-01,5.3253439420167337e-01,-5.1690187379933494e-01};\n        arr_to_vec(ccdx_arr, sizeof(ccdx_arr)/sizeof(double), ccdx);\n        \n        double posy_arr[] ={6.9100000000000000e+02,1.3830000000000000e+03,2.0770000000000000e+03,2.7740000000000000e+03,3.4575000000000000e+03,4.1680000000000000e+03,4.8660000000000000e+03,5.5670000000000000e+03,6.2710000000000000e+03,6.9730000000000000e+03,7.4430000000000000e+03,8.4860000000000000e+03,9.1100000000000000e+03,9.7920000000000000e+03,1.0498000000000000e+04,1.1207000000000000e+04,1.1914000000000000e+04,1.2622000000000000e+04,1.3329000000000000e+04,1.4041000000000000e+04,1.4750000000000000e+04,1.5460000000000000e+04,1.6170000000000000e+04,1.6880000000000000e+04,1.7590000000000000e+04,1.8301000000000000e+04,1.9011000000000000e+04,1.9720000000000000e+04,2.0430000000000000e+04,2.1141000000000000e+04,2.1850000000000000e+04,2.2558000000000000e+04,2.3267000000000000e+04,2.3974000000000000e+04,2.4681000000000000e+04,2.5389000000000000e+04,2.6094000000000000e+04,2.6797000000000000e+04,2.7501000000000000e+04,2.8238000000000000e+04,2.8896000000000000e+04,2.9710000000000000e+04,3.0106000000000000e+04,3.1007000000000000e+04,3.1552000000000000e+04,3.2402000000000000e+04,3.3097000000000000e+04,3.3792000000000000e+04,3.4483000000000000e+04};\n        arr_to_vec(posy_arr, sizeof(posy_arr)/sizeof(double), posy);\n        \n        double ccdy_arr[] = {-1.9855267108725011e-01,1.7955082108595999e-01,-1.8827745225040018e-01,1.3932648815497944e-01,-6.0352542704901455e-02,8.3598970550751980e-02,-8.1175104051077959e-02,6.1423375459795058e-02,-4.5004799966324879e-02,5.1255915991506043e-02,1.5851812214634477e-02,1.5587369184767868e-02,1.2194157289131528e-02,-3.3985901939564599e-02,7.0922061628214295e-02,-5.3223665244117681e-02,3.8875501918710656e-02,-5.5471377905873670e-02,5.3105759125309210e-02,-9.9237321842864795e-02,6.2515982392321895e-02,-8.4411396949582967e-02,8.7660527700112317e-02,-9.7615657244219792e-02,1.1887807394615302e-01,-1.0116151698982925e-01,9.2884382992062239e-02,-9.0252420387025509e-02,8.8929836687679620e-02,-1.0833431823799911e-01,8.0427361987862905e-02,-8.8225813952202234e-02,6.7822547934654032e-02,-8.6349198150212400e-02,8.7246760279810182e-02,-7.0883233135712959e-02,4.1376134151766455e-02,-3.5761138416796644e-02,3.7183085174551947e-02,-1.8063316353517003e-02,2.0949603842599852e-02,-2.4268409874204040e-02,-2.2141072979198307e-02,3.0889019160442014e-02,3.4287549363534349e-02,7.0188151962212772e-02,-6.9597035784645517e-02,9.1561840117775795e-02,-1.4346661758051732e-01};\n        arr_to_vec(ccdy_arr, sizeof(ccdy_arr)/sizeof(double), ccdy);\n        \n      }else if (tdi == 56){\n        \n        double posx_arr[] = {6.9050000000000000e+02,1.3830000000000000e+03,2.0775000000000000e+03,2.7725000000000000e+03,3.4635000000000000e+03,4.1680000000000000e+03,4.8670000000000000e+03,5.5680000000000000e+03,6.2695000000000000e+03,6.9720000000000000e+03,7.6765000000000000e+03,8.3800000000000000e+03,9.0845000000000000e+03,9.7915000000000000e+03,1.0502500000000000e+04,1.1205500000000000e+04,1.1913500000000000e+04,1.2621500000000000e+04,1.3330500000000000e+04,1.4040500000000000e+04,1.4749500000000000e+04,1.5460000000000000e+04,1.6169500000000000e+04,1.6880500000000000e+04,1.7590500000000000e+04,1.8301000000000000e+04,1.9011500000000000e+04,1.9720500000000000e+04,2.0431500000000000e+04,2.1140000000000000e+04,2.1849000000000000e+04,2.2558000000000000e+04,2.3266500000000000e+04,2.3974000000000000e+04,2.4682000000000000e+04,2.5388000000000000e+04,2.6094000000000000e+04,2.6798500000000000e+04,2.7502500000000000e+04,2.8207000000000000e+04,2.8910000000000000e+04,2.9610500000000000e+04,3.0310000000000000e+04,3.1009000000000000e+04,3.1707000000000000e+04,3.2402000000000000e+04,3.3098000000000000e+04,3.3792000000000000e+04,3.4483500000000000e+04};\n        arr_to_vec(posx_arr, sizeof(posx_arr)/sizeof(double), posx);\n        \n        double ccdx_arr[] = {-3.5011442399307202e-01,3.1186407063727184e-01,-3.2335982284254117e-01,3.5688803627847732e-01,-1.5016902336398030e-01,2.7091922018898873e-01,-3.4524579685389989e-01,3.1697476178278094e-01,-3.3427642010528191e-01,2.4348731667372364e-01,-2.5459010039954394e-01,2.2227864965341840e-01,-2.4963564133255550e-01,2.6519143229617087e-01,-1.2640033051156893e-02,2.6926418565530419e-01,-2.6413094069459742e-01,1.7933663392775823e-01,-1.7857720325097262e-01,2.3227298026241555e-01,-1.8833606658120045e-01,2.0690430915056696e-01,-2.2153185513515222e-01,2.2470157361209891e-01,-1.0775858639518222e-02,1.9409607914016191e-01,-1.9017563481638641e-01,2.0941570156418010e-01,-1.9959115270537459e-01,2.3450585103367219e-01,-2.4346167898401047e-01,2.3507302665020746e-01,-2.9839629178583321e-01,2.8796840809065738e-01,-2.2339992370188613e-01,2.6676508093280049e-01,-2.2822730588765003e-01,2.7316283112057416e-01,-3.4718648441520028e-01,3.2886139038062245e-01,-3.1213617802392812e-01,4.1015850839081253e-01,-3.6843147363566531e-01,4.4417245109948189e-01,-3.4664171603617239e-01,4.8513123485069182e-01,-4.9177442050887177e-01,5.5564212715312777e-01,-5.1330089584066618e-01};\n        arr_to_vec(ccdx_arr, sizeof(ccdx_arr)/sizeof(double), ccdx);\n        \n        double posy_arr[] ={6.9100000000000000e+02,1.3835000000000000e+03,2.0765000000000000e+03,2.7740000000000000e+03,3.3962500000000000e+03,4.1665000000000000e+03,4.8670000000000000e+03,5.5665000000000000e+03,6.2720000000000000e+03,6.9150000000000000e+03,7.4840000000000000e+03,8.3960000000000000e+03,9.0795000000000000e+03,9.8765000000000000e+03,1.0498500000000000e+04,1.1205500000000000e+04,1.1913500000000000e+04,1.2623000000000000e+04,1.3330500000000000e+04,1.4041500000000000e+04,1.4750000000000000e+04,1.5460000000000000e+04,1.6170500000000000e+04,1.6880500000000000e+04,1.7590500000000000e+04,1.8301000000000000e+04,1.9011000000000000e+04,1.9722000000000000e+04,2.0428500000000000e+04,2.1140500000000000e+04,2.1901000000000000e+04,2.2493500000000000e+04,2.3267000000000000e+04,2.3976000000000000e+04,2.4678500000000000e+04,2.5387500000000000e+04,2.6094500000000000e+04,2.6797000000000000e+04,2.7501000000000000e+04,2.8222500000000000e+04,2.8901500000000000e+04,2.9660500000000000e+04,3.0208000000000000e+04,3.1008000000000000e+04,3.1629500000000000e+04,3.2402500000000000e+04,3.3098500000000000e+04,3.3792000000000000e+04,3.4483500000000000e+04};\n        arr_to_vec(posy_arr, sizeof(posy_arr)/sizeof(double), posy);\n        \n        double ccdy_arr[] = {-1.6583445664923085e-01,1.5749516507363931e-01,-1.6399364833748065e-01,1.3444012169169411e-01,-1.4218531165367934e-02,8.7605123753737107e-02,-7.6127025966082007e-02,6.4299120414989461e-02,-4.3959138934048909e-02,1.0176549144186326e-02,2.0660621136971577e-02,1.5891891134220865e-02,-6.6450679959886225e-03,-2.5258926562893420e-02,5.0562514191529004e-02,-3.9414471676108662e-02,2.9733409728897639e-02,-4.6981472589652754e-02,4.8151836469005942e-02,-7.6412104777085432e-02,5.6004981001094828e-02,-6.9293794016547533e-02,6.0390792185470138e-02,-7.1416824888125160e-02,8.7665159376180662e-02,-7.9976193812377444e-02,5.8036691718802436e-02,-5.9601458599666465e-02,5.6422514716840351e-02,-6.5824108186222058e-02,3.3418567527584750e-02,-3.6893476936227472e-02,1.7823520772154627e-02,-5.1921130252393144e-02,3.3106020550451989e-02,-1.4647343638039951e-02,-5.5192217889821343e-03,8.3853995859731918e-03,-1.4399925983834681e-02,3.3745059837696025e-02,-5.4753302855168780e-02,4.9745691197937855e-02,-9.3580681077980274e-02,1.1683790680589558e-01,-3.0054266039368501e-02,1.5181256524274175e-01,-1.4862946648500802e-01,1.7373902256820783e-01,-1.9462470532068496e-01};\n        arr_to_vec(ccdy_arr, sizeof(ccdy_arr)/sizeof(double), ccdy);\n        \n      }else if (tdi == 64){\n        \n        double posx_arr[] = {6.9000000000000000e+02,1.3830000000000000e+03,2.0780000000000000e+03,2.7720000000000000e+03,3.4690000000000000e+03,4.1670000000000000e+03,4.8670000000000000e+03,5.5680000000000000e+03,6.2690000000000000e+03,6.9720000000000000e+03,7.6760000000000000e+03,8.3800000000000000e+03,9.0830000000000000e+03,9.7910000000000000e+03,1.0500000000000000e+04,1.1205000000000000e+04,1.1914000000000000e+04,1.2621000000000000e+04,1.3330000000000000e+04,1.4040000000000000e+04,1.4749000000000000e+04,1.5460000000000000e+04,1.6169000000000000e+04,1.6880000000000000e+04,1.7590000000000000e+04,1.8301000000000000e+04,1.9011000000000000e+04,1.9721000000000000e+04,2.0431000000000000e+04,2.1140000000000000e+04,2.1849000000000000e+04,2.2558000000000000e+04,2.3267000000000000e+04,2.3974000000000000e+04,2.4682000000000000e+04,2.5388000000000000e+04,2.6094000000000000e+04,2.6798000000000000e+04,2.7502000000000000e+04,2.8207000000000000e+04,2.8910000000000000e+04,2.9611000000000000e+04,3.0310000000000000e+04,3.1009000000000000e+04,3.1707000000000000e+04,3.2402000000000000e+04,3.3097000000000000e+04,3.3792000000000000e+04,3.4483000000000000e+04};\n        arr_to_vec(posx_arr, sizeof(posx_arr)/sizeof(double), posx);\n        \n        double ccdx_arr[] = {-3.7076621412738331e-01,3.5550141824393666e-01,-3.7452164290863260e-01,3.9262901152010804e-01,-1.8769753478951337e-01,3.2533478794703546e-01,-3.9198625112916013e-01,3.8704689431976808e-01,-3.6590725753218167e-01,2.9694949527702069e-01,-2.8649015958327789e-01,2.5095203437462293e-01,-2.5594103973106508e-01,2.9784859886309106e-01,-5.0437005448967877e-02,3.0611842084503493e-01,-3.0153284752317600e-01,2.0276849696751786e-01,-2.0712754463124641e-01,2.6109764756808007e-01,-2.2666349274312650e-01,2.3376431780780377e-01,-2.6069675734949660e-01,2.6614804197141900e-01,-5.5124060735859098e-02,2.2050257712868293e-01,-2.0378727419899301e-01,2.2297050538677374e-01,-2.1933919134564028e-01,2.6974389428912521e-01,-2.8334172256605766e-01,2.8226204448624104e-01,-3.2839327224057546e-01,3.3317765659611515e-01,-2.5260613914060148e-01,3.0139375552168429e-01,-2.5322738471653850e-01,2.9237543019936735e-01,-3.8084707684599189e-01,3.6959147307478779e-01,-2.9855475098684858e-01,4.4687261135014311e-01,-4.1245626765449583e-01,4.3868167286793502e-01,-3.4043488815006340e-01,5.1527680733525516e-01,-5.1464001731134690e-01,5.7874986010458207e-01,-5.0969991788199742e-01};\n        arr_to_vec(ccdx_arr, sizeof(ccdx_arr)/sizeof(double), ccdx);\n        \n        double posy_arr[] ={6.9100000000000000e+02,1.3840000000000000e+03,2.0760000000000000e+03,2.7740000000000000e+03,3.3350000000000000e+03,4.1650000000000000e+03,4.8680000000000000e+03,5.5660000000000000e+03,6.2730000000000000e+03,6.8570000000000000e+03,7.5250000000000000e+03,8.3060000000000000e+03,9.0490000000000000e+03,9.9610000000000000e+03,1.0499000000000000e+04,1.1204000000000000e+04,1.1913000000000000e+04,1.2624000000000000e+04,1.3332000000000000e+04,1.4042000000000000e+04,1.4750000000000000e+04,1.5460000000000000e+04,1.6171000000000000e+04,1.6881000000000000e+04,1.7591000000000000e+04,1.8301000000000000e+04,1.9011000000000000e+04,1.9724000000000000e+04,2.0427000000000000e+04,2.1140000000000000e+04,2.1952000000000000e+04,2.2429000000000000e+04,2.3267000000000000e+04,2.3978000000000000e+04,2.4676000000000000e+04,2.5386000000000000e+04,2.6095000000000000e+04,2.6797000000000000e+04,2.7501000000000000e+04,2.8207000000000000e+04,2.8907000000000000e+04,2.9611000000000000e+04,3.0310000000000000e+04,3.1009000000000000e+04,3.1707000000000000e+04,3.2403000000000000e+04,3.3100000000000000e+04,3.3792000000000000e+04,3.4484000000000000e+04};\n        arr_to_vec(posy_arr, sizeof(posy_arr)/sizeof(double), posy);\n        \n        double ccdy_arr[] = {-1.3311624221121157e-01,1.3543950906131863e-01,-1.3970984442456114e-01,1.2955375522840876e-01,3.1915480374165583e-02,9.1611276956722235e-02,-7.1078947881086069e-02,6.7174865370183856e-02,-4.2913477901772940e-02,-3.0902817703133391e-02,2.5469430059308677e-02,1.6196413083673863e-02,-2.5484293281108773e-02,-1.6531951186222246e-02,3.0202966754843706e-02,-2.5605278108099649e-02,2.0591317539084622e-02,-3.8491567273431844e-02,4.3197913812702673e-02,-5.3586887711306076e-02,4.9493979609867761e-02,-5.4176191083512099e-02,3.3121056670827966e-02,-4.5217992532030522e-02,5.6452244806208293e-02,-5.8790870634925628e-02,2.3189000445542639e-02,-2.8950496812307429e-02,2.3915192746001082e-02,-2.3313898134445021e-02,-1.3590226932693400e-02,1.4438860079747286e-02,-3.2175506390344777e-02,-1.7493062354573888e-02,-2.1034719178906199e-02,4.1588545859633057e-02,-5.2414577729730724e-02,5.2531937588743027e-02,-6.5982937142221310e-02,8.5553436028909052e-02,-1.3045620955293741e-01,1.2375979227007976e-01,-1.6502028917676223e-01,2.0278679445134914e-01,-9.4396081442271351e-02,2.3343697852327072e-01,-2.2766189718537050e-01,2.5591620501863988e-01,-2.4578279306085260e-01};\n        arr_to_vec(ccdy_arr, sizeof(ccdy_arr)/sizeof(double), ccdy);\n        \n      }\n      \n    }else{\n\n      // Reverse scan for WV01\n\n      if (tdi == 8){\n\n        double posx_arr[] = {690,1384,2077,2773,3485,4167,4867,5567,6267,6971,7676,8381,9085,9790,10497,11199,11912,12622,13333,14039,14750,15461,16173,16836,17592,18302,19004,19714,20430,21093,21847,22560,23267,23976,24680,25390,26095,26805,27502,28207,28911,29611,30308,31012,31708,32404,33099,33792,34483};\n        arr_to_vec(posx_arr, sizeof(posx_arr)/sizeof(double), posx);\n        \n        double ccdx_arr[] = {-0.471342233,0.406662467,-0.3,0.25,-0.18,0.414554245,-0.329970496,0.300464941,-0.245331098,0.326201617,-0.268883885,0.247085176,-0.260431946,0.253758738,-0.07,0.104311742,-0.0972457403,0.236106458,-0.230207262,0.119667833,-0.181168112,0.165534201,-0.13,-0.1,0.146001801,0.187365551,-0.0809334415,0.0915021807,-0.197808712,-0.15,-0.219994213,0.174653647,-0.131106811,0.194498965,0.1,0.172245035,-0.174624177,0.175056576,-0.149723933,0.293603786,-0.31,0.227724287,-0.247815188,0.278231209,-0.15,0.290767364,-0.371329954,0.36,-0.34};\n        arr_to_vec(ccdx_arr, sizeof(ccdx_arr)/sizeof(double), ccdx);\n        \n        double posy_arr[] = {687,1384,2083,2769,3470,4168,4864,5569,6268,6971,7673,8384,9085,9792,10499,11207,11912,12623,13327,14040,14749,15460,16170,16890,17594,18303,19013,19723,20436,21141,21836,22583,23261,23977,24681,25415,26095,26804,27510,28209,28878,29609,30310,31010,31707,32404,33101,33793,34485};\n        arr_to_vec(posy_arr, sizeof(posy_arr)/sizeof(double), posy);\n        \n        double ccdy_arr[] = {0.33021674,-0.510332286,0.322879066,-0.506351785,0.532988964,-0.468325768,0.416633933,-0.291694647,0.319217952,-0.455454692,0.398153166,-0.239204978,0.383470053,-0.278574718,0.403614749,-0.34,0.346153912,-0.195547767,0.245805935,-0.36,0.234872778,-0.207773434,0.34,-0.0736518249,0.142476915,-0.131084283,0.210383644,-0.21,0.205289073,-0.17,0.19,-0.0540550958,0.127,0.13,0.185869231,-0.05,-0.226153494,0.1130555,-0.119997255,0.177305054,0.05,0.3,-0.348494401,0.223737041,-0.331650795,0.538082299,-0.471742139,0.590081627,-0.683604722};\n        arr_to_vec(ccdy_arr, sizeof(ccdy_arr)/sizeof(double), ccdy);\n      \n      \n      } else if (tdi == 16){\n        \n        double posx_arr[] = {6.9000000000000000e+02,1.3820000000000000e+03,2.0760000000000000e+03,2.7720000000000000e+03,3.4650000000000000e+03,4.1670000000000000e+03,4.8670000000000000e+03,5.5680000000000000e+03,6.2680000000000000e+03,6.9710000000000000e+03,7.6770000000000000e+03,8.3780000000000000e+03,9.0850000000000000e+03,9.7910000000000000e+03,1.0503000000000000e+04,1.1206000000000000e+04,1.1913000000000000e+04,1.2622000000000000e+04,1.3330000000000000e+04,1.4040000000000000e+04,1.4749000000000000e+04,1.5459000000000000e+04,1.6170000000000000e+04,1.6881000000000000e+04,1.7591000000000000e+04,1.8299000000000000e+04,1.9008000000000000e+04,1.9721000000000000e+04,2.0429000000000000e+04,2.1140000000000000e+04,2.1849000000000000e+04,2.2557000000000000e+04,2.3265000000000000e+04,2.3974000000000000e+04,2.4682000000000000e+04,2.5388000000000000e+04,2.6094000000000000e+04,2.6798000000000000e+04,2.7503000000000000e+04,2.8206000000000000e+04,2.8909000000000000e+04,2.9611000000000000e+04,3.0310000000000000e+04,3.1010000000000000e+04,3.1707000000000000e+04,3.2404000000000000e+04,3.3098000000000000e+04,3.3792000000000000e+04,3.4484000000000000e+04};\n        arr_to_vec(posx_arr, sizeof(posx_arr)/sizeof(double), posx);\n        \n        double ccdx_arr[] = {-3.6563699517936904e-01,3.2374257439446741e-01,-3.0665689416227304e-01,2.8779817609507674e-01,-1.4391974546538006e-01,2.5213647269676465e-01,-2.7431622419889917e-01,2.2048856906422215e-01,-2.6590706716919182e-01,1.9957802948970854e-01,-2.7095596052316773e-01,2.3435367631109566e-01,-2.5315591932358317e-01,1.9856962666552852e-01,-3.5920061119356986e-02,1.5980621898278752e-01,-1.6159921442794922e-01,1.9744720254044340e-01,-1.9378974298741097e-01,1.3105906502192419e-01,-1.5230954549604461e-01,1.7447700273627750e-01,-1.4295214614100249e-01,1.6062348332303306e-01,4.8050851400649242e-02,1.3750807699320705e-01,-7.3113271749859196e-02,7.1346049905560857e-02,-9.9108950389247746e-02,1.9229689329792210e-01,-1.7243313894497606e-01,1.7966640657714811e-01,-1.5356877017491991e-01,1.7351553213620843e-01,-1.0112703267223394e-01,1.6278473565663124e-01,-1.2930576980595232e-01,1.4836628451840536e-01,-2.0982163366775036e-01,2.6205776957416932e-01,-2.0192748468363880e-01,2.0991625990584037e-01,-2.3878054471338728e-01,3.2054730743521237e-01,-2.2902300508023066e-01,3.5625055719764054e-01,-3.2197370046832202e-01,3.8652575820766899e-01,-3.6059189451754942e-01};\n        arr_to_vec(ccdx_arr, sizeof(ccdx_arr)/sizeof(double), ccdx);\n        \n        double posy_arr[] ={6.9000000000000000e+02,1.3820000000000000e+03,2.0770000000000000e+03,2.7720000000000000e+03,3.4670000000000000e+03,4.1680000000000000e+03,4.8670000000000000e+03,5.5670000000000000e+03,6.2680000000000000e+03,6.9720000000000000e+03,7.6750000000000000e+03,8.3790000000000000e+03,9.0860000000000000e+03,9.7910000000000000e+03,1.0497000000000000e+04,1.1204000000000000e+04,1.1913000000000000e+04,1.2622000000000000e+04,1.3331000000000000e+04,1.4041000000000000e+04,1.4750000000000000e+04,1.5459000000000000e+04,1.6169000000000000e+04,1.6878000000000000e+04,1.7590000000000000e+04,1.8301000000000000e+04,1.9009000000000000e+04,1.9725000000000000e+04,2.0435000000000000e+04,2.1141000000000000e+04,2.1875000000000000e+04,2.2579000000000000e+04,2.3267000000000000e+04,2.3975000000000000e+04,2.4683000000000000e+04,2.5388000000000000e+04,2.6094000000000000e+04,2.6799000000000000e+04,2.7503000000000000e+04,2.8207000000000000e+04,2.8908000000000000e+04,2.9610000000000000e+04,3.0310000000000000e+04,3.1010000000000000e+04,3.1707000000000000e+04,3.2404000000000000e+04,3.3098000000000000e+04,3.3792000000000000e+04,3.4484000000000000e+04};\n        arr_to_vec(posy_arr, sizeof(posy_arr)/sizeof(double), posy);\n        \n        double ccdy_arr[] = {1.6682712498426239e-01,-1.8658497293945167e-01,1.8716800259901073e-01,-2.0080511706846771e-01,2.5776226096916355e-01,-1.8014397580283278e-01,2.3187602202653296e-01,-1.8888815612376539e-01,2.3825312684105868e-01,-1.9764347168914259e-01,2.1303867405775190e-01,-2.1864997247176085e-01,1.9060281719060299e-01,-2.1095297916034275e-01,2.1385786807211804e-01,-2.0243697148649251e-01,1.6808369230471218e-01,-1.8247654347570377e-01,1.6321496740677194e-01,-1.6534240035866782e-01,1.3358190259939087e-01,-1.3762340408262302e-01,1.2517965805100878e-01,-1.2516492091413561e-01,9.9679467259256083e-02,-8.5525125627462728e-02,7.0833977291224953e-02,-4.1071933536127661e-02,2.4648656550307783e-02,-6.2804188860494159e-02,-1.4575088847986997e-02,2.2637929246120417e-02,-5.1578725614456332e-02,3.1892413968958873e-02,-4.9620043941112163e-02,1.0853263900788856e-01,-1.3861588547237652e-01,1.5996598004665616e-01,-1.5596844034381802e-01,2.1230696422520279e-01,-2.2320393916806852e-01,2.4987976967881814e-01,-2.7165466145699768e-01,3.4162810522906795e-01,-2.9219664119329974e-01,3.7353398140209576e-01,-4.0425355608407010e-01,4.8807824720156195e-01,-4.9484352711504931e-01};\n        arr_to_vec(ccdy_arr, sizeof(ccdy_arr)/sizeof(double), ccdy);\n        \n      }else if (tdi == 32){\n        \n        double posx_arr[] = {6.9050000000000000e+02,1.3830000000000000e+03,2.0775000000000000e+03,2.7725000000000000e+03,3.4695000000000000e+03,4.1670000000000000e+03,4.8665000000000000e+03,5.5675000000000000e+03,6.2690000000000000e+03,6.9715000000000000e+03,7.6760000000000000e+03,8.3800000000000000e+03,9.0840000000000000e+03,9.7910000000000000e+03,1.0500000000000000e+04,1.1205000000000000e+04,1.1913500000000000e+04,1.2621500000000000e+04,1.3330500000000000e+04,1.4040000000000000e+04,1.4749500000000000e+04,1.5460500000000000e+04,1.6169500000000000e+04,1.6880000000000000e+04,1.7610000000000000e+04,1.8300500000000000e+04,1.9011000000000000e+04,1.9721000000000000e+04,2.0430500000000000e+04,2.1139500000000000e+04,2.1849000000000000e+04,2.2558000000000000e+04,2.3267000000000000e+04,2.3974000000000000e+04,2.4681500000000000e+04,2.5388000000000000e+04,2.6094000000000000e+04,2.6798500000000000e+04,2.7502500000000000e+04,2.8206500000000000e+04,2.8909500000000000e+04,2.9611000000000000e+04,3.0310500000000000e+04,3.1009000000000000e+04,3.1707000000000000e+04,3.2402500000000000e+04,3.3097500000000000e+04,3.3792000000000000e+04,3.4483000000000000e+04};\n        arr_to_vec(posx_arr, sizeof(posx_arr)/sizeof(double), posx);\n        \n        double ccdx_arr[] = {-4.1811326057304959e-01,4.0436492773618415e-01,-3.8874308492672749e-01,4.0319109386388913e-01,-2.0327103754554171e-01,3.6356001096171148e-01,-3.7765652249194748e-01,3.7329236241614483e-01,-3.7302405347673778e-01,3.4574137566161223e-01,-2.9179442912111209e-01,3.1284562913875691e-01,-2.7828282578299496e-01,3.0090163652936064e-01,-5.3931494662861360e-02,3.2946480423954322e-01,-3.2313106631976390e-01,2.3003129440224190e-01,-2.3202222584287224e-01,2.9234690769238858e-01,-2.5747661959347629e-01,2.6450356695147847e-01,-2.8755358957872401e-01,2.9324437626200378e-01,6.0839298404533892e-03,2.1002995323592552e-01,-2.1271467179468675e-01,2.4112648011153520e-01,-2.2923991816791242e-01,2.9696748336603973e-01,-2.7624265659087388e-01,2.7938818218620237e-01,-3.3947674252676047e-01,3.3579165778069131e-01,-2.5225719514600858e-01,3.0966256137775544e-01,-2.7309471282926978e-01,3.2397963446313971e-01,-3.8460087104211044e-01,3.6046929186990184e-01,-3.1279656600468553e-01,4.2412178858616717e-01,-4.3334390546529999e-01,4.4002898166945115e-01,-3.6492039414093347e-01,5.0437629078566248e-01,-5.1841469206586543e-01,5.8386079370471022e-01,-5.2279820127807264e-01};\n        arr_to_vec(ccdx_arr, sizeof(ccdx_arr)/sizeof(double), ccdx);\n        \n        double posy_arr[] ={6.9200000000000000e+02,1.4320000000000000e+03,2.2430000000000000e+03,2.8660000000000000e+03,3.3100000000000000e+03,4.3560000000000000e+03,4.7940000000000000e+03,5.7250000000000000e+03,6.0800000000000000e+03,6.9650000000000000e+03,7.6720000000000000e+03,8.3850000000000000e+03,9.0850000000000000e+03,9.7920000000000000e+03,1.0496000000000000e+04,1.1209000000000000e+04,1.1916000000000000e+04,1.2618000000000000e+04,1.3338000000000000e+04,1.4040000000000000e+04,1.4743000000000000e+04,1.5466000000000000e+04,1.6167000000000000e+04,1.6877000000000000e+04,1.7590000000000000e+04,1.8300000000000000e+04,1.9012000000000000e+04,1.9716000000000000e+04,2.0438000000000000e+04,2.1146000000000000e+04,2.1822000000000000e+04,2.2582000000000000e+04,2.3213000000000000e+04,2.4001000000000000e+04,2.4548000000000000e+04,2.5388000000000000e+04,2.6096000000000000e+04,2.6800000000000000e+04,2.7703000000000000e+04,2.8206000000000000e+04,2.8909000000000000e+04,2.9610000000000000e+04,3.0310000000000000e+04,3.1009000000000000e+04,3.1707000000000000e+04,3.2403000000000000e+04,3.3099000000000000e+04,3.3792000000000000e+04,3.4484000000000000e+04};\n        arr_to_vec(posy_arr, sizeof(posy_arr)/sizeof(double), posy);\n        \n        double ccdy_arr[] = {9.1817015907751640e-02,-7.4558880902590441e-02,1.0021750106569254e-01,-8.1255540914656865e-02,7.8758824849761530e-02,-6.5480982872218318e-02,4.9927752031917731e-02,-5.2293862125859278e-02,4.4319011950036923e-02,-7.0037937681126455e-02,5.5525684225796956e-02,-6.2678806301854101e-02,8.0150315988021165e-02,-7.7939607398843286e-02,9.0760334939195914e-02,-9.0941081179475858e-02,6.7621657629514137e-02,-5.2973098857163559e-02,2.9068364004368498e-02,-1.3508175778356052e-01,4.5802374906223992e-02,-4.9637495860299065e-02,7.1341710312362985e-02,-7.3468022284351439e-02,7.0095118508753287e-02,-4.6981720901255804e-02,3.4671327473436653e-02,-2.2220436013734590e-02,2.2689540013475777e-02,-4.3354894358314626e-02,-3.0374701550523554e-02,2.7394663867156926e-02,3.1546584927592602e-02,2.8535779885519252e-02,3.9224566635710702e-02,3.2352361968647471e-02,-8.3530325319985055e-02,7.3884253966537444e-02,-7.3927772892873569e-02,1.6861565469596540e-01,-8.8302634804034108e-02,1.9476882214716010e-01,-1.2955016456739019e-01,2.1302034574583958e-01,-1.3312539090262687e-01,2.5720164159618186e-01,-2.5450605018449951e-01,3.4096561624091770e-01,-3.2846345420828316e-01};\n        arr_to_vec(ccdy_arr, sizeof(ccdy_arr)/sizeof(double), ccdy);\n        \n      }else if (tdi == 48){\n        \n        double posx_arr[] = {6.9100000000000000e+02,1.3830000000000000e+03,2.0770000000000000e+03,2.7730000000000000e+03,3.4700000000000000e+03,4.1670000000000000e+03,4.8660000000000000e+03,5.5670000000000000e+03,6.2690000000000000e+03,6.9710000000000000e+03,7.6760000000000000e+03,8.3800000000000000e+03,9.0850000000000000e+03,9.7910000000000000e+03,1.0500000000000000e+04,1.1205000000000000e+04,1.1913000000000000e+04,1.2622000000000000e+04,1.3331000000000000e+04,1.4040000000000000e+04,1.4750000000000000e+04,1.5461000000000000e+04,1.6170000000000000e+04,1.6880000000000000e+04,1.7630000000000000e+04,1.8300000000000000e+04,1.9011000000000000e+04,1.9721000000000000e+04,2.0430000000000000e+04,2.1139000000000000e+04,2.1849000000000000e+04,2.2558000000000000e+04,2.3267000000000000e+04,2.3974000000000000e+04,2.4681000000000000e+04,2.5388000000000000e+04,2.6094000000000000e+04,2.6799000000000000e+04,2.7503000000000000e+04,2.8206000000000000e+04,2.8909000000000000e+04,2.9611000000000000e+04,3.0311000000000000e+04,3.1009000000000000e+04,3.1707000000000000e+04,3.2403000000000000e+04,3.3098000000000000e+04,3.3792000000000000e+04,3.4483000000000000e+04};\n        arr_to_vec(posx_arr, sizeof(posx_arr)/sizeof(double), posx);\n        \n        double ccdx_arr[] = {-4.6546030701871588e-01,4.5322843722843159e-01,-4.0296452694482243e-01,4.1375317620767021e-01,-2.1884454030157008e-01,4.0178523397638749e-01,-3.6332679385473488e-01,3.5953783051252153e-01,-3.8014084942129389e-01,3.9453325604620371e-01,-2.9709869865894628e-01,3.7473922390289083e-01,-3.0062461183492484e-01,3.0395467419563021e-01,-5.7425983876754835e-02,3.5281118763405150e-01,-3.4472928511635181e-01,2.5729409183696594e-01,-2.5691690705449804e-01,3.2359616781669703e-01,-2.8828974644382610e-01,2.9524281609515324e-01,-3.1441042180795142e-01,3.2034071055258856e-01,6.7291920416765877e-02,1.9955732934316811e-01,-2.2164206939038050e-01,2.5928245483629664e-01,-2.3914064499018456e-01,3.2419107244295431e-01,-2.6914359061569004e-01,2.7651431988616371e-01,-3.5056021281294547e-01,3.3840565896526742e-01,-2.5190825115141569e-01,3.1793136723382659e-01,-2.9296204094200112e-01,3.5558383872691207e-01,-3.8835466523822898e-01,3.5134711066501589e-01,-3.2703838102252242e-01,4.0137096582219123e-01,-4.5423154327610415e-01,4.4137629047096727e-01,-3.8940590013180354e-01,4.9347577423606981e-01,-5.2218936682038408e-01,5.8897172730483849e-01,-5.3589648467414785e-01};\n        arr_to_vec(ccdx_arr, sizeof(ccdx_arr)/sizeof(double), ccdx);\n        \n        double posy_arr[] ={6.9200000000000000e+02,1.4320000000000000e+03,2.2430000000000000e+03,2.8660000000000000e+03,3.3100000000000000e+03,4.3560000000000000e+03,4.7940000000000000e+03,5.7250000000000000e+03,6.0800000000000000e+03,6.9650000000000000e+03,7.6720000000000000e+03,8.3850000000000000e+03,9.0850000000000000e+03,9.7920000000000000e+03,1.0496000000000000e+04,1.1209000000000000e+04,1.1916000000000000e+04,1.2618000000000000e+04,1.3338000000000000e+04,1.4040000000000000e+04,1.4743000000000000e+04,1.5466000000000000e+04,1.6167000000000000e+04,1.6877000000000000e+04,1.7590000000000000e+04,1.8300000000000000e+04,1.9012000000000000e+04,1.9716000000000000e+04,2.0438000000000000e+04,2.1146000000000000e+04,2.1822000000000000e+04,2.2582000000000000e+04,2.3213000000000000e+04,2.4001000000000000e+04,2.4548000000000000e+04,2.5388000000000000e+04,2.6096000000000000e+04,2.6800000000000000e+04,2.7703000000000000e+04,2.8206000000000000e+04,2.8909000000000000e+04,2.9610000000000000e+04,3.0310000000000000e+04,3.1009000000000000e+04,3.1707000000000000e+04,3.2403000000000000e+04,3.3099000000000000e+04,3.3792000000000000e+04,3.4484000000000000e+04};\n        arr_to_vec(posy_arr, sizeof(posy_arr)/sizeof(double), posy);\n        \n        double ccdy_arr[] = {-9.1817015907751640e-02,7.4558880902590441e-02,-1.0021750106569254e-01,-8.1255540914656865e-02,-7.8758824849761530e-02,6.5480982872218318e-02,-4.9927752031917731e-02,-5.2293862125859278e-02,4.4319011950036923e-02,-7.0037937681126455e-02,5.5525684225796956e-02,-6.2678806301854101e-02,8.0150315988021165e-02,-7.7939607398843286e-02,9.0760334939195914e-02,-9.0941081179475858e-02,6.7621657629514137e-02,-5.2973098857163559e-02,2.9068364004368498e-02,-1.3508175778356052e-01,4.5802374906223992e-02,-4.9637495860299065e-02,7.1341710312362985e-02,-7.3468022284351439e-02,7.0095118508753287e-02,-4.6981720901255804e-02,3.4671327473436653e-02,-2.2220436013734590e-02,2.2689540013475777e-02,-4.3354894358314626e-02,-3.0374701550523554e-02,2.7394663867156926e-02,3.1546584927592602e-02,2.8535779885519252e-02,3.9224566635710702e-02,3.2352361968647471e-02,-8.3530325319985055e-02,7.3884253966537444e-02,-7.3927772892873569e-02,1.6861565469596540e-01,-8.8302634804034108e-02,1.9476882214716010e-01,-1.2955016456739019e-01,2.1302034574583958e-01,-1.3312539090262687e-01,2.5720164159618186e-01,-2.5450605018449951e-01,3.4096561624091770e-01,-3.2846345420828316e-01};\n        arr_to_vec(ccdy_arr, sizeof(ccdy_arr)/sizeof(double), ccdy);\n        \n      }else if (tdi == 56){\n        \n        double posx_arr[] = {6.9050000000000000e+02,1.3830000000000000e+03,2.0775000000000000e+03,2.7725000000000000e+03,3.4695000000000000e+03,4.1670000000000000e+03,4.8665000000000000e+03,5.5675000000000000e+03,6.2690000000000000e+03,6.9715000000000000e+03,7.6760000000000000e+03,8.3800000000000000e+03,9.0840000000000000e+03,9.7910000000000000e+03,1.0500000000000000e+04,1.1205000000000000e+04,1.1913500000000000e+04,1.2621500000000000e+04,1.3330500000000000e+04,1.4040000000000000e+04,1.4749500000000000e+04,1.5460500000000000e+04,1.6169500000000000e+04,1.6880000000000000e+04,1.7610000000000000e+04,1.8300500000000000e+04,1.9011000000000000e+04,1.9721000000000000e+04,2.0430500000000000e+04,2.1139500000000000e+04,2.1849000000000000e+04,2.2558000000000000e+04,2.3267000000000000e+04,2.3974000000000000e+04,2.4681500000000000e+04,2.5388000000000000e+04,2.6094000000000000e+04,2.6798500000000000e+04,2.7502500000000000e+04,2.8206500000000000e+04,2.8909500000000000e+04,2.9611000000000000e+04,3.0310500000000000e+04,3.1009000000000000e+04,3.1707000000000000e+04,3.2402500000000000e+04,3.3097500000000000e+04,3.3792000000000000e+04,3.4483000000000000e+04};\n        arr_to_vec(posx_arr, sizeof(posx_arr)/sizeof(double), posx);\n        \n        double ccdx_arr[] = {-4.1811326057304959e-01,4.0436492773618415e-01,-3.8874308492672749e-01,4.0319109386388913e-01,-2.0327103754554171e-01,3.6356001096171148e-01,-3.7765652249194748e-01,3.7329236241614483e-01,-3.7302405347673778e-01,3.4574137566161223e-01,-2.9179442912111209e-01,3.1284562913875691e-01,-2.7828282578299496e-01,3.0090163652936064e-01,-5.3931494662861360e-02,3.2946480423954322e-01,-3.2313106631976390e-01,2.3003129440224190e-01,-2.3202222584287224e-01,2.9234690769238858e-01,-2.5747661959347629e-01,2.6450356695147847e-01,-2.8755358957872401e-01,2.9324437626200378e-01,6.0839298404533892e-03,2.1002995323592552e-01,-2.1271467179468675e-01,2.4112648011153520e-01,-2.2923991816791242e-01,2.9696748336603973e-01,-2.7624265659087388e-01,2.7938818218620237e-01,-3.3947674252676047e-01,3.3579165778069131e-01,-2.5225719514600858e-01,3.0966256137775544e-01,-2.7309471282926978e-01,3.2397963446313971e-01,-3.8460087104211044e-01,3.6046929186990184e-01,-3.1279656600468553e-01,4.2412178858616717e-01,-4.3334390546529999e-01,4.4002898166945115e-01,-3.6492039414093347e-01,5.0437629078566248e-01,-5.1841469206586543e-01,5.8386079370471022e-01,-5.2279820127807264e-01};\n        arr_to_vec(ccdx_arr, sizeof(ccdx_arr)/sizeof(double), ccdx);\n        \n        double posy_arr[] ={6.9200000000000000e+02,1.4320000000000000e+03,2.2430000000000000e+03,2.8660000000000000e+03,3.3100000000000000e+03,4.3560000000000000e+03,4.7940000000000000e+03,5.7250000000000000e+03,6.0800000000000000e+03,6.9650000000000000e+03,7.6720000000000000e+03,8.3850000000000000e+03,9.0850000000000000e+03,9.7920000000000000e+03,1.0496000000000000e+04,1.1209000000000000e+04,1.1916000000000000e+04,1.2618000000000000e+04,1.3338000000000000e+04,1.4040000000000000e+04,1.4743000000000000e+04,1.5466000000000000e+04,1.6167000000000000e+04,1.6877000000000000e+04,1.7590000000000000e+04,1.8300000000000000e+04,1.9012000000000000e+04,1.9716000000000000e+04,2.0438000000000000e+04,2.1146000000000000e+04,2.1822000000000000e+04,2.2582000000000000e+04,2.3213000000000000e+04,2.4001000000000000e+04,2.4548000000000000e+04,2.5388000000000000e+04,2.6096000000000000e+04,2.6800000000000000e+04,2.7703000000000000e+04,2.8206000000000000e+04,2.8909000000000000e+04,2.9610000000000000e+04,3.0310000000000000e+04,3.1009000000000000e+04,3.1707000000000000e+04,3.2403000000000000e+04,3.3099000000000000e+04,3.3792000000000000e+04,3.4484000000000000e+04};\n        arr_to_vec(posy_arr, sizeof(posy_arr)/sizeof(double), posy);\n        \n        double ccdy_arr[] = {9.1817015907751640e-02,-7.4558880902590441e-02,1.0021750106569254e-01,-8.1255540914656865e-02,7.8758824849761530e-02,-6.5480982872218318e-02,4.9927752031917731e-02,-5.2293862125859278e-02,4.4319011950036923e-02,-7.0037937681126455e-02,5.5525684225796956e-02,-6.2678806301854101e-02,8.0150315988021165e-02,-7.7939607398843286e-02,9.0760334939195914e-02,-9.0941081179475858e-02,6.7621657629514137e-02,-5.2973098857163559e-02,2.9068364004368498e-02,-1.3508175778356052e-01,4.5802374906223992e-02,-4.9637495860299065e-02,7.1341710312362985e-02,-7.3468022284351439e-02,7.0095118508753287e-02,-4.6981720901255804e-02,3.4671327473436653e-02,-2.2220436013734590e-02,2.2689540013475777e-02,-4.3354894358314626e-02,-3.0374701550523554e-02,2.7394663867156926e-02,3.1546584927592602e-02,2.8535779885519252e-02,3.9224566635710702e-02,3.2352361968647471e-02,-8.3530325319985055e-02,7.3884253966537444e-02,-7.3927772892873569e-02,1.6861565469596540e-01,-8.8302634804034108e-02,1.9476882214716010e-01,-1.2955016456739019e-01,2.1302034574583958e-01,-1.3312539090262687e-01,2.5720164159618186e-01,-2.5450605018449951e-01,3.4096561624091770e-01,-3.2846345420828316e-01};\n        arr_to_vec(ccdy_arr, sizeof(ccdy_arr)/sizeof(double), ccdy);\n        \n      }else if (tdi == 64){\n        \n        double posx_arr[] = {6.9000000000000000e+02,1.3830000000000000e+03,2.0780000000000000e+03,2.7720000000000000e+03,3.4690000000000000e+03,4.1670000000000000e+03,4.8670000000000000e+03,5.5680000000000000e+03,6.2690000000000000e+03,6.9720000000000000e+03,7.6760000000000000e+03,8.3800000000000000e+03,9.0830000000000000e+03,9.7910000000000000e+03,1.0500000000000000e+04,1.1205000000000000e+04,1.1914000000000000e+04,1.2621000000000000e+04,1.3330000000000000e+04,1.4040000000000000e+04,1.4749000000000000e+04,1.5460000000000000e+04,1.6169000000000000e+04,1.6880000000000000e+04,1.7590000000000000e+04,1.8301000000000000e+04,1.9011000000000000e+04,1.9721000000000000e+04,2.0431000000000000e+04,2.1140000000000000e+04,2.1849000000000000e+04,2.2558000000000000e+04,2.3267000000000000e+04,2.3974000000000000e+04,2.4682000000000000e+04,2.5388000000000000e+04,2.6094000000000000e+04,2.6798000000000000e+04,2.7502000000000000e+04,2.8207000000000000e+04,2.8910000000000000e+04,2.9611000000000000e+04,3.0310000000000000e+04,3.1009000000000000e+04,3.1707000000000000e+04,3.2402000000000000e+04,3.3097000000000000e+04,3.3792000000000000e+04,3.4483000000000000e+04};\n        arr_to_vec(posx_arr, sizeof(posx_arr)/sizeof(double), posx);\n        \n        double ccdx_arr[] = {-3.7076621412738331e-01,3.5550141824393666e-01,-3.7452164290863260e-01,3.9262901152010804e-01,-1.8769753478951337e-01,3.2533478794703546e-01,-3.9198625112916013e-01,3.8704689431976808e-01,-3.6590725753218167e-01,2.9694949527702069e-01,-2.8649015958327789e-01,2.5095203437462293e-01,-2.5594103973106508e-01,2.9784859886309106e-01,-5.0437005448967877e-02,3.0611842084503493e-01,-3.0153284752317600e-01,2.0276849696751786e-01,-2.0712754463124641e-01,2.6109764756808007e-01,-2.2666349274312650e-01,2.3376431780780377e-01,-2.6069675734949660e-01,2.6614804197141900e-01,-5.5124060735859098e-02,2.2050257712868293e-01,-2.0378727419899301e-01,2.2297050538677374e-01,-2.1933919134564028e-01,2.6974389428912521e-01,-2.8334172256605766e-01,2.8226204448624104e-01,-3.2839327224057546e-01,3.3317765659611515e-01,-2.5260613914060148e-01,3.0139375552168429e-01,-2.5322738471653850e-01,2.9237543019936735e-01,-3.8084707684599189e-01,3.6959147307478779e-01,-2.9855475098684858e-01,4.4687261135014311e-01,-4.1245626765449583e-01,4.3868167286793502e-01,-3.4043488815006340e-01,5.1527680733525516e-01,-5.1464001731134690e-01,5.7874986010458207e-01,-5.0969991788199742e-01};\n        arr_to_vec(ccdx_arr, sizeof(ccdx_arr)/sizeof(double), ccdx);\n        \n        double posy_arr[] ={6.9100000000000000e+02,1.3840000000000000e+03,2.0760000000000000e+03,2.7740000000000000e+03,3.3350000000000000e+03,4.1650000000000000e+03,4.8680000000000000e+03,5.5660000000000000e+03,6.2730000000000000e+03,6.8570000000000000e+03,7.5250000000000000e+03,8.3060000000000000e+03,9.0490000000000000e+03,9.9610000000000000e+03,1.0499000000000000e+04,1.1204000000000000e+04,1.1913000000000000e+04,1.2624000000000000e+04,1.3332000000000000e+04,1.4042000000000000e+04,1.4750000000000000e+04,1.5460000000000000e+04,1.6171000000000000e+04,1.6881000000000000e+04,1.7591000000000000e+04,1.8301000000000000e+04,1.9011000000000000e+04,1.9724000000000000e+04,2.0427000000000000e+04,2.1140000000000000e+04,2.1952000000000000e+04,2.2429000000000000e+04,2.3267000000000000e+04,2.3978000000000000e+04,2.4676000000000000e+04,2.5386000000000000e+04,2.6095000000000000e+04,2.6797000000000000e+04,2.7501000000000000e+04,2.8207000000000000e+04,2.8907000000000000e+04,2.9611000000000000e+04,3.0310000000000000e+04,3.1009000000000000e+04,3.1707000000000000e+04,3.2403000000000000e+04,3.3100000000000000e+04,3.3792000000000000e+04,3.4484000000000000e+04};\n        arr_to_vec(posy_arr, sizeof(posy_arr)/sizeof(double), posy);\n        \n        // There was not enough good data to reliably estimate ccdy\n        // offsets. Some faint CCD artifacts are still visible after\n        // correction. Need to revisit this case when more data is\n        // available.\n        ccdy = std::vector<double>(posy.size(), 0);\n      }\n    }\n  }\n  \n  std::string wv = \"WV01\";\n  if (!is_wv01) wv = \"WV02\";\n  if (posx.empty()){\n    vw_out(WarningMessage)\n      << \"wv_correct: Corrections not implemented for camera model \"\n      << wv << \" for TDI \" << tdi << \". A copy of the input image will be created.\"\n      << std::endl;\n  }\n}\n\n// Apply WorldView corrections to each vertical block as high as the image\n// corresponding to one CCD sensor.\ntemplate <class ImageT>\nclass WVPerBlockCorrectView: public ImageViewBase<WVPerBlockCorrectView<ImageT>>{\n  ImageT m_img;\n  int m_tdi;\n  bool m_is_wv01, m_is_forward, m_no_correction;\n  double m_pitch_ratio;\n  std::vector<double> m_posx, m_ccdx, m_posy, m_ccdy;\n  \n  typedef typename ImageT::pixel_type PixelT;\n\npublic:\n  WVPerBlockCorrectView(ImageT const& img, int tdi, bool is_wv01, bool is_forward,\n    bool no_correction, double pitch_ratio):\n    m_img(img), m_tdi(tdi), m_is_wv01(is_wv01), m_is_forward(is_forward),\n    m_no_correction(no_correction), m_pitch_ratio(pitch_ratio) {\n    \n    // Ensure these variables are clean\n    m_posx.clear(); m_ccdx.clear(); m_posy.clear(); m_ccdy.clear();\n    \n    if (!m_no_correction)\n      get_offsets(m_tdi, m_is_wv01, m_is_forward,  \n                  m_posx, m_ccdx, m_posy, m_ccdy);\n\n    // Compensate for the variable pitch ratio\n    for (int i = 0; i < (int)m_posx.size(); i++) m_posx[i] *= m_pitch_ratio;\n    for (int i = 0; i < (int)m_posy.size(); i++) m_posy[i] *= m_pitch_ratio;\n    \n    VW_ASSERT(m_posx.size() == m_ccdx.size() &&\n              m_posy.size() == m_ccdy.size(),\n              ArgumentErr() << \"wv_correct: Expecting the arrays of positions \"\n              << \"and offsets to have the same sizes.\");\n  }\n  \n  typedef PixelT pixel_type;\n  typedef PixelT result_type;\n  typedef ProceduralPixelAccessor<WVPerBlockCorrectView> pixel_accessor;\n\n  inline int32 cols() const { return m_img.cols(); }\n  inline int32 rows() const { return m_img.rows(); }\n  inline int32 planes() const { return 1; }\n\n  inline pixel_accessor origin() const { return pixel_accessor(*this, 0, 0); }\n\n  inline pixel_type operator()( double/*i*/, double/*j*/, int32/*p*/ = 0 ) const {\n    vw_throw(NoImplErr() << \"WVPerBlockCorrectView::operator()(...) is not implemented\");\n    return pixel_type();\n  }\n\n  typedef CropView<ImageView<pixel_type> > prerasterize_type;\n  inline prerasterize_type prerasterize(BBox2i const& bbox) const {\n\n    // Need to see a bit more of the input image for the purpose\n    // of interpolation.\n    int max_offset = 5; // CCD offsets are always under 1 pix\n    int bias = BilinearInterpolation::pixel_buffer + max_offset;\n    BBox2i biased_box = bbox;\n    biased_box.expand(bias);\n    biased_box.crop(bounding_box(m_img));\n    \n    ImageView<result_type> cropped_img = crop(m_img, biased_box);\n    InterpolationView<EdgeExtensionView< ImageView<result_type>,\n      ConstantEdgeExtension >, BilinearInterpolation> interp_img\n      = interpolate(cropped_img, BilinearInterpolation(),\n                    ConstantEdgeExtension());\n\n    ImageView<result_type> tile(bbox.width(), bbox.height());\n    for (int col = bbox.min().x(); col < bbox.max().x(); col++){\n\n      // Accumulate the corrections up to the current column\n      double valx = 0, valy = 0;\n      if (m_ccdx.size() > 0){\n        valx = 0.0;\n        for (std::size_t t = 0; t < m_ccdx.size(); t++){\n          if (m_posx[t] < col){\n            valx -= m_ccdx[t];\n          }\n        }\n        valy = 0.0;\n        for (std::size_t t = 0; t < m_ccdy.size(); t++){\n          if (m_posy[t] < col){\n            valy -= m_ccdy[t];\n          }\n        }\n      }\n      \n      for (int row = bbox.min().y(); row < bbox.max().y(); row++){\n        tile(col - bbox.min().x(), row - bbox.min().y() )\n          = interp_img(col - biased_box.min().x() + valx,\n                       row - biased_box.min().y() + valy);\n      }\n    }\n    \n    return prerasterize_type(tile, -bbox.min().x(), -bbox.min().y(),\n                             cols(), rows() );\n  }\n\n  template <class DestT>\n  inline void rasterize(DestT const& dest, BBox2i bbox) const {\n    vw::rasterize(prerasterize(bbox), dest, bbox);\n  }\n};\ntemplate <class ImageT>\nWVPerBlockCorrectView<ImageT> wv_correct(ImageT const& img,\n                                 int tdi, bool is_wv01, bool is_forward, bool no_correction,\n                                 double pitch_ratio){\n  return WVPerBlockCorrectView<ImageT>(img, tdi, is_wv01, is_forward, no_correction,\n                                       pitch_ratio);\n}\n\n// Apply WorldView corrections to each column individually. This is more precise\n// but works only for some select World View-3 multispectral images.\ntemplate <class ImageT>\nclass WVPerColumnCorrectView: public ImageViewBase< WVPerColumnCorrectView<ImageT> >{\n  ImageT m_img;\n  std::vector<double> m_dx, m_dy;\n  typedef typename ImageT::pixel_type PixelT;\n\npublic:\n  WVPerColumnCorrectView(ImageT const& img,\n                         std::vector<double> const& dx,\n                         std::vector<double> const& dy):\n    m_img(img), m_dx(dx), m_dy(dy){\n\n    if (m_dx.size() != m_dy.size()) {\n      vw_throw( ArgumentErr() << \"The x and y corrections must have the same dimensions.\\n\" );\n    }\n\n    // Add more zeros if the corrections are too short.\n    // This is needed because different WV images can have\n    // different widths.\n    // TODO(oalexan1): This is not safe long-term.\n    while (m_dx.size() < m_img.cols()) \n      m_dx.push_back(0);\n    while (m_dy.size() < m_img.cols()) \n      m_dy.push_back(0);\n    \n    if (m_img.cols() != m_dx.size() || m_img.cols() != m_dy.size()) {\n      // vw_throw( ArgumentErr() << \"Expecting as many corrections as columns.\\n\" );\n    }\n\n  }\n  \n  typedef PixelT pixel_type;\n  typedef PixelT result_type;\n  typedef ProceduralPixelAccessor<WVPerColumnCorrectView> pixel_accessor;\n\n  inline int32 cols() const { return m_img.cols(); }\n  inline int32 rows() const { return m_img.rows(); }\n  inline int32 planes() const { return 1; }\n\n  inline pixel_accessor origin() const { return pixel_accessor( *this, 0, 0 ); }\n\n  inline pixel_type operator()( double/*i*/, double/*j*/, int32/*p*/ = 0 ) const {\n    vw_throw(NoImplErr() << \"WVPerColumnCorrectView::operator()(...) is not implemented\");\n    return pixel_type();\n  }\n\n  typedef CropView<ImageView<pixel_type> > prerasterize_type;\n  inline prerasterize_type prerasterize(BBox2i const& bbox) const {\n    // Need to see a bit more of the input image for the purpose\n    // of interpolation.\n    int max_offset = 5; // CCD offsets are always under 1 pix\n    int bias = BilinearInterpolation::pixel_buffer + max_offset;\n    BBox2i biased_box = bbox;\n    biased_box.expand(bias);\n    biased_box.crop(bounding_box(m_img));\n    \n    ImageView<result_type> cropped_img = crop(m_img, biased_box);\n    InterpolationView<EdgeExtensionView< ImageView<result_type>,\n      ConstantEdgeExtension >, BilinearInterpolation> interp_img\n      = interpolate(cropped_img, BilinearInterpolation(),\n                    ConstantEdgeExtension());\n\n    \n    ImageView<result_type> tile(bbox.width(), bbox.height());\n\n    for (int col = bbox.min().x(); col < bbox.max().x(); col++) {\n      for (int row = bbox.min().y(); row < bbox.max().y(); row++) {\n        // Note that the same correction is used for an entire column\n        tile(col - bbox.min().x(), row - bbox.min().y() )\n          = interp_img(col - biased_box.min().x() - m_dx[col],\n                       row - biased_box.min().y() - m_dy[col]);\n      }\n    }\n\n    return prerasterize_type(tile, -bbox.min().x(), -bbox.min().y(),\n                             cols(), rows() );\n  }\n\n  template <class DestT>\n  inline void rasterize(DestT const& dest, BBox2i bbox) const {\n    vw::rasterize(prerasterize(bbox), dest, bbox);\n  }\n};\ntemplate <class ImageT>\nWVPerColumnCorrectView<ImageT> wv_correct(ImageT const& img,\n                                          std::vector<double> const& dx,\n                                          std::vector<double> const& dy){\n  return WVPerColumnCorrectView<ImageT>(img, dx, dy);\n}\n\nint main(int argc, char *argv[]) {\n\n  Options opt;\n  try {\n    handle_arguments(argc, argv, opt);\n\n    GeometricXML geo;\n    AttitudeXML att;\n    EphemerisXML eph;\n    ImageXML img;\n    RPCXML rpc;\n    std::string scan_dir, sat_id, band_id;\n    double det_pitch = 0.0;\n    int tdi = 0;\n\n    // Use per-column corrections (most recent) or per block of columns\n    // corrections, which is coarser-grained (the older approach).\n    bool per_column_correction = false;\n    \n    // If true, do not apply any corrections\n    bool no_correction = false;\n    \n    try{\n      XMLPlatformUtils::Initialize();\n      read_xml(opt.camera_file, geo, att, eph, img, rpc);\n      \n      scan_dir = boost::to_lower_copy(img.scan_direction);\n      if (scan_dir != \"forward\" && scan_dir != \"reverse\")\n        vw_throw( ArgumentErr() << \"XML file \\\"\" << opt.camera_file\n                  << \"\\\" is lacking a valid image scan direction.\\n\" );\n\n      // Read XML parameters and sanity checks\n      sat_id = img.sat_id;\n      band_id = img.band_id;\n\n      if (band_id == \"P\") {\n        tdi = img.tdi;\n        if (opt.dx != \"\" || opt.dy != \"\") \n          per_column_correction = true;\n      } else if (band_id == \"Multi\") {\n        per_column_correction = true;\n        if (img.tdi_multi.size() != 8) \n          vw_throw( ArgumentErr() << \"Expecting 8 TDI values, one per multispectral band.\\n\" );\n      }\n      \n      // For WV2 data generated on May 26, 2022 or later a new calibration scheme\n      // is used, which makes wv_correct unnecessary. \n      if (sat_id == \"WV02\" && img.generation_time >= \"2022-05-26\") {\n        vw_out() << \"WARNING: wv_correct is not needed for WV02 data with generation time of \"\n        << \"2022-05-26 or later. The vendor processing method changed starting with that \"\n        << \"date, so applying the corrections will make the results worse. Will write \" \n        << \"a copy of the original uncorrected image.\\n\";\n        no_correction = true;\n        per_column_correction = false;\n      }\n\n      det_pitch = geo.detector_pixel_pitch;\n      if (det_pitch <= 0.0)\n        vw_throw( ArgumentErr() << \"XML file \\\"\" << opt.camera_file\n                  << \"\\\" has a non-positive pixel pitch.\\n\" );\n\n      \n    } catch ( const std::exception& e ) {                \n      vw_throw( ArgumentErr() << e.what() );\n    }\n\n    if (sat_id != \"WV01\" && sat_id != \"WV02\" && sat_id != \"WV03\") \n      vw_throw(ArgumentErr() << \"Only WV01, WV02, and WV03 satellites are supported.\\n\");\n    \n    if ( (opt.dx != \"\" && opt.dy == \"\") || (opt.dx == \"\" && opt.dy != \"\") )\n      vw_throw( ArgumentErr() << \"Only one of --dx and --dy was specified.\" );\n              \n    bool is_wv01 = (sat_id == \"WV01\");\n    bool is_forward = (scan_dir == \"forward\");\n\n    // Adjust for detector pitch\n    double pitch_ratio = 8.0e-3/det_pitch;\n\n    int num_bands = vw::get_num_channels(opt.image_file);\n    if (num_bands != 1) \n      vw_throw( ArgumentErr() << \"Unsupported image with \" << num_bands\n                << \" bands. Use gdal_translate to pick the desired band.\\n\\n\");\n    \n    DiskImageView<float> input_img(opt.image_file);\n    if (input_img.planes() != 1) \n      vw_throw( ArgumentErr() << \"Only single-band images are supported. \"\n                << \"For multispectral data, please extract first the desired \"\n                << \"band using gdal_translate per the documentation.\\n\");\n    \n    bool has_nodata = false;\n    double nodata = std::numeric_limits<double>::quiet_NaN();\n    boost::shared_ptr<DiskImageResource> img_rsrc\n      ( new DiskImageResourceGDAL(opt.image_file) );\n    if (img_rsrc->has_nodata_read()){\n      has_nodata = true;\n      nodata = img_rsrc->nodata_read();\n    }\n\n    vw::cartography::GeoReference georef;\n    bool has_georef = false;\n    \n    ImageViewRef<float> corr_img;\n    std::vector<double> dx, dy;\n    if ((!per_column_correction) || no_correction) {\n      // Per block correction or no correction\n      if (has_nodata) \n        corr_img = apply_mask(wv_correct(create_mask(input_img, nodata),\n                                         tdi, is_wv01, is_forward, no_correction,\n                                         pitch_ratio), nodata);\n      else\n        corr_img = wv_correct(input_img, tdi, is_wv01, is_forward, no_correction,\n                              pitch_ratio);\n    } else {\n      // Per column correction\n      \n      if (band_id != \"Multi\" && (opt.dx == \"\" || opt.dy == \"\")) \n        vw_throw( ArgumentErr() << \"Per column corrections were not specified.\\n\" );\n      \n      if (band_id == \"Multi\" && (opt.dx == \"\" || opt.dy == \"\")) {\n        \n        if (opt.band <= 0 || opt.band > 8) \n          vw_throw( ArgumentErr() << \"For multispectral images, the band must \"\n                    << \"be between 1 and 8.\\n\" );\n        \n        tdi = img.tdi_multi[opt.band - 1];\n        parse_ms_correction_table(sat_id, opt.band, tdi, scan_dir,\n                                  // outputs\n                                  dx, dy);\n        \n        \n        if (dx.size() == 0 || dy.size() == 0)\n          vw_out(WarningMessage)\n            << \"wv_correct: Corrections not implemented for satellite \"\n            << sat_id << \" for TDI \" << tdi << \", band \" << opt.band << \", \"\n            << \"and scan direction \" << scan_dir << \".\"\n            << \" A copy of the input image will be created.\" << std::endl;\n        \n      } else {\n        vw_out() << \"Reading per column corrections from: \"\n                  << opt.dx << ' ' << opt.dy << std::endl;\n        asp::read_vec(opt.dx, dx);\n        asp::read_vec(opt.dy, dy);\n      }\n      \n      if (opt.print_per_column_corrections) {\n        vw_out() << \"Printing the x and y corrections as two columns.\" << std::endl;\n        vw_out().precision(17);\n        for (std::size_t it = 0; it < dx.size(); it++) {\n          vw_out() << dx[it] << ' ' << dy[it] << std::endl;\n        }\n      }\n      \n      if (has_nodata) \n        corr_img = apply_mask(wv_correct(create_mask(input_img, nodata), dx, dy), nodata);\n      else\n        corr_img = wv_correct(input_img, dx, dy);\n    }\n    \n    vw_out() << \"Writing: \" << opt.output_image << std::endl;\n    TerminalProgressCallback tpc(\"asp\", \"\\t--> \");\n    if (opt.output_type == \"Float32\") \n      vw::cartography::block_write_gdal_image(opt.output_image, corr_img,\n                                              has_georef, georef, has_nodata, nodata, opt, tpc);\n    else if (opt.output_type == \"Byte\") \n      vw::cartography::block_write_gdal_image(opt.output_image,\n\t\t\t\t\t      per_pixel_filter(corr_img,\n\t\t\t\t\t\t\t       RoundAndClamp<uint8, float>()),\n\t\t\t\t\t      has_georef, georef, has_nodata,\n                                              vw::round_and_clamp<uint8>(nodata),\n                                              opt, tpc);\n    else if (opt.output_type == \"UInt16\") \n      vw::cartography::block_write_gdal_image(opt.output_image,\n\t\t\t\t\t      per_pixel_filter(corr_img,\n\t\t\t\t\t\t\t       RoundAndClamp<uint16, float>()),\n                                              has_georef, georef, has_nodata,\n                                              vw::round_and_clamp<uint16>(nodata),\n                                              opt, tpc);\n    else if (opt.output_type == \"Int16\") \n      vw::cartography::block_write_gdal_image(opt.output_image,\n\t\t\t\t\t      per_pixel_filter(corr_img,\n\t\t\t\t\t\t\t       RoundAndClamp<int16, float>()),\n                                              has_georef, georef, has_nodata,\n                                              vw::round_and_clamp<int16>(nodata),\n                                              opt, tpc);\n\n    else if (opt.output_type == \"UInt32\") \n      vw::cartography::block_write_gdal_image(opt.output_image,\n\t\t\t\t\t      per_pixel_filter(corr_img,\n\t\t\t\t\t\t\t       RoundAndClamp<uint32, float>()),\n                                              has_georef, georef, has_nodata,\n                                              vw::round_and_clamp<uint32>(nodata),\n                                              opt, tpc);\n    else if (opt.output_type == \"Int32\") \n      vw::cartography::block_write_gdal_image(opt.output_image,\n\t\t\t\t\t      per_pixel_filter(corr_img,\n\t\t\t\t\t\t\t       RoundAndClamp<int32, float>()),\n                                              has_georef, georef, has_nodata,\n                                              vw::round_and_clamp<int32>(nodata),\n                                              opt, tpc);\n    else\n      vw_throw( NoImplErr() << \"Unsupported output type: \" << opt.output_type << \".\\n\" );\n    \n    \n  } ASP_STANDARD_CATCHES;\n  \n  return 0;\n}\n"
  },
  {
    "path": "src/asp/Tools/xyzi2csv.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n/// \\file xyzi2csv.cc\n///\n// Convert a binary file in xyzi format to csv as lon,lat,\n// height_above_datum_meters. Input data format: binary double\n// precision floating point table with 4 columns: X, Y, Z, RDRid where\n// X,Y,Z are the polar stereographic coordinates (in km) and RDRid is\n// the LOLA RDR ID for each point with the format: YYDOYHHMM.\n\n#include <asp/Core/Macros.h>\n#include <asp/Core/AspProgramOptions.h>\n\n#include <vw/FileIO/FileUtils.h>\n\nnamespace po = boost::program_options;\nnamespace fs = boost::filesystem;\n\nusing namespace vw;\n\nstruct Options : public vw::GdalWriteOptions {\n  std::string xyzi, dem, csv;\n};\n    \nvoid handle_arguments(int argc, char *argv[], Options& opt) {\n\n  po::options_description general_options(\"\");\n  general_options.add_options()\n    (\"xyzi\",  po::value(&opt.xyzi), \"Input xyzi file.\")\n    (\"dem\",  po::value(&opt.dem), \"DEM from which to read the projection used for xyzi.\")\n    (\"csv\",  po::value(&opt.csv), \"Output csv file.\")\n    ;\n    \n  general_options.add(vw::GdalWriteOptionsDescription(opt));\n    \n  po::options_description positional(\"\");\n  \n  po::positional_options_description positional_desc;\n\n  std::string usage(\"[options]\");\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line(argc, argv, opt, general_options, general_options,\n                            positional, positional_desc, usage,\n                            allow_unregistered, unregistered);\n\n  if (opt.xyzi == \"\")\n    vw_throw(ArgumentErr() << \"Must specify the input xyzi file.\\n\");\n    \n  if (opt.dem == \"\")\n    vw_throw(ArgumentErr() << \"Must specify the input DEM file.\\n\");\n\n  if (opt.csv == \"\") \n    vw_throw(ArgumentErr() << \"Must specify the output csv file.\\n\");\n\n  // Create the output directory\n  vw::create_out_dir(opt.csv);\n\n  return;\n}\n\nvoid run_xyzi2csv(int argc, char* argv[]) {\n\n  // Parse arguments and perform validation\n  Options opt;\n  handle_arguments(argc, argv, opt);\n\n  vw::cartography::GeoReference georef;\n  bool has_georef = vw::cartography::read_georeference(georef, opt.dem);\n  if (!has_georef)\n    vw_throw(ArgumentErr() << \"There is no georeference information in: \"\n              << opt.dem << \".\\n\");\n\n  std::cout.precision(17);\n  // Read the binary file\n  std::ifstream ifs(opt.xyzi, std::ios::binary);\n\n  vw_out() << \"Writing: \" << opt.csv << \"\\n\";\n  std::ofstream ofs(opt.csv);\n  ofs.precision(17);\n  \n  double v[4];\n  while (1) {\n    ifs.read(reinterpret_cast<char*>(&v[0]), 4 * sizeof(double));\n    if (!ifs)\n      break;\n    \n    Vector2 lonlat = georef.point_to_lonlat(Vector2(v[0] * 1000.0, v[1] * 1000.0));\n    ofs << lonlat[0] << \", \" << lonlat[1] << \", \" << 1000.0 * v[2] << \"\\n\";\n  } \n    \n}\n\nint main(int argc, char* argv[]) {\n\n  try {\n    run_xyzi2csv(argc, argv);\n    \n  } ASP_STANDARD_CATCHES;\n\n  return 0;\n}\n"
  },
  {
    "path": "src/asp/WVCorrect/CMakeLists.txt",
    "content": "add_executable(disp_avg disp_avg.cc)\ntarget_link_libraries(disp_avg AspCore AspSessions)\ninstall(TARGETS disp_avg DESTINATION bin)\n\n"
  },
  {
    "path": "src/asp/WVCorrect/README_MULTISPECTRAL",
    "content": "# Overview\n\nThis document describes how to tabulate subpixel corrections to apply\nto Digital Globe multispectral images to reduce the CCD artifacts in\nthese images. \n\nSee README_PAN for the case of PAN images, and see the manual page of\nwv_correct which shows how these corrections are applied. \n\nSo far, corrections have been tabulated only for a very small number\nof possible scenarios.\n\nDigital Globe has several satellites, for example WorldView-1 to\n4. Each satellite collected multispectral data either in the forward\nor reverse scan direction. For each of these, data is accumulated with\na certain TDI (time-delay integration), and has 8 bands.\n\nA separate correction is needed for each satellite, scan direction,\nTDI, and band, which results in a lot of cases to consider. It is\nsuggested to have several datasets for each case, process them\nindividually, compare them, and average them.\n\nThis tool does not correct jitter or other high-frequency artifacts.\n\n# Preliminaries\n\nCheckout the ASP source code. Below we will assume it is in \n  \n  $HOME/StereoPipeline\n\nGet a binary version of ASP and prepended the path to its ``bin`` directory\nto PATH.\n\nCreate a conda environment having numpy, gdal, and matplotlib. Ensure that\nwhen running python the version provided by this environment is invoked.\n\n# Computing the corrections\n\nGiven a PAN image and camera, p.tif and p.xml, and an 8-band\nmultispectral image and camera, ms.tif and ms.xml, the first step is\nto apply the CCD artifact correction to the PAN image, which can go as\nfollows:\n\n  gdal_translate -co TILED=YES -co COMPRESS=LZW -co BIGTIFF=IF_SAFER \\\n    p.tif p_block.tif\n  wv_correct p_block.tif p.xml p_corr.tif\n\nHere, the first step rewrites the image to store it in small blocks\n(tiles) to speed up wv_correct.\n\nNext, the corrected PAN image is used as reference, the disparity from\nthe PAN image rescaled by a factor of 4 to a given band of the\nmultispectral image, every column of this disparity is averaged,\nproducing two arrays of corrections of whose length is the image width\n(one array for the x component of the disparity and one for the y\ncomponent).\n\nThis is accomplished as follows:\n\n  band=3\n  crop_win=\"0 0 100000 100000\"\n  ASP_PATH=$HOME/StereoPipeline \n  $ASP_PATH/src/asp/WVCorrect/ms_ccd_solve.sh \\\n    p_corr.tif m.tif p.xml m.xml $band run/run \"$crop_win\"\n\nHere we desire to tabulate band 3 (Green), the crop window was chosen\nbig enough to contain the whole image (smaller windows may be useful\nfor testing), and we invoked a script from ASP's source directory,\nwhich will in turn call some other scripts from that directory as well\nas ASP binaries.\n\nThe result of this script will be the averaged disparities:\n\n   run/run-avg-dx.txt\n   run/run-avg-dy.txt\n\nand the corrections computed based on these disparities:\n\n  run/run-corr-dx.txt\n  run/run-corr-dy.txt\n\nThe latter can be plotted as follows:\n\n  python $ASP_PATH/src/asp/WVCorrect/ccd_process.py --plot-only \\\n    run/run-corr-dx.txt\n\n(The dy.txt correction need not be specified, it will be loaded\nautomatically.)\n\nThe script will also produced colorized disparities (in x and y)\nfrom the PAN image to the MS image, in which the CCD artifacts\nwill be very obvious. They can be visualized as:\n\n  stereo_gui run/run-RD_b1_CMAP.tif run/run-RD_b2_CMAP.tif\n\n# Averaging the corrections\n\nIf there exist several datasets for the same satellite, scan\ndirection, TDI, and band, run the tool for each one, \nwith a separate output directory for each, called say \nrun1, run2, etc. \n\nThe obtained corrections can be visualized together as:\n\n  python $ASP_PATH/src/asp/WVCorrect/ccd_process.py --plot-only \\\n    run*/run-corr-dx.txt\n\nTo compute a combined correction, by averaging, start with\nthe earlier averaged disparity. Run:\n\n  python $ASP_PATH/src/asp/WVCorrect/ccd_process.py \\\n    run*/run-avg-dx.txt --output-prefix combined\n\nOne has to be careful to not combine results from different\nTDI, scan directions, etc.\n\n# Verifying the corrections\n\nTo verify how the obtained corrections improve the results, do \n\n  band=3\n  crop_win=\"0 0 100000 100000\"\n  ASP_PATH=$HOME/StereoPipeline \n  $ASP_PATH/src/asp/WVCorrect/ms_ccd_verify.sh                   \\\n    p_corr.tif m.tif p.xml m.xml $band run_verif/run \"$crop_win\" \\\n    combined-dx.txt\n\nNotice how this tool is called exactly as the earlier shell script,\nbut with a different output directory and the last argument having the\nobtained correction in x (the one in y will be read automatically).\n\nIt is very instructive to compare the colormaps obtained earlier from\nthe ones after this step.\n\n# Shipping the corrections\n\nTo reduce the storage space and improve the organization, the obtained\ncorrections can be combined into a single TIF image which then should\nbe shipped with ASP. This is accomplished as follows.\n\nAssume for the sake of argument that two corrections were found each\nfor a certain combination of satellite, TDI, etc., and they are named\ncorr1-dx.txt and corr2-dx.txt (with corresponding dy corrections as\nwell).\n\nThe TIF image is obtained as follows:\n\n  python $ASP_PATH/src/asp/WVCorrect/form_corrections_image.py \\\n    corr1-dx.txt corr2-dx.txt \\\n    --output-image $ASP_PATH/src/asp/WVCorrect/WVxx_CCD_CORR.tif\n\nThen, edit the file\n\n  $ASP_PATH/src/asp/WVCorrect/ms_correction_lookup.txt\n\nand carefully add more lines to correspond to the corrections\njust added. As it can be seen in that file, multiple TIF\nfiles can be present having corrections, and given that a TIF file\ncontains multiple corrections, one has to ensure to specify\non which row of which TIF file the correction has to be found.\n\nAny time any changes are made, the file CMakeLists.txt in the\nStereoPipeline directory must be edited and the new TIF image must be\nadded. Even if no new such image is added, but any changes at all\nhappened, it is very important to have the time of this CMakeLists.txt\nfile be updated with the touch command, then cmake, make, and make\ninstall must be re-run. This will ensure the modified files are\nre-installed.\n\nAll the changes must be committed to the Git repository.\n\nAfter this, wv_correct (from the recently updated installation\ndirectory) can be run with the new corrections. Since the above process\nis error-prone, it is suggested to run wv_correct in two ways, first\nby explicitly providing the corrections, such as:\n\n  wv_correct --dx dx.txt --dy dy.txt --print-per-column-corrections\\\n    image.tif image.xml image_corr1.tif\n\nand second time by having them read from the TIF image:\n\n  wv_correct --band 3 --print-per-column-corrections \\\n    image.tif image.xml image_corr2.tif\n\nThe flag --print-per-column-corrections will print the corrections\nabout to apply. They must be the same in both case up to float\nprecision. (Specify the correct band in the second call.)\n\n\n\n"
  },
  {
    "path": "src/asp/WVCorrect/README_PAN",
    "content": "This document describes how corrections for CCD artifacts in PAN\nDigital Globe WorldView imagery (WV-1 and WV-2) are are tabulated.\n\nSee README_MULTISPECTRAL for how the corrections to multispectral\nimages are computed.\n\nThese documents can be used if desired to compute new corrections.\nThe existing corrections are already incorporated in the wv_correct\nprogram.\n\nBasic idea\n----------\n\nFor each TDI and scan direction perform several runs. For each run,\naverage all rows of the disparity (ignore invalid disparities).\nAverage these over multiple runs. We get n Vector2 values (since each\nvalid disparity pixel is a Vector2), where n is the image width. From\nthese, we will extract the locations of CCD jumps and their values in\nx and in y. Those will be hard-coded in asp/Tools/wv_correct.cc.\n\nThis text is applicable to WV01 and WV02. For WV03 see the text\non top of ccd_solve.cc. \n\nDetailed instructions\n---------------------\n\n1. Choose a satellite (WV1 or WV2; this approach does not work for WV3\nwhich seems fine as it is), a TDI (values are various multiples of 8\nfrom 8 to 64), and a scan direction (forward or reverse). (All this\ninformation can be found in the XML files.)\n\n2. Create a work directory. Have there at least 5-10 image sets for\nthe desired satellite/TDI/scan direction combination, with reasonably\nflat terrain, little or no clouds, and reasonable amount of detail.\n\n3. Build ASP in dev mode. Ensure that the Tools and WVCorrect\ndirectories are in your path.\n\n4. For a given stereo pair, inspect the left and right images in\nstereo_gui. Select with the mouse a region wider than the image in\nthe left image, and of height say 5000 or more pixels.  Its bounds\nwill be printed on screen. Select a region from the right image as\nwell, encompassing with a generous margin all terrain already seen in\nthe left image (say of heieght 12000 pixels). Make the region again\nwider than the image, to not leave any image part out either on left\nor on right sides.\n\nRun the script run_lr_wrap.sh (see its source for usage). \n\nRepeat this excercise for other portions of the left image. \n\nRepeat this again several times when opening the images in reverse\norder. This is important in order to get good disparity coverage.\n\nBefore doing all this, in each directory have a dem.tif file pointing\nto a pre-existing DEM of the area covered by the images.  This is\noptional, but it is queried to find the projection to use in point2dem\nduring the execution of run_lr_wrap.sh. \n\n5. Repeat this excercise a few more times for other stereo pairs.\n\n7. Inspect the obtained F.tif disparities. Crop away some top and\nbottom rows if they are incomplete or have noise. You will have to\nredo the step \"disp_avg\" from run_lr.sh. The result will be \"dx.txt\"\nand \"dy.txt\" files having averaged disparities.\n   \n8. Start Matlab. Add your WVCorrect directory to the path, for example\nuse \n\naddpath(genpath('/home/USER/projects/StereoPipeline/src/asp/WVCorrect'))\n\n9. In Matlab, create an entry for each run you made, for example, as\n\ndirs={'pair1/run_lr1', 'pair1/run_rl2', 'pair2/run_lr1', 'pair2/run_rl2'};\n\nThe following one-liner can be used to generate the above dirs value:\n\nls -d pair*/run_lr* | perl -pi -e \"s#^(.*?)\\n#'\\$1\\', #g\" | perl -pi -e \"s#^(.*?),\\s*\\$#dirs=\\{\\$1\\}\\n#g\"\n\nInitialize the pitches as: \n\npitches=zeros(length(dirs), 1) + 8.0e-3;\n\nIt is important to verify that the pitches in each XML file are indeed\n8.0e-03 (search for <DETPITCH>). Otherwise fill in the correct values\nin the 'pitches' array. \n\nThe script gen_scandir.pl can be helpful in parsing XML files\nto extract information on pitches, etc.\n\n10. Run\n\ndo_find = 1; fig_no = 1; find_ccds(do_find, dirs, pitches, fig_no);\n\nThis will save the CCD corrections to files, from there they can be hard-coded\nin wv_correct.cc. \n\n11. It is quite likely the previous step will result in very noisy curves.\nThose need to be eliminated, by excluding the noisy runs altogether, or by\ncropping F.tif even further and redoing \"disp_avg\".\n\nBe prepared for a lot of manual iterative work over many days.\n\n12. The script fix_ccds.m can be used to tweak the CCD jumps from the GUI.\n\n13. Recompile wv_correct.cc. Run it to get corrected images. Redo\nstereo and point2dem. Examine if the IntersectionError.tif file looks\nbetter than before. This can be done, for example, by again running\nrun_lr_wrap.sh but this time setting the \"corr\" flag to 1. \n\nAn \"improved\" intersection error file will have less noticeable vertical bands\ncorresponding to ccd artifacts, and its mean, and especially standard deviation, \nshould be lower than with the original uncorrecteed images. Some residual\nCCD artifacts should be noticeable, and there should be clear jitter present,\nwhich we do not correct for with wv_correct.\n\nwv_correct will only ever be run once per image.  The Matlab find_ccds tool will \nalso only be run once per TDI; it can be re-run to get a better set of fixes, but\ncorrected data should never fed back in to the find_ccds tool.\n\nTo improve the correction as seen in IntersectionError.tif, the following steps can\nbe taken:\n- Use more input data to find_ccds.  This may involve tweaking the ROIs or stereo \n  commands so that more image pairs successfully generate dx/dy files.\n- Tune the ROIs more carefully so that mountains or poorly matching regions do not\n  get included into the dx/dy averages.\n- Compare plots of the newly obtained correction amounts with the corrections from\n  other TDIs to get an idea of what shift patterns can be expected.\n- Hand-tune individual correction amounts by looking at the curves in Matlab.  The\n  jump should be equal in height to the peak-to-peak jump seen in the plot.\n- Keep in mind that WV1 is not as well behaved as WV2.  The final errors for WV1 \n  will be worse.\n  \n\nAfter correcting the images, you can re-run the process on the corrected images and obtain \ndx/dy curves for them as well.  When plotted, you should see the lack of sharp jumps in the\nCCD border areas.  Most likely you will still see jumps, but they will be corrected by an\nopposite jump nearby.  This is the effect of our applied correction, and the spacing between\nthe jumps indicates that our correction is misplaced by some number of pixels.  A difference\nin the height of the jumps indicates that our correction amount is also off by some amount.  \n\n\nOther Observations\n---------------------\n\nAt least some WV images show a consistent 0.25 pixel oscillation in\nthe X-direction disparity results.  This oscillation is independent of\nthe CCD border correction and about half the magnitude.  It is not\nnoticably affected by the subpixel mode used and it is visible on the\nintersection error image.\n\nSeen in WV1 and WV2, multiple directions and TDIs.\n\n\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "src/asp/WVCorrect/ccd_process.py",
    "content": "#!/usr/bin/python\n\n# Process the average disparity to correct for ccd artifacts. Use as\n# inputs the outputs of disp_avg. It is very important to note that\n# the output of disp_avg will have two extra elements at the\n# beginning, which are metadata, so the total number of values in that\n# array is two more than the number of image columns. During\n# processing this metadata will be removed.\n\n# This expects numpy and matplotlib to be installed.\n\nimport sys, os, re, argparse\nimport numpy as np\n\nusage = \"python ccd_process.py <options> <inputs>-dx.txt\"\n\nparser = argparse.ArgumentParser(usage = usage,\n                                 formatter_class = argparse.RawTextHelpFormatter)\n\nparser.add_argument(\"--exclude\",  dest = \"exclude\", type = int, default = 40,\n                    help = \"The number of (presumably inaccuate) values to exclude at \"    + \\\n                    \"the endpoints (they will be replaced with the value at the immedate \" + \\\n                    \"non-excluded value).\")\n\nparser.add_argument(\"--output-prefix\",  dest = \"output_prefix\", default = None, \n                    help = \"Save the processed results with this output prefix.\")\n\nparser.add_argument(\"--no-plot\", action = \"store_true\", default = False,\n                    dest = \"no_plot\",\n                    help = \"Do not plot the computed corrections.\")\n\nparser.add_argument(\"--plot-only\", action = \"store_true\", default = False,\n                    dest = \"plot_only\",\n                    help = \"Do not compute the CCD corrections, only \" + \\\n                    \"plot any corrections that were computed before.\")\n\n(options, files) = parser.parse_known_args(sys.argv)\n\ndef load_and_process(f, options):\n\n    # Load the text file \n    x = np.loadtxt(f)\n\n    if options.plot_only:\n        return x\n    \n    x_len = len(x)\n\n    # Replace the values at the end points as there correlation\n    # does not do too well.\n    for i in range(options.exclude):\n        x[i] = x[options.exclude]\n        x[x_len - i - 1] = x[x_len - options.exclude - 1]\n        \n    return x\n\ndef ccd_process(files, options):\n\n    do_plot = (not options.no_plot)\n\n    if do_plot:\n        import matplotlib.pyplot as plt\n\n    colors = ['b', 'r', 'g', 'c', 'm', 'y', 'k']\n\n    num_colors = len(colors)\n\n    if do_plot:\n        try:\n            plt.figure(1, figsize=(16, 5)) # inches\n            plt.subplot(211)\n        except Exception as e:\n            print(\"Could not launch a plot. Consider using this script with '--no-plot'.\\n\")\n            print(\"Error was: \" + str(e))\n            sys.exit(1)\n\n    # Process x\n    print(\"\\nProcessing the x average disparity\")\n    mean_x = []\n    num_vals = 0\n    start = True\n    for i in range(len(files)):\n        f = files[i]\n        print(\"Loading: \" + f)\n        x = load_and_process(f, options)\n        \n        num_vals = num_vals + 1\n\n        if not options.plot_only:\n\n            # Subtract the mean to overall not disturb the pixels too much,\n            # with the correction, hence let the mean correction be zero.\n            x = x - np.mean(x)\n\n            # Compensate for the fact that the PAN images have exra 50\n            # columns on the sides compared to the MS images at the PAN\n            # resolution, which is 12.5, so 1/4, at the MS resolution\n            # Don't do this given that we subtract the mean.\n            # (x = x - 12.5)\n            \n            # Flip, since we will apply to the MS images to match PAN\n            # rather as in reverse as computed.\n            x = -x\n            \n            if start:\n                # Initialize the mean\n                mean_x = x[:]\n                start = False\n            else:\n                mean_x = mean_x + x\n            \n        if do_plot:\n            plt.plot(x, colors[i % num_colors])\n\n    if do_plot:\n        # Label the x plot\n        #plt.ylim(-2, 2)\n        plt.title('dx')\n\n    if do_plot:\n        # Set up the y plot\n        plt.subplot(212)\n\n    # Process y\n    print(\"\\nProcessing the y average disparity\")\n    mean_y = []\n    start = True\n    for i in range(len(files)):\n        f = files[i]\n        \n        # switch to the y average disparity\n        f = f.replace('x.txt', 'y.txt') \n        print(\"Loading: \" + f)\n        y = load_and_process(f, options)\n\n        if not options.plot_only:\n            \n            # Subtract the mean as before\n            y = y - np.mean(y)\n\n            # flip as before\n            y = -y\n\n            if start:\n                # Initialize the mean\n                mean_y = y[:]\n                start = False\n            else:\n                mean_y = mean_y + y\n            \n        if do_plot:\n            plt.plot(y, colors[i % num_colors])\n            \n    if do_plot:\n        # Label the y plot\n        #plt.ylim(-2, 2)\n        plt.title('dy')\n        \n    if not options.plot_only:\n\n        print(\"\\nWill average \" + str(num_vals) + \" dataset(s).\")\n        mean_x = mean_x / num_vals\n        mean_y = mean_y / num_vals\n        \n        fx = options.output_prefix + '-dx.txt'\n        print(\"Saving the processed x data at: \" + fx)\n        np.savetxt(fx, mean_x)\n        \n        fy = options.output_prefix + '-dy.txt'\n        print(\"Saving the processed y data at: \" + fy)\n        np.savetxt(fy, mean_y)\n\n    if do_plot:\n        plt.show()\n\n# Main\nif len(files) <= 1:\n    parser.print_help()\n    sys.exit(1)\n\nif (not options.plot_only) and (options.output_prefix is None):\n    print(\"Must specify an output prefix\")\n    parser.print_help()\n    sys.exit(1)\n    \nccd_process(files[1:], options)\n"
  },
  {
    "path": "src/asp/WVCorrect/disp_avg.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2006-2012, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NASA Vision Workbench is licensed under the Apache License,\n//  Version 2.0 (the \"License\"); you may not use this file except in\n//  compliance with the License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n#ifdef _MSC_VER\n#pragma warning(disable:4244)\n#pragma warning(disable:4267)\n#pragma warning(disable:4996)\n#endif\n\n#include <asp/Core/Macros.h>\n#include <asp/Core/AspProgramOptions.h>\n\n#include <vw/FileIO/DiskImageView.h>\n#include <vw/Stereo/DisparityMap.h>\n#include <vw/FileIO/FileUtils.h>\n#include <vw/Image/Statistics.h>\n\nusing namespace vw;\n\nnamespace po = boost::program_options;\n\n// Average the rows in a given disparity image. Save them to disk as\n// two text files (x and y values), with as many entries as there\n// were columns in the disparity.\n\nstruct Options : vw::GdalWriteOptions {\n  std::string disparity, dx, dy;\n  int beg_row, end_row;\n  Vector2     remove_outliers_params;\n  bool        save_no_metadata;\n};\n\nvoid handle_arguments(int argc, char *argv[], Options& opt) {\n  po::options_description general_options(\"\");\n  general_options.add_options()\n    (\"remove-outliers-params\", po::value(&opt.remove_outliers_params)->default_value(Vector2(95.0, 3.0), \"pct factor\"))\n    (\"beg-row\",  po::value(&opt.beg_row)->default_value(-1), \"Start averaging the disparity from this row.\")\n    (\"end-row\",  po::value(&opt.end_row)->default_value(-1), \"Stop the disparity before this row.\")\n    (\"save-no-metadata\", po::bool_switch(&opt.save_no_metadata)->default_value(false),\n     \"Do not save in the output correction file the start and end image columns (not saving this makes processing easier).\");\n  \n  general_options.add(vw::GdalWriteOptionsDescription(opt));\n  \n  po::options_description positional(\"\");\n  positional.add_options()\n    (\"disparity\", po::value(&opt.disparity))\n    (\"dx\", po::value(&opt.dx))\n    (\"dy\", po::value(&opt.dy));\n  \n  po::positional_options_description positional_desc;\n  positional_desc.add(\"disparity\", 1);\n  positional_desc.add(\"dx\", 1);\n  positional_desc.add(\"dy\", 1);\n  \n  std::string usage(\"[options] <disparity> <dx.txt> <dy.txt>\");\n  bool allow_unregistered = false;\n  std::vector<std::string> unregistered;\n  po::variables_map vm =\n    asp::check_command_line(argc, argv, opt, general_options, general_options,\n                            positional, positional_desc, usage,\n                            allow_unregistered, unregistered);\n  \n  if ( !vm.count(\"disparity\") || !vm.count(\"dx\") || !vm.count(\"dy\") )\n    vw::vw_throw( vw::ArgumentErr() << \"Not all inputs were specified.\\n\\n\"\n                  << usage << general_options );\n  \n  // Create the directory in which the output image will be written.\n  vw::create_out_dir(opt.dx);\n}\n\nint main( int argc, char *argv[] ){\n\n  Options opt;\n  try {\n    handle_arguments(argc, argv, opt);\n\n    DiskImageView < PixelMask<Vector2f> > D(opt.disparity);\n\n    int cols = D.cols(), rows = D.rows();\n\n    // Handle optional row ROI arguments.\n    // - No col ROI since we want the entire column range.\n    int beg_row = 0;\n    int end_row  = rows;\n    int col_start = 0;\n    int col_stop  = cols;\n    if (opt.beg_row >= 0 && opt.end_row > opt.beg_row) {\n      beg_row = std::min(opt.beg_row, rows);\n      end_row = std::min(opt.end_row, rows);\n    }\n    TerminalProgressCallback disp_progress(\"asp\", \"\\tAveraging:   \");\n    double disp_progress_mult = 1.0/double(std::max(col_stop - col_start, 1));\n\n    std::vector<double> Dx(cols, 0), Dy(cols, 0);\n    \n    for (int col = col_start; col < col_stop; col++){\n      disp_progress.report_progress((col - col_start) * disp_progress_mult);\n\n      std::vector<double> px, py;\n      for (int row = beg_row; row < end_row; row++){\n        PixelMask<Vector2f> p = D(col, row);\n        if (!is_valid(p)) continue;\n        px.push_back(p.child()[0]);\n        py.push_back(p.child()[1]);\n      }\n\n      std::sort(px.begin(), px.end());\n      std::sort(py.begin(), py.end());\n      \n      // Being too strict with outlier removal can cause trouble\n      double pct_factor     = opt.remove_outliers_params[0]/100.0;\n      double outlier_factor = opt.remove_outliers_params[1];\n      \n      double bx = 0, ex = 0, by = 0, ey = 0;\n      if (!vw::math::find_outlier_brackets(px, pct_factor, outlier_factor, bx, ex))\n        continue;\n      if (!vw::math::find_outlier_brackets(py, pct_factor, outlier_factor, by, ey))\n        continue;\n\n      int len = px.size();\n      int num_valid = 0;\n      Dx[col] = 0;\n      Dy[col] = 0;\n      for (int k = 0; k < len; k++){\n\n        if (px[k] < bx || px[k] > ex || py[k] < by || py[k] > ey) continue;\n\n        num_valid++;\n        Dx[col] += px[k];\n        Dy[col] += py[k];\n      }\n      \n      if (num_valid > 0){\n        Dx[col] /= num_valid;\n        Dy[col] /= num_valid;\n      }\n    }\n    \n    disp_progress.report_finished();\n  \n    // Write dx file\n    std::ofstream dx(opt.dx.c_str());\n    dx.precision(16);\n    std::cout << \"Writing: \" << opt.dx << std::endl;\n    if (!opt.save_no_metadata) {\n      dx << col_start << std::endl;\n      dx << col_stop  << std::endl;\n    }\n    for (int col = 0; col < cols; col++) \n      dx << Dx[col] << std::endl;\n    dx.close();\n  \n    // Write dy file\n    std::ofstream dy(opt.dy.c_str());\n    dy.precision(16);\n    std::cout << \"Writing: \" << opt.dy << std::endl;\n    if (!opt.save_no_metadata) {\n      dy << col_start << std::endl;\n      dy << col_stop  << std::endl;\n    }\n    for (int col = 0; col < cols; col++) \n      dy << Dy[col] << std::endl;\n    dy.close();\n\n  } ASP_STANDARD_CATCHES;\n  \n  return 0;\n}\n"
  },
  {
    "path": "src/asp/WVCorrect/find_ccds.m",
    "content": "function main(do_find, dirs, pitches, plotid)\n\n   % if do_find is 1, we actually find and save the CCDs,\n   % otherwise we just examine the current averaged disparties.\n\n   if nargin < 4 % Did the user pass in the pitch list?\n      error('Missing arguments!')\n   end\n\n   if length(pitches) ~= length(dirs)\n      error('Must have one pitch per directory')\n   end\n   %if length(col_starts) ~= length(dirs)\n   %   error('Must have col start per directory')\n   %end\n   \n   % Generate list of dx and dy file paths\n   dx_file_paths={};\n   dy_file_paths={};\n   for i=1:length(dirs)\n      dir = dirs{i};\n      dx_path=[dir '/dx.txt'];\n      dy_path=[dir '/dy.txt'];\n      dx_file_paths = [dx_file_paths, dx_path];\n      dy_file_paths = [dy_file_paths, dy_path];\n   end\n   \n   % Separately handle dx then dy\n   do_plot(do_find, dx_file_paths, pitches, plotid);\n   title('x');\n   \n   do_plot(do_find, dy_file_paths, pitches, 1+plotid); \n   title('y');\nend\n\n%--------------------------------------------------------\n\nfunction disparity_data = scale_by_pitch(disparity_data, pitch)\n   % Compensate for the fact that ccd artifacts are spaced closer for larger pitch\n   % - Do this by interpolating a new vector at the default pitch size.\n   % - The larger pitch size effectively represents a downsampled input image.\n   BASE_PITCH = 8.0000000000e-03; % The default pitch value\n   I = (BASE_PITCH/pitch)*(1:(10*length(disparity_data))); % Get normal pitch pixel locations to a large distance\n   J=find(I > length(disparity_data)); % Find all those locations that fall out of bounds\n   I = I( 1:(J(1)-1)-1 ); % Crop to only in-bounds locations\n   disparity_data = interp1(1:length(disparity_data), disparity_data', I, 'linear')';\nend\n\n% The main working function!\nfunction do_plot(do_find, disparity_file_paths, pitches, fig)\n   \n   PRINT_EACH_FILE = true;\n   \n   % TODO: Should input values outside +1/-1 be replaced with NaN?\n\n   % TODO: How to deal with files of different sizes?\n   %--> Very unlikely that the pixels actually line up with eachother!\n   %--> Would like to be able to crop out the borders of some images and still have them line up.\n   %--> To do this need a column offset for each input file.\n\n   % Loop through each of the input disparity files and load the data into X.\n   X = [];\n   for i=1:length(disparity_file_paths)\n      disparity_path=disparity_file_paths{i};\n      if exist(disparity_path, 'file') == 2  % If the file exists...\n         %disp(sprintf('Loading %s', disparity_path)); \n      else\n         error(sprintf('Missing file: %s', disparity_path));\n      end\n      % Load the data and extract the crop amount\n      disparity_data = load(disparity_path);\n\n      col_start      = disparity_data(1); % Data outside this range is junk, existing zero handling should\n      col_stop       = disparity_data(2); % take care of it.\n      %disparity_data = disparity_data(3:end);\n\n      % Scale the data by the pitch\n      % - This adjusts all input vectors to the same size pixels, resizing the arrays.\n      disparity_data = scale_by_pitch(disparity_data, pitches(i));\n      \n      disp(['Disparity length = ', num2str(length(disparity_data))])\n      \n      [existing_data_length, n_files_stored] = size(X);\n      % Deal with size mis-matches by either growing X or disparity_data.\n      % TODO: Our code does not handle this case at all!\n      if existing_data_length > 0 % If this is not the first file loaded\n         new_data_length = length(disparity_data);\n         \n         %if new_data_length ~= existing_data_length\n         %   error(sprintf('Input data lengths %d and %d do not match!', new_data_length, existing_data_length));\n         %end\n         % Try not to use this old code!         \n         if new_data_length < existing_data_length % Pad out the new data\n            disparity_data = [disparity_data' zeros(1, existing_data_length - new_data_length)]';\n         elseif existing_data_length < new_data_length % Pad out the existing data\n            Y = zeros(new_data_length, n_files_stored);\n            Y(1:existing_data_length, 1:n_files_stored) = X;\n            X = Y;\n            [data_length, n_files_stored] = size(X); % Update these values\n         end\n         \n      end % End case handling existing data\n\n      % Now that the sizes are equalized, append the new data.\n      X = [X disparity_data];\n      \n   end % End loop through disparity files\n   \n   % Transpose the data so that the first dimension is smaller\n   X = X';\n   [n_files_stored, data_length] = size(X);\n   %disp(sprintf('size of X is %d %d', n_files_stored, existing_data_length));\n   \n   % Set to NaN all values within a buffer of a zero value near the ends of\n   %  each loaded data set.\n   edge_search_dist = round(data_length/3);\n   for r=1:n_files_stored\n\n      % Stay away from boundary.\n      %BDVAL = 300; % Must tweak this!!!\n      BDVAL = 100; % Smaller for working with cropped regions\n      \n      % Search through the data to find the last? zero value\n      col_start = 1;\n      for c=1:edge_search_dist % Loop through first third of data\n         if X(r, c) == 0\n            col_start = max(col_start, c);\n         end\n      end\n\n      % Do the same thing but coming in from the back\n      col_end = data_length;\n      for c=(data_length-edge_search_dist):data_length\n         if X(r, c) == 0\n            col_end = min(col_end, c);\n         end\n      end\n      \n      % Move in even farther\n      col_start = col_start + BDVAL;\n      col_end   = col_end - BDVAL;\n      \n      % Clear all the values outside the boundaries\n      for c=1:col_start\n         X(r, c) = NaN;\n      end\n      for c=col_end:data_length\n         X(r, c) = NaN;\n      end\n      \n   end % End loop through stored files\n   \n   wid = 35;\n\n   % These colors are rotated through as files are plotted\n   colors  = {'b', 'r', 'g', 'c', 'k'};\n   brushes = {'-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-'};\n%   brushes = {'-', '--', '-.', ':', '-', '--', '-.', ':', '-', '--', '-.', ':', '-', '--', '-.', ':'};\n\n   figure(fig); clf; hold on;\n   sep_size=0.0;\n   if do_find\n      sep_size = 0.25; % vertical gap between individual curves, for visibility\n   end\n   \n   % Remove really bad files\n   goodFile = ones(n_files_stored, 1);\n   \n   for r=1:n_files_stored\n      if r <= length(disparity_file_paths) \n         disp(sprintf('doing %s', disparity_file_paths{r}));\n      end\n\n      % Subtract out a smoothed version of this file's data\n      Y = X(r, :) - find_moving_avg(X(r, :));\n      X(r, :) = Y;\n\n      goodIndices = find(isnan(Y) ~= 1);\n      maxVal = max(abs(Y(goodIndices)));\n      if maxVal > 1\n         disp(sprintf('Skipping file with maximum value %g', maxVal));\n         goodFile(r) = 0;\n         continue\n      end\n      \n      if (PRINT_EACH_FILE) % Plot the data set, vertically shifted\n         % Select a color for this file and plot the shifted data\n         color_index = rem(r-1, length(colors))+1;\n         brush_index = floor((r-1) / length(colors))+1;\n         line_color = [brushes{brush_index}, colors{color_index}];\n         vertical_offset = sep_size*(r+1); % Visually separate the plots\n         plot(Y + vertical_offset, line_color);\n      end\n   end % End loop through stored files\n\n   % Take the mean of all of the input data\n   mean_X = zeros(1, data_length);\n   for c=1:data_length\n      sum = 0;\n      num = 0;\n      for r=1:n_files_stored\n         if ~isnan(X(r, c)) & goodFile(r) == 1\n            sum = sum + X(r, c);\n            num = num + 1;\n         end\n      end\n      if num > 0\n         mean_X(1, c) = sum/num;\n      end\n   end % End loop through data\n\n   mean_line_width = 1;\n   if PRINT_EACH_FILE\n      mean_line_width = 3;\n   end\n   plot(mean_X, 'm', 'LineWidth', mean_line_width);\n   %ylim([-1, 1])\n   \n   % Set the plot so that the axes have the right numbers when moving\n   h1 = zoom;\n   h2 = pan;\n   set(gca,'XTickLabelMode','auto')\n   set(gca,'XTickLabel',num2str(get(gca,'XTick').'))\n   set(h1,'ActionPostCallback',@mypostcallbackX);\n   set(h2,'ActionPostCallback',@mypostcallbackX);\n\n   if do_find ~= 0\n      find_ccds_aux(mean_X, fig)\n   end\nend\n\n% Callback function to keep axes updated when zooming\nfunction mypostcallbackX(obj,evd)\n   set(gca,'XTickLabelMode','auto')\n   set(gca,'XTickLabel',num2str(get(gca,'XTick').'))\nend\n\n% Split up a string based on spaces\nfunction b = split(a)\n   b = strread(a,'%s','delimiter',' ')\nend\n"
  },
  {
    "path": "src/asp/WVCorrect/find_ccds_aux.m",
    "content": "function find_ccds_aux(mean_disparity, fig)\n   % \n\n   vector_length = length(mean_disparity);\n\n   % Access the existing figure\n   figure(fig); hold on;\n   \n   % Call function to detect jumps in the disparity vector\n   detected_jumps=find_ccds_aux2(mean_disparity);\n\n   [m, num_jumps] = size(detected_jumps);\n   if (num_jumps == 0)\n     disp('No CCD jumps detected!')\n     return % Don't need to write output if we did not find anything.\n   end\n\n   %I0=1:(vector_length);\n   jump_indices    = detected_jumps(1, :);\n   jump_magnitudes = detected_jumps(2, :);\n   \n   % Limit the detected jumps to only one jump per N regions in the disparity vector.\n   % - Each region is +/- width in size, centered around: n*PERIOD + SHIFT\n   % - Why do we do this?\n   PERIOD = 705;\n   SHIFT  = -35;\n   WIDTH  = 80;\n   [jump_indices, jump_magnitudes] = sparse_ccds(WIDTH, PERIOD, SHIFT, vector_length, jump_indices, jump_magnitudes, fig);\n\n   plot(jump_indices, mean_disparity(jump_indices), 'b*', 'MarkerSize',12); % Draw blue *'s\n   plot(jump_indices, jump_magnitudes, 'b'); % Draw blue lines?\n\n   %[period, shift] = find_true_period(jump_indices, jump_magnitudes);\n   \n%   if fig == 1\n%      figure(fig+10);\n%      clf; hold on;\n%      plot(diff(jump_indices), 'b');\n%      plot(1000*jump_magnitudes, 'r');\n%   end\n   \n   format long g;\n   T = [jump_indices' jump_magnitudes']';\n   if fig == 1\n      file='ccdx.txt';\n      file2='avgx.txt';\n   else\n      file='ccdy.txt';\n      file2='avgy.txt';\n   end\n\n   mean_disparity = mean_disparity';\n   \n   % Write the output files\n   disp(sprintf('saving %s', file));\n   disp(sprintf('saving %s', file2));\n   dlmwrite(file, T, 'delimiter', ',', 'precision', 9);\n   dlmwrite(file2, mean_disparity, 'delimiter', ',', 'precision', 9);\n   \n\nfunction [period, shift] = find_true_period(jump_indices, jump_magnitudes)\n   % The true period is associated with the hugest hump\n   \n   vector_length = length(jump_indices);\n   Q = zeros(vector_length-1, 1);\n   for i=1:(vector_length-1)\n      Q(i) = abs(jump_magnitudes(i)) + abs(jump_magnitudes(i+1));\n   end\n   I = find(Q == max(Q));\n   i = I(1);\n   period = jump_indices(i+1) - jump_indices(i);\n   shift = jump_indices(i) - i*period;\n   while shift > 0\n      shift = shift - period;\n   end\n\n   plot(jump_indices(i), jump_magnitudes(i), 'g*');\n   disp(sprintf('--period and shift %g %g', period, shift));\n   \n\n\n% TODO: Update this\nfunction [locationsx, locationsy] = get_wv_correct_positions(WV_SAT_NUM)\n\n   %if WV_SAT_NUM == 2\n   locations = [6.9000000000000000e+02,1.3820000000000000e+03,2.0770000000000000e+03,2.7720000000000000e+03,3.4670000000000000e+03,4.1680000000000000e+03,4.8670000000000000e+03,5.5670000000000000e+03,6.2680000000000000e+03,6.9720000000000000e+03,7.6750000000000000e+03,8.3790000000000000e+03,9.0860000000000000e+03,9.7910000000000000e+03,1.0497000000000000e+04,1.1204000000000000e+04,1.1913000000000000e+04,1.2622000000000000e+04,1.3331000000000000e+04,1.4041000000000000e+04,1.4750000000000000e+04,1.5459000000000000e+04,1.6169000000000000e+04,1.6878000000000000e+04,1.7590000000000000e+04,1.8301000000000000e+04,1.9009000000000000e+04,1.9725000000000000e+04,2.0435000000000000e+04,2.1141000000000000e+04,2.1875000000000000e+04,2.2579000000000000e+04,2.3267000000000000e+04,2.3975000000000000e+04,2.4683000000000000e+04,2.5388000000000000e+04,2.6094000000000000e+04,2.6799000000000000e+04,2.7503000000000000e+04,2.8207000000000000e+04,2.8908000000000000e+04,2.9610000000000000e+04,3.0310000000000000e+04,3.1010000000000000e+04,3.1707000000000000e+04,3.2404000000000000e+04,3.3098000000000000e+04,3.3792000000000000e+04,3.4484000000000000e+04];\n   %else\n   %end\n\n   locationsx = locations;\n   locationsy = locations;\n   \n   \n\n\nfunction [jump_indices, jump_magnitudes] = sparse_ccds(wid, period, shift, ...\n                                    vector_length, jump_indices, jump_magnitudes, fig)\n   \n   % The known jumps should fall inside the search regions\n   PLOT_SEARCH_REGIONS = false; % This is kind of slow\n   PLOT_KNOWN_JUMPS    = false;\n   WV_SAT_NUM          = 2;\n   CROP_START_COL      = 0; % Crop amount for the \"left\" image, fixes locations for a single cropped input\n\n   jump_indices = jump_indices;\n\n   if PLOT_KNOWN_JUMPS\n      % CCD correction locations which were determined manually\n      % - The position of the corrections does not change much, so look near these points.\n      [est_jumps_x, est_jumps_y] = get_wv_correct_positions(WV_SAT_NUM);\n      \n\n      % Filter points outside the cropped region\n      est_jumps_x = est_jumps_x - CROP_START_COL;\n      est_jumps_y = est_jumps_y - CROP_START_COL;\n      est_jumps_x = est_jumps_x(find( (est_jumps_x>0) & (est_jumps_x<vector_length)));\n      est_jumps_y = est_jumps_y(find( (est_jumps_y>0) & (est_jumps_y<vector_length)));\n\n\n      plot(est_jumps_x, zeros(1, length(est_jumps_x)), 'g*');\n      plot(est_jumps_y, zeros(1, length(est_jumps_y)), 'y*');\n   end\n\n   % Keep one CCD per period\n   P = period*(1:vector_length) + shift - CROP_START_COL;\n   I = find( (P > 0) & (P <= vector_length));\n   P = P(I); \n   % P now contains only multiples of period (+ shift)\n   \n   \n   I=[];\n   for i=1:length(P) % For each period multiple\n\n      region_start = P(i)-wid;\n      region_end   = P(i)+wid;\n\n      if PLOT_SEARCH_REGIONS\n         % Shade this search region with a low-opacity box.\n         figure(fig);\n         y = [5  5];\n         x = [region_start  region_end];\n         basevalue = -1;\n         h = area(x, y, basevalue, 'LineStyle',':');\n         child=get(h,'Children');\n         set(child,'FaceAlpha',0.15)\n      end\n\n      % Grab jumps that fall within a range from the period position\n      J = find( (jump_indices >= region_start) & (jump_indices <= region_end));\n      if length(J) == 0\n         continue\n      end\n      % Restrict to only the largest jumps (if ties, the first will get kept)\n      K = find( abs(jump_magnitudes(J)) == max(abs(jump_magnitudes(J))) );\n      I = [I, J(K(1))]; % Record the jump index\n   end\n   jump_indices    = jump_indices(I);\n   jump_magnitudes = jump_magnitudes(I);\n   \nfunction U = find_ccds_aux2(mean_disparity)\n   % Detect local maxima of a diff function in the input vector\n   % - Returns indices and values in a matrix\n\n   % Hard coded debug figure\n   do_plot = 0; figno=0;\n   SHIFT=0;\n   if do_plot\n      figure(figno); clf; hold on;\n   end\n   \n   %mean_disparity = find_avg(A, col);\n   %Bt=mean_disparity';\n   %save('Bm.txt', '-ascii', '-double', 'Bt');\n   %return\n   \n   %mean_disparity0 = find_avg(A0, col);\n   \n   WIDTH = 35;\n   \n   % Compute some sort of diff measure\n   Q = mean_disparity*0 + NaN; % Generate a NaN vector matching the disparity vector\n   for i=1:length(mean_disparity)\n      %if i-WIDTH >= 1 & i+WIDTH<= length(S)\n      if (i-WIDTH >= 1) & (i+2*WIDTH <= length(mean_disparity)) % 3*WIDTH region 1/3 centered on i\n         % Document this!!!\n         % To do: Improve the accuracy by doing slopes with least squares\n         Q(i) =   1.5*(mean_disparity(i+  WIDTH) - mean_disparity(i      )) ...\n                - 0.5*(mean_disparity(i+2*WIDTH) - mean_disparity(i-WIDTH));\n         %Q(i) = WIDTH*(2*S(i) - S(i-WIDTH) - S(i + WIDTH))/2; \n      end\n   end\n   \n   % To do: Use some other criterion\n   cutoff     = 0.01; % temporary!!! % CCD artifacts must be less than this\n   max_cutoff = 1.5; % no ccd artifacts more than that are expected\n   wid2       = ceil(1.5*WIDTH); % leave only largest maxium in length wid2 on each side\n   \n   q_indices = [];\n   q_maxima = [];\n   for i=1:length(Q)\n      if isnan(Q(i)) \n         continue\n      end\n      \n      % Only process regions in a certain range\n      if abs(Q(i)) < cutoff | abs(Q(i)) > max_cutoff\n         continue\n      end\n      \n      % Skip locations near the boundary\n      if i-wid2 < 1 | i + wid2 > length(Q)\n         continue\n      end\n      \n      % Look at the nearby Q values; if any are greater than the current location\n      %   don't retain this location.  This is to only keep local maxima?\n      % To do: This needs more thinking, can result in a chain\n      % reaction eliminating too many artifacts.\n      is_good = 1;\n      for l = (i-wid2):(i+wid2)\n         if abs(Q(i)) < abs(Q(l))\n            is_good = 0;\n         end\n      end\n      \n      if is_good % Record the point index and Q value\n         q_indices = [q_indices, i];\n         q_maxima  = [q_maxima,  Q(i)];\n      end\n   end\n   \n   w2 = floor(WIDTH/2);\n   \n   %G = G + w2; % to be at center of CCD defect region\n   format long g\n   %[G'+w2 V']'\n   \n   % Pack centered indices and the value into the output vector\n   U = [q_indices'+w2+SHIFT   q_maxima']';\n   \n   \n   %return\n   %\n   %%\n   %%plot(detected_jumps(1, K0), 0*mean_disparity(detected_jumps(1, K0)), 'b*')\n   %%plot(sx1(1, K1)+s, 0*dx1(sx1(1, K1)), 'r*')\n   %\n   %%return\n   %\n   %\n   %\n   %%J1=find(I1+s > bx & I1+s < ex);\n   %%K1=find(sx1(1, :) + s > bx & sx1(1, :) + s < ex);\n   %%\n   %%plot(I1(J1)+s, -dx1(J1)', 'r');\n   %%plot(sx1(1, K1)+s, -dx1(sx1(1, K1)), 'r*')\n   %%\n   %%plot(detected_jumps(1, K0), 0*mean_disparity(detected_jumps(1, K0)), 'b*')\n   %%plot(sx1(1, K1)+s, 0*dx1(sx1(1, K1)), 'r*')\n   %\n   %jump_indices = detected_jumps(1, :);\n   %P1 = sx1(1, :);\n   %Z = zeros(length(jump_indices), length(P1));\n   %for l=1:length(jump_indices)\n   %   %disp(sprintf('l=%d', l));\n   %   for t = 1:length(P1)\n   %      P1_shift = P1 - P1(t)+jump_indices(l);\n   %      for v = 1:length(jump_indices)\n   %         T = find(P1_shift >= jump_indices(v) - d & P1_shift <= jump_indices(v) + d);\n   %         Z(l, t) = Z(l, t) + length(T);\n   %         %      if v == l\n   %         %         disp(sprintf('%d %d %d', t, l, T));\n   %         %      end\n   %      end\n   %   end\n   %end\n   %\n   %%figure(4); clf; hold on;\n   %%imagesc(Z); colorbar;\n   %%disp(sprintf('min is %g, %g', min(min(Z)), max(max(Z))));\n   %\n   %S=[];\n   %for l=1:length(jump_indices)\n   %   for t = 1:length(P1)\n   %      if Z(l, t) == max(max(Z))\n   %         S = [S, - P1(t)+jump_indices(l)];\n   %      end\n   %   end\n   %end\n   %figure(5); clf; hold on;\n   %plot(S, 'r*');\n   %\n   %% Find which shift occurs most often with +/-d variation.\n   %Q=0*S;\n   %for i=1:length(S)\n   %   Q(i) = length(find( S >= S(i)-d & S<= S(i)+ d));\n   %end\n   %% Out of all very similar shifts, choose the one occuring most often\n   %T=S(find(Q==max(Q)));\n   %R=0*T;\n   %for i=1:length(T)\n   %   R(i) = length(find( T(i) == T));\n   %end\n   %T1 = T(find(R==max(R)));\n   %SHIFT=T1(1);\n   %disp(sprintf('Shift is %d %d', d, SHIFT));\n   %\n   %P1_shift = P1 + SHIFT;\n   %\n   %figure(2); clf; hold on;\n   %plot(I0, mean_disparity', 'b');\n   %plot(I1+SHIFT, -dx1, 'r');\n   %plot(jump_indices, mean_disparity(jump_indices), 'b*');\n   %plot(P1_shift, -dx1(P1), 'r*');\n   %\n   %Tall=[];\n   %V = [];\n   %for v = 1:length(jump_indices)\n   %   T = find(P1_shift >= jump_indices(v) - d & P1_shift <= jump_indices(v) + d);\n   %   if length(T) > 0\n   %      V = [V, v];\n   %      Tall=[Tall, T];\n   %   end\n   %end\n   %\n   %plot(jump_indices(V), mean_disparity(jump_indices(V))+0.1, 'g*')\n   %plot(P1_shift(Tall), -dx1(P1(Tall))+0.1, 'g*');\n   %\n"
  },
  {
    "path": "src/asp/WVCorrect/find_moving_avg.m",
    "content": "function b = find_moving_avg(a)\n   % \n\n   WINDOW_SIZE = 700;\n   wid2 = floor(WINDOW_SIZE/2);\n   len = length(a);\n   b = a + NaN;\n\n   ss = 1; % first nonnan\n   for i=1:len\n      if ~isnan(a(i))\n         ss = i;\n         break;\n      end\n   end\n   \n   ee = len; % last nonnan\n   for i=len:-1:1\n      if ~isnan(a(i))\n         ee = i;\n         break;\n      end\n   end\n\n   for i=1:len\n\n      % average using a window of size WINDOW_SIZE\n      \n      s0 = max(i-wid2, ss);\n      e0 = min(i+wid2, ee);\n\n      if s0 < i & e0 > i\n         s0 = max(s0, i - (e0-i));\n         e0 = min(e0, i + (i-s0));\n         b(i) = mean(a(s0:e0));\n      else\n         b(i) = a(i);\n      end\n      \n%         p = i-k;\n%         q = i+k;\n%\n%         if (p >= 1) & (~isnan(a(p)))\n%            sum = sum + a(p);\n%            num = num + 1;\n%         end\n%\n%         if num >= WINDOW_SIZE\n%            break;\n%         end\n%\n%         if (q ~= p) & (q <= len) & (~isnan(a(q)))\n%            sum = sum + a(q);\n%            num = num + 1;\n%         end\n%\n%         if num >= WINDOW_SIZE\n%            break;\n%         end\n%\n%      end\n%\n%      if num >= 1\n%         b(i) = sum/num;\n%      end\n      \n   end\n\n   \n"
  },
  {
    "path": "src/asp/WVCorrect/fix_ccd.m",
    "content": "% Given a plotted polygonal line, move its vertices by clicking\n% on the old location and the new location.\n\nfunction A = fix_ccd(A, fig)\n   % Acces the passed-in figure and wait for the user to click\n   figure(fig);\n   [x, y] = ginput(1);\n   \n   % Find the point closest to where the user clicked in X\n   B = abs(A(1, :) - x);\n   I = find(B == min(B));\n   i = I(1);\n   \n   % Move the point to where the user clicked\n   A(1, i) = x;\n   A(2, i) = y;\n   \n   % Plot the shifted position\n   figure(fig); hold on;\n   plot(A(1, :), A(2, :), 'g')\n   plot(x, y, 'r*')\n   disp(sprintf('value is %g', y));"
  },
  {
    "path": "src/asp/WVCorrect/form_corrections_image.py",
    "content": "#!/usr/bin/python\n\n# Given several pairs of one-column files with each pair corresponding\n# to the x and y components of CCD artifact correction for a certain\n# TDI and scan direction, concatenate the two files in each pair and\n# write them as a row in the output TIF image. Use only 4 digits of\n# precision.\n \nimport sys, os, re, argparse\n\nimport numpy as np\nfrom osgeo import gdal, osr\n\nusage = \"python form_corrections.py <input1-dx.txt input1-dy.txt ...> --output-image image.tif\"\n\nparser = argparse.ArgumentParser(usage = usage,\n                                 formatter_class = argparse.RawTextHelpFormatter)\n\nparser.add_argument(\"--output-image\",  dest = \"output_image\", default = None, \n                    help = \"Save data in this .tif image.\")\n\n(options, other) = parser.parse_known_args(sys.argv)\n\nif len(other) <= 1:\n    print(\"No input correction files were provided.\")\n    sys.exit(1)\n\nif options.output_image is None:\n    print(\"The output image file was not specified.\")\n    sys.exit(1)\n\nfiles = other[1:]\nprint(\"Input files: \" + \" \".join(files))\nprint(\"Output image: \" + options.output_image)\n\nnum_files = len(files)\n\n# Read all the files in pairs\ndata_rows = []\nnum_cols = 0\nfor i in range(int(num_files)):\n    x_file = files[i]\n    y_file = x_file.replace('x.txt', 'y.txt')\n    if len(x_file) < 5 or x_file[-5:] != \"x.txt\" or len(y_file) < 5 or y_file[-5:] != \"y.txt\":\n        print(\"Expecting the input files to end with x.txt.\")\n\n    x = np.loadtxt(x_file)\n    y = np.loadtxt(y_file)\n    vals = np.concatenate((x, y))\n    data_rows.append(vals)\n    if num_cols > 0 and num_cols != len(vals):\n        print(\"All input files must have the same number of values.\")\n        sys.exit(1)\n    num_cols = len(vals)\n    \nnum_rows = len(data_rows)\n\n# GDAL really does not like to reuse the driver.  Pasting the code\n# below repeatedly in a python shell does not work well.\ndriver = gdal.GetDriverByName('GTiff')\ndst_filename = options.output_image\ndst_ds = driver.Create(dst_filename, num_cols, num_rows, 1, gdal.GDT_Float32)\n\nraster = np.ones( (num_rows, num_cols) ) + 9\nfor row in range(num_rows):\n    raster[row, :] = data_rows[row]\n\ndst_ds.GetRasterBand(1).WriteArray( raster )\ndst_ds.FlushCache()\n\n"
  },
  {
    "path": "src/asp/WVCorrect/gen_scandir.pl",
    "content": "#!/usr/bin/perl\nuse strict;        # insist that all variables be declared\nuse diagnostics;   # expand the cryptic warnings\nuse File::Basename;\nuse Cwd;\nuse File::Spec;\n\nMAIN:{\n\n  # For each of the run directories starting with given prefix, find\n  # if the left and right images are forward or reverse scan.\n\n  if (scalar(@ARGV) < 1){\n    print \"Usage: $0 prefix\\n\";\n    exit(0);\n  }\n\n  my $currDir = cwd;\n  my $execDir = File::Spec->rel2abs(dirname(__FILE__));\n\n  my $prefix = $ARGV[0];\n  print \"Prefix is $prefix\\n\";\n  my @lines;\n  foreach my $dir (<$prefix*>){\n\n    chdir $currDir;\n\n    next unless ($dir =~ /^$prefix/);\n    next unless (-d $dir);\n\n    chdir $dir;\n    print \"Now in $dir\\n\";\n    my $ans = qx($execDir/print_files.pl);\n    print \"answer is $ans\\n\";\n    $ans =~ s/\\s*$//g;\n    my @files = split(/\\s+/, $ans);\n    my $line = $dir;\n\n    foreach my $file (@files){\n      print \"---line is $file\\n\";\n\n      $file = $file . \".xml\";\n      next unless (-f $file);\n\n      open(NFILE, \"<$file\");\n      my $text = join(\"\", <NFILE>);\n      close(NFILE);\n      my $scandir = 1;\n      if ($text =~ /\\<SCANDIRECTION\\>Reverse\\<\\/SCANDIRECTION\\>/is){\n        $scandir = 0;\n      }\n\n      my $pitch = 0.0;\n      if ($text =~ /\\<DETPITCH\\>(.*?)\\<\\/DETPITCH\\>/is){\n        $pitch = $1;\n      }\n\n      $line = \"$line $scandir $pitch\";\n    }\n    $line =~ s/^.*?_//g;# matlab does not like letters\n    push(@lines, $line);\n    print \"$line\\n\";\n  }\n\n  chdir $currDir;\n  my $file = \"scandir_\" . $prefix . \".txt\";\n  print \"Writing: $file\\n\";\n  open(FILE, \">$file\");\n  foreach my $line (@lines){\n    print FILE \"$line\\n\";\n  }\n  close(FILE);\n\n}\n"
  },
  {
    "path": "src/asp/WVCorrect/ms_ccd_solve.sh",
    "content": "#!/bin/bash\n\n# A script to solve for CCD corrections for multi-spectral images. Must\n# have the desired MS image, corresponding PAN image, their cameras.\n# Put the ASP bin directory in the path.\n\n# Specify the full path to this tool, as it will look for a python script\n# in the same directory.\n\n# This will average the disparity in each column, and save them to\n# outputPrefix/run-avg-dx.txt and outputPrefix/run-avg-dy.txt\n# Then it will compute the CCD corrections based on these\n# using the script ccd_process.py\n# and save them in\n# outputPrefix/run-corr-dx.txt and outputPrefix/run-corr-dy.txt\n#\n# If desired to compute these corrections by averaging multiple such\n# average disparities, that python script can be invoked directly as:\n#\n# python ccd_process.py */run-avg-dx.txt --output-prefix combined-corr\n\n# cropWin \"0 0 8820 5000\"\n\nif [ \"$#\" -ne 7 ]; then echo Usage: $0 panImage.tif msImage.tif panCamera.xml msCamera.xml msBandNum outputPrefix/run cropWin; exit; fi\n\npanImage=$1\nmsImage=$2\npanCamera=$3\nmsCamera=$4\nmsBand=$5\noutputPrefix=$6\ncropWin=$7\n\nfunction run_cmd () {\n    cmd=$1\n    out=$2\n    echo \"\"\n    echo $cmd\n\n    if [ \"$out\" != \"\" ]; then\n        echo Writing the output to $out\n        eval $cmd > $out 2>&1\n        ans=$?\n    else\n        eval $cmd\n        ans=$?\n    fi\n    \n    if [ \"$ans\" -ne 0 ]; then\n        echo Command failed\n        exit 1\n    fi\n    \n    echo \"\"\n}\n\nfunction gen_dummy_cam {\n    name=$1\n    echo \\\n\"fu = 1\nfv = 1\ncu = 1\ncv = 1\nu_direction = 1 0 0\nv_direction = 0 1 0\nw_direction = 0 0 1\nC = 0 0 0\nR = 1 0 0 0 1 0 0 0 1\nNULL\n\" \\\n> $name\n\n}\n\nif [ \"$msBand\" -le 1 ] || [ \"$msBand\" -ge 8 ]; then\n    echo \"The MS band must be between 1 and 8.\"\nfi\n\nsuffix=$(basename $outputPrefix)\noutDir=$(dirname $outputPrefix)\nif [ \"$suffix\" = \"\" ] || [ \"$outDir\" = \".\" ]; then\n    echo Please specify the output prefix as outputDir/run\n    exit 1\nfi\n\ncmd=\"mkdir -p $outDir\"\nrun_cmd \"$cmd\"\n\necho Reducing the PAN image resolution to make it comparable to the multispecral image resolution\npanImageSub4=$(echo $panImage | perl -p -e \"s#\\.(TIF|NTF)#_sub4.tif#ig\")\npanImageSub4=${outputPrefix}-${panImageSub4}\ncmd=\"mkdir -p $(dirname $panImageSub4)\"\nrun_cmd \"$cmd\"\ncmd=\"gdal_translate -r average -co TILED=YES -co COMPRESS=LZW -co BIGTIFF=IF_SAFER -outsize 25% 25% $panImage $panImageSub4\"\n#echo $cmd\nrun_cmd \"$cmd\"\n\necho Separating the desired multispecral band\nmsImageCurrBand=$(echo $msImage | perl -p -e \"s#\\.(TIF|NTF)#_b${msBand}.tif#ig\")\nmsImageCurrBand=${outputPrefix}-${msImageCurrBand}\ncmd=\"mkdir -p $(dirname $msImageCurrBand)\"\nrun_cmd \"$cmd\"\ncmd=\"gdal_translate -co TILED=YES -co COMPRESS=LZW -co BIGTIFF=IF_SAFER -b $msBand $msImage $msImageCurrBand\"\n#echo $cmd\nrun_cmd \"$cmd\"\n\nleftTsaiCam=\"$outDir/dummy1.tsai\"\nrightTsaiCam=\"$outDir/dummy2.tsai\"\necho Creating fake cameras: $leftTsaiCam $rightTsaiCam\ngen_dummy_cam $leftTsaiCam\ngen_dummy_cam $rightTsaiCam\n\n# Since we do PAN to MS stereo, the correlation and subpixel kernels can be small,\n# and in fact, having them small helps in not blurring the disparity average\n# too much.\necho Running stereo to find the disparity\ncmd=\"stereo --stop-point 4 --individually-normalize --alignment-method none --left-image-crop-win $cropWin --right-image-crop-win $cropWin --corr-search 5 -5 10 10 --corr-kernel 9 9 --subpixel-kernel 9 9 $panImageSub4 $msImageCurrBand $leftTsaiCam $rightTsaiCam $outputPrefix\"\nout=${outputPrefix}-stereo-output.txt\n#echo $cmd \nrun_cmd \"$cmd\" $out\n\necho Averaging the disparity\ncmd=\"disp_avg --remove-outliers-params 100 3 --save-no-metadata ${outputPrefix}-RD.tif ${outputPrefix}-avg-dx.txt ${outputPrefix}-avg-dy.txt\"\n#echo $cmd\nrun_cmd \"$cmd\"\n\necho Process the averaged disparities\nccd_process_path=$(dirname $0)\ncmd=\"$(which python) $ccd_process_path/ccd_process.py ${outputPrefix}-avg-dx.txt --output-prefix ${outputPrefix}-corr --no-plot\"\n#echo $cmd\nrun_cmd \"$cmd\"\n\necho Separating the channels of the disparity and colorizing them\n\nb=1\ncmd=\"gdal_translate -co TILED=YES -co COMPRESS=LZW -co BIGTIFF=IF_SAFER -b $b ${outputPrefix}-RD.tif ${outputPrefix}-RD_b${b}.tif\"\n#echo $cmd\nrun_cmd \"$cmd\"\n\nisForward=$(grep -i scan $msCamera | grep -i forward)\n\nif [ \"$isForward\" != \"\" ]; then\n    cmd=\"colormap --min 10.5 --max 11.5 ${outputPrefix}-RD_b${b}.tif\"\nelse\n    cmd=\"colormap --min 11.0 --max 12.0 ${outputPrefix}-RD_b${b}.tif\"\nfi\nrun_cmd \"$cmd\"\n\nb=2\ncmd=\"gdal_translate -co TILED=YES -co COMPRESS=LZW -co BIGTIFF=IF_SAFER -b $b ${outputPrefix}-RD.tif ${outputPrefix}-RD_b${b}.tif\"\nrun_cmd \"$cmd\"\n\nif [ \"$isForward\" != \"\" ]; then\n    cmd=\"colormap --min -0.5 --max 0.5 ${outputPrefix}-RD_b${b}.tif\"\nelse\n    cmd=\"colormap --min -1.0 --max 0.0 ${outputPrefix}-RD_b${b}.tif\"\nfi\nrun_cmd \"$cmd\"\n\necho \"\"\necho Corrections in x and y:\necho ${outputPrefix}-corr-dx.txt\necho ${outputPrefix}-corr-dy.txt\n\necho \"\"\necho Colormaps before the correction:\necho ${outputPrefix}-RD_b1_CMAP.tif\necho ${outputPrefix}-RD_b2_CMAP.tif\n\n\n"
  },
  {
    "path": "src/asp/WVCorrect/ms_ccd_verify.sh",
    "content": "#!/bin/bash\n\n# A script to solve for CCD corrections for multi-spectral images. Must\n# have the desired MS image, corresponding PAN image, their cameras.\n# Put the ASP bin directory in the path.\n\n# Specify the full path to this tool, as it will look for a python script\n# in the same directory.\n\n# This will average the disparity in each column, and save them to\n# outputPrefix/run-avg-dx.txt and outputPrefix/run-avg-dy.txt\n# Then it will compute the CCD corrections based on these\n# using the script ccd_process.py\n# and save them in\n# outputPrefix/run-corr-dx.txt and outputPrefix/run-corr-dy.txt\n#\n# If desired to compute these corrections by averaging multiple such\n# average disparities, that python script can be invoked directly as:\n#\n# python ccd_process.py */run-corr-dx.txt --output-prefix combined-corr\n\n# cropWin \"0 0 8820 5000\"\n\nif [ \"$#\" -ne 8 ]; then echo Usage: $0 panImage.tif msImage.tif panCamera.xml msCamera.xml msBandNum outputPrefix/run cropWin correction-dx.txt; exit; fi\n\npanImage=$1\nmsImage=$2\npanCamera=$3\nmsCamera=$4\nmsBand=$5\noutputPrefix=$6\ncropWin=$7\ncorrection_dx=$8\n\nfunction run_cmd () {\n    cmd=$1\n    out=$2\n    echo \"\"\n    echo $cmd\n\n    if [ \"$out\" != \"\" ]; then\n        echo Writing the output to $out\n        eval $cmd > $out 2>&1\n        ans=$?\n    else\n        eval $cmd\n        ans=$?\n    fi\n    \n    if [ \"$ans\" -ne 0 ]; then\n        echo Command failed\n        exit 1\n    fi\n    echo \"\"\n}\n\nfunction gen_dummy_cam {\n    name=$1\n    echo \\\n\"fu = 1\nfv = 1\ncu = 1\ncv = 1\nu_direction = 1 0 0\nv_direction = 0 1 0\nw_direction = 0 0 1\nC = 0 0 0\nR = 1 0 0 0 1 0 0 0 1\nNULL\n\" \\\n> $name\n\n}\n\nif [ \"$msBand\" -le 1 ] || [ \"$msBand\" -ge 8 ]; then\n    echo \"The MS band must be between 1 and 8.\"\nfi\n\nsuffix=$(basename $outputPrefix)\noutDir=$(dirname $outputPrefix)\nif [ \"$suffix\" = \"\" ] || [ \"$outDir\" = \".\" ]; then\n    echo Please specify the output prefix as outputDir/run\n    exit 1\nfi\n\ncmd=\"mkdir -p $outDir\"\nrun_cmd \"$cmd\"\n\necho Reducing the PAN image resolution to make it comparable to the multispecral image resolution\npanImageSub4=$(echo $panImage | perl -p -e \"s#\\.(TIF|NTF)#_sub4.tif#ig\")\npanImageSub4=${outputPrefix}-${panImageSub4}\ncmd=\"mkdir -p $(dirname $panImageSub4)\"\nrun_cmd \"$cmd\"\ncmd=\"gdal_translate -r average -co TILED=YES -co COMPRESS=LZW -co BIGTIFF=IF_SAFER -outsize 25% 25% $panImage $panImageSub4\"\n#echo $cmd\nrun_cmd \"$cmd\"\n\necho Separating the desired multispecral band\nmsImageCurrBand=$(echo $msImage | perl -p -e \"s#\\.(TIF|NTF)#_b${msBand}.tif#ig\")\nmsImageCurrBand=${outputPrefix}-${msImageCurrBand}\ncmd=\"mkdir -p $(dirname $msImageCurrBand)\"\nrun_cmd \"$cmd\"\ncmd=\"gdal_translate -co TILED=YES -co COMPRESS=LZW -co BIGTIFF=IF_SAFER -b $msBand $msImage $msImageCurrBand\"\n#echo $cmd\nrun_cmd \"$cmd\"\n\nleftTsaiCam=\"$outDir/dummy1.tsai\"\nrightTsaiCam=\"$outDir/dummy2.tsai\"\necho Creating fake cameras: $leftTsaiCam $rightTsaiCam\ngen_dummy_cam $leftTsaiCam\ngen_dummy_cam $rightTsaiCam\n\ncorrMsImage=${msImageCurrBand/.tif/_corr.tif}\ncorrMsImage=${outputPrefix}-${corrMsImage}\n# Ensure the output directory exists\ncmd=\"mkdir -p $(dirname $corrMsImage)\"\nrun_cmd \"$cmd\"\n\ncorrection_dy=${correction_dx/dx.txt/dy.txt}\necho Applying the corrections ${correction_dx} ${correction_dy}\n\ncmd=\"wv_correct $msImageCurrBand $msCamera $corrMsImage --dx ${correction_dx} --dy ${correction_dy}\"\necho $cmd\nrun_cmd \"$cmd\"\n\n# Since we do PAN to MS stereo, the correlation and subpixel kernels can be small,\n# and in fact, having them small helps in not blurring the disparity average\n# too much.\necho Running stereo with the correction applied\noutputPrefixCorr=${outputPrefix}-corr\nout=${outputPrefixCorr}-stereo-output.txt\ncmd=\"stereo --stop-point 4 --individually-normalize --alignment-method none --left-image-crop-win $cropWin --right-image-crop-win $cropWin --corr-search 5 -5 10 10 --corr-kernel 9 9 --subpixel-kernel 9 9 $panImageSub4 $corrMsImage $leftTsaiCam $rightTsaiCam $outputPrefixCorr\"\nout=${outputPrefix}-stereo-output.txt\necho $cmd \nrun_cmd \"$cmd\" $out\n\necho Computing the dispartity colormaps after correction\nb=1\ncmd=\"gdal_translate -co TILED=YES -co COMPRESS=LZW -co BIGTIFF=IF_SAFER -b $b ${outputPrefixCorr}-RD.tif ${outputPrefixCorr}-RD_b${b}.tif\"\nrun_cmd \"$cmd\"\n\nisForward=$(grep -i scan $msCamera | grep -i forward)\n\nif [ \"$isForward\" != \"\" ]; then\n    cmd=\"colormap --min 10.5 --max 11.5 ${outputPrefixCorr}-RD_b${b}.tif\"\nelse\n    cmd=\"colormap --min 11.0 --max 12.0 ${outputPrefixCorr}-RD_b${b}.tif\"\nfi\nrun_cmd \"$cmd\"\n\nb=2\ncmd=\"gdal_translate -co TILED=YES -co COMPRESS=LZW -co BIGTIFF=IF_SAFER -b $b ${outputPrefixCorr}-RD.tif ${outputPrefixCorr}-RD_b${b}.tif\"\nrun_cmd \"$cmd\"\n\nif [ \"$isForward\" != \"\" ]; then\n    cmd=\"colormap --min -0.5 --max 0.5 ${outputPrefixCorr}-RD_b${b}.tif\"\nelse\n    cmd=\"colormap --min -1.0 --max 0.0 ${outputPrefixCorr}-RD_b${b}.tif\"\nfi\nrun_cmd \"$cmd\"\n\necho \"\"\necho Wrote corrected image to: $corrMsImage\necho \"\"\necho Colormaps after the correction: ${outputPrefixCorr}-RD_b1_CMAP.tif ${outputPrefixCorr}-RD_b2_CMAP.tif\n "
  },
  {
    "path": "src/asp/WVCorrect/ms_correction_lookup.txt",
    "content": "# ASP implements CCD artifacts correction only for a handful of bands\n# for a few TDI and scan directions for certain Digital Globe\n# satellite multispectral images. The corrections are stored as rows\n# in a set of .TIF images. This lookup table shows for each TDI and\n# scan direction which row of which TIF correction image has the\n# corrections.\n\n# Multiple such images are allowed, though only one exists so far.\n\n# This lookup table is read at run-time by wv_correct and is\n# distributed with ASP, together with the correction image.\n\n# SATID BAND TDI SCANDIR  CORRECTION_IMAGE          ROW \n                                              \n  WV02   3   10  reverse  WV02_BAND3_CCD_CORR.tif    0  \n  WV02   3   14  reverse  WV02_BAND3_CCD_CORR.tif    1  \n  WV02   3   24  reverse  WV02_BAND3_CCD_CORR.tif    2\n\n  WV02   3   10  forward  WV02_BAND3_CCD_CORR.tif    3  \n  WV02   3   14  forward  WV02_BAND3_CCD_CORR.tif    4  \n  WV02   3   18  forward  WV02_BAND3_CCD_CORR.tif    5  \n  WV02   3   24  forward  WV02_BAND3_CCD_CORR.tif    6  \n"
  },
  {
    "path": "src/asp/WVCorrect/plot_ccds.m",
    "content": "function plot_ccds(do_find, is_forward, prefix, I)\n   % Plot ccds with given scan direction with given prefix.\n   % I are their indices in 'scandir.txt'. \n   % If is_forward=0, that means reverse.\n   % The 'scandir.txt' file is obtained by running\n   % gen_scandir.pl.\n   % The 'good' file, if it exists, must be written by hand,\n   % each line has a good run directory, that is, it has\n   % nice dx.txt and dy.txt. \n   \n   file = sprintf('scandir_%s.txt', prefix);\n   disp(sprintf('Loading %s', file));\n\n   suff = 'fwd';\n   if ~ is_forward\n      suff = 'bwd';\n   end\n   goodfile = sprintf('good_%s_%s.txt', suff, prefix);\n   good_exists = 0;\n   if exist(goodfile, 'file') == 2\n      good_exists = 1;\n      disp(sprintf('Getting good dirs from %s', goodfile));\n      good = textread(goodfile, '%s');\n   else\n      disp(sprintf('File %s does not exist', goodfile));\n      good = {};\n   end\n   \n   A=load(file);\n   [m, n] = size(A);\n\n   dirs={};\n   pitches = [];\n   \n   if length(I) == 0\n      I = 1:m; % do all runs\n   end\n   for i = I\n      if i > m\n         if length(I) > 1\n            disp(sprintf('Out of bounds, %d', i));\n         end\n         continue;\n      end\n      d=A(i, 1);\n      a=A(i, 2);\n      pa = A(i, 3); % pitch\n      b=A(i, 4);\n      pb = A(i, 5); % pitch\n\n      pitch0 = 8.000000000000000e-03;\n      \n      if a == is_forward % & pa == pitch0\n         dir=sprintf('%s_%d/runv%s_%d_flip%d', prefix, d, prefix, d, 0);\n         [U, V] = ind2sub(size(good),find(cellfun(@(x)strcmp(x,dir),good)));\n         if length(U) > 0 | ~good_exists\n            dirs=[dirs, dir];\n            pitches = [pitches, pa];\n         end\n      end\n      \n      if b == is_forward % & pb == pitch0\n         dir=sprintf('%s_%d/runv%s_%d_flip%d', prefix, d, prefix, d, 1);\n         [U, V] = ind2sub(size(good),find(cellfun(@(x)strcmp(x,dir),good)));\n         if length(U) > 0 | ~good_exists\n            dirs=[dirs, dir];\n            pitches = [pitches, pb];\n         end\n      end\n      \n   end\n\n   if length(dirs) > 0\n      find_ccds(do_find, dirs, pitches);\n   end\n\n   pause(1)\n   commandwindow % move the focus back to the command window"
  },
  {
    "path": "src/asp/WVCorrect/run_lr.sh",
    "content": "#!/bin/bash\n\nif [ \"$#\" -lt 4 ]; then \n    echo Usage: $0 left_crop_win right_crop_win left_image right_image left_cam right_cam tag corr \n    exit; \nfi\n\n#execDir=/home/smcmich1/repo/StereoPipeline/src/asp/WVCorrect\nexecDir=/home6/oalexan1/projects/StereoPipeline/src/asp/WVCorrect\n\necho execDir is $execDir\n\n# Need to first find disp_avg, then stereo, from the dev build, then our own parallel_stereo\n# from the packaged build. \nexport PATH=$execDir:$execDir/../Tools:/u/oalexan1/projects/BinaryBuilder/latest/libexec:$PATH\n\nleft_crop_win=$1\nright_crop_win=$2\nleft_image=$3\nleft_cam=$4\nright_image=$5\nright_cam=$6\ntag=$7 # A string to append to the output directory, to distinguish several runs\ncorr=$8 # Is 1 if to run the flow with wv_correct-ed images for verification. Normally should be 0. \n\nif [ \"$corr\" = \"1\" ]; then\n    left_corr=${left_image/.ntf/.tif};   left_corr=${left_corr/.tif/_corr_tag${tag}.tif}\n    right_corr=${right_image/.ntf/.tif}; right_corr=${right_corr/.tif/_corr_tag${tag}.tif}\n\n    wv_correct $left_image $left_cam $left_corr\n    wv_correct $right_image $right_cam $right_corr\nfi\n\n#export ASP_PYTHON_MODULES_PATH=$HOME/projects/BinaryBuilder/StereoPipelinePythonModules/lib64/python2.6/site-packages:$HOME/projects/BinaryBuilder/StereoPipelinePythonModules/lib64/python2.6/site-packages/GDAL-1.10.0-py2.6-linux-x86_64.egg/osgeo:$HOME/projects/BinaryBuilder/StereoPipelinePythonModules/lib\n\n#bundle_adjust $left_image $right_image $left_cam $right_cam -o run_ba/run\n\nbase_cmd=\"parallel_stereo --corr-seed-mode 1 --subpixel-kernel 13 13\n  --part-of-multiview-run --alignment-method homography\n  --subpixel-mode 1 --corr-max-levels 2 --disable-fill-holes\n  --corr-timeout 600 \" # sometimes may want to use many ip: --ip-per-tile 1000\"\n#  --bundle-adjust-prefix run_ba/run\"\n\nprojwin=$(gdalinfo -proj4 dem.tif 2>/dev/null |grep -i \"proj=\" | perl -p -e \"s#\\'##g\")\nif [ \"$projwin\" != \"\" ]; then\n    projwin=$projwin # Wipe quotes\n    echo \"Found projwin from dem: $projwin\"\nelse\n    # Ths is good enough for areas close to the North Pole\n    projwin=\"+proj=stere +lat_0=90 +lat_ts=70 +lon_0=-45 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs \"\n    echo \"Using default projwin $projwin\"\nfi\n\ndir=run_lr_${tag}\n\nif [ \"$corr\" = \"1\" ]; then\n    dir_orig=$dir\n    dir=${dir}_corr\nfi\n\nleftc=\"--left-image-crop-win $left_crop_win\"\nrightc=\"--right-image-crop-win $right_crop_win\"\n\nrm -rf ./$dir\nmkdir -p $dir\n\nif [ \"$corr\" = \"1\" ]; then\n\n    # Steal the old ip file, to not spend time re-creating it\n    echo cp -fv $(ls $dir_orig/*match) $dir\n    cp -fv $dir_orig/*match $dir\n    \n    cmd=\"$base_cmd $leftc $rightc $left_corr $right_corr $left_cam $right_cam $dir/run\"\nelse\n    cmd=\"$base_cmd $leftc $rightc $left_image $right_image $left_cam $right_cam $dir/run\"\nfi\n\n\necho $cmd\n\n$cmd\n\n# Create the DEM\npoint2dem $dir/run-PC.tif --errorimage --tr 2 --t_srs \"$projwin\"\n\n# Wipe extra stuff\nrm -fv ./$dir/run-PC.tif ./$dir/run-D.tif ./$dir/run-RD.tif\n\ndisparitydebug $dir/run-F.tif\nstereo_gui --create-image-pyramids-only $dir/run-F-H.tif $dir/run-F-V.tif\n\nif [ \"$corr\" != \"1\" ]; then\n    # This needs to be manually run for each data set using good bounds!\n    $execDir/disp_avg $dir/run-F.tif $dir/dx.txt $dir/dy.txt\nfi\n\nexit\n\n# To do: Force that all runs be redone below!\n\n# PATH to the ASP build compiled for merope.\nsource ~/.bashenv\n\nexport PATH=$HOME/projects/StereoPipeline/src/asp/Tools:$HOME/projects/visionworkbench/src/vw/tools:$HOME/projects/base_system/bin:$HOME/projects/packages/bin:$HOME/bin:$PATH\n# Path for merope\nv=$(stereo_fltr 2>&1 |grep -i \"bin/sed\" | perl -p -e \"s#\\s##g\")\nif [ \"$v\" != \"\" ]; then\n    export PATH=$HOME/projects/StereoPipeline2/src/asp/Tools:$PATH\nfi\n\n\ndir=$1\nif [ \"$dir\" != \"\" ]; then cd $dir; fi\n\nname=$2\nopts=$3\ntag=\"\"\n# p=$5\n# s=$6\n\nrunDir=\"fixed\"$tag\"$name\" # \"_\"$p\"_\"$s\noutFile=output_\"$runDir\".txt\necho runDir=$runDir\necho Will write to $(pwd)/$outFile\nexec &> $outFile 2>&1\n\nans=$($execDir/print_files.pl)\nl=$(echo $ans | awk '{print $1}')\nr=$(echo $ans | awk '{print $2}')\n\nturnon0=1\n#a=$(grep -i scandir $l.xml | grep -i reverse)\n#if [ \"$a\" != \"\" ]; then turnon0=1; echo will do left-right; fi\nturnon1=1\n#a=$(grep -i scandir $r.xml | grep -i reverse)\n#if [ \"$a\" != \"\" ]; then turnon1=1; echo will do right-left; fi\n\n# Turn on the correction of artifacts\nturnon=0\n\nif [[ ! $opts =~ left-image-crop-win ]]; then\n    echo \"Must specify crop-win as input\"\n    exit 1;\nfi\nwin=$(echo $opts | perl -p -e 's#^.*?left-image-crop-win\\s+(\\d+\\s+\\d+\\s+\\d+\\s+\\d+).*?$#$1#g')\n\nwin2=\"0 0 50600 21504\"\n#rm -fv *crop* *proj_crop*\nif [ ! -f $l\"_crop.tif\" ]; then\n    gdal_translate.pl -srcwin $win2 $l.ntf $l\"_crop.tif\"\nfi\n\nif [ ! -f $r\"_crop.tif\" ]; then\n    gdal_translate.pl -srcwin $win2 $r.ntf $r\"_crop.tif\"\nfi\n\n#rm -f *ntf\n\nif [ \"$turnon\" -eq 1 ]; then\n\n    runDir=run_fixed\"$tag\"\"$name\"_flip1\n    hill=$runDir/run-crop-hill.tif\n    rm -rfv $runDir\n    mkdir -p $runDir\n    wv_correct \"$l\"_crop.tif \"$l\".xml $runDir/\"$l\"_crop_shift.tif\n    wv_correct \"$r\"_crop.tif \"$r\".xml $runDir/\"$r\"_crop_shift.tif\n\n    runDir=run_fixed\"$tag\"\"$name\"_flip0\n    hill=$runDir/run-crop-hill.tif\n    rm -rfv $runDir\n    mkdir -p $runDir\n    wv_correct \"$l\"_crop.tif \"$l\".xml $runDir/\"$l\"_crop_shift.tif\n    wv_correct \"$r\"_crop.tif \"$r\".xml $runDir/\"$r\"_crop_shift.tif\n\n    time_run.sh stereo $runDir/\"$l\"_crop_shift.tif $runDir/\"$r\"_crop_shift.tif \"$l\".xml \"$r\".xml $runDir/run $opts\n    gdal_translate.pl -srcwin $win $runDir/run-F.tif $runDir/run-crop-F.tif\n    $execDir/find_avg_disp $runDir/run-crop-F.tif $runDir/dx.txt $runDir/dy.txt\n    gdal_translate.pl -srcwin $win $runDir/run-PC.tif $runDir/run-crop-PC.tif\n    point2dem -r Earth  $runDir/run-crop-PC.tif  --errorimage\n    gdaldem hillshade   $runDir/run-crop-DEM.tif $hill\n    gdal_translate.pl -outsize 50% 50% $hill $runDir/run-crop-hill_sub2.tif\n    image2qtree.pl $runDir/run-crop-hill_sub2.tif\n    gdal_translate.pl -outsize 20% 20% $runDir/run-crop-IntersectionErr.tif $runDir/run-crop-IntersectionErr_20pct.tif\n    colormap.pl $runDir/run-crop-IntersectionErr_20pct.tif\n    rm -fv $(ls $runDir/*.tif | grep -v crop-F.tif | grep -v Intersect | grep -v hill)\n\n    runDir=run_fixed\"$tag\"\"$name\"_flip1\n    hill=$runDir/run-crop-hill.tif\n\n    time_run.sh stereo $runDir/\"$r\"_crop_shift.tif $runDir/\"$l\"_crop_shift.tif \"$r\".xml \"$l\".xml $runDir/run $opts\n    gdal_translate.pl -srcwin $win $runDir/run-F.tif $runDir/run-crop-F.tif\n    $execDir/find_avg_disp $runDir/run-crop-F.tif $runDir/dx.txt $runDir/dy.txt\n    gdal_translate.pl -srcwin $win $runDir/run-PC.tif $runDir/run-crop-PC.tif\n    point2dem -r Earth  $runDir/run-crop-PC.tif  --errorimage\n    gdaldem hillshade   $runDir/run-crop-DEM.tif $hill\n    gdal_translate.pl -outsize 50% 50% $hill $runDir/run-crop-hill_sub2.tif\n    image2qtree.pl $runDir/run-crop-hill_sub2.tif\n    gdal_translate.pl -outsize 20% 20% $runDir/run-crop-IntersectionErr.tif $runDir/run-crop-IntersectionErr_20pct.tif\n    colormap.pl $runDir/run-crop-IntersectionErr_20pct.tif\n    rm -fv $(ls $runDir/*.tif | grep -v crop-F.tif | grep -v Intersect | grep -v hill)\nfi\n\nrunDir0=runv\"$tag\"\"$name\"_flip0\nif [ \"$turnon0\" -eq 1 ]; then\n    hill=$runDir0/run-crop-hill.tif\n    dx=$runDir0/dx.txt\n    dy=$runDir0/dy.txt\n\n    rm -rfv $runDir0\n    if [ -f \"$dx\" ] && [ -f \"$dy\" ]; then\n        echo Will skip $runDir0 as files exist\n    else\n        time_run.sh stereo \"$l\"_crop.tif \"$r\"_crop.tif \"$l\".xml \"$r\".xml $runDir0/run $opts\n        gdal_translate.pl -srcwin $win $runDir0/run-F.tif $runDir0/run-crop-F.tif\n        $execDir/find_avg_disp $runDir0/run-crop-F.tif $dx $dy\n        gdal_translate.pl -srcwin $win $runDir0/run-PC.tif $runDir0/run-crop-PC.tif\n        point2dem -r Earth  $runDir0/run-crop-PC.tif --errorimage\n        gdaldem hillshade   $runDir0/run-crop-DEM.tif $hill\n        gdal_translate.pl -outsize 50% 50% $hill $runDir0/run-crop-hill_sub2.tif\n        image2qtree.pl $runDir0/run-crop-hill_sub2.tif\n        gdal_translate.pl -outsize 20% 20% $runDir0/run-crop-IntersectionErr.tif $runDir0/run-crop-IntersectionErr_20pct.tif\n        colormap.pl $runDir0/run-crop-IntersectionErr_20pct.tif\n        rm -fv $(ls $runDir0/*.tif | grep -v crop-F.tif | grep -v Intersect | grep -v hill)\n    fi\nfi\n\nrunDir1=runv\"$tag\"\"$name\"_flip1\nif [ \"$turnon1\" -eq 1 ]; then\n    hill=$runDir1/run-crop-hill.tif\n    dx=$runDir1/dx.txt\n    dy=$runDir1/dy.txt\n\n    rm -rfv $runDir1\n    if [ -f \"$dx\" ] && [ -f \"$dy\" ]; then\n        echo Will skip $runDir1 as files exist\n    else\n        time_run.sh stereo \"$r\"_crop.tif \"$l\"_crop.tif \"$r\".xml \"$l\".xml $runDir1/run $opts\n        gdal_translate.pl -srcwin $win $runDir1/run-F.tif $runDir1/run-crop-F.tif\n        $execDir/find_avg_disp $runDir1/run-crop-F.tif $dx $dy\n        gdal_translate.pl -srcwin $win $runDir1/run-PC.tif $runDir1/run-crop-PC.tif\n        point2dem -r Earth  $runDir1/run-crop-PC.tif --errorimage\n        gdaldem hillshade   $runDir1/run-crop-DEM.tif $hill\n        gdal_translate.pl -outsize 50% 50% $hill $runDir1/run-crop-hill_sub2.tif\n        image2qtree.pl $runDir1/run-crop-hill_sub2.tif\n        gdal_translate.pl -outsize 20% 20% $runDir1/run-crop-IntersectionErr.tif $runDir1/run-crop-IntersectionErr_20pct.tif\n        colormap.pl $runDir1/run-crop-IntersectionErr_20pct.tif\n        rm -fv $(ls $runDir1/*.tif | grep -v crop-F.tif | grep -v Intersect | grep -v hill)\n    fi\nfi\n"
  },
  {
    "path": "src/asp/WVCorrect/run_lr_wrap.sh",
    "content": "#!/bin/bash\n\n# A wrapper around run_lr.sh, to make it easier to invoke it right with what stereo_gui dumps out\n# when selecting a region. This wrapper will take as inputs the following ugly arguments:\n\n# $(pwd) tag corr Crop src win for  WV02_20170511151556_103001006882D700_17MAY11151556-P1BS-501479705100_01_P002.ntf: -874 2797 36397 8486 Crop src win for  WV02_20170511151722_1030010069726100_17MAY11151722-P1BS-501493169020_01_P002.ntf: -552 6652 36618 7884 \n\n# and will launch run_lr.sh while looking up the camera models.\n\n# Here, 'tag' is just a string label, and 'corr' is 0 when we we are working on making\n# corrections, and is 1, when corrections are already in wv_correct and we want\n# to verify how well they work.\n\nexecDir=$(dirname $0)\n\nrunDir=$1\nshift\n\ncd $runDir\n\ntag=$1\nshift\n\ncorr=$1\nshift\n\nshift; shift; shift; shift; # pass on the text: Crop src win for \n\nleft_img=$(echo $1 | perl -p -e \"s#:##g\")\nleft_xml=${left_img/.ntf/.xml}\nshift\n\na=$1; shift\nb=$1; shift\nc=$1; shift\nd=$1; shift\n\nshift; shift; shift; shift; # pass on the text: Crop src win for \n\nright_img=$(echo $1 | perl -p -e \"s#:##g\")\nright_xml=${right_img/.ntf/.xml}\nshift\n\ne=$1; shift\nf=$1; shift\ng=$1; shift\nh=$1; shift\n\necho $left_img $left_xml $right_img $right_xml $a $b $c $d $e $f $g $h $tag\n\necho Working in $runDir\n\nout=output_${tag}_corr${corr}.txt\n\necho Writing output to $out\n\n$execDir/run_lr.sh \"$a $b $c $d\" \"$e $f $g $h\" $left_img $left_xml $right_img $right_xml $tag $corr  > $out 2>&1\n\n\n\n\n\n"
  },
  {
    "path": "src/asp/asp_config.h.in",
    "content": "/* src/asp/asp_config.h.in.  Used by CMake to generate asp_config.h.  */\n\n/* The version of Boost with which the software built. */\n#define ASP_BOOST_VERSION \"@Boost_VERSION@\"\n\n/* does the compiler support function __attribute__((deprecated))? */\n#cmakedefine COMPILER_HAS_ATTRIBUTE_DEPRECATED\n\n/* does the compiler support function __attribute__((noreturn))? */\n#cmakedefine COMPILER_HAS_ATTRIBUTE_NORETURN\n\n/* enable the C++ exception mechanism */\n#cmakedefine ENABLE_EXCEPTIONS 1\n\n/* Define to 1 if you have the <dlfcn.h> header file. */\n#cmakedefine HAVE_DLFCN_H 1\n\n/* Define to 1 if you have the `getpid' function. */\n#cmakedefine HAVE_GETPID 1\n\n/* Define to 1 if you have the `getpwuid' function. */\n#cmakedefine HAVE_GETPWUID 1\n\n/* Define to 1 if you have the <inttypes.h> header file. */\n#cmakedefine HAVE_INTTYPES_H 1\n\n/* Define to 1 if you have the <memory.h> header file. */\n#cmakedefine HAVE_MEMORY_H 1\n\n/* Define to 1 if the ADD_SPOT_RPC app is available. */\n//#cmakedefine ASP_HAVE_PKG_ADD_SPOT_RPC\n\n/* Define to 1 if the AMD package is available. */\n#cmakedefine ASP_HAVE_PKG_AMD 1\n\n/* Define to 1 if the pkg package is available */\n#cmakedefine ASP_HAVE_PKG_APPLE_GL 1\n\n/* Define to 1 if the pkg package is available */\n#cmakedefine ASP_HAVE_PKG_APPLE_LAPACK 1\n\n/* Define to 1 if the pkg package is available */\n#cmakedefine ASP_HAVE_PKG_APPLE_QMAKE_QT 1\n\n/* Define to 1 if the pkg package is available */\n#cmakedefine ASP_HAVE_PKG_APPLE_QWT 1\n\n/* Define to 1 if the ARBITRARY_QT package is available. */\n#cmakedefine ASP_HAVE_PKG_ARBITRARY_QT 1\n\n/* Define to 1 if the ASTER2ASP app is available. */\n//#cmakedefine ASP_HAVE_PKG_ASTER2ASP\n\n/* Define to 1 if the BOOST package is available. */\n#cmakedefine ASP_HAVE_PKG_BOOST 1\n\n/* Define to 1 if the BOOST_DATETIME package is available. */\n//#cmakedefine ASP_HAVE_PKG_BOOST_DATETIME\n\n/* Define to 1 if the BOOST_FILESYSTEM package is available. */\n//#cmakedefine ASP_HAVE_PKG_BOOST_FILESYSTEM\n\n/* Define to 1 if the BOOST_GRAPH package is available. */\n//#cmakedefine ASP_HAVE_PKG_BOOST_GRAPH\n\n/* Define to 1 if the BOOST_IOSTREAMS package is available. */\n//#cmakedefine ASP_HAVE_PKG_BOOST_IOSTREAMS\n\n/* Define to 1 if the pkg package is available */\n//#cmakedefine ASP_HAVE_PKG_BOOST_MOST\n\n/* Define to 1 if the BOOST_MPI package is available. */\n//#cmakedefine ASP_HAVE_PKG_BOOST_MPI\n\n/* Define to 1 if the BOOST_PROGRAM_OPTIONS package is available. */\n//#cmakedefine ASP_HAVE_PKG_BOOST_PROGRAM_OPTIONS\n\n/* Define to 1 if the BOOST_REGEX package is available. */\n//#cmakedefine ASP_HAVE_PKG_BOOST_REGEX\n\n/* Define to 1 if the BOOST_SERIALIZATION package is available. */\n//#cmakedefine ASP_HAVE_PKG_BOOST_SERIALIZATION\n\n/* Define to 1 if the BOOST_SYSTEM package is available. */\n//#cmakedefine ASP_HAVE_PKG_BOOST_SYSTEM\n\n/* Define to 1 if the BOOST_THREAD package is available. */\n//#cmakedefine ASP_HAVE_PKG_BOOST_THREAD\n\n/* Define to 1 if the BUNDLE_ADJUST app is available. */\n//#cmakedefine ASP_HAVE_PKG_BUNDLE_ADJUST\n\n/* Define to 1 if the CAM2RPC app is available. */\n//#cmakedefine ASP_HAVE_PKG_CAM2RPC\n\n/* Define to 1 if the CAMERA module is available. */\n//#cmakedefine ASP_HAVE_PKG_CAMERA\n\n/* Define to 1 if the CAMERA_FOOTPRINT app is available. */\n//#cmakedefine ASP_HAVE_PKG_CAMERA_FOOTPRINT\n\n/* Define to 1 if the CERES package is available. */\n#cmakedefine ASP_HAVE_PKG_CERES\n\n/* Define to 1 if the CHOLMOD package is available. */\n#cmakedefine ASP_HAVE_PKG_CHOLMOD 1\n\n/* Define to 1 if the CLAPACK package is available. */\n#cmakedefine ASP_HAVE_PKG_CLAPACK 1\n\n/* Define to 1 if the COLAMD package is available. */\n#cmakedefine ASP_HAVE_PKG_COLAMD 1\n\n/* Define to 1 if the CORE module is available. */\n//#cmakedefine ASP_HAVE_PKG_CORE\n\n/* Define to 1 if the CSV_FILTER app is available. */\n//#cmakedefine ASP_HAVE_PKG_CSV_FILTER\n\n/* Define to 1 if the CURL package is available. */\n#cmakedefine ASP_HAVE_PKG_CURL 1\n\n/* Define to 1 if the DEMPROFILE app is available. */\n//#cmakedefine ASP_HAVE_PKG_DEMPROFILE\n\n/* Define to 1 if the DEM_GEOID app is available. */\n//#cmakedefine ASP_HAVE_PKG_DEM_GEOID\n\n/* Define to 1 if the DEM_MOSAIC app is available. */\n//#cmakedefine ASP_HAVE_PKG_DEM_MOSAIC\n\n/* Define to 1 if the DISPARITYDEBUG app is available. */\n//#cmakedefine ASP_HAVE_PKG_DISPARITYDEBUG\n\n/* Define to 1 if the DISP_AVG app is available. */\n//#cmakedefine ASP_HAVE_PKG_DISP_AVG\n\n/* Define to 1 if the EIGEN package is available. */\n#cmakedefine ASP_HAVE_PKG_EIGEN 1\n\n/* Define to 1 if the FLANN package is available. */\n#cmakedefine ASP_HAVE_PKG_FLANN 1\n\n/* Define to 1 if the FLAPACK package is available. */\n#cmakedefine ASP_HAVE_PKG_FLAPACK 1\n\n/* Define to 1 if the GDAL package is available. */\n#cmakedefine ASP_HAVE_PKG_GDAL 1\n\n/* Define to 1 if the GEODIFF app is available. */\n//#cmakedefine ASP_HAVE_PKG_GEODIFF\n\n/* Define to 1 if the GEOID package is available. */\n#cmakedefine ASP_HAVE_PKG_GEOID 1\n\n/* Define to 1 if the GEOS package is available. */\n#cmakedefine ASP_HAVE_PKG_GEOS 1\n\n/* Define to 1 if the GEOTIFF package is available. */\n#cmakedefine ASP_HAVE_PKG_GEOTIFF 1\n\n/* Define to 1 if the pkg package is available */\n#cmakedefine ASP_HAVE_PKG_GL 1\n\n/* Define to 1 if the GLOG package is available. */\n#cmakedefine ASP_HAVE_PKG_GLOG 1\n\n/* Define to 1 if the GOOGLE_PROFILER package is available. */\n////]]#cmakedefine ASP_HAVE_PKG_GOOGLE_PROFILER\n\n/* Define to 1 if the pkg package is available */\n#cmakedefine ASP_HAVE_PKG_GSL 1\n\n/* Define to 1 if the GSL_HASBLAS package is available. */\n#cmakedefine ASP_HAVE_PKG_GSL_HASBLAS 1\n\n/* Define to 1 if the GSL_NEEDBLAS package is available. */\n#cmakedefine ASP_HAVE_PKG_GSL_NEEDBLAS 1\n\n/* Define to 1 if the pkg package is available */\n#cmakedefine ASP_HAVE_PKG_GUESS_QT 1\n\n/* Define to 1 if the GUI module is available. */\n#cmakedefine ASP_HAVE_PKG_GUI 1\n\n/* Define to 1 if the HDF5 package is available. */\n#cmakedefine ASP_HAVE_PKG_HDF5 1\n\n/* Define to 1 if the HSVMERGE app is available. */\n//#cmakedefine ASP_HAVE_PKG_HSVMERGE\n\n/* Define to 1 if the ICEBRIDGE app is available. */\n//#cmakedefine ASP_HAVE_PKG_ICEBRIDGE\n\n/* Define to 1 if the ILMBASE package is available. */\n#cmakedefine ASP_HAVE_PKG_ILMBASE 1\n\n/* Define to 1 if the IMAGE_CALC app is available. */\n//#cmakedefine ASP_HAVE_PKG_IMAGE_CALC\n\n/* Define to 1 if the INTEL_LAPACK package is available. */\n#cmakedefine ASP_HAVE_PKG_INTEL_LAPACK 1\n\n/* Define to 1 if the ISIS package is available. */\n#cmakedefine ASP_HAVE_PKG_ISIS 1\n\n/* Define to 1 if the JP2 package is available. */\n#cmakedefine ASP_HAVE_PKG_JP2 1\n\n/* Define to 1 if the JPEG package is available. */\n#cmakedefine ASP_HAVE_PKG_JPEG 1\n\n/* Define to 1 if the pkg package is available */\n#cmakedefine ASP_HAVE_PKG_KAKADU 1\n\n/* Define to 1 if the KAKADU_63_JOIN package is available. */\n//#cmakedefine ASP_HAVE_PKG_KAKADU_63_JOIN 1\n\n/* Define to 1 if the KAKADU_SPLIT package is available. */\n//#cmakedefine ASP_HAVE_PKG_KAKADU_SPLIT 1\n\n/* Define to 1 if the pkg package is available */\n#cmakedefine ASP_HAVE_PKG_LAPACK 1\n\n/* Define to 1 if the LASZIP package is available. */\n#cmakedefine ASP_HAVE_PKG_LASZIP 1\n\n/* Define to 1 if the LIBNABO package is available. */\n#cmakedefine ASP_HAVE_PKG_LIBNABO 1\n\n/* Define to 1 if the LIBPOINTMATCHER package is available. */\n#cmakedefine ASP_HAVE_PKG_LIBPOINTMATCHER 1\n\n/* Define to 1 if the LINUX_GL package is available. */\n#cmakedefine ASP_HAVE_PKG_LINUX_GL 1\n\n/* Define to 1 if the pkg package is available */\n#cmakedefine ASP_HAVE_PKG_LINUX_QMAKE_QT 1\n\n/* Define to 1 if the LRONACJITREG app is available. */\n//#cmakedefine ASP_HAVE_PKG_LRONACJITREG\n\n/* Define to 1 if the M package is available. */\n#cmakedefine ASP_HAVE_PKG_M 1\n\n/* Define to 1 if the MAPPROJECT app is available. */\n//#cmakedefine ASP_HAVE_PKG_MAPPROJECT\n\n/* Define to 1 if the MER2CAMERA app is available. */\n//#cmakedefine ASP_HAVE_PKG_MER2CAMERA\n\n/* Define to 1 if the OPENCV package is available. */\n#cmakedefine ASP_HAVE_PKG_OPENCV 1\n\n/* Define to 1 if the OPEN_MPI package is available. */\n#cmakedefine ASP_HAVE_PKG_OPEN_MPI 1\n\n/* Define to 1 if the ORBITVIZ app is available. */\n//#cmakedefine ASP_HAVE_PKG_ORBITVIZ\n\n/* Define to 1 if the ORTHO2PINHOLE app is available. */\n//#cmakedefine ASP_HAVE_PKG_ORTHO2PINHOLE\n\n/* Define to 1 if the ORTHOPROJECT app is available. */\n//#cmakedefine ASP_HAVE_PKG_ORTHOPROJECT\n\n/* Define to 1 if the PANSHARP app is available. */\n//#cmakedefine ASP_HAVE_PKG_PANSHARP\n\n/* Define to 1 if the PCL package is available. */\n#cmakedefine ASP_HAVE_PKG_PCL 1\n\n/* Define to 1 if the PC_ALIGN app is available. */\n//#cmakedefine ASP_HAVE_PKG_PC_ALIGN\n\n/* Define to 1 if the PC_MERGE app is available. */\n//#cmakedefine ASP_HAVE_PKG_PC_MERGE\n\n/* Define to 1 if the PLAIN_QWT package is available. */\n#cmakedefine ASP_HAVE_PKG_PLAIN_QWT 1\n\n/* Define to 1 if the PNG package is available. */\n#cmakedefine ASP_HAVE_PKG_PNG 1\n\n/* Define to 1 if the POINT2DEM app is available. */\n//#cmakedefine ASP_HAVE_PKG_POINT2DEM\n\n/* Define to 1 if the POINT2LAS app is available. */\n//#cmakedefine ASP_HAVE_PKG_POINT2LAS\n\n/* Define to 1 if the POINT2MESH app is available. */\n//#cmakedefine ASP_HAVE_PKG_POINT2MESH\n\n/* Define to 1 if the PROJ4 package is available. */\n#cmakedefine ASP_HAVE_PKG_PROJ 1\n\n/* Define to 1 if the PROTOBUF package is available. */\n#cmakedefine ASP_HAVE_PKG_PROTOBUF 1\n\n/* Define to 1 if the PTHREADS package is available. */\n#cmakedefine ASP_HAVE_PKG_PTHREADS 1\n\n/* Define to 1 if the PYTHON module is available. */\n#cmakedefine ASP_HAVE_PKG_PYTHON 1\n\n/* Define to 1 if the pkg package is available */\n#cmakedefine ASP_HAVE_PKG_QT 1\n\n/* Define to 1 if the QT_GUESS_BASE package is available. */\n//#cmakedefine ASP_HAVE_PKG_QT_GUESS_BASE 1\n\n/* Define to 1 if the QT_GUESS_CORE package is available. */\n//#cmakedefine ASP_HAVE_PKG_QT_GUESS_CORE 1\n\n/* Define to 1 if the QT_GUESS_GUI package is available. */\n//#cmakedefine ASP_HAVE_PKG_QT_GUESS_GUI\n\n/* Define to 1 if the QT_GUESS_NETWORK package is available. */\n//#cmakedefine ASP_HAVE_PKG_QT_GUESS_NETWORK\n\n/* Define to 1 if the QT_GUESS_OPENGL package is available. */\n//#cmakedefine ASP_HAVE_PKG_QT_GUESS_OPENGL\n\n/* Define to 1 if the QT_GUESS_SQL package is available. */\n//#cmakedefine ASP_HAVE_PKG_QT_GUESS_SQL\n\n/* Define to 1 if the QT_QMAKE package is available. */\n//#cmakedefine ASP_HAVE_PKG_QT_QMAKE\n\n/* Define to 1 if the QT_QMAKE_GUI package is available. */\n//#cmakedefine ASP_HAVE_PKG_QT_QMAKE_GUI\n\n/* Define to 1 if the QT_QMAKE_NETWORK package is available. */\n//#cmakedefine ASP_HAVE_PKG_QT_QMAKE_NETWORK\n\n/* Define to 1 if the QT_QMAKE_OPENGL package is available. */\n//#cmakedefine ASP_HAVE_PKG_QT_QMAKE_OPENGL\n\n/* Define to 1 if the QT_QMAKE_SQL package is available. */\n//#cmakedefine ASP_HAVE_PKG_QT_QMAKE_SQL\n\n/* Define to 1 if the pkg package is available */\n#cmakedefine ASP_HAVE_PKG_QWT 1\n\n/* Define to 1 if the RPC_GEN app is available. */\n//#cmakedefine ASP_HAVE_PKG_RPC_GEN\n\n/* Define to 1 if the S2P_FLTR app is available. */\n//#cmakedefine ASP_HAVE_PKG_S2P_FLTR\n\n/* Define to 1 if the S2P_PPRC app is available. */\n//#cmakedefine ASP_HAVE_PKG_S2P_PPRC\n\n/* Define to 1 if the SESSIONS module is available. */\n//#cmakedefine ASP_HAVE_PKG_SESSIONS\n\n/* Define to 1 if the SFS app is available. */\n//#cmakedefine ASP_HAVE_PKG_SFS\n\n/* Define to 1 if the SLAPACK package is available. */\n#cmakedefine ASP_HAVE_PKG_SLAPACK 1\n\n/* Define to 1 if the pkg package is available */\n#cmakedefine ASP_HAVE_PKG_SPICE 1\n\n/* Define to 1 if the SPICE_SUBDIR package is available. */\n#cmakedefine ASP_HAVE_PKG_SPICE_SUBDIR 1\n\n/* Define to 1 if the SPICE_TOP package is available. */\n#cmakedefine ASP_HAVE_PKG_SPICE_TOP 1\n\n/* Define to 1 if the STANDALONE_BLAS package is available. */\n#cmakedefine ASP_HAVE_PKG_STANDALONE_BLAS 1\n\n/* Define to 1 if the STANDALONE_F2C package is available. */\n#cmakedefine ASP_HAVE_PKG_STANDALONE_F2C 1\n\n/* Define to 1 if the STANDALONE_FBLAS package is available. */\n#cmakedefine ASP_HAVE_PKG_STANDALONE_FBLAS 1\n\n/* Define to 1 if the STANDALONE_FLAPACK package is available. */\n#cmakedefine ASP_HAVE_PKG_STANDALONE_FLAPACK 1\n\n/* Define to 1 if the pkg package is available */\n#cmakedefine ASP_HAVE_PKG_STANDALONE_FLAPACK_FBLAS 1\n\n/* Define to 1 if the STANDALONE_LAPACK package is available. */\n#cmakedefine ASP_HAVE_PKG_STANDALONE_LAPACK 1\n\n/* Define to 1 if the pkg package is available */\n#cmakedefine ASP_HAVE_PKG_STANDALONE_LAPACK_AND_BLAS 1\n\n/* Define to 1 if the STEREO app is available. */\n//#cmakedefine ASP_HAVE_PKG_STEREO\n\n/* Define to 1 if the STEREO_GUI app is available. */\n//#cmakedefine ASP_HAVE_PKG_STEREO_GUI\n\n/* Define to 1 if the STEREO_TRI app is available. */\n//#cmakedefine ASP_HAVE_PKG_STEREO_TRI\n\n/* Define to 1 if the SUFFX_QWT package is available. */\n#cmakedefine ASP_HAVE_PKG_SUFFX_QWT 1\n\n/* Define to 1 if the SUITESPARSE package is available. */\n#cmakedefine ASP_HAVE_PKG_SUITESPARSE 1\n\n/* Define to 1 if the pkg package is available */\n#cmakedefine ASP_HAVE_PKG_SUPERLU 1\n\n/* Define to 1 if the SUPERLU_PLAIN package is available. */\n#cmakedefine ASP_HAVE_PKG_SUPERLU_PLAIN 1\n\n/* Define to 1 if the SUPERLU_STATIC package is available. */\n#cmakedefine ASP_HAVE_PKG_SUPERLU_STATIC 1\n\n/* Define to 1 if the SUPERLU_VER_30 package is available. */\n#cmakedefine ASP_HAVE_PKG_SUPERLU_VER_30 1\n\n/* Define to 1 if the TCMALLOC package is available. */\n#cmakedefine ASP_HAVE_PKG_TCMALLOC 1\n\n/* Define to 1 if the THREADS package is available. */\n#cmakedefine ASP_HAVE_PKG_THREADS 1\n\n/* Define to 1 if the TIFF package is available. */\n#cmakedefine ASP_HAVE_PKG_TIFF 1\n\n/* Define to 1 if the TIF_MOSAIC app is available. */\n//#cmakedefine ASP_HAVE_PKG_TIF_MOSAIC\n\n/* Define to 1 if the VW package is available. */\n//#cmakedefine ASP_HAVE_PKG_VW\n\n/* Define to 1 if the pkg package is available */\n//#cmakedefine ASP_HAVE_PKG_VW_ALL\n\n/* Define to 1 if the VW_BUNDLEADJUSTMENT package is available. */\n//#cmakedefine ASP_HAVE_PKG_VW_BUNDLEADJUSTMENT\n\n/* Define to 1 if the VW_CAMERA package is available. */\n//#cmakedefine ASP_HAVE_PKG_VW_CAMERA\n\n/* Define to 1 if the VW_CARTOGRAPHY package is available. */\n//#cmakedefine ASP_HAVE_PKG_VW_CARTOGRAPHY\n\n/* Define to 1 if the VW_CORE package is available. */\n//#cmakedefine ASP_HAVE_PKG_VW_CORE\n\n/* Define to 1 if the VW_FILEIO package is available. */\n//#cmakedefine ASP_HAVE_PKG_VW_FILEIO\n\n/* Define to 1 if the VW_GEOMETRY package is available. */\n//#cmakedefine ASP_HAVE_PKG_VW_GEOMETRY\n\n/* Define to 1 if the VW_IMAGE package is available. */\n//#cmakedefine ASP_HAVE_PKG_VW_IMAGE\n\n/* Define to 1 if the VW_INTEREST_POINT package is available. */\n//#cmakedefine ASP_HAVE_PKG_VW_INTEREST_POINT\n\n/* Define to 1 if the VW_MATH package is available. */\n//#cmakedefine ASP_HAVE_PKG_VW_MATH\n\n/* Define to 1 if the VW_MOSAIC package is available. */\n//#cmakedefine ASP_HAVE_PKG_VW_MOSAIC\n\n/* Define to 1 if the VW_STEREO package is available. */\n//#cmakedefine ASP_HAVE_PKG_VW_STEREO\n\n/* Define to 1 if the WV_CORRECT app is available. */\n//#cmakedefine ASP_HAVE_PKG_WV_CORRECT\n\n/* Define to 1 if the X11 package is available. */\n#cmakedefine ASP_HAVE_PKG_X11 1\n\n/* Define to 1 if the XERCESC package is available. */\n#cmakedefine ASP_HAVE_PKG_XERCESC 1\n\n/* Define to 1 if the Z package is available. */\n#cmakedefine ASP_HAVE_PKG_Z 1\n\n/* Define to 1 if you have the <pwd.h> header file. */\n#cmakedefine HAVE_PWD_H 1\n\n/* Define to 1 if you have the <stdint.h> header file. */\n#cmakedefine HAVE_STDINT_H 1\n\n/* Define to 1 if you have the <stdlib.h> header file. */\n#cmakedefine HAVE_STDLIB_H 1\n\n/* Define to 1 if you have the <strings.h> header file. */\n#cmakedefine HAVE_STRINGS_H 1\n\n/* Define to 1 if you have the <string.h> header file. */\n#cmakedefine HAVE_STRING_H 1\n\n/* Define to 1 if you have the <sys/stat.h> header file. */\n#cmakedefine HAVE_SYS_STAT_H 1\n\n/* Define to 1 if you have the <sys/types.h> header file. */\n#cmakedefine HAVE_SYS_TYPES_H 1\n\n/* Define to 1 if you have the <unistd.h> header file. */\n#cmakedefine HAVE_UNISTD_H 1\n\n/* The version of ISIS that this software was built against. */\n#define ASP_ISIS_VERSION \"@ISIS_VERSION@\"\n\n/* Define to the sub-directory in which libtool stores uninstalled libraries.\n   */\n//#cmakedefine LT_OBJDIR\n\n/* set the default number of processing threads for multi-threaded operations\n   */\n#cmakedefine NUM_THREADS\n\n/* Building on OSX? */\n#cmakedefine ASP_OSX_BUILD 1\n\n/* Name of the package */\n#define ASP_PACKAGE StereoPipeline\n\n/* Define the address where bug reports for this package should be sent. */\n#define ASP_PACKAGE_BUGREPORT \"@PACKAGE_BUGREPORT@\"\n\n/* Define the full name of this package. */\n#define ASP_PACKAGE_NAME \"@PACKAGE_NAME@\"\n\n/* Define the full name and version of this package. */\n#define ASP_PACKAGE_STRING \"@PACKAGE_STRING@\"\n\n/* Define the one symbol short name of this package. */\n#define ASP_PACKAGE_TARNAME StereoPipeline\n\n/* Define the version of this package. */\n#define ASP_PACKAGE_VERSION \"@PACKAGE_VERSION@\"\n\n/* Set to 1 if you have the ANSI C header files. */\n#cmakedefine STDC_HEADERS 1\n\n/* The path to the ASP dependencies (useful in dev mode). */\n#define ASP_DEPS_DIR \"@ASP_DEPS_DIR@\"\n\n/* Version number of package */\n#define ASP_VERSION \"@PACKAGE_VERSION@\"\n\n// Check to make sure the user is using the same version of Boost\n// headers that the software was built with.\n//#include <boost/version.hpp>\n//#if BOOST_VERSION != ASP_BOOST_VERSION\n//#error You are using a different version of Boost than you used to build _!\n//#endif\n"
  },
  {
    "path": "src/asp/asp_date_config.h.in",
    "content": "/* \n   File src/asp/asp_date_config.h.in. Used by CMake to generate\n   asp_date_config.h. This is kept separate from asp_config.h since\n   the build date and commit id changes often when the software is\n   built locally, which results in massive recompilation. This way only \n   Common.cc will get recompiled.\n*/\n\n#define ASP_BUILD_DATE \"@ASP_BUILD_DATE@\"\n\n#define ASP_COMMIT_ID \"@ASP_COMMIT_ID@\"\n"
  },
  {
    "path": "src/test/Helpers.h",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n#ifndef __VW_TESTS_CONFIG_TEST_H__\n#define __VW_TESTS_CONFIG_TEST_H__\n\n#include <vw/vw_config.h>\n#include <vw/Core/Log.h>\n#include <vw/Math/Vector.h>\n#include <vw/Math/Matrix.h>\n#include <vw/Image/PixelTypeInfo.h>\n#include <vw/Image/PixelMath.h>\n\n// Turn off warnings about things we can't control\n#define BOOST_ALLOW_DEPRECATED_HEADERS\n#define BOOST_BIND_GLOBAL_PLACEHOLDERS  \n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wdeprecated-declarations\"\n#pragma GCC diagnostic ignored \"-Wunknown-pragmas\"\n#include <boost/function.hpp>\n#include <boost/range/iterator_range_core.hpp>\n#pragma GCC diagnostic pop\n\n#include <gtest/gtest_ASP.h>\n\n#include <cmath>\n#include <complex>\n#include <string>\n#include <queue>\n#include <cstdlib>\n\n#if defined(VW_ENABLE_EXCEPTIONS) && (VW_ENABLE_EXCEPTIONS==1)\n#define HAS_EXCEPTIONS(x) x\n#else\n#define HAS_EXCEPTIONS(x) DISABLED_ ## x\n#endif\n\n#if defined(VW_ENABLE_CONFIG_FILE) && (VW_ENABLE_CONFIG_FILE==1)\n#define HAS_CONFIG_FILE(x) x\n#else\n#define HAS_CONFIG_FILE(x) DISABLED_ ## x\n#endif\n\nnamespace gi = ::testing::internal;\n\nnamespace vw { namespace test { }}\nnamespace t  = vw::test;\n\nnamespace vw {\n  namespace test {\n\nusing namespace ::testing;\n\n#ifndef TEST_OBJDIR\n#error TEST_OBJDIR is not defined! Define it before including this header.\n#endif\n\n// Create a temporary filename that is unlinked when constructed and destructed\nclass UnlinkName : public std::string {\n  public:\n    UnlinkName() {}\n    UnlinkName(const std::string& base, const std::string& directory=TEST_OBJDIR);\n    UnlinkName(const char *base,        const std::string& directory=TEST_OBJDIR);\n    ~UnlinkName();\n};\n\n// A getenv with a default value\nstd::string getenv2(const char *key, const std::string& Default);\n\n// Fetch the seed we used. You should only need to do this if you're\n// initializing a different random number generator (i.e. boost::rand48). Do\n// NOT use this to reseed a global random number generator.\nuint32 get_random_seed();\n\n// reduce the damage from using gtest internal bits, and make sure uint8 is\n// seen as numeric.\ntemplate <typename T>\n::std::string format(const T& x) {\n  return PrintToString(_numeric(x));\n}\n\n// Value diffs\ntemplate <typename ElemT, typename Elem2T>\ndouble value_diff(const vw::PixelMathBase<ElemT>& a, const vw::PixelMathBase<Elem2T>& b) {\n  BOOST_STATIC_ASSERT((boost::is_same<ElemT, Elem2T>::value));\n  typedef typename CompoundChannelType<ElemT>::type channel_type;\n  double acc = 0.0;\n  for( size_t c=0; c < PixelNumChannels<ElemT>::value; ++c ) {\n    channel_type const& a_x = compound_select_channel<channel_type const&>(a.impl(),c);\n    channel_type const& b_x = compound_select_channel<channel_type const&>(b.impl(),c);\n    double diff = double(a_x) - double(b_x);\n    acc += diff*diff;\n  }\n  return ::sqrt(acc);\n}\n\ntemplate <typename T1, typename T2>\ndouble value_diff(const std::complex<T1>& a, const std::complex<T2>& b) {\n  return std::abs(std::complex<double>(a) - std::complex<double>(b));\n}\n\ntemplate <typename T1, typename T2>\nstruct both_are_arithmetic : boost::mpl::and_<boost::is_arithmetic<T1>, boost::is_arithmetic<T2> > {};\n\ntemplate <typename T1, typename T2>\ntypename boost::enable_if<both_are_arithmetic<T1,T2>, double>::type\nvalue_diff(const T1& a, const T2& b) {\n  BOOST_STATIC_ASSERT(boost::is_arithmetic<T1>::value);\n  BOOST_STATIC_ASSERT(boost::is_arithmetic<T2>::value);\n  return ::fabs(double(a) - double(b));\n}\n\n// A version of std::mismatch that returns the set of differences rather than\n// just the first\ntemplate <class InputIterator1, class InputIterator2, class Pred>\nvoid mismatch_queue(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2,\n                    std::queue<std::pair<InputIterator1, InputIterator2> >& answer,\n                    const Pred& p)\n{\n  while ( first1!=last1 ) {\n    if (!p(*first1, *first2))\n      answer.push(std::make_pair(first1, first2));\n    ++first1; ++first2;\n  }\n}\n\ntemplate <typename ImplT>\nclass CmpWorker {\n  public:\n    inline ImplT& impl() { return static_cast<ImplT&>(*this); }\n    inline ImplT const& impl() const { return static_cast<ImplT const&>(*this); }\n\n    template <typename T1, typename T2>\n    bool operator()(const T1& e, const T2& a) const {return impl()(e, a);}\n\n    template <typename T1, typename T2>\n    Message what(const std::string& ename, const std::string& aname, const T1& e, const T2& a) const {\n      return impl().what(ename, aname, e, a);\n    }\n};\n\nclass CmpEqual : public CmpWorker<CmpEqual> {\n  public:\n    template <typename T1, typename T2>\n    bool operator()(const T1& a, const T2& b) const { return a == b; }\n\n    template <typename T1, typename T2>\n    Message what(const std::string& ename, const std::string& aname, const T1& e, const T2& a) const {\n      return Message() << gi::EqFailure(ename.c_str(), aname.c_str(), t::format(e), t::format(a), false).message();\n    }\n};\n\nclass CmpTypeEqual : public CmpWorker<CmpTypeEqual> {\n  public:\n    template <typename T1, typename T2>\n    bool operator()(const T1& a, const T2& b) const {\n      return boost::is_same<T1,T2>::value && a == b;\n    }\n\n    template <typename T1, typename T2>\n    Message what(const std::string& ename, const std::string& aname, const T1& e, const T2& a) const {\n      if (!boost::is_same<T1,T2>::value)\n        return Message() << ename << \" and \" << aname << \" are not the same type\";\n      return Message() << gi::EqFailure(ename.c_str(), aname.c_str(), t::format(e), t::format(a), false).message();\n    }\n};\n\nclass CmpNear : public CmpWorker<CmpNear> {\n    const char *dexpr;\n    const double& delta;\n  public:\n    CmpNear(const char* dexpr, const double& delta) : dexpr(dexpr), delta(delta) {}\n\n    template <typename T1, typename T2>\n    bool operator()(const T1& a, const T2& b) const { return value_diff(a, b) <= delta; }\n\n    template <typename T1, typename T2>\n    Message what(const std::string& ename, const std::string& aname, const T1& e, const T2& a) const {\n      Message msg;\n      msg << \"The difference between \"\n          << ename   << \" and \" << aname\n          << \" is \"  << t::format(value_diff(e, a))\n          << \", which exceeds \" << dexpr << \", where\\n\"\n          << ename << \" evaluates to \" << t::format(e) << \",\\n\"\n          << aname << \" evaluates to \" << t::format(a)\n          << \", and\\n\" << dexpr << \" evaluates to \" << t::format(delta) << \".\";\n      return msg;\n    }\n};\n\n#if 0\ntemplate <typename ExpectT>\nstruct CmpULP : public CmpWorker<CmpULP<ExpectT> > {\n  BOOST_STATIC_ASSERT(boost::is_floating_point<ExpectT>::value);\n  public:\n    template <typename ActualT>\n    bool operator()(const ExpectT& a, const ActualT& b) const {\n      const gi::FloatingPoint<ExpectT> lhs(a), rhs(b);\n      return lhs.AlmostEquals(rhs);\n    }\n\n    template <typename ActualT>\n    Message what(const std::string& ename, const std::string& aname, const ExpectT& e, const ActualT& a) const {\n      std::ostringstream es, as;\n      es << std::setprecision(std::numeric_limits<ExpectT>::digits10 + 2) << e;\n      as << std::setprecision(std::numeric_limits<ExpectT>::digits10 + 2) << a;\n      return Message() << gi::EqFailure(ename.c_str(), aname.c_str(), es.str(), as.str(), false);\n    }\n};\n#endif\n\ntemplate <typename CmpT>\nclass _CheckOne {\n    const CmpT& cmp;\n  public:\n    _CheckOne() : cmp(CmpT()) {}\n    _CheckOne(const CmpT& cmp) : cmp(cmp) {}\n\n    template <typename ExpectT, typename ActualT>\n    AssertionResult operator()(const char* ename, const char* aname, const ExpectT& e, const ActualT& a) const\n    {\n      if (cmp(e, a))\n        return AssertionSuccess();\n      return AssertionFailure() << cmp.what(ename, aname, e, a);\n    }\n};\ntemplate <typename CmpT>\n_CheckOne<CmpT> check_one(const CmpT& cmp) {\n  return _CheckOne<CmpT>(cmp);\n}\n\ntemplate <typename CmpT>\nclass _CheckRange {\n    const CmpT& cmp;\n  public:\n    _CheckRange() : cmp(CmpT()) {}\n    _CheckRange(const CmpT& cmp) : cmp(cmp) {}\n\n    template <typename Range1T, typename Range2T>\n    AssertionResult operator()(const char* ename, const char* aname,\n                               const Range1T& e, const Range2T& a) const\n    {\n      if (a.size() != e.size())\n        return AssertionFailure()\n                << \"Iterator ranges (\" << ename << \") and (\" << aname\n                << \") represent different-sized ranges.\";\n\n      typedef std::pair<typename Range1T::const_iterator, typename Range2T::const_iterator> pair_t;\n\n      std::queue<pair_t> ret;\n      mismatch_queue(e.begin(), e.end(), a.begin(), ret, cmp);\n\n      if (ret.empty())\n        return AssertionSuccess();\n\n      Message msg;\n      bool need_newline = false;\n      while (!ret.empty()) {\n        const pair_t& r = ret.front();\n        const std::string idx = \"[\" + stringify(std::distance(e.begin(), r.first)) + \"]\";\n        if (need_newline)\n          msg << std::endl;\n        msg << cmp.what(ename + idx, aname + idx, *(r.first), *(r.second));\n        need_newline = true;\n        ret.pop();\n      }\n      return AssertionFailure(msg);\n    }\n\n    template <typename Iter1T, typename Iter2T>\n    AssertionResult operator()(const char* e0name, const char* /*e1name*/,\n                               const char* a0name, const char* /*a1name*/,\n                               const Iter1T& e0, const Iter1T& e1,\n                               const Iter2T& a0, const Iter2T& a1) const\n    {\n      return this->operator()(e0name, a0name, boost::make_iterator_range(e0, e1), boost::make_iterator_range(a0, a1));\n    }\n};\n\ntemplate <typename CmpT>\n_CheckRange<CmpT> check_range(const CmpT& cmp) {\n  return _CheckRange<CmpT>(cmp);\n}\n\ntemplate <typename CmpT>\nclass _CheckNDRange {\n    const CmpT& cmp;\n\n    typedef Vector<size_t, 0> SVec;\n\n    template <typename T>\n    SVec size_helper(const MatrixBase<T>& m) {return Vector<size_t, 2>(m.impl().rows(), m.impl().cols());}\n\n    template <typename T>\n    SVec size_helper(const ImageViewBase<T>& m) {return Vector<size_t, 3>(m.impl().planes(), m.impl().rows(), m.impl().cols());}\n\n    template <typename T>\n    SVec size_helper(const VectorBase<T>& m) {return m.size();}\n\n    SVec stride_from_size(const SVec& size) {\n      SVec stride(size.size());\n      stride(size.size()-1) = 1;\n      for (ssize_t i = stride.size()-2; i >= 0; --i)\n        stride[i] = size[i+1] * stride[i+1];\n      return stride;\n    }\n\n    template <typename IterT1>\n    std::string to_idx(const SVec& stride, const IterT1& begin, const IterT1& wrong) {\n      std::ostringstream ss;\n      ss << \"[\";\n      bool comma = false;\n      ssize_t d = std::distance(begin, wrong);\n      for (size_t i = 0; i < stride.size(); ++i) {\n        if (comma)\n          ss << ',';\n        ss << size_t(d / stride[i]);\n        d = d % stride[i];\n        comma = true;\n      }\n      ss << \"]\";\n      return ss.str();\n    }\n\n  public:\n    _CheckNDRange() : cmp(CmpT()) {}\n    _CheckNDRange(const CmpT& cmp) : cmp(cmp) {}\n\n    template <typename T1, typename T2>\n    AssertionResult operator()(const char* ename, const char* aname, const T1& e, const T2& a)\n    {\n      SVec esize = size_helper(e), asize = size_helper(a);\n\n      if ( esize != asize )\n        return AssertionFailure() << \"Cannot compare \" << ename << \" and \" << aname << \": Different size: \"\n                                  << esize << \" != \" << asize;\n\n      typedef std::pair<typename T1::const_iterator, typename T2::const_iterator> pair_t;\n      std::queue<pair_t> ret;\n      mismatch_queue(e.begin(), e.end(), a.begin(), ret, cmp);\n\n      if (ret.empty())\n        return AssertionSuccess();\n\n      SVec stride = stride_from_size(esize);\n\n      Message msg;\n      bool need_newline = false;\n      while (!ret.empty()) {\n        const pair_t& r = ret.front();\n        const std::string idx = to_idx(stride, e.begin(), r.first);\n        if (need_newline)\n          msg << std::endl;\n        msg << cmp.what(ename + idx, aname + idx, *(r.first), *(r.second));\n        need_newline = true;\n        ret.pop();\n      }\n      return AssertionFailure(msg);\n    }\n};\n\ntemplate <typename CmpT>\n_CheckNDRange<CmpT> check_nd_range(const CmpT& cmp) {\n  return _CheckNDRange<CmpT>(cmp);\n}\n\n#define EXPECT_RANGE_EQ(expect0, expect1, actual0, actual1) \\\n  EXPECT_PRED_FORMAT4(t::check_range(t::CmpEqual()), expect0, expect1, actual0, actual1)\n#define ASSERT_RANGE_EQ(expect0, expect1, actual0, actual1) \\\n  ASSERT_PRED_FORMAT4(t::check_range(t::CmpEqual()), expect0, expect1, actual0, actual1)\n#define EXPECT_RANGE_NEAR(expect0, expect1, actual0, actual1, delta) \\\n  EXPECT_PRED_FORMAT4(t::check_range(t::CmpNear(#delta, delta)), expect0, expect1, actual0, actual1)\n#define ASSERT_RANGE_NEAR(expect0, expect1, actual0, actual1, delta) \\\n  ASSERT_PRED_FORMAT4(t::check_range(t::CmpNear(#delta, delta)), expect0, expect1, actual0, actual1)\n\n#define EXPECT_SEQ_EQ(expect, actual)\\\n  EXPECT_PRED_FORMAT2(t::check_nd_range(t::CmpEqual()), expect, actual)\n#define ASSERT_SEQ_EQ(expect, actual)\\\n  ASSERT_PRED_FORMAT2(t::check_nd_range(t::CmpEqual()), expect, actual)\n#define EXPECT_SEQ_NEAR(expect, actual, delta)\\\n  EXPECT_PRED_FORMAT2(t::check_nd_range(t::CmpNear(#delta, delta)), expect, actual)\n#define ASSERT_SEQ_NEAR(expect, actual, delta)\\\n  ASSERT_PRED_FORMAT2(t::check_nd_range(t::CmpNear(#delta, delta)), expect, actual)\n\n#define EXPECT_VECTOR_EQ(expect, actual)\\\n  EXPECT_PRED_FORMAT2(t::check_range(t::CmpEqual()), expect, actual)\n#define ASSERT_VECTOR_EQ(expect, actual)\\\n  ASSERT_PRED_FORMAT2(t::check_range(t::CmpEqual()), expect, actual)\n#define EXPECT_VECTOR_NEAR(expect, actual, delta)\\\n  EXPECT_PRED_FORMAT2(t::check_range(t::CmpNear(#delta, delta)), expect, actual)\n#define ASSERT_VECTOR_NEAR(expect, actual, delta)\\\n  ASSERT_PRED_FORMAT2(t::check_range(t::CmpNear(#delta, delta)), expect, actual)\n\n#define EXPECT_TYPE_EQ( expect, actual )\\\n  EXPECT_PRED_FORMAT2(t::check_one(t::CmpTypeEqual()), expect, actual )\n#define ASSERT_TYPE_EQ( expect, actual )\\\n  ASSERT_PRED_FORMAT2(t::check_one(t::CmpTypeEqual()), expect, actual )\n\n#define EXPECT_PIXEL_NEAR(expect, actual, delta)\\\n  EXPECT_PRED_FORMAT2(t::check_one(t::CmpNear(#delta, delta)), expect, actual)\n#define ASSERT_PIXEL_NEAR(expect, actual, delta)\\\n  ASSERT_PRED_FORMAT2(t::check_one(t::CmpNear(#delta, delta)), expect, actual)\n\n#define EXPECT_VW_EQ(expect, actual)\\\n  EXPECT_PRED_FORMAT2(t::check_one(t::CmpTypeEqual()), expect, actual)\n#define ASSERT_VW_EQ(expect, actual)\\\n  ASSERT_PRED_FORMAT2(t::check_one(t::CmpTypeEqual()), expect, actual)\n\n#define VW_TEST_THROW_(statement, expected_exception, expected_substr, fail) \\\n  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \\\n  if (::testing::internal::ConstCharPtr gtest_msg = \"\") { \\\n    bool gtest_caught_expected = false; \\\n    try { \\\n      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \\\n    } \\\n    catch (expected_exception const& e) { \\\n      gtest_caught_expected = true; \\\n      GTEST_PRED_FORMAT2_(t::IsSubstring, expected_substr, e.what(), fail);\\\n    } \\\n    catch (...) { \\\n      gtest_msg.value = \\\n          \"Expected: \" #statement \" throws an exception of type \" \\\n          #expected_exception \".\\n  Actual: it throws a different type.\"; \\\n      goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \\\n    } \\\n    if (!gtest_caught_expected) { \\\n      gtest_msg.value = \\\n          \"Expected: \" #statement \" throws an exception of type \" \\\n          #expected_exception \".\\n  Actual: it throws nothing.\"; \\\n      goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \\\n    } \\\n  } else \\\n    GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__): \\\n      fail(gtest_msg.value)\n\n// these are unlikely to work right in death tests or other weird circumstances.\n#define EXPECT_THROW_MSG(statement, expected_exception, expected_substr) \\\n  VW_TEST_THROW_(statement, expected_exception, expected_substr, GTEST_NONFATAL_FAILURE_)\n#define ASSERT_THROW_MSG(statement, expected_exception, expected_substr) \\\n  VW_TEST_THROW_(statement, expected_exception, expected_substr, GTEST_FATAL_FAILURE_)\n\n// DEPRECATED\n#define EXPECT_MATRIX_FLOAT_EQ(e, a)          EXPECT_MATRIX_NEAR(e, a, 1e20)\n#define EXPECT_MATRIX_DOUBLE_EQ(e, a)         EXPECT_MATRIX_NEAR(e, a, 1e45)\n#define EXPECT_COMPLEX_MATRIX_NEAR(e, a, d)   EXPECT_MATRIX_NEAR(e, a, d)\n#define EXPECT_VECTOR_FLOAT_EQ(e, a)          EXPECT_VECTOR_NEAR(e, a, 1e20)\n#define EXPECT_VECTOR_DOUBLE_EQ(e, a)         EXPECT_VECTOR_NEAR(e, a, 1e45)\n#define EXPECT_PIXEL_EQ(e, a)                 EXPECT_TYPE_EQ(e,a)\n#define ASSERT_PIXEL_EQ(e, a)                 ASSERT_TYPE_EQ(e,a)\n#define EXPECT_MATRIX_EQ(e, a)                EXPECT_SEQ_EQ(e,a)\n#define ASSERT_MATRIX_EQ(e, a)                ASSERT_SEQ_EQ(e,a)\n#define EXPECT_MATRIX_NEAR(e, a, delta)       EXPECT_SEQ_NEAR(e,a,delta)\n#define ASSERT_MATRIX_NEAR(e, a, delta)       ASSERT_SEQ_NEAR(e,a,delta)\n\n}} // namespace t\n\n#endif\n"
  },
  {
    "path": "src/test/test_main.cc",
    "content": "// __BEGIN_LICENSE__\n//  Copyright (c) 2009-2013, United States Government as represented by the\n//  Administrator of the National Aeronautics and Space Administration. All\n//  rights reserved.\n//\n//  The NGT platform is licensed under the Apache License, Version 2.0 (the\n//  \"License\"); you may not use this file except in compliance with the\n//  License. You may obtain a copy of the License at\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n// __END_LICENSE__\n\n\n#include <gtest/gtest_ASP.h>\n#include <test/Helpers.h>\n#include <vw/Core/Settings.h>\n\n#include <boost/filesystem/operations.hpp>\nnamespace fs = boost::filesystem;\n\nnamespace {\n  vw::uint32 SEED;\n}\n\nint main(int argc, char **argv) {\n  // Disable the user's config file\n  vw::vw_settings().set_rc_filename(\"\");\n  ::testing::InitGoogleTest(&argc, argv);\n\n  // Default to the \"threadsafe\" style because we can't delete our singletons\n  // yet; this style of test launches a new process, so the singletons are\n  // fresh.\n  ::testing::FLAGS_gtest_death_test_style = \"threadsafe\";\n\n  if (getenv(\"VW_DEBUG\")) {\n    vw::vw_log().console_log().rule_set().add_rule(vw::VerboseDebugMessage, \"*\");\n  }\n\n  // TODO: Make it so the seed is settable so we can reproduce failures in\n  // probabilistic algorithms. This uses clock() instead of time() because\n  // clock() (being measured in \"processor ticks\" instead of seconds) is likely\n  // to exhibit more variation when tests are run many times in a short time\n  // span.\n  SEED = boost::numeric_cast<unsigned int>(clock());\n  std::srand(SEED);\n\n  fs::path start_dir(TEST_SRCDIR);\n\n  fs::current_path(start_dir);\n  VW_ASSERT(fs::equivalent(fs::current_path(), start_dir),\n            vw::LogicErr() << \"Could not change the working directory to \" << start_dir);\n\n  int ret = RUN_ALL_TESTS();\n  fs::path end_dir = fs::current_path();\n\n  VW_ASSERT( fs::equivalent(start_dir, end_dir),\n             vw::LogicErr() << \"Something changed the working directory\");\n  return ret;\n}\n\nnamespace vw {\nnamespace test {\n\nUnlinkName::UnlinkName(const std::string& base, const std::string& directory)\n  : std::string(directory + \"/\" + base) {\n\n  VW_ASSERT(!directory.empty(), ArgumentErr() << \"An empty directory path is dangerous\");\n  fs::remove_all(this->c_str());\n}\n\nUnlinkName::UnlinkName(const char *base, const std::string& directory)\n  : std::string(directory + \"/\" + base) {\n\n  VW_ASSERT(!directory.empty(), ArgumentErr() << \"An empty directory path is dangerous\");\n  fs::remove_all(this->c_str());\n}\n\nUnlinkName::~UnlinkName() {\n  if (!this->empty())\n    fs::remove_all(this->c_str());\n}\n\nstd::string getenv2(const char *key, const std::string& Default) {\n  const char *val = getenv(key);\n  return val ? val : Default;\n}\n\nvw::uint32 get_random_seed() {\n  return SEED;\n}\n\n}} // namespace vw::test\n"
  },
  {
    "path": "stereo.default.example",
    "content": "# -*- mode: sh -*-\n\n# Pre-Processing / stereo_pprc\n################################################################\n\n# Pre-alignment options\n#\n# Available choices are (however not all are supported by all sessions):\n#    NONE           (Recommended for anything map projected)\n#    EPIPOLAR       (Recommended for Pinhole Sessions)\n#    HOMOGRAPHY     (Recommended for ISIS wide-angle shots)\n#    AFFINEEPIPOLAR (Recommended for ISIS narrow-angle and DG sessions)\n#    LOCAL_EPIPOLAR (When affineepipolar is not aligning accurately enough,\n#                    and for external stereo algorithms)\nalignment-method affineepipolar\n\n# Intensity Normalization\nforce-use-entire-range       # Use entire input range\n\n# Select a preprocessing filter:\n#\n# 0 - None\n# 1 - Subtracted Mean\n# 2 - Laplacian of Gaussian (recommended)\nprefilter-mode 2\n\n# Kernel size (1-sigma) for pre-processing\n#\n# Recommend 1.4 px for Laplacian of Gaussian\n# Recommend 25 px for Subtracted Mean\nprefilter-kernel-width 1.4\n\n# Integer Correlation / stereo_corr\n################################################################\n\n# Select a stereo algorithm. See the documentation describing\n# stereo.default for more details. Options are:\n#\n# asp_bm  (or use '0') - the ASP implementation of Block Matching.\n# asp_sgm (or use '1') - the ASP implementation of SGM.\n# asp_mgm (or use '2') - the ASP implementation of MGM.\n# asp_final_mgm (or use '3') - ASP MGM at the the finest level.\n# mgm - the originally published MGM implementation.\n\nstereo-algorithm asp_bm\n\n# Select a cost function to use for initialization:\n#\n# 0 - absolute difference (fast)\n# 1 - squared difference  (faster .. but usually bad)\n# 2 - normalized cross correlation (recommended)\ncost-mode 2\n\n# Initialization step: correlation kernel size\ncorr-kernel 21 21\n\n# Initialization step: correlation window size\n# corr-search -80 -2 20 2\n\n# Subpixel Refinement / stereo_rfne\n################################################################\n\n# Subpixel step: subpixel modes\n#\n# 0 - disable subpixel correlation (fastest)\n# 1 - parabola fitting (draft mode - not as accurate)\n# 2 - affine adaptive window, bayes EM weighting (slower, but much more accurate)\n# 3 - affine window, (intermediate speed, results similar to bayes EM)\nsubpixel-mode 1\n\n# Subpixel step: correlation kernel size\nsubpixel-kernel 21 21\n\n# Post Filtering / stereo_fltr\n################################################################\n\n# Automatic \"erode\" low confidence pixels\nfilter-mode 1\nrm-half-kernel 5 5\nmax-mean-diff 3\nrm-min-matches 60\nrm-threshold 3\nrm-cleanup-passes 1\n\n# Triangulation / stereo_tri\n################################################################\n\n# Size max of the universe in meters and altitude off the ground.\n# Setting both values to zero turns this post-processing step off.\nnear-universe-radius 0.0\nfar-universe-radius 0.0\n"
  },
  {
    "path": "thirdparty/autotroll.mak",
    "content": "# __BEGIN_LICENSE__\n# Copyright (C) 2006-2011 United States Government as represented by\n# the Administrator of the National Aeronautics and Space Administration.\n# All Rights Reserved.\n# __END_LICENSE__\n\n\n# Makerules.\n# This file is part of AutoTroll.\n# Copyright (C) 2006  Benoit Sigoure.\n#\n# AutoTroll is free software; you can redistribute it and/or\n# modify it under the terms of the GNU General Public License\n# as published by the Free Software Foundation; either version 2\n# of the License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,\n# USA.\n\n # ------------- #\n # DOCUMENTATION #\n # ------------- #\n\n# See autotroll.m4 :)\n\n\nSUFFIXES += .moc.cpp .moc.cc .moc.cxx .moc.C .h .hh .ui .ui.h .ui.hh\t\\\n\t.qrc .qrc.cpp .qrc.cc .qrc.cxx .qrc.C\n\n# --- #\n# MOC #\n# --- #\n\n.hh.moc.cpp:\n\t$(MOC) $(QT_CPPFLAGS) $< -o $@\n.h.moc.cpp:\n\t$(MOC) $(QT_CPPFLAGS) $< -o $@\n\n.hh.moc.cc:\n\t$(MOC) $(QT_CPPFLAGS) $< -o $@\n.h.moc.cc:\n\t$(MOC) $(QT_CPPFLAGS) $< -o $@\n\n.hh.moc.cxx:\n\t$(MOC) $(QT_CPPFLAGS) $< -o $@\n.h.moc.cxx:\n\t$(MOC) $(QT_CPPFLAGS) $< -o $@\n\n.hh.moc.C:\n\t$(MOC) $(QT_CPPFLAGS) $< -o $@\n.h.moc.C:\n\t$(MOC) $(QT_CPPFLAGS) $< -o $@\n\n# --- #\n# UIC #\n# --- #\n\n.ui.ui.hh:\n\t$(UIC) $< -o $@\n\n.ui.ui.h:\n\t$(UIC) $< -o $@\n\n# --- #\n# RCC #\n# --- #\n\n.qrc.qrc.cpp:\n\t$(RCC) -name `echo \"$<\" | sed 's|^.*/\\(.*\\)\\.qrc$$|\\1|'` $< -o $@\n\n.qrc.qrc.cc:\n\t$(RCC) -name `echo \"$<\" | sed 's|^.*/\\(.*\\)\\.qrc$$|\\1|'` $< -o $@\n\n.qrc.qrc.cxx:\n\t$(RCC) -name `echo \"$<\" | sed 's|^.*/\\(.*\\)\\.qrc$$|\\1|'` $< -o $@\n\n.qrc.qrc.C:\n\t$(RCC) -name `echo \"$<\" | sed 's|^.*/\\(.*\\)\\.qrc$$|\\1|'` $< -o $@\n\nDISTCLEANFILES = $(BUILT_SOURCES)\n"
  },
  {
    "path": "thirdparty/gtest/CHANGES",
    "content": "Changes for 1.6.0:\n\n* New feature: ADD_FAILURE_AT() for reporting a test failure at the\n  given source location -- useful for writing testing utilities.\n* New feature: the universal value printer is moved from Google Mock\n  to Google Test.\n* New feature: type parameters and value parameters are reported in\n  the XML report now.\n* A gtest_disable_pthreads CMake option.\n* Colored output works in GNU Screen sessions now.\n* Parameters of value-parameterized tests are now printed in the\n  textual output.\n* Failures from ad hoc test assertions run before RUN_ALL_TESTS() are\n  now correctly reported.\n* Arguments of ASSERT_XY and EXPECT_XY no longer need to support << to\n  ostream.\n* More complete handling of exceptions.\n* GTEST_ASSERT_XY can be used instead of ASSERT_XY in case the latter\n  name is already used by another library.\n* --gtest_catch_exceptions is now true by default, allowing a test\n  program to continue after an exception is thrown.\n* Value-parameterized test fixtures can now derive from Test and\n  WithParamInterface<T> separately, easing conversion of legacy tests.\n* Death test messages are clearly marked to make them more\n  distinguishable from other messages.\n* Compatibility fixes for Android, Google Native Client, MinGW, HP UX,\n  PowerPC, Lucid autotools, libCStd, Sun C++, Borland C++ Builder (Code Gear),\n  IBM XL C++ (Visual Age C++), and C++0x.\n* Bug fixes and implementation clean-ups.\n* Potentially incompatible changes: disables the harmful 'make install'\n  command in autotools.\n\nChanges for 1.5.0:\n\n * New feature: assertions can be safely called in multiple threads\n   where the pthreads library is available.\n * New feature: predicates used inside EXPECT_TRUE() and friends\n   can now generate custom failure messages.\n * New feature: Google Test can now be compiled as a DLL.\n * New feature: fused source files are included.\n * New feature: prints help when encountering unrecognized Google Test flags.\n * Experimental feature: CMake build script (requires CMake 2.6.4+).\n * Experimental feature: the Pump script for meta programming.\n * double values streamed to an assertion are printed with enough precision\n   to differentiate any two different values.\n * Google Test now works on Solaris and AIX.\n * Build and test script improvements.\n * Bug fixes and implementation clean-ups.\n\n Potentially breaking changes:\n\n * Stopped supporting VC++ 7.1 with exceptions disabled.\n * Dropped support for 'make install'.\n\nChanges for 1.4.0:\n\n * New feature: the event listener API\n * New feature: test shuffling\n * New feature: the XML report format is closer to junitreport and can\n   be parsed by Hudson now.\n * New feature: when a test runs under Visual Studio, its failures are\n   integrated in the IDE.\n * New feature: /MD(d) versions of VC++ projects.\n * New feature: elapsed time for the tests is printed by default.\n * New feature: comes with a TR1 tuple implementation such that Boost\n   is no longer needed for Combine().\n * New feature: EXPECT_DEATH_IF_SUPPORTED macro and friends.\n * New feature: the Xcode project can now produce static gtest\n   libraries in addition to a framework.\n * Compatibility fixes for Solaris, Cygwin, minGW, Windows Mobile,\n   Symbian, gcc, and C++Builder.\n * Bug fixes and implementation clean-ups.\n\nChanges for 1.3.0:\n\n * New feature: death tests on Windows, Cygwin, and Mac.\n * New feature: ability to use Google Test assertions in other testing\n   frameworks.\n * New feature: ability to run disabled test via\n   --gtest_also_run_disabled_tests.\n * New feature: the --help flag for printing the usage.\n * New feature: access to Google Test flag values in user code.\n * New feature: a script that packs Google Test into one .h and one\n   .cc file for easy deployment.\n * New feature: support for distributing test functions to multiple\n   machines (requires support from the test runner).\n * Bug fixes and implementation clean-ups.\n\nChanges for 1.2.1:\n\n * Compatibility fixes for Linux IA-64 and IBM z/OS.\n * Added support for using Boost and other TR1 implementations.\n * Changes to the build scripts to support upcoming release of Google C++\n   Mocking Framework.\n * Added Makefile to the distribution package.\n * Improved build instructions in README.\n\nChanges for 1.2.0:\n\n * New feature: value-parameterized tests.\n * New feature: the ASSERT/EXPECT_(NON)FATAL_FAILURE(_ON_ALL_THREADS)\n   macros.\n * Changed the XML report format to match JUnit/Ant's.\n * Added tests to the Xcode project.\n * Added scons/SConscript for building with SCons.\n * Added src/gtest-all.cc for building Google Test from a single file.\n * Fixed compatibility with Solaris and z/OS.\n * Enabled running Python tests on systems with python 2.3 installed,\n   e.g. Mac OS X 10.4.\n * Bug fixes.\n\nChanges for 1.1.0:\n\n * New feature: type-parameterized tests.\n * New feature: exception assertions.\n * New feature: printing elapsed time of tests.\n * Improved the robustness of death tests.\n * Added an Xcode project and samples.\n * Adjusted the output format on Windows to be understandable by Visual Studio.\n * Minor bug fixes.\n\nChanges for 1.0.1:\n\n * Added project files for Visual Studio 7.1.\n * Fixed issues with compiling on Mac OS X.\n * Fixed issues with compiling on Cygwin.\n\nChanges for 1.0.0:\n\n * Initial Open Source release of Google Test\n"
  },
  {
    "path": "thirdparty/gtest/CONTRIBUTORS",
    "content": "# This file contains a list of people who've made non-trivial\n# contribution to the Google C++ Testing Framework project.  People\n# who commit code to the project are encouraged to add their names\n# here.  Please keep the list sorted by first names.\n\nAjay Joshi <jaj@google.com>\nBalázs Dán <balazs.dan@gmail.com>\nBharat Mediratta <bharat@menalto.com>\nChandler Carruth <chandlerc@google.com>\nChris Prince <cprince@google.com>\nChris Taylor <taylorc@google.com>\nDan Egnor <egnor@google.com>\nEric Roman <eroman@chromium.org>\nHady Zalek <hady.zalek@gmail.com>\nJeffrey Yasskin <jyasskin@google.com>\nJói Sigurðsson <joi@google.com>\nKeir Mierle <mierle@gmail.com>\nKeith Ray <keith.ray@gmail.com>\nKenton Varda <kenton@google.com>\nManuel Klimek <klimek@google.com>\nMarkus Heule <markus.heule@gmail.com>\nMika Raento <mikie@iki.fi>\nMiklós Fazekas <mfazekas@szemafor.com>\nPasi Valminen <pasi.valminen@gmail.com>\nPatrick Hanna <phanna@google.com>\nPatrick Riley <pfr@google.com>\nPeter Kaminski <piotrk@google.com>\nPreston Jackson <preston.a.jackson@gmail.com>\nRainer Klaffenboeck <rainer.klaffenboeck@dynatrace.com>\nRuss Cox <rsc@google.com>\nRuss Rufer <russ@pentad.com>\nSean Mcafee <eefacm@gmail.com>\nSigurður Ásgeirsson <siggi@google.com>\nTracy Bialik <tracy@pentad.com>\nVadim Berman <vadimb@google.com>\nVlad Losev <vladl@google.com>\nZhanyong Wan <wan@google.com>\n"
  },
  {
    "path": "thirdparty/gtest/COPYING",
    "content": "Copyright 2008, Google Inc.\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n    * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "thirdparty/gtest/README",
    "content": "Google C++ Testing Framework\n============================\n\nhttp://code.google.com/p/googletest/\n\nOverview\n--------\n\nGoogle's framework for writing C++ tests on a variety of platforms\n(Linux, Mac OS X, Windows, Windows CE, Symbian, etc).  Based on the\nxUnit architecture.  Supports automatic test discovery, a rich set of\nassertions, user-defined assertions, death tests, fatal and non-fatal\nfailures, various options for running the tests, and XML test report\ngeneration.\n\nPlease see the project page above for more information as well as the\nmailing list for questions, discussions, and development.  There is\nalso an IRC channel on OFTC (irc.oftc.net) #gtest available.  Please\njoin us!\n\nRequirements for End Users\n--------------------------\n\nGoogle Test is designed to have fairly minimal requirements to build\nand use with your projects, but there are some.  Currently, we support\nLinux, Windows, Mac OS X, and Cygwin.  We will also make our best\neffort to support other platforms (e.g. Solaris, AIX, and z/OS).\nHowever, since core members of the Google Test project have no access\nto these platforms, Google Test may have outstanding issues there.  If\nyou notice any problems on your platform, please notify\ngoogletestframework@googlegroups.com.  Patches for fixing them are\neven more welcome!\n\n### Linux Requirements ###\n\nThese are the base requirements to build and use Google Test from a source\npackage (as described below):\n  * GNU-compatible Make or gmake\n  * POSIX-standard shell\n  * POSIX(-2) Regular Expressions (regex.h)\n  * A C++98-standard-compliant compiler\n\n### Windows Requirements ###\n\n  * Microsoft Visual C++ 7.1 or newer\n\n### Cygwin Requirements ###\n\n  * Cygwin 1.5.25-14 or newer\n\n### Mac OS X Requirements ###\n\n  * Mac OS X 10.4 Tiger or newer\n  * Developer Tools Installed\n\nAlso, you'll need CMake 2.6.4 or higher if you want to build the\nsamples using the provided CMake script, regardless of the platform.\n\nRequirements for Contributors\n-----------------------------\n\nWe welcome patches.  If you plan to contribute a patch, you need to\nbuild Google Test and its own tests from an SVN checkout (described\nbelow), which has further requirements:\n\n  * Python version 2.3 or newer (for running some of the tests and\n    re-generating certain source files from templates)\n  * CMake 2.6.4 or newer\n\nGetting the Source\n------------------\n\nThere are two primary ways of getting Google Test's source code: you\ncan download a stable source release in your preferred archive format,\nor directly check out the source from our Subversion (SVN) repositary.\nThe SVN checkout requires a few extra steps and some extra software\npackages on your system, but lets you track the latest development and\nmake patches much more easily, so we highly encourage it.\n\n### Source Package ###\n\nGoogle Test is released in versioned source packages which can be\ndownloaded from the download page [1].  Several different archive\nformats are provided, but the only difference is the tools used to\nmanipulate them, and the size of the resulting file.  Download\nwhichever you are most comfortable with.\n\n  [1] http://code.google.com/p/googletest/downloads/list\n\nOnce the package is downloaded, expand it using whichever tools you\nprefer for that type.  This will result in a new directory with the\nname \"gtest-X.Y.Z\" which contains all of the source code.  Here are\nsome examples on Linux:\n\n  tar -xvzf gtest-X.Y.Z.tar.gz\n  tar -xvjf gtest-X.Y.Z.tar.bz2\n  unzip gtest-X.Y.Z.zip\n\n### SVN Checkout ###\n\nTo check out the main branch (also known as the \"trunk\") of Google\nTest, run the following Subversion command:\n\n  svn checkout http://googletest.googlecode.com/svn/trunk/ gtest-svn\n\nSetting up the Build\n--------------------\n\nTo build Google Test and your tests that use it, you need to tell your\nbuild system where to find its headers and source files.  The exact\nway to do it depends on which build system you use, and is usually\nstraightforward.\n\n### Generic Build Instructions ###\n\nSuppose you put Google Test in directory ${GTEST_DIR}.  To build it,\ncreate a library build target (or a project as called by Visual Studio\nand Xcode) to compile\n\n  ${GTEST_DIR}/src/gtest-all.cc\n\nwith\n\n  ${GTEST_DIR}/include and ${GTEST_DIR}\n\nin the header search path.  Assuming a Linux-like system and gcc,\nsomething like the following will do:\n\n  g++ -I${GTEST_DIR}/include -I${GTEST_DIR} -c ${GTEST_DIR}/src/gtest-all.cc\n  ar -rv libgtest.a gtest-all.o\n\nNext, you should compile your test source file with\n${GTEST_DIR}/include in the header search path, and link it with gtest\nand any other necessary libraries:\n\n  g++ -I${GTEST_DIR}/include path/to/your_test.cc libgtest.a -o your_test\n\nAs an example, the make/ directory contains a Makefile that you can\nuse to build Google Test on systems where GNU make is available\n(e.g. Linux, Mac OS X, and Cygwin).  It doesn't try to build Google\nTest's own tests.  Instead, it just builds the Google Test library and\na sample test.  You can use it as a starting point for your own build\nscript.\n\nIf the default settings are correct for your environment, the\nfollowing commands should succeed:\n\n  cd ${GTEST_DIR}/make\n  make\n  ./sample1_unittest\n\nIf you see errors, try to tweak the contents of make/Makefile to make\nthem go away.  There are instructions in make/Makefile on how to do\nit.\n\n### Using CMake ###\n\nGoogle Test comes with a CMake build script (CMakeLists.txt) that can\nbe used on a wide range of platforms (\"C\" stands for cross-platofrm.).\nIf you don't have CMake installed already, you can download it for\nfree from http://www.cmake.org/.\n\nCMake works by generating native makefiles or build projects that can\nbe used in the compiler environment of your choice.  The typical\nworkflow starts with:\n\n  mkdir mybuild       # Create a directory to hold the build output.\n  cd mybuild\n  cmake ${GTEST_DIR}  # Generate native build scripts.\n\nIf you want to build Google Test's samples, you should replace the\nlast command with\n\n  cmake -Dgtest_build_samples=ON ${GTEST_DIR}\n\nIf you are on a *nix system, you should now see a Makefile in the\ncurrent directory.  Just type 'make' to build gtest.\n\nIf you use Windows and have Vistual Studio installed, a gtest.sln file\nand several .vcproj files will be created.  You can then build them\nusing Visual Studio.\n\nOn Mac OS X with Xcode installed, a .xcodeproj file will be generated.\n\n### Legacy Build Scripts ###\n\nBefore settling on CMake, we have been providing hand-maintained build\nprojects/scripts for Visual Studio, Xcode, and Autotools.  While we\ncontinue to provide them for convenience, they are not actively\nmaintained any more.  We highly recommend that you follow the\ninstructions in the previous two sections to integrate Google Test\nwith your existing build system.\n\nIf you still need to use the legacy build scripts, here's how:\n\nThe msvc\\ folder contains two solutions with Visual C++ projects.\nOpen the gtest.sln or gtest-md.sln file using Visual Studio, and you\nare ready to build Google Test the same way you build any Visual\nStudio project.  Files that have names ending with -md use DLL\nversions of Microsoft runtime libraries (the /MD or the /MDd compiler\noption).  Files without that suffix use static versions of the runtime\nlibraries (the /MT or the /MTd option).  Please note that one must use\nthe same option to compile both gtest and the test code.  If you use\nVisual Studio 2005 or above, we recommend the -md version as /MD is\nthe default for new projects in these versions of Visual Studio.\n\nOn Mac OS X, open the gtest.xcodeproj in the xcode/ folder using\nXcode.  Build the \"gtest\" target.  The universal binary framework will\nend up in your selected build directory (selected in the Xcode\n\"Preferences...\" -> \"Building\" pane and defaults to xcode/build).\nAlternatively, at the command line, enter:\n\n  xcodebuild\n\nThis will build the \"Release\" configuration of gtest.framework in your\ndefault build location.  See the \"xcodebuild\" man page for more\ninformation about building different configurations and building in\ndifferent locations.\n\nTweaking Google Test\n--------------------\n\nGoogle Test can be used in diverse environments.  The default\nconfiguration may not work (or may not work well) out of the box in\nsome environments.  However, you can easily tweak Google Test by\ndefining control macros on the compiler command line.  Generally,\nthese macros are named like GTEST_XYZ and you define them to either 1\nor 0 to enable or disable a certain feature.\n\nWe list the most frequently used macros below.  For a complete list,\nsee file include/gtest/internal/gtest-port.h.\n\n### Choosing a TR1 Tuple Library ###\n\nSome Google Test features require the C++ Technical Report 1 (TR1)\ntuple library, which is not yet available with all compilers.  The\ngood news is that Google Test implements a subset of TR1 tuple that's\nenough for its own need, and will automatically use this when the\ncompiler doesn't provide TR1 tuple.\n\nUsually you don't need to care about which tuple library Google Test\nuses.  However, if your project already uses TR1 tuple, you need to\ntell Google Test to use the same TR1 tuple library the rest of your\nproject uses, or the two tuple implementations will clash.  To do\nthat, add\n\n  -DGTEST_USE_OWN_TR1_TUPLE=0\n\nto the compiler flags while compiling Google Test and your tests.  If\nyou want to force Google Test to use its own tuple library, just add\n\n  -DGTEST_USE_OWN_TR1_TUPLE=1\n\nto the compiler flags instead.\n\nIf you don't want Google Test to use tuple at all, add\n\n  -DGTEST_HAS_TR1_TUPLE=0\n\nand all features using tuple will be disabled.\n\n### Multi-threaded Tests ###\n\nGoogle Test is thread-safe where the pthread library is available.\nAfter #include \"gtest/gtest.h\", you can check the GTEST_IS_THREADSAFE\nmacro to see whether this is the case (yes if the macro is #defined to\n1, no if it's undefined.).\n\nIf Google Test doesn't correctly detect whether pthread is available\nin your environment, you can force it with\n\n  -DGTEST_HAS_PTHREAD=1\n\nor\n\n  -DGTEST_HAS_PTHREAD=0\n\nWhen Google Test uses pthread, you may need to add flags to your\ncompiler and/or linker to select the pthread library, or you'll get\nlink errors.  If you use the CMake script or the deprecated Autotools\nscript, this is taken care of for you.  If you use your own build\nscript, you'll need to read your compiler and linker's manual to\nfigure out what flags to add.\n\n### As a Shared Library (DLL) ###\n\nGoogle Test is compact, so most users can build and link it as a\nstatic library for the simplicity.  You can choose to use Google Test\nas a shared library (known as a DLL on Windows) if you prefer.\n\nTo compile *gtest* as a shared library, add\n\n  -DGTEST_CREATE_SHARED_LIBRARY=1\n\nto the compiler flags.  You'll also need to tell the linker to produce\na shared library instead - consult your linker's manual for how to do\nit.\n\nTo compile your *tests* that use the gtest shared library, add\n\n  -DGTEST_LINKED_AS_SHARED_LIBRARY=1\n\nto the compiler flags.\n\nNote: while the above steps aren't technically necessary today when\nusing some compilers (e.g. GCC), they may become necessary in the\nfuture, if we decide to improve the speed of loading the library (see\nhttp://gcc.gnu.org/wiki/Visibility for details).  Therefore you are\nrecommended to always add the above flags when using Google Test as a\nshared library.  Otherwise a future release of Google Test may break\nyour build script.\n\n### Avoiding Macro Name Clashes ###\n\nIn C++, macros don't obey namespaces.  Therefore two libraries that\nboth define a macro of the same name will clash if you #include both\ndefinitions.  In case a Google Test macro clashes with another\nlibrary, you can force Google Test to rename its macro to avoid the\nconflict.\n\nSpecifically, if both Google Test and some other code define macro\nFOO, you can add\n\n  -DGTEST_DONT_DEFINE_FOO=1\n\nto the compiler flags to tell Google Test to change the macro's name\nfrom FOO to GTEST_FOO.  Currently FOO can be FAIL, SUCCEED, or TEST.\nFor example, with -DGTEST_DONT_DEFINE_TEST=1, you'll need to write\n\n  GTEST_TEST(SomeTest, DoesThis) { ... }\n\ninstead of\n\n  TEST(SomeTest, DoesThis) { ... }\n\nin order to define a test.\n\nUpgrating from an Earlier Version\n---------------------------------\n\nWe strive to keep Google Test releases backward compatible.\nSometimes, though, we have to make some breaking changes for the\nusers' long-term benefits.  This section describes what you'll need to\ndo if you are upgrading from an earlier version of Google Test.\n\n### Upgrading from 1.3.0 or Earlier ###\n\nYou may need to explicitly enable or disable Google Test's own TR1\ntuple library.  See the instructions in section \"Choosing a TR1 Tuple\nLibrary\".\n\n### Upgrading from 1.4.0 or Earlier ###\n\nThe Autotools build script (configure + make) is no longer officially\nsupportted.  You are encouraged to migrate to your own build system or\nuse CMake.  If you still need to use Autotools, you can find\ninstructions in the README file from Google Test 1.4.0.\n\nOn platforms where the pthread library is available, Google Test uses\nit in order to be thread-safe.  See the \"Multi-threaded Tests\" section\nfor what this means to your build script.\n\nIf you use Microsoft Visual C++ 7.1 with exceptions disabled, Google\nTest will no longer compile.  This should affect very few people, as a\nlarge portion of STL (including <string>) doesn't compile in this mode\nanyway.  We decided to stop supporting it in order to greatly simplify\nGoogle Test's implementation.\n\nDeveloping Google Test\n----------------------\n\nThis section discusses how to make your own changes to Google Test.\n\n### Testing Google Test Itself ###\n\nTo make sure your changes work as intended and don't break existing\nfunctionality, you'll want to compile and run Google Test's own tests.\nFor that you can use CMake:\n\n  mkdir mybuild\n  cd mybuild\n  cmake -Dgtest_build_tests=ON ${GTEST_DIR}\n\nMake sure you have Python installed, as some of Google Test's tests\nare written in Python.  If the cmake command complains about not being\nable to find Python (\"Could NOT find PythonInterp (missing:\nPYTHON_EXECUTABLE)\"), try telling it explicitly where your Python\nexecutable can be found:\n\n  cmake -DPYTHON_EXECUTABLE=path/to/python -Dgtest_build_tests=ON ${GTEST_DIR}\n\nNext, you can build Google Test and all of its own tests.  On *nix,\nthis is usually done by 'make'.  To run the tests, do\n\n  make test\n\nAll tests should pass.\n\n### Regenerating Source Files ###\n\nSome of Google Test's source files are generated from templates (not\nin the C++ sense) using a script.  A template file is named FOO.pump,\nwhere FOO is the name of the file it will generate.  For example, the\nfile include/gtest/internal/gtest-type-util.h.pump is used to generate\ngtest-type-util.h in the same directory.\n\nNormally you don't need to worry about regenerating the source files,\nunless you need to modify them.  In that case, you should modify the\ncorresponding .pump files instead and run the pump.py Python script to\nregenerate them.  You can find pump.py in the scripts/ directory.\nRead the Pump manual [2] for how to use it.\n\n  [2] http://code.google.com/p/googletest/wiki/PumpManual\n\n### Contributing a Patch ###\n\nWe welcome patches.  Please read the Google Test developer's guide [3]\nfor how you can contribute.  In particular, make sure you have signed\nthe Contributor License Agreement, or we won't be able to accept the\npatch.\n\n  [3] http://code.google.com/p/googletest/wiki/GoogleTestDevGuide\n\nHappy testing!\n"
  },
  {
    "path": "thirdparty/gtest/include/gtest/gtest_ASP.h",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n//\n// The Google C++ Testing Framework (Google Test)\n//\n// This header file defines the public API for Google Test.  It should be\n// included by any test program that uses Google Test.\n//\n// IMPORTANT NOTE: Due to limitation of the C++ language, we have to\n// leave some internal implementation details in this header file.\n// They are clearly marked by comments like this:\n//\n//   // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\n//\n// Such code is NOT meant to be used by a user directly, and is subject\n// to CHANGE WITHOUT NOTICE.  Therefore DO NOT DEPEND ON IT in a user\n// program!\n//\n// Acknowledgment: Google Test borrowed the idea of automatic test\n// registration from Barthelemy Dagenais' (barthelemy@prologique.com)\n// easyUnit framework.\n\n#ifndef GTEST_INCLUDE_GTEST_GTEST_H_\n#define GTEST_INCLUDE_GTEST_GTEST_H_\n\n#include <limits>\n#include <vector>\n\n// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee)\n//\n// The Google C++ Testing Framework (Google Test)\n//\n// This header file declares functions and macros used internally by\n// Google Test.  They are subject to change without notice.\n\n#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_\n#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_\n\n// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Authors: wan@google.com (Zhanyong Wan)\n//\n// Low-level types and utilities for porting Google Test to various\n// platforms.  They are subject to change without notice.  DO NOT USE\n// THEM IN USER CODE.\n\n#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_\n#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_\n\n// The user can define the following macros in the build script to\n// control Google Test's behavior.  If the user doesn't define a macro\n// in this list, Google Test will define it.\n//\n//   GTEST_HAS_CLONE          - Define it to 1/0 to indicate that clone(2)\n//                              is/isn't available.\n//   GTEST_HAS_EXCEPTIONS     - Define it to 1/0 to indicate that exceptions\n//                              are enabled.\n//   GTEST_HAS_GLOBAL_STRING  - Define it to 1/0 to indicate that ::string\n//                              is/isn't available (some systems define\n//                              ::string, which is different to std::string).\n//   GTEST_HAS_GLOBAL_WSTRING - Define it to 1/0 to indicate that ::string\n//                              is/isn't available (some systems define\n//                              ::wstring, which is different to std::wstring).\n//   GTEST_HAS_POSIX_RE       - Define it to 1/0 to indicate that POSIX regular\n//                              expressions are/aren't available.\n//   GTEST_HAS_PTHREAD        - Define it to 1/0 to indicate that <pthread.h>\n//                              is/isn't available.\n//   GTEST_HAS_RTTI           - Define it to 1/0 to indicate that RTTI is/isn't\n//                              enabled.\n//   GTEST_HAS_STD_WSTRING    - Define it to 1/0 to indicate that\n//                              std::wstring does/doesn't work (Google Test can\n//                              be used where std::wstring is unavailable).\n//   GTEST_HAS_TR1_TUPLE      - Define it to 1/0 to indicate tr1::tuple\n//                              is/isn't available.\n//   GTEST_HAS_SEH            - Define it to 1/0 to indicate whether the\n//                              compiler supports Microsoft's \"Structured\n//                              Exception Handling\".\n//   GTEST_HAS_STREAM_REDIRECTION\n//                            - Define it to 1/0 to indicate whether the\n//                              platform supports I/O stream redirection using\n//                              dup() and dup2().\n//   GTEST_USE_OWN_TR1_TUPLE  - Define it to 1/0 to indicate whether Google\n//                              Test's own tr1 tuple implementation should be\n//                              used.  Unused when the user sets\n//                              GTEST_HAS_TR1_TUPLE to 0.\n//   GTEST_LINKED_AS_SHARED_LIBRARY\n//                            - Define to 1 when compiling tests that use\n//                              Google Test as a shared library (known as\n//                              DLL on Windows).\n//   GTEST_CREATE_SHARED_LIBRARY\n//                            - Define to 1 when compiling Google Test itself\n//                              as a shared library.\n\n// This header defines the following utilities:\n//\n// Macros indicating the current platform (defined to 1 if compiled on\n// the given platform; otherwise undefined):\n//   GTEST_OS_AIX      - IBM AIX\n//   GTEST_OS_CYGWIN   - Cygwin\n//   GTEST_OS_HPUX     - HP-UX\n//   GTEST_OS_LINUX    - Linux\n//     GTEST_OS_LINUX_ANDROID - Google Android\n//   GTEST_OS_MAC      - Mac OS X\n//   GTEST_OS_NACL     - Google Native Client (NaCl)\n//   GTEST_OS_SOLARIS  - Sun Solaris\n//   GTEST_OS_SYMBIAN  - Symbian\n//   GTEST_OS_WINDOWS  - Windows (Desktop, MinGW, or Mobile)\n//     GTEST_OS_WINDOWS_DESKTOP  - Windows Desktop\n//     GTEST_OS_WINDOWS_MINGW    - MinGW\n//     GTEST_OS_WINDOWS_MOBILE   - Windows Mobile\n//   GTEST_OS_ZOS      - z/OS\n//\n// Among the platforms, Cygwin, Linux, Max OS X, and Windows have the\n// most stable support.  Since core members of the Google Test project\n// don't have access to other platforms, support for them may be less\n// stable.  If you notice any problems on your platform, please notify\n// googletestframework@googlegroups.com (patches for fixing them are\n// even more welcome!).\n//\n// Note that it is possible that none of the GTEST_OS_* macros are defined.\n//\n// Macros indicating available Google Test features (defined to 1 if\n// the corresponding feature is supported; otherwise undefined):\n//   GTEST_HAS_COMBINE      - the Combine() function (for value-parameterized\n//                            tests)\n//   GTEST_HAS_DEATH_TEST   - death tests\n//   GTEST_HAS_PARAM_TEST   - value-parameterized tests\n//   GTEST_HAS_TYPED_TEST   - typed tests\n//   GTEST_HAS_TYPED_TEST_P - type-parameterized tests\n//   GTEST_USES_POSIX_RE    - enhanced POSIX regex is used. Do not confuse with\n//                            GTEST_HAS_POSIX_RE (see above) which users can\n//                            define themselves.\n//   GTEST_USES_SIMPLE_RE   - our own simple regex is used;\n//                            the above two are mutually exclusive.\n//   GTEST_CAN_COMPARE_NULL - accepts untyped NULL in EXPECT_EQ().\n//\n// Macros for basic C++ coding:\n//   GTEST_AMBIGUOUS_ELSE_BLOCKER_ - for disabling a gcc warning.\n//   GTEST_ATTRIBUTE_UNUSED_  - declares that a class' instances or a\n//                              variable don't have to be used.\n//   GTEST_DISALLOW_ASSIGN_   - disables operator=.\n//   GTEST_DISALLOW_COPY_AND_ASSIGN_ - disables copy ctor and operator=.\n//   GTEST_MUST_USE_RESULT_   - declares that a function's result must be used.\n//\n// Synchronization:\n//   Mutex, MutexLock, ThreadLocal, GetThreadCount()\n//                  - synchronization primitives.\n//   GTEST_IS_THREADSAFE - defined to 1 to indicate that the above\n//                         synchronization primitives have real implementations\n//                         and Google Test is thread-safe; or 0 otherwise.\n//\n// Template meta programming:\n//   is_pointer     - as in TR1; needed on Symbian and IBM XL C/C++ only.\n//   IteratorTraits - partial implementation of std::iterator_traits, which\n//                    is not available in libCstd when compiled with Sun C++.\n//\n// Smart pointers:\n//   scoped_ptr     - as in TR2.\n//\n// Regular expressions:\n//   RE             - a simple regular expression class using the POSIX\n//                    Extended Regular Expression syntax on UNIX-like\n//                    platforms, or a reduced regular exception syntax on\n//                    other platforms, including Windows.\n//\n// Logging:\n//   GTEST_LOG_()   - logs messages at the specified severity level.\n//   LogToStderr()  - directs all log messages to stderr.\n//   FlushInfoLog() - flushes informational log messages.\n//\n// Stdout and stderr capturing:\n//   CaptureStdout()     - starts capturing stdout.\n//   GetCapturedStdout() - stops capturing stdout and returns the captured\n//                         string.\n//   CaptureStderr()     - starts capturing stderr.\n//   GetCapturedStderr() - stops capturing stderr and returns the captured\n//                         string.\n//\n// Integer types:\n//   TypeWithSize   - maps an integer to a int type.\n//   Int32, UInt32, Int64, UInt64, TimeInMillis\n//                  - integers of known sizes.\n//   BiggestInt     - the biggest signed integer type.\n//\n// Command-line utilities:\n//   GTEST_FLAG()       - references a flag.\n//   GTEST_DECLARE_*()  - declares a flag.\n//   GTEST_DEFINE_*()   - defines a flag.\n//   GetArgvs()         - returns the command line as a vector of strings.\n//\n// Environment variable utilities:\n//   GetEnv()             - gets the value of an environment variable.\n//   BoolFromGTestEnv()   - parses a bool environment variable.\n//   Int32FromGTestEnv()  - parses an Int32 environment variable.\n//   StringFromGTestEnv() - parses a string environment variable.\n\n#include <ctype.h>   // for isspace, etc\n#include <stddef.h>  // for ptrdiff_t\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#ifndef _WIN32_WCE\n# include <sys/types.h>\n# include <sys/stat.h>\n#endif  // !_WIN32_WCE\n\n#include <iostream>  // NOLINT\n#include <sstream>  // NOLINT\n#include <string>  // NOLINT\n\n#define GTEST_DEV_EMAIL_ \"googletestframework@@googlegroups.com\"\n#define GTEST_FLAG_PREFIX_ \"gtest_\"\n#define GTEST_FLAG_PREFIX_DASH_ \"gtest-\"\n#define GTEST_FLAG_PREFIX_UPPER_ \"GTEST_\"\n#define GTEST_NAME_ \"Google Test\"\n#define GTEST_PROJECT_URL_ \"http://code.google.com/p/googletest/\"\n\n// Determines the version of gcc that is used to compile this.\n#ifdef __GNUC__\n// 40302 means version 4.3.2.\n# define GTEST_GCC_VER_ \\\n    (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__)\n#endif  // __GNUC__\n\n// Determines the platform on which Google Test is compiled.\n#ifdef __CYGWIN__\n# define GTEST_OS_CYGWIN 1\n#elif defined __SYMBIAN32__\n# define GTEST_OS_SYMBIAN 1\n#elif defined _WIN32\n# define GTEST_OS_WINDOWS 1\n# ifdef _WIN32_WCE\n#  define GTEST_OS_WINDOWS_MOBILE 1\n# elif defined(__MINGW__) || defined(__MINGW32__)\n#  define GTEST_OS_WINDOWS_MINGW 1\n# else\n#  define GTEST_OS_WINDOWS_DESKTOP 1\n# endif  // _WIN32_WCE\n#elif defined __APPLE__\n# define GTEST_OS_MAC 1\n#elif defined __linux__\n# define GTEST_OS_LINUX 1\n# ifdef ANDROID\n#  define GTEST_OS_LINUX_ANDROID 1\n# endif  // ANDROID\n#elif defined __MVS__\n# define GTEST_OS_ZOS 1\n#elif defined(__sun) && defined(__SVR4)\n# define GTEST_OS_SOLARIS 1\n#elif defined(_AIX)\n# define GTEST_OS_AIX 1\n#elif defined(__hpux)\n# define GTEST_OS_HPUX 1\n#elif defined __native_client__\n# define GTEST_OS_NACL 1\n#endif  // __CYGWIN__\n\n// Brings in definitions for functions used in the testing::internal::posix\n// namespace (read, write, close, chdir, isatty, stat). We do not currently\n// use them on Windows Mobile.\n#if !GTEST_OS_WINDOWS\n// This assumes that non-Windows OSes provide unistd.h. For OSes where this\n// is not the case, we need to include headers that provide the functions\n// mentioned above.\n# include <unistd.h>\n# if !GTEST_OS_NACL\n// TODO(vladl@google.com): Remove this condition when Native Client SDK adds\n// strings.h (tracked in\n// http://code.google.com/p/nativeclient/issues/detail?id=1175).\n#  include <strings.h>  // Native Client doesn't provide strings.h.\n# endif\n#elif !GTEST_OS_WINDOWS_MOBILE\n# include <direct.h>\n# include <io.h>\n#endif\n\n// Defines this to true iff Google Test can use POSIX regular expressions.\n#ifndef GTEST_HAS_POSIX_RE\n# define GTEST_HAS_POSIX_RE (!GTEST_OS_WINDOWS)\n#endif\n\n#if GTEST_HAS_POSIX_RE\n\n// On some platforms, <regex.h> needs someone to define size_t, and\n// won't compile otherwise.  We can #include it here as we already\n// included <stdlib.h>, which is guaranteed to define size_t through\n// <stddef.h>.\n# include <regex.h>  // NOLINT\n\n# define GTEST_USES_POSIX_RE 1\n\n#elif GTEST_OS_WINDOWS\n\n// <regex.h> is not available on Windows.  Use our own simple regex\n// implementation instead.\n# define GTEST_USES_SIMPLE_RE 1\n\n#else\n\n// <regex.h> may not be available on this platform.  Use our own\n// simple regex implementation instead.\n# define GTEST_USES_SIMPLE_RE 1\n\n#endif  // GTEST_HAS_POSIX_RE\n\n#ifndef GTEST_HAS_EXCEPTIONS\n// The user didn't tell us whether exceptions are enabled, so we need\n// to figure it out.\n# if defined(_MSC_VER) || defined(__BORLANDC__)\n// MSVC's and C++Builder's implementations of the STL use the _HAS_EXCEPTIONS\n// macro to enable exceptions, so we'll do the same.\n// Assumes that exceptions are enabled by default.\n#  ifndef _HAS_EXCEPTIONS\n#   define _HAS_EXCEPTIONS 1\n#  endif  // _HAS_EXCEPTIONS\n#  define GTEST_HAS_EXCEPTIONS _HAS_EXCEPTIONS\n# elif defined(__GNUC__) && __EXCEPTIONS\n// gcc defines __EXCEPTIONS to 1 iff exceptions are enabled.\n#  define GTEST_HAS_EXCEPTIONS 1\n# elif defined(__SUNPRO_CC)\n// Sun Pro CC supports exceptions.  However, there is no compile-time way of\n// detecting whether they are enabled or not.  Therefore, we assume that\n// they are enabled unless the user tells us otherwise.\n#  define GTEST_HAS_EXCEPTIONS 1\n# elif defined(__IBMCPP__) && __EXCEPTIONS\n// xlC defines __EXCEPTIONS to 1 iff exceptions are enabled.\n#  define GTEST_HAS_EXCEPTIONS 1\n# elif defined(__HP_aCC)\n// Exception handling is in effect by default in HP aCC compiler. It has to\n// be turned of by +noeh compiler option if desired.\n#  define GTEST_HAS_EXCEPTIONS 1\n# else\n// For other compilers, we assume exceptions are disabled to be\n// conservative.\n#  define GTEST_HAS_EXCEPTIONS 0\n# endif  // defined(_MSC_VER) || defined(__BORLANDC__)\n#endif  // GTEST_HAS_EXCEPTIONS\n\n#if !defined(GTEST_HAS_STD_STRING)\n// Even though we don't use this macro any longer, we keep it in case\n// some clients still depend on it.\n# define GTEST_HAS_STD_STRING 1\n#elif !GTEST_HAS_STD_STRING\n// The user told us that ::std::string isn't available.\n# error \"Google Test cannot be used where ::std::string isn't available.\"\n#endif  // !defined(GTEST_HAS_STD_STRING)\n\n#ifndef GTEST_HAS_GLOBAL_STRING\n// The user didn't tell us whether ::string is available, so we need\n// to figure it out.\n\n# define GTEST_HAS_GLOBAL_STRING 0\n\n#endif  // GTEST_HAS_GLOBAL_STRING\n\n#ifndef GTEST_HAS_STD_WSTRING\n// The user didn't tell us whether ::std::wstring is available, so we need\n// to figure it out.\n// TODO(wan@google.com): uses autoconf to detect whether ::std::wstring\n//   is available.\n\n// Cygwin 1.7 and below doesn't support ::std::wstring.\n// Solaris' libc++ doesn't support it either.  Android has\n// no support for it at least as recent as Froyo (2.2).\n# define GTEST_HAS_STD_WSTRING \\\n    (!(GTEST_OS_LINUX_ANDROID || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS))\n\n#endif  // GTEST_HAS_STD_WSTRING\n\n#ifndef GTEST_HAS_GLOBAL_WSTRING\n// The user didn't tell us whether ::wstring is available, so we need\n// to figure it out.\n# define GTEST_HAS_GLOBAL_WSTRING \\\n    (GTEST_HAS_STD_WSTRING && GTEST_HAS_GLOBAL_STRING)\n#endif  // GTEST_HAS_GLOBAL_WSTRING\n\n// Determines whether RTTI is available.\n#ifndef GTEST_HAS_RTTI\n// The user didn't tell us whether RTTI is enabled, so we need to\n// figure it out.\n\n# ifdef _MSC_VER\n\n#  ifdef _CPPRTTI  // MSVC defines this macro iff RTTI is enabled.\n#   define GTEST_HAS_RTTI 1\n#  else\n#   define GTEST_HAS_RTTI 0\n#  endif\n\n// Starting with version 4.3.2, gcc defines __GXX_RTTI iff RTTI is enabled.\n# elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40302)\n\n#  ifdef __GXX_RTTI\n#   define GTEST_HAS_RTTI 1\n#  else\n#   define GTEST_HAS_RTTI 0\n#  endif  // __GXX_RTTI\n\n// Starting with version 9.0 IBM Visual Age defines __RTTI_ALL__ to 1 if\n// both the typeid and dynamic_cast features are present.\n# elif defined(__IBMCPP__) && (__IBMCPP__ >= 900)\n\n#  ifdef __RTTI_ALL__\n#   define GTEST_HAS_RTTI 1\n#  else\n#   define GTEST_HAS_RTTI 0\n#  endif\n\n# else\n\n// For all other compilers, we assume RTTI is enabled.\n#  define GTEST_HAS_RTTI 1\n\n# endif  // _MSC_VER\n\n#endif  // GTEST_HAS_RTTI\n\n// It's this header's responsibility to #include <typeinfo> when RTTI\n// is enabled.\n#if GTEST_HAS_RTTI\n# include <typeinfo>\n#endif\n\n// Determines whether Google Test can use the pthreads library.\n#ifndef GTEST_HAS_PTHREAD\n// The user didn't tell us explicitly, so we assume pthreads support is\n// available on Linux and Mac.\n//\n// To disable threading support in Google Test, add -DGTEST_HAS_PTHREAD=0\n// to your compiler flags.\n# define GTEST_HAS_PTHREAD (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_HPUX)\n#endif  // GTEST_HAS_PTHREAD\n\n#if GTEST_HAS_PTHREAD\n// gtest-port.h guarantees to #include <pthread.h> when GTEST_HAS_PTHREAD is\n// true.\n# include <pthread.h>  // NOLINT\n\n// For timespec and nanosleep, used below.\n# include <time.h>  // NOLINT\n#endif\n\n// Determines whether Google Test can use tr1/tuple.  You can define\n// this macro to 0 to prevent Google Test from using tuple (any\n// feature depending on tuple with be disabled in this mode).\n#ifndef GTEST_HAS_TR1_TUPLE\n// The user didn't tell us not to do it, so we assume it's OK.\n# define GTEST_HAS_TR1_TUPLE 1\n#endif  // GTEST_HAS_TR1_TUPLE\n\n// Determines whether Google Test's own tr1 tuple implementation\n// should be used.\n#ifndef GTEST_USE_OWN_TR1_TUPLE\n// The user didn't tell us, so we need to figure it out.\n\n// We use our own TR1 tuple if we aren't sure the user has an\n// implementation of it already.  At this time, GCC 4.0.0+ and MSVC\n// 2010 are the only mainstream compilers that come with a TR1 tuple\n// implementation.  NVIDIA's CUDA NVCC compiler pretends to be GCC by\n// defining __GNUC__ and friends, but cannot compile GCC's tuple\n// implementation.  MSVC 2008 (9.0) provides TR1 tuple in a 323 MB\n// Feature Pack download, which we cannot assume the user has.\n# if (defined(__GNUC__) && !defined(__CUDACC__) && (GTEST_GCC_VER_ >= 40000)) \\\n    || _MSC_VER >= 1600\n#  define GTEST_USE_OWN_TR1_TUPLE 0\n# else\n#  define GTEST_USE_OWN_TR1_TUPLE 1\n# endif\n\n#endif  // GTEST_USE_OWN_TR1_TUPLE\n\n// To avoid conditional compilation everywhere, we make it\n// gtest-port.h's responsibility to #include the header implementing\n// tr1/tuple.\n#if GTEST_HAS_TR1_TUPLE\n\n# if GTEST_USE_OWN_TR1_TUPLE\n// This file was GENERATED by a script.  DO NOT EDIT BY HAND!!!\n\n// Copyright 2009 Google Inc.\n// All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n\n// Implements a subset of TR1 tuple needed by Google Test and Google Mock.\n\n#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_\n#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_\n\n#include <utility>  // For ::std::pair.\n\n// The compiler used in Symbian has a bug that prevents us from declaring the\n// tuple template as a friend (it complains that tuple is redefined).  This\n// hack bypasses the bug by declaring the members that should otherwise be\n// private as public.\n// Sun Studio versions < 12 also have the above bug.\n#if defined(__SYMBIAN32__) || (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590)\n# define GTEST_DECLARE_TUPLE_AS_FRIEND_ public:\n#else\n# define GTEST_DECLARE_TUPLE_AS_FRIEND_ \\\n    template <GTEST_10_TYPENAMES_(U)> friend class tuple; \\\n   private:\n#endif\n\n// GTEST_n_TUPLE_(T) is the type of an n-tuple.\n#define GTEST_0_TUPLE_(T) tuple<>\n#define GTEST_1_TUPLE_(T) tuple<T##0, void, void, void, void, void, void, \\\n    void, void, void>\n#define GTEST_2_TUPLE_(T) tuple<T##0, T##1, void, void, void, void, void, \\\n    void, void, void>\n#define GTEST_3_TUPLE_(T) tuple<T##0, T##1, T##2, void, void, void, void, \\\n    void, void, void>\n#define GTEST_4_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, void, void, void, \\\n    void, void, void>\n#define GTEST_5_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, void, void, \\\n    void, void, void>\n#define GTEST_6_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, void, \\\n    void, void, void>\n#define GTEST_7_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \\\n    void, void, void>\n#define GTEST_8_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \\\n    T##7, void, void>\n#define GTEST_9_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \\\n    T##7, T##8, void>\n#define GTEST_10_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \\\n    T##7, T##8, T##9>\n\n// GTEST_n_TYPENAMES_(T) declares a list of n typenames.\n#define GTEST_0_TYPENAMES_(T)\n#define GTEST_1_TYPENAMES_(T) typename T##0\n#define GTEST_2_TYPENAMES_(T) typename T##0, typename T##1\n#define GTEST_3_TYPENAMES_(T) typename T##0, typename T##1, typename T##2\n#define GTEST_4_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \\\n    typename T##3\n#define GTEST_5_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \\\n    typename T##3, typename T##4\n#define GTEST_6_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \\\n    typename T##3, typename T##4, typename T##5\n#define GTEST_7_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \\\n    typename T##3, typename T##4, typename T##5, typename T##6\n#define GTEST_8_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \\\n    typename T##3, typename T##4, typename T##5, typename T##6, typename T##7\n#define GTEST_9_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \\\n    typename T##3, typename T##4, typename T##5, typename T##6, \\\n    typename T##7, typename T##8\n#define GTEST_10_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \\\n    typename T##3, typename T##4, typename T##5, typename T##6, \\\n    typename T##7, typename T##8, typename T##9\n\n// In theory, defining stuff in the ::std namespace is undefined\n// behavior.  We can do this as we are playing the role of a standard\n// library vendor.\nnamespace std {\nnamespace tr1 {\n\ntemplate <typename T0 = void, typename T1 = void, typename T2 = void,\n    typename T3 = void, typename T4 = void, typename T5 = void,\n    typename T6 = void, typename T7 = void, typename T8 = void,\n    typename T9 = void>\nclass tuple;\n\n// Anything in namespace gtest_internal is Google Test's INTERNAL\n// IMPLEMENTATION DETAIL and MUST NOT BE USED DIRECTLY in user code.\nnamespace gtest_internal {\n\n// ByRef<T>::type is T if T is a reference; otherwise it's const T&.\ntemplate <typename T>\nstruct ByRef { typedef const T& type; };  // NOLINT\ntemplate <typename T>\nstruct ByRef<T&> { typedef T& type; };  // NOLINT\n\n// A handy wrapper for ByRef.\n#define GTEST_BY_REF_(T) typename ::std::tr1::gtest_internal::ByRef<T>::type\n\n// AddRef<T>::type is T if T is a reference; otherwise it's T&.  This\n// is the same as tr1::add_reference<T>::type.\ntemplate <typename T>\nstruct AddRef { typedef T& type; };  // NOLINT\ntemplate <typename T>\nstruct AddRef<T&> { typedef T& type; };  // NOLINT\n\n// A handy wrapper for AddRef.\n#define GTEST_ADD_REF_(T) typename ::std::tr1::gtest_internal::AddRef<T>::type\n\n// A helper for implementing get<k>().\ntemplate <int k> class Get;\n\n// A helper for implementing tuple_element<k, T>.  kIndexValid is true\n// iff k < the number of fields in tuple type T.\ntemplate <bool kIndexValid, int kIndex, class Tuple>\nstruct TupleElement;\n\ntemplate <GTEST_10_TYPENAMES_(T)>\nstruct TupleElement<true, 0, GTEST_10_TUPLE_(T)> { typedef T0 type; };\n\ntemplate <GTEST_10_TYPENAMES_(T)>\nstruct TupleElement<true, 1, GTEST_10_TUPLE_(T)> { typedef T1 type; };\n\ntemplate <GTEST_10_TYPENAMES_(T)>\nstruct TupleElement<true, 2, GTEST_10_TUPLE_(T)> { typedef T2 type; };\n\ntemplate <GTEST_10_TYPENAMES_(T)>\nstruct TupleElement<true, 3, GTEST_10_TUPLE_(T)> { typedef T3 type; };\n\ntemplate <GTEST_10_TYPENAMES_(T)>\nstruct TupleElement<true, 4, GTEST_10_TUPLE_(T)> { typedef T4 type; };\n\ntemplate <GTEST_10_TYPENAMES_(T)>\nstruct TupleElement<true, 5, GTEST_10_TUPLE_(T)> { typedef T5 type; };\n\ntemplate <GTEST_10_TYPENAMES_(T)>\nstruct TupleElement<true, 6, GTEST_10_TUPLE_(T)> { typedef T6 type; };\n\ntemplate <GTEST_10_TYPENAMES_(T)>\nstruct TupleElement<true, 7, GTEST_10_TUPLE_(T)> { typedef T7 type; };\n\ntemplate <GTEST_10_TYPENAMES_(T)>\nstruct TupleElement<true, 8, GTEST_10_TUPLE_(T)> { typedef T8 type; };\n\ntemplate <GTEST_10_TYPENAMES_(T)>\nstruct TupleElement<true, 9, GTEST_10_TUPLE_(T)> { typedef T9 type; };\n\n}  // namespace gtest_internal\n\ntemplate <>\nclass tuple<> {\n public:\n  tuple() {}\n  tuple(const tuple& /* t */)  {}\n  tuple& operator=(const tuple& /* t */) { return *this; }\n};\n\ntemplate <GTEST_1_TYPENAMES_(T)>\nclass GTEST_1_TUPLE_(T) {\n public:\n  template <int k> friend class gtest_internal::Get;\n\n  tuple() : f0_() {}\n\n  explicit tuple(GTEST_BY_REF_(T0) f0) : f0_(f0) {}\n\n  tuple(const tuple& t) : f0_(t.f0_) {}\n\n  template <GTEST_1_TYPENAMES_(U)>\n  tuple(const GTEST_1_TUPLE_(U)& t) : f0_(t.f0_) {}\n\n  tuple& operator=(const tuple& t) { return CopyFrom(t); }\n\n  template <GTEST_1_TYPENAMES_(U)>\n  tuple& operator=(const GTEST_1_TUPLE_(U)& t) {\n    return CopyFrom(t);\n  }\n\n  GTEST_DECLARE_TUPLE_AS_FRIEND_\n\n  template <GTEST_1_TYPENAMES_(U)>\n  tuple& CopyFrom(const GTEST_1_TUPLE_(U)& t) {\n    f0_ = t.f0_;\n    return *this;\n  }\n\n  T0 f0_;\n};\n\ntemplate <GTEST_2_TYPENAMES_(T)>\nclass GTEST_2_TUPLE_(T) {\n public:\n  template <int k> friend class gtest_internal::Get;\n\n  tuple() : f0_(), f1_() {}\n\n  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1) : f0_(f0),\n      f1_(f1) {}\n\n  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_) {}\n\n  template <GTEST_2_TYPENAMES_(U)>\n  tuple(const GTEST_2_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_) {}\n  template <typename U0, typename U1>\n  tuple(const ::std::pair<U0, U1>& p) : f0_(p.first), f1_(p.second) {}\n\n  tuple& operator=(const tuple& t) { return CopyFrom(t); }\n\n  template <GTEST_2_TYPENAMES_(U)>\n  tuple& operator=(const GTEST_2_TUPLE_(U)& t) {\n    return CopyFrom(t);\n  }\n  template <typename U0, typename U1>\n  tuple& operator=(const ::std::pair<U0, U1>& p) {\n    f0_ = p.first;\n    f1_ = p.second;\n    return *this;\n  }\n\n  GTEST_DECLARE_TUPLE_AS_FRIEND_\n\n  template <GTEST_2_TYPENAMES_(U)>\n  tuple& CopyFrom(const GTEST_2_TUPLE_(U)& t) {\n    f0_ = t.f0_;\n    f1_ = t.f1_;\n    return *this;\n  }\n\n  T0 f0_;\n  T1 f1_;\n};\n\ntemplate <GTEST_3_TYPENAMES_(T)>\nclass GTEST_3_TUPLE_(T) {\n public:\n  template <int k> friend class gtest_internal::Get;\n\n  tuple() : f0_(), f1_(), f2_() {}\n\n  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,\n      GTEST_BY_REF_(T2) f2) : f0_(f0), f1_(f1), f2_(f2) {}\n\n  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}\n\n  template <GTEST_3_TYPENAMES_(U)>\n  tuple(const GTEST_3_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}\n\n  tuple& operator=(const tuple& t) { return CopyFrom(t); }\n\n  template <GTEST_3_TYPENAMES_(U)>\n  tuple& operator=(const GTEST_3_TUPLE_(U)& t) {\n    return CopyFrom(t);\n  }\n\n  GTEST_DECLARE_TUPLE_AS_FRIEND_\n\n  template <GTEST_3_TYPENAMES_(U)>\n  tuple& CopyFrom(const GTEST_3_TUPLE_(U)& t) {\n    f0_ = t.f0_;\n    f1_ = t.f1_;\n    f2_ = t.f2_;\n    return *this;\n  }\n\n  T0 f0_;\n  T1 f1_;\n  T2 f2_;\n};\n\ntemplate <GTEST_4_TYPENAMES_(T)>\nclass GTEST_4_TUPLE_(T) {\n public:\n  template <int k> friend class gtest_internal::Get;\n\n  tuple() : f0_(), f1_(), f2_(), f3_() {}\n\n  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,\n      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3) : f0_(f0), f1_(f1), f2_(f2),\n      f3_(f3) {}\n\n  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_) {}\n\n  template <GTEST_4_TYPENAMES_(U)>\n  tuple(const GTEST_4_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),\n      f3_(t.f3_) {}\n\n  tuple& operator=(const tuple& t) { return CopyFrom(t); }\n\n  template <GTEST_4_TYPENAMES_(U)>\n  tuple& operator=(const GTEST_4_TUPLE_(U)& t) {\n    return CopyFrom(t);\n  }\n\n  GTEST_DECLARE_TUPLE_AS_FRIEND_\n\n  template <GTEST_4_TYPENAMES_(U)>\n  tuple& CopyFrom(const GTEST_4_TUPLE_(U)& t) {\n    f0_ = t.f0_;\n    f1_ = t.f1_;\n    f2_ = t.f2_;\n    f3_ = t.f3_;\n    return *this;\n  }\n\n  T0 f0_;\n  T1 f1_;\n  T2 f2_;\n  T3 f3_;\n};\n\ntemplate <GTEST_5_TYPENAMES_(T)>\nclass GTEST_5_TUPLE_(T) {\n public:\n  template <int k> friend class gtest_internal::Get;\n\n  tuple() : f0_(), f1_(), f2_(), f3_(), f4_() {}\n\n  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,\n      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3,\n      GTEST_BY_REF_(T4) f4) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4) {}\n\n  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),\n      f4_(t.f4_) {}\n\n  template <GTEST_5_TYPENAMES_(U)>\n  tuple(const GTEST_5_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),\n      f3_(t.f3_), f4_(t.f4_) {}\n\n  tuple& operator=(const tuple& t) { return CopyFrom(t); }\n\n  template <GTEST_5_TYPENAMES_(U)>\n  tuple& operator=(const GTEST_5_TUPLE_(U)& t) {\n    return CopyFrom(t);\n  }\n\n  GTEST_DECLARE_TUPLE_AS_FRIEND_\n\n  template <GTEST_5_TYPENAMES_(U)>\n  tuple& CopyFrom(const GTEST_5_TUPLE_(U)& t) {\n    f0_ = t.f0_;\n    f1_ = t.f1_;\n    f2_ = t.f2_;\n    f3_ = t.f3_;\n    f4_ = t.f4_;\n    return *this;\n  }\n\n  T0 f0_;\n  T1 f1_;\n  T2 f2_;\n  T3 f3_;\n  T4 f4_;\n};\n\ntemplate <GTEST_6_TYPENAMES_(T)>\nclass GTEST_6_TUPLE_(T) {\n public:\n  template <int k> friend class gtest_internal::Get;\n\n  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_() {}\n\n  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,\n      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,\n      GTEST_BY_REF_(T5) f5) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),\n      f5_(f5) {}\n\n  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),\n      f4_(t.f4_), f5_(t.f5_) {}\n\n  template <GTEST_6_TYPENAMES_(U)>\n  tuple(const GTEST_6_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),\n      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_) {}\n\n  tuple& operator=(const tuple& t) { return CopyFrom(t); }\n\n  template <GTEST_6_TYPENAMES_(U)>\n  tuple& operator=(const GTEST_6_TUPLE_(U)& t) {\n    return CopyFrom(t);\n  }\n\n  GTEST_DECLARE_TUPLE_AS_FRIEND_\n\n  template <GTEST_6_TYPENAMES_(U)>\n  tuple& CopyFrom(const GTEST_6_TUPLE_(U)& t) {\n    f0_ = t.f0_;\n    f1_ = t.f1_;\n    f2_ = t.f2_;\n    f3_ = t.f3_;\n    f4_ = t.f4_;\n    f5_ = t.f5_;\n    return *this;\n  }\n\n  T0 f0_;\n  T1 f1_;\n  T2 f2_;\n  T3 f3_;\n  T4 f4_;\n  T5 f5_;\n};\n\ntemplate <GTEST_7_TYPENAMES_(T)>\nclass GTEST_7_TUPLE_(T) {\n public:\n  template <int k> friend class gtest_internal::Get;\n\n  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_() {}\n\n  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,\n      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,\n      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6) : f0_(f0), f1_(f1), f2_(f2),\n      f3_(f3), f4_(f4), f5_(f5), f6_(f6) {}\n\n  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),\n      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}\n\n  template <GTEST_7_TYPENAMES_(U)>\n  tuple(const GTEST_7_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),\n      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}\n\n  tuple& operator=(const tuple& t) { return CopyFrom(t); }\n\n  template <GTEST_7_TYPENAMES_(U)>\n  tuple& operator=(const GTEST_7_TUPLE_(U)& t) {\n    return CopyFrom(t);\n  }\n\n  GTEST_DECLARE_TUPLE_AS_FRIEND_\n\n  template <GTEST_7_TYPENAMES_(U)>\n  tuple& CopyFrom(const GTEST_7_TUPLE_(U)& t) {\n    f0_ = t.f0_;\n    f1_ = t.f1_;\n    f2_ = t.f2_;\n    f3_ = t.f3_;\n    f4_ = t.f4_;\n    f5_ = t.f5_;\n    f6_ = t.f6_;\n    return *this;\n  }\n\n  T0 f0_;\n  T1 f1_;\n  T2 f2_;\n  T3 f3_;\n  T4 f4_;\n  T5 f5_;\n  T6 f6_;\n};\n\ntemplate <GTEST_8_TYPENAMES_(T)>\nclass GTEST_8_TUPLE_(T) {\n public:\n  template <int k> friend class gtest_internal::Get;\n\n  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_() {}\n\n  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,\n      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,\n      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6,\n      GTEST_BY_REF_(T7) f7) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),\n      f5_(f5), f6_(f6), f7_(f7) {}\n\n  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),\n      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}\n\n  template <GTEST_8_TYPENAMES_(U)>\n  tuple(const GTEST_8_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),\n      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}\n\n  tuple& operator=(const tuple& t) { return CopyFrom(t); }\n\n  template <GTEST_8_TYPENAMES_(U)>\n  tuple& operator=(const GTEST_8_TUPLE_(U)& t) {\n    return CopyFrom(t);\n  }\n\n  GTEST_DECLARE_TUPLE_AS_FRIEND_\n\n  template <GTEST_8_TYPENAMES_(U)>\n  tuple& CopyFrom(const GTEST_8_TUPLE_(U)& t) {\n    f0_ = t.f0_;\n    f1_ = t.f1_;\n    f2_ = t.f2_;\n    f3_ = t.f3_;\n    f4_ = t.f4_;\n    f5_ = t.f5_;\n    f6_ = t.f6_;\n    f7_ = t.f7_;\n    return *this;\n  }\n\n  T0 f0_;\n  T1 f1_;\n  T2 f2_;\n  T3 f3_;\n  T4 f4_;\n  T5 f5_;\n  T6 f6_;\n  T7 f7_;\n};\n\ntemplate <GTEST_9_TYPENAMES_(T)>\nclass GTEST_9_TUPLE_(T) {\n public:\n  template <int k> friend class gtest_internal::Get;\n\n  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_() {}\n\n  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,\n      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,\n      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,\n      GTEST_BY_REF_(T8) f8) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),\n      f5_(f5), f6_(f6), f7_(f7), f8_(f8) {}\n\n  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),\n      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}\n\n  template <GTEST_9_TYPENAMES_(U)>\n  tuple(const GTEST_9_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),\n      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}\n\n  tuple& operator=(const tuple& t) { return CopyFrom(t); }\n\n  template <GTEST_9_TYPENAMES_(U)>\n  tuple& operator=(const GTEST_9_TUPLE_(U)& t) {\n    return CopyFrom(t);\n  }\n\n  GTEST_DECLARE_TUPLE_AS_FRIEND_\n\n  template <GTEST_9_TYPENAMES_(U)>\n  tuple& CopyFrom(const GTEST_9_TUPLE_(U)& t) {\n    f0_ = t.f0_;\n    f1_ = t.f1_;\n    f2_ = t.f2_;\n    f3_ = t.f3_;\n    f4_ = t.f4_;\n    f5_ = t.f5_;\n    f6_ = t.f6_;\n    f7_ = t.f7_;\n    f8_ = t.f8_;\n    return *this;\n  }\n\n  T0 f0_;\n  T1 f1_;\n  T2 f2_;\n  T3 f3_;\n  T4 f4_;\n  T5 f5_;\n  T6 f6_;\n  T7 f7_;\n  T8 f8_;\n};\n\ntemplate <GTEST_10_TYPENAMES_(T)>\nclass tuple {\n public:\n  template <int k> friend class gtest_internal::Get;\n\n  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_(),\n      f9_() {}\n\n  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,\n      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,\n      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,\n      GTEST_BY_REF_(T8) f8, GTEST_BY_REF_(T9) f9) : f0_(f0), f1_(f1), f2_(f2),\n      f3_(f3), f4_(f4), f5_(f5), f6_(f6), f7_(f7), f8_(f8), f9_(f9) {}\n\n  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),\n      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_), f9_(t.f9_) {}\n\n  template <GTEST_10_TYPENAMES_(U)>\n  tuple(const GTEST_10_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),\n      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_),\n      f9_(t.f9_) {}\n\n  tuple& operator=(const tuple& t) { return CopyFrom(t); }\n\n  template <GTEST_10_TYPENAMES_(U)>\n  tuple& operator=(const GTEST_10_TUPLE_(U)& t) {\n    return CopyFrom(t);\n  }\n\n  GTEST_DECLARE_TUPLE_AS_FRIEND_\n\n  template <GTEST_10_TYPENAMES_(U)>\n  tuple& CopyFrom(const GTEST_10_TUPLE_(U)& t) {\n    f0_ = t.f0_;\n    f1_ = t.f1_;\n    f2_ = t.f2_;\n    f3_ = t.f3_;\n    f4_ = t.f4_;\n    f5_ = t.f5_;\n    f6_ = t.f6_;\n    f7_ = t.f7_;\n    f8_ = t.f8_;\n    f9_ = t.f9_;\n    return *this;\n  }\n\n  T0 f0_;\n  T1 f1_;\n  T2 f2_;\n  T3 f3_;\n  T4 f4_;\n  T5 f5_;\n  T6 f6_;\n  T7 f7_;\n  T8 f8_;\n  T9 f9_;\n};\n\n// 6.1.3.2 Tuple creation functions.\n\n// Known limitations: we don't support passing an\n// std::tr1::reference_wrapper<T> to make_tuple().  And we don't\n// implement tie().\n\ninline tuple<> make_tuple() { return tuple<>(); }\n\ntemplate <GTEST_1_TYPENAMES_(T)>\ninline GTEST_1_TUPLE_(T) make_tuple(const T0& f0) {\n  return GTEST_1_TUPLE_(T)(f0);\n}\n\ntemplate <GTEST_2_TYPENAMES_(T)>\ninline GTEST_2_TUPLE_(T) make_tuple(const T0& f0, const T1& f1) {\n  return GTEST_2_TUPLE_(T)(f0, f1);\n}\n\ntemplate <GTEST_3_TYPENAMES_(T)>\ninline GTEST_3_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2) {\n  return GTEST_3_TUPLE_(T)(f0, f1, f2);\n}\n\ntemplate <GTEST_4_TYPENAMES_(T)>\ninline GTEST_4_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,\n    const T3& f3) {\n  return GTEST_4_TUPLE_(T)(f0, f1, f2, f3);\n}\n\ntemplate <GTEST_5_TYPENAMES_(T)>\ninline GTEST_5_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,\n    const T3& f3, const T4& f4) {\n  return GTEST_5_TUPLE_(T)(f0, f1, f2, f3, f4);\n}\n\ntemplate <GTEST_6_TYPENAMES_(T)>\ninline GTEST_6_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,\n    const T3& f3, const T4& f4, const T5& f5) {\n  return GTEST_6_TUPLE_(T)(f0, f1, f2, f3, f4, f5);\n}\n\ntemplate <GTEST_7_TYPENAMES_(T)>\ninline GTEST_7_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,\n    const T3& f3, const T4& f4, const T5& f5, const T6& f6) {\n  return GTEST_7_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6);\n}\n\ntemplate <GTEST_8_TYPENAMES_(T)>\ninline GTEST_8_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,\n    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7) {\n  return GTEST_8_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7);\n}\n\ntemplate <GTEST_9_TYPENAMES_(T)>\ninline GTEST_9_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,\n    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,\n    const T8& f8) {\n  return GTEST_9_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8);\n}\n\ntemplate <GTEST_10_TYPENAMES_(T)>\ninline GTEST_10_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,\n    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,\n    const T8& f8, const T9& f9) {\n  return GTEST_10_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9);\n}\n\n// 6.1.3.3 Tuple helper classes.\n\ntemplate <typename Tuple> struct tuple_size;\n\ntemplate <GTEST_0_TYPENAMES_(T)>\nstruct tuple_size<GTEST_0_TUPLE_(T)> { static const int value = 0; };\n\ntemplate <GTEST_1_TYPENAMES_(T)>\nstruct tuple_size<GTEST_1_TUPLE_(T)> { static const int value = 1; };\n\ntemplate <GTEST_2_TYPENAMES_(T)>\nstruct tuple_size<GTEST_2_TUPLE_(T)> { static const int value = 2; };\n\ntemplate <GTEST_3_TYPENAMES_(T)>\nstruct tuple_size<GTEST_3_TUPLE_(T)> { static const int value = 3; };\n\ntemplate <GTEST_4_TYPENAMES_(T)>\nstruct tuple_size<GTEST_4_TUPLE_(T)> { static const int value = 4; };\n\ntemplate <GTEST_5_TYPENAMES_(T)>\nstruct tuple_size<GTEST_5_TUPLE_(T)> { static const int value = 5; };\n\ntemplate <GTEST_6_TYPENAMES_(T)>\nstruct tuple_size<GTEST_6_TUPLE_(T)> { static const int value = 6; };\n\ntemplate <GTEST_7_TYPENAMES_(T)>\nstruct tuple_size<GTEST_7_TUPLE_(T)> { static const int value = 7; };\n\ntemplate <GTEST_8_TYPENAMES_(T)>\nstruct tuple_size<GTEST_8_TUPLE_(T)> { static const int value = 8; };\n\ntemplate <GTEST_9_TYPENAMES_(T)>\nstruct tuple_size<GTEST_9_TUPLE_(T)> { static const int value = 9; };\n\ntemplate <GTEST_10_TYPENAMES_(T)>\nstruct tuple_size<GTEST_10_TUPLE_(T)> { static const int value = 10; };\n\ntemplate <int k, class Tuple>\nstruct tuple_element {\n  typedef typename gtest_internal::TupleElement<\n      k < (tuple_size<Tuple>::value), k, Tuple>::type type;\n};\n\n#define GTEST_TUPLE_ELEMENT_(k, Tuple) typename tuple_element<k, Tuple >::type\n\n// 6.1.3.4 Element access.\n\nnamespace gtest_internal {\n\ntemplate <>\nclass Get<0> {\n public:\n  template <class Tuple>\n  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))\n  Field(Tuple& t) { return t.f0_; }  // NOLINT\n\n  template <class Tuple>\n  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))\n  ConstField(const Tuple& t) { return t.f0_; }\n};\n\ntemplate <>\nclass Get<1> {\n public:\n  template <class Tuple>\n  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))\n  Field(Tuple& t) { return t.f1_; }  // NOLINT\n\n  template <class Tuple>\n  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))\n  ConstField(const Tuple& t) { return t.f1_; }\n};\n\ntemplate <>\nclass Get<2> {\n public:\n  template <class Tuple>\n  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))\n  Field(Tuple& t) { return t.f2_; }  // NOLINT\n\n  template <class Tuple>\n  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))\n  ConstField(const Tuple& t) { return t.f2_; }\n};\n\ntemplate <>\nclass Get<3> {\n public:\n  template <class Tuple>\n  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))\n  Field(Tuple& t) { return t.f3_; }  // NOLINT\n\n  template <class Tuple>\n  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))\n  ConstField(const Tuple& t) { return t.f3_; }\n};\n\ntemplate <>\nclass Get<4> {\n public:\n  template <class Tuple>\n  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))\n  Field(Tuple& t) { return t.f4_; }  // NOLINT\n\n  template <class Tuple>\n  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))\n  ConstField(const Tuple& t) { return t.f4_; }\n};\n\ntemplate <>\nclass Get<5> {\n public:\n  template <class Tuple>\n  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))\n  Field(Tuple& t) { return t.f5_; }  // NOLINT\n\n  template <class Tuple>\n  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))\n  ConstField(const Tuple& t) { return t.f5_; }\n};\n\ntemplate <>\nclass Get<6> {\n public:\n  template <class Tuple>\n  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))\n  Field(Tuple& t) { return t.f6_; }  // NOLINT\n\n  template <class Tuple>\n  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))\n  ConstField(const Tuple& t) { return t.f6_; }\n};\n\ntemplate <>\nclass Get<7> {\n public:\n  template <class Tuple>\n  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))\n  Field(Tuple& t) { return t.f7_; }  // NOLINT\n\n  template <class Tuple>\n  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))\n  ConstField(const Tuple& t) { return t.f7_; }\n};\n\ntemplate <>\nclass Get<8> {\n public:\n  template <class Tuple>\n  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))\n  Field(Tuple& t) { return t.f8_; }  // NOLINT\n\n  template <class Tuple>\n  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))\n  ConstField(const Tuple& t) { return t.f8_; }\n};\n\ntemplate <>\nclass Get<9> {\n public:\n  template <class Tuple>\n  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))\n  Field(Tuple& t) { return t.f9_; }  // NOLINT\n\n  template <class Tuple>\n  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))\n  ConstField(const Tuple& t) { return t.f9_; }\n};\n\n}  // namespace gtest_internal\n\ntemplate <int k, GTEST_10_TYPENAMES_(T)>\nGTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_10_TUPLE_(T)))\nget(GTEST_10_TUPLE_(T)& t) {\n  return gtest_internal::Get<k>::Field(t);\n}\n\ntemplate <int k, GTEST_10_TYPENAMES_(T)>\nGTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(k,  GTEST_10_TUPLE_(T)))\nget(const GTEST_10_TUPLE_(T)& t) {\n  return gtest_internal::Get<k>::ConstField(t);\n}\n\n// 6.1.3.5 Relational operators\n\n// We only implement == and !=, as we don't have a need for the rest yet.\n\nnamespace gtest_internal {\n\n// SameSizeTuplePrefixComparator<k, k>::Eq(t1, t2) returns true if the\n// first k fields of t1 equals the first k fields of t2.\n// SameSizeTuplePrefixComparator(k1, k2) would be a compiler error if\n// k1 != k2.\ntemplate <int kSize1, int kSize2>\nstruct SameSizeTuplePrefixComparator;\n\ntemplate <>\nstruct SameSizeTuplePrefixComparator<0, 0> {\n  template <class Tuple1, class Tuple2>\n  static bool Eq(const Tuple1& /* t1 */, const Tuple2& /* t2 */) {\n    return true;\n  }\n};\n\ntemplate <int k>\nstruct SameSizeTuplePrefixComparator<k, k> {\n  template <class Tuple1, class Tuple2>\n  static bool Eq(const Tuple1& t1, const Tuple2& t2) {\n    return SameSizeTuplePrefixComparator<k - 1, k - 1>::Eq(t1, t2) &&\n        ::std::tr1::get<k - 1>(t1) == ::std::tr1::get<k - 1>(t2);\n  }\n};\n\n}  // namespace gtest_internal\n\ntemplate <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>\ninline bool operator==(const GTEST_10_TUPLE_(T)& t,\n                       const GTEST_10_TUPLE_(U)& u) {\n  return gtest_internal::SameSizeTuplePrefixComparator<\n      tuple_size<GTEST_10_TUPLE_(T)>::value,\n      tuple_size<GTEST_10_TUPLE_(U)>::value>::Eq(t, u);\n}\n\ntemplate <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>\ninline bool operator!=(const GTEST_10_TUPLE_(T)& t,\n                       const GTEST_10_TUPLE_(U)& u) { return !(t == u); }\n\n// 6.1.4 Pairs.\n// Unimplemented.\n\n}  // namespace tr1\n}  // namespace std\n\n#undef GTEST_0_TUPLE_\n#undef GTEST_1_TUPLE_\n#undef GTEST_2_TUPLE_\n#undef GTEST_3_TUPLE_\n#undef GTEST_4_TUPLE_\n#undef GTEST_5_TUPLE_\n#undef GTEST_6_TUPLE_\n#undef GTEST_7_TUPLE_\n#undef GTEST_8_TUPLE_\n#undef GTEST_9_TUPLE_\n#undef GTEST_10_TUPLE_\n\n#undef GTEST_0_TYPENAMES_\n#undef GTEST_1_TYPENAMES_\n#undef GTEST_2_TYPENAMES_\n#undef GTEST_3_TYPENAMES_\n#undef GTEST_4_TYPENAMES_\n#undef GTEST_5_TYPENAMES_\n#undef GTEST_6_TYPENAMES_\n#undef GTEST_7_TYPENAMES_\n#undef GTEST_8_TYPENAMES_\n#undef GTEST_9_TYPENAMES_\n#undef GTEST_10_TYPENAMES_\n\n#undef GTEST_DECLARE_TUPLE_AS_FRIEND_\n#undef GTEST_BY_REF_\n#undef GTEST_ADD_REF_\n#undef GTEST_TUPLE_ELEMENT_\n\n#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_\n# elif GTEST_OS_SYMBIAN\n\n// On Symbian, BOOST_HAS_TR1_TUPLE causes Boost's TR1 tuple library to\n// use STLport's tuple implementation, which unfortunately doesn't\n// work as the copy of STLport distributed with Symbian is incomplete.\n// By making sure BOOST_HAS_TR1_TUPLE is undefined, we force Boost to\n// use its own tuple implementation.\n#  ifdef BOOST_HAS_TR1_TUPLE\n#   undef BOOST_HAS_TR1_TUPLE\n#  endif  // BOOST_HAS_TR1_TUPLE\n\n// This prevents <boost/tr1/detail/config.hpp>, which defines\n// BOOST_HAS_TR1_TUPLE, from being #included by Boost's <tuple>.\n#  define BOOST_TR1_DETAIL_CONFIG_HPP_INCLUDED\n#  include <tuple>\n\n# elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40000)\n// GCC 4.0+ implements tr1/tuple in the <tr1/tuple> header.  This does\n// not conform to the TR1 spec, which requires the header to be <tuple>.\n\n#  if !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302\n// Until version 4.3.2, gcc has a bug that causes <tr1/functional>,\n// which is #included by <tr1/tuple>, to not compile when RTTI is\n// disabled.  _TR1_FUNCTIONAL is the header guard for\n// <tr1/functional>.  Hence the following #define is a hack to prevent\n// <tr1/functional> from being included.\n#   define _TR1_FUNCTIONAL 1\n#   include <tr1/tuple>\n#   undef _TR1_FUNCTIONAL  // Allows the user to #include\n                        // <tr1/functional> if he chooses to.\n#  else\n#   include <tr1/tuple>  // NOLINT\n#  endif  // !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302\n\n# else\n// If the compiler is not GCC 4.0+, we assume the user is using a\n// spec-conforming TR1 implementation.\n#  include <tuple>  // NOLINT\n# endif  // GTEST_USE_OWN_TR1_TUPLE\n\n#endif  // GTEST_HAS_TR1_TUPLE\n\n// Determines whether clone(2) is supported.\n// Usually it will only be available on Linux, excluding\n// Linux on the Itanium architecture.\n// Also see http://linux.die.net/man/2/clone.\n#ifndef GTEST_HAS_CLONE\n// The user didn't tell us, so we need to figure it out.\n\n# if GTEST_OS_LINUX && !defined(__ia64__)\n#  define GTEST_HAS_CLONE 1\n# else\n#  define GTEST_HAS_CLONE 0\n# endif  // GTEST_OS_LINUX && !defined(__ia64__)\n\n#endif  // GTEST_HAS_CLONE\n\n// Determines whether to support stream redirection. This is used to test\n// output correctness and to implement death tests.\n#ifndef GTEST_HAS_STREAM_REDIRECTION\n// By default, we assume that stream redirection is supported on all\n// platforms except known mobile ones.\n# if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN\n#  define GTEST_HAS_STREAM_REDIRECTION 0\n# else\n#  define GTEST_HAS_STREAM_REDIRECTION 1\n# endif  // !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_SYMBIAN\n#endif  // GTEST_HAS_STREAM_REDIRECTION\n\n// Determines whether to support death tests.\n// Google Test does not support death tests for VC 7.1 and earlier as\n// abort() in a VC 7.1 application compiled as GUI in debug config\n// pops up a dialog window that cannot be suppressed programmatically.\n#if (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \\\n     (GTEST_OS_WINDOWS_DESKTOP && _MSC_VER >= 1400) || \\\n     GTEST_OS_WINDOWS_MINGW || GTEST_OS_AIX || GTEST_OS_HPUX)\n# define GTEST_HAS_DEATH_TEST 1\n# include <vector>  // NOLINT\n#endif\n\n// We don't support MSVC 7.1 with exceptions disabled now.  Therefore\n// all the compilers we care about are adequate for supporting\n// value-parameterized tests.\n#define GTEST_HAS_PARAM_TEST 1\n\n// Determines whether to support type-driven tests.\n\n// Typed tests need <typeinfo> and variadic macros, which GCC, VC++ 8.0,\n// Sun Pro CC, IBM Visual Age, and HP aCC support.\n#if defined(__GNUC__) || (_MSC_VER >= 1400) || defined(__SUNPRO_CC) || \\\n    defined(__IBMCPP__) || defined(__HP_aCC)\n# define GTEST_HAS_TYPED_TEST 1\n# define GTEST_HAS_TYPED_TEST_P 1\n#endif\n\n// Determines whether to support Combine(). This only makes sense when\n// value-parameterized tests are enabled.  The implementation doesn't\n// work on Sun Studio since it doesn't understand templated conversion\n// operators.\n#if GTEST_HAS_PARAM_TEST && GTEST_HAS_TR1_TUPLE && !defined(__SUNPRO_CC)\n# define GTEST_HAS_COMBINE 1\n#endif\n\n// Determines whether the system compiler uses UTF-16 for encoding wide strings.\n#define GTEST_WIDE_STRING_USES_UTF16_ \\\n    (GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_SYMBIAN || GTEST_OS_AIX)\n\n// Determines whether test results can be streamed to a socket.\n#if GTEST_OS_LINUX\n# define GTEST_CAN_STREAM_RESULTS_ 1\n#endif\n\n// Defines some utility macros.\n\n// The GNU compiler emits a warning if nested \"if\" statements are followed by\n// an \"else\" statement and braces are not used to explicitly disambiguate the\n// \"else\" binding.  This leads to problems with code like:\n//\n//   if (gate)\n//     ASSERT_*(condition) << \"Some message\";\n//\n// The \"switch (0) case 0:\" idiom is used to suppress this.\n#ifdef __INTEL_COMPILER\n# define GTEST_AMBIGUOUS_ELSE_BLOCKER_\n#else\n# define GTEST_AMBIGUOUS_ELSE_BLOCKER_ switch (0) case 0: default:  // NOLINT\n#endif\n\n// Use this annotation at the end of a struct/class definition to\n// prevent the compiler from optimizing away instances that are never\n// used.  This is useful when all interesting logic happens inside the\n// c'tor and / or d'tor.  Example:\n//\n//   struct Foo {\n//     Foo() { ... }\n//   } GTEST_ATTRIBUTE_UNUSED_;\n//\n// Also use it after a variable or parameter declaration to tell the\n// compiler the variable/parameter does not have to be used.\n#if defined(__GNUC__) && !defined(COMPILER_ICC)\n# define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused))\n#else\n# define GTEST_ATTRIBUTE_UNUSED_\n#endif\n\n// A macro to disallow operator=\n// This should be used in the private: declarations for a class.\n#define GTEST_DISALLOW_ASSIGN_(type)\\\n  void operator=(type const &)\n\n// A macro to disallow copy constructor and operator=\n// This should be used in the private: declarations for a class.\n#define GTEST_DISALLOW_COPY_AND_ASSIGN_(type)\\\n  type(type const &);\\\n  GTEST_DISALLOW_ASSIGN_(type)\n\n// Tell the compiler to warn about unused return values for functions declared\n// with this macro.  The macro should be used on function declarations\n// following the argument list:\n//\n//   Sprocket* AllocateSprocket() GTEST_MUST_USE_RESULT_;\n#if defined(__GNUC__) && (GTEST_GCC_VER_ >= 30400) && !defined(COMPILER_ICC)\n# define GTEST_MUST_USE_RESULT_ __attribute__ ((warn_unused_result))\n#else\n# define GTEST_MUST_USE_RESULT_\n#endif  // __GNUC__ && (GTEST_GCC_VER_ >= 30400) && !COMPILER_ICC\n\n// Determine whether the compiler supports Microsoft's Structured Exception\n// Handling.  This is supported by several Windows compilers but generally\n// does not exist on any other system.\n#ifndef GTEST_HAS_SEH\n// The user didn't tell us, so we need to figure it out.\n\n# if defined(_MSC_VER) || defined(__BORLANDC__)\n// These two compilers are known to support SEH.\n#  define GTEST_HAS_SEH 1\n# else\n// Assume no SEH.\n#  define GTEST_HAS_SEH 0\n# endif\n\n#endif  // GTEST_HAS_SEH\n\n#ifdef _MSC_VER\n\n# if GTEST_LINKED_AS_SHARED_LIBRARY\n#  define GTEST_API_ __declspec(dllimport)\n# elif GTEST_CREATE_SHARED_LIBRARY\n#  define GTEST_API_ __declspec(dllexport)\n# endif\n\n#endif  // _MSC_VER\n\n#ifndef GTEST_API_\n# define GTEST_API_\n#endif\n\n#ifdef __GNUC__\n// Ask the compiler to never inline a given function.\n# define GTEST_NO_INLINE_ __attribute__((noinline))\n#else\n# define GTEST_NO_INLINE_\n#endif\n\nnamespace testing {\n\nclass Message;\n\nnamespace internal {\n\nclass String;\n\n// The GTEST_COMPILE_ASSERT_ macro can be used to verify that a compile time\n// expression is true. For example, you could use it to verify the\n// size of a static array:\n//\n//   GTEST_COMPILE_ASSERT_(ARRAYSIZE(content_type_names) == CONTENT_NUM_TYPES,\n//                         content_type_names_incorrect_size);\n//\n// or to make sure a struct is smaller than a certain size:\n//\n//   GTEST_COMPILE_ASSERT_(sizeof(foo) < 128, foo_too_large);\n//\n// The second argument to the macro is the name of the variable. If\n// the expression is false, most compilers will issue a warning/error\n// containing the name of the variable.\n\ntemplate <bool>\nstruct CompileAssert {\n};\n\n#define GTEST_COMPILE_ASSERT_(expr, msg) \\\n  typedef ::testing::internal::CompileAssert<(bool(expr))> \\\n      msg[bool(expr) ? 1 : -1]\n\n// Implementation details of GTEST_COMPILE_ASSERT_:\n//\n// - GTEST_COMPILE_ASSERT_ works by defining an array type that has -1\n//   elements (and thus is invalid) when the expression is false.\n//\n// - The simpler definition\n//\n//    #define GTEST_COMPILE_ASSERT_(expr, msg) typedef char msg[(expr) ? 1 : -1]\n//\n//   does not work, as gcc supports variable-length arrays whose sizes\n//   are determined at run-time (this is gcc's extension and not part\n//   of the C++ standard).  As a result, gcc fails to reject the\n//   following code with the simple definition:\n//\n//     int foo;\n//     GTEST_COMPILE_ASSERT_(foo, msg); // not supposed to compile as foo is\n//                                      // not a compile-time constant.\n//\n// - By using the type CompileAssert<(bool(expr))>, we ensures that\n//   expr is a compile-time constant.  (Template arguments must be\n//   determined at compile-time.)\n//\n// - The outter parentheses in CompileAssert<(bool(expr))> are necessary\n//   to work around a bug in gcc 3.4.4 and 4.0.1.  If we had written\n//\n//     CompileAssert<bool(expr)>\n//\n//   instead, these compilers will refuse to compile\n//\n//     GTEST_COMPILE_ASSERT_(5 > 0, some_message);\n//\n//   (They seem to think the \">\" in \"5 > 0\" marks the end of the\n//   template argument list.)\n//\n// - The array size is (bool(expr) ? 1 : -1), instead of simply\n//\n//     ((expr) ? 1 : -1).\n//\n//   This is to avoid running into a bug in MS VC 7.1, which\n//   causes ((0.0) ? 1 : -1) to incorrectly evaluate to 1.\n\n// StaticAssertTypeEqHelper is used by StaticAssertTypeEq defined in gtest.h.\n//\n// This template is declared, but intentionally undefined.\ntemplate <typename T1, typename T2>\nstruct StaticAssertTypeEqHelper;\n\ntemplate <typename T>\nstruct StaticAssertTypeEqHelper<T, T> {};\n\n#if GTEST_HAS_GLOBAL_STRING\ntypedef ::string string;\n#else\ntypedef ::std::string string;\n#endif  // GTEST_HAS_GLOBAL_STRING\n\n#if GTEST_HAS_GLOBAL_WSTRING\ntypedef ::wstring wstring;\n#elif GTEST_HAS_STD_WSTRING\ntypedef ::std::wstring wstring;\n#endif  // GTEST_HAS_GLOBAL_WSTRING\n\n// A helper for suppressing warnings on constant condition.  It just\n// returns 'condition'.\nGTEST_API_ bool IsTrue(bool condition);\n\n// Defines scoped_ptr.\n\n// This implementation of scoped_ptr is PARTIAL - it only contains\n// enough stuff to satisfy Google Test's need.\ntemplate <typename T>\nclass scoped_ptr {\n public:\n  typedef T element_type;\n\n  explicit scoped_ptr(T* p = NULL) : ptr_(p) {}\n  ~scoped_ptr() { reset(); }\n\n  T& operator*() const { return *ptr_; }\n  T* operator->() const { return ptr_; }\n  T* get() const { return ptr_; }\n\n  T* release() {\n    T* const ptr = ptr_;\n    ptr_ = NULL;\n    return ptr;\n  }\n\n  void reset(T* p = NULL) {\n    if (p != ptr_) {\n      if (IsTrue(sizeof(T) > 0)) {  // Makes sure T is a complete type.\n        delete ptr_;\n      }\n      ptr_ = p;\n    }\n  }\n private:\n  T* ptr_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(scoped_ptr);\n};\n\n// Defines RE.\n\n// A simple C++ wrapper for <regex.h>.  It uses the POSIX Extended\n// Regular Expression syntax.\nclass GTEST_API_ RE {\n public:\n  // A copy constructor is required by the Standard to initialize object\n  // references from r-values.\n  RE(const RE& other) { Init(other.pattern()); }\n\n  // Constructs an RE from a string.\n  RE(const ::std::string& regex) { Init(regex.c_str()); }  // NOLINT\n\n#if GTEST_HAS_GLOBAL_STRING\n\n  RE(const ::string& regex) { Init(regex.c_str()); }  // NOLINT\n\n#endif  // GTEST_HAS_GLOBAL_STRING\n\n  RE(const char* regex) { Init(regex); }  // NOLINT\n  ~RE();\n\n  // Returns the string representation of the regex.\n  const char* pattern() const { return pattern_; }\n\n  // FullMatch(str, re) returns true iff regular expression re matches\n  // the entire str.\n  // PartialMatch(str, re) returns true iff regular expression re\n  // matches a substring of str (including str itself).\n  //\n  // TODO(wan@google.com): make FullMatch() and PartialMatch() work\n  // when str contains NUL characters.\n  static bool FullMatch(const ::std::string& str, const RE& re) {\n    return FullMatch(str.c_str(), re);\n  }\n  static bool PartialMatch(const ::std::string& str, const RE& re) {\n    return PartialMatch(str.c_str(), re);\n  }\n\n#if GTEST_HAS_GLOBAL_STRING\n\n  static bool FullMatch(const ::string& str, const RE& re) {\n    return FullMatch(str.c_str(), re);\n  }\n  static bool PartialMatch(const ::string& str, const RE& re) {\n    return PartialMatch(str.c_str(), re);\n  }\n\n#endif  // GTEST_HAS_GLOBAL_STRING\n\n  static bool FullMatch(const char* str, const RE& re);\n  static bool PartialMatch(const char* str, const RE& re);\n\n private:\n  void Init(const char* regex);\n\n  // We use a const char* instead of a string, as Google Test may be used\n  // where string is not available.  We also do not use Google Test's own\n  // String type here, in order to simplify dependencies between the\n  // files.\n  const char* pattern_;\n  bool is_valid_;\n\n#if GTEST_USES_POSIX_RE\n\n  regex_t full_regex_;     // For FullMatch().\n  regex_t partial_regex_;  // For PartialMatch().\n\n#else  // GTEST_USES_SIMPLE_RE\n\n  const char* full_pattern_;  // For FullMatch();\n\n#endif\n\n  GTEST_DISALLOW_ASSIGN_(RE);\n};\n\n// Formats a source file path and a line number as they would appear\n// in an error message from the compiler used to compile this code.\nGTEST_API_ ::std::string FormatFileLocation(const char* file, int line);\n\n// Formats a file location for compiler-independent XML output.\n// Although this function is not platform dependent, we put it next to\n// FormatFileLocation in order to contrast the two functions.\nGTEST_API_ ::std::string FormatCompilerIndependentFileLocation(const char* file,\n                                                               int line);\n\n// Defines logging utilities:\n//   GTEST_LOG_(severity) - logs messages at the specified severity level. The\n//                          message itself is streamed into the macro.\n//   LogToStderr()  - directs all log messages to stderr.\n//   FlushInfoLog() - flushes informational log messages.\n\nenum GTestLogSeverity {\n  GTEST_INFO,\n  GTEST_WARNING,\n  GTEST_ERROR,\n  GTEST_FATAL\n};\n\n// Formats log entry severity, provides a stream object for streaming the\n// log message, and terminates the message with a newline when going out of\n// scope.\nclass GTEST_API_ GTestLog {\n public:\n  GTestLog(GTestLogSeverity severity, const char* file, int line);\n\n  // Flushes the buffers and, if severity is GTEST_FATAL, aborts the program.\n  ~GTestLog();\n\n  ::std::ostream& GetStream() { return ::std::cerr; }\n\n private:\n  const GTestLogSeverity severity_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestLog);\n};\n\n#define GTEST_LOG_(severity) \\\n    ::testing::internal::GTestLog(::testing::internal::GTEST_##severity, \\\n                                  __FILE__, __LINE__).GetStream()\n\ninline void LogToStderr() {}\ninline void FlushInfoLog() { fflush(NULL); }\n\n// INTERNAL IMPLEMENTATION - DO NOT USE.\n//\n// GTEST_CHECK_ is an all-mode assert. It aborts the program if the condition\n// is not satisfied.\n//  Synopsys:\n//    GTEST_CHECK_(boolean_condition);\n//     or\n//    GTEST_CHECK_(boolean_condition) << \"Additional message\";\n//\n//    This checks the condition and if the condition is not satisfied\n//    it prints message about the condition violation, including the\n//    condition itself, plus additional message streamed into it, if any,\n//    and then it aborts the program. It aborts the program irrespective of\n//    whether it is built in the debug mode or not.\n#define GTEST_CHECK_(condition) \\\n    GTEST_AMBIGUOUS_ELSE_BLOCKER_ \\\n    if (::testing::internal::IsTrue(condition)) \\\n      ; \\\n    else \\\n      GTEST_LOG_(FATAL) << \"Condition \" #condition \" failed. \"\n\n// An all-mode assert to verify that the given POSIX-style function\n// call returns 0 (indicating success).  Known limitation: this\n// doesn't expand to a balanced 'if' statement, so enclose the macro\n// in {} if you need to use it as the only statement in an 'if'\n// branch.\n#define GTEST_CHECK_POSIX_SUCCESS_(posix_call) \\\n  if (const int gtest_error = (posix_call)) \\\n    GTEST_LOG_(FATAL) << #posix_call << \"failed with error \" \\\n                      << gtest_error\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// Use ImplicitCast_ as a safe version of static_cast for upcasting in\n// the type hierarchy (e.g. casting a Foo* to a SuperclassOfFoo* or a\n// const Foo*).  When you use ImplicitCast_, the compiler checks that\n// the cast is safe.  Such explicit ImplicitCast_s are necessary in\n// surprisingly many situations where C++ demands an exact type match\n// instead of an argument type convertable to a target type.\n//\n// The syntax for using ImplicitCast_ is the same as for static_cast:\n//\n//   ImplicitCast_<ToType>(expr)\n//\n// ImplicitCast_ would have been part of the C++ standard library,\n// but the proposal was submitted too late.  It will probably make\n// its way into the language in the future.\n//\n// This relatively ugly name is intentional. It prevents clashes with\n// similar functions users may have (e.g., implicit_cast). The internal\n// namespace alone is not enough because the function can be found by ADL.\ntemplate<typename To>\ninline To ImplicitCast_(To x) { return x; }\n\n// When you upcast (that is, cast a pointer from type Foo to type\n// SuperclassOfFoo), it's fine to use ImplicitCast_<>, since upcasts\n// always succeed.  When you downcast (that is, cast a pointer from\n// type Foo to type SubclassOfFoo), static_cast<> isn't safe, because\n// how do you know the pointer is really of type SubclassOfFoo?  It\n// could be a bare Foo, or of type DifferentSubclassOfFoo.  Thus,\n// when you downcast, you should use this macro.  In debug mode, we\n// use dynamic_cast<> to double-check the downcast is legal (we die\n// if it's not).  In normal mode, we do the efficient static_cast<>\n// instead.  Thus, it's important to test in debug mode to make sure\n// the cast is legal!\n//    This is the only place in the code we should use dynamic_cast<>.\n// In particular, you SHOULDN'T be using dynamic_cast<> in order to\n// do RTTI (eg code like this:\n//    if (dynamic_cast<Subclass1>(foo)) HandleASubclass1Object(foo);\n//    if (dynamic_cast<Subclass2>(foo)) HandleASubclass2Object(foo);\n// You should design the code some other way not to need this.\n//\n// This relatively ugly name is intentional. It prevents clashes with\n// similar functions users may have (e.g., down_cast). The internal\n// namespace alone is not enough because the function can be found by ADL.\ntemplate<typename To, typename From>  // use like this: DownCast_<T*>(foo);\ninline To DownCast_(From* f) {  // so we only accept pointers\n  // Ensures that To is a sub-type of From *.  This test is here only\n  // for compile-time type checking, and has no overhead in an\n  // optimized build at run-time, as it will be optimized away\n  // completely.\n  if (false) {\n    const To to = NULL;\n    ::testing::internal::ImplicitCast_<From*>(to);\n  }\n\n#if GTEST_HAS_RTTI\n  // RTTI: debug mode only!\n  GTEST_CHECK_(f == NULL || dynamic_cast<To>(f) != NULL);\n#endif\n  return static_cast<To>(f);\n}\n\n// Downcasts the pointer of type Base to Derived.\n// Derived must be a subclass of Base. The parameter MUST\n// point to a class of type Derived, not any subclass of it.\n// When RTTI is available, the function performs a runtime\n// check to enforce this.\ntemplate <class Derived, class Base>\nDerived* CheckedDowncastToActualType(Base* base) {\n#if GTEST_HAS_RTTI\n  GTEST_CHECK_(typeid(*base) == typeid(Derived));\n  return dynamic_cast<Derived*>(base);  // NOLINT\n#else\n  return static_cast<Derived*>(base);  // Poor man's downcast.\n#endif\n}\n\n#if GTEST_HAS_STREAM_REDIRECTION\n\n// Defines the stderr capturer:\n//   CaptureStdout     - starts capturing stdout.\n//   GetCapturedStdout - stops capturing stdout and returns the captured string.\n//   CaptureStderr     - starts capturing stderr.\n//   GetCapturedStderr - stops capturing stderr and returns the captured string.\n//\nGTEST_API_ void CaptureStdout();\nGTEST_API_ String GetCapturedStdout();\nGTEST_API_ void CaptureStderr();\nGTEST_API_ String GetCapturedStderr();\n\n#endif  // GTEST_HAS_STREAM_REDIRECTION\n\n\n#if GTEST_HAS_DEATH_TEST\n\n// A copy of all command line arguments.  Set by InitGoogleTest().\nextern ::std::vector<String> g_argvs;\n\n// GTEST_HAS_DEATH_TEST implies we have ::std::string.\nconst ::std::vector<String>& GetArgvs();\n\n#endif  // GTEST_HAS_DEATH_TEST\n\n// Defines synchronization primitives.\n\n#if GTEST_HAS_PTHREAD\n\n// Sleeps for (roughly) n milli-seconds.  This function is only for\n// testing Google Test's own constructs.  Don't use it in user tests,\n// either directly or indirectly.\ninline void SleepMilliseconds(int n) {\n  const timespec time = {\n    0,                  // 0 seconds.\n    n * 1000L * 1000L,  // And n ms.\n  };\n  nanosleep(&time, NULL);\n}\n\n// Allows a controller thread to pause execution of newly created\n// threads until notified.  Instances of this class must be created\n// and destroyed in the controller thread.\n//\n// This class is only for testing Google Test's own constructs. Do not\n// use it in user tests, either directly or indirectly.\nclass Notification {\n public:\n  Notification() : notified_(false) {}\n\n  // Notifies all threads created with this notification to start. Must\n  // be called from the controller thread.\n  void Notify() { notified_ = true; }\n\n  // Blocks until the controller thread notifies. Must be called from a test\n  // thread.\n  void WaitForNotification() {\n    while(!notified_) {\n      SleepMilliseconds(10);\n    }\n  }\n\n private:\n  volatile bool notified_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification);\n};\n\n// As a C-function, ThreadFuncWithCLinkage cannot be templated itself.\n// Consequently, it cannot select a correct instantiation of ThreadWithParam\n// in order to call its Run(). Introducing ThreadWithParamBase as a\n// non-templated base class for ThreadWithParam allows us to bypass this\n// problem.\nclass ThreadWithParamBase {\n public:\n  virtual ~ThreadWithParamBase() {}\n  virtual void Run() = 0;\n};\n\n// pthread_create() accepts a pointer to a function type with the C linkage.\n// According to the Standard (7.5/1), function types with different linkages\n// are different even if they are otherwise identical.  Some compilers (for\n// example, SunStudio) treat them as different types.  Since class methods\n// cannot be defined with C-linkage we need to define a free C-function to\n// pass into pthread_create().\nextern \"C\" inline void* ThreadFuncWithCLinkage(void* thread) {\n  static_cast<ThreadWithParamBase*>(thread)->Run();\n  return NULL;\n}\n\n// Helper class for testing Google Test's multi-threading constructs.\n// To use it, write:\n//\n//   void ThreadFunc(int param) { /* Do things with param */ }\n//   Notification thread_can_start;\n//   ...\n//   // The thread_can_start parameter is optional; you can supply NULL.\n//   ThreadWithParam<int> thread(&ThreadFunc, 5, &thread_can_start);\n//   thread_can_start.Notify();\n//\n// These classes are only for testing Google Test's own constructs. Do\n// not use them in user tests, either directly or indirectly.\ntemplate <typename T>\nclass ThreadWithParam : public ThreadWithParamBase {\n public:\n  typedef void (*UserThreadFunc)(T);\n\n  ThreadWithParam(\n      UserThreadFunc func, T param, Notification* thread_can_start)\n      : func_(func),\n        param_(param),\n        thread_can_start_(thread_can_start),\n        finished_(false) {\n    ThreadWithParamBase* const base = this;\n    // The thread can be created only after all fields except thread_\n    // have been initialized.\n    GTEST_CHECK_POSIX_SUCCESS_(\n        pthread_create(&thread_, 0, &ThreadFuncWithCLinkage, base));\n  }\n  ~ThreadWithParam() { Join(); }\n\n  void Join() {\n    if (!finished_) {\n      GTEST_CHECK_POSIX_SUCCESS_(pthread_join(thread_, 0));\n      finished_ = true;\n    }\n  }\n\n  virtual void Run() {\n    if (thread_can_start_ != NULL)\n      thread_can_start_->WaitForNotification();\n    func_(param_);\n  }\n\n private:\n  const UserThreadFunc func_;  // User-supplied thread function.\n  const T param_;  // User-supplied parameter to the thread function.\n  // When non-NULL, used to block execution until the controller thread\n  // notifies.\n  Notification* const thread_can_start_;\n  bool finished_;  // true iff we know that the thread function has finished.\n  pthread_t thread_;  // The native thread object.\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam);\n};\n\n// MutexBase and Mutex implement mutex on pthreads-based platforms. They\n// are used in conjunction with class MutexLock:\n//\n//   Mutex mutex;\n//   ...\n//   MutexLock lock(&mutex);  // Acquires the mutex and releases it at the end\n//                            // of the current scope.\n//\n// MutexBase implements behavior for both statically and dynamically\n// allocated mutexes.  Do not use MutexBase directly.  Instead, write\n// the following to define a static mutex:\n//\n//   GTEST_DEFINE_STATIC_MUTEX_(g_some_mutex);\n//\n// You can forward declare a static mutex like this:\n//\n//   GTEST_DECLARE_STATIC_MUTEX_(g_some_mutex);\n//\n// To create a dynamic mutex, just define an object of type Mutex.\nclass MutexBase {\n public:\n  // Acquires this mutex.\n  void Lock() {\n    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&mutex_));\n    owner_ = pthread_self();\n  }\n\n  // Releases this mutex.\n  void Unlock() {\n    // We don't protect writing to owner_ here, as it's the caller's\n    // responsibility to ensure that the current thread holds the\n    // mutex when this is called.\n    owner_ = 0;\n    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&mutex_));\n  }\n\n  // Does nothing if the current thread holds the mutex. Otherwise, crashes\n  // with high probability.\n  void AssertHeld() const {\n    GTEST_CHECK_(owner_ == pthread_self())\n        << \"The current thread is not holding the mutex @\" << this;\n  }\n\n  // A static mutex may be used before main() is entered.  It may even\n  // be used before the dynamic initialization stage.  Therefore we\n  // must be able to initialize a static mutex object at link time.\n  // This means MutexBase has to be a POD and its member variables\n  // have to be public.\n public:\n  pthread_mutex_t mutex_;  // The underlying pthread mutex.\n  pthread_t owner_;  // The thread holding the mutex; 0 means no one holds it.\n};\n\n// Forward-declares a static mutex.\n# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \\\n    extern ::testing::internal::MutexBase mutex\n\n// Defines and statically (i.e. at link time) initializes a static mutex.\n# define GTEST_DEFINE_STATIC_MUTEX_(mutex) \\\n    ::testing::internal::MutexBase mutex = { PTHREAD_MUTEX_INITIALIZER, 0 }\n\n// The Mutex class can only be used for mutexes created at runtime. It\n// shares its API with MutexBase otherwise.\nclass Mutex : public MutexBase {\n public:\n  Mutex() {\n    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL));\n    owner_ = 0;\n  }\n  ~Mutex() {\n    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_destroy(&mutex_));\n  }\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex);\n};\n\n// We cannot name this class MutexLock as the ctor declaration would\n// conflict with a macro named MutexLock, which is defined on some\n// platforms.  Hence the typedef trick below.\nclass GTestMutexLock {\n public:\n  explicit GTestMutexLock(MutexBase* mutex)\n      : mutex_(mutex) { mutex_->Lock(); }\n\n  ~GTestMutexLock() { mutex_->Unlock(); }\n\n private:\n  MutexBase* const mutex_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestMutexLock);\n};\n\ntypedef GTestMutexLock MutexLock;\n\n// Helpers for ThreadLocal.\n\n// pthread_key_create() requires DeleteThreadLocalValue() to have\n// C-linkage.  Therefore it cannot be templatized to access\n// ThreadLocal<T>.  Hence the need for class\n// ThreadLocalValueHolderBase.\nclass ThreadLocalValueHolderBase {\n public:\n  virtual ~ThreadLocalValueHolderBase() {}\n};\n\n// Called by pthread to delete thread-local data stored by\n// pthread_setspecific().\nextern \"C\" inline void DeleteThreadLocalValue(void* value_holder) {\n  delete static_cast<ThreadLocalValueHolderBase*>(value_holder);\n}\n\n// Implements thread-local storage on pthreads-based systems.\n//\n//   // Thread 1\n//   ThreadLocal<int> tl(100);  // 100 is the default value for each thread.\n//\n//   // Thread 2\n//   tl.set(150);  // Changes the value for thread 2 only.\n//   EXPECT_EQ(150, tl.get());\n//\n//   // Thread 1\n//   EXPECT_EQ(100, tl.get());  // In thread 1, tl has the original value.\n//   tl.set(200);\n//   EXPECT_EQ(200, tl.get());\n//\n// The template type argument T must have a public copy constructor.\n// In addition, the default ThreadLocal constructor requires T to have\n// a public default constructor.\n//\n// An object managed for a thread by a ThreadLocal instance is deleted\n// when the thread exits.  Or, if the ThreadLocal instance dies in\n// that thread, when the ThreadLocal dies.  It's the user's\n// responsibility to ensure that all other threads using a ThreadLocal\n// have exited when it dies, or the per-thread objects for those\n// threads will not be deleted.\n//\n// Google Test only uses global ThreadLocal objects.  That means they\n// will die after main() has returned.  Therefore, no per-thread\n// object managed by Google Test will be leaked as long as all threads\n// using Google Test have exited when main() returns.\ntemplate <typename T>\nclass ThreadLocal {\n public:\n  ThreadLocal() : key_(CreateKey()),\n                  default_() {}\n  explicit ThreadLocal(const T& value) : key_(CreateKey()),\n                                         default_(value) {}\n\n  ~ThreadLocal() {\n    // Destroys the managed object for the current thread, if any.\n    DeleteThreadLocalValue(pthread_getspecific(key_));\n\n    // Releases resources associated with the key.  This will *not*\n    // delete managed objects for other threads.\n    GTEST_CHECK_POSIX_SUCCESS_(pthread_key_delete(key_));\n  }\n\n  T* pointer() { return GetOrCreateValue(); }\n  const T* pointer() const { return GetOrCreateValue(); }\n  const T& get() const { return *pointer(); }\n  void set(const T& value) { *pointer() = value; }\n\n private:\n  // Holds a value of type T.\n  class ValueHolder : public ThreadLocalValueHolderBase {\n   public:\n    explicit ValueHolder(const T& value) : value_(value) {}\n\n    T* pointer() { return &value_; }\n\n   private:\n    T value_;\n    GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder);\n  };\n\n  static pthread_key_t CreateKey() {\n    pthread_key_t key;\n    // When a thread exits, DeleteThreadLocalValue() will be called on\n    // the object managed for that thread.\n    GTEST_CHECK_POSIX_SUCCESS_(\n        pthread_key_create(&key, &DeleteThreadLocalValue));\n    return key;\n  }\n\n  T* GetOrCreateValue() const {\n    ThreadLocalValueHolderBase* const holder =\n        static_cast<ThreadLocalValueHolderBase*>(pthread_getspecific(key_));\n    if (holder != NULL) {\n      return CheckedDowncastToActualType<ValueHolder>(holder)->pointer();\n    }\n\n    ValueHolder* const new_holder = new ValueHolder(default_);\n    ThreadLocalValueHolderBase* const holder_base = new_holder;\n    GTEST_CHECK_POSIX_SUCCESS_(pthread_setspecific(key_, holder_base));\n    return new_holder->pointer();\n  }\n\n  // A key pthreads uses for looking up per-thread values.\n  const pthread_key_t key_;\n  const T default_;  // The default value for each thread.\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal);\n};\n\n# define GTEST_IS_THREADSAFE 1\n\n#else  // GTEST_HAS_PTHREAD\n\n// A dummy implementation of synchronization primitives (mutex, lock,\n// and thread-local variable).  Necessary for compiling Google Test where\n// mutex is not supported - using Google Test in multiple threads is not\n// supported on such platforms.\n\nclass Mutex {\n public:\n  Mutex() {}\n  void AssertHeld() const {}\n};\n\n# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \\\n  extern ::testing::internal::Mutex mutex\n\n# define GTEST_DEFINE_STATIC_MUTEX_(mutex) ::testing::internal::Mutex mutex\n\nclass GTestMutexLock {\n public:\n  explicit GTestMutexLock(Mutex*) {}  // NOLINT\n};\n\ntypedef GTestMutexLock MutexLock;\n\ntemplate <typename T>\nclass ThreadLocal {\n public:\n  ThreadLocal() : value_() {}\n  explicit ThreadLocal(const T& value) : value_(value) {}\n  T* pointer() { return &value_; }\n  const T* pointer() const { return &value_; }\n  const T& get() const { return value_; }\n  void set(const T& value) { value_ = value; }\n private:\n  T value_;\n};\n\n// The above synchronization primitives have dummy implementations.\n// Therefore Google Test is not thread-safe.\n# define GTEST_IS_THREADSAFE 0\n\n#endif  // GTEST_HAS_PTHREAD\n\n// Returns the number of threads running in the process, or 0 to indicate that\n// we cannot detect it.\nGTEST_API_ size_t GetThreadCount();\n\n// Passing non-POD classes through ellipsis (...) crashes the ARM\n// compiler and generates a warning in Sun Studio.  The Nokia Symbian\n// and the IBM XL C/C++ compiler try to instantiate a copy constructor\n// for objects passed through ellipsis (...), failing for uncopyable\n// objects.  We define this to ensure that only POD is passed through\n// ellipsis on these systems.\n#if defined(__SYMBIAN32__) || defined(__IBMCPP__) || defined(__SUNPRO_CC)\n// We lose support for NULL detection where the compiler doesn't like\n// passing non-POD classes through ellipsis (...).\n# define GTEST_ELLIPSIS_NEEDS_POD_ 1\n#else\n# define GTEST_CAN_COMPARE_NULL 1\n#endif\n\n// The Nokia Symbian and IBM XL C/C++ compilers cannot decide between\n// const T& and const T* in a function template.  These compilers\n// _can_ decide between class template specializations for T and T*,\n// so a tr1::type_traits-like is_pointer works.\n#if defined(__SYMBIAN32__) || defined(__IBMCPP__)\n# define GTEST_NEEDS_IS_POINTER_ 1\n#endif\n\ntemplate <bool bool_value>\nstruct bool_constant {\n  typedef bool_constant<bool_value> type;\n  static const bool value = bool_value;\n};\ntemplate <bool bool_value> const bool bool_constant<bool_value>::value;\n\ntypedef bool_constant<false> false_type;\ntypedef bool_constant<true> true_type;\n\ntemplate <typename T>\nstruct is_pointer : public false_type {};\n\ntemplate <typename T>\nstruct is_pointer<T*> : public true_type {};\n\ntemplate <typename Iterator>\nstruct IteratorTraits {\n  typedef typename Iterator::value_type value_type;\n};\n\ntemplate <typename T>\nstruct IteratorTraits<T*> {\n  typedef T value_type;\n};\n\ntemplate <typename T>\nstruct IteratorTraits<const T*> {\n  typedef T value_type;\n};\n\n#if GTEST_OS_WINDOWS\n# define GTEST_PATH_SEP_ \"\\\\\"\n# define GTEST_HAS_ALT_PATH_SEP_ 1\n// The biggest signed integer type the compiler supports.\ntypedef __int64 BiggestInt;\n#else\n# define GTEST_PATH_SEP_ \"/\"\n# define GTEST_HAS_ALT_PATH_SEP_ 0\ntypedef long long BiggestInt;  // NOLINT\n#endif  // GTEST_OS_WINDOWS\n\n// Utilities for char.\n\n// isspace(int ch) and friends accept an unsigned char or EOF.  char\n// may be signed, depending on the compiler (or compiler flags).\n// Therefore we need to cast a char to unsigned char before calling\n// isspace(), etc.\n\ninline bool IsAlpha(char ch) {\n  return isalpha(static_cast<unsigned char>(ch)) != 0;\n}\ninline bool IsAlNum(char ch) {\n  return isalnum(static_cast<unsigned char>(ch)) != 0;\n}\ninline bool IsDigit(char ch) {\n  return isdigit(static_cast<unsigned char>(ch)) != 0;\n}\ninline bool IsLower(char ch) {\n  return islower(static_cast<unsigned char>(ch)) != 0;\n}\ninline bool IsSpace(char ch) {\n  return isspace(static_cast<unsigned char>(ch)) != 0;\n}\ninline bool IsUpper(char ch) {\n  return isupper(static_cast<unsigned char>(ch)) != 0;\n}\ninline bool IsXDigit(char ch) {\n  return isxdigit(static_cast<unsigned char>(ch)) != 0;\n}\n\ninline char ToLower(char ch) {\n  return static_cast<char>(tolower(static_cast<unsigned char>(ch)));\n}\ninline char ToUpper(char ch) {\n  return static_cast<char>(toupper(static_cast<unsigned char>(ch)));\n}\n\n// The testing::internal::posix namespace holds wrappers for common\n// POSIX functions.  These wrappers hide the differences between\n// Windows/MSVC and POSIX systems.  Since some compilers define these\n// standard functions as macros, the wrapper cannot have the same name\n// as the wrapped function.\n\nnamespace posix {\n\n// Functions with a different name on Windows.\n\n#if GTEST_OS_WINDOWS\n\ntypedef struct _stat StatStruct;\n\n# ifdef __BORLANDC__\ninline int IsATTY(int fd) { return isatty(fd); }\ninline int StrCaseCmp(const char* s1, const char* s2) {\n  return stricmp(s1, s2);\n}\ninline char* StrDup(const char* src) { return strdup(src); }\n# else  // !__BORLANDC__\n#  if GTEST_OS_WINDOWS_MOBILE\ninline int IsATTY(int /* fd */) { return 0; }\n#  else\ninline int IsATTY(int fd) { return _isatty(fd); }\n#  endif  // GTEST_OS_WINDOWS_MOBILE\ninline int StrCaseCmp(const char* s1, const char* s2) {\n  return _stricmp(s1, s2);\n}\ninline char* StrDup(const char* src) { return _strdup(src); }\n# endif  // __BORLANDC__\n\n# if GTEST_OS_WINDOWS_MOBILE\ninline int FileNo(FILE* file) { return reinterpret_cast<int>(_fileno(file)); }\n// Stat(), RmDir(), and IsDir() are not needed on Windows CE at this\n// time and thus not defined there.\n# else\ninline int FileNo(FILE* file) { return _fileno(file); }\ninline int Stat(const char* path, StatStruct* buf) { return _stat(path, buf); }\ninline int RmDir(const char* dir) { return _rmdir(dir); }\ninline bool IsDir(const StatStruct& st) {\n  return (_S_IFDIR & st.st_mode) != 0;\n}\n# endif  // GTEST_OS_WINDOWS_MOBILE\n\n#else\n\ntypedef struct stat StatStruct;\n\ninline int FileNo(FILE* file) { return fileno(file); }\ninline int IsATTY(int fd) { return isatty(fd); }\ninline int Stat(const char* path, StatStruct* buf) { return stat(path, buf); }\ninline int StrCaseCmp(const char* s1, const char* s2) {\n  return strcasecmp(s1, s2);\n}\ninline char* StrDup(const char* src) { return strdup(src); }\ninline int RmDir(const char* dir) { return rmdir(dir); }\ninline bool IsDir(const StatStruct& st) { return S_ISDIR(st.st_mode); }\n\n#endif  // GTEST_OS_WINDOWS\n\n// Functions deprecated by MSVC 8.0.\n\n#ifdef _MSC_VER\n// Temporarily disable warning 4996 (deprecated function).\n# pragma warning(push)\n# pragma warning(disable:4996)\n#endif\n\ninline const char* StrNCpy(char* dest, const char* src, size_t n) {\n  return strncpy(dest, src, n);\n}\n\n// ChDir(), FReopen(), FDOpen(), Read(), Write(), Close(), and\n// StrError() aren't needed on Windows CE at this time and thus not\n// defined there.\n\n#if !GTEST_OS_WINDOWS_MOBILE\ninline int ChDir(const char* dir) { return chdir(dir); }\n#endif\ninline FILE* FOpen(const char* path, const char* mode) {\n  return fopen(path, mode);\n}\n#if !GTEST_OS_WINDOWS_MOBILE\ninline FILE *FReopen(const char* path, const char* mode, FILE* stream) {\n  return freopen(path, mode, stream);\n}\ninline FILE* FDOpen(int fd, const char* mode) { return fdopen(fd, mode); }\n#endif\ninline int FClose(FILE* fp) { return fclose(fp); }\n#if !GTEST_OS_WINDOWS_MOBILE\ninline int Read(int fd, void* buf, unsigned int count) {\n  return static_cast<int>(read(fd, buf, count));\n}\ninline int Write(int fd, const void* buf, unsigned int count) {\n  return static_cast<int>(write(fd, buf, count));\n}\ninline int Close(int fd) { return close(fd); }\ninline const char* StrError(int errnum) { return strerror(errnum); }\n#endif\ninline const char* GetEnv(const char* name) {\n#if GTEST_OS_WINDOWS_MOBILE\n  // We are on Windows CE, which has no environment variables.\n  return NULL;\n#elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9)\n  // Environment variables which we programmatically clear will be set to the\n  // empty string rather than unset (NULL).  Handle that case.\n  const char* const env = getenv(name);\n  return (env != NULL && env[0] != '\\0') ? env : NULL;\n#else\n  return getenv(name);\n#endif\n}\n\n#ifdef _MSC_VER\n# pragma warning(pop)  // Restores the warning state.\n#endif\n\n#if GTEST_OS_WINDOWS_MOBILE\n// Windows CE has no C library. The abort() function is used in\n// several places in Google Test. This implementation provides a reasonable\n// imitation of standard behaviour.\nvoid Abort();\n#else\ninline void Abort() { abort(); }\n#endif  // GTEST_OS_WINDOWS_MOBILE\n\n}  // namespace posix\n\n// The maximum number a BiggestInt can represent.  This definition\n// works no matter BiggestInt is represented in one's complement or\n// two's complement.\n//\n// We cannot rely on numeric_limits in STL, as __int64 and long long\n// are not part of standard C++ and numeric_limits doesn't need to be\n// defined for them.\nconst BiggestInt kMaxBiggestInt =\n    ~(static_cast<BiggestInt>(1) << (8*sizeof(BiggestInt) - 1));\n\n// This template class serves as a compile-time function from size to\n// type.  It maps a size in bytes to a primitive type with that\n// size. e.g.\n//\n//   TypeWithSize<4>::UInt\n//\n// is typedef-ed to be unsigned int (unsigned integer made up of 4\n// bytes).\n//\n// Such functionality should belong to STL, but I cannot find it\n// there.\n//\n// Google Test uses this class in the implementation of floating-point\n// comparison.\n//\n// For now it only handles UInt (unsigned int) as that's all Google Test\n// needs.  Other types can be easily added in the future if need\n// arises.\ntemplate <size_t size>\nclass TypeWithSize {\n public:\n  // This prevents the user from using TypeWithSize<N> with incorrect\n  // values of N.\n  typedef void UInt;\n};\n\n// The specialization for size 4.\ntemplate <>\nclass TypeWithSize<4> {\n public:\n  // unsigned int has size 4 in both gcc and MSVC.\n  //\n  // As base/basictypes.h doesn't compile on Windows, we cannot use\n  // uint32, uint64, and etc here.\n  typedef int Int;\n  typedef unsigned int UInt;\n};\n\n// The specialization for size 8.\ntemplate <>\nclass TypeWithSize<8> {\n public:\n\n#if GTEST_OS_WINDOWS\n  typedef __int64 Int;\n  typedef unsigned __int64 UInt;\n#else\n  typedef long long Int;  // NOLINT\n  typedef unsigned long long UInt;  // NOLINT\n#endif  // GTEST_OS_WINDOWS\n};\n\n// Integer types of known sizes.\ntypedef TypeWithSize<4>::Int Int32;\ntypedef TypeWithSize<4>::UInt UInt32;\ntypedef TypeWithSize<8>::Int Int64;\ntypedef TypeWithSize<8>::UInt UInt64;\ntypedef TypeWithSize<8>::Int TimeInMillis;  // Represents time in milliseconds.\n\n// Utilities for command line flags and environment variables.\n\n// Macro for referencing flags.\n#define GTEST_FLAG(name) FLAGS_gtest_##name\n\n// Macros for declaring flags.\n#define GTEST_DECLARE_bool_(name) GTEST_API_ extern bool GTEST_FLAG(name)\n#define GTEST_DECLARE_int32_(name) \\\n    GTEST_API_ extern ::testing::internal::Int32 GTEST_FLAG(name)\n#define GTEST_DECLARE_string_(name) \\\n    GTEST_API_ extern ::testing::internal::String GTEST_FLAG(name)\n\n// Macros for defining flags.\n#define GTEST_DEFINE_bool_(name, default_val, doc) \\\n    GTEST_API_ bool GTEST_FLAG(name) = (default_val)\n#define GTEST_DEFINE_int32_(name, default_val, doc) \\\n    GTEST_API_ ::testing::internal::Int32 GTEST_FLAG(name) = (default_val)\n#define GTEST_DEFINE_string_(name, default_val, doc) \\\n    GTEST_API_ ::testing::internal::String GTEST_FLAG(name) = (default_val)\n\n// Parses 'str' for a 32-bit signed integer.  If successful, writes the result\n// to *value and returns true; otherwise leaves *value unchanged and returns\n// false.\n// TODO(chandlerc): Find a better way to refactor flag and environment parsing\n// out of both gtest-port.cc and gtest.cc to avoid exporting this utility\n// function.\nbool ParseInt32(const Message& src_text, const char* str, Int32* value);\n\n// Parses a bool/Int32/string from the environment variable\n// corresponding to the given Google Test flag.\nbool BoolFromGTestEnv(const char* flag, bool default_val);\nGTEST_API_ Int32 Int32FromGTestEnv(const char* flag, Int32 default_val);\nconst char* StringFromGTestEnv(const char* flag, const char* default_val);\n\n}  // namespace internal\n}  // namespace testing\n\n#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_\n\n#if GTEST_OS_LINUX\n# include <stdlib.h>\n# include <sys/types.h>\n# include <sys/wait.h>\n# include <unistd.h>\n#endif  // GTEST_OS_LINUX\n\n#include <ctype.h>\n#include <string.h>\n#include <iomanip>\n#include <limits>\n#include <set>\n\n// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee)\n//\n// The Google C++ Testing Framework (Google Test)\n//\n// This header file declares the String class and functions used internally by\n// Google Test.  They are subject to change without notice. They should not used\n// by code external to Google Test.\n//\n// This header file is #included by <gtest/internal/gtest-internal.h>.\n// It should not be #included by other files.\n\n#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_\n#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_\n\n#ifdef __BORLANDC__\n// string.h is not guaranteed to provide strcpy on C++ Builder.\n# include <mem.h>\n#endif\n\n#include <string.h>\n\n#include <string>\n\nnamespace testing {\nnamespace internal {\n\n// String - a UTF-8 string class.\n//\n// For historic reasons, we don't use std::string.\n//\n// TODO(wan@google.com): replace this class with std::string or\n// implement it in terms of the latter.\n//\n// Note that String can represent both NULL and the empty string,\n// while std::string cannot represent NULL.\n//\n// NULL and the empty string are considered different.  NULL is less\n// than anything (including the empty string) except itself.\n//\n// This class only provides minimum functionality necessary for\n// implementing Google Test.  We do not intend to implement a full-fledged\n// string class here.\n//\n// Since the purpose of this class is to provide a substitute for\n// std::string on platforms where it cannot be used, we define a copy\n// constructor and assignment operators such that we don't need\n// conditional compilation in a lot of places.\n//\n// In order to make the representation efficient, the d'tor of String\n// is not virtual.  Therefore DO NOT INHERIT FROM String.\nclass GTEST_API_ String {\n public:\n  // Static utility methods\n\n  // Returns the input enclosed in double quotes if it's not NULL;\n  // otherwise returns \"(null)\".  For example, \"\\\"Hello\\\"\" is returned\n  // for input \"Hello\".\n  //\n  // This is useful for printing a C string in the syntax of a literal.\n  //\n  // Known issue: escape sequences are not handled yet.\n  static String ShowCStringQuoted(const char* c_str);\n\n  // Clones a 0-terminated C string, allocating memory using new.  The\n  // caller is responsible for deleting the return value using\n  // delete[].  Returns the cloned string, or NULL if the input is\n  // NULL.\n  //\n  // This is different from strdup() in string.h, which allocates\n  // memory using malloc().\n  static const char* CloneCString(const char* c_str);\n\n#if GTEST_OS_WINDOWS_MOBILE\n  // Windows CE does not have the 'ANSI' versions of Win32 APIs. To be\n  // able to pass strings to Win32 APIs on CE we need to convert them\n  // to 'Unicode', UTF-16.\n\n  // Creates a UTF-16 wide string from the given ANSI string, allocating\n  // memory using new. The caller is responsible for deleting the return\n  // value using delete[]. Returns the wide string, or NULL if the\n  // input is NULL.\n  //\n  // The wide string is created using the ANSI codepage (CP_ACP) to\n  // match the behaviour of the ANSI versions of Win32 calls and the\n  // C runtime.\n  static LPCWSTR AnsiToUtf16(const char* c_str);\n\n  // Creates an ANSI string from the given wide string, allocating\n  // memory using new. The caller is responsible for deleting the return\n  // value using delete[]. Returns the ANSI string, or NULL if the\n  // input is NULL.\n  //\n  // The returned string is created using the ANSI codepage (CP_ACP) to\n  // match the behaviour of the ANSI versions of Win32 calls and the\n  // C runtime.\n  static const char* Utf16ToAnsi(LPCWSTR utf16_str);\n#endif\n\n  // Compares two C strings.  Returns true iff they have the same content.\n  //\n  // Unlike strcmp(), this function can handle NULL argument(s).  A\n  // NULL C string is considered different to any non-NULL C string,\n  // including the empty string.\n  static bool CStringEquals(const char* lhs, const char* rhs);\n\n  // Converts a wide C string to a String using the UTF-8 encoding.\n  // NULL will be converted to \"(null)\".  If an error occurred during\n  // the conversion, \"(failed to convert from wide string)\" is\n  // returned.\n  static String ShowWideCString(const wchar_t* wide_c_str);\n\n  // Similar to ShowWideCString(), except that this function encloses\n  // the converted string in double quotes.\n  static String ShowWideCStringQuoted(const wchar_t* wide_c_str);\n\n  // Compares two wide C strings.  Returns true iff they have the same\n  // content.\n  //\n  // Unlike wcscmp(), this function can handle NULL argument(s).  A\n  // NULL C string is considered different to any non-NULL C string,\n  // including the empty string.\n  static bool WideCStringEquals(const wchar_t* lhs, const wchar_t* rhs);\n\n  // Compares two C strings, ignoring case.  Returns true iff they\n  // have the same content.\n  //\n  // Unlike strcasecmp(), this function can handle NULL argument(s).\n  // A NULL C string is considered different to any non-NULL C string,\n  // including the empty string.\n  static bool CaseInsensitiveCStringEquals(const char* lhs,\n                                           const char* rhs);\n\n  // Compares two wide C strings, ignoring case.  Returns true iff they\n  // have the same content.\n  //\n  // Unlike wcscasecmp(), this function can handle NULL argument(s).\n  // A NULL C string is considered different to any non-NULL wide C string,\n  // including the empty string.\n  // NB: The implementations on different platforms slightly differ.\n  // On windows, this method uses _wcsicmp which compares according to LC_CTYPE\n  // environment variable. On GNU platform this method uses wcscasecmp\n  // which compares according to LC_CTYPE category of the current locale.\n  // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the\n  // current locale.\n  static bool CaseInsensitiveWideCStringEquals(const wchar_t* lhs,\n                                               const wchar_t* rhs);\n\n  // Formats a list of arguments to a String, using the same format\n  // spec string as for printf.\n  //\n  // We do not use the StringPrintf class as it is not universally\n  // available.\n  //\n  // The result is limited to 4096 characters (including the tailing\n  // 0).  If 4096 characters are not enough to format the input,\n  // \"<buffer exceeded>\" is returned.\n  static String Format(const char* format, ...);\n\n  // C'tors\n\n  // The default c'tor constructs a NULL string.\n  String() : c_str_(NULL), length_(0) {}\n\n  // Constructs a String by cloning a 0-terminated C string.\n  String(const char* a_c_str) {  // NOLINT\n    if (a_c_str == NULL) {\n      c_str_ = NULL;\n      length_ = 0;\n    } else {\n      ConstructNonNull(a_c_str, strlen(a_c_str));\n    }\n  }\n\n  // Constructs a String by copying a given number of chars from a\n  // buffer.  E.g. String(\"hello\", 3) creates the string \"hel\",\n  // String(\"a\\0bcd\", 4) creates \"a\\0bc\", String(NULL, 0) creates \"\",\n  // and String(NULL, 1) results in access violation.\n  String(const char* buffer, size_t a_length) {\n    ConstructNonNull(buffer, a_length);\n  }\n\n  // The copy c'tor creates a new copy of the string.  The two\n  // String objects do not share content.\n  String(const String& str) : c_str_(NULL), length_(0) { *this = str; }\n\n  // D'tor.  String is intended to be a final class, so the d'tor\n  // doesn't need to be virtual.\n  ~String() { delete[] c_str_; }\n\n  // Allows a String to be implicitly converted to an ::std::string or\n  // ::string, and vice versa.  Converting a String containing a NULL\n  // pointer to ::std::string or ::string is undefined behavior.\n  // Converting a ::std::string or ::string containing an embedded NUL\n  // character to a String will result in the prefix up to the first\n  // NUL character.\n  String(const ::std::string& str) {\n    ConstructNonNull(str.c_str(), str.length());\n  }\n\n  operator ::std::string() const { return ::std::string(c_str(), length()); }\n\n#if GTEST_HAS_GLOBAL_STRING\n  String(const ::string& str) {\n    ConstructNonNull(str.c_str(), str.length());\n  }\n\n  operator ::string() const { return ::string(c_str(), length()); }\n#endif  // GTEST_HAS_GLOBAL_STRING\n\n  // Returns true iff this is an empty string (i.e. \"\").\n  bool empty() const { return (c_str() != NULL) && (length() == 0); }\n\n  // Compares this with another String.\n  // Returns < 0 if this is less than rhs, 0 if this is equal to rhs, or > 0\n  // if this is greater than rhs.\n  int Compare(const String& rhs) const;\n\n  // Returns true iff this String equals the given C string.  A NULL\n  // string and a non-NULL string are considered not equal.\n  bool operator==(const char* a_c_str) const { return Compare(a_c_str) == 0; }\n\n  // Returns true iff this String is less than the given String.  A\n  // NULL string is considered less than \"\".\n  bool operator<(const String& rhs) const { return Compare(rhs) < 0; }\n\n  // Returns true iff this String doesn't equal the given C string.  A NULL\n  // string and a non-NULL string are considered not equal.\n  bool operator!=(const char* a_c_str) const { return !(*this == a_c_str); }\n\n  // Returns true iff this String ends with the given suffix.  *Any*\n  // String is considered to end with a NULL or empty suffix.\n  bool EndsWith(const char* suffix) const;\n\n  // Returns true iff this String ends with the given suffix, not considering\n  // case. Any String is considered to end with a NULL or empty suffix.\n  bool EndsWithCaseInsensitive(const char* suffix) const;\n\n  // Returns the length of the encapsulated string, or 0 if the\n  // string is NULL.\n  size_t length() const { return length_; }\n\n  // Gets the 0-terminated C string this String object represents.\n  // The String object still owns the string.  Therefore the caller\n  // should NOT delete the return value.\n  const char* c_str() const { return c_str_; }\n\n  // Assigns a C string to this object.  Self-assignment works.\n  const String& operator=(const char* a_c_str) {\n    return *this = String(a_c_str);\n  }\n\n  // Assigns a String object to this object.  Self-assignment works.\n  const String& operator=(const String& rhs) {\n    if (this != &rhs) {\n      delete[] c_str_;\n      if (rhs.c_str() == NULL) {\n        c_str_ = NULL;\n        length_ = 0;\n      } else {\n        ConstructNonNull(rhs.c_str(), rhs.length());\n      }\n    }\n\n    return *this;\n  }\n\n private:\n  // Constructs a non-NULL String from the given content.  This\n  // function can only be called when c_str_ has not been allocated.\n  // ConstructNonNull(NULL, 0) results in an empty string (\"\").\n  // ConstructNonNull(NULL, non_zero) is undefined behavior.\n  void ConstructNonNull(const char* buffer, size_t a_length) {\n    char* const str = new char[a_length + 1];\n    memcpy(str, buffer, a_length);\n    str[a_length] = '\\0';\n    c_str_ = str;\n    length_ = a_length;\n  }\n\n  const char* c_str_;\n  size_t length_;\n};  // class String\n\n// Streams a String to an ostream.  Each '\\0' character in the String\n// is replaced with \"\\\\0\".\ninline ::std::ostream& operator<<(::std::ostream& os, const String& str) {\n  if (str.c_str() == NULL) {\n    os << \"(null)\";\n  } else {\n    const char* const c_str = str.c_str();\n    for (size_t i = 0; i != str.length(); i++) {\n      if (c_str[i] == '\\0') {\n        os << \"\\\\0\";\n      } else {\n        os << c_str[i];\n      }\n    }\n  }\n  return os;\n}\n\n// Gets the content of the stringstream's buffer as a String.  Each '\\0'\n// character in the buffer is replaced with \"\\\\0\".\nGTEST_API_ String StringStreamToString(::std::stringstream* stream);\n\n// Converts a streamable value to a String.  A NULL pointer is\n// converted to \"(null)\".  When the input value is a ::string,\n// ::std::string, ::wstring, or ::std::wstring object, each NUL\n// character in it is replaced with \"\\\\0\".\n\n// Declared here but defined in gtest.h, so that it has access\n// to the definition of the Message class, required by the ARM\n// compiler.\ntemplate <typename T>\nString StreamableToString(const T& streamable);\n\n}  // namespace internal\n}  // namespace testing\n\n#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_\n// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: keith.ray@gmail.com (Keith Ray)\n//\n// Google Test filepath utilities\n//\n// This header file declares classes and functions used internally by\n// Google Test.  They are subject to change without notice.\n//\n// This file is #included in <gtest/internal/gtest-internal.h>.\n// Do not include this header file separately!\n\n#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_\n#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_\n\n\nnamespace testing {\nnamespace internal {\n\n// FilePath - a class for file and directory pathname manipulation which\n// handles platform-specific conventions (like the pathname separator).\n// Used for helper functions for naming files in a directory for xml output.\n// Except for Set methods, all methods are const or static, which provides an\n// \"immutable value object\" -- useful for peace of mind.\n// A FilePath with a value ending in a path separator (\"like/this/\") represents\n// a directory, otherwise it is assumed to represent a file. In either case,\n// it may or may not represent an actual file or directory in the file system.\n// Names are NOT checked for syntax correctness -- no checking for illegal\n// characters, malformed paths, etc.\n\nclass GTEST_API_ FilePath {\n public:\n  FilePath() : pathname_(\"\") { }\n  FilePath(const FilePath& rhs) : pathname_(rhs.pathname_) { }\n\n  explicit FilePath(const char* pathname) : pathname_(pathname) {\n    Normalize();\n  }\n\n  explicit FilePath(const String& pathname) : pathname_(pathname) {\n    Normalize();\n  }\n\n  FilePath& operator=(const FilePath& rhs) {\n    Set(rhs);\n    return *this;\n  }\n\n  void Set(const FilePath& rhs) {\n    pathname_ = rhs.pathname_;\n  }\n\n  String ToString() const { return pathname_; }\n  const char* c_str() const { return pathname_.c_str(); }\n\n  // Returns the current working directory, or \"\" if unsuccessful.\n  static FilePath GetCurrentDir();\n\n  // Given directory = \"dir\", base_name = \"test\", number = 0,\n  // extension = \"xml\", returns \"dir/test.xml\". If number is greater\n  // than zero (e.g., 12), returns \"dir/test_12.xml\".\n  // On Windows platform, uses \\ as the separator rather than /.\n  static FilePath MakeFileName(const FilePath& directory,\n                               const FilePath& base_name,\n                               int number,\n                               const char* extension);\n\n  // Given directory = \"dir\", relative_path = \"test.xml\",\n  // returns \"dir/test.xml\".\n  // On Windows, uses \\ as the separator rather than /.\n  static FilePath ConcatPaths(const FilePath& directory,\n                              const FilePath& relative_path);\n\n  // Returns a pathname for a file that does not currently exist. The pathname\n  // will be directory/base_name.extension or\n  // directory/base_name_<number>.extension if directory/base_name.extension\n  // already exists. The number will be incremented until a pathname is found\n  // that does not already exist.\n  // Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.\n  // There could be a race condition if two or more processes are calling this\n  // function at the same time -- they could both pick the same filename.\n  static FilePath GenerateUniqueFileName(const FilePath& directory,\n                                         const FilePath& base_name,\n                                         const char* extension);\n\n  // Returns true iff the path is NULL or \"\".\n  bool IsEmpty() const { return c_str() == NULL || *c_str() == '\\0'; }\n\n  // If input name has a trailing separator character, removes it and returns\n  // the name, otherwise return the name string unmodified.\n  // On Windows platform, uses \\ as the separator, other platforms use /.\n  FilePath RemoveTrailingPathSeparator() const;\n\n  // Returns a copy of the FilePath with the directory part removed.\n  // Example: FilePath(\"path/to/file\").RemoveDirectoryName() returns\n  // FilePath(\"file\"). If there is no directory part (\"just_a_file\"), it returns\n  // the FilePath unmodified. If there is no file part (\"just_a_dir/\") it\n  // returns an empty FilePath (\"\").\n  // On Windows platform, '\\' is the path separator, otherwise it is '/'.\n  FilePath RemoveDirectoryName() const;\n\n  // RemoveFileName returns the directory path with the filename removed.\n  // Example: FilePath(\"path/to/file\").RemoveFileName() returns \"path/to/\".\n  // If the FilePath is \"a_file\" or \"/a_file\", RemoveFileName returns\n  // FilePath(\"./\") or, on Windows, FilePath(\".\\\\\"). If the filepath does\n  // not have a file, like \"just/a/dir/\", it returns the FilePath unmodified.\n  // On Windows platform, '\\' is the path separator, otherwise it is '/'.\n  FilePath RemoveFileName() const;\n\n  // Returns a copy of the FilePath with the case-insensitive extension removed.\n  // Example: FilePath(\"dir/file.exe\").RemoveExtension(\"EXE\") returns\n  // FilePath(\"dir/file\"). If a case-insensitive extension is not\n  // found, returns a copy of the original FilePath.\n  FilePath RemoveExtension(const char* extension) const;\n\n  // Creates directories so that path exists. Returns true if successful or if\n  // the directories already exist; returns false if unable to create\n  // directories for any reason. Will also return false if the FilePath does\n  // not represent a directory (that is, it doesn't end with a path separator).\n  bool CreateDirectoriesRecursively() const;\n\n  // Create the directory so that path exists. Returns true if successful or\n  // if the directory already exists; returns false if unable to create the\n  // directory for any reason, including if the parent directory does not\n  // exist. Not named \"CreateDirectory\" because that's a macro on Windows.\n  bool CreateFolder() const;\n\n  // Returns true if FilePath describes something in the file-system,\n  // either a file, directory, or whatever, and that something exists.\n  bool FileOrDirectoryExists() const;\n\n  // Returns true if pathname describes a directory in the file-system\n  // that exists.\n  bool DirectoryExists() const;\n\n  // Returns true if FilePath ends with a path separator, which indicates that\n  // it is intended to represent a directory. Returns false otherwise.\n  // This does NOT check that a directory (or file) actually exists.\n  bool IsDirectory() const;\n\n  // Returns true if pathname describes a root directory. (Windows has one\n  // root directory per disk drive.)\n  bool IsRootDirectory() const;\n\n  // Returns true if pathname describes an absolute path.\n  bool IsAbsolutePath() const;\n\n private:\n  // Replaces multiple consecutive separators with a single separator.\n  // For example, \"bar///foo\" becomes \"bar/foo\". Does not eliminate other\n  // redundancies that might be in a pathname involving \".\" or \"..\".\n  //\n  // A pathname with multiple consecutive separators may occur either through\n  // user error or as a result of some scripts or APIs that generate a pathname\n  // with a trailing separator. On other platforms the same API or script\n  // may NOT generate a pathname with a trailing \"/\". Then elsewhere that\n  // pathname may have another \"/\" and pathname components added to it,\n  // without checking for the separator already being there.\n  // The script language and operating system may allow paths like \"foo//bar\"\n  // but some of the functions in FilePath will not handle that correctly. In\n  // particular, RemoveTrailingPathSeparator() only removes one separator, and\n  // it is called in CreateDirectoriesRecursively() assuming that it will change\n  // a pathname from directory syntax (trailing separator) to filename syntax.\n  //\n  // On Windows this method also replaces the alternate path separator '/' with\n  // the primary path separator '\\\\', so that for example \"bar\\\\/\\\\foo\" becomes\n  // \"bar\\\\foo\".\n\n  void Normalize();\n\n  // Returns a pointer to the last occurence of a valid path separator in\n  // the FilePath. On Windows, for example, both '/' and '\\' are valid path\n  // separators. Returns NULL if no path separator was found.\n  const char* FindLastPathSeparator() const;\n\n  String pathname_;\n};  // class FilePath\n\n}  // namespace internal\n}  // namespace testing\n\n#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_\n// This file was GENERATED by command:\n//     pump.py gtest-type-util.h.pump\n// DO NOT EDIT BY HAND!!!\n\n// Copyright 2008 Google Inc.\n// All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n\n// Type utilities needed for implementing typed and type-parameterized\n// tests.  This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!\n//\n// Currently we support at most 50 types in a list, and at most 50\n// type-parameterized tests in one type-parameterized test case.\n// Please contact googletestframework@googlegroups.com if you need\n// more.\n\n#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_\n#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_\n\n\n// #ifdef __GNUC__ is too general here.  It is possible to use gcc without using\n// libstdc++ (which is where cxxabi.h comes from).\n# ifdef __GLIBCXX__\n#  include <cxxabi.h>\n# elif defined(__HP_aCC)\n#  include <acxx_demangle.h>\n# endif  // __GLIBCXX__\n\nnamespace testing {\nnamespace internal {\n\n// GetTypeName<T>() returns a human-readable name of type T.\n// NB: This function is also used in Google Mock, so don't move it inside of\n// the typed-test-only section below.\ntemplate <typename T>\nString GetTypeName() {\n# if GTEST_HAS_RTTI\n\n  const char* const name = typeid(T).name();\n#  if defined(__GLIBCXX__) || defined(__HP_aCC)\n  int status = 0;\n  // gcc's implementation of typeid(T).name() mangles the type name,\n  // so we have to demangle it.\n#   ifdef __GLIBCXX__\n  using abi::__cxa_demangle;\n#   endif // __GLIBCXX__\n  char* const readable_name = __cxa_demangle(name, 0, 0, &status);\n  const String name_str(status == 0 ? readable_name : name);\n  free(readable_name);\n  return name_str;\n#  else\n  return name;\n#  endif  // __GLIBCXX__ || __HP_aCC\n\n# else\n\n  return \"<type>\";\n\n# endif  // GTEST_HAS_RTTI\n}\n\n#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P\n\n// AssertyTypeEq<T1, T2>::type is defined iff T1 and T2 are the same\n// type.  This can be used as a compile-time assertion to ensure that\n// two types are equal.\n\ntemplate <typename T1, typename T2>\nstruct AssertTypeEq;\n\ntemplate <typename T>\nstruct AssertTypeEq<T, T> {\n  typedef bool type;\n};\n\n// A unique type used as the default value for the arguments of class\n// template Types.  This allows us to simulate variadic templates\n// (e.g. Types<int>, Type<int, double>, and etc), which C++ doesn't\n// support directly.\nstruct None {};\n\n// The following family of struct and struct templates are used to\n// represent type lists.  In particular, TypesN<T1, T2, ..., TN>\n// represents a type list with N types (T1, T2, ..., and TN) in it.\n// Except for Types0, every struct in the family has two member types:\n// Head for the first type in the list, and Tail for the rest of the\n// list.\n\n// The empty type list.\nstruct Types0 {};\n\n// Type lists of length 1, 2, 3, and so on.\n\ntemplate <typename T1>\nstruct Types1 {\n  typedef T1 Head;\n  typedef Types0 Tail;\n};\ntemplate <typename T1, typename T2>\nstruct Types2 {\n  typedef T1 Head;\n  typedef Types1<T2> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3>\nstruct Types3 {\n  typedef T1 Head;\n  typedef Types2<T2, T3> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4>\nstruct Types4 {\n  typedef T1 Head;\n  typedef Types3<T2, T3, T4> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5>\nstruct Types5 {\n  typedef T1 Head;\n  typedef Types4<T2, T3, T4, T5> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6>\nstruct Types6 {\n  typedef T1 Head;\n  typedef Types5<T2, T3, T4, T5, T6> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7>\nstruct Types7 {\n  typedef T1 Head;\n  typedef Types6<T2, T3, T4, T5, T6, T7> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8>\nstruct Types8 {\n  typedef T1 Head;\n  typedef Types7<T2, T3, T4, T5, T6, T7, T8> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9>\nstruct Types9 {\n  typedef T1 Head;\n  typedef Types8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10>\nstruct Types10 {\n  typedef T1 Head;\n  typedef Types9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11>\nstruct Types11 {\n  typedef T1 Head;\n  typedef Types10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12>\nstruct Types12 {\n  typedef T1 Head;\n  typedef Types11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13>\nstruct Types13 {\n  typedef T1 Head;\n  typedef Types12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14>\nstruct Types14 {\n  typedef T1 Head;\n  typedef Types13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15>\nstruct Types15 {\n  typedef T1 Head;\n  typedef Types14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16>\nstruct Types16 {\n  typedef T1 Head;\n  typedef Types15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17>\nstruct Types17 {\n  typedef T1 Head;\n  typedef Types16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18>\nstruct Types18 {\n  typedef T1 Head;\n  typedef Types17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19>\nstruct Types19 {\n  typedef T1 Head;\n  typedef Types18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20>\nstruct Types20 {\n  typedef T1 Head;\n  typedef Types19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21>\nstruct Types21 {\n  typedef T1 Head;\n  typedef Types20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22>\nstruct Types22 {\n  typedef T1 Head;\n  typedef Types21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23>\nstruct Types23 {\n  typedef T1 Head;\n  typedef Types22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24>\nstruct Types24 {\n  typedef T1 Head;\n  typedef Types23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25>\nstruct Types25 {\n  typedef T1 Head;\n  typedef Types24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26>\nstruct Types26 {\n  typedef T1 Head;\n  typedef Types25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27>\nstruct Types27 {\n  typedef T1 Head;\n  typedef Types26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28>\nstruct Types28 {\n  typedef T1 Head;\n  typedef Types27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29>\nstruct Types29 {\n  typedef T1 Head;\n  typedef Types28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30>\nstruct Types30 {\n  typedef T1 Head;\n  typedef Types29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31>\nstruct Types31 {\n  typedef T1 Head;\n  typedef Types30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32>\nstruct Types32 {\n  typedef T1 Head;\n  typedef Types31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33>\nstruct Types33 {\n  typedef T1 Head;\n  typedef Types32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34>\nstruct Types34 {\n  typedef T1 Head;\n  typedef Types33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35>\nstruct Types35 {\n  typedef T1 Head;\n  typedef Types34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36>\nstruct Types36 {\n  typedef T1 Head;\n  typedef Types35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35, T36> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37>\nstruct Types37 {\n  typedef T1 Head;\n  typedef Types36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35, T36, T37> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38>\nstruct Types38 {\n  typedef T1 Head;\n  typedef Types37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39>\nstruct Types39 {\n  typedef T1 Head;\n  typedef Types38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40>\nstruct Types40 {\n  typedef T1 Head;\n  typedef Types39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41>\nstruct Types41 {\n  typedef T1 Head;\n  typedef Types40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42>\nstruct Types42 {\n  typedef T1 Head;\n  typedef Types41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43>\nstruct Types43 {\n  typedef T1 Head;\n  typedef Types42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,\n      T43> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44>\nstruct Types44 {\n  typedef T1 Head;\n  typedef Types43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n      T44> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45>\nstruct Types45 {\n  typedef T1 Head;\n  typedef Types44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n      T44, T45> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46>\nstruct Types46 {\n  typedef T1 Head;\n  typedef Types45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n      T44, T45, T46> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47>\nstruct Types47 {\n  typedef T1 Head;\n  typedef Types46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n      T44, T45, T46, T47> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47, typename T48>\nstruct Types48 {\n  typedef T1 Head;\n  typedef Types47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n      T44, T45, T46, T47, T48> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47, typename T48, typename T49>\nstruct Types49 {\n  typedef T1 Head;\n  typedef Types48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n      T44, T45, T46, T47, T48, T49> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47, typename T48, typename T49, typename T50>\nstruct Types50 {\n  typedef T1 Head;\n  typedef Types49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n      T44, T45, T46, T47, T48, T49, T50> Tail;\n};\n\n\n}  // namespace internal\n\n// We don't want to require the users to write TypesN<...> directly,\n// as that would require them to count the length.  Types<...> is much\n// easier to write, but generates horrible messages when there is a\n// compiler error, as gcc insists on printing out each template\n// argument, even if it has the default value (this means Types<int>\n// will appear as Types<int, None, None, ..., None> in the compiler\n// errors).\n//\n// Our solution is to combine the best part of the two approaches: a\n// user would write Types<T1, ..., TN>, and Google Test will translate\n// that to TypesN<T1, ..., TN> internally to make error messages\n// readable.  The translation is done by the 'type' member of the\n// Types template.\ntemplate <typename T1 = internal::None, typename T2 = internal::None,\n    typename T3 = internal::None, typename T4 = internal::None,\n    typename T5 = internal::None, typename T6 = internal::None,\n    typename T7 = internal::None, typename T8 = internal::None,\n    typename T9 = internal::None, typename T10 = internal::None,\n    typename T11 = internal::None, typename T12 = internal::None,\n    typename T13 = internal::None, typename T14 = internal::None,\n    typename T15 = internal::None, typename T16 = internal::None,\n    typename T17 = internal::None, typename T18 = internal::None,\n    typename T19 = internal::None, typename T20 = internal::None,\n    typename T21 = internal::None, typename T22 = internal::None,\n    typename T23 = internal::None, typename T24 = internal::None,\n    typename T25 = internal::None, typename T26 = internal::None,\n    typename T27 = internal::None, typename T28 = internal::None,\n    typename T29 = internal::None, typename T30 = internal::None,\n    typename T31 = internal::None, typename T32 = internal::None,\n    typename T33 = internal::None, typename T34 = internal::None,\n    typename T35 = internal::None, typename T36 = internal::None,\n    typename T37 = internal::None, typename T38 = internal::None,\n    typename T39 = internal::None, typename T40 = internal::None,\n    typename T41 = internal::None, typename T42 = internal::None,\n    typename T43 = internal::None, typename T44 = internal::None,\n    typename T45 = internal::None, typename T46 = internal::None,\n    typename T47 = internal::None, typename T48 = internal::None,\n    typename T49 = internal::None, typename T50 = internal::None>\nstruct Types {\n  typedef internal::Types50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,\n      T41, T42, T43, T44, T45, T46, T47, T48, T49, T50> type;\n};\n\ntemplate <>\nstruct Types<internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None> {\n  typedef internal::Types0 type;\n};\ntemplate <typename T1>\nstruct Types<T1, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None> {\n  typedef internal::Types1<T1> type;\n};\ntemplate <typename T1, typename T2>\nstruct Types<T1, T2, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None> {\n  typedef internal::Types2<T1, T2> type;\n};\ntemplate <typename T1, typename T2, typename T3>\nstruct Types<T1, T2, T3, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None> {\n  typedef internal::Types3<T1, T2, T3> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4>\nstruct Types<T1, T2, T3, T4, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None> {\n  typedef internal::Types4<T1, T2, T3, T4> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5>\nstruct Types<T1, T2, T3, T4, T5, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None> {\n  typedef internal::Types5<T1, T2, T3, T4, T5> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6>\nstruct Types<T1, T2, T3, T4, T5, T6, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None> {\n  typedef internal::Types6<T1, T2, T3, T4, T5, T6> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None> {\n  typedef internal::Types7<T1, T2, T3, T4, T5, T6, T7> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None> {\n  typedef internal::Types8<T1, T2, T3, T4, T5, T6, T7, T8> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None> {\n  typedef internal::Types9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None> {\n  typedef internal::Types10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None> {\n  typedef internal::Types11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None> {\n  typedef internal::Types12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None> {\n  typedef internal::Types13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None> {\n  typedef internal::Types14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None> {\n  typedef internal::Types15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None> {\n  typedef internal::Types16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None> {\n  typedef internal::Types17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None> {\n  typedef internal::Types18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None> {\n  typedef internal::Types19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None> {\n  typedef internal::Types20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None> {\n  typedef internal::Types21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None> {\n  typedef internal::Types22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None> {\n  typedef internal::Types23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None> {\n  typedef internal::Types24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None> {\n  typedef internal::Types25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None> {\n  typedef internal::Types26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None> {\n  typedef internal::Types27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None> {\n  typedef internal::Types28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None> {\n  typedef internal::Types29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None> {\n  typedef internal::Types30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None> {\n  typedef internal::Types31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None> {\n  typedef internal::Types32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None> {\n  typedef internal::Types33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None> {\n  typedef internal::Types34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, T35, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None> {\n  typedef internal::Types35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, T35, T36, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None> {\n  typedef internal::Types36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, T35, T36, T37, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None> {\n  typedef internal::Types37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, T35, T36, T37, T38, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None> {\n  typedef internal::Types38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, T35, T36, T37, T38, T39, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None> {\n  typedef internal::Types39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None> {\n  typedef internal::Types40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,\n      T40> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None> {\n  typedef internal::Types41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,\n      T41> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None> {\n  typedef internal::Types42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,\n      T41, T42> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None> {\n  typedef internal::Types43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,\n      T41, T42, T43> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None> {\n  typedef internal::Types44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,\n      T41, T42, T43, T44> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None> {\n  typedef internal::Types45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,\n      T41, T42, T43, T44, T45> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,\n    T46, internal::None, internal::None, internal::None, internal::None> {\n  typedef internal::Types46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,\n      T41, T42, T43, T44, T45, T46> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,\n    T46, T47, internal::None, internal::None, internal::None> {\n  typedef internal::Types47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,\n      T41, T42, T43, T44, T45, T46, T47> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47, typename T48>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,\n    T46, T47, T48, internal::None, internal::None> {\n  typedef internal::Types48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,\n      T41, T42, T43, T44, T45, T46, T47, T48> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47, typename T48, typename T49>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,\n    T46, T47, T48, T49, internal::None> {\n  typedef internal::Types49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,\n      T41, T42, T43, T44, T45, T46, T47, T48, T49> type;\n};\n\nnamespace internal {\n\n# define GTEST_TEMPLATE_ template <typename T> class\n\n// The template \"selector\" struct TemplateSel<Tmpl> is used to\n// represent Tmpl, which must be a class template with one type\n// parameter, as a type.  TemplateSel<Tmpl>::Bind<T>::type is defined\n// as the type Tmpl<T>.  This allows us to actually instantiate the\n// template \"selected\" by TemplateSel<Tmpl>.\n//\n// This trick is necessary for simulating typedef for class templates,\n// which C++ doesn't support directly.\ntemplate <GTEST_TEMPLATE_ Tmpl>\nstruct TemplateSel {\n  template <typename T>\n  struct Bind {\n    typedef Tmpl<T> type;\n  };\n};\n\n# define GTEST_BIND_(TmplSel, T) \\\n  TmplSel::template Bind<T>::type\n\n// A unique struct template used as the default value for the\n// arguments of class template Templates.  This allows us to simulate\n// variadic templates (e.g. Templates<int>, Templates<int, double>,\n// and etc), which C++ doesn't support directly.\ntemplate <typename T>\nstruct NoneT {};\n\n// The following family of struct and struct templates are used to\n// represent template lists.  In particular, TemplatesN<T1, T2, ...,\n// TN> represents a list of N templates (T1, T2, ..., and TN).  Except\n// for Templates0, every struct in the family has two member types:\n// Head for the selector of the first template in the list, and Tail\n// for the rest of the list.\n\n// The empty template list.\nstruct Templates0 {};\n\n// Template lists of length 1, 2, 3, and so on.\n\ntemplate <GTEST_TEMPLATE_ T1>\nstruct Templates1 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates0 Tail;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2>\nstruct Templates2 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates1<T2> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3>\nstruct Templates3 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates2<T2, T3> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4>\nstruct Templates4 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates3<T2, T3, T4> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5>\nstruct Templates5 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates4<T2, T3, T4, T5> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6>\nstruct Templates6 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates5<T2, T3, T4, T5, T6> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7>\nstruct Templates7 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates6<T2, T3, T4, T5, T6, T7> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8>\nstruct Templates8 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates7<T2, T3, T4, T5, T6, T7, T8> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9>\nstruct Templates9 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10>\nstruct Templates10 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11>\nstruct Templates11 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12>\nstruct Templates12 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13>\nstruct Templates13 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14>\nstruct Templates14 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15>\nstruct Templates15 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16>\nstruct Templates16 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17>\nstruct Templates17 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18>\nstruct Templates18 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19>\nstruct Templates19 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20>\nstruct Templates20 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21>\nstruct Templates21 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22>\nstruct Templates22 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23>\nstruct Templates23 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24>\nstruct Templates24 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25>\nstruct Templates25 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26>\nstruct Templates26 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27>\nstruct Templates27 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28>\nstruct Templates28 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29>\nstruct Templates29 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30>\nstruct Templates30 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31>\nstruct Templates31 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32>\nstruct Templates32 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33>\nstruct Templates33 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34>\nstruct Templates34 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35>\nstruct Templates35 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36>\nstruct Templates36 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35, T36> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37>\nstruct Templates37 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35, T36, T37> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38>\nstruct Templates38 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39>\nstruct Templates39 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40>\nstruct Templates40 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41>\nstruct Templates41 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42>\nstruct Templates42 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,\n      T42> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,\n    GTEST_TEMPLATE_ T43>\nstruct Templates43 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,\n      T43> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,\n    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44>\nstruct Templates44 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,\n      T43, T44> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,\n    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45>\nstruct Templates45 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,\n      T43, T44, T45> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,\n    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,\n    GTEST_TEMPLATE_ T46>\nstruct Templates46 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,\n      T43, T44, T45, T46> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,\n    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,\n    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47>\nstruct Templates47 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,\n      T43, T44, T45, T46, T47> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,\n    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,\n    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48>\nstruct Templates48 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,\n      T43, T44, T45, T46, T47, T48> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,\n    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,\n    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,\n    GTEST_TEMPLATE_ T49>\nstruct Templates49 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,\n      T43, T44, T45, T46, T47, T48, T49> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,\n    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,\n    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,\n    GTEST_TEMPLATE_ T49, GTEST_TEMPLATE_ T50>\nstruct Templates50 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,\n      T43, T44, T45, T46, T47, T48, T49, T50> Tail;\n};\n\n\n// We don't want to require the users to write TemplatesN<...> directly,\n// as that would require them to count the length.  Templates<...> is much\n// easier to write, but generates horrible messages when there is a\n// compiler error, as gcc insists on printing out each template\n// argument, even if it has the default value (this means Templates<list>\n// will appear as Templates<list, NoneT, NoneT, ..., NoneT> in the compiler\n// errors).\n//\n// Our solution is to combine the best part of the two approaches: a\n// user would write Templates<T1, ..., TN>, and Google Test will translate\n// that to TemplatesN<T1, ..., TN> internally to make error messages\n// readable.  The translation is done by the 'type' member of the\n// Templates template.\ntemplate <GTEST_TEMPLATE_ T1 = NoneT, GTEST_TEMPLATE_ T2 = NoneT,\n    GTEST_TEMPLATE_ T3 = NoneT, GTEST_TEMPLATE_ T4 = NoneT,\n    GTEST_TEMPLATE_ T5 = NoneT, GTEST_TEMPLATE_ T6 = NoneT,\n    GTEST_TEMPLATE_ T7 = NoneT, GTEST_TEMPLATE_ T8 = NoneT,\n    GTEST_TEMPLATE_ T9 = NoneT, GTEST_TEMPLATE_ T10 = NoneT,\n    GTEST_TEMPLATE_ T11 = NoneT, GTEST_TEMPLATE_ T12 = NoneT,\n    GTEST_TEMPLATE_ T13 = NoneT, GTEST_TEMPLATE_ T14 = NoneT,\n    GTEST_TEMPLATE_ T15 = NoneT, GTEST_TEMPLATE_ T16 = NoneT,\n    GTEST_TEMPLATE_ T17 = NoneT, GTEST_TEMPLATE_ T18 = NoneT,\n    GTEST_TEMPLATE_ T19 = NoneT, GTEST_TEMPLATE_ T20 = NoneT,\n    GTEST_TEMPLATE_ T21 = NoneT, GTEST_TEMPLATE_ T22 = NoneT,\n    GTEST_TEMPLATE_ T23 = NoneT, GTEST_TEMPLATE_ T24 = NoneT,\n    GTEST_TEMPLATE_ T25 = NoneT, GTEST_TEMPLATE_ T26 = NoneT,\n    GTEST_TEMPLATE_ T27 = NoneT, GTEST_TEMPLATE_ T28 = NoneT,\n    GTEST_TEMPLATE_ T29 = NoneT, GTEST_TEMPLATE_ T30 = NoneT,\n    GTEST_TEMPLATE_ T31 = NoneT, GTEST_TEMPLATE_ T32 = NoneT,\n    GTEST_TEMPLATE_ T33 = NoneT, GTEST_TEMPLATE_ T34 = NoneT,\n    GTEST_TEMPLATE_ T35 = NoneT, GTEST_TEMPLATE_ T36 = NoneT,\n    GTEST_TEMPLATE_ T37 = NoneT, GTEST_TEMPLATE_ T38 = NoneT,\n    GTEST_TEMPLATE_ T39 = NoneT, GTEST_TEMPLATE_ T40 = NoneT,\n    GTEST_TEMPLATE_ T41 = NoneT, GTEST_TEMPLATE_ T42 = NoneT,\n    GTEST_TEMPLATE_ T43 = NoneT, GTEST_TEMPLATE_ T44 = NoneT,\n    GTEST_TEMPLATE_ T45 = NoneT, GTEST_TEMPLATE_ T46 = NoneT,\n    GTEST_TEMPLATE_ T47 = NoneT, GTEST_TEMPLATE_ T48 = NoneT,\n    GTEST_TEMPLATE_ T49 = NoneT, GTEST_TEMPLATE_ T50 = NoneT>\nstruct Templates {\n  typedef Templates50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,\n      T42, T43, T44, T45, T46, T47, T48, T49, T50> type;\n};\n\ntemplate <>\nstruct Templates<NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT> {\n  typedef Templates0 type;\n};\ntemplate <GTEST_TEMPLATE_ T1>\nstruct Templates<T1, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT> {\n  typedef Templates1<T1> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2>\nstruct Templates<T1, T2, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT> {\n  typedef Templates2<T1, T2> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3>\nstruct Templates<T1, T2, T3, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates3<T1, T2, T3> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4>\nstruct Templates<T1, T2, T3, T4, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates4<T1, T2, T3, T4> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5>\nstruct Templates<T1, T2, T3, T4, T5, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates5<T1, T2, T3, T4, T5> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6>\nstruct Templates<T1, T2, T3, T4, T5, T6, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates6<T1, T2, T3, T4, T5, T6> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates7<T1, T2, T3, T4, T5, T6, T7> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates8<T1, T2, T3, T4, T5, T6, T7, T8> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT> {\n  typedef Templates22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT> {\n  typedef Templates23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT> {\n  typedef Templates24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT> {\n  typedef Templates25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT> {\n  typedef Templates26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT> {\n  typedef Templates27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT> {\n  typedef Templates28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT> {\n  typedef Templates29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, T35, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, T35, T36, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35, T36> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, T35, T36, T37, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, T35, T36, T37, T38, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,\n      T41> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,\n      T42> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,\n    GTEST_TEMPLATE_ T43>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,\n      T42, T43> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,\n    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,\n      T42, T43, T44> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,\n    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,\n    T45, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,\n      T42, T43, T44, T45> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,\n    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,\n    GTEST_TEMPLATE_ T46>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,\n    T45, T46, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,\n      T42, T43, T44, T45, T46> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,\n    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,\n    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,\n    T45, T46, T47, NoneT, NoneT, NoneT> {\n  typedef Templates47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,\n      T42, T43, T44, T45, T46, T47> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,\n    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,\n    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,\n    T45, T46, T47, T48, NoneT, NoneT> {\n  typedef Templates48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,\n      T42, T43, T44, T45, T46, T47, T48> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,\n    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,\n    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,\n    GTEST_TEMPLATE_ T49>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,\n    T45, T46, T47, T48, T49, NoneT> {\n  typedef Templates49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,\n      T42, T43, T44, T45, T46, T47, T48, T49> type;\n};\n\n// The TypeList template makes it possible to use either a single type\n// or a Types<...> list in TYPED_TEST_CASE() and\n// INSTANTIATE_TYPED_TEST_CASE_P().\n\ntemplate <typename T>\nstruct TypeList { typedef Types1<T> type; };\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47, typename T48, typename T49, typename T50>\nstruct TypeList<Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n    T44, T45, T46, T47, T48, T49, T50> > {\n  typedef typename Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,\n      T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>::type type;\n};\n\n#endif  // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P\n\n}  // namespace internal\n}  // namespace testing\n\n#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_\n\n// Due to C++ preprocessor weirdness, we need double indirection to\n// concatenate two tokens when one of them is __LINE__.  Writing\n//\n//   foo ## __LINE__\n//\n// will result in the token foo__LINE__, instead of foo followed by\n// the current line number.  For more details, see\n// http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.6\n#define GTEST_CONCAT_TOKEN_(foo, bar) GTEST_CONCAT_TOKEN_IMPL_(foo, bar)\n#define GTEST_CONCAT_TOKEN_IMPL_(foo, bar) foo ## bar\n\n// Google Test defines the testing::Message class to allow construction of\n// test messages via the << operator.  The idea is that anything\n// streamable to std::ostream can be streamed to a testing::Message.\n// This allows a user to use his own types in Google Test assertions by\n// overloading the << operator.\n//\n// util/gtl/stl_logging-inl.h overloads << for STL containers.  These\n// overloads cannot be defined in the std namespace, as that will be\n// undefined behavior.  Therefore, they are defined in the global\n// namespace instead.\n//\n// C++'s symbol lookup rule (i.e. Koenig lookup) says that these\n// overloads are visible in either the std namespace or the global\n// namespace, but not other namespaces, including the testing\n// namespace which Google Test's Message class is in.\n//\n// To allow STL containers (and other types that has a << operator\n// defined in the global namespace) to be used in Google Test assertions,\n// testing::Message must access the custom << operator from the global\n// namespace.  Hence this helper function.\n//\n// Note: Jeffrey Yasskin suggested an alternative fix by \"using\n// ::operator<<;\" in the definition of Message's operator<<.  That fix\n// doesn't require a helper function, but unfortunately doesn't\n// compile with MSVC.\ntemplate <typename T>\ninline void GTestStreamToHelper(std::ostream* os, const T& val) {\n  *os << val;\n}\n\nclass ProtocolMessage;\nnamespace proto2 { class Message; }\n\nnamespace testing {\n\n// Forward declarations.\n\nclass AssertionResult;                 // Result of an assertion.\nclass Message;                         // Represents a failure message.\nclass Test;                            // Represents a test.\nclass TestInfo;                        // Information about a test.\nclass TestPartResult;                  // Result of a test part.\nclass UnitTest;                        // A collection of test cases.\n\ntemplate <typename T>\n::std::string PrintToString(const T& value);\n\nnamespace internal {\n\nstruct TraceInfo;                      // Information about a trace point.\nclass ScopedTrace;                     // Implements scoped trace.\nclass TestInfoImpl;                    // Opaque implementation of TestInfo\nclass UnitTestImpl;                    // Opaque implementation of UnitTest\n\n// How many times InitGoogleTest() has been called.\nextern int g_init_gtest_count;\n\n// The text used in failure messages to indicate the start of the\n// stack trace.\nGTEST_API_ extern const char kStackTraceMarker[];\n\n// A secret type that Google Test users don't know about.  It has no\n// definition on purpose.  Therefore it's impossible to create a\n// Secret object, which is what we want.\nclass Secret;\n\n// Two overloaded helpers for checking at compile time whether an\n// expression is a null pointer literal (i.e. NULL or any 0-valued\n// compile-time integral constant).  Their return values have\n// different sizes, so we can use sizeof() to test which version is\n// picked by the compiler.  These helpers have no implementations, as\n// we only need their signatures.\n//\n// Given IsNullLiteralHelper(x), the compiler will pick the first\n// version if x can be implicitly converted to Secret*, and pick the\n// second version otherwise.  Since Secret is a secret and incomplete\n// type, the only expression a user can write that has type Secret* is\n// a null pointer literal.  Therefore, we know that x is a null\n// pointer literal if and only if the first version is picked by the\n// compiler.\nchar IsNullLiteralHelper(Secret* p);\nchar (&IsNullLiteralHelper(...))[2];  // NOLINT\n\n// A compile-time bool constant that is true if and only if x is a\n// null pointer literal (i.e. NULL or any 0-valued compile-time\n// integral constant).\n#ifdef GTEST_ELLIPSIS_NEEDS_POD_\n// We lose support for NULL detection where the compiler doesn't like\n// passing non-POD classes through ellipsis (...).\n# define GTEST_IS_NULL_LITERAL_(x) false\n#else\n# define GTEST_IS_NULL_LITERAL_(x) \\\n    (sizeof(::testing::internal::IsNullLiteralHelper(x)) == 1)\n#endif  // GTEST_ELLIPSIS_NEEDS_POD_\n\n// Appends the user-supplied message to the Google-Test-generated message.\nGTEST_API_ String AppendUserMessage(const String& gtest_msg,\n                                    const Message& user_msg);\n\n// A helper class for creating scoped traces in user programs.\nclass GTEST_API_ ScopedTrace {\n public:\n  // The c'tor pushes the given source file location and message onto\n  // a trace stack maintained by Google Test.\n  ScopedTrace(const char* file, int line, const Message& message);\n\n  // The d'tor pops the info pushed by the c'tor.\n  //\n  // Note that the d'tor is not virtual in order to be efficient.\n  // Don't inherit from ScopedTrace!\n  ~ScopedTrace();\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedTrace);\n} GTEST_ATTRIBUTE_UNUSED_;  // A ScopedTrace object does its job in its\n                            // c'tor and d'tor.  Therefore it doesn't\n                            // need to be used otherwise.\n\n// Converts a streamable value to a String.  A NULL pointer is\n// converted to \"(null)\".  When the input value is a ::string,\n// ::std::string, ::wstring, or ::std::wstring object, each NUL\n// character in it is replaced with \"\\\\0\".\n// Declared here but defined in gtest.h, so that it has access\n// to the definition of the Message class, required by the ARM\n// compiler.\ntemplate <typename T>\nString StreamableToString(const T& streamable);\n\n// The Symbian compiler has a bug that prevents it from selecting the\n// correct overload of FormatForComparisonFailureMessage (see below)\n// unless we pass the first argument by reference.  If we do that,\n// however, Visual Age C++ 10.1 generates a compiler error.  Therefore\n// we only apply the work-around for Symbian.\n#if defined(__SYMBIAN32__)\n# define GTEST_CREF_WORKAROUND_ const&\n#else\n# define GTEST_CREF_WORKAROUND_\n#endif\n\n// When this operand is a const char* or char*, if the other operand\n// is a ::std::string or ::string, we print this operand as a C string\n// rather than a pointer (we do the same for wide strings); otherwise\n// we print it as a pointer to be safe.\n\n// This internal macro is used to avoid duplicated code.\n#define GTEST_FORMAT_IMPL_(operand2_type, operand1_printer)\\\ninline String FormatForComparisonFailureMessage(\\\n    operand2_type::value_type* GTEST_CREF_WORKAROUND_ str, \\\n    const operand2_type& /*operand2*/) {\\\n  return operand1_printer(str);\\\n}\\\ninline String FormatForComparisonFailureMessage(\\\n    const operand2_type::value_type* GTEST_CREF_WORKAROUND_ str, \\\n    const operand2_type& /*operand2*/) {\\\n  return operand1_printer(str);\\\n}\n\nGTEST_FORMAT_IMPL_(::std::string, String::ShowCStringQuoted)\n#if GTEST_HAS_STD_WSTRING\nGTEST_FORMAT_IMPL_(::std::wstring, String::ShowWideCStringQuoted)\n#endif  // GTEST_HAS_STD_WSTRING\n\n#if GTEST_HAS_GLOBAL_STRING\nGTEST_FORMAT_IMPL_(::string, String::ShowCStringQuoted)\n#endif  // GTEST_HAS_GLOBAL_STRING\n#if GTEST_HAS_GLOBAL_WSTRING\nGTEST_FORMAT_IMPL_(::wstring, String::ShowWideCStringQuoted)\n#endif  // GTEST_HAS_GLOBAL_WSTRING\n\n#undef GTEST_FORMAT_IMPL_\n\n// The next four overloads handle the case where the operand being\n// printed is a char/wchar_t pointer and the other operand is not a\n// string/wstring object.  In such cases, we just print the operand as\n// a pointer to be safe.\n#define GTEST_FORMAT_CHAR_PTR_IMPL_(CharType)                       \\\n  template <typename T>                                             \\\n  String FormatForComparisonFailureMessage(CharType* GTEST_CREF_WORKAROUND_ p, \\\n                                           const T&) { \\\n    return PrintToString(static_cast<const void*>(p));              \\\n  }\n\nGTEST_FORMAT_CHAR_PTR_IMPL_(char)\nGTEST_FORMAT_CHAR_PTR_IMPL_(const char)\nGTEST_FORMAT_CHAR_PTR_IMPL_(wchar_t)\nGTEST_FORMAT_CHAR_PTR_IMPL_(const wchar_t)\n\n#undef GTEST_FORMAT_CHAR_PTR_IMPL_\n\n// Constructs and returns the message for an equality assertion\n// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.\n//\n// The first four parameters are the expressions used in the assertion\n// and their values, as strings.  For example, for ASSERT_EQ(foo, bar)\n// where foo is 5 and bar is 6, we have:\n//\n//   expected_expression: \"foo\"\n//   actual_expression:   \"bar\"\n//   expected_value:      \"5\"\n//   actual_value:        \"6\"\n//\n// The ignoring_case parameter is true iff the assertion is a\n// *_STRCASEEQ*.  When it's true, the string \" (ignoring case)\" will\n// be inserted into the message.\nGTEST_API_ AssertionResult EqFailure(const char* expected_expression,\n                                     const char* actual_expression,\n                                     const String& expected_value,\n                                     const String& actual_value,\n                                     bool ignoring_case);\n\n// Constructs a failure message for Boolean assertions such as EXPECT_TRUE.\nGTEST_API_ String GetBoolAssertionFailureMessage(\n    const AssertionResult& assertion_result,\n    const char* expression_text,\n    const char* actual_predicate_value,\n    const char* expected_predicate_value);\n\n// This template class represents an IEEE floating-point number\n// (either single-precision or double-precision, depending on the\n// template parameters).\n//\n// The purpose of this class is to do more sophisticated number\n// comparison.  (Due to round-off error, etc, it's very unlikely that\n// two floating-points will be equal exactly.  Hence a naive\n// comparison by the == operation often doesn't work.)\n//\n// Format of IEEE floating-point:\n//\n//   The most-significant bit being the leftmost, an IEEE\n//   floating-point looks like\n//\n//     sign_bit exponent_bits fraction_bits\n//\n//   Here, sign_bit is a single bit that designates the sign of the\n//   number.\n//\n//   For float, there are 8 exponent bits and 23 fraction bits.\n//\n//   For double, there are 11 exponent bits and 52 fraction bits.\n//\n//   More details can be found at\n//   http://en.wikipedia.org/wiki/IEEE_floating-point_standard.\n//\n// Template parameter:\n//\n//   RawType: the raw floating-point type (either float or double)\ntemplate <typename RawType>\nclass FloatingPoint {\n public:\n  // Defines the unsigned integer type that has the same size as the\n  // floating point number.\n  typedef typename TypeWithSize<sizeof(RawType)>::UInt Bits;\n\n  // Constants.\n\n  // # of bits in a number.\n  static const size_t kBitCount = 8*sizeof(RawType);\n\n  // # of fraction bits in a number.\n  static const size_t kFractionBitCount =\n    std::numeric_limits<RawType>::digits - 1;\n\n  // # of exponent bits in a number.\n  static const size_t kExponentBitCount = kBitCount - 1 - kFractionBitCount;\n\n  // The mask for the sign bit.\n  static const Bits kSignBitMask = static_cast<Bits>(1) << (kBitCount - 1);\n\n  // The mask for the fraction bits.\n  static const Bits kFractionBitMask =\n    ~static_cast<Bits>(0) >> (kExponentBitCount + 1);\n\n  // The mask for the exponent bits.\n  static const Bits kExponentBitMask = ~(kSignBitMask | kFractionBitMask);\n\n  // How many ULP's (Units in the Last Place) we want to tolerate when\n  // comparing two numbers.  The larger the value, the more error we\n  // allow.  A 0 value means that two numbers must be exactly the same\n  // to be considered equal.\n  //\n  // The maximum error of a single floating-point operation is 0.5\n  // units in the last place.  On Intel CPU's, all floating-point\n  // calculations are done with 80-bit precision, while double has 64\n  // bits.  Therefore, 4 should be enough for ordinary use.\n  //\n  // See the following article for more details on ULP:\n  // http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm.\n  static const size_t kMaxUlps = 4;\n\n  // Constructs a FloatingPoint from a raw floating-point number.\n  //\n  // On an Intel CPU, passing a non-normalized NAN (Not a Number)\n  // around may change its bits, although the new value is guaranteed\n  // to be also a NAN.  Therefore, don't expect this constructor to\n  // preserve the bits in x when x is a NAN.\n  explicit FloatingPoint(const RawType& x) { u_.value_ = x; }\n\n  // Static methods\n\n  // Reinterprets a bit pattern as a floating-point number.\n  //\n  // This function is needed to test the AlmostEquals() method.\n  static RawType ReinterpretBits(const Bits bits) {\n    FloatingPoint fp(0);\n    fp.u_.bits_ = bits;\n    return fp.u_.value_;\n  }\n\n  // Returns the floating-point number that represent positive infinity.\n  static RawType Infinity() {\n    return ReinterpretBits(kExponentBitMask);\n  }\n\n  // Non-static methods\n\n  // Returns the bits that represents this number.\n  const Bits &bits() const { return u_.bits_; }\n\n  // Returns the exponent bits of this number.\n  Bits exponent_bits() const { return kExponentBitMask & u_.bits_; }\n\n  // Returns the fraction bits of this number.\n  Bits fraction_bits() const { return kFractionBitMask & u_.bits_; }\n\n  // Returns the sign bit of this number.\n  Bits sign_bit() const { return kSignBitMask & u_.bits_; }\n\n  // Returns true iff this is NAN (not a number).\n  bool is_nan() const {\n    // It's a NAN if the exponent bits are all ones and the fraction\n    // bits are not entirely zeros.\n    return (exponent_bits() == kExponentBitMask) && (fraction_bits() != 0);\n  }\n\n  // Returns true iff this number is at most kMaxUlps ULP's away from\n  // rhs.  In particular, this function:\n  //\n  //   - returns false if either number is (or both are) NAN.\n  //   - treats really large numbers as almost equal to infinity.\n  //   - thinks +0.0 and -0.0 are 0 DLP's apart.\n  bool AlmostEquals(const FloatingPoint& rhs) const {\n    // The IEEE standard says that any comparison operation involving\n    // a NAN must return false.\n    if (is_nan() || rhs.is_nan()) return false;\n\n    return DistanceBetweenSignAndMagnitudeNumbers(u_.bits_, rhs.u_.bits_)\n        <= kMaxUlps;\n  }\n\n private:\n  // The data type used to store the actual floating-point number.\n  union FloatingPointUnion {\n    RawType value_;  // The raw floating-point number.\n    Bits bits_;      // The bits that represent the number.\n  };\n\n  // Converts an integer from the sign-and-magnitude representation to\n  // the biased representation.  More precisely, let N be 2 to the\n  // power of (kBitCount - 1), an integer x is represented by the\n  // unsigned number x + N.\n  //\n  // For instance,\n  //\n  //   -N + 1 (the most negative number representable using\n  //          sign-and-magnitude) is represented by 1;\n  //   0      is represented by N; and\n  //   N - 1  (the biggest number representable using\n  //          sign-and-magnitude) is represented by 2N - 1.\n  //\n  // Read http://en.wikipedia.org/wiki/Signed_number_representations\n  // for more details on signed number representations.\n  static Bits SignAndMagnitudeToBiased(const Bits &sam) {\n    if (kSignBitMask & sam) {\n      // sam represents a negative number.\n      return ~sam + 1;\n    } else {\n      // sam represents a positive number.\n      return kSignBitMask | sam;\n    }\n  }\n\n  // Given two numbers in the sign-and-magnitude representation,\n  // returns the distance between them as an unsigned number.\n  static Bits DistanceBetweenSignAndMagnitudeNumbers(const Bits &sam1,\n                                                     const Bits &sam2) {\n    const Bits biased1 = SignAndMagnitudeToBiased(sam1);\n    const Bits biased2 = SignAndMagnitudeToBiased(sam2);\n    return (biased1 >= biased2) ? (biased1 - biased2) : (biased2 - biased1);\n  }\n\n  FloatingPointUnion u_;\n};\n\n// Typedefs the instances of the FloatingPoint template class that we\n// care to use.\ntypedef FloatingPoint<float> Float;\ntypedef FloatingPoint<double> Double;\n\n// In order to catch the mistake of putting tests that use different\n// test fixture classes in the same test case, we need to assign\n// unique IDs to fixture classes and compare them.  The TypeId type is\n// used to hold such IDs.  The user should treat TypeId as an opaque\n// type: the only operation allowed on TypeId values is to compare\n// them for equality using the == operator.\ntypedef const void* TypeId;\n\ntemplate <typename T>\nclass TypeIdHelper {\n public:\n  // dummy_ must not have a const type.  Otherwise an overly eager\n  // compiler (e.g. MSVC 7.1 & 8.0) may try to merge\n  // TypeIdHelper<T>::dummy_ for different Ts as an \"optimization\".\n  static bool dummy_;\n};\n\ntemplate <typename T>\nbool TypeIdHelper<T>::dummy_ = false;\n\n// GetTypeId<T>() returns the ID of type T.  Different values will be\n// returned for different types.  Calling the function twice with the\n// same type argument is guaranteed to return the same ID.\ntemplate <typename T>\nTypeId GetTypeId() {\n  // The compiler is required to allocate a different\n  // TypeIdHelper<T>::dummy_ variable for each T used to instantiate\n  // the template.  Therefore, the address of dummy_ is guaranteed to\n  // be unique.\n  return &(TypeIdHelper<T>::dummy_);\n}\n\n// Returns the type ID of ::testing::Test.  Always call this instead\n// of GetTypeId< ::testing::Test>() to get the type ID of\n// ::testing::Test, as the latter may give the wrong result due to a\n// suspected linker bug when compiling Google Test as a Mac OS X\n// framework.\nGTEST_API_ TypeId GetTestTypeId();\n\n// Defines the abstract factory interface that creates instances\n// of a Test object.\nclass TestFactoryBase {\n public:\n  virtual ~TestFactoryBase() {}\n\n  // Creates a test instance to run. The instance is both created and destroyed\n  // within TestInfoImpl::Run()\n  virtual Test* CreateTest() = 0;\n\n protected:\n  TestFactoryBase() {}\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestFactoryBase);\n};\n\n// This class provides implementation of TeastFactoryBase interface.\n// It is used in TEST and TEST_F macros.\ntemplate <class TestClass>\nclass TestFactoryImpl : public TestFactoryBase {\n public:\n  virtual Test* CreateTest() { return new TestClass; }\n};\n\n#if GTEST_OS_WINDOWS\n\n// Predicate-formatters for implementing the HRESULT checking macros\n// {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}\n// We pass a long instead of HRESULT to avoid causing an\n// include dependency for the HRESULT type.\nGTEST_API_ AssertionResult IsHRESULTSuccess(const char* expr,\n                                            long hr);  // NOLINT\nGTEST_API_ AssertionResult IsHRESULTFailure(const char* expr,\n                                            long hr);  // NOLINT\n\n#endif  // GTEST_OS_WINDOWS\n\n// Types of SetUpTestCase() and TearDownTestCase() functions.\ntypedef void (*SetUpTestCaseFunc)();\ntypedef void (*TearDownTestCaseFunc)();\n\n// Creates a new TestInfo object and registers it with Google Test;\n// returns the created object.\n//\n// Arguments:\n//\n//   test_case_name:   name of the test case\n//   name:             name of the test\n//   type_param        the name of the test's type parameter, or NULL if\n//                     this is not  a typed or a type-parameterized test.\n//   value_param       text representation of the test's value parameter,\n//                     or NULL if this is not a type-parameterized test.\n//   fixture_class_id: ID of the test fixture class\n//   set_up_tc:        pointer to the function that sets up the test case\n//   tear_down_tc:     pointer to the function that tears down the test case\n//   factory:          pointer to the factory that creates a test object.\n//                     The newly created TestInfo instance will assume\n//                     ownership of the factory object.\nGTEST_API_ TestInfo* MakeAndRegisterTestInfo(\n    const char* test_case_name, const char* name,\n    const char* type_param,\n    const char* value_param,\n    TypeId fixture_class_id,\n    SetUpTestCaseFunc set_up_tc,\n    TearDownTestCaseFunc tear_down_tc,\n    TestFactoryBase* factory);\n\n// If *pstr starts with the given prefix, modifies *pstr to be right\n// past the prefix and returns true; otherwise leaves *pstr unchanged\n// and returns false.  None of pstr, *pstr, and prefix can be NULL.\nGTEST_API_ bool SkipPrefix(const char* prefix, const char** pstr);\n\n#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P\n\n// State of the definition of a type-parameterized test case.\nclass GTEST_API_ TypedTestCasePState {\n public:\n  TypedTestCasePState() : registered_(false) {}\n\n  // Adds the given test name to defined_test_names_ and return true\n  // if the test case hasn't been registered; otherwise aborts the\n  // program.\n  bool AddTestName(const char* file, int line, const char* case_name,\n                   const char* test_name) {\n    if (registered_) {\n      fprintf(stderr, \"%s Test %s must be defined before \"\n              \"REGISTER_TYPED_TEST_CASE_P(%s, ...).\\n\",\n              FormatFileLocation(file, line).c_str(), test_name, case_name);\n      fflush(stderr);\n      posix::Abort();\n    }\n    defined_test_names_.insert(test_name);\n    return true;\n  }\n\n  // Verifies that registered_tests match the test names in\n  // defined_test_names_; returns registered_tests if successful, or\n  // aborts the program otherwise.\n  const char* VerifyRegisteredTestNames(\n      const char* file, int line, const char* registered_tests);\n\n private:\n  bool registered_;\n  ::std::set<const char*> defined_test_names_;\n};\n\n// Skips to the first non-space char after the first comma in 'str';\n// returns NULL if no comma is found in 'str'.\ninline const char* SkipComma(const char* str) {\n  const char* comma = strchr(str, ',');\n  if (comma == NULL) {\n    return NULL;\n  }\n  while (IsSpace(*(++comma))) {}\n  return comma;\n}\n\n// Returns the prefix of 'str' before the first comma in it; returns\n// the entire string if it contains no comma.\ninline String GetPrefixUntilComma(const char* str) {\n  const char* comma = strchr(str, ',');\n  return comma == NULL ? String(str) : String(str, comma - str);\n}\n\n// TypeParameterizedTest<Fixture, TestSel, Types>::Register()\n// registers a list of type-parameterized tests with Google Test.  The\n// return value is insignificant - we just need to return something\n// such that we can call this function in a namespace scope.\n//\n// Implementation note: The GTEST_TEMPLATE_ macro declares a template\n// template parameter.  It's defined in gtest-type-util.h.\ntemplate <GTEST_TEMPLATE_ Fixture, class TestSel, typename Types>\nclass TypeParameterizedTest {\n public:\n  // 'index' is the index of the test in the type list 'Types'\n  // specified in INSTANTIATE_TYPED_TEST_CASE_P(Prefix, TestCase,\n  // Types).  Valid values for 'index' are [0, N - 1] where N is the\n  // length of Types.\n  static bool Register(const char* prefix, const char* case_name,\n                       const char* test_names, int index) {\n    typedef typename Types::Head Type;\n    typedef Fixture<Type> FixtureClass;\n    typedef typename GTEST_BIND_(TestSel, Type) TestClass;\n\n    // First, registers the first type-parameterized test in the type\n    // list.\n    MakeAndRegisterTestInfo(\n        String::Format(\"%s%s%s/%d\", prefix, prefix[0] == '\\0' ? \"\" : \"/\",\n                       case_name, index).c_str(),\n        GetPrefixUntilComma(test_names).c_str(),\n        GetTypeName<Type>().c_str(),\n        NULL,  // No value parameter.\n        GetTypeId<FixtureClass>(),\n        TestClass::SetUpTestCase,\n        TestClass::TearDownTestCase,\n        new TestFactoryImpl<TestClass>);\n\n    // Next, recurses (at compile time) with the tail of the type list.\n    return TypeParameterizedTest<Fixture, TestSel, typename Types::Tail>\n        ::Register(prefix, case_name, test_names, index + 1);\n  }\n};\n\n// The base case for the compile time recursion.\ntemplate <GTEST_TEMPLATE_ Fixture, class TestSel>\nclass TypeParameterizedTest<Fixture, TestSel, Types0> {\n public:\n  static bool Register(const char* /*prefix*/, const char* /*case_name*/,\n                       const char* /*test_names*/, int /*index*/) {\n    return true;\n  }\n};\n\n// TypeParameterizedTestCase<Fixture, Tests, Types>::Register()\n// registers *all combinations* of 'Tests' and 'Types' with Google\n// Test.  The return value is insignificant - we just need to return\n// something such that we can call this function in a namespace scope.\ntemplate <GTEST_TEMPLATE_ Fixture, typename Tests, typename Types>\nclass TypeParameterizedTestCase {\n public:\n  static bool Register(const char* prefix, const char* case_name,\n                       const char* test_names) {\n    typedef typename Tests::Head Head;\n\n    // First, register the first test in 'Test' for each type in 'Types'.\n    TypeParameterizedTest<Fixture, Head, Types>::Register(\n        prefix, case_name, test_names, 0);\n\n    // Next, recurses (at compile time) with the tail of the test list.\n    return TypeParameterizedTestCase<Fixture, typename Tests::Tail, Types>\n        ::Register(prefix, case_name, SkipComma(test_names));\n  }\n};\n\n// The base case for the compile time recursion.\ntemplate <GTEST_TEMPLATE_ Fixture, typename Types>\nclass TypeParameterizedTestCase<Fixture, Templates0, Types> {\n public:\n  static bool Register(const char* /*prefix*/, const char* /*case_name*/,\n                       const char* /*test_names*/) {\n    return true;\n  }\n};\n\n#endif  // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P\n\n// Returns the current OS stack trace as a String.\n//\n// The maximum number of stack frames to be included is specified by\n// the gtest_stack_trace_depth flag.  The skip_count parameter\n// specifies the number of top frames to be skipped, which doesn't\n// count against the number of frames to be included.\n//\n// For example, if Foo() calls Bar(), which in turn calls\n// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in\n// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't.\nGTEST_API_ String GetCurrentOsStackTraceExceptTop(UnitTest* unit_test,\n                                                  int skip_count);\n\n// Helpers for suppressing warnings on unreachable code or constant\n// condition.\n\n// Always returns true.\nGTEST_API_ bool AlwaysTrue();\n\n// Always returns false.\ninline bool AlwaysFalse() { return !AlwaysTrue(); }\n\n// Helper for suppressing false warning from Clang on a const char*\n// variable declared in a conditional expression always being NULL in\n// the else branch.\nstruct GTEST_API_ ConstCharPtr {\n  ConstCharPtr(const char* str) : value(str) {}\n  operator bool() const { return true; }\n  const char* value;\n};\n\n// A simple Linear Congruential Generator for generating random\n// numbers with a uniform distribution.  Unlike rand() and srand(), it\n// doesn't use global state (and therefore can't interfere with user\n// code).  Unlike rand_r(), it's portable.  An LCG isn't very random,\n// but it's good enough for our purposes.\nclass GTEST_API_ Random {\n public:\n  static const UInt32 kMaxRange = 1u << 31;\n\n  explicit Random(UInt32 seed) : state_(seed) {}\n\n  void Reseed(UInt32 seed) { state_ = seed; }\n\n  // Generates a random number from [0, range).  Crashes if 'range' is\n  // 0 or greater than kMaxRange.\n  UInt32 Generate(UInt32 range);\n\n private:\n  UInt32 state_;\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(Random);\n};\n\n// Defining a variable of type CompileAssertTypesEqual<T1, T2> will cause a\n// compiler error iff T1 and T2 are different types.\ntemplate <typename T1, typename T2>\nstruct CompileAssertTypesEqual;\n\ntemplate <typename T>\nstruct CompileAssertTypesEqual<T, T> {\n};\n\n// Removes the reference from a type if it is a reference type,\n// otherwise leaves it unchanged.  This is the same as\n// tr1::remove_reference, which is not widely available yet.\ntemplate <typename T>\nstruct RemoveReference { typedef T type; };  // NOLINT\ntemplate <typename T>\nstruct RemoveReference<T&> { typedef T type; };  // NOLINT\n\n// A handy wrapper around RemoveReference that works when the argument\n// T depends on template parameters.\n#define GTEST_REMOVE_REFERENCE_(T) \\\n    typename ::testing::internal::RemoveReference<T>::type\n\n// Removes const from a type if it is a const type, otherwise leaves\n// it unchanged.  This is the same as tr1::remove_const, which is not\n// widely available yet.\ntemplate <typename T>\nstruct RemoveConst { typedef T type; };  // NOLINT\ntemplate <typename T>\nstruct RemoveConst<const T> { typedef T type; };  // NOLINT\n\n// MSVC 8.0, Sun C++, and IBM XL C++ have a bug which causes the above\n// definition to fail to remove the const in 'const int[3]' and 'const\n// char[3][4]'.  The following specialization works around the bug.\n// However, it causes trouble with GCC and thus needs to be\n// conditionally compiled.\n#if defined(_MSC_VER) || defined(__SUNPRO_CC) || defined(__IBMCPP__)\ntemplate <typename T, size_t N>\nstruct RemoveConst<const T[N]> {\n  typedef typename RemoveConst<T>::type type[N];\n};\n#endif\n\n// A handy wrapper around RemoveConst that works when the argument\n// T depends on template parameters.\n#define GTEST_REMOVE_CONST_(T) \\\n    typename ::testing::internal::RemoveConst<T>::type\n\n// Turns const U&, U&, const U, and U all into U.\n#define GTEST_REMOVE_REFERENCE_AND_CONST_(T) \\\n    GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(T))\n\n// Adds reference to a type if it is not a reference type,\n// otherwise leaves it unchanged.  This is the same as\n// tr1::add_reference, which is not widely available yet.\ntemplate <typename T>\nstruct AddReference { typedef T& type; };  // NOLINT\ntemplate <typename T>\nstruct AddReference<T&> { typedef T& type; };  // NOLINT\n\n// A handy wrapper around AddReference that works when the argument T\n// depends on template parameters.\n#define GTEST_ADD_REFERENCE_(T) \\\n    typename ::testing::internal::AddReference<T>::type\n\n// Adds a reference to const on top of T as necessary.  For example,\n// it transforms\n//\n//   char         ==> const char&\n//   const char   ==> const char&\n//   char&        ==> const char&\n//   const char&  ==> const char&\n//\n// The argument T must depend on some template parameters.\n#define GTEST_REFERENCE_TO_CONST_(T) \\\n    GTEST_ADD_REFERENCE_(const GTEST_REMOVE_REFERENCE_(T))\n\n// ImplicitlyConvertible<From, To>::value is a compile-time bool\n// constant that's true iff type From can be implicitly converted to\n// type To.\ntemplate <typename From, typename To>\nclass ImplicitlyConvertible {\n private:\n  // We need the following helper functions only for their types.\n  // They have no implementations.\n\n  // MakeFrom() is an expression whose type is From.  We cannot simply\n  // use From(), as the type From may not have a public default\n  // constructor.\n  static From MakeFrom();\n\n  // These two functions are overloaded.  Given an expression\n  // Helper(x), the compiler will pick the first version if x can be\n  // implicitly converted to type To; otherwise it will pick the\n  // second version.\n  //\n  // The first version returns a value of size 1, and the second\n  // version returns a value of size 2.  Therefore, by checking the\n  // size of Helper(x), which can be done at compile time, we can tell\n  // which version of Helper() is used, and hence whether x can be\n  // implicitly converted to type To.\n  static char Helper(To);\n  static char (&Helper(...))[2];  // NOLINT\n\n  // We have to put the 'public' section after the 'private' section,\n  // or MSVC refuses to compile the code.\n public:\n  // MSVC warns about implicitly converting from double to int for\n  // possible loss of data, so we need to temporarily disable the\n  // warning.\n#ifdef _MSC_VER\n# pragma warning(push)          // Saves the current warning state.\n# pragma warning(disable:4244)  // Temporarily disables warning 4244.\n\n  static const bool value =\n      sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1;\n# pragma warning(pop)           // Restores the warning state.\n#elif defined(__BORLANDC__)\n  // C++Builder cannot use member overload resolution during template\n  // instantiation.  The simplest workaround is to use its C++0x type traits\n  // functions (C++Builder 2009 and above only).\n  static const bool value = __is_convertible(From, To);\n#else\n  static const bool value =\n      sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1;\n#endif  // _MSV_VER\n};\ntemplate <typename From, typename To>\nconst bool ImplicitlyConvertible<From, To>::value;\n\n// IsAProtocolMessage<T>::value is a compile-time bool constant that's\n// true iff T is type ProtocolMessage, proto2::Message, or a subclass\n// of those.\ntemplate <typename T>\nstruct IsAProtocolMessage\n    : public bool_constant<\n  ImplicitlyConvertible<const T*, const ::ProtocolMessage*>::value ||\n  ImplicitlyConvertible<const T*, const ::proto2::Message*>::value> {\n};\n\n// When the compiler sees expression IsContainerTest<C>(0), if C is an\n// STL-style container class, the first overload of IsContainerTest\n// will be viable (since both C::iterator* and C::const_iterator* are\n// valid types and NULL can be implicitly converted to them).  It will\n// be picked over the second overload as 'int' is a perfect match for\n// the type of argument 0.  If C::iterator or C::const_iterator is not\n// a valid type, the first overload is not viable, and the second\n// overload will be picked.  Therefore, we can determine whether C is\n// a container class by checking the type of IsContainerTest<C>(0).\n// The value of the expression is insignificant.\n//\n// Note that we look for both C::iterator and C::const_iterator.  The\n// reason is that C++ injects the name of a class as a member of the\n// class itself (e.g. you can refer to class iterator as either\n// 'iterator' or 'iterator::iterator').  If we look for C::iterator\n// only, for example, we would mistakenly think that a class named\n// iterator is an STL container.\n//\n// Also note that the simpler approach of overloading\n// IsContainerTest(typename C::const_iterator*) and\n// IsContainerTest(...) doesn't work with Visual Age C++ and Sun C++.\ntypedef int IsContainer;\ntemplate <class C>\nIsContainer IsContainerTest(int /* dummy */,\n                            typename C::iterator* /* it */ = NULL,\n                            typename C::const_iterator* /* const_it */ = NULL) {\n  return 0;\n}\n\ntypedef char IsNotContainer;\ntemplate <class C>\nIsNotContainer IsContainerTest(long /* dummy */) { return '\\0'; }\n\n// EnableIf<condition>::type is void when 'Cond' is true, and\n// undefined when 'Cond' is false.  To use SFINAE to make a function\n// overload only apply when a particular expression is true, add\n// \"typename EnableIf<expression>::type* = 0\" as the last parameter.\ntemplate<bool> struct EnableIf;\ntemplate<> struct EnableIf<true> { typedef void type; };  // NOLINT\n\n// Utilities for native arrays.\n\n// ArrayEq() compares two k-dimensional native arrays using the\n// elements' operator==, where k can be any integer >= 0.  When k is\n// 0, ArrayEq() degenerates into comparing a single pair of values.\n\ntemplate <typename T, typename U>\nbool ArrayEq(const T* lhs, size_t size, const U* rhs);\n\n// This generic version is used when k is 0.\ntemplate <typename T, typename U>\ninline bool ArrayEq(const T& lhs, const U& rhs) { return lhs == rhs; }\n\n// This overload is used when k >= 1.\ntemplate <typename T, typename U, size_t N>\ninline bool ArrayEq(const T(&lhs)[N], const U(&rhs)[N]) {\n  return internal::ArrayEq(lhs, N, rhs);\n}\n\n// This helper reduces code bloat.  If we instead put its logic inside\n// the previous ArrayEq() function, arrays with different sizes would\n// lead to different copies of the template code.\ntemplate <typename T, typename U>\nbool ArrayEq(const T* lhs, size_t size, const U* rhs) {\n  for (size_t i = 0; i != size; i++) {\n    if (!internal::ArrayEq(lhs[i], rhs[i]))\n      return false;\n  }\n  return true;\n}\n\n// Finds the first element in the iterator range [begin, end) that\n// equals elem.  Element may be a native array type itself.\ntemplate <typename Iter, typename Element>\nIter ArrayAwareFind(Iter begin, Iter end, const Element& elem) {\n  for (Iter it = begin; it != end; ++it) {\n    if (internal::ArrayEq(*it, elem))\n      return it;\n  }\n  return end;\n}\n\n// CopyArray() copies a k-dimensional native array using the elements'\n// operator=, where k can be any integer >= 0.  When k is 0,\n// CopyArray() degenerates into copying a single value.\n\ntemplate <typename T, typename U>\nvoid CopyArray(const T* from, size_t size, U* to);\n\n// This generic version is used when k is 0.\ntemplate <typename T, typename U>\ninline void CopyArray(const T& from, U* to) { *to = from; }\n\n// This overload is used when k >= 1.\ntemplate <typename T, typename U, size_t N>\ninline void CopyArray(const T(&from)[N], U(*to)[N]) {\n  internal::CopyArray(from, N, *to);\n}\n\n// This helper reduces code bloat.  If we instead put its logic inside\n// the previous CopyArray() function, arrays with different sizes\n// would lead to different copies of the template code.\ntemplate <typename T, typename U>\nvoid CopyArray(const T* from, size_t size, U* to) {\n  for (size_t i = 0; i != size; i++) {\n    internal::CopyArray(from[i], to + i);\n  }\n}\n\n// The relation between an NativeArray object (see below) and the\n// native array it represents.\nenum RelationToSource {\n  kReference,  // The NativeArray references the native array.\n  kCopy        // The NativeArray makes a copy of the native array and\n               // owns the copy.\n};\n\n// Adapts a native array to a read-only STL-style container.  Instead\n// of the complete STL container concept, this adaptor only implements\n// members useful for Google Mock's container matchers.  New members\n// should be added as needed.  To simplify the implementation, we only\n// support Element being a raw type (i.e. having no top-level const or\n// reference modifier).  It's the client's responsibility to satisfy\n// this requirement.  Element can be an array type itself (hence\n// multi-dimensional arrays are supported).\ntemplate <typename Element>\nclass NativeArray {\n public:\n  // STL-style container typedefs.\n  typedef Element value_type;\n  typedef Element* iterator;\n  typedef const Element* const_iterator;\n\n  // Constructs from a native array.\n  NativeArray(const Element* array, size_t count, RelationToSource relation) {\n    Init(array, count, relation);\n  }\n\n  // Copy constructor.\n  NativeArray(const NativeArray& rhs) {\n    Init(rhs.array_, rhs.size_, rhs.relation_to_source_);\n  }\n\n  ~NativeArray() {\n    // Ensures that the user doesn't instantiate NativeArray with a\n    // const or reference type.\n    static_cast<void>(StaticAssertTypeEqHelper<Element,\n        GTEST_REMOVE_REFERENCE_AND_CONST_(Element)>());\n    if (relation_to_source_ == kCopy)\n      delete[] array_;\n  }\n\n  // STL-style container methods.\n  size_t size() const { return size_; }\n  const_iterator begin() const { return array_; }\n  const_iterator end() const { return array_ + size_; }\n  bool operator==(const NativeArray& rhs) const {\n    return size() == rhs.size() &&\n        ArrayEq(begin(), size(), rhs.begin());\n  }\n\n private:\n  // Initializes this object; makes a copy of the input array if\n  // 'relation' is kCopy.\n  void Init(const Element* array, size_t a_size, RelationToSource relation) {\n    if (relation == kReference) {\n      array_ = array;\n    } else {\n      Element* const copy = new Element[a_size];\n      CopyArray(array, a_size, copy);\n      array_ = copy;\n    }\n    size_ = a_size;\n    relation_to_source_ = relation;\n  }\n\n  const Element* array_;\n  size_t size_;\n  RelationToSource relation_to_source_;\n\n  GTEST_DISALLOW_ASSIGN_(NativeArray);\n};\n\n}  // namespace internal\n}  // namespace testing\n\n#define GTEST_MESSAGE_AT_(file, line, message, result_type) \\\n  ::testing::internal::AssertHelper(result_type, file, line, message) \\\n    = ::testing::Message()\n\n#define GTEST_MESSAGE_(message, result_type) \\\n  GTEST_MESSAGE_AT_(__FILE__, __LINE__, message, result_type)\n\n#define GTEST_FATAL_FAILURE_(message) \\\n  return GTEST_MESSAGE_(message, ::testing::TestPartResult::kFatalFailure)\n\n#define GTEST_NONFATAL_FAILURE_(message) \\\n  GTEST_MESSAGE_(message, ::testing::TestPartResult::kNonFatalFailure)\n\n#define GTEST_SUCCESS_(message) \\\n  GTEST_MESSAGE_(message, ::testing::TestPartResult::kSuccess)\n\n// Suppresses MSVC warnings 4072 (unreachable code) for the code following\n// statement if it returns or throws (or doesn't return or throw in some\n// situations).\n#define GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) \\\n  if (::testing::internal::AlwaysTrue()) { statement; }\n\n#define GTEST_TEST_THROW_(statement, expected_exception, fail) \\\n  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \\\n  if (::testing::internal::ConstCharPtr gtest_msg = \"\") { \\\n    bool gtest_caught_expected = false; \\\n    try { \\\n      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \\\n    } \\\n    catch (expected_exception const&) { \\\n      gtest_caught_expected = true; \\\n    } \\\n    catch (...) { \\\n      gtest_msg.value = \\\n          \"Expected: \" #statement \" throws an exception of type \" \\\n          #expected_exception \".\\n  Actual: it throws a different type.\"; \\\n      goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \\\n    } \\\n    if (!gtest_caught_expected) { \\\n      gtest_msg.value = \\\n          \"Expected: \" #statement \" throws an exception of type \" \\\n          #expected_exception \".\\n  Actual: it throws nothing.\"; \\\n      goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \\\n    } \\\n  } else \\\n    GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__): \\\n      fail(gtest_msg.value)\n\n#define GTEST_TEST_NO_THROW_(statement, fail) \\\n  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \\\n  if (::testing::internal::AlwaysTrue()) { \\\n    try { \\\n      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \\\n    } \\\n    catch (...) { \\\n      goto GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__); \\\n    } \\\n  } else \\\n    GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__): \\\n      fail(\"Expected: \" #statement \" doesn't throw an exception.\\n\" \\\n           \"  Actual: it throws.\")\n\n#define GTEST_TEST_ANY_THROW_(statement, fail) \\\n  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \\\n  if (::testing::internal::AlwaysTrue()) { \\\n    bool gtest_caught_any = false; \\\n    try { \\\n      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \\\n    } \\\n    catch (...) { \\\n      gtest_caught_any = true; \\\n    } \\\n    if (!gtest_caught_any) { \\\n      goto GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__); \\\n    } \\\n  } else \\\n    GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__): \\\n      fail(\"Expected: \" #statement \" throws an exception.\\n\" \\\n           \"  Actual: it doesn't.\")\n\n\n// Implements Boolean test assertions such as EXPECT_TRUE. expression can be\n// either a boolean expression or an AssertionResult. text is a textual\n// represenation of expression as it was passed into the EXPECT_TRUE.\n#define GTEST_TEST_BOOLEAN_(expression, text, actual, expected, fail) \\\n  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \\\n  if (const ::testing::AssertionResult gtest_ar_ = \\\n      ::testing::AssertionResult(expression)) \\\n    ; \\\n  else \\\n    fail(::testing::internal::GetBoolAssertionFailureMessage(\\\n        gtest_ar_, text, #actual, #expected).c_str())\n\n#define GTEST_TEST_NO_FATAL_FAILURE_(statement, fail) \\\n  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \\\n  if (::testing::internal::AlwaysTrue()) { \\\n    ::testing::internal::HasNewFatalFailureHelper gtest_fatal_failure_checker; \\\n    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \\\n    if (gtest_fatal_failure_checker.has_new_fatal_failure()) { \\\n      goto GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__); \\\n    } \\\n  } else \\\n    GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__): \\\n      fail(\"Expected: \" #statement \" doesn't generate new fatal \" \\\n           \"failures in the current thread.\\n\" \\\n           \"  Actual: it does.\")\n\n// Expands to the name of the class that implements the given test.\n#define GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \\\n  test_case_name##_##test_name##_Test\n\n// Helper macro for defining tests.\n#define GTEST_TEST_(test_case_name, test_name, parent_class, parent_id)\\\nclass GTEST_TEST_CLASS_NAME_(test_case_name, test_name) : public parent_class {\\\n public:\\\n  GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {}\\\n private:\\\n  virtual void TestBody();\\\n  static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_;\\\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(\\\n      GTEST_TEST_CLASS_NAME_(test_case_name, test_name));\\\n};\\\n\\\n::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_case_name, test_name)\\\n  ::test_info_ =\\\n    ::testing::internal::MakeAndRegisterTestInfo(\\\n        #test_case_name, #test_name, NULL, NULL, \\\n        (parent_id), \\\n        parent_class::SetUpTestCase, \\\n        parent_class::TearDownTestCase, \\\n        new ::testing::internal::TestFactoryImpl<\\\n            GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>);\\\nvoid GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()\n\n#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_\n// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n//\n// The Google C++ Testing Framework (Google Test)\n//\n// This header file defines the public API for death tests.  It is\n// #included by gtest.h so a user doesn't need to include this\n// directly.\n\n#ifndef GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_\n#define GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_\n\n// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee)\n//\n// The Google C++ Testing Framework (Google Test)\n//\n// This header file defines internal utilities needed for implementing\n// death tests.  They are subject to change without notice.\n\n#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_\n#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_\n\n\n#include <stdio.h>\n\nnamespace testing {\nnamespace internal {\n\nGTEST_DECLARE_string_(internal_run_death_test);\n\n// Names of the flags (needed for parsing Google Test flags).\nconst char kDeathTestStyleFlag[] = \"death_test_style\";\nconst char kDeathTestUseFork[] = \"death_test_use_fork\";\nconst char kInternalRunDeathTestFlag[] = \"internal_run_death_test\";\n\n#if GTEST_HAS_DEATH_TEST\n\n// DeathTest is a class that hides much of the complexity of the\n// GTEST_DEATH_TEST_ macro.  It is abstract; its static Create method\n// returns a concrete class that depends on the prevailing death test\n// style, as defined by the --gtest_death_test_style and/or\n// --gtest_internal_run_death_test flags.\n\n// In describing the results of death tests, these terms are used with\n// the corresponding definitions:\n//\n// exit status:  The integer exit information in the format specified\n//               by wait(2)\n// exit code:    The integer code passed to exit(3), _exit(2), or\n//               returned from main()\nclass GTEST_API_ DeathTest {\n public:\n  // Create returns false if there was an error determining the\n  // appropriate action to take for the current death test; for example,\n  // if the gtest_death_test_style flag is set to an invalid value.\n  // The LastMessage method will return a more detailed message in that\n  // case.  Otherwise, the DeathTest pointer pointed to by the \"test\"\n  // argument is set.  If the death test should be skipped, the pointer\n  // is set to NULL; otherwise, it is set to the address of a new concrete\n  // DeathTest object that controls the execution of the current test.\n  static bool Create(const char* statement, const RE* regex,\n                     const char* file, int line, DeathTest** test);\n  DeathTest();\n  virtual ~DeathTest() { }\n\n  // A helper class that aborts a death test when it's deleted.\n  class ReturnSentinel {\n   public:\n    explicit ReturnSentinel(DeathTest* test) : test_(test) { }\n    ~ReturnSentinel() { test_->Abort(TEST_ENCOUNTERED_RETURN_STATEMENT); }\n   private:\n    DeathTest* const test_;\n    GTEST_DISALLOW_COPY_AND_ASSIGN_(ReturnSentinel);\n  } GTEST_ATTRIBUTE_UNUSED_;\n\n  // An enumeration of possible roles that may be taken when a death\n  // test is encountered.  EXECUTE means that the death test logic should\n  // be executed immediately.  OVERSEE means that the program should prepare\n  // the appropriate environment for a child process to execute the death\n  // test, then wait for it to complete.\n  enum TestRole { OVERSEE_TEST, EXECUTE_TEST };\n\n  // An enumeration of the three reasons that a test might be aborted.\n  enum AbortReason {\n    TEST_ENCOUNTERED_RETURN_STATEMENT,\n    TEST_THREW_EXCEPTION,\n    TEST_DID_NOT_DIE\n  };\n\n  // Assumes one of the above roles.\n  virtual TestRole AssumeRole() = 0;\n\n  // Waits for the death test to finish and returns its status.\n  virtual int Wait() = 0;\n\n  // Returns true if the death test passed; that is, the test process\n  // exited during the test, its exit status matches a user-supplied\n  // predicate, and its stderr output matches a user-supplied regular\n  // expression.\n  // The user-supplied predicate may be a macro expression rather\n  // than a function pointer or functor, or else Wait and Passed could\n  // be combined.\n  virtual bool Passed(bool exit_status_ok) = 0;\n\n  // Signals that the death test did not die as expected.\n  virtual void Abort(AbortReason reason) = 0;\n\n  // Returns a human-readable outcome message regarding the outcome of\n  // the last death test.\n  static const char* LastMessage();\n\n  static void set_last_death_test_message(const String& message);\n\n private:\n  // A string containing a description of the outcome of the last death test.\n  static String last_death_test_message_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(DeathTest);\n};\n\n// Factory interface for death tests.  May be mocked out for testing.\nclass DeathTestFactory {\n public:\n  virtual ~DeathTestFactory() { }\n  virtual bool Create(const char* statement, const RE* regex,\n                      const char* file, int line, DeathTest** test) = 0;\n};\n\n// A concrete DeathTestFactory implementation for normal use.\nclass DefaultDeathTestFactory : public DeathTestFactory {\n public:\n  virtual bool Create(const char* statement, const RE* regex,\n                      const char* file, int line, DeathTest** test);\n};\n\n// Returns true if exit_status describes a process that was terminated\n// by a signal, or exited normally with a nonzero exit code.\nGTEST_API_ bool ExitedUnsuccessfully(int exit_status);\n\n// Traps C++ exceptions escaping statement and reports them as test\n// failures. Note that trapping SEH exceptions is not implemented here.\n# if GTEST_HAS_EXCEPTIONS\n#  define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \\\n  try { \\\n    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \\\n  } catch (const ::std::exception& gtest_exception) { \\\n    fprintf(\\\n        stderr, \\\n        \"\\n%s: Caught std::exception-derived exception escaping the \" \\\n        \"death test statement. Exception message: %s\\n\", \\\n        ::testing::internal::FormatFileLocation(__FILE__, __LINE__).c_str(), \\\n        gtest_exception.what()); \\\n    fflush(stderr); \\\n    death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \\\n  } catch (...) { \\\n    death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \\\n  }\n\n# else\n#  define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \\\n  GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)\n\n# endif\n\n// This macro is for implementing ASSERT_DEATH*, EXPECT_DEATH*,\n// ASSERT_EXIT*, and EXPECT_EXIT*.\n# define GTEST_DEATH_TEST_(statement, predicate, regex, fail) \\\n  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \\\n  if (::testing::internal::AlwaysTrue()) { \\\n    const ::testing::internal::RE& gtest_regex = (regex); \\\n    ::testing::internal::DeathTest* gtest_dt; \\\n    if (!::testing::internal::DeathTest::Create(#statement, &gtest_regex, \\\n        __FILE__, __LINE__, &gtest_dt)) { \\\n      goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \\\n    } \\\n    if (gtest_dt != NULL) { \\\n      ::testing::internal::scoped_ptr< ::testing::internal::DeathTest> \\\n          gtest_dt_ptr(gtest_dt); \\\n      switch (gtest_dt->AssumeRole()) { \\\n        case ::testing::internal::DeathTest::OVERSEE_TEST: \\\n          if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) { \\\n            goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \\\n          } \\\n          break; \\\n        case ::testing::internal::DeathTest::EXECUTE_TEST: { \\\n          ::testing::internal::DeathTest::ReturnSentinel \\\n              gtest_sentinel(gtest_dt); \\\n          GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, gtest_dt); \\\n          gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \\\n          break; \\\n        } \\\n        default: \\\n          break; \\\n      } \\\n    } \\\n  } else \\\n    GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__): \\\n      fail(::testing::internal::DeathTest::LastMessage())\n// The symbol \"fail\" here expands to something into which a message\n// can be streamed.\n\n// A class representing the parsed contents of the\n// --gtest_internal_run_death_test flag, as it existed when\n// RUN_ALL_TESTS was called.\nclass InternalRunDeathTestFlag {\n public:\n  InternalRunDeathTestFlag(const String& a_file,\n                           int a_line,\n                           int an_index,\n                           int a_write_fd)\n      : file_(a_file), line_(a_line), index_(an_index),\n        write_fd_(a_write_fd) {}\n\n  ~InternalRunDeathTestFlag() {\n    if (write_fd_ >= 0)\n      posix::Close(write_fd_);\n  }\n\n  String file() const { return file_; }\n  int line() const { return line_; }\n  int index() const { return index_; }\n  int write_fd() const { return write_fd_; }\n\n private:\n  String file_;\n  int line_;\n  int index_;\n  int write_fd_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(InternalRunDeathTestFlag);\n};\n\n// Returns a newly created InternalRunDeathTestFlag object with fields\n// initialized from the GTEST_FLAG(internal_run_death_test) flag if\n// the flag is specified; otherwise returns NULL.\nInternalRunDeathTestFlag* ParseInternalRunDeathTestFlag();\n\n#else  // GTEST_HAS_DEATH_TEST\n\n// This macro is used for implementing macros such as\n// EXPECT_DEATH_IF_SUPPORTED and ASSERT_DEATH_IF_SUPPORTED on systems where\n// death tests are not supported. Those macros must compile on such systems\n// iff EXPECT_DEATH and ASSERT_DEATH compile with the same parameters on\n// systems that support death tests. This allows one to write such a macro\n// on a system that does not support death tests and be sure that it will\n// compile on a death-test supporting system.\n//\n// Parameters:\n//   statement -  A statement that a macro such as EXPECT_DEATH would test\n//                for program termination. This macro has to make sure this\n//                statement is compiled but not executed, to ensure that\n//                EXPECT_DEATH_IF_SUPPORTED compiles with a certain\n//                parameter iff EXPECT_DEATH compiles with it.\n//   regex     -  A regex that a macro such as EXPECT_DEATH would use to test\n//                the output of statement.  This parameter has to be\n//                compiled but not evaluated by this macro, to ensure that\n//                this macro only accepts expressions that a macro such as\n//                EXPECT_DEATH would accept.\n//   terminator - Must be an empty statement for EXPECT_DEATH_IF_SUPPORTED\n//                and a return statement for ASSERT_DEATH_IF_SUPPORTED.\n//                This ensures that ASSERT_DEATH_IF_SUPPORTED will not\n//                compile inside functions where ASSERT_DEATH doesn't\n//                compile.\n//\n//  The branch that has an always false condition is used to ensure that\n//  statement and regex are compiled (and thus syntactically correct) but\n//  never executed. The unreachable code macro protects the terminator\n//  statement from generating an 'unreachable code' warning in case\n//  statement unconditionally returns or throws. The Message constructor at\n//  the end allows the syntax of streaming additional messages into the\n//  macro, for compilational compatibility with EXPECT_DEATH/ASSERT_DEATH.\n# define GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, terminator) \\\n    GTEST_AMBIGUOUS_ELSE_BLOCKER_ \\\n    if (::testing::internal::AlwaysTrue()) { \\\n      GTEST_LOG_(WARNING) \\\n          << \"Death tests are not supported on this platform.\\n\" \\\n          << \"Statement '\" #statement \"' cannot be verified.\"; \\\n    } else if (::testing::internal::AlwaysFalse()) { \\\n      ::testing::internal::RE::PartialMatch(\".*\", (regex)); \\\n      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \\\n      terminator; \\\n    } else \\\n      ::testing::Message()\n\n#endif  // GTEST_HAS_DEATH_TEST\n\n}  // namespace internal\n}  // namespace testing\n\n#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_\n\nnamespace testing {\n\n// This flag controls the style of death tests.  Valid values are \"threadsafe\",\n// meaning that the death test child process will re-execute the test binary\n// from the start, running only a single death test, or \"fast\",\n// meaning that the child process will execute the test logic immediately\n// after forking.\nGTEST_DECLARE_string_(death_test_style);\n\n#if GTEST_HAS_DEATH_TEST\n\n// The following macros are useful for writing death tests.\n\n// Here's what happens when an ASSERT_DEATH* or EXPECT_DEATH* is\n// executed:\n//\n//   1. It generates a warning if there is more than one active\n//   thread.  This is because it's safe to fork() or clone() only\n//   when there is a single thread.\n//\n//   2. The parent process clone()s a sub-process and runs the death\n//   test in it; the sub-process exits with code 0 at the end of the\n//   death test, if it hasn't exited already.\n//\n//   3. The parent process waits for the sub-process to terminate.\n//\n//   4. The parent process checks the exit code and error message of\n//   the sub-process.\n//\n// Examples:\n//\n//   ASSERT_DEATH(server.SendMessage(56, \"Hello\"), \"Invalid port number\");\n//   for (int i = 0; i < 5; i++) {\n//     EXPECT_DEATH(server.ProcessRequest(i),\n//                  \"Invalid request .* in ProcessRequest()\")\n//         << \"Failed to die on request \" << i);\n//   }\n//\n//   ASSERT_EXIT(server.ExitNow(), ::testing::ExitedWithCode(0), \"Exiting\");\n//\n//   bool KilledBySIGHUP(int exit_code) {\n//     return WIFSIGNALED(exit_code) && WTERMSIG(exit_code) == SIGHUP;\n//   }\n//\n//   ASSERT_EXIT(client.HangUpServer(), KilledBySIGHUP, \"Hanging up!\");\n//\n// On the regular expressions used in death tests:\n//\n//   On POSIX-compliant systems (*nix), we use the <regex.h> library,\n//   which uses the POSIX extended regex syntax.\n//\n//   On other platforms (e.g. Windows), we only support a simple regex\n//   syntax implemented as part of Google Test.  This limited\n//   implementation should be enough most of the time when writing\n//   death tests; though it lacks many features you can find in PCRE\n//   or POSIX extended regex syntax.  For example, we don't support\n//   union (\"x|y\"), grouping (\"(xy)\"), brackets (\"[xy]\"), and\n//   repetition count (\"x{5,7}\"), among others.\n//\n//   Below is the syntax that we do support.  We chose it to be a\n//   subset of both PCRE and POSIX extended regex, so it's easy to\n//   learn wherever you come from.  In the following: 'A' denotes a\n//   literal character, period (.), or a single \\\\ escape sequence;\n//   'x' and 'y' denote regular expressions; 'm' and 'n' are for\n//   natural numbers.\n//\n//     c     matches any literal character c\n//     \\\\d   matches any decimal digit\n//     \\\\D   matches any character that's not a decimal digit\n//     \\\\f   matches \\f\n//     \\\\n   matches \\n\n//     \\\\r   matches \\r\n//     \\\\s   matches any ASCII whitespace, including \\n\n//     \\\\S   matches any character that's not a whitespace\n//     \\\\t   matches \\t\n//     \\\\v   matches \\v\n//     \\\\w   matches any letter, _, or decimal digit\n//     \\\\W   matches any character that \\\\w doesn't match\n//     \\\\c   matches any literal character c, which must be a punctuation\n//     .     matches any single character except \\n\n//     A?    matches 0 or 1 occurrences of A\n//     A*    matches 0 or many occurrences of A\n//     A+    matches 1 or many occurrences of A\n//     ^     matches the beginning of a string (not that of each line)\n//     $     matches the end of a string (not that of each line)\n//     xy    matches x followed by y\n//\n//   If you accidentally use PCRE or POSIX extended regex features\n//   not implemented by us, you will get a run-time failure.  In that\n//   case, please try to rewrite your regular expression within the\n//   above syntax.\n//\n//   This implementation is *not* meant to be as highly tuned or robust\n//   as a compiled regex library, but should perform well enough for a\n//   death test, which already incurs significant overhead by launching\n//   a child process.\n//\n// Known caveats:\n//\n//   A \"threadsafe\" style death test obtains the path to the test\n//   program from argv[0] and re-executes it in the sub-process.  For\n//   simplicity, the current implementation doesn't search the PATH\n//   when launching the sub-process.  This means that the user must\n//   invoke the test program via a path that contains at least one\n//   path separator (e.g. path/to/foo_test and\n//   /absolute/path/to/bar_test are fine, but foo_test is not).  This\n//   is rarely a problem as people usually don't put the test binary\n//   directory in PATH.\n//\n// TODO(wan@google.com): make thread-safe death tests search the PATH.\n\n// Asserts that a given statement causes the program to exit, with an\n// integer exit status that satisfies predicate, and emitting error output\n// that matches regex.\n# define ASSERT_EXIT(statement, predicate, regex) \\\n    GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_FATAL_FAILURE_)\n\n// Like ASSERT_EXIT, but continues on to successive tests in the\n// test case, if any:\n# define EXPECT_EXIT(statement, predicate, regex) \\\n    GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_NONFATAL_FAILURE_)\n\n// Asserts that a given statement causes the program to exit, either by\n// explicitly exiting with a nonzero exit code or being killed by a\n// signal, and emitting error output that matches regex.\n# define ASSERT_DEATH(statement, regex) \\\n    ASSERT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)\n\n// Like ASSERT_DEATH, but continues on to successive tests in the\n// test case, if any:\n# define EXPECT_DEATH(statement, regex) \\\n    EXPECT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)\n\n// Two predicate classes that can be used in {ASSERT,EXPECT}_EXIT*:\n\n// Tests that an exit code describes a normal exit with a given exit code.\nclass GTEST_API_ ExitedWithCode {\n public:\n  explicit ExitedWithCode(int exit_code);\n  bool operator()(int exit_status) const;\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ExitedWithCode& other);\n\n  const int exit_code_;\n};\n\n# if !GTEST_OS_WINDOWS\n// Tests that an exit code describes an exit due to termination by a\n// given signal.\nclass GTEST_API_ KilledBySignal {\n public:\n  explicit KilledBySignal(int signum);\n  bool operator()(int exit_status) const;\n private:\n  const int signum_;\n};\n# endif  // !GTEST_OS_WINDOWS\n\n// EXPECT_DEBUG_DEATH asserts that the given statements die in debug mode.\n// The death testing framework causes this to have interesting semantics,\n// since the sideeffects of the call are only visible in opt mode, and not\n// in debug mode.\n//\n// In practice, this can be used to test functions that utilize the\n// LOG(DFATAL) macro using the following style:\n//\n// int DieInDebugOr12(int* sideeffect) {\n//   if (sideeffect) {\n//     *sideeffect = 12;\n//   }\n//   LOG(DFATAL) << \"death\";\n//   return 12;\n// }\n//\n// TEST(TestCase, TestDieOr12WorksInDgbAndOpt) {\n//   int sideeffect = 0;\n//   // Only asserts in dbg.\n//   EXPECT_DEBUG_DEATH(DieInDebugOr12(&sideeffect), \"death\");\n//\n// #ifdef NDEBUG\n//   // opt-mode has sideeffect visible.\n//   EXPECT_EQ(12, sideeffect);\n// #else\n//   // dbg-mode no visible sideeffect.\n//   EXPECT_EQ(0, sideeffect);\n// #endif\n// }\n//\n// This will assert that DieInDebugReturn12InOpt() crashes in debug\n// mode, usually due to a DCHECK or LOG(DFATAL), but returns the\n// appropriate fallback value (12 in this case) in opt mode. If you\n// need to test that a function has appropriate side-effects in opt\n// mode, include assertions against the side-effects.  A general\n// pattern for this is:\n//\n// EXPECT_DEBUG_DEATH({\n//   // Side-effects here will have an effect after this statement in\n//   // opt mode, but none in debug mode.\n//   EXPECT_EQ(12, DieInDebugOr12(&sideeffect));\n// }, \"death\");\n//\n# ifdef NDEBUG\n\n#  define EXPECT_DEBUG_DEATH(statement, regex) \\\n  do { statement; } while (::testing::internal::AlwaysFalse())\n\n#  define ASSERT_DEBUG_DEATH(statement, regex) \\\n  do { statement; } while (::testing::internal::AlwaysFalse())\n\n# else\n\n#  define EXPECT_DEBUG_DEATH(statement, regex) \\\n  EXPECT_DEATH(statement, regex)\n\n#  define ASSERT_DEBUG_DEATH(statement, regex) \\\n  ASSERT_DEATH(statement, regex)\n\n# endif  // NDEBUG for EXPECT_DEBUG_DEATH\n#endif  // GTEST_HAS_DEATH_TEST\n\n// EXPECT_DEATH_IF_SUPPORTED(statement, regex) and\n// ASSERT_DEATH_IF_SUPPORTED(statement, regex) expand to real death tests if\n// death tests are supported; otherwise they just issue a warning.  This is\n// useful when you are combining death test assertions with normal test\n// assertions in one test.\n#if GTEST_HAS_DEATH_TEST\n# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \\\n    EXPECT_DEATH(statement, regex)\n# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \\\n    ASSERT_DEATH(statement, regex)\n#else\n# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \\\n    GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, )\n# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \\\n    GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, return)\n#endif\n\n}  // namespace testing\n\n#endif  // GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_\n// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n//\n// The Google C++ Testing Framework (Google Test)\n//\n// This header file defines the Message class.\n//\n// IMPORTANT NOTE: Due to limitation of the C++ language, we have to\n// leave some internal implementation details in this header file.\n// They are clearly marked by comments like this:\n//\n//   // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\n//\n// Such code is NOT meant to be used by a user directly, and is subject\n// to CHANGE WITHOUT NOTICE.  Therefore DO NOT DEPEND ON IT in a user\n// program!\n\n#ifndef GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_\n#define GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_\n\n#include <limits>\n\n\nnamespace testing {\n\n// The Message class works like an ostream repeater.\n//\n// Typical usage:\n//\n//   1. You stream a bunch of values to a Message object.\n//      It will remember the text in a stringstream.\n//   2. Then you stream the Message object to an ostream.\n//      This causes the text in the Message to be streamed\n//      to the ostream.\n//\n// For example;\n//\n//   testing::Message foo;\n//   foo << 1 << \" != \" << 2;\n//   std::cout << foo;\n//\n// will print \"1 != 2\".\n//\n// Message is not intended to be inherited from.  In particular, its\n// destructor is not virtual.\n//\n// Note that stringstream behaves differently in gcc and in MSVC.  You\n// can stream a NULL char pointer to it in the former, but not in the\n// latter (it causes an access violation if you do).  The Message\n// class hides this difference by treating a NULL char pointer as\n// \"(null)\".\nclass GTEST_API_ Message {\n private:\n  // The type of basic IO manipulators (endl, ends, and flush) for\n  // narrow streams.\n  typedef std::ostream& (*BasicNarrowIoManip)(std::ostream&);\n\n public:\n  // Constructs an empty Message.\n  // We allocate the stringstream separately because otherwise each use of\n  // ASSERT/EXPECT in a procedure adds over 200 bytes to the procedure's\n  // stack frame leading to huge stack frames in some cases; gcc does not reuse\n  // the stack space.\n  Message() : ss_(new ::std::stringstream) {\n    // By default, we want there to be enough precision when printing\n    // a double to a Message.\n    *ss_ << std::setprecision(std::numeric_limits<double>::digits10 + 2);\n  }\n\n  // Copy constructor.\n  Message(const Message& msg) : ss_(new ::std::stringstream) {  // NOLINT\n    *ss_ << msg.GetString();\n  }\n\n  // Constructs a Message from a C-string.\n  explicit Message(const char* str) : ss_(new ::std::stringstream) {\n    *ss_ << str;\n  }\n\n#if GTEST_OS_SYMBIAN\n  // Streams a value (either a pointer or not) to this object.\n  template <typename T>\n  inline Message& operator <<(const T& value) {\n    StreamHelper(typename internal::is_pointer<T>::type(), value);\n    return *this;\n  }\n#else\n  // Streams a non-pointer value to this object.\n  template <typename T>\n  inline Message& operator <<(const T& val) {\n    ::GTestStreamToHelper(ss_.get(), val);\n    return *this;\n  }\n\n  // Streams a pointer value to this object.\n  //\n  // This function is an overload of the previous one.  When you\n  // stream a pointer to a Message, this definition will be used as it\n  // is more specialized.  (The C++ Standard, section\n  // [temp.func.order].)  If you stream a non-pointer, then the\n  // previous definition will be used.\n  //\n  // The reason for this overload is that streaming a NULL pointer to\n  // ostream is undefined behavior.  Depending on the compiler, you\n  // may get \"0\", \"(nil)\", \"(null)\", or an access violation.  To\n  // ensure consistent result across compilers, we always treat NULL\n  // as \"(null)\".\n  template <typename T>\n  inline Message& operator <<(T* const& pointer) {  // NOLINT\n    if (pointer == NULL) {\n      *ss_ << \"(null)\";\n    } else {\n      ::GTestStreamToHelper(ss_.get(), pointer);\n    }\n    return *this;\n  }\n#endif  // GTEST_OS_SYMBIAN\n\n  // Since the basic IO manipulators are overloaded for both narrow\n  // and wide streams, we have to provide this specialized definition\n  // of operator <<, even though its body is the same as the\n  // templatized version above.  Without this definition, streaming\n  // endl or other basic IO manipulators to Message will confuse the\n  // compiler.\n  Message& operator <<(BasicNarrowIoManip val) {\n    *ss_ << val;\n    return *this;\n  }\n\n  // Instead of 1/0, we want to see true/false for bool values.\n  Message& operator <<(bool b) {\n    return *this << (b ? \"true\" : \"false\");\n  }\n\n  // These two overloads allow streaming a wide C string to a Message\n  // using the UTF-8 encoding.\n  Message& operator <<(const wchar_t* wide_c_str) {\n    return *this << internal::String::ShowWideCString(wide_c_str);\n  }\n  Message& operator <<(wchar_t* wide_c_str) {\n    return *this << internal::String::ShowWideCString(wide_c_str);\n  }\n\n#if GTEST_HAS_STD_WSTRING\n  // Converts the given wide string to a narrow string using the UTF-8\n  // encoding, and streams the result to this Message object.\n  Message& operator <<(const ::std::wstring& wstr);\n#endif  // GTEST_HAS_STD_WSTRING\n\n#if GTEST_HAS_GLOBAL_WSTRING\n  // Converts the given wide string to a narrow string using the UTF-8\n  // encoding, and streams the result to this Message object.\n  Message& operator <<(const ::wstring& wstr);\n#endif  // GTEST_HAS_GLOBAL_WSTRING\n\n  // Gets the text streamed to this object so far as a String.\n  // Each '\\0' character in the buffer is replaced with \"\\\\0\".\n  //\n  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\n  internal::String GetString() const {\n    return internal::StringStreamToString(ss_.get());\n  }\n\n private:\n\n#if GTEST_OS_SYMBIAN\n  // These are needed as the Nokia Symbian Compiler cannot decide between\n  // const T& and const T* in a function template. The Nokia compiler _can_\n  // decide between class template specializations for T and T*, so a\n  // tr1::type_traits-like is_pointer works, and we can overload on that.\n  template <typename T>\n  inline void StreamHelper(internal::true_type /*dummy*/, T* pointer) {\n    if (pointer == NULL) {\n      *ss_ << \"(null)\";\n    } else {\n      ::GTestStreamToHelper(ss_.get(), pointer);\n    }\n  }\n  template <typename T>\n  inline void StreamHelper(internal::false_type /*dummy*/, const T& value) {\n    ::GTestStreamToHelper(ss_.get(), value);\n  }\n#endif  // GTEST_OS_SYMBIAN\n\n  // We'll hold the text streamed to this object here.\n  const internal::scoped_ptr< ::std::stringstream> ss_;\n\n  // We declare (but don't implement) this to prevent the compiler\n  // from implementing the assignment operator.\n  void operator=(const Message&);\n};\n\n// Streams a Message to an ostream.\ninline std::ostream& operator <<(std::ostream& os, const Message& sb) {\n  return os << sb.GetString();\n}\n\n}  // namespace testing\n\n#endif  // GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_\n// This file was GENERATED by command:\n//     pump.py gtest-param-test.h.pump\n// DO NOT EDIT BY HAND!!!\n\n// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Authors: vladl@google.com (Vlad Losev)\n//\n// Macros and functions for implementing parameterized tests\n// in Google C++ Testing Framework (Google Test)\n//\n// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!\n//\n#ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_\n#define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_\n\n\n// Value-parameterized tests allow you to test your code with different\n// parameters without writing multiple copies of the same test.\n//\n// Here is how you use value-parameterized tests:\n\n#if 0\n\n// To write value-parameterized tests, first you should define a fixture\n// class. It is usually derived from testing::TestWithParam<T> (see below for\n// another inheritance scheme that's sometimes useful in more complicated\n// class hierarchies), where the type of your parameter values.\n// TestWithParam<T> is itself derived from testing::Test. T can be any\n// copyable type. If it's a raw pointer, you are responsible for managing the\n// lifespan of the pointed values.\n\nclass FooTest : public ::testing::TestWithParam<const char*> {\n  // You can implement all the usual class fixture members here.\n};\n\n// Then, use the TEST_P macro to define as many parameterized tests\n// for this fixture as you want. The _P suffix is for \"parameterized\"\n// or \"pattern\", whichever you prefer to think.\n\nTEST_P(FooTest, DoesBlah) {\n  // Inside a test, access the test parameter with the GetParam() method\n  // of the TestWithParam<T> class:\n  EXPECT_TRUE(foo.Blah(GetParam()));\n  ...\n}\n\nTEST_P(FooTest, HasBlahBlah) {\n  ...\n}\n\n// Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test\n// case with any set of parameters you want. Google Test defines a number\n// of functions for generating test parameters. They return what we call\n// (surprise!) parameter generators. Here is a  summary of them, which\n// are all in the testing namespace:\n//\n//\n//  Range(begin, end [, step]) - Yields values {begin, begin+step,\n//                               begin+step+step, ...}. The values do not\n//                               include end. step defaults to 1.\n//  Values(v1, v2, ..., vN)    - Yields values {v1, v2, ..., vN}.\n//  ValuesIn(container)        - Yields values from a C-style array, an STL\n//  ValuesIn(begin,end)          container, or an iterator range [begin, end).\n//  Bool()                     - Yields sequence {false, true}.\n//  Combine(g1, g2, ..., gN)   - Yields all combinations (the Cartesian product\n//                               for the math savvy) of the values generated\n//                               by the N generators.\n//\n// For more details, see comments at the definitions of these functions below\n// in this file.\n//\n// The following statement will instantiate tests from the FooTest test case\n// each with parameter values \"meeny\", \"miny\", and \"moe\".\n\nINSTANTIATE_TEST_CASE_P(InstantiationName,\n                        FooTest,\n                        Values(\"meeny\", \"miny\", \"moe\"));\n\n// To distinguish different instances of the pattern, (yes, you\n// can instantiate it more then once) the first argument to the\n// INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the\n// actual test case name. Remember to pick unique prefixes for different\n// instantiations. The tests from the instantiation above will have\n// these names:\n//\n//    * InstantiationName/FooTest.DoesBlah/0 for \"meeny\"\n//    * InstantiationName/FooTest.DoesBlah/1 for \"miny\"\n//    * InstantiationName/FooTest.DoesBlah/2 for \"moe\"\n//    * InstantiationName/FooTest.HasBlahBlah/0 for \"meeny\"\n//    * InstantiationName/FooTest.HasBlahBlah/1 for \"miny\"\n//    * InstantiationName/FooTest.HasBlahBlah/2 for \"moe\"\n//\n// You can use these names in --gtest_filter.\n//\n// This statement will instantiate all tests from FooTest again, each\n// with parameter values \"cat\" and \"dog\":\n\nconst char* pets[] = {\"cat\", \"dog\"};\nINSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets));\n\n// The tests from the instantiation above will have these names:\n//\n//    * AnotherInstantiationName/FooTest.DoesBlah/0 for \"cat\"\n//    * AnotherInstantiationName/FooTest.DoesBlah/1 for \"dog\"\n//    * AnotherInstantiationName/FooTest.HasBlahBlah/0 for \"cat\"\n//    * AnotherInstantiationName/FooTest.HasBlahBlah/1 for \"dog\"\n//\n// Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests\n// in the given test case, whether their definitions come before or\n// AFTER the INSTANTIATE_TEST_CASE_P statement.\n//\n// Please also note that generator expressions (including parameters to the\n// generators) are evaluated in InitGoogleTest(), after main() has started.\n// This allows the user on one hand, to adjust generator parameters in order\n// to dynamically determine a set of tests to run and on the other hand,\n// give the user a chance to inspect the generated tests with Google Test\n// reflection API before RUN_ALL_TESTS() is executed.\n//\n// You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc\n// for more examples.\n//\n// In the future, we plan to publish the API for defining new parameter\n// generators. But for now this interface remains part of the internal\n// implementation and is subject to change.\n//\n//\n// A parameterized test fixture must be derived from testing::Test and from\n// testing::WithParamInterface<T>, where T is the type of the parameter\n// values. Inheriting from TestWithParam<T> satisfies that requirement because\n// TestWithParam<T> inherits from both Test and WithParamInterface. In more\n// complicated hierarchies, however, it is occasionally useful to inherit\n// separately from Test and WithParamInterface. For example:\n\nclass BaseTest : public ::testing::Test {\n  // You can inherit all the usual members for a non-parameterized test\n  // fixture here.\n};\n\nclass DerivedTest : public BaseTest, public ::testing::WithParamInterface<int> {\n  // The usual test fixture members go here too.\n};\n\nTEST_F(BaseTest, HasFoo) {\n  // This is an ordinary non-parameterized test.\n}\n\nTEST_P(DerivedTest, DoesBlah) {\n  // GetParam works just the same here as if you inherit from TestWithParam.\n  EXPECT_TRUE(foo.Blah(GetParam()));\n}\n\n#endif  // 0\n\n\n#if !GTEST_OS_SYMBIAN\n# include <utility>\n#endif\n\n// scripts/fuse_gtest.py depends on gtest's own header being #included\n// *unconditionally*.  Therefore these #includes cannot be moved\n// inside #if GTEST_HAS_PARAM_TEST.\n// Copyright 2008 Google Inc.\n// All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: vladl@google.com (Vlad Losev)\n\n// Type and function utilities for implementing parameterized tests.\n\n#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_\n#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_\n\n#include <iterator>\n#include <utility>\n#include <vector>\n\n// scripts/fuse_gtest.py depends on gtest's own header being #included\n// *unconditionally*.  Therefore these #includes cannot be moved\n// inside #if GTEST_HAS_PARAM_TEST.\n// Copyright 2003 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Authors: Dan Egnor (egnor@google.com)\n//\n// A \"smart\" pointer type with reference tracking.  Every pointer to a\n// particular object is kept on a circular linked list.  When the last pointer\n// to an object is destroyed or reassigned, the object is deleted.\n//\n// Used properly, this deletes the object when the last reference goes away.\n// There are several caveats:\n// - Like all reference counting schemes, cycles lead to leaks.\n// - Each smart pointer is actually two pointers (8 bytes instead of 4).\n// - Every time a pointer is assigned, the entire list of pointers to that\n//   object is traversed.  This class is therefore NOT SUITABLE when there\n//   will often be more than two or three pointers to a particular object.\n// - References are only tracked as long as linked_ptr<> objects are copied.\n//   If a linked_ptr<> is converted to a raw pointer and back, BAD THINGS\n//   will happen (double deletion).\n//\n// A good use of this class is storing object references in STL containers.\n// You can safely put linked_ptr<> in a vector<>.\n// Other uses may not be as good.\n//\n// Note: If you use an incomplete type with linked_ptr<>, the class\n// *containing* linked_ptr<> must have a constructor and destructor (even\n// if they do nothing!).\n//\n// Bill Gibbons suggested we use something like this.\n//\n// Thread Safety:\n//   Unlike other linked_ptr implementations, in this implementation\n//   a linked_ptr object is thread-safe in the sense that:\n//     - it's safe to copy linked_ptr objects concurrently,\n//     - it's safe to copy *from* a linked_ptr and read its underlying\n//       raw pointer (e.g. via get()) concurrently, and\n//     - it's safe to write to two linked_ptrs that point to the same\n//       shared object concurrently.\n// TODO(wan@google.com): rename this to safe_linked_ptr to avoid\n// confusion with normal linked_ptr.\n\n#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_\n#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_\n\n#include <stdlib.h>\n#include <assert.h>\n\n\nnamespace testing {\nnamespace internal {\n\n// Protects copying of all linked_ptr objects.\nGTEST_API_ GTEST_DECLARE_STATIC_MUTEX_(g_linked_ptr_mutex);\n\n// This is used internally by all instances of linked_ptr<>.  It needs to be\n// a non-template class because different types of linked_ptr<> can refer to\n// the same object (linked_ptr<Superclass>(obj) vs linked_ptr<Subclass>(obj)).\n// So, it needs to be possible for different types of linked_ptr to participate\n// in the same circular linked list, so we need a single class type here.\n//\n// DO NOT USE THIS CLASS DIRECTLY YOURSELF.  Use linked_ptr<T>.\nclass linked_ptr_internal {\n public:\n  // Create a new circle that includes only this instance.\n  void join_new() {\n    next_ = this;\n  }\n\n  // Many linked_ptr operations may change p.link_ for some linked_ptr\n  // variable p in the same circle as this object.  Therefore we need\n  // to prevent two such operations from occurring concurrently.\n  //\n  // Note that different types of linked_ptr objects can coexist in a\n  // circle (e.g. linked_ptr<Base>, linked_ptr<Derived1>, and\n  // linked_ptr<Derived2>).  Therefore we must use a single mutex to\n  // protect all linked_ptr objects.  This can create serious\n  // contention in production code, but is acceptable in a testing\n  // framework.\n\n  // Join an existing circle.\n  // L < g_linked_ptr_mutex\n  void join(linked_ptr_internal const* ptr) {\n    MutexLock lock(&g_linked_ptr_mutex);\n\n    linked_ptr_internal const* p = ptr;\n    while (p->next_ != ptr) p = p->next_;\n    p->next_ = this;\n    next_ = ptr;\n  }\n\n  // Leave whatever circle we're part of.  Returns true if we were the\n  // last member of the circle.  Once this is done, you can join() another.\n  // L < g_linked_ptr_mutex\n  bool depart() {\n    MutexLock lock(&g_linked_ptr_mutex);\n\n    if (next_ == this) return true;\n    linked_ptr_internal const* p = next_;\n    while (p->next_ != this) p = p->next_;\n    p->next_ = next_;\n    return false;\n  }\n\n private:\n  mutable linked_ptr_internal const* next_;\n};\n\ntemplate <typename T>\nclass linked_ptr {\n public:\n  typedef T element_type;\n\n  // Take over ownership of a raw pointer.  This should happen as soon as\n  // possible after the object is created.\n  explicit linked_ptr(T* ptr = NULL) { capture(ptr); }\n  ~linked_ptr() { depart(); }\n\n  // Copy an existing linked_ptr<>, adding ourselves to the list of references.\n  template <typename U> linked_ptr(linked_ptr<U> const& ptr) { copy(&ptr); }\n  linked_ptr(linked_ptr const& ptr) {  // NOLINT\n    assert(&ptr != this);\n    copy(&ptr);\n  }\n\n  // Assignment releases the old value and acquires the new.\n  template <typename U> linked_ptr& operator=(linked_ptr<U> const& ptr) {\n    depart();\n    copy(&ptr);\n    return *this;\n  }\n\n  linked_ptr& operator=(linked_ptr const& ptr) {\n    if (&ptr != this) {\n      depart();\n      copy(&ptr);\n    }\n    return *this;\n  }\n\n  // Smart pointer members.\n  void reset(T* ptr = NULL) {\n    depart();\n    capture(ptr);\n  }\n  T* get() const { return value_; }\n  T* operator->() const { return value_; }\n  T& operator*() const { return *value_; }\n\n  bool operator==(T* p) const { return value_ == p; }\n  bool operator!=(T* p) const { return value_ != p; }\n  template <typename U>\n  bool operator==(linked_ptr<U> const& ptr) const {\n    return value_ == ptr.get();\n  }\n  template <typename U>\n  bool operator!=(linked_ptr<U> const& ptr) const {\n    return value_ != ptr.get();\n  }\n\n private:\n  template <typename U>\n  friend class linked_ptr;\n\n  T* value_;\n  linked_ptr_internal link_;\n\n  void depart() {\n    if (link_.depart()) delete value_;\n  }\n\n  void capture(T* ptr) {\n    value_ = ptr;\n    link_.join_new();\n  }\n\n  template <typename U> void copy(linked_ptr<U> const* ptr) {\n    value_ = ptr->get();\n    if (value_)\n      link_.join(&ptr->link_);\n    else\n      link_.join_new();\n  }\n};\n\ntemplate<typename T> inline\nbool operator==(T* ptr, const linked_ptr<T>& x) {\n  return ptr == x.get();\n}\n\ntemplate<typename T> inline\nbool operator!=(T* ptr, const linked_ptr<T>& x) {\n  return ptr != x.get();\n}\n\n// A function to convert T* into linked_ptr<T>\n// Doing e.g. make_linked_ptr(new FooBarBaz<type>(arg)) is a shorter notation\n// for linked_ptr<FooBarBaz<type> >(new FooBarBaz<type>(arg))\ntemplate <typename T>\nlinked_ptr<T> make_linked_ptr(T* ptr) {\n  return linked_ptr<T>(ptr);\n}\n\n}  // namespace internal\n}  // namespace testing\n\n#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_\n// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n\n// Google Test - The Google C++ Testing Framework\n//\n// This file implements a universal value printer that can print a\n// value of any type T:\n//\n//   void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr);\n//\n// A user can teach this function how to print a class type T by\n// defining either operator<<() or PrintTo() in the namespace that\n// defines T.  More specifically, the FIRST defined function in the\n// following list will be used (assuming T is defined in namespace\n// foo):\n//\n//   1. foo::PrintTo(const T&, ostream*)\n//   2. operator<<(ostream&, const T&) defined in either foo or the\n//      global namespace.\n//\n// If none of the above is defined, it will print the debug string of\n// the value if it is a protocol buffer, or print the raw bytes in the\n// value otherwise.\n//\n// To aid debugging: when T is a reference type, the address of the\n// value is also printed; when T is a (const) char pointer, both the\n// pointer value and the NUL-terminated string it points to are\n// printed.\n//\n// We also provide some convenient wrappers:\n//\n//   // Prints a value to a string.  For a (const or not) char\n//   // pointer, the NUL-terminated string (but not the pointer) is\n//   // printed.\n//   std::string ::testing::PrintToString(const T& value);\n//\n//   // Prints a value tersely: for a reference type, the referenced\n//   // value (but not the address) is printed; for a (const or not) char\n//   // pointer, the NUL-terminated string (but not the pointer) is\n//   // printed.\n//   void ::testing::internal::UniversalTersePrint(const T& value, ostream*);\n//\n//   // Prints value using the type inferred by the compiler.  The difference\n//   // from UniversalTersePrint() is that this function prints both the\n//   // pointer and the NUL-terminated string for a (const or not) char pointer.\n//   void ::testing::internal::UniversalPrint(const T& value, ostream*);\n//\n//   // Prints the fields of a tuple tersely to a string vector, one\n//   // element for each field. Tuple support must be enabled in\n//   // gtest-port.h.\n//   std::vector<string> UniversalTersePrintTupleFieldsToStrings(\n//       const Tuple& value);\n//\n// Known limitation:\n//\n// The print primitives print the elements of an STL-style container\n// using the compiler-inferred type of *iter where iter is a\n// const_iterator of the container.  When const_iterator is an input\n// iterator but not a forward iterator, this inferred type may not\n// match value_type, and the print output may be incorrect.  In\n// practice, this is rarely a problem as for most containers\n// const_iterator is a forward iterator.  We'll fix this if there's an\n// actual need for it.  Note that this fix cannot rely on value_type\n// being defined as many user-defined container types don't have\n// value_type.\n\n#ifndef GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_\n#define GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_\n\n#include <ostream>  // NOLINT\n#include <sstream>\n#include <string>\n#include <utility>\n#include <vector>\n\nnamespace testing {\n\n// Definitions in the 'internal' and 'internal2' name spaces are\n// subject to change without notice.  DO NOT USE THEM IN USER CODE!\nnamespace internal2 {\n\n// Prints the given number of bytes in the given object to the given\n// ostream.\nGTEST_API_ void PrintBytesInObjectTo(const unsigned char* obj_bytes,\n                                     size_t count,\n                                     ::std::ostream* os);\n\n// For selecting which printer to use when a given type has neither <<\n// nor PrintTo().\nenum TypeKind {\n  kProtobuf,              // a protobuf type\n  kConvertibleToInteger,  // a type implicitly convertible to BiggestInt\n                          // (e.g. a named or unnamed enum type)\n  kOtherType              // anything else\n};\n\n// TypeWithoutFormatter<T, kTypeKind>::PrintValue(value, os) is called\n// by the universal printer to print a value of type T when neither\n// operator<< nor PrintTo() is defined for T, where kTypeKind is the\n// \"kind\" of T as defined by enum TypeKind.\ntemplate <typename T, TypeKind kTypeKind>\nclass TypeWithoutFormatter {\n public:\n  // This default version is called when kTypeKind is kOtherType.\n  static void PrintValue(const T& value, ::std::ostream* os) {\n    PrintBytesInObjectTo(reinterpret_cast<const unsigned char*>(&value),\n                         sizeof(value), os);\n  }\n};\n\n// We print a protobuf using its ShortDebugString() when the string\n// doesn't exceed this many characters; otherwise we print it using\n// DebugString() for better readability.\nconst size_t kProtobufOneLinerMaxLength = 50;\n\ntemplate <typename T>\nclass TypeWithoutFormatter<T, kProtobuf> {\n public:\n  static void PrintValue(const T& value, ::std::ostream* os) {\n    const ::testing::internal::string short_str = value.ShortDebugString();\n    const ::testing::internal::string pretty_str =\n        short_str.length() <= kProtobufOneLinerMaxLength ?\n        short_str : (\"\\n\" + value.DebugString());\n    *os << (\"<\" + pretty_str + \">\");\n  }\n};\n\ntemplate <typename T>\nclass TypeWithoutFormatter<T, kConvertibleToInteger> {\n public:\n  // Since T has no << operator or PrintTo() but can be implicitly\n  // converted to BiggestInt, we print it as a BiggestInt.\n  //\n  // Most likely T is an enum type (either named or unnamed), in which\n  // case printing it as an integer is the desired behavior.  In case\n  // T is not an enum, printing it as an integer is the best we can do\n  // given that it has no user-defined printer.\n  static void PrintValue(const T& value, ::std::ostream* os) {\n    const internal::BiggestInt kBigInt = value;\n    *os << kBigInt;\n  }\n};\n\n// Prints the given value to the given ostream.  If the value is a\n// protocol message, its debug string is printed; if it's an enum or\n// of a type implicitly convertible to BiggestInt, it's printed as an\n// integer; otherwise the bytes in the value are printed.  This is\n// what UniversalPrinter<T>::Print() does when it knows nothing about\n// type T and T has neither << operator nor PrintTo().\n//\n// A user can override this behavior for a class type Foo by defining\n// a << operator in the namespace where Foo is defined.\n//\n// We put this operator in namespace 'internal2' instead of 'internal'\n// to simplify the implementation, as much code in 'internal' needs to\n// use << in STL, which would conflict with our own << were it defined\n// in 'internal'.\n//\n// Note that this operator<< takes a generic std::basic_ostream<Char,\n// CharTraits> type instead of the more restricted std::ostream.  If\n// we define it to take an std::ostream instead, we'll get an\n// \"ambiguous overloads\" compiler error when trying to print a type\n// Foo that supports streaming to std::basic_ostream<Char,\n// CharTraits>, as the compiler cannot tell whether\n// operator<<(std::ostream&, const T&) or\n// operator<<(std::basic_stream<Char, CharTraits>, const Foo&) is more\n// specific.\ntemplate <typename Char, typename CharTraits, typename T>\n::std::basic_ostream<Char, CharTraits>& operator<<(\n    ::std::basic_ostream<Char, CharTraits>& os, const T& x) {\n  TypeWithoutFormatter<T,\n      (internal::IsAProtocolMessage<T>::value ? kProtobuf :\n       internal::ImplicitlyConvertible<const T&, internal::BiggestInt>::value ?\n       kConvertibleToInteger : kOtherType)>::PrintValue(x, &os);\n  return os;\n}\n\n}  // namespace internal2\n}  // namespace testing\n\n// This namespace MUST NOT BE NESTED IN ::testing, or the name look-up\n// magic needed for implementing UniversalPrinter won't work.\nnamespace testing_internal {\n\n// Used to print a value that is not an STL-style container when the\n// user doesn't define PrintTo() for it.\ntemplate <typename T>\nvoid DefaultPrintNonContainerTo(const T& value, ::std::ostream* os) {\n  // With the following statement, during unqualified name lookup,\n  // testing::internal2::operator<< appears as if it was declared in\n  // the nearest enclosing namespace that contains both\n  // ::testing_internal and ::testing::internal2, i.e. the global\n  // namespace.  For more details, refer to the C++ Standard section\n  // 7.3.4-1 [namespace.udir].  This allows us to fall back onto\n  // testing::internal2::operator<< in case T doesn't come with a <<\n  // operator.\n  //\n  // We cannot write 'using ::testing::internal2::operator<<;', which\n  // gcc 3.3 fails to compile due to a compiler bug.\n  using namespace ::testing::internal2;  // NOLINT\n\n  // Assuming T is defined in namespace foo, in the next statement,\n  // the compiler will consider all of:\n  //\n  //   1. foo::operator<< (thanks to Koenig look-up),\n  //   2. ::operator<< (as the current namespace is enclosed in ::),\n  //   3. testing::internal2::operator<< (thanks to the using statement above).\n  //\n  // The operator<< whose type matches T best will be picked.\n  //\n  // We deliberately allow #2 to be a candidate, as sometimes it's\n  // impossible to define #1 (e.g. when foo is ::std, defining\n  // anything in it is undefined behavior unless you are a compiler\n  // vendor.).\n  *os << value;\n}\n\n}  // namespace testing_internal\n\nnamespace testing {\nnamespace internal {\n\n// UniversalPrinter<T>::Print(value, ostream_ptr) prints the given\n// value to the given ostream.  The caller must ensure that\n// 'ostream_ptr' is not NULL, or the behavior is undefined.\n//\n// We define UniversalPrinter as a class template (as opposed to a\n// function template), as we need to partially specialize it for\n// reference types, which cannot be done with function templates.\ntemplate <typename T>\nclass UniversalPrinter;\n\ntemplate <typename T>\nvoid UniversalPrint(const T& value, ::std::ostream* os);\n\n// Used to print an STL-style container when the user doesn't define\n// a PrintTo() for it.\ntemplate <typename C>\nvoid DefaultPrintTo(IsContainer /* dummy */,\n                    false_type /* is not a pointer */,\n                    const C& container, ::std::ostream* os) {\n  const size_t kMaxCount = 32;  // The maximum number of elements to print.\n  *os << '{';\n  size_t count = 0;\n  for (typename C::const_iterator it = container.begin();\n       it != container.end(); ++it, ++count) {\n    if (count > 0) {\n      *os << ',';\n      if (count == kMaxCount) {  // Enough has been printed.\n        *os << \" ...\";\n        break;\n      }\n    }\n    *os << ' ';\n    // We cannot call PrintTo(*it, os) here as PrintTo() doesn't\n    // handle *it being a native array.\n    internal::UniversalPrint(*it, os);\n  }\n\n  if (count > 0) {\n    *os << ' ';\n  }\n  *os << '}';\n}\n\n// Used to print a pointer that is neither a char pointer nor a member\n// pointer, when the user doesn't define PrintTo() for it.  (A member\n// variable pointer or member function pointer doesn't really point to\n// a location in the address space.  Their representation is\n// implementation-defined.  Therefore they will be printed as raw\n// bytes.)\ntemplate <typename T>\nvoid DefaultPrintTo(IsNotContainer /* dummy */,\n                    true_type /* is a pointer */,\n                    T* p, ::std::ostream* os) {\n  if (p == NULL) {\n    *os << \"NULL\";\n  } else {\n    // C++ doesn't allow casting from a function pointer to any object\n    // pointer.\n    //\n    // IsTrue() silences warnings: \"Condition is always true\",\n    // \"unreachable code\".\n    if (IsTrue(ImplicitlyConvertible<T*, const void*>::value)) {\n      // T is not a function type.  We just call << to print p,\n      // relying on ADL to pick up user-defined << for their pointer\n      // types, if any.\n      *os << p;\n    } else {\n      // T is a function type, so '*os << p' doesn't do what we want\n      // (it just prints p as bool).  We want to print p as a const\n      // void*.  However, we cannot cast it to const void* directly,\n      // even using reinterpret_cast, as earlier versions of gcc\n      // (e.g. 3.4.5) cannot compile the cast when p is a function\n      // pointer.  Casting to UInt64 first solves the problem.\n      *os << reinterpret_cast<const void*>(\n          reinterpret_cast<internal::UInt64>(p));\n    }\n  }\n}\n\n// Used to print a non-container, non-pointer value when the user\n// doesn't define PrintTo() for it.\ntemplate <typename T>\nvoid DefaultPrintTo(IsNotContainer /* dummy */,\n                    false_type /* is not a pointer */,\n                    const T& value, ::std::ostream* os) {\n  ::testing_internal::DefaultPrintNonContainerTo(value, os);\n}\n\n// Prints the given value using the << operator if it has one;\n// otherwise prints the bytes in it.  This is what\n// UniversalPrinter<T>::Print() does when PrintTo() is not specialized\n// or overloaded for type T.\n//\n// A user can override this behavior for a class type Foo by defining\n// an overload of PrintTo() in the namespace where Foo is defined.  We\n// give the user this option as sometimes defining a << operator for\n// Foo is not desirable (e.g. the coding style may prevent doing it,\n// or there is already a << operator but it doesn't do what the user\n// wants).\ntemplate <typename T>\nvoid PrintTo(const T& value, ::std::ostream* os) {\n  // DefaultPrintTo() is overloaded.  The type of its first two\n  // arguments determine which version will be picked.  If T is an\n  // STL-style container, the version for container will be called; if\n  // T is a pointer, the pointer version will be called; otherwise the\n  // generic version will be called.\n  //\n  // Note that we check for container types here, prior to we check\n  // for protocol message types in our operator<<.  The rationale is:\n  //\n  // For protocol messages, we want to give people a chance to\n  // override Google Mock's format by defining a PrintTo() or\n  // operator<<.  For STL containers, other formats can be\n  // incompatible with Google Mock's format for the container\n  // elements; therefore we check for container types here to ensure\n  // that our format is used.\n  //\n  // The second argument of DefaultPrintTo() is needed to bypass a bug\n  // in Symbian's C++ compiler that prevents it from picking the right\n  // overload between:\n  //\n  //   PrintTo(const T& x, ...);\n  //   PrintTo(T* x, ...);\n  DefaultPrintTo(IsContainerTest<T>(0), is_pointer<T>(), value, os);\n}\n\n// The following list of PrintTo() overloads tells\n// UniversalPrinter<T>::Print() how to print standard types (built-in\n// types, strings, plain arrays, and pointers).\n\n// Overloads for various char types.\nGTEST_API_ void PrintTo(unsigned char c, ::std::ostream* os);\nGTEST_API_ void PrintTo(signed char c, ::std::ostream* os);\ninline void PrintTo(char c, ::std::ostream* os) {\n  // When printing a plain char, we always treat it as unsigned.  This\n  // way, the output won't be affected by whether the compiler thinks\n  // char is signed or not.\n  PrintTo(static_cast<unsigned char>(c), os);\n}\n\n// Overloads for other simple built-in types.\ninline void PrintTo(bool x, ::std::ostream* os) {\n  *os << (x ? \"true\" : \"false\");\n}\n\n// Overload for wchar_t type.\n// Prints a wchar_t as a symbol if it is printable or as its internal\n// code otherwise and also as its decimal code (except for L'\\0').\n// The L'\\0' char is printed as \"L'\\\\0'\". The decimal code is printed\n// as signed integer when wchar_t is implemented by the compiler\n// as a signed type and is printed as an unsigned integer when wchar_t\n// is implemented as an unsigned type.\nGTEST_API_ void PrintTo(wchar_t wc, ::std::ostream* os);\n\n// Overloads for C strings.\nGTEST_API_ void PrintTo(const char* s, ::std::ostream* os);\ninline void PrintTo(char* s, ::std::ostream* os) {\n  PrintTo(ImplicitCast_<const char*>(s), os);\n}\n\n// signed/unsigned char is often used for representing binary data, so\n// we print pointers to it as void* to be safe.\ninline void PrintTo(const signed char* s, ::std::ostream* os) {\n  PrintTo(ImplicitCast_<const void*>(s), os);\n}\ninline void PrintTo(signed char* s, ::std::ostream* os) {\n  PrintTo(ImplicitCast_<const void*>(s), os);\n}\ninline void PrintTo(const unsigned char* s, ::std::ostream* os) {\n  PrintTo(ImplicitCast_<const void*>(s), os);\n}\ninline void PrintTo(unsigned char* s, ::std::ostream* os) {\n  PrintTo(ImplicitCast_<const void*>(s), os);\n}\n\n// MSVC can be configured to define wchar_t as a typedef of unsigned\n// short.  It defines _NATIVE_WCHAR_T_DEFINED when wchar_t is a native\n// type.  When wchar_t is a typedef, defining an overload for const\n// wchar_t* would cause unsigned short* be printed as a wide string,\n// possibly causing invalid memory accesses.\n#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)\n// Overloads for wide C strings\nGTEST_API_ void PrintTo(const wchar_t* s, ::std::ostream* os);\ninline void PrintTo(wchar_t* s, ::std::ostream* os) {\n  PrintTo(ImplicitCast_<const wchar_t*>(s), os);\n}\n#endif\n\n// Overload for C arrays.  Multi-dimensional arrays are printed\n// properly.\n\n// Prints the given number of elements in an array, without printing\n// the curly braces.\ntemplate <typename T>\nvoid PrintRawArrayTo(const T a[], size_t count, ::std::ostream* os) {\n  UniversalPrint(a[0], os);\n  for (size_t i = 1; i != count; i++) {\n    *os << \", \";\n    UniversalPrint(a[i], os);\n  }\n}\n\n// Overloads for ::string and ::std::string.\n#if GTEST_HAS_GLOBAL_STRING\nGTEST_API_ void PrintStringTo(const ::string&s, ::std::ostream* os);\ninline void PrintTo(const ::string& s, ::std::ostream* os) {\n  PrintStringTo(s, os);\n}\n#endif  // GTEST_HAS_GLOBAL_STRING\n\nGTEST_API_ void PrintStringTo(const ::std::string&s, ::std::ostream* os);\ninline void PrintTo(const ::std::string& s, ::std::ostream* os) {\n  PrintStringTo(s, os);\n}\n\n// Overloads for ::wstring and ::std::wstring.\n#if GTEST_HAS_GLOBAL_WSTRING\nGTEST_API_ void PrintWideStringTo(const ::wstring&s, ::std::ostream* os);\ninline void PrintTo(const ::wstring& s, ::std::ostream* os) {\n  PrintWideStringTo(s, os);\n}\n#endif  // GTEST_HAS_GLOBAL_WSTRING\n\n#if GTEST_HAS_STD_WSTRING\nGTEST_API_ void PrintWideStringTo(const ::std::wstring&s, ::std::ostream* os);\ninline void PrintTo(const ::std::wstring& s, ::std::ostream* os) {\n  PrintWideStringTo(s, os);\n}\n#endif  // GTEST_HAS_STD_WSTRING\n\n#if GTEST_HAS_TR1_TUPLE\n// Overload for ::std::tr1::tuple.  Needed for printing function arguments,\n// which are packed as tuples.\n\n// Helper function for printing a tuple.  T must be instantiated with\n// a tuple type.\ntemplate <typename T>\nvoid PrintTupleTo(const T& t, ::std::ostream* os);\n\n// Overloaded PrintTo() for tuples of various arities.  We support\n// tuples of up-to 10 fields.  The following implementation works\n// regardless of whether tr1::tuple is implemented using the\n// non-standard variadic template feature or not.\n\ninline void PrintTo(const ::std::tr1::tuple<>& t, ::std::ostream* os) {\n  PrintTupleTo(t, os);\n}\n\ntemplate <typename T1>\nvoid PrintTo(const ::std::tr1::tuple<T1>& t, ::std::ostream* os) {\n  PrintTupleTo(t, os);\n}\n\ntemplate <typename T1, typename T2>\nvoid PrintTo(const ::std::tr1::tuple<T1, T2>& t, ::std::ostream* os) {\n  PrintTupleTo(t, os);\n}\n\ntemplate <typename T1, typename T2, typename T3>\nvoid PrintTo(const ::std::tr1::tuple<T1, T2, T3>& t, ::std::ostream* os) {\n  PrintTupleTo(t, os);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4>\nvoid PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4>& t, ::std::ostream* os) {\n  PrintTupleTo(t, os);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5>\nvoid PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5>& t,\n             ::std::ostream* os) {\n  PrintTupleTo(t, os);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n          typename T6>\nvoid PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6>& t,\n             ::std::ostream* os) {\n  PrintTupleTo(t, os);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n          typename T6, typename T7>\nvoid PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7>& t,\n             ::std::ostream* os) {\n  PrintTupleTo(t, os);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n          typename T6, typename T7, typename T8>\nvoid PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8>& t,\n             ::std::ostream* os) {\n  PrintTupleTo(t, os);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n          typename T6, typename T7, typename T8, typename T9>\nvoid PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>& t,\n             ::std::ostream* os) {\n  PrintTupleTo(t, os);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n          typename T6, typename T7, typename T8, typename T9, typename T10>\nvoid PrintTo(\n    const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>& t,\n    ::std::ostream* os) {\n  PrintTupleTo(t, os);\n}\n#endif  // GTEST_HAS_TR1_TUPLE\n\n// Overload for std::pair.\ntemplate <typename T1, typename T2>\nvoid PrintTo(const ::std::pair<T1, T2>& value, ::std::ostream* os) {\n  *os << '(';\n  // We cannot use UniversalPrint(value.first, os) here, as T1 may be\n  // a reference type.  The same for printing value.second.\n  UniversalPrinter<T1>::Print(value.first, os);\n  *os << \", \";\n  UniversalPrinter<T2>::Print(value.second, os);\n  *os << ')';\n}\n\n// Implements printing a non-reference type T by letting the compiler\n// pick the right overload of PrintTo() for T.\ntemplate <typename T>\nclass UniversalPrinter {\n public:\n  // MSVC warns about adding const to a function type, so we want to\n  // disable the warning.\n#ifdef _MSC_VER\n# pragma warning(push)          // Saves the current warning state.\n# pragma warning(disable:4180)  // Temporarily disables warning 4180.\n#endif  // _MSC_VER\n\n  // Note: we deliberately don't call this PrintTo(), as that name\n  // conflicts with ::testing::internal::PrintTo in the body of the\n  // function.\n  static void Print(const T& value, ::std::ostream* os) {\n    // By default, ::testing::internal::PrintTo() is used for printing\n    // the value.\n    //\n    // Thanks to Koenig look-up, if T is a class and has its own\n    // PrintTo() function defined in its namespace, that function will\n    // be visible here.  Since it is more specific than the generic ones\n    // in ::testing::internal, it will be picked by the compiler in the\n    // following statement - exactly what we want.\n    PrintTo(value, os);\n  }\n\n#ifdef _MSC_VER\n# pragma warning(pop)           // Restores the warning state.\n#endif  // _MSC_VER\n};\n\n// UniversalPrintArray(begin, len, os) prints an array of 'len'\n// elements, starting at address 'begin'.\ntemplate <typename T>\nvoid UniversalPrintArray(const T* begin, size_t len, ::std::ostream* os) {\n  if (len == 0) {\n    *os << \"{}\";\n  } else {\n    *os << \"{ \";\n    const size_t kThreshold = 18;\n    const size_t kChunkSize = 8;\n    // If the array has more than kThreshold elements, we'll have to\n    // omit some details by printing only the first and the last\n    // kChunkSize elements.\n    // TODO(wan@google.com): let the user control the threshold using a flag.\n    if (len <= kThreshold) {\n      PrintRawArrayTo(begin, len, os);\n    } else {\n      PrintRawArrayTo(begin, kChunkSize, os);\n      *os << \", ..., \";\n      PrintRawArrayTo(begin + len - kChunkSize, kChunkSize, os);\n    }\n    *os << \" }\";\n  }\n}\n// This overload prints a (const) char array compactly.\nGTEST_API_ void UniversalPrintArray(const char* begin,\n                                    size_t len,\n                                    ::std::ostream* os);\n\n// Implements printing an array type T[N].\ntemplate <typename T, size_t N>\nclass UniversalPrinter<T[N]> {\n public:\n  // Prints the given array, omitting some elements when there are too\n  // many.\n  static void Print(const T (&a)[N], ::std::ostream* os) {\n    UniversalPrintArray(a, N, os);\n  }\n};\n\n// Implements printing a reference type T&.\ntemplate <typename T>\nclass UniversalPrinter<T&> {\n public:\n  // MSVC warns about adding const to a function type, so we want to\n  // disable the warning.\n#ifdef _MSC_VER\n# pragma warning(push)          // Saves the current warning state.\n# pragma warning(disable:4180)  // Temporarily disables warning 4180.\n#endif  // _MSC_VER\n\n  static void Print(const T& value, ::std::ostream* os) {\n    // Prints the address of the value.  We use reinterpret_cast here\n    // as static_cast doesn't compile when T is a function type.\n    *os << \"@\" << reinterpret_cast<const void*>(&value) << \" \";\n\n    // Then prints the value itself.\n    UniversalPrint(value, os);\n  }\n\n#ifdef _MSC_VER\n# pragma warning(pop)           // Restores the warning state.\n#endif  // _MSC_VER\n};\n\n// Prints a value tersely: for a reference type, the referenced value\n// (but not the address) is printed; for a (const) char pointer, the\n// NUL-terminated string (but not the pointer) is printed.\ntemplate <typename T>\nvoid UniversalTersePrint(const T& value, ::std::ostream* os) {\n  UniversalPrint(value, os);\n}\ninline void UniversalTersePrint(const char* str, ::std::ostream* os) {\n  if (str == NULL) {\n    *os << \"NULL\";\n  } else {\n    UniversalPrint(string(str), os);\n  }\n}\ninline void UniversalTersePrint(char* str, ::std::ostream* os) {\n  UniversalTersePrint(static_cast<const char*>(str), os);\n}\n\n// Prints a value using the type inferred by the compiler.  The\n// difference between this and UniversalTersePrint() is that for a\n// (const) char pointer, this prints both the pointer and the\n// NUL-terminated string.\ntemplate <typename T>\nvoid UniversalPrint(const T& value, ::std::ostream* os) {\n  UniversalPrinter<T>::Print(value, os);\n}\n\n#if GTEST_HAS_TR1_TUPLE\ntypedef ::std::vector<string> Strings;\n\n// This helper template allows PrintTo() for tuples and\n// UniversalTersePrintTupleFieldsToStrings() to be defined by\n// induction on the number of tuple fields.  The idea is that\n// TuplePrefixPrinter<N>::PrintPrefixTo(t, os) prints the first N\n// fields in tuple t, and can be defined in terms of\n// TuplePrefixPrinter<N - 1>.\n\n// The inductive case.\ntemplate <size_t N>\nstruct TuplePrefixPrinter {\n  // Prints the first N fields of a tuple.\n  template <typename Tuple>\n  static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) {\n    TuplePrefixPrinter<N - 1>::PrintPrefixTo(t, os);\n    *os << \", \";\n    UniversalPrinter<typename ::std::tr1::tuple_element<N - 1, Tuple>::type>\n        ::Print(::std::tr1::get<N - 1>(t), os);\n  }\n\n  // Tersely prints the first N fields of a tuple to a string vector,\n  // one element for each field.\n  template <typename Tuple>\n  static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) {\n    TuplePrefixPrinter<N - 1>::TersePrintPrefixToStrings(t, strings);\n    ::std::stringstream ss;\n    UniversalTersePrint(::std::tr1::get<N - 1>(t), &ss);\n    strings->push_back(ss.str());\n  }\n};\n\n// Base cases.\ntemplate <>\nstruct TuplePrefixPrinter<0> {\n  template <typename Tuple>\n  static void PrintPrefixTo(const Tuple&, ::std::ostream*) {}\n\n  template <typename Tuple>\n  static void TersePrintPrefixToStrings(const Tuple&, Strings*) {}\n};\n// We have to specialize the entire TuplePrefixPrinter<> class\n// template here, even though the definition of\n// TersePrintPrefixToStrings() is the same as the generic version, as\n// Embarcadero (formerly CodeGear, formerly Borland) C++ doesn't\n// support specializing a method template of a class template.\ntemplate <>\nstruct TuplePrefixPrinter<1> {\n  template <typename Tuple>\n  static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) {\n    UniversalPrinter<typename ::std::tr1::tuple_element<0, Tuple>::type>::\n        Print(::std::tr1::get<0>(t), os);\n  }\n\n  template <typename Tuple>\n  static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) {\n    ::std::stringstream ss;\n    UniversalTersePrint(::std::tr1::get<0>(t), &ss);\n    strings->push_back(ss.str());\n  }\n};\n\n// Helper function for printing a tuple.  T must be instantiated with\n// a tuple type.\ntemplate <typename T>\nvoid PrintTupleTo(const T& t, ::std::ostream* os) {\n  *os << \"(\";\n  TuplePrefixPrinter< ::std::tr1::tuple_size<T>::value>::\n      PrintPrefixTo(t, os);\n  *os << \")\";\n}\n\n// Prints the fields of a tuple tersely to a string vector, one\n// element for each field.  See the comment before\n// UniversalTersePrint() for how we define \"tersely\".\ntemplate <typename Tuple>\nStrings UniversalTersePrintTupleFieldsToStrings(const Tuple& value) {\n  Strings result;\n  TuplePrefixPrinter< ::std::tr1::tuple_size<Tuple>::value>::\n      TersePrintPrefixToStrings(value, &result);\n  return result;\n}\n#endif  // GTEST_HAS_TR1_TUPLE\n\n}  // namespace internal\n\ntemplate <typename T>\n::std::string PrintToString(const T& value) {\n  ::std::stringstream ss;\n  internal::UniversalTersePrint(value, &ss);\n  return ss.str();\n}\n\n}  // namespace testing\n\n#endif  // GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_\n\n#if GTEST_HAS_PARAM_TEST\n\nnamespace testing {\nnamespace internal {\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// Outputs a message explaining invalid registration of different\n// fixture class for the same test case. This may happen when\n// TEST_P macro is used to define two tests with the same name\n// but in different namespaces.\nGTEST_API_ void ReportInvalidTestCaseType(const char* test_case_name,\n                                          const char* file, int line);\n\ntemplate <typename> class ParamGeneratorInterface;\ntemplate <typename> class ParamGenerator;\n\n// Interface for iterating over elements provided by an implementation\n// of ParamGeneratorInterface<T>.\ntemplate <typename T>\nclass ParamIteratorInterface {\n public:\n  virtual ~ParamIteratorInterface() {}\n  // A pointer to the base generator instance.\n  // Used only for the purposes of iterator comparison\n  // to make sure that two iterators belong to the same generator.\n  virtual const ParamGeneratorInterface<T>* BaseGenerator() const = 0;\n  // Advances iterator to point to the next element\n  // provided by the generator. The caller is responsible\n  // for not calling Advance() on an iterator equal to\n  // BaseGenerator()->End().\n  virtual void Advance() = 0;\n  // Clones the iterator object. Used for implementing copy semantics\n  // of ParamIterator<T>.\n  virtual ParamIteratorInterface* Clone() const = 0;\n  // Dereferences the current iterator and provides (read-only) access\n  // to the pointed value. It is the caller's responsibility not to call\n  // Current() on an iterator equal to BaseGenerator()->End().\n  // Used for implementing ParamGenerator<T>::operator*().\n  virtual const T* Current() const = 0;\n  // Determines whether the given iterator and other point to the same\n  // element in the sequence generated by the generator.\n  // Used for implementing ParamGenerator<T>::operator==().\n  virtual bool Equals(const ParamIteratorInterface& other) const = 0;\n};\n\n// Class iterating over elements provided by an implementation of\n// ParamGeneratorInterface<T>. It wraps ParamIteratorInterface<T>\n// and implements the const forward iterator concept.\ntemplate <typename T>\nclass ParamIterator {\n public:\n  typedef T value_type;\n  typedef const T& reference;\n  typedef ptrdiff_t difference_type;\n\n  // ParamIterator assumes ownership of the impl_ pointer.\n  ParamIterator(const ParamIterator& other) : impl_(other.impl_->Clone()) {}\n  ParamIterator& operator=(const ParamIterator& other) {\n    if (this != &other)\n      impl_.reset(other.impl_->Clone());\n    return *this;\n  }\n\n  const T& operator*() const { return *impl_->Current(); }\n  const T* operator->() const { return impl_->Current(); }\n  // Prefix version of operator++.\n  ParamIterator& operator++() {\n    impl_->Advance();\n    return *this;\n  }\n  // Postfix version of operator++.\n  ParamIterator operator++(int /*unused*/) {\n    ParamIteratorInterface<T>* clone = impl_->Clone();\n    impl_->Advance();\n    return ParamIterator(clone);\n  }\n  bool operator==(const ParamIterator& other) const {\n    return impl_.get() == other.impl_.get() || impl_->Equals(*other.impl_);\n  }\n  bool operator!=(const ParamIterator& other) const {\n    return !(*this == other);\n  }\n\n private:\n  friend class ParamGenerator<T>;\n  explicit ParamIterator(ParamIteratorInterface<T>* impl) : impl_(impl) {}\n  scoped_ptr<ParamIteratorInterface<T> > impl_;\n};\n\n// ParamGeneratorInterface<T> is the binary interface to access generators\n// defined in other translation units.\ntemplate <typename T>\nclass ParamGeneratorInterface {\n public:\n  typedef T ParamType;\n\n  virtual ~ParamGeneratorInterface() {}\n\n  // Generator interface definition\n  virtual ParamIteratorInterface<T>* Begin() const = 0;\n  virtual ParamIteratorInterface<T>* End() const = 0;\n};\n\n// Wraps ParamGeneratorInterface<T> and provides general generator syntax\n// compatible with the STL Container concept.\n// This class implements copy initialization semantics and the contained\n// ParamGeneratorInterface<T> instance is shared among all copies\n// of the original object. This is possible because that instance is immutable.\ntemplate<typename T>\nclass ParamGenerator {\n public:\n  typedef ParamIterator<T> iterator;\n\n  explicit ParamGenerator(ParamGeneratorInterface<T>* impl) : impl_(impl) {}\n  ParamGenerator(const ParamGenerator& other) : impl_(other.impl_) {}\n\n  ParamGenerator& operator=(const ParamGenerator& other) {\n    impl_ = other.impl_;\n    return *this;\n  }\n\n  iterator begin() const { return iterator(impl_->Begin()); }\n  iterator end() const { return iterator(impl_->End()); }\n\n private:\n  linked_ptr<const ParamGeneratorInterface<T> > impl_;\n};\n\n// Generates values from a range of two comparable values. Can be used to\n// generate sequences of user-defined types that implement operator+() and\n// operator<().\n// This class is used in the Range() function.\ntemplate <typename T, typename IncrementT>\nclass RangeGenerator : public ParamGeneratorInterface<T> {\n public:\n  RangeGenerator(T begin, T end, IncrementT step)\n      : begin_(begin), end_(end),\n        step_(step), end_index_(CalculateEndIndex(begin, end, step)) {}\n  virtual ~RangeGenerator() {}\n\n  virtual ParamIteratorInterface<T>* Begin() const {\n    return new Iterator(this, begin_, 0, step_);\n  }\n  virtual ParamIteratorInterface<T>* End() const {\n    return new Iterator(this, end_, end_index_, step_);\n  }\n\n private:\n  class Iterator : public ParamIteratorInterface<T> {\n   public:\n    Iterator(const ParamGeneratorInterface<T>* base, T value, int index,\n             IncrementT step)\n        : base_(base), value_(value), index_(index), step_(step) {}\n    virtual ~Iterator() {}\n\n    virtual const ParamGeneratorInterface<T>* BaseGenerator() const {\n      return base_;\n    }\n    virtual void Advance() {\n      value_ = value_ + step_;\n      index_++;\n    }\n    virtual ParamIteratorInterface<T>* Clone() const {\n      return new Iterator(*this);\n    }\n    virtual const T* Current() const { return &value_; }\n    virtual bool Equals(const ParamIteratorInterface<T>& other) const {\n      // Having the same base generator guarantees that the other\n      // iterator is of the same type and we can downcast.\n      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())\n          << \"The program attempted to compare iterators \"\n          << \"from different generators.\" << std::endl;\n      const int other_index =\n          CheckedDowncastToActualType<const Iterator>(&other)->index_;\n      return index_ == other_index;\n    }\n\n   private:\n    Iterator(const Iterator& other)\n        : ParamIteratorInterface<T>(),\n          base_(other.base_), value_(other.value_), index_(other.index_),\n          step_(other.step_) {}\n\n    // No implementation - assignment is unsupported.\n    void operator=(const Iterator& other);\n\n    const ParamGeneratorInterface<T>* const base_;\n    T value_;\n    int index_;\n    const IncrementT step_;\n  };  // class RangeGenerator::Iterator\n\n  static int CalculateEndIndex(const T& begin,\n                               const T& end,\n                               const IncrementT& step) {\n    int end_index = 0;\n    for (T i = begin; i < end; i = i + step)\n      end_index++;\n    return end_index;\n  }\n\n  // No implementation - assignment is unsupported.\n  void operator=(const RangeGenerator& other);\n\n  const T begin_;\n  const T end_;\n  const IncrementT step_;\n  // The index for the end() iterator. All the elements in the generated\n  // sequence are indexed (0-based) to aid iterator comparison.\n  const int end_index_;\n};  // class RangeGenerator\n\n\n// Generates values from a pair of STL-style iterators. Used in the\n// ValuesIn() function. The elements are copied from the source range\n// since the source can be located on the stack, and the generator\n// is likely to persist beyond that stack frame.\ntemplate <typename T>\nclass ValuesInIteratorRangeGenerator : public ParamGeneratorInterface<T> {\n public:\n  template <typename ForwardIterator>\n  ValuesInIteratorRangeGenerator(ForwardIterator begin, ForwardIterator end)\n      : container_(begin, end) {}\n  virtual ~ValuesInIteratorRangeGenerator() {}\n\n  virtual ParamIteratorInterface<T>* Begin() const {\n    return new Iterator(this, container_.begin());\n  }\n  virtual ParamIteratorInterface<T>* End() const {\n    return new Iterator(this, container_.end());\n  }\n\n private:\n  typedef typename ::std::vector<T> ContainerType;\n\n  class Iterator : public ParamIteratorInterface<T> {\n   public:\n    Iterator(const ParamGeneratorInterface<T>* base,\n             typename ContainerType::const_iterator iterator)\n        : base_(base), iterator_(iterator) {}\n    virtual ~Iterator() {}\n\n    virtual const ParamGeneratorInterface<T>* BaseGenerator() const {\n      return base_;\n    }\n    virtual void Advance() {\n      ++iterator_;\n      value_.reset();\n    }\n    virtual ParamIteratorInterface<T>* Clone() const {\n      return new Iterator(*this);\n    }\n    // We need to use cached value referenced by iterator_ because *iterator_\n    // can return a temporary object (and of type other then T), so just\n    // having \"return &*iterator_;\" doesn't work.\n    // value_ is updated here and not in Advance() because Advance()\n    // can advance iterator_ beyond the end of the range, and we cannot\n    // detect that fact. The client code, on the other hand, is\n    // responsible for not calling Current() on an out-of-range iterator.\n    virtual const T* Current() const {\n      if (value_.get() == NULL)\n        value_.reset(new T(*iterator_));\n      return value_.get();\n    }\n    virtual bool Equals(const ParamIteratorInterface<T>& other) const {\n      // Having the same base generator guarantees that the other\n      // iterator is of the same type and we can downcast.\n      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())\n          << \"The program attempted to compare iterators \"\n          << \"from different generators.\" << std::endl;\n      return iterator_ ==\n          CheckedDowncastToActualType<const Iterator>(&other)->iterator_;\n    }\n\n   private:\n    Iterator(const Iterator& other)\n          // The explicit constructor call suppresses a false warning\n          // emitted by gcc when supplied with the -Wextra option.\n        : ParamIteratorInterface<T>(),\n          base_(other.base_),\n          iterator_(other.iterator_) {}\n\n    const ParamGeneratorInterface<T>* const base_;\n    typename ContainerType::const_iterator iterator_;\n    // A cached value of *iterator_. We keep it here to allow access by\n    // pointer in the wrapping iterator's operator->().\n    // value_ needs to be mutable to be accessed in Current().\n    // Use of scoped_ptr helps manage cached value's lifetime,\n    // which is bound by the lifespan of the iterator itself.\n    mutable scoped_ptr<const T> value_;\n  };  // class ValuesInIteratorRangeGenerator::Iterator\n\n  // No implementation - assignment is unsupported.\n  void operator=(const ValuesInIteratorRangeGenerator& other);\n\n  const ContainerType container_;\n};  // class ValuesInIteratorRangeGenerator\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// Stores a parameter value and later creates tests parameterized with that\n// value.\ntemplate <class TestClass>\nclass ParameterizedTestFactory : public TestFactoryBase {\n public:\n  typedef typename TestClass::ParamType ParamType;\n  explicit ParameterizedTestFactory(ParamType parameter) :\n      parameter_(parameter) {}\n  virtual Test* CreateTest() {\n    TestClass::SetParam(&parameter_);\n    return new TestClass();\n  }\n\n private:\n  const ParamType parameter_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestFactory);\n};\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// TestMetaFactoryBase is a base class for meta-factories that create\n// test factories for passing into MakeAndRegisterTestInfo function.\ntemplate <class ParamType>\nclass TestMetaFactoryBase {\n public:\n  virtual ~TestMetaFactoryBase() {}\n\n  virtual TestFactoryBase* CreateTestFactory(ParamType parameter) = 0;\n};\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// TestMetaFactory creates test factories for passing into\n// MakeAndRegisterTestInfo function. Since MakeAndRegisterTestInfo receives\n// ownership of test factory pointer, same factory object cannot be passed\n// into that method twice. But ParameterizedTestCaseInfo is going to call\n// it for each Test/Parameter value combination. Thus it needs meta factory\n// creator class.\ntemplate <class TestCase>\nclass TestMetaFactory\n    : public TestMetaFactoryBase<typename TestCase::ParamType> {\n public:\n  typedef typename TestCase::ParamType ParamType;\n\n  TestMetaFactory() {}\n\n  virtual TestFactoryBase* CreateTestFactory(ParamType parameter) {\n    return new ParameterizedTestFactory<TestCase>(parameter);\n  }\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestMetaFactory);\n};\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// ParameterizedTestCaseInfoBase is a generic interface\n// to ParameterizedTestCaseInfo classes. ParameterizedTestCaseInfoBase\n// accumulates test information provided by TEST_P macro invocations\n// and generators provided by INSTANTIATE_TEST_CASE_P macro invocations\n// and uses that information to register all resulting test instances\n// in RegisterTests method. The ParameterizeTestCaseRegistry class holds\n// a collection of pointers to the ParameterizedTestCaseInfo objects\n// and calls RegisterTests() on each of them when asked.\nclass ParameterizedTestCaseInfoBase {\n public:\n  virtual ~ParameterizedTestCaseInfoBase() {}\n\n  // Base part of test case name for display purposes.\n  virtual const string& GetTestCaseName() const = 0;\n  // Test case id to verify identity.\n  virtual TypeId GetTestCaseTypeId() const = 0;\n  // UnitTest class invokes this method to register tests in this\n  // test case right before running them in RUN_ALL_TESTS macro.\n  // This method should not be called more then once on any single\n  // instance of a ParameterizedTestCaseInfoBase derived class.\n  virtual void RegisterTests() = 0;\n\n protected:\n  ParameterizedTestCaseInfoBase() {}\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfoBase);\n};\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// ParameterizedTestCaseInfo accumulates tests obtained from TEST_P\n// macro invocations for a particular test case and generators\n// obtained from INSTANTIATE_TEST_CASE_P macro invocations for that\n// test case. It registers tests with all values generated by all\n// generators when asked.\ntemplate <class TestCase>\nclass ParameterizedTestCaseInfo : public ParameterizedTestCaseInfoBase {\n public:\n  // ParamType and GeneratorCreationFunc are private types but are required\n  // for declarations of public methods AddTestPattern() and\n  // AddTestCaseInstantiation().\n  typedef typename TestCase::ParamType ParamType;\n  // A function that returns an instance of appropriate generator type.\n  typedef ParamGenerator<ParamType>(GeneratorCreationFunc)();\n\n  explicit ParameterizedTestCaseInfo(const char* name)\n      : test_case_name_(name) {}\n\n  // Test case base name for display purposes.\n  virtual const string& GetTestCaseName() const { return test_case_name_; }\n  // Test case id to verify identity.\n  virtual TypeId GetTestCaseTypeId() const { return GetTypeId<TestCase>(); }\n  // TEST_P macro uses AddTestPattern() to record information\n  // about a single test in a LocalTestInfo structure.\n  // test_case_name is the base name of the test case (without invocation\n  // prefix). test_base_name is the name of an individual test without\n  // parameter index. For the test SequenceA/FooTest.DoBar/1 FooTest is\n  // test case base name and DoBar is test base name.\n  void AddTestPattern(const char* test_case_name,\n                      const char* test_base_name,\n                      TestMetaFactoryBase<ParamType>* meta_factory) {\n    tests_.push_back(linked_ptr<TestInfo>(new TestInfo(test_case_name,\n                                                       test_base_name,\n                                                       meta_factory)));\n  }\n  // INSTANTIATE_TEST_CASE_P macro uses AddGenerator() to record information\n  // about a generator.\n  int AddTestCaseInstantiation(const string& instantiation_name,\n                               GeneratorCreationFunc* func,\n                               const char* /* file */,\n                               int /* line */) {\n    instantiations_.push_back(::std::make_pair(instantiation_name, func));\n    return 0;  // Return value used only to run this method in namespace scope.\n  }\n  // UnitTest class invokes this method to register tests in this test case\n  // test cases right before running tests in RUN_ALL_TESTS macro.\n  // This method should not be called more then once on any single\n  // instance of a ParameterizedTestCaseInfoBase derived class.\n  // UnitTest has a guard to prevent from calling this method more then once.\n  virtual void RegisterTests() {\n    for (typename TestInfoContainer::iterator test_it = tests_.begin();\n         test_it != tests_.end(); ++test_it) {\n      linked_ptr<TestInfo> test_info = *test_it;\n      for (typename InstantiationContainer::iterator gen_it =\n               instantiations_.begin(); gen_it != instantiations_.end();\n               ++gen_it) {\n        const string& instantiation_name = gen_it->first;\n        ParamGenerator<ParamType> generator((*gen_it->second)());\n\n        Message test_case_name_stream;\n        if ( !instantiation_name.empty() )\n          test_case_name_stream << instantiation_name << \"/\";\n        test_case_name_stream << test_info->test_case_base_name;\n\n        int i = 0;\n        for (typename ParamGenerator<ParamType>::iterator param_it =\n                 generator.begin();\n             param_it != generator.end(); ++param_it, ++i) {\n          Message test_name_stream;\n          test_name_stream << test_info->test_base_name << \"/\" << i;\n          MakeAndRegisterTestInfo(\n              test_case_name_stream.GetString().c_str(),\n              test_name_stream.GetString().c_str(),\n              NULL,  // No type parameter.\n              PrintToString(*param_it).c_str(),\n              GetTestCaseTypeId(),\n              TestCase::SetUpTestCase,\n              TestCase::TearDownTestCase,\n              test_info->test_meta_factory->CreateTestFactory(*param_it));\n        }  // for param_it\n      }  // for gen_it\n    }  // for test_it\n  }  // RegisterTests\n\n private:\n  // LocalTestInfo structure keeps information about a single test registered\n  // with TEST_P macro.\n  struct TestInfo {\n    TestInfo(const char* a_test_case_base_name,\n             const char* a_test_base_name,\n             TestMetaFactoryBase<ParamType>* a_test_meta_factory) :\n        test_case_base_name(a_test_case_base_name),\n        test_base_name(a_test_base_name),\n        test_meta_factory(a_test_meta_factory) {}\n\n    const string test_case_base_name;\n    const string test_base_name;\n    const scoped_ptr<TestMetaFactoryBase<ParamType> > test_meta_factory;\n  };\n  typedef ::std::vector<linked_ptr<TestInfo> > TestInfoContainer;\n  // Keeps pairs of <Instantiation name, Sequence generator creation function>\n  // received from INSTANTIATE_TEST_CASE_P macros.\n  typedef ::std::vector<std::pair<string, GeneratorCreationFunc*> >\n      InstantiationContainer;\n\n  const string test_case_name_;\n  TestInfoContainer tests_;\n  InstantiationContainer instantiations_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfo);\n};  // class ParameterizedTestCaseInfo\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// ParameterizedTestCaseRegistry contains a map of ParameterizedTestCaseInfoBase\n// classes accessed by test case names. TEST_P and INSTANTIATE_TEST_CASE_P\n// macros use it to locate their corresponding ParameterizedTestCaseInfo\n// descriptors.\nclass ParameterizedTestCaseRegistry {\n public:\n  ParameterizedTestCaseRegistry() {}\n  ~ParameterizedTestCaseRegistry() {\n    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();\n         it != test_case_infos_.end(); ++it) {\n      delete *it;\n    }\n  }\n\n  // Looks up or creates and returns a structure containing information about\n  // tests and instantiations of a particular test case.\n  template <class TestCase>\n  ParameterizedTestCaseInfo<TestCase>* GetTestCasePatternHolder(\n      const char* test_case_name,\n      const char* file,\n      int line) {\n    ParameterizedTestCaseInfo<TestCase>* typed_test_info = NULL;\n    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();\n         it != test_case_infos_.end(); ++it) {\n      if ((*it)->GetTestCaseName() == test_case_name) {\n        if ((*it)->GetTestCaseTypeId() != GetTypeId<TestCase>()) {\n          // Complain about incorrect usage of Google Test facilities\n          // and terminate the program since we cannot guaranty correct\n          // test case setup and tear-down in this case.\n          ReportInvalidTestCaseType(test_case_name,  file, line);\n          posix::Abort();\n        } else {\n          // At this point we are sure that the object we found is of the same\n          // type we are looking for, so we downcast it to that type\n          // without further checks.\n          typed_test_info = CheckedDowncastToActualType<\n              ParameterizedTestCaseInfo<TestCase> >(*it);\n        }\n        break;\n      }\n    }\n    if (typed_test_info == NULL) {\n      typed_test_info = new ParameterizedTestCaseInfo<TestCase>(test_case_name);\n      test_case_infos_.push_back(typed_test_info);\n    }\n    return typed_test_info;\n  }\n  void RegisterTests() {\n    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();\n         it != test_case_infos_.end(); ++it) {\n      (*it)->RegisterTests();\n    }\n  }\n\n private:\n  typedef ::std::vector<ParameterizedTestCaseInfoBase*> TestCaseInfoContainer;\n\n  TestCaseInfoContainer test_case_infos_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseRegistry);\n};\n\n}  // namespace internal\n}  // namespace testing\n\n#endif  //  GTEST_HAS_PARAM_TEST\n\n#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_\n// This file was GENERATED by command:\n//     pump.py gtest-param-util-generated.h.pump\n// DO NOT EDIT BY HAND!!!\n\n// Copyright 2008 Google Inc.\n// All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: vladl@google.com (Vlad Losev)\n\n// Type and function utilities for implementing parameterized tests.\n// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!\n//\n// Currently Google Test supports at most 50 arguments in Values,\n// and at most 10 arguments in Combine. Please contact\n// googletestframework@googlegroups.com if you need more.\n// Please note that the number of arguments to Combine is limited\n// by the maximum arity of the implementation of tr1::tuple which is\n// currently set at 10.\n\n#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_\n#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_\n\n// scripts/fuse_gtest.py depends on gtest's own header being #included\n// *unconditionally*.  Therefore these #includes cannot be moved\n// inside #if GTEST_HAS_PARAM_TEST.\n\n#if GTEST_HAS_PARAM_TEST\n\nnamespace testing {\n\n// Forward declarations of ValuesIn(), which is implemented in\n// include/gtest/gtest-param-test.h.\ntemplate <typename ForwardIterator>\ninternal::ParamGenerator<\n  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>\nValuesIn(ForwardIterator begin, ForwardIterator end);\n\ntemplate <typename T, size_t N>\ninternal::ParamGenerator<T> ValuesIn(const T (&array)[N]);\n\ntemplate <class Container>\ninternal::ParamGenerator<typename Container::value_type> ValuesIn(\n    const Container& container);\n\nnamespace internal {\n\n// Used in the Values() function to provide polymorphic capabilities.\ntemplate <typename T1>\nclass ValueArray1 {\n public:\n  explicit ValueArray1(T1 v1) : v1_(v1) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const { return ValuesIn(&v1_, &v1_ + 1); }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray1& other);\n\n  const T1 v1_;\n};\n\ntemplate <typename T1, typename T2>\nclass ValueArray2 {\n public:\n  ValueArray2(T1 v1, T2 v2) : v1_(v1), v2_(v2) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray2& other);\n\n  const T1 v1_;\n  const T2 v2_;\n};\n\ntemplate <typename T1, typename T2, typename T3>\nclass ValueArray3 {\n public:\n  ValueArray3(T1 v1, T2 v2, T3 v3) : v1_(v1), v2_(v2), v3_(v3) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray3& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4>\nclass ValueArray4 {\n public:\n  ValueArray4(T1 v1, T2 v2, T3 v3, T4 v4) : v1_(v1), v2_(v2), v3_(v3),\n      v4_(v4) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray4& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5>\nclass ValueArray5 {\n public:\n  ValueArray5(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) : v1_(v1), v2_(v2), v3_(v3),\n      v4_(v4), v5_(v5) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray5& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6>\nclass ValueArray6 {\n public:\n  ValueArray6(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6) : v1_(v1), v2_(v2),\n      v3_(v3), v4_(v4), v5_(v5), v6_(v6) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray6& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7>\nclass ValueArray7 {\n public:\n  ValueArray7(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7) : v1_(v1),\n      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray7& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8>\nclass ValueArray8 {\n public:\n  ValueArray8(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,\n      T8 v8) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),\n      v8_(v8) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray8& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9>\nclass ValueArray9 {\n public:\n  ValueArray9(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,\n      T9 v9) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),\n      v8_(v8), v9_(v9) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray9& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10>\nclass ValueArray10 {\n public:\n  ValueArray10(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),\n      v8_(v8), v9_(v9), v10_(v10) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray10& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11>\nclass ValueArray11 {\n public:\n  ValueArray11(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),\n      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray11& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12>\nclass ValueArray12 {\n public:\n  ValueArray12(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),\n      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray12& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13>\nclass ValueArray13 {\n public:\n  ValueArray13(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),\n      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),\n      v12_(v12), v13_(v13) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray13& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14>\nclass ValueArray14 {\n public:\n  ValueArray14(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) : v1_(v1), v2_(v2), v3_(v3),\n      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),\n      v11_(v11), v12_(v12), v13_(v13), v14_(v14) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray14& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15>\nclass ValueArray15 {\n public:\n  ValueArray15(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) : v1_(v1), v2_(v2),\n      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),\n      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray15& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16>\nclass ValueArray16 {\n public:\n  ValueArray16(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16) : v1_(v1),\n      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),\n      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),\n      v16_(v16) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray16& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17>\nclass ValueArray17 {\n public:\n  ValueArray17(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,\n      T17 v17) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),\n      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),\n      v15_(v15), v16_(v16), v17_(v17) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray17& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18>\nclass ValueArray18 {\n public:\n  ValueArray18(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),\n      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),\n      v15_(v15), v16_(v16), v17_(v17), v18_(v18) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray18& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19>\nclass ValueArray19 {\n public:\n  ValueArray19(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),\n      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),\n      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray19& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20>\nclass ValueArray20 {\n public:\n  ValueArray20(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),\n      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),\n      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),\n      v19_(v19), v20_(v20) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray20& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21>\nclass ValueArray21 {\n public:\n  ValueArray21(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),\n      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),\n      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),\n      v18_(v18), v19_(v19), v20_(v20), v21_(v21) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray21& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22>\nclass ValueArray22 {\n public:\n  ValueArray22(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22) : v1_(v1), v2_(v2), v3_(v3),\n      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),\n      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),\n      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray22& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23>\nclass ValueArray23 {\n public:\n  ValueArray23(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23) : v1_(v1), v2_(v2),\n      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),\n      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),\n      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),\n      v23_(v23) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_,\n        v23_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray23& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24>\nclass ValueArray24 {\n public:\n  ValueArray24(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24) : v1_(v1),\n      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),\n      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),\n      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),\n      v22_(v22), v23_(v23), v24_(v24) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray24& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25>\nclass ValueArray25 {\n public:\n  ValueArray25(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,\n      T25 v25) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),\n      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),\n      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),\n      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray25& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26>\nclass ValueArray26 {\n public:\n  ValueArray26(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),\n      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),\n      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),\n      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray26& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27>\nclass ValueArray27 {\n public:\n  ValueArray27(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),\n      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),\n      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),\n      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),\n      v26_(v26), v27_(v27) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray27& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28>\nclass ValueArray28 {\n public:\n  ValueArray28(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),\n      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),\n      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),\n      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),\n      v25_(v25), v26_(v26), v27_(v27), v28_(v28) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_, v28_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray28& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29>\nclass ValueArray29 {\n public:\n  ValueArray29(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),\n      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),\n      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),\n      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),\n      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_, v28_, v29_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray29& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30>\nclass ValueArray30 {\n public:\n  ValueArray30(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) : v1_(v1), v2_(v2), v3_(v3),\n      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),\n      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),\n      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),\n      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),\n      v29_(v29), v30_(v30) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_, v28_, v29_, v30_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray30& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31>\nclass ValueArray31 {\n public:\n  ValueArray31(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) : v1_(v1), v2_(v2),\n      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),\n      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),\n      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),\n      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),\n      v29_(v29), v30_(v30), v31_(v31) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray31& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32>\nclass ValueArray32 {\n public:\n  ValueArray32(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32) : v1_(v1),\n      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),\n      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),\n      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),\n      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),\n      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray32& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33>\nclass ValueArray33 {\n public:\n  ValueArray33(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,\n      T33 v33) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),\n      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),\n      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),\n      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),\n      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),\n      v33_(v33) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray33& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34>\nclass ValueArray34 {\n public:\n  ValueArray34(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),\n      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),\n      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),\n      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),\n      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),\n      v33_(v33), v34_(v34) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray34& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35>\nclass ValueArray35 {\n public:\n  ValueArray35(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),\n      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),\n      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),\n      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),\n      v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),\n      v32_(v32), v33_(v33), v34_(v34), v35_(v35) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_,\n        v35_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray35& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36>\nclass ValueArray36 {\n public:\n  ValueArray36(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35, T36 v36) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),\n      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),\n      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),\n      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),\n      v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),\n      v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,\n        v36_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray36& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n  const T36 v36_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37>\nclass ValueArray37 {\n public:\n  ValueArray37(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35, T36 v36, T37 v37) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),\n      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),\n      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),\n      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),\n      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),\n      v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),\n      v36_(v36), v37_(v37) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,\n        v36_, v37_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray37& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n  const T36 v36_;\n  const T37 v37_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38>\nclass ValueArray38 {\n public:\n  ValueArray38(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38) : v1_(v1), v2_(v2), v3_(v3),\n      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),\n      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),\n      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),\n      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),\n      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),\n      v35_(v35), v36_(v36), v37_(v37), v38_(v38) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,\n        v36_, v37_, v38_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray38& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n  const T36 v36_;\n  const T37 v37_;\n  const T38 v38_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39>\nclass ValueArray39 {\n public:\n  ValueArray39(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39) : v1_(v1), v2_(v2),\n      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),\n      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),\n      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),\n      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),\n      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),\n      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,\n        v36_, v37_, v38_, v39_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray39& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n  const T36 v36_;\n  const T37 v37_;\n  const T38 v38_;\n  const T39 v39_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40>\nclass ValueArray40 {\n public:\n  ValueArray40(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) : v1_(v1),\n      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),\n      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),\n      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),\n      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),\n      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),\n      v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),\n      v40_(v40) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,\n        v36_, v37_, v38_, v39_, v40_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray40& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n  const T36 v36_;\n  const T37 v37_;\n  const T38 v38_;\n  const T39 v39_;\n  const T40 v40_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41>\nclass ValueArray41 {\n public:\n  ValueArray41(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,\n      T41 v41) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),\n      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),\n      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),\n      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),\n      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),\n      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),\n      v39_(v39), v40_(v40), v41_(v41) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,\n        v36_, v37_, v38_, v39_, v40_, v41_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray41& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n  const T36 v36_;\n  const T37 v37_;\n  const T38 v38_;\n  const T39 v39_;\n  const T40 v40_;\n  const T41 v41_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42>\nclass ValueArray42 {\n public:\n  ValueArray42(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,\n      T42 v42) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),\n      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),\n      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),\n      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),\n      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),\n      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),\n      v39_(v39), v40_(v40), v41_(v41), v42_(v42) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,\n        v36_, v37_, v38_, v39_, v40_, v41_, v42_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray42& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n  const T36 v36_;\n  const T37 v37_;\n  const T38 v38_;\n  const T39 v39_;\n  const T40 v40_;\n  const T41 v41_;\n  const T42 v42_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43>\nclass ValueArray43 {\n public:\n  ValueArray43(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,\n      T42 v42, T43 v43) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),\n      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),\n      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),\n      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),\n      v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),\n      v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37),\n      v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,\n        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray43& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n  const T36 v36_;\n  const T37 v37_;\n  const T38 v38_;\n  const T39 v39_;\n  const T40 v40_;\n  const T41 v41_;\n  const T42 v42_;\n  const T43 v43_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44>\nclass ValueArray44 {\n public:\n  ValueArray44(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,\n      T42 v42, T43 v43, T44 v44) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),\n      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),\n      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),\n      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),\n      v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),\n      v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36),\n      v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42),\n      v43_(v43), v44_(v44) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,\n        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray44& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n  const T36 v36_;\n  const T37 v37_;\n  const T38 v38_;\n  const T39 v39_;\n  const T40 v40_;\n  const T41 v41_;\n  const T42 v42_;\n  const T43 v43_;\n  const T44 v44_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45>\nclass ValueArray45 {\n public:\n  ValueArray45(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,\n      T42 v42, T43 v43, T44 v44, T45 v45) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),\n      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),\n      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),\n      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),\n      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),\n      v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),\n      v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41),\n      v42_(v42), v43_(v43), v44_(v44), v45_(v45) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,\n        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray45& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n  const T36 v36_;\n  const T37 v37_;\n  const T38 v38_;\n  const T39 v39_;\n  const T40 v40_;\n  const T41 v41_;\n  const T42 v42_;\n  const T43 v43_;\n  const T44 v44_;\n  const T45 v45_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46>\nclass ValueArray46 {\n public:\n  ValueArray46(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,\n      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) : v1_(v1), v2_(v2), v3_(v3),\n      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),\n      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),\n      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),\n      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),\n      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),\n      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),\n      v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,\n        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray46& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n  const T36 v36_;\n  const T37 v37_;\n  const T38 v38_;\n  const T39 v39_;\n  const T40 v40_;\n  const T41 v41_;\n  const T42 v42_;\n  const T43 v43_;\n  const T44 v44_;\n  const T45 v45_;\n  const T46 v46_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47>\nclass ValueArray47 {\n public:\n  ValueArray47(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,\n      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) : v1_(v1), v2_(v2),\n      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),\n      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),\n      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),\n      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),\n      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),\n      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),\n      v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46),\n      v47_(v47) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,\n        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_,\n        v47_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray47& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n  const T36 v36_;\n  const T37 v37_;\n  const T38 v38_;\n  const T39 v39_;\n  const T40 v40_;\n  const T41 v41_;\n  const T42 v42_;\n  const T43 v43_;\n  const T44 v44_;\n  const T45 v45_;\n  const T46 v46_;\n  const T47 v47_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47, typename T48>\nclass ValueArray48 {\n public:\n  ValueArray48(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,\n      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48) : v1_(v1),\n      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),\n      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),\n      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),\n      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),\n      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),\n      v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),\n      v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45),\n      v46_(v46), v47_(v47), v48_(v48) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,\n        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_,\n        v48_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray48& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n  const T36 v36_;\n  const T37 v37_;\n  const T38 v38_;\n  const T39 v39_;\n  const T40 v40_;\n  const T41 v41_;\n  const T42 v42_;\n  const T43 v43_;\n  const T44 v44_;\n  const T45 v45_;\n  const T46 v46_;\n  const T47 v47_;\n  const T48 v48_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47, typename T48, typename T49>\nclass ValueArray49 {\n public:\n  ValueArray49(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,\n      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48,\n      T49 v49) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),\n      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),\n      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),\n      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),\n      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),\n      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),\n      v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),\n      v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,\n        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_,\n        v48_, v49_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray49& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n  const T36 v36_;\n  const T37 v37_;\n  const T38 v38_;\n  const T39 v39_;\n  const T40 v40_;\n  const T41 v41_;\n  const T42 v42_;\n  const T43 v43_;\n  const T44 v44_;\n  const T45 v45_;\n  const T46 v46_;\n  const T47 v47_;\n  const T48 v48_;\n  const T49 v49_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47, typename T48, typename T49, typename T50>\nclass ValueArray50 {\n public:\n  ValueArray50(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,\n      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49,\n      T50 v50) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),\n      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),\n      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),\n      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),\n      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),\n      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),\n      v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),\n      v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49), v50_(v50) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,\n        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_,\n        v48_, v49_, v50_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray50& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n  const T36 v36_;\n  const T37 v37_;\n  const T38 v38_;\n  const T39 v39_;\n  const T40 v40_;\n  const T41 v41_;\n  const T42 v42_;\n  const T43 v43_;\n  const T44 v44_;\n  const T45 v45_;\n  const T46 v46_;\n  const T47 v47_;\n  const T48 v48_;\n  const T49 v49_;\n  const T50 v50_;\n};\n\n# if GTEST_HAS_COMBINE\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// Generates values from the Cartesian product of values produced\n// by the argument generators.\n//\ntemplate <typename T1, typename T2>\nclass CartesianProductGenerator2\n    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2> > {\n public:\n  typedef ::std::tr1::tuple<T1, T2> ParamType;\n\n  CartesianProductGenerator2(const ParamGenerator<T1>& g1,\n      const ParamGenerator<T2>& g2)\n      : g1_(g1), g2_(g2) {}\n  virtual ~CartesianProductGenerator2() {}\n\n  virtual ParamIteratorInterface<ParamType>* Begin() const {\n    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin());\n  }\n  virtual ParamIteratorInterface<ParamType>* End() const {\n    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end());\n  }\n\n private:\n  class Iterator : public ParamIteratorInterface<ParamType> {\n   public:\n    Iterator(const ParamGeneratorInterface<ParamType>* base,\n      const ParamGenerator<T1>& g1,\n      const typename ParamGenerator<T1>::iterator& current1,\n      const ParamGenerator<T2>& g2,\n      const typename ParamGenerator<T2>::iterator& current2)\n        : base_(base),\n          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),\n          begin2_(g2.begin()), end2_(g2.end()), current2_(current2)    {\n      ComputeCurrentValue();\n    }\n    virtual ~Iterator() {}\n\n    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {\n      return base_;\n    }\n    // Advance should not be called on beyond-of-range iterators\n    // so no component iterators must be beyond end of range, either.\n    virtual void Advance() {\n      assert(!AtEnd());\n      ++current2_;\n      if (current2_ == end2_) {\n        current2_ = begin2_;\n        ++current1_;\n      }\n      ComputeCurrentValue();\n    }\n    virtual ParamIteratorInterface<ParamType>* Clone() const {\n      return new Iterator(*this);\n    }\n    virtual const ParamType* Current() const { return &current_value_; }\n    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {\n      // Having the same base generator guarantees that the other\n      // iterator is of the same type and we can downcast.\n      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())\n          << \"The program attempted to compare iterators \"\n          << \"from different generators.\" << std::endl;\n      const Iterator* typed_other =\n          CheckedDowncastToActualType<const Iterator>(&other);\n      // We must report iterators equal if they both point beyond their\n      // respective ranges. That can happen in a variety of fashions,\n      // so we have to consult AtEnd().\n      return (AtEnd() && typed_other->AtEnd()) ||\n         (\n          current1_ == typed_other->current1_ &&\n          current2_ == typed_other->current2_);\n    }\n\n   private:\n    Iterator(const Iterator& other)\n        : base_(other.base_),\n        begin1_(other.begin1_),\n        end1_(other.end1_),\n        current1_(other.current1_),\n        begin2_(other.begin2_),\n        end2_(other.end2_),\n        current2_(other.current2_) {\n      ComputeCurrentValue();\n    }\n\n    void ComputeCurrentValue() {\n      if (!AtEnd())\n        current_value_ = ParamType(*current1_, *current2_);\n    }\n    bool AtEnd() const {\n      // We must report iterator past the end of the range when either of the\n      // component iterators has reached the end of its range.\n      return\n          current1_ == end1_ ||\n          current2_ == end2_;\n    }\n\n    // No implementation - assignment is unsupported.\n    void operator=(const Iterator& other);\n\n    const ParamGeneratorInterface<ParamType>* const base_;\n    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.\n    // current[i]_ is the actual traversing iterator.\n    const typename ParamGenerator<T1>::iterator begin1_;\n    const typename ParamGenerator<T1>::iterator end1_;\n    typename ParamGenerator<T1>::iterator current1_;\n    const typename ParamGenerator<T2>::iterator begin2_;\n    const typename ParamGenerator<T2>::iterator end2_;\n    typename ParamGenerator<T2>::iterator current2_;\n    ParamType current_value_;\n  };  // class CartesianProductGenerator2::Iterator\n\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductGenerator2& other);\n\n  const ParamGenerator<T1> g1_;\n  const ParamGenerator<T2> g2_;\n};  // class CartesianProductGenerator2\n\n\ntemplate <typename T1, typename T2, typename T3>\nclass CartesianProductGenerator3\n    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3> > {\n public:\n  typedef ::std::tr1::tuple<T1, T2, T3> ParamType;\n\n  CartesianProductGenerator3(const ParamGenerator<T1>& g1,\n      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3)\n      : g1_(g1), g2_(g2), g3_(g3) {}\n  virtual ~CartesianProductGenerator3() {}\n\n  virtual ParamIteratorInterface<ParamType>* Begin() const {\n    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,\n        g3_.begin());\n  }\n  virtual ParamIteratorInterface<ParamType>* End() const {\n    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end());\n  }\n\n private:\n  class Iterator : public ParamIteratorInterface<ParamType> {\n   public:\n    Iterator(const ParamGeneratorInterface<ParamType>* base,\n      const ParamGenerator<T1>& g1,\n      const typename ParamGenerator<T1>::iterator& current1,\n      const ParamGenerator<T2>& g2,\n      const typename ParamGenerator<T2>::iterator& current2,\n      const ParamGenerator<T3>& g3,\n      const typename ParamGenerator<T3>::iterator& current3)\n        : base_(base),\n          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),\n          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),\n          begin3_(g3.begin()), end3_(g3.end()), current3_(current3)    {\n      ComputeCurrentValue();\n    }\n    virtual ~Iterator() {}\n\n    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {\n      return base_;\n    }\n    // Advance should not be called on beyond-of-range iterators\n    // so no component iterators must be beyond end of range, either.\n    virtual void Advance() {\n      assert(!AtEnd());\n      ++current3_;\n      if (current3_ == end3_) {\n        current3_ = begin3_;\n        ++current2_;\n      }\n      if (current2_ == end2_) {\n        current2_ = begin2_;\n        ++current1_;\n      }\n      ComputeCurrentValue();\n    }\n    virtual ParamIteratorInterface<ParamType>* Clone() const {\n      return new Iterator(*this);\n    }\n    virtual const ParamType* Current() const { return &current_value_; }\n    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {\n      // Having the same base generator guarantees that the other\n      // iterator is of the same type and we can downcast.\n      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())\n          << \"The program attempted to compare iterators \"\n          << \"from different generators.\" << std::endl;\n      const Iterator* typed_other =\n          CheckedDowncastToActualType<const Iterator>(&other);\n      // We must report iterators equal if they both point beyond their\n      // respective ranges. That can happen in a variety of fashions,\n      // so we have to consult AtEnd().\n      return (AtEnd() && typed_other->AtEnd()) ||\n         (\n          current1_ == typed_other->current1_ &&\n          current2_ == typed_other->current2_ &&\n          current3_ == typed_other->current3_);\n    }\n\n   private:\n    Iterator(const Iterator& other)\n        : base_(other.base_),\n        begin1_(other.begin1_),\n        end1_(other.end1_),\n        current1_(other.current1_),\n        begin2_(other.begin2_),\n        end2_(other.end2_),\n        current2_(other.current2_),\n        begin3_(other.begin3_),\n        end3_(other.end3_),\n        current3_(other.current3_) {\n      ComputeCurrentValue();\n    }\n\n    void ComputeCurrentValue() {\n      if (!AtEnd())\n        current_value_ = ParamType(*current1_, *current2_, *current3_);\n    }\n    bool AtEnd() const {\n      // We must report iterator past the end of the range when either of the\n      // component iterators has reached the end of its range.\n      return\n          current1_ == end1_ ||\n          current2_ == end2_ ||\n          current3_ == end3_;\n    }\n\n    // No implementation - assignment is unsupported.\n    void operator=(const Iterator& other);\n\n    const ParamGeneratorInterface<ParamType>* const base_;\n    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.\n    // current[i]_ is the actual traversing iterator.\n    const typename ParamGenerator<T1>::iterator begin1_;\n    const typename ParamGenerator<T1>::iterator end1_;\n    typename ParamGenerator<T1>::iterator current1_;\n    const typename ParamGenerator<T2>::iterator begin2_;\n    const typename ParamGenerator<T2>::iterator end2_;\n    typename ParamGenerator<T2>::iterator current2_;\n    const typename ParamGenerator<T3>::iterator begin3_;\n    const typename ParamGenerator<T3>::iterator end3_;\n    typename ParamGenerator<T3>::iterator current3_;\n    ParamType current_value_;\n  };  // class CartesianProductGenerator3::Iterator\n\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductGenerator3& other);\n\n  const ParamGenerator<T1> g1_;\n  const ParamGenerator<T2> g2_;\n  const ParamGenerator<T3> g3_;\n};  // class CartesianProductGenerator3\n\n\ntemplate <typename T1, typename T2, typename T3, typename T4>\nclass CartesianProductGenerator4\n    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4> > {\n public:\n  typedef ::std::tr1::tuple<T1, T2, T3, T4> ParamType;\n\n  CartesianProductGenerator4(const ParamGenerator<T1>& g1,\n      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,\n      const ParamGenerator<T4>& g4)\n      : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}\n  virtual ~CartesianProductGenerator4() {}\n\n  virtual ParamIteratorInterface<ParamType>* Begin() const {\n    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,\n        g3_.begin(), g4_, g4_.begin());\n  }\n  virtual ParamIteratorInterface<ParamType>* End() const {\n    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),\n        g4_, g4_.end());\n  }\n\n private:\n  class Iterator : public ParamIteratorInterface<ParamType> {\n   public:\n    Iterator(const ParamGeneratorInterface<ParamType>* base,\n      const ParamGenerator<T1>& g1,\n      const typename ParamGenerator<T1>::iterator& current1,\n      const ParamGenerator<T2>& g2,\n      const typename ParamGenerator<T2>::iterator& current2,\n      const ParamGenerator<T3>& g3,\n      const typename ParamGenerator<T3>::iterator& current3,\n      const ParamGenerator<T4>& g4,\n      const typename ParamGenerator<T4>::iterator& current4)\n        : base_(base),\n          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),\n          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),\n          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),\n          begin4_(g4.begin()), end4_(g4.end()), current4_(current4)    {\n      ComputeCurrentValue();\n    }\n    virtual ~Iterator() {}\n\n    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {\n      return base_;\n    }\n    // Advance should not be called on beyond-of-range iterators\n    // so no component iterators must be beyond end of range, either.\n    virtual void Advance() {\n      assert(!AtEnd());\n      ++current4_;\n      if (current4_ == end4_) {\n        current4_ = begin4_;\n        ++current3_;\n      }\n      if (current3_ == end3_) {\n        current3_ = begin3_;\n        ++current2_;\n      }\n      if (current2_ == end2_) {\n        current2_ = begin2_;\n        ++current1_;\n      }\n      ComputeCurrentValue();\n    }\n    virtual ParamIteratorInterface<ParamType>* Clone() const {\n      return new Iterator(*this);\n    }\n    virtual const ParamType* Current() const { return &current_value_; }\n    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {\n      // Having the same base generator guarantees that the other\n      // iterator is of the same type and we can downcast.\n      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())\n          << \"The program attempted to compare iterators \"\n          << \"from different generators.\" << std::endl;\n      const Iterator* typed_other =\n          CheckedDowncastToActualType<const Iterator>(&other);\n      // We must report iterators equal if they both point beyond their\n      // respective ranges. That can happen in a variety of fashions,\n      // so we have to consult AtEnd().\n      return (AtEnd() && typed_other->AtEnd()) ||\n         (\n          current1_ == typed_other->current1_ &&\n          current2_ == typed_other->current2_ &&\n          current3_ == typed_other->current3_ &&\n          current4_ == typed_other->current4_);\n    }\n\n   private:\n    Iterator(const Iterator& other)\n        : base_(other.base_),\n        begin1_(other.begin1_),\n        end1_(other.end1_),\n        current1_(other.current1_),\n        begin2_(other.begin2_),\n        end2_(other.end2_),\n        current2_(other.current2_),\n        begin3_(other.begin3_),\n        end3_(other.end3_),\n        current3_(other.current3_),\n        begin4_(other.begin4_),\n        end4_(other.end4_),\n        current4_(other.current4_) {\n      ComputeCurrentValue();\n    }\n\n    void ComputeCurrentValue() {\n      if (!AtEnd())\n        current_value_ = ParamType(*current1_, *current2_, *current3_,\n            *current4_);\n    }\n    bool AtEnd() const {\n      // We must report iterator past the end of the range when either of the\n      // component iterators has reached the end of its range.\n      return\n          current1_ == end1_ ||\n          current2_ == end2_ ||\n          current3_ == end3_ ||\n          current4_ == end4_;\n    }\n\n    // No implementation - assignment is unsupported.\n    void operator=(const Iterator& other);\n\n    const ParamGeneratorInterface<ParamType>* const base_;\n    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.\n    // current[i]_ is the actual traversing iterator.\n    const typename ParamGenerator<T1>::iterator begin1_;\n    const typename ParamGenerator<T1>::iterator end1_;\n    typename ParamGenerator<T1>::iterator current1_;\n    const typename ParamGenerator<T2>::iterator begin2_;\n    const typename ParamGenerator<T2>::iterator end2_;\n    typename ParamGenerator<T2>::iterator current2_;\n    const typename ParamGenerator<T3>::iterator begin3_;\n    const typename ParamGenerator<T3>::iterator end3_;\n    typename ParamGenerator<T3>::iterator current3_;\n    const typename ParamGenerator<T4>::iterator begin4_;\n    const typename ParamGenerator<T4>::iterator end4_;\n    typename ParamGenerator<T4>::iterator current4_;\n    ParamType current_value_;\n  };  // class CartesianProductGenerator4::Iterator\n\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductGenerator4& other);\n\n  const ParamGenerator<T1> g1_;\n  const ParamGenerator<T2> g2_;\n  const ParamGenerator<T3> g3_;\n  const ParamGenerator<T4> g4_;\n};  // class CartesianProductGenerator4\n\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5>\nclass CartesianProductGenerator5\n    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5> > {\n public:\n  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5> ParamType;\n\n  CartesianProductGenerator5(const ParamGenerator<T1>& g1,\n      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,\n      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5)\n      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}\n  virtual ~CartesianProductGenerator5() {}\n\n  virtual ParamIteratorInterface<ParamType>* Begin() const {\n    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,\n        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin());\n  }\n  virtual ParamIteratorInterface<ParamType>* End() const {\n    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),\n        g4_, g4_.end(), g5_, g5_.end());\n  }\n\n private:\n  class Iterator : public ParamIteratorInterface<ParamType> {\n   public:\n    Iterator(const ParamGeneratorInterface<ParamType>* base,\n      const ParamGenerator<T1>& g1,\n      const typename ParamGenerator<T1>::iterator& current1,\n      const ParamGenerator<T2>& g2,\n      const typename ParamGenerator<T2>::iterator& current2,\n      const ParamGenerator<T3>& g3,\n      const typename ParamGenerator<T3>::iterator& current3,\n      const ParamGenerator<T4>& g4,\n      const typename ParamGenerator<T4>::iterator& current4,\n      const ParamGenerator<T5>& g5,\n      const typename ParamGenerator<T5>::iterator& current5)\n        : base_(base),\n          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),\n          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),\n          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),\n          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),\n          begin5_(g5.begin()), end5_(g5.end()), current5_(current5)    {\n      ComputeCurrentValue();\n    }\n    virtual ~Iterator() {}\n\n    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {\n      return base_;\n    }\n    // Advance should not be called on beyond-of-range iterators\n    // so no component iterators must be beyond end of range, either.\n    virtual void Advance() {\n      assert(!AtEnd());\n      ++current5_;\n      if (current5_ == end5_) {\n        current5_ = begin5_;\n        ++current4_;\n      }\n      if (current4_ == end4_) {\n        current4_ = begin4_;\n        ++current3_;\n      }\n      if (current3_ == end3_) {\n        current3_ = begin3_;\n        ++current2_;\n      }\n      if (current2_ == end2_) {\n        current2_ = begin2_;\n        ++current1_;\n      }\n      ComputeCurrentValue();\n    }\n    virtual ParamIteratorInterface<ParamType>* Clone() const {\n      return new Iterator(*this);\n    }\n    virtual const ParamType* Current() const { return &current_value_; }\n    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {\n      // Having the same base generator guarantees that the other\n      // iterator is of the same type and we can downcast.\n      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())\n          << \"The program attempted to compare iterators \"\n          << \"from different generators.\" << std::endl;\n      const Iterator* typed_other =\n          CheckedDowncastToActualType<const Iterator>(&other);\n      // We must report iterators equal if they both point beyond their\n      // respective ranges. That can happen in a variety of fashions,\n      // so we have to consult AtEnd().\n      return (AtEnd() && typed_other->AtEnd()) ||\n         (\n          current1_ == typed_other->current1_ &&\n          current2_ == typed_other->current2_ &&\n          current3_ == typed_other->current3_ &&\n          current4_ == typed_other->current4_ &&\n          current5_ == typed_other->current5_);\n    }\n\n   private:\n    Iterator(const Iterator& other)\n        : base_(other.base_),\n        begin1_(other.begin1_),\n        end1_(other.end1_),\n        current1_(other.current1_),\n        begin2_(other.begin2_),\n        end2_(other.end2_),\n        current2_(other.current2_),\n        begin3_(other.begin3_),\n        end3_(other.end3_),\n        current3_(other.current3_),\n        begin4_(other.begin4_),\n        end4_(other.end4_),\n        current4_(other.current4_),\n        begin5_(other.begin5_),\n        end5_(other.end5_),\n        current5_(other.current5_) {\n      ComputeCurrentValue();\n    }\n\n    void ComputeCurrentValue() {\n      if (!AtEnd())\n        current_value_ = ParamType(*current1_, *current2_, *current3_,\n            *current4_, *current5_);\n    }\n    bool AtEnd() const {\n      // We must report iterator past the end of the range when either of the\n      // component iterators has reached the end of its range.\n      return\n          current1_ == end1_ ||\n          current2_ == end2_ ||\n          current3_ == end3_ ||\n          current4_ == end4_ ||\n          current5_ == end5_;\n    }\n\n    // No implementation - assignment is unsupported.\n    void operator=(const Iterator& other);\n\n    const ParamGeneratorInterface<ParamType>* const base_;\n    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.\n    // current[i]_ is the actual traversing iterator.\n    const typename ParamGenerator<T1>::iterator begin1_;\n    const typename ParamGenerator<T1>::iterator end1_;\n    typename ParamGenerator<T1>::iterator current1_;\n    const typename ParamGenerator<T2>::iterator begin2_;\n    const typename ParamGenerator<T2>::iterator end2_;\n    typename ParamGenerator<T2>::iterator current2_;\n    const typename ParamGenerator<T3>::iterator begin3_;\n    const typename ParamGenerator<T3>::iterator end3_;\n    typename ParamGenerator<T3>::iterator current3_;\n    const typename ParamGenerator<T4>::iterator begin4_;\n    const typename ParamGenerator<T4>::iterator end4_;\n    typename ParamGenerator<T4>::iterator current4_;\n    const typename ParamGenerator<T5>::iterator begin5_;\n    const typename ParamGenerator<T5>::iterator end5_;\n    typename ParamGenerator<T5>::iterator current5_;\n    ParamType current_value_;\n  };  // class CartesianProductGenerator5::Iterator\n\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductGenerator5& other);\n\n  const ParamGenerator<T1> g1_;\n  const ParamGenerator<T2> g2_;\n  const ParamGenerator<T3> g3_;\n  const ParamGenerator<T4> g4_;\n  const ParamGenerator<T5> g5_;\n};  // class CartesianProductGenerator5\n\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6>\nclass CartesianProductGenerator6\n    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5,\n        T6> > {\n public:\n  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> ParamType;\n\n  CartesianProductGenerator6(const ParamGenerator<T1>& g1,\n      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,\n      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,\n      const ParamGenerator<T6>& g6)\n      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}\n  virtual ~CartesianProductGenerator6() {}\n\n  virtual ParamIteratorInterface<ParamType>* Begin() const {\n    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,\n        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin());\n  }\n  virtual ParamIteratorInterface<ParamType>* End() const {\n    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),\n        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end());\n  }\n\n private:\n  class Iterator : public ParamIteratorInterface<ParamType> {\n   public:\n    Iterator(const ParamGeneratorInterface<ParamType>* base,\n      const ParamGenerator<T1>& g1,\n      const typename ParamGenerator<T1>::iterator& current1,\n      const ParamGenerator<T2>& g2,\n      const typename ParamGenerator<T2>::iterator& current2,\n      const ParamGenerator<T3>& g3,\n      const typename ParamGenerator<T3>::iterator& current3,\n      const ParamGenerator<T4>& g4,\n      const typename ParamGenerator<T4>::iterator& current4,\n      const ParamGenerator<T5>& g5,\n      const typename ParamGenerator<T5>::iterator& current5,\n      const ParamGenerator<T6>& g6,\n      const typename ParamGenerator<T6>::iterator& current6)\n        : base_(base),\n          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),\n          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),\n          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),\n          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),\n          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),\n          begin6_(g6.begin()), end6_(g6.end()), current6_(current6)    {\n      ComputeCurrentValue();\n    }\n    virtual ~Iterator() {}\n\n    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {\n      return base_;\n    }\n    // Advance should not be called on beyond-of-range iterators\n    // so no component iterators must be beyond end of range, either.\n    virtual void Advance() {\n      assert(!AtEnd());\n      ++current6_;\n      if (current6_ == end6_) {\n        current6_ = begin6_;\n        ++current5_;\n      }\n      if (current5_ == end5_) {\n        current5_ = begin5_;\n        ++current4_;\n      }\n      if (current4_ == end4_) {\n        current4_ = begin4_;\n        ++current3_;\n      }\n      if (current3_ == end3_) {\n        current3_ = begin3_;\n        ++current2_;\n      }\n      if (current2_ == end2_) {\n        current2_ = begin2_;\n        ++current1_;\n      }\n      ComputeCurrentValue();\n    }\n    virtual ParamIteratorInterface<ParamType>* Clone() const {\n      return new Iterator(*this);\n    }\n    virtual const ParamType* Current() const { return &current_value_; }\n    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {\n      // Having the same base generator guarantees that the other\n      // iterator is of the same type and we can downcast.\n      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())\n          << \"The program attempted to compare iterators \"\n          << \"from different generators.\" << std::endl;\n      const Iterator* typed_other =\n          CheckedDowncastToActualType<const Iterator>(&other);\n      // We must report iterators equal if they both point beyond their\n      // respective ranges. That can happen in a variety of fashions,\n      // so we have to consult AtEnd().\n      return (AtEnd() && typed_other->AtEnd()) ||\n         (\n          current1_ == typed_other->current1_ &&\n          current2_ == typed_other->current2_ &&\n          current3_ == typed_other->current3_ &&\n          current4_ == typed_other->current4_ &&\n          current5_ == typed_other->current5_ &&\n          current6_ == typed_other->current6_);\n    }\n\n   private:\n    Iterator(const Iterator& other)\n        : base_(other.base_),\n        begin1_(other.begin1_),\n        end1_(other.end1_),\n        current1_(other.current1_),\n        begin2_(other.begin2_),\n        end2_(other.end2_),\n        current2_(other.current2_),\n        begin3_(other.begin3_),\n        end3_(other.end3_),\n        current3_(other.current3_),\n        begin4_(other.begin4_),\n        end4_(other.end4_),\n        current4_(other.current4_),\n        begin5_(other.begin5_),\n        end5_(other.end5_),\n        current5_(other.current5_),\n        begin6_(other.begin6_),\n        end6_(other.end6_),\n        current6_(other.current6_) {\n      ComputeCurrentValue();\n    }\n\n    void ComputeCurrentValue() {\n      if (!AtEnd())\n        current_value_ = ParamType(*current1_, *current2_, *current3_,\n            *current4_, *current5_, *current6_);\n    }\n    bool AtEnd() const {\n      // We must report iterator past the end of the range when either of the\n      // component iterators has reached the end of its range.\n      return\n          current1_ == end1_ ||\n          current2_ == end2_ ||\n          current3_ == end3_ ||\n          current4_ == end4_ ||\n          current5_ == end5_ ||\n          current6_ == end6_;\n    }\n\n    // No implementation - assignment is unsupported.\n    void operator=(const Iterator& other);\n\n    const ParamGeneratorInterface<ParamType>* const base_;\n    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.\n    // current[i]_ is the actual traversing iterator.\n    const typename ParamGenerator<T1>::iterator begin1_;\n    const typename ParamGenerator<T1>::iterator end1_;\n    typename ParamGenerator<T1>::iterator current1_;\n    const typename ParamGenerator<T2>::iterator begin2_;\n    const typename ParamGenerator<T2>::iterator end2_;\n    typename ParamGenerator<T2>::iterator current2_;\n    const typename ParamGenerator<T3>::iterator begin3_;\n    const typename ParamGenerator<T3>::iterator end3_;\n    typename ParamGenerator<T3>::iterator current3_;\n    const typename ParamGenerator<T4>::iterator begin4_;\n    const typename ParamGenerator<T4>::iterator end4_;\n    typename ParamGenerator<T4>::iterator current4_;\n    const typename ParamGenerator<T5>::iterator begin5_;\n    const typename ParamGenerator<T5>::iterator end5_;\n    typename ParamGenerator<T5>::iterator current5_;\n    const typename ParamGenerator<T6>::iterator begin6_;\n    const typename ParamGenerator<T6>::iterator end6_;\n    typename ParamGenerator<T6>::iterator current6_;\n    ParamType current_value_;\n  };  // class CartesianProductGenerator6::Iterator\n\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductGenerator6& other);\n\n  const ParamGenerator<T1> g1_;\n  const ParamGenerator<T2> g2_;\n  const ParamGenerator<T3> g3_;\n  const ParamGenerator<T4> g4_;\n  const ParamGenerator<T5> g5_;\n  const ParamGenerator<T6> g6_;\n};  // class CartesianProductGenerator6\n\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7>\nclass CartesianProductGenerator7\n    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,\n        T7> > {\n public:\n  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> ParamType;\n\n  CartesianProductGenerator7(const ParamGenerator<T1>& g1,\n      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,\n      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,\n      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7)\n      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}\n  virtual ~CartesianProductGenerator7() {}\n\n  virtual ParamIteratorInterface<ParamType>* Begin() const {\n    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,\n        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,\n        g7_.begin());\n  }\n  virtual ParamIteratorInterface<ParamType>* End() const {\n    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),\n        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end());\n  }\n\n private:\n  class Iterator : public ParamIteratorInterface<ParamType> {\n   public:\n    Iterator(const ParamGeneratorInterface<ParamType>* base,\n      const ParamGenerator<T1>& g1,\n      const typename ParamGenerator<T1>::iterator& current1,\n      const ParamGenerator<T2>& g2,\n      const typename ParamGenerator<T2>::iterator& current2,\n      const ParamGenerator<T3>& g3,\n      const typename ParamGenerator<T3>::iterator& current3,\n      const ParamGenerator<T4>& g4,\n      const typename ParamGenerator<T4>::iterator& current4,\n      const ParamGenerator<T5>& g5,\n      const typename ParamGenerator<T5>::iterator& current5,\n      const ParamGenerator<T6>& g6,\n      const typename ParamGenerator<T6>::iterator& current6,\n      const ParamGenerator<T7>& g7,\n      const typename ParamGenerator<T7>::iterator& current7)\n        : base_(base),\n          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),\n          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),\n          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),\n          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),\n          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),\n          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),\n          begin7_(g7.begin()), end7_(g7.end()), current7_(current7)    {\n      ComputeCurrentValue();\n    }\n    virtual ~Iterator() {}\n\n    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {\n      return base_;\n    }\n    // Advance should not be called on beyond-of-range iterators\n    // so no component iterators must be beyond end of range, either.\n    virtual void Advance() {\n      assert(!AtEnd());\n      ++current7_;\n      if (current7_ == end7_) {\n        current7_ = begin7_;\n        ++current6_;\n      }\n      if (current6_ == end6_) {\n        current6_ = begin6_;\n        ++current5_;\n      }\n      if (current5_ == end5_) {\n        current5_ = begin5_;\n        ++current4_;\n      }\n      if (current4_ == end4_) {\n        current4_ = begin4_;\n        ++current3_;\n      }\n      if (current3_ == end3_) {\n        current3_ = begin3_;\n        ++current2_;\n      }\n      if (current2_ == end2_) {\n        current2_ = begin2_;\n        ++current1_;\n      }\n      ComputeCurrentValue();\n    }\n    virtual ParamIteratorInterface<ParamType>* Clone() const {\n      return new Iterator(*this);\n    }\n    virtual const ParamType* Current() const { return &current_value_; }\n    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {\n      // Having the same base generator guarantees that the other\n      // iterator is of the same type and we can downcast.\n      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())\n          << \"The program attempted to compare iterators \"\n          << \"from different generators.\" << std::endl;\n      const Iterator* typed_other =\n          CheckedDowncastToActualType<const Iterator>(&other);\n      // We must report iterators equal if they both point beyond their\n      // respective ranges. That can happen in a variety of fashions,\n      // so we have to consult AtEnd().\n      return (AtEnd() && typed_other->AtEnd()) ||\n         (\n          current1_ == typed_other->current1_ &&\n          current2_ == typed_other->current2_ &&\n          current3_ == typed_other->current3_ &&\n          current4_ == typed_other->current4_ &&\n          current5_ == typed_other->current5_ &&\n          current6_ == typed_other->current6_ &&\n          current7_ == typed_other->current7_);\n    }\n\n   private:\n    Iterator(const Iterator& other)\n        : base_(other.base_),\n        begin1_(other.begin1_),\n        end1_(other.end1_),\n        current1_(other.current1_),\n        begin2_(other.begin2_),\n        end2_(other.end2_),\n        current2_(other.current2_),\n        begin3_(other.begin3_),\n        end3_(other.end3_),\n        current3_(other.current3_),\n        begin4_(other.begin4_),\n        end4_(other.end4_),\n        current4_(other.current4_),\n        begin5_(other.begin5_),\n        end5_(other.end5_),\n        current5_(other.current5_),\n        begin6_(other.begin6_),\n        end6_(other.end6_),\n        current6_(other.current6_),\n        begin7_(other.begin7_),\n        end7_(other.end7_),\n        current7_(other.current7_) {\n      ComputeCurrentValue();\n    }\n\n    void ComputeCurrentValue() {\n      if (!AtEnd())\n        current_value_ = ParamType(*current1_, *current2_, *current3_,\n            *current4_, *current5_, *current6_, *current7_);\n    }\n    bool AtEnd() const {\n      // We must report iterator past the end of the range when either of the\n      // component iterators has reached the end of its range.\n      return\n          current1_ == end1_ ||\n          current2_ == end2_ ||\n          current3_ == end3_ ||\n          current4_ == end4_ ||\n          current5_ == end5_ ||\n          current6_ == end6_ ||\n          current7_ == end7_;\n    }\n\n    // No implementation - assignment is unsupported.\n    void operator=(const Iterator& other);\n\n    const ParamGeneratorInterface<ParamType>* const base_;\n    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.\n    // current[i]_ is the actual traversing iterator.\n    const typename ParamGenerator<T1>::iterator begin1_;\n    const typename ParamGenerator<T1>::iterator end1_;\n    typename ParamGenerator<T1>::iterator current1_;\n    const typename ParamGenerator<T2>::iterator begin2_;\n    const typename ParamGenerator<T2>::iterator end2_;\n    typename ParamGenerator<T2>::iterator current2_;\n    const typename ParamGenerator<T3>::iterator begin3_;\n    const typename ParamGenerator<T3>::iterator end3_;\n    typename ParamGenerator<T3>::iterator current3_;\n    const typename ParamGenerator<T4>::iterator begin4_;\n    const typename ParamGenerator<T4>::iterator end4_;\n    typename ParamGenerator<T4>::iterator current4_;\n    const typename ParamGenerator<T5>::iterator begin5_;\n    const typename ParamGenerator<T5>::iterator end5_;\n    typename ParamGenerator<T5>::iterator current5_;\n    const typename ParamGenerator<T6>::iterator begin6_;\n    const typename ParamGenerator<T6>::iterator end6_;\n    typename ParamGenerator<T6>::iterator current6_;\n    const typename ParamGenerator<T7>::iterator begin7_;\n    const typename ParamGenerator<T7>::iterator end7_;\n    typename ParamGenerator<T7>::iterator current7_;\n    ParamType current_value_;\n  };  // class CartesianProductGenerator7::Iterator\n\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductGenerator7& other);\n\n  const ParamGenerator<T1> g1_;\n  const ParamGenerator<T2> g2_;\n  const ParamGenerator<T3> g3_;\n  const ParamGenerator<T4> g4_;\n  const ParamGenerator<T5> g5_;\n  const ParamGenerator<T6> g6_;\n  const ParamGenerator<T7> g7_;\n};  // class CartesianProductGenerator7\n\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8>\nclass CartesianProductGenerator8\n    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,\n        T7, T8> > {\n public:\n  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> ParamType;\n\n  CartesianProductGenerator8(const ParamGenerator<T1>& g1,\n      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,\n      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,\n      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,\n      const ParamGenerator<T8>& g8)\n      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),\n          g8_(g8) {}\n  virtual ~CartesianProductGenerator8() {}\n\n  virtual ParamIteratorInterface<ParamType>* Begin() const {\n    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,\n        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,\n        g7_.begin(), g8_, g8_.begin());\n  }\n  virtual ParamIteratorInterface<ParamType>* End() const {\n    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),\n        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,\n        g8_.end());\n  }\n\n private:\n  class Iterator : public ParamIteratorInterface<ParamType> {\n   public:\n    Iterator(const ParamGeneratorInterface<ParamType>* base,\n      const ParamGenerator<T1>& g1,\n      const typename ParamGenerator<T1>::iterator& current1,\n      const ParamGenerator<T2>& g2,\n      const typename ParamGenerator<T2>::iterator& current2,\n      const ParamGenerator<T3>& g3,\n      const typename ParamGenerator<T3>::iterator& current3,\n      const ParamGenerator<T4>& g4,\n      const typename ParamGenerator<T4>::iterator& current4,\n      const ParamGenerator<T5>& g5,\n      const typename ParamGenerator<T5>::iterator& current5,\n      const ParamGenerator<T6>& g6,\n      const typename ParamGenerator<T6>::iterator& current6,\n      const ParamGenerator<T7>& g7,\n      const typename ParamGenerator<T7>::iterator& current7,\n      const ParamGenerator<T8>& g8,\n      const typename ParamGenerator<T8>::iterator& current8)\n        : base_(base),\n          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),\n          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),\n          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),\n          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),\n          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),\n          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),\n          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),\n          begin8_(g8.begin()), end8_(g8.end()), current8_(current8)    {\n      ComputeCurrentValue();\n    }\n    virtual ~Iterator() {}\n\n    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {\n      return base_;\n    }\n    // Advance should not be called on beyond-of-range iterators\n    // so no component iterators must be beyond end of range, either.\n    virtual void Advance() {\n      assert(!AtEnd());\n      ++current8_;\n      if (current8_ == end8_) {\n        current8_ = begin8_;\n        ++current7_;\n      }\n      if (current7_ == end7_) {\n        current7_ = begin7_;\n        ++current6_;\n      }\n      if (current6_ == end6_) {\n        current6_ = begin6_;\n        ++current5_;\n      }\n      if (current5_ == end5_) {\n        current5_ = begin5_;\n        ++current4_;\n      }\n      if (current4_ == end4_) {\n        current4_ = begin4_;\n        ++current3_;\n      }\n      if (current3_ == end3_) {\n        current3_ = begin3_;\n        ++current2_;\n      }\n      if (current2_ == end2_) {\n        current2_ = begin2_;\n        ++current1_;\n      }\n      ComputeCurrentValue();\n    }\n    virtual ParamIteratorInterface<ParamType>* Clone() const {\n      return new Iterator(*this);\n    }\n    virtual const ParamType* Current() const { return &current_value_; }\n    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {\n      // Having the same base generator guarantees that the other\n      // iterator is of the same type and we can downcast.\n      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())\n          << \"The program attempted to compare iterators \"\n          << \"from different generators.\" << std::endl;\n      const Iterator* typed_other =\n          CheckedDowncastToActualType<const Iterator>(&other);\n      // We must report iterators equal if they both point beyond their\n      // respective ranges. That can happen in a variety of fashions,\n      // so we have to consult AtEnd().\n      return (AtEnd() && typed_other->AtEnd()) ||\n         (\n          current1_ == typed_other->current1_ &&\n          current2_ == typed_other->current2_ &&\n          current3_ == typed_other->current3_ &&\n          current4_ == typed_other->current4_ &&\n          current5_ == typed_other->current5_ &&\n          current6_ == typed_other->current6_ &&\n          current7_ == typed_other->current7_ &&\n          current8_ == typed_other->current8_);\n    }\n\n   private:\n    Iterator(const Iterator& other)\n        : base_(other.base_),\n        begin1_(other.begin1_),\n        end1_(other.end1_),\n        current1_(other.current1_),\n        begin2_(other.begin2_),\n        end2_(other.end2_),\n        current2_(other.current2_),\n        begin3_(other.begin3_),\n        end3_(other.end3_),\n        current3_(other.current3_),\n        begin4_(other.begin4_),\n        end4_(other.end4_),\n        current4_(other.current4_),\n        begin5_(other.begin5_),\n        end5_(other.end5_),\n        current5_(other.current5_),\n        begin6_(other.begin6_),\n        end6_(other.end6_),\n        current6_(other.current6_),\n        begin7_(other.begin7_),\n        end7_(other.end7_),\n        current7_(other.current7_),\n        begin8_(other.begin8_),\n        end8_(other.end8_),\n        current8_(other.current8_) {\n      ComputeCurrentValue();\n    }\n\n    void ComputeCurrentValue() {\n      if (!AtEnd())\n        current_value_ = ParamType(*current1_, *current2_, *current3_,\n            *current4_, *current5_, *current6_, *current7_, *current8_);\n    }\n    bool AtEnd() const {\n      // We must report iterator past the end of the range when either of the\n      // component iterators has reached the end of its range.\n      return\n          current1_ == end1_ ||\n          current2_ == end2_ ||\n          current3_ == end3_ ||\n          current4_ == end4_ ||\n          current5_ == end5_ ||\n          current6_ == end6_ ||\n          current7_ == end7_ ||\n          current8_ == end8_;\n    }\n\n    // No implementation - assignment is unsupported.\n    void operator=(const Iterator& other);\n\n    const ParamGeneratorInterface<ParamType>* const base_;\n    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.\n    // current[i]_ is the actual traversing iterator.\n    const typename ParamGenerator<T1>::iterator begin1_;\n    const typename ParamGenerator<T1>::iterator end1_;\n    typename ParamGenerator<T1>::iterator current1_;\n    const typename ParamGenerator<T2>::iterator begin2_;\n    const typename ParamGenerator<T2>::iterator end2_;\n    typename ParamGenerator<T2>::iterator current2_;\n    const typename ParamGenerator<T3>::iterator begin3_;\n    const typename ParamGenerator<T3>::iterator end3_;\n    typename ParamGenerator<T3>::iterator current3_;\n    const typename ParamGenerator<T4>::iterator begin4_;\n    const typename ParamGenerator<T4>::iterator end4_;\n    typename ParamGenerator<T4>::iterator current4_;\n    const typename ParamGenerator<T5>::iterator begin5_;\n    const typename ParamGenerator<T5>::iterator end5_;\n    typename ParamGenerator<T5>::iterator current5_;\n    const typename ParamGenerator<T6>::iterator begin6_;\n    const typename ParamGenerator<T6>::iterator end6_;\n    typename ParamGenerator<T6>::iterator current6_;\n    const typename ParamGenerator<T7>::iterator begin7_;\n    const typename ParamGenerator<T7>::iterator end7_;\n    typename ParamGenerator<T7>::iterator current7_;\n    const typename ParamGenerator<T8>::iterator begin8_;\n    const typename ParamGenerator<T8>::iterator end8_;\n    typename ParamGenerator<T8>::iterator current8_;\n    ParamType current_value_;\n  };  // class CartesianProductGenerator8::Iterator\n\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductGenerator8& other);\n\n  const ParamGenerator<T1> g1_;\n  const ParamGenerator<T2> g2_;\n  const ParamGenerator<T3> g3_;\n  const ParamGenerator<T4> g4_;\n  const ParamGenerator<T5> g5_;\n  const ParamGenerator<T6> g6_;\n  const ParamGenerator<T7> g7_;\n  const ParamGenerator<T8> g8_;\n};  // class CartesianProductGenerator8\n\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9>\nclass CartesianProductGenerator9\n    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,\n        T7, T8, T9> > {\n public:\n  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9> ParamType;\n\n  CartesianProductGenerator9(const ParamGenerator<T1>& g1,\n      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,\n      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,\n      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,\n      const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9)\n      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),\n          g9_(g9) {}\n  virtual ~CartesianProductGenerator9() {}\n\n  virtual ParamIteratorInterface<ParamType>* Begin() const {\n    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,\n        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,\n        g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin());\n  }\n  virtual ParamIteratorInterface<ParamType>* End() const {\n    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),\n        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,\n        g8_.end(), g9_, g9_.end());\n  }\n\n private:\n  class Iterator : public ParamIteratorInterface<ParamType> {\n   public:\n    Iterator(const ParamGeneratorInterface<ParamType>* base,\n      const ParamGenerator<T1>& g1,\n      const typename ParamGenerator<T1>::iterator& current1,\n      const ParamGenerator<T2>& g2,\n      const typename ParamGenerator<T2>::iterator& current2,\n      const ParamGenerator<T3>& g3,\n      const typename ParamGenerator<T3>::iterator& current3,\n      const ParamGenerator<T4>& g4,\n      const typename ParamGenerator<T4>::iterator& current4,\n      const ParamGenerator<T5>& g5,\n      const typename ParamGenerator<T5>::iterator& current5,\n      const ParamGenerator<T6>& g6,\n      const typename ParamGenerator<T6>::iterator& current6,\n      const ParamGenerator<T7>& g7,\n      const typename ParamGenerator<T7>::iterator& current7,\n      const ParamGenerator<T8>& g8,\n      const typename ParamGenerator<T8>::iterator& current8,\n      const ParamGenerator<T9>& g9,\n      const typename ParamGenerator<T9>::iterator& current9)\n        : base_(base),\n          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),\n          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),\n          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),\n          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),\n          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),\n          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),\n          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),\n          begin8_(g8.begin()), end8_(g8.end()), current8_(current8),\n          begin9_(g9.begin()), end9_(g9.end()), current9_(current9)    {\n      ComputeCurrentValue();\n    }\n    virtual ~Iterator() {}\n\n    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {\n      return base_;\n    }\n    // Advance should not be called on beyond-of-range iterators\n    // so no component iterators must be beyond end of range, either.\n    virtual void Advance() {\n      assert(!AtEnd());\n      ++current9_;\n      if (current9_ == end9_) {\n        current9_ = begin9_;\n        ++current8_;\n      }\n      if (current8_ == end8_) {\n        current8_ = begin8_;\n        ++current7_;\n      }\n      if (current7_ == end7_) {\n        current7_ = begin7_;\n        ++current6_;\n      }\n      if (current6_ == end6_) {\n        current6_ = begin6_;\n        ++current5_;\n      }\n      if (current5_ == end5_) {\n        current5_ = begin5_;\n        ++current4_;\n      }\n      if (current4_ == end4_) {\n        current4_ = begin4_;\n        ++current3_;\n      }\n      if (current3_ == end3_) {\n        current3_ = begin3_;\n        ++current2_;\n      }\n      if (current2_ == end2_) {\n        current2_ = begin2_;\n        ++current1_;\n      }\n      ComputeCurrentValue();\n    }\n    virtual ParamIteratorInterface<ParamType>* Clone() const {\n      return new Iterator(*this);\n    }\n    virtual const ParamType* Current() const { return &current_value_; }\n    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {\n      // Having the same base generator guarantees that the other\n      // iterator is of the same type and we can downcast.\n      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())\n          << \"The program attempted to compare iterators \"\n          << \"from different generators.\" << std::endl;\n      const Iterator* typed_other =\n          CheckedDowncastToActualType<const Iterator>(&other);\n      // We must report iterators equal if they both point beyond their\n      // respective ranges. That can happen in a variety of fashions,\n      // so we have to consult AtEnd().\n      return (AtEnd() && typed_other->AtEnd()) ||\n         (\n          current1_ == typed_other->current1_ &&\n          current2_ == typed_other->current2_ &&\n          current3_ == typed_other->current3_ &&\n          current4_ == typed_other->current4_ &&\n          current5_ == typed_other->current5_ &&\n          current6_ == typed_other->current6_ &&\n          current7_ == typed_other->current7_ &&\n          current8_ == typed_other->current8_ &&\n          current9_ == typed_other->current9_);\n    }\n\n   private:\n    Iterator(const Iterator& other)\n        : base_(other.base_),\n        begin1_(other.begin1_),\n        end1_(other.end1_),\n        current1_(other.current1_),\n        begin2_(other.begin2_),\n        end2_(other.end2_),\n        current2_(other.current2_),\n        begin3_(other.begin3_),\n        end3_(other.end3_),\n        current3_(other.current3_),\n        begin4_(other.begin4_),\n        end4_(other.end4_),\n        current4_(other.current4_),\n        begin5_(other.begin5_),\n        end5_(other.end5_),\n        current5_(other.current5_),\n        begin6_(other.begin6_),\n        end6_(other.end6_),\n        current6_(other.current6_),\n        begin7_(other.begin7_),\n        end7_(other.end7_),\n        current7_(other.current7_),\n        begin8_(other.begin8_),\n        end8_(other.end8_),\n        current8_(other.current8_),\n        begin9_(other.begin9_),\n        end9_(other.end9_),\n        current9_(other.current9_) {\n      ComputeCurrentValue();\n    }\n\n    void ComputeCurrentValue() {\n      if (!AtEnd())\n        current_value_ = ParamType(*current1_, *current2_, *current3_,\n            *current4_, *current5_, *current6_, *current7_, *current8_,\n            *current9_);\n    }\n    bool AtEnd() const {\n      // We must report iterator past the end of the range when either of the\n      // component iterators has reached the end of its range.\n      return\n          current1_ == end1_ ||\n          current2_ == end2_ ||\n          current3_ == end3_ ||\n          current4_ == end4_ ||\n          current5_ == end5_ ||\n          current6_ == end6_ ||\n          current7_ == end7_ ||\n          current8_ == end8_ ||\n          current9_ == end9_;\n    }\n\n    // No implementation - assignment is unsupported.\n    void operator=(const Iterator& other);\n\n    const ParamGeneratorInterface<ParamType>* const base_;\n    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.\n    // current[i]_ is the actual traversing iterator.\n    const typename ParamGenerator<T1>::iterator begin1_;\n    const typename ParamGenerator<T1>::iterator end1_;\n    typename ParamGenerator<T1>::iterator current1_;\n    const typename ParamGenerator<T2>::iterator begin2_;\n    const typename ParamGenerator<T2>::iterator end2_;\n    typename ParamGenerator<T2>::iterator current2_;\n    const typename ParamGenerator<T3>::iterator begin3_;\n    const typename ParamGenerator<T3>::iterator end3_;\n    typename ParamGenerator<T3>::iterator current3_;\n    const typename ParamGenerator<T4>::iterator begin4_;\n    const typename ParamGenerator<T4>::iterator end4_;\n    typename ParamGenerator<T4>::iterator current4_;\n    const typename ParamGenerator<T5>::iterator begin5_;\n    const typename ParamGenerator<T5>::iterator end5_;\n    typename ParamGenerator<T5>::iterator current5_;\n    const typename ParamGenerator<T6>::iterator begin6_;\n    const typename ParamGenerator<T6>::iterator end6_;\n    typename ParamGenerator<T6>::iterator current6_;\n    const typename ParamGenerator<T7>::iterator begin7_;\n    const typename ParamGenerator<T7>::iterator end7_;\n    typename ParamGenerator<T7>::iterator current7_;\n    const typename ParamGenerator<T8>::iterator begin8_;\n    const typename ParamGenerator<T8>::iterator end8_;\n    typename ParamGenerator<T8>::iterator current8_;\n    const typename ParamGenerator<T9>::iterator begin9_;\n    const typename ParamGenerator<T9>::iterator end9_;\n    typename ParamGenerator<T9>::iterator current9_;\n    ParamType current_value_;\n  };  // class CartesianProductGenerator9::Iterator\n\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductGenerator9& other);\n\n  const ParamGenerator<T1> g1_;\n  const ParamGenerator<T2> g2_;\n  const ParamGenerator<T3> g3_;\n  const ParamGenerator<T4> g4_;\n  const ParamGenerator<T5> g5_;\n  const ParamGenerator<T6> g6_;\n  const ParamGenerator<T7> g7_;\n  const ParamGenerator<T8> g8_;\n  const ParamGenerator<T9> g9_;\n};  // class CartesianProductGenerator9\n\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10>\nclass CartesianProductGenerator10\n    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,\n        T7, T8, T9, T10> > {\n public:\n  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> ParamType;\n\n  CartesianProductGenerator10(const ParamGenerator<T1>& g1,\n      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,\n      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,\n      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,\n      const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9,\n      const ParamGenerator<T10>& g10)\n      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),\n          g9_(g9), g10_(g10) {}\n  virtual ~CartesianProductGenerator10() {}\n\n  virtual ParamIteratorInterface<ParamType>* Begin() const {\n    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,\n        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,\n        g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin(), g10_, g10_.begin());\n  }\n  virtual ParamIteratorInterface<ParamType>* End() const {\n    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),\n        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,\n        g8_.end(), g9_, g9_.end(), g10_, g10_.end());\n  }\n\n private:\n  class Iterator : public ParamIteratorInterface<ParamType> {\n   public:\n    Iterator(const ParamGeneratorInterface<ParamType>* base,\n      const ParamGenerator<T1>& g1,\n      const typename ParamGenerator<T1>::iterator& current1,\n      const ParamGenerator<T2>& g2,\n      const typename ParamGenerator<T2>::iterator& current2,\n      const ParamGenerator<T3>& g3,\n      const typename ParamGenerator<T3>::iterator& current3,\n      const ParamGenerator<T4>& g4,\n      const typename ParamGenerator<T4>::iterator& current4,\n      const ParamGenerator<T5>& g5,\n      const typename ParamGenerator<T5>::iterator& current5,\n      const ParamGenerator<T6>& g6,\n      const typename ParamGenerator<T6>::iterator& current6,\n      const ParamGenerator<T7>& g7,\n      const typename ParamGenerator<T7>::iterator& current7,\n      const ParamGenerator<T8>& g8,\n      const typename ParamGenerator<T8>::iterator& current8,\n      const ParamGenerator<T9>& g9,\n      const typename ParamGenerator<T9>::iterator& current9,\n      const ParamGenerator<T10>& g10,\n      const typename ParamGenerator<T10>::iterator& current10)\n        : base_(base),\n          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),\n          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),\n          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),\n          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),\n          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),\n          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),\n          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),\n          begin8_(g8.begin()), end8_(g8.end()), current8_(current8),\n          begin9_(g9.begin()), end9_(g9.end()), current9_(current9),\n          begin10_(g10.begin()), end10_(g10.end()), current10_(current10)    {\n      ComputeCurrentValue();\n    }\n    virtual ~Iterator() {}\n\n    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {\n      return base_;\n    }\n    // Advance should not be called on beyond-of-range iterators\n    // so no component iterators must be beyond end of range, either.\n    virtual void Advance() {\n      assert(!AtEnd());\n      ++current10_;\n      if (current10_ == end10_) {\n        current10_ = begin10_;\n        ++current9_;\n      }\n      if (current9_ == end9_) {\n        current9_ = begin9_;\n        ++current8_;\n      }\n      if (current8_ == end8_) {\n        current8_ = begin8_;\n        ++current7_;\n      }\n      if (current7_ == end7_) {\n        current7_ = begin7_;\n        ++current6_;\n      }\n      if (current6_ == end6_) {\n        current6_ = begin6_;\n        ++current5_;\n      }\n      if (current5_ == end5_) {\n        current5_ = begin5_;\n        ++current4_;\n      }\n      if (current4_ == end4_) {\n        current4_ = begin4_;\n        ++current3_;\n      }\n      if (current3_ == end3_) {\n        current3_ = begin3_;\n        ++current2_;\n      }\n      if (current2_ == end2_) {\n        current2_ = begin2_;\n        ++current1_;\n      }\n      ComputeCurrentValue();\n    }\n    virtual ParamIteratorInterface<ParamType>* Clone() const {\n      return new Iterator(*this);\n    }\n    virtual const ParamType* Current() const { return &current_value_; }\n    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {\n      // Having the same base generator guarantees that the other\n      // iterator is of the same type and we can downcast.\n      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())\n          << \"The program attempted to compare iterators \"\n          << \"from different generators.\" << std::endl;\n      const Iterator* typed_other =\n          CheckedDowncastToActualType<const Iterator>(&other);\n      // We must report iterators equal if they both point beyond their\n      // respective ranges. That can happen in a variety of fashions,\n      // so we have to consult AtEnd().\n      return (AtEnd() && typed_other->AtEnd()) ||\n         (\n          current1_ == typed_other->current1_ &&\n          current2_ == typed_other->current2_ &&\n          current3_ == typed_other->current3_ &&\n          current4_ == typed_other->current4_ &&\n          current5_ == typed_other->current5_ &&\n          current6_ == typed_other->current6_ &&\n          current7_ == typed_other->current7_ &&\n          current8_ == typed_other->current8_ &&\n          current9_ == typed_other->current9_ &&\n          current10_ == typed_other->current10_);\n    }\n\n   private:\n    Iterator(const Iterator& other)\n        : base_(other.base_),\n        begin1_(other.begin1_),\n        end1_(other.end1_),\n        current1_(other.current1_),\n        begin2_(other.begin2_),\n        end2_(other.end2_),\n        current2_(other.current2_),\n        begin3_(other.begin3_),\n        end3_(other.end3_),\n        current3_(other.current3_),\n        begin4_(other.begin4_),\n        end4_(other.end4_),\n        current4_(other.current4_),\n        begin5_(other.begin5_),\n        end5_(other.end5_),\n        current5_(other.current5_),\n        begin6_(other.begin6_),\n        end6_(other.end6_),\n        current6_(other.current6_),\n        begin7_(other.begin7_),\n        end7_(other.end7_),\n        current7_(other.current7_),\n        begin8_(other.begin8_),\n        end8_(other.end8_),\n        current8_(other.current8_),\n        begin9_(other.begin9_),\n        end9_(other.end9_),\n        current9_(other.current9_),\n        begin10_(other.begin10_),\n        end10_(other.end10_),\n        current10_(other.current10_) {\n      ComputeCurrentValue();\n    }\n\n    void ComputeCurrentValue() {\n      if (!AtEnd())\n        current_value_ = ParamType(*current1_, *current2_, *current3_,\n            *current4_, *current5_, *current6_, *current7_, *current8_,\n            *current9_, *current10_);\n    }\n    bool AtEnd() const {\n      // We must report iterator past the end of the range when either of the\n      // component iterators has reached the end of its range.\n      return\n          current1_ == end1_ ||\n          current2_ == end2_ ||\n          current3_ == end3_ ||\n          current4_ == end4_ ||\n          current5_ == end5_ ||\n          current6_ == end6_ ||\n          current7_ == end7_ ||\n          current8_ == end8_ ||\n          current9_ == end9_ ||\n          current10_ == end10_;\n    }\n\n    // No implementation - assignment is unsupported.\n    void operator=(const Iterator& other);\n\n    const ParamGeneratorInterface<ParamType>* const base_;\n    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.\n    // current[i]_ is the actual traversing iterator.\n    const typename ParamGenerator<T1>::iterator begin1_;\n    const typename ParamGenerator<T1>::iterator end1_;\n    typename ParamGenerator<T1>::iterator current1_;\n    const typename ParamGenerator<T2>::iterator begin2_;\n    const typename ParamGenerator<T2>::iterator end2_;\n    typename ParamGenerator<T2>::iterator current2_;\n    const typename ParamGenerator<T3>::iterator begin3_;\n    const typename ParamGenerator<T3>::iterator end3_;\n    typename ParamGenerator<T3>::iterator current3_;\n    const typename ParamGenerator<T4>::iterator begin4_;\n    const typename ParamGenerator<T4>::iterator end4_;\n    typename ParamGenerator<T4>::iterator current4_;\n    const typename ParamGenerator<T5>::iterator begin5_;\n    const typename ParamGenerator<T5>::iterator end5_;\n    typename ParamGenerator<T5>::iterator current5_;\n    const typename ParamGenerator<T6>::iterator begin6_;\n    const typename ParamGenerator<T6>::iterator end6_;\n    typename ParamGenerator<T6>::iterator current6_;\n    const typename ParamGenerator<T7>::iterator begin7_;\n    const typename ParamGenerator<T7>::iterator end7_;\n    typename ParamGenerator<T7>::iterator current7_;\n    const typename ParamGenerator<T8>::iterator begin8_;\n    const typename ParamGenerator<T8>::iterator end8_;\n    typename ParamGenerator<T8>::iterator current8_;\n    const typename ParamGenerator<T9>::iterator begin9_;\n    const typename ParamGenerator<T9>::iterator end9_;\n    typename ParamGenerator<T9>::iterator current9_;\n    const typename ParamGenerator<T10>::iterator begin10_;\n    const typename ParamGenerator<T10>::iterator end10_;\n    typename ParamGenerator<T10>::iterator current10_;\n    ParamType current_value_;\n  };  // class CartesianProductGenerator10::Iterator\n\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductGenerator10& other);\n\n  const ParamGenerator<T1> g1_;\n  const ParamGenerator<T2> g2_;\n  const ParamGenerator<T3> g3_;\n  const ParamGenerator<T4> g4_;\n  const ParamGenerator<T5> g5_;\n  const ParamGenerator<T6> g6_;\n  const ParamGenerator<T7> g7_;\n  const ParamGenerator<T8> g8_;\n  const ParamGenerator<T9> g9_;\n  const ParamGenerator<T10> g10_;\n};  // class CartesianProductGenerator10\n\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// Helper classes providing Combine() with polymorphic features. They allow\n// casting CartesianProductGeneratorN<T> to ParamGenerator<U> if T is\n// convertible to U.\n//\ntemplate <class Generator1, class Generator2>\nclass CartesianProductHolder2 {\n public:\nCartesianProductHolder2(const Generator1& g1, const Generator2& g2)\n      : g1_(g1), g2_(g2) {}\n  template <typename T1, typename T2>\n  operator ParamGenerator< ::std::tr1::tuple<T1, T2> >() const {\n    return ParamGenerator< ::std::tr1::tuple<T1, T2> >(\n        new CartesianProductGenerator2<T1, T2>(\n        static_cast<ParamGenerator<T1> >(g1_),\n        static_cast<ParamGenerator<T2> >(g2_)));\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductHolder2& other);\n\n  const Generator1 g1_;\n  const Generator2 g2_;\n};  // class CartesianProductHolder2\n\ntemplate <class Generator1, class Generator2, class Generator3>\nclass CartesianProductHolder3 {\n public:\nCartesianProductHolder3(const Generator1& g1, const Generator2& g2,\n    const Generator3& g3)\n      : g1_(g1), g2_(g2), g3_(g3) {}\n  template <typename T1, typename T2, typename T3>\n  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >() const {\n    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >(\n        new CartesianProductGenerator3<T1, T2, T3>(\n        static_cast<ParamGenerator<T1> >(g1_),\n        static_cast<ParamGenerator<T2> >(g2_),\n        static_cast<ParamGenerator<T3> >(g3_)));\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductHolder3& other);\n\n  const Generator1 g1_;\n  const Generator2 g2_;\n  const Generator3 g3_;\n};  // class CartesianProductHolder3\n\ntemplate <class Generator1, class Generator2, class Generator3,\n    class Generator4>\nclass CartesianProductHolder4 {\n public:\nCartesianProductHolder4(const Generator1& g1, const Generator2& g2,\n    const Generator3& g3, const Generator4& g4)\n      : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}\n  template <typename T1, typename T2, typename T3, typename T4>\n  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >() const {\n    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >(\n        new CartesianProductGenerator4<T1, T2, T3, T4>(\n        static_cast<ParamGenerator<T1> >(g1_),\n        static_cast<ParamGenerator<T2> >(g2_),\n        static_cast<ParamGenerator<T3> >(g3_),\n        static_cast<ParamGenerator<T4> >(g4_)));\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductHolder4& other);\n\n  const Generator1 g1_;\n  const Generator2 g2_;\n  const Generator3 g3_;\n  const Generator4 g4_;\n};  // class CartesianProductHolder4\n\ntemplate <class Generator1, class Generator2, class Generator3,\n    class Generator4, class Generator5>\nclass CartesianProductHolder5 {\n public:\nCartesianProductHolder5(const Generator1& g1, const Generator2& g2,\n    const Generator3& g3, const Generator4& g4, const Generator5& g5)\n      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}\n  template <typename T1, typename T2, typename T3, typename T4, typename T5>\n  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >() const {\n    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >(\n        new CartesianProductGenerator5<T1, T2, T3, T4, T5>(\n        static_cast<ParamGenerator<T1> >(g1_),\n        static_cast<ParamGenerator<T2> >(g2_),\n        static_cast<ParamGenerator<T3> >(g3_),\n        static_cast<ParamGenerator<T4> >(g4_),\n        static_cast<ParamGenerator<T5> >(g5_)));\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductHolder5& other);\n\n  const Generator1 g1_;\n  const Generator2 g2_;\n  const Generator3 g3_;\n  const Generator4 g4_;\n  const Generator5 g5_;\n};  // class CartesianProductHolder5\n\ntemplate <class Generator1, class Generator2, class Generator3,\n    class Generator4, class Generator5, class Generator6>\nclass CartesianProductHolder6 {\n public:\nCartesianProductHolder6(const Generator1& g1, const Generator2& g2,\n    const Generator3& g3, const Generator4& g4, const Generator5& g5,\n    const Generator6& g6)\n      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}\n  template <typename T1, typename T2, typename T3, typename T4, typename T5,\n      typename T6>\n  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >() const {\n    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >(\n        new CartesianProductGenerator6<T1, T2, T3, T4, T5, T6>(\n        static_cast<ParamGenerator<T1> >(g1_),\n        static_cast<ParamGenerator<T2> >(g2_),\n        static_cast<ParamGenerator<T3> >(g3_),\n        static_cast<ParamGenerator<T4> >(g4_),\n        static_cast<ParamGenerator<T5> >(g5_),\n        static_cast<ParamGenerator<T6> >(g6_)));\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductHolder6& other);\n\n  const Generator1 g1_;\n  const Generator2 g2_;\n  const Generator3 g3_;\n  const Generator4 g4_;\n  const Generator5 g5_;\n  const Generator6 g6_;\n};  // class CartesianProductHolder6\n\ntemplate <class Generator1, class Generator2, class Generator3,\n    class Generator4, class Generator5, class Generator6, class Generator7>\nclass CartesianProductHolder7 {\n public:\nCartesianProductHolder7(const Generator1& g1, const Generator2& g2,\n    const Generator3& g3, const Generator4& g4, const Generator5& g5,\n    const Generator6& g6, const Generator7& g7)\n      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}\n  template <typename T1, typename T2, typename T3, typename T4, typename T5,\n      typename T6, typename T7>\n  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,\n      T7> >() const {\n    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> >(\n        new CartesianProductGenerator7<T1, T2, T3, T4, T5, T6, T7>(\n        static_cast<ParamGenerator<T1> >(g1_),\n        static_cast<ParamGenerator<T2> >(g2_),\n        static_cast<ParamGenerator<T3> >(g3_),\n        static_cast<ParamGenerator<T4> >(g4_),\n        static_cast<ParamGenerator<T5> >(g5_),\n        static_cast<ParamGenerator<T6> >(g6_),\n        static_cast<ParamGenerator<T7> >(g7_)));\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductHolder7& other);\n\n  const Generator1 g1_;\n  const Generator2 g2_;\n  const Generator3 g3_;\n  const Generator4 g4_;\n  const Generator5 g5_;\n  const Generator6 g6_;\n  const Generator7 g7_;\n};  // class CartesianProductHolder7\n\ntemplate <class Generator1, class Generator2, class Generator3,\n    class Generator4, class Generator5, class Generator6, class Generator7,\n    class Generator8>\nclass CartesianProductHolder8 {\n public:\nCartesianProductHolder8(const Generator1& g1, const Generator2& g2,\n    const Generator3& g3, const Generator4& g4, const Generator5& g5,\n    const Generator6& g6, const Generator7& g7, const Generator8& g8)\n      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),\n          g8_(g8) {}\n  template <typename T1, typename T2, typename T3, typename T4, typename T5,\n      typename T6, typename T7, typename T8>\n  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7,\n      T8> >() const {\n    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> >(\n        new CartesianProductGenerator8<T1, T2, T3, T4, T5, T6, T7, T8>(\n        static_cast<ParamGenerator<T1> >(g1_),\n        static_cast<ParamGenerator<T2> >(g2_),\n        static_cast<ParamGenerator<T3> >(g3_),\n        static_cast<ParamGenerator<T4> >(g4_),\n        static_cast<ParamGenerator<T5> >(g5_),\n        static_cast<ParamGenerator<T6> >(g6_),\n        static_cast<ParamGenerator<T7> >(g7_),\n        static_cast<ParamGenerator<T8> >(g8_)));\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductHolder8& other);\n\n  const Generator1 g1_;\n  const Generator2 g2_;\n  const Generator3 g3_;\n  const Generator4 g4_;\n  const Generator5 g5_;\n  const Generator6 g6_;\n  const Generator7 g7_;\n  const Generator8 g8_;\n};  // class CartesianProductHolder8\n\ntemplate <class Generator1, class Generator2, class Generator3,\n    class Generator4, class Generator5, class Generator6, class Generator7,\n    class Generator8, class Generator9>\nclass CartesianProductHolder9 {\n public:\nCartesianProductHolder9(const Generator1& g1, const Generator2& g2,\n    const Generator3& g3, const Generator4& g4, const Generator5& g5,\n    const Generator6& g6, const Generator7& g7, const Generator8& g8,\n    const Generator9& g9)\n      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),\n          g9_(g9) {}\n  template <typename T1, typename T2, typename T3, typename T4, typename T5,\n      typename T6, typename T7, typename T8, typename T9>\n  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,\n      T9> >() const {\n    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,\n        T9> >(\n        new CartesianProductGenerator9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(\n        static_cast<ParamGenerator<T1> >(g1_),\n        static_cast<ParamGenerator<T2> >(g2_),\n        static_cast<ParamGenerator<T3> >(g3_),\n        static_cast<ParamGenerator<T4> >(g4_),\n        static_cast<ParamGenerator<T5> >(g5_),\n        static_cast<ParamGenerator<T6> >(g6_),\n        static_cast<ParamGenerator<T7> >(g7_),\n        static_cast<ParamGenerator<T8> >(g8_),\n        static_cast<ParamGenerator<T9> >(g9_)));\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductHolder9& other);\n\n  const Generator1 g1_;\n  const Generator2 g2_;\n  const Generator3 g3_;\n  const Generator4 g4_;\n  const Generator5 g5_;\n  const Generator6 g6_;\n  const Generator7 g7_;\n  const Generator8 g8_;\n  const Generator9 g9_;\n};  // class CartesianProductHolder9\n\ntemplate <class Generator1, class Generator2, class Generator3,\n    class Generator4, class Generator5, class Generator6, class Generator7,\n    class Generator8, class Generator9, class Generator10>\nclass CartesianProductHolder10 {\n public:\nCartesianProductHolder10(const Generator1& g1, const Generator2& g2,\n    const Generator3& g3, const Generator4& g4, const Generator5& g5,\n    const Generator6& g6, const Generator7& g7, const Generator8& g8,\n    const Generator9& g9, const Generator10& g10)\n      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),\n          g9_(g9), g10_(g10) {}\n  template <typename T1, typename T2, typename T3, typename T4, typename T5,\n      typename T6, typename T7, typename T8, typename T9, typename T10>\n  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,\n      T9, T10> >() const {\n    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,\n        T9, T10> >(\n        new CartesianProductGenerator10<T1, T2, T3, T4, T5, T6, T7, T8, T9,\n            T10>(\n        static_cast<ParamGenerator<T1> >(g1_),\n        static_cast<ParamGenerator<T2> >(g2_),\n        static_cast<ParamGenerator<T3> >(g3_),\n        static_cast<ParamGenerator<T4> >(g4_),\n        static_cast<ParamGenerator<T5> >(g5_),\n        static_cast<ParamGenerator<T6> >(g6_),\n        static_cast<ParamGenerator<T7> >(g7_),\n        static_cast<ParamGenerator<T8> >(g8_),\n        static_cast<ParamGenerator<T9> >(g9_),\n        static_cast<ParamGenerator<T10> >(g10_)));\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductHolder10& other);\n\n  const Generator1 g1_;\n  const Generator2 g2_;\n  const Generator3 g3_;\n  const Generator4 g4_;\n  const Generator5 g5_;\n  const Generator6 g6_;\n  const Generator7 g7_;\n  const Generator8 g8_;\n  const Generator9 g9_;\n  const Generator10 g10_;\n};  // class CartesianProductHolder10\n\n# endif  // GTEST_HAS_COMBINE\n\n}  // namespace internal\n}  // namespace testing\n\n#endif  //  GTEST_HAS_PARAM_TEST\n\n#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_\n\n#if GTEST_HAS_PARAM_TEST\n\nnamespace testing {\n\n// Functions producing parameter generators.\n//\n// Google Test uses these generators to produce parameters for value-\n// parameterized tests. When a parameterized test case is instantiated\n// with a particular generator, Google Test creates and runs tests\n// for each element in the sequence produced by the generator.\n//\n// In the following sample, tests from test case FooTest are instantiated\n// each three times with parameter values 3, 5, and 8:\n//\n// class FooTest : public TestWithParam<int> { ... };\n//\n// TEST_P(FooTest, TestThis) {\n// }\n// TEST_P(FooTest, TestThat) {\n// }\n// INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8));\n//\n\n// Range() returns generators providing sequences of values in a range.\n//\n// Synopsis:\n// Range(start, end)\n//   - returns a generator producing a sequence of values {start, start+1,\n//     start+2, ..., }.\n// Range(start, end, step)\n//   - returns a generator producing a sequence of values {start, start+step,\n//     start+step+step, ..., }.\n// Notes:\n//   * The generated sequences never include end. For example, Range(1, 5)\n//     returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2)\n//     returns a generator producing {1, 3, 5, 7}.\n//   * start and end must have the same type. That type may be any integral or\n//     floating-point type or a user defined type satisfying these conditions:\n//     * It must be assignable (have operator=() defined).\n//     * It must have operator+() (operator+(int-compatible type) for\n//       two-operand version).\n//     * It must have operator<() defined.\n//     Elements in the resulting sequences will also have that type.\n//   * Condition start < end must be satisfied in order for resulting sequences\n//     to contain any elements.\n//\ntemplate <typename T, typename IncrementT>\ninternal::ParamGenerator<T> Range(T start, T end, IncrementT step) {\n  return internal::ParamGenerator<T>(\n      new internal::RangeGenerator<T, IncrementT>(start, end, step));\n}\n\ntemplate <typename T>\ninternal::ParamGenerator<T> Range(T start, T end) {\n  return Range(start, end, 1);\n}\n\n// ValuesIn() function allows generation of tests with parameters coming from\n// a container.\n//\n// Synopsis:\n// ValuesIn(const T (&array)[N])\n//   - returns a generator producing sequences with elements from\n//     a C-style array.\n// ValuesIn(const Container& container)\n//   - returns a generator producing sequences with elements from\n//     an STL-style container.\n// ValuesIn(Iterator begin, Iterator end)\n//   - returns a generator producing sequences with elements from\n//     a range [begin, end) defined by a pair of STL-style iterators. These\n//     iterators can also be plain C pointers.\n//\n// Please note that ValuesIn copies the values from the containers\n// passed in and keeps them to generate tests in RUN_ALL_TESTS().\n//\n// Examples:\n//\n// This instantiates tests from test case StringTest\n// each with C-string values of \"foo\", \"bar\", and \"baz\":\n//\n// const char* strings[] = {\"foo\", \"bar\", \"baz\"};\n// INSTANTIATE_TEST_CASE_P(StringSequence, SrtingTest, ValuesIn(strings));\n//\n// This instantiates tests from test case StlStringTest\n// each with STL strings with values \"a\" and \"b\":\n//\n// ::std::vector< ::std::string> GetParameterStrings() {\n//   ::std::vector< ::std::string> v;\n//   v.push_back(\"a\");\n//   v.push_back(\"b\");\n//   return v;\n// }\n//\n// INSTANTIATE_TEST_CASE_P(CharSequence,\n//                         StlStringTest,\n//                         ValuesIn(GetParameterStrings()));\n//\n//\n// This will also instantiate tests from CharTest\n// each with parameter values 'a' and 'b':\n//\n// ::std::list<char> GetParameterChars() {\n//   ::std::list<char> list;\n//   list.push_back('a');\n//   list.push_back('b');\n//   return list;\n// }\n// ::std::list<char> l = GetParameterChars();\n// INSTANTIATE_TEST_CASE_P(CharSequence2,\n//                         CharTest,\n//                         ValuesIn(l.begin(), l.end()));\n//\ntemplate <typename ForwardIterator>\ninternal::ParamGenerator<\n  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>\nValuesIn(ForwardIterator begin, ForwardIterator end) {\n  typedef typename ::testing::internal::IteratorTraits<ForwardIterator>\n      ::value_type ParamType;\n  return internal::ParamGenerator<ParamType>(\n      new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end));\n}\n\ntemplate <typename T, size_t N>\ninternal::ParamGenerator<T> ValuesIn(const T (&array)[N]) {\n  return ValuesIn(array, array + N);\n}\n\ntemplate <class Container>\ninternal::ParamGenerator<typename Container::value_type> ValuesIn(\n    const Container& container) {\n  return ValuesIn(container.begin(), container.end());\n}\n\n// Values() allows generating tests from explicitly specified list of\n// parameters.\n//\n// Synopsis:\n// Values(T v1, T v2, ..., T vN)\n//   - returns a generator producing sequences with elements v1, v2, ..., vN.\n//\n// For example, this instantiates tests from test case BarTest each\n// with values \"one\", \"two\", and \"three\":\n//\n// INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values(\"one\", \"two\", \"three\"));\n//\n// This instantiates tests from test case BazTest each with values 1, 2, 3.5.\n// The exact type of values will depend on the type of parameter in BazTest.\n//\n// INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5));\n//\n// Currently, Values() supports from 1 to 50 parameters.\n//\ntemplate <typename T1>\ninternal::ValueArray1<T1> Values(T1 v1) {\n  return internal::ValueArray1<T1>(v1);\n}\n\ntemplate <typename T1, typename T2>\ninternal::ValueArray2<T1, T2> Values(T1 v1, T2 v2) {\n  return internal::ValueArray2<T1, T2>(v1, v2);\n}\n\ntemplate <typename T1, typename T2, typename T3>\ninternal::ValueArray3<T1, T2, T3> Values(T1 v1, T2 v2, T3 v3) {\n  return internal::ValueArray3<T1, T2, T3>(v1, v2, v3);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4>\ninternal::ValueArray4<T1, T2, T3, T4> Values(T1 v1, T2 v2, T3 v3, T4 v4) {\n  return internal::ValueArray4<T1, T2, T3, T4>(v1, v2, v3, v4);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5>\ninternal::ValueArray5<T1, T2, T3, T4, T5> Values(T1 v1, T2 v2, T3 v3, T4 v4,\n    T5 v5) {\n  return internal::ValueArray5<T1, T2, T3, T4, T5>(v1, v2, v3, v4, v5);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6>\ninternal::ValueArray6<T1, T2, T3, T4, T5, T6> Values(T1 v1, T2 v2, T3 v3,\n    T4 v4, T5 v5, T6 v6) {\n  return internal::ValueArray6<T1, T2, T3, T4, T5, T6>(v1, v2, v3, v4, v5, v6);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7>\ninternal::ValueArray7<T1, T2, T3, T4, T5, T6, T7> Values(T1 v1, T2 v2, T3 v3,\n    T4 v4, T5 v5, T6 v6, T7 v7) {\n  return internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7>(v1, v2, v3, v4, v5,\n      v6, v7);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8>\ninternal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8> Values(T1 v1, T2 v2,\n    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8) {\n  return internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8>(v1, v2, v3, v4,\n      v5, v6, v7, v8);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9>\ninternal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9> Values(T1 v1, T2 v2,\n    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9) {\n  return internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(v1, v2, v3,\n      v4, v5, v6, v7, v8, v9);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10>\ninternal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> Values(T1 v1,\n    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10) {\n  return internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(v1,\n      v2, v3, v4, v5, v6, v7, v8, v9, v10);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11>\ninternal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,\n    T11> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n    T10 v10, T11 v11) {\n  return internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,\n      T11>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12>\ninternal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n    T12> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n    T10 v10, T11 v11, T12 v12) {\n  return internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13>\ninternal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n    T13> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n    T10 v10, T11 v11, T12 v12, T13 v13) {\n  return internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14>\ninternal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) {\n  return internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,\n      v14);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15>\ninternal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,\n    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) {\n  return internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,\n      v13, v14, v15);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16>\ninternal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,\n    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,\n    T16 v16) {\n  return internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,\n      v12, v13, v14, v15, v16);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17>\ninternal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,\n    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,\n    T16 v16, T17 v17) {\n  return internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,\n      v11, v12, v13, v14, v15, v16, v17);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18>\ninternal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,\n    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,\n    T16 v16, T17 v17, T18 v18) {\n  return internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18>(v1, v2, v3, v4, v5, v6, v7, v8, v9,\n      v10, v11, v12, v13, v14, v15, v16, v17, v18);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19>\ninternal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,\n    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,\n    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19) {\n  return internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19>(v1, v2, v3, v4, v5, v6, v7, v8,\n      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20>\ninternal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20> Values(T1 v1, T2 v2, T3 v3, T4 v4,\n    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,\n    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20) {\n  return internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20>(v1, v2, v3, v4, v5, v6, v7,\n      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21>\ninternal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21> Values(T1 v1, T2 v2, T3 v3, T4 v4,\n    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,\n    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21) {\n  return internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21>(v1, v2, v3, v4, v5, v6,\n      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22>\ninternal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22> Values(T1 v1, T2 v2, T3 v3,\n    T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,\n    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,\n    T21 v21, T22 v22) {\n  return internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22>(v1, v2, v3, v4,\n      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,\n      v20, v21, v22);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23>\ninternal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> Values(T1 v1, T2 v2,\n    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,\n    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,\n    T21 v21, T22 v22, T23 v23) {\n  return internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23>(v1, v2, v3,\n      v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,\n      v20, v21, v22, v23);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24>\ninternal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Values(T1 v1, T2 v2,\n    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,\n    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,\n    T21 v21, T22 v22, T23 v23, T24 v24) {\n  return internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24>(v1, v2,\n      v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,\n      v19, v20, v21, v22, v23, v24);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25>\ninternal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Values(T1 v1,\n    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,\n    T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,\n    T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25) {\n  return internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25>(v1,\n      v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,\n      v18, v19, v20, v21, v22, v23, v24, v25);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26>\ninternal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n    T26> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n    T26 v26) {\n  return internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,\n      v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27>\ninternal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n    T27> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n    T26 v26, T27 v27) {\n  return internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,\n      v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28>\ninternal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n    T28> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n    T26 v26, T27 v27, T28 v28) {\n  return internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,\n      v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,\n      v28);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29>\ninternal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n    T26 v26, T27 v27, T28 v28, T29 v29) {\n  return internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,\n      v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,\n      v27, v28, v29);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30>\ninternal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,\n    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,\n    T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,\n    T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) {\n  return internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,\n      v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,\n      v26, v27, v28, v29, v30);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31>\ninternal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,\n    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,\n    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,\n    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) {\n  return internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,\n      v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,\n      v25, v26, v27, v28, v29, v30, v31);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32>\ninternal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,\n    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,\n    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,\n    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,\n    T32 v32) {\n  return internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32>(v1, v2, v3, v4, v5, v6, v7, v8, v9,\n      v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,\n      v24, v25, v26, v27, v28, v29, v30, v31, v32);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33>\ninternal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,\n    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,\n    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,\n    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,\n    T32 v32, T33 v33) {\n  return internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33>(v1, v2, v3, v4, v5, v6, v7, v8,\n      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,\n      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34>\ninternal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,\n    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,\n    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,\n    T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,\n    T31 v31, T32 v32, T33 v33, T34 v34) {\n  return internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34>(v1, v2, v3, v4, v5, v6, v7,\n      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,\n      v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35>\ninternal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35> Values(T1 v1, T2 v2, T3 v3, T4 v4,\n    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,\n    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,\n    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,\n    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35) {\n  return internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35>(v1, v2, v3, v4, v5, v6,\n      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,\n      v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36>\ninternal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36> Values(T1 v1, T2 v2, T3 v3, T4 v4,\n    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,\n    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,\n    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,\n    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36) {\n  return internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36>(v1, v2, v3, v4,\n      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,\n      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,\n      v34, v35, v36);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37>\ninternal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36, T37> Values(T1 v1, T2 v2, T3 v3,\n    T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,\n    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,\n    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,\n    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,\n    T37 v37) {\n  return internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37>(v1, v2, v3,\n      v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,\n      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,\n      v34, v35, v36, v37);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38>\ninternal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Values(T1 v1, T2 v2,\n    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,\n    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,\n    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,\n    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,\n    T37 v37, T38 v38) {\n  return internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38>(v1, v2,\n      v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,\n      v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32,\n      v33, v34, v35, v36, v37, v38);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39>\ninternal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Values(T1 v1, T2 v2,\n    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,\n    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,\n    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,\n    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,\n    T37 v37, T38 v38, T39 v39) {\n  return internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39>(v1,\n      v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,\n      v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31,\n      v32, v33, v34, v35, v36, v37, v38, v39);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40>\ninternal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Values(T1 v1,\n    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,\n    T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,\n    T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27,\n    T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35,\n    T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) {\n  return internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,\n      T40>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,\n      v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29,\n      v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41>\ninternal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,\n    T41> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41) {\n  return internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,\n      T40, T41>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,\n      v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28,\n      v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42>\ninternal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,\n    T42> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,\n    T42 v42) {\n  return internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,\n      T40, T41, T42>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,\n      v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,\n      v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41,\n      v42);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43>\ninternal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,\n    T43> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,\n    T42 v42, T43 v43) {\n  return internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,\n      T40, T41, T42, T43>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,\n      v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,\n      v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40,\n      v41, v42, v43);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44>\ninternal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n    T44> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,\n    T42 v42, T43 v43, T44 v44) {\n  return internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,\n      T40, T41, T42, T43, T44>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,\n      v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,\n      v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39,\n      v40, v41, v42, v43, v44);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45>\ninternal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n    T44, T45> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,\n    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,\n    T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,\n    T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,\n    T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,\n    T41 v41, T42 v42, T43 v43, T44 v44, T45 v45) {\n  return internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,\n      T40, T41, T42, T43, T44, T45>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,\n      v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,\n      v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38,\n      v39, v40, v41, v42, v43, v44, v45);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46>\ninternal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n    T44, T45, T46> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,\n    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,\n    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,\n    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,\n    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,\n    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) {\n  return internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,\n      T40, T41, T42, T43, T44, T45, T46>(v1, v2, v3, v4, v5, v6, v7, v8, v9,\n      v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,\n      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,\n      v38, v39, v40, v41, v42, v43, v44, v45, v46);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47>\ninternal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n    T44, T45, T46, T47> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,\n    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,\n    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,\n    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,\n    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,\n    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) {\n  return internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,\n      T40, T41, T42, T43, T44, T45, T46, T47>(v1, v2, v3, v4, v5, v6, v7, v8,\n      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,\n      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,\n      v38, v39, v40, v41, v42, v43, v44, v45, v46, v47);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47, typename T48>\ninternal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n    T44, T45, T46, T47, T48> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,\n    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,\n    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,\n    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,\n    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,\n    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47,\n    T48 v48) {\n  return internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,\n      T40, T41, T42, T43, T44, T45, T46, T47, T48>(v1, v2, v3, v4, v5, v6, v7,\n      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,\n      v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36,\n      v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47, typename T48, typename T49>\ninternal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n    T44, T45, T46, T47, T48, T49> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,\n    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,\n    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,\n    T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,\n    T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38,\n    T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46,\n    T47 v47, T48 v48, T49 v49) {\n  return internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,\n      T40, T41, T42, T43, T44, T45, T46, T47, T48, T49>(v1, v2, v3, v4, v5, v6,\n      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,\n      v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35,\n      v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47, typename T48, typename T49, typename T50>\ninternal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n    T44, T45, T46, T47, T48, T49, T50> Values(T1 v1, T2 v2, T3 v3, T4 v4,\n    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,\n    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,\n    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,\n    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37,\n    T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45,\n    T46 v46, T47 v47, T48 v48, T49 v49, T50 v50) {\n  return internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,\n      T40, T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>(v1, v2, v3, v4,\n      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,\n      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,\n      v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47,\n      v48, v49, v50);\n}\n\n// Bool() allows generating tests with parameters in a set of (false, true).\n//\n// Synopsis:\n// Bool()\n//   - returns a generator producing sequences with elements {false, true}.\n//\n// It is useful when testing code that depends on Boolean flags. Combinations\n// of multiple flags can be tested when several Bool()'s are combined using\n// Combine() function.\n//\n// In the following example all tests in the test case FlagDependentTest\n// will be instantiated twice with parameters false and true.\n//\n// class FlagDependentTest : public testing::TestWithParam<bool> {\n//   virtual void SetUp() {\n//     external_flag = GetParam();\n//   }\n// }\n// INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool());\n//\ninline internal::ParamGenerator<bool> Bool() {\n  return Values(false, true);\n}\n\n# if GTEST_HAS_COMBINE\n// Combine() allows the user to combine two or more sequences to produce\n// values of a Cartesian product of those sequences' elements.\n//\n// Synopsis:\n// Combine(gen1, gen2, ..., genN)\n//   - returns a generator producing sequences with elements coming from\n//     the Cartesian product of elements from the sequences generated by\n//     gen1, gen2, ..., genN. The sequence elements will have a type of\n//     tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types\n//     of elements from sequences produces by gen1, gen2, ..., genN.\n//\n// Combine can have up to 10 arguments. This number is currently limited\n// by the maximum number of elements in the tuple implementation used by Google\n// Test.\n//\n// Example:\n//\n// This will instantiate tests in test case AnimalTest each one with\n// the parameter values tuple(\"cat\", BLACK), tuple(\"cat\", WHITE),\n// tuple(\"dog\", BLACK), and tuple(\"dog\", WHITE):\n//\n// enum Color { BLACK, GRAY, WHITE };\n// class AnimalTest\n//     : public testing::TestWithParam<tuple<const char*, Color> > {...};\n//\n// TEST_P(AnimalTest, AnimalLooksNice) {...}\n//\n// INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest,\n//                         Combine(Values(\"cat\", \"dog\"),\n//                                 Values(BLACK, WHITE)));\n//\n// This will instantiate tests in FlagDependentTest with all variations of two\n// Boolean flags:\n//\n// class FlagDependentTest\n//     : public testing::TestWithParam<tuple(bool, bool)> > {\n//   virtual void SetUp() {\n//     // Assigns external_flag_1 and external_flag_2 values from the tuple.\n//     tie(external_flag_1, external_flag_2) = GetParam();\n//   }\n// };\n//\n// TEST_P(FlagDependentTest, TestFeature1) {\n//   // Test your code using external_flag_1 and external_flag_2 here.\n// }\n// INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest,\n//                         Combine(Bool(), Bool()));\n//\ntemplate <typename Generator1, typename Generator2>\ninternal::CartesianProductHolder2<Generator1, Generator2> Combine(\n    const Generator1& g1, const Generator2& g2) {\n  return internal::CartesianProductHolder2<Generator1, Generator2>(\n      g1, g2);\n}\n\ntemplate <typename Generator1, typename Generator2, typename Generator3>\ninternal::CartesianProductHolder3<Generator1, Generator2, Generator3> Combine(\n    const Generator1& g1, const Generator2& g2, const Generator3& g3) {\n  return internal::CartesianProductHolder3<Generator1, Generator2, Generator3>(\n      g1, g2, g3);\n}\n\ntemplate <typename Generator1, typename Generator2, typename Generator3,\n    typename Generator4>\ninternal::CartesianProductHolder4<Generator1, Generator2, Generator3,\n    Generator4> Combine(\n    const Generator1& g1, const Generator2& g2, const Generator3& g3,\n        const Generator4& g4) {\n  return internal::CartesianProductHolder4<Generator1, Generator2, Generator3,\n      Generator4>(\n      g1, g2, g3, g4);\n}\n\ntemplate <typename Generator1, typename Generator2, typename Generator3,\n    typename Generator4, typename Generator5>\ninternal::CartesianProductHolder5<Generator1, Generator2, Generator3,\n    Generator4, Generator5> Combine(\n    const Generator1& g1, const Generator2& g2, const Generator3& g3,\n        const Generator4& g4, const Generator5& g5) {\n  return internal::CartesianProductHolder5<Generator1, Generator2, Generator3,\n      Generator4, Generator5>(\n      g1, g2, g3, g4, g5);\n}\n\ntemplate <typename Generator1, typename Generator2, typename Generator3,\n    typename Generator4, typename Generator5, typename Generator6>\ninternal::CartesianProductHolder6<Generator1, Generator2, Generator3,\n    Generator4, Generator5, Generator6> Combine(\n    const Generator1& g1, const Generator2& g2, const Generator3& g3,\n        const Generator4& g4, const Generator5& g5, const Generator6& g6) {\n  return internal::CartesianProductHolder6<Generator1, Generator2, Generator3,\n      Generator4, Generator5, Generator6>(\n      g1, g2, g3, g4, g5, g6);\n}\n\ntemplate <typename Generator1, typename Generator2, typename Generator3,\n    typename Generator4, typename Generator5, typename Generator6,\n    typename Generator7>\ninternal::CartesianProductHolder7<Generator1, Generator2, Generator3,\n    Generator4, Generator5, Generator6, Generator7> Combine(\n    const Generator1& g1, const Generator2& g2, const Generator3& g3,\n        const Generator4& g4, const Generator5& g5, const Generator6& g6,\n        const Generator7& g7) {\n  return internal::CartesianProductHolder7<Generator1, Generator2, Generator3,\n      Generator4, Generator5, Generator6, Generator7>(\n      g1, g2, g3, g4, g5, g6, g7);\n}\n\ntemplate <typename Generator1, typename Generator2, typename Generator3,\n    typename Generator4, typename Generator5, typename Generator6,\n    typename Generator7, typename Generator8>\ninternal::CartesianProductHolder8<Generator1, Generator2, Generator3,\n    Generator4, Generator5, Generator6, Generator7, Generator8> Combine(\n    const Generator1& g1, const Generator2& g2, const Generator3& g3,\n        const Generator4& g4, const Generator5& g5, const Generator6& g6,\n        const Generator7& g7, const Generator8& g8) {\n  return internal::CartesianProductHolder8<Generator1, Generator2, Generator3,\n      Generator4, Generator5, Generator6, Generator7, Generator8>(\n      g1, g2, g3, g4, g5, g6, g7, g8);\n}\n\ntemplate <typename Generator1, typename Generator2, typename Generator3,\n    typename Generator4, typename Generator5, typename Generator6,\n    typename Generator7, typename Generator8, typename Generator9>\ninternal::CartesianProductHolder9<Generator1, Generator2, Generator3,\n    Generator4, Generator5, Generator6, Generator7, Generator8,\n    Generator9> Combine(\n    const Generator1& g1, const Generator2& g2, const Generator3& g3,\n        const Generator4& g4, const Generator5& g5, const Generator6& g6,\n        const Generator7& g7, const Generator8& g8, const Generator9& g9) {\n  return internal::CartesianProductHolder9<Generator1, Generator2, Generator3,\n      Generator4, Generator5, Generator6, Generator7, Generator8, Generator9>(\n      g1, g2, g3, g4, g5, g6, g7, g8, g9);\n}\n\ntemplate <typename Generator1, typename Generator2, typename Generator3,\n    typename Generator4, typename Generator5, typename Generator6,\n    typename Generator7, typename Generator8, typename Generator9,\n    typename Generator10>\ninternal::CartesianProductHolder10<Generator1, Generator2, Generator3,\n    Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,\n    Generator10> Combine(\n    const Generator1& g1, const Generator2& g2, const Generator3& g3,\n        const Generator4& g4, const Generator5& g5, const Generator6& g6,\n        const Generator7& g7, const Generator8& g8, const Generator9& g9,\n        const Generator10& g10) {\n  return internal::CartesianProductHolder10<Generator1, Generator2, Generator3,\n      Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,\n      Generator10>(\n      g1, g2, g3, g4, g5, g6, g7, g8, g9, g10);\n}\n# endif  // GTEST_HAS_COMBINE\n\n\n\n# define TEST_P(test_case_name, test_name) \\\n  class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \\\n      : public test_case_name { \\\n   public: \\\n    GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \\\n    virtual void TestBody(); \\\n   private: \\\n    static int AddToRegistry() { \\\n      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \\\n          GetTestCasePatternHolder<test_case_name>(\\\n              #test_case_name, __FILE__, __LINE__)->AddTestPattern(\\\n                  #test_case_name, \\\n                  #test_name, \\\n                  new ::testing::internal::TestMetaFactory< \\\n                      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>()); \\\n      return 0; \\\n    } \\\n    static int gtest_registering_dummy_; \\\n    GTEST_DISALLOW_COPY_AND_ASSIGN_(\\\n        GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \\\n  }; \\\n  int GTEST_TEST_CLASS_NAME_(test_case_name, \\\n                             test_name)::gtest_registering_dummy_ = \\\n      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \\\n  void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()\n\n# define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator) \\\n  ::testing::internal::ParamGenerator<test_case_name::ParamType> \\\n      gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \\\n  int gtest_##prefix##test_case_name##_dummy_ = \\\n      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \\\n          GetTestCasePatternHolder<test_case_name>(\\\n              #test_case_name, __FILE__, __LINE__)->AddTestCaseInstantiation(\\\n                  #prefix, \\\n                  &gtest_##prefix##test_case_name##_EvalGenerator_, \\\n                  __FILE__, __LINE__)\n\n}  // namespace testing\n\n#endif  // GTEST_HAS_PARAM_TEST\n\n#endif  // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_\n// Copyright 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n//\n// Google C++ Testing Framework definitions useful in production code.\n\n#ifndef GTEST_INCLUDE_GTEST_GTEST_PROD_H_\n#define GTEST_INCLUDE_GTEST_GTEST_PROD_H_\n\n// When you need to test the private or protected members of a class,\n// use the FRIEND_TEST macro to declare your tests as friends of the\n// class.  For example:\n//\n// class MyClass {\n//  private:\n//   void MyMethod();\n//   FRIEND_TEST(MyClassTest, MyMethod);\n// };\n//\n// class MyClassTest : public testing::Test {\n//   // ...\n// };\n//\n// TEST_F(MyClassTest, MyMethod) {\n//   // Can call MyClass::MyMethod() here.\n// }\n\n#define FRIEND_TEST(test_case_name, test_name)\\\nfriend class test_case_name##_##test_name##_Test\n\n#endif  // GTEST_INCLUDE_GTEST_GTEST_PROD_H_\n// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: mheule@google.com (Markus Heule)\n//\n\n#ifndef GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_\n#define GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_\n\n#include <iosfwd>\n#include <vector>\n\nnamespace testing {\n\n// A copyable object representing the result of a test part (i.e. an\n// assertion or an explicit FAIL(), ADD_FAILURE(), or SUCCESS()).\n//\n// Don't inherit from TestPartResult as its destructor is not virtual.\nclass GTEST_API_ TestPartResult {\n public:\n  // The possible outcomes of a test part (i.e. an assertion or an\n  // explicit SUCCEED(), FAIL(), or ADD_FAILURE()).\n  enum Type {\n    kSuccess,          // Succeeded.\n    kNonFatalFailure,  // Failed but the test can continue.\n    kFatalFailure      // Failed and the test should be terminated.\n  };\n\n  // C'tor.  TestPartResult does NOT have a default constructor.\n  // Always use this constructor (with parameters) to create a\n  // TestPartResult object.\n  TestPartResult(Type a_type,\n                 const char* a_file_name,\n                 int a_line_number,\n                 const char* a_message)\n      : type_(a_type),\n        file_name_(a_file_name),\n        line_number_(a_line_number),\n        summary_(ExtractSummary(a_message)),\n        message_(a_message) {\n  }\n\n  // Gets the outcome of the test part.\n  Type type() const { return type_; }\n\n  // Gets the name of the source file where the test part took place, or\n  // NULL if it's unknown.\n  const char* file_name() const { return file_name_.c_str(); }\n\n  // Gets the line in the source file where the test part took place,\n  // or -1 if it's unknown.\n  int line_number() const { return line_number_; }\n\n  // Gets the summary of the failure message.\n  const char* summary() const { return summary_.c_str(); }\n\n  // Gets the message associated with the test part.\n  const char* message() const { return message_.c_str(); }\n\n  // Returns true iff the test part passed.\n  bool passed() const { return type_ == kSuccess; }\n\n  // Returns true iff the test part failed.\n  bool failed() const { return type_ != kSuccess; }\n\n  // Returns true iff the test part non-fatally failed.\n  bool nonfatally_failed() const { return type_ == kNonFatalFailure; }\n\n  // Returns true iff the test part fatally failed.\n  bool fatally_failed() const { return type_ == kFatalFailure; }\n private:\n  Type type_;\n\n  // Gets the summary of the failure message by omitting the stack\n  // trace in it.\n  static internal::String ExtractSummary(const char* message);\n\n  // The name of the source file where the test part took place, or\n  // NULL if the source file is unknown.\n  internal::String file_name_;\n  // The line in the source file where the test part took place, or -1\n  // if the line number is unknown.\n  int line_number_;\n  internal::String summary_;  // The test failure summary.\n  internal::String message_;  // The test failure message.\n};\n\n// Prints a TestPartResult object.\nstd::ostream& operator<<(std::ostream& os, const TestPartResult& result);\n\n// An array of TestPartResult objects.\n//\n// Don't inherit from TestPartResultArray as its destructor is not\n// virtual.\nclass GTEST_API_ TestPartResultArray {\n public:\n  TestPartResultArray() {}\n\n  // Appends the given TestPartResult to the array.\n  void Append(const TestPartResult& result);\n\n  // Returns the TestPartResult at the given index (0-based).\n  const TestPartResult& GetTestPartResult(int index) const;\n\n  // Returns the number of TestPartResult objects in the array.\n  int size() const;\n\n private:\n  std::vector<TestPartResult> array_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestPartResultArray);\n};\n\n// This interface knows how to report a test part result.\nclass TestPartResultReporterInterface {\n public:\n  virtual ~TestPartResultReporterInterface() {}\n\n  virtual void ReportTestPartResult(const TestPartResult& result) = 0;\n};\n\nnamespace internal {\n\n// This helper class is used by {ASSERT|EXPECT}_NO_FATAL_FAILURE to check if a\n// statement generates new fatal failures. To do so it registers itself as the\n// current test part result reporter. Besides checking if fatal failures were\n// reported, it only delegates the reporting to the former result reporter.\n// The original result reporter is restored in the destructor.\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\nclass GTEST_API_ HasNewFatalFailureHelper\n    : public TestPartResultReporterInterface {\n public:\n  HasNewFatalFailureHelper();\n  virtual ~HasNewFatalFailureHelper();\n  virtual void ReportTestPartResult(const TestPartResult& result);\n  bool has_new_fatal_failure() const { return has_new_fatal_failure_; }\n private:\n  bool has_new_fatal_failure_;\n  TestPartResultReporterInterface* original_reporter_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(HasNewFatalFailureHelper);\n};\n\n}  // namespace internal\n\n}  // namespace testing\n\n#endif  // GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_\n// Copyright 2008 Google Inc.\n// All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n\n#ifndef GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_\n#define GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_\n\n// This header implements typed tests and type-parameterized tests.\n\n// Typed (aka type-driven) tests repeat the same test for types in a\n// list.  You must know which types you want to test with when writing\n// typed tests. Here's how you do it:\n\n#if 0\n\n// First, define a fixture class template.  It should be parameterized\n// by a type.  Remember to derive it from testing::Test.\ntemplate <typename T>\nclass FooTest : public testing::Test {\n public:\n  ...\n  typedef std::list<T> List;\n  static T shared_;\n  T value_;\n};\n\n// Next, associate a list of types with the test case, which will be\n// repeated for each type in the list.  The typedef is necessary for\n// the macro to parse correctly.\ntypedef testing::Types<char, int, unsigned int> MyTypes;\nTYPED_TEST_CASE(FooTest, MyTypes);\n\n// If the type list contains only one type, you can write that type\n// directly without Types<...>:\n//   TYPED_TEST_CASE(FooTest, int);\n\n// Then, use TYPED_TEST() instead of TEST_F() to define as many typed\n// tests for this test case as you want.\nTYPED_TEST(FooTest, DoesBlah) {\n  // Inside a test, refer to TypeParam to get the type parameter.\n  // Since we are inside a derived class template, C++ requires use to\n  // visit the members of FooTest via 'this'.\n  TypeParam n = this->value_;\n\n  // To visit static members of the fixture, add the TestFixture::\n  // prefix.\n  n += TestFixture::shared_;\n\n  // To refer to typedefs in the fixture, add the \"typename\n  // TestFixture::\" prefix.\n  typename TestFixture::List values;\n  values.push_back(n);\n  ...\n}\n\nTYPED_TEST(FooTest, HasPropertyA) { ... }\n\n#endif  // 0\n\n// Type-parameterized tests are abstract test patterns parameterized\n// by a type.  Compared with typed tests, type-parameterized tests\n// allow you to define the test pattern without knowing what the type\n// parameters are.  The defined pattern can be instantiated with\n// different types any number of times, in any number of translation\n// units.\n//\n// If you are designing an interface or concept, you can define a\n// suite of type-parameterized tests to verify properties that any\n// valid implementation of the interface/concept should have.  Then,\n// each implementation can easily instantiate the test suite to verify\n// that it conforms to the requirements, without having to write\n// similar tests repeatedly.  Here's an example:\n\n#if 0\n\n// First, define a fixture class template.  It should be parameterized\n// by a type.  Remember to derive it from testing::Test.\ntemplate <typename T>\nclass FooTest : public testing::Test {\n  ...\n};\n\n// Next, declare that you will define a type-parameterized test case\n// (the _P suffix is for \"parameterized\" or \"pattern\", whichever you\n// prefer):\nTYPED_TEST_CASE_P(FooTest);\n\n// Then, use TYPED_TEST_P() to define as many type-parameterized tests\n// for this type-parameterized test case as you want.\nTYPED_TEST_P(FooTest, DoesBlah) {\n  // Inside a test, refer to TypeParam to get the type parameter.\n  TypeParam n = 0;\n  ...\n}\n\nTYPED_TEST_P(FooTest, HasPropertyA) { ... }\n\n// Now the tricky part: you need to register all test patterns before\n// you can instantiate them.  The first argument of the macro is the\n// test case name; the rest are the names of the tests in this test\n// case.\nREGISTER_TYPED_TEST_CASE_P(FooTest,\n                           DoesBlah, HasPropertyA);\n\n// Finally, you are free to instantiate the pattern with the types you\n// want.  If you put the above code in a header file, you can #include\n// it in multiple C++ source files and instantiate it multiple times.\n//\n// To distinguish different instances of the pattern, the first\n// argument to the INSTANTIATE_* macro is a prefix that will be added\n// to the actual test case name.  Remember to pick unique prefixes for\n// different instances.\ntypedef testing::Types<char, int, unsigned int> MyTypes;\nINSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes);\n\n// If the type list contains only one type, you can write that type\n// directly without Types<...>:\n//   INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, int);\n\n#endif  // 0\n\n\n// Implements typed tests.\n\n#if GTEST_HAS_TYPED_TEST\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// Expands to the name of the typedef for the type parameters of the\n// given test case.\n# define GTEST_TYPE_PARAMS_(TestCaseName) gtest_type_params_##TestCaseName##_\n\n// The 'Types' template argument below must have spaces around it\n// since some compilers may choke on '>>' when passing a template\n// instance (e.g. Types<int>)\n# define TYPED_TEST_CASE(CaseName, Types) \\\n  typedef ::testing::internal::TypeList< Types >::type \\\n      GTEST_TYPE_PARAMS_(CaseName)\n\n# define TYPED_TEST(CaseName, TestName) \\\n  template <typename gtest_TypeParam_> \\\n  class GTEST_TEST_CLASS_NAME_(CaseName, TestName) \\\n      : public CaseName<gtest_TypeParam_> { \\\n   private: \\\n    typedef CaseName<gtest_TypeParam_> TestFixture; \\\n    typedef gtest_TypeParam_ TypeParam; \\\n    virtual void TestBody(); \\\n  }; \\\n  bool gtest_##CaseName##_##TestName##_registered_ GTEST_ATTRIBUTE_UNUSED_ = \\\n      ::testing::internal::TypeParameterizedTest< \\\n          CaseName, \\\n          ::testing::internal::TemplateSel< \\\n              GTEST_TEST_CLASS_NAME_(CaseName, TestName)>, \\\n          GTEST_TYPE_PARAMS_(CaseName)>::Register(\\\n              \"\", #CaseName, #TestName, 0); \\\n  template <typename gtest_TypeParam_> \\\n  void GTEST_TEST_CLASS_NAME_(CaseName, TestName)<gtest_TypeParam_>::TestBody()\n\n#endif  // GTEST_HAS_TYPED_TEST\n\n// Implements type-parameterized tests.\n\n#if GTEST_HAS_TYPED_TEST_P\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// Expands to the namespace name that the type-parameterized tests for\n// the given type-parameterized test case are defined in.  The exact\n// name of the namespace is subject to change without notice.\n# define GTEST_CASE_NAMESPACE_(TestCaseName) \\\n  gtest_case_##TestCaseName##_\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// Expands to the name of the variable used to remember the names of\n// the defined tests in the given test case.\n# define GTEST_TYPED_TEST_CASE_P_STATE_(TestCaseName) \\\n  gtest_typed_test_case_p_state_##TestCaseName##_\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE DIRECTLY.\n//\n// Expands to the name of the variable used to remember the names of\n// the registered tests in the given test case.\n# define GTEST_REGISTERED_TEST_NAMES_(TestCaseName) \\\n  gtest_registered_test_names_##TestCaseName##_\n\n// The variables defined in the type-parameterized test macros are\n// static as typically these macros are used in a .h file that can be\n// #included in multiple translation units linked together.\n# define TYPED_TEST_CASE_P(CaseName) \\\n  static ::testing::internal::TypedTestCasePState \\\n      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName)\n\n# define TYPED_TEST_P(CaseName, TestName) \\\n  namespace GTEST_CASE_NAMESPACE_(CaseName) { \\\n  template <typename gtest_TypeParam_> \\\n  class TestName : public CaseName<gtest_TypeParam_> { \\\n   private: \\\n    typedef CaseName<gtest_TypeParam_> TestFixture; \\\n    typedef gtest_TypeParam_ TypeParam; \\\n    virtual void TestBody(); \\\n  }; \\\n  static bool gtest_##TestName##_defined_ GTEST_ATTRIBUTE_UNUSED_ = \\\n      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).AddTestName(\\\n          __FILE__, __LINE__, #CaseName, #TestName); \\\n  } \\\n  template <typename gtest_TypeParam_> \\\n  void GTEST_CASE_NAMESPACE_(CaseName)::TestName<gtest_TypeParam_>::TestBody()\n\n# define REGISTER_TYPED_TEST_CASE_P(CaseName, ...) \\\n  namespace GTEST_CASE_NAMESPACE_(CaseName) { \\\n  typedef ::testing::internal::Templates<__VA_ARGS__>::type gtest_AllTests_; \\\n  } \\\n  static const char* const GTEST_REGISTERED_TEST_NAMES_(CaseName) = \\\n      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).VerifyRegisteredTestNames(\\\n          __FILE__, __LINE__, #__VA_ARGS__)\n\n// The 'Types' template argument below must have spaces around it\n// since some compilers may choke on '>>' when passing a template\n// instance (e.g. Types<int>)\n# define INSTANTIATE_TYPED_TEST_CASE_P(Prefix, CaseName, Types) \\\n  bool gtest_##Prefix##_##CaseName GTEST_ATTRIBUTE_UNUSED_ = \\\n      ::testing::internal::TypeParameterizedTestCase<CaseName, \\\n          GTEST_CASE_NAMESPACE_(CaseName)::gtest_AllTests_, \\\n          ::testing::internal::TypeList< Types >::type>::Register(\\\n              #Prefix, #CaseName, GTEST_REGISTERED_TEST_NAMES_(CaseName))\n\n#endif  // GTEST_HAS_TYPED_TEST_P\n\n#endif  // GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_\n\n// Depending on the platform, different string classes are available.\n// On Linux, in addition to ::std::string, Google also makes use of\n// class ::string, which has the same interface as ::std::string, but\n// has a different implementation.\n//\n// The user can define GTEST_HAS_GLOBAL_STRING to 1 to indicate that\n// ::string is available AND is a distinct type to ::std::string, or\n// define it to 0 to indicate otherwise.\n//\n// If the user's ::std::string and ::string are the same class due to\n// aliasing, he should define GTEST_HAS_GLOBAL_STRING to 0.\n//\n// If the user doesn't define GTEST_HAS_GLOBAL_STRING, it is defined\n// heuristically.\n\nnamespace testing {\n\n// Declares the flags.\n\n// This flag temporary enables the disabled tests.\nGTEST_DECLARE_bool_(also_run_disabled_tests);\n\n// This flag brings the debugger on an assertion failure.\nGTEST_DECLARE_bool_(break_on_failure);\n\n// This flag controls whether Google Test catches all test-thrown exceptions\n// and logs them as failures.\nGTEST_DECLARE_bool_(catch_exceptions);\n\n// This flag enables using colors in terminal output. Available values are\n// \"yes\" to enable colors, \"no\" (disable colors), or \"auto\" (the default)\n// to let Google Test decide.\nGTEST_DECLARE_string_(color);\n\n// This flag sets up the filter to select by name using a glob pattern\n// the tests to run. If the filter is not given all tests are executed.\nGTEST_DECLARE_string_(filter);\n\n// This flag causes the Google Test to list tests. None of the tests listed\n// are actually run if the flag is provided.\nGTEST_DECLARE_bool_(list_tests);\n\n// This flag controls whether Google Test emits a detailed XML report to a file\n// in addition to its normal textual output.\nGTEST_DECLARE_string_(output);\n\n// This flags control whether Google Test prints the elapsed time for each\n// test.\nGTEST_DECLARE_bool_(print_time);\n\n// This flag specifies the random number seed.\nGTEST_DECLARE_int32_(random_seed);\n\n// This flag sets how many times the tests are repeated. The default value\n// is 1. If the value is -1 the tests are repeating forever.\nGTEST_DECLARE_int32_(repeat);\n\n// This flag controls whether Google Test includes Google Test internal\n// stack frames in failure stack traces.\nGTEST_DECLARE_bool_(show_internal_stack_frames);\n\n// When this flag is specified, tests' order is randomized on every iteration.\nGTEST_DECLARE_bool_(shuffle);\n\n// This flag specifies the maximum number of stack frames to be\n// printed in a failure message.\nGTEST_DECLARE_int32_(stack_trace_depth);\n\n// When this flag is specified, a failed assertion will throw an\n// exception if exceptions are enabled, or exit the program with a\n// non-zero code otherwise.\nGTEST_DECLARE_bool_(throw_on_failure);\n\n// When this flag is set with a \"host:port\" string, on supported\n// platforms test results are streamed to the specified port on\n// the specified host machine.\nGTEST_DECLARE_string_(stream_result_to);\n\n// The upper limit for valid stack trace depths.\nconst int kMaxStackTraceDepth = 100;\n\nnamespace internal {\n\nclass AssertHelper;\nclass DefaultGlobalTestPartResultReporter;\nclass ExecDeathTest;\nclass NoExecDeathTest;\nclass FinalSuccessChecker;\nclass GTestFlagSaver;\nclass TestResultAccessor;\nclass TestEventListenersAccessor;\nclass TestEventRepeater;\nclass WindowsDeathTest;\nclass UnitTestImpl* GetUnitTestImpl();\nvoid ReportFailureInUnknownLocation(TestPartResult::Type result_type,\n                                    const String& message);\n\n// Converts a streamable value to a String.  A NULL pointer is\n// converted to \"(null)\".  When the input value is a ::string,\n// ::std::string, ::wstring, or ::std::wstring object, each NUL\n// character in it is replaced with \"\\\\0\".\n// Declared in gtest-internal.h but defined here, so that it has access\n// to the definition of the Message class, required by the ARM\n// compiler.\ntemplate <typename T>\nString StreamableToString(const T& streamable) {\n  return (Message() << streamable).GetString();\n}\n\n}  // namespace internal\n\n// The friend relationship of some of these classes is cyclic.\n// If we don't forward declare them the compiler might confuse the classes\n// in friendship clauses with same named classes on the scope.\nclass Test;\nclass TestCase;\nclass TestInfo;\nclass UnitTest;\n\n// A class for indicating whether an assertion was successful.  When\n// the assertion wasn't successful, the AssertionResult object\n// remembers a non-empty message that describes how it failed.\n//\n// To create an instance of this class, use one of the factory functions\n// (AssertionSuccess() and AssertionFailure()).\n//\n// This class is useful for two purposes:\n//   1. Defining predicate functions to be used with Boolean test assertions\n//      EXPECT_TRUE/EXPECT_FALSE and their ASSERT_ counterparts\n//   2. Defining predicate-format functions to be\n//      used with predicate assertions (ASSERT_PRED_FORMAT*, etc).\n//\n// For example, if you define IsEven predicate:\n//\n//   testing::AssertionResult IsEven(int n) {\n//     if ((n % 2) == 0)\n//       return testing::AssertionSuccess();\n//     else\n//       return testing::AssertionFailure() << n << \" is odd\";\n//   }\n//\n// Then the failed expectation EXPECT_TRUE(IsEven(Fib(5)))\n// will print the message\n//\n//   Value of: IsEven(Fib(5))\n//     Actual: false (5 is odd)\n//   Expected: true\n//\n// instead of a more opaque\n//\n//   Value of: IsEven(Fib(5))\n//     Actual: false\n//   Expected: true\n//\n// in case IsEven is a simple Boolean predicate.\n//\n// If you expect your predicate to be reused and want to support informative\n// messages in EXPECT_FALSE and ASSERT_FALSE (negative assertions show up\n// about half as often as positive ones in our tests), supply messages for\n// both success and failure cases:\n//\n//   testing::AssertionResult IsEven(int n) {\n//     if ((n % 2) == 0)\n//       return testing::AssertionSuccess() << n << \" is even\";\n//     else\n//       return testing::AssertionFailure() << n << \" is odd\";\n//   }\n//\n// Then a statement EXPECT_FALSE(IsEven(Fib(6))) will print\n//\n//   Value of: IsEven(Fib(6))\n//     Actual: true (8 is even)\n//   Expected: false\n//\n// NB: Predicates that support negative Boolean assertions have reduced\n// performance in positive ones so be careful not to use them in tests\n// that have lots (tens of thousands) of positive Boolean assertions.\n//\n// To use this class with EXPECT_PRED_FORMAT assertions such as:\n//\n//   // Verifies that Foo() returns an even number.\n//   EXPECT_PRED_FORMAT1(IsEven, Foo());\n//\n// you need to define:\n//\n//   testing::AssertionResult IsEven(const char* expr, int n) {\n//     if ((n % 2) == 0)\n//       return testing::AssertionSuccess();\n//     else\n//       return testing::AssertionFailure()\n//         << \"Expected: \" << expr << \" is even\\n  Actual: it's \" << n;\n//   }\n//\n// If Foo() returns 5, you will see the following message:\n//\n//   Expected: Foo() is even\n//     Actual: it's 5\n//\nclass GTEST_API_ AssertionResult {\n public:\n  // Copy constructor.\n  // Used in EXPECT_TRUE/FALSE(assertion_result).\n  AssertionResult(const AssertionResult& other);\n  // Used in the EXPECT_TRUE/FALSE(bool_expression).\n  explicit AssertionResult(bool success) : success_(success) {}\n\n  // Returns true iff the assertion succeeded.\n  operator bool() const { return success_; }  // NOLINT\n\n  // Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.\n  AssertionResult operator!() const;\n\n  // Returns the text streamed into this AssertionResult. Test assertions\n  // use it when they fail (i.e., the predicate's outcome doesn't match the\n  // assertion's expectation). When nothing has been streamed into the\n  // object, returns an empty string.\n  const char* message() const {\n    return message_.get() != NULL ?  message_->c_str() : \"\";\n  }\n  // TODO(vladl@google.com): Remove this after making sure no clients use it.\n  // Deprecated; use message() instead.\n  const char* failure_message() const { return message(); }\n\n  // Streams a custom failure message into this object.\n  template <typename T> AssertionResult& operator<<(const T& value) {\n    AppendMessage(Message() << value);\n    return *this;\n  }\n\n  // Allows streaming basic output manipulators such as endl or flush into\n  // this object.\n  AssertionResult& operator<<(\n      ::std::ostream& (*basic_manipulator)(::std::ostream& stream)) {\n    AppendMessage(Message() << basic_manipulator);\n    return *this;\n  }\n\n private:\n  // Appends the contents of message to message_.\n  void AppendMessage(const Message& a_message) {\n    if (message_.get() == NULL)\n      message_.reset(new ::std::string);\n    message_->append(a_message.GetString().c_str());\n  }\n\n  // Stores result of the assertion predicate.\n  bool success_;\n  // Stores the message describing the condition in case the expectation\n  // construct is not satisfied with the predicate's outcome.\n  // Referenced via a pointer to avoid taking too much stack frame space\n  // with test assertions.\n  internal::scoped_ptr< ::std::string> message_;\n\n  GTEST_DISALLOW_ASSIGN_(AssertionResult);\n};\n\n// Makes a successful assertion result.\nGTEST_API_ AssertionResult AssertionSuccess();\n\n// Makes a failed assertion result.\nGTEST_API_ AssertionResult AssertionFailure();\n\n// Makes a failed assertion result with the given failure message.\n// Deprecated; use AssertionFailure() << msg.\nGTEST_API_ AssertionResult AssertionFailure(const Message& msg);\n\n// The abstract class that all tests inherit from.\n//\n// In Google Test, a unit test program contains one or many TestCases, and\n// each TestCase contains one or many Tests.\n//\n// When you define a test using the TEST macro, you don't need to\n// explicitly derive from Test - the TEST macro automatically does\n// this for you.\n//\n// The only time you derive from Test is when defining a test fixture\n// to be used a TEST_F.  For example:\n//\n//   class FooTest : public testing::Test {\n//    protected:\n//     virtual void SetUp() { ... }\n//     virtual void TearDown() { ... }\n//     ...\n//   };\n//\n//   TEST_F(FooTest, Bar) { ... }\n//   TEST_F(FooTest, Baz) { ... }\n//\n// Test is not copyable.\nclass GTEST_API_ Test {\n public:\n  friend class TestInfo;\n\n  // Defines types for pointers to functions that set up and tear down\n  // a test case.\n  typedef internal::SetUpTestCaseFunc SetUpTestCaseFunc;\n  typedef internal::TearDownTestCaseFunc TearDownTestCaseFunc;\n\n  // The d'tor is virtual as we intend to inherit from Test.\n  virtual ~Test();\n\n  // Sets up the stuff shared by all tests in this test case.\n  //\n  // Google Test will call Foo::SetUpTestCase() before running the first\n  // test in test case Foo.  Hence a sub-class can define its own\n  // SetUpTestCase() method to shadow the one defined in the super\n  // class.\n  static void SetUpTestCase() {}\n\n  // Tears down the stuff shared by all tests in this test case.\n  //\n  // Google Test will call Foo::TearDownTestCase() after running the last\n  // test in test case Foo.  Hence a sub-class can define its own\n  // TearDownTestCase() method to shadow the one defined in the super\n  // class.\n  static void TearDownTestCase() {}\n\n  // Returns true iff the current test has a fatal failure.\n  static bool HasFatalFailure();\n\n  // Returns true iff the current test has a non-fatal failure.\n  static bool HasNonfatalFailure();\n\n  // Returns true iff the current test has a (either fatal or\n  // non-fatal) failure.\n  static bool HasFailure() { return HasFatalFailure() || HasNonfatalFailure(); }\n\n  // Logs a property for the current test.  Only the last value for a given\n  // key is remembered.\n  // These are public static so they can be called from utility functions\n  // that are not members of the test fixture.\n  // The arguments are const char* instead strings, as Google Test is used\n  // on platforms where string doesn't compile.\n  //\n  // Note that a driving consideration for these RecordProperty methods\n  // was to produce xml output suited to the Greenspan charting utility,\n  // which at present will only chart values that fit in a 32-bit int. It\n  // is the user's responsibility to restrict their values to 32-bit ints\n  // if they intend them to be used with Greenspan.\n  static void RecordProperty(const char* key, const char* value);\n  static void RecordProperty(const char* key, int value);\n\n protected:\n  // Creates a Test object.\n  Test();\n\n  // Sets up the test fixture.\n  virtual void SetUp();\n\n  // Tears down the test fixture.\n  virtual void TearDown();\n\n private:\n  // Returns true iff the current test has the same fixture class as\n  // the first test in the current test case.\n  static bool HasSameFixtureClass();\n\n  // Runs the test after the test fixture has been set up.\n  //\n  // A sub-class must implement this to define the test logic.\n  //\n  // DO NOT OVERRIDE THIS FUNCTION DIRECTLY IN A USER PROGRAM.\n  // Instead, use the TEST or TEST_F macro.\n  virtual void TestBody() = 0;\n\n  // Sets up, executes, and tears down the test.\n  void Run();\n\n  // Deletes self.  We deliberately pick an unusual name for this\n  // internal method to avoid clashing with names used in user TESTs.\n  void DeleteSelf_() { delete this; }\n\n  // Uses a GTestFlagSaver to save and restore all Google Test flags.\n  const internal::GTestFlagSaver* const gtest_flag_saver_;\n\n  // Often a user mis-spells SetUp() as Setup() and spends a long time\n  // wondering why it is never called by Google Test.  The declaration of\n  // the following method is solely for catching such an error at\n  // compile time:\n  //\n  //   - The return type is deliberately chosen to be not void, so it\n  //   will be a conflict if a user declares void Setup() in his test\n  //   fixture.\n  //\n  //   - This method is private, so it will be another compiler error\n  //   if a user calls it from his test fixture.\n  //\n  // DO NOT OVERRIDE THIS FUNCTION.\n  //\n  // If you see an error about overriding the following function or\n  // about it being private, you have mis-spelled SetUp() as Setup().\n  struct Setup_should_be_spelled_SetUp {};\n  virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }\n\n  // We disallow copying Tests.\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(Test);\n};\n\ntypedef internal::TimeInMillis TimeInMillis;\n\n// A copyable object representing a user specified test property which can be\n// output as a key/value string pair.\n//\n// Don't inherit from TestProperty as its destructor is not virtual.\nclass TestProperty {\n public:\n  // C'tor.  TestProperty does NOT have a default constructor.\n  // Always use this constructor (with parameters) to create a\n  // TestProperty object.\n  TestProperty(const char* a_key, const char* a_value) :\n    key_(a_key), value_(a_value) {\n  }\n\n  // Gets the user supplied key.\n  const char* key() const {\n    return key_.c_str();\n  }\n\n  // Gets the user supplied value.\n  const char* value() const {\n    return value_.c_str();\n  }\n\n  // Sets a new value, overriding the one supplied in the constructor.\n  void SetValue(const char* new_value) {\n    value_ = new_value;\n  }\n\n private:\n  // The key supplied by the user.\n  internal::String key_;\n  // The value supplied by the user.\n  internal::String value_;\n};\n\n// The result of a single Test.  This includes a list of\n// TestPartResults, a list of TestProperties, a count of how many\n// death tests there are in the Test, and how much time it took to run\n// the Test.\n//\n// TestResult is not copyable.\nclass GTEST_API_ TestResult {\n public:\n  // Creates an empty TestResult.\n  TestResult();\n\n  // D'tor.  Do not inherit from TestResult.\n  ~TestResult();\n\n  // Gets the number of all test parts.  This is the sum of the number\n  // of successful test parts and the number of failed test parts.\n  int total_part_count() const;\n\n  // Returns the number of the test properties.\n  int test_property_count() const;\n\n  // Returns true iff the test passed (i.e. no test part failed).\n  bool Passed() const { return !Failed(); }\n\n  // Returns true iff the test failed.\n  bool Failed() const;\n\n  // Returns true iff the test fatally failed.\n  bool HasFatalFailure() const;\n\n  // Returns true iff the test has a non-fatal failure.\n  bool HasNonfatalFailure() const;\n\n  // Returns the elapsed time, in milliseconds.\n  TimeInMillis elapsed_time() const { return elapsed_time_; }\n\n  // Returns the i-th test part result among all the results. i can range\n  // from 0 to test_property_count() - 1. If i is not in that range, aborts\n  // the program.\n  const TestPartResult& GetTestPartResult(int i) const;\n\n  // Returns the i-th test property. i can range from 0 to\n  // test_property_count() - 1. If i is not in that range, aborts the\n  // program.\n  const TestProperty& GetTestProperty(int i) const;\n\n private:\n  friend class TestInfo;\n  friend class UnitTest;\n  friend class internal::DefaultGlobalTestPartResultReporter;\n  friend class internal::ExecDeathTest;\n  friend class internal::TestResultAccessor;\n  friend class internal::UnitTestImpl;\n  friend class internal::WindowsDeathTest;\n\n  // Gets the vector of TestPartResults.\n  const std::vector<TestPartResult>& test_part_results() const {\n    return test_part_results_;\n  }\n\n  // Gets the vector of TestProperties.\n  const std::vector<TestProperty>& test_properties() const {\n    return test_properties_;\n  }\n\n  // Sets the elapsed time.\n  void set_elapsed_time(TimeInMillis elapsed) { elapsed_time_ = elapsed; }\n\n  // Adds a test property to the list. The property is validated and may add\n  // a non-fatal failure if invalid (e.g., if it conflicts with reserved\n  // key names). If a property is already recorded for the same key, the\n  // value will be updated, rather than storing multiple values for the same\n  // key.\n  void RecordProperty(const TestProperty& test_property);\n\n  // Adds a failure if the key is a reserved attribute of Google Test\n  // testcase tags.  Returns true if the property is valid.\n  // TODO(russr): Validate attribute names are legal and human readable.\n  static bool ValidateTestProperty(const TestProperty& test_property);\n\n  // Adds a test part result to the list.\n  void AddTestPartResult(const TestPartResult& test_part_result);\n\n  // Returns the death test count.\n  int death_test_count() const { return death_test_count_; }\n\n  // Increments the death test count, returning the new count.\n  int increment_death_test_count() { return ++death_test_count_; }\n\n  // Clears the test part results.\n  void ClearTestPartResults();\n\n  // Clears the object.\n  void Clear();\n\n  // Protects mutable state of the property vector and of owned\n  // properties, whose values may be updated.\n  internal::Mutex test_properites_mutex_;\n\n  // The vector of TestPartResults\n  std::vector<TestPartResult> test_part_results_;\n  // The vector of TestProperties\n  std::vector<TestProperty> test_properties_;\n  // Running count of death tests.\n  int death_test_count_;\n  // The elapsed time, in milliseconds.\n  TimeInMillis elapsed_time_;\n\n  // We disallow copying TestResult.\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestResult);\n};  // class TestResult\n\n// A TestInfo object stores the following information about a test:\n//\n//   Test case name\n//   Test name\n//   Whether the test should be run\n//   A function pointer that creates the test object when invoked\n//   Test result\n//\n// The constructor of TestInfo registers itself with the UnitTest\n// singleton such that the RUN_ALL_TESTS() macro knows which tests to\n// run.\nclass GTEST_API_ TestInfo {\n public:\n  // Destructs a TestInfo object.  This function is not virtual, so\n  // don't inherit from TestInfo.\n  ~TestInfo();\n\n  // Returns the test case name.\n  const char* test_case_name() const { return test_case_name_.c_str(); }\n\n  // Returns the test name.\n  const char* name() const { return name_.c_str(); }\n\n  // Returns the name of the parameter type, or NULL if this is not a typed\n  // or a type-parameterized test.\n  const char* type_param() const {\n    if (type_param_.get() != NULL)\n      return type_param_->c_str();\n    return NULL;\n  }\n\n  // Returns the text representation of the value parameter, or NULL if this\n  // is not a value-parameterized test.\n  const char* value_param() const {\n    if (value_param_.get() != NULL)\n      return value_param_->c_str();\n    return NULL;\n  }\n\n  // Returns true if this test should run, that is if the test is not disabled\n  // (or it is disabled but the also_run_disabled_tests flag has been specified)\n  // and its full name matches the user-specified filter.\n  //\n  // Google Test allows the user to filter the tests by their full names.\n  // The full name of a test Bar in test case Foo is defined as\n  // \"Foo.Bar\".  Only the tests that match the filter will run.\n  //\n  // A filter is a colon-separated list of glob (not regex) patterns,\n  // optionally followed by a '-' and a colon-separated list of\n  // negative patterns (tests to exclude).  A test is run if it\n  // matches one of the positive patterns and does not match any of\n  // the negative patterns.\n  //\n  // For example, *A*:Foo.* is a filter that matches any string that\n  // contains the character 'A' or starts with \"Foo.\".\n  bool should_run() const { return should_run_; }\n\n  // Returns the result of the test.\n  const TestResult* result() const { return &result_; }\n\n private:\n\n#if GTEST_HAS_DEATH_TEST\n  friend class internal::DefaultDeathTestFactory;\n#endif  // GTEST_HAS_DEATH_TEST\n  friend class Test;\n  friend class TestCase;\n  friend class internal::UnitTestImpl;\n  friend TestInfo* internal::MakeAndRegisterTestInfo(\n      const char* test_case_name, const char* name,\n      const char* type_param,\n      const char* value_param,\n      internal::TypeId fixture_class_id,\n      Test::SetUpTestCaseFunc set_up_tc,\n      Test::TearDownTestCaseFunc tear_down_tc,\n      internal::TestFactoryBase* factory);\n\n  // Constructs a TestInfo object. The newly constructed instance assumes\n  // ownership of the factory object.\n  TestInfo(const char* test_case_name, const char* name,\n           const char* a_type_param,\n           const char* a_value_param,\n           internal::TypeId fixture_class_id,\n           internal::TestFactoryBase* factory);\n\n  // Increments the number of death tests encountered in this test so\n  // far.\n  int increment_death_test_count() {\n    return result_.increment_death_test_count();\n  }\n\n  // Creates the test object, runs it, records its result, and then\n  // deletes it.\n  void Run();\n\n  static void ClearTestResult(TestInfo* test_info) {\n    test_info->result_.Clear();\n  }\n\n  // These fields are immutable properties of the test.\n  const std::string test_case_name_;     // Test case name\n  const std::string name_;               // Test name\n  // Name of the parameter type, or NULL if this is not a typed or a\n  // type-parameterized test.\n  const internal::scoped_ptr<const ::std::string> type_param_;\n  // Text representation of the value parameter, or NULL if this is not a\n  // value-parameterized test.\n  const internal::scoped_ptr<const ::std::string> value_param_;\n  const internal::TypeId fixture_class_id_;   // ID of the test fixture class\n  bool should_run_;                 // True iff this test should run\n  bool is_disabled_;                // True iff this test is disabled\n  bool matches_filter_;             // True if this test matches the\n                                    // user-specified filter.\n  internal::TestFactoryBase* const factory_;  // The factory that creates\n                                              // the test object\n\n  // This field is mutable and needs to be reset before running the\n  // test for the second time.\n  TestResult result_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestInfo);\n};\n\n// A test case, which consists of a vector of TestInfos.\n//\n// TestCase is not copyable.\nclass GTEST_API_ TestCase {\n public:\n  // Creates a TestCase with the given name.\n  //\n  // TestCase does NOT have a default constructor.  Always use this\n  // constructor to create a TestCase object.\n  //\n  // Arguments:\n  //\n  //   name:         name of the test case\n  //   a_type_param: the name of the test's type parameter, or NULL if\n  //                 this is not a type-parameterized test.\n  //   set_up_tc:    pointer to the function that sets up the test case\n  //   tear_down_tc: pointer to the function that tears down the test case\n  TestCase(const char* name, const char* a_type_param,\n           Test::SetUpTestCaseFunc set_up_tc,\n           Test::TearDownTestCaseFunc tear_down_tc);\n\n  // Destructor of TestCase.\n  virtual ~TestCase();\n\n  // Gets the name of the TestCase.\n  const char* name() const { return name_.c_str(); }\n\n  // Returns the name of the parameter type, or NULL if this is not a\n  // type-parameterized test case.\n  const char* type_param() const {\n    if (type_param_.get() != NULL)\n      return type_param_->c_str();\n    return NULL;\n  }\n\n  // Returns true if any test in this test case should run.\n  bool should_run() const { return should_run_; }\n\n  // Gets the number of successful tests in this test case.\n  int successful_test_count() const;\n\n  // Gets the number of failed tests in this test case.\n  int failed_test_count() const;\n\n  // Gets the number of disabled tests in this test case.\n  int disabled_test_count() const;\n\n  // Get the number of tests in this test case that should run.\n  int test_to_run_count() const;\n\n  // Gets the number of all tests in this test case.\n  int total_test_count() const;\n\n  // Returns true iff the test case passed.\n  bool Passed() const { return !Failed(); }\n\n  // Returns true iff the test case failed.\n  bool Failed() const { return failed_test_count() > 0; }\n\n  // Returns the elapsed time, in milliseconds.\n  TimeInMillis elapsed_time() const { return elapsed_time_; }\n\n  // Returns the i-th test among all the tests. i can range from 0 to\n  // total_test_count() - 1. If i is not in that range, returns NULL.\n  const TestInfo* GetTestInfo(int i) const;\n\n private:\n  friend class Test;\n  friend class internal::UnitTestImpl;\n\n  // Gets the (mutable) vector of TestInfos in this TestCase.\n  std::vector<TestInfo*>& test_info_list() { return test_info_list_; }\n\n  // Gets the (immutable) vector of TestInfos in this TestCase.\n  const std::vector<TestInfo*>& test_info_list() const {\n    return test_info_list_;\n  }\n\n  // Returns the i-th test among all the tests. i can range from 0 to\n  // total_test_count() - 1. If i is not in that range, returns NULL.\n  TestInfo* GetMutableTestInfo(int i);\n\n  // Sets the should_run member.\n  void set_should_run(bool should) { should_run_ = should; }\n\n  // Adds a TestInfo to this test case.  Will delete the TestInfo upon\n  // destruction of the TestCase object.\n  void AddTestInfo(TestInfo * test_info);\n\n  // Clears the results of all tests in this test case.\n  void ClearResult();\n\n  // Clears the results of all tests in the given test case.\n  static void ClearTestCaseResult(TestCase* test_case) {\n    test_case->ClearResult();\n  }\n\n  // Runs every test in this TestCase.\n  void Run();\n\n  // Runs SetUpTestCase() for this TestCase.  This wrapper is needed\n  // for catching exceptions thrown from SetUpTestCase().\n  void RunSetUpTestCase() { (*set_up_tc_)(); }\n\n  // Runs TearDownTestCase() for this TestCase.  This wrapper is\n  // needed for catching exceptions thrown from TearDownTestCase().\n  void RunTearDownTestCase() { (*tear_down_tc_)(); }\n\n  // Returns true iff test passed.\n  static bool TestPassed(const TestInfo* test_info) {\n    return test_info->should_run() && test_info->result()->Passed();\n  }\n\n  // Returns true iff test failed.\n  static bool TestFailed(const TestInfo* test_info) {\n    return test_info->should_run() && test_info->result()->Failed();\n  }\n\n  // Returns true iff test is disabled.\n  static bool TestDisabled(const TestInfo* test_info) {\n    return test_info->is_disabled_;\n  }\n\n  // Returns true if the given test should run.\n  static bool ShouldRunTest(const TestInfo* test_info) {\n    return test_info->should_run();\n  }\n\n  // Shuffles the tests in this test case.\n  void ShuffleTests(internal::Random* random);\n\n  // Restores the test order to before the first shuffle.\n  void UnshuffleTests();\n\n  // Name of the test case.\n  internal::String name_;\n  // Name of the parameter type, or NULL if this is not a typed or a\n  // type-parameterized test.\n  const internal::scoped_ptr<const ::std::string> type_param_;\n  // The vector of TestInfos in their original order.  It owns the\n  // elements in the vector.\n  std::vector<TestInfo*> test_info_list_;\n  // Provides a level of indirection for the test list to allow easy\n  // shuffling and restoring the test order.  The i-th element in this\n  // vector is the index of the i-th test in the shuffled test list.\n  std::vector<int> test_indices_;\n  // Pointer to the function that sets up the test case.\n  Test::SetUpTestCaseFunc set_up_tc_;\n  // Pointer to the function that tears down the test case.\n  Test::TearDownTestCaseFunc tear_down_tc_;\n  // True iff any test in this test case should run.\n  bool should_run_;\n  // Elapsed time, in milliseconds.\n  TimeInMillis elapsed_time_;\n\n  // We disallow copying TestCases.\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestCase);\n};\n\n// An Environment object is capable of setting up and tearing down an\n// environment.  The user should subclass this to define his own\n// environment(s).\n//\n// An Environment object does the set-up and tear-down in virtual\n// methods SetUp() and TearDown() instead of the constructor and the\n// destructor, as:\n//\n//   1. You cannot safely throw from a destructor.  This is a problem\n//      as in some cases Google Test is used where exceptions are enabled, and\n//      we may want to implement ASSERT_* using exceptions where they are\n//      available.\n//   2. You cannot use ASSERT_* directly in a constructor or\n//      destructor.\nclass Environment {\n public:\n  // The d'tor is virtual as we need to subclass Environment.\n  virtual ~Environment() {}\n\n  // Override this to define how to set up the environment.\n  virtual void SetUp() {}\n\n  // Override this to define how to tear down the environment.\n  virtual void TearDown() {}\n private:\n  // If you see an error about overriding the following function or\n  // about it being private, you have mis-spelled SetUp() as Setup().\n  struct Setup_should_be_spelled_SetUp {};\n  virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }\n};\n\n// The interface for tracing execution of tests. The methods are organized in\n// the order the corresponding events are fired.\nclass TestEventListener {\n public:\n  virtual ~TestEventListener() {}\n\n  // Fired before any test activity starts.\n  virtual void OnTestProgramStart(const UnitTest& unit_test) = 0;\n\n  // Fired before each iteration of tests starts.  There may be more than\n  // one iteration if GTEST_FLAG(repeat) is set. iteration is the iteration\n  // index, starting from 0.\n  virtual void OnTestIterationStart(const UnitTest& unit_test,\n                                    int iteration) = 0;\n\n  // Fired before environment set-up for each iteration of tests starts.\n  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test) = 0;\n\n  // Fired after environment set-up for each iteration of tests ends.\n  virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test) = 0;\n\n  // Fired before the test case starts.\n  virtual void OnTestCaseStart(const TestCase& test_case) = 0;\n\n  // Fired before the test starts.\n  virtual void OnTestStart(const TestInfo& test_info) = 0;\n\n  // Fired after a failed assertion or a SUCCEED() invocation.\n  virtual void OnTestPartResult(const TestPartResult& test_part_result) = 0;\n\n  // Fired after the test ends.\n  virtual void OnTestEnd(const TestInfo& test_info) = 0;\n\n  // Fired after the test case ends.\n  virtual void OnTestCaseEnd(const TestCase& test_case) = 0;\n\n  // Fired before environment tear-down for each iteration of tests starts.\n  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test) = 0;\n\n  // Fired after environment tear-down for each iteration of tests ends.\n  virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test) = 0;\n\n  // Fired after each iteration of tests finishes.\n  virtual void OnTestIterationEnd(const UnitTest& unit_test,\n                                  int iteration) = 0;\n\n  // Fired after all test activities have ended.\n  virtual void OnTestProgramEnd(const UnitTest& unit_test) = 0;\n};\n\n// The convenience class for users who need to override just one or two\n// methods and are not concerned that a possible change to a signature of\n// the methods they override will not be caught during the build.  For\n// comments about each method please see the definition of TestEventListener\n// above.\nclass EmptyTestEventListener : public TestEventListener {\n public:\n  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {}\n  virtual void OnTestIterationStart(const UnitTest& /*unit_test*/,\n                                    int /*iteration*/) {}\n  virtual void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) {}\n  virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {}\n  virtual void OnTestCaseStart(const TestCase& /*test_case*/) {}\n  virtual void OnTestStart(const TestInfo& /*test_info*/) {}\n  virtual void OnTestPartResult(const TestPartResult& /*test_part_result*/) {}\n  virtual void OnTestEnd(const TestInfo& /*test_info*/) {}\n  virtual void OnTestCaseEnd(const TestCase& /*test_case*/) {}\n  virtual void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) {}\n  virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {}\n  virtual void OnTestIterationEnd(const UnitTest& /*unit_test*/,\n                                  int /*iteration*/) {}\n  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {}\n};\n\n// TestEventListeners lets users add listeners to track events in Google Test.\nclass GTEST_API_ TestEventListeners {\n public:\n  TestEventListeners();\n  ~TestEventListeners();\n\n  // Appends an event listener to the end of the list. Google Test assumes\n  // the ownership of the listener (i.e. it will delete the listener when\n  // the test program finishes).\n  void Append(TestEventListener* listener);\n\n  // Removes the given event listener from the list and returns it.  It then\n  // becomes the caller's responsibility to delete the listener. Returns\n  // NULL if the listener is not found in the list.\n  TestEventListener* Release(TestEventListener* listener);\n\n  // Returns the standard listener responsible for the default console\n  // output.  Can be removed from the listeners list to shut down default\n  // console output.  Note that removing this object from the listener list\n  // with Release transfers its ownership to the caller and makes this\n  // function return NULL the next time.\n  TestEventListener* default_result_printer() const {\n    return default_result_printer_;\n  }\n\n  // Returns the standard listener responsible for the default XML output\n  // controlled by the --gtest_output=xml flag.  Can be removed from the\n  // listeners list by users who want to shut down the default XML output\n  // controlled by this flag and substitute it with custom one.  Note that\n  // removing this object from the listener list with Release transfers its\n  // ownership to the caller and makes this function return NULL the next\n  // time.\n  TestEventListener* default_xml_generator() const {\n    return default_xml_generator_;\n  }\n\n private:\n  friend class TestCase;\n  friend class TestInfo;\n  friend class internal::DefaultGlobalTestPartResultReporter;\n  friend class internal::NoExecDeathTest;\n  friend class internal::TestEventListenersAccessor;\n  friend class internal::UnitTestImpl;\n\n  // Returns repeater that broadcasts the TestEventListener events to all\n  // subscribers.\n  TestEventListener* repeater();\n\n  // Sets the default_result_printer attribute to the provided listener.\n  // The listener is also added to the listener list and previous\n  // default_result_printer is removed from it and deleted. The listener can\n  // also be NULL in which case it will not be added to the list. Does\n  // nothing if the previous and the current listener objects are the same.\n  void SetDefaultResultPrinter(TestEventListener* listener);\n\n  // Sets the default_xml_generator attribute to the provided listener.  The\n  // listener is also added to the listener list and previous\n  // default_xml_generator is removed from it and deleted. The listener can\n  // also be NULL in which case it will not be added to the list. Does\n  // nothing if the previous and the current listener objects are the same.\n  void SetDefaultXmlGenerator(TestEventListener* listener);\n\n  // Controls whether events will be forwarded by the repeater to the\n  // listeners in the list.\n  bool EventForwardingEnabled() const;\n  void SuppressEventForwarding();\n\n  // The actual list of listeners.\n  internal::TestEventRepeater* repeater_;\n  // Listener responsible for the standard result output.\n  TestEventListener* default_result_printer_;\n  // Listener responsible for the creation of the XML output file.\n  TestEventListener* default_xml_generator_;\n\n  // We disallow copying TestEventListeners.\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventListeners);\n};\n\n// A UnitTest consists of a vector of TestCases.\n//\n// This is a singleton class.  The only instance of UnitTest is\n// created when UnitTest::GetInstance() is first called.  This\n// instance is never deleted.\n//\n// UnitTest is not copyable.\n//\n// This class is thread-safe as long as the methods are called\n// according to their specification.\nclass GTEST_API_ UnitTest {\n public:\n  // Gets the singleton UnitTest object.  The first time this method\n  // is called, a UnitTest object is constructed and returned.\n  // Consecutive calls will return the same object.\n  static UnitTest* GetInstance();\n\n  // Runs all tests in this UnitTest object and prints the result.\n  // Returns 0 if successful, or 1 otherwise.\n  //\n  // This method can only be called from the main thread.\n  //\n  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\n  int Run() GTEST_MUST_USE_RESULT_;\n\n  // Returns the working directory when the first TEST() or TEST_F()\n  // was executed.  The UnitTest object owns the string.\n  const char* original_working_dir() const;\n\n  // Returns the TestCase object for the test that's currently running,\n  // or NULL if no test is running.\n  const TestCase* current_test_case() const;\n\n  // Returns the TestInfo object for the test that's currently running,\n  // or NULL if no test is running.\n  const TestInfo* current_test_info() const;\n\n  // Returns the random seed used at the start of the current test run.\n  int random_seed() const;\n\n#if GTEST_HAS_PARAM_TEST\n  // Returns the ParameterizedTestCaseRegistry object used to keep track of\n  // value-parameterized tests and instantiate and register them.\n  //\n  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\n  internal::ParameterizedTestCaseRegistry& parameterized_test_registry();\n#endif  // GTEST_HAS_PARAM_TEST\n\n  // Gets the number of successful test cases.\n  int successful_test_case_count() const;\n\n  // Gets the number of failed test cases.\n  int failed_test_case_count() const;\n\n  // Gets the number of all test cases.\n  int total_test_case_count() const;\n\n  // Gets the number of all test cases that contain at least one test\n  // that should run.\n  int test_case_to_run_count() const;\n\n  // Gets the number of successful tests.\n  int successful_test_count() const;\n\n  // Gets the number of failed tests.\n  int failed_test_count() const;\n\n  // Gets the number of disabled tests.\n  int disabled_test_count() const;\n\n  // Gets the number of all tests.\n  int total_test_count() const;\n\n  // Gets the number of tests that should run.\n  int test_to_run_count() const;\n\n  // Gets the elapsed time, in milliseconds.\n  TimeInMillis elapsed_time() const;\n\n  // Returns true iff the unit test passed (i.e. all test cases passed).\n  bool Passed() const;\n\n  // Returns true iff the unit test failed (i.e. some test case failed\n  // or something outside of all tests failed).\n  bool Failed() const;\n\n  // Gets the i-th test case among all the test cases. i can range from 0 to\n  // total_test_case_count() - 1. If i is not in that range, returns NULL.\n  const TestCase* GetTestCase(int i) const;\n\n  // Returns the list of event listeners that can be used to track events\n  // inside Google Test.\n  TestEventListeners& listeners();\n\n private:\n  // Registers and returns a global test environment.  When a test\n  // program is run, all global test environments will be set-up in\n  // the order they were registered.  After all tests in the program\n  // have finished, all global test environments will be torn-down in\n  // the *reverse* order they were registered.\n  //\n  // The UnitTest object takes ownership of the given environment.\n  //\n  // This method can only be called from the main thread.\n  Environment* AddEnvironment(Environment* env);\n\n  // Adds a TestPartResult to the current TestResult object.  All\n  // Google Test assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc)\n  // eventually call this to report their results.  The user code\n  // should use the assertion macros instead of calling this directly.\n  void AddTestPartResult(TestPartResult::Type result_type,\n                         const char* file_name,\n                         int line_number,\n                         const internal::String& message,\n                         const internal::String& os_stack_trace);\n\n  // Adds a TestProperty to the current TestResult object. If the result already\n  // contains a property with the same key, the value will be updated.\n  void RecordPropertyForCurrentTest(const char* key, const char* value);\n\n  // Gets the i-th test case among all the test cases. i can range from 0 to\n  // total_test_case_count() - 1. If i is not in that range, returns NULL.\n  TestCase* GetMutableTestCase(int i);\n\n  // Accessors for the implementation object.\n  internal::UnitTestImpl* impl() { return impl_; }\n  const internal::UnitTestImpl* impl() const { return impl_; }\n\n  // These classes and funcions are friends as they need to access private\n  // members of UnitTest.\n  friend class Test;\n  friend class internal::AssertHelper;\n  friend class internal::ScopedTrace;\n  friend Environment* AddGlobalTestEnvironment(Environment* env);\n  friend internal::UnitTestImpl* internal::GetUnitTestImpl();\n  friend void internal::ReportFailureInUnknownLocation(\n      TestPartResult::Type result_type,\n      const internal::String& message);\n\n  // Creates an empty UnitTest.\n  UnitTest();\n\n  // D'tor\n  virtual ~UnitTest();\n\n  // Pushes a trace defined by SCOPED_TRACE() on to the per-thread\n  // Google Test trace stack.\n  void PushGTestTrace(const internal::TraceInfo& trace);\n\n  // Pops a trace from the per-thread Google Test trace stack.\n  void PopGTestTrace();\n\n  // Protects mutable state in *impl_.  This is mutable as some const\n  // methods need to lock it too.\n  mutable internal::Mutex mutex_;\n\n  // Opaque implementation object.  This field is never changed once\n  // the object is constructed.  We don't mark it as const here, as\n  // doing so will cause a warning in the constructor of UnitTest.\n  // Mutable state in *impl_ is protected by mutex_.\n  internal::UnitTestImpl* impl_;\n\n  // We disallow copying UnitTest.\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTest);\n};\n\n// A convenient wrapper for adding an environment for the test\n// program.\n//\n// You should call this before RUN_ALL_TESTS() is called, probably in\n// main().  If you use gtest_main, you need to call this before main()\n// starts for it to take effect.  For example, you can define a global\n// variable like this:\n//\n//   testing::Environment* const foo_env =\n//       testing::AddGlobalTestEnvironment(new FooEnvironment);\n//\n// However, we strongly recommend you to write your own main() and\n// call AddGlobalTestEnvironment() there, as relying on initialization\n// of global variables makes the code harder to read and may cause\n// problems when you register multiple environments from different\n// translation units and the environments have dependencies among them\n// (remember that the compiler doesn't guarantee the order in which\n// global variables from different translation units are initialized).\ninline Environment* AddGlobalTestEnvironment(Environment* env) {\n  return UnitTest::GetInstance()->AddEnvironment(env);\n}\n\n// Initializes Google Test.  This must be called before calling\n// RUN_ALL_TESTS().  In particular, it parses a command line for the\n// flags that Google Test recognizes.  Whenever a Google Test flag is\n// seen, it is removed from argv, and *argc is decremented.\n//\n// No value is returned.  Instead, the Google Test flag variables are\n// updated.\n//\n// Calling the function for the second time has no user-visible effect.\nGTEST_API_ void InitGoogleTest(int* argc, char** argv);\n\n// This overloaded version can be used in Windows programs compiled in\n// UNICODE mode.\nGTEST_API_ void InitGoogleTest(int* argc, wchar_t** argv);\n\nnamespace internal {\n\n// Formats a comparison assertion (e.g. ASSERT_EQ, EXPECT_LT, and etc)\n// operand to be used in a failure message.  The type (but not value)\n// of the other operand may affect the format.  This allows us to\n// print a char* as a raw pointer when it is compared against another\n// char*, and print it as a C string when it is compared against an\n// std::string object, for example.\n//\n// The default implementation ignores the type of the other operand.\n// Some specialized versions are used to handle formatting wide or\n// narrow C strings.\n//\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\ntemplate <typename T1, typename T2>\nString FormatForComparisonFailureMessage(const T1& value,\n                                         const T2& /* other_operand */) {\n  // C++Builder compiles this incorrectly if the namespace isn't explicitly\n  // given.\n  return ::testing::PrintToString(value);\n}\n\n// The helper function for {ASSERT|EXPECT}_EQ.\ntemplate <typename T1, typename T2>\nAssertionResult CmpHelperEQ(const char* expected_expression,\n                            const char* actual_expression,\n                            const T1& expected,\n                            const T2& actual) {\n#ifdef _MSC_VER\n# pragma warning(push)          // Saves the current warning state.\n# pragma warning(disable:4389)  // Temporarily disables warning on\n                               // signed/unsigned mismatch.\n#endif\n\n  if (expected == actual) {\n    return AssertionSuccess();\n  }\n\n#ifdef _MSC_VER\n# pragma warning(pop)          // Restores the warning state.\n#endif\n\n  return EqFailure(expected_expression,\n                   actual_expression,\n                   FormatForComparisonFailureMessage(expected, actual),\n                   FormatForComparisonFailureMessage(actual, expected),\n                   false);\n}\n\n// With this overloaded version, we allow anonymous enums to be used\n// in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous enums\n// can be implicitly cast to BiggestInt.\nGTEST_API_ AssertionResult CmpHelperEQ(const char* expected_expression,\n                                       const char* actual_expression,\n                                       BiggestInt expected,\n                                       BiggestInt actual);\n\n// The helper class for {ASSERT|EXPECT}_EQ.  The template argument\n// lhs_is_null_literal is true iff the first argument to ASSERT_EQ()\n// is a null pointer literal.  The following default implementation is\n// for lhs_is_null_literal being false.\ntemplate <bool lhs_is_null_literal>\nclass EqHelper {\n public:\n  // This templatized version is for the general case.\n  template <typename T1, typename T2>\n  static AssertionResult Compare(const char* expected_expression,\n                                 const char* actual_expression,\n                                 const T1& expected,\n                                 const T2& actual) {\n    return CmpHelperEQ(expected_expression, actual_expression, expected,\n                       actual);\n  }\n\n  // With this overloaded version, we allow anonymous enums to be used\n  // in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous\n  // enums can be implicitly cast to BiggestInt.\n  //\n  // Even though its body looks the same as the above version, we\n  // cannot merge the two, as it will make anonymous enums unhappy.\n  static AssertionResult Compare(const char* expected_expression,\n                                 const char* actual_expression,\n                                 BiggestInt expected,\n                                 BiggestInt actual) {\n    return CmpHelperEQ(expected_expression, actual_expression, expected,\n                       actual);\n  }\n};\n\n// This specialization is used when the first argument to ASSERT_EQ()\n// is a null pointer literal, like NULL, false, or 0.\ntemplate <>\nclass EqHelper<true> {\n public:\n  // We define two overloaded versions of Compare().  The first\n  // version will be picked when the second argument to ASSERT_EQ() is\n  // NOT a pointer, e.g. ASSERT_EQ(0, AnIntFunction()) or\n  // EXPECT_EQ(false, a_bool).\n  template <typename T1, typename T2>\n  static AssertionResult Compare(\n      const char* expected_expression,\n      const char* actual_expression,\n      const T1& expected,\n      const T2& actual,\n      // The following line prevents this overload from being considered if T2\n      // is not a pointer type.  We need this because ASSERT_EQ(NULL, my_ptr)\n      // expands to Compare(\"\", \"\", NULL, my_ptr), which requires a conversion\n      // to match the Secret* in the other overload, which would otherwise make\n      // this template match better.\n      typename EnableIf<!is_pointer<T2>::value>::type* = 0) {\n    return CmpHelperEQ(expected_expression, actual_expression, expected,\n                       actual);\n  }\n\n  // This version will be picked when the second argument to ASSERT_EQ() is a\n  // pointer, e.g. ASSERT_EQ(NULL, a_pointer).\n  template <typename T>\n  static AssertionResult Compare(\n      const char* expected_expression,\n      const char* actual_expression,\n      // We used to have a second template parameter instead of Secret*.  That\n      // template parameter would deduce to 'long', making this a better match\n      // than the first overload even without the first overload's EnableIf.\n      // Unfortunately, gcc with -Wconversion-null warns when \"passing NULL to\n      // non-pointer argument\" (even a deduced integral argument), so the old\n      // implementation caused warnings in user code.\n      Secret* /* expected (NULL) */,\n      T* actual) {\n    // We already know that 'expected' is a null pointer.\n    return CmpHelperEQ(expected_expression, actual_expression,\n                       static_cast<T*>(NULL), actual);\n  }\n};\n\n// A macro for implementing the helper functions needed to implement\n// ASSERT_?? and EXPECT_??.  It is here just to avoid copy-and-paste\n// of similar code.\n//\n// For each templatized helper function, we also define an overloaded\n// version for BiggestInt in order to reduce code bloat and allow\n// anonymous enums to be used with {ASSERT|EXPECT}_?? when compiled\n// with gcc 4.\n//\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\n#define GTEST_IMPL_CMP_HELPER_(op_name, op)\\\ntemplate <typename T1, typename T2>\\\nAssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \\\n                                   const T1& val1, const T2& val2) {\\\n  if (val1 op val2) {\\\n    return AssertionSuccess();\\\n  } else {\\\n    return AssertionFailure() \\\n        << \"Expected: (\" << expr1 << \") \" #op \" (\" << expr2\\\n        << \"), actual: \" << FormatForComparisonFailureMessage(val1, val2)\\\n        << \" vs \" << FormatForComparisonFailureMessage(val2, val1);\\\n  }\\\n}\\\nGTEST_API_ AssertionResult CmpHelper##op_name(\\\n    const char* expr1, const char* expr2, BiggestInt val1, BiggestInt val2)\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\n\n// Implements the helper function for {ASSERT|EXPECT}_NE\nGTEST_IMPL_CMP_HELPER_(NE, !=);\n// Implements the helper function for {ASSERT|EXPECT}_LE\nGTEST_IMPL_CMP_HELPER_(LE, <=);\n// Implements the helper function for {ASSERT|EXPECT}_LT\nGTEST_IMPL_CMP_HELPER_(LT, < );\n// Implements the helper function for {ASSERT|EXPECT}_GE\nGTEST_IMPL_CMP_HELPER_(GE, >=);\n// Implements the helper function for {ASSERT|EXPECT}_GT\nGTEST_IMPL_CMP_HELPER_(GT, > );\n\n#undef GTEST_IMPL_CMP_HELPER_\n\n// The helper function for {ASSERT|EXPECT}_STREQ.\n//\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\nGTEST_API_ AssertionResult CmpHelperSTREQ(const char* expected_expression,\n                                          const char* actual_expression,\n                                          const char* expected,\n                                          const char* actual);\n\n// The helper function for {ASSERT|EXPECT}_STRCASEEQ.\n//\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\nGTEST_API_ AssertionResult CmpHelperSTRCASEEQ(const char* expected_expression,\n                                              const char* actual_expression,\n                                              const char* expected,\n                                              const char* actual);\n\n// The helper function for {ASSERT|EXPECT}_STRNE.\n//\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\nGTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,\n                                          const char* s2_expression,\n                                          const char* s1,\n                                          const char* s2);\n\n// The helper function for {ASSERT|EXPECT}_STRCASENE.\n//\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\nGTEST_API_ AssertionResult CmpHelperSTRCASENE(const char* s1_expression,\n                                              const char* s2_expression,\n                                              const char* s1,\n                                              const char* s2);\n\n\n// Helper function for *_STREQ on wide strings.\n//\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\nGTEST_API_ AssertionResult CmpHelperSTREQ(const char* expected_expression,\n                                          const char* actual_expression,\n                                          const wchar_t* expected,\n                                          const wchar_t* actual);\n\n// Helper function for *_STRNE on wide strings.\n//\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\nGTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,\n                                          const char* s2_expression,\n                                          const wchar_t* s1,\n                                          const wchar_t* s2);\n\n}  // namespace internal\n\n// IsSubstring() and IsNotSubstring() are intended to be used as the\n// first argument to {EXPECT,ASSERT}_PRED_FORMAT2(), not by\n// themselves.  They check whether needle is a substring of haystack\n// (NULL is considered a substring of itself only), and return an\n// appropriate error message when they fail.\n//\n// The {needle,haystack}_expr arguments are the stringified\n// expressions that generated the two real arguments.\nGTEST_API_ AssertionResult IsSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const char* needle, const char* haystack);\nGTEST_API_ AssertionResult IsSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const wchar_t* needle, const wchar_t* haystack);\nGTEST_API_ AssertionResult IsNotSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const char* needle, const char* haystack);\nGTEST_API_ AssertionResult IsNotSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const wchar_t* needle, const wchar_t* haystack);\nGTEST_API_ AssertionResult IsSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const ::std::string& needle, const ::std::string& haystack);\nGTEST_API_ AssertionResult IsNotSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const ::std::string& needle, const ::std::string& haystack);\n\n#if GTEST_HAS_STD_WSTRING\nGTEST_API_ AssertionResult IsSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const ::std::wstring& needle, const ::std::wstring& haystack);\nGTEST_API_ AssertionResult IsNotSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const ::std::wstring& needle, const ::std::wstring& haystack);\n#endif  // GTEST_HAS_STD_WSTRING\n\nnamespace internal {\n\n// Helper template function for comparing floating-points.\n//\n// Template parameter:\n//\n//   RawType: the raw floating-point type (either float or double)\n//\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\ntemplate <typename RawType>\nAssertionResult CmpHelperFloatingPointEQ(const char* expected_expression,\n                                         const char* actual_expression,\n                                         RawType expected,\n                                         RawType actual) {\n  const FloatingPoint<RawType> lhs(expected), rhs(actual);\n\n  if (lhs.AlmostEquals(rhs)) {\n    return AssertionSuccess();\n  }\n\n  ::std::stringstream expected_ss;\n  expected_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)\n              << expected;\n\n  ::std::stringstream actual_ss;\n  actual_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)\n            << actual;\n\n  return EqFailure(expected_expression,\n                   actual_expression,\n                   StringStreamToString(&expected_ss),\n                   StringStreamToString(&actual_ss),\n                   false);\n}\n\n// Helper function for implementing ASSERT_NEAR.\n//\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\nGTEST_API_ AssertionResult DoubleNearPredFormat(const char* expr1,\n                                                const char* expr2,\n                                                const char* abs_error_expr,\n                                                double val1,\n                                                double val2,\n                                                double abs_error);\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n// A class that enables one to stream messages to assertion macros\nclass GTEST_API_ AssertHelper {\n public:\n  // Constructor.\n  AssertHelper(TestPartResult::Type type,\n               const char* file,\n               int line,\n               const char* message);\n  ~AssertHelper();\n\n  // Message assignment is a semantic trick to enable assertion\n  // streaming; see the GTEST_MESSAGE_ macro below.\n  void operator=(const Message& message) const;\n\n private:\n  // We put our data in a struct so that the size of the AssertHelper class can\n  // be as small as possible.  This is important because gcc is incapable of\n  // re-using stack space even for temporary variables, so every EXPECT_EQ\n  // reserves stack space for another AssertHelper.\n  struct AssertHelperData {\n    AssertHelperData(TestPartResult::Type t,\n                     const char* srcfile,\n                     int line_num,\n                     const char* msg)\n        : type(t), file(srcfile), line(line_num), message(msg) { }\n\n    TestPartResult::Type const type;\n    const char*        const file;\n    int                const line;\n    String             const message;\n\n   private:\n    GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelperData);\n  };\n\n  AssertHelperData* const data_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelper);\n};\n\n}  // namespace internal\n\n#if GTEST_HAS_PARAM_TEST\n// The pure interface class that all value-parameterized tests inherit from.\n// A value-parameterized class must inherit from both ::testing::Test and\n// ::testing::WithParamInterface. In most cases that just means inheriting\n// from ::testing::TestWithParam, but more complicated test hierarchies\n// may need to inherit from Test and WithParamInterface at different levels.\n//\n// This interface has support for accessing the test parameter value via\n// the GetParam() method.\n//\n// Use it with one of the parameter generator defining functions, like Range(),\n// Values(), ValuesIn(), Bool(), and Combine().\n//\n// class FooTest : public ::testing::TestWithParam<int> {\n//  protected:\n//   FooTest() {\n//     // Can use GetParam() here.\n//   }\n//   virtual ~FooTest() {\n//     // Can use GetParam() here.\n//   }\n//   virtual void SetUp() {\n//     // Can use GetParam() here.\n//   }\n//   virtual void TearDown {\n//     // Can use GetParam() here.\n//   }\n// };\n// TEST_P(FooTest, DoesBar) {\n//   // Can use GetParam() method here.\n//   Foo foo;\n//   ASSERT_TRUE(foo.DoesBar(GetParam()));\n// }\n// INSTANTIATE_TEST_CASE_P(OneToTenRange, FooTest, ::testing::Range(1, 10));\n\ntemplate <typename T>\nclass WithParamInterface {\n public:\n  typedef T ParamType;\n  virtual ~WithParamInterface() {}\n\n  // The current parameter value. Is also available in the test fixture's\n  // constructor. This member function is non-static, even though it only\n  // references static data, to reduce the opportunity for incorrect uses\n  // like writing 'WithParamInterface<bool>::GetParam()' for a test that\n  // uses a fixture whose parameter type is int.\n  const ParamType& GetParam() const { return *parameter_; }\n\n private:\n  // Sets parameter value. The caller is responsible for making sure the value\n  // remains alive and unchanged throughout the current test.\n  static void SetParam(const ParamType* parameter) {\n    parameter_ = parameter;\n  }\n\n  // Static value used for accessing parameter during a test lifetime.\n  static const ParamType* parameter_;\n\n  // TestClass must be a subclass of WithParamInterface<T> and Test.\n  template <class TestClass> friend class internal::ParameterizedTestFactory;\n};\n\ntemplate <typename T>\nconst T* WithParamInterface<T>::parameter_ = NULL;\n\n// Most value-parameterized classes can ignore the existence of\n// WithParamInterface, and can just inherit from ::testing::TestWithParam.\n\ntemplate <typename T>\nclass TestWithParam : public Test, public WithParamInterface<T> {\n};\n\n#endif  // GTEST_HAS_PARAM_TEST\n\n// Macros for indicating success/failure in test code.\n\n// ADD_FAILURE unconditionally adds a failure to the current test.\n// SUCCEED generates a success - it doesn't automatically make the\n// current test successful, as a test is only successful when it has\n// no failure.\n//\n// EXPECT_* verifies that a certain condition is satisfied.  If not,\n// it behaves like ADD_FAILURE.  In particular:\n//\n//   EXPECT_TRUE  verifies that a Boolean condition is true.\n//   EXPECT_FALSE verifies that a Boolean condition is false.\n//\n// FAIL and ASSERT_* are similar to ADD_FAILURE and EXPECT_*, except\n// that they will also abort the current function on failure.  People\n// usually want the fail-fast behavior of FAIL and ASSERT_*, but those\n// writing data-driven tests often find themselves using ADD_FAILURE\n// and EXPECT_* more.\n//\n// Examples:\n//\n//   EXPECT_TRUE(server.StatusIsOK());\n//   ASSERT_FALSE(server.HasPendingRequest(port))\n//       << \"There are still pending requests \" << \"on port \" << port;\n\n// Generates a nonfatal failure with a generic message.\n#define ADD_FAILURE() GTEST_NONFATAL_FAILURE_(\"Failed\")\n\n// Generates a nonfatal failure at the given source file location with\n// a generic message.\n#define ADD_FAILURE_AT(file, line) \\\n  GTEST_MESSAGE_AT_(file, line, \"Failed\", \\\n                    ::testing::TestPartResult::kNonFatalFailure)\n\n// Generates a fatal failure with a generic message.\n#define GTEST_FAIL() GTEST_FATAL_FAILURE_(\"Failed\")\n\n// Define this macro to 1 to omit the definition of FAIL(), which is a\n// generic name and clashes with some other libraries.\n#if !GTEST_DONT_DEFINE_FAIL\n# define FAIL() GTEST_FAIL()\n#endif\n\n// Generates a success with a generic message.\n#define GTEST_SUCCEED() GTEST_SUCCESS_(\"Succeeded\")\n\n// Define this macro to 1 to omit the definition of SUCCEED(), which\n// is a generic name and clashes with some other libraries.\n#if !GTEST_DONT_DEFINE_SUCCEED\n# define SUCCEED() GTEST_SUCCEED()\n#endif\n\n// Macros for testing exceptions.\n//\n//    * {ASSERT|EXPECT}_THROW(statement, expected_exception):\n//         Tests that the statement throws the expected exception.\n//    * {ASSERT|EXPECT}_NO_THROW(statement):\n//         Tests that the statement doesn't throw any exception.\n//    * {ASSERT|EXPECT}_ANY_THROW(statement):\n//         Tests that the statement throws an exception.\n\n#define EXPECT_THROW(statement, expected_exception) \\\n  GTEST_TEST_THROW_(statement, expected_exception, GTEST_NONFATAL_FAILURE_)\n#define EXPECT_NO_THROW(statement) \\\n  GTEST_TEST_NO_THROW_(statement, GTEST_NONFATAL_FAILURE_)\n#define EXPECT_ANY_THROW(statement) \\\n  GTEST_TEST_ANY_THROW_(statement, GTEST_NONFATAL_FAILURE_)\n#define ASSERT_THROW(statement, expected_exception) \\\n  GTEST_TEST_THROW_(statement, expected_exception, GTEST_FATAL_FAILURE_)\n#define ASSERT_NO_THROW(statement) \\\n  GTEST_TEST_NO_THROW_(statement, GTEST_FATAL_FAILURE_)\n#define ASSERT_ANY_THROW(statement) \\\n  GTEST_TEST_ANY_THROW_(statement, GTEST_FATAL_FAILURE_)\n\n// Boolean assertions. Condition can be either a Boolean expression or an\n// AssertionResult. For more information on how to use AssertionResult with\n// these macros see comments on that class.\n#define EXPECT_TRUE(condition) \\\n  GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \\\n                      GTEST_NONFATAL_FAILURE_)\n#define EXPECT_FALSE(condition) \\\n  GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \\\n                      GTEST_NONFATAL_FAILURE_)\n#define ASSERT_TRUE(condition) \\\n  GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \\\n                      GTEST_FATAL_FAILURE_)\n#define ASSERT_FALSE(condition) \\\n  GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \\\n                      GTEST_FATAL_FAILURE_)\n\n// Includes the auto-generated header that implements a family of\n// generic predicate assertion macros.\n// Copyright 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// This file is AUTOMATICALLY GENERATED on 09/24/2010 by command\n// 'gen_gtest_pred_impl.py 5'.  DO NOT EDIT BY HAND!\n//\n// Implements a family of generic predicate assertion macros.\n\n#ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_\n#define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_\n\n// Makes sure this header is not included before gtest.h.\n#ifndef GTEST_INCLUDE_GTEST_GTEST_H_\n# error Do not include gtest_pred_impl.h directly.  Include gtest.h instead.\n#endif  // GTEST_INCLUDE_GTEST_GTEST_H_\n\n// This header implements a family of generic predicate assertion\n// macros:\n//\n//   ASSERT_PRED_FORMAT1(pred_format, v1)\n//   ASSERT_PRED_FORMAT2(pred_format, v1, v2)\n//   ...\n//\n// where pred_format is a function or functor that takes n (in the\n// case of ASSERT_PRED_FORMATn) values and their source expression\n// text, and returns a testing::AssertionResult.  See the definition\n// of ASSERT_EQ in gtest.h for an example.\n//\n// If you don't care about formatting, you can use the more\n// restrictive version:\n//\n//   ASSERT_PRED1(pred, v1)\n//   ASSERT_PRED2(pred, v1, v2)\n//   ...\n//\n// where pred is an n-ary function or functor that returns bool,\n// and the values v1, v2, ..., must support the << operator for\n// streaming to std::ostream.\n//\n// We also define the EXPECT_* variations.\n//\n// For now we only support predicates whose arity is at most 5.\n// Please email googletestframework@googlegroups.com if you need\n// support for higher arities.\n\n// GTEST_ASSERT_ is the basic statement to which all of the assertions\n// in this file reduce.  Don't use this in your code.\n\n#define GTEST_ASSERT_(expression, on_failure) \\\n  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \\\n  if (const ::testing::AssertionResult gtest_ar = (expression)) \\\n    ; \\\n  else \\\n    on_failure(gtest_ar.failure_message())\n\n\n// Helper function for implementing {EXPECT|ASSERT}_PRED1.  Don't use\n// this in your code.\ntemplate <typename Pred,\n          typename T1>\nAssertionResult AssertPred1Helper(const char* pred_text,\n                                  const char* e1,\n                                  Pred pred,\n                                  const T1& v1) {\n  if (pred(v1)) return AssertionSuccess();\n\n  return AssertionFailure() << pred_text << \"(\"\n                            << e1 << \") evaluates to false, where\"\n                            << \"\\n\" << e1 << \" evaluates to \" << v1;\n}\n\n// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT1.\n// Don't use this in your code.\n#define GTEST_PRED_FORMAT1_(pred_format, v1, on_failure)\\\n  GTEST_ASSERT_(pred_format(#v1, v1),\\\n                on_failure)\n\n// Internal macro for implementing {EXPECT|ASSERT}_PRED1.  Don't use\n// this in your code.\n#define GTEST_PRED1_(pred, v1, on_failure)\\\n  GTEST_ASSERT_(::testing::AssertPred1Helper(#pred, \\\n                                             #v1, \\\n                                             pred, \\\n                                             v1), on_failure)\n\n// Unary predicate assertion macros.\n#define EXPECT_PRED_FORMAT1(pred_format, v1) \\\n  GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_NONFATAL_FAILURE_)\n#define EXPECT_PRED1(pred, v1) \\\n  GTEST_PRED1_(pred, v1, GTEST_NONFATAL_FAILURE_)\n#define ASSERT_PRED_FORMAT1(pred_format, v1) \\\n  GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_FATAL_FAILURE_)\n#define ASSERT_PRED1(pred, v1) \\\n  GTEST_PRED1_(pred, v1, GTEST_FATAL_FAILURE_)\n\n\n\n// Helper function for implementing {EXPECT|ASSERT}_PRED2.  Don't use\n// this in your code.\ntemplate <typename Pred,\n          typename T1,\n          typename T2>\nAssertionResult AssertPred2Helper(const char* pred_text,\n                                  const char* e1,\n                                  const char* e2,\n                                  Pred pred,\n                                  const T1& v1,\n                                  const T2& v2) {\n  if (pred(v1, v2)) return AssertionSuccess();\n\n  return AssertionFailure() << pred_text << \"(\"\n                            << e1 << \", \"\n                            << e2 << \") evaluates to false, where\"\n                            << \"\\n\" << e1 << \" evaluates to \" << v1\n                            << \"\\n\" << e2 << \" evaluates to \" << v2;\n}\n\n// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT2.\n// Don't use this in your code.\n#define GTEST_PRED_FORMAT2_(pred_format, v1, v2, on_failure)\\\n  GTEST_ASSERT_(pred_format(#v1, #v2, v1, v2),\\\n                on_failure)\n\n// Internal macro for implementing {EXPECT|ASSERT}_PRED2.  Don't use\n// this in your code.\n#define GTEST_PRED2_(pred, v1, v2, on_failure)\\\n  GTEST_ASSERT_(::testing::AssertPred2Helper(#pred, \\\n                                             #v1, \\\n                                             #v2, \\\n                                             pred, \\\n                                             v1, \\\n                                             v2), on_failure)\n\n// Binary predicate assertion macros.\n#define EXPECT_PRED_FORMAT2(pred_format, v1, v2) \\\n  GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_NONFATAL_FAILURE_)\n#define EXPECT_PRED2(pred, v1, v2) \\\n  GTEST_PRED2_(pred, v1, v2, GTEST_NONFATAL_FAILURE_)\n#define ASSERT_PRED_FORMAT2(pred_format, v1, v2) \\\n  GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_FATAL_FAILURE_)\n#define ASSERT_PRED2(pred, v1, v2) \\\n  GTEST_PRED2_(pred, v1, v2, GTEST_FATAL_FAILURE_)\n\n\n\n// Helper function for implementing {EXPECT|ASSERT}_PRED3.  Don't use\n// this in your code.\ntemplate <typename Pred,\n          typename T1,\n          typename T2,\n          typename T3>\nAssertionResult AssertPred3Helper(const char* pred_text,\n                                  const char* e1,\n                                  const char* e2,\n                                  const char* e3,\n                                  Pred pred,\n                                  const T1& v1,\n                                  const T2& v2,\n                                  const T3& v3) {\n  if (pred(v1, v2, v3)) return AssertionSuccess();\n\n  return AssertionFailure() << pred_text << \"(\"\n                            << e1 << \", \"\n                            << e2 << \", \"\n                            << e3 << \") evaluates to false, where\"\n                            << \"\\n\" << e1 << \" evaluates to \" << v1\n                            << \"\\n\" << e2 << \" evaluates to \" << v2\n                            << \"\\n\" << e3 << \" evaluates to \" << v3;\n}\n\n// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT3.\n// Don't use this in your code.\n#define GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, on_failure)\\\n  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, v1, v2, v3),\\\n                on_failure)\n\n// Internal macro for implementing {EXPECT|ASSERT}_PRED3.  Don't use\n// this in your code.\n#define GTEST_PRED3_(pred, v1, v2, v3, on_failure)\\\n  GTEST_ASSERT_(::testing::AssertPred3Helper(#pred, \\\n                                             #v1, \\\n                                             #v2, \\\n                                             #v3, \\\n                                             pred, \\\n                                             v1, \\\n                                             v2, \\\n                                             v3), on_failure)\n\n// Ternary predicate assertion macros.\n#define EXPECT_PRED_FORMAT3(pred_format, v1, v2, v3) \\\n  GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_NONFATAL_FAILURE_)\n#define EXPECT_PRED3(pred, v1, v2, v3) \\\n  GTEST_PRED3_(pred, v1, v2, v3, GTEST_NONFATAL_FAILURE_)\n#define ASSERT_PRED_FORMAT3(pred_format, v1, v2, v3) \\\n  GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_FATAL_FAILURE_)\n#define ASSERT_PRED3(pred, v1, v2, v3) \\\n  GTEST_PRED3_(pred, v1, v2, v3, GTEST_FATAL_FAILURE_)\n\n\n\n// Helper function for implementing {EXPECT|ASSERT}_PRED4.  Don't use\n// this in your code.\ntemplate <typename Pred,\n          typename T1,\n          typename T2,\n          typename T3,\n          typename T4>\nAssertionResult AssertPred4Helper(const char* pred_text,\n                                  const char* e1,\n                                  const char* e2,\n                                  const char* e3,\n                                  const char* e4,\n                                  Pred pred,\n                                  const T1& v1,\n                                  const T2& v2,\n                                  const T3& v3,\n                                  const T4& v4) {\n  if (pred(v1, v2, v3, v4)) return AssertionSuccess();\n\n  return AssertionFailure() << pred_text << \"(\"\n                            << e1 << \", \"\n                            << e2 << \", \"\n                            << e3 << \", \"\n                            << e4 << \") evaluates to false, where\"\n                            << \"\\n\" << e1 << \" evaluates to \" << v1\n                            << \"\\n\" << e2 << \" evaluates to \" << v2\n                            << \"\\n\" << e3 << \" evaluates to \" << v3\n                            << \"\\n\" << e4 << \" evaluates to \" << v4;\n}\n\n// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT4.\n// Don't use this in your code.\n#define GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, on_failure)\\\n  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, v1, v2, v3, v4),\\\n                on_failure)\n\n// Internal macro for implementing {EXPECT|ASSERT}_PRED4.  Don't use\n// this in your code.\n#define GTEST_PRED4_(pred, v1, v2, v3, v4, on_failure)\\\n  GTEST_ASSERT_(::testing::AssertPred4Helper(#pred, \\\n                                             #v1, \\\n                                             #v2, \\\n                                             #v3, \\\n                                             #v4, \\\n                                             pred, \\\n                                             v1, \\\n                                             v2, \\\n                                             v3, \\\n                                             v4), on_failure)\n\n// 4-ary predicate assertion macros.\n#define EXPECT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \\\n  GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)\n#define EXPECT_PRED4(pred, v1, v2, v3, v4) \\\n  GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)\n#define ASSERT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \\\n  GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)\n#define ASSERT_PRED4(pred, v1, v2, v3, v4) \\\n  GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)\n\n\n\n// Helper function for implementing {EXPECT|ASSERT}_PRED5.  Don't use\n// this in your code.\ntemplate <typename Pred,\n          typename T1,\n          typename T2,\n          typename T3,\n          typename T4,\n          typename T5>\nAssertionResult AssertPred5Helper(const char* pred_text,\n                                  const char* e1,\n                                  const char* e2,\n                                  const char* e3,\n                                  const char* e4,\n                                  const char* e5,\n                                  Pred pred,\n                                  const T1& v1,\n                                  const T2& v2,\n                                  const T3& v3,\n                                  const T4& v4,\n                                  const T5& v5) {\n  if (pred(v1, v2, v3, v4, v5)) return AssertionSuccess();\n\n  return AssertionFailure() << pred_text << \"(\"\n                            << e1 << \", \"\n                            << e2 << \", \"\n                            << e3 << \", \"\n                            << e4 << \", \"\n                            << e5 << \") evaluates to false, where\"\n                            << \"\\n\" << e1 << \" evaluates to \" << v1\n                            << \"\\n\" << e2 << \" evaluates to \" << v2\n                            << \"\\n\" << e3 << \" evaluates to \" << v3\n                            << \"\\n\" << e4 << \" evaluates to \" << v4\n                            << \"\\n\" << e5 << \" evaluates to \" << v5;\n}\n\n// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT5.\n// Don't use this in your code.\n#define GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, on_failure)\\\n  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, #v5, v1, v2, v3, v4, v5),\\\n                on_failure)\n\n// Internal macro for implementing {EXPECT|ASSERT}_PRED5.  Don't use\n// this in your code.\n#define GTEST_PRED5_(pred, v1, v2, v3, v4, v5, on_failure)\\\n  GTEST_ASSERT_(::testing::AssertPred5Helper(#pred, \\\n                                             #v1, \\\n                                             #v2, \\\n                                             #v3, \\\n                                             #v4, \\\n                                             #v5, \\\n                                             pred, \\\n                                             v1, \\\n                                             v2, \\\n                                             v3, \\\n                                             v4, \\\n                                             v5), on_failure)\n\n// 5-ary predicate assertion macros.\n#define EXPECT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \\\n  GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)\n#define EXPECT_PRED5(pred, v1, v2, v3, v4, v5) \\\n  GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)\n#define ASSERT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \\\n  GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)\n#define ASSERT_PRED5(pred, v1, v2, v3, v4, v5) \\\n  GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)\n\n\n\n#endif  // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_\n\n// Macros for testing equalities and inequalities.\n//\n//    * {ASSERT|EXPECT}_EQ(expected, actual): Tests that expected == actual\n//    * {ASSERT|EXPECT}_NE(v1, v2):           Tests that v1 != v2\n//    * {ASSERT|EXPECT}_LT(v1, v2):           Tests that v1 < v2\n//    * {ASSERT|EXPECT}_LE(v1, v2):           Tests that v1 <= v2\n//    * {ASSERT|EXPECT}_GT(v1, v2):           Tests that v1 > v2\n//    * {ASSERT|EXPECT}_GE(v1, v2):           Tests that v1 >= v2\n//\n// When they are not, Google Test prints both the tested expressions and\n// their actual values.  The values must be compatible built-in types,\n// or you will get a compiler error.  By \"compatible\" we mean that the\n// values can be compared by the respective operator.\n//\n// Note:\n//\n//   1. It is possible to make a user-defined type work with\n//   {ASSERT|EXPECT}_??(), but that requires overloading the\n//   comparison operators and is thus discouraged by the Google C++\n//   Usage Guide.  Therefore, you are advised to use the\n//   {ASSERT|EXPECT}_TRUE() macro to assert that two objects are\n//   equal.\n//\n//   2. The {ASSERT|EXPECT}_??() macros do pointer comparisons on\n//   pointers (in particular, C strings).  Therefore, if you use it\n//   with two C strings, you are testing how their locations in memory\n//   are related, not how their content is related.  To compare two C\n//   strings by content, use {ASSERT|EXPECT}_STR*().\n//\n//   3. {ASSERT|EXPECT}_EQ(expected, actual) is preferred to\n//   {ASSERT|EXPECT}_TRUE(expected == actual), as the former tells you\n//   what the actual value is when it fails, and similarly for the\n//   other comparisons.\n//\n//   4. Do not depend on the order in which {ASSERT|EXPECT}_??()\n//   evaluate their arguments, which is undefined.\n//\n//   5. These macros evaluate their arguments exactly once.\n//\n// Examples:\n//\n//   EXPECT_NE(5, Foo());\n//   EXPECT_EQ(NULL, a_pointer);\n//   ASSERT_LT(i, array_size);\n//   ASSERT_GT(records.size(), 0) << \"There is no record left.\";\n\n#define EXPECT_EQ(expected, actual) \\\n  EXPECT_PRED_FORMAT2(::testing::internal:: \\\n                      EqHelper<GTEST_IS_NULL_LITERAL_(expected)>::Compare, \\\n                      expected, actual)\n#define EXPECT_NE(expected, actual) \\\n  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperNE, expected, actual)\n#define EXPECT_LE(val1, val2) \\\n  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)\n#define EXPECT_LT(val1, val2) \\\n  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)\n#define EXPECT_GE(val1, val2) \\\n  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)\n#define EXPECT_GT(val1, val2) \\\n  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)\n\n#define GTEST_ASSERT_EQ(expected, actual) \\\n  ASSERT_PRED_FORMAT2(::testing::internal:: \\\n                      EqHelper<GTEST_IS_NULL_LITERAL_(expected)>::Compare, \\\n                      expected, actual)\n#define GTEST_ASSERT_NE(val1, val2) \\\n  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2)\n#define GTEST_ASSERT_LE(val1, val2) \\\n  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)\n#define GTEST_ASSERT_LT(val1, val2) \\\n  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)\n#define GTEST_ASSERT_GE(val1, val2) \\\n  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)\n#define GTEST_ASSERT_GT(val1, val2) \\\n  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)\n\n// Define macro GTEST_DONT_DEFINE_ASSERT_XY to 1 to omit the definition of\n// ASSERT_XY(), which clashes with some users' own code.\n\n#if !GTEST_DONT_DEFINE_ASSERT_EQ\n# define ASSERT_EQ(val1, val2) GTEST_ASSERT_EQ(val1, val2)\n#endif\n\n#if !GTEST_DONT_DEFINE_ASSERT_NE\n# define ASSERT_NE(val1, val2) GTEST_ASSERT_NE(val1, val2)\n#endif\n\n#if !GTEST_DONT_DEFINE_ASSERT_LE\n# define ASSERT_LE(val1, val2) GTEST_ASSERT_LE(val1, val2)\n#endif\n\n#if !GTEST_DONT_DEFINE_ASSERT_LT\n# define ASSERT_LT(val1, val2) GTEST_ASSERT_LT(val1, val2)\n#endif\n\n#if !GTEST_DONT_DEFINE_ASSERT_GE\n# define ASSERT_GE(val1, val2) GTEST_ASSERT_GE(val1, val2)\n#endif\n\n#if !GTEST_DONT_DEFINE_ASSERT_GT\n# define ASSERT_GT(val1, val2) GTEST_ASSERT_GT(val1, val2)\n#endif\n\n// C String Comparisons.  All tests treat NULL and any non-NULL string\n// as different.  Two NULLs are equal.\n//\n//    * {ASSERT|EXPECT}_STREQ(s1, s2):     Tests that s1 == s2\n//    * {ASSERT|EXPECT}_STRNE(s1, s2):     Tests that s1 != s2\n//    * {ASSERT|EXPECT}_STRCASEEQ(s1, s2): Tests that s1 == s2, ignoring case\n//    * {ASSERT|EXPECT}_STRCASENE(s1, s2): Tests that s1 != s2, ignoring case\n//\n// For wide or narrow string objects, you can use the\n// {ASSERT|EXPECT}_??() macros.\n//\n// Don't depend on the order in which the arguments are evaluated,\n// which is undefined.\n//\n// These macros evaluate their arguments exactly once.\n\n#define EXPECT_STREQ(expected, actual) \\\n  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual)\n#define EXPECT_STRNE(s1, s2) \\\n  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)\n#define EXPECT_STRCASEEQ(expected, actual) \\\n  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual)\n#define EXPECT_STRCASENE(s1, s2)\\\n  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)\n\n#define ASSERT_STREQ(expected, actual) \\\n  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual)\n#define ASSERT_STRNE(s1, s2) \\\n  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)\n#define ASSERT_STRCASEEQ(expected, actual) \\\n  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual)\n#define ASSERT_STRCASENE(s1, s2)\\\n  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)\n\n// Macros for comparing floating-point numbers.\n//\n//    * {ASSERT|EXPECT}_FLOAT_EQ(expected, actual):\n//         Tests that two float values are almost equal.\n//    * {ASSERT|EXPECT}_DOUBLE_EQ(expected, actual):\n//         Tests that two double values are almost equal.\n//    * {ASSERT|EXPECT}_NEAR(v1, v2, abs_error):\n//         Tests that v1 and v2 are within the given distance to each other.\n//\n// Google Test uses ULP-based comparison to automatically pick a default\n// error bound that is appropriate for the operands.  See the\n// FloatingPoint template class in gtest-internal.h if you are\n// interested in the implementation details.\n\n#define EXPECT_FLOAT_EQ(expected, actual)\\\n  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \\\n                      expected, actual)\n\n#define EXPECT_DOUBLE_EQ(expected, actual)\\\n  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \\\n                      expected, actual)\n\n#define ASSERT_FLOAT_EQ(expected, actual)\\\n  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \\\n                      expected, actual)\n\n#define ASSERT_DOUBLE_EQ(expected, actual)\\\n  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \\\n                      expected, actual)\n\n#define EXPECT_NEAR(val1, val2, abs_error)\\\n  EXPECT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \\\n                      val1, val2, abs_error)\n\n#define ASSERT_NEAR(val1, val2, abs_error)\\\n  ASSERT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \\\n                      val1, val2, abs_error)\n\n// These predicate format functions work on floating-point values, and\n// can be used in {ASSERT|EXPECT}_PRED_FORMAT2*(), e.g.\n//\n//   EXPECT_PRED_FORMAT2(testing::DoubleLE, Foo(), 5.0);\n\n// Asserts that val1 is less than, or almost equal to, val2.  Fails\n// otherwise.  In particular, it fails if either val1 or val2 is NaN.\nGTEST_API_ AssertionResult FloatLE(const char* expr1, const char* expr2,\n                                   float val1, float val2);\nGTEST_API_ AssertionResult DoubleLE(const char* expr1, const char* expr2,\n                                    double val1, double val2);\n\n\n#if GTEST_OS_WINDOWS\n\n// Macros that test for HRESULT failure and success, these are only useful\n// on Windows, and rely on Windows SDK macros and APIs to compile.\n//\n//    * {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}(expr)\n//\n// When expr unexpectedly fails or succeeds, Google Test prints the\n// expected result and the actual result with both a human-readable\n// string representation of the error, if available, as well as the\n// hex result code.\n# define EXPECT_HRESULT_SUCCEEDED(expr) \\\n    EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))\n\n# define ASSERT_HRESULT_SUCCEEDED(expr) \\\n    ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))\n\n# define EXPECT_HRESULT_FAILED(expr) \\\n    EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))\n\n# define ASSERT_HRESULT_FAILED(expr) \\\n    ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))\n\n#endif  // GTEST_OS_WINDOWS\n\n// Macros that execute statement and check that it doesn't generate new fatal\n// failures in the current thread.\n//\n//   * {ASSERT|EXPECT}_NO_FATAL_FAILURE(statement);\n//\n// Examples:\n//\n//   EXPECT_NO_FATAL_FAILURE(Process());\n//   ASSERT_NO_FATAL_FAILURE(Process()) << \"Process() failed\";\n//\n#define ASSERT_NO_FATAL_FAILURE(statement) \\\n    GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_FATAL_FAILURE_)\n#define EXPECT_NO_FATAL_FAILURE(statement) \\\n    GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_NONFATAL_FAILURE_)\n\n// Causes a trace (including the source file path, the current line\n// number, and the given message) to be included in every test failure\n// message generated by code in the current scope.  The effect is\n// undone when the control leaves the current scope.\n//\n// The message argument can be anything streamable to std::ostream.\n//\n// In the implementation, we include the current line number as part\n// of the dummy variable name, thus allowing multiple SCOPED_TRACE()s\n// to appear in the same block - as long as they are on different\n// lines.\n#define SCOPED_TRACE(message) \\\n  ::testing::internal::ScopedTrace GTEST_CONCAT_TOKEN_(gtest_trace_, __LINE__)(\\\n    __FILE__, __LINE__, ::testing::Message() << (message))\n\n// Compile-time assertion for type equality.\n// StaticAssertTypeEq<type1, type2>() compiles iff type1 and type2 are\n// the same type.  The value it returns is not interesting.\n//\n// Instead of making StaticAssertTypeEq a class template, we make it a\n// function template that invokes a helper class template.  This\n// prevents a user from misusing StaticAssertTypeEq<T1, T2> by\n// defining objects of that type.\n//\n// CAVEAT:\n//\n// When used inside a method of a class template,\n// StaticAssertTypeEq<T1, T2>() is effective ONLY IF the method is\n// instantiated.  For example, given:\n//\n//   template <typename T> class Foo {\n//    public:\n//     void Bar() { testing::StaticAssertTypeEq<int, T>(); }\n//   };\n//\n// the code:\n//\n//   void Test1() { Foo<bool> foo; }\n//\n// will NOT generate a compiler error, as Foo<bool>::Bar() is never\n// actually instantiated.  Instead, you need:\n//\n//   void Test2() { Foo<bool> foo; foo.Bar(); }\n//\n// to cause a compiler error.\ntemplate <typename T1, typename T2>\nbool StaticAssertTypeEq() {\n  (void)internal::StaticAssertTypeEqHelper<T1, T2>();\n  return true;\n}\n\n// Defines a test.\n//\n// The first parameter is the name of the test case, and the second\n// parameter is the name of the test within the test case.\n//\n// The convention is to end the test case name with \"Test\".  For\n// example, a test case for the Foo class can be named FooTest.\n//\n// The user should put his test code between braces after using this\n// macro.  Example:\n//\n//   TEST(FooTest, InitializesCorrectly) {\n//     Foo foo;\n//     EXPECT_TRUE(foo.StatusIsOK());\n//   }\n\n// Note that we call GetTestTypeId() instead of GetTypeId<\n// ::testing::Test>() here to get the type ID of testing::Test.  This\n// is to work around a suspected linker bug when using Google Test as\n// a framework on Mac OS X.  The bug causes GetTypeId<\n// ::testing::Test>() to return different values depending on whether\n// the call is from the Google Test framework itself or from user test\n// code.  GetTestTypeId() is guaranteed to always return the same\n// value, as it always calls GetTypeId<>() from the Google Test\n// framework.\n#define GTEST_TEST(test_case_name, test_name)\\\n  GTEST_TEST_(test_case_name, test_name, \\\n              ::testing::Test, ::testing::internal::GetTestTypeId())\n\n// Define this macro to 1 to omit the definition of TEST(), which\n// is a generic name and clashes with some other libraries.\n#if !GTEST_DONT_DEFINE_TEST\n# define TEST(test_case_name, test_name) GTEST_TEST(test_case_name, test_name)\n#endif\n\n// Defines a test that uses a test fixture.\n//\n// The first parameter is the name of the test fixture class, which\n// also doubles as the test case name.  The second parameter is the\n// name of the test within the test case.\n//\n// A test fixture class must be declared earlier.  The user should put\n// his test code between braces after using this macro.  Example:\n//\n//   class FooTest : public testing::Test {\n//    protected:\n//     virtual void SetUp() { b_.AddElement(3); }\n//\n//     Foo a_;\n//     Foo b_;\n//   };\n//\n//   TEST_F(FooTest, InitializesCorrectly) {\n//     EXPECT_TRUE(a_.StatusIsOK());\n//   }\n//\n//   TEST_F(FooTest, ReturnsElementCountCorrectly) {\n//     EXPECT_EQ(0, a_.size());\n//     EXPECT_EQ(1, b_.size());\n//   }\n\n#define TEST_F(test_fixture, test_name)\\\n  GTEST_TEST_(test_fixture, test_name, test_fixture, \\\n              ::testing::internal::GetTypeId<test_fixture>())\n\n// Use this macro in main() to run all tests.  It returns 0 if all\n// tests are successful, or 1 otherwise.\n//\n// RUN_ALL_TESTS() should be invoked after the command line has been\n// parsed by InitGoogleTest().\n\n#define RUN_ALL_TESTS()\\\n  (::testing::UnitTest::GetInstance()->Run())\n\n}  // namespace testing\n\n#endif  // GTEST_INCLUDE_GTEST_GTEST_H_\n"
  },
  {
    "path": "thirdparty/gtest/src/gtest-all.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: mheule@google.com (Markus Heule)\n//\n// Google C++ Testing Framework (Google Test)\n//\n// Sometimes it's desirable to build Google Test by compiling a single file.\n// This file serves this purpose.\n\n// This line ensures that gtest.h can be compiled on its own, even\n// when it's fused.\n#include \"gtest/gtest_ASP.h\"\n\n// The following lines pull in the real gtest *.cc files.\n// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n//\n// The Google C++ Testing Framework (Google Test)\n\n// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n//\n// Utilities for testing Google Test itself and code that uses Google Test\n// (e.g. frameworks built on top of Google Test).\n\n#ifndef GTEST_INCLUDE_GTEST_GTEST_SPI_H_\n#define GTEST_INCLUDE_GTEST_GTEST_SPI_H_\n\n\nnamespace testing {\n\n// This helper class can be used to mock out Google Test failure reporting\n// so that we can test Google Test or code that builds on Google Test.\n//\n// An object of this class appends a TestPartResult object to the\n// TestPartResultArray object given in the constructor whenever a Google Test\n// failure is reported. It can either intercept only failures that are\n// generated in the same thread that created this object or it can intercept\n// all generated failures. The scope of this mock object can be controlled with\n// the second argument to the two arguments constructor.\nclass GTEST_API_ ScopedFakeTestPartResultReporter\n    : public TestPartResultReporterInterface {\n public:\n  // The two possible mocking modes of this object.\n  enum InterceptMode {\n    INTERCEPT_ONLY_CURRENT_THREAD,  // Intercepts only thread local failures.\n    INTERCEPT_ALL_THREADS           // Intercepts all failures.\n  };\n\n  // The c'tor sets this object as the test part result reporter used\n  // by Google Test.  The 'result' parameter specifies where to report the\n  // results. This reporter will only catch failures generated in the current\n  // thread. DEPRECATED\n  explicit ScopedFakeTestPartResultReporter(TestPartResultArray* result);\n\n  // Same as above, but you can choose the interception scope of this object.\n  ScopedFakeTestPartResultReporter(InterceptMode intercept_mode,\n                                   TestPartResultArray* result);\n\n  // The d'tor restores the previous test part result reporter.\n  virtual ~ScopedFakeTestPartResultReporter();\n\n  // Appends the TestPartResult object to the TestPartResultArray\n  // received in the constructor.\n  //\n  // This method is from the TestPartResultReporterInterface\n  // interface.\n  virtual void ReportTestPartResult(const TestPartResult& result);\n private:\n  void Init();\n\n  const InterceptMode intercept_mode_;\n  TestPartResultReporterInterface* old_reporter_;\n  TestPartResultArray* const result_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedFakeTestPartResultReporter);\n};\n\nnamespace internal {\n\n// A helper class for implementing EXPECT_FATAL_FAILURE() and\n// EXPECT_NONFATAL_FAILURE().  Its destructor verifies that the given\n// TestPartResultArray contains exactly one failure that has the given\n// type and contains the given substring.  If that's not the case, a\n// non-fatal failure will be generated.\nclass GTEST_API_ SingleFailureChecker {\n public:\n  // The constructor remembers the arguments.\n  SingleFailureChecker(const TestPartResultArray* results,\n                       TestPartResult::Type type,\n                       const string& substr);\n  ~SingleFailureChecker();\n private:\n  const TestPartResultArray* const results_;\n  const TestPartResult::Type type_;\n  const string substr_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(SingleFailureChecker);\n};\n\n}  // namespace internal\n\n}  // namespace testing\n\n// A set of macros for testing Google Test assertions or code that's expected\n// to generate Google Test fatal failures.  It verifies that the given\n// statement will cause exactly one fatal Google Test failure with 'substr'\n// being part of the failure message.\n//\n// There are two different versions of this macro. EXPECT_FATAL_FAILURE only\n// affects and considers failures generated in the current thread and\n// EXPECT_FATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.\n//\n// The verification of the assertion is done correctly even when the statement\n// throws an exception or aborts the current function.\n//\n// Known restrictions:\n//   - 'statement' cannot reference local non-static variables or\n//     non-static members of the current object.\n//   - 'statement' cannot return a value.\n//   - You cannot stream a failure message to this macro.\n//\n// Note that even though the implementations of the following two\n// macros are much alike, we cannot refactor them to use a common\n// helper macro, due to some peculiarity in how the preprocessor\n// works.  The AcceptsMacroThatExpandsToUnprotectedComma test in\n// gtest_unittest.cc will fail to compile if we do that.\n#define EXPECT_FATAL_FAILURE(statement, substr) \\\n  do { \\\n    class GTestExpectFatalFailureHelper {\\\n     public:\\\n      static void Execute() { statement; }\\\n    };\\\n    ::testing::TestPartResultArray gtest_failures;\\\n    ::testing::internal::SingleFailureChecker gtest_checker(\\\n        &gtest_failures, ::testing::TestPartResult::kFatalFailure, (substr));\\\n    {\\\n      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\\\n          ::testing::ScopedFakeTestPartResultReporter:: \\\n          INTERCEPT_ONLY_CURRENT_THREAD, &gtest_failures);\\\n      GTestExpectFatalFailureHelper::Execute();\\\n    }\\\n  } while (::testing::internal::AlwaysFalse())\n\n#define EXPECT_FATAL_FAILURE_ON_ALL_THREADS(statement, substr) \\\n  do { \\\n    class GTestExpectFatalFailureHelper {\\\n     public:\\\n      static void Execute() { statement; }\\\n    };\\\n    ::testing::TestPartResultArray gtest_failures;\\\n    ::testing::internal::SingleFailureChecker gtest_checker(\\\n        &gtest_failures, ::testing::TestPartResult::kFatalFailure, (substr));\\\n    {\\\n      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\\\n          ::testing::ScopedFakeTestPartResultReporter:: \\\n          INTERCEPT_ALL_THREADS, &gtest_failures);\\\n      GTestExpectFatalFailureHelper::Execute();\\\n    }\\\n  } while (::testing::internal::AlwaysFalse())\n\n// A macro for testing Google Test assertions or code that's expected to\n// generate Google Test non-fatal failures.  It asserts that the given\n// statement will cause exactly one non-fatal Google Test failure with 'substr'\n// being part of the failure message.\n//\n// There are two different versions of this macro. EXPECT_NONFATAL_FAILURE only\n// affects and considers failures generated in the current thread and\n// EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.\n//\n// 'statement' is allowed to reference local variables and members of\n// the current object.\n//\n// The verification of the assertion is done correctly even when the statement\n// throws an exception or aborts the current function.\n//\n// Known restrictions:\n//   - You cannot stream a failure message to this macro.\n//\n// Note that even though the implementations of the following two\n// macros are much alike, we cannot refactor them to use a common\n// helper macro, due to some peculiarity in how the preprocessor\n// works.  If we do that, the code won't compile when the user gives\n// EXPECT_NONFATAL_FAILURE() a statement that contains a macro that\n// expands to code containing an unprotected comma.  The\n// AcceptsMacroThatExpandsToUnprotectedComma test in gtest_unittest.cc\n// catches that.\n//\n// For the same reason, we have to write\n//   if (::testing::internal::AlwaysTrue()) { statement; }\n// instead of\n//   GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)\n// to avoid an MSVC warning on unreachable code.\n#define EXPECT_NONFATAL_FAILURE(statement, substr) \\\n  do {\\\n    ::testing::TestPartResultArray gtest_failures;\\\n    ::testing::internal::SingleFailureChecker gtest_checker(\\\n        &gtest_failures, ::testing::TestPartResult::kNonFatalFailure, \\\n        (substr));\\\n    {\\\n      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\\\n          ::testing::ScopedFakeTestPartResultReporter:: \\\n          INTERCEPT_ONLY_CURRENT_THREAD, &gtest_failures);\\\n      if (::testing::internal::AlwaysTrue()) { statement; }\\\n    }\\\n  } while (::testing::internal::AlwaysFalse())\n\n#define EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(statement, substr) \\\n  do {\\\n    ::testing::TestPartResultArray gtest_failures;\\\n    ::testing::internal::SingleFailureChecker gtest_checker(\\\n        &gtest_failures, ::testing::TestPartResult::kNonFatalFailure, \\\n        (substr));\\\n    {\\\n      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\\\n          ::testing::ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS,\\\n          &gtest_failures);\\\n      if (::testing::internal::AlwaysTrue()) { statement; }\\\n    }\\\n  } while (::testing::internal::AlwaysFalse())\n\n#endif  // GTEST_INCLUDE_GTEST_GTEST_SPI_H_\n\n#include <ctype.h>\n#include <math.h>\n#include <stdarg.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <wchar.h>\n#include <wctype.h>\n\n#include <algorithm>\n#include <ostream>  // NOLINT\n#include <sstream>\n#include <vector>\n\n#if GTEST_OS_LINUX\n\n// TODO(kenton@google.com): Use autoconf to detect availability of\n// gettimeofday().\n# define GTEST_HAS_GETTIMEOFDAY_ 1\n\n# include <fcntl.h>  // NOLINT\n# include <limits.h>  // NOLINT\n# include <sched.h>  // NOLINT\n// Declares vsnprintf().  This header is not available on Windows.\n# include <strings.h>  // NOLINT\n# include <sys/mman.h>  // NOLINT\n# include <sys/time.h>  // NOLINT\n# include <unistd.h>  // NOLINT\n# include <string>\n\n#elif GTEST_OS_SYMBIAN\n# define GTEST_HAS_GETTIMEOFDAY_ 1\n# include <sys/time.h>  // NOLINT\n\n#elif GTEST_OS_ZOS\n# define GTEST_HAS_GETTIMEOFDAY_ 1\n# include <sys/time.h>  // NOLINT\n\n// On z/OS we additionally need strings.h for strcasecmp.\n# include <strings.h>  // NOLINT\n\n#elif GTEST_OS_WINDOWS_MOBILE  // We are on Windows CE.\n\n# include <windows.h>  // NOLINT\n\n#elif GTEST_OS_WINDOWS  // We are on Windows proper.\n\n# include <io.h>  // NOLINT\n# include <sys/timeb.h>  // NOLINT\n# include <sys/types.h>  // NOLINT\n# include <sys/stat.h>  // NOLINT\n\n# if GTEST_OS_WINDOWS_MINGW\n// MinGW has gettimeofday() but not _ftime64().\n// TODO(kenton@google.com): Use autoconf to detect availability of\n//   gettimeofday().\n// TODO(kenton@google.com): There are other ways to get the time on\n//   Windows, like GetTickCount() or GetSystemTimeAsFileTime().  MinGW\n//   supports these.  consider using them instead.\n#  define GTEST_HAS_GETTIMEOFDAY_ 1\n#  include <sys/time.h>  // NOLINT\n# endif  // GTEST_OS_WINDOWS_MINGW\n\n// cpplint thinks that the header is already included, so we want to\n// silence it.\n# include <windows.h>  // NOLINT\n\n#else\n\n// Assume other platforms have gettimeofday().\n// TODO(kenton@google.com): Use autoconf to detect availability of\n//   gettimeofday().\n# define GTEST_HAS_GETTIMEOFDAY_ 1\n\n// cpplint thinks that the header is already included, so we want to\n// silence it.\n# include <sys/time.h>  // NOLINT\n# include <unistd.h>  // NOLINT\n\n#endif  // GTEST_OS_LINUX\n\n#if GTEST_HAS_EXCEPTIONS\n# include <stdexcept>\n#endif\n\n#if GTEST_CAN_STREAM_RESULTS_\n# include <arpa/inet.h>  // NOLINT\n# include <netdb.h>  // NOLINT\n#endif\n\n// Indicates that this translation unit is part of Google Test's\n// implementation.  It must come before gtest-internal-inl.h is\n// included, or there will be a compiler error.  This trick is to\n// prevent a user from accidentally including gtest-internal-inl.h in\n// his code.\n#define GTEST_IMPLEMENTATION_ 1\n// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Utility functions and classes used by the Google C++ testing framework.\n//\n// Author: wan@google.com (Zhanyong Wan)\n//\n// This file contains purely Google Test's internal implementation.  Please\n// DO NOT #INCLUDE IT IN A USER PROGRAM.\n\n#ifndef GTEST_SRC_GTEST_INTERNAL_INL_H_\n#define GTEST_SRC_GTEST_INTERNAL_INL_H_\n\n// GTEST_IMPLEMENTATION_ is defined to 1 iff the current translation unit is\n// part of Google Test's implementation; otherwise it's undefined.\n#if !GTEST_IMPLEMENTATION_\n// A user is trying to include this from his code - just say no.\n# error \"gtest-internal-inl.h is part of Google Test's internal implementation.\"\n# error \"It must not be included except by Google Test itself.\"\n#endif  // GTEST_IMPLEMENTATION_\n\n#ifndef _WIN32_WCE\n# include <errno.h>\n#endif  // !_WIN32_WCE\n#include <stddef.h>\n#include <stdlib.h>  // For strtoll/_strtoul64/malloc/free.\n#include <string.h>  // For memmove.\n\n#include <algorithm>\n#include <string>\n#include <vector>\n\n\n#if GTEST_OS_WINDOWS\n# include <windows.h>  // NOLINT\n#endif  // GTEST_OS_WINDOWS\n\n\nnamespace testing {\n\n// Declares the flags.\n//\n// We don't want the users to modify this flag in the code, but want\n// Google Test's own unit tests to be able to access it. Therefore we\n// declare it here as opposed to in gtest.h.\nGTEST_DECLARE_bool_(death_test_use_fork);\n\nnamespace internal {\n\n// The value of GetTestTypeId() as seen from within the Google Test\n// library.  This is solely for testing GetTestTypeId().\nGTEST_API_ extern const TypeId kTestTypeIdInGoogleTest;\n\n// Names of the flags (needed for parsing Google Test flags).\nconst char kAlsoRunDisabledTestsFlag[] = \"also_run_disabled_tests\";\nconst char kBreakOnFailureFlag[] = \"break_on_failure\";\nconst char kCatchExceptionsFlag[] = \"catch_exceptions\";\nconst char kColorFlag[] = \"color\";\nconst char kFilterFlag[] = \"filter\";\nconst char kListTestsFlag[] = \"list_tests\";\nconst char kOutputFlag[] = \"output\";\nconst char kPrintTimeFlag[] = \"print_time\";\nconst char kRandomSeedFlag[] = \"random_seed\";\nconst char kRepeatFlag[] = \"repeat\";\nconst char kShuffleFlag[] = \"shuffle\";\nconst char kStackTraceDepthFlag[] = \"stack_trace_depth\";\nconst char kStreamResultToFlag[] = \"stream_result_to\";\nconst char kThrowOnFailureFlag[] = \"throw_on_failure\";\n\n// A valid random seed must be in [1, kMaxRandomSeed].\nconst int kMaxRandomSeed = 99999;\n\n// g_help_flag is true iff the --help flag or an equivalent form is\n// specified on the command line.\nGTEST_API_ extern bool g_help_flag;\n\n// Returns the current time in milliseconds.\nGTEST_API_ TimeInMillis GetTimeInMillis();\n\n// Returns true iff Google Test should use colors in the output.\nGTEST_API_ bool ShouldUseColor(bool stdout_is_tty);\n\n// Formats the given time in milliseconds as seconds.\nGTEST_API_ std::string FormatTimeInMillisAsSeconds(TimeInMillis ms);\n\n// Parses a string for an Int32 flag, in the form of \"--flag=value\".\n//\n// On success, stores the value of the flag in *value, and returns\n// true.  On failure, returns false without changing *value.\nGTEST_API_ bool ParseInt32Flag(\n    const char* str, const char* flag, Int32* value);\n\n// Returns a random seed in range [1, kMaxRandomSeed] based on the\n// given --gtest_random_seed flag value.\ninline int GetRandomSeedFromFlag(Int32 random_seed_flag) {\n  const unsigned int raw_seed = (random_seed_flag == 0) ?\n      static_cast<unsigned int>(GetTimeInMillis()) :\n      static_cast<unsigned int>(random_seed_flag);\n\n  // Normalizes the actual seed to range [1, kMaxRandomSeed] such that\n  // it's easy to type.\n  const int normalized_seed =\n      static_cast<int>((raw_seed - 1U) %\n                       static_cast<unsigned int>(kMaxRandomSeed)) + 1;\n  return normalized_seed;\n}\n\n// Returns the first valid random seed after 'seed'.  The behavior is\n// undefined if 'seed' is invalid.  The seed after kMaxRandomSeed is\n// considered to be 1.\ninline int GetNextRandomSeed(int seed) {\n  GTEST_CHECK_(1 <= seed && seed <= kMaxRandomSeed)\n      << \"Invalid random seed \" << seed << \" - must be in [1, \"\n      << kMaxRandomSeed << \"].\";\n  const int next_seed = seed + 1;\n  return (next_seed > kMaxRandomSeed) ? 1 : next_seed;\n}\n\n// This class saves the values of all Google Test flags in its c'tor, and\n// restores them in its d'tor.\nclass GTestFlagSaver {\n public:\n  // The c'tor.\n  GTestFlagSaver() {\n    also_run_disabled_tests_ = GTEST_FLAG(also_run_disabled_tests);\n    break_on_failure_ = GTEST_FLAG(break_on_failure);\n    catch_exceptions_ = GTEST_FLAG(catch_exceptions);\n    color_ = GTEST_FLAG(color);\n    death_test_style_ = GTEST_FLAG(death_test_style);\n    death_test_use_fork_ = GTEST_FLAG(death_test_use_fork);\n    filter_ = GTEST_FLAG(filter);\n    internal_run_death_test_ = GTEST_FLAG(internal_run_death_test);\n    list_tests_ = GTEST_FLAG(list_tests);\n    output_ = GTEST_FLAG(output);\n    print_time_ = GTEST_FLAG(print_time);\n    random_seed_ = GTEST_FLAG(random_seed);\n    repeat_ = GTEST_FLAG(repeat);\n    shuffle_ = GTEST_FLAG(shuffle);\n    stack_trace_depth_ = GTEST_FLAG(stack_trace_depth);\n    stream_result_to_ = GTEST_FLAG(stream_result_to);\n    throw_on_failure_ = GTEST_FLAG(throw_on_failure);\n  }\n\n  // The d'tor is not virtual.  DO NOT INHERIT FROM THIS CLASS.\n  ~GTestFlagSaver() {\n    GTEST_FLAG(also_run_disabled_tests) = also_run_disabled_tests_;\n    GTEST_FLAG(break_on_failure) = break_on_failure_;\n    GTEST_FLAG(catch_exceptions) = catch_exceptions_;\n    GTEST_FLAG(color) = color_;\n    GTEST_FLAG(death_test_style) = death_test_style_;\n    GTEST_FLAG(death_test_use_fork) = death_test_use_fork_;\n    GTEST_FLAG(filter) = filter_;\n    GTEST_FLAG(internal_run_death_test) = internal_run_death_test_;\n    GTEST_FLAG(list_tests) = list_tests_;\n    GTEST_FLAG(output) = output_;\n    GTEST_FLAG(print_time) = print_time_;\n    GTEST_FLAG(random_seed) = random_seed_;\n    GTEST_FLAG(repeat) = repeat_;\n    GTEST_FLAG(shuffle) = shuffle_;\n    GTEST_FLAG(stack_trace_depth) = stack_trace_depth_;\n    GTEST_FLAG(stream_result_to) = stream_result_to_;\n    GTEST_FLAG(throw_on_failure) = throw_on_failure_;\n  }\n private:\n  // Fields for saving the original values of flags.\n  bool also_run_disabled_tests_;\n  bool break_on_failure_;\n  bool catch_exceptions_;\n  String color_;\n  String death_test_style_;\n  bool death_test_use_fork_;\n  String filter_;\n  String internal_run_death_test_;\n  bool list_tests_;\n  String output_;\n  bool print_time_;\n  bool pretty_;\n  internal::Int32 random_seed_;\n  internal::Int32 repeat_;\n  bool shuffle_;\n  internal::Int32 stack_trace_depth_;\n  String stream_result_to_;\n  bool throw_on_failure_;\n} GTEST_ATTRIBUTE_UNUSED_;\n\n// Converts a Unicode code point to a narrow string in UTF-8 encoding.\n// code_point parameter is of type UInt32 because wchar_t may not be\n// wide enough to contain a code point.\n// The output buffer str must containt at least 32 characters.\n// The function returns the address of the output buffer.\n// If the code_point is not a valid Unicode code point\n// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be output\n// as '(Invalid Unicode 0xXXXXXXXX)'.\nGTEST_API_ char* CodePointToUtf8(UInt32 code_point, char* str);\n\n// Converts a wide string to a narrow string in UTF-8 encoding.\n// The wide string is assumed to have the following encoding:\n//   UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS)\n//   UTF-32 if sizeof(wchar_t) == 4 (on Linux)\n// Parameter str points to a null-terminated wide string.\n// Parameter num_chars may additionally limit the number\n// of wchar_t characters processed. -1 is used when the entire string\n// should be processed.\n// If the string contains code points that are not valid Unicode code points\n// (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output\n// as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding\n// and contains invalid UTF-16 surrogate pairs, values in those pairs\n// will be encoded as individual Unicode characters from Basic Normal Plane.\nGTEST_API_ String WideStringToUtf8(const wchar_t* str, int num_chars);\n\n// Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file\n// if the variable is present. If a file already exists at this location, this\n// function will write over it. If the variable is present, but the file cannot\n// be created, prints an error and exits.\nvoid WriteToShardStatusFileIfNeeded();\n\n// Checks whether sharding is enabled by examining the relevant\n// environment variable values. If the variables are present,\n// but inconsistent (e.g., shard_index >= total_shards), prints\n// an error and exits. If in_subprocess_for_death_test, sharding is\n// disabled because it must only be applied to the original test\n// process. Otherwise, we could filter out death tests we intended to execute.\nGTEST_API_ bool ShouldShard(const char* total_shards_str,\n                            const char* shard_index_str,\n                            bool in_subprocess_for_death_test);\n\n// Parses the environment variable var as an Int32. If it is unset,\n// returns default_val. If it is not an Int32, prints an error and\n// and aborts.\nGTEST_API_ Int32 Int32FromEnvOrDie(const char* env_var, Int32 default_val);\n\n// Given the total number of shards, the shard index, and the test id,\n// returns true iff the test should be run on this shard. The test id is\n// some arbitrary but unique non-negative integer assigned to each test\n// method. Assumes that 0 <= shard_index < total_shards.\nGTEST_API_ bool ShouldRunTestOnShard(\n    int total_shards, int shard_index, int test_id);\n\n// STL container utilities.\n\n// Returns the number of elements in the given container that satisfy\n// the given predicate.\ntemplate <class Container, typename Predicate>\ninline int CountIf(const Container& c, Predicate predicate) {\n  // Implemented as an explicit loop since std::count_if() in libCstd on\n  // Solaris has a non-standard signature.\n  int count = 0;\n  for (typename Container::const_iterator it = c.begin(); it != c.end(); ++it) {\n    if (predicate(*it))\n      ++count;\n  }\n  return count;\n}\n\n// Applies a function/functor to each element in the container.\ntemplate <class Container, typename Functor>\nvoid ForEach(const Container& c, Functor functor) {\n  std::for_each(c.begin(), c.end(), functor);\n}\n\n// Returns the i-th element of the vector, or default_value if i is not\n// in range [0, v.size()).\ntemplate <typename E>\ninline E GetElementOr(const std::vector<E>& v, int i, E default_value) {\n  return (i < 0 || i >= static_cast<int>(v.size())) ? default_value : v[i];\n}\n\n// Performs an in-place shuffle of a range of the vector's elements.\n// 'begin' and 'end' are element indices as an STL-style range;\n// i.e. [begin, end) are shuffled, where 'end' == size() means to\n// shuffle to the end of the vector.\ntemplate <typename E>\nvoid ShuffleRange(internal::Random* random, int begin, int end,\n                  std::vector<E>* v) {\n  const int size = static_cast<int>(v->size());\n  GTEST_CHECK_(0 <= begin && begin <= size)\n      << \"Invalid shuffle range start \" << begin << \": must be in range [0, \"\n      << size << \"].\";\n  GTEST_CHECK_(begin <= end && end <= size)\n      << \"Invalid shuffle range finish \" << end << \": must be in range [\"\n      << begin << \", \" << size << \"].\";\n\n  // Fisher-Yates shuffle, from\n  // http://en.wikipedia.org/wiki/Fisher-Yates_shuffle\n  for (int range_width = end - begin; range_width >= 2; range_width--) {\n    const int last_in_range = begin + range_width - 1;\n    const int selected = begin + random->Generate(range_width);\n    std::swap((*v)[selected], (*v)[last_in_range]);\n  }\n}\n\n// Performs an in-place shuffle of the vector's elements.\ntemplate <typename E>\ninline void Shuffle(internal::Random* random, std::vector<E>* v) {\n  ShuffleRange(random, 0, static_cast<int>(v->size()), v);\n}\n\n// A function for deleting an object.  Handy for being used as a\n// functor.\ntemplate <typename T>\nstatic void Delete(T* x) {\n  delete x;\n}\n\n// A predicate that checks the key of a TestProperty against a known key.\n//\n// TestPropertyKeyIs is copyable.\nclass TestPropertyKeyIs {\n public:\n  // Constructor.\n  //\n  // TestPropertyKeyIs has NO default constructor.\n  explicit TestPropertyKeyIs(const char* key)\n      : key_(key) {}\n\n  // Returns true iff the test name of test property matches on key_.\n  bool operator()(const TestProperty& test_property) const {\n    return String(test_property.key()).Compare(key_) == 0;\n  }\n\n private:\n  String key_;\n};\n\n// Class UnitTestOptions.\n//\n// This class contains functions for processing options the user\n// specifies when running the tests.  It has only static members.\n//\n// In most cases, the user can specify an option using either an\n// environment variable or a command line flag.  E.g. you can set the\n// test filter using either GTEST_FILTER or --gtest_filter.  If both\n// the variable and the flag are present, the latter overrides the\n// former.\nclass GTEST_API_ UnitTestOptions {\n public:\n  // Functions for processing the gtest_output flag.\n\n  // Returns the output format, or \"\" for normal printed output.\n  static String GetOutputFormat();\n\n  // Returns the absolute path of the requested output file, or the\n  // default (test_detail.xml in the original working directory) if\n  // none was explicitly specified.\n  static String GetAbsolutePathToOutputFile();\n\n  // Functions for processing the gtest_filter flag.\n\n  // Returns true iff the wildcard pattern matches the string.  The\n  // first ':' or '\\0' character in pattern marks the end of it.\n  //\n  // This recursive algorithm isn't very efficient, but is clear and\n  // works well enough for matching test names, which are short.\n  static bool PatternMatchesString(const char *pattern, const char *str);\n\n  // Returns true iff the user-specified filter matches the test case\n  // name and the test name.\n  static bool FilterMatchesTest(const String &test_case_name,\n                                const String &test_name);\n\n#if GTEST_OS_WINDOWS\n  // Function for supporting the gtest_catch_exception flag.\n\n  // Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the\n  // given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise.\n  // This function is useful as an __except condition.\n  static int GTestShouldProcessSEH(DWORD exception_code);\n#endif  // GTEST_OS_WINDOWS\n\n  // Returns true if \"name\" matches the ':' separated list of glob-style\n  // filters in \"filter\".\n  static bool MatchesFilter(const String& name, const char* filter);\n};\n\n// Returns the current application's name, removing directory path if that\n// is present.  Used by UnitTestOptions::GetOutputFile.\nGTEST_API_ FilePath GetCurrentExecutableName();\n\n// The role interface for getting the OS stack trace as a string.\nclass OsStackTraceGetterInterface {\n public:\n  OsStackTraceGetterInterface() {}\n  virtual ~OsStackTraceGetterInterface() {}\n\n  // Returns the current OS stack trace as a String.  Parameters:\n  //\n  //   max_depth  - the maximum number of stack frames to be included\n  //                in the trace.\n  //   skip_count - the number of top frames to be skipped; doesn't count\n  //                against max_depth.\n  virtual String CurrentStackTrace(int max_depth, int skip_count) = 0;\n\n  // UponLeavingGTest() should be called immediately before Google Test calls\n  // user code. It saves some information about the current stack that\n  // CurrentStackTrace() will use to find and hide Google Test stack frames.\n  virtual void UponLeavingGTest() = 0;\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetterInterface);\n};\n\n// A working implementation of the OsStackTraceGetterInterface interface.\nclass OsStackTraceGetter : public OsStackTraceGetterInterface {\n public:\n  OsStackTraceGetter() : caller_frame_(NULL) {}\n  virtual String CurrentStackTrace(int max_depth, int skip_count);\n  virtual void UponLeavingGTest();\n\n  // This string is inserted in place of stack frames that are part of\n  // Google Test's implementation.\n  static const char* const kElidedFramesMarker;\n\n private:\n  Mutex mutex_;  // protects all internal state\n\n  // We save the stack frame below the frame that calls user code.\n  // We do this because the address of the frame immediately below\n  // the user code changes between the call to UponLeavingGTest()\n  // and any calls to CurrentStackTrace() from within the user code.\n  void* caller_frame_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetter);\n};\n\n// Information about a Google Test trace point.\nstruct TraceInfo {\n  const char* file;\n  int line;\n  String message;\n};\n\n// This is the default global test part result reporter used in UnitTestImpl.\n// This class should only be used by UnitTestImpl.\nclass DefaultGlobalTestPartResultReporter\n  : public TestPartResultReporterInterface {\n public:\n  explicit DefaultGlobalTestPartResultReporter(UnitTestImpl* unit_test);\n  // Implements the TestPartResultReporterInterface. Reports the test part\n  // result in the current test.\n  virtual void ReportTestPartResult(const TestPartResult& result);\n\n private:\n  UnitTestImpl* const unit_test_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultGlobalTestPartResultReporter);\n};\n\n// This is the default per thread test part result reporter used in\n// UnitTestImpl. This class should only be used by UnitTestImpl.\nclass DefaultPerThreadTestPartResultReporter\n    : public TestPartResultReporterInterface {\n public:\n  explicit DefaultPerThreadTestPartResultReporter(UnitTestImpl* unit_test);\n  // Implements the TestPartResultReporterInterface. The implementation just\n  // delegates to the current global test part result reporter of *unit_test_.\n  virtual void ReportTestPartResult(const TestPartResult& result);\n\n private:\n  UnitTestImpl* const unit_test_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultPerThreadTestPartResultReporter);\n};\n\n// The private implementation of the UnitTest class.  We don't protect\n// the methods under a mutex, as this class is not accessible by a\n// user and the UnitTest class that delegates work to this class does\n// proper locking.\nclass GTEST_API_ UnitTestImpl {\n public:\n  explicit UnitTestImpl(UnitTest* parent);\n  virtual ~UnitTestImpl();\n\n  // There are two different ways to register your own TestPartResultReporter.\n  // You can register your own repoter to listen either only for test results\n  // from the current thread or for results from all threads.\n  // By default, each per-thread test result repoter just passes a new\n  // TestPartResult to the global test result reporter, which registers the\n  // test part result for the currently running test.\n\n  // Returns the global test part result reporter.\n  TestPartResultReporterInterface* GetGlobalTestPartResultReporter();\n\n  // Sets the global test part result reporter.\n  void SetGlobalTestPartResultReporter(\n      TestPartResultReporterInterface* reporter);\n\n  // Returns the test part result reporter for the current thread.\n  TestPartResultReporterInterface* GetTestPartResultReporterForCurrentThread();\n\n  // Sets the test part result reporter for the current thread.\n  void SetTestPartResultReporterForCurrentThread(\n      TestPartResultReporterInterface* reporter);\n\n  // Gets the number of successful test cases.\n  int successful_test_case_count() const;\n\n  // Gets the number of failed test cases.\n  int failed_test_case_count() const;\n\n  // Gets the number of all test cases.\n  int total_test_case_count() const;\n\n  // Gets the number of all test cases that contain at least one test\n  // that should run.\n  int test_case_to_run_count() const;\n\n  // Gets the number of successful tests.\n  int successful_test_count() const;\n\n  // Gets the number of failed tests.\n  int failed_test_count() const;\n\n  // Gets the number of disabled tests.\n  int disabled_test_count() const;\n\n  // Gets the number of all tests.\n  int total_test_count() const;\n\n  // Gets the number of tests that should run.\n  int test_to_run_count() const;\n\n  // Gets the elapsed time, in milliseconds.\n  TimeInMillis elapsed_time() const { return elapsed_time_; }\n\n  // Returns true iff the unit test passed (i.e. all test cases passed).\n  bool Passed() const { return !Failed(); }\n\n  // Returns true iff the unit test failed (i.e. some test case failed\n  // or something outside of all tests failed).\n  bool Failed() const {\n    return failed_test_case_count() > 0 || ad_hoc_test_result()->Failed();\n  }\n\n  // Gets the i-th test case among all the test cases. i can range from 0 to\n  // total_test_case_count() - 1. If i is not in that range, returns NULL.\n  const TestCase* GetTestCase(int i) const {\n    const int index = GetElementOr(test_case_indices_, i, -1);\n    return index < 0 ? NULL : test_cases_[i];\n  }\n\n  // Gets the i-th test case among all the test cases. i can range from 0 to\n  // total_test_case_count() - 1. If i is not in that range, returns NULL.\n  TestCase* GetMutableTestCase(int i) {\n    const int index = GetElementOr(test_case_indices_, i, -1);\n    return index < 0 ? NULL : test_cases_[index];\n  }\n\n  // Provides access to the event listener list.\n  TestEventListeners* listeners() { return &listeners_; }\n\n  // Returns the TestResult for the test that's currently running, or\n  // the TestResult for the ad hoc test if no test is running.\n  TestResult* current_test_result();\n\n  // Returns the TestResult for the ad hoc test.\n  const TestResult* ad_hoc_test_result() const { return &ad_hoc_test_result_; }\n\n  // Sets the OS stack trace getter.\n  //\n  // Does nothing if the input and the current OS stack trace getter\n  // are the same; otherwise, deletes the old getter and makes the\n  // input the current getter.\n  void set_os_stack_trace_getter(OsStackTraceGetterInterface* getter);\n\n  // Returns the current OS stack trace getter if it is not NULL;\n  // otherwise, creates an OsStackTraceGetter, makes it the current\n  // getter, and returns it.\n  OsStackTraceGetterInterface* os_stack_trace_getter();\n\n  // Returns the current OS stack trace as a String.\n  //\n  // The maximum number of stack frames to be included is specified by\n  // the gtest_stack_trace_depth flag.  The skip_count parameter\n  // specifies the number of top frames to be skipped, which doesn't\n  // count against the number of frames to be included.\n  //\n  // For example, if Foo() calls Bar(), which in turn calls\n  // CurrentOsStackTraceExceptTop(1), Foo() will be included in the\n  // trace but Bar() and CurrentOsStackTraceExceptTop() won't.\n  String CurrentOsStackTraceExceptTop(int skip_count);\n\n  // Finds and returns a TestCase with the given name.  If one doesn't\n  // exist, creates one and returns it.\n  //\n  // Arguments:\n  //\n  //   test_case_name: name of the test case\n  //   type_param:     the name of the test's type parameter, or NULL if\n  //                   this is not a typed or a type-parameterized test.\n  //   set_up_tc:      pointer to the function that sets up the test case\n  //   tear_down_tc:   pointer to the function that tears down the test case\n  TestCase* GetTestCase(const char* test_case_name,\n                        const char* type_param,\n                        Test::SetUpTestCaseFunc set_up_tc,\n                        Test::TearDownTestCaseFunc tear_down_tc);\n\n  // Adds a TestInfo to the unit test.\n  //\n  // Arguments:\n  //\n  //   set_up_tc:    pointer to the function that sets up the test case\n  //   tear_down_tc: pointer to the function that tears down the test case\n  //   test_info:    the TestInfo object\n  void AddTestInfo(Test::SetUpTestCaseFunc set_up_tc,\n                   Test::TearDownTestCaseFunc tear_down_tc,\n                   TestInfo* test_info) {\n    // In order to support thread-safe death tests, we need to\n    // remember the original working directory when the test program\n    // was first invoked.  We cannot do this in RUN_ALL_TESTS(), as\n    // the user may have changed the current directory before calling\n    // RUN_ALL_TESTS().  Therefore we capture the current directory in\n    // AddTestInfo(), which is called to register a TEST or TEST_F\n    // before main() is reached.\n    if (original_working_dir_.IsEmpty()) {\n      original_working_dir_.Set(FilePath::GetCurrentDir());\n      GTEST_CHECK_(!original_working_dir_.IsEmpty())\n          << \"Failed to get the current working directory.\";\n    }\n\n    GetTestCase(test_info->test_case_name(),\n                test_info->type_param(),\n                set_up_tc,\n                tear_down_tc)->AddTestInfo(test_info);\n  }\n\n#if GTEST_HAS_PARAM_TEST\n  // Returns ParameterizedTestCaseRegistry object used to keep track of\n  // value-parameterized tests and instantiate and register them.\n  internal::ParameterizedTestCaseRegistry& parameterized_test_registry() {\n    return parameterized_test_registry_;\n  }\n#endif  // GTEST_HAS_PARAM_TEST\n\n  // Sets the TestCase object for the test that's currently running.\n  void set_current_test_case(TestCase* a_current_test_case) {\n    current_test_case_ = a_current_test_case;\n  }\n\n  // Sets the TestInfo object for the test that's currently running.  If\n  // current_test_info is NULL, the assertion results will be stored in\n  // ad_hoc_test_result_.\n  void set_current_test_info(TestInfo* a_current_test_info) {\n    current_test_info_ = a_current_test_info;\n  }\n\n  // Registers all parameterized tests defined using TEST_P and\n  // INSTANTIATE_TEST_CASE_P, creating regular tests for each test/parameter\n  // combination. This method can be called more then once; it has guards\n  // protecting from registering the tests more then once.  If\n  // value-parameterized tests are disabled, RegisterParameterizedTests is\n  // present but does nothing.\n  void RegisterParameterizedTests();\n\n  // Runs all tests in this UnitTest object, prints the result, and\n  // returns true if all tests are successful.  If any exception is\n  // thrown during a test, this test is considered to be failed, but\n  // the rest of the tests will still be run.\n  bool RunAllTests();\n\n  // Clears the results of all tests, except the ad hoc tests.\n  void ClearNonAdHocTestResult() {\n    ForEach(test_cases_, TestCase::ClearTestCaseResult);\n  }\n\n  // Clears the results of ad-hoc test assertions.\n  void ClearAdHocTestResult() {\n    ad_hoc_test_result_.Clear();\n  }\n\n  enum ReactionToSharding {\n    HONOR_SHARDING_PROTOCOL,\n    IGNORE_SHARDING_PROTOCOL\n  };\n\n  // Matches the full name of each test against the user-specified\n  // filter to decide whether the test should run, then records the\n  // result in each TestCase and TestInfo object.\n  // If shard_tests == HONOR_SHARDING_PROTOCOL, further filters tests\n  // based on sharding variables in the environment.\n  // Returns the number of tests that should run.\n  int FilterTests(ReactionToSharding shard_tests);\n\n  // Prints the names of the tests matching the user-specified filter flag.\n  void ListTestsMatchingFilter();\n\n  const TestCase* current_test_case() const { return current_test_case_; }\n  TestInfo* current_test_info() { return current_test_info_; }\n  const TestInfo* current_test_info() const { return current_test_info_; }\n\n  // Returns the vector of environments that need to be set-up/torn-down\n  // before/after the tests are run.\n  std::vector<Environment*>& environments() { return environments_; }\n\n  // Getters for the per-thread Google Test trace stack.\n  std::vector<TraceInfo>& gtest_trace_stack() {\n    return *(gtest_trace_stack_.pointer());\n  }\n  const std::vector<TraceInfo>& gtest_trace_stack() const {\n    return gtest_trace_stack_.get();\n  }\n\n#if GTEST_HAS_DEATH_TEST\n  void InitDeathTestSubprocessControlInfo() {\n    internal_run_death_test_flag_.reset(ParseInternalRunDeathTestFlag());\n  }\n  // Returns a pointer to the parsed --gtest_internal_run_death_test\n  // flag, or NULL if that flag was not specified.\n  // This information is useful only in a death test child process.\n  // Must not be called before a call to InitGoogleTest.\n  const InternalRunDeathTestFlag* internal_run_death_test_flag() const {\n    return internal_run_death_test_flag_.get();\n  }\n\n  // Returns a pointer to the current death test factory.\n  internal::DeathTestFactory* death_test_factory() {\n    return death_test_factory_.get();\n  }\n\n  void SuppressTestEventsIfInSubprocess();\n\n  friend class ReplaceDeathTestFactory;\n#endif  // GTEST_HAS_DEATH_TEST\n\n  // Initializes the event listener performing XML output as specified by\n  // UnitTestOptions. Must not be called before InitGoogleTest.\n  void ConfigureXmlOutput();\n\n#if GTEST_CAN_STREAM_RESULTS_\n  // Initializes the event listener for streaming test results to a socket.\n  // Must not be called before InitGoogleTest.\n  void ConfigureStreamingOutput();\n#endif\n\n  // Performs initialization dependent upon flag values obtained in\n  // ParseGoogleTestFlagsOnly.  Is called from InitGoogleTest after the call to\n  // ParseGoogleTestFlagsOnly.  In case a user neglects to call InitGoogleTest\n  // this function is also called from RunAllTests.  Since this function can be\n  // called more than once, it has to be idempotent.\n  void PostFlagParsingInit();\n\n  // Gets the random seed used at the start of the current test iteration.\n  int random_seed() const { return random_seed_; }\n\n  // Gets the random number generator.\n  internal::Random* random() { return &random_; }\n\n  // Shuffles all test cases, and the tests within each test case,\n  // making sure that death tests are still run first.\n  void ShuffleTests();\n\n  // Restores the test cases and tests to their order before the first shuffle.\n  void UnshuffleTests();\n\n  // Returns the value of GTEST_FLAG(catch_exceptions) at the moment\n  // UnitTest::Run() starts.\n  bool catch_exceptions() const { return catch_exceptions_; }\n\n private:\n  friend class ::testing::UnitTest;\n\n  // Used by UnitTest::Run() to capture the state of\n  // GTEST_FLAG(catch_exceptions) at the moment it starts.\n  void set_catch_exceptions(bool value) { catch_exceptions_ = value; }\n\n  // The UnitTest object that owns this implementation object.\n  UnitTest* const parent_;\n\n  // The working directory when the first TEST() or TEST_F() was\n  // executed.\n  internal::FilePath original_working_dir_;\n\n  // The default test part result reporters.\n  DefaultGlobalTestPartResultReporter default_global_test_part_result_reporter_;\n  DefaultPerThreadTestPartResultReporter\n      default_per_thread_test_part_result_reporter_;\n\n  // Points to (but doesn't own) the global test part result reporter.\n  TestPartResultReporterInterface* global_test_part_result_repoter_;\n\n  // Protects read and write access to global_test_part_result_reporter_.\n  internal::Mutex global_test_part_result_reporter_mutex_;\n\n  // Points to (but doesn't own) the per-thread test part result reporter.\n  internal::ThreadLocal<TestPartResultReporterInterface*>\n      per_thread_test_part_result_reporter_;\n\n  // The vector of environments that need to be set-up/torn-down\n  // before/after the tests are run.\n  std::vector<Environment*> environments_;\n\n  // The vector of TestCases in their original order.  It owns the\n  // elements in the vector.\n  std::vector<TestCase*> test_cases_;\n\n  // Provides a level of indirection for the test case list to allow\n  // easy shuffling and restoring the test case order.  The i-th\n  // element of this vector is the index of the i-th test case in the\n  // shuffled order.\n  std::vector<int> test_case_indices_;\n\n#if GTEST_HAS_PARAM_TEST\n  // ParameterizedTestRegistry object used to register value-parameterized\n  // tests.\n  internal::ParameterizedTestCaseRegistry parameterized_test_registry_;\n\n  // Indicates whether RegisterParameterizedTests() has been called already.\n  bool parameterized_tests_registered_;\n#endif  // GTEST_HAS_PARAM_TEST\n\n  // Index of the last death test case registered.  Initially -1.\n  int last_death_test_case_;\n\n  // This points to the TestCase for the currently running test.  It\n  // changes as Google Test goes through one test case after another.\n  // When no test is running, this is set to NULL and Google Test\n  // stores assertion results in ad_hoc_test_result_.  Initially NULL.\n  TestCase* current_test_case_;\n\n  // This points to the TestInfo for the currently running test.  It\n  // changes as Google Test goes through one test after another.  When\n  // no test is running, this is set to NULL and Google Test stores\n  // assertion results in ad_hoc_test_result_.  Initially NULL.\n  TestInfo* current_test_info_;\n\n  // Normally, a user only writes assertions inside a TEST or TEST_F,\n  // or inside a function called by a TEST or TEST_F.  Since Google\n  // Test keeps track of which test is current running, it can\n  // associate such an assertion with the test it belongs to.\n  //\n  // If an assertion is encountered when no TEST or TEST_F is running,\n  // Google Test attributes the assertion result to an imaginary \"ad hoc\"\n  // test, and records the result in ad_hoc_test_result_.\n  TestResult ad_hoc_test_result_;\n\n  // The list of event listeners that can be used to track events inside\n  // Google Test.\n  TestEventListeners listeners_;\n\n  // The OS stack trace getter.  Will be deleted when the UnitTest\n  // object is destructed.  By default, an OsStackTraceGetter is used,\n  // but the user can set this field to use a custom getter if that is\n  // desired.\n  OsStackTraceGetterInterface* os_stack_trace_getter_;\n\n  // True iff PostFlagParsingInit() has been called.\n  bool post_flag_parse_init_performed_;\n\n  // The random number seed used at the beginning of the test run.\n  int random_seed_;\n\n  // Our random number generator.\n  internal::Random random_;\n\n  // How long the test took to run, in milliseconds.\n  TimeInMillis elapsed_time_;\n\n#if GTEST_HAS_DEATH_TEST\n  // The decomposed components of the gtest_internal_run_death_test flag,\n  // parsed when RUN_ALL_TESTS is called.\n  internal::scoped_ptr<InternalRunDeathTestFlag> internal_run_death_test_flag_;\n  internal::scoped_ptr<internal::DeathTestFactory> death_test_factory_;\n#endif  // GTEST_HAS_DEATH_TEST\n\n  // A per-thread stack of traces created by the SCOPED_TRACE() macro.\n  internal::ThreadLocal<std::vector<TraceInfo> > gtest_trace_stack_;\n\n  // The value of GTEST_FLAG(catch_exceptions) at the moment RunAllTests()\n  // starts.\n  bool catch_exceptions_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTestImpl);\n};  // class UnitTestImpl\n\n// Convenience function for accessing the global UnitTest\n// implementation object.\ninline UnitTestImpl* GetUnitTestImpl() {\n  return UnitTest::GetInstance()->impl();\n}\n\n#if GTEST_USES_SIMPLE_RE\n\n// Internal helper functions for implementing the simple regular\n// expression matcher.\nGTEST_API_ bool IsInSet(char ch, const char* str);\nGTEST_API_ bool IsAsciiDigit(char ch);\nGTEST_API_ bool IsAsciiPunct(char ch);\nGTEST_API_ bool IsRepeat(char ch);\nGTEST_API_ bool IsAsciiWhiteSpace(char ch);\nGTEST_API_ bool IsAsciiWordChar(char ch);\nGTEST_API_ bool IsValidEscape(char ch);\nGTEST_API_ bool AtomMatchesChar(bool escaped, char pattern, char ch);\nGTEST_API_ bool ValidateRegex(const char* regex);\nGTEST_API_ bool MatchRegexAtHead(const char* regex, const char* str);\nGTEST_API_ bool MatchRepetitionAndRegexAtHead(\n    bool escaped, char ch, char repeat, const char* regex, const char* str);\nGTEST_API_ bool MatchRegexAnywhere(const char* regex, const char* str);\n\n#endif  // GTEST_USES_SIMPLE_RE\n\n// Parses the command line for Google Test flags, without initializing\n// other parts of Google Test.\nGTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, char** argv);\nGTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv);\n\n#if GTEST_HAS_DEATH_TEST\n\n// Returns the message describing the last system error, regardless of the\n// platform.\nGTEST_API_ String GetLastErrnoDescription();\n\n# if GTEST_OS_WINDOWS\n// Provides leak-safe Windows kernel handle ownership.\nclass AutoHandle {\n public:\n  AutoHandle() : handle_(INVALID_HANDLE_VALUE) {}\n  explicit AutoHandle(HANDLE handle) : handle_(handle) {}\n\n  ~AutoHandle() { Reset(); }\n\n  HANDLE Get() const { return handle_; }\n  void Reset() { Reset(INVALID_HANDLE_VALUE); }\n  void Reset(HANDLE handle) {\n    if (handle != handle_) {\n      if (handle_ != INVALID_HANDLE_VALUE)\n        ::CloseHandle(handle_);\n      handle_ = handle;\n    }\n  }\n\n private:\n  HANDLE handle_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(AutoHandle);\n};\n# endif  // GTEST_OS_WINDOWS\n\n// Attempts to parse a string into a positive integer pointed to by the\n// number parameter.  Returns true if that is possible.\n// GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we can use\n// it here.\ntemplate <typename Integer>\nbool ParseNaturalNumber(const ::std::string& str, Integer* number) {\n  // Fail fast if the given string does not begin with a digit;\n  // this bypasses strtoXXX's \"optional leading whitespace and plus\n  // or minus sign\" semantics, which are undesirable here.\n  if (str.empty() || !IsDigit(str[0])) {\n    return false;\n  }\n  errno = 0;\n\n  char* end;\n  // BiggestConvertible is the largest integer type that system-provided\n  // string-to-number conversion routines can return.\n\n# if GTEST_OS_WINDOWS && !defined(__GNUC__)\n\n  // MSVC and C++ Builder define __int64 instead of the standard long long.\n  typedef unsigned __int64 BiggestConvertible;\n  const BiggestConvertible parsed = _strtoui64(str.c_str(), &end, 10);\n\n# else\n\n  typedef unsigned long long BiggestConvertible;  // NOLINT\n  const BiggestConvertible parsed = strtoull(str.c_str(), &end, 10);\n\n# endif  // GTEST_OS_WINDOWS && !defined(__GNUC__)\n\n  const bool parse_success = *end == '\\0' && errno == 0;\n\n  // TODO(vladl@google.com): Convert this to compile time assertion when it is\n  // available.\n  GTEST_CHECK_(sizeof(Integer) <= sizeof(parsed));\n\n  const Integer result = static_cast<Integer>(parsed);\n  if (parse_success && static_cast<BiggestConvertible>(result) == parsed) {\n    *number = result;\n    return true;\n  }\n  return false;\n}\n#endif  // GTEST_HAS_DEATH_TEST\n\n// TestResult contains some private methods that should be hidden from\n// Google Test user but are required for testing. This class allow our tests\n// to access them.\n//\n// This class is supplied only for the purpose of testing Google Test's own\n// constructs. Do not use it in user tests, either directly or indirectly.\nclass TestResultAccessor {\n public:\n  static void RecordProperty(TestResult* test_result,\n                             const TestProperty& property) {\n    test_result->RecordProperty(property);\n  }\n\n  static void ClearTestPartResults(TestResult* test_result) {\n    test_result->ClearTestPartResults();\n  }\n\n  static const std::vector<testing::TestPartResult>& test_part_results(\n      const TestResult& test_result) {\n    return test_result.test_part_results();\n  }\n};\n\n}  // namespace internal\n}  // namespace testing\n\n#endif  // GTEST_SRC_GTEST_INTERNAL_INL_H_\n#undef GTEST_IMPLEMENTATION_\n\n#if GTEST_OS_WINDOWS\n# define vsnprintf _vsnprintf\n#endif  // GTEST_OS_WINDOWS\n\nnamespace testing {\n\nusing internal::CountIf;\nusing internal::ForEach;\nusing internal::GetElementOr;\nusing internal::Shuffle;\n\n// Constants.\n\n// A test whose test case name or test name matches this filter is\n// disabled and not run.\nstatic const char kDisableTestFilter[] = \"DISABLED_*:*/DISABLED_*\";\n\n// A test case whose name matches this filter is considered a death\n// test case and will be run before test cases whose name doesn't\n// match this filter.\nstatic const char kDeathTestCaseFilter[] = \"*DeathTest:*DeathTest/*\";\n\n// A test filter that matches everything.\nstatic const char kUniversalFilter[] = \"*\";\n\n// The default output file for XML output.\nstatic const char kDefaultOutputFile[] = \"test_detail.xml\";\n\n// The environment variable name for the test shard index.\nstatic const char kTestShardIndex[] = \"GTEST_SHARD_INDEX\";\n// The environment variable name for the total number of test shards.\nstatic const char kTestTotalShards[] = \"GTEST_TOTAL_SHARDS\";\n// The environment variable name for the test shard status file.\nstatic const char kTestShardStatusFile[] = \"GTEST_SHARD_STATUS_FILE\";\n\nnamespace internal {\n\n// The text used in failure messages to indicate the start of the\n// stack trace.\nconst char kStackTraceMarker[] = \"\\nStack trace:\\n\";\n\n// g_help_flag is true iff the --help flag or an equivalent form is\n// specified on the command line.\nbool g_help_flag = false;\n\n}  // namespace internal\n\nGTEST_DEFINE_bool_(\n    also_run_disabled_tests,\n    internal::BoolFromGTestEnv(\"also_run_disabled_tests\", false),\n    \"Run disabled tests too, in addition to the tests normally being run.\");\n\nGTEST_DEFINE_bool_(\n    break_on_failure,\n    internal::BoolFromGTestEnv(\"break_on_failure\", false),\n    \"True iff a failed assertion should be a debugger break-point.\");\n\nGTEST_DEFINE_bool_(\n    catch_exceptions,\n    internal::BoolFromGTestEnv(\"catch_exceptions\", true),\n    \"True iff \" GTEST_NAME_\n    \" should catch exceptions and treat them as test failures.\");\n\nGTEST_DEFINE_string_(\n    color,\n    internal::StringFromGTestEnv(\"color\", \"auto\"),\n    \"Whether to use colors in the output.  Valid values: yes, no, \"\n    \"and auto.  'auto' means to use colors if the output is \"\n    \"being sent to a terminal and the TERM environment variable \"\n    \"is set to xterm, xterm-color, xterm-256color, linux or cygwin.\");\n\nGTEST_DEFINE_string_(\n    filter,\n    internal::StringFromGTestEnv(\"filter\", kUniversalFilter),\n    \"A colon-separated list of glob (not regex) patterns \"\n    \"for filtering the tests to run, optionally followed by a \"\n    \"'-' and a : separated list of negative patterns (tests to \"\n    \"exclude).  A test is run if it matches one of the positive \"\n    \"patterns and does not match any of the negative patterns.\");\n\nGTEST_DEFINE_bool_(list_tests, false,\n                   \"List all tests without running them.\");\n\nGTEST_DEFINE_string_(\n    output,\n    internal::StringFromGTestEnv(\"output\", \"\"),\n    \"A format (currently must be \\\"xml\\\"), optionally followed \"\n    \"by a colon and an output file name or directory. A directory \"\n    \"is indicated by a trailing pathname separator. \"\n    \"Examples: \\\"xml:filename.xml\\\", \\\"xml::directoryname/\\\". \"\n    \"If a directory is specified, output files will be created \"\n    \"within that directory, with file-names based on the test \"\n    \"executable's name and, if necessary, made unique by adding \"\n    \"digits.\");\n\nGTEST_DEFINE_bool_(\n    print_time,\n    internal::BoolFromGTestEnv(\"print_time\", true),\n    \"True iff \" GTEST_NAME_\n    \" should display elapsed time in text output.\");\n\nGTEST_DEFINE_int32_(\n    random_seed,\n    internal::Int32FromGTestEnv(\"random_seed\", 0),\n    \"Random number seed to use when shuffling test orders.  Must be in range \"\n    \"[1, 99999], or 0 to use a seed based on the current time.\");\n\nGTEST_DEFINE_int32_(\n    repeat,\n    internal::Int32FromGTestEnv(\"repeat\", 1),\n    \"How many times to repeat each test.  Specify a negative number \"\n    \"for repeating forever.  Useful for shaking out flaky tests.\");\n\nGTEST_DEFINE_bool_(\n    show_internal_stack_frames, false,\n    \"True iff \" GTEST_NAME_ \" should include internal stack frames when \"\n    \"printing test failure stack traces.\");\n\nGTEST_DEFINE_bool_(\n    shuffle,\n    internal::BoolFromGTestEnv(\"shuffle\", false),\n    \"True iff \" GTEST_NAME_\n    \" should randomize tests' order on every run.\");\n\nGTEST_DEFINE_int32_(\n    stack_trace_depth,\n    internal::Int32FromGTestEnv(\"stack_trace_depth\", kMaxStackTraceDepth),\n    \"The maximum number of stack frames to print when an \"\n    \"assertion fails.  The valid range is 0 through 100, inclusive.\");\n\nGTEST_DEFINE_string_(\n    stream_result_to,\n    internal::StringFromGTestEnv(\"stream_result_to\", \"\"),\n    \"This flag specifies the host name and the port number on which to stream \"\n    \"test results. Example: \\\"localhost:555\\\". The flag is effective only on \"\n    \"Linux.\");\n\nGTEST_DEFINE_bool_(\n    throw_on_failure,\n    internal::BoolFromGTestEnv(\"throw_on_failure\", false),\n    \"When this flag is specified, a failed assertion will throw an exception \"\n    \"if exceptions are enabled or exit the program with a non-zero code \"\n    \"otherwise.\");\n\nnamespace internal {\n\n// Generates a random number from [0, range), using a Linear\n// Congruential Generator (LCG).  Crashes if 'range' is 0 or greater\n// than kMaxRange.\nUInt32 Random::Generate(UInt32 range) {\n  // These constants are the same as are used in glibc's rand(3).\n  state_ = (1103515245U*state_ + 12345U) % kMaxRange;\n\n  GTEST_CHECK_(range > 0)\n      << \"Cannot generate a number in the range [0, 0).\";\n  GTEST_CHECK_(range <= kMaxRange)\n      << \"Generation of a number in [0, \" << range << \") was requested, \"\n      << \"but this can only generate numbers in [0, \" << kMaxRange << \").\";\n\n  // Converting via modulus introduces a bit of downward bias, but\n  // it's simple, and a linear congruential generator isn't too good\n  // to begin with.\n  return state_ % range;\n}\n\n// GTestIsInitialized() returns true iff the user has initialized\n// Google Test.  Useful for catching the user mistake of not initializing\n// Google Test before calling RUN_ALL_TESTS().\n//\n// A user must call testing::InitGoogleTest() to initialize Google\n// Test.  g_init_gtest_count is set to the number of times\n// InitGoogleTest() has been called.  We don't protect this variable\n// under a mutex as it is only accessed in the main thread.\nint g_init_gtest_count = 0;\nstatic bool GTestIsInitialized() { return g_init_gtest_count != 0; }\n\n// Iterates over a vector of TestCases, keeping a running sum of the\n// results of calling a given int-returning method on each.\n// Returns the sum.\nstatic int SumOverTestCaseList(const std::vector<TestCase*>& case_list,\n                               int (TestCase::*method)() const) {\n  int sum = 0;\n  for (size_t i = 0; i < case_list.size(); i++) {\n    sum += (case_list[i]->*method)();\n  }\n  return sum;\n}\n\n// Returns true iff the test case passed.\nstatic bool TestCasePassed(const TestCase* test_case) {\n  return test_case->should_run() && test_case->Passed();\n}\n\n// Returns true iff the test case failed.\nstatic bool TestCaseFailed(const TestCase* test_case) {\n  return test_case->should_run() && test_case->Failed();\n}\n\n// Returns true iff test_case contains at least one test that should\n// run.\nstatic bool ShouldRunTestCase(const TestCase* test_case) {\n  return test_case->should_run();\n}\n\n// AssertHelper constructor.\nAssertHelper::AssertHelper(TestPartResult::Type type,\n                           const char* file,\n                           int line,\n                           const char* message)\n    : data_(new AssertHelperData(type, file, line, message)) {\n}\n\nAssertHelper::~AssertHelper() {\n  delete data_;\n}\n\n// Message assignment, for assertion streaming support.\nvoid AssertHelper::operator=(const Message& message) const {\n  UnitTest::GetInstance()->\n    AddTestPartResult(data_->type, data_->file, data_->line,\n                      AppendUserMessage(data_->message, message),\n                      UnitTest::GetInstance()->impl()\n                      ->CurrentOsStackTraceExceptTop(1)\n                      // Skips the stack frame for this function itself.\n                      );  // NOLINT\n}\n\n// Mutex for linked pointers.\nGTEST_DEFINE_STATIC_MUTEX_(g_linked_ptr_mutex);\n\n// Application pathname gotten in InitGoogleTest.\nString g_executable_path;\n\n// Returns the current application's name, removing directory path if that\n// is present.\nFilePath GetCurrentExecutableName() {\n  FilePath result;\n\n#if GTEST_OS_WINDOWS\n  result.Set(FilePath(g_executable_path).RemoveExtension(\"exe\"));\n#else\n  result.Set(FilePath(g_executable_path));\n#endif  // GTEST_OS_WINDOWS\n\n  return result.RemoveDirectoryName();\n}\n\n// Functions for processing the gtest_output flag.\n\n// Returns the output format, or \"\" for normal printed output.\nString UnitTestOptions::GetOutputFormat() {\n  const char* const gtest_output_flag = GTEST_FLAG(output).c_str();\n  if (gtest_output_flag == NULL) return String(\"\");\n\n  const char* const colon = strchr(gtest_output_flag, ':');\n  return (colon == NULL) ?\n      String(gtest_output_flag) :\n      String(gtest_output_flag, colon - gtest_output_flag);\n}\n\n// Returns the name of the requested output file, or the default if none\n// was explicitly specified.\nString UnitTestOptions::GetAbsolutePathToOutputFile() {\n  const char* const gtest_output_flag = GTEST_FLAG(output).c_str();\n  if (gtest_output_flag == NULL)\n    return String(\"\");\n\n  const char* const colon = strchr(gtest_output_flag, ':');\n  if (colon == NULL)\n    return String(internal::FilePath::ConcatPaths(\n               internal::FilePath(\n                   UnitTest::GetInstance()->original_working_dir()),\n               internal::FilePath(kDefaultOutputFile)).ToString() );\n\n  internal::FilePath output_name(colon + 1);\n  if (!output_name.IsAbsolutePath())\n    // TODO(wan@google.com): on Windows \\some\\path is not an absolute\n    // path (as its meaning depends on the current drive), yet the\n    // following logic for turning it into an absolute path is wrong.\n    // Fix it.\n    output_name = internal::FilePath::ConcatPaths(\n        internal::FilePath(UnitTest::GetInstance()->original_working_dir()),\n        internal::FilePath(colon + 1));\n\n  if (!output_name.IsDirectory())\n    return output_name.ToString();\n\n  internal::FilePath result(internal::FilePath::GenerateUniqueFileName(\n      output_name, internal::GetCurrentExecutableName(),\n      GetOutputFormat().c_str()));\n  return result.ToString();\n}\n\n// Returns true iff the wildcard pattern matches the string.  The\n// first ':' or '\\0' character in pattern marks the end of it.\n//\n// This recursive algorithm isn't very efficient, but is clear and\n// works well enough for matching test names, which are short.\nbool UnitTestOptions::PatternMatchesString(const char *pattern,\n                                           const char *str) {\n  switch (*pattern) {\n    case '\\0':\n    case ':':  // Either ':' or '\\0' marks the end of the pattern.\n      return *str == '\\0';\n    case '?':  // Matches any single character.\n      return *str != '\\0' && PatternMatchesString(pattern + 1, str + 1);\n    case '*':  // Matches any string (possibly empty) of characters.\n      return (*str != '\\0' && PatternMatchesString(pattern, str + 1)) ||\n          PatternMatchesString(pattern + 1, str);\n    default:  // Non-special character.  Matches itself.\n      return *pattern == *str &&\n          PatternMatchesString(pattern + 1, str + 1);\n  }\n}\n\nbool UnitTestOptions::MatchesFilter(const String& name, const char* filter) {\n  const char *cur_pattern = filter;\n  for (;;) {\n    if (PatternMatchesString(cur_pattern, name.c_str())) {\n      return true;\n    }\n\n    // Finds the next pattern in the filter.\n    cur_pattern = strchr(cur_pattern, ':');\n\n    // Returns if no more pattern can be found.\n    if (cur_pattern == NULL) {\n      return false;\n    }\n\n    // Skips the pattern separater (the ':' character).\n    cur_pattern++;\n  }\n}\n\n// TODO(keithray): move String function implementations to gtest-string.cc.\n\n// Returns true iff the user-specified filter matches the test case\n// name and the test name.\nbool UnitTestOptions::FilterMatchesTest(const String &test_case_name,\n                                        const String &test_name) {\n  const String& full_name = String::Format(\"%s.%s\",\n                                           test_case_name.c_str(),\n                                           test_name.c_str());\n\n  // Split --gtest_filter at '-', if there is one, to separate into\n  // positive filter and negative filter portions\n  const char* const p = GTEST_FLAG(filter).c_str();\n  const char* const dash = strchr(p, '-');\n  String positive;\n  String negative;\n  if (dash == NULL) {\n    positive = GTEST_FLAG(filter).c_str();  // Whole string is a positive filter\n    negative = String(\"\");\n  } else {\n    positive = String(p, dash - p);  // Everything up to the dash\n    negative = String(dash+1);       // Everything after the dash\n    if (positive.empty()) {\n      // Treat '-test1' as the same as '*-test1'\n      positive = kUniversalFilter;\n    }\n  }\n\n  // A filter is a colon-separated list of patterns.  It matches a\n  // test if any pattern in it matches the test.\n  return (MatchesFilter(full_name, positive.c_str()) &&\n          !MatchesFilter(full_name, negative.c_str()));\n}\n\n#if GTEST_HAS_SEH\n// Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the\n// given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise.\n// This function is useful as an __except condition.\nint UnitTestOptions::GTestShouldProcessSEH(DWORD exception_code) {\n  // Google Test should handle a SEH exception if:\n  //   1. the user wants it to, AND\n  //   2. this is not a breakpoint exception, AND\n  //   3. this is not a C++ exception (VC++ implements them via SEH,\n  //      apparently).\n  //\n  // SEH exception code for C++ exceptions.\n  // (see http://support.microsoft.com/kb/185294 for more information).\n  const DWORD kCxxExceptionCode = 0xe06d7363;\n\n  bool should_handle = true;\n\n  if (!GTEST_FLAG(catch_exceptions))\n    should_handle = false;\n  else if (exception_code == EXCEPTION_BREAKPOINT)\n    should_handle = false;\n  else if (exception_code == kCxxExceptionCode)\n    should_handle = false;\n\n  return should_handle ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH;\n}\n#endif  // GTEST_HAS_SEH\n\n}  // namespace internal\n\n// The c'tor sets this object as the test part result reporter used by\n// Google Test.  The 'result' parameter specifies where to report the\n// results. Intercepts only failures from the current thread.\nScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter(\n    TestPartResultArray* result)\n    : intercept_mode_(INTERCEPT_ONLY_CURRENT_THREAD),\n      result_(result) {\n  Init();\n}\n\n// The c'tor sets this object as the test part result reporter used by\n// Google Test.  The 'result' parameter specifies where to report the\n// results.\nScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter(\n    InterceptMode intercept_mode, TestPartResultArray* result)\n    : intercept_mode_(intercept_mode),\n      result_(result) {\n  Init();\n}\n\nvoid ScopedFakeTestPartResultReporter::Init() {\n  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();\n  if (intercept_mode_ == INTERCEPT_ALL_THREADS) {\n    old_reporter_ = impl->GetGlobalTestPartResultReporter();\n    impl->SetGlobalTestPartResultReporter(this);\n  } else {\n    old_reporter_ = impl->GetTestPartResultReporterForCurrentThread();\n    impl->SetTestPartResultReporterForCurrentThread(this);\n  }\n}\n\n// The d'tor restores the test part result reporter used by Google Test\n// before.\nScopedFakeTestPartResultReporter::~ScopedFakeTestPartResultReporter() {\n  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();\n  if (intercept_mode_ == INTERCEPT_ALL_THREADS) {\n    impl->SetGlobalTestPartResultReporter(old_reporter_);\n  } else {\n    impl->SetTestPartResultReporterForCurrentThread(old_reporter_);\n  }\n}\n\n// Increments the test part result count and remembers the result.\n// This method is from the TestPartResultReporterInterface interface.\nvoid ScopedFakeTestPartResultReporter::ReportTestPartResult(\n    const TestPartResult& result) {\n  result_->Append(result);\n}\n\nnamespace internal {\n\n// Returns the type ID of ::testing::Test.  We should always call this\n// instead of GetTypeId< ::testing::Test>() to get the type ID of\n// testing::Test.  This is to work around a suspected linker bug when\n// using Google Test as a framework on Mac OS X.  The bug causes\n// GetTypeId< ::testing::Test>() to return different values depending\n// on whether the call is from the Google Test framework itself or\n// from user test code.  GetTestTypeId() is guaranteed to always\n// return the same value, as it always calls GetTypeId<>() from the\n// gtest.cc, which is within the Google Test framework.\nTypeId GetTestTypeId() {\n  return GetTypeId<Test>();\n}\n\n// The value of GetTestTypeId() as seen from within the Google Test\n// library.  This is solely for testing GetTestTypeId().\nextern const TypeId kTestTypeIdInGoogleTest = GetTestTypeId();\n\n// This predicate-formatter checks that 'results' contains a test part\n// failure of the given type and that the failure message contains the\n// given substring.\nAssertionResult HasOneFailure(const char* /* results_expr */,\n                              const char* /* type_expr */,\n                              const char* /* substr_expr */,\n                              const TestPartResultArray& results,\n                              TestPartResult::Type type,\n                              const string& substr) {\n  const String expected(type == TestPartResult::kFatalFailure ?\n                        \"1 fatal failure\" :\n                        \"1 non-fatal failure\");\n  Message msg;\n  if (results.size() != 1) {\n    msg << \"Expected: \" << expected << \"\\n\"\n        << \"  Actual: \" << results.size() << \" failures\";\n    for (int i = 0; i < results.size(); i++) {\n      msg << \"\\n\" << results.GetTestPartResult(i);\n    }\n    return AssertionFailure() << msg;\n  }\n\n  const TestPartResult& r = results.GetTestPartResult(0);\n  if (r.type() != type) {\n    return AssertionFailure() << \"Expected: \" << expected << \"\\n\"\n                              << \"  Actual:\\n\"\n                              << r;\n  }\n\n  if (strstr(r.message(), substr.c_str()) == NULL) {\n    return AssertionFailure() << \"Expected: \" << expected << \" containing \\\"\"\n                              << substr << \"\\\"\\n\"\n                              << \"  Actual:\\n\"\n                              << r;\n  }\n\n  return AssertionSuccess();\n}\n\n// The constructor of SingleFailureChecker remembers where to look up\n// test part results, what type of failure we expect, and what\n// substring the failure message should contain.\nSingleFailureChecker:: SingleFailureChecker(\n    const TestPartResultArray* results,\n    TestPartResult::Type type,\n    const string& substr)\n    : results_(results),\n      type_(type),\n      substr_(substr) {}\n\n// The destructor of SingleFailureChecker verifies that the given\n// TestPartResultArray contains exactly one failure that has the given\n// type and contains the given substring.  If that's not the case, a\n// non-fatal failure will be generated.\nSingleFailureChecker::~SingleFailureChecker() {\n  EXPECT_PRED_FORMAT3(HasOneFailure, *results_, type_, substr_);\n}\n\nDefaultGlobalTestPartResultReporter::DefaultGlobalTestPartResultReporter(\n    UnitTestImpl* unit_test) : unit_test_(unit_test) {}\n\nvoid DefaultGlobalTestPartResultReporter::ReportTestPartResult(\n    const TestPartResult& result) {\n  unit_test_->current_test_result()->AddTestPartResult(result);\n  unit_test_->listeners()->repeater()->OnTestPartResult(result);\n}\n\nDefaultPerThreadTestPartResultReporter::DefaultPerThreadTestPartResultReporter(\n    UnitTestImpl* unit_test) : unit_test_(unit_test) {}\n\nvoid DefaultPerThreadTestPartResultReporter::ReportTestPartResult(\n    const TestPartResult& result) {\n  unit_test_->GetGlobalTestPartResultReporter()->ReportTestPartResult(result);\n}\n\n// Returns the global test part result reporter.\nTestPartResultReporterInterface*\nUnitTestImpl::GetGlobalTestPartResultReporter() {\n  internal::MutexLock lock(&global_test_part_result_reporter_mutex_);\n  return global_test_part_result_repoter_;\n}\n\n// Sets the global test part result reporter.\nvoid UnitTestImpl::SetGlobalTestPartResultReporter(\n    TestPartResultReporterInterface* reporter) {\n  internal::MutexLock lock(&global_test_part_result_reporter_mutex_);\n  global_test_part_result_repoter_ = reporter;\n}\n\n// Returns the test part result reporter for the current thread.\nTestPartResultReporterInterface*\nUnitTestImpl::GetTestPartResultReporterForCurrentThread() {\n  return per_thread_test_part_result_reporter_.get();\n}\n\n// Sets the test part result reporter for the current thread.\nvoid UnitTestImpl::SetTestPartResultReporterForCurrentThread(\n    TestPartResultReporterInterface* reporter) {\n  per_thread_test_part_result_reporter_.set(reporter);\n}\n\n// Gets the number of successful test cases.\nint UnitTestImpl::successful_test_case_count() const {\n  return CountIf(test_cases_, TestCasePassed);\n}\n\n// Gets the number of failed test cases.\nint UnitTestImpl::failed_test_case_count() const {\n  return CountIf(test_cases_, TestCaseFailed);\n}\n\n// Gets the number of all test cases.\nint UnitTestImpl::total_test_case_count() const {\n  return static_cast<int>(test_cases_.size());\n}\n\n// Gets the number of all test cases that contain at least one test\n// that should run.\nint UnitTestImpl::test_case_to_run_count() const {\n  return CountIf(test_cases_, ShouldRunTestCase);\n}\n\n// Gets the number of successful tests.\nint UnitTestImpl::successful_test_count() const {\n  return SumOverTestCaseList(test_cases_, &TestCase::successful_test_count);\n}\n\n// Gets the number of failed tests.\nint UnitTestImpl::failed_test_count() const {\n  return SumOverTestCaseList(test_cases_, &TestCase::failed_test_count);\n}\n\n// Gets the number of disabled tests.\nint UnitTestImpl::disabled_test_count() const {\n  return SumOverTestCaseList(test_cases_, &TestCase::disabled_test_count);\n}\n\n// Gets the number of all tests.\nint UnitTestImpl::total_test_count() const {\n  return SumOverTestCaseList(test_cases_, &TestCase::total_test_count);\n}\n\n// Gets the number of tests that should run.\nint UnitTestImpl::test_to_run_count() const {\n  return SumOverTestCaseList(test_cases_, &TestCase::test_to_run_count);\n}\n\n// Returns the current OS stack trace as a String.\n//\n// The maximum number of stack frames to be included is specified by\n// the gtest_stack_trace_depth flag.  The skip_count parameter\n// specifies the number of top frames to be skipped, which doesn't\n// count against the number of frames to be included.\n//\n// For example, if Foo() calls Bar(), which in turn calls\n// CurrentOsStackTraceExceptTop(1), Foo() will be included in the\n// trace but Bar() and CurrentOsStackTraceExceptTop() won't.\nString UnitTestImpl::CurrentOsStackTraceExceptTop(int skip_count) {\n  (void)skip_count;\n  return String(\"\");\n}\n\n// Returns the current time in milliseconds.\nTimeInMillis GetTimeInMillis() {\n#if GTEST_OS_WINDOWS_MOBILE || defined(__BORLANDC__)\n  // Difference between 1970-01-01 and 1601-01-01 in milliseconds.\n  // http://analogous.blogspot.com/2005/04/epoch.html\n  const TimeInMillis kJavaEpochToWinFileTimeDelta =\n    static_cast<TimeInMillis>(116444736UL) * 100000UL;\n  const DWORD kTenthMicrosInMilliSecond = 10000;\n\n  SYSTEMTIME now_systime;\n  FILETIME now_filetime;\n  ULARGE_INTEGER now_int64;\n  // TODO(kenton@google.com): Shouldn't this just use\n  //   GetSystemTimeAsFileTime()?\n  GetSystemTime(&now_systime);\n  if (SystemTimeToFileTime(&now_systime, &now_filetime)) {\n    now_int64.LowPart = now_filetime.dwLowDateTime;\n    now_int64.HighPart = now_filetime.dwHighDateTime;\n    now_int64.QuadPart = (now_int64.QuadPart / kTenthMicrosInMilliSecond) -\n      kJavaEpochToWinFileTimeDelta;\n    return now_int64.QuadPart;\n  }\n  return 0;\n#elif GTEST_OS_WINDOWS && !GTEST_HAS_GETTIMEOFDAY_\n  __timeb64 now;\n\n# ifdef _MSC_VER\n\n  // MSVC 8 deprecates _ftime64(), so we want to suppress warning 4996\n  // (deprecated function) there.\n  // TODO(kenton@google.com): Use GetTickCount()?  Or use\n  //   SystemTimeToFileTime()\n#  pragma warning(push)          // Saves the current warning state.\n#  pragma warning(disable:4996)  // Temporarily disables warning 4996.\n  _ftime64(&now);\n#  pragma warning(pop)           // Restores the warning state.\n# else\n\n  _ftime64(&now);\n\n# endif  // _MSC_VER\n\n  return static_cast<TimeInMillis>(now.time) * 1000 + now.millitm;\n#elif GTEST_HAS_GETTIMEOFDAY_\n  struct timeval now;\n  gettimeofday(&now, NULL);\n  return static_cast<TimeInMillis>(now.tv_sec) * 1000 + now.tv_usec / 1000;\n#else\n# error \"Don't know how to get the current time on your system.\"\n#endif\n}\n\n// Utilities\n\n// class String\n\n// Returns the input enclosed in double quotes if it's not NULL;\n// otherwise returns \"(null)\".  For example, \"\\\"Hello\\\"\" is returned\n// for input \"Hello\".\n//\n// This is useful for printing a C string in the syntax of a literal.\n//\n// Known issue: escape sequences are not handled yet.\nString String::ShowCStringQuoted(const char* c_str) {\n  return c_str ? String::Format(\"\\\"%s\\\"\", c_str) : String(\"(null)\");\n}\n\n// Copies at most length characters from str into a newly-allocated\n// piece of memory of size length+1.  The memory is allocated with new[].\n// A terminating null byte is written to the memory, and a pointer to it\n// is returned.  If str is NULL, NULL is returned.\nstatic char* CloneString(const char* str, size_t length) {\n  if (str == NULL) {\n    return NULL;\n  } else {\n    char* const clone = new char[length + 1];\n    posix::StrNCpy(clone, str, length);\n    clone[length] = '\\0';\n    return clone;\n  }\n}\n\n// Clones a 0-terminated C string, allocating memory using new.  The\n// caller is responsible for deleting[] the return value.  Returns the\n// cloned string, or NULL if the input is NULL.\nconst char * String::CloneCString(const char* c_str) {\n  return (c_str == NULL) ?\n                    NULL : CloneString(c_str, strlen(c_str));\n}\n\n#if GTEST_OS_WINDOWS_MOBILE\n// Creates a UTF-16 wide string from the given ANSI string, allocating\n// memory using new. The caller is responsible for deleting the return\n// value using delete[]. Returns the wide string, or NULL if the\n// input is NULL.\nLPCWSTR String::AnsiToUtf16(const char* ansi) {\n  if (!ansi) return NULL;\n  const int length = strlen(ansi);\n  const int unicode_length =\n      MultiByteToWideChar(CP_ACP, 0, ansi, length,\n                          NULL, 0);\n  WCHAR* unicode = new WCHAR[unicode_length + 1];\n  MultiByteToWideChar(CP_ACP, 0, ansi, length,\n                      unicode, unicode_length);\n  unicode[unicode_length] = 0;\n  return unicode;\n}\n\n// Creates an ANSI string from the given wide string, allocating\n// memory using new. The caller is responsible for deleting the return\n// value using delete[]. Returns the ANSI string, or NULL if the\n// input is NULL.\nconst char* String::Utf16ToAnsi(LPCWSTR utf16_str)  {\n  if (!utf16_str) return NULL;\n  const int ansi_length =\n      WideCharToMultiByte(CP_ACP, 0, utf16_str, -1,\n                          NULL, 0, NULL, NULL);\n  char* ansi = new char[ansi_length + 1];\n  WideCharToMultiByte(CP_ACP, 0, utf16_str, -1,\n                      ansi, ansi_length, NULL, NULL);\n  ansi[ansi_length] = 0;\n  return ansi;\n}\n\n#endif  // GTEST_OS_WINDOWS_MOBILE\n\n// Compares two C strings.  Returns true iff they have the same content.\n//\n// Unlike strcmp(), this function can handle NULL argument(s).  A NULL\n// C string is considered different to any non-NULL C string,\n// including the empty string.\nbool String::CStringEquals(const char * lhs, const char * rhs) {\n  if ( lhs == NULL ) return rhs == NULL;\n\n  if ( rhs == NULL ) return false;\n\n  return strcmp(lhs, rhs) == 0;\n}\n\n#if GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING\n\n// Converts an array of wide chars to a narrow string using the UTF-8\n// encoding, and streams the result to the given Message object.\nstatic void StreamWideCharsToMessage(const wchar_t* wstr, size_t length,\n                                     Message* msg) {\n  // TODO(wan): consider allowing a testing::String object to\n  // contain '\\0'.  This will make it behave more like std::string,\n  // and will allow ToUtf8String() to return the correct encoding\n  // for '\\0' s.t. we can get rid of the conditional here (and in\n  // several other places).\n  for (size_t i = 0; i != length; ) {  // NOLINT\n    if (wstr[i] != L'\\0') {\n      *msg << WideStringToUtf8(wstr + i, static_cast<int>(length - i));\n      while (i != length && wstr[i] != L'\\0')\n        i++;\n    } else {\n      *msg << '\\0';\n      i++;\n    }\n  }\n}\n\n#endif  // GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING\n\n}  // namespace internal\n\n#if GTEST_HAS_STD_WSTRING\n// Converts the given wide string to a narrow string using the UTF-8\n// encoding, and streams the result to this Message object.\nMessage& Message::operator <<(const ::std::wstring& wstr) {\n  internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this);\n  return *this;\n}\n#endif  // GTEST_HAS_STD_WSTRING\n\n#if GTEST_HAS_GLOBAL_WSTRING\n// Converts the given wide string to a narrow string using the UTF-8\n// encoding, and streams the result to this Message object.\nMessage& Message::operator <<(const ::wstring& wstr) {\n  internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this);\n  return *this;\n}\n#endif  // GTEST_HAS_GLOBAL_WSTRING\n\n// AssertionResult constructors.\n// Used in EXPECT_TRUE/FALSE(assertion_result).\nAssertionResult::AssertionResult(const AssertionResult& other)\n    : success_(other.success_),\n      message_(other.message_.get() != NULL ?\n               new ::std::string(*other.message_) :\n               static_cast< ::std::string*>(NULL)) {\n}\n\n// Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.\nAssertionResult AssertionResult::operator!() const {\n  AssertionResult negation(!success_);\n  if (message_.get() != NULL)\n    negation << *message_;\n  return negation;\n}\n\n// Makes a successful assertion result.\nAssertionResult AssertionSuccess() {\n  return AssertionResult(true);\n}\n\n// Makes a failed assertion result.\nAssertionResult AssertionFailure() {\n  return AssertionResult(false);\n}\n\n// Makes a failed assertion result with the given failure message.\n// Deprecated; use AssertionFailure() << message.\nAssertionResult AssertionFailure(const Message& message) {\n  return AssertionFailure() << message;\n}\n\nnamespace internal {\n\n// Constructs and returns the message for an equality assertion\n// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.\n//\n// The first four parameters are the expressions used in the assertion\n// and their values, as strings.  For example, for ASSERT_EQ(foo, bar)\n// where foo is 5 and bar is 6, we have:\n//\n//   expected_expression: \"foo\"\n//   actual_expression:   \"bar\"\n//   expected_value:      \"5\"\n//   actual_value:        \"6\"\n//\n// The ignoring_case parameter is true iff the assertion is a\n// *_STRCASEEQ*.  When it's true, the string \" (ignoring case)\" will\n// be inserted into the message.\nAssertionResult EqFailure(const char* expected_expression,\n                          const char* actual_expression,\n                          const String& expected_value,\n                          const String& actual_value,\n                          bool ignoring_case) {\n  Message msg;\n  msg << \"Value of: \" << actual_expression;\n  if (actual_value != actual_expression) {\n    msg << \"\\n  Actual: \" << actual_value;\n  }\n\n  msg << \"\\nExpected: \" << expected_expression;\n  if (ignoring_case) {\n    msg << \" (ignoring case)\";\n  }\n  if (expected_value != expected_expression) {\n    msg << \"\\nWhich is: \" << expected_value;\n  }\n\n  return AssertionFailure() << msg;\n}\n\n// Constructs a failure message for Boolean assertions such as EXPECT_TRUE.\nString GetBoolAssertionFailureMessage(const AssertionResult& assertion_result,\n                                      const char* expression_text,\n                                      const char* actual_predicate_value,\n                                      const char* expected_predicate_value) {\n  const char* actual_message = assertion_result.message();\n  Message msg;\n  msg << \"Value of: \" << expression_text\n      << \"\\n  Actual: \" << actual_predicate_value;\n  if (actual_message[0] != '\\0')\n    msg << \" (\" << actual_message << \")\";\n  msg << \"\\nExpected: \" << expected_predicate_value;\n  return msg.GetString();\n}\n\n// Helper function for implementing ASSERT_NEAR.\nAssertionResult DoubleNearPredFormat(const char* expr1,\n                                     const char* expr2,\n                                     const char* abs_error_expr,\n                                     double val1,\n                                     double val2,\n                                     double abs_error) {\n  const double diff = fabs(val1 - val2);\n  if (diff <= abs_error) return AssertionSuccess();\n\n  // TODO(wan): do not print the value of an expression if it's\n  // already a literal.\n  return AssertionFailure()\n      << \"The difference between \" << expr1 << \" and \" << expr2\n      << \" is \" << diff << \", which exceeds \" << abs_error_expr << \", where\\n\"\n      << expr1 << \" evaluates to \" << val1 << \",\\n\"\n      << expr2 << \" evaluates to \" << val2 << \", and\\n\"\n      << abs_error_expr << \" evaluates to \" << abs_error << \".\";\n}\n\n\n// Helper template for implementing FloatLE() and DoubleLE().\ntemplate <typename RawType>\nAssertionResult FloatingPointLE(const char* expr1,\n                                const char* expr2,\n                                RawType val1,\n                                RawType val2) {\n  // Returns success if val1 is less than val2,\n  if (val1 < val2) {\n    return AssertionSuccess();\n  }\n\n  // or if val1 is almost equal to val2.\n  const FloatingPoint<RawType> lhs(val1), rhs(val2);\n  if (lhs.AlmostEquals(rhs)) {\n    return AssertionSuccess();\n  }\n\n  // Note that the above two checks will both fail if either val1 or\n  // val2 is NaN, as the IEEE floating-point standard requires that\n  // any predicate involving a NaN must return false.\n\n  ::std::stringstream val1_ss;\n  val1_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)\n          << val1;\n\n  ::std::stringstream val2_ss;\n  val2_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)\n          << val2;\n\n  return AssertionFailure()\n      << \"Expected: (\" << expr1 << \") <= (\" << expr2 << \")\\n\"\n      << \"  Actual: \" << StringStreamToString(&val1_ss) << \" vs \"\n      << StringStreamToString(&val2_ss);\n}\n\n}  // namespace internal\n\n// Asserts that val1 is less than, or almost equal to, val2.  Fails\n// otherwise.  In particular, it fails if either val1 or val2 is NaN.\nAssertionResult FloatLE(const char* expr1, const char* expr2,\n                        float val1, float val2) {\n  return internal::FloatingPointLE<float>(expr1, expr2, val1, val2);\n}\n\n// Asserts that val1 is less than, or almost equal to, val2.  Fails\n// otherwise.  In particular, it fails if either val1 or val2 is NaN.\nAssertionResult DoubleLE(const char* expr1, const char* expr2,\n                         double val1, double val2) {\n  return internal::FloatingPointLE<double>(expr1, expr2, val1, val2);\n}\n\nnamespace internal {\n\n// The helper function for {ASSERT|EXPECT}_EQ with int or enum\n// arguments.\nAssertionResult CmpHelperEQ(const char* expected_expression,\n                            const char* actual_expression,\n                            BiggestInt expected,\n                            BiggestInt actual) {\n  if (expected == actual) {\n    return AssertionSuccess();\n  }\n\n  return EqFailure(expected_expression,\n                   actual_expression,\n                   FormatForComparisonFailureMessage(expected, actual),\n                   FormatForComparisonFailureMessage(actual, expected),\n                   false);\n}\n\n// A macro for implementing the helper functions needed to implement\n// ASSERT_?? and EXPECT_?? with integer or enum arguments.  It is here\n// just to avoid copy-and-paste of similar code.\n#define GTEST_IMPL_CMP_HELPER_(op_name, op)\\\nAssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \\\n                                   BiggestInt val1, BiggestInt val2) {\\\n  if (val1 op val2) {\\\n    return AssertionSuccess();\\\n  } else {\\\n    return AssertionFailure() \\\n        << \"Expected: (\" << expr1 << \") \" #op \" (\" << expr2\\\n        << \"), actual: \" << FormatForComparisonFailureMessage(val1, val2)\\\n        << \" vs \" << FormatForComparisonFailureMessage(val2, val1);\\\n  }\\\n}\n\n// Implements the helper function for {ASSERT|EXPECT}_NE with int or\n// enum arguments.\nGTEST_IMPL_CMP_HELPER_(NE, !=)\n// Implements the helper function for {ASSERT|EXPECT}_LE with int or\n// enum arguments.\nGTEST_IMPL_CMP_HELPER_(LE, <=)\n// Implements the helper function for {ASSERT|EXPECT}_LT with int or\n// enum arguments.\nGTEST_IMPL_CMP_HELPER_(LT, < )\n// Implements the helper function for {ASSERT|EXPECT}_GE with int or\n// enum arguments.\nGTEST_IMPL_CMP_HELPER_(GE, >=)\n// Implements the helper function for {ASSERT|EXPECT}_GT with int or\n// enum arguments.\nGTEST_IMPL_CMP_HELPER_(GT, > )\n\n#undef GTEST_IMPL_CMP_HELPER_\n\n// The helper function for {ASSERT|EXPECT}_STREQ.\nAssertionResult CmpHelperSTREQ(const char* expected_expression,\n                               const char* actual_expression,\n                               const char* expected,\n                               const char* actual) {\n  if (String::CStringEquals(expected, actual)) {\n    return AssertionSuccess();\n  }\n\n  return EqFailure(expected_expression,\n                   actual_expression,\n                   String::ShowCStringQuoted(expected),\n                   String::ShowCStringQuoted(actual),\n                   false);\n}\n\n// The helper function for {ASSERT|EXPECT}_STRCASEEQ.\nAssertionResult CmpHelperSTRCASEEQ(const char* expected_expression,\n                                   const char* actual_expression,\n                                   const char* expected,\n                                   const char* actual) {\n  if (String::CaseInsensitiveCStringEquals(expected, actual)) {\n    return AssertionSuccess();\n  }\n\n  return EqFailure(expected_expression,\n                   actual_expression,\n                   String::ShowCStringQuoted(expected),\n                   String::ShowCStringQuoted(actual),\n                   true);\n}\n\n// The helper function for {ASSERT|EXPECT}_STRNE.\nAssertionResult CmpHelperSTRNE(const char* s1_expression,\n                               const char* s2_expression,\n                               const char* s1,\n                               const char* s2) {\n  if (!String::CStringEquals(s1, s2)) {\n    return AssertionSuccess();\n  } else {\n    return AssertionFailure() << \"Expected: (\" << s1_expression << \") != (\"\n                              << s2_expression << \"), actual: \\\"\"\n                              << s1 << \"\\\" vs \\\"\" << s2 << \"\\\"\";\n  }\n}\n\n// The helper function for {ASSERT|EXPECT}_STRCASENE.\nAssertionResult CmpHelperSTRCASENE(const char* s1_expression,\n                                   const char* s2_expression,\n                                   const char* s1,\n                                   const char* s2) {\n  if (!String::CaseInsensitiveCStringEquals(s1, s2)) {\n    return AssertionSuccess();\n  } else {\n    return AssertionFailure()\n        << \"Expected: (\" << s1_expression << \") != (\"\n        << s2_expression << \") (ignoring case), actual: \\\"\"\n        << s1 << \"\\\" vs \\\"\" << s2 << \"\\\"\";\n  }\n}\n\n}  // namespace internal\n\nnamespace {\n\n// Helper functions for implementing IsSubString() and IsNotSubstring().\n\n// This group of overloaded functions return true iff needle is a\n// substring of haystack.  NULL is considered a substring of itself\n// only.\n\nbool IsSubstringPred(const char* needle, const char* haystack) {\n  if (needle == NULL || haystack == NULL)\n    return needle == haystack;\n\n  return strstr(haystack, needle) != NULL;\n}\n\nbool IsSubstringPred(const wchar_t* needle, const wchar_t* haystack) {\n  if (needle == NULL || haystack == NULL)\n    return needle == haystack;\n\n  return wcsstr(haystack, needle) != NULL;\n}\n\n// StringType here can be either ::std::string or ::std::wstring.\ntemplate <typename StringType>\nbool IsSubstringPred(const StringType& needle,\n                     const StringType& haystack) {\n  return haystack.find(needle) != StringType::npos;\n}\n\n// This function implements either IsSubstring() or IsNotSubstring(),\n// depending on the value of the expected_to_be_substring parameter.\n// StringType here can be const char*, const wchar_t*, ::std::string,\n// or ::std::wstring.\ntemplate <typename StringType>\nAssertionResult IsSubstringImpl(\n    bool expected_to_be_substring,\n    const char* needle_expr, const char* haystack_expr,\n    const StringType& needle, const StringType& haystack) {\n  if (IsSubstringPred(needle, haystack) == expected_to_be_substring)\n    return AssertionSuccess();\n\n  const bool is_wide_string = sizeof(needle[0]) > 1;\n  const char* const begin_string_quote = is_wide_string ? \"L\\\"\" : \"\\\"\";\n  return AssertionFailure()\n      << \"Value of: \" << needle_expr << \"\\n\"\n      << \"  Actual: \" << begin_string_quote << needle << \"\\\"\\n\"\n      << \"Expected: \" << (expected_to_be_substring ? \"\" : \"not \")\n      << \"a substring of \" << haystack_expr << \"\\n\"\n      << \"Which is: \" << begin_string_quote << haystack << \"\\\"\";\n}\n\n}  // namespace\n\n// IsSubstring() and IsNotSubstring() check whether needle is a\n// substring of haystack (NULL is considered a substring of itself\n// only), and return an appropriate error message when they fail.\n\nAssertionResult IsSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const char* needle, const char* haystack) {\n  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);\n}\n\nAssertionResult IsSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const wchar_t* needle, const wchar_t* haystack) {\n  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);\n}\n\nAssertionResult IsNotSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const char* needle, const char* haystack) {\n  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);\n}\n\nAssertionResult IsNotSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const wchar_t* needle, const wchar_t* haystack) {\n  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);\n}\n\nAssertionResult IsSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const ::std::string& needle, const ::std::string& haystack) {\n  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);\n}\n\nAssertionResult IsNotSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const ::std::string& needle, const ::std::string& haystack) {\n  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);\n}\n\n#if GTEST_HAS_STD_WSTRING\nAssertionResult IsSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const ::std::wstring& needle, const ::std::wstring& haystack) {\n  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);\n}\n\nAssertionResult IsNotSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const ::std::wstring& needle, const ::std::wstring& haystack) {\n  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);\n}\n#endif  // GTEST_HAS_STD_WSTRING\n\nnamespace internal {\n\n#if GTEST_OS_WINDOWS\n\nnamespace {\n\n// Helper function for IsHRESULT{SuccessFailure} predicates\nAssertionResult HRESULTFailureHelper(const char* expr,\n                                     const char* expected,\n                                     long hr) {  // NOLINT\n# if GTEST_OS_WINDOWS_MOBILE\n\n  // Windows CE doesn't support FormatMessage.\n  const char error_text[] = \"\";\n\n# else\n\n  // Looks up the human-readable system message for the HRESULT code\n  // and since we're not passing any params to FormatMessage, we don't\n  // want inserts expanded.\n  const DWORD kFlags = FORMAT_MESSAGE_FROM_SYSTEM |\n                       FORMAT_MESSAGE_IGNORE_INSERTS;\n  const DWORD kBufSize = 4096;  // String::Format can't exceed this length.\n  // Gets the system's human readable message string for this HRESULT.\n  char error_text[kBufSize] = { '\\0' };\n  DWORD message_length = ::FormatMessageA(kFlags,\n                                          0,  // no source, we're asking system\n                                          hr,  // the error\n                                          0,  // no line width restrictions\n                                          error_text,  // output buffer\n                                          kBufSize,  // buf size\n                                          NULL);  // no arguments for inserts\n  // Trims tailing white space (FormatMessage leaves a trailing cr-lf)\n  for (; message_length && IsSpace(error_text[message_length - 1]);\n          --message_length) {\n    error_text[message_length - 1] = '\\0';\n  }\n\n# endif  // GTEST_OS_WINDOWS_MOBILE\n\n  const String error_hex(String::Format(\"0x%08X \", hr));\n  return ::testing::AssertionFailure()\n      << \"Expected: \" << expr << \" \" << expected << \".\\n\"\n      << \"  Actual: \" << error_hex << error_text << \"\\n\";\n}\n\n}  // namespace\n\nAssertionResult IsHRESULTSuccess(const char* expr, long hr) {  // NOLINT\n  if (SUCCEEDED(hr)) {\n    return AssertionSuccess();\n  }\n  return HRESULTFailureHelper(expr, \"succeeds\", hr);\n}\n\nAssertionResult IsHRESULTFailure(const char* expr, long hr) {  // NOLINT\n  if (FAILED(hr)) {\n    return AssertionSuccess();\n  }\n  return HRESULTFailureHelper(expr, \"fails\", hr);\n}\n\n#endif  // GTEST_OS_WINDOWS\n\n// Utility functions for encoding Unicode text (wide strings) in\n// UTF-8.\n\n// A Unicode code-point can have upto 21 bits, and is encoded in UTF-8\n// like this:\n//\n// Code-point length   Encoding\n//   0 -  7 bits       0xxxxxxx\n//   8 - 11 bits       110xxxxx 10xxxxxx\n//  12 - 16 bits       1110xxxx 10xxxxxx 10xxxxxx\n//  17 - 21 bits       11110xxx 10xxxxxx 10xxxxxx 10xxxxxx\n\n// The maximum code-point a one-byte UTF-8 sequence can represent.\nconst UInt32 kMaxCodePoint1 = (static_cast<UInt32>(1) <<  7) - 1;\n\n// The maximum code-point a two-byte UTF-8 sequence can represent.\nconst UInt32 kMaxCodePoint2 = (static_cast<UInt32>(1) << (5 + 6)) - 1;\n\n// The maximum code-point a three-byte UTF-8 sequence can represent.\nconst UInt32 kMaxCodePoint3 = (static_cast<UInt32>(1) << (4 + 2*6)) - 1;\n\n// The maximum code-point a four-byte UTF-8 sequence can represent.\nconst UInt32 kMaxCodePoint4 = (static_cast<UInt32>(1) << (3 + 3*6)) - 1;\n\n// Chops off the n lowest bits from a bit pattern.  Returns the n\n// lowest bits.  As a side effect, the original bit pattern will be\n// shifted to the right by n bits.\ninline UInt32 ChopLowBits(UInt32* bits, int n) {\n  const UInt32 low_bits = *bits & ((static_cast<UInt32>(1) << n) - 1);\n  *bits >>= n;\n  return low_bits;\n}\n\n// Converts a Unicode code point to a narrow string in UTF-8 encoding.\n// code_point parameter is of type UInt32 because wchar_t may not be\n// wide enough to contain a code point.\n// The output buffer str must containt at least 32 characters.\n// The function returns the address of the output buffer.\n// If the code_point is not a valid Unicode code point\n// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be output\n// as '(Invalid Unicode 0xXXXXXXXX)'.\nchar* CodePointToUtf8(UInt32 code_point, char* str) {\n  if (code_point <= kMaxCodePoint1) {\n    str[1] = '\\0';\n    str[0] = static_cast<char>(code_point);                          // 0xxxxxxx\n  } else if (code_point <= kMaxCodePoint2) {\n    str[2] = '\\0';\n    str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx\n    str[0] = static_cast<char>(0xC0 | code_point);                   // 110xxxxx\n  } else if (code_point <= kMaxCodePoint3) {\n    str[3] = '\\0';\n    str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx\n    str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx\n    str[0] = static_cast<char>(0xE0 | code_point);                   // 1110xxxx\n  } else if (code_point <= kMaxCodePoint4) {\n    str[4] = '\\0';\n    str[3] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx\n    str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx\n    str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx\n    str[0] = static_cast<char>(0xF0 | code_point);                   // 11110xxx\n  } else {\n    // The longest string String::Format can produce when invoked\n    // with these parameters is 28 character long (not including\n    // the terminating nul character). We are asking for 32 character\n    // buffer just in case. This is also enough for strncpy to\n    // null-terminate the destination string.\n    posix::StrNCpy(\n        str, String::Format(\"(Invalid Unicode 0x%X)\", code_point).c_str(), 32);\n    str[31] = '\\0';  // Makes sure no change in the format to strncpy leaves\n                     // the result unterminated.\n  }\n  return str;\n}\n\n// The following two functions only make sense if the the system\n// uses UTF-16 for wide string encoding. All supported systems\n// with 16 bit wchar_t (Windows, Cygwin, Symbian OS) do use UTF-16.\n\n// Determines if the arguments constitute UTF-16 surrogate pair\n// and thus should be combined into a single Unicode code point\n// using CreateCodePointFromUtf16SurrogatePair.\ninline bool IsUtf16SurrogatePair(wchar_t first, wchar_t second) {\n  return sizeof(wchar_t) == 2 &&\n      (first & 0xFC00) == 0xD800 && (second & 0xFC00) == 0xDC00;\n}\n\n// Creates a Unicode code point from UTF16 surrogate pair.\ninline UInt32 CreateCodePointFromUtf16SurrogatePair(wchar_t first,\n                                                    wchar_t second) {\n  const UInt32 mask = (1 << 10) - 1;\n  return (sizeof(wchar_t) == 2) ?\n      (((first & mask) << 10) | (second & mask)) + 0x10000 :\n      // This function should not be called when the condition is\n      // false, but we provide a sensible default in case it is.\n      static_cast<UInt32>(first);\n}\n\n// Converts a wide string to a narrow string in UTF-8 encoding.\n// The wide string is assumed to have the following encoding:\n//   UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS)\n//   UTF-32 if sizeof(wchar_t) == 4 (on Linux)\n// Parameter str points to a null-terminated wide string.\n// Parameter num_chars may additionally limit the number\n// of wchar_t characters processed. -1 is used when the entire string\n// should be processed.\n// If the string contains code points that are not valid Unicode code points\n// (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output\n// as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding\n// and contains invalid UTF-16 surrogate pairs, values in those pairs\n// will be encoded as individual Unicode characters from Basic Normal Plane.\nString WideStringToUtf8(const wchar_t* str, int num_chars) {\n  if (num_chars == -1)\n    num_chars = static_cast<int>(wcslen(str));\n\n  ::std::stringstream stream;\n  for (int i = 0; i < num_chars; ++i) {\n    UInt32 unicode_code_point;\n\n    if (str[i] == L'\\0') {\n      break;\n    } else if (i + 1 < num_chars && IsUtf16SurrogatePair(str[i], str[i + 1])) {\n      unicode_code_point = CreateCodePointFromUtf16SurrogatePair(str[i],\n                                                                 str[i + 1]);\n      i++;\n    } else {\n      unicode_code_point = static_cast<UInt32>(str[i]);\n    }\n\n    char buffer[32];  // CodePointToUtf8 requires a buffer this big.\n    stream << CodePointToUtf8(unicode_code_point, buffer);\n  }\n  return StringStreamToString(&stream);\n}\n\n// Converts a wide C string to a String using the UTF-8 encoding.\n// NULL will be converted to \"(null)\".\nString String::ShowWideCString(const wchar_t * wide_c_str) {\n  if (wide_c_str == NULL) return String(\"(null)\");\n\n  return String(internal::WideStringToUtf8(wide_c_str, -1).c_str());\n}\n\n// Similar to ShowWideCString(), except that this function encloses\n// the converted string in double quotes.\nString String::ShowWideCStringQuoted(const wchar_t* wide_c_str) {\n  if (wide_c_str == NULL) return String(\"(null)\");\n\n  return String::Format(\"L\\\"%s\\\"\",\n                        String::ShowWideCString(wide_c_str).c_str());\n}\n\n// Compares two wide C strings.  Returns true iff they have the same\n// content.\n//\n// Unlike wcscmp(), this function can handle NULL argument(s).  A NULL\n// C string is considered different to any non-NULL C string,\n// including the empty string.\nbool String::WideCStringEquals(const wchar_t * lhs, const wchar_t * rhs) {\n  if (lhs == NULL) return rhs == NULL;\n\n  if (rhs == NULL) return false;\n\n  return wcscmp(lhs, rhs) == 0;\n}\n\n// Helper function for *_STREQ on wide strings.\nAssertionResult CmpHelperSTREQ(const char* expected_expression,\n                               const char* actual_expression,\n                               const wchar_t* expected,\n                               const wchar_t* actual) {\n  if (String::WideCStringEquals(expected, actual)) {\n    return AssertionSuccess();\n  }\n\n  return EqFailure(expected_expression,\n                   actual_expression,\n                   String::ShowWideCStringQuoted(expected),\n                   String::ShowWideCStringQuoted(actual),\n                   false);\n}\n\n// Helper function for *_STRNE on wide strings.\nAssertionResult CmpHelperSTRNE(const char* s1_expression,\n                               const char* s2_expression,\n                               const wchar_t* s1,\n                               const wchar_t* s2) {\n  if (!String::WideCStringEquals(s1, s2)) {\n    return AssertionSuccess();\n  }\n\n  return AssertionFailure() << \"Expected: (\" << s1_expression << \") != (\"\n                            << s2_expression << \"), actual: \"\n                            << String::ShowWideCStringQuoted(s1)\n                            << \" vs \" << String::ShowWideCStringQuoted(s2);\n}\n\n// Compares two C strings, ignoring case.  Returns true iff they have\n// the same content.\n//\n// Unlike strcasecmp(), this function can handle NULL argument(s).  A\n// NULL C string is considered different to any non-NULL C string,\n// including the empty string.\nbool String::CaseInsensitiveCStringEquals(const char * lhs, const char * rhs) {\n  if (lhs == NULL)\n    return rhs == NULL;\n  if (rhs == NULL)\n    return false;\n  return posix::StrCaseCmp(lhs, rhs) == 0;\n}\n\n  // Compares two wide C strings, ignoring case.  Returns true iff they\n  // have the same content.\n  //\n  // Unlike wcscasecmp(), this function can handle NULL argument(s).\n  // A NULL C string is considered different to any non-NULL wide C string,\n  // including the empty string.\n  // NB: The implementations on different platforms slightly differ.\n  // On windows, this method uses _wcsicmp which compares according to LC_CTYPE\n  // environment variable. On GNU platform this method uses wcscasecmp\n  // which compares according to LC_CTYPE category of the current locale.\n  // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the\n  // current locale.\nbool String::CaseInsensitiveWideCStringEquals(const wchar_t* lhs,\n                                              const wchar_t* rhs) {\n  if (lhs == NULL) return rhs == NULL;\n\n  if (rhs == NULL) return false;\n\n#if GTEST_OS_WINDOWS\n  return _wcsicmp(lhs, rhs) == 0;\n#elif GTEST_OS_LINUX && !GTEST_OS_LINUX_ANDROID\n  return wcscasecmp(lhs, rhs) == 0;\n#else\n  // Android, Mac OS X and Cygwin don't define wcscasecmp.\n  // Other unknown OSes may not define it either.\n  wint_t left, right;\n  do {\n    left = towlower(*lhs++);\n    right = towlower(*rhs++);\n  } while (left && left == right);\n  return left == right;\n#endif  // OS selector\n}\n\n// Compares this with another String.\n// Returns < 0 if this is less than rhs, 0 if this is equal to rhs, or > 0\n// if this is greater than rhs.\nint String::Compare(const String & rhs) const {\n  const char* const lhs_c_str = c_str();\n  const char* const rhs_c_str = rhs.c_str();\n\n  if (lhs_c_str == NULL) {\n    return rhs_c_str == NULL ? 0 : -1;  // NULL < anything except NULL\n  } else if (rhs_c_str == NULL) {\n    return 1;\n  }\n\n  const size_t shorter_str_len =\n      length() <= rhs.length() ? length() : rhs.length();\n  for (size_t i = 0; i != shorter_str_len; i++) {\n    if (lhs_c_str[i] < rhs_c_str[i]) {\n      return -1;\n    } else if (lhs_c_str[i] > rhs_c_str[i]) {\n      return 1;\n    }\n  }\n  return (length() < rhs.length()) ? -1 :\n      (length() > rhs.length()) ? 1 : 0;\n}\n\n// Returns true iff this String ends with the given suffix.  *Any*\n// String is considered to end with a NULL or empty suffix.\nbool String::EndsWith(const char* suffix) const {\n  if (suffix == NULL || CStringEquals(suffix, \"\")) return true;\n\n  if (c_str() == NULL) return false;\n\n  const size_t this_len = strlen(c_str());\n  const size_t suffix_len = strlen(suffix);\n  return (this_len >= suffix_len) &&\n         CStringEquals(c_str() + this_len - suffix_len, suffix);\n}\n\n// Returns true iff this String ends with the given suffix, ignoring case.\n// Any String is considered to end with a NULL or empty suffix.\nbool String::EndsWithCaseInsensitive(const char* suffix) const {\n  if (suffix == NULL || CStringEquals(suffix, \"\")) return true;\n\n  if (c_str() == NULL) return false;\n\n  const size_t this_len = strlen(c_str());\n  const size_t suffix_len = strlen(suffix);\n  return (this_len >= suffix_len) &&\n         CaseInsensitiveCStringEquals(c_str() + this_len - suffix_len, suffix);\n}\n\n// Formats a list of arguments to a String, using the same format\n// spec string as for printf.\n//\n// We do not use the StringPrintf class as it is not universally\n// available.\n//\n// The result is limited to 4096 characters (including the tailing 0).\n// If 4096 characters are not enough to format the input, or if\n// there's an error, \"<formatting error or buffer exceeded>\" is\n// returned.\nString String::Format(const char * format, ...) {\n  va_list args;\n  va_start(args, format);\n\n  char buffer[4096];\n  const int kBufferSize = sizeof(buffer)/sizeof(buffer[0]);\n\n  // MSVC 8 deprecates vsnprintf(), so we want to suppress warning\n  // 4996 (deprecated function) there.\n#ifdef _MSC_VER  // We are using MSVC.\n# pragma warning(push)          // Saves the current warning state.\n# pragma warning(disable:4996)  // Temporarily disables warning 4996.\n\n  const int size = vsnprintf(buffer, kBufferSize, format, args);\n\n# pragma warning(pop)           // Restores the warning state.\n#else  // We are not using MSVC.\n  const int size = vsnprintf(buffer, kBufferSize, format, args);\n#endif  // _MSC_VER\n  va_end(args);\n\n  // vsnprintf()'s behavior is not portable.  When the buffer is not\n  // big enough, it returns a negative value in MSVC, and returns the\n  // needed buffer size on Linux.  When there is an output error, it\n  // always returns a negative value.  For simplicity, we lump the two\n  // error cases together.\n  if (size < 0 || size >= kBufferSize) {\n    return String(\"<formatting error or buffer exceeded>\");\n  } else {\n    return String(buffer, size);\n  }\n}\n\n// Converts the buffer in a stringstream to a String, converting NUL\n// bytes to \"\\\\0\" along the way.\nString StringStreamToString(::std::stringstream* ss) {\n  const ::std::string& str = ss->str();\n  const char* const start = str.c_str();\n  const char* const end = start + str.length();\n\n  // We need to use a helper stringstream to do this transformation\n  // because String doesn't support push_back().\n  ::std::stringstream helper;\n  for (const char* ch = start; ch != end; ++ch) {\n    if (*ch == '\\0') {\n      helper << \"\\\\0\";  // Replaces NUL with \"\\\\0\";\n    } else {\n      helper.put(*ch);\n    }\n  }\n\n  return String(helper.str().c_str());\n}\n\n// Appends the user-supplied message to the Google-Test-generated message.\nString AppendUserMessage(const String& gtest_msg,\n                         const Message& user_msg) {\n  // Appends the user message if it's non-empty.\n  const String user_msg_string = user_msg.GetString();\n  if (user_msg_string.empty()) {\n    return gtest_msg;\n  }\n\n  Message msg;\n  msg << gtest_msg << \"\\n\" << user_msg_string;\n\n  return msg.GetString();\n}\n\n}  // namespace internal\n\n// class TestResult\n\n// Creates an empty TestResult.\nTestResult::TestResult()\n    : death_test_count_(0),\n      elapsed_time_(0) {\n}\n\n// D'tor.\nTestResult::~TestResult() {\n}\n\n// Returns the i-th test part result among all the results. i can\n// range from 0 to total_part_count() - 1. If i is not in that range,\n// aborts the program.\nconst TestPartResult& TestResult::GetTestPartResult(int i) const {\n  if (i < 0 || i >= total_part_count())\n    internal::posix::Abort();\n  return test_part_results_.at(i);\n}\n\n// Returns the i-th test property. i can range from 0 to\n// test_property_count() - 1. If i is not in that range, aborts the\n// program.\nconst TestProperty& TestResult::GetTestProperty(int i) const {\n  if (i < 0 || i >= test_property_count())\n    internal::posix::Abort();\n  return test_properties_.at(i);\n}\n\n// Clears the test part results.\nvoid TestResult::ClearTestPartResults() {\n  test_part_results_.clear();\n}\n\n// Adds a test part result to the list.\nvoid TestResult::AddTestPartResult(const TestPartResult& test_part_result) {\n  test_part_results_.push_back(test_part_result);\n}\n\n// Adds a test property to the list. If a property with the same key as the\n// supplied property is already represented, the value of this test_property\n// replaces the old value for that key.\nvoid TestResult::RecordProperty(const TestProperty& test_property) {\n  if (!ValidateTestProperty(test_property)) {\n    return;\n  }\n  internal::MutexLock lock(&test_properites_mutex_);\n  const std::vector<TestProperty>::iterator property_with_matching_key =\n      std::find_if(test_properties_.begin(), test_properties_.end(),\n                   internal::TestPropertyKeyIs(test_property.key()));\n  if (property_with_matching_key == test_properties_.end()) {\n    test_properties_.push_back(test_property);\n    return;\n  }\n  property_with_matching_key->SetValue(test_property.value());\n}\n\n// Adds a failure if the key is a reserved attribute of Google Test\n// testcase tags.  Returns true if the property is valid.\nbool TestResult::ValidateTestProperty(const TestProperty& test_property) {\n  internal::String key(test_property.key());\n  if (key == \"name\" || key == \"status\" || key == \"time\" || key == \"classname\") {\n    ADD_FAILURE()\n        << \"Reserved key used in RecordProperty(): \"\n        << key\n        << \" ('name', 'status', 'time', and 'classname' are reserved by \"\n        << GTEST_NAME_ << \")\";\n    return false;\n  }\n  return true;\n}\n\n// Clears the object.\nvoid TestResult::Clear() {\n  test_part_results_.clear();\n  test_properties_.clear();\n  death_test_count_ = 0;\n  elapsed_time_ = 0;\n}\n\n// Returns true iff the test failed.\nbool TestResult::Failed() const {\n  for (int i = 0; i < total_part_count(); ++i) {\n    if (GetTestPartResult(i).failed())\n      return true;\n  }\n  return false;\n}\n\n// Returns true iff the test part fatally failed.\nstatic bool TestPartFatallyFailed(const TestPartResult& result) {\n  return result.fatally_failed();\n}\n\n// Returns true iff the test fatally failed.\nbool TestResult::HasFatalFailure() const {\n  return CountIf(test_part_results_, TestPartFatallyFailed) > 0;\n}\n\n// Returns true iff the test part non-fatally failed.\nstatic bool TestPartNonfatallyFailed(const TestPartResult& result) {\n  return result.nonfatally_failed();\n}\n\n// Returns true iff the test has a non-fatal failure.\nbool TestResult::HasNonfatalFailure() const {\n  return CountIf(test_part_results_, TestPartNonfatallyFailed) > 0;\n}\n\n// Gets the number of all test parts.  This is the sum of the number\n// of successful test parts and the number of failed test parts.\nint TestResult::total_part_count() const {\n  return static_cast<int>(test_part_results_.size());\n}\n\n// Returns the number of the test properties.\nint TestResult::test_property_count() const {\n  return static_cast<int>(test_properties_.size());\n}\n\n// class Test\n\n// Creates a Test object.\n\n// The c'tor saves the values of all Google Test flags.\nTest::Test()\n    : gtest_flag_saver_(new internal::GTestFlagSaver) {\n}\n\n// The d'tor restores the values of all Google Test flags.\nTest::~Test() {\n  delete gtest_flag_saver_;\n}\n\n// Sets up the test fixture.\n//\n// A sub-class may override this.\nvoid Test::SetUp() {\n}\n\n// Tears down the test fixture.\n//\n// A sub-class may override this.\nvoid Test::TearDown() {\n}\n\n// Allows user supplied key value pairs to be recorded for later output.\nvoid Test::RecordProperty(const char* key, const char* value) {\n  UnitTest::GetInstance()->RecordPropertyForCurrentTest(key, value);\n}\n\n// Allows user supplied key value pairs to be recorded for later output.\nvoid Test::RecordProperty(const char* key, int value) {\n  Message value_message;\n  value_message << value;\n  RecordProperty(key, value_message.GetString().c_str());\n}\n\nnamespace internal {\n\nvoid ReportFailureInUnknownLocation(TestPartResult::Type result_type,\n                                    const String& message) {\n  // This function is a friend of UnitTest and as such has access to\n  // AddTestPartResult.\n  UnitTest::GetInstance()->AddTestPartResult(\n      result_type,\n      NULL,  // No info about the source file where the exception occurred.\n      -1,    // We have no info on which line caused the exception.\n      message,\n      String());  // No stack trace, either.\n}\n\n}  // namespace internal\n\n// Google Test requires all tests in the same test case to use the same test\n// fixture class.  This function checks if the current test has the\n// same fixture class as the first test in the current test case.  If\n// yes, it returns true; otherwise it generates a Google Test failure and\n// returns false.\nbool Test::HasSameFixtureClass() {\n  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();\n  const TestCase* const test_case = impl->current_test_case();\n\n  // Info about the first test in the current test case.\n  const TestInfo* const first_test_info = test_case->test_info_list()[0];\n  const internal::TypeId first_fixture_id = first_test_info->fixture_class_id_;\n  const char* const first_test_name = first_test_info->name();\n\n  // Info about the current test.\n  const TestInfo* const this_test_info = impl->current_test_info();\n  const internal::TypeId this_fixture_id = this_test_info->fixture_class_id_;\n  const char* const this_test_name = this_test_info->name();\n\n  if (this_fixture_id != first_fixture_id) {\n    // Is the first test defined using TEST?\n    const bool first_is_TEST = first_fixture_id == internal::GetTestTypeId();\n    // Is this test defined using TEST?\n    const bool this_is_TEST = this_fixture_id == internal::GetTestTypeId();\n\n    if (first_is_TEST || this_is_TEST) {\n      // The user mixed TEST and TEST_F in this test case - we'll tell\n      // him/her how to fix it.\n\n      // Gets the name of the TEST and the name of the TEST_F.  Note\n      // that first_is_TEST and this_is_TEST cannot both be true, as\n      // the fixture IDs are different for the two tests.\n      const char* const TEST_name =\n          first_is_TEST ? first_test_name : this_test_name;\n      const char* const TEST_F_name =\n          first_is_TEST ? this_test_name : first_test_name;\n\n      ADD_FAILURE()\n          << \"All tests in the same test case must use the same test fixture\\n\"\n          << \"class, so mixing TEST_F and TEST in the same test case is\\n\"\n          << \"illegal.  In test case \" << this_test_info->test_case_name()\n          << \",\\n\"\n          << \"test \" << TEST_F_name << \" is defined using TEST_F but\\n\"\n          << \"test \" << TEST_name << \" is defined using TEST.  You probably\\n\"\n          << \"want to change the TEST to TEST_F or move it to another test\\n\"\n          << \"case.\";\n    } else {\n      // The user defined two fixture classes with the same name in\n      // two namespaces - we'll tell him/her how to fix it.\n      ADD_FAILURE()\n          << \"All tests in the same test case must use the same test fixture\\n\"\n          << \"class.  However, in test case \"\n          << this_test_info->test_case_name() << \",\\n\"\n          << \"you defined test \" << first_test_name\n          << \" and test \" << this_test_name << \"\\n\"\n          << \"using two different test fixture classes.  This can happen if\\n\"\n          << \"the two classes are from different namespaces or translation\\n\"\n          << \"units and have the same name.  You should probably rename one\\n\"\n          << \"of the classes to put the tests into different test cases.\";\n    }\n    return false;\n  }\n\n  return true;\n}\n\n#if GTEST_HAS_SEH\n\n// Adds an \"exception thrown\" fatal failure to the current test.  This\n// function returns its result via an output parameter pointer because VC++\n// prohibits creation of objects with destructors on stack in functions\n// using __try (see error C2712).\nstatic internal::String* FormatSehExceptionMessage(DWORD exception_code,\n                                                   const char* location) {\n  Message message;\n  message << \"SEH exception with code 0x\" << std::setbase(16) <<\n    exception_code << std::setbase(10) << \" thrown in \" << location << \".\";\n\n  return new internal::String(message.GetString());\n}\n\n#endif  // GTEST_HAS_SEH\n\n#if GTEST_HAS_EXCEPTIONS\n\n// Adds an \"exception thrown\" fatal failure to the current test.\nstatic internal::String FormatCxxExceptionMessage(const char* description,\n                                                  const char* location) {\n  Message message;\n  if (description != NULL) {\n    message << \"C++ exception with description \\\"\" << description << \"\\\"\";\n  } else {\n    message << \"Unknown C++ exception\";\n  }\n  message << \" thrown in \" << location << \".\";\n\n  return message.GetString();\n}\n\nstatic internal::String PrintTestPartResultToString(\n    const TestPartResult& test_part_result);\n\n// A failed Google Test assertion will throw an exception of this type when\n// GTEST_FLAG(throw_on_failure) is true (if exceptions are enabled).  We\n// derive it from std::runtime_error, which is for errors presumably\n// detectable only at run time.  Since std::runtime_error inherits from\n// std::exception, many testing frameworks know how to extract and print the\n// message inside it.\nclass GoogleTestFailureException : public ::std::runtime_error {\n public:\n  explicit GoogleTestFailureException(const TestPartResult& failure)\n      : ::std::runtime_error(PrintTestPartResultToString(failure).c_str()) {}\n};\n#endif  // GTEST_HAS_EXCEPTIONS\n\nnamespace internal {\n// We put these helper functions in the internal namespace as IBM's xlC\n// compiler rejects the code if they were declared static.\n\n// Runs the given method and handles SEH exceptions it throws, when\n// SEH is supported; returns the 0-value for type Result in case of an\n// SEH exception.  (Microsoft compilers cannot handle SEH and C++\n// exceptions in the same function.  Therefore, we provide a separate\n// wrapper function for handling SEH exceptions.)\ntemplate <class T, typename Result>\nResult HandleSehExceptionsInMethodIfSupported(\n    T* object, Result (T::*method)(), const char* location) {\n#if GTEST_HAS_SEH\n  __try {\n    return (object->*method)();\n  } __except (internal::UnitTestOptions::GTestShouldProcessSEH(  // NOLINT\n      GetExceptionCode())) {\n    // We create the exception message on the heap because VC++ prohibits\n    // creation of objects with destructors on stack in functions using __try\n    // (see error C2712).\n    internal::String* exception_message = FormatSehExceptionMessage(\n        GetExceptionCode(), location);\n    internal::ReportFailureInUnknownLocation(TestPartResult::kFatalFailure,\n                                             *exception_message);\n    delete exception_message;\n    return static_cast<Result>(0);\n  }\n#else\n  (void)location;\n  return (object->*method)();\n#endif  // GTEST_HAS_SEH\n}\n\n// Runs the given method and catches and reports C++ and/or SEH-style\n// exceptions, if they are supported; returns the 0-value for type\n// Result in case of an SEH exception.\ntemplate <class T, typename Result>\nResult HandleExceptionsInMethodIfSupported(\n    T* object, Result (T::*method)(), const char* location) {\n  // NOTE: The user code can affect the way in which Google Test handles\n  // exceptions by setting GTEST_FLAG(catch_exceptions), but only before\n  // RUN_ALL_TESTS() starts. It is technically possible to check the flag\n  // after the exception is caught and either report or re-throw the\n  // exception based on the flag's value:\n  //\n  // try {\n  //   // Perform the test method.\n  // } catch (...) {\n  //   if (GTEST_FLAG(catch_exceptions))\n  //     // Report the exception as failure.\n  //   else\n  //     throw;  // Re-throws the original exception.\n  // }\n  //\n  // However, the purpose of this flag is to allow the program to drop into\n  // the debugger when the exception is thrown. On most platforms, once the\n  // control enters the catch block, the exception origin information is\n  // lost and the debugger will stop the program at the point of the\n  // re-throw in this function -- instead of at the point of the original\n  // throw statement in the code under test.  For this reason, we perform\n  // the check early, sacrificing the ability to affect Google Test's\n  // exception handling in the method where the exception is thrown.\n  if (internal::GetUnitTestImpl()->catch_exceptions()) {\n#if GTEST_HAS_EXCEPTIONS\n    try {\n      return HandleSehExceptionsInMethodIfSupported(object, method, location);\n    } catch (const GoogleTestFailureException&) {  // NOLINT\n      // This exception doesn't originate in code under test. It makes no\n      // sense to report it as a test failure.\n      throw;\n    } catch (const std::exception& e) {  // NOLINT\n      internal::ReportFailureInUnknownLocation(\n          TestPartResult::kFatalFailure,\n          FormatCxxExceptionMessage(e.what(), location));\n    } catch (...) {  // NOLINT\n      internal::ReportFailureInUnknownLocation(\n          TestPartResult::kFatalFailure,\n          FormatCxxExceptionMessage(NULL, location));\n    }\n    return static_cast<Result>(0);\n#else\n    return HandleSehExceptionsInMethodIfSupported(object, method, location);\n#endif  // GTEST_HAS_EXCEPTIONS\n  } else {\n    return (object->*method)();\n  }\n}\n\n}  // namespace internal\n\n// Runs the test and updates the test result.\nvoid Test::Run() {\n  if (!HasSameFixtureClass()) return;\n\n  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();\n  impl->os_stack_trace_getter()->UponLeavingGTest();\n  internal::HandleExceptionsInMethodIfSupported(this, &Test::SetUp, \"SetUp()\");\n  // We will run the test only if SetUp() was successful.\n  if (!HasFatalFailure()) {\n    impl->os_stack_trace_getter()->UponLeavingGTest();\n    internal::HandleExceptionsInMethodIfSupported(\n        this, &Test::TestBody, \"the test body\");\n  }\n\n  // However, we want to clean up as much as possible.  Hence we will\n  // always call TearDown(), even if SetUp() or the test body has\n  // failed.\n  impl->os_stack_trace_getter()->UponLeavingGTest();\n  internal::HandleExceptionsInMethodIfSupported(\n      this, &Test::TearDown, \"TearDown()\");\n}\n\n// Returns true iff the current test has a fatal failure.\nbool Test::HasFatalFailure() {\n  return internal::GetUnitTestImpl()->current_test_result()->HasFatalFailure();\n}\n\n// Returns true iff the current test has a non-fatal failure.\nbool Test::HasNonfatalFailure() {\n  return internal::GetUnitTestImpl()->current_test_result()->\n      HasNonfatalFailure();\n}\n\n// class TestInfo\n\n// Constructs a TestInfo object. It assumes ownership of the test factory\n// object.\n// TODO(vladl@google.com): Make a_test_case_name and a_name const string&'s\n// to signify they cannot be NULLs.\nTestInfo::TestInfo(const char* a_test_case_name,\n                   const char* a_name,\n                   const char* a_type_param,\n                   const char* a_value_param,\n                   internal::TypeId fixture_class_id,\n                   internal::TestFactoryBase* factory)\n    : test_case_name_(a_test_case_name),\n      name_(a_name),\n      type_param_(a_type_param ? new std::string(a_type_param) : NULL),\n      value_param_(a_value_param ? new std::string(a_value_param) : NULL),\n      fixture_class_id_(fixture_class_id),\n      should_run_(false),\n      is_disabled_(false),\n      matches_filter_(false),\n      factory_(factory),\n      result_() {}\n\n// Destructs a TestInfo object.\nTestInfo::~TestInfo() { delete factory_; }\n\nnamespace internal {\n\n// Creates a new TestInfo object and registers it with Google Test;\n// returns the created object.\n//\n// Arguments:\n//\n//   test_case_name:   name of the test case\n//   name:             name of the test\n//   type_param:       the name of the test's type parameter, or NULL if\n//                     this is not a typed or a type-parameterized test.\n//   value_param:      text representation of the test's value parameter,\n//                     or NULL if this is not a value-parameterized test.\n//   fixture_class_id: ID of the test fixture class\n//   set_up_tc:        pointer to the function that sets up the test case\n//   tear_down_tc:     pointer to the function that tears down the test case\n//   factory:          pointer to the factory that creates a test object.\n//                     The newly created TestInfo instance will assume\n//                     ownership of the factory object.\nTestInfo* MakeAndRegisterTestInfo(\n    const char* test_case_name, const char* name,\n    const char* type_param,\n    const char* value_param,\n    TypeId fixture_class_id,\n    SetUpTestCaseFunc set_up_tc,\n    TearDownTestCaseFunc tear_down_tc,\n    TestFactoryBase* factory) {\n  TestInfo* const test_info =\n      new TestInfo(test_case_name, name, type_param, value_param,\n                   fixture_class_id, factory);\n  GetUnitTestImpl()->AddTestInfo(set_up_tc, tear_down_tc, test_info);\n  return test_info;\n}\n\n#if GTEST_HAS_PARAM_TEST\nvoid ReportInvalidTestCaseType(const char* test_case_name,\n                               const char* file, int line) {\n  Message errors;\n  errors\n      << \"Attempted redefinition of test case \" << test_case_name << \".\\n\"\n      << \"All tests in the same test case must use the same test fixture\\n\"\n      << \"class.  However, in test case \" << test_case_name << \", you tried\\n\"\n      << \"to define a test using a fixture class different from the one\\n\"\n      << \"used earlier. This can happen if the two fixture classes are\\n\"\n      << \"from different namespaces and have the same name. You should\\n\"\n      << \"probably rename one of the classes to put the tests into different\\n\"\n      << \"test cases.\";\n\n  fprintf(stderr, \"%s %s\", FormatFileLocation(file, line).c_str(),\n          errors.GetString().c_str());\n}\n#endif  // GTEST_HAS_PARAM_TEST\n\n}  // namespace internal\n\nnamespace {\n\n// A predicate that checks the test name of a TestInfo against a known\n// value.\n//\n// This is used for implementation of the TestCase class only.  We put\n// it in the anonymous namespace to prevent polluting the outer\n// namespace.\n//\n// TestNameIs is copyable.\nclass TestNameIs {\n public:\n  // Constructor.\n  //\n  // TestNameIs has NO default constructor.\n  explicit TestNameIs(const char* name)\n      : name_(name) {}\n\n  // Returns true iff the test name of test_info matches name_.\n  bool operator()(const TestInfo * test_info) const {\n    return test_info && internal::String(test_info->name()).Compare(name_) == 0;\n  }\n\n private:\n  internal::String name_;\n};\n\n}  // namespace\n\nnamespace internal {\n\n// This method expands all parameterized tests registered with macros TEST_P\n// and INSTANTIATE_TEST_CASE_P into regular tests and registers those.\n// This will be done just once during the program runtime.\nvoid UnitTestImpl::RegisterParameterizedTests() {\n#if GTEST_HAS_PARAM_TEST\n  if (!parameterized_tests_registered_) {\n    parameterized_test_registry_.RegisterTests();\n    parameterized_tests_registered_ = true;\n  }\n#endif\n}\n\n}  // namespace internal\n\n// Creates the test object, runs it, records its result, and then\n// deletes it.\nvoid TestInfo::Run() {\n  if (!should_run_) return;\n\n  // Tells UnitTest where to store test result.\n  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();\n  impl->set_current_test_info(this);\n\n  TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();\n\n  // Notifies the unit test event listeners that a test is about to start.\n  repeater->OnTestStart(*this);\n\n  const TimeInMillis start = internal::GetTimeInMillis();\n\n  impl->os_stack_trace_getter()->UponLeavingGTest();\n\n  // Creates the test object.\n  Test* const test = internal::HandleExceptionsInMethodIfSupported(\n      factory_, &internal::TestFactoryBase::CreateTest,\n      \"the test fixture's constructor\");\n\n  // Runs the test only if the test object was created and its\n  // constructor didn't generate a fatal failure.\n  if ((test != NULL) && !Test::HasFatalFailure()) {\n    // This doesn't throw as all user code that can throw are wrapped into\n    // exception handling code.\n    test->Run();\n  }\n\n  // Deletes the test object.\n  impl->os_stack_trace_getter()->UponLeavingGTest();\n  internal::HandleExceptionsInMethodIfSupported(\n      test, &Test::DeleteSelf_, \"the test fixture's destructor\");\n\n  result_.set_elapsed_time(internal::GetTimeInMillis() - start);\n\n  // Notifies the unit test event listener that a test has just finished.\n  repeater->OnTestEnd(*this);\n\n  // Tells UnitTest to stop associating assertion results to this\n  // test.\n  impl->set_current_test_info(NULL);\n}\n\n// class TestCase\n\n// Gets the number of successful tests in this test case.\nint TestCase::successful_test_count() const {\n  return CountIf(test_info_list_, TestPassed);\n}\n\n// Gets the number of failed tests in this test case.\nint TestCase::failed_test_count() const {\n  return CountIf(test_info_list_, TestFailed);\n}\n\nint TestCase::disabled_test_count() const {\n  return CountIf(test_info_list_, TestDisabled);\n}\n\n// Get the number of tests in this test case that should run.\nint TestCase::test_to_run_count() const {\n  return CountIf(test_info_list_, ShouldRunTest);\n}\n\n// Gets the number of all tests.\nint TestCase::total_test_count() const {\n  return static_cast<int>(test_info_list_.size());\n}\n\n// Creates a TestCase with the given name.\n//\n// Arguments:\n//\n//   name:         name of the test case\n//   a_type_param: the name of the test case's type parameter, or NULL if\n//                 this is not a typed or a type-parameterized test case.\n//   set_up_tc:    pointer to the function that sets up the test case\n//   tear_down_tc: pointer to the function that tears down the test case\nTestCase::TestCase(const char* a_name, const char* a_type_param,\n                   Test::SetUpTestCaseFunc set_up_tc,\n                   Test::TearDownTestCaseFunc tear_down_tc)\n    : name_(a_name),\n      type_param_(a_type_param ? new std::string(a_type_param) : NULL),\n      set_up_tc_(set_up_tc),\n      tear_down_tc_(tear_down_tc),\n      should_run_(false),\n      elapsed_time_(0) {\n}\n\n// Destructor of TestCase.\nTestCase::~TestCase() {\n  // Deletes every Test in the collection.\n  ForEach(test_info_list_, internal::Delete<TestInfo>);\n}\n\n// Returns the i-th test among all the tests. i can range from 0 to\n// total_test_count() - 1. If i is not in that range, returns NULL.\nconst TestInfo* TestCase::GetTestInfo(int i) const {\n  const int index = GetElementOr(test_indices_, i, -1);\n  return index < 0 ? NULL : test_info_list_[index];\n}\n\n// Returns the i-th test among all the tests. i can range from 0 to\n// total_test_count() - 1. If i is not in that range, returns NULL.\nTestInfo* TestCase::GetMutableTestInfo(int i) {\n  const int index = GetElementOr(test_indices_, i, -1);\n  return index < 0 ? NULL : test_info_list_[index];\n}\n\n// Adds a test to this test case.  Will delete the test upon\n// destruction of the TestCase object.\nvoid TestCase::AddTestInfo(TestInfo * test_info) {\n  test_info_list_.push_back(test_info);\n  test_indices_.push_back(static_cast<int>(test_indices_.size()));\n}\n\n// Runs every test in this TestCase.\nvoid TestCase::Run() {\n  if (!should_run_) return;\n\n  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();\n  impl->set_current_test_case(this);\n\n  TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();\n\n  repeater->OnTestCaseStart(*this);\n  impl->os_stack_trace_getter()->UponLeavingGTest();\n  internal::HandleExceptionsInMethodIfSupported(\n      this, &TestCase::RunSetUpTestCase, \"SetUpTestCase()\");\n\n  const internal::TimeInMillis start = internal::GetTimeInMillis();\n  for (int i = 0; i < total_test_count(); i++) {\n    GetMutableTestInfo(i)->Run();\n  }\n  elapsed_time_ = internal::GetTimeInMillis() - start;\n\n  impl->os_stack_trace_getter()->UponLeavingGTest();\n  internal::HandleExceptionsInMethodIfSupported(\n      this, &TestCase::RunTearDownTestCase, \"TearDownTestCase()\");\n\n  repeater->OnTestCaseEnd(*this);\n  impl->set_current_test_case(NULL);\n}\n\n// Clears the results of all tests in this test case.\nvoid TestCase::ClearResult() {\n  ForEach(test_info_list_, TestInfo::ClearTestResult);\n}\n\n// Shuffles the tests in this test case.\nvoid TestCase::ShuffleTests(internal::Random* random) {\n  Shuffle(random, &test_indices_);\n}\n\n// Restores the test order to before the first shuffle.\nvoid TestCase::UnshuffleTests() {\n  for (size_t i = 0; i < test_indices_.size(); i++) {\n    test_indices_[i] = static_cast<int>(i);\n  }\n}\n\n// Formats a countable noun.  Depending on its quantity, either the\n// singular form or the plural form is used. e.g.\n//\n// FormatCountableNoun(1, \"formula\", \"formuli\") returns \"1 formula\".\n// FormatCountableNoun(5, \"book\", \"books\") returns \"5 books\".\nstatic internal::String FormatCountableNoun(int count,\n                                            const char * singular_form,\n                                            const char * plural_form) {\n  return internal::String::Format(\"%d %s\", count,\n                                  count == 1 ? singular_form : plural_form);\n}\n\n// Formats the count of tests.\nstatic internal::String FormatTestCount(int test_count) {\n  return FormatCountableNoun(test_count, \"test\", \"tests\");\n}\n\n// Formats the count of test cases.\nstatic internal::String FormatTestCaseCount(int test_case_count) {\n  return FormatCountableNoun(test_case_count, \"test case\", \"test cases\");\n}\n\n// Converts a TestPartResult::Type enum to human-friendly string\n// representation.  Both kNonFatalFailure and kFatalFailure are translated\n// to \"Failure\", as the user usually doesn't care about the difference\n// between the two when viewing the test result.\nstatic const char * TestPartResultTypeToString(TestPartResult::Type type) {\n  switch (type) {\n    case TestPartResult::kSuccess:\n      return \"Success\";\n\n    case TestPartResult::kNonFatalFailure:\n    case TestPartResult::kFatalFailure:\n#ifdef _MSC_VER\n      return \"error: \";\n#else\n      return \"Failure\\n\";\n#endif\n    default:\n      return \"Unknown result type\";\n  }\n}\n\n// Prints a TestPartResult to a String.\nstatic internal::String PrintTestPartResultToString(\n    const TestPartResult& test_part_result) {\n  return (Message()\n          << internal::FormatFileLocation(test_part_result.file_name(),\n                                          test_part_result.line_number())\n          << \" \" << TestPartResultTypeToString(test_part_result.type())\n          << test_part_result.message()).GetString();\n}\n\n// Prints a TestPartResult.\nstatic void PrintTestPartResult(const TestPartResult& test_part_result) {\n  const internal::String& result =\n      PrintTestPartResultToString(test_part_result);\n  printf(\"%s\\n\", result.c_str());\n  fflush(stdout);\n  // If the test program runs in Visual Studio or a debugger, the\n  // following statements add the test part result message to the Output\n  // window such that the user can double-click on it to jump to the\n  // corresponding source code location; otherwise they do nothing.\n#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE\n  // We don't call OutputDebugString*() on Windows Mobile, as printing\n  // to stdout is done by OutputDebugString() there already - we don't\n  // want the same message printed twice.\n  ::OutputDebugStringA(result.c_str());\n  ::OutputDebugStringA(\"\\n\");\n#endif\n}\n\n// class PrettyUnitTestResultPrinter\n\nnamespace internal {\n\nenum GTestColor {\n  COLOR_DEFAULT,\n  COLOR_RED,\n  COLOR_GREEN,\n  COLOR_YELLOW\n};\n\n#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE\n\n// Returns the character attribute for the given color.\nWORD GetColorAttribute(GTestColor color) {\n  switch (color) {\n    case COLOR_RED:    return FOREGROUND_RED;\n    case COLOR_GREEN:  return FOREGROUND_GREEN;\n    case COLOR_YELLOW: return FOREGROUND_RED | FOREGROUND_GREEN;\n    default:           return 0;\n  }\n}\n\n#else\n\n// Returns the ANSI color code for the given color.  COLOR_DEFAULT is\n// an invalid input.\nconst char* GetAnsiColorCode(GTestColor color) {\n  switch (color) {\n    case COLOR_RED:     return \"1\";\n    case COLOR_GREEN:   return \"2\";\n    case COLOR_YELLOW:  return \"3\";\n    default:            return NULL;\n  };\n}\n\n#endif  // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE\n\n// Returns true iff Google Test should use colors in the output.\nbool ShouldUseColor(bool stdout_is_tty) {\n  const char* const gtest_color = GTEST_FLAG(color).c_str();\n\n  if (String::CaseInsensitiveCStringEquals(gtest_color, \"auto\")) {\n#if GTEST_OS_WINDOWS\n    // On Windows the TERM variable is usually not set, but the\n    // console there does support colors.\n    return stdout_is_tty;\n#else\n    // On non-Windows platforms, we rely on the TERM variable.\n    const char* const term = posix::GetEnv(\"TERM\");\n    const bool term_supports_color =\n        String::CStringEquals(term, \"xterm\") ||\n        String::CStringEquals(term, \"xterm-color\") ||\n        String::CStringEquals(term, \"xterm-256color\") ||\n        String::CStringEquals(term, \"screen\") ||\n        String::CStringEquals(term, \"linux\") ||\n        String::CStringEquals(term, \"cygwin\");\n    return stdout_is_tty && term_supports_color;\n#endif  // GTEST_OS_WINDOWS\n  }\n\n  return String::CaseInsensitiveCStringEquals(gtest_color, \"yes\") ||\n      String::CaseInsensitiveCStringEquals(gtest_color, \"true\") ||\n      String::CaseInsensitiveCStringEquals(gtest_color, \"t\") ||\n      String::CStringEquals(gtest_color, \"1\");\n  // We take \"yes\", \"true\", \"t\", and \"1\" as meaning \"yes\".  If the\n  // value is neither one of these nor \"auto\", we treat it as \"no\" to\n  // be conservative.\n}\n\n// Helpers for printing colored strings to stdout. Note that on Windows, we\n// cannot simply emit special characters and have the terminal change colors.\n// This routine must actually emit the characters rather than return a string\n// that would be colored when printed, as can be done on Linux.\nvoid ColoredPrintf(GTestColor color, const char* fmt, ...) {\n  va_list args;\n  va_start(args, fmt);\n\n#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS\n  const bool use_color = false;\n#else\n  static const bool in_color_mode =\n      ShouldUseColor(posix::IsATTY(posix::FileNo(stdout)) != 0);\n  const bool use_color = in_color_mode && (color != COLOR_DEFAULT);\n#endif  // GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS\n  // The '!= 0' comparison is necessary to satisfy MSVC 7.1.\n\n  if (!use_color) {\n    vprintf(fmt, args);\n    va_end(args);\n    return;\n  }\n\n#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE\n  const HANDLE stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE);\n\n  // Gets the current text color.\n  CONSOLE_SCREEN_BUFFER_INFO buffer_info;\n  GetConsoleScreenBufferInfo(stdout_handle, &buffer_info);\n  const WORD old_color_attrs = buffer_info.wAttributes;\n\n  // We need to flush the stream buffers into the console before each\n  // SetConsoleTextAttribute call lest it affect the text that is already\n  // printed but has not yet reached the console.\n  fflush(stdout);\n  SetConsoleTextAttribute(stdout_handle,\n                          GetColorAttribute(color) | FOREGROUND_INTENSITY);\n  vprintf(fmt, args);\n\n  fflush(stdout);\n  // Restores the text color.\n  SetConsoleTextAttribute(stdout_handle, old_color_attrs);\n#else\n  printf(\"\\033[0;3%sm\", GetAnsiColorCode(color));\n  vprintf(fmt, args);\n  printf(\"\\033[m\");  // Resets the terminal to default.\n#endif  // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE\n  va_end(args);\n}\n\nvoid PrintFullTestCommentIfPresent(const TestInfo& test_info) {\n  const char* const type_param = test_info.type_param();\n  const char* const value_param = test_info.value_param();\n\n  if (type_param != NULL || value_param != NULL) {\n    printf(\", where \");\n    if (type_param != NULL) {\n      printf(\"TypeParam = %s\", type_param);\n      if (value_param != NULL)\n        printf(\" and \");\n    }\n    if (value_param != NULL) {\n      printf(\"GetParam() = %s\", value_param);\n    }\n  }\n}\n\n// This class implements the TestEventListener interface.\n//\n// Class PrettyUnitTestResultPrinter is copyable.\nclass PrettyUnitTestResultPrinter : public TestEventListener {\n public:\n  PrettyUnitTestResultPrinter() {}\n  static void PrintTestName(const char * test_case, const char * test) {\n    printf(\"%s.%s\", test_case, test);\n  }\n\n  // The following methods override what's in the TestEventListener class.\n  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {}\n  virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration);\n  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test);\n  virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {}\n  virtual void OnTestCaseStart(const TestCase& test_case);\n  virtual void OnTestStart(const TestInfo& test_info);\n  virtual void OnTestPartResult(const TestPartResult& result);\n  virtual void OnTestEnd(const TestInfo& test_info);\n  virtual void OnTestCaseEnd(const TestCase& test_case);\n  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test);\n  virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {}\n  virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);\n  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {}\n\n private:\n  static void PrintFailedTests(const UnitTest& unit_test);\n\n  internal::String test_case_name_;\n};\n\n  // Fired before each iteration of tests starts.\nvoid PrettyUnitTestResultPrinter::OnTestIterationStart(\n    const UnitTest& unit_test, int iteration) {\n  if (GTEST_FLAG(repeat) != 1)\n    printf(\"\\nRepeating all tests (iteration %d) . . .\\n\\n\", iteration + 1);\n\n  const char* const filter = GTEST_FLAG(filter).c_str();\n\n  // Prints the filter if it's not *.  This reminds the user that some\n  // tests may be skipped.\n  if (!internal::String::CStringEquals(filter, kUniversalFilter)) {\n    ColoredPrintf(COLOR_YELLOW,\n                  \"Note: %s filter = %s\\n\", GTEST_NAME_, filter);\n  }\n\n  if (internal::ShouldShard(kTestTotalShards, kTestShardIndex, false)) {\n    const Int32 shard_index = Int32FromEnvOrDie(kTestShardIndex, -1);\n    ColoredPrintf(COLOR_YELLOW,\n                  \"Note: This is test shard %d of %s.\\n\",\n                  static_cast<int>(shard_index) + 1,\n                  internal::posix::GetEnv(kTestTotalShards));\n  }\n\n  if (GTEST_FLAG(shuffle)) {\n    ColoredPrintf(COLOR_YELLOW,\n                  \"Note: Randomizing tests' orders with a seed of %d .\\n\",\n                  unit_test.random_seed());\n  }\n\n  ColoredPrintf(COLOR_GREEN,  \"[==========] \");\n  printf(\"Running %s from %s.\\n\",\n         FormatTestCount(unit_test.test_to_run_count()).c_str(),\n         FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str());\n  fflush(stdout);\n}\n\nvoid PrettyUnitTestResultPrinter::OnEnvironmentsSetUpStart(\n    const UnitTest& /*unit_test*/) {\n  ColoredPrintf(COLOR_GREEN,  \"[----------] \");\n  printf(\"Global test environment set-up.\\n\");\n  fflush(stdout);\n}\n\nvoid PrettyUnitTestResultPrinter::OnTestCaseStart(const TestCase& test_case) {\n  test_case_name_ = test_case.name();\n  const internal::String counts =\n      FormatCountableNoun(test_case.test_to_run_count(), \"test\", \"tests\");\n  ColoredPrintf(COLOR_GREEN, \"[----------] \");\n  printf(\"%s from %s\", counts.c_str(), test_case_name_.c_str());\n  if (test_case.type_param() == NULL) {\n    printf(\"\\n\");\n  } else {\n    printf(\", where TypeParam = %s\\n\", test_case.type_param());\n  }\n  fflush(stdout);\n}\n\nvoid PrettyUnitTestResultPrinter::OnTestStart(const TestInfo& test_info) {\n  ColoredPrintf(COLOR_GREEN,  \"[ RUN      ] \");\n  PrintTestName(test_case_name_.c_str(), test_info.name());\n  printf(\"\\n\");\n  fflush(stdout);\n}\n\n// Called after an assertion failure.\nvoid PrettyUnitTestResultPrinter::OnTestPartResult(\n    const TestPartResult& result) {\n  // If the test part succeeded, we don't need to do anything.\n  if (result.type() == TestPartResult::kSuccess)\n    return;\n\n  // Print failure message from the assertion (e.g. expected this and got that).\n  PrintTestPartResult(result);\n  fflush(stdout);\n}\n\nvoid PrettyUnitTestResultPrinter::OnTestEnd(const TestInfo& test_info) {\n  if (test_info.result()->Passed()) {\n    ColoredPrintf(COLOR_GREEN, \"[       OK ] \");\n  } else {\n    ColoredPrintf(COLOR_RED, \"[  FAILED  ] \");\n  }\n  PrintTestName(test_case_name_.c_str(), test_info.name());\n  if (test_info.result()->Failed())\n    PrintFullTestCommentIfPresent(test_info);\n\n  if (GTEST_FLAG(print_time)) {\n    printf(\" (%s ms)\\n\", internal::StreamableToString(\n           test_info.result()->elapsed_time()).c_str());\n  } else {\n    printf(\"\\n\");\n  }\n  fflush(stdout);\n}\n\nvoid PrettyUnitTestResultPrinter::OnTestCaseEnd(const TestCase& test_case) {\n  if (!GTEST_FLAG(print_time)) return;\n\n  test_case_name_ = test_case.name();\n  const internal::String counts =\n      FormatCountableNoun(test_case.test_to_run_count(), \"test\", \"tests\");\n  ColoredPrintf(COLOR_GREEN, \"[----------] \");\n  printf(\"%s from %s (%s ms total)\\n\\n\",\n         counts.c_str(), test_case_name_.c_str(),\n         internal::StreamableToString(test_case.elapsed_time()).c_str());\n  fflush(stdout);\n}\n\nvoid PrettyUnitTestResultPrinter::OnEnvironmentsTearDownStart(\n    const UnitTest& /*unit_test*/) {\n  ColoredPrintf(COLOR_GREEN,  \"[----------] \");\n  printf(\"Global test environment tear-down\\n\");\n  fflush(stdout);\n}\n\n// Internal helper for printing the list of failed tests.\nvoid PrettyUnitTestResultPrinter::PrintFailedTests(const UnitTest& unit_test) {\n  const int failed_test_count = unit_test.failed_test_count();\n  if (failed_test_count == 0) {\n    return;\n  }\n\n  for (int i = 0; i < unit_test.total_test_case_count(); ++i) {\n    const TestCase& test_case = *unit_test.GetTestCase(i);\n    if (!test_case.should_run() || (test_case.failed_test_count() == 0)) {\n      continue;\n    }\n    for (int j = 0; j < test_case.total_test_count(); ++j) {\n      const TestInfo& test_info = *test_case.GetTestInfo(j);\n      if (!test_info.should_run() || test_info.result()->Passed()) {\n        continue;\n      }\n      ColoredPrintf(COLOR_RED, \"[  FAILED  ] \");\n      printf(\"%s.%s\", test_case.name(), test_info.name());\n      PrintFullTestCommentIfPresent(test_info);\n      printf(\"\\n\");\n    }\n  }\n}\n\nvoid PrettyUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,\n                                                     int /*iteration*/) {\n  ColoredPrintf(COLOR_GREEN,  \"[==========] \");\n  printf(\"%s from %s ran.\",\n         FormatTestCount(unit_test.test_to_run_count()).c_str(),\n         FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str());\n  if (GTEST_FLAG(print_time)) {\n    printf(\" (%s ms total)\",\n           internal::StreamableToString(unit_test.elapsed_time()).c_str());\n  }\n  printf(\"\\n\");\n  ColoredPrintf(COLOR_GREEN,  \"[  PASSED  ] \");\n  printf(\"%s.\\n\", FormatTestCount(unit_test.successful_test_count()).c_str());\n\n  int num_failures = unit_test.failed_test_count();\n  if (!unit_test.Passed()) {\n    const int failed_test_count = unit_test.failed_test_count();\n    ColoredPrintf(COLOR_RED,  \"[  FAILED  ] \");\n    printf(\"%s, listed below:\\n\", FormatTestCount(failed_test_count).c_str());\n    PrintFailedTests(unit_test);\n    printf(\"\\n%2d FAILED %s\\n\", num_failures,\n                        num_failures == 1 ? \"TEST\" : \"TESTS\");\n  }\n\n  int num_disabled = unit_test.disabled_test_count();\n  if (num_disabled && !GTEST_FLAG(also_run_disabled_tests)) {\n    if (!num_failures) {\n      printf(\"\\n\");  // Add a spacer if no FAILURE banner is displayed.\n    }\n    ColoredPrintf(COLOR_YELLOW,\n                  \"  YOU HAVE %d DISABLED %s\\n\\n\",\n                  num_disabled,\n                  num_disabled == 1 ? \"TEST\" : \"TESTS\");\n  }\n  // Ensure that Google Test output is printed before, e.g., heapchecker output.\n  fflush(stdout);\n}\n\n// End PrettyUnitTestResultPrinter\n\n// class TestEventRepeater\n//\n// This class forwards events to other event listeners.\nclass TestEventRepeater : public TestEventListener {\n public:\n  TestEventRepeater() : forwarding_enabled_(true) {}\n  virtual ~TestEventRepeater();\n  void Append(TestEventListener *listener);\n  TestEventListener* Release(TestEventListener* listener);\n\n  // Controls whether events will be forwarded to listeners_. Set to false\n  // in death test child processes.\n  bool forwarding_enabled() const { return forwarding_enabled_; }\n  void set_forwarding_enabled(bool enable) { forwarding_enabled_ = enable; }\n\n  virtual void OnTestProgramStart(const UnitTest& unit_test);\n  virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration);\n  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test);\n  virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test);\n  virtual void OnTestCaseStart(const TestCase& test_case);\n  virtual void OnTestStart(const TestInfo& test_info);\n  virtual void OnTestPartResult(const TestPartResult& result);\n  virtual void OnTestEnd(const TestInfo& test_info);\n  virtual void OnTestCaseEnd(const TestCase& test_case);\n  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test);\n  virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test);\n  virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);\n  virtual void OnTestProgramEnd(const UnitTest& unit_test);\n\n private:\n  // Controls whether events will be forwarded to listeners_. Set to false\n  // in death test child processes.\n  bool forwarding_enabled_;\n  // The list of listeners that receive events.\n  std::vector<TestEventListener*> listeners_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventRepeater);\n};\n\nTestEventRepeater::~TestEventRepeater() {\n  ForEach(listeners_, Delete<TestEventListener>);\n}\n\nvoid TestEventRepeater::Append(TestEventListener *listener) {\n  listeners_.push_back(listener);\n}\n\n// TODO(vladl@google.com): Factor the search functionality into Vector::Find.\nTestEventListener* TestEventRepeater::Release(TestEventListener *listener) {\n  for (size_t i = 0; i < listeners_.size(); ++i) {\n    if (listeners_[i] == listener) {\n      listeners_.erase(listeners_.begin() + i);\n      return listener;\n    }\n  }\n\n  return NULL;\n}\n\n// Since most methods are very similar, use macros to reduce boilerplate.\n// This defines a member that forwards the call to all listeners.\n#define GTEST_REPEATER_METHOD_(Name, Type) \\\nvoid TestEventRepeater::Name(const Type& parameter) { \\\n  if (forwarding_enabled_) { \\\n    for (size_t i = 0; i < listeners_.size(); i++) { \\\n      listeners_[i]->Name(parameter); \\\n    } \\\n  } \\\n}\n// This defines a member that forwards the call to all listeners in reverse\n// order.\n#define GTEST_REVERSE_REPEATER_METHOD_(Name, Type) \\\nvoid TestEventRepeater::Name(const Type& parameter) { \\\n  if (forwarding_enabled_) { \\\n    for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) { \\\n      listeners_[i]->Name(parameter); \\\n    } \\\n  } \\\n}\n\nGTEST_REPEATER_METHOD_(OnTestProgramStart, UnitTest)\nGTEST_REPEATER_METHOD_(OnEnvironmentsSetUpStart, UnitTest)\nGTEST_REPEATER_METHOD_(OnTestCaseStart, TestCase)\nGTEST_REPEATER_METHOD_(OnTestStart, TestInfo)\nGTEST_REPEATER_METHOD_(OnTestPartResult, TestPartResult)\nGTEST_REPEATER_METHOD_(OnEnvironmentsTearDownStart, UnitTest)\nGTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsSetUpEnd, UnitTest)\nGTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsTearDownEnd, UnitTest)\nGTEST_REVERSE_REPEATER_METHOD_(OnTestEnd, TestInfo)\nGTEST_REVERSE_REPEATER_METHOD_(OnTestCaseEnd, TestCase)\nGTEST_REVERSE_REPEATER_METHOD_(OnTestProgramEnd, UnitTest)\n\n#undef GTEST_REPEATER_METHOD_\n#undef GTEST_REVERSE_REPEATER_METHOD_\n\nvoid TestEventRepeater::OnTestIterationStart(const UnitTest& unit_test,\n                                             int iteration) {\n  if (forwarding_enabled_) {\n    for (size_t i = 0; i < listeners_.size(); i++) {\n      listeners_[i]->OnTestIterationStart(unit_test, iteration);\n    }\n  }\n}\n\nvoid TestEventRepeater::OnTestIterationEnd(const UnitTest& unit_test,\n                                           int iteration) {\n  if (forwarding_enabled_) {\n    for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) {\n      listeners_[i]->OnTestIterationEnd(unit_test, iteration);\n    }\n  }\n}\n\n// End TestEventRepeater\n\n// This class generates an XML output file.\nclass XmlUnitTestResultPrinter : public EmptyTestEventListener {\n public:\n  explicit XmlUnitTestResultPrinter(const char* output_file);\n\n  virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);\n\n private:\n  // Is c a whitespace character that is normalized to a space character\n  // when it appears in an XML attribute value?\n  static bool IsNormalizableWhitespace(char c) {\n    return c == 0x9 || c == 0xA || c == 0xD;\n  }\n\n  // May c appear in a well-formed XML document?\n  static bool IsValidXmlCharacter(char c) {\n    return IsNormalizableWhitespace(c) || c >= 0x20;\n  }\n\n  // Returns an XML-escaped copy of the input string str.  If\n  // is_attribute is true, the text is meant to appear as an attribute\n  // value, and normalizable whitespace is preserved by replacing it\n  // with character references.\n  static String EscapeXml(const char* str, bool is_attribute);\n\n  // Returns the given string with all characters invalid in XML removed.\n  static string RemoveInvalidXmlCharacters(const string& str);\n\n  // Convenience wrapper around EscapeXml when str is an attribute value.\n  static String EscapeXmlAttribute(const char* str) {\n    return EscapeXml(str, true);\n  }\n\n  // Convenience wrapper around EscapeXml when str is not an attribute value.\n  static String EscapeXmlText(const char* str) { return EscapeXml(str, false); }\n\n  // Streams an XML CDATA section, escaping invalid CDATA sequences as needed.\n  static void OutputXmlCDataSection(::std::ostream* stream, const char* data);\n\n  // Streams an XML representation of a TestInfo object.\n  static void OutputXmlTestInfo(::std::ostream* stream,\n                                const char* test_case_name,\n                                const TestInfo& test_info);\n\n  // Prints an XML representation of a TestCase object\n  static void PrintXmlTestCase(FILE* out, const TestCase& test_case);\n\n  // Prints an XML summary of unit_test to output stream out.\n  static void PrintXmlUnitTest(FILE* out, const UnitTest& unit_test);\n\n  // Produces a string representing the test properties in a result as space\n  // delimited XML attributes based on the property key=\"value\" pairs.\n  // When the String is not empty, it includes a space at the beginning,\n  // to delimit this attribute from prior attributes.\n  static String TestPropertiesAsXmlAttributes(const TestResult& result);\n\n  // The output file.\n  const String output_file_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(XmlUnitTestResultPrinter);\n};\n\n// Creates a new XmlUnitTestResultPrinter.\nXmlUnitTestResultPrinter::XmlUnitTestResultPrinter(const char* output_file)\n    : output_file_(output_file) {\n  if (output_file_.c_str() == NULL || output_file_.empty()) {\n    fprintf(stderr, \"XML output file may not be null\\n\");\n    fflush(stderr);\n    exit(EXIT_FAILURE);\n  }\n}\n\n// Called after the unit test ends.\nvoid XmlUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,\n                                                  int /*iteration*/) {\n  FILE* xmlout = NULL;\n  FilePath output_file(output_file_);\n  FilePath output_dir(output_file.RemoveFileName());\n\n  if (output_dir.CreateDirectoriesRecursively()) {\n    xmlout = posix::FOpen(output_file_.c_str(), \"w\");\n  }\n  if (xmlout == NULL) {\n    // TODO(wan): report the reason of the failure.\n    //\n    // We don't do it for now as:\n    //\n    //   1. There is no urgent need for it.\n    //   2. It's a bit involved to make the errno variable thread-safe on\n    //      all three operating systems (Linux, Windows, and Mac OS).\n    //   3. To interpret the meaning of errno in a thread-safe way,\n    //      we need the strerror_r() function, which is not available on\n    //      Windows.\n    fprintf(stderr,\n            \"Unable to open file \\\"%s\\\"\\n\",\n            output_file_.c_str());\n    fflush(stderr);\n    exit(EXIT_FAILURE);\n  }\n  PrintXmlUnitTest(xmlout, unit_test);\n  fclose(xmlout);\n}\n\n// Returns an XML-escaped copy of the input string str.  If is_attribute\n// is true, the text is meant to appear as an attribute value, and\n// normalizable whitespace is preserved by replacing it with character\n// references.\n//\n// Invalid XML characters in str, if any, are stripped from the output.\n// It is expected that most, if not all, of the text processed by this\n// module will consist of ordinary English text.\n// If this module is ever modified to produce version 1.1 XML output,\n// most invalid characters can be retained using character references.\n// TODO(wan): It might be nice to have a minimally invasive, human-readable\n// escaping scheme for invalid characters, rather than dropping them.\nString XmlUnitTestResultPrinter::EscapeXml(const char* str, bool is_attribute) {\n  Message m;\n\n  if (str != NULL) {\n    for (const char* src = str; *src; ++src) {\n      switch (*src) {\n        case '<':\n          m << \"&lt;\";\n          break;\n        case '>':\n          m << \"&gt;\";\n          break;\n        case '&':\n          m << \"&amp;\";\n          break;\n        case '\\'':\n          if (is_attribute)\n            m << \"&apos;\";\n          else\n            m << '\\'';\n          break;\n        case '\"':\n          if (is_attribute)\n            m << \"&quot;\";\n          else\n            m << '\"';\n          break;\n        default:\n          if (IsValidXmlCharacter(*src)) {\n            if (is_attribute && IsNormalizableWhitespace(*src))\n              m << String::Format(\"&#x%02X;\", unsigned(*src));\n            else\n              m << *src;\n          }\n          break;\n      }\n    }\n  }\n\n  return m.GetString();\n}\n\n// Returns the given string with all characters invalid in XML removed.\n// Currently invalid characters are dropped from the string. An\n// alternative is to replace them with certain characters such as . or ?.\nstring XmlUnitTestResultPrinter::RemoveInvalidXmlCharacters(const string& str) {\n  string output;\n  output.reserve(str.size());\n  for (string::const_iterator it = str.begin(); it != str.end(); ++it)\n    if (IsValidXmlCharacter(*it))\n      output.push_back(*it);\n\n  return output;\n}\n\n// The following routines generate an XML representation of a UnitTest\n// object.\n//\n// This is how Google Test concepts map to the DTD:\n//\n// <testsuites name=\"AllTests\">        <-- corresponds to a UnitTest object\n//   <testsuite name=\"testcase-name\">  <-- corresponds to a TestCase object\n//     <testcase name=\"test-name\">     <-- corresponds to a TestInfo object\n//       <failure message=\"...\">...</failure>\n//       <failure message=\"...\">...</failure>\n//       <failure message=\"...\">...</failure>\n//                                     <-- individual assertion failures\n//     </testcase>\n//   </testsuite>\n// </testsuites>\n\n// Formats the given time in milliseconds as seconds.\nstd::string FormatTimeInMillisAsSeconds(TimeInMillis ms) {\n  ::std::stringstream ss;\n  ss << ms/1000.0;\n  return ss.str();\n}\n\n// Streams an XML CDATA section, escaping invalid CDATA sequences as needed.\nvoid XmlUnitTestResultPrinter::OutputXmlCDataSection(::std::ostream* stream,\n                                                     const char* data) {\n  const char* segment = data;\n  *stream << \"<![CDATA[\";\n  for (;;) {\n    const char* const next_segment = strstr(segment, \"]]>\");\n    if (next_segment != NULL) {\n      stream->write(\n          segment, static_cast<std::streamsize>(next_segment - segment));\n      *stream << \"]]>]]&gt;<![CDATA[\";\n      segment = next_segment + strlen(\"]]>\");\n    } else {\n      *stream << segment;\n      break;\n    }\n  }\n  *stream << \"]]>\";\n}\n\n// Prints an XML representation of a TestInfo object.\n// TODO(wan): There is also value in printing properties with the plain printer.\nvoid XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream,\n                                                 const char* test_case_name,\n                                                 const TestInfo& test_info) {\n  const TestResult& result = *test_info.result();\n  *stream << \"    <testcase name=\\\"\"\n          << EscapeXmlAttribute(test_info.name()).c_str() << \"\\\"\";\n\n  if (test_info.value_param() != NULL) {\n    *stream << \" value_param=\\\"\" << EscapeXmlAttribute(test_info.value_param())\n            << \"\\\"\";\n  }\n  if (test_info.type_param() != NULL) {\n    *stream << \" type_param=\\\"\" << EscapeXmlAttribute(test_info.type_param())\n            << \"\\\"\";\n  }\n\n  *stream << \" status=\\\"\"\n          << (test_info.should_run() ? \"run\" : \"notrun\")\n          << \"\\\" time=\\\"\"\n          << FormatTimeInMillisAsSeconds(result.elapsed_time())\n          << \"\\\" classname=\\\"\" << EscapeXmlAttribute(test_case_name).c_str()\n          << \"\\\"\" << TestPropertiesAsXmlAttributes(result).c_str();\n\n  int failures = 0;\n  for (int i = 0; i < result.total_part_count(); ++i) {\n    const TestPartResult& part = result.GetTestPartResult(i);\n    if (part.failed()) {\n      if (++failures == 1)\n        *stream << \">\\n\";\n      *stream << \"      <failure message=\\\"\"\n              << EscapeXmlAttribute(part.summary()).c_str()\n              << \"\\\" type=\\\"\\\">\";\n      const string location = internal::FormatCompilerIndependentFileLocation(\n          part.file_name(), part.line_number());\n      const string message = location + \"\\n\" + part.message();\n      OutputXmlCDataSection(stream,\n                            RemoveInvalidXmlCharacters(message).c_str());\n      *stream << \"</failure>\\n\";\n    }\n  }\n\n  if (failures == 0)\n    *stream << \" />\\n\";\n  else\n    *stream << \"    </testcase>\\n\";\n}\n\n// Prints an XML representation of a TestCase object\nvoid XmlUnitTestResultPrinter::PrintXmlTestCase(FILE* out,\n                                                const TestCase& test_case) {\n  fprintf(out,\n          \"  <testsuite name=\\\"%s\\\" tests=\\\"%d\\\" failures=\\\"%d\\\" \"\n          \"disabled=\\\"%d\\\" \",\n          EscapeXmlAttribute(test_case.name()).c_str(),\n          test_case.total_test_count(),\n          test_case.failed_test_count(),\n          test_case.disabled_test_count());\n  fprintf(out,\n          \"errors=\\\"0\\\" time=\\\"%s\\\">\\n\",\n          FormatTimeInMillisAsSeconds(test_case.elapsed_time()).c_str());\n  for (int i = 0; i < test_case.total_test_count(); ++i) {\n    ::std::stringstream stream;\n    OutputXmlTestInfo(&stream, test_case.name(), *test_case.GetTestInfo(i));\n    fprintf(out, \"%s\", StringStreamToString(&stream).c_str());\n  }\n  fprintf(out, \"  </testsuite>\\n\");\n}\n\n// Prints an XML summary of unit_test to output stream out.\nvoid XmlUnitTestResultPrinter::PrintXmlUnitTest(FILE* out,\n                                                const UnitTest& unit_test) {\n  fprintf(out, \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n\");\n  fprintf(out,\n          \"<testsuites tests=\\\"%d\\\" failures=\\\"%d\\\" disabled=\\\"%d\\\" \"\n          \"errors=\\\"0\\\" time=\\\"%s\\\" \",\n          unit_test.total_test_count(),\n          unit_test.failed_test_count(),\n          unit_test.disabled_test_count(),\n          FormatTimeInMillisAsSeconds(unit_test.elapsed_time()).c_str());\n  if (GTEST_FLAG(shuffle)) {\n    fprintf(out, \"random_seed=\\\"%d\\\" \", unit_test.random_seed());\n  }\n  fprintf(out, \"name=\\\"AllTests\\\">\\n\");\n  for (int i = 0; i < unit_test.total_test_case_count(); ++i)\n    PrintXmlTestCase(out, *unit_test.GetTestCase(i));\n  fprintf(out, \"</testsuites>\\n\");\n}\n\n// Produces a string representing the test properties in a result as space\n// delimited XML attributes based on the property key=\"value\" pairs.\nString XmlUnitTestResultPrinter::TestPropertiesAsXmlAttributes(\n    const TestResult& result) {\n  Message attributes;\n  for (int i = 0; i < result.test_property_count(); ++i) {\n    const TestProperty& property = result.GetTestProperty(i);\n    attributes << \" \" << property.key() << \"=\"\n        << \"\\\"\" << EscapeXmlAttribute(property.value()) << \"\\\"\";\n  }\n  return attributes.GetString();\n}\n\n// End XmlUnitTestResultPrinter\n\n#if GTEST_CAN_STREAM_RESULTS_\n\n// Streams test results to the given port on the given host machine.\nclass StreamingListener : public EmptyTestEventListener {\n public:\n  // Escapes '=', '&', '%', and '\\n' characters in str as \"%xx\".\n  static string UrlEncode(const char* str);\n\n  StreamingListener(const string& host, const string& port)\n      : sockfd_(-1), host_name_(host), port_num_(port) {\n    MakeConnection();\n    Send(\"gtest_streaming_protocol_version=1.0\\n\");\n  }\n\n  virtual ~StreamingListener() {\n    if (sockfd_ != -1)\n      CloseConnection();\n  }\n\n  void OnTestProgramStart(const UnitTest& /* unit_test */) {\n    Send(\"event=TestProgramStart\\n\");\n  }\n\n  void OnTestProgramEnd(const UnitTest& unit_test) {\n    // Note that Google Test current only report elapsed time for each\n    // test iteration, not for the entire test program.\n    Send(String::Format(\"event=TestProgramEnd&passed=%d\\n\",\n                        unit_test.Passed()));\n\n    // Notify the streaming server to stop.\n    CloseConnection();\n  }\n\n  void OnTestIterationStart(const UnitTest& /* unit_test */, int iteration) {\n    Send(String::Format(\"event=TestIterationStart&iteration=%d\\n\",\n                        iteration));\n  }\n\n  void OnTestIterationEnd(const UnitTest& unit_test, int /* iteration */) {\n    Send(String::Format(\"event=TestIterationEnd&passed=%d&elapsed_time=%sms\\n\",\n                        unit_test.Passed(),\n                        StreamableToString(unit_test.elapsed_time()).c_str()));\n  }\n\n  void OnTestCaseStart(const TestCase& test_case) {\n    Send(String::Format(\"event=TestCaseStart&name=%s\\n\", test_case.name()));\n  }\n\n  void OnTestCaseEnd(const TestCase& test_case) {\n    Send(String::Format(\"event=TestCaseEnd&passed=%d&elapsed_time=%sms\\n\",\n                        test_case.Passed(),\n                        StreamableToString(test_case.elapsed_time()).c_str()));\n  }\n\n  void OnTestStart(const TestInfo& test_info) {\n    Send(String::Format(\"event=TestStart&name=%s\\n\", test_info.name()));\n  }\n\n  void OnTestEnd(const TestInfo& test_info) {\n    Send(String::Format(\n        \"event=TestEnd&passed=%d&elapsed_time=%sms\\n\",\n        (test_info.result())->Passed(),\n        StreamableToString((test_info.result())->elapsed_time()).c_str()));\n  }\n\n  void OnTestPartResult(const TestPartResult& test_part_result) {\n    const char* file_name = test_part_result.file_name();\n    if (file_name == NULL)\n      file_name = \"\";\n    Send(String::Format(\"event=TestPartResult&file=%s&line=%d&message=\",\n                        UrlEncode(file_name).c_str(),\n                        test_part_result.line_number()));\n    Send(UrlEncode(test_part_result.message()) + \"\\n\");\n  }\n\n private:\n  // Creates a client socket and connects to the server.\n  void MakeConnection();\n\n  // Closes the socket.\n  void CloseConnection() {\n    GTEST_CHECK_(sockfd_ != -1)\n        << \"CloseConnection() can be called only when there is a connection.\";\n\n    close(sockfd_);\n    sockfd_ = -1;\n  }\n\n  // Sends a string to the socket.\n  void Send(const string& message) {\n    GTEST_CHECK_(sockfd_ != -1)\n        << \"Send() can be called only when there is a connection.\";\n\n    const int len = static_cast<int>(message.length());\n    if (write(sockfd_, message.c_str(), len) != len) {\n      GTEST_LOG_(WARNING)\n          << \"stream_result_to: failed to stream to \"\n          << host_name_ << \":\" << port_num_;\n    }\n  }\n\n  int sockfd_;   // socket file descriptor\n  const string host_name_;\n  const string port_num_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamingListener);\n};  // class StreamingListener\n\n// Checks if str contains '=', '&', '%' or '\\n' characters. If yes,\n// replaces them by \"%xx\" where xx is their hexadecimal value. For\n// example, replaces \"=\" with \"%3D\".  This algorithm is O(strlen(str))\n// in both time and space -- important as the input str may contain an\n// arbitrarily long test failure message and stack trace.\nstring StreamingListener::UrlEncode(const char* str) {\n  string result;\n  result.reserve(strlen(str) + 1);\n  for (char ch = *str; ch != '\\0'; ch = *++str) {\n    switch (ch) {\n      case '%':\n      case '=':\n      case '&':\n      case '\\n':\n        result.append(String::Format(\"%%%02x\", static_cast<unsigned char>(ch)));\n        break;\n      default:\n        result.push_back(ch);\n        break;\n    }\n  }\n  return result;\n}\n\nvoid StreamingListener::MakeConnection() {\n  GTEST_CHECK_(sockfd_ == -1)\n      << \"MakeConnection() can't be called when there is already a connection.\";\n\n  addrinfo hints;\n  memset(&hints, 0, sizeof(hints));\n  hints.ai_family = AF_UNSPEC;    // To allow both IPv4 and IPv6 addresses.\n  hints.ai_socktype = SOCK_STREAM;\n  addrinfo* servinfo = NULL;\n\n  // Use the getaddrinfo() to get a linked list of IP addresses for\n  // the given host name.\n  const int error_num = getaddrinfo(\n      host_name_.c_str(), port_num_.c_str(), &hints, &servinfo);\n  if (error_num != 0) {\n    GTEST_LOG_(WARNING) << \"stream_result_to: getaddrinfo() failed: \"\n                        << gai_strerror(error_num);\n  }\n\n  // Loop through all the results and connect to the first we can.\n  for (addrinfo* cur_addr = servinfo; sockfd_ == -1 && cur_addr != NULL;\n       cur_addr = cur_addr->ai_next) {\n    sockfd_ = socket(\n        cur_addr->ai_family, cur_addr->ai_socktype, cur_addr->ai_protocol);\n    if (sockfd_ != -1) {\n      // Connect the client socket to the server socket.\n      if (connect(sockfd_, cur_addr->ai_addr, cur_addr->ai_addrlen) == -1) {\n        close(sockfd_);\n        sockfd_ = -1;\n      }\n    }\n  }\n\n  freeaddrinfo(servinfo);  // all done with this structure\n\n  if (sockfd_ == -1) {\n    GTEST_LOG_(WARNING) << \"stream_result_to: failed to connect to \"\n                        << host_name_ << \":\" << port_num_;\n  }\n}\n\n// End of class Streaming Listener\n#endif  // GTEST_CAN_STREAM_RESULTS__\n\n// Class ScopedTrace\n\n// Pushes the given source file location and message onto a per-thread\n// trace stack maintained by Google Test.\n// L < UnitTest::mutex_\nScopedTrace::ScopedTrace(const char* file, int line, const Message& message) {\n  TraceInfo trace;\n  trace.file = file;\n  trace.line = line;\n  trace.message = message.GetString();\n\n  UnitTest::GetInstance()->PushGTestTrace(trace);\n}\n\n// Pops the info pushed by the c'tor.\n// L < UnitTest::mutex_\nScopedTrace::~ScopedTrace() {\n  UnitTest::GetInstance()->PopGTestTrace();\n}\n\n\n// class OsStackTraceGetter\n\n// Returns the current OS stack trace as a String.  Parameters:\n//\n//   max_depth  - the maximum number of stack frames to be included\n//                in the trace.\n//   skip_count - the number of top frames to be skipped; doesn't count\n//                against max_depth.\n//\n// L < mutex_\n// We use \"L < mutex_\" to denote that the function may acquire mutex_.\nString OsStackTraceGetter::CurrentStackTrace(int, int) {\n  return String(\"\");\n}\n\n// L < mutex_\nvoid OsStackTraceGetter::UponLeavingGTest() {\n}\n\nconst char* const\nOsStackTraceGetter::kElidedFramesMarker =\n    \"... \" GTEST_NAME_ \" internal frames ...\";\n\n}  // namespace internal\n\n// class TestEventListeners\n\nTestEventListeners::TestEventListeners()\n    : repeater_(new internal::TestEventRepeater()),\n      default_result_printer_(NULL),\n      default_xml_generator_(NULL) {\n}\n\nTestEventListeners::~TestEventListeners() { delete repeater_; }\n\n// Returns the standard listener responsible for the default console\n// output.  Can be removed from the listeners list to shut down default\n// console output.  Note that removing this object from the listener list\n// with Release transfers its ownership to the user.\nvoid TestEventListeners::Append(TestEventListener* listener) {\n  repeater_->Append(listener);\n}\n\n// Removes the given event listener from the list and returns it.  It then\n// becomes the caller's responsibility to delete the listener. Returns\n// NULL if the listener is not found in the list.\nTestEventListener* TestEventListeners::Release(TestEventListener* listener) {\n  if (listener == default_result_printer_)\n    default_result_printer_ = NULL;\n  else if (listener == default_xml_generator_)\n    default_xml_generator_ = NULL;\n  return repeater_->Release(listener);\n}\n\n// Returns repeater that broadcasts the TestEventListener events to all\n// subscribers.\nTestEventListener* TestEventListeners::repeater() { return repeater_; }\n\n// Sets the default_result_printer attribute to the provided listener.\n// The listener is also added to the listener list and previous\n// default_result_printer is removed from it and deleted. The listener can\n// also be NULL in which case it will not be added to the list. Does\n// nothing if the previous and the current listener objects are the same.\nvoid TestEventListeners::SetDefaultResultPrinter(TestEventListener* listener) {\n  if (default_result_printer_ != listener) {\n    // It is an error to pass this method a listener that is already in the\n    // list.\n    delete Release(default_result_printer_);\n    default_result_printer_ = listener;\n    if (listener != NULL)\n      Append(listener);\n  }\n}\n\n// Sets the default_xml_generator attribute to the provided listener.  The\n// listener is also added to the listener list and previous\n// default_xml_generator is removed from it and deleted. The listener can\n// also be NULL in which case it will not be added to the list. Does\n// nothing if the previous and the current listener objects are the same.\nvoid TestEventListeners::SetDefaultXmlGenerator(TestEventListener* listener) {\n  if (default_xml_generator_ != listener) {\n    // It is an error to pass this method a listener that is already in the\n    // list.\n    delete Release(default_xml_generator_);\n    default_xml_generator_ = listener;\n    if (listener != NULL)\n      Append(listener);\n  }\n}\n\n// Controls whether events will be forwarded by the repeater to the\n// listeners in the list.\nbool TestEventListeners::EventForwardingEnabled() const {\n  return repeater_->forwarding_enabled();\n}\n\nvoid TestEventListeners::SuppressEventForwarding() {\n  repeater_->set_forwarding_enabled(false);\n}\n\n// class UnitTest\n\n// Gets the singleton UnitTest object.  The first time this method is\n// called, a UnitTest object is constructed and returned.  Consecutive\n// calls will return the same object.\n//\n// We don't protect this under mutex_ as a user is not supposed to\n// call this before main() starts, from which point on the return\n// value will never change.\nUnitTest * UnitTest::GetInstance() {\n  // When compiled with MSVC 7.1 in optimized mode, destroying the\n  // UnitTest object upon exiting the program messes up the exit code,\n  // causing successful tests to appear failed.  We have to use a\n  // different implementation in this case to bypass the compiler bug.\n  // This implementation makes the compiler happy, at the cost of\n  // leaking the UnitTest object.\n\n  // CodeGear C++Builder insists on a public destructor for the\n  // default implementation.  Use this implementation to keep good OO\n  // design with private destructor.\n\n#if (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__)\n  static UnitTest* const instance = new UnitTest;\n  return instance;\n#else\n  static UnitTest instance;\n  return &instance;\n#endif  // (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__)\n}\n\n// Gets the number of successful test cases.\nint UnitTest::successful_test_case_count() const {\n  return impl()->successful_test_case_count();\n}\n\n// Gets the number of failed test cases.\nint UnitTest::failed_test_case_count() const {\n  return impl()->failed_test_case_count();\n}\n\n// Gets the number of all test cases.\nint UnitTest::total_test_case_count() const {\n  return impl()->total_test_case_count();\n}\n\n// Gets the number of all test cases that contain at least one test\n// that should run.\nint UnitTest::test_case_to_run_count() const {\n  return impl()->test_case_to_run_count();\n}\n\n// Gets the number of successful tests.\nint UnitTest::successful_test_count() const {\n  return impl()->successful_test_count();\n}\n\n// Gets the number of failed tests.\nint UnitTest::failed_test_count() const { return impl()->failed_test_count(); }\n\n// Gets the number of disabled tests.\nint UnitTest::disabled_test_count() const {\n  return impl()->disabled_test_count();\n}\n\n// Gets the number of all tests.\nint UnitTest::total_test_count() const { return impl()->total_test_count(); }\n\n// Gets the number of tests that should run.\nint UnitTest::test_to_run_count() const { return impl()->test_to_run_count(); }\n\n// Gets the elapsed time, in milliseconds.\ninternal::TimeInMillis UnitTest::elapsed_time() const {\n  return impl()->elapsed_time();\n}\n\n// Returns true iff the unit test passed (i.e. all test cases passed).\nbool UnitTest::Passed() const { return impl()->Passed(); }\n\n// Returns true iff the unit test failed (i.e. some test case failed\n// or something outside of all tests failed).\nbool UnitTest::Failed() const { return impl()->Failed(); }\n\n// Gets the i-th test case among all the test cases. i can range from 0 to\n// total_test_case_count() - 1. If i is not in that range, returns NULL.\nconst TestCase* UnitTest::GetTestCase(int i) const {\n  return impl()->GetTestCase(i);\n}\n\n// Gets the i-th test case among all the test cases. i can range from 0 to\n// total_test_case_count() - 1. If i is not in that range, returns NULL.\nTestCase* UnitTest::GetMutableTestCase(int i) {\n  return impl()->GetMutableTestCase(i);\n}\n\n// Returns the list of event listeners that can be used to track events\n// inside Google Test.\nTestEventListeners& UnitTest::listeners() {\n  return *impl()->listeners();\n}\n\n// Registers and returns a global test environment.  When a test\n// program is run, all global test environments will be set-up in the\n// order they were registered.  After all tests in the program have\n// finished, all global test environments will be torn-down in the\n// *reverse* order they were registered.\n//\n// The UnitTest object takes ownership of the given environment.\n//\n// We don't protect this under mutex_, as we only support calling it\n// from the main thread.\nEnvironment* UnitTest::AddEnvironment(Environment* env) {\n  if (env == NULL) {\n    return NULL;\n  }\n\n  impl_->environments().push_back(env);\n  return env;\n}\n\n// Adds a TestPartResult to the current TestResult object.  All Google Test\n// assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc) eventually call\n// this to report their results.  The user code should use the\n// assertion macros instead of calling this directly.\n// L < mutex_\nvoid UnitTest::AddTestPartResult(TestPartResult::Type result_type,\n                                 const char* file_name,\n                                 int line_number,\n                                 const internal::String& message,\n                                 const internal::String& os_stack_trace) {\n  Message msg;\n  msg << message;\n\n  internal::MutexLock lock(&mutex_);\n  if (impl_->gtest_trace_stack().size() > 0) {\n    msg << \"\\n\" << GTEST_NAME_ << \" trace:\";\n\n    for (int i = static_cast<int>(impl_->gtest_trace_stack().size());\n         i > 0; --i) {\n      const internal::TraceInfo& trace = impl_->gtest_trace_stack()[i - 1];\n      msg << \"\\n\" << internal::FormatFileLocation(trace.file, trace.line)\n          << \" \" << trace.message;\n    }\n  }\n\n  if (os_stack_trace.c_str() != NULL && !os_stack_trace.empty()) {\n    msg << internal::kStackTraceMarker << os_stack_trace;\n  }\n\n  const TestPartResult result =\n    TestPartResult(result_type, file_name, line_number,\n                   msg.GetString().c_str());\n  impl_->GetTestPartResultReporterForCurrentThread()->\n      ReportTestPartResult(result);\n\n  if (result_type != TestPartResult::kSuccess) {\n    // gtest_break_on_failure takes precedence over\n    // gtest_throw_on_failure.  This allows a user to set the latter\n    // in the code (perhaps in order to use Google Test assertions\n    // with another testing framework) and specify the former on the\n    // command line for debugging.\n    if (GTEST_FLAG(break_on_failure)) {\n#if GTEST_OS_WINDOWS\n      // Using DebugBreak on Windows allows gtest to still break into a debugger\n      // when a failure happens and both the --gtest_break_on_failure and\n      // the --gtest_catch_exceptions flags are specified.\n      DebugBreak();\n#else\n      // Dereference NULL through a volatile pointer to prevent the compiler\n      // from removing. We use this rather than abort() or __builtin_trap() for\n      // portability: Symbian doesn't implement abort() well, and some debuggers\n      // don't correctly trap abort().\n      *static_cast<volatile int*>(NULL) = 1;\n#endif  // GTEST_OS_WINDOWS\n    } else if (GTEST_FLAG(throw_on_failure)) {\n#if GTEST_HAS_EXCEPTIONS\n      throw GoogleTestFailureException(result);\n#else\n      // We cannot call abort() as it generates a pop-up in debug mode\n      // that cannot be suppressed in VC 7.1 or below.\n      exit(1);\n#endif\n    }\n  }\n}\n\n// Creates and adds a property to the current TestResult. If a property matching\n// the supplied value already exists, updates its value instead.\nvoid UnitTest::RecordPropertyForCurrentTest(const char* key,\n                                            const char* value) {\n  const TestProperty test_property(key, value);\n  impl_->current_test_result()->RecordProperty(test_property);\n}\n\n// Runs all tests in this UnitTest object and prints the result.\n// Returns 0 if successful, or 1 otherwise.\n//\n// We don't protect this under mutex_, as we only support calling it\n// from the main thread.\nint UnitTest::Run() {\n  // Captures the value of GTEST_FLAG(catch_exceptions).  This value will be\n  // used for the duration of the program.\n  impl()->set_catch_exceptions(GTEST_FLAG(catch_exceptions));\n\n#if GTEST_HAS_SEH\n  const bool in_death_test_child_process =\n      internal::GTEST_FLAG(internal_run_death_test).length() > 0;\n\n  // Either the user wants Google Test to catch exceptions thrown by the\n  // tests or this is executing in the context of death test child\n  // process. In either case the user does not want to see pop-up dialogs\n  // about crashes - they are expected.\n  if (impl()->catch_exceptions() || in_death_test_child_process) {\n\n# if !GTEST_OS_WINDOWS_MOBILE\n    // SetErrorMode doesn't exist on CE.\n    SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT |\n                 SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);\n# endif  // !GTEST_OS_WINDOWS_MOBILE\n\n# if (defined(_MSC_VER) || GTEST_OS_WINDOWS_MINGW) && !GTEST_OS_WINDOWS_MOBILE\n    // Death test children can be terminated with _abort().  On Windows,\n    // _abort() can show a dialog with a warning message.  This forces the\n    // abort message to go to stderr instead.\n    _set_error_mode(_OUT_TO_STDERR);\n# endif\n\n# if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE\n    // In the debug version, Visual Studio pops up a separate dialog\n    // offering a choice to debug the aborted program. We need to suppress\n    // this dialog or it will pop up for every EXPECT/ASSERT_DEATH statement\n    // executed. Google Test will notify the user of any unexpected\n    // failure via stderr.\n    //\n    // VC++ doesn't define _set_abort_behavior() prior to the version 8.0.\n    // Users of prior VC versions shall suffer the agony and pain of\n    // clicking through the countless debug dialogs.\n    // TODO(vladl@google.com): find a way to suppress the abort dialog() in the\n    // debug mode when compiled with VC 7.1 or lower.\n    if (!GTEST_FLAG(break_on_failure))\n      _set_abort_behavior(\n          0x0,                                    // Clear the following flags:\n          _WRITE_ABORT_MSG | _CALL_REPORTFAULT);  // pop-up window, core dump.\n# endif\n\n  }\n#endif  // GTEST_HAS_SEH\n\n  return internal::HandleExceptionsInMethodIfSupported(\n      impl(),\n      &internal::UnitTestImpl::RunAllTests,\n      \"auxiliary test code (environments or event listeners)\") ? 0 : 1;\n}\n\n// Returns the working directory when the first TEST() or TEST_F() was\n// executed.\nconst char* UnitTest::original_working_dir() const {\n  return impl_->original_working_dir_.c_str();\n}\n\n// Returns the TestCase object for the test that's currently running,\n// or NULL if no test is running.\n// L < mutex_\nconst TestCase* UnitTest::current_test_case() const {\n  internal::MutexLock lock(&mutex_);\n  return impl_->current_test_case();\n}\n\n// Returns the TestInfo object for the test that's currently running,\n// or NULL if no test is running.\n// L < mutex_\nconst TestInfo* UnitTest::current_test_info() const {\n  internal::MutexLock lock(&mutex_);\n  return impl_->current_test_info();\n}\n\n// Returns the random seed used at the start of the current test run.\nint UnitTest::random_seed() const { return impl_->random_seed(); }\n\n#if GTEST_HAS_PARAM_TEST\n// Returns ParameterizedTestCaseRegistry object used to keep track of\n// value-parameterized tests and instantiate and register them.\n// L < mutex_\ninternal::ParameterizedTestCaseRegistry&\n    UnitTest::parameterized_test_registry() {\n  return impl_->parameterized_test_registry();\n}\n#endif  // GTEST_HAS_PARAM_TEST\n\n// Creates an empty UnitTest.\nUnitTest::UnitTest() {\n  impl_ = new internal::UnitTestImpl(this);\n}\n\n// Destructor of UnitTest.\nUnitTest::~UnitTest() {\n  delete impl_;\n}\n\n// Pushes a trace defined by SCOPED_TRACE() on to the per-thread\n// Google Test trace stack.\n// L < mutex_\nvoid UnitTest::PushGTestTrace(const internal::TraceInfo& trace) {\n  internal::MutexLock lock(&mutex_);\n  impl_->gtest_trace_stack().push_back(trace);\n}\n\n// Pops a trace from the per-thread Google Test trace stack.\n// L < mutex_\nvoid UnitTest::PopGTestTrace() {\n  internal::MutexLock lock(&mutex_);\n  impl_->gtest_trace_stack().pop_back();\n}\n\nnamespace internal {\n\nUnitTestImpl::UnitTestImpl(UnitTest* parent)\n    : parent_(parent),\n#ifdef _MSC_VER\n# pragma warning(push)                    // Saves the current warning state.\n# pragma warning(disable:4355)            // Temporarily disables warning 4355\n                                         // (using this in initializer).\n      default_global_test_part_result_reporter_(this),\n      default_per_thread_test_part_result_reporter_(this),\n# pragma warning(pop)                     // Restores the warning state again.\n#else\n      default_global_test_part_result_reporter_(this),\n      default_per_thread_test_part_result_reporter_(this),\n#endif  // _MSC_VER\n      global_test_part_result_repoter_(\n          &default_global_test_part_result_reporter_),\n      per_thread_test_part_result_reporter_(\n          &default_per_thread_test_part_result_reporter_),\n#if GTEST_HAS_PARAM_TEST\n      parameterized_test_registry_(),\n      parameterized_tests_registered_(false),\n#endif  // GTEST_HAS_PARAM_TEST\n      last_death_test_case_(-1),\n      current_test_case_(NULL),\n      current_test_info_(NULL),\n      ad_hoc_test_result_(),\n      os_stack_trace_getter_(NULL),\n      post_flag_parse_init_performed_(false),\n      random_seed_(0),  // Will be overridden by the flag before first use.\n      random_(0),  // Will be reseeded before first use.\n      elapsed_time_(0),\n#if GTEST_HAS_DEATH_TEST\n      internal_run_death_test_flag_(NULL),\n      death_test_factory_(new DefaultDeathTestFactory),\n#endif\n      // Will be overridden by the flag before first use.\n      catch_exceptions_(false) {\n  listeners()->SetDefaultResultPrinter(new PrettyUnitTestResultPrinter);\n}\n\nUnitTestImpl::~UnitTestImpl() {\n  // Deletes every TestCase.\n  ForEach(test_cases_, internal::Delete<TestCase>);\n\n  // Deletes every Environment.\n  ForEach(environments_, internal::Delete<Environment>);\n\n  delete os_stack_trace_getter_;\n}\n\n#if GTEST_HAS_DEATH_TEST\n// Disables event forwarding if the control is currently in a death test\n// subprocess. Must not be called before InitGoogleTest.\nvoid UnitTestImpl::SuppressTestEventsIfInSubprocess() {\n  if (internal_run_death_test_flag_.get() != NULL)\n    listeners()->SuppressEventForwarding();\n}\n#endif  // GTEST_HAS_DEATH_TEST\n\n// Initializes event listeners performing XML output as specified by\n// UnitTestOptions. Must not be called before InitGoogleTest.\nvoid UnitTestImpl::ConfigureXmlOutput() {\n  const String& output_format = UnitTestOptions::GetOutputFormat();\n  if (output_format == \"xml\") {\n    listeners()->SetDefaultXmlGenerator(new XmlUnitTestResultPrinter(\n        UnitTestOptions::GetAbsolutePathToOutputFile().c_str()));\n  } else if (output_format != \"\") {\n    printf(\"WARNING: unrecognized output format \\\"%s\\\" ignored.\\n\",\n           output_format.c_str());\n    fflush(stdout);\n  }\n}\n\n#if GTEST_CAN_STREAM_RESULTS_\n// Initializes event listeners for streaming test results in String form.\n// Must not be called before InitGoogleTest.\nvoid UnitTestImpl::ConfigureStreamingOutput() {\n  const string& target = GTEST_FLAG(stream_result_to);\n  if (!target.empty()) {\n    const size_t pos = target.find(':');\n    if (pos != string::npos) {\n      listeners()->Append(new StreamingListener(target.substr(0, pos),\n                                                target.substr(pos+1)));\n    } else {\n      printf(\"WARNING: unrecognized streaming target \\\"%s\\\" ignored.\\n\",\n             target.c_str());\n      fflush(stdout);\n    }\n  }\n}\n#endif  // GTEST_CAN_STREAM_RESULTS_\n\n// Performs initialization dependent upon flag values obtained in\n// ParseGoogleTestFlagsOnly.  Is called from InitGoogleTest after the call to\n// ParseGoogleTestFlagsOnly.  In case a user neglects to call InitGoogleTest\n// this function is also called from RunAllTests.  Since this function can be\n// called more than once, it has to be idempotent.\nvoid UnitTestImpl::PostFlagParsingInit() {\n  // Ensures that this function does not execute more than once.\n  if (!post_flag_parse_init_performed_) {\n    post_flag_parse_init_performed_ = true;\n\n#if GTEST_HAS_DEATH_TEST\n    InitDeathTestSubprocessControlInfo();\n    SuppressTestEventsIfInSubprocess();\n#endif  // GTEST_HAS_DEATH_TEST\n\n    // Registers parameterized tests. This makes parameterized tests\n    // available to the UnitTest reflection API without running\n    // RUN_ALL_TESTS.\n    RegisterParameterizedTests();\n\n    // Configures listeners for XML output. This makes it possible for users\n    // to shut down the default XML output before invoking RUN_ALL_TESTS.\n    ConfigureXmlOutput();\n\n#if GTEST_CAN_STREAM_RESULTS_\n    // Configures listeners for streaming test results to the specified server.\n    ConfigureStreamingOutput();\n#endif  // GTEST_CAN_STREAM_RESULTS_\n  }\n}\n\n// A predicate that checks the name of a TestCase against a known\n// value.\n//\n// This is used for implementation of the UnitTest class only.  We put\n// it in the anonymous namespace to prevent polluting the outer\n// namespace.\n//\n// TestCaseNameIs is copyable.\nclass TestCaseNameIs {\n public:\n  // Constructor.\n  explicit TestCaseNameIs(const String& name)\n      : name_(name) {}\n\n  // Returns true iff the name of test_case matches name_.\n  bool operator()(const TestCase* test_case) const {\n    return test_case != NULL && strcmp(test_case->name(), name_.c_str()) == 0;\n  }\n\n private:\n  String name_;\n};\n\n// Finds and returns a TestCase with the given name.  If one doesn't\n// exist, creates one and returns it.  It's the CALLER'S\n// RESPONSIBILITY to ensure that this function is only called WHEN THE\n// TESTS ARE NOT SHUFFLED.\n//\n// Arguments:\n//\n//   test_case_name: name of the test case\n//   type_param:     the name of the test case's type parameter, or NULL if\n//                   this is not a typed or a type-parameterized test case.\n//   set_up_tc:      pointer to the function that sets up the test case\n//   tear_down_tc:   pointer to the function that tears down the test case\nTestCase* UnitTestImpl::GetTestCase(const char* test_case_name,\n                                    const char* type_param,\n                                    Test::SetUpTestCaseFunc set_up_tc,\n                                    Test::TearDownTestCaseFunc tear_down_tc) {\n  // Can we find a TestCase with the given name?\n  const std::vector<TestCase*>::const_iterator test_case =\n      std::find_if(test_cases_.begin(), test_cases_.end(),\n                   TestCaseNameIs(test_case_name));\n\n  if (test_case != test_cases_.end())\n    return *test_case;\n\n  // No.  Let's create one.\n  TestCase* const new_test_case =\n      new TestCase(test_case_name, type_param, set_up_tc, tear_down_tc);\n\n  // Is this a death test case?\n  if (internal::UnitTestOptions::MatchesFilter(String(test_case_name),\n                                               kDeathTestCaseFilter)) {\n    // Yes.  Inserts the test case after the last death test case\n    // defined so far.  This only works when the test cases haven't\n    // been shuffled.  Otherwise we may end up running a death test\n    // after a non-death test.\n    ++last_death_test_case_;\n    test_cases_.insert(test_cases_.begin() + last_death_test_case_,\n                       new_test_case);\n  } else {\n    // No.  Appends to the end of the list.\n    test_cases_.push_back(new_test_case);\n  }\n\n  test_case_indices_.push_back(static_cast<int>(test_case_indices_.size()));\n  return new_test_case;\n}\n\n// Helpers for setting up / tearing down the given environment.  They\n// are for use in the ForEach() function.\nstatic void SetUpEnvironment(Environment* env) { env->SetUp(); }\nstatic void TearDownEnvironment(Environment* env) { env->TearDown(); }\n\n// Runs all tests in this UnitTest object, prints the result, and\n// returns true if all tests are successful.  If any exception is\n// thrown during a test, the test is considered to be failed, but the\n// rest of the tests will still be run.\n//\n// When parameterized tests are enabled, it expands and registers\n// parameterized tests first in RegisterParameterizedTests().\n// All other functions called from RunAllTests() may safely assume that\n// parameterized tests are ready to be counted and run.\nbool UnitTestImpl::RunAllTests() {\n  // Makes sure InitGoogleTest() was called.\n  if (!GTestIsInitialized()) {\n    printf(\"%s\",\n           \"\\nThis test program did NOT call ::testing::InitGoogleTest \"\n           \"before calling RUN_ALL_TESTS().  Please fix it.\\n\");\n    return false;\n  }\n\n  // Do not run any test if the --help flag was specified.\n  if (g_help_flag)\n    return true;\n\n  // Repeats the call to the post-flag parsing initialization in case the\n  // user didn't call InitGoogleTest.\n  PostFlagParsingInit();\n\n  // Even if sharding is not on, test runners may want to use the\n  // GTEST_SHARD_STATUS_FILE to query whether the test supports the sharding\n  // protocol.\n  internal::WriteToShardStatusFileIfNeeded();\n\n  // True iff we are in a subprocess for running a thread-safe-style\n  // death test.\n  bool in_subprocess_for_death_test = false;\n\n#if GTEST_HAS_DEATH_TEST\n  in_subprocess_for_death_test = (internal_run_death_test_flag_.get() != NULL);\n#endif  // GTEST_HAS_DEATH_TEST\n\n  const bool should_shard = ShouldShard(kTestTotalShards, kTestShardIndex,\n                                        in_subprocess_for_death_test);\n\n  // Compares the full test names with the filter to decide which\n  // tests to run.\n  const bool has_tests_to_run = FilterTests(should_shard\n                                              ? HONOR_SHARDING_PROTOCOL\n                                              : IGNORE_SHARDING_PROTOCOL) > 0;\n\n  // Lists the tests and exits if the --gtest_list_tests flag was specified.\n  if (GTEST_FLAG(list_tests)) {\n    // This must be called *after* FilterTests() has been called.\n    ListTestsMatchingFilter();\n    return true;\n  }\n\n  random_seed_ = GTEST_FLAG(shuffle) ?\n      GetRandomSeedFromFlag(GTEST_FLAG(random_seed)) : 0;\n\n  // True iff at least one test has failed.\n  bool failed = false;\n\n  TestEventListener* repeater = listeners()->repeater();\n\n  repeater->OnTestProgramStart(*parent_);\n\n  // How many times to repeat the tests?  We don't want to repeat them\n  // when we are inside the subprocess of a death test.\n  const int repeat = in_subprocess_for_death_test ? 1 : GTEST_FLAG(repeat);\n  // Repeats forever if the repeat count is negative.\n  const bool forever = repeat < 0;\n  for (int i = 0; forever || i != repeat; i++) {\n    // We want to preserve failures generated by ad-hoc test\n    // assertions executed before RUN_ALL_TESTS().\n    ClearNonAdHocTestResult();\n\n    const TimeInMillis start = GetTimeInMillis();\n\n    // Shuffles test cases and tests if requested.\n    if (has_tests_to_run && GTEST_FLAG(shuffle)) {\n      random()->Reseed(random_seed_);\n      // This should be done before calling OnTestIterationStart(),\n      // such that a test event listener can see the actual test order\n      // in the event.\n      ShuffleTests();\n    }\n\n    // Tells the unit test event listeners that the tests are about to start.\n    repeater->OnTestIterationStart(*parent_, i);\n\n    // Runs each test case if there is at least one test to run.\n    if (has_tests_to_run) {\n      // Sets up all environments beforehand.\n      repeater->OnEnvironmentsSetUpStart(*parent_);\n      ForEach(environments_, SetUpEnvironment);\n      repeater->OnEnvironmentsSetUpEnd(*parent_);\n\n      // Runs the tests only if there was no fatal failure during global\n      // set-up.\n      if (!Test::HasFatalFailure()) {\n        for (int test_index = 0; test_index < total_test_case_count();\n             test_index++) {\n          GetMutableTestCase(test_index)->Run();\n        }\n      }\n\n      // Tears down all environments in reverse order afterwards.\n      repeater->OnEnvironmentsTearDownStart(*parent_);\n      std::for_each(environments_.rbegin(), environments_.rend(),\n                    TearDownEnvironment);\n      repeater->OnEnvironmentsTearDownEnd(*parent_);\n    }\n\n    elapsed_time_ = GetTimeInMillis() - start;\n\n    // Tells the unit test event listener that the tests have just finished.\n    repeater->OnTestIterationEnd(*parent_, i);\n\n    // Gets the result and clears it.\n    if (!Passed()) {\n      failed = true;\n    }\n\n    // Restores the original test order after the iteration.  This\n    // allows the user to quickly repro a failure that happens in the\n    // N-th iteration without repeating the first (N - 1) iterations.\n    // This is not enclosed in \"if (GTEST_FLAG(shuffle)) { ... }\", in\n    // case the user somehow changes the value of the flag somewhere\n    // (it's always safe to unshuffle the tests).\n    UnshuffleTests();\n\n    if (GTEST_FLAG(shuffle)) {\n      // Picks a new random seed for each iteration.\n      random_seed_ = GetNextRandomSeed(random_seed_);\n    }\n  }\n\n  repeater->OnTestProgramEnd(*parent_);\n\n  return !failed;\n}\n\n// Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file\n// if the variable is present. If a file already exists at this location, this\n// function will write over it. If the variable is present, but the file cannot\n// be created, prints an error and exits.\nvoid WriteToShardStatusFileIfNeeded() {\n  const char* const test_shard_file = posix::GetEnv(kTestShardStatusFile);\n  if (test_shard_file != NULL) {\n    FILE* const file = posix::FOpen(test_shard_file, \"w\");\n    if (file == NULL) {\n      ColoredPrintf(COLOR_RED,\n                    \"Could not write to the test shard status file \\\"%s\\\" \"\n                    \"specified by the %s environment variable.\\n\",\n                    test_shard_file, kTestShardStatusFile);\n      fflush(stdout);\n      exit(EXIT_FAILURE);\n    }\n    fclose(file);\n  }\n}\n\n// Checks whether sharding is enabled by examining the relevant\n// environment variable values. If the variables are present,\n// but inconsistent (i.e., shard_index >= total_shards), prints\n// an error and exits. If in_subprocess_for_death_test, sharding is\n// disabled because it must only be applied to the original test\n// process. Otherwise, we could filter out death tests we intended to execute.\nbool ShouldShard(const char* total_shards_env,\n                 const char* shard_index_env,\n                 bool in_subprocess_for_death_test) {\n  if (in_subprocess_for_death_test) {\n    return false;\n  }\n\n  const Int32 total_shards = Int32FromEnvOrDie(total_shards_env, -1);\n  const Int32 shard_index = Int32FromEnvOrDie(shard_index_env, -1);\n\n  if (total_shards == -1 && shard_index == -1) {\n    return false;\n  } else if (total_shards == -1 && shard_index != -1) {\n    const Message msg = Message()\n      << \"Invalid environment variables: you have \"\n      << kTestShardIndex << \" = \" << shard_index\n      << \", but have left \" << kTestTotalShards << \" unset.\\n\";\n    ColoredPrintf(COLOR_RED, msg.GetString().c_str());\n    fflush(stdout);\n    exit(EXIT_FAILURE);\n  } else if (total_shards != -1 && shard_index == -1) {\n    const Message msg = Message()\n      << \"Invalid environment variables: you have \"\n      << kTestTotalShards << \" = \" << total_shards\n      << \", but have left \" << kTestShardIndex << \" unset.\\n\";\n    ColoredPrintf(COLOR_RED, msg.GetString().c_str());\n    fflush(stdout);\n    exit(EXIT_FAILURE);\n  } else if (shard_index < 0 || shard_index >= total_shards) {\n    const Message msg = Message()\n      << \"Invalid environment variables: we require 0 <= \"\n      << kTestShardIndex << \" < \" << kTestTotalShards\n      << \", but you have \" << kTestShardIndex << \"=\" << shard_index\n      << \", \" << kTestTotalShards << \"=\" << total_shards << \".\\n\";\n    ColoredPrintf(COLOR_RED, msg.GetString().c_str());\n    fflush(stdout);\n    exit(EXIT_FAILURE);\n  }\n\n  return total_shards > 1;\n}\n\n// Parses the environment variable var as an Int32. If it is unset,\n// returns default_val. If it is not an Int32, prints an error\n// and aborts.\nInt32 Int32FromEnvOrDie(const char* var, Int32 default_val) {\n  const char* str_val = posix::GetEnv(var);\n  if (str_val == NULL) {\n    return default_val;\n  }\n\n  Int32 result;\n  if (!ParseInt32(Message() << \"The value of environment variable \" << var,\n                  str_val, &result)) {\n    exit(EXIT_FAILURE);\n  }\n  return result;\n}\n\n// Given the total number of shards, the shard index, and the test id,\n// returns true iff the test should be run on this shard. The test id is\n// some arbitrary but unique non-negative integer assigned to each test\n// method. Assumes that 0 <= shard_index < total_shards.\nbool ShouldRunTestOnShard(int total_shards, int shard_index, int test_id) {\n  return (test_id % total_shards) == shard_index;\n}\n\n// Compares the name of each test with the user-specified filter to\n// decide whether the test should be run, then records the result in\n// each TestCase and TestInfo object.\n// If shard_tests == true, further filters tests based on sharding\n// variables in the environment - see\n// http://code.google.com/p/googletest/wiki/GoogleTestAdvancedGuide.\n// Returns the number of tests that should run.\nint UnitTestImpl::FilterTests(ReactionToSharding shard_tests) {\n  const Int32 total_shards = shard_tests == HONOR_SHARDING_PROTOCOL ?\n      Int32FromEnvOrDie(kTestTotalShards, -1) : -1;\n  const Int32 shard_index = shard_tests == HONOR_SHARDING_PROTOCOL ?\n      Int32FromEnvOrDie(kTestShardIndex, -1) : -1;\n\n  // num_runnable_tests are the number of tests that will\n  // run across all shards (i.e., match filter and are not disabled).\n  // num_selected_tests are the number of tests to be run on\n  // this shard.\n  int num_runnable_tests = 0;\n  int num_selected_tests = 0;\n  for (size_t i = 0; i < test_cases_.size(); i++) {\n    TestCase* const test_case = test_cases_[i];\n    const String &test_case_name = test_case->name();\n    test_case->set_should_run(false);\n\n    for (size_t j = 0; j < test_case->test_info_list().size(); j++) {\n      TestInfo* const test_info = test_case->test_info_list()[j];\n      const String test_name(test_info->name());\n      // A test is disabled if test case name or test name matches\n      // kDisableTestFilter.\n      const bool is_disabled =\n          internal::UnitTestOptions::MatchesFilter(test_case_name,\n                                                   kDisableTestFilter) ||\n          internal::UnitTestOptions::MatchesFilter(test_name,\n                                                   kDisableTestFilter);\n      test_info->is_disabled_ = is_disabled;\n\n      const bool matches_filter =\n          internal::UnitTestOptions::FilterMatchesTest(test_case_name,\n                                                       test_name);\n      test_info->matches_filter_ = matches_filter;\n\n      const bool is_runnable =\n          (GTEST_FLAG(also_run_disabled_tests) || !is_disabled) &&\n          matches_filter;\n\n      const bool is_selected = is_runnable &&\n          (shard_tests == IGNORE_SHARDING_PROTOCOL ||\n           ShouldRunTestOnShard(total_shards, shard_index,\n                                num_runnable_tests));\n\n      num_runnable_tests += is_runnable;\n      num_selected_tests += is_selected;\n\n      test_info->should_run_ = is_selected;\n      test_case->set_should_run(test_case->should_run() || is_selected);\n    }\n  }\n  return num_selected_tests;\n}\n\n// Prints the names of the tests matching the user-specified filter flag.\nvoid UnitTestImpl::ListTestsMatchingFilter() {\n  for (size_t i = 0; i < test_cases_.size(); i++) {\n    const TestCase* const test_case = test_cases_[i];\n    bool printed_test_case_name = false;\n\n    for (size_t j = 0; j < test_case->test_info_list().size(); j++) {\n      const TestInfo* const test_info =\n          test_case->test_info_list()[j];\n      if (test_info->matches_filter_) {\n        if (!printed_test_case_name) {\n          printed_test_case_name = true;\n          printf(\"%s.\\n\", test_case->name());\n        }\n        printf(\"  %s\\n\", test_info->name());\n      }\n    }\n  }\n  fflush(stdout);\n}\n\n// Sets the OS stack trace getter.\n//\n// Does nothing if the input and the current OS stack trace getter are\n// the same; otherwise, deletes the old getter and makes the input the\n// current getter.\nvoid UnitTestImpl::set_os_stack_trace_getter(\n    OsStackTraceGetterInterface* getter) {\n  if (os_stack_trace_getter_ != getter) {\n    delete os_stack_trace_getter_;\n    os_stack_trace_getter_ = getter;\n  }\n}\n\n// Returns the current OS stack trace getter if it is not NULL;\n// otherwise, creates an OsStackTraceGetter, makes it the current\n// getter, and returns it.\nOsStackTraceGetterInterface* UnitTestImpl::os_stack_trace_getter() {\n  if (os_stack_trace_getter_ == NULL) {\n    os_stack_trace_getter_ = new OsStackTraceGetter;\n  }\n\n  return os_stack_trace_getter_;\n}\n\n// Returns the TestResult for the test that's currently running, or\n// the TestResult for the ad hoc test if no test is running.\nTestResult* UnitTestImpl::current_test_result() {\n  return current_test_info_ ?\n      &(current_test_info_->result_) : &ad_hoc_test_result_;\n}\n\n// Shuffles all test cases, and the tests within each test case,\n// making sure that death tests are still run first.\nvoid UnitTestImpl::ShuffleTests() {\n  // Shuffles the death test cases.\n  ShuffleRange(random(), 0, last_death_test_case_ + 1, &test_case_indices_);\n\n  // Shuffles the non-death test cases.\n  ShuffleRange(random(), last_death_test_case_ + 1,\n               static_cast<int>(test_cases_.size()), &test_case_indices_);\n\n  // Shuffles the tests inside each test case.\n  for (size_t i = 0; i < test_cases_.size(); i++) {\n    test_cases_[i]->ShuffleTests(random());\n  }\n}\n\n// Restores the test cases and tests to their order before the first shuffle.\nvoid UnitTestImpl::UnshuffleTests() {\n  for (size_t i = 0; i < test_cases_.size(); i++) {\n    // Unshuffles the tests in each test case.\n    test_cases_[i]->UnshuffleTests();\n    // Resets the index of each test case.\n    test_case_indices_[i] = static_cast<int>(i);\n  }\n}\n\n// Returns the current OS stack trace as a String.\n//\n// The maximum number of stack frames to be included is specified by\n// the gtest_stack_trace_depth flag.  The skip_count parameter\n// specifies the number of top frames to be skipped, which doesn't\n// count against the number of frames to be included.\n//\n// For example, if Foo() calls Bar(), which in turn calls\n// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in\n// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't.\nString GetCurrentOsStackTraceExceptTop(UnitTest* /*unit_test*/,\n                                       int skip_count) {\n  // We pass skip_count + 1 to skip this wrapper function in addition\n  // to what the user really wants to skip.\n  return GetUnitTestImpl()->CurrentOsStackTraceExceptTop(skip_count + 1);\n}\n\n// Used by the GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_ macro to\n// suppress unreachable code warnings.\nnamespace {\nclass ClassUniqueToAlwaysTrue {};\n}\n\nbool IsTrue(bool condition) { return condition; }\n\nbool AlwaysTrue() {\n#if GTEST_HAS_EXCEPTIONS\n  // This condition is always false so AlwaysTrue() never actually throws,\n  // but it makes the compiler think that it may throw.\n  if (IsTrue(false))\n    throw ClassUniqueToAlwaysTrue();\n#endif  // GTEST_HAS_EXCEPTIONS\n  return true;\n}\n\n// If *pstr starts with the given prefix, modifies *pstr to be right\n// past the prefix and returns true; otherwise leaves *pstr unchanged\n// and returns false.  None of pstr, *pstr, and prefix can be NULL.\nbool SkipPrefix(const char* prefix, const char** pstr) {\n  const size_t prefix_len = strlen(prefix);\n  if (strncmp(*pstr, prefix, prefix_len) == 0) {\n    *pstr += prefix_len;\n    return true;\n  }\n  return false;\n}\n\n// Parses a string as a command line flag.  The string should have\n// the format \"--flag=value\".  When def_optional is true, the \"=value\"\n// part can be omitted.\n//\n// Returns the value of the flag, or NULL if the parsing failed.\nconst char* ParseFlagValue(const char* str,\n                           const char* flag,\n                           bool def_optional) {\n  // str and flag must not be NULL.\n  if (str == NULL || flag == NULL) return NULL;\n\n  // The flag must start with \"--\" followed by GTEST_FLAG_PREFIX_.\n  const String flag_str = String::Format(\"--%s%s\", GTEST_FLAG_PREFIX_, flag);\n  const size_t flag_len = flag_str.length();\n  if (strncmp(str, flag_str.c_str(), flag_len) != 0) return NULL;\n\n  // Skips the flag name.\n  const char* flag_end = str + flag_len;\n\n  // When def_optional is true, it's OK to not have a \"=value\" part.\n  if (def_optional && (flag_end[0] == '\\0')) {\n    return flag_end;\n  }\n\n  // If def_optional is true and there are more characters after the\n  // flag name, or if def_optional is false, there must be a '=' after\n  // the flag name.\n  if (flag_end[0] != '=') return NULL;\n\n  // Returns the string after \"=\".\n  return flag_end + 1;\n}\n\n// Parses a string for a bool flag, in the form of either\n// \"--flag=value\" or \"--flag\".\n//\n// In the former case, the value is taken as true as long as it does\n// not start with '0', 'f', or 'F'.\n//\n// In the latter case, the value is taken as true.\n//\n// On success, stores the value of the flag in *value, and returns\n// true.  On failure, returns false without changing *value.\nbool ParseBoolFlag(const char* str, const char* flag, bool* value) {\n  // Gets the value of the flag as a string.\n  const char* const value_str = ParseFlagValue(str, flag, true);\n\n  // Aborts if the parsing failed.\n  if (value_str == NULL) return false;\n\n  // Converts the string value to a bool.\n  *value = !(*value_str == '0' || *value_str == 'f' || *value_str == 'F');\n  return true;\n}\n\n// Parses a string for an Int32 flag, in the form of\n// \"--flag=value\".\n//\n// On success, stores the value of the flag in *value, and returns\n// true.  On failure, returns false without changing *value.\nbool ParseInt32Flag(const char* str, const char* flag, Int32* value) {\n  // Gets the value of the flag as a string.\n  const char* const value_str = ParseFlagValue(str, flag, false);\n\n  // Aborts if the parsing failed.\n  if (value_str == NULL) return false;\n\n  // Sets *value to the value of the flag.\n  return ParseInt32(Message() << \"The value of flag --\" << flag,\n                    value_str, value);\n}\n\n// Parses a string for a string flag, in the form of\n// \"--flag=value\".\n//\n// On success, stores the value of the flag in *value, and returns\n// true.  On failure, returns false without changing *value.\nbool ParseStringFlag(const char* str, const char* flag, String* value) {\n  // Gets the value of the flag as a string.\n  const char* const value_str = ParseFlagValue(str, flag, false);\n\n  // Aborts if the parsing failed.\n  if (value_str == NULL) return false;\n\n  // Sets *value to the value of the flag.\n  *value = value_str;\n  return true;\n}\n\n// Determines whether a string has a prefix that Google Test uses for its\n// flags, i.e., starts with GTEST_FLAG_PREFIX_ or GTEST_FLAG_PREFIX_DASH_.\n// If Google Test detects that a command line flag has its prefix but is not\n// recognized, it will print its help message. Flags starting with\n// GTEST_INTERNAL_PREFIX_ followed by \"internal_\" are considered Google Test\n// internal flags and do not trigger the help message.\nstatic bool HasGoogleTestFlagPrefix(const char* str) {\n  return (SkipPrefix(\"--\", &str) ||\n          SkipPrefix(\"-\", &str) ||\n          SkipPrefix(\"/\", &str)) &&\n         !SkipPrefix(GTEST_FLAG_PREFIX_ \"internal_\", &str) &&\n         (SkipPrefix(GTEST_FLAG_PREFIX_, &str) ||\n          SkipPrefix(GTEST_FLAG_PREFIX_DASH_, &str));\n}\n\n// Prints a string containing code-encoded text.  The following escape\n// sequences can be used in the string to control the text color:\n//\n//   @@    prints a single '@' character.\n//   @R    changes the color to red.\n//   @G    changes the color to green.\n//   @Y    changes the color to yellow.\n//   @D    changes to the default terminal text color.\n//\n// TODO(wan@google.com): Write tests for this once we add stdout\n// capturing to Google Test.\nstatic void PrintColorEncoded(const char* str) {\n  GTestColor color = COLOR_DEFAULT;  // The current color.\n\n  // Conceptually, we split the string into segments divided by escape\n  // sequences.  Then we print one segment at a time.  At the end of\n  // each iteration, the str pointer advances to the beginning of the\n  // next segment.\n  for (;;) {\n    const char* p = strchr(str, '@');\n    if (p == NULL) {\n      ColoredPrintf(color, \"%s\", str);\n      return;\n    }\n\n    ColoredPrintf(color, \"%s\", String(str, p - str).c_str());\n\n    const char ch = p[1];\n    str = p + 2;\n    if (ch == '@') {\n      ColoredPrintf(color, \"@\");\n    } else if (ch == 'D') {\n      color = COLOR_DEFAULT;\n    } else if (ch == 'R') {\n      color = COLOR_RED;\n    } else if (ch == 'G') {\n      color = COLOR_GREEN;\n    } else if (ch == 'Y') {\n      color = COLOR_YELLOW;\n    } else {\n      --str;\n    }\n  }\n}\n\nstatic const char kColorEncodedHelpMessage[] =\n\"This program contains tests written using \" GTEST_NAME_ \". You can use the\\n\"\n\"following command line flags to control its behavior:\\n\"\n\"\\n\"\n\"Test Selection:\\n\"\n\"  @G--\" GTEST_FLAG_PREFIX_ \"list_tests@D\\n\"\n\"      List the names of all tests instead of running them. The name of\\n\"\n\"      TEST(Foo, Bar) is \\\"Foo.Bar\\\".\\n\"\n\"  @G--\" GTEST_FLAG_PREFIX_ \"filter=@YPOSTIVE_PATTERNS\"\n    \"[@G-@YNEGATIVE_PATTERNS]@D\\n\"\n\"      Run only the tests whose name matches one of the positive patterns but\\n\"\n\"      none of the negative patterns. '?' matches any single character; '*'\\n\"\n\"      matches any substring; ':' separates two patterns.\\n\"\n\"  @G--\" GTEST_FLAG_PREFIX_ \"also_run_disabled_tests@D\\n\"\n\"      Run all disabled tests too.\\n\"\n\"\\n\"\n\"Test Execution:\\n\"\n\"  @G--\" GTEST_FLAG_PREFIX_ \"repeat=@Y[COUNT]@D\\n\"\n\"      Run the tests repeatedly; use a negative count to repeat forever.\\n\"\n\"  @G--\" GTEST_FLAG_PREFIX_ \"shuffle@D\\n\"\n\"      Randomize tests' orders on every iteration.\\n\"\n\"  @G--\" GTEST_FLAG_PREFIX_ \"random_seed=@Y[NUMBER]@D\\n\"\n\"      Random number seed to use for shuffling test orders (between 1 and\\n\"\n\"      99999, or 0 to use a seed based on the current time).\\n\"\n\"\\n\"\n\"Test Output:\\n\"\n\"  @G--\" GTEST_FLAG_PREFIX_ \"color=@Y(@Gyes@Y|@Gno@Y|@Gauto@Y)@D\\n\"\n\"      Enable/disable colored output. The default is @Gauto@D.\\n\"\n\"  -@G-\" GTEST_FLAG_PREFIX_ \"print_time=0@D\\n\"\n\"      Don't print the elapsed time of each test.\\n\"\n\"  @G--\" GTEST_FLAG_PREFIX_ \"output=xml@Y[@G:@YDIRECTORY_PATH@G\"\n    GTEST_PATH_SEP_ \"@Y|@G:@YFILE_PATH]@D\\n\"\n\"      Generate an XML report in the given directory or with the given file\\n\"\n\"      name. @YFILE_PATH@D defaults to @Gtest_details.xml@D.\\n\"\n#if GTEST_CAN_STREAM_RESULTS_\n\"  @G--\" GTEST_FLAG_PREFIX_ \"stream_result_to=@YHOST@G:@YPORT@D\\n\"\n\"      Stream test results to the given server.\\n\"\n#endif  // GTEST_CAN_STREAM_RESULTS_\n\"\\n\"\n\"Assertion Behavior:\\n\"\n#if GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS\n\"  @G--\" GTEST_FLAG_PREFIX_ \"death_test_style=@Y(@Gfast@Y|@Gthreadsafe@Y)@D\\n\"\n\"      Set the default death test style.\\n\"\n#endif  // GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS\n\"  @G--\" GTEST_FLAG_PREFIX_ \"break_on_failure@D\\n\"\n\"      Turn assertion failures into debugger break-points.\\n\"\n\"  @G--\" GTEST_FLAG_PREFIX_ \"throw_on_failure@D\\n\"\n\"      Turn assertion failures into C++ exceptions.\\n\"\n\"  @G--\" GTEST_FLAG_PREFIX_ \"catch_exceptions=0@D\\n\"\n\"      Do not report exceptions as test failures. Instead, allow them\\n\"\n\"      to crash the program or throw a pop-up (on Windows).\\n\"\n\"\\n\"\n\"Except for @G--\" GTEST_FLAG_PREFIX_ \"list_tests@D, you can alternatively set \"\n    \"the corresponding\\n\"\n\"environment variable of a flag (all letters in upper-case). For example, to\\n\"\n\"disable colored text output, you can either specify @G--\" GTEST_FLAG_PREFIX_\n    \"color=no@D or set\\n\"\n\"the @G\" GTEST_FLAG_PREFIX_UPPER_ \"COLOR@D environment variable to @Gno@D.\\n\"\n\"\\n\"\n\"For more information, please read the \" GTEST_NAME_ \" documentation at\\n\"\n\"@G\" GTEST_PROJECT_URL_ \"@D. If you find a bug in \" GTEST_NAME_ \"\\n\"\n\"(not one in your own code or tests), please report it to\\n\"\n\"@G<\" GTEST_DEV_EMAIL_ \">@D.\\n\";\n\n// Parses the command line for Google Test flags, without initializing\n// other parts of Google Test.  The type parameter CharType can be\n// instantiated to either char or wchar_t.\ntemplate <typename CharType>\nvoid ParseGoogleTestFlagsOnlyImpl(int* argc, CharType** argv) {\n  for (int i = 1; i < *argc; i++) {\n    const String arg_string = StreamableToString(argv[i]);\n    const char* const arg = arg_string.c_str();\n\n    using internal::ParseBoolFlag;\n    using internal::ParseInt32Flag;\n    using internal::ParseStringFlag;\n\n    // Do we see a Google Test flag?\n    if (ParseBoolFlag(arg, kAlsoRunDisabledTestsFlag,\n                      &GTEST_FLAG(also_run_disabled_tests)) ||\n        ParseBoolFlag(arg, kBreakOnFailureFlag,\n                      &GTEST_FLAG(break_on_failure)) ||\n        ParseBoolFlag(arg, kCatchExceptionsFlag,\n                      &GTEST_FLAG(catch_exceptions)) ||\n        ParseStringFlag(arg, kColorFlag, &GTEST_FLAG(color)) ||\n        ParseStringFlag(arg, kDeathTestStyleFlag,\n                        &GTEST_FLAG(death_test_style)) ||\n        ParseBoolFlag(arg, kDeathTestUseFork,\n                      &GTEST_FLAG(death_test_use_fork)) ||\n        ParseStringFlag(arg, kFilterFlag, &GTEST_FLAG(filter)) ||\n        ParseStringFlag(arg, kInternalRunDeathTestFlag,\n                        &GTEST_FLAG(internal_run_death_test)) ||\n        ParseBoolFlag(arg, kListTestsFlag, &GTEST_FLAG(list_tests)) ||\n        ParseStringFlag(arg, kOutputFlag, &GTEST_FLAG(output)) ||\n        ParseBoolFlag(arg, kPrintTimeFlag, &GTEST_FLAG(print_time)) ||\n        ParseInt32Flag(arg, kRandomSeedFlag, &GTEST_FLAG(random_seed)) ||\n        ParseInt32Flag(arg, kRepeatFlag, &GTEST_FLAG(repeat)) ||\n        ParseBoolFlag(arg, kShuffleFlag, &GTEST_FLAG(shuffle)) ||\n        ParseInt32Flag(arg, kStackTraceDepthFlag,\n                       &GTEST_FLAG(stack_trace_depth)) ||\n        ParseStringFlag(arg, kStreamResultToFlag,\n                        &GTEST_FLAG(stream_result_to)) ||\n        ParseBoolFlag(arg, kThrowOnFailureFlag,\n                      &GTEST_FLAG(throw_on_failure))\n        ) {\n      // Yes.  Shift the remainder of the argv list left by one.  Note\n      // that argv has (*argc + 1) elements, the last one always being\n      // NULL.  The following loop moves the trailing NULL element as\n      // well.\n      for (int j = i; j != *argc; j++) {\n        argv[j] = argv[j + 1];\n      }\n\n      // Decrements the argument count.\n      (*argc)--;\n\n      // We also need to decrement the iterator as we just removed\n      // an element.\n      i--;\n    } else if (arg_string == \"--help\" || arg_string == \"-h\" ||\n               arg_string == \"-?\" || arg_string == \"/?\" ||\n               HasGoogleTestFlagPrefix(arg)) {\n      // Both help flag and unrecognized Google Test flags (excluding\n      // internal ones) trigger help display.\n      g_help_flag = true;\n    }\n  }\n\n  if (g_help_flag) {\n    // We print the help here instead of in RUN_ALL_TESTS(), as the\n    // latter may not be called at all if the user is using Google\n    // Test with another testing framework.\n    PrintColorEncoded(kColorEncodedHelpMessage);\n  }\n}\n\n// Parses the command line for Google Test flags, without initializing\n// other parts of Google Test.\nvoid ParseGoogleTestFlagsOnly(int* argc, char** argv) {\n  ParseGoogleTestFlagsOnlyImpl(argc, argv);\n}\nvoid ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv) {\n  ParseGoogleTestFlagsOnlyImpl(argc, argv);\n}\n\n// The internal implementation of InitGoogleTest().\n//\n// The type parameter CharType can be instantiated to either char or\n// wchar_t.\ntemplate <typename CharType>\nvoid InitGoogleTestImpl(int* argc, CharType** argv) {\n  g_init_gtest_count++;\n\n  // We don't want to run the initialization code twice.\n  if (g_init_gtest_count != 1) return;\n\n  if (*argc <= 0) return;\n\n  internal::g_executable_path = internal::StreamableToString(argv[0]);\n\n#if GTEST_HAS_DEATH_TEST\n\n  g_argvs.clear();\n  for (int i = 0; i != *argc; i++) {\n    g_argvs.push_back(StreamableToString(argv[i]));\n  }\n\n#endif  // GTEST_HAS_DEATH_TEST\n\n  ParseGoogleTestFlagsOnly(argc, argv);\n  GetUnitTestImpl()->PostFlagParsingInit();\n}\n\n}  // namespace internal\n\n// Initializes Google Test.  This must be called before calling\n// RUN_ALL_TESTS().  In particular, it parses a command line for the\n// flags that Google Test recognizes.  Whenever a Google Test flag is\n// seen, it is removed from argv, and *argc is decremented.\n//\n// No value is returned.  Instead, the Google Test flag variables are\n// updated.\n//\n// Calling the function for the second time has no user-visible effect.\nvoid InitGoogleTest(int* argc, char** argv) {\n  internal::InitGoogleTestImpl(argc, argv);\n}\n\n// This overloaded version can be used in Windows programs compiled in\n// UNICODE mode.\nvoid InitGoogleTest(int* argc, wchar_t** argv) {\n  internal::InitGoogleTestImpl(argc, argv);\n}\n\n}  // namespace testing\n// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan), vladl@google.com (Vlad Losev)\n//\n// This file implements death tests.\n\n\n#if GTEST_HAS_DEATH_TEST\n\n# if GTEST_OS_MAC\n#  include <crt_externs.h>\n# endif  // GTEST_OS_MAC\n\n# include <errno.h>\n# include <fcntl.h>\n# include <limits.h>\n# include <stdarg.h>\n\n# if GTEST_OS_WINDOWS\n#  include <windows.h>\n# else\n#  include <sys/mman.h>\n#  include <sys/wait.h>\n# endif  // GTEST_OS_WINDOWS\n\n#endif  // GTEST_HAS_DEATH_TEST\n\n\n// Indicates that this translation unit is part of Google Test's\n// implementation.  It must come before gtest-internal-inl.h is\n// included, or there will be a compiler error.  This trick is to\n// prevent a user from accidentally including gtest-internal-inl.h in\n// his code.\n#define GTEST_IMPLEMENTATION_ 1\n#undef GTEST_IMPLEMENTATION_\n\nnamespace testing {\n\n// Constants.\n\n// The default death test style.\nstatic const char kDefaultDeathTestStyle[] = \"fast\";\n\nGTEST_DEFINE_string_(\n    death_test_style,\n    internal::StringFromGTestEnv(\"death_test_style\", kDefaultDeathTestStyle),\n    \"Indicates how to run a death test in a forked child process: \"\n    \"\\\"threadsafe\\\" (child process re-executes the test binary \"\n    \"from the beginning, running only the specific death test) or \"\n    \"\\\"fast\\\" (child process runs the death test immediately \"\n    \"after forking).\");\n\nGTEST_DEFINE_bool_(\n    death_test_use_fork,\n    internal::BoolFromGTestEnv(\"death_test_use_fork\", false),\n    \"Instructs to use fork()/_exit() instead of clone() in death tests. \"\n    \"Ignored and always uses fork() on POSIX systems where clone() is not \"\n    \"implemented. Useful when running under valgrind or similar tools if \"\n    \"those do not support clone(). Valgrind 3.3.1 will just fail if \"\n    \"it sees an unsupported combination of clone() flags. \"\n    \"It is not recommended to use this flag w/o valgrind though it will \"\n    \"work in 99% of the cases. Once valgrind is fixed, this flag will \"\n    \"most likely be removed.\");\n\nnamespace internal {\nGTEST_DEFINE_string_(\n    internal_run_death_test, \"\",\n    \"Indicates the file, line number, temporal index of \"\n    \"the single death test to run, and a file descriptor to \"\n    \"which a success code may be sent, all separated by \"\n    \"colons.  This flag is specified if and only if the current \"\n    \"process is a sub-process launched for running a thread-safe \"\n    \"death test.  FOR INTERNAL USE ONLY.\");\n}  // namespace internal\n\n#if GTEST_HAS_DEATH_TEST\n\n// ExitedWithCode constructor.\nExitedWithCode::ExitedWithCode(int exit_code) : exit_code_(exit_code) {\n}\n\n// ExitedWithCode function-call operator.\nbool ExitedWithCode::operator()(int exit_status) const {\n# if GTEST_OS_WINDOWS\n\n  return exit_status == exit_code_;\n\n# else\n\n  return WIFEXITED(exit_status) && WEXITSTATUS(exit_status) == exit_code_;\n\n# endif  // GTEST_OS_WINDOWS\n}\n\n# if !GTEST_OS_WINDOWS\n// KilledBySignal constructor.\nKilledBySignal::KilledBySignal(int signum) : signum_(signum) {\n}\n\n// KilledBySignal function-call operator.\nbool KilledBySignal::operator()(int exit_status) const {\n  return WIFSIGNALED(exit_status) && WTERMSIG(exit_status) == signum_;\n}\n# endif  // !GTEST_OS_WINDOWS\n\nnamespace internal {\n\n// Utilities needed for death tests.\n\n// Generates a textual description of a given exit code, in the format\n// specified by wait(2).\nstatic String ExitSummary(int exit_code) {\n  Message m;\n\n# if GTEST_OS_WINDOWS\n\n  m << \"Exited with exit status \" << exit_code;\n\n# else\n\n  if (WIFEXITED(exit_code)) {\n    m << \"Exited with exit status \" << WEXITSTATUS(exit_code);\n  } else if (WIFSIGNALED(exit_code)) {\n    m << \"Terminated by signal \" << WTERMSIG(exit_code);\n  }\n#  ifdef WCOREDUMP\n  if (WCOREDUMP(exit_code)) {\n    m << \" (core dumped)\";\n  }\n#  endif\n# endif  // GTEST_OS_WINDOWS\n\n  return m.GetString();\n}\n\n// Returns true if exit_status describes a process that was terminated\n// by a signal, or exited normally with a nonzero exit code.\nbool ExitedUnsuccessfully(int exit_status) {\n  return !ExitedWithCode(0)(exit_status);\n}\n\n# if !GTEST_OS_WINDOWS\n// Generates a textual failure message when a death test finds more than\n// one thread running, or cannot determine the number of threads, prior\n// to executing the given statement.  It is the responsibility of the\n// caller not to pass a thread_count of 1.\nstatic String DeathTestThreadWarning(size_t thread_count) {\n  Message msg;\n  msg << \"Death tests use fork(), which is unsafe particularly\"\n      << \" in a threaded context. For this test, \" << GTEST_NAME_ << \" \";\n  if (thread_count == 0)\n    msg << \"couldn't detect the number of threads.\";\n  else\n    msg << \"detected \" << thread_count << \" threads.\";\n  return msg.GetString();\n}\n# endif  // !GTEST_OS_WINDOWS\n\n// Flag characters for reporting a death test that did not die.\nstatic const char kDeathTestLived = 'L';\nstatic const char kDeathTestReturned = 'R';\nstatic const char kDeathTestThrew = 'T';\nstatic const char kDeathTestInternalError = 'I';\n\n// An enumeration describing all of the possible ways that a death test can\n// conclude.  DIED means that the process died while executing the test\n// code; LIVED means that process lived beyond the end of the test code;\n// RETURNED means that the test statement attempted to execute a return\n// statement, which is not allowed; THREW means that the test statement\n// returned control by throwing an exception.  IN_PROGRESS means the test\n// has not yet concluded.\n// TODO(vladl@google.com): Unify names and possibly values for\n// AbortReason, DeathTestOutcome, and flag characters above.\nenum DeathTestOutcome { IN_PROGRESS, DIED, LIVED, RETURNED, THREW };\n\n// Routine for aborting the program which is safe to call from an\n// exec-style death test child process, in which case the error\n// message is propagated back to the parent process.  Otherwise, the\n// message is simply printed to stderr.  In either case, the program\n// then exits with status 1.\nvoid DeathTestAbort(const String& message) {\n  // On a POSIX system, this function may be called from a threadsafe-style\n  // death test child process, which operates on a very small stack.  Use\n  // the heap for any additional non-minuscule memory requirements.\n  const InternalRunDeathTestFlag* const flag =\n      GetUnitTestImpl()->internal_run_death_test_flag();\n  if (flag != NULL) {\n    FILE* parent = posix::FDOpen(flag->write_fd(), \"w\");\n    fputc(kDeathTestInternalError, parent);\n    fprintf(parent, \"%s\", message.c_str());\n    fflush(parent);\n    _exit(1);\n  } else {\n    fprintf(stderr, \"%s\", message.c_str());\n    fflush(stderr);\n    posix::Abort();\n  }\n}\n\n// A replacement for CHECK that calls DeathTestAbort if the assertion\n// fails.\n# define GTEST_DEATH_TEST_CHECK_(expression) \\\n  do { \\\n    if (!::testing::internal::IsTrue(expression)) { \\\n      DeathTestAbort(::testing::internal::String::Format( \\\n          \"CHECK failed: File %s, line %d: %s\", \\\n          __FILE__, __LINE__, #expression)); \\\n    } \\\n  } while (::testing::internal::AlwaysFalse())\n\n// This macro is similar to GTEST_DEATH_TEST_CHECK_, but it is meant for\n// evaluating any system call that fulfills two conditions: it must return\n// -1 on failure, and set errno to EINTR when it is interrupted and\n// should be tried again.  The macro expands to a loop that repeatedly\n// evaluates the expression as long as it evaluates to -1 and sets\n// errno to EINTR.  If the expression evaluates to -1 but errno is\n// something other than EINTR, DeathTestAbort is called.\n# define GTEST_DEATH_TEST_CHECK_SYSCALL_(expression) \\\n  do { \\\n    int gtest_retval; \\\n    do { \\\n      gtest_retval = (expression); \\\n    } while (gtest_retval == -1 && errno == EINTR); \\\n    if (gtest_retval == -1) { \\\n      DeathTestAbort(::testing::internal::String::Format( \\\n          \"CHECK failed: File %s, line %d: %s != -1\", \\\n          __FILE__, __LINE__, #expression)); \\\n    } \\\n  } while (::testing::internal::AlwaysFalse())\n\n// Returns the message describing the last system error in errno.\nString GetLastErrnoDescription() {\n    return String(errno == 0 ? \"\" : posix::StrError(errno));\n}\n\n// This is called from a death test parent process to read a failure\n// message from the death test child process and log it with the FATAL\n// severity. On Windows, the message is read from a pipe handle. On other\n// platforms, it is read from a file descriptor.\nstatic void FailFromInternalError(int fd) {\n  Message error;\n  char buffer[256];\n  int num_read;\n\n  do {\n    while ((num_read = posix::Read(fd, buffer, 255)) > 0) {\n      buffer[num_read] = '\\0';\n      error << buffer;\n    }\n  } while (num_read == -1 && errno == EINTR);\n\n  if (num_read == 0) {\n    GTEST_LOG_(FATAL) << error.GetString();\n  } else {\n    const int last_error = errno;\n    GTEST_LOG_(FATAL) << \"Error while reading death test internal: \"\n                      << GetLastErrnoDescription() << \" [\" << last_error << \"]\";\n  }\n}\n\n// Death test constructor.  Increments the running death test count\n// for the current test.\nDeathTest::DeathTest() {\n  TestInfo* const info = GetUnitTestImpl()->current_test_info();\n  if (info == NULL) {\n    DeathTestAbort(\"Cannot run a death test outside of a TEST or \"\n                   \"TEST_F construct\");\n  }\n}\n\n// Creates and returns a death test by dispatching to the current\n// death test factory.\nbool DeathTest::Create(const char* statement, const RE* regex,\n                       const char* file, int line, DeathTest** test) {\n  return GetUnitTestImpl()->death_test_factory()->Create(\n      statement, regex, file, line, test);\n}\n\nconst char* DeathTest::LastMessage() {\n  return last_death_test_message_.c_str();\n}\n\nvoid DeathTest::set_last_death_test_message(const String& message) {\n  last_death_test_message_ = message;\n}\n\nString DeathTest::last_death_test_message_;\n\n// Provides cross platform implementation for some death functionality.\nclass DeathTestImpl : public DeathTest {\n protected:\n  DeathTestImpl(const char* a_statement, const RE* a_regex)\n      : statement_(a_statement),\n        regex_(a_regex),\n        spawned_(false),\n        status_(-1),\n        outcome_(IN_PROGRESS),\n        read_fd_(-1),\n        write_fd_(-1) {}\n\n  // read_fd_ is expected to be closed and cleared by a derived class.\n  ~DeathTestImpl() { GTEST_DEATH_TEST_CHECK_(read_fd_ == -1); }\n\n  void Abort(AbortReason reason);\n  virtual bool Passed(bool status_ok);\n\n  const char* statement() const { return statement_; }\n  const RE* regex() const { return regex_; }\n  bool spawned() const { return spawned_; }\n  void set_spawned(bool is_spawned) { spawned_ = is_spawned; }\n  int status() const { return status_; }\n  void set_status(int a_status) { status_ = a_status; }\n  DeathTestOutcome outcome() const { return outcome_; }\n  void set_outcome(DeathTestOutcome an_outcome) { outcome_ = an_outcome; }\n  int read_fd() const { return read_fd_; }\n  void set_read_fd(int fd) { read_fd_ = fd; }\n  int write_fd() const { return write_fd_; }\n  void set_write_fd(int fd) { write_fd_ = fd; }\n\n  // Called in the parent process only. Reads the result code of the death\n  // test child process via a pipe, interprets it to set the outcome_\n  // member, and closes read_fd_.  Outputs diagnostics and terminates in\n  // case of unexpected codes.\n  void ReadAndInterpretStatusByte();\n\n private:\n  // The textual content of the code this object is testing.  This class\n  // doesn't own this string and should not attempt to delete it.\n  const char* const statement_;\n  // The regular expression which test output must match.  DeathTestImpl\n  // doesn't own this object and should not attempt to delete it.\n  const RE* const regex_;\n  // True if the death test child process has been successfully spawned.\n  bool spawned_;\n  // The exit status of the child process.\n  int status_;\n  // How the death test concluded.\n  DeathTestOutcome outcome_;\n  // Descriptor to the read end of the pipe to the child process.  It is\n  // always -1 in the child process.  The child keeps its write end of the\n  // pipe in write_fd_.\n  int read_fd_;\n  // Descriptor to the child's write end of the pipe to the parent process.\n  // It is always -1 in the parent process.  The parent keeps its end of the\n  // pipe in read_fd_.\n  int write_fd_;\n};\n\n// Called in the parent process only. Reads the result code of the death\n// test child process via a pipe, interprets it to set the outcome_\n// member, and closes read_fd_.  Outputs diagnostics and terminates in\n// case of unexpected codes.\nvoid DeathTestImpl::ReadAndInterpretStatusByte() {\n  char flag;\n  int bytes_read;\n\n  // The read() here blocks until data is available (signifying the\n  // failure of the death test) or until the pipe is closed (signifying\n  // its success), so it's okay to call this in the parent before\n  // the child process has exited.\n  do {\n    bytes_read = posix::Read(read_fd(), &flag, 1);\n  } while (bytes_read == -1 && errno == EINTR);\n\n  if (bytes_read == 0) {\n    set_outcome(DIED);\n  } else if (bytes_read == 1) {\n    switch (flag) {\n      case kDeathTestReturned:\n        set_outcome(RETURNED);\n        break;\n      case kDeathTestThrew:\n        set_outcome(THREW);\n        break;\n      case kDeathTestLived:\n        set_outcome(LIVED);\n        break;\n      case kDeathTestInternalError:\n        FailFromInternalError(read_fd());  // Does not return.\n        break;\n      default:\n        GTEST_LOG_(FATAL) << \"Death test child process reported \"\n                          << \"unexpected status byte (\"\n                          << static_cast<unsigned int>(flag) << \")\";\n    }\n  } else {\n    GTEST_LOG_(FATAL) << \"Read from death test child process failed: \"\n                      << GetLastErrnoDescription();\n  }\n  GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Close(read_fd()));\n  set_read_fd(-1);\n}\n\n// Signals that the death test code which should have exited, didn't.\n// Should be called only in a death test child process.\n// Writes a status byte to the child's status file descriptor, then\n// calls _exit(1).\nvoid DeathTestImpl::Abort(AbortReason reason) {\n  // The parent process considers the death test to be a failure if\n  // it finds any data in our pipe.  So, here we write a single flag byte\n  // to the pipe, then exit.\n  const char status_ch =\n      reason == TEST_DID_NOT_DIE ? kDeathTestLived :\n      reason == TEST_THREW_EXCEPTION ? kDeathTestThrew : kDeathTestReturned;\n\n  GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Write(write_fd(), &status_ch, 1));\n  // We are leaking the descriptor here because on some platforms (i.e.,\n  // when built as Windows DLL), destructors of global objects will still\n  // run after calling _exit(). On such systems, write_fd_ will be\n  // indirectly closed from the destructor of UnitTestImpl, causing double\n  // close if it is also closed here. On debug configurations, double close\n  // may assert. As there are no in-process buffers to flush here, we are\n  // relying on the OS to close the descriptor after the process terminates\n  // when the destructors are not run.\n  _exit(1);  // Exits w/o any normal exit hooks (we were supposed to crash)\n}\n\n// Returns an indented copy of stderr output for a death test.\n// This makes distinguishing death test output lines from regular log lines\n// much easier.\nstatic ::std::string FormatDeathTestOutput(const ::std::string& output) {\n  ::std::string ret;\n  for (size_t at = 0; ; ) {\n    const size_t line_end = output.find('\\n', at);\n    ret += \"[  DEATH   ] \";\n    if (line_end == ::std::string::npos) {\n      ret += output.substr(at);\n      break;\n    }\n    ret += output.substr(at, line_end + 1 - at);\n    at = line_end + 1;\n  }\n  return ret;\n}\n\n// Assesses the success or failure of a death test, using both private\n// members which have previously been set, and one argument:\n//\n// Private data members:\n//   outcome:  An enumeration describing how the death test\n//             concluded: DIED, LIVED, THREW, or RETURNED.  The death test\n//             fails in the latter three cases.\n//   status:   The exit status of the child process. On *nix, it is in the\n//             in the format specified by wait(2). On Windows, this is the\n//             value supplied to the ExitProcess() API or a numeric code\n//             of the exception that terminated the program.\n//   regex:    A regular expression object to be applied to\n//             the test's captured standard error output; the death test\n//             fails if it does not match.\n//\n// Argument:\n//   status_ok: true if exit_status is acceptable in the context of\n//              this particular death test, which fails if it is false\n//\n// Returns true iff all of the above conditions are met.  Otherwise, the\n// first failing condition, in the order given above, is the one that is\n// reported. Also sets the last death test message string.\nbool DeathTestImpl::Passed(bool status_ok) {\n  if (!spawned())\n    return false;\n\n  const String error_message = GetCapturedStderr();\n\n  bool success = false;\n  Message buffer;\n\n  buffer << \"Death test: \" << statement() << \"\\n\";\n  switch (outcome()) {\n    case LIVED:\n      buffer << \"    Result: failed to die.\\n\"\n             << \" Error msg:\\n\" << FormatDeathTestOutput(error_message);\n      break;\n    case THREW:\n      buffer << \"    Result: threw an exception.\\n\"\n             << \" Error msg:\\n\" << FormatDeathTestOutput(error_message);\n      break;\n    case RETURNED:\n      buffer << \"    Result: illegal return in test statement.\\n\"\n             << \" Error msg:\\n\" << FormatDeathTestOutput(error_message);\n      break;\n    case DIED:\n      if (status_ok) {\n        const bool matched = RE::PartialMatch(error_message.c_str(), *regex());\n        if (matched) {\n          success = true;\n        } else {\n          buffer << \"    Result: died but not with expected error.\\n\"\n                 << \"  Expected: \" << regex()->pattern() << \"\\n\"\n                 << \"Actual msg:\\n\" << FormatDeathTestOutput(error_message);\n        }\n      } else {\n        buffer << \"    Result: died but not with expected exit code:\\n\"\n               << \"            \" << ExitSummary(status()) << \"\\n\"\n               << \"Actual msg:\\n\" << FormatDeathTestOutput(error_message);\n      }\n      break;\n    case IN_PROGRESS:\n    default:\n      GTEST_LOG_(FATAL)\n          << \"DeathTest::Passed somehow called before conclusion of test\";\n  }\n\n  DeathTest::set_last_death_test_message(buffer.GetString());\n  return success;\n}\n\n# if GTEST_OS_WINDOWS\n// WindowsDeathTest implements death tests on Windows. Due to the\n// specifics of starting new processes on Windows, death tests there are\n// always threadsafe, and Google Test considers the\n// --gtest_death_test_style=fast setting to be equivalent to\n// --gtest_death_test_style=threadsafe there.\n//\n// A few implementation notes:  Like the Linux version, the Windows\n// implementation uses pipes for child-to-parent communication. But due to\n// the specifics of pipes on Windows, some extra steps are required:\n//\n// 1. The parent creates a communication pipe and stores handles to both\n//    ends of it.\n// 2. The parent starts the child and provides it with the information\n//    necessary to acquire the handle to the write end of the pipe.\n// 3. The child acquires the write end of the pipe and signals the parent\n//    using a Windows event.\n// 4. Now the parent can release the write end of the pipe on its side. If\n//    this is done before step 3, the object's reference count goes down to\n//    0 and it is destroyed, preventing the child from acquiring it. The\n//    parent now has to release it, or read operations on the read end of\n//    the pipe will not return when the child terminates.\n// 5. The parent reads child's output through the pipe (outcome code and\n//    any possible error messages) from the pipe, and its stderr and then\n//    determines whether to fail the test.\n//\n// Note: to distinguish Win32 API calls from the local method and function\n// calls, the former are explicitly resolved in the global namespace.\n//\nclass WindowsDeathTest : public DeathTestImpl {\n public:\n  WindowsDeathTest(const char* a_statement,\n                   const RE* a_regex,\n                   const char* file,\n                   int line)\n      : DeathTestImpl(a_statement, a_regex), file_(file), line_(line) {}\n\n  // All of these virtual functions are inherited from DeathTest.\n  virtual int Wait();\n  virtual TestRole AssumeRole();\n\n private:\n  // The name of the file in which the death test is located.\n  const char* const file_;\n  // The line number on which the death test is located.\n  const int line_;\n  // Handle to the write end of the pipe to the child process.\n  AutoHandle write_handle_;\n  // Child process handle.\n  AutoHandle child_handle_;\n  // Event the child process uses to signal the parent that it has\n  // acquired the handle to the write end of the pipe. After seeing this\n  // event the parent can release its own handles to make sure its\n  // ReadFile() calls return when the child terminates.\n  AutoHandle event_handle_;\n};\n\n// Waits for the child in a death test to exit, returning its exit\n// status, or 0 if no child process exists.  As a side effect, sets the\n// outcome data member.\nint WindowsDeathTest::Wait() {\n  if (!spawned())\n    return 0;\n\n  // Wait until the child either signals that it has acquired the write end\n  // of the pipe or it dies.\n  const HANDLE wait_handles[2] = { child_handle_.Get(), event_handle_.Get() };\n  switch (::WaitForMultipleObjects(2,\n                                   wait_handles,\n                                   FALSE,  // Waits for any of the handles.\n                                   INFINITE)) {\n    case WAIT_OBJECT_0:\n    case WAIT_OBJECT_0 + 1:\n      break;\n    default:\n      GTEST_DEATH_TEST_CHECK_(false);  // Should not get here.\n  }\n\n  // The child has acquired the write end of the pipe or exited.\n  // We release the handle on our side and continue.\n  write_handle_.Reset();\n  event_handle_.Reset();\n\n  ReadAndInterpretStatusByte();\n\n  // Waits for the child process to exit if it haven't already. This\n  // returns immediately if the child has already exited, regardless of\n  // whether previous calls to WaitForMultipleObjects synchronized on this\n  // handle or not.\n  GTEST_DEATH_TEST_CHECK_(\n      WAIT_OBJECT_0 == ::WaitForSingleObject(child_handle_.Get(),\n                                             INFINITE));\n  DWORD status_code;\n  GTEST_DEATH_TEST_CHECK_(\n      ::GetExitCodeProcess(child_handle_.Get(), &status_code) != FALSE);\n  child_handle_.Reset();\n  set_status(static_cast<int>(status_code));\n  return status();\n}\n\n// The AssumeRole process for a Windows death test.  It creates a child\n// process with the same executable as the current process to run the\n// death test.  The child process is given the --gtest_filter and\n// --gtest_internal_run_death_test flags such that it knows to run the\n// current death test only.\nDeathTest::TestRole WindowsDeathTest::AssumeRole() {\n  const UnitTestImpl* const impl = GetUnitTestImpl();\n  const InternalRunDeathTestFlag* const flag =\n      impl->internal_run_death_test_flag();\n  const TestInfo* const info = impl->current_test_info();\n  const int death_test_index = info->result()->death_test_count();\n\n  if (flag != NULL) {\n    // ParseInternalRunDeathTestFlag() has performed all the necessary\n    // processing.\n    set_write_fd(flag->write_fd());\n    return EXECUTE_TEST;\n  }\n\n  // WindowsDeathTest uses an anonymous pipe to communicate results of\n  // a death test.\n  SECURITY_ATTRIBUTES handles_are_inheritable = {\n    sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };\n  HANDLE read_handle, write_handle;\n  GTEST_DEATH_TEST_CHECK_(\n      ::CreatePipe(&read_handle, &write_handle, &handles_are_inheritable,\n                   0)  // Default buffer size.\n      != FALSE);\n  set_read_fd(::_open_osfhandle(reinterpret_cast<intptr_t>(read_handle),\n                                O_RDONLY));\n  write_handle_.Reset(write_handle);\n  event_handle_.Reset(::CreateEvent(\n      &handles_are_inheritable,\n      TRUE,    // The event will automatically reset to non-signaled state.\n      FALSE,   // The initial state is non-signalled.\n      NULL));  // The even is unnamed.\n  GTEST_DEATH_TEST_CHECK_(event_handle_.Get() != NULL);\n  const String filter_flag = String::Format(\"--%s%s=%s.%s\",\n                                            GTEST_FLAG_PREFIX_, kFilterFlag,\n                                            info->test_case_name(),\n                                            info->name());\n  const String internal_flag = String::Format(\n    \"--%s%s=%s|%d|%d|%u|%Iu|%Iu\",\n      GTEST_FLAG_PREFIX_,\n      kInternalRunDeathTestFlag,\n      file_, line_,\n      death_test_index,\n      static_cast<unsigned int>(::GetCurrentProcessId()),\n      // size_t has the same with as pointers on both 32-bit and 64-bit\n      // Windows platforms.\n      // See http://msdn.microsoft.com/en-us/library/tcxf1dw6.aspx.\n      reinterpret_cast<size_t>(write_handle),\n      reinterpret_cast<size_t>(event_handle_.Get()));\n\n  char executable_path[_MAX_PATH + 1];  // NOLINT\n  GTEST_DEATH_TEST_CHECK_(\n      _MAX_PATH + 1 != ::GetModuleFileNameA(NULL,\n                                            executable_path,\n                                            _MAX_PATH));\n\n  String command_line = String::Format(\"%s %s \\\"%s\\\"\",\n                                       ::GetCommandLineA(),\n                                       filter_flag.c_str(),\n                                       internal_flag.c_str());\n\n  DeathTest::set_last_death_test_message(\"\");\n\n  CaptureStderr();\n  // Flush the log buffers since the log streams are shared with the child.\n  FlushInfoLog();\n\n  // The child process will share the standard handles with the parent.\n  STARTUPINFOA startup_info;\n  memset(&startup_info, 0, sizeof(STARTUPINFO));\n  startup_info.dwFlags = STARTF_USESTDHANDLES;\n  startup_info.hStdInput = ::GetStdHandle(STD_INPUT_HANDLE);\n  startup_info.hStdOutput = ::GetStdHandle(STD_OUTPUT_HANDLE);\n  startup_info.hStdError = ::GetStdHandle(STD_ERROR_HANDLE);\n\n  PROCESS_INFORMATION process_info;\n  GTEST_DEATH_TEST_CHECK_(::CreateProcessA(\n      executable_path,\n      const_cast<char*>(command_line.c_str()),\n      NULL,   // Retuned process handle is not inheritable.\n      NULL,   // Retuned thread handle is not inheritable.\n      TRUE,   // Child inherits all inheritable handles (for write_handle_).\n      0x0,    // Default creation flags.\n      NULL,   // Inherit the parent's environment.\n      UnitTest::GetInstance()->original_working_dir(),\n      &startup_info,\n      &process_info) != FALSE);\n  child_handle_.Reset(process_info.hProcess);\n  ::CloseHandle(process_info.hThread);\n  set_spawned(true);\n  return OVERSEE_TEST;\n}\n# else  // We are not on Windows.\n\n// ForkingDeathTest provides implementations for most of the abstract\n// methods of the DeathTest interface.  Only the AssumeRole method is\n// left undefined.\nclass ForkingDeathTest : public DeathTestImpl {\n public:\n  ForkingDeathTest(const char* statement, const RE* regex);\n\n  // All of these virtual functions are inherited from DeathTest.\n  virtual int Wait();\n\n protected:\n  void set_child_pid(pid_t child_pid) { child_pid_ = child_pid; }\n\n private:\n  // PID of child process during death test; 0 in the child process itself.\n  pid_t child_pid_;\n};\n\n// Constructs a ForkingDeathTest.\nForkingDeathTest::ForkingDeathTest(const char* a_statement, const RE* a_regex)\n    : DeathTestImpl(a_statement, a_regex),\n      child_pid_(-1) {}\n\n// Waits for the child in a death test to exit, returning its exit\n// status, or 0 if no child process exists.  As a side effect, sets the\n// outcome data member.\nint ForkingDeathTest::Wait() {\n  if (!spawned())\n    return 0;\n\n  ReadAndInterpretStatusByte();\n\n  int status_value;\n  GTEST_DEATH_TEST_CHECK_SYSCALL_(waitpid(child_pid_, &status_value, 0));\n  set_status(status_value);\n  return status_value;\n}\n\n// A concrete death test class that forks, then immediately runs the test\n// in the child process.\nclass NoExecDeathTest : public ForkingDeathTest {\n public:\n  NoExecDeathTest(const char* a_statement, const RE* a_regex) :\n      ForkingDeathTest(a_statement, a_regex) { }\n  virtual TestRole AssumeRole();\n};\n\n// The AssumeRole process for a fork-and-run death test.  It implements a\n// straightforward fork, with a simple pipe to transmit the status byte.\nDeathTest::TestRole NoExecDeathTest::AssumeRole() {\n  const size_t thread_count = GetThreadCount();\n  if (thread_count != 1) {\n    GTEST_LOG_(WARNING) << DeathTestThreadWarning(thread_count);\n  }\n\n  int pipe_fd[2];\n  GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1);\n\n  DeathTest::set_last_death_test_message(\"\");\n  CaptureStderr();\n  // When we fork the process below, the log file buffers are copied, but the\n  // file descriptors are shared.  We flush all log files here so that closing\n  // the file descriptors in the child process doesn't throw off the\n  // synchronization between descriptors and buffers in the parent process.\n  // This is as close to the fork as possible to avoid a race condition in case\n  // there are multiple threads running before the death test, and another\n  // thread writes to the log file.\n  FlushInfoLog();\n\n  const pid_t child_pid = fork();\n  GTEST_DEATH_TEST_CHECK_(child_pid != -1);\n  set_child_pid(child_pid);\n  if (child_pid == 0) {\n    GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[0]));\n    set_write_fd(pipe_fd[1]);\n    // Redirects all logging to stderr in the child process to prevent\n    // concurrent writes to the log files.  We capture stderr in the parent\n    // process and append the child process' output to a log.\n    LogToStderr();\n    // Event forwarding to the listeners of event listener API mush be shut\n    // down in death test subprocesses.\n    GetUnitTestImpl()->listeners()->SuppressEventForwarding();\n    return EXECUTE_TEST;\n  } else {\n    GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));\n    set_read_fd(pipe_fd[0]);\n    set_spawned(true);\n    return OVERSEE_TEST;\n  }\n}\n\n// A concrete death test class that forks and re-executes the main\n// program from the beginning, with command-line flags set that cause\n// only this specific death test to be run.\nclass ExecDeathTest : public ForkingDeathTest {\n public:\n  ExecDeathTest(const char* a_statement, const RE* a_regex,\n                const char* file, int line) :\n      ForkingDeathTest(a_statement, a_regex), file_(file), line_(line) { }\n  virtual TestRole AssumeRole();\n private:\n  // The name of the file in which the death test is located.\n  const char* const file_;\n  // The line number on which the death test is located.\n  const int line_;\n};\n\n// Utility class for accumulating command-line arguments.\nclass Arguments {\n public:\n  Arguments() {\n    args_.push_back(NULL);\n  }\n\n  ~Arguments() {\n    for (std::vector<char*>::iterator i = args_.begin(); i != args_.end();\n         ++i) {\n      free(*i);\n    }\n  }\n  void AddArgument(const char* argument) {\n    args_.insert(args_.end() - 1, posix::StrDup(argument));\n  }\n\n  template <typename Str>\n  void AddArguments(const ::std::vector<Str>& arguments) {\n    for (typename ::std::vector<Str>::const_iterator i = arguments.begin();\n         i != arguments.end();\n         ++i) {\n      args_.insert(args_.end() - 1, posix::StrDup(i->c_str()));\n    }\n  }\n  char* const* Argv() {\n    return &args_[0];\n  }\n private:\n  std::vector<char*> args_;\n};\n\n// A struct that encompasses the arguments to the child process of a\n// threadsafe-style death test process.\nstruct ExecDeathTestArgs {\n  char* const* argv;  // Command-line arguments for the child's call to exec\n  int close_fd;       // File descriptor to close; the read end of a pipe\n};\n\n#  if GTEST_OS_MAC\ninline char** GetEnviron() {\n  // When Google Test is built as a framework on MacOS X, the environ variable\n  // is unavailable. Apple's documentation (man environ) recommends using\n  // _NSGetEnviron() instead.\n  return *_NSGetEnviron();\n}\n#  else\n// Some POSIX platforms expect you to declare environ. extern \"C\" makes\n// it reside in the global namespace.\nextern \"C\" char** environ;\ninline char** GetEnviron() { return environ; }\n#  endif  // GTEST_OS_MAC\n\n// The main function for a threadsafe-style death test child process.\n// This function is called in a clone()-ed process and thus must avoid\n// any potentially unsafe operations like malloc or libc functions.\nstatic int ExecDeathTestChildMain(void* child_arg) {\n  ExecDeathTestArgs* const args = static_cast<ExecDeathTestArgs*>(child_arg);\n  GTEST_DEATH_TEST_CHECK_SYSCALL_(close(args->close_fd));\n\n  // We need to execute the test program in the same environment where\n  // it was originally invoked.  Therefore we change to the original\n  // working directory first.\n  const char* const original_dir =\n      UnitTest::GetInstance()->original_working_dir();\n  // We can safely call chdir() as it's a direct system call.\n  if (chdir(original_dir) != 0) {\n    DeathTestAbort(String::Format(\"chdir(\\\"%s\\\") failed: %s\",\n                                  original_dir,\n                                  GetLastErrnoDescription().c_str()));\n    return EXIT_FAILURE;\n  }\n\n  // We can safely call execve() as it's a direct system call.  We\n  // cannot use execvp() as it's a libc function and thus potentially\n  // unsafe.  Since execve() doesn't search the PATH, the user must\n  // invoke the test program via a valid path that contains at least\n  // one path separator.\n  execve(args->argv[0], args->argv, GetEnviron());\n  DeathTestAbort(String::Format(\"execve(%s, ...) in %s failed: %s\",\n                                args->argv[0],\n                                original_dir,\n                                GetLastErrnoDescription().c_str()));\n  return EXIT_FAILURE;\n}\n\n// Two utility routines that together determine the direction the stack\n// grows.\n// This could be accomplished more elegantly by a single recursive\n// function, but we want to guard against the unlikely possibility of\n// a smart compiler optimizing the recursion away.\n//\n// GTEST_NO_INLINE_ is required to prevent GCC 4.6 from inlining\n// StackLowerThanAddress into StackGrowsDown, which then doesn't give\n// correct answer.\nbool StackLowerThanAddress(const void* ptr) GTEST_NO_INLINE_;\nbool StackLowerThanAddress(const void* ptr) {\n  int dummy;\n  return &dummy < ptr;\n}\n\nbool StackGrowsDown() {\n  int dummy;\n  return StackLowerThanAddress(&dummy);\n}\n\n// A threadsafe implementation of fork(2) for threadsafe-style death tests\n// that uses clone(2).  It dies with an error message if anything goes\n// wrong.\nstatic pid_t ExecDeathTestFork(char* const* argv, int close_fd) {\n  ExecDeathTestArgs args = { argv, close_fd };\n  pid_t child_pid = -1;\n\n#  if GTEST_HAS_CLONE\n  const bool use_fork = GTEST_FLAG(death_test_use_fork);\n\n  if (!use_fork) {\n    static const bool stack_grows_down = StackGrowsDown();\n    const size_t stack_size = getpagesize();\n    // MMAP_ANONYMOUS is not defined on Mac, so we use MAP_ANON instead.\n    void* const stack = mmap(NULL, stack_size, PROT_READ | PROT_WRITE,\n                             MAP_ANON | MAP_PRIVATE, -1, 0);\n    GTEST_DEATH_TEST_CHECK_(stack != MAP_FAILED);\n    void* const stack_top =\n        static_cast<char*>(stack) + (stack_grows_down ? stack_size : 0);\n\n    child_pid = clone(&ExecDeathTestChildMain, stack_top, SIGCHLD, &args);\n\n    GTEST_DEATH_TEST_CHECK_(munmap(stack, stack_size) != -1);\n  }\n#  else\n  const bool use_fork = true;\n#  endif  // GTEST_HAS_CLONE\n\n  if (use_fork && (child_pid = fork()) == 0) {\n      ExecDeathTestChildMain(&args);\n      _exit(0);\n  }\n\n  GTEST_DEATH_TEST_CHECK_(child_pid != -1);\n  return child_pid;\n}\n\n// The AssumeRole process for a fork-and-exec death test.  It re-executes the\n// main program from the beginning, setting the --gtest_filter\n// and --gtest_internal_run_death_test flags to cause only the current\n// death test to be re-run.\nDeathTest::TestRole ExecDeathTest::AssumeRole() {\n  const UnitTestImpl* const impl = GetUnitTestImpl();\n  const InternalRunDeathTestFlag* const flag =\n      impl->internal_run_death_test_flag();\n  const TestInfo* const info = impl->current_test_info();\n  const int death_test_index = info->result()->death_test_count();\n\n  if (flag != NULL) {\n    set_write_fd(flag->write_fd());\n    return EXECUTE_TEST;\n  }\n\n  int pipe_fd[2];\n  GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1);\n  // Clear the close-on-exec flag on the write end of the pipe, lest\n  // it be closed when the child process does an exec:\n  GTEST_DEATH_TEST_CHECK_(fcntl(pipe_fd[1], F_SETFD, 0) != -1);\n\n  const String filter_flag =\n      String::Format(\"--%s%s=%s.%s\",\n                     GTEST_FLAG_PREFIX_, kFilterFlag,\n                     info->test_case_name(), info->name());\n  const String internal_flag =\n      String::Format(\"--%s%s=%s|%d|%d|%d\",\n                     GTEST_FLAG_PREFIX_, kInternalRunDeathTestFlag,\n                     file_, line_, death_test_index, pipe_fd[1]);\n  Arguments args;\n  args.AddArguments(GetArgvs());\n  args.AddArgument(filter_flag.c_str());\n  args.AddArgument(internal_flag.c_str());\n\n  DeathTest::set_last_death_test_message(\"\");\n\n  CaptureStderr();\n  // See the comment in NoExecDeathTest::AssumeRole for why the next line\n  // is necessary.\n  FlushInfoLog();\n\n  const pid_t child_pid = ExecDeathTestFork(args.Argv(), pipe_fd[0]);\n  GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));\n  set_child_pid(child_pid);\n  set_read_fd(pipe_fd[0]);\n  set_spawned(true);\n  return OVERSEE_TEST;\n}\n\n# endif  // !GTEST_OS_WINDOWS\n\n// Creates a concrete DeathTest-derived class that depends on the\n// --gtest_death_test_style flag, and sets the pointer pointed to\n// by the \"test\" argument to its address.  If the test should be\n// skipped, sets that pointer to NULL.  Returns true, unless the\n// flag is set to an invalid value.\nbool DefaultDeathTestFactory::Create(const char* statement, const RE* regex,\n                                     const char* file, int line,\n                                     DeathTest** test) {\n  UnitTestImpl* const impl = GetUnitTestImpl();\n  const InternalRunDeathTestFlag* const flag =\n      impl->internal_run_death_test_flag();\n  const int death_test_index = impl->current_test_info()\n      ->increment_death_test_count();\n\n  if (flag != NULL) {\n    if (death_test_index > flag->index()) {\n      DeathTest::set_last_death_test_message(String::Format(\n          \"Death test count (%d) somehow exceeded expected maximum (%d)\",\n          death_test_index, flag->index()));\n      return false;\n    }\n\n    if (!(flag->file() == file && flag->line() == line &&\n          flag->index() == death_test_index)) {\n      *test = NULL;\n      return true;\n    }\n  }\n\n# if GTEST_OS_WINDOWS\n\n  if (GTEST_FLAG(death_test_style) == \"threadsafe\" ||\n      GTEST_FLAG(death_test_style) == \"fast\") {\n    *test = new WindowsDeathTest(statement, regex, file, line);\n  }\n\n# else\n\n  if (GTEST_FLAG(death_test_style) == \"threadsafe\") {\n    *test = new ExecDeathTest(statement, regex, file, line);\n  } else if (GTEST_FLAG(death_test_style) == \"fast\") {\n    *test = new NoExecDeathTest(statement, regex);\n  }\n\n# endif  // GTEST_OS_WINDOWS\n\n  else {  // NOLINT - this is more readable than unbalanced brackets inside #if.\n    DeathTest::set_last_death_test_message(String::Format(\n        \"Unknown death test style \\\"%s\\\" encountered\",\n        GTEST_FLAG(death_test_style).c_str()));\n    return false;\n  }\n\n  return true;\n}\n\n// Splits a given string on a given delimiter, populating a given\n// vector with the fields.  GTEST_HAS_DEATH_TEST implies that we have\n// ::std::string, so we can use it here.\nstatic void SplitString(const ::std::string& str, char delimiter,\n                        ::std::vector< ::std::string>* dest) {\n  ::std::vector< ::std::string> parsed;\n  ::std::string::size_type pos = 0;\n  while (::testing::internal::AlwaysTrue()) {\n    const ::std::string::size_type colon = str.find(delimiter, pos);\n    if (colon == ::std::string::npos) {\n      parsed.push_back(str.substr(pos));\n      break;\n    } else {\n      parsed.push_back(str.substr(pos, colon - pos));\n      pos = colon + 1;\n    }\n  }\n  dest->swap(parsed);\n}\n\n# if GTEST_OS_WINDOWS\n// Recreates the pipe and event handles from the provided parameters,\n// signals the event, and returns a file descriptor wrapped around the pipe\n// handle. This function is called in the child process only.\nint GetStatusFileDescriptor(unsigned int parent_process_id,\n                            size_t write_handle_as_size_t,\n                            size_t event_handle_as_size_t) {\n  AutoHandle parent_process_handle(::OpenProcess(PROCESS_DUP_HANDLE,\n                                                   FALSE,  // Non-inheritable.\n                                                   parent_process_id));\n  if (parent_process_handle.Get() == INVALID_HANDLE_VALUE) {\n    DeathTestAbort(String::Format(\"Unable to open parent process %u\",\n                                  parent_process_id));\n  }\n\n  // TODO(vladl@google.com): Replace the following check with a\n  // compile-time assertion when available.\n  GTEST_CHECK_(sizeof(HANDLE) <= sizeof(size_t));\n\n  const HANDLE write_handle =\n      reinterpret_cast<HANDLE>(write_handle_as_size_t);\n  HANDLE dup_write_handle;\n\n  // The newly initialized handle is accessible only in in the parent\n  // process. To obtain one accessible within the child, we need to use\n  // DuplicateHandle.\n  if (!::DuplicateHandle(parent_process_handle.Get(), write_handle,\n                         ::GetCurrentProcess(), &dup_write_handle,\n                         0x0,    // Requested privileges ignored since\n                                 // DUPLICATE_SAME_ACCESS is used.\n                         FALSE,  // Request non-inheritable handler.\n                         DUPLICATE_SAME_ACCESS)) {\n    DeathTestAbort(String::Format(\n        \"Unable to duplicate the pipe handle %Iu from the parent process %u\",\n        write_handle_as_size_t, parent_process_id));\n  }\n\n  const HANDLE event_handle = reinterpret_cast<HANDLE>(event_handle_as_size_t);\n  HANDLE dup_event_handle;\n\n  if (!::DuplicateHandle(parent_process_handle.Get(), event_handle,\n                         ::GetCurrentProcess(), &dup_event_handle,\n                         0x0,\n                         FALSE,\n                         DUPLICATE_SAME_ACCESS)) {\n    DeathTestAbort(String::Format(\n        \"Unable to duplicate the event handle %Iu from the parent process %u\",\n        event_handle_as_size_t, parent_process_id));\n  }\n\n  const int write_fd =\n      ::_open_osfhandle(reinterpret_cast<intptr_t>(dup_write_handle), O_APPEND);\n  if (write_fd == -1) {\n    DeathTestAbort(String::Format(\n        \"Unable to convert pipe handle %Iu to a file descriptor\",\n        write_handle_as_size_t));\n  }\n\n  // Signals the parent that the write end of the pipe has been acquired\n  // so the parent can release its own write end.\n  ::SetEvent(dup_event_handle);\n\n  return write_fd;\n}\n# endif  // GTEST_OS_WINDOWS\n\n// Returns a newly created InternalRunDeathTestFlag object with fields\n// initialized from the GTEST_FLAG(internal_run_death_test) flag if\n// the flag is specified; otherwise returns NULL.\nInternalRunDeathTestFlag* ParseInternalRunDeathTestFlag() {\n  if (GTEST_FLAG(internal_run_death_test) == \"\") return NULL;\n\n  // GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we\n  // can use it here.\n  int line = -1;\n  int index = -1;\n  ::std::vector< ::std::string> fields;\n  SplitString(GTEST_FLAG(internal_run_death_test).c_str(), '|', &fields);\n  int write_fd = -1;\n\n# if GTEST_OS_WINDOWS\n\n  unsigned int parent_process_id = 0;\n  size_t write_handle_as_size_t = 0;\n  size_t event_handle_as_size_t = 0;\n\n  if (fields.size() != 6\n      || !ParseNaturalNumber(fields[1], &line)\n      || !ParseNaturalNumber(fields[2], &index)\n      || !ParseNaturalNumber(fields[3], &parent_process_id)\n      || !ParseNaturalNumber(fields[4], &write_handle_as_size_t)\n      || !ParseNaturalNumber(fields[5], &event_handle_as_size_t)) {\n    DeathTestAbort(String::Format(\n        \"Bad --gtest_internal_run_death_test flag: %s\",\n        GTEST_FLAG(internal_run_death_test).c_str()));\n  }\n  write_fd = GetStatusFileDescriptor(parent_process_id,\n                                     write_handle_as_size_t,\n                                     event_handle_as_size_t);\n# else\n\n  if (fields.size() != 4\n      || !ParseNaturalNumber(fields[1], &line)\n      || !ParseNaturalNumber(fields[2], &index)\n      || !ParseNaturalNumber(fields[3], &write_fd)) {\n    DeathTestAbort(String::Format(\n        \"Bad --gtest_internal_run_death_test flag: %s\",\n        GTEST_FLAG(internal_run_death_test).c_str()));\n  }\n\n# endif  // GTEST_OS_WINDOWS\n\n  return new InternalRunDeathTestFlag(fields[0], line, index, write_fd);\n}\n\n}  // namespace internal\n\n#endif  // GTEST_HAS_DEATH_TEST\n\n}  // namespace testing\n// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Authors: keith.ray@gmail.com (Keith Ray)\n\n\n#include <stdlib.h>\n\n#if GTEST_OS_WINDOWS_MOBILE\n# include <windows.h>\n#elif GTEST_OS_WINDOWS\n# include <direct.h>\n# include <io.h>\n#elif GTEST_OS_SYMBIAN || GTEST_OS_NACL\n// Symbian OpenC and NaCl have PATH_MAX in sys/syslimits.h\n# include <sys/syslimits.h>\n#else\n# include <limits.h>\n# include <climits>  // Some Linux distributions define PATH_MAX here.\n#endif  // GTEST_OS_WINDOWS_MOBILE\n\n#if GTEST_OS_WINDOWS\n# define GTEST_PATH_MAX_ _MAX_PATH\n#elif defined(PATH_MAX)\n# define GTEST_PATH_MAX_ PATH_MAX\n#elif defined(_XOPEN_PATH_MAX)\n# define GTEST_PATH_MAX_ _XOPEN_PATH_MAX\n#else\n# define GTEST_PATH_MAX_ _POSIX_PATH_MAX\n#endif  // GTEST_OS_WINDOWS\n\n\nnamespace testing {\nnamespace internal {\n\n#if GTEST_OS_WINDOWS\n// On Windows, '\\\\' is the standard path separator, but many tools and the\n// Windows API also accept '/' as an alternate path separator. Unless otherwise\n// noted, a file path can contain either kind of path separators, or a mixture\n// of them.\nconst char kPathSeparator = '\\\\';\nconst char kAlternatePathSeparator = '/';\nconst char kPathSeparatorString[] = \"\\\\\";\nconst char kAlternatePathSeparatorString[] = \"/\";\n# if GTEST_OS_WINDOWS_MOBILE\n// Windows CE doesn't have a current directory. You should not use\n// the current directory in tests on Windows CE, but this at least\n// provides a reasonable fallback.\nconst char kCurrentDirectoryString[] = \"\\\\\";\n// Windows CE doesn't define INVALID_FILE_ATTRIBUTES\nconst DWORD kInvalidFileAttributes = 0xffffffff;\n# else\nconst char kCurrentDirectoryString[] = \".\\\\\";\n# endif  // GTEST_OS_WINDOWS_MOBILE\n#else\nconst char kPathSeparator = '/';\nconst char kPathSeparatorString[] = \"/\";\nconst char kCurrentDirectoryString[] = \"./\";\n#endif  // GTEST_OS_WINDOWS\n\n// Returns whether the given character is a valid path separator.\nstatic bool IsPathSeparator(char c) {\n#if GTEST_HAS_ALT_PATH_SEP_\n  return (c == kPathSeparator) || (c == kAlternatePathSeparator);\n#else\n  return c == kPathSeparator;\n#endif\n}\n\n// Returns the current working directory, or \"\" if unsuccessful.\nFilePath FilePath::GetCurrentDir() {\n#if GTEST_OS_WINDOWS_MOBILE\n  // Windows CE doesn't have a current directory, so we just return\n  // something reasonable.\n  return FilePath(kCurrentDirectoryString);\n#elif GTEST_OS_WINDOWS\n  char cwd[GTEST_PATH_MAX_ + 1] = { '\\0' };\n  return FilePath(_getcwd(cwd, sizeof(cwd)) == NULL ? \"\" : cwd);\n#else\n  char cwd[GTEST_PATH_MAX_ + 1] = { '\\0' };\n  return FilePath(getcwd(cwd, sizeof(cwd)) == NULL ? \"\" : cwd);\n#endif  // GTEST_OS_WINDOWS_MOBILE\n}\n\n// Returns a copy of the FilePath with the case-insensitive extension removed.\n// Example: FilePath(\"dir/file.exe\").RemoveExtension(\"EXE\") returns\n// FilePath(\"dir/file\"). If a case-insensitive extension is not\n// found, returns a copy of the original FilePath.\nFilePath FilePath::RemoveExtension(const char* extension) const {\n  String dot_extension(String::Format(\".%s\", extension));\n  if (pathname_.EndsWithCaseInsensitive(dot_extension.c_str())) {\n    return FilePath(String(pathname_.c_str(), pathname_.length() - 4));\n  }\n  return *this;\n}\n\n// Returns a pointer to the last occurence of a valid path separator in\n// the FilePath. On Windows, for example, both '/' and '\\' are valid path\n// separators. Returns NULL if no path separator was found.\nconst char* FilePath::FindLastPathSeparator() const {\n  const char* const last_sep = strrchr(c_str(), kPathSeparator);\n#if GTEST_HAS_ALT_PATH_SEP_\n  const char* const last_alt_sep = strrchr(c_str(), kAlternatePathSeparator);\n  // Comparing two pointers of which only one is NULL is undefined.\n  if (last_alt_sep != NULL &&\n      (last_sep == NULL || last_alt_sep > last_sep)) {\n    return last_alt_sep;\n  }\n#endif\n  return last_sep;\n}\n\n// Returns a copy of the FilePath with the directory part removed.\n// Example: FilePath(\"path/to/file\").RemoveDirectoryName() returns\n// FilePath(\"file\"). If there is no directory part (\"just_a_file\"), it returns\n// the FilePath unmodified. If there is no file part (\"just_a_dir/\") it\n// returns an empty FilePath (\"\").\n// On Windows platform, '\\' is the path separator, otherwise it is '/'.\nFilePath FilePath::RemoveDirectoryName() const {\n  const char* const last_sep = FindLastPathSeparator();\n  return last_sep ? FilePath(String(last_sep + 1)) : *this;\n}\n\n// RemoveFileName returns the directory path with the filename removed.\n// Example: FilePath(\"path/to/file\").RemoveFileName() returns \"path/to/\".\n// If the FilePath is \"a_file\" or \"/a_file\", RemoveFileName returns\n// FilePath(\"./\") or, on Windows, FilePath(\".\\\\\"). If the filepath does\n// not have a file, like \"just/a/dir/\", it returns the FilePath unmodified.\n// On Windows platform, '\\' is the path separator, otherwise it is '/'.\nFilePath FilePath::RemoveFileName() const {\n  const char* const last_sep = FindLastPathSeparator();\n  String dir;\n  if (last_sep) {\n    dir = String(c_str(), last_sep + 1 - c_str());\n  } else {\n    dir = kCurrentDirectoryString;\n  }\n  return FilePath(dir);\n}\n\n// Helper functions for naming files in a directory for xml output.\n\n// Given directory = \"dir\", base_name = \"test\", number = 0,\n// extension = \"xml\", returns \"dir/test.xml\". If number is greater\n// than zero (e.g., 12), returns \"dir/test_12.xml\".\n// On Windows platform, uses \\ as the separator rather than /.\nFilePath FilePath::MakeFileName(const FilePath& directory,\n                                const FilePath& base_name,\n                                int number,\n                                const char* extension) {\n  String file;\n  if (number == 0) {\n    file = String::Format(\"%s.%s\", base_name.c_str(), extension);\n  } else {\n    file = String::Format(\"%s_%d.%s\", base_name.c_str(), number, extension);\n  }\n  return ConcatPaths(directory, FilePath(file));\n}\n\n// Given directory = \"dir\", relative_path = \"test.xml\", returns \"dir/test.xml\".\n// On Windows, uses \\ as the separator rather than /.\nFilePath FilePath::ConcatPaths(const FilePath& directory,\n                               const FilePath& relative_path) {\n  if (directory.IsEmpty())\n    return relative_path;\n  const FilePath dir(directory.RemoveTrailingPathSeparator());\n  return FilePath(String::Format(\"%s%c%s\", dir.c_str(), kPathSeparator,\n                                 relative_path.c_str()));\n}\n\n// Returns true if pathname describes something findable in the file-system,\n// either a file, directory, or whatever.\nbool FilePath::FileOrDirectoryExists() const {\n#if GTEST_OS_WINDOWS_MOBILE\n  LPCWSTR unicode = String::AnsiToUtf16(pathname_.c_str());\n  const DWORD attributes = GetFileAttributes(unicode);\n  delete [] unicode;\n  return attributes != kInvalidFileAttributes;\n#else\n  posix::StatStruct file_stat;\n  return posix::Stat(pathname_.c_str(), &file_stat) == 0;\n#endif  // GTEST_OS_WINDOWS_MOBILE\n}\n\n// Returns true if pathname describes a directory in the file-system\n// that exists.\nbool FilePath::DirectoryExists() const {\n  bool result = false;\n#if GTEST_OS_WINDOWS\n  // Don't strip off trailing separator if path is a root directory on\n  // Windows (like \"C:\\\\\").\n  const FilePath& path(IsRootDirectory() ? *this :\n                                           RemoveTrailingPathSeparator());\n#else\n  const FilePath& path(*this);\n#endif\n\n#if GTEST_OS_WINDOWS_MOBILE\n  LPCWSTR unicode = String::AnsiToUtf16(path.c_str());\n  const DWORD attributes = GetFileAttributes(unicode);\n  delete [] unicode;\n  if ((attributes != kInvalidFileAttributes) &&\n      (attributes & FILE_ATTRIBUTE_DIRECTORY)) {\n    result = true;\n  }\n#else\n  posix::StatStruct file_stat;\n  result = posix::Stat(path.c_str(), &file_stat) == 0 &&\n      posix::IsDir(file_stat);\n#endif  // GTEST_OS_WINDOWS_MOBILE\n\n  return result;\n}\n\n// Returns true if pathname describes a root directory. (Windows has one\n// root directory per disk drive.)\nbool FilePath::IsRootDirectory() const {\n#if GTEST_OS_WINDOWS\n  // TODO(wan@google.com): on Windows a network share like\n  // \\\\server\\share can be a root directory, although it cannot be the\n  // current directory.  Handle this properly.\n  return pathname_.length() == 3 && IsAbsolutePath();\n#else\n  return pathname_.length() == 1 && IsPathSeparator(pathname_.c_str()[0]);\n#endif\n}\n\n// Returns true if pathname describes an absolute path.\nbool FilePath::IsAbsolutePath() const {\n  const char* const name = pathname_.c_str();\n#if GTEST_OS_WINDOWS\n  return pathname_.length() >= 3 &&\n     ((name[0] >= 'a' && name[0] <= 'z') ||\n      (name[0] >= 'A' && name[0] <= 'Z')) &&\n     name[1] == ':' &&\n     IsPathSeparator(name[2]);\n#else\n  return IsPathSeparator(name[0]);\n#endif\n}\n\n// Returns a pathname for a file that does not currently exist. The pathname\n// will be directory/base_name.extension or\n// directory/base_name_<number>.extension if directory/base_name.extension\n// already exists. The number will be incremented until a pathname is found\n// that does not already exist.\n// Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.\n// There could be a race condition if two or more processes are calling this\n// function at the same time -- they could both pick the same filename.\nFilePath FilePath::GenerateUniqueFileName(const FilePath& directory,\n                                          const FilePath& base_name,\n                                          const char* extension) {\n  FilePath full_pathname;\n  int number = 0;\n  do {\n    full_pathname.Set(MakeFileName(directory, base_name, number++, extension));\n  } while (full_pathname.FileOrDirectoryExists());\n  return full_pathname;\n}\n\n// Returns true if FilePath ends with a path separator, which indicates that\n// it is intended to represent a directory. Returns false otherwise.\n// This does NOT check that a directory (or file) actually exists.\nbool FilePath::IsDirectory() const {\n  return !pathname_.empty() &&\n         IsPathSeparator(pathname_.c_str()[pathname_.length() - 1]);\n}\n\n// Create directories so that path exists. Returns true if successful or if\n// the directories already exist; returns false if unable to create directories\n// for any reason.\nbool FilePath::CreateDirectoriesRecursively() const {\n  if (!this->IsDirectory()) {\n    return false;\n  }\n\n  if (pathname_.length() == 0 || this->DirectoryExists()) {\n    return true;\n  }\n\n  const FilePath parent(this->RemoveTrailingPathSeparator().RemoveFileName());\n  return parent.CreateDirectoriesRecursively() && this->CreateFolder();\n}\n\n// Create the directory so that path exists. Returns true if successful or\n// if the directory already exists; returns false if unable to create the\n// directory for any reason, including if the parent directory does not\n// exist. Not named \"CreateDirectory\" because that's a macro on Windows.\nbool FilePath::CreateFolder() const {\n#if GTEST_OS_WINDOWS_MOBILE\n  FilePath removed_sep(this->RemoveTrailingPathSeparator());\n  LPCWSTR unicode = String::AnsiToUtf16(removed_sep.c_str());\n  int result = CreateDirectory(unicode, NULL) ? 0 : -1;\n  delete [] unicode;\n#elif GTEST_OS_WINDOWS\n  int result = _mkdir(pathname_.c_str());\n#else\n  int result = mkdir(pathname_.c_str(), 0777);\n#endif  // GTEST_OS_WINDOWS_MOBILE\n\n  if (result == -1) {\n    return this->DirectoryExists();  // An error is OK if the directory exists.\n  }\n  return true;  // No error.\n}\n\n// If input name has a trailing separator character, remove it and return the\n// name, otherwise return the name string unmodified.\n// On Windows platform, uses \\ as the separator, other platforms use /.\nFilePath FilePath::RemoveTrailingPathSeparator() const {\n  return IsDirectory()\n      ? FilePath(String(pathname_.c_str(), pathname_.length() - 1))\n      : *this;\n}\n\n// Removes any redundant separators that might be in the pathname.\n// For example, \"bar///foo\" becomes \"bar/foo\". Does not eliminate other\n// redundancies that might be in a pathname involving \".\" or \"..\".\n// TODO(wan@google.com): handle Windows network shares (e.g. \\\\server\\share).\nvoid FilePath::Normalize() {\n  if (pathname_.c_str() == NULL) {\n    pathname_ = \"\";\n    return;\n  }\n  const char* src = pathname_.c_str();\n  char* const dest = new char[pathname_.length() + 1];\n  char* dest_ptr = dest;\n  memset(dest_ptr, 0, pathname_.length() + 1);\n\n  while (*src != '\\0') {\n    *dest_ptr = *src;\n    if (!IsPathSeparator(*src)) {\n      src++;\n    } else {\n#if GTEST_HAS_ALT_PATH_SEP_\n      if (*dest_ptr == kAlternatePathSeparator) {\n        *dest_ptr = kPathSeparator;\n      }\n#endif\n      while (IsPathSeparator(*src))\n        src++;\n    }\n    dest_ptr++;\n  }\n  *dest_ptr = '\\0';\n  pathname_ = dest;\n  delete[] dest;\n}\n\n}  // namespace internal\n}  // namespace testing\n// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n\n\n#include <limits.h>\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n\n#if GTEST_OS_WINDOWS_MOBILE\n# include <windows.h>  // For TerminateProcess()\n#elif GTEST_OS_WINDOWS\n# include <io.h>\n# include <sys/stat.h>\n#else\n# include <unistd.h>\n#endif  // GTEST_OS_WINDOWS_MOBILE\n\n#if GTEST_OS_MAC\n# include <mach/mach_init.h>\n# include <mach/task.h>\n# include <mach/vm_map.h>\n#endif  // GTEST_OS_MAC\n\n\n// Indicates that this translation unit is part of Google Test's\n// implementation.  It must come before gtest-internal-inl.h is\n// included, or there will be a compiler error.  This trick is to\n// prevent a user from accidentally including gtest-internal-inl.h in\n// his code.\n#define GTEST_IMPLEMENTATION_ 1\n#undef GTEST_IMPLEMENTATION_\n\nnamespace testing {\nnamespace internal {\n\n#if defined(_MSC_VER) || defined(__BORLANDC__)\n// MSVC and C++Builder do not provide a definition of STDERR_FILENO.\nconst int kStdOutFileno = 1;\nconst int kStdErrFileno = 2;\n#else\nconst int kStdOutFileno = STDOUT_FILENO;\nconst int kStdErrFileno = STDERR_FILENO;\n#endif  // _MSC_VER\n\n#if GTEST_OS_MAC\n\n// Returns the number of threads running in the process, or 0 to indicate that\n// we cannot detect it.\nsize_t GetThreadCount() {\n  const task_t task = mach_task_self();\n  mach_msg_type_number_t thread_count;\n  thread_act_array_t thread_list;\n  const kern_return_t status = task_threads(task, &thread_list, &thread_count);\n  if (status == KERN_SUCCESS) {\n    // task_threads allocates resources in thread_list and we need to free them\n    // to avoid leaks.\n    vm_deallocate(task,\n                  reinterpret_cast<vm_address_t>(thread_list),\n                  sizeof(thread_t) * thread_count);\n    return static_cast<size_t>(thread_count);\n  } else {\n    return 0;\n  }\n}\n\n#else\n\nsize_t GetThreadCount() {\n  // There's no portable way to detect the number of threads, so we just\n  // return 0 to indicate that we cannot detect it.\n  return 0;\n}\n\n#endif  // GTEST_OS_MAC\n\n#if GTEST_USES_POSIX_RE\n\n// Implements RE.  Currently only needed for death tests.\n\nRE::~RE() {\n  if (is_valid_) {\n    // regfree'ing an invalid regex might crash because the content\n    // of the regex is undefined. Since the regex's are essentially\n    // the same, one cannot be valid (or invalid) without the other\n    // being so too.\n    regfree(&partial_regex_);\n    regfree(&full_regex_);\n  }\n  free(const_cast<char*>(pattern_));\n}\n\n// Returns true iff regular expression re matches the entire str.\nbool RE::FullMatch(const char* str, const RE& re) {\n  if (!re.is_valid_) return false;\n\n  regmatch_t match;\n  return regexec(&re.full_regex_, str, 1, &match, 0) == 0;\n}\n\n// Returns true iff regular expression re matches a substring of str\n// (including str itself).\nbool RE::PartialMatch(const char* str, const RE& re) {\n  if (!re.is_valid_) return false;\n\n  regmatch_t match;\n  return regexec(&re.partial_regex_, str, 1, &match, 0) == 0;\n}\n\n// Initializes an RE from its string representation.\nvoid RE::Init(const char* regex) {\n  pattern_ = posix::StrDup(regex);\n\n  // Reserves enough bytes to hold the regular expression used for a\n  // full match.\n  const size_t full_regex_len = strlen(regex) + 10;\n  char* const full_pattern = new char[full_regex_len];\n\n  snprintf(full_pattern, full_regex_len, \"^(%s)$\", regex);\n  is_valid_ = regcomp(&full_regex_, full_pattern, REG_EXTENDED) == 0;\n  // We want to call regcomp(&partial_regex_, ...) even if the\n  // previous expression returns false.  Otherwise partial_regex_ may\n  // not be properly initialized can may cause trouble when it's\n  // freed.\n  //\n  // Some implementation of POSIX regex (e.g. on at least some\n  // versions of Cygwin) doesn't accept the empty string as a valid\n  // regex.  We change it to an equivalent form \"()\" to be safe.\n  if (is_valid_) {\n    const char* const partial_regex = (*regex == '\\0') ? \"()\" : regex;\n    is_valid_ = regcomp(&partial_regex_, partial_regex, REG_EXTENDED) == 0;\n  }\n  EXPECT_TRUE(is_valid_)\n      << \"Regular expression \\\"\" << regex\n      << \"\\\" is not a valid POSIX Extended regular expression.\";\n\n  delete[] full_pattern;\n}\n\n#elif GTEST_USES_SIMPLE_RE\n\n// Returns true iff ch appears anywhere in str (excluding the\n// terminating '\\0' character).\nbool IsInSet(char ch, const char* str) {\n  return ch != '\\0' && strchr(str, ch) != NULL;\n}\n\n// Returns true iff ch belongs to the given classification.  Unlike\n// similar functions in <ctype.h>, these aren't affected by the\n// current locale.\nbool IsAsciiDigit(char ch) { return '0' <= ch && ch <= '9'; }\nbool IsAsciiPunct(char ch) {\n  return IsInSet(ch, \"^-!\\\"#$%&'()*+,./:;<=>?@[\\\\]_`{|}~\");\n}\nbool IsRepeat(char ch) { return IsInSet(ch, \"?*+\"); }\nbool IsAsciiWhiteSpace(char ch) { return IsInSet(ch, \" \\f\\n\\r\\t\\v\"); }\nbool IsAsciiWordChar(char ch) {\n  return ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') ||\n      ('0' <= ch && ch <= '9') || ch == '_';\n}\n\n// Returns true iff \"\\\\c\" is a supported escape sequence.\nbool IsValidEscape(char c) {\n  return (IsAsciiPunct(c) || IsInSet(c, \"dDfnrsStvwW\"));\n}\n\n// Returns true iff the given atom (specified by escaped and pattern)\n// matches ch.  The result is undefined if the atom is invalid.\nbool AtomMatchesChar(bool escaped, char pattern_char, char ch) {\n  if (escaped) {  // \"\\\\p\" where p is pattern_char.\n    switch (pattern_char) {\n      case 'd': return IsAsciiDigit(ch);\n      case 'D': return !IsAsciiDigit(ch);\n      case 'f': return ch == '\\f';\n      case 'n': return ch == '\\n';\n      case 'r': return ch == '\\r';\n      case 's': return IsAsciiWhiteSpace(ch);\n      case 'S': return !IsAsciiWhiteSpace(ch);\n      case 't': return ch == '\\t';\n      case 'v': return ch == '\\v';\n      case 'w': return IsAsciiWordChar(ch);\n      case 'W': return !IsAsciiWordChar(ch);\n    }\n    return IsAsciiPunct(pattern_char) && pattern_char == ch;\n  }\n\n  return (pattern_char == '.' && ch != '\\n') || pattern_char == ch;\n}\n\n// Helper function used by ValidateRegex() to format error messages.\nString FormatRegexSyntaxError(const char* regex, int index) {\n  return (Message() << \"Syntax error at index \" << index\n          << \" in simple regular expression \\\"\" << regex << \"\\\": \").GetString();\n}\n\n// Generates non-fatal failures and returns false if regex is invalid;\n// otherwise returns true.\nbool ValidateRegex(const char* regex) {\n  if (regex == NULL) {\n    // TODO(wan@google.com): fix the source file location in the\n    // assertion failures to match where the regex is used in user\n    // code.\n    ADD_FAILURE() << \"NULL is not a valid simple regular expression.\";\n    return false;\n  }\n\n  bool is_valid = true;\n\n  // True iff ?, *, or + can follow the previous atom.\n  bool prev_repeatable = false;\n  for (int i = 0; regex[i]; i++) {\n    if (regex[i] == '\\\\') {  // An escape sequence\n      i++;\n      if (regex[i] == '\\0') {\n        ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1)\n                      << \"'\\\\' cannot appear at the end.\";\n        return false;\n      }\n\n      if (!IsValidEscape(regex[i])) {\n        ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1)\n                      << \"invalid escape sequence \\\"\\\\\" << regex[i] << \"\\\".\";\n        is_valid = false;\n      }\n      prev_repeatable = true;\n    } else {  // Not an escape sequence.\n      const char ch = regex[i];\n\n      if (ch == '^' && i > 0) {\n        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)\n                      << \"'^' can only appear at the beginning.\";\n        is_valid = false;\n      } else if (ch == '$' && regex[i + 1] != '\\0') {\n        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)\n                      << \"'$' can only appear at the end.\";\n        is_valid = false;\n      } else if (IsInSet(ch, \"()[]{}|\")) {\n        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)\n                      << \"'\" << ch << \"' is unsupported.\";\n        is_valid = false;\n      } else if (IsRepeat(ch) && !prev_repeatable) {\n        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)\n                      << \"'\" << ch << \"' can only follow a repeatable token.\";\n        is_valid = false;\n      }\n\n      prev_repeatable = !IsInSet(ch, \"^$?*+\");\n    }\n  }\n\n  return is_valid;\n}\n\n// Matches a repeated regex atom followed by a valid simple regular\n// expression.  The regex atom is defined as c if escaped is false,\n// or \\c otherwise.  repeat is the repetition meta character (?, *,\n// or +).  The behavior is undefined if str contains too many\n// characters to be indexable by size_t, in which case the test will\n// probably time out anyway.  We are fine with this limitation as\n// std::string has it too.\nbool MatchRepetitionAndRegexAtHead(\n    bool escaped, char c, char repeat, const char* regex,\n    const char* str) {\n  const size_t min_count = (repeat == '+') ? 1 : 0;\n  const size_t max_count = (repeat == '?') ? 1 :\n      static_cast<size_t>(-1) - 1;\n  // We cannot call numeric_limits::max() as it conflicts with the\n  // max() macro on Windows.\n\n  for (size_t i = 0; i <= max_count; ++i) {\n    // We know that the atom matches each of the first i characters in str.\n    if (i >= min_count && MatchRegexAtHead(regex, str + i)) {\n      // We have enough matches at the head, and the tail matches too.\n      // Since we only care about *whether* the pattern matches str\n      // (as opposed to *how* it matches), there is no need to find a\n      // greedy match.\n      return true;\n    }\n    if (str[i] == '\\0' || !AtomMatchesChar(escaped, c, str[i]))\n      return false;\n  }\n  return false;\n}\n\n// Returns true iff regex matches a prefix of str.  regex must be a\n// valid simple regular expression and not start with \"^\", or the\n// result is undefined.\nbool MatchRegexAtHead(const char* regex, const char* str) {\n  if (*regex == '\\0')  // An empty regex matches a prefix of anything.\n    return true;\n\n  // \"$\" only matches the end of a string.  Note that regex being\n  // valid guarantees that there's nothing after \"$\" in it.\n  if (*regex == '$')\n    return *str == '\\0';\n\n  // Is the first thing in regex an escape sequence?\n  const bool escaped = *regex == '\\\\';\n  if (escaped)\n    ++regex;\n  if (IsRepeat(regex[1])) {\n    // MatchRepetitionAndRegexAtHead() calls MatchRegexAtHead(), so\n    // here's an indirect recursion.  It terminates as the regex gets\n    // shorter in each recursion.\n    return MatchRepetitionAndRegexAtHead(\n        escaped, regex[0], regex[1], regex + 2, str);\n  } else {\n    // regex isn't empty, isn't \"$\", and doesn't start with a\n    // repetition.  We match the first atom of regex with the first\n    // character of str and recurse.\n    return (*str != '\\0') && AtomMatchesChar(escaped, *regex, *str) &&\n        MatchRegexAtHead(regex + 1, str + 1);\n  }\n}\n\n// Returns true iff regex matches any substring of str.  regex must be\n// a valid simple regular expression, or the result is undefined.\n//\n// The algorithm is recursive, but the recursion depth doesn't exceed\n// the regex length, so we won't need to worry about running out of\n// stack space normally.  In rare cases the time complexity can be\n// exponential with respect to the regex length + the string length,\n// but usually it's must faster (often close to linear).\nbool MatchRegexAnywhere(const char* regex, const char* str) {\n  if (regex == NULL || str == NULL)\n    return false;\n\n  if (*regex == '^')\n    return MatchRegexAtHead(regex + 1, str);\n\n  // A successful match can be anywhere in str.\n  do {\n    if (MatchRegexAtHead(regex, str))\n      return true;\n  } while (*str++ != '\\0');\n  return false;\n}\n\n// Implements the RE class.\n\nRE::~RE() {\n  free(const_cast<char*>(pattern_));\n  free(const_cast<char*>(full_pattern_));\n}\n\n// Returns true iff regular expression re matches the entire str.\nbool RE::FullMatch(const char* str, const RE& re) {\n  return re.is_valid_ && MatchRegexAnywhere(re.full_pattern_, str);\n}\n\n// Returns true iff regular expression re matches a substring of str\n// (including str itself).\nbool RE::PartialMatch(const char* str, const RE& re) {\n  return re.is_valid_ && MatchRegexAnywhere(re.pattern_, str);\n}\n\n// Initializes an RE from its string representation.\nvoid RE::Init(const char* regex) {\n  pattern_ = full_pattern_ = NULL;\n  if (regex != NULL) {\n    pattern_ = posix::StrDup(regex);\n  }\n\n  is_valid_ = ValidateRegex(regex);\n  if (!is_valid_) {\n    // No need to calculate the full pattern when the regex is invalid.\n    return;\n  }\n\n  const size_t len = strlen(regex);\n  // Reserves enough bytes to hold the regular expression used for a\n  // full match: we need space to prepend a '^', append a '$', and\n  // terminate the string with '\\0'.\n  char* buffer = static_cast<char*>(malloc(len + 3));\n  full_pattern_ = buffer;\n\n  if (*regex != '^')\n    *buffer++ = '^';  // Makes sure full_pattern_ starts with '^'.\n\n  // We don't use snprintf or strncpy, as they trigger a warning when\n  // compiled with VC++ 8.0.\n  memcpy(buffer, regex, len);\n  buffer += len;\n\n  if (len == 0 || regex[len - 1] != '$')\n    *buffer++ = '$';  // Makes sure full_pattern_ ends with '$'.\n\n  *buffer = '\\0';\n}\n\n#endif  // GTEST_USES_POSIX_RE\n\nconst char kUnknownFile[] = \"unknown file\";\n\n// Formats a source file path and a line number as they would appear\n// in an error message from the compiler used to compile this code.\nGTEST_API_ ::std::string FormatFileLocation(const char* file, int line) {\n  const char* const file_name = file == NULL ? kUnknownFile : file;\n\n  if (line < 0) {\n    return String::Format(\"%s:\", file_name).c_str();\n  }\n#ifdef _MSC_VER\n  return String::Format(\"%s(%d):\", file_name, line).c_str();\n#else\n  return String::Format(\"%s:%d:\", file_name, line).c_str();\n#endif  // _MSC_VER\n}\n\n// Formats a file location for compiler-independent XML output.\n// Although this function is not platform dependent, we put it next to\n// FormatFileLocation in order to contrast the two functions.\n// Note that FormatCompilerIndependentFileLocation() does NOT append colon\n// to the file location it produces, unlike FormatFileLocation().\nGTEST_API_ ::std::string FormatCompilerIndependentFileLocation(\n    const char* file, int line) {\n  const char* const file_name = file == NULL ? kUnknownFile : file;\n\n  if (line < 0)\n    return file_name;\n  else\n    return String::Format(\"%s:%d\", file_name, line).c_str();\n}\n\n\nGTestLog::GTestLog(GTestLogSeverity severity, const char* file, int line)\n    : severity_(severity) {\n  const char* const marker =\n      severity == GTEST_INFO ?    \"[  INFO ]\" :\n      severity == GTEST_WARNING ? \"[WARNING]\" :\n      severity == GTEST_ERROR ?   \"[ ERROR ]\" : \"[ FATAL ]\";\n  GetStream() << ::std::endl << marker << \" \"\n              << FormatFileLocation(file, line).c_str() << \": \";\n}\n\n// Flushes the buffers and, if severity is GTEST_FATAL, aborts the program.\nGTestLog::~GTestLog() {\n  GetStream() << ::std::endl;\n  if (severity_ == GTEST_FATAL) {\n    fflush(stderr);\n    posix::Abort();\n  }\n}\n// Disable Microsoft deprecation warnings for POSIX functions called from\n// this class (creat, dup, dup2, and close)\n#ifdef _MSC_VER\n# pragma warning(push)\n# pragma warning(disable: 4996)\n#endif  // _MSC_VER\n\n#if GTEST_HAS_STREAM_REDIRECTION\n\n// Object that captures an output stream (stdout/stderr).\nclass CapturedStream {\n public:\n  // The ctor redirects the stream to a temporary file.\n  CapturedStream(int fd) : fd_(fd), uncaptured_fd_(dup(fd)) {\n\n# if GTEST_OS_WINDOWS\n    char temp_dir_path[MAX_PATH + 1] = { '\\0' };  // NOLINT\n    char temp_file_path[MAX_PATH + 1] = { '\\0' };  // NOLINT\n\n    ::GetTempPathA(sizeof(temp_dir_path), temp_dir_path);\n    const UINT success = ::GetTempFileNameA(temp_dir_path,\n                                            \"gtest_redir\",\n                                            0,  // Generate unique file name.\n                                            temp_file_path);\n    GTEST_CHECK_(success != 0)\n        << \"Unable to create a temporary file in \" << temp_dir_path;\n    const int captured_fd = creat(temp_file_path, _S_IREAD | _S_IWRITE);\n    GTEST_CHECK_(captured_fd != -1) << \"Unable to open temporary file \"\n                                    << temp_file_path;\n    filename_ = temp_file_path;\n# else\n    // There's no guarantee that a test has write access to the\n    // current directory, so we create the temporary file in the /tmp\n    // directory instead.\n    char name_template[] = \"/tmp/captured_stream.XXXXXX\";\n    const int captured_fd = mkstemp(name_template);\n    filename_ = name_template;\n# endif  // GTEST_OS_WINDOWS\n    fflush(NULL);\n    dup2(captured_fd, fd_);\n    close(captured_fd);\n  }\n\n  ~CapturedStream() {\n    remove(filename_.c_str());\n  }\n\n  String GetCapturedString() {\n    if (uncaptured_fd_ != -1) {\n      // Restores the original stream.\n      fflush(NULL);\n      dup2(uncaptured_fd_, fd_);\n      close(uncaptured_fd_);\n      uncaptured_fd_ = -1;\n    }\n\n    FILE* const file = posix::FOpen(filename_.c_str(), \"r\");\n    const String content = ReadEntireFile(file);\n    posix::FClose(file);\n    return content;\n  }\n\n private:\n  // Reads the entire content of a file as a String.\n  static String ReadEntireFile(FILE* file);\n\n  // Returns the size (in bytes) of a file.\n  static size_t GetFileSize(FILE* file);\n\n  const int fd_;  // A stream to capture.\n  int uncaptured_fd_;\n  // Name of the temporary file holding the stderr output.\n  ::std::string filename_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(CapturedStream);\n};\n\n// Returns the size (in bytes) of a file.\nsize_t CapturedStream::GetFileSize(FILE* file) {\n  fseek(file, 0, SEEK_END);\n  return static_cast<size_t>(ftell(file));\n}\n\n// Reads the entire content of a file as a string.\nString CapturedStream::ReadEntireFile(FILE* file) {\n  const size_t file_size = GetFileSize(file);\n  char* const buffer = new char[file_size];\n\n  size_t bytes_last_read = 0;  // # of bytes read in the last fread()\n  size_t bytes_read = 0;       // # of bytes read so far\n\n  fseek(file, 0, SEEK_SET);\n\n  // Keeps reading the file until we cannot read further or the\n  // pre-determined file size is reached.\n  do {\n    bytes_last_read = fread(buffer+bytes_read, 1, file_size-bytes_read, file);\n    bytes_read += bytes_last_read;\n  } while (bytes_last_read > 0 && bytes_read < file_size);\n\n  const String content(buffer, bytes_read);\n  delete[] buffer;\n\n  return content;\n}\n\n# ifdef _MSC_VER\n#  pragma warning(pop)\n# endif  // _MSC_VER\n\nstatic CapturedStream* g_captured_stderr = NULL;\nstatic CapturedStream* g_captured_stdout = NULL;\n\n// Starts capturing an output stream (stdout/stderr).\nvoid CaptureStream(int fd, const char* stream_name, CapturedStream** stream) {\n  if (*stream != NULL) {\n    GTEST_LOG_(FATAL) << \"Only one \" << stream_name\n                      << \" capturer can exist at a time.\";\n  }\n  *stream = new CapturedStream(fd);\n}\n\n// Stops capturing the output stream and returns the captured string.\nString GetCapturedStream(CapturedStream** captured_stream) {\n  const String content = (*captured_stream)->GetCapturedString();\n\n  delete *captured_stream;\n  *captured_stream = NULL;\n\n  return content;\n}\n\n// Starts capturing stdout.\nvoid CaptureStdout() {\n  CaptureStream(kStdOutFileno, \"stdout\", &g_captured_stdout);\n}\n\n// Starts capturing stderr.\nvoid CaptureStderr() {\n  CaptureStream(kStdErrFileno, \"stderr\", &g_captured_stderr);\n}\n\n// Stops capturing stdout and returns the captured string.\nString GetCapturedStdout() { return GetCapturedStream(&g_captured_stdout); }\n\n// Stops capturing stderr and returns the captured string.\nString GetCapturedStderr() { return GetCapturedStream(&g_captured_stderr); }\n\n#endif  // GTEST_HAS_STREAM_REDIRECTION\n\n#if GTEST_HAS_DEATH_TEST\n\n// A copy of all command line arguments.  Set by InitGoogleTest().\n::std::vector<String> g_argvs;\n\n// Returns the command line as a vector of strings.\nconst ::std::vector<String>& GetArgvs() { return g_argvs; }\n\n#endif  // GTEST_HAS_DEATH_TEST\n\n#if GTEST_OS_WINDOWS_MOBILE\nnamespace posix {\nvoid Abort() {\n  DebugBreak();\n  TerminateProcess(GetCurrentProcess(), 1);\n}\n}  // namespace posix\n#endif  // GTEST_OS_WINDOWS_MOBILE\n\n// Returns the name of the environment variable corresponding to the\n// given flag.  For example, FlagToEnvVar(\"foo\") will return\n// \"GTEST_FOO\" in the open-source version.\nstatic String FlagToEnvVar(const char* flag) {\n  const String full_flag =\n      (Message() << GTEST_FLAG_PREFIX_ << flag).GetString();\n\n  Message env_var;\n  for (size_t i = 0; i != full_flag.length(); i++) {\n    env_var << ToUpper(full_flag.c_str()[i]);\n  }\n\n  return env_var.GetString();\n}\n\n// Parses 'str' for a 32-bit signed integer.  If successful, writes\n// the result to *value and returns true; otherwise leaves *value\n// unchanged and returns false.\nbool ParseInt32(const Message& src_text, const char* str, Int32* value) {\n  // Parses the environment variable as a decimal integer.\n  char* end = NULL;\n  const long long_value = strtol(str, &end, 10);  // NOLINT\n\n  // Has strtol() consumed all characters in the string?\n  if (*end != '\\0') {\n    // No - an invalid character was encountered.\n    Message msg;\n    msg << \"WARNING: \" << src_text\n        << \" is expected to be a 32-bit integer, but actually\"\n        << \" has value \\\"\" << str << \"\\\".\\n\";\n    printf(\"%s\", msg.GetString().c_str());\n    fflush(stdout);\n    return false;\n  }\n\n  // Is the parsed value in the range of an Int32?\n  const Int32 result = static_cast<Int32>(long_value);\n  if (long_value == LONG_MAX || long_value == LONG_MIN ||\n      // The parsed value overflows as a long.  (strtol() returns\n      // LONG_MAX or LONG_MIN when the input overflows.)\n      result != long_value\n      // The parsed value overflows as an Int32.\n      ) {\n    Message msg;\n    msg << \"WARNING: \" << src_text\n        << \" is expected to be a 32-bit integer, but actually\"\n        << \" has value \" << str << \", which overflows.\\n\";\n    printf(\"%s\", msg.GetString().c_str());\n    fflush(stdout);\n    return false;\n  }\n\n  *value = result;\n  return true;\n}\n\n// Reads and returns the Boolean environment variable corresponding to\n// the given flag; if it's not set, returns default_value.\n//\n// The value is considered true iff it's not \"0\".\nbool BoolFromGTestEnv(const char* flag, bool default_value) {\n  const String env_var = FlagToEnvVar(flag);\n  const char* const string_value = posix::GetEnv(env_var.c_str());\n  return string_value == NULL ?\n      default_value : strcmp(string_value, \"0\") != 0;\n}\n\n// Reads and returns a 32-bit integer stored in the environment\n// variable corresponding to the given flag; if it isn't set or\n// doesn't represent a valid 32-bit integer, returns default_value.\nInt32 Int32FromGTestEnv(const char* flag, Int32 default_value) {\n  const String env_var = FlagToEnvVar(flag);\n  const char* const string_value = posix::GetEnv(env_var.c_str());\n  if (string_value == NULL) {\n    // The environment variable is not set.\n    return default_value;\n  }\n\n  Int32 result = default_value;\n  if (!ParseInt32(Message() << \"Environment variable \" << env_var,\n                  string_value, &result)) {\n    printf(\"The default value %s is used.\\n\",\n           (Message() << default_value).GetString().c_str());\n    fflush(stdout);\n    return default_value;\n  }\n\n  return result;\n}\n\n// Reads and returns the string environment variable corresponding to\n// the given flag; if it's not set, returns default_value.\nconst char* StringFromGTestEnv(const char* flag, const char* default_value) {\n  const String env_var = FlagToEnvVar(flag);\n  const char* const value = posix::GetEnv(env_var.c_str());\n  return value == NULL ? default_value : value;\n}\n\n}  // namespace internal\n}  // namespace testing\n// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n\n// Google Test - The Google C++ Testing Framework\n//\n// This file implements a universal value printer that can print a\n// value of any type T:\n//\n//   void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr);\n//\n// It uses the << operator when possible, and prints the bytes in the\n// object otherwise.  A user can override its behavior for a class\n// type Foo by defining either operator<<(::std::ostream&, const Foo&)\n// or void PrintTo(const Foo&, ::std::ostream*) in the namespace that\n// defines Foo.\n\n#include <ctype.h>\n#include <stdio.h>\n#include <ostream>  // NOLINT\n#include <string>\n\nnamespace testing {\n\nnamespace {\n\nusing ::std::ostream;\n\n#if GTEST_OS_WINDOWS_MOBILE  // Windows CE does not define _snprintf_s.\n# define snprintf _snprintf\n#elif _MSC_VER >= 1400  // VC 8.0 and later deprecate snprintf and _snprintf.\n# define snprintf _snprintf_s\n#elif _MSC_VER\n# define snprintf _snprintf\n#endif  // GTEST_OS_WINDOWS_MOBILE\n\n// Prints a segment of bytes in the given object.\nvoid PrintByteSegmentInObjectTo(const unsigned char* obj_bytes, size_t start,\n                                size_t count, ostream* os) {\n  char text[5] = \"\";\n  for (size_t i = 0; i != count; i++) {\n    const size_t j = start + i;\n    if (i != 0) {\n      // Organizes the bytes into groups of 2 for easy parsing by\n      // human.\n      if ((j % 2) == 0)\n        *os << ' ';\n      else\n        *os << '-';\n    }\n    snprintf(text, sizeof(text), \"%02X\", obj_bytes[j]);\n    *os << text;\n  }\n}\n\n// Prints the bytes in the given value to the given ostream.\nvoid PrintBytesInObjectToImpl(const unsigned char* obj_bytes, size_t count,\n                              ostream* os) {\n  // Tells the user how big the object is.\n  *os << count << \"-byte object <\";\n\n  const size_t kThreshold = 132;\n  const size_t kChunkSize = 64;\n  // If the object size is bigger than kThreshold, we'll have to omit\n  // some details by printing only the first and the last kChunkSize\n  // bytes.\n  // TODO(wan): let the user control the threshold using a flag.\n  if (count < kThreshold) {\n    PrintByteSegmentInObjectTo(obj_bytes, 0, count, os);\n  } else {\n    PrintByteSegmentInObjectTo(obj_bytes, 0, kChunkSize, os);\n    *os << \" ... \";\n    // Rounds up to 2-byte boundary.\n    const size_t resume_pos = (count - kChunkSize + 1)/2*2;\n    PrintByteSegmentInObjectTo(obj_bytes, resume_pos, count - resume_pos, os);\n  }\n  *os << \">\";\n}\n\n}  // namespace\n\nnamespace internal2 {\n\n// Delegates to PrintBytesInObjectToImpl() to print the bytes in the\n// given object.  The delegation simplifies the implementation, which\n// uses the << operator and thus is easier done outside of the\n// ::testing::internal namespace, which contains a << operator that\n// sometimes conflicts with the one in STL.\nvoid PrintBytesInObjectTo(const unsigned char* obj_bytes, size_t count,\n                          ostream* os) {\n  PrintBytesInObjectToImpl(obj_bytes, count, os);\n}\n\n}  // namespace internal2\n\nnamespace internal {\n\n// Depending on the value of a char (or wchar_t), we print it in one\n// of three formats:\n//   - as is if it's a printable ASCII (e.g. 'a', '2', ' '),\n//   - as a hexidecimal escape sequence (e.g. '\\x7F'), or\n//   - as a special escape sequence (e.g. '\\r', '\\n').\nenum CharFormat {\n  kAsIs,\n  kHexEscape,\n  kSpecialEscape\n};\n\n// Returns true if c is a printable ASCII character.  We test the\n// value of c directly instead of calling isprint(), which is buggy on\n// Windows Mobile.\ninline bool IsPrintableAscii(wchar_t c) {\n  return 0x20 <= c && c <= 0x7E;\n}\n\n// Prints a wide or narrow char c as a character literal without the\n// quotes, escaping it when necessary; returns how c was formatted.\n// The template argument UnsignedChar is the unsigned version of Char,\n// which is the type of c.\ntemplate <typename UnsignedChar, typename Char>\nstatic CharFormat PrintAsCharLiteralTo(Char c, ostream* os) {\n  switch (static_cast<wchar_t>(c)) {\n    case L'\\0':\n      *os << \"\\\\0\";\n      break;\n    case L'\\'':\n      *os << \"\\\\'\";\n      break;\n    case L'\\\\':\n      *os << \"\\\\\\\\\";\n      break;\n    case L'\\a':\n      *os << \"\\\\a\";\n      break;\n    case L'\\b':\n      *os << \"\\\\b\";\n      break;\n    case L'\\f':\n      *os << \"\\\\f\";\n      break;\n    case L'\\n':\n      *os << \"\\\\n\";\n      break;\n    case L'\\r':\n      *os << \"\\\\r\";\n      break;\n    case L'\\t':\n      *os << \"\\\\t\";\n      break;\n    case L'\\v':\n      *os << \"\\\\v\";\n      break;\n    default:\n      if (IsPrintableAscii(c)) {\n        *os << static_cast<char>(c);\n        return kAsIs;\n      } else {\n        *os << String::Format(\"\\\\x%X\", static_cast<UnsignedChar>(c));\n        return kHexEscape;\n      }\n  }\n  return kSpecialEscape;\n}\n\n// Prints a char c as if it's part of a string literal, escaping it when\n// necessary; returns how c was formatted.\nstatic CharFormat PrintAsWideStringLiteralTo(wchar_t c, ostream* os) {\n  switch (c) {\n    case L'\\'':\n      *os << \"'\";\n      return kAsIs;\n    case L'\"':\n      *os << \"\\\\\\\"\";\n      return kSpecialEscape;\n    default:\n      return PrintAsCharLiteralTo<wchar_t>(c, os);\n  }\n}\n\n// Prints a char c as if it's part of a string literal, escaping it when\n// necessary; returns how c was formatted.\nstatic CharFormat PrintAsNarrowStringLiteralTo(char c, ostream* os) {\n  return PrintAsWideStringLiteralTo(static_cast<unsigned char>(c), os);\n}\n\n// Prints a wide or narrow character c and its code.  '\\0' is printed\n// as \"'\\\\0'\", other unprintable characters are also properly escaped\n// using the standard C++ escape sequence.  The template argument\n// UnsignedChar is the unsigned version of Char, which is the type of c.\ntemplate <typename UnsignedChar, typename Char>\nvoid PrintCharAndCodeTo(Char c, ostream* os) {\n  // First, print c as a literal in the most readable form we can find.\n  *os << ((sizeof(c) > 1) ? \"L'\" : \"'\");\n  const CharFormat format = PrintAsCharLiteralTo<UnsignedChar>(c, os);\n  *os << \"'\";\n\n  // To aid user debugging, we also print c's code in decimal, unless\n  // it's 0 (in which case c was printed as '\\\\0', making the code\n  // obvious).\n  if (c == 0)\n    return;\n  *os << \" (\" << String::Format(\"%d\", c).c_str();\n\n  // For more convenience, we print c's code again in hexidecimal,\n  // unless c was already printed in the form '\\x##' or the code is in\n  // [1, 9].\n  if (format == kHexEscape || (1 <= c && c <= 9)) {\n    // Do nothing.\n  } else {\n    *os << String::Format(\", 0x%X\",\n                          static_cast<UnsignedChar>(c)).c_str();\n  }\n  *os << \")\";\n}\n\nvoid PrintTo(unsigned char c, ::std::ostream* os) {\n  PrintCharAndCodeTo<unsigned char>(c, os);\n}\nvoid PrintTo(signed char c, ::std::ostream* os) {\n  PrintCharAndCodeTo<unsigned char>(c, os);\n}\n\n// Prints a wchar_t as a symbol if it is printable or as its internal\n// code otherwise and also as its code.  L'\\0' is printed as \"L'\\\\0'\".\nvoid PrintTo(wchar_t wc, ostream* os) {\n  PrintCharAndCodeTo<wchar_t>(wc, os);\n}\n\n// Prints the given array of characters to the ostream.\n// The array starts at *begin, the length is len, it may include '\\0' characters\n// and may not be null-terminated.\nstatic void PrintCharsAsStringTo(const char* begin, size_t len, ostream* os) {\n  *os << \"\\\"\";\n  bool is_previous_hex = false;\n  for (size_t index = 0; index < len; ++index) {\n    const char cur = begin[index];\n    if (is_previous_hex && IsXDigit(cur)) {\n      // Previous character is of '\\x..' form and this character can be\n      // interpreted as another hexadecimal digit in its number. Break string to\n      // disambiguate.\n      *os << \"\\\" \\\"\";\n    }\n    is_previous_hex = PrintAsNarrowStringLiteralTo(cur, os) == kHexEscape;\n  }\n  *os << \"\\\"\";\n}\n\n// Prints a (const) char array of 'len' elements, starting at address 'begin'.\nvoid UniversalPrintArray(const char* begin, size_t len, ostream* os) {\n  PrintCharsAsStringTo(begin, len, os);\n}\n\n// Prints the given array of wide characters to the ostream.\n// The array starts at *begin, the length is len, it may include L'\\0'\n// characters and may not be null-terminated.\nstatic void PrintWideCharsAsStringTo(const wchar_t* begin, size_t len,\n                                     ostream* os) {\n  *os << \"L\\\"\";\n  bool is_previous_hex = false;\n  for (size_t index = 0; index < len; ++index) {\n    const wchar_t cur = begin[index];\n    if (is_previous_hex && isascii(cur) && IsXDigit(static_cast<char>(cur))) {\n      // Previous character is of '\\x..' form and this character can be\n      // interpreted as another hexadecimal digit in its number. Break string to\n      // disambiguate.\n      *os << \"\\\" L\\\"\";\n    }\n    is_previous_hex = PrintAsWideStringLiteralTo(cur, os) == kHexEscape;\n  }\n  *os << \"\\\"\";\n}\n\n// Prints the given C string to the ostream.\nvoid PrintTo(const char* s, ostream* os) {\n  if (s == NULL) {\n    *os << \"NULL\";\n  } else {\n    *os << ImplicitCast_<const void*>(s) << \" pointing to \";\n    PrintCharsAsStringTo(s, strlen(s), os);\n  }\n}\n\n// MSVC compiler can be configured to define whar_t as a typedef\n// of unsigned short. Defining an overload for const wchar_t* in that case\n// would cause pointers to unsigned shorts be printed as wide strings,\n// possibly accessing more memory than intended and causing invalid\n// memory accesses. MSVC defines _NATIVE_WCHAR_T_DEFINED symbol when\n// wchar_t is implemented as a native type.\n#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)\n// Prints the given wide C string to the ostream.\nvoid PrintTo(const wchar_t* s, ostream* os) {\n  if (s == NULL) {\n    *os << \"NULL\";\n  } else {\n    *os << ImplicitCast_<const void*>(s) << \" pointing to \";\n    PrintWideCharsAsStringTo(s, wcslen(s), os);\n  }\n}\n#endif  // wchar_t is native\n\n// Prints a ::string object.\n#if GTEST_HAS_GLOBAL_STRING\nvoid PrintStringTo(const ::string& s, ostream* os) {\n  PrintCharsAsStringTo(s.data(), s.size(), os);\n}\n#endif  // GTEST_HAS_GLOBAL_STRING\n\nvoid PrintStringTo(const ::std::string& s, ostream* os) {\n  PrintCharsAsStringTo(s.data(), s.size(), os);\n}\n\n// Prints a ::wstring object.\n#if GTEST_HAS_GLOBAL_WSTRING\nvoid PrintWideStringTo(const ::wstring& s, ostream* os) {\n  PrintWideCharsAsStringTo(s.data(), s.size(), os);\n}\n#endif  // GTEST_HAS_GLOBAL_WSTRING\n\n#if GTEST_HAS_STD_WSTRING\nvoid PrintWideStringTo(const ::std::wstring& s, ostream* os) {\n  PrintWideCharsAsStringTo(s.data(), s.size(), os);\n}\n#endif  // GTEST_HAS_STD_WSTRING\n\n}  // namespace internal\n\n}  // namespace testing\n// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: mheule@google.com (Markus Heule)\n//\n// The Google C++ Testing Framework (Google Test)\n\n\n// Indicates that this translation unit is part of Google Test's\n// implementation.  It must come before gtest-internal-inl.h is\n// included, or there will be a compiler error.  This trick is to\n// prevent a user from accidentally including gtest-internal-inl.h in\n// his code.\n#define GTEST_IMPLEMENTATION_ 1\n#undef GTEST_IMPLEMENTATION_\n\nnamespace testing {\n\nusing internal::GetUnitTestImpl;\n\n// Gets the summary of the failure message by omitting the stack trace\n// in it.\ninternal::String TestPartResult::ExtractSummary(const char* message) {\n  const char* const stack_trace = strstr(message, internal::kStackTraceMarker);\n  return stack_trace == NULL ? internal::String(message) :\n      internal::String(message, stack_trace - message);\n}\n\n// Prints a TestPartResult object.\nstd::ostream& operator<<(std::ostream& os, const TestPartResult& result) {\n  return os\n      << result.file_name() << \":\" << result.line_number() << \": \"\n      << (result.type() == TestPartResult::kSuccess ? \"Success\" :\n          result.type() == TestPartResult::kFatalFailure ? \"Fatal failure\" :\n          \"Non-fatal failure\") << \":\\n\"\n      << result.message() << std::endl;\n}\n\n// Appends a TestPartResult to the array.\nvoid TestPartResultArray::Append(const TestPartResult& result) {\n  array_.push_back(result);\n}\n\n// Returns the TestPartResult at the given index (0-based).\nconst TestPartResult& TestPartResultArray::GetTestPartResult(int index) const {\n  if (index < 0 || index >= size()) {\n    printf(\"\\nInvalid index (%d) into TestPartResultArray.\\n\", index);\n    internal::posix::Abort();\n  }\n\n  return array_[index];\n}\n\n// Returns the number of TestPartResult objects in the array.\nint TestPartResultArray::size() const {\n  return static_cast<int>(array_.size());\n}\n\nnamespace internal {\n\nHasNewFatalFailureHelper::HasNewFatalFailureHelper()\n    : has_new_fatal_failure_(false),\n      original_reporter_(GetUnitTestImpl()->\n                         GetTestPartResultReporterForCurrentThread()) {\n  GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(this);\n}\n\nHasNewFatalFailureHelper::~HasNewFatalFailureHelper() {\n  GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(\n      original_reporter_);\n}\n\nvoid HasNewFatalFailureHelper::ReportTestPartResult(\n    const TestPartResult& result) {\n  if (result.fatally_failed())\n    has_new_fatal_failure_ = true;\n  original_reporter_->ReportTestPartResult(result);\n}\n\n}  // namespace internal\n\n}  // namespace testing\n// Copyright 2008 Google Inc.\n// All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n\n\nnamespace testing {\nnamespace internal {\n\n#if GTEST_HAS_TYPED_TEST_P\n\n// Skips to the first non-space char in str. Returns an empty string if str\n// contains only whitespace characters.\nstatic const char* SkipSpaces(const char* str) {\n  while (IsSpace(*str))\n    str++;\n  return str;\n}\n\n// Verifies that registered_tests match the test names in\n// defined_test_names_; returns registered_tests if successful, or\n// aborts the program otherwise.\nconst char* TypedTestCasePState::VerifyRegisteredTestNames(\n    const char* file, int line, const char* registered_tests) {\n  typedef ::std::set<const char*>::const_iterator DefinedTestIter;\n  registered_ = true;\n\n  // Skip initial whitespace in registered_tests since some\n  // preprocessors prefix stringizied literals with whitespace.\n  registered_tests = SkipSpaces(registered_tests);\n\n  Message errors;\n  ::std::set<String> tests;\n  for (const char* names = registered_tests; names != NULL;\n       names = SkipComma(names)) {\n    const String name = GetPrefixUntilComma(names);\n    if (tests.count(name) != 0) {\n      errors << \"Test \" << name << \" is listed more than once.\\n\";\n      continue;\n    }\n\n    bool found = false;\n    for (DefinedTestIter it = defined_test_names_.begin();\n         it != defined_test_names_.end();\n         ++it) {\n      if (name == *it) {\n        found = true;\n        break;\n      }\n    }\n\n    if (found) {\n      tests.insert(name);\n    } else {\n      errors << \"No test named \" << name\n             << \" can be found in this test case.\\n\";\n    }\n  }\n\n  for (DefinedTestIter it = defined_test_names_.begin();\n       it != defined_test_names_.end();\n       ++it) {\n    if (tests.count(*it) == 0) {\n      errors << \"You forgot to list test \" << *it << \".\\n\";\n    }\n  }\n\n  const String& errors_str = errors.GetString();\n  if (errors_str != \"\") {\n    fprintf(stderr, \"%s %s\", FormatFileLocation(file, line).c_str(),\n            errors_str.c_str());\n    fflush(stderr);\n    posix::Abort();\n  }\n\n  return registered_tests;\n}\n\n#endif  // GTEST_HAS_TYPED_TEST_P\n\n}  // namespace internal\n}  // namespace testing\n"
  },
  {
    "path": "thirdparty/gtest/src/gtest_main.cc",
    "content": "// Copyright 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include <iostream>\n\n#include \"gtest/gtest_ASP.h\"\n\nGTEST_API_ int main(int argc, char **argv) {\n  std::cout << \"Running main() from gtest_main.cc\\n\";\n\n  testing::InitGoogleTest(&argc, argv);\n  return RUN_ALL_TESTS();\n}\n"
  },
  {
    "path": "thirdparty/m4/autotroll.m4",
    "content": "dnl __BEGIN_LICENSE__\ndnl Copyright (C) 2006-2011 United States Government as represented by\ndnl the Administrator of the National Aeronautics and Space Administration.\ndnl All Rights Reserved.\ndnl __END_LICENSE__\n\n\n# Build Qt apps with the autotools (Autoconf/Automake).\n# M4 macros.\n# This file is part of AutoTroll.\n# Copyright (C) 2006  Benoit Sigoure <benoit.sigoure@lrde.epita.fr>\n#\n# AutoTroll is free software; you can redistribute it and/or\n# modify it under the terms of the GNU General Public License\n# as published by the Free Software Foundation; either version 2\n# of the License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,\n# USA.\n#\n# In addition, as a special exception, the copyright holders of AutoTroll\n# give you unlimited permission to copy, distribute and modify the configure\n# scripts that are the output of Autoconf when processing the macros of\n# AutoTroll.  You need not follow the terms of the GNU General Public License\n# when using or distributing such scripts, even though portions of the text of\n# AutoTroll appear in them. The GNU General Public License (GPL) does govern\n# all other use of the material that constitutes AutoTroll.\n#\n# This special exception to the GPL applies to versions of AutoTroll\n# released by the copyright holders of AutoTroll.  Note that people who make\n# modified versions of AutoTroll are not obligated to grant this special\n# exception for their modified versions; it is their choice whether to do so.\n# The GNU General Public License gives permission to release a modified version\n# without this exception; this exception also makes it possible to release a\n# modified version which carries forward this exception.\n\n # ------------- #\n # DOCUMENTATION #\n # ------------- #\n\n# Disclaimer: Never tested with anything else than Qt 4.2! Feedback welcome.\n# Simply invoke AT_WITH_QT in your configure.ac. AT_WITH_QT can take\n# arguments which are documented in depth below. The default arguments are\n# equivalent to the default .pro file generated by qmake.\n#\n# Invoking AT_WITH_QT will do the following:\n#  - Add a --with-qt option to your configure\n#  - Find qmake, moc and uic and save them in the make variables $(QMAKE),\n#    $(MOC), $(UIC).\n#  - Save the path to Qt in $(QT_PATH)\n#  - Find the flags to use Qt, that is:\n#     * $(QT_DEFINES): -D's defined by qmake.\n#     * $(QT_CFLAGS): CFLAGS as defined by qmake (C?!)\n#     * $(QT_CXXFLAGS): CXXFLAGS as defined by qmake.\n#     * $(QT_INCPATH): -I's defined by qmake.\n#     * $(QT_CPPFLAGS): Same as $(QT_DEFINES) + $(QT_INCPATH)\n#     * $(QT_LFLAGS): LFLAGS defined by qmake.\n#     * $(QT_LDFLAGS): Same thing as $(QT_LFLAGS).\n#     * $(QT_LIBS): LIBS defined by qmake.\n#\n# You *MUST* invoke $(MOC) and/or $(UIC) where necessary. AutoTroll provides\n# you with Makerules to ease this, here is a sample Makefile.am to use with\n# AutoTroll which builds the code given in the chapter 7 of the Qt Tutorial:\n# http://doc.trolltech.com/4.2/tutorial-t7.html\n#\n# -------------------------------------------------------------------------\n# include $(top_srcdir)/build-aux/autotroll.mk\n#\n# ACLOCAL_AMFLAGS = -I build-aux\n#\n# bin_PROGRAMS = lcdrange\n# lcdrange_SOURCES =  $(BUILT_SOURCES) lcdrange.cpp lcdrange.h main.cpp\n# lcdrange_CXXFLAGS = $(QT_CXXFLAGS) $(AM_CXXFLAGS)\n# lcdrange_CPPFLAGS = $(QT_CPPFLAGS) $(AM_CPPFLAGS)\n# lcdrange_LDFLAGS  = $(QT_LDFLAGS) $(LDFLAGS)\n# lcdrange_LDADD    = $(QT_LIBS) $(LDADD)\n#\n# BUILT_SOURCES = lcdrange.moc.cpp\n# -------------------------------------------------------------------------\n#\n# Note that your MOC, UIC and QRC files *MUST* be listed manually in\n# BUILT_SOURCES. If you name them properly (eg: .moc.cc, .qrc.cc, .ui.cc -- of\n# course you can use .cpp or .cxx or .C rather than .cc) AutoTroll will build\n# them automagically for you (using implicit rules defined in autotroll.mk).\n\nm4_define([_AUTOTROLL_SERIAL], [m4_translit([\n# serial 4\n], [#\n], [])])\n\n\nm4_ifdef([AX_INSTEAD_IF], [],\n[AC_DEFUN([AX_INSTEAD_IF],\n  [m4_ifval([$1],\n    [AC_MSG_WARN([$2]); [$1]],\n    [AC_MSG_ERROR([$2])])])])\n\nm4_pattern_forbid([^AT_])dnl\nm4_pattern_forbid([^_AT_])dnl\n\n# These are backports from autoconf 2.60.\n# They can be removed when 2.60 is everywhere.\n\n# _AS_VERSION_COMPARE_PREPARE\n# ---------------------------\n# Output variables for comparing version numbers.\nm4_ifdef([_AS_VERSION_COMPARE_PREPARE], [], [\n  AC_DEFUN([_AS_VERSION_COMPARE_PREPARE],\n  [[as_awk_strverscmp='\n    # Use only awk features that work with 7th edition Unix awk (1978).\n    # My, what an old awk you have, Mr. Solaris!\n    END {\n      while (length(v1) || length(v2)) {\n        # Set d1 to be the next thing to compare from v1, and likewise for d2.\n        # Normally this is a single character, but if v1 and v2 contain digits,\n        # compare them as integers and fractions as strverscmp does.\n        if (v1 ~ /^[0-9]/ && v2 ~ /^[0-9]/) {\n     # Split v1 and v2 into their leading digit string components d1 and d2,\n     # and advance v1 and v2 past the leading digit strings.\n     for (len1 = 1; substr(v1, len1 + 1) ~ /^[0-9]/; len1++) continue\n     for (len2 = 1; substr(v2, len2 + 1) ~ /^[0-9]/; len2++) continue\n     d1 = substr(v1, 1, len1); v1 = substr(v1, len1 + 1)\n     d2 = substr(v2, 1, len2); v2 = substr(v2, len2 + 1)\n     if (d1 ~ /^0/) {\n       if (d2 ~ /^0/) {\n         # Compare two fractions.\n         while (d1 ~ /^0/ && d2 ~ /^0/) {\n           d1 = substr(d1, 2); len1--\n           d2 = substr(d2, 2); len2--\n         }\n         if (len1 != len2 && ! (len1 && len2 && substr(d1, 1, 1) == substr(d2, 1, 1))) {\n           # The two components differ in length, and the common prefix\n           # contains only leading zeros.  Consider the longer to be less.\n           d1 = -len1\n           d2 = -len2\n         } else {\n           # Otherwise, compare as strings.\n           d1 = \"x\" d1\n           d2 = \"x\" d2\n         }\n       } else {\n         # A fraction is less than an integer.\n         exit 1\n       }\n     } else {\n       if (d2 ~ /^0/) {\n         # An integer is greater than a fraction.\n         exit 2\n       } else {\n         # Compare two integers.\n         d1 += 0\n         d2 += 0\n       }\n     }\n        } else {\n     # The normal case, without worrying about digits.\n     if (v1 == \"\") d1 = v1; else { d1 = substr(v1, 1, 1); v1 = substr(v1,2) }\n     if (v2 == \"\") d2 = v2; else { d2 = substr(v2, 1, 1); v2 = substr(v2,2) }\n        }\n        if (d1 < d2) exit 1\n        if (d1 > d2) exit 2\n      }\n    }\n']])])\n\nm4_ifdef([AS_VERSION_COMPARE], [], [\n  AC_DEFUN([AS_VERSION_COMPARE],\n  [AS_REQUIRE([_$0_PREPARE])dnl\n  as_arg_v1=$1\n  as_arg_v2=$2\n  dnl This usage is portable even to ancient awk,\n  dnl so don't worry about finding a \"nice\" awk version.\n  awk \"$as_awk_strverscmp\" v1=\"$as_arg_v1\" v2=\"$as_arg_v2\" /dev/null\n  case $? in\n  1) $3;;\n  0) $4;;\n  2) $5;;\n  esac[]dnl\n])])\n\n# AT_WITH_QT([QT_modules], [QT_config], [QT_misc], [RUN-IF-FAILED], [RUN-IF-OK])\n# ------------------------------------------------------------------------------\n# Enable Qt support and add an option --with-qt to the configure script.\n#\n# The QT_modules argument is optional and defines extra modules to enable or\n# disable (it's equivalent to the QT variable in .pro files). Modules can be\n# specified as follows:\n#\n# AT_WITH_QT   => No argument -> No QT value.\n#                                Qmake sets it to \"core gui\" by default.\n# AT_WITH_QT([xml])   => QT += xml\n# AT_WITH_QT([+xml])  => QT += xml\n# AT_WITH_QT([-gui])  => QT -= gui\n# AT_WITH_QT([xml -gui +sql svg])  => QT += xml sql svg\n#                                     QT -= gui\n#\n# The QT_config argument is also optional and follows the same convention as\n# QT_modules. Instead of changing the QT variable, it changes the CONFIG\n# variable, which is used to tweak configuration and compiler options.\n#\n# The last argument, QT_misc (also optional) will be copied as-is the .pro\n# file used to guess how to compile Qt apps. You may use it to further tweak\n# the build process of Qt apps if tweaking the QT or CONFIG variables isn't\n# enough for you.\n#\n# RUN-IF-FAILED is arbitrary code to execute if Qt cannot be found or if any\n# problem happens.  If this argument is omitted, then AC_MSG_ERROR will be\n# called.  RUN-IF-OK is arbitrary code to execute if Qt was successfully found.\nAC_DEFUN([AT_WITH_QT],\n[AC_REQUIRE([AC_CANONICAL_HOST])dnl\nAC_REQUIRE([AC_CANONICAL_BUILD])dnl\nAC_REQUIRE([AC_PROG_CXX])dnl\necho \"$as_me: this is autotroll.m4[]_AUTOTROLL_SERIAL\" >&AS_MESSAGE_LOG_FD\n\n  test x\"$TROLL\" != x && echo 'ViM rox emacs.'\n\ndnl Memo: AC_ARG_WITH(package, help-string, [if-given], [if-not-given])\n  AC_ARG_WITH([qt],\n              [AS_HELP_STRING([--with-qt],\n                 [Path to Qt @<:@Look in PATH and /usr/local/Trolltech@:>@])],\n              [QT_PATH=$withval])\n\n  # this is a hack to get decent flow control with 'break'\n  for _qt_ignored in once; do\n\n  # Find Qt.\n  AC_ARG_VAR([QT_PATH], [Path to the Qt installation])\n  if test -d /usr/local/Trolltech; then\n    # Try to find the latest version.\n    tmp_qt_paths=`echo /usr/local/Trolltech/*/bin | tr ' ' '\\n' | sort -nr \\\n                                              | xargs | sed 's/  */:/g'`\n  fi\n  # Path to which recent MacPorts (~v1.7) install Qt4.\n  test -d /opt/local/libexec/qt4-mac/bin \\\n    && tmp_qt_paths=\"$tmp_qt_paths:/opt/local/libexec/qt4-mac/bin\"\n\n  # Find qmake.\n  AC_ARG_VAR([QMAKE], [Qt Makefile generator command])\n  AC_PATH_PROGS([QMAKE], [qmake qmake-qt4 qmake-qt3], [missing],\n                [$QT_DIR:$QT_PATH:$PATH:$tmp_qt_paths])\n  if test x\"$QMAKE\" = xmissing; then\n    AX_INSTEAD_IF([$4], [Cannot find qmake in your PATH. Try using --with-qt.])\n    break\n  fi\n\n  # Find moc (Meta Object Compiler).\n  AC_ARG_VAR([MOC], [Qt Meta Object Compiler command])\n  AC_PATH_PROGS([MOC], [moc moc-qt4 moc-qt3], [missing],\n                [$QT_PATH:$PATH:$tmp_qt_paths])\n  if test x\"$MOC\" = xmissing; then\n    AX_INSTEAD_IF([$4],\n   [Cannot find moc (Meta Object Compiler) in your PATH. Try using --with-qt.])\n    break\n  fi\n\n  # Find uic (User Interface Compiler).\n  AC_ARG_VAR([UIC], [Qt User Interface Compiler command])\n  AC_PATH_PROGS([UIC], [uic uic-qt4 uic-qt3 uic3], [missing],\n                [$QT_PATH:$PATH:$tmp_qt_paths])\n  if test x\"$UIC\" = xmissing; then\n    AX_INSTEAD_IF([$4],\n[Cannot find uic (User Interface Compiler) in your PATH. Try using --with-qt.])\n    break\n  fi\n\n  # Find rcc (Qt Resource Compiler).\n  AC_ARG_VAR([RCC], [Qt Resource Compiler command])\n  AC_PATH_PROGS([RCC], [rcc], [false], [$QT_PATH:$PATH:$tmp_qt_paths])\n  if test x\"$UIC\" = xfalse; then\n    AC_MSG_WARN([Cannot find rcc (Qt Resource Compiler) in your PATH.\\\n  Try using --with-qt.])\n  fi\n\n  AC_MSG_CHECKING([whether host operating system is Darwin])\n  at_darwin=\"no\"\n  case $host_os in\n    darwin*)\n      at_darwin=\"yes\"\n      QMAKE_ARGS=\"-spec macx-g++\"\n      ;;\n  esac\n  AC_MSG_RESULT([$at_darwin])\n\n  # If we don't know the path to Qt, guess it from the path to qmake.\n  if test x\"$QT_PATH\" = x; then\n    QT_PATH=`dirname \"$QMAKE\"`\n  fi\n  if test x\"$QT_PATH\" = x; then\n    AX_INSTEAD_IF([$4],\n                  [Cannot find the path to your Qt install. Use --with-qt.])\n    break\n  fi\n  AC_SUBST([QT_PATH])\n\n  # Get ready to build a test-app with Qt.\n\n  # Look for a writable temporary directory.\n  AC_ARG_VAR([TMPDIR], [A temporary directory with write access @<:@/tmp@:>@])\n  if test x\"$TMPDIR\" = x || test ! -d \"$TMPDIR\" || test ! -w \"$TMPDIR\"; then\n    echo \"$as_me:$LINENO: no TMPDIR or bad TMPDIR ($TMPDIR)\" \\\n      >&AS_MESSAGE_LOG_FD\n    for i in /tmp /var/tmp; do\n      if test -d \"$i\" && test -w \"$i\"; then\n        TMPDIR=$i\n        export TMPDIR\n        echo \"$as_me:$LINENO: setting TMPDIR=$TMPDIR\" >&AS_MESSAGE_LOG_FD\n        break\n      fi\n    done\n    fi\n\n  # Kludge!!  QMake has a very strange behavior.  For instance, if you\n  # install Qt under your $HOME and run QMake somewhere else under your\n  # $HOME, it will try to be clever and produce Makefiles with relative\n  # include paths.  In order to avoid this, we will test QMake from a\n  # temporary directory (usually /tmp).  Note that this problem was only\n  # observed with Qt 4.\n  my_configure_pwd=`pwd`\n  my_tmpdir=\"$TMPDIR/conftest$$.dir\"\n  test -d \"$my_tmpdir\" || mkdir \"$my_tmpdir\"\n  if test -w \"$my_tmpdir\" && cd \"$my_tmpdir\"\n  then\n    :\n  else\n    AX_INSTEAD_IF([$4], [Cannot cd to or write in $my_tmpdir])\n    break\n  fi\n\n  cat >conftest.h <<_ASEOF\n#include <QObject>\n\nclass Foo: public QObject\n{\n  Q_OBJECT;\npublic:\n  Foo();\n  ~Foo() {}\npublic slots:\n  void setValue(int value);\nsignals:\n  void valueChanged(int newValue);\nprivate:\n  int value_;\n};\n_ASEOF\n\n  cat >conftest.cpp <<_ASEOF\n#include \"conftest.h\"\nFoo::Foo()\n  : value_ (42)\n{\n  connect(this, SIGNAL(valueChanged(int)), this, SLOT(setValue(int)));\n}\n\nvoid Foo::setValue(int value)\n{\n  value_ = value;\n}\n\nint main()\n{\n  Foo f;\n}\n_ASEOF\n  if $QMAKE -project; then :; else\n    AX_INSTEAD_IF([$4], [Calling $QMAKE -project failed.])\n    break\n  fi\n\n  # Find the .pro file generated by qmake.\n  pro_file='conftest.dir.pro'\n  test -f $pro_file || pro_file=`echo *.pro`\n  if test -f \"$pro_file\"; then :; else\n    AX_INSTEAD_IF([$4], [Can't find the .pro file generated by Qmake.])\n    break\n  fi\n\ndnl Tweak the value of QT in the .pro if have been the 1st arg.\nm4_ifval([$1], [_AT_TWEAK_PRO_FILE([QT], [$1])])\n\ndnl Tweak the value of CONFIG in the .pro if have been given a 2nd arg.\nm4_ifval([$2], [_AT_TWEAK_PRO_FILE([CONFIG], [$2])])\n\nm4_ifval([$3],\n[ # Add the extra-settings the user wants to set in the .pro\n  echo \"$3\" >>\"$pro_file\"\n])\n\n  echo \"$as_me:$LINENO: Invoking $QMAKE on $pro_file\" >&AS_MESSAGE_LOG_FD\n  sed 's/^/| /' \"$pro_file\" >&AS_MESSAGE_LOG_FD\n\n  if $QMAKE $QMAKE_ARGS; then :; else\n    AX_INSTEAD_IF([$4], [Calling $QMAKE $QMAKE_ARGS failed.])\n    break\n  fi\n\n  # Qmake from Qt-4.3.2 generates Makefile with slashes instead of backslashes\n  # on mingw and this lead to an error (see #96). The followind sed call is a\n  # work around this issue.\n  case $host_os in\n     *mingw*|*cygwin*)\n        sed -i 's|\\([^ ]\\)/|\\1\\\\|g' Makefile\n\t;;\n  esac\n\n  # Try to compile a simple Qt app.\n  AC_CACHE_CHECK([whether we can build a simple Qt app], [at_cv_qt_build],\n  [at_cv_qt_build=ko\n  : ${MAKE=make}\n\n  if $MAKE >&AS_MESSAGE_LOG_FD 2>&1; then\n    at_cv_qt_build='ok, looks like Qt 4'\n  else\n    echo \"$as_me:$LINENO: Build failed, trying to #include <qobject.h> \\\ninstead\" >&AS_MESSAGE_LOG_FD\n    sed 's/<QObject>/<qobject.h>/' conftest.h > tmp.h && mv tmp.h conftest.h\n    if $MAKE >&AS_MESSAGE_LOG_FD 2>&1; then\n      at_cv_qt_build='ok, looks like Qt 3'\n    else\n      # Sometimes (such as on Debian) build will fail because Qt hasn't been\n      # installed in debug mode and qmake tries (by default) to build apps in\n      # debug mode => Try again in release mode.\n      echo \"$as_me:$LINENO: Build failed, trying to enforce release mode\" \\\n            >&AS_MESSAGE_LOG_FD\n\n      _AT_TWEAK_PRO_FILE([CONFIG], [+release])\n\n      sed 's/<qobject.h>/<QObject>/' conftest.h > tmp.h && mv tmp.h conftest.h\n      if $MAKE >&AS_MESSAGE_LOG_FD 2>&1; then\n        at_cv_qt_build='ok, looks like Qt 4, release mode forced'\n      else\n        echo \"$as_me:$LINENO: Build failed, trying to #include <qobject.h> \\\ninstead\" >&AS_MESSAGE_LOG_FD\n        sed 's/<QObject>/<qobject.h>/' conftest.h >tmp.h && mv tmp.h conftest.h\n        if $MAKE >&AS_MESSAGE_LOG_FD 2>&1; then\n          at_cv_qt_build='ok, looks like Qt 3, release mode forced'\n        else\n          at_cv_qt_build=ko\n          echo \"$as_me:$LINENO: failed program was:\" >&AS_MESSAGE_LOG_FD\n          sed 's/^/| /' conftest.h >&AS_MESSAGE_LOG_FD\n          echo \"$as_me:$LINENO: failed program was:\" >&AS_MESSAGE_LOG_FD\n          sed 's/^/| /' conftest.cpp >&AS_MESSAGE_LOG_FD\n        fi # if make with Qt3-style #include and release mode forced.\n      fi # if make with Qt4-style #include and release mode forced.\n    fi # if make with Qt3-style #include.\n  fi # if make with Qt4-style #include.\n  ])dnl end: AC_CACHE_CHECK(at_cv_qt_build)\n\n  if test x\"$at_cv_qt_build\" = xko; then\n    AX_INSTEAD_IF([$4], [Cannot build a test Qt program])\n    break\n  fi\n  QT_VERSION_MAJOR=`echo \"$at_cv_qt_build\" | sed 's/[[^0-9]]*//g'`\n  AC_SUBST([QT_VERSION_MAJOR])\n\n  # This sed filter is applied after an expression of the form: /^FOO.*=/!d;\n  # It starts by removing the beginning of the line, removing references to\n  # SUBLIBS, removing unnecessary whitespaces at the beginning, and prefixes\n  # all variable uses by QT_.\n  qt_sed_filter='s///;\n                 s/$(SUBLIBS)//g;\n                 s/^ *//;\n                 s/\\$(\\(@<:@A-Z_@:>@@<:@A-Z_@:>@*\\))/$(QT_\\1)/g'\n\n  # Find the Makefile (qmake happens to generate a fake Makefile which invokes\n  # a Makefile.Debug or Makefile.Release). We we have both, we'll pick the\n  # Makefile.Release. The reason is that the main difference is that release\n  # uses -Os and debug -g. We can override -Os by passing another -O but we\n  # usually don't override -g.\n  if test -f Makefile.Release; then\n    at_mfile='Makefile.Release'\n  else\n    at_mfile='Makefile'\n  fi\n  if test -f $at_mfile; then :; else\n    AX_INSTEAD_IF([$4], [Cannot find the Makefile generated by qmake.])\n    break\n  fi\n\n  # Find the DEFINES of Qt (should have been named CPPFLAGS).\n  AC_CACHE_CHECK([for the DEFINES to use with Qt], [at_cv_env_QT_DEFINES],\n  [at_cv_env_QT_DEFINES=`sed \"/^DEFINES@<:@^A-Z=@:>@*=/!d;$qt_sed_filter\" $at_mfile`])\n  AC_SUBST([QT_DEFINES], [$at_cv_env_QT_DEFINES])\n\n  # Find the CFLAGS of Qt (We can use Qt in C?!)\n  AC_CACHE_CHECK([for the CFLAGS to use with Qt], [at_cv_env_QT_CFLAGS],\n  [at_cv_env_QT_CFLAGS=`sed \"/^CFLAGS@<:@^A-Z=@:>@*=/!d;$qt_sed_filter\" $at_mfile`])\n  AC_SUBST([QT_CFLAGS], [$at_cv_env_QT_CFLAGS])\n\n  # Find the CXXFLAGS of Qt.\n  AC_CACHE_CHECK([for the CXXFLAGS to use with Qt], [at_cv_env_QT_CXXFLAGS],\n  [at_cv_env_QT_CXXFLAGS=`sed \"/^CXXFLAGS@<:@^A-Z=@:>@*=/!d;$qt_sed_filter\" $at_mfile`])\n  AC_SUBST([QT_CXXFLAGS], [$at_cv_env_QT_CXXFLAGS])\n\n  # Find the INCPATH of Qt.\n  AC_CACHE_CHECK([for the INCPATH to use with Qt], [at_cv_env_QT_INCPATH],\n  [at_cv_env_QT_INCPATH=`sed \"/^INCPATH@<:@^A-Z=@:>@*=/!d;$qt_sed_filter\" $at_mfile`])\n  AC_SUBST([QT_INCPATH], [$at_cv_env_QT_INCPATH])\n\n  AC_SUBST([QT_CPPFLAGS], [\"$at_cv_env_QT_DEFINES $at_cv_env_QT_INCPATH\"])\n\n  # Find the LFLAGS of Qt (Should have been named LDFLAGS)\n  AC_CACHE_CHECK([for the LDFLAGS to use with Qt], [at_cv_env_QT_LDFLAGS],\n  [at_cv_env_QT_LDFLAGS=`sed \"/^LFLAGS@<:@^A-Z=@:>@*=/!d;$qt_sed_filter\" $at_mfile`])\n  AC_SUBST([QT_LFLAGS], [$at_cv_env_QT_LDFLAGS])\n  AC_SUBST([QT_LDFLAGS], [$at_cv_env_QT_LDFLAGS])\n\n  # Find the LIBS of Qt.\n  AC_CACHE_CHECK([for the LIBS to use with Qt], [at_cv_env_QT_LIBS],\n  [at_cv_env_QT_LIBS=`sed \"/^LIBS@<:@^A-Z@:>@*=/!d;$qt_sed_filter\" $at_mfile`\n   if test x$at_darwin = xyes; then\n     # Fix QT_LIBS: as of today Libtool (GNU Libtool 1.5.23a) doesn't handle\n     # -F properly. The \"bug\" has been fixed on 22 October 2006\n     # by Peter O'Gorman but we provide backward compatibility here.\n     at_cv_env_QT_LIBS=`echo \"$at_cv_env_QT_LIBS\" \\\n                             | sed 's/^-F/-Wl,-F/;s/ -F/ -Wl,-F/g'`\n   fi\n  ])\n  AC_SUBST([QT_LIBS], [$at_cv_env_QT_LIBS])\n\n  # Run the user code\n  $5\n\n  done  # end hack (useless for to be able to use break)\n\n  # clean up, and make sure we don't change cwd\n\n  if test -n \"$my_configure_pwd\"; then\n    cd \"$my_configure_pwd\"\n  fi\n  if test -n \"$my_tmpdir\"; then\n    rm -rf \"$my_tmpdir\"\n  fi\n\n])\n\n# AT_REQUIRE_QT_VERSION(QT_version, RUN-IF-FAILED, RUN-IF-OK)\n# -----------------------------------------------------------\n# Check (using qmake) that Qt's version \"matches\" QT_version.\n# Must be run AFTER AT_WITH_QT. Requires autoconf 2.60.\n#\n# RUN-IF-FAILED is arbitrary code to execute if Qt cannot be found or if any\n# problem happens.  If this argument is omitted, then AC_MSG_ERROR will be\n# called.  RUN-IF-OK is arbitrary code to execute if Qt was successfully found.\nAC_DEFUN([AT_REQUIRE_QT_VERSION],\n[\n  # this is a hack to get decent flow control with 'break'\n  for _qt_ignored in once; do\n\n  if test x\"$QMAKE\" = x; then\n    AX_INSTEAD_IF([$2],\n                  [\\$QMAKE is empty.\\\n  Did you invoke AT@&t@_WITH_QT before AT@&t@_REQUIRE_QT_VERSION?])\n    break\n  fi\n  AC_CACHE_CHECK([for Qt's version], [at_cv_QT_VERSION],\n  [echo \"$as_me:$LINENO: Running $QMAKE --version:\" >&AS_MESSAGE_LOG_FD\n  $QMAKE --version >&AS_MESSAGE_LOG_FD 2>&1\n  qmake_version_sed=['/^.*\\([0-9]\\.[0-9]\\.[0-9]\\).*$/!d;s//\\1/']\n  at_cv_QT_VERSION=`$QMAKE --version 2>&1 | sed \"$qmake_version_sed\"`])\n  if test x\"$at_cv_QT_VERSION\" = x; then\n    AX_INSTEAD_IF([$2], [Cannot detect Qt's version.])\n    break\n  fi\n  AC_SUBST([QT_VERSION], [$at_cv_QT_VERSION])\n  AS_VERSION_COMPARE([$QT_VERSION], [$1],\n    [AX_INSTEAD_IF([$2; break;], [This package requires Qt $1 or above.])])\n\n  # Run the user code\n  $3\n\n  done  # end hack (useless for to be able to use break)\n])\n\n# _AT_TWEAK_PRO_FILE(QT_VAR, VALUE)\n# ---------------------------\n# @internal. Tweak the variable QT_VAR in the .pro.\n# VALUE is an IFS-separated list of value and each value is rewritten\n# as follows:\n#   +value  => QT_VAR += value\n#   -value  => QT_VAR -= value\n#    value  => QT_VAR += value\nAC_DEFUN([_AT_TWEAK_PRO_FILE],\n[ # Tweak the value of $1 in the .pro file for $2.\n\n  qt_conf=''\n  for at_mod in $2; do\n    at_mod=`echo \"$at_mod\" | sed 's/^-//; tough\n                                  s/^+//; beef\n                                  :ough\n                                  s/^/$1 -= /;n\n                                  :eef\n                                  s/^/$1 += /'`\n    qt_conf=\"$qt_conf\n$at_mod\"\n  done\n  echo \"$qt_conf\" | sed 1d >>\"$pro_file\"\n])\n"
  },
  {
    "path": "thirdparty/protobuf.mak",
    "content": "# __BEGIN_LICENSE__\n# Copyright (C) 2006-2011 United States Government as represented by\n# the Administrator of the National Aeronautics and Space Administration.\n# All Rights Reserved.\n# __END_LICENSE__\n\n\n########################################################################\n# rules for compiling Google Protocol Buffers (using protoc)\n########################################################################\n\nSUFFIXES += .proto .pb.cc\n\nPROTOC = protoc\nPROTOC_ARGS = -I. --cpp_out=.\n\n.proto.pb.cc :\n\t$(AM_V_GEN)$(PROTOC) $(PROTOC_ARGS) $<\n"
  }
]